mumble-1.3.4/0000775000175000017500000000000014010707354012641 5ustar builderbuildermumble-1.3.4/AUTHORS0000664000175000017500000002366114010707273013721 0ustar builderbuilder// This is the official list of people who have contributed // to, and/or hold the copyright to Mumble. // // The use of Mumble source code is governed by a BSD-style // license that can be found in the LICENSE file at the root // of the Mumble source tree or at . // // Contributions made on behalf of another entity, such as a // company are indicated with the following suffix: // // John Doe (on behalf of $COMPANY) // // It is possible to mix individual contributions with company // contributions. For example, if a contributor, over time, // has contributed code copyrighted by the contributor, as well // as various companies: // // John Doe (individually, on behalf of // $COMPANY1, on behalf of // $COMPANY2, [...]). // // Mumble's code is developed in a Git repository. A log of // every contribution ever made to Mumble is available in the // Git repository. The Git repository can be queried to get // detailed authorship information for copyright and attribution // purposes for each file that makes up the software. A detailed // analysis of contributions made to Mumble is available via GitHub's // contribution statistics: // // Abex Alex Krishnan Alex Maclean Alexis Jeandeau Allan Nordhøy Álvaro Manuel Recio Pérez Andre Andreas Bibok Andreas Messer Andreas Sinz Andrew Johnson anonym Anthony Alves Antoine Bertin Anton Romanov Antonio Larrosa Arie Arne Fenske arrai Arseniy Lartsev Artem Vorotnikov Arthur Moore asmolero Asura Lee B0nuse Balazs Nagy Bartek "stranded" Sumowski Bas van Schaik Bas Wijnen BAYSSE Laurent bendem Benjamin Jemlich Benjamin Neff Bernd Buschinski Bernhard M. Wiedemann bogie Bojan brooss BuddyButterfly Cesare Tirabassi Charles Ricketts Chosi Chris Knadle Christian Krause Christoph Hofmann Christopher Knadle concatime Constantin Wenger Cristian Gattamelati d-rez David Davide Beatrici Davide Beatrici davidebeatrici dc6jgk dennisschagt derandi Derrick Dymock DK DNW doggone DWM|G EarlOfWenc Edward Elbon Eli Tallman Entitaet Erik Bouvin Pedersen Evan Purkhiser Ferdinand Thiessen Filip Hedman Finessi Manuel Flumble Frank Engler Frank Mueller Fredrik Nordin Friedrich Uz-Valentin Generator Giovanni Harting <539@idlegandalf.com> GoD-Tony Graeme Lawes Harald Niesche Harry Gabriel haru_arc He Tal Hengqing Hu Henry Fallon Iain Georgeson Ilmar Kruis Imre Botos Jacob Peddicord Jakob Dettner James Fraser Jan Braun Jan Klass javitonino Jeff Rogers Jérôme "buggerone" Jerome Vidal jgeboski Joel Kees Joël Troch John Marion John P Jonas Herzig Jonathan E. Hansen Jordan Cristiano Jordan Klassen Joshua Kocinski Julien Pardons JustABanana Justin M Justin McGrath Karl Dietz karokatona Kevin Rohland Kevin Strasser Kevin Zheng Kjetil Jørgensen Kyle Smith Kyle Wickens Lari Tikkanen Lartza Lekensteyn Leszek Godlewski lewisca04 Lorenz Brun Ludwig Nussel Lukas Orsvärn Luke A Pitt MadMaurice main() main() Marc Deslauriers Marius Grannæs Mark Felder Mark Schreiber Mark-Willem Jansen Markus S Martijn Stolk Martin Skilnand Martin von Gagern Matt Hamilton Matt Lewandowsky Matt M. Matthias Mailänder Matthias Salzeder Matthias Vogelgesang Matthias von Faber Max Weber Maxwell Cody Maxwell Cody meanracoon meditator Mew Micah Caldwell Michael Pavlyshko Michael Ziegler Michał "Zuko" Żukowski Mike Mikkel Krautz Mikko Rantanen mray mystic_sam Natenom Nick Heindl Nicos Gollan Nik Johnson Nikita Puzyryov Nikolaj Dombrow nomad Opalium Otto Allmendinger ozon Patrick Matthäi pchk Peter Vágner Phil Philip Cass Phrag Piratonym Prakhar Yadav probonopd Prosper_Spurius QuirB qwestduck Rafael Correia Rafael Lopez rdb Roman Priesol ronnystandtke ronoc Ryan Austin Sami Laine Samuel D. Leslie scapula Sebastian Schlingmann Semion Tsinman Sergey Ivanov Shen-Ta Hsieh Spaccaossi spede Stefan Gehn Stefan Hacker Steve Hill Steven Noonan Sven-Hendrik Haase Svenne33 Svyatoslav synapse84 Tasos Sahanidis thalieht Thibault Capdevielled Thibaut Girka Thomas Ross Thorvald Natvig Tim Burke Tim Cooper Tim Visée Timo Gurr Timo K tkmorris Tristan Matthews trudnorx Tsbook Wesley W. Terpstra Will Tange withgod x89 zapman zeroX-tj Zorg // Special thanks to: // // Thorvald Natvig, for founding the Mumble project // and maintaining it during its formative years. mumble-1.3.4/README.static.linux0000664000175000017500000001020614010707273016144 0ustar builderbuilder M U M B L E A voicechat utility for gamers http://mumble.info/ #mumble on freenode What is Murmur? =============== Murmur is the server component of Mumble, an open-source voice chat utility. This package is a statically compiled version of Murmur for Linux. It is independent of your distribution's package manager, and is intended to be run as-is, or with minimal set up. Running Murmur ============== In this build of Murmur, the binary is called 'murmur.x86'. To get Murmur up and running, simply execute the following command at your shell: $ ./murmur.x86 -fg -ini murmur.ini This will spawn a foregrounded (Murmur will, by default, run in daemon mode, which means it will launch itself as a background process on your system). The First Run ============= When Murmur runs for the first time, it performs a few special initialization steps, such as setting up its database, as well as generating a certificate for its initial server and a password for the SuperUser user. This password is important for setting up the Murmur server, so make a note of it. It is output by the Murmur server the first time it runs, and will look something like this: HH:MM:DD 1 => Password for 'SuperUser' set to '' Initial User Setup ================== Murmur has the concept of a 'SuperUser', which is the initial administrative user used to configure your server. Typically, this user will only be used for initial setup, and in recovery situations. A regular user, with some administrative privileges is usually set up as a first step. To do this, follow the steps below: 1. In your Mumble client, ensure that you have a certificate for your user. (A certificate is generated by Mumble by default, but you can create a new one if you wish -- or use an existing S/MIME email certificate if you wish.) 2. Connect to your server with the user that you wish to grant administrative privileges to. (Your username will be stored on the server when you register yourself, so pick something you'd like to keep!) 3. Once connected, right click your user name in the server view and choose 'Register'. This will register your user to the server (this makes the server remember you as a user -- but you still will not have administrative privileges). 4. Once registered, you can disconnect from the server. Now it is time to connect using the SuperUser account that the server created for you when you launched it the first time. Simply specify SuperUser as your username, and the password that Murmur gave you as the password. 5. After connecting as the SuperUser, right click the 'Root'-channel and choose Edit. In the Edit dialog, click the Groups tab. In the Groups dropdown, choose the admin group. Then, under Members three lists should appear, showing Members, Excluded Members and Inherited Members. We're only interested in Members. Expand the drop down below the member list and find the username of the user you registered in step 3. Click Add to add the user to the admin group. 6. Your user is now an administrator. For more advanced setup and usage of Murmur, please visit the Mumble Wiki, at http://mumble.info/. Some pages of interest are available at: http://wiki.mumble.info/wiki/Running_Murmur http://wiki.mumble.info/wiki/ACL_and_Groups http://wiki.mumble.info/wiki/Murmurguide Additional Murmur Options ========================= The above instructions use a very bare-bones approach to running Murmur. Several other command line options are available. These are listed below: murmur.x86 [-supw ] [-ini ] [-fg] [v] -supw Set new password for the user SuperUser, which is hardcoded to bypass ACLs. Keep this password safe. If you use this option, Murmur will set the password in the database and then exit. -ini Use an ini file other than murmur.ini, use this to run several instances of Murmur from the same directory. Make sure each instance is using a separate database. (Specified in the ini file.) -fg Run in the foreground, logging to standard output. -v More verbose logging. mumble-1.3.4/macx/0000775000175000017500000000000014010707273013571 5ustar builderbuildermumble-1.3.4/macx/osax/0000775000175000017500000000000014010707273014543 5ustar builderbuildermumble-1.3.4/macx/osax/osax.pro0000664000175000017500000000154014010707273016237 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . # Mumble Overlay scripting addition # (for injection into running processes) include(../../qmake/compiler.pri) CONFIG += x86_64 x86 debug_and_release CONFIG(universal) { CONFIG += ppc } TEMPLATE = lib CONFIG += plugin plugin_bundle CONFIG -= gui qt CONFIG(static) { CONFIG -= static } TARGET = MumbleOverlay QMAKE_INFO_PLIST = osax.plist QMAKE_LFLAGS = -framework Foundation -framework Cocoa QMAKE_BUNDLE_EXTENSION = .osax QMAKE_LFLAGS_PLUGIN = -bundle SDEF.files = MumbleOverlay.sdef SDEF.path = Contents/Resources QMAKE_BUNDLE_DATA += SDEF OBJECTIVE_SOURCES = osax.m include(../../qmake/symbols.pri) mumble-1.3.4/macx/osax/osax.plist0000664000175000017500000000231414010707273016572 0ustar builderbuilder CFBundleDevelopmentRegion English CFBundleExecutable MumbleOverlay CFBundleIdentifier net.sourceforge.mumble.OverlayScriptingAddition CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType osax CFbundleVersion 1.3.4 CFBundleSignature MUOL CSResourcesFileMapped OSAScriptingDefinition MumbleOverlay.sdef OSAXHandlers Events MUOLload Handler MumbleOverlayEventHandler Context Process ThreadSafe MUOLdaol MumbleOverlayEventHandler MumbleOverlayVersion 20 MumbleOverlayMinMumbleVersion 1.2.4 mumble-1.3.4/macx/osax/osax.m0000664000175000017500000000165314010707273015700 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #import #include __attribute__ ((visibility("default"))) OSErr MumbleOverlayEventHandler(const AppleEvent *ae, AppleEvent *reply, long refcon) { (void) ae; (void) reply; (void) refcon; /* Is the overlay already loaded into the process? */ if (dlsym(RTLD_DEFAULT, "MumbleOverlayEntryPoint")) { fprintf(stderr, "MumbleOverlayLoader: Overlay already loaded.\n"); return noErr; } /* * Load the overlay lib - hard coded because we're the only consumer, and because we * can only live in /Library/ScriptingAdditions/ */ dlopen("/Library/ScriptingAdditions/MumbleOverlay.osax/Contents/MacOS/libmumbleoverlay.dylib", RTLD_LAZY); return noErr; } mumble-1.3.4/macx/osax/MumbleOverlay.sdef0000664000175000017500000000073514010707273020176 0ustar builderbuilder mumble-1.3.4/macx/compat/0000775000175000017500000000000014010707273015054 5ustar builderbuildermumble-1.3.4/macx/compat/compat.m0000664000175000017500000000316014010707273016515 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #import @interface CompatApp : NSObject @end #if MAC_OS_X_VERSION_MAX_ALLOWED >= 1060 @interface CompatApp (NSApplicationDelegateExtension) @end #endif #if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 @interface CompatApp (NSFileManagerDelegateExtension) @end #endif @implementation CompatApp - (void) applicationDidFinishLaunching:(NSNotification *)notification { (void)notification; NSAlert *alert = [NSAlert alertWithMessageText:@"Mumble" defaultButton:@"OK" alternateButton:nil otherButton:@"Visit Website" informativeTextWithFormat:@"This version of Mumble only runs on 64-bit Intel Macs.\n\n" "Please download the Universal version from the Mumble website instead.\n"]; [[alert window] makeKeyAndOrderFront:self]; [[alert window] center]; NSInteger button = [alert runModal]; if (button == NSAlertOtherReturn) { [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"http://mumble.info/"]]; } [NSApp terminate:self]; [alert release]; } @end int main(int argc, char *argv[]) { (void)argc; (void)argv; NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; CompatApp *app = [[CompatApp alloc] init]; [NSApplication sharedApplication]; [NSApp setDelegate:app]; [NSApp run]; [pool release]; return 0; } mumble-1.3.4/macx/compat/compat.pro0000664000175000017500000000160514010707273017063 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . # Tiny stub program that we splice together into our # main app bundle for architectures that we don't support. include(../../qmake/compiler.pri) include(../common.pri) TEMPLATE = app CONFIG -= qt app_bundle CONFIG += debug_and_release isEqual(QT_MAJOR_VERSION, 5) { QMAKE_CFLAGS += -arch i386 QMAKE_OBJECTIVE_CFLAGS += -arch i386 QMAKE_CXXFLAGS += -arch i386 QMAKE_LFLAGS += -arch i386 } else { CONFIG -= x86_64 CONFIG += x86 } CONFIG(universal) { CONFIG += ppc } TARGET = Mumble.compat OBJECTIVE_SOURCES = compat.m QMAKE_LFLAGS += -framework ApplicationServices -framework Cocoa -framework AppKit include(../../qmake/symbols.pri) mumble-1.3.4/macx/scripts/0000775000175000017500000000000014010707273015260 5ustar builderbuildermumble-1.3.4/macx/scripts/osxdist.py0000775000175000017500000003205214010707273017334 0ustar builderbuilder#!/usr/bin/env python # -*- coding: utf-8 -*- # # Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . # # Simple Mac OS X Application Bundler for Mumble # # Loosely based on original bash-version by Sebastian Schlingmann (based, again, on a OSX application bundler # by Thomas Keller). # import sys, os, string, re, shutil, plistlib, tempfile, exceptions, datetime, tarfile from subprocess import Popen, PIPE from optparse import OptionParser options = None def gitrev(): '''Get git revision of the current Mumble build.''' return os.popen('git describe').read()[:-1] def certificate_subject_OU(identity): '''Extract the subject OU from the certificate matching the identity parameter in the specified keychain.''' findCert = Popen(('/usr/bin/security', 'find-certificate', '-c', identity, '-p', options.keychain), stdout=PIPE) pem, _ = findCert.communicate() openssl = Popen(('/usr/bin/openssl', 'x509', '-subject', '-noout'), stdout=PIPE, stdin=PIPE) subject, _ = openssl.communicate(pem) attr = '/OU=' begin = subject.index(attr) + len(attr) tmp = subject[begin:] end = tmp.index('/') return tmp[:end] def lookup_file_identifier(path): try: d = plistlib.readPlist(os.path.join(path, 'Contents', 'Info.plist')) return d['CFBundleIdentifier'] except: return os.path.basename(path) def codesign(path): '''Call the codesign executable on the signable object at path.''' certname = 'Developer ID Application: %s' % options.developer_id OU = certificate_subject_OU(certname) if hasattr(path, 'isalpha'): path = (path,) for p in path: identifier = lookup_file_identifier(p) reqs = None with open('macx/scripts/codesign-requirements.tmpl', 'r') as f: tmplReqs = f.read() reqs = string.Template(tmplReqs).substitute({ 'identifier': identifier, 'subject_OU': OU, }) p = Popen(('codesign', '--keychain', options.keychain, '-vvvv', '-i', identifier, '-r='+reqs, '-s', certname, p)) retval = p.wait() if retval != 0: return retval return 0 def prodsign(inf, outf): '''Call the prodsign executable.''' certname = 'Developer ID Installer: %s' % options.developer_id p = Popen(('productsign', '--keychain', options.keychain, '--sign', certname, inf, outf)) retval = p.wait() if retval != 0: return retval return 0 def create_overlay_package(): print '* Creating overlay installer' bundle = os.path.join('release', 'MumbleOverlay.osax') overlaylib = os.path.join('release', 'libmumbleoverlay.dylib') if options.developer_id: codesign(bundle) codesign(overlaylib) p = Popen(('./macx/scripts/build-overlay-installer',)) retval = p.wait() if retval != 0: raise Exception('build-overlay-installer failed') if options.developer_id: os.rename('release/MumbleOverlay.pkg', 'release/MumbleOverlayUnsigned.pkg') prodsign('release/MumbleOverlayUnsigned.pkg', 'release/MumbleOverlay.pkg') class AppBundle(object): def copy_helper(self, fn): ''' Copy a helper binary into the Mumble app bundle. ''' if os.path.exists(os.path.join(self.bundle, '..', fn)): print ' * Copying helper binary: %s' % fn src = os.path.join(self.bundle, '..', fn) dst = os.path.join(self.bundle, 'Contents', 'MacOS', fn) shutil.copy(src, dst) def copy_resources(self, rsrcs): ''' Copy needed resources into our bundle. ''' print ' * Copying needed resources' rsrcpath = os.path.join(self.bundle, 'Contents', 'Resources') if not os.path.exists(rsrcpath): os.mkdir(rsrcpath) # Copy resources already in the bundle for rsrc in rsrcs: b = os.path.basename(rsrc) if os.path.isdir(rsrc): shutil.copytree(rsrc, os.path.join(rsrcpath, b), symlinks=True) elif os.path.isfile(rsrc): shutil.copy(rsrc, os.path.join(rsrcpath, b)) # Extras shutil.copy('release/MumbleOverlay.pkg', os.path.join(rsrcpath, 'MumbleOverlay.pkg')) def copy_codecs(self): ''' Try to copy the dynamic audio codec libraries into the App Bundle. ''' print ' * Attempting to copy audio codec libraries into App Bundle' dst = os.path.join(self.bundle, 'Contents', 'Codecs') os.makedirs(dst) codecs = ('release/libcelt0.0.7.0.dylib', 'release/libcelt0.0.11.0.dylib', 'release/libopus.dylib') for codec in codecs: if os.path.exists(codec): shutil.copy(codec, dst) def copy_plugins(self): ''' Copy over any built Mumble plugins. ''' print ' * Copying positional audio plugins' dst = os.path.join(self.bundle, 'Contents', 'Plugins') if os.path.exists(dst): shutil.rmtree(dst) shutil.copytree('release/plugins/', dst, symlinks=True) def update_plist(self): ''' Modify our bundle's Info.plist to make it ready for release. ''' if self.version is not None: print ' * Changing version in Info.plist' p = self.infoplist p['CFBundleVersion'] = self.version plistlib.writePlist(p, self.infopath) def add_compat_warning(self): ''' Add compat binary for when our binary is run on i386 or ppc. The compat binary displays a warning dialog telling the user that they need to download a universal version of Mumble ''' print ' * Splicing Mumble.compat into main bundle executable' p = Popen(('lipo', '-create', 'release/Mumble.compat', '-arch', 'x86_64', self.binary, '-output', self.binary)) retval = p.wait() if retval != 0: raise Exception('build-overlay-installer failed') def set_min_macosx_version(self, version): ''' Set the minimum version of Mac OS X version that this App will run on. ''' print ' * Setting minimum Mac OS X version to: %s' % (version) self.infoplist['LSMinimumSystemVersion'] = version def done(self): plistlib.writePlist(self.infoplist, self.infopath) print ' * Done!' print '' def __init__(self, bundle, version=None): self.framework_path = '' self.handled_libs = {} self.bundle = bundle self.version = version self.infopath = os.path.join(os.path.abspath(bundle), 'Contents', 'Info.plist') self.infoplist = plistlib.readPlist(self.infopath) self.binary = os.path.join(os.path.abspath(bundle), 'Contents', 'MacOS', self.infoplist['CFBundleExecutable']) print ' * Preparing AppBundle' class FolderObject(object): class Exception(exceptions.Exception): pass def __init__(self): self.tmp = tempfile.mkdtemp() def copy(self, src, dst='/'): ''' Copy a file or directory into the folder. ''' asrc = os.path.abspath(src) if dst[0] != '/': raise self.Exception # Determine destination if dst[-1] == '/': adst = os.path.abspath(self.tmp + '/' + dst + os.path.basename(src)) else: adst = os.path.abspath(self.tmp + '/' + dst) if os.path.isdir(asrc): print ' * Copying directory: %s' % os.path.basename(asrc) shutil.copytree(asrc, adst, symlinks=True) elif os.path.isfile(asrc): print ' * Copying file: %s' % os.path.basename(asrc) shutil.copy(asrc, adst) def symlink(self, src, dst): ''' Create a symlink inside the folder. ''' asrc = os.path.abspath(src) adst = self.tmp + '/' + dst print ' * Creating symlink %s' % os.path.basename(asrc) os.symlink(asrc, adst) def mkdir(self, name): ''' Create a directory inside the folder. ''' print ' * Creating directory %s' % os.path.basename(name) adst = self.tmp + '/' + name os.makedirs(adst) class DiskImage(FolderObject): def __init__(self, filename, volname): FolderObject.__init__(self) print ' * Preparing to create diskimage' self.filename = filename self.volname = volname def create(self): ''' Create the disk image itself. ''' print ' * Creating diskimage. Please wait...' if os.path.exists(self.filename): shutil.rmtree(self.filename) p = Popen(['hdiutil', 'create', '-srcfolder', self.tmp, '-format', 'UDBZ', '-volname', self.volname, self.filename]) retval = p.wait() print ' * Removing temporary directory.' shutil.rmtree(self.tmp) print ' * Done!' def package_client(): if options.version is not None: ver = options.version else: ver = gitrev() if options.universal: fn = 'release/Mumble-Universal-%s.dmg' % ver title = 'Mumble %s (Universal)' % ver else: fn = 'release/Mumble-%s.dmg' % ver title = 'Mumble %s' % ver if not os.path.exists('release'): print 'This script needs to be run from the root of the Mumble source tree.' sys.exit(1) # Fix overlay installer package create_overlay_package() if options.only_overlay: sys.exit(0) # Do the finishing touches to our Application bundle before release a = AppBundle('release/Mumble.app', ver) a.copy_helper('mumble-g15-helper') a.copy_helper('sbcelt-helper') a.copy_codecs() a.copy_plugins() a.copy_resources(['icons/mumble.icns']) a.update_plist() if not options.universal: if options.compat_warning: a.add_compat_warning() a.set_min_macosx_version('10.6.0') else: a.set_min_macosx_version('10.4.8') a.done() # Sign our binaries, etc. if options.developer_id: print ' * Signing binaries with Developer ID `%s\'' % options.developer_id binaries = ( 'release/Mumble.app', 'release/Mumble.app/Contents/Plugins/liblink.dylib', 'release/Mumble.app/Contents/Plugins/libmanual.dylib', 'release/Mumble.app/Contents/Codecs/libcelt0.0.7.0.dylib', 'release/Mumble.app/Contents/Codecs/libcelt0.0.11.0.dylib', 'release/Mumble.app/Contents/Codecs/libopus.dylib', 'release/Mumble.app/Contents/MacOS/mumble-g15-helper', 'release/Mumble.app/Contents/MacOS/sbcelt-helper', ) availableBinaries = [bin for bin in binaries if os.path.exists(bin)] codesign(availableBinaries) print '' if options.only_appbundle: sys.exit(0) # Create diskimage d = DiskImage(fn, title) d.copy('macx/scripts/DS_Store', '/.DS_Store') d.symlink('/Applications', '/Applications') d.copy('release/Mumble.app') d.create() def package_server(): if options.version is not None: ver = options.version else: ver = gitrev() name = 'Murmur-OSX-Static-%s' % ver # Fix .ini files p = Popen(('bash', 'mkini.sh'), cwd='scripts') retval = p.wait() if retval != 0: raise Exception('build-overlay-installer failed') destdir = os.path.join('release', name) if os.path.exists(destdir): shutil.rmtree(destdir) os.mkdir(destdir) shutil.copy('installer/gpl.txt', os.path.join(destdir, 'LICENSE')) shutil.copy('README.static.osx', os.path.join(destdir, 'README')) shutil.copy('CHANGES', os.path.join(destdir, 'CHANGES')) shutil.copy('scripts/murmur.pl', os.path.join(destdir, 'murmur.pl')) shutil.copy('scripts/weblist.pl', os.path.join(destdir, 'weblist.pl')) shutil.copy('scripts/icedemo.php', os.path.join(destdir, 'icedemo.php')) shutil.copy('scripts/weblist.php', os.path.join(destdir, 'weblist.php')) shutil.copy('scripts/murmur.ini.osx', os.path.join(destdir, 'murmur.ini')) shutil.copy('src/murmur/Murmur.ice', os.path.join(destdir, 'Murmur.ice')) shutil.copy('release/murmurd', os.path.join(destdir, 'murmurd')) codesign(os.path.join(destdir, 'murmurd')) certname = 'Developer ID Installer: %s' % options.developer_id p = Popen(('xip', '--keychain', options.keychain, '-s', certname, '--timestamp', destdir, os.path.join('release', name+'.xip'))) retval = p.wait() if retval != 0: print 'Failed to build Murmur XIP package' sys.exit(1) absrelease = os.path.join(os.getcwd(), 'release') p = Popen(('tar', '-cjpf', name+'.tar.bz2', name), cwd=absrelease) retval = p.wait() if retval != 0: print 'Failed to build Murmur tar.bz2 package' sys.exit(1) p = Popen(('gpg', '--detach-sign', '--armor', '-u', options.developer_id, '-o', name+'.tar.bz2.sig', name+'.tar.bz2'), cwd=absrelease) retval = p.wait() if retval != 0: print 'Failed to sign Murmur tar.bz2 package' sys.exit(1) if __name__ == '__main__': parser = OptionParser() parser.add_option('', '--version', dest='version', help='This overrides the version number of the build.') parser.add_option('', '--universal', dest='universal', help='Build an universal snapshot.', action='store_true', default=False) parser.add_option('', '--only-appbundle', dest='only_appbundle', help='Only prepare the appbundle. Do not package.', action='store_true', default=False) parser.add_option('', '--only-overlay', dest='only_overlay', help='Only create the overlay installer.', action='store_true', default=False) parser.add_option('', '--no-compat-warning', dest='compat_warning', help='No warning message when running the image on x86. This option should only be used when the warning application cannot be built as 32 bit (rendering it useless).', action='store_false', default=True) parser.add_option('', '--developer-id', dest='developer_id', help='Identity (Developer ID) to use for code signing. The name is also used for GPG signing. (If not set, no code signing will occur)') parser.add_option('', '--keychain', dest='keychain', help='The keychain to use when invoking code signing utilities. (Defaults to login.keychain', default='login.keychain') parser.add_option('', '--server', dest='server', help='Build a Murmur package.', action='store_true', default=False) options, args = parser.parse_args() if not options.server: package_client() else: package_server() mumble-1.3.4/macx/scripts/build-overlay-installer0000775000175000017500000000227314010707273021763 0ustar builderbuilder#!/bin/bash # # Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . cp release/libmumbleoverlay.dylib release/MumbleOverlay.osax/Contents/MacOS/ productbuild \ --component release/MumbleOverlay.osax /Library/ScriptingAdditions \ release/synth.pkg root=$(mktemp -d -t mumble-overlay-installer) /usr/bin/xar -f release/synth.pkg -x -C ${root} mkdir -p ${root}/Resources cp icons/mumble.osx.installer.png ${root}/Resources/bg.png VERSION=`defaults read "${PWD}/macx/osax/osax" "MumbleOverlayVersion"` MINCLIENT=`defaults read "${PWD}/macx/osax/osax" "MumbleOverlayMinMumbleVersion"` echo "" > ${root}/upgrade.xml sed -i '' -e 's,,Mumble Overlay,' ${root}/Distribution pushd ${root} /usr/bin/xar -f MumbleOverlay.pkg --no-compress "^.*$" -c ./* popd cp ${root}/MumbleOverlay.pkg release/MumbleOverlay.pkg mumble-1.3.4/macx/scripts/codesign-requirements.tmpl0000664000175000017500000000051514010707273022473 0ustar builderbuilderdesignated => anchor apple generic and identifier ${identifier} and (certificate leaf[field.1.2.840.113635.100.6.1.9] /* exists */ or certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = ${subject_OU}) library => anchor applemumble-1.3.4/macx/scripts/DS_Store0000664000175000017500000002000414010707273016661 0ustar builderbuilderBud1   % DSDB@ @ @ @ .bwspblobbplist00\WindowBounds_{{388, 166}, {530, 525}}\SidebarWidth[ShowToolbar[ShowSidebar]ShowStatusBar[ShowPathbar0=?KLXfr .icvpblobwbplist00_showIconPreview _backgroundColorGreen\showItemInfoXtextSize ^backgroundType_backgroundImageAlias@XiconSizeP_viewOptionsVersion_backgroundColorBlue[gridOffsetY]labelOnBottom[gridSpacingdYarrangeByTgrid_backgroundColorRed[gridOffsetX  24ABKM\st}% ApplicationsIlocblob( Changes.txtIlocblobLicensesIlocblob Mumble.appIlocblob6( Mumble11x.appIlocblob( Murmur ExtrasIlocblobk ReadMe.txtIlocblob6mumble-1.3.4/macx/scripts/gendmg.pl0000775000175000017500000000531414010707273017064 0ustar builderbuilder#!/usr/bin/perl # # Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . # # Generate a Mac OS X Finder .DS_Store file for use on the Mumble disk image. # # # Notes: # # The use of binary plists inside the DS_Store seems to be new for the Finder in Mac OS X 10.6 (Snow Leopard), # but we'll go with this for now. It falls back somewhat gracefully for older versions OS X, since the icons # will still be placed in their correct positions. # use Data::Plist::BinaryWriter; use Mac::Finder::DSStore::BuddyAllocator; use Mac::Finder::DSStore; use IO::File; use strict; my $plist = Data::Plist::BinaryWriter->new(serialize => 0); my $bwsp = $plist->write([dict => { "ShowPathbar" => [ false => 0 ], "ShowSidebar" => [ false => 0 ], "ShowStatusBar" => [ false => 0 ], "ShowToolbar" => [ false => 0 ], "SidebarWidth" => [ integer => 192 ], "WindowBounds" => [ string => "{{388, 166}, {530, 525}}" ], }]); my $icvp = $plist->write([ dict => { "arrangeBy" => [ string => "grid" ], # these are floats [0, 1] "backgroundColorBlue" => [ integer => 1 ], "backgroundColorGreen" => [ integer => 1 ], "backgroundColorRed" => [ integer => 1 ], # a mac os alias record or the background image. # fixme(mkrautz): add our pretty background. :) "backgroundImageAlias" => [ data => "" ], # background type. 1=color, 2=image "backgroundType" => [ integer => 1 ], "gridOffsetX" => [ integer => 0 ], "gridOffsetY" => [ integer => 0 ], "gridSpacing" => [ integer => 100 ], "iconSize" => [ integer => 80 ], "labelOnBottom" => [ true => 1 ], "showIconPreview" => [ true => 1 ], "showItemInfo" => [ false => 0 ], "textSize" => [ integer => 12 ], "viewOptionsVersion" => [ integer => 0 ], }]); my @entries = (); # styling my %styles = ( 'bwsp' => $bwsp, 'icvp' => $icvp, ); for my $key (keys %styles) { my $e = Mac::Finder::DSStore::Entry->new(".", $key); $e->value($styles{$key}); push(@entries, $e); } # file info my %iconpos = ( "Mumble.app" => [ 54, 40 ], "Applications" => [ 466, 40 ], "ReadMe.txt" => [ 54, 416 ], "Changes.txt" => [ 157, 416 ], "Murmur Extras" => [ 363, 416 ], "Licenses" => [ 466, 416 ], ); for my $key (keys %iconpos) { my $e = Mac::Finder::DSStore::Entry->new($key, 'Iloc'); $e->value(pack('NNnnnn', $iconpos{$key}[0], $iconpos{$key}[1], 65536, 65536, 65536, 65536, 0)); push(@entries, $e); } @entries = sort { $a->cmp($b) } @entries; my $store = Mac::Finder::DSStore::BuddyAllocator->new(new IO::File "DS_Store", '>'); &Mac::Finder::DSStore::putDSDBEntries($store, \@entries); $store->writeMetaData; $store->close; mumble-1.3.4/macx/macx.pro0000664000175000017500000000047714010707273015253 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . TEMPLATE = subdirs CONFIG += debug_and_release SUBDIRS = compat osax mumble-1.3.4/macx/common.pri0000664000175000017500000000052014010707273015572 0ustar builderbuilder# Copyright 2005-2021 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . # Common OSX overlay settings. VERSION = 1.3.4 DEFINES *= VERSION=\\\"$$VERSION\\\" mumble-1.3.4/README0000664000175000017500000000470114010707273013523 0ustar builderbuilder M U M B L E A voice chat utility for gamers http://mumble.info/ #mumble on freenode Mumble is a voice chat program for gamers written on top of Qt and Opus. There are two modules in Mumble; the client (mumble) and the server (murmur). The client works on Win32/64, Linux and Mac OS X, while the server should work on anything Qt can be installed on. Note that when we say Win32, we mean Windows XP or newer. Running Mumble ============== On Windows, after installation, you should have a new Mumble folder in your Start Menu, from which you can start Mumble. On Mac OS X, to install Mumble, drag the application from the downloaded disk image into your /Applications folder. Once Mumble is launched, you need a server to connect to. Either create your own or join a friend's. Running Murmur on Unix-like systems =================================== Murmur should be run from the command line, so start a shell (command prompt) and go to wherever you installed Mumble. Run murmur as murmurd [-supw ] [-ini ] [-fg] [v] -supw Set a new password for the user SuperUser, which is hardcoded to bypass ACLs. Keep this password safe. Until you set a password, the SuperUser is disabled. If you use this option, murmur will set the password in the database and then exit. -ini Use an inifile other than murmur.ini, use this to run several instances of murmur from the same directory. Make sure each instance is using a separate database. -fg Run in the foreground, logging to standard output. -v More verbose logging. Running Murmur on Mac OS X ========================== Murmur is distributed separately from the Mumble client on Mac OS X. It is called Static OS X Server and can be downloaded from the main webpage. Once downloaded it can be run in the same way as on any other Unix-like system. For more information please see the 'Running Murmur on Unix-like systems' above. Running Murmur on Win32 ======================= Doubleclick the Murmur icon to start murmur. There will be a small icon on your taskbar from which you can view the log. To set the superuser password, run murmur with the parameters '-supw '. Bandwidth usage =============== Mumble will use 10-40 kbit/s outgoing, and the same incoming for each user. So if there are 10 other users on the server with you, your incoming bandwidth requirement will be 100-400 kbit/s if they all talk at the same time. mumble-1.3.4/sonar-project.properties0000664000175000017500000000023314010707273017543 0ustar builderbuildersonar.projectKey=mumble-voip_mumble sonar.projectName=Mumble sonar.sources=src sonar.tests=src/tests sonar.sourceEncoding=UTF-8 sonar.cfamily.threads=2 mumble-1.3.4/overlay/0000775000175000017500000000000014010707273014322 5ustar builderbuildermumble-1.3.4/overlay/ancestor.h0000664000175000017500000000136114010707273016312 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_ANCESTOR_H_ #define MUMBLE_ANCESTOR_H_ /// Return the absolute and relative exe names of this process's ancestors in /// |absAncestorExeNames| and |ancestorExeNames|. /// /// Returns true on success and fills out |absAncestorExeNames| and |ancestorExeNames|. /// Returns false on failure, and does not change |absAncestorExeNames| and |ancestorExeNames|. bool GetProcessAncestorChain(std::vector &absAncestorExeNames, std::vector &ancestorExeNames); #endif mumble-1.3.4/overlay/excludecheck.h0000664000175000017500000000076514010707273017132 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_EXCLUDECHECK_H_ #define MUMBLE_EXCLUDECHECK_H_ /// Check whether the overlay should be enabled for the given absolute and relative exe names. bool ExcludeCheckIsOverlayEnabled(std::string absExeName_, std::string exeName_); #endif mumble-1.3.4/overlay/overlay_whitelist.h0000664000175000017500000000070514010707273020252 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_OVERLAY_WHITELIST_H_ #define MUMBLE_OVERLAY_WHITELIST_H_ static const char *overlayWhitelist[] = { // We can't whitelist the GW2 launcher "gw2.exe", "gw2-64.exe", NULL }; #endif mumble-1.3.4/overlay/HardHook.h0000664000175000017500000000064514010707273016177 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_HARDHOOK_H_ #define MUMBLE_HARDHOOK_H_ #ifdef USE_MINHOOK # include "HardHook_minhook.h" #else # include "HardHook_x86.h" #endif #endif mumble-1.3.4/overlay/opengl.cpp0000664000175000017500000002333114010707273016314 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "lib.h" #include #include #include "../3rdparty/GL/glext.h" #define TDEF(ret, name, arg) typedef ret (__stdcall * t##name) arg #define GLDEF(ret, name, arg) TDEF(ret, name, arg); t##name o##name = NULL GLDEF(HGLRC, wglCreateContext, (HDC)); GLDEF(void, glGenTextures, (GLsizei, GLuint *)); GLDEF(void, glDeleteTextures, (GLsizei, GLuint *)); GLDEF(void, glEnable, (GLenum)); GLDEF(void, glDisable, (GLenum)); GLDEF(void, glBlendFunc, (GLenum, GLenum)); GLDEF(void, glViewport, (GLint, GLint, GLsizei, GLsizei)); GLDEF(void, glMatrixMode, (GLenum)); GLDEF(void, glLoadIdentity, (void)); GLDEF(void, glOrtho, (GLdouble, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble)); GLDEF(void, glBindTexture, (GLenum, GLuint)); GLDEF(void, glPushMatrix, (void)); GLDEF(void, glBegin, (GLenum)); GLDEF(void, glEnd, (void)); GLDEF(void, glTexCoord2f, (GLfloat, GLfloat)); GLDEF(void, glVertex2f, (GLfloat, GLfloat)); GLDEF(void, glPopMatrix, (void)); GLDEF(void, glTexParameteri, (GLenum, GLenum, GLint)); GLDEF(void, glTexEnvi, (GLenum, GLenum, GLint)); GLDEF(void, glTexImage2D, (GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *)); GLDEF(void, glTexSubImage2D, (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *)); GLDEF(void, glPixelStorei, (GLenum, GLint)); GLDEF(void, wglMakeCurrent, (HDC, HGLRC)); GLDEF(HGLRC, wglGetCurrentContext, (void)); GLDEF(HDC, wglGetCurrentDC, (void)); GLDEF(int, GetDeviceCaps, (HDC, int)); #define INJDEF(ret, name, arg) GLDEF(ret, name, arg); static HardHook hh##name INJDEF(BOOL, wglSwapBuffers, (HDC)); static bool bHooked = false; class Context : protected Pipe { public: Context(HDC hdc); void draw(HDC hdc); protected: virtual void blit(unsigned int x, unsigned int y, unsigned int w, unsigned int h); virtual void setRect(); virtual void newTexture(unsigned int width, unsigned int height); private: HGLRC ctx; GLuint texture; clock_t timeT; unsigned int frameCount; void initContext(); void doDraw(HDC hdc); }; Context::Context(HDC hdc) { timeT = clock(); frameCount = 0; texture = ~0; ctx = owglCreateContext(hdc); HGLRC oldctx = owglGetCurrentContext(); HDC oldhdc = owglGetCurrentDC(); owglMakeCurrent(hdc, ctx); initContext(); owglMakeCurrent(oldhdc, oldctx); } void Context::initContext() { // Here we go. From the top. Where is glResetState? oglDisable(GL_ALPHA_TEST); oglDisable(GL_AUTO_NORMAL); oglEnable(GL_BLEND); // Skip clip planes, there are thousands of them. oglDisable(GL_COLOR_LOGIC_OP); oglDisable(GL_COLOR_MATERIAL); oglDisable(GL_COLOR_TABLE); oglDisable(GL_CONVOLUTION_1D); oglDisable(GL_CONVOLUTION_2D); oglDisable(GL_CULL_FACE); oglDisable(GL_DEPTH_TEST); oglDisable(GL_DITHER); oglDisable(GL_FOG); oglDisable(GL_HISTOGRAM); oglDisable(GL_INDEX_LOGIC_OP); oglDisable(GL_LIGHTING); // Skip line smmooth // Skip map oglDisable(GL_MINMAX); // Skip polygon offset oglDisable(GL_SEPARABLE_2D); oglDisable(GL_SCISSOR_TEST); oglDisable(GL_STENCIL_TEST); oglEnable(GL_TEXTURE_2D); oglDisable(GL_TEXTURE_GEN_Q); oglDisable(GL_TEXTURE_GEN_R); oglDisable(GL_TEXTURE_GEN_S); oglDisable(GL_TEXTURE_GEN_T); oglBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); } void Context::blit(unsigned int x, unsigned int y, unsigned int w, unsigned int h) { ods("OpenGL: Blit %d %d %d %d -- %d %d : %d", x, y, w, h, uiWidth, uiHeight, texture); if (texture == ~0) return; oglBindTexture(GL_TEXTURE_2D, texture); if ((x == 0) && (y == 0) && (w == uiWidth) && (h == uiHeight)) { oglTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, uiWidth, uiHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, a_ucTexture); } else { if (w != uiWidth) oglPixelStorei(GL_UNPACK_ROW_LENGTH, uiWidth); oglTexSubImage2D(GL_TEXTURE_2D, 0, x, y, w, h, GL_BGRA, GL_UNSIGNED_BYTE, a_ucTexture + 4 * (y * uiWidth + x)); if (w != uiWidth) oglPixelStorei(GL_UNPACK_ROW_LENGTH, 0); } } void Context::setRect() { ods("OpenGL: setRect"); } void Context::newTexture(unsigned int width, unsigned int height) { ods("OpenGL: newTex"); if (texture == ~0) { oglBindTexture(GL_TEXTURE_2D, 0); oglDeleteTextures(1, &texture); texture = ~0; } oglGenTextures(1, &texture); oglBindTexture(GL_TEXTURE_2D, texture); oglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); oglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); oglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); oglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); unsigned char *ptr = new unsigned char[width*height*4]; memset(ptr, 0, width*height*4); oglTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, ptr); delete [] ptr; } void Context::draw(HDC hdc) { HGLRC oldctx = owglGetCurrentContext(); HDC oldhdc = owglGetCurrentDC(); owglMakeCurrent(hdc, ctx); doDraw(hdc); owglMakeCurrent(oldhdc, oldctx); } void Context::doDraw(HDC hdc) { // DEBUG //sm->bDebug = true; clock_t t = clock(); float elapsed = static_cast(t - timeT) / CLOCKS_PER_SEC; ++frameCount; if (elapsed > OVERLAY_FPS_INTERVAL) { OverlayMsg om; om.omh.uiMagic = OVERLAY_MAGIC_NUMBER; om.omh.uiType = OVERLAY_MSGTYPE_FPS; om.omh.iLength = sizeof(OverlayMsgFps); om.omf.fps = frameCount / elapsed; sendMessage(om); frameCount = 0; timeT = t; } unsigned int width, height; width = oGetDeviceCaps(hdc, HORZRES); height = oGetDeviceCaps(hdc, VERTRES); HWND hwnd = WindowFromDC(hdc); if (hwnd) { RECT r; if (GetClientRect(hwnd, &r)) { width = r.right - r.left; height = r.bottom - r.top; } } ods("OpenGL: DrawStart: Screen is %d x %d", width, height); checkMessage(width, height); oglViewport(0, 0, width, height); oglMatrixMode(GL_PROJECTION); oglLoadIdentity(); oglOrtho(0, width, height, 0, -100.0, 100.0); oglMatrixMode(GL_MODELVIEW); oglBindTexture(GL_TEXTURE_2D, texture); oglPushMatrix(); oglLoadIdentity(); float w = static_cast(uiWidth); float h = static_cast(uiHeight); float left = static_cast(uiLeft); float top = static_cast(uiTop); float right = static_cast(uiRight); float bottom = static_cast(uiBottom); float xm = (left) / w; float ym = (top) / h; float xmx = (right) / w; float ymx = (bottom) / h; oglTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); oglBegin(GL_QUADS); oglTexCoord2f(xm, ymx); oglVertex2f(left, bottom); oglTexCoord2f(xm, ym); oglVertex2f(left, top); oglTexCoord2f(xmx, ym); oglVertex2f(right, top); oglTexCoord2f(xmx, ymx); oglVertex2f(right, bottom); oglEnd(); oglPopMatrix(); } static map contexts; static void doSwap(HDC hdc) { Context *c = contexts[hdc]; if (!c) { ods("OpenGL: New context for device %p", hdc); c = new Context(hdc); contexts[hdc] = c; } else { ods("OpenGL: Reusing old context"); } c->draw(hdc); } static BOOL __stdcall mywglSwapBuffers(HDC hdc) { ods("OpenGL: wglSwapBuffers"); doSwap(hdc); hhwglSwapBuffers.restore(); BOOL ret=owglSwapBuffers(hdc); hhwglSwapBuffers.inject(); return ret; } /// Ensure that all the symbols that the OpenGL overlay requires have been /// looked up. /// @return true if all symbols have been looked up and are available. /// Otherwise false. static bool lookupSymbols(HMODULE hGL) { #define FNFIND(handle, name) {\ if (o##name == NULL) {\ o##name = reinterpret_cast(GetProcAddress(handle, #name));\ if (o##name == NULL) {\ ods("OpenGL: Could not resolve symbol %s in %s", #name, #handle);\ return false;\ }\ }\ } if (hGL == NULL) { return false; } HMODULE hGDI = GetModuleHandle("GDI32.DLL"); if (hGDI == NULL) { ods("OpenGL: Failed to identify GDI32"); return false; } // Lookup OpenGL32.DLL symbols FNFIND(hGL, wglCreateContext); FNFIND(hGL, glGenTextures); FNFIND(hGL, glDeleteTextures); FNFIND(hGL, glEnable); FNFIND(hGL, glDisable); FNFIND(hGL, glBlendFunc); FNFIND(hGL, glViewport); FNFIND(hGL, glMatrixMode); FNFIND(hGL, glLoadIdentity); FNFIND(hGL, glOrtho); FNFIND(hGL, glBindTexture); FNFIND(hGL, glPushMatrix); FNFIND(hGL, glBegin); FNFIND(hGL, glEnd); FNFIND(hGL, glTexCoord2f); FNFIND(hGL, glVertex2f); FNFIND(hGL, glPopMatrix); FNFIND(hGL, glTexParameteri); FNFIND(hGL, glTexEnvi); FNFIND(hGL, glTexImage2D); FNFIND(hGL, glTexSubImage2D); FNFIND(hGL, glPixelStorei); FNFIND(hGL, wglMakeCurrent); FNFIND(hGL, wglGetCurrentContext); FNFIND(hGL, wglGetCurrentDC); // Lookup GDI32.DLL symbols FNFIND(hGDI, GetDeviceCaps); return true; } void checkOpenGLHook() { static bool bCheckHookActive = false; if (bCheckHookActive) { ods("OpenGL: Recursion in checkOpenGLHook"); return; } bCheckHookActive = true; if (!bHooked) { HMODULE hGL = GetModuleHandle("OpenGL32.DLL"); if (lookupSymbols(hGL)) { char procname[1024]; GetModuleFileName(NULL, procname, 1024); ods("OpenGL: Hooking into OpenGL App %s", procname); // Add a ref to ourselves; we do NOT want to get unloaded directly from this process. HMODULE hTempSelf = NULL; GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, reinterpret_cast(&checkOpenGLHook), &hTempSelf); #define INJECT(handle, name) {\ o##name = reinterpret_cast(GetProcAddress(handle, #name));\ if (o##name) {\ hh##name.setup(reinterpret_cast(o##name), reinterpret_cast(my##name));\ o##name = (t##name) hh##name.call;\ } else {\ ods("OpenGL: Could not resolve symbol %s in %s", #name, #handle);\ }\ } INJECT(hGL, wglSwapBuffers); } } else { hhwglSwapBuffers.check(); } bCheckHookActive = false; } mumble-1.3.4/overlay/olsettings.h0000664000175000017500000000254714010707273016676 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_OVERLAY_OLSETTINGS_H_ #define MUMBLE_OVERLAY_OLSETTINGS_H_ #include #include /// OverlayExclusionMode defines the overlay exclusion /// rules for Mumble. enum OverlayExclusionMode { /// Use the launcher filter-based exclusion mode. LauncherFilterExclusionMode, /// Use only the program whitelist. WhitelistExclusionMode, /// Use only the program blacklist. BlacklistExclusionMode }; /// Get the configured overlay exclusion mode for Mumble. OverlayExclusionMode SettingsGetExclusionMode(); /// Get the list of launcher programs to consider when /// checking the overlay exclusion rules. std::vector SettingsGetLaunchers(); /// Get the list of whitelisted programs to consider when /// checking the overlay exclusion rules. std::vector SettingsGetWhitelist(); /// Get the list of whitelisted paths to consider when /// checking the overlay exclusion rules. std::vector SettingsGetPaths(); /// Get the list of blacklisted programs to consider when /// checking the overlay exclusion rules. std::vector SettingsGetBlacklist(); #endif mumble-1.3.4/overlay/overlay-shared.pro0000664000175000017500000000417114010707273017774 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include (../qmake/compiler.pri) VERSION = 1.3.4 TARGET_EXT = .dll TEMPLATE = lib CONFIG -= qt CONFIG *= dll shared debug_and_release warn_on CONFIG -= embed_manifest_dll RC_FILE = mumble_ol.rc SOURCES = ancestor.cpp lib.cpp olsettings.cpp excludecheck.cpp d3d9.cpp dxgi.cpp d3d10.cpp d3d11.cpp ods.cpp opengl.cpp HardHook.cpp D11StateBlock.cpp HEADERS = ancestor.h lib.h olsettings.h excludecheck.h ods.h HardHook.h overlay_blacklist.h D11StateBlock.h ../3rdparty/GL/glext.h EFFECTS = overlay.fx DX11_PIXEL_SHADERS = overlay11.ps DX11_VERTEX_SHADERS = overlay11.vs DEFINES -= UNICODE QMAKE_CXXFLAGS_RELEASE -= -MD QMAKE_CXXFLAGS_DEBUG -= -MDd QMAKE_CXXFLAGS_RELEASE *= -MT QMAKE_CXXFLAGS_DEBUG *= -MTd LIBS *= -ldxguid -luuid -lole32 -luser32 -ladvapi32 LIBS *= -ld3d9 -ld3d10 -ld3d11 -ld3dcompiler -ldxgi CONFIG(force-x86_64-toolchain) { DEFINES += USE_MINHOOK INCLUDEPATH *= ../3rdparty/minhook-src/include LIBS *= -lminhook } CONFIG(debug, debug|release) { DEFINES *= DEBUG } QMAKE_LIBDIR = $$DESTDIR $$QMAKE_LIBDIR # Override fxc binary for the x86 build. CONFIG(force-x86-toolchain) { exists($$DXSDK_DIR) { FXC = "\"$$(DXSDK_DIR)\\Utilities\\bin\\x86\\fxc.exe\"" } else { FXC = fxc.exe } } else { FXC = fxc.exe } fxc.output = ${QMAKE_FILE_BASE}.hex fxc.commands = $${FXC} /Tfx_4_0 /O3 /Fh${QMAKE_FILE_OUT} ${QMAKE_FILE_NAME} fxc.input = EFFECTS fxc.CONFIG *= no_link target_predeps QMAKE_EXTRA_COMPILERS *= fxc vs11.output = ${QMAKE_FILE_BASE}.ps.h vs11.commands = $${FXC} /Tvs_5_0 /O3 /Vng_vertex_shader /Fh${QMAKE_FILE_OUT} ${QMAKE_FILE_NAME} vs11.input = DX11_VERTEX_SHADERS vs11.CONFIG *= no_link target_predeps QMAKE_EXTRA_COMPILERS *= vs11 ps11.output = ${QMAKE_FILE_BASE}.vs.h ps11.commands = $${FXC} /Tps_5_0 /O3 /Vng_pixel_shader /Fh${QMAKE_FILE_OUT} ${QMAKE_FILE_NAME} ps11.input = DX11_PIXEL_SHADERS ps11.CONFIG *= no_link target_predeps QMAKE_EXTRA_COMPILERS *= ps11 mumble-1.3.4/overlay/HardHook_x86.h0000664000175000017500000000334514010707273016704 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_HARDHOOK_X86_H_ #define MUMBLE_HARDHOOK_X86_H_ #define _UNICODE #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif #include #include #include #include #include #include #include #include typedef void *(*voidFunc)(); struct HardHook { // Pointer to executable code page that holds all trampoline codes static void *pCode; // Number of bytes used in pCode. static unsigned int uiCode; // Pointer to original code (which is hooked/replaced) unsigned char *baseptr; // The original instructions that are replaced by the hook unsigned char orig[6]; // Hook-Code; Replacement instructions for function call jump unsigned char replace[6]; // Remembers whether there is a trampoline in place in the target code or // whether restore -> call orig. -> replace has to be used for every intercepted call bool bTrampoline; // Points to the (rest of the) original function when used from the injected function voidFunc call; HardHook(); HardHook(voidFunc func, voidFunc replacement); void setup(voidFunc func, voidFunc replacement); void setupInterface(IUnknown *intf, LONG funcoffset, voidFunc replacement); void reset(); void inject(bool force = false); void restore(bool force = false); void print(); void check(); private: static const int CODEREPLACESIZE; static const int CODEPROTECTSIZE; void *cloneCode(void **orig); }; #endif mumble-1.3.4/overlay/HardHook.cpp0000664000175000017500000000054514010707273016531 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifdef USE_MINHOOK # include "HardHook_minhook.cpp" #else # include "HardHook_x86.cpp" #endif mumble-1.3.4/overlay/overlay_launchers.h0000664000175000017500000000160014010707273020215 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_OVERLAY_LAUNCHERS_H_ #define MUMBLE_OVERLAY_LAUNCHERS_H_ static const char *overlayLaunchers[] = { "Steam.exe", // Steam "Origin.exe", // Origin "Battle.net.exe", // Battle.net "GalaxyClient.exe", // GOG Galaxy "UbisoftGameLauncher.exe", // Uplay "UbisoftGameLauncher64.exe", // Uplay "itch.exe", // itch.io "LaunchPad.exe", // Daybreak Games LaunchPad "evelauncher.exe", // EVE Online launcher "ffxivlauncher.exe", // Final Fantasy XIV Launcher "LoLPatcher.exe", // League of Legends Patcher (note: this isn't its launcher, but an intermediate process) "GTAVLauncher.exe", // Grand Theft Auto V NULL }; #endif mumble-1.3.4/overlay/mumble_ol.rc0000664000175000017500000000242014010707273016621 0ustar builderbuilder// Copyright 2005-2021 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include #ifndef DEBUG #define VER_DEBUG 0L #else #define VER_DEBUG VS_FF_DEBUG #endif #ifdef SNAPSHOT_BUILD #define VER_RELEASE VS_FF_SPECIALBUILD|VS_FF_PRERELEASE #else #define VER_RELEASE 0L #endif VS_VERSION_INFO VERSIONINFO FILEVERSION 1,3,4,0 PRODUCTVERSION 1,3,4,0 FILEFLAGSMASK VS_FFI_FILEFLAGSMASK FILEFLAGS (VER_DEBUG|VER_RELEASE) FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_DLL FILESUBTYPE 0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904E4" BEGIN VALUE "CompanyName", "The Mumble Developers" VALUE "FileDescription", "Mumble - Low-latency VoIP client" VALUE "FileVersion", "1.3.4" VALUE "ProductVersion", "1.3.4" VALUE "LegalCopyright", "Copyright (c) 2005-2021 The Mumble Developers" VALUE "OriginalFilename", "mumble_ol.dll" VALUE "ProductName", "Mumble" #ifdef SNAPSHOT_BUILD VALUE "SpecialBuild", "Snapshot development release" #endif END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1252 END END mumble-1.3.4/overlay/D11StateBlock.h0000664000175000017500000000605614010707273017003 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . /* Copyright (C) 2011-2013, Nye Liu Copyright (C) 2011-2013, Kissaki All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Mumble Developers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef MUMBLE_D11STATEBLOCK_H_ #define MUMBLE_D11STATEBLOCK_H_ // File contains the D11StateBlock class and a function D11CreateStateBlock. #include class D11StateBlock; void D11CreateStateBlock(ID3D11DeviceContext *, D11StateBlock **); class D11StateBlock { public: D11StateBlock(ID3D11DeviceContext *); ~D11StateBlock(); void Capture(); void Apply(); void ReleaseObjects(); void ReleaseAllDeviceObjects(); private: ID3D11DeviceContext *pDeviceContext; ID3D11RasterizerState *pRasterizerState; UINT uiNumViewports; D3D11_VIEWPORT pViewports[D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE]; ID3D11RenderTargetView *pRenderTargetViews[D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT]; ID3D11DepthStencilView *pDepthStencilView; ID3D11BlendState *pBlendState; float fBlendFactor[4]; UINT32 uiSampleMask; ID3D11InputLayout *pInputLayout; ID3D11Buffer *pIndexBuffer; DXGI_FORMAT Format; UINT uiOffset; D3D11_PRIMITIVE_TOPOLOGY Topology; ID3D11Buffer *pVertexBuffers[D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT]; UINT uiStrides[D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT]; UINT uiOffsets[D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT]; }; #endif /* !D11STATEBLOCK_H_ */ mumble-1.3.4/overlay/ancestor.cpp0000664000175000017500000000604414010707273016650 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "lib.h" #include #include #include /// Find the PROCESSENTRY32 entry for the parent of the process with the |childpid| PID. /// /// Returns true on success, and fills out |parent| with the correct PROCESSENTRY32. /// Returns false on failure, and does not touch |parent|. static bool findParentProcessForChild(DWORD childpid, PROCESSENTRY32 *parent) { DWORD parentpid = 0; HANDLE hSnap = NULL; bool done = false; PROCESSENTRY32 pe; pe.dwSize = sizeof(pe); MODULEENTRY32 me; me.dwSize = sizeof(me); // Find our parent's process ID. { BOOL ok = FALSE; hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnap == INVALID_HANDLE_VALUE) { return false; } ok = Process32First(hSnap, &pe); while (ok) { if (pe.th32ProcessID == childpid) { parentpid = pe.th32ParentProcessID; break; } ok = Process32Next(hSnap, &pe); } CloseHandle(hSnap); } if (parentpid == 0) { return false; } // Find our parent's name. { BOOL ok = FALSE; hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnap == INVALID_HANDLE_VALUE) { return false; } ok = Process32First(hSnap, &pe); while (ok) { if (pe.th32ProcessID == parentpid) { memcpy(parent, &pe, sizeof(pe)); ok = FALSE; done = true; break; } ok = Process32Next(hSnap, &pe); } CloseHandle(hSnap); } return done; } /// Find the MODULEENTRY32 for the PROCESSENTRY32 |parent|. /// The MODULEENTRY32 allows us to access the absolute path of the parent executable. /// /// Returns true on success, and fills out |module| with the proper MODULEENTRY32 entry. /// Returns false on failure, and does not touch |module|. static bool getModuleForParent(PROCESSENTRY32 *parent, MODULEENTRY32 *module) { HANDLE hSnap = NULL; bool done = false; MODULEENTRY32 me; me.dwSize = sizeof(me); hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE32 | TH32CS_SNAPMODULE, parent->th32ProcessID); if (hSnap == INVALID_HANDLE_VALUE) { goto out; } if (!Module32First(hSnap, &me)) { goto out; } memcpy(module, &me, sizeof(me)); done = true; out: CloseHandle(hSnap); return done; } bool GetProcessAncestorChain(std::vector &absAncestorExeNames, std::vector &ancestorExeNames) { PROCESSENTRY32 parent; MODULEENTRY32 module; std::vector abs; std::vector rel; bool ok = true; DWORD childpid = GetCurrentProcessId(); while (ok) { ok = findParentProcessForChild(childpid, &parent); if (ok) { ok = getModuleForParent(&parent, &module); if (ok) { abs.push_back(std::string(module.szExePath)); rel.push_back(std::string(parent.szExeFile)); childpid = parent.th32ProcessID; } } } ok = abs.size() > 0; if (ok) { absAncestorExeNames = abs; ancestorExeNames = rel; } return ok; } mumble-1.3.4/overlay/overlay_blacklist.h0000664000175000017500000000376014010707273020212 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_OVERLAY_BLACKLIST_H_ #define MUMBLE_OVERLAY_BLACKLIST_H_ static const char *overlayBlacklist[] = { "iexplore.exe", "ieuser.exe", "vlc.exe", "crimecraft.exe", "dbgview.exe", "opera.exe", "chrome.exe", "acrord32.exe", "explorer.exe", "sihost.exe", "ApplicationFrameHost.exe", "dllhost.exe", "wmpnscfg.exe", "firefox.exe", "thunderbird.exe", "instantbird.exe", "wlmail.exe", // Windows Live Suite (mshtml.dll) "msnmsgr.exe", "MovieMaker.exe", "WLXPhotoGallery.exe", "psi.exe", // Secunia PSI (uses mshtml.dll) "Photoshop.exe", "blender.exe", "googleearth.exe", "XBMC.exe", // http://xbmc.org/ "kodi.exe", // https://kodi.tv/ "BOXEE.exe", // http://www.boxee.tv/ "hammer.exe", // VALVE Hammer Editor "hlmv.exe", // Half-Life Model Viewer "hlfaceposer.exe", // Face Poser (from Source SDK) "LoLLauncher.exe", // League of Legends Launcher/Patcher "acrobat.exe", // Adobe Acrobat "Steam.exe", // Prevent invisible hooking "RzSynapse.exe", // Prevent invisible hooking - Razer Synapse (settings online synchronization) "IpOverUsbSvc.exe", // Windows Phone IP over USB Transport "Origin.exe", // EA Origin "HydraSysTray.exe", // Razer Hydra system tray "devenv.exe", // Microsoft Visual Studio "spotify.exe", // Spotify "EpicGamesLauncher.exe", // Epic, Unreal Tournament launcher "dwm.exe", // Windows Desktop Window Manager "MouseKeyboardCenter.exe", "RadeonSettings.exe", "mstsc.exe", // Microsoft Remote Desktop Connection "iCloudServices.exe", "BethesdaNetLauncher.exe", "GTAVLauncher.exe", // Microsoft Office "outlook.exe", // Outlook "winword.exe", // Word "excel.exe", // Excel "powerpnt.exe", // PowerPoint "onenote.exe", // OneNote "mspub.exe", // Publisher "msaccess.exe", // Access NULL }; #endif mumble-1.3.4/overlay/lib.cpp0000664000175000017500000004562514010707273015610 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "lib.h" #include "excludecheck.h" #include "overlay_exe/overlay_exe.h" static HANDLE hMapObject = NULL; static HANDLE hHookMutex = NULL; static HHOOK hhookWnd = 0; BOOL bIsWin8 = FALSE; static BOOL bMumble = FALSE; static BOOL bDebug = FALSE; static BOOL bEnableOverlay = TRUE; static HardHook hhLoad; static HardHook hhLoadW; static SharedData *sd = NULL; CRITICAL_SECTION Mutex::cs; void Mutex::init() { InitializeCriticalSection(&cs); } Mutex::Mutex() { if (! TryEnterCriticalSection(&cs)) { ods("Lib: Mutex: CritFail - blocking until able to enter critical section"); EnterCriticalSection(&cs); } } Mutex::~Mutex() { LeaveCriticalSection(&cs); } void __cdecl ods(const char *format, ...) { #ifndef DEBUG if (!bDebug) return; #endif va_list args; va_start(args, format); _ods_out(format, &args); va_end(args); } void __cdecl checkForWPF() { if (bEnableOverlay && (GetModuleHandleW(L"wpfgfx_v0300.dll") || GetModuleHandleW(L"wpfgfx_v0400.dll"))) { ods("Lib: Blacklisted for loading WPF library"); bEnableOverlay = FALSE; } } Pipe::Pipe() { hSocket = INVALID_HANDLE_VALUE; hMemory = NULL; a_ucTexture = NULL; omMsg.omh.iLength = -1; dwAlreadyRead = 0; uiWidth = uiHeight = 0; uiLeft = uiRight = uiTop = uiBottom = 0; } Pipe::~Pipe() { disconnect(); } void Pipe::release() { if (hMemory) { CloseHandle(hMemory); hMemory = NULL; if (a_ucTexture) { UnmapViewOfFile(a_ucTexture); a_ucTexture = NULL; } uiLeft = uiRight = uiTop = uiBottom = 0; } } void Pipe::disconnect() { release(); if (hSocket != INVALID_HANDLE_VALUE) { ods("Pipe: Disconnect"); CloseHandle(hSocket); hSocket = INVALID_HANDLE_VALUE; } uiWidth = 0; uiHeight = 0; omMsg.omh.iLength = -1; } bool Pipe::sendMessage(const OverlayMsg &om) { DWORD dwBytesToWrite = sizeof(OverlayMsgHeader) + om.omh.iLength; DWORD dwBytesWritten = dwBytesToWrite; if (WriteFile(hSocket, om.headerbuffer, sizeof(OverlayMsgHeader) + om.omh.iLength, &dwBytesWritten, NULL)) if (dwBytesToWrite == dwBytesWritten) return true; ods("Pipe: Short write"); disconnect(); return false; } void Pipe::checkMessage(unsigned int width, unsigned int height) { if (!width || ! height) return; if (hSocket == INVALID_HANDLE_VALUE) { hSocket = CreateFileW(L"\\\\.\\pipe\\MumbleOverlayPipe", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if (hSocket == INVALID_HANDLE_VALUE) { ods("Pipe: Connection failed"); return; } ods("Pipe: Connected"); uiWidth = 0; uiHeight = 0; // initially, instantiate and send an OverlayMessage with the current process id OverlayMsg om; om.omh.uiMagic = OVERLAY_MAGIC_NUMBER; om.omh.uiType = OVERLAY_MSGTYPE_PID; om.omh.iLength = sizeof(OverlayMsgPid); om.omp.pid = GetCurrentProcessId(); if (!sendMessage(om)) return; ods("Pipe: Process ID sent"); } // if the passed width and height do not match the current overlays uiWidth and uiHeight, re-initialize if ((uiWidth != width) || (uiHeight != height)) { release(); uiWidth = width; uiHeight = height; // instantiate and send an initialization-OverlayMessage OverlayMsg om; om.omh.uiMagic = OVERLAY_MAGIC_NUMBER; om.omh.uiType = OVERLAY_MSGTYPE_INIT; om.omh.iLength = sizeof(OverlayMsgInit); om.omi.uiWidth = uiWidth; om.omi.uiHeight = uiHeight; if (!sendMessage(om)) return; ods("Pipe: SentInitMsg with w h %d %d", uiWidth, uiHeight); } std::vector blits; while (1) { DWORD dwBytesLeft; DWORD dwBytesRead; if (! PeekNamedPipe(hSocket, NULL, 0, NULL, &dwBytesLeft, NULL)) { ods("Pipe: Could not peek"); disconnect(); return; } if (! dwBytesLeft) break; if (omMsg.omh.iLength == -1) { if (! ReadFile(hSocket, reinterpret_cast(omMsg.headerbuffer) + dwAlreadyRead, sizeof(OverlayMsgHeader) - dwAlreadyRead, &dwBytesRead, NULL)) { ods("Pipe: Read header fail"); disconnect(); return; } dwBytesLeft -= dwBytesRead; dwAlreadyRead += dwBytesRead; if (dwAlreadyRead != sizeof(OverlayMsgHeader)) { break; } dwAlreadyRead = 0; if (omMsg.omh.uiMagic != OVERLAY_MAGIC_NUMBER) { ods("Pipe: Invalid magic number %x", omMsg.omh.uiMagic); disconnect(); return; } if (static_cast(dwBytesLeft) < omMsg.omh.iLength) continue; } if (! ReadFile(hSocket, reinterpret_cast(omMsg.msgbuffer) + dwAlreadyRead, omMsg.omh.iLength - dwAlreadyRead, &dwBytesRead, NULL)) { ods("Pipe: Read data fail"); disconnect(); return; } dwAlreadyRead += dwBytesRead; if (static_cast(dwBytesLeft) < omMsg.omh.iLength) continue; dwAlreadyRead = 0; switch (omMsg.omh.uiType) { case OVERLAY_MSGTYPE_SHMEM: { wchar_t memname[2048]; memname[0] = 0; MultiByteToWideChar(CP_UTF8, 0, omMsg.oms.a_cName, omMsg.omh.iLength, memname, 2048); release(); hMemory = CreateFileMappingW(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, uiWidth * uiHeight * 4, memname); if (GetLastError() != ERROR_ALREADY_EXISTS) { ods("Pipe: Memory %s(%d) => %ls doesn't exist", omMsg.oms.a_cName, omMsg.omh.iLength, memname); if (hMemory) { CloseHandle(hMemory); hMemory = NULL; break; } } if (! hMemory) { ods("Pipe: CreateFileMapping failed"); break; } a_ucTexture = reinterpret_cast(MapViewOfFile(hMemory, FILE_MAP_ALL_ACCESS, 0, 0, 0)); if (a_ucTexture == NULL) { ods("Pipe: Failed to map memory"); CloseHandle(hMemory); hMemory = NULL; break; } MEMORY_BASIC_INFORMATION mbi; memset(&mbi, 0, sizeof(mbi)); if ((VirtualQuery(a_ucTexture, &mbi, sizeof(mbi)) == 0) || (mbi.RegionSize < (uiHeight * uiWidth * 4))) { ods("Pipe: Memory too small"); UnmapViewOfFile(a_ucTexture); CloseHandle(hMemory); a_ucTexture = NULL; hMemory = NULL; break; } OverlayMsg om; om.omh.uiMagic = OVERLAY_MAGIC_NUMBER; om.omh.uiType = OVERLAY_MSGTYPE_SHMEM; om.omh.iLength = 0; if (!sendMessage(om)) return; newTexture(uiWidth, uiHeight); } break; case OVERLAY_MSGTYPE_BLIT: { RECT r = { static_cast(omMsg.omb.x), static_cast(omMsg.omb.y), static_cast(omMsg.omb.x + omMsg.omb.w), static_cast(omMsg.omb.y + omMsg.omb.h) }; std::vector::iterator i = blits.begin(); while (i != blits.end()) { RECT is; if (::IntersectRect(&is, &r, & *i)) { ::UnionRect(&is, &r, & *i); r = is; blits.erase(i); i = blits.begin(); } else { ++i; } } blits.push_back(r); } break; case OVERLAY_MSGTYPE_ACTIVE: { uiLeft = omMsg.oma.x; uiTop = omMsg.oma.y; uiRight = omMsg.oma.x + omMsg.oma.w; uiBottom = omMsg.oma.y + omMsg.oma.h; if (a_ucTexture) { setRect(); blit(0, 0, uiWidth, uiHeight); } } break; default: break; } omMsg.omh.iLength = -1; } if (!a_ucTexture) return; for (std::vector::iterator i = blits.begin(); i != blits.end(); ++i) blit((*i).left, (*i).top, (*i).right - (*i).left, (*i).bottom - (*i).top); } static void checkHooks(bool preonly) { checkD3D9Hook(preonly); checkDXGIHook(preonly); checkDXGI10Hook(preonly); checkDXGI11Hook(preonly); checkOpenGLHook(); } typedef HMODULE(__stdcall *LoadLibraryAType)(const char *); static HMODULE WINAPI MyLoadLibrary(const char *lpFileName) { //TODO: Move logic to HardHook. // Call base without active hook in case of no trampoline. LoadLibraryAType oLoadLibrary = (LoadLibraryAType) hhLoad.call; hhLoad.restore(); HMODULE h = oLoadLibrary(lpFileName); hhLoad.inject(); ods("Lib: Library %s loaded to %p", lpFileName, h); if (bEnableOverlay) { checkHooks(); } return h; } typedef HMODULE(__stdcall *LoadLibraryWType)(const wchar_t *); static HMODULE WINAPI MyLoadLibraryW(const wchar_t *lpFileName) { //TODO: Move logic to HardHook. // Call base without active hook in case of no trampoline. LoadLibraryWType oLoadLibrary = (LoadLibraryWType) hhLoadW.call; hhLoadW.restore(); HMODULE h = oLoadLibrary(lpFileName); hhLoadW.inject(); ods("Lib: Library %ls wloaded to %p", lpFileName, h); checkForWPF(); if (bEnableOverlay) { checkHooks(); } return h; } static LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam) { return CallNextHookEx(hhookWnd, nCode, wParam, lParam); } extern "C" __declspec(dllexport) void __cdecl RemoveHooks() { DWORD dwWaitResult = WaitForSingleObject(hHookMutex, 1000L); if (dwWaitResult == WAIT_OBJECT_0) { if (sd != NULL && sd->bHooked) { if (hhookWnd) { UnhookWindowsHookEx(hhookWnd); hhookWnd = NULL; } sd->bHooked = false; } ReleaseMutex(hHookMutex); } } extern "C" __declspec(dllexport) void __cdecl InstallHooks() { DWORD dwWaitResult = WaitForSingleObject(hHookMutex, 1000L); if (dwWaitResult == WAIT_OBJECT_0) { if (sd != NULL && ! sd->bHooked) { HMODULE hSelf = NULL; GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, reinterpret_cast(&InstallHooks), &hSelf); if (hSelf == NULL) { ods("Lib: Failed to find myself"); } else { hhookWnd = SetWindowsHookEx(WH_CBT, CallWndProc, hSelf, 0); if (hhookWnd == NULL) ods("Lib: Failed to insert WNDProc hook"); } sd->bHooked = true; } ReleaseMutex(hHookMutex); } } extern "C" __declspec(dllexport) unsigned int __cdecl GetOverlayMagicVersion() { return OVERLAY_MAGIC_NUMBER; } // Via d3d9.cpp extern "C" __declspec(dllexport) void __cdecl PrepareD3D9(); // Via dxgi.cpp extern "C" __declspec(dllexport) void __cdecl PrepareDXGI(); void __stdcall OverlayHelperProcessParentDeathThread(void *udata) { HANDLE parent = reinterpret_cast(udata); DWORD status = WaitForSingleObject(parent, INFINITE); if (status != WAIT_OBJECT_0) { ExitProcess(OVERLAY_HELPER_ERROR_DLL_PDEATH_WAIT_FAIL); } ExitProcess(0); } extern "C" __declspec(dllexport) int __cdecl OverlayHelperProcessMain(unsigned int magic, HANDLE parent) { int retval = 0; if (GetOverlayMagicVersion() != magic) { return OVERLAY_HELPER_ERROR_DLL_MAGIC_MISMATCH; } HANDLE pcheckHandle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) OverlayHelperProcessParentDeathThread, reinterpret_cast(parent), 0, NULL); if (pcheckHandle == 0) { return OVERLAY_HELPER_ERROR_DLL_PDEATH_THREAD_ERROR; } PrepareD3D9(); PrepareDXGI(); InstallHooks(); while (1) { MSG msg; BOOL ret; ret = GetMessage(&msg, NULL, 0, 0); // The ret variable is set to 0 on WM_QUIT, // and -1 on error. if (ret == 0) { retval = 0; break; } else if (ret == -1) { retval = -1001; break; } if (msg.message == WM_CLOSE) { retval = 0; break; } TranslateMessage(&msg); DispatchMessage(&msg); } RemoveHooks(); return retval; } static bool createSharedDataMap(); // Check for the presence of a "nooverlay" file in the directory of the // program we're injected into. If such a file exists, it's a hint that // we shouldn't inject into it. static void checkNoOverlayFile(const std::string &dir) { std::string nooverlay = dir + "\\nooverlay"; HANDLE h = CreateFile(nooverlay.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (h != INVALID_HANDLE_VALUE) { CloseHandle(h); ods("Lib: Overlay disable %s found", dir.c_str()); bEnableOverlay = FALSE; return; } } // Check for the presence of a "debugoverlay" file in the directory of // the program we're injected into. If such a file exists, it's a hint // from the user that they want verbose debugging output from the overlay. static void checkDebugOverlayFile(const std::string &dir) { // check for "debugoverlay" file, which would enable overlay debugging std::string debugoverlay = dir + "\\debugoverlay"; HANDLE h = CreateFile(debugoverlay.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (h != INVALID_HANDLE_VALUE) { CloseHandle(h); ods("Lib: Overlay debug %s found", debugoverlay.c_str()); bDebug = TRUE; } } // Given the absolute path to the current process's executable via |procname|, // return the absolute path to the executable in |absExeName|, the directory // that the executable lives in in |dir| and the basename of the executable in // |exeName|. // // Returns true on success and fills out |absExeName|, |dir| and |exeName|. // Returns false on failure, and does not touch |absExeName|, |dir| and |exeName|. static bool parseProcName(char *procname, std::string &absExeName, std::string &dir, std::string &exeName) { if (procname == NULL) { return false; } char *p = strrchr(procname, '\\'); if (p == NULL) { return false; } absExeName = std::string(procname); dir = std::string(procname, p - procname); exeName = std::string(p + 1); return true; } static bool dllmainProcAttach(char *procname) { Mutex::init(); std::string absExeName; std::string dir; std::string exeName; bool ok = parseProcName(procname, absExeName, dir, exeName); if (!ok) { // No blacklisting if the file has no path } else if (GetProcAddress(NULL, "mumbleSelfDetection") != NULL) { ods("Lib: Attached to overlay helper or Mumble process. Blacklisted - no overlay injection."); bEnableOverlay = FALSE; bMumble = TRUE; } else { checkNoOverlayFile(dir); checkDebugOverlayFile(dir); if (bEnableOverlay) { bEnableOverlay = ExcludeCheckIsOverlayEnabled(absExeName, exeName); } if (!bEnableOverlay) { return false; } } OSVERSIONINFOEX ovi; memset(&ovi, 0, sizeof(ovi)); ovi.dwOSVersionInfoSize = sizeof(ovi); GetVersionEx(reinterpret_cast(&ovi)); bIsWin8 = (ovi.dwMajorVersion >= 7) || ((ovi.dwMajorVersion == 6) && (ovi.dwBuildNumber >= 9200)); ods("Lib: bIsWin8: %i", bIsWin8); hHookMutex = CreateMutex(NULL, false, "MumbleHookMutex"); if (hHookMutex == NULL) { ods("Lib: CreateMutex failed"); return false; } if(!createSharedDataMap()) return false; if (! bMumble) { // Hook our own LoadLibrary functions so we notice when a new library (like the d3d ones) is loaded. hhLoad.setup(reinterpret_cast(LoadLibraryA), reinterpret_cast(MyLoadLibrary)); hhLoadW.setup(reinterpret_cast(LoadLibraryW), reinterpret_cast(MyLoadLibraryW)); checkHooks(true); ods("Lib: Injected into %s", procname); } return true; } static bool createSharedDataMap() { DWORD dwSharedSize = sizeof(SharedData) + sizeof(Direct3D9Data) + sizeof(DXGIData) + sizeof(D3D10Data) + sizeof(D3D11Data); #if defined(_M_IX86) const char *name = "MumbleOverlayPrivate-x86"; #elif defined(_M_X64) const char *name = "MumbleOverlayPrivate-x64"; #else # error Unsupported architecture #endif hMapObject = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, dwSharedSize, name); if (hMapObject == NULL) { ods("Lib: CreateFileMapping failed"); return false; } //Note: If the mapping exists dwSharedSize value will be ignored and existing handle returned bool bInit = (GetLastError() != ERROR_ALREADY_EXISTS); unsigned char *rawSharedPointer = static_cast( MapViewOfFile(hMapObject, FILE_MAP_ALL_ACCESS, 0, 0, dwSharedSize)); if (rawSharedPointer == NULL) { ods("Lib: MapViewOfFile failed"); return false; } if (bInit) memset(rawSharedPointer, 0, dwSharedSize); sd = reinterpret_cast(rawSharedPointer); rawSharedPointer += sizeof(SharedData); d3dd = reinterpret_cast(rawSharedPointer); rawSharedPointer += sizeof(Direct3D9Data); dxgi = reinterpret_cast(rawSharedPointer); rawSharedPointer += sizeof(DXGIData); d3d10 = reinterpret_cast(rawSharedPointer); rawSharedPointer += sizeof(D3D10Data); d3d11 = reinterpret_cast(rawSharedPointer); rawSharedPointer += sizeof(D3D11Data); return true; } static void dllmainProcDetach() { hhLoad.restore(true); hhLoad.reset(); hhLoadW.restore(true); hhLoadW.reset(); if (sd) UnmapViewOfFile(sd); if (hMapObject) CloseHandle(hMapObject); if (hHookMutex) CloseHandle(hHookMutex); } static void dllmainThreadAttach() { static bool bTriedHook = false; if (bEnableOverlay && sd && ! bTriedHook) { bTriedHook = true; checkForWPF(); if (bEnableOverlay) { ods("Lib: Checking for hooks, potentially injecting"); checkHooks(); } } } extern "C" BOOL WINAPI DllMain(HINSTANCE, DWORD fdwReason, LPVOID) { char procname[PROCNAMEFILEPATH_EXTENDED_BUFFER_BUFLEN]; GetModuleFileNameA(NULL, procname, ARRAY_NUM_ELEMENTS(procname)); // Fix for windows XP; on length nSize does not include null-termination // @see http://msdn.microsoft.com/en-us/library/windows/desktop/ms683197%28v=vs.85%29.aspx procname[ARRAY_NUM_ELEMENTS(procname) - 1] = '\0'; switch (fdwReason) { case DLL_PROCESS_ATTACH: { ods("Lib: ProcAttach: %s", procname); dllmainProcAttach(procname); break; } case DLL_PROCESS_DETACH: ods("Lib: ProcDetach: %s", procname); dllmainProcDetach(); break; case DLL_THREAD_ATTACH: ods("Lib: ThreadAttach: %s", procname); dllmainThreadAttach(); break; default: break; } return TRUE; } bool IsFnInModule(voidFunc fnptr, wchar_t *refmodulepath, const std::string &logPrefix, const std::string &fnName) { HMODULE hModule = NULL; BOOL success = GetModuleHandleEx( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, reinterpret_cast(fnptr), &hModule); if (!success) { ods((logPrefix + ": Failed to get module for " + fnName).c_str()); } else { wchar_t modulename[MODULEFILEPATH_BUFLEN]; GetModuleFileNameW(hModule, modulename, ARRAY_NUM_ELEMENTS(modulename)); return _wcsicmp(modulename, refmodulepath) == 0; } return false; } boost::optional GetFnOffsetInModule(voidFunc fnptr, wchar_t *refmodulepath, unsigned int refmodulepathLen, const std::string &logPrefix, const std::string &fnName) { HMODULE hModule = NULL; if (! GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, reinterpret_cast(fnptr), &hModule)) { ods((logPrefix + ": Failed to get module for " + fnName).c_str()); return boost::none; } const bool bInit = refmodulepath[0] == '\0'; if (bInit) { GetModuleFileNameW(hModule, refmodulepath, refmodulepathLen); } else { wchar_t modulename[MODULEFILEPATH_BUFLEN]; GetModuleFileNameW(hModule, modulename, ARRAY_NUM_ELEMENTS(modulename)); if (_wcsicmp(modulename, refmodulepath) != 0) { ods((logPrefix + ": " + fnName + " functions module path does not match previously found. Now: '%ls', Previously: '%ls'").c_str(), modulename, refmodulepath); return boost::none; } } size_t fn = reinterpret_cast(fnptr); size_t base = reinterpret_cast(hModule); return fn - base; } mumble-1.3.4/overlay/lib.h0000664000175000017500000000756114010707273015252 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_LIB_H_ #define MUMBLE_LIB_H_ #define _UNICODE #ifdef _WIN32_WINNT # undef _WIN32_WINNT #endif #define _WIN32_WINNT 0x0501 #include #include #include #include #include #include #include #include #include #include "overlay.h" #include "HardHook.h" #include "ods.h" #define lround(x) static_cast((x) + (((x) >= 0.0) ? 0.5 : -0.5)) #define ARRAY_SIZE_BYTES(x) sizeof(x) #define ARRAY_NUM_ELEMENTS(x) (sizeof(x)/sizeof((x)[0])) using namespace std; void __cdecl ods(const char *format, ...); const int MODULEFILEPATH_BUFLEN = 2048; const int PROCNAMEFILEPATH_BUFLEN = 1024; const int PROCNAMEFILEPATH_EXTENDED_EXTLEN = 64; const int PROCNAMEFILEPATH_EXTENDED_BUFFER_BUFLEN = PROCNAMEFILEPATH_BUFLEN + PROCNAMEFILEPATH_EXTENDED_EXTLEN; struct Direct3D9Data { /// Filepath of the module the offsets are for. wchar_t wcFileName[MODULEFILEPATH_BUFLEN]; size_t offsetCreate; size_t offsetCreateEx; }; struct DXGIData { /// Filepath of the module the offsets are for. wchar_t wcFileName[MODULEFILEPATH_BUFLEN]; size_t offsetPresent; size_t offsetResize; }; struct D3D10Data { /// Filepath of the module the offsets are for. wchar_t wcFileName[MODULEFILEPATH_BUFLEN]; size_t offsetAddRef; size_t offsetRelease; }; struct D3D11Data { /// Filepath of the module the offsets are for. wchar_t wcFileName[MODULEFILEPATH_BUFLEN]; size_t offsetAddRef; size_t offsetRelease; }; struct SharedData { bool bHooked; }; class Mutex { protected: static CRITICAL_SECTION cs; public: static void init(); Mutex(); ~Mutex(); }; class Pipe { private: HANDLE hSocket; HANDLE hMemory; void release(); protected: unsigned int uiWidth, uiHeight; unsigned int uiLeft, uiTop, uiRight, uiBottom; unsigned char *a_ucTexture; DWORD dwAlreadyRead; OverlayMsg omMsg; void checkMessage(unsigned int w, unsigned int h); bool sendMessage(const OverlayMsg &m); virtual void blit(unsigned int x, unsigned int y, unsigned int w, unsigned int h) = 0; virtual void setRect() = 0; virtual void newTexture(unsigned int w, unsigned int h) = 0; Pipe(); virtual ~Pipe(); public: void disconnect(); }; // From lib.cpp extern void checkHooks(bool preonly = false); // From dxgi.cpp extern void checkDXGIHook(bool preonly = false); // From d3d10.cpp extern void checkDXGI10Hook(bool preonly = false); // From d3d11.cpp extern void checkDXGI11Hook(bool preonly = false); // From d3d9.cpp extern void checkD3D9Hook(bool preonly = false); // From opengl.cpp extern void checkOpenGLHook(); // From d3d9.cpp extern Direct3D9Data *d3dd; // From dxgi.cpp extern DXGIData *dxgi; // From d3d10.cpp extern D3D10Data *d3d10; // From d3d11.cpp extern D3D11Data *d3d11; // From lib.cpp extern BOOL bIsWin8; // From lib.cpp /// Checks if the module of the function pointer fnptr equals the module filepath /// of refmodulepath. /// /// @param fnptr /// @param refmodulepath the module path to compare against /// @param logPrefix Used for debug logging. /// @param fnName name of the method fnptr points to. used for debug logging /// @return true if the module filepath of the function pointer matches the reference one extern bool IsFnInModule(voidFunc fnptr, wchar_t *refmodulepath, const std::string &logPrefix, const std::string &fnName); // From lib.cpp /// Checks fnptr is in a loaded module with module path refmodulepath. /// /// @return Offset as int or < 0 on failure. extern boost::optional GetFnOffsetInModule(voidFunc fnptr, wchar_t *refmodulepath, unsigned int refmodulepathLen, const std::string &logPrefix, const std::string &fnName); #endif mumble-1.3.4/overlay/overlay.pro0000664000175000017500000000050714010707273016527 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . CONFIG += force-x86-toolchain TARGET = mumble_ol include(overlay-shared.pro) mumble-1.3.4/overlay/overlay11.ps0000664000175000017500000000372414010707273016517 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . /* Copyright (C) 2011-2013, Nye Liu All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Mumble Developers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "overlay11-common.hlsl" float4 main( PS_INPUT input ) : SV_Target { return txDiffuse.Sample(samLinear, input.Tex).bgra; }mumble-1.3.4/overlay/dxgi.cpp0000664000175000017500000002023314010707273015761 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . /* Copyright (C) 2005-2010, Thorvald Natvig Copyright (C) 2011, Kissaki Copyright (C) 2011, Nye Liu All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Mumble Developers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "lib.h" #include DXGIData *dxgi = NULL; static bool bHooked = false; static HardHook hhPresent; static HardHook hhResize; typedef HRESULT(__stdcall *CreateDXGIFactory1Type)(REFIID, void **); typedef HRESULT(__stdcall *PresentType)(IDXGISwapChain *, UINT, UINT); typedef HRESULT(__stdcall *ResizeBuffersType)(IDXGISwapChain *, UINT, UINT, UINT, DXGI_FORMAT, UINT); #define HMODREF(mod, func) func##Type p##func = (func##Type) GetProcAddress(mod, #func) // From d3d10.cpp extern void presentD3D10(IDXGISwapChain *pSwapChain); // From d3d11.cpp extern void presentD3D11(IDXGISwapChain *pSwapChain); static HRESULT __stdcall myPresent(IDXGISwapChain *pSwapChain, UINT SyncInterval, UINT Flags) { // Present is called for each frame. Thus, we do not want to always log here. #ifdef EXTENDED_OVERLAY_DEBUGOUTPUT ods("DXGI: Call to Present; Drawing and then chaining the call to the original logic"); #endif // From this D3D-version-independent point, call the present logic for both // D3D 10 and 11. Those that apply will be executed adequately, those that // do not will (silently) fail. presentD3D10(pSwapChain); presentD3D11(pSwapChain); //TODO: Move logic to HardHook. // Call base without active hook in case of no trampoline. PresentType oPresent = (PresentType) hhPresent.call; hhPresent.restore(); HRESULT hr = oPresent(pSwapChain, SyncInterval, Flags); hhPresent.inject(); return hr; } // From d3d10.cpp extern void resizeD3D10(IDXGISwapChain *pSwapChain); // From d3d11.cpp extern void resizeD3D11(IDXGISwapChain *pSwapChain); static HRESULT __stdcall myResize(IDXGISwapChain *pSwapChain, UINT BufferCount, UINT Width, UINT Height, DXGI_FORMAT NewFormat, UINT SwapChainFlags) { #ifdef EXTENDED_OVERLAY_DEBUGOUTPUT ods("DXGI: Call to Resize. Forwarding to D3D10 and D3D11 custom implementations before calling original logic ..."); #endif resizeD3D10(pSwapChain); resizeD3D11(pSwapChain); //TODO: Move logic to HardHook. // Call base without active hook in case of no trampoline. ResizeBuffersType oResize = (ResizeBuffersType) hhResize.call; hhResize.restore(); HRESULT hr = oResize(pSwapChain, BufferCount, Width, Height, NewFormat, SwapChainFlags); hhResize.inject(); return hr; } static void HookPresentRaw(voidFunc vfPresent) { ods("DXGI: Injecting Present"); hhPresent.setup(vfPresent, reinterpret_cast(myPresent)); } static void HookResizeRaw(voidFunc vfResize) { ods("DXGI: Injecting ResizeBuffers Raw"); hhResize.setup(vfResize, reinterpret_cast(myResize)); } void hookDXGI(HMODULE hDXGI, bool preonly); void checkDXGIHook(bool preonly) { static bool bCheckHookActive = false; if (bCheckHookActive) { ods("DXGI: Recursion in checkDXGIHook"); return; } if (dxgi->offsetPresent == 0 || dxgi->offsetResize == 0) return; bCheckHookActive = true; HMODULE hDXGI = GetModuleHandleW(L"DXGI.DLL"); if (hDXGI) { if (! bHooked) { hookDXGI(hDXGI, preonly); } #ifdef EXTENDED_OVERLAY_DEBUGOUTPUT } else { ods("DXGI: No DXGI.DLL found as loaded. No hooking at this point."); #endif } bCheckHookActive = false; } /// @param hDXGI must be a valid module handle. void hookDXGI(HMODULE hDXGI, bool preonly) { wchar_t modulename[MODULEFILEPATH_BUFLEN]; GetModuleFileNameW(NULL, modulename, ARRAY_NUM_ELEMENTS(modulename)); ods("DXGI: hookDXGI in App '%ls'", modulename); // Add a ref to ourselves; we do NOT want to get unloaded directly from this process. HMODULE hTempSelf = NULL; GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, reinterpret_cast(&hookDXGI), &hTempSelf); bHooked = true; // Can we use the prepatch data? GetModuleFileNameW(hDXGI, modulename, ARRAY_NUM_ELEMENTS(modulename)); if (_wcsicmp(dxgi->wcFileName, modulename) == 0) { // The module seems to match the one we prepared d3dd for. unsigned char *raw = (unsigned char *) hDXGI; HookPresentRaw((voidFunc)(raw + dxgi->offsetPresent)); HookResizeRaw((voidFunc)(raw + dxgi->offsetResize)); } else if (! preonly) { ods("DXGI: Interface changed, can't rawpatch. Current: %ls ; Previously: %ls", modulename, dxgi->wcFileName); } else { bHooked = false; } } // From d3d10.cpp extern void PrepareDXGI10(IDXGIAdapter1 *pAdapter, bool initializeDXGIData); // From d3d11.cpp extern void PrepareDXGI11(IDXGIAdapter1* pAdapter, bool initializeDXGIData); /// This function is called by the Mumble client in Mumble's scope /// mainly to extract the offsets of various functions in the IDXGISwapChain /// and IDXGIObject interfaces that need to be hooked in target /// applications. The data is stored in the dxgi shared memory structure. extern "C" __declspec(dllexport) void __cdecl PrepareDXGI() { if (! dxgi) return; ods("DXGI: Preparing static data for DXGI Injection"); dxgi->wcFileName[0] = 0; dxgi->offsetPresent = 0; dxgi->offsetResize = 0; // Make sure this is Vista or greater as quite a number of <=WinXP users have fake DX10 libs installed OSVERSIONINFOEXW ovi; memset(&ovi, 0, sizeof(ovi)); ovi.dwOSVersionInfoSize = sizeof(ovi); GetVersionExW(reinterpret_cast(&ovi)); if (ovi.dwMajorVersion < 6 || (ovi.dwMajorVersion == 6 && ovi.dwBuildNumber < 6001)) { ods("DXGI: No DXGI pre-Vista - skipping prepare"); return; } HMODULE hDXGI = LoadLibrary("DXGI.DLL"); if (hDXGI != NULL) { GetModuleFileNameW(hDXGI, dxgi->wcFileName, ARRAY_NUM_ELEMENTS(dxgi->wcFileName)); CreateDXGIFactory1Type pCreateDXGIFactory1 = reinterpret_cast(GetProcAddress(hDXGI, "CreateDXGIFactory1")); ods("DXGI: Got CreateDXGIFactory1 at %p", pCreateDXGIFactory1); if (pCreateDXGIFactory1) { IDXGIFactory1 * pFactory; HRESULT hr = pCreateDXGIFactory1(__uuidof(IDXGIFactory1), (void**)(&pFactory)); if (FAILED(hr)) ods("DXGI: Call to pCreateDXGIFactory1 failed!"); if (pFactory) { IDXGIAdapter1 *pAdapter = NULL; pFactory->EnumAdapters1(0, &pAdapter); /// Offsets have to be identified and initialized only once. bool initializeDXGIData = !dxgi->offsetPresent && !dxgi->offsetResize; PrepareDXGI10(pAdapter, initializeDXGIData); initializeDXGIData = !dxgi->offsetPresent && !dxgi->offsetResize; PrepareDXGI11(pAdapter, initializeDXGIData); pFactory->Release(); } else { FreeLibrary(hDXGI); } } else { FreeLibrary(hDXGI); } } else { FreeLibrary(hDXGI); } } mumble-1.3.4/overlay/d3d10.cpp0000664000175000017500000005375514010707273015660 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "lib.h" #include "overlay.hex" #include #include D3D10Data *d3d10 = NULL; static bool bHooked = false; static HardHook hhAddRef; static HardHook hhRelease; typedef HRESULT(__stdcall *CreateDXGIFactoryType)(REFIID, void **); typedef HRESULT(__stdcall *D3D10CreateDeviceAndSwapChainType)(IDXGIAdapter *, D3D10_DRIVER_TYPE, HMODULE, UINT, UINT, DXGI_SWAP_CHAIN_DESC *, IDXGISwapChain **, ID3D10Device **); typedef HRESULT(__stdcall *D3D10CreateStateBlockType)(ID3D10Device *, D3D10_STATE_BLOCK_MASK *, ID3D10StateBlock **); typedef HRESULT(__stdcall *D3D10StateBlockMaskEnableAllType)(D3D10_STATE_BLOCK_MASK *); typedef HRESULT(__stdcall *D3D10CreateEffectFromMemoryType)(void *, SIZE_T, UINT, ID3D10Device *, ID3D10EffectPool *, ID3D10Effect **); typedef ULONG(__stdcall *AddRefType)(ID3D10Device *); typedef ULONG(__stdcall *ReleaseType)(ID3D10Device *); #define HMODREF(mod, func) func##Type p##func = (func##Type) GetProcAddress(mod, #func) struct SimpleVec3 { FLOAT x; FLOAT y; FLOAT z; SimpleVec3(FLOAT _x, FLOAT _y, FLOAT _z) : x(_x), y(_y), z(_z) {} }; struct SimpleVec2 { FLOAT x; FLOAT y; SimpleVec2(FLOAT _x, FLOAT _y) : x(_x), y(_y) {} }; struct SimpleVertex { SimpleVec3 Pos; SimpleVec2 Tex; }; class D10State: protected Pipe { public: ULONG lHighMark; LONG initRefCount; LONG refCount; LONG myRefCount; D3D10_VIEWPORT vp; ID3D10Device *pDevice; IDXGISwapChain *pSwapChain; ID3D10StateBlock *pOrigStateBlock; ID3D10StateBlock *pMyStateBlock; ID3D10RenderTargetView *pRTV; ID3D10Effect *pEffect; ID3D10EffectTechnique *pTechnique; ID3D10EffectShaderResourceVariable * pDiffuseTexture; ID3D10InputLayout *pVertexLayout; ID3D10Buffer *pVertexBuffer; ID3D10Buffer *pIndexBuffer; ID3D10BlendState *pBlendState; ID3D10Texture2D *pTexture; ID3D10ShaderResourceView *pSRView; clock_t timeT; unsigned int frameCount; D10State(IDXGISwapChain *, ID3D10Device *); virtual ~D10State(); bool init(); void draw(); virtual void blit(unsigned int x, unsigned int y, unsigned int w, unsigned int h); virtual void setRect(); virtual void newTexture(unsigned int w, unsigned int h); }; typedef map SwapchainMap; SwapchainMap chains; typedef map DeviceMap; DeviceMap devices; D10State::D10State(IDXGISwapChain *pSwapChain, ID3D10Device *pDevice) { this->pSwapChain = pSwapChain; this->pDevice = pDevice; lHighMark = initRefCount = refCount = myRefCount = 0; ZeroMemory(&vp, sizeof(vp)); pOrigStateBlock = NULL; pMyStateBlock = NULL; pRTV = NULL; pEffect = NULL; pTechnique = NULL; pDiffuseTexture = NULL; pVertexLayout = NULL; pVertexBuffer = NULL; pIndexBuffer = NULL; pBlendState = NULL; pTexture = NULL; pSRView = NULL; timeT = clock(); frameCount = 0; pDevice->AddRef(); initRefCount = pDevice->Release(); } void D10State::blit(unsigned int x, unsigned int y, unsigned int w, unsigned int h) { HRESULT hr; ods("D3D10: Blit %d %d %d %d", x, y, w, h); if (! pTexture || ! pSRView || uiLeft == uiRight) return; D3D10_MAPPED_TEXTURE2D mappedTex; hr = pTexture->Map(D3D10CalcSubresource(0, 0, 1), D3D10_MAP_WRITE_DISCARD, 0, &mappedTex); if (FAILED(hr)) { ods("D3D10: Failed map"); } UCHAR* pTexels = (UCHAR*)mappedTex.pData; for (unsigned int r=0;r< uiHeight; ++r) { unsigned char *sptr = a_ucTexture + r * uiWidth * 4; unsigned char *dptr = reinterpret_cast(pTexels) + r * mappedTex.RowPitch; memcpy(dptr, sptr, uiWidth * 4); } pTexture->Unmap(D3D10CalcSubresource(0, 0, 1)); } void D10State::setRect() { HRESULT hr; ods("D3D10: SetRect"); float w = static_cast(uiWidth); float h = static_cast(uiHeight); float left = static_cast(uiLeft) - 0.5f; float top = static_cast(uiTop) - 0.5f; float right = static_cast(uiRight) + 0.5f; float bottom = static_cast(uiBottom) + 0.5f; float texl = (left) / w; float text = (top) / h; float texr = (right + 1.0f) / w; float texb = (bottom + 1.0f) / h; left = 2.0f * (left / vp.Width) - 1.0f; right = 2.0f * (right / vp.Width) - 1.0f; top = -2.0f * (top / vp.Height) + 1.0f; bottom = -2.0f * (bottom / vp.Height) + 1.0f; ods("D3D10: Vertex (%f %f) (%f %f)", left, top, right, bottom); // Create vertex buffer SimpleVertex vertices[] = { { SimpleVec3(left, top, 0.5f), SimpleVec2(texl, text) }, { SimpleVec3(right, top, 0.5f), SimpleVec2(texr, text) }, { SimpleVec3(right, bottom, 0.5f), SimpleVec2(texr, texb) }, { SimpleVec3(left, bottom, 0.5f), SimpleVec2(texl, texb) }, }; void *pData = NULL; hr = pVertexBuffer->Map(D3D10_MAP_WRITE_DISCARD, 0, &pData); memcpy(pData, vertices, sizeof(vertices)); ods("D3D10: Map %lx %d", hr, sizeof(vertices)); pVertexBuffer->Unmap(); } void D10State::newTexture(unsigned int w, unsigned int h) { HRESULT hr; ods("D3D10: newTexture %d %d", w, h); if (pTexture) { pTexture->Release(); pTexture = NULL; } if (pSRView) { pSRView->Release(); pSRView = NULL; } D3D10_TEXTURE2D_DESC desc; ZeroMemory(&desc, sizeof(desc)); desc.Width = w; desc.Height = h; desc.MipLevels = desc.ArraySize = 1; desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; desc.SampleDesc.Count = 1; desc.Usage = D3D10_USAGE_DYNAMIC; desc.BindFlags = D3D10_BIND_SHADER_RESOURCE; desc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE; hr = pDevice->CreateTexture2D(&desc, NULL, &pTexture); if (FAILED(hr)) { pTexture = NULL; ods("D3D10: Failed to create texture."); return; } D3D10_SHADER_RESOURCE_VIEW_DESC srvDesc; ZeroMemory(&srvDesc, sizeof(srvDesc)); srvDesc.Format = desc.Format; srvDesc.ViewDimension = D3D10_SRV_DIMENSION_TEXTURE2D; srvDesc.Texture2D.MostDetailedMip = 0; srvDesc.Texture2D.MipLevels = desc.MipLevels; hr = pDevice->CreateShaderResourceView(pTexture, &srvDesc, &pSRView); if (FAILED(hr)) { pSRView = NULL; pTexture->Release(); pTexture = NULL; ods("D3D10: Failed to create resource view."); return; } } bool D10State::init() { static HMODREF(GetModuleHandleW(L"D3D10.DLL"), D3D10CreateEffectFromMemory); static HMODREF(GetModuleHandleW(L"D3D10.DLL"), D3D10CreateStateBlock); static HMODREF(GetModuleHandleW(L"D3D10.DLL"), D3D10StateBlockMaskEnableAll); if (pD3D10CreateEffectFromMemory == NULL || pD3D10CreateStateBlock == NULL || pD3D10StateBlockMaskEnableAll == NULL) { ods("D3D10: Could not get handles for all required D3D10 state initialization functions"); return false; } HRESULT hr; D3D10_STATE_BLOCK_MASK StateBlockMask; ZeroMemory(&StateBlockMask, sizeof(StateBlockMask)); hr = pD3D10StateBlockMaskEnableAll(&StateBlockMask); if (FAILED(hr)) { ods("D3D10: D3D10StateBlockMaskEnableAll failed"); return false; } hr = pD3D10CreateStateBlock(pDevice, &StateBlockMask, &pOrigStateBlock); if (FAILED(hr)) { ods("D3D10: D3D10CreateStateBlock for pOrigStateBlock failed"); return false; } hr = pD3D10CreateStateBlock(pDevice, &StateBlockMask, &pMyStateBlock); if (FAILED(hr)) { ods("D3D10: D3D10CreateStateBlock for pMyStateBlock failed"); return false; } hr = pOrigStateBlock->Capture(); if (FAILED(hr)) { ods("D3D10: Failed to store original state block during init"); return false; } ID3D10Texture2D *pBackBuffer = NULL; hr = pSwapChain->GetBuffer(0, __uuidof(*pBackBuffer), (LPVOID*)&pBackBuffer); if (FAILED(hr)) { ods("D3D10: pSwapChain->GetBuffer failure!"); return false; } pDevice->ClearState(); D3D10_TEXTURE2D_DESC backBufferSurfaceDesc; pBackBuffer->GetDesc(&backBufferSurfaceDesc); ZeroMemory(&vp, sizeof(vp)); vp.Width = backBufferSurfaceDesc.Width; vp.Height = backBufferSurfaceDesc.Height; vp.MinDepth = 0; vp.MaxDepth = 1; vp.TopLeftX = 0; vp.TopLeftY = 0; pDevice->RSSetViewports(1, &vp); hr = pDevice->CreateRenderTargetView(pBackBuffer, NULL, &pRTV); if (FAILED(hr)) { ods("D3D10: pDevice->CreateRenderTargetView failed!"); return false; } pDevice->OMSetRenderTargets(1, &pRTV, NULL); // Settings for an "over" operation. // https://en.wikipedia.org/w/index.php?title=Alpha_compositing&oldid=580659153#Description D3D10_BLEND_DESC blend; ZeroMemory(&blend, sizeof(blend)); blend.BlendEnable[0] = TRUE; blend.SrcBlend = D3D10_BLEND_ONE; blend.DestBlend = D3D10_BLEND_INV_SRC_ALPHA; blend.BlendOp = D3D10_BLEND_OP_ADD; blend.SrcBlendAlpha = D3D10_BLEND_ONE; blend.DestBlendAlpha = D3D10_BLEND_INV_SRC_ALPHA; blend.BlendOpAlpha = D3D10_BLEND_OP_ADD; blend.RenderTargetWriteMask[0] = D3D10_COLOR_WRITE_ENABLE_ALL; hr = pDevice->CreateBlendState(&blend, &pBlendState); if (FAILED(hr)) { ods("D3D10: pDevice->CreateBlendState failed!"); return false; } pDevice->OMSetBlendState(pBlendState, NULL, 0xffffffff); hr = pD3D10CreateEffectFromMemory((void *) g_main, sizeof(g_main), 0, pDevice, NULL, &pEffect); if (FAILED(hr)) { ods("D3D10: D3D10CreateEffectFromMemory failed!"); return false; } pTechnique = pEffect->GetTechniqueByName("Render"); if (pTechnique == NULL) { ods("D3D10: Could not get technique for name 'Render'"); return false; } pDiffuseTexture = pEffect->GetVariableByName("txDiffuse")->AsShaderResource(); if (pDiffuseTexture == NULL) { ods("D3D10: Could not get variable by name 'txDiffuse'"); return false; } pTexture = NULL; pSRView = NULL; // Define the input layout D3D10_INPUT_ELEMENT_DESC layout[] = { { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 }, { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 12, D3D10_INPUT_PER_VERTEX_DATA, 0 }, }; UINT numElements = sizeof(layout) / sizeof(layout[0]); // Create the input layout D3D10_PASS_DESC PassDesc; hr = pTechnique->GetPassByIndex(0)->GetDesc(&PassDesc); if (FAILED(hr)) { ods("D3D10: Couldn't get pass description for technique"); return false; } hr = pDevice->CreateInputLayout(layout, numElements, PassDesc.pIAInputSignature, PassDesc.IAInputSignatureSize, &pVertexLayout); if (FAILED(hr)) { ods("D3D10: pDevice->CreateInputLayout failure!"); return false; } pDevice->IASetInputLayout(pVertexLayout); D3D10_BUFFER_DESC bd; ZeroMemory(&bd, sizeof(bd)); bd.Usage = D3D10_USAGE_DYNAMIC; bd.ByteWidth = sizeof(SimpleVertex) * 4; bd.BindFlags = D3D10_BIND_VERTEX_BUFFER; bd.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE; bd.MiscFlags = 0; hr = pDevice->CreateBuffer(&bd, NULL, &pVertexBuffer); if (FAILED(hr)) { ods("D3D10: pDevice->CreateBuffer failure!"); return false; } DWORD indices[] = { 0,1,3, 1,2,3, }; bd.Usage = D3D10_USAGE_DEFAULT; bd.ByteWidth = sizeof(DWORD) * 6; bd.BindFlags = D3D10_BIND_INDEX_BUFFER; bd.CPUAccessFlags = 0; bd.MiscFlags = 0; D3D10_SUBRESOURCE_DATA InitData; ZeroMemory(&InitData, sizeof(InitData)); InitData.pSysMem = indices; hr = pDevice->CreateBuffer(&bd, &InitData, &pIndexBuffer); if (FAILED(hr)) { ods("D3D10: pDevice->CreateBuffer failure!"); return false; } // Set index buffer pDevice->IASetIndexBuffer(pIndexBuffer, DXGI_FORMAT_R32_UINT, 0); // Set primitive topology pDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST); hr = pMyStateBlock->Capture(); if (FAILED(hr)) { ods("D3D10: Failed to capture newly created state block"); return false; } hr = pOrigStateBlock->Apply(); if (FAILED(hr)) { ods("D3D10: Failed to restore original state block during init"); return false; } pBackBuffer->Release(); return true; } D10State::~D10State() { if (pBlendState != NULL) pBlendState->Release(); if (pVertexBuffer != NULL) pVertexBuffer->Release(); if (pIndexBuffer != NULL) pIndexBuffer->Release(); if (pVertexLayout != NULL) pVertexLayout->Release(); if (pEffect != NULL) pEffect->Release(); if (pRTV != NULL) pRTV->Release(); if (pTexture != NULL) pTexture->Release(); if (pSRView != NULL) pSRView->Release(); if (pMyStateBlock) { pMyStateBlock->ReleaseAllDeviceObjects(); pMyStateBlock->Release(); } if (pOrigStateBlock) { pOrigStateBlock->ReleaseAllDeviceObjects(); pOrigStateBlock->Release(); } } void D10State::draw() { clock_t t = clock(); float elapsed = static_cast(t - timeT) / CLOCKS_PER_SEC; ++frameCount; if (elapsed > OVERLAY_FPS_INTERVAL) { OverlayMsg om; om.omh.uiMagic = OVERLAY_MAGIC_NUMBER; om.omh.uiType = OVERLAY_MSGTYPE_FPS; om.omh.iLength = sizeof(OverlayMsgFps); om.omf.fps = frameCount / elapsed; sendMessage(om); frameCount = 0; timeT = t; } checkMessage(vp.Width, vp.Height); if (a_ucTexture && pSRView && (uiLeft != uiRight)) { HRESULT hr; pOrigStateBlock->Capture(); pMyStateBlock->Apply(); D3D10_TECHNIQUE_DESC techDesc; pTechnique->GetDesc(&techDesc); // Set vertex buffer UINT stride = sizeof(SimpleVertex); UINT offset = 0; pDevice->IASetVertexBuffers(0, 1, &pVertexBuffer, &stride, &offset); hr = pDiffuseTexture->SetResource(pSRView); if (FAILED(hr)) ods("D3D10: Failed to set resource"); for (UINT p = 0; p < techDesc.Passes; ++p) { pTechnique->GetPassByIndex(p)->Apply(0); pDevice->DrawIndexed(6, 0, 0); } pOrigStateBlock->Apply(); } } // D3D10 specific logic for the Present function. void presentD3D10(IDXGISwapChain *pSwapChain) { ID3D10Device *pDevice = NULL; HRESULT hr = pSwapChain->GetDevice(__uuidof(ID3D10Device), (void **) &pDevice); if (SUCCEEDED(hr) && pDevice) { SwapchainMap::iterator it = chains.find(pSwapChain); D10State *ds = it != chains.end() ? it->second : NULL; if (ds && ds->pDevice != pDevice) { ods("D3D10: SwapChain device changed"); devices.erase(ds->pDevice); delete ds; ds = NULL; } if (ds == NULL) { ods("D3D10: New state"); ds = new D10State(pSwapChain, pDevice); if (!ds->init()) { pDevice->Release(); delete ds; return; } chains[pSwapChain] = ds; devices[pDevice] = ds; } ds->draw(); pDevice->Release(); } else { #ifdef EXTENDED_OVERLAY_DEBUGOUTPUT // DXGI is used for multiple D3D versions. Thus, it is possible a device // associated with the DXGISwapChain may very well not be a D3D10 one, // in which case we can safely ignore it. ods("D3D10: Could not draw because ID3D10Device could not be retrieved."); #endif } } void resizeD3D10(IDXGISwapChain *pSwapChain) { // Remove the D10State from our "cache" (= Invalidate) SwapchainMap::iterator it = chains.find(pSwapChain); if (it != chains.end()) { D10State *ds = it->second; devices.erase(ds->pDevice); chains.erase(it); delete ds; } } static ULONG __stdcall myAddRef(ID3D10Device *pDevice) { //TODO: Move logic to HardHook. // Call base without active hook in case of no trampoline. AddRefType oAddRef = (AddRefType) hhAddRef.call; hhAddRef.restore(); ULONG res = oAddRef(pDevice); hhAddRef.inject(); Mutex m; DeviceMap::iterator it = devices.find(pDevice); if (it != devices.end()) { it->second->lHighMark = res; } return res; } static ULONG __stdcall myRelease(ID3D10Device *pDevice) { //TODO: Move logic to HardHook. // Call base without active hook in case of no trampoline. ReleaseType oRelease = (ReleaseType) hhRelease.call; hhRelease.restore(); ULONG res = oRelease(pDevice); hhRelease.inject(); Mutex m; DeviceMap::iterator it = devices.find(pDevice); if (it != devices.end()) { D10State *ds = it->second; // If we are receiving a lot of subsequent releases lets eagerly drop // our state object. If the device presents something again a state // object is created again just fine anyway. if (res < ds->lHighMark / 2) { ods("D3D10: Deleting resources %u < 0.5 * %u", res, ds->lHighMark); devices.erase(it); chains.erase(ds->pSwapChain); delete ds; ods("D3D10: Deleted"); ds = NULL; } } return res; } static void HookAddRelease(voidFunc vfAdd, voidFunc vfRelease) { ods("D3D10: Injecting device add/remove"); hhAddRef.setup(vfAdd, reinterpret_cast(myAddRef)); hhRelease.setup(vfRelease, reinterpret_cast(myRelease)); } static void hookD3D10(HMODULE hD3D10, bool preonly); void checkDXGI10Hook(bool preonly) { static bool bCheckHookActive = false; if (bCheckHookActive) { ods("D3D10: Recursion in checkDXGI10Hook"); return; } if (d3d10->offsetAddRef == 0 || d3d10->offsetRelease == 0) { return; } bCheckHookActive = true; HMODULE hD3D10 = GetModuleHandleW(L"D3D10CORE.DLL"); if (hD3D10) { if (! bHooked) { hookD3D10(hD3D10, preonly); } } else { #ifdef EXTENDED_OVERLAY_DEBUGOUTPUT if (hDXGI) { ods("D3D10: No DXGI.DLL found as loaded. No hooking at this point."); } else { ods("D3D10: No D3D10CORE.DLL found as loaded. No hooking at this point."); } #endif } bCheckHookActive = false; } /// @param hD3D10 must be a valid module handle void hookD3D10(HMODULE hD3D10, bool preonly) { // Add a ref to ourselves; we do NOT want to get unloaded directly from this process. HMODULE hTempSelf = NULL; GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, reinterpret_cast(&hookD3D10), &hTempSelf); bHooked = true; wchar_t modulename[MODULEFILEPATH_BUFLEN]; GetModuleFileNameW(hD3D10, modulename, ARRAY_NUM_ELEMENTS(modulename)); if (_wcsicmp(d3d10->wcFileName, modulename) == 0) { unsigned char *raw = (unsigned char *) hD3D10; HookAddRelease((voidFunc)(raw + d3d10->offsetAddRef), (voidFunc)(raw + d3d10->offsetRelease)); } else if (! preonly) { ods("D3D10: Interface changed, can't rawpatch. Current: %ls ; Previously: %ls", modulename, d3d10->wcFileName); } else { bHooked = false; } } /// Prepares DXGI and D3D10 data by trying to determining the module filepath /// and function offsets in memory. /// (This data can later be used for hooking / code injection. /// /// Adjusts the data behind the global variables dxgi and d3d10. void PrepareDXGI10(IDXGIAdapter1 *pAdapter, bool initializeDXGIData) { if (!dxgi || !d3d10 || !pAdapter) return; ods("D3D10: Preparing static data for DXGI and D3D10 Injection"); d3d10->wcFileName[0] = 0; d3d10->offsetAddRef = 0; d3d10->offsetRelease = 0; HMODULE hD3D10 = LoadLibrary("D3D10.DLL"); if (hD3D10 != NULL) { HWND hwnd = CreateWindowW(L"STATIC", L"Mumble DXGI Window", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, 0, NULL, NULL, 0); D3D10CreateDeviceAndSwapChainType pD3D10CreateDeviceAndSwapChain = reinterpret_cast(GetProcAddress(hD3D10, "D3D10CreateDeviceAndSwapChain")); DXGI_SWAP_CHAIN_DESC desc; ZeroMemory(&desc, sizeof(desc)); RECT rcWnd; GetClientRect(hwnd, &rcWnd); desc.BufferDesc.Width = rcWnd.right - rcWnd.left; desc.BufferDesc.Height = rcWnd.bottom - rcWnd.top; ods("D3D10: Got ClientRect W %d H %d", desc.BufferDesc.Width, desc.BufferDesc.Height); desc.BufferDesc.RefreshRate.Numerator = 60; desc.BufferDesc.RefreshRate.Denominator = 1; desc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; desc.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED; desc.BufferDesc.Scaling = DXGI_MODE_SCALING_CENTERED; desc.SampleDesc.Count = 1; desc.SampleDesc.Quality = 0; desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; desc.BufferCount = 2; desc.OutputWindow = hwnd; desc.Windowed = true; desc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; IDXGISwapChain *pSwapChain = NULL; ID3D10Device *pDevice = NULL; HRESULT hr = pD3D10CreateDeviceAndSwapChain(pAdapter, D3D10_DRIVER_TYPE_HARDWARE, NULL, 0, D3D10_SDK_VERSION, &desc, &pSwapChain, &pDevice); if (FAILED(hr)) ods("D3D10: pD3D10CreateDeviceAndSwapChain failure!"); if (pDevice && pSwapChain) { // For VC++ the vtable is located at the base addr. of the object and each function entry is a single pointer. Since p.e. the base classes // of IDXGISwapChain have a total of 8 functions the 8+Xth entry points to the Xth added function in the derived interface. void ***vtbl = (void ***) pSwapChain; void *pPresent = (*vtbl)[8]; boost::optional offset = GetFnOffsetInModule(reinterpret_cast(pPresent), dxgi->wcFileName, ARRAY_NUM_ELEMENTS(dxgi->wcFileName), "D3D10", "Present"); if (offset) { if (initializeDXGIData) { dxgi->offsetPresent = *offset; ods("D3D10: Successfully found Present offset: %ls: %d", dxgi->wcFileName, dxgi->offsetPresent); } else { if (dxgi->offsetPresent == *offset) { ods("D3D10: Successfully verified Present offset: %ls: %d", dxgi->wcFileName, dxgi->offsetPresent); } else { ods("D3D10: Failed to verify Present offset for %ls. Found %d, but previously found %d.", dxgi->wcFileName, offset, dxgi->offsetPresent); } } } void *pResize = (*vtbl)[13]; offset = GetFnOffsetInModule(reinterpret_cast(pResize), dxgi->wcFileName, ARRAY_NUM_ELEMENTS(dxgi->wcFileName), "D3D10", "ResizeBuffers"); if (offset) { if (initializeDXGIData) { dxgi->offsetResize = *offset; ods("D3D10: Successfully found ResizeBuffers offset: %ls: %d", dxgi->wcFileName, dxgi->offsetResize); } else { if (dxgi->offsetResize == *offset) { ods("D3D10: Successfully verified ResizeBuffers offset: %ls: %d", dxgi->wcFileName, dxgi->offsetResize); } else { ods("D3D10: Failed to verify ResizeBuffers offset for %ls. Found %d, but previously found %d.", dxgi->wcFileName, offset, dxgi->offsetResize); } } } vtbl = (void ***) pDevice; void *pAddRef = (*vtbl)[1]; offset = GetFnOffsetInModule(reinterpret_cast(pAddRef), d3d10->wcFileName, ARRAY_NUM_ELEMENTS(d3d10->wcFileName), "D3D10", "AddRef"); if (offset) { d3d10->offsetAddRef = *offset; ods("D3D10: Successfully found AddRef offset: %ls: %d", d3d10->wcFileName, d3d10->offsetAddRef); } void *pRelease = (*vtbl)[2]; offset = GetFnOffsetInModule(reinterpret_cast(pRelease), d3d10->wcFileName, ARRAY_NUM_ELEMENTS(d3d10->wcFileName), "D3D10", "Release"); if (offset) { d3d10->offsetRelease = *offset; ods("D3D10: Successfully found Release offset: %ls: %d", d3d10->wcFileName, d3d10->offsetRelease); } } if (pDevice) pDevice->Release(); if (pSwapChain) pSwapChain->Release(); DestroyWindow(hwnd); } else { FreeLibrary(hD3D10); } } mumble-1.3.4/overlay/overlay_exe/0000775000175000017500000000000014010707273016644 5ustar builderbuildermumble-1.3.4/overlay/overlay_exe/overlay_exe.rc0000664000175000017500000000242714010707273021521 0ustar builderbuilder// Copyright 2005-2021 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include #ifndef DEBUG #define VER_DEBUG 0L #else #define VER_DEBUG VS_FF_DEBUG #endif #ifdef SNAPSHOT_BUILD #define VER_RELEASE VS_FF_SPECIALBUILD|VS_FF_PRERELEASE #else #define VER_RELEASE 0L #endif VS_VERSION_INFO VERSIONINFO FILEVERSION 1,3,4,0 PRODUCTVERSION 1,3,4,0 FILEFLAGSMASK VS_FFI_FILEFLAGSMASK FILEFLAGS (VER_DEBUG|VER_RELEASE) FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_APP FILESUBTYPE 0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904E4" BEGIN VALUE "CompanyName", "The Mumble Developers" VALUE "FileDescription", "Mumble - Low-latency VoIP client" VALUE "FileVersion", "1.3.4" VALUE "ProductVersion", "1.3.4" VALUE "LegalCopyright", "Copyright (c) 2005-2021 The Mumble Developers" VALUE "OriginalFilename", "mumble_ol_helper.exe" VALUE "ProductName", "Mumble" #ifdef SNAPSHOT_BUILD VALUE "SpecialBuild", "Snapshot development release" #endif END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1252 END END mumble-1.3.4/overlay/overlay_exe/overlay_exe.h0000664000175000017500000000746014010707273021346 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_OVERLAY_EXE_H_ #define MUMBLE_OVERLAY_EXE_H_ #if defined(_M_IX86) const wchar_t *MUMBLE_OVERLAY_DLL_NAME = L"mumble_ol.dll"; #elif defined (_M_X64) const wchar_t *MUMBLE_OVERLAY_DLL_NAME = L"mumble_ol_x64.dll"; #endif /// OverlayHelperError represents exit codes returned by the /// overlay helper process (mumble_ol_helper.exe) on Windows. enum OverlayHelperError { /// The overlay helper process was not passed any /// arguments. OVERLAY_HELPER_ERROR_EXE_NO_ARGUMENTS = 0x0F000001, /// The magic number on the command line of the overlay /// helper process could not be converted to an integer. OVERLAY_HELPER_ERROR_EXE_INVALID_MAGIC_ARGUMENT = 0x0F000002, /// The magic number on the command line of the overlay /// helper did not match the built-in magic number of /// the helper process. OVERLAY_HELPER_ERROR_EXE_MAGIC_MISMATCH = 0x0F000003, /// The overlay helper process was unable to configure /// its environment in preparation of loading the /// overlay DLL. OVERLAY_HELPER_ERROR_EXE_CONFIGURE_ENVIRONMENT = 0x0F000004, /// The overlay helper process was unable to get the /// path to the overlay DLL. OVERLAY_HELPER_ERROR_EXE_GET_DLL_PATH = 0x0F000005, /// The overlay helper process was unable to load the /// overlay DLL. OVERLAY_HELPER_ERROR_EXE_LOAD_DLL = 0x0F000006, /// The overlay helper process was uanble to look up /// the 'OverlayHelperProcessMain' entry point in the /// overlay DLL. OVERLAY_HELPER_ERROR_EXE_LOOKUP_ENTRY_POINT = 0x0F000007, /// The overlay helper process was uanble to parse /// the commandline arguments it was passed. /// The helper process exepcts two arguments, and this /// error occurs if it only finds one. OVERLAY_HELPER_ERROR_TOO_FEW_ARGUMENTS = 0x0F000008, /// The magic number on the command line of the overlay /// helper process could not be converted to a HANDLE. OVERLAY_HELPER_ERROR_EXE_INVALID_HANDLE_ARGUMENT = 0x0F000009, /// The magic number passed to the overlay DLL's /// OverlayHelperProcessMain function did not match /// the overlay DLL's built-in magic number. OVERLAY_HELPER_ERROR_DLL_MAGIC_MISMATCH = 0x0FF00000, /// The overlay helper process exited due to an error /// in the Windows message loop. OVERLAY_HELPER_ERROR_DLL_MESSAGE_LOOP = 0x0FF00001, /// The parent death thread could not be created. OVERLAY_HELPER_ERROR_DLL_PDEATH_THREAD_ERROR = 0x0FF00002, /// The helper's WaitForSingleObject call on its parent /// process failed unexpectedly. OVERLAY_HELPER_ERROR_DLL_PDEATH_WAIT_FAIL = 0x0FF00003, }; /// OverlayHelperErrorToString converts an OverlayHelperError value /// to a printable string representation. static inline const char *OverlayHelperErrorToString(OverlayHelperError err) { #define OHE(x) case x: return #x switch (err) { OHE(OVERLAY_HELPER_ERROR_EXE_NO_ARGUMENTS); OHE(OVERLAY_HELPER_ERROR_EXE_INVALID_MAGIC_ARGUMENT); OHE(OVERLAY_HELPER_ERROR_EXE_MAGIC_MISMATCH); OHE(OVERLAY_HELPER_ERROR_EXE_CONFIGURE_ENVIRONMENT); OHE(OVERLAY_HELPER_ERROR_EXE_GET_DLL_PATH); OHE(OVERLAY_HELPER_ERROR_EXE_LOAD_DLL); OHE(OVERLAY_HELPER_ERROR_EXE_LOOKUP_ENTRY_POINT); OHE(OVERLAY_HELPER_ERROR_TOO_FEW_ARGUMENTS); OHE(OVERLAY_HELPER_ERROR_EXE_INVALID_HANDLE_ARGUMENT); OHE(OVERLAY_HELPER_ERROR_DLL_MAGIC_MISMATCH); OHE(OVERLAY_HELPER_ERROR_DLL_MESSAGE_LOOP); OHE(OVERLAY_HELPER_ERROR_DLL_PDEATH_THREAD_ERROR); OHE(OVERLAY_HELPER_ERROR_DLL_PDEATH_WAIT_FAIL); } return NULL; } #endif mumble-1.3.4/overlay/overlay_exe/overlay_exe.pro0000664000175000017500000000052214010707273021707 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . CONFIG += force-x86-toolchain TARGET = mumble_ol_helper include(overlay_exe-shared.pro) mumble-1.3.4/overlay/overlay_exe/overlay_exe-shared.pro0000664000175000017500000000175314010707273023162 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../../qmake/compiler.pri) TEMPLATE = app CONFIG -= qt CONFIG += debug_and_release win32 { DEFINES += WIN32 _WIN32 RC_FILE = overlay_exe.rc LIBS *= -luser32 -lshlwapi -lshell32 CONFIG(release, debug|release) { QMAKE_CXXFLAGS_RELEASE -= -MD QMAKE_CXXFLAGS += -MT } CONFIG(debug, debug|release) { QMAKE_CXXFLAGS_DEBUG -= -MDd QMAKE_CXXFLAGS += -MTd } } SOURCES *= overlay_exe.cpp QMAKE_POST_LINK = $$QMAKE_POST_LINK$$escape_expand(\\n\\t)$$quote(mt.exe -nologo -updateresource:$(DESTDIR_TARGET);1 -manifest ../../src/mumble/mumble.appcompat.manifest) CONFIG(debug, debug|release) { CONFIG += console DEFINES *= DEBUG } CONFIG(release, debug|release) { DEFINES *= NDEBUG } include(../../qmake/symbols.pri) mumble-1.3.4/overlay/overlay_exe/overlay_exe.cpp0000664000175000017500000001274214010707273021700 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include #include #include #include #include #include #include "../overlay.h" #include "overlay_exe.h" #define UNUSED(x) ((void)x) typedef int (*OverlayHelperProcessMain)(unsigned int magic, HANDLE parent); // Signal to the overlay DLL that it should not inject // into this process. extern "C" __declspec(dllexport) void mumbleSelfDetection() {}; // Alert shows a fatal error dialog and waits for the user to click OK. static void Alert(LPCWSTR title, LPCWSTR msg) { MessageBox(NULL, msg, title, MB_OK|MB_ICONERROR); } // GetExecutableDirPath returns the directory that // mumble_ol_helper.exe resides in. static std::wstring GetExecutableDirPath() { wchar_t path[MAX_PATH]; if (GetModuleFileNameW(NULL, path, MAX_PATH) == 0) return std::wstring(); if (!PathRemoveFileSpecW(path)) return std::wstring(); std::wstring exePath(path); return exePath.append(L"\\"); } // ConfigureEnvironment prepares mumble_ol_helper.exe's environment to // run mumble_ol.dll's OverlayHelperProcessMain() function. static bool ConfigureEnvironment() { std::wstring exePath = GetExecutableDirPath(); // Remove the current directory from the DLL search path. if (!SetDllDirectoryW(L"")) return false; // Set mumble_ol_helper.exe's directory as the current working directory. if (!SetCurrentDirectoryW(exePath.c_str())) return false; return true; } // GetAbsoluteMumbleOverlayDllPath returns the absolute path to // mumble_ol.dll - the DLL containing the Mumble overlay code. static std::wstring GetAbsoluteMumbleOverlayDllPath() { std::wstring exePath = GetExecutableDirPath(); if (exePath.empty()) return std::wstring(); std::wstring absDLLPath(exePath); absDLLPath.append(L"\\"); absDLLPath.append(MUMBLE_OVERLAY_DLL_NAME); return absDLLPath; } // GetCommandLineArgs returns the command line arguments // passed to the process. // If the returned vector has a length of 0, an unknown // error occurred. static std::vector GetCommandLineArgs() { std::vector args; LPWSTR cmdLine = GetCommandLine(); if (cmdLine == NULL) { return args; } int argc = 0; LPWSTR *argv = CommandLineToArgvW(cmdLine, &argc); if (argv == NULL) { return args; } for (int i = 0; i < argc; i++) { args.push_back(std::wstring(argv[i])); } return args; } int main(int argc, char **argv) { UNUSED(argc); UNUSED(argv); // Mumble passes the OVERLAY_MAGIC_NUMBER it was built // with the first argument to this helper process. // // This is done for two reasons. // // The first reason is that we need to ensure // compatibility between Mumble, the overlay helper, // and the overlay itself. // // The second reason is that it is an easy way to catch // users accidentally double-clicking on the overlay // helper's EXE file. We can detect these non-Mumble // initiated launches by checking if we were passed any // arguments at all. If no parameters are passed, we // display a nice alert dialog directing users to // 'mumble.exe' instead. unsigned int magic = 0; HANDLE parent = 0; { std::vector args = GetCommandLineArgs(); // If there is only a single argument, it's the program name. // That probably means that a user has double-clicked // the executable. Tell them to run 'mumble.exe' instead. // // This also handles the case where GetCommandLineArgs returns // an empty vector (the error case). if (args.size() <= 1) { Alert(L"Mumble Overlay", L"This program is not meant to be run by itself. Run 'mumble.exe' instead."); return OVERLAY_HELPER_ERROR_EXE_NO_ARGUMENTS; } // The Mumble process passes the overlay magic number, // and a HANDLE in numeric form as its only two arguments. // We must have both of them to continue. if (args.size() < 3) { return OVERLAY_HELPER_ERROR_TOO_FEW_ARGUMENTS; } std::wstring magicNumberStr = args[1]; std::wstring handleStr = args[2]; try { unsigned long passedInMagic = std::stoul(magicNumberStr); magic = static_cast(passedInMagic); } catch (std::exception &) { return OVERLAY_HELPER_ERROR_EXE_INVALID_MAGIC_ARGUMENT; } try { unsigned long long passedInHandle = std::stoull(handleStr); parent = reinterpret_cast(passedInHandle & 0xFFFFFFFFULL); } catch(std::exception &) { return OVERLAY_HELPER_ERROR_EXE_INVALID_HANDLE_ARGUMENT; } } if (magic != OVERLAY_MAGIC_NUMBER) { return OVERLAY_HELPER_ERROR_EXE_MAGIC_MISMATCH; } if (!ConfigureEnvironment()) { return OVERLAY_HELPER_ERROR_EXE_CONFIGURE_ENVIRONMENT; } std::wstring absDLLPath = GetAbsoluteMumbleOverlayDllPath(); if (absDLLPath.empty()) { return OVERLAY_HELPER_ERROR_EXE_GET_DLL_PATH; } HMODULE dll = LoadLibraryExW(absDLLPath.c_str(), NULL, LOAD_WITH_ALTERED_SEARCH_PATH); if (!dll) { return OVERLAY_HELPER_ERROR_EXE_LOAD_DLL; } OverlayHelperProcessMain entryPoint = reinterpret_cast(GetProcAddress(dll, "OverlayHelperProcessMain")); if (!entryPoint) { return OVERLAY_HELPER_ERROR_EXE_LOOKUP_ENTRY_POINT; } return entryPoint(magic, parent); } int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE prevInstance, wchar_t *cmdArg, int cmdShow) { UNUSED(instance); UNUSED(prevInstance); UNUSED(cmdArg); UNUSED(cmdShow); return main(0, NULL); } mumble-1.3.4/overlay/overlay.fx0000664000175000017500000000172114010707273016343 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . Texture2D txDiffuse; SamplerState samLinear { Filter = MIN_MAG_MIP_LINEAR; AddressU = Wrap; AddressV = Wrap; }; struct VS_INPUT { float4 Pos : POSITION; float2 Tex : TEXCOORD; }; struct PS_INPUT { float4 Pos : SV_POSITION; float2 Tex : TEXCOORD0; }; PS_INPUT VS( VS_INPUT input ) { PS_INPUT output = (PS_INPUT)0; output.Pos = input.Pos; output.Tex = input.Tex; return output; } float4 PS( PS_INPUT input ) : SV_Target { return txDiffuse.Sample(samLinear, input.Tex).bgra; } technique10 Render { pass P0 { SetVertexShader( CompileShader( vs_4_0, VS() ) ); SetGeometryShader( NULL ); SetPixelShader( CompileShader( ps_4_0, PS() ) ); } } mumble-1.3.4/overlay/ods.h0000664000175000017500000000065514010707273015266 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_ODS_H_ #define MUMBLE_ODS_H_ #include void __cdecl _ods_out(const char *format, va_list *args); void __cdecl fods(const char *format, ...); #endif mumble-1.3.4/overlay/d3d9.cpp0000664000175000017500000010250214010707273015571 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "lib.h" #include #include Direct3D9Data *d3dd = NULL; typedef IDirect3D9* (WINAPI *pDirect3DCreate9)(UINT SDKVersion) ; typedef HRESULT (WINAPI *pDirect3DCreate9Ex)(UINT SDKVersion, IDirect3D9Ex **ppD3D) ; template class Stash { public: Stash(T *variable, T newValue) : var(variable) , value(*var) { *variable = newValue; } ~Stash() { *var = value; } private: T *var; T value; }; struct D3DTLVERTEX { float x, y, z, rhw; // Position float tu, tv; // Texture coordinates }; static const DWORD D3DFVF_TLVERTEX = D3DFVF_XYZRHW | D3DFVF_TEX1; class DevState : public Pipe { public: IDirect3DDevice9 *dev; IDirect3DStateBlock9 *pSB; /// Non-Win8: Initial ref count, directly after device creation. /// Win8: Unused LONG initRefCount; LONG refCount; /// Refcount of self (library). Used to make the overlay transparent /// (invisible) to the outside. LONG myRefCount; DWORD dwMyThread; D3DTLVERTEX vertices[4]; LPDIRECT3DTEXTURE9 texTexture; clock_t timeT; unsigned int frameCount; DevState(); void createCleanState(); void releaseData(); void releaseAll(); void draw(); virtual void blit(unsigned int x, unsigned int y, unsigned int w, unsigned int h); virtual void setRect(); virtual void newTexture(unsigned int width, unsigned int height); }; /// Vtable offset; see d3d9.h of win-/D3D-API. /// 3 from IUnknown + 14 in IDirect3D9, 0-based => 16 static const int VTABLE_OFFSET_ID3D_CREATEDEVICE = 16; /// Vtable offset; see d3d9.h of win-/D3D-API. /// Offset: 3 from IUnknown + 14 from IDirect3D9 + 4 in IDirect3D9Ex, 0-based => 20 static const int VTABLE_OFFSET_ID3D_CREATEDEVICE_EX = 20; typedef map DevMapType; static DevMapType devMap; static bool bHooked = false; DevState::DevState() { dev = NULL; pSB = NULL; dwMyThread = 0; initRefCount = 0; refCount = 0; myRefCount = 0; texTexture = NULL; timeT = clock(); frameCount = 0; for (int i = 0; i < 4; ++i) { vertices[i].x = vertices[i].y = 0.0f; vertices[i].tu = vertices[i].tv = 0.0f; vertices[i].z = vertices[i].rhw = 1.0f; } } void DevState::releaseData() { ods("D3D9: Release Data"); if (texTexture) { texTexture->Release(); texTexture = NULL; } } void DevState::blit(unsigned int x, unsigned int y, unsigned int w, unsigned int h) { // Blit is called often. Thus, we do not want to always log here. #ifdef EXTENDED_OVERLAY_DEBUGOUTPUT ods("D3D9: Blit %d %d %d %d", x, y, w, h); #endif if (! texTexture || !a_ucTexture || uiLeft == uiRight) return; D3DLOCKED_RECT lr; if ((x == 0) && (y == 0) && (w == uiWidth) && (h == uiHeight)) { if (texTexture->LockRect(0, &lr, NULL, D3DLOCK_DISCARD) != D3D_OK) return; } else { RECT r; r.left = x; r.top = y; r.right = x + w; r.bottom = y + h; if (texTexture->LockRect(0, &lr, &r, 0) != D3D_OK) return; } for (unsigned int r=0;r < h;++r) { unsigned char *dptr = reinterpret_cast(lr.pBits) + r * lr.Pitch; unsigned char *sptr = a_ucTexture + 4 * ((y + r) * uiWidth + x); memcpy(dptr, sptr, w * 4); } texTexture->UnlockRect(0); } void DevState::setRect() { ods("D3D9: New subrect"); float w = static_cast(uiWidth); float h = static_cast(uiHeight); float left = static_cast(uiLeft) - 0.5f; float top = static_cast(uiTop) - 0.5f; float right = static_cast(uiRight) + 0.5f; float bottom = static_cast(uiBottom) + 0.5f; float texl = (left) / w; float text = (top) / h; float texr = (right + 1.0f) / w; float texb = (bottom + 1.0f) / h; vertices[0].x = left; vertices[0].y = top; vertices[0].tu = texl; vertices[0].tv = text; vertices[1].x = right; vertices[1].y = top; vertices[1].tu = texr; vertices[1].tv = text; vertices[2].x = right; vertices[2].y = bottom; vertices[2].tu = texr; vertices[2].tv = texb; vertices[3].x = left; vertices[3].y = bottom; vertices[3].tu = texl; vertices[3].tv = texb; } void DevState::newTexture(unsigned int width, unsigned int height) { ods("D3D9: New texture %d x %d", width, height); if (texTexture) { texTexture->Release(); texTexture = NULL; } dev->CreateTexture(uiWidth, uiHeight, 1, D3DUSAGE_DYNAMIC, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &texTexture, NULL); for (int i = 0; i < 4; ++i) { vertices[i].x = vertices[i].y = vertices[i].z = 0.0f; vertices[i].tu = vertices[i].tv = 0.0f; vertices[i].rhw = 1.0f; } } void DevState::releaseAll() { ods("D3D9: Release All"); releaseData(); if (pSB) pSB->Release(); pSB = NULL; } void DevState::draw() { clock_t t = clock(); float elapsed = static_cast(t - timeT) / CLOCKS_PER_SEC; ++frameCount; if (elapsed > OVERLAY_FPS_INTERVAL) { OverlayMsg om; om.omh.uiMagic = OVERLAY_MAGIC_NUMBER; om.omh.uiType = OVERLAY_MSGTYPE_FPS; om.omh.iLength = sizeof(OverlayMsgFps); om.omf.fps = frameCount / elapsed; sendMessage(om); frameCount = 0; timeT = t; } D3DVIEWPORT9 vp; dev->GetViewport(&vp); checkMessage(vp.Width, vp.Height); if (! a_ucTexture || (uiLeft == uiRight)) return; if (! texTexture) { unsigned int l, r, t, b; l = uiLeft; r = uiRight; t = uiTop; b = uiBottom; newTexture(uiWidth, uiHeight); blit(0, 0, uiWidth, uiHeight); uiLeft = l; uiRight = r; uiTop = t; uiBottom = b; setRect(); } dev->SetTexture(0, texTexture); dev->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, vertices, sizeof(D3DTLVERTEX)); } void DevState::createCleanState() { if (dwMyThread != 0) { ods("D3D9: CreateCleanState from other thread."); } Stash stashThread(&dwMyThread, GetCurrentThreadId()); if (pSB) pSB->Release(); pSB = NULL; IDirect3DStateBlock9* pStateBlock = NULL; dev->CreateStateBlock(D3DSBT_ALL, &pStateBlock); if (! pStateBlock) return; pStateBlock->Capture(); dev->CreateStateBlock(D3DSBT_ALL, &pSB); if (! pSB) { pStateBlock->Release(); return; } D3DVIEWPORT9 vp; dev->GetViewport(&vp); dev->SetVertexShader(NULL); dev->SetPixelShader(NULL); dev->SetFVF(D3DFVF_TLVERTEX); dev->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); dev->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD); dev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); // 0x16 dev->SetRenderState(D3DRS_WRAP0, FALSE); // 0x80 dev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); dev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); dev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); dev->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE); dev->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATER); dev->SetRenderState(D3DRS_ZENABLE, FALSE); dev->SetRenderState(D3DRS_ZWRITEENABLE, FALSE); dev->SetRenderState(D3DRS_ZFUNC, D3DCMP_ALWAYS); dev->SetRenderState(D3DRS_COLORVERTEX, FALSE); dev->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); dev->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); dev->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE); dev->SetRenderState(D3DRS_LIGHTING, FALSE); pSB->Capture(); pStateBlock->Apply(); pStateBlock->Release(); } static HardHook hhCreateDevice; static HardHook hhCreateDeviceEx; static HardHook hhReset; static HardHook hhResetEx; static HardHook hhAddRef; static HardHook hhRelease; static HardHook hhPresent; static HardHook hhPresentEx; static HardHook hhSwapPresent; /// Present the overlay. /// /// If called via IDirect3DDevice9::present() or IDirect3DDevice9Ex::present(), /// idd will be non-NULL and ids ill be NULL. /// /// If called via IDirect3DSwapChain9::present(), both idd and ids will be /// non-NULL. /// /// The doPresent function expects the following assumptions to be valid: /// /// - Only one swap chain used at the same time. /// - Windowed? IDirect3D9SwapChain::present() is used. ("Additional swap chain" is used) /// - Full screen? IDirect3D9Device::present() is used. (Implicit swap chain for IDirect3D9Device is used) /// /// It's either/or. /// /// If doPresent is called multiple times per frame (say, for different swap chains), /// the overlay will break badly when DevState::draw() is called. FPS counting will be off, /// different render targets with different sizes will cause a size-renegotiation with Mumble /// every frame, etc. static void doPresent(IDirect3DDevice9 *idd, IDirect3DSwapChain9 *ids) { DevMapType::iterator it = devMap.find(idd); DevState *ds = it != devMap.end() ? it->second : NULL; HRESULT hres; if (ds && ds->pSB) { if (ds->dwMyThread != 0) { ods("D3D9: doPresent from other thread"); } Stash stashThread(&(ds->dwMyThread), GetCurrentThreadId()); // Get the back buffer. // If we're called via IDirect3DSwapChain9, acquire it via the swap chain object. // Otherwise, acquire it via the device itself. IDirect3DSurface9 *pTarget = NULL; if (ids) { hres = ids->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &pTarget); if (FAILED(hres)) { if (hres == D3DERR_INVALIDCALL) { ods("D3D9: IDirect3DSwapChain9::GetBackBuffer failed. BackBuffer index equals or exceeds the total number of back buffers"); } else { ods("D3D9: IDirect3DSwapChain9::GetBackBuffer failed"); } } } else { hres = idd->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pTarget); if (FAILED(hres)) { if (hres == D3DERR_INVALIDCALL) { ods("D3D9: IDirect3DDevice9::GetBackBuffer failed. BackBuffer index equals or exceeds the total number of back buffers"); } else { ods("D3D9: IDirect3DDevice9::GetBackBuffer failed"); } } } IDirect3DSurface9 *pRenderTarget = NULL; hres = idd->GetRenderTarget(0, &pRenderTarget); if (FAILED(hres)) { if (hres == D3DERR_NOTFOUND) { ods("D3D9: IDirect3DDevice9::GetRenderTarget failed. There is no render target with the specified index"); } else if (hres == D3DERR_INVALIDCALL) { ods("D3D9: IDirect3DDevice9::GetRenderTarget failed. One of the passed arguments was invalid"); } else { ods("D3D9: IDirect3DDevice9::GetRenderTarget failed"); } } // Present is called for each frame. Thus, we do not want to always log here. #ifdef EXTENDED_OVERLAY_DEBUGOUTPUT ods("D3D9: doPresent BackB %p RenderT %p", pTarget, pRenderTarget); #endif IDirect3DStateBlock9* pStateBlock = NULL; idd->CreateStateBlock(D3DSBT_ALL, &pStateBlock); pStateBlock->Capture(); ds->pSB->Apply(); if (pTarget != pRenderTarget) { hres = idd->SetRenderTarget(0, pTarget); if (FAILED(hres)) { ods("D3D9: IDirect3DDevice9::SetRenderTarget failed"); } } // If we're called via IDirect3DSwapChain9::present(), we have to // get the size of the back buffer and manually set the viewport size // to match it. // // Although the call to IDirect3DDevice9::SetRenderTarget() above is // documented as updating the device's viewport: // // "Setting a new render target will cause the viewport (see Viewports // and Clipping (Direct3D 9)) to be set to the full size of the new // render target." // // (via https://msdn.microsoft.com/en-us/library/windows/desktop/bb174455(v=vs.85).aspx) // // ...this doesn't happen. At least for some programs such as Final Fantasy XIV // and Battle.net Launcher. For these programs, we get a viewport of 1x1. // // The viewport we set here is used in the call below to DevState::draw() // as the full size of the screen/window. if (ids) { D3DPRESENT_PARAMETERS pp; hres = ids->GetPresentParameters(&pp); if (FAILED(hres)) { ods("D3D9: IDirect3DSwapChain9::GetPresentParameters failed"); } else { if (pp.BackBufferWidth != 0 && pp.BackBufferHeight != 0) { D3DVIEWPORT9 vp; vp.X = 0; vp.Y = 0; vp.Width = pp.BackBufferWidth; vp.Height = pp.BackBufferHeight; vp.MinZ = 0.0f; vp.MaxZ = 1.0f; idd->SetViewport(&vp); } } } idd->BeginScene(); ds->draw(); idd->EndScene(); pStateBlock->Apply(); pStateBlock->Release(); pRenderTarget->Release(); pTarget->Release(); // ods("D3D9: Finished ref is %d %d", ds->myRefCount, ds->refCount); } } typedef HRESULT(__stdcall *SwapPresentType)(IDirect3DSwapChain9 *, CONST RECT *, CONST RECT *, HWND, CONST RGNDATA *, DWORD); static HRESULT __stdcall mySwapPresent(IDirect3DSwapChain9 *ids, CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride, CONST RGNDATA *pDirtyRegion, DWORD dwFlags) { // Present is called for each frame. Thus, we do not want to always log here. #ifdef EXTENDED_OVERLAY_DEBUGOUTPUT ods("D3D9: SwapChain Present"); #endif IDirect3DDevice9 *idd = NULL; ids->GetDevice(&idd); if (idd) { doPresent(idd, ids); idd->Release(); } //TODO: Move logic to HardHook. // Call base without active hook in case of no trampoline. SwapPresentType oSwapPresent = (SwapPresentType) hhSwapPresent.call; hhSwapPresent.restore(); HRESULT hr = oSwapPresent(ids, pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion, dwFlags); hhSwapPresent.inject(); return hr; } typedef HRESULT(__stdcall *PresentType)(IDirect3DDevice9 *, CONST RECT *, CONST RECT *, HWND, CONST RGNDATA *); static HRESULT __stdcall myPresent(IDirect3DDevice9 *idd, CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride,CONST RGNDATA *pDirtyRegion) { // Present is called for each frame. Thus, we do not want to always log here. #ifdef EXTENDED_OVERLAY_DEBUGOUTPUT ods("D3D9: Device Present"); #endif doPresent(idd, NULL); //TODO: Move logic to HardHook. // Call base without active hook in case of no trampoline. PresentType oPresent = (PresentType) hhPresent.call; hhPresent.restore(); HRESULT hr = oPresent(idd, pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion); hhPresent.inject(); return hr; } typedef HRESULT(__stdcall *PresentExType)(IDirect3DDevice9Ex *, CONST RECT *, CONST RECT *, HWND, CONST RGNDATA *, DWORD); static HRESULT __stdcall myPresentEx(IDirect3DDevice9Ex *idd, CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride, CONST RGNDATA *pDirtyRegion, DWORD dwFlags) { // Present is called for each frame. Thus, we do not want to always log here. #ifdef EXTENDED_OVERLAY_DEBUGOUTPUT ods("D3D9: Device Present Ex"); #endif doPresent(idd, NULL); PresentExType oPresentEx = (PresentExType) hhPresentEx.call; hhPresentEx.restore(); HRESULT hr = oPresentEx(idd, pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion, dwFlags); hhPresentEx.inject(); return hr; } typedef HRESULT(__stdcall *ResetType)(IDirect3DDevice9 *, D3DPRESENT_PARAMETERS *); static HRESULT __stdcall myReset(IDirect3DDevice9 *idd, D3DPRESENT_PARAMETERS *param) { ods("D3D9: Chaining Reset"); DevMapType::iterator it = devMap.find(idd); DevState *ds = it != devMap.end() ? it->second : NULL; if (ds) { if (ds->dwMyThread != 0) { ods("D3D9: myReset from other thread"); } Stash stashThread(&(ds->dwMyThread), GetCurrentThreadId()); ds->releaseAll(); } //TODO: Move logic to HardHook. // Call base without active hook in case of no trampoline. ResetType oReset = (ResetType) hhReset.call; hhReset.restore(); HRESULT hr = oReset(idd, param); hhReset.inject(); if (ds) ds->createCleanState(); return hr; } typedef HRESULT(__stdcall *ResetExType)(IDirect3DDevice9Ex *, D3DPRESENT_PARAMETERS *, D3DDISPLAYMODEEX *); static HRESULT __stdcall myResetEx(IDirect3DDevice9Ex *idd, D3DPRESENT_PARAMETERS *param, D3DDISPLAYMODEEX *param2) { ods("D3D9: Chaining ResetEx"); DevMapType::iterator it = devMap.find(idd); DevState *ds = it != devMap.end() ? it->second : NULL; if (ds) { if (ds->dwMyThread) { ods("D3D9: myResetEx from other thread"); } Stash stashThread(&(ds->dwMyThread), GetCurrentThreadId()); ds->releaseAll(); } //TODO: Move logic to HardHook. // Call base without active hook in case of no trampoline. ResetExType oResetEx = (ResetExType) hhResetEx.call; hhResetEx.restore(); HRESULT hr = oResetEx(idd, param, param2); hhResetEx.inject(); if (ds) ds->createCleanState(); return hr; } typedef ULONG(__stdcall *AddRefType)(IDirect3DDevice9 *); static ULONG __stdcall myAddRef(IDirect3DDevice9 *idd) { Mutex m; DevMapType::iterator it = devMap.find(idd); DevState *ds = it != devMap.end() ? it->second : NULL; if (ds) { // AddRef is called very often. Thus, we do not want to always log here. #ifdef EXTENDED_OVERLAY_DEBUGOUTPUT ods("D3D9: Using own Refcount implementation for call to AddRef."); #endif if (ds->dwMyThread == GetCurrentThreadId()) { ds->myRefCount++; } else { ds->refCount++; } return ds->initRefCount + ds->refCount; } //TODO: Move logic to HardHook. // Call base without active hook in case of no trampoline. AddRefType oAddRef = (AddRefType) hhAddRef.call; hhAddRef.restore(); ULONG res = oAddRef(idd); hhAddRef.inject(); // AddRef is called very often. Thus, we do not want to always log here. #ifdef EXTENDED_OVERLAY_DEBUGOUTPUT ods("D3D9: Chained AddRef with result %d", res); #endif return res; } static ULONG __stdcall myWin8AddRef(IDirect3DDevice9 *idd) { Mutex m; DevMapType::iterator it = devMap.find(idd); DevState *ds = it != devMap.end() ? it->second : NULL; if (ds && ds->dwMyThread == GetCurrentThreadId()) { // AddRef is called very often. Thus, we do not want to always log here. #ifdef EXTENDED_OVERLAY_DEBUGOUTPUT ods("D3D9: Using own Refcount implementation for call to AddRef (Win8)."); #endif ds->myRefCount++; return ds->refCount; } //TODO: Move logic to HardHook. // Call base without active hook in case of no trampoline. AddRefType oAddRef = (AddRefType) hhAddRef.call; hhAddRef.restore(); ULONG res = oAddRef(idd); hhAddRef.inject(); if (ds) ds->refCount = res; // AddRef is called very often. Thus, we do not want to always log here. #ifdef EXTENDED_OVERLAY_DEBUGOUTPUT ods("D3D9: Chained AddRef (Win8) with result %d", res); #endif return res; } typedef ULONG(__stdcall *ReleaseType)(IDirect3DDevice9 *); static ULONG __stdcall myRelease(IDirect3DDevice9 *idd) { Mutex m; DevMapType::iterator it = devMap.find(idd); DevState *ds = it != devMap.end() ? it->second : NULL; if (ds) { // Release is called very often. Thus, we do not want to always log here. #ifdef EXTENDED_OVERLAY_DEBUGOUTPUT ods("D3D9: Using own Refcount implementation for call to Release."); #endif if (ds->dwMyThread == GetCurrentThreadId()) { ds->myRefCount--; return ds->initRefCount + ds->refCount; } else { ds->refCount--; } if (ds->refCount <= 1) { ds->disconnect(); } if (ds->refCount >= 0) { return ds->initRefCount + ds->refCount; } ods("D3D9: Final release is following. MyRefs = %d, Tot = %d", ds->myRefCount, ds->refCount); if (ds->dwMyThread != 0) { ods("D3D9: finalRelease from other thread"); } // Codeblock for stashing threadid { Stash stashThread(&(ds->dwMyThread), GetCurrentThreadId()); ds->releaseAll(); } ods("D3D9: Final release of %p. MyRefs = %d Tot = %d", idd, ds->myRefCount, ds->refCount); devMap.erase(it); delete ds; ds = NULL; } //TODO: Move logic to HardHook. // Call base without active hook in case of no trampoline. ReleaseType oRelease = (ReleaseType) hhRelease.call; hhRelease.restore(); ULONG res = oRelease(idd); hhRelease.inject(); // Release is called very often. Thus, we do not want to always log here. #ifdef EXTENDED_OVERLAY_DEBUGOUTPUT ods("D3D9: Chained Release with result %d", res); #endif return res; } static ULONG __stdcall myWin8Release(IDirect3DDevice9 *idd) { Mutex m; DevMapType::iterator it = devMap.find(idd); DevState *ds = it != devMap.end() ? it->second : NULL; if (ds) { // Release is called very often. Thus, we do not want to always log here. #ifdef EXTENDED_OVERLAY_DEBUGOUTPUT ods("D3D9: Using own Refcount implementation for call to Release."); #endif if (ds->dwMyThread == GetCurrentThreadId()) { ds->myRefCount--; return ds->refCount; } if (ds->refCount == 1) { ds->disconnect(); ods("D3D9: Final release. MyRefs = %d, Tot = %d", ds->myRefCount, ds->refCount); if (ds->dwMyThread != 0) { ods("D3D9: finalRelease from other thread"); } // Codeblock for stashing threadid { Stash stashThread(&(ds->dwMyThread), GetCurrentThreadId()); ds->releaseAll(); } ods("D3D9: Final release of %p. MyRefs = %d Tot = %d", idd, ds->myRefCount, ds->refCount); devMap.erase(it); delete ds; ds = NULL; } } //TODO: Move logic to HardHook. // Call base without active hook in case of no trampoline. ReleaseType oRelease = (ReleaseType) hhRelease.call; hhRelease.restore(); ULONG res = oRelease(idd); hhRelease.inject(); if (ds) ds->refCount = res; // Release is called very often. Thus, we do not want to always log here. #ifdef EXTENDED_OVERLAY_DEBUGOUTPUT ods("D3D9: Chained Release (Win8) with result: %d", res); #endif return res; } static IDirect3DDevice9* findOriginalDevice(IDirect3DDevice9 *device) { IDirect3DSwapChain9 *pSwap = NULL; device->GetSwapChain(0, &pSwap); if (pSwap) { IDirect3DDevice9 *originalDevice = NULL; if (SUCCEEDED(pSwap->GetDevice(&originalDevice))) { if (originalDevice == device) { // Found the original device. Release responsibility is passed // to the caller. } else { device = findOriginalDevice(originalDevice); originalDevice->Release(); } } else { ods("D3D9: Failed to recurse to find original device. Could not get Device from Swapchain."); } pSwap->Release(); } else { ods("D3D9: Failed to recurse to find original device. Could not get Swapchain."); } return device; } typedef HRESULT(__stdcall *CreateDeviceType)(IDirect3D9 *, UINT, D3DDEVTYPE, HWND, DWORD, D3DPRESENT_PARAMETERS *, IDirect3DDevice9 **); static HRESULT __stdcall myCreateDevice(IDirect3D9 *id3d, UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow, DWORD BehaviorFlags, D3DPRESENT_PARAMETERS *pPresentationParameters, IDirect3DDevice9 **ppReturnedDeviceInterface) { Mutex m; ods("D3D9: Chaining CreateDevice"); // BehaviorFlags &= ~D3DCREATE_PUREDEVICE; //TODO: Move logic to HardHook. // Call base without active hook in case of no trampoline. CreateDeviceType oCreateDevice = (CreateDeviceType) hhCreateDevice.call; hhCreateDevice.restore(); HRESULT hr = oCreateDevice(id3d, Adapter, DeviceType, hFocusWindow, BehaviorFlags, pPresentationParameters, ppReturnedDeviceInterface); hhCreateDevice.inject(); if (FAILED(hr)) return hr; IDirect3DDevice9 *idd = *ppReturnedDeviceInterface; // Get real interface, please. IDirect3DDevice9 *originalDevice = findOriginalDevice(idd); if (idd != originalDevice) { ods("D3D9: Prepatched device, using original. %p => %p", idd, originalDevice); idd = originalDevice; } DevState *ds = new DevState; ds->dev = idd; idd->AddRef(); ds->initRefCount = idd->Release(); DevMapType::iterator it = devMap.find(idd); if (it != devMap.end()) { ods("Device exists in devMap already - canceling injection into device. Thread prev: %d ; new: %d", it->second->dwMyThread, GetCurrentThreadId()); delete ds; return hr; } devMap[idd] = ds; // The offsets are dependent on the declaration order of the struct. // See IDirect3DDevice9 (2nd, 3rd, 17th, 18th functions) const unsigned int offsetAddref = 1; const unsigned int offsetRelease = 2; const unsigned int offsetReset = 16; const unsigned int offsetPresent = 17; if (bIsWin8) { hhAddRef.setupInterface(idd, offsetAddref, reinterpret_cast(myWin8AddRef)); hhRelease.setupInterface(idd, offsetRelease, reinterpret_cast(myWin8Release)); } else { hhAddRef.setupInterface(idd, offsetAddref, reinterpret_cast(myAddRef)); hhRelease.setupInterface(idd, offsetRelease, reinterpret_cast(myRelease)); } hhReset.setupInterface(idd, offsetReset, reinterpret_cast(myReset)); hhPresent.setupInterface(idd, offsetPresent, reinterpret_cast(myPresent)); IDirect3DSwapChain9 *pSwap = NULL; idd->GetSwapChain(0, &pSwap); if (pSwap) { // The offset is dependent on the declaration order of the struct. // See IDirect3DSwapChain9 (Present is the fourth function) const unsigned int offsetPresent = 3; hhSwapPresent.setupInterface(pSwap, offsetPresent, reinterpret_cast(mySwapPresent)); pSwap->Release(); } else { ods("D3D9: Failed to get swapchain"); } ds->createCleanState(); return hr; } typedef HRESULT(__stdcall *CreateDeviceExType)(IDirect3D9Ex *, UINT, D3DDEVTYPE, HWND, DWORD, D3DPRESENT_PARAMETERS *, D3DDISPLAYMODEEX *, IDirect3DDevice9Ex **); static HRESULT __stdcall myCreateDeviceEx(IDirect3D9Ex *id3d, UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow, DWORD BehaviorFlags, D3DPRESENT_PARAMETERS *pPresentationParameters, D3DDISPLAYMODEEX *pFullscreenDisplayMode, IDirect3DDevice9Ex **ppReturnedDeviceInterface) { Mutex m; ods("D3D9: Chaining CreateDeviceEx"); // BehaviorFlags &= ~D3DCREATE_PUREDEVICE; //TODO: Move logic to HardHook. // Call base without active hook in case of no trampoline. CreateDeviceExType oCreateDeviceEx = (CreateDeviceExType) hhCreateDeviceEx.call; hhCreateDeviceEx.restore(); HRESULT hr = oCreateDeviceEx(id3d, Adapter, DeviceType, hFocusWindow, BehaviorFlags, pPresentationParameters, pFullscreenDisplayMode, ppReturnedDeviceInterface); hhCreateDeviceEx.inject(); if (FAILED(hr)) return hr; IDirect3DDevice9Ex *idd = *ppReturnedDeviceInterface; DevState *ds = new DevState; ds->dev = idd; idd->AddRef(); ds->initRefCount = idd->Release(); DevMapType::iterator it = devMap.find(idd); if (it != devMap.end()) { ods("Device exists in devMap already - canceling injection into device. Thread prev: %d ; new: %d", it->second->dwMyThread, GetCurrentThreadId()); delete ds; return hr; } devMap[idd] = ds; // The offsets are dependent on the declaration order of the struct. // See IDirect3DDevice9 (2nd, 3rd, 17th, 18th functions) const unsigned int offsetAddref = 1; const unsigned int offsetRelease = 2; const unsigned int offsetReset = 16; const unsigned int offsetPresent = 17; // On IDirect3DDevice9Ex const unsigned int offsetPresentEx = 121; const unsigned int offsetResetEx = 132; if (bIsWin8) { hhAddRef.setupInterface(idd, offsetAddref, reinterpret_cast(myWin8AddRef)); hhRelease.setupInterface(idd, offsetRelease, reinterpret_cast(myWin8Release)); } else { hhAddRef.setupInterface(idd, offsetAddref, reinterpret_cast(myAddRef)); hhRelease.setupInterface(idd, offsetRelease, reinterpret_cast(myRelease)); } hhReset.setupInterface(idd, offsetReset, reinterpret_cast(myReset)); hhResetEx.setupInterface(idd, offsetResetEx, reinterpret_cast(myResetEx)); hhPresent.setupInterface(idd, offsetPresent, reinterpret_cast(myPresent)); hhPresentEx.setupInterface(idd, offsetPresentEx, reinterpret_cast(myPresentEx)); IDirect3DSwapChain9 *pSwap = NULL; idd->GetSwapChain(0, &pSwap); if (pSwap) { // The offset is dependent on the declaration order of the struct. // See IDirect3DSwapChain9 (Present is the fourth function) const unsigned int offsetPresent = 3; hhSwapPresent.setupInterface(pSwap, offsetPresent, reinterpret_cast(mySwapPresent)); pSwap->Release(); } else { ods("D3D9: Failed to get swapchain for DevEx"); } ds->createCleanState(); return hr; } static void HookCreateRaw(voidFunc vfCreate) { ods("D3D9: Injecting CreateDevice Raw"); hhCreateDevice.setup(vfCreate, reinterpret_cast(myCreateDevice)); } static void HookCreateRawEx(voidFunc vfCreate) { ods("D3D9: Injecting CreateDeviceEx Raw"); hhCreateDeviceEx.setup(vfCreate, reinterpret_cast(myCreateDeviceEx)); } static void HookCreate(IDirect3D9 *pD3D) { ods("D3D9: Injecting CreateDevice"); hhCreateDevice.setupInterface(pD3D, VTABLE_OFFSET_ID3D_CREATEDEVICE, reinterpret_cast(myCreateDevice)); } static void HookCreateEx(IDirect3D9Ex *pD3D) { ods("D3D9Ex: Injecting CreateDevice / CreateDeviceEx"); // Best effort hooking for the non-ex create method. If it was set up // previously this setup call is safely ignored by the hook. HookCreate(pD3D); hhCreateDeviceEx.setupInterface(pD3D, VTABLE_OFFSET_ID3D_CREATEDEVICE_EX, reinterpret_cast(myCreateDeviceEx)); } static void hookD3D9(HMODULE hD3D, bool preonly); // @param preonly If rawpatching the createdevice-functions fails, don't try to // patch Direct3DCreate9. // Should be true on PROC_ATTACH, and false on THREAD_ATTACH. (?) void checkD3D9Hook(bool preonly) { static bool bCheckHookActive = false; if (bCheckHookActive) { ods("D3D9: Recursion in checkD3D9Hook"); return; } bCheckHookActive = true; HMODULE hD3D = GetModuleHandle("D3D9.DLL"); if (hD3D != NULL) { if (! bHooked) { hookD3D9(hD3D, preonly); } } else { #ifdef EXTENDED_OVERLAY_DEBUGOUTPUT ods("D3D9: No D3D9.DLL found as loaded. No hooking at this point."); #endif } bCheckHookActive = false; } static void hookD3D9(HMODULE hD3D, bool preonly) { char procname[MODULEFILEPATH_BUFLEN]; GetModuleFileName(NULL, procname, ARRAY_NUM_ELEMENTS(procname)); ods("D3D9: hookD3D9 in App '%s'", procname); // Add a ref to ourselves; we do NOT want to get unloaded directly from this process. HMODULE hTempSelf = NULL; GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, reinterpret_cast(&hookD3D9), &hTempSelf); bHooked = true; // Can we use the prepatch data? wchar_t modulename[MODULEFILEPATH_BUFLEN]; GetModuleFileNameW(hD3D, modulename, ARRAY_NUM_ELEMENTS(modulename)); if (_wcsicmp(d3dd->wcFileName, modulename) == 0) { // The module seems to match the one we prepared d3dd for. unsigned char *raw = (unsigned char *) hD3D; HookCreateRaw((voidFunc)(raw + d3dd->offsetCreate)); if (d3dd->offsetCreateEx) { HookCreateRawEx((voidFunc)(raw + d3dd->offsetCreateEx)); } } else if (! preonly) { ods("D3D9: Interface changed, can't rawpatch. Current: %ls ; Previously: %ls", modulename, d3dd->wcFileName); pDirect3DCreate9 d3dcreate9 = reinterpret_cast(GetProcAddress(hD3D, "Direct3DCreate9")); if (d3dcreate9) { ods("D3D9: Got %p for Direct3DCreate9", d3dcreate9); IDirect3D9 *id3d9 = d3dcreate9(D3D_SDK_VERSION); if (id3d9) { HookCreate(id3d9); id3d9->Release(); } else { ods("D3D9: Failed call to Direct3DCreate9"); } } else { ods("D3D9: Library without Direct3DCreate9?"); } pDirect3DCreate9Ex d3dcreate9ex = reinterpret_cast(GetProcAddress(hD3D, "Direct3DCreate9Ex")); if (d3dcreate9ex) { ods("D3D9: Got %p for Direct3DCreate9Ex", d3dcreate9ex); IDirect3D9Ex** id3d9ex = 0; HRESULT hr = d3dcreate9ex(D3D_SDK_VERSION, id3d9ex); if (SUCCEEDED(hr)) { HookCreateEx(*id3d9ex); (*id3d9ex)->Release(); } else { switch (hr) { case D3DERR_OUTOFVIDEOMEMORY: ods("D3D11: Direct3DCreate9Ex returned with out of memory error."); break; case D3DERR_NOTAVAILABLE: ods("D3D11: Direct3DCreate9Ex is not available."); break; default: ods("D3D11: Unexpected return result from Direct3DCreate9Ex"); break; } } } } else { bHooked = false; } } extern "C" __declspec(dllexport) void __cdecl PrepareD3D9() { if (! d3dd) return; ods("D3D9: Preparing static data for D3D9 Injection"); HMODULE hD3D = LoadLibrary("D3D9.DLL"); if (hD3D != NULL) { GetModuleFileNameW(hD3D, d3dd->wcFileName, ARRAY_NUM_ELEMENTS(d3dd->wcFileName)); std::string d3d9FnName("Direct3DCreate9"); pDirect3DCreate9 d3dcreate9 = reinterpret_cast(GetProcAddress(hD3D, d3d9FnName.c_str())); if (! d3dcreate9) { ods(("D3D9: Library without " + d3d9FnName).c_str()); } else { if (!IsFnInModule(reinterpret_cast(d3dcreate9), d3dd->wcFileName, "D3D9", d3d9FnName)) { ods(("D3D9: " + d3d9FnName + " is not in D3D9 library").c_str()); } else { IDirect3D9 *id3d9 = d3dcreate9(D3D_SDK_VERSION); if (id3d9) { void ***vtbl = (void ***) id3d9; void *pCreate = (*vtbl)[VTABLE_OFFSET_ID3D_CREATEDEVICE]; if (!IsFnInModule(reinterpret_cast(pCreate), d3dd->wcFileName, "D3D9", "CreateDevice")) { ods("D3D9: CreateDevice is not in D3D9 library"); } else { size_t fn = reinterpret_cast(pCreate); size_t base = reinterpret_cast(hD3D); d3dd->offsetCreate = fn - base; ods("D3D9: Successfully found prepatch offset: %p %p %p: %d", hD3D, d3dcreate9, pCreate, d3dd->offsetCreate); } id3d9->Release(); } } } std::string d3d9exFnName("Direct3DCreate9Ex"); pDirect3DCreate9Ex d3dcreate9ex = reinterpret_cast(GetProcAddress(hD3D, d3d9exFnName.c_str())); if (! d3dcreate9ex) { ods(("D3D9: Library without " + d3d9exFnName).c_str()); } else { if (!IsFnInModule(reinterpret_cast(d3dcreate9ex), d3dd->wcFileName, "D3D9", d3d9exFnName)) { ods(("D3D9: " + d3d9exFnName + " is not in D3D9 library").c_str()); } else { IDirect3D9Ex *id3d9 = NULL; d3dcreate9ex(D3D_SDK_VERSION, &id3d9); if (id3d9) { void ***vtbl = (void ***) id3d9; void *pCreateEx = (*vtbl)[VTABLE_OFFSET_ID3D_CREATEDEVICE_EX]; if (!IsFnInModule(reinterpret_cast(pCreateEx), d3dd->wcFileName, "D3D9", "CreateDeviceEx")) { ods("D3D9: CreateDeviceEx is not in D3D9 library"); } else { size_t fn = reinterpret_cast(pCreateEx); size_t base = reinterpret_cast(hD3D); d3dd->offsetCreateEx = fn - base; ods("D3D9: Successfully found prepatch ex offset: %p %p %p: %d", hD3D, d3dcreate9ex, pCreateEx, d3dd->offsetCreateEx); } id3d9->Release(); } } } FreeLibrary(hD3D); } } mumble-1.3.4/overlay/excludecheck.cpp0000664000175000017500000001464214010707273017464 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "lib.h" #include "olsettings.h" #include "util.h" #include "ancestor.h" #include #include #include static bool bExcludeCheckInitialized = false; static OverlayExclusionMode oemExcludeMode = LauncherFilterExclusionMode; static std::vector vLaunchers; static std::vector vWhitelist; static std::vector vPaths; static std::vector vBlacklist; /// Ensure the ExcludeCheck module is initialized. static void ExcludeCheckEnsureInitialized() { if (bExcludeCheckInitialized) { return; } oemExcludeMode = SettingsGetExclusionMode(); vLaunchers = SettingsGetLaunchers(); vWhitelist = SettingsGetWhitelist(); vPaths = SettingsGetPaths(); vBlacklist = SettingsGetBlacklist(); bExcludeCheckInitialized = true; } /// Check whether the program at |absExeName| /// (with basename of |exeName|) is blacklisted. /// /// Note that programs that are added as launchers /// are also implicitly treated as being blacklisted. static bool isBlacklistedExe(const std::string &absExeName, const std::string &exeName) { std::vector combinedBlacklist = vmerge(vBlacklist, vLaunchers); for (size_t i = 0; i < combinedBlacklist.size(); i++) { std::string &val = combinedBlacklist.at(i); if (isAbsPath(val)) { if (val == absExeName) { return true; } } else { if (val == exeName) { return true; } } } return false; } /// Check whether the program at |absExeName| /// (with basename of |exeName|) is in the Mumble /// overlay program whitelist. static bool isWhitelistedExe(const std::string &absExeName, const std::string &exeName) { for (size_t i = 0; i < vWhitelist.size(); i++) { std::string &val = vWhitelist.at(i); if (isAbsPath(val)) { if (val == absExeName) { return true; } } else { if (val == exeName) { return true; } } } return false; } /// Check whether the program at |absExeName| /// is in the Mumble overlay path whitelist. static bool isWhitelistedPath(const std::string &absExeName) { for (size_t i = 0; i < vPaths.size(); i++) { const std::string &path = vPaths.at(i); if (absExeName.find(path) == 0) { return true; } } return false; } /// Check whether an ancestor executable in /// |absAncestorExeNames| (or |ancestorExeNames|, /// for relative paths) is in the Mumble overlay's /// launcher whitelist. static bool hasWhitelistedAncestor(const std::vector &absAncestorExeNames, const std::vector &ancestorExeNames) { for (size_t i = 0; i < vLaunchers.size(); i++) { std::string &val = vLaunchers.at(i); if (isAbsPath(val)) { if (std::find(absAncestorExeNames.begin(), absAncestorExeNames.end(), val) != absAncestorExeNames.end()) { return true; } } else { if (std::find(ancestorExeNames.begin(), ancestorExeNames.end(), val) != ancestorExeNames.end()) { return true; } } } return false; } bool ExcludeCheckIsOverlayEnabled(std::string absExeName_, std::string exeName_) { bool enableOverlay = true; std::string absExeName = slowercase(absExeName_); std::string exeName = slowercase(exeName_); ExcludeCheckEnsureInitialized(); switch (oemExcludeMode) { case LauncherFilterExclusionMode: { ods("ExcludeCheck: using 'launcher filter' exclusion mode..."); std::vector absAncestorExeNames; std::vector ancestorExeNames; if (!GetProcessAncestorChain(absAncestorExeNames, ancestorExeNames)) { // Unable to get ancestor chain. Process is allowed. ods("ExcludeCheck: Unable to find parent. Process allowed."); enableOverlay = true; } absAncestorExeNames = vlowercase(absAncestorExeNames); ancestorExeNames = vlowercase(ancestorExeNames); for (size_t i = 0; i < absAncestorExeNames.size(); i++) { std::string absAncestorExeName = absAncestorExeNames.at(i); ods("ExcludeCheck: Ancestor #%i is '%s'", i+1, absAncestorExeName.c_str()); } // The blacklist always wins. // If an exe is in the blacklist, never show the overlay, ever. if (isBlacklistedExe(absExeName, exeName)) { ods("ExcludeCheck: '%s' is blacklisted. Overlay disabled.", absExeName.c_str()); enableOverlay = false; // If the process's exe name is whitelisted, allow the overlay to be shown. } else if (isWhitelistedExe(absExeName, exeName)) { ods("ExcludeCheck: '%s' is whitelisted. Overlay enabled.", absExeName.c_str()); enableOverlay = true; // If the exe is within a whitelisted path, allow the overlay to be shown. // An example is: // Whitelisted path: d:\games // absExeName: d:\games\World of Warcraft\Wow-64.exe // The overlay would be shown in WoW (and any game that lives under d:\games) } else if (isWhitelistedPath(absExeName)) { ods("ExcludeCheck: '%s' is within a whitelisted path. Overlay enabled.", absExeName.c_str()); enableOverlay = true; // If any of the process's ancestors are whitelisted, allow the process through. // This allows us to whitelist Steam.exe, etc. -- and have the overlay // show up in all Steam titles. } else if (hasWhitelistedAncestor(absAncestorExeNames, ancestorExeNames)) { ods("ExcludeCheck: An ancestor of '%s' is whitelisted. Overlay enabled.", exeName.c_str()); enableOverlay = true; // If nothing matched, do not show the overlay. } else { ods("ExcludeCheck: No matching overlay exclusion rule found. Overlay disabled."); enableOverlay = false; } break; } case WhitelistExclusionMode: { ods("ExcludeCheck: using 'whitelist' exclusion mode..."); if (isWhitelistedExe(absExeName, exeName)) { ods("ExcludeCheck: '%s' is whitelisted. Overlay enabled.", absExeName.c_str()); enableOverlay = true; } else { ods("ExcludeCheck: '%s' not whitelisted. Overlay disabled.", absExeName.c_str()); enableOverlay = false; } break; } case BlacklistExclusionMode: { ods("ExcludeCheck: using 'blacklist' exclusion mode..."); if (isBlacklistedExe(absExeName, exeName)) { ods("ExcludeCheck: '%s' is blacklisted. Overlay disabled.", absExeName.c_str()); enableOverlay = false; } else { ods("ExcludeCheck: '%s' is not blacklisted. Overlay enabled.", absExeName.c_str()); enableOverlay = true; } break; } } return enableOverlay; } mumble-1.3.4/overlay/util.h0000664000175000017500000000357514010707273015462 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_UTIL_H_ #define MUMBLE_UTIL_H_ #include #include #include /// Returns true if |path| is an absolute path. /// Returns false if |path| is not an absolute path. static inline bool isAbsPath(const std::string &path) { return path.find("\\") != std::string::npos; } /// Convert the string |s| to lowercase and return it. static inline std::string slowercase(std::string s) { std::transform(s.begin(), s.end(), s.begin(), tolower); return s; } /// Convert all entries of |vec| to lowercase and return the resulting vector. static inline std::vector vlowercase(std::vector vec) { std::transform(vec.begin(), vec.end(), vec.begin(), slowercase); return vec; } /// Merge |v1| and |v2| and return the result. template static inline std::vector vmerge(std::vector v1, const std::vector &v2) { v1.insert(v1.end(), v2.begin(), v2.end()); return v1; } /// Filter out all entries of |vremove| from |v| and return the result. template static inline std::vector vexclude(const std::vector &v, const std::vector &vremove) { std::vector out; std::set_difference(v.begin(), v.end(), vremove.begin(), vremove.end(), std::inserter(out, out.begin())); return out; } /// Find the intersection between |v1| and |v2| and return the result. template static inline std::vector vintersect(const std::vector &v1, const std::vector &v2) { std::vector out; std::set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), std::inserter(out, out.begin())); return out; } #endif mumble-1.3.4/overlay/overlay.h0000664000175000017500000000267614010707273016167 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_INTERNAL_OVERLAY_H_ #define MUMBLE_INTERNAL_OVERLAY_H_ // overlay message protocol version number #define OVERLAY_MAGIC_NUMBER 0x00000005 struct OverlayMsgHeader { unsigned int uiMagic; int iLength; unsigned int uiType; }; #define OVERLAY_MSGTYPE_INIT 0 struct OverlayMsgInit { unsigned int uiWidth; unsigned int uiHeight; }; #define OVERLAY_MSGTYPE_SHMEM 1 struct OverlayMsgShmem { char a_cName[2048]; }; #define OVERLAY_MSGTYPE_BLIT 2 struct OverlayMsgBlit { unsigned int x, y, w, h; }; #define OVERLAY_MSGTYPE_ACTIVE 3 struct OverlayMsgActive { unsigned int x, y, w, h; }; #define OVERLAY_MSGTYPE_PID 4 struct OverlayMsgPid { unsigned int pid; }; #define OVERLAY_MSGTYPE_FPS 5 struct OverlayMsgFps { float fps; }; #define OVERLAY_FPS_INTERVAL 0.25f #define OVERLAY_MSGTYPE_INTERACTIVE 6 struct OverlayMsgInteractive { bool state; }; struct OverlayMsg { union { char headerbuffer[1]; struct OverlayMsgHeader omh; }; union { char msgbuffer[1]; struct OverlayMsgShmem oms; struct OverlayMsgInit omi; struct OverlayMsgBlit omb; struct OverlayMsgActive oma; struct OverlayMsgPid omp; struct OverlayMsgFps omf; struct OverlayMsgInteractive omin; }; }; #endif mumble-1.3.4/overlay/D11StateBlock.cpp0000664000175000017500000001171314010707273017332 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . /* Copyright (C) 2011-2013, Nye Liu Copyright (C) 2011-2013, Kissaki All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Mumble Developers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "D11StateBlock.h" void D11CreateStateBlock(ID3D11DeviceContext *pDeviceContext, D11StateBlock **ppStateBlock) { *ppStateBlock = new D11StateBlock(pDeviceContext); } D11StateBlock::D11StateBlock(ID3D11DeviceContext *pDC) : pRasterizerState(0), uiSampleMask(0) , Format(DXGI_FORMAT_UNKNOWN), Topology(D3D11_PRIMITIVE_TOPOLOGY_UNDEFINED) , pBlendState(0), pIndexBuffer(0), pInputLayout(0), uiOffset(0) , pDepthStencilView(0) { uiNumViewports = D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE; ZeroMemory(pViewports, sizeof(pViewports)); ZeroMemory(pRenderTargetViews, sizeof (pRenderTargetViews)); ZeroMemory(fBlendFactor, sizeof (fBlendFactor)); ZeroMemory(pVertexBuffers, sizeof (pVertexBuffers)); ZeroMemory(uiStrides, sizeof (uiStrides)); ZeroMemory(uiOffsets, sizeof (uiOffsets)); pDeviceContext = pDC; pDeviceContext->AddRef(); } D11StateBlock::~D11StateBlock() { ReleaseObjects(); pDeviceContext->Release(); } void D11StateBlock::Capture() { // Release potential references to make sure we have no leaks. ReleaseObjects(); pDeviceContext->RSGetState(&pRasterizerState); uiNumViewports = D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE; pDeviceContext->RSGetViewports(&uiNumViewports, pViewports); pDeviceContext->OMGetRenderTargets(D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT, pRenderTargetViews, &pDepthStencilView); pDeviceContext->OMGetBlendState(&pBlendState, fBlendFactor, &uiSampleMask); pDeviceContext->IAGetInputLayout(&pInputLayout); pDeviceContext->IAGetIndexBuffer(&pIndexBuffer, &Format, &uiOffset); pDeviceContext->IAGetPrimitiveTopology(&Topology); pDeviceContext->IAGetVertexBuffers(0, D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT, pVertexBuffers, uiStrides, uiOffsets); } void D11StateBlock::Apply() { pDeviceContext->RSSetState(pRasterizerState); pDeviceContext->RSSetViewports(uiNumViewports, pViewports); pDeviceContext->OMSetRenderTargets(D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT, pRenderTargetViews, pDepthStencilView); pDeviceContext->OMSetBlendState(pBlendState, fBlendFactor, uiSampleMask); pDeviceContext->IASetInputLayout(pInputLayout); pDeviceContext->IASetIndexBuffer(pIndexBuffer, Format, uiOffset); pDeviceContext->IASetPrimitiveTopology(Topology); pDeviceContext->IASetVertexBuffers(0, D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT, pVertexBuffers, uiStrides, uiOffsets); ReleaseObjects(); } /// Release state information void D11StateBlock::ReleaseObjects() { if (pRasterizerState) { pRasterizerState->Release(); pRasterizerState = NULL; } for (int i=0; iRelease(); pRenderTargetViews[i] = NULL; } if (pDepthStencilView) { pDepthStencilView->Release(); pDepthStencilView = NULL; } if (pBlendState) { pBlendState->Release(); pBlendState = NULL; } if (pInputLayout) { pInputLayout->Release(); pInputLayout = NULL; } if (pIndexBuffer) { pIndexBuffer->Release(); pIndexBuffer = NULL; } for (int i=0; iRelease(); pVertexBuffers[i] = NULL; } } mumble-1.3.4/overlay/HardHook_minhook.cpp0000664000175000017500000000717214010707273020260 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "HardHook.h" #include "ods.h" #include static LONG minhook_init_once = 0; // EnsureMinHookInitialized ensures that the MinHook // library is initialized. If MinHook is already // initialized, calling this function is a no-op. static void EnsureMinHookInitialized() { // Ensure MH_Initialize is only called once. if (InterlockedCompareExchange(&minhook_init_once, 1, 0) == 0) { MH_STATUS status = MH_Initialize(); if (status != MH_OK && status != MH_ERROR_ALREADY_INITIALIZED) { fods("HardHook: Failed to initialize minhook; MH_Initialize returned %s", MH_StatusToString(status)); } } } /** * @brief Constructs a new hook without actually injecting. */ HardHook::HardHook() : m_func(NULL) , m_replacement(NULL) , call(NULL) { EnsureMinHookInitialized(); } /** * @brief Constructs a new hook by injecting given replacement function into func. * @see HardHook::setup * @param func Funktion to inject replacement into. * @param replacement Function to inject into func. */ HardHook::HardHook(voidFunc func, voidFunc replacement) : m_func(NULL) , m_replacement(NULL) , call(NULL) { EnsureMinHookInitialized(); setup(func, replacement); } /** * @brief Makes sure the given replacement function is run once func is called. * * Uses MinHook to put the hook in place. * * @param func Pointer to function to redirect. * @param replacement Pointer to code to redirect to. */ void HardHook::setup(voidFunc func, voidFunc replacement) { m_func = func; m_replacement = replacement; MH_STATUS status = MH_CreateHook((LPVOID) func, (LPVOID)replacement, (LPVOID *)&call); if (status != MH_OK) { fods("HardHook: setup failed, MH_CreateHook returned %s", MH_StatusToString(status)); } inject(true); } void HardHook::setupInterface(IUnknown *unkn, LONG funcoffset, voidFunc replacement) { fods("HardHook: setupInterface: Replacing %p function #%ld", unkn, funcoffset); void **ptr = reinterpret_cast(unkn); ptr = reinterpret_cast(ptr[0]); setup(reinterpret_cast(ptr[funcoffset]), replacement); } void HardHook::reset() { m_func = NULL; m_replacement = NULL; call = NULL; } /** * @brief Injects redirection code into the target function. * * @param force No-op in the MinHook-based HardHook implementation. */ void HardHook::inject(bool force) { if (!force) { // MinHook guarantees the presence of a trampoline, so // inject() and restore() are no-ops unless force is // set to true. return; } MH_STATUS status = MH_EnableHook((LPVOID)m_func); if (status != MH_OK) { fods("HardHook: inject() failed: MH_EnableHook returned %s", MH_StatusToString(status)); } } /** * @brief Restores the original code in a target function. * * @param force No-op in the MinHook-based HardHook implementation. */ void HardHook::restore(bool force) { if (!force) { // MinHook guarantees the presence of a trampoline, so // inject() and restore() are no-ops unless force is // set to true. return; } MH_STATUS status = MH_DisableHook((LPVOID)m_func); if (status != MH_OK) { fods("HardHook: restore() failed: MH_DisableHook returned %s", MH_StatusToString(status)); } } void HardHook::print() { fods("HardHook: unused 'print' method called for MinHook-based HardHook"); } /** * @brief No-op in MinHook-based HardHook implementation. */ void HardHook::check() { fods("HardHook: unused 'check' method called for MinHook-based HardHook"); } mumble-1.3.4/overlay/olsettings.cpp0000664000175000017500000001434614010707273017231 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "olsettings.h" #include "lib.h" // include lib.h for Windows headers... #include "util.h" #include #include #include #include #include "overlay_blacklist.h" #include "overlay_whitelist.h" #include "overlay_launchers.h" // Get the default blacklist (from overlay_blacklist.h) as a string vector. static std::vector defaultBlacklistVector() { std::vector out; size_t i = 0; while (overlayBlacklist[i] != NULL) { out.push_back(std::string(overlayBlacklist[i])); i++; } return out; } // Get the default whitelist (from overlay_whitelist.h) as a string vector. static std::vector defaultWhitelistVector() { std::vector out; size_t i = 0; while (overlayWhitelist[i] != NULL) { out.push_back(std::string(overlayWhitelist[i])); i++; } return out; } // Get the default launcher list (from overlay_launchers.h) as a string vector. static std::vector defaultLaunchersVector() { std::vector out; size_t i = 0; while (overlayLaunchers[i] != NULL) { out.push_back(std::string(overlayLaunchers[i])); i++; } return out; } // Read a REG_MULTI_SZ value from the Windows registry and return it as a string vector. // Returns an empty vector on failure. static std::vector regReadMultiString(HKEY key, const std::string &subKey, const std::string &valueName) { LONG err = 0; std::vector out; char *buf = NULL; HKEY subKeyHandle = 0; err = RegOpenKeyExA(key, subKey.c_str(), NULL, KEY_READ, &subKeyHandle); if (err != ERROR_SUCCESS) { goto err; } DWORD sz = 0; DWORD type = 0; err = RegQueryValueExA(subKeyHandle, valueName.c_str(), NULL, &type, NULL, &sz); if (err != ERROR_SUCCESS) { goto err; } if (type != REG_MULTI_SZ) { goto err; } // If the size is longer than 4MB, treat it as an error. if (sz > 4*1024*1024) { goto err; } buf = reinterpret_cast(malloc(sz)); if (buf == NULL) { goto err; } err = RegQueryValueExA(subKeyHandle, valueName.c_str(), NULL, &type, reinterpret_cast(buf), &sz); if (err != ERROR_SUCCESS) { goto err; } size_t begin = 0; for (size_t i = 0; i < sz; i++) { if (buf[i] == 0) { size_t len = i - begin; if (len > 0) { std::string s(&buf[begin], len); out.push_back(s); } begin = i + 1; } } err: free(buf); return out; } // Get the Mumble client's configured overlay exclusion mode as an integer. // Returns -1 if the function could not read the value from the Windows registry. static int getModeInternal() { LONG err = 0; HKEY key = NULL; DWORD mode = -1; err = RegOpenKeyExA(HKEY_CURRENT_USER, "Software\\Mumble\\Mumble\\overlay", NULL, KEY_READ, &key); if (err != ERROR_SUCCESS) { return -1; } DWORD sz = sizeof(mode); err = RegQueryValueExA(key, "mode", NULL, NULL, reinterpret_cast(&mode), &sz); if (err != ERROR_SUCCESS) { return -1; } if (sz != sizeof(mode)) { return -1; } return static_cast(mode); } OverlayExclusionMode SettingsGetExclusionMode() { int mode = getModeInternal(); if (mode == -1) { // If no exclusion mode is set in the registry, // use the launcher filter. return LauncherFilterExclusionMode; } return static_cast(mode); } std::vector SettingsGetLaunchers() { std::vector defaultLaunchers = vlowercase(defaultLaunchersVector()); std::vector userLaunchers = vlowercase(regReadMultiString(HKEY_CURRENT_USER, "Software\\Mumble\\Mumble\\overlay", "launchers")); std::vector userExcludedLaunchers = vlowercase(regReadMultiString(HKEY_CURRENT_USER, "Software\\Mumble\\Mumble\\overlay", "launchersexclude")); std::vector actualExcludedLaunchers = vintersect(defaultLaunchers, userExcludedLaunchers); return vexclude(vmerge(defaultLaunchers, userLaunchers), actualExcludedLaunchers); } std::vector SettingsGetWhitelist() { std::vector defaultWhitelist = vlowercase(defaultWhitelistVector()); // We don't consider Mumble's built-in whitelist when in WhitelistExclusionMode. // The built-in whitelist is only used in LauncherFilterExclusionMode. if (SettingsGetExclusionMode() == WhitelistExclusionMode) { defaultWhitelist = std::vector(); } std::vector userWhitelist = vlowercase(regReadMultiString(HKEY_CURRENT_USER, "Software\\Mumble\\Mumble\\overlay", "whitelist")); std::vector userExcludedWhitelistEntries = vlowercase(regReadMultiString(HKEY_CURRENT_USER, "Software\\Mumble\\Mumble\\overlay", "whitelistexclude")); std::vector actualExcludedWhitelistEntries = vintersect(defaultWhitelist, userExcludedWhitelistEntries); return vexclude(vmerge(defaultWhitelist, userWhitelist), actualExcludedWhitelistEntries); } std::vector SettingsGetPaths() { std::vector defaultPaths; std::vector userPaths = vlowercase(regReadMultiString(HKEY_CURRENT_USER, "Software\\Mumble\\Mumble\\overlay", "paths")); std::vector userExcludedPaths = vlowercase(regReadMultiString(HKEY_CURRENT_USER, "Software\\Mumble\\Mumble\\overlay", "pathsexclude")); std::vector actualExcludedPaths = vintersect(defaultPaths, userExcludedPaths); return vexclude(vmerge(defaultPaths, userPaths), actualExcludedPaths); } std::vector SettingsGetBlacklist() { std::vector defaultBlacklist = vlowercase(defaultBlacklistVector()); std::vector userBlacklist = vlowercase(regReadMultiString(HKEY_CURRENT_USER, "Software\\Mumble\\Mumble\\overlay", "blacklist")); std::vector userExcludedBlacklistEntries = vlowercase(regReadMultiString(HKEY_CURRENT_USER, "Software\\Mumble\\Mumble\\overlay", "blacklistexclude")); std::vector actualExcludedPaths = vintersect(defaultBlacklist, userExcludedBlacklistEntries); return vexclude(vmerge(defaultBlacklist, userBlacklist), actualExcludedPaths); } mumble-1.3.4/overlay/overlay11.vs0000664000175000017500000000377414010707273016532 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . /* Copyright (C) 2011-2013, Nye Liu All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Mumble Developers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "overlay11-common.hlsl" PS_INPUT main( VS_INPUT input ) { PS_INPUT output = (PS_INPUT)0; output.Pos = input.Pos; output.Tex = input.Tex; return output; } mumble-1.3.4/overlay/d3d11.cpp0000664000175000017500000005714014010707273015651 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . /* Copyright (C) 2010-2013, Benjamin Jemlich Copyright (C) 2011-2013, Nye Liu Copyright (C) 2011-2013, Kissaki All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Mumble Developers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "lib.h" #include "D11StateBlock.h" #include "overlay11.vs.h" #include "overlay11.ps.h" #include #include D3D11Data *d3d11 = NULL; static bool bHooked = false; static HardHook hhAddRef; static HardHook hhRelease; typedef HRESULT(__stdcall *CreateDXGIFactory1Type)(REFIID, void **); typedef HRESULT(__stdcall *D3D11CreateDeviceAndSwapChainType)(IDXGIAdapter *, D3D_DRIVER_TYPE, HMODULE Software, UINT Flags, const D3D_FEATURE_LEVEL *, UINT, UINT, const DXGI_SWAP_CHAIN_DESC *, IDXGISwapChain **, ID3D11Device **, D3D_FEATURE_LEVEL *, ID3D11DeviceContext **); typedef ULONG(__stdcall *AddRefType)(ID3D11Device *); typedef ULONG(__stdcall *ReleaseType)(ID3D11Device *); struct SimpleVec3 { FLOAT x; FLOAT y; FLOAT z; SimpleVec3(FLOAT _x, FLOAT _y, FLOAT _z) : x(_x), y(_y), z(_z) {} }; struct SimpleVec2 { FLOAT x; FLOAT y; SimpleVec2(FLOAT _x, FLOAT _y) : x(_x), y(_y) {} }; struct SimpleVertex { SimpleVec3 Pos; SimpleVec2 Tex; }; static const int VERTEXBUFFER_SIZE = 4 * sizeof(SimpleVertex); class D11State: protected Pipe { public: ULONG lHighMark; LONG initRefCount; LONG refCount; LONG myRefCount; D3D11_VIEWPORT vp; ID3D11Device *pDevice; ID3D11DeviceContext *pDeviceContext; bool bDeferredContext; IDXGISwapChain *pSwapChain; D11StateBlock *pOrigStateBlock; D11StateBlock *pMyStateBlock; ID3D11RenderTargetView *pRTV; ID3D11VertexShader *pVertexShader; ID3D11PixelShader *pPixelShader; ID3D11InputLayout *pVertexLayout; ID3D11Buffer *pVertexBuffer; ID3D11Buffer *pIndexBuffer; ID3D11BlendState *pBlendState; ID3D11Texture2D *pTexture; ID3D11ShaderResourceView *pSRView; clock_t timeT; unsigned int frameCount; D11State(IDXGISwapChain *, ID3D11Device *); virtual ~D11State(); bool init(); void draw(); virtual void blit(unsigned int x, unsigned int y, unsigned int w, unsigned int h); virtual void setRect(); virtual void newTexture(unsigned int w, unsigned int h); }; typedef map SwapchainMap; SwapchainMap chains; typedef map DeviceMap; DeviceMap devices; D11State::D11State(IDXGISwapChain *pSwapChain, ID3D11Device *pDevice) : bDeferredContext(false) { this->pSwapChain = pSwapChain; this->pDevice = pDevice; lHighMark = initRefCount = refCount = myRefCount = 0; ZeroMemory(&vp, sizeof(vp)); pOrigStateBlock = NULL; pMyStateBlock = NULL; pRTV = NULL; pVertexShader = NULL; pPixelShader = NULL; pVertexLayout = NULL; pVertexBuffer = NULL; pIndexBuffer = NULL; pBlendState = NULL; pTexture = NULL; pSRView = NULL; pDeviceContext = NULL; timeT = clock(); frameCount = 0; pDevice->AddRef(); initRefCount = pDevice->Release(); } void D11State::blit(unsigned int x, unsigned int y, unsigned int w, unsigned int h) { HRESULT hr; ods("D3D11: Blit %d %d %d %d", x, y, w, h); if (! pTexture || ! pSRView || uiLeft == uiRight) return; D3D11_MAPPED_SUBRESOURCE mappedTex; hr = pDeviceContext->Map(pTexture, D3D11CalcSubresource(0, 0, 1), D3D11_MAP_WRITE_DISCARD, 0, &mappedTex); if (FAILED(hr)) { ods("D3D11: Failed map"); } UCHAR* pTexels = (UCHAR*)mappedTex.pData; for (unsigned int r=0;r< uiHeight; ++r) { unsigned char *sptr = a_ucTexture + r * uiWidth * 4; unsigned char *dptr = reinterpret_cast(pTexels) + r * mappedTex.RowPitch; memcpy(dptr, sptr, uiWidth * 4); } pDeviceContext->Unmap(pTexture, D3D11CalcSubresource(0, 0, 1)); } void D11State::setRect() { HRESULT hr; ods("D3D11: SetRect"); float w = static_cast(uiWidth); float h = static_cast(uiHeight); float left = static_cast(uiLeft) - 0.5f; float top = static_cast(uiTop) - 0.5f; float right = static_cast(uiRight) + 0.5f; float bottom = static_cast(uiBottom) + 0.5f; float texl = (left) / w; float text = (top) / h; float texr = (right + 1.0f) / w; float texb = (bottom + 1.0f) / h; left = 2.0f * (left / vp.Width) - 1.0f; right = 2.0f * (right / vp.Width) - 1.0f; top = -2.0f * (top / vp.Height) + 1.0f; bottom = -2.0f * (bottom / vp.Height) + 1.0f; ods("D3D11: Vertex (%f %f) (%f %f)", left, top, right, bottom); // Create vertex buffer SimpleVertex vertices[] = { { SimpleVec3(left, top, 0.5f), SimpleVec2(texl, text) }, { SimpleVec3(right, top, 0.5f), SimpleVec2(texr, text) }, { SimpleVec3(right, bottom, 0.5f), SimpleVec2(texr, texb) }, { SimpleVec3(left, bottom, 0.5f), SimpleVec2(texl, texb) }, }; // map/unmap to temporarily deny GPU access to the resource pVertexBuffer D3D11_MAPPED_SUBRESOURCE res; hr = pDeviceContext->Map(pVertexBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &res); const int verticesSize = sizeof(vertices); static_assert(verticesSize == VERTEXBUFFER_SIZE, "The vertex buffer size differs from the locally created vertex buffer."); memcpy(res.pData, vertices, verticesSize); ods("D3D11: Map: %lx %d", hr, sizeof(vertices)); pDeviceContext->Unmap(pVertexBuffer, 0); } void D11State::newTexture(unsigned int w, unsigned int h) { HRESULT hr; ods("D3D11: newTex %d %d", w, h); if (pTexture) { pTexture->Release(); pTexture = NULL; } if (pSRView) { pSRView->Release(); pSRView = NULL; } D3D11_TEXTURE2D_DESC desc; ZeroMemory(&desc, sizeof(desc)); desc.Width = w; desc.Height = h; desc.MipLevels = desc.ArraySize = 1; desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; desc.SampleDesc.Count = 1; desc.Usage = D3D11_USAGE_DYNAMIC; desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; hr = pDevice->CreateTexture2D(&desc, NULL, &pTexture); if (FAILED(hr)) { pTexture = NULL; ods("D3D11: Failed to create texture."); return; } D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc; ZeroMemory(&srvDesc, sizeof(srvDesc)); srvDesc.Format = desc.Format; srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; srvDesc.Texture2D.MostDetailedMip = 0; srvDesc.Texture2D.MipLevels = desc.MipLevels; hr = pDevice->CreateShaderResourceView(pTexture, &srvDesc, &pSRView); if (FAILED(hr)) { pSRView = NULL; pTexture->Release(); pTexture = NULL; ods("D3D11: Failed to create resource view."); return; } } bool D11State::init() { HRESULT hr; ID3D11Texture2D* pBackBuffer = NULL; hr = pSwapChain->GetBuffer(0, __uuidof(*pBackBuffer), (LPVOID*)&pBackBuffer); if (FAILED(hr)) { ods("D3D11: pSwapChain->GetBuffer failure!"); return false; } hr = pDevice->CreateDeferredContext(0, &pDeviceContext); // Depending on the device settings a deferred context may not be createable // for example if it is a SINGLETHREADED device. // (See http://msdn.microsoft.com/en-us/library/windows/desktop/ff476505%28v=vs.85%29.aspx) // We handle the expected failure and failure fallback in the same way - // by trying to use an immediate context. if (FAILED(hr) || !pDeviceContext) { ods("D3D11: Failed to create DeferredContext (0x%x). Getting ImmediateContext", hr); pDevice->GetImmediateContext(&pDeviceContext); D11CreateStateBlock(pDeviceContext, &pOrigStateBlock); D11CreateStateBlock(pDeviceContext, &pMyStateBlock); pOrigStateBlock->Capture(); bDeferredContext = false; } else { bDeferredContext = true; } D3D11_TEXTURE2D_DESC backBufferSurfaceDesc; pBackBuffer->GetDesc(&backBufferSurfaceDesc); ZeroMemory(&vp, sizeof(vp)); vp.Width = static_cast(backBufferSurfaceDesc.Width); vp.Height = static_cast(backBufferSurfaceDesc.Height); vp.MinDepth = 0; vp.MaxDepth = 1; vp.TopLeftX = 0; vp.TopLeftY = 0; pDeviceContext->RSSetViewports(1, &vp); hr = pDevice->CreateRenderTargetView(pBackBuffer, NULL, &pRTV); if (FAILED(hr)) { ods("D3D11: pDevice->CreateRenderTargetView failed!"); return false; } pDeviceContext->OMSetRenderTargets(1, &pRTV, NULL); // Settings for an "over" operation. // https://en.wikipedia.org/w/index.php?title=Alpha_compositing&oldid=580659153#Description D3D11_BLEND_DESC blend; ZeroMemory(&blend, sizeof(blend)); blend.RenderTarget[0].BlendEnable = TRUE; blend.RenderTarget[0].SrcBlend = D3D11_BLEND_ONE; blend.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA; blend.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD; blend.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE; blend.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA; blend.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD; blend.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; pDevice->CreateBlendState(&blend, &pBlendState); if (FAILED(hr)) { ods("D3D11: pDevice->CreateBlendState failed!"); return false; } pDeviceContext->OMSetBlendState(pBlendState, NULL, 0xffffffff); hr = pDevice->CreateVertexShader(g_vertex_shader, sizeof(g_vertex_shader), NULL, &pVertexShader); if (FAILED(hr)) { ods("D3D11: Failed to create vertex shader."); return false; } hr = pDevice->CreatePixelShader(g_pixel_shader, sizeof(g_pixel_shader), NULL, &pPixelShader); if (FAILED(hr)) { ods("D3D11: Failed to create pixel shader."); return false; } pTexture = NULL; pSRView = NULL; // Define the input layout D3D11_INPUT_ELEMENT_DESC layout[] = { { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }, }; hr = pDevice->CreateInputLayout(layout, ARRAY_NUM_ELEMENTS(layout), g_vertex_shader, sizeof(g_vertex_shader), &pVertexLayout); if (FAILED(hr)) { ods("D3D11: pDevice->CreateInputLayout failure!"); return false; } pDeviceContext->IASetInputLayout(pVertexLayout); D3D11_BUFFER_DESC bd; ZeroMemory(&bd, sizeof(bd)); bd.Usage = D3D11_USAGE_DYNAMIC; bd.ByteWidth = VERTEXBUFFER_SIZE; bd.BindFlags = D3D11_BIND_VERTEX_BUFFER; bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; bd.MiscFlags = 0; hr = pDevice->CreateBuffer(&bd, NULL, &pVertexBuffer); if (FAILED(hr)) { ods("D3D11: pDevice->CreateBuffer failure!"); return false; } DWORD indices[] = { 0,1,3, 1,2,3, }; ZeroMemory(&bd, sizeof(bd)); bd.Usage = D3D11_USAGE_IMMUTABLE; bd.ByteWidth = sizeof(DWORD) * 6; bd.BindFlags = D3D11_BIND_INDEX_BUFFER; bd.CPUAccessFlags = 0; bd.MiscFlags = 0; D3D11_SUBRESOURCE_DATA InitData; ZeroMemory(&InitData, sizeof(InitData)); InitData.pSysMem = indices; hr = pDevice->CreateBuffer(&bd, &InitData, &pIndexBuffer); if (FAILED(hr)) { ods("D3D11: pDevice->CreateBuffer failure!"); return false; } // Set index buffer pDeviceContext->IASetIndexBuffer(pIndexBuffer, DXGI_FORMAT_R32_UINT, 0); // Set primitive topology pDeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); if (!bDeferredContext) { pMyStateBlock->Capture(); pOrigStateBlock->Apply(); } pBackBuffer->Release(); return true; } D11State::~D11State() { if (pBlendState) pBlendState->Release(); if (pVertexBuffer) pVertexBuffer->Release(); if (pIndexBuffer) pIndexBuffer->Release(); if (pVertexLayout) pVertexLayout->Release(); if (pVertexShader) pVertexShader->Release(); if (pPixelShader) pPixelShader->Release(); if (pRTV) pRTV->Release(); if (pTexture) pTexture->Release(); if (pSRView) pSRView->Release(); delete pMyStateBlock; pMyStateBlock = NULL; delete pOrigStateBlock; pOrigStateBlock = NULL; if (pDeviceContext) pDeviceContext->Release(); } void D11State::draw() { clock_t t = clock(); float elapsed = static_cast(t - timeT) / CLOCKS_PER_SEC; ++frameCount; if (elapsed > OVERLAY_FPS_INTERVAL) { OverlayMsg om; om.omh.uiMagic = OVERLAY_MAGIC_NUMBER; om.omh.uiType = OVERLAY_MSGTYPE_FPS; om.omh.iLength = sizeof(OverlayMsgFps); om.omf.fps = frameCount / elapsed; sendMessage(om); frameCount = 0; timeT = t; } checkMessage(static_cast(vp.Width), static_cast(vp.Height)); if (a_ucTexture && pSRView && (uiLeft != uiRight)) { if (!bDeferredContext) { pOrigStateBlock->Capture(); pMyStateBlock->Apply(); } // Set vertex buffer UINT stride = sizeof(SimpleVertex); UINT offset = 0; pDeviceContext->IASetVertexBuffers(0, 1, &pVertexBuffer, &stride, &offset); pDeviceContext->VSSetShader(pVertexShader, NULL, 0); pDeviceContext->GSSetShader(NULL, NULL, 0); pDeviceContext->PSSetShaderResources(0, 1, &pSRView); pDeviceContext->PSSetShader(pPixelShader, NULL, 0); pDeviceContext->DrawIndexed(6, 0, 0); if (bDeferredContext) { ID3D11CommandList *pCommandList; pDeviceContext->FinishCommandList(TRUE, &pCommandList); ID3D11DeviceContext *ctx = NULL; pDevice->GetImmediateContext(&ctx); ctx->ExecuteCommandList(pCommandList, TRUE); ctx->Release(); pCommandList->Release(); } else { pDeviceContext->Flush(); pMyStateBlock->Capture(); pOrigStateBlock->Apply(); } } } // D3D11 specific logic for the Present function. extern void presentD3D11(IDXGISwapChain *pSwapChain) { ID3D11Device *pDevice = NULL; HRESULT hr = pSwapChain->GetDevice(__uuidof(ID3D11Device), (void **) &pDevice); if (SUCCEEDED(hr) && pDevice) { SwapchainMap::iterator it = chains.find(pSwapChain); D11State *ds = it != chains.end() ? it->second : NULL; if (ds && ds->pDevice != pDevice) { ods("D3D11: SwapChain device changed"); devices.erase(ds->pDevice); delete ds; ds = NULL; } if (ds == NULL) { ods("D3D11: New state"); ds = new D11State(pSwapChain, pDevice); if (!ds->init()) { pDevice->Release(); delete ds; return; } chains[pSwapChain] = ds; devices[pDevice] = ds; } ds->draw(); pDevice->Release(); } else { #ifdef EXTENDED_OVERLAY_DEBUGOUTPUT // DXGI is used for multiple D3D versions. Thus, this is expected if // another version is used (like D3D10). ods("D3D11: Could not draw because ID3D11Device could not be retrieved."); #endif } } extern void resizeD3D11(IDXGISwapChain *pSwapChain) { // Remove the D11State from our "cache" (= Invalidate) SwapchainMap::iterator it = chains.find(pSwapChain); if (it != chains.end()) { D11State *ds = it->second; devices.erase(ds->pDevice); chains.erase(pSwapChain); delete ds; } } static ULONG __stdcall myAddRef(ID3D11Device *pDevice) { //TODO: Move logic to HardHook. // Call base without active hook in case of no trampoline. AddRefType oAddRef = (AddRefType) hhAddRef.call; hhAddRef.restore(); ULONG res = oAddRef(pDevice); hhAddRef.inject(); Mutex m; DeviceMap::iterator it = devices.find(pDevice); if (it != devices.end()) { it->second->lHighMark = res; } return res; } static ULONG __stdcall myRelease(ID3D11Device *pDevice) { //TODO: Move logic to HardHook. // Call base without active hook in case of no trampoline. ReleaseType oRelease = (ReleaseType) hhRelease.call; hhRelease.restore(); ULONG res = oRelease(pDevice); hhRelease.inject(); Mutex m; DeviceMap::iterator it = devices.find(pDevice); if (it != devices.end()) { D11State *ds = it->second; // If we are receiving a lot of subsequent releases lets eagerly drop // our state object. If the device presents something again a state // object is created again just fine anyway. if (res < ds->lHighMark / 2) { ods("D3D11: Deleting resources %u < 0.5 * %u", res, ds->lHighMark); devices.erase(it); chains.erase(ds->pSwapChain); delete ds; ods("D3D11: Deleted"); ds = NULL; } } return res; } static void HookAddRelease(voidFunc vfAdd, voidFunc vfRelease) { ods("D3D11: Injecting device add/remove"); hhAddRef.setup(vfAdd, reinterpret_cast(myAddRef)); hhRelease.setup(vfRelease, reinterpret_cast(myRelease)); } void hookD3D11(HMODULE hD3D11, bool preonly); void checkDXGI11Hook(bool preonly) { static bool bCheckHookActive = false; if (bCheckHookActive) { ods("D3D11: Recursion in checkDXGI11Hook"); return; } if (d3d11->offsetAddRef == 0 || d3d11->offsetRelease == 0) { return; } bCheckHookActive = true; HMODULE hDXGI = GetModuleHandleW(L"DXGI.DLL"); HMODULE hD3D11 = GetModuleHandleW(L"D3D11.DLL"); if (hDXGI && hD3D11) { if (! bHooked) { hookD3D11(hD3D11, preonly); } } else { #ifdef EXTENDED_OVERLAY_DEBUGOUTPUT if (hDXGI) { ods("D3D11: No DXGI.DLL found as loaded. No hooking at this point."); } else { ods("D3D11: No D3D11.DLL found as loaded. No hooking at this point."); } #endif } bCheckHookActive = false; } /// @param hD3D11 must be a valid module handle void hookD3D11(HMODULE hD3D11, bool preonly) { // Add a ref to ourselves; we do NOT want to get unloaded directly from this process. HMODULE hTempSelf = NULL; GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, reinterpret_cast(&hookD3D11), &hTempSelf); bHooked = true; const int modulenamesize = MODULEFILEPATH_BUFLEN; wchar_t modulename[modulenamesize]; GetModuleFileNameW(hD3D11, modulename, modulenamesize); if (_wcsicmp(d3d11->wcFileName, modulename) == 0) { unsigned char *raw = (unsigned char *) hD3D11; HookAddRelease((voidFunc)(raw + d3d11->offsetAddRef), (voidFunc)(raw + d3d11->offsetRelease)); } else if (! preonly) { ods("D3D11: Interface changed, can't rawpatch. Current: %ls ; Previously: %ls", modulename, d3d11->wcFileName); } else { bHooked = false; } } /// Prepares DXGI and D3D11 data by trying to determine the module filepath /// and function offsets in memory. /// (This data can later be used for hooking / code injection.) /// /// Adjusts the data behind the global variables dxgi and d3d11. void PrepareDXGI11(IDXGIAdapter1* pAdapter, bool initializeDXGIData) { if (!dxgi || !d3d11 || !pAdapter) return; ods("D3D11: Preparing static data for DXGI and D3D11 Injection"); d3d11->wcFileName[0] = 0; d3d11->offsetAddRef = 0; d3d11->offsetRelease = 0; HMODULE hD3D11 = LoadLibrary("D3D11.DLL"); if (hD3D11 != NULL) { HWND hwnd = CreateWindowW(L"STATIC", L"Mumble DXGI Window", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, 0, NULL, NULL, 0); D3D11CreateDeviceAndSwapChainType pD3D11CreateDeviceAndSwapChain = reinterpret_cast(GetProcAddress(hD3D11, "D3D11CreateDeviceAndSwapChain")); DXGI_SWAP_CHAIN_DESC desc; ZeroMemory(&desc, sizeof(desc)); RECT rcWnd; BOOL success = GetClientRect(hwnd, &rcWnd); if (success) { desc.BufferDesc.Width = rcWnd.right - rcWnd.left; desc.BufferDesc.Height = rcWnd.bottom - rcWnd.top; ods("D3D11: Got ClientRect W %d H %d", desc.BufferDesc.Width, desc.BufferDesc.Height); desc.BufferDesc.RefreshRate.Numerator = 60; desc.BufferDesc.RefreshRate.Denominator = 1; desc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; desc.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED; desc.BufferDesc.Scaling = DXGI_MODE_SCALING_CENTERED; desc.SampleDesc.Count = 1; desc.SampleDesc.Quality = 0; desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; desc.BufferCount = 2; desc.OutputWindow = hwnd; desc.Windowed = true; desc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; IDXGISwapChain *pSwapChain = NULL; ID3D11Device *pDevice = NULL; D3D_FEATURE_LEVEL featureLevel; ID3D11DeviceContext *pDeviceContext = NULL; HRESULT hr = pD3D11CreateDeviceAndSwapChain(pAdapter, D3D_DRIVER_TYPE_UNKNOWN, NULL, 0, NULL, 0, D3D11_SDK_VERSION, &desc, &pSwapChain, &pDevice, &featureLevel, &pDeviceContext); if (FAILED(hr)) ods("D3D11: pD3D11CreateDeviceAndSwapChain failure!"); if (pDevice && pDeviceContext && pSwapChain) { // For VC++ the vtable is located at the base addr. of the object and each function entry is a single pointer. Since p.e. the base classes // of IDXGISwapChain have a total of 8 functions the 8+Xth entry points to the Xth added function in the derived interface. void ***vtbl = (void ***) pSwapChain; void *pPresent = (*vtbl)[8]; boost::optional offset = GetFnOffsetInModule(reinterpret_cast(pPresent), dxgi->wcFileName, ARRAY_NUM_ELEMENTS(dxgi->wcFileName), "D3D11", "Present"); if (offset) { if (initializeDXGIData) { dxgi->offsetPresent = *offset; ods("D3D11: Successfully found Present offset: %ls: %d", dxgi->wcFileName, dxgi->offsetPresent); } else { if (dxgi->offsetPresent == *offset) { ods("D3D11: Successfully verified Present offset: %ls: %d", dxgi->wcFileName, dxgi->offsetPresent); } else { ods("D3D11: Failed to verify Present offset for %ls. Found %d, but previously found %d.", dxgi->wcFileName, offset, dxgi->offsetPresent); } } } void *pResize = (*vtbl)[13]; offset = GetFnOffsetInModule(reinterpret_cast(pResize), dxgi->wcFileName, ARRAY_NUM_ELEMENTS(dxgi->wcFileName), "D3D11", "ResizeBuffers"); if (offset) { if (initializeDXGIData) { dxgi->offsetResize = *offset; ods("D3D11: Successfully found ResizeBuffers offset: %ls: %d", dxgi->wcFileName, dxgi->offsetResize); } else { if (dxgi->offsetResize == *offset) { ods("D3D11: Successfully verified ResizeBuffers offset: %ls: %d", dxgi->wcFileName, dxgi->offsetResize); } else { ods("D3D11: Failed to verify ResizeBuffers offset for %ls. Found %d, but previously found %d.", dxgi->wcFileName, offset, dxgi->offsetResize); } } } vtbl = (void ***) pDevice; void *pAddRef = (*vtbl)[1]; offset = GetFnOffsetInModule(reinterpret_cast(pAddRef), d3d11->wcFileName, ARRAY_NUM_ELEMENTS(d3d11->wcFileName), "D3D11", "AddRef"); if (offset) { d3d11->offsetAddRef = *offset; ods("D3D11: Successfully found AddRef offset: %ls: %d", d3d11->wcFileName, d3d11->offsetAddRef); } void *pRelease = (*vtbl)[2]; offset = GetFnOffsetInModule(reinterpret_cast(pRelease), d3d11->wcFileName, ARRAY_NUM_ELEMENTS(d3d11->wcFileName), "D3D11", "Release"); if (offset) { d3d11->offsetRelease = *offset; ods("D3D11: Successfully found Release offset: %ls: %d", d3d11->wcFileName, d3d11->offsetRelease); } } if (pDevice) pDevice->Release(); if (pDeviceContext) pDeviceContext->Release(); if (pSwapChain) pSwapChain->Release(); } else { FreeLibrary(hD3D11); } DestroyWindow(hwnd); } else { FreeLibrary(hD3D11); } } mumble-1.3.4/overlay/HardHook_x86.cpp0000664000175000017500000002725414010707273017244 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "HardHook.h" #include "ods.h" void *HardHook::pCode = NULL; unsigned int HardHook::uiCode = 0; const int HardHook::CODEREPLACESIZE = 6; const int HardHook::CODEPROTECTSIZE = 16; /** * @brief Constructs a new hook without actually injecting. */ HardHook::HardHook() : bTrampoline(false), call(0), baseptr(NULL) { for (int i = 0; i < CODEREPLACESIZE; ++i) { orig[i] = replace[i] = 0; } // assert(CODEREPLACESIZE == sizeof(orig) / sizeof(orig[0])); // assert(CODEREPLACESIZE == sizeof(replace) / sizeof(replace[0])); } /** * @brief Constructs a new hook by injecting given replacement function into func. * @see HardHook::setup * @param func Funktion to inject replacement into. * @param replacement Function to inject into func. */ HardHook::HardHook(voidFunc func, voidFunc replacement) : bTrampoline(false), call(0), baseptr(NULL) { for (int i = 0; i < CODEREPLACESIZE; ++i) orig[i] = replace[i] = 0; setup(func, replacement); } /** * @return Number of extra bytes. */ static unsigned int modrmbytes(unsigned char a, unsigned char b) { unsigned char lower = (a & 0x0f); if (a >= 0xc0) { return 0; } else if (a >= 0x80) { if ((lower == 4) || (lower == 12)) return 5; else return 4; } else if (a >= 0x40) { if ((lower == 4) || (lower == 12)) return 2; else return 1; } else { if ((lower == 4) || (lower == 12)) { if ((b & 0x07) == 0x05) return 5; else return 1; } else if ((lower == 5) || (lower == 13)) return 4; return 0; } } /** * @brief Tries to construct a trampoline from original code. * * A trampoline is the replacement code that features the original code plus * a jump back to the original instructions that follow. * It is called to execute the original behavior. As it is a replacement for * the original, the original can then be overwritten. * The size of the trampoline is at least CODEREPLACESIZE. Thus, CODEREPLACESIZE * bytes of the original code can afterwards be overwritten (and the trampoline * called after those instructions for the original logic). * CODEREPLACESIZE has to be smaller than CODEPROTECTSIZE. * * As commands must not be destroyed they have to be disassembled to get their length. * All encountered commands will be part of the trampoline and stored in pCode (shared * for all trampolines). * * If code is encountered that can not be moved into the trampoline (conditionals etc.) * construction fails and NULL is returned. If enough commands can be saved the * trampoline is finalized by appending a jump back to the original code. The return value * in this case will be the address of the newly constructed trampoline. * * pCode + offset to trampoline: * [SAVED CODE FROM ORIGINAL which is >= CODEREPLACESIZE bytes][JUMP BACK TO ORIGINAL CODE] * * @param porig Original code * @return Pointer to trampoline on success. NULL if trampoline construction failed. */ void *HardHook::cloneCode(void **porig) { if (! pCode || uiCode > 4000) { pCode = VirtualAlloc(NULL, 4096, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); uiCode = 0; } // If we have no memory to clone to, return. if (! pCode) { return NULL; } unsigned char *o = (unsigned char *) *porig; DWORD origProtect; if (!VirtualProtect(o, CODEPROTECTSIZE, PAGE_EXECUTE_READ, &origProtect)) { fods("HardHook: CloneCode failed; failed to make original code read and executable"); return NULL; } // Follow relative jumps to next instruction. On execution it doesn't make // a difference if we actually perform all the jumps or directly jump to the // end of the chain. Hence these jumps need not be part of the trampoline. while (*o == 0xe9) { // JMP unsigned char *tmp = o; int *iptr = reinterpret_cast(o+1); o += *iptr + 5; fods("HardHook: CloneCode: Skipping jump from %p to %p", *porig, o); *porig = o; // Assume jump took us out of our read enabled zone, get rights for the new one DWORD tempProtect; VirtualProtect(tmp, CODEPROTECTSIZE, origProtect, &tempProtect); if (!VirtualProtect(o, CODEPROTECTSIZE, PAGE_EXECUTE_READ, &origProtect)) { fods("HardHook: CloneCode failed; failed to make jump target code read and executable"); return NULL; } } unsigned char *n = (unsigned char *) pCode; n += uiCode; unsigned int idx = 0; do { unsigned char opcode = o[idx]; unsigned char a = o[idx+1]; unsigned char b = o[idx+2]; unsigned int extra = 0; switch (opcode) { case 0x50: // PUSH case 0x51: case 0x52: case 0x53: case 0x54: case 0x55: case 0x56: case 0x57: case 0x58: // POP case 0x59: case 0x5a: case 0x5b: case 0x5c: case 0x5d: case 0x5e: case 0x5f: break; case 0x6a: // PUSH immediate extra = 1; break; case 0x68: // PUSH immediate extra = 4; break; case 0x81: // CMP immediate extra = modrmbytes(a,b) + 5; break; case 0x83: // CMP extra = modrmbytes(a,b) + 2; break; case 0x8b: // MOV extra = modrmbytes(a,b) + 1; break; default: { int rmop = ((a>>3) & 7); if (opcode == 0xff && rmop == 6) { // PUSH memory extra = modrmbytes(a,b) + 1; break; } fods("HardHook: CloneCode failed; Unknown opcode %02x at %d: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x", opcode, idx, o[0], o[1], o[2], o[3], o[4], o[5], o[6], o[7], o[8], o[9], o[10], o[11]); DWORD tempProtect; VirtualProtect(o, CODEPROTECTSIZE, origProtect, &tempProtect); return NULL; break; } } n[idx] = opcode; ++idx; for (unsigned int i = 0; i < extra; ++i) n[idx+i] = o[idx+i]; idx += extra; } while (idx < CODEREPLACESIZE); DWORD tempProtect; VirtualProtect(o, CODEPROTECTSIZE, origProtect, &tempProtect); // Add a relative jmp back to the original code, to after the copied code n[idx++] = 0xe9; int *iptr = reinterpret_cast(&n[idx]); const int JMP_OP_SIZE = 5; int offs = o - n - JMP_OP_SIZE; *iptr = offs; idx += 4; uiCode += idx; FlushInstructionCache(GetCurrentProcess(), n, idx); fods("HardHook: trampoline creation successful at %p", n); return n; } /** * @brief Makes sure the given replacement function is run once func is called. * * Tries to construct a trampoline for the given function (@see HardHook::cloneCode) * and then injects replacement function calling code into the first 6 bytes of the * original function (@see HardHook::inject). * * @param func Pointer to function to redirect. * @param replacement Pointer to code to redirect to. */ void HardHook::setup(voidFunc func, voidFunc replacement) { if (baseptr) return; fods("HardHook: Setup: Asked to replace %p with %p", func, replacement); unsigned char *fptr = reinterpret_cast(func); unsigned char *nptr = reinterpret_cast(replacement); call = (voidFunc) cloneCode((void **) &fptr); if (call) { bTrampoline = true; } else { // Could not create a trampoline. Use alternative method instead. // This alternative method is dependant on the replacement code // restoring before calling the original. Otherwise we get a jump recursion bTrampoline = false; call = func; } DWORD origProtect; if (VirtualProtect(fptr, CODEPROTECTSIZE, PAGE_EXECUTE_READ, &origProtect)) { replace[0] = 0x68; // PUSH immediate 1 Byte unsigned char **iptr = reinterpret_cast(&replace[1]); *iptr = nptr; // (imm. value = nptr) 4 Byte replace[5] = 0xc3; // RETN 1 Byte // Save original 6 bytes at start of original function for (int i = 0; i < CODEREPLACESIZE; ++i) orig[i] = fptr[i]; baseptr = fptr; inject(true); DWORD tempProtect; VirtualProtect(fptr, CODEPROTECTSIZE, origProtect, &tempProtect); } else { fods("HardHook: setup failed; failed to make original code read and executable"); } } void HardHook::setupInterface(IUnknown *unkn, LONG funcoffset, voidFunc replacement) { fods("HardHook: setupInterface: Replacing %p function #%ld", unkn, funcoffset); void **ptr = reinterpret_cast(unkn); ptr = reinterpret_cast(ptr[0]); setup(reinterpret_cast(ptr[funcoffset]), replacement); } void HardHook::reset() { baseptr = 0; bTrampoline = false; call = NULL; for (int i = 0; i < CODEREPLACESIZE; ++i) { orig[i] = replace[i] = 0; } } /** * @brief Injects redirection code into the target function. * * Replaces the first 6 Bytes of the function indicated by baseptr * with the replacement code previously generated (usually a jump * to mumble code). If a trampoline is available this injection is not needed * as control flow was already permanently redirected by HardHook::setup . * * @param force Perform injection even when trampoline is available. */ void HardHook::inject(bool force) { if (! baseptr) return; if (! force && bTrampoline) return; DWORD origProtect; if (VirtualProtect(baseptr, CODEREPLACESIZE, PAGE_EXECUTE_READWRITE, &origProtect)) { for (int i = 0; i < CODEREPLACESIZE; ++i) { baseptr[i] = replace[i]; // Replace with jump to new code } DWORD tempProtect; VirtualProtect(baseptr, CODEREPLACESIZE, origProtect, &tempProtect); FlushInstructionCache(GetCurrentProcess(), baseptr, CODEREPLACESIZE); } // Verify that the injection was successful for (int i = 0; i < CODEREPLACESIZE; ++i) { if (baseptr[i] != replace[i]) { fods("HardHook: Injection failure noticed at byte %d", i); } } } /** * @brief Restores the original code in a target function. * * Restores the first 6 Bytes of the function indicated by baseptr * from previously stored original code in orig. If a trampoline is available this * restoration is not needed as trampoline will correctly restore control * flow. * * @param force If true injection will be reverted even when trampoline is available. */ void HardHook::restore(bool force) { if (! baseptr) return; if (! force && bTrampoline) return; DWORD origProtect; if (VirtualProtect(baseptr, CODEREPLACESIZE, PAGE_EXECUTE_READWRITE, &origProtect)) { for (int i = 0; i < CODEREPLACESIZE; ++i) baseptr[i] = orig[i]; DWORD tempProtect; VirtualProtect(baseptr, CODEREPLACESIZE, origProtect, &tempProtect); FlushInstructionCache(GetCurrentProcess(), baseptr, CODEREPLACESIZE); } } void HardHook::print() { fods("HardHook: code replacement: %02x %02x %02x %02x %02x => %02x %02x %02x %02x %02x (currently effective: %02x %02x %02x %02x %02x)", orig[0], orig[1], orig[2], orig[3], orig[4], replace[0], replace[1], replace[2], replace[3], replace[4], baseptr[0], baseptr[1], baseptr[2], baseptr[3], baseptr[4]); } /** * @brief Checks whether injected code is in good shape and injects if not yet injected. * * If injected code is not found injection is attempted unless 3rd party overwrote * original code at injection location. */ void HardHook::check() { if (memcmp(baseptr, replace, CODEREPLACESIZE) != 0) { // The instructions do not match our replacement instructions // If they match the original code, inject our hook. if (memcmp(baseptr, orig, CODEREPLACESIZE) == 0) { fods("HardHook: Reinjecting hook into function %p", baseptr); inject(true); } else { fods("HardHook: Function %p replaced by third party. Lost injected hook."); } } } mumble-1.3.4/overlay/overlay11-common.hlsl0000664000175000017500000000414114010707273020317 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . /* Copyright (C) 2011-2013, Nye Liu All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Mumble Developers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ Texture2D txDiffuse; SamplerState samLinear { Filter = MIN_MAG_MIP_LINEAR; AddressU = Wrap; AddressV = Wrap; }; struct VS_INPUT { float4 Pos : POSITION; float2 Tex : TEXCOORD; }; struct PS_INPUT { float4 Pos : SV_POSITION; float2 Tex : TEXCOORD0; }; mumble-1.3.4/overlay/ods.cpp0000664000175000017500000000201514010707273015611 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include #include #include #include "ods.h" void __cdecl _ods_out(const char *format, va_list *args) { char buf[4096], *p = buf + 2; buf[0] = 'M'; // Add a prefix buf[1] = ':'; // Format but be aware of space taken by prefix int len = _vsnprintf_s(p, sizeof(buf) - 3, _TRUNCATE, format, *args); if (len <= 0) return; p += len; // Truncate trailing spaces while (p > (buf + 2) && isspace(p[-1])) *--p = '\0'; // Add custom termination if (p > (buf + sizeof(buf) - 3)) { // Make sure there's space p = buf + sizeof(buf) - 3; } *p++ = '\r'; *p++ = '\n'; *p = '\0'; OutputDebugStringA(buf); } void __cdecl fods(const char *format, ...) { va_list args; va_start(args, format); _ods_out(format, &args); va_end(args); } mumble-1.3.4/overlay/HardHook_minhook.h0000664000175000017500000000171314010707273017720 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_HARDHOOK_MINHOOK_H_ #define MUMBLE_HARDHOOK_MINHOOK_H_ #define _UNICODE #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif #include #include #include #include #include #include #include #include typedef void *(*voidFunc)(); struct HardHook { voidFunc m_func; voidFunc m_replacement; voidFunc call; HardHook(); HardHook(voidFunc func, voidFunc replacement); void setup(voidFunc func, voidFunc replacement); void setupInterface(IUnknown *intf, LONG funcoffset, voidFunc replacement); void reset(); void inject(bool force = false); void restore(bool force = false); void print(); void check(); }; #endif mumble-1.3.4/installer/0000775000175000017500000000000014010707273014636 5ustar builderbuildermumble-1.3.4/installer/MumbleUCRTComponentRefs.wxi0000664000175000017500000000472314010707273022017 0ustar builderbuilder mumble-1.3.4/installer/lgpl.txt0000664000175000017500000006350414010707273016345 0ustar builderbuilder GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! mumble-1.3.4/installer/UI.wxs0000664000175000017500000001060514010707273015720 0ustar builderbuilder 1 NOT Installed Installed AND PATCH 1 LicenseAccepted = "1" Installed NOT Installed 1 NOT Installed OR WixUI_InstallMode = "Change" Installed AND NOT PATCH Installed AND PATCH 1 1 1 1 1 mumble-1.3.4/installer/Translations/0000775000175000017500000000000014010707273017317 5ustar builderbuildermumble-1.3.4/installer/Translations/Norwegian.wxl0000664000175000017500000000662014010707273022010 0ustar builderbuilder 1044 Lag snarvei på skrivebordet Doner til Mumble DBus demonen som Mumble bruker kjører for øyeblikket. Avslutte demonen så den kan oppdateres? Mumble krever SSE, en prosessorutvidelse som bare finnes på Intel Pentium III, AMD Athlon XP og nyerer prosessorer. SSE er ikke støttet av din prosessor, og det er usannsynlig at Mumble vil fungere. Ønsker du fortsatt å installerer Mumble? Mumble krever Windows XP SP2 eller nyere. Du bruker et eldre og inkompatibelt operativsystem, og det er usannsynlig at Mumble vil fungere. Ønsker du fortsatt å installerer Mumble? Start Mumble Mumble Lesmeg Mumble Lisens Qt Lisens Speex Lisens Avinstallere Mumble Mumble (Bakoverkompatibel) Full Bare klient Bare server Mumble (klient) Mumble (bakoverkompatibel klient) Murmur (server) Bonjour for Windows Klienten for Mumble, som du trenger for å koble deg til en server. Bakoverkompatibel klient for bruk mot eldre servere. Serveren for Mumble. Inkluderer alt som trengs for å kjøre din egen server. Bonjour annonserer og oppdater Murmur servere på ditt lokale nettverk. Dette vil laste ned og installere Bonjour. Desktop shortcut Creates a shortcut on the desktop Mumble og Murmur Brukerinstillinger og databaser Avinstallere Mumble og Murmur programmer Avinstallere Mumble og Murmur og fjern alle spor av dem, inkludert brukerinstillinger og databaser. Mumble er allerede installert. Det anbefales at du avinstallerer den nåværende versjonen før du installerer. Velg operasjonen du ønsker å gjøre og trykk Neste for å fortsette. Allerede installert Velg hvordan du ønsker å installere Mumble. Avinstaller gammel versjon først Installer over gammel versjon mumble-1.3.4/installer/Translations/Greek.wxl0000664000175000017500000001217514010707273021116 0ustar builderbuilder 1032 Δημιουργία συντόμευσης στην Επιφάνεια Εργασίας Δωρεά στο Mumble Ο δαίμονας DBus που χρησιμοποιείται από το Mumble βρίσκεται σε εκτέλεση. Τερματισμός του δαίμονα έτσι ώστε να μπορέσει να ενημερωθεί; Το Mumble χρειάζεται το SSE, το οποίο είναι ενα χαρακτηριστικό που υπάρχει στους Intel Pentium III, AMD Athlon XP ή και σε νεότερους επεξεργαστές. Το χαρακτηριστικό SSE δεν εντοπίστηκε στον επεξεργαστή σας, και ως εκ τούτου το Mumble μάλλον δεν θα λειτουργεί. Θέλετε ακόμα να εγκαταστήσετε το Mumble; Το Mumble λειτουργεί σε Windows XP SP2 ή νεότερα. Ανιχνεύθηκε ένα παλαιότερο και μη συμβατό λειτουργικό σύστημα, στο οποίο μάλλον δεν θα λειτουργεί το Mumble. Θέλετε ακόμα να εγκαταστήσετε το Mumble; Εκκίνηση του Mumble Mumble ΔιάβασέΜε Άδεια του Mumble Άδεια του Qt Άδεια του Speex Απεγκατάσταση του Mumble Mumble (Παλαιότερη Συμβατότητα) Πλήρης Μόνο την εφαρμογή Μόνο τον διακομιστή Mumble (εφαρμογή) Mumble (εφαρμογή παλαιότερης συμβατότητας) Murmur (διακομιστής) Bonjour για Windows Η εφαρμογή Mumble, την οποία θα χρειαστείτε για να συνδεθείτε σε κάποιον διακομιστή. Η εφαρμογή Mumble για σύνδεση σε παλαιότερους διακομιστές. Ο διακομιστής για το Mumble. Περιλαμβάνει όσα χρειάζονται για να τρέξετε τον δικό σας διακομιστή. Το Bonjour είναι για ανακοίνωση και ανίχνευση διακομιστών Murmur στο τοπικό σας δίκτυο. Αυτό θα κατεβάσει και θα τρέξει την εγκατάσταση του Bonjour. Συντόμευση στην επιφάνεια εργασίας Δημιουργεί μια συντόμευση στην επιφάνεια εργασίας Mumble και Murmur Επιλογές και Βάσεις Δεδομένων Απεγκατάσταση των εφαρμογών Mumble και Murmur Απεγκατάσταση όλων των υπολειμμάτων των Mumble και Murmur, συμπεριλαμβανομένου τις επιλογές και τις βάσεις δεδομένων. Το Mumble είναι ήδη εγκατεστημένο. Συνιστάται η απεγκατάσταση της τωρινής έκδοσης πριν την εγκατάσταση. Επιλέξτε τη λειτουργία που θέλετε να εκτελέσετε και κάντε κλικ στο Επόμενο για να συνεχίσετε. Είναι ήδη εγκατεστημένο Επιλέξτε πώς θέλετε να εγκαταστήσετε το Mumble. Απεγκατάσταση πριν την εγκατάσταση Να μην γίνει απεγκατάσταση mumble-1.3.4/installer/Translations/Italian.wxl0000664000175000017500000000676014010707273021445 0ustar builderbuilder 1040 Crea collegamento sul Desktop Effettua una donazione al progetto Mumble Il DBus utilizzato da Mumble è attualmente in uso. Terminarlo in modo da poter installare l'aggiornamento? Mumble richiede SSE, che è una caratteristica degli Intel Pentium III, AMD Athlon XP o dei processori più nuovi. SSE non è stato trovato sul tuo processore e Mumble potrebbe non funzionare, vuoi continuare l'installazione? Mumble funziona solo su Windows XP SP2 o superiore. Un sistema operativo vecchio è stato riconosciuto e Mumble potrebbe non funzionare, vuoi continuare l'installazione? Avvia Mumble Leggimi di Mumble Licenza di Mumble Licenza di Qt Licenza di Speex Disinstalla Mumble Mumble (Modalità retrocompatibile) Completa Solo Client Solo Server Mumble (Client) Mumble (Client modalità retrocompatibile) Murmur (server) Bonjour per Windows Client di Mumble, quello di cui hai bisogno per connetterti ai server Client di Mumble, quello di cui hai bisogno per connetterti ai server vecchi Il server per Mumble. Include tutto ciò di cui hai bisogno per eseguire il tuo server Bonjour abilita la possibilità di trovare un server Murmur all'interno della tua rete LAN. Questa funzione scaricherà e installerà Bonjour Desktop shortcut Creates a shortcut on the desktop Mumble e Murmur Preferenze e Dati Disinstalla Mumble e Murmur Disinstallazione completa di Mumble e Murmur, comprese le impostazioni e i dati Mumble è già installato. Si raccomanda di disinstallare la versione precedente prima di procedere. Seleziona l'operazione che vuoi portare a termine e premi avanti per continuare Già Installato Scegli come vuoi installare Mumble Disinstallare prima di installare Non disinstallare mumble-1.3.4/installer/Translations/Czech.wxl0000664000175000017500000000663114010707273021115 0ustar builderbuilder 1029 Vytvořit zástupce na ploše Přispět na projekt Mumble DBus daemon,který Mumble používá je právě spuštěn. Ukončit daemon aby mohl být aktualizován? Mumble potřebuje SSE, což je funkce processorů Intel Pentium III, AMD Athlon XP nebo novějších. SSE nebylo nalezeno na vašem processoru, a Mumble asi nebude fungovat. Chcete i přes to nainstalovat Mumble? Mumble bude fungovat jen na Windows XP SP2 nebo novějších. Byl nalezen starši, nebo nekompatibilní operační systém, a Mumble asi nebude fungovat. Chcete i přes to nainstalovat Mumble? Spustit Mumble Mumble Čti Mě Mumble Licence Qt Licence Speex Licence Odninstalovat Mumble Mumble (Zpětně Kompatibilní) Plná instalace Jen Klient Jen Server Mumble (klient) Mumble (zpětně kompatibilní klient) Murmur (server) Bonjour pro Windows Mumble klient, je potřeba k připojení na server. Mumble klient k připojení na starší servery. Server pro Mumble. Obsahuje všechno co je třeba k rozběhnutí vlastního serveru. Bonjour zapne ohlášení a zpřístupění Murmur serverů na vaší LAN. Toto stáhne a spustí Bonjour instalátor. Desktop shortcut Creates a shortcut on the desktop Mumble a Murmur Nastavení a Databáze Odinstalování programů Mumble a Murmur. Odinstaluje všechny stopy po Mumble a Murmur, včetně nastavení a databází. Mumble je již nainstalováno. Je doporučena odinstalace stávájící verze před instalováním nové. Vyberte operaci kterou chcete uskutečnit a stiskněte Další. Již Nainstalováno Zvolte, jak chcete odinstalovat Mumble. Odinstalovat před instalací Neodinstalovat mumble-1.3.4/installer/Translations/TradChinese.wxl0000664000175000017500000000641114010707273022246 0ustar builderbuilder 1028 創建桌面快捷圖標 向 Mumble 項目捐款 Mumble 依賴的 DBus 守護進程目前正在運行。 終止該進程然后繼續升級? Mumble 需要 SSE,該功能被 Intel Pentium III, AMD Athlon XP 或者較新的 CPU 所支持。 您的 CPU 不支持 SSE, Mumble 不能正常工作。您依然要繼續安裝 Mumble 嗎? Mumble 只能運行在 Windows XP SP2 或較新的操作系統上。 現在檢測到了一個老的或者不兼容的操作系統,Mumble 不能正常工作。您依然要繼續安裝 Mumble 嗎? 啟動 Mumble Mumble 自我描敘 Mumble 許可 Qt 許可 Speex 許可 卸載 Mumble Mumble(與老版本兼容) 完全 僅客戶端 僅服務器端 Mumble(客戶端) Mumble(與老版本兼容的客戶端) Murmur(服務器端) Bonjour for Windows 該 Mumble 客戶端用于連接到一個服務器。 該 Mumble 客戶端用于連接到一個老的服務器。 Mumble 服務器端包含所有您運行個人服務器所必須的文件。 Bonjour enables announcement and discovery of Murmur servers on your LAN. This will download and run the Bonjour installer. Desktop shortcut Creates a shortcut on the desktop Mumble 和 Murmur 個人偏好和數據庫 卸載 Mumble 和 Murmur 應用程序 完全卸載 Mumble 和 Murmur, 包括個人偏好和數據庫。 Mumble 已經安裝。 我們建議您安裝之前卸載現有版本。 選擇您想要進行的操作然后點下一步。 已安裝 選擇怎樣安裝 Mumble。 安裝前卸載現有版本 不要卸載現有版本 mumble-1.3.4/installer/Translations/Polish.wxl0000664000175000017500000000722614010707273021320 0ustar builderbuilder 1045 Utwórz skrót na pulpicie Wesprzyj projekt Mumble Proces DBus jest w tej chwili uruchomiony. Czy chcesz zakończyć działanie procesu, aby dokonać aktualizacji? Mumble wymaga SSE, jest to funkcja którą posiadają Intel Pentium III, AMD Athlon XP oraz nowsze procesory. SSE nie zostało wykryte w twoim procesorze więc jest małe prawdopodobieństwo, aby Mumble działało. Czy nadal chcesz zainstalować Mumble? Mumble działa tylko na Windows XP SP2 lub nowszym. Wykryto starszy lub niekompatybilny system operacyjny więc jest małe prawdopodobieństwo, aby Mumble działało. Czy nadal chcesz zainstalować Mumble? Uruchom Mumble Plik Czytaj To Licencja Mumble Mumble (Klient Kompatybilny Wstecz) Licencja Qt Licencja Speex Deinstalacja Mumble Pełny Tylko Klient Tylko Serwer Mumble (Klient) Mumble (Klient Kompatybilny Wstecz) Murmur (Serwer) Bonjour dla Windows Klient Mumble, pozwalający na połączenia do serwerów. Klient Mumble, pozwalający na połączenia do starszych serwerów. Serwer Mumble. Zawiera wszystko czego potrzebujesz by uruchomić swój własny serwer. Bonjour pozwala na automatyczne rozgłaszanie i wykrywanie serwerów Murmur w sieci LAN. Zaznaczając tę opcję instalator Bonjour zostanie pobrany i uruchomiony. Desktop shortcut Creates a shortcut on the desktop Mumble i Murmur Preferencje i bazy danych Usuwa Mumble oraz Murmur. Usuwa wszystkie pliki programu, ustawienia oraz bazy danych (adresy serwerów, loginy, hasła). Mumble jest już zainstalowany na tym komputerze. Zalecane jest usunięcie poprzedniej wersji programu przed instalacją nowej. Wskaż żądaną akcję i kliknij 'Dalej', aby kontynuować. Program jest już zainstalowany Wybierz sposób zainstalacji Mumble. Usuń poprzednią wersję Mumble Nie usuwaj mumble-1.3.4/installer/Translations/English.wxl0000664000175000017500000000656514010707273021460 0ustar builderbuilder 1033 Create Desktop Shortcut Donate to the Mumble project The DBus daemon used by Mumble is currently running. Terminate the daemon so it can be updated? Mumble requires SSE, which is a feature only found on the Intel Pentium III, AMD Athlon XP or newer processors. SSE was not detected on your processor, and Mumble is unlikely to work. Do you still wish to install Mumble? Mumble will only work on Windows XP SP2 or newer. An older and incompatible operating system was detected, and Mumble is unlikely to work. Do you still wish to install Mumble? Start Mumble Mumble Readme Mumble License Qt License Speex License Uninstall Mumble Mumble (Backwards Compatible) Full Client only Server only Mumble (client) Mumble (backwards compatible client) Murmur (server) Bonjour for Windows The Mumble client, which you will need to connect to a server. The Mumble client for connecting to older servers. The server for Mumble. Includes everything needed to run your own server. Bonjour enables announcement and discovery of Murmur servers on your LAN. This will download and run the Bonjour installer. Desktop shortcut Creates a shortcut on the desktop Mumble and Murmur Preferences and Databases Uninstall Mumble and Murmur programs Uninstall all traces of Mumble and Murmur, including preferences and databases. Mumble is already installed. It's recommended that you uninstall the current version before installing. Select the operation you want to perform and click Next to continue. Already Installed Choose how you want to install Mumble. Uninstall before installing Do not uninstall mumble-1.3.4/installer/Translations/SimpChinese.wxl0000664000175000017500000000641114010707273022264 0ustar builderbuilder 2052 创建桌面快捷图标 向 Mumble 项目捐款 Mumble 依赖的 DBus 守护进程目前正在运行。 终止该进程然后继续升级? Mumble 需要 SSE,该功能被 Intel Pentium III, AMD Athlon XP 或者较新的 CPU 所支持。 您的 CPU 不支持 SSE, Mumble 不能正常工作。您依然要继续安装 Mumble 吗? Mumble 只能运行在 Windows XP SP2 或较新的操作系统上。 现在检测到了一个老的或者不兼容的操作系统,Mumble 不能正常工作。您依然要继续安装 Mumble 吗? 启动 Mumble Mumble 自我描叙 Mumble 许可 Qt 许可 Speex 许可 卸载 Mumble Mumble(与老版本兼容) 完全 仅客户端 仅服务器端 Mumble(客户端) Mumble(与老版本兼容的客户端) Murmur(服务器端) Bonjour for Windows 该 Mumble 客户端用于连接到一个服务器。 该 Mumble 客户端用于连接到一个老的服务器。 Mumble 服务器端包含所有您运行个人服务器所必须的文件。 Bonjour enables announcement and discovery of Murmur servers on your LAN. This will download and run the Bonjour installer. Desktop shortcut Creates a shortcut on the desktop Mumble 和 Murmur 个人偏好和数据库 卸载 Mumble 和 Murmur 应用程序 完全卸载 Mumble 和 Murmur, 包括个人偏好和数据库。 Mumble 已经安装。 我们建议您安装之前卸载现有版本。 选择您想要进行的操作然后点下一步。 已安装 选择怎样安装 Mumble。 安装前卸载现有版本 不要卸载现有版本 mumble-1.3.4/installer/Translations/Russian.wxl0000664000175000017500000001074414010707273021505 0ustar builderbuilder 1049 Создать ярлык на Рабочем столе Пожертвовать проекту Mumble Демон DBus, который используется Mumble уже запущен. Завершить его процесс, чтобы его можно было обновить? Mumble использует SSE (потоковое SIMD-расширение процессора), которое используется только на процессорах Intel Pentium III, AMD Athlon XP или более новых. SSE не был обнаружен на Вашем процессоре и Mumble может не работать. Вы все еще желаете установить Mumble? Mumble работает только на Windows XP SP2 или более новых версиях Windows. Была обнаружена старая или несовместимая операционная система. Mumble может не работать. Вы все еще желаете установить Mumble? Запуск Mumble Mumble инфо Лицензия Mumble Лицензия Qt Лицензия Speex Удалить Mumble Mumble (обратная совместимость) Полная Только клиент Только сервер Mumble (клиент) Mumble (клиент обратной совместимости) Murmur (сервер) Bonjour для Windows Mumble клиент, который нужен Вам для подключения к серверу. Mumble клиент для подключения к старым серверам. Сервер для Mumble. Включает в себя все необходимое для запуска своего собственного сервера. Bonjour позволяет анонсировать и находить сервера Murmur в Вашей локальной сети. Это позволит загрузить и запустить программу установки Bonjour. Desktop shortcut Creates a shortcut on the desktop Mumble и Murmur Настройки и Базы данных Удалить Mumble и Murmur Удалить все следы Mumble и Murmur, включая настройки и базы данных. Mumble уже установлен на Вашем компьютере. Рекомендуется удалить текущую версию перед установкой. Выберите операцию, которую Вы желаете выполнить и нажмите кнопку Далее. Уже установлено Выберите, каким образом Вы хотите установить Mumble. Удалить перед установкой Не удалять mumble-1.3.4/installer/Translations/Turkish.wxl0000664000175000017500000000710714010707273021511 0ustar builderbuilder 1055 Masaüstünde kısayol oluştur Mumble projesine bağışta bulun Mumble tarafından kullanılan DBus servisi (daemon) hâlihazırda çalışmaktadır. Güncellenebilmesi için servis durdurulsun mu? Mumble sadece Intel Pentium III, AMD Athlon XP ve daha yeni mikroişlemcilerde bulunan SSE komut kümesine ihtiyaç duyar. SSE mikroişlemcinizde tespit edilememiştir ve Mumble muhtemelen çalışamayacaktır. Buna rağmen Mumble'ı kurmak istiyor musunuz? Mumble sadece Windows XP SP2 ve daha yeni sürümlerde çalışır. Daha eski ve uyumsuz bir işletim sistemi tespit edilmiştir ve Mumble muhtemelen çalışmayacaktır. Buna rağmen Mumble'ı kurmak istiyor musunuz? Mumble'ı Başlat Mumble Readme Mumble Lisansı Qt Lisansı Speex Lisansı Mumble'ı Kaldır Mumble (Geriye Uyumlu) Tam kurulum Sadece istemci Sadece sunucu Mumble (istemci) Mumble (geriye uyumlu istemci) Murmur (sunucu) Windows için Bonjour Bir sunucuya bağlanmak için ihtiyaç duyacağınız Mumble istemcisi. Eski sunuculara bağlanmak için Mumble istemcisi. Mumble için sunucu. Kendi sunucunuzu işletmeniz için gereken her şeyi içerir. Bonjour yerel ağınızda Murmur sunucularının duyurulmalarına ve keşiflerine imkân sağlar. Bu seçenek Bonjour kurucusunu indirir ve çalıştırır. Desktop shortcut Creates a shortcut on the desktop Mumble ve Murmur Tercihler ve Veritabanları Mumble ve Murmur programlarını Kaldır Mumble ve Murmur'ın tüm izlerini sil, ki bu tercihleri ve veritabanlarını da kapsar. Mumble zaten kuruludur. Kurulumdan önce mevcut sürümü kaldırmanız tavsiye edilir. Gerçekleştirmek istediğiniz işlemi seçiniz ve devam etmek için İleri düğmesine tıklayınız. Zaten Kurulu Mumble'ı nasıl kurmak istediğinizi seçiniz. Kurulumdan evvel kaldır Kaldırma mumble-1.3.4/installer/Translations/Swedish.wxl0000664000175000017500000000672114010707273021467 0ustar builderbuilder 1053 Skapa genväg på skrivbordet Donera till projektet för Mumble DBus-demonen som används av Mumble körs för närvarande. Avsluta demonen så att den kan uppdateras? Mumble kräver SSE som är en funktion hittad på processorer såsom Intel Pentium III, AMD Athlon XP eller nyare. SSE hittades inte på din processor och Mumble verkar inte fungera. Vill du fortfarande installera Mumble? Mumble fungerar bara på Windows XP SP2 eller senare. Ett äldre och inkompatibelt operativsystem hittades och Mumble verkar inte fungera. Vill du fortfarande installera Mumble? Starta Mumble Läs mig för Mumble Licens för Mumble Licens för Qt Licens för Speex Avinstallera Mumble Mumble (Bakåtkompatibel) Fullständig Endast klient Endast server Mumble (klient) Mumble (bakåtkompatibel klient) Murmur (server) Bonjour för Windows Klienten för Mumble, som du behöver för att ansluta till servrar. Klienten för Mumble att ansluta till äldre servrar. Servern för Mumble. Inkluderar allt du behöver för att köra din egen server. Bonjour tillåter annonsering och upptäckning av Murmur servrar på ditt LAN. Detta kommer att ladda ner och köra installationen för Bonjour. Desktop shortcut Creates a shortcut on the desktop Mumble och Murmur Inställningar och databaser Avinstallera program för Mumble och Murmur Avinstallera Mumble och Murmur fullständigt, vilket inkluderar inställningar och databaser. Mumble är redan installerat. Det är rekommenderat att du avinstallerar den nuvarande versionen innan du påbörjar den nya installation. Välj vad du vill utföra och tryck på Nästa för att fortsätta. Redan installerat Välj hur du vill installera Mumble. Avinstallera före installation Avinstallera inte mumble-1.3.4/installer/Translations/Spanish.wxl0000664000175000017500000000677414010707273021476 0ustar builderbuilder 1034 Crear acceso directo en el escritorio Donar al proyecto Mumble El servicio DBus usado por Mumble se está ejecutando actualmente. ¿Detener el servicio para que pueda ser actualizado? Mumble requiere SSE, que es una característica que sólo está presente en procesadores Intel Pentium III, AMD Athlon XP o superiores. No se detectó SSE en su procesador, y es probable que Mumble no funcione. ¿Aún desea instalar Mumble? Mumble funciona sólo sobre Windows XP SP2 o posteriores. Se ha detectado un sistema operativo anterior e incompatible, y es probable que Mumble no funcione. ¿Aún desea instalar Mumble? Iniciar Mumble Léame de Mumble Licencia de Mumble Licencia de Qt Licencia de Speex Desinstalar Mumble Mumble (compatible con versiones anteriores) Completa Sólo el cliente Sólo el servidor Mumble (cliente) Mumble (cliente compatible con versiones anteriores) Murmur (servidor) Bonjour para Windows El cliente Mumble, necesario para conectar a un servidor. El cliente Mumble para conectar a servidores antiguos. El servidor para Mumble. Incluye todo lo necesario para ejecutar su propio servidor. Bonjour posibilita el anuncio y descubrimiento de servidores Murmur en su LAN. Ésto descargará y ejecutará el instalador Bonjour. Desktop shortcut Creates a shortcut on the desktop Mumble y Murmur Preferencias y bases de datos Desinstalar los programas Mumble y Murmur Eliminar completamente Mumble y Murmur, incluyendo las preferencias y las bases de datos. Mumble ya se encuentra instalado. Se recomienda desinstalar la versión actual antes de continuar con la instalación. Seleccione la operación que desea realizar y haga click en Siguiente para continuar. Ya instalado Elija como desea instalar Mumble. Desinstalar antes de instalar No desinstalar mumble-1.3.4/installer/Translations/Danish.wxl0000664000175000017500000000671014010707273021265 0ustar builderbuilder 1030 Opret genvej på skrivebordet Donér til Mumble projektet DBus-dæmonen, som Mumble bruger, kører i øjeblikket. Afslut dæmonen så den kan blive opdateret? Mumble kræver SSE, som er en funktion, der kun er tilgængelig på Intel Pentium III, AMD Athlon XP og nyere processorer. SSE blev ikke detekteret på din processor, og derfor vil Mumble sansynligvis ikke fungere. Ønsker du stadig at installere Mumble? Mumble vil kun virke på Windows XP SP2 eller nyere. Et ældre og ikke kompatibelt operativsystem blev detekteret, og derfor vil Mumble sansynligvis ikke fungere. Ønsker du stadig at installere Mumble? Start Mumble Mumble Læsmig Mumble Licens Qt Licens Speex Licens Afinstaller Mumble Mumble (Bagudkompatibel) Fuld Kun klient Kun server Mumble (klient) Mumble (Bagudkompatibel klient) Murmur (server) Bonjour for Windows Mumble-klienten, som du behøver for at kunne oprette forbindelse til en server. Mumble-klienten til at oprette forbindelse til ældre servere. Serveren for Mumble. Inkluderer alt hvad der er nødvendigt for at køre din egen server. Bonjour annoncerer og opdager Murmur-servere på dit LAN-netværk. Dette vil downloade og køre Bonjour-installationsprogrammet. Desktop shortcut Creates a shortcut on the desktop Mumble og Murmur Indstillinger og databaser Afinstallerer Mumble og Murmur programmerne Afinstallerer alle spor af Mumble og Murmur, inklusiv indstillinger og databaser. Mumble er allerede installeret. Det anbefales at du først afinstallerer den nuværende version, før du installerer. Vælg operationen du ønsker at udføre og klik Næste for at fortsætte. Allerede installeret Vælg hvordan du vil installere Mumble. Afinstaller før installering Afinstaller ikke mumble-1.3.4/installer/Translations/Japanese.wxl0000664000175000017500000001013514010707273021601 0ustar builderbuilder 1041 デスクトップへショートカットを作成する Mumble プロジェクトに寄付する Mumble で使われている DBus デーモンが起動中です。アップデートのために DBus デーモンを停止させますか? Mumble の実行には SSE が必要です。Intel Pentium III、AMD Athlon XP、またはそれより新しいプロセッサである必要があります。SSE はあなたのプロセッサで検出されませんでした。Mumble は正常に動作しないかもしれません。 あなたはそれでも Mumble をインストールしますか? Mumble は Windows XP SP2 以上の環境でのみ動作します。古いか互換性のないOSが検出されました。Mumble は正常に動作しないかもしれません。 あなたはそれでも Mumble をインストールしますか? Mumbleを起動 Mumble Readme Mumble License Qt License Speex License Mumble のアンインストール Mumble (1.1.x 互換) すべて クライアントのみ サーバのみ Mumble (クライアント) Mumble (1.1.x 互換クライアント) Murmur (サーバ) Bonjour for Windows サーバに接続するために必要な Mumble クライアントです。 古いサーバに接続するための Mumble クライアントです。 Mumbe のためのサーバ。サーバを実行するために必要なファイルを含みます。 Bonjour を使用すると LAN 上の Murmur サーバの通知と探索が可能です。これを選択すると Bonjour のインストーラがダウンロードされ実行されます。 Desktop shortcut Creates a shortcut on the desktop Mumble と Murmur 設定 と データベース Mumble と Murmur をアンイストールする 設定 と データベースを含む Mumble と Murmur のすべての痕跡をアンインストールします。 Mumble はすでにインストールされています。インストールを行う前に古いバージョンを削除することが推奨されます。あなたが実行したい操作を選択し、次へをクリックしてください。 すでにインストールされています。 Mumble のインストール方法を選択してください。 インストール前に古いバージョンを削除する 古いバージョンを削除しない mumble-1.3.4/installer/Translations/Portuguese.wxl0000664000175000017500000000671214010707273022223 0ustar builderbuilder 1046 Criar Atalho no Desktop Doar para o projeto do Mumble O DBus, serviço usado pelo Mumble está executando atualmente. Parar o serviço para que ele possa ser atualizado? O Mumble requer SSE, disponível somente nos processadores Intel Pentium III, AMD Athlon XP e mais recentes. SSE não foi detectado em seu processador, e o Mumble provavelmente não funcionará. Você ainda quer instalá-lo? O Mumble funcionará somente no Windows XP SP2 ou mais recente. Uma versão incompatível foi detectada, e o Mumble provavelmente não funcionará. Ainda pretende instalá-lo? Iniciar o Mumble Leiame do Mumble Licença do Mumble Licença do Qt Licença do Speex Desinstalar o Mumble Mumble (Compatibilidade Antiga) Completa Apenas o Cliente Apenas o Servidor Mumble (cliente) Mumble (cliente compatível com versões antigas) Murmur (servidor) Bonjour para Windows O cliente do Mumble, que você precisará para conectar a um servidor. O cliente do Mumble para conectar a servidores antigos. O servidor para o Mumble. Inclui todo o necessário para rodar seu próprio servidor. Bonjour permite anúncio e descobrimento de servidores Murmur na sua LAN. Isso baixará e executará o instalador do Bonjour. Desktop shortcut Creates a shortcut on the desktop Mumble e Murmur Preferências e Base de Dados Desinstalar os programas Mumble e Murmur Desinstalar todos os traços do Mumble e do Murmur, inclusive preferências e as bases de dados. O Mumble já está instalado. É recomendado que você desinstale a versão atual antes de reinstalá-lo. Selecione a operação que deseja realizar e clique Proximo para continuar. Já Instalado Selecione como quer instalar o Mumble. Desinstalar antes de reinstalar Não desinstalar mumble-1.3.4/installer/Translations/French.wxl0000664000175000017500000000740214010707273021263 0ustar builderbuilder 1036 Créer un raccourci sur le bureau Faire un don au projet Mumble Le démon DBus utilisé par Mumble est en cours d'utilisation. Terminer le processus démon pour procéder à la mise à jour ? Mumble a besoin des instructions SSE, fonctionnalité uniquement présente sur les Intel Pentium III, AMD Athlon XP ou processeurs plus récents. Les instructions SSE n'ont pas été détectées sur votre processeur, Mumble risque de ne pas fonctionner correctement. Désirez-vous quand même poursuivre l'installation ? Mumble fonctionne seulement avec Windows XP SP2 ou plus récent. Un système d'exploitation plus ancien et incompatible a été détecté, Mumble risque donc de ne pas fonctionner. Désirez-vous quand même installer Mumble ? Démarrer Mumble Fichier README de Mumble Licence de Mumble Licence de Qt Licence de Speex Désinstallation de Mumble Mumble (Rétrocompatible) Complète Client seulement Serveur seulement Mumble (client) Mumble (client de rétrocompatibilité) Murmur (serveur) Bonjour pour Windows Client Mumble nécessaire pour vous connecter à un serveur. Client Mumble pour se connecter aux anciens serveurs Le serveur pour Mumble. Inclut tout ce dont vous avez besoin pour installer votre propre serveur. Bonjour permet d'annoncer et de découvrir les serveurs Murmur sur votre réseau local. Télécharge et lance le programme d'installation de Bonjour. Desktop shortcut Creates a shortcut on the desktop Mumble et Murmur Préférences et Bases de données Désinstaller les programmes Mumble et Murmur Désinstaller toutes traces de Mumble et Murmur, incluant les préférences et les bases de données. Mumble est déjà installé. Il est recommandé de désinstaller l'ancienne version avant de procéder à cette installation. Choisissez une option et cliquez sur Suivant pour continuer. Mumble est déjà installé Choisissez comment installer Mumble. Désinstaller avant d'installer cette version Ne pas désinstaller mumble-1.3.4/installer/Translations/Finnish.wxl0000664000175000017500000000702114010707273021451 0ustar builderbuilder 1035 Luo pikakuvake työpöydälle Lahjoita Mumble-projektille Mumblen käyttämä taustaprosessi DBus on tällä hetkellä päällä. Sammutetaanko taustaprosessi päivittämistä varten? Mumble vaatii SSE-tuen, joka löytyy vain Intel Pentium III:sta, AMD Athlon XP:stä tai uudemmista prosessoreista. Prosessorissasi ei tunnistettu olevan SSE-tukea, eikä Mumble luultavasti tule toimimaan. Haluatko kuitenkin asentaa Mumblen? Mumble toimii vain järjestelmissä, joissa on Windows XP SP2 tai uudempi. Vanha ja tukematon käyttöjärjestelmä tunnistettiin, eikä Mumble luultavasti tule toimimaan. Haluatko kuitenkin asentaa Mumblen? Käynnistä Mumble Mumblen Lue minut Mumble-lisenssi Qt-lisenssi Speex-lisenssi Poista Mumble Mumble (takaisinpäin yhteensopiva) Täysi Vain asiakasohjelma Vain palvelin Mumble (asiakasohjelma) Mumble (takaisinpäin yhteensopiva asiakasohjelma) Murmur (palvelin) Bonjour Windowsille Mumble-asiakasohjelma, jota tarvitset yhdistääksesi palvelimeen. Mumble-asiakasohjelma vanhempiin palvelimiin yhdistämistä varten. Mumble-palvelin. Sisältää kaiken tarvittavan oman palvelimesi ajamiseen. Bonjour mahdollistaa Mumble-palvelimiesi ilmoittamisen ja löytämisen lähiverkon yli. Tämä lataa ja ajaa Bonjour-asennusohjelman. Työpöydän pikakuvake Luo pikakuvakkeen työpöydälle Mumble ja Murmur Asetukset ja tietokannat Poista Mumble- ja Murmur-ohjelmat Poistaa kaikki jäljet Mumble- ja Murmur-ohjelmista, mukaan lukien asetukset ja tietokannat. Mumble on jo asennettu. On suositeltavaa, että poistat nykyisen version ennen kuin asennat uuden. Valitse suoritettava toiminto ja paina Seuraava jatkaaksesi. Valmiiksi asennettu Valitse, kuinka haluat asentaa Mumblen. Poista ennen asennusta Älä poista mumble-1.3.4/installer/Translations/Dutch.wxl0000664000175000017500000000711114010707273021122 0ustar builderbuilder 1043 Maak bureaublad snelkoppeling aan Donateer aan het Mumble project De DBus daemon die wordt gebruikt door Mumble is op dit moment actief. Sluit de daemon af zodat hij kan worden geupdate? Mumble vereist SSE, dit is een eigenschap alleen gevonden op Intel Pentium III, AMD Athlon XP of nieuwere processoren. SSE is niet op deze processor gevonden, het is daarom onwaarschijnlijk dat Mumble werkt. Wilt u nog steeds Mumble installeren? Mumble werkt alleen op Windows XP SP2 of nieuwer. Een ouder en niet compatibel besturingsysteeem is gedetecteerd, het is daarom onwaarschijnlijk dat Mumble werkt. Wilt u nog steeds Mumble installeren? Start Mumble Mumble Leesmij Mumble Licentie Qt Licentie Speex Licentie Deinstalleer Mumble Mumble (Achterwaarts compatibel) Compleet Alleen client Alleen server Mumble (client) Mumble (achterwaarts compatibele client) Murmur (server) Bonjour voor windows De Mumble client, die u nodig heeft om verbinding te maken met een server. De Mumble client om verbinding te maken met oudere (versie)servers. De server voor Mumble. Bevat alles om je eigen server te maken. Bonjour ontdekt en geeft aan of er Murmur servers op uw netwerk aanwezig zijn. Dit downloadt en installeert de Bonjour installatie. Desktop shortcut Creates a shortcut on the desktop Mumble en Murmur Voorkeuren en databases Verwijder Mumble en Murmur programmas Verwijder alle sporen van Mumble of Murmur, inclusief voorkeuren en databases. Mumble is reeds geinstalleerd. Het is aanbevolen dat u de reeds geinstalleerde versie verwijdert voordat u verder gaat met de installatie. Selecteer de bewerking die u wilt uitvoeren en klik op Volgende om verder te gaan. Reeds geinstalleerd Kies hoe u Mumble wilt installeren. Verwijder voor installeren Niet verwijderen mumble-1.3.4/installer/Translations/German.wxl0000664000175000017500000000712614010707273021272 0ustar builderbuilder 1031 Desktop-Verknüpfung erstellen Spende an das Mumble Projekt Momentan läuft der von Mumble verwendete DBus-Daemon. Soll er beendet werden, damit er aktualisiert werden kann? Mumble benötigt SSE, ein Feature was nur auf Intel Pentium III, AMD Athlon XP und neueren Prozessoren zu finden ist. Da keine SSE Unterstützung gefunden wurde, wird Mumble wahrscheinlich nicht funktionieren. Möchten Sie Mumble trotzdem installieren? Mumble läuft nur auf Windows XP SP2 oder einer neueren Version. Ein älteres und inkompatibles Betriebssystem wurde gefunden, weshalb Mumble wahrscheinlich nicht funktionieren wird. Möchten Sie Mumble trotzdem installieren? Mumble starten Mumble Liesmich Mumble Lizenz Mumble (Abwärtskompatibel) Qt Lizenz Speex Lizenz Mumble Deinstallieren Vollständig Nur Client (Nutzerprogramm) Nur Server Mumble (Client) Murmur (Server) Mumble (Abwärtskompatibler Client) Bonjour für Windows Der Mumble Client, welchen Sie zum Verbinden mit einem Server benötigen. Der Mumble Client, welchen Sie zum Verbinden mit einem älteren Server benötigen. Der Server für Mumble. Beinhaltet alles, was Sie zum Starten ihres eigenen Servers benötigen. Bonjour ermöglicht das Bekanntmachen und Finden von Murmur Servern im LAN. Diese Option lädt Bonjour herunter und startet die Installationsroutine. Desktop shortcut Erzeugt einen shortcut auf dem Desktop Mumble und Murmur Einstellungen und Datenbanken Mumble und Murmur deinstallieren Alles von Mumble und Murmur deinstallieren, einschließlich der Einstellungen und Datenbanken. Mumble ist bereits installiert. Es wird empfohlen die aktuelle Version zunächst zu deinstallieren. Wählen Sie die auszuführende Aktion aus und klicken Sie auf Weiter um fortzufahren. Bereits installiert Wählen Sie, wie Sie Mumble installieren möchten. Vor der Installation deinstallieren Nicht deinstallieren mumble-1.3.4/installer/gpl.rtf0000664000175000017500000004675514010707273016156 0ustar builderbuilder{\rtf1\ansi\ansicpg1252\deff0{\fonttbl{\f0\fnil\fcharset0 Microsoft Sans Serif;}} {\*\generator Msftedit 5.41.21.2509;}\viewkind4\uc1\pard\lang1031\f0\fs16\tab\tab GNU GENERAL PUBLIC LICENSE\par \tab\tab Version 2, June 1991\par \par Copyright (C) 1989, 1991 Free Software Foundation, Inc.\par 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\par Everyone is permitted to copy and distribute verbatim copies\par of this license document, but changing it is not allowed.\par \par \tab\tab\tab Preamble\par \par The licenses for most software are designed to take away your\par freedom to share and change it. By contrast, the GNU General Public\par License is intended to guarantee your freedom to share and change free\par software--to make sure the software is free for all its users. This\par General Public License applies to most of the Free Software\par Foundation's software and to any other program whose authors commit to\par using it. (Some other Free Software Foundation software is covered by\par the GNU Library General Public License instead.) You can apply it to\par your programs, too.\par \par When we speak of free software, we are referring to freedom, not\par price. Our General Public Licenses are designed to make sure that you\par have the freedom to distribute copies of free software (and charge for\par this service if you wish), that you receive source code or can get it\par if you want it, that you can change the software or use pieces of it\par in new free programs; and that you know you can do these things.\par \par To protect your rights, we need to make restrictions that forbid\par anyone to deny you these rights or to ask you to surrender the rights.\par These restrictions translate to certain responsibilities for you if you\par distribute copies of the software, or if you modify it.\par \par For example, if you distribute copies of such a program, whether\par gratis or for a fee, you must give the recipients all the rights that\par you have. You must make sure that they, too, receive or can get the\par source code. And you must show them these terms so they know their\par rights.\par \par We protect your rights with two steps: (1) copyright the software, and\par (2) offer you this license which gives you legal permission to copy,\par distribute and/or modify the software.\par \par Also, for each author's protection and ours, we want to make certain\par that everyone understands that there is no warranty for this free\par software. If the software is modified by someone else and passed on, we\par want its recipients to know that what they have is not the original, so\par that any problems introduced by others will not reflect on the original\par authors' reputations.\par \par Finally, any free program is threatened constantly by software\par patents. We wish to avoid the danger that redistributors of a free\par program will individually obtain patent licenses, in effect making the\par program proprietary. To prevent this, we have made it clear that any\par patent must be licensed for everyone's free use or not licensed at all.\par \par The precise terms and conditions for copying, distribution and\par modification follow.\par \page\par \tab\tab GNU GENERAL PUBLIC LICENSE\par TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\par \par 0. This License applies to any program or other work which contains\par a notice placed by the copyright holder saying it may be distributed\par under the terms of this General Public License. The "Program", below,\par refers to any such program or work, and a "work based on the Program"\par means either the Program or any derivative work under copyright law:\par that is to say, a work containing the Program or a portion of it,\par either verbatim or with modifications and/or translated into another\par language. (Hereinafter, translation is included without limitation in\par the term "modification".) Each licensee is addressed as "you".\par \par Activities other than copying, distribution and modification are not\par covered by this License; they are outside its scope. The act of\par running the Program is not restricted, and the output from the Program\par is covered only if its contents constitute a work based on the\par Program (independent of having been made by running the Program).\par Whether that is true depends on what the Program does.\par \par 1. You may copy and distribute verbatim copies of the Program's\par source code as you receive it, in any medium, provided that you\par conspicuously and appropriately publish on each copy an appropriate\par copyright notice and disclaimer of warranty; keep intact all the\par notices that refer to this License and to the absence of any warranty;\par and give any other recipients of the Program a copy of this License\par along with the Program.\par \par You may charge a fee for the physical act of transferring a copy, and\par you may at your option offer warranty protection in exchange for a fee.\par \par 2. You may modify your copy or copies of the Program or any portion\par of it, thus forming a work based on the Program, and copy and\par distribute such modifications or work under the terms of Section 1\par above, provided that you also meet all of these conditions:\par \par a) You must cause the modified files to carry prominent notices\par stating that you changed the files and the date of any change.\par \par b) You must cause any work that you distribute or publish, that in\par whole or in part contains or is derived from the Program or any\par part thereof, to be licensed as a whole at no charge to all third\par parties under the terms of this License.\par \par c) If the modified program normally reads commands interactively\par when run, you must cause it, when started running for such\par interactive use in the most ordinary way, to print or display an\par announcement including an appropriate copyright notice and a\par notice that there is no warranty (or else, saying that you provide\par a warranty) and that users may redistribute the program under\par these conditions, and telling the user how to view a copy of this\par License. (Exception: if the Program itself is interactive but\par does not normally print such an announcement, your work based on\par the Program is not required to print an announcement.)\par \page\par These requirements apply to the modified work as a whole. If\par identifiable sections of that work are not derived from the Program,\par and can be reasonably considered independent and separate works in\par themselves, then this License, and its terms, do not apply to those\par sections when you distribute them as separate works. But when you\par distribute the same sections as part of a whole which is a work based\par on the Program, the distribution of the whole must be on the terms of\par this License, whose permissions for other licensees extend to the\par entire whole, and thus to each and every part regardless of who wrote it.\par \par Thus, it is not the intent of this section to claim rights or contest\par your rights to work written entirely by you; rather, the intent is to\par exercise the right to control the distribution of derivative or\par collective works based on the Program.\par \par In addition, mere aggregation of another work not based on the Program\par with the Program (or with a work based on the Program) on a volume of\par a storage or distribution medium does not bring the other work under\par the scope of this License.\par \par 3. You may copy and distribute the Program (or a work based on it,\par under Section 2) in object code or executable form under the terms of\par Sections 1 and 2 above provided that you also do one of the following:\par \par a) Accompany it with the complete corresponding machine-readable\par source code, which must be distributed under the terms of Sections\par 1 and 2 above on a medium customarily used for software interchange; or,\par \par b) Accompany it with a written offer, valid for at least three\par years, to give any third party, for a charge no more than your\par cost of physically performing source distribution, a complete\par machine-readable copy of the corresponding source code, to be\par distributed under the terms of Sections 1 and 2 above on a medium\par customarily used for software interchange; or,\par \par c) Accompany it with the information you received as to the offer\par to distribute corresponding source code. (This alternative is\par allowed only for noncommercial distribution and only if you\par received the program in object code or executable form with such\par an offer, in accord with Subsection b above.)\par \par The source code for a work means the preferred form of the work for\par making modifications to it. For an executable work, complete source\par code means all the source code for all modules it contains, plus any\par associated interface definition files, plus the scripts used to\par control compilation and installation of the executable. However, as a\par special exception, the source code distributed need not include\par anything that is normally distributed (in either source or binary\par form) with the major components (compiler, kernel, and so on) of the\par operating system on which the executable runs, unless that component\par itself accompanies the executable.\par \par If distribution of executable or object code is made by offering\par access to copy from a designated place, then offering equivalent\par access to copy the source code from the same place counts as\par distribution of the source code, even though third parties are not\par compelled to copy the source along with the object code.\par \page\par 4. You may not copy, modify, sublicense, or distribute the Program\par except as expressly provided under this License. Any attempt\par otherwise to copy, modify, sublicense or distribute the Program is\par void, and will automatically terminate your rights under this License.\par However, parties who have received copies, or rights, from you under\par this License will not have their licenses terminated so long as such\par parties remain in full compliance.\par \par 5. You are not required to accept this License, since you have not\par signed it. However, nothing else grants you permission to modify or\par distribute the Program or its derivative works. These actions are\par prohibited by law if you do not accept this License. Therefore, by\par modifying or distributing the Program (or any work based on the\par Program), you indicate your acceptance of this License to do so, and\par all its terms and conditions for copying, distributing or modifying\par the Program or works based on it.\par \par 6. Each time you redistribute the Program (or any work based on the\par Program), the recipient automatically receives a license from the\par original licensor to copy, distribute or modify the Program subject to\par these terms and conditions. You may not impose any further\par restrictions on the recipients' exercise of the rights granted herein.\par You are not responsible for enforcing compliance by third parties to\par this License.\par \par 7. If, as a consequence of a court judgment or allegation of patent\par infringement or for any other reason (not limited to patent issues),\par conditions are imposed on you (whether by court order, agreement or\par otherwise) that contradict the conditions of this License, they do not\par excuse you from the conditions of this License. If you cannot\par distribute so as to satisfy simultaneously your obligations under this\par License and any other pertinent obligations, then as a consequence you\par may not distribute the Program at all. For example, if a patent\par license would not permit royalty-free redistribution of the Program by\par all those who receive copies directly or indirectly through you, then\par the only way you could satisfy both it and this License would be to\par refrain entirely from distribution of the Program.\par \par If any portion of this section is held invalid or unenforceable under\par any particular circumstance, the balance of the section is intended to\par apply and the section as a whole is intended to apply in other\par circumstances.\par \par It is not the purpose of this section to induce you to infringe any\par patents or other property right claims or to contest validity of any\par such claims; this section has the sole purpose of protecting the\par integrity of the free software distribution system, which is\par implemented by public license practices. Many people have made\par generous contributions to the wide range of software distributed\par through that system in reliance on consistent application of that\par system; it is up to the author/donor to decide if he or she is willing\par to distribute software through any other system and a licensee cannot\par impose that choice.\par \par This section is intended to make thoroughly clear what is believed to\par be a consequence of the rest of this License.\par \page\par 8. If the distribution and/or use of the Program is restricted in\par certain countries either by patents or by copyrighted interfaces, the\par original copyright holder who places the Program under this License\par may add an explicit geographical distribution limitation excluding\par those countries, so that distribution is permitted only in or among\par countries not thus excluded. In such case, this License incorporates\par the limitation as if written in the body of this License.\par \par 9. The Free Software Foundation may publish revised and/or new versions\par of the General Public License from time to time. Such new versions will\par be similar in spirit to the present version, but may differ in detail to\par address new problems or concerns.\par \par Each version is given a distinguishing version number. If the Program\par specifies a version number of this License which applies to it and "any\par later version", you have the option of following the terms and conditions\par either of that version or of any later version published by the Free\par Software Foundation. If the Program does not specify a version number of\par this License, you may choose any version ever published by the Free Software\par Foundation.\par \par 10. If you wish to incorporate parts of the Program into other free\par programs whose distribution conditions are different, write to the author\par to ask for permission. For software which is copyrighted by the Free\par Software Foundation, write to the Free Software Foundation; we sometimes\par make exceptions for this. Our decision will be guided by the two goals\par of preserving the free status of all derivatives of our free software and\par of promoting the sharing and reuse of software generally.\par \par \tab\tab\tab NO WARRANTY\par \par 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\par FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN\par OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\par PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\par OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\par MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS\par TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE\par PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\par REPAIR OR CORRECTION.\par \par 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\par WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\par REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\par INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\par OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\par TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\par YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\par PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\par POSSIBILITY OF SUCH DAMAGES.\par \par \tab\tab END OF TERMS AND CONDITIONS\par \page\par \tab How to Apply These Terms to Your New Programs\par \par If you develop a new program, and you want it to be of the greatest\par possible use to the public, the best way to achieve this is to make it\par free software which everyone can redistribute and change under these terms.\par \par To do so, attach the following notices to the program. It is safest\par to attach them to the start of each source file to most effectively\par convey the exclusion of warranty; and each file should have at least\par the "copyright" line and a pointer to where the full notice is found.\par \par \par Copyright (C) \par \par This program is free software; you can redistribute it and/or modify\par it under the terms of the GNU General Public License as published by\par the Free Software Foundation; either version 2 of the License, or\par (at your option) any later version.\par \par This program is distributed in the hope that it will be useful,\par but WITHOUT ANY WARRANTY; without even the implied warranty of\par MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\par GNU General Public License for more details.\par \par You should have received a copy of the GNU General Public License\par along with this program; if not, write to the Free Software\par Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\par \par \par Also add information on how to contact you by electronic and paper mail.\par \par If the program is interactive, make it output a short notice like this\par when it starts in an interactive mode:\par \par Gnomovision version 69, Copyright (C) year name of author\par Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\par This is free software, and you are welcome to redistribute it\par under certain conditions; type `show c' for details.\par \par The hypothetical commands `show w' and `show c' should show the appropriate\par parts of the General Public License. Of course, the commands you use may\par be called something other than `show w' and `show c'; they could even be\par mouse-clicks or menu items--whatever suits your program.\par \par You should also get your employer (if you work as a programmer) or your\par school, if any, to sign a "copyright disclaimer" for the program, if\par necessary. Here is a sample; alter the names:\par \par Yoyodyne, Inc., hereby disclaims all copyright interest in the program\par `Gnomovision' (which makes passes at compilers) written by James Hacker.\par \par , 1 April 1989\par Ty Coon, President of Vice\par \par This General Public License does not permit incorporating your program into\par proprietary programs. If your program is a subroutine library, you may\par consider it more useful to permit linking proprietary applications with the\par library. If this is what you want to do, use the GNU Library General\par Public License instead of this License.\par \par } mumble-1.3.4/installer/Plugins.wxs0000664000175000017500000002155214010707273017027 0ustar builderbuilder mumble-1.3.4/installer/qt.txt0000664000175000017500000006432314010707273016033 0ustar builderbuilder GNU LESSER GENERAL PUBLIC LICENSE The Qt GUI Toolkit is Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). Contact: Nokia Corporation (qt-info@nokia.com) You may use, distribute and copy the Qt GUI Toolkit under the terms of GNU Lesser General Public License version 2.1, which is displayed below. ------------------------------------------------------------------------- GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! mumble-1.3.4/installer/speex.txt0000664000175000017500000000335614010707273016532 0ustar builderbuilderCopyright 2002-2008 Xiph.org Foundation Copyright 2002-2008 Jean-Marc Valin Copyright 2005-2007 Analog Devices Inc. Copyright 2005-2008 Commonwealth Scientific and Industrial Research Organisation (CSIRO) Copyright 1993, 2002, 2006 David Rowe Copyright 2003 EpicGames Copyright 1992-1994 Jutta Degener, Carsten Bormann Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. mumble-1.3.4/installer/MumbleInstall.wixproj0000664000175000017500000001145514010707273021040 0ustar builderbuilder $(MUMBLE_PREFIX)\wix\ $(WixToolPath)Wix.targets $(WixToolPath)wixtasks.dll Debug x86 3.5 {84afea8b-15e5-4cc7-b77d-27dd17030944} 2.0 Mumble Package $(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets $(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.targets bin\$(Configuration)\ obj\$(Configuration)\ Debug en-us ICE43;ICE57 bin\$(Configuration)\ obj\$(Configuration)\ -cc obj -reusecab True True Debug en-us ICE43;ICE57 bin\$(Platform)\$(Configuration)\ obj\$(Platform)\$(Configuration)\ -cc obj -reusecab True True bin\$(Platform)\$(Configuration)\ obj\$(Platform)\$(Configuration)\ $(WixExtDir)\WixUtilExtension.dll WixUtilExtension $(WIX)\bin\WixUIExtension.dll WixUIExtension mumble-1.3.4/installer/dlgbmp.bmp0000664000175000017500000160576614010707273016630 0ustar builderbuilderBM 6(8 ###%%%%%%%%%###  222MMMJJJGGGEEECCC@@@>>>888***   '''SSSZZZ[[[QQQSSS222***]]]^^^\\\ZZZ111  111hhhnnnqqq>>>)))(((###%%% """dddoooyyy:::"""777222333333!!! 444}}}ttt[[[???===>>>===999zzzJJJHHHMMMGGG---+++MMMBBBOOOUUU555gggaaa PPP___TTT555***RRRfffWWWXXXcccAAAgggbbbuuuCCCnnnmmm111...@@@sss```!!!___xxx>>> qqqzzz$$$uuu*** wwwzzzXXX@@@ xxx{{{555]]]ttt ^^^###]]])))>>><<<ddd```mmmnnn 333HHHfffvvvȼ{{{bbbJJJ---]]]000:::333fff̽vvvooommmmmmnnnrrrxxxܲ]]]/// |||333fff̙hhhaaa333$$$333PPPfffooouuu]]]III222///OOOxxxܤnnn000111///333qqqКfff444333fffɸʥ{{{QQQ"""BBBuuuÆ;;; fff̙ddd'''333fff̙fff888000"""FFFcccՠhhh***RRRmmm(((nnnddd777Κiii@@@)))JJJ}}}„;;;YYYց(((iiiٖ444000fff̘aaaUUUnnn$$$---||| QQQ擓222333ڙ^^^VVVՊ(((((([[[ III...}}}333(((݄'''444)));;;tttfff{{{...%%%|||dddaaaHHHKKKMMM222333+++///111]]] PPP222QQQ``` RRRPPP###ooo KKK ggg888)))ooojjj :::pppyyyZZZ)))hhh󀀀 uuuvvv===|||FFFQQQ sssddd!!!HHHfff444 >>>;;;www!!!&&&fff===WWWAAAcccMMM ///===[[[eeesssyyylllVVVFFF+++222􌌌""" $$$~~~333fffǛlllcccNNN;;;333---'''"""!!!$$$***444AAAMMM___wwwͽrrrDDDddd===>>>======:::nnn'''333iiijjjKKK...111BBBdddttt|||aaaIII((( LLL|||ͽCCC """nnn333|||Ƶiii333333fffʙeee[[[:::111###  ...DDDSSSrrrˣvvvCCC<<<{{{ɑAAA ======GGG[[[ZZZ%%%ZZZuuu222333fffʗfff333222bbbݯooo,,, 666ǿhhh &&&bbb;;;***VVVddd fffʙfff333)))jjjݼlll!!!aaakkkBBBxxxjjj+++===444ddd+++qqqʻfff111(((qqqӊ***bbbŹMMM]]]===mmmUUU򿿿aaa!!!lllʣ^^^[[[Մ%%%҃$$$;;; >>>wwwSSSMMMbbbbbb^^^MMMDZ111<<<$$$___---[[[888 uuuƃ"""$$$ᑑ ---AAA333uuu###555###ZZZ [[[Զ444@@@ PPPQQQ*** """ CCCAAA===999uuu888ﷷ 载 jjj333:::555;;;"""^^^%%% ???OOOAAA:::ü###===Ί FFF bbbOOOEEEݗfff===444𲲲SSS%%%...xxxiiiddd(((鷷 lll!!!JJJPPP$$$㺺===###666WWW<<?DDEIDEI=?C9:?46;25925935:57<79=7:>68=46;25923813867<:=A@BFEFJHIMHIMDEI=>B67<%')$%(,.1-..QQQ $$$OOO013$%('),=?C@BF=?C46;36:14846;CDIefjʺuvyVX[<>B14857<67<9;@CDIHIMHIMCDI9;@'(+$$(013 !OOO ///EEE012%&)')+=?C=>B2382599;@fhk⹺IKO36:67<7:>EFJHIMHIM@AE'(+&(*224##$PPPvvvBBB444,,-&(***->?D79>46;57B+,.%'*//0ZZZmmmVVV]]] **+()+()+@BF.158;?죤MOS46;67138TVZ?BF79=BCGHIMHIM'(+%'*123444(((//0&(+(),67<57>>012-.0+.2:=A!IKO9;@CDIHIMHIM'(+./1SSS(*,%&)57<259!"#$!& "'!&$ $jlo@AEHIMHIM+-//13,,,BBB')+!#&suxVX\ %(+0(+0"%)moryz}'*.Y[^79>:=AHIM'(+$$(qqq---+,/.05+.2:<@VX\57; % #(>@Degjkmpabedfi,/4'*."bdg@AEHIM*+-#%(-..___|||.02.05148 %9;@XY]gildfidfigilkmpSUXGJMwx{BEH$!57B79=259,/4$138HIMHIM./1"##)),$&)yz}gilkmp |~DEIHIMHIM+-/\\\*+.%'*gilkmp 35:138HIMHIM()+ """$%(쓔gilkmp !|~7:>HIM,,.,-/zzz!$LNRgilkmp KMQ@BFHIM'(+  #%012gilkmp CDI-/4FHLHIM./1yyy001$%)VX\gilkmp =?CHIMHIM'(,  $>@Egilkmp !&57?DFGKHIM'(,-./$&)+.2gilkmpuvyY[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^Y[^ 9;@HIM)*-123#$(gilkmp?BF @E|~GIM ACG58BFGKHIM%'* "%!&gilkmp?BFQSW`be 57B ACGEFJ>?D124*+-=@Dgilkmp?BF026Z]``be<>B efj=?CFGK*+-#$(LNRgilkmp?BFpqt #'Z]``be<>B 57B !&037HIM(),)*,%,/2%',"gilkmp?BF"%)Z]``be<>B ?BF67@Ftx{@BF#gilkmp?BFsuxQSWQSVabeZ]``be`be037037037037037037# # %!uvy259HIM:=A&)-"cej~469"gilkmp?BFFHLZ]``beMOS ",05/15#58]_c#hinLMR),/!gilkmp?BFFHL137&)-Z]``beMOS ",02KMP56;"?BFEFJ8;? !cei|~Y\_BDJ!'gilkmp?BFFHL!=@DZ]``beMOS "#&+9;@]acoqt57<LNRJMPCDI:=A$loq_de:>A$gilkmp?BFGHL "'QSVZ]``beMOS '*.IJPQSW"SUY@BF>?D]_c"ijnWU\!%gilkmp?BFFHKFGKGIMZ]``beMOS $CEKY[^  acf>?D459JMP_`d(,1gillmp?BFFHK$037Z]``be|~TVZTVZTVZTVZTVZTVZMOS  ,/5cdf?BFVX\nor<=B$&("%*%),z|rrvDFK#gillmp?BFZ]``be #"(ACGnqrz{~,/3uvy:=A  SVY\`c'(/ gilkmp?BFZ]``be !258__blnq%',&)-wy{:=A /2679>ǘQTV#)!gilkmp?BF138Z]``be  &(.Z[_bdg"'rtw:=A "'WZ\·69>$(+"gilkmp?BFWZ^Z]``be !(IMQ͓:CEuvxceh(+09<@HIMCDI lnq$DFKIJtvxOQU#&*gillmp@BF  %259NQUz|~]_c-04!?ABCG!)*.TUY}ACH#gilkmp ,/3hjnmnr*-1?AF259HIM'),89=!*,1CEISUYyz}y{~58< gilkmp (+/bdhwx{SUY/16!79=HIM%')/25"$'".05ACG58<!&gilkmp &(-WY]tvysuxnps:<@#238EFJ+-/56:deg  gilkmp #'*/038.05,/3$)+09:?=>B224?@B!"&gilkmp   {}ceh=?C9:?++,667ﱲgilkmp =@DEFJ$&) >?A𯰲238gilkmp󘙛35:   "!_`e 259kmp46;HIM$$(247ϑMOSnor  kmp,/4       iko "'!&.15Z\_yz}36:CDI./09BFGK(), =?Aqsv'*.46; !##EDGWWYWYYfhikmnnpprrtmll__aejj`efY]^QRVBDI-.1  68=.16259HIM#%(247pru(+/GIM %&&[\^xz{motgjlfgj_ac\_c_be]bb\_aZ^a`_cY\`befdghVVZ77;"%' !7:>.16<=BCDI./1@ACqru*,1!()*~swz`aeacf/37IJMiil\[^8:<# -048;?.16MPSCDI)*-%%&@ACpru+-2 #( " '()][_dfj79=5;=Z\`YY]99< <>B.1579=HIM'),258pru+.2 #&013LMQ=?D-04WY]QSW#&+(+/>@E.15037@BF113@ACoqt+.2=?C  ".05037<@B#&* ACG.15MOSBCG)*,?@Boqt,.3 !DDI!$! EFJ.15<=BFHL&(*<=@oqt,.3########'*.#######FIMIKO.1536:%'***+///;<=oqt,/4"######$/16/26JMP/167:>FGK$&)569nps,/4#/16/26NQU.1536:'(+113778445nps-/4#/16/26QSW.15>?DEFJ%'*348nps-04#/16/26VX[.1546;'(+123667334mor-04#/16/26WZ^.15>@EEFJ%')458mor-04#/16/26VX\.169;@'(+112//0;<=lnq,.3#/16/26QSW.1658001{|ceh#/16/26,.3/16VX[@AE#%(78;ACG#/16/26#148<>B,-///0>?B$+-2#/16/26_ad!9<>>?D%'*/01455::<'*.!&#/16/26.25!#&TVY@AE++.&(+LLL?AB-04NQU#/16/26"%*!%),QSW(),$&(89=<>B+-2#/16/26KLQ %!47:ACGHIM"$'FFF56:QSW#/16/2655;!  "7:?67<013/01[[[?@B259,/4#/16/26;=C" ! #')-nos>@C/02113RRR"""AAA9:=GIM"! IKO#/16/26"&+ "$"$+/159?Dwy{EFJ./1124KKK444###@AC"%* '*/EIK/38 $! &(-#/16 /2699@"$#'!#)01769=cei67<./1 jjj888DDD =>@CDI"ILO~inn79=$&+ !& %"+.3#/16/26:9>#&!(')0++0016;>C/05fhk35:%'*001999cccCCC@AC89>36:mor~}knpFJM32:$',!& %005TW[#/16)+.37;")   %026>BF=>CBEI+,0DEI./1VVV:::?@A///"':<@||kjoGIM.14$(*#(!%$%,89?37<),/%#/16$+-1-/4.15!&*%"!"005TU[RUYFIM,/58:>gil35:*+.##$<<<%%%===444;;<=>?MOS!&HJQegmBCF-14&),%+!%!%!% #/16"#"  "!  $-16Z[_|NRT027127ACG%&)%'*fff(((011@AC>@D"'HJNrtwEHM*.0 $'$#" $/16 !!!!!!$"&(47<]_dikq36:69>+.2)*,/02uuu,,,###?@B=>?'*. #(69=_adllp;>C+.3!&+"! #/16 ! %" !""#"$),/2ADF^_asvv[^_+-2#$)TVZ/26(),**+$$$###fff&&&$$$@AC8;?$'+SUYyw~npuYZ]=CC//5#$+#&$    #/16"%)269&*-"!"&(*.157>@CZZ_vw~\^a8;A"' "'bdgACG%'*&(*lllkkk%%%>?A<=>ACG $(69=dehruwqrtilm\^`JKN;<@-05,,0)+2(,/"'+% #/26)*/LOSIJO+.4!%+-4DJLXZ[ruukmp;>B"' "%*{|/27&(*112$$$"""&&&4598;?'*.!(-/HJNbbfz|}mqrgkmffkLPS469&+/"'+/58<$&,KNSmpqlorZ]aloqz|~beiMQT,/3!"46;037$&)'(, ==='''fff@AC?@B/16 "'"!$).26FHMefmux{eek5:> $*%!,/4#$9<@fhmx{}}{~kkpcegOPS88>#%*#"58)*,013@@@)**/25<<>븹Z]`36:"'!&!& "' "'=@D&)-%(-'*.(+0(+0(+0]_cVX[259(),013 (((<<< 899247=>@IKO!#&%')124NNN&&&Ā ;=@569778酆46;#$(%'*002,,,AAA ;<=5699:=334ᐑ@BF!$#013 !ooojjj =>?57:247?@Aikn68="$'#,-/ ͔CCC###233=?A/25459?ABʘacf79>!"&"%')113+++BBB011?AB57:-/3,.267:]_brtw~jloSUY8;?!"&!#& $#%(012'(((((ccc    ~~~  ΐ"""š """bbbŧ}}} Ξ===ү%%%֒,,,111钒+++&&&444[[[pppJJJggg 333dddIIIpppHHHrrraaa]]] ((()))QQQVVV(((444KKK뛛$$$ȸ===rrr(((iii]]]UUU...󅅅 fff===666&&&JJJ%%%雛 QQQ󽽽&&&jjjxxx///ҹ 䪪 ```===<<<HHH,,,{{{oooᯯfff(((nnn555'''"""ⰰiii,,,ttt }}}rrr&&&第"""======JJJ^^^cccAAA]]]譭///줤$$$ sss///eeeRRRVVVUUU@@@MMMCCC """(((vvvXXXYYYhhh(((vvv\\\ !!!'''sssvvv pppiii### yyyiii...---ZZZ󚚚((((((XXX///KKK(((潽 ***888>>>___ \\\???FFF)))GGG󡡡bbb###{{{󩩩DDD>>>wwwjjjyyy 999mmm hhh󟟟000444HHH @@@𗗗888888YYYmmm]]]222݁000===nnn''',,,fffꙙFFF///돏... ZZZ::: TTTֆ))),,,餤jjj(((333fff̆333333OOO999'''===[[[ꠠXXX$$$BBBʔccc333333fff̙ZZZ___ZZZ|||}}}eee <<<֖YYY$$$///hhhʪgggMMM666###333HHHfff̙fff333'''ddd̓555'''NNNXXX!!!YYY龾VVV)))BBBdddʛfff777,,,333ddd̘```vvvZZZ񇇇 666kkk¢bbbJJJ222 ###!!!&&&666;;;???@@@>>>:::333000###!!!333EEEfffyyy̙fff333444VVVuuu&&&>>>???ccc™fff333 UUU000===ddd '''000555666444111---$$$aaaBBBfff 󔔔BBBrrrppp---qqqvvv )))EEEfff===OOO;;;lll%%%ccc<<<EEEppp !!!<<<333 444HHH|||222BBB}}}OOO555???󚚚###KKK;;; {{{___CCC***JJJ nnn%%%eeeZZZ {{{憆"""===qqq )))[[[ mmm郃DDDfff,,,~~~DDDMMMNNNFFFJJJjjj```,,,pppeee {{{111 鐐***uuuppp(((333ooo###^^^mmm EEE؁'''lll枞YYY///ffffff"""PPP񙙙333 ZZZٌ555 AAAܟ___$$$333fff̗KKKcccNNNYYY즦]]]QQQƒ```111 333fff̘bbb333sssOOO;;;ߟ[[[---dddß|||YYY??? 000:::fff̙fff333333fff˂333XXX껻KKK???eeeņ̀fff555&&&333fff̘UUU==={{{̢yyyOOO---&&&BBBOOO___qqqzzzzzzllldddWWW<<<111333ddd̙fff333777ddd߿~~~ppp[[[PPPFFF>>>999333111222333666===HHHWWWdddlll̸fff333666PPPtttǮfff\\\333mumble-1.3.4/installer/qos.reg0000664000175000017500000000047014010707273016140 0ustar builderbuilderWindows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters] "DisableUserTOSSetting"=dword:00000000 mumble-1.3.4/installer/bannrbmp.bmp0000664000175000017500000024760614010707273017154 0ustar builderbuilderBMO6(:rrr===rrrTTTLLL111333333333...333+++666666333<<< FFFZZZ ===|||yyy\\\dddIIIOOOQQQ111///...>>>:::GGGTTT{{{EEE###qqq(((RRR 000000  :::''']]] ...@@@rrrOOONNN222000  FFFRRR;;;www''' xxxPPP'''222 ZZZ ___uuu'''eeemmmZZZ 222''' EEE ddd}}}222OOO999PPP 777 ##%#$&Z[_KLPEGKIKO\^a%&(##% 777 eeeppp(((ppp[[[XXX 555)*-Z\^Ӹjlo:>>LLL===PPP|||[[[ SSV"%)#$46;.15=?C=?Dyz}./1 &&&&&&ZZZFFF 777111<<<333 jkmLNRACGGILmorTVZ;ikn8:= :::___===$$$FFF=== ``b8:?ikn~[]avx{569 ...[[[ ===sssQQQ777012 %ikn~[]aQSWuvy,-/ ;;;SSSfffrrrooo hhh... #ikn~[]amorOPT%%%VVV==='''===%%%TTT666~EGKikn~[]a89<888QQQ (((mmm EEE $%&󺻽ikn~z|z|z|z|z|z|z|z|z|z|z|z|z|z|z|[]aFIMfgk999...333GGGAAAppp333 000\^aikn~$',69=HJNGJN46;"%*JMQJMQJMQFHM-04ILPILPILP&)-[]a:;?888ZZZ___pppGGGQQQ---!&ikn~$',JLP}~[]a[]a^_c===QQQCCCNNNSSS bcdikn~$',xz}z|~}~暜>@D[]aacg013333333kkk ;;;ikn~$',8:?-05}~[]aOQU9:>333 ttt --- ikn~$',ACG.05}~[]aCFJYZ^333fff"""tttAAA...;<=ikn~$',㕖NPT-05}~ #([]aNQT#$&333777eeeIII000_`a#ikn~$',bdgJLP-05}~#&+[]aacf&')333333888jjjNNN***!$)@BFikn~$',,/3KMQ-05}~"'"'[]a#&*!&_ae@@@999gggGGG&&&^`dmor!ikn~$',kloY[_-05}~[]a149)+0OPT888888lllKKK)))sux(+0ikn~$',⒓LNR-05}~JMQ[]a#oqsPRVIKO333777gggOOO000bdgz|&(-ikn~$',oqtHKO-04}~[]a[]a WY]MOS000 222iii>>>&&&acfTVZ!$)ikn~%',&(-.05-/4#"!&!&!&![]a#PRVz|_`d;;;QQQfffNNN,,,DEH').ikn~[]a8;?|}dfi&')888jjj333`ab+-1"%)ikn~[]a"%*=@Dqsv$$&DDD333333fff 333111%%&?AEjloz|tvx_`b[\]OPQUVW_`b#mor_advwz  <<<eeedddfffddd111,.2UW[vxz#%&'467779135! QSVQSWHJNmor>@D >>>***333333IIIXZ]$@ACƯZ]_;@E kmpikoLLLeee444dddCCC((( cei>@E kmpiko=?BXXX 000hhhDDD456XZ]>@E kmpiknLLL@@@<<<FFF(((BBB%%%249>@E kmpkmp#%'333fff+++hhh;;;$$$$">@E kmpegk~99<<<<=== ZZZ>>>''' =@D>@E kmp!$)"XY\ !!! 999dddzzzKKKeee FFF))) 037),0!$(>@E kmpfhl "$)LOS_`b""":::???fffFFF333BBB$$$Z\`rsw58<.16mps!& kmpMOSLOR!:<@>AERSU ^^^QQQHHHjjjLLL$$$KMQegj7;> %  kmp"& !&249UWZORU125...<<<444===###]]] GGG*** 445KMQFHLegi`be;>B"'wy|BEIXZ^lno]_b148pqsYYY zzz888555UUU:::EEE((( VVWčstwikoyz}|~΄ !"!!!JJJ ppp vvvhhhvvv&&&<<<$$$234姨[\] 555LLL\\\'''lll '''<<< VWXXY[/02 ;;;&&&222???]]]111 rrr'''>>> /// DDD'''WWW QQQ xxxZZZBBB '''aaaaaa ttt KKK$$$!!!***@@@111XXXooo777fff wwwxxxrrr...HHH $$$&&&&&&@@@---QQQMMMdddOOO[[[ vvvyyy[[[OOO<< mumble-1.3.4/installer/MurmurUCRTComponents.wxi0000664000175000017500000002114114010707273021421 0ustar builderbuilder mumble-1.3.4/installer/build_installer.pl0000775000175000017500000000147314010707273020357 0ustar builderbuilder#!/usr/bin/perl use File::Copy; my @LANG; $x64dir = "bin\\x64\\Release"; $dir = "bin\\Release\\"; $platform = "Intel"; if (-d $x64dir) { $dir = $x64dir; $platform = "x64"; } opendir($D, "Translations"); while ($x = readdir($D)) { next unless $x =~ /\.wxl$/; next if $x eq "English.wxl"; open(F, ") { if ($_ =~ /Culture="([a-z]{2}-[a-z]{2})"/) { $culture = $1; } elsif ($_ =~ /Id="LANG">(\d+)/) { $langcode = $1; } } close(F); system("msitran -g $dir\\en-us\\Mumble.msi $dir\\$culture\\Mumble.msi $langcode"); print "\n"; push @LANG, $langcode; } copy("$dir\\en-us\\Mumble.msi", "$dir\\Mumble.msi"); foreach (@LANG) { print "$_\n"; system("msidb -d $dir\\Mumble.msi -r $_"); unlink("$_"); } system("msiinfo $dir\\Mumble.msi /p $platform;1033," . join(",", @LANG)); mumble-1.3.4/installer/Product.wxs0000664000175000017500000002114114010707273017020 0ustar builderbuilder Uninstalling old version LAUNCHAPPONEXIT VersionNT > 501 OR (VersionNT = 501 AND ServicePackLevel >= 2) OR (VersionNT = 502 AND ServicePackLevel >= 1) mumble.ico NOT Installed AND NSISINSTALL NSISINSTALL NSISINSTALL AND NOT Installed WIX_UPGRADE_DETECTED mumble-1.3.4/installer/MumbleInstall.sln0000664000175000017500000000217614010707273020132 0ustar builderbuilder Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "MumbleInstall", "MumbleInstall.wixproj", "{84AFEA8B-15E5-4CC7-B77D-27DD17030944}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 Release|x64 = Release|x64 Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {84AFEA8B-15E5-4CC7-B77D-27DD17030944}.Debug|x64.ActiveCfg = Debug|x86 {84AFEA8B-15E5-4CC7-B77D-27DD17030944}.Debug|x86.ActiveCfg = Debug|x86 {84AFEA8B-15E5-4CC7-B77D-27DD17030944}.Debug|x86.Build.0 = Debug|x86 {84AFEA8B-15E5-4CC7-B77D-27DD17030944}.Release|x64.ActiveCfg = Release|x64 {84AFEA8B-15E5-4CC7-B77D-27DD17030944}.Release|x64.Build.0 = Release|x64 {84AFEA8B-15E5-4CC7-B77D-27DD17030944}.Release|x86.ActiveCfg = Release|x86 {84AFEA8B-15E5-4CC7-B77D-27DD17030944}.Release|x86.Build.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal mumble-1.3.4/installer/Settings.wxi0000664000175000017500000001127014010707273017170 0ustar builderbuilder mumble-1.3.4/installer/gpl.txt0000664000175000017500000004313314010707273016165 0ustar builderbuilder GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. mumble-1.3.4/installer/gen-ucrt.py0000664000175000017500000000446614010707273016746 0ustar builderbuilder#!/usr/bin/env python # Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . from __future__ import (unicode_literals, print_function, division) import os import codecs def mangleComponentId(fn): # Component IDs in WiX can't contain dashes. Mangle them with _ instead. return fn.replace('-', '_') def fileHeader(f): f.write('\r\n') f.write('\r\n') f.write('\r\n') f.write('\r\n') f.write('\r\n') def fileFooter(f): f.write('\r\n') f.write('\r\n') def gencomponents(f, files, prefix=''): for fn in files: f.write('\r\n'.format(mangleComponentId(prefix+fn))) f.write(' \r\n'.format(mangleComponentId(prefix+fn), fn)) f.write('\r\n') def gencomponentrefs(f, files, prefix=''): for fn in files: f.write('''\r\n'''.format(mangleComponentId(prefix+fn))) def main(): ucrtx64 = 'C:\\Program Files (x86)\\Windows Kits\\10\\Redist\\ucrt\\DLLs\\x64' ucrtx86 = 'C:\\Program Files (x86)\\Windows Kits\\10\\Redist\\ucrt\\DLLs\\x86' filesx86 = os.listdir(ucrtx86) filesx64 = os.listdir(ucrtx64) # Perform a quick sanity test to ensure that both x86 and x64 UCRT variants # use the same filenames. if set(filesx86) != set(filesx64): raise Exception('Fatal error: x86 UCRT files are not equivalent to x64 UCRT files') # ...Since they're the same, let's just use the # filenames from x86. files = filesx86 with codecs.open('MumbleUCRTComponents.wxi', 'wb', 'utf-8') as f: fileHeader(f) gencomponents(f, files) fileFooter(f) with codecs.open('MurmurUCRTComponents.wxi', 'wb', 'utf-8') as f: fileHeader(f) gencomponents(f, files, 'Murmur_') fileFooter(f) with codecs.open('MumbleUCRTComponentRefs.wxi', 'wb', 'utf-8') as f: fileHeader(f) gencomponentrefs(f, files) fileFooter(f) with codecs.open('MurmurUCRTComponentRefs.wxi', 'wb', 'utf-8') as f: fileHeader(f) gencomponentrefs(f, files, 'Murmur_') fileFooter(f) if __name__ == '__main__': main() mumble-1.3.4/installer/Files.wxs0000664000175000017500000001671614010707273016456 0ustar builderbuilder mumble-1.3.4/installer/MurmurUCRTComponentRefs.wxi0000664000175000017500000000536214010707273022065 0ustar builderbuilder mumble-1.3.4/installer/portaudio.txt0000664000175000017500000000300614010707273017404 0ustar builderbuilderPortAudio Portable Real-Time Audio Library Copyright (c) 1999-2000 Ross Bencina and Phil Burk Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. The text above constitutes the entire PortAudio license; however, the PortAudio community also makes the following non-binding requests: Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. It is also requested that these non-binding requests be included along with the license above. mumble-1.3.4/LICENSE.header0000664000175000017500000000037414010707273015101 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . mumble-1.3.4/samples/0000775000175000017500000000000014010707273014305 5ustar builderbuildermumble-1.3.4/samples/wb_male.oga0000664000175000017500000010057014010707273016406 0ustar builderbuilderOggS u4Hvorbis>OggS u4wrX-vorbisXiph.Org libVorbis I 20070622vorbis"BCV@B*c:!B)B!$C:5cGdBɁАU@WPrI-sWq s gq %s9r1sWr)-sGqsGqsm1r9s Rr5sgr %s gq s5r9s9s9s1s9sn1s9s9s9s 4d(( @qGK$  YHHXfi&z(*iʲ,˲. HPQp Yd`(8XYP GM$<<<<<<<  Y (dBCV@!CR\ BCBC)%cSA!|={АUa8$!b'Dq !$Xy$݃B{˹{ 4d B!B)RH)b)s1 2蠓N:ɤN:$Rk)SLc֜sA)c1c1c1# YdA!RH)r1BCVER$Gr$G$ɒ,I<˳<˳< ?^ꒋ< {giZ#(D<W#)O{/׭<H3;K:[NvN誝H{#N̉ ?ƕAɤuR/ | d) !w;Oߍ7tt8wN$-hGROy]Ó؝Y0>mZJcr*(%5_p-zgRxߋ-ۯ;i+;VZ v㺘*Cv@2эqӇug)D_,D5s#n5qVfwp=Bz 4kg k1p~B$P{.|TPYo:18FI Vypw1W~ZHבhm:Ov/mP|0݉t=\>^U%5^Zrͧ83|O?KƆ1@oލ4L$6gQe9i3 kҬ\m /MEy {MeyҵG8FN萢>y1hY1τ[qЩ8bcyZ''}tQ<}o QwMQ;yz|6~B/1큻EƁ.̣U8N%m<$A@Ŷ2.D̓ ʴɉoo-Odw_yx8jM6swg5/kCN$jH=b[$R'jq:?d\mNYD@I4`QYlh6Ra97s+N۬ &ܑ4&.erϋ b \ CIrM,` XhxDujJ̥v5UYw Z~{i}-ksy[i(|uВ, JSaI])x dCɱŎgԖYI# L9>Z+d#) abPyx4hHMC$k9-BY3$-#Xrj=vLDai':'MlJH}QyWU| C=Ry3Pv$C@4liZ8 oQB D}~s& {B=zUM3ƺ{ۨuwF3Mshv0:hS[&Kf7x hjD3~^؞TCh-O3:ֵm<`1Fx\{KR;b wR!z<[_Ex&k#t>+NQŗ.^ &`AE_q|4?[wS_z:nz V+0~,u&y2(W9-k݌>-P^L1#Ɲ-Z:CӣrE `Wky3dl}^)9cj)~R+^riP}w8w|B35 f2b0-;yy; {OEז 9 uPgy zZ(*4ӼʦBS~ 5\Y-pe8 JVKu[{ƀ!a iG`q[(4:zC,Հl*wSS 2]v|q_KY)jγn-s`l G.F ;_'] i5؉$ P 'װjCU#N-v33-`㨋mn 6%ț E %ޞ':1}u/6j~!?BWw|0~X5 &0Wfm@ p5VuB;OOշEjͿ¦}O;:3ZFD+U&Q1T7ޒMd?!./vyR ~zOl] E #Ij*otmT=" aFu-%#O 2O4UFbtJ/wOP b#.s;^YcHa%vEꥳ=iesǷ ,X4WW_Vy'9M-Y,1;޼ynNQēi}e"@3F Q'k,~ \_@j+J-##csݫ% }TFؼ˙%qd3B'Q7(ej)4V]<0$}܎\k~}r צe|y{q=abQ4iU@c60@ZӘ.Hq* ,֥uG2[-B~btpr"ވT)*Vigml|ӈ4 +%9j|WәV#Mj%qN"~42]-!4Jg?,ꝓggȢ>QsmVSaA lmnx~i,Ѝ|fS q+\qYپ8p<6Y V;֩9d,ePd}0.{'INOItMv]/-śZU m`Np_>Y`5'bʫΚ]p6_+̟S[,6yGnZ Ъuz0ϫd(ԥ5 Rς }COw uVEŅ~O ֬3F2}_',L߻@$m+2Z7x]rتɗG[.*V$R" wh1ulGۇe%ӒhMX;qI>3;Hnk [pu蜪!9u>KWԴ+:v eR$Y0k:|Zz M~u2$@ן5"seN5ϳ)>l#sjTNfYĹ7b`eM m8Z_G30+S`6H1ШtײEMv|:}.lw}s5iE_/|ǧ~57v}鍴-aj2SbL[}Dy|Co}Y;s2ּD<*<ˉY>#pZ",Kt 8}/[_̍8<x # E2x{% b>?MV1R } 't4RR41RF̃RjL-8BvU aӭ}'h0ew^6vɓ.9 }z1Xh>/>eHP"cU 'LlVLpr, a Y536ַY_rbY##pz3фeD*UއdElq;l;ÚA oݺKOl4 ,wBv-29)Mb $k^5l7ZqzjIM!ᰁnY\㿶[pwSyO4m۶ Yy&[R?W?1H,(n<ǜYr^6YQvJSQq~*5+/=TJ슄Iv)t]ifPUp OggS| u4[$vwlv~I\^{uY^^a`yx{x~``ayxx~r~eqcHtwlRtd6>s,ݿjwwsG8Rddif2YbuL鄆=F4GnWzfZeb0o^ P؉]<+gIfFIkI=iv3 `+'K]?2 y[C^8KGq!n12;`Bu)/QFB nG(<K +8k1֨%rQ=_D<~X86k3'thv0`G1cAPX_Z񏅈XU\/sjE׺ wdD"HDLFWn>t0jM}pplOuj l%,Cœ }ZkGS}4I~8 #m/L#u@+Q2/S~5΃hq{Dv&\Մ7%]$b8cK֥=Ȗ1[١vb܈{_hk^V9l7ΣǦhfOWH4R'cSUҭ;c, ZsB Jj曔I[uHԚA~hW>lv8VU` 2 ʴP˄11gִ/xW6!B]4\#Sv6jxve/'> b Tcwz_tZSD:mRΌp|h?hBxh tLE f U?p+J^$ cr`\±Χx#/oܕ9*[|'|&t^8ktNCtntV'aX;ZNyk'5*I\P/&Lj!FЈ'ܗ;~"-ڟ|y9dӼ_6^rA3W.G" bw G{B?{6xIғ {>]7%|h/M-ҋ NZb7S_>}!PC1ա7ጺBufȀ3gγCLڻ;3];^Ls#q^w ꎸpW- a:px5[u8g](8M39:sm⦆LmX76schiy&8'K#'rsTENN 6&"Jx V x8~x`$6:'󚬸ze[ ƛm*TkG.Pɗ6t(ϙ~X_gdqҌlm{2s0v2n2$cԹAQMߍ: l!ǜ ` >iaRʾԽ3f%Øj{iҀd(X{'Nu3 ~ؽN1fT %~9`{J~tk N$kY['lOwVJ:x>ڋ6P-.n_6fiY> .&uvWnY,g_ ii\If7Dž?q9xzsBe "KB{D=|_wL&3R[C=4p6qx)1JM@kMzq\z[ěKezhZ-T}Rɢ&1Ė(I RJ= ?2L贍]Ԉ~;8{Ot, [Dx~h4j-9VJ:>[״EIfkXF!͋>"V-hY@/MW_&fk <-|aI?c!:[6:iBmo)K\>'c҇;OӳoOvTW!1@&02HO +dsoykG/,P9 #zys!yHb[V5!~ +-:.7fV{KJa|S}XtZ4}{Z)9=M#mu7My.Pͻ 6%92 7^[^m4ɻ|4si[ ?WHh9\\ B_y9(-"/uO[6뱾'mƆmT(`ֳ8_)寫|J}iWb5jءނ >+o.Suvi(20ԫ_l]m˝͖ǥ&׮6-=e}P)2&BIvzTSzyyZ. &vmPO Jxc5>)ĥ/Ņc^@y*3egݷ.Wr>/s:;>/Ul³,r)Lw\] AyS5j윽$ַF)תD Md^q=z۴+,5ki-rہ_;wCO^=t _<7+& "=C:(yi nI1ro"!Sbɨ)'iVW+̀ +>>x1TӆzBl6A ~ߔopݓ?I >4ޘɺ;e㴲Yo޽ &,PUnJpP^5`Mȣ{ziX(>xqQч .jƙ9z9p٩=KymqÚpLvM?l9Y|bߝ,q_xo۪5BY@r Ps=@y\ӱÎOggS u4')~=Y\UA][Z\ZZTvyv{wzu?Y_X{qBXVBQ\^SVxIŝңNR eWItg7onL=3f_z NtM*?5dDw[?^ϭ\rUYɲg`;3n-a槑t>;]rA G@#ukn߇> >Mվw"Lӷz$O8B/zA_Gseԙ (I&8~g|NֶjS1u>ZPHv>iB; mvec:_4[(<\o/aq nٷ@Yrmf3b%e\.(MY3׭aݚgPkM"Q AUjT\ ",S4>i.>au,ۀApGohQ(a>!5t Z m 7S9GyzKCpw0,k$=1GB;>5v`*(HJ 4a'P4-rH~=O8=k`Zxxk[>6V 6;*s>?Dt8oRיtlZDy=e?\7Zm3j};wN ]d% ?>/~Y>:ڝKd}- ;vpLӾXeKL8_ZҎ7sR\ 1Z.:qM:V_/`U-h!Ճ崜O?Ԓ G2D8dg^/@+f{y*Խã}M+S(m{ZUc>]~~Պ3"],|r}k q dFudt Hm.ݠk+2Wёs2\DY#!P^'k໣4?4ݍHs߭;Knzd6}`퉆{R^>{ش_ZFr& bFLo3nv͑A+Q)Tksl<wڨHh}gߏ>$[u\-$v=}{$krv"I}qˡqϺhf8{u@I<{@k:YZ ?ՠ=n$;lahxpuM2X+66EPiQp%3:*XUlx *` xQ-}Tzjg-.}% E1|ppw[=}Y(08Mٚ讜wXAn.`mQn.GqZ~[R' s,i~("FY̲!; #km:dž{V<.NC1*q;QD"/+6~ȹPjQ2diuoК藼J>pO'[2M25bi!~<ϵTR&5v)j/p|!=`KE8 VQ!dDONHuzyUCY탹;q0|v0/Gz}&4{̏DVƀ?G?[©N>Ued[٭wPy)"uTWLJϷMzdzbNz&kZ"t93O0[Uz\\{\Cs9%tF[ 2?h~#lh, 1M*_b2}ASd7jg%,<]Qptd>A6- .O#' o0l{caL>-}HCM1R)r]BVVƱ7u{ݿ/8+bTڇsv`zܔT[묊'o—DmQ&6$0[Ivu|8$ $n6JeOFSw44^"J%ʲ&j(Р)*&zt[&qcj`W6BE?ۉ#ݲX>ntmܵ_I_ܺ^솄;f&o,~>XQ8 f ڴL9o?#Yq@@l0C |w#9>13>n4 tm'[G.ox銟']f`{ȡݿ3q(121\/ L#H#' ^}[ 1ɋJ5!rS6|AD&6'FOggS u4Dk)[bd~tux\X]U]\V[UTUHdbJ_W~y\^ZZ]L]]THxue=Ҧ{?|x ۅ_ICME~/=8if?Ǭɇ#>2؉rjh܇> Dbj?,yʴY?Ϻ}ȍу;RW;,%cumgcRfNqeS-$IF=Faq)2+FuYLc⊧gm,-AqyFǟRM98縹J7ƾ qBvJkV~GqlE.#+.[uZBO9$ڬ~+`v΃I N8touK<C=-WIX{ H =}UE5{l,|`^΂.𕦰\#Bp'k%^ODYe$x&aO}G>(^vaUI]w Yv7֤˓^#4è֡7Rl;e^7Dp'>9i ;nKE,2—Pieܐ{I5w8?SbSp~+!z ߘ(j Lw(f%z((v&_Zj0 H+Z]}O1V^,o%Dm e xͯC?7%,D0峠h.F ]xzqK͒= Z8ֽyv0K??#X}D',D˝yZLB]cۘv(29j (aEi:O,!I{[q;(,M+m-w ~I woOyK]8ߏ JI'AjqZ5X`T3oH6ٜXʙC5 yk PuĕuyxI?L4"Ac]9"be+'7>WՋR,Zhz|jZv(^WFZ|a֑t%eӇ[0Zuߟ2OrLwKQCm!kmkW3Z|#ޫD LihevPpp94Tʷ} XiH$h>lv `҉2 Y*GQEg9tѥT5;UGI?h*^{U:af Kjb5p[HLn}vڿӡ Sc^QQXJk=Dَzn}㐰ޖ"۔pEXJ0xTiQ|oz8 Sׄtc9o$uļg~vhf0^ ZT"EcO7#qIx{X D8`4@N1|lsهu'>P mNC&>aBG sth*(ҕ:4eTP!T,hs2e1][͓=t ǜ EE]$FA-׹OTyq>8evx׮Fҵ'\7vw"˵]{?g_(r%S*>P1SU7ގ xnD鉳{ߪvM(_߿O|:}SpxD5 fI(d~pM9I9Tٜ.9,P@7m{eru/4$ oc-SMlFT|]I_e->^[K<6/r _+Mh-nthۭmbZej1-/>~ yCJ;F ΋LR.O[D(3u4\ qRfAvxA|TU^ZU+ϡMbA:U?6)S ͓c3&"Ǻ&\U|QXMy%\8~/;k{(Rl%!ʵ{k>O4zUNt .:<8<}{߇[7#o*fi.vG6jf# u  L%6n/rdS,+MV#c\XV(`Pв|B8X>8ƁС\]8|?6}$}QI f:[߿yymHF,xZt0gX6s.CI-ՎYcm|vxem{7rTk``ӇV-x}|k,tKjf+Jn?ނ[RS } dH*8$:2rtɘTݜ~Y]E M{ÕqMBSDY]|%QKZES *T-TOܲy'~{s, Dڧ bbmw{^[MN266͊ mM3سsq| yO"M;.FS }e?f KU?:2[!Y=@Eؾq2[ZhLn46"i☑}3ƜI'ŧon+/תB3Slit|qAj x,^WZ|Nenߴ_VQ!73&r6VWyPcviVy%)Ͼ^-hB!6E.z`6˿ef%*OwN9\[e-S^ +A!SaP3a߰W4̺h^lK23>4!hn-/Ӧ?82ª4WkCU zD[洟B".~eɳy$ӥ9Y`Ň& u6H+Cg[{lexdpf/fe1bXc"Ж7crת(8xO|oo#G)TuӢm :O;x}ٺ8Ksy{9X" |7<)= /ÿ6mmY _]<ď)DOggS% u4'YZXD\YJ]dcXZ[{pXa_j~wtywivzH[ZZ`qELm"83]e;酵K6/:`dVv 'x7~ 7Gv#lH}+ٷ$3&t A8.UA JXiLYő&zq͓^aNGC`tR4vތ䣹)!HB:TyŘv<@w3s<8{h'k> toj@ШPAL4" )`֓kXڕ*g,$ubd@9SqUbxzb^,}X8Ze6MW 3(B:i(,1 z=К ya'2ti}">5-Aiˏw%0Jiu4 O엻~4Y0M 7#@mX(N1V|b9.Pi2yX~(2Kd^CJUhB}焹rݗDEO#z @ދK/Kr'>Ľ]3 >7c5:H \\q&7q{qTT N&y%cVZȡ:Fv5/%, l/{?<4vw/)h;!k7S4 [<$Y(]gQ/?[n$aVspGUzD&C u:{J'O_ dƽml}Z/=GZz~zqhdjGj=ݽZ[}.]ƥ4GåPp\ڲpv*9יh,`sغk{Ebxm5+r '&Lpc6*?c?xMGݸ:-W#ֲQs\޳n`^w{t9]@o$pǾ+5 f0״M۠uLą'cv4z!'347Ì<]|7n,ߦnB_#1?`A!ogH)R"L0n> MȖ헂B-ʽIy SmNzy8zo ݬ~he{[Dn^Ô*GDiH3i>~99u)eVZ#1r+=ǿΣ [<9.J m3IOP1{_BD77nM60~OѪiܶ]ZP YjXK?IhA ޗKfϬ<c$eH"`ʴUlhaQ\ x^d3·IO& :1e -leǿg`.#ǨJ^/j`FJ#fds0S+U1s0~Hأ`]~=Y4s]:k oW;tZz5M o5L&VEDgsgJrG DJgqSؿ؂R%~(xY6+{y5AZMN4Yu4-mx>PN.>&%^q`l7Yp)y8(- Z c~ 8(mzqd-K{9BžEjU*w":;dCÀ|s[hnooʌ|xin$z G͕ K__D͗d'@xBi0Us@0񢠑'>Uy4V302tU"f)xg-5 bXX>؇DҎ7^>iXz` vbݴ56 ޷>td3v݂SX"2/EC/N9fq!S_;L nFdV V='ܮ>$Mt 5$ oF9w73jgTxR)>[.)X%Ra T:^ xligfC)W_=Ee m6KxNfzxJkLJɰ9rsw)0;|oW+^þ xV8c@{y|oq.Tfp(@>qڄ)݄j:dl ,m9ɜ´ԚC,#;N]Ln9mWakȷ+NDR .zKL(6QbjTȍ@[Cg#'ɇ6]s׹&mVօ,ooNmYe+[FYWNd 3T5eJ #d8m<,:(7Z~CԽT sc/ʴ7bN^囮|(?Ƃ 2Q[}K/;4eҦqp|&L1oal뉆,ֻ]2]Ǜ @EZI)3:RdnֳTŸYx;fkaaV#§g$^`ńIP[!ˇ[6rm[3n'o7FS(K^!zi̼qqҙ2-{}>V#S&t8<[O,wh1>!L?*dX'9,qMʟO,/Mm}aO715(7$Yo8s6؟"P8&8 ?D_Lop[ gF΢;b /FMViP*@*Lc>pRٴaogCZs? ^\#jgۢ@kVRsA{IC~nm۵x3~qe3 !57Ya4퐉i1wc٣Xh$Q 7>?(nsOsFN[:]d:y=N1eT=O/W=7˚mL|}~~tlHEm g]O>  =D#Q2 Uo8mx(,'iㆊ';x-Px K6*.%?1)ڎe YѢtAl 6?D u``awȅm{>\k7Gҫemw's~}B|!L[0q}w"/Y Pf!dʼV-T;ƆaEf +*he TCgPB=Pm pűM--Dž7Ztߢb/(5l;g;HehzV 逴Y4\t.&H_J^ٴco!+T{R>@ "y}[JE7C~[{X;jlrdMNަ\!rC Is_hnɔP:QKV J>kxK LDȅ| cS̛7 &d#rS} :&俍9y}jV7}+@cV(pw'ۯ9,ׂGP4C;W(آuvNJF\L)߽%xдF3zUjMZMOW~P['*|ӏ$m$o98)(\{YzzwU֡ E[;SEqۭyb]~8/O :.۾$xZ(|%%6m15vT _" fhZfaRE XBlG 0}k1(5551$w,֌0CTRp[WsJ#wqCpwu=}ϞM"^@5l#K٬7 !}{n 6zDyjuM[&Hʌ7%/r)Jfnp<C$EN8w=yiӄVhάvY$ǜ>rfj\cG~8α&(Ul8hM;1/b_)_FlҥNBT,[nX)yu_AilvH-]og%p% Zs>E>;Zše= *)ߢm ٞc?mr²:gq(WZ:.ɴƻD@>>įiIĶ nsƋïV5]ҷو&hRxWph&ҙh|~ ?IëɜoDX^8Jg 5y,Q6*D>_~ 1Lق^||$gQt= s޸iӆux‹E:G1;ͯdp[@*?! 6^%jK-IZ `wbH}k_z8 rdʵdEz0fW7ZDSЬq%!+B=dX{3m+$ԈpdeC\v?8kB螋'ͫOc==qiHl<Ҍxn<Ix--x7}rFP\$[գv>&>].,ýg #ſ?&FcZwtZg6S2%JʻjdcŚd4U9ITE8}KAullO[#Go[G/]Jㅜl9܌y{N 9uNgLP&_<_^)%82:wژa7|ۘ.ԗj${THĭuIӾ/0uOc|^'3aa$5L:?-1Ab!@g Ĵe>|C6U]$r¥һB^hq[^.rr\PQ Osϓҟg*`bY~a m>쌾CvStz-[z#KY7'\<GS^  +AsȻ.UmJmķ'a&eHc"\~MȾ.hɍ1ֱk%Oi} boAm%j`'JëWr!`z)1MQ`f9~ؙ05d2q5Ricƃ>>H%rַǔ{mGW kqHׯ@޷꤈x.2$1/ pRՒ Z]iu%?9-ܝvYZKڔ"%ɏjo'BQ>Qp`Fnc5҅K{tyDc"?iE(5bY>h1uoCPߗε6|9az[۾E;@ynIMDo$tN}!4jp<LV׏+nP=JzO9ExIވA[]&~NF3f4eV$#)vbua6˶nJJPy[S/!(3E}i84["~8 4_~q +@AKs67lmOggS u4D'w}G]W[Tw]_~yTZ^]\v`[}Xd[\vvtspqvrޘAAS /UJ@ީşCև8uj#~,:˗U!ߜ%sCp x31 9o5c`Ø9$$}6N軴 uPކxE.susl=|\ ^J3k׭~ek^ZLd `vMx:mu|`#[w}x 0xAn N U|M(qt/ H-/\;pp@Y^\N:3Ə6wր{ٮFnY:u3Cq6y@Bs#Z^zUhU)\c٬M5㚶C&ao}\m7Rמ`.=i8a;jahgo qPsi`׺|3@{v%$ޞOl哅KyZvN˒M&ȰӸCȃ g4{ph(AwxXtUbteZt06d1A׎֐ 9ٞEv|66:HbzzZ!U; P#~uYNrMr#}Nl{r{/-dOkt$5M3WXCc]\oǕN:j[#|Kn|Oo@ծ@ 4^VAƵҤ%]Ӷcc[x为u"uүv+8WZ'=݇.18 .Sf]̶Wn1RrU4r+J wm:hrZ"m>}1uw/'~ajH$,,5W]_QVes&sgX혴pgU0^ldD3^ [Cn+x\jm*|r~{;~>nMݸ,0GAR4|\?Dݖ=O(xß"ޏ8?_p_My`a1cMcvzxIjqF֜ E׋-<ӇvL,'NZ ks eUP<( "j}fk[V{оF}9M 7>6uk7Ǹs9k `YȪ] @[w/vM˘i&v&:FXza3ɯ<_vpr=>?l:x9.Gٌ&)8j`9bؖHN@Ն(e(\M8u` mְcc9# j<\r˭df>WJfJ$':Erg0O s Va߲G4K.ר7(oG@~ ]^Qt`U*k0M >4w=}>b=ߌZQ X׋v;"D@,(6<8ТýB`J0P5{WG RaUl̴; 36x1}NO; ˼C5NLp/j;y]'ȇ"CMê/MKKMJd4OBIlg#mFl`٨6Y5guX\zڦi:$1?)aF)\+ʴc~64}^=.2;{FzVV}%MͺWtL\$mK@uxpYHkJ+&srG .a5|$XӮER3p%%M1= XZxH Ju촄 y~Er1fZ&uy{Oƪm;: Wo7g(<[^3\c:9i^*$qhZ/VcF,\l2TtjXnV:^.wgH2a8Z;h+`!A6ټ=ŷM+d.5)p8=#>9Y^vgrlNBuN Y+5h1bcy uB K1 ?z:zȬйן͉UNރ`C5 "GW4RP3ӥ)p"ʇ`]gloMԮ淮V>IB2\L"/<^OG,݃h/`;"_]1˪KSv}5Rc琘 FYx,3;PNP:.ysܕ^h 5ZסF/Tm0|/ބ&.3ޙoR4}YXA88w>mIaZ7ӑkoyxq= vL!>zE0fWol,k U [R_"7zLÄLd0)S PL-v=/-5wX h)1+oYE:hᬎj+g9ח-c"SLxx3 11LQeʄX uv4#Z)<\G+L?vʨ4q9תhhnZ >h Fx9`α io]۟ݏ ~1gQus*DuMHD\^ָd6S\jK[V9S-Ŕ^oΏFz5ݽ?fmUH$t+,-;]C®.Ǿ3ZH' L0 .ט $ZVH^+e51j6$]Zi7'O8&tPc2{-a_.@t@3X:4P_7 cX&_-QKqW7􅚖_ȽR 5pb" }~+[W 7fkN[;vqm'O4#d(M~ Շ+W ^+I$ rF4o 1GƅÒ q}K^Q^vz{0$$$``^ nFD/| *d *1p"R'$JyI~P(~Klק$H0$t4o@M/5X9Ԗ9_L[D ~9wxDcZ u eI\RԪC/T/F 7GI0(b ?Nۅ"SAGh ޺i `~u 5+PMvnEŶ=\-ML?=Tx&?`z: $ FXڳ+]Y$Ä-жL W瑤 0xE  u5PP\e¬Z)e* mrKz %C pֵ ba%`` w`"!޺MLj] t C"X__?] Ƣmv`tM=_lT$SRt/bmҀ. ( @nBP.dʄP$vRT~b,\z9(7 >3Z@~A Qd^5i b?߳iEC OD A In\@$ FD#i,,Ģ(16Qn5gJOO5(n<( 4l,1%0j&X @؉2p5PN B 4<2@ ]=;+!~`JmǘFUqJr4T!a 4t7?e[qоh[F\V Hp<Ѱr]y T~%<  0'$A#&XAN_(_ 7P.3PZ\<"=;oxL P pV M9` nk# 'TD !Eq@_xo!ODAf>鬭`%sA5 禘f0d`hGd*`(  lXP!7P6 kf}M B%Xm]%)6u(Q <V2!.U-JJCh9g0& }7N/)X7 ;^Lo.ȲX"R!Ї% M`E>OW ^0 acla#0h D[k0[Kvډ2uzw,J,f0PO&(,suV 410Ol(~B$ C>4q 2b]dJ홉B)}*H G-n \yP@sXc"`͑HX7蜞&Nۊ$8 !U2 A>QQ (7bf8npaAV0q6`++wQՌL( Ā'oĭd,?b,u 2s)$CM jҧNЋ@x@`Xsߘ/g*,Wa~tEO= v"ӸJ@ƜD`y/AUIbom2 3}`(%ZT!ОER)h0(L2l!"MtMU* < Һ x4 WsCCM!??L3zOCk+Cp- `; 65& X̝7ETӻ8 /T@I@ @YJypˋxԣhh C06za>Ea")$ , RxDpg^x4AJ Iltla9 ;FK@DY̯RBr f4tc EW<@9 Uk @N[E`(Pea[o$! tqr7t0T/ a"@>a` XDqF@iC5 lG'¡%Pv ՟0'RAcooI<*8&YGb@uMp86"w\]5cBTP*z^r {,p:&o9gf} @ h7Mkԭoa QoUx=Kx5^oNOt`ڞ8;F פm"ѼD]uF;K M_mumble-1.3.4/samples/RecordingStateChanged.ogg0000664000175000017500000002714214010707273021200 0ustar builderbuilderOggS6?{ovorbis8OggS6P|:vorbis*Xiph.Org libVorbis I 20100325 (Everywhere)vorbis"BCV@$s*FsBPBkBL2L[%s!B[(АU@AxA!%=X'=!9xiA!B!B!E9h'A08 8E9X'A B9!$5HP9,(05(0ԃ BI5gAxiA!$AHAFAX9A*9 4d((  @Qqɑɱ  YHHH$Y%Y%Y扪,˲,˲,2 HPQ Eq Yd8Xh爎4CS# G,]6MuC74ӴmUut]_uhPTU]WeUW}[}UUYՖa} Uum]X~2tu[h뺱̾L(CLABH)R9)sRB)RR9&%sNJ(PJKB)RZl՚Z5Z(PJ[k5FAȜ9'Z(9*:)Z,)X9'%J!JL%C*b,)ZlŘs(ŒJl%X[L9s9'%sNJ(RRksR:)eJ*)XJJ1sNJ!BJ%SJRb+)XJjŘsK1PR%KJ1snAh-c(%cC)b,)cŘs(%ƒJ%X[sNZkmsЩZSLsYsZ(PJZ[9Rb+)XJŘskPJ%XKJ5k5ZŘkjs1Sk5kNZsc&BCVQ!J1A141朔1 R1R2 RRR RkRRj4%(4d% `pA'@pBdH4,1$&(@Et.:B H 7<'R`FGHH!DD4OggSP6=#()(͸#"$()+»!!! |iDQG: fQ۟6n PzIBF~Xn汀+95e 3!Ҿ:+s]-;8tR|ȓ1'ph?Ʌz;{#o :+9 5)HMdZPT}훓DtPjXٷ>זۦtPlcR/RIv,QS,TG6(|z|t-Lѭ{ DMde_B,'JDc=>#=~=\}D\cJ &qB!d/q$7z4v z$QE\cX8SS@: @x@O^@0m\x1RM\Bsp>jJAkRP;Su+nZkMD(BX64X\Ax -KWiL)T~Iv$_@A PTPPgo%pmZ @[-<{(>q$pD P` (5J_.`ܧbHEM-(thD~ˑ J`P% ,z`; pH1. sh Xx⸿{W| 2p^5T*iVLׄ$W0. JHF @q<{,k@6 @ IpMx-% UQ2*@ (zR )S(,X 8^8e6AGޑ X?>.Vw_'W `_T „pp H J`2P@Emu I 7]"4FUȆJt(+(.+( !)Dr8T <ah<>*GFZeqOB!/,oX u`{pa pL4 *>@uEoU $e[=PHZh4e>! Wh@J ÓJ6^%80K𧬎xV0 \@y ԜJ#\2sh8LOBe5z%`3G&X@r. 4I #M`O8X+w$JpMǥP83-dS*up 5%`"*)8+(@}UĂ:A@D1ęJa*P^ }^ɂ-$o@t I HIF \y>a^YŠ5ޢQ`QdgQ"@ 8)bU8(a591q7#CXh@RNa0J" O;@E]*8  G#' kޥaG`* _HeU`wgb]]p1 g @FJ țOЩ jAS VԎm>%l.ʹ*gM̀$嶟7_k0LaQ+`@5H_h-(pԓzÓ˜^kZ)Z69kaqeF;OT~ASL 1h`/`  l Tg@$j)7KͯwxdW@Y.5kp[c J) CEl ahZ;ECҊ䭟xe)WP4tsZA$#Y*w{]"kQ @P54`|@;#b`kޙb_gתit ? A)4 &www H T %`L> 9U/Y P)ucM:2ߡP{.pmK;U-XB}VJ;YD@G¼h@\8^dT kiS<:W+WU {p5B^n0mo$P 2`K>{42vޢI/ .R`KuW-8r83PZs (Bp-Qw" p/ IR7  2 2SflB#Eˆq8&(AU C & 2`K<|H{n &(`St[87 Pw x!O y W4r>tfHJi6T*8 (%Fv5HۉBY ࿧k@W ?g!؃:Y x& 0iΣ`^ 0ZgsMՀQ/ h" y.ĪTC]/^5t,[x@1s:UfTat~{|G#J .&q1z4.@H xf%@A"mGtjXQ)JqV]I`8?>7p;(P @(P5t #@[="0 9^%^PX8.J_ 0^fC!H!n`itUK*p xps { .Ȁ`w/ @qAUj.pgՍ@E{ k 4GPEFt>Z¼j& X!M*VAi'T")ÿԃW;`& ` Q>ؼfB!/+z?{:/'03,.t%`;f5c>-^ @-j GwUH|~DE)oQpqY l尀=*wO2Ӷɼ#'&,Al市Nԁ'FȌ%3y#Wo ]β zYUJˠ۸$, @t |s?`HMf668stCEj 0Z6Qv"PxJ%Dj<*F&btj7hC{" -]'A*DEV PsQWchꞟ=:c' ܕWl"v60qL^$30%jp?[OE%S'U.34}U:[0O2? H :5? O,&@} 8U()\ 8@4.\'+@Y{m5-eE= u? ,Q(_I~0T 'ϋA0~T!A3*% di\)l)`K(+Xـ {\AY> '$HmBUE!MO]mͪ|\/IFPs&u.  b55tStm {_#EH`^U< Or]8΀~Pnzҿ~Uݽ d0y*4tB g?Lx{IPcthb逞Ai@T `*xwA; @1*M!^&X/s+/͚aUOgD@hDоU"psP@ ~*(%4k \,8u&v Eu emyiq'>&D; EPgdU-" D9-+xO G﬿̲LRjc(|MLf4OEu`8Ѐ$ E{eh9@@̌BU-bX RZwk`E/ OǀC:D%|# lM'R5DZ' ffɊgtUE:k; ?`7FZ] Ģ j.d\kBHp `U-޳PMtc.$*`di֬nb`%?n La _QC%Alw?'"vM>û'I:Y0e.5|~Q߫?ϰ`Zl@ $%|%H 5yAiõ_k5GKxuj ZQij -/U>rL;P8 GлǵZZsq4}e5|9 9(@ph+:802>rj5Gﷻ&6F&s;dj%ًsWi0͝ $;m$A<%I`0}^f:9 d) P9 ei[r ŽgA"@oU0n=Q,"؛qAҘ[ya>0Q L^YVD~06i\? q Hiw x ^-HA<%_O[T,b|zR~V@@#(= #*YM)pEߏظ| eYX Y`@4Wj/| 0@>IfԘH[ =RsK/0j` 83hZh8>@$)Ȁg$+"ޥw6f[mƒP?HAϿK0xP@9 `v(M"TSgpH2 #*@P7P@K7րD@`(fkLZ>;j;Q,WeD&A K x7-&n xs x *#U?[i|, "]u\(0)O P AxdpmsppZZj,#Jh0';0L HiX"v qtHTB~Nt3HOggS46~##(" Kzf vnoz8KԂk\ 2He&.6'HbtƨP;@֯k3SGŰ{0~?OV!;3, 'F˸ٛ90X$?uش $!̳ mumble-1.3.4/samples/off.ogg0000664000175000017500000001027514010707273015562 0ustar builderbuilderOggStl<vorbiswOggStM1-vorbisXiph.Org libVorbis I 20070622vorbis)BCV1L ŀАU`$)fI)(yHI)0c1c1c 4d( Ij9g'r9iN8 Q9 &cnkn)% Y@H!RH!b!b!r!r * 2 L2餓N:騣:(B -JL1Vc]|s9s9s BCV BdB!R)r 2ȀАU GI˱$O,Q53ESTMUUUUu]Wvevuv}Y[}Y[؅]aaaa}}} 4d #9)"9d ")Ifjihm˲,˲ iiiiiiifYeYeYeYeYeYeYeYeYeYeYeYeY@h*@@qq$ER$r, Y@R,r4Gs4s;u7%@Ko|Q5~a ,z4b=?w7G5}Ă^Ln{;Ϲ}i L w](ogh.!5mumble-1.3.4/samples/ServerConnected.ogg0000664000175000017500000002362314010707273020102 0ustar builderbuilderOggSLϿ>vorbisOOggSLjp-vorbisXiph.Org libVorbis I 20090709vorbis&BCV"LĀАU7{Ƚ{G{{Gz{{˽s 4d)rBQ*ǽ0=Z!B= Y@!RH!RH!RH)b)b)s1 :褓PB )PJ*RJ-ZssA B!B!BBCV B!dB!RH!b)АU I˱%Q%2-R5S3=UTETUWU]]wmvmՖmVmvmVmYm۶m۶m۶m۶m۶m 4d #9#)")8d(8H%ifyg詞 xxgyxgyiiiiiiiiiiiiiii@h*@@qqqGr$ Y@R$r,Gs4s1_|:6Ԇ=ڪDKOeojg2) apcݴrO m͍׊W֑L9mLgBVVF$^#f9^J:NYՄj H/UCqp@2yʹ\X$ EKt*-09'DkehQUõn/W}lӤ>fugKM tBCw{S|Z,ln%ִ~ IaxSʀ I^4ڷΨ>\&+gp6XX:;@(5W>Kz8.g8qV&%I g i_7SP#ZG܏]6=+'K &\CVeޥvH _؀j͢)_vғCH 6ܵ{_ߚ`Fc mf^j@07@>=Qu#{ͫ3 pGU\?Jz`  K,=YW @:Z a4i`1\pM?*XhS@@O>xТ*(eIq% LtPJ̡nv0?u8-0Hꢎ,0`9~0L ^_v@~@>C ~V@oR?[")-VPb @*1It `ZK*80X>16_Z ~iC I P(o7ek! x.;٭ ‹G:A*݋JTtWa+рwލ2C^,ǀ!u U \lb* mGwO o,h.t]" csF-JH" I:;{VIr_0[R-` cjlPPR xlx0ƿin` ri@9O>lX|⥸X<@C±w~Fh@c҅z ?n=@uV@ L&F (LXQP(Us.| <&^7e!$# [=V0̈́ `J`9? h @ 8'Hg@.k(64F.+pdU@,5`J, tz\&^ث"oE/5i@5+R"b3::%3@(vɳ|6S?H6yW )asQB0}!P" L{f:?[~p%,)>K{/@((-wZDOW@ALYOr#Nx>-tGX2}`$* #ٵ?pac/"]Y} M %Zp\<_2BR ,u5z &Yb`m`x&rʉ!P'4O%&2 r 90nl]N%(*@1(XaK p_s5 Ʌ$ЉpP>@0&%oZ+l -/r飩xR>"ʓ rrȿ4?KVVPrWȁ? ۀK vL&, (q\2hK?(n3๱ DyHF"O.]8pPj2z}s$vF- 4e?)c1c 1{GcqPs@61*16z$Q/f8;F^M윗asڶ|\X܊ }T[ %0R@zA@߂9O~5*ezV}DXGiK44 x 9@ V =&_6hu@$ Hwo-GLǭipMP @[W&@^WPk5 FjUd@]>oP|iH_D<czH$OggS0uL)! ·>u2I4_xo7*-V|,?~*yXH? 'oGJ@tb]Np ڬ)`[&uSj> @MoS@8ϥ)V= l8=NAPdlM^5 ,n"^( Q :~r~0``E K\W.d)ټi? ^̺@i;&oD3@igH h @IH3JZSM( Tg(/7.d\H($14@($j P^ffjpVy pob8 @l5@72:Q%@(ј$m , [8w@S@I.҆5g)(PE:Wʓh|!9bO:H>@C- p p ~5tGo[K~p 0oqAPT(lMw%t ¢61=@2 PvJS +BfE (qv^xQ{&! Ьk<& ,"B@mw;3'U7 @|t` />M@#%MH{6 @Hs &Pʄ=π} `( `gL4UPdIw$X-ɲxo01k\b׫nY?g,GQ?3pS b:-a 0RJi @#@El*-ZR\/*EDE6X |rGN `b:47<2TK7dw3s#y= z$ #4FqTl?24WSR h4j v t*@HVG$]f!Nmumble-1.3.4/samples/UserMutedYouOrByYou.ogg0000664000175000017500000002130514010707273020707 0ustar builderbuilderOggSLGvorbisOOggSL-vorbisXiph.Org libVorbis I 20090709vorbis&BCV"LĀАU7{Ƚ{G{{Gz{{˽s 4d)rBQ*ǽ0=Z!B= Y@!RH!RH!RH)b)b)s1 :褓PB )PJ*RJ-ZssA B!B!BBCV B!dB!RH!b)АU I˱%Q%2-R5S3=UTETUWU]]wmvmՖmVmvmVmYm۶m۶m۶m۶m۶m 4d #9#)")8d(8H%ifyg詞 xxgyxgyiiiiiiiiiiiiiii@h*@@qqqGr$ Y@R$r,Gs4s{^oV/@m􊶉c0q*4JPZk$h2G㑉tf1g>=Uo]Դ'~m8x"RR9ϕ5NTr&l{Z*=XrƠM$m,,N)kD]a}P&eȻFDcĻ>FjJk!D F k?nQiDu2>(PB[N;U&Dkk$h:\|: <#ڎ6%.rYq~w7j1[L_k:pkv;,t%4mpk!#W[֔jn㣥ZUZ^uW~M1 FV2l" Hb6%&}w(bA^|b2V=˲I=xKZT \gCutE5 +*a v ti:>tw/y\/9`1@#ӈy1̯oj9}FQ!u=%:8*)O H@}@|H 4Mu$awJ\NK@V 4i %im+EZ W!U&L% &UqԽ+f0pA0_3C.l&T(xCg14Q34~}9Mjoju5%XtnN4]|w )e&OD xg@<V8\D(9S/\BMv!g,}Ֆ XT3@PEm_"yG:b+u-`]'PԀzy,P|Z4 : @ a 9N/9?@);vCL]}#뙚x}ЀMKBNK@`\P@5pj@ _r44p\=vS0U^? '" -3mA]Se;@@$<5͕Q#Pph$V({X?,5M #@l$}yQ` rr*h| ;pO }I &w|7vW HB "-,' 'Q^5},^m?Šw PF^'[oMDŽmgH bo @r}9i2+PYfTE8 R^ ܾO܈*3TzWJM:"glD|@W4 8 _DTֵRv#[.kWDY풬cRa}] %J20;\FIҴ5nퟥ ~}xVG*j[ʡ9|νOuUCgiu[B5-FZ+-x~x&ܤE#,ݲo5LΝ@7h,Y"98Kp>۝g4LG?^ݏN:<ΊgJK-8Wo+B`ڜf, o{rWĻ5rզݡx (.@5@<@BCj!IW@džwE| 8a,b>;tp D~+x:ś=Y>S `g( 9e$9ט pQ`/*[{D%(v #$e@ RuzSeFo'd!UV/Q+LIm.? {mW~F,<\EeoYWYp/>$hFU#0Mtsd0h0 s]lgKLs: -+f09 @mNTJx,x‡pjfJ  3x;>ܖA%ro3i) >^ӻ8QU@ G5M@ 9.ʂs` !L \tMR 8[\jPdX]&~Im%ģ{ӛ[\x) pcj SV`:4<^SKW~hl T0(Pj :/ $nRD";4Fֵ9rLG<4Am*X~KG.4k/V0W -!q $h9qixs @aX+'[x.>ʻ5WL+&>7V%oSX 80fI$ .z^HP loRz S¯liwVI ˫O&!=PJ--?+Ay*S[ms|f,={=.g8P~J4 HGaEj6IJЋͭ yW@`n @Sԋ`8 RΌq:]s`w ?Ѵ@ک5t޾-Hd^,(E˽z8DN{+m&``f`v Ԫ] w|w*;-H M*TN8q<ʜjV އpF!9I@@w-PVRѭDʄ,)%>W_l:Wn:7 %Lz`ZB'^ i(pW\x,lܖ3Mwؑ -DD\k F)<=_lD,hbJΜK+OggS0uL+Wq>,ky<\|.ܨ 5@, Hi-dP,R бHD@$G )AeeJ ) hp*e/u+άI@*2jSusQWp6*Px!@1>zfNښd/8BvQ)bnb3xLHN/D+(}ݩ{Ղ.Oմ8p: IBHJu3UT؋*`%lxbH@)v']>FB xo1nH6UqTߠ~~ҫ7oW__qvcT4c_lߎ*t@lIU8FJ5L\4 8O,@^ iA&@e1tN+bAڰ{#?rPSrUA@ $wz~ig*vjX*xLY|>$@/~`Ϸӑ "P`%g/]`@'JmaH @\a*@̢ t|9rcABrb9H)y Hbm暥Mb|J!XKZ}L|^1 o~-ܳ%9N pZbXU)0=~m|hTc0 _uR x *b@ YoԿ H(:f!~ Wx8|sa޵<8ޞ[ʮ)'10{0 @H!q#]~QlX`,KQRD]ӝ,:NH QLyR zmumble-1.3.4/samples/UserLeftChannel.ogg0000664000175000017500000002066314010707273020034 0ustar builderbuilderOggSLLvorbisOOggSLXP-vorbisXiph.Org libVorbis I 20090709vorbis&BCV"LĀАU7{Ƚ{G{{Gz{{˽s 4d)rBQ*ǽ0=Z!B= Y@!RH!RH!RH)b)b)s1 :褓PB )PJ*RJ-ZssA B!B!BBCV B!dB!RH!b)АU I˱%Q%2-R5S3=UTETUWU]]wmvmՖmVmvmVmYm۶m۶m۶m۶m۶m 4d #9#)")8d(8H%ifyg詞 xxgyxgyiiiiiiiiiiiiiii@h*@@qqqGr$ Y@R$r,Gs4sdXj=WpTHEv xaܦ?Zr'ą'/ȡXחt TnxjVUi)znlXa\kzƙpq2ef_.=ҢyV nĠ&Dn|Nl-r}]xc+;PzçhLđ'I5I6 BV!JF%UGZ囂wMwd5Ĉ!%ɒ]2v |_F^`BPhKe zP;vt嚂t. VsJSZ#tOX23#=wZi).9 TGHTLO':LUA]kZ/nSvDU ޵|^;8PVYUe!'_fZwwv|e\t1i.6W4G&ba^֒>82/ny_7ԝKQN-*zRH:B`_xAdu#E;ȻQ_%|_ojQUJԏ0|<[Q\/&%-톥իe>wDq26ź~\[#mp3$zׅ{ "rtԭ}Gb'vS6DTO߾"x2(kjV^ P$J1H*L,^;_쏿BNHr(T_ōM.M +#'‘aRrT}˃c}.ڋpkpU u$ )-SiZx61L EK7h2&(Iy޿CDEH1X^$UxLss =@U rC m..bDS2'"M<g E[EҨזo؞5O3)kSUfJܭ[l]rsuߓ"mg/GŜ !O3֏7-,Jw,bSflRt `V=mOƖnbޔ\v2AZdZ'02p@DJ{& P0 ԗLk {TÏ1MM_%q$J@ @qᄏ]%T\Wr/o^~k>0dBȹVV* gUW8g=K`$;5ͧielN@\h],Ț^-r 0 ;J`%` o7O!ᤡ&?].XS+a&r:@c'H@ ?Os@S @(R̎ꈪ@̨|R%@!堠:Sv{ ^$U'K=H7#yT `I~ L ]UHMψIhV~Ud a/$Wi;8 TԵ*i;@PA`xL݊&[] P4f x`e BnO!m`]{ Q  ,.O+:) 8V֤ `"@itP6<8=w{R@`'S PhP" L @QZf1 Gl9$@Р @ Bw3KdNgqHqwH~{4Q }p`oU ` ,  *vpR Z{ {@([@AoijZ0~@M wA߹CLoY VWm9~N~y`E [S Uy\t @8`·NC!6J?n =u-:|yMڕTTZ{d)Q-X|vSON*%iY_y$uJ1 (8aƹ@y  BqHM&|H 4ps%L;TkQ 15y˧Ps4@q$y?Zs\Z^i6 o^x?r6ww5Q"TV^8I9ޢ{AyJ26k=TO{N].Yڀ ޻77@ qm~  fP >I>y:h>\=cDV3~ʦ ,&@H` \"BOӃ<`p)(V$& [!*2vEՃ@ X(jvHX@Y@}@InӬ73z(3vMX^h˯&T*^qAίEN w f1K@Ѐa> .=\8 ,`f#Ohj@˔a" P}@Y<+| f%?_jmk> `jH`{t"_`xOggS]L?rQݷ^x Xo߿޻|).?+1a=@?h`sGBx H(wlD4Cu e1)P0C=# c0um{ڧ'G5U@0[HG/ p{`d %/j*,Í7Evw*z'PaꙀ I@=_(P6NeAX vM_U-sT0)bLJ p|=,H?J48I%N ٩ {_gwe>yv3=ΝfBާR7x>}/aQi7I=* KҗON]iW e>o4Md.j2Y~V/Yul0,'o9 =:4 D!d{tAmumble-1.3.4/samples/Critical.ogg0000664000175000017500000002360114010707273016537 0ustar builderbuilderOggSLIYevorbisOOggSLg6c-vorbisXiph.Org libVorbis I 20090709vorbis&BCV"LĀАU7{Ƚ{G{{Gz{{˽s 4d)rBQ*ǽ0=Z!B= Y@!RH!RH!RH)b)b)s1 :褓PB )PJ*RJ-ZssA B!B!BBCV B!dB!RH!b)АU I˱%Q%2-R5S3=UTETUWU]]wmvmՖmVmvmVmYm۶m۶m۶m۶m۶m 4d #9#)")8d(8H%ifyg詞 xxgyxgyiiiiiiiiiiiiiii@h*@@qqqGr$ Y@R$r,Gs4sv.A Ibv).ҽ}Ԇ=⻜Gci$پ7*ǧ}6lfXUG;0/{,v/i.>A .#\f+BݞtIi` ` gE/׆Zl̉~3+I{z&]8B`P :7M(}x\#Xv(QZ[r?ri-x Z ^Wټsfd;n+ZK/:ŁƢϴ2Oc3^ 䠓}#YC+-#K 5B6ךg aN@ѹ7܉)2:AF!Ks >㒄i['{>C>i>d؀8(` fh<+z A?-z7(({,Z#QQeZD) X(PuݢwQC9犃J P[m_UW˭_T63ԴQ茈_b7>X UI$3DZQ3$#)_(I6 > ZYJv ?LT@ˈӣ'BlXEl0{x$R 0@L ؀$@ذ {MHO,Tgڈt1%h$$@3^x](dߙ`/qppVC f3N*W @w#*hDY(T?5 M!}'`ȈoWs|Ol7gh4BKEPC aŽ磑@b?{ L =$ ^7g!:ɟ!$24d~H@{|zO'Sg5ژ pyj?iY۶L`Yp` 6@B+7b #2`_+e*RElVоSKlL@6+lf#%TWJ[(`ap n pE}HEЧ0j iyq93ő e}[$!5̮*u 8 ㈹=|iN ?}r!3/dң< 85id.UN)@ZŘ@D?a6-0RtN`΁m,l@ o"35^,~볩i`?@/XbgL"~- QD2/G8x \|b J̆qsvC%-`3 鮐F\!.vXE6G&G P ! p>qJ&\tpXlx}9CKm@Rgs/I9q pMXi<;>j |:Eڈs0}x+n״"(A,,8. ~} Զ6/^ꍐ$@\q& H7U@ -S׮F0& \utx'pGw w6O W*70nslE=¶ 6d@2C@Dc 6!#忮װhg~SiFCOzÜ ;Gʕ@&+*f8A)euIf\7goO9fFMX$yZhXd?V'A`}Ё M Й.N1r3K.>@R xs@aCrc_s7Tw>,U4u_ nV+i""whg6>@FsCrNf\T8: ;´ HB|v{@O 0ڠbfؙvD 0 [omAP/l<$W攸q-\A5{Dp597 `@^ u r' -lv<Z0Syf Pfvc8b_޴,-(5,`ss@n01{!SJ?NgӲ +4-Ħ)MзHn[(e||ÔCE(\8#&J{)O> IćE43S@ `\=Pb~WĐK@4;+yW>@ dOggS0uL+p5 ż^~MJ7%d6 im9hbIf 1 QS@3ݴ {Nl0\)WQ&#x  ' !G>Y{ zDp#\Bh_c?YĈ1I F 8A~Ah/).'ѷԬ+ >H T87l7ElȡIh $ \0cuZץ杩}_lwĊ@SJgch80:Q ܟxyeīq8g.٩d&z=Uic{%GsB,3|~p530pۏ]p1=m\GZy wOaR>R Ƴ_}YAh n`` g/ tf|T.{⩜w;@t1 M~;YkN'6lXa6|!3nچMq`;QP&T 24fأU"}f@^!H;TdM =z#TgkE 0 I'FI7^teMt NM.8!$iĝ6Mwt@AK[?6") (-q [(e dƑZ%^*CIE}1-;$7zH H<,fIQf0 j%O@bRкlRǚɶ7 aH9 $y\;0fy}cަra+]^F0E-{qDpOX0c bj ȩ@THlJ >#gBQՆ/YD̐uNri2{PSPvF 0T$%)I_5s!޵oGn/exZ 9t" Q ^#h}>̔/Էk*D}c||BuawemYycdn3+2Dc2>5sы*ƛ_鴴9K9vf kOP]Qoh |onMUϻE=^+~]^i'gxST diL$GC=Fw 9FW9}HB+6vVg zۖH쵸j_[f?Rj%ŤϘ<y;xzX3X* M0r^oj/6,i8CͲ1W9J5fXiPoo~B7̼>\4;bNZ[I ;mumble-1.3.4/samples/SelfMutedDeafened.ogg0000664000175000017500000001633514010707273020317 0ustar builderbuilderOggSL"F]vorbisOOggSL\~-vorbisXiph.Org libVorbis I 20090709vorbis&BCV"LĀАU7{Ƚ{G{{Gz{{˽s 4d)rBQ*ǽ0=Z!B= Y@!RH!RH!RH)b)b)s1 :褓PB )PJ*RJ-ZssA B!B!BBCV B!dB!RH!b)АU I˱%Q%2-R5S3=UTETUWU]]wmvmՖmVmvmVmYm۶m۶m۶m۶m۶m 4d #9#)")8d(8H%ifyg詞 xxgyxgyiiiiiiiiiiiiiii@h*@@qqqGr$ Y@R$r,Gs4s~ v<}Ԁ(&wAሣߨL:I\W7*%5c J%CvjB<HK^:%O@̲35U"xĨՍEck /O0KH( բ8654Rp%$4PЄjp&L*ď^ +05#kziԐI 0dg&@וuJkm0) @gYu `@l6ho}b~(~=TVcT^}߽Q v%X㏩@"]T3NcJ fKa$> + C4 Ppx 1vk^^k@lCN}?UDf=07&@&$<ï/~ f @ >] Q~B{o% U2Yj@&1H@!<56Mwa$i=9`J?Ƅx"~P@& "W,Ԡ u-Ahn(ǛnOdA g.&XNO-@!K9],ߊ>o)J=Fe*}{fa~B M^N,@cxf Vil$(;Y\B PK(_4I> *4LnV@`Zӂ@u ;ޯnPh?hz`wp _巔W#-{tD%,o %FBh&8H ,z WbhY#>>1@\ 9/hv)`Mx{X]o7=>oXk& n @p=bbG9qɖ⚿7⡴L7&!h,att/@ ZHuVt-A %`P0 g;X)M/. *`4y:i D1+ P@|A~HSNXyI!^vv8< Ъ*, Pjx2TN-g桠tL'׭(hl@F6"  aQF_09ZXGݫtVx>@'VO`'hwǪ@9p 4>$0+#7X5߻o*@5 (3@,+lv H^&/@z^<WwG3Y~Jx34Jlp`tu +ML8 Yõj'S}\H9ujZf%/ JS74o_1QG?zraJ˚Nѷs{p;@Xnx`nAr973Kil@AY ):K,yt RP@?pE 5ء4 3*`6\n03Bg[`S/-޵“;ODClyh..K@\e_~EN> N8?*#ojQ3W3YJ@Vt?64zZI@rnmumble-1.3.4/samples/TextMessage.ogg0000664000175000017500000002447314010707273017246 0ustar builderbuilderOggSLΪbvorbisOOggSL`K-vorbisXiph.Org libVorbis I 20090709vorbis&BCV"LĀАU7{Ƚ{G{{Gz{{˽s 4d)rBQ*ǽ0=Z!B= Y@!RH!RH!RH)b)b)s1 :褓PB )PJ*RJ-ZssA B!B!BBCV B!dB!RH!b)АU I˱%Q%2-R5S3=UTETUWU]]wmvmՖmVmvmVmYm۶m۶m۶m۶m۶m 4d #9#)")8d(8H%ifyg詞 xxgyxgyiiiiiiiiiiiiiii@h*@@qqqGr$ Y@R$r,Gs4sd5քg]/aëݜX}U2M02+\_\F$H# ׌!3{Mk ښ!/ĸ'PԐ'j@)e)W?ߟ4%x q h%o7> +7.w+T.>0Ku'8&^[!0Őqa 8_W9iGgU٭>*lcے%<Ӯ.Ii1q^U"^`vTJ :\+? 8#!|i}z(< PW\@T%piUjN (Pl"zc`xӜYb7\S..8: ].> %J(av ,@B6"zg6_ 0 $V-O,/iL  rnxuIVӔt U+i?;>6~;@OU o2᧡04'QCgqgȲo_| L0qx%So'6,V9y3lw 0Q<`>0% 8I6pt8@"@04hjAB 案Bhɡ^sZ%Q\Pp$~?+@^gUa*]h)$EJ@?Tw`իuJB@"K@PvX 1 &`Aq  X% <:g<η "P˹噠98wgT7n>;JM)0NNhjHm 0d Q E@!SˤLp_=ȭY^p=-RW霪3CP60 [(&JFoLt ^7 onÉ#R[*/?px\80t5O' 0 `ҡ, @HH0@f\ F޸PsP@i-.Mb,H|$C @M '\h(@k#4W @vps pr Y^&:(I$d:%MV>qs/8K)xز1PCF:&~aZrLqm3(ݍyy 3X. nn/TE\ EiSALvXC(O)6SKH9`NK>$4۝('Nuf?'"1Jx%@'`T0$-5\|O_fQa%1ߢ0U/E'hV~@r@..8.K7  a Ps(x&&E`p2PD9B8qDg1yup?p]UO `_%02H $LG u9mK{R8nn4@8m`68op*>] mS8+ q@W=AT}y@0o5@X ^fNdFI,&*r^ >P| (;p8xOBftM:,:ub09@D=p `R@8 4\=:@VT((_);)rd)2h(<p4 "őiH#3YiUJ<''ܜ$~ܠ-1bxatbq =;ҏڎπ4::2(P:a`fi(M)& uBP8J3P э: V1x_1ll(ޖd<) -:U,昿 ]W\Q}vU(G9aa9bIf]@8 ]={ jP\bQOq"+PQw @kA@utkU&gH ^`b_EOggSLfDȸf St"C>qg:S` .sN셝P?p =39LIӰ9?=lk0up~ (j\ Y(^S.w1@7 P 6P @0 t^srcbsjvh08?#G.tz9 @K^/<%rS@  4 @x@_pv"D O@q,3 ~:<<fC$moNMx#+SpSoJg0*0蟒ad#Гt,rjӲm_Z#:@a2 ,YޯT~eLsd]"sD4S\8Д' q̨1@ TtI $Z7w*)sS?vWg$`k H($8 a 'BhBN7@L;V+֫ ( =A7@/B@P,=roUYnuQ@Xox0V2qTԼc8 H'#lJrfx BH`6%!9H,ӕBjP,sP @9&-p`>e(d_zp~V4b@291:` !1$b>3Nb#rHs(OU"p58u€dA0d Xq.|goP͵O:0T8]j)%T8oWT@l*E"\($O06 1`0 r~ޡ#Qxgb [D;0\`B` LɌ0HX X@@ H'@Lc@8RfYu;8.h] B Opk?&FRTVME&6t(&:~"r&2FbJ80 ߛF `IŦP@ K?87S-PpDDL(@}/ jJ]bA`[P6',|e[vQ%@a8Fylt]*< @֬dX' N ;ѥ sTln@x 7ƿ:q _A4!{Ls朣_ g2@)@ o"1BqJB$pgAC LU2~M#(FN-0wtMG ܊FA$\\uP IP̄#U@b 60ILDh:H @6y&/!AczG :PAI[]R,n)]`^@&T-"@w`P@HnU\$!ml$/z;@@&Dk5 Q[PGW#t$NȗuwRFduD벏560yv2y ,@i˶2B5dD #ϑ%gbG@Wkjz>$L>F 5Ek%Y{U#xP 'ǚ7;7EHoo0|ΚXP3| <-l=vo`mumble-1.3.4/samples/ServerDisconnected.ogg0000664000175000017500000002426414010707273020604 0ustar builderbuilderOggSLsCvorbisOOggSL;:-vorbisXiph.Org libVorbis I 20090709vorbis&BCV"LĀАU7{Ƚ{G{{Gz{{˽s 4d)rBQ*ǽ0=Z!B= Y@!RH!RH!RH)b)b)s1 :褓PB )PJ*RJ-ZssA B!B!BBCV B!dB!RH!b)АU I˱%Q%2-R5S3=UTETUWU]]wmvmՖmVmvmVmYm۶m۶m۶m۶m۶m 4d #9#)")8d(8H%ifyg詞 xxgyxgyiiiiiiiiiiiiiii@h*@@qqqGr$ Y@R$r,Gs4s2[ } y "k@aJ-0>{dr:wACB7Y]t՛B@eQ>` Y{tTrODՖ*gƀC=(5IPr,if|N߮-ab P p @CN$W@X*r7`1$` '!Z#*Mm9pifJSТJ%ՠj ;b^Ĭ6|]_E 侞DSh]74KF'{VeTVZ0U?*E& @q+ϿZ+]9V}ޤc_DK\,V@w |h@SsB /=tU@J0LB?P_HZh$O8\i* @z% Me 0 Hο,` @@j~ȝye.Zst++` DuL ҽF$>- (A} W`a(-uBs5^1V~L%̮`6@E FX#\YilgL-PǍ W]ӾTX$`?0Q `~PnMm^|Vl=48cDP+ w"  (ѻ0\3q, %BfOV0{L-r>TuZ9D׋f{߹O˾<%Ojx3;&8=t !Uvʀ$ >h ( @@C..W @0۬TaZv(m p~? $Dwh@tƕ<̶a }qJz]08o였bu~[K`KRJbBuSU(@LNʍ-d(p&@JooU+'IܼòjGD [*'h!cG$VfO9̳bk)z]y7!Pxd+@ME,H;= | KrH `#3aT\nn=EO xB\T@=!?4zpX*i@=$(dedC x ^%  % $ÐaYV+)3.7E|l֏sWyE)8~ פֿ+N@ g& xA4 0oy5vNUehO8u!jk c2&0H@?V \͐`@PP;< ~ ЀP}p3(Å:R0R `jQV֙[Ip౮-~Br6ӯ"c ƭE$P$ f5uxA4@ &bf/HP _`tQ 쐏! Kd#4V? T@L(eNPH54*eL,Q(©InW-53d9#&qv14? nEu صeUbE/<^tL%Iz~t:ZBKfۣ5$sߠ3x-|"SUW+쉎+9l zZ5NP4Oth4 @wi 2ςJp; @k-G\=s֤IF43Gj׎ZĹ]=wPo 86=-+)I%C XYiߢ<]91/b > L s5X-5l@,2^|%P^o(1!lA_иh8 !Mwli`f ލ[:%)Wf{x `+q[YUp@OBNT .y@idj%VaNWo9E.t7@f =rHo1X$|R`*4^1!`$ OggS0uL.:n f]@ow{%@Z"D_*<@#'zBvoNYy fB$P3ٺ 'W1_@O٢+2feS!(Py$.4'ѥc!$E 6AlL% $_]+gYJgoa8 K؉6'FsP74vhp 'h@h` " A:w\AΠ88t UL2]xv` 6@BP)(P^s (/Oʤ @vRcZ; yOsdЯ;`3mxW2_7@,@^]USȌ]_ޙ.`ZX3 @p`KHܱ"\s QQv~D?@4C*bTS+ @yؾZ,{qfK:2U Xiz` |X~gܫKR^*+oN,v J)Ki;,K6 @h#8ܺ^a Sw(76@ꡅ) d ʸ@ P@]gx~H-oiEW;(co.*0@h*$ p7$\OHґ\7?h=V<  0@H1@ ` H8¥9HLsw&W  -A=$|Pl*@\SD4.0u=+3]xf'tOk׏P`(@  H 8&p "K,8|p>"MQ tP?RکԬז\?bZ@~(-!`(.=T}x5a w3{y@=Kk4@R3sC_`Voz `@=RҴhY D 1nĄ35 2E>P 5@yB-G:ޙ/x>@5+@"ݓ@4>g$i`ig@EyA`ġΝ(8j @FBt4DQf)a6ph!7}<YŕZWB/{H# 0-,p%P .0Ҩ<̰5 X-M(vHN.0e6+nra<[ZbPe+c%ja'|_:op6F]byprb~O}_JU hV}\b,Z*fYwwu"9`X8zEyx&_ghC16u`3ZPcJI(ǽAP"`ݵ25යx|_7bWXE]kDwljMae>NmளGFsƪ Q/aJ'0eAx|:];ٮ72JdT\qH=C72Hcݚtfh |_;/Ԇb T8B5%&p[NIAp C 0Lb7\K>Rݎgn3 뻤 zW/WqSs?N QʎS޹C -r_'k5ֵ|m7 'G58}| AضE0\n ۵OoGϩ4gxXeTW,bV-;֟;%@q~+=H¼tFgU|j~p6Ia73I(PͿlvH*.`;v蔯0qldjقƪ ^z:|8 p4ݦp8t~Ʉ2W C/qⰼ(-sַ,jSri 5@%Y)Tm9#qߋfD}m@eh1A8߇9+ZǥEMTZE~er$PW& d@Xx_,e z5 0 f'i !zb\9k MpZkx egSA%.2c<{bTW*4ypUZL-+F vi˹IxՁav±Hl9?gx$@:0\*: 2Ӳ<lbȦ @ Ѕ,~ +45C%] /3!ɝMl ec]!b6>ATF/*@`RHI֘{+?8^rT eM`fxbݯ[ҞZ[P)$ڌi^aaenY&bK(ktAj^IFL{x& OggS]L%yB¼IĘb?ûIo{>*c`w=@] πuٟ5Rg;)!J o2.|*\sfT^ߗXM0YL5y%H|ajΏ' S1dWKm%%𒙾+3ݷM5%縄{`iT>\ ^AqShhlz@(L"ubRHvhRْ97DVWOLWSJ V,P=<LA*pn44i*I"7 )Bn[=)ttx#К|N-$_$Lۿ@}@^>t E(3`,ߚxNwmx) .@x̺L О׀&-Fۡƈwc=UC^"a'VfhӔdzB+Q7;NuM1 茭5I:uEFsxQF?Ny8/%2h'04fX B[( YdI xA/:(5Th0mT =ՠqWpYg3} SG PP('*Lp$MLM>Nn!<[fZhxuԽu;SS˧& ҐPd~O~`1dw*{?"x FW : 8@ Px#5x)`^rX*ק$X~3SRW x,FRn/}$@ݿ,&s$C0p»!Y*Ǘ>aD.Vf͐!p\fl  de^x0ay3r {V Ħ$gpcz|eţ>`%s]p<5w0]5 ^5BT`p몝d[S9ɉo?ȓ7pZR*K$@Ӷ#bHmumble-1.3.4/samples/on.ogg0000664000175000017500000001031714010707273015421 0ustar builderbuilderOggStvorbiswOggSt>"-vorbisXiph.Org libVorbis I 20070622vorbis)BCV1L ŀАU`$)fI)(yHI)0c1c1c 4d( Ij9g'r9iN8 Q9 &cnkn)% Y@H!RH!b!b!r!r * 2 L2餓N:騣:(B -JL1Vc]|s9s9s BCV BdB!R)r 2ȀАU GI˱$O,Q53ESTMUUUUu]Wvevuv}Y[}Y[؅]aaaa}}} 4d #9)"9d ")Ifjihm˲,˲ iiiiiiifYeYeYeYeYeYeYeYeYeYeYeYeY@h*@@qq$ER$r, Y@R,r4Gs4sW-_?o),*].{p/WPmumble-1.3.4/samples/UserJoinedChannel.ogg0000664000175000017500000002103714010707273020346 0ustar builderbuilderOggSLBvorbisOOggSL;Ⳳ-vorbisXiph.Org libVorbis I 20090709vorbis&BCV"LĀАU7{Ƚ{G{{Gz{{˽s 4d)rBQ*ǽ0=Z!B= Y@!RH!RH!RH)b)b)s1 :褓PB )PJ*RJ-ZssA B!B!BBCV B!dB!RH!b)АU I˱%Q%2-R5S3=UTETUWU]]wmvmՖmVmvmVmYm۶m۶m۶m۶m۶m 4d #9#)")8d(8H%ifyg詞 xxgyxgyiiiiiiiiiiiiiii@h*@@qqqGr$ Y@R$r,Gs4sl]d?e0yeb|m; 8P+ĭ誗5fCYnc9ɨybrBE'ܯ:NYYuηM:ݗj>M-Y.bv@tdi'CBÞI\J<|_:7< ۊTTsvJ{Bjg+=/{!1g?)n~e{J":zeF:Oe5). LBK>bU{"`s Cv^xj\1V'X XM<\pmZSp^b@ŨNe$3O+wb9pݭ0/ИǷڊ ~.v=ylZ\ p鞳1GK'שF45pNxHv Zz,Z&}`k*C} BgH : v6Mw8G}P5v<&q8h-3Zcgu@uǚ6`@U9 TH]w `qsYXrV rYaK6Җ]y<w30{s zvN۶(StCnvub0=)>xֱ,y5}@K!k`a s  }"RTDXM0Ps<>\ }QJ@Qn[=a*L.G=-?(іj Se% ɬ66Ԟ$ݔ"A `3@ުxG-@Oih QJ~\>=&`xsxNXLZ`K\|]  LiVxܽ,a3!HoBejQ O0ΥJē@ $a)(0@վY3܋ v.K:rmChT  l+ of|* oM~Ő-C +%sԀ x tX$@@]Icz  H 8eCkn R_ Qߪ""(P\i D@޼5&A˴y3!7`&K$& aX]T%HK%4foats 3@:@Bhh0n1>\ 8"AiT;@CEKD]K@ŭ0m`>Px{+{lf}}*l*2O|p \U!V`0 'vwmgp%Up{O?X8L$@ :eqfp7$Ah<|Cүp~ b] P T_%\F", $R$wq9ttwwyL6Dw*D&٩iOwDM<7$( u(QAw ,)<2텀6)`NZB5т(\1K&L.#u*%5_*bE$5 } Vd6Mᱞ \EV\ }mKQF~@P,.YjaTFE|4CRtZ@Edm!ل"|~QqhU@ߕtj6;G0@0[-*FB x'b |i5s8VS(=Ab|M܂ujL=m]AW)`E U<Ce9],IIqtjd108qV$!LJUM[VWpL)UctiW@:6p_ RH ,6 N,TN|~ Gyq+8P[̪ KKm(D@Kh5+*Rӈ@RUdT~ 4 c(OggS]LU7-5 %%>h#+t ;ݲ@G:$3.t{-` , X:@~z[5Z$2.uN.Q  5l4!ZKw9ж^N ÀԆd4HB^U|(!/n>&J$+ ]G$'@p&:W1KԻCBeb!;>/~PFtĈЌϨc.u|?u}@t0`+<<NI2+n7̂Cy:MO86):ATW"fBlj]J] Kcfbc]_1B^u1Got%y&5>3Wv Nt8L{ڦ&Q"2Gk6Oi@?@n ]%mumble-1.3.4/INSTALL0000664000175000017500000001474314010707273013703 0ustar builderbuilderBinary versions =============== Binary versions for Win32 of the most recent version of mumble are provided at http://www.mumble.info/ The only legitimate releases of Mumble will be on www.mumble.info, any other place offering Mumble is likely to contain trojans or viruses. Windows pre-requisites ====================== Detailed build instructions are available at http://wiki.mumble.info/wiki/BuildingWindows and it is highly recommended to follow them to the letter. Mac OS X pre-requisites ======================= Detailed build instructions are available at http://wiki.mumble.info/wiki/BuildingMacOSX and it is highly recommended to follow them to the letter. Linux pre-requisites ==================== Detailed build instructions are available at http://wiki.mumble.info/wiki/BuildingLinux and it is highly recommended to follow them to the letter. Please note that in addition to the depending libraries, you also need lsb_release installed. Building Mumble and Murmur ========================== To build mumble and murmur, type qmake main.pro make release You may need to specify dependency installation paths. Please refer to the files in the qmake directory. (For windows, copy winpaths_default.pri to winpaths_custom.pri and adjust the copies contents.) After building, the binaries will be in the release/ directory. The qmake step supports a number of configurations options. To enable an option, simply add CONFIG+=Browse").arg(userThemeDirectoryUrl.toString())); qlThemesDirectory->setOpenExternalLinks(true); } } QString LookConfig::title() const { return tr("User Interface"); } QIcon LookConfig::icon() const { return QIcon(QLatin1String("skin:config_ui.png")); } void LookConfig::reloadThemes(const boost::optional configuredStyle) { const ThemeMap themes = Themes::getThemes(); int selectedThemeEntry = 0; qcbTheme->clear(); qcbTheme->addItem(tr("None")); for (ThemeMap::const_iterator theme = themes.begin(); theme != themes.end(); ++theme) { for (ThemeInfo::StylesMap::const_iterator styleit = theme->styles.begin(); styleit != theme->styles.end(); ++styleit) { if (configuredStyle && configuredStyle->themeName == styleit->themeName && configuredStyle->name == styleit->name) { selectedThemeEntry = qcbTheme->count(); } qcbTheme->addItem(theme->name + QLatin1String(" - ") + styleit->name, QVariant::fromValue(*styleit)); } } qcbTheme->setCurrentIndex(selectedThemeEntry); } void LookConfig::load(const Settings &r) { loadComboBox(qcbLanguage, 0); loadComboBox(qcbChannelDrag, 0); loadComboBox(qcbUserDrag, 0); // Load Layout checkbox state switch (r.wlWindowLayout) { case Settings::LayoutClassic: qrbLClassic->setChecked(true); break; case Settings::LayoutStacked: qrbLStacked->setChecked(true); break; case Settings::LayoutHybrid: qrbLHybrid->setChecked(true); break; case Settings::LayoutCustom: default: s.wlWindowLayout = Settings::LayoutCustom; qrbLCustom->setChecked(true); break; } qcbLockLayout->setEnabled(r.wlWindowLayout==Settings::LayoutCustom); for (int i=0;icount();i++) { if (qcbLanguage->itemData(i).toString() == r.qsLanguage) { loadComboBox(qcbLanguage, i); break; } } loadComboBox(qcbAlwaysOnTop, r.aotbAlwaysOnTop); loadComboBox(qcbExpand, r.ceExpand); loadComboBox(qcbChannelDrag, r.ceChannelDrag); loadComboBox(qcbUserDrag, r.ceUserDrag); loadCheckBox(qcbUsersTop, r.bUserTop); loadCheckBox(qcbAskOnQuit, r.bAskOnQuit); loadCheckBox(qcbEnableDeveloperMenu, r.bEnableDeveloperMenu); loadCheckBox(qcbLockLayout, (r.wlWindowLayout==Settings::LayoutCustom)&&r.bLockLayout); loadCheckBox(qcbHideTray, r.bHideInTray); loadCheckBox(qcbStateInTray, r.bStateInTray); loadCheckBox(qcbShowUserCount, r.bShowUserCount); loadCheckBox(qcbShowContextMenuInMenuBar, r.bShowContextMenuInMenuBar); loadCheckBox(qcbShowTransmitModeComboBox, r.bShowTransmitModeComboBox); loadCheckBox(qcbHighContrast, r.bHighContrast); loadCheckBox(qcbChatBarUseSelection, r.bChatBarUseSelection); loadCheckBox(qcbFilterHidesEmptyChannels, r.bFilterHidesEmptyChannels); const boost::optional configuredStyle = Themes::getConfiguredStyle(r); reloadThemes(configuredStyle); } void LookConfig::save() const { const QString oldLanguage = s.qsLanguage; if (qcbLanguage->currentIndex() == 0) s.qsLanguage = QString(); else s.qsLanguage = qcbLanguage->itemData(qcbLanguage->currentIndex()).toString(); if (s.qsLanguage != oldLanguage) { s.requireRestartToApply = true; } // Save Layout radioboxes state if (qrbLClassic->isChecked()) { s.wlWindowLayout = Settings::LayoutClassic; } else if (qrbLStacked->isChecked()) { s.wlWindowLayout = Settings::LayoutStacked; } else if (qrbLHybrid->isChecked()) { s.wlWindowLayout = Settings::LayoutHybrid; } else { s.wlWindowLayout = Settings::LayoutCustom; } s.ceExpand=static_cast(qcbExpand->currentIndex()); s.ceChannelDrag=static_cast(qcbChannelDrag->currentIndex()); s.ceUserDrag=static_cast(qcbUserDrag->currentIndex()); if (qcbUsersTop->isChecked() != s.bUserTop) { s.bUserTop = qcbUsersTop->isChecked(); s.requireRestartToApply = true; } s.aotbAlwaysOnTop = static_cast(qcbAlwaysOnTop->currentIndex()); s.bAskOnQuit = qcbAskOnQuit->isChecked(); s.bEnableDeveloperMenu = qcbEnableDeveloperMenu->isChecked(); s.bLockLayout = qcbLockLayout->isChecked(); s.bHideInTray = qcbHideTray->isChecked(); s.bStateInTray = qcbStateInTray->isChecked(); s.bShowUserCount = qcbShowUserCount->isChecked(); s.bShowContextMenuInMenuBar = qcbShowContextMenuInMenuBar->isChecked(); s.bShowTransmitModeComboBox = qcbShowTransmitModeComboBox->isChecked(); s.bHighContrast = qcbHighContrast->isChecked(); s.bChatBarUseSelection = qcbChatBarUseSelection->isChecked(); s.bFilterHidesEmptyChannels = qcbFilterHidesEmptyChannels->isChecked(); QVariant themeData = qcbTheme->itemData(qcbTheme->currentIndex()); if (themeData.isNull()) { Themes::setConfiguredStyle(s, boost::none, s.requireRestartToApply); } else { Themes::setConfiguredStyle(s, themeData.value(), s.requireRestartToApply); } } void LookConfig::accept() const { g.mw->setShowDockTitleBars((g.s.wlWindowLayout == Settings::LayoutCustom) && !g.s.bLockLayout); } void LookConfig::themeDirectoryChanged() { qWarning() << "Theme directory changed"; QVariant themeData = qcbTheme->itemData(qcbTheme->currentIndex()); if (themeData.isNull()) { reloadThemes(boost::none); } else { reloadThemes(themeData.value()); } } mumble-1.3.4/src/mumble/SvgIcon.h0000664000175000017500000000145214010707273016434 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_SVGICON_H #define MUMBLE_MUMBLE_SVGICON_H #include #include class SvgIcon { public: /// addSvgPixmapsToIcon renders the SVG file at |fn| in various /// common sizes from 8x8 up to 256x256 and adds the resulting /// rasterized pixmaps to |icon|. /// /// This method is only needed due to an odd interaction between /// Qt and Plasma/KStatusNotifierItem. See /// https://github.com/mumble-voip/mumble/issues/3374 /// for more information. static void addSvgPixmapsToIcon(QIcon &icon, QString fn); }; #endif mumble-1.3.4/src/mumble/AudioStats.cpp0000664000175000017500000002261314010707273017501 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "AudioStats.h" #include "AudioInput.h" #include "Global.h" #include "smallft.h" AudioBar::AudioBar(QWidget *p) : QWidget(p) { qcBelow = Qt::yellow; qcAbove = Qt::red; qcInside = Qt::green; iMin = 0; iMax = 32768; iBelow = 2000; iAbove = 22000; iValue = 1000; iPeak = -1; setMinimumSize(100,20); qlReplacableColors << Qt::yellow << Qt::red << Qt::green << Qt::blue; qlReplacementBrushes << Qt::BDiagPattern << Qt::DiagCrossPattern << Qt::NoBrush << Qt::FDiagPattern; } void AudioBar::paintEvent(QPaintEvent *) { QPainter p(this); if (isEnabled()) { qcBelow.setAlphaF(1.0f); qcAbove.setAlphaF(1.0f); qcInside.setAlphaF(1.0f); } else { qcBelow.setAlphaF(0.5f); qcAbove.setAlphaF(0.5f); qcInside.setAlphaF(0.5f); } if (iBelow > iAbove) iBelow = iAbove; if (iValue < iMin) iValue = iMin; else if (iValue > iMax) iValue = iMax; float scale = static_cast(width()) / static_cast(iMax - iMin); int h = height(); int val = iroundf(static_cast(iValue) * scale + 0.5f); int below = iroundf(static_cast(iBelow) * scale + 0.5f); int above = iroundf(static_cast(iAbove) * scale + 0.5f); int max = iroundf(static_cast(iMax) * scale + 0.5f); int min = iroundf(static_cast(iMin) * scale + 0.5f); int peak = iroundf(static_cast(iPeak) * scale + 0.5f); if (g.s.bHighContrast) { // Draw monochrome representation QColor fg = QPalette().foreground().color(); p.fillRect(0, 0, below, h, QBrush(fg, qlReplacementBrushes.value(qlReplacableColors.indexOf(qcBelow), Qt::CrossPattern))); p.fillRect(below, 0, above - below, h, QBrush(fg, qlReplacementBrushes.value(qlReplacableColors.indexOf(qcInside), Qt::NoBrush))); p.fillRect(above, 0, max - above, h, QBrush(fg, qlReplacementBrushes.value(qlReplacableColors.indexOf(qcAbove), Qt::CrossPattern))); p.fillRect(0, 0, val, h, QBrush(fg, Qt::SolidPattern)); p.drawRect(0, 0, max - 1, h - 1); p.drawLine(below, 0, below, h); p.drawLine(above, 0, above, h); } else { if (val <= below) { p.fillRect(0, 0, val, h, qcBelow); p.fillRect(val, 0, below-val, h, qcBelow.darker(300)); p.fillRect(below, 0, above-below, h, qcInside.darker(300)); p.fillRect(above, 0, max-above, h, qcAbove.darker(300)); } else if (val <= above) { p.fillRect(0, 0, below, h, qcBelow); p.fillRect(below, 0, val-below, h, qcInside); p.fillRect(val, 0, above-val, h, qcInside.darker(300)); p.fillRect(above, 0, max-above, h, qcAbove.darker(300)); } else { p.fillRect(0, 0, below, h, qcBelow); p.fillRect(below, 0, above-below, h, qcInside); p.fillRect(above, 0, val-above, h, qcAbove); p.fillRect(val, 0, max-val, h, qcAbove.darker(300)); } if ((peak >= min) && (peak <= max)) { if (peak <= below) p.setPen(qcBelow.lighter(150)); else if (peak <= above) p.setPen(qcInside.lighter(150)); else p.setPen(qcAbove.lighter(150)); p.drawLine(peak, 0, peak, h); } } } AudioEchoWidget::AudioEchoWidget(QWidget *p) : QWidget(p) { setMinimumSize(100, 60); } static inline const QColor mapEchoToColor(float echo) { bool neg = (echo < 0.0f); echo = fabsf(echo); float a, b, c; if (echo > 1.0f) { echo = 1.0f; c = 0.5f; } else { c = 0.0f; } if (echo < 0.5f) { a = echo * 2.0f; b = 0.0f; } else { a = 1.0f; b = (echo - 0.5f) * 2.0f; } if (neg) return QColor::fromRgbF(a, b, c); else return QColor::fromRgbF(c, b, a); } #define WGT(x,y) st->W[(y)*N + 2*(x)+1] void AudioEchoWidget::paintEvent(QPaintEvent *) { QPainter paint(this); paint.scale(width(), height()); paint.fillRect(rect(), Qt::black); AudioInputPtr ai = g.ai; if (! ai || ! ai->sesEcho) return; ai->qmSpeex.lock(); spx_int32_t sz; speex_echo_ctl(ai->sesEcho, SPEEX_ECHO_GET_IMPULSE_RESPONSE_SIZE, &sz); STACKVAR(spx_int32_t, w, sz); STACKVAR(float, W, sz); speex_echo_ctl(ai->sesEcho, SPEEX_ECHO_GET_IMPULSE_RESPONSE, w); ai->qmSpeex.unlock(); int N = 160; int n = 2 * N; int M = sz / n; drft_lookup d; mumble_drft_init(&d, n); for (int j=0;j(w[j*n+i]) / static_cast(n); mumble_drft_forward(&d, & W[j*n]); } mumble_drft_clear(&d); float xscale = 1.0f / static_cast(N); float yscale = 1.0f / static_cast(M); for (int j = 0; j < M; j++) { for (int i=1;i < N; i++) { float xa = static_cast(i) * xscale; float ya = static_cast(j) * yscale; float xb = xa + xscale; float yb = ya + yscale; const QColor &c = mapEchoToColor(sqrtf(W[j*n+2*i]*W[j*n+2*i]+W[j*n+2*i-1]*W[j*n+2*i-1]) / 65536.f); paint.fillRect(QRectF(QPointF(xa, ya), QPointF(xb, yb)), c); } } QPolygonF poly; xscale = 1.0f / (2.0f * static_cast(n)); yscale = 1.0f / (200.0f * 32767.0f); for (int i = 0; i < 2 * n; i++) { poly << QPointF(static_cast(i) * xscale, 0.5f + static_cast(w[i]) * yscale); } paint.setPen(QPen(QBrush(QColor::fromRgbF(1.0f, 0.0f, 1.0f)), 0)); paint.drawPolyline(poly); } AudioNoiseWidget::AudioNoiseWidget(QWidget *p) : QWidget(p) { setMinimumSize(100,60); } void AudioNoiseWidget::paintEvent(QPaintEvent *) { QPainter paint(this); QPalette pal; paint.fillRect(rect(), pal.color(QPalette::Background)); AudioInputPtr ai = g.ai; if (ai.get() == NULL || ! ai->sppPreprocess) return; QPolygonF poly; ai->qmSpeex.lock(); spx_int32_t ps_size = 0; speex_preprocess_ctl(ai->sppPreprocess, SPEEX_PREPROCESS_GET_PSD_SIZE, &ps_size); STACKVAR(spx_int32_t, noise, ps_size); STACKVAR(spx_int32_t, ps, ps_size); speex_preprocess_ctl(ai->sppPreprocess, SPEEX_PREPROCESS_GET_PSD, ps); speex_preprocess_ctl(ai->sppPreprocess, SPEEX_PREPROCESS_GET_NOISE_PSD, noise); ai->qmSpeex.unlock(); qreal sx, sy; sx = (static_cast(width()) - 1.0f) / static_cast(ps_size); sy = static_cast(height()) - 1.0f; poly << QPointF(0.0f, height() - 1); float fftmul = 1.0 / (32768.0); for (int i=0; i < ps_size; i++) { qreal xp, yp; xp = i * sx; yp = sqrtf(sqrtf(static_cast(noise[i]))) - 1.0f; yp = yp * fftmul; yp = qMin(yp * 3000.0f, 1.0f); yp = (1 - yp) * sy; poly << QPointF(xp, yp); } poly << QPointF(width() - 1, height() - 1); poly << QPointF(0.0f, height() - 1); paint.setPen(Qt::blue); paint.setBrush(Qt::blue); paint.drawPolygon(poly); poly.clear(); for (int i=0;i < ps_size; i++) { qreal xp, yp; xp = i * sx; yp = sqrtf(sqrtf(static_cast(ps[i]))) - 1.0f; yp = yp * fftmul; yp = qMin(yp * 3000.0, 1.0); yp = (1 - yp) * sy; poly << QPointF(xp, yp); } paint.setPen(Qt::red); paint.drawPolyline(poly); } AudioStats::AudioStats(QWidget *p) : QDialog(p) { setAttribute(Qt::WA_DeleteOnClose, true); qtTick = new QTimer(this); qtTick->setObjectName(QLatin1String("Tick")); qtTick->start(50); setupUi(this); AudioInputPtr ai = g.ai; if (ai && ai->sesEcho) { qgbEcho->setVisible(true); } else { qgbEcho->setVisible(false); } bTalking = false; abSpeech->iPeak = -1; abSpeech->qcBelow = Qt::red; abSpeech->qcInside = Qt::yellow; abSpeech->qcAbove = Qt::green; on_Tick_timeout(); } AudioStats::~AudioStats() { } void AudioStats::on_Tick_timeout() { AudioInputPtr ai = g.ai; if (ai.get() == NULL || ! ai->sppPreprocess) return; bool nTalking = ai->isTransmitting(); QString txt; txt.sprintf("%06.2f dB",ai->dPeakMic); qlMicLevel->setText(txt); txt.sprintf("%06.2f dB",ai->dPeakSpeaker); qlSpeakerLevel->setText(txt); txt.sprintf("%06.2f dB",ai->dPeakSignal); qlSignalLevel->setText(txt); spx_int32_t ps_size = 0; speex_preprocess_ctl(ai->sppPreprocess, SPEEX_PREPROCESS_GET_PSD_SIZE, &ps_size); STACKVAR(spx_int32_t, noise, ps_size); STACKVAR(spx_int32_t, ps, ps_size); speex_preprocess_ctl(ai->sppPreprocess, SPEEX_PREPROCESS_GET_PSD, ps); speex_preprocess_ctl(ai->sppPreprocess, SPEEX_PREPROCESS_GET_NOISE_PSD, noise); float s = 0.0f; float n = 0.0001f; int start = (ps_size * 300) / SAMPLE_RATE; int stop = (ps_size * 2000) / SAMPLE_RATE; for (int i=start;i(ps[i])); n += sqrtf(static_cast(noise[i])); } txt.sprintf("%06.3f",s / n); qlMicSNR->setText(txt); spx_int32_t v; speex_preprocess_ctl(ai->sppPreprocess, SPEEX_PREPROCESS_GET_AGC_GAIN, &v); float fv = powf(10.0f, (static_cast(v) / 20.0f)); txt.sprintf("%03.0f%%",100.0f / fv); qlMicVolume->setText(txt); txt.sprintf("%03.0f%%",ai->fSpeechProb * 100.0f); qlSpeechProb->setText(txt); txt.sprintf("%04.1f kbit/s",static_cast(ai->iBitrate) / 1000.0f); qlBitrate->setText(txt); if (nTalking != bTalking) { bTalking = nTalking; QFont f = qlSpeechProb->font(); f.setBold(bTalking); qlSpeechProb->setFont(f); } if (g.uiDoublePush > 1000000) txt = tr(">1000 ms"); else txt.sprintf("%04llu ms",g.uiDoublePush / 1000); qlDoublePush->setText(txt); abSpeech->iBelow = iroundf(g.s.fVADmin * 32767.0f + 0.5f); abSpeech->iAbove = iroundf(g.s.fVADmax * 32767.0f + 0.5f); if (g.s.vsVAD == Settings::Amplitude) { abSpeech->iValue = iroundf((32767.f/96.0f) * (96.0f + ai->dPeakCleanMic) + 0.5f); } else { abSpeech->iValue = iroundf(ai->fSpeechProb * 32767.0f + 0.5f); } abSpeech->update(); anwNoise->update(); if (aewEcho) aewEcho->update(); } mumble-1.3.4/src/mumble/mumble_sk.ts0000664000175000017500000114656314010707274017260 0ustar builderbuilder ACLEditor Deny Allow Allow %1 Deny %1 Mumble - Add channel Default server value Failed: Invalid channel Mumble - Edit %1 ID: %1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Channel must have a name This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Dialog Name Enter the channel name here. Description Password Enter the channel password here. Check to create a temporary channel. Temporary <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. Position &Groups Group List of groups Remove selected group Remove Inherit group members from parent Inherit Make group inheritable to sub-channels Inheritable Group was inherited from parent channel Inherited Members Add Add member to group Remove member from group &ACL Active ACLs List of entries Inherit ACL of parent? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. Inherit ACLs Move entry up This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. &Up Move entry down This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. &Down Add new entry This adds a new entry, initially set with no permissions and applying to all. &Add Remove entry This removes the currently selected entry. &Remove Context Entry should apply to this channel. Entry should apply to this channel This makes the entry apply to this channel. Applies to this channel Entry should apply to sub-channels. Add new group <b>Add</b><br/> Add a new group. Inherited members Contains the list of members added to the group by this channel. Contains a list of members whose group membership will not be inherited from the parent channel. Contains the list of members inherited by other channels. Type in the name of a user you wish to add to the group and click Add. Type in the name of a user you wish to remove from the group and click Add. Exclude Excluded members This makes the entry apply to sub-channels of this channel. Applies to sub-channels Permissions User/Group Group this entry applies to User ID User this entry applies to This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. &Properties <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. ID of the channel. Maximum Users Maximum number of users allowed in the channel <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. This is the sort order for the channel. ALSAAudioInput Default ALSA Card Opening chosen ALSA Input failed: %1 ALSAAudioOutput Default ALSA Card Opening chosen ALSA Output failed: %1 ASIOConfig %1 (version %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz ASIO Initialization failed: %1 Failed to instantiate ASIO driver ASIO Device selection Device Device to use for microphone This chooses what device to query. You still need to actually query the device and select which channels to use. Query selected device This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Query Configure selected device This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Configure Capabilities Driver name Buffer size This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. Configure input channels Channels Microphone <- -> Unused Speakers ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. Opening selected ASIO device failed. No input will be done. AboutDialog About Mumble <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble &License A&uthors &Third-Party Licenses OK AudioInput Interface System Input method for audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Input device for audio <b>This is the input device to use for audio.</b> Transmission &Transmit When to transmit your speech <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. DoublePush Time If you press the PTT key twice in this time it will get locked. <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. Reset audio cue to default <b>Reset</b><br/>Reset the paths for the files to their default. Browse for on audio file Browse for off audio file Off On Preview the audio cues Use SNR based speech detection Signal to Noise <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. Amplitude Voice &Hold How long to keep transmitting after silence Silence Below <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. Speech Above Signal values above this count as voice Compression &Quality Quality of compression (peak bandwidth) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. Audio per packet How many audio frames to send per packet <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). Audio Processing Noise Suppression Noise suppression <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. Maximum amplification of input sound <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. Current speech detection chance Cancel echo from speakers Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. Disabled <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal values below this count as silence Maximum bandwidth used for sending audio Use Amplitude based speech detection <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). Exclusive mode <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive R&eset &Browse... B&rowse... &Preview <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. Displays an always on top window with a push to talk button in it Display push to talk window Misc Audible audio cue when starting or stopping to transmit <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. Audio cue Gets played when starting to transmit Gets played when stopping to transmit Hold Time Time the microphone stays open after the PTT key is released Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) Max. Amplification Idle action minutes do nothing deafen mute after Echo Cancellation Mixed echo cancellation Multichannel echo cancellation The idle action will be reversed upon any key or mouse button input Undo Idle action upon activity Apply RNNoise's noise suppression filter. <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. RNNoise Audio input AudioInputDialog Continuous Voice Activity Push To Talk Audio Input %1 ms Off %1 s %1 kb/s -%1 dB %1 kbit/s (Audio %2, Position %4, Overhead %3) AudioOutput Interface System Output method for audio <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Output device for audio <b>This is the output device to use for audio.</b> Positional Audio Audio Output Default &Jitter Buffer Safety margin for jitter buffer <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. Minimum distance to user before sound volume decreases This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. Volume Volume of incoming speech <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. Output Delay Amount of data to buffer The connected "speakers" are actually headphones The connected "speakers" are actually headphones. Factor for sound volume decrease Bloom Factor for sound volume increase How much should sound volume increase for sources that are really close? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Headphones Minimum Distance Maximum Distance Maximum distance, beyond which speech volume won't decrease Minimum Volume What should the volume be at the maximum distance? Loopback Test Delay Variance Variance in packet latency <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. Packet Loss Packet loss for loopback mode <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% &Loopback Desired loopback mode Attenuate applications by... Attenuation of other applications during speech <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. If checked Mumble lowers the volume of other applications while other users talk <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. while other users talk If checked Mumble lowers the volume of other applications while you talk <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. while you talk Exclusive mode, not recommended. <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive Priority Speaker If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. Attenuate other users while talking as Priority Speaker. Advanced Attenuation Options If checked, Mumble will only attenuate applications that are using the same output source as Mumble <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. Only attenuate applications using the same output device If checked, PulseAudio loopback modules will be attenuated <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. Attenuate PulseAudio loopback modules Audio output AudioOutputDialog None Local Server Audio Output %1 ms %1 % %1 m AudioOutputSample Choose sound file Invalid sound file The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. AudioStats >1000 ms >1000ms Audio Statistics Input Levels Peak microphone level Peak power in last frame This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. Peak speaker level This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. Peak clean level This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. Signal Analysis Microphone power How close the current input level is to ideal This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. Signal-To-Noise ratio Signal-To-Noise ratio from the microphone This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. Speech Probability Probability of speech This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). Configuration feedback Current audio bitrate Bitrate of last frame DoublePush interval Time between last two Push-To-Talk presses Speech Detection Current speech detection chance <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal and noise power spectrum Power spectrum of input signal and noise estimate This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. Echo Analysis Weights of the echo canceller This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. AudioWizard Audio Tuning Wizard Introduction Welcome to the Mumble Audio Wizard Finished Enjoy using Mumble Device selection Selecting the input and output device to use with Mumble. This is the device your microphone is connected to. System Input method for audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Input device to use <b>Selects which sound card to use for audio input.</b> Cancel echo from headset or speakers Use echo cancellation This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. This is the device your speakers or headphones are connected to. Output method for audio <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. Output device to use <b>Selects which sound card to use for audio Output.</b> Enable positional audio Allows positioning of sound Allows positioning of sound. <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> Input Device Output Device This allows Mumble to use positional audio to place voices. <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> Amount of data to buffer This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> Positional Audio Adjusting attenuation of positional audio. <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> Use headphones instead of speakers <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> Use headphones This ignores the OS speaker configuration and configures the positioning for headphones instead. Volume tuning Tuning microphone hardware volume to optimal settings. Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. Voice Activity Detection Letting Mumble figure out when you're talking and when you're silent. This will help Mumble figure out when you are talking. The first step is selecting which data value to use. Raw amplitude from input Signal-To-Noise ratio Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Device tuning Changing hardware output delays to their minimum value. Submit anonymous statistics to the Mumble project Push To Talk: Quality & Notifications Adjust quality and notification settings. Quality settings Low Balanced Notification settings Use Text-To-Speech to read notifications and messages to you. Disable Text-To-Speech and use sounds instead. %1 ms Enables attenuation of other applications while users talk to you Attenuate applications while other users talk High Custom You already set a customized quality configuration in Mumble. Select this setting to keep it. Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. Apply some high contrast optimizations for visually impaired users Use high contrast graphics Keep custom Text-To-Speech settings. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) BanEditor Mumble - Edit Bans &Address &Mask Reason Start End User Hash &Add &Update &Remove Ban List Search field This is the search field. Use it to find bans that have this username set in the username field. Who are you looking for? No nickname IP address No IP address Reason for the ban No reason Ban end date Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). Certificate hash No certificate hash Banned users This is a list with banned users. Use this button if you want to add a new ban. Use this button if you want to update ban information. Use this button if you want to remove user from the ban list. Clear all fields This button clears all fields. Use it if you want to add a new ban. Clear Ban List - %n Ban(s) CertView Name Email Issuer Expiry Date (none) Self-signed CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. There was an error generating your certificate.<br />Please try again. Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. The file could not be opened for writing. Please use another file. The file's permissions could not be set. No certificate and key has been written. Please use another file. The file could not be written successfully. Please use another file. The file could not be opened for reading. Please use another file. The file is empty or could not be read. Please use another file. The file did not contain a valid certificate and key. Please use another file. Select file to export certificate to Select file to import certificate from Unable to import. Missing password or incompatible file type. <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. Certificates Certificate Management Certificate Authentication Authenticating to servers without using passwords Current certificate This is the certificate Mumble currently uses. Current Certificate Create a new certificate This will create a new certificate. Import certificate from file This will import a certificate from file. Import a certificate Export Certificate This will export a certificate to file. Export current certificate Import Certificate PKCS #12 Certificate import <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> Import from Filename to import from This is the filename you wish to import a certificate from. Select file to import from This opens a file selection dialog to choose a file to import a certificate from. Open... Password Password for PKCS#12 file This is the password for the PKCS#12 file containing your certificate. Certificate to import This is the certificate you are importing. Certificate Details Replace Certificate Replace existing certificate with new certificate? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> This is the certificate Mumble currently uses. It will be replaced. New certificate This is the new certificate that will replace the old one. New Certificate Make a backup of your certificate Export to Filename to export to This is the filename you wish to export a certificate to. Save As... This is the certificate Mumble currently uses. It will be exported. Generate a new certificate for strong authentication <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> Name Email Your email address (e.g. johndoe@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. Your name (e.g. John Doe) This is your name, and will be filled out in the certificate. This field is entirely optional. Finish Certificate-based authentication is ready for use Enjoy using Mumble with strong authentication. Automatic certificate creation <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> ChanACL None Traverse Enter Speak Mute/Deafen Make channel Make temporary Link channel This represents no privileges. This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. This represents the permission to write text messages to other users in this channel. This represents the permission to forcibly remove users from the server. This represents the permission to permanently remove users from the server. This represents the permission to register and unregister users on the server. This represents the permission to register oneself on the server. Whisper Move Text message Kick Ban Register User Register Self Write ACL ChatbarTextEdit Paste and &Send Paste and send <center>Type chat message here</center> ClientUser Friend Authenticated Priority speaker Recording Muted (server) Deafened (server) Local Ignore (Text messages) Local Mute Muted (self) Deafened (self) ConfigDialog Accept changes This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. Reject changes This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. Apply changes This button will immediately apply all changes. Undo changes for current page This button will revert any changes done on the current page to the most recent applied settings. Restore defaults for current page This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. Mumble Configuration ConnectDialog Connecting to %1 Enter username Adding host %1 Servername Hostname Bonjour name Port Addresses Website Packet loss Ping (80%) %1 ms Ping (95%) Bandwidth %1 kbit/s &Connect &Filters Unknown Users Version Failed to fetch server list Mumble Server Connect Ping Remove from Favorites Add custom server Show all servers that respond to ping Show all servers with users Show all servers &Copy Copy favorite link to clipboard &Paste Paste favorite from clipboard &Edit... &Add New... Add to &Favorites Open &Webpage Show &Reachable Show &Populated Show &All ConnectDialogEdit Edit Server Name of the server A&ddress Internet address of the server. Internet address of the server. <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. &Port Port on which the server is listening <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. &Username Username to send to the server <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. Label Add Server You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 Password Password to send to the server <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. Show password <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. Local server label 127.0.0.1 64738 Your username Your password &Fill CoreAudioSystem Default Device CrashReporter Mumble Crash Report <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> Email address (optional) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash Send Report Don't send report Crash upload successful Thank you for helping make Mumble better! Crash upload failed We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 Uploading crash report Abort upload DXAudioInput Default DirectSound Voice Input Opening chosen DirectSound Input device failed. No microphone capture will be done. Opening chosen DirectSound Input failed. Default device will be used. Lost DirectSound input device. DXAudioOutput Default DirectSound Voice Output Opening chosen DirectSound Output failed. Default device will be used. Lost DirectSound output device. Opening chosen DirectSound Output failed. No audio will be heard. Database Mumble failed to initialize a database in any of the possible locations. The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. DeveloperConsole Developer Console DockTitleBar Drag here GlobalShortcut Shortcuts List of configured shortcuts Function Data Shortcut Suppress Add new shortcut This will add a new global shortcut &Add Remove selected shortcut This will permanently remove a selected shortcut. &Remove <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> Open Accessibility Preferences Skip Enable Global Shortcuts <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. Additional Shortcut Engines <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. Enable Windows hooks <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. Enable GKey <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. Enable XInput <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. Enable shortcuts in privileged applications GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> Shortcuts Shortcut button combination. <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. Suppress keys from other applications <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. GlobalShortcutTarget Whisper Target Whisper to list of Users Channel Target Restrict to Group If specified, only members of this group will receive the whisper. List of users Add Remove Modifiers Do not send positional audio information when using this whisper shortcut. Ignore positional audio Shout to Linked channels Shout to subchannels Shout to Channel The whisper will also be transmitted to linked channels. The whisper will also be sent to the subchannels of the channel target. GlobalShortcutX Mouse %1 JackAudioSystem Hardware Ports Mono Stereo LCD Not connected LCDConfig Enable this device LCD Devices Name <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> Size Enabled Views Minimum Column Width <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> This setting decides the width of column splitter. Splitter Width Log Debug Critical Warning Information Server Connected Server Disconnected Other self-muted/deafened Permission Denied Text Message User Joined Server User Left Server User recording state changed User kicked (you or by you) User kicked You self-muted User muted (you) User muted (by you) User muted (other) User Joined Channel User Left Channel You self-unmuted You self-deafened You self-undeafened User renamed You Joined Channel You Joined Channel (moved) User connected and entered channel User left channel and disconnected Private text message the server [[ Invalid size ]] [[ Text object too large to display ]] [Date changed to %1] link to %1 FTP link to %1 player link channel link %1 link LogConfig Toggle console for %1 events Toggle pop-up notifications for %1 events Toggle Text-To-Speech for %1 events Click here to toggle sound notification for %1 events Toggle window highlight (if not active) for %1 events Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. Messages Message Console Notification Text-To-Speech Soundfile Path Text To Speech Volume Volume of Text-To-Speech Engine <b>This is the volume used for the speech synthesis.</b> Length threshold Message length threshold for Text-To-Speech Engine <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. Characters Whisper If checked you will only hear whispers from users you added to your friend list. Only accept whispers from friends If enabled text messages you send will be read back to you with TTS Read back own messages Chat Log Maximum chat length Unlimited Lines Highlight LookConfig System default None Only with users All Ask Do Nothing Move <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory User Interface This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. List users above subchannels (requires restart). <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. Users above Channels <b>If set, will verify you want to quit if connected.</b> Show number of users in each channel Show channel user count Language Language to use (requires restart) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. Look and Feel Layout Classic Stacked Hybrid Custom This changes the behavior when moving channels. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. Expand When to automatically expand channels Channel Dragging Ask whether to close or minimize when quitting Mumble. Ask on quit while connected Always On Top <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> Hide in tray when minimized Hide the main Mumble window in the tray when it is minimized. This setting controls when the application will be always on top. Never Always In minimal view In normal view Displays talking status in system tray Show talking status in tray icon This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. Show context menu in menu bar Apply some high contrast optimizations for visually impaired users Optimize for high contrast Application Adds user and channel context menus into the menu bar Tray Icon Channel Tree Use selected item as the chat bar target Filter automatically hides empty channels Show transmit mode dropdown in toolbar Theme Theme to use to style the user interface <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. User Dragging This changes the behavior when moving users. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. Enable Developer menu When in custom layout mode, checking this disables rearranging. Lock layout MainWindow Root Push-to-Talk Global Shortcut Push and hold this button to send voice. Global Shortcut This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut Reset Audio Processor Global Shortcut Unlink Plugin Global Shortcut Push-to-Mute Global Shortcut Join Channel Global Shortcut Toggle Overlay Global Shortcut Toggle state of in-game overlay. Global Shortcut Toggle Minimal Global Shortcut Volume Up (+10%) Global Shortcut Volume Down (-10%) Global Shortcut Mumble Mumble -- %1 &Window Minimize Ctrl+M Close Mumble is currently connected to a server. Do you want to Close or Minimize it? Mute Self Global Shortcut Set self-mute status. Global Shortcut This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut Deafen Self Global Shortcut Set self-deafen status. Global Shortcut This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut Whisper/Shout Whisper <center>Not connected</center> Not connected Clear Opening URL %1 File does not exist File is not a configuration file. Settings merged from file. URL scheme is not 'mumble' This version of Mumble can't handle URLs for Mumble version %1.%2.%3 Connecting to %1 Enter username Connecting to server %1. Reconnecting. Transmit Mode set to Continuous <p>%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> Register yourself as %1 <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <h2>Version</h2><p>Protocol %1</p> <p>No build information or OS version available</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) The connection is secured by the cipher suite that OpenSSL identifies as %1 <p>The connection provides perfect forward secrecy</p> <p>The connection does not provide perfect forward secrecy</p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> Voice channel is sent over control channel Register user %1 <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> Kicking user %1 Banning user %1 View comment on user %1 Message to channel %1 Connected. <li>Expected certificate digest (SHA-1): %1</li> Server presented a certificate which failed verification. <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> SSL Version mismatch Server connection failed. <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>Type message to user '%1' here</center> Type message to user '%1' here Choose image file Failed to load image Could not open file for reading. Image format not recognized. &User &Channel Use in conjunction with Whisper to. Global Shortcut This will switch the states of the in-game overlay. Global Shortcut Link Channel Global Shortcut Cycle Transmit Mode Global Shortcut Set Transmit Mode to Push-To-Talk Global Shortcut Set Transmit Mode to Continuous Global Shortcut Set Transmit Mode to VAD Global Shortcut Send Text Message Global Shortcut Send Clipboard Text Message Global Shortcut This will send your Clipboard content to the channel you are currently in. Global Shortcut Continuous Voice Activity Push-to-Talk Mumble - Minimal View -- %1 Cancel Save Image As... Save Image File Could not save image: %1 Change your comment Transmit Mode set to Voice Activity Transmit Mode set to Push-to-Talk <p>Connected users: %1/%2</p> UDP Statistics To Server From Server Good Late Lost Resync <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> Mumble Server Information &View Certificate Enter reason Sending message to %1 To %1: %2 Message to %1 Are you sure you want to reset the comment of user %1? Are you sure you want to reset the avatar of user %1? Are you sure you want to delete %1 and all its sub-channels? Sending message to channel %1 Message to tree %1 To %1 (Tree): %2 (Tree) %1: %2 Unmuted and undeafened. Unmuted. Muted. Muted and deafened. Deafened. Undeafened. Restart Mumble? Some settings will only apply after a restart of Mumble. Restart Mumble now? About Qt SSL Verification failed: %1 <li>Server certificate digest (SHA-1): %1</li> <b>WARNING:</b> The server presented a certificate that was different from the stored one. This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. Server connection failed: %1. Disconnected from server. Invalid username You connected with an invalid username, please try another one. Username in use That username is already in use, please try another username. Wrong certificate or password Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. Wrong password Wrong server password for unregistered user account, please try again. Images (*.png *.jpg *.jpeg) C&onfigure &Help Log This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. &Quit Mumble Closes the program Exits the application. Ctrl+Q Open the server connection dialog &Disconnect Disconnect from server Disconnects you from the server. Show information about the server connection This will show extended information about the connection to the server. &Mute &Deafen &Local Mute Send a Text Message Sends a text message to another user. Add new channel This adds a new sub-channel to the currently selected channel. Remove channel This removes a channel and all sub-channels. Edit Groups and ACL for channel This opens the Group and ACL dialog for the channel, to control permissions. &Link Link your channel to another channel This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. Chatbar Shows a dialog of registered servers, and also allows quick-connect. Kick user (with reason) Kick selected user off server. You'll be asked to specify a reason. Mute user Mute or unmute user on server. Unmuting a deafened user will also undeafen them. Kick and ban user (with reason) Kick and ban selected user from server. You'll be asked to specify a reason. Deafen user Deafen or undeafen user on server. Deafening a user will also mute them. Mute user locally Mute or unmute user locally. Use this on other users in the same room. This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. &Unlink Channel Unlink your channel from another channel This unlinks your current channel from the selected channel. Unlinks your channel from all linked channels. This unlinks your current channel (not the selected one) from all linked channels. &Reset Reset audio preprocessor This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. &Mute Self Mute yourself Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. &Deafen Self Deafen yourself Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. &Text-To-Speech Toggle Text-To-Speech Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. Display audio statistics Pops up a small dialog with information about your current audio input. Forcibly unlink plugin This forces the current plugin to unlink, which is handy if it is reading completely wrong data. Configure Mumble Allows you to change most settings for Mumble. Start the audio configuration wizard This will guide you through the process of configuring your audio hardware. &What's This? Enter What's This? mode Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. Information about Mumble Shows a small dialog with information and license for Mumble. Information about Speex Shows a small dialog with information about Speex. Information about Qt Shows a small dialog with information about Qt. Check for &Updates Check for new version of Mumble Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. Sends a text message to all users in a channel. Configure certificates for strong authentication This starts the wizard for creating, importing and exporting certificates for authentication against servers. Register user on server This will permanently register the user on the server. Add &Friend Adds a user as your friend. This will add the user as a friend, so you can recognize him on this and other servers. &Remove Friend Removes a user from your friends. This will remove a user from your friends list. &Update Friend Update name of your friend. Your friend uses a different name than what is in your database. This will update the name. Edit registered users list This opens the editor for registered users, which allow you to change their name or unregister them. Add or remove text-based access tokens &Minimal View Toggle minimal window modes This will toggle minimal mode, where the log window and menu is hidden. You muted and deafened %1. You unmuted and undeafened %1. You undeafened %1. You suppressed %1. %1 muted and deafened by %2. %1 unmuted and undeafened by %2. %1 undeafened by %2. %1 suppressed by %2. %1 moved to %2. %1 moved to %2 by %3. %1 moved in from %2 by %3. %1 is now muted and deafened. Your account information can not be verified currently. Please try again later Welcome message: %1 Mumble: %1 You were denied %1 privileges in %2. %3 was denied %1 privileges in %2. Denied: Cannot modify SuperUser. Denied: Invalid channel name. Denied: Text message too long. Denied: Operation not permitted in temporary channel. You need a certificate to perform this operation. %1 does not have a certificate. Invalid username: %1. Invalid username. Channel is full. Channel nesting limit reached. Channel count limit reached. Need to delete channels before creating new ones. Permission denied. %1 connected and entered channel. %1 connected. %1 is now muted. %1 is now unmuted. Recording started Recording stopped %1 started recording. %1 stopped recording. You revoked your priority speaker status. You assumed priority speaker status. %1 revoked your priority speaker status. %1 gave you priority speaker status. You revoked priority speaker status for %1. You gave priority speaker status to %1. %1 revoked own priority speaker status. %1 assumed priority speaker status. %1 revoked priority speaker status for %2. %1 gave priority speaker status to %2. You were unmuted and undeafened by %1. You were muted by %1. You were undeafened by %1. You were suppressed. You were suppressed by %1. You were unsuppressed. You were unsuppressed by %1. You joined %1. You moved %1 to %2. %1 is recording %1 renamed to %2 by %3. %1 disconnected. Server message from (Tree) (Channel) (Private) %2%1: %3 Failed to load Opus, it will not be available for audio encoding/decoding. The server requests minimum client version %1 The server requests positional audio be enabled. The server requests positional audio be disabled. The server requests Push-to-Talk be enabled. The server requests Push-to-Talk be disabled. You were unmuted by %1. You muted %1. You unsuppressed %1. You unmuted %1. %1 muted by %2. %1 unsuppressed by %2. %1 unmuted by %2. Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. You were muted and deafened by %1. You were deafened by %1. You were kicked from the server by %1: %2. %3 was kicked from the server by %1: %2. You were kicked and banned from the server by %1: %2. %3 was kicked and banned from the server by %1: %2. You were moved to %1 by %2. %1 entered channel. Server connection rejected: %1. Denied: %1. %1 renamed to %2. %1 left channel and disconnected. Message from %1 You have User Dragging set to "Do Nothing" so the user wasn't moved. You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. Unknown Channel Drag mode in UserModel::dropMimeData. Remote controlling Mumble: Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) -jn, --jackname Set custom Jack client name. --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status Invocation Error: No RPC command specified RPC Welcome to Mumble. Skipping version check in debug mode. Hide Frame Toggle showing frame on minimal window This will toggle whether the minimal window should have a frame for moving and resizing. &Unlink All Reset the comment of the selected user. &Join Channel View comment in editor Query server for connection information for user S&erver &Self &Unlink Plugins Register yourself on the server Change your avatar image on this server &Remove Avatar Remove currently defined avatar image. Icon Toolbar Change your own comment Recording Priority Speaker &Copy URL Copies a link to this channel to the clipboard. Ignore Messages Locally ignore user's text chat messages. Silently drops all text messages from the user. Edit ban list on server This lets you edit the server-side IP ban list. &Filter on/off Toggle the channel filter (Ctrl+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. Ctrl+F &Hide Channel when Filtering Reset the avatar of the selected user. Locally adjust the user's speech volume. Opens a dialog with a volume slider. Use this on other users in the same room. &Developer &Hide Mumble Hides the main Mumble window. Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. Show the Developer Console Shows the Mumble Developer Console, where Mumble's log output can be inspected. &Connect... &Ban list... &Information... &Kick... &Ban... Local Volume Adjustment... Send &Message... &Add... &Remove... &Edit... Audio S&tatistics... &Settings... &Audio Wizard... Developer &Console... &About... About &Speex... About &Qt... &Certificate Wizard... &Register... Registered &Users... Change &Avatar... &Access Tokens... Reset &Comment... Reset &Avatar... View Comment... &Change Comment... R&egister... Show Shows the main Mumble window. Manual Manual Mumble Positional Audio Position X Y Z m Heading Azimuth Elevation ° Meta data Context Identity Set State Linked Activated Unhinge NetworkConfig Network Updates are mandatory when using snapshot releases. Connection Use TCP compatibility mode Use TCP compatability mode <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). Reconnect when disconnected <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. Reconnect automatically Proxy Type Type of proxy to connect through Direct connection HTTP(S) proxy SOCKS5 proxy Hostname Hostname of the proxy Force TCP mode Enable QoS to prioritize packets This will enable QoS, which will attempt to prioritize voice packets over other traffic. Use Quality of Service Don't send certificate to server and don't save passwords. (Not saved). <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> Suppress certificate and password storage <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. Port Port number of the proxy <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. Username Username for proxy authentication <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Password Password for proxy authentication <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Mumble services Check for new releases of Mumble automatically. This will check for new releases of Mumble every time you start the program, and notify you if one is available. Check for application updates on startup Check for new releases of plugins automatically. This will check for new releases of plugins every time you start the program, and download them automatically. <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. Submit anonymous statistics to the Mumble project Submit anonymous statistics Reconnect to last used server when starting Mumble Reconnect to last server on startup Download plugin and overlay updates on startup Privacy Prevent OS information being sent to Mumble servers and web servers <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. Do not send OS information to Mumble servers and web servers Overlay Silent Talking Whisper Shout Channel Failed to create communication with overlay at %2: %1. No overlay will be available. OverlayClient Filter Only talking Talking and recently active All in current channel All in linked channels Always show yourself Configure recently active time (%1 seconds)... Columns Sort Alphabetically Last state change Edit... Reset Zoom Configure recently active time Amount of seconds users remain active after talking: OverlayConfig To move the users, drag the little red dot. To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. For more options, right click a user. For more options, rightclick a user. Launcher Filter Overlay Choose executable Choose application Choose path Load Overlay Presets Mumble overlay presets (*.mumblelay) Save Overlay Presets Options Enable overlay. Enable Overlay This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. Layout Blacklist Whitelist Uninstall Overlay Overlay Installation Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. Install Mumble Overlay Overlay Upgrade Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. Upgrade Mumble Overlay Display a frame counter in the overlay Show FPS counter Load an overlay preset from file Load… Save your overlay settings to file Save… Set the overlay font. Set the overlay text color. Color Remove Font FPS and Clock Display Display a clock in the overlay showing the current local time (system time). Show Clock Overlay Exceptions Overlay Exception Mode Allowed launchers Add Allowed programs Allowed paths Blacklisted programs OverlayEditor State User is not talking Passive User is talking in your channel or a linked channel Talking User is whispering to you privately Private Whisper User is shouting to your channel Channel Whisper Zoom Zoom Factor Enabled Elements User avatar, chosen by each user Avatar User's name Username Name of user's channel, if outside your current channel Channel Muted or deafened Mute state Bounding box, automatically shrunk to minimum size to contain all visible elements Bounding box Overlay Editor OverlayEditorScene Layout preset Large square avatar Avatar and Name User Opacity %1% Object Opacity Alignment Left Center Right Top Bottom Color... Font... Bounding box Pen width Padding Pen color Fill color Pick pen color Pick fill color Pick color Pick font PluginConfig Plugins Plugin has no configure function. Plugin has no about function. Options Enable plugins and transmit positional information This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. Link to Game and Transmit Position Reloads all plugins This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. &Reload plugins Information about plugin This shows a small information message about the plugin. &About Show configuration page of plugin This shows the configuration page of the plugin, if any. &Configure Name Enabled Plugins Skipping plugin update in debug mode. Downloaded new or updated plugin to %1. Failed to install new plugin to %1. %1 lost link. %1 linked. PortAudioSystem Default Device PulseAudioSystem Default Input Default Output QApplication Failed to restart mumble Mumble failed to restart itself. Please restart it manually. RichTextEditor Failed to load image Image file too large to embed in document. Please use images smaller than %1 kB. Message is too long. Display Source Text &Bold Ctrl+B &Italic Italic Ctrl+I Underline Ctrl+U Color Insert Link Ctrl+L Insert Image RichTextEditorLink Add Link URL Text ServerHandler Unable to resolve hostname Server is not responding to TCP pings UDP packets cannot be sent to or received from the server. Switching to TCP mode. UDP packets cannot be sent to the server. Switching to TCP mode. UDP packets cannot be received from the server. Switching to TCP mode. UDP packets can be sent to and received from the server. Switching back to UDP mode. Connection timed out ServerView Favorite LAN Public Internet Unknown Africa Asia North America South America Europe Oceania ShortcutActionWidget Unassigned ShortcutDelegate On Off Toggle Unassigned ShortcutKeyWidget Press Shortcut ShortcutTargetDialog Root Parent Current Subchannel #%1 ShortcutTargetWidget ... , Root Parent Current Subchannel #%1 Invalid Empty <Empty> ShortcutToggleWidget Off Toggle On TextMessage Enter text If checked the message is recursively sent to all subchannels Send recursively to subchannels Tokens Empty Token Mumble - Access Tokens List of access tokens on current server <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. Add a token &Add Remove a token &Remove UserEdit Registered Users Remove Rename Who are you looking for? Days Weeks Months Years Inactive for Registered users: %n account(s) UserInformation User Information Connection Information Version OS Certificate IP Address CELT Versions Details... Ping Statistics Pings received Average ping TCP (Control) UDP (Voice) UDP Network statistics Good Late Lost Resync From Client To Client Connection time %1w %1d %1h %1m %1s , %1 (%2) %1.%2.%3 (%4) Supported Not Supported Not Reported %1 online (%2 idle) %1 online %1 kbit/s Bandwidth GroupBox Bandwidth Label Ping deviation UserListModel Nick Inactive days Last channel Last seen: %1 Never Channel ID: %1 UserLocalVolumeDialog Local volume for other users <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. Adjusting local volume for %1 dB <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: Talking to your channel. Shouting directly to your channel. Whispering directly to your channel. Whispering directly to you. Not talking. This is a channel on the server. The icon indicates the state of the channel: Your current channel. A channel that is linked with your channel. Linked channels can talk to each other. A channel on the server that you are not linked to. This shows the flags the user has on the server, if any: On your friend list Authenticated user Muted (manually muted by self) Muted (manually muted by admin) Muted (not allowed to speak in current channel) Muted (muted by you, only on your machine) Muted (push-to-mute) Deafened (by self) Deafened (by admin) User has a new comment set (click to show) User has a comment set, which you've already seen. (click to show) Ignoring Text Messages This shows the flags the channel has, if any: Channel has a new comment set (click to show) Channel has a comment set, which you've already seen. (click to show) Channel will be hidden when filtering is enabled Name Flags Are you sure you want to drag this user? Are you sure you want to drag this channel? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. VersionCheck Upgrade Mumble A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? Failed to launch snapshot installer. Corrupt download of new version detected. Automatically removed. Downloading new snapshot from %1 to %2 Failed to write new version to disk. Failed to write new version to disc. Mumble failed to retrieve version information from the central server. ViewCert Certificate Chain Details Certificate chain Certificate details Common Name Organization Subunit Country Locality State Valid from: %1 Valid to: %1 Serial: %1 Public Key: %1 bits %2 RSA DSA Digest (SHA-1): %1 Digest (SHA-256): %1 Email: %1 DNS: %1 Issued by: Unit Name VoiceRecorder Recorder failed to create directory '%1' Recorder failed to open file '%1' .wav - Uncompressed .ogg (Vorbis) - Compressed .au - Uncompressed .flac - Lossless compressed VoiceRecorderDialog Recorder Control 00:00:00 &Start S&top Mode Multichannel Output Output format Target directory Filename &Browse... Valid variables are: Inserts the user's name Inserts the current date Inserts the current time Inserts the hostname Recorder still running Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? Unable to start recording. Not connected to a server. The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. There is already a recorder active for this server. Please select a recording format. Stopping Select target directory Downmix WASAPIInput Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone. WASAPISystem Default Device qwPTTButtonWidget Mumble PTT Push to talk mumble-1.3.4/src/mumble/OpusCodec.cpp0000664000175000017500000000477314010707273017314 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "OpusCodec.h" #include "Audio.h" #include "Version.h" #include "MumbleApplication.h" #ifdef Q_CC_GNU #define RESOLVE(var) { var = reinterpret_cast<__typeof__(var)>(qlOpus.resolve(#var)); bValid = bValid && (var != NULL); } #else #define RESOLVE(var) { * reinterpret_cast(&var) = static_cast(qlOpus.resolve(#var)); bValid = bValid && (var != NULL); } #endif OpusCodec::OpusCodec() { bValid = false; qlOpus.setLoadHints(QLibrary::ResolveAllSymbolsHint); QStringList alternatives; #if defined(Q_OS_MAC) alternatives << QString::fromLatin1("libopus0.dylib"); alternatives << QString::fromLatin1("opus0.dylib"); alternatives << QString::fromLatin1("libopus.dylib"); alternatives << QString::fromLatin1("opus.dylib"); #elif defined(Q_OS_UNIX) alternatives << QString::fromLatin1("libopus.so.0"); alternatives << QString::fromLatin1("libopus0.so"); alternatives << QString::fromLatin1("libopus.so"); alternatives << QString::fromLatin1("opus.so"); #else alternatives << QString::fromLatin1("opus0.dll"); alternatives << QString::fromLatin1("opus.dll"); #endif foreach(const QString &lib, alternatives) { qlOpus.setFileName(MumbleApplication::instance()->applicationVersionRootPath() + QLatin1String("/") + lib); if (qlOpus.load()) { bValid = true; break; } #ifdef Q_OS_MAC qlOpus.setFileName(QApplication::instance()->applicationDirPath() + QLatin1String("/../Codecs/") + lib); if (qlOpus.load()) { bValid = true; break; } #endif #ifdef PLUGIN_PATH qlOpus.setFileName(QLatin1String(MUMTEXT(PLUGIN_PATH) "/") + lib); if (qlOpus.load()) { bValid = true; break; } #endif qlOpus.setFileName(lib); if (qlOpus.load()) { bValid = true; break; } } RESOLVE(opus_get_version_string); RESOLVE(opus_encode); RESOLVE(opus_decode_float); RESOLVE(opus_encoder_create); RESOLVE(opus_encoder_ctl); RESOLVE(opus_encoder_destroy); RESOLVE(opus_decoder_create); RESOLVE(opus_decoder_destroy); RESOLVE(opus_packet_get_nb_frames); RESOLVE(opus_packet_get_samples_per_frame); } OpusCodec::~OpusCodec() { qlOpus.unload(); } bool OpusCodec::isValid() const { return bValid; } void OpusCodec::report() const { qDebug("%s from %s", opus_get_version_string(), qPrintable(qlOpus.fileName())); } mumble-1.3.4/src/mumble/mumble_nl.ts0000664000175000017500000137203114010707274017243 0ustar builderbuilder ACLEditor Deny Weigeren Allow Toestaan Allow %1 %1 toestaan Deny %1 %1 weigeren Mumble - Add channel Mumble - Kanaal toevoegen Default server value Standaardwaarde server Failed: Invalid channel Mislukt: Ongeldig kanaal Mumble - Edit %1 Mumble - %1 bewerken ID: %1 ID: %1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Dit verleent de %1 machtiging. Het wordt geweigerd als een machtiging op toestaan én op weigeren staat.<br />%2 Channel must have a name Kanaal moet een naam hebben This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Dit trekt de %1 machtiging in. Het wordt geweigerd als de machtiging op toestaan én op weigeren staat.<br />%2 Dialog Venster Name Naam Enter the channel name here. Vul hier de kanaalnaam in. Description Omschrijving Password Wachtwoord Enter the channel password here. Vul hier het kanaalwachtwoord in. Check to create a temporary channel. Selecteer om een tijdelijk kanaal aan te maken. Temporary Tijdelijk <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Positie</b><br/> De bepaalt volgorde hoe Mumble kanalen plaatst (boomstructuur) . Kanalen met ↑ <i>Positie</i> waarde gaan ↓. Indien gelijke <i>Positie</i>waarden; alfabetisch. Position Positie &Groups &Groepen Group Groep List of groups Groepenlijst Remove selected group Geselecteerde groep verwijderen Remove Verwijderen Inherit group members from parent Groepsleden ↳ erven Inherit Erven Make group inheritable to sub-channels Groep ↳-erfbaar maken Inheritable Erfbaar Group was inherited from parent channel Groep ↳ geërfd Inherited Geërfd Members Leden Add Toevoegen Add member to group Lid aan groep toevoegen Remove member from group Groepslid verwijderen &ACL &ACL Active ACLs Actieve ACL's List of entries Regellijst Inherit ACL of parent? ACL ↳ erven? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. Bepaalt of de ACL('s) ↳ moet(en) worden toegepast. "Toepassen op sub-kanalen" blijft sowieso ↳ gelden. Inherit ACLs ACL's erven Move entry up Naar regel omhoog verplaatsen This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. Verplaatst ↑ lijst (veranderlijke gebruikersrechten). Regels ↑ geërfde regels plaatsen is slechts mogelijk als je dupliceert. &Up &Omhoog Move entry down Regel omlaag verplaatsen This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. Verplaatst regel ↓ lijst (veranderlijke gebruikersrechten). &Down Om&laag Add new entry Nieuwe regel toevoegen This adds a new entry, initially set with no permissions and applying to all. Voegt een nieuwe regel toe, initieel zonder permissies en wordt toegepast op alle groepen. &Add &Toevoegen Remove entry Regel verwijderen This removes the currently selected entry. Verwijdert geselecteerde regel. &Remove &Verwijderen Context Context Entry should apply to this channel. Entry should apply to this channel Regel op dit kanaal laten gelden. This makes the entry apply to this channel. Past de regel toe op dit kanaal. Applies to this channel Van toepassing op dit kanaal Entry should apply to sub-channels. Regel op sub-kanalen laten gelden. Add new group Nieuwe groep maken <b>Add</b><br/> Add a new group. <b>Maken</b><br/> Creëer groep. Inherited members Geërfde leden Contains the list of members added to the group by this channel. Ledenlijst (kanaalgroep). Contains a list of members whose group membership will not be inherited from the parent channel. Ledenlijst waarvan ↱-lidmaatschap niet wordt geërfd. Contains the list of members inherited by other channels. Bevat door andere kanalen geërfde ledenlijst. Type in the name of a user you wish to add to the group and click Add. Vul naam in (asprirerend groepslid) en klik Toevoegen. Type in the name of a user you wish to remove from the group and click Add. Vul naam in (verwijderbare ex-'lid') en klik Verwijderen. Exclude Uitsluiten Excluded members Uitgesloten leden This makes the entry apply to sub-channels of this channel. Regeltoepassing ↳-kanalen. Applies to sub-channels Van toepassing op ↳-kanalen Permissions Permissies User/Group Gebruiker/Groep Group this entry applies to Groep waar regel dient te gelden User ID Gebruikersnaam User this entry applies to Gebruiker waar regel voor dient te gelden This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. Beheert gebruikersrechten. Vul gebruikersnaam in en druk Enter om server op overeenkomst te zoeken. &Properties &Eigenschappen <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>Naam</b><br />Vul kanaalnaam in dit veld in. Naam moet voldoen aan door server gestelde eisen. <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>Tijdelijk</b><br /> Markeert het kanaal als tijdelijk. Kanaal wordt automatisch door server verwijderd als laatste speler kanaal verlaat. <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>Groep</b><br />Alle momenteel gedefinieerde kanaalgroepen. Voor nieuwe groep; vul naam in Enter. <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>Verwijderen</b><br />Verwijdert geselecteerde groep. Als de groep is geërfd, blijft deze in lijst, maar lokale alle groepsinformatie wordt wel uitgewist. <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>Erven</b><br />Groepsleden worden ↳ geërfd mits groep gemarkeerd als <i>Erfbaar</i>. <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>Erfbaar</b><br />Groep wordt Erfbaar voor sub-kanalen. Niet-overerfbare groep laat nog wel steeds sub-kanalen onder identieke naamgeving creëren. <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>Geërfd</b><br />Geeft aan dat de groep ↳ geërfd was. Dit is onbewerkbaar zijnde informatie. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>Leden</b><br /> Lijst omvat alle groepsleden van huidige kanaal. Let erop dat dit geen leden bevat van ↳ geërfde kanalen. Vindbaar in <i>Geërfde leden</i> lijst. Om verdere erving te voorkomen, deselecteer <i>Erfbaar</i> of voeg leden zelf toe aan <i>Uitgesloten leden<i> lijst. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>Uitgesloten leden</b><br /> Bevat ledenlijst waarvan groepslidmaatschap niet van ↱ wordt geërfd. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. <b>Geërfde leden<b><br /> Bevat de huidige kanaal ↳-ledenlijst . Deselecteer <i>Erven</i> om kanalen-erving te voorkomen. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. Regeltoepassingsbeheer (→ welke gebruikersgroepen).<br />Groep wordt geëvalueerd in context van kanaal waarin regel gebruikt wordt. ACL die standaard op ↑-ste kanaal is ingesteld geeft bijv. <i>Schrijf</i>-recht aan <i>admin</i> groep (geërfd; verleent gebruiker schrijfrechten mits <i>admin</i>-groepslid). Zelfs als gebruiker niet behoort tot groep van oorspronkelijke ACL.<br />!-groepsnaam keert lidmaatschap om & ~-groepsnaam geldt lidmaatschap van kanaal waarin ACL is gedefinieerd i.p.v. wordt toegepast.<br />#-groepsnaam dient als toegangssleutel. Gebruiker moet #-sleutel in toegangssleutellijst hebben (simpele beveiliging (ongeregistreerde gebruikers)).<br />$-groep past louter toe op gebruikers waarvan certificaat-kenmerk (na '$') overeenkomt.<br />Speciale voorgedefinieerde groepen:<br /><b>all</b> - Iedereen.<br /><b>auth</b> - Alle geregistreerde gebruikers.<br /><b>sub,a,b,c</b> - Gebruiker nu in een kanaal met min. <i>a</i> gedeelde ↱-kanalen en <i>b</i> à <i>c</i> ↳-kanalen. Uitgebreidere documentatie op website.<br /><b>in</b> - Gebruikers in kanaal (simpeler t.o.v. '<i>sub,0,0,0</i>').<br /><b>out</b> - Gebruikers buiten het kanaal (simpeler t.o.v. '<i>!sub,0,0,0</i>').<br />Regels louter van toepassing op gebruiker/groep. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. <b>Wachtwoord</b><br />Laat jou een wachtwoord van een kanaal instellen of wijzigen. Gebruikt Mumble's toegangsversleutelingen. Gebruik ACL's/groepen als jij nauwkeuriger / krachtiger toegangsbeheer nodig hebt. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. Toont alle op dit kanaal actieve regels. Geërfde regels staan schuingedrukt.<br />ACL's worden ↓ toegepast, ↓ is ↑-prioriteit. ID of the channel. Kanaal-ID Maximum Users Gebruikersmaximum Maximum number of users allowed in the channel Max. aantal toegestane gebruikers in het kanaal <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. <b>Gebruikersmaximum</b><br /> Waarde bepaalt het maximale aantal toegestane gebruikers in het kanaal. Mits waarde boven nul ligt kunnen alleen dat aantal gebruikers het kanaal binnenkomen. Als het nul is, is max. aantal toegestane gebruikers de serverstandaardlimiet. This is the sort order for the channel. Sorteervolgorde van het kanaal ALSAAudioInput Default ALSA Card Standaard ALSA kaart Opening chosen ALSA Input failed: %1 Gekozen ALSA Invoer openen mislukt: %1 ALSAAudioOutput Default ALSA Card Standaard ALSA kaart Opening chosen ALSA Output failed: %1 Gekozen ALSA-Uitvoer openen mislukt: %1 ASIOConfig %1 (version %2) %1 (versie %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz %1 -> %2 ondervindingsbuffer, met %3 ondervindingsresolutie (%4 bij voorkeur) op %5 Hz ASIO Initialization failed: %1 ASIO-initialisatie mislukt: %1 Failed to instantiate ASIO driver ASIO-stuurprogramma initialiseren mislukt ASIO ASIO Device selection Apparaatselectie Device Apparaat Device to use for microphone Apparaat om microfoon te gebruiken This chooses what device to query. You still need to actually query the device and select which channels to use. Dit bepaald het apparaat waarvan kanalen op te vragen. Vereist apparaat om kanalen vragen (en te selecteren). Query selected device Kanalen ophalen (geselecteerd apparaat) This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. Vraagt kanalen van geselecteerde apparaat op. Veel ASIO-stuurprogramma's zijn uiterst instabiel en gebruik kan crash van het programma of systeem veroorzaken. &Query &Opvragen Configure selected device Geselecteerd apparaat configureren This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. Configureert geselecteerde apparaat. Veel ASIO-stuurprogramma's zijn uiterst instabiel en gebruik kan programma- of systeemcrash veroorzaken. &Configure &Configureren Capabilities Mogelijkheden Driver name Stuurprogramma-naam Buffer size Buffergrootte This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. Configureert invoerkanalen voor ASIO. Minstens één kanaal als microfoon en één als luidspreker (of meer). <i>Microfoon</i> moet aan de microfoon verbonden kanaal zijn <i>Luidspreker</i> afspelend kanaal '<i>Wat je hoort</i>'. <br />Bijvoorbeeld, met de Audigy 2 ZS is Microfoon '<i>Mic L</i>' juist. Luidspreker set-up: '<i>Mix L</i>' en '<i>Mix R</i>'. Configure input channels Invoerkanalen configureren Channels Kanalen Microphone Microfoon <- -> Unused Ongebruikt Speakers Luidsprekers ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. Je moet minstens één microfoon- en luidsprekerbron selecteren om ASIO te gebruiken. Als je louter de microfoon wilt instellen, gebruik DirectSound. Opening selected ASIO device failed. No input will be done. Openen geselecteerd ASIO-apparaat niet gelukt; geen invoer. AboutDialog About Mumble Over Mumble <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> <h3>Mumble (%1)</h3><p>%3</p><p><b>Spraak/chat-applicatie voor gamers</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble &Over Mumble &License &Licentie A&uthors A&uteurs &Third-Party Licenses &Licenties van derden OK OK AudioInput Interface Interface System Systeem Input method for audio Geluidsinvoermethode <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Dit is de geluidsinvoermethode.<br><br />Waarschijnlijk wil je DirectSound gebruiken. Device Apparaat Input device for audio Invoerapparaat voor geluid <b>This is the input device to use for audio.</b> <b>Dit is het geluidsinvoerapparaat.</b> Transmission Transmissie &Transmit &Overbrengen When to transmit your speech Wanneer spraak te verzenden <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. <b>Bepaalt wanneer spraak wordt verzonden.</b><br /><i>Continue</i> - Heel de tijd<br /><i>Spreek Activiteit</i> - Wanneer duidelijk sprekend.<br /><i>Druk Om Te Praten</i> - Wanneer sneltoets-indrukkend (ingesteld onder <i>Sneltoetsen</i>). DoublePush Time DubbelDruk Tijd If you press the PTT key twice in this time it will get locked. DotP-knop dubbel binnen de tijd indrukken zorgt voor inhouden. <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. <b>DubbelDruk Tijd<b><br />Dubbel binnen ingestelde tijdsinterval de Druk-om-te-Praten-knop indrukken zorgt voor inhouding. Mumble blijft zenden tot je een laatste maal op de knop drukt om DotP los te laten. Reset audio cue to default Geluidssignaal naar standaardwaarde herstellen <b>Reset</b><br/>Reset the paths for the files to their default. <b>Herstel</b><br/>Bestandspaden naar standaardwaarden herstellen Browse for on audio file Naar "aan"-geluidsbestand bladeren Browse for off audio file Naar "uit"-geluidsbestand bladeren Off Uit On Aan Preview the audio cues Geluidssignaal-voorbeelden beluisteren Use SNR based speech detection SNR-gebaseerde spraakherkenning gebruiken Signal to Noise Signaal-ruis <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. Spraakherkenning d.m.v. Amplitude. </b><br /> Deze modus pakt invoersignaalsterkte voor spraakherkennen. Amplitude Amplitude Voice &Hold Spraak &Vasthouden How long to keep transmitting after silence Hoe lang na stilte blijven zenden Silence Below Stilte Onder <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. <b>Drempelwaarden voor spraakherkenning instellen.</b><br />Gebruik dit samen met het geluidsstatistiekenvenster om de drempelwaarden af te stemmen om spraak te herkennen. Waarden ònder "Stilte Onder" tellen als stilte. Waarden bóven "Spraak Boven" tellen als spraak. Waarden ertussen tellen als spraak als je al praat, maar geen nieuwe herkenning. Speech Above Spraak Boven Signal values above this count as voice ↑ signaalwaarde telt als spraak Compression Compressie &Quality &Kwaliteit Quality of compression (peak bandwidth) Compressiekwaliteit (piekbandbreedte) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. <b>Bepaalt compressiekwaliteit.</b><br />Bepaalt hoeveel bandbreedte bruikbaar is (uitgaand geluid). Audio per packet Geluid per pakketje How many audio frames to send per packet Hoeveel geluidsframes per pakketje te verzenden <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>Selecteert hoeveel geluidsframes in één pakketje moeten komen.</b><br />Dit verhogen, verhoogt de spraaklatentie maar vermindert vereiste bandbreedte. <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). <b>Toont piekgebruik uitgaande bandbreedte.</b><br />Toont piekhoeveelheid verzonden bandbreedte. Geluidbitsnelheid is het maximum (de variabele bitrate) louter voor geluidsgegevens. Positie betreft bitsnelheid gebruikt voor positionele-informatie. Overhead = frame + hoofd van IP-pakketjes (IP&UDP: 75% van overhead). Audio Processing Geluidsverwerking Noise Suppression Ruisonderdrukking Noise suppression Ruisonderdrukking <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. <b>Bepaalt geluidsonderdrukkingshoeveelheid.</b><br />Hoe ↑, des te agressiever ruis wordt onderdrukt. Maximum amplification of input sound Maximale invoergeluid-versterking <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. <b>Maximale inputversterking.</b><br />Mumble normaliseert invoervolume alvorens compressie, en dit stelt in hoeveel het toestaat te versterken.<br />Het werkelijke niveau wordt voortdurend bijgewerkt o.b.v. spraakpatroon, maar gaat nooit boven het aangegeven niveau.<br />Als de <i>Microfoon luidheid</i> van de geluidsstatistieken schommelt rond 100%, wil je dit waarschijnlijk instellen op +-2,0, maar als, zoals de meesten, niet lukt om 100% te bereiken, veel ↑.<br />Idealistisch, stel in zodat <i> Microfoon Luidheid* Versterkingsfactor> = 100 </i>, zelfs terwijl je zachtjes praat. <br /><br /> Het kan geen kwaad om de instelling maximaal te zetten (Mumble pikt andere gesprekken op als je overlaat om automatisch af te stellen op dat niveau). Current speech detection chance Huidige spraakherkenningskans Cancel echo from speakers Onderdruk luidsprekergalm Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. Stopt luidsprekerecho; gemengd levert ↑ CPU-prestaties op (werkt louter goed als luidsprekers even luid en met gelijke afstand van microfoon z.d. als driehoek staan). Meer-kanaalse galmdemper voorziet in uitmuntende galmdemping maar met ↓ CPU-prestaties ten gevolge. Disabled Uitgeschakeld <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>Spraakherkenning d.m.v. Signaal/Ruis-verhouding.</b><br />Deze modus analyseert input naar iets lijkend op een duidelijk signaal, signaal-helderheid dient voor spraakherkenning. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>Toont de huidige spraakherkenningsinstellingen.</b><br />Instellingen via Geluidswizard of Instellingenvenster wijzigbaar. Signal values below this count as silence ↓ signaalwaarde telt als stilte Maximum bandwidth used for sending audio Maximale bruikbare bandbreedte om geluid te zenden. Use Amplitude based speech detection Amplitude-gebaseerde spraakherkenning als methode. <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). <b>Selecteert hoe lang spraakverzendingsonderbrekingen aan te houden.</b><br />Verhoog als je spraak hapert wanneer je spreekt (zichtbaar door knipperend praaticoontje naast je naam). Exclusive mode Exclusieve-modus <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>Opent het apparaat in exclusieve modus.</b><br />Geen andere applicatie kan het apparaat gebruiken. Exclusive Exclusief R&eset &Herstel &Browse... &Bladeren... B&rowse... B&laderen &Preview &Voorbeeld <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. <b>Voorbeeld</b><br/>Speelt <i>aan</ i> geluid gevolgd door <i>uit</i> geluid af. Displays an always on top window with a push to talk button in it Venster op voorgrond met een druk-om-te-praten knopje. Display push to talk window Druk-om-te-praten-venster tonen Misc Diversen Audible audio cue when starting or stopping to transmit Hoorbaar geluidssignaal bij begin of einde verzenden. <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. <b>Genereert geluidssignalen bij zenden.</b><br />Instellen geeft je een kort start/stop-geluidssignaal. Audio cue Geluidssignaal Gets played when starting to transmit Wordt afgespeeld zodra zenden aanvangt. Gets played when stopping to transmit Wordt afgespeeld zodra wordt opgehouden te zenden. Hold Time Vasthoudtijd Time the microphone stays open after the PTT key is released Tijdsduur dat microfoon openblijft nadat de druk-om-te-praten knop wordt losgelaten. Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) Servers' maximum netwerkbandbreedte is slechts %1 kbit/s. Geluidskwaliteit automatisch versteld naar %2 kbit/s (%3 ms) Max. Amplification Max. Versterking Idle action Inactiviteitsactie minutes do minuten doe nothing niets deafen doven mute dempen after na Echo Cancellation Echo-opheffing Mixed echo cancellation Gemixte echo-opheffing Multichannel echo cancellation Meer-kanaalse echo-opheffing The idle action will be reversed upon any key or mouse button input De inactiviteitsactie wordt teruggedraaid bij een druktoets of klikje Undo Idle action upon activity Inactiviteitsactie ongedaan maken bij activiteit Apply RNNoise's noise suppression filter. <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. RNNoise Audio input AudioInputDialog Continuous Continue Voice Activity Spraakactiviteit Push To Talk Druk om te Praten Audio Input Geluidsinvoer %1 ms %1 ms Off Uit %1 s %1 s %1 kb/s %1 kb/s -%1 dB -%1 dB %1 kbit/s (Audio %2, Position %4, Overhead %3) %1 kbit/s (Geluid %2, Positie %4, Overhead %3) AudioOutput Interface Interface System Systeem Output method for audio Geluidsuitvoermethode <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Dit is de geluidsuitvoermethode.<br><br />Waarschijnlijk wil je DirectSound gebruiken. Device Apparaat Output device for audio Geluidsuitvoerapparaat <b>This is the output device to use for audio.</b> <b> Dit is het geluidsuitvoerapparaat. </b> Positional Audio Positioneel Geluid Audio Output Geluidsuitvoer Default &Jitter Buffer Standaard &Jitter Buffer Safety margin for jitter buffer Veiligheidsmarge (jitter buffer) <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. <b>Bepaalt minimum jitter buffer veiligheidsmarge.</b><br />Al het inkomend geluid wordt gebufferd, en de jitter buffer probeert voortdurend om de buffer te reduceren tot het minimale wat je netwerk aankan, zodat latentie minimaal blijft. Omvat minimale bufferomvang. Als de zinnen zenuwachtig klinken verhoog het getal. Minimum distance to user before sound volume decreases Minimumafstand tot gebruiker totwaar geluidsvolume afneemt This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. Bepaalt minimumafstand voor geluidsberekeningen. Spraakvolume van andere gebruikers daalt niet, totdat ze minstens tot ongeveer zover van jou af bevinden. This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. Bepaalt maximumafstand voor geluidsberekeningen. Wanneer verder weg, neemt spraakvolume van andere gebruikers niet verder af. <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. <b>Dit activeert een van de loopback-test modi</b><br /><i>Geen</i> - Loopback uitgeschakeld<br /><i>Lokaal</i> - Een lokale server nabootsen.<br /><i>Server</i> - Loopback van server verzoeken.<br />Zolang loopback aanstaat, hoort niemand anders je spreken. Instelling gaat verloren bij afsluiten applicatie. Volume Volume Volume of incoming speech Volume van inkomende spraak <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. <b>Dit past het volume van inkomende spraak aan.</b><br />Voorbij 100% verhogen, vervormd het geluid. Output Delay Uitvoervertraging Amount of data to buffer Hoeveelheid te bufferen gegevens The connected "speakers" are actually headphones The connected "speakers" are actually headphones. Aangesloten "luidsprekers" eigenlijk "een hoofdtelefoon". Factor for sound volume decrease Geluidsvolumeverlagingsfactor Bloom Bloeien Factor for sound volume increase Geluidsvolumeverhogingsfactor How much should sound volume increase for sources that are really close? Hoeveel volume toe laten nemen qua dichtbij zijnde bronnen? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. Aanvinken geeft aan dat je geen luidsprekers, maar koptelefoon verbindt. Belangrijk, omdat luidsprekers vóór je bevinden, terwijl hoofdtelefoon links/rechts is. This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Bepaalt vooraf te bufferen hoeveelheid gegevens naar uitvoerbuffer. Experimenteer verschillende waarden en stel op het laagst in om snelle geluidsjitters te voorkomen. Headphones Hoofdtelefoon Minimum Distance Minimumafstand Maximum Distance Maximumafstand Maximum distance, beyond which speech volume won't decrease Maximumafstand waarvanaf spraakvolume niet meer afneemt. Minimum Volume Minimumvolume What should the volume be at the maximum distance? Hoeveel maximumafstandvolume? Loopback Test Loopback Test Delay Variance Vertragingsvariantie Variance in packet latency Verschillen in pakket-latentie <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>Bepaalt pakket-latentie variantie voor loopback-testen.</b><br />Meeste geluidspaden bevatten variabele latentie. Variantie voor loopback-modus testen instellen. Bijvoorbeeld, het op 15ms instellen, bootst een netwerk na met 20-35ms of 80-95ms latentie. Binnenlandse verbindingen verschillen doorgaans ongeveer 5ms. Packet Loss Pakketverlies Packet loss for loopback mode Loopback-modus-pakketverlies. <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% <b>Dit stelt het pakketverlies voor loopback-modus in.</b><br />Dit wordt de verhouding van verloren pakketjes. Tenzij jouw uitgaande bandbreedte piekt of jouw netwerkverbinding niet op orde is blijft het 0%. &Loopback &Loopback Desired loopback mode Gewenste loopback-modus Attenuate applications by... Applicaties afzwakken met... Attenuation of other applications during speech Afzwakking van andere applicaties tijdens spraak <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. <b>Ander applicatievolume tijdens spreken afzwakken</b><br />Mumble ondersteunt volumevermindering van andere applicaties gedurende inkomende en/of uitgaande spraak. Dit stelt de afzwakking van andere applicaties mits het aanstaat. If checked Mumble lowers the volume of other applications while other users talk Indien aangevinkt, verlaagt Mumble het volume van andere applicaties terwijl andere gebruikers praten <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. <b>Applicaties afzwakken terwijl anderen praten</b><br />Mumble ondersteunt applicatievolumevermindering gedurende inkomende en/of uitgaande spraak. Zorgt ervoor dat Mumble dat doet activeert, als andere gebruikers tegen je praten. while other users talk terwijl andere gebruikers praten If checked Mumble lowers the volume of other applications while you talk Aangevinkt, verlaagt mumble ander applicatievolume terwijl je praat <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. <b>Applicaties afzwakken terwijl je praat</b><br/>Mumble ondersteunt applicatievolumevermindering gedurende inkomende en/of uitgaande spraak. Zorgt ervoor dat Mumble dat doet terwijl jij praat. while you talk terwijl jij praat Exclusive mode, not recommended. Exclusieve-modus, afgeraden. <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>Opent apparaat in exclusieve-modus.</b><br />Geen andere applicatie kan dit apparaat gebruiken. Exclusive Exclusief Priority Speaker Prioriteitsspreker If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. Aangevinkt, verlaagt Mumble het volume van anderen terwijl je praat als je de "Prioriteitsspreker"-status hebt. <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. <b>Andere gebruikers afzwakken tijdens praten of als Prioriteitsspreker.</b><br />Mumble ondersteunt volumevermindering van anderen terwijl je praat als <i>Prioriteitsspreker</i> om gestoord worden te voorkomen. Aanvinken betekent inschakeling. Attenuate other users while talking as Priority Speaker. Anderen tijdens prioriteitsspreker-sprekend afzwakken. Advanced Attenuation Options Geavanceerde afzwakkingsopties If checked, Mumble will only attenuate applications that are using the same output source as Mumble Indien aangevinkt, zwakt Mumble slechts applicaties af die dezelfde uitvoerbron(nen) als Mumble gebruiken. <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. <b>Louter applicaties die zelfde uitvoer als Mumble gebruiken afzwakken</b><br />Indien aangevinkt, wordt applicatie-uitvoer ↮ Mumble gebruiken niet afgezwakt. Only attenuate applications using the same output device Applicaties die eenzelfde uitvoerapparaat gebruiken afzwakken. If checked, PulseAudio loopback modules will be attenuated Aangevinkt worden PulseAudio loopback modules afgezwakt. <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. <b>PulseAudio loopback modules afzwakken</b><br />Aan Mumble's uitvoerapparaat gekoppelde loopback-modules worden uiteindelijk afgezwakt. Attenuate PulseAudio loopback modules PulseAudio loopback modules afzwakken Audio output AudioOutputDialog None Geen Local Lokaal Server Server Audio Output Geluidsuitvoer %1 ms %1 ms %1 % %1 % %1 m %1 m AudioOutputSample Choose sound file Kies geluidsbestand Invalid sound file Ongeldig geluidsbestand The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. Bestand '%1' kan niet door Mumble gebruikt worden. Bestand met bruikbare indeling/codering selecteren! AudioStats >1000 ms >1000ms >1000 ms Audio Statistics Audio Statistieken Input Levels Invoerniveaus Peak microphone level Microfoonniveaupiek Peak power in last frame Piekmeting van het laatste frame This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. Toont de piekkracht uit het laatste frame (20 ms), eenzelfde meting als als invoermeting. Kijk naar <b>Microfoonmeting</ b> welke véél stabieler is (en uitschieters niet meeneemt). Peak speaker level Speakerniveaupiek This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. Toont luidsprekers-piekmeting uit laatste frame (20 ms). Tenzij je gebruikmaakt van multi-kanaal ondervindingsmethode (zoals ASIO) met luidsprekerkanalen geconfigureerd, is dit 0. Als je zo'n opstelling ingesteld hebt, en geeft 0 weer terwijl andere programma's geluid afspelen kloppen je instellingen niet. Peak clean level Zuiver-niveaupiek This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. Toont piekmeting uit het laatste frame (20 ms) na alle verwerking. Idealistisch is dit -96 dB zijn wanneer je niet praat. In werkelijkheid is in een geluidsstudio -60 dB te zien; jij dient ongeveer rond -20 dB te zien. Pratend, moet het oplopen tot -5 á -10 dB.<br />Als je ook gebruikmaakt van galmonderdrukking, en dit 'oploopt' over -15 dB terwijl niet pratend; dan werkt jouw opstelling niet, want dan irriteer jij anderen met echo's. Signal Analysis Signaalanalyse Microphone power Microfoonmeting How close the current input level is to ideal Hoe (dichtbij) het huidig invoerniveau t.o.v. 'het ideale'. This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. Toont aan hoe dicht huidig invoervolume is tot het ideale. Om je microfoonniveau te wijzigen, open het programma dat gebruikt om het opnamevolume aan te passen, en kijk naar de waarde tijdens praten.<br /><b>Praat luid, zoals je zou doen indien je teleurgesteld raakt omdat je verslagen wordt.</b><br />Pas volume aan totdat de waarde dicht bij 100% ligt, maar bevestig dat het er niet boven gaat. Bovengaand voorspelt haperingen tijdens spreken, waardoor geluidskwaliteit afneemt. Signal-To-Noise ratio Signaal-ruisverhouding Signal-To-Noise ratio from the microphone Signaal-ruisverhouding (microfoon) This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. Signaal-ruisverhouding (SNR) van microfoon uit laatste frame (20 ms). Toont hoe zuiver de stem verhoudt tot de ruis.<br />Indien deze waarde ↓ 1 komt, ontstaat ↑ ruis van stem in het signaal waarmee kwaliteit afneemt.<br />Geen waarde-bovengrens, maar verwacht niets ↑ 45 zonder geluidsstudio. Speech Probability Spraakwaarschijnlijkheid Probability of speech Waarschijnlijkheid van spraak This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). Waarschijnlijkheid dat het laatste frame (20 ms) spraak was en geen omgevingsruis.<br />Spraakactiviteit verzenden is afhankelijk van dit juist hebben. De truc hierbij is dat het midden van een zin altijd als spraak gedetecteerd wordt; het probleem is de pauzes tussen woorden en het begin van spraak. Het is lastig gezucht onderscheiden van een woord begint met 'h<br />Als dit in dierenarts lettertype staat verzend Mumble (mit verbonden). Configuration feedback Configuratieterugkoppeling Current audio bitrate Huidige geluidsbitsnelheid Bitrate of last frame Bitsnelheid van het laatste frame DoublePush interval DubbelDruk interval Time between last two Push-To-Talk presses Tijd tussen (2 laatste) Druk-om-te-Praten in-drukkingen. Speech Detection Spraakherkenning Current speech detection chance Huidige spraakherkenningskans <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b> Toont de huidige spraakherkenningsinstellingen.</b><br />Instellingen via Geluidswizard of Instellingenvenster wijzigbaar. Signal and noise power spectrum Signaal-ruisverhouding Power spectrum of input signal and noise estimate Trillingsanalyse van invoersignaal & ruisschatting This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. Toont een trillingsanalyse van het invoersignaal (rode lijn) en een ruisschatting (blauw gevuld).<br />Amplitude wordt vermenigvuldigd met 30 te tonen hoeveel ↑ signaal t.o.v. ruis per golfgebied aanwezig is.<br />Alleen interessant als je ruisomstandigheden fijn probeert te stellen op je microfoon. Onder goede omstandigheden is slechts een klein fladder blauwig aan de onderkant. Als het blauwe voorbij halverwege ↑ grafiek gaat dan bevindt je je in een extreem luide omgeving. Echo Analysis Galmanalyse Weights of the echo canceller Galmdempgewicht This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. Galmdempgewicht; tijd ↑ (↓) & frequentie ↑ (→).<br />Idealistisch is dit zwart, wanneer geen galm bestaat. Je hebt normaliter één of ↑ blauwe horizontale strepen die galmvertragingsduur aanduidt. Real-time zijn beide gewichten bijgewerkt te zien.<br />Zolang je geen galmveroorzaker hebt zie je geen nuttige gegevens. Speel muziek af want dat stabiliseert.<br />Kies voor echte of ingebeelde delen v.h. frequentiegewichten-deel of berekende modulus en fase bekijken. Modulus, zijnde galmsterkte; toont je hoeveel uitgaand signaal wordt verwijderd. Andere weergave-modi zijn vooral bedoeld voor degenen de galm-algoritmen trachten af te stellen.<br />Als het beeld erg fluctueert, terwijl in modulus-modus & galmdemper faalt om verband te detecteren tussen twee invoerbronnen (microfoon en luidsprekers) dan is er sprake galmvertraging/foute invoerbron. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. Geluidsbitsnelheid laatst gecomprimeerd frame springt zodanig op en neer terwijl de VBR de kwaliteit aanpast. Bitsnelheidspiek aanpasbaar in het Instellingenvenster. AudioWizard Audio Tuning Wizard Geluidsafstemmingswizard Introduction Introductie Welcome to the Mumble Audio Wizard Welkom bij Mumble-geluidswizard Finished Klaar Enjoy using Mumble Veel plezier met Mumble-gebruik Device selection Apparaatselectie Selecting the input and output device to use with Mumble. In- en uitvoerapparaten; voor Mumble aan het selecteren. This is the device your microphone is connected to. Het apparaat waaraan/mee je microfoon is verbonden. System Systeem Input method for audio Invoerapparaat voor geluid <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Dit is de invoermethode voor geluid.<br><br />Waarschijnlijk wil je DirectSound gebruiken. Device Apparaat Input device to use Te gebruiken invoerapparaat <b>Selects which sound card to use for audio input.</b> <b>Selecteert geluidsinvoerkaart.</b> Cancel echo from headset or speakers Galm van koptelefoon of luidsprekers onderdrukken Use echo cancellation Gebruik galmonderdrukking This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. Dit stelt galmonderdrukking in op uitgaand geluid, wat voor zowel koptelefoons alsook luidsprekers bijdraagt. This is the device your speakers or headphones are connected to. Apparaat dat je hoofdtelefoon e/o luidsprekers verbindt. Output method for audio Geluidsuitvoermethode <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Dit is de uitvoermethode voor geluid.<br><br />Waarschijnlijk wil je DirectSound gebruiken. Output device to use Te gebruiken uitvoerapparaat <b>Selects which sound card to use for audio Output.</b> <b>Selecteert geluidsuitvoerkaart.</b> Enable positional audio Positie-gebaseerd-geluid inschakelen Allows positioning of sound Allows positioning of sound. Staat geluidspositionering toe <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> <p> Geluidsafstemmingswizard van Mumble. Helpt je om de juiste invoerniveaus van je geluidskaart en de juiste parameters voor geluidsverwerking bij Mumble in te stellen. </p> <p> Zolang de wizard actief is wordt geluid lokaal doorgelust, zodat je kunt luisteren. Kortom; er wordt geen geluid naar server verzonden. </p> Input Device Invoerapparaat Output Device Uitvoerapparaat This allows Mumble to use positional audio to place voices. Staat Mumble toe stemmen te positioneren. <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> <p> Om latentie tot het minimum te beperken, is het belangrijk om zo minimaal geluid te bufferen op de geluidskaart. Veel geluidskaarten vragen veel ↓ buffer dan wat ze werkelijk aankunnen; enige manier om deze waarde in te stellen is door te proberen en te falen. </p> <p> Je moet een stemvoorbeeld horen. Verander de schuifregelaar naar de ↓ waarde welke <b>geen</b> onderbrekingen of jitter in het geluid geeft. Stel vast dat er géén lokale echo tijdens de test voordoet. </p> Amount of data to buffer Te bufferen gegevenshoeveelheid This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Bepaalt uitvoerbuffer-gegevenshoeveelheid om vooraf te bufferen. Experimenteer verschillende waarden en stel op het laagste waarbij ↛ (storende) geluidsjitter. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> <p> Open je geluidsconfiguratiescherm en ga naar de opname-instellingen. Bevestig dat de microfoon als actieve ingang is geselecteerd (+max. opnamevolume). Indien 'Microfoonversterking" instelbaar is; activeer. </p> <p> Luid spreken, zoals zijnde geïrriteerd/opgewonden. Verlaag geluidsconfiguratieschermvolume totdat de balk zo hoog mogelijk in het blauw en groen blijft;<b>niet</b> in het rode gebied terwijl je spreekt. </p> Positional Audio Positioneel geluid Adjusting attenuation of positional audio. Positionele geluidsafzwakking afstemmen. <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> <p> Mumble positioneert geluid (bepaalde games), wat stemmen van andere gebruikers t.o.v. spelpositie plaatst. Aan de hand daarvan wordt volume aangepast om richting en afstand van andere gebruikers na te bootsen. Een dergelijke opstelling is afhankelijk van een juiste besturingssysteem-luidsprekerconfiguratie, daarom wordt hier een test gedaan. </p> <p> Onderstaande grafiek toont de positie van <font color="red">jou</ font>, <font color="yellow">luidsprekers</font> en <font color="green">bewegende geluidsbron</font> van bovenaf gezien; dien je ook tussen de kanalen te horen bewegen. </font> Use headphones instead of speakers Hoofdtelefoon i.p.v. luidsprekers gebruiken <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> <p> Gefeliciteerd. Je bent klaar om te genieten van Mumble met een mooiere geluidservaring. </p> <p> Mumble wordt doorontwikkeld gericht op functionaliteit waar meeste gebruikers belang bij hebben. Daartoe ondersteunt Mumble delen van anonieme statistieken over je configuratie aan de ontwikkelaars. Statistieken zijn essentieel voor toekomstige ontwikkeling & voortbestaan. </p> Use headphones Hoofdtelefoon gebruiken This ignores the OS speaker configuration and configures the positioning for headphones instead. Configureert de hoofdtelefoon-positionering i.p.v. de besturingssysteem-geluidsinstellingen te gebruiken. Volume tuning Volumeafstemming Tuning microphone hardware volume to optimal settings. Microfoonvolumeoptimalisatie Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. Praat zachtjes, zoals je 's avonds laat praat en niet wilt storen. Pas onderstaande schuifbalk aan zodat de balk in het groen beweegt als je praat en blauw als je stil blijft. Voice Activity Detection Stemherkenningactiviteit Letting Mumble figure out when you're talking and when you're silent. Laat Mumble uitzoeken of je praat/wanneer je stil bent. This will help Mumble figure out when you are talking. The first step is selecting which data value to use. Helpt gegevenswaarden bepalen. Raw amplitude from input Invoeramplitude Signal-To-Noise ratio Signaal-ruisverhouding Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Je moet nu volgende schuifjes verschuiven. Eerste paar uitingen die je doet moeten in de groene zone eindigen (vastgestelde spraak). Tijdens praten, moet het geel blijven (mogelijke spraak) en als je niet praat; rood blijven (nooit spraak). Device tuning Apparaatafstemming Changing hardware output delays to their minimum value. Hardware-uitgang vertragingen naar minimum-waarde zetten. Submit anonymous statistics to the Mumble project Statistieken met Mumble-project delen (anoniem) Push To Talk: Druk om te Praten: Quality & Notifications Kwaliteit & Notificaties Adjust quality and notification settings. Kwaliteit- en meldingsinstellingen aanpassen. Quality settings Kwaliteitsinstellingen Low Laag Balanced Gebalanceerd Notification settings Meldingsinstellingen Use Text-To-Speech to read notifications and messages to you. Tekst-naar-Spraak melding-&berichten laten voorlezen. Disable Text-To-Speech and use sounds instead. Gebruik geluiden in plaats van Tekst-naar-Spraak. %1 ms %1 ms Enables attenuation of other applications while users talk to you Andere applicaties afzwakken terwijl anderen tegen je praten. Attenuate applications while other users talk Applicatie-afzwakking terwijl andere gebruikers praten. High Hoog Custom Aangepast You already set a customized quality configuration in Mumble. Select this setting to keep it. Je hebt al een aangepaste Mumble-kwaliteitsconfiguratie ingesteld. Selecteer deze instelling om te behouden. Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. Andere applicatie-afzwakking terwijl anderen praten. Betekent dat terwijl iemand tegen je praat: geluid van andere applicaties (zoals geluidsspelers) verzwakt worden (zodat je ze helderder kunt waarnemen). Apply some high contrast optimizations for visually impaired users Hoogcontrast optimalisatie voor visueel beperkten toepassen. Use high contrast graphics Grafisch hoogcontrast gebruiken Keep custom Text-To-Speech settings. Aangepaste Tekst-naar-Spraak-instellingen behouden. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode <p> Open je geluidsconfiguratiescherm en ga naar de opname-instellingen. Zorg ervoor dat de microfoon als actieve invoer is geselecteerd met maximumopnamevolume. Indien 'Microfoonversterking" instelbaar is; activeer. </p> <p> Luid spreken, zoals zijnde geïrriteerd/opgewonden. Verlaag geluidsconfiguratieschermvolume totdat de balk zo hoog mogelijk in het lege en gestreepte blijft, en <b>niet</b> in het kriskras-doorkruiste gebied komt terwijl je spreekt. </p> Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode Praat zachtjes, zoals je 's avonds laat praat en niet wilt storen. Pas onderstaande schuifbalk aan zodat de balk in de lege zone beweegt als je praat en in het gestreepte blijft als je stil blijft. Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode Je moet nu volgende schuifjes verschuiven. Eerste paar uitingen die je doet moeten in in het lege gebied eindigen (vastgestelde spraak). Tijdens praten, moet je in het gestreepte blijven (mogelijke spraak) en als je niet praat; moet alles in het kriskras-doorkruiste blijven (nooit spraak). In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) In deze configuratie gebruikt Mumble een <b>lage bandbreedtehoeveelheid </b> resulteert in hoge latentie/slechte kwaliteit. Als je verbinding geen andere instellingen aankan; kies dit. (16kbit/s, 60ms per pakketje) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) Dit is de <b>aanbevolen standaard</b> configuratie. Het voorziet in zekere kwaliteitsbalans (tussen latentie en bandbreedtegebruik). (40kbit/s, 20ms per pakketje). This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) Deze configuratie wordt aanbevolen als bandbreedte geen probleem is, zoals in een lokaal netwerk. Het biedt een door Mumble ondersteunde lage latentie i.c.m. een <b>hoge kwaliteit</b>. (72kbit/s, 10ms per pakketje). BanEditor Mumble - Edit Bans Mumble - Bans bewerken &Address &Adres &Mask &Masker Reason Reden Start Start End Eind User Gebruiker Hash Kenmerk &Add &Toevoegen &Update &Bijwerken &Remove &Verwijderen Ban List Banlijst Search field Zoekveld This is the search field. Use it to find bans that have this username set in the username field. Dit is het zoekveld. Gebruik het om bans te vinden van de gebruikersnaam omgesomd in het gebruikersnaamveld. Who are you looking for? Wie zoek je? No nickname Geen bijnaam IP address IP-Adres No IP address Geen IP-adres Reason for the ban Reden voor de ban No reason Geen reden Ban end date Ban-einddatum Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). Ban's einddatum. Als je eenzelfde datum bij start en einde opgeeft is het permanent. Certificate hash Certificaatkenmerk No certificate hash Geen certificaatkenmerk Banned users Verbannen gebruikers This is a list with banned users. Lijst met verbannen gebruikers. Use this button if you want to add a new ban. Deze knop gebruiken als je nieuwe ban wilt toevoegen. Use this button if you want to update ban information. Deze knop gebruiken om ban-informaties bij te werken. Use this button if you want to remove user from the ban list. Deze knop handig is handig voor gebruikerontbanning. Clear all fields Alle velden wissen This button clears all fields. Use it if you want to add a new ban. Deze knop wist alle veldjes. (Als je ban wilt toevoegen.) Clear Wissen Ban List - %n Ban(s) Banlijst - %n BanBanlijst - %n Ban(s) CertView Name Naam Email E-mailadres Issuer Uitdeler Expiry Date Verloopdatum (none) (geen) Self-signed Zelfondertekend CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. Kon e-mailadres niet valideren.<br />Typ een geldig (of geen) e-mailadres om verder te gaan. There was an error generating your certificate.<br />Please try again. Er was een fout bij het genereren van jouw certificaat.<br />Graag opnieuw proberen. Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. Jouw certificaat en sleutel zijn niet ëxporteerbaar naar een PKCS#12 bestand. Mogelijkerwijs een certificaatfout. The file could not be opened for writing. Please use another file. Bestand kon niet bewerkt worden; graag een andere gebruiken! The file's permissions could not be set. No certificate and key has been written. Please use another file. Bestandsrechten werden niet gezet. Geen certificaat of sleutel weggeschreven; svp. ander bestand gebruiken! The file could not be written successfully. Please use another file. Bestand niet weggeschreven. Graag een andere gebruiken! The file could not be opened for reading. Please use another file. Bestand werd niet gelezen; graag een ander bestandje gebruiken! The file is empty or could not be read. Please use another file. Leeg bestand of onleesbaar; ander bestand gebruiken! The file did not contain a valid certificate and key. Please use another file. Bestand zonder goed certificaat/sleutel. Niet mogelijk... Select file to export certificate to Selecteer bestand om certificaat naartoe te exporteren Select file to import certificate from Selecteer bestand om het certificaat vanuit te importen Unable to import. Missing password or incompatible file type. Importeren mislukt. Wachtwoord of compatibel bestandstype ontbreekt. <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. <b>Certificaat verloopt:</b>Je certificaat gaat bijna verlopen. Je moet het vernieuwen of je kan niet meer verbinden met servers waarop je geregistreerd bent. Certificates Certificate Management Certificaatbeheer Certificate Authentication Certificaatauthenticatie Authenticating to servers without using passwords Authenticeren zónder wachtwoord-gebruik bij servers. Current certificate Huidig certificaat This is the certificate Mumble currently uses. Dit is het certificaat momenteel ingebruik door Mumble. Current Certificate Huidige certificaat Create a new certificate Nieuw certificaat creëren This will create a new certificate. Dit creëert een nieuw certificaat. Import certificate from file Certificaat uit bestand importeren This will import a certificate from file. Dit importeert een certificaat uit bestand Import a certificate Een certificaat importeren Export Certificate Certificaat exporteren This will export a certificate to file. Exporteert certificaat naar bestand Export current certificate Huidig certificaat exporteren Import Certificate Certificaat importeren PKCS #12 Certificate import PKCS #12 Certificaat importeren <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble kan certificaten opgeslagen in PKCS #12 indeling (Mumble-sleutelexportatie-indeling, alsmede Firefox, Internet Explorer, Opera, etc) (importeren).</p><p>Als het bestand met wachtwoord versleuteld is, heb je die nodig om het certificaat te importeren.</p> Import from Importeren uit Filename to import from Bestandsnaam uit te importeren This is the filename you wish to import a certificate from. Certificaatbestandsnaam waarvanuit je zal importeren. Select file to import from Vanuit te importeren bestand selecteren This opens a file selection dialog to choose a file to import a certificate from. Opent bestandsselectievenster vanwaaruit certificaatbestand kan worden geïmporteerd. Open... Openen... Password Wachtwoord Password for PKCS#12 file Wachtwoord voor PKCS#12-bestand This is the password for the PKCS#12 file containing your certificate. Certificaat-wachtwoord van PKCS#12-bestand. Certificate to import Te importeren certificaat This is the certificate you are importing. Certificaat wat je importeert. Certificate Details Certificaatdetails Replace Certificate Certificaat vervangen Replace existing certificate with new certificate? Bestaand certificaat met nieuwe certificaat vervangen? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> <p>Je hebt al een certificaat in Mumble opgeslagen, en staat op het punt om het te vervangen.</p> <p>Als jij upgradet naar door betrouwbare certificaatautoriteit afgegeven certificaat waarvan jouw e-mailadressen overeenkomen met jouw certificaat, is dat volkomen veilig & servers waarmee je verbindt herkennen automatisch het sterke certificaat aan jouw e-mailadres. </p> <p>Als dit niet het geval is, wordt je niet langer herkend door eerdere servers. Als je nergens geregistreerd was is er niets om je druk over te maken. </p> <p> Zeker dat je jouw certificaat wilt vervangen? </p> This is the certificate Mumble currently uses. It will be replaced. Door Mumble ingebruike certificaat; wordt vervangen... New certificate Nieuw certificaat This is the new certificate that will replace the old one. Nieuwe certificaat dat het oude vervangt. New Certificate Nieuw certificaat Make a backup of your certificate Reservekopie van certificaat maken Export to Exporteren naar Filename to export to Bestandsnaam naar te exporteren This is the filename you wish to export a certificate to. Certificaatbestandsnaam waarnaar je gaat exporteren. Save As... Opslaan als... This is the certificate Mumble currently uses. It will be exported. Ingebruike-Mumble-certificaat; dat wordt geëxporteerd. Generate a new certificate for strong authentication Nieuwe certificaat voor sterke authenticatie genereren. <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> <p>Mumble gaat nu een sterk Mumble-certificaat genereren.</p><p>Als je wilt, kun je extra in het certificaat op te slane informatie opgeven, ter voorgelegging aan servers als je verbindt. Mits je een geldig e-mailadres opgeeft, kun je op een later moment upgraden naar een door certificaatautoriteit uitgegeven e-Certificaat welke in sterke identificatie voorziet. </ P> Name Naam Email E-mail Your email address (e.g. johndoe@mumble.info) Jouw e-mailadres (bijv. johndoe@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. Jouw e-mailadres. Sterk aanbevolen om een geldig e-mailadres op te geven, om te kunnen upgraden naar een sterk certificaat zonder authenticatieproblemen. Your name (e.g. John Doe) Jouw naam (bijv. John Doe) This is your name, and will be filled out in the certificate. This field is entirely optional. Jouw naam (gekoppeld aan certificaat; optioneel veld!). Finish Voltooien Certificate-based authentication is ready for use Certificaatgebaseerde-authenticatie klaar voor gebruik. Enjoy using Mumble with strong authentication. Geniet van Mumble met sterke authenticatie. Automatic certificate creation Automatische certificaatcreatie <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>Mocht je je certificaat verliezen; bijv. als hardware faalt of je jouw machine opnieuw installeert; kun je jou niet (meer) authenticeren op waarop je geregistreerd bent. Daarom <b>nodig</b> dat je een reservekopie van je certificaat maakt. Wij raden je aan de reservekopie op opslagmedium (zoals USB-stick) op te slaan.</p> <p>Dit bestand wordt niet versleuteld, en als iemand toegang ertoe krijgt, kunnen ze doen alsof ze jou zijn; zorg er goed voor.</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> <p>Mumble kan certificaten gebruiken om met servers te authenticeren. Door certificaten te gebruiken vermijd je wachtwoord op te geven aan de externe locatie. Het zorgt ook voor doodsimpele gebruikersregistratie en een client-kant vriendenlijst onafhankelijk van servers.</p><p>Hoewel Mumble ook zonder certificaten kan werken, verlangen de meeste servers dat je er een hebt.</p><p>Een nieuw certificaat is in de meeste gevallen automatisch geschikt. Maar Mumble ondersteunt ook certificaten die vertrouwen baseren op eigendom van een e-mailadres. Deze certificaten worden uitgegeven door derden. Voor meer informatie zie onze <a href=http://mumble.info/certificate.php>gebruikercertificaatdocumentatie.</a></p> ChanACL None Geen Traverse Doorkruisen Enter Toetreden Speak Spreken Mute/Deafen Dempen/Doven Make channel Kanaal maken Make temporary Tijdelijk maken Link channel Kanaal koppelen This represents no privileges. Geen machtigingen. This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. Volledige toegang tot kanaal, inclusief recht om groep- en ACL-informatie te wijzigen. Deze machtiging impliceert alle andere machtigingen. This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. Toestemming om kanaal te doorkruisen. Als gebruiker wordt geweigerd, wordt in ieder (↳)-kanaal doorgang onmogelijk (andere ↳-kanaal-rechten onafhankelijk). This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. Toestemming kanaal toe te treden. Met hiërarchische kanaalstructuur hebt wil je misschien iedereen laten doorkruisen en toetreden beperken tot hiërarchie-stam. This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. Toestemming om in kanaal te spreken. Gebruikers zonder dit recht worden onderdrukt door server (zijnde gedempt); kunnen niet spreken totdat demping wordt opgeheven door bevoegde. This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. Toestemming te fluisteren → kanaal (van buitenaf). Werkt net als het <i>spreken</a>-recht, maar geldt voor Fluisteren-toets ingedrukt. Kan dienen om te zenden naar kanaalhiërarchie zonder te koppelen. This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. Toestemming om anderen te dempen/doven. Eenmaal gedempt, blijft gedempt tot ontdempt door bevoegde of totdat gebruikers opnieuw met server verbinden. This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. Toestemming om gebruikers naar andere kanalen te verplaatsen of (permanent weg) te schoppen. Om gebruikers te verplaatsen; vereist dat verplaatsende: Verplaatsen-recht heeft (bestemmingkanaal) of gebruiker moet toetreden-kanaalrecht hebben. Gebruikers met dit recht kunnen gebruikers verplaatsen naar kanalen waarin gebruiker (normaal) niet toe mag toetreden. This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. Toestemming om ↳-kanalen te creëren. Gebruikers die ↳-kanalen creëren komen in de beheerdersgroep van desbetreffende ↳-kanalen. This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. Toestemming tijdelijke ↳-kanalen te creëren. Sub-kanaal creërende gebruikers worden toegevoegd aan de beheerdersgroep van een nieuw ↳-kanaal. Tijdelijke kanalen verdwijnen wanneer laatste gebruiker verlaat. This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. Toestemming om kanalen te koppelen. Gebruikers van gekoppelde kanalen horen elkaar, zolang sprekende gebruiker het <i>spreken</i>-recht in kanaal van de luisteraar heeft. Je moet het koppelingsrecht in beide kanalen hebben om een koppeling te creëren, en slechts in een enkel kanaal om te ontkoppelen. This represents the permission to write text messages to other users in this channel. Toestemming tekstberichten naar andere kanaalgebruikers te schrijven. This represents the permission to forcibly remove users from the server. Het recht om bepaalde gebruikers uit server te gooien. This represents the permission to permanently remove users from the server. Het recht gebruikers op server te bannen. This represents the permission to register and unregister users on the server. Toestemming om gebruikers te (ont)registreren (server). This represents the permission to register oneself on the server. Recht dat iemand zichzelf zelf op server kan registeren. Whisper Fluisteren Move Verplaatsen Text message Tekstbericht Kick Schoppen Ban Bannen Register User Gebruiker registreren Register Self Jezelf registeren Write ACL ACL's schrijven ChatbarTextEdit Paste and &Send Paste and send Plakken en &Verzenden <center>Type chat message here</center> <center>Schrijf chatbericht hier</center> ClientUser Friend Vriend Authenticated Geauthenticeerd Priority speaker Prioriteitsspreker Recording Aan het opnemen Muted (server) Gedempt (server) Deafened (server) Gedoofd (server) Local Ignore (Text messages) Lokaal negeren (Tekstberichten) Local Mute Lokaal dempen Muted (self) Gedempt (zelf) Deafened (self) Gedoofd (zelf) ConfigDialog Accept changes Wijzigingen accepteren This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. Knop past huidige instellingen toe en keert terug naar de applicatie. <br />Instellingen worden opgeslagen zodra je de applicatie afsluit. Reject changes Veranderingen weigeren This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. Knop weigert alle wijzigingen en keert daarna terug naar de applicatie.<br />Instellingen worden als vanouds teruggezet. Apply changes Wijzigingen toepassen This button will immediately apply all changes. Knop past alle wijzigingen toe. Undo changes for current page Wijzigingen ongedaan maken (huidige pagina). This button will revert any changes done on the current page to the most recent applied settings. Knop maakt eventuele wijzigingen op huidige pagina ongedaan en zet laatst toegepaste instellingen terug. Restore defaults for current page Herstel naar standaardwaarden (huidige pagina) This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. Knop herstelt standaardwaarden. Andere pagina's blijven ongewijzigd.<br />Om alle instellingen naar standaardwaarden te herstellen, moet je de knop op elke pagina gebruiken. Mumble Configuration Mumble-configuratie ConnectDialog Connecting to %1 Verbinden met %1 Enter username Typ gebruikersnaam Adding host %1 Host %1 aan het toevoegen Servername Servernaam Hostname Hostnaam Bonjour name Bonjour-naam Port Poort Addresses Adressen Website Website Packet loss Pakketverlies Ping (80%) Ping (80%) %1 ms %1 ms Ping (95%) Ping (95%) Bandwidth Bandbreedte %1 kbit/s %1 kbit/s &Connect &Verbinden &Filters &Filters Unknown Users Gebruikers Version Versie Failed to fetch server list Serverlijst ophalen mislukt Mumble Server Connect Mumble Server verbinden Ping Ping Remove from Favorites Uit favorieten verwijderen Add custom server Aangepaste server toevoegen Show all servers that respond to ping Op ping reagerende servers tonen Show all servers with users Servers met gebruikers tonen Show all servers Alle servers tonen &Copy &Kopiëren Copy favorite link to clipboard Favoriete koppeling naar klembord kopiëren &Paste &Plakken Paste favorite from clipboard Favoriete uit klembord plakken &Edit... &Bewerken... &Add New... &Toevoegen Add to &Favorites Aan &favorieten toevoegen Open &Webpage &Webpagina openen Show &Reachable &Bereikbaren tonen Show &Populated &Gebruikers tonen Show &All &Alles tonen ConnectDialogEdit Edit Server Server bewerken Name of the server Servernaam A&ddress &Adres Internet address of the server. Internet address of the server. Internetadres (server). <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Adres</b><br/> Internetadres van server zijnde normale hostnaam, IPv4/IPv6-adres of Bonjour-service-ID. Bonjour-service-ID's beginnen verplicht met een @. &Port &Poort Port on which the server is listening Poort waarnaar server luistert. <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. <b>Port</b><br/> Poort waarnaar server luistert. Als server d.m.v. een Bonjour-service-id wordt geïdentificeerd telt het niet mee. &Username &Gebruikersnaam Username to send to the server Naar server te verzenden gebruikersnaam <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. <b>Gebruikersnaam</b><br/> Gebruikersnaam om naar server te verzenden. De server kan beperkingen opleggen over gebruikersnaam-naamgeving of namen kunnen reeds bezet zijn. Label Naam Add Server Server toevoegen You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 Je bent momenteel verbonden met een server. Wil je het dialoog met de verbindingsgegevens van deze server vullen? Host: %1 Poort: %2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 Je hebt een webadres op plakbord. Wil je het dialoog vullen met deze gegevens? Host: %1 Poort: %2 Password Wachtwoord Password to send to the server Naar server te verzenden wachtwoord <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. <b>Wachtwoord</b><br/> Wachtwoord om naar server te verzenden bij verbinden. Dit wachtwoord is nodig bij verbinden als <i>SuperUser</in> of mits server wachtwoord vereist. Indien wachtwoord hier niet wordt ingevoerd wordt er om gevraagd bij verbinden. Show password Wachtwoord tonen <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. <b>Naam</b><br/> Naam van server. Zelfgekozen naam van server die in serverlijst wordt weergegeven. Local server label Lokale servernaam 127.0.0.1 127.0.0.1 64738 64738 Your username Jouw gebruikersnaam Your password Jouw wachtwoord &Fill &Vullen CoreAudioSystem Default Device Standaardapparaat CrashReporter Mumble Crash Report Mumble-crashrapport <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> <p><b>Het spijt ons want blijkbaar is Mumble gecrasht. Wilt u een crashrapport met de Mumble ontwikkelaars delen?</b></p><p>De crashrapportage bevat een gedeeltelijke kopie van Mumble's geheugen op het moment van de crash, en helpt ontwikkelaars om het probleem te verhelpen. </p> Email address (optional) E-mailadres (optioneel) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash Beschrijf kort (Engels): wat je deed op moment van crashen. Send Report Rapportage verzenden Don't send report Geen rapport verzenden Crash upload successful Crash uploaden succesvol Thank you for helping make Mumble better! Dank voor hulp om Mumble voortdurend te verbeteren! Crash upload failed Crash uploaden mislukt We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. Crashupload mislukt (fout %1 %2). Informeer een ontwikkelaar. This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 Er zit een bug in crash-melden; we faalden om het rapport te uploaden. Informeer een ontwikkelaar over fout %1. Uploading crash report Crashrapport aan het uploaden Abort upload Uploaden afbreken DXAudioInput Default DirectSound Voice Input Standaard DirectSound-invoer Opening chosen DirectSound Input device failed. No microphone capture will be done. Openen gekozen DirectSound-invoerapparaat mislukt. Geen microfoonopname vindt plaats. Opening chosen DirectSound Input failed. Default device will be used. Openen gekozen DirectSound-invoer mislukt. Standaardapparaat wordt gebruikt. Lost DirectSound input device. Verloren DirectSound-invoerapparaat. DXAudioOutput Default DirectSound Voice Output Standaard DirectSound-uitvoer. Opening chosen DirectSound Output failed. Default device will be used. Openen gekozen DirectSound-uitvoer mislukt. Standaardapparaat wordt gebruikt. Lost DirectSound output device. Verloren DirectSound-uitvoerapparaat. Opening chosen DirectSound Output failed. No audio will be heard. Gekozen DirectSound-uitvoer openen mislukt. Geen geluid wordt gehoord. Database Mumble failed to initialize a database in any of the possible locations. Mumble-database initialiseren van alle locaties mislukt. The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. Database '%1' is alleen-lezen. Mumble slaat o.a. SSL-certificaten niet op tot je het probleem oplost. DeveloperConsole Developer Console Ontwikkelaarsconsole DockTitleBar Drag here Hiernaartoe slepen GlobalShortcut Shortcuts Sneltoetsen List of configured shortcuts Geconfigureerde sneltoetsenlijst Function Functie Data Gegevens Shortcut Sneltoets Suppress Ondrukken Add new shortcut Nieuwe sneltoets toevoegen This will add a new global shortcut Voegt nieuwe sneltoets toe &Add &Toevoegen Remove selected shortcut Geselecteerde sneltoets verwijderen This will permanently remove a selected shortcut. Verwijdert geselecteerde sneltoets. &Remove &Verwijderen <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> <html><body><p>Mumble kan louter van muisknoppen & speciale toetsenbord toetsen (Alt, Ctrl, Cmd, enz.) voor globale sneltoetsen gebruikmaken.</p><p>Voor meer flexibiliteit, kun je <span style=" font-style:italic;">Toegang voor hulpapparaten</span> in Toegankelijkheidscentrum van systeem instellen. Wijzigingen laat schadelijke programma's lezen wat getypt wordt op uw toetsenbord.</p></body></html> Open Accessibility Preferences Toegankelijkheidscentrum openen Skip Overslaan Enable Global Shortcuts Globale sneltoetsen gebruiken <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. <b>Extra snelkoppelingsverwerkers</b><br />Deze sectie laat je het gebruik van extra GlobalShortcut-verwerkingen configureren. Additional Shortcut Engines Extra snelkoppelingsverwerkers <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. <b>Installeer Windows-hooks<b>.<br />Dit schakelt de Windows-hooks snelkoppelingsverwerking in. Deze verwerking gebruiken laat Mumble toetsindrukken of muisklikjes onderdrukken. Enable Windows hooks Windows-hooks inschakelen <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. <b>GKey inschakelen</b>.<br />Deze instelling schakelt de ondersteuning voor de GKey-snelkoppelingsverwerking in, voor "G"-knoppen die zich op Logitech-toetsenborden bevinden. Enable GKey GKey inschakelen <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. <b>XInput inschakelen</b><br />Deze instelling schakelt de ondersteuning voor de XInput-snelkoppelingsverwerking in, voor Xbox-compatibele controllers. Enable XInput Activeer XInput <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. <b>Snelkoppelingen in toegestane applicaties inschakelen</b>.<br />Ook bekend als "UIAccess". Hierdoor ontvangt Mumble globale snelkoppelingsgebeurtenissen uit programma's die draaien onder hoge privilege-niveau's, zoals een Beheer Commando Prompt of oudere spellen die draaien met beheerprivileges. <br /><br /> Zonder deze optie ingeschakeld, werken Mumble's globale snelkoppelingen niet vanuit toegestane applicaties. Dit lijkt inconsistent, want bijvoorbeeld, als de Druk om te Praten-knop is ingedrukt in een niet-toegestaan programma, maar los is gelaten in een toegestaan programma, dan neemt Mumble niet waar dat de knop is losgelaten en blijf je praten totdat je weer Druk-om-te-Praten indrukt. Enable shortcuts in privileged applications Snelkoppelingen in toegestane applicaties inschakelen GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> <html><body><p>Mumble slechts muisknoppen en speciale toetsenbord-toetsen gebruiken (Alt, Ctrl, Cmd, etc.) voor globale sneltoetsen.</p><p>Als je meer flexibiliteit vereist, stel Mumble als een vertrouwd toegankelijkheidsprogramma onder Beveiliging & Privacy sectie van je Mac's systeeminstellingen in.</p><p>Beveiliging & Privacy voorkeurspaneel → Privacy-tab → Toegankelijkheid onder linksaan in lijst is waar je Mumble toevoegt.</body></html> Shortcuts Sneltoetsen Shortcut button combination. Sneltoets-combinatie <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. <b>Dit is de globale sneltoets-combinatie.</b><br />Klik dit veld en druk vervolgens op de gewenste te binden toets/knop-combi. Dubbelklik om te wissen. Suppress keys from other applications Toetsen onderdrukken (andere applicaties). <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. <b>Neemt andere applicatie-indrukken weg.</b><br />Toetsdrukken (of laatste toets van een meerdere-knoppen-combi) van andere applicaties. Niet alle knoppen worden genegeerd. GlobalShortcutTarget Whisper Target Fluisterdoel Whisper to list of Users Fluister naar gebruikerslijst Channel Target Doelkanaal Restrict to Group Beperkt (tot groep) If specified, only members of this group will receive the whisper. Zo, kunnen louter groepsleden je gefluister ontvangen. List of users Gebruikerslijst Add Toevoegen Remove Verwijderen Modifiers Veranderingsfactoren Do not send positional audio information when using this whisper shortcut. Geen positioneel geluid bij fluistertoetsgebruik zenden. Ignore positional audio Positioneel geluid negeren Shout to Linked channels Naar gekoppelde kanalen schreeuwen Shout to subchannels Naar sub-kanalen schreeuwen Shout to Channel Naar kanaal schreeuwen The whisper will also be transmitted to linked channels. Fluister zendt ook naar gekoppelde kanalen. The whisper will also be sent to the subchannels of the channel target. Fluister zendt naar de ↳-kanalen van jouw doelkanaal. GlobalShortcutX Mouse %1 Muis %1 JackAudioSystem Hardware Ports Mono Stereo LCD Not connected Niet verbonden LCDConfig Enable this device Apparaat activeren LCD LCD Devices Apparaten Name Naam <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> <p>Lijst met beschikbare LCD-apparaten op je systeem. Bevat apparatennamen, maar ook schermgrootten. Mumble ondersteunt uitvoer naar meerdere LCD-apparaten gelijkertijd.</p> <h3>Afmetingen:</h3> <p> Veld beschrijft LCD-apparaatgrootte aangeduid in pixels (voor Grafische LCD's) of in letters (voor Karakter LCD's).</p> <h3>Ingeschakeld:</h3> <p> Bepaalt of Mumble moeten presenteren op LCD-apparaat.</p> Size Formaat Enabled Aan Views Lijsten Minimum Column Width Minimale kolombreedte <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> <p>Min. gebruikerslijstkolombreedte.</p> <p>Als te( )veel mensen tegelijk spreken, splitst gebruikerslijst in kolommen. Optie dient als compromis tussen aantal op LCD-scherm te tonen gebruikers / namen (breedte).</p> This setting decides the width of column splitter. Deze instelling bepaalt de breedte bij een kolomsplitsing. Splitter Width Splitsbreedte Log Debug Fouten opsporen Critical Kritiek Warning Waarschuwing Information Informatie Server Connected Server verbonden Server Disconnected Server ontbonden Other self-muted/deafened Andere zelf-gedempten/gedoofden. Permission Denied Geen toestemming Text Message Tekstbericht User Joined Server Gebruiker kwam in server User Left Server Gebruiker verliet server User recording state changed Gebruikers' opnamestatus veranderde User kicked (you or by you) Gebruiker geschopt (jij of door jou) User kicked Gebruiker geschopt You self-muted Je dempte jezelf User muted (you) Gebruiker gedempt (jij) User muted (by you) Gebruiker gedempt (door jou) User muted (other) Gebruiker gedempt (andere) User Joined Channel Gebruiker kwam in kanaal User Left Channel Gebruiker verliet kanaal You self-unmuted Je hief jezelf dempen op You self-deafened Je doofde jezelf You self-undeafened Je ontdoofde jezelf User renamed Gebruiker hernoemd You Joined Channel Je ging het kanaal binnen You Joined Channel (moved) Je ging het kanaal binnen (verplaatst) User connected and entered channel User left channel and disconnected Private text message the server de server [[ Invalid size ]] [[ ongeldige groote ]] [[ Text object too large to display ]] [[ Tekstobject te groot om te tonen ]] [Date changed to %1] [Datum naar %1 veranderd] link to %1 koppel aan %1 FTP link to %1 FTP-koppeling naar %1 player link spelerkoppeling channel link kanaalkoppeling %1 link %1 koppeling LogConfig Toggle console for %1 events Log bij %1-gebeurtenissen tonen Toggle pop-up notifications for %1 events Meldingen bij %1-gebeurtenissen tonen Toggle Text-To-Speech for %1 events Tekst-naar-Spraak bij %1-gebeurtenissen tonen Click here to toggle sound notification for %1 events Geluidsmeldingen geven voor %1 gebeurtenissen Toggle window highlight (if not active) for %1 events Venstermarkering wisselen (vermits inactief) bij %1 gebeurtenissen Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change Pad naar geluidsmeldingen-bestand in geval van %1 gebeurtenissen<br />Enkele klik → afspelen<br />Dubbelklik → veranderen Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. Klik hier voor console-uitvoer bij %1 gebeurtenissen.<br />Aangevinkt spuugt Mumble alle %1 gebeurtenissen uit in bijbehorend log. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. Klik hier om venstermeldingen voor %1 gebeurtenissen te tonen.<br />Aangevinkt wordt een meldingsvenster voor alle %1-gebeurtenissen door Mumble getoond. Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. Klik hier om venstermarkering te wisselen bij %1 gebeurtenissen. Indien aangevinkt, wordt Mumble's venster gemarkeerd bij elke %1 gebeurtenis, vermits inactief. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. Pad naar geluidsmelding-geluidsbestand in geval van %1 gebeurtenissen.<br />Enkele klik → afspelen<br />Dubbelklik → veranderen<br />Bevestig dat gebeurtenis-geluidsmelden aanstaat anders heeft dit geen effect. Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. Klik hier voor Tekst-naar-Spraak bij %1 gebeurtenissen.<br />Aangevinkt gebruikt Mumble Tekst-naar-Spraak om %1 gebeurtenissen voor te lezen. Tekst-naar-Spraak kan ook gebeurtenisinhoud lezen, i.t.t. geluidsbestanden. T-n-S / geluidsbestanden kunnen niet tegelijkertijd gebruikt worden. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. Klik hier om geluidsmeldingen voor %1 gebeurtenissen te tonen.<br />Aangevinkt gebruikt Mumble het door u aangeven geluidsbestand voor %1-gebeurtenissen. Geluidsbestanden / T-n-S kunnen niet tegelijk gebruikt. Messages Berichten Message Bericht Console Log Notification Melding Text-To-Speech Tekst-naar-Spraak Soundfile Geluidsbestand Path Pad Text To Speech Tekst naar Spraak Volume Volume Volume of Text-To-Speech Engine Volume van Tekst-naar-Spraak <b>This is the volume used for the speech synthesis.</b> <b>Volume voor spraaksynthese.</b> Length threshold Drempellengte Message length threshold for Text-To-Speech Engine Drempel voor Tekst-naar-Spraak <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. <b>Drempellengte voor Tekst-naar-Spraak.</b><br />Berichten voorbij limiet worden niet voluit voorgelezen. Characters Karakters Whisper Fluisteren If checked you will only hear whispers from users you added to your friend list. Aangevinkt hoor je alleen gefluister van vrienden die je in hun vriendenlijst hebben. Only accept whispers from friends Gefluister louter van je vrienden accepteren. If enabled text messages you send will be read back to you with TTS Geactiveerd worden tekstberichten die je verzendt terug naar je voorgelezen met Tekst-naar-Spraak. Read back own messages Eigen berichten terug voorlezen Chat Log Chatgeschiedenis Maximum chat length Maximale chatlengte Unlimited Ongelimiteerd Lines Lijnen Highlight Markeren LookConfig System default Standaardinstelling None Geen Only with users Slechts met gebruikers All Alle Ask Vragen Do Nothing Niets doen Move Verplaatsen <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory <a href="%1">Bladeren</a> User Interface Gebruikersinterface This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. Bepaalt welke kanalen automatisch moeten (uit)vouwen. <I>Géén</i> en <i>Alle</i> vouwt geen of alle kanalen uit, terwijl de <i>Slechts met gebruikers</i> kanalen uit- en samenvouwt als gebruikers toetreden en verlaten. List users above subchannels (requires restart). Gebruikers bóven sub-kanalen tonen (opnieuw starten nodig). <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. <b>Zo dien gebruikers ↑ ↳-kanalen in lijst tonen. </b><br />Mumble herstarten om verandering te zien. Users above Channels Gebruikers boven kanalen <b>If set, will verify you want to quit if connected.</b> <b>Ingesteld, wordt om bevestiging gevraagd of je wilt afsluiten terwijl nog verbonden.</b> Show number of users in each channel Kanaalgebruikersaantal tonen Show channel user count Gebruikersaantal (kanaal) tonen Language Taal Language to use (requires restart) Taalinstelling (herstart vereist) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. <b>Bepaalt welke taal Mumble moet gebruiken.</b><br />Je moet Mumble herstarten voor taalwisseling. Look and Feel Sfeer & stijl Layout Uiterlijk Classic Klassiek Stacked Gestapeld Hybrid Gemengd Custom Aangepast This changes the behavior when moving channels. Verandert kanaalverplaatsingsgedrag. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. Bepaalt gedrag van kanaalslepen; kan onbedoeld slepen voorkomen. <i>Verplaatsen</i> verplaatst kanaal zonder te vragen. <i>Niets doen</i> doet niets (toont foutmelding). <i>Vragen</i> gebruikt berichtvenster om kanaalverplaatsing te bevestigen. Expand Uitvouwen When to automatically expand channels Wanneer kanalen auto-uitvouwen Channel Dragging Kanalen slepen Ask whether to close or minimize when quitting Mumble. Vraag af te sluiten/minimaliseren indien Mumble afsluit. Ask on quit while connected Vraag bij afsluiten terwijl verbonden Always On Top Altijd vooraan <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> <b>Ingesteld → minimaliseren van Mumble = venster verbergen (louter toegankelijk vanuit systeemvak). Anders wordt geminimaliseerd (normaal venster).</b> Hide in tray when minimized In systeemvak verbergen indien wordt geminimaliseerd Hide the main Mumble window in the tray when it is minimized. Verberg Mumble in systeemvak (mits geminimaliseerd). This setting controls when the application will be always on top. Dit bepaalt wanneer het Mumble-venster vooraan blijft. Never Nooit Always Altijd In minimal view In minimalistisch venster In normal view In normaal venster Displays talking status in system tray Praatstatus in systeemvak tonen Show talking status in tray icon Praatstatusicoontje in systeemvak tonen This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. Instelling bepaalt in welke situaties de applicatie altijd vooraan blijft. Als je <i>Nooit</i> selecteert blijft de applicatie niet vooraan. <i>Altijd</i> houdt de applicatie altijd vooraan. <i>In minimale weergave</i> / <i>In normale weergave</i> houdt de applicatie vooraan ongeacht minimale weergave ge(de)activeerd. Show context menu in menu bar Contextmenu in menubalk tonen Apply some high contrast optimizations for visually impaired users Contrast optimalisaties toepassen (visueel beperkten). Optimize for high contrast Voor hoogcontrast optimaliseren Application Applicatie Adds user and channel context menus into the menu bar Voegt gebruiker- & kanaalcontext aan menubalkje toe. Tray Icon Systeemvak-icoontje Channel Tree Kanalenlijst Use selected item as the chat bar target Geselecteerd item als doel voor de chat-balk gebruiken. Filter automatically hides empty channels Automatisch filteren verbergt lege kanalen Show transmit mode dropdown in toolbar Zendmodus drop-down in werkbalk tonen Theme Thema Theme to use to style the user interface Thema om als stijl te gebruiken <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. <b>Configureert welk thema Mumble gestijld wordt.</b><br />Mumble leest thema's (bepaalde mappen) en toont ze in deze lijst. Welke je selecteert neemt Mumble als 'look' aan (kleuren, iconen en meer). User Dragging Gebruiker Slepen This changes the behavior when moving users. Verandert kanaalverplaatsingsgedrag. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. Dit zet het gedrag van gebruikerssleping; het kan gebruikt worden om per ongeluk slepen te voorkomen. <i>Verplaatsen</i>verplaatst de gebruiker zonder waarschuwing. <i>Doe Niets</i>doet niks en geeft een foutmelding weer. <i>Vragen</i>gebruikt een berichtvenster om te bevestigen of je de gebruiker echt wilt verplaatsen. <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. <b>Ontwikkelaarsmenu inschakelen</b><br />Dit schakelt het "Ontwikkelaars"-menu in Mumble in. Dit menu wordt gebruikt voor ontwikkelingsspecifieke functies, zoals console voor ontwikkelaars. Enable Developer menu Ontwikkelaarsmenu inschakelen When in custom layout mode, checking this disables rearranging. Wanneer in aangepaste lay-out-modus, schakelt inschakeling het herordenen uit. Lock layout Lay-out blokkeren MainWindow Root Stam Push-to-Talk Global Shortcut Druk-om-te-Praten: Push and hold this button to send voice. Global Shortcut Druk en knop ingedrukt houden om spreken te zenden. This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut Druk-om-te-Praten-knop - ingedrukt; verzend je spraak. Reset Audio Processor Global Shortcut Geluidsverwerking herstellen Unlink Plugin Global Shortcut Plug-in ontkoppelen Push-to-Mute Global Shortcut Druk-om-te-Dempen Join Channel Global Shortcut Toetreden tot kanaal Toggle Overlay Global Shortcut Overlay tonen Toggle state of in-game overlay. Global Shortcut In-game overlay tonen. Toggle Minimal Global Shortcut Minimalistisch venster Volume Up (+10%) Global Shortcut Volume omhoog (+10%) Volume Down (-10%) Global Shortcut Volume omlaag (-10%) Mumble Mumble Mumble -- %1 Mumble -- %1 &Window &Venster Minimize Minimaliseren Ctrl+M Ctrl+M Close Sluiten Mumble is currently connected to a server. Do you want to Close or Minimize it? Verbonden met een server - afsluiten of minimaliseren? Mute Self Global Shortcut Demp jezelf Set self-mute status. Global Shortcut Zelf-dempen status instellen. This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut Wisselt je dempen-status. Uitzetten ontdooft jezelf ook. Deafen Self Global Shortcut Demp jezelf Set self-deafen status. Global Shortcut Zelf-doven status instellen. This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut Dit wisselt je doven-status. Aanzetten dooft jezelf ook... Whisper/Shout Whisper Fluisteren/Schreeuwen <center>Not connected</center> Not connected <center>Niet verbonden</center> Clear Wissen Opening URL %1 Adreslink %1 aan het openen File does not exist Bestand bestaat niet. File is not a configuration file. Bestand geen configuratiebestand. Settings merged from file. Instellingen uit bestand samengevoegd. URL scheme is not 'mumble' URL-schema is niet 'mumble' This version of Mumble can't handle URLs for Mumble version %1.%2.%3 Mumble-versie kan URL's voor Mumble versie %1.%2.%3 niet aan Connecting to %1 Verbinden met %1 Enter username Typ gebruikersnaam Connecting to server %1. Verbinden met server %1. Reconnecting. Herverbindend. Transmit Mode set to Continuous Zendmodus staat op Continue <p>%1 (%2)<br />%3</p> <p>%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> <h2>Spraakkanaal</h2><p>Versleuteld met 128-bit OCB-AES128<br />%1 ms gemiddelde latentie (%4 afwijking)</p> Register yourself as %1 Jezelf (%1) registeren <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <p>Je staat op het punt om jezelf op de server te registreren. Deze actie kan niet ongedaan gemaakt worden, en je gebruikersnaam kan niet veranderen. Je wordt voor altijd bekend als '%1' op deze server.</p><p>Zeker registreren?</p> <h2>Version</h2><p>Protocol %1</p> <h2>Versie</h2><p>Protocol %1</p> <p>No build information or OS version available</p> <p>Geen bouwinformatie/BS-versie beschikbaar</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) Geauthenticeerd met %1 en versleuteld door %2 (sleuteluitwisselingsmechanisme (%3)) The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) Verbinding is versleuteld met %1 (%2 voor bericht-authenticatie en %3 (sleuteluitwisselingsmechanisme (%4))). The connection is secured by the cipher suite that OpenSSL identifies as %1 Verbinding is beveiligd door %1 <p>The connection provides perfect forward secrecy</p> <p>De verbinding voorziet in de doorgaande heimelijkheid.</p> <p>The connection does not provide perfect forward secrecy</p> <p>De verbinding voorziet geen (doorgaand) heimelijkheid</p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> <h2>Controlekanaal</h2><p>Verbinding gebruikt %1</p>%2%3<p>%4 ms gemiddelde latentie (%5 afwijking)</p><p>Host %6 (poort %7)</p> Voice channel is sent over control channel Spraak-kanaal wordt verzonden over het controle-kanaal Register user %1 Gebruiker %1 registreren <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> <p>Je staat op het punt om %1 te registreren op de server. Actie kan niet ongedaan worden gemaakt. De naam kan niet veranderen; zijnde een geregistreerde gebruiker; heeft %1 toegang (onafhankelijk van serverwachtwoord).</p><p>Hiernavolgend, wordt %1 geauthenticeerd met het in gebruike certificaat.</p><p>Zeker om %1 te registreren?</p> Kicking user %1 Gebruiker %1 wordt geschopt Banning user %1 Gebruiker %1 wordt verbannen View comment on user %1 %1's gebruikerscommentaar inzien Message to channel %1 Bericht naar kanaal %1 Connected. Verbonden. <li>Expected certificate digest (SHA-1): %1</li> <li>Verwachte certificaatsignatuur (SHA-1) %1</li> Server presented a certificate which failed verification. Server kreeg Ongeverifieerd Certificaat gepresenteerd. <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> <p>%1</p><ul>%2</ul><p>De specifieke certificaatfouten zijn:</p><ol>%3</ol><p>Wens je het certificaat toch te accepteren?<br />(Het wordt ook opgeslagen zodat je er niet opnieuw naar wordt gevraagd.)</p> SSL Version mismatch SSL-versie misovereenkomst Server connection failed. Falende server-verbinding. <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>Bericht naar kanaal '%1' (hier typen)</center> <center>Type message to user '%1' here</center> Type message to user '%1' here <center>Bericht naar gebruiker '%1' (hier typen)</center> Choose image file Kies afbeeldingsbestand Failed to load image Afbeelding laden mislukt Could not open file for reading. Bestand niet geopend voor lezen. Image format not recognized. Afbeeldingsbestandsindeling kon niet worden herkend. &User &Gebruiker &Channel &Kanaal Use in conjunction with Whisper to. Global Shortcut I.c.m. Fluisteren naar gebruiken. This will switch the states of the in-game overlay. Global Shortcut Wisselt in-game-overlay-status. Link Channel Global Shortcut Kanaal koppelen Cycle Transmit Mode Global Shortcut Verzet zendmodus Set Transmit Mode to Push-To-Talk Global Shortcut Set Transmit Mode to Continuous Global Shortcut Set Transmit Mode to VAD Global Shortcut Send Text Message Global Shortcut Stuur tekstbericht Send Clipboard Text Message Global Shortcut Stuur Klembord Tekstbericht This will send your Clipboard content to the channel you are currently in. Global Shortcut Dit deelt inhoud van je plakbord met het kanaal waar je je in bevindt. Continuous Continue Voice Activity Spraakactiviteit Push-to-Talk Druk-om-te-Praten Mumble - Minimal View -- %1 Mumble - Minimaal -- %1 Cancel Annuleren Save Image As... Afbeelding opslaan als... Save Image File Afbeeldingsbestand opslaan Could not save image: %1 Kon afbeelding niet opslaan: %1 Change your comment Je commentaar wijzigen Transmit Mode set to Voice Activity Zendmodus naar Spraakactivtiteit ingesteld Transmit Mode set to Push-to-Talk Zendmodus op Druk-om-te-Praten ingesteld <p>Connected users: %1/%2</p> <p>Gebruikers verbonden: %1/%2</p> UDP Statistics UDP-statistieken To Server Naar server From Server Van server Good Goed Late Laat Lost Verloren Resync Her-sync <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> <h2>Geluidsbandbreedte</h2><p>Maximale %1 kbit/s<br />Momenteel %2 kbit/s<br />Codec: %3</p> Mumble Server Information Mumble-serverinformatie &View Certificate &Certificaat weergeven Enter reason Reden typen Sending message to %1 Bericht naar %1 aan het verzenden To %1: %2 Naar %1: %2 Message to %1 Bericht naar %1 Are you sure you want to reset the comment of user %1? %1's gebruikerscommentaar leegmaken bevestigen? Are you sure you want to reset the avatar of user %1? %1's gebruikersavatar %1 leegmaken bevestigen? Are you sure you want to delete %1 and all its sub-channels? %1 en sub-kanalen verwijderen bevestigen? Sending message to channel %1 Verzendt bericht naar kanaal %1 Message to tree %1 Bericht naar boom %1 To %1 (Tree): %2 (Tree) %1: %2 Naar %1 (Boom): %2 Unmuted and undeafened. Ontdempt & ontdoofd. Unmuted. Ontdempt. Muted. Gedempt. Muted and deafened. Gedempt & gedoofd. Deafened. Gedoofd. Undeafened. Ontdoofd. Restart Mumble? Mumble herstarten? Some settings will only apply after a restart of Mumble. Restart Mumble now? Sommige instellingen worden pas toegepast na Mumble te herstarten. Mumble nu herstarten? About Qt Over Qt SSL Verification failed: %1 SSL-verificatie mislukt: %1 <li>Server certificate digest (SHA-1): %1</li> <li>Server certificaatsignatuur (SHA-1): %1</li> <b>WARNING:</b> The server presented a certificate that was different from the stored one. <b>Waarschuwing:</b> Servercertificaat⇎ opgeslagene. This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. Server gebruikt oude versleutelingsstandaard, wordt niet meer ondersteund door moderne Mumble-versies. Server connection failed: %1. Serververbindingsfout: %1. Disconnected from server. Serververbinding verbroken. Invalid username Gebruikersnaam ongeldig You connected with an invalid username, please try another one. Ongeldige gebruikersnaam bij verbindingspoging; graag een andere proberen. Username in use Gebruikersnaam is bezet That username is already in use, please try another username. Gebruikersnaam is al bezet; probeer een andere naam. Wrong certificate or password Verkeerde certificaat of wachtwoord Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. Verkeerd certificaat/wachtwoord voor geregistreerde gebruiker. Als je absoluut zeker weet dat gebruiker een wachtwoord gebruikt; opnieuw proberen. Anders afbreken en je certificaat en naam controleren. Wrong password Verkeerde wachtwoord Wrong server password for unregistered user account, please try again. Verkeerd serverwachtwoord voor ongeregistreerde account; opnieuw proberen. Images (*.png *.jpg *.jpeg) Afbeeldingen (*.png *.jpg *.jpeg) C&onfigure C&onfigureren &Help &Hulp Log Log This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. Toont alle recente activiteit. Verbindingen met servers, fouten en informatieberichten komen hier tevoorschijn.<br />Om te configureren welke berichten tevoorschijn moeten komen, gebruik <b>Instellingen</b> uit het menu. &Quit Mumble Mumble &afsluiten Closes the program Sluit het programma af Exits the application. Verlaat het programma. Ctrl+Q Ctrl+Q Open the server connection dialog Open het serververbindingsvenster &Disconnect Verbinding ver&breken Disconnect from server Serververbinding verbroken Disconnects you from the server. Verbreekt je serververbinding. Show information about the server connection Serververbindingsinformatie tonen This will show extended information about the connection to the server. Toont uitgebreide serververbindingsinformatie. &Mute &Dempen &Deafen &Doven &Local Mute &Lokaal dempen Send a Text Message Tekstbericht verzenden Sends a text message to another user. Verzendt een tekstberichtje naar een andere gebruiker Add new channel Nieuw kanaal toevoegen This adds a new sub-channel to the currently selected channel. Voegt nieuw sub-kanaal toe aan geselecteerd kanaal. Remove channel Kanaal verwijderen This removes a channel and all sub-channels. Verwijdert kanaal inclusief ↳-kanalen. Edit Groups and ACL for channel Groepen en ACL bewerken (kanaal) This opens the Group and ACL dialog for the channel, to control permissions. Opent groep- & ACL-venster van kanaal (rechten-beheer). &Link &Koppelen Link your channel to another channel Kanaal aan ander kanaal koppelen. This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. Dit is de chatbalk<br />Als je hier tekst typt en op enter drukt wordt de tekst naar de geselecteerde gebruiker of het kanaal verzonden. Geen selectie → binnenkanaalse berichtverzending. Chatbar Chatbalk Shows a dialog of registered servers, and also allows quick-connect. Geregistreerde serversvenster; laat snel-verbinden toe. Kick user (with reason) Gebruiker schoppen (met reden) Kick selected user off server. You'll be asked to specify a reason. Geselecteerde gebruiker schoppen (met reden). Mute user Gebruiker dempen Mute or unmute user on server. Unmuting a deafened user will also undeafen them. Gebruiker (ont)dempen (server); ontdempen → ontdooft. Kick and ban user (with reason) Gebruiker permanent wegschoppen (ban met opgaaf van reden) Kick and ban selected user from server. You'll be asked to specify a reason. Gebruiker wegschoppen (met reden). Deafen user Gebruiker doven Deafen or undeafen user on server. Deafening a user will also mute them. Gebruiker (ont)doven (server); doven → dempt ook. Mute user locally Gebruiker dempen (lokaal) Mute or unmute user locally. Use this on other users in the same room. Gebruiker (ont)dempen (lokaal). Gebruik dit op andere gebruikers in hetzelfde kanaal. This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. Koppelt je huidige kanaal aan het geselecteerde kanaal. Als gebruikers in kanalen bevoegd zijn om in het andere kanaal te spreken kunnen gebruikers elkaar daardoor horen. Permanente koppeling; blijft tot ontkoppeld of serverherstart. Zie druk-om-te-koppelen-sneltoetsen. &Unlink Channel &Ontkoppelen Unlink your channel from another channel Kanaal ↚ ander kanaal (ontkoppelen) This unlinks your current channel from the selected channel. Ontkoppelt huidig(e) kanaal van geselecteerde kanaal. Unlinks your channel from all linked channels. Ontkoppelt jouw kanaal van alle gekoppelden kanalen. This unlinks your current channel (not the selected one) from all linked channels. Ontkoppelt kanaal (non-selectie) van alle gekoppelden. &Reset &Herstellen Reset audio preprocessor Herstel geluidsvoorverwerking This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. Herstelt geluidsverwerking (ruisonderdrukking, versterking en spraakactiviteit-herkenning). Als de geluidsomgeving tijdelijk verslechtert (zoals vallende microfoon), gebruik het om wachten te voorkomen totdat de geluidsverwerking heraanpast. &Mute Self Jezelf &dempen Mute yourself Jezelf dempen Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. Jezelf (ont)dempen. Ontdempen → ontdooft jezelf ook. &Deafen Self Jezelf &doven Deafen yourself Jezelf doven Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. Jezelf (ont)doven; jezelf doven → dempt jezelf ook. &Text-To-Speech &Tekst-naar-Spraak Toggle Text-To-Speech Text-naar-Spraak gebruiken Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. Tekst-naar-Spraak aan-/uitzetten (T-n-S-geselecteerde berichten (configuratievenster) worden gesproken). Display audio statistics Audio Statistieken tonen Pops up a small dialog with information about your current audio input. Toont simpel venstertje met je geluidsinvoerinformatie. Forcibly unlink plugin Plug-in ontkoppelen forceren This forces the current plugin to unlink, which is handy if it is reading completely wrong data. Forceert plug-in-ontkoppeling (als 'ie het onjuiste uitleest). Configure Mumble Mumble configureren Allows you to change most settings for Mumble. Laat je de meeste instellingen van Mumble aanpassen. Start the audio configuration wizard Geluidsconfiguratie-wizard starten This will guide you through the process of configuring your audio hardware. Leidt jou het geluidshardware-(configuratie)proces door... &What's This? &Wat is dit? Enter What's This? mode Wat is dit? modus Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. Klik dit voor "Wat is dit?"-modus (pijltje verandert naar vraagteken). Klik op een willekeurige knop, menukeuze of gebied om een omschrijving te tonen van wat het is. Information about Mumble Informatie over Mumble Shows a small dialog with information and license for Mumble. Toont klein venstertje met Mumble-(licentie)informaties. Information about Speex Informatie over Speex Shows a small dialog with information about Speex. Toont een kleintje venster met meer Speex-informaties. Information about Qt Informatie over Qt Shows a small dialog with information about Qt. Toont een klein venstertje met Qt-frameworkinformatie. Check for &Updates Op &Updates controleren Check for new version of Mumble Controleren of er al een nieuwe versie van Mumble uit is. Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. Verbindt met de Mumble webpagina om te controleren of een nieuwe versie beschikbaar is, en meldt je met de juiste (downloadbare) adreslink als dit zich voordoet. Sends a text message to all users in a channel. Verzendt tekst-bericht naar alle gebruikers in een kanaal. Configure certificates for strong authentication Certificaten voor een sterkere authenticatie configureren. This starts the wizard for creating, importing and exporting certificates for authentication against servers. Begint wizard voor certificaatcreatie, -importatie en -exportatie voor serverauthenticatie. Register user on server Gebruiker op server registreren This will permanently register the user on the server. Registreert gebruiker op server. Add &Friend Vriend &toevoegen Adds a user as your friend. Je hebt een gebruiker als vriend toegevoegd. This will add the user as a friend, so you can recognize him on this and other servers. Voegt gebruikers als vriend toe zodat je hem/haar kunt herkennen op deze/andere servers. &Remove Friend Vriend &verwijderen Removes a user from your friends. Verwijdert gebruiker als vriend. This will remove a user from your friends list. Verwijdert een gebruiker uit vriendenlijst. &Update Friend Vriend &bijwerken Update name of your friend. Naam van vriend bijwerken. Your friend uses a different name than what is in your database. This will update the name. Jouw vriend gebruikt een andere naam dan wat in jouw database staat; dit werkt de naam bij. Edit registered users list Geregistreerde gebruikers-lijst bewerken This opens the editor for registered users, which allow you to change their name or unregister them. Opent geregistreerde gebruikers-bewerker; om namen te wijzigen of te ontregistreren. Add or remove text-based access tokens Toegangsleutels op tekst-basis toevoegen/verwijderen. &Minimal View &Minimalistisch venster Toggle minimal window modes Venstermodus wisselen This will toggle minimal mode, where the log window and menu is hidden. Wisselt naar minimalistisch venster waar geschiedenisvenster & menu verbergen. You muted and deafened %1. Je dempte & doofde %1. You unmuted and undeafened %1. Je ontdempte & ontdoofde %1. You undeafened %1. Je ontdoofde %1. You suppressed %1. Je onderdrukt %1. %1 muted and deafened by %2. %1 gedempt & gedoofd (door %2). %1 unmuted and undeafened by %2. %2 ont-dempt/doofd-e %1. %1 undeafened by %2. %2 ontdoofde %1. %1 suppressed by %2. %1 onderdrukt (door %2). %1 moved to %2. %1 verplaatst naar %2. %1 moved to %2 by %3. %1 verplaatst naar %2 (door %3). %1 moved in from %2 by %3. %1 hiernaartoe verplaatst uit %2 (door %3). %1 is now muted and deafened. %1 gedempt & gedoofd. Your account information can not be verified currently. Please try again later Accountinformatie kan nu niet geverifieerd worden. Graag later opnieuw proberen. Welcome message: %1 Welkomstbericht: %1 Mumble: %1 Mumble: %1 You were denied %1 privileges in %2. %1 geweigerd in %2. %3 was denied %1 privileges in %2. %3 werd %1 geweigerd in %2. Denied: Cannot modify SuperUser. Geweigerd: SuperUser onwijzigbaar. Denied: Invalid channel name. Geweigerd: Ongeldige kanaalnaam. Denied: Text message too long. Geweigerd: Tekstbericht te lang. Denied: Operation not permitted in temporary channel. Geweigerd: Handeling niet toegestaan (tijdelijk kanaal). You need a certificate to perform this operation. Je hebt een certificaat nodig om deze handeling te doen. %1 does not have a certificate. %1 heeft geen certificaat. Invalid username: %1. Ongeldige gebruikersnaam: %1. Invalid username. Ongeldige gebruikersnaam. Channel is full. Kanaal zit vol. Channel nesting limit reached. Kanaalstapellimiet bereikt. Channel count limit reached. Need to delete channels before creating new ones. Permission denied. Geen toestemming. %1 connected and entered channel. %1 connected. %1 verbindde. %1 is now muted. %1 gedempt. %1 is now unmuted. %1 ontdempt. Recording started Opname gestart Recording stopped Opname gestopt %1 started recording. %1 startte met opnemen. %1 stopped recording. %1 stopte met opnemen. You revoked your priority speaker status. Prioriteitsspreker-status ingetrokken. You assumed priority speaker status. Prioriteitsspreker-status aangenomen. %1 revoked your priority speaker status. %1 trok je prioriteitsspreker-status in. %1 gave you priority speaker status. %1 gaf je prioriteitsspreker-status. You revoked priority speaker status for %1. Prioriteitsspreker-status ↚ %1. You gave priority speaker status to %1. Prioriteitsspreker-status aan %1 gegeven. %1 revoked own priority speaker status. %1 trok eigen prioriteitsspreker-status in. %1 assumed priority speaker status. %1 neemt prioriteitsspreker-status aan. %1 revoked priority speaker status for %2. %1 prioriteitsspreker-status ↚ %2. %1 gave priority speaker status to %2. %1 gaf prioriteitsspreker-status aan %2. You were unmuted and undeafened by %1. Ontdempt & ontdoofd (door %1). You were muted by %1. Gedempt (door %1). You were undeafened by %1. Ontdoofd (door %1). You were suppressed. You were suppressed by %1. Onderdrukt. You were unsuppressed. Onderdrukking opgeheven. You were unsuppressed by %1. Onderdrukking opgeheven (door %1). You joined %1. Je ging %1 binnen. You moved %1 to %2. %1 naar %2 verplaatst. %1 is recording %1 neemt op %1 renamed to %2 by %3. %1 hernoemd naar %2 (door %3). %1 disconnected. %1 verbrak verbinding. Server message from Server (Tree) (Tak) (Channel) (Kanaal) (Private) (Privé) %2%1: %3 %2%1: %3 Failed to load Opus, it will not be available for audio encoding/decoding. The server requests minimum client version %1 Server verwacht minstens Mumble versie %1 The server requests positional audio be enabled. Server verzoekt positioneel geluid in te schakelen... The server requests positional audio be disabled. Server verzoekt positioneel geluid uit te schakelen... The server requests Push-to-Talk be enabled. Server verzoekt Druk-om-te-Praten in te schakelen... The server requests Push-to-Talk be disabled. Server verzoekt Druk-om-te-Praten uit te schakelen... You were unmuted by %1. Ontdempt (door %1). You muted %1. Je dempte %1. You unsuppressed %1. (Je hief) onderdrukking ↚ %1 (op). You unmuted %1. Je ontdempte %1. %1 muted by %2. %1 gedempt (door %2). %1 unsuppressed by %2. %2 (hief) onderdrukking ↚ %1 (op). %1 unmuted by %2. %2 ontdempte %1. Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. Overeenkomende CELT-codecs met andere Mumblers vinden mislukt. Je kunt niet met anderen praten. You were muted and deafened by %1. You were deafened by %1. Gedempt & gedoofd (door %1). You were kicked from the server by %1: %2. %1 schopte je: %2. %3 was kicked from the server by %1: %2. %3 geschopt door %1: %2. You were kicked and banned from the server by %1: %2. %1 schopte je weg (%2). %3 was kicked and banned from the server by %1: %2. %1 weggeschopt %3: %2. You were moved to %1 by %2. Verplaatst naar %1 (door %2). %1 entered channel. %1 kwam kanaal binnen. Server connection rejected: %1. Serververbinding afgewezen: %1. Denied: %1. Geweigerd: %1. %1 renamed to %2. %1 hernoemd naar %2. %1 left channel and disconnected. %1 verliet kanaal (verbrak verbinding). Message from %1 Bericht van %1 You have User Dragging set to "Do Nothing" so the user wasn't moved. Je hebt gebruikerssleping ingesteld op "Doe Niets" dus de gebruiker is niet versleept. You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. Kanalen slepen ingesteld op niets doen; niet verplaatst. Unknown Channel Drag mode in UserModel::dropMimeData. Onbekende kanaalsleepmodus in UserModel::dropMimeData. Remote controlling Mumble: Mumble op afstand beheren: Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) -jn, --jackname Set custom Jack client name. --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status Gebruik: mumble rpc [opties] Het is mogelijk om een lopende instantie van Mumble op afstand te bedienen door middel van het 'mumble rpc' commando. Valide acties zijn: mute Demp jezelf unmute Ontdemp jezelf togglemute Wissel zelf-dempingsstatus deaf Doof jezelf undeaf Ontdoof jezelf toggledeaf Wissel zelf-dovingsstatus Invocation Aanroeping Error: No RPC command specified Fout: Geen RPC-commando RPC RPC Welcome to Mumble. Welkom bij Mumble. Skipping version check in debug mode. Versiecontrole overslaan in de foutopsporende-modus. Hide Frame Frame verbergen Toggle showing frame on minimal window Frame om minimalistisch venster heen tonen This will toggle whether the minimal window should have a frame for moving and resizing. Wisselt of een minimalistisch venster een frame voor verplaatsen en resizen heeft. &Unlink All Alles &ontkoppelen Reset the comment of the selected user. Commentaar van geselecteerde gebruiker leegmaken. &Join Channel &Toetreden tot kanaal View comment in editor Commentaar in bewerker tonen Query server for connection information for user Gebruikerverbindingsinformatie opvragen S&erver &Server &Self &Zelf &Unlink Plugins Plug-ins &ontkoppelen Register yourself on the server Jezelf registeren Change your avatar image on this server Je avatar-afbeelding wijzigen &Remove Avatar Avatar &verwijderen Remove currently defined avatar image. Huidige ingestelde avatar-afbeelding verwijderen. Icon Toolbar Pictogrammen-werkbalk Change your own comment Je eigen commentaar wijzigen Recording Opnemend Priority Speaker Prioriteitsspreker &Copy URL URL &kopiëren Copies a link to this channel to the clipboard. Kopieert een kanaalkoppeling naar naar het klembord. Ignore Messages Berichten negeren Locally ignore user's text chat messages. Gebruikers' chatberichten negeren (lokaal). Silently drops all text messages from the user. Negeer alle tekstberichten van gebruiker. Edit ban list on server Banlijst veranderen This lets you edit the server-side IP ban list. Laat je de IP-banlijst bewerken. &Filter on/off &Filteren aan/uit Toggle the channel filter (Ctrl+F) Kanaalfiltering (Ctrl+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. Filteren van geselecteerde kanalen aan- of uitzetten. Standaard worden alle lege kanalen gefilterd. Extra kanalen markeerbaar vanuit kanaalcontextmenu. Ctrl+F Ctrl+F &Hide Channel when Filtering Kanaal &verbergen tijdens filteren Reset the avatar of the selected user. Avatar ↚ geselecteerde gebruiker. Locally adjust the user's speech volume. Gebruikers' spraakvolume aanpassen (lokaal) Opens a dialog with a volume slider. Use this on other users in the same room. Opent een venster met een volumeschuifje. Gebruik op andere kanaalgebruiker(s). &Developer &Ontwikkelaar &Hide Mumble &Verberg Mumble Hides the main Mumble window. Verbergt het hoofd Mumble venster Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. Verbergt het Mumble-hoofdvenster. Herstel door te klikken op het tray-icoontje of door Mumble te herstarten. Show the Developer Console Toon de Ontwikkellaarsconsole Shows the Mumble Developer Console, where Mumble's log output can be inspected. Toont de console voor ontwikkelaars van Mumble, waarmee Mumble's logs kunnen worden geïnspecteerd. &Connect... &Verbind &Ban list... &Ban lijst... &Information... &Informatie... &Kick... &Schoppen... &Ban... &Verbannen Local Volume Adjustment... Lokaal Volume Bijstellen Send &Message... Verstuur &Bericht... &Add... &Toevoegen... &Remove... &Verwijderen... &Edit... &Bewerken... Audio S&tatistics... Audio S&tatistieken... &Settings... &Instellingen... &Audio Wizard... &Geluidswizard... Developer &Console... Ontwikkelaars &Console... &About... &Over... About &Speex... Over &Speex... About &Qt... Over &Qt... &Certificate Wizard... &Certificaat Wizard... &Register... &Registreren... Registered &Users... &Geregistreerde gebruikers... Change &Avatar... Avatar &wijzigen... &Access Tokens... &Toegangssleutels... Reset &Comment... &Commentaar wissen... Reset &Avatar... Avatar &wissen... View Comment... Commentaar tonen... &Change Comment... &Commentaar veranderen... R&egister... R&egistreer... Show Shows the main Mumble window. Manual Manual Mumble Positional Audio Manuele geluidspositionering Position Positie X X Y Y Z Z m m Heading Tag Azimuth Azimut Elevation Elevatie ° ° Meta data Metadata Context Context Identity Identiteit Set Instellen State Status Linked Gekoppeld Activated Geactiveerd Unhinge Ontwrichten NetworkConfig Network Netwerk Updates are mandatory when using snapshot releases. Updates verplicht bij snapshotgebruik. Connection Verbinding Use TCP compatibility mode Use TCP compatability mode Gebruik TCP-compatibiliteitsmodus <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). <b>TCP-compatibiliteitsmodus</b>.<br />Louter TCP gebruiken. Vergroot overhead & pakketverlies (communicatieonderbrekingen). Als je de standaardinstelling (UDP (spraak) & TCP (beheer)) niet kunt gebruiken. Reconnect when disconnected Her-verbinden als verbinding faalt. <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. <b>Her-verbindt na falende verbinding</b>.<br /> Laat Mumble automatisch opnieuw verbinden na 10 seconden als jouw verbinding met de server faalt. Reconnect automatically Automatisch her-verbinden Proxy Proxy Type Soort Type of proxy to connect through Soort proxy (om te verbinden) Direct connection Directe verbinding HTTP(S) proxy HTTP(S) proxy SOCKS5 proxy SOCKS5 proxy Hostname Hostnaam Hostname of the proxy Hostnaam (van proxy) Force TCP mode TCP-modus forceren Enable QoS to prioritize packets QoS-pakketpriorisatie This will enable QoS, which will attempt to prioritize voice packets over other traffic. QoS-prioriseren prioriteert spreken t.o.v. ander verkeer. Use Quality of Service Quality of Service gebruiken Don't send certificate to server and don't save passwords. (Not saved). Certificaat niet naar server verzenden en geen wachtwoorden bewaren. (Niet opgeslagen). <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> <b>Onderdrukt Mumble-identiteitsinformatie.</b><p>Mumble identificeert niet met een certificaat, zelfs indien ingesteld, en cachet geen wachtwoorden voor verbindingen. Vooral test-optie (niet opgeslagen).</p> Suppress certificate and password storage Certificaat-/wachtwoordenopslag onderdrukken <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>Soort proxy</b><br />Laat Mumble via een proxy-verbinding maken (uitgaande verbindingen). Tunnelen zet Mumble in TCP-compatibiliteitsmodus, waardoor spraakgegevens via beheerkanaal gaan verlopen. <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. <b>Hostnaam (proxy)</b><br />Hostnaam van proxy waarover je netwerkverkeer wilt tunnelen. Port Poort Port number of the proxy Proxy-poort <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. <b>Poortnummer (proxy).</b><br />Poort waarop de proxy verbindingen aanneemt. Username Gebruikersnaam Username for proxy authentication Gebruikersnaam (proxy-authenticatie) <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>Gebruikersnaam (proxy-authenticatie)</b><br /> Gebruikersnaam om te authenticeren. Indien je anoniem wilt verbinden; leeglaten. Password Wachtwoord Password for proxy authentication Wachtwoord (proxy-authenticatie) <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>Wachtwoord (proxy-authenticatie)</b><br />Wachtwoord om te authenticeren. Indien je anoniem wilt verbinden; leeglaten. Mumble services Mumble-services Check for new releases of Mumble automatically. Automatisch op nieuwe Mumble-uitgaven controleren. This will check for new releases of Mumble every time you start the program, and notify you if one is available. Controleert op nieuwe Mumble-uitgaven steeds als je het programma start, en meldt je als er een beschikbaar is. Check for application updates on startup Op applicatie-updates controleren tijdens opstarten Check for new releases of plugins automatically. Automatisch op nieuwe plug-in-uitgaven controleren. This will check for new releases of plugins every time you start the program, and download them automatically. Dit controleert op nieuwe uitgaves van plug-ins steeds als je het programma opstart (automatisch downloaden). <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. <b>Anonieme statistieken delen.</b><br />Mumble heeft een klein ontwikkelteam, en moet zich als zodanig richten op waar het meest nodig. De deling van een beetje statistieken is voornamelijk behulpzaam om te bepalen waar de ontwikkeling zich op richt. Submit anonymous statistics to the Mumble project Statistieken met het Mumble-project delen (anoniem) Submit anonymous statistics Statistieken delen (anoniem) Reconnect to last used server when starting Mumble Laatst gebruikte server herverbinden bij app-opstarten. Reconnect to last server on startup Met de laatste server verbinden bij het Mumble-opstarten Download plugin and overlay updates on startup Plug-in/nieuwe overlay-updates downloaden bij starten Privacy Privacy Prevent OS information being sent to Mumble servers and web servers Voorkomt dat Mumble informatie over het besturingssysteem naar de Mumble server en web servers worden gestuurd. <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. <b>Stuur geen OS informatie naar servers</b><br/> Voorkomt dat Mumble potentieel identificerende informatie over het besturingssysteem stuurt naar de Mumble server en web servers. Do not send OS information to Mumble servers and web servers Geen systeeminformatie delen met Mumble-servers of webservers Overlay Silent Stil Talking Pratend Whisper Fluisteren Shout Schreeuwen Channel Kanaal Failed to create communication with overlay at %2: %1. No overlay will be available. Totstandbrenging communicatie met overlay bij %2 mislukt: %1. Overlay is daarom niet beschikbaar. OverlayClient Filter Filter Only talking Louter pratend Talking and recently active Pratend en onlangs actief All in current channel Allen in het huidig kanaal All in linked channels Allen in gelinkte kanalen Always show yourself Altijd jezelf laten zien Configure recently active time (%1 seconds)... Onlangs actieve tijd (%1 seconds) configureren... Columns Kolommen Sort Sorteren Alphabetically Alfabetisch Last state change Laatste statuswijziging Edit... &Bewerken... Reset Zoom Zoom herstellen Configure recently active time Onlangs actief tijd configureren Amount of seconds users remain active after talking: Aantal in seconden wat gebruiker actief blijft na praten: OverlayConfig To move the users, drag the little red dot. Om gebruikers te verplaatsen sleep je rooie puntjes. To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. Om gebruikers te resizen... scrol over gebruikers. For more options, right click a user. For more options, rightclick a user. Voor meer opties rechtsklik op een gebruiker. Launcher Filter Launcherfilter Overlay Overlay Choose executable Uitvoerbaar bestand kiezen Choose application Applicatie kiezen Choose path Pad kiezen Load Overlay Presets Overlay-instellingen laden Mumble overlay presets (*.mumblelay) Mumble overlay-instellingen (*.mumblelay) Save Overlay Presets Overlay-instellingen opslaan Options Opties Enable overlay. Overlay tonen. Enable Overlay Overlay tonen This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. Bepaalt of de overlay aan staat of niet. Instelling wordt toegepast zodra applicaties worden gestart; bevestig of Mumble loopt en dat de optie aanstaat voordat je een applicatie start.<br />Als je Mumble start na het starten van de applicatie of als je de overlay uitzet terwijl de applicatie wordt uitgevoerd er geen veilige manier is om overlay te herstarten zonder een applicatie te herstarten. Layout Indeling Blacklist Zwarte lijst Whitelist Goede lijst Uninstall Overlay Overlay deïnstalleren. Overlay Installation Overlayinstallatie Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. Mumble ontdekte ongeïnstalleerde Mumble Overlay. Klik onderstaande knop om overlay te installeren. Install Mumble Overlay Mumble Overlay installeren Overlay Upgrade Overlay upgraden Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. Mumble heeft een oude versie dan de ondersteunende bestanden voor de overlay ontdekt op je computer. Om naar laatste versie te upgraden klik onderstaande knop. Upgrade Mumble Overlay Mumble Overlay Upgraden Display a frame counter in the overlay Een frameteller in het overlay tonen. Show FPS counter FPS-teller tonen Load an overlay preset from file Laad overlayinstellingenbestand Load… Laden... Save your overlay settings to file Overlayinstellingen in bestand opslaan Save… Opslaan... Set the overlay font. Overlay-lettertype instellen. Set the overlay text color. Overlay-tekstkleur instellen. Color Kleur Remove Verwijderen Font Lettertype FPS and Clock Display FPS- & klokscherm Display a clock in the overlay showing the current local time (system time). Over-layklok met huidige lokale tijd (systeemtijd) tonen. Show Clock Klok tonen Overlay Exceptions Overlay uitzonderingen Overlay Exception Mode Overlay uitzonder-modus Allowed launchers Toegestane launchers Add Toevoegen Allowed programs Toegestane programma's Allowed paths Toegestane paden Blacklisted programs Programma's op de zwarte lijst OverlayEditor State Status User is not talking Gebruiker praat niet Passive Passief User is talking in your channel or a linked channel Gebruiker praat in jouw kanaal of in gekoppeld kanaal. Talking Pratend User is whispering to you privately Gebruiker fluistert geheimzinnig tegen jou Private Whisper Geheimzinnig fluisteren User is shouting to your channel Gebruiker schreeuwt naar je kanaal Channel Whisper Kanaal influisteren Zoom Zoom Zoom Factor Zoomfactor Enabled Elements Geactiveerde elementen User avatar, chosen by each user Gebruikeravatar; apart gekozen door iedere gebruiker. Avatar Avatar User's name Gebruiker's-naam Username Gebruikersnaam Name of user's channel, if outside your current channel Gebruikers kanaalnaam (zodien buiten huidige kanaal). Channel Kanaal Muted or deafened Gedempt of gedoofd Mute state Dempen-status Bounding box, automatically shrunk to minimum size to contain all visible elements Grensvak; krimpt vanzelf totaan een minimale omvang waarbij alle zichtbare elementen nog kunnen bevatten. Bounding box Grensvak Overlay Editor Overlay-bewerker OverlayEditorScene Layout preset Vooraf ingestelde lay-out Large square avatar Groot-vierkant-avatar Avatar and Name Avatar & Naam User Opacity Gebruikersdekking %1% %1% Object Opacity Objectdekking Alignment Opstelling Left Center Midden Right Top Boven Bottom Beneden Color... Kleur... Font... Lettertype... Bounding box Grensvak Pen width Penbreedte Padding Vulling Pen color Penkleur Fill color Kleurvulling Pick pen color Penkleur kiezen Pick fill color Kleurvulling kiezen Pick color Kleur kiezen Pick font Lettertype kiezen PluginConfig Plugins Plug-ins Plugin has no configure function. Plug-in ontbeert configuratiemogelijkheid. Plugin has no about function. Plug-in ontbeert over-mogelijkheid. Options Opties Enable plugins and transmit positional information Plugins inschakelen & positionele informatie uitzenden. This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. Maakt qua plug-ins voor ondersteunde games mogelijk om in-spel positie te achterhalen en die mee te zenden met met elk spraakpakketje. Laat andere gebruikers je stem in-game horen vanuit de richting van je poppetje ten opzichte van anderen. Link to Game and Transmit Position Koppelen aan spel & positie zenden Reloads all plugins Herlaadt alle plug-ins This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. Herscant & herlaadt plug-ins. Gebruik na plug-in(s) aan de plug-ins-map te hebben toegevoegd (of gewijzigd). &Reload plugins Plug-ins &herladen Information about plugin Informatie over plug-in This shows a small information message about the plugin. Dit toont een beknopt informatiebericht over de plug-in. &About &Over Show configuration page of plugin Configuratiepagina van plug-in tonen This shows the configuration page of the plugin, if any. Toont plug-in-configuratiepagina (zodien deze bestaat). &Configure &Configureren Name Naam Enabled Geactiveerd Plugins Skipping plugin update in debug mode. Plugins bijwerken overslaan in foutopsporende-modus. Downloaded new or updated plugin to %1. Nieuwe of bijgewerkte plug-in naar %1 gedownload. Failed to install new plugin to %1. Nieuwe plug-in naar %1 installeren mislukt. %1 lost link. %1 verloor verbinding. %1 linked. %1 verbonden. PortAudioSystem Default Device Standaardapparaat PulseAudioSystem Default Input Standaardinvoer Default Output Standaarduitvoer QApplication Failed to restart mumble Mumble herstarten gefaald Mumble failed to restart itself. Please restart it manually. Mumble faalde om te her-starten. Graag zelf herstarten... RichTextEditor Failed to load image Afbeelding laden mislukt Image file too large to embed in document. Please use images smaller than %1 kB. Afbeeldingsbestand te groot qua documentsverankering; afbeeldingen ↓ dan %1 kB gebruiken! Message is too long. Bericht is te lang. Display Scherm Source Text Brontekst &Bold Dik&bedrukt Ctrl+B Ctrl+D &Italic Curs&ief Italic Cursief Ctrl+I Ctrl+S Underline On&derstrepen Ctrl+U Ctrl+D Color Kleur Insert Link Koppeling invoegen Ctrl+L Ctrl+L Insert Image Afbeelding invoegen RichTextEditorLink Add Link Koppeling toevoegen URL URL Text Tekst ServerHandler Unable to resolve hostname Falende hostnaamresolutie Server is not responding to TCP pings De server reageert niet op TCP pings UDP packets cannot be sent to or received from the server. Switching to TCP mode. UDP-pakketjes worden niet verzonden naar/ontvangen op server. Wisselt naar TCP-modus. UDP packets cannot be sent to the server. Switching to TCP mode. UDP-pakketjes worden niet verzonden naar server. Wisselt naar TCP-modus. UDP packets cannot be received from the server. Switching to TCP mode. UDP-pakketjes worden niet van server ontvangen. Wisselt naar TCP-modus. UDP packets can be sent to and received from the server. Switching back to UDP mode. Wisselt naar UDP modus. UDP-pakketjes worden verzonden naar & ontvangen op server. Connection timed out Verbinding verlopen ServerView Favorite Favoriet LAN LAN Public Internet Internet Unknown Africa Afrika Asia Azië North America Noord-Amerika South America Zuid-Amerika Europe Europa Oceania Oceanië ShortcutActionWidget Unassigned Ontoegewezen ShortcutDelegate On Aan Off Uit Toggle Wisselen Unassigned Ontoegewezen ShortcutKeyWidget Press Shortcut Sneltoets indrukken ShortcutTargetDialog Root Stam Parent Wortel Current Huidig Subchannel #%1 Subkanaal #%1 ShortcutTargetWidget ... ... , , Root Stam Parent Wortel Current Huidig Subchannel #%1 Subkanaal #%1 Invalid Ongeldig Empty <Empty> Leeg ShortcutToggleWidget Off Uit Toggle Wisselen On Aan TextMessage Enter text Typ tekst If checked the message is recursively sent to all subchannels Aangevinkt zend berichten recursief naar alle subkanalen. Send recursively to subchannels Recursief naar subkanalen zenden Tokens Empty Token Lege Sleutel Mumble - Access Tokens Mumble - Toegangssleutels List of access tokens on current server Servertoegangssleutelslijst <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. <b>Bewerkbare servertoegangssleutellijst.</b> <br /> Toegangssleutels zijn tekenreeksen; zijnden wachtwoorden t.b.v. simpel kanaaltoegangsbeheer. Mumble onthoudt gebruikte sleutels en en deelt ze opnieuw met server zodra je herverbindt (zodat opnieuw moeten ingeven wordt voorkomen). Add a token Een sleutel toevoegen &Add &Toevoegen Remove a token Een sleutel verwijderen &Remove &Verwijderen UserEdit Registered Users Geregistreerde Gebruikers Remove Verwijderen Rename Hernoemen Who are you looking for? Wie zoek je? Days Dagen Weeks Weken Months Maanden Years Jaren Inactive for Inactief: Registered users: %n account(s) Geregistreerde gebruiker: %n accountGeregistreerde gebruikers: %n accounts UserInformation User Information Gebruikersinformatie Connection Information Verbindinginformatie Version Versie OS Besturingssysteem Certificate Certificaat IP Address IP-Adres CELT Versions CELT-versies Details... Details... Ping Statistics Pingstatistieken Pings received Pings ontvangen Average ping Gemiddelde ping TCP (Control) TCP (Beheer) UDP (Voice) UDP (Spraak) UDP Network statistics UDP-netwerkstatistieken Good Goed Late Laat Lost Verloren Resync Her-sync From Client Van Mumbler To Client Naar Mumbler Connection time Verbindingstijd %1w %1w %1d %1d %1h %1u %1m %1m %1s %1s , , %1 (%2) %1.%2.%3 (%4) %1 (%2) Supported Ondersteund Not Supported Niet ondersteund Not Reported Niet gerapporteerd %1 online (%2 idle) %1 online (%2 inactief) %1 online %1 online %1 kbit/s %1 kbit/s Bandwidth GroupBox Bandbreedte Bandwidth Label Bandbreedte Ping deviation Pingafwijking UserListModel Nick Bijnaam Inactive days Dagen inactief Last channel Laatste kanaal Last seen: %1 Laatst gezien: %1 Never Nooit Channel ID: %1 Kanaal ID: %1 UserLocalVolumeDialog Local volume for other users Lokaal-volume voor andere gebruikers <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. <b>Volume van andere gebruikers bijstellen</b><br />Mumble volumebijstelling van andere gebruikers (lokaal) laten doen. Adjusting local volume for %1 Lokaal ijkend (%1-volume) dB dB <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> <html><body><p>Gebruik schuifbalk of tekstvak om gebruikersvolume te veranderen.</p><p><span style="font-weight:600;">Opgelet!</span></p><p>Volume van een gebruiker significant verhogen veroorzaakt (gehoor)schade en kan ook gebruiker's achtergrondruis verhogen.</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: Dit is een gebruiker verbonden met server. Icoontjes van gebruikers geven aan of ze momenteel praten of juist niet. Talking to your channel. Pratend naar je kanaal. Shouting directly to your channel. Whispering directly to your channel. Schreeuw rechtstreeks naar je kanaal Whispering directly to you. Fluistert rechtstreeks naar jou. Not talking. Niet pratend. This is a channel on the server. The icon indicates the state of the channel: Serverkanaaltje (icoontjes geven kanaalstatussen aan). Your current channel. Huidig kanaal. A channel that is linked with your channel. Linked channels can talk to each other. Kanaal gekoppeld aan je kanaal. Gekoppelde kanalen kunnen met elkaar praten. A channel on the server that you are not linked to. Serverkanaal waaraan je niet bent gekoppeld. This shows the flags the user has on the server, if any: Toont alle kenmerken die de gebruiker heeft indien v.t.: On your friend list In je vriendenlijst Authenticated user Geregistreerde gebruiker Muted (manually muted by self) Gedempt (handmatig gedempt door jezelf) Muted (manually muted by admin) Gedempt (handmatig gedempt door beheerder) Muted (not allowed to speak in current channel) Gedempt (verboden om te spreken in het huidige kanaal) Muted (muted by you, only on your machine) Lokaal gedempt (dankzij jouw en slechts voor jouwzelf) Muted (push-to-mute) Deafened (by self) Gedoofd (door jezelf) Deafened (by admin) Gedoofd (door beheerder) User has a new comment set (click to show) Gebruiker heeft nieuw commentaar gezet (klik = tonen). User has a comment set, which you've already seen. (click to show) Gebruiker heeft geen nieuw commentaar geschreven... Ignoring Text Messages Tekstberichten worden genegeerd This shows the flags the channel has, if any: Toont (eventuele) kanaalkenmerken: Channel has a new comment set (click to show) Kanaal heeft nieuw ingesteld commentaar (klik = tonen) Channel has a comment set, which you've already seen. (click to show) Kanaal heeft geen nieuw commentaar (klikken = tonen) Channel will be hidden when filtering is enabled Kanaal wordt verborgen indien deze filteren aanstaat... Name Naam Flags Kenmerken Are you sure you want to drag this user? Weet u zeker dat u deze gebruikt wilt verplaatsen? Are you sure you want to drag this channel? Zeker dat je kanaal wilt slepen? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. Kan handeling niet vanzelf uitvoeren; éérst numerieke sorteerindicatoren herstellen óf handmatig aanpassen. VersionCheck Upgrade Mumble Mumble bijwerken A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? Nieuwe Mumble-versie werd ontdekt & binnengehaald. Upgrade naar deze versie aanbevolen (of downgraden naar laatste stabiele uitgave). Installatie nú opstarten? Failed to launch snapshot installer. Snapshot-installatie starten mislukt. Corrupt download of new version detected. Automatically removed. Corrupte update gedownload - automatisch verwijderd! Downloading new snapshot from %1 to %2 Splinternieuwe snapshot wordt van %1 naar %2 gedownload. Failed to write new version to disk. Failed to write new version to disc. Nieuwere Mumble-versie ⇒ schijf wegschrijven mislukt. Mumble failed to retrieve version information from the central server. Versieinformatie ophalen ⇐ centrale server niet gelukt. ViewCert Certificate Chain Details Certificaatkettingdetails Certificate chain Certificaatketting Certificate details Certificaatdetails Common Name Gemeenschappelijke naam Organization Organisatie Subunit Divisie Country Land Locality Nationaliteit State Status Valid from: %1 Geldig sinds: %1 Valid to: %1 Geldig tot: %1 Serial: %1 Serie: %1 Public Key: %1 bits %2 Publiekssleutel: %1 bits %2 RSA RSA DSA DSA Digest (SHA-1): %1 Kenmerk (SHA-1): %1 Digest (SHA-256): %1 Kenmerk (SHA-256): %1 Email: %1 E-mail: %1 DNS: %1 DNS: %1 Issued by: Uitgegeven door: Unit Name Divisienaam VoiceRecorder Recorder failed to create directory '%1' Map '%1' maken (door geluidsrecorder) mislukt Recorder failed to open file '%1' Bestand '%1' openen (door geluidsrecorder) mislukt. .wav - Uncompressed .wav - Ongecomprimeerd .ogg (Vorbis) - Compressed .ogg (Vorbis) - Gecomprimeerd .au - Uncompressed .au - Ongecomprimeerd .flac - Lossless compressed .flac - Zonder verlies gecomprimeerd VoiceRecorderDialog Recorder Geluidsrecorder Control Beheer 00:00:00 00:00:00 &Start &Starten S&top S&toppen Mode Modus Multichannel Meer-kanaals Output Uitvoer Output format Uitvoerindeling Target directory Doelmap Filename Bestandsnaam &Browse... &Bladeren... Valid variables are: Geldige variabelen: Inserts the user's name Voegt de gebruiker's-naam in Inserts the current date Voegt de huidige datum in Inserts the current time Voegt de huidige tijd in Inserts the hostname Voegt de hostnaam in Recorder still running Geluidsrecorder loopt nog Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? Geluidsrecorder afsluiten (zonder eerst te stoppen) wist al het onopgeslagen geluid; geluidsrecorder toch sluiten? Unable to start recording. Not connected to a server. Geluidsopnamestarten mislukt (geen serververbinding). The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. Server waarmee je verbonden bent is versie 1.2.2 (of ouder). Wegens privacyredenen is geluid opnemen onmogelijk op servers met versies ↓ dan 1.2.3. Contacteer je serverbeheerder voor meer informatie. There is already a recorder active for this server. Reeds opnemer op server actief. Please select a recording format. Opname-indeling selecteren. Stopping Stoppend Select target directory Doelmap selecteren Downmix Downmix WASAPIInput Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone. WASAPISystem Default Device Standaardapparaat qwPTTButtonWidget Mumble PTT Mumble DotP Push to talk Druk om te praten mumble-1.3.4/src/mumble/AudioWizard.ui0000664000175000017500000007252214010707273017502 0ustar builderbuilder AudioWizard 0 0 757 823 Audio Tuning Wizard QWizard::ClassicStyle Introduction Welcome to the Mumble Audio Wizard <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> true Qt::Vertical 20 291 Device selection Selecting the input and output device to use with Mumble. Input Device This is the device your microphone is connected to. true System qcbInput Input method for audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device qcbInputDevice Input device to use <b>Selects which sound card to use for audio input.</b> Cancel echo from headset or speakers This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. Use echo cancellation Output Device This is the device your speakers or headphones are connected to. true System qcbOutput Output method for audio <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. Device qcbOutputDevice Output device to use <b>Selects which sound card to use for audio Output.</b> Allows positioning of sound This allows Mumble to use positional audio to place voices. Enable positional audio Enables attenuation of other applications while users talk to you Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. Attenuate applications while other users talk Qt::Vertical 20 105 Device tuning Changing hardware output delays to their minimum value. <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> true 1 0 Amount of data to buffer This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. 1 6 2 Qt::Horizontal 30 0 qsOutputDelay Qt::Vertical 20 431 Volume tuning Tuning microphone hardware volume to optimal settings. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> true <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> true 0 30 Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. true true Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. true 32767 100 1000 Qt::Horizontal Qt::Vertical 20 552 Qt::Horizontal 40 20 Apply some high contrast optimizations for visually impaired users Use high contrast graphics Voice Activity Detection Letting Mumble figure out when you're talking and when you're silent. This will help Mumble figure out when you are talking. The first step is selecting which data value to use. true Push To Talk: 64 64 Signal-To-Noise ratio 0 0 30 Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). true Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). true 1 32767 100 1000 Qt::Horizontal Qt::Vertical 20 40 Raw amplitude from input Quality & Notifications Adjust quality and notification settings. 0 0 Quality settings QFormLayout::AllNonFixedFieldsGrow Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 0 0 Low In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) true 0 0 Balanced true This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) true 0 0 High This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) true Custom You already set a customized quality configuration in Mumble. Select this setting to keep it. Notification settings Use Text-To-Speech to read notifications and messages to you. true Disable Text-To-Speech and use sounds instead. Keep custom Text-To-Speech settings. Qt::Vertical 20 40 Positional Audio Adjusting attenuation of positional audio. <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> true Use headphones instead of speakers This ignores the OS speaker configuration and configures the positioning for headphones instead. Use headphones Qt::Vertical 20 41 Finished Enjoy using Mumble <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> true Submit anonymous statistics to the Mumble project Qt::Vertical 20 267 AudioBar QWidget
AudioStats.h
1
CompletablePage QWizardPage
AudioWizard.h
1
ShortcutKeyWidget QLineEdit
GlobalShortcut.h
MUComboBox QComboBox
widgets/MUComboBox.h
mumble-1.3.4/src/mumble/os_win.cpp0000664000175000017500000002213714010707274016721 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include #include #include #include #include #include #include #include #include // For share flags for _wfsopen #include "Global.h" #include "Version.h" #include "LogEmitter.h" extern "C" { void __cpuid(int a[4], int b); void mumble_speex_init(); }; #define DUMP_BUFFER_SIZE 1024 static wchar_t wcCrashDumpPath[DUMP_BUFFER_SIZE]; static FILE *fConsole = NULL; static wchar_t wcComment[DUMP_BUFFER_SIZE] = L""; static MINIDUMP_USER_STREAM musComment; static QSharedPointer le; static int cpuinfo[4]; bool bIsWin7 = false; bool bIsVistaSP1 = false; HWND mumble_mw_hwnd = 0; static void mumbleMessageOutputQString(QtMsgType type, const QString &msg) { char c; switch (type) { case QtDebugMsg: c='D'; break; case QtWarningMsg: c='W'; break; case QtFatalMsg: c='F'; break; default: c='X'; } QString date = QDateTime::currentDateTime().toString(QLatin1String("yyyy-MM-dd hh:mm:ss.zzz")); QString fmsg = QString::fromLatin1("<%1>%2 %3").arg(c).arg(date).arg(msg); fprintf(fConsole, "%s\n", qPrintable(fmsg)); fflush(fConsole); OutputDebugStringA(qPrintable(fmsg)); le->addLogEntry(fmsg); if (type == QtFatalMsg) { ::MessageBoxA(NULL, qPrintable(msg), "Mumble", MB_OK | MB_ICONERROR); exit(0); } } #if QT_VERSION < 0x050000 static void mumbleMessageOutput(QtMsgType type, const char *msg) { mumbleMessageOutputQString(type, QString::fromUtf8(msg)); } #endif #if QT_VERSION >= 0x050000 static void mumbleMessageOutputWithContext(QtMsgType type, const QMessageLogContext &ctx, const QString &msg) { Q_UNUSED(ctx); mumbleMessageOutputQString(type, msg); } #endif static LONG WINAPI MumbleUnhandledExceptionFilter(struct _EXCEPTION_POINTERS* ExceptionInfo) { MINIDUMP_EXCEPTION_INFORMATION i; i.ThreadId = GetCurrentThreadId(); i.ExceptionPointers = ExceptionInfo; MINIDUMP_USER_STREAM_INFORMATION musi; musi.UserStreamCount = 1; musi.UserStreamArray = &musComment; HANDLE hMinidump = CreateFile(wcCrashDumpPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hMinidump != INVALID_HANDLE_VALUE) { if (MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hMinidump, static_cast(MiniDumpWithIndirectlyReferencedMemory | MiniDumpWithThreadInfo), &i, &musi, NULL)) { FlushFileBuffers(hMinidump); } CloseHandle(hMinidump); } return EXCEPTION_CONTINUE_SEARCH; } static void enableCrashOnCrashes() { // Makes sure the application actually crashes when one of its callbacks // called from the kernel crashes. // // See http://support.microsoft.com/kb/976038 // http://www.altdevblogaday.com/2012/07/06/when-even-crashing-doesnt-work/ typedef BOOL (WINAPI *tGetPolicy)(LPDWORD lpFlags); typedef BOOL (WINAPI *tSetPolicy)(DWORD dwFlags); const DWORD PROCESS_CALLBACK_FILTER_ENABLED = 0x01; HMODULE kernel32 = LoadLibrary(L"kernel32.dll"); tGetPolicy pGetPolicy = (tGetPolicy) GetProcAddress(kernel32, "GetProcessUserModeExceptionPolicy"); tSetPolicy pSetPolicy = (tSetPolicy) GetProcAddress(kernel32, "SetProcessUserModeExceptionPolicy"); if (pGetPolicy && pSetPolicy) { // Only available as of Vista SP2 / Win7 SP1 DWORD dwFlags; if (pGetPolicy(&dwFlags)) { if (!pSetPolicy(dwFlags & ~PROCESS_CALLBACK_FILTER_ENABLED)) qWarning("enableCrashOnCrashes: Failed to set policy"); } else { qWarning("enableCrashOnCrashes: Failed to get policy"); } } } BOOL SetHeapOptions() { HMODULE hLib = LoadLibrary(L"kernel32.dll"); if (hLib == NULL) return FALSE; typedef BOOL (WINAPI *HSI)(HANDLE, HEAP_INFORMATION_CLASS, PVOID, SIZE_T); HSI pHsi = (HSI)GetProcAddress(hLib, "HeapSetInformation"); if (!pHsi) { FreeLibrary(hLib); return FALSE; } #ifndef HeapEnableTerminationOnCorruption #define HeapEnableTerminationOnCorruption (HEAP_INFORMATION_CLASS)1 #endif BOOL fRet = (pHsi)(NULL, HeapEnableTerminationOnCorruption, NULL, 0) ? TRUE : FALSE; if (hLib) FreeLibrary(hLib); return fRet; } // We only support delay-loading on MSVC, not on MinGW. #ifdef _MSC_VER FARPROC WINAPI delayHook(unsigned dliNotify, PDelayLoadInfo pdli) { if (dliNotify != dliNotePreLoadLibrary) return 0; size_t length = strlen(pdli->szDll); if (length < 5) return 0; size_t buflen = length + 10; STACKVAR(char, filename, buflen); strcpy_s(filename, buflen, pdli->szDll); size_t offset = 0; if (_stricmp(filename + length - 4, ".dll") == 0) offset = length-4; else offset = length; HMODULE hmod = 0; // SSE? if (cpuinfo[3] & 0x02000000) { // SSE2? if (cpuinfo[3] & 0x04000000) { // And SSE3? if (cpuinfo[2] & 0x00000001) { strcpy_s(filename + offset, 10, ".sse3.dll"); hmod = LoadLibraryA(filename); if (hmod) return (FARPROC) hmod; } strcpy_s(filename + offset, 10, ".sse2.dll"); hmod = LoadLibraryA(filename); if (hmod) return (FARPROC) hmod; } strcpy_s(filename + offset, 10, ".sse.dll"); hmod = LoadLibraryA(filename); if (hmod) return (FARPROC) hmod; } return 0; } decltype(__pfnDliNotifyHook2) __pfnDliNotifyHook2 = delayHook; #endif void os_init() { __cpuid(cpuinfo, 1); #define MMXSSE 0x02800000 if ((cpuinfo[3] & MMXSSE) != MMXSSE) { ::MessageBoxA(NULL, "Mumble requires a SSE capable processor (Pentium 3 / Ahtlon-XP)", "Mumble", MB_OK | MB_ICONERROR); exit(0); } OSVERSIONINFOEXW ovi; memset(&ovi, 0, sizeof(ovi)); ovi.dwOSVersionInfoSize = sizeof(ovi); GetVersionEx(reinterpret_cast(&ovi)); bIsWin7 = (ovi.dwMajorVersion >= 7) || ((ovi.dwMajorVersion == 6) &&(ovi.dwBuildNumber >= 7100)); bIsVistaSP1 = (ovi.dwMajorVersion >= 7) || ((ovi.dwMajorVersion == 6) &&(ovi.dwBuildNumber >= 6001)); #if _MSC_VER == 1800 && defined(_M_X64) // Disable MSVC 2013's FMA-optimized math routines on Windows // versions earlier than Windows 8 (6.2). // There are various issues on OSes that do not support the newer // instructions. // See issue mumble-voip/mumble#1615. if (ovi.dwMajorVersion < 5 || (ovi.dwMajorVersion == 6 && ovi.dwMinorVersion <= 1)) { _set_FMA3_enable(0); } #endif unsigned int currentControl = 0; _controlfp_s(¤tControl, _DN_FLUSH, _MCW_DN); SetHeapOptions(); enableCrashOnCrashes(); mumble_speex_init(); // Make a copy of the global LogEmitter, such that // os_win.cpp doesn't have to consider the deletion // of the Global object and its LogEmitter object. le = g.le; #ifdef QT_NO_DEBUG QString console = g.qdBasePath.filePath(QLatin1String("Console.txt")); fConsole = _wfsopen(console.toStdWString().c_str(), L"a+", _SH_DENYWR); if (fConsole) { #if QT_VERSION >= 0x050000 qInstallMessageHandler(mumbleMessageOutputWithContext); #else qInstallMsgHandler(mumbleMessageOutput); #endif } QString hash; QFile f(qApp->applicationFilePath()); if (! f.open(QIODevice::ReadOnly)) { qWarning("VersionCheck: Failed to open binary"); } else { QByteArray a = f.readAll(); if (a.size() > 0) { QCryptographicHash qch(QCryptographicHash::Sha1); qch.addData(a); hash = QLatin1String(qch.result().toHex()); } } QString comment = QString::fromLatin1("%1\n%2\n%3").arg(QString::fromLatin1(MUMBLE_RELEASE), QString::fromLatin1(MUMTEXT(MUMBLE_VERSION_STRING)), hash); wcscpy_s(wcComment, DUMP_BUFFER_SIZE, comment.toStdWString().c_str()); musComment.Type = CommentStreamW; musComment.Buffer = wcComment; musComment.BufferSize = static_cast(wcslen(wcComment) * sizeof(wchar_t)); QString dump = g.qdBasePath.filePath(QLatin1String("mumble.dmp")); QFileInfo fi(dump); QDir::root().mkpath(fi.absolutePath()); if (wcscpy_s(wcCrashDumpPath, DUMP_BUFFER_SIZE, dump.toStdWString().c_str()) == 0) SetUnhandledExceptionFilter(MumbleUnhandledExceptionFilter); #endif g.qdBasePath.mkpath(QLatin1String("Snapshots")); if (bIsWin7) SetCurrentProcessExplicitAppUserModelID(L"net.sourceforge.mumble.Mumble"); } DWORD WinVerifySslCert(const QByteArray& cert) { DWORD errorStatus = -1; PCCERT_CONTEXT certContext = CertCreateCertificateContext(X509_ASN_ENCODING, reinterpret_cast(cert.constData()), cert.size()); if (!certContext) { return errorStatus; } LPCSTR usage[] = { szOID_PKIX_KP_SERVER_AUTH, szOID_SERVER_GATED_CRYPTO, szOID_SGC_NETSCAPE }; CERT_CHAIN_PARA chainParameter; memset(&chainParameter, 0, sizeof(CERT_CHAIN_PARA)); chainParameter.cbSize = sizeof(CERT_CHAIN_PARA); chainParameter.RequestedUsage.dwType = USAGE_MATCH_TYPE_OR; chainParameter.RequestedUsage.Usage.cUsageIdentifier = ARRAYSIZE(usage); chainParameter.RequestedUsage.Usage.rgpszUsageIdentifier = const_cast(usage); PCCERT_CHAIN_CONTEXT chainContext = NULL; CertGetCertificateChain(NULL, certContext, NULL, NULL, &chainParameter, 0, NULL, &chainContext); if (chainContext) { errorStatus = chainContext->TrustStatus.dwErrorStatus; CertFreeCertificateChain(chainContext); } CertFreeCertificateContext(certContext); return errorStatus; } mumble-1.3.4/src/mumble/UserModel.h0000664000175000017500000001211314010707273016757 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_USERMODEL_H_ #define MUMBLE_MUMBLE_USERMODEL_H_ #include #include #include #include #include class User; class ClientUser; class Channel; struct ModelItem Q_DECL_FINAL { friend class UserModel; private: Q_DISABLE_COPY(ModelItem) public: Channel *cChan; ClientUser *pUser; bool bCommentSeen; ModelItem *parent; QList qlChildren; QList qlHiddenChildren; /// Number of users in this channel (recursive) int iUsers; static QHash c_qhChannels; static QHash c_qhUsers; static bool bUsersTop; ModelItem(Channel *c); ModelItem(ClientUser *p); ModelItem(ModelItem *); ~ModelItem(); ModelItem *child(int idx) const; bool validRow(int idx) const; ClientUser *userAt(int idx) const; Channel *channelAt(int idx) const; int rowOf(Channel *c) const; int rowOf(ClientUser *p) const; int rowOfSelf() const; int rows() const; int insertIndex(Channel *c) const; int insertIndex(ClientUser *p) const; QString hash() const; void wipe(); }; class UserModel : public QAbstractItemModel { friend struct ModelItem; friend class UserView; private: Q_OBJECT Q_DISABLE_COPY(UserModel) protected: QIcon qiTalkingOn, qiTalkingWhisper, qiTalkingShout, qiTalkingOff; QIcon qiMutedPushToMute, qiMutedSelf, qiMutedServer, qiMutedLocal, qiIgnoredLocal, qiMutedSuppressed; QIcon qiPrioritySpeaker; QIcon qiRecording; QIcon qiDeafenedSelf, qiDeafenedServer; QIcon qiAuthenticated, qiChannel, qiLinkedChannel, qiActiveChannel; QIcon qiFriend; QIcon qiComment, qiCommentSeen, qiFilter; ModelItem *miRoot; QSet qsLinked; QMap qmHashes; bool bClicked; void recursiveClone(const ModelItem *old, ModelItem *item, QModelIndexList &from, QModelIndexList &to); ModelItem *moveItem(ModelItem *oldparent, ModelItem *newparent, ModelItem *item); QString stringIndex(const QModelIndex &index) const; public: UserModel(QObject *parent = 0); ~UserModel() Q_DECL_OVERRIDE; QModelIndex index(ClientUser *, int column = 0) const; QModelIndex index(Channel *, int column = 0) const; QModelIndex index(ModelItem *) const; QVariant data(const QModelIndex &index, int role) const Q_DECL_OVERRIDE; Qt::ItemFlags flags(const QModelIndex &index) const Q_DECL_OVERRIDE; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE; QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE; QModelIndex parent(const QModelIndex &index) const Q_DECL_OVERRIDE; int rowCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE; int columnCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE; Qt::DropActions supportedDropActions() const Q_DECL_OVERRIDE; QStringList mimeTypes() const Q_DECL_OVERRIDE; QMimeData *mimeData(const QModelIndexList &idx) const Q_DECL_OVERRIDE; bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex & parent) Q_DECL_OVERRIDE; ClientUser *addUser(unsigned int id, const QString &name); ClientUser *getUser(const QModelIndex &idx) const; ClientUser *getUser(const QString &hash) const; Channel *addChannel(int id, Channel *p, const QString &name); Channel *getChannel(const QModelIndex &idx) const; Channel *getSubChannel(Channel *p, int idx) const; void renameUser(ClientUser *p, const QString &name); void renameChannel(Channel *c, const QString &name); void repositionChannel(Channel *c, const int position); void setUserId(ClientUser *p, int id); void setHash(ClientUser *p, const QString &hash); void setFriendName(ClientUser *p, const QString &name); void setComment(ClientUser *p, const QString &comment); void setCommentHash(ClientUser *p, const QByteArray &hash); void seenComment(const QModelIndex &idx); void moveUser(ClientUser *p, Channel *c); void moveChannel(Channel *c, Channel *p); void setComment(Channel *c, const QString &comment); void setCommentHash(Channel *c, const QByteArray &hash); void removeUser(ClientUser *p); bool removeChannel(Channel *c, const bool onlyIfUnoccupied = false); void linkChannels(Channel *c, QList links); void unlinkChannels(Channel *c, QList links); void unlinkAll(Channel *c); void removeAll(); void expandAll(Channel *c); void collapseEmpty(Channel *c); QVariant otherRoles(const QModelIndex &idx, int role) const; unsigned int uiSessionComment; int iChannelDescription; public slots: /// Invalidates the model data of the ClientUser triggering this slot. void userStateChanged(); void ensureSelfVisible(); void recheckLinks(); void updateOverlay() const; void toggleChannelFiltered(Channel *c); }; #endif mumble-1.3.4/src/mumble/GKey.cpp0000664000175000017500000001345614010707273016265 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . /* SPECIFICATION * The code interfacing with the Logitech G-Keys DLL was implemented using the * following spec: * * The G-keys DLL lives in * "C:\Program Files\Logitech Gaming Software\SDK\G-key\x64\LogitechGkey.dll" for x64 and * "C:\Program Files\Logitech Gaming Software\SDK\G-key\x86\LogitechGkey.dll" for x86. * * Its location can also be read from the registry, using the following keys: * * x86: * "HKEY_CLASSES_ROOT\CLSID\{7bded654-f278-4977-a20f-6e72a0d07859}\ServerBinary" * * x64: * "HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{7bded654-f278-4977-a20f-6e72a0d07859}\ServerBinary" * * The registry keys are needed if a user installed the Logitech Gaming * Software in a non-standard location. * * The DLL has an init function, it's called "LogiGkeyInit". It takes a * pointer, but the parameter must always be NULL. The function returns a BOOL * as a status code. * * The DLL also has a shutdown function, called "LogiGkeyShutdown". It takes * no parameters and does not return anything. * * You can poll for button states with the DLL using the functions * "LogiGkeyIsMouseButtonPressed" and "LogiGkeyIsKeyboardGkeyPressed". * * The function "LogiGkeyIsMouseButtonPressed" takes a single int parameter, a * button number. Mouse button numbers run from 6 up to and including 20. The * function returns a BOOL that is true if the button is pressed, and false if * not. * * The function "LogiGkeyIsKeyboardGkeyPressed" takes two int parameters, a * button number and a mode number. Keyboard button numbers run from 1 up to * and including 29. The mode number can 1, 2 or 3. The mode checks the button * state in a specific mode. Typically, one queries all buttons for all modes, * so one ends up with 29*3 calls to the function. The function returns a BOOL * that is true if the button in the given mode is pressed, and false if not. * * There are also two functions, "LogiGkeyGetMouseButtonString" and * "LogiGkeyGetKeyboardGkeyString". They take the same parameters as the * polling functions above, but do not check whether the button is pressed or * not. Instead, they return the name of the button being queried as a pointer * to a NUL-terminated array of wchar_t's. Presumably, the pointer will be * NULL if the name cannot be retrieved or translated. */ /* USAGE * In order to use the gkeys on a logitech keyboard, any user must have the * Logitech Gaming Software version 8.55+ installed on their computer. Then * (re)start mumble. When mumble initializes the library, the LGS (Logitech * Gaming Software) will create a profile called "mumble", featuring the mumble * icon. In LGS, right click this icon, and select either "Set as Default" or * "Set as Persistent". (See "What are persistent and default profiles?" in the * LGS help by clicking on the "?" icon on the LGS window, or at * http://www.logitech.com/assets/51813/3/lgs-guide.pdf). If mumble is not set * as the default or persistent profile, then your keys will not be active * unless mumble is the active window. */ #include "mumble_pch.hpp" #include "GKey.h" #ifdef Q_CC_GNU #define RESOLVE(var) { var = reinterpret_cast<__typeof__(var)>(qlLogiGkey.resolve(#var)); bValid = bValid && (var != NULL); } #else #define RESOLVE(var) { * reinterpret_cast(&var) = static_cast(qlLogiGkey.resolve(#var)); bValid = bValid && (var != NULL); } #endif const QUuid GKeyLibrary::quMouse = QUuid(QString::fromLatin1(GKEY_MOUSE_GUID)); const QUuid GKeyLibrary::quKeyboard = QUuid(QString::fromLatin1(GKEY_KEYBOARD_GUID)); GKeyLibrary::GKeyLibrary() { QStringList alternatives; HKEY key = NULL; DWORD type = 0; WCHAR wcLocation[510]; DWORD len = 510; if (RegOpenKeyEx(GKEY_LOGITECH_DLL_REG_HKEY, GKEY_LOGITECH_DLL_REG_PATH, 0, KEY_READ, &key) == ERROR_SUCCESS) { LONG err = RegQueryValueEx(key, L"", NULL, &type, reinterpret_cast(wcLocation), &len); if (err == ERROR_SUCCESS && type == REG_SZ) { QString qsLocation = QString::fromUtf16(reinterpret_cast(wcLocation), len / 2); qWarning("GKeyLibrary: Found ServerBinary with libLocation = \"%s\", len = %lu", qPrintable(qsLocation), static_cast(len)); alternatives << qsLocation; } else { qWarning("GKeyLibrary: Error looking up ServerBinary (Error: 0x%lx, Type: 0x%lx, len: %lu)", static_cast(err), static_cast(type), static_cast(len)); } } alternatives << QString::fromLatin1(GKEY_LOGITECH_DLL_DEFAULT_LOCATION); foreach(const QString &lib, alternatives) { qlLogiGkey.setFileName(lib); if (qlLogiGkey.load()) { bValid = true; break; } } RESOLVE(LogiGkeyInit); RESOLVE(LogiGkeyShutdown); RESOLVE(LogiGkeyIsMouseButtonPressed); RESOLVE(LogiGkeyIsKeyboardGkeyPressed); RESOLVE(LogiGkeyGetMouseButtonString); RESOLVE(LogiGkeyGetKeyboardGkeyString); if (bValid) bValid = LogiGkeyInit(NULL); } GKeyLibrary::~GKeyLibrary() { if (LogiGkeyShutdown != NULL) LogiGkeyShutdown(); } bool GKeyLibrary::isValid() const { return bValid; } bool GKeyLibrary::isMouseButtonPressed(int button) { return LogiGkeyIsMouseButtonPressed(button); } bool GKeyLibrary::isKeyboardGkeyPressed(int key, int mode) { return LogiGkeyIsKeyboardGkeyPressed(key, mode); } QString GKeyLibrary::getMouseButtonString(int button) { return QString::fromWCharArray(LogiGkeyGetMouseButtonString(button)); } QString GKeyLibrary::getKeyboardGkeyString(int key, int mode) { return QString::fromWCharArray(LogiGkeyGetKeyboardGkeyString(key, mode)); } mumble-1.3.4/src/mumble/ASIOInput.ui0000664000175000017500000002640114010707273017026 0ustar builderbuilder ASIOConfig 0 0 506 434 ASIO Device selection Device qcbDevice 1 0 Device to use for microphone This chooses what device to query. You still need to actually query the device and select which channels to use. Query selected device This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Query Configure selected device This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Configure Capabilities Driver name 1 0 Qt::PlainText Buffer size 1 0 Qt::PlainText Configure input channels This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. Channels Qt::Horizontal 40 20 Microphone qlwMic 0 0 120 16777215 Qt::Vertical 20 40 30 16777215 <- 30 16777215 -> Qt::Vertical 20 40 Unused qlwUnused 0 0 120 16777215 Qt::Vertical 20 40 30 16777215 -> 30 16777215 <- Qt::Vertical 20 40 Speakers qlwSpeaker 0 0 120 16777215 Qt::Horizontal 40 20 MUComboBox QComboBox
widgets/MUComboBox.h
mumble-1.3.4/src/mumble/DirectSound.cpp0000664000175000017500000004142514010707273017646 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #define DIRECTSOUND_VERSION 0x1000 #include #include #include #include #include "DirectSound.h" #include "MainWindow.h" #include "Plugins.h" #include "User.h" #include "Global.h" // from os_win.cpp extern HWND mumble_mw_hwnd; #undef FAILED #define FAILED(Status) (static_cast(Status)<0) // #define MY_DEFERRED DS3D_DEFERRED #define MY_DEFERRED DS3D_IMMEDIATE #define NBLOCKS 50 class DXAudioOutputRegistrar : public AudioOutputRegistrar { public: DXAudioOutputRegistrar(); virtual AudioOutput *create(); virtual const QList getDeviceChoices(); virtual void setDeviceChoice(const QVariant &, Settings &); }; class DXAudioInputRegistrar : public AudioInputRegistrar { public: DXAudioInputRegistrar(); virtual AudioInput *create(); virtual const QList getDeviceChoices(); virtual void setDeviceChoice(const QVariant &, Settings &); virtual bool canEcho(const QString &) const; }; class DirectSoundInit : public DeferInit { DXAudioInputRegistrar *airReg; DXAudioOutputRegistrar *aorReg; public: DirectSoundInit() : airReg(NULL), aorReg(NULL) {} void initialize(); void destroy(); }; static DirectSoundInit dsinit; void DirectSoundInit::initialize() { airReg = NULL; aorReg = NULL; #ifdef USE_WASAPI OSVERSIONINFOEXW ovi; memset(&ovi, 0, sizeof(ovi)); ovi.dwOSVersionInfoSize=sizeof(ovi); GetVersionEx(reinterpret_cast(&ovi)); #ifdef QT_NO_DEBUG if ((ovi.dwMajorVersion > 6) || ((ovi.dwMajorVersion == 6) && (ovi.dwBuildNumber >= 6001))) { HMODULE hLib = LoadLibrary(L"AVRT.DLL"); if (hLib != NULL) { FreeLibrary(hLib); qWarning("DirectSound: Disabled as WASAPI is available"); return; } } #endif #endif airReg = new DXAudioInputRegistrar(); aorReg = new DXAudioOutputRegistrar(); } void DirectSoundInit::destroy() { delete airReg; delete aorReg; } DXAudioOutputRegistrar::DXAudioOutputRegistrar() : AudioOutputRegistrar(QLatin1String("DirectSound")) { } AudioOutput *DXAudioOutputRegistrar::create() { return new DXAudioOutput(); } typedef QPair dsDevice; static BOOL CALLBACK DSEnumProc(LPGUID lpGUID, const WCHAR* lpszDesc, const WCHAR*, void *ctx) { if (lpGUID) { QList *l =reinterpret_cast *>(ctx); *l << dsDevice(QString::fromUtf16(reinterpret_cast(lpszDesc)), *lpGUID); } return(true); } const QList DXAudioOutputRegistrar::getDeviceChoices() { QList qlOutput; qlOutput << dsDevice(DXAudioOutput::tr("Default DirectSound Voice Output"), DSDEVID_DefaultVoicePlayback); DirectSoundEnumerate(DSEnumProc, reinterpret_cast(&qlOutput)); QList qlReturn; const GUID *lpguid = NULL; if (! g.s.qbaDXOutput.isEmpty()) { lpguid = reinterpret_cast(g.s.qbaDXOutput.data()); } else { lpguid = &DSDEVID_DefaultVoicePlayback; } foreach(dsDevice d, qlOutput) { if (d.second == *lpguid) { qlReturn << audioDevice(d.first, QByteArray(reinterpret_cast(&d.second), sizeof(GUID))); } } foreach(dsDevice d, qlOutput) { if (d.second != *lpguid) { qlReturn << audioDevice(d.first, QByteArray(reinterpret_cast(&d.second), sizeof(GUID))); } } return qlReturn; } void DXAudioOutputRegistrar::setDeviceChoice(const QVariant &choice, Settings &s) { s.qbaDXOutput = choice.toByteArray(); } DXAudioInputRegistrar::DXAudioInputRegistrar() : AudioInputRegistrar(QLatin1String("DirectSound")) { } AudioInput *DXAudioInputRegistrar::create() { return new DXAudioInput(); } const QList DXAudioInputRegistrar::getDeviceChoices() { QList qlInput; qlInput << dsDevice(DXAudioInput::tr("Default DirectSound Voice Input"), DSDEVID_DefaultVoiceCapture); DirectSoundCaptureEnumerate(DSEnumProc, reinterpret_cast(&qlInput)); QList qlReturn; const GUID *lpguid = NULL; if (! g.s.qbaDXInput.isEmpty()) { lpguid = reinterpret_cast(g.s.qbaDXInput.data()); } else { lpguid = &DSDEVID_DefaultVoiceCapture; } foreach(dsDevice d, qlInput) { if (d.second == *lpguid) { qlReturn << audioDevice(d.first, QByteArray(reinterpret_cast(&d.second), sizeof(GUID))); } } foreach(dsDevice d, qlInput) { if (d.second != *lpguid) { qlReturn << audioDevice(d.first, QByteArray(reinterpret_cast(&d.second), sizeof(GUID))); } } return qlReturn; } void DXAudioInputRegistrar::setDeviceChoice(const QVariant &choice, Settings &s) { s.qbaDXInput = choice.toByteArray(); } bool DXAudioInputRegistrar::canEcho(const QString &) const { return false; } DXAudioOutput::DXAudioOutput() { } DXAudioOutput::~DXAudioOutput() { bRunning = false; wait(); } void DXAudioOutput::run() { HRESULT hr; DSBUFFERDESC dsbdesc; WAVEFORMATEXTENSIBLE wfx; WAVEFORMATEXTENSIBLE wfxSet; int ns = 0; unsigned int chanmasks[32]; LPDIRECTSOUND8 pDS = NULL; LPDIRECTSOUNDBUFFER pDSBPrimary = NULL; LPDIRECTSOUNDBUFFER pDSBOutput = NULL; LPDIRECTSOUNDNOTIFY pDSNotify = NULL; int iLastwriteblock; LPVOID aptr1, aptr2; DWORD nbytes1, nbytes2; int playblock; int nowriteblock; DWORD dwPlayPosition, dwWritePosition; unsigned int iByteSize; bool bOk; DWORD dwSpeakerConfig; bool failed = false; bOk = false; DWORD dwMask = 0; bool bHead = false; ZeroMemory(&dsbdesc, sizeof(DSBUFFERDESC)); dsbdesc.dwSize = sizeof(DSBUFFERDESC); dsbdesc.dwFlags = DSBCAPS_PRIMARYBUFFER; if (! g.s.qbaDXOutput.isEmpty()) { LPGUID lpguid = reinterpret_cast(g.s.qbaDXOutput.data()); if (FAILED(hr = DirectSoundCreate8(lpguid, &pDS, NULL))) { failed = true; } } if (! pDS && FAILED(hr = DirectSoundCreate8(&DSDEVID_DefaultVoicePlayback, &pDS, NULL))) { qWarning("DXAudioOutput: DirectSoundCreate failed: hr=0x%08lx", hr); goto cleanup; } else if (FAILED(hr = pDS->SetCooperativeLevel(mumble_mw_hwnd, DSSCL_PRIORITY))) { qWarning("DXAudioOutput: SetCooperativeLevel failed: hr=0x%08lx", hr); goto cleanup; } else if (FAILED(hr = pDS->CreateSoundBuffer(&dsbdesc, &pDSBPrimary, NULL))) { qWarning("DXAudioOutput: CreateSoundBuffer (Primary) failed: hr=0x%08lx", hr); goto cleanup; } pDS->GetSpeakerConfig(&dwSpeakerConfig); switch (DSSPEAKER_CONFIG(dwSpeakerConfig)) { case DSSPEAKER_HEADPHONE: dwMask = KSAUDIO_SPEAKER_STEREO; bHead = true; break; case DSSPEAKER_MONO: dwMask = KSAUDIO_SPEAKER_MONO; break; case DSSPEAKER_QUAD: dwMask = KSAUDIO_SPEAKER_QUAD; break; case DSSPEAKER_STEREO: dwMask = KSAUDIO_SPEAKER_STEREO; break; case DSSPEAKER_SURROUND: dwMask = KSAUDIO_SPEAKER_SURROUND; break; case DSSPEAKER_5POINT1: dwMask = KSAUDIO_SPEAKER_5POINT1; break; case DSSPEAKER_7POINT1: dwMask = KSAUDIO_SPEAKER_7POINT1; break; case DSSPEAKER_7POINT1_SURROUND: dwMask = KSAUDIO_SPEAKER_7POINT1_SURROUND; break; case DSSPEAKER_5POINT1_SURROUND: dwMask = KSAUDIO_SPEAKER_5POINT1_SURROUND; break; default: dwMask = 0; break; } if (! g.s.doPositionalAudio()) dwMask = KSAUDIO_SPEAKER_STEREO; for (int i=0;i<32;i++) { if (dwMask & (1 << i)) { chanmasks[ns++] = 1 << i; } } iMixerFreq = SAMPLE_RATE; iChannels = ns; eSampleFormat = SampleShort; iByteSize = iFrameSize * sizeof(short) * ns; ZeroMemory(&wfxSet, sizeof(wfxSet)); wfxSet.Format.wFormatTag = WAVE_FORMAT_PCM; ZeroMemory(&wfx, sizeof(wfx)); wfx.Format.wFormatTag = WAVE_FORMAT_PCM; wfx.Format.nChannels = qMax(ns, 2); wfx.Format.nSamplesPerSec = SAMPLE_RATE; wfx.Format.nBlockAlign = sizeof(short) * wfx.Format.nChannels; wfx.Format.nAvgBytesPerSec = wfx.Format.nSamplesPerSec * wfx.Format.nBlockAlign; wfx.Format.wBitsPerSample = 16; if (FAILED(hr = pDSBPrimary->SetFormat(reinterpret_cast(&wfx)))) { qWarning("DXAudioOutput: SetFormat failed: hr=0x%08lx", hr); goto cleanup; } if (FAILED(hr = pDSBPrimary->GetFormat(reinterpret_cast(&wfxSet), sizeof(wfxSet), NULL))) { qWarning("DXAudioOutput: GetFormat failed: hr=0x%08lx", hr); goto cleanup; } qWarning("DXAudioOutput: Primary buffer of %ld Hz, %d channels, %d bits",wfxSet.Format.nSamplesPerSec,wfxSet.Format.nChannels,wfxSet.Format.wBitsPerSample); ZeroMemory(&wfx, sizeof(wfx)); wfx.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; wfx.Format.nChannels = qMax(ns, 2); wfx.Format.nSamplesPerSec = SAMPLE_RATE; wfx.Format.nBlockAlign = sizeof(short) * wfx.Format.nChannels; wfx.Format.nAvgBytesPerSec = wfx.Format.nSamplesPerSec * wfx.Format.nBlockAlign; wfx.Format.wBitsPerSample = 16; wfx.Format.cbSize = 32; wfx.Samples.wValidBitsPerSample = wfx.Format.wBitsPerSample; wfx.dwChannelMask = dwMask; wfx.SubFormat = KSDATAFORMAT_SUBTYPE_PCM; ZeroMemory(&dsbdesc, sizeof(DSBUFFERDESC)); dsbdesc.dwSize = sizeof(DSBUFFERDESC); dsbdesc.dwFlags = DSBCAPS_GLOBALFOCUS|DSBCAPS_GETCURRENTPOSITION2; dsbdesc.dwFlags |= DSBCAPS_CTRLPOSITIONNOTIFY; dsbdesc.dwBufferBytes = wfx.Format.nChannels * iFrameSize * sizeof(short) * NBLOCKS; dsbdesc.lpwfxFormat = reinterpret_cast(&wfx); if (FAILED(hr = pDS->CreateSoundBuffer(&dsbdesc, &pDSBOutput, NULL))) { qWarning("DXAudioOutputUser: CreateSoundBuffer (Secondary) failed: hr=0x%08lx", hr); goto cleanup; } if (FAILED(hr = pDSBOutput->QueryInterface(IID_IDirectSoundNotify, reinterpret_cast(&pDSNotify)))) { qWarning("DXAudioOutputUser: QueryInterface (Notify) failed: hr=0x%08lx", hr); goto cleanup; } qWarning("DXAudioOutputUser: New %dHz output buffer of %ld bytes", SAMPLE_RATE, dsbdesc.dwBufferBytes); if (failed) g.mw->msgBox(tr("Opening chosen DirectSound Output failed. Default device will be used.")); initializeMixer(chanmasks, bHead); if (FAILED(hr = pDSBOutput->Lock(0, 0, &aptr1, &nbytes1, &aptr2, &nbytes2, DSBLOCK_ENTIREBUFFER))) { qWarning("DXAudioOutputUser: Initial Lock failed: hr=0x%08lx", hr); goto cleanup; } if (aptr1) ZeroMemory(aptr1, nbytes1); if (aptr2) ZeroMemory(aptr2, nbytes2); if (FAILED(hr = pDSBOutput->Unlock(aptr1, nbytes1, aptr2, nbytes2))) { qWarning("DXAudioOutputUser: Initial Unlock failed: hr=0x%08lx", hr); goto cleanup; } if (FAILED(hr = pDSBOutput->Play(0, 0, DSBPLAY_LOOPING))) { qWarning("DXAudioOutputUser: Play failed: hr=0x%08lx", hr); goto cleanup; } iLastwriteblock = (NBLOCKS - 1 + g.s.iOutputDelay) % NBLOCKS; bOk = true; while (bRunning && ! FAILED(hr)) { if (FAILED(hr = pDSBOutput->GetCurrentPosition(&dwPlayPosition, &dwWritePosition))) { qWarning("DXAudioOutputUser: GetCurrentPosition failed: hr=0x%08lx", hr); break; } playblock = dwWritePosition / iByteSize; nowriteblock = (playblock + g.s.iOutputDelay + 1) % NBLOCKS; for (int block=(iLastwriteblock + 1) % NBLOCKS;(!FAILED(hr)) && (block!=nowriteblock);block=(block + 1) % NBLOCKS) { iLastwriteblock = block; if (FAILED(hr = pDSBOutput->Lock(block * iByteSize, iByteSize, &aptr1, &nbytes1, &aptr2, &nbytes2, 0))) { qWarning("DXAudioOutput: Lock block %u (%d bytes) failed: hr=0x%08lx",block, iByteSize, hr); break; } if (aptr2 || nbytes2) { qWarning("DXAudioOutput: Split buffer"); break; } if (!aptr1 || ! nbytes1) { qWarning("DXAudioOutput: Zerolock"); break; } if (! mix(reinterpret_cast(aptr1), iFrameSize)) ZeroMemory(aptr1, iByteSize); if (FAILED(hr = pDSBOutput->Unlock(aptr1, nbytes1, aptr2, nbytes2))) { qWarning("DXAudioOutput: Unlock %p(%lu) %p(%lu) failed: hr=0x%08lx",aptr1,nbytes1,aptr2,nbytes2,hr); break; } if (FAILED(hr = pDSBOutput->GetCurrentPosition(&dwPlayPosition, &dwWritePosition))) { qWarning("DXAudioOutputUser: GetCurrentPosition failed: hr=0x%08lx", hr); break; } playblock = dwWritePosition / iByteSize; nowriteblock = (playblock + g.s.iOutputDelay + 1) % NBLOCKS; } if (! FAILED(hr)) msleep(19); } if (FAILED(hr)) { g.mw->msgBox(tr("Lost DirectSound output device.")); } cleanup: if (! bOk) { g.mw->msgBox(tr("Opening chosen DirectSound Output failed. No audio will be heard.")); return; } if (pDSNotify) pDSNotify->Release(); if (pDSBOutput) { pDSBOutput->Stop(); pDSBOutput->Release(); } if (pDSBPrimary) pDSBPrimary->Release(); if (pDS) pDS->Release(); } #define NBUFFBLOCKS 50 DXAudioInput::DXAudioInput() { } DXAudioInput::~DXAudioInput() { bRunning = false; wait(); } void DXAudioInput::run() { LPDIRECTSOUNDCAPTURE8 pDSCapture; LPDIRECTSOUNDCAPTUREBUFFER pDSCaptureBuffer; LPDIRECTSOUNDNOTIFY pDSNotify; DWORD dwBufferSize; bool bOk; DWORD dwReadPosition; DWORD dwCapturePosition; LPVOID aptr1, aptr2; DWORD nbytes1, nbytes2; HRESULT hr; WAVEFORMATEX wfx; DSCBUFFERDESC dscbd; pDSCapture = NULL; pDSCaptureBuffer = NULL; pDSNotify = NULL; bOk = false; bool failed = false; Timer t; ZeroMemory(&wfx, sizeof(wfx)); wfx.wFormatTag = WAVE_FORMAT_PCM; ZeroMemory(&dscbd, sizeof(dscbd)); dscbd.dwSize = sizeof(dscbd); dscbd.dwBufferBytes = dwBufferSize = iFrameSize * sizeof(short) * NBUFFBLOCKS; dscbd.lpwfxFormat = &wfx; wfx.nChannels = 1; wfx.nSamplesPerSec = iSampleRate; wfx.nBlockAlign = 2; wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign; wfx.wBitsPerSample = 16; // Create IDirectSoundCapture using the preferred capture device if (! g.s.qbaDXInput.isEmpty()) { LPGUID lpguid = reinterpret_cast(g.s.qbaDXInput.data()); if (FAILED(hr = DirectSoundCaptureCreate8(lpguid, &pDSCapture, NULL))) { failed = true; } } if (! pDSCapture && FAILED(hr = DirectSoundCaptureCreate8(&DSDEVID_DefaultVoiceCapture, &pDSCapture, NULL))) qWarning("DXAudioInput: DirectSoundCaptureCreate failed: hr=0x%08lx", hr); else if (FAILED(hr = pDSCapture->CreateCaptureBuffer(&dscbd, &pDSCaptureBuffer, NULL))) qWarning("DXAudioInput: CreateCaptureBuffer failed: hr=0x%08lx", hr); else if (FAILED(hr = pDSCaptureBuffer->QueryInterface(IID_IDirectSoundNotify, reinterpret_cast(&pDSNotify)))) qWarning("DXAudioInput: QueryInterface (Notify) failed: hr=0x%08lx", hr); else bOk = true; if (failed) g.mw->msgBox(tr("Opening chosen DirectSound Input failed. Default device will be used.")); qWarning("DXAudioInput: Initialized"); if (! bOk) goto cleanup; if (FAILED(hr = pDSCaptureBuffer->Start(DSCBSTART_LOOPING))) { qWarning("DXAudioInput: Start failed: hr=0x%08lx", hr); } else { DWORD dwReadyBytes = 0; DWORD dwLastReadPos = 0; float safety = 2.0f; while (bRunning) { bool firstsleep = true; bool didsleep = false; do { if (FAILED(hr = pDSCaptureBuffer->GetCurrentPosition(&dwCapturePosition, &dwReadPosition))) { qWarning("DXAudioInput: GetCurrentPosition failed: hr=0x%08lx", hr); bRunning = false; break; } if (dwReadPosition < dwLastReadPos) dwReadyBytes = (dwBufferSize - dwLastReadPos) + dwReadPosition; else dwReadyBytes = dwReadPosition - dwLastReadPos; if (static_cast(dwReadyBytes) < sizeof(short) * iFrameSize) { double msecleft = 20.0 - (dwReadyBytes * 20.0) / (sizeof(short) * iFrameSize); if (didsleep) safety *= 1.1f; else if (firstsleep) safety *= 0.998f; int msec = static_cast(msecleft + (firstsleep ? safety : 0.0)); msleep(msec); didsleep = true; firstsleep = false; } } while (static_cast(dwReadyBytes) < sizeof(short) * iFrameSize); // Desynchonized? if (dwReadyBytes > (dwBufferSize / 2)) { qWarning("DXAudioInput: Lost synchronization"); dwLastReadPos = dwReadPosition; } else if (bRunning) { if (FAILED(hr = pDSCaptureBuffer->Lock(dwLastReadPos, sizeof(short) * iFrameSize, &aptr1, &nbytes1, &aptr2, &nbytes2, 0))) { qWarning("DXAudioInput: Lock from %lu (%zu bytes) failed: hr=0x%08lx", static_cast(dwLastReadPos), sizeof(short) * iFrameSize, hr); bRunning = false; break; } if (aptr1 && nbytes1) CopyMemory(psMic, aptr1, nbytes1); if (aptr2 && nbytes2) CopyMemory(psMic+nbytes1/2, aptr2, nbytes2); if (FAILED(hr = pDSCaptureBuffer->Unlock(aptr1, nbytes1, aptr2, nbytes2))) { qWarning("DXAudioInput: Unlock failed: hr=0x%08lx", hr); bRunning = false; break; } dwLastReadPos = (dwLastReadPos + sizeof(short) * iFrameSize) % dwBufferSize; encodeAudioFrame(); } } if (! FAILED(hr)) pDSCaptureBuffer->Stop(); } if (FAILED(hr)) { g.mw->msgBox(tr("Lost DirectSound input device.")); } cleanup: if (! bOk) { g.mw->msgBox(tr("Opening chosen DirectSound Input device failed. No microphone capture will be done.")); } if (pDSNotify) pDSNotify->Release(); if (pDSCaptureBuffer) pDSCaptureBuffer->Release(); if (pDSCapture) pDSCapture->Release(); } mumble-1.3.4/src/mumble/UserLocalVolumeDialog.h0000664000175000017500000000563514010707273021274 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . /* Copyright (C) 2015, Fredrik Nordin All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Mumble Developers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef MUMBLE_MUMBLE_USERVOLUME_H_ #define MUMBLE_MUMBLE_USERVOLUME_H_ #include #include "ui_UserLocalVolumeDialog.h" #include "ClientUser.h" class UserLocalVolumeDialog : public QDialog, private Ui::UserLocalVolumeDialog { Q_OBJECT Q_DISABLE_COPY(UserLocalVolumeDialog); /// The session ID for the user that the dialog is changing the volume for. unsigned int m_clientSession; /// The user's original adjustment (in dB) when entering the dialog. int m_originalVolumeAdjustmentDecibel; QMap *m_qmUserVolTracker; public slots: void closeEvent(QCloseEvent *event); void on_qsUserLocalVolume_valueChanged(int value); void on_qsbUserLocalVolume_valueChanged(int value); void on_qbbUserLocalVolume_clicked(QAbstractButton *b); void reject(); public: static void present(unsigned int sessionId, QMap *qmUserVolTracker); UserLocalVolumeDialog(unsigned int sessionId, QMap *qmUserVolTracker); }; #endif mumble-1.3.4/src/mumble/CrashReporter.h0000664000175000017500000000216714010707273017653 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_CRASHREPORTER_H_ #define MUMBLE_MUMBLE_CRASHREPORTER_H_ #include #include #include #if QT_VERSION >= 0x050000 # include # include # include # include #else # include # include # include # include #endif class CrashReporter : QDialog { Q_OBJECT Q_DISABLE_COPY(CrashReporter) public: CrashReporter(QWidget *p = 0); ~CrashReporter() Q_DECL_OVERRIDE; void run(); protected: QEventLoop *qelLoop; QProgressDialog *qpdProgress; QNetworkReply *qnrReply; QLineEdit *qleEmail; QTextEdit *qteDescription; public slots: void uploadFinished(); void uploadProgress(qint64, qint64); }; #else class CrashReporter; #endif mumble-1.3.4/src/mumble/UserListModel.h0000664000175000017500000000662614010707273017627 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_USERLISTMODEL_H_ #define MUMBLE_MUMBLE_USERLISTMODEL_H_ #include #include #include #include #include #include #include #include #include #include #include "Mumble.pb.h" /// /// The UserListModel class provides a table model backed by a UserList protobuf structure. /// It supports removing rows and editing user nicks. /// class UserListModel : public QAbstractTableModel { Q_OBJECT public: /// Enumerates the columns in the table model enum Columns { COL_NICK, COL_INACTIVEDAYS, COL_LASTCHANNEL, COUNT_COL }; /// UserListModel constructs a table model representing the userList. /// @param userList User list protobuf structure (will be copied) /// @param parent Parent in QObject hierarchy UserListModel(const MumbleProto::UserList& userList, QObject *parent = NULL); int rowCount(const QModelIndex &parentIndex = QModelIndex()) const Q_DECL_OVERRIDE; int columnCount(const QModelIndex &parentIndex = QModelIndex()) const Q_DECL_OVERRIDE; QVariant headerData(int section, Qt::Orientation orientation, int role) const Q_DECL_OVERRIDE; QVariant data(const QModelIndex &dataIndex, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE; bool setData(const QModelIndex &dataIndex, const QVariant &value, int role) Q_DECL_OVERRIDE; Qt::ItemFlags flags(const QModelIndex &flagIndex) const Q_DECL_OVERRIDE; bool removeRows(int row, int count, const QModelIndex &parentIndex = QModelIndex()) Q_DECL_OVERRIDE; /// Function for removing all rows in a selection void removeRowsInSelection(const QItemSelection &selection); /// Returns a message for updating the original server state to the current model state. MumbleProto::UserList getUserListUpdate() const; /// Returns true if the UserList given during construction was changed. bool isUserListDirty() const; /// Returns true if the model only contains COL_NICK (true for Mumble <= 1.2.4) bool isLegacy() const; private: /// Given an ISO formatted UTC time string returns the number of days since then. /// @return QVariant() is returned for invalid strings. QVariant lastSeenToTodayDayCount(const std::string& lastSeenDate) const; /// Returns a textual representation of the channel hierarchy of the given channel QString pathForChannelId(const int channelId) const; /// Converts a ISO formatted UTC time string to a QDateTime object. QDateTime isoUTCToDateTime(const std::string& isoTime) const; typedef QList ModelUserList; /// Model backend for user data ModelUserList m_userList; typedef QHash< ::google::protobuf::uint32, MumbleProto::UserList_User> ModelUserListChangeMap; /// Change map indexed by user id ModelUserListChangeMap m_changes; /// True if the message given on construction lacked column data (true for murmur <= 1.2.4) bool m_legacyMode; /// Cache for lastSeenToTodayDayCount mutable QHash m_stringToLastSeenToTodayCount; /// Cache for pathForChannelId conversions mutable QHash m_channelIdToPathMap; }; #endif // MUMBLE_MUMBLE_USERLISTMODEL_H_ mumble-1.3.4/src/mumble/mumble_ko.ts0000664000175000017500000131115014010707274017236 0ustar builderbuilder ACLEditor Deny 금지 Allow 허가 Allow %1 %1를 허가합니다. Deny %1 %1을 금지합니다. Mumble - Add channel Mumble - 채널을 추가 Default server value 기본 서버 수 Failed: Invalid channel 실패: 무효한 채널 Mumble - Edit %1 Mumble - %1을 편집 ID: %1 ID: %1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 %1에 특권을 부여합니다. 특권 허가와 금지가 모두 설정되어 있는 경우, 금지됩니다.<br/>%2 Channel must have a name 반드시 채널에 이름을 넣어주세요. This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 %1에 특권을 박탈합니다. 특권 허가와 금지가 모두 설정되어 있는 경우, 금지됩니다.<br/>%2 Dialog 대화 상자 Name 이름 Enter the channel name here. 여기에 채널 이름을 넣으세요. Description 설명 Password 비밀번호 Enter the channel password here. 여기에 채널 비밀번호를 넣으세요. Check to create a temporary channel. 일시적으로 채널을 만드는 경우에 체크하세요. Temporary 일시적 채널 <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>포지션</b><br/> 이 값을 설정함으로써 이 채널 트리의 순서를 변경할 수 있습니다. 더 높은<i>포지션</i>값을 가진 채널은 지속적으로 더 낮은 값을 가진 채널보다 아래에 표시됩니다. 또한 2개 채널의<i>포지션</i> 값이 동일하다면 그 채널 이름들의 사전 순으로 정렬됩니다. Position 포지션 &Groups 그룹(&G) Group 그룹 List of groups 그룹 목록 Remove selected group 선택한 그룹 삭제 Remove 삭제 Inherit group members from parent 원본 그룹으로 부터 그룹 멤버를 계승한다. Inherit 원본 Make group inheritable to sub-channels 서브 채널에 대해 그룹 계승을 가능하게 한다. Inheritable 계승 가능 Group was inherited from parent channel 원본 채널에서 계승한 그룹 Inherited 계승 후 Members 멤버 Add 추가 Add member to group 그룹에 멤버를 추가한다. Remove member from group 그룹에서 멤버를 삭제한다. &ACL &ACL Active ACLs ACLs을 활성화 List of entries 항목 리스트 Inherit ACL of parent? 원본 채널 ACL을 계승합니까? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. 이는 원본 채널의 체인에 대한 ACL을 적용할지 여부에 관계 없이 설정이 됩니다. 원본 채널에서 "서브 채널에 적용한다 "에 체크된 항목만 계승됩니다 Inherit ACLs ACLs를 계승한다. Move entry up 항목을 위로 이동 This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. 목록 내의 항목을 위로 움직입니다. 항목이 적절히 평가되면 사용자에 영향이 미치는 권한이 변경될 수 있습니다. 계승된 항목 위로는 움직일 수 없습니다. 절대 필요시에는 계승된 항목을 복제할 필요가 있습니다. &Up &위로 Move entry down 항목을 아래로 이동 This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. 목록 내의 항목을 아래로 움직입니다. 항목이 적절히 평가되면 사용자에 영향이 미치는 권한이 변경될 수 있습니다. &Down 아래로(&D) Add new entry 항목을 새로 추가한다. This adds a new entry, initially set with no permissions and applying to all. 새 항목을 작성합니다. 초기 상태는 퍼미션 없이 모두 적용됩니다. &Add 추가(&A) Remove entry 항목 삭제 This removes the currently selected entry. 선택되어 있는 항목을 삭제합니다. &Remove 삭제(&R) Context 컨텍스트 Entry should apply to this channel. Entry should apply to this channel 입력한 항목은 이 채널에 적용됩니다. This makes the entry apply to this channel. 항목을 이 채널에 적용합니다. Applies to this channel 이 채널에 적용한다. Entry should apply to sub-channels. 입력된 항목은 서브 채널에 적용됩니다. Add new group 새로운 그룹을 추가한다. <b>Add</b><br/> Add a new group. <b>추가</b><br/> 새로운 그룹을 추가한다. Inherited members 계승 후 멤버 Contains the list of members added to the group by this channel. 이 채널의 그룹에 추가된 멤버 목록 입니다. Contains a list of members whose group membership will not be inherited from the parent channel. 원본 채널에서 계승되지 않는 그룹의 멤버 목록 입니다. Contains the list of members inherited by other channels. 다른 채널에서 계승된 멤버 목록입니다. Type in the name of a user you wish to add to the group and click Add. 그룹에 추가하고자 하는 사용자 이름을 입력하고 추가를 클릭하세요. Type in the name of a user you wish to remove from the group and click Add. 그룹에서 삭제하고자 하는 사용자 이름을 입력하고 추가를 클릭하세요. Exclude 제외 Excluded members 제외된 멤버 This makes the entry apply to sub-channels of this channel. 항목을 이 채널의 서브 채널에 적용합니다. Applies to sub-channels 서브 채널에 적용합니다. Permissions 퍼미션 User/Group 유저/그룹 Group this entry applies to 이 항목을 적용하는 그룹입니다. User ID 유저 ID User this entry applies to 이 항목을 적용하는 사용자 This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. 이 항목이 어느 유저에 적용되는지를 설정 합니다. 검색하려면 사용자 명을 입력하여 Enter키를 누르세요. &Properties 속성 <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>채널 이름</b><br/>이 필드에 경로 이름을 입력해 주세요. 채널 이름은 접속해 있는 서버에 따를 필요가 있습니다. <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>일시적 채널</b><br/> 체크하여 채널을 만들면 일시로 개설 됩니다. 마지막으로 남아 있던 사용자가 채널을 벗어나면 서버에 의해 자동적으로 그 채널이 삭제됩니다. <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>그룹</b><br/> 이 채널에서 현재 정의되는 모든 그룹입니다. 새로운 그룹을 만들려면 그룹 이름을 입력하여 Enter키를 누르세요. <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>삭제</b><br/>현재 선택되어 있는 그룹을 삭제합니다. 만약 그룹이 계승되어 있으면 명단에서 삭제되지 않습니다. 하지만 그룹에 대한 부분적 모든 정보는 제거됩니다. <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>계승</b><br/>그룹이 원본 채널에서<i>계승 가능</i>으로 설정되어 있다면 해당 그룹의 모든 멤버는 계승됩니다. <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>계승 가능</b><br/>이 그룹이 서브 채널에 계승이 가능함을 의미합니다. 그룹이 계승이 불가능 하다면, 서브 채널은 같은 이름의 새 그룹을 자유롭게 만들 수 있습니다. <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>계승 후</b>그룹이 원본 경로로 계승되었음을 의미합니다. 이 플래그는 단지 정보이므로 편집할 수 없습니다. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>멤버</b><br/> 이 명단은 현재 채널의 그룹에 추가된 모든 멤버를 포함합니다. 보다 높은 경로에서 계승된 멤버는 포함시키지 않기 때문에 주의하세요. 구성원은<i>계승 후 멤버</i>의 목록에서 확인할 수 있습니다. 이 보다 낮은 계층의 채널에서 이 리스트를 계승시키고 싶지 않은 경우는<i>계승 가능</i>의 체크를 해제하거나 수동으로<i>제외 멤버</i>명단에 멤버를 추가해 주세요. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>제외 멤버</b><br/> 원본 채널에 계승되지 않는 그룹의 멤버 리스트를 포함. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. <b>계승 후 멤버</b><br/> 현재 채널로 계승된 멤버 목록입니다. 보다 높은 계층의 채널에서 계승을 원하지 않는다면<i>계승</i>을 체크 해제하세요. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. 이 항목이 어느 사용자 그룹에 적용 되는지 설정 합니다. 그룹은 항목이 사용 되는 채널의 컨텍스트와 같이 평가됩니다. 예를 들면 Root경로상의 기본 ACL은<i>쓰기</i>권한을<i>관리자</i>그룹에 부여 되어 있습니다. 이 항목이 만약에 채널로 계승 되고 없다면 비록 그 ACL에 원본이 되는 채널<i>관리자</i>그룹에 속해 있지 않아도<i>관리자</i>그룹에 그 채널에 소속한다면 사용자의 권한을 주게 됩니다. 그룹 이름이 !에서 시작되고 있으면 그 구성원은 거부 됩니다. 그리고 ~부터 시작이 된다면 그 채널 에서 유효한 ACL보다 채널의 ACL의 정의가 된 곳이 우선시 됩니다. 그룹 이름이 #로 시작 되는 경우에는 액세스 토큰으로 인식 합니다. 사용자는 액세스 토큰 목록 속에 #후에 이어지는 문자열을 가지고 있어야 합니다. 이것은 비인증 사용자에 대해 단순한 패스워드 방법으로 이용할 수 있습니다. 그룹 이름이 $로 시작될 경우 $에 이어 문자열이 사용자 증명서의 해시와 같은 경우입니다. 특별히 부여된 그룹은 다음과 같습니다.<br/><b>All</b>-모두 매치 시킨다<br/><b>Auth</b>-인증된 모든 사용자에게 매치 시킨다<br/><b>sub, a, b, c</b>-서브 채널<i>a</i><i>b</i><i>c</i>최소<i>a</i>개의 공통의 원본 채널을 두고 체인 아래쪽 <i>b</i>개 에서 <i>c개</i>사이의 서브 채널 유저에게 매치합니다. 이 항목에 대해서 보다 많은 문서를 보기 원한다면 공식 사이트를 확인 해 주세요.<b>in</b>-현재 채널에 있는 모든 사용자에게 매치(이는<i>sub, 0,0,0</i>의 간이적인 표기입니다.)<b>out</b>-현재 채널 밖에 있는 모든 사용자에게 매치 합니다 (이는<i>. sub, 0,0,0</i>의 간이적인 표기입니다.) 항목은 사용자나 그룹 중 둘중 하나에 적용 되어 양쪽에는 적용되지 않습니다. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. <b>비밀 번호</b><br>이 필드에서 쉽게 채널 패스워드를 설정·변경할 수 있습니다. 기본으로 Mumble의 액세스 토큰 기능을 사용하고 있습니다. 강력한 암호를 사용하려면 ACL과 그룹을 사용하세요. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. 이 채널에서 유효한 항목을 모두 표시합니다. 원본 채널에서 계승된 항목은 이탤릭(기울림)체로 표시됩니다.<br/>ACL은 위에서 차례 대로 평가됩니다. 즉, 이름순의 순위를 낮추어 우선도가 오르는 것을 의미합니다. ID of the channel. 채널의 ID Maximum Users 최대 유저수 Maximum number of users allowed in the channel 채널의 최대 사용자 수 <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. This is the sort order for the channel. ALSAAudioInput Default ALSA Card 기본 ALSA 카드 Opening chosen ALSA Input failed: %1 선택된 ALSA 입력 열기에 실패했습니다:%1 ALSAAudioOutput Default ALSA Card 기본 ALSA 카드 Opening chosen ALSA Output failed: %1 선택된 ALSA출력 열기에 실패했습니다:%1 ASIOConfig %1 (version %2) %1 (version %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz %1 -> %2 샘플 버퍼를 포함한 %3 샘플 해상도 (%4 preferred) at %5 Hz ASIO Initialization failed: %1 ASIO의 초기화에 실패 했습니다:%1 Failed to instantiate ASIO driver ASIO드라이버의 인스턴스화에 실패 했습니다. ASIO ASIO Device selection 디바이스 선택 Device 디바이스 Device to use for microphone 마이크에 사용하는 디바이스 This chooses what device to query. You still need to actually query the device and select which channels to use. 문의 장치를 선택합니다. 당신은 장치를 실제로 확인하여 사용 채널을 선택할 필요가 있습니다. Query selected device 선택된 장치를 조회합니다 This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. 채널에서 선택된 디바이스를 문의합니다. 많은 ASIO드라이버가 비정상적으로 불안정하게 되므로 주의해 주세요. &Query 문의(&Q) Configure selected device 선택된 디바이스를 설정합니다. This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. 선택된 장치 설정을 합니다. 많은 ASIO드라이버가 불안정하므로 주의해 주세요. &Configure 설정 Capabilities 능력 Driver name 드라이버 이름 Buffer size 버퍼 사이즈 This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. ASIO 입력 채널을 설정합니다. 최소 1개 채널을 마이크 또는 스피커로 고르세요.<i>마이크</i>는 당신 마이크가 연결된 곳에서 <i>스피커</i>는 " 듣는 것"을 시험해 보고 싶을때 입력하는 채널입니다. Sound Blaster Audigy 2 ZS의 예를 하나 들자면 스피커가 "Mix L"and"Mix R"때 마이크를 "Mic L"로 하는 것이 좋은 선택 입니다. Configure input channels 입력채널 설정 Channels 채널 Microphone 마이크 <- <- -> -> Unused 미사용 Speakers 스피커 ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. ASIO을 사용하려면 적어도 1개의 마이크와 1개의 스피커를 선택해야 합니다. 만약 마이크 샘플링이 필요한 것 뿐이라면 DirectSound를 사용해 주세요. Opening selected ASIO device failed. No input will be done. 선택된 ASIO드라이버를 여는 데 실패했습니다. 입력이 되지 않았습니다. AboutDialog About Mumble 멈블에 대해서 <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble Mumble에 대해서(&A) &License &License A&uthors &Third-Party Licenses OK 확인 AudioInput Interface 인터페이스 System 시스템 Input method for audio 음성 입력 방법 <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>음성 출력 방법입니다.</b><br/>대부분의 경우 DirectSound가 문제 없습니다. Device 디바이스 Input device for audio 음성 입력 방법 <b>This is the input device to use for audio.</b> <b>음성을 위한 입력 디바이스입니다.</b> Transmission 트랜스미션 &Transmit 송신(&T) When to transmit your speech 발언을 송신하는 타이밍 <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. <b>목소리를 송신할 타이밍을 설정합니다.</b><br/><i>항상 활성화</i>-항상 음성 입력을 활성화 합니다<br/><i>소리로 활성</i>-발언을 했을때 활성화가 됩니다.<br/><i>누르며 말하기</i>-<i>단축키</i>로 설정한 키를 누르고 있는 동안에 음성 입력을 활성화 합니다. DoublePush Time 더블푸쉬 타임 If you press the PTT key twice in this time it will get locked. 누르며 말하기 단축키를 2번 누르면 잠깁니다. <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. <b>더블푸쉬 타임</b><br/>만약 당신이 누르며 말하기에 설정된 키를 2회 연속, 이 시간을 설정한뒤 그 시간 사이 동안에 누르면 키는 고정 됩니다. Reset audio cue to default 오디오 큐를 기본으로 리셋 <b>Reset</b><br/>Reset the paths for the files to their default. <b>리셋</b><br/>기본 파일 경로를 초기화합니다. Browse for on audio file 오디오 파일을 킬때 참조 Browse for off audio file 오디오 파일을 끌때 참조 Off 끄기 On On Preview the audio cues 오디오 큐를 미리 보기 Use SNR based speech detection SNR 음성 감지를 기본으로 사용 Signal to Noise Signal to Noise <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. <b>발언 신호의 세기를 사용할 것인지 설정합니다.</b>이 모드를 사용하면, 입력 신호 자체의 출력이 발언 감지에 사용됩니다. Amplitude 진폭 Voice &Hold 목소리 고정(&H) How long to keep transmitting after silence 음성이 사라진 뒤 일정 시간 동안 송신을 보내는지 Silence Below Silence Below <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. <b>소리를 감지하기 위한 기준치를 설정합니다.</b>수동으로 조절하려면 음성 통계 창을 함께 이용하세요."Speech Above"이하의 값은 항상 말하지 않은 상태로 간주 되어 "Silence Below"보다 위의 값은 발언으로 간주됩니다. 이 사이의 값은 이미 대화 중이면 발언으로 판단되지만, 새 발언이라고 판단하는 것은 안 됩니다. Speech Above Speech Above Signal values above this count as voice 음성으로 판정하는 신호 값 Compression 압축방식 &Quality 품질 Quality of compression (peak bandwidth) 압축 품질(피크 대역 폭) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. <b>압축 품질을 설정합니다.</b><br/>송출되는 음성에 대해 어느 정도의 대역 폭 사용이 가능한지를 설정 합니다. Audio per packet 패킷 당 오디오 How many audio frames to send per packet 전송된 패킷 당 음성 프레임의 길이 <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>하나의 송신 패킷에 포함하기 위한 음성 프레임의 길이를 선택합니다.</b><br/>이 값을 높일수록 당신의 음성은 지연되지만, 그만큼 필요한 네트워크 대역 폭은 감소됩니다. <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). <b>음성의 송신에 사용되는 대역 폭의 최대치를 나타냅니다.</b><br/>이것은 당신의 PC에서 송출되는 대역의 가장 큰 값을 표시합니다. 오디오 비트레이트는 하나의 음성 데이터의 최대 비트 레이트(VBR사용 시)를 뜻합니다. Position은 위치 정보를 위해 사용되는 비트율 표시하고 Overhead는 개별적인 프레이밍과 IP 패킷 헤더(IP와 UDP는 이 Overhead의 75%)을 나타내고 있습니다. Audio Processing 오디오 처리 Noise Suppression 잡음 억제 Noise suppression 잡음 억제 <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. <b>이 설정은 잡음를 억제합니다.</b><br/>이 보다 큰 값을 설정하면 많은 잡음이 억제됩니다. Maximum amplification of input sound 음성 입력의 최대 증폭량 <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. <b>음성 입력의 최대 증폭 양입니다</b><br/>Mumble은 압축을 하기 전에 입력량을 정상화합니다. 이 설정은 소리를 얼마나 증폭시킬지를 결정합니다.<br/>실제의 음량은 발언 패턴에 따라 변화하지만 이곳에서 지정된 음량을 넘을 수는 없습니다.<br/>음성 통계에서<i>마이크의 음량</i>수준이 항상 100% 가까이에 이르고 있다면 이 값을 2.0정도로 설정하는게 좋을지도 모릅니다. 그러나 100%에 미치지 않는다면 이 값을 더 높여 주세요.<br/당신이 매우 온화하게 말할 때<i>마이크 음량*증폭 값>=100</i>가 되는 것이 이상적입니다.<br/><br/>이 값을 최대로 할 경우 딱히 문제는 없지만, 그렇다고 적당히 최대치에 맞춰 버리면 원하는 않는 대화까지 흘러나갈 우려가 있습니다. Current speech detection chance 현재 발언의 감지 가능성 Cancel echo from speakers 스피커에서 에코를 제거 합니다. Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. 당신의 스피커에서 에코를 제거할 수 있습니다. 믹스는 CPU 부하가 낮지만 스피커에서 일정한 크기의 소리를 내고 있고 마이크에서 일정 거리를 두고 있을 경우에만 잘 작동합니다.멀티 채널 에코 제거는 좀 더 효과가 좋지만 CPU 부하가 믹스보다 높습니다. Disabled 비활성 <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>Signal to Noise 비율을 사용하여 발언 인식을 설정합니다.</b><br/>이 모드에서 입력은 명확한 신호와 같은걸로 분석되어 해당 신호의 명료성은 음성 검출을 위해 사용됩니다. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal values below this count as silence Maximum bandwidth used for sending audio Use Amplitude based speech detection <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). Exclusive mode 전용 모드 <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>디바이스를 전용 모드로 활성합니다.</b><br/> 다른 애플리케이션이 이 장치를 사용할 수 없습니다. Exclusive 전용 R&eset 리셋(&R) &Browse... 참조(&B) B&rowse... 참조(&R) &Preview 미리보기(&P) <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. <b>프리뷰/b><br/>현재 플레이 중인 <i>on</i> 사운드를 재생후 <i>off</i> 사운드로 재생합니다. Displays an always on top window with a push to talk button in it 누르며 말하기 버튼을 표시하여 창을 항상 위에 표시합니다 Display push to talk window 누르며 말하기를 윈도우에 표시한다. Misc Misc Audible audio cue when starting or stopping to transmit 오디오를 송신 할 시 또는 중단 할 때 들리는 음성의 큐 <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. 이 기능은 전송 시 음성 큐를 설정합니다.</b><br/>이를 설정하면 전송의 시작 때와, 종료시에 짧은 오디오 비프음이 들리게 됩니다. Audio cue 오디오 큐 Gets played when starting to transmit Gets played when stopping to transmit Hold Time 대기 시간 Time the microphone stays open after the PTT key is released PTT키를 누른 뒤에 마이크가 꺼지는 시간 Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) 서버의 최대 네트워크 대역은%1kbit/s밖에 안됩니다. 음성 품질은 자동적으로%2kbit/s(%3 ms)로 조절 됩니다 Max. Amplification 최대 증폭량 Idle action Idle시의 동작 minutes do 이후에 nothing 없음 deafen 청취 금지 mute 음소거 after after Echo Cancellation 반향 소거 Mixed echo cancellation Multichannel echo cancellation The idle action will be reversed upon any key or mouse button input Undo Idle action upon activity Apply RNNoise's noise suppression filter. <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. RNNoise Audio input AudioInputDialog Continuous 항상 활성 Voice Activity 음성 활성 Push To Talk 누르며 말하기 Audio Input 오디오 입력 %1 ms %1 ms Off 끄기 %1 s %1 s %1 kb/s %1 kb/s -%1 dB -%1 dB %1 kbit/s (Audio %2, Position %4, Overhead %3) %1 kbit/s (오디오 %2, 포지션 %4, 오버헤드 %3) AudioOutput Interface 인터페이스 System 시스템 Output method for audio 음성 출력 방법 <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device 디바이스 Output device for audio 음성 출력 방법 <b>This is the output device to use for audio.</b> <b>음성을 위한 출력 디바이스입니다.</b> Positional Audio 음향 위치 Audio Output 오디오 출력 Default &Jitter Buffer 기본 지터 버퍼(&J) Safety margin for jitter buffer 지터 버퍼의 안전 범위 <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. Minimum distance to user before sound volume decreases 소리가 감소 되기 전의 유저에 대한 최소 거리 This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. 사운드 연산에 필요한 최소 거리를 설정합니다. 적어도 이 정도 거리로 설정 하고 있으면 다른 플레이어의 음성은 감소하지 않습니다. This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. <b>루프 백 테스트 모드 하나가 유효하게 됩니다.</b><br/><i>없음</i>-루프백 비활성화<br/><i>로컬</i>-로컬 서버를 에뮬레이터 합니다.<br/><i>서버</i>서버에 루프 백을 요구합니다.<br/>루프 백이 활성화 되는 동안 다른 플레이어는 당신의 목소리를 듣지 못하므로 주의해 주세요. 이 설정은 애플리케이션 종료시에 저장 되지 않습니다. Volume 볼륨 Volume of incoming speech 수신 음성의 볼륨 <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. Output Delay 출력 딜레이 Amount of data to buffer 버퍼 데이터량 The connected "speakers" are actually headphones The connected "speakers" are actually headphones. Factor for sound volume decrease 볼륨 감소 비율 Bloom 블룸 Factor for sound volume increase 볼륨 증가 비율 How much should sound volume increase for sources that are really close? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. 출력 버퍼의 프리 버퍼의 양을 설정합니다. 여러가지 값으로 해보세요, 갑작스럽게 불안정 해지지 않는 가장 작은 값으로 설정하세요. Headphones 헤드폰 Minimum Distance 최소 거리 Maximum Distance 최대 거리 Maximum distance, beyond which speech volume won't decrease 음성 볼륨이 줄어들지 않는 최대 거리 Minimum Volume 최소 볼륨 What should the volume be at the maximum distance? Loopback Test 루프백 테스트 Delay Variance Variance in packet latency <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>루프 백 테스트를 위한 패킷 레이텐시의 값을 조정합니다.</b><br/>음성 네트워크 경로는 대부분의 경우 약간의 레이텐시 값을 포함합니다. 이 설정은 루프 백 모드 테스트 시 레이텐시의 값을 변경하게 합니다. 말하자면 이 값을 15ms로 하면, 20-35ms의 레이텐시 값과 80ms-95ms의 레이텐시 값을 가진 네트워크를 에뮬레이터 할 것입니다. 북미 인터넷 접속에서는 약 5ms정도의 레이텐시가 있습니다. Packet Loss 패킷 손실 Packet loss for loopback mode 루프 백 모드에서의 패킷 손실 <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% <b>루프 백 모드에서의 패킷 손실을 설정합니다.</b><br/>패킷 손실의 비율입니다. 송신 방향 대역 폭의 최대치에 이르거나 네트워크 접속에 문제가 없는 한은 0%가 될 것입니다 &Loopback 루프백 Desired loopback mode 사용하고 싶은 루프 백 모드 Attenuate applications by... 다른 어플리케이션의 음량을 감쇠... Attenuation of other applications during speech 대화 중의 다른 애플리케이션의 음량 감소율 <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. <b>대화 중 다른 애플리케이션의 음량의 감쇠시킵니다</b><br/>Mumble은 상대가 발언하고 있을 때나 발언을 상대에게 하고 있는 동안 다른 애플리케이션의 음량 감쇠를 지원합니다. 이 기능이 활성화 되고 있다면, 어플리케이션이 감쇠됩니다. If checked Mumble lowers the volume of other applications while other users talk <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. while other users talk 다른 유저가 발언을 하는 도중 If checked Mumble lowers the volume of other applications while you talk 체크시 당신이 발언하고 있을 때, Mumble은 다른 애플리케이션의 음량을 낮춥니다 <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. while you talk 당신이 발언을 하는 도중 Exclusive mode, not recommended. 전용 모드 입니다. 추천하지 않습니다. <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>디바이스를 전용 모드로 활성합니다.</b><br/> 다른 애플리케이션이 이 장치를 사용할 수 없습니다. Exclusive 전용 Priority Speaker If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. 체크 시, 당신이 말하고 있는 동안 다른 사용자의 볼륨을 낮출 경우 "스피커 우선순위"상태가 됩니다. <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. Attenuate other users while talking as Priority Speaker. Advanced Attenuation Options If checked, Mumble will only attenuate applications that are using the same output source as Mumble <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. Only attenuate applications using the same output device If checked, PulseAudio loopback modules will be attenuated <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. Attenuate PulseAudio loopback modules Audio output AudioOutputDialog None 빈칸 Local 로컬 Server 서버 Audio Output 오디오 출력 %1 ms %1 ms %1 % %1 % %1 m %1 m AudioOutputSample Choose sound file 사운드 파일 선택 Invalid sound file 사운드 파일을 찾을수 없음 The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. 파일 '%1'은 Mumble에서 사용할 수 없습니다. 지원하는 포맷으로 인코딩 파일을 선택하세요. AudioStats >1000 ms >1000ms >1000 ms Audio Statistics 오디오 통계 Input Levels 입력 레벨 Peak microphone level 최대 마이크 레벨 Peak power in last frame 마지막 프레임에서 최대 출력 This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. 마지막 프레임(20 ms)최대 출력을 표시합니다. 평소의 "입력 파워"로 표시 되어 있는 측정 값과 같은 것입니다. 이건 무시하고<b>마이크 파워</b>를 보시면 이쪽이 더 안정되고 외부 특이 영향을 무시합니다 Peak speaker level 최대 스피커 수준 This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. 마지막 프레임(20 ms)에 스피커 최대 음량을 표시합니다. 스피커 설정을 변경해 다중 채널 샘플링(예를 들면 ASIO)를 사용하지 않는 한, 표시는 0이 됩니다. 설정으로 이런 구성을 하고 있을때 만약 다른 프로그램이 음성을 재생하는 동안에도 0을 표시 하고 있다면 설정이 잘못 된 것입니다. Peak clean level 최대 클린 수준 This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. 마지막 프레임(20 ms)에서 모든 처리 이후 최대 음량을 표시합니다. 당신이 말하지 않을 때 -96 dB인 것이 이상적 입니다. 그러나 실제 음악 스튜디오에서도 -60 dB 입니다만 보통 유저들의 환경에서는-20 dB정도 나오면 좋은 편입니다. 당신이 말할 때는-5에서-10 dB정도까지 오릅니다.<br/>만약 당신이 에코 억제를 사용하여 말하지 않았는데도 -15 dB까지 오르게 되면 설정이 잘못 된 것입니다. Signal Analysis 신호 분석 Microphone power 마이크 세기 How close the current input level is to ideal This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. Signal-To-Noise ratio Signal-To-Noise ratio from the microphone This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. Speech Probability Probability of speech This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). Configuration feedback 설정 피드백 Current audio bitrate 현재 오디오 비트레이트 Bitrate of last frame 마지막 프레임의 비트레이트 DoublePush interval 더블푸쉬 대기시간 Time between last two Push-To-Talk presses Speech Detection 발언 감지 Current speech detection chance 현재 발언의 감지 가능성 <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal and noise power spectrum Power spectrum of input signal and noise estimate This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. Echo Analysis 에코 분석 Weights of the echo canceller This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. AudioWizard Audio Tuning Wizard 오디오 조절 마법사 Introduction 입문 Welcome to the Mumble Audio Wizard 멈블 오디오 마법사 Finished 완료 Enjoy using Mumble Mumble을 사용하여 즐기자 Device selection 디바이스 선택 Selecting the input and output device to use with Mumble. Mumble에서 사용하는 입력 및 출력 디바이스를 선택합니다. This is the device your microphone is connected to. 당신이 입력하고 있는 디바이스입니다. System 시스템 Input method for audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device 디바이스 Input device to use 입력 디바이스를 사용 <b>Selects which sound card to use for audio input.</b> Cancel echo from headset or speakers Use echo cancellation This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. This is the device your speakers or headphones are connected to. 당신의 스피커(또는 헤드폰)이 연결하고 있는 디바이스입니다. Output method for audio 음성 출력 방법 <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>음성 출력 방법입니다.</b><br/>대부분의 경우 DirectSound가 문제 없습니다. Output device to use 출력에 사용하는 디바이스 <b>Selects which sound card to use for audio Output.</b> <b>음성 출력에 어느 사운드 카드를 사용할지 선택하세요.</b> Enable positional audio Allows positioning of sound Allows positioning of sound. <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> <p> Mumble 음성을 설정 하기 위한 마법사 입니다. 사운드 카드 입력 상태와 Mumble에서 사용할 음성 처리의 파라미터를 올바르게 설정 하는 것을 도와줍니다. </p> <p> 마법사가 동작 중인 동안에는 당신만 들을 수 있도록 PC로만 음성을 연결 해주세요, 서버로는 음성 연결이 되지 않으므로 주의하세요. </p> Input Device 입력 디바이스 Output Device 출력 디바이스 This allows Mumble to use positional audio to place voices. <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> <p> 연결 지연을 최소한으로 동작 하려면 사운드 카드 음성 버퍼를 최대한으로 줄이는 것이 중요합니다. 하지만 여러 사운드 카드가 요구하는 버퍼는 실제로 작동 가능한 크기보다 상당히 작습니다. 그래서 이 값을 설정하려면 여러번 시도해 볼 수 밖에 없습니다. </p> <p> 주파수가 바뀐 1개의 음색이 들립니다. 소리가 끊기거나 불안정 하다면<b>안되는 경우 입니다</b>가장 작은 값까지 아래의 슬라이더를 보고 움직여 주세요. 또 음성 경로의 인식률 향상을 위해 이 테스트 동안에는 로컬 에코를 비활성화 하는 것을 잊지 마세요. </p> Amount of data to buffer 버퍼 데이터량 This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. 출력 버퍼의 프리 버퍼의 양을 설정합니다. 여러가지 값으로 해보세요, 갑작스럽게 불안정 해지지 않는 가장 작은 값으로 설정하세요. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> <p> 볼륨 컨트롤 패널을 열고 녹음 설정 화면으로 이동합니다. 그리고 마이크를 선택되어, 음량 상태가 최대라는 사실을 확인해 주세요. 또 "마이크 증폭"을 활성화 하는 옵션이 있다면 이것 또한 체크되어 있는지 확인해 주세요. </p> <p> 큰 목소리로 말해 보세요. 말하는 동안 아래에 있는 바가 푸른색과 녹색 범위에 가능하면 붉은색에 가까운 곳에 멈출 때까지 사운드 제어판에서 음량을 낮추어 보세요.(붉은색 영역에는<b>들어가지 않도록</b> 합니다.) </p> Positional Audio Adjusting attenuation of positional audio. <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> Use headphones instead of speakers <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> Use headphones 헤드폰 사용 This ignores the OS speaker configuration and configures the positioning for headphones instead. Volume tuning 볼륨 조절 Tuning microphone hardware volume to optimal settings. 마이크 음량을 최적 상태가 되도록 설정합니다. Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. Voice Activity Detection Letting Mumble figure out when you're talking and when you're silent. This will help Mumble figure out when you are talking. The first step is selecting which data value to use. Raw amplitude from input Signal-To-Noise ratio Signal-To-Noise 비율 Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Device tuning 디바이스 조절 Changing hardware output delays to their minimum value. 하드웨어의 출력 지연이 최소치가 되도록 변경합니다. Submit anonymous statistics to the Mumble project Push To Talk: 누르며 말하기: Quality & Notifications 품질&알림 Adjust quality and notification settings. Quality settings 품질 설정 Low 낮음 Balanced 균형 Notification settings 알림 설정 Use Text-To-Speech to read notifications and messages to you. Disable Text-To-Speech and use sounds instead. %1 ms %1 ms Enables attenuation of other applications while users talk to you Attenuate applications while other users talk 다른 사용자가 말할 때 다른 애플리케이션의 음량을 줄인다 High 높음 Custom 커스텀 You already set a customized quality configuration in Mumble. Select this setting to keep it. 당신은 이미 사용자 지정 음질 설정을 하고 있습니다. 이 설정을 유지하고 싶은 경우는 선택하세요. Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. 사용자가 대화하는 때에 다른 애플리케이션의 감쇠를 설정합니다. Mumble에서 누군가가 당신에게 말을 건다면 즉시 다른 모든 어플리케이션의 음량은 (상대방의 음성을 잘 들을수 있도록) 감쇠됩니다. Apply some high contrast optimizations for visually impaired users 시각 장애인을 위해 하이 콘트라스트에 최적화합니다 Use high contrast graphics 하이 콘트라스트 그래픽을 사용 Keep custom Text-To-Speech settings. 커스텀 Text-To-Speech 설정을 유지합니다. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) BanEditor Mumble - Edit Bans Mumble - 차단 편집 &Address 주소(&A) &Mask 마스크(&M) Reason 사유 Start 시작 End User 유저 Hash 해시 &Add 추가(&A) &Update 업데이트 &Remove 삭제 Ban List 차단 리스트 Search field This is the search field. Use it to find bans that have this username set in the username field. Who are you looking for? No nickname IP address IP 주소 No IP address 아닌 IP 주소 Reason for the ban No reason 사유 없음 Ban end date 차단 해제 날짜 Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). Certificate hash 인증 해시 No certificate hash 인증이 안된 해시 Banned users 차단된 유저 This is a list with banned users. Use this button if you want to add a new ban. Use this button if you want to update ban information. Use this button if you want to remove user from the ban list. Clear all fields This button clears all fields. Use it if you want to add a new ban. Clear 청소 Ban List - %n Ban(s) 차단 리스트-%n Ban(s) CertView Name 이름 Email 이메일 Issuer 발행자 Expiry Date 만료일 (none) (없음) Self-signed 자기 서명 CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. There was an error generating your certificate.<br />Please try again. 인증서 생성에서 에러가 발생했습니다.<br/>다시 한번 시도해 보세요. Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. 인증서와 키는 PKCS#12형식으로 변환할 수 없습니다. 인증서에 에러가 있을 가능성이 있습니다. The file could not be opened for writing. Please use another file. The file's permissions could not be set. No certificate and key has been written. Please use another file. 이 파일의 사용 권한을 설정할 수 없습니다. 인증서와 키는 저장 되지 않았습니다. 다른 파일을 사용해 주세요. The file could not be written successfully. Please use another file. The file could not be opened for reading. Please use another file. The file is empty or could not be read. Please use another file. The file did not contain a valid certificate and key. Please use another file. 그 파일은 올바른 인증서와 키를 포함하지 않습니다. 다른 파일을 사용해 주세요. Select file to export certificate to 인증서를 내보내기 위한 파일을 선택하세요 Select file to import certificate from 인증서를 가져올 위한 파일을 선택하세요 Unable to import. Missing password or incompatible file type. <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. <b>인증서의 유효 기간:</b>당신의 인증서의 유효 기한이 곧 종료 됩니다. 인증서를 갱신할 필요가 있습니다. 갱신을 하지 않는다면 등록한 서버에 접속할 수 없게 될 것입니다. Certificates Certificate Management 인증서 관리 Certificate Authentication 인증서 증명 Authenticating to servers without using passwords Current certificate 현재 인증서 This is the certificate Mumble currently uses. Mumble이 현재 사용하고 있는 인증서 입니다. Current Certificate 현재 인증 Create a new certificate 새 인증서 발급 This will create a new certificate. 새로운 증명서를 생성합니다. Import certificate from file 파일에서 인증서를 가져 옵니다. This will import a certificate from file. 이 파일에서 인증서를 가져 옵니다. Import a certificate 인증서를 가져 온다. Export Certificate 인증서를 내보낸다. This will export a certificate to file. 이 파일에 인증서를 내보냅니다. Export current certificate 현재 인증서를 내보낸다. Import Certificate 인증서를 가져 온다. PKCS #12 Certificate import PKCS #12 인증서를 가져 온다. <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble PKCS#12형식으로 저장된 인증서를 가져올 수 있습니다. 이는 Mumble 키를 내보낼 때 쓰이는 형식 입니다. FireFox와 Internet Explorer, Opera등에서도 사용됩니다.</p><p>이 파일이 패스워드로 보호 되어 있다면 인증서를 가져올때 패스워드가 필요하게 됩니다.</p> Import from Filename to import from This is the filename you wish to import a certificate from. 이것은 인증서를 가져올 파일 이름입니다. Select file to import from This opens a file selection dialog to choose a file to import a certificate from. 인증서를 내보낼 기본 파일을 선택하기 위해 대화 상자를 엽니다. Open... 열기 Password 비밀번호 Password for PKCS#12 file PKCS#12 파일의 비밀번호 This is the password for the PKCS#12 file containing your certificate. 인증서를 포함한 PKCS#12파일에 쓰일 패스워드입니다. Certificate to import 인증서를 가져 온다. This is the certificate you are importing. 이것은 당신이 가져오는 인증서 입니다. Certificate Details 인증서 설명 Replace Certificate 인증서의 치환 Replace existing certificate with new certificate? 현재 인증서를 새로운 인증서로 바꾸시겠습니까? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> <p>당신은 이미 Mumble에 저장된 인증서가 있으며 이를 대체 합니다.</p> <p>신뢰된 인증 의해 발행된 인증서로 업그레이드 하려고 합니다. 새로운 인증서의 Email 주소가 현재 당신의 인증서와 같은 것이라면 문제는 없습니다만 지금까지 유저 등록을 한 서버는 당신의 Email 주소를 바탕으로 보다 나은 인증서를 자동적으로 판별할 것입니다. </p> <p> 만약에 그렇지 않다면 어느 서버에서 받은 인증이 없어집니다. 아직 어느 서버에도 유저 등록 되어 있지 않다면 이 걱정은 따로 할 필요가 없습니다. </p> <p> 정말로 인증서를 바꾸시겠습니까? </p> This is the certificate Mumble currently uses. It will be replaced. Mumble이 현재 사용하고 있는 인증서입니다. 이는 새로운 것으로 바뀝니다. New certificate 새 인증 This is the new certificate that will replace the old one. New Certificate 새 인증 Make a backup of your certificate Export to Filename to export to This is the filename you wish to export a certificate to. Save As... 다른 이름으로 저장 This is the certificate Mumble currently uses. It will be exported. Generate a new certificate for strong authentication <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> Name 이름 Email 이메일 Your email address (e.g. johndoe@mumble.info) 당신의 이메일 주소 (e.g. johndoe@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. Your name (e.g. John Doe) 당신의 이름 (e.g. John Doe) This is your name, and will be filled out in the certificate. This field is entirely optional. Finish 완료 Certificate-based authentication is ready for use Enjoy using Mumble with strong authentication. Automatic certificate creation 자동 인증서 생성 <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> ChanACL None None Traverse Enter 엔터 Speak 말하기 Mute/Deafen 발언 금지/청취 금지 Make channel 채널 만들기 Make temporary Link channel 채널 링크 This represents no privileges. This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. This represents the permission to write text messages to other users in this channel. This represents the permission to forcibly remove users from the server. This represents the permission to permanently remove users from the server. This represents the permission to register and unregister users on the server. This represents the permission to register oneself on the server. Whisper 귓속말 Move 이동 Text message 텍스트 메세지 Kick 강퇴 Ban Register User 유저 등록 Register Self Write ACL ACL 쓰기 ChatbarTextEdit Paste and &Send Paste and send <center>Type chat message here</center> <center>여기에 메시지를 입력하세요.</center> ClientUser Friend Authenticated Priority speaker Recording 녹음 Muted (server) Deafened (server) Local Ignore (Text messages) Local Mute Muted (self) Deafened (self) ConfigDialog Accept changes 변경 확인 This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. Reject changes This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. Apply changes 변경한 것을 적용 This button will immediately apply all changes. Undo changes for current page This button will revert any changes done on the current page to the most recent applied settings. Restore defaults for current page This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. Mumble Configuration ConnectDialog Connecting to %1 %1에 접속 중 Enter username 유저이름 입력 Adding host %1 Servername 서버이름 Hostname 호스트이름 Bonjour name Port 포트 Addresses 주소록 Website 웹사이트 Packet loss 패킷 손실 Ping (80%) 핑 (80%) %1 ms %1 ms Ping (95%) 핑 (95%) Bandwidth 대역폭 %1 kbit/s %1 kbit/s &Connect 연결(&C) &Filters 필터(&F) Unknown Users 유저 Version 버전 Failed to fetch server list Mumble Server Connect Mumble 서버 연결 Ping Remove from Favorites 즐겨찾기 삭제 Add custom server 커스텀 서버를 추가 Show all servers that respond to ping Show all servers with users Show all servers &Copy 복사(&C) Copy favorite link to clipboard &Paste 붙여넣기(&P) Paste favorite from clipboard &Edit... 편집(&E) &Add New... 새롭게 추가... Add to &Favorites 즐겨찾기 추가 Open &Webpage 웹페이지 열기(&W) Show &Reachable Show &Populated Show &All ConnectDialogEdit Edit Server 서버 편집 Name of the server 서버의 이름 A&ddress 주소(&D) Internet address of the server. Internet address of the server. <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. &Port 포트(&P) Port on which the server is listening <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. &Username 유저 이름 Username to send to the server <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. Label 라벨 Add Server 서버 추가 You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 Password 비밀번호 Password to send to the server 서버에 비밀번호를 보냅니다. <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. Show password 비밀번호 보기 <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. Local server label 127.0.0.1 127.0.0.1 64738 64738 Your username 사용자 이름 Your password 비밀번호 &Fill CoreAudioSystem Default Device 기본 디바이스 CrashReporter Mumble Crash Report Mumble 충돌 보고서 <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> Email address (optional) Email 주소 (옵션) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash Send Report 보고서 보내기 Don't send report 보고서 보내지 않기 Crash upload successful 충돌 보고서를 업로드 했습니다. Thank you for helping make Mumble better! 멈블 제작에 도움을 주셔서 감사합니다. Crash upload failed 충돌 보고서를 보내지 못했습니다. We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 Uploading crash report Abort upload DXAudioInput Default DirectSound Voice Input 기본 DirectSound 음성 입력 Opening chosen DirectSound Input device failed. No microphone capture will be done. DirectSound 입력 디바이스의 열기에 실패했습니다. 마이크를 캡쳐 할 수 없었습니다. Opening chosen DirectSound Input failed. Default device will be used. 선택된 DirectSound 입력 열기에 실패했습니다. 기본 장치가 사용됩니다. Lost DirectSound input device. DirectSound 입력 디바이스가 소실 되었습니다. DXAudioOutput Default DirectSound Voice Output 기본 DirectSound 음성 출력 Opening chosen DirectSound Output failed. Default device will be used. 선택된 DirectSound 출력 오픈에 실패했습니다. 음성이 출력되지 않습니다. Lost DirectSound output device. DirectSound 출력 디바이스가 소실 되었습니다. Opening chosen DirectSound Output failed. No audio will be heard. 선택된 DirectSound 출력 오픈에 실패했습니다. 음성이 출력되지 않습니다. Database Mumble failed to initialize a database in any of the possible locations. Mumble: 데이터베이스 초기화가 가능한 장소가 없고 설정에 실패했습니다. The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. 데이터베이스 "%1"는 읽기 전용입니다. 이 문제를 고칠 때까지 Mumble은 서버의 설정(예를 들면 SSL증명서)을 저장할 수 없습니다. DeveloperConsole Developer Console DockTitleBar Drag here 잡고 드래그 하세요. GlobalShortcut Shortcuts 단축키 List of configured shortcuts 설정된 단축키 리스트 Function 기능 Data 데이터 Shortcut 단축키 Suppress 단축키 금지 Add new shortcut 새로운 단축키를 추가 This will add a new global shortcut 이에 따른 새 전체 단축키를 추가 합니다. &Add 추가 Remove selected shortcut 선택한 단축키를 삭제 This will permanently remove a selected shortcut. &Remove 삭제 <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> Open Accessibility Preferences Skip 스킵 Enable Global Shortcuts <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. Additional Shortcut Engines <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. Enable Windows hooks <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. Enable GKey <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. Enable XInput <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. Enable shortcuts in privileged applications GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> Shortcuts 단축키 Shortcut button combination. 단축 버튼 조합 <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. Suppress keys from other applications <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. GlobalShortcutTarget Whisper Target Whisper to list of Users Channel Target Restrict to Group If specified, only members of this group will receive the whisper. List of users 유저 목록 Add 추가 Remove 삭제 Modifiers Do not send positional audio information when using this whisper shortcut. Ignore positional audio Shout to Linked channels Shout to subchannels Shout to Channel The whisper will also be transmitted to linked channels. The whisper will also be sent to the subchannels of the channel target. GlobalShortcutX Mouse %1 JackAudioSystem Hardware Ports Mono Stereo LCD Not connected 연결 되지 않았습니다. LCDConfig Enable this device LCD Devices 장치 Name 이름 <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> <p>당신의 시스템상에 있는 이용 가능한 LCD디바이스의 리스트입니다. 디바이스를 나열합니다. 또 화면 사이즈도 포함하고 있습니다. Mumble은 여러개의 LCD디바이스에 동시에 출력하는 것을 지원하고 있습니다.</p> <h3>사이즈:</h3> <p> 이 필드는 LCD디바이스 크기를 나타냅니다. 사이즈는 픽셀(LCD의 화상)이나 문자 수(LCD의 문자)로 주어집니다.</p> <h3>활성화:</h3> <p>Mumble이 특정 LCD디바이스에 묘화 할지 결정합니다.</p> Size 크기 Enabled Views Minimum Column Width <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> This setting decides the width of column splitter. Splitter Width Log Debug 디버그 Critical 치명적 오류 Warning 경고 Information 정보 Server Connected 서버 연결 Server Disconnected 서버 연결해제 Other self-muted/deafened Permission Denied Text Message 텍스트 메세지 User Joined Server User Left Server User recording state changed User kicked (you or by you) User kicked 유저 강퇴 You self-muted 자신을 발언 금지 하기 User muted (you) User muted (by you) User muted (other) User Joined Channel User Left Channel You self-unmuted You self-deafened You self-undeafened User renamed You Joined Channel You Joined Channel (moved) User connected and entered channel User left channel and disconnected Private text message the server 서버 [[ Invalid size ]] [[ Text object too large to display ]] [Date changed to %1] link to %1 FTP link to %1 player link channel link %1 link LogConfig Toggle console for %1 events Toggle pop-up notifications for %1 events Toggle Text-To-Speech for %1 events Click here to toggle sound notification for %1 events Toggle window highlight (if not active) for %1 events Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. 이벤트"%1"의 콘솔 출력을 바꾸려면 이곳을 클릭하세요.<br/>체크된 경우 메시지 로그에 모든 이벤트"%1"을 출력합니다. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. Messages 메시지 Message 메시지 Console 콘솔 Notification 알림 Text-To-Speech 음성 알림 Soundfile 사운드파일 Path 경로 Text To Speech 음성 알림 Volume 볼륨 Volume of Text-To-Speech Engine <b>This is the volume used for the speech synthesis.</b> Length threshold Message length threshold for Text-To-Speech Engine <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. Characters Whisper 귓속말 If checked you will only hear whispers from users you added to your friend list. Only accept whispers from friends If enabled text messages you send will be read back to you with TTS Read back own messages Chat Log 채팅 로그 Maximum chat length Unlimited Lines Highlight LookConfig System default 기본 시스템 None 없음 Only with users All 전부 Ask 말하기 Do Nothing 하지않는다 Move 이동 <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory User Interface 유저 인터페이스 This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. List users above subchannels (requires restart). <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. Users above Channels <b>If set, will verify you want to quit if connected.</b> Show number of users in each channel Show channel user count Language 언어 Language to use (requires restart) 사용하는 언어(다시 실행 필요) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. <b>Mumble이 사용하는 언어를 선택 합니다.</b><br/> 새로운 언어를 사용하기 위해서는 재시작이 필요합니다. Look and Feel 스킨 / 스타일 설정 Layout 레이아웃 Classic 기본 Stacked 변형 Hybrid 하이브리드 Custom 커스텀 This changes the behavior when moving channels. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. Expand 확장 When to automatically expand channels Channel Dragging Ask whether to close or minimize when quitting Mumble. Ask on quit while connected 접속 중에 종료를 할지 확인한다. Always On Top 항상 위에 표시 <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> Hide in tray when minimized Hide the main Mumble window in the tray when it is minimized. This setting controls when the application will be always on top. 이 설정은 어느 상황에서나 애플리케이션을 항상 위에 표시 할지 말지를 제어 합니다 Never 하지 않는다. Always 항상 In minimal view 간소화로 볼때. In normal view 평상시로 볼때. Displays talking status in system tray Show talking status in tray icon 발언 상태를 트레이 아이콘에 표시한다. This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. Show context menu in menu bar 메뉴 바에 컨텍스트 메뉴를 표시합니다. Apply some high contrast optimizations for visually impaired users 시각 장애인을 위해 하이 콘트라스트에 대한 최적화를 실행 합니다 Optimize for high contrast 하이 콘트라스트 최적화한다. Application 어플리케이션 Adds user and channel context menus into the menu bar Tray Icon 트레이 아이콘 Channel Tree 채널 트리 Use selected item as the chat bar target 선택한 항목을 채팅 메뉴 대상으로 한다. Filter automatically hides empty channels Show transmit mode dropdown in toolbar Theme Theme to use to style the user interface <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. User Dragging This changes the behavior when moving users. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. Enable Developer menu When in custom layout mode, checking this disables rearranging. Lock layout MainWindow Root 루트 Push-to-Talk Global Shortcut 누르며 말하기 Push and hold this button to send voice. Global Shortcut 발언을 하기 위해 누르는 버튼입니다. This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut Reset Audio Processor Global Shortcut Unlink Plugin Global Shortcut 플러그인 해제 Push-to-Mute Global Shortcut 누르는 동안 발언 금지 Join Channel Global Shortcut 채널 입장 Toggle Overlay Global Shortcut 오버레이 전환 Toggle state of in-game overlay. Global Shortcut Toggle Minimal Global Shortcut 최소화 전환 Volume Up (+10%) Global Shortcut 볼륨 높임 (+10%) Volume Down (-10%) Global Shortcut 볼륨 줄임 (-10%) Mumble Mumble Mumble -- %1 Mumble -- %1 &Window &Window Minimize 최소화 Ctrl+M Ctrl+M Close 종료 Mumble is currently connected to a server. Do you want to Close or Minimize it? 현재 서버에 접속 되어 있습니다. 연결을 종료하거나 트레이합니까? Mute Self Global Shortcut 발언 금지 Set self-mute status. Global Shortcut This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut Deafen Self Global Shortcut Set self-deafen status. Global Shortcut This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut Whisper/Shout Whisper 귓속말/외치기 <center>Not connected</center> Not connected <center>연결되지 않았습니다.</center> Clear 청소 Opening URL %1 URL %1 열기 File does not exist File is not a configuration file. Settings merged from file. URL scheme is not 'mumble' This version of Mumble can't handle URLs for Mumble version %1.%2.%3 Connecting to %1 %1에 접속 중 Enter username 유저이름 입력 Connecting to server %1. %1 서버에 연결 중입니다. Reconnecting. 재접속 Transmit Mode set to Continuous <p>%1 (%2)<br />%3</p> <p>%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> Register yourself as %1 <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <h2>Version</h2><p>Protocol %1</p> <p>No build information or OS version available</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) The connection is secured by the cipher suite that OpenSSL identifies as %1 <p>The connection provides perfect forward secrecy</p> <p>The connection does not provide perfect forward secrecy</p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> Voice channel is sent over control channel Register user %1 <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> Kicking user %1 Banning user %1 View comment on user %1 Message to channel %1 채널%1 메시지 Connected. 접속 했습니다. <li>Expected certificate digest (SHA-1): %1</li> Server presented a certificate which failed verification. <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> SSL Version mismatch Server connection failed. <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>채널'%1' 채팅 내용을 입력하세요.</center> <center>Type message to user '%1' here</center> Type message to user '%1' here <center>사용자'%1' 채팅 내용을 입력하세요.</center> Choose image file 이미지 파일 선택 Failed to load image Could not open file for reading. Image format not recognized. &User 유저(&U) &Channel 채널(&C) Use in conjunction with Whisper to. Global Shortcut This will switch the states of the in-game overlay. Global Shortcut Link Channel Global Shortcut 채널 링크 Cycle Transmit Mode Global Shortcut Set Transmit Mode to Push-To-Talk Global Shortcut Set Transmit Mode to Continuous Global Shortcut Set Transmit Mode to VAD Global Shortcut Send Text Message Global Shortcut Send Clipboard Text Message Global Shortcut This will send your Clipboard content to the channel you are currently in. Global Shortcut Continuous Voice Activity Push-to-Talk Mumble - Minimal View -- %1 Cancel 취소 Save Image As... Save Image File Could not save image: %1 Change your comment Transmit Mode set to Voice Activity Transmit Mode set to Push-to-Talk <p>Connected users: %1/%2</p> UDP Statistics To Server From Server Good 좋음 Late Lost 소실 Resync 재동기화 <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> Mumble Server Information Mumble 서버 정보 &View Certificate 인증 보기(&V) Enter reason Sending message to %1 %1에게 메시지를 송신하고 있습니다. To %1: %2 %1: %2 Message to %1 %1 메시지 Are you sure you want to reset the comment of user %1? Are you sure you want to reset the avatar of user %1? Are you sure you want to delete %1 and all its sub-channels? Sending message to channel %1 Message to tree %1 To %1 (Tree): %2 (Tree) %1: %2 %1 (Tree)에 보냄: %2 Unmuted and undeafened. 발언·청취 금지를 해제했습니다. Unmuted. 발언 금지를 해제했습니다. Muted. 발언을 금지했습니다. Muted and deafened. 발언과 청취가 금지 되었습니다. Deafened. 청취 금지 되었습니다. Undeafened. 청취 금지를 해제했습니다. Restart Mumble? Some settings will only apply after a restart of Mumble. Restart Mumble now? About Qt Qt에 대해서 SSL Verification failed: %1 <li>Server certificate digest (SHA-1): %1</li> <b>WARNING:</b> The server presented a certificate that was different from the stored one. <b>경고:</b> The server presented a certificate that was different from the stored one. This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. Server connection failed: %1. %1 서버 연결에 실패 하였습니다. Disconnected from server. 서버로 부터 접속해제 되었습니다. Invalid username 존재하지 않는 유저이름 You connected with an invalid username, please try another one. Username in use That username is already in use, please try another username. 이미 사용중인 이름입니다. 다른 이름을 사용해주세요. Wrong certificate or password Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. Wrong password Wrong server password for unregistered user account, please try again. Images (*.png *.jpg *.jpeg) C&onfigure &Help 도움말(&H) Log This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. &Quit Mumble Closes the program 프로그램 종료 Exits the application. Ctrl+Q Open the server connection dialog 서버 연결 대화상자를 열어 봅니다. &Disconnect 연결 해제 Disconnect from server 서버에 의해 접속 해제 되었습니다. Disconnects you from the server. 당신은 서버로 부터 접속 해제 되었습니다. Show information about the server connection 서버 연결에 대한 정보를 보여 줍니다. This will show extended information about the connection to the server. &Mute &Deafen &Local Mute Send a Text Message Sends a text message to another user. Add new channel 채널을 새로 추가한다. This adds a new sub-channel to the currently selected channel. Remove channel 채널 삭제 This removes a channel and all sub-channels. Edit Groups and ACL for channel This opens the Group and ACL dialog for the channel, to control permissions. &Link Link your channel to another channel This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. Chatbar Shows a dialog of registered servers, and also allows quick-connect. Kick user (with reason) Kick selected user off server. You'll be asked to specify a reason. Mute user 유저 발언 금지 Mute or unmute user on server. Unmuting a deafened user will also undeafen them. Kick and ban user (with reason) Kick and ban selected user from server. You'll be asked to specify a reason. Deafen user 유저 청취 금지 Deafen or undeafen user on server. Deafening a user will also mute them. Mute user locally 로컬 사용자 발언을 금지했습니다 Mute or unmute user locally. Use this on other users in the same room. 로컬 사용자 발언을 금지합니다. 같은 룸에 있는 사용자에게 사용하세요 This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. 현재 당신이 있는 채널을 선택된 채널과 연결합니다. 다른 채널에서 발언할 권한을 가지고 있다면, 사용자끼리 서로 듣거나 대화 할 수 있습니다. 이는 항구적인 링크이며, 수동으로 링크를 해제하거나 서버가 점검 할 때까지 계속됩니다. push-to-link의 아이콘을 보세요. &Unlink Channel 연결 해제 Unlink your channel from another channel 다른 채널과의 연결을 해제합니다 This unlinks your current channel from the selected channel. 선택된 채널과 당신이 있는 채널의 링크를 해제합니다. Unlinks your channel from all linked channels. 다른 채널과의 링크를 모두 해제합니다. This unlinks your current channel (not the selected one) from all linked channels. 연결된 채널과 당신이 있는 채널(선택된 것이 아닌)의 링크를 해제합니다. &Reset &Reset Reset audio preprocessor 음성 프리 프로세서를 리셋합니다. This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. 노이즈 취소나 음성 증폭 또는 음성 활성화 확인과 같은 음성 처리 기능을 초기화합니다. 일시적으로 음성 환경이 나빠질 때(마이크를 떨어 뜨렸을 때 등), 프리 프로세서의 기능을 기다리지 말고, 이 기능을 사용하세요. &Mute Self 발언 금지 Mute yourself 자신의 발언을 금지합니다 Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. 자신의 발언을 금지하거나 해제합니다. 발언 금지를 하면 서버에 데이터를 보내지 않습니다. 청취 금지를 하고 있을때 발언 금지 해제를 하면, 청취 금지도 같이 해제됩니다. &Deafen Self 청취 금지 Deafen yourself 자신의 청취를 금지합니다 Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. 자신을 청취를 금지하거나 해제합니다. 당신은 듣기가 불가능 합니다. 청취 금지를 하면 발언도 금지합니다. &Text-To-Speech &Text-To-Speech Toggle Text-To-Speech 전환 Text-To-Speech Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. 텍스트 엔진을 활성 또는 비활성 합니다 설정 상자에서 TTS가 활성 되어 있는 메시지만 읽을 수 있습니다. Display audio statistics 음성 상태를 표시 Pops up a small dialog with information about your current audio input. 현재의 음성 입력 정보를 표시하는 대화 상자가 팝업 됩니다. Forcibly unlink plugin 강제로 플러그인을 해제 This forces the current plugin to unlink, which is handy if it is reading completely wrong data. 현재 플러그 인을 강제로 해제 합니다. 어긋난 데이터를 읽고 있을 때 사용하세요. Configure Mumble Mumble 설정 Allows you to change most settings for Mumble. Mumble의 여러가지 설정을 합니다. Start the audio configuration wizard 사운드 설정 마법사를 시작합니다 This will guide you through the process of configuring your audio hardware. 사운드 하드웨어 프로세스 설정에 안내합니다. &What's This? &What's This? Enter What's This? mode What's This?모드로 이행합니다 Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. 클릭 하면 "What's This?" 모드에 들어갑니다. 마우스 커서는 의문 부호가 표시 되어 어떤 버튼을 누르면 선택된 메뉴나 구역이 어떤 기능이 있는지에 대한 설명을 표시합니다. Information about Mumble Mumble 정보에 대해서 Shows a small dialog with information and license for Mumble. Mumble 정보와 라이센스에 대한 대화 상자를 표시합니다. Information about Speex Speex 정보에 대해서 Shows a small dialog with information about Speex. Speex 정보를 위한 대화 상자를 표시합니다. Information about Qt Qt 정보에 대해서 Shows a small dialog with information about Qt. Qt 정보를 위한 대화 상자를 표시합니다. Check for &Updates 업데이트을 확인 Check for new version of Mumble Mumble의 새 버전이 있는지 확인합니다 Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. Mumble 웹 페이지에 접속하여 새로운 버전이 나와있는지를 확인합니다. 만약 새로운 업데이트가 있다면 다운로드 URL을 공지 합니다 Sends a text message to all users in a channel. 채널 내의 모든 사용자에게 메시지를 송신합니다. Configure certificates for strong authentication This starts the wizard for creating, importing and exporting certificates for authentication against servers. 서버 인증을 위한 증명서를 작성·불러오기 또는 내보내기 위한 마법사를 시작합니다. Register user on server 서버상에 유저를 등록한다. This will permanently register the user on the server. 영구적으로 서버에 유저 등록합니다. Add &Friend 친구로 추가 Adds a user as your friend. 당신의 친구로 유저를 추가합니다. This will add the user as a friend, so you can recognize him on this and other servers. 사용자를 친구로 추가합니다. 다른 서버상에서도 그 사용자를 구분할 수 있습니다. &Remove Friend 친구를 삭제한다. Removes a user from your friends. 친구로부터 사용자를 삭제합니다. This will remove a user from your friends list. 친구 목록에서 사용자를 삭제합니다. &Update Friend 친구 갱신(&U) Update name of your friend. 친구의 이름을 업데이트합니다. Your friend uses a different name than what is in your database. This will update the name. 당신의 친구가 데이터베이스에 등록된 것과 다른 이름을 사용하고 있습니다. 이름을 갱신 합니다. Edit registered users list 등록된 사용자의 명단 편집 This opens the editor for registered users, which allow you to change their name or unregister them. 권한 관리를 위해 등록 된 사용자 편집 대화 상자를 엽니다.(사용자의 이름을 변경하거나 등록을 삭제하거나 할 수 있습니다). Add or remove text-based access tokens 액세스 토큰을 추가 또는 삭제합니다. &Minimal View 간소화 보기(&M) Toggle minimal window modes 간소화 모드 전환 This will toggle minimal mode, where the log window and menu is hidden. 로그 화면과 메뉴를 생략한 간소화 전환을 합니다. You muted and deafened %1. %1을 발언 청취 금지 했습니다. You unmuted and undeafened %1. %1의 발언·청취 금지를 해제했습니다. You undeafened %1. %1의 청취 금지를 해제했습니다. You suppressed %1. %1의 발언을 금지했습니다. %1 muted and deafened by %2. %2가%1의 발언·청취를 금지했습니다. %1 unmuted and undeafened by %2. %2가%1의 발언·청취 금지를 해제했습니다. %1 undeafened by %2. %2가%1의 청취 금지를 해제했습니다. %1 suppressed by %2. %2가%1의 발언을 금지했습니다. %1 moved to %2. %1은 %2로 이동 했습니다. %1 moved to %2 by %3. %1은 %3에 의해 %2로 이동 합니다. %1 moved in from %2 by %3. %1은 %3에 의해 %2으로 부터 이동하게 되었습니다. %1 is now muted and deafened. %1 발언 금지/청취 금지 상태가 되었습니다. Your account information can not be verified currently. Please try again later Welcome message: %1 환영 메세지: %1 Mumble: %1 Mumble: %1 You were denied %1 privileges in %2. 당신은%2에게%1의 권한을 거부당했습니다. %3 was denied %1 privileges in %2. %3은%2으로부터%1의 권한이 없습니다. Denied: Cannot modify SuperUser. 거부:SuperUser를 참조할 수 없습니다. Denied: Invalid channel name. 거부:유효하지 않은 채널 이름입니다. Denied: Text message too long. 거부:텍스트 메시지가 너무 깁니다. Denied: Operation not permitted in temporary channel. 거부:일시적으로 채널에 허가되지 않는 명령입니다. You need a certificate to perform this operation. 이 조작을 실행하려면 인증서가 필요합니다. %1 does not have a certificate. %1은 인증서를 가지고 있지 않습니다. Invalid username: %1. 없는 유저 이름 입니다: %1. Invalid username. 없는 유저 이름 입니다. Channel is full. 채널에 더이상 들어 갈수 없습니다. Channel nesting limit reached. 채널 중첩 제한에 이르렀습니다. Channel count limit reached. Need to delete channels before creating new ones. Permission denied. 권한이 없습니다. %1 connected and entered channel. %1 connected. %1 접속 했습니다. %1 is now muted. %1 발언 금지 상태가 되었습니다. %1 is now unmuted. %1의 발언 금지 상태가 해제되었습니다. Recording started 녹음 시작 Recording stopped 녹음 정지 %1 started recording. %1이 녹음을 개시했습니다. %1 stopped recording. %1이 녹음을 정지했습니다. You revoked your priority speaker status. You assumed priority speaker status. %1 revoked your priority speaker status. %1 gave you priority speaker status. You revoked priority speaker status for %1. You gave priority speaker status to %1. %1 revoked own priority speaker status. %1 assumed priority speaker status. %1 revoked priority speaker status for %2. %1 gave priority speaker status to %2. You were unmuted and undeafened by %1. %1이 당신의 발언·청취를 금지했습니다. You were muted by %1. %1이 당신의 발언을 금지 했습니다. You were undeafened by %1. %1이 당신의 청취 금지를 해제했습니다. You were suppressed. You were suppressed by %1. 당신의 발언이 금지되었습니다. You were unsuppressed. 당신의 발언 금지가 해제되었습니다. You were unsuppressed by %1. 당신은%1에 따라 발언 금지가 해제 되었습니다. You joined %1. You moved %1 to %2. 당신은 %1 를 %2로 이동 시켰습니다. %1 is recording %1은 녹음하고 있습니다 %1 renamed to %2 by %3. %1 disconnected. %1 접속 종료 했습니다. Server message from 서버 (Tree) (트리) (Channel) (채널) (Private) %2%1: %3 %2%1: %3 Failed to load Opus, it will not be available for audio encoding/decoding. The server requests minimum client version %1 The server requests positional audio be enabled. The server requests positional audio be disabled. The server requests Push-to-Talk be enabled. The server requests Push-to-Talk be disabled. You were unmuted by %1. %1가 당신의 발언 금지를 해제 하였습니다. You muted %1. 당신은 %1의 발언을 금지했습니다. You unsuppressed %1. 당신은 %1의 발언을 해제 했습니다. You unmuted %1. 당신은 %1의 발언 금지를 해제했습니다. %1 muted by %2. %2가 %1의 발언을 금지했습니다. %1 unsuppressed by %2. %1가 %2으로부터 발언 금지를 해제 하였습니다. %1 unmuted by %2. %1은 %2으로부터 발언 금지 해제 되었습니다. Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. 다른 클라이언트와 매치된 CELT코덱이 발견되지 않습니다. 당신은 모든 유저에게 말을 할수 없습니다. You were muted and deafened by %1. You were deafened by %1. %1이 당신의 청취을 금지했습니다. You were kicked from the server by %1: %2. 당신은%1에 의해 서버부터 강퇴 되었습니다.%2. %3 was kicked from the server by %1: %2. %3은%1에 의해 서버부터 강퇴 되었습니다.%2. You were kicked and banned from the server by %1: %2. 당신은%1에 의해 강퇴되어 서버에서 제명 되었습니다.%2. %3 was kicked and banned from the server by %1: %2. %3은%1에 의해 강퇴되어 서버에서 제명 되었습니다.%2. You were moved to %1 by %2. %2가 당신을 %1로 이동 시켰습니다. %1 entered channel. %1 채널에 입장 했습니다. Server connection rejected: %1. 서버 접속을 거부당했습니다:%1. Denied: %1. 거부당했습니다:%1. %1 renamed to %2. %1 left channel and disconnected. %1 채널 및 서버를 접속 종료 하였습니다. Message from %1 %1의 메시지 You have User Dragging set to "Do Nothing" so the user wasn't moved. You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. 채널을 드래그 했을 때 "아무것도 하지 않는다" 로 하겠습니까?; 한다면 다른 채널로 이동하지 못합니다. Unknown Channel Drag mode in UserModel::dropMimeData. UserModel;dropMimeData 불분명한 채널 D모드입니다. Remote controlling Mumble: Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) -jn, --jackname Set custom Jack client name. --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status Invocation 호출 Error: No RPC command specified RPC Welcome to Mumble. 멈블에 오신것을 환영 합니다 Skipping version check in debug mode. 디버깅 모드에서는 버전 확인을 스킵 합니다. Hide Frame 프레임을 숨깁니다. Toggle showing frame on minimal window 작게 표시했을 때에 프레임을 보일지 안 보일지를 바꿉니다 This will toggle whether the minimal window should have a frame for moving and resizing. 작게 표시했을 때 이동과 크기 변경을 위해 프레임을 표시할지 말지 바꿉니다. &Unlink All 모든 링크를 해제(&U) Reset the comment of the selected user. 선택한 사용자의 코멘트를 리셋 한다. &Join Channel 채널 입장(&J) View comment in editor 에디터에서 코멘트를 봅니다 Query server for connection information for user 사용자 접속 정보를 위한 쿼리. S&erver 서버(&E) &Self 상태(&S) &Unlink Plugins 플러그인을 해제(&U) Register yourself on the server 서버에 당신을 등록 합니다. Change your avatar image on this server 서버에 당신의 아바타 이미지를 변경 합니다 &Remove Avatar 아바타를 삭제(&R) Remove currently defined avatar image. 현재 설정되어 있는 아바타 이미지를 삭제합니다. Icon Toolbar 아이콘 툴바 Change your own comment 자신의 코멘트를 변경 Recording 녹음 Priority Speaker 우선도 스피커 &Copy URL URL를 복사(&C) Copies a link to this channel to the clipboard. 클립 보드에 이 채널의 링크를 복사합니다. Ignore Messages 메세지를 무시한다. Locally ignore user's text chat messages. 사용자의 텍스트 채팅 메시지를 로컬에서 무시합니다. Silently drops all text messages from the user. 유저로부터의 모든 메시지를 통보 없이 무시합니다. Edit ban list on server This lets you edit the server-side IP ban list. &Filter on/off 필터 키고/끄기(&F) Toggle the channel filter (Ctrl+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. Ctrl+F Ctrl+F &Hide Channel when Filtering Reset the avatar of the selected user. Locally adjust the user's speech volume. Opens a dialog with a volume slider. Use this on other users in the same room. &Developer &Hide Mumble Hides the main Mumble window. Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. Show the Developer Console Shows the Mumble Developer Console, where Mumble's log output can be inspected. &Connect... &Ban list... &Information... &Kick... &Ban... Local Volume Adjustment... Send &Message... &Add... &Remove... &Edit... Audio S&tatistics... &Settings... &Audio Wizard... Developer &Console... &About... About &Speex... About &Qt... &Certificate Wizard... &Register... Registered &Users... Change &Avatar... &Access Tokens... Reset &Comment... Reset &Avatar... View Comment... &Change Comment... R&egister... Show Shows the main Mumble window. Manual Manual Mumble Positional Audio Position X Y Z m Heading Azimuth Elevation ° Meta data Context Identity Set State Linked Activated Unhinge NetworkConfig Network 네트워크 Updates are mandatory when using snapshot releases. Snapshot이 출시 되었을 때는 업데이트가 필수입니다. Connection 연결 Use TCP compatibility mode Use TCP compatability mode TCP 호환 모드를 사용한다. <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). Reconnect when disconnected 연결 해제 시에 재접속을 시도합니다 <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. <b>연결 해제시 재접속을 시도합니다.</b><br/>이 설정을 하면 서버로의 접속이 실패했을 때, 10초 후에 다시 접속을 실시합니다. Reconnect automatically 재연결을 자동적으로 설정한다. Proxy 프록시 Type 타입 Type of proxy to connect through 프록시 접속 타입 Direct connection 직접 연결 HTTP(S) proxy HTTP(S) proxy SOCKS5 proxy SOCKS5 proxy Hostname 호스트 이름 Hostname of the proxy 프록시 호스트 이름 Force TCP mode 강제 TCP 모드 Enable QoS to prioritize packets 우선 순위자 패킷 때문에 QoS를 활성화 This will enable QoS, which will attempt to prioritize voice packets over other traffic. QoS를 설정합니다. QoS외의 통신 트래픽보다 음성 패킷의 우선 순위를 올립니다. Use Quality of Service Quality of Service를 사용한다. Don't send certificate to server and don't save passwords. (Not saved). 서버에 증명서를 보내지 않고 비밀 번호도 저장하지 않는다. (저장X) <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> <b>클라이언트 개인 정보의 송신을 억제합니다.</b><p>클라이언트 증명서를 사용하지 않고 접속을 위한 패스워드를 저장하지 않습니다. 이는 테스트 옵션에서 설정한 설정은 저장되지 않습니다.</p> Suppress certificate and password storage 증명서와 패스워드의 저장을 하지 않는다. <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>프록시 접속 타입.</b><br/>프록시를 통해 외부와의 접속을 하도록 합니다. 주의:프록시 접속을 할 경우 강제로 TCP호환 모드로 변경됩니다. 모든 음성 데이터는 관리 채널을 통해 송신되게 됩니다. <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. <b>프록시 호스트 이름</b><br/>이 필드에 네트워크 트래픽을 통과 시킬 프록시 서버의 호스트명을 설정합니다. Port 포트 Port number of the proxy 프록시 포트 번호 <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. <b>프록시 포트 번호</b><br/>프록시 접속에 사용하는 포토 번호를 지정합니다. Username 유저이름 Username for proxy authentication 프록시 인증 사용자 이름 <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>프록시 인증 사용자 이름</b><br/>프록시 서버 인증에 사용하는 유저명을 지정합니다. 프록시 서버가 인증을 실시하지 않은 경우나, 익명으로 접속하는 경우는 이 필드를 비워 주세요. Password 비밀번호 Password for proxy authentication 프록시 인증의 패스워드 <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>프록시 인증 패스워드</b><br/>프록시 서버의 인증에 사용하는 패스워드를 지정합니다. 프록시 서버가 인증을 받지 않거나 익명으로 접속하는 경우는 이 필드를 비워 주세요. Mumble services Mumble 서비스 Check for new releases of Mumble automatically. Mumble의 새 릴리스를 자동적으로 확인합니다. This will check for new releases of Mumble every time you start the program, and notify you if one is available. 프로그램을 시작할 때마다 Mumble의 새 버전을 확인하고, 있다면 확인 합니다. Check for application updates on startup 시작시 Mumble의 업데이트을 체크한다 Check for new releases of plugins automatically. 플러그인의 새 릴리스를 자동적으로 확인합니다. This will check for new releases of plugins every time you start the program, and download them automatically. 프로그램이 시작할 때마다 새로운 플러그인을 확인하고 존재하면 자동으로 다운로드한다. <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. <b>익명으로 통계 정보를 송신</b>Mumble의 개발 팀은 규모가 작기 때문에 당장 필요한 것에 중점을 두어야 합니다. 통계 정보를 송신함으로써 프로젝트에서 사용자가 자주 사용하는 기능이 무엇인지 알고 중점을 어디 둘지를 결정하는 도움이 됩니다. Submit anonymous statistics to the Mumble project Mumble프로젝트에 익명으로 통계를 송신한다. Submit anonymous statistics 익명으로 이용 상태를 본다. Reconnect to last used server when starting Mumble Mumble을 시작할 때 마지막으로 쓰던 서버에 다시 접속합니다 Reconnect to last server on startup 시작시 마지막으로 접속한 서버에 다시 접속한다 Download plugin and overlay updates on startup 시작시 플러그 인과 오버레이의 업데이트를 다운로드한다. Privacy Prevent OS information being sent to Mumble servers and web servers <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. Do not send OS information to Mumble servers and web servers Overlay Silent 조용히 Talking 대화 Whisper 귓속말 Shout 외치기 Channel 채널 Failed to create communication with overlay at %2: %1. No overlay will be available. 오버레이:%2:%1와의 통신 생성에 실패 했습니다. 유효한 오버레이는 없습니다. OverlayClient Filter 필터 Only talking 대화 중인 사람만 Talking and recently active All in current channel 현재 채널에 있는 사람 모두 All in linked channels 링크 중인 채널에 있는 사람 모두 Always show yourself 자신을 항상 표시한다. Configure recently active time (%1 seconds)... 최근 활동 시간(%1초)을 설정합니다... Columns Sort 종류 Alphabetically 알파벳 순 Last state change 마지막 상태 변경 Edit... 에딧... Reset Zoom 확대 초기화 Configure recently active time 최근 활동 시간을 설정합니다. Amount of seconds users remain active after talking: OverlayConfig To move the users, drag the little red dot. 사용자를 움직이려면, 작은 붉은 점을 끌어 주세요. To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. 아바타의 사이즈를 바꾸려면 사용자 위에서 마우스 휠을 움직여 주세요. For more options, right click a user. For more options, rightclick a user. 추가 설정을 하려면 유저 오른쪽 클릭해 주세요. Launcher Filter Overlay 오버레이 Choose executable 실행 파일을 선택 Choose application 어플리케이션 선택 Choose path Load Overlay Presets 오버레이 프리셋 불러오기 Mumble overlay presets (*.mumblelay) Mumble 오버레이 프리셋 (*.mumblelay) Save Overlay Presets 오버레이 프리셋 저장 Options 옵션 Enable overlay. 오버레이 켜기. Enable Overlay 오버레이 켜기 This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. 오버레이를 활성화 할지 아닐지를 설정합니다. 이 설정은 애플리케이션이 시작할 때만 체크됩니다. Mumble이 동작 중, 애플리케이션이 시작하기 전에 이 옵션이 체크 되어 있는지 확인해 주세요.<br/> Layout 레이아웃 Blacklist 블랙리스트 Whitelist 화이트리스트 Uninstall Overlay 오버레이 삭제하기 Overlay Installation 오버레이 설치하기 Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. Mumble은 Mumble오버레이가 설치되지 않은 것을 감지했습니다. 아래의 버튼을 클릭하여 오버레이를 인스톨 해 주세요 Install Mumble Overlay Mumble 오버레이 설치하기. Overlay Upgrade 오버레이 업그레이드 Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. Mumble 오래된 오버레이 지원 파일이 설치되어 있는 것을 감지했습니다. 파일을 최신 버전으로 업그레이드하기 위해 다음의 버튼을 누르세요. Upgrade Mumble Overlay Mumble 오버레이를 업그레이드 Display a frame counter in the overlay 오버레이상에 프레임 카운터를 표시합니다 Show FPS counter FPS 카운터를 표시 Load an overlay preset from file 오버레이 프리셋를 불러 옵니다 Load… 불러오기… Save your overlay settings to file 오버레이의 설정을 저장합니다 Save… 저장… Set the overlay font. 오버레이의 폰트를 설정합니다. Set the overlay text color. 오버레이 텍스트의 색을 설정합니다. Color 컬러 Remove 삭제 Font 폰트 FPS and Clock Display FPS, Clock 표시 Display a clock in the overlay showing the current local time (system time). Show Clock 시계 보기 Overlay Exceptions Overlay Exception Mode Allowed launchers Add Allowed programs Allowed paths Blacklisted programs OverlayEditor State 상태 User is not talking 사용자는 말을 하지 않는다. Passive 수동 User is talking in your channel or a linked channel 사용자는 당신이 있는 채널이나 혹은 링크된 채널로 말하고 있습니다. Talking 대화중 User is whispering to you privately 사용자는 당신에게 개인적으로 귓속말 중입니다. Private Whisper 개인 귓속말 User is shouting to your channel 사용자는 당신이 있는 채널에 외치고 있습니다 Channel Whisper 채널 귓속말 Zoom 확대 Zoom Factor 확대 요소 Enabled Elements 유효한 요소 User avatar, chosen by each user 사용자의 아바타, 각각의 사용자에 의해 선택됨 Avatar 아바타 User's name 유저의 이름 Username 유저이름 Name of user's channel, if outside your current channel 사용자의 채널 이름, 당신이 있는 채널 밖에 있는 경우 Channel 채널 Muted or deafened 발언 금지 또는 청취 금지 Mute state 발언 금지 상태 Bounding box, automatically shrunk to minimum size to contain all visible elements 바운딩 박스, 모든 가시 요소를 포함한 최소 크기로 자동적으로 줄입니다. Bounding box 바운딩 박스 Overlay Editor 오버레이 에디터 OverlayEditorScene Layout preset 레이아웃 프리셋 Large square avatar 큰 사각형 아바타 Avatar and Name 아바타 / 이름 User Opacity 유저 불투명도 %1% %1% Object Opacity 오브젝트 불투명도 Alignment 자리매김 Left 왼쪽 Center 중앙 Right 오른쪽 Top Bottom 아래 Color... 컬러... Font... 폰트... Bounding box Pen width Padding Padding Pen color 펜 생삭 Fill color 채우기 색상 Pick pen color 펜 컬러 선택 Pick fill color 채우기 색상 선택 Pick color 컬러 선택 Pick font 폰트 선택 PluginConfig Plugins 플러그인 Plugin has no configure function. 플러그인에 설정 기능이 없습니다. Plugin has no about function. 플러그인의 설정 항목이 없습니다. Options 옵션 Enable plugins and transmit positional information 플러그인이 활성화 되면 위치 정보를 송신합니다 This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. 이 설정은 지원된 게임 플러그 인이 위치 정보를 취득해 음성 패킷과 함께 송신할 수 있게 합니다. 다른 유저로부터, 게임 내에서 당신의 캐릭터가 있는 방향으로 소리를 들리도록 할 수 있습니다. Link to Game and Transmit Position 게임과 전송 위치를 연결 합니다. Reloads all plugins 모든 플러그인을 다시 읽습니다 This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. 플러그인을 다시 읽습니다. 플러그인의 디렉토리에 추가하거나 변경을 할 때 사용해 주세요. &Reload plugins 플러그인 다시 읽기(&R) Information about plugin 플러그인에 대한 정보 This shows a small information message about the plugin. 플러그인에 대한 간단한 정보를 표시합니다. &About &About Show configuration page of plugin 플러그인 설정 항목을 표시합니다. This shows the configuration page of the plugin, if any. 플러그인 설정 페이지가 있으면 표시합니다. &Configure 설정 Name 이름 Enabled 유효 Plugins Skipping plugin update in debug mode. 디버깅 모드에서는 플러그인의 업데이트가 스킵 됩니다. Downloaded new or updated plugin to %1. 업데이트된 플러그인을 %1에 다운 받았습니다. Failed to install new plugin to %1. %1에 새로운 플러그인을 설치할 수 없습니다. %1 lost link. %1은 링크가 소실 되었습니다. %1 linked. %1은 링크되었습니다. PortAudioSystem Default Device 기본 디바이스 PulseAudioSystem Default Input 기본 입력 Default Output 기본 출력 QApplication Failed to restart mumble Mumble failed to restart itself. Please restart it manually. RichTextEditor Failed to load image 이미지 불러오기를 실패 했습니다. Image file too large to embed in document. Please use images smaller than %1 kB. 문서 이미지 삽입 파일이 너무 큽니다%1 kB보다 작은 용량을 사용해 주세요. Message is too long. 메세지가 너무 깁니다. Display 표시 Source Text 소스 텍스트 &Bold &Bold Ctrl+B Ctrl+B &Italic &Italic Italic 이탈릭체 Ctrl+I Ctrl+I Underline 밑줄긋기 Ctrl+U Ctrl+U Color 컬러 Insert Link 링크 삽입 Ctrl+L Ctrl+L Insert Image 이미지 삽입 RichTextEditorLink Add Link 링크 추가 URL URL Text 텍스트 ServerHandler Unable to resolve hostname Server is not responding to TCP pings UDP packets cannot be sent to or received from the server. Switching to TCP mode. UDP패킷을 서버에 보낼 수가 없거나 서버로부터 받을 수 없습니다. TCP모드로 전환합니다. UDP packets cannot be sent to the server. Switching to TCP mode. UDP패킷을 서버에 보낼 수 없습니다. TCP모드로 전환합니다. UDP packets cannot be received from the server. Switching to TCP mode. UDP패킷을 서버로부터 받을 수 없습니다. TCP모드로 전환합니다. UDP packets can be sent to and received from the server. Switching back to UDP mode. UDP패킷 서버에 송수신을 하게 되었습니다. UDP모드로 전환합니다. Connection timed out 연결시간 초과 ServerView Favorite 즐겨찾기 LAN LAN Public Internet 공개 인터넷 Unknown Africa 아프리카 Asia 아시아 North America 북미 South America 남미 Europe 유럽 Oceania 오세아니아 ShortcutActionWidget Unassigned 인증이 되지 않은 ShortcutDelegate On 켜기 Off 끄기 Toggle 토글 Unassigned 인증이 되지 않은 ShortcutKeyWidget Press Shortcut 단축키를 누른다 ShortcutTargetDialog Root 루트 Parent 원본 Current 현재 Subchannel #%1 서브채널 #%1 ShortcutTargetWidget ... ... , , Root 루트 Parent 원본 Current 현재 Subchannel #%1 서브채널 #%1 Invalid 무효 Empty <Empty> <빈칸> ShortcutToggleWidget Off 끄기 Toggle 토글 On 켜기 TextMessage Enter text 텍스트 입력 If checked the message is recursively sent to all subchannels 체크하면 모든 서브 채널에 재귀적으로 메시지가 송신됩니다 Send recursively to subchannels 서브 채널에 재귀적으로 보낸다 Tokens Empty Token 비어있는 토큰 Mumble - Access Tokens Mumble-액세스 토큰 List of access tokens on current server 현재 서버의 액세스 토큰 목록 <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. <b>연결된 서버의 액세스 토큰을 편집할 수 있습니다.</b> <br/> 액세스 토큰은 채널 접속을 단순하게 관리, 즉 패스워드로 사용하는 것이 가능한 문자열입니다. Mumble은 당신이 쓴 토큰을 기록해 다음에 서버에 접속했을 때 재전송 합니다. 매번 입력할 필요는 없습니다. Add a token 토큰 추가 &Add 추가 Remove a token 토큰 삭제 &Remove 삭제(&R) UserEdit Registered Users 인증된 사용자 Remove 삭제 Rename 이름 변경 Who are you looking for? 누구를 찾고 계신가요? Days 날짜 Weeks Months Years 년도 Inactive for Registered users: %n account(s) 인증된 사용자: %n 계정(s) UserInformation User Information 유저 정보 Connection Information 연결 정보 Version Version OS OS Certificate 인증 IP Address IP 주소 CELT Versions CELT 버전 Details... 상세정보 Ping Statistics 핑 상태 Pings received 받은 핑 Average ping 평균 핑 TCP (Control) TCP (컨트롤) UDP (Voice) UDP (목소리) UDP Network statistics UDP 네트워크 상태 Good 좋음 Late 지연 Lost 소멸 Resync 재동기화 From Client 클라이언트로부터 To Client 클라이언트에게 Connection time 연결 시간 %1w %1w %1d %1d %1h %1h %1m %1m %1s %1s , , %1 (%2) %1.%2.%3 (%4) %1 (%2) Supported 지원됩니다. Not Supported 지원되지 않습니다. Not Reported 보고되지 않습니다 %1 online (%2 idle) %1 online (%2 idle) %1 online %1 online %1 kbit/s %1 kbit/s Bandwidth GroupBox 네트워크 대역 Bandwidth Label 네트워크 대역 Ping deviation 불규칙 핑 UserListModel Nick Inactive days 비활성 경과시간 Last channel 마지막 채널 Last seen: %1 Last seen: %1 Never 항상 Channel ID: %1 UserLocalVolumeDialog Local volume for other users <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. Adjusting local volume for %1 dB <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: 서버에 접속하고 있는 유저입니다. 사용자의 왼쪽의 아이콘은 말하고 있는지를 의미합니다: Talking to your channel. 당신이 있는 채널에 말하고 있습니다. Shouting directly to your channel. Whispering directly to your channel. 채널에 직접 말하고 있습니다. Whispering directly to you. 당신에게 직접 귓속말 중 입니다. Not talking. 말을 하지 않는다. This is a channel on the server. The icon indicates the state of the channel: 서버상의 채널입니다. 아이콘은 채널의 상태를 의미합니다: Your current channel. 현재 채널. A channel that is linked with your channel. Linked channels can talk to each other. 당신이 있는 채널과 링크하는 채널입니다. 링크하는 채널은 서로 말할 수 있습니다. A channel on the server that you are not linked to. 당신이 링크하지 않은 서버 상의 경로입니다. This shows the flags the user has on the server, if any: 사용자가 서버상에서 가지고 있는 플래그를 표시합니다: On your friend list 친구 목록 Authenticated user 인증된 사용자 Muted (manually muted by self) 발언 금지(자신에 의해 발언을 금지) Muted (manually muted by admin) 발언 금지(관리자에 의해 발언 금지) Muted (not allowed to speak in current channel) 발언 금지(이 채널에서 발언이 허용되지 않습니다) Muted (muted by you, only on your machine) 발언 금지(자신의 발언 금지, 자신의 마이크만) Muted (push-to-mute) Deafened (by self) 청취 금지(자신에 의한) Deafened (by admin) 청취 금지(관리자에 의해) User has a new comment set (click to show) 이 유저는 새로운 코멘트를 갖고 있습니다.( 보려면 클릭 하세요) User has a comment set, which you've already seen. (click to show) 이 유저는 당신이 이미 살펴본 코멘트를 가지고 있습니다.( 보려면 클릭 하세요) Ignoring Text Messages 이 텍스트 메시지를 무시합니다. This shows the flags the channel has, if any: 이 채널이 가지고 있는 플래그를 표시합니다: Channel has a new comment set (click to show) 이 채널은 새로운 코멘트를 가지고 있습니다.(보려면 클릭하세요) Channel has a comment set, which you've already seen. (click to show) 이 채널은 당신이 이미 살펴본 코멘트를 가지고 있습니다.(보려면 클릭하세요) Channel will be hidden when filtering is enabled 필터가 활성되어 있을 때 채널을 숨깁니다. Name 이름 Flags 플래그 Are you sure you want to drag this user? Are you sure you want to drag this channel? 정말 이 채널을 드래그 합니까? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. 자동적으로 이동을 실행 할 수 없습니다. 수치적 정렬의 지표를 변경하거나 수동으로 조정해 주세요. VersionCheck Upgrade Mumble 업그레이드 Mumble A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? Mumble의 새 버전이 발견되어 자동적으로 다운로드 했습니다. 이 버전으로 업그레이드하거나 최신 안정된 릴리스에 다운 그레이드 하는 것을 권장합니다. 이 인스톨러를 설치합니까? Failed to launch snapshot installer. snapshot의 인스톨러 구동에 실패했습니다. Corrupt download of new version detected. Automatically removed. 새로운 버전의 잘못된 다운로드가 감지되었습니다. 자동 삭제 되었습니다. Downloading new snapshot from %1 to %2 %1으로부터%2에 새로운 snapshot을 다운로드 중입니다 Failed to write new version to disk. Failed to write new version to disc. 디스크에 새 버전을 쓰는데 실패했습니다. Mumble failed to retrieve version information from the central server. Mumble이 중앙 서버에서 버전 정보 취득에 실패했습니다 ViewCert Certificate Chain Details 서명 체인 내용 Certificate chain 서명 체인 Certificate details 서명 내용 Common Name Organization Subunit Country Locality State Valid from: %1 발행자: %1 Valid to: %1 발행 대상: %1 Serial: %1 시리얼: %1 Public Key: %1 bits %2 Public Key: %1 bits %2 RSA RSA DSA DSA Digest (SHA-1): %1 Digest (SHA-1): %1 Digest (SHA-256): %1 Email: %1 Email: %1 DNS: %1 DNS: %1 Issued by: 발행의: Unit Name VoiceRecorder Recorder failed to create directory '%1' 레코더는 디렉토리'%1'의 만들기에 실패했습니다 Recorder failed to open file '%1' 레코더는 '%1'에 열기를 실패 했습니다. .wav - Uncompressed .wav - 무압축 .ogg (Vorbis) - Compressed .ogg (Vorbis) - 압축 .au - Uncompressed .au - 무압축 .flac - Lossless compressed .flac - 무손실 압축 VoiceRecorderDialog Recorder 녹음 Control 컨트롤 00:00:00 00:00:00 &Start 스타트(&S) S&top 스탑(&T) Mode 모드 Multichannel 멀티채널 Output 출력 Output format 출력 형식 Target directory 대상 디렉토리 Filename 파일 이름 &Browse... 참조(&B) Valid variables are: 유효한 변수는: Inserts the user's name 여기에 사용자 이름을 넣으세요. Inserts the current date 현재 날짜를 삽입 Inserts the current time 현재 시간을 삽입 Inserts the hostname 호스트 이름을 삽입 Recorder still running 이미 녹음중 입니다. Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? 녹음기을 중지하지 않고 닫을 경우 저장되지 않은 녹음이 사라집니다. 녹음기를 정말 닫으시겠습니까? Unable to start recording. Not connected to a server. 녹음을 시작할 수 없습니다. 서버에 접속하지 않습니다. The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. 현재 접속한 서버는 1.2.2이전의 버전입니다. 프라이버시 문제로 1.2.3보다 오래 된 버전의 서버상에서는 녹음할 수 없습니다. 자세한 것은 서버 관리자에게 연락하세요. There is already a recorder active for this server. 이 서버의 녹음기가 이미 활성화 중입니다. Please select a recording format. 녹음 형식을 선택하세요 Stopping 중지 Select target directory 대상 디렉토리를 선택 Downmix 다운 믹스 WASAPIInput Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone. WASAPISystem Default Device 기본 디바이스 qwPTTButtonWidget Mumble PTT 멈블 PTT Push to talk 누르며 말하기 mumble-1.3.4/src/mumble/Usage.cpp0000664000175000017500000000365114010707273016466 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "Usage.h" #include "ClientUser.h" #include "LCD.h" #include "Global.h" #include "NetworkConfig.h" #include "OSInfo.h" #include "Version.h" Usage::Usage(QObject *p) : QObject(p) { qbReport.open(QBuffer::ReadWrite); qdsReport.setDevice(&qbReport); qdsReport.setVersion(QDataStream::Qt_4_4); qdsReport << static_cast(2); // Wait 10 minutes (so we know they're actually using this), then... QTimer::singleShot(60 * 10 * 1000, this, SLOT(registerUsage())); } void Usage::registerUsage() { if (! g.s.bUsage || g.s.uiUpdateCounter == 0) // Only register usage if allowed by the user and first wizard run has finished return; QDomDocument doc; QDomElement root=doc.createElement(QLatin1String("usage")); doc.appendChild(root); QDomElement tag; QDomText t; OSInfo::fillXml(doc, root); tag=doc.createElement(QLatin1String("in")); root.appendChild(tag); t=doc.createTextNode(g.s.qsAudioInput); tag.appendChild(t); tag=doc.createElement(QLatin1String("out")); root.appendChild(tag); t=doc.createTextNode(g.s.qsAudioOutput); tag.appendChild(t); tag=doc.createElement(QLatin1String("lcd")); root.appendChild(tag); t=doc.createTextNode(QString::number(g.lcd->hasDevices() ? 1 : 0)); tag.appendChild(t); QBuffer *qb = new QBuffer(); qb->setData(doc.toString().toUtf8()); qb->open(QIODevice::ReadOnly); QNetworkRequest req(QUrl(QLatin1String("https://usage-report.mumble.info/v1/report"))); Network::prepareRequest(req); req.setHeader(QNetworkRequest::ContentTypeHeader, QLatin1String("text/xml")); QNetworkReply *rep = g.nam->post(req, qb); qb->setParent(rep); connect(rep, SIGNAL(finished()), rep, SLOT(deleteLater())); } mumble-1.3.4/src/mumble/TaskList.cpp0000664000175000017500000000416514010707273017161 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "TaskList.h" #include #include #include extern bool bIsWin7; void TaskList::addToRecentList(QString name, QString user, QString host, int port) { if (! bIsWin7) return; HRESULT hr; IShellLink *link = NULL; IPropertyStore *ps = NULL; PROPVARIANT pt; hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, __uuidof(IShellLink), reinterpret_cast(&link)); if (!link || FAILED(hr)) return; QUrl url; url.setScheme(QLatin1String("mumble")); url.setUserName(user); url.setHost(host); url.setPort(port); #if QT_VERSION >= 0x050000 QUrlQuery query; query.addQueryItem(QLatin1String("title"), name); query.addQueryItem(QLatin1String("version"), QLatin1String("1.2.0")); url.setQuery(query); #else url.addQueryItem(QLatin1String("title"), name); url.addQueryItem(QLatin1String("version"), QLatin1String("1.2.0")); #endif QSettings settings(QLatin1String("HKEY_CLASSES_ROOT"), QSettings::NativeFormat); QString app = settings.value(QLatin1String("mumble/DefaultIcon/.")).toString(); if (app.isEmpty() || ! QFileInfo(app).exists()) app = QCoreApplication::applicationFilePath(); link->SetPath(app.toStdWString().c_str()); link->SetArguments(QString::fromLatin1(url.toEncoded()).toStdWString().c_str()); hr = link->QueryInterface(__uuidof(IPropertyStore), reinterpret_cast(&ps)); if (FAILED(hr)) { qFatal("TaskList: Failed to get property store"); goto cleanup; } InitPropVariantFromString(name.toStdWString().c_str(), &pt); hr = ps->SetValue(PKEY_Title, pt); PropVariantClear(&pt); if (FAILED(hr)) { qFatal("TaskList: Failed to set title"); goto cleanup; } hr = ps->Commit(); if (FAILED(hr)) { qFatal("TaskList: Failed commit"); goto cleanup; } SHAddToRecentDocs(SHARD_LINK, link); cleanup: if (ps) ps->Release(); if (link) link->Release(); } mumble-1.3.4/src/mumble/LCD.cpp0000664000175000017500000002435714010707273016032 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "LCD.h" #include "ClientUser.h" #include "Channel.h" #include "Message.h" #include "ServerHandler.h" // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" QList *LCDEngineRegistrar::qlInitializers; LCDEngineRegistrar::LCDEngineRegistrar(LCDEngineNew cons) { if (! qlInitializers) qlInitializers = new QList(); n = cons; qlInitializers->append(n); } LCDEngineRegistrar::~LCDEngineRegistrar() { qlInitializers->removeAll(n); if (qlInitializers->isEmpty()) { delete qlInitializers; qlInitializers = NULL; } } static ConfigWidget *LCDConfigDialogNew(Settings &st) { return new LCDConfig(st); } class LCDDeviceManager : public DeferInit { protected: ConfigRegistrar *crLCD; public: QList qlEngines; QList qlDevices; void initialize(); void destroy(); }; void LCDDeviceManager::initialize() { if (LCDEngineRegistrar::qlInitializers) { foreach(LCDEngineNew engine, *LCDEngineRegistrar::qlInitializers) { LCDEngine *e = engine(); qlEngines.append(e); foreach(LCDDevice *d, e->devices()) { qlDevices << d; } } } if (qlDevices.count() > 0) { crLCD = new ConfigRegistrar(5900, LCDConfigDialogNew); } else { crLCD = NULL; } } void LCDDeviceManager::destroy() { qlDevices.clear(); foreach(LCDEngine *e, qlEngines) { delete e; } delete crLCD; } static LCDDeviceManager devmgr; /* --- */ LCDConfig::LCDConfig(Settings &st) : ConfigWidget(st) { setupUi(this); QTreeWidgetItem *qtwi; foreach(LCDDevice *d, devmgr.qlDevices) { qtwi = new QTreeWidgetItem(qtwDevices); qtwi->setFlags(Qt::ItemIsEnabled |Qt::ItemIsUserCheckable); qtwi->setText(0, d->name()); qtwi->setToolTip(0, Qt::escape(d->name())); QSize lcdsize = d->size(); QString qsSize = QString::fromLatin1("%1x%2").arg(lcdsize.width()).arg(lcdsize.height()); qtwi->setText(1, qsSize); qtwi->setToolTip(1, qsSize); qtwi->setCheckState(2, Qt::Unchecked); qtwi->setToolTip(2, tr("Enable this device")); } } QString LCDConfig::title() const { return tr("LCD"); } QIcon LCDConfig::icon() const { return QIcon(QLatin1String("skin:config_lcd.png")); } void LCDConfig::load(const Settings &r) { QList qlItems = qtwDevices->findItems(QString(), Qt::MatchContains); foreach(QTreeWidgetItem *qtwi, qlItems) { QString qsName = qtwi->text(0); bool enabled = r.qmLCDDevices.contains(qsName) ? r.qmLCDDevices.value(qsName) : true; qtwi->setCheckState(2, enabled ? Qt::Checked : Qt::Unchecked); } loadSlider(qsMinColWidth, r.iLCDUserViewMinColWidth); loadSlider(qsSplitterWidth, r.iLCDUserViewSplitterWidth); } void LCDConfig::save() const { QList qlItems = qtwDevices->findItems(QString(), Qt::MatchContains); foreach(QTreeWidgetItem *qtwi, qlItems) { QString qsName = qtwi->text(0); s.qmLCDDevices.insert(qsName, qtwi->checkState(2) == Qt::Checked); } s.iLCDUserViewMinColWidth = qsMinColWidth->value(); s.iLCDUserViewSplitterWidth = qsSplitterWidth->value(); } void LCDConfig::accept() const { foreach(LCDDevice *d, devmgr.qlDevices) { bool enabled = s.qmLCDDevices.value(d->name()); d->setEnabled(enabled); } g.lcd->updateUserView(); } void LCDConfig::on_qsMinColWidth_valueChanged(int v) { qlMinColWidth->setText(QString::number(v)); } void LCDConfig::on_qsSplitterWidth_valueChanged(int v) { qlSplitterWidth->setText(QString::number(v)); } /* --- */ LCD::LCD() : QObject() { #ifdef Q_OS_MAC qfNormal.setStyleStrategy(QFont::NoAntialias); qfNormal.setKerning(false); qfNormal.setPointSize(10); qfNormal.setFixedPitch(true); qfNormal.setFamily(QString::fromLatin1("Andale Mono")); #else qfNormal = QFont(QString::fromLatin1("Arial"), 7); #endif qfItalic = qfNormal; qfItalic.setItalic(true); qfBold = qfNormal; qfBold.setWeight(QFont::Black); qfItalicBold = qfBold; qfItalic.setItalic(true); QFontMetrics qfm(qfNormal); iFontHeight = 10; initBuffers(); iFrameIndex = 0; qtTimer = new QTimer(this); connect(qtTimer, SIGNAL(timeout()), this, SLOT(tick())); foreach(LCDDevice *d, devmgr.qlDevices) { bool enabled = g.s.qmLCDDevices.contains(d->name()) ? g.s.qmLCDDevices.value(d->name()) : true; d->setEnabled(enabled); } qiLogo = QIcon(QLatin1String("skin:mumble.svg")).pixmap(48,48).toImage().convertToFormat(QImage::Format_MonoLSB); #if QT_VERSION >= 0x050600 && QT_VERSION <= 0x050601 // Don't invert the logo image when using Qt 5.6. // See mumble-voip/mumble#2429 #else qiLogo.invertPixels(); #endif updateUserView(); } void LCD::tick() { iFrameIndex ++; updateUserView(); } void LCD::initBuffers() { foreach(LCDDevice *d, devmgr.qlDevices) { QSize size = d->size(); if (! qhImageBuffers.contains(size)) { size_t buflen = (size.width() * size.height()) / 8; qhImageBuffers[size] = new unsigned char[buflen]; qhImages[size] = new QImage(qhImageBuffers[size], size.width(), size.height(), QImage::Format_MonoLSB); } } } void LCD::destroyBuffers() { foreach(QImage *img, qhImages) delete img; qhImages.clear(); foreach(unsigned char *buf, qhImageBuffers) delete [] buf; qhImageBuffers.clear(); } struct ListEntry { QString qsString; bool bBold; bool bItalic; ListEntry(const QString &qs, bool bB, bool bI) : qsString(qs), bBold(bB), bItalic(bI) {}; }; static bool entriesSort(const ListEntry &a, const ListEntry &b) { return a.qsString < b.qsString; } void LCD::updateUserView() { if (qhImages.count() == 0) return; QStringList qslTalking; User *me = g.uiSession ? ClientUser::get(g.uiSession) : NULL; Channel *home = me ? me->cChannel : NULL; bool alert = false; foreach(const QSize &size, qhImages.keys()) { QImage *img = qhImages.value(size); QPainter painter(img); painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing, false); #if QT_VERSION >= 0x050600 && QT_VERSION <= 0x050601 // Use Qt::white instead of Qt::color1 on Qt 5.6. // See mumble-voip/mumble#2429 painter.setPen(Qt::white); #else painter.setPen(Qt::color1); #endif painter.setFont(qfNormal); img->fill(Qt::color0); if (! me) { qmNew.clear(); qmOld.clear(); qmSpeaking.clear(); qmNameCache.clear(); painter.drawImage(0, 0, qiLogo); painter.drawText(60, 20, tr("Not connected")); continue; } foreach(User *p, me->cChannel->qlUsers) { if (! qmNew.contains(p->uiSession)) { qmNew.insert(p->uiSession, Timer()); qmNameCache.insert(p->uiSession, p->qsName); qmOld.remove(p->uiSession); } } foreach(unsigned int session, qmNew.keys()) { User *p = ClientUser::get(session); if (!p || (p->cChannel != me->cChannel)) { qmNew.remove(session); qmOld.insert(session, Timer()); } } QMap old; foreach(unsigned int session, qmOld.keys()) { Timer t = qmOld.value(session); if (t.elapsed() > 3000000) { qmNameCache.remove(session); } else { old.insert(session, qmOld.value(session)); } } qmOld = old; QList entries; entries << ListEntry(QString::fromLatin1("[%1:%2]").arg(me->cChannel->qsName).arg(me->cChannel->qlUsers.count()), false, false); bool hasnew = false; QMap speaking; foreach(Channel *c, home->allLinks()) { foreach(User *p, c->qlUsers) { ClientUser *u = static_cast(p); bool bTalk = (u->tsState != Settings::Passive); if (bTalk) { speaking.insert(p->uiSession, Timer()); } else if (qmSpeaking.contains(p->uiSession)) { Timer t = qmSpeaking.value(p->uiSession); if (t.elapsed() > 1000000) qmSpeaking.remove(p->uiSession); else { speaking.insert(p->uiSession, t); bTalk = true; } } if (bTalk) { alert = true; entries << ListEntry(p->qsName, true, (p->cChannel != me->cChannel)); } else if (c == me->cChannel) { if (qmNew.value(p->uiSession).elapsed() < 3000000) { entries << ListEntry(QLatin1String("+") + p->qsName, false, false); hasnew = true; } } } } qmSpeaking = speaking; foreach(unsigned int session, qmOld.keys()) { entries << ListEntry(QLatin1String("-") + qmNameCache.value(session), false, false); } if (! qmOld.isEmpty() || hasnew || ! qmSpeaking.isEmpty()) qtTimer->start(500); else qtTimer->stop(); qSort(++ entries.begin(), entries.end(), entriesSort); const int iWidth = size.width(); const int iHeight = size.height(); const int iUsersPerColumn = iHeight / iFontHeight; const int iSplitterWidth = g.s.iLCDUserViewSplitterWidth; const int iUserColumns = (entries.count() + iUsersPerColumn - 1) / iUsersPerColumn; int iColumns = iUserColumns; int iColumnWidth = 1; while (iColumns >= 1) { iColumnWidth = (iWidth - (iColumns-1)*iSplitterWidth) / iColumns; if (iColumnWidth >= g.s.iLCDUserViewMinColWidth) break; --iColumns; } int row = 0, col = 0; foreach(const ListEntry &le, entries) { if (row >= iUsersPerColumn) { row = 0; ++col; } if (col > iColumns) break; if (! le.qsString.isEmpty()) { if (le.bBold && le.bItalic) painter.setFont(qfItalicBold); else if (le.bBold) painter.setFont(qfBold); else if (le.bItalic) painter.setFont(qfItalic); else painter.setFont(qfNormal); painter.drawText(QRect(col * (iColumnWidth + iSplitterWidth), row * iFontHeight, iColumnWidth, iFontHeight+2), Qt::AlignLeft, le.qsString); } ++row; } } foreach(LCDDevice *d, devmgr.qlDevices) { QImage *img = qhImages[d->size()]; if (! img) continue; d->blitImage(img, alert); } } LCD::~LCD() { destroyBuffers(); } bool LCD::hasDevices() { return (! devmgr.qlDevices.isEmpty()); } /* --- */ LCDEngine::LCDEngine() : QObject() { } LCDEngine::~LCDEngine() { foreach(LCDDevice *lcd, qlDevices) delete lcd; } LCDDevice::LCDDevice() { } LCDDevice::~LCDDevice() { } /* --- */ uint qHash(const QSize &size) { return ((size.width() & 0xffff) << 16) | (size.height() & 0xffff); } mumble-1.3.4/src/mumble/OverlayUser.h0000664000175000017500000000242014010707273017340 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_OVERLAYUSER_H_ #define MUMBLE_MUMBLE_OVERLAYUSER_H_ #include #include "Overlay.h" class OverlayUser : public OverlayGroup { private: Q_DISABLE_COPY(OverlayUser) public: enum { Type = UserType + 1 }; protected: QGraphicsPixmapItem *qgpiMuted, *qgpiDeafened; QGraphicsPixmapItem *qgpiAvatar; QGraphicsPixmapItem *qgpiName[4]; QGraphicsPixmapItem *qgpiChannel; QGraphicsPathItem *qgpiBox; OverlaySettings *os; unsigned int uiSize; ClientUser *cuUser; Settings::TalkState tsColor; QString qsName; QString qsChannelName; QByteArray qbaAvatar; void setup(); public: OverlayUser(ClientUser *cu, unsigned int uiSize, OverlaySettings *osptr); OverlayUser(Settings::TalkState ts, unsigned int uiSize, OverlaySettings *osptr); void updateUser(); void updateLayout(); int type() const Q_DECL_OVERRIDE; static QRectF scaledRect(const QRectF &qr, qreal scale); static QPointF alignedPosition(const QRectF &box, const QRectF &item, Qt::Alignment a); }; #endif mumble-1.3.4/src/mumble/About.h0000664000175000017500000000113614010707273016135 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_ABOUT_H_ #define MUMBLE_MUMBLE_ABOUT_H_ #include #include #if QT_VERSION >= 0x050000 # include #else # include #endif class AboutDialog : public QDialog { private: Q_OBJECT Q_DISABLE_COPY(AboutDialog) public: AboutDialog(QWidget *parent); }; #endif mumble-1.3.4/src/mumble/GlobalShortcut.ui0000664000175000017500000002307114010707273020207 0ustar builderbuilder GlobalShortcut 0 0 621 542 0 0 0 0 <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> Qt::RichText true Qt::Horizontal 40 20 Open Accessibility Preferences Skip Qt::Vertical QSizePolicy::Fixed 20 10 Shortcuts Enable Global Shortcuts List of configured shortcuts QAbstractItemView::AllEditTriggers true false true 100 50 false Function Data Shortcut Suppress Add new shortcut This will add a new global shortcut &Add false Remove selected shortcut This will permanently remove a selected shortcut. &Remove Qt::Horizontal 59 20 <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. Additional Shortcut Engines <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. Enable shortcuts in privileged applications <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. Enable Windows hooks <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. Enable GKey <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. Enable XInput mumble-1.3.4/src/mumble/VersionCheck.h0000664000175000017500000000121514010707274017445 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_VERSIONCHECK_H_ #define MUMBLE_MUMBLE_VERSIONCHECK_H_ #include #include #include class VersionCheck : public QObject { private: Q_OBJECT Q_DISABLE_COPY(VersionCheck) public slots: void fetched(QByteArray data, QUrl url); public: VersionCheck(bool autocheck, QObject *parent = NULL, bool focus = false); }; #endif mumble-1.3.4/src/mumble/CustomElements.h0000664000175000017500000000465714010707273020045 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_CUSTOMELEMENTS_H_ #define MUMBLE_MUMBLE_CUSTOMELEMENTS_H_ #include #if QT_VERSION >= 0x050000 # include # include # include #else # include # include # include #endif class LogTextBrowser : public QTextBrowser { private: Q_OBJECT Q_DISABLE_COPY(LogTextBrowser) protected: void resizeEvent(QResizeEvent *e) Q_DECL_OVERRIDE; bool event(QEvent *e) Q_DECL_OVERRIDE; public: LogTextBrowser(QWidget *p = NULL); int getLogScroll(); int getLogScrollMaximum(); void setLogScroll(int scroll_pos); void scrollLogToBottom(); }; class ChatbarTextEdit : public QTextEdit { private: Q_OBJECT Q_DISABLE_COPY(ChatbarTextEdit) void inFocus(bool); QStringList qslHistory; QString qsHistoryTemp; int iHistoryIndex; static const int MAX_HISTORY = 50; protected: QString qsDefaultText; bool bDefaultVisible; void focusInEvent(QFocusEvent *) Q_DECL_OVERRIDE; void focusOutEvent(QFocusEvent *) Q_DECL_OVERRIDE; void contextMenuEvent(QContextMenuEvent *) Q_DECL_OVERRIDE; void dropEvent(QDropEvent *) Q_DECL_OVERRIDE; bool event(QEvent *) Q_DECL_OVERRIDE; QSize minimumSizeHint() const Q_DECL_OVERRIDE; QSize sizeHint() const Q_DECL_OVERRIDE; void resizeEvent(QResizeEvent *e) Q_DECL_OVERRIDE; public: void setDefaultText(const QString &, bool = false); unsigned int completeAtCursor(); signals: void tabPressed(void); void backtabPressed(void); void ctrlSpacePressed(void); void entered(QString); public slots: void pasteAndSend_triggered(); void doResize(); void doScrollbar(); void addToHistory(const QString &str); void historyUp(); void historyDown(); public: ChatbarTextEdit(QWidget *p = NULL); }; class DockTitleBar : public QLabel { private: Q_OBJECT Q_DISABLE_COPY(DockTitleBar) protected: QTimer *qtTick; int size; int newsize; public: DockTitleBar(); QSize sizeHint() const Q_DECL_OVERRIDE; QSize minimumSizeHint() const Q_DECL_OVERRIDE; public slots: void tick(); protected: bool eventFilter(QObject *, QEvent *) Q_DECL_OVERRIDE; }; #endif // CUSTOMELEMENTS_H_ mumble-1.3.4/src/mumble/OverlayText.cpp0000664000175000017500000001442114010707273017705 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "OverlayText.h" #include "Global.h" BasepointPixmap::BasepointPixmap() : qpBasePoint(0, 0), iAscent(-1), iDescent(-1) { } BasepointPixmap::BasepointPixmap(const QPixmap& pm) : QPixmap(pm), qpBasePoint(0, pm.height()), iAscent(-1), iDescent(-1) { } BasepointPixmap::BasepointPixmap(int w, int h) : QPixmap(w, h), qpBasePoint(0, h), iAscent(-1), iDescent(-1) { } BasepointPixmap::BasepointPixmap(int w, int h, const QPoint& bp) : QPixmap(w, h), qpBasePoint(bp), iAscent(-1), iDescent(-1) { } OverlayTextLine::OverlayTextLine(const QString& s, const QFont& f) : fEdgeFactor(0.05f) , qsText(s) , qfFont(f) , fXCorrection(0.0) , fYCorrection(0.0) , iCurWidth(-1) , iCurHeight(-1) , fBaseliningThreshold(0.5f) , bElided(false) { QFontMetrics fm(f); fAscent = static_cast(fm.ascent()); fDescent = static_cast(fm.descent()); fEdge = qMax(static_cast(f.pointSizeF()) * fEdgeFactor, 1.0f); } BasepointPixmap OverlayTextLine::render(int w, int h, const QColor& col, const QPoint& bp) const { BasepointPixmap img(w, h, bp); img.fill(Qt::transparent); QPainter imgp(&img); imgp.setRenderHint(QPainter::Antialiasing); imgp.setRenderHint(QPainter::TextAntialiasing); imgp.setBackground(QColor(0,0,0,0)); imgp.setCompositionMode(QPainter::CompositionMode_SourceOver); QColor qc(col); qc.setAlpha(255); imgp.setBrush(qc); imgp.setPen(QPen(Qt::black, fEdge, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); imgp.drawPath(qpp); imgp.setPen(Qt::NoPen); imgp.drawPath(qpp); img.iAscent = iroundf(fAscent + 0.5f); img.iDescent = iroundf(fDescent + 0.5f); return img; } BasepointPixmap OverlayTextLine::createPixmap(QColor col) { if (qsText.isEmpty()) { return BasepointPixmap(); } QRectF qr; if (qpp.isEmpty()) { qpp.addText(0.0f, fAscent, qfFont, qsText); qr = qpp.controlPointRect(); // fit into (0,0)-based coordinates fXCorrection = 0.0f; fYCorrection = 0.0f; if (qr.left() < fEdge) { fXCorrection = fEdge - static_cast(qr.left()); } if (qr.top() < fEdge) { fYCorrection = fEdge - static_cast(qr.top()); } QMatrix correction; correction.translate(fXCorrection, fYCorrection); qpp = correction.map(qpp); } qr = qpp.controlPointRect(); return render( iroundf(qr.right() + 2.0f*fEdge + 0.5f), iroundf(qr.bottom() + 2.0f*fEdge + 0.5f), col, QPoint(iroundf(fXCorrection + 0.5f), iroundf(fYCorrection + fAscent + 0.5f)) ); } BasepointPixmap OverlayTextLine::createPixmap(unsigned int maxwidth, unsigned int height, QColor col) { float twice_edge = 2.0f * fEdge; if (! height || ! maxwidth) return BasepointPixmap(); if (qpp.isEmpty() || iCurWidth > static_cast(maxwidth) || iCurHeight != static_cast(height) || (static_cast(maxwidth) > iCurWidth && bElided)) { QFont f = qfFont; QFontMetrics fm(f); // fit the font into a bounding box with padding float ps = static_cast(f.pointSizeF()); float f_ad = static_cast(fm.ascent() + fm.descent()+1) / ps; float pointsize = static_cast(height) / (f_ad + 2.0f*fEdgeFactor); if (fEdgeFactor * ps > 1.0f) { pointsize = static_cast(height-2) / f_ad; } if (pointsize <= 0.0f) { return BasepointPixmap(); } f.setPointSizeF(pointsize); setFont(f); fm = QFontMetrics(f); twice_edge = 2.0f * fEdge; if (!qpp.isEmpty()) { qpp = QPainterPath(); } // calculate text metrics for eliding and scaling QRectF bb; qpp.addText(0.0f, 0.0f, f, qsText); bb = qpp.controlPointRect(); qreal effective_ascent = -bb.top(); qreal effective_descent = bb.bottom(); float scale = 1.0f; bool keep_baseline = true; if (effective_descent > fDescent || effective_ascent > fAscent) { qreal scale_ascent = effective_ascent > 0.0f ? fAscent / effective_ascent : 1.0f; qreal scale_descent = effective_descent > 0.0f ? fDescent / effective_descent : 1.0f; scale = static_cast(qMin(scale_ascent, scale_descent)); if (scale < fBaseliningThreshold) { float text_height = static_cast(bb.height()) + twice_edge; scale = static_cast(height) / text_height; keep_baseline = false; } qWarning() << QString(QLatin1String("Text \"%1\" did not fit (+%2/-%3): (+%4/-%5). Scaling to %6.")).arg(qsText).arg(fAscent).arg(fDescent).arg(effective_ascent).arg(effective_descent).arg(scale); } // eliding by previously calculated width if ((bb.width()*scale) + twice_edge > maxwidth) { int eliding_width = iroundf((static_cast(maxwidth) / scale) - twice_edge + 0.5f); QString str = fm.elidedText(qsText, Qt::ElideRight, eliding_width); // use ellipsis as shortest possible string if (str.trimmed().isEmpty()) { str = QString(QChar(0x2026)); } qpp = QPainterPath(); qpp.addText(0.0f, 0.0f, f, str); bb = qpp.controlPointRect(); bElided = true; } else { bElided = false; } // translation to "pixmap space": QMatrix correction; // * adjust left edge correction.translate(-bb.x() + fEdge, 0.0f); // * scale overly high text (still on baseline) correction.scale(scale, scale); if (keep_baseline) { // * translate down to baseline correction.translate(0.0f, (fAscent + fEdge) / scale); } else { // * translate into bounding box correction.translate(0.0f, -bb.top() + fEdge); } qpp = correction.map(qpp); iCurWidth = iroundf(bb.width() * scale + 0.5f); iCurHeight = height; } QRectF qr = qpp.controlPointRect(); return render( iroundf(qr.width() + twice_edge + 0.5f), iroundf(fAscent + fDescent + twice_edge + 0.5f), col, QPoint(0, iroundf(fAscent + fEdge + 0.5f)) ); } void OverlayTextLine::setFont(const QFont& font) { qfFont = font; qpp = QPainterPath(); QFontMetrics fm(font); fAscent = static_cast(fm.ascent()+1); fDescent = static_cast(fm.descent()+1); fEdge = qMax(static_cast(font.pointSizeF()) * fEdgeFactor, 1.0f); } void OverlayTextLine::setEdge(float ew) { fEdge = ew; qpp = QPainterPath(); } mumble-1.3.4/src/mumble/Settings.cpp0000664000175000017500000011524214010707273017222 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "Settings.h" #include "AudioInput.h" #include "Cert.h" #include "Log.h" #include "Global.h" #include "SSL.h" #include "../../overlay/overlay.h" bool Shortcut::isServerSpecific() const { if (qvData.canConvert()) { const ShortcutTarget &sc = qvariant_cast (qvData); return sc.isServerSpecific(); } return false; } bool Shortcut::operator < (const Shortcut &other) const { return (iIndex < other.iIndex); } bool Shortcut::operator == (const Shortcut &other) const { return (iIndex == other.iIndex) && (qlButtons == other.qlButtons) && (qvData == other.qvData) && (bSuppress == other.bSuppress); } ShortcutTarget::ShortcutTarget() { bUsers = true; iChannel = -3; bLinks = bChildren = bForceCenter = false; } bool ShortcutTarget::isServerSpecific() const { return (! bUsers && (iChannel >= 0)); } bool ShortcutTarget::operator == (const ShortcutTarget &o) const { if ((bUsers != o.bUsers) || (bForceCenter != o.bForceCenter)) return false; if (bUsers) return (qlUsers == o.qlUsers) && (qlSessions == o.qlSessions); else return (iChannel == o.iChannel) && (bLinks == o.bLinks) && (bChildren == o.bChildren) && (qsGroup == o.qsGroup); } quint32 qHash(const ShortcutTarget &t) { quint32 h = t.bForceCenter ? 0x55555555 : 0xaaaaaaaa; if (t.bUsers) { foreach(unsigned int u, t.qlSessions) h ^= u; } else { h ^= t.iChannel; if (t.bLinks) h ^= 0x80000000; if (t.bChildren) h ^= 0x40000000; h ^= qHash(t.qsGroup); h = ~h; } return h; } quint32 qHash(const QList &l) { quint32 h = l.count(); foreach(const ShortcutTarget &st, l) h ^= qHash(st); return h; } QDataStream &operator<< (QDataStream &qds, const ShortcutTarget &st) { qds << st.bUsers << st.bForceCenter; if (st.bUsers) return qds << st.qlUsers; else return qds << st.iChannel << st.qsGroup << st.bLinks << st.bChildren; } QDataStream &operator>> (QDataStream &qds, ShortcutTarget &st) { qds >> st.bUsers >> st.bForceCenter; if (st.bUsers) return qds >> st.qlUsers; else return qds >> st.iChannel >> st.qsGroup >> st.bLinks >> st.bChildren; } const QString Settings::cqsDefaultPushClickOn = QLatin1String(":/on.ogg"); const QString Settings::cqsDefaultPushClickOff = QLatin1String(":/off.ogg"); OverlaySettings::OverlaySettings() { bEnable = false; fX = 1.0f; fY = 0.0f; fZoom = 0.875f; #ifdef Q_OS_MAC qsStyle = QLatin1String("Cleanlooks"); #endif osShow = LinkedChannels; bAlwaysSelf = true; uiActiveTime = 5; osSort = Alphabetical; qcUserName[Settings::Passive] = QColor(170, 170, 170); qcUserName[Settings::Talking] = QColor(255, 255, 255); qcUserName[Settings::Whispering] = QColor(128, 255, 128); qcUserName[Settings::Shouting] = QColor(255, 128, 255); qcChannel = QColor(255, 255, 128); qcBoxPen = QColor(0, 0, 0, 224); qcBoxFill = QColor(0, 0, 0); setPreset(); // FPS and Time display settings qcFps = Qt::white; fFps = 0.75f; qfFps = qfUserName; qrfFps = QRectF(0.0f, 0.05, -1, 0.023438f); bFps = false; qrfTime = QRectF(0.0f, 0.0, -1, 0.023438f); bTime = false; oemOverlayExcludeMode = OverlaySettings::LauncherFilterExclusionMode; } void OverlaySettings::setPreset(const OverlayPresets preset) { switch (preset) { case LargeSquareAvatar: uiColumns = 2; fUserName = 0.75f; fChannel = 0.75f; fMutedDeafened = 0.5f; fAvatar = 1.0f; #if defined(Q_OS_WIN) || defined(Q_OS_MAC) qfUserName = QFont(QLatin1String("Verdana"), 20); #else qfUserName = QFont(QLatin1String("Arial"), 20); #endif qfChannel = qfUserName; fUser[Settings::Passive] = 0.5f; fUser[Settings::Talking] = (7.0f / 8.0f); fUser[Settings::Whispering] = (7.0f / 8.0f); fUser[Settings::Shouting] = (7.0f / 8.0f); qrfUserName = QRectF(-0.0625f, 0.101563f - 0.0625f, 0.125f, 0.023438f); qrfChannel = QRectF(-0.03125f, -0.0625f, 0.09375f, 0.015625f); qrfMutedDeafened = QRectF(-0.0625f, -0.0625f, 0.0625f, 0.0625f); qrfAvatar = QRectF(-0.0625f, -0.0625f, 0.125f, 0.125f); fBoxPenWidth = (1.f / 256.0f); fBoxPad = (1.f / 256.0f); bUserName = true; bChannel = true; bMutedDeafened = true; bAvatar = true; bBox = false; qaUserName = Qt::AlignCenter; qaMutedDeafened = Qt::AlignLeft | Qt::AlignTop; qaAvatar = Qt::AlignCenter; qaChannel = Qt::AlignCenter; break; case AvatarAndName: default: uiColumns = 1; fUserName = 1.0f; fChannel = (7.0f / 8.0f); fMutedDeafened = (7.0f / 8.0f); fAvatar = 1.0f; #if defined(Q_OS_WIN) || defined(Q_OS_MAC) qfUserName = QFont(QLatin1String("Verdana"), 20); #else qfUserName = QFont(QLatin1String("Arial"), 20); #endif qfChannel = qfUserName; fUser[Settings::Passive] = 0.5f; fUser[Settings::Talking] = (7.0f / 8.0f); fUser[Settings::Whispering] = (7.0f / 8.0f); fUser[Settings::Shouting] = (7.0f / 8.0f); qrfUserName = QRectF(0.015625f, -0.015625f, 0.250f, 0.03125f); qrfChannel = QRectF(0.03125f, -0.015625f, 0.1875f, 0.015625f); qrfMutedDeafened = QRectF(0.234375f, -0.015625f, 0.03125f, 0.03125f); qrfAvatar = QRectF(-0.03125f, -0.015625f, 0.03125f, 0.03125f); fBoxPenWidth = 0.0f; fBoxPad = (1.f / 256.0f); bUserName = true; bChannel = false; bMutedDeafened = true; bAvatar = true; bBox = true; qaUserName = Qt::AlignLeft | Qt::AlignVCenter; qaMutedDeafened = Qt::AlignRight | Qt::AlignVCenter; qaAvatar = Qt::AlignCenter; qaChannel = Qt::AlignLeft | Qt::AlignTop; break; } } Settings::Settings() { qRegisterMetaType ("ShortcutTarget"); qRegisterMetaTypeStreamOperators ("ShortcutTarget"); qRegisterMetaType ("QVariant"); atTransmit = VAD; bTransmitPosition = false; bMute = bDeaf = false; bTTS = true; bTTSMessageReadBack = false; iTTSVolume = 75; iTTSThreshold = 250; qsTTSLanguage = QString(); iQuality = 40000; fVolume = 1.0f; fOtherVolume = 0.5f; bAttenuateOthersOnTalk = false; bAttenuateOthers = false; bAttenuateUsersOnPrioritySpeak = false; bOnlyAttenuateSameOutput = false; bAttenuateLoopbacks = false; iMinLoudness = 1000; iVoiceHold = 50; iJitterBufferSize = 1; iFramesPerPacket = 2; iNoiseSuppress = -30; bDenoise = false; uiAudioInputChannelMask = 0xffffffffffffffffULL; // Idle auto actions iIdleTime = 5 * 60; iaeIdleAction = Nothing; bUndoIdleActionUponActivity = false; vsVAD = Amplitude; fVADmin = 0.80f; fVADmax = 0.98f; bUseOpusMusicEncoding = false; bTxAudioCue = false; qsTxAudioCueOn = cqsDefaultPushClickOn; qsTxAudioCueOff = cqsDefaultPushClickOff; bUserTop = true; bWhisperFriends = false; uiDoublePush = 0; pttHold = 0; bExpert = true; #ifdef NO_UPDATE_CHECK bUpdateCheck = false; bPluginCheck = false; #else bUpdateCheck = true; bPluginCheck = true; #endif #if QT_VERSION >= 0x050000 qsImagePath = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation); #else qsImagePath = QDesktopServices::storageLocation(QDesktopServices::PicturesLocation); #endif ceExpand = ChannelsWithUsers; ceChannelDrag = Ask; ceUserDrag = Move; bMinimalView = false; bHideFrame = false; aotbAlwaysOnTop = OnTopNever; bAskOnQuit = true; bEnableDeveloperMenu = false; bLockLayout = false; #ifdef Q_OS_WIN // Don't enable minimize to tray by default on Windows >= 7 const QSysInfo::WinVersion winVer = QSysInfo::windowsVersion(); bHideInTray = (winVer < QSysInfo::WV_WINDOWS7); #else const bool isUnityDesktop = QProcessEnvironment::systemEnvironment().value(QLatin1String("XDG_CURRENT_DESKTOP")) == QLatin1String("Unity"); bHideInTray = !isUnityDesktop && QSystemTrayIcon::isSystemTrayAvailable(); #endif bStateInTray = true; bUsage = true; bShowUserCount = false; bChatBarUseSelection = false; bFilterHidesEmptyChannels = true; bFilterActive = false; wlWindowLayout = LayoutClassic; bShowContextMenuInMenuBar = false; ssFilter = ShowReachable; iOutputDelay = 5; bASIOEnable = true; qsALSAInput=QLatin1String("default"); qsALSAOutput=QLatin1String("default"); qsJackClientName = QLatin1String("mumble"); qsJackAudioOutput = QLatin1String("1"); bJackStartServer = false; bJackAutoConnect = true; bEcho = false; bEchoMulti = true; bExclusiveInput = false; bExclusiveOutput = false; iPortAudioInput = -1; // default device iPortAudioOutput = -1; // default device bPositionalAudio = true; bPositionalHeadphone = false; fAudioMinDistance = 1.0f; fAudioMaxDistance = 15.0f; fAudioMaxDistVolume = 0.80f; fAudioBloom = 0.5f; // OverlayPrivateWin iOverlayWinHelperRestartCooldownMsec = 10000; bOverlayWinHelperX86Enable = true; bOverlayWinHelperX64Enable = true; iLCDUserViewMinColWidth = 50; iLCDUserViewSplitterWidth = 2; // PTT Button window bShowPTTButtonWindow = false; // Network settings bTCPCompat = false; bQoS = true; bReconnect = true; bAutoConnect = false; ptProxyType = NoProxy; usProxyPort = 0; iMaxInFlightTCPPings = 4; bUdpForceTcpAddr = true; iPingIntervalMsec = 5000; iConnectionTimeoutDurationMsec = 30000; iMaxImageWidth = 1024; // Allow 1024x1024 resolution iMaxImageHeight = 1024; bSuppressIdentity = false; qsSslCiphers = MumbleSSL::defaultOpenSSLCipherString(); bHideOS = false; bShowTransmitModeComboBox = false; // Accessibility bHighContrast = false; // Recording #if QT_VERSION >= 0x050000 qsRecordingPath = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); #else qsRecordingPath = QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation); #endif qsRecordingFile = QLatin1String("Mumble-%date-%time-%host-%user"); rmRecordingMode = RecordingMixdown; iRecordingFormat = 0; // Special configuration options not exposed to UI bDisableCELT = false; disablePublicList = false; disableConnectDialogEditing = false; // Config updates uiUpdateCounter = 0; #if defined(AUDIO_TEST) lmLoopMode = Server; #else lmLoopMode = None; #endif dPacketLoss = 0; dMaxPacketDelay = 0.0f; requireRestartToApply = false; iMaxLogBlocks = 0; bShortcutEnable = true; bSuppressMacEventTapWarning = false; bEnableEvdev = false; bEnableXInput2 = true; bEnableGKey = false; bEnableXboxInput = true; bEnableWinHooks = true; bDirectInputVerboseLogging = false; bEnableUIAccess = true; for (int i=Log::firstMsgType; i<=Log::lastMsgType; ++i) { qmMessages.insert(i, Settings::LogConsole | Settings::LogBalloon | Settings::LogTTS); qmMessageSounds.insert(i, QString()); } qmMessageSounds[Log::CriticalError] = QLatin1String(":/Critical.ogg"); qmMessageSounds[Log::PermissionDenied] = QLatin1String(":/PermissionDenied.ogg"); qmMessageSounds[Log::SelfMute] = QLatin1String(":/SelfMutedDeafened.ogg"); qmMessageSounds[Log::SelfUnmute] = QLatin1String(":/SelfMutedDeafened.ogg"); qmMessageSounds[Log::SelfDeaf] = QLatin1String(":/SelfMutedDeafened.ogg"); qmMessageSounds[Log::SelfUndeaf] = QLatin1String(":/SelfMutedDeafened.ogg"); qmMessageSounds[Log::ServerConnected] = QLatin1String(":/ServerConnected.ogg"); qmMessageSounds[Log::ServerDisconnected] = QLatin1String(":/ServerDisconnected.ogg"); qmMessageSounds[Log::TextMessage] = QLatin1String(":/TextMessage.ogg"); qmMessageSounds[Log::PrivateTextMessage] = qmMessageSounds[Log::TextMessage]; qmMessageSounds[Log::ChannelJoin] = QLatin1String(":/UserJoinedChannel.ogg"); qmMessageSounds[Log::ChannelLeave] = QLatin1String(":/UserLeftChannel.ogg"); qmMessageSounds[Log::ChannelJoinConnect] = qmMessageSounds[Log::ChannelJoin]; qmMessageSounds[Log::ChannelLeaveDisconnect] = qmMessageSounds[Log::ChannelLeave]; qmMessageSounds[Log::YouMutedOther] = QLatin1String(":/UserMutedYouOrByYou.ogg"); qmMessageSounds[Log::YouMuted] = QLatin1String(":/UserMutedYouOrByYou.ogg"); qmMessageSounds[Log::YouKicked] = QLatin1String(":/UserKickedYouOrByYou.ogg"); qmMessageSounds[Log::Recording] = QLatin1String(":/RecordingStateChanged.ogg"); qmMessages[Log::DebugInfo] = Settings::LogConsole; qmMessages[Log::Warning] = Settings::LogConsole | Settings::LogBalloon; qmMessages[Log::Information] = Settings::LogConsole; qmMessages[Log::UserJoin] = Settings::LogConsole; qmMessages[Log::UserLeave] = Settings::LogConsole; qmMessages[Log::UserKicked] = Settings::LogConsole; qmMessages[Log::OtherSelfMute] = Settings::LogConsole; qmMessages[Log::OtherMutedOther] = Settings::LogConsole; qmMessages[Log::UserRenamed] = Settings::LogConsole; // Default theme themeName = QLatin1String("Mumble"); themeStyleName = QLatin1String("Lite"); } bool Settings::doEcho() const { if (! bEcho) return false; if (AudioInputRegistrar::qmNew) { AudioInputRegistrar *air = AudioInputRegistrar::qmNew->value(qsAudioInput); if (air) { if (air->canEcho(qsAudioOutput)) return true; } } return false; } bool Settings::doPositionalAudio() const { return bPositionalAudio; } #include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP() BOOST_TYPEOF_REGISTER_TYPE(Qt::Alignment) BOOST_TYPEOF_REGISTER_TYPE(Settings::AudioTransmit) BOOST_TYPEOF_REGISTER_TYPE(Settings::VADSource) BOOST_TYPEOF_REGISTER_TYPE(Settings::LoopMode) BOOST_TYPEOF_REGISTER_TYPE(Settings::OverlayShow) BOOST_TYPEOF_REGISTER_TYPE(Settings::ProxyType) BOOST_TYPEOF_REGISTER_TYPE(Settings::ChannelExpand) BOOST_TYPEOF_REGISTER_TYPE(Settings::ChannelDrag) BOOST_TYPEOF_REGISTER_TYPE(Settings::ServerShow) BOOST_TYPEOF_REGISTER_TYPE(Settings::WindowLayout) BOOST_TYPEOF_REGISTER_TYPE(Settings::AlwaysOnTopBehaviour) BOOST_TYPEOF_REGISTER_TYPE(Settings::RecordingMode) BOOST_TYPEOF_REGISTER_TYPE(QString) BOOST_TYPEOF_REGISTER_TYPE(QByteArray) BOOST_TYPEOF_REGISTER_TYPE(QColor) BOOST_TYPEOF_REGISTER_TYPE(QVariant) BOOST_TYPEOF_REGISTER_TYPE(QFont) BOOST_TYPEOF_REGISTER_TEMPLATE(QList, 1) #define SAVELOAD(var,name) var = qvariant_cast(settings_ptr->value(QLatin1String(name), var)) #define LOADENUM(var, name) var = static_cast(settings_ptr->value(QLatin1String(name), var).toInt()) #define LOADFLAG(var, name) var = static_cast(settings_ptr->value(QLatin1String(name), static_cast(var)).toInt()) #define DEPRECATED(name) do { } while (0) // Workaround for mumble-voip/mumble#2638. // // Qt previously expected to be able to write // NUL bytes in strings in plists. This is no // longer possible, which causes Qt to write // incomplete stings to the preferences plist. // These are of the form "@Variant(", and, for // Mumble, typically happen for float values. // // We detect this bad value and avoid loading // it. This causes such settings to fall back // to their defaults, instead of being set to // a zero value. #ifdef Q_OS_MAC #undef SAVELOAD #define SAVELOAD(var, name) \ do { \ if (settings_ptr->value(QLatin1String(name)).toString() != QLatin1String("@Variant(")) { \ var = qvariant_cast(settings_ptr->value(QLatin1String(name), var)); \ } \ } while (0) #endif void OverlaySettings::load() { load(g.qs); } void OverlaySettings::load(QSettings* settings_ptr) { SAVELOAD(bEnable, "enable"); LOADENUM(osShow, "show"); SAVELOAD(bAlwaysSelf, "alwaysself"); SAVELOAD(uiActiveTime, "activetime"); LOADENUM(osSort, "sort"); SAVELOAD(fX, "x"); SAVELOAD(fY, "y"); SAVELOAD(fZoom, "zoom"); SAVELOAD(uiColumns, "columns"); settings_ptr->beginReadArray(QLatin1String("states")); for (int i=0; i<4; ++i) { settings_ptr->setArrayIndex(i); SAVELOAD(qcUserName[i], "color"); SAVELOAD(fUser[i], "opacity"); } settings_ptr->endArray(); SAVELOAD(qfUserName, "userfont"); SAVELOAD(qfChannel, "channelfont"); SAVELOAD(qcChannel, "channelcolor"); SAVELOAD(qfFps, "fpsfont"); SAVELOAD(qcFps, "fpscolor"); SAVELOAD(fBoxPad, "padding"); SAVELOAD(fBoxPenWidth, "penwidth"); SAVELOAD(qcBoxPen, "pencolor"); SAVELOAD(qcBoxFill, "fillcolor"); SAVELOAD(bUserName, "usershow"); SAVELOAD(bChannel, "channelshow"); SAVELOAD(bMutedDeafened, "mutedshow"); SAVELOAD(bAvatar, "avatarshow"); SAVELOAD(bBox, "boxshow"); SAVELOAD(bFps, "fpsshow"); SAVELOAD(bTime, "timeshow"); SAVELOAD(fUserName, "useropacity"); SAVELOAD(fChannel, "channelopacity"); SAVELOAD(fMutedDeafened, "mutedopacity"); SAVELOAD(fAvatar, "avataropacity"); SAVELOAD(fFps, "fpsopacity"); SAVELOAD(qrfUserName, "userrect"); SAVELOAD(qrfChannel, "channelrect"); SAVELOAD(qrfMutedDeafened, "mutedrect"); SAVELOAD(qrfAvatar, "avatarrect"); SAVELOAD(qrfFps, "fpsrect"); SAVELOAD(qrfTime, "timerect"); LOADFLAG(qaUserName, "useralign"); LOADFLAG(qaChannel, "channelalign"); LOADFLAG(qaMutedDeafened, "mutedalign"); LOADFLAG(qaAvatar, "avataralign"); LOADENUM(oemOverlayExcludeMode, "mode"); SAVELOAD(qslLaunchers, "launchers"); SAVELOAD(qslLaunchersExclude, "launchersexclude"); SAVELOAD(qslWhitelist, "whitelist"); SAVELOAD(qslWhitelistExclude, "whitelistexclude"); SAVELOAD(qslPaths, "paths"); SAVELOAD(qslPathsExclude, "pathsexclude"); SAVELOAD(qslBlacklist, "blacklist"); SAVELOAD(qslBlacklistExclude, "blacklistexclude"); } void Settings::load() { load(g.qs); } void Settings::load(QSettings* settings_ptr) { // Config updates SAVELOAD(uiUpdateCounter, "lastupdate"); SAVELOAD(bMute, "audio/mute"); SAVELOAD(bDeaf, "audio/deaf"); LOADENUM(atTransmit, "audio/transmit"); SAVELOAD(uiDoublePush, "audio/doublepush"); SAVELOAD(pttHold, "audio/ptthold"); SAVELOAD(bTxAudioCue, "audio/pushclick"); SAVELOAD(qsTxAudioCueOn, "audio/pushclickon"); SAVELOAD(qsTxAudioCueOff, "audio/pushclickoff"); SAVELOAD(iQuality, "audio/quality"); SAVELOAD(iMinLoudness, "audio/loudness"); SAVELOAD(fVolume, "audio/volume"); SAVELOAD(fOtherVolume, "audio/othervolume"); SAVELOAD(bAttenuateOthers, "audio/attenuateothers"); SAVELOAD(bAttenuateOthersOnTalk, "audio/attenuateothersontalk"); SAVELOAD(bAttenuateUsersOnPrioritySpeak, "audio/attenuateusersonpriorityspeak"); SAVELOAD(bOnlyAttenuateSameOutput, "audio/onlyattenuatesameoutput"); SAVELOAD(bAttenuateLoopbacks, "audio/attenuateloopbacks"); LOADENUM(vsVAD, "audio/vadsource"); SAVELOAD(fVADmin, "audio/vadmin"); SAVELOAD(fVADmax, "audio/vadmax"); SAVELOAD(iNoiseSuppress, "audio/noisesupress"); SAVELOAD(bDenoise, "audio/denoise"); SAVELOAD(uiAudioInputChannelMask, "audio/inputchannelmask"); SAVELOAD(iVoiceHold, "audio/voicehold"); SAVELOAD(iOutputDelay, "audio/outputdelay"); // Idle auto actions SAVELOAD(iIdleTime, "audio/idletime"); LOADENUM(iaeIdleAction, "audio/idleaction"); SAVELOAD(bUndoIdleActionUponActivity, "audio/undoidleactionuponactivity"); SAVELOAD(fAudioMinDistance, "audio/mindistance"); SAVELOAD(fAudioMaxDistance, "audio/maxdistance"); SAVELOAD(fAudioMaxDistVolume, "audio/maxdistancevolume"); SAVELOAD(fAudioBloom, "audio/bloom"); SAVELOAD(bEcho, "audio/echo"); SAVELOAD(bEchoMulti, "audio/echomulti"); SAVELOAD(bExclusiveInput, "audio/exclusiveinput"); SAVELOAD(bExclusiveOutput, "audio/exclusiveoutput"); SAVELOAD(bPositionalAudio, "audio/positional"); SAVELOAD(bPositionalHeadphone, "audio/headphone"); SAVELOAD(qsAudioInput, "audio/input"); SAVELOAD(qsAudioOutput, "audio/output"); SAVELOAD(bWhisperFriends, "audio/whisperfriends"); SAVELOAD(bTransmitPosition, "audio/postransmit"); SAVELOAD(bUseOpusMusicEncoding, "codec/opus/encoder/music"); SAVELOAD(iJitterBufferSize, "net/jitterbuffer"); SAVELOAD(iFramesPerPacket, "net/framesperpacket"); SAVELOAD(bASIOEnable, "asio/enable"); SAVELOAD(qsASIOclass, "asio/class"); SAVELOAD(qlASIOmic, "asio/mic"); SAVELOAD(qlASIOspeaker, "asio/speaker"); SAVELOAD(qsWASAPIInput, "wasapi/input"); SAVELOAD(qsWASAPIOutput, "wasapi/output"); SAVELOAD(qsWASAPIRole, "wasapi/role"); SAVELOAD(qsALSAInput, "alsa/input"); SAVELOAD(qsALSAOutput, "alsa/output"); SAVELOAD(qsPulseAudioInput, "pulseaudio/input"); SAVELOAD(qsPulseAudioOutput, "pulseaudio/output"); SAVELOAD(qsJackAudioOutput, "jack/output"); SAVELOAD(bJackStartServer, "jack/startserver"); SAVELOAD(bJackAutoConnect, "jack/autoconnect"); SAVELOAD(qsOSSInput, "oss/input"); SAVELOAD(qsOSSOutput, "oss/output"); SAVELOAD(qsCoreAudioInput, "coreaudio/input"); SAVELOAD(qsCoreAudioOutput, "coreaudio/output"); SAVELOAD(iPortAudioInput, "portaudio/input"); SAVELOAD(iPortAudioOutput, "portaudio/output"); SAVELOAD(qbaDXInput, "directsound/input"); SAVELOAD(qbaDXOutput, "directsound/output"); SAVELOAD(bTTS, "tts/enable"); SAVELOAD(iTTSVolume, "tts/volume"); SAVELOAD(iTTSThreshold, "tts/threshold"); SAVELOAD(bTTSMessageReadBack, "tts/readback"); SAVELOAD(qsTTSLanguage, "tts/language"); // Network settings SAVELOAD(bTCPCompat, "net/tcponly"); SAVELOAD(bQoS, "net/qos"); SAVELOAD(bReconnect, "net/reconnect"); SAVELOAD(bAutoConnect, "net/autoconnect"); SAVELOAD(bSuppressIdentity, "net/suppress"); LOADENUM(ptProxyType, "net/proxytype"); SAVELOAD(qsProxyHost, "net/proxyhost"); SAVELOAD(usProxyPort, "net/proxyport"); SAVELOAD(qsProxyUsername, "net/proxyusername"); SAVELOAD(qsProxyPassword, "net/proxypassword"); DEPRECATED("net/maximagesize"); SAVELOAD(iMaxImageWidth, "net/maximagewidth"); SAVELOAD(iMaxImageHeight, "net/maximageheight"); SAVELOAD(qsServicePrefix, "net/serviceprefix"); SAVELOAD(iMaxInFlightTCPPings, "net/maxinflighttcppings"); SAVELOAD(iPingIntervalMsec, "net/pingintervalmsec"); SAVELOAD(iConnectionTimeoutDurationMsec, "net/connectiontimeoutdurationmsec"); SAVELOAD(bUdpForceTcpAddr, "net/udpforcetcpaddr"); // Network settings - SSL SAVELOAD(qsSslCiphers, "net/sslciphers"); // Privacy settings SAVELOAD(bHideOS, "privacy/hideos"); SAVELOAD(bExpert, "ui/expert"); SAVELOAD(qsLanguage, "ui/language"); SAVELOAD(themeName, "ui/theme"); SAVELOAD(themeStyleName, "ui/themestyle"); LOADENUM(ceExpand, "ui/expand"); LOADENUM(ceChannelDrag, "ui/drag"); LOADENUM(ceUserDrag, "ui/userdrag"); LOADENUM(aotbAlwaysOnTop, "ui/alwaysontop"); SAVELOAD(bAskOnQuit, "ui/askonquit"); SAVELOAD(bEnableDeveloperMenu, "ui/developermenu"); SAVELOAD(bLockLayout, "ui/locklayout"); SAVELOAD(bMinimalView, "ui/minimalview"); SAVELOAD(bHideFrame, "ui/hideframe"); SAVELOAD(bUserTop, "ui/usertop"); SAVELOAD(qbaMainWindowGeometry, "ui/geometry"); SAVELOAD(qbaMainWindowState, "ui/state"); SAVELOAD(qbaMinimalViewGeometry, "ui/minimalviewgeometry"); SAVELOAD(qbaMinimalViewState, "ui/minimalviewstate"); SAVELOAD(qbaConfigGeometry, "ui/ConfigGeometry"); LOADENUM(wlWindowLayout, "ui/WindowLayout"); SAVELOAD(qbaSplitterState, "ui/splitter"); SAVELOAD(qbaHeaderState, "ui/header"); SAVELOAD(qsUsername, "ui/username"); SAVELOAD(qsLastServer, "ui/server"); LOADENUM(ssFilter, "ui/serverfilter"); #ifndef NO_UPDATE_CHECK SAVELOAD(bUpdateCheck, "ui/updatecheck"); SAVELOAD(bPluginCheck, "ui/plugincheck"); #endif SAVELOAD(bHideInTray, "ui/hidetray"); SAVELOAD(bStateInTray, "ui/stateintray"); SAVELOAD(bUsage, "ui/usage"); SAVELOAD(bShowUserCount, "ui/showusercount"); SAVELOAD(bChatBarUseSelection, "ui/chatbaruseselection"); SAVELOAD(bFilterHidesEmptyChannels, "ui/filterhidesemptychannels"); SAVELOAD(bFilterActive, "ui/filteractive"); SAVELOAD(qsImagePath, "ui/imagepath"); SAVELOAD(bShowContextMenuInMenuBar, "ui/showcontextmenuinmenubar"); SAVELOAD(qbaConnectDialogGeometry, "ui/connect/geometry"); SAVELOAD(qbaConnectDialogHeader, "ui/connect/header"); SAVELOAD(bShowTransmitModeComboBox, "ui/transmitmodecombobox"); SAVELOAD(bHighContrast, "ui/HighContrast"); SAVELOAD(iMaxLogBlocks, "ui/MaxLogBlocks"); // PTT Button window SAVELOAD(bShowPTTButtonWindow, "ui/showpttbuttonwindow"); SAVELOAD(qbaPTTButtonWindowGeometry, "ui/pttbuttonwindowgeometry"); // Recording SAVELOAD(qsRecordingPath, "recording/path"); SAVELOAD(qsRecordingFile, "recording/file"); LOADENUM(rmRecordingMode, "recording/mode"); SAVELOAD(iRecordingFormat, "recording/format"); // Special configuration options not exposed to UI SAVELOAD(bDisableCELT, "audio/disablecelt"); SAVELOAD(disablePublicList, "ui/disablepubliclist"); SAVELOAD(disableConnectDialogEditing, "ui/disableconnectdialogediting"); // OverlayPrivateWin SAVELOAD(iOverlayWinHelperRestartCooldownMsec, "overlay_win/helper/restart_cooldown_msec"); SAVELOAD(bOverlayWinHelperX86Enable, "overlay_win/helper/x86/enable"); SAVELOAD(bOverlayWinHelperX64Enable, "overlay_win/helper/x64/enable"); // LCD SAVELOAD(iLCDUserViewMinColWidth, "lcd/userview/mincolwidth"); SAVELOAD(iLCDUserViewSplitterWidth, "lcd/userview/splitterwidth"); QByteArray qba = qvariant_cast (settings_ptr->value(QLatin1String("net/certificate"))); if (! qba.isEmpty()) kpCertificate = CertWizard::importCert(qba); SAVELOAD(bShortcutEnable, "shortcut/enable"); SAVELOAD(bSuppressMacEventTapWarning, "shortcut/mac/suppresswarning"); SAVELOAD(bEnableEvdev, "shortcut/linux/evdev/enable"); SAVELOAD(bEnableXInput2, "shortcut/x11/xinput2/enable"); SAVELOAD(bEnableGKey, "shortcut/gkey"); SAVELOAD(bEnableXboxInput, "shortcut/windows/xbox/enable"); SAVELOAD(bEnableWinHooks, "winhooks"); SAVELOAD(bDirectInputVerboseLogging, "shortcut/windows/directinput/verboselogging"); SAVELOAD(bEnableUIAccess, "shortcut/windows/uiaccess/enable"); int nshorts = settings_ptr->beginReadArray(QLatin1String("shortcuts")); for (int i=0; isetArrayIndex(i); Shortcut s; s.iIndex = -2; SAVELOAD(s.iIndex, "index"); SAVELOAD(s.qlButtons, "keys"); SAVELOAD(s.bSuppress, "suppress"); s.qvData = settings_ptr->value(QLatin1String("data")); if (s.iIndex >= -1) qlShortcuts << s; } settings_ptr->endArray(); settings_ptr->beginReadArray(QLatin1String("messages")); for (QMap::const_iterator it = qmMessages.constBegin(); it != qmMessages.constEnd(); ++it) { settings_ptr->setArrayIndex(it.key()); SAVELOAD(qmMessages[it.key()], "log"); } settings_ptr->endArray(); settings_ptr->beginReadArray(QLatin1String("messagesounds")); for (QMap::const_iterator it = qmMessageSounds.constBegin(); it != qmMessageSounds.constEnd(); ++it) { settings_ptr->setArrayIndex(it.key()); SAVELOAD(qmMessageSounds[it.key()], "logsound"); } settings_ptr->endArray(); settings_ptr->beginGroup(QLatin1String("lcd/devices")); foreach(const QString &d, settings_ptr->childKeys()) { qmLCDDevices.insert(d, settings_ptr->value(d, true).toBool()); } settings_ptr->endGroup(); settings_ptr->beginGroup(QLatin1String("audio/plugins")); foreach(const QString &d, settings_ptr->childKeys()) { qmPositionalAudioPlugins.insert(d, settings_ptr->value(d, true).toBool()); } settings_ptr->endGroup(); settings_ptr->beginGroup(QLatin1String("overlay")); os.load(settings_ptr); settings_ptr->endGroup(); } #undef SAVELOAD #define SAVELOAD(var,name) if (var != def.var) settings_ptr->setValue(QLatin1String(name), var); else settings_ptr->remove(QLatin1String(name)) #define SAVEFLAG(var,name) if (var != def.var) settings_ptr->setValue(QLatin1String(name), static_cast(var)); else settings_ptr->remove(QLatin1String(name)) #undef DEPRECATED #define DEPRECATED(name) settings_ptr->remove(QLatin1String(name)) void OverlaySettings::save() { save(g.qs); } void OverlaySettings::save(QSettings* settings_ptr) { OverlaySettings def; settings_ptr->setValue(QLatin1String("version"), QLatin1String(MUMTEXT(MUMBLE_VERSION_STRING))); settings_ptr->sync(); #if defined(Q_OS_WIN) || defined(Q_OS_MAC) if (settings_ptr->format() == QSettings::IniFormat) #endif { QFile f(settings_ptr->fileName()); f.setPermissions(f.permissions() & ~(QFile::ReadGroup | QFile::WriteGroup | QFile::ExeGroup | QFile::ReadOther | QFile::WriteOther | QFile::ExeOther)); } SAVELOAD(bEnable, "enable"); SAVELOAD(osShow, "show"); SAVELOAD(bAlwaysSelf, "alwaysself"); SAVELOAD(uiActiveTime, "activetime"); SAVELOAD(osSort, "sort"); SAVELOAD(fX, "x"); SAVELOAD(fY, "y"); SAVELOAD(fZoom, "zoom"); SAVELOAD(uiColumns, "columns"); settings_ptr->beginReadArray(QLatin1String("states")); for (int i=0; i<4; ++i) { settings_ptr->setArrayIndex(i); SAVELOAD(qcUserName[i], "color"); SAVELOAD(fUser[i], "opacity"); } settings_ptr->endArray(); SAVELOAD(qfUserName, "userfont"); SAVELOAD(qfChannel, "channelfont"); SAVELOAD(qcChannel, "channelcolor"); SAVELOAD(qfFps, "fpsfont"); SAVELOAD(qcFps, "fpscolor"); SAVELOAD(fBoxPad, "padding"); SAVELOAD(fBoxPenWidth, "penwidth"); SAVELOAD(qcBoxPen, "pencolor"); SAVELOAD(qcBoxFill, "fillcolor"); SAVELOAD(bUserName, "usershow"); SAVELOAD(bChannel, "channelshow"); SAVELOAD(bMutedDeafened, "mutedshow"); SAVELOAD(bAvatar, "avatarshow"); SAVELOAD(bBox, "boxshow"); SAVELOAD(bFps, "fpsshow"); SAVELOAD(bTime, "timeshow"); SAVELOAD(fUserName, "useropacity"); SAVELOAD(fChannel, "channelopacity"); SAVELOAD(fMutedDeafened, "mutedopacity"); SAVELOAD(fAvatar, "avataropacity"); SAVELOAD(fFps, "fpsopacity"); SAVELOAD(qrfUserName, "userrect"); SAVELOAD(qrfChannel, "channelrect"); SAVELOAD(qrfMutedDeafened, "mutedrect"); SAVELOAD(qrfAvatar, "avatarrect"); SAVELOAD(qrfFps, "fpsrect"); SAVELOAD(qrfTime, "timerect"); SAVEFLAG(qaUserName, "useralign"); SAVEFLAG(qaChannel, "channelalign"); SAVEFLAG(qaMutedDeafened, "mutedalign"); SAVEFLAG(qaAvatar, "avataralign"); SAVELOAD(oemOverlayExcludeMode, "mode"); settings_ptr->setValue(QLatin1String("launchers"), qslLaunchers); settings_ptr->setValue(QLatin1String("launchersexclude"), qslLaunchersExclude); settings_ptr->setValue(QLatin1String("whitelist"), qslWhitelist); settings_ptr->setValue(QLatin1String("whitelistexclude"), qslWhitelistExclude); settings_ptr->setValue(QLatin1String("paths"), qslPaths); settings_ptr->setValue(QLatin1String("pathsexclude"), qslPathsExclude); settings_ptr->setValue(QLatin1String("blacklist"), qslBlacklist); settings_ptr->setValue(QLatin1String("blacklistexclude"), qslBlacklistExclude); } void Settings::save() { QSettings* settings_ptr = g.qs; Settings def; // Config updates SAVELOAD(uiUpdateCounter, "lastupdate"); SAVELOAD(bMute, "audio/mute"); SAVELOAD(bDeaf, "audio/deaf"); SAVELOAD(atTransmit, "audio/transmit"); SAVELOAD(uiDoublePush, "audio/doublepush"); SAVELOAD(pttHold, "audio/ptthold"); SAVELOAD(bTxAudioCue, "audio/pushclick"); SAVELOAD(qsTxAudioCueOn, "audio/pushclickon"); SAVELOAD(qsTxAudioCueOff, "audio/pushclickoff"); SAVELOAD(iQuality, "audio/quality"); SAVELOAD(iMinLoudness, "audio/loudness"); SAVELOAD(fVolume, "audio/volume"); SAVELOAD(fOtherVolume, "audio/othervolume"); SAVELOAD(bAttenuateOthers, "audio/attenuateothers"); SAVELOAD(bAttenuateOthersOnTalk, "audio/attenuateothersontalk"); SAVELOAD(bAttenuateUsersOnPrioritySpeak, "audio/attenuateusersonpriorityspeak"); SAVELOAD(bOnlyAttenuateSameOutput, "audio/onlyattenuatesameoutput"); SAVELOAD(bAttenuateLoopbacks, "audio/attenuateloopbacks"); SAVELOAD(vsVAD, "audio/vadsource"); SAVELOAD(fVADmin, "audio/vadmin"); SAVELOAD(fVADmax, "audio/vadmax"); SAVELOAD(iNoiseSuppress, "audio/noisesupress"); SAVELOAD(bDenoise, "audio/denoise"); SAVELOAD(uiAudioInputChannelMask, "audio/inputchannelmask"); SAVELOAD(iVoiceHold, "audio/voicehold"); SAVELOAD(iOutputDelay, "audio/outputdelay"); // Idle auto actions SAVELOAD(iIdleTime, "audio/idletime"); SAVELOAD(iaeIdleAction, "audio/idleaction"); SAVELOAD(bUndoIdleActionUponActivity, "audio/undoidleactionuponactivity"); SAVELOAD(fAudioMinDistance, "audio/mindistance"); SAVELOAD(fAudioMaxDistance, "audio/maxdistance"); SAVELOAD(fAudioMaxDistVolume, "audio/maxdistancevolume"); SAVELOAD(fAudioBloom, "audio/bloom"); SAVELOAD(bEcho, "audio/echo"); SAVELOAD(bEchoMulti, "audio/echomulti"); SAVELOAD(bExclusiveInput, "audio/exclusiveinput"); SAVELOAD(bExclusiveOutput, "audio/exclusiveoutput"); SAVELOAD(bPositionalAudio, "audio/positional"); SAVELOAD(bPositionalHeadphone, "audio/headphone"); SAVELOAD(qsAudioInput, "audio/input"); SAVELOAD(qsAudioOutput, "audio/output"); SAVELOAD(bWhisperFriends, "audio/whisperfriends"); SAVELOAD(bTransmitPosition, "audio/postransmit"); SAVELOAD(bUseOpusMusicEncoding, "codec/opus/encoder/music"); SAVELOAD(iJitterBufferSize, "net/jitterbuffer"); SAVELOAD(iFramesPerPacket, "net/framesperpacket"); SAVELOAD(bASIOEnable, "asio/enable"); SAVELOAD(qsASIOclass, "asio/class"); SAVELOAD(qlASIOmic, "asio/mic"); SAVELOAD(qlASIOspeaker, "asio/speaker"); SAVELOAD(qsWASAPIInput, "wasapi/input"); SAVELOAD(qsWASAPIOutput, "wasapi/output"); SAVELOAD(qsWASAPIRole, "wasapi/role"); SAVELOAD(qsALSAInput, "alsa/input"); SAVELOAD(qsALSAOutput, "alsa/output"); SAVELOAD(qsPulseAudioInput, "pulseaudio/input"); SAVELOAD(qsPulseAudioOutput, "pulseaudio/output"); SAVELOAD(qsJackAudioOutput, "jack/output"); SAVELOAD(bJackStartServer, "jack/startserver"); SAVELOAD(bJackAutoConnect, "jack/autoconnect"); SAVELOAD(qsOSSInput, "oss/input"); SAVELOAD(qsOSSOutput, "oss/output"); SAVELOAD(qsCoreAudioInput, "coreaudio/input"); SAVELOAD(qsCoreAudioOutput, "coreaudio/output"); SAVELOAD(iPortAudioInput, "portaudio/input"); SAVELOAD(iPortAudioOutput, "portaudio/output"); SAVELOAD(qbaDXInput, "directsound/input"); SAVELOAD(qbaDXOutput, "directsound/output"); SAVELOAD(bTTS, "tts/enable"); SAVELOAD(iTTSVolume, "tts/volume"); SAVELOAD(iTTSThreshold, "tts/threshold"); SAVELOAD(bTTSMessageReadBack, "tts/readback"); SAVELOAD(qsTTSLanguage, "tts/language"); // Network settings SAVELOAD(bTCPCompat, "net/tcponly"); SAVELOAD(bQoS, "net/qos"); SAVELOAD(bReconnect, "net/reconnect"); SAVELOAD(bAutoConnect, "net/autoconnect"); SAVELOAD(ptProxyType, "net/proxytype"); SAVELOAD(qsProxyHost, "net/proxyhost"); SAVELOAD(usProxyPort, "net/proxyport"); SAVELOAD(qsProxyUsername, "net/proxyusername"); SAVELOAD(qsProxyPassword, "net/proxypassword"); DEPRECATED("net/maximagesize"); SAVELOAD(iMaxImageWidth, "net/maximagewidth"); SAVELOAD(iMaxImageHeight, "net/maximageheight"); SAVELOAD(qsServicePrefix, "net/serviceprefix"); SAVELOAD(iMaxInFlightTCPPings, "net/maxinflighttcppings"); SAVELOAD(iPingIntervalMsec, "net/pingintervalmsec"); SAVELOAD(iConnectionTimeoutDurationMsec, "net/connectiontimeoutdurationmsec"); SAVELOAD(bUdpForceTcpAddr, "net/udpforcetcpaddr"); // Network settings - SSL SAVELOAD(qsSslCiphers, "net/sslciphers"); // Privacy settings SAVELOAD(bHideOS, "privacy/hideos"); SAVELOAD(bExpert, "ui/expert"); SAVELOAD(qsLanguage, "ui/language"); SAVELOAD(themeName, "ui/theme"); SAVELOAD(themeStyleName, "ui/themestyle"); SAVELOAD(ceExpand, "ui/expand"); SAVELOAD(ceChannelDrag, "ui/drag"); SAVELOAD(ceUserDrag, "ui/userdrag"); SAVELOAD(aotbAlwaysOnTop, "ui/alwaysontop"); SAVELOAD(bAskOnQuit, "ui/askonquit"); SAVELOAD(bEnableDeveloperMenu, "ui/developermenu"); SAVELOAD(bLockLayout, "ui/locklayout"); SAVELOAD(bMinimalView, "ui/minimalview"); SAVELOAD(bHideFrame, "ui/hideframe"); SAVELOAD(bUserTop, "ui/usertop"); SAVELOAD(qbaMainWindowGeometry, "ui/geometry"); SAVELOAD(qbaMainWindowState, "ui/state"); SAVELOAD(qbaMinimalViewGeometry, "ui/minimalviewgeometry"); SAVELOAD(qbaMinimalViewState, "ui/minimalviewstate"); SAVELOAD(qbaConfigGeometry, "ui/ConfigGeometry"); SAVELOAD(wlWindowLayout, "ui/WindowLayout"); SAVELOAD(qbaSplitterState, "ui/splitter"); SAVELOAD(qbaHeaderState, "ui/header"); SAVELOAD(qsUsername, "ui/username"); SAVELOAD(qsLastServer, "ui/server"); SAVELOAD(ssFilter, "ui/serverfilter"); SAVELOAD(bUpdateCheck, "ui/updatecheck"); SAVELOAD(bPluginCheck, "ui/plugincheck"); SAVELOAD(bHideInTray, "ui/hidetray"); SAVELOAD(bStateInTray, "ui/stateintray"); SAVELOAD(bUsage, "ui/usage"); SAVELOAD(bShowUserCount, "ui/showusercount"); SAVELOAD(bChatBarUseSelection, "ui/chatbaruseselection"); SAVELOAD(bFilterHidesEmptyChannels, "ui/filterhidesemptychannels"); SAVELOAD(bFilterActive, "ui/filteractive"); SAVELOAD(qsImagePath, "ui/imagepath"); SAVELOAD(bShowContextMenuInMenuBar, "ui/showcontextmenuinmenubar"); SAVELOAD(qbaConnectDialogGeometry, "ui/connect/geometry"); SAVELOAD(qbaConnectDialogHeader, "ui/connect/header"); SAVELOAD(bShowTransmitModeComboBox, "ui/transmitmodecombobox"); SAVELOAD(bHighContrast, "ui/HighContrast"); SAVELOAD(iMaxLogBlocks, "ui/MaxLogBlocks"); // PTT Button window SAVELOAD(bShowPTTButtonWindow, "ui/showpttbuttonwindow"); SAVELOAD(qbaPTTButtonWindowGeometry, "ui/pttbuttonwindowgeometry"); // Recording SAVELOAD(qsRecordingPath, "recording/path"); SAVELOAD(qsRecordingFile, "recording/file"); SAVELOAD(rmRecordingMode, "recording/mode"); SAVELOAD(iRecordingFormat, "recording/format"); // Special configuration options not exposed to UI SAVELOAD(bDisableCELT, "audio/disablecelt"); SAVELOAD(disablePublicList, "ui/disablepubliclist"); SAVELOAD(disableConnectDialogEditing, "ui/disableconnectdialogediting"); // OverlayPrivateWin SAVELOAD(iOverlayWinHelperRestartCooldownMsec, "overlay_win/helper/restart_cooldown_msec"); SAVELOAD(bOverlayWinHelperX86Enable, "overlay_win/helper/x86/enable"); SAVELOAD(bOverlayWinHelperX64Enable, "overlay_win/helper/x64/enable"); // LCD SAVELOAD(iLCDUserViewMinColWidth, "lcd/userview/mincolwidth"); SAVELOAD(iLCDUserViewSplitterWidth, "lcd/userview/splitterwidth"); QByteArray qba = CertWizard::exportCert(kpCertificate); settings_ptr->setValue(QLatin1String("net/certificate"), qba); SAVELOAD(bShortcutEnable, "shortcut/enable"); SAVELOAD(bSuppressMacEventTapWarning, "shortcut/mac/suppresswarning"); SAVELOAD(bEnableEvdev, "shortcut/linux/evdev/enable"); SAVELOAD(bEnableXInput2, "shortcut/x11/xinput2/enable"); SAVELOAD(bEnableGKey, "shortcut/gkey"); SAVELOAD(bEnableXboxInput, "shortcut/windows/xbox/enable"); SAVELOAD(bEnableWinHooks, "winhooks"); SAVELOAD(bDirectInputVerboseLogging, "shortcut/windows/directinput/verboselogging"); SAVELOAD(bEnableUIAccess, "shortcut/windows/uiaccess/enable"); settings_ptr->beginWriteArray(QLatin1String("shortcuts")); int idx = 0; foreach(const Shortcut &s, qlShortcuts) { if (! s.isServerSpecific()) { settings_ptr->setArrayIndex(idx++); settings_ptr->setValue(QLatin1String("index"), s.iIndex); settings_ptr->setValue(QLatin1String("keys"), s.qlButtons); settings_ptr->setValue(QLatin1String("suppress"), s.bSuppress); settings_ptr->setValue(QLatin1String("data"), s.qvData); } } settings_ptr->endArray(); settings_ptr->beginWriteArray(QLatin1String("messages")); for (QMap::const_iterator it = qmMessages.constBegin(); it != qmMessages.constEnd(); ++it) { settings_ptr->setArrayIndex(it.key()); SAVELOAD(qmMessages[it.key()], "log"); } settings_ptr->endArray(); settings_ptr->beginWriteArray(QLatin1String("messagesounds")); for (QMap::const_iterator it = qmMessageSounds.constBegin(); it != qmMessageSounds.constEnd(); ++it) { settings_ptr->setArrayIndex(it.key()); SAVELOAD(qmMessageSounds[it.key()], "logsound"); } settings_ptr->endArray(); settings_ptr->beginGroup(QLatin1String("lcd/devices")); foreach(const QString &d, qmLCDDevices.keys()) { bool v = qmLCDDevices.value(d); if (!v) settings_ptr->setValue(d, v); else settings_ptr->remove(d); } settings_ptr->endGroup(); settings_ptr->beginGroup(QLatin1String("audio/plugins")); foreach(const QString &d, qmPositionalAudioPlugins.keys()) { bool v = qmPositionalAudioPlugins.value(d); if (!v) settings_ptr->setValue(d, v); else settings_ptr->remove(d); } settings_ptr->endGroup(); settings_ptr->beginGroup(QLatin1String("overlay")); os.save(settings_ptr); settings_ptr->endGroup(); } mumble-1.3.4/src/mumble/CELTCodec_sbcelt.cpp0000664000175000017500000000414014010707273020435 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "CELTCodec.h" #include "Audio.h" #include "Version.h" CELTCodec::CELTCodec(const QString &version) { bValid = true; cmMode = NULL; qsVersion = version; iBitstreamVersion = INT_MIN; this->celt_encoder_destroy = ::celt_encoder_destroy; this->celt_encoder_ctl = ::celt_encoder_ctl; this->celt_decoder_destroy = ::celt_decoder_destroy; this->celt_decoder_ctl = ::celt_decoder_ctl; } CELTCodec::~CELTCodec() { if (cmMode) ::celt_mode_destroy(const_cast(cmMode)); } bool CELTCodec::isValid() const { return bValid; } int CELTCodec::bitstreamVersion() const { if (cmMode && iBitstreamVersion == INT_MIN) ::celt_mode_info(cmMode, CELT_GET_BITSTREAM_VERSION, reinterpret_cast(&iBitstreamVersion)); return iBitstreamVersion; } QString CELTCodec::version() const { return qsVersion; } void CELTCodec::report() const { qWarning("CELT bitstream %08x from internal CELT with SBCELT decoding", bitstreamVersion()); } CELTCodecSBCELT::CELTCodecSBCELT() : CELTCodec(QLatin1String("0.7.0")) { if (bValid) { cmMode = ::celt_mode_create(SAMPLE_RATE, SAMPLE_RATE / 100, NULL); cmSBCELTMode = ::sbcelt_mode_create(SAMPLE_RATE, SAMPLE_RATE / 100, NULL); this->celt_decoder_destroy = ::sbcelt_decoder_destroy; this->celt_decoder_ctl = ::sbcelt_decoder_ctl; } } CELTEncoder *CELTCodecSBCELT::encoderCreate() { return ::celt_encoder_create(cmMode, 1, NULL); } CELTDecoder *CELTCodecSBCELT::decoderCreate() { return ::sbcelt_decoder_create(cmSBCELTMode, 1, NULL); } int CELTCodecSBCELT::encode(CELTEncoder *st, const celt_int16 *pcm, unsigned char *compressed, int nbCompressedBytes) { return ::celt_encode(st, pcm, NULL, compressed, nbCompressedBytes); } int CELTCodecSBCELT::decode_float(CELTDecoder *st, const unsigned char *data, int len, float *pcm) { return ::sbcelt_decode_float(st, data, len, pcm); }mumble-1.3.4/src/mumble/DirectSound.h0000664000175000017500000000140014010707273017300 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_DIRECTSOUND_H_ #define MUMBLE_MUMBLE_DIRECTSOUND_H_ #include "AudioInput.h" #include "AudioOutput.h" class DXAudioOutput : public AudioOutput { private: Q_OBJECT Q_DISABLE_COPY(DXAudioOutput) public: DXAudioOutput(); ~DXAudioOutput() Q_DECL_OVERRIDE; void run() Q_DECL_OVERRIDE; }; class DXAudioInput : public AudioInput { private: Q_OBJECT Q_DISABLE_COPY(DXAudioInput) public: DXAudioInput(); ~DXAudioInput() Q_DECL_OVERRIDE; void run() Q_DECL_OVERRIDE; }; #endif mumble-1.3.4/src/mumble/Overlay.cpp0000664000175000017500000003114014010707273017035 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "Overlay.h" #include "OverlayClient.h" #include "Channel.h" #include "ClientUser.h" #include "Database.h" #include "GlobalShortcut.h" #include "MainWindow.h" #include "Message.h" #include "OverlayText.h" #include "RichTextEditor.h" #include "ServerHandler.h" #include "User.h" #include "WebFetch.h" // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" QString OverlayAppInfo::applicationIdentifierForPath(const QString &path) { #ifdef Q_OS_MAC QString qsIdentifier; CFDictionaryRef plist = NULL; CFDataRef data = NULL; QFile qfAppBundle(QString::fromLatin1("%1/Contents/Info.plist").arg(path)); if (qfAppBundle.exists()) { qfAppBundle.open(QIODevice::ReadOnly); QByteArray qbaPlistData = qfAppBundle.readAll(); data = CFDataCreateWithBytesNoCopy(NULL, reinterpret_cast(qbaPlistData.data()), qbaPlistData.count(), kCFAllocatorNull); plist = static_cast(CFPropertyListCreateFromXMLData(NULL, data, kCFPropertyListImmutable, NULL)); if (plist) { CFStringRef ident = static_cast(CFDictionaryGetValue(plist, CFSTR("CFBundleIdentifier"))); if (ident) { char buf[4096]; CFStringGetCString(ident, buf, 4096, kCFStringEncodingUTF8); qsIdentifier = QString::fromUtf8(buf); } } } if (data) { CFRelease(data); } if (plist) { CFRelease(plist); } return qsIdentifier; #else return QDir::toNativeSeparators(path); #endif } OverlayAppInfo OverlayAppInfo::applicationInfoForId(const QString &identifier) { QString qsAppName(identifier); QIcon qiAppIcon; #if defined(Q_OS_MAC) CFStringRef bundleId = NULL; CFURLRef bundleUrl = NULL; CFBundleRef bundle = NULL; OSStatus err = noErr; char buf[4096]; bundleId = CFStringCreateWithCharacters(kCFAllocatorDefault, reinterpret_cast(identifier.unicode()), identifier.length()); err = LSFindApplicationForInfo(kLSUnknownCreator, bundleId, NULL, NULL, &bundleUrl); if (err == noErr) { // Figure out the bundle name of the application. CFStringRef absBundlePath = CFURLCopyFileSystemPath(bundleUrl, kCFURLPOSIXPathStyle); CFStringGetCString(absBundlePath, buf, 4096, kCFStringEncodingUTF8); QString qsBundlePath = QString::fromUtf8(buf); CFRelease(absBundlePath); qsAppName = QFileInfo(qsBundlePath).bundleName(); // Load the bundle's icon. bundle = CFBundleCreate(NULL, bundleUrl); if (bundle) { CFDictionaryRef info = CFBundleGetInfoDictionary(bundle); if (info) { CFStringRef iconFileName = reinterpret_cast(CFDictionaryGetValue(info, CFSTR("CFBundleIconFile"))); if (iconFileName) { CFStringGetCString(iconFileName, buf, 4096, kCFStringEncodingUTF8); QString qsIconPath = QString::fromLatin1("%1/Contents/Resources/%2") .arg(qsBundlePath, QString::fromUtf8(buf)); if (! QFile::exists(qsIconPath)) { qsIconPath += QString::fromLatin1(".icns"); } if (QFile::exists(qsIconPath)) { qiAppIcon = QIcon(qsIconPath); } } } } } if (bundleId) { CFRelease(bundleId); } if (bundleUrl) { CFRelease(bundleUrl); } if (bundle) { CFRelease(bundle); } #elif defined(Q_OS_WIN) // qWinAppInst(), whose return value we used to pass // to ExtractIcon below, was removed in Qt 5.8. // // It was removed via // https://github.com/qt/qtbase/commit/64507c7165e42c2a5029353d8f97a0d841fa6b01 // // In both Qt 4 and Qt 5, the qWinAppInst() implementation // simply calls GetModuleHandle(0). // // To sidestep the removal of the function, we simply // call through to GetModuleHandle() directly. HINSTANCE qWinAppInstValue = GetModuleHandle(NULL); HICON icon = ExtractIcon(qWinAppInstValue, identifier.toStdWString().c_str(), 0); if (icon) { #if QT_VERSION >= 0x050000 extern QPixmap qt_pixmapFromWinHICON(HICON icon); qiAppIcon = QIcon(qt_pixmapFromWinHICON(icon)); #else qiAppIcon = QIcon(QPixmap::fromWinHICON(icon)); #endif DestroyIcon(icon); } #endif return OverlayAppInfo(qsAppName, qiAppIcon); } OverlayAppInfo::OverlayAppInfo(QString name, QIcon icon) { qsDisplayName = name; qiIcon = icon; } OverlayMouse::OverlayMouse(QGraphicsItem *p) : QGraphicsPixmapItem(p) { } bool OverlayMouse::contains(const QPointF &) const { return false; } bool OverlayMouse::collidesWithPath(const QPainterPath &, Qt::ItemSelectionMode) const { return false; } OverlayGroup::OverlayGroup() : QGraphicsItem() { } int OverlayGroup::type() const { return Type; } void OverlayGroup::paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *) { } QRectF OverlayGroup::boundingRect() const { QRectF qr; foreach(const QGraphicsItem *item, childItems()) if (item->isVisible()) qr |= item->boundingRect().translated(item->pos()); return qr; } Overlay::Overlay() : QObject() { d = NULL; m_initialized = false; qlsServer = NULL; QMetaObject::connectSlotsByName(this); } Overlay::~Overlay() { setActive(false); if (d) { delete d; } // Need to be deleted first, since destructor references lingering QLocalSockets foreach(OverlayClient *oc, qlClients) { // As we're the one closing the connection, we do not need to be // notified of disconnects. This is important because on disconnect we // also remove (and 'delete') the overlay client. disconnect(oc->qlsSocket, SIGNAL(disconnected()), this, SLOT(disconnected())); disconnect(oc->qlsSocket, SIGNAL(error(QLocalSocket::LocalSocketError)), this, SLOT(error(QLocalSocket::LocalSocketError))); delete oc; } } void Overlay::initialize() { if (!m_initialized) { platformInit(); forceSettings(); createPipe(); m_initialized = true; } } void Overlay::setActive(bool act) { if (!act && !m_initialized) { // Disabling when the Overlay hasn't been initialized yet, doesn't make much sense return; } // Make sure the Overlay is initialized initialize(); setActiveInternal(act); } void Overlay::createPipe() { qlsServer = new QLocalServer(this); QString pipepath; #ifdef Q_OS_WIN pipepath = QLatin1String("MumbleOverlayPipe"); #else { QString xdgRuntimePath = QProcessEnvironment::systemEnvironment().value(QLatin1String("XDG_RUNTIME_DIR")); QDir xdgRuntimeDir = QDir(xdgRuntimePath); if (! xdgRuntimePath.isNull() && xdgRuntimeDir.exists()) { pipepath = xdgRuntimeDir.absoluteFilePath(QLatin1String("MumbleOverlayPipe")); } else { pipepath = QDir::home().absoluteFilePath(QLatin1String(".MumbleOverlayPipe")); } } { QFile f(pipepath); if (f.exists()) { qWarning() << "Overlay: Removing old socket on" << pipepath; f.remove(); } } #endif if (! qlsServer->listen(pipepath)) { QMessageBox::warning(NULL, QLatin1String("Mumble"), tr("Failed to create communication with overlay at %2: %1. No overlay will be available.").arg(Qt::escape(qlsServer->errorString()), Qt::escape(pipepath)), QMessageBox::Ok, QMessageBox::NoButton); } else { qWarning() << "Overlay: Listening on" << qlsServer->fullServerName(); connect(qlsServer, SIGNAL(newConnection()), this, SLOT(newConnection())); } } void Overlay::newConnection() { while (qlsServer && qlsServer->hasPendingConnections()) { QLocalSocket *qls = qlsServer->nextPendingConnection(); OverlayClient *oc = new OverlayClient(qls, this); qlClients << oc; connect(qls, SIGNAL(disconnected()), this, SLOT(disconnected())); connect(qls, SIGNAL(error(QLocalSocket::LocalSocketError)), this, SLOT(error(QLocalSocket::LocalSocketError))); } } void Overlay::disconnected() { QLocalSocket *qls = qobject_cast(sender()); foreach(OverlayClient *oc, qlClients) { if (oc->qlsSocket == qls) { qlClients.removeAll(oc); delete oc; return; } } } void Overlay::error(QLocalSocket::LocalSocketError) { disconnected(); } bool Overlay::isActive() const { return ! qlClients.isEmpty(); } void Overlay::toggleShow() { if (g.ocIntercept) { g.ocIntercept->hideGui(); } else { foreach(OverlayClient *oc, qlClients) { if (oc->uiPid) { #if defined(Q_OS_WIN) HWND hwnd = GetForegroundWindow(); DWORD pid = 0; GetWindowThreadProcessId(hwnd, &pid); if (pid != oc->uiPid) continue; #elif defined(Q_OS_MAC) pid_t pid = 0; ProcessSerialNumber psn; GetFrontProcess(&psn); GetProcessPID(&psn, &pid); if (static_cast(pid) != oc->uiPid) continue; #if 0 // Fullscreen only. if (! CGDisplayIsCaptured(CGMainDisplayID())) continue; #endif #endif oc->showGui(); return; } } } } void Overlay::forceSettings() { foreach(OverlayClient *oc, qlClients) { oc->reset(); } updateOverlay(); } void Overlay::verifyTexture(ClientUser *cp, bool allowupdate) { qsQueried.remove(cp->uiSession); ClientUser *self = ClientUser::get(g.uiSession); allowupdate = allowupdate && self && self->cChannel->isLinked(cp->cChannel); if (allowupdate && ! cp->qbaTextureHash.isEmpty() && cp->qbaTexture.isEmpty()) cp->qbaTexture = g.db->blob(cp->qbaTextureHash); if (! cp->qbaTexture.isEmpty()) { bool valid = true; if (cp->qbaTexture.length() < static_cast(sizeof(unsigned int))) { valid = false; } else if (qFromBigEndian(reinterpret_cast(cp->qbaTexture.constData())) == 600 * 60 * 4) { QByteArray qba = qUncompress(cp->qbaTexture); if (qba.length() != 600 * 60 * 4) { valid = false; } else { int width = 0; int height = 0; const unsigned int *ptr = reinterpret_cast(qba.constData()); // If we have an alpha only part on the right side of the image ignore it for (int y=0;y<60;++y) { for (int x=0;x<600; ++x) { if (ptr[y*600+x] & 0xff000000) { if (x > width) width = x; if (y > height) height = y; } } } // Full size image? More likely image without alpha; fix it. if ((width == 599) && (height == 59)) { width = 0; height = 0; for (int y=0;y<60;++y) { for (int x=0;x<600; ++x) { if (ptr[y*600+x] & 0x00ffffff) { if (x > width) width = x; if (y > height) height = y; } } } } if (! width || ! height) { valid = false; } else { QImage img = QImage(width+1, height+1, QImage::Format_ARGB32); { QImage srcimg(reinterpret_cast(qba.constData()), 600, 60, QImage::Format_ARGB32); QPainter imgp(&img); img.fill(0); imgp.setRenderHint(QPainter::Antialiasing); imgp.setRenderHint(QPainter::TextAntialiasing); imgp.setBackground(QColor(0,0,0,0)); imgp.setCompositionMode(QPainter::CompositionMode_Source); imgp.drawImage(0, 0, srcimg); } cp->qbaTexture = QByteArray(); QBuffer qb(& cp->qbaTexture); qb.open(QIODevice::WriteOnly); QImageWriter qiw(&qb, "png"); qiw.write(img); cp->qbaTextureFormat = QString::fromLatin1("png").toUtf8(); } } } else { QBuffer qb(& cp->qbaTexture); qb.open(QIODevice::ReadOnly); QImageReader qir; qir.setAutoDetectImageFormat(false); QByteArray fmt; if (RichTextImage::isValidImage(cp->qbaTexture, fmt)) { qir.setFormat(fmt); qir.setDevice(&qb); if (! qir.canRead() || (qir.size().width() > 1024) || (qir.size().height() > 1024)) { valid = false; } else { cp->qbaTextureFormat = qir.format(); QImage qi = qir.read(); valid = ! qi.isNull(); } } else { valid = false; } } if (! valid) { cp->qbaTexture = QByteArray(); cp->qbaTextureHash = QByteArray(); } } if (allowupdate) updateOverlay(); } typedef QPair qpChanCol; void Overlay::updateOverlay() { if (! g.uiSession) qsQueried.clear(); if (qlClients.isEmpty()) return; qsQuery.clear(); foreach(OverlayClient *oc, qlClients) { if (! oc->update()) { qWarning() << "Overlay: Dead client detected. PID" << oc->uiPid << oc->qsExecutablePath; qlClients.removeAll(oc); oc->scheduleDelete(); break; } } if (! qsQuery.isEmpty()) { MumbleProto::RequestBlob mprb; foreach(unsigned int session, qsQuery) { qsQueried.insert(session); mprb.add_session_texture(session); } g.sh->sendMessage(mprb); } } void Overlay::requestTexture(ClientUser *cu) { if (cu->qbaTexture.isEmpty() && ! qsQueried.contains(cu->uiSession)) { cu->qbaTexture=g.db->blob(cu->qbaTextureHash); if (cu->qbaTexture.isEmpty()) qsQuery.insert(cu->uiSession); else verifyTexture(cu, false); } } mumble-1.3.4/src/mumble/VoiceRecorderDialog.h0000664000175000017500000000201514010707274020734 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_VOICERECORDERDIALOG_H_ #define MUMBLE_MUMBLE_VOICERECORDERDIALOG_H_ #pragma once #include "ui_VoiceRecorderDialog.h" class VoiceRecorderDialog : public QDialog, private Ui::VoiceRecorderDialog { private: Q_OBJECT Q_DISABLE_COPY(VoiceRecorderDialog) QTimer *qtTimer; public: explicit VoiceRecorderDialog(QWidget *p = NULL); ~VoiceRecorderDialog() Q_DECL_OVERRIDE; void closeEvent(QCloseEvent *evt) Q_DECL_OVERRIDE; public slots: void on_qpbStart_clicked(); void on_qpbStop_clicked(); void on_qtTimer_timeout(); void on_qpbTargetDirectoryBrowse_clicked(); void onRecorderStopped(); void onRecorderStarted(); void onRecorderError(int err, QString strerr); void reset(bool resettimer=true); }; #endif // VOICERECORDERDIALOG_H_ mumble-1.3.4/src/mumble/RichTextEditorLink.ui0000664000175000017500000000432114010707273020767 0ustar builderbuilder RichTextEditorLink 0 0 295 95 Add Link URL qleUrl Text qleText Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok qleUrl qleText buttonBox buttonBox accepted() RichTextEditorLink accept() 227 228 157 274 buttonBox rejected() RichTextEditorLink reject() 295 234 286 274 mumble-1.3.4/src/mumble/UserLockFile.h0000664000175000017500000000216414010707273017414 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_LOCKFILE_H_ #define MUMBLE_MUMBLE_LOCKFILE_H_ #if defined(Q_OS_WIN) # include #endif /// UserLockFile implements an atomic lock file /// that can be used as a mutex between different /// processes run by the same user. class UserLockFile { #if defined(Q_OS_WIN) HANDLE m_handle; #endif QString m_path; public: /// Constructs a LockFile at path. /// The path should be somewhere /// owned by the current user, such /// as inside the home directory of /// the user. This is to avoid clashing /// with other lock files. UserLockFile(const QString &path); /// Destroys the LockFile, and ensures /// that it is released. ~UserLockFile(); /// Returns the path that the lock file /// exists at. QString path() const; /// Acquires the lock file. bool acquire(); /// Releases the lock file. void release(); }; #endif mumble-1.3.4/src/mumble/Cert.cpp0000664000175000017500000003454614010707273016326 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . // Ignore old-style casts for the whole file. // We can't use push/pop. They were implemented in GCC 4.6, // but we still build with GCC 4.2 for the legacy OS X Universal // build. #if defined(__GNUC__) # pragma GCC diagnostic ignored "-Wold-style-cast" #endif #include "mumble_pch.hpp" #include "Cert.h" #include "Global.h" #include "SelfSignedCertificate.h" #define SSL_STRING(x) QString::fromLatin1(x).toUtf8().data() CertView::CertView(QWidget *p) : QGroupBox(p) { QGridLayout *grid = new QGridLayout(this); QLabel *l; l = new QLabel(tr("Name")); grid->addWidget(l, 0, 0, 1, 1, Qt::AlignLeft); qlSubjectName = new QLabel(); qlSubjectName->setTextFormat(Qt::PlainText); qlSubjectName->setWordWrap(true); grid->addWidget(qlSubjectName, 0, 1, 1, 1); l = new QLabel(tr("Email")); grid->addWidget(l, 1, 0, 1, 1, Qt::AlignLeft); qlSubjectEmail = new QLabel(); qlSubjectEmail->setTextFormat(Qt::PlainText); qlSubjectEmail->setWordWrap(true); grid->addWidget(qlSubjectEmail, 1, 1, 1, 1); l = new QLabel(tr("Issuer")); grid->addWidget(l, 2, 0, 1, 1, Qt::AlignLeft); qlIssuerName = new QLabel(); qlIssuerName->setTextFormat(Qt::PlainText); qlIssuerName->setWordWrap(true); grid->addWidget(qlIssuerName, 2, 1, 1, 1); l = new QLabel(tr("Expiry Date")); grid->addWidget(l, 3, 0, 1, 1, Qt::AlignLeft); qlExpiry = new QLabel(); qlExpiry->setWordWrap(true); grid->addWidget(qlExpiry, 3, 1, 1, 1); grid->setColumnStretch(1, 1); } void CertView::setCert(const QList &cert) { qlCert = cert; if (qlCert.isEmpty()) { qlSubjectName->setText(QString()); qlSubjectEmail->setText(QString()); qlIssuerName->setText(QString()); qlExpiry->setText(QString()); } else { QSslCertificate qscCert = qlCert.at(0); #if QT_VERSION >= 0x050000 const QStringList &names = qscCert.subjectInfo(QSslCertificate::CommonName); QString name; if (names.count() > 0) { name = names.at(0); } QStringList emails = qscCert.subjectAlternativeNames().values(QSsl::EmailEntry); #else const QString &name = qscCert.subjectInfo(QSslCertificate::CommonName); QStringList emails(qscCert.alternateSubjectNames().values(QSsl::EmailEntry)); #endif QString tmpName = name; tmpName = tmpName.replace(QLatin1String("\\x"), QLatin1String("%")); tmpName = QUrl::fromPercentEncoding(tmpName.toLatin1()); qlSubjectName->setText(tmpName); if (emails.count() > 0) qlSubjectEmail->setText(emails.join(QLatin1String("\n"))); else qlSubjectEmail->setText(tr("(none)")); if (qscCert.expiryDate() <= QDateTime::currentDateTime()) qlExpiry->setText(QString::fromLatin1("%1").arg(Qt::escape(qscCert.expiryDate().toString(Qt::SystemLocaleDate)))); else qlExpiry->setText(qscCert.expiryDate().toString(Qt::SystemLocaleDate)); if (qlCert.count() > 1) qscCert = qlCert.last(); #if QT_VERSION >= 0x050000 const QStringList &issuerNames = qscCert.issuerInfo(QSslCertificate::CommonName); QString issuerName; if (issuerNames.count() > 0) { issuerName = issuerNames.at(0); } #else const QString &issuerName = qscCert.issuerInfo(QSslCertificate::CommonName); #endif qlIssuerName->setText((issuerName == name) ? tr("Self-signed") : issuerName); } } CertWizard::CertWizard(QWidget *p) : QWizard(p) { setupUi(this); setOption(QWizard::NoCancelButton, false); qwpExport->setCommitPage(true); qwpExport->setComplete(false); qlPasswordNotice->setVisible(false); } int CertWizard::nextId() const { switch (currentId()) { case 0: { // Welcome if (qrbQuick->isChecked()) return 5; else if (qrbCreate->isChecked()) return 1; else if (qrbImport->isChecked()) return 2; else if (qrbExport->isChecked()) return 3; return -1; } case 2: // Import if (validateCert(kpCurrent)) return 4; else return 5; case 4: // Replace if (qrbCreate->isChecked()) return 3; if (qrbImport->isChecked()) return 5; return -1; case 3: // Export if (qrbCreate->isChecked()) return 5; else return -1; case 1: // New if (validateCert(kpCurrent)) return 4; else return 3; } return -1; } void CertWizard::initializePage(int id) { if (id == 0) { kpCurrent = kpNew = g.s.kpCertificate; if (validateCert(kpCurrent)) { qrbQuick->setEnabled(false); qrbExport->setEnabled(true); cvWelcome->setCert(kpCurrent.first); cvWelcome->setVisible(true); } else { qrbQuick->setEnabled(true); qrbExport->setEnabled(false); cvWelcome->setVisible(false); qrbQuick->setChecked(true); } } if (id == 3) { cvExport->setCert(kpNew.first); } if (id == 4) { cvNew->setCert(kpNew.first); cvCurrent->setCert(kpCurrent.first); } if (id == 2) { on_qleImportFile_textChanged(qleImportFile->text()); } QWizard::initializePage(id); } bool CertWizard::validateCurrentPage() { if (currentPage() == qwpNew) { QRegExp ereg(QLatin1String("(^$)|((.+)@(.+))"), Qt::CaseInsensitive, QRegExp::RegExp2); if (!ereg.exactMatch(qleEmail->text())) { qlError->setText(tr("Unable to validate email.
Enter a valid (or blank) email to continue.")); qwpNew->setComplete(false); return false; } else { kpNew = generateNewCert(qleName->text(), qleEmail->text()); if (! validateCert(kpNew)) { qlError->setText(tr("There was an error generating your certificate.
Please try again.")); return false; } } } if (currentPage() == qwpExport) { QByteArray qba = exportCert(kpNew); if (qba.isEmpty()) { QToolTip::showText(qleExportFile->mapToGlobal(QPoint(0,0)), tr("Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate."), qleExportFile); return false; } QFile f(qleExportFile->text()); if (! f.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Unbuffered)) { QToolTip::showText(qleExportFile->mapToGlobal(QPoint(0,0)), tr("The file could not be opened for writing. Please use another file."), qleExportFile); return false; } if (! f.setPermissions(QFile::ReadOwner | QFile::WriteOwner)) { QToolTip::showText(qleExportFile->mapToGlobal(QPoint(0,0)), tr("The file's permissions could not be set. No certificate and key has been written. Please use another file."), qleExportFile); return false; } qint64 written = f.write(qba); f.close(); if (written != qba.length()) { QToolTip::showText(qleExportFile->mapToGlobal(QPoint(0,0)), tr("The file could not be written successfully. Please use another file."), qleExportFile); return false; } } if (currentPage() == qwpImport) { QFile f(qleImportFile->text()); if (! f.open(QIODevice::ReadOnly | QIODevice::Unbuffered)) { QToolTip::showText(qleImportFile->mapToGlobal(QPoint(0,0)), tr("The file could not be opened for reading. Please use another file."), qleImportFile); return false; } QByteArray qba = f.readAll(); f.close(); if (qba.isEmpty()) { QToolTip::showText(qleImportFile->mapToGlobal(QPoint(0,0)), tr("The file is empty or could not be read. Please use another file."), qleImportFile); return false; } QPair, QSslKey> imp = importCert(qba, qlePassword->text()); if (! validateCert(imp)) { QToolTip::showText(qleImportFile->mapToGlobal(QPoint(0,0)), tr("The file did not contain a valid certificate and key. Please use another file."), qleImportFile); return false; } kpNew = imp; } if (currentPage() == qwpFinish) { g.s.kpCertificate = kpNew; } return QWizard::validateCurrentPage(); } void CertWizard::on_qleEmail_textChanged(const QString &) { qwpNew->setComplete(true); } void CertWizard::on_qpbExportFile_clicked() { QString fname = QFileDialog::getSaveFileName(this, tr("Select file to export certificate to"), qleExportFile->text(), QLatin1String("PKCS12 (*.p12 *.pfx *.pkcs12);;All (*)")); if (! fname.isNull()) { QFileInfo fi(fname); if (fi.suffix().isEmpty()) fname += QLatin1String(".p12"); qleExportFile->setText(QDir::toNativeSeparators(fname)); } } void CertWizard::on_qleExportFile_textChanged(const QString &text) { if (text.isEmpty()) { qwpExport->setComplete(false); return; } QString fname = QDir::fromNativeSeparators(text); QFile f(fname); QFileInfo fi(f); if (fi.exists()) { if (fi.isWritable()) { qwpExport->setComplete(f.open(QIODevice::WriteOnly | QIODevice::Append)); return; } } else { if (f.open(QIODevice::WriteOnly)) { if (f.remove()) { qwpExport->setComplete(true); return; } } } qwpExport->setComplete(false); } void CertWizard::on_qpbImportFile_clicked() { QString fname = QFileDialog::getOpenFileName(this, tr("Select file to import certificate from"), qleImportFile->text(), QLatin1String("PKCS12 (*.p12 *.pfx *.pkcs12);;All (*)")); if (! fname.isNull()) { qleImportFile->setText(QDir::toNativeSeparators(fname)); } } void CertWizard::on_qleImportFile_textChanged(const QString &text) { if (text.isEmpty()) { qlePassword->clear(); qlePassword->setEnabled(false); qlPassword->setEnabled(false); qlPasswordNotice->clear(); qlPasswordNotice->setVisible(false); qwpImport->setComplete(false); return; } QString fname = QDir::fromNativeSeparators(text); QFile f(fname); if (f.open(QIODevice::ReadOnly)) { QByteArray qba = f.readAll(); QPair, QSslKey> imp = importCert(qba, qlePassword->text()); if (validateCert(imp)) { qlePassword->setEnabled(false); qlPassword->setEnabled(false); qlPasswordNotice->clear(); qlPasswordNotice->setVisible(false); cvImport->setCert(imp.first); qwpImport->setComplete(true); return; } else { qlePassword->setEnabled(true); qlPassword->setEnabled(true); qlPasswordNotice->setText(tr("Unable to import. Missing password or incompatible file type.")); qlPasswordNotice->setVisible(true); } } else { qlePassword->clear(); qlePassword->setEnabled(false); qlPassword->setEnabled(false); qlPasswordNotice->clear(); qlPasswordNotice->setVisible(false); } cvImport->setCert(QList()); qwpImport->setComplete(false); } void CertWizard::on_qlePassword_textChanged(const QString &) { on_qleImportFile_textChanged(qleImportFile->text()); } void CertWizard::on_qlIntroText_linkActivated(const QString &url) { QDesktopServices::openUrl(QUrl(url)); } bool CertWizard::validateCert(const Settings::KeyPair &kp) { bool valid = ! kp.second.isNull() && ! kp.first.isEmpty(); foreach(const QSslCertificate &cert, kp.first) valid = valid && ! cert.isNull(); return valid; } Settings::KeyPair CertWizard::generateNewCert(QString qsname, const QString &qsemail) { QSslCertificate qscCert; QSslKey qskKey; // Ignore return value. // The method sets qscCert and qskKey to null values if it fails. SelfSignedCertificate::generateMumbleCertificate(qsname, qsemail, qscCert, qskKey); QList qlCert; qlCert << qscCert; return Settings::KeyPair(qlCert, qskKey); } Settings::KeyPair CertWizard::importCert(QByteArray data, const QString &pw) { X509 *x509 = NULL; EVP_PKEY *pkey = NULL; PKCS12 *pkcs = NULL; BIO *mem = NULL; STACK_OF(X509) *certs = NULL; Settings::KeyPair kp; int ret = 0; mem = BIO_new_mem_buf(data.data(), data.size()); Q_UNUSED(BIO_set_close(mem, BIO_NOCLOSE)); pkcs = d2i_PKCS12_bio(mem, NULL); if (pkcs) { ret = PKCS12_parse(pkcs, NULL, &pkey, &x509, &certs); if (pkcs && !pkey && !x509 && ! pw.isEmpty()) { if (certs) { if (ret) sk_X509_free(certs); certs = NULL; } ret = PKCS12_parse(pkcs, pw.toUtf8().constData(), &pkey, &x509, &certs); } if (pkey && x509 && X509_check_private_key(x509, pkey)) { unsigned char *dptr; QByteArray key, crt; key.resize(i2d_PrivateKey(pkey, NULL)); dptr=reinterpret_cast(key.data()); i2d_PrivateKey(pkey, &dptr); crt.resize(i2d_X509(x509, NULL)); dptr=reinterpret_cast(crt.data()); i2d_X509(x509, &dptr); QSslCertificate qscCert = QSslCertificate(crt, QSsl::Der); QSslKey qskKey = QSslKey(key, QSsl::Rsa, QSsl::Der); QList qlCerts; qlCerts << qscCert; if (certs) { for (int i=0;i(crt.data()); i2d_X509(c, &dptr); QSslCertificate cert = QSslCertificate(crt, QSsl::Der); qlCerts << cert; } } bool valid = ! qskKey.isNull(); foreach(const QSslCertificate &cert, qlCerts) valid = valid && ! cert.isNull(); if (valid) kp = Settings::KeyPair(qlCerts, qskKey); } } if (ret) { if (pkey) EVP_PKEY_free(pkey); if (x509) X509_free(x509); if (certs) sk_X509_free(certs); } if (pkcs) PKCS12_free(pkcs); if (mem) BIO_free(mem); return kp; } QByteArray CertWizard::exportCert(const Settings::KeyPair &kp) { X509 *x509 = NULL; EVP_PKEY *pkey = NULL; PKCS12 *pkcs = NULL; BIO *mem = NULL; STACK_OF(X509) *certs = sk_X509_new_null(); const unsigned char *p; char *data = NULL; if (kp.first.isEmpty()) return QByteArray(); QByteArray crt = kp.first.at(0).toDer(); QByteArray key = kp.second.toDer(); QByteArray qba; p = reinterpret_cast(key.constData()); pkey = d2i_AutoPrivateKey(NULL, &p, key.length()); if (pkey) { p = reinterpret_cast(crt.constData()); x509 = d2i_X509(NULL, &p, crt.length()); if (x509 && X509_check_private_key(x509, pkey)) { X509_keyid_set1(x509, NULL, 0); X509_alias_set1(x509, NULL, 0); QList qlCerts = kp.first; qlCerts.removeFirst(); foreach(const QSslCertificate &cert, qlCerts) { X509 *c = NULL; crt = cert.toDer(); p = reinterpret_cast(crt.constData()); c = d2i_X509(NULL, &p, crt.length()); if (c) sk_X509_push(certs, c); } pkcs = PKCS12_create(SSL_STRING(""), SSL_STRING("Mumble Identity"), pkey, x509, certs, -1, -1, 0, 0, 0); if (pkcs) { long size; mem = BIO_new(BIO_s_mem()); i2d_PKCS12_bio(mem, pkcs); Q_UNUSED(BIO_flush(mem)); size = BIO_get_mem_data(mem, &data); qba = QByteArray(data, static_cast(size)); } } } if (pkey) EVP_PKEY_free(pkey); if (x509) X509_free(x509); if (pkcs) PKCS12_free(pkcs); if (mem) BIO_free(mem); if (certs) sk_X509_free(certs); return qba; } mumble-1.3.4/src/mumble/DBus.h0000664000175000017500000000174414010707273015725 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_DBUS_H_ #define MUMBLE_MUMBLE_DBUS_H_ #include class QDBusMessage; class MumbleDBus : public QDBusAbstractAdaptor { private: Q_OBJECT Q_CLASSINFO("D-Bus Interface", "net.sourceforge.mumble.Mumble") Q_DISABLE_COPY(MumbleDBus) Q_PROPERTY(bool mute READ isSelfMuted WRITE setSelfMuted) Q_PROPERTY(bool deaf READ isSelfDeaf WRITE setSelfDeaf) public: MumbleDBus(QObject *parent); public slots: void openUrl(const QString &url, const QDBusMessage &); void getCurrentUrl(const QDBusMessage &); void getTalkingUsers(const QDBusMessage &); void focus(); void setSelfMuted(bool mute); void setSelfDeaf(bool deafen); bool isSelfMuted(); bool isSelfDeaf(); }; #endif mumble-1.3.4/src/mumble/Database.h0000664000175000017500000000512214010707273016566 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_DATABASE_H_ #define MUMBLE_MUMBLE_DATABASE_H_ #include #include "Settings.h" #include "UnresolvedServerAddress.h" struct FavoriteServer { QString qsName; QString qsUsername; QString qsPassword; QString qsHostname; QString qsUrl; unsigned short usPort; }; class Database : public QObject { private: Q_OBJECT Q_DISABLE_COPY(Database) QSqlDatabase db; public: Database(const QString &dbname); ~Database() Q_DECL_OVERRIDE; QList getFavorites(); void setFavorites(const QList &servers); void setPassword(const QString &host, unsigned short port, const QString &user, const QString &pw); bool fuzzyMatch(QString &name, QString &user, QString &pw, QString &host, unsigned short port); bool isLocalIgnored(const QString &hash); void setLocalIgnored(const QString &hash, bool ignored); bool isLocalMuted(const QString &hash); void setLocalMuted(const QString &hash, bool muted); float getUserLocalVolume(const QString &hash); void setUserLocalVolume(const QString &hash, float volume); bool isChannelFiltered(const QByteArray &server_cert_digest, const int channel_id); void setChannelFiltered(const QByteArray &server_cert_digest, const int channel_id, bool hidden); QMap getPingCache(); void setPingCache(const QMap &cache); bool seenComment(const QString &hash, const QByteArray &commenthash); void setSeenComment(const QString &hash, const QByteArray &commenthash); QByteArray blob(const QByteArray &hash); void setBlob(const QByteArray &hash, const QByteArray &blob); QStringList getTokens(const QByteArray &digest); void setTokens(const QByteArray &digest, QStringList &tokens); QList getShortcuts(const QByteArray &digest); bool setShortcuts(const QByteArray &digest, QList &shortcuts); void addFriend(const QString &name, const QString &hash); void removeFriend(const QString &hash); const QString getFriend(const QString &hash); const QMap getFriends(); const QString getDigest(const QString &hostname, unsigned short port); void setDigest(const QString &hostname, unsigned short port, const QString &digest); bool getUdp(const QByteArray &digest); void setUdp(const QByteArray &digest, bool udp); }; #endif mumble-1.3.4/src/mumble/GlobalShortcut.cpp0000664000175000017500000006666114010707273020370 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "GlobalShortcut.h" #include "AudioInput.h" #include "ClientUser.h" #include "Channel.h" #include "Database.h" #include "MainWindow.h" // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" /** * Used to save the global, unique, platform specific GlobalShortcutEngine. */ GlobalShortcutEngine *GlobalShortcutEngine::engine = NULL; static ConfigWidget *GlobalShortcutConfigDialogNew(Settings &st) { return new GlobalShortcutConfig(st); } static ConfigRegistrar registrar(1200, GlobalShortcutConfigDialogNew); static const QString UPARROW = QString::fromUtf8("\xE2\x86\x91 "); ShortcutKeyWidget::ShortcutKeyWidget(QWidget *p) : QLineEdit(p) { setReadOnly(true); clearFocus(); bModified = false; displayKeys(); } QList ShortcutKeyWidget::getShortcut() const { return qlButtons; } void ShortcutKeyWidget::setShortcut(const QList &buttons) { qlButtons = buttons; displayKeys(); } void ShortcutKeyWidget::focusInEvent(QFocusEvent *) { setText(tr("Press Shortcut")); QPalette pal=parentWidget()->palette(); pal.setColor(QPalette::Base, pal.color(QPalette::Base).dark(120)); setPalette(pal); setForegroundRole(QPalette::Button); GlobalShortcutEngine::engine->resetMap(); connect(GlobalShortcutEngine::engine, SIGNAL(buttonPressed(bool)), this, SLOT(updateKeys(bool))); installEventFilter(this); } void ShortcutKeyWidget::focusOutEvent(QFocusEvent *e) { if ((e->reason() == Qt::TabFocusReason) || (e->reason() == Qt::BacktabFocusReason)) return; setPalette(parentWidget()->palette()); clearFocus(); disconnect(GlobalShortcutEngine::engine, SIGNAL(buttonPressed(bool)), this, SLOT(updateKeys(bool))); displayKeys(); removeEventFilter(this); } bool ShortcutKeyWidget::eventFilter(QObject *, QEvent *evt) { if ((evt->type() == QEvent::KeyPress) || (evt->type() == QEvent::MouseButtonPress)) return true; return false; } void ShortcutKeyWidget::mouseDoubleClickEvent(QMouseEvent *) { bModified = true; qlButtons.clear(); clearFocus(); displayKeys(); } void ShortcutKeyWidget::updateKeys(bool last) { qlButtons = GlobalShortcutEngine::engine->qlActiveButtons; bModified = true; if (qlButtons.isEmpty()) return; if (last) clearFocus(); else displayKeys(false); } void ShortcutKeyWidget::displayKeys(bool last) { QStringList keys; foreach(QVariant button, qlButtons) { QString id = GlobalShortcutEngine::engine->buttonName(button); if (! id.isEmpty()) keys << id; } setText(keys.join(QLatin1String(" + "))); emit keySet(keys.count() > 0, last); } ShortcutActionWidget::ShortcutActionWidget(QWidget *p) : MUComboBox(p) { int idx = 0; insertItem(idx, tr("Unassigned")); setItemData(idx, -1); #ifndef Q_OS_MAC setSizeAdjustPolicy(AdjustToContents); #endif idx++; foreach(GlobalShortcut *gs, GlobalShortcutEngine::engine->qmShortcuts) { insertItem(idx, gs->name); setItemData(idx, gs->idx); if (! gs->qsToolTip.isEmpty()) setItemData(idx, gs->qsToolTip, Qt::ToolTipRole); if (! gs->qsWhatsThis.isEmpty()) setItemData(idx, gs->qsWhatsThis, Qt::WhatsThisRole); idx++; } } void ShortcutActionWidget::setIndex(int idx) { setCurrentIndex(findData(idx)); } unsigned int ShortcutActionWidget::index() const { return itemData(currentIndex()).toUInt(); } ShortcutToggleWidget::ShortcutToggleWidget(QWidget *p) : MUComboBox(p) { int idx = 0; insertItem(idx, tr("Off")); setItemData(idx, -1); idx++; insertItem(idx, tr("Toggle")); setItemData(idx, 0); idx++; insertItem(idx, tr("On")); setItemData(idx, 1); idx++; } void ShortcutToggleWidget::setIndex(int idx) { setCurrentIndex(findData(idx)); } int ShortcutToggleWidget::index() const { return itemData(currentIndex()).toInt(); } void iterateChannelChildren(QTreeWidgetItem *root, Channel *chan, QMap &map) { foreach(Channel *c, chan->qlChannels) { QTreeWidgetItem *sub = new QTreeWidgetItem(root, QStringList(c->qsName)); sub->setData(0, Qt::UserRole, c->iId); map.insert(c->iId, sub); iterateChannelChildren(sub, c, map); } } ShortcutTargetDialog::ShortcutTargetDialog(const ShortcutTarget &st, QWidget *pw) : QDialog(pw) { stTarget = st; setupUi(this); // Load current shortcut configuration qcbForceCenter->setChecked(st.bForceCenter); qgbModifiers->setVisible(true); if (st.bUsers) { qrbUsers->setChecked(true); qswStack->setCurrentWidget(qwUserPage); } else { qrbChannel->setChecked(true); qswStack->setCurrentWidget(qwChannelPage); } qcbLinks->setChecked(st.bLinks); qcbChildren->setChecked(st.bChildren); // Insert all known friends into the possible targets list const QMap &friends = g.db->getFriends(); if (! friends.isEmpty()) { QMap::const_iterator i; for (i = friends.constBegin(); i != friends.constEnd(); ++i) { qcbUser->addItem(i.key(), i.value()); qmHashNames.insert(i.value(), i.key()); } qcbUser->insertSeparator(qcbUser->count()); } // If we are connected to a server also add all connected players with certificates to the list if (g.uiSession) { QMap others; QMap::const_iterator i; QReadLocker lock(& ClientUser::c_qrwlUsers); foreach(ClientUser *p, ClientUser::c_qmUsers) { if ((p->uiSession != g.uiSession) && p->qsFriendName.isEmpty() && ! p->qsHash.isEmpty()) { others.insert(p->qsName, p->qsHash); qmHashNames.insert(p->qsHash, p->qsName); } } for (i = others.constBegin(); i != others.constEnd(); ++i) { qcbUser->addItem(i.key(), i.value()); } } QMap users; foreach(const QString &hash, st.qlUsers) { if (qmHashNames.contains(hash)) users.insert(qmHashNames.value(hash), hash); else users.insert(QString::fromLatin1("#%1").arg(hash), hash); } { QMap::const_iterator i; for (i=users.constBegin(); i != users.constEnd(); ++i) { QListWidgetItem *itm = new QListWidgetItem(i.key()); itm->setData(Qt::UserRole, i.value()); qlwUsers->addItem(itm); } } // Now generate the tree of possible channel targets, first add the default ones QMap qmTree; QTreeWidgetItem *root = new QTreeWidgetItem(qtwChannels, QStringList(tr("Root"))); root->setData(0, Qt::UserRole, SHORTCUT_TARGET_ROOT); root->setExpanded(true); qmTree.insert(-1, root); QTreeWidgetItem *parent_item = new QTreeWidgetItem(root, QStringList(tr("Parent"))); parent_item->setData(0, Qt::UserRole, SHORTCUT_TARGET_PARENT); parent_item->setExpanded(true); qmTree.insert(-2, parent_item); QTreeWidgetItem *current = new QTreeWidgetItem(parent_item, QStringList(tr("Current"))); current->setData(0, Qt::UserRole, SHORTCUT_TARGET_CURRENT); qmTree.insert(-3, current); for (int i = 0; i < 8; ++i) { QTreeWidgetItem *sub = new QTreeWidgetItem(current, QStringList(tr("Subchannel #%1").arg(i+1))); sub->setData(0, Qt::UserRole, SHORTCUT_TARGET_SUBCHANNEL - i); qmTree.insert(SHORTCUT_TARGET_SUBCHANNEL - i, sub); } for (int i = 0; i < 8; ++i) { QTreeWidgetItem *psub = new QTreeWidgetItem(parent_item, QStringList(UPARROW + tr("Subchannel #%1").arg(i+1))); psub->setData(0, Qt::UserRole, SHORTCUT_TARGET_PARENT_SUBCHANNEL - i); qmTree.insert(SHORTCUT_TARGET_PARENT_SUBCHANNEL - i, psub); } // And if we are connected add the channels on the current server if (g.uiSession) { Channel *c = Channel::get(0); QTreeWidgetItem *sroot = new QTreeWidgetItem(qtwChannels, QStringList(c->qsName)); qmTree.insert(0, sroot); iterateChannelChildren(sroot, c, qmTree); } qtwChannels->sortByColumn(0, Qt::AscendingOrder); QTreeWidgetItem *qtwi; if (g.uiSession) { qtwi = qmTree.value(ClientUser::get(g.uiSession)->cChannel->iId); if (qtwi) qtwChannels->scrollToItem(qtwi); } qtwi = qmTree.value(st.iChannel); if (qtwi) { qtwChannels->scrollToItem(qtwi); qtwChannels->setCurrentItem(qtwi); } qleGroup->setText(stTarget.qsGroup); } ShortcutTarget ShortcutTargetDialog::target() const { return stTarget; } void ShortcutTargetDialog::accept() { stTarget.bLinks = qcbLinks->isChecked(); stTarget.bChildren = qcbChildren->isChecked(); stTarget.bForceCenter = qcbForceCenter->isChecked(); stTarget.qlUsers.clear(); QList ql = qlwUsers->findItems(QString(), Qt::MatchStartsWith); foreach(QListWidgetItem *itm, ql) { stTarget.qlUsers << itm->data(Qt::UserRole).toString(); } QTreeWidgetItem *qtwi = qtwChannels->currentItem(); if (qtwi) { stTarget.iChannel = qtwi->data(0, Qt::UserRole).toInt(); stTarget.qsGroup = qleGroup->text().trimmed(); } QDialog::accept(); } void ShortcutTargetDialog::on_qrbUsers_clicked() { stTarget.bUsers = true; qswStack->setCurrentWidget(qwUserPage); } void ShortcutTargetDialog::on_qrbChannel_clicked() { stTarget.bUsers = false; qswStack->setCurrentWidget(qwChannelPage); } void ShortcutTargetDialog::on_qpbAdd_clicked() { if (qcbUser->currentIndex() < 0) return; QListWidgetItem *itm = new QListWidgetItem(qcbUser->currentText()); itm->setData(Qt::UserRole, qcbUser->itemData(qcbUser->currentIndex())); qlwUsers->addItem(itm); } void ShortcutTargetDialog::on_qpbRemove_clicked() { QListWidgetItem *itm = qlwUsers->currentItem(); delete itm; } ShortcutTargetWidget::ShortcutTargetWidget(QWidget *p) : QFrame(p) { qleTarget = new QLineEdit(); qleTarget->setReadOnly(true); qtbEdit = new QToolButton(); qtbEdit->setText(tr("...")); qtbEdit->setFocusPolicy(Qt::ClickFocus); qtbEdit->setObjectName(QLatin1String("qtbEdit")); QHBoxLayout *l = new QHBoxLayout(this); l->setContentsMargins(0,0,0,0); l->addWidget(qleTarget, 1); l->addWidget(qtbEdit); QMetaObject::connectSlotsByName(this); } /** * This function returns a textual representation of the given shortcut target st. */ QString ShortcutTargetWidget::targetString(const ShortcutTarget &st) { if (st.bUsers) { if (! st.qlUsers.isEmpty()) { QMap hashes; QReadLocker lock(& ClientUser::c_qrwlUsers); foreach(ClientUser *p, ClientUser::c_qmUsers) { if (! p->qsHash.isEmpty()) { hashes.insert(p->qsHash, p->qsName); } } QStringList users; foreach(const QString &hash, st.qlUsers) { QString name; if (hashes.contains(hash)) { name = hashes.value(hash); } else { name = g.db->getFriend(hash); if (name.isEmpty()) name = QString::fromLatin1("#%1").arg(hash); } users << name; } users.sort(); return users.join(tr(", ")); } } else { if (st.iChannel < 0) { switch (st.iChannel) { case SHORTCUT_TARGET_ROOT: return tr("Root"); case SHORTCUT_TARGET_PARENT: return tr("Parent"); case SHORTCUT_TARGET_CURRENT: return tr("Current"); default: if(st.iChannel <= SHORTCUT_TARGET_PARENT_SUBCHANNEL) return (UPARROW + tr("Subchannel #%1").arg(SHORTCUT_TARGET_PARENT_SUBCHANNEL + 1 - st.iChannel)); else return tr("Subchannel #%1").arg(SHORTCUT_TARGET_CURRENT - st.iChannel); } } else { Channel *c = Channel::get(st.iChannel); if (c) return c->qsName; else return tr("Invalid"); } } return tr("Empty"); } ShortcutTarget ShortcutTargetWidget::target() const { return stTarget; } void ShortcutTargetWidget::setTarget(const ShortcutTarget &st) { stTarget = st; qleTarget->setText(ShortcutTargetWidget::targetString(st)); } void ShortcutTargetWidget::on_qtbEdit_clicked() { ShortcutTargetDialog *std = new ShortcutTargetDialog(stTarget, this); if (std->exec() == QDialog::Accepted) { stTarget = std->target(); qleTarget->setText(ShortcutTargetWidget::targetString(stTarget)); // Qt bug? Who knows, but since there won't be focusOut events for this widget anymore, // we need to force the commit. QWidget *p = parentWidget(); while (p) { if (QAbstractItemView *qaiv = qobject_cast(p)) { QStyledItemDelegate *qsid = qobject_cast(qaiv->itemDelegate()); if (qsid) { QMetaObject::invokeMethod(qsid, "_q_commitDataAndCloseEditor", Qt::QueuedConnection, Q_ARG(QWidget*, this)); } break; } p = p->parentWidget(); } } delete std; } ShortcutDelegate::ShortcutDelegate(QObject *p) : QStyledItemDelegate(p) { QItemEditorFactory *factory = new QItemEditorFactory; factory->registerEditor(QVariant::List, new QStandardItemEditorCreator()); factory->registerEditor(QVariant::UInt, new QStandardItemEditorCreator()); factory->registerEditor(QVariant::Int, new QStandardItemEditorCreator()); factory->registerEditor(static_cast(QVariant::fromValue(ShortcutTarget()).userType()), new QStandardItemEditorCreator()); factory->registerEditor(QVariant::String, new QStandardItemEditorCreator()); factory->registerEditor(QVariant::Invalid, new QStandardItemEditorCreator()); setItemEditorFactory(factory); } ShortcutDelegate::~ShortcutDelegate() { delete itemEditorFactory(); setItemEditorFactory(NULL); } /** * Provides textual representations for the mappings done for the edit behaviour. */ QString ShortcutDelegate::displayText(const QVariant &item, const QLocale &loc) const { if (item.type() == QVariant::List) { return GlobalShortcutEngine::buttonText(item.toList()); } else if (item.type() == QVariant::Int) { int v = item.toInt(); if (v > 0) return tr("On"); else if (v < 0) return tr("Off"); else return tr("Toggle"); } else if (item.type() == QVariant::UInt) { GlobalShortcut *gs = GlobalShortcutEngine::engine->qmShortcuts.value(item.toInt()); if (gs) return gs->name; else return tr("Unassigned"); } else if (item.userType() == QVariant::fromValue(ShortcutTarget()).userType()) { return ShortcutTargetWidget::targetString(item.value()); } qWarning("ShortcutDelegate::displayText Unknown type %d", item.type()); return QStyledItemDelegate::displayText(item,loc); } GlobalShortcutConfig::GlobalShortcutConfig(Settings &st) : ConfigWidget(st) { setupUi(this); installEventFilter(this); bool canSuppress = GlobalShortcutEngine::engine->canSuppress(); bool canDisable = GlobalShortcutEngine::engine->canDisable(); qwWarningContainer->setVisible(false); #ifdef Q_OS_WIN qgbWindowsShortcutEngines->setVisible(true); #else qgbWindowsShortcutEngines->setVisible(false); #endif qtwShortcuts->setColumnCount(canSuppress ? 4 : 3); qtwShortcuts->setItemDelegate(new ShortcutDelegate(qtwShortcuts)); #if QT_VERSION >= 0x050000 qtwShortcuts->header()->setSectionResizeMode(0, QHeaderView::Fixed); qtwShortcuts->header()->resizeSection(0, 150); qtwShortcuts->header()->setSectionResizeMode(2, QHeaderView::Stretch); if (canSuppress) qtwShortcuts->header()->setSectionResizeMode(3, QHeaderView::ResizeToContents); #else qtwShortcuts->header()->setResizeMode(0, QHeaderView::Fixed); qtwShortcuts->header()->resizeSection(0, 150); qtwShortcuts->header()->setResizeMode(2, QHeaderView::Stretch); if (canSuppress) qtwShortcuts->header()->setResizeMode(3, QHeaderView::ResizeToContents); #endif qcbEnableGlobalShortcuts->setVisible(canDisable); #ifdef Q_OS_MAC // Help Mac users enable accessibility access for Mumble... if (QSysInfo::MacintoshVersion >= QSysInfo::MV_MAVERICKS) { qpbOpenAccessibilityPrefs->setHidden(true); label->setText(tr( "" "

" "Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts." "

" "

" "If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section " "of your Mac's System Preferences." "

" "

" "In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in " "the list to the left. Finally, add Mumble to the list of trusted accessibility programs." "" )); } #endif } bool GlobalShortcutConfig::eventFilter(QObject* /*object*/, QEvent *e) { #ifdef Q_OS_MAC if (e->type() == QEvent::WindowActivate) { if (! g.s.bSuppressMacEventTapWarning) { qwWarningContainer->setVisible(showWarning()); } } #else Q_UNUSED(e) #endif return false; } bool GlobalShortcutConfig::showWarning() const { #ifdef Q_OS_MAC # if MAC_OS_X_VERSION_MAX_ALLOWED >= 1090 if (QSysInfo::MacintoshVersion >= QSysInfo::MV_MAVERICKS) { return !AXIsProcessTrustedWithOptions(NULL); } else # endif { return !QFile::exists(QLatin1String("/private/var/db/.AccessibilityAPIEnabled")); } #endif return false; } void GlobalShortcutConfig::on_qpbOpenAccessibilityPrefs_clicked() { QStringList args; args << QLatin1String("/Applications/System Preferences.app"); args << QLatin1String("/System/Library/PreferencePanes/UniversalAccessPref.prefPane"); (void) QProcess::startDetached(QLatin1String("/usr/bin/open"), args); } void GlobalShortcutConfig::on_qpbSkipWarning_clicked() { // Store to both global and local settings. The 'Skip' is live, as in // we don't expect the user to click Apply for their choice to work. g.s.bSuppressMacEventTapWarning = s.bSuppressMacEventTapWarning = true; qwWarningContainer->setVisible(false); } void GlobalShortcutConfig::commit() { qtwShortcuts->closePersistentEditor(qtwShortcuts->currentItem(), qtwShortcuts->currentColumn()); } void GlobalShortcutConfig::on_qcbEnableGlobalShortcuts_stateChanged(int state) { bool b = state == Qt::Checked; qpbAdd->setEnabled(b); if (!b) qpbRemove->setEnabled(false); else qpbRemove->setEnabled(qtwShortcuts->currentItem() ? true : false); qtwShortcuts->setEnabled(b); // We have to enable this here. Otherwise, adding new shortcuts wouldn't work. GlobalShortcutEngine::engine->setEnabled(b); } void GlobalShortcutConfig::on_qpbAdd_clicked(bool) { commit(); Shortcut sc; sc.iIndex = -1; sc.bSuppress = false; qlShortcuts << sc; reload(); } void GlobalShortcutConfig::on_qpbRemove_clicked(bool) { commit(); QTreeWidgetItem *qtwi = qtwShortcuts->currentItem(); if (! qtwi) return; int idx = qtwShortcuts->indexOfTopLevelItem(qtwi); delete qtwi; qlShortcuts.removeAt(idx); } void GlobalShortcutConfig::on_qtwShortcuts_currentItemChanged(QTreeWidgetItem *item, QTreeWidgetItem *) { qpbRemove->setEnabled(item ? true : false); } void GlobalShortcutConfig::on_qtwShortcuts_itemChanged(QTreeWidgetItem *item, int) { int idx = qtwShortcuts->indexOfTopLevelItem(item); Shortcut &sc = qlShortcuts[idx]; sc.iIndex = item->data(0, Qt::DisplayRole).toInt(); sc.qvData = item->data(1, Qt::DisplayRole); sc.qlButtons = item->data(2, Qt::DisplayRole).toList(); sc.bSuppress = item->checkState(3) == Qt::Checked; const ::GlobalShortcut *gs = GlobalShortcutEngine::engine->qmShortcuts.value(sc.iIndex); if (gs && sc.qvData.type() != gs->qvDefault.type()) { item->setData(1, Qt::DisplayRole, gs->qvDefault); } } QString GlobalShortcutConfig::title() const { return tr("Shortcuts"); } QIcon GlobalShortcutConfig::icon() const { return QIcon(QLatin1String("skin:config_shortcuts.png")); } void GlobalShortcutConfig::load(const Settings &r) { qlShortcuts = r.qlShortcuts; // The 'Skip' button is supposed to be live, meaning users do not need to click Apply for // their choice of skipping to apply. // // To make this work well, we set the setting on load. This is to make 'Reset' and 'Restore Defaults' // work as expected. g.s.bSuppressMacEventTapWarning = s.bSuppressMacEventTapWarning = r.bSuppressMacEventTapWarning; if (! g.s.bSuppressMacEventTapWarning) { qwWarningContainer->setVisible(showWarning()); } qcbEnableUIAccess->setChecked(r.bEnableUIAccess); qcbEnableWinHooks->setChecked(r.bEnableWinHooks); qcbEnableGKey->setChecked(r.bEnableGKey); qcbEnableXboxInput->setChecked(r.bEnableXboxInput); qcbEnableGlobalShortcuts->setCheckState(r.bShortcutEnable ? Qt::Checked : Qt::Unchecked); on_qcbEnableGlobalShortcuts_stateChanged(qcbEnableGlobalShortcuts->checkState()); reload(); } void GlobalShortcutConfig::save() const { s.qlShortcuts = qlShortcuts; s.bShortcutEnable = qcbEnableGlobalShortcuts->checkState() == Qt::Checked; bool oldUIAccess = s.bEnableUIAccess; s.bEnableUIAccess = qcbEnableUIAccess->checkState() == Qt::Checked; bool oldWinHooks = s.bEnableWinHooks; s.bEnableWinHooks = qcbEnableWinHooks->checkState() == Qt::Checked; bool oldGKey = s.bEnableGKey; s.bEnableGKey = qcbEnableGKey->checkState() == Qt::Checked; bool oldXboxInput = s.bEnableXboxInput; s.bEnableXboxInput = qcbEnableXboxInput->checkState() == Qt::Checked; if (s.bEnableUIAccess != oldUIAccess || s.bEnableWinHooks != oldWinHooks || s.bEnableGKey != oldGKey || s.bEnableXboxInput != oldXboxInput) { s.requireRestartToApply = true; } } QTreeWidgetItem *GlobalShortcutConfig::itemForShortcut(const Shortcut &sc) const { QTreeWidgetItem *item = new QTreeWidgetItem(); ::GlobalShortcut *gs = GlobalShortcutEngine::engine->qmShortcuts.value(sc.iIndex); item->setData(0, Qt::DisplayRole, static_cast(sc.iIndex)); if (sc.qvData.isValid() && gs && (sc.qvData.type() == gs->qvDefault.type())) item->setData(1, Qt::DisplayRole, sc.qvData); else if (gs) item->setData(1, Qt::DisplayRole, gs->qvDefault); item->setData(2, Qt::DisplayRole, sc.qlButtons); item->setCheckState(3, sc.bSuppress ? Qt::Checked : Qt::Unchecked); item->setFlags(item->flags() | Qt::ItemIsEditable); if (gs) { if (! gs->qsToolTip.isEmpty()) item->setData(0, Qt::ToolTipRole, gs->qsToolTip); if (! gs->qsWhatsThis.isEmpty()) item->setData(0, Qt::WhatsThisRole, gs->qsWhatsThis); } item->setData(2, Qt::ToolTipRole, tr("Shortcut button combination.")); item->setData(2, Qt::WhatsThisRole, tr("This is the global shortcut key combination.
" "Click this field and then press the desired key/button combo " "to rebind. Double-click to clear.")); item->setData(3, Qt::ToolTipRole, tr("Suppress keys from other applications")); item->setData(3, Qt::WhatsThisRole, tr("This hides the button presses from other applications.
" "Enabling this will hide the button (or the last button of a multi-button combo) " "from other applications. Note that not all buttons can be suppressed.")); return item; } void GlobalShortcutConfig::reload() { qStableSort(qlShortcuts); qtwShortcuts->clear(); foreach(const Shortcut &sc, qlShortcuts) { QTreeWidgetItem *item = itemForShortcut(sc); qtwShortcuts->addTopLevelItem(item); } #ifdef Q_OS_MAC if (! g.s.bSuppressMacEventTapWarning) { qwWarningContainer->setVisible(showWarning()); } else { qwWarningContainer->setVisible(false); } #endif } void GlobalShortcutConfig::accept() const { GlobalShortcutEngine::engine->bNeedRemap = true; GlobalShortcutEngine::engine->needRemap(); GlobalShortcutEngine::engine->setEnabled(g.s.bShortcutEnable); } GlobalShortcutEngine::GlobalShortcutEngine(QObject *p) : QThread(p) { bNeedRemap = true; needRemap(); } GlobalShortcutEngine::~GlobalShortcutEngine() { QSet qs; foreach(const QList &ql, qlShortcutList) qs += ql.toSet(); foreach(ShortcutKey *sk, qs) delete sk; } void GlobalShortcutEngine::remap() { bNeedRemap = false; QSet qs; foreach(const QList &ql, qlShortcutList) qs += ql.toSet(); foreach(ShortcutKey *sk, qs) delete sk; qlButtonList.clear(); qlShortcutList.clear(); qlDownButtons.clear(); foreach(const Shortcut &sc, g.s.qlShortcuts) { GlobalShortcut *gs = qmShortcuts.value(sc.iIndex); if (gs && ! sc.qlButtons.isEmpty()) { ShortcutKey *sk = new ShortcutKey; sk->s = sc; sk->iNumUp = sc.qlButtons.count(); sk->gs = gs; foreach(const QVariant &button, sc.qlButtons) { int idx = qlButtonList.indexOf(button); if (idx == -1) { qlButtonList << button; qlShortcutList << QList(); idx = qlButtonList.count() - 1; } qlShortcutList[idx] << sk; } } } } void GlobalShortcutEngine::run() { } bool GlobalShortcutEngine::canSuppress() { return false; } void GlobalShortcutEngine::setEnabled(bool) { } bool GlobalShortcutEngine::enabled() { return true; } bool GlobalShortcutEngine::canDisable() { return false; } void GlobalShortcutEngine::resetMap() { tReset.restart(); qlActiveButtons.clear(); } void GlobalShortcutEngine::needRemap() { } /** * This function gets called internally to update the state * of a button. * * @return True if button is suppressed, otherwise false */ bool GlobalShortcutEngine::handleButton(const QVariant &button, bool down) { bool already = qlDownButtons.contains(button); if (already == down) return qlSuppressed.contains(button); if (down) qlDownButtons << button; else qlDownButtons.removeAll(button); if (tReset.elapsed() > 100000) { if (down) { qlActiveButtons.removeAll(button); qlActiveButtons << button; } emit buttonPressed(! down); } if (down) { AudioInputPtr ai = g.ai; if (ai.get()) { // XXX: This is a data race: we write to ai->activityState // (accessed by the AudioInput thread) from the main thread. if (ai->activityState == AudioInput::ActivityStateIdle) { ai->activityState = AudioInput::ActivityStateReturnedFromIdle; } ai->tIdle.restart(); } } int idx = qlButtonList.indexOf(button); if (idx == -1) return false; bool suppress = false; foreach(ShortcutKey *sk, qlShortcutList.at(idx)) { if (down) { sk->iNumUp--; if (sk->iNumUp == 0) { GlobalShortcut *gs = sk->gs; if (sk->s.bSuppress) { suppress = true; qlSuppressed << button; } if (! gs->qlActive.contains(sk->s.qvData)) { gs->qlActive << sk->s.qvData; emit gs->triggered(true, sk->s.qvData); emit gs->down(sk->s.qvData); } } else if (sk->iNumUp < 0) { sk->iNumUp = 0; } } else { if (qlSuppressed.contains(button)) { suppress = true; qlSuppressed.removeAll(button); } sk->iNumUp++; if (sk->iNumUp == 1) { GlobalShortcut *gs = sk->gs; if (gs->qlActive.contains(sk->s.qvData)) { gs->qlActive.removeAll(sk->s.qvData); emit gs->triggered(false, sk->s.qvData); } } else if (sk->iNumUp > sk->s.qlButtons.count()) { sk->iNumUp = sk->s.qlButtons.count(); } } } return suppress; } void GlobalShortcutEngine::add(GlobalShortcut *gs) { if (! GlobalShortcutEngine::engine) { GlobalShortcutEngine::engine = GlobalShortcutEngine::platformInit(); GlobalShortcutEngine::engine->setEnabled(g.s.bShortcutEnable); } GlobalShortcutEngine::engine->qmShortcuts.insert(gs->idx, gs); GlobalShortcutEngine::engine->bNeedRemap = true; GlobalShortcutEngine::engine->needRemap(); } void GlobalShortcutEngine::remove(GlobalShortcut *gs) { engine->qmShortcuts.remove(gs->idx); engine->bNeedRemap = true; engine->needRemap(); if (engine->qmShortcuts.isEmpty()) { delete engine; GlobalShortcutEngine::engine = NULL; } } QString GlobalShortcutEngine::buttonText(const QList &list) { QStringList keys; foreach(QVariant button, list) { QString id = GlobalShortcutEngine::engine->buttonName(button); if (! id.isEmpty()) keys << id; } return keys.join(QLatin1String(" + ")); } GlobalShortcut::GlobalShortcut(QObject *p, int index, QString qsName, QVariant def) : QObject(p) { idx = index; name=qsName; qvDefault = def; GlobalShortcutEngine::add(this); } GlobalShortcut::~GlobalShortcut() { GlobalShortcutEngine::remove(this); } mumble-1.3.4/src/mumble/AudioOutputSpeech.h0000664000175000017500000000335114010707273020476 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_AUDIOOUTPUTSPEECH_H_ #define MUMBLE_MUMBLE_AUDIOOUTPUTSPEECH_H_ #include #include #include #include #include #include #include "AudioOutputUser.h" #include "Message.h" class CELTCodec; class OpusCodec; class ClientUser; struct OpusDecoder; class AudioOutputSpeech : public AudioOutputUser { private: Q_OBJECT Q_DISABLE_COPY(AudioOutputSpeech) protected: unsigned int iAudioBufferSize; unsigned int iBufferOffset; unsigned int iBufferFilled; unsigned int iOutputSize; unsigned int iLastConsume; unsigned int iFrameSize; unsigned int iSampleRate; unsigned int iMixerFreq; bool bLastAlive; bool bHasTerminator; bool bStereo; float *fFadeIn; float *fFadeOut; float *fResamplerBuffer; SpeexResamplerState *srs; QMutex qmJitter; JitterBuffer *jbJitter; int iMissCount; CELTCodec *cCodec; CELTDecoder *cdDecoder; OpusCodec *oCodec; OpusDecoder *opusState; SpeexBits sbBits; void *dsSpeex; QList qlFrames; unsigned char ucFlags; public: MessageHandler::UDPMessageType umtType; int iMissedFrames; ClientUser *p; virtual bool needSamples(unsigned int snum) Q_DECL_OVERRIDE; void addFrameToBuffer(const QByteArray &, unsigned int iBaseSeq); AudioOutputSpeech(ClientUser *, unsigned int freq, MessageHandler::UDPMessageType type); ~AudioOutputSpeech() Q_DECL_OVERRIDE; }; #endif // AUDIOOUTPUTSPEECH_H_ mumble-1.3.4/src/mumble/flags/0000775000175000017500000000000014010707274016006 5ustar builderbuildermumble-1.3.4/src/mumble/flags/mumble_flags_0.qrc0000664000175000017500000003720114010707274021374 0ustar builderbuilder ../../../icons/flags/jp.svg ../../../icons/flags/pw.svg ../../../icons/flags/ch.svg ../../../icons/flags/bd.svg ../../../icons/flags/vn.svg ../../../icons/flags/mc.svg ../../../icons/flags/so.svg ../../../icons/flags/ua.svg ../../../icons/flags/pl.svg ../../../icons/flags/id.svg ../../../icons/flags/lc.svg ../../../icons/flags/to.svg ../../../icons/flags/co.svg ../../../icons/flags/mg.svg ../../../icons/flags/bj.svg ../../../icons/flags/bf.svg ../../../icons/flags/at.svg ../../../icons/flags/cz.svg ../../../icons/flags/pe.svg ../../../icons/flags/ng.svg ../../../icons/flags/nl.svg ../../../icons/flags/am.svg ../../../icons/flags/bg.svg ../../../icons/flags/hu.svg ../../../icons/flags/lt.svg ../../../icons/flags/sl.svg ../../../icons/flags/ye.svg ../../../icons/flags/be.svg ../../../icons/flags/ee.svg ../../../icons/flags/lu.svg ../../../icons/flags/ci.svg ../../../icons/flags/cl.svg ../../../icons/flags/cp.svg ../../../icons/flags/gn.svg ../../../icons/flags/mf.svg ../../../icons/flags/ml.svg ../../../icons/flags/ro.svg ../../../icons/flags/td.svg ../../../icons/flags/tn.svg ../../../icons/flags/wf.svg ../../../icons/flags/mr.svg ../../../icons/flags/de.svg ../../../icons/flags/fr.svg ../../../icons/flags/ie.svg ../../../icons/flags/it.svg ../../../icons/flags/ga.svg ../../../icons/flags/bh.svg ../../../icons/flags/gl.svg ../../../icons/flags/ru.svg ../../../icons/flags/gf.svg ../../../icons/flags/ne.svg ../../../icons/flags/la.svg ../../../icons/flags/ma.svg ../../../icons/flags/ae.svg ../../../icons/flags/mu.svg ../../../icons/flags/gw.svg ../../../icons/flags/tr.svg ../../../icons/flags/cg.svg ../../../icons/flags/lv.svg ../../../icons/flags/dj.svg ../../../icons/flags/fm.svg ../../../icons/flags/cm.svg ../../../icons/flags/gh.svg ../../../icons/flags/mm.svg ../../../icons/flags/sn.svg ../../../icons/flags/bw.svg ../../../icons/flags/mv.svg ../../../icons/flags/tl.svg ../../../icons/flags/dk.svg ../../../icons/flags/fi.svg ../../../icons/flags/tw.svg ../../../icons/flags/th.svg ../../../icons/flags/bs.svg ../../../icons/flags/pk.svg ../../../icons/flags/se.svg ../../../icons/flags/vc.svg ../../../icons/flags/pa.svg ../../../icons/flags/ps.svg ../../../icons/flags/sd.svg ../../../icons/flags/cr.svg ../../../icons/flags/qa.svg ../../../icons/flags/kw.svg ../../../icons/flags/dz.svg ../../../icons/flags/cw.svg ../../../icons/flags/jo.svg ../../../icons/flags/cn.svg ../../../icons/flags/jm.svg ../../../icons/flags/sy.svg ../../../icons/flags/gm.svg ../../../icons/flags/gg.svg ../../../icons/flags/ag.svg ../../../icons/flags/nr.svg ../../../icons/flags/sc.svg ../../../icons/flags/ws.svg ../../../icons/flags/sr.svg ../../../icons/flags/tg.svg ../../../icons/flags/aw.svg ../../../icons/flags/kp.svg ../../../icons/flags/pr.svg ../../../icons/flags/cu.svg ../../../icons/flags/ly.svg ../../../icons/flags/cf.svg ../../../icons/flags/tt.svg ../../../icons/flags/re.svg ../../../icons/flags/tz.svg ../../../icons/flags/bb.svg ../../../icons/flags/st.svg ../../../icons/flags/ls.svg ../../../icons/flags/aq.svg ../../../icons/flags/az.svg ../../../icons/flags/eh.svg ../../../icons/flags/cd.svg ../../../icons/flags/ge.svg ../../../icons/flags/gy.svg ../../../icons/flags/ca.svg ../../../icons/flags/ss.svg ../../../icons/flags/bv.svg ../../../icons/flags/sj.svg ../../../icons/flags/fo.svg ../../../icons/flags/il.svg ../../../icons/flags/is.svg ../../../icons/flags/no.svg ../../../icons/flags/ax.svg ../../../icons/flags/ba.svg ../../../icons/flags/bq.svg ../../../icons/flags/hn.svg ../../../icons/flags/np.svg ../../../icons/flags/sg.svg ../../../icons/flags/kn.svg ../../../icons/flags/tk.svg ../../../icons/flags/mh.svg ../../../icons/flags/sk.svg ../../../icons/flags/sb.svg ../../../icons/flags/au.svg ../../../icons/flags/lr.svg ../../../icons/flags/rw.svg ../../../icons/flags/km.svg ../../../icons/flags/et.svg ../../../icons/flags/za.svg ../../../icons/flags/gr.svg ../../../icons/flags/om.svg ../../../icons/flags/gu.svg ../../../icons/flags/ve.svg ../../../icons/flags/na.svg ../../../icons/flags/mk.svg ../../../icons/flags/xk.svg ../../../icons/flags/br.svg ../../../icons/flags/ai.svg ../../../icons/flags/mo.svg ../../../icons/flags/eu.svg ../../../icons/flags/hm.svg ../../../icons/flags/lb.svg ../../../icons/flags/tf.svg ../../../icons/flags/bi.svg ../../../icons/flags/bn.svg ../../../icons/flags/tv.svg ../../../icons/flags/my.svg ../../../icons/flags/vu.svg ../../../icons/flags/cv.svg ../../../icons/flags/ug.svg ../../../icons/flags/nz.svg ../../../icons/flags/ao.svg ../../../icons/flags/ph.svg ../../../icons/flags/hk.svg ../../../icons/flags/gi.svg ../../../icons/flags/im.svg ../../../icons/flags/mn.svg ../../../icons/flags/nc.svg ../../../icons/flags/gd.svg ../../../icons/flags/si.svg ../../../icons/flags/ni.svg ../../../icons/flags/kr.svg ../../../icons/flags/ke.svg ../../../icons/flags/uz.svg ../../../icons/flags/iq.svg ../../../icons/flags/ck.svg ../../../icons/flags/tj.svg ../../../icons/flags/tm.svg ../../../icons/flags/ms.svg ../../../icons/flags/gb.svg ../../../icons/flags/mz.svg ../../../icons/flags/cx.svg ../../../icons/flags/pg.svg ../../../icons/flags/gq.svg ../../../icons/flags/dm.svg ../../../icons/flags/al.svg ../../../icons/flags/nu.svg ../../../icons/flags/sh.svg ../../../icons/flags/zw.svg ../../../icons/flags/lk.svg ../../../icons/flags/sz.svg ../../../icons/flags/um.svg ../../../icons/flags/us.svg ../../../icons/flags/cc.svg ../../../icons/flags/er.svg ../../../icons/flags/ki.svg ../../../icons/flags/eg.svg ../../../icons/flags/sx.svg ../../../icons/flags/in.svg ../../../icons/flags/uy.svg ../../../icons/flags/zm.svg ../../../icons/flags/li.svg ../../../icons/flags/bm.svg ../../../icons/flags/fk.svg ../../../icons/flags/mt.svg ../../../icons/flags/py.svg ../../../icons/flags/tc.svg ../../../icons/flags/pf.svg ../../../icons/flags/hr.svg ../../../icons/flags/ht.svg ../../../icons/flags/rs.svg ../../../icons/flags/mw.svg ../../../icons/flags/cy.svg ../../../icons/flags/mq.svg ../../../icons/flags/ec.svg ../../../icons/flags/va.svg ../../../icons/flags/ky.svg ../../../icons/flags/kg.svg ../../../icons/flags/sv.svg ../../../icons/flags/me.svg ../../../icons/flags/fj.svg ../../../icons/flags/mx.svg ../../../icons/flags/sm.svg ../../../icons/flags/md.svg ../../../icons/flags/gt.svg ../../../icons/flags/kz.svg ../../../icons/flags/bt.svg ../../../icons/flags/ad.svg ../../../icons/flags/ir.svg ../../../icons/flags/kh.svg ../../../icons/flags/af.svg ../../../icons/flags/je.svg ../../../icons/flags/as.svg ../../../icons/flags/sa.svg ../../../icons/flags/do.svg ../../../icons/flags/ea.svg ../../../icons/flags/es.svg ../../../icons/flags/pn.svg ../../../icons/flags/dg.svg ../../../icons/flags/io.svg ../../../icons/flags/nf.svg ../../../icons/flags/bo.svg ../../../icons/flags/ar.svg ../../../icons/flags/ic.svg ../../../icons/flags/vi.svg ../../../icons/flags/by.svg ../../../icons/flags/bz.svg ../../../icons/flags/gp.svg ../../../icons/flags/ac.svg ../../../icons/flags/mp.svg ../../../icons/flags/pt.svg ../../../icons/flags/ta.svg ../../../icons/flags/gs.svg ../../../icons/flags/yt.svg ../../../icons/flags/bl.svg ../../../icons/flags/vg.svg ../../../icons/flags/pm.svg mumble-1.3.4/src/mumble/flags/mumble_flags.pri0000664000175000017500000000004614010707274021157 0ustar builderbuilderRESOURCES *= flags/mumble_flags_0.qrc mumble-1.3.4/src/mumble/mumble_eo.ts0000664000175000017500000117252114010707274017237 0ustar builderbuilder ACLEditor Deny Malpermesi Allow Permesi Allow %1 Permesi na %1 Deny %1 Malpermesi na %1 Mumble - Add channel Mumble - Aldoni kanalon Default server value Defaŭlta servilo Failed: Invalid channel Malsukcesis: Nevalida kanalo Mumble - Edit %1 Mumble - Redakti na %1 ID: %1 identigilo: %1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Tiu koncedas la privilegion %1. Se privilegio estas kaj permesata kaj malpermesata, ĝi estas malpermesata.<br />%2 Channel must have a name La kanalo devas havi nomon This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Tiu forprenas la privilegion %1. Se privilegio estas kaj permesata kaj malpermesata, ĝi estas malpermesata.<br />%2 Dialog Dialogo Name Nomo Enter the channel name here. Enigu la kanal-nomon ĉi tien. Description Priskribo Password Pasvorto Enter the channel password here. Enigu la kanal-pasvorton ĉi tien. Check to create a temporary channel. Kontroli por krei provizoran kanalon. Temporary Kelkatempa <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Pozicio</b><br/> Tiu ĉi valoro ebligas al vi ŝanĝi kiel Mumble disponas la kanalojn en la arbo. Kanalo kun pli alta <i>Pozicia</i> valoro ĉiam estos metita sub alian kun pli malalta valoro, samo validas se male. Se la <i>Pozicia</i> valoro de du kanaloj estas egalaj, ili nome ordiĝos laŭalfabete. Position Pozicio &Groups &Grupoj Group Grupo List of groups Listo da grupoj Remove selected group Forigi la elektitan grupon Remove Forigi Inherit group members from parent Heredi grup-anojn de patra objekto Inherit Heredi Make group inheritable to sub-channels Igi grupon heredebla al sub-kanaloj Inheritable Neheredebla Group was inherited from parent channel Grupo estis heredita de patra kanalo Inherited Heredita Members Membroj Add Aldoni Add member to group Aldoni anon al grupo Remove member from group Forigi anon de grupo &ACL &ACL Active ACLs Aktivaj ACLoj List of entries Listo da elementoj Inherit ACL of parent? Ĉu heredu ACLon de patro? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. Inherit ACLs Heredi ACLojn Move entry up Movi elementon supren This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. &Up Su&pren Move entry down Movi elementon suben This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. &Down Su&ben Add new entry Aldoni novan elementon This adds a new entry, initially set with no permissions and applying to all. &Add &Aldoni Remove entry Forigi elementon This removes the currently selected entry. Tio forigas la nune elektatan eron. &Remove &Forigi Context Kunteksto Entry should apply to this channel. Entry should apply to this channel La ero estu rilata al tiu ĉi kanalo. This makes the entry apply to this channel. Tio Applies to this channel Entry should apply to sub-channels. Add new group Aldoni novan gupon <b>Add</b><br/> Add a new group. <b>Aldoni</b><br/> Aldoni novan grupon. Inherited members Heriditaj anoj Contains the list of members added to the group by this channel. Enhavas la liston da anoj, kiuj aldoniĝis de ĉi tiu kanalo al la grupo. Contains a list of members whose group membership will not be inherited from the parent channel. Enhavas liston da anoj kies grup-aneco ne estos heredita de patra kanalo. Contains the list of members inherited by other channels. Enhavas la liston da anoj, kiuj estis hereditaj de aliaj kanaloj. Type in the name of a user you wish to add to the group and click Add. Entajpu la nomon de uzanto, kiun vi volas aldoni al grupon kaj klaku Aldoni! Type in the name of a user you wish to remove from the group and click Add. Entajpu la nomon de uzanto, kiun vi volas forigi de grupo kaj klaku Aldoni! Exclude Bari Excluded members Baritaj membroj This makes the entry apply to sub-channels of this channel. Tiu igos la eron efektivigi al la sub-kanaloj de tiu kanalo. Applies to sub-channels Efektivigas al sub-kanaloj Permissions Permesoj User/Group Uzanto/Grupo Group this entry applies to Grupo, al kiu tiu ĉi elemento aplikas User ID Uzant-identigilo User this entry applies to Uzanto, al kiu tiu ĉi elemento aplikas This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. Tiu kontrolas al kiu uzanto tiu ero efektivigas. Simple entajpu la uzant-nomon kaj presu la enig-klavon por igi la servilon serĉi kongruon. &Properties &Atributoj <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>Nomo</b><br />Entajpu la kanal-nomon en tiun areon. La nomo devas obei la regulojn de la servilo, al kiu vi konektatas. <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. ID of the channel. Identigilo de la kanalo. Maximum Users Maximum number of users allowed in the channel <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. This is the sort order for the channel. ALSAAudioInput Default ALSA Card Defaŭlta Karto de ALSA Opening chosen ALSA Input failed: %1 ALSAAudioOutput Default ALSA Card Defaŭlta Karto de ALSA Opening chosen ALSA Output failed: %1 ASIOConfig %1 (version %2) %1 (versiono %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz ASIO Initialization failed: %1 Failed to instantiate ASIO driver ASIO ASIO Device selection Device Aparato Device to use for microphone This chooses what device to query. You still need to actually query the device and select which channels to use. Query selected device This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Query Configure selected device This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Configure &Agordi Capabilities Ebleco Driver name Pelil-nomo Buffer size This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. Configure input channels Channels Kanaloj Microphone Mikrofono <- <- -> -> Unused Neuzata Speakers Parolantoj ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. Opening selected ASIO device failed. No input will be done. AboutDialog About Mumble Pri Mumble <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble &Pri Mumble &License &Permesilo A&uthors &Third-Party Licenses OK Konfirmi AudioInput Interface Interfaco System Sistemo Input method for audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Aparato Input device for audio <b>This is the input device to use for audio.</b> Transmission Transsendo &Transmit &Transsendi When to transmit your speech Kiam transsendi vian voĉon <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. DoublePush Time If you press the PTT key twice in this time it will get locked. <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. Reset audio cue to default <b>Reset</b><br/>Reset the paths for the files to their default. Browse for on audio file Browse for off audio file Off Malŝaltita On Enŝalti Preview the audio cues Use SNR based speech detection Signal to Noise Proporcio de signalo al bruo <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. Amplitude amplitudo Voice &Hold How long to keep transmitting after silence Silence Below <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. Speech Above Signal values above this count as voice Compression Densigo &Quality &Kvalito Quality of compression (peak bandwidth) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. Audio per packet How many audio frames to send per packet <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). Audio Processing Noise Suppression Noise suppression <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. Maximum amplification of input sound <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. Current speech detection chance Cancel echo from speakers Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. Disabled Elŝaltite <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal values below this count as silence Maximum bandwidth used for sending audio Use Amplitude based speech detection <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). Exclusive mode Ekskluziva reĝimo <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive Ekskluzive R&eset R&eŝargi &Browse... &Foliumi... B&rowse... F&oliumi... &Preview &Antaŭrigardo <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. Displays an always on top window with a push to talk button in it Display push to talk window Misc Audible audio cue when starting or stopping to transmit <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. Audio cue Gets played when starting to transmit Gets played when stopping to transmit Hold Time Time the microphone stays open after the PTT key is released Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) Max. Amplification Idle action minutes do nothing nenio deafen surdigi mute mutigi after post Echo Cancellation Mixed echo cancellation Multichannel echo cancellation The idle action will be reversed upon any key or mouse button input Undo Idle action upon activity Apply RNNoise's noise suppression filter. <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. RNNoise Audio input AudioInputDialog Continuous Voice Activity Push To Talk Premi Por Paroli Audio Input %1 ms %1 ms Off Malŝaltita %1 s %1 s %1 kb/s %1 kb/s -%1 dB -%1 dB %1 kbit/s (Audio %2, Position %4, Overhead %3) AudioOutput Interface Interfaco System Sistemo Output method for audio <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Aparato Output device for audio <b>This is the output device to use for audio.</b> Positional Audio Audio Output Default &Jitter Buffer Safety margin for jitter buffer <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. Minimum distance to user before sound volume decreases This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. Volume Laŭteco Volume of incoming speech Laŭteco de venanta voĉo <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. Output Delay Amount of data to buffer Kiom da datenoj por bufri The connected "speakers" are actually headphones The connected "speakers" are actually headphones. Factor for sound volume decrease Bloom Factor for sound volume increase How much should sound volume increase for sources that are really close? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Headphones Kapaŭskultiloj Minimum Distance Minimuma Distanco Maximum Distance Maksimuma Distanco Maximum distance, beyond which speech volume won't decrease Minimum Volume Minimuma Sonforteco What should the volume be at the maximum distance? Loopback Test Testo de Inversa Ciklo Delay Variance Variance in packet latency <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. Packet Loss Perditaj Paketoj Packet loss for loopback mode Perditaj paketoj en la reĝimo de inversa ciklo <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% &Loopback Inversa Cik&lo Desired loopback mode Dezirita reĝimo de inversa ciklo Attenuate applications by... Atenui aplikaĵojn de... Attenuation of other applications during speech Atenuo de aliaj aplikaĵoj dum parolado <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. If checked Mumble lowers the volume of other applications while other users talk <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. while other users talk dum aliaj uzantoj parolas If checked Mumble lowers the volume of other applications while you talk <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. while you talk dum vi parolas Exclusive mode, not recommended. Ekskluziva reĝimo, ne rekomendita. <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive Ekskluzive Priority Speaker Prioritata Parolanto If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. Attenuate other users while talking as Priority Speaker. Atenui aliajn uzantojn dum paroli kiel Prioritata Parolanto. Advanced Attenuation Options If checked, Mumble will only attenuate applications that are using the same output source as Mumble <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. Only attenuate applications using the same output device If checked, PulseAudio loopback modules will be attenuated <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. Attenuate PulseAudio loopback modules Audio output AudioOutputDialog None Neniu Local Loke Server Servilo Audio Output Son-eligo %1 ms %1 ms %1 % %1 % %1 m %1 m AudioOutputSample Choose sound file Elektu sondosieron Invalid sound file Nevalida sondosiero The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. AudioStats >1000 ms >1000ms >1000 ms Audio Statistics Sonaj Statistikaĵoj Input Levels Peak microphone level Peak power in last frame This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. Peak speaker level This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. Peak clean level This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. Signal Analysis Analizo de la signalo Microphone power Mikrofonforteco How close the current input level is to ideal This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. Signal-To-Noise ratio Proporcio de signalo al bruo Signal-To-Noise ratio from the microphone Proporcio de signalo al bruo el la mikrofono This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. Speech Probability Probablo de Parolo Probability of speech Probablo de parolo This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). Configuration feedback Current audio bitrate Aktuala sona bitrapido Bitrate of last frame Bitrapido de la lasta sonadero DoublePush interval DuoblaPrema intertempo Time between last two Push-To-Talk presses Tempo inter la du lastaj premoj de Premi-por-Paroli Speech Detection Rekono de Parolado Current speech detection chance Aktuala ŝanco de rekono de parolado <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal and noise power spectrum Power spectrum of input signal and noise estimate This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. Echo Analysis Analizo de eĥo Weights of the echo canceller This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. AudioWizard Audio Tuning Wizard Son-agordi-asistanto Introduction Enkonduko Welcome to the Mumble Audio Wizard Bonvenon al la son-asistanto de Mumble Finished Finita Enjoy using Mumble Ĝuu uzi na Mumble Device selection Aprarat-elekto Selecting the input and output device to use with Mumble. This is the device your microphone is connected to. System Sistemo Input method for audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Aparato Input device to use <b>Selects which sound card to use for audio input.</b> Cancel echo from headset or speakers Use echo cancellation This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. This is the device your speakers or headphones are connected to. Output method for audio <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. Output device to use <b>Selects which sound card to use for audio Output.</b> Enable positional audio Allows positioning of sound Allows positioning of sound. <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> Input Device Enig-aparato Output Device Elig-aparato This allows Mumble to use positional audio to place voices. <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> Amount of data to buffer Kiom da datenoj por bufri This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> Positional Audio Pozicia Sono Adjusting attenuation of positional audio. <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> Use headphones instead of speakers Uzi kapaŭskultilojn anstataŭ laŭtparolilojn <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> Use headphones Uzi kapaŭskultilon This ignores the OS speaker configuration and configures the positioning for headphones instead. Volume tuning Tuning microphone hardware volume to optimal settings. Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. Voice Activity Detection Letting Mumble figure out when you're talking and when you're silent. This will help Mumble figure out when you are talking. The first step is selecting which data value to use. Raw amplitude from input Signal-To-Noise ratio Proporcio de signalo al bruo Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Device tuning Changing hardware output delays to their minimum value. Submit anonymous statistics to the Mumble project Push To Talk: Premi Por Paroli: Quality & Notifications Adjust quality and notification settings. Quality settings Low Malalta Balanced Notification settings Use Text-To-Speech to read notifications and messages to you. Disable Text-To-Speech and use sounds instead. %1 ms %1 ms Enables attenuation of other applications while users talk to you Attenuate applications while other users talk High Alta Custom Propre You already set a customized quality configuration in Mumble. Select this setting to keep it. Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. Apply some high contrast optimizations for visually impaired users Use high contrast graphics Keep custom Text-To-Speech settings. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) BanEditor Mumble - Edit Bans &Address &Adreso &Mask Reason Kialo Start Eki End Fino User Uzanto Hash Haketo &Add &Aldoni &Update Ĝ&isdatigi &Remove &Forigi Ban List Search field Serĉ-kampo This is the search field. Use it to find bans that have this username set in the username field. Who are you looking for? No nickname Neniu kromnomo IP address IP adreso No IP address Neniu IP adreso Reason for the ban Kialo por forbari No reason Neniu kialo Ban end date Dato de la forbara fino Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). Certificate hash No certificate hash Banned users Forbaritaj uzantoj This is a list with banned users. Use this button if you want to add a new ban. Use this button if you want to update ban information. Use this button if you want to remove user from the ban list. Clear all fields Vakigi ĉiuj kampojn This button clears all fields. Use it if you want to add a new ban. Clear Vakigi Ban List - %n Ban(s) CertView Name Nomo Email Retpoŝto Issuer Expiry Date (none) (neniu) Self-signed Memsubskribita CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. There was an error generating your certificate.<br />Please try again. Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. The file could not be opened for writing. Please use another file. The file's permissions could not be set. No certificate and key has been written. Please use another file. The file could not be written successfully. Please use another file. The file could not be opened for reading. Please use another file. The file is empty or could not be read. Please use another file. The file did not contain a valid certificate and key. Please use another file. Select file to export certificate to Select file to import certificate from Unable to import. Missing password or incompatible file type. <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. Certificates Certificate Management Atestila Administrado Certificate Authentication Atestila Aŭtentigo Authenticating to servers without using passwords Current certificate Aktuala atestilo This is the certificate Mumble currently uses. Tiun atestilon Mumble aktuale uzas. Current Certificate Aktuala atestilo Create a new certificate Krei novan atestilon This will create a new certificate. Tio kreos novan atestilon. Import certificate from file Enporti atestilon de dosiero This will import a certificate from file. Tio enportos atestilon de dosiero. Import a certificate Enporti atestilon Export Certificate Elporti atestilon This will export a certificate to file. Tio elportos atestilon de dosiero. Export current certificate Elporti aktualan atestilon Import Certificate Enporti atestilon PKCS #12 Certificate import Enporto de atestilo de tipo PKCS #12 <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> Import from Enporti de Filename to import from Dosiernomo por enporti de This is the filename you wish to import a certificate from. Select file to import from Elektu dosieron por enporti This opens a file selection dialog to choose a file to import a certificate from. Open... Malfermi... Password pasvorto Password for PKCS#12 file pasvorto por PKCS#12 dosiero This is the password for the PKCS#12 file containing your certificate. Certificate to import This is the certificate you are importing. Certificate Details Detaloj de la Atestilo Replace Certificate Anstataŭigi atestilon Replace existing certificate with new certificate? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> This is the certificate Mumble currently uses. It will be replaced. Tiun atestilon Mumble aktuale uzas. Ĝi anstataŭiĝos. New certificate Nova atestilo This is the new certificate that will replace the old one. New Certificate Nova Atestilo Make a backup of your certificate Export to Elporti al Filename to export to This is the filename you wish to export a certificate to. Save As... Konservi kiel... This is the certificate Mumble currently uses. It will be exported. Generate a new certificate for strong authentication Generi novan atestilon por forta aŭtentigo <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> Name Nomo Email Retpoŝto Your email address (e.g. johndoe@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. Your name (e.g. John Doe) Via nomo (ekz. John Doe) This is your name, and will be filled out in the certificate. This field is entirely optional. Finish Fini Certificate-based authentication is ready for use Enjoy using Mumble with strong authentication. Automatic certificate creation Aŭtomata kreo de atestilo <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> ChanACL None Neniu Traverse Trairi Enter Eniri Speak Paroli Mute/Deafen Mutigi/Surdigi Make channel Fari kanalon Make temporary Dumtempigi Link channel Ligi kanalon This represents no privileges. This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. This represents the permission to write text messages to other users in this channel. This represents the permission to forcibly remove users from the server. This represents the permission to permanently remove users from the server. This represents the permission to register and unregister users on the server. This represents the permission to register oneself on the server. Whisper Flustri Move Movi Text message Tekst-mesaĝo Kick Forpeli Ban Forbari Register User Registrigi Uzanton Register Self Registriĝi Write ACL ChatbarTextEdit Paste and &Send Paste and send Alglui kaj &Sendi <center>Type chat message here</center> <center>Tajpu babilmesaĝon ĉi tie</center> ClientUser Friend Amiko Authenticated Aŭtentigita Priority speaker Recording Muted (server) Mutigite (servilo) Deafened (server) Surdigite (servilo) Local Ignore (Text messages) Loke Ignori (Tekstmesaĝojn) Local Mute Loke Mutigi Muted (self) Mutigite (mem) Deafened (self) Surdigite (mem) ConfigDialog Accept changes Akcepti ŝanĝojn This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. Reject changes Rifuzi ŝanĝojn This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. Apply changes Apliki ŝanĝojn This button will immediately apply all changes. Undo changes for current page This button will revert any changes done on the current page to the most recent applied settings. Restore defaults for current page This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. Mumble Configuration Agordo de Mumble ConnectDialog Connecting to %1 Konektante al %1 Enter username enigi uzantonomon Adding host %1 Aldonante gastigan komputilon %1 Servername Servilnomo Hostname Nomo de gastiga komputilo Bonjour name Bonjour-nomo Port Pordo Addresses Adresoj Website Retejo Packet loss Perditaj paketoj Ping (80%) Eĥosondo (80%) %1 ms %1 ms Ping (95%) Eĥosondo (95%) Bandwidth Kapacito %1 kbit/s %1 kbitoj/s &Connect &Konekti &Filters &Filtriloj Unknown Users Uzantoj Version Versio Failed to fetch server list Mumble Server Connect Ping Eĥosondo Remove from Favorites Forigi de Favoratoj Add custom server Aldoni propran servilon Show all servers that respond to ping Montri ĉiujn servilojn, kiuj respondas eĥosondon Show all servers with users Montri ĉiujn servilojn kun uzantoj Show all servers Montri ĉiujn servilojn &Copy &Kopii Copy favorite link to clipboard Kopii favoratan ligilon al tondujo &Paste &Glui Paste favorite from clipboard Alglui favoraton de tondujo &Edit... %Redakti &Add New... &Aldoni novan... Add to &Favorites Aldoni al Favoratoj Open &Webpage Malfermi Retpaĝon Show &Reachable Montri Atingeblajn Show &Populated Show &All Montri Ĉion ConnectDialogEdit Edit Server Redakti Servilon Name of the server Nomo de la servilo A&ddress A&dreso Internet address of the server. Internet address of the server. Retadreso de la servilo. <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. &Port &Pordo Port on which the server is listening <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. &Username &Uzantnomo Username to send to the server La uzantnomo por sendi al la servilo <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. <b>Uzantnomo</b><br/> La uzantnomo por sendi al la servilo. Konsciu ke la servilo povas trudi limigojn pri kiel uzantnomo povas aspekti. Krome via uzantnomo jam povas esti uzata de alia uzanto. Label Etikedo Add Server Aldoni Servilon You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 Password Pasvorto Password to send to the server La pasvorto por sendi al la servilo <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. <b>Pasvorto</b><br/> La pasvorto por sendi al la servilo ekkonekte. La pasvorto nepras, kiam oni konektas kiel <i>SuperUser<i> aŭ al servilo, kiu uzas perpasvortan aŭtentigon. Se la pasvorto ne estas enigita, ĝi estos petata ekkonekte. Show password Montri pasvorton <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. Local server label Loka servil-etikedo 127.0.0.1 127.0.0.1 64738 64738 Your username Via uzantnomo Your password Via pasvorto &Fill CoreAudioSystem Default Device Defaŭlta aparato CrashReporter Mumble Crash Report <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> Email address (optional) Retpoŝtadreso (malnepra) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash Bonvolu priskribi koncize en la angla, kion vi faris kiam la kraŝo okazis Send Report Sendi la Raporton Don't send report Ne sendi la raporton Crash upload successful Thank you for helping make Mumble better! Crash upload failed We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 Uploading crash report Abort upload Ĉesigi la alŝuton DXAudioInput Default DirectSound Voice Input Opening chosen DirectSound Input device failed. No microphone capture will be done. Opening chosen DirectSound Input failed. Default device will be used. Lost DirectSound input device. DXAudioOutput Default DirectSound Voice Output Opening chosen DirectSound Output failed. Default device will be used. Lost DirectSound output device. Opening chosen DirectSound Output failed. No audio will be heard. Database Mumble failed to initialize a database in any of the possible locations. The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. DeveloperConsole Developer Console DockTitleBar Drag here GlobalShortcut Shortcuts Fulmoklavoj List of configured shortcuts Listo da agorditaj fulmoklavoj Function Funkcio Data Datenoj Shortcut Fulmoklavo Suppress Add new shortcut Aldoni novan fulmoklavon This will add a new global shortcut Tio aldonos novan mallokan fulmoklavon &Add &Aldoni Remove selected shortcut Forigi la elektitan fulmoklavon This will permanently remove a selected shortcut. Tio daŭre forigi elektitan fulmoklavon. &Remove &Forigi <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> Open Accessibility Preferences Skip Preterpasi Enable Global Shortcuts Ebligi Mallokajn Fulmoklavojn <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. Additional Shortcut Engines <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. Enable Windows hooks <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. Enable GKey <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. Enable XInput <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. Enable shortcuts in privileged applications GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> Shortcuts Fulmoklavoj Shortcut button combination. <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. Suppress keys from other applications <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. GlobalShortcutTarget Whisper Target Flustro-celo Whisper to list of Users Flustri al la listo da Uzantoj Channel Target Restrict to Group If specified, only members of this group will receive the whisper. List of users Listo da uzantoj Add Aldoni Remove Forigi Modifiers Modifiloj Do not send positional audio information when using this whisper shortcut. Ignore positional audio Ignori pozician sonon Shout to Linked channels Shout to subchannels Shout to Channel The whisper will also be transmitted to linked channels. The whisper will also be sent to the subchannels of the channel target. GlobalShortcutX Mouse %1 Muso %1 JackAudioSystem Hardware Ports Mono Stereo LCD Not connected Nekonektite LCDConfig Enable this device Ebligi ĉi tiun aparaton LCD LCD Devices Aparatoj Name Nomo <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> Size Grando Enabled Enŝaltite Views Minimum Column Width Minimuma Kolumnolarĝo <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> This setting decides the width of column splitter. Splitter Width Log Debug Sencimiga Critical Grava Warning Averto Information Informoj Server Connected Servilo konektiĝis Server Disconnected Servilo malkonektiĝis Other self-muted/deafened Aliulo sin mutigis/surdigis Permission Denied Permeso Rifuzita Text Message Tekst-mesaĝo User Joined Server Uzanto Eniris la Servilon User Left Server Uzanto Forlasis la Servilon User recording state changed User kicked (you or by you) User kicked You self-muted Vi vin mutigis User muted (you) Uzanto mutiĝis (vi) User muted (by you) Uzanto mutiĝis (de vi) User muted (other) Uzanto mutiĝis (aliulo) User Joined Channel Uzanto Eniris la Kanalon User Left Channel Uzanto Forlasis la Kanalon You self-unmuted Vi vin malmutigis You self-deafened Vi vin surdigis You self-undeafened Vi vin malsurdigis User renamed Uzanto renomiĝis You Joined Channel You Joined Channel (moved) User connected and entered channel User left channel and disconnected Private text message the server la servilo [[ Invalid size ]] [[ Text object too large to display ]] [[ Teksta objekto tro grandas por montri ]] [Date changed to %1] [La dato ŝanĝis al %1] link to %1 ligilo al %1 FTP link to %1 player link channel link kanal-ligilo %1 link %1 ligilo LogConfig Toggle console for %1 events Toggle pop-up notifications for %1 events Toggle Text-To-Speech for %1 events Click here to toggle sound notification for %1 events Toggle window highlight (if not active) for %1 events Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. Messages Mesaĝoj Message Mesaĝo Console Konzolo Notification Text-To-Speech Soundfile Son-dosiero Path Vojo Text To Speech Volume Laŭteco Volume of Text-To-Speech Engine <b>This is the volume used for the speech synthesis.</b> Length threshold Message length threshold for Text-To-Speech Engine <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. Characters Whisper Flustro If checked you will only hear whispers from users you added to your friend list. Only accept whispers from friends If enabled text messages you send will be read back to you with TTS Read back own messages Chat Log Babil-protokolo Maximum chat length Maksimuma babil-longo Unlimited Nelimigite Lines Linioj Highlight LookConfig System default Sistema defaŭlto None Neniu Only with users Nur kun uzantoj All Ĉiuj Ask Demandi Do Nothing Fari nenion Move Movi <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory User Interface Uzanto-interfaco This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. List users above subchannels (requires restart). <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. Users above Channels Uzantoj supre de la Kanaloj <b>If set, will verify you want to quit if connected.</b> <b>Se agordata, kontrolos ke vi volas ĉesi se estos konektita.</b> Show number of users in each channel Montri nombron da uzantoj en ĉiu kanalo Show channel user count Montri nombron da uzantoj en la kanalo Language Lingvo Language to use (requires restart) Lingvo por uzi (relanĉo nepras) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. Look and Feel Layout Classic Klasika Stacked Hybrid Custom This changes the behavior when moving channels. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. Expand Etendi When to automatically expand channels Channel Dragging Ask whether to close or minimize when quitting Mumble. Ask on quit while connected Always On Top <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> Hide in tray when minimized Hide the main Mumble window in the tray when it is minimized. This setting controls when the application will be always on top. Never Neniam Always Ĉiam In minimal view In normal view Displays talking status in system tray Show talking status in tray icon This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. Show context menu in menu bar Apply some high contrast optimizations for visually impaired users Optimize for high contrast Application Aplikaĵo Adds user and channel context menus into the menu bar Tray Icon Channel Tree Use selected item as the chat bar target Filter automatically hides empty channels Show transmit mode dropdown in toolbar Theme Theme to use to style the user interface <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. User Dragging This changes the behavior when moving users. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. Enable Developer menu When in custom layout mode, checking this disables rearranging. Lock layout MainWindow Root Push-to-Talk Global Shortcut Premi-por-Paroli Push and hold this button to send voice. Global Shortcut Premadi ĉi tiun butonon por sendadi voĉon. This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut Reset Audio Processor Global Shortcut Unlink Plugin Global Shortcut Push-to-Mute Global Shortcut Join Channel Global Shortcut Toggle Overlay Global Shortcut Toggle state of in-game overlay. Global Shortcut Toggle Minimal Global Shortcut Volume Up (+10%) Global Shortcut Volume Down (-10%) Global Shortcut Mumble Mumble Mumble -- %1 Mumble -- %1 &Window Minimize Ctrl+M Ctrl+M Close Fermi Mumble is currently connected to a server. Do you want to Close or Minimize it? Mute Self Global Shortcut Set self-mute status. Global Shortcut This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut Deafen Self Global Shortcut Set self-deafen status. Global Shortcut This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut Whisper/Shout Whisper <center>Not connected</center> Not connected Clear Vakigi Opening URL %1 File does not exist File is not a configuration file. Settings merged from file. URL scheme is not 'mumble' This version of Mumble can't handle URLs for Mumble version %1.%2.%3 Connecting to %1 Konektante al %1 Enter username Enigu uzantonomon Connecting to server %1. Konektante al servilo %1. Reconnecting. Rekonektante. Transmit Mode set to Continuous <p>%1 (%2)<br />%3</p> <p>%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> Register yourself as %1 Registrigi vin kiel %1 <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <h2>Version</h2><p>Protocol %1</p> <p>No build information or OS version available</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) The connection is secured by the cipher suite that OpenSSL identifies as %1 <p>The connection provides perfect forward secrecy</p> <p>The connection does not provide perfect forward secrecy</p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> Voice channel is sent over control channel Register user %1 Registrigi uzanton %1 <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> Kicking user %1 Banning user %1 View comment on user %1 Vidi komenton de uzanto %1 Message to channel %1 Mesaĝo por la kanalo %1 Connected. Konektite. <li>Expected certificate digest (SHA-1): %1</li> Server presented a certificate which failed verification. <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> SSL Version mismatch Server connection failed. <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>Tajpu mesaĝon por la kanalo '%1' ĉi tie</center> <center>Type message to user '%1' here</center> Type message to user '%1' here <center>Tajpu mesaĝon por la uzanto '%1' ĉi tie</center> Choose image file Elektu bildodosieron Failed to load image Malsukcesis ŝargi la bildon Could not open file for reading. Ne povas malfermi la dosieron por legi. Image format not recognized. Ne rekonis bildformaton. &User &Uzanto &Channel &Kanalo Use in conjunction with Whisper to. Global Shortcut This will switch the states of the in-game overlay. Global Shortcut Link Channel Global Shortcut Cycle Transmit Mode Global Shortcut Set Transmit Mode to Push-To-Talk Global Shortcut Set Transmit Mode to Continuous Global Shortcut Set Transmit Mode to VAD Global Shortcut Send Text Message Global Shortcut Send Clipboard Text Message Global Shortcut This will send your Clipboard content to the channel you are currently in. Global Shortcut Continuous Voice Activity Push-to-Talk Premi-por-Paroli Mumble - Minimal View -- %1 Cancel Nuligi Save Image As... Save Image File Could not save image: %1 Change your comment Transmit Mode set to Voice Activity Transmit Mode set to Push-to-Talk <p>Connected users: %1/%2</p> UDP Statistics To Server Al servilo From Server De servilo Good Bone Late Lost Resync <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> Mumble Server Information Informoj de la Mumble-servilo &View Certificate Enter reason Enigu kialon Sending message to %1 Sendi mesaĝion al %1 To %1: %2 Al %1: %2 Message to %1 Mesaĝo al %1 Are you sure you want to reset the comment of user %1? Are you sure you want to reset the avatar of user %1? Ĉu vi certas, ke vi volas rekomencigi la avataron de uzanto %1? Are you sure you want to delete %1 and all its sub-channels? Sending message to channel %1 Message to tree %1 To %1 (Tree): %2 (Tree) %1: %2 Unmuted and undeafened. Malmutigite kaj malsurdigite. Unmuted. Malmutigite. Muted. Mutigite. Muted and deafened. Mutigite kaj surdigite. Deafened. Surdigite. Undeafened. Malsurdigite Restart Mumble? Some settings will only apply after a restart of Mumble. Restart Mumble now? About Qt Pri Qt SSL Verification failed: %1 <li>Server certificate digest (SHA-1): %1</li> <b>WARNING:</b> The server presented a certificate that was different from the stored one. This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. Server connection failed: %1. Servila konekto malsukcesis: %1. Disconnected from server. Invalid username Nevalida uzantonomo You connected with an invalid username, please try another one. Username in use Uzantnomo estas uzata That username is already in use, please try another username. Tiu uzantnomo jam estas uzata, bonvolu provi alian uzantnomon. Wrong certificate or password Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. Wrong password malĝusta pasvorto Wrong server password for unregistered user account, please try again. Images (*.png *.jpg *.jpeg) Bildoj (*.png *.jpg *.jpeg) C&onfigure Ag&ordi &Help &Helpo Log This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. &Quit Mumble &Ĉesi na Mumble Closes the program Exits the application. Eliras la aplikaĵon. Ctrl+Q Ctrl+Q Open the server connection dialog &Disconnect &Malkonekti Disconnect from server Disconnects you from the server. Show information about the server connection This will show extended information about the connection to the server. &Mute Mutigi &Deafen Surdigi &Local Mute Loke Mutigi Send a Text Message Sendi tekst-mesaĝon Sends a text message to another user. Sendas tekst-mesaĝon al alia uzanto. Add new channel Aldoni novan kanalon This adds a new sub-channel to the currently selected channel. Remove channel Forigi kanalon This removes a channel and all sub-channels. Edit Groups and ACL for channel This opens the Group and ACL dialog for the channel, to control permissions. &Link Link your channel to another channel This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. Chatbar Shows a dialog of registered servers, and also allows quick-connect. Montras dialogon de registritaj serviloj, kaj ankaŭ permesas tujkonekti. Kick user (with reason) Kick selected user off server. You'll be asked to specify a reason. Mute user Mutigi uzanton Mute or unmute user on server. Unmuting a deafened user will also undeafen them. Mutigi aŭ malmutigi uzanton servile. Malmutigi surdan uzanton ankaŭ malsurdigos ĝin. Kick and ban user (with reason) Kick and ban selected user from server. You'll be asked to specify a reason. Deafen user Surdigi uzanton Deafen or undeafen user on server. Deafening a user will also mute them. Surdigi aŭ malsurdigi uzanton servile. Surdigi uzanton ankaŭ mutigos ĝin. Mute user locally Loke mutigi uzanton Mute or unmute user locally. Use this on other users in the same room. This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. &Unlink Channel Unlink your channel from another channel This unlinks your current channel from the selected channel. Unlinks your channel from all linked channels. This unlinks your current channel (not the selected one) from all linked channels. &Reset Reset audio preprocessor This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. &Mute Self Mute yourself Mutigi vin Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. &Deafen Self Deafen yourself Surdigi vin Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. &Text-To-Speech Toggle Text-To-Speech Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. Display audio statistics Pops up a small dialog with information about your current audio input. Forcibly unlink plugin This forces the current plugin to unlink, which is handy if it is reading completely wrong data. Configure Mumble Allows you to change most settings for Mumble. Start the audio configuration wizard This will guide you through the process of configuring your audio hardware. &What's This? Enter What's This? mode Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. Information about Mumble Informoj pri Mumble Shows a small dialog with information and license for Mumble. Information about Speex Shows a small dialog with information about Speex. Information about Qt Informoj pri Qt Shows a small dialog with information about Qt. Check for &Updates Check for new version of Mumble Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. Sends a text message to all users in a channel. Configure certificates for strong authentication This starts the wizard for creating, importing and exporting certificates for authentication against servers. Register user on server Registrigi uzanton en la servilon This will permanently register the user on the server. Add &Friend Aldoni &amikon Adds a user as your friend. Aldonas uzanton kiel via amiko. This will add the user as a friend, so you can recognize him on this and other servers. &Remove Friend &Forigi &amikon Removes a user from your friends. Forigas uzanton de via amikoj. This will remove a user from your friends list. &Update Friend Ĝisdatigi Amikon Update name of your friend. Ĝisdatigi la nomon de via amiko. Your friend uses a different name than what is in your database. This will update the name. Edit registered users list Redakti liston da registritaj uzantoj This opens the editor for registered users, which allow you to change their name or unregister them. Add or remove text-based access tokens &Minimal View Plejeta Vido Toggle minimal window modes This will toggle minimal mode, where the log window and menu is hidden. You muted and deafened %1. Vi mutigis kaj surdigis na %1. You unmuted and undeafened %1. Vi malmutigis kaj malsurdigis na %1. You undeafened %1. Vi malsurdigis na %1. You suppressed %1. %1 muted and deafened by %2. %1 mutiĝis kaj surdiĝis de %2. %1 unmuted and undeafened by %2. %1 malmutiĝis kaj malsurdiĝis de %2. %1 undeafened by %2. %1 malsurdiĝis de %2. %1 suppressed by %2. %1 moved to %2. %1 moviĝis al %2. %1 moved to %2 by %3. %1 moviĝis al %2 de %3. %1 moved in from %2 by %3. %1 enmoviĝis el %2 de %3. %1 is now muted and deafened. %1 nun estas muta kaj surda. Your account information can not be verified currently. Please try again later Welcome message: %1 Bonvenmesaĝo: %1 Mumble: %1 Mumble: %1 You were denied %1 privileges in %2. %3 was denied %1 privileges in %2. Denied: Cannot modify SuperUser. Malpermesis: Ne povas modifi la uzanton SuperUser. Denied: Invalid channel name. Malpermesis: Nevalida kanal-nomo. Denied: Text message too long. Malpermesis: Teksta mesaĝo tro longas. Denied: Operation not permitted in temporary channel. Malpermesis: Operacio ne estas permesata en provizora kanalo. You need a certificate to perform this operation. %1 does not have a certificate. %1 ne havas atestilon. Invalid username: %1. Nevalida uzantnomo: %1. Invalid username. Nevalida uzantnomo. Channel is full. Kanalo estas plena. Channel nesting limit reached. Channel count limit reached. Need to delete channels before creating new ones. Permission denied. %1 connected and entered channel. %1 connected. %1 konektis. %1 is now muted. %1 nun estas muta. %1 is now unmuted. %1 nun estas malmuta. Recording started Recording stopped %1 started recording. %1 stopped recording. You revoked your priority speaker status. You assumed priority speaker status. %1 revoked your priority speaker status. %1 gave you priority speaker status. You revoked priority speaker status for %1. You gave priority speaker status to %1. %1 revoked own priority speaker status. %1 assumed priority speaker status. %1 revoked priority speaker status for %2. %1 gave priority speaker status to %2. You were unmuted and undeafened by %1. Vi malmutiĝis kaj malsurdiĝis de %1. You were muted by %1. Vi mutiĝis de %1. You were undeafened by %1. Vi malsurdiĝis de %1. You were suppressed. You were suppressed by %1. You were unsuppressed. You were unsuppressed by %1. You joined %1. You moved %1 to %2. Vi movis na %1 al %2. %1 is recording %1 renamed to %2 by %3. %1 disconnected. %1 malkonektis. Server message from Servilo (Tree) (Arbo) (Channel) (Kanalo) (Private) %2%1: %3 %2%1: %3 Failed to load Opus, it will not be available for audio encoding/decoding. The server requests minimum client version %1 The server requests positional audio be enabled. The server requests positional audio be disabled. The server requests Push-to-Talk be enabled. The server requests Push-to-Talk be disabled. You were unmuted by %1. Vi malmutiĝis de %1. You muted %1. Vi mutigis na %1. You unsuppressed %1. You unmuted %1. Vi malmutigis na %1. %1 muted by %2. %1 mutiĝis de %2. %1 unsuppressed by %2. %1 unmuted by %2. %1 malmutiĝis de %2. Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. You were muted and deafened by %1. You were deafened by %1. Vi mutiĝis kaj surdiĝis de %1. You were kicked from the server by %1: %2. %3 was kicked from the server by %1: %2. You were kicked and banned from the server by %1: %2. %3 was kicked and banned from the server by %1: %2. You were moved to %1 by %2. Vi moviĝis de %2 al %1. %1 entered channel. %1 eniris la kanalon. Server connection rejected: %1. Malakceptis la servilan konekton: %1. Denied: %1. Malpermesis: %1. %1 renamed to %2. %1 renomiĝis al %2. %1 left channel and disconnected. %1 foriris la kanalon kaj malkonektis. Message from %1 Mesaĝo de %1 You have User Dragging set to "Do Nothing" so the user wasn't moved. You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. Unknown Channel Drag mode in UserModel::dropMimeData. Remote controlling Mumble: Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) -jn, --jackname Set custom Jack client name. --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status Invocation Alvoko Error: No RPC command specified Eraro: Ne specifis komandon de RPC RPC RPC Welcome to Mumble. Bonvenon al Mumble. Skipping version check in debug mode. Hide Frame Kaŝi la Kadron Toggle showing frame on minimal window This will toggle whether the minimal window should have a frame for moving and resizing. &Unlink All Malligi Ĉion Reset the comment of the selected user. Nuligi la komenton de la elektita uzanto. &Join Channel &Eniri kanalon View comment in editor Query server for connection information for user S&erver S&ervilo &Self &Unlink Plugins Register yourself on the server Registrigi vin en la servilon Change your avatar image on this server Ŝanĝi vian avatarbildon en la servilo &Remove Avatar Forigi la Avataron Remove currently defined avatar image. Icon Toolbar Change your own comment Ŝanĝi vian propran komenton Recording Priority Speaker &Copy URL &Kopii na la URL Copies a link to this channel to the clipboard. Ignore Messages Ignori Mesaĝojn Locally ignore user's text chat messages. Loke ignori la tekstajn babilmesaĝojn de la uzanto. Silently drops all text messages from the user. Edit ban list on server This lets you edit the server-side IP ban list. &Filter on/off &Filtrilo ŝaltita/malŝaltita Toggle the channel filter (Ctrl+F) Baskuligi la kanal-filtron (Ctrl+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. Ctrl+F Ctrl+F &Hide Channel when Filtering Kaŝi Kanalon dum Filtrante Reset the avatar of the selected user. Rekomencigi la avataron de la elektita uzanto. Locally adjust the user's speech volume. Opens a dialog with a volume slider. Use this on other users in the same room. &Developer &Hide Mumble Hides the main Mumble window. Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. Show the Developer Console Shows the Mumble Developer Console, where Mumble's log output can be inspected. &Connect... &Ban list... &Information... &Kick... &Ban... Local Volume Adjustment... Send &Message... &Add... &Remove... &Edit... Audio S&tatistics... &Settings... &Audio Wizard... Developer &Console... &About... About &Speex... About &Qt... &Certificate Wizard... &Register... Registered &Users... Change &Avatar... &Access Tokens... Reset &Comment... Reset &Avatar... View Comment... &Change Comment... R&egister... Show Shows the main Mumble window. Manual Manual Mumble Positional Audio Position X Y Z m Heading Azimuth Elevation ° Meta data Context Identity Set State Linked Activated Unhinge NetworkConfig Network Reto Updates are mandatory when using snapshot releases. Connection Konekto Use TCP compatibility mode Use TCP compatability mode <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). Reconnect when disconnected Rekonekti post malkonektiĝo <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. <b>Rekonekti post malkonektiĝo</b>.<br/>Tio igos na Mumble aŭtomate provi rekonekti post 10 sekundoj, se via servila konekto fiaskas. Reconnect automatically Rekonekti aŭtomate Proxy Prokurilo Type Tipo Type of proxy to connect through Tipo de prokurilo por konekti tra Direct connection Senpera konekto HTTP(S) proxy HTTP(S)-prokurilo SOCKS5 proxy SOCKS5-prokurilo Hostname Nomo de gastiga komputilo Hostname of the proxy Nomo de la prokurila gastiga komputilo Force TCP mode Enable QoS to prioritize packets This will enable QoS, which will attempt to prioritize voice packets over other traffic. Use Quality of Service Don't send certificate to server and don't save passwords. (Not saved). <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> Suppress certificate and password storage <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. Port Pordo Port number of the proxy Porda numero de la prokurilo <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. Username Uzantnomo Username for proxy authentication Uzantnomo por prokuril-aŭtentikeco <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Password Pasvorto Password for proxy authentication Pasvorto por prokuril-aŭtentikeco <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Mumble services Servoj de Mumble Check for new releases of Mumble automatically. This will check for new releases of Mumble every time you start the program, and notify you if one is available. Check for application updates on startup Check for new releases of plugins automatically. This will check for new releases of plugins every time you start the program, and download them automatically. <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. Submit anonymous statistics to the Mumble project Submit anonymous statistics Reconnect to last used server when starting Mumble Reconnect to last server on startup Download plugin and overlay updates on startup Privacy Prevent OS information being sent to Mumble servers and web servers <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. Do not send OS information to Mumble servers and web servers Overlay Silent Silenta Talking Parolado Whisper Flustri Shout Krii Channel Kanalo Failed to create communication with overlay at %2: %1. No overlay will be available. OverlayClient Filter Filtri Only talking Nur parolante Talking and recently active Parolante kaj aktive antaŭ ne longe All in current channel All in linked channels Always show yourself Configure recently active time (%1 seconds)... Columns Kolumnoj Sort Alphabetically Alfabete Last state change Lasta ŝanĝo de la stato Edit... Redakti... Reset Zoom Configure recently active time Amount of seconds users remain active after talking: OverlayConfig To move the users, drag the little red dot. To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. For more options, right click a user. For more options, rightclick a user. Launcher Filter Overlay Choose executable Choose application Choose path Load Overlay Presets Mumble overlay presets (*.mumblelay) Save Overlay Presets Options Opcioj Enable overlay. Enable Overlay This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. Layout Aranĝo Blacklist Nigralisto Whitelist Blankalisto Uninstall Overlay Overlay Installation Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. Install Mumble Overlay Overlay Upgrade Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. Upgrade Mumble Overlay Display a frame counter in the overlay Show FPS counter Load an overlay preset from file Load… Ŝargi.. Save your overlay settings to file Save… Konservi... Set the overlay font. Set the overlay text color. Color Koloro Remove Forigi Font Tiparo FPS and Clock Display Display a clock in the overlay showing the current local time (system time). Show Clock Montri horloĝon Overlay Exceptions Overlay Exception Mode Allowed launchers Add Allowed programs Allowed paths Blacklisted programs OverlayEditor State Stato User is not talking Uzanto ne estas parolanta Passive User is talking in your channel or a linked channel La uzanto estas parolanta en aŭ via kanalo aŭ ligita kanalo. Talking Parolante User is whispering to you privately La uzanto estas flustranta private al vi Private Whisper Privata Flustro User is shouting to your channel Channel Whisper Kanala Flustro Zoom Zoom Factor Enabled Elements User avatar, chosen by each user Avatar Avataro User's name Nomo de la uzanto Username Uzantnomo Name of user's channel, if outside your current channel Channel Kanalo Muted or deafened Mutigite aŭ surdigite Mute state Mutstato Bounding box, automatically shrunk to minimum size to contain all visible elements Bounding box Limiga kesto Overlay Editor OverlayEditorScene Layout preset Large square avatar Avatar and Name Avataro kaj Nomo User Opacity %1% %1% Object Opacity Alignment Ĝisrandigo Left Maldekstra Center Centra Right Dekstra Top Supra Bottom Malsupra Color... Koloro... Font... Tiparo... Bounding box Limiga kesto Pen width Padding Pen color Fill color Pick pen color Pick fill color Pick color Pick font PluginConfig Plugins Plugin has no configure function. Plugin has no about function. Options Opcioj Enable plugins and transmit positional information This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. Link to Game and Transmit Position Reloads all plugins This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. &Reload plugins Information about plugin Informoj pri la kromprogramo This shows a small information message about the plugin. &About &Pri Show configuration page of plugin This shows the configuration page of the plugin, if any. &Configure &Agordi Name Nomo Enabled Plugins Skipping plugin update in debug mode. Downloaded new or updated plugin to %1. Failed to install new plugin to %1. %1 lost link. %1 linked. PortAudioSystem Default Device PulseAudioSystem Default Input Default Output QApplication Failed to restart mumble Mumble failed to restart itself. Please restart it manually. RichTextEditor Failed to load image Image file too large to embed in document. Please use images smaller than %1 kB. Message is too long. Display Source Text Font-texto &Bold &Grase Ctrl+B Ctrl+B &Italic &Kursive Italic Kursive Ctrl+I Ctrl+I Underline Substrekite Ctrl+U Ctrl+U Color Koloro Insert Link Enmeti Ligilon Ctrl+L Ctrl+L Insert Image Enmeti Bildon RichTextEditorLink Add Link Aldoni Ligilon URL URL Text Teksto ServerHandler Unable to resolve hostname Server is not responding to TCP pings UDP packets cannot be sent to or received from the server. Switching to TCP mode. UDP packets cannot be sent to the server. Switching to TCP mode. UDP packets cannot be received from the server. Switching to TCP mode. UDP packets can be sent to and received from the server. Switching back to UDP mode. Connection timed out ServerView Favorite LAN LAN Public Internet Publika Interreto Unknown Africa Afriko Asia Azio North America Nord-ameriko South America Sud-ameriko Europe Eŭropo Oceania Oceanio ShortcutActionWidget Unassigned Neatribuite ShortcutDelegate On En Off Malŝaltita Toggle Baskuligi Unassigned Neatribuite ShortcutKeyWidget Press Shortcut Premi Fulmoklavon ShortcutTargetDialog Root Radiko Parent Patro Current Aktuala Subchannel #%1 La %1a Subkanalo ShortcutTargetWidget ... ... , , Root Radiko Parent Patro Current Aktuala Subchannel #%1 La %1a Subkanalo Invalid Nevalide Empty <Empty> Malplene ShortcutToggleWidget Off Malŝaltita Toggle Baskule On Ŝaltite TextMessage Enter text Enigu tekston If checked the message is recursively sent to all subchannels Send recursively to subchannels Tokens Empty Token Mumble - Access Tokens Mumble - Atingoĵetonoj List of access tokens on current server Listo da atingoĵetonoj en aktuala servilo <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. Add a token Aldoni ĵetonon &Add &Aldoni Remove a token Forigi ĵetonon &Remove &Forigi UserEdit Registered Users Registritaj Uzantoj Remove Forigi Rename Alinomi Who are you looking for? Days Tagoj Weeks Semajnoj Months Monatoj Years Jaroj Inactive for Registered users: %n account(s) Registritaj uzantoj: %n konto(j)Registritaj uzantoj: %n konto(j) UserInformation User Information Informoj de la Uzanto Connection Information Informoj de la Konekto Version Versio OS Certificate Atestilo IP Address IP-adreso CELT Versions Details... Detaloj... Ping Statistics Pings received Average ping TCP (Control) UDP (Voice) UDP Network statistics Good Bone Late Lost Resync From Client To Client Connection time %1w %1sem %1d %1t %1h %1h %1m %1m %1s %1s , , %1 (%2) %1.%2.%3 (%4) %1 (%2) Supported Suptenate Not Supported Nesuptenate Not Reported %1 online (%2 idle) %1 online %1 konektita %1 kbit/s Bandwidth GroupBox Bandwidth Label Ping deviation UserListModel Nick Kromnomo Inactive days Last channel Last seen: %1 Never Neniam Channel ID: %1 UserLocalVolumeDialog Local volume for other users <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. Adjusting local volume for %1 dB <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: Talking to your channel. Shouting directly to your channel. Whispering directly to your channel. Whispering directly to you. Not talking. This is a channel on the server. The icon indicates the state of the channel: Your current channel. A channel that is linked with your channel. Linked channels can talk to each other. A channel on the server that you are not linked to. This shows the flags the user has on the server, if any: On your friend list Authenticated user Muted (manually muted by self) Muted (manually muted by admin) Muted (not allowed to speak in current channel) Muted (muted by you, only on your machine) Muted (push-to-mute) Deafened (by self) Deafened (by admin) User has a new comment set (click to show) User has a comment set, which you've already seen. (click to show) Ignoring Text Messages This shows the flags the channel has, if any: Channel has a new comment set (click to show) Channel has a comment set, which you've already seen. (click to show) Channel will be hidden when filtering is enabled Name Nomo Flags Are you sure you want to drag this user? Are you sure you want to drag this channel? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. VersionCheck Upgrade Mumble A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? Failed to launch snapshot installer. Corrupt download of new version detected. Automatically removed. Downloading new snapshot from %1 to %2 Failed to write new version to disk. Failed to write new version to disc. Mumble failed to retrieve version information from the central server. ViewCert Certificate Chain Details Certificate chain Certificate details Detaloj de la atestilo Common Name Organization Subunit Country Locality State Valid from: %1 Valid to: %1 Serial: %1 Public Key: %1 bits %2 RSA DSA Digest (SHA-1): %1 Digest (SHA-256): %1 Email: %1 Retpoŝto: %1 DNS: %1 DNS: %1 Issued by: Unit Name VoiceRecorder Recorder failed to create directory '%1' Recorder failed to open file '%1' .wav - Uncompressed .ogg (Vorbis) - Compressed .au - Uncompressed .flac - Lossless compressed VoiceRecorderDialog Recorder Control 00:00:00 00:00:00 &Start S&top Mode Reĝimo Multichannel Output Eligo Output format Target directory Filename Dosiernomo &Browse... &Foliumi Valid variables are: Inserts the user's name Inserts the current date Inserts the current time Inserts the hostname Enmetas la nomon de gastiga komputilo Recorder still running Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? Unable to start recording. Not connected to a server. The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. There is already a recorder active for this server. Please select a recording format. Stopping Select target directory Elekti celdosieron Downmix WASAPIInput Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone. WASAPISystem Default Device Defaŭlta aparato qwPTTButtonWidget Mumble PTT Mumble PPP Push to talk Premi por paroli mumble-1.3.4/src/mumble/ClientUser.h0000664000175000017500000000434014010707273017140 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_CLIENTUSER_H_ #define MUMBLE_MUMBLE_CLIENTUSER_H_ #include #include "User.h" #include "Timer.h" #include "Settings.h" class ClientUser : public QObject, public User { private: Q_OBJECT Q_DISABLE_COPY(ClientUser) public: Settings::TalkState tsState; Timer tLastTalkStateChange; bool bLocalIgnore; bool bLocalMute; float fPowerMin, fPowerMax; float fAverageAvailable; float fLocalVolume; int iFrames; int iSequence; QByteArray qbaTextureFormat; QString qsFriendName; QString getFlagsString() const; ClientUser(QObject *p = NULL); /** * Determines whether a user is active or not * A user is active when it is currently speaking or when the user has * spoken within Settings::uiActiveTime amount of seconds. */ bool isActive(); static QHash c_qmUsers; static QReadWriteLock c_qrwlUsers; static QList c_qlTalking; static QReadWriteLock c_qrwlTalking; static QList getTalking(); static QList getActive(); static void sortUsersOverlay(QList &list); static ClientUser *get(unsigned int); static bool isValid(unsigned int); static ClientUser *add(unsigned int, QObject *p = NULL); static ClientUser *match(const ClientUser *p, bool matchname = false); static void remove(unsigned int); static void remove(ClientUser *); protected: static bool lessThanOverlay(const ClientUser *, const ClientUser *); public slots: void setTalking(Settings::TalkState ts); void setMute(bool mute); void setDeaf(bool deaf); void setSuppress(bool suppress); void setLocalIgnore(bool ignore); void setLocalMute(bool mute); void setSelfMute(bool mute); void setSelfDeaf(bool deaf); void setPrioritySpeaker(bool priority); void setRecording(bool recording); signals: void talkingStateChanged(); void muteDeafStateChanged(); void prioritySpeakerStateChanged(); void recordingStateChanged(); }; #endif mumble-1.3.4/src/mumble/OSS.h0000664000175000017500000000140614010707273015527 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_OSS_H_ #define MUMBLE_MUMBLE_OSS_H_ #include "AudioInput.h" #include "AudioOutput.h" class OSSInput : public AudioInput { private: Q_OBJECT Q_DISABLE_COPY(OSSInput) protected: void release(); public: OSSInput(); ~OSSInput() Q_DECL_OVERRIDE; void run() Q_DECL_OVERRIDE; }; class OSSOutput : public AudioOutput { friend class OSSUser; private: Q_OBJECT Q_DISABLE_COPY(OSSOutput) public: OSSOutput(); ~OSSOutput() Q_DECL_OVERRIDE; void run() Q_DECL_OVERRIDE; }; #endif mumble-1.3.4/src/mumble/Tokens.ui0000664000175000017500000000620314010707273016514 0ustar builderbuilder Tokens 0 0 514 659 Mumble - Access Tokens List of access tokens on current server <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed true QAbstractItemView::MultiSelection true Add a token &Add Remove a token &Remove Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok qlwTokens qpbAdd qpbRemove qbbButtons qbbButtons accepted() Tokens accept() 227 617 157 274 qbbButtons rejected() Tokens reject() 295 623 286 274 mumble-1.3.4/src/mumble/OverlayConfig.cpp0000664000175000017500000006265614010707273020203 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "OverlayConfig.h" #include "Overlay.h" #include "OverlayUserGroup.h" #include "OverlayPositionableItem.h" #include "OverlayText.h" #include "User.h" #include "Channel.h" #include "Message.h" #include "Database.h" #include "NetworkConfig.h" #include "ServerHandler.h" #include "MainWindow.h" #include "GlobalShortcut.h" #include "PathListWidget.h" // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" #ifdef Q_OS_WIN #include "../../overlay/overlay_launchers.h" #include "../../overlay/overlay_whitelist.h" #include "../../overlay/overlay_blacklist.h" #endif static const int OVERLAYCONFIG_PATH_ROLE = Qt::UserRole; static const int OVERLAYCONFIG_BUILTIN_ROLE = Qt::UserRole + 1; // Hide overlay config for Mac OS X universal builds #if !defined(USE_MAC_UNIVERSAL) static ConfigWidget *OverlayConfigDialogNew(Settings &st) { return new OverlayConfig(st); } static ConfigRegistrar registrar(6000, OverlayConfigDialogNew); #endif void OverlayConfig::initDisplayFps() { // set up FPS preview qgsFpsPreview.clear(); qgsFpsPreview.setBackgroundBrush(qgvFpsPreview->backgroundBrush()); qgpiFpsDemo = new QGraphicsPixmapItem(); refreshFpsDemo(); qgsFpsPreview.addItem(qgpiFpsDemo); qgpiFpsDemo->show(); qgvFpsPreview->setScene(&qgsFpsPreview); qgvFpsPreview->centerOn(qgpiFpsDemo); qgpiFpsLive = new OverlayPositionableItem(&s.os.qrfFps, true); qgpiFpsLive->setZValue(-2.0f); refreshFpsLive(); } void OverlayConfig::initDisplayClock() { qgpiTimeLive = new OverlayPositionableItem(&s.os.qrfTime, true); qgpiTimeLive->setZValue(-2.0f); refreshTimeLive(); } void OverlayConfig::initDisplay() { // set up overlay preview qgpiScreen = new QGraphicsPixmapItem(); qgpiScreen->setPixmap(qpScreen); qgpiScreen->setOpacity(0.5f); qgpiScreen->setZValue(-10.0f); initDisplayFps(); initDisplayClock(); qgtiInstructions = new QGraphicsTextItem(); qgtiInstructions->setHtml(QString::fromLatin1("

  • %1
  • %2
  • %3
").arg( tr("To move the users, drag the little red dot."), tr("To resize the users, mouse wheel over a user."), tr("For more options, right click a user.") )); qgtiInstructions->setOpacity(1.0f); qgtiInstructions->setZValue(-5.0f); qgtiInstructions->setDefaultTextColor(Qt::white); qgs.clear(); qgs.setSceneRect(QRectF(0, 0, qgpiScreen->pixmap().width(), qgpiScreen->pixmap().height())); qgs.setBackgroundBrush(qgvView->backgroundBrush()); qgs.addItem(qgpiScreen); qgpiScreen->show(); qgs.addItem(qgpiFpsLive); qgpiFpsLive->show(); qgs.addItem(qgpiTimeLive); qgpiTimeLive->show(); oug = new OverlayUserGroup(&s.os); oug->bShowExamples = true; qgs.addItem(oug); oug->show(); qgs.addItem(qgtiInstructions); qgtiInstructions->show(); qgvView->setScene(&qgs); qgvView->installEventFilter(this); } void OverlayConfig::refreshFpsDemo() { bpFpsDemo = OverlayTextLine(QString::fromLatin1("%1").arg(42), s.os.qfFps).createPixmap(s.os.qcFps); qgpiFpsDemo->setPixmap(bpFpsDemo); qgvFpsPreview->centerOn(qgpiFpsDemo); } void OverlayConfig::refreshFpsLive() { if (s.os.bFps) { qgpiFpsLive->setPixmap(bpFpsDemo.scaled(bpFpsDemo.size() * fViewScale)); qgpiFpsLive->setOffset((-bpFpsDemo.qpBasePoint + QPoint(0, bpFpsDemo.iAscent)) * fViewScale); } else { qgpiFpsLive->setPixmap(QPixmap()); } qgpiFpsLive->setItemVisible(s.os.bFps); } void OverlayConfig::refreshTimeLive() { if (s.os.bTime) { bpTimeDemo = OverlayTextLine(QString::fromLatin1("%1").arg(QTime::currentTime().toString()), s.os.qfFps).createPixmap(s.os.qcFps); qgpiTimeLive->setPixmap(bpTimeDemo.scaled(bpTimeDemo.size() * fViewScale)); qgpiTimeLive->setOffset((-bpTimeDemo.qpBasePoint + QPoint(0, bpTimeDemo.iAscent)) * fViewScale); } else { qgpiTimeLive->setPixmap(QPixmap()); } qgpiTimeLive->setItemVisible(s.os.bTime); } OverlayConfig::OverlayConfig(Settings &st) : ConfigWidget(st), qgpiScreen(NULL), qgs(), qgsFpsPreview(), qgpiFpsDemo(NULL), oug(NULL), qgtiInstructions(NULL), fViewScale(1.0f) { setupUi(this); qlwPaths->setPathType(PathListWidget::FOLDER); qcbOverlayExclusionMode->insertItem(static_cast(OverlaySettings::LauncherFilterExclusionMode), tr("Launcher Filter")); qcbOverlayExclusionMode->insertItem(static_cast(OverlaySettings::WhitelistExclusionMode), tr("Whitelist")); qcbOverlayExclusionMode->insertItem(static_cast(OverlaySettings::BlacklistExclusionMode), tr("Blacklist")); qcbOverlayExclusionMode->setCurrentIndex(static_cast(OverlaySettings::LauncherFilterExclusionMode)); if (! isInstalled()) { qswOverlayPage->setCurrentWidget(qwOverlayInstall); } else if (needsUpgrade()) { qswOverlayPage->setCurrentWidget(qwOverlayUpgrade); } else { qswOverlayPage->setCurrentWidget(qwOverlayConfig); qpbUninstall->setVisible(supportsInstallableOverlay()); } // grab a desktop screenshot as background QRect dsg = QApplication::desktop()->screenGeometry(); #if QT_VERSION > 0x050000 qpScreen = QGuiApplication::primaryScreen()->grabWindow(QApplication::desktop()->winId()); #else qpScreen = QPixmap::grabWindow(QApplication::desktop()->winId(), dsg.x(), dsg.y(), dsg.width(), dsg.height()); #endif if (qpScreen.size().isEmpty()) { qWarning() << __FUNCTION__ << "failed to grab desktop image, trying desktop widget..."; qpScreen = QPixmap::grabWidget(QApplication::desktop(), dsg); if (qpScreen.size().isEmpty()) { qWarning() << __FUNCTION__ << "failed to grab desktop widget image, falling back."; QRect desktop_size = QApplication::desktop()->screenGeometry(); qpScreen = QPixmap(desktop_size.width(), desktop_size.height()); qpScreen.fill(Qt::darkGreen); } } initDisplay(); // Attach the upgrade button to the install click handler. Currently, the // actions they perform are the same. The distinction is only there to inform // users as to what's actually going on. connect(qpbUpgrade, SIGNAL(clicked()), this, SLOT(on_qpbInstall_clicked())); } void OverlayConfig::updateOverlayExclusionModeState() { OverlaySettings::OverlayExclusionMode exclusionMode = static_cast(qcbOverlayExclusionMode->currentIndex()); switch (exclusionMode) { case OverlaySettings::LauncherFilterExclusionMode: qwLaunchers->setHidden(false); qwWhitelist->setHidden(false); qwPaths->setHidden(false); qwBlacklist->setHidden(false); // Show all whitelist items (including built-in items) // in launcher filter mode. for (int i = 0; i < qlwWhitelist->count(); i++) { QListWidgetItem *item = qlwWhitelist->item(i); item->setHidden(false); } break; case OverlaySettings::WhitelistExclusionMode: qwLaunchers->setHidden(true); qwWhitelist->setHidden(false); qwPaths->setHidden(true); qwBlacklist->setHidden(true); // Hide the built-in items when in WhitelistExclusionMode. // They are only considered in launcher filter mode. for (int i = 0; i < qlwWhitelist->count(); i++) { QListWidgetItem *item = qlwWhitelist->item(i); bool isBuiltin = item->data(OVERLAYCONFIG_BUILTIN_ROLE).toBool(); if (isBuiltin) { item->setHidden(true); } else { item->setHidden(false); } } break; case OverlaySettings::BlacklistExclusionMode: qwLaunchers->setHidden(true); qwWhitelist->setHidden(true); qwPaths->setHidden(true); qwBlacklist->setHidden(false); break; } } void OverlayConfig::load(const Settings &r) { s.os = r.os; loadCheckBox(qcbEnable, s.os.bEnable); qcbShowFps->setChecked(s.os.bFps); qcbShowTime->setChecked(s.os.bTime); qgpFps->setEnabled(s.os.bEnable); qcbOverlayExclusionMode->setCurrentIndex(static_cast(s.os.oemOverlayExcludeMode)); // Launchers { qlwLaunchers->clear(); QStringList builtinLaunchers; #ifdef Q_OS_WIN int i = 0; while (overlayLaunchers[i]) { QString str = QLatin1String(overlayLaunchers[i]); builtinLaunchers << str; ++i; } #endif foreach (QString str, builtinLaunchers) { OverlayAppInfo oai = OverlayAppInfo::applicationInfoForId(str); QListWidgetItem *qlwiApplication = new QListWidgetItem(oai.qiIcon, oai.qsDisplayName, qlwLaunchers); qlwiApplication->setData(OVERLAYCONFIG_PATH_ROLE, QVariant(str)); qlwiApplication->setData(OVERLAYCONFIG_BUILTIN_ROLE, QVariant(true)); // Use italic for 'default' items. QFont font = qlwiApplication->font(); font.setItalic(true); qlwiApplication->setFont(font); qlwiApplication->setFlags(qlwiApplication->flags() | Qt::ItemIsUserCheckable); if (s.os.qslLaunchersExclude.contains(str)) { qlwiApplication->setCheckState(Qt::Unchecked); } else { qlwiApplication->setCheckState(Qt::Checked); } } foreach(QString str, s.os.qslLaunchers) { if (builtinLaunchers.contains(str)) { continue; } OverlayAppInfo oai = OverlayAppInfo::applicationInfoForId(str); QListWidgetItem *qlwiApplication = new QListWidgetItem(oai.qiIcon, oai.qsDisplayName, qlwLaunchers); qlwiApplication->setData(OVERLAYCONFIG_PATH_ROLE, QVariant(str)); qlwiApplication->setData(OVERLAYCONFIG_BUILTIN_ROLE, QVariant(false)); } } // Whitelist { qlwWhitelist->clear(); QStringList builtinWhitelist; #ifdef Q_OS_WIN int i = 0; while (overlayWhitelist[i]) { QString str = QLatin1String(overlayWhitelist[i]); builtinWhitelist << str; ++i; } #endif foreach (QString str, builtinWhitelist) { OverlayAppInfo oai = OverlayAppInfo::applicationInfoForId(str); QListWidgetItem *qlwiApplication = new QListWidgetItem(oai.qiIcon, oai.qsDisplayName, qlwWhitelist); qlwiApplication->setData(OVERLAYCONFIG_PATH_ROLE, QVariant(str)); qlwiApplication->setData(OVERLAYCONFIG_BUILTIN_ROLE, QVariant(true)); // Use italic for 'default' items. QFont font = qlwiApplication->font(); font.setItalic(true); qlwiApplication->setFont(font); qlwiApplication->setFlags(qlwiApplication->flags() | Qt::ItemIsUserCheckable); if (s.os.qslWhitelistExclude.contains(str)) { qlwiApplication->setCheckState(Qt::Unchecked); } else { qlwiApplication->setCheckState(Qt::Checked); } } foreach(QString str, s.os.qslWhitelist) { if (builtinWhitelist.contains(str)) { continue; } OverlayAppInfo oai = OverlayAppInfo::applicationInfoForId(str); QListWidgetItem *qlwiApplication = new QListWidgetItem(oai.qiIcon, oai.qsDisplayName, qlwWhitelist); qlwiApplication->setData(OVERLAYCONFIG_PATH_ROLE, QVariant(str)); qlwiApplication->setData(OVERLAYCONFIG_BUILTIN_ROLE, QVariant(false)); } } // Paths { qlwPaths->clear(); foreach(QString str, s.os.qslPaths) { QListWidgetItem *qlwiApplication = new QListWidgetItem(QIcon(), str, qlwPaths); qlwiApplication->setData(OVERLAYCONFIG_PATH_ROLE, QVariant(str)); qlwiApplication->setData(OVERLAYCONFIG_BUILTIN_ROLE, QVariant(false)); } } // Blacklist { qlwBlacklist->clear(); QStringList builtinBlacklist; #ifdef Q_OS_WIN int i = 0; while (overlayBlacklist[i]) { QString str = QLatin1String(overlayBlacklist[i]); builtinBlacklist << str; ++i; } #endif foreach (QString str, builtinBlacklist) { OverlayAppInfo oai = OverlayAppInfo::applicationInfoForId(str); QListWidgetItem *qlwiApplication = new QListWidgetItem(oai.qiIcon, oai.qsDisplayName, qlwBlacklist); qlwiApplication->setData(OVERLAYCONFIG_PATH_ROLE, QVariant(str)); qlwiApplication->setData(OVERLAYCONFIG_BUILTIN_ROLE, QVariant(true)); // Use italic for 'default' items. QFont font = qlwiApplication->font(); font.setItalic(true); qlwiApplication->setFont(font); qlwiApplication->setFlags(qlwiApplication->flags() | Qt::ItemIsUserCheckable); if (s.os.qslBlacklistExclude.contains(str)) { qlwiApplication->setCheckState(Qt::Unchecked); } else { qlwiApplication->setCheckState(Qt::Checked); } } foreach(QString str, s.os.qslBlacklist) { if (builtinBlacklist.contains(str)) { continue; } OverlayAppInfo oai = OverlayAppInfo::applicationInfoForId(str); QListWidgetItem *qlwiApplication = new QListWidgetItem(oai.qiIcon, oai.qsDisplayName, qlwBlacklist); qlwiApplication->setData(OVERLAYCONFIG_PATH_ROLE, QVariant(str)); qlwiApplication->setData(OVERLAYCONFIG_BUILTIN_ROLE, QVariant(false)); } } initDisplay(); resizeScene(true); update(); } QString OverlayConfig::title() const { return tr("Overlay"); } QIcon OverlayConfig::icon() const { return QIcon(QLatin1String("skin:config_osd.png")); } void OverlayConfig::save() const { s.os.bEnable = qcbEnable->isChecked(); s.os.bFps = qcbShowFps->isChecked(); s.os.bTime = qcbShowTime->isChecked(); // Directly save overlay config s.os.oemOverlayExcludeMode = static_cast(qcbOverlayExclusionMode->currentIndex()); // Launchers { s.os.qslLaunchers.clear(); s.os.qslLaunchersExclude.clear(); for (int i = 0; i < qlwLaunchers->count(); i++) { bool isBuiltin = (qlwLaunchers->item(i)->data(OVERLAYCONFIG_BUILTIN_ROLE).toBool()); bool isChecked = false; if (isBuiltin) { isChecked = qlwLaunchers->item(i)->checkState() == Qt::Checked; } QString str = qlwLaunchers->item(i)->data(OVERLAYCONFIG_PATH_ROLE).toString(); if (isBuiltin) { if (!isChecked) { s.os.qslLaunchersExclude << str; } } else { s.os.qslLaunchers << str; } } } // Whitelist { s.os.qslWhitelist.clear(); s.os.qslWhitelistExclude.clear(); for (int i = 0; i < qlwWhitelist->count(); i++) { bool isBuiltin = (qlwWhitelist->item(i)->data(OVERLAYCONFIG_BUILTIN_ROLE).toBool()); bool isChecked = false; if (isBuiltin) { isChecked = qlwWhitelist->item(i)->checkState() == Qt::Checked; } QString str = qlwWhitelist->item(i)->data(OVERLAYCONFIG_PATH_ROLE).toString(); if (isBuiltin) { if (!isChecked) { s.os.qslWhitelistExclude << str; } } else { s.os.qslWhitelist << str; } } } // Paths { s.os.qslPaths.clear(); s.os.qslPathsExclude.clear(); for (int i = 0; i < qlwPaths->count(); i++) { bool isBuiltin = (qlwPaths->item(i)->data(OVERLAYCONFIG_BUILTIN_ROLE).toBool()); bool isChecked = false; if (isBuiltin) { isChecked = qlwPaths->item(i)->checkState() == Qt::Checked; } QString str = qlwPaths->item(i)->data(OVERLAYCONFIG_PATH_ROLE).toString(); if (isBuiltin) { if (!isChecked) { s.os.qslPathsExclude << str; } } else { s.os.qslPaths << str; } } } // Blacklist { s.os.qslBlacklist.clear(); s.os.qslBlacklistExclude.clear(); for (int i = 0; i < qlwBlacklist->count(); i++) { bool isBuiltin = (qlwBlacklist->item(i)->data(OVERLAYCONFIG_BUILTIN_ROLE).toBool()); bool isChecked = false; if (isBuiltin) { isChecked = qlwBlacklist->item(i)->checkState() == Qt::Checked; } QString str = qlwBlacklist->item(i)->data(OVERLAYCONFIG_PATH_ROLE).toString(); if (isBuiltin) { if (!isChecked) { s.os.qslBlacklistExclude << str; } } else { s.os.qslBlacklist << str; } } } g.qs->beginGroup(QLatin1String("overlay")); s.os.save(); g.qs->endGroup(); #ifdef Q_OS_WIN // On MS windows force sync so the registry is updated. g.qs->sync(); #endif } void OverlayConfig::accept() const { g.o->forceSettings(); g.o->setActive(s.os.bEnable); } bool OverlayConfig::eventFilter(QObject *obj, QEvent *evt) { if (evt->type() == QEvent::Resize) QMetaObject::invokeMethod(this, "resizeScene", Qt::QueuedConnection); return ConfigWidget::eventFilter(obj, evt); } void OverlayConfig::resizeScene(bool force) { QSize sz = qgvView->viewport()->size(); int ph = qgpiScreen->pixmap().height(); int pw = qgpiScreen->pixmap().width(); if (!force && ((ph == sz.height() && pw <= sz.width()) || (ph <= sz.height() && pw == sz.width()))) { return; } qgpiScreen->setPixmap(qpScreen.scaled(sz, Qt::KeepAspectRatio, Qt::SmoothTransformation)); qgs.setSceneRect(QRectF(0, 0, qgpiScreen->pixmap().width(), qgpiScreen->pixmap().height())); fViewScale = static_cast(qgpiScreen->pixmap().height()) / static_cast(qpScreen.height()); refreshFpsLive(); refreshTimeLive(); QFont f = qgtiInstructions->font(); f.setPointSizeF(qgs.sceneRect().height() / 20.0f); qgtiInstructions->setFont(f); qgtiInstructions->setPos(qgs.sceneRect().width() / 20.0f, qgs.sceneRect().height() / 10.0f); qgtiInstructions->setTextWidth(qgs.sceneRect().width() * 18.0f / 20.0f); qgvView->fitInView(qgs.sceneRect(), Qt::KeepAspectRatio); oug->updateLayout(); oug->updateUsers(); qgpiFpsLive->updateRender(); qgpiTimeLive->updateRender(); } void OverlayConfig::on_qlwLaunchers_itemSelectionChanged() { QList items = qlwLaunchers->selectedItems(); if (items.isEmpty()) { qpbLaunchersRemove->setEnabled(false); return; } QListWidgetItem *item = items.at(0); bool isBuiltin = item->data(OVERLAYCONFIG_BUILTIN_ROLE).toBool(); if (isBuiltin) { qpbLaunchersRemove->setEnabled(false); } else { qpbLaunchersRemove->setEnabled(true); } } void OverlayConfig::on_qcbOverlayExclusionMode_currentIndexChanged(int) { updateOverlayExclusionModeState(); } void OverlayConfig::on_qpbLaunchersAdd_clicked() { #if defined(Q_OS_WIN) QString file = QFileDialog::getOpenFileName(this, tr("Choose executable"), QString(), QLatin1String("*.exe")); #elif defined(Q_OS_MAC) QString file = QFileDialog::getOpenFileName(this, tr("Choose application"), QString(), QLatin1String("*.app")); #else QString file = QString(); #endif if (! file.isEmpty()) { QString qsAppIdentifier = OverlayAppInfo::applicationIdentifierForPath(file); QStringList qslIdentifiers; for (int i = 0; i < qlwLaunchers->count(); i++) qslIdentifiers << qlwLaunchers->item(i)->data(Qt::UserRole).toString(); if (! qslIdentifiers.contains(qsAppIdentifier)) { OverlayAppInfo oai = OverlayAppInfo::applicationInfoForId(qsAppIdentifier); QListWidgetItem *qlwiApplication = new QListWidgetItem(oai.qiIcon, oai.qsDisplayName, qlwLaunchers); qlwiApplication->setData(Qt::UserRole, QVariant(qsAppIdentifier)); qlwLaunchers->setCurrentItem(qlwiApplication); } } } void OverlayConfig::on_qpbLaunchersRemove_clicked() { int row = qlwLaunchers->currentRow(); if (row != -1) delete qlwLaunchers->takeItem(row); } void OverlayConfig::on_qlwWhitelist_itemSelectionChanged() { QList items = qlwWhitelist->selectedItems(); if (items.isEmpty()) { qpbWhitelistRemove->setEnabled(false); return; } QListWidgetItem *item = items.at(0); bool isBuiltin = item->data(OVERLAYCONFIG_BUILTIN_ROLE).toBool(); if (isBuiltin) { qpbWhitelistRemove->setEnabled(false); } else { qpbWhitelistRemove->setEnabled(true); } } void OverlayConfig::addWhitelistPath(const QString &path) { QString qsAppIdentifier = OverlayAppInfo::applicationIdentifierForPath(path); QListWidget *sel = qlwWhitelist; QStringList qslIdentifiers; for (int i = 0; i < sel->count(); i++) qslIdentifiers << sel->item(i)->data(Qt::UserRole).toString(); if (! qslIdentifiers.contains(qsAppIdentifier)) { OverlayAppInfo oai = OverlayAppInfo::applicationInfoForId(qsAppIdentifier); QListWidgetItem *qlwiApplication = new QListWidgetItem(oai.qiIcon, oai.qsDisplayName, sel); qlwiApplication->setData(Qt::UserRole, QVariant(qsAppIdentifier)); sel->setCurrentItem(qlwiApplication); } } void OverlayConfig::on_qpbWhitelistAdd_clicked() { #if defined(Q_OS_WIN) QString file = QFileDialog::getOpenFileName(this, tr("Choose executable"), QString(), QLatin1String("*.exe")); #elif defined(Q_OS_MAC) QString file = QFileDialog::getOpenFileName(this, tr("Choose application"), QString(), QLatin1String("*.app")); #else QString file = QString(); #endif if (! file.isEmpty()) { addWhitelistPath(file); } } void OverlayConfig::on_qpbWhitelistRemove_clicked() { QListWidget *sel = qlwWhitelist; int row = sel->currentRow(); if (row != -1) delete sel->takeItem(row); } void OverlayConfig::on_qlwPaths_itemSelectionChanged() { QList items = qlwPaths->selectedItems(); if (items.isEmpty()) { qpbPathsRemove->setEnabled(false); return; } QListWidgetItem *item = items.at(0); bool isBuiltin = item->data(OVERLAYCONFIG_BUILTIN_ROLE).toBool(); if (isBuiltin) { qpbPathsRemove->setEnabled(false); } else { qpbPathsRemove->setEnabled(true); } } void OverlayConfig::on_qpbPathsAdd_clicked() { QString existingPath = QFileDialog::getExistingDirectory(this, tr("Choose path")); QString dir = QDir::toNativeSeparators(existingPath); QListWidget *sel = qlwPaths; QStringList qslIdentifiers; for (int i = 0; i < sel->count(); i++) qslIdentifiers << sel->item(i)->data(Qt::UserRole).toString(); if (! dir.isEmpty() && ! qslIdentifiers.contains(dir)) { QListWidgetItem *qlwiPath = new QListWidgetItem(QIcon(), dir, sel); qlwiPath->setData(Qt::UserRole, QVariant(dir)); sel->setCurrentItem(qlwiPath); } } void OverlayConfig::on_qpbPathsRemove_clicked() { int row = qlwPaths->currentRow(); if (row != -1) delete qlwPaths->takeItem(row); } void OverlayConfig::on_qlwBlacklist_itemSelectionChanged() { QList items = qlwBlacklist->selectedItems(); if (items.isEmpty()) { qpbBlacklistRemove->setEnabled(false); return; } QListWidgetItem *item = items.at(0); bool isBuiltin = item->data(OVERLAYCONFIG_BUILTIN_ROLE).toBool(); if (isBuiltin) { qpbBlacklistRemove->setEnabled(false); } else { qpbBlacklistRemove->setEnabled(true); } } void OverlayConfig::on_qpbBlacklistAdd_clicked() { #if defined(Q_OS_WIN) QString file = QFileDialog::getOpenFileName(this, tr("Choose executable"), QString(), QLatin1String("*.exe")); #elif defined(Q_OS_MAC) QString file = QFileDialog::getOpenFileName(this, tr("Choose application"), QString(), QLatin1String("*.app")); #else QString file = QString(); #endif if (! file.isEmpty()) { QString qsAppIdentifier = OverlayAppInfo::applicationIdentifierForPath(file); QListWidget *sel = qlwBlacklist; QStringList qslIdentifiers; for (int i = 0; i < sel->count(); i++) qslIdentifiers << sel->item(i)->data(Qt::UserRole).toString(); if (! qslIdentifiers.contains(qsAppIdentifier)) { OverlayAppInfo oai = OverlayAppInfo::applicationInfoForId(qsAppIdentifier); QListWidgetItem *qlwiApplication = new QListWidgetItem(oai.qiIcon, oai.qsDisplayName, sel); qlwiApplication->setData(Qt::UserRole, QVariant(qsAppIdentifier)); sel->setCurrentItem(qlwiApplication); } } } void OverlayConfig::on_qpbBlacklistRemove_clicked() { QListWidget *sel = qlwBlacklist; int row = sel->currentRow(); if (row != -1) delete sel->takeItem(row); } void OverlayConfig::on_qcbEnable_stateChanged(int state) { qgpFps->setEnabled(state == Qt::Checked); } void OverlayConfig::on_qpbInstall_clicked() { qpbInstall->setEnabled(false); if (installFiles()) { qswOverlayPage->setCurrentWidget(qwOverlayConfig); } qpbInstall->setEnabled(true); } void OverlayConfig::on_qpbUninstall_clicked() { qpbUninstall->setEnabled(false); if (uninstallFiles()) { qswOverlayPage->setCurrentWidget(qwOverlayInstall); } qpbUninstall->setEnabled(true); } void OverlayConfig::on_qcbShowFps_stateChanged(int state) { Q_UNUSED(state); s.os.bFps = qcbShowFps->isChecked(); refreshFpsLive(); } void OverlayConfig::on_qcbShowTime_stateChanged(int state) { Q_UNUSED(state); s.os.bTime = qcbShowTime->isChecked(); refreshTimeLive(); } void OverlayConfig::on_qpbFpsFont_clicked() { bool ok; QFont new_font = QFontDialog::getFont(&ok, s.os.qfFps); if (ok) { s.os.qfFps = new_font; refreshFpsDemo(); refreshFpsLive(); refreshTimeLive(); } } void OverlayConfig::on_qpbFpsColor_clicked() { QColor color = QColorDialog::getColor(s.os.qcFps); if (color.isValid()) { s.os.qcFps = color; refreshFpsDemo(); refreshFpsLive(); refreshTimeLive(); } } void OverlayConfig::on_qpbLoadPreset_clicked() { QString fn = QFileDialog::getOpenFileName(this, tr("Load Overlay Presets"), QDir::homePath(), tr("Mumble overlay presets (*.mumblelay)")); if (fn.isEmpty()) { return; } QSettings qs(fn, QSettings::IniFormat); OverlaySettings load_preset; qs.beginGroup(QLatin1String("overlay")); load_preset.load(&qs); qs.endGroup(); #ifdef Q_OS_WIN load_preset.qslLaunchers = s.os.qslLaunchers; load_preset.qslLaunchersExclude = s.os.qslLaunchersExclude; load_preset.qslWhitelist = s.os.qslWhitelist; load_preset.qslWhitelistExclude = s.os.qslWhitelistExclude; load_preset.qslPaths = s.os.qslPaths; load_preset.qslPathsExclude = s.os.qslPathsExclude; load_preset.qslBlacklist = s.os.qslBlacklist; load_preset.qslBlacklistExclude = s.os.qslBlacklistExclude; #endif load_preset.bEnable = s.os.bEnable; s.os = load_preset; load(s); } void OverlayConfig::on_qpbSavePreset_clicked() { QString fn = QFileDialog::getSaveFileName(this, tr("Save Overlay Presets"), QDir::homePath(), tr("Mumble overlay presets (*.mumblelay)")); if (fn.isEmpty()) { return; } QSettings qs(fn, QSettings::IniFormat); if (!qs.isWritable()) { qWarning() << __FUNCTION__ << "preset save file" << fn << "is not writable!"; return; } qs.beginGroup(QLatin1String("overlay")); s.os.save(&qs); qs.remove(QLatin1String("enable")); qs.remove(QLatin1String("usewhitelist")); qs.remove(QLatin1String("blacklist")); qs.remove(QLatin1String("whitelist")); qs.remove(QLatin1String("enablelauncherfilter")); qs.remove(QLatin1String("launchers")); qs.endGroup(); } mumble-1.3.4/src/mumble/ACLEditor.cpp0000664000175000017500000006147114010707273017174 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "ACLEditor.h" #include "ACL.h" #include "Channel.h" #include "ClientUser.h" #include "Database.h" #include "Log.h" #include "ServerHandler.h" #include "User.h" // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" ACLGroup::ACLGroup(const QString &name) : Group(NULL, name) { bInherited = false; } ACLEditor::ACLEditor(int channelparentid, QWidget *p) : QDialog(p) { // Simple constructor for add channel menu bAddChannelMode = true; iChannel = channelparentid; setupUi(this); qsbChannelPosition->setRange(INT_MIN, INT_MAX); setWindowTitle(tr("Mumble - Add channel")); qtwTab->removeTab(2); qtwTab->removeTab(1); // Until I come around implementing it hide the password fields qleChannelPassword->hide(); qlChannelPassword->hide(); if (g.sh->uiVersion >= 0x010300) { qsbChannelMaxUsers->setRange(0, INT_MAX); qsbChannelMaxUsers->setValue(0); qsbChannelMaxUsers->setSpecialValueText(tr("Default server value")); } else { qlChannelMaxUsers->hide(); qsbChannelMaxUsers->hide(); } qlChannelID->hide(); qleChannelName->setFocus(); pcaPassword = NULL; adjustSize(); } ACLEditor::ACLEditor(int channelid, const MumbleProto::ACL &mea, QWidget *p) : QDialog(p) { QLabel *l; bAddChannelMode = false; iChannel = channelid; Channel *pChannel = Channel::get(iChannel); if (pChannel == NULL) { g.l->log(Log::Warning, tr("Failed: Invalid channel")); QDialog::reject(); return; } msg = mea; setupUi(this); qcbChannelTemporary->hide(); iId = mea.channel_id(); setWindowTitle(tr("Mumble - Edit %1").arg(Channel::get(iId)->qsName)); qlChannelID->setText(tr("ID: %1").arg(iId)); qleChannelName->setText(pChannel->qsName); if (channelid == 0) qleChannelName->setEnabled(false); rteChannelDescription->setText(pChannel->qsDesc); qsbChannelPosition->setRange(INT_MIN, INT_MAX); qsbChannelPosition->setValue(pChannel->iPosition); if (g.sh->uiVersion >= 0x010300) { qsbChannelMaxUsers->setRange(0, INT_MAX); qsbChannelMaxUsers->setValue(pChannel->uiMaxUsers); qsbChannelMaxUsers->setSpecialValueText(tr("Default server value")); } else { qlChannelMaxUsers->hide(); qsbChannelMaxUsers->hide(); } QGridLayout *grid = new QGridLayout(qgbACLpermissions); l = new QLabel(tr("Deny"), qgbACLpermissions); grid->addWidget(l, 0, 1); l = new QLabel(tr("Allow"), qgbACLpermissions); grid->addWidget(l, 0, 2); int idx = 1; for (int i = 0; i < ((iId == 0) ? 30 : 16); ++i) { ChanACL::Perm perm = static_cast(1 << i); QString name = ChanACL::permName(perm); if (! name.isEmpty()) { QCheckBox *qcb; l = new QLabel(name, qgbACLpermissions); grid->addWidget(l, idx, 0); qcb = new QCheckBox(qgbACLpermissions); qcb->setToolTip(tr("Deny %1").arg(name)); qcb->setWhatsThis(tr("This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.
%2").arg(name).arg(ChanACL::whatsThis(perm))); connect(qcb, SIGNAL(clicked(bool)), this, SLOT(ACLPermissions_clicked())); grid->addWidget(qcb, idx, 1); qlACLDeny << qcb; qcb = new QCheckBox(qgbACLpermissions); qcb->setToolTip(tr("Allow %1").arg(name)); qcb->setWhatsThis(tr("This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.
%2").arg(name).arg(ChanACL::whatsThis(perm))); connect(qcb, SIGNAL(clicked(bool)), this, SLOT(ACLPermissions_clicked())); grid->addWidget(qcb, idx, 2); qlACLAllow << qcb; qlPerms << perm; ++idx; } } QSpacerItem *si = new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding); grid->addItem(si, idx, 0); connect(qcbGroupAdd->lineEdit(), SIGNAL(returnPressed()), qpbGroupAddAdd, SLOT(animateClick())); connect(qcbGroupRemove->lineEdit(), SIGNAL(returnPressed()), qpbGroupRemoveAdd, SLOT(animateClick())); foreach(User *u, ClientUser::c_qmUsers) { if (u->iId >= 0) { qhNameCache.insert(u->iId, u->qsName); qhIDCache.insert(u->qsName.toLower(), u->iId); } } ChanACL *def = new ChanACL(NULL); def->bApplyHere = true; def->bApplySubs = true; def->bInherited = true; def->iUserId = -1; def->qsGroup = QLatin1String("all"); def->pAllow = ChanACL::Traverse | ChanACL::Enter | ChanACL::Speak | ChanACL::Whisper | ChanACL::TextMessage; def->pDeny = (~def->pAllow) & ChanACL::All; qlACLs << def; for (int i = 0; i < mea.acls_size(); ++i) { const MumbleProto::ACL_ChanACL &as = mea.acls(i); ChanACL *acl = new ChanACL(NULL); acl->bApplyHere = as.apply_here(); acl->bApplySubs = as.apply_subs(); acl->bInherited = as.inherited(); acl->iUserId = -1; if (as.has_user_id()) acl->iUserId = as.user_id(); else acl->qsGroup = u8(as.group()); acl->pAllow = static_cast(as.grant()); acl->pDeny = static_cast(as.deny()); qlACLs << acl; } for (int i = 0; i < mea.groups_size(); ++i) { const MumbleProto::ACL_ChanGroup &gs = mea.groups(i); ACLGroup *gp = new ACLGroup(u8(gs.name())); gp->bInherit = gs.inherit(); gp->bInherited = gs.inherited(); gp->bInheritable = gs.inheritable(); for (int j = 0; j < gs.add_size(); ++j) gp->qsAdd.insert(gs.add(j)); for (int j = 0; j < gs.remove_size(); ++j) gp->qsRemove.insert(gs.remove(j)); for (int j = 0; j < gs.inherited_members_size(); ++j) gp->qsTemporary.insert(gs.inherited_members(j)); qlGroups << gp; } iUnknown = -2; numInheritACL = -1; bInheritACL = mea.inherit_acls(); qcbACLInherit->setChecked(bInheritACL); foreach(ChanACL *acl, qlACLs) { if (acl->bInherited) numInheritACL++; } refill(GroupAdd); refill(GroupRemove); refill(GroupInherit); refill(ACLList); refillGroupNames(); ACLEnableCheck(); groupEnableCheck(); updatePasswordField(); qleChannelName->setFocus(); adjustSize(); } ACLEditor::~ACLEditor() { foreach(ChanACL *acl, qlACLs) { delete acl; } foreach(ACLGroup *gp, qlGroups) { delete gp; } } void ACLEditor::showEvent(QShowEvent *evt) { ACLEnableCheck(); QDialog::showEvent(evt); } void ACLEditor::accept() { Channel *pChannel = Channel::get(iChannel); if (pChannel == NULL) { // Channel gone while editing g.l->log(Log::Warning, tr("Failed: Invalid channel")); QDialog::reject(); return; } if (qleChannelName->text().isEmpty()) { // Empty channel name QMessageBox::warning(this, QLatin1String("Mumble"), tr("Channel must have a name"), QMessageBox::Ok); qleChannelName->setFocus(); return; } // Update channel state if (bAddChannelMode) { g.sh->createChannel(iChannel, qleChannelName->text(), rteChannelDescription->text(), qsbChannelPosition->value(), qcbChannelTemporary->isChecked(), qsbChannelMaxUsers->value()); } else { bool needs_update = false; updatePasswordACL(); MumbleProto::ChannelState mpcs; mpcs.set_channel_id(pChannel->iId); if (pChannel->qsName != qleChannelName->text()) { mpcs.set_name(u8(qleChannelName->text())); needs_update = true; } if (rteChannelDescription->isModified() && (pChannel->qsDesc != rteChannelDescription->text())) { const QString &descriptionText = rteChannelDescription->text(); mpcs.set_description(u8(descriptionText)); needs_update = true; g.db->setBlob(sha1(descriptionText), descriptionText.toUtf8()); } if (pChannel->iPosition != qsbChannelPosition->value()) { mpcs.set_position(qsbChannelPosition->value()); needs_update = true; } if (pChannel->uiMaxUsers != static_cast(qsbChannelMaxUsers->value())) { mpcs.set_max_users(qsbChannelMaxUsers->value()); needs_update = true; } if (needs_update) g.sh->sendMessage(mpcs); // Update ACL msg.set_inherit_acls(bInheritACL); msg.clear_acls(); msg.clear_groups(); foreach(ChanACL *acl, qlACLs) { if (acl->bInherited || (acl->iUserId < -1)) continue; MumbleProto::ACL_ChanACL *mpa = msg.add_acls(); mpa->set_apply_here(acl->bApplyHere); mpa->set_apply_subs(acl->bApplySubs); if (acl->iUserId != -1) mpa->set_user_id(acl->iUserId); else mpa->set_group(u8(acl->qsGroup)); mpa->set_grant(acl->pAllow); mpa->set_deny(acl->pDeny); } foreach(ACLGroup *gp, qlGroups) { if (gp->bInherited && gp->bInherit && gp->bInheritable && (gp->qsAdd.count() == 0) && (gp->qsRemove.count() == 0)) continue; MumbleProto::ACL_ChanGroup *mpg = msg.add_groups(); mpg->set_name(u8(gp->qsName)); mpg->set_inherit(gp->bInherit); mpg->set_inheritable(gp->bInheritable); foreach(int pid, gp->qsAdd) if (pid >= 0) mpg->add_add(pid); foreach(int pid, gp->qsRemove) if (pid >= 0) mpg->add_remove(pid); } g.sh->sendMessage(msg); } QDialog::accept(); } const QString ACLEditor::userName(int pid) { if (qhNameCache.contains(pid)) return qhNameCache.value(pid); else return QString::fromLatin1("#%1").arg(pid); } int ACLEditor::id(const QString &uname) { QString name = uname.toLower(); if (qhIDCache.contains(name)) { return qhIDCache.value(name); } else { if (! qhNameWait.contains(name)) { MumbleProto::QueryUsers mpuq; mpuq.add_names(u8(name)); g.sh->sendMessage(mpuq); iUnknown--; qhNameWait.insert(name, iUnknown); qhNameCache.insert(iUnknown, name); } return qhNameWait.value(name); } } void ACLEditor::returnQuery(const MumbleProto::QueryUsers &mqu) { if (mqu.names_size() != mqu.ids_size()) return; for (int i = 0; i < mqu.names_size(); ++i) { int pid = mqu.ids(i); QString name = u8(mqu.names(i)); QString lname = name.toLower(); qhIDCache.insert(lname, pid); qhNameCache.insert(pid, name); if (qhNameWait.contains(lname)) { int tid = qhNameWait.take(lname); foreach(ChanACL *acl, qlACLs) if (acl->iUserId == tid) acl->iUserId = pid; foreach(ACLGroup *gp, qlGroups) { if (gp->qsAdd.remove(tid)) gp->qsAdd.insert(pid); if (gp->qsRemove.remove(tid)) gp->qsRemove.insert(pid); } qhNameCache.remove(tid); } } refillGroupInherit(); refillGroupRemove(); refillGroupAdd(); refillComboBoxes(); refillACL(); } void ACLEditor::refill(WaitID wid) { switch (wid) { case ACLList: refillACL(); break; case GroupInherit: refillGroupInherit(); break; case GroupRemove: refillGroupRemove(); break; case GroupAdd: refillGroupAdd(); break; } } void ACLEditor::refillComboBoxes() { QList ql; ql << qcbGroupAdd; ql << qcbGroupRemove; ql << qcbACLUser; QStringList names = qhNameCache.values(); names.sort(); foreach(QComboBox *qcb, ql) { qcb->clear(); qcb->addItems(names); qcb->clearEditText(); } } void ACLEditor::refillACL() { int idx = qlwACLs->currentRow(); bool previousinherit = bInheritACL; bInheritACL = qcbACLInherit->isChecked(); qlwACLs->clear(); bool first = true; foreach(ChanACL *acl, qlACLs) { if (first) first = false; else if (! bInheritACL && acl->bInherited) continue; QString text; if (acl->iUserId == -1) text = QString::fromLatin1("@%1").arg(acl->qsGroup); else text = userName(acl->iUserId); QListWidgetItem *item = new QListWidgetItem(text, qlwACLs); if (acl->bInherited) { QFont f = item->font(); f.setItalic(true); item->setFont(f); } } if (bInheritACL && ! previousinherit && (idx != 0)) idx += numInheritACL; if (! bInheritACL && previousinherit) idx -= numInheritACL; qlwACLs->setCurrentRow(idx); } void ACLEditor::refillGroupNames() { QString text = qcbGroupList->currentText().toLower(); QStringList qsl; foreach(ACLGroup *gp, qlGroups) { qsl << gp->qsName; } qsl.sort(); qcbGroupList->clear(); foreach(QString name, qsl) { qcbGroupList->addItem(name); } int wantindex = qcbGroupList->findText(text, Qt::MatchFixedString); qcbGroupList->setCurrentIndex(wantindex); } ACLGroup *ACLEditor::currentGroup() { QString group = qcbGroupList->currentText(); foreach(ACLGroup *gp, qlGroups) if (gp->qsName == group) return gp; group = group.toLower(); foreach(ACLGroup *gp, qlGroups) if (gp->qsName == group) return gp; return NULL; } ChanACL *ACLEditor::currentACL() { int idx = qlwACLs->currentRow(); if (idx < 0) return NULL; if (idx && ! bInheritACL) idx += numInheritACL; return qlACLs[idx]; } void ACLEditor::fillWidgetFromSet(QListWidget *qlw, const QSet &qs) { qlw->clear(); QList ql; foreach(int pid, qs) { ql << idname(userName(pid), pid); } qStableSort(ql); foreach(idname i, ql) { QListWidgetItem *qlwi = new QListWidgetItem(i.first, qlw); qlwi->setData(Qt::UserRole, i.second); if (i.second < 0) { QFont f = qlwi->font(); f.setItalic(true); qlwi->setFont(f); } } } void ACLEditor::refillGroupAdd() { ACLGroup *gp = currentGroup(); if (! gp) return; fillWidgetFromSet(qlwGroupAdd, gp->qsAdd); } void ACLEditor::refillGroupRemove() { ACLGroup *gp = currentGroup(); if (! gp) return; fillWidgetFromSet(qlwGroupRemove, gp->qsRemove); } void ACLEditor::refillGroupInherit() { ACLGroup *gp = currentGroup(); if (! gp) return; fillWidgetFromSet(qlwGroupInherit, gp->qsTemporary); } void ACLEditor::groupEnableCheck() { ACLGroup *gp = currentGroup(); bool enabled; if (! gp) enabled = false; else enabled = gp->bInherit; qlwGroupRemove->setEnabled(enabled); qlwGroupInherit->setEnabled(enabled); qcbGroupRemove->setEnabled(enabled); qpbGroupRemoveAdd->setEnabled(enabled); qpbGroupRemoveRemove->setEnabled(enabled); qpbGroupInheritRemove->setEnabled(enabled); enabled = (gp != NULL); qlwGroupAdd->setEnabled(enabled); qcbGroupAdd->setEnabled(enabled); qpbGroupAddAdd->setEnabled(enabled); qpbGroupAddRemove->setEnabled(enabled); qcbGroupInherit->setEnabled(enabled); qcbGroupInheritable->setEnabled(enabled); if (gp) { qcbGroupInherit->setChecked(gp->bInherit); qcbGroupInheritable->setChecked(gp->bInheritable); qcbGroupInherited->setChecked(gp->bInherited); } } void ACLEditor::ACLEnableCheck() { ChanACL *as = currentACL(); bool enabled; if (! as) enabled = false; else enabled = ! as->bInherited; qpbACLRemove->setEnabled(enabled); qpbACLUp->setEnabled(enabled); qpbACLDown->setEnabled(enabled); qcbACLApplyHere->setEnabled(enabled); qcbACLApplySubs->setEnabled(enabled); qcbACLGroup->setEnabled(enabled); qcbACLUser->setEnabled(enabled); for (int idx = 0; idx < qlACLAllow.count(); idx++) { // Only enable other checkboxes if writeacl isn't set bool enablethis = enabled && (qlPerms[idx] == ChanACL::Write || !(as && (as->pAllow & ChanACL::Write)) || qlPerms[idx] == ChanACL::Speak); qlACLAllow[idx]->setEnabled(enablethis); qlACLDeny[idx]->setEnabled(enablethis); } if (as) { qcbACLApplyHere->setChecked(as->bApplyHere); qcbACLApplySubs->setChecked(as->bApplySubs); for (int idx = 0; idx < qlACLAllow.count(); idx++) { ChanACL::Perm p = qlPerms[idx]; qlACLAllow[idx]->setChecked(as->pAllow & p); qlACLDeny[idx]->setChecked(as->pDeny & p); } qcbACLGroup->clear(); qcbACLGroup->addItem(QString()); qcbACLGroup->addItem(QLatin1String("all")); qcbACLGroup->addItem(QLatin1String("auth")); qcbACLGroup->addItem(QLatin1String("in")); qcbACLGroup->addItem(QLatin1String("sub")); qcbACLGroup->addItem(QLatin1String("out")); qcbACLGroup->addItem(QLatin1String("~in")); qcbACLGroup->addItem(QLatin1String("~sub")); qcbACLGroup->addItem(QLatin1String("~out")); foreach(ACLGroup *gs, qlGroups) qcbACLGroup->addItem(gs->qsName); if (as->iUserId == -1) { qcbACLUser->clearEditText(); qcbACLGroup->addItem(as->qsGroup); qcbACLGroup->setCurrentIndex(qcbACLGroup->findText(as->qsGroup, Qt::MatchExactly)); } else { qcbACLUser->setEditText(userName(as->iUserId)); } } foreach(QAbstractButton *b, qdbbButtons->buttons()) { QPushButton *qpb = qobject_cast(b); if (qpb) { qpb->setAutoDefault(false); qpb->setDefault(false); } } } void ACLEditor::on_qtwTab_currentChanged(int index) { if (index == 0) { // Switched to property tab, update password field updatePasswordField(); } else if (index == 2) { // Switched to ACL tab, update ACL list updatePasswordACL(); refillACL(); } } void ACLEditor::updatePasswordField() { pcaPassword = NULL; foreach(ChanACL *acl, qlACLs) { // Check for sth that applies to '#' AND grants 'Enter' AND may grant 'Speak', 'Whisper', // 'TextMessage', 'Link' but NOTHING else AND does not deny anything, then '' is the password. if (acl->qsGroup.startsWith(QLatin1Char('#')) && acl->bApplyHere && !acl->bInherited && (acl->pAllow & ChanACL::Enter) && (acl->pAllow == (ChanACL::Enter | ChanACL::Speak | ChanACL::Whisper | ChanACL::TextMessage | ChanACL::LinkChannel) || // Backwards compat with old behaviour that didn't deny traverse acl->pAllow == (ChanACL::Enter | ChanACL::Speak | ChanACL::Whisper | ChanACL::TextMessage | ChanACL::LinkChannel | ChanACL::Traverse)) && acl->pDeny == ChanACL::None) { pcaPassword = acl; } } if (pcaPassword) qleChannelPassword->setText(pcaPassword->qsGroup.mid(1)); else qleChannelPassword->clear(); } void ACLEditor::updatePasswordACL() { if (qleChannelPassword->text().isEmpty()) { // Remove the password if we had one to begin with if (pcaPassword && qlACLs.removeOne(pcaPassword)) { delete pcaPassword; // Search and remove the @all deny ACL ChanACL *denyall = NULL; foreach(ChanACL *acl, qlACLs) { if (acl->qsGroup == QLatin1String("all") && acl->bInherited == false && acl->bApplyHere == true && acl->pAllow == ChanACL::None && (acl->pDeny == (ChanACL::Enter | ChanACL::Speak | ChanACL::Whisper | ChanACL::TextMessage | ChanACL::LinkChannel) || // Backwards compat with old behaviour that didn't deny traverse acl->pDeny == (ChanACL::Enter | ChanACL::Speak | ChanACL::Whisper | ChanACL::TextMessage | ChanACL::LinkChannel | ChanACL::Traverse))) { denyall = acl; } } if (denyall) { qlACLs.removeOne(denyall); delete denyall; } } } else { // Add or Update if (pcaPassword == NULL || !qlACLs.contains(pcaPassword)) { pcaPassword = new ChanACL(NULL); pcaPassword->bApplyHere = true; pcaPassword->bApplySubs = false; pcaPassword->bInherited = false; pcaPassword->pAllow = ChanACL::None; pcaPassword->pDeny = ChanACL::Enter | ChanACL::Speak | ChanACL::Whisper | ChanACL::TextMessage | ChanACL::LinkChannel | ChanACL::Traverse; pcaPassword->qsGroup = QLatin1String("all"); qlACLs << pcaPassword; pcaPassword = new ChanACL(NULL); pcaPassword->bApplyHere = true; pcaPassword->bApplySubs = false; pcaPassword->bInherited = false; pcaPassword->pAllow = ChanACL::Enter | ChanACL::Speak | ChanACL::Whisper | ChanACL::TextMessage | ChanACL::LinkChannel | ChanACL::Traverse; pcaPassword->pDeny = ChanACL::None; pcaPassword->qsGroup = QString(QLatin1String("#%1")).arg(qleChannelPassword->text()); qlACLs << pcaPassword; } else { pcaPassword->qsGroup = QString(QLatin1String("#%1")).arg(qleChannelPassword->text()); } } } void ACLEditor::on_qlwACLs_currentRowChanged() { ACLEnableCheck(); } void ACLEditor::on_qpbACLAdd_clicked() { ChanACL *as = new ChanACL(NULL); as->bApplyHere = true; as->bApplySubs = true; as->bInherited = false; as->qsGroup = QLatin1String("all"); as->iUserId = -1; as->pAllow = ChanACL::None; as->pDeny = ChanACL::None; qlACLs << as; refillACL(); qlwACLs->setCurrentRow(qlwACLs->count() - 1); } void ACLEditor::on_qpbACLRemove_clicked() { ChanACL *as = currentACL(); if (! as || as->bInherited) return; qlACLs.removeAll(as); delete as; refillACL(); } void ACLEditor::on_qpbACLUp_clicked() { ChanACL *as = currentACL(); if (! as || as->bInherited) return; int idx = qlACLs.indexOf(as); if (idx <= numInheritACL + 1) return; qlACLs.swap(idx - 1, idx); qlwACLs->setCurrentRow(qlwACLs->currentRow() - 1); refillACL(); } void ACLEditor::on_qpbACLDown_clicked() { ChanACL *as = currentACL(); if (! as || as->bInherited) return; int idx = qlACLs.indexOf(as) + 1; if (idx >= qlACLs.count()) return; qlACLs.swap(idx - 1, idx); qlwACLs->setCurrentRow(qlwACLs->currentRow() + 1); refillACL(); } void ACLEditor::on_qcbACLInherit_clicked(bool) { refillACL(); } void ACLEditor::on_qcbACLApplyHere_clicked(bool checked) { ChanACL *as = currentACL(); if (! as || as->bInherited) return; as->bApplyHere = checked; } void ACLEditor::on_qcbACLApplySubs_clicked(bool checked) { ChanACL *as = currentACL(); if (! as || as->bInherited) return; as->bApplySubs = checked; } void ACLEditor::on_qcbACLGroup_activated(const QString &text) { ChanACL *as = currentACL(); if (! as || as->bInherited) return; as->iUserId = -1; if (text.isEmpty()) { qcbACLGroup->setCurrentIndex(1); as->qsGroup = QLatin1String("all"); } else { qcbACLUser->clearEditText(); as->qsGroup = text; } refillACL(); } void ACLEditor::on_qcbACLUser_activated() { QString text = qcbACLUser->currentText(); ChanACL *as = currentACL(); if (! as || as->bInherited) return; if (text.isEmpty()) { as->iUserId = -1; if (qcbACLGroup->currentIndex() == 0) { qcbACLGroup->setCurrentIndex(1); as->qsGroup = QLatin1String("all"); } refillACL(); } else { qcbACLGroup->setCurrentIndex(0); as->iUserId = id(text); refillACL(); } } void ACLEditor::ACLPermissions_clicked() { QCheckBox *source = qobject_cast(sender()); ChanACL *as = currentACL(); if (! as || as->bInherited) return; int allowed = 0; int denied = 0; bool enabled = true; for (int idx = 0; idx < qlACLAllow.count(); idx++) { ChanACL::Perm p = qlPerms[idx]; if (qlACLAllow[idx]->isChecked() && qlACLDeny[idx]->isChecked()) { if (source == qlACLAllow[idx]) qlACLDeny[idx]->setChecked(false); else qlACLAllow[idx]->setChecked(false); } qlACLAllow[idx]->setEnabled(enabled || p == ChanACL::Speak); qlACLDeny[idx]->setEnabled(enabled || p == ChanACL::Speak); if (p == ChanACL::Write && qlACLAllow[idx]->isChecked()) enabled = false; if (qlACLAllow[idx]->isChecked()) allowed |= p; if (qlACLDeny[idx]->isChecked()) denied |= p; } as->pAllow = static_cast(allowed); as->pDeny = static_cast(denied); } void ACLEditor::on_qcbGroupList_activated(const QString &text) { ACLGroup *gs = currentGroup(); if (text.isEmpty()) return; if (! gs) { QString name = text.toLower(); gs = new ACLGroup(name); gs->bInherited = false; gs->bInherit = true; gs->bInheritable = true; gs->qsName = name; qlGroups << gs; } refillGroupNames(); refillGroupAdd(); refillGroupRemove(); refillGroupInherit(); groupEnableCheck(); qpbGroupAdd->setEnabled(false); } void ACLEditor::on_qcbGroupList_editTextChanged(const QString & text) { qpbGroupAdd->setEnabled(!text.isEmpty()); } void ACLEditor::on_qpbGroupAdd_clicked() { on_qcbGroupList_activated(qcbGroupList->currentText()); } void ACLEditor::on_qpbGroupRemove_clicked() { ACLGroup *gs = currentGroup(); if (! gs) return; if (gs->bInherited) { gs->bInheritable = true; gs->bInherit = true; gs->qsAdd.clear(); gs->qsRemove.clear(); } else { qlGroups.removeAll(gs); delete gs; } refillGroupNames(); refillGroupAdd(); refillGroupRemove(); refillGroupInherit(); groupEnableCheck(); } void ACLEditor::on_qcbGroupInherit_clicked(bool checked) { ACLGroup *gs = currentGroup(); if (! gs) return; gs->bInherit = checked; groupEnableCheck(); } void ACLEditor::on_qcbGroupInheritable_clicked(bool checked) { ACLGroup *gs = currentGroup(); if (! gs) return; gs->bInheritable = checked; } void ACLEditor::on_qpbGroupAddAdd_clicked() { ACLGroup *gs = currentGroup(); QString text = qcbGroupAdd->currentText(); if (! gs) return; if (text.isEmpty()) return; gs->qsAdd << id(text); refillGroupAdd(); qcbGroupAdd->clearEditText(); } void ACLEditor::on_qpbGroupAddRemove_clicked() { ACLGroup *gs = currentGroup(); if (! gs) return; QListWidgetItem *item = qlwGroupAdd->currentItem(); if (! item) return; gs->qsAdd.remove(item->data(Qt::UserRole).toInt()); refillGroupAdd(); qcbGroupRemove->clearEditText(); } void ACLEditor::on_qpbGroupRemoveAdd_clicked() { QString text = qcbGroupRemove->currentText(); ACLGroup *gs = currentGroup(); if (! gs) return; if (text.isEmpty()) return; gs->qsRemove << id(text); refillGroupRemove(); } void ACLEditor::on_qpbGroupRemoveRemove_clicked() { ACLGroup *gs = currentGroup(); if (! gs) return; QListWidgetItem *item = qlwGroupRemove->currentItem(); if (! item) return; gs->qsRemove.remove(item->data(Qt::UserRole).toInt()); refillGroupRemove(); } void ACLEditor::on_qpbGroupInheritRemove_clicked() { ACLGroup *gs = currentGroup(); if (! gs) return; QListWidgetItem *item = qlwGroupInherit->currentItem(); if (! item) return; gs->qsRemove.insert(item->data(Qt::UserRole).toInt()); refillGroupRemove(); } mumble-1.3.4/src/mumble/mumble_pl.ts0000664000175000017500000143226714010707274017255 0ustar builderbuilder ACLEditor Deny Zabroń Allow Zezwól Allow %1 Zezwól %1 Deny %1 Zabroń %1 Mumble - Add channel Mumble - Dodaj kanał Default server value Domyślna wartość serwera Failed: Invalid channel Niepowodzenie: Niepoprawny kanał Mumble - Edit %1 Mumble - Edycja %1 ID: %1 ID: %1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Przydziela uprawnienie: <i>%1</i>. Jeżeli uprawnienie jest jednocześnie dozwolone i zabronione, to jest zabronione.<br />%2 Channel must have a name Kanał musi mieć nazwę This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Odbiera uprawnienie: <i>%1</i>. Jeżeli uprawnienie jest jednocześnie dozwolone i zabronione, to jest zabronione.<br />%2 Dialog Dialog Name Nazwa Enter the channel name here. Wprowadź tutaj nazwę kanału. Description Opis Password Hasło Enter the channel password here. Wprowadź tutaj hasło dla kanału. Check to create a temporary channel. Zaznacz, aby utworzyć kanał tymczasowy. Temporary Tymczasowy <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Pozycja</b><br/> Ta wartość pozwala na zmianę sposobu w jaki są sortowane kanały. Kanał z wyższą wartością<i>Pozycja</i> będzie umieszczony poniżej niższej wartości i na odwrót. Jeżeli <i>Pozycja</i> dwóch kanałów jest identyczna zostaną one posortowane alfabetycznie. Position Pozycja &Groups &Grupy Group Grupa List of groups Lista zdefiniowanych grup Remove selected group Usuń wybraną grupę Remove Usuń Inherit group members from parent Dziedzicz członków grupy z grupy nadrzędnej Inherit Dziedzicz Make group inheritable to sub-channels Umożliw dziedziczenie grupy w pod-kanałach Inheritable Dziedziczny Group was inherited from parent channel Grupa została odziedziczona z kanału nadrzędnego Inherited Odziedziczony Members Członkowie Add Dodaj Add member to group Dodaj członka do grupy Remove member from group Usuń członka z grupy &ACL &ACL Active ACLs Aktywne reguły ACL List of entries Lista aktywnych reguł ACL Inherit ACL of parent? Dziedziczyć reguły ACL z kanałów nadrzędnych? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. Ustawia czy reguły ACL mają być dziedziczone z kanałów nadrzędnych. Tylko reguły, które w kanałach nadrzędnych są oznaczone jako "Dotyczy pod-kanałów" będą dziedziczone. Inherit ACLs Dziedzicz reguły ACL Move entry up Przenieś regułę w górę This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. Przenosi regułę w górę listy. Jako, że reguły są sprawdzane w kolejności, więc taka zmiana może mieć wpływ na uprawnienia użytkowników. Nie możesz przenieść reguły ponad regułę, z której są dziedziczone ACL, jeżeli naprawdę tego potrzebujesz duplikuj daną regułę. &Up W &górę Move entry down Przenieś regułę w dół This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. Przenosi regułę w dół listy. Jako, że reguły są sprawdzane w kolejności, więc taka zmiana może mieć wpływ na uprawnienia użytkowników. &Down W &dół Add new entry Dodaj nową regułę This adds a new entry, initially set with no permissions and applying to all. Dodaje nową regułę, która początkowo nie posiada uprawnień oraz jest zastosowana dla wszystkich. &Add &Dodaj Remove entry Usuń regułę This removes the currently selected entry. Usuwa aktualnie wybraną regułę. &Remove &Usuń Context Kontekst Entry should apply to this channel. Entry should apply to this channel Reguła powinna być stosowana do tego kanału. This makes the entry apply to this channel. Sprawia, że reguła dotyczy tego kanału. Applies to this channel Stosuj do tego kanału Entry should apply to sub-channels. Reguła powinna być stosowana do pod-kanałów. Add new group Dodaj nową grupę <b>Add</b><br/> Add a new group. <b>Dodaj</b><br/>Dodaje nową grupę. Inherited members Odziedziczeni członkowie Contains the list of members added to the group by this channel. Zawiera listę członków dodanych do grupy na tym kanale. Contains a list of members whose group membership will not be inherited from the parent channel. Zawiera listę członków, których członkostwo w grupie nie będzie dziedziczone z kanałów nadrzędnych. Contains the list of members inherited by other channels. Zawiera listę członków odziedziczonych z innych kanałów. Type in the name of a user you wish to add to the group and click Add. Wpisz nazwę użytkownika, którego chciałbyś dodać do grupy i kliknij Dodaj. Type in the name of a user you wish to remove from the group and click Add. Wpisz nazwę użytkownika, którego chciałbyś usunąć z grupy i kliknij Usuń. Exclude Wyklucz Excluded members Wykluczeni członkowie This makes the entry apply to sub-channels of this channel. Sprawia, że reguła dotyczy pod-kanałów tego kanału. Applies to sub-channels Stosuj do pod-kanałów Permissions Uprawnienia User/Group Użytkownik / Grupa Group this entry applies to Reguły dotyczą User ID ID użytkownika User this entry applies to Reguła dotyczy tego użytkownika This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. Kontroluje, do którego użytkownika należy ta reguła. Wpisz nazwę użytkownika i naciśnij Enter, by wysłać zapytanie do serwera w celu sprawdzenia poprawności nazwy użytkownika. &Properties &Właściwości <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>Nazwa</b><br/ >Podaj tutaj nazwę kanału. Nazwa musi zgadzać się z ograniczeniem narzuconym przez serwer, do którego jesteś podłączony. <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>Tymczasowy</b><br />Po włączeniu - kanał, który utworzysz będzie oznaczony, jako tymczasowy. Gdy ostatni użytkownik opuści ten kanał, zostanie on automatycznie usunięty przez serwer. <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>Grupa</b><br />Znajdują się tutaj wszystkie grupy aktualnie zdefiniowane dla tego kanału. By utworzyć nową grupę, wpisz jej nazwę i naciśnij enter. <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>Usuń</b><br />Usuwa aktualnie wybraną grupę. Jeżeli grupa była dziedziczona nie zostanie usunięta z listy, ale wszystkie lokalne informacje o tej grupie zostaną wyczyszczone. <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>Dziedzicz</b><br />Dziedziczy wszystkich członków z grupy nadrzędnej jeżeli grupa jest oznaczona jako <i>Dziedziczna</i> w kanale nadrzędnym. <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>Dziedziczna</b><br />Umożliwia dziedziczenie uprawnień grupy w pod-kanałach. Jeżeli grupa nie pozwala na dziedziczenie, to w pod-kanałach można tworzyć grupy o tych samych nazwach. <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>Odziedziczona</b><br />Wskazuje czy grupa została odziedziczona z kanału nadrzędnego. Nie możesz edytować tej flagi, jest to tylko informacja. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>Członkowie</b><br />Ta lista zawiera wszystkich członków, którzy zostali dodani do grupy na tym kanale. Należy pamiętać, że dane te nie obejmują użytkowników dziedziczonych z kanałów nadrzędnych. Znajdują się oni na liście <i>Odziedziczeni członkowie</i>. By zapobiegać dziedziczeniu tej listy przez pod-kanały odznacz <i>Dziedziczna</i> lub manualnie dodaj członków do listy <i>Wykluczeni członkowie</i>. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>Wykluczeni członkowie</b><br />Zawiera listę członków, których członkowstwo w grupie nie będzie dziedziczone z kanałów nadrzędnych. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. <b>Odziedziczeni członkowie</b><br />Zawiera listę członków odziedziczonych z innych kanałów. Odznacz <i>Dziedzicz</i>, by zapobiec dziedziczeniu z kanałów nadrzędnych. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. Kontroluje, której grupy użytkowników dotyczy dana reguła.<br />Należy pamiętać, że grupa jest sprawdzana w kontekście reguł, jakie są w niej używane. Na przykład, na kanale Root domyślna reguła ACL nadaje uprawnienie <i>Edycji ACL</i> grupie <i>admin</i>. Jeżeli ta reguła zostanie odziedziczona przez kanał, nada ona uprawnienia zapisu ACL użytkownikowi, który należy do grupy <i>admin</i> na tym kanale nawet, gdy użytkownik nie należy do grupy <i>admin</i> na kanale, z którego reguły ACL pochodzą.<br />Jeżeli nazwa grupy rozpoczyna się od !, członkostwo użytkownika jest negowane, a gdy rozpoczyna się od ~, reguła jest sprawdzana na kanale gdzie została zdefiniowana, zamiast na kanale, w którym reguła ACL jest aktywna. Kolejność jest ważna: <i>!~in</i> jest ważny, ale <i>~!in</i> nie jest.<br />Jest kilka predefiniowanych grup:<br /><b>all</b> - wszyscy użytkownicy będą pasować.<br /><b>auth</b> - Wszyscy uwierzytelnieni użytkownicy będą pasować.<br /><b>sub,a,b,c</b> - Użytkownicy znajdujący się w aktualnie w podkanele. Zobacz dokumentacje na stronie internetowej, aby dowiedzieć się więcej o tej funkcji.<br /><b>in</b> - Użytkownicy aktualnie znajdujący się na kanale (wygodniejsza metoda w porównaniu do <i>sub,0,0,0</i>.<br /><b>out</b> - Użytkownicy nieznajdujący się na kanale będą pasować (wygodniejsza metoda w porównaniu do <i>!sub,0,0,0</i>).<br />Pamiętaj, że wpis może dotyczyć zarówno użytkownika lub grupy, a nie obu jednocześnie. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. <b>Hasło</b><br />To pole pozwala na łatwe ustawienie i zmianę hasła kanału. W tle, używa funkcji "Hasła dostępu". Aby dokładniej określać uprawnienia używaj bezpośrednio edytora ACL oraz Grup. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. Wyświetla wszystkie aktywne reguły na tym kanale. Pozycje odziedziczone z kanałów nadrzędnych wyświetlone są przy użyciu kursywy.<br />Lista ACL przetwarzana jest od góry do dołu, oznacza to, że pozycje znajdujące się na dole listy mają wyższy priorytet. ID of the channel. ID kanału. Maximum Users Maksymalna ilość użytkowników Maximum number of users allowed in the channel Maksymalna dozwolona liczba użytkowników tego kanału <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. <b>Maksymalna ilość użytkowników</b><br /> Określa maksymalną dozwoloną ilość użytkowników na tym kanale. Jeżeli wartość jest wyższa niż 0 tylko tylu użytkowników będzie mogło dołączyć do kanału. Jeżeli wynosi 0 maksymalna liczba użytkowników wynosi tyle co domyślny limit serwera. This is the sort order for the channel. Jest to kolejność sortowania kanału. ALSAAudioInput Default ALSA Card Domyślna karta ALSA Opening chosen ALSA Input failed: %1 Otwieranie wybranego wejścia ALSA nie powiodło się: %1 ALSAAudioOutput Default ALSA Card Domyślna karta ALSA Opening chosen ALSA Output failed: %1 Otwieranie wybranego wyjścia ALSA nie powiodło się: %1 ASIOConfig %1 (version %2) %1 (wersja %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz %1 -> %2 bufor próbkowania, o rozdzielczości %3 (preferowana %4) na %5 Hz ASIO Initialization failed: %1 Inicjalizacja ASIO nie powiodła się: %1 Failed to instantiate ASIO driver Wytwarzanie sterownika ASIO nie powiodło się ASIO ASIO Device selection Wybieranie urządzenia Device Urządzenie Device to use for microphone Urządzenie, do którego jest podłączony mikrofon This chooses what device to query. You still need to actually query the device and select which channels to use. Wybiera, które urządzenie sprawdzić. Nadal musisz sprawdzić urządzenie oraz wybrać kanały do wykorzystania. Query selected device Sprawdź wybrane urządzenie This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. Wykrywa ilość kanałów obsługiwanych przez wybrane urządzenie. <b>Uwaga:</b> wiele sterowników ASIO jest tak wadliwych, że sprawdzanie ich może spowodować zawieszenie się programu lub całego systemu. &Query &Sprawdź Configure selected device Konfiguruj wybrane urządzenie This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. Konfiguruje wybrane urządzenie. <b>Uwaga:</b> wiele sterowników ASIO jest tak wadliwych, że sprawdzanie ich może spowodować zawieszenie się programu lub całego systemu. &Configure &Konfiguruj Capabilities Możliwości Driver name Nazwa sterownika Buffer size Rozmiar bufora This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. Konfiguracja wejściowych kanałów dla ASIO. Upewnij się, że wybierasz przynajmniej jeden kanał, jako mikrofon oraz jeden, jako głośniki czy słuchawki. Kanał <i>Mikrofon</i> powinien być ustawiony na kanał, pod którym masz podłączony mikrofon, a dla <i>Głośniki</i> kanał, który przetwarza "<i>to, co słyszysz</i>". Na przykład dla Audigy 2 ZS dobrym wyborem dla Mikrofonu będzie "<i>Mic L</i>" a dla Głośników "<i>Mix L</i>" i "<i>Mix R</i>". Configure input channels Konfiguruj kanały wejścia Channels Kanały Microphone Mikrofon <- <- -> -> Unused Nieużywany Speakers Głośniki ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. Musisz wybrać przynajmniej jeden mikrofon oraz jedno źródło wyjścia, aby używać ASIO. Jeżeli potrzebujesz tylko próbkowania mikrofonu używaj DirectSound. Opening selected ASIO device failed. No input will be done. Otwieranie wybranego urządzenia ASIO nie powiodło się. Żadne wejście nie jest gotowe. AboutDialog About Mumble O Mumble <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> <h3>Mumble (%1)</h3><p>%3</p><p><b>Czat głosowy dla graczy</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble &O Mumble &License &Licencja A&uthors &Autorzy &Third-Party Licenses Licencje firm &trzecich OK OK AudioInput Interface Interfejs System System Input method for audio Metoda wejścia dźwięku <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Metoda wejścia dźwięku.</b><br />Najprawdopodobniej chcesz korzystać z DirectSound. Device Urządzenie Input device for audio Wejściowe urządzenie audio <b>This is the input device to use for audio.</b> <b>Jest to wejściowe urządzenie audio.</b> Transmission Transmisja &Transmit &Sposób transmisji głosu When to transmit your speech Kiedy wysyłać twój głos <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. <b>Określa, kiedy to, co mówisz powinno zostać wysłane.</b><br /><i>Ciągłe nadawanie</i> - Cały czas.<br /><i>Aktywacja głosowa</i> - Gdy mówisz wyraźnie.<br /><i>Aktywacja przyciskiem</i> - Gdy trzymasz wciśnięty przycisk ustawiony w <i>Skróty</i>. DoublePush Time Czas podwójnego kliknięcia If you press the PTT key twice in this time it will get locked. Jeżeli naciśniesz przycisk PTT podwójnie w tym czasie, zostanie on zablokowany. <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. <b>Czas podwójnego kliknięcia</b><br/>Jeżeli wciśniesz przycisk PTT (Naciśnij-i-Mów) dwukrotnie we wskazanym czasie, wówczas Mumble będzie stale transmitować twój głos dopóki ponownie nie wciśniesz przycisku PTT. Reset audio cue to default Ustaw domyślny dźwięk PTT <b>Reset</b><br/>Reset the paths for the files to their default. <b>Resetuj</b><br/>Resetuje ścieżki dla plików dźwiękowych do wartości domyślnych. Browse for on audio file Przeglądaj w poszukiwaniu pliku dźwiękowego Browse for off audio file Przeglądaj w poszukiwaniu pliku dźwiękowego Off Wyłączany On Włączany Preview the audio cues Podgląd plików audio Use SNR based speech detection Używaj detekcji na podstawie SNR (Singal-To-Noise Ratio / Stosunek Sygnału-Do-Szumu) Signal to Noise Stosunek Sygnału-Do-Szumu (SNR) <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. <b>Określa sposób detekcji głosu na analizę Amplitudy.</b> W tym trybie źródło dźwięku jest analizowane pod kątem siły sygnału, mocniejszy sygnał uaktywnia transmisję głosu. Amplitude Amplituda Voice &Hold Czas podtrzymania &transmisji How long to keep transmitting after silence Jak długo utrzymywać transmisje po zakończeniu wypowiedzi Silence Below Cisza <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. <b>Określa próg aktywacji dla detekcji mowy.</b><br />Użyj tego razem ze <i>Statystykami</i>, aby manualnie wyregulować próg aktywacji głosowej. Wartości wejścia poniżej "Cisza" zawsze są traktowane jako cisza. Wartości powyżej "Mowa" zawsze są traktowane jako mowa. Wartości pomiędzy są traktowane jako mowa ale nie uaktywnią nowej detekcji. Speech Above Mowa Signal values above this count as voice Sygnał powyżej podanej wartości traktowany jest jako mowa Compression Kompresja &Quality &Jakość Quality of compression (peak bandwidth) Jakość kompresji (maksymalne pasmo) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. <b>Określa jakość kompresji.</b><br />Określa również ile pasma Mumble może wykorzystać podczas wysyłania dźwięku. Audio per packet Dźwięk na pakiet How many audio frames to send per packet Ile ramek dźwięku ma być wysyłane na pakiet <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>Określa ile ramek dźwięku powinno być umieszczonych w jednym pakiecie.</b><br />Zwiększanie ilości milisekund opóźni przesyłanie twojego głosu, ale dzięki temu zużyjesz mniej pasma. <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). <b>Wyświetla maksymalne pasmo, jakie może być użyte.</b><br />Wyświetla maksymalne pasmo, jakie może być wykorzystane przy wysyłaniu z twojego komputera. Bitrate dźwięku (użyte jest VBR) jest maksymalnym bitrate dla samego dźwięku. Położenie jest to bitrate zawierający informacje wykorzystywane przy dźwięku pozycyjnym. Obciążenie są to nagłówki pakietów (IP i UDP stanowi 75% obciążenia). Audio Processing Przetwarzanie dźwięku Noise Suppression Tłumienie hałasu Noise suppression Tłumienie hałasu <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. <b>Określa wartość wyciszania hałasu.</b><br />Im wyższa wartość tym bardziej dźwięk będzie wyciszany. Maximum amplification of input sound Maksymalne wzmocnienie dźwięku wejściowego <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. <b>Maksymalne wzmocnienie wejścia.</b><br />Mumble normalizuje poziom głośności przed kompresją, opcja ta określa dozwolony poziom wzmocnienia.<br />Rzeczywisty poziom jest stale aktualizowany w oparciu o aktualną strukturę twojej wypowiedzi, ale nigdy nie przekracza poziomu określonego tutaj.<br /> Jeżeli poziom głośności mikrofonu w statystykach wynosi około 100%, to prawdopodobnie powinieneś ustawić wartość na 2.0, ale gdy nie będziesz w stanie osiągnąć 100%, tak jak większość użytkowników, ustaw wyższą wartość.<br />Najlepszym ustawieniem będzie: <i>głośność mikrofonu * czynnik wzmocnienia >= 100</i> nawet, gdy mówisz bardzo miękko. Pamiętaj, ustawienie maksymalnej wartości niczemu nie zaszkodzi ale Mumble zacznie przechwytywać inne rozmowy jeżeli zostawisz wzmocnienie dźwięku do automatycznego dostrojenia, by osiągnąć ten poziom. Current speech detection chance Aktualna szansa na wykrycie mowy Cancel echo from speakers Usuwa echo z głośników Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. Włączenie spowoduje usuwanie echa dochodzącego z głośników. <i>Pomieszane</i> ma mały wpływ ma procesor, ale działa tylko na bardzo głośno ustawione głośniki. <i>Wielokanałowe</i> usuwanie echa dostarcza lepszą jakość ale skutkuje to większym wykorzystaniem procesora. Disabled Wyłączone <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>Określa sposób detekcji głosu na stosunek Sygnału-Do-Szumu.</b><br />W tym trybie sygnał wejściowy jest analizowany jako czysty, a czystość tego sygnału używana jest do włączania transmisji głosowej. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>Wyświetla aktualne ustawienia wykrywania mowy.</b><br />Możesz zmienić te ustawienia w <i>Konfiguracji</i> lub w <i>Kreatorze ustawień dźwięku</i>. Signal values below this count as silence Sygnał poniżej tej wartości zalicza się jako cisza Maximum bandwidth used for sending audio Maksymalne pasmo używane do wysyłania dźwięku Use Amplitude based speech detection Używaj detekcji na podstawie Amplitudy <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). <b>Określa, jak długo utrzymywać transmisje po zakończeniu wypowiedzi.</b><br />Ustaw wyższą wartość, gdy twoje wypowiedzi są przerywane (można to zauważyć poprzez szybkie miganie ikony przy twoim nicku). Exclusive mode Tryb wyłączności <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>Otwiera urządzenie w trybie wyłączności.</b><br />Żadna inna aplikacja nie będzie mogła go użyć. Exclusive Wyłączność R&eset R&eset &Browse... &Przeglądaj... B&rowse... &Przeglądaj... &Preview &Podgląd <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. <b>Podgląd</b><br/>Odtwarza aktualnie ustawione dźwięki dla obu wartości <i>Włączany</i> i <i>Wyłączany</i>. Displays an always on top window with a push to talk button in it Wyświetla okienko z przyciskiem aktywacji transmisji, które jest zawsze na wierzchu Display push to talk window Wyświetlaj okienko aktywacji przyciskiem Misc Różne Audible audio cue when starting or stopping to transmit Dźwiękowe powiadomienie o rozpoczęciu i zakończeniu transmisji <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. <b>Włącza powiadomienia dźwiękowe przy transmisji</b><br />Pozwala na ustawienie krótkich dźwięków, które informują o rozpoczęciu i zakończeniu transmisji. Audio cue Dźwięk PPT Gets played when starting to transmit Odtwarzany przy rozpoczęciu transmisji Gets played when stopping to transmit Odtwarzany po zakończeniu transmisji Hold Time Czas przytrzymania Time the microphone stays open after the PTT key is released Czas, w którym kontynuowana jest transmisja po puszczeniu przycisku aktywacji Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) Maksymalne pasmo dźwięku na serwerze to tylko %1 kbit/s. Jakość dźwięku została automatycznie zmieniona na %2 kbit/s (%3 ms) Max. Amplification Maks. wzmocnienie Idle action Akcja bezczynności minutes do minutach nothing nic deafen ogłusz mute wycisz after po Echo Cancellation Usuwanie echa Mixed echo cancellation Mieszane usuwanie echa Multichannel echo cancellation Wielokanałowe usuwanie echa The idle action will be reversed upon any key or mouse button input Akcja bezczynności zostanie odwrócona po każdym wciśnieciu klawisza lub przycisk myszy Undo Idle action upon activity Cofnij akcję bezczynności po aktywności Apply RNNoise's noise suppression filter. Zastosuj filtr tłumienia szumów RNNoise. <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. <b>Stosuje filtr tłumienia szumów RNNoise.</b><br />RNNoise opiera się na uczeniu maszynowym i jest używany w WebRTC. RNNoise RNNoise Audio input Wejście audio AudioInputDialog Continuous Ciągłe nadawanie Voice Activity Aktywacja głosowa Push To Talk Aktywacja przyciskiem Audio Input Wejście audio %1 ms %1 ms Off Wyłączone %1 s %1 s %1 kb/s %1 kb/s -%1 dB -%1 dB %1 kbit/s (Audio %2, Position %4, Overhead %3) %1 kbit/s (Dźwięk %2, Pozycja %4, Nagłówki %3) AudioOutput Interface Interfejs System System Output method for audio Metoda wyjścia dźwięku <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Metoda wyjścia dźwięku.</b><br />Najprawdopodobniej chcesz korzystać z DirectSound. Device Urządzenie Output device for audio Urządzenie wyjściowe dla dźwięku <b>This is the output device to use for audio.</b> <b>To jest urządzenie wyjściowe dla dźwięku.</b> Positional Audio Dźwięk pozycyjny Audio Output Wyjście audio Default &Jitter Buffer Domyślny bufor &drgań Safety margin for jitter buffer Granica bezpieczeństwa dla bufora drgań <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. <b>Granica bezpieczeństwa dla bufora drgań.</b><br />Każdy przychodzący dźwięk jest najpierw buforowany, a bufor drgań nieustannie stara się utrzymać minimalną ilość danych, która jest odpowiednia dla twojej sieci, przez co opóźnienie jest najniższe jak to tylko możliwe. Określa minimalny rozmiar bufora, jaki może być użyty. Jeżeli mowa jest dla ciebie lekko zniekształcona spróbuj zwiększyć ilość milisekund. Minimum distance to user before sound volume decreases Minimalna odległość od użytkownika zanim głośność dźwięku zostanie zmniejszona This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. Określa minimalną odległość, przy której jest obliczenia pozycja dźwięku. Głośność mowy użytkowników nie obniży się dopóki nie będą znajdowali się w określonej odległości od ciebie. This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. Określa maksymalną odległość, przy której jest obliczenia pozycja dźwięku. Jeżeli użytkownik znajduje się dalej niż ustalona tutaj odległość, głośność mowy użytkowników nie będzie już zmniejszana. <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. <b>Włącza jeden z trybów testowych.</b><br /><i>Brak</i> - Tryb testowy wyłączony<br /><i>Lokalny</i> - Emuluj serwera lokalnego.<br /><i>Serwer</i> - Test na serwerze.<br />Prosimy zauważyć, gdy tryb testowy jest włączony, żaden użytkownik cię nie usłyszy, więc możesz mówić swobodnie. Tryb testowy jest wyłączany przy wyjściu z programu. Volume Głośność Volume of incoming speech Głośność dźwięku przychodzącego <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. <b>Pozwala na określenie głośności mowy.</b><br />Każda wartość powyżej 100% sprawi, że dźwięk będzie trochę zniekształcony. Output Delay Opóźnienie wyjścia Amount of data to buffer Ilość danych przechowywanych w buforze The connected "speakers" are actually headphones The connected "speakers" are actually headphones. Podłączone "głośniki" to w rzeczywistości słuchawki Factor for sound volume decrease Jak szybko odbierany dźwięk ma zanikać Bloom Zmienna głośność Factor for sound volume increase Czynnik wpływający na zwiększenie głośności How much should sound volume increase for sources that are really close? Jak bardzo Mumble powinien zmieniać głośność dla źródeł dźwięku, które są zbyt blisko? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. Wybierz, gdy używasz słuchawek zamiast głośników. Jest to ważne, gdyż zazwyczaj głośniki są przed tobą a słuchawki bezpośrednio z lewej i prawej. This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Określa ilość danych, które są wstępnie wczytywane do bufora wyjścia. Poeksperymentuj z różnymi wartościami i ustaw je na najniższą, możliwą wartość, która nie powoduje przycinania dźwięku. Headphones Słuchawki Minimum Distance Minimalna odległość Maximum Distance Maksymalna odległość Maximum distance, beyond which speech volume won't decrease Określa maksymalną odległość, po której dźwięk nie będzie dalej ściszany Minimum Volume Minimalna głośność What should the volume be at the maximum distance? Jaka powinna być głośność maksymalnej odległości? Loopback Test Tryb testowy Delay Variance Opóźnienie pakietów Variance in packet latency Opóźnienie pakietów podczas testu <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>Określa opóźnienie pakietów dla trybu testowego.</b><bt />Większość ścieżek audio zawiera jakąś przybliżoną wartość opóźnienia. Umożliwia to ustawienie opóźnienia dla trybu testowego. Na przykład, jeżeli ustawisz 15ms, rozpocznie się emulacja sieci z opóźnieniami w granicach 20-35ms lub 80-95ms. Opóźnienie w większości domowych połączeń internetowych waha się w granicach 5ms. Packet Loss Utracone pakiety Packet loss for loopback mode Ilość utraconych pakietów podczas testu <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% <b>Określa ilość utraconych pakietów w trybie testowym.</b><br />Jest to stosunek pakietów utraconych. O ile cała przepustowość wysyłania nie jest zajęta lub masz jakikolwiek problem ze swoim połączeniem, będzie to 0% &Loopback &Wybierz tryb Desired loopback mode Tryb testu Attenuate applications by... Tłum aplikacje o... Attenuation of other applications during speech Tłumienie innych aplikacji podczas mowy <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. <b>Tłumienie innych aplikacji podczas mowy</b><br />Mumble obsługuje zmniejszanie głośności innych aplikacji, podczas gdy ktoś do ciebie mówi lub ty mówisz. Określa poziom tłumienia innych aplikacji, gdy ta funkcja jest włączona. If checked Mumble lowers the volume of other applications while other users talk Jeśli zaznaczone, Mumble zmniejszy głośność innych aplikacji, gdy inni użytkownicy mówią <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. <b>Tłumienie innych aplikacji podczas mowy innych użytkowników</b><br />Mumble obsługuje zmniejszanie głośności innych aplikacji podczas, gdy ktoś do ciebie mówi lub ty mówisz. Aktywuje tą funkcję, gdy inny użytkownik mówi do ciebie. while other users talk gdy inni mówią If checked Mumble lowers the volume of other applications while you talk Jeśli zaznaczone Mumble zmniejszy głośność innych aplikacji, gdy ty mówisz <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. <b>Tłumienie innych aplikacji podczas twojej mowy</b><br />Mumble obsługuje zmniejszanie głośności innych aplikacji podczas, gdy ktoś do ciebie mówi lub ty mówisz. Aktywuje tą funkcję, gdy ty mówisz. while you talk gdy ty mówisz Exclusive mode, not recommended. Tryb wyłączności, niezalecany. <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>Otwiera urządzenie w trybie wyłączności.</b><br />Żadna inna aplikacja nie będzie mogła używać tego urządzenia. Exclusive Wyłączność Priority Speaker Nadrzędny mówca If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. Po włączeniu Mumble obniżY głośność mowy innych użytkowników podczas twojej mowy jako "Nadrzędny mówca". <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. <b>Przycisz innych użytkowników podczas mowy jako Nadrzędny mówca.</b>><br />Mumble wspiera obniżanie głośności mowy innych użytkowników podczas, gdy ty mówisz jako <i>Nadrzędny mówca</i>. Attenuate other users while talking as Priority Speaker. Przyciszaj innych użytkowników podczas mowy jako nadrzędny mówca. Advanced Attenuation Options Zaawansowane opcje tłumienia If checked, Mumble will only attenuate applications that are using the same output source as Mumble Jeśli opcja jest zaznaczona, Mumble wytłumi tylko aplikacje, które używają tego samego urządzenia wyjścia co Mumble <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. <b>Tłum aplikacje używające tego samego urządzenia wyjścia co Mumble</b><br />Aplikacje, które używają innego urządzenia wyjścia nie będą wytłumiane. Only attenuate applications using the same output device Tłum aplikacje używające tego samego urządzenia wyjścia If checked, PulseAudio loopback modules will be attenuated Aplikacje używające tego samego urządzenia wyjścia będą tłumione <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. <b>Tłumienie aplikacji</b><br />Jeśli aplikacje używają tego samego urządzenia wyjścia co Mumble zostaną wytłumione. Attenuate PulseAudio loopback modules Tłum aplikacje o... Audio output Wyjście audio AudioOutputDialog None Brak Local Lokalny Server Serwer Audio Output Wyjście audio %1 ms %1 ms %1 % %1 % %1 m %1 m AudioOutputSample Choose sound file Wybierz plik dźwiękowy Invalid sound file Nieprawidłowy plik dźwiękowy The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. Plik '%1' nie mógł zostać użyty przez Mumble. Prosimy wybrać plik z obsługiwanym formatem pliku. AudioStats >1000 ms >1000ms >1000ms Audio Statistics Statystyki audio Input Levels Poziomy wejścia Peak microphone level Maksymalny poziom mikrofonu Peak power in last frame Maksymalna moc w ostatniej ramce This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. Wyświetla maksymalną moc z ostatniej ramki (20 ms), taką samą wartość powinieneś widzieć w "mocy wejściowej". Możesz to zignorować i patrzeć na <b>Moc mikrofonu</b>, która jest znacznie bardziej stabilna i nie uwzględnia wartości odstających. Peak speaker level Maksymalny poziom głośników This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. Wyświetla maksymalną moc głośników w ostatniej ramce (20 ms). Jeżeli używasz wielokanałowej metody próbkowania (np. ASIO) ze skonfigurowanymi kanałami, wartość będzie wynosiła 0. Jeżeli posiadasz taką konfigurację, a nadal wartość wynosi 0, gdy odtwarzasz dźwięk z innych programów oznacza to, że twoje ustawienie nie działa prawidłowo. Peak clean level Maksymalny poziom czystości This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. Wyświetla moc ostatniej ramki (20 ms) po całym procesie przetwarzania. W najlepszym wypadku, powinna wynosić -96dB, kiedy nic nie mówisz. W rzeczywistości powinna być to wartość zbliżona do -60 dB, ale od czasu do czasu powinieneś widzieć -20 dB. Kiedy mówisz, wartość powinna wzrosnąć do około -5 dB czy -10 dB.<br /> Jeżeli używasz usuwania echa, a wartość wzrasta powyżej -15 dB, gdy nic nie mówisz oznacza to, że twoje ustawienia są złe i będziesz przeszkadzać innym użytkownikiem echem dobiegającym z twojej transmisji. Signal Analysis Analiza sygnału Microphone power Moc mikrofonu How close the current input level is to ideal Jak bardzo obecny poziom głośności jest bliski idealnemu This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. Określa, jak bardzo aktualna głośność jest bliska ideałowi. By dostroić poziom mikrofonu, otwórz jakikolwiek program do regulacji głośności i sprawdzaj tutaj wartości podczas mowy.<br /><b>Mów głośno, tak jak byś był zdenerwowany po śmierci od nooba.</b><br />Dostrajaj głośność dopóki wartość nie będzie bliska 100%, jednocześnie upewniając się, że jej nie przekroczy. Gdy wartość przekroczy jednak 100% twoje wypowiedzi mogą być przerywane, co obniży komfort rozmowy. Signal-To-Noise ratio Stosunek Sygnału-Do-Szumu (SNR) Signal-To-Noise ratio from the microphone Stosunku Sygnału-Do-Szumu (SNR) z mikrofonu This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. Stosunku Sygnału-Do-Szumu (SNR) mikrofonu w ostatniej ramce (20 ms). Wyświetla o ile czystszy jest głos w porównaniu do szumu.<br />Jeżeli wartość wynosi mniej niż 1.0, oznacza to więcej szumu niż głosu w sygnale, .Nie ma limitu tej wartości, ale nie spodziewaj się, że zobaczysz wartość większą niż 40-50 bez studia dźwiękowego. Speech Probability Prawdopodobieństwo mowy Probability of speech Prawdopodobieństwo mowy This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). Prawdopodobieństwo wykrycia mowy w ostatniej ramce (20 ms)<br />Zależy od tego aktywacja transmisji głosu. Problem polega na tym, że środek zdania zawsze będzie wykrywany, jako mowa; pozostaje problem pauz pomiędzy wyrazami oraz początkiem mowy. Trudno jest rozróżnić westchnięcie od wyrazu zaczynającego się na 'h'.<br />Jeżeli występuje tu pogrubiona czcionka oznacza to, że Mumble w danej chwili transmituje głos (gdy jesteś połączony). Configuration feedback Konfiguracja Current audio bitrate Aktualny bitrate dźwięku Bitrate of last frame Bitrate ostatniej ramki DoublePush interval Odstęp pomiędzy podwójnym kliknięciem Time between last two Push-To-Talk presses Czas pomiędzy dwoma ostatnimi wciśnięciami PTT Speech Detection Detekcja mowy Current speech detection chance Aktualna szansa na wykrycie mowy <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>Wyświetla obecny sposób detekcji głosu.</b><br />Możesz zmienić sposób detekcji w <i>Konfiguracji</i> lub korzystając z <i>Kreatora ustawień dźwięku</i>. Signal and noise power spectrum Widmo siły sygnału oraz szumu Power spectrum of input signal and noise estimate Szacowana siła spektrum wejściowego sygnału oraz szumu This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. Wyświetla spektrum obecnej siły wejścia (czerwona linia) oraz obecny, szacowany szum (niebieskie wypełnienie).<br />Wszystkie amplitudy są mnożone przez 30, aby pokazać interesujące części (jak bardzo sygnał prezentuje się na każdym kanale, w przeciwieństwie do szumu).<br />Prawdopodobnie będzie cię to interesować tylko, gdy próbujesz ustawić mikrofon do warunków zewnętrznych. Jednakże przy dobrych warunkach, w dolnej części wykresu powinno być widoczne słabe trzepotanie koloru niebieskiego. Jeżeli kolor ten zajmuje połowę wykresu, to masz bardzo hałaśliwy szum dochodzący z otoczenia. Echo Analysis Analiza echa Weights of the echo canceller Siła usuwania echa This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. Wyświetla siłę usuwania echa, gdzie czas to krzywa, która opada w dół oraz częstotliwość to krzywa zwiększająca się ku prawej stronie.<br />Najlepiej byłoby, gdyby pole to pozostało czarne, co wskazywałoby, że echo nie występuje. Zazwyczaj, będziesz mieć doczynienia z jedną lub kilkoma poziomymi paskami niebieskawego koloru, które reprezentują opóźnienie echa w czasie. Powinieneś widzieć siłę uaktualnianą w czasie rzeczywistym. <br />Zauważ, że jeżeli nie masz żadnego echa nie zobaczysz tutaj nic, co mogłoby ci się przydać. Posłuchaj muzyki i wszystko powinno się ustabilizować.<br />Możesz wybrać, co chcesz przeglądać - prawdziwe lub wyimaginowane części dziedziny częstotliwości siły lub obliczone modulacje i fazy. Najużyteczniejszym z tych wszystkich będzie modulacja, która jest amplitudą echa, pokazuje ile wychodzącego sygnału jest usuwane. Pozostałe tryby przeglądania są najużyteczniejsze dla ludzi, którzy chcą podrasować algorytmy usuwania echa. <br />Zauważ, że: Jeżeli cały obraz fluktuuje po całości, gdy tryb modulacji jest włączona, usuwanie echa nie ma wtedy szans na odnalezienie korelacji pomiędzy dwoma źródłami wyjścia (głośniki i mikrofon). Albo masz zbyt długie opóźnienie na echu albo jedno ze źródeł wejścia jest źle skonfigurowane. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. Bitrate dźwięku w ostatniej ramce (20 ms) będzie skakać od góry do dołu, kiedy VBR będzie dostosowywać jakość. Aby zmienić bitrate, wyreguluj <b>kompresję</b> w Konfiguracji. AudioWizard Audio Tuning Wizard Kreator ustawień dźwięku Introduction Wprowadzenie Welcome to the Mumble Audio Wizard Witamy w kreatorze ustawień dźwięku Mumble Finished Zakończono Enjoy using Mumble Miłej zabawy z Mumble Device selection Wybór urządzenia Selecting the input and output device to use with Mumble. Wybierz urządzenia wejścia oraz wyjścia, z których Mumble będzie korzystać. This is the device your microphone is connected to. Urządzenie, do którego podłączony jest mikrofon. System System Input method for audio System wejścia audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Metoda wejścia dźwięku.</b><br />Najprawdopodobniej chcesz korzystać z DirectSound. Device Urządzenie Input device to use Urządzenie wejścia <b>Selects which sound card to use for audio input.</b> <b>Wskazuje, które urządzenie będzie użyte do wejścia dźwięku.</b> Cancel echo from headset or speakers Usuwaj echo ze słuchawek lub głośników Use echo cancellation Usuwanie akustycznego echa This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. Uaktywnia usuwanie echa pochodzącego z urządzeń (głośniki lub słuchawki). This is the device your speakers or headphones are connected to. Urządzenie, do którego podłączone są słuchawki lub głośniki. Output method for audio System wyjścia audio <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Metoda wyjścia dźwięku.</b><br />Najprawdopodobniej chcesz korzystać z DirectSound. Output device to use Urządzenie wyjścia <b>Selects which sound card to use for audio Output.</b> <b>Wskazuje, które urządzenie będzie użyte do wyjścia dźwięku.</b> Enable positional audio Włącz dźwięk pozycyjny Allows positioning of sound Allows positioning of sound. Zezwalaj na pozycjonowanie dźwięku <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> <p>Jest to kreator ustawień dźwięku Mumble. Kreator pomoże ci w odpowiednim skonfigurowaniu twojej karty dźwiękowej oraz w doborze odpowiednich ustawień przetwarzania dźwięku w Mumble.</p><p>Zwróć uwagę na to, że podczas kolejnych kroków będziesz słyszeć sam siebie, ale nie martw się, żaden z użytkowników cię nie usłyszy, gdy kreator jest otwarty.</p> Input Device Urządzenie wejścia Output Device Urządzenie wyjścia This allows Mumble to use positional audio to place voices. Pozwala to Mumble na używanie pozycjonowania dźwięku, aby umieszczać głos zgodnie z pozycja danego użytkownika w grze. <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> <p>Aby utrzymać opóźnienie na minimalnym poziomie ważnym jest, aby buforować jak najmniejszą ilość danych na karcie dźwiękowej. Jednakże wiele kart może mieć problemy ze zbyt niskimi ustawieniami bufora, tak więc jedynym sposobem na ustawienie tej wartości jest metoda prób i błędów.</p><p>Powinieneś słyszeć próbkę głosową. Ustaw teraz wskaźnik na pasku poniżej do poziomu takiego, który <b>nie</b> powoduje żadnych zakłóceń, trzeszczenia itd. Zauważ, że podczas tego kroku echo jest wyłączone.</p> Amount of data to buffer Ilość danych przekazywanych do bufora This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Określa ilość danych, które są wstępnie wczytywane do bufora wyjścia. Poeksperymentuj z różnymi wartościami i ustaw je na najniższą, możliwą wartość, która nie powoduje przycinania dźwięku. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> <p>Otwórz swój systemowy panel konfiguracji dźwięku a następnie zajrzyj do zakładki ustawień nagrywania. Upewnij się, że mikrofon jest aktywny i ustawiony na maksymalną głośność nagrywania. Jeżeli istnieje opcja MicBoost czy wzmocnienie dźwięku upewnij się, że jest aktywna.</p><p>Mów głośno, tak jakbyś był wkurzony lub podekscytowany. Zmniejsz głośność dźwięku w systemowym panelu sterowania do tego momentu aż pasek znajdzie się mniej więcej w niebieskiej lub zielonej części paska ale <b>nie dopuść</b>, żeby świeciła się czerwona część paska.</p> Positional Audio Dźwięk pozycyjny Adjusting attenuation of positional audio. Regulacja tłumienia dźwięku pozycyjnego. <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> <p>Mumble wspiera dźwięk pozycyjny w grach i będzie przetwarzać dźwięk zgodnie z pozycja danego gracza w grze. W zależności od zajmowanej pozycji głośność mowy twoich znajomych będzie ulegać zmianie, aby symulować różne kierunki czy pozycje w grze. Ustawienia te zależą od twoich głośników - tutaj możesz sprawdzić czy działają prawidłowo.</p><p>Wykres poniżej wskazuje pozycję <font color="red">twoją</font>,<font color="yellow">głośników</font>oraz<font color="green">poruszającego się źródła dźwięku</font> widocznego jak gdyby z góry. Powinieneś słyszeć przemieszczający się dźwięk pomiędzy kanałami.</p> Use headphones instead of speakers Używaj słuchawek zamiast głośników <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> <p> Gratulujemy. Teraz powinieneś być gotowy, aby w pełni cieszyć się bogatszym dźwiękiem dzięki Mumble. </p> <p> Mumble jest caly czas rozwijane a nasza ekipa chce skupić się na funkcjach, które sprzyjają jak największej ilości użytkowników. Mumble wspiera wysyłanie anonimowych statystyk oraz ustawień twojego klienta do twórców aplikacji. Dane te są potrzebne do dalszego rozwoju aplikacji oraz pokazują czy niektóre funkcje są w ogóle potrzebne. </p> Use headphones Używam słuchawek This ignores the OS speaker configuration and configures the positioning for headphones instead. Ignoruje ustawienia w systemie dotyczące głośników i wymuszasz konfigurację dźwięku pozycyjnego dla słuchawek. Volume tuning Regulacja głośności Tuning microphone hardware volume to optimal settings. Ustawienie optymalnej głośności mikrofonu. Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. Teraz mów łagodnie tak jakbyś mówił późno w nocy, aby nikogo nie obudzić. Ustaw suwak w taki sposób, aby poziom dźwięku znajdował się na zielonym polu, gdy mówisz oraz pozostawał w niebieskim, gdy milczysz. Voice Activity Detection Wybór sposobu aktywacji głosowej Letting Mumble figure out when you're talking and when you're silent. Teraz pozwól Mumble ustalić, kiedy mówisz a kiedy milczysz. This will help Mumble figure out when you are talking. The first step is selecting which data value to use. Wybierz sposób aktywacji głosowej, której chcesz używać. Raw amplitude from input Detekcja na podstawie Amplitudy Signal-To-Noise ratio Detekcja na podstawie stosunku Sygnału-Do-Szumu (SNR) Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Następnie musisz ustawić ten suwak. Generalnie podczas mowy wygląda to tak, że zdecydowana mowa to obszar zielony, zwyczajna mowa to obszar żółty. Wszystko inne znajdujące się w obszarze czerwonym, to po prostu brak mowy. Device tuning Ustawianie urządzenia Changing hardware output delays to their minimum value. Zmiana opóźnień sprzętu do minimalnych wartości. Submit anonymous statistics to the Mumble project Przekazuj anonimowe statystyki do twórców Mumble Push To Talk: Aktywacja przyciskiem: Quality & Notifications Jakość i Powiadomienia Adjust quality and notification settings. Regulacja jakości oraz konfiguracja powiadomień. Quality settings Ustawienia jakości Low Niska Balanced Zrównoważona Notification settings Ustawienia powiadomień Use Text-To-Speech to read notifications and messages to you. Używaj funkcji Tekst-Na-Mowę do odczytywania powiadomień oraz wiadomości tekstowych. Disable Text-To-Speech and use sounds instead. Wyłącz funkcję Tekst-Na-Mowę i zamiast tego używaj powiadomień dźwiękowych. %1 ms %1 ms Enables attenuation of other applications while users talk to you Włącza tłumienie innych aplikacji, gdy inni użytkownicy mówią Attenuate applications while other users talk Tłumienie aplikacji podczas mowy innych użytkowników High Wysoka Custom Użytkownika You already set a customized quality configuration in Mumble. Select this setting to keep it. Posiadasz już własne ustawienia jakości w Mumble. Wybierz tę opcję, aby je zachować. Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. Włącza tłumienie innych aplikacji, gdy inni użytkownicy mówią. Oznacza to, że gdy tylko ktoś zacznie do ciebie mówić, dźwięk z innych aplikacji (takich jak np. WinAmp, Foobar2000) zostanie stłumiony, abyś mógł lepiej słyszeć jego wypowiedź. Apply some high contrast optimizations for visually impaired users Zastosuj optymalizacje wysokiego kontrastu dla osób niedowidzących Use high contrast graphics Użyj grafiki o wysokim kontraście Keep custom Text-To-Speech settings. Zachowaj własne ustawienia Tekstu-Na-Mowę. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode <p>Otwórz swój systemowy panel konfiguracji dźwięku a następnie zajrzyj do zakładki ustawień nagrywania. Upewnij się, że mikrofon jest aktywny i ustawiony na maksymalną głośność nagrywania. Jeżeli istnieje opcja MicBoost czy wzmocnienie dźwięku upewnij się, że jest aktywna.</p><p>Mów głośno, tak jakbyś był wkurzony lub podekscytowany. Zmniejsz głośność dźwięku w systemowym panelu sterowania do tego momentu aż pasek znajdzie się mniej więcej w pustym lub zakreskowanym polu ale <b>nie dopuść</b> żeby znajdował się w zakratkowanej części.</p> Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode Teraz mów łagodnie, tak jakbyś mówił późno w nocy, aby nikogo nie obudzić. Ustaw suwak w taki sposób, aby poziom dźwięku znajdował się na pustym polu, gdy mówisz oraz pozostawał w zakreskowanym, gdy milczysz. Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode Następnie musisz ustawić ten suwak. Generalnie wygląda to tak, że zdecydowana mowa to obszar pusty, zwyczajna mowa to obszar zakreskowany. Wszystko inne znajdujące się w obszarze zakratkowanym, to po prostu brak mowy. In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) Mumble będzie używać konfiguracji dla łącza o <b>niskiej przepustowości.</b> Będzie to skutkować wysokimi opóźnieniami oraz bardzo słabą jakością. Wybieraj ją tylko wtedy, gdy twoje połączenie nie jest w stanie obsłużyć innych ustawień (16kbit/s, pakiet co 60ms) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) <b>Zalecana standardowa</b> konfiguracja. Dostarcza odpowiednie zbalansowanie pomiędzy jakością, opóźnieniem a wykorzystywaniem pasma (40kbit/s, pakiet co 20ms) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) Ta konfiguracja jest zalecana tylko tam gdzie przepustowość nie jest problemem (np. sieci LAN). Dostarcza najniższe opóźnienie obsługiwane przez Mumble oraz <b> najwyższą jakość dźwięku</b> (72kbit/s, pakiet co 10ms) BanEditor Mumble - Edit Bans Mumble - edycja banów &Address &Adres IP &Mask &Maska Reason Powód Start Od End Do User Użytkownik Hash Certyfikat &Add &Dodaj &Update &Aktualizuj &Remove &Usuń Ban List Lista banów Search field Pole wyszukiwania This is the search field. Use it to find bans that have this username set in the username field. Pole wyszukiwania. Użyj go, aby szybko odnaleźć wpisany pseudonim na liście banów. Who are you looking for? Kogo szukasz? No nickname Brak pseudonimu IP address Adres IP No IP address Brak adresu IP Reason for the ban Powód bana No reason Bez powodu Ban end date Data końca bana Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). Data końca bana. Jeżeli data poczatku i końca bana będzie taka sama to ban będzie permanentny (nigdy nie wygaśnie). Certificate hash Hash certyfiaktu No certificate hash Brak hashu certyfikatu Banned users Zbanowani This is a list with banned users. Lista zbanowanych użytkowników. Use this button if you want to add a new ban. Użyj tego przycisku, gdy chcesz dodać nowego bana. Use this button if you want to update ban information. Użyj tego przycisku, gdy chcesz dokonać edycji bana. Use this button if you want to remove user from the ban list. Użyj tego przycisku, gdy chcesz usunąć bana. Clear all fields Wyczyść wszystkie pola This button clears all fields. Use it if you want to add a new ban. Ten przycisk czyści wszystkie pola. Użyj go, gdy chcesz dodać nowego bana. Clear Wyczyść Ban List - %n Ban(s) Lista banów - %n BanLista banów - %n BanówLista banów - %n BanówLista banów - %n Banów CertView Name Nazwa Email Email Issuer Wystawiony przez Expiry Date Data wygaśnięcia (none) (brak) Self-signed Własnoręcznie podpisany CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. Nie można zweryfikować adresu email.<br />Podaj właściwy (lub żaden) adres email, aby kontynuować. There was an error generating your certificate.<br />Please try again. Wystąpił błąd podczas generowania twojego certyfikatu.<br />Prosimy spróbować później. Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. Twój certyfikat oraz klucz nie mogły zostać wyeksportowane do formatu PKCS#12. W twoim certyfikacie może występować błąd. The file could not be opened for writing. Please use another file. Plik nie mógł zostać otwarty w celu zapisania. Prosimy użyć innego pliku. The file's permissions could not be set. No certificate and key has been written. Please use another file. Nie udało się uzyskać praw dostępu do pliku. Certyfikat oraz klucz nie zostały zapisane. Proszę użyć innego pliku. The file could not be written successfully. Please use another file. Plik nie mógł zostać zapisany. Prosimy użyć innego pliku. The file could not be opened for reading. Please use another file. Plik nie mógł zostać otwarty w celu odczytania jego zawartości. Prosimy użyć innego pliku. The file is empty or could not be read. Please use another file. Plik jest pusty lub uszkodzony. Prosimy użyć innego pliku. The file did not contain a valid certificate and key. Please use another file. Plik nie zawierał poprawnego certyfikatu i klucza. Prosimy użyć innego pliku. Select file to export certificate to Wybierz plik, do którego zostanie wyeksportowany certyfikat Select file to import certificate from Wybierz plik, z którego importować certyfikat Unable to import. Missing password or incompatible file type. Nie można zaimportować. Brak hasła lub niezgodny typ pliku. <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. <b>Wygaśnięcie certyfikatu:</b> Twój certyfikat niedługo straci ważność. Musisz go odnowić, jeżeli tego nie zrobisz nie będziesz w stanie połączyć się z serwerami, na których jesteś zarejestrowany. Certificates Certificate Management Zarządzanie certyfikatami Certificate Authentication Autoryzacja certyfikatami Authenticating to servers without using passwords Autoryzacja na serwerach bez użycia haseł Current certificate Obecny certyfikat This is the certificate Mumble currently uses. To jest certyfikat, którego obecnie używa Mumble. Current Certificate Obecny certyfikat Create a new certificate Utwórz nowy certyfikat This will create a new certificate. Tworzy nowy certyfikat. Import certificate from file Importuj certyfikat z pliku This will import a certificate from file. Importuje certyfikat z pliku. Import a certificate Importuj certyfikat Export Certificate Eksportuj certyfikat This will export a certificate to file. Eksportuje certyfikat do pliku. Export current certificate Eksportuj obecny certyfikat Import Certificate Importuj certyfikat PKCS #12 Certificate import Import certyfikatu PKCS #12 <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble może importować certyfikaty w formacie PKCS #12. Jest to format używany podczas eksportu certyfikatu w Mumble oraz innych aplikacjach takich jak Opera, Internet Explorer czy Firefox.</p><p>Jeżeli plik jest zabezpieczony hasłem, będziesz musiał je podać, aby zaimportować certyfikat.</p> Import from Importuj z Filename to import from Nazwa pliku do importu This is the filename you wish to import a certificate from. To jest nazwa pliku, z którego chcesz importować certyfikat. Select file to import from Wybierz plik, z którego chcesz importować This opens a file selection dialog to choose a file to import a certificate from. Otwiera okno wyboru plików w celu importowania certyfikatu. Open... Otwórz... Password Hasło Password for PKCS#12 file Hasło dla pliku PKCS #12 This is the password for the PKCS#12 file containing your certificate. To jest hasło dla pliku PKCS #12, który zawiera twój certyfikat. Certificate to import Certyfikat do zaimportowania This is the certificate you are importing. To jest certyfikat, który importujesz. Certificate Details Szczegóły certyfikatu Replace Certificate Zastąp certyfikat Replace existing certificate with new certificate? Zastąpić istniejący certyfikat nowym? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> <p>Uwaga masz już zachowany certyfikat w Mumble i masz zamiar go zastąpić.</p><p>Jeżeli uaktualniasz swój certyfikat i użyty w nim e-mail zgadza się z obecnym, wówczas jest to bezpieczne i serwery, do których zazwyczaj się łączysz rozpoznają cię automatycznie, tak jak ze starym certyfikatem.</p><p>Jeżeli nie, to niestety nie będziesz rozpoznawany na tych serwerach jako ta sama osoba. Jeżeli nie wchodziłeś nigdy na żaden serwer zignoruj ten komunikat.</p><p>Jesteś pewien, że chcesz zastąpić swój bieżący certyfikat?</p> This is the certificate Mumble currently uses. It will be replaced. To jest certyfikat, którego Mumble obecnie używa. Zostanie on zastąpiony innym. New certificate Nowy certyfikat This is the new certificate that will replace the old one. To jest nowy certyfikat, który zastąpi stary. New Certificate Nowy certyfikat Make a backup of your certificate Stwórz kopię swojego certyfikatu Export to Eksportuj do Filename to export to Nazwa pliku, do którego eksportować This is the filename you wish to export a certificate to. To jest nazwa pliku, do którego chcesz zapisać swój certyfikat. Save As... Zapisz jako... This is the certificate Mumble currently uses. It will be exported. To jest certyfikat obecnie używany w Mumble. Zostanie on wyeksportowany. Generate a new certificate for strong authentication Generuj nowy certyfikat dla silnej autoryzacji <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> <p> Za chwilę Mumble wygeneruje silny certyfikat, abyś mógł autoryzować się na serwerach.</p><p>Jeżeli chcesz, możesz podać dodatkowe informacje i zapisać je wewnątrz certyfikatu, zostaną one przesłane na serwer, do którego podłączysz się w przyszłości. Jeżeli podasz prawdziwy adres email możesz śmiało uaktualnić swój certyfikat do wersji CA, co sprawi, że będzie on jeszcze silniej zabezpieczony.</p> Name Nazwa Email Email Your email address (e.g. johndoe@mumble.info) Twój adres email (np. jankowalski@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. To jest twój adres email. Zalecane jest użycie prawdziwego adresu email, co pozwoli na ulepszenie do silnego certyfikatu bez problemów z autoryzacją. Your name (e.g. John Doe) Twoja nazwa (np. Jan Kowalski) This is your name, and will be filled out in the certificate. This field is entirely optional. To twoja nazwa - zostanie użyta w certyfikacie. Te pole jest opcjonalne. Finish Zakończ Certificate-based authentication is ready for use Autoryzacja bazująca na certyfikatach jest gotowa do pracy Enjoy using Mumble with strong authentication. Miłej zabawy z Mumble przy użyciu silnej autoryzacji. Automatic certificate creation Automatyczne tworzenie certyfikatu <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>Jeżeli kiedykolwiek zgubisz swój certyfikat, twój sprzęt się spali, przeinstalujesz swój system lub z jakiegokolwiek innego powodu stracisz plik, to nie będziesz mógł wejść na serwery, na których byłeś zarejestrowany. Pamiętaj, że utworzenie kopii zapasowej to <b>konieczność</b> - użyj do tego na przykład dysku przenośnego.</p><p>Pamiętaj również, że ten plik nie jest w żaden sposób szyfrowany i jeżeli osoba nieautoryzowana uzyska do niego dostęp, to będzie w stanie podszywać się pod ciebie. Prosimy, dbaj o swoje kopie zapasowe!</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> <p>Mumble może wykorzystywać certyfikaty do autoryzacji na serwerach. Używanie certyfikatów pozwala uniknąć haseł, co oznacza, że nie musisz ujawniać hasła do zdalnej witryny. Umożliwia to także bardzo prostą rejestrację użytkowników i niezależną od serwerów listę znajomych po stronie klienta.</p><p>Mumble może pracować bez certyfikatów, ale licz się z tym, że większość serwerów będzie ich wymagać.</p><p>Utworzenie nowego certyfikatu automatycznie wystarcza w większości przypadków użycia. Ale Mumble obsługuje również certyfikaty reprezentujące zaufanie do własności użytkowników adresu e-mail. Certyfikaty te są wystawiane przez osoby trzecie. Aby uzyskać więcej informacji, zobacz <a href="http://mumble.info/certificate.php">dokumentację certyfikatów użytkowników</a>.</p> ChanACL None Żaden Traverse Wejście na pod-kanał Enter Wejście Speak Mowa Mute/Deafen Wyciszanie / Ogłuszanie Make channel Tworzenie kanałów Make temporary Tworzenie kanałów tymczasowych Link channel Łączenie kanałów This represents no privileges. Brak uprawnień. This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. Uprawnienie to umożliwia całkowity dostęp do kanału, wliczając możliwość dokonywania zmian w grupach oraz regułach ACL. To uprawnienie zawiera wszystkie pozostałe uprawnienia. This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. Uprawnienie to umożliwia wejście na pod-kanały. Jeżeli użytkownik ma zabroniony dostęp do tego uprawnienia nie będzie w stanie w żaden sposób wejść na pod-kanały, niezależnie od innych uprawnień jakie posiada w pod-kanałach. This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. Uprawnienie to umożliwia wejście na kanał. Jeżeli posiadasz hierarchiczną strukturę kanałów, możesz nadać każdemu uprawnienie wejścia na pod-kanały jednocześnie blokując dostęp do głównego kanału w hierarchii. This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. Uprawnienie to umożliwia używanie mowy na kanale. Użytkownicy nieposiadający tego uprawnienia będą automatycznie wyciszani przez serwer, oraz nie będą w stanie mówić dopóki osoba z odpowiednimi uprawnieniami nie zdejmie im wyciszenia. This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. Uprawnienie to umożliwia używanie szeptu do tego kanału z zewnątrz. Działa dokładnie tak samo jak uprawnienie <i>Mowa</i>, lecz jest stosowany do pakietów mowy, gdy użyty jest przycisk Szeptu. Może zostać użyte do wygłaszania przemówień do całego drzewa kanałów bez potrzeby ich linkowania. This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. Uprawnienie to umożliwia ogłuszanie oraz wyciszanie mikrofonu innym użytkownikom. Gdy użytkownik zostanie wyciszony pozostanie w tym stanie dopóki inny uprawniony użytkownik nie zdejmie wyciszenia lub do czasu ponownego połączenia z serwerem. This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. Uprawnienie to umożliwia przenoszenie użytkowników na inne kanały oraz wykopanie ich z serwera. Aby przenieść użytkownika, użytkownik przenoszący musi mieć uprawnienie <i>Przenoszenie użytkowników</i> w docelowym kanale. Użytkownicy z tym uprawnieniem mogą przenosić innych użytkowników na kanały, na które sami nie mogliby normalnie wejść. This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. Uprawnienie to umożliwia tworzenie pod-kanałów. Użytkownik tworzący pod-kanał zostaje automatycznie dodany do grupy administratorów tego pod-kanału. This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. Uprawnienie to umożliwia tworzenie tymczasowych pod-kanałów. Użytkownik tworzący pod-kanał zostaje automatycznie dodany do grupy administratorów tego pod-kanału. Tymczasowe kanały nie są zapisywane i znikają, gdy wszyscy użytkownicy z nich wyjdą. This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. Uprawnienie to umożliwia łączenie kanałów. Użytkownicy na połączonych kanałach słyszą się nawzajem, jeżeli tylko mówiąca osoba posiada uprawnienie <i>Mowa</i> na kanale gdzie znajduje się słuchacz. Aby połączyć kanały musisz posiadać uprawnienie łączenia kanałów na obu kanałach, aby je rozłączyć tylko w jednym. This represents the permission to write text messages to other users in this channel. Uprawnienie to umożliwia pisanie wiadomości tekstowych do innych użytkowników znajdujących się na tym kanale. This represents the permission to forcibly remove users from the server. Uprawnia do siłowego usuwania użytkowników z serwera. This represents the permission to permanently remove users from the server. Uprawnienie to umożliwia trwałe usunięcie użytkownika z serwera. This represents the permission to register and unregister users on the server. Uprawnia do rejestrowania oraz wyrejestrowywania użytkowników na serwerze. This represents the permission to register oneself on the server. Uprawnienie to umożliwia rejestrację samego siebie na serwerze. Whisper Szept Move Przenoszenie użytkowników Text message Wysyłanie wiadomości tekstowej Kick Kopanie użytkowników Ban Banowanie użytkowników Register User Rejestracja użytkowników Register Self Rejestrację samego siebie Write ACL Edycja ACL ChatbarTextEdit Paste and &Send Paste and send Wklej i &wyślij <center>Type chat message here</center> <center>Wpisz wiadomość</center> ClientUser Friend Znajomy Authenticated Uwierzytelniony Priority speaker Nadrzędny mówca Recording Nagrywanie Muted (server) Wyciszony (przez serwer) Deafened (server) Ogłuszony (przez serwer) Local Ignore (Text messages) Lokalne ignorowany (wiadomości tekstowe) Local Mute Wyciszenie lokalne Muted (self) Wyciszony (przez siebie) Deafened (self) Ogłuszony (przez siebie) ConfigDialog Accept changes Akceptuj zmiany This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. Ten przycisk zaakceptuje zmiany i powróci do aplikacji.<br />Ustawienia zostaną zapisane na dysku, gdy zamkniesz program. Reject changes Odrzuć zmiany This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. Ten przycisk odrzuca zmiany i powraca do aplikacji.<br />Ustawienia zostaną przywrócone do poprzednich wartości. Apply changes Zastosuj zmiany This button will immediately apply all changes. Ten przycisk natychmiastowo zastosowuje zmiany. Undo changes for current page Cofnij zmiany na aktualnej karcie This button will revert any changes done on the current page to the most recent applied settings. Cofa dokonane zmiany na aktualnej karcie do najczęściej wybieranych ustawień. Restore defaults for current page Przywróć domyślne ustawienia na aktualnej karcie This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. Przywróci ustawienia domyślne dla aktualnej karty. Inne karty nie zostaną zmienione. <br />Aby przywrócić wszystkie opcje do wartości domyślnych musisz użyć tego przycisku na każdej karcie. Mumble Configuration Konfiguracja Mumble ConnectDialog Connecting to %1 Łączenie do %1 Enter username Podaj nazwę użytkownika Adding host %1 Dodawanie hosta %1 Servername Nazwa serwera Hostname Host Bonjour name Nazwa Bonjur Port Port Addresses Adresy Website Strona WWW Packet loss Utracone pakiety Ping (80%) Opóźnienie (80%) %1 ms %1 ms Ping (95%) Opóźnienie (95%) Bandwidth Przepustowość %1 kbit/s %1 kbit/s &Connect &Połącz &Filters &Filtry Unknown Nieznany Users Użytkowników Version Wersja Failed to fetch server list Nie udało się załadować listy serwerów Mumble Server Connect Lista serwerów Mumble Ping Opóźnienie Remove from Favorites Usuń z ulubionych Add custom server Dodaj serwer niestandardowy Show all servers that respond to ping Wyświetl wszystkie serwery reagujące na ping Show all servers with users Wyświetl serwery z użytkownikami Show all servers Wyświetl wszystkie serwery &Copy &Kopiuj Copy favorite link to clipboard Kopiuj ulubiony do schowka &Paste &Wklej Paste favorite from clipboard Wklej ulubiony ze schowka &Edit... &Edytuj... &Add New... &Dodaj nowy... Add to &Favorites Dodaj do &ulubionych Open &Webpage Otwórz &stronę Show &Reachable Wyświetlaj &osiągalne Show &Populated Wyświetl &zaludnione Show &All Wyświetlaj &wszystkie ConnectDialogEdit Edit Server Edycja serwera Name of the server Nazwa serwera A&ddress A&dres Internet address of the server. Internet address of the server. Adres internetowy serwera. <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Adres</b><br/>Adres internetowy serwera. To może być zwykła nazwa hosta, adres IPv4/IPv6 lub adres usługi Bonjour. Identyfikator usługi Bonjour musi być rozpoczęty znakiem @, aby był rozpoznawany przez Mumble. &Port &Port Port on which the server is listening Port, na którym nasłuchuje serwer <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. <b>Port</b><br/>Port, na którym nasłuchuje serwer. Jeżeli serwer jest identyfikowany przez usługę Bonjour pole to będzie ignorowane. &Username &Użytkownik Username to send to the server Nazwa użytkownika na serwerze <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. <b>Nazwa użytkownika</b><br/>Nazwa użytkownika na serwerze. Zwróć uwagę na to, że serwer może narzucać pewne restrykcje poszczególnych nazw. Twoja nazwa użytkownika może być też po prostu zajęta przez kogoś innego. Label Etykieta Add Server Dodaj serwer You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 Jesteś obecnie połączony z serwerem. Czy chcesz wypełnić okno danymi połączenia tego serwera? Host: %1 Port: %2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 Masz adres URL w schowku. Czy chcesz wypełnić okno tymi danymi? Host: %1 Port: %2 Password Hasło Password to send to the server Hasło, które zostanie wysłane na serwer <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. <b>Hasło</b><br/>Hasło, które zostanie wysłane na serwer podczas połączenia. Hasło jest wymagane, jeżeli łączysz się jako <i>SuperUser</i> lub na serwer, który używa autoryzacji za pomocą haseł. Jeżeli nie zostanie wpisane - zostaniesz o nie poproszony podczas łączenia. Show password Wyświetl hasło <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. <b>Etykieta</b><br/>Etykieta serwera. Określa, pod jaką nazwą twój serwer będzie wyświetlany na liście serwerów. Etykieta może zostać wybrana dowolnie. Local server label Lokalna etykieta serwera 127.0.0.1 127.0.0.1 64738 64738 Your username Twój pseudonim Your password Twoje hasło &Fill &Wypełnij CoreAudioSystem Default Device Urządzenie domyślne CrashReporter Mumble Crash Report Raportowanie błędów Mumble <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> <p><b>Okropnie nam przykro, ale wygląda na to, że Mumble zostało niespodziewanie zamknięte. Czy chcesz wysłać raport z błędem do twórców programu?</b></p><p>Raport ten zawiera kopię pamięci Mumble z momentu, w którym program przestał funkcjonować, pomoże to w dużej mierze naszej drużynie szybko usunąć błąd, który spowodował ten problem.</p> Email address (optional) Adres email (opcjonalnie) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash Prosimy o krótki opis czynności w języku Angielskim, które były wykonane podczas wystąpienia błędu Send Report Wyślij raport Don't send report Nie wysyłaj Crash upload successful Raport został przesłany pomyślnie Thank you for helping make Mumble better! Dziękujemy za pomoc przy Mumble! Mumble stanie się lepszy dzięki tobie! Crash upload failed Nie udało się wysłać raportu We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. Bardzo nam przykro, ale wygląda na to, że wysyłanie raportu nie powiodło się z powodu %1 %2. Prosimy o kontakt z twórcami aplikacji. This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 To zapewne nie jest śmieszne, ale wygląda na to, że istnieje mały błąd w narzędziu do wysyłania raportów. Możesz powiadomić twórców programu o błędzie %1 Uploading crash report Wysyłanie raportu Abort upload Przerwij DXAudioInput Default DirectSound Voice Input Domyślne wejście dźwięku DirectSound Opening chosen DirectSound Input device failed. No microphone capture will be done. Otwieranie wybranego wejścia dźwięku nie powiodło się. Dźwięk z mikrofonu nie będzie pobierany. Opening chosen DirectSound Input failed. Default device will be used. Otwieranie wybranego wejścia dźwięku DirectSound nie powiodło się. Zostanie użyte urządzenie domyślne. Lost DirectSound input device. Utracono urządzenie wejścia DirectSound. DXAudioOutput Default DirectSound Voice Output Domyślne wyjście dźwięku DirectSound Opening chosen DirectSound Output failed. Default device will be used. Otwieranie wybranego wyjścia dźwięku DirectSound nie powiodło się. Zostanie użyte urządzenie domyślne. Lost DirectSound output device. Utracono urządzenie wyjścia DirectSound. Opening chosen DirectSound Output failed. No audio will be heard. Otwieranie wybranego wyjścia dźwięku nie powiodło się. Żaden dźwięk nie będzie słyszany. Database Mumble failed to initialize a database in any of the possible locations. Nie udało się zainicjalizować bazy danych w żadnej z podanych lokacji. The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. Baza danych '%1' jest tylko do odczytu. Mumble nie może przechowywać ustawień serwera (np. certyfikatów SSL) dopóki nie naprawisz tego problemu. DeveloperConsole Developer Console Konsola programisty DockTitleBar Drag here Przeciągnij tutaj GlobalShortcut Shortcuts Skróty List of configured shortcuts Lista skonfigurowanych skrótów Function Funkcja Data Opcje Shortcut Skrót Suppress Rezerwuj Add new shortcut Dodaj nowy skrót This will add a new global shortcut Dodaje nowy, globalny skrót &Add &Dodaj Remove selected shortcut Usuń zaznaczony skrót This will permanently remove a selected shortcut. Trwale usunie wybrany skrót. &Remove &Usuń <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> <html><head/><body><p>Mumble obecnie może używać tylko przycisków myszy oraz modyfikatorów klawiatury (Alt, Ctrl, Cmd, itp.), jako skrótów globalnych.</p><p>Jeżeli potrzebujesz większej swobody, możesz aktywować <span style=" font-style:italic;">Wejście dla urządzeń wspomagających</span> w systemowych ustawieniach dostępności. Jednakże, ta zmiana może potencjalnie pozwolić innym programom na odczyt tego co piszesz na klawiaturze.</p></body></html> Open Accessibility Preferences Otwórz preferencje dostępności Skip Pomiń Enable Global Shortcuts Włącz skróty globalne <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. <b>Dodatkowe mechanizmy skrótów</b><br />Ta sekcja umożliwia konfigurowanie użycia dodatkowych mechanizmów GlobalShortcut. Additional Shortcut Engines Dodatkowe mechanizmy skrótów <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. <b>Włącz zaczepy Windows</b>.<br />Włącza to mechanizm skrótów zaczepów Windows. Używanie tego mechanizmu pozwala Mumble na tłumienie wciskanych klawiszy i kliknięć myszą. Enable Windows hooks Włącz zaczepy Windows <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. <b>Włącz GKey</b>.<br />To ustawienie włącza obsługę mechanizmu skrótów GKey dla klawiszy "G" dostępnych w klawiaturach Logitech. Enable GKey Włącz GKey <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. <b>Włącz XInput</b><br />To ustawienie włącza obsługę mechanizmu skrótów XInput dla kontrolerów kompatybilnych z Xboksem. Enable XInput Włącz XInput <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. <b>Włącz skróty w uprzywilejowanych aplikacjach</b>.<br />Znane również jako "UIAccess". Dzięki temu Mumble może odbierać zdarzenia skrótów globalnych z programów działających na wysokich poziomach uprawnień, takich jak wiersz polecenia administratora lub starsze gry z uprawnieniami administratora. <br /><br /> Bez tej opcji korzystanie z globalnych skrótów Mumble w aplikacjach uprzywilejowanych nie będzie działać. Może się to wydawać niespójne: na przykład, jeśli przycisk Aktywacja przyciskiem zostanie naciśnięty w programie bez uprzywilejowania, ale zostanie zwolniony w uprzywilejowanej aplikacji, Mumble nie zauważy, że został zwolniony i będziesz kontynuować rozmowę, dopóki nie wciśniesz ponownie przycisku Aktywacja przyciskiem. Enable shortcuts in privileged applications Włącz skróty w uprzywilejowanych aplikacjach GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> <html><head/><body><p>Mumble obecnie może używać tylko przycisków myszy oraz modyfikatorów klawiszy klawiatury (Alt, Ctrl, Cmd, itd.) jako globalnych skrótów. </p><p> Jeśli chcesz więcej elastyczności, możesz dodać Mumble do zaufanych programów w sekcji ustawień Zabezpieczenia i Prywatność Twojego systemu Mac. </p><p>W ustawieniach Zabezpieczenia i Prywatność należy wejść w zakładkę Prywatność. Później należy wybrać Dostępność (u dołu strony) z listy na lewo. Na końcu należy dodać Mumble do listy zaufanych programów.</body></html> Shortcuts Skróty Shortcut button combination. Kombinacja klawiszy skrótów. <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. <b>Globalna kombinacja klawiszy.</b><br />Kliknij w to pole oraz naciśnij docelowy klawisz lub kombinację klawiszy. Podwójne kliknięcie czyści pole. Suppress keys from other applications Zablokuj skrót innej aplikacji <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. <b>Ukrywa wciśnięcia przycisków przed innymi aplikacjami.</b><br /> Włączając ukrywasz przycisk przed inną aplikacją (lub ostatni z kombinacji wielo-przyciskowych). Nie wszystkie przyciski da się ukryć w ten sposób. GlobalShortcutTarget Whisper Target Szepnij do Whisper to list of Users Szept do użytkowników Channel Target Docelowy kanał Restrict to Group Ogranicz dla grupy If specified, only members of this group will receive the whisper. Gdy zaznaczone - tylko użytkownicy tej grupy usłyszą szept. List of users Lista użytkowników Add Dodaj Remove Usuń Modifiers Modyfikacje Do not send positional audio information when using this whisper shortcut. Nie wysyłaj pozycyjnego dźwięku podczas szeptu. Ignore positional audio Ignoruj dźwięk pozycyjny Shout to Linked channels Krzycz do połączonych kanałów Shout to subchannels Krzycz do pod-kanałów Shout to Channel Krzycz do kanału The whisper will also be transmitted to linked channels. Szept będzie również transmitowany do połączonych kanałów. The whisper will also be sent to the subchannels of the channel target. Szept będzie również transmitowany do pod-kanałów docelowego kanału. GlobalShortcutX Mouse %1 Mysz %1 JackAudioSystem Hardware Ports Porty sprzętowe Mono Mono Stereo Stereo LCD Not connected Niepołączony LCDConfig Enable this device Uaktywnij to urządzenie LCD LCD Devices Urządzenia Name Nazwa <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> <p>To jest lista dostępnych urządzeń LCD w systemie. Lista jest posortowana alfabetycznie, zawiera również rozmiar wyświetlacza. Mumble wspiera wysyłanie sygnałów do kilku urządzeń LCD na raz.</p> <h3>Rozmiar:</h3> <p> Te pole opisuje rozmiar urządzenia LCD. Rozmiar jest podany w pikselach lub w znakach, w zależności od urządzenia.</p> <h3>Włączone:</h3> <p>Te pole decyduje czy Mumble powinno używać danego urządzenia LCD czy nie.</p> Size Rozmiar Enabled Włączone Views Podgląd Minimum Column Width Minimalna szerokość kolumny <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> <p>Określa minimalną szerokość kolumny w widoku użytkowników.</p><p>Jeżeli zbyt wielu użytkowników mówi jednocześnie, widok użytkownika podzieli się na dwie kolumny. Możesz użyć tej opcji, aby wybrać kompromis pomiędzy ilością użytkowników wyświetlanych na ekranie a rozmiarem ich nazw.</p> This setting decides the width of column splitter. Pomaga w ustaleniu szerokości kolumny podzielonych okien. Splitter Width Szerokość rozdzielnika Log Debug Debugowanie Critical Błąd krytyczny Warning Ostrzeżenie Information Informacja Server Connected Połączenie z serwerem Server Disconnected Rozłączenie od serwera Other self-muted/deafened Ogłuszenie oraz wyciszenie (kogoś innego) Permission Denied Brak dostępu Text Message Wiadomość tekstowa User Joined Server Dołączenie do serwera User Left Server Opuszczenie serwera User recording state changed Użytkownik zmienił stan nagrywania User kicked (you or by you) Wykopanie użytkownika (ciebie lub przez ciebie) User kicked Wykopanie użytkownika You self-muted Wyciszyłeś się User muted (you) Wyciszenie (ciebie) User muted (by you) Wyciszenie (przez ciebie) User muted (other) Wyciszenie (ktoś inny) User Joined Channel Dołączenie do kanału User Left Channel Opuszczenie kanału You self-unmuted Wyłączyłeś wyciszenie You self-deafened Ogłuszyłeś się You self-undeafened Wyłączyłeś ogłuszenie User renamed Zmieniono pseudonim użytkownika You Joined Channel Dołączyłeś do kanału You Joined Channel (moved) Dołączyłeś do kanału (przeniesiony) User connected and entered channel Użytkownik podłączony i dołączył do kanału User left channel and disconnected Użytkownik opuścił kanał i rozłączył się Private text message Prywatna wiadomość tekstowa the server serwer [[ Invalid size ]] [[ Nieprawidłowy rozmiar ]] [[ Text object too large to display ]] [[ Obiekt tekstowy jest zbyt duży, aby go wyświetlić ]] [Date changed to %1] [Data zmieniona na %1] link to %1 link do %1 FTP link to %1 Link FTP do %1 player link link do gracza channel link link do kanału %1 link link %1 LogConfig Toggle console for %1 events Włącz konsolę dla zdarzeń: %1 Toggle pop-up notifications for %1 events Włącz powiadomienia dla zdarzeń: %1 Toggle Text-To-Speech for %1 events Włącz Tekst-Na-Mowę dla %1 Click here to toggle sound notification for %1 events Kliknij tutaj, aby włączyć powiadomienia dźwiękowe dla %1 Toggle window highlight (if not active) for %1 events Przełącz wyróżnienie okna (jeśli nie jest aktywne) dla zdarzeń %1 Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change Ścieżka do pliku dźwiękowego dla powiadomień dźwiękowych w przypadku wydarzeń typu %1<br />Kliknięcie pojedyncze odtwarza dźwięk<br />Kliknięcie podwójne zmienia plik Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. Kliknij tutaj, by przełączać stan wpisów w konsoli dla %1.<br />Gdy zaznaczone - Mumble będzie wyświetlać wszystkie %1 w logu. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. Kliknij tutaj, by przełączać stan powiadomień dla %1.<br />Gdy zaznaczone - Mumble będzie pokazywać wszystkie %1 w obszarze powiadomień. Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. Kliknij tutaj, by przełączyć wyróżnienie okna dla zdarzeń %1.<br />Gdy zaznaczone - okno Mumble zostanie wyróżnione dla każdego zdarzenia %1, jeśli nie jest aktywne. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. Ścieżka do pliku dźwiękowego użytego dla powiadomień dźwiękowych w przypadku wydarzeń typu %1<br />Kliknięcie pojedyncze odtwarza dźwięk<br />Kliknięcie podwójne zmienia plik<br />Upewnij się, że powiadomienia tego typu wydarzeń są włączone, inaczej powyższe ustawienia nie odniosą skutku. Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. Kliknij tutaj, aby przełączać stan Tekstu-Na-Mowę dla %1.<br />Gdy zaznaczone Mumble będzie używać Tekstu-Na-Mowę dla %1. Tekst-Na-Mowę jest również w stanie odczytywać zawartość zdarzeń, które nie są przeznaczone dla plików dźwiękowych. Tekst-Na-Mowę nie może być aktywny razem z powiadomieniami dźwiękowymi. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. Ścieżka do pliku użytego do powiadomień dźwiękowych w przypadku dla %1.<br />Gdy zaznaczone - Mumble użyje dźwięku, aby powiadomić o zdarzeniach typu %1. Pliki dźwiękowe oraz Tekst-Na-Mowę nie mogą działać razem. Messages Wiadomości Message Wiadomość Console Konsola Notification Powiadomienie Text-To-Speech Tekst-Na-Mowę Soundfile Plik dźwiękowy Path Ścieżka do pliku dźwiękowego Text To Speech Tekst na mowę Volume Głośność Volume of Text-To-Speech Engine Głośność tekstu na mowę <b>This is the volume used for the speech synthesis.</b> <b>Głośność tekstu na mowę.</b> Length threshold Długość Message length threshold for Text-To-Speech Engine Długość wiadomości dla tekstu na mowę <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. <b>Ustala długość wiadomości odczytywanej przez tekst na mowę.</b><br />Wiadomości większe niż ustalony limit nie będą odczytywane. Characters liter(y) Whisper Szept If checked you will only hear whispers from users you added to your friend list. Gdy zaznaczone będziesz słyszeć tylko szepty od użytkowników dodanych do twojej listy znajomych. Only accept whispers from friends Akceptuj szepty tylko od znajomych If enabled text messages you send will be read back to you with TTS Gdy włączone - twoje wiadomości tekstowe zostaną odczytane przez syntezator mowy Read back own messages Odczytuj własne wiadomości Chat Log Historia czatu Maximum chat length Maksymalna długość historii czatu Unlimited Bez ograniczeń Lines Linii Highlight Wyróżnienie LookConfig System default Domyślny None Żadne Only with users Tylko z użytkownikami All Wszystkie Ask Pytaj Do Nothing Nie rób nic Move Przenieś <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory <a href="%1">Przeglądaj</a> User Interface Interfejs This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. Określa, kiedy kanały mają być automatycznie rozwijane. <i>Żadne</i> i <i>Wszystkie</i> - Żaden kanał lub wszystkie kanały będą rozwijane. <i>Tylko z użytkownikami</i> - rozwija i zwija kanały, na których znajdują się użytkownicy. List users above subchannels (requires restart). Nazwy użytkowników będą wyświetlane ponad kanałami (wymaga restartu). <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. <b>Nazwy użytkowników będą wyświetlane ponad pod-kanałami w widoku kanałów.</b><br />Restart Mumble jest wymagany, aby zobaczyć zmiany. Users above Channels Wyświetlaj nazwy użytkowników ponad pod-kanałami <b>If set, will verify you want to quit if connected.</b> <b>Jeżeli ustawione - program będzie sprawdzać czy chcesz go zamknąć, gdy jesteś na serwerze.</b> Show number of users in each channel Wyświetlaj liczbę użytkowników na każdym kanale Show channel user count Wyświetlaj liczbę użytkowników na kanałach Language Język Language to use (requires restart) Wybierz język (wymagany restart) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. <b>Wybiera, który język będzie używany.</b><br />Będziesz musiał zrestartować Mumble, by używać nowego języka. Look and Feel Wygląd Layout Ułożenie Classic Klasyczny Stacked Stos Hybrid Hybryda Custom Własny This changes the behavior when moving channels. Zmienia zachowanie podczas przenoszenia kanałów. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. Zmienia zachowanie przeciągania kanałów - może zostać użyte, by zapobiec przypadkowemu przeciąganiu. <i>Przenieś</i> przenosi kanał bez powiadomienia. <i>Nic nie rób</i> nic nie robi i wyświetla wiadomość z błędem. <i>Pytaj</i> używa powiadomienia tekstowego, by upewnić się, czy na pewno chciałeś przenieść kanał. Expand Rozwijanie kanałów When to automatically expand channels Kiedy automatycznie rozwijać kanały Channel Dragging Przeciąganie kanałów Ask whether to close or minimize when quitting Mumble. Mumble będzie pytać czy chcesz zamknąć czy zminimalizować program. Ask on quit while connected Ostrzegaj przed zamknięciem programu Always On Top Zawsze na wierzchu <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> <b>Gdy zaznaczone - minimalizacja głównego okna Mumble sprawi, że okno zostanie ukryte a dostęp do niego będzie możliwy tylko przez ikonę w zasobniku systemowym. Jeżeli opcja jest niezaznaczona - minimalizacja Mumble ukryje okno w normalny sposób (na pasku zadań).</b> Hide in tray when minimized Ukryj w zasobniku systemowym podczas minimalizacji Hide the main Mumble window in the tray when it is minimized. Ukryj Mumble w zasobniku systemowym, gdy główne okno zostanie zminimalizowane. This setting controls when the application will be always on top. Określa, kiedy aplikacja ma pozostawać zawsze na wierzchu. Never Nigdy Always Zawsze In minimal view W widoku minimalnym In normal view W widoku normalnym Displays talking status in system tray Wyświetla status mowy Show talking status in tray icon Wyświetlaj status mowy This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. Określa, w jakich sytuacjach aplikacją pozostanie zawsze na wierzchu. Jeżeli wybierzesz <i>Nigdy</i> aplikacja nie zostanie na wierzchu. <i>Zawsze</i> będzie utrzymywać aplikację na wierzchu cały czas. <i>W widoku minimalnym</i> / <i>W widoku normalnym</i> aplikacja pozostanie zawsze na wierzchu tylko, gdy widok minimalny będzie włączony/wyłączony. Show context menu in menu bar Wyświetlaj menu kontekstowe w głównym pasku menu Apply some high contrast optimizations for visually impaired users Zastosuj optymalizacje wysokiego kontrastu dla osób niedowidzących Optimize for high contrast Optymalizuj dla wysokiego kontrastu Application Aplikacja Adds user and channel context menus into the menu bar Dodaje menu kontekstowe do głównego paska menu Tray Icon Ikona w pasku zadań Channel Tree Drzewo kanałów Use selected item as the chat bar target Użyj zaznaczonych elementów jako celu dla czatu Filter automatically hides empty channels Automatycznie ukrywaj puste kanały Show transmit mode dropdown in toolbar Pokazuj tryb nadawania w menu rozwijanym Theme Motyw Theme to use to style the user interface Motyw używany do zmiany wyglądu interfejsu <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. <b>Ustawia styl motywu Mumble</b><br />Mumble wyszuka motywy z pewnych lokalizacji i wyświetli je na liście. Wybrany motyw będzie użyty do dostosowania wyglądu programu. Wchodzi w to: kolorystyka, ikony i inne. User Dragging Przeciąganie użytkowników This changes the behavior when moving users. Zmienia zachowanie podczas przenoszenia użytkowników. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. Zmienia zachowanie przeciągania użytkowników - może zostać użyte, by zapobiec przypadkowemu przeciąganiu. <i>Przenieś</i> przenosi użytkownika bez powiadomienia. <i>Nic nie rób</i> nic nie robi i wyświetla wiadomość z błędem. <i>Pytaj</i> używa powiadomienia tekstowego, by upewnić się, czy na pewno chciałeś przenieść użytkownika. <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. <b>Włącz menu programisty</b><br />Włącza to menu "Programista" w Mumble. Menu to jest wykorzystywane do specyficznych funkcji dla programistów, takich jak Konsola programisty. Enable Developer menu Włącz menu programisty When in custom layout mode, checking this disables rearranging. Gdy w trybie niestandardowego ułożenia, zaznaczenie tego wyłącza przegrupowanie. Lock layout Zablokuj ułożenie MainWindow Root Root Push-to-Talk Global Shortcut Aktywacja przyciskiem Push and hold this button to send voice. Global Shortcut Naciśnij i przytrzymaj ten przycisk, aby transmitować głos. This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut Wyświetla twój status PTT, w zależności jak długo będziesz trzymać przycisk, tak długo będziesz transmitować swój głos. Reset Audio Processor Global Shortcut Restart preprocesora audio Unlink Plugin Global Shortcut Wyłącz wtyczki Push-to-Mute Global Shortcut Wyciszenie przyciskiem Join Channel Global Shortcut Dołącz do kanału Toggle Overlay Global Shortcut Włącz nakładkę Toggle state of in-game overlay. Global Shortcut Włącz tryb nakładki w grze. Toggle Minimal Global Shortcut Tryb minimalny Volume Up (+10%) Global Shortcut Głośność w górę (+10%) Volume Down (-10%) Global Shortcut Głośność w dół (-10%) Mumble Mumble Mumble -- %1 Mumble -- %1 &Window &Okno Minimize Minimalizuj Ctrl+M Ctrl+M Close Zakończ Mumble is currently connected to a server. Do you want to Close or Minimize it? <b>UWAGA!</b> Mumble jest obecnie połączony z serwerem. Chcesz zamknąć czy zminimalizować program? Mute Self Global Shortcut Wyciszenie Set self-mute status. Global Shortcut Przełącza stan wyciszenia (Włącza/Wyłącza). This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut Przełącza stan wyciszenia. Jeżeli wyłączasz wyciszenie, wyłączasz również ogłuszenie. Deafen Self Global Shortcut Ogłuszenie Set self-deafen status. Global Shortcut Przełącza stan ogłuszenia (Włącza/Wyłącza). This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut Przełącza stan ogłuszenia. Jeżeli włączasz, włączasz również wyciszenie. Whisper/Shout Whisper Szept/Krzyk <center>Not connected</center> Not connected <center>Niepołączony</center> Clear Wyczyść Opening URL %1 Otwieranie adresu %1 File does not exist Plik nie istnieje File is not a configuration file. Plik nie jest plikiem konfiguracyjnym. Settings merged from file. Ustawienia połączone z pliku. URL scheme is not 'mumble' Adres URL nie jest obsługiwany przez Mumble (brak mumble:// w adresie) This version of Mumble can't handle URLs for Mumble version %1.%2.%3 Ta wersja Mumble nie obsługuje URL starszych wersji Mumble %1.%2.%3 Connecting to %1 Łączenie z %1 Enter username Nazwa użytkownika Connecting to server %1. Łączenie z serwerem <b>%1</b>. Reconnecting. Ponowne łączenie. Transmit Mode set to Continuous Tryb nadawania zmieniony na Ciągły <p>%1 (%2)<br />%3</p> <p>%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> <h2>Kanał głosowy</h2><p>Szyfrowanie 128 bitowym OCV-AES 128<br />Średnie opóźnienie %1 ms (%4 odchylenie)</p> Register yourself as %1 Zarejestruj się jako %1 <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <p>Masz zamiar zarejestrować się na tym serwerze. Akcja ta nie może zostać cofnięta, twoja nazwa użytkownika również nie może ulec zmianie w przyszłości. Na zawsze będziesz znany jako '%1' na tym serwerze.</p><p>Czy jesteś pewien, że chcesz się zarejestrować?</p> <h2>Version</h2><p>Protocol %1</p> <h2>Wersja</h2><p>Protokół %1</p> <p>No build information or OS version available</p> <p>Brak informacji o numerze kompilacji lub wersji systemu operacyjnego</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) Połączenie jest szyfrowane oraz uwierzytelniane przy pomocy %1 używając %2 jako mechanizm wymiany kluczy (%3) The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) Połączenie jest szyfrowane przy pomocy %1 z użyciem %2 dla autoryzacji wiadomości oraz %3 jako mechanizmu wymiany kluczy (%4) The connection is secured by the cipher suite that OpenSSL identifies as %1 Połączenie jest zabezpieczone przez szyfrowanie, które OpenSSL identyfikuje jako %1 <p>The connection provides perfect forward secrecy</p> <p>Połączenie zapewnia doskonałe utajnienie przekazywania</p> <p>The connection does not provide perfect forward secrecy</p> <p>Połączenie nie zapewnia doskonałego utajnienia przekazywania</p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> <h2>Kanał kontrolny</h2><p>Połączenie używa %1</p>%2%3<p>Średnie opóźnienie %4 ms (%5 odchylenie)</p><p>Zdalny host %6 (port %7)</p> Voice channel is sent over control channel Dane głosowe są wysyłane przez kanał kontrolny Register user %1 Zarejestruj użytkownika %1 <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> <p>Masz zamiar zarejestrować %1. Akcja ta nie może zostać cofnięta, nazwa użytkownika również nie może ulec zmianie w przyszłości, a jako zarejestrowany użytkownik %1 będzie mieć dostęp do tego serwera nawet, gdy zmienisz hasło na serwer.</p><p>Od tej chwili, %1 będzie autoryzowany certyfikatem, którego obecnie używa.</p><p>Czy jesteś pewien, że chcesz zarejestrować %1?</p> Kicking user %1 Wykopywanie użytkownika %1 Banning user %1 Banowanie użytkownika %1 View comment on user %1 Zobacz komentarz użytkownika %1 Message to channel %1 Wiadomość do kanału %1 Connected. Połączono. <li>Expected certificate digest (SHA-1): %1</li> <li>Oczekiwany odcisk certyfikatu (SHA-1):⇥%1</li> Server presented a certificate which failed verification. Serwer przedstawił certyfikat, którego nie udało się zweryfikować. <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> <p>%1</p><ul>%2</ul><p>Błędy certyfikatu:</p><ol>%3</ol><p>Czy mimo to chcesz go zaakceptować?<br />(Mumble więcej cię o to nie zapyta.)</p> SSL Version mismatch Nieprawidłowa wersja SSL Server connection failed. Połączenie z serwerem zostało przerwane. <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>Wiadomość do kanału '%1'</center> <center>Type message to user '%1' here</center> Type message to user '%1' here <center>Wiadomość do użytkownika '%1'</center> Choose image file Wybierz plik obrazka Failed to load image Nie udało się załadować obrazka Could not open file for reading. Nie udało się otworzyć pliku do odczytu. Image format not recognized. Nieznany format obrazka. &User &Użytkownik &Channel &Kanał Use in conjunction with Whisper to. Global Shortcut Należy używać w połączeniu z szeptem. This will switch the states of the in-game overlay. Global Shortcut Przełącza stany nakładki. Link Channel Global Shortcut Łączenie kanałów Cycle Transmit Mode Global Shortcut Przełączaj sposób transmisji głosu Set Transmit Mode to Push-To-Talk Global Shortcut Ustaw tryb nadawania na Naciśnij-I-Mów Set Transmit Mode to Continuous Global Shortcut Ustaw tryb nadawania na Ciągły Set Transmit Mode to VAD Global Shortcut Ustaw tryb nadawania na VAD Send Text Message Global Shortcut Wyślij wiadomość tekstową Send Clipboard Text Message Global Shortcut Wyślij wiadomość ze schowka This will send your Clipboard content to the channel you are currently in. Global Shortcut Spowoduje to przesłanie zawartości twojego schowka do kanału, na którym się znajdujesz. Continuous Ciągłe Voice Activity Aktywacja głosowa Push-to-Talk Naciśnij-I-Mów Mumble - Minimal View -- %1 Mumble - Widok minimalny -- %1 Cancel Anuluj Save Image As... Zapisz obraz jako... Save Image File Zapisz plik obrazu Could not save image: %1 Nie można zapisać obrazu: %1 Change your comment Edycja własnego komentarza Transmit Mode set to Voice Activity Tryb nadawania ustawiony jako Aktywacja głosowa Transmit Mode set to Push-to-Talk Tryb nadawania ustawiony jako Naciśnij-I-Mów <p>Connected users: %1/%2</p> <p>Podłączeniu użytkownicy: %1/%2</p> UDP Statistics Statystyki UDP To Server Do serwera From Server Od serwera Good Dobre Late Opóźnione Lost Utracone Resync Zresynchronizowane <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> <h2>Pasmo dźwięku</h2><p>Maksymalnie %1 kbit/s<br />Aktualnie %2 kbit/s<br />Kodek: %3</p> Mumble Server Information Serwer Mumble - Informacje &View Certificate &Zobacz certyfikat Enter reason Podaj powód Sending message to %1 Wysyłanie wiadomości do %1 To %1: %2 Do %1: %2 Message to %1 Wiadomość do %1 Are you sure you want to reset the comment of user %1? Czy jesteś pewny, że chcesz usunąć komentarz użytkownika %1? Are you sure you want to reset the avatar of user %1? Czy jesteś pewien, że chcesz zresetować awatar użytkownika %1? Are you sure you want to delete %1 and all its sub-channels? Czy jesteś pewien, że chcesz usunąć %1 oraz wszystkie pod-kanały? Sending message to channel %1 Wysyłanie wiadomości do kanału: %1 Message to tree %1 Wyślij do drzewa kanałów %1 To %1 (Tree): %2 (Tree) %1: %2 (Do drzewa kanałów) %1: %2 Unmuted and undeafened. Wyłączono ogłuszenie oraz wyciszenie mikrofonu. Unmuted. Wyłączono wyciszenie mikrofonu. Muted. Wyciszono. Muted and deafened. Ogłuszono oraz wyciszono mikrofon. Deafened. Ogłuszono. Undeafened. Wyłączono ogłuszenie. Restart Mumble? Zrestartować Mumble? Some settings will only apply after a restart of Mumble. Restart Mumble now? Niektóre z ustawień zadziałają dopiero, gdy zrestartujesz Mumble. Zrestartować teraz? About Qt O Qt SSL Verification failed: %1 Weryfikacja SSL nie powiodła się: %1 <li>Server certificate digest (SHA-1): %1</li> <li>Odcisk certyfikatu serwera (SHA-1):⇥%1</li> <b>WARNING:</b> The server presented a certificate that was different from the stored one. <b>OSTRZEŻENIE:</b> Ten serwer posiada obecnie inny certyfikat niż ten, który został zapisany poprzednio. This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. Ten serwer używa starego standardu kodowania, który nie jest już wspierany przez współczesne wersje Mumble. Server connection failed: %1. Połączenie z serwerem zostało przerwane z powodu: %1. Disconnected from server. Rozłączony od serwera. Invalid username Niepoprawna nazwa użytkownika You connected with an invalid username, please try another one. Połączyłeś się do serwera z niewłaściwą nazwą użytkownika, spróbuj innej nazwy. Username in use Ta nazwa użytkownika jest już używana That username is already in use, please try another username. Ta nazwa użytkownika jest już zajęta, spróbuj innej. Wrong certificate or password Niepoprawny certyfikat lub hasło Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. Błędny certyfikat lub hasło dla zarejestrowanego użytkownika. Jeżeli jesteś pewien, że ten użytkownik jest chroniony hasłem prosimy spróbować ponownie. W przeciwnym razie proszę przerwać i sprawdzić swój certyfikat oraz nazwę użytkownika. Wrong password Błędne hasło Wrong server password for unregistered user account, please try again. Podałeś złe hasło dla niezarejestrowanych użytkowników, spróbuj jeszcze raz. Images (*.png *.jpg *.jpeg) Obrazy (*.png *.jpg *.jpeg) C&onfigure &Opcje &Help &Pomoc Log Dziennik This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. Dziennik wyświetla wszystkie ostatnie wydarzenia takie jak: próby połączenia z serwerem, błędy oraz wiadomości użytkowników.<br />Możesz dowolnie konfigurować okno dziennika w <b>Konfiguracji</b>. &Quit Mumble &Zakończ Closes the program Zamyka program Exits the application. Wyłącza aplikację. Ctrl+Q Ctrl+Q Open the server connection dialog Wyświetl listę serwerów &Disconnect &Rozłącz Disconnect from server Rozłącz od serwera Disconnects you from the server. Rozłącza cię od serwera. Show information about the server connection Wyświetl informacje o połączeniu This will show extended information about the connection to the server. Wyświetla zaawansowane informacje na temat połączenia z serwerem. &Mute &Wycisz &Deafen &Ogłusz &Local Mute &Wycisz lokalnie Send a Text Message Wyślij wiadomość tekstową Sends a text message to another user. Wysyła wiadomość tekstową do innego użytkownika. Add new channel Dodaj nowy kanał This adds a new sub-channel to the currently selected channel. Dodaje nowy pod-kanał w aktualnie wskazanym kanale. Remove channel Usuń kanał This removes a channel and all sub-channels. Usuwa kanał wraz ze wszystkimi pod-kanałami. Edit Groups and ACL for channel Edytuj grupy oraz reguły ACL kanału This opens the Group and ACL dialog for the channel, to control permissions. Otwiera okno dialogowe z grupami oraz regułami ACL, które pozwala na edycję uprawnień. &Link &Połącz kanały Link your channel to another channel Połącz swój kanał z innym kanałem This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. To jest pasek czatu.<br />Jeżeli wpiszesz w nim tekst i naciśniesz enter zostanie on wysłany do kanału lub użytkownika, który w chwili obecnej jest wybrany. Jeżeli nic lub nikt nie jest wybrany wiadomość zostanie wysłana do kanału, na którym się znajdujesz. Chatbar Pasek czatu Shows a dialog of registered servers, and also allows quick-connect. Wyświetla okno z zarejestrowanymi serwerami, pozwala również na szybkie łączenie. Kick user (with reason) Kopnij użytkownika (z podaniem powodu) Kick selected user off server. You'll be asked to specify a reason. Wyrzuca zaznaczonego użytkownika z serwera. Zostaniesz poproszony o podanie powodu. Mute user Wycisz użytkownika Mute or unmute user on server. Unmuting a deafened user will also undeafen them. Wycisza lub wyłącza wyciszenie użytkownika na serwerze. Wyłączenie wyciszenia ogłuszonemu użytkownikowi wyłączy również ogłuszenie. Kick and ban user (with reason) Wykop i zbanuj użytkownika (z podaniem powodu) Kick and ban selected user from server. You'll be asked to specify a reason. Wyrzuca i blokuje dostęp do serwera zaznaczonemu użytkownikowi. Zostaniesz poproszony o podanie powodu. Deafen user Ogłusz użytkownika Deafen or undeafen user on server. Deafening a user will also mute them. Ogłusza lub wyłącza ogłuszenie użytkownika na serwerze. Ogłuszenie użytkownika spowoduje również wyciszenie jego mikrofonu. Mute user locally Wycisz użytkownika lokalnie Mute or unmute user locally. Use this on other users in the same room. Wycisza lub wyłącza wyciszenie użytkownika lokalnie. Używaj tej opcji na innych użytkownikach w tym samym kanale. This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. Umożliwia połączenie twojego kanału z innym wybranym kanałem. Jeżeli użytkownicy posiadają uprawnienie <i>Mowa</i> na łączonych kanałach będą mogli się nawzajem słyszeć. Połączenie jest aktywne dopóki nie rozłączysz kanałów lub do czasu, gdy serwer zostanie zrestartowany. Prosimy zapoznać się ze skrótami Push-To-Link (Naciśnij-i-Połącz). &Unlink Channel &Rozłącz kanały Unlink your channel from another channel Rozłącz swój kanał od innego kanału This unlinks your current channel from the selected channel. Rozłącza bieżący kanał od wskazanego kanału. Unlinks your channel from all linked channels. Rozłącza twój kanał od wszystkich kanałów z nim połączonych. This unlinks your current channel (not the selected one) from all linked channels. Rozłącza twój obecny kanał (nie ten wybrany) od wszystkich kanałów z nim połączonych. &Reset &Resetuj sprzęt audio Reset audio preprocessor Resetuj preprocessor audio This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. Resetuje preprocessor audio wliczając w to usuwanie echa oraz wykrywanie mowy. Jeżeli coś ci nagle pogarsza dźwięk i jest to stan przejściowy, użyj tej opcji by nie czekać na automatyczną rekonfigurację preprocesora. &Mute Self &Wycisz Mute yourself Wycisz mikrofon Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. Wycisza lub wyłącza wyciszenie. Gdy jesteś wyciszony nie wysyłasz żadnych danych na serwer. Wyłączenie wyciszenia również wyłącza ogłuszenie. &Deafen Self &Ogłusz Deafen yourself Ogłusz Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. Ogłusza lub wyłącza ogłuszenie. Gdy jesteś ogłuszony nie będziesz nic słyszał. Ogłuszenie samego siebie włącza również wyciszenie mikrofonu. &Text-To-Speech &Tekst-Na-Mowę Toggle Text-To-Speech Włącz/Wyłącz Tekst-Na-Mowę Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. Włącza lub wyłącza Tekst-Na-Mowę. Tylko wiadomości z włączoną obsługą Tekstu-Na-Mowę zostaną przeczytane na głos. Display audio statistics Wyświetla statystyki audio Pops up a small dialog with information about your current audio input. Wyświetla informacje o twoim wejściu audio. Forcibly unlink plugin Wymuś rozłączenie wtyczki This forces the current plugin to unlink, which is handy if it is reading completely wrong data. Wymusza rozłączenie bieżącej wtyczki; przydatne jeżeli odczytuje ona całkowicie złe dane. Configure Mumble Konfiguracja Allows you to change most settings for Mumble. Pozwala na zmianę większości ustawień Mumble. Start the audio configuration wizard Rozpocznij konfigurację dźwięku This will guide you through the process of configuring your audio hardware. Ten kreator poprowadzi cię przez proces konfiguracji ustawień dźwięku. &What's This? &Co to jest? Enter What's This? mode Wejdź w tryb "Co to jest?" Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. Uaktywnia tryb "Co to jest?". Klikaj kursorem na poszczególne elementy interfejsu, aby dowiedzieć się do czego służą. Information about Mumble Informacje na temat Mumble Shows a small dialog with information and license for Mumble. Wyświetla małe okno z informacjami o licencji Mumble. Information about Speex Informacje na temat Speex Shows a small dialog with information about Speex. Wyświetla małe okno z informacjami na temat Speex. Information about Qt Informacje na temat Qt Shows a small dialog with information about Qt. Wyświetla małe okno z informacjami na temat Qt. Check for &Updates Sprawdź dostępność &aktualizacji Check for new version of Mumble Sprawdź czy jest nowa wersja Mumble Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. Łączy się ze stroną Mumble by sprawdzić czy jest dostępna nowsza wersja, następnie powiadamia użytkownika odpowiednim adresem URL, gdy jest tak potrzeba. Sends a text message to all users in a channel. Wysyła wiadomość tekstową do wszystkich użytkowników na tym kanale. Configure certificates for strong authentication Konfiguruj certyfikaty dla silnej autoryzacji This starts the wizard for creating, importing and exporting certificates for authentication against servers. Uruchamia kreator umożliwiający tworzenie, importowanie i eksportowanie certyfikatów uwierzytelniających na serwerach. Register user on server Rejestruje użytkownika na serwerze This will permanently register the user on the server. Rejestruje na stałe użytkownika na serwerze. Add &Friend Dodaj &znajomego Adds a user as your friend. Dodaje użytkownika do znajomych. This will add the user as a friend, so you can recognize him on this and other servers. Dodaje użytkownika do twojej listy znajomych, abyś w przyszłości mógł rozpoznać go na tym oraz innych serwerach. &Remove Friend &Usuń znajomego Removes a user from your friends. Usuwa użytkownika z listy znajomych. This will remove a user from your friends list. Usuwa użytkownika z twojej listy znajomych. &Update Friend &Aktualizuj znajomego Update name of your friend. Aktualizuje nazwę twojego znajomego. Your friend uses a different name than what is in your database. This will update the name. Twój znajomy używa innej nazwy niż ta, która jest zapisana w twojej bazie danych. Uaktualnia tą nazwę. Edit registered users list Edytuj listę zarejestrowanych użytkowników This opens the editor for registered users, which allow you to change their name or unregister them. Otwiera edytor zarejestrowanych użytkowników, pozwala on na edycję nazw oraz wyrejestrowanie użytkowników. Add or remove text-based access tokens Dodaje lub usuwa hasła dostępu &Minimal View &Widok minimalny Toggle minimal window modes Włącz/Wyłącz widok minimalny This will toggle minimal mode, where the log window and menu is hidden. Przełącza na widok minimalny, gdzie okno z dziennikiem i menu są ukryte. You muted and deafened %1. Ogłuszyłeś oraz wyciszyłeś %1. You unmuted and undeafened %1. Wyłączyłeś ogłuszenie oraz wyciszenie %1. You undeafened %1. Wyłączyłeś ogłuszenie %1. You suppressed %1. Wyciszyłeś %1. %1 muted and deafened by %2. %1 został ogłuszony oraz wyciszony przez %2. %1 unmuted and undeafened by %2. %2 wyłączył ogłuszenie oraz wyciszenie %1. %1 undeafened by %2. %2 wyłączył ogłuszenie %1. %1 suppressed by %2. %1 został pozbawiony możliwości mowy przez %2. %1 moved to %2. %1 przeniósł się do kanału %2. %1 moved to %2 by %3. %1 został przeniesiony do kanału %2 przez %3. %1 moved in from %2 by %3. %1 został przeniesiony z kanału %2 przez %3. %1 is now muted and deafened. %1 jest teraz ogłuszony oraz wyciszony. Your account information can not be verified currently. Please try again later Dane konta nie mogą zostać zweryfikowane obecnie. Spróbuj ponownie później Welcome message: %1 Wiadomość powitalna: %1 Mumble: %1 Mumble: %1 You were denied %1 privileges in %2. Nie posiadasz uprawnienia: <i>%1</i> w %2. %3 was denied %1 privileges in %2. %3 nie posiada uprawnienia: <i>%1</i> w %2. Denied: Cannot modify SuperUser. Odmowa: Nie można modyfikować SuperUsera. Denied: Invalid channel name. Odmowa: Nieprawidłowa nazwa kanału. Denied: Text message too long. Odmowa: Wiadomość tekstowa jest zbyt długa. Denied: Operation not permitted in temporary channel. Odmowa: Operacja niedozwolona na kanale tymczasowym. You need a certificate to perform this operation. Potrzebujesz certyfikatu, aby wykonać tę operację. %1 does not have a certificate. %1 nie ma certyfikatu. Invalid username: %1. Niepoprawna nazwa użytkownika: %1. Invalid username. Niepoprawna nazwa użytkownika. Channel is full. Kanał jest pełny. Channel nesting limit reached. Limit zagnieżdżania kanałów został wyczerpany. Channel count limit reached. Need to delete channels before creating new ones. Osiągnięto limit liczby kanałów. Musisz usunąć kanały przed utworzeniem nowych. Permission denied. Brak dostępu. %1 connected and entered channel. %1 podłączony i dołączył do kanału. %1 connected. %1 połączony. %1 is now muted. %1 jest teraz wyciszony. %1 is now unmuted. %1 nie jest już wyciszony. Recording started Nagrywanie rozpoczęte Recording stopped Nagrywanie zakończone %1 started recording. %1 rozpoczął nagrywanie. %1 stopped recording. %1 zakończył nagrywanie. You revoked your priority speaker status. Unieważniłeś swój status mówcy nadrzędnego. You assumed priority speaker status. Przyjąłeś status mówcy nadrzędnego. %1 revoked your priority speaker status. %1 unieważnił twój status mówcy nadrzędnego. %1 gave you priority speaker status. %1 nadał ci status mówcy nadrzędnego. You revoked priority speaker status for %1. Unieważniłeś status mówcy nadrzędnego dla %1. You gave priority speaker status to %1. Nadałeś status mówcy nadrzędnego dla %1. %1 revoked own priority speaker status. %1 unieważnił swój status mówcy nadrzędnego. %1 assumed priority speaker status. %1 przyjął status mówcy nadrzędnego. %1 revoked priority speaker status for %2. %1 unieważnił status mówcy nadrzędnego dla %2. %1 gave priority speaker status to %2. %1 dał status mówcy nadrzędnego %2. You were unmuted and undeafened by %1. %1 wyłączył twoje ogłuszenie oraz wyciszenie. You were muted by %1. Zostałeś wyciszony przez %1. You were undeafened by %1. %1 wyłączył twoje ogłuszenie. You were suppressed. You were suppressed by %1. Zostałeś pozbawiony możliwości mowy. You were unsuppressed. Możliwość mowy została przywrócona. You were unsuppressed by %1. %1 zezwolił na mowę. You joined %1. Dołączyłeś do %1. You moved %1 to %2. Przeniesiono %1 do %2. %1 is recording %1 nagrywa %1 renamed to %2 by %3. %3 zmienił nazwę %1 na %2. %1 disconnected. %1 rozłączony. Server message from Serwera (Tree) (Do drzewa kanałów) (Channel) (Do kanału) (Private) (Prywatne) %2%1: %3 %2%1: %3 Failed to load Opus, it will not be available for audio encoding/decoding. Załadowanie kodeka Opus nie powiodło się, nie będzie dostępny dla kodowania/dekodowania dźwięku. The server requests minimum client version %1 Serwer wymaga minimalnej wersji klienta: %1 The server requests positional audio be enabled. Serwer wymaga, aby dźwięk pozycyjny był włączony. The server requests positional audio be disabled. Serwer wymaga, aby dźwięk pozycyjny był wyłączony. The server requests Push-to-Talk be enabled. Serwer wymaga, aby aktywacja przyciskiem była włączona. The server requests Push-to-Talk be disabled. Serwer wymaga, aby aktywacja przyciskiem była wyłączona. You were unmuted by %1. %1 wyłączył twoje wyciszenie mikrofonu. You muted %1. Wyciszyłeś %1. You unsuppressed %1. Wyłączyłeś wyciszenie %1. You unmuted %1. Wyłączyłeś wyciszenie %1. %1 muted by %2. %2 wyciszył mikrofon %1. %1 unsuppressed by %2. %1 może ponownie mówić dzięki: %2. %1 unmuted by %2. %2 wyłączył wyciszenie mikrofonu %1. Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. Nie udało się odnaleźć pasujących kodeków CELT. Nie będziesz mógł rozmawiać do wszystkich użytkowników. You were muted and deafened by %1. You were deafened by %1. Zostałeś ogłuszony oraz wyciszony przez %1. You were kicked from the server by %1: %2. Zostałeś wykopany z serwera przez %1 z powodu: %2. %3 was kicked from the server by %1: %2. %3 został wykopany z serwera przez %1 z powodu: %2. You were kicked and banned from the server by %1: %2. Zostałeś zbanowany oraz wykopany z serwera przez %1 z powodu %2. %3 was kicked and banned from the server by %1: %2. %3 został zbanowany oraz wykopany z serwera przez %1 z powodu: %2. You were moved to %1 by %2. Zostałeś przeniesiony do kanału %1 przez %2. %1 entered channel. %1 dołączył do kanału. Server connection rejected: %1. Połączenie odrzucone: %1. Denied: %1. Zabroniono: %1. %1 renamed to %2. %1 zmienił nazwę na %2. %1 left channel and disconnected. %1 opuścił kanał i rozłączył się. Message from %1 Wiadomość od %1 You have User Dragging set to "Do Nothing" so the user wasn't moved. Masz wyłączone przeciąganie użytkowników, więc użytkownik nie został przeniesiony. You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. Masz wyłączone przeciąganie kanałów, więc kanał nie został przeniesiony. Unknown Channel Drag mode in UserModel::dropMimeData. Nieznany sposób przeciągania kanałów w UserModel::dropMimeData. Remote controlling Mumble: Zdalne sterowanie Mumble: Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) -jn, --jackname Set custom Jack client name. --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. Użycie: mumble [opcje] [<url>] <url> Określa URL do nawiązania połączenia po uruchomieniu aplikacji, zamiast wyświetlania okna połączenia, ma następującą składnię: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] Parametr z wersją Mumble musi zostać podany w celu uruchomienia poprawnej wersji klienta. Aktualnie domyślną wartością jest 1.2.0. Dostępne opcje: -h, --help Wyświetla to okno pomocy i zamyka aplikację. -m, --multiple Pozwala na uruchomienie kilku instancji programu. -n, --noidentity Powstrzymuje ładowanie plików identyfikacyjnych (np. certyfikatów). -jn, --jackname Ustawia niestandardową nazwę klienta Jack. --license Pokazuje licencję Mumble. --authors Pokazuje autorów Mumble. --third-party-licenses Pokazuje licencje na oprogramowanie firm trzecich używane przez Mumble. Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status Użycie: mumble rpc <action> [opcje] Możliwe jest zdalne sterowanie uruchomioną instancją Mumble poprzez użycie komendy 'mumble rpc'. Dostępne akcje: mute Wyciszenie siebie unmute Wyłączenie wyciszenia siebie togglemute Przełączenie wyciszenia siebie deaf Ogłuszenie siebie undeaf Wyłączenie ogłuszenia siebie toggledeaf Przełączenie ogłuszenia siebie Invocation Wywołanie Error: No RPC command specified Błąd: Nie podano polecenia RPC RPC RPC Welcome to Mumble. Witamy w Mumble. Skipping version check in debug mode. Pomija sprawdzanie wersji w trybie debugowania. Hide Frame Ukryj ramkę Toggle showing frame on minimal window Uaktywnia obramowanie okna w trybie minimalnym This will toggle whether the minimal window should have a frame for moving and resizing. Uaktywnia obramowanie okna w trybie minimalnym, dzięki czemu można przenosić i zmieniać rozmiar okna. &Unlink All R&ozłącz wszystkie Reset the comment of the selected user. Usuwa komentarz wybranemu użytkownikowi. &Join Channel &Dołącz do kanału View comment in editor Podgląd komentarza w edytorze Query server for connection information for user Wyświetla okno z informacjami o użytkowniku S&erver &Serwer &Self &Własne &Unlink Plugins &Wyłącz wtyczki Register yourself on the server Zarejestruj siebie na serwerze Change your avatar image on this server Zmień swój awatar na tym serwerze &Remove Avatar &Usuń awatar Remove currently defined avatar image. Usuwa aktualnie zdefiniowany awatar. Icon Toolbar Ikony Change your own comment Zmień swój komentarz Recording Nagrywaj Priority Speaker Nadrzędny mówca &Copy URL &Kopiuj URL Copies a link to this channel to the clipboard. Kopiuje adres URL kanału do schowka systemowego. Ignore Messages Ignoruj wiadomości Locally ignore user's text chat messages. Ignoruje lokalnie wiadomości tekstowe użytkownika. Silently drops all text messages from the user. Odrzuca wszystkie wiadomości tekstowe od użytkownika. Edit ban list on server Edytuj listę banów na serwerze This lets you edit the server-side IP ban list. Pozwala na edycję banów po stronie serwera. &Filter on/off &Filtr włączony/wyłączony Toggle the channel filter (Ctrl+F) Przełącz filtrowanie kanałów (Ctrl+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. Włącza lub wyłącza filtrowanie wskazanych kanałów z listy. Domyślnie wszystkie puste kanały są filtrowane. Dodatkowo można wskazać z menu kontekstowego które kanały mają być filtrowane. Ctrl+F Ctrl+F &Hide Channel when Filtering &Ukryj kanał podczas filtrowania Reset the avatar of the selected user. Zresetuj awatar dla zaznaczonego użytkownika. Locally adjust the user's speech volume. Lokalne dostosowanie głośności mowy użytkownika. Opens a dialog with a volume slider. Use this on other users in the same room. Otwiera okno z kontrolą głośności. Użyj tego na innych użytkownikach znajdujących się w tym samym pomieszczeniu. &Developer &Programista &Hide Mumble Ukryj &Mumble Hides the main Mumble window. Ukrywa główne okno Mumble. Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. Ukrywa okno główne Mumble. Przywróć poprzez kliknięcie ikony w zasobniku systemowym albo ponowne uruchomienie Mumble. Show the Developer Console Pokaż konsolę programisty Shows the Mumble Developer Console, where Mumble's log output can be inspected. Pokazuje konsolę programisty Mumble, gdzie może być sprawdzone wyjście dziennika Mumble. &Connect... &Połącz... &Ban list... Lista &banów... &Information... &Informacje... &Kick... &Kopnij... &Ban... &Banuj... Local Volume Adjustment... Lokalne dopasowanie głośności... Send &Message... Wyślij &wiadomość... &Add... &Dodaj... &Remove... &Usuń... &Edit... &Edytuj... Audio S&tatistics... &Statystyki audio... &Settings... &Konfiguracja... &Audio Wizard... Kreator ustawień &dźwięku... Developer &Console... Konsola &programisty... &About... O &programie... About &Speex... O &Speex... About &Qt... O &Qt... &Certificate Wizard... Kreator &certyfikatów... &Register... &Zarejestruj... Registered &Users... Zare&jestrowani użytkownicy... Change &Avatar... Zmień &awatar... &Access Tokens... &Hasła dostępu... Reset &Comment... Usuń &komentarz... Reset &Avatar... Resetuj &awatar... View Comment... Wyświetl komentarz... &Change Comment... &Edytuj komentarz... R&egister... &Zarejestruj... Show Wyświetl Shows the main Mumble window. Wyświetla główne okno Mumble. Manual Manual Mumble Positional Audio Ręczne pozycjonowanie dźwięku Mumble Position Pozycja X X Y Y Z Z m m Heading Kurs Azimuth Azymut Elevation Wysokość ° ° Meta data Metadane Context Kontekst Identity Tożsamość Set Ustaw State Stan Linked Powiązane Activated Aktywowane Unhinge Odczep NetworkConfig Network Sieć Updates are mandatory when using snapshot releases. Aktualizacje są obowiązkowe, gdy używasz wersji testowych. Connection Połączenie Use TCP compatibility mode Use TCP compatability mode Używaj trybu zgodności TCP <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). <b>Uaktywnij tryb zgodności TCP</b>.<br />Dzięki tej opcji Mumble działa w przypadkach, kiedy nie można się połączyć w trybie UDP. Negatywnym skutkiem tej opcji jest utracenie pewnej liczby pakietów. Reconnect when disconnected Połącz ponownie po zerwaniu połączenia <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. <b>Automatycznie łączy ponownie po zerwaniu połączenia</b>.<br />Mumble będzie ponawiać próby połączenia co 10 sekund, gdy twoje połączenie z serwerem zostanie przerwane. Reconnect automatically Automatycznie wznawiaj przerwane połączenie Proxy Proxy Type Typ Type of proxy to connect through Typ proxy Direct connection Połączenie bezpośrednie HTTP(S) proxy HTTP(S) proxy SOCKS5 proxy SOCKS5 proxy Hostname Host Hostname of the proxy Nazwa hosta proxy Force TCP mode Wymuś tryb TCP Enable QoS to prioritize packets Włącz QoS, aby priorytetyzować pakiety This will enable QoS, which will attempt to prioritize voice packets over other traffic. Uaktywnia QoS, który będzie próbował nadawać pakietom wychodzącym wyższy priorytet. Use Quality of Service Używaj "Quality of Service" Don't send certificate to server and don't save passwords. (Not saved). Nie wysyłaj certyfikatu na serwer ani nie zapamiętuj haseł. <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> <b>Blokuje wysyłanie informacji o tożsamości klienta.</b><p>Klient nie będzie identyfikował się za pomocą certyfikatu, nawet jeżeli wcześniej był tak skonfigurowany oraz nie będzie zapamiętywał haseł dla połączeń. Jest to opcja testowa i nie jest zapamiętywana.</p> Suppress certificate and password storage Nie zachowuj haseł i certyfikatów <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>Typ proxy używanego do połączenia.</b><br />Zmusza Mumble do połączenia przez serwer proxy dla wszystkich wychodzących połączeń. Informacja: Tunelowanie proxy zmusza Mumble do używania trybu TCP, sprawiając, że wszystkie dane będą przesyłane przez kanał kontrolny. <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. <b>Nazwa hosta proxy.</b><br /> To pole określa nazwę hosta serwera proxy, przez który chcesz puścić cały ruch. Port Port Port number of the proxy Numer portu serwera proxy <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. <b>Numer portu serwera proxy.</b><br />To pole określa numer portu, na którym serwer proxy spodziewa się połączenia. Username Użytkownik Username for proxy authentication Nazwa użytkownika dla proxy <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>Nazwa użytkownika dla proxy.</b><br />To pole określa nazwę użytkownika, którego chcesz przy autoryzacji do serwera proxy. W przypadku, gdy proxy nie wymaga autoryzacji lub chcesz się połączyć anonimowo zostaw to pole puste. Password Hasło Password for proxy authentication Hasło do proxy <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>Hasło do proxy.</b><br />To pole określa hasło wymagane do autoryzacji do serwera proxy. W przypadku, gdy proxy nie wymaga autoryzacji lub chcesz się połączyć anonimowo zostaw to pole puste. Mumble services Usługi Mumble Check for new releases of Mumble automatically. Automatycznie sprawdzaj czy są nowe wersje Mumble. This will check for new releases of Mumble every time you start the program, and notify you if one is available. Sprawdza, czy jest dostępna nowsza wersja Mumble, za każdym razem, kiedy uruchamiasz program, oraz powiadamia cię jeżeli jest dostępna. Check for application updates on startup Sprawdzaj dostępność aktualizacji przy starcie Check for new releases of plugins automatically. Automatycznie sprawdzaj czy są nowe wersje wtyczek. This will check for new releases of plugins every time you start the program, and download them automatically. Sprawdza, czy są nowsze wersje wtyczek, za każdym razem, kiedy włączasz program. Pozwala również na ich automatyczne pobieranie. <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. <b>Wysyłaj anonimowe statystyki.</b><br />Mumble posiada mały zespół deweloperów, który musi skupić się na funkcjach, które są najbardziej potrzebne. Wysyłając statystyki pomagasz projektowi w określeniu na czym skupić się w przyszłości. Submit anonymous statistics to the Mumble project Przekazuje anonimowe statystyki do twórców Mumble Submit anonymous statistics Wysyłaj anonimowe statystyki Reconnect to last used server when starting Mumble Przy starcie Mumble automatycznie łączy do ostatnio używanego serwera Reconnect to last server on startup Przy starcie połącz ponownie do ostatniego serwera Download plugin and overlay updates on startup Pobieraj aktualizacje nakładki oraz pluginów przy starcie Privacy Prywatność Prevent OS information being sent to Mumble servers and web servers Zapobiega przesyłaniu informacji o systemie operacyjnym do serwerów Mumble i serwerów sieciowych <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. <b>Nie wysyłaj informacji o systemie operacyjnym na serwery</b><br/> Uniemożliwia klientowi wysyłanie potencjalnie identyfikujących informacji o systemie operacyjnym do serwerów Mumble i serwerów sieciowych. Do not send OS information to Mumble servers and web servers Nie przesyłaj informacji o systemie operacyjnym do serwerów Mumble i serwerów sieciowych Overlay Silent Milczący Talking Mówiący Whisper Szepczący Shout Krzyczący Channel Kanał Failed to create communication with overlay at %2: %1. No overlay will be available. Tworzenie komunikacji z nakładką nie powiodło się w %2: %1. Nakładka będzie niedostępna. OverlayClient Filter Filtr Only talking Tylko mówiący Talking and recently active Mówiący oraz "ostatnio" aktywni All in current channel Wszyscy na aktualnym kanale All in linked channels Wszyscy na połączonych kanałach Always show yourself Zawsze mnie wyświetlaj w nakładce Configure recently active time (%1 seconds)... Określ czas "ostatniej" aktywności (%1 sek.)... Columns Kolumny Sort Sortowanie Alphabetically Alfabetycznie Last state change Po ostatniej zmianie stanu Edit... Edytuj... Reset Zoom Resetuj powiększenie Configure recently active time Czas "ostatniej" aktywności Amount of seconds users remain active after talking: Ilość sekund, w ciągu których użytkownik jest traktowany jako aktywny po wypowiedzi: OverlayConfig To move the users, drag the little red dot. Przeciągnij małą czerwoną kropkę, aby przenieść użytkowników. To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. Pokręć kółkiem myszy, aby zmienić rozmiar użytkowników. For more options, right click a user. For more options, rightclick a user. Aby uzyskać więcej opcji kliknij prawym przyciskiem myszy na użytkowniku. Launcher Filter Filtr programów uruchamiających Overlay Nakładka Choose executable Wybierz plik wykonywalny Choose application Wybierz aplikację Choose path Wybierz ścieżkę Load Overlay Presets Wczytaj konfigurację nakładki Mumble overlay presets (*.mumblelay) Konfiguracja nakładki (*.mumblelay) Save Overlay Presets Zapisz konfigurację nakładki Options Opcje Enable overlay. Włącza nakładkę. Enable Overlay Włącz nakładkę This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. Określa czy nakładka jest włączona czy nie. Ustawienie to jest sprawdzane przed startem aplikacji, a więc upewnij się, że Mumble jest uruchomione oraz nakładka jest włączona przed uruchomieniem aplikacji.<br />Zwróć uwagę na to, że jeśli uruchomisz Mumble po tym jak uruchomisz aplikację albo, jeżeli wyłączysz nakładkę podczas działania aplikcji, nie istnieje żaden sposób, aby uruchomić nakładkę bez ponownego uruchomienia aplikacji. Layout Ułożenie Blacklist Czarna lista Whitelist Biała lista Uninstall Overlay Odinstaluj nakładkę Overlay Installation Instalacja Nakładki Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. Mumble wykrył, że nie masz zainstalowanej nakładki. Kliknij na przycisk poniżej, aby zainstalować nakładkę. Install Mumble Overlay Instaluj nakładkę Mumble Overlay Upgrade Aktualizuj nakładkę Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. Mumble wykrył, że posiadasz starą wersję plików nakładki na swoim komputerze. Aby uaktualnić pliki do najnowszych wersji, kliknij na przycisk poniżej. Upgrade Mumble Overlay Aktualizuj nakładkę Mumble Display a frame counter in the overlay Wyświetla licznik klatek w nakładce Show FPS counter Wyświetlaj licznik FPS Load an overlay preset from file Wczytaj ustawienia nakładki z pliku Load… Wczytaj... Save your overlay settings to file Zapisz swoje ustawienia nakładki do pliku Save… Zapisz... Set the overlay font. Wybierz czcionkę nakładki. Set the overlay text color. Wybierz kolor tekstu w nakładce. Color Kolor Remove Usuń Font Czcionka FPS and Clock Display Wyświetlanie FPS i zegara Display a clock in the overlay showing the current local time (system time). Wyświetla akualny lokalny (systemowy) czas w nakładce. Show Clock Wyświetlaj zegar Overlay Exceptions Wyjątki nakładki Overlay Exception Mode Tryb wyjątków nakładki Allowed launchers Dozwolone programy uruchamiające Add Dodaj Allowed programs Dozwolone programy Allowed paths Dozwolone ścieżki Blacklisted programs Zablokowane programy OverlayEditor State Stan User is not talking Użytkownik bezczynny Passive Pasywny User is talking in your channel or a linked channel Użytkownik mówiący na twoim kanale lub na połączonym kanale Talking Mówiący User is whispering to you privately Użytkownik szepczący do ciebie prywatnie Private Whisper Prywatny szept User is shouting to your channel Użytkownik krzyczy do twojego kanału Channel Whisper Szept do kanału Zoom Powiększenie Zoom Factor Współczynnik powiększenia Enabled Elements Aktywne elementy User avatar, chosen by each user Awatar użytkownika - wybrany indywidualnie Avatar Awatar User's name Nazwa użytkownika Username Nazwa użytkownika Name of user's channel, if outside your current channel Nazwa kanału użytkownika - jeżeli znajduje się poza twoim aktualnym kanałem Channel Kanał Muted or deafened Wyciszony lub ogłuszony Mute state Stan wyciszenia Bounding box, automatically shrunk to minimum size to contain all visible elements Obramowanie - automatycznie staje się możliwie najmniejsze obejmując wszystkie widoczne elementy Bounding box Obramowanie Overlay Editor Edytor nakładki OverlayEditorScene Layout preset Ułożenia predefiniowane Large square avatar Duży awatar Avatar and Name Awatar i nazwa User Opacity Przezroczystość użytkownika %1% %1% Object Opacity Przezroczystość obiektu Alignment Wyrównanie Left Lewo Center Wyśrodkowane Right Prawo Top Góra Bottom Dół Color... Kolor... Font... Czcionka... Bounding box Obramowanie Pen width Szerokość pióra Padding Wypełnienie Pen color Kolor pióra Fill color Kolor wypełnienia Pick pen color Wybierz kolor pióra Pick fill color Wybierz kolor wypełnienia Pick color Wybierz kolor Pick font Wybierz czcionkę PluginConfig Plugins Wtyczki Plugin has no configure function. Wtyczka nie posiada konfiguracji. Plugin has no about function. Brak informacji o wtyczce. Options Opcje Enable plugins and transmit positional information Włącza wtyczki oraz nadaje informacje o pozycjach graczy względem siebie podczas gry This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. Zezwala wtyczkom dla wspieranych gier pobierać twoją pozycję oraz wysyłać ją razem z pakietami dźwięku. Inni użytkownicy będą cię słyszeć z kierunku, w którym znajduje się twoja postać w grze (relatywnie do pozycji ich postaci). Link to Game and Transmit Position Połącz z grami i nadawaj pozycję graczy Reloads all plugins Przeładowuje wszystkie wtyczki This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. Ponownie skanuje i przeładowuje wtyczki. Użyj tej opcji, jeżeli dodałeś lub zmieniłeś wtyczkę w katalogu wtyczek. &Reload plugins &Przeładuj wtyczki Information about plugin Informacje o wtyczce This shows a small information message about the plugin. Wyświetla krótką informację na temat wtyczki. &About &O wtyczce Show configuration page of plugin Otwiera okno konfiguracji This shows the configuration page of the plugin, if any. Wyświetla okno z konfiguracją wtyczki, jeżeli wtyczka posiada konfigurację. &Configure &Konfiguruj Name Nazwa Enabled Włączona Plugins Skipping plugin update in debug mode. Pomijanie aktualizacji wtyczek w trybie debugowania. Downloaded new or updated plugin to %1. Pobrano nowy lub uaktualniony plugin do %1. Failed to install new plugin to %1. Nie udało się zainstalować nowego pluginu do %1. %1 lost link. %1 utracił połączenie. %1 linked. %1 połączony. PortAudioSystem Default Device Domyślne urządzenie PulseAudioSystem Default Input Domyślne wejście Default Output Domyślne wyjście QApplication Failed to restart mumble Nie udało się zrestartować Mumble Mumble failed to restart itself. Please restart it manually. Nie udało się zrestartować Mumble. Proszę samemu zrestartować program. RichTextEditor Failed to load image Nie udało się załadować obrazka Image file too large to embed in document. Please use images smaller than %1 kB. Obrazek jest zbyt duży, aby umieścić go w dokumencie. Prosimy używać obrazków mniejszych niż %1 kB. Message is too long. Wiadomość jest za długa. Display Podgląd Source Text Tekst źródłowy &Bold &Pogrubienie Ctrl+B Ctrl+B &Italic &Kursywa Italic Kursywa Ctrl+I Ctrl+I Underline Podkreślenie Ctrl+U Ctrl+U Color Kolor Insert Link Wstaw link Ctrl+L Ctrl+L Insert Image Wstaw obrazek RichTextEditorLink Add Link Dodaj link URL URL Text Tekst ServerHandler Unable to resolve hostname Nie udało się odczytać nazwy hosta Server is not responding to TCP pings Serwer nie reaguje na pingi TCP UDP packets cannot be sent to or received from the server. Switching to TCP mode. Pakiety UDP nie mogły zostać wysłane lub odebrane z serwera. Nastąpiła zmiana na tryb TCP. UDP packets cannot be sent to the server. Switching to TCP mode. Pakiety UDP nie mogły zostać wysłane do serwera. Nastąpiła zmiana na tryb TCP. UDP packets cannot be received from the server. Switching to TCP mode. Pakiety UDP nie mogły zostać odebrane z serwera. Nastąpiła zmiana na tryb TCP. UDP packets can be sent to and received from the server. Switching back to UDP mode. Pakiety UDP mogą zostać wysłane i odebrane z serwera. Przywrócono tryb UDP. Connection timed out Przekroczono limit czasu połączenia ServerView Favorite Ulubione LAN LAN Public Internet Publiczne Unknown Nieznany Africa Afryka Asia Azja North America Ameryka Północna South America Ameryka Południowa Europe Europa Oceania Oceania ShortcutActionWidget Unassigned Nieprzypisana ShortcutDelegate On Włącz Off Wyłącz Toggle Przełączanie Unassigned Nieprzypisana ShortcutKeyWidget Press Shortcut Naciśnij klawisz ShortcutTargetDialog Root Źródło Parent Macierzysty Current Obecny Subchannel #%1 Pod-kanał #%1 ShortcutTargetWidget ... ... , , Root Źródło Parent Macierzysty Current Obecny Subchannel #%1 pod-kanał #%1 Invalid Nieprawidłowy Empty <Empty> Pusty ShortcutToggleWidget Off Wyłącz Toggle Przełączenie On Włącz TextMessage Enter text Wpisz tekst If checked the message is recursively sent to all subchannels Gdy zaznaczone wiadomość jest wysyłana do wszystkich pod-kanałów Send recursively to subchannels Wyślij do wszystkich pod-kanałów Tokens Empty Token Puste hasło Mumble - Access Tokens Mumble - Hasła dostępu List of access tokens on current server Lista haseł dostępu na obecnym serwerze <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. <b>To jest edytowalna lista haseł użytych na serwerze.</b><br />Hasło dostępu to tekst, który może być użyty, jako hasło służące do bardzo łatwego zarządzania dostępem do kanałów. Mumble będzie pamiętać hasła, których użyłeś i prześle je na serwer ponownie podczas łączenia, aby nie trzeba było każdorazowego wpisywać hasła. Add a token Dodaj hasło &Add &Dodaj Remove a token Usuń hasło &Remove &Usuń UserEdit Registered Users Zarejestrowani użytkownicy Remove Usuń Rename Zmień nazwę Who are you looking for? Kogo szukasz? Days Dni Weeks Tygodni Months Miesięcy Years Lat Inactive for Nieaktywny przez Registered users: %n account(s) Zarejestrowani użytkownicy: %n kontoZarejestrowani użytkownicy: %n kontZarejestrowani użytkownicy: %n kontZarejestrowani użytkownicy: %n kont UserInformation User Information Informacje o użytkowniku Connection Information Informacje o połączeniu Version Wersja OS System Certificate Certyfikat IP Address Adres IP CELT Versions Wersje CELT Details... Szczegóły... Ping Statistics Statystyki opóźnień Pings received Odebrane Average ping Średnie opóźnienie TCP (Control) TCP (Kontrola) UDP (Voice) UDP (Głos) UDP Network statistics Statystyka sieci UDP Good Dobre Late Opóźnione Lost Utracone Resync Zresynch. From Client Od klienta To Client Do klienta Connection time Czas połączenia %1w %1w %1d %1d %1h %1h %1m %1m %1s %1s , , %1 (%2) %1.%2.%3 (%4) %1 (%2) Supported Wspierany Not Supported Niewspierany Not Reported Nie zgłoszono %1 online (%2 idle) %1 online (%2 bezczynny) %1 online %1 online %1 kbit/s %1 kbit/s Bandwidth GroupBox Połączenie Bandwidth Label Przepustowość Ping deviation Odchylenie UserListModel Nick Pseudonim Inactive days Dni od ostatniej aktywności Last channel Ostatni kanał Last seen: %1 Ostatnio widziany: %1 Never Nigdy Channel ID: %1 ID kanału: %1 UserLocalVolumeDialog Local volume for other users Lokalna głośność dla innych użytkowników <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. <b>Dopasuj głośność innych użytkowników lokalnie</b><br />Mumble wspiera lokalne ustawienie głośności innych użytkowników. Adjusting local volume for %1 Dopasowywanie lokalnej głośności dla %1 dB dB <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> <html><head/><body><p>Użyj suwaka albo pola tekstowego do zmiany głośności użytkownika.</p><p><span style="font-weight:600;">Uwaga!</span></p><p>Zbyt duże zwiększenie poziomu głośności może skutkować trwałą utratą słuchu. Może również zwiększyć szum u użytkownika.</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: To jest użytkownik podłączony do serwera. Ikona po lewej wskazuje czy w chwili obecnej: Talking to your channel. Mówi do twojego kanału. Shouting directly to your channel. Whispering directly to your channel. Krzyczy bezpośrednio do twojego kanału. Whispering directly to you. Szepcze bezpośrednio do ciebie. Not talking. Nie mówi. This is a channel on the server. The icon indicates the state of the channel: To jest kanał na serwerze. Ikona wskazuje stan kanału: Your current channel. Twój obecny kanał. A channel that is linked with your channel. Linked channels can talk to each other. Kanał, z którym twój kanał jest połączony. Połączone kanały mogą rozmawiać między sobą. A channel on the server that you are not linked to. Kanał na serwerze, do którego nie jesteś połączony. This shows the flags the user has on the server, if any: Wyświetla uprawnienia użytkownika, o ile jakieś posiada: On your friend list Twój znajomy Authenticated user Użytkownik uwierzytelniony Muted (manually muted by self) Wyciszony (przez siebie) Muted (manually muted by admin) Wyciszony (ręcznie wyciszony przez administratora) Muted (not allowed to speak in current channel) Wyciszony (brak uprawnień mowy na tym kanale) Muted (muted by you, only on your machine) Wyciszony (przez ciebie, tylko na twojej maszynie) Muted (push-to-mute) Wyciszony (wyciszenie przyciskiem) Deafened (by self) Ogłuszony (przez siebie) Deafened (by admin) Ogłuszony (przez administratora) User has a new comment set (click to show) Użytkownik ma nowy komentarz (kliknij, aby wyświetlić) User has a comment set, which you've already seen. (click to show) Użytkownik posiada komentarz, który już widziałeś (kliknij, aby wyświetlić) Ignoring Text Messages Ignoruje wiadomości testowe This shows the flags the channel has, if any: Wyświetla atrybuty kanału, o ile jakieś posiada: Channel has a new comment set (click to show) Kanał ma nowy komentarz (kliknij, aby wyświetlić) Channel has a comment set, which you've already seen. (click to show) Kanał ma komentarz, który już widziałeś (kliknij, aby wyświetlić) Channel will be hidden when filtering is enabled Kanał będzie ukryty, gdy filtrowanie będzie włączone Name Nazwa Flags Atrybut(y) Are you sure you want to drag this user? Czy jesteś pewien, że chcesz przeciągnąć tego użytkownika? Are you sure you want to drag this channel? Czy jesteś pewien, że chcesz przeciągnąć ten kanał? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. Nie można przenieść automatycznie, prosimy o posortowanie numeryczne wskaźników lub ręczne ustawienie. VersionCheck Upgrade Mumble Aktualizacja Mumble A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? Nowa wersja Mumble została wykryta oraz automatycznie pobrana. Zalecana jest aktualizacja do tej wersji lub powrót do ostatniej stabilnej wersji. Uruchomić instalator teraz? Failed to launch snapshot installer. Uruchomienie instalatora wersji testowej nie powiodło się. Corrupt download of new version detected. Automatically removed. Pobrany plik jest uszkodzony. Został on automatycznie usunięty. Downloading new snapshot from %1 to %2 Pobieranie nowej wersji testowej z %1 do %2 Failed to write new version to disk. Failed to write new version to disc. Zapis nowej wersji Mumble na dysk nie powiódł się. Mumble failed to retrieve version information from the central server. Mumble nie był w stanie pobrać informacji o wersji z serwera głównego. ViewCert Certificate Chain Details Szczegóły łańcucha certyfikatu Certificate chain Łańcuch certyfikatu Certificate details Szczegóły certyfikatu Common Name Nazwa pospolita Organization Organizacja Subunit Podjednostka Country Kraj Locality Lokalizacja State Stan Valid from: %1 Ważny od: %1 Valid to: %1 Ważny do: %1 Serial: %1 Numer seryjny: %1 Public Key: %1 bits %2 Klucz publiczny: %1 bitów %2 RSA RSA DSA DSA Digest (SHA-1): %1 Odcisk (SHA-1): %1 Digest (SHA-256): %1 Odcisk (SHA-256): %1 Email: %1 Email: %1 DNS: %1 DNS: %1 Issued by: Wydany przez: Unit Name Nazwa jednostki VoiceRecorder Recorder failed to create directory '%1' Rejestrator nie może utworzyć katalogu '%1' Recorder failed to open file '%1' Rejestrator nie był w stanie otworzyć pliku '%1' .wav - Uncompressed .wav - Bez kompresji .ogg (Vorbis) - Compressed .ogg (Vorbis) - Z kompresją .au - Uncompressed .au - Bez kompresji .flac - Lossless compressed .flac - Bezstratna kompresja VoiceRecorderDialog Recorder Rejestrator Control Sterowanie 00:00:00 00:00:00 &Start &Start S&top S&top Mode Tryb Multichannel Wielokanałowo Output Wyjście Output format Format wyjściowy Target directory Katalog docelowy Filename Nazwa pliku &Browse... &Przeglądaj... Valid variables are: Poprawne zmienne to: Inserts the user's name Wstawia nazwę użytkownika Inserts the current date Wstawia aktualną datę Inserts the current time Wstawia aktualny czas Inserts the hostname Wstawia nazwę hosta Recorder still running Rejestrator jest wciąż uruchomiony Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? Zamknięcie rejestratora bez uprzedniego zatrzymania spowoduje utratę niezapisanego nagrania. Czy na pewno chcesz zamknąć rejestrator? Unable to start recording. Not connected to a server. Nie można rozpocząć nagrywania. Brak połączenia z serwerem. The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. Serwer, do którego jesteś aktualnie połączony działa w wersji 1.2.2 lub starszej. Ze względu na zachowanie prywatności, nagrywanie nie jest możliwe na serwerach działających w wersjach starszych niż 1.2.3.<br>Skontaktuj się z administratorem serwera po dalsze informacje. There is already a recorder active for this server. Rejestrator jest już aktywny na tym serwerze. Please select a recording format. Proszę wybrać format nagrywania. Stopping Zatrzymywanie Select target directory Wskaż katalog docelowy Downmix Scalaj ścieżki WASAPIInput Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone. Odmówiono dostępu do mikrofonu. Sprawdź, czy ustawienia mikrofonu w twoim systemie operacyjnym pozwalają Mumble używać mikrofonu. WASAPISystem Default Device Urządzenie domyślne qwPTTButtonWidget Mumble PTT Mumble PTT Push to talk Wciśnij, aby mówić mumble-1.3.4/src/mumble/mumble.pro0000664000175000017500000005070114010707274016720 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../mumble.pri) include(../../qmake/python.pri) include(../../qmake/lrelease.pri) DEFINES *= MUMBLE TEMPLATE = app TARGET = mumble !CONFIG(qt4-legacy-compat) { CONFIG += no-qt4-legacy-compat } CONFIG(no-qt4-legacy-compat):isEqual(QT_MAJOR_VERSION, 4) { error("$$escape_expand(\\n)$$escape_expand(\\n)"\ "Mumble client support for Qt 4 is deprecated and will be dropped$$escape_expand(\\n)"\ "completely in the future. We highly recommend switching to$$escape_expand(\\n)"\ "building Mumble with Qt 5. For now CONFIG+=qt4-legacy-compat$$escape_expand(\\n)"\ "can be used to build with Qt 4. Note that if built this way,$$escape_expand(\\n)"\ "Mumble might lack certain bug-fixes and capabilities available$$escape_expand(\\n)"\ "when built with Qt 5.$$escape_expand(\\n)"\ "$$escape_expand(\\n)") } isEqual(QT_MAJOR_VERSION, 4) { warning("$$escape_expand(\\n)$$escape_expand(\\n)"\ "Mumble client support for Qt 4 is deprecated and will be dropped$$escape_expand(\\n)"\ "completely in the future. We highly recommend switching to$$escape_expand(\\n)"\ "building Mumble with Qt 5. When built with Qt 4, Mumble might$$escape_expand(\\n)"\ "lack certain bug-fixes and capabilities available when built$$escape_expand(\\n)"\ "with Qt 5 already.$$escape_expand(\\n)"\ "$$escape_expand(\\n)") } CONFIG(static) { # On Windows, building a static client # means building the main app into a DLL. win32 { TEMPLATE = lib TARGET = mumble_app VERSION = CONFIG -= static CONFIG += shared qt_static mumble_dll DEFINES += USE_MUMBLE_DLL isEqual(QT_MAJOR_VERSION, 5) { # Qt 5 uses an auto-generated .cpp file for importing plugins. # However, it is only automatically enabled for TEMPLATE = app. # Since we're building mumble_app.dll, we're not an app, but a library. # This means we'll have to explicitly ask Qt to generate and build the # plugin importer. CONFIG += force_import_plugins } } DEFINES *= USE_STATIC CONFIG += static_qt_plugins } QT *= network sql xml svg isEqual(QT_MAJOR_VERSION, 5) { QT *= widgets CONFIG(qtspeech) { qtHaveModule(texttospeech) { QT *= texttospeech } else { error("You enabled the 'qtspeech' CONFIG option, but the required 'texttospeech' module is not available on your system!") } } } HEADERS *= BanEditor.h \ ACLEditor.h \ ConfigWidget.h \ Log.h \ AudioConfigDialog.h \ AudioStats.h \ AudioInput.h \ AudioOutput.h \ AudioOutputSample.h \ AudioOutputSpeech.h \ AudioOutputUser.h \ CELTCodec.h \ OpusCodec.h \ CustomElements.h \ MainWindow.h \ ServerHandler.h \ About.h \ ConnectDialog.h \ GlobalShortcut.h \ TextToSpeech.h \ Settings.h \ Database.h \ VersionCheck.h \ Global.h \ UserModel.h \ Audio.h \ ConfigDialog.h \ Plugins.h \ PTTButtonWidget.h \ LookConfig.h \ Overlay.h \ OverlayText.h \ SharedMemory.h \ AudioWizard.h \ ViewCert.h \ TextMessage.h \ NetworkConfig.h \ LCD.h \ Usage.h \ Cert.h \ ClientUser.h \ UserEdit.h \ UserListModel.h \ UserLocalVolumeDialog.h \ Tokens.h \ UserView.h \ RichTextEditor.h \ UserInformation.h \ SocketRPC.h \ VoiceRecorder.h \ VoiceRecorderDialog.h \ WebFetch.h \ ../SignalCurry.h \ OverlayClient.h \ OverlayUser.h \ OverlayUserGroup.h \ OverlayConfig.h \ OverlayEditor.h \ OverlayEditorScene.h \ MumbleApplication.h \ ApplicationPalette.h \ ThemeInfo.h \ Themes.h \ OverlayPositionableItem.h \ widgets/MUComboBox.h \ DeveloperConsole.h \ PathListWidget.h \ XMLTools.h \ SvgIcon.h SOURCES *= BanEditor.cpp \ ACLEditor.cpp \ ConfigWidget.cpp \ Log.cpp \ AudioConfigDialog.cpp \ AudioStats.cpp \ AudioInput.cpp \ AudioOutput.cpp \ AudioOutputSample.cpp \ AudioOutputSpeech.cpp \ AudioOutputUser.cpp \ main.cpp \ CELTCodec.cpp \ OpusCodec.cpp \ CustomElements.cpp \ MainWindow.cpp \ ServerHandler.cpp \ About.cpp \ ConnectDialog.cpp \ Settings.cpp \ Database.cpp \ VersionCheck.cpp \ Global.cpp \ UserModel.cpp \ Audio.cpp \ ConfigDialog.cpp \ Plugins.cpp \ PTTButtonWidget.cpp \ LookConfig.cpp \ OverlayClient.cpp \ OverlayConfig.cpp \ OverlayEditor.cpp \ OverlayEditorScene.cpp \ OverlayUser.cpp \ OverlayUserGroup.cpp \ Overlay.cpp \ OverlayText.cpp \ SharedMemory.cpp \ AudioWizard.cpp \ ViewCert.cpp \ Messages.cpp \ TextMessage.cpp \ GlobalShortcut.cpp \ NetworkConfig.cpp \ LCD.cpp \ Usage.cpp \ Cert.cpp \ ClientUser.cpp \ UserEdit.cpp \ UserListModel.cpp \ UserLocalVolumeDialog.cpp \ Tokens.cpp \ UserView.cpp \ RichTextEditor.cpp \ UserInformation.cpp \ SocketRPC.cpp \ VoiceRecorder.cpp \ VoiceRecorderDialog.cpp \ WebFetch.cpp \ MumbleApplication.cpp \ ../../3rdparty/smallft-src/smallft.cpp \ ThemeInfo.cpp \ Themes.cpp \ OverlayPositionableItem.cpp \ widgets/MUComboBox.cpp \ DeveloperConsole.cpp \ PathListWidget.cpp \ XMLTools.cpp \ SvgIcon.cpp CONFIG(qtspeech) { SOURCES *= TextToSpeech.cpp } RESOURCES *= mumble.qrc mumble_translations.qrc ../../themes/MumbleTheme.qrc !CONFIG(no-classic-theme) { RESOURCES *= ../../themes/ClassicTheme.qrc } # Add the various mumble_flags_XX.qrc files to RESOURCES... include(flags/mumble_flags.pri) FORMS *= ConfigDialog.ui \ MainWindow.ui \ ConnectDialog.ui \ ConnectDialogEdit.ui \ BanEditor.ui \ ACLEditor.ui \ Plugins.ui \ PTTButtonWidget.ui \ Overlay.ui \ OverlayEditor.ui \ LookConfig.ui \ AudioInput.ui \ AudioOutput.ui \ Log.ui \ TextMessage.ui \ AudioStats.ui \ NetworkConfig.ui \ LCD.ui \ GlobalShortcut.ui \ GlobalShortcutTarget.ui \ Cert.ui \ UserEdit.ui \ UserLocalVolumeDialog.ui \ AudioWizard.ui \ Tokens.ui \ RichTextEditor.ui \ RichTextEditorLink.ui \ UserInformation.ui \ VoiceRecorderDialog.ui # Include TRANSLATIONS variable include(translations.pri) PRECOMPILED_HEADER = mumble_pch.hpp INCLUDEPATH *= ../../3rdparty/qqbonjour-src INCLUDEPATH *= ../../3rdparty/smallft-src INCLUDEPATH *= widgets CONFIG(static) { # Ensure that static Mumble.app on Mac OS X # includes and exports its Qt symbols to plugins. # # Some plugins (libmanual) already make use of Qt # functionality, and it's not inconceivable that some # Mumble features will be split into plugins in the # future. macx { QMAKE_LFLAGS -= -Wl,-dead_strip QMAKE_LFLAGS += -Wl,-all_load } } !CONFIG(no-manual-plugin) { SOURCES *= ManualPlugin.cpp HEADERS *= ManualPlugin.h FORMS *= ManualPlugin.ui DEFINES *= USE_MANUAL_PLUGIN } unix:!CONFIG(bundled-speex):system($$PKG_CONFIG --atleast-version=1.2 speexdsp):system($$PKG_CONFIG --atleast-version=1.2 speex) { CONFIG *= no-bundled-speex } CONFIG(no-crash-report) { DEFINES *= NO_CRASH_REPORT } else:unix:!macx { DEFINES *= NO_CRASH_REPORT } else { HEADERS *= CrashReporter.h SOURCES *= CrashReporter.cpp } CONFIG(no-xinput2) { DEFINES *= NO_XINPUT2 } CONFIG(no-bundled-speex) { must_pkgconfig(speex) must_pkgconfig(speexdsp) } !CONFIG(no-bundled-speex) { INCLUDEPATH *= ../../3rdparty/speex-src/include ../../3rdparty/speex-src/libspeex ../../3rdparty/speex-build ../../3rdparty/speexdsp-src/include ../../3rdparty/speexdsp-src/libspeexdsp LIBS *= -lspeex } CONFIG(sbcelt) { SOURCES -= CELTCodec.cpp SOURCES += CELTCodec_sbcelt.cpp INCLUDEPATH *= ../../3rdparty/celt-0.7.0-src/libcelt ../../3rdparty/sbcelt-src LIBS *= -lcelt -lsbcelt DEFINES *= SBCELT_PREFIX_API SBCELT_COMPAT_API USE_SBCELT } else { unix:!CONFIG(bundled-celt):system($$PKG_CONFIG --atleast-version=0.7.0 celt) { CONFIG *= no-bundled-celt } CONFIG(no-bundled-celt) { INCLUDEPATH *= /usr/include/celt unix { QMAKE_CFLAGS *= "-I/usr/include/celt" "-isystem /usr/include/celt" QMAKE_CXXFLAGS *= "-I/usr/include/celt" "-isystem /usr/include/celt" } } !CONFIG(no-bundled-celt) { INCLUDEPATH *= ../../3rdparty/celt-0.7.0-src/libcelt unix { QMAKE_CFLAGS *= "-I../../3rdparty/celt-0.7.0-src/libcelt" "-isystem ../../3rdparty/celt-0.7.0-src/libcelt" QMAKE_CXXFLAGS *= "-I../../3rdparty/celt-0.7.0-src/libcelt" "-isystem ../../3rdparty/celt-0.7.0-src/libcelt" } } } !win32:!macx:!CONFIG(no-dbus) { CONFIG *= dbus } !contains(UNAME, FreeBSD):!CONFIG(no-g15) { CONFIG *= g15 } !CONFIG(no-bonjour) { CONFIG *= bonjour } CONFIG(no-vorbis-recording) { DEFINES *= NO_VORBIS_RECORDING } unix:!CONFIG(bundled-opus):system($$PKG_CONFIG --exists opus) { must_pkgconfig(opus) DEFINES *= USE_OPUS } else { !CONFIG(no-opus) { CONFIG *= opus } CONFIG(opus) { INCLUDEPATH *= ../../3rdparty/opus-src/celt ../../3rdparty/opus-src/include ../../3rdparty/opus-src/src ../../3rdparty/opus-build/src DEFINES *= USE_OPUS unix { QMAKE_CFLAGS *= "-I../../3rdparty/opus-src/celt" "-isystem ../../3rdparty/opus-src/celt" QMAKE_CFLAGS *= "-I../../3rdparty/opus-src/include" "-isystem ../../3rdparty/opus-src/include" QMAKE_CXXFLAGS *= "-I../../3rdparty/opus-src/celt" "-isystem ../../3rdparty/opus-src/celt" QMAKE_CXXFLAGS *= "-I../../3rdparty/opus-src/include" "-isystem ../../3rdparty/opus-src/include" } } } unix:!CONFIG(bundled-rnnoise):system($$PKG_CONFIG --exists rnnoise) { must_pkgconfig(rnnoise) DEFINES *= USE_RNNOISE } else { !CONFIG(no-rnnoise) { CONFIG *= rnnoise } CONFIG(rnnoise) { INCLUDEPATH *= ../../3rdparty/rnnoise-src/include DEFINES *= USE_RNNOISE LIBS *= -lrnnoise } } win32 { CONFIG(mumble_dll) { RC_FILE = mumble_dll.rc } else { RC_FILE = mumble.rc } HEADERS *= GlobalShortcut_win.h Overlay_win.h TaskList.h UserLockFile.h SOURCES *= GlobalShortcut_win.cpp Overlay_win.cpp SharedMemory_win.cpp Log_win.cpp os_win.cpp TaskList.cpp WinGUIDs.cpp ../../overlay/ods.cpp UserLockFile_win.cpp os_early_win.cpp !CONFIG(qtspeech) { SOURCES *= TextToSpeech_win.cpp } LIBS *= -ldxguid -ldinput8 -lsapi -lole32 -lws2_32 -ladvapi32 -lwintrust -ldbghelp -lshell32 -lshlwapi -luser32 -lgdi32 -lpsapi win32-g++ { LIBS *= -lsndfile -lvorbis -lvorbisfile -lvorbisenc -logg -lFLAC } win32-msvc* { LIBS *= -lsndfile -lvorbis -lvorbisfile -logg -lFLAC } # Boost win32-msvc* { LIBS *= -llibboost_system-mt -llibboost_thread-mt } win32-g++ { LIBS *= -lboost_system-mt # The library has a different name in MXE contains(QMAKE_HOST.os, Linux) { LIBS *= -lboost_thread_win32-mt } else { LIBS *= -lboost_thread-mt } } LIBS *= -ldelayimp -delayload:shell32.dll DEFINES *= WIN32 !CONFIG(no-asio) { CONFIG *= asio } !CONFIG(no-directsound) { CONFIG *= directsound } !CONFIG(no-wasapi) { CONFIG *= wasapi } !CONFIG(no-gkey) { CONFIG *= gkey } CONFIG(gkey) { HEADERS *= GKey.h SOURCES *= GKey.cpp DEFINES *= USE_GKEY } !CONFIG(no-xboxinput) { CONFIG *= xboxinput } CONFIG(xboxinput) { HEADERS *= XboxInput.h SOURCES *= XboxInput.cpp DEFINES *= USE_XBOXINPUT } # XInputCheck (3rdparty/xinputheck-src) INCLUDEPATH *= ../../3rdparty/xinputcheck-src LIBS *= -lxinputcheck !CONFIG(mumble_dll) { !CONFIG(no-elevation) { CONFIG(release, debug|release) { QMAKE_LFLAGS *= /MANIFESTUAC:\"level=\'asInvoker\' uiAccess=\'true\'\" } } win32-msvc* { QMAKE_POST_LINK = $$QMAKE_POST_LINK$$escape_expand(\\n\\t)$$quote(mt.exe -nologo -updateresource:$(DESTDIR_TARGET);1 -manifest mumble.appcompat.manifest) } } } unix { HAVE_PULSEAUDIO=$$system($$PKG_CONFIG --modversion --silence-errors libpulse) HAVE_JACKAUDIO=$$system($$PKG_CONFIG --modversion --silence-errors jack) !isEmpty(HAVE_PULSEAUDIO):!CONFIG(no-pulseaudio) { CONFIG *= pulseaudio } !isEmpty(HAVE_JACKAUDIO):!CONFIG(no-jackaudio) { CONFIG *= jackaudio } !CONFIG(no-bundled-speex) { QMAKE_CFLAGS *= -I../../3rdparty/speex-src/include -I../../3rdparty/speex-build QMAKE_CXXFLAGS *= -I../../3rdparty/speex-src/include -I../../3rdparty/speex-build QMAKE_CXXFLAGS_RELEASE *= -I../../3rdparty/speex-src/include -I../../3rdparty/speex-build QMAKE_CXXFLAGS_DEBUG *= -I../../3rdparty/speex-src/include -I../../3rdparty/speex-build } CONFIG *= link_pkgconfig must_pkgconfig(sndfile) macx { TARGET = Mumble ICON = ../../icons/mumble.icns QMAKE_INFO_PLIST = mumble.plist QMAKE_PKGINFO_TYPEINFO = MBLE LIBS += -framework Security -framework SecurityInterface -framework ApplicationServices HEADERS *= GlobalShortcut_macx.h AppNap.h SOURCES *= SharedMemory_unix.cpp OBJECTIVE_SOURCES *= GlobalShortcut_macx.mm os_macx.mm Log_macx.mm AppNap.mm !CONFIG(qtspeech) { OBJECTIVE_SOURCES *= TextToSpeech_macx.mm } !CONFIG(universal) { # Link against libxar so we can inspect Mac OS X installer packages. CONFIG(static) { LIBS += -lxml2 -lbz2 -lxar } else { LIBS += -lxar } LIBS += -framework ScriptingBridge OBJECTIVE_SOURCES += Overlay_macx.mm } else { SOURCES += Overlay_unix.cpp } # CoreAudio LIBS += -framework CoreAudio -framework AudioUnit -framework AudioToolbox SOURCES += CoreAudio.cpp HEADERS += CoreAudio.h } else { HEADERS *= GlobalShortcut_unix.h SOURCES *= os_unix.cpp GlobalShortcut_unix.cpp Overlay_unix.cpp SharedMemory_unix.cpp Log_unix.cpp !CONFIG(qtspeech) { SOURCES *= TextToSpeech_unix.cpp } must_pkgconfig(x11) linux* { LIBS *= -lrt } LIBS *= -lXi !CONFIG(no-oss) { CONFIG *= oss } !CONFIG(no-alsa):contains(UNAME, Linux) { CONFIG *= alsa } !CONFIG(no-speechd) { CONFIG *= speechd } else { DEFINES *= USE_NO_TTS } } } alsa { DEFINES *= USE_ALSA must_pkgconfig(alsa) HEADERS *= ALSAAudio.h SOURCES *= ALSAAudio.cpp } oss { DEFINES *= USE_OSS HEADERS *= OSS.h SOURCES *= OSS.cpp INCLUDEPATH *= /usr/lib/oss/include } pulseaudio { DEFINES *= USE_PULSEAUDIO must_pkgconfig(libpulse) HEADERS *= PulseAudio.h SOURCES *= PulseAudio.cpp } jackaudio { DEFINES *= USE_JACKAUDIO PKGCONFIG *= jack HEADERS *= JackAudio.h SOURCES *= JackAudio.cpp } portaudio { DEFINES *= USE_PORTAUDIO must_pkgconfig(portaudio-2.0) HEADERS *= PAAudio.h SOURCES *= PAAudio.cpp } asio { DEFINES *= USE_ASIO HEADERS *= ASIOInput.h SOURCES *= ASIOInput.cpp FORMS *= ASIOInput.ui # If 3rdparty/asio exists, use that... exists(../../3rdparty/asio) { INCLUDEPATH *= ../../3rdparty/asio/common ../../3rdparty/asio/host ../../3rdparty/asio/host/pc # Otherwise, fall back to the path from winpaths_*.pri. } else { INCLUDEPATH *= "$$ASIO_PATH/common" "$$ASIO_PATH/host" "$$ASIO_PATH/host/pc" } } bonjour { DEFINES *= USE_BONJOUR HEADERS *= \ ../../3rdparty/qqbonjour-src/BonjourRecord.h \ ../../3rdparty/qqbonjour-src/BonjourServiceResolver.h \ ../../3rdparty/qqbonjour-src/BonjourServiceBrowser.h \ BonjourClient.h SOURCES *= \ ../../3rdparty/qqbonjour-src/BonjourServiceResolver.cpp \ ../../3rdparty/qqbonjour-src/BonjourServiceBrowser.cpp \ BonjourClient.cpp win32 { INCLUDEPATH *= "$$BONJOUR_PATH/include" QMAKE_LIBDIR *= "$$BONJOUR_PATH/lib/win32" LIBS *= -lDNSSD } unix:!macx { system($$PKG_CONFIG --exists avahi-compat-libdns_sd avahi-client) { must_pkgconfig(avahi-compat-libdns_sd) must_pkgconfig(avahi-client) } else { LIBS *= -ldns_sd } } } dbus { DEFINES *= USE_DBUS QT *= dbus HEADERS *= DBus.h SOURCES *= DBus.cpp } speechd { DEFINES *= USE_SPEECHD system($$PKG_CONFIG --atleast-version=0.8 speech-dispatcher) { DEFINES *= USE_SPEECHD_PKGCONFIG must_pkgconfig(speech-dispatcher) } else { LIBS *= -lspeechd INCLUDEPATH *= /usr/include/speech-dispatcher } } directsound { DEFINES *= USE_DIRECTSOUND HEADERS *= DirectSound.h SOURCES *= DirectSound.cpp LIBS *= -ldsound win32-g++ { LIBS *= -lksuser } } wasapi { DEFINES *= USE_WASAPI HEADERS *= WASAPI.h WASAPINotificationClient.h SOURCES *= WASAPI.cpp WASAPINotificationClient.cpp LIBS *= -lavrt -delayload:avrt.DLL } g15 { DEFINES *= USE_G15 win32|macx { SOURCES *= G15LCDEngine_helper.cpp HEADERS *= G15LCDEngine_helper.h ../../g15helper/g15helper.h } unix:!macx:!contains(UNAME, FreeBSD) { SOURCES *= G15LCDEngine_unix.cpp HEADERS *= G15LCDEngine_unix.h LIBS *= -lg15daemon_client } } CONFIG(no-update) { DEFINES *= NO_UPDATE_CHECK } !CONFIG(no-embed-qt-translations):!exists($$[QT_INSTALL_TRANSLATIONS]) { error("$$escape_expand(\\n)$$escape_expand(\\n)"\ "The QT_INSTALL_TRANSLATIONS directory ($$[QT_INSTALL_TRANSLATIONS])$$escape_expand(\\n)"\ "does not exist.$$escape_expand(\\n)"\ "$$escape_expand(\\n)"\ "The Mumble build process is attempting to embed Qt translations into the Mumble binary,$$escape_expand(\\n)"\ "but it cannot, because the files are missing.$$escape_expand(\\n)"\ "$$escape_expand(\\n)"\ "If you wish to embed Qt translations into the Mumble binary,$$escape_expand(\\n)"\ "you will need to install the translation package for your verison of Qt.$$escape_expand(\\n)"\ "For example, On Ubuntu with Qt 5, that package is 'qttranslations5-l10n'.$$escape_expand(\\n)"\ "$$escape_expand(\\n)"\ "You can also tell the Mumble build process to not embed Qt's$$escape_expand(\\n)"\ "translations into the Mumble binary by using the 'no-embed-qt-translations'$$escape_expand(\\n)"\ "CONFIG option when running qmake, such as:$$escape_expand(\\n)"\ "$$escape_expand(\\n)"\ " $ qmake -recursive main.pro CONFIG+=$$escape_expand(\")no-embed-qt-translations$$escape_expand(\")$$escape_expand(\\n)"\ "$$escape_expand(\\n)"\ "Please refer to the INSTALL file at the root of the source tree for more information$$escape_expand(\\n)"\ "about the build process.$$escape_expand(\\n)"\ "$$escape_expand(\\n)") } !CONFIG(no-embed-qt-translations) { QT_TRANSLATIONS_FALLBACK_DIR = qttranslations QT_TRANSLATIONS_FALLBACK_FILES = $$files($$QT_TRANSLATIONS_FALLBACK_DIR/*.ts) for(fn, QT_TRANSLATIONS_FALLBACK_FILES) { !system($$QMAKE_LRELEASE -silent $$fn) { error(Failed to run lrelease for $$fn) } } GENQRC = $$PYTHON ../../scripts/generate-mumble_qt-qrc.py !system($$GENQRC mumble_qt_auto.qrc $$[QT_INSTALL_TRANSLATIONS] $$QT_TRANSLATIONS_FALLBACK_DIR) { error(Failed to run generate-mumble_qt-qrc.py script) } RESOURCES *= mumble_qt_auto.qrc } CONFIG(static_qt_plugins) { DEFINES += USE_STATIC_QT_PLUGINS # If QSQLite is a plugin we need to import it in order to use the database exists($$[QT_INSTALL_PLUGINS]/sqldrivers/*qsqlite*) { QTPLUGIN += qsqlite } # Since Qt 5.3, qt.prf will automatically populate QT_PLUGINS for static builds # for TEMPLATE=app. # # On Windows, in CONFIG(static), we don't use TEMPLATE=app, so we still need this # code there. But for macOS, we don't need it anymore. !contains(TEMPLATE, .*app)|lessThan(QT_VERSION_INT, 50300) { QTPLUGIN += qsvg qsvgicon # For Qt 4 and Qt 5 below 5.4, we need to manually add qtaccessiblewidgets to PLUGINS. # In Qt 5.4, the plugin was integrated into the QtWidgets library. # See QTBUG-43007 and Qt commit 4255ba40ab073a for more information. lessThan(QT_VERSION_INT, 50400) { QTPLUGIN *= qtaccessiblewidgets } macx { isEqual(QT_MAJOR_VERSION, 5) { QTPLUGIN += qicns qcocoa } else { QTPLUGIN += qicnsicon } } win32 { QTPLUGIN *= qico isEqual(QT_MAJOR_VERSION, 5) { QTPLUGIN += qwindows } } } # Icon engines are special; they don't get their lib directory # included automatically by mkspecs/features/qt.prf LIBS *= -L$$[QT_INSTALL_PLUGINS]/iconengines } lrel.output = ${QMAKE_FILE_BASE}.qm lrel.commands = $${QMAKE_LRELEASE} ${QMAKE_FILE_NAME} lrel.input = TRANSLATIONS lrel.CONFIG *= no_link lrel.variable_out = rcc.depends QMAKE_EXTRA_COMPILERS *= lrel include(../../qmake/symbols.pri) mumble-1.3.4/src/mumble/mumble_cy.ts0000664000175000017500000116000114010707274017235 0ustar builderbuilder ACLEditor Deny Atal Allow Caniatau Allow %1 Caniatau &1 Deny %1 Gwadu %1 Mumble - Add channel Mumble - Ychwanegu sianel Default server value Failed: Invalid channel Methwyd: Sianel annilys Mumble - Edit %1 Mumble - Golygu &1 ID: %1 ID: &1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Channel must have a name Rhaid i'r sianel gael enw This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Dialog Deialog Name Enw Enter the channel name here. Gosodwch enw'r sianel yn yr fan hyn Description Disgrifiad Password Cyfrinair Enter the channel password here. Rhowch gyfrinair y sianel yn y fan hon Check to create a temporary channel. Ticiwch er mwyn creu sianel dros dro. Temporary Dros dro <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. Position Lleoliad &Groups &Grwpiau Group Grŵp List of groups Rhestr o'r holl grwpiau Remove selected group Dileu'r grŵp dethol Remove Dileu Inherit group members from parent Etifeddu aelodau'r grŵp o'r rhiant Inherit Etifeddu Make group inheritable to sub-channels Gwneud yr grŵp yn etifeddadwy i is-sianeli Inheritable Etifeiddadwy Group was inherited from parent channel Roedd y grŵp wedi ei etifeddu o sianel rhiant Inherited Wedi ei etifeddu Members Aelodau Add Ychwanegu Add member to group Ychwanegu aelod i'r grŵp Remove member from group Dileu aelod o'r grŵp &ACL &ACL Active ACLs ACLs gweithgar List of entries Rhestr o gofnodion Inherit ACL of parent? Etifeddu ACL yr rhiant? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. Inherit ACLs Etifeddu ACLs Move entry up Symud yr cofnod i fyny This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. &Up &I Fyny Move entry down Symyd yr cofnod i lawr This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. &Down &I Lawr Add new entry Ychwanegu cofnod newydd This adds a new entry, initially set with no permissions and applying to all. &Add &Ychwanegu Remove entry Dileu'r cofnod This removes the currently selected entry. Mae hyn yn dileu'r cofnod a detholwyd &Remove &Dileu Context Cyd-destun Entry should apply to this channel. Entry should apply to this channel Dyla'r cofnod bod yn berthnasol i'r sianel hon This makes the entry apply to this channel. Mae hyn yn achosi i'r cofnod bod yn berthnasol i'r sianel hon. Applies to this channel Yn berthansol i'r sianel hon Entry should apply to sub-channels. Dyla'r cofnod bod yn berthansol i is-sianeli. Add new group Ychwanegu grŵp newydd <b>Add</b><br/> Add a new group. <b>Ychwanegu</b><br/> Ychwanegu grŵp newydd. Inherited members Aelodau a etifeddwyd Contains the list of members added to the group by this channel. Yn cynnwys rhestr o aelodau a ychwanegwyd i'r grŵp gan yr sianel hon. Contains a list of members whose group membership will not be inherited from the parent channel. Yn cynnwys rhestr o aelodau a ni fyd yn etifeddu ei aelodaeth grŵp o'r sianel rhiant. Contains the list of members inherited by other channels. Yn cynnwys y rhestr o aelodau a etifeddwyd gan sianeli eraill. Type in the name of a user you wish to add to the group and click Add. Teipiwch enw defnyddiwr rydach yn dymuno ychwanegu i'r grŵp a phwyswch Ychwanegu. Type in the name of a user you wish to remove from the group and click Add. Teipiwch enw defnyddiwr rydach yn dymuno tynnu o'r grŵp a phwyswch Ychwanegu. Exclude Eithrio Excluded members Aelodau wedi'i hallgau This makes the entry apply to sub-channels of this channel. Mae hyn yn achosi i'r cofnod bod yn berthnasol i is-sianeli y sianel hon. Applies to sub-channels Yn berthnasol i is-sianeli Permissions Hawliau User/Group Defnyddiwr/Grŵp Group this entry applies to User ID ID yr defnyddiwr User this entry applies to This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. &Properties &Priodweddau <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. ID of the channel. ID yr sianel. Maximum Users Maximum number of users allowed in the channel <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. This is the sort order for the channel. ALSAAudioInput Default ALSA Card Cerdyn Diofyn ALSA Opening chosen ALSA Input failed: %1 Methodd agor yr Mewnbwn ALSA a dewiswyd: %1 ALSAAudioOutput Default ALSA Card Cerdyn Diofyn ALSA Opening chosen ALSA Output failed: %1 Methodd agor yr Mewnbwn ALSA a dewiswyd: %1 ASIOConfig %1 (version %2) %1 (fersiwn %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz ASIO Initialization failed: %1 Failed to instantiate ASIO driver ASIO ASIO Device selection Dewis dyfais Device Dyfais Device to use for microphone Dyfais i ddefnyddio fel meicroffon This chooses what device to query. You still need to actually query the device and select which channels to use. Mae hyn yn dewis pa ddyfais i ymholi. Rydach dal angen ymholi'r ddyfais a dewis pa sianel i'w ddefnyddio. Query selected device Ymholi'r ddyfais a dewiswyd This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. Mae hyn yn ymholi'r ddyfais a dewiswyd ar gyfer sianeli. Byddwch yn ymwybodol bod llawer o yrwyr ASIO yn debygol o gau'r rhaglen neu'r system os rydach yn ei ymholi. &Query &Ymholi Configure selected device Ffurfweddwch y ddyfais a dewiswyd This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Configure Capabilities Driver name Buffer size This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. Configure input channels Channels Sianeli Microphone Meicroffon <- <- -> -> Unused Heb eu defnyddio Speakers Seinyddion ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. Yr ydach angen o leiaf un meicroffon ac un ffynhonnell seinydd i allu defnyddio ASIO. Os rydach angen samplu meicroffon yn unig, defnyddiwch DirectSound. Opening selected ASIO device failed. No input will be done. AboutDialog About Mumble Am Mumble <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble &Am Mumble &License &Trwydded A&uthors &Third-Party Licenses OK Iawn AudioInput Interface Rhyngwyneb System System Input method for audio Dull mewnbwn ar gyfer sain <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Hwn yw'r dull mewnbwn ar gyfer sain.</b><br />Fwyaf tebygol fyddech eisio defnyddio DirectSound. Device Dyfais Input device for audio Dyfais mewnbwn ar gyfer sain <b>This is the input device to use for audio.</b> <b>Hwn yw'r dull mewnbwn ar gyfer sain.</b> Transmission &Transmit When to transmit your speech <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. DoublePush Time If you press the PTT key twice in this time it will get locked. <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. Reset audio cue to default <b>Reset</b><br/>Reset the paths for the files to their default. Browse for on audio file Browse for off audio file Off I Ffwrdd On Ymlaen Preview the audio cues Use SNR based speech detection Signal to Noise Signal i Sŵn <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. Amplitude Voice &Hold Llais &Dal How long to keep transmitting after silence Silence Below Distawrwydd o dan <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. Speech Above Llais os yw'n uwch Signal values above this count as voice Compression Cywasgu &Quality &Ansawdd Quality of compression (peak bandwidth) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. Audio per packet Sain bob paced How many audio frames to send per packet <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). Audio Processing Noise Suppression Noise suppression <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. Maximum amplification of input sound <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. Current speech detection chance Cancel echo from speakers Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. Disabled <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal values below this count as silence Maximum bandwidth used for sending audio Use Amplitude based speech detection <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). Exclusive mode <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive R&eset &Browse... B&rowse... &Preview <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. Displays an always on top window with a push to talk button in it Display push to talk window Misc Audible audio cue when starting or stopping to transmit <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. Audio cue Gets played when starting to transmit Gets played when stopping to transmit Hold Time Time the microphone stays open after the PTT key is released Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) Max. Amplification Idle action minutes do nothing deafen mute after Echo Cancellation Mixed echo cancellation Multichannel echo cancellation The idle action will be reversed upon any key or mouse button input Undo Idle action upon activity Apply RNNoise's noise suppression filter. <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. RNNoise Audio input AudioInputDialog Continuous Voice Activity Push To Talk Audio Input %1 ms Off %1 s %1 kb/s -%1 dB %1 kbit/s (Audio %2, Position %4, Overhead %3) AudioOutput Interface System Output method for audio <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Output device for audio <b>This is the output device to use for audio.</b> Positional Audio Audio Output Default &Jitter Buffer Safety margin for jitter buffer <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. Minimum distance to user before sound volume decreases This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. Volume Volume of incoming speech <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. Output Delay Amount of data to buffer The connected "speakers" are actually headphones The connected "speakers" are actually headphones. Factor for sound volume decrease Bloom Factor for sound volume increase How much should sound volume increase for sources that are really close? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Headphones Minimum Distance Maximum Distance Maximum distance, beyond which speech volume won't decrease Minimum Volume What should the volume be at the maximum distance? Loopback Test Delay Variance Variance in packet latency <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. Packet Loss Packet loss for loopback mode <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% &Loopback Desired loopback mode Attenuate applications by... Attenuation of other applications during speech <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. If checked Mumble lowers the volume of other applications while other users talk <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. while other users talk If checked Mumble lowers the volume of other applications while you talk <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. while you talk Exclusive mode, not recommended. <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive Priority Speaker If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. Attenuate other users while talking as Priority Speaker. Advanced Attenuation Options If checked, Mumble will only attenuate applications that are using the same output source as Mumble <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. Only attenuate applications using the same output device If checked, PulseAudio loopback modules will be attenuated <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. Attenuate PulseAudio loopback modules Audio output AudioOutputDialog None Local Server Audio Output %1 ms %1 % %1 m AudioOutputSample Choose sound file Invalid sound file The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. AudioStats >1000 ms >1000ms Audio Statistics Input Levels Peak microphone level Peak power in last frame This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. Peak speaker level This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. Peak clean level This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. Signal Analysis Microphone power How close the current input level is to ideal This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. Signal-To-Noise ratio Signal-To-Noise ratio from the microphone This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. Speech Probability Probability of speech This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). Configuration feedback Current audio bitrate Bitrate of last frame DoublePush interval Time between last two Push-To-Talk presses Speech Detection Synhwyro Llais Current speech detection chance <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal and noise power spectrum Power spectrum of input signal and noise estimate This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. Echo Analysis Weights of the echo canceller This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. AudioWizard Audio Tuning Wizard Introduction Welcome to the Mumble Audio Wizard Finished Wedi gorffen Enjoy using Mumble Mwynhewch defnyddio Mumble Device selection Selecting the input and output device to use with Mumble. This is the device your microphone is connected to. System System Input method for audio Dull mewnbwn ar gyfer sain <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Dyfais Input device to use Dyfais mewnbwn i'w ddefnyddio <b>Selects which sound card to use for audio input.</b> Cancel echo from headset or speakers Use echo cancellation This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. This is the device your speakers or headphones are connected to. Output method for audio Dull allbwn ar gyfer sain <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. Output device to use Dyfais allbwn i'w ddefnyddio <b>Selects which sound card to use for audio Output.</b> Enable positional audio Allows positioning of sound Allows positioning of sound. <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> Input Device Dyfais mewnbwn Output Device Dyfais allbwn This allows Mumble to use positional audio to place voices. <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> Amount of data to buffer This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> Positional Audio Adjusting attenuation of positional audio. <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> Use headphones instead of speakers Defnyddio clustffonau yn lle seinyddion <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> Use headphones Defnyddio clustffonau This ignores the OS speaker configuration and configures the positioning for headphones instead. Volume tuning Tuning microphone hardware volume to optimal settings. Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. Voice Activity Detection Letting Mumble figure out when you're talking and when you're silent. This will help Mumble figure out when you are talking. The first step is selecting which data value to use. Raw amplitude from input Signal-To-Noise ratio Cymhareb Signal-i-Sain Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Device tuning Changing hardware output delays to their minimum value. Submit anonymous statistics to the Mumble project Push To Talk: Gwthio I Siarad: Quality & Notifications Ansawdd & Hysbysiadau Adjust quality and notification settings. Newid dewisiadau ansawdd a hysbysiadau. Quality settings Dewisiadau ansawdd Low Isel Balanced Cytbwys Notification settings Dewisiadau hysbysiadau Use Text-To-Speech to read notifications and messages to you. Disable Text-To-Speech and use sounds instead. %1 ms %1 me Enables attenuation of other applications while users talk to you Attenuate applications while other users talk High Uchel Custom You already set a customized quality configuration in Mumble. Select this setting to keep it. Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. Apply some high contrast optimizations for visually impaired users Use high contrast graphics Keep custom Text-To-Speech settings. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) BanEditor Mumble - Edit Bans &Address &Cyfeiriad &Mask &Cuddio Reason Rheswm Start Cychwyn End Gorffen User Defnyddiwr Hash &Add &Ychwanegu &Update &Diweddaru &Remove &Tynnu Ban List Search field This is the search field. Use it to find bans that have this username set in the username field. Who are you looking for? Beth rydach yn chwilio amdano? No nickname IP address Cyfeiriad IP No IP address Dim cyfeiriad IP Reason for the ban No reason Dim rheswm Ban end date Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). Certificate hash No certificate hash Banned users This is a list with banned users. Use this button if you want to add a new ban. Use this button if you want to update ban information. Use this button if you want to remove user from the ban list. Clear all fields This button clears all fields. Use it if you want to add a new ban. Clear Clirio Ban List - %n Ban(s) CertView Name Enw Email Ebost Issuer Expiry Date (none) (dim) Self-signed CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. There was an error generating your certificate.<br />Please try again. Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. The file could not be opened for writing. Please use another file. The file's permissions could not be set. No certificate and key has been written. Please use another file. The file could not be written successfully. Please use another file. The file could not be opened for reading. Please use another file. The file is empty or could not be read. Please use another file. The file did not contain a valid certificate and key. Please use another file. Select file to export certificate to Select file to import certificate from Unable to import. Missing password or incompatible file type. <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. Certificates Certificate Management Certificate Authentication Authenticating to servers without using passwords Current certificate This is the certificate Mumble currently uses. Current Certificate Create a new certificate This will create a new certificate. Import certificate from file This will import a certificate from file. Import a certificate Export Certificate This will export a certificate to file. Export current certificate Import Certificate PKCS #12 Certificate import <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> Import from Filename to import from This is the filename you wish to import a certificate from. Select file to import from This opens a file selection dialog to choose a file to import a certificate from. Open... Agor... Password Cyfrinair Password for PKCS#12 file Cyfrinair ar gyfer y ffeil PKCS#12 This is the password for the PKCS#12 file containing your certificate. Certificate to import This is the certificate you are importing. Certificate Details Replace Certificate Replace existing certificate with new certificate? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> This is the certificate Mumble currently uses. It will be replaced. New certificate This is the new certificate that will replace the old one. New Certificate Tystysgrif Newydd Make a backup of your certificate Export to Filename to export to This is the filename you wish to export a certificate to. Save As... Cadw Fel... This is the certificate Mumble currently uses. It will be exported. Generate a new certificate for strong authentication <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> Name Enw Email E-bost Your email address (e.g. johndoe@mumble.info) Eich cyfeiriad e-bost (e.e. johndoe@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. Your name (e.g. John Doe) Eich enw (e.e. John Doe) This is your name, and will be filled out in the certificate. This field is entirely optional. Finish Gorffen Certificate-based authentication is ready for use Enjoy using Mumble with strong authentication. Automatic certificate creation <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> ChanACL None Dim Traverse Enter Speak Mute/Deafen Make channel Creu sianel Make temporary Link channel This represents no privileges. This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. This represents the permission to write text messages to other users in this channel. This represents the permission to forcibly remove users from the server. This represents the permission to permanently remove users from the server. This represents the permission to register and unregister users on the server. This represents the permission to register oneself on the server. Whisper Move Symud Text message Kick Ban Register User Register Self Write ACL ChatbarTextEdit Paste and &Send Paste and send <center>Type chat message here</center> ClientUser Friend Ffrind Authenticated Priority speaker Recording Muted (server) Deafened (server) Local Ignore (Text messages) Local Mute Muted (self) Deafened (self) ConfigDialog Accept changes This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. Reject changes This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. Apply changes This button will immediately apply all changes. Undo changes for current page This button will revert any changes done on the current page to the most recent applied settings. Restore defaults for current page This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. Mumble Configuration ConnectDialog Connecting to %1 Cysylltu i %1 Enter username Adding host %1 Servername Hostname Bonjour name Port Porth Addresses Cyfeiriad Website Gwefan Packet loss Ping (80%) %1 ms %1 me Ping (95%) Bandwidth %1 kbit/s &Connect &Filters Unknown Users Defnyddwyr Version Fersiwn Failed to fetch server list Mumble Server Connect Ping Remove from Favorites Tynnu o Ffefrynau Add custom server Show all servers that respond to ping Show all servers with users Show all servers &Copy &Copio Copy favorite link to clipboard &Paste &Gludo Paste favorite from clipboard &Edit... &Add New... Add to &Favorites Open &Webpage Show &Reachable Show &Populated Show &All ConnectDialogEdit Edit Server Name of the server Enw'r gweinydd A&ddress Internet address of the server. Internet address of the server. <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. &Port Port on which the server is listening <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. &Username Username to send to the server <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. Label Label Add Server Ychwanegu Gweinydd You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 Password Cyfrinair Password to send to the server <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. Show password Dangos cyfrinair <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. Local server label 127.0.0.1 64738 Your username Your password &Fill CoreAudioSystem Default Device CrashReporter Mumble Crash Report <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> Email address (optional) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash Send Report Don't send report Crash upload successful Thank you for helping make Mumble better! Crash upload failed We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 Uploading crash report Abort upload DXAudioInput Default DirectSound Voice Input Opening chosen DirectSound Input device failed. No microphone capture will be done. Opening chosen DirectSound Input failed. Default device will be used. Lost DirectSound input device. DXAudioOutput Default DirectSound Voice Output Opening chosen DirectSound Output failed. Default device will be used. Lost DirectSound output device. Opening chosen DirectSound Output failed. No audio will be heard. Database Mumble failed to initialize a database in any of the possible locations. The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. DeveloperConsole Developer Console DockTitleBar Drag here GlobalShortcut Shortcuts List of configured shortcuts Function Data Shortcut Suppress Add new shortcut This will add a new global shortcut &Add Remove selected shortcut This will permanently remove a selected shortcut. &Remove <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> Open Accessibility Preferences Skip Enable Global Shortcuts <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. Additional Shortcut Engines <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. Enable Windows hooks <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. Enable GKey <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. Enable XInput <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. Enable shortcuts in privileged applications GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> Shortcuts Shortcut button combination. <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. Suppress keys from other applications <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. GlobalShortcutTarget Whisper Target Whisper to list of Users Channel Target Restrict to Group If specified, only members of this group will receive the whisper. List of users Add Remove Modifiers Do not send positional audio information when using this whisper shortcut. Ignore positional audio Shout to Linked channels Shout to subchannels Shout to Channel The whisper will also be transmitted to linked channels. The whisper will also be sent to the subchannels of the channel target. GlobalShortcutX Mouse %1 JackAudioSystem Hardware Ports Mono Stereo LCD Not connected LCDConfig Enable this device LCD Devices Name <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> Size Enabled Views Minimum Column Width <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> This setting decides the width of column splitter. Splitter Width Log Debug Critical Warning Information Server Connected Server Disconnected Other self-muted/deafened Permission Denied Text Message User Joined Server User Left Server User recording state changed User kicked (you or by you) User kicked You self-muted User muted (you) User muted (by you) User muted (other) User Joined Channel User Left Channel You self-unmuted You self-deafened You self-undeafened User renamed You Joined Channel You Joined Channel (moved) User connected and entered channel User left channel and disconnected Private text message the server [[ Invalid size ]] [[ Text object too large to display ]] [Date changed to %1] link to %1 FTP link to %1 player link channel link %1 link LogConfig Toggle console for %1 events Toggle pop-up notifications for %1 events Toggle Text-To-Speech for %1 events Click here to toggle sound notification for %1 events Toggle window highlight (if not active) for %1 events Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. Messages Message Console Notification Text-To-Speech Soundfile Path Text To Speech Volume Volume of Text-To-Speech Engine <b>This is the volume used for the speech synthesis.</b> Length threshold Message length threshold for Text-To-Speech Engine <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. Characters Whisper If checked you will only hear whispers from users you added to your friend list. Only accept whispers from friends If enabled text messages you send will be read back to you with TTS Read back own messages Chat Log Maximum chat length Unlimited Lines Highlight LookConfig System default None Only with users All Ask Do Nothing Move <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory User Interface This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. List users above subchannels (requires restart). <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. Users above Channels <b>If set, will verify you want to quit if connected.</b> Show number of users in each channel Show channel user count Language Language to use (requires restart) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. Look and Feel Layout Classic Stacked Hybrid Custom This changes the behavior when moving channels. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. Expand When to automatically expand channels Channel Dragging Ask whether to close or minimize when quitting Mumble. Ask on quit while connected Always On Top <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> Hide in tray when minimized Hide the main Mumble window in the tray when it is minimized. This setting controls when the application will be always on top. Never Always In minimal view In normal view Displays talking status in system tray Show talking status in tray icon This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. Show context menu in menu bar Apply some high contrast optimizations for visually impaired users Optimize for high contrast Application Adds user and channel context menus into the menu bar Tray Icon Channel Tree Use selected item as the chat bar target Filter automatically hides empty channels Show transmit mode dropdown in toolbar Theme Theme to use to style the user interface <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. User Dragging This changes the behavior when moving users. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. Enable Developer menu When in custom layout mode, checking this disables rearranging. Lock layout MainWindow Root Push-to-Talk Global Shortcut Push and hold this button to send voice. Global Shortcut This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut Reset Audio Processor Global Shortcut Unlink Plugin Global Shortcut Push-to-Mute Global Shortcut Join Channel Global Shortcut Toggle Overlay Global Shortcut Toggle state of in-game overlay. Global Shortcut Toggle Minimal Global Shortcut Volume Up (+10%) Global Shortcut Volume Down (-10%) Global Shortcut Mumble Mumble -- %1 &Window Minimize Ctrl+M Close Mumble is currently connected to a server. Do you want to Close or Minimize it? Mute Self Global Shortcut Set self-mute status. Global Shortcut This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut Deafen Self Global Shortcut Set self-deafen status. Global Shortcut This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut Whisper/Shout Whisper <center>Not connected</center> Not connected Clear Opening URL %1 File does not exist File is not a configuration file. Settings merged from file. URL scheme is not 'mumble' This version of Mumble can't handle URLs for Mumble version %1.%2.%3 Connecting to %1 Enter username Connecting to server %1. Reconnecting. Transmit Mode set to Continuous <p>%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> Register yourself as %1 <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <h2>Version</h2><p>Protocol %1</p> <p>No build information or OS version available</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) The connection is secured by the cipher suite that OpenSSL identifies as %1 <p>The connection provides perfect forward secrecy</p> <p>The connection does not provide perfect forward secrecy</p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> Voice channel is sent over control channel Register user %1 <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> Kicking user %1 Banning user %1 View comment on user %1 Message to channel %1 Connected. <li>Expected certificate digest (SHA-1): %1</li> Server presented a certificate which failed verification. <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> SSL Version mismatch Server connection failed. <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>Type message to user '%1' here</center> Type message to user '%1' here Choose image file Failed to load image Could not open file for reading. Image format not recognized. &User &Channel Use in conjunction with Whisper to. Global Shortcut This will switch the states of the in-game overlay. Global Shortcut Link Channel Global Shortcut Cycle Transmit Mode Global Shortcut Set Transmit Mode to Push-To-Talk Global Shortcut Set Transmit Mode to Continuous Global Shortcut Set Transmit Mode to VAD Global Shortcut Send Text Message Global Shortcut Send Clipboard Text Message Global Shortcut This will send your Clipboard content to the channel you are currently in. Global Shortcut Continuous Voice Activity Push-to-Talk Mumble - Minimal View -- %1 Cancel Save Image As... Save Image File Could not save image: %1 Change your comment Transmit Mode set to Voice Activity Transmit Mode set to Push-to-Talk <p>Connected users: %1/%2</p> UDP Statistics To Server From Server Good Late Lost Resync <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> Mumble Server Information &View Certificate Enter reason Sending message to %1 To %1: %2 Message to %1 Are you sure you want to reset the comment of user %1? Are you sure you want to reset the avatar of user %1? Are you sure you want to delete %1 and all its sub-channels? Sending message to channel %1 Message to tree %1 To %1 (Tree): %2 (Tree) %1: %2 Unmuted and undeafened. Unmuted. Muted. Muted and deafened. Deafened. Undeafened. Restart Mumble? Some settings will only apply after a restart of Mumble. Restart Mumble now? About Qt SSL Verification failed: %1 <li>Server certificate digest (SHA-1): %1</li> <b>WARNING:</b> The server presented a certificate that was different from the stored one. This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. Server connection failed: %1. Disconnected from server. Invalid username You connected with an invalid username, please try another one. Username in use That username is already in use, please try another username. Wrong certificate or password Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. Wrong password Wrong server password for unregistered user account, please try again. Images (*.png *.jpg *.jpeg) C&onfigure &Help Log This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. &Quit Mumble Closes the program Exits the application. Ctrl+Q Open the server connection dialog &Disconnect Disconnect from server Disconnects you from the server. Show information about the server connection This will show extended information about the connection to the server. &Mute &Deafen &Local Mute Send a Text Message Sends a text message to another user. Add new channel This adds a new sub-channel to the currently selected channel. Remove channel This removes a channel and all sub-channels. Edit Groups and ACL for channel This opens the Group and ACL dialog for the channel, to control permissions. &Link Link your channel to another channel This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. Chatbar Shows a dialog of registered servers, and also allows quick-connect. Kick user (with reason) Kick selected user off server. You'll be asked to specify a reason. Mute user Mute or unmute user on server. Unmuting a deafened user will also undeafen them. Kick and ban user (with reason) Kick and ban selected user from server. You'll be asked to specify a reason. Deafen user Deafen or undeafen user on server. Deafening a user will also mute them. Mute user locally Mute or unmute user locally. Use this on other users in the same room. This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. &Unlink Channel Unlink your channel from another channel This unlinks your current channel from the selected channel. Unlinks your channel from all linked channels. This unlinks your current channel (not the selected one) from all linked channels. &Reset Reset audio preprocessor This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. &Mute Self Mute yourself Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. &Deafen Self Deafen yourself Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. &Text-To-Speech Toggle Text-To-Speech Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. Display audio statistics Pops up a small dialog with information about your current audio input. Forcibly unlink plugin This forces the current plugin to unlink, which is handy if it is reading completely wrong data. Configure Mumble Allows you to change most settings for Mumble. Start the audio configuration wizard This will guide you through the process of configuring your audio hardware. &What's This? Enter What's This? mode Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. Information about Mumble Shows a small dialog with information and license for Mumble. Information about Speex Shows a small dialog with information about Speex. Information about Qt Shows a small dialog with information about Qt. Check for &Updates Check for new version of Mumble Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. Sends a text message to all users in a channel. Configure certificates for strong authentication This starts the wizard for creating, importing and exporting certificates for authentication against servers. Register user on server This will permanently register the user on the server. Add &Friend Adds a user as your friend. This will add the user as a friend, so you can recognize him on this and other servers. &Remove Friend Removes a user from your friends. This will remove a user from your friends list. &Update Friend Update name of your friend. Your friend uses a different name than what is in your database. This will update the name. Edit registered users list This opens the editor for registered users, which allow you to change their name or unregister them. Add or remove text-based access tokens &Minimal View Toggle minimal window modes This will toggle minimal mode, where the log window and menu is hidden. You muted and deafened %1. You unmuted and undeafened %1. You undeafened %1. You suppressed %1. %1 muted and deafened by %2. %1 unmuted and undeafened by %2. %1 undeafened by %2. %1 suppressed by %2. %1 moved to %2. %1 moved to %2 by %3. %1 moved in from %2 by %3. %1 is now muted and deafened. Your account information can not be verified currently. Please try again later Welcome message: %1 Mumble: %1 You were denied %1 privileges in %2. %3 was denied %1 privileges in %2. Denied: Cannot modify SuperUser. Denied: Invalid channel name. Denied: Text message too long. Denied: Operation not permitted in temporary channel. You need a certificate to perform this operation. %1 does not have a certificate. Invalid username: %1. Invalid username. Channel is full. Channel nesting limit reached. Channel count limit reached. Need to delete channels before creating new ones. Permission denied. %1 connected and entered channel. %1 connected. %1 is now muted. %1 is now unmuted. Recording started Recording stopped %1 started recording. %1 stopped recording. You revoked your priority speaker status. You assumed priority speaker status. %1 revoked your priority speaker status. %1 gave you priority speaker status. You revoked priority speaker status for %1. You gave priority speaker status to %1. %1 revoked own priority speaker status. %1 assumed priority speaker status. %1 revoked priority speaker status for %2. %1 gave priority speaker status to %2. You were unmuted and undeafened by %1. You were muted by %1. You were undeafened by %1. You were suppressed. You were suppressed by %1. You were unsuppressed. You were unsuppressed by %1. You joined %1. You moved %1 to %2. %1 is recording %1 renamed to %2 by %3. %1 disconnected. Server message from (Tree) (Channel) (Private) %2%1: %3 Failed to load Opus, it will not be available for audio encoding/decoding. The server requests minimum client version %1 The server requests positional audio be enabled. The server requests positional audio be disabled. The server requests Push-to-Talk be enabled. The server requests Push-to-Talk be disabled. You were unmuted by %1. You muted %1. You unsuppressed %1. You unmuted %1. %1 muted by %2. %1 unsuppressed by %2. %1 unmuted by %2. Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. You were muted and deafened by %1. You were deafened by %1. You were kicked from the server by %1: %2. %3 was kicked from the server by %1: %2. You were kicked and banned from the server by %1: %2. %3 was kicked and banned from the server by %1: %2. You were moved to %1 by %2. %1 entered channel. Server connection rejected: %1. Denied: %1. %1 renamed to %2. %1 left channel and disconnected. Message from %1 You have User Dragging set to "Do Nothing" so the user wasn't moved. You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. Unknown Channel Drag mode in UserModel::dropMimeData. Remote controlling Mumble: Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) -jn, --jackname Set custom Jack client name. --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status Invocation Error: No RPC command specified RPC Welcome to Mumble. Skipping version check in debug mode. Hide Frame Toggle showing frame on minimal window This will toggle whether the minimal window should have a frame for moving and resizing. &Unlink All Reset the comment of the selected user. &Join Channel View comment in editor Query server for connection information for user S&erver &Self &Unlink Plugins Register yourself on the server Change your avatar image on this server &Remove Avatar Remove currently defined avatar image. Icon Toolbar Change your own comment Recording Priority Speaker &Copy URL Copies a link to this channel to the clipboard. Ignore Messages Locally ignore user's text chat messages. Silently drops all text messages from the user. Edit ban list on server This lets you edit the server-side IP ban list. &Filter on/off Toggle the channel filter (Ctrl+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. Ctrl+F &Hide Channel when Filtering Reset the avatar of the selected user. Locally adjust the user's speech volume. Opens a dialog with a volume slider. Use this on other users in the same room. &Developer &Hide Mumble Hides the main Mumble window. Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. Show the Developer Console Shows the Mumble Developer Console, where Mumble's log output can be inspected. &Connect... &Ban list... &Information... &Kick... &Ban... Local Volume Adjustment... Send &Message... &Add... &Remove... &Edit... Audio S&tatistics... &Settings... &Audio Wizard... Developer &Console... &About... About &Speex... About &Qt... &Certificate Wizard... &Register... Registered &Users... Change &Avatar... &Access Tokens... Reset &Comment... Reset &Avatar... View Comment... &Change Comment... R&egister... Show Shows the main Mumble window. Manual Manual Mumble Positional Audio Position X Y Z m Heading Azimuth Elevation ° Meta data Context Identity Set State Linked Activated Unhinge NetworkConfig Network Updates are mandatory when using snapshot releases. Connection Use TCP compatibility mode Use TCP compatability mode <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). Reconnect when disconnected <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. Reconnect automatically Proxy Type Type of proxy to connect through Direct connection HTTP(S) proxy SOCKS5 proxy Hostname Hostname of the proxy Force TCP mode Enable QoS to prioritize packets This will enable QoS, which will attempt to prioritize voice packets over other traffic. Use Quality of Service Defnyddio Ansawdd o Wasanaeth Don't send certificate to server and don't save passwords. (Not saved). <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> Suppress certificate and password storage <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. Port Port number of the proxy <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. Username Username for proxy authentication <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Password Cyfrinair Password for proxy authentication <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Mumble services Check for new releases of Mumble automatically. This will check for new releases of Mumble every time you start the program, and notify you if one is available. Check for application updates on startup Check for new releases of plugins automatically. This will check for new releases of plugins every time you start the program, and download them automatically. <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. Submit anonymous statistics to the Mumble project Submit anonymous statistics Reconnect to last used server when starting Mumble Reconnect to last server on startup Ailgysylltu i'r gweinydd olaf ar gychwyn Download plugin and overlay updates on startup Privacy Prevent OS information being sent to Mumble servers and web servers <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. Do not send OS information to Mumble servers and web servers Overlay Silent Talking Yn siarad Whisper Shout Gweiddi Channel Sianel Failed to create communication with overlay at %2: %1. No overlay will be available. OverlayClient Filter Only talking Talking and recently active All in current channel All in linked channels Always show yourself Configure recently active time (%1 seconds)... Columns Colofnau Sort Alphabetically Yn ôl yr wyddor Last state change Edit... Golygu... Reset Zoom Configure recently active time Amount of seconds users remain active after talking: OverlayConfig To move the users, drag the little red dot. To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. For more options, right click a user. For more options, rightclick a user. Ar gyfer fwy o opsiynau, gwnewch glic dde fel defnyddiwr. Launcher Filter Overlay Choose executable Choose application Dewis rhaglen Choose path Load Overlay Presets Mumble overlay presets (*.mumblelay) Save Overlay Presets Options Opsiynau Enable overlay. Enable Overlay This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. Layout Blacklist Whitelist Uninstall Overlay Overlay Installation Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. Install Mumble Overlay Overlay Upgrade Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. Upgrade Mumble Overlay Display a frame counter in the overlay Show FPS counter Load an overlay preset from file Load… Llwytho... Save your overlay settings to file Save… Cadw... Set the overlay font. Set the overlay text color. Color Lliw Remove Tynnu Font Ffont FPS and Clock Display Display a clock in the overlay showing the current local time (system time). Show Clock Dangod Cloc Overlay Exceptions Overlay Exception Mode Allowed launchers Add Allowed programs Allowed paths Blacklisted programs OverlayEditor State User is not talking Nid yw'r defnyddiwr yn siarad Passive User is talking in your channel or a linked channel Talking Yn siarad User is whispering to you privately Private Whisper User is shouting to your channel Channel Whisper Zoom Chwyddo Zoom Factor Ffactor Chwyddo Enabled Elements User avatar, chosen by each user Avatar Afatar User's name Enw'r Defnyddiwr Username Enw Defnyddiwr Name of user's channel, if outside your current channel Channel Sianel Muted or deafened Mute state Bounding box, automatically shrunk to minimum size to contain all visible elements Bounding box Overlay Editor OverlayEditorScene Layout preset Large square avatar Avatar and Name User Opacity %1% %1% Object Opacity Alignment Left Chwith Center Canol Right Dde Top Top Bottom Gwaelod Color... Lliw... Font... Ffont... Bounding box Pen width Padding Pen color Fill color Pick pen color Pick fill color Pick color Dewis lliw Pick font Dewis ffont PluginConfig Plugins Plugin has no configure function. Plugin has no about function. Options Opsiynau Enable plugins and transmit positional information This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. Link to Game and Transmit Position Reloads all plugins This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. &Reload plugins Information about plugin This shows a small information message about the plugin. &About &Gwybodaeth Show configuration page of plugin This shows the configuration page of the plugin, if any. &Configure Name Enw Enabled Wedi'i alluogi Plugins Skipping plugin update in debug mode. Downloaded new or updated plugin to %1. Failed to install new plugin to %1. %1 lost link. %1 linked. PortAudioSystem Default Device Dyfais Diofyn PulseAudioSystem Default Input Default Output QApplication Failed to restart mumble Mumble failed to restart itself. Please restart it manually. RichTextEditor Failed to load image Methodd llwytho'r delwedd Image file too large to embed in document. Please use images smaller than %1 kB. Message is too long. Mae'r neges rhy hir. Display Source Text Testyn Gwreiddiol &Bold &Print Trwm Ctrl+B Ctrl+B &Italic &Italig Italic Italig Ctrl+I Ctrl+I Underline Tanlinellu Ctrl+U Ctrl+U Color Lliw Insert Link Ctrl+L Ctrl+L Insert Image RichTextEditorLink Add Link Ychwanegu Cysylltiad URL URL Text Testyn ServerHandler Unable to resolve hostname Server is not responding to TCP pings UDP packets cannot be sent to or received from the server. Switching to TCP mode. UDP packets cannot be sent to the server. Switching to TCP mode. UDP packets cannot be received from the server. Switching to TCP mode. UDP packets can be sent to and received from the server. Switching back to UDP mode. Connection timed out ServerView Favorite Ffefrynu LAN LAN Public Internet Rhyngwyd Cyhoeddus Unknown Africa Affrica Asia Asia North America Gogledd America South America De America Europe Ewrop Oceania Ynysoedd y De ShortcutActionWidget Unassigned ShortcutDelegate On Ymlaen Off I ffwrdd Toggle Unassigned ShortcutKeyWidget Press Shortcut ShortcutTargetDialog Root Tardd Parent Rhiant Current Subchannel #%1 ShortcutTargetWidget ... ... , , Root Tardd Parent Rhiant Current Subchannel #%1 Invalid Empty <Empty> Gwag ShortcutToggleWidget Off I ffwrdd Toggle On Ymlaen TextMessage Enter text If checked the message is recursively sent to all subchannels Send recursively to subchannels Tokens Empty Token Tocyn Gwag Mumble - Access Tokens Mumble - Tocynnau Mynediad List of access tokens on current server <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. Add a token Ychwanegwch tocyn &Add &Ychwanegu Remove a token &Remove &Tynnu UserEdit Registered Users Defnyddwyr Cofrestredig Remove Tynnu Rename Ail-enwi Who are you looking for? Days Dydd Weeks Wythnos Months Mis Years Blwyddyn Inactive for Registered users: %n account(s) UserInformation User Information Gwybodaeth Am Y Defnyddiwr Connection Information Gwybodaeth Am Y Cysylltiad Version Fersiwn OS OS Certificate Tystysgrif IP Address Cyfeiriad IP CELT Versions Fersiynau CELT Details... Manylion... Ping Statistics Pings received Average ping TCP (Control) UDP (Voice) UDP Network statistics Good Da Late Hwyr Lost Wedi'i golli Resync From Client To Client Connection time Amser a chysylltwyd %1w %1w %1d %1d %1h %1h %1m %1m %1s %1s , , %1 (%2) %1.%2.%3 (%4) %1 (%2) Supported Not Supported Not Reported %1 online (%2 idle) %1 ar-lein (%2 yn segur) %1 online %1 ar-lein %1 kbit/s %1 kbit/s Bandwidth GroupBox Lled Band Bandwidth Label Lled Band Ping deviation UserListModel Nick Nick Inactive days Last channel Sianel olaf Last seen: %1 Gwelwyd diwethaf: %1 Never Byth Channel ID: %1 UserLocalVolumeDialog Local volume for other users <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. Adjusting local volume for %1 dB <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: Talking to your channel. Shouting directly to your channel. Whispering directly to your channel. Whispering directly to you. Not talking. Ddim yn siarad. This is a channel on the server. The icon indicates the state of the channel: Your current channel. A channel that is linked with your channel. Linked channels can talk to each other. A channel on the server that you are not linked to. This shows the flags the user has on the server, if any: On your friend list Ar eich rhestr ffrindiau Authenticated user Muted (manually muted by self) Muted (manually muted by admin) Muted (not allowed to speak in current channel) Muted (muted by you, only on your machine) Muted (push-to-mute) Deafened (by self) Deafened (by admin) User has a new comment set (click to show) User has a comment set, which you've already seen. (click to show) Ignoring Text Messages Yn Anwybyddu Negeseuon Testun This shows the flags the channel has, if any: Channel has a new comment set (click to show) Channel has a comment set, which you've already seen. (click to show) Channel will be hidden when filtering is enabled Name Enw Flags Fflagiau Are you sure you want to drag this user? Are you sure you want to drag this channel? Ydach yn siwr rydach eisio llusgo'r sianel hyn? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. VersionCheck Upgrade Mumble Uwchraddio Mumble A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? Cafodd fersiwn newydd o Mumble ei darganfod a'i lawrlwytho'n awtomatig. Mae'n argymelladwy eich bod yn uwchraddio i'r fersiwn hon, neu lawr-raddio i'r fersiwn cadarn fwyaf diweddar. Ydach eisio cychwyn yr gosodwr rwan? Failed to launch snapshot installer. Corrupt download of new version detected. Automatically removed. Downloading new snapshot from %1 to %2 Failed to write new version to disk. Failed to write new version to disc. Mumble failed to retrieve version information from the central server. ViewCert Certificate Chain Details Certificate chain Certificate details Manylion tystysgrif Common Name Organization Subunit Country Locality State Valid from: %1 Dilys o: %1 Valid to: %1 Dilys tan: %1 Serial: %1 Public Key: %1 bits %2 RSA RSA DSA DSA Digest (SHA-1): %1 Digest (SHA-256): %1 Email: %1 E-bost: %1 DNS: %1 DNS: %1 Issued by: Cyhoeddwyd gan: Unit Name VoiceRecorder Recorder failed to create directory '%1' Methodd y recordydd creu'r lleoliad '%1' Recorder failed to open file '%1' Methodd yr recordydd agor yr ffeil '%1' .wav - Uncompressed .wav - Heb ei chywasgu .ogg (Vorbis) - Compressed .ogg (Vorbis) - Wedi'i chywasgu .au - Uncompressed .au - Heb ei chywasgu .flac - Lossless compressed .flac - Cywasgu heb golled VoiceRecorderDialog Recorder Recordydd Control Rheoli 00:00:00 00:00:00 &Start &Dechrau S&top S&top Mode Modd Multichannel Output Allbwn Output format Fformat allbwn Target directory Lleoliad targed Filename Enw'r ffeil &Browse... &Pori Valid variables are: Inserts the user's name Yn mewnosod enw'r defnyddiwr Inserts the current date Yn mewnosod yr dyddiad cyfredol Inserts the current time Yn mewnosod yr amser cyfredol Inserts the hostname Yn mewnosod yr enw lletywr Recorder still running Mae'r recordydd dal yn rhedeg Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? Unable to start recording. Not connected to a server. Methy cychwyn recordio. Heb cysylltu i gweinydd. The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. Mae'r gweinydd rydach wedi ei gysylltu ag ar y funud yn fersiwn 1.2.2 neu hyn. Oherwydd rhesymau preifatrwydd, nid yw recordio yn bosib ar fersiynau hyn na 1.2.3. Cysylltwch â gweinyddwr y gweinydd ar gyfer gwybodaeth bellach. There is already a recorder active for this server. Please select a recording format. Dewisiwch fformat recordio. Stopping Stopio Select target directory Downmix WASAPIInput Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone. WASAPISystem Default Device Dyfais Diofyn qwPTTButtonWidget Mumble PTT PTT Mumble Push to talk Gwthio i siarad mumble-1.3.4/src/mumble/UserLockFile_win.cpp0000664000175000017500000000170414010707273020623 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "UserLockFile.h" UserLockFile::UserLockFile(const QString &lockFilePath) : m_handle(0) , m_path(lockFilePath) { } UserLockFile::~UserLockFile() { release(); } QString UserLockFile::path() const { return m_path; } bool UserLockFile::acquire() { if (m_handle != 0) { return false; } m_handle = CreateFile( reinterpret_cast(m_path.utf16()), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_HIDDEN, NULL ); if (m_handle == INVALID_HANDLE_VALUE && GetLastError() == ERROR_SHARING_VIOLATION) { return false; } return true; } void UserLockFile::release() { if (m_handle != 0) { CloseHandle(m_handle); m_handle = 0; } } mumble-1.3.4/src/mumble/TextMessage.ui0000664000175000017500000000376314010707273017512 0ustar builderbuilder TextMessage 0 0 397 297 If checked the message is recursively sent to all subchannels Send recursively to subchannels Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok RichTextEditor QWidget
RichTextEditor.h
1
qbbButtons accepted() TextMessage accept() 257 287 157 274 qbbButtons rejected() TextMessage reject() 325 287 286 274
mumble-1.3.4/src/mumble/AudioStats.ui0000664000175000017500000003323614010707273017337 0ustar builderbuilder AudioStats 0 0 598 548 Audio Statistics Input Levels Peak microphone level Peak power in last frame This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. Peak speaker level Peak power in last frame This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. Peak clean level Peak power in last frame This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. Signal Analysis Microphone power How close the current input level is to ideal This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. Signal-To-Noise ratio Signal-To-Noise ratio from the microphone This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. Speech Probability Probability of speech This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). Configuration feedback Current audio bitrate 20 0 Bitrate of last frame This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. DoublePush interval 20 0 Time between last two Push-To-Talk presses Speech Detection Current speech detection chance <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Qt::Horizontal 40 20 0 0 Signal and noise power spectrum Power spectrum of input signal and noise estimate This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. 0 0 Echo Analysis 0 0 Weights of the echo canceller This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. AudioBar QWidget
AudioStats.h
1
AudioNoiseWidget QWidget
AudioStats.h
1
AudioEchoWidget QWidget
AudioStats.h
1
mumble-1.3.4/src/mumble/OverlayClient.h0000664000175000017500000000376414010707273017654 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_OVERLAYCLIENT_H_ #define MUMBLE_MUMBLE_OVERLAYCLIENT_H_ #include #include #include "Timer.h" #include "../../overlay/overlay.h" #include "SharedMemory.h" #include "OverlayUserGroup.h" class ClientUser; class Overlay; class QLibrary; class QLocalServer; class OverlayPositionableItem; class OverlayClient : public QObject { friend class Overlay; private: Q_OBJECT Q_DISABLE_COPY(OverlayClient) protected: OverlayMsg omMsg; QLocalSocket *qlsSocket; SharedMemory2 *smMem; QRect qrLast; Timer t; float framesPerSecond; int iOffsetX, iOffsetY; QGraphicsPixmapItem *qgpiCursor; QGraphicsPixmapItem *qgpiLogo; OverlayPositionableItem *qgpiFPS; OverlayPositionableItem *qgpiTime; /// The process ID of the process this OverlayClient is connected to. quint64 uiPid; /// The path to the executable of the process that this OverlayClient is connected to. QString qsExecutablePath; QGraphicsScene qgs; OverlayUserGroup ougUsers; #ifdef Q_OS_MAC QMap qmCursors; #endif bool bWasVisible; bool bDelete; void setupRender(); void setupScene(bool show); bool eventFilter(QObject *, QEvent *) Q_DECL_OVERRIDE; void readyReadMsgInit(unsigned int length); QList qlDirty; protected slots: void readyRead(); void changed(const QList &); void render(); public: QGraphicsView qgv; unsigned int uiWidth, uiHeight; int iMouseX, iMouseY; OverlayClient(QLocalSocket *, QObject *); ~OverlayClient() Q_DECL_OVERRIDE; void reset(); public slots: void showGui(); void hideGui(); void scheduleDelete(); void updateMouse(); void updateFPS(); void updateTime(); bool update(); void openEditor(); }; #endif mumble-1.3.4/src/mumble/G15LCDEngine_unix.h0000664000175000017500000000216214010707273020133 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_G15LCDENGINE_UNIX_H_ #define MUMBLE_MUMBLE_G15LCDENGINE_UNIX_H_ #include "mumble_pch.hpp" #include "LCD.h" #include class G15LCDDeviceUnix; class G15LCDEngineUnix : public LCDEngine { friend class G15LCDDeviceUnix; protected: int sock; public: G15LCDEngineUnix(); ~G15LCDEngineUnix() Q_DECL_OVERRIDE; QList devices() const Q_DECL_OVERRIDE; }; class G15LCDDeviceUnix : public LCDDevice { protected: bool bEnabled; G15LCDEngineUnix *engine; public: G15LCDDeviceUnix(G15LCDEngineUnix *e); ~G15LCDDeviceUnix() Q_DECL_OVERRIDE; bool enabled() Q_DECL_OVERRIDE; void setEnabled(bool e) Q_DECL_OVERRIDE; void blitImage(QImage *img, bool alert) Q_DECL_OVERRIDE; QString name() const Q_DECL_OVERRIDE; QSize size() const Q_DECL_OVERRIDE; }; #else class G15LCDEngineUnix; class G15LCDDeviceUnix; #endif mumble-1.3.4/src/mumble/Overlay_win.h0000664000175000017500000000264714010707273017371 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_OVERLAY_WIN_H_ #define MUMBLE_MUMBLE_OVERLAY_WIN_H_ #include #include #include #include #include #include #include "Overlay.h" class OverlayPrivateWin : public OverlayPrivate { private: Q_OBJECT Q_DISABLE_COPY(OverlayPrivateWin) public: void setActive(bool); OverlayPrivateWin(QObject *); ~OverlayPrivateWin(); public slots: void onHelperProcessStarted(); void onHelperProcessError(QProcess::ProcessError); void onHelperProcessExited(int exitCode, QProcess::ExitStatus exitStatus); void onDelayedRestartTimerTriggered(); protected: QProcess *m_helper_process; QString m_helper_exe_path; QStringList m_helper_exe_args; QElapsedTimer m_helper_start_time; QTimer *m_helper_restart_timer; bool m_helper_enabled; QProcess *m_helper64_process; QString m_helper64_exe_path; QStringList m_helper64_exe_args; QElapsedTimer m_helper64_start_time; QTimer *m_helper64_restart_timer; bool m_helper64_enabled; HANDLE m_mumble_handle; bool m_active; void startHelper(QProcess *helper); }; #endif mumble-1.3.4/src/mumble/UserView.cpp0000664000175000017500000002716014010707274017175 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "UserView.h" #include "Channel.h" #include "ClientUser.h" #include "Log.h" #include "MainWindow.h" #include "ServerHandler.h" #include "UserModel.h" // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" const int UserDelegate::FLAG_ICON_DIMENSION = 16; const int UserDelegate::FLAG_ICON_PADDING = 1; const int UserDelegate::FLAG_DIMENSION = 18; UserDelegate::UserDelegate(QObject *p) : QStyledItemDelegate(p) { } void UserDelegate::paint(QPainter * painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { const QAbstractItemModel *m = index.model(); const QModelIndex idxc1 = index.sibling(index.row(), 1); QVariant data = m->data(idxc1); QList ql = data.toList(); // Allow a UserView's BackgroundRole to override the current theme's default color. QVariant bg = index.data(Qt::BackgroundRole); if (bg.isValid()) { painter->fillRect(option.rect, bg.value()); } painter->save(); #if QT_VERSION >= 0x050000 QStyleOptionViewItem o = option; #else QStyleOptionViewItemV4 o = option; #endif initStyleOption(&o, index); QStyle *style = o.widget->style(); QIcon::Mode iconMode = QIcon::Normal; QPalette::ColorRole colorRole = ((o.state & QStyle::State_Selected) ? QPalette::HighlightedText : QPalette::Text); #if defined(Q_OS_WIN) // Qt's Vista Style has the wrong highlight color for treeview items // We can't check for QStyleSheetStyle so we have to search the children list search for a QWindowsVistaStyle QList hierarchy = style->findChildren(); hierarchy.insert(0, style); foreach (QObject *obj, hierarchy) { if (QString::fromUtf8(obj->metaObject()->className()) == QString::fromUtf8("QWindowsVistaStyle")) { colorRole = QPalette::Text; break; } } #endif // draw background style->drawPrimitive(QStyle::PE_PanelItemViewItem, &o, painter, o.widget); // resize rect to exclude the flag icons o.rect = option.rect.adjusted(0, 0, -FLAG_DIMENSION * ql.count(), 0); // draw icon QRect decorationRect = style->subElementRect(QStyle::SE_ItemViewItemDecoration, &o, o.widget); o.icon.paint(painter, decorationRect, o.decorationAlignment, iconMode, QIcon::On); // draw text QRect textRect = style->subElementRect(QStyle::SE_ItemViewItemText, &o, o.widget); QString itemText = o.fontMetrics.elidedText(o.text, o.textElideMode, textRect.width()); painter->setFont(o.font); style->drawItemText(painter, textRect, o.displayAlignment, o.palette, true, itemText, colorRole); // draw flag icons to original rect QRect ps = QRect(option.rect.right() - (ql.size() * FLAG_DIMENSION), option.rect.y(), ql.size() * FLAG_DIMENSION, option.rect.height()); for (int i = 0; i < ql.size(); ++i) { QRect r = ps; r.setSize(QSize(FLAG_ICON_DIMENSION, FLAG_ICON_DIMENSION)); r.translate(i * FLAG_DIMENSION + FLAG_ICON_PADDING, FLAG_ICON_PADDING); QRect p = QStyle::alignedRect(option.direction, option.decorationAlignment, r.size(), r); qvariant_cast(ql[i]).paint(painter, p, option.decorationAlignment, iconMode, QIcon::On); } painter->restore(); } bool UserDelegate::helpEvent(QHelpEvent *evt, QAbstractItemView *view, const QStyleOptionViewItem &option, const QModelIndex &index) { if (index.isValid()) { const QAbstractItemModel *m = index.model(); const QModelIndex firstColumnIdx = index.sibling(index.row(), 1); QVariant data = m->data(firstColumnIdx); QList flagList = data.toList(); const int offset = flagList.size() * -FLAG_DIMENSION; const int firstFlagPos = option.rect.topRight().x() + offset; if (evt->pos().x() >= firstFlagPos) { return QStyledItemDelegate::helpEvent(evt, view, option, firstColumnIdx); } } return QStyledItemDelegate::helpEvent(evt, view, option, index); } UserView::UserView(QWidget *p) : QTreeView(p) { setItemDelegate(new UserDelegate(this)); qtSearch = new QTimer(this); qtSearch->setInterval(QApplication::keyboardInputInterval()); qtSearch->setSingleShot(true); connect(this, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(nodeActivated(const QModelIndex &))); connect(qtSearch, SIGNAL(timeout()), this, SLOT(selectSearchResult())); } /** * This implementation contains a special handler to display * custom what's this entries for items. All other events are * passed on. */ bool UserView::event(QEvent *evt) { if (evt->type() == QEvent::WhatsThisClicked) { QWhatsThisClickedEvent *qwtce = static_cast(evt); QDesktopServices::openUrl(qwtce->href()); evt->accept(); return true; } return QTreeView::event(evt); } /** * This function is used to create custom behaviour when clicking * on user/channel flags (e.g. showing the comment) */ void UserView::mouseReleaseEvent(QMouseEvent *evt) { QPoint clickPosition = evt->pos(); QModelIndex idx = indexAt(clickPosition); if ((evt->button() == Qt::LeftButton) && idx.isValid()) { UserModel *userModel = qobject_cast(model()); ClientUser *clientUser = userModel->getUser(idx); Channel *channel = userModel->getChannel(idx); int commentFlagPxOffset = -UserDelegate::FLAG_DIMENSION; bool hasComment = false; if (clientUser && !clientUser->qbaCommentHash.isEmpty()) { hasComment = true; if (clientUser->bLocalIgnore) commentFlagPxOffset -= UserDelegate::FLAG_DIMENSION; if (clientUser->bRecording) commentFlagPxOffset -= UserDelegate::FLAG_DIMENSION; if (clientUser->bPrioritySpeaker) commentFlagPxOffset -= UserDelegate::FLAG_DIMENSION; if (clientUser->bMute) commentFlagPxOffset -= UserDelegate::FLAG_DIMENSION; if (clientUser->bSuppress) commentFlagPxOffset -= UserDelegate::FLAG_DIMENSION; if (clientUser->bSelfMute) commentFlagPxOffset -= UserDelegate::FLAG_DIMENSION; if (clientUser->bLocalMute) commentFlagPxOffset -= UserDelegate::FLAG_DIMENSION; if (clientUser->bSelfDeaf) commentFlagPxOffset -= UserDelegate::FLAG_DIMENSION; if (clientUser->bDeaf) commentFlagPxOffset -= UserDelegate::FLAG_DIMENSION; if (! clientUser->qsFriendName.isEmpty()) commentFlagPxOffset -= UserDelegate::FLAG_DIMENSION; if (clientUser->iId >= 0) commentFlagPxOffset -= UserDelegate::FLAG_DIMENSION; } else if (channel && !channel->qbaDescHash.isEmpty()) { hasComment = true; if (channel->bFiltered) commentFlagPxOffset -= UserDelegate::FLAG_DIMENSION; } if (hasComment) { QRect r = visualRect(idx); const int commentFlagPxPos = r.topRight().x() + commentFlagPxOffset; if ((clickPosition.x() >= commentFlagPxPos) && (clickPosition.x() <= (commentFlagPxPos + UserDelegate::FLAG_DIMENSION))) { // Clicked comment icon QString str = userModel->data(idx, Qt::ToolTipRole).toString(); if (str.isEmpty()) { userModel->bClicked = true; } else { QWhatsThis::showText(viewport()->mapToGlobal(r.bottomRight()), str, this); userModel->seenComment(idx); } return; } } } QTreeView::mouseReleaseEvent(evt); } void UserView::keyPressEvent(QKeyEvent *ev) { if (ev->key() == Qt::Key_Return || ev->key() == Qt::Key_Enter) UserView::nodeActivated(currentIndex()); QTreeView::keyPressEvent(ev); } void UserView::nodeActivated(const QModelIndex &idx) { UserModel *um = static_cast(model()); ClientUser *p = um->getUser(idx); if (p) { g.mw->openTextMessageDialog(p); return; } Channel *c = um->getChannel(idx); if (c) { // if a channel is activated join it g.sh->joinChannel(g.uiSession, c->iId); } } /** * This implementation provides a recursive realtime search over * the whole channel tree. It also features delayed selection * with with automatic expanding of folded channels. */ void UserView::keyboardSearch(const QString &search) { if (qtSearch->isActive()) { qpmiSearch = QPersistentModelIndex(); qtSearch->stop(); } bool forceSkip = false; if (tSearch.restart() > (QApplication::keyboardInputInterval() * 1000ULL)) { qsSearch = QString(); forceSkip = true; } bool isBackspace = (search.length() == 1) && (search.at(0).row() == 0) && (search.at(0).cell() == 8); if (isBackspace) { if (! qsSearch.isEmpty()) qsSearch = qsSearch.left(qsSearch.length()-1); } else { qsSearch += search; } // Try default search (which doesn't recurse non-expanded items) and see if it returns something "valid" QTreeView::keyboardSearch(search); QModelIndex start = currentIndex(); if (start.isValid() && model()->data(start, Qt::DisplayRole).toString().startsWith(qsSearch, Qt::CaseInsensitive)) return; if (forceSkip && start.isValid()) start = indexBelow(start); if (! start.isValid()) start = model()->index(0, 0, QModelIndex()); QModelIndexList qmil = model()->match(start, Qt::DisplayRole, qsSearch, 1, Qt::MatchFlags(Qt::MatchStartsWith | Qt::MatchWrap | Qt::MatchRecursive)); if (qmil.count() == 0) qmil = model()->match(start, Qt::DisplayRole, qsSearch, 1, Qt::MatchFlags(Qt::MatchContains | Qt::MatchWrap | Qt::MatchRecursive)); if (qmil.isEmpty()) return; QModelIndex qmi = qmil.at(0); QModelIndex p = qmi.parent(); bool visible = true; while (visible && p.isValid()) { visible = visible && isExpanded(p); p = p.parent(); } if (visible) selectionModel()->setCurrentIndex(qmi, QItemSelectionModel::ClearAndSelect); else { qpmiSearch = qmi; qtSearch->start(); } } void UserView::selectSearchResult() { if (qpmiSearch.isValid()) { selectionModel()->setCurrentIndex(qpmiSearch, QItemSelectionModel::ClearAndSelect); } qpmiSearch = QPersistentModelIndex(); } bool channelHasUsers(const Channel *c) { if(c->qlUsers.isEmpty() == false) return true; int i; for(i=0;iqlChannels.count();i++) { if(channelHasUsers(c->qlChannels[i])) return true; } return false; } static bool channelFiltered(const Channel *c) { while(c) { if(c->bFiltered) return true; c=c->cParent; } return false; } void UserView::updateChannel(const QModelIndex &idx) { UserModel *um = static_cast(model()); if(!idx.isValid()) return; Channel * c = um->getChannel(idx); for(int i = 0; idx.child(i, 0).isValid(); ++i) { updateChannel(idx.child(i,0)); } if(c && idx.parent().isValid()) { if(g.s.bFilterActive == false) { setRowHidden(idx.row(),idx.parent(),false); } else { bool isChannelUserIsIn = false; // Check whether user resides in this channel or a subchannel if (g.uiSession != 0) { const ClientUser* user = ClientUser::get(g.uiSession); if (user != NULL) { Channel *chan = user->cChannel; while (chan) { if (chan == c) { isChannelUserIsIn = true; break; } chan = chan->cParent; } } } if(channelFiltered(c) && !isChannelUserIsIn) { setRowHidden(idx.row(),idx.parent(),true); } else { if(g.s.bFilterHidesEmptyChannels && !channelHasUsers(c)) { setRowHidden(idx.row(),idx.parent(),true); } else { setRowHidden(idx.row(),idx.parent(),false); } } } } } #if QT_VERSION >= 0x050000 void UserView::dataChanged ( const QModelIndex & topLeft, const QModelIndex & bottomRight, const QVector &) #else void UserView::dataChanged ( const QModelIndex & topLeft, const QModelIndex & bottomRight) #endif { UserModel *um = static_cast(model()); int nRowCount = um->rowCount(); int i; for(i=0;iindex(i,0)); QTreeView::dataChanged(topLeft,bottomRight); } mumble-1.3.4/src/mumble/OverlayEditor.ui0000664000175000017500000001472414010707273020050 0ustar builderbuilder OverlayEditor 0 0 718 556 Overlay Editor State User is not talking Passive User is talking in your channel or a linked channel Talking true User is whispering to you privately Private Whisper User is shouting to your channel Channel Whisper true QPainter::Antialiasing|QPainter::SmoothPixmapTransform|QPainter::TextAntialiasing Zoom Zoom Factor 1 10 5 2 Qt::Vertical QSlider::TicksBelow 1 Enabled Elements User avatar, chosen by each user Avatar User's name Username Name of user's channel, if outside your current channel Channel Muted or deafened Mute state Bounding box, automatically shrunk to minimum size to contain all visible elements Bounding box Qt::Horizontal QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::Reset qrbPassive qrbTalking qrbWhisper qrbShout qcbAvatar qcbUser qcbChannel qcbMutedDeafened qcbBox qsZoom qgvView qdbbBox qdbbBox accepted() OverlayEditor accept() 227 538 157 274 qdbbBox rejected() OverlayEditor reject() 295 544 286 274 mumble-1.3.4/src/mumble/AudioConfigDialog.cpp0000664000175000017500000004640314010707273020733 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . /* Copyright (C) 2005-2011, Thorvald Natvig Copyright (C) 2008, Andreas Messer All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Mumble Developers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "mumble_pch.hpp" #include "AudioConfigDialog.h" #include "AudioInput.h" #include "AudioOutput.h" #include "AudioOutputSample.h" #include "Global.h" #include "NetworkConfig.h" static ConfigWidget *AudioInputDialogNew(Settings &st) { return new AudioInputDialog(st); } static ConfigWidget *AudioOutputDialogNew(Settings &st) { return new AudioOutputDialog(st); } static ConfigRegistrar iregistrar(1000, AudioInputDialogNew); static ConfigRegistrar oregistrar(1010, AudioOutputDialogNew); void AudioInputDialog::hideEvent(QHideEvent *) { qtTick->stop(); } void AudioInputDialog::showEvent(QShowEvent *) { qtTick->start(20); } AudioInputDialog::AudioInputDialog(Settings &st) : ConfigWidget(st) { qtTick = new QTimer(this); qtTick->setObjectName(QLatin1String("Tick")); setupUi(this); if (AudioInputRegistrar::qmNew) { QList keys = AudioInputRegistrar::qmNew->keys(); foreach(QString key, keys) { qcbSystem->addItem(key); } } qcbSystem->setEnabled(qcbSystem->count() > 1); qcbTransmit->addItem(tr("Continuous"), Settings::Continuous); qcbTransmit->addItem(tr("Voice Activity"), Settings::VAD); qcbTransmit->addItem(tr("Push To Talk"), Settings::PushToTalk); abSpeech->qcBelow = Qt::red; abSpeech->qcInside = Qt::yellow; abSpeech->qcAbove = Qt::green; qcbDevice->view()->setTextElideMode(Qt::ElideRight); on_qcbPushClick_clicked(g.s.bTxAudioCue); on_Tick_timeout(); on_qcbIdleAction_currentIndexChanged(g.s.iaeIdleAction); } QString AudioInputDialog::title() const { return tr("Audio Input"); } QIcon AudioInputDialog::icon() const { return QIcon(QLatin1String("skin:config_audio_input.png")); } void AudioInputDialog::load(const Settings &r) { int i; QList keys; if (AudioInputRegistrar::qmNew) keys=AudioInputRegistrar::qmNew->keys(); else keys.clear(); i=keys.indexOf(AudioInputRegistrar::current); if (i >= 0) loadComboBox(qcbSystem, i); loadCheckBox(qcbExclusive, r.bExclusiveInput); qlePushClickPathOn->setText(r.qsTxAudioCueOn); qlePushClickPathOff->setText(r.qsTxAudioCueOff); loadComboBox(qcbTransmit, r.atTransmit); loadSlider(qsTransmitHold, r.iVoiceHold); loadSlider(qsTransmitMin, iroundf(r.fVADmin * 32767.0f + 0.5f)); loadSlider(qsTransmitMax, iroundf(r.fVADmax * 32767.0f + 0.5f)); loadSlider(qsFrames, (r.iFramesPerPacket == 1) ? 1 : (r.iFramesPerPacket/2 + 1)); loadSlider(qsDoublePush, iroundf(static_cast(r.uiDoublePush) / 1000.f + 0.5f)); loadSlider(qsPTTHold, static_cast(r.pttHold)); if (r.vsVAD == Settings::Amplitude) qrbAmplitude->setChecked(true); else qrbSNR->setChecked(true); loadCheckBox(qcbPushWindow, r.bShowPTTButtonWindow); loadCheckBox(qcbPushClick, r.bTxAudioCue); loadSlider(qsQuality, r.iQuality); if (r.iNoiseSuppress != 0) loadSlider(qsNoise, - r.iNoiseSuppress); else loadSlider(qsNoise, 14); loadCheckBox(qcbDenoise, r.bDenoise); #ifdef USE_RNNOISE qcbDenoise->setEnabled(SAMPLE_RATE == 48000); #else qcbDenoise->setVisible(false); #endif loadSlider(qsAmp, 20000 - r.iMinLoudness); // Idle auto actions qsbIdle->setValue(r.iIdleTime / 60); loadComboBox(qcbIdleAction, r.iaeIdleAction); loadCheckBox(qcbUndoIdleAction, r.bUndoIdleActionUponActivity); int echo = 0; if (r.bEcho) echo = r.bEchoMulti ? 2 : 1; loadComboBox(qcbEcho, echo); } void AudioInputDialog::save() const { s.iQuality = qsQuality->value(); s.iNoiseSuppress = (qsNoise->value() == 14) ? 0 : - qsNoise->value(); s.bDenoise = qcbDenoise->isChecked(); s.iMinLoudness = 18000 - qsAmp->value() + 2000; s.iVoiceHold = qsTransmitHold->value(); s.fVADmin = static_cast(qsTransmitMin->value()) / 32767.0f; s.fVADmax = static_cast(qsTransmitMax->value()) / 32767.0f; s.vsVAD = qrbSNR->isChecked() ? Settings::SignalToNoise : Settings::Amplitude; s.iFramesPerPacket = qsFrames->value(); s.iFramesPerPacket = (s.iFramesPerPacket == 1) ? 1 : ((s.iFramesPerPacket-1) * 2); s.uiDoublePush = qsDoublePush->value() * 1000; s.pttHold = qsPTTHold->value(); s.atTransmit = static_cast(qcbTransmit->currentIndex()); // Idle auto actions s.iIdleTime = qsbIdle->value() * 60; s.iaeIdleAction = static_cast(qcbIdleAction->currentIndex()); s.bUndoIdleActionUponActivity = qcbUndoIdleAction->isChecked(); s.bShowPTTButtonWindow = qcbPushWindow->isChecked(); s.bTxAudioCue = qcbPushClick->isChecked(); s.qsTxAudioCueOn = qlePushClickPathOn->text(); s.qsTxAudioCueOff = qlePushClickPathOff->text(); s.qsAudioInput = qcbSystem->currentText(); s.bEcho = qcbEcho->currentIndex() > 0; s.bEchoMulti = qcbEcho->currentIndex() == 2; s.bExclusiveInput = qcbExclusive->isChecked(); if (AudioInputRegistrar::qmNew) { AudioInputRegistrar *air = AudioInputRegistrar::qmNew->value(qcbSystem->currentText()); int idx = qcbDevice->currentIndex(); if (idx > -1) { air->setDeviceChoice(qcbDevice->itemData(idx), s); } } } void AudioInputDialog::on_qsFrames_valueChanged(int v) { qlFrames->setText(tr("%1 ms").arg((v==1) ? 10 : (v-1)*20)); updateBitrate(); } void AudioInputDialog::on_qsDoublePush_valueChanged(int v) { if (v == 0) qlDoublePush->setText(tr("Off")); else qlDoublePush->setText(tr("%1 ms").arg(v)); } void AudioInputDialog::on_qsPTTHold_valueChanged(int v) { if (v == 0) qlPTTHold->setText(tr("Off")); else qlPTTHold->setText(tr("%1 ms").arg(v)); } void AudioInputDialog::on_qsTransmitHold_valueChanged(int v) { float val = static_cast(v * 10); val = val / 1000.0f; qlTransmitHold->setText(tr("%1 s").arg(val, 0, 'f', 2)); } void AudioInputDialog::on_qsQuality_valueChanged(int v) { qlQuality->setText(tr("%1 kb/s").arg(static_cast(v) / 1000.0f, 0, 'f', 1)); updateBitrate(); } void AudioInputDialog::on_qsNoise_valueChanged(int v) { QPalette pal; if (v < 15) { qlNoise->setText(tr("Off")); pal.setColor(qlNoise->foregroundRole(), Qt::red); } else { qlNoise->setText(tr("-%1 dB").arg(v)); } qlNoise->setPalette(pal); } void AudioInputDialog::on_qsAmp_valueChanged(int v) { v = 18000 - v + 2000; float d = 20000.0f/static_cast(v); qlAmp->setText(QString::fromLatin1("%1").arg(d, 0, 'f', 2)); } void AudioInputDialog::updateBitrate() { if (! qsQuality || ! qsFrames || ! qlBitrate) return; int q = qsQuality->value(); int p = qsFrames->value(); int audiorate, overhead, posrate; audiorate = q; // 50 packets, in bits, IP + UDP + Crypt + type + seq + frameheader overhead = 100 * 8 * (20 + 8 + 4 + 1 + 2 + p); // TCP is 12 more bytes than UDP if (NetworkConfig::TcpModeEnabled()) overhead += 100 * 8 * 12; if (g.s.bTransmitPosition) posrate = 12; else posrate = 0; posrate = posrate * 100 * 8; overhead = overhead / p; posrate = posrate / p; int total = audiorate + overhead + posrate; QPalette pal; if (g.uiSession && (total > g.iMaxBandwidth)) { pal.setColor(qlBitrate->foregroundRole(), Qt::red); } qlBitrate->setPalette(pal); QString v = tr("%1 kbit/s (Audio %2, Position %4, Overhead %3)") .arg(total / 1000.0, 0, 'f', 1) .arg(audiorate / 1000.0, 0, 'f', 1) .arg(overhead / 1000.0, 0, 'f', 1) .arg(posrate / 1000.0, 0, 'f', 1); qlBitrate->setText(v); qsQuality->setMinimum(8000); } void AudioInputDialog::on_qcbPushClick_clicked(bool b) { qpbPushClickBrowseOn->setEnabled(b); qpbPushClickBrowseOff->setEnabled(b); qpbPushClickPreview->setEnabled(b); qpbPushClickReset->setEnabled(b); qlePushClickPathOn->setEnabled(b); qlePushClickPathOff->setEnabled(b); qlPushClickOn->setEnabled(b); qlPushClickOff->setEnabled(b); } void AudioInputDialog::on_qpbPushClickBrowseOn_clicked() { QString defaultpath(qlePushClickPathOn->text()); QString qsnew = AudioOutputSample::browseForSndfile(defaultpath); if (!qsnew.isEmpty()) qlePushClickPathOn->setText(qsnew); } void AudioInputDialog::on_qpbPushClickBrowseOff_clicked() { QString defaultpath(qlePushClickPathOff->text()); QString qsnew = AudioOutputSample::browseForSndfile(defaultpath); if (!qsnew.isEmpty()) qlePushClickPathOff->setText(qsnew); } void AudioInputDialog::on_qpbPushClickPreview_clicked() { AudioOutputPtr ao = g.ao; if (ao) { AudioOutputSample *sample = ao->playSample(qlePushClickPathOn->text()); if (sample) connect(sample, SIGNAL(playbackFinished()), this, SLOT(continuePlayback())); else // If we fail to playback the first play on play at least off ao->playSample(qlePushClickPathOff->text()); } } void AudioInputDialog::continuePlayback() { AudioOutputPtr ao = g.ao; if (ao) { ao->playSample(qlePushClickPathOff->text()); } } void AudioInputDialog::on_qpbPushClickReset_clicked() { qlePushClickPathOn->setText(Settings::cqsDefaultPushClickOn); qlePushClickPathOff->setText(Settings::cqsDefaultPushClickOff); } void AudioInputDialog::on_qcbTransmit_currentIndexChanged(int v) { switch (v) { case 0: qswTransmit->setCurrentWidget(qwContinuous); break; case 1: qswTransmit->setCurrentWidget(qwVAD); break; case 2: qswTransmit->setCurrentWidget(qwPTT); break; } } void AudioInputDialog::on_qcbSystem_currentIndexChanged(int) { qcbDevice->clear(); QList ql; if (AudioInputRegistrar::qmNew) { AudioInputRegistrar *air = AudioInputRegistrar::qmNew->value(qcbSystem->currentText()); ql = air->getDeviceChoices(); int idx = 0; foreach(audioDevice d, ql) { qcbDevice->addItem(d.first, d.second); qcbDevice->setItemData(idx, Qt::escape(d.first), Qt::ToolTipRole); ++idx; } qcbEcho->setEnabled(air->canEcho(s.qsAudioOutput)); qcbExclusive->setEnabled(air->canExclusive()); } qcbDevice->setEnabled(ql.count() > 1); } void AudioInputDialog::on_Tick_timeout() { AudioInputPtr ai = g.ai; if (ai.get() == NULL || ! ai->sppPreprocess) return; abSpeech->iBelow = qsTransmitMin->value(); abSpeech->iAbove = qsTransmitMax->value(); if (qrbAmplitude->isChecked()) { abSpeech->iValue = iroundf((32767.f/96.0f) * (96.0f + ai->dPeakCleanMic) + 0.5f); } else { abSpeech->iValue = iroundf(ai->fSpeechProb * 32767.0f + 0.5f); } abSpeech->update(); } void AudioInputDialog::on_qcbIdleAction_currentIndexChanged(int v) { const Settings::IdleAction action = static_cast(v); const bool enabled = (action != Settings::Nothing); qlIdle->setEnabled(enabled); qlIdle2->setEnabled(enabled); qsbIdle->setEnabled(enabled); qcbUndoIdleAction->setEnabled(enabled); } AudioOutputDialog::AudioOutputDialog(Settings &st) : ConfigWidget(st) { setupUi(this); if (AudioOutputRegistrar::qmNew) { QList keys = AudioOutputRegistrar::qmNew->keys(); foreach(QString key, keys) { qcbSystem->addItem(key); } } qcbSystem->setEnabled(qcbSystem->count() > 1); qcbLoopback->addItem(tr("None"), Settings::None); qcbLoopback->addItem(tr("Local"), Settings::Local); qcbLoopback->addItem(tr("Server"), Settings::Server); qcbDevice->view()->setTextElideMode(Qt::ElideRight); } QString AudioOutputDialog::title() const { return tr("Audio Output"); } QIcon AudioOutputDialog::icon() const { return QIcon(QLatin1String("skin:config_audio_output.png")); } void AudioOutputDialog::load(const Settings &r) { int i; QList keys; if (AudioOutputRegistrar::qmNew) keys=AudioOutputRegistrar::qmNew->keys(); else keys.clear(); i=keys.indexOf(AudioOutputRegistrar::current); if (i >= 0) loadComboBox(qcbSystem, i); loadCheckBox(qcbExclusive, r.bExclusiveOutput); loadSlider(qsDelay, r.iOutputDelay); loadSlider(qsVolume, iroundf(r.fVolume * 100.0f + 0.5f)); loadSlider(qsOtherVolume, iroundf((1.0f - r.fOtherVolume) * 100.0f + 0.5f)); loadCheckBox(qcbAttenuateOthersOnTalk, r.bAttenuateOthersOnTalk); loadCheckBox(qcbAttenuateOthers, r.bAttenuateOthers); loadCheckBox(qcbAttenuateUsersOnPrioritySpeak, r.bAttenuateUsersOnPrioritySpeak); loadCheckBox(qcbOnlyAttenuateSameOutput, r.bOnlyAttenuateSameOutput); loadCheckBox(qcbAttenuateLoopbacks, r.bAttenuateLoopbacks); if (AudioOutputRegistrar::current == QLatin1String("PulseAudio")) { qgbAdvancedAttenuation->setVisible(true); } else { qgbAdvancedAttenuation->setVisible(false); } loadSlider(qsJitter, r.iJitterBufferSize); loadComboBox(qcbLoopback, r.lmLoopMode); loadSlider(qsPacketDelay, static_cast(r.dMaxPacketDelay)); loadSlider(qsPacketLoss, iroundf(r.dPacketLoss * 100.0f + 0.5f)); loadSlider(qsMinDistance, iroundf(r.fAudioMinDistance * 10.0f + 0.5f)); loadSlider(qsMaxDistance, iroundf(r.fAudioMaxDistance * 10.0f + 0.5f)); loadSlider(qsMaxDistVolume, iroundf(r.fAudioMaxDistVolume * 100.0f + 0.5f)); loadSlider(qsBloom, iroundf(r.fAudioBloom * 100.0f + 0.5f)); loadCheckBox(qcbHeadphones, r.bPositionalHeadphone); loadCheckBox(qcbPositional, r.bPositionalAudio); qsOtherVolume->setEnabled(r.bAttenuateOthersOnTalk || r.bAttenuateOthers); qlOtherVolume->setEnabled(r.bAttenuateOthersOnTalk || r.bAttenuateOthers); qcbAttenuateLoopbacks->setEnabled(r.bOnlyAttenuateSameOutput); } void AudioOutputDialog::save() const { s.iOutputDelay = qsDelay->value(); s.fVolume = static_cast(qsVolume->value()) / 100.0f; s.fOtherVolume = 1.0f - (static_cast(qsOtherVolume->value()) / 100.0f); s.bAttenuateOthersOnTalk = qcbAttenuateOthersOnTalk->isChecked(); s.bAttenuateOthers = qcbAttenuateOthers->isChecked(); s.bOnlyAttenuateSameOutput = qcbOnlyAttenuateSameOutput->isChecked(); s.bAttenuateLoopbacks = qcbAttenuateLoopbacks->isChecked(); s.bAttenuateUsersOnPrioritySpeak = qcbAttenuateUsersOnPrioritySpeak->isChecked(); s.iJitterBufferSize = qsJitter->value(); s.qsAudioOutput = qcbSystem->currentText(); s.lmLoopMode = static_cast(qcbLoopback->currentIndex()); s.dMaxPacketDelay = static_cast(qsPacketDelay->value()); s.dPacketLoss = static_cast(qsPacketLoss->value()) / 100.0f; s.fAudioMinDistance = static_cast(qsMinDistance->value()) / 10.0f; s.fAudioMaxDistance = static_cast(qsMaxDistance->value()) / 10.0f; s.fAudioMaxDistVolume = static_cast(qsMaxDistVolume->value()) / 100.0f; s.fAudioBloom = static_cast(qsBloom->value()) / 100.0f; s.bPositionalAudio = qcbPositional->isChecked(); s.bPositionalHeadphone = qcbHeadphones->isChecked(); s.bExclusiveOutput = qcbExclusive->isChecked(); if (AudioOutputRegistrar::qmNew) { AudioOutputRegistrar *aor = AudioOutputRegistrar::qmNew->value(qcbSystem->currentText()); int idx = qcbDevice->currentIndex(); if (idx > -1) { aor->setDeviceChoice(qcbDevice->itemData(idx), s); } } } void AudioOutputDialog::on_qcbSystem_currentIndexChanged(int) { qcbDevice->clear(); QList ql; if (AudioOutputRegistrar::qmNew) { AudioOutputRegistrar *aor = AudioOutputRegistrar::qmNew->value(qcbSystem->currentText()); ql = aor->getDeviceChoices(); int idx = 0; foreach(audioDevice d, ql) { qcbDevice->addItem(d.first, d.second); qcbDevice->setItemData(idx, Qt::escape(d.first), Qt::ToolTipRole); ++idx; } bool canmute = aor->canMuteOthers(); qsOtherVolume->setEnabled(canmute); qcbAttenuateOthersOnTalk->setEnabled(canmute); if (aor->name == QLatin1String("PulseAudio")) { qgbAdvancedAttenuation->setVisible(true); } else { qgbAdvancedAttenuation->setVisible(false); } qcbAttenuateOthers->setEnabled(canmute); qlOtherVolume->setEnabled(canmute); bool usesdelay = aor->usesOutputDelay(); qsDelay->setEnabled(usesdelay); qlDelay->setEnabled(usesdelay); qcbExclusive->setEnabled(aor->canExclusive()); } qcbDevice->setEnabled(ql.count() > 1); } void AudioOutputDialog::on_qsJitter_valueChanged(int v) { qlJitter->setText(tr("%1 ms").arg(v*10)); } void AudioOutputDialog::on_qsVolume_valueChanged(int v) { QPalette pal; if (v > 100) { pal.setColor(qlVolume->foregroundRole(), Qt::red); } qlVolume->setPalette(pal); qlVolume->setText(tr("%1 %").arg(v)); } void AudioOutputDialog::on_qsOtherVolume_valueChanged(int v) { qlOtherVolume->setText(tr("%1 %").arg(v)); } void AudioOutputDialog::on_qsPacketDelay_valueChanged(int v) { qlPacketDelay->setText(tr("%1 ms").arg(v)); } void AudioOutputDialog::on_qsPacketLoss_valueChanged(int v) { qlPacketLoss->setText(tr("%1 %").arg(v)); } void AudioOutputDialog::on_qsDelay_valueChanged(int v) { qlDelay->setText(tr("%1 ms").arg(v*10)); } void AudioOutputDialog::on_qcbLoopback_currentIndexChanged(int v) { bool ena = false; if (v == 1) ena = true; qsPacketDelay->setEnabled(ena); qlPacketDelay->setEnabled(ena); qsPacketLoss->setEnabled(ena); qlPacketLoss->setEnabled(ena); } void AudioOutputDialog::on_qsMinDistance_valueChanged(int v) { qlMinDistance->setText(tr("%1 m").arg(v/10.0, 0, 'f', 1)); if (qsMaxDistance->value() < v) qsMaxDistance->setValue(v); } void AudioOutputDialog::on_qsMaxDistance_valueChanged(int v) { qlMaxDistance->setText(tr("%1 m").arg(v/10.0, 0, 'f', 1)); if (qsMinDistance->value() > v) qsMinDistance->setValue(v); } void AudioOutputDialog::on_qsMaxDistVolume_valueChanged(int v) { qlMaxDistVolume->setText(tr("%1 %").arg(v)); } void AudioOutputDialog::on_qsBloom_valueChanged(int v) { qlBloom->setText(tr("%1 %").arg(v+100)); } void AudioOutputDialog::on_qcbPositional_stateChanged(int v) { qgbVolume->setEnabled(v); } void AudioOutputDialog::on_qcbAttenuateOthersOnTalk_clicked(bool checked) { bool b = qcbAttenuateOthers->isChecked() || checked; qsOtherVolume->setEnabled(b); qlOtherVolume->setEnabled(b); qgbAdvancedAttenuation->setEnabled(b); } void AudioOutputDialog::on_qcbAttenuateOthers_clicked(bool checked) { bool b = qcbAttenuateOthersOnTalk->isChecked() || checked; qsOtherVolume->setEnabled(b); qlOtherVolume->setEnabled(b); qgbAdvancedAttenuation->setEnabled(b); } void AudioOutputDialog::on_qcbOnlyAttenuateSameOutput_clicked(bool checked) { qcbAttenuateLoopbacks->setEnabled(checked); } mumble-1.3.4/src/mumble/mumble_ru.ts0000664000175000017500000156226614010707274017273 0ustar builderbuilder ACLEditor Deny Запретить Allow Разрешить Allow %1 Разрешить %1 Deny %1 Запретить %1 Mumble - Add channel Mumble - Добавить канал Default server value Значение сервера по умолчанию Failed: Invalid channel Ошибка: Неверный канал Mumble - Edit %1 Mumble - Изменить %1 ID: %1 ID: %1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Устанавливает привилегию на %1. Если привилегия позволяет и запрещает, то она запрещает.<br />%2 Channel must have a name У канала должно быть имя This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Отбирает привилегию на %1. Если привилегия позволяет и запрещает, то она запрещает.<br />%2 Dialog Диалог Name Имя Enter the channel name here. Введите название канала. Description Описание Password Пароль Enter the channel password here. Введите пароль для канала. Check to create a temporary channel. Отметьте, чтобы создать временный канал. Temporary Временный <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Позиция</b><br/> Это значение позволяет изменять порядок следования каналов в списке каналов. Канал с более высоким значением <i>Позиции</i> всегда будет находится под каналом с более низким значением, и наоборот. Если <i>Позиции</i> у каналов равны, то они будут сортироваться в алфавитном порядке. Position Позиция &Groups &Группы Group Группа List of groups Список групп Remove selected group Удалить выбранную группу Remove Удалить Inherit group members from parent Унаследовать членов группы от Inherit Наследовать Make group inheritable to sub-channels Сделать группу наследуемой для подканалов Inheritable Наследуемый Group was inherited from parent channel Группа была унаследована от родительского канала Inherited Унаследованный Members Члены Add Добавить Add member to group Добавить члена группы Remove member from group Удалить члена группы &ACL С&писки управления доступом (СУД) Active ACLs Активные СУД List of entries Перечень СУД Inherit ACL of parent? Унаследовать СУД родителя? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. Наследовать, или нет, СУД от каналов-родителей для этого объекта. Унаследованы будут только СУД, помеченные у предков как "Применить к подканалам". Inherit ACLs Наследовать СУД Move entry up Сдвинуть выше This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. Переместить СУД вверх по списку. Так как СУД применяются сверху вниз, это может изменить эффективные привилегии пользователей. Вы не сможете переместить СУД выше унаследованного, если вы действительно хотите его переместить, вам придется продублировать унаследованный СУД. &Up &Вверх Move entry down Сдвинуть ниже This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. Переместить СУД вниз по списку. Так как СУД применяются сверху вниз, это может изменить эффективные привилегии пользователей. &Down Вн&из Add new entry Добавить новый СУД This adds a new entry, initially set with no permissions and applying to all. Добавить новый СУД, по умолчанию без прав доступа, и применяемый ко всем пользователям. &Add &Добавить Remove entry Удалить СУД This removes the currently selected entry. Удалить выделенный СУД. &Remove &Удалить Context Контекст Entry should apply to this channel. Entry should apply to this channel Применять к каналу. This makes the entry apply to this channel. Применяет СУД к этому каналу. Applies to this channel Применить к этому каналу Entry should apply to sub-channels. Применять к подканалам. Add new group Добавить новую группу <b>Add</b><br/> Add a new group. <b>Добавить</b><br/> Добавить новую группу. Inherited members Унаследованные пользователи Contains the list of members added to the group by this channel. Содержит список пользователей, добавленных в группу этим каналом. Contains a list of members whose group membership will not be inherited from the parent channel. Содержит список пользователей, чье членство в группе не будет унаследовано из родительского канала. Contains the list of members inherited by other channels. Содержит список пользователей, наследуемых другими каналами. Type in the name of a user you wish to add to the group and click Add. Введите имя пользователя, которого Вы хотите добавить в группу и нажмите Добавить. Type in the name of a user you wish to remove from the group and click Add. Введите имя пользователя, которого Вы хотите исключить из группы и нажмите Добавить. Exclude Исключить Excluded members Исключенные пользователи This makes the entry apply to sub-channels of this channel. Применить ACL ко всем подканалам этого канала. Applies to sub-channels Относится к подканалам Permissions Права доступа User/Group Пользователь/Группа Group this entry applies to Группа, к которой будет применяться эта запись User ID Идентификатор пользователя User this entry applies to Запись относится к пользователю This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. Управляет, к какому пользователю применить данную запись. Введите имя пользователя и нажмите Enter, чтобы послать запрос на сервер. &Properties С&войства <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>Название</b><br />Введите название канала в это поле. Оно должно соответствовать требованиям сервера, к которому Вы подключены. <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>Временный</b><br />Если отмечено - созданный канал будет временным. Это означает, что когда все пользователи покинут этот канал, он будет автоматически удален сервером. <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>Группа</b><br />В этом списке все группы, которые определены для данного канала. Чтобы создать новую группу, введите ее название и нажмите Ввод. <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>Удалить</b><br />Удалить выбранную группу. Если группа наследуется, то она не может быть удалена из списка, но локальная информация о группе будет очищена. <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>Наследовать</b><br />Наследует всех пользователей в группах от родителя, если группа обозначена как <i>Наследуемая</i> в родительском канале. <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>Наследуемая</b><br />Делает группу наследуемой для подканалов. Если группа не наследуемая, то в подканалах может быть создана новая группа с таким же названием. <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>Унаследованая</b><br />Обозначает, что группа была унаследована от родительского канала. Вы не можете отредактировать это значение. Оно только для информации. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>Пользователи</b><br />Список содержит всех пользователей, которые были добавлены в группу для данного канала. Имейте ввиду, что он не содержит пользователей, унаследованных от родительских каналов. Список таких пользователей можно найти в <i>Унаследованных пользователях</i>. Чтобы этот список не был унаследован дочерними каналами, снимите отметку с <i>Наследуемая</i> или вручную добавьте пользователей в список <i>Исключенные пользователи</i>. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>Исключенные пользователи</b><br />Содержит список пользователей, чье членство в группе не будет унаследовано от родительского канала. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. <b>Унаследованные пользователи</b><br />Содержит список пользователей, унаследованных данным каналом. Снимите отметку с <i>Наследовать</i>, чтобы запретить наследование от родительских каналов. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. Здесь можно задать группы пользователей, у которых будет доступ к этому каналу.<br />Обратите внимание, что группа вычисляется в контексте канала, в котором находится этот канал. Например, стандартный СУД (список управления доступом) для канала Root даёт право <i>Записи</i> для группы <i>admin</i>. Если права этого канала (1) будут унаследованы каким-либо другим каналом (2), то пользователь, принадлежащий к группе <i>admin</i> в канале 1, будет иметь разрешение на запись, даже если он не принадлежит к группе <i>admin</i> в канале 2, который наследует СУД от канала 1.<br />Если название группы начинается с '!', эта группа используется как отрицание, а если с '~',то права группы вычисляются в соответствии с каналом 1, вместо канала 2.<br />Если имя группы начинается с '#', то оно интерпретируется как токен доступа. То что идет после '#' в имени группы, должно быть введено в список токенов доступа пользователем, чтобы он мог войти. Это может быть использовано для очень простого доступа с паролем к каналу для неавторизированных пользователей.<br />Если имя группы начинается с '$', доступ будут иметь только пользователи, чей хэш сертификата соответствует тому, что следует в имени группы после '$'.<br />Несколько предустановленных групп:<br /><b>all</b> - Соответствует абсолютно всем пользователям.<br /><b>auth</b> - Соответствует только авторизированным пользователям.<br /><b>sub,a,b,c</b> - Соответствует пользователям, которые находятся в подканале не выше <i>a</i>, и между <i>b</i> и <i>c</i> вниз по цепочке. Более подробная документация на вебсайте программы.<br /><b>in</b> - Соответствует всем пользователям данного канала (для удобства, вместо '<i>sub,0,0,0</i>').<br /><b>out</b> - Соответствует пользователям, которых нет в данном канале (для удобства, вместо '<i>!sub,0,0,0</i>').<br />Одна запись соответствует или польвателю или группе, но не обоим. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. <b>Пароль</b><br />Данное поле позволяет Вам с легкостью установить или изменить пароль на канал. Оно использует токены доступа Mumble в фоне. Используйте СУД и группы, для более тонкого и мощного контроля доступа. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. Список всех групп для этого канала. Группы, унаследованные из родительских каналов, обозначены курсивом.<br />СУД читаются сверху вниз, то есть нижние записи имеют более высокий приоритет. ID of the channel. ID канала. Maximum Users Макс. пользователей Maximum number of users allowed in the channel Максимальное количество пользователей разрешенное на канале <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. <b>Макс. пользователей</b><br />это значение дает возможность установить максимальное количество пользователей на канале. Если значение больше нуля, то этому количеству пользователей разрешено войти на канал. Если значение равно нулю, то максимальное количество пользователей устанавливается настройками сервера. This is the sort order for the channel. Это порядок сортировки для канала. ALSAAudioInput Default ALSA Card Звуковая карта ALSA по умолчанию Opening chosen ALSA Input failed: %1 Ошибка открытия ввода ALSA: %1 ALSAAudioOutput Default ALSA Card Звуковая карта ALSA по умолчанию Opening chosen ALSA Output failed: %1 Ошибка открытия вывода ALSA: %1 ASIOConfig %1 (version %2) %1 (версия %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz %1 -> %2 буфер сэмплов, с %3 разрешением сэмплов (%4 предпочитаемый) на %5 Гц ASIO Initialization failed: %1 Ошибка инициализации ASIO: %1 Failed to instantiate ASIO driver Невозможно установить драйвер ASIO ASIO ASIO Device selection Выбор устройства Device Устройство Device to use for microphone Устройство для подключения микрофона This chooses what device to query. You still need to actually query the device and select which channels to use. Выбирает, какое устройство опрашивать. Вам все еще надо опросить устройство и выбрать канал, который будете использовать. Query selected device Опросить выбранное устройство This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. Опрашивает выбранное устройство поканально. Опасайтесь того, что многие драйвера ASIO не доделаны, и опрос их может вызвать "зависание" приложения или всей системы. &Query &Запрос Configure selected device Настроить выбранное устройство This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. Настраивает выбранное устройство. Опасайтесь того, что многие драйвера ASIO не доделаны, и опрос их может вызвать "зависание" приложения или всей системы. &Configure &Настройки Capabilities Возможности Driver name Имя драйвера Buffer size Размер буфера This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. Здесь можно настроить входящие каналы для ASIO. Убедитесь, что выбран хотя бы один канал как микрофон и динамик. <i>Микрофон</i> должен быть тот, к которому подключен Ваш микрофон, и <i>Динамиком</i> должен быть канал, который воспроизводит звук '<i>Который вы слышите</i>'.<br />Например, на Audigy 2 ZS, правильным выбором Микрофона был бы '<i>Mic L</i>', а Динамик был бы '<i>Mix L</i>' и '<i>Mix R</i>'. Configure input channels Настроить каналы ввода Channels Каналы Microphone Микрофон <- <- -> -> Unused Не используется Speakers Динамики ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. Вам нужно выбрать хотя бы одно устройство для микрофона и одно для динамика для использования ASIO. Если вам нужно только протестировать микрофон, используйте DirectSound. Opening selected ASIO device failed. No input will be done. Невозможно открыть устройство ASIO. Входные данные не получены. AboutDialog About Mumble О Mumble <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> <h3>Mumble (%1)</h3><p>%3</p><p><b>Голосовая связь для игроков</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble &О Mumble &License Л&ицензия A&uthors &Third-Party Licenses OK ОК AudioInput Interface Интерфейс System Система Input method for audio Метод ввода для звука <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Данное устройство используется для ввода звука.</b><br />Обычно используется DirectSound. Device Устройство Input device for audio Устройство ввода для звука <b>This is the input device to use for audio.</b> <b>Данное устройство используется для ввода звука.</b> Transmission Передача звука &Transmit &Способ передачи When to transmit your speech Когда передавать Вашу речь <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. <b>Устанавливает условие передачи речи.</b><br /><i>Постоянно</i> - Все время<br /><i>Активация по голосу</i> - Когда Вы говорите.<br /><i>Активация по кнопке</i> - Когда Вы зажимаете горячую клавишу, установленную в <i>Ярлыках</i>. DoublePush Time Задержка между нажатиями If you press the PTT key twice in this time it will get locked. Если Вы нажмёте кнопку передачи речи два раза за установленное время, то включится функция залипания. <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. <b>Задержка между нажатиями</b><br />Если Вы нажмёте кнопку передачи речи два раза за установленный интервал времени, включится залипание. Mumble будет продолжать передавать звук от микрофона, пока Вы не нажмёте эту кнопку ещё раз. Reset audio cue to default Вернуться к настройкам звуков по умолчанию <b>Reset</b><br/>Reset the paths for the files to their default. <b>Сбросить</b><br/>Вернуть значения путей файлов по умолчанию. Browse for on audio file Открыть аудиофайл, который будет проигрываться в начале передачи речи Browse for off audio file Открыть аудиофайл, который будет проигрываться в конце передачи речи Off Выкл On Вкл Preview the audio cues Проиграть звуки Use SNR based speech detection Определение голосовой активности на основе соотношения сигнал/шум Signal to Noise Сигнал/Шум <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. <b>Использовать алгоритм обнаружения речи, основанный на амплитуде.</b><br />В этом режиме для обнаружения речи используется громкость входящего сигнала. Amplitude Амплитуда Voice &Hold &Удержание голоса How long to keep transmitting after silence Как долго продолжать передавать речь после наступления тишины Silence Below Уровень тишины <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. <b>Устанавливает значения для срабатывания обнаружения голоса.</b><br />Используйте вместе с окном Аудиостатистики, чтобы отрегулировать эти значения вручную. Значения левее "Уровень тишины" всегда будут считаться тишиной. Значения правее "Уровень речи" всегда будет считаться голосом. Значения между будут считаться голосом если вы уже говорите, но это не будет считаться новым срабатыванием. Speech Above Уровень речи Signal values above this count as voice Сигнал громче этого уровня будет распознан как речь Compression Сжатие &Quality &Качество Quality of compression (peak bandwidth) Качество сжатия (максимальная пропускная способность, необходимая для передачи) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. <b>Устанавливает качество сжатия.</b><br />Определяет максимальную пропускную способность канала для передачи исходящего звука. Audio per packet Звука на пакет How many audio frames to send per packet Как много звуковых фрагментов посылать в пакете <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>Указывает сколько аудиофрагментов помещать в пакет.</b><br />Увеличение этого параметра увеличит задержку голоса, но также уменьшит требования к пропускной способности вашего соединения. <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). <b>Показывает пиковое использование пропускной способности исходящего канала.</b><br />Показывает пиковое значение используемой пропускной способности при отправке данных от вашего компьютера. Битрейт аудио - максимальный битрейт (принятое сокращение - VBR) только для аудиоданных. Позиция - битрейт, используемый для информации о позиции. Служебные данные содержат раскадровку и заголовки IP пакетов (IP и UDP составляют 75% этих служебных данных). Audio Processing Обработка звука Noise Suppression Подавление шума Noise suppression Подавление шума <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. <b>Устанавливает коэффициент подавления шума.</b><br />Чем выше это значение, тем более агрессивно будет подавлен шум. Maximum amplification of input sound Максимальное усиление исходящего звука <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. <b>Максимальное усиление исходящего сигнала.</b><br />Mumble нормализует исходящую громкость до сжатия и эта опция устанавливает на сколько можно его усилить.<br />Актуальный уровень постоянно обновляется на основе текущего образца речи, но никогда не будет выше установленного здесь уровня.<br />Если уровень <i>Громкости микрофона</i> аудиостатистики держится на уровне 100%, Вы можете установить его на 2.0 или выше, но если, как многие люди, Вы не можете достичь 100%, установите его на чуть более высоком уровне.<br />В идеале, установите его так, чтобы <i>Громкость микрофона * Фактор усиления >= 100</i>, даже если Вы говорите слишком мягко.<br /><br />Заметьте, что ничего плохого не случится, если Вы установите его на максимум, но Mumble начнет передавать другие переговоры, если Вы оставите это значение по умолчанию. Current speech detection chance Шанс определения речи Cancel echo from speakers Подавлять эхо от динамиков Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. После включения этой опции эхо от динамиков будет подавляться. Смешанный режим использует мало ЦП, но работает только если Ваши динамики включены на достаточную громкость и равноудалены от микрофона. Мультиканальный режим подавления эха работает эффективнее, но потребляет больше ЦП. Disabled Выключено <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>Включает режим обнаружения речи с помощью соотношения сигнал/шум.</b><br />В этом режиме анализируется входящий сигнал на наличие чистого сигнала, чёткость которого может быть распознана как речь. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>Показывает текущие настройки определения речи.</b><br />Вы можете изменить эти настройки в Настройках или в Мастере настройки звука. Signal values below this count as silence Сигнал ниже этого значения считается тишиной Maximum bandwidth used for sending audio Максимально используемая ширина канала для передачи звука Use Amplitude based speech detection Использовать обнаружение речи, основанное на амплитуде <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). <b>Как долго после паузы в речи продолжать передачу.</b><br />Увеличьте это значение, если у Вас много пауз в речи (можно увидеть по часто мигающей иконке голоса рядом с вашим именем). Exclusive mode Эксклюзивный режим <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>Использует устройство в Эксклюзивном режиме.</b><br />Другие приложения не смогут использовать устройство. Exclusive Эксклюзивно R&eset С&бросить &Browse... &Обзор... B&rowse... Об&зор... &Preview Про&играть <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. <b>Проиграть</b><br/>Проигрывает один за другим текущие звуки, которые звучат в <i>начале</i> и после <i>окончания</i> передачи речи. Displays an always on top window with a push to talk button in it Всегда отображать на переднем плане окно с кнопкой передачи речи Display push to talk window Отображать окно передачи речи по кнопке Misc Разное Audible audio cue when starting or stopping to transmit Звуковой сигнал при передаче речи <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. <b>Включить звуковое сопровождение кнопки передачи речи.</b><br />Эта опция включит проигрывание короткого звука, когда Вы нажимаете и отпускаете кнопку для передачи речи. Audio cue Звук PTT Gets played when starting to transmit Звучит перед началом передачи речи Gets played when stopping to transmit Звучит после окончания передачи речи Hold Time Время задержки Time the microphone stays open after the PTT key is released Время, которое микрофон остается включенным после того, как кнопка передачи речи будет отпущена Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) Максимальная пропускная способность сервера %1 кбит/с. Качество передачи речи установлено на %2 кбит/с (%3 мс) Max. Amplification Макс. усиление Idle action Простой minutes do минут сделать nothing ничего deafen заглушить mute выключить микрофон after после Echo Cancellation Подавление эха Mixed echo cancellation Смешанное подавление эха Multichannel echo cancellation Многоканальное подавление эха The idle action will be reversed upon any key or mouse button input Undo Idle action upon activity Apply RNNoise's noise suppression filter. <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. RNNoise Audio input AudioInputDialog Continuous Постоянно Voice Activity Активация по голосу Push To Talk Активация по кнопке Audio Input Исходящий звук %1 ms %1 мс Off Выкл %1 s %1 с %1 kb/s %1 кб/с -%1 dB -%1 дБ %1 kbit/s (Audio %2, Position %4, Overhead %3) %1 кбит/с (Аудио %2, Позиция %4, Загрузка %3) AudioOutput Interface Интерфейс System Система Output method for audio Метод вывода для звука <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Данный метод используется для вывода звука.</b><br />Обычно используется DirectSound. Device Устройство Output device for audio Устройство вывода для звука <b>This is the output device to use for audio.</b> <b>Это устройство вывода для использования звука</b> Positional Audio Позиционирование звука Audio Output Входящий звук Default &Jitter Buffer Стандартный &буфер Safety margin for jitter buffer Безопасный размер буфера <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. <b>Здесь устанавливается минимальный безопасный размер аудио буфера.</b><br />Весь входящий звук сначала буферизируется и аудио буфер продолжает выкладывать данные в буфер до минимального количества, которое может выдержать Ваша сеть, чтобы задержка была минимальной. Это устанавливает минимальный размер буфера для использования. Если речь, которую Вы слышите, будет трещать и прерываться, увеличьте это значение. Minimum distance to user before sound volume decreases Минимальное расстояние до пользователя, после которого громкость уменьшится This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. Это минимальная дистанция для рассчета громкости звука. Громкость речи других пользователей не уменьшится, до тех пор, пока они ближе, чем это значение от Вас. This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. Это максимальная дистанция для рассчета громкости звука. Когда другие пользователи находятся дальше этого расстояния от Вас, громкость больше не будет уменьшаться. <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. <b>Здесь включается один из тестов обратной связи.</b><br /><i>Нет</i> - Обратная связь отлючена<br /><i>Локально</i> - Эмуляция локального сервера.<br /><i>Серверно</i> - Запрос обратной связи с сервера.<br />Когда включен тест Обратной связи, другие пользователи не смогут слышать Вас. Эта опция не сохраняется при выходе из приложения. Volume Громкость Volume of incoming speech Громкость входящей речи <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. <b>Здесь настраивается громкость входящей речи.</b><br />Если увеличить более 100%, звук может быть искажен. Output Delay Задержка вывода Amount of data to buffer Количество данных для буфера The connected "speakers" are actually headphones The connected "speakers" are actually headphones. Подключенные "динамики" являются наушниками Factor for sound volume decrease Коэффициент уменьшения громкости звука Bloom Пик Factor for sound volume increase Коэффициент усиления громкости звука How much should sound volume increase for sources that are really close? Какое должно быть увеличение громкости при максимальной близости от игрока? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. Отметьте здесь, если у Вас не подключены колонки, только наушники. Это важно, т.к. колонки обычно используются спереди от Вас, в то время как наушники только слева и справа от Вас. This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Устанавливает размер данных для буферизации в буфере вывода. Экспериментируйте с различными значениями и сделайте его минимальным, чтобы не возникало прерываний звука. Headphones Наушники Minimum Distance Мин. дистанция Maximum Distance Макс. дистанция Maximum distance, beyond which speech volume won't decrease Максимальная дистанция, после которой громкость не будет уменьшаться Minimum Volume Мин. громкость What should the volume be at the maximum distance? Какая должна быть громкость на максимальной дистанции? Loopback Test Тест обратной связи Delay Variance Разброс задержки Variance in packet latency Разброс задержки пакетов <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>Здесь устанавливается разброс задержки передачи пакетов для теста обратной связи.</b><br />Большинство аудио потоков имеют некоторый разброс в величине задержки. Здесь можно установить разброс задержки для теста обратной связи. Например, если вы установите разброс 15мс, это будет эмулировать сеть с 20-35мс пингом, или с задержками 80-95мс. Большинство домашних сетей имеют разброс около 5мс. Packet Loss Потеря пакетов Packet loss for loopback mode Потеря пакетов для теста обратной связи <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% <b>Здесь устанавливается потеря пакетов для теста обратной связи.</b><br />Это соотношение потерянных пактов. Если у Вас все в порядке с соединением, то это будет 0% &Loopback &Обратная связь Desired loopback mode Желаемый режим обратной связи Attenuate applications by... Приглушать приложения на... Attenuation of other applications during speech Приглушение других приложений во время разговора <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. <b>Приглушение других приложений во время разговора</b><br />Mumble поддерживает уменьшение громкости других приложений во время входящей и/или исходящей речи. Здесь устанавливается приглушение других приложений, если данная функция включена. If checked Mumble lowers the volume of other applications while other users talk Если отмечено, то Mumble уменьшит громкость других приложений, когда другие пользователи говорят <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. <b>Приглушать другие приложения, когда другие пользователи говорят</b><br />Mumble поддерживает уменьшение громкости других приложений во время входящей и/или исходящей речи. Этот флажок активирует данную функцию, когда другие пользователи говорят с Вами. while other users talk когда другие пользователи говорят If checked Mumble lowers the volume of other applications while you talk Если отмечено, то Mumble уменьшит громкость других приложений, когда Вы говорите <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. <b>Приглушать приложения, когда Вы говорите</b><br />Mumble поддерживает уменьшение громкости других приложений во время входящей и/или исходящей речи. Этот флажок активирует функцию приглушения, когда говорите Вы. while you talk когда Вы говорите Exclusive mode, not recommended. Эксклюзивный режим, не рекомендуется. <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>Использует устройство в Эксклюзивном режиме.</b><br />Другие приложения не смогут использовать устройство. Exclusive Эксклюзивно Priority Speaker Приоритет речи If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. Если включён, то Mumble уменьшает громкость других пользователей при активации голоса и наличии приоритета. <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. <b>Приглушить других пользователей при активации голоса и наличии приоритета.</b><br />Mumble поддерживает уменьшение громкости других пользователей при активации голоса и наличии приоритета чтобы они не мешали Вам говорить. Attenuate other users while talking as Priority Speaker. Приглушить других пользователей при активации голоса и наличии приоритета. Advanced Attenuation Options If checked, Mumble will only attenuate applications that are using the same output source as Mumble <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. Only attenuate applications using the same output device If checked, PulseAudio loopback modules will be attenuated <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. Attenuate PulseAudio loopback modules Audio output AudioOutputDialog None Нет Local Локально Server Сервер Audio Output Входящий звук %1 ms %1 мс %1 % %1 % %1 m %1 м AudioOutputSample Choose sound file Выберите звуковой файл Invalid sound file Неверный звуковой файл The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. Файл '%1' не может быть использован в Mumble. Выберите файл совместимого формата и кодирования. AudioStats >1000 ms >1000ms >1000 мс Audio Statistics Аудио статистика Input Levels Входящие уровни Peak microphone level Пиковый уровень микрофона Peak power in last frame Пиковая мощность в последнем фрагменте This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. Показывает пиковую мощность последнего фрагмента (20 мс), и является тем же параметром, который Вы обычно видите как "входящая мощность". Проигнорируйте этот параметр в пользу <b>Мощности микрофона</b>, который является более корректным. Peak speaker level Пиковый уровень динамика This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. Показывает пиковую мощность в последнем фрагменте (20 мс) динамиков. Пока Вы используете мультиканальный метод проб (такой как ASIO),настроенный на каналы динамика, она будет равна 0. Если у Вас они так сконфигурированы, все еще будет отображаться 0, пока Вы будете прослушивать звук из других программ, Ваши настройки не будут работать. Peak clean level Пиковый уровень очистки This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. Показывает пиковую мощность в последнем фрейме (20 мс) после всей обработки. В идеале здесь должно быть -96 дБ, когда Вы не говорите. В реальной жизни, в студии будет около -60 дБ, но Вы увидите в лучшем случае -20 дБ. Когда Вы говорите этот показатель будет увеличиваться в районе от -5 до -10 дБ.<br />Если Вы используете подавление эхо, и это значение повышается более -15 дБ, когда Вы не говорите - Ваши настройки не работают и Вы будете раздражать других пользователей эхом. Signal Analysis Анализ сигнала Microphone power Мощность микрофона How close the current input level is to ideal Как близок текущий входящий уровень к идеалу This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. Показывает насколько близок Ваш текущий уровень входящей громкости к идеалу. Чтобы настроить громкость микрофона, откройте любую программу настройки громкости, и настройте громкость записи, затем посмотрите это значение во время разговора. <br /><b>Говорите громко, как будто расстроены или раздражены действиями нуба.</b><br />Настраивайте громкость, до тех пор, пока число не будет близко к 100%, но убедитесь, что оно не поднимется выше. Если оно будет выше, скорее всего будут прерывания Вашей речи, что ухудшит качество звука. Signal-To-Noise ratio Соотношение Сигнал/Шум Signal-To-Noise ratio from the microphone Соотношение Сигнал/Шум от микрофона This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. Отношение Сигнал/Шум (SNR) микрофона в последнем фрагменте (20 мс). Показывает, насколько чист голос по сравнению с шумом.<br />Если значение ниже 1.0, в сигнале больше шума, нежели голоса, и поэтому ухудшается качество.<br />Верхнего предела не существует, но не ожидайте увидеть выше 40-50, если Вы не в студии звукозаписи. Speech Probability Вероятность речи Probability of speech Вероятность речи This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). Вероятность того, что последний фрагмент (20 мс) был речью, а не шумом.<br />Передача голосовой активности зависит от верности этого. Фишка в том, что середина предложения всегда распознается как речь; проблема в паузах между словами и началом разговора. Трудно отделить кашель от слова, начинающегося на 'х'.<br />Если это выделено жирным шрифтом, значит Mumble сейчас передает (если Вы подключены). Configuration feedback Текущие настройки Current audio bitrate Текущий битрейт звука Bitrate of last frame Битрейт последнего фрагмента DoublePush interval Скорость двойного нажатия Time between last two Push-To-Talk presses Время между последними двумя нажатиями Кнопки активации речи Speech Detection Определение речи Current speech detection chance Шанс определения речи <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>Показывает текущие настройки определения речи.</b><br />Вы можете изменить эти настройки в Настройках или в Мастере настройки звука. Signal and noise power spectrum Спектр мощности сигнала и шума Power spectrum of input signal and noise estimate Мощностной спектр входящего сигнала и оценка шума This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. Показывает мощностной спектр текущего входящего сигнала (красная линия) и текущая оценка шума (заполнена синим).<br />Все амплитуды умножены на 30, чтобы показать интересные части (на сколько больше сигнала, чем шума представлено в каждом отрезке).<br />Это только если Вы интересуетесь точными условиями шума вашего микрофона. При хороших условиях, это будет всего лишь крошечным синим отрезком внизу. Если синего на графике более половины, у Вас серьезные проблемы с шумом окружающей среды. Echo Analysis Анализ Эха Weights of the echo canceller Значение подавления эха This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. Отображает значение подавления эха, со временем растущего вниз и увеличивающим частоту вправо.<br />В идеале, все должно быть черным, отображая, что эха нет. В общем, у Вас будет 1 или несколько горизонтальных полосок синеватого цвета, отображающих время задержки эха. Вы должны видеть значения в реальном времени.<br />Заметьте, что если у Вас нет эхо, которое нужно подавить, Вы не увидите здесь полезной информации. Запустите музыку, и все должно нормализоваться. <br />Вы можете выбрать просмотр реальных или воображаемых частей доменно-частотных значений, или наоборот высчитанные модуль и фазу. Наиболее применимым из них будут, скорее всего модуль, который является амплитудой эха, и показывает, сколько сигнала было вырезано за промежуток времени. Другие режимы просмотра более полезны для людей, желающих настроить алгоритмы глушения эха.<br />Внимание: если картина в целом обширно варьируется в режиме модулей, подавление эха не может найти соответствия между двумя входными источниками (динамиками и микрофоном). Или у Вас очень долгая задержка эха, или один из входящих источников настроен неправильно. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. Аудио битрейт последнего сжатого фрагмента (20 мс), который будет меняться, как VBR (Variable Bit Rate - переменная скорость передачи). Пиковый битрейт может быть отрегулирован в Настройках. AudioWizard Audio Tuning Wizard Мастер настройки звука Introduction Вступление Welcome to the Mumble Audio Wizard Добро пожаловать в мастер настройки звука Mumble Finished Закончить Enjoy using Mumble Наслаждайтесь использованием Mumble Device selection Выбор устройства Selecting the input and output device to use with Mumble. Выберите устройство ввода и вывода звука, используемого в Mumble. This is the device your microphone is connected to. Устройство куда подключен Ваш микрофон. System Система Input method for audio Метод ввода для звука <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Данное устройство используется для ввода звука.</b><br />Обычно используется DirectSound. Device Устройство Input device to use Используемое устройство ввода <b>Selects which sound card to use for audio input.</b> <b>Здесь можно выбрать звуковую карту для ввода звука.</b> Cancel echo from headset or speakers Подавлять эхо от наушников или колонок Use echo cancellation Использовать подавление Эха This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. Включает подавление эхо исходящего звука от колонок или наушников. This is the device your speakers or headphones are connected to. Устройство куда подключены Ваши колонки или наушники. Output method for audio Метод вывода для звука <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Данный метод используется для вывода звука.</b><br />Скорее всего вы захотите использовать DirectSound. Output device to use Устройство вывода звука <b>Selects which sound card to use for audio Output.</b> <b>Здесь можно выбрать звуковую карту для вывода звука.</b> Enable positional audio Включить позиционирование звука Allows positioning of sound Allows positioning of sound. Позволяет позиционировать звук <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> <p> Вас приветствует мастер настройки звука Mumble. Он поможет правильно настроить звуковую карту, а также установить наилучшие параметры для обработки звука. </p> <p> Внимание: пока Мастер активен, звук будет передаваться локально, что позволит Вам слышать его. При этом звук НЕ БУДЕТ передаваться на сервер. </p> Input Device Устройство ввода Output Device Устройство вывода This allows Mumble to use positional audio to place voices. Это позволяет Mumble позиционировать голоса говорящих, в зависимости от их расположения в игре. <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> <p>Чтобы свести время задержки к абсолютному минимуму, необходимо передвинуть ползунок влево на самый минимум, насколько позволяет Ваша звуковя карта. Тем не менее, многие звуковые карты требуют гораздо меньшего буфера, с которым они могут фактически работать, поэтому единственный способ установить это значение - пробовать и ошибаться.</p><p>Вы должны слышать голосовой образец. Установите ползунок на самое короткое время ожидания, которое <b>НЕ</b> дает прерываний или колебания в звуке. Обратите внимание, что локальное эхо выключено во время этого теста.</p> Amount of data to buffer Количество данных для буфера This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Устанавливает размер данных для буферизации в буфере вывода. Экспериментируйте с различными значениями и сделайте его минимальным, чтобы не возникало прерываний звука. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> <p>Откройте системную панель управления звуком и перейдите к параметрам записи. Убедитесь, что микрофон выбран в качестве активного входа с максимальной громкостью записи. Если есть возможность включить "усиление Микрофона" (Microphone Boost) - включите его.</p><p>Говорите громко, как будто Вы раздражены или взволнованы. Уменьшите громкость звука в системной панели управления так, чтобы показания индикатора звука были максимум в синей и зеленой зоне, но <b>НЕ</b> красной, пока Вы говорите.</p> Positional Audio Позиционирование звука Adjusting attenuation of positional audio. Регулировка затухания позиционированного звука. <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> <p>Mumble поддерживает позиционнирование звука для некоторых игр и будет позиционировать голос других пользователей относительно их положения в игре. В зависимости от их позиции, громкость голоса будет изменена в динамиках, чтобы имитировать направление и расстояние других пользователей. Такое позиционирование зависит от правильной конфигурации колонок в Вашей системе. Пройдите небольшой тест для проверки настроек.</p><p>График ниже показывает положение <font color="red">Ваc</font>, <font color="yellow">колонок</font> и <font color="green">движущегося источника звука</font> (обзор сверху). Вы должны услышать звуковое перемещение между каналами.</p> Use headphones instead of speakers Использовать наушники вместо колонок <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> <p>Поздравляем. Теперь Вы готовы насладиться более богатым звуком с Mumble.</p><p>Mumble находится в процессе постоянного развития, и команда разработчиков хочет сосредоточиться на особенностях, которые приносят пользу большинству пользователей. С этой целью Mumble поддерживает сбор анонимной статистики для разработчиков о Вашей конфигурации. Эти статистические данные существенны для будущего развития. И Вы можете быть уверены, что конфигурацию, которую Вы используете, не посчитают устаревшей.</p> Use headphones Использовать наушники This ignores the OS speaker configuration and configures the positioning for headphones instead. Эта настройка игнорирует настройку колонок в системе и настраивает позиционирование для наушников. Volume tuning Настройка громкости Tuning microphone hardware volume to optimal settings. Установите оптимальные настройки громкости микрофона. Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. Теперь говорите тихо, как будто Вы говорите поздно ночью и не хотите никого беспокоить. Отрегулируйте ползунок внизу так, чтобы показания индикатора звука переходили в зеленую зону, когда вы говорите, и остаются синим, когда вы молчите. Voice Activity Detection Определение Голосовой активности Letting Mumble figure out when you're talking and when you're silent. Укажите Mumble когда Вы говорите и когда Вы молчите. This will help Mumble figure out when you are talking. The first step is selecting which data value to use. Этот шаг поможет Mumble определить, когда Вы говорите. Сначала выберите - какие данные для этого использовать. Raw amplitude from input По чувствительности к амплитуде громкости Signal-To-Noise ratio Соотношение Сигнал/Шум Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Затем Вы должны откорректировать бегунок ниже. С начала произнесения речи индикатор НЕ должен выходить на зеленую зону (Ваша речь). Когда Вы продолжаете говорить, индикатор должен остаться в желтой зоне (могла бы быть Ваша речь) и когда Вы молчите, индикатор должен оставаться в красной зоне (не речь). Device tuning Настройка устройства Changing hardware output delays to their minimum value. Установите исходящую задержку оборудования в минимальное значение. Submit anonymous statistics to the Mumble project Отправлять анонимную статистику разработчикам Mumble Push To Talk: Активация по кнопке: Quality & Notifications Качество и Уведомления Adjust quality and notification settings. Установите настройки качества и уведомлений. Quality settings Настройки качества Low Низкие Balanced Сбалансированные Notification settings Настройки уведомлений Use Text-To-Speech to read notifications and messages to you. Использовать Текст-в-речь для озвучивания Ваших уведомлений и полученных сообщений. Disable Text-To-Speech and use sounds instead. Выключить Текст-в-речь и использовать звуки. %1 ms %1 мс Enables attenuation of other applications while users talk to you Включить приглушение других приложений, когда пользователи говорят с Вами Attenuate applications while other users talk Приглушать звук в других приложениях, когда другие пользователи говорят High Высокие Custom Другой You already set a customized quality configuration in Mumble. Select this setting to keep it. Вы уже установили индивидуальные настройки качества звука в Mumble. Выберите этот параметр, чтобы их оставить. Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. Включает приглушение других приложений пока говорят пользователи. Это означает, что как только кто-нибудь начинает говорить в Mumble, звук всех других приложений (например, аудио проигрывателя) приглушается, чтобы Вы смогли лучше слышать говорящих. Apply some high contrast optimizations for visually impaired users Применить высококонтрастную цветовую схему для людей со слабым зрением Use high contrast graphics Использовать высококонтраструю цветовую схему Keep custom Text-To-Speech settings. Оставить текущие настройки текст-в-речь. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode <p>Откройте системную панель управления звуком и перейдите к параметрам записи. Убедитесь, что микрофон выбран в качестве активного входа с максимальной громкостью записи. Если есть возможность использовать "усиление микрофона" (Microphone Boost), то включите его.</p><p>Говорите громко, как будто Вы раздражены или взволнованы. Уменьшите громкость звука в системной панели управления так, чтобы показания индикатора звука были максимум в полосатой и пустой зоне, но <b>НЕ</b> сетчатой, пока Вы говорите.</p> Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode Теперь говорите тихо, как будто Вы говорите поздно ночью и не хотите никого беспокоить. Отрегулируйте ползунок внизу так, чтобы показания индикатора звука переходили в пустую зону, когда Вы говорите и оставались в полосатой, когда Вы молчите. Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode Затем Вы должны откорректировать бегунок ниже. С начала произнесения речи индикатор НЕ должен выходить в пустую зону (Ваша речь). Когда Вы продолжаете говорить, индикатор должен остаться в полосатой зоне (могла бы быть Ваша речь) и когда Вы молчите, индикатор должен оставаться в сетчатой зоне (не речь). In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) В этой конфигурации Mumble будет использовать <b>низкую пропускную способность канала</b>. Это неизбежно приведет к высоким задержкам и низкому качеству звука. Выбирайте ее только если Ваше соединение не позволяет пользоваться другими настройками. (16 кбис/с, 60 мс на пакет) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) Эта конфигурация <b>рекомендуется по умолчанию</b>. Она обеспечивает хороший баланс между качеством, задержками и использованием пропускной способности канала. (40 кбит/с, 20 мс на пакет) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) Эта конфигурация рекомендуется только при наличии хорошего канала (напр. локальная сеть). Данная конфигурация обеспечивает самую низкую задержку и <b>высокое качество</b>, которое поддерживает Mumble. (72 кбит/с, 10 мс на пакет) BanEditor Mumble - Edit Bans Mumble - изменить баны &Address &Адрес &Mask &Маска Reason Причина Start Начало End Конец User Пользователь Hash Хэш &Add &Добавить &Update &Обновить &Remove &Удалить Ban List Список банов Search field Поле поиска This is the search field. Use it to find bans that have this username set in the username field. Это поле поиска. Используйте чтобы найти баны по нику, указанному в поле "ник". Who are you looking for? Кого ищем? No nickname Нет ника IP address IP адрес No IP address Нет IP-адреса Reason for the ban Причина бана No reason Нет причины Ban end date Дата окончания бана Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). Дата окончания бана. Если даты начала и конца совпадают, то бан постоянный (бесконечный). Certificate hash Хеш сертификата No certificate hash Нет хеша сертификата Banned users Забаненные пользователи This is a list with banned users. Список забаненных пользователей. Use this button if you want to add a new ban. Нажмите на кнопку чтобы добавить бан. Use this button if you want to update ban information. Нажмите на кнопку чтобы изменить бан. Use this button if you want to remove user from the ban list. Нажмите на кнопку чтобы снять бан с пользователя. Clear all fields Очистить все поля This button clears all fields. Use it if you want to add a new ban. Эта кнопка очищает все поля. Нажмите чтобы добавить новый бан. Clear Очистить Ban List - %n Ban(s) Бан-лист - %n банБан-лист - %n банаБан-лист - %n бановБан-лист - %n банов CertView Name Имя Email Эл. почта Issuer Организация Expiry Date Истекает (none) (нет) Self-signed Частный CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. Неправильный e-mail.<br />Введите правильный (или пустой) e-mail чтобы продолжить. There was an error generating your certificate.<br />Please try again. Ошибка при создании сертификата. <br />Попробуйте ещё раз. Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. Ваш сертификат не может быть экспортирован в формат PKCS#12. Возможно имеется ошибка в Вашем сертификате. The file could not be opened for writing. Please use another file. Невозможно открыть файл для записи. Используйте другой файл. The file's permissions could not be set. No certificate and key has been written. Please use another file. Невозможно установить разрешения для файла. Запись сертификата и ключа не удалась. Попробуйте другой файл. The file could not be written successfully. Please use another file. Невозможна запись в файл. Попробуйте другой файл. The file could not be opened for reading. Please use another file. Невозможно открыть файл для чтения. Используйте другой файл. The file is empty or could not be read. Please use another file. Файл пуст или не может быть прочтен. Используйте другой файл. The file did not contain a valid certificate and key. Please use another file. Файл не содержит действительного сертификата или ключа. Попробуйте другой файл. Select file to export certificate to Выберите файл для сохранения сертификата в Select file to import certificate from Выберите файл для импорта сертификата из Unable to import. Missing password or incompatible file type. <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. <b>Сертификат просрочен:</b> Срок действия Вашего сертификата скоро истечет. Вам необходимо обновить его, иначе Вы не сможете подключиться к серверам, на которых зарегистрированы. Certificates Certificate Management Мастер Сертификатов Certificate Authentication Авторизация по сертификату Authenticating to servers without using passwords Авторизация на серверах без использования пароля Current certificate Текущий сертификат This is the certificate Mumble currently uses. Mumble уже использует этот сертификат. Current Certificate Текущий сертификат Create a new certificate Создать сертификат This will create a new certificate. Создаёт новый сертификат. Import certificate from file Открыть сертификат из файла This will import a certificate from file. Импортирует сертификат из файла. Import a certificate Открыть сертификат Export Certificate Сохранить сертификат This will export a certificate to file. Экспортировать сертификат в файл. Export current certificate Сохранить текущий сертификат Import Certificate Импорт Сертификата PKCS #12 Certificate import Импорт сертификата формата PKCS #12 <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble может использовать ранее сохраненные сертификаты в формате PKCS #12. Этот формат используется для передачи ключа от Mumble и веб-браузеров (Firefox/Opera/IE/и другие).</p><p>Если файл защищен паролем, то Вам нужен пароль для импорта сертификата.</p> Import from Импортировать из Filename to import from Имя файла для импорта This is the filename you wish to import a certificate from. Это имя файла, из которого Вы хотите импортировать сертификат. Select file to import from Выберите файл для импорта This opens a file selection dialog to choose a file to import a certificate from. Открывает диалог выбора файла для импорта сертификата из. Open... Открыть... Password Пароль Password for PKCS#12 file Пароль для файла PKCS#12 This is the password for the PKCS#12 file containing your certificate. Это пароль для файла PKCS#12, содержащего Ваш сертификат. Certificate to import Сертификат для импорта This is the certificate you are importing. Это сертификат, который Вы импортируете. Certificate Details Информация о сертификате Replace Certificate Заменить сертификат Replace existing certificate with new certificate? Заменить существующий сертификат новым? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> <p>У Вас уже есть сертификат, используемый в Mumble, который Вы хотите заменить.</p><p>Если Вы обновляете сертификат, выданный Вам доверенным Бюро Сертификации, и адреса эл.почты сертификатов совпадают, то замена безопасна. Сервера, к которым Вы подключитесь в дальнейшем, автоматически распознают более значимый сертификат для вашего e-mail адреса.</p><p>В противном случае, сервера, на которых Вы были зарегистрированы, больше не примут Вас. Если же Вы еще не регистрировались ни на одном сервере Мамбл, Вам не о чем беспокоиться.</p><p>Вы уверенны что хотите заменить существующий сертификат?</p> This is the certificate Mumble currently uses. It will be replaced. Этот сертификат используется в Mumble. Он будет заменен. New certificate Новый сертификат This is the new certificate that will replace the old one. Это новый сертификат, который заменит старый. New Certificate Новый сертификат Make a backup of your certificate Сделайте резервную копию Вашего сертификата Export to Экспорт в Filename to export to Имя файла для экспорта This is the filename you wish to export a certificate to. Имя файла, в который Вы хотите экспортировать сертификат. Save As... Сохранить как... This is the certificate Mumble currently uses. It will be exported. Это сертификат, который сейчас используется в Mumble. Он будет сохранен. Generate a new certificate for strong authentication Сгенерировать новый сертификат для надежной авторизации <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> <p>Мамбл сгенерирует надежный сертификат для авторизации на серверах.</p><p>По желанию, Вы можете внести дополнительную информацию, которая будет храниться в сертификате. Эта информация будет предоставлена серверам, к которым Вы подключаетесь. Если Вы предоставите настоящий e-mail адрес, Вы сможете улучшить его в дальнейшем на доверенный сертификат CA, который обеспечит надёжную идентификацию.</p> Name Имя Email E-mail Your email address (e.g. johndoe@mumble.info) Ваш E-mail (например, johndoe@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. Это Ваш e-mail адрес. Мы настоятельно рекомендуем Вам указывать СВОЙ адрес электронной почты, т.к. это позволит обновлять Ваш сертификат без каких либо проблем. Your name (e.g. John Doe) Ваше имя (например, Бонус Мамблович) This is your name, and will be filled out in the certificate. This field is entirely optional. Это Ваше имя. Оно будет включено в сертификат и является не обязательным к заполнению. Finish Завершить Certificate-based authentication is ready for use Авторизация на основе сертификата готова к использованию Enjoy using Mumble with strong authentication. Наслаждайтесь Mumble с надежной авторизацией. Automatic certificate creation Автоматическое создание сертификата <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>Если Вы потеряете свой сертификат, что случается при неполадках Вашего компьютера или при переустановке системы, то Вы больше не сможете авторизироваться на серверах где зарегистрированы. Что бы этого не случилось, <b>обязательно</b> создайте резервную копию сертификата. Мы настоятельно рекомендуем хранить резервную копию на сменных носителях, таких как USB-флешка.</p><p>Имейте ввиду, файл сертификата не зашифрован и если кто-то кроме Вас получит к нему доступ - он сможет авторизироваться на серверах под Вашим именем! Храните сертификат в надежном месте!</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> ChanACL None Нет Traverse Доcтуп Enter Вход Speak Говорить Mute/Deafen Глушить Make channel Создавать канал Make temporary Создавать временный канал Link channel Связывать канал This represents no privileges. Представляет отсутствие привелегий. This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. Предоставляет полный доступ к каналу, включая возможность изменять информацию о группах и СУД. Эта привилегия включает все привилегии. This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. Предоставляет разрешение доступа к каналу. Если у пользователя нет такой привилегии, он никак не сможет получить доступ к каналу и подканалам, независимо от разрешений подканалов. This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. Предоставляет разрешение входить на канал. Если у канала иерархическая структура, Вы можете дать каждому право доступа к каналу, но ограничивать Вход в корне вашей иерархии. This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. Предоставляет разрешение говорить на канале. Пользователи без этой привелегии будут заглушены сервером, и неспособны будут говорить, пока не получат разрешение от кого-то, имеющего соответствующие привелегии. This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. Предоставляет разрешение шептать в этот канал из другого канала. Это работает точно также, как право <i>Говорить</i>, но применяется к речи при нажатой клавиши Шепота. Это может быть использовано для того чтобы объявить что-то в дерево каналов без необходимости их связывания. This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. Даёт разрешение выключать голос или звук у других пользователей. Глушение останется у пользователя до снятия состояния другим привелегированным пользователем, или до переподключения к серверу. This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. Предоставляет разрешение перемещать пользователя в другой канал или кикать его с сервера. Чтобы на самом деле переместить пользователя, перемещающий пользователь должен иметь привелегии Перемещения в канале назначения или пользователю должно быть позволено входить в тот канал. Пользователь с этой привилегией может перемещать пользователей в каналы, в которые перемещаемому пользователю доступ обычно закрыт. This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. Предоставляет разрешение создавать подканалы. Пользователь, создавший подканал будет добавлен в группу admin подканала. This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. Предоставляет разрешение создавать временный подканал. Пользователь создавший временный подканал будет добавлен в группу admin подканала. Временные каналы не сохраняются и исчезают, когда все пользователи их покинут. This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. Предоставляет разрешение связывать каналы. Пользователи в связанных каналах будут слышать друг друга до тех пор, пока пользователь, который говорит имеет право <i>Говорить</i> в канал того, кто слушает. Необходимо иметь разрешение Связывать в обоих каналах, чтобы создать связь, и только в одном из каналов, чтобы удалить связь. This represents the permission to write text messages to other users in this channel. Предоставляет разрешение отправлять текстовое сообщение другим пользователям канала. This represents the permission to forcibly remove users from the server. Предоставляет разрешение удалять пользователей с сервера. This represents the permission to permanently remove users from the server. Предоставляет разрешение постоянно удалять пользователей с сервера. This represents the permission to register and unregister users on the server. Предоставляет разрешение регистрировать и отменять регистрацию пользователей на сервере. This represents the permission to register oneself on the server. Предоставляет разрешение регистрировать себя на сервере. Whisper Шепот Move Перемещать Text message Сообщение Kick Кикать Ban Банить Register User Регистрировать пользователя Register Self Регистрироваться Write ACL Изменять СУД ChatbarTextEdit Paste and &Send Paste and send Вставить и &отправить <center>Type chat message here</center> <center>Напишите здесь сообщение в чат</center> ClientUser Friend Друг Authenticated Зарегистрирован Priority speaker Приоритетный разговор Recording Запись Muted (server) Микрофон выключен (сервер) Deafened (server) Звук выключен (сервер) Local Ignore (Text messages) Местное игнорирование (Текстовые сообщения) Local Mute Не слушаю Muted (self) Микрофон выключен (сам) Deafened (self) Звук выключен (сам) ConfigDialog Accept changes Применить изменения This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. Применить текущие настройки и вернуться в приложение.<br />Настройки будут сохранены на диск при выходе из приложения. Reject changes Отменить изменения This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. Отменить все изменения и вернуться в приложение.<br />Настройки будут сброшены до предыдущих значений. Apply changes Применить изменения This button will immediately apply all changes. Немедленно применяет все изменения. Undo changes for current page Отменить изменения на текущей странице This button will revert any changes done on the current page to the most recent applied settings. Отменить любые изменения, совершенные на этой странице. Restore defaults for current page Восстановить стандартные настройки на этой странице This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. Вернуть настройки по-умолчанию для данной страницы. Другие страницы не будут изменены.<br />Чтобы вернуть все настройки по-умолчанию, Вы должны нажать эту кнопку на каждой странице. Mumble Configuration Настройки Mumble ConnectDialog Connecting to %1 Подключение к %1 Enter username Введите имя пользователя Adding host %1 Добавление хоста %1 Servername Название сервера Hostname Адрес Bonjour name Имя Bonjour Port Порт Addresses IP-адрес Website Веб-сайт Packet loss Потеря пакетов Ping (80%) Пинг (80%) %1 ms %1 мс Ping (95%) Пинг (95%) Bandwidth Канал %1 kbit/s %1 кбит/с &Connect &Подключиться &Filters &Фильтры Unknown Users Пользователей Version Версия Failed to fetch server list Ошибка при получении списка серверов Mumble Server Connect Подключение к серверу Ping Пинг Remove from Favorites Удалить из избранного Add custom server Добавить свой сервер Show all servers that respond to ping Показать все сервера, которые пингуются Show all servers with users Показать все сервера с подключенными пользователями Show all servers Показать все сервера &Copy &Копировать Copy favorite link to clipboard Копировать ссылку в буфер обмена &Paste &Вставить Paste favorite from clipboard Вставить из буфера обмена &Edit... &Редактировать... &Add New... &Добавить новый... Add to &Favorites Добавить в &избранное Open &Webpage Посетить &веб-страницу Show &Reachable Показать &доступные Show &Populated Показать &населенные Show &All &Показать все ConnectDialogEdit Edit Server Редактировать сервер Name of the server Название сервера A&ddress А&дрес Internet address of the server. Internet address of the server. Интернет адрес сервера. <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Адрес</b><br/>Сетевой адрес сервера. Может быть доменным именем или IPv4/IPv6 адресом, либо идентификатором службы Bonjour. Идентификаторы Bonjour должны иметь префикс '@'. &Port &Порт<br /><i>пример:</i> 64738 Port on which the server is listening Порт сервера <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. <b>Порт</b><br/>Порт сервера. Если у сервера есть идентификатор службы Bonjour, этот порт будет проигнорирован. &Username Имя п&ользователя Username to send to the server Имя пользователя, под которым Вы зайдете на сервер <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. <b>Имя пользователя</b><br/>Имя пользователя, под которым Вы зайдете на сервер. Обратите внимание, на сервере могут быть ограничения. А также имя пользователя может быть уже занято другим пользователем. Label Название Add Server Добавить сервер You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 Password Пароль Password to send to the server Пароль, для авторизации на сервере <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. <b>Пароль</b><br />Пароль для авторизации на сервере при подключении. Данный пароль необходим, когда Вы подключаетесь как <i>SuperUser</i> или к серверу, который использует авторизацию по паролю. Если оставить это поле пустым, пароль будет запрошен при соединении. Show password Показывать пароль <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. <b>Название</b><br />Название сервера. То как сервер будет называться в Вашем списке серверов для его свободного определения. Local server label Метка локального сервера 127.0.0.1 127.0.0.1 64738 64738 Your username Имя пользователя Your password Пароль &Fill CoreAudioSystem Default Device Устройство по умолчанию CrashReporter Mumble Crash Report Отчет об ошибке Mumble <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> <p><b>Мы сожалеем, но похоже Mumble совершил фатальную ошибку и закрылся. Желаете ли Вы отправить отчет об ошибке разработчикам Mumble?</b></p><p>Отчет об ошибке содержит частичную копию памяти Mumble на момент вылета и поможет разработчикам исправить проблему.</p> Email address (optional) E-mail адрес (необязательно) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash Коротко опишите по-английски, что Вы делали на момент вылета Send Report Отправить отчет Don't send report Не отправлять Crash upload successful Отправка успешна Thank you for helping make Mumble better! Спасибо за помощь в улучшении Mumble! Crash upload failed Отправка неудалась We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. Ошибка отправки отчёта %1 %2. Сообщите разработчику. This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 Это действительно не смешно. Очевидно, имеется ошибка в коде отправке отчета и его отправка не удалась. Вы можете проинформировать разработчика об ошибке %1 Uploading crash report Отправка отчета об ошибке Abort upload Отмена отправки DXAudioInput Default DirectSound Voice Input Голосовой вход по умолчанию Opening chosen DirectSound Input device failed. No microphone capture will be done. Открытие выбранного устройства ввода невозможно. Микрофон не будет работать. Opening chosen DirectSound Input failed. Default device will be used. Открытие выбранного входа DirectSound невозможно. Будет использовано устройство по умолчанию. Lost DirectSound input device. Потеряно устройство ввода. DXAudioOutput Default DirectSound Voice Output Голосовой выход по умолчанию Opening chosen DirectSound Output failed. Default device will be used. Открытие выбранного выхода DirectSound невозможно. Будет использовано устройство по умолчанию. Lost DirectSound output device. Потеряно устройство вывода. Opening chosen DirectSound Output failed. No audio will be heard. Открытие выбранного выхода DirectSound невозможно. Вы не услышите звука. Database Mumble failed to initialize a database in any of the possible locations. Mumble не удалось инициализировать базу данных ни в одном из доступных мест. The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. База данных '%1' доступна только для чтения. Mumble не сможет хранить настройки сервера (такие как SSL сертификаты) до тех пор, пока Вы не исправите эту проблему. DeveloperConsole Developer Console Консоль разработчика DockTitleBar Drag here Перетащить сюда GlobalShortcut Shortcuts Горячие клавиши List of configured shortcuts Список привязок горячих клавиш Function Функция Data Данные Shortcut Кнопка Suppress Глобальная Add new shortcut Добавить новый ярлык This will add a new global shortcut Добавить новое сочетание клавиш &Add &Добавить Remove selected shortcut Удалить выбранный ярлык This will permanently remove a selected shortcut. Полностью удалить выбранное сочетание клавиш. &Remove &Удалить <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> <html><head/><body><p>Mumble может использовать только кнопки мыши и клавиши-модификаторы (Alt, Ctrl, Cmd, и т.д.) для Глобальных клавиш.</p><p>Если Вы хотите больше гибкости, Вы можете включить <span style="font-style:italic;">Доступ для вспомогательных устройств</span> в системных настройках доступа. Тем не менее, обращаем Ваше внимание, что это изменение потенциально позволит вредоносным программам читать то, что напечатано на Вашей клавиатуре.</p></body></html> Open Accessibility Preferences Открыть настройки специальных возможностей Skip Пропустить Enable Global Shortcuts Включить глобальные горячие клавиши <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. Additional Shortcut Engines <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. Enable Windows hooks <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. Enable GKey <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. Enable XInput <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. Enable shortcuts in privileged applications GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> Shortcuts Горячие клавиши Shortcut button combination. Сочетание клавиш. <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. <b>Это глобальная комбинация клавиш.</b><br />Чтобы изменить, кликните на этом поле, затем нажмите желаемую клавишу/комбинацию клавиш. Двойной клик для очистки. Suppress keys from other applications Скрыть нажатие этих кнопок от других приложений <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. <b>Эта опция скрывает нажатие клавиши для других приложений.</b><br />Задействовав эту опцию, нажатие клавиши (или нажатие последней клавиши в комбинации) будет скрыто от других приложений. Не все клавши могут быть скрыты. GlobalShortcutTarget Whisper Target Цель Шепота Whisper to list of Users Шептать пользователям из списка Channel Target Целевой канал Restrict to Group Ограничить группой If specified, only members of this group will receive the whisper. Если указано, только члены этой группы могут слышать шепот. List of users Список пользователей Add Добавить Remove Удалить Modifiers Опции Do not send positional audio information when using this whisper shortcut. Не отсылать позицию в игре, когда используется шепот. Ignore positional audio Игнорировать позиционирование звука Shout to Linked channels Крикнуть в связанные каналы Shout to subchannels Крикнуть в подканалы Shout to Channel Крикнуть в канал The whisper will also be transmitted to linked channels. Шепот будет также передаваться в связанные каналы. The whisper will also be sent to the subchannels of the channel target. Шепот будет также передаваться в подканалы канала назначения. GlobalShortcutX Mouse %1 Мышь %1 JackAudioSystem Hardware Ports Mono Моно Stereo Стерео LCD Not connected Не подключен LCDConfig Enable this device Включить это устройство LCD LCD Devices Устройства Name Имя <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> <p>Это список доступных LCD-устройств в Вашей системе. Устройства показаны по имени, а также указан размер дисплея. Mumble поддерживает вывод на несколько LCD дисплеев сразу.</p><h3>Размер:</h3><p>В этой графе указан размер LCD дисплея. Размер указан либо в пикселях (для графических LCD) или в символах для текстовых LCD).</p><h3>Включен:</h3><p>Здесь указано должен ли Mumble выводить информацию на конкретный дисплей.</p> Size Размер Enabled Включено Views Отображение Minimum Column Width Мин. размер столбца <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> <p>Эта опция определяет минимальную ширину колонки Списка Пользователей.</p><p>Если слишком много людей говорят одновременно, Список Пользователей будет разбит на колонки. Вы можете использовать эту опцию, чтобы оптимально выбрать между количеством пользователей, показанных на дисплее и шириной имени пользователя.</p> This setting decides the width of column splitter. Настройка ширины колонки разделителя. Splitter Width Ширина разделителя Log Debug Отладка Critical Критичный Warning Предупреждение Information Информация Server Connected Сервер подключен Server Disconnected Сервер отключен Other self-muted/deafened Другой пользователь заглушил сам себя Permission Denied Доступ запрещен Text Message Сообщение User Joined Server Пользователь присоединился к серверу User Left Server Пользователь покинул сервер User recording state changed Пользователь изменил состояние записи User kicked (you or by you) Пользователь выкинул/выкинут (Вас или Вами) User kicked Пользователь выкинут You self-muted Вы наложили на себя онемение User muted (you) Пользователь заглушен (Вы) User muted (by you) Пользователь заглушен (Вами) User muted (other) Пользователь заглушен (кем-то) User Joined Channel Пользователь вошел в канал User Left Channel Пользователь покинул канал You self-unmuted Самоонемение снято You self-deafened Самоглушение установлено You self-undeafened Самоглушение снято User renamed Пользователь переименован You Joined Channel Вы присоединились к каналу You Joined Channel (moved) User connected and entered channel User left channel and disconnected Private text message Личное текстовое сообщение the server Сервер [[ Invalid size ]] [[ Text object too large to display ]] [[ Текст слишком большой ]] [Date changed to %1] [Дата сменилась на %1] link to %1 ссылка на %1 FTP link to %1 player link ссылка пользователя channel link ссылка канала %1 link %1 ссылка LogConfig Toggle console for %1 events Включение/выключение лога для событий "%1" Toggle pop-up notifications for %1 events Включение/выключение всплывающих уведомлений для событий "%1" Toggle Text-To-Speech for %1 events Включение/выключение Текст-в речь для событий "%1" Click here to toggle sound notification for %1 events Кликните здесь, чтобы Включить/выключить звуковые уведомления для событий "%1" Toggle window highlight (if not active) for %1 events Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change Путь к звуковому файлу для звукового уведомления событий "%1"<br />Кликните, чтобы проиграть<br />Двойной клик, чтобы изменить Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. Кликните здесь, чтобы включить/выключить отображение событий "%1" в окне лога сервера.<br />Если отмечено, Mumble будет выводить все события "%1" в окне лога сервера. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. Кликните здесь, чтобы включить/выключить всплывающие уведомления для событий "%1".<br />Если отмечено, Mumble будет показывать всплывающие уведомления для всех событий "%1". Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. Путь к звуковому файлу, который будет воспроизводится для событий "%1".<br />Кликните, чтобы проиграть<br />Двойной клик, чтобы изменить<br />Убедитесь, что звуковые уведомления для этих событий включены, иначе этот переключатель не будет иметь эффекта. Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. Кликните здесь, чтобы включить/выключить функцию Текст-в речь для событий "%1".<br />Если отмечено, Mumble будет использовать Текст-в-речь, чтобы прочитать события "%1" для Вас. Текст-в-речь также может читать содержание события, о котором не могут проинформировать звуковые файлы. Текст-в-речь и звуковые уведомления не могут быть использованы одновременно. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. Кликните здесь, чтобы включить/выключить звуковые уведомления для событий "%1".<br />Если отмечено, Mumble будет проигрывать звуковой файл для уведомления о событиях "%1". Звуковые файлы не могут быть использованы одновременно с функцией Текст-в-речь. Messages Уведомления Message Сообщение Console Консоль Notification Уведомление Text-To-Speech Преобразовать текст в речь Soundfile Звуковой файл Path Путь Text To Speech Текст в речь Volume Громкость Volume of Text-To-Speech Engine Громкость преобразователя текста в речь <b>This is the volume used for the speech synthesis.</b> <b>Эта громкость используется для создания речи.</b> Length threshold Макс. длина Message length threshold for Text-To-Speech Engine Максимальная длина текста, который будет прочитан функцией Текст-в-речь <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. <b>Это ограничение длины текста, который будет прочитан функцией Текст-в-речь.</b><br />Сообщения длиннее этого лимита будут прочитаны не полностью. Characters символов Whisper Шепот If checked you will only hear whispers from users you added to your friend list. Если отмечено, Вы будете слышать шепот только от пользователей, которые добавлены в Ваш список друзей. Only accept whispers from friends Слышать шепот только от друзей If enabled text messages you send will be read back to you with TTS Если отмечено, то текстовые сообщения будут озвучены функцией Текст-в-Речь Read back own messages Озвучивать сообщения Chat Log Окно чата Maximum chat length Максимальная длина чата Unlimited Неограничено Lines линий Highlight LookConfig System default По умолчанию None Нет Only with users Только с пользователями All Все Ask Спрашивать Do Nothing Ничего не делать Move Перемещать <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory <a href="%1">Обзор</a> User Interface Внешний вид This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. Устанавливает какие каналы автоматически раскрывать. <i>Нет</i> и <i>Все</i> - каналы не будут раскрываться автоматически или будут раскрываться все. <i>Только с пользователями</i> - будут автоматически раскрываться только каналы, в которых есть пользователи. List users above subchannels (requires restart). Список пользователей над каналами (требуется перезапуск). <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. <b>Если отмечено, список имен пользователей будет находится над списком подканалов.</b><br />Требуется перезапуск Mumble. Users above Channels Пользователи над каналами <b>If set, will verify you want to quit if connected.</b> <b>Если отмечено, нужно будет подтвердить попытку закрыть Mumble, если Вы подключены к серверу.</b> Show number of users in each channel Показывать количество пользователей на каждом канале Show channel user count Показывать количество пользователей Language Язык Language to use (requires restart) Язык интерфейса (требуется перезапуск) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. <b>Здесь устанавливается язык интерфейса Mumble.</b><br />Необходим перезапуск Mumble для использования другого языка. Look and Feel Внешний вид Layout Стиль Classic Классический Stacked Вертикальный Hybrid Гибридный Custom Другой This changes the behavior when moving channels. Это изменит поведение при перемещении каналов. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. Это изменит поведение при перемещении каналов. Используется для исключения случайного перемещения канала. <i>Переместить</i> - перемещает канал без запроса. <i>Ничего не делать</i> - не перемещать канал и выдать сообщение об ошибке. <i>Спрашивать</i> - выводит запрос при попытке переместить канал. Expand Разворачивать When to automatically expand channels Когда автоматически разворачивать каналы Channel Dragging Перетаскивание Ask whether to close or minimize when quitting Mumble. Спрашивать Закрыть или Свернуть Mumble при закрытии. Ask on quit while connected Спрашивать о выходе, когда подключен к серверу Always On Top Отображать на переднем плане <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> <b>Если отмечено, основное окно Mumble будет скрыто при сворачивании и доступно только из системного лотка. Если нет - будет свернуто как обычное окно.</b> Hide in tray when minimized Сворачивать в трей Hide the main Mumble window in the tray when it is minimized. Сворачивать Mumble в трей. This setting controls when the application will be always on top. Здесь устанавливается будет ли Mumble отображаться поверх других окон. Never Никогда Always Всегда In minimal view В минимальном виде In normal view В нормальном виде Displays talking status in system tray Отображать статус разговора в системном лотке Show talking status in tray icon Показывать статус разговора в трее This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. Здесь устанавливается, когда Mumble будет отображаться поверх всех окон. Если выбрано <i>Никогда</i> - Mumble не будет отображаться поверх других окон. <i>Всегда</i> - всегда будет отображать над другими окнами. <i>В минимальном виде</i> / <i>В нормальном виде</i>- Mumble будет поверх всех окон в выбранном режиме. Show context menu in menu bar Показывать контекстное меню в главном меню Apply some high contrast optimizations for visually impaired users Применить высококонтрастную цветовую схему для людей со слабым зрением Optimize for high contrast Контрастная цветовая схема Application Приложение Adds user and channel context menus into the menu bar Добавить контекстные меню пользователя и канала в главное меню Tray Icon Системный Трей Channel Tree Дерево каналов Use selected item as the chat bar target Использовать выделенный элемент как цель для сообщений чата Filter automatically hides empty channels Фильтр автоматически скрывает пустые каналы Show transmit mode dropdown in toolbar Theme Тема Theme to use to style the user interface <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. User Dragging This changes the behavior when moving users. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. Enable Developer menu When in custom layout mode, checking this disables rearranging. Lock layout MainWindow Root Корень Push-to-Talk Global Shortcut Активация по кнопке Push and hold this button to send voice. Global Shortcut Нажмите и задержите эту кнопку для передачи голоса. This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut Здесь настраивается кнопка для включения речи, пока Вы ее удерживаете, другие пользователи слышат Ваш голос. Reset Audio Processor Global Shortcut Сбросить Аудио препроцессор Unlink Plugin Global Shortcut Выключить плагин Push-to-Mute Global Shortcut Нажмите, чтобы выключить микрофон Join Channel Global Shortcut Присоединиться к каналу Toggle Overlay Global Shortcut Включить табло Toggle state of in-game overlay. Global Shortcut Вкл/выкл табло в игре. Toggle Minimal Global Shortcut Включить Минимальный вид Volume Up (+10%) Global Shortcut Увеличить громкость (+10%) Volume Down (-10%) Global Shortcut Уменьшить громкость (-10%) Mumble Mumble Mumble -- %1 Mumble -- %1 &Window &Окно Minimize Свернуть в трей Ctrl+M Ctrl+M Close Закрыть Mumble is currently connected to a server. Do you want to Close or Minimize it? В настоящий момент Mumble подключен к серверу.<br />Вы хотите Закрыть его или Свернуть в трей? Mute Self Global Shortcut Выключить микрофон Set self-mute status. Global Shortcut Установить статус микрофона. This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut Наложит/Снимет с Вас онемение. Если выключить - с Вас также будет снято глушение. Deafen Self Global Shortcut Выключить звук Set self-deafen status. Global Shortcut Установить состояние звука. This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut Включает/выключает звук. Если выключить - также выключится микрофон. Whisper/Shout Whisper Шепнуть/Крикнуть <center>Not connected</center> Not connected <center>Нет соединения с сервером</center> Clear Очистить Opening URL %1 Открывается URL %1 File does not exist Файл не найден File is not a configuration file. Файл не является файлом конфигурации. Settings merged from file. Настройки импортированы из файла. URL scheme is not 'mumble' Схема ссылки не 'mumble' This version of Mumble can't handle URLs for Mumble version %1.%2.%3 Эта версия Mumble не может использовать ссылки из Mumble версий %1.%2.%3 Connecting to %1 Подключение к %1 Enter username Введите имя пользователя Connecting to server %1. Подключение к серверу %1. Reconnecting. Повтор связи. Transmit Mode set to Continuous <p>%1 (%2)<br />%3</p> <p>%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> <h2>Голосовой канал</h2><p>Шифрование 128 бит OCB-AES128<br />%1 мс среднее время задержки (%4 отклонение)</p> Register yourself as %1 Зарегистрироваться как %1 <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <p>Вы собираетесь зарегистрироваться на этом сервере. Невозможно будет отметить данное действие и изменить Ваше имя для данного сертификата. Вы всегда будете известны как <b>'%1'</b> на этом сервере.</p><p>Вы действительно желаете зарегистрироваться?</p> <h2>Version</h2><p>Protocol %1</p> <h2>Версия</h2><p>Протокол %1</p> <p>No build information or OS version available</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) The connection is secured by the cipher suite that OpenSSL identifies as %1 <p>The connection provides perfect forward secrecy</p> <p>The connection does not provide perfect forward secrecy</p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> Voice channel is sent over control channel Голосовой канал посылается через контрольный канал Register user %1 Зарегистрировать пользователя %1 <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> <p>Вы собираетесь зарегистрировать пользователя <b>%1</b> на сервере. Это действие нельзя отменить, имя пользователя нельзя будет изменить, а пользователь <b>%1</b> будет иметь доступ на сервер, даже если Вы измените пароль для подключения к серверу.</p><p>С этого момента, <b>%1</b> будет авторизироваться с сертификатом, который у него в данный момент используется.</p><p>Вы уверены, что хотите зарегистрировать <b>%1</b>?</p> Kicking user %1 Выбросить пользователя %1 Banning user %1 Забанить пользователя %1 View comment on user %1 Посмотреть комментарий пользователя %1 Message to channel %1 Сообщение в канал %1 Connected. Подключено. <li>Expected certificate digest (SHA-1): %1</li> Server presented a certificate which failed verification. Сервер передает сертификат, который не удалось проверить. <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> SSL Version mismatch Версия SSL не совпадает Server connection failed. <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>Напечатайте здесь сообщение для канала '%1'</center> <center>Type message to user '%1' here</center> Type message to user '%1' here <center>Напечатайте здесь сообщение для пользователя '%1'</center> Choose image file Выберите картинку Failed to load image Ошибка при загрузке изображения Could not open file for reading. Невозможно открыть файл для чтения. Image format not recognized. Формат изображения не поддерживается. &User &Пользователь &Channel &Канал Use in conjunction with Whisper to. Global Shortcut Использовать вместе с шёпотом. This will switch the states of the in-game overlay. Global Shortcut Переключает состояние табло в игре. Link Channel Global Shortcut Связать канал Cycle Transmit Mode Global Shortcut Сменить режим передачи Set Transmit Mode to Push-To-Talk Global Shortcut Set Transmit Mode to Continuous Global Shortcut Set Transmit Mode to VAD Global Shortcut Send Text Message Global Shortcut Отправить текстовое сообщение Send Clipboard Text Message Global Shortcut This will send your Clipboard content to the channel you are currently in. Global Shortcut Continuous Постоянно Voice Activity Активация по голосу Push-to-Talk Активация по кнопке Mumble - Minimal View -- %1 Mumble - Минимальный режим -- %1 Cancel Отмена Save Image As... Сохранить картинку как... Save Image File Сохранить картинку Could not save image: %1 Невозможно сохранить картинку: %1 Change your comment Изменить свой комментарий Transmit Mode set to Voice Activity Установлен режим активации голосом Transmit Mode set to Push-to-Talk Установлен режим "нажми-чтобы-говорить" <p>Connected users: %1/%2</p> <p>Подключённые пользователи: %1/%2</p> UDP Statistics UDP статистика To Server К серверу From Server От сервера Good Хорошие Late С запозданием Lost Потерянные Resync Реcинхронизированные <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> <h2>Качество звука</h2><p>Максимально %1 кбит/с<br />Текущее %2 кбит/с<br />Кодек: %3</p> Mumble Server Information Информация о сервере &View Certificate &Посмотреть сертификат Enter reason Введите причину Sending message to %1 Отправка сообщения пользователю %1 To %1: %2 Для %1: %2 Message to %1 Сообщение для %1 Are you sure you want to reset the comment of user %1? Вы уверены, что хотите очистить комментарий пользователя %1? Are you sure you want to reset the avatar of user %1? Сбросить аватар пользователя %1? Are you sure you want to delete %1 and all its sub-channels? Вы уверены, что хотите удалить %1 и все его подканалы? Sending message to channel %1 Отправка сообщения в канал %1 Message to tree %1 Сообщение в дерево каналов %1 To %1 (Tree): %2 (Tree) %1: %2 Для %1 (Дерево): %2 Unmuted and undeafened. Звук и микрофон включены. Unmuted. Микрофон включен. Muted. Микрофон выключен. Muted and deafened. Звук и микрофон выключены. Deafened. Звук выключен. Undeafened. Звук включен. Restart Mumble? Перезагрузить Mumble? Some settings will only apply after a restart of Mumble. Restart Mumble now? Некоторые настройки будут применены после перезапуска Mumble. Перезапустить сейчас? About Qt О Qt SSL Verification failed: %1 Проверка SSL не удалась: %1 <li>Server certificate digest (SHA-1): %1</li> <b>WARNING:</b> The server presented a certificate that was different from the stored one. <b>ПРЕДУПРЕЖДЕНИЕ:</b> Сервер передает сертификат, который отличается от сохраненного ранее. This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. Данный сервер использует старые стандарты шифрования и больше не поддерживается новыми версиями Mumble. Server connection failed: %1. Попытка соединения с сервером не удалась: %1. Disconnected from server. Отключен от сервера. Invalid username Недопустимое имя пользователя You connected with an invalid username, please try another one. Попытка подключения с недопустимым именем пользователя, попробуйте другое имя. Username in use Имя пользователя занято That username is already in use, please try another username. Это имя уже используется. Попробуйте другое. Wrong certificate or password Неверный сертификат или пароль Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. Неверный сертификат или пароль для зарегистрированного пользователя. Если Вы уверены, что данный пользователь защищен паролем, повторите попытку. В противном случае, проверьте свой сертификат или смените имя пользователя. Wrong password Неверный пароль Wrong server password for unregistered user account, please try again. Неверный пароль для подключения к серверу. Попробуйте еще раз. Images (*.png *.jpg *.jpeg) Изображения (*.png *.jpg *.jpeg) C&onfigure Н&астройки &Help П&омощь Log Лог This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. Показывает все недавние действия: соединения с серверами, сообщения об ошибках и информационные сообщения.<br />Чтобы настроить, какие точно сообщения отображать тут, используйте команду <b>Настройки</b> из меню. &Quit Mumble В&ыход из Mumble Closes the program Закрывает программу Exits the application. Выход из приложения. Ctrl+Q Ctrl+Q Open the server connection dialog Открыть окно соединения с сервером &Disconnect &Отключиться Disconnect from server Отключиться от сервера Disconnects you from the server. Отключает Вас от сервера. Show information about the server connection Показать информацию о соединении This will show extended information about the connection to the server. Показывает расширенную информацию о соединении с сервером. &Mute Выключить &микрофон &Deafen Выключить &звук &Local Mute &Не слушать пользователя Send a Text Message Отправить текстовое сообщение Sends a text message to another user. Отправить текстовое сообщение другому пользователю. Add new channel Добавить новый канал This adds a new sub-channel to the currently selected channel. Добавляет новый подканал в выбранный канал. Remove channel Удалить канал This removes a channel and all sub-channels. Удаляет канал и все подканалы. Edit Groups and ACL for channel Изменять группы и СУД канала This opens the Group and ACL dialog for the channel, to control permissions. Открывает настройки групп и СУД для канала для управления привилегиями. &Link &Связать Link your channel to another channel Связывает Ваш канал с другими каналами This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. Это чат<br />Если Вы введете здесь текст и нажмете enter - текст будет отправлен пользователю или в канал, который Вы выбрали. Если ничего не выделено - сообщение будет отправлено в текущий канал. Chatbar Чат Shows a dialog of registered servers, and also allows quick-connect. Показывает список зарегистрированных серверов и позволяет быстро подключаться. Kick user (with reason) Выкинуть пользователя (с указанием причины) Kick selected user off server. You'll be asked to specify a reason. Выкинуть выбранного пользователя с сервера. Вас попросят указать причину. Mute user Выключить микрофон у пользователя Mute or unmute user on server. Unmuting a deafened user will also undeafen them. Включить или выключить микрофон у пользователя. Включение микрофона у пользователя также включит звук. Kick and ban user (with reason) Выкинуть и забанить пользователя (с указанием причины) Kick and ban selected user from server. You'll be asked to specify a reason. Выкинуть и забанить выбранного пользователя с сервера. Вас попросят указать причину. Deafen user Заглушить Deafen or undeafen user on server. Deafening a user will also mute them. Наложить или снять глушение с пользователя. Наложение глушения наложит и онемение. Mute user locally Не слушать пользователя Mute or unmute user locally. Use this on other users in the same room. Не слушать пользователя. Используйте это на других пользователях в канале. Только Вы не будете слышать данного пользователя. This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. Это свяжет Ваш текущий канал с выбранным каналом. Если пользователи могут разговаривать в другом канале, то после этого они будут слышать друг друга. Это постоянная связь и будет действовать, пока не будет разорвана вручную, либо после перезагрузки сервера. См. комбинацию клавиш для Связь по кнопке. &Unlink Channel Р&азорвать связь Unlink your channel from another channel Разорвать связь канала с другим This unlinks your current channel from the selected channel. Разрывает связь Вашего канала с выбранным каналом. Unlinks your channel from all linked channels. Разрывает канал со всеми связанными каналами. This unlinks your current channel (not the selected one) from all linked channels. Разрывает связь Вашего канала со всеми (не только с выбранными) связанными каналами. &Reset Сб&росить Reset audio preprocessor Сбросить аудио препроцессор This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. Сбросить аудио препроцессор, включая подавление шумов, автоматическое получение и определение голосовой активности. Если что-то внезапно вмешается в звуковую среду (например падение микрофона) на короткое время, используйте это, чтобы не ждать приспособления препроцессора. &Mute Self Выключить &микрофон Mute yourself Выключить микрофон Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. Выключает микрофон. При выключении невозможно посылать данные на сервер (Вас не будут слышать). Включение микрофона также включает звук. &Deafen Self Выключить &звук Deafen yourself Выключить звук Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. Выключает звук. При выключении невозможно кого-либо слышать. Выключение звука также выключает микрофон. &Text-To-Speech Текст-в-&Речь Toggle Text-To-Speech Включить/Выключить Текст-в-Речь Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. Включает или выключает движок Text-To-Speech. Будут произносится сообщения, включенные в диалоговом окне конфигурации TTS. Display audio statistics Показывает аудио статистику Pops up a small dialog with information about your current audio input. Вызывает маленькую подсказку о Вашем текущем входящем звуке. Forcibly unlink plugin Принудительно выключить плагин This forces the current plugin to unlink, which is handy if it is reading completely wrong data. Позволяет выключить текущий плагин, что удобно при считываниии абсолютно неверных данных. Configure Mumble Настроить Mumble Allows you to change most settings for Mumble. Позволяет Вам изменять большинство настроек Mumble. Start the audio configuration wizard Запустить мастер настройки звука This will guide you through the process of configuring your audio hardware. Проведет Вас через процесс настройки звукового оборудования. &What's This? &Что это? Enter What's This? mode Войти в режим "Что это?" Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. Нажмите, чтобы войти в режим "Что это?". Ваш курсор превратится в знак вопроса. Нажмите на любой кнопке, пункте меню или зоне, чтобы получить пояснение. Information about Mumble Информация о Mumble Shows a small dialog with information and license for Mumble. Показывает маленькое диалоговое окно с информацией и лицензией для Mumble. Information about Speex Информация о Speex Shows a small dialog with information about Speex. Показывает небольшое диалоговое окно с информацией о Speex. Information about Qt Информация о Qt Shows a small dialog with information about Qt. Показывает небольшое диалоговое окно с информацией о Qt. Check for &Updates Проверить об&новления Check for new version of Mumble Проверить новую версию Mumble Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. Соединиться с веб-страницей Mumble, чтобы проверить доступность новой версии и уведомить Вас о ссылке для ее закачки. Sends a text message to all users in a channel. Отправить текстовое сообщение всем пользователям в канале. Configure certificates for strong authentication Настроить сертификаты для надежной авторизации This starts the wizard for creating, importing and exporting certificates for authentication against servers. Запустить мастер создания, импорта и экспорта сертификатов для авторизации на серверах. Register user on server Зарегистрировать пользователя на сервере This will permanently register the user on the server. Регистрирует пользователя на сервере. Add &Friend Добавить Д&руга Adds a user as your friend. Добавить пользователя в список друзей. This will add the user as a friend, so you can recognize him on this and other servers. Добавляет пользователя в список друзей так, что Вы можете распознавать его на этом и других серверах. &Remove Friend &Удалить Друга Removes a user from your friends. Удалить пользователя из списка друзей. This will remove a user from your friends list. Удаляет пользователя из списка друзей. &Update Friend &Обновить Друга Update name of your friend. Обновить имя Вашего друга. Your friend uses a different name than what is in your database. This will update the name. Ваш друг использует имя, отличное от того, что записано в списке друзей. Здесь можно обновить имя. Edit registered users list Редактировать список зарегистрированных пользователей This opens the editor for registered users, which allow you to change their name or unregister them. Открыть редактор зарегистрированных пользователей, в котором Вы можете изменить их имя или удалить. Add or remove text-based access tokens Добавить или удалить токен доступа &Minimal View &Минимальный вид Toggle minimal window modes Включает минимальный режим для окна This will toggle minimal mode, where the log window and menu is hidden. Включает минимальный режим, при котором окно лога и меню будут скрыты. You muted and deafened %1. Вы выключили звук и микрофон у %1. You unmuted and undeafened %1. Вы включили звук и микрофон у %1. You undeafened %1. Вы включили звук у %1. You suppressed %1. Вы выключили микрофон у %1. %1 muted and deafened by %2. %2 выключил звук и микрофон у %1. %1 unmuted and undeafened by %2. %2 включил звук и микрофон у %1. %1 undeafened by %2. %2 включил звук у %1. %1 suppressed by %2. %2 выключил микрофон у %1. %1 moved to %2. %1 перешёл в %2. %1 moved to %2 by %3. %3 переместил %1 в %2. %1 moved in from %2 by %3. %3 переместил %1 из %2. %1 is now muted and deafened. У %1 сейчас выключен звук и микрофон. Your account information can not be verified currently. Please try again later Информация о Вашей учётной записи не может быть проверена. Попробуйте позже Welcome message: %1 Приветствие: %1 Mumble: %1 Mumble: %1 You were denied %1 privileges in %2. Привилегия %1 была запрещена для Вас в %2. %3 was denied %1 privileges in %2. Для %3 привилегия %1 была запрещена в %2. Denied: Cannot modify SuperUser. Ошибка: невозможно изменить суперпользователя. Denied: Invalid channel name. Ошибка: недопустимое название канала. Denied: Text message too long. Ошибка: сообщение слишком длинное. Denied: Operation not permitted in temporary channel. Ошибка: данная операция запрещена во временном канале. You need a certificate to perform this operation. Вам необходим сертификат для осуществления данной операции. %1 does not have a certificate. У %1 нет сертификата. Invalid username: %1. Недопустимое имя пользователя: %1. Invalid username. Недопустимое имя пользователя. Channel is full. Канал переполнен. Channel nesting limit reached. Достигнут предел вложенности каналов. Channel count limit reached. Need to delete channels before creating new ones. Permission denied. Доступ запрещен. %1 connected and entered channel. %1 connected. %1 подключился. %1 is now muted. Микрофон выключен у %1. %1 is now unmuted. Микрофон включен у %1. Recording started Началась запись Recording stopped Запись остановилась %1 started recording. %1 начал запись. %1 stopped recording. %1 остановил запись. You revoked your priority speaker status. Вы сняли с себя приоритет разговора. You assumed priority speaker status. Вы получили приоритет разговора. %1 revoked your priority speaker status. %1 снял с Вас приоритет разговора. %1 gave you priority speaker status. %1 дал Вам приоритет разговора. You revoked priority speaker status for %1. Вы сняли с %1 приоритет разговора. You gave priority speaker status to %1. Вы дали %1 приоритет разговора. %1 revoked own priority speaker status. %1 снял с себя приоритет разговора. %1 assumed priority speaker status. %1 получил приоритет разговора. %1 revoked priority speaker status for %2. %1 снял с %2 приоритет разговора. %1 gave priority speaker status to %2. %1 дал приоритет разговора %2. You were unmuted and undeafened by %1. %1 включил у Вас звук и микрофон. You were muted by %1. %1 выключил у Вас микрофон. You were undeafened by %1. %1 включил у Вас звук. You were suppressed. You were suppressed by %1. У вас выключили микрофон. You were unsuppressed. Онемение снято с Вас. You were unsuppressed by %1. %1 включил у Вас микрофон. You joined %1. You moved %1 to %2. Вы переместили %1 в %2. %1 is recording %1 записывает %1 renamed to %2 by %3. Пользователь %3 переименовал %1 в %2. %1 disconnected. %1 покинул сервер. Server message from Сервер (Tree) (Дерево) (Channel) (Канал) (Private) %2%1: %3 %2%1: %3 Failed to load Opus, it will not be available for audio encoding/decoding. The server requests minimum client version %1 Сервер запрашивает минимальную версию клиента %1 The server requests positional audio be enabled. Сервер запрашивает, чтобы Позиционирование звука было включено. The server requests positional audio be disabled. Сервер запрашивает, чтобы Позиционирование звука было выключено. The server requests Push-to-Talk be enabled. Сервер запрашивает, чтобы Активация по кнопке была включена. The server requests Push-to-Talk be disabled. Сервер запрашивает, чтобы Активация по кнопке была выключена. You were unmuted by %1. %1 включил у Вас микрофон. You muted %1. Вы выключили микрофон у %1. You unsuppressed %1. Вы включили микрофон у %1. You unmuted %1. Вы включили микрофон у %1. %1 muted by %2. %2 включил микрофон у %1. %1 unsuppressed by %2. %2 включил микрофон у %1. %1 unmuted by %2. %2 включил микрофон у %1. Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. Не найдены соответствующие CELT-кодеки у других пользователей. Вы не сможете говорить со всеми пользователями. You were muted and deafened by %1. You were deafened by %1. %1 выключил у Вас звук и микрофон. You were kicked from the server by %1: %2. %1 выкинул Вас с сервера: %2. %3 was kicked from the server by %1: %2. %1 выкинул с сервера %3: %2. You were kicked and banned from the server by %1: %2. %1 выкинул и забанил Вас на сервере: %2. %3 was kicked and banned from the server by %1: %2. %1 выкинул %3 с сервера и забанил: %2. You were moved to %1 by %2. %2 переместил Вас в %1. %1 entered channel. %1 вошёл на канал. Server connection rejected: %1. В подключении отказано: %1. Denied: %1. Ошибка: %1. %1 renamed to %2. %1 переименован в %2. %1 left channel and disconnected. %1 покинул канал и отключился. Message from %1 Сообщение от %1 You have User Dragging set to "Do Nothing" so the user wasn't moved. You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. Вы установили режим "Не перетаскивать" в настройках, поэтому канал не может быть перемещен. Unknown Channel Drag mode in UserModel::dropMimeData. Неизвестный режим перетаскивания канала в UserModel::dropMimeData. Remote controlling Mumble: Удалённое управление Mumble: Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) -jn, --jackname Set custom Jack client name. --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status Invocation Вызов Error: No RPC command specified RPC Welcome to Mumble. Добро пожаловать в Mumble. Skipping version check in debug mode. Пропускать проверку версии в режиме отладки. Hide Frame Скрыть рамку Toggle showing frame on minimal window Переключает показ рамки в Минимальном режиме This will toggle whether the minimal window should have a frame for moving and resizing. Переключает, будет ли рамка у окна программы в Минимальном режиме для перемещения и изменения размера. &Unlink All Разорвать &все связи Reset the comment of the selected user. Удалить комментарий у выбранного пользователя. &Join Channel &Присоединиться к каналу View comment in editor Смотреть комментарий в редакторе Query server for connection information for user Запрос информации с сервера о соединении пользователя S&erver С&ервер &Self Са&м &Unlink Plugins О&тключить плагины Register yourself on the server Зарегистрироваться на сервере Change your avatar image on this server Изменить изображение аватара на сервере &Remove Avatar &Удалить Аватар Remove currently defined avatar image. Удалить текущее изображение аватара. Icon Toolbar Панель инструментов Change your own comment Изменить свой комментарий Recording Запись Priority Speaker Приоритетный разговор &Copy URL &Копировать URL Copies a link to this channel to the clipboard. Копирует ссылку на данный канал в буфер обмена. Ignore Messages Игнорировать сообщения Locally ignore user's text chat messages. Игнорировать локально сообщения пользователя. Silently drops all text messages from the user. Не показывать текстовые сообщения от пользователя. Edit ban list on server Редактировать список банов на сервере This lets you edit the server-side IP ban list. Позволяет изменить список банов по IP на сервере. &Filter on/off &Фильтр вкл/выкл Toggle the channel filter (Ctrl+F) Вкл/Выкл фильтр каналов (Ctrl+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. Включить или выключить фильтрование выбранных каналов. По умолчанию фильтруются все пустые каналы. Фильтрование дополнительных каналов можно включить в контекстном меню канала. Ctrl+F Ctrl+F &Hide Channel when Filtering &Скрывать канал при фильтрации Reset the avatar of the selected user. Удалить аватар выбранного пользователя. Locally adjust the user's speech volume. Opens a dialog with a volume slider. Use this on other users in the same room. &Developer &Hide Mumble Hides the main Mumble window. Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. Show the Developer Console Shows the Mumble Developer Console, where Mumble's log output can be inspected. &Connect... &Ban list... &Information... &Kick... &Ban... Local Volume Adjustment... Send &Message... &Add... &Remove... &Edit... Audio S&tatistics... &Settings... &Audio Wizard... Developer &Console... &About... About &Speex... About &Qt... &Certificate Wizard... &Register... Registered &Users... Change &Avatar... &Access Tokens... Reset &Comment... Reset &Avatar... View Comment... &Change Comment... R&egister... Show Shows the main Mumble window. Manual Manual Mumble Positional Audio Position X Y Z m Heading Azimuth Elevation ° Meta data Context Identity Set State Linked Activated Unhinge NetworkConfig Network Сеть Updates are mandatory when using snapshot releases. Обновления обязательны при использовании тестовых релизов. Connection Подключение Use TCP compatibility mode Use TCP compatability mode Использовать режим TCP cовместимости <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). <b>Включить режим TCP совместимости</b>.<br />Mumble будет использовать только TCP для связи с сервером. Это увеличит нагрузку и вызовет потерю пакетов, что создаст заметные паузы в соединении. Может быть использовано только если Вы не можете использовать протоколы по умолчанию (UDP для голоса и TCP для управления). Reconnect when disconnected Восстановить связь при обрыве <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. <b>Восстановить связь при обрыве</b>.<br />Mumble будет пытаться автоматически восстановить связь через 10 секунд в случае обрыва связи с сервером. Reconnect automatically Переподключаться автоматически Proxy Прокси Type Тип Type of proxy to connect through Тип прокси для подключения Direct connection Прямое соединение HTTP(S) proxy HTTP(S)-прокси SOCKS5 proxy SOCKS5 прокси Hostname Адрес Hostname of the proxy Адрес прокси-сервера Force TCP mode Использовать TCP режим Enable QoS to prioritize packets Включить QoS для назначения приоритета пакетам This will enable QoS, which will attempt to prioritize voice packets over other traffic. Включить службу QoS, которая попытается назначить приоритет пакетам с голосовыми данными перед остальным трафиком. Use Quality of Service Использовать QoS Don't send certificate to server and don't save passwords. (Not saved). Не передавать данные сертификата и не сохранять пароли. (Настройка не сохраняется). <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> <b>Выключит отправку идентификационной информации на сервер.</b><p>Клиент не будет идентифицировать себя с помощью сертификата, даже если он имеется, и не будет кэшировать пароли для соединений. Это тестовая опция и она не сохраняется.</p> Suppress certificate and password storage Скрывать сертификат и хранилище паролей <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>Тип прокси для подключения.</b><br />Mumble будет использовать прокси для всех исходящих соединений. Внимание: туннелирование через прокси заставит Mumble использовать режим совместимости TCP, что приведёт к передаче голосовых данных по каналу контроля. <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. <b>Арес прокси-сервера.</b><br />Это поле задаёт адрес прокси, которую Вы хотите использовать для туннелирования сетевого трафика. Port Порт Port number of the proxy Номер порта прокси-сервера <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. <b>Номер порта прокси.</b><br />Это поле задаёт номер порта прокси, на который прокси-сервер ожидает входящие соединения. Username Логин Username for proxy authentication Логин для авторизации на прокси-сервере <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>Логин для авторизации на прокси-сервере</b><br />Здесь указывается имя пользователя для авторизации на прокси. Если прокси не поддерживает авторизацию или Вы хотите подключиться анонимно, оставьте поле пустым. Password Пароль Password for proxy authentication Пароль для авторизации на прокси-сервере <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>Пароль для авторизации на прокси-сервере</b><br />Здесь указывается пароль для авторизации на прокси. Если прокси не поддерживает авторизацию или Вы хотите подключиться анонимно, оставьте поле пустым. Mumble services Службы Mumble Check for new releases of Mumble automatically. Автоматически проверять наличие новых версий Mumble. This will check for new releases of Mumble every time you start the program, and notify you if one is available. Проверять наличие новых версий Mumble каждый раз при запуске программы и уведомлять, если доступна новая версия. Check for application updates on startup Проверять обновления при запуске Check for new releases of plugins automatically. Автоматически проверять обновления плагинов. This will check for new releases of plugins every time you start the program, and download them automatically. Проверять наличие новых версий плагинов каждый раз при запуске программы и автоматически скачивать их. <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. <b>Отправлять анонимную статистику.</b><br />Команда разработчиков Mumble очень мала и нуждается в информации о том, на чём нужно сосредоточить своё внимание. Когда Вы отправляете немного статистики, Вы помогаете проекту определить на чём нужно сосредоточить своё внимание. Submit anonymous statistics to the Mumble project Отправлять анонимную статистику разработчикам Mumble Submit anonymous statistics Отправлять анонимную статистику Reconnect to last used server when starting Mumble Подключаться к последнему использованному серверу при запуске Mumble Reconnect to last server on startup Подключаться к последнему серверу при запуске Download plugin and overlay updates on startup Загружать обновления плагинов и табло при запуске Privacy Prevent OS information being sent to Mumble servers and web servers <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. Do not send OS information to Mumble servers and web servers Overlay Silent Молчание Talking Говорит Whisper Шепот Shout Крик Channel Канал Failed to create communication with overlay at %2: %1. No overlay will be available. Невозможно соединиться с табло на %2: %1. Табло будет недоступно. OverlayClient Filter Фильтр Only talking Только говорящие Talking and recently active Общаются и активны All in current channel Все из этого канала All in linked channels Все из связанных каналов Always show yourself Всегда показывать себя Configure recently active time (%1 seconds)... Настройка постактивного времени (%1 секунд)... Columns Колонок Sort Сортировка Alphabetically По алфавиту Last state change Последнее изменение состояния Edit... Редактировать... Reset Zoom Сбросить масштаб Configure recently active time Настройка постактивного времени Amount of seconds users remain active after talking: Количество секунд, которое пользователи остаются активными после разговора: OverlayConfig To move the users, drag the little red dot. Чтобы переместить пользователей, перетащите маленький красный кружок. To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. Чтобы изменить размер пользователей - покрутите колесом мыши над ними. For more options, right click a user. For more options, rightclick a user. Для других настроек правый клик на пользователе. Launcher Filter Overlay Табло Choose executable Выберите выполняемый файл Choose application Выберите приложение Choose path Load Overlay Presets Загрузить предустановки табло Mumble overlay presets (*.mumblelay) Предустановки табло Mumble (*.mumblelay) Save Overlay Presets Сохранить предустановки табло Options Настройки Enable overlay. Включить табло. Enable Overlay Включить табло This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. Включает или выключает табло. При включенном табло Mumble должен быть запущен перед приложением (игрой), в котором оно необходимо.<br />Если Mumble будет запущен после другого приложения (игры) или Вы выключите эту опцию, когда приложение запущено, необходимо будет перезапустить приложение для включения или выключения табло. Layout Стиль Blacklist Черный список Whitelist Белый список Uninstall Overlay Удалить табло Overlay Installation Установка табло Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. Mumble обнаружил, что поддержка табло не установлена. Нажмите на кнопку, чтобы установить табло. Install Mumble Overlay Установить табло Mumble Overlay Upgrade Обновление табло Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. Mumble обнаружил старую версию табло. Чтобы обновить эти файлы до их последних версий, нажмите на кнопку. Upgrade Mumble Overlay Обновить табло Mumble Display a frame counter in the overlay Показывать FPS в табло Show FPS counter Показывать FPS Load an overlay preset from file Загрузить предустановки табло из файла Load… Загрузить... Save your overlay settings to file Сохранить настройки табло в файл Save… Сохранить... Set the overlay font. Установить шрифт в табло. Set the overlay text color. Установить цвет текста в табло. Color Цвет Remove Удалить Font Шрифт FPS and Clock Display FPS и Часы Display a clock in the overlay showing the current local time (system time). Часы в табло показывают текущее местное время (время системы). Show Clock Показать Часы Overlay Exceptions Overlay Exception Mode Allowed launchers Add Allowed programs Allowed paths Blacklisted programs OverlayEditor State Состояние User is not talking Пользователь молчит Passive Молчит User is talking in your channel or a linked channel Пользователь говорит в Вашем канале или связанном канале Talking Говорит User is whispering to you privately Пользователь шепчет Вам Private Whisper Шепчет User is shouting to your channel Пользователь кричит в Ваш канал Channel Whisper Шепчет в канал Zoom Размер Zoom Factor Размер Enabled Elements Включены Элементы User avatar, chosen by each user Аватар пользователя Avatar Аватар User's name Имя пользователя Username Логин Name of user's channel, if outside your current channel Название канала пользователя, если он не в Вашем текущем канале Channel Канал Muted or deafened Выключензвук или микрофон Mute state Выключен микрофон Bounding box, automatically shrunk to minimum size to contain all visible elements Окружающая рамка, в которой будут находится все видимые элементы Bounding box Рамка Overlay Editor Редактор табло OverlayEditorScene Layout preset Стиль представления Large square avatar Большой квадратный аватар Avatar and Name Аватар и Имя User Opacity Прозрачность пользователя %1% %1% Object Opacity Прозрачность объекта Alignment Выравнивание Left Слева Center По центру Right Справа Top По верху Bottom По низу Color... Цвет... Font... Шрифт... Bounding box Рамка Pen width Толщина линии Padding Отступы Pen color Цвет линии Fill color Цвет заливки Pick pen color Выбрать цвет линии Pick fill color Выбрать цвет заливки Pick color Выбрать цвет Pick font Выбрать шрифт PluginConfig Plugins Плагины Plugin has no configure function. Плагин не имеет функции конфигурирования. Plugin has no about function. У плагина нет функции информации. Options Настройки Enable plugins and transmit positional information Включить плагины и передать информацию о позиции This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. Это позволяет плагинам для поддеживаемых игр определять Ваше положение в игре и передавать его с каждым голосовым пакетом. Это позволит другим игрокам слышать Ваш голос в игре, как будто он исходит от Вашего персонажа. Link to Game and Transmit Position Связаться с игрой и передать позицию Reloads all plugins Перезагрузить все плагины This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. Пересканирует и перезагружает плагины. Используйте, если Вы только что добавили или изменили плагин в папке с плагинами. &Reload plugins &Перезагрузить плагины Information about plugin Информация о плагине This shows a small information message about the plugin. Покажет небольшую справку о плагине. &About &Информация Show configuration page of plugin Показать страницу настроек плагина This shows the configuration page of the plugin, if any. Показывает страницу настроек плагина, если есть. &Configure &Настройки Name Имя Enabled Включено Plugins Skipping plugin update in debug mode. Пропустить обновление плагина в режиме отладки. Downloaded new or updated plugin to %1. Загрузка нового или обновленного плагина в %1. Failed to install new plugin to %1. Ошибка при установке нового плагина в %1. %1 lost link. %1 потерял связь. %1 linked. %1 подключен. PortAudioSystem Default Device Устройство по умолчанию PulseAudioSystem Default Input Вход по умолчанию Default Output Выход по умолчанию QApplication Failed to restart mumble Ошибка перезапуска Mumble. Mumble failed to restart itself. Please restart it manually. Ошибка перезапуска Mumble. Сделайте это самостоятельно. RichTextEditor Failed to load image Ошибка при загрузке изображения Image file too large to embed in document. Please use images smaller than %1 kB. Файл изображения слишком большой. Используйте изображения менее %1 кб. Message is too long. Сообщение слишком длинное. Display Вид Source Text Исходный код &Bold &Жирный Ctrl+B Ctrl+B &Italic &Курсив Italic Курсив Ctrl+I Ctrl+I Underline Подчеркнутый Ctrl+U Ctrl+U Color Цвет Insert Link Вставить ссылку Ctrl+L Ctrl+L Insert Image Вставить изображение RichTextEditorLink Add Link Добавить гиперссылку URL URL Text Текст ServerHandler Unable to resolve hostname Server is not responding to TCP pings UDP packets cannot be sent to or received from the server. Switching to TCP mode. UDP пакеты не могут быть посланы или получены от сервера. Включен TCP режим. UDP packets cannot be sent to the server. Switching to TCP mode. UDP пакеты не могут быть посланы к серверу. Включен TCP режим. UDP packets cannot be received from the server. Switching to TCP mode. UDP пакеты не могут быть получены от сервера. Включен TCP режим. UDP packets can be sent to and received from the server. Switching back to UDP mode. UDP пакеты могут быть посланы или получены от сервера. Включен UDP режим. Connection timed out Время соединения вышло ServerView Favorite Избранные LAN Локальная сеть Public Internet Интернет Unknown Africa Африка Asia Азия North America Северная Америка South America Южная Америка Europe Европа Oceania Океания ShortcutActionWidget Unassigned Не назначено ShortcutDelegate On Вкл Off Выкл Toggle Переключить Unassigned Не назначено ShortcutKeyWidget Press Shortcut Нажмите клавишу ShortcutTargetDialog Root Корень Parent Родительский Current Текущий Subchannel #%1 Подканал #%1 ShortcutTargetWidget ... ... , , Root Корень Parent Родительский Current Текущий Subchannel #%1 Подканал #%1 Invalid Неверный Empty <Empty> <Пусто> ShortcutToggleWidget Off Выкл Toggle Переключить On Вкл TextMessage Enter text Введите текст If checked the message is recursively sent to all subchannels Если отмечено, сообщение будет отправлено во все подканалы Send recursively to subchannels Отправить во все подканалы Tokens Empty Token Пустой Токен Mumble - Access Tokens Mumble - Токен доступа List of access tokens on current server Список токенов доступа для данного сервера <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. <b>Это редкатируемый список токенов доступа для данного сервера.</b> <br /> Токен доступа - это текст, который будет использован как пароль для простого управления доступом в каналы. Mumble запомнит токен, который Вы ввели и отправит его заново на сервер при следующем подключении, так что Вам не потребуется вводить его снова. Add a token Добавить токен &Add &Добавить Remove a token Удалить токен &Remove &Удалить UserEdit Registered Users Зарегистрированные пользователи Remove Удалить Rename Переименовать Who are you looking for? Кого ищем? Days Дней Weeks Недель Months Месяцев Years Лет: Inactive for Неактивен Registered users: %n account(s) Зарегистрировано: %n пользовательЗарегистрировано: %n пользователяЗарегистрировано: %n пользователейЗарегистрировано: %n пользователей UserInformation User Information Информация о пользователе Connection Information Общая информация Version Версия OS ОС Certificate Сертификат IP Address IP адрес CELT Versions Версия CELT Details... Детали... Ping Statistics Статистика пинга Pings received Пакетов получено Average ping Средний пинг TCP (Control) TCP (Управление) UDP (Voice) UDP (Голос) UDP Network statistics Статистика UDP соединения Good Хорошие Late С запозданием Lost Потерянные Resync Реcинхронизированные From Client от Клиента To Client к Клиенту Connection time Время соединения %1w %1 нед %1d %1 дн %1h %1 ч %1m %1 м %1s %1 с , , %1 (%2) %1.%2.%3 (%4) %1 (%2) Supported Поддерживается Not Supported Не поддерживается Not Reported Неизвестно %1 online (%2 idle) %1 онлайн (%2 простой) %1 online %1 онлайн %1 kbit/s %1 кбит/с Bandwidth GroupBox Канал Bandwidth Label Канал Ping deviation Отклонение UserListModel Nick Ник Inactive days Неактивен дней Last channel Последний канал Last seen: %1 Посл. раз заходил: %1 Never Никогда Channel ID: %1 UserLocalVolumeDialog Local volume for other users Местная громкость для других пользователей <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. Adjusting local volume for %1 Местная громкость установлена на %1 dB дБ <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: Пользователь, подключённый к серверу. Иконка слева от пользователя показывает говорит он или нет: Talking to your channel. Говорит в Ваш канал. Shouting directly to your channel. Whispering directly to your channel. Кричит напрямую в Ваш канал. Whispering directly to you. Шепчет прямо вам. Not talking. Молчит. This is a channel on the server. The icon indicates the state of the channel: Канал на сервере. Иконка показывает состояние канала: Your current channel. Ваш текущий канал. A channel that is linked with your channel. Linked channels can talk to each other. Канал, который связан с Вашим каналом. Связанные каналы могут говорить друг с другом. A channel on the server that you are not linked to. Канал на сервере, с которым не связан Ваш канал. This shows the flags the user has on the server, if any: Флаги пользователя на сервере, если есть: On your friend list В вашем списке друзей Authenticated user Зарегистрированный пользователь Muted (manually muted by self) Микрофон выключен (вручную, сам) Muted (manually muted by admin) Микрофон выключен (вручную, администратором) Muted (not allowed to speak in current channel) Микрофон выключен (не имеет права говорить в текущем канале) Muted (muted by you, only on your machine) Микрофон выключен (Вами, только для вашего компьютера) Muted (push-to-mute) Deafened (by self) Звук выключен (собой) Deafened (by admin) Звук выкл (администратором) User has a new comment set (click to show) У пользователя новый комментарий (нажмите для просмотра) User has a comment set, which you've already seen. (click to show) У пользователя комментарий, который Вы уже читали (нажмите для просмотра) Ignoring Text Messages Игнорируются текстовые сообщения This shows the flags the channel has, if any: Флаги канала, если есть: Channel has a new comment set (click to show) У канала новый комментарий (нажмите для просмотра) Channel has a comment set, which you've already seen. (click to show) У канала комментарий, который Вы уже читали (нажмите для просмотра) Channel will be hidden when filtering is enabled Канал будет скрыт при включённом фильтре Name Имя Flags Флаги Are you sure you want to drag this user? Are you sure you want to drag this channel? Вы уверены, что хотите перетащить этот канал? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. Автоматическое перемещение невозможно - сбросьте нумерацию каналов или настройте вручную. VersionCheck Upgrade Mumble Обновить Mumble A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? Обнаружена новая версия Mumble, которая была автоматически загружена. Рекомендуется обновить эту версию или установить последний стабильный релиз. Хотите запустить программу установки сейчас? Failed to launch snapshot installer. Ошибка при запуске установщика тестовой сборки. Corrupt download of new version detected. Automatically removed. Обнаружены повреждения при загрузке новой версии. Она была автоматически удалена. Downloading new snapshot from %1 to %2 Загружается новая тестовая сборка из %1 в %2 Failed to write new version to disk. Failed to write new version to disc. Невозможно записать новую версию на диск. Mumble failed to retrieve version information from the central server. Mumble не удалось получить информацию об обновлениях с центрального сервера. ViewCert Certificate Chain Details Детали цепочки сертификатов Certificate chain Цепочка сертификатов Certificate details Информация о сертификате Common Name Organization Subunit Country Locality State Valid from: %1 Действует с: %1 Valid to: %1 Истекает: %1 Serial: %1 Серийный номер: %1 Public Key: %1 bits %2 Публичный ключ: %1 бит %2 RSA RSA DSA DSA Digest (SHA-1): %1 Контрольная сумма (SHA-1): %1 Digest (SHA-256): %1 Email: %1 E-mail: %1 DNS: %1 DNS: %1 Issued by: Кем выдан: Unit Name VoiceRecorder Recorder failed to create directory '%1' Невозможно создать директорию '%1' для записи Recorder failed to open file '%1' Невозможно открыть файл '%1' для записи .wav - Uncompressed .wav - Несжатый .ogg (Vorbis) - Compressed .ogg (Vorbis) - Сжатый .au - Uncompressed .au - Несжатый .flac - Lossless compressed .flac - Сжатый без потерь VoiceRecorderDialog Recorder Запись Control Управление 00:00:00 00:00:00 &Start &Старт S&top С&топ Mode Режим Multichannel Многоканальный Output Вывод Output format Исходящий формат Target directory Целевая папка Filename Имя файла &Browse... &Обзор... Valid variables are: Возможные переменные: Inserts the user's name Вставляет имя пользователя Inserts the current date Вставляет текущую дату Inserts the current time Вставляет текущее время Inserts the hostname Вставляет адрес сервера Recorder still running Запись продолжается Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? Закрыть программу записи без останова и потерять незаписанный звук? Unable to start recording. Not connected to a server. Невозможно начать запись. Нет подключения к серверу. The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. Сервер, к которому Вы подключены в данный момент версии 1.2.2 или ниже. По соображениям конфиденциальности, запись на серверах версий ниже 1.2.3 невозможна.<br />Свяжитесь с администратором сервера для дополнительной информации. There is already a recorder active for this server. Запись уже производится на данном сервере. Please select a recording format. Установите формат записи. Stopping Останов Select target directory Выберите целевую папку Downmix Микшированный WASAPIInput Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone. WASAPISystem Default Device Устройство по умолчанию qwPTTButtonWidget Mumble PTT Mumble Push to talk Говорить mumble-1.3.4/src/mumble/Log_unix.cpp0000664000175000017500000000450614010707273017206 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "Log.h" #include "MainWindow.h" #include "Settings.h" // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" void Log::postNotification(MsgType mt, const QString &plain) { // Message notification with balloon tooltips QString qsIcon; switch (mt) { case DebugInfo: case CriticalError: qsIcon = QLatin1String("dialog-error"); break; case Warning: qsIcon = QLatin1String("dialog-warning"); break; case TextMessage: qsIcon = QLatin1String("accessories-text-editor"); break; default: qsIcon = QLatin1String("dialog-information"); break; } #ifdef USE_DBUS QDBusMessage response; QVariantMap hints; hints.insert(QLatin1String("desktop-entry"), QLatin1String("mumble")); { QDBusInterface kde(QLatin1String("org.kde.VisualNotifications"), QLatin1String("/VisualNotifications"), QLatin1String("org.kde.VisualNotifications")); if (kde.isValid()) { QList args; args.append(QLatin1String("mumble")); args.append(uiLastId); args.append(QString()); args.append(QLatin1String("mumble")); args.append(msgName(mt)); args.append(plain); args.append(QStringList()); args.append(hints); args.append(5000); response = kde.callWithArgumentList(QDBus::AutoDetect, QLatin1String("Notify"), args); } } if (response.type()!=QDBusMessage::ReplyMessage || response.arguments().at(0).toUInt()==0) { QDBusInterface gnome(QLatin1String("org.freedesktop.Notifications"), QLatin1String("/org/freedesktop/Notifications"), QLatin1String("org.freedesktop.Notifications")); if (gnome.isValid()) response = gnome.call(QLatin1String("Notify"), QLatin1String("Mumble"), uiLastId, qsIcon, msgName(mt), plain, QStringList(), hints, -1); } if (response.type()==QDBusMessage::ReplyMessage && response.arguments().count() == 1) { uiLastId = response.arguments().at(0).toUInt(); } else { #else if (true) { #endif postQtNotification(mt, plain); } } mumble-1.3.4/src/mumble/Overlay_win.cpp0000664000175000017500000002625714010707273017727 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "Overlay.h" #include "User.h" #include "Channel.h" #include "OverlayConfig.h" #include "MainWindow.h" #include "Global.h" #include "MumbleApplication.h" #include "Overlay_win.h" #include "../../overlay/overlay_exe/overlay_exe.h" // Used by the overlay to detect whether we injected into ourselves. // // A similar declaration can be found in mumble_exe's Overlay.cpp, // for the overlay's self-detection checks to continue working in a // mumble_app.dll world. extern "C" __declspec(dllexport) void mumbleSelfDetection() {}; // Determine if the current Mumble client is able to host // x64 programs. // // If we're on x86, we use use the IsWoW64Process function // to determine this. If we're on x64, we already know we're // capable, so we simply return TRUE. static bool canRun64BitPrograms() { #if defined(_M_X64) return TRUE; #elif defined(_M_IX86) typedef BOOL (WINAPI *IsWow64ProcessPtr)(HANDLE, BOOL *); IsWow64ProcessPtr wow64check = (IsWow64ProcessPtr)GetProcAddress(GetModuleHandle(L"kernel32"), "IsWow64Process"); if (wow64check) { BOOL isWoW64 = FALSE; wow64check(GetCurrentProcess(), &isWoW64); return isWoW64; } return FALSE; #endif } OverlayPrivateWin::OverlayPrivateWin(QObject *p) : OverlayPrivate(p) , m_helper_enabled(true) , m_helper64_enabled(true) , m_mumble_handle(0) , m_active(false) { // Acquire a handle to ourselves and duplicate it. We duplicate it because // want it to be inheritable by our helper processes, and the handle returned // by GetCurrentProcess is not inheritable. Duplicating it makes it inheritable. // This allows our helper processes to access the handle. // // The helper processes need a handle to us, their parent, to be able to listen // detect when our process dies. // // The value of the handle is passed as an argument to the helper processes via // the command line as a number. The HANDLE type in Windows is typedef'd to LPVOID, // but for handles that are supposed to be shared between processes (like a process // handle that we are using), only the lower 32-bits of the HANDLE are considered: // // "When sharing a handle between 32-bit and 64-bit applications, only the lower // 32 bits are significant [...]" // // from https://msdn.microsoft.com/en-us/library/aa384203.aspx HANDLE curproc = GetCurrentProcess(); if (!DuplicateHandle(curproc, curproc, curproc, &m_mumble_handle, 0, TRUE, DUPLICATE_SAME_ACCESS)) { qFatal("OverlayPrivateWin: unable to duplicate handle to the Mumble process."); return; } m_helper_exe_path = QString::fromLatin1("%1/mumble_ol_helper.exe").arg(MumbleApplication::instance()->applicationVersionRootPath()); m_helper_exe_args << QString::number(OVERLAY_MAGIC_NUMBER) << QString::number(reinterpret_cast(m_mumble_handle)); m_helper_process = new QProcess(this); connect(m_helper_process, SIGNAL(started()), this, SLOT(onHelperProcessStarted())); connect(m_helper_process, SIGNAL(error(QProcess::ProcessError)), this, SLOT(onHelperProcessError(QProcess::ProcessError))); connect(m_helper_process, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(onHelperProcessExited(int, QProcess::ExitStatus))); m_helper_restart_timer = new QTimer(this); m_helper_restart_timer->setSingleShot(true); connect(m_helper_restart_timer, SIGNAL(timeout()), this, SLOT(onDelayedRestartTimerTriggered())); if (!g.s.bOverlayWinHelperX86Enable) { qWarning("OverlayPrivateWin: mumble_ol_helper.exe (32-bit overlay helper) disabled via 'overlay_win/enable_x86_helper' config option."); m_helper_enabled = false; } m_helper64_exe_path = QString::fromLatin1("%1/mumble_ol_helper_x64.exe").arg(MumbleApplication::instance()->applicationVersionRootPath()); m_helper64_exe_args = m_helper_exe_args; m_helper64_process = new QProcess(this); connect(m_helper64_process, SIGNAL(started()), this, SLOT(onHelperProcessStarted())); connect(m_helper64_process, SIGNAL(error(QProcess::ProcessError)), this, SLOT(onHelperProcessError(QProcess::ProcessError))); connect(m_helper64_process, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(onHelperProcessExited(int, QProcess::ExitStatus))); m_helper64_restart_timer = new QTimer(this); m_helper64_restart_timer->setSingleShot(true); connect(m_helper64_restart_timer, SIGNAL(timeout()), this, SLOT(onDelayedRestartTimerTriggered())); if (!canRun64BitPrograms()) { qWarning("OverlayPrivateWin: mumble_ol_helper_x64.exe (64-bit overlay helper) disabled because the host is not x64 capable."); m_helper64_enabled = false; } else if (!g.s.bOverlayWinHelperX64Enable) { qWarning("OverlayPrivateWin: mumble_ol_helper_x64.exe (64-bit overlay helper) disabled via 'overlay_win/enable_x64_helper' config option."); m_helper64_enabled = false; } } OverlayPrivateWin::~OverlayPrivateWin() { m_active = false; if (!CloseHandle(m_mumble_handle)) { qFatal("OverlayPrivateWin: unable to close Mumble process handle."); return; } // Remove all signals, so they don't // interfere with our calls to waitForFinished // below. m_helper_process->disconnect(); m_helper64_process->disconnect(); m_helper_process->terminate(); m_helper64_process->terminate(); m_helper_process->waitForFinished(); m_helper64_process->waitForFinished(); } void OverlayPrivateWin::startHelper(QProcess *helper) { if (helper->state() == QProcess::NotRunning) { if (helper == m_helper_process) { helper->start(m_helper_exe_path, m_helper_exe_args); m_helper_start_time.restart(); } else if (helper == m_helper64_process) { helper->start(m_helper64_exe_path, m_helper64_exe_args); m_helper64_start_time.restart(); } else { qFatal("OverlayPrivateWin: invalid helper passed to startHelper()."); } } else { qWarning("OverlayPrivateWin: startHelper() called while process is already running. skipping."); } } void OverlayPrivateWin::setActive(bool active) { if (m_active != active) { m_active = active; if (m_active) { if (m_helper_enabled) { startHelper(m_helper_process); } if (m_helper64_enabled) { startHelper(m_helper64_process); } } else { if (m_helper_enabled) { m_helper_process->terminate(); } if (m_helper64_enabled) { m_helper64_process->terminate(); } } } } static const char *exitStatusString(QProcess::ExitStatus exitStatus) { switch (exitStatus) { case QProcess::NormalExit: return "normal exit"; case QProcess::CrashExit: return "crash"; } return "unknown"; } static const char *processErrorString(QProcess::ProcessError processError) { switch (processError) { case QProcess::FailedToStart: return "process failed to start"; case QProcess::Crashed: return "process crashed"; case QProcess::Timedout: return "process wait operation timed out"; case QProcess::WriteError: return "an error occurred when attempting to write to the process"; case QProcess::ReadError: return "an error occurred when attempting to read from the process"; case QProcess::UnknownError: return "an unknown error occurred"; } return "unknown"; } void OverlayPrivateWin::onHelperProcessStarted() { QProcess *helper = qobject_cast(sender()); QString path; if (helper == m_helper_process) { path = m_helper_exe_path; } else if (helper == m_helper64_process) { path = m_helper64_exe_path; } else { qFatal("OverlayPrivateWin: unknown QProcess found in onHelperProcessStarted()."); } PROCESS_INFORMATION *pi = helper->pid(); qWarning("OverlayPrivateWin: overlay helper process '%s' started with PID %llu.", qPrintable(path), static_cast(pi->dwProcessId)); } void OverlayPrivateWin::onHelperProcessError(QProcess::ProcessError processError) { QProcess *helper = qobject_cast(sender()); QString path; if (helper == m_helper_process) { path = m_helper_exe_path; } else if (helper == m_helper64_process) { path = m_helper64_exe_path; } else { qFatal("OverlayPrivateWin: unknown QProcess found in onHelperProcessError()."); } qWarning("OverlayPrivateWin: an error occured for overlay helper process '%s': %s", qPrintable(path), processErrorString(processError)); } void OverlayPrivateWin::onHelperProcessExited(int exitCode, QProcess::ExitStatus exitStatus) { QProcess *helper = qobject_cast(sender()); QString path; qint64 elapsedMsec = 0; QTimer *restartTimer = NULL; if (helper == m_helper_process) { path = m_helper_exe_path; elapsedMsec = m_helper_start_time.elapsed(); restartTimer = m_helper_restart_timer; } else if (helper == m_helper64_process) { path = m_helper64_exe_path; elapsedMsec = m_helper64_start_time.elapsed(); restartTimer = m_helper64_restart_timer; } else { qFatal("OverlayPrivateWin: unknown QProcess found in onHelperProcessExited()."); } const char *helperErrString = OverlayHelperErrorToString(static_cast(exitCode)); qWarning("OverlayPrivateWin: overlay helper process '%s' exited (%s) with status code %s.", qPrintable(path), exitStatusString(exitStatus), helperErrString ? helperErrString : qPrintable(QString::number(exitCode))); // If the helper process exited while we're in 'active' // mode, restart it. if (m_active) { // If the helper was only recently started, be // a little more patient with restarting it. // We could be hitting a crash bug in the helper, // and we don't want to do too much harm in that // case by spawning thousands of processes. qint64 cooldownMsec = (qint64) g.s.iOverlayWinHelperRestartCooldownMsec; if (elapsedMsec < cooldownMsec) { qint64 delayMsec = cooldownMsec - elapsedMsec; qWarning("OverlayPrivateWin: waiting %llu seconds until restarting helper process '%s'. last restart was %llu seconds ago.", (unsigned long long) delayMsec/1000ULL, qPrintable(path), (unsigned long long) elapsedMsec/1000ULL); if (!restartTimer->isActive()) { restartTimer->start(delayMsec); } } else { startHelper(helper); } } } void OverlayPrivateWin::onDelayedRestartTimerTriggered() { if (!m_active) { return; } QTimer *timer = qobject_cast(sender()); QProcess *helper = NULL; if (timer == m_helper_restart_timer) { helper = m_helper_process; } else if (timer == m_helper64_restart_timer) { helper = m_helper64_process; } else { qFatal("OverlayPrivateWin: unknown timer found in onDelayedRestartTimerTriggered()."); } if (helper->state() == QProcess::NotRunning) { startHelper(helper); } } void Overlay::platformInit() { d = new OverlayPrivateWin(this); } void Overlay::setActiveInternal(bool act) { if (d) { // Only act if the private instance has been created already static_cast(d)->setActive(act); } } bool OverlayConfig::supportsInstallableOverlay() { return false; } bool OverlayConfig::isInstalled() { return true; } bool OverlayConfig::needsUpgrade() { return false; } bool OverlayConfig::installFiles() { return false; } bool OverlayConfig::uninstallFiles() { return false; } mumble-1.3.4/src/mumble/mumble_translations.qrc0000664000175000017500000000241214010707274021502 0ustar builderbuilder mumble_ar.qm mumble_be.qm mumble_bg.qm mumble_br.qm mumble_cs.qm mumble_cy.qm mumble_da.qm mumble_de.qm mumble_el.qm mumble_en.qm mumble_en_GB.qm mumble_eo.qm mumble_es.qm mumble_eu.qm mumble_fa_IR.qm mumble_fi.qm mumble_fr.qm mumble_gl.qm mumble_he.qm mumble_hi.qm mumble_hu.qm mumble_it.qm mumble_ja.qm mumble_ko.qm mumble_lt.qm mumble_nl.qm mumble_no.qm mumble_pl.qm mumble_pt_BR.qm mumble_pt_PT.qm mumble_ro.qm mumble_ru.qm mumble_sk.qm mumble_sv.qm mumble_te.qm mumble_th.qm mumble_tr.qm mumble_uk.qm mumble_vi.qm mumble_zh_CN.qm mumble_zh_HK.qm mumble_zh_TW.qm mumble-1.3.4/src/mumble/mumble_th.ts0000664000175000017500000115250414010707274017246 0ustar builderbuilder ACLEditor Deny ห้าม Allow อนุญาต Allow %1 อนุญาต %1 Deny %1 ปฏิเสธ %1 Mumble - Add channel Mumble - เพิ่มช่องรายการ Default server value Failed: Invalid channel ล้มเหลว: ช่องรายการไม่ถูกต้อง Mumble - Edit %1 Mumble - แก้ไข %1 ID: %1 ID: %1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 นี่เป็นการให้สิทธื์ %1 ถ้ากำหนดสิทธิ์เป็นทั้งอนุญาตและไม่อนุญาต จะถูกบังคับเป็นไม่อนุญาต <br />%2 Channel must have a name ช่องรายการจะต้องมีชื่อ This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 นี่เป็นการถอนสิทธื์ %1 ถ้ากำหนดสิทธิ์เป็นทั้งอนุญาตและไม่อนุญาต จะถูกบังคับเป็นไม่อนุญาต <br />%2 Dialog กล่องข้อความ Name ชื่อ Enter the channel name here. กรอกชื่อของช่องรายการที่นี่ Description คำอธิบาย Password รหัสผ่าน Enter the channel password here. กรอกรหัสผ่านของช่องรายการที่นี่ Check to create a temporary channel. เลือกเพื่อสร้างช่องรายการแบบชั่วคราว Temporary ชั่วคราว <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. Position ตำแหน่ง &Groups &กลุ่ม Group กลุ่ม List of groups รายการกลุ่ม Remove selected group เอารายการที่เลือกออก Remove เอาออก Inherit group members from parent สืบทอดสมาชิกในกลุ่มจากต้นทาง Inherit สืบทอด Make group inheritable to sub-channels ทำให้กลุ่มสามารถสืบทอดไปยังช่องรายการย่อยได้ Inheritable สืบทอดได้ Group was inherited from parent channel กลุ่มถูกสืบทอดจากช่องรายการต้นทาง Inherited ถูกสืบทอด Members สมาชิก Add เพิ่ม Add member to group เพิ่มสมาชิกลงในกลุ่ม Remove member from group เอาสมาชิกออกจากกลุ่ม &ACL &ACL Active ACLs ACL ที่ใช้งาน List of entries รายการ Inherit ACL of parent? สืบทอด ACL จากต้นทางหรือไม่? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. Inherit ACLs สืบทอด ACL Move entry up เลื่อนรายการขึ้น This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. &Up Move entry down This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. &Down Add new entry This adds a new entry, initially set with no permissions and applying to all. &Add Remove entry This removes the currently selected entry. &Remove Context Entry should apply to this channel. Entry should apply to this channel This makes the entry apply to this channel. Applies to this channel Entry should apply to sub-channels. Add new group <b>Add</b><br/> Add a new group. Inherited members Contains the list of members added to the group by this channel. Contains a list of members whose group membership will not be inherited from the parent channel. Contains the list of members inherited by other channels. Type in the name of a user you wish to add to the group and click Add. Type in the name of a user you wish to remove from the group and click Add. Exclude Excluded members This makes the entry apply to sub-channels of this channel. Applies to sub-channels Permissions User/Group Group this entry applies to User ID User this entry applies to This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. &Properties <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. ID of the channel. Maximum Users Maximum number of users allowed in the channel <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. This is the sort order for the channel. ALSAAudioInput Default ALSA Card Opening chosen ALSA Input failed: %1 ALSAAudioOutput Default ALSA Card Opening chosen ALSA Output failed: %1 ASIOConfig %1 (version %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz ASIO Initialization failed: %1 Failed to instantiate ASIO driver ASIO Device selection Device Device to use for microphone This chooses what device to query. You still need to actually query the device and select which channels to use. Query selected device This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Query Configure selected device This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Configure Capabilities Driver name Buffer size This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. Configure input channels Channels Microphone <- -> Unused Speakers ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. Opening selected ASIO device failed. No input will be done. AboutDialog About Mumble <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble &License A&uthors &Third-Party Licenses OK AudioInput Interface System Input method for audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Input device for audio <b>This is the input device to use for audio.</b> Transmission &Transmit When to transmit your speech <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. DoublePush Time If you press the PTT key twice in this time it will get locked. <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. Reset audio cue to default <b>Reset</b><br/>Reset the paths for the files to their default. Browse for on audio file Browse for off audio file Off On Preview the audio cues Use SNR based speech detection Signal to Noise <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. Amplitude Voice &Hold How long to keep transmitting after silence Silence Below <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. Speech Above Signal values above this count as voice Compression &Quality Quality of compression (peak bandwidth) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. Audio per packet How many audio frames to send per packet <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). Audio Processing Noise Suppression Noise suppression <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. Maximum amplification of input sound <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. Current speech detection chance Cancel echo from speakers Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. Disabled <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal values below this count as silence Maximum bandwidth used for sending audio Use Amplitude based speech detection <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). Exclusive mode <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive R&eset &Browse... B&rowse... &Preview <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. Displays an always on top window with a push to talk button in it Display push to talk window Misc Audible audio cue when starting or stopping to transmit <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. Audio cue Gets played when starting to transmit Gets played when stopping to transmit Hold Time Time the microphone stays open after the PTT key is released Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) Max. Amplification Idle action minutes do nothing deafen mute after Echo Cancellation Mixed echo cancellation Multichannel echo cancellation The idle action will be reversed upon any key or mouse button input Undo Idle action upon activity Apply RNNoise's noise suppression filter. <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. RNNoise Audio input AudioInputDialog Continuous Voice Activity Push To Talk Audio Input %1 ms Off %1 s %1 kb/s -%1 dB %1 kbit/s (Audio %2, Position %4, Overhead %3) AudioOutput Interface System Output method for audio <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Output device for audio <b>This is the output device to use for audio.</b> Positional Audio Audio Output Default &Jitter Buffer Safety margin for jitter buffer <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. Minimum distance to user before sound volume decreases This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. Volume Volume of incoming speech <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. Output Delay Amount of data to buffer The connected "speakers" are actually headphones The connected "speakers" are actually headphones. Factor for sound volume decrease Bloom Factor for sound volume increase How much should sound volume increase for sources that are really close? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Headphones Minimum Distance Maximum Distance Maximum distance, beyond which speech volume won't decrease Minimum Volume What should the volume be at the maximum distance? Loopback Test Delay Variance Variance in packet latency <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. Packet Loss Packet loss for loopback mode <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% &Loopback Desired loopback mode Attenuate applications by... Attenuation of other applications during speech <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. If checked Mumble lowers the volume of other applications while other users talk <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. while other users talk If checked Mumble lowers the volume of other applications while you talk <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. while you talk Exclusive mode, not recommended. <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive Priority Speaker If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. Attenuate other users while talking as Priority Speaker. Advanced Attenuation Options If checked, Mumble will only attenuate applications that are using the same output source as Mumble <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. Only attenuate applications using the same output device If checked, PulseAudio loopback modules will be attenuated <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. Attenuate PulseAudio loopback modules Audio output AudioOutputDialog None Local Server Audio Output %1 ms %1 % %1 m AudioOutputSample Choose sound file Invalid sound file The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. AudioStats >1000 ms >1000ms Audio Statistics Input Levels Peak microphone level Peak power in last frame This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. Peak speaker level This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. Peak clean level This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. Signal Analysis Microphone power How close the current input level is to ideal This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. Signal-To-Noise ratio Signal-To-Noise ratio from the microphone This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. Speech Probability Probability of speech This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). Configuration feedback Current audio bitrate Bitrate of last frame DoublePush interval Time between last two Push-To-Talk presses Speech Detection Current speech detection chance <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal and noise power spectrum Power spectrum of input signal and noise estimate This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. Echo Analysis Weights of the echo canceller This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. AudioWizard Audio Tuning Wizard Introduction Welcome to the Mumble Audio Wizard Finished Enjoy using Mumble Device selection Selecting the input and output device to use with Mumble. This is the device your microphone is connected to. System Input method for audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Input device to use <b>Selects which sound card to use for audio input.</b> Cancel echo from headset or speakers Use echo cancellation This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. This is the device your speakers or headphones are connected to. Output method for audio <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. Output device to use <b>Selects which sound card to use for audio Output.</b> Enable positional audio Allows positioning of sound Allows positioning of sound. <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> Input Device Output Device This allows Mumble to use positional audio to place voices. <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> Amount of data to buffer This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> Positional Audio Adjusting attenuation of positional audio. <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> Use headphones instead of speakers <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> Use headphones This ignores the OS speaker configuration and configures the positioning for headphones instead. Volume tuning Tuning microphone hardware volume to optimal settings. Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. Voice Activity Detection Letting Mumble figure out when you're talking and when you're silent. This will help Mumble figure out when you are talking. The first step is selecting which data value to use. Raw amplitude from input Signal-To-Noise ratio Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Device tuning Changing hardware output delays to their minimum value. Submit anonymous statistics to the Mumble project Push To Talk: Quality & Notifications Adjust quality and notification settings. Quality settings Low Balanced Notification settings Use Text-To-Speech to read notifications and messages to you. Disable Text-To-Speech and use sounds instead. %1 ms Enables attenuation of other applications while users talk to you Attenuate applications while other users talk High Custom You already set a customized quality configuration in Mumble. Select this setting to keep it. Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. Apply some high contrast optimizations for visually impaired users Use high contrast graphics Keep custom Text-To-Speech settings. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) BanEditor Mumble - Edit Bans &Address &Mask Reason Start End User Hash &Add &Update &Remove Ban List Search field This is the search field. Use it to find bans that have this username set in the username field. Who are you looking for? No nickname IP address No IP address Reason for the ban No reason Ban end date Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). Certificate hash No certificate hash Banned users This is a list with banned users. Use this button if you want to add a new ban. Use this button if you want to update ban information. Use this button if you want to remove user from the ban list. Clear all fields This button clears all fields. Use it if you want to add a new ban. Clear Ban List - %n Ban(s) CertView Name Email Issuer Expiry Date (none) Self-signed CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. There was an error generating your certificate.<br />Please try again. Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. The file could not be opened for writing. Please use another file. The file's permissions could not be set. No certificate and key has been written. Please use another file. The file could not be written successfully. Please use another file. The file could not be opened for reading. Please use another file. The file is empty or could not be read. Please use another file. The file did not contain a valid certificate and key. Please use another file. Select file to export certificate to Select file to import certificate from Unable to import. Missing password or incompatible file type. <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. Certificates Certificate Management Certificate Authentication Authenticating to servers without using passwords Current certificate This is the certificate Mumble currently uses. Current Certificate Create a new certificate This will create a new certificate. Import certificate from file This will import a certificate from file. Import a certificate Export Certificate This will export a certificate to file. Export current certificate Import Certificate PKCS #12 Certificate import <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> Import from Filename to import from This is the filename you wish to import a certificate from. Select file to import from This opens a file selection dialog to choose a file to import a certificate from. Open... Password Password for PKCS#12 file This is the password for the PKCS#12 file containing your certificate. Certificate to import This is the certificate you are importing. Certificate Details Replace Certificate Replace existing certificate with new certificate? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> This is the certificate Mumble currently uses. It will be replaced. New certificate This is the new certificate that will replace the old one. New Certificate Make a backup of your certificate Export to Filename to export to This is the filename you wish to export a certificate to. Save As... This is the certificate Mumble currently uses. It will be exported. Generate a new certificate for strong authentication <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> Name Email Your email address (e.g. johndoe@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. Your name (e.g. John Doe) This is your name, and will be filled out in the certificate. This field is entirely optional. Finish Certificate-based authentication is ready for use Enjoy using Mumble with strong authentication. Automatic certificate creation <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> ChanACL None Traverse Enter Speak Mute/Deafen Make channel Make temporary Link channel This represents no privileges. This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. This represents the permission to write text messages to other users in this channel. This represents the permission to forcibly remove users from the server. This represents the permission to permanently remove users from the server. This represents the permission to register and unregister users on the server. This represents the permission to register oneself on the server. Whisper Move Text message Kick Ban Register User Register Self Write ACL ChatbarTextEdit Paste and &Send Paste and send <center>Type chat message here</center> ClientUser Friend Authenticated Priority speaker Recording Muted (server) Deafened (server) Local Ignore (Text messages) Local Mute Muted (self) Deafened (self) ConfigDialog Accept changes This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. Reject changes This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. Apply changes This button will immediately apply all changes. Undo changes for current page This button will revert any changes done on the current page to the most recent applied settings. Restore defaults for current page This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. Mumble Configuration ConnectDialog Connecting to %1 Enter username Adding host %1 Servername Hostname Bonjour name Port Addresses Website Packet loss Ping (80%) %1 ms Ping (95%) Bandwidth %1 kbit/s &Connect &Filters Unknown Users Version Failed to fetch server list Mumble Server Connect Ping Remove from Favorites Add custom server Show all servers that respond to ping Show all servers with users Show all servers &Copy Copy favorite link to clipboard &Paste Paste favorite from clipboard &Edit... &Add New... Add to &Favorites Open &Webpage Show &Reachable Show &Populated Show &All ConnectDialogEdit Edit Server Name of the server A&ddress Internet address of the server. Internet address of the server. <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. &Port Port on which the server is listening <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. &Username Username to send to the server <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. Label Add Server You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 Password Password to send to the server <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. Show password <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. Local server label 127.0.0.1 64738 Your username Your password &Fill CoreAudioSystem Default Device CrashReporter Mumble Crash Report <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> Email address (optional) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash Send Report Don't send report Crash upload successful Thank you for helping make Mumble better! Crash upload failed We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 Uploading crash report Abort upload DXAudioInput Default DirectSound Voice Input Opening chosen DirectSound Input device failed. No microphone capture will be done. Opening chosen DirectSound Input failed. Default device will be used. Lost DirectSound input device. DXAudioOutput Default DirectSound Voice Output Opening chosen DirectSound Output failed. Default device will be used. Lost DirectSound output device. Opening chosen DirectSound Output failed. No audio will be heard. Database Mumble failed to initialize a database in any of the possible locations. The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. DeveloperConsole Developer Console DockTitleBar Drag here GlobalShortcut Shortcuts List of configured shortcuts Function Data Shortcut Suppress Add new shortcut This will add a new global shortcut &Add Remove selected shortcut This will permanently remove a selected shortcut. &Remove <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> Open Accessibility Preferences Skip Enable Global Shortcuts <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. Additional Shortcut Engines <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. Enable Windows hooks <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. Enable GKey <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. Enable XInput <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. Enable shortcuts in privileged applications GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> Shortcuts Shortcut button combination. <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. Suppress keys from other applications <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. GlobalShortcutTarget Whisper Target Whisper to list of Users Channel Target Restrict to Group If specified, only members of this group will receive the whisper. List of users Add Remove Modifiers Do not send positional audio information when using this whisper shortcut. Ignore positional audio Shout to Linked channels Shout to subchannels Shout to Channel The whisper will also be transmitted to linked channels. The whisper will also be sent to the subchannels of the channel target. GlobalShortcutX Mouse %1 JackAudioSystem Hardware Ports Mono Stereo LCD Not connected LCDConfig Enable this device LCD Devices Name <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> Size Enabled Views Minimum Column Width <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> This setting decides the width of column splitter. Splitter Width Log Debug Critical Warning Information Server Connected Server Disconnected Other self-muted/deafened Permission Denied Text Message User Joined Server User Left Server User recording state changed User kicked (you or by you) User kicked You self-muted User muted (you) User muted (by you) User muted (other) User Joined Channel User Left Channel You self-unmuted You self-deafened You self-undeafened User renamed You Joined Channel You Joined Channel (moved) User connected and entered channel User left channel and disconnected Private text message the server [[ Invalid size ]] [[ Text object too large to display ]] [Date changed to %1] link to %1 FTP link to %1 player link channel link %1 link LogConfig Toggle console for %1 events Toggle pop-up notifications for %1 events Toggle Text-To-Speech for %1 events Click here to toggle sound notification for %1 events Toggle window highlight (if not active) for %1 events Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. Messages Message Console Notification Text-To-Speech Soundfile Path Text To Speech Volume Volume of Text-To-Speech Engine <b>This is the volume used for the speech synthesis.</b> Length threshold Message length threshold for Text-To-Speech Engine <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. Characters Whisper If checked you will only hear whispers from users you added to your friend list. Only accept whispers from friends If enabled text messages you send will be read back to you with TTS Read back own messages Chat Log Maximum chat length Unlimited Lines Highlight LookConfig System default None Only with users All Ask Do Nothing Move <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory User Interface This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. List users above subchannels (requires restart). <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. Users above Channels <b>If set, will verify you want to quit if connected.</b> Show number of users in each channel Show channel user count Language Language to use (requires restart) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. Look and Feel Layout Classic Stacked Hybrid Custom This changes the behavior when moving channels. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. Expand When to automatically expand channels Channel Dragging Ask whether to close or minimize when quitting Mumble. Ask on quit while connected Always On Top <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> Hide in tray when minimized Hide the main Mumble window in the tray when it is minimized. This setting controls when the application will be always on top. Never Always In minimal view In normal view Displays talking status in system tray Show talking status in tray icon This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. Show context menu in menu bar Apply some high contrast optimizations for visually impaired users Optimize for high contrast Application Adds user and channel context menus into the menu bar Tray Icon Channel Tree Use selected item as the chat bar target Filter automatically hides empty channels Show transmit mode dropdown in toolbar Theme Theme to use to style the user interface <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. User Dragging This changes the behavior when moving users. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. Enable Developer menu When in custom layout mode, checking this disables rearranging. Lock layout MainWindow Root Push-to-Talk Global Shortcut Push and hold this button to send voice. Global Shortcut This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut Reset Audio Processor Global Shortcut Unlink Plugin Global Shortcut Push-to-Mute Global Shortcut Join Channel Global Shortcut Toggle Overlay Global Shortcut Toggle state of in-game overlay. Global Shortcut Toggle Minimal Global Shortcut Volume Up (+10%) Global Shortcut Volume Down (-10%) Global Shortcut Mumble Mumble -- %1 &Window Minimize Ctrl+M Close Mumble is currently connected to a server. Do you want to Close or Minimize it? Mute Self Global Shortcut Set self-mute status. Global Shortcut This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut Deafen Self Global Shortcut Set self-deafen status. Global Shortcut This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut Whisper/Shout Whisper <center>Not connected</center> Not connected Clear Opening URL %1 File does not exist File is not a configuration file. Settings merged from file. URL scheme is not 'mumble' This version of Mumble can't handle URLs for Mumble version %1.%2.%3 Connecting to %1 Enter username Connecting to server %1. Reconnecting. Transmit Mode set to Continuous <p>%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> Register yourself as %1 <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <h2>Version</h2><p>Protocol %1</p> <p>No build information or OS version available</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) The connection is secured by the cipher suite that OpenSSL identifies as %1 <p>The connection provides perfect forward secrecy</p> <p>The connection does not provide perfect forward secrecy</p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> Voice channel is sent over control channel Register user %1 <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> Kicking user %1 Banning user %1 View comment on user %1 Message to channel %1 Connected. <li>Expected certificate digest (SHA-1): %1</li> Server presented a certificate which failed verification. <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> SSL Version mismatch Server connection failed. <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>Type message to user '%1' here</center> Type message to user '%1' here Choose image file Failed to load image Could not open file for reading. Image format not recognized. &User &Channel Use in conjunction with Whisper to. Global Shortcut This will switch the states of the in-game overlay. Global Shortcut Link Channel Global Shortcut Cycle Transmit Mode Global Shortcut Set Transmit Mode to Push-To-Talk Global Shortcut Set Transmit Mode to Continuous Global Shortcut Set Transmit Mode to VAD Global Shortcut Send Text Message Global Shortcut Send Clipboard Text Message Global Shortcut This will send your Clipboard content to the channel you are currently in. Global Shortcut Continuous Voice Activity Push-to-Talk Mumble - Minimal View -- %1 Cancel Save Image As... Save Image File Could not save image: %1 Change your comment Transmit Mode set to Voice Activity Transmit Mode set to Push-to-Talk <p>Connected users: %1/%2</p> UDP Statistics To Server From Server Good Late Lost Resync <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> Mumble Server Information &View Certificate Enter reason Sending message to %1 To %1: %2 Message to %1 Are you sure you want to reset the comment of user %1? Are you sure you want to reset the avatar of user %1? Are you sure you want to delete %1 and all its sub-channels? Sending message to channel %1 Message to tree %1 To %1 (Tree): %2 (Tree) %1: %2 Unmuted and undeafened. Unmuted. Muted. Muted and deafened. Deafened. Undeafened. Restart Mumble? Some settings will only apply after a restart of Mumble. Restart Mumble now? About Qt SSL Verification failed: %1 <li>Server certificate digest (SHA-1): %1</li> <b>WARNING:</b> The server presented a certificate that was different from the stored one. This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. Server connection failed: %1. Disconnected from server. Invalid username You connected with an invalid username, please try another one. Username in use That username is already in use, please try another username. Wrong certificate or password Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. Wrong password Wrong server password for unregistered user account, please try again. Images (*.png *.jpg *.jpeg) C&onfigure &Help Log This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. &Quit Mumble Closes the program Exits the application. Ctrl+Q Open the server connection dialog &Disconnect Disconnect from server Disconnects you from the server. Show information about the server connection This will show extended information about the connection to the server. &Mute &Deafen &Local Mute Send a Text Message Sends a text message to another user. Add new channel This adds a new sub-channel to the currently selected channel. Remove channel This removes a channel and all sub-channels. Edit Groups and ACL for channel This opens the Group and ACL dialog for the channel, to control permissions. &Link Link your channel to another channel This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. Chatbar Shows a dialog of registered servers, and also allows quick-connect. Kick user (with reason) Kick selected user off server. You'll be asked to specify a reason. Mute user Mute or unmute user on server. Unmuting a deafened user will also undeafen them. Kick and ban user (with reason) Kick and ban selected user from server. You'll be asked to specify a reason. Deafen user Deafen or undeafen user on server. Deafening a user will also mute them. Mute user locally Mute or unmute user locally. Use this on other users in the same room. This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. &Unlink Channel Unlink your channel from another channel This unlinks your current channel from the selected channel. Unlinks your channel from all linked channels. This unlinks your current channel (not the selected one) from all linked channels. &Reset Reset audio preprocessor This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. &Mute Self Mute yourself Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. &Deafen Self Deafen yourself Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. &Text-To-Speech Toggle Text-To-Speech Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. Display audio statistics Pops up a small dialog with information about your current audio input. Forcibly unlink plugin This forces the current plugin to unlink, which is handy if it is reading completely wrong data. Configure Mumble Allows you to change most settings for Mumble. Start the audio configuration wizard This will guide you through the process of configuring your audio hardware. &What's This? Enter What's This? mode Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. Information about Mumble Shows a small dialog with information and license for Mumble. Information about Speex Shows a small dialog with information about Speex. Information about Qt Shows a small dialog with information about Qt. Check for &Updates Check for new version of Mumble Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. Sends a text message to all users in a channel. Configure certificates for strong authentication This starts the wizard for creating, importing and exporting certificates for authentication against servers. Register user on server This will permanently register the user on the server. Add &Friend Adds a user as your friend. This will add the user as a friend, so you can recognize him on this and other servers. &Remove Friend Removes a user from your friends. This will remove a user from your friends list. &Update Friend Update name of your friend. Your friend uses a different name than what is in your database. This will update the name. Edit registered users list This opens the editor for registered users, which allow you to change their name or unregister them. Add or remove text-based access tokens &Minimal View Toggle minimal window modes This will toggle minimal mode, where the log window and menu is hidden. You muted and deafened %1. You unmuted and undeafened %1. You undeafened %1. You suppressed %1. %1 muted and deafened by %2. %1 unmuted and undeafened by %2. %1 undeafened by %2. %1 suppressed by %2. %1 moved to %2. %1 moved to %2 by %3. %1 moved in from %2 by %3. %1 is now muted and deafened. Your account information can not be verified currently. Please try again later Welcome message: %1 Mumble: %1 You were denied %1 privileges in %2. %3 was denied %1 privileges in %2. Denied: Cannot modify SuperUser. Denied: Invalid channel name. Denied: Text message too long. Denied: Operation not permitted in temporary channel. You need a certificate to perform this operation. %1 does not have a certificate. Invalid username: %1. Invalid username. Channel is full. Channel nesting limit reached. Channel count limit reached. Need to delete channels before creating new ones. Permission denied. %1 connected and entered channel. %1 connected. %1 is now muted. %1 is now unmuted. Recording started Recording stopped %1 started recording. %1 stopped recording. You revoked your priority speaker status. You assumed priority speaker status. %1 revoked your priority speaker status. %1 gave you priority speaker status. You revoked priority speaker status for %1. You gave priority speaker status to %1. %1 revoked own priority speaker status. %1 assumed priority speaker status. %1 revoked priority speaker status for %2. %1 gave priority speaker status to %2. You were unmuted and undeafened by %1. You were muted by %1. You were undeafened by %1. You were suppressed. You were suppressed by %1. You were unsuppressed. You were unsuppressed by %1. You joined %1. You moved %1 to %2. %1 is recording %1 renamed to %2 by %3. %1 disconnected. Server message from (Tree) (Channel) (Private) %2%1: %3 Failed to load Opus, it will not be available for audio encoding/decoding. The server requests minimum client version %1 The server requests positional audio be enabled. The server requests positional audio be disabled. The server requests Push-to-Talk be enabled. The server requests Push-to-Talk be disabled. You were unmuted by %1. You muted %1. You unsuppressed %1. You unmuted %1. %1 muted by %2. %1 unsuppressed by %2. %1 unmuted by %2. Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. You were muted and deafened by %1. You were deafened by %1. You were kicked from the server by %1: %2. %3 was kicked from the server by %1: %2. You were kicked and banned from the server by %1: %2. %3 was kicked and banned from the server by %1: %2. You were moved to %1 by %2. %1 entered channel. Server connection rejected: %1. Denied: %1. %1 renamed to %2. %1 left channel and disconnected. Message from %1 You have User Dragging set to "Do Nothing" so the user wasn't moved. You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. Unknown Channel Drag mode in UserModel::dropMimeData. Remote controlling Mumble: Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) -jn, --jackname Set custom Jack client name. --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status Invocation Error: No RPC command specified RPC Welcome to Mumble. Skipping version check in debug mode. Hide Frame Toggle showing frame on minimal window This will toggle whether the minimal window should have a frame for moving and resizing. &Unlink All Reset the comment of the selected user. &Join Channel View comment in editor Query server for connection information for user S&erver &Self &Unlink Plugins Register yourself on the server Change your avatar image on this server &Remove Avatar Remove currently defined avatar image. Icon Toolbar Change your own comment Recording Priority Speaker &Copy URL Copies a link to this channel to the clipboard. Ignore Messages Locally ignore user's text chat messages. Silently drops all text messages from the user. Edit ban list on server This lets you edit the server-side IP ban list. &Filter on/off Toggle the channel filter (Ctrl+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. Ctrl+F &Hide Channel when Filtering Reset the avatar of the selected user. Locally adjust the user's speech volume. Opens a dialog with a volume slider. Use this on other users in the same room. &Developer &Hide Mumble Hides the main Mumble window. Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. Show the Developer Console Shows the Mumble Developer Console, where Mumble's log output can be inspected. &Connect... &Ban list... &Information... &Kick... &Ban... Local Volume Adjustment... Send &Message... &Add... &Remove... &Edit... Audio S&tatistics... &Settings... &Audio Wizard... Developer &Console... &About... About &Speex... About &Qt... &Certificate Wizard... &Register... Registered &Users... Change &Avatar... &Access Tokens... Reset &Comment... Reset &Avatar... View Comment... &Change Comment... R&egister... Show Shows the main Mumble window. Manual Manual Mumble Positional Audio Position X Y Z m Heading Azimuth Elevation ° Meta data Context Identity Set State Linked Activated Unhinge NetworkConfig Network Updates are mandatory when using snapshot releases. Connection Use TCP compatibility mode Use TCP compatability mode <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). Reconnect when disconnected <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. Reconnect automatically Proxy Type Type of proxy to connect through Direct connection HTTP(S) proxy SOCKS5 proxy Hostname Hostname of the proxy Force TCP mode Enable QoS to prioritize packets This will enable QoS, which will attempt to prioritize voice packets over other traffic. Use Quality of Service Don't send certificate to server and don't save passwords. (Not saved). <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> Suppress certificate and password storage <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. Port Port number of the proxy <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. Username Username for proxy authentication <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Password Password for proxy authentication <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Mumble services Check for new releases of Mumble automatically. This will check for new releases of Mumble every time you start the program, and notify you if one is available. Check for application updates on startup Check for new releases of plugins automatically. This will check for new releases of plugins every time you start the program, and download them automatically. <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. Submit anonymous statistics to the Mumble project Submit anonymous statistics Reconnect to last used server when starting Mumble Reconnect to last server on startup Download plugin and overlay updates on startup Privacy Prevent OS information being sent to Mumble servers and web servers <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. Do not send OS information to Mumble servers and web servers Overlay Silent Talking Whisper Shout Channel Failed to create communication with overlay at %2: %1. No overlay will be available. OverlayClient Filter Only talking Talking and recently active All in current channel All in linked channels Always show yourself Configure recently active time (%1 seconds)... Columns Sort Alphabetically Last state change Edit... Reset Zoom Configure recently active time Amount of seconds users remain active after talking: OverlayConfig To move the users, drag the little red dot. To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. For more options, right click a user. For more options, rightclick a user. Launcher Filter Overlay Choose executable Choose application Choose path Load Overlay Presets Mumble overlay presets (*.mumblelay) Save Overlay Presets Options Enable overlay. Enable Overlay This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. Layout Blacklist Whitelist Uninstall Overlay Overlay Installation Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. Install Mumble Overlay Overlay Upgrade Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. Upgrade Mumble Overlay Display a frame counter in the overlay Show FPS counter Load an overlay preset from file Load… Save your overlay settings to file Save… Set the overlay font. Set the overlay text color. Color Remove Font FPS and Clock Display Display a clock in the overlay showing the current local time (system time). Show Clock Overlay Exceptions Overlay Exception Mode Allowed launchers Add Allowed programs Allowed paths Blacklisted programs OverlayEditor State User is not talking Passive User is talking in your channel or a linked channel Talking User is whispering to you privately Private Whisper User is shouting to your channel Channel Whisper Zoom Zoom Factor Enabled Elements User avatar, chosen by each user Avatar User's name Username Name of user's channel, if outside your current channel Channel Muted or deafened Mute state Bounding box, automatically shrunk to minimum size to contain all visible elements Bounding box Overlay Editor OverlayEditorScene Layout preset Large square avatar Avatar and Name User Opacity %1% Object Opacity Alignment Left Center Right Top Bottom Color... Font... Bounding box Pen width Padding Pen color Fill color Pick pen color Pick fill color Pick color Pick font PluginConfig Plugins Plugin has no configure function. Plugin has no about function. Options Enable plugins and transmit positional information This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. Link to Game and Transmit Position Reloads all plugins This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. &Reload plugins Information about plugin This shows a small information message about the plugin. &About Show configuration page of plugin This shows the configuration page of the plugin, if any. &Configure Name Enabled Plugins Skipping plugin update in debug mode. Downloaded new or updated plugin to %1. Failed to install new plugin to %1. %1 lost link. %1 linked. PortAudioSystem Default Device PulseAudioSystem Default Input Default Output QApplication Failed to restart mumble Mumble failed to restart itself. Please restart it manually. RichTextEditor Failed to load image Image file too large to embed in document. Please use images smaller than %1 kB. Message is too long. Display Source Text &Bold Ctrl+B &Italic Italic Ctrl+I Underline Ctrl+U Color Insert Link Ctrl+L Insert Image RichTextEditorLink Add Link URL Text ServerHandler Unable to resolve hostname Server is not responding to TCP pings UDP packets cannot be sent to or received from the server. Switching to TCP mode. UDP packets cannot be sent to the server. Switching to TCP mode. UDP packets cannot be received from the server. Switching to TCP mode. UDP packets can be sent to and received from the server. Switching back to UDP mode. Connection timed out ServerView Favorite LAN Public Internet Unknown Africa Asia North America South America Europe Oceania ShortcutActionWidget Unassigned ShortcutDelegate On Off Toggle Unassigned ShortcutKeyWidget Press Shortcut ShortcutTargetDialog Root Parent Current Subchannel #%1 ShortcutTargetWidget ... , Root Parent Current Subchannel #%1 Invalid Empty <Empty> ShortcutToggleWidget Off Toggle On TextMessage Enter text If checked the message is recursively sent to all subchannels Send recursively to subchannels Tokens Empty Token Mumble - Access Tokens List of access tokens on current server <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. Add a token &Add Remove a token &Remove UserEdit Registered Users Remove Rename Who are you looking for? Days Weeks Months Years Inactive for Registered users: %n account(s) UserInformation User Information Connection Information Version OS Certificate IP Address CELT Versions Details... Ping Statistics Pings received Average ping TCP (Control) UDP (Voice) UDP Network statistics Good Late Lost Resync From Client To Client Connection time %1w %1d %1h %1m %1s , %1 (%2) %1.%2.%3 (%4) Supported Not Supported Not Reported %1 online (%2 idle) %1 online %1 kbit/s Bandwidth GroupBox Bandwidth Label Ping deviation UserListModel Nick Inactive days Last channel Last seen: %1 Never Channel ID: %1 UserLocalVolumeDialog Local volume for other users <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. Adjusting local volume for %1 dB <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: Talking to your channel. Shouting directly to your channel. Whispering directly to your channel. Whispering directly to you. Not talking. This is a channel on the server. The icon indicates the state of the channel: Your current channel. A channel that is linked with your channel. Linked channels can talk to each other. A channel on the server that you are not linked to. This shows the flags the user has on the server, if any: On your friend list Authenticated user Muted (manually muted by self) Muted (manually muted by admin) Muted (not allowed to speak in current channel) Muted (muted by you, only on your machine) Muted (push-to-mute) Deafened (by self) Deafened (by admin) User has a new comment set (click to show) User has a comment set, which you've already seen. (click to show) Ignoring Text Messages This shows the flags the channel has, if any: Channel has a new comment set (click to show) Channel has a comment set, which you've already seen. (click to show) Channel will be hidden when filtering is enabled Name Flags Are you sure you want to drag this user? Are you sure you want to drag this channel? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. VersionCheck Upgrade Mumble A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? Failed to launch snapshot installer. Corrupt download of new version detected. Automatically removed. Downloading new snapshot from %1 to %2 Failed to write new version to disk. Failed to write new version to disc. Mumble failed to retrieve version information from the central server. ViewCert Certificate Chain Details Certificate chain Certificate details Common Name Organization Subunit Country Locality State Valid from: %1 Valid to: %1 Serial: %1 Public Key: %1 bits %2 RSA DSA Digest (SHA-1): %1 Digest (SHA-256): %1 Email: %1 DNS: %1 Issued by: Unit Name VoiceRecorder Recorder failed to create directory '%1' Recorder failed to open file '%1' .wav - Uncompressed .ogg (Vorbis) - Compressed .au - Uncompressed .flac - Lossless compressed VoiceRecorderDialog Recorder Control 00:00:00 &Start S&top Mode Multichannel Output Output format Target directory Filename &Browse... Valid variables are: Inserts the user's name Inserts the current date Inserts the current time Inserts the hostname Recorder still running Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? Unable to start recording. Not connected to a server. The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. There is already a recorder active for this server. Please select a recording format. กรุณาเลือกรูปแบบแฟ้มที่จะบันทึก Stopping Select target directory เลือกไดเร็คทอรี่เป้าหมาย Downmix WASAPIInput Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone. WASAPISystem Default Device อุปกรณ์ปริยาย qwPTTButtonWidget Mumble PTT Push to talk กดเพื่อพูด mumble-1.3.4/src/mumble/ServerHandler.cpp0000664000175000017500000007042314010707273020167 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "ServerHandler.h" #include "AudioInput.h" #include "AudioOutput.h" #include "Cert.h" #include "Connection.h" #include "Database.h" #include "MainWindow.h" #include "Message.h" #include "NetworkConfig.h" #include "OSInfo.h" #include "PacketDataStream.h" #include "RichTextEditor.h" #include "SSL.h" #include "User.h" #include "Net.h" #include "HostAddress.h" #include "ServerResolver.h" #include "ServerResolverRecord.h" // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" ServerHandlerMessageEvent::ServerHandlerMessageEvent(const QByteArray &msg, unsigned int mtype, bool flush) : QEvent(static_cast(SERVERSEND_EVENT)) { qbaMsg = msg; uiType = mtype; bFlush = flush; } #ifdef Q_OS_WIN static HANDLE loadQoS() { HANDLE hQoS = NULL; HRESULT hr = E_FAIL; // We don't support delay-loading QoS on MinGW. Only enable it for MSVC. #ifdef _MSC_VER __try { hr = __HrLoadAllImportsForDll("qwave.dll"); } __except(EXCEPTION_EXECUTE_HANDLER) { hr = E_FAIL; } #endif if (! SUCCEEDED(hr)) { qWarning("ServerHandler: Failed to load qWave.dll, no QoS available"); } else { QOS_VERSION qvVer; qvVer.MajorVersion = 1; qvVer.MinorVersion = 0; if (! QOSCreateHandle(&qvVer, &hQoS)) { qWarning("ServerHandler: Failed to create QOS2 handle"); hQoS = NULL; } else { qWarning("ServerHandler: QOS2 loaded"); } } return hQoS; } #endif ServerHandler::ServerHandler() : database(new Database(QLatin1String("ServerHandler"))) { cConnection.reset(); qusUdp = NULL; bStrong = false; usPort = 0; bUdp = true; tConnectionTimeoutTimer = NULL; uiVersion = 0; iInFlightTCPPings = 0; // Historically, the qWarning line below initialized OpenSSL for us. // It used to have this comment: // // "For some strange reason, on Win32, we have to call // supportsSsl before the cipher list is ready." // // Now, OpenSSL is initialized in main() via MumbleSSL::initialize(), // but since it's handy to have the OpenSSL version available, we // keep this one around as well. qWarning("OpenSSL Support: %d (%s)", QSslSocket::supportsSsl(), SSLeay_version(SSLEAY_VERSION)); MumbleSSL::addSystemCA(); { QList ciphers = MumbleSSL::ciphersFromOpenSSLCipherString(g.s.qsSslCiphers); if (ciphers.isEmpty()) { qFatal("Invalid 'net/sslciphers' config option. Either the cipher string is invalid or none of the ciphers are available:: \"%s\"", qPrintable(g.s.qsSslCiphers)); } QSslSocket::setDefaultCiphers(ciphers); QStringList pref; foreach (QSslCipher c, ciphers) { pref << c.name(); } qWarning("ServerHandler: TLS cipher preference is \"%s\"", qPrintable(pref.join(QLatin1String(":")))); } #ifdef Q_OS_WIN hQoS = loadQoS(); if (hQoS) Connection::setQoS(hQoS); #endif connect(this, SIGNAL(pingRequested()), this, SLOT(sendPingInternal()), Qt::QueuedConnection); } ServerHandler::~ServerHandler() { wait(); cConnection.reset(); #ifdef Q_OS_WIN if (hQoS) { QOSCloseHandle(hQoS); Connection::setQoS(NULL); } #endif } void ServerHandler::customEvent(QEvent *evt) { if (evt->type() != SERVERSEND_EVENT) return; ServerHandlerMessageEvent *shme = static_cast(evt); ConnectionPtr connection(cConnection); if (connection) { if (shme->qbaMsg.size() > 0) { connection->sendMessage(shme->qbaMsg); if (shme->bFlush) connection->forceFlush(); } else { exit(0); } } } void ServerHandler::udpReady() { const unsigned int UDP_MAX_SIZE = 2048; while (qusUdp->hasPendingDatagrams()) { char encrypted[UDP_MAX_SIZE]; char buffer[UDP_MAX_SIZE]; unsigned int buflen = static_cast(qusUdp->pendingDatagramSize()); if (buflen > UDP_MAX_SIZE) { // Discard datagrams that exceed our buffer's size as we'd have to trim them down anyways and it is not very // likely that the data is valid in the trimmed down form. // As we're using a maxSize of 0 it is okay to pass NULL as the data buffer. Qt's docs (5.15) ensures that // a maxSize of 0 means discarding the datagram. qusUdp->readDatagram(NULL, 0); continue; } QHostAddress senderAddr; quint16 senderPort; qusUdp->readDatagram(encrypted, buflen, &senderAddr, &senderPort); if (!(HostAddress(senderAddr) == HostAddress(qhaRemote)) || (senderPort != usResolvedPort)) continue; ConnectionPtr connection(cConnection); if (! connection) continue; if (! connection->csCrypt.isValid()) continue; if (buflen < 5) continue; if (! connection->csCrypt.decrypt(reinterpret_cast(encrypted), reinterpret_cast(buffer), buflen)) { if (connection->csCrypt.tLastGood.elapsed() > 5000000ULL) { if (connection->csCrypt.tLastRequest.elapsed() > 5000000ULL) { connection->csCrypt.tLastRequest.restart(); MumbleProto::CryptSetup mpcs; sendMessage(mpcs); } } continue; } PacketDataStream pds(buffer + 1, buflen-5); MessageHandler::UDPMessageType msgType = static_cast((buffer[0] >> 5) & 0x7); unsigned int msgFlags = buffer[0] & 0x1f; switch (msgType) { case MessageHandler::UDPPing: { quint64 t; pds >> t; accUDP(static_cast(tTimestamp.elapsed() - t) / 1000.0); } break; case MessageHandler::UDPVoiceCELTAlpha: case MessageHandler::UDPVoiceCELTBeta: case MessageHandler::UDPVoiceSpeex: case MessageHandler::UDPVoiceOpus: handleVoicePacket(msgFlags, pds, msgType); break; default: break; } } } void ServerHandler::handleVoicePacket(unsigned int msgFlags, PacketDataStream &pds, MessageHandler::UDPMessageType type) { unsigned int uiSession; pds >> uiSession; ClientUser *p = ClientUser::get(uiSession); AudioOutputPtr ao = g.ao; if (ao && p && ! p->bLocalMute && !(((msgFlags & 0x1f) == 2) && g.s.bWhisperFriends && p->qsFriendName.isEmpty())) { unsigned int iSeq; pds >> iSeq; QByteArray qba; qba.reserve(pds.left() + 1); qba.append(static_cast(msgFlags)); qba.append(pds.dataBlock(pds.left())); ao->addFrameToBuffer(p, qba, iSeq, type); } } void ServerHandler::sendMessage(const char *data, int len, bool force) { STACKVAR(unsigned char, crypto, len+4); QMutexLocker qml(&qmUdp); if (! qusUdp) return; ConnectionPtr connection(cConnection); if (!connection || !connection->csCrypt.isValid()) return; if (!force && (NetworkConfig::TcpModeEnabled() || !bUdp)) { QByteArray qba; qba.resize(len + 6); unsigned char *uc = reinterpret_cast(qba.data()); * reinterpret_cast(& uc[0]) = qToBigEndian(static_cast(MessageHandler::UDPTunnel)); * reinterpret_cast(& uc[2]) = qToBigEndian(static_cast(len)); memcpy(uc + 6, data, len); QApplication::postEvent(this, new ServerHandlerMessageEvent(qba, MessageHandler::UDPTunnel, true)); } else { if (!connection->csCrypt.encrypt(reinterpret_cast(data), crypto, len)) { return; } qusUdp->writeDatagram(reinterpret_cast(crypto), len + 4, qhaRemote, usResolvedPort); } } void ServerHandler::sendProtoMessage(const ::google::protobuf::Message &msg, unsigned int msgType) { QByteArray qba; if (QThread::currentThread() != thread()) { Connection::messageToNetwork(msg, msgType, qba); ServerHandlerMessageEvent *shme=new ServerHandlerMessageEvent(qba, 0, false); QApplication::postEvent(this, shme); } else { ConnectionPtr connection(cConnection); if (!connection) return; connection->sendMessage(msg, msgType, qba); } } bool ServerHandler::isConnected() const { // If the digest isn't empty, then we are currently connected to a server (the digest being a hash // of the server's certificate) return !qbaDigest.isEmpty(); } bool ServerHandler::hasSynchronized() const { return serverSyncronized; } void ServerHandler::setServerSynchronized(bool synchronized) { serverSyncronized = synchronized; } void ServerHandler::hostnameResolved() { ServerResolver *sr = qobject_cast(QObject::sender()); QList records = sr->records(); // Exit the ServerHandler thread's event loop with an // error code in case our hostname lookup failed. if (records.isEmpty()) { exit(-1); return; } // Create the list of target host:port pairs // that the ServerHandler should try to connect to. QList ql; foreach (ServerResolverRecord record, records) { foreach (HostAddress addr, record.addresses()) { ql.append(ServerAddress(addr, record.port())); } } qlAddresses = ql; // Exit the event loop with 'success' status code, // to continue connecting to the server. exit(0); } void ServerHandler::run() { // Resolve the hostname... { ServerResolver sr; QObject::connect(&sr, SIGNAL(resolved()), this, SLOT(hostnameResolved())); sr.resolve(qsHostName, usPort); int ret = exec(); if (ret < 0) { qWarning("ServerHandler: failed to resolve hostname"); emit error(QAbstractSocket::HostNotFoundError, tr("Unable to resolve hostname")); return; } } QList targetAddresses(qlAddresses); bool shouldTryNextTargetServer = true; do { saTargetServer = qlAddresses.takeFirst(); tConnectionTimeoutTimer = NULL; qbaDigest = QByteArray(); bStrong = true; qtsSock = new QSslSocket(this); qtsSock->setPeerVerifyName(qsHostName); if (! g.s.bSuppressIdentity && CertWizard::validateCert(g.s.kpCertificate)) { qtsSock->setPrivateKey(g.s.kpCertificate.second); qtsSock->setLocalCertificate(g.s.kpCertificate.first.at(0)); QList certs = qtsSock->caCertificates(); certs << g.s.kpCertificate.first; qtsSock->setCaCertificates(certs); } { ConnectionPtr connection(new Connection(this, qtsSock)); cConnection = connection; // Technically it isn't necessary to reset this flag here since a ServerHandler will not be used // for multiple connections in a row but just in case that at some point it will, we'll reset the // flag here. serverSyncronized = false; qlErrors.clear(); qscCert.clear(); connect(qtsSock, SIGNAL(encrypted()), this, SLOT(serverConnectionConnected())); connect(qtsSock, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(serverConnectionStateChanged(QAbstractSocket::SocketState))); connect(connection.get(), SIGNAL(connectionClosed(QAbstractSocket::SocketError, const QString &)), this, SLOT(serverConnectionClosed(QAbstractSocket::SocketError, const QString &))); connect(connection.get(), SIGNAL(message(unsigned int, const QByteArray &)), this, SLOT(message(unsigned int, const QByteArray &))); connect(connection.get(), SIGNAL(handleSslErrors(const QList &)), this, SLOT(setSslErrors(const QList &))); } bUdp = false; #if QT_VERSION >= 0x050500 qtsSock->setProtocol(QSsl::TlsV1_0OrLater); #elif QT_VERSION >= 0x050400 // In Qt 5.4, QSsl::SecureProtocols is equivalent // to "TLSv1.0 or later", which we require. qtsSock->setProtocol(QSsl::SecureProtocols); #elif QT_VERSION >= 0x050000 qtsSock->setProtocol(QSsl::TlsV1_0); #else qtsSock->setProtocol(QSsl::TlsV1); #endif qtsSock->connectToHost(saTargetServer.host.toAddress(), saTargetServer.port); tTimestamp.restart(); // Setup ping timer; QTimer *ticker = new QTimer(this); connect(ticker, SIGNAL(timeout()), this, SLOT(sendPing())); ticker->start(g.s.iPingIntervalMsec); g.mw->rtLast = MumbleProto::Reject_RejectType_None; accUDP = accTCP = accClean; uiVersion = 0; qsRelease = QString(); qsOS = QString(); qsOSVersion = QString(); int ret = exec(); if (ret == -2) { shouldTryNextTargetServer = true; } else { shouldTryNextTargetServer = false; } if (qusUdp) { QMutexLocker qml(&qmUdp); #ifdef Q_OS_WIN if (hQoS != NULL) { if (! QOSRemoveSocketFromFlow(hQoS, 0, dwFlowUDP, 0)) qWarning("ServerHandler: Failed to remove UDP from QoS"); dwFlowUDP = 0; } #endif delete qusUdp; qusUdp = NULL; } ticker->stop(); ConnectionPtr cptr(cConnection); if (cptr) { cptr->disconnectSocket(true); } cConnection.reset(); while (! cptr.unique()) { msleep(100); } delete qtsSock; delete tConnectionTimeoutTimer; } while (shouldTryNextTargetServer && !qlAddresses.isEmpty()); } #ifdef Q_OS_WIN extern DWORD WinVerifySslCert(const QByteArray& cert); #endif void ServerHandler::setSslErrors(const QList &errors) { ConnectionPtr connection(cConnection); if (!connection) return; qscCert = connection->peerCertificateChain(); QList newErrors = errors; #ifdef Q_OS_WIN bool bRevalidate = false; QList errorsToRemove; foreach (const QSslError& e, errors) { switch (e.error()) { case QSslError::UnableToGetLocalIssuerCertificate: case QSslError::SelfSignedCertificateInChain: bRevalidate = true; errorsToRemove << e; break; default: break; } } if (bRevalidate) { QByteArray der = qscCert.first().toDer(); DWORD errorStatus = WinVerifySslCert(der); if (errorStatus == CERT_TRUST_NO_ERROR) { foreach (const QSslError& e, errorsToRemove) { newErrors.removeOne(e); } } if (newErrors.isEmpty()) { connection->proceedAnyway(); return; } } #endif bStrong = false; if ((qscCert.size() > 0) && (QString::fromLatin1(qscCert.at(0).digest(QCryptographicHash::Sha1).toHex()) == database->getDigest(qsHostName, usPort))) connection->proceedAnyway(); else qlErrors = newErrors; } void ServerHandler::sendPing() { emit pingRequested(); } void ServerHandler::sendPingInternal() { ConnectionPtr connection(cConnection); if (!connection) return; if (qtsSock->state() != QAbstractSocket::ConnectedState) { return; } // Ensure the TLS handshake has completed before sending pings. if (!qtsSock->isEncrypted()) { return; } if (g.s.iMaxInFlightTCPPings > 0 && iInFlightTCPPings >= g.s.iMaxInFlightTCPPings) { serverConnectionClosed(QAbstractSocket::UnknownSocketError, tr("Server is not responding to TCP pings")); return; } CryptState &cs = connection->csCrypt; quint64 t = tTimestamp.elapsed(); if (qusUdp) { unsigned char buffer[256]; PacketDataStream pds(buffer + 1, 255); buffer[0] = MessageHandler::UDPPing << 5; pds << t; sendMessage(reinterpret_cast(buffer), pds.size() + 1, true); } MumbleProto::Ping mpp; mpp.set_timestamp(t); mpp.set_good(cs.uiGood); mpp.set_late(cs.uiLate); mpp.set_lost(cs.uiLost); mpp.set_resync(cs.uiResync); if (boost::accumulators::count(accUDP)) { mpp.set_udp_ping_avg(static_cast(boost::accumulators::mean(accUDP))); mpp.set_udp_ping_var(static_cast(boost::accumulators::variance(accUDP))); } mpp.set_udp_packets(static_cast(boost::accumulators::count(accUDP))); if (boost::accumulators::count(accTCP)) { mpp.set_tcp_ping_avg(static_cast(boost::accumulators::mean(accTCP))); mpp.set_tcp_ping_var(static_cast(boost::accumulators::variance(accTCP))); } mpp.set_tcp_packets(static_cast(boost::accumulators::count(accTCP))); sendMessage(mpp); iInFlightTCPPings += 1; } void ServerHandler::message(unsigned int msgType, const QByteArray &qbaMsg) { const char *ptr = qbaMsg.constData(); if (msgType == MessageHandler::UDPTunnel) { if (qbaMsg.length() < 1) return; MessageHandler::UDPMessageType umsgType = static_cast((ptr[0] >> 5) & 0x7); unsigned int msgFlags = ptr[0] & 0x1f; PacketDataStream pds(qbaMsg.constData() + 1, qbaMsg.size()); switch (umsgType) { case MessageHandler::UDPVoiceCELTAlpha: case MessageHandler::UDPVoiceCELTBeta: case MessageHandler::UDPVoiceSpeex: case MessageHandler::UDPVoiceOpus: handleVoicePacket(msgFlags, pds, umsgType); break; default: break; } } else if (msgType == MessageHandler::Ping) { MumbleProto::Ping msg; if (msg.ParseFromArray(qbaMsg.constData(), qbaMsg.size())) { ConnectionPtr connection(cConnection); if (!connection) return; // Reset in-flight TCP ping counter to 0. // We've received a ping. That means the // connection is still OK. iInFlightTCPPings = 0; CryptState &cs = connection->csCrypt; cs.uiRemoteGood = msg.good(); cs.uiRemoteLate = msg.late(); cs.uiRemoteLost = msg.lost(); cs.uiRemoteResync = msg.resync(); accTCP(static_cast(tTimestamp.elapsed() - msg.timestamp()) / 1000.0); if (((cs.uiRemoteGood == 0) || (cs.uiGood == 0)) && bUdp && (tTimestamp.elapsed() > 20000000ULL)) { bUdp = false; if (! NetworkConfig::TcpModeEnabled()) { if ((cs.uiRemoteGood == 0) && (cs.uiGood == 0)) g.mw->msgBox(tr("UDP packets cannot be sent to or received from the server. Switching to TCP mode.")); else if (cs.uiRemoteGood == 0) g.mw->msgBox(tr("UDP packets cannot be sent to the server. Switching to TCP mode.")); else g.mw->msgBox(tr("UDP packets cannot be received from the server. Switching to TCP mode.")); database->setUdp(qbaDigest, false); } } else if (!bUdp && (cs.uiRemoteGood > 3) && (cs.uiGood > 3)) { bUdp = true; if (! NetworkConfig::TcpModeEnabled()) { g.mw->msgBox(tr("UDP packets can be sent to and received from the server. Switching back to UDP mode.")); database->setUdp(qbaDigest, true); } } } } else { ServerHandlerMessageEvent *shme=new ServerHandlerMessageEvent(qbaMsg, msgType, false); QApplication::postEvent(g.mw, shme); } } void ServerHandler::disconnect() { // Actual TCP object is in a different thread, so signal it QByteArray qbaBuffer; ServerHandlerMessageEvent *shme=new ServerHandlerMessageEvent(qbaBuffer, 0, false); QApplication::postEvent(this, shme); } void ServerHandler::serverConnectionClosed(QAbstractSocket::SocketError err, const QString &reason) { Connection *c = cConnection.get(); if (! c) return; if (c->bDisconnectedEmitted) return; c->bDisconnectedEmitted = true; AudioOutputPtr ao = g.ao; if (ao) ao->wipe(); // Try next server in the list if possible. // Otherwise, emit disconnect and exit with // a normal status code. if (!qlAddresses.isEmpty()) { if (err == QAbstractSocket::ConnectionRefusedError || err == QAbstractSocket::SocketTimeoutError) { qWarning("ServerHandler: connection attempt to %s:%i failed: %s (%li); trying next server....", qPrintable(saTargetServer.host.toString()), static_cast(saTargetServer.port), qPrintable(reason), static_cast(err)); exit(-2); return; } } emit disconnected(err, reason); exit(0); } void ServerHandler::serverConnectionTimeoutOnConnect() { ConnectionPtr connection(cConnection); if (connection) connection->disconnectSocket(true); serverConnectionClosed(QAbstractSocket::SocketTimeoutError, tr("Connection timed out")); } void ServerHandler::serverConnectionStateChanged(QAbstractSocket::SocketState state) { if (state == QAbstractSocket::ConnectingState) { // Start timer for connection timeout during connect after resolving is completed tConnectionTimeoutTimer = new QTimer(); connect(tConnectionTimeoutTimer, SIGNAL(timeout()), this, SLOT(serverConnectionTimeoutOnConnect())); tConnectionTimeoutTimer->setSingleShot(true); tConnectionTimeoutTimer->start(g.s.iConnectionTimeoutDurationMsec); } else if (state == QAbstractSocket::ConnectedState) { // Start TLS handshake qtsSock->startClientEncryption(); } } void ServerHandler::serverConnectionConnected() { ConnectionPtr connection(cConnection); if (!connection) return; iInFlightTCPPings = 0; tConnectionTimeoutTimer->stop(); if (g.s.bQoS) connection->setToS(); qscCert = connection->peerCertificateChain(); qscCipher = connection->sessionCipher(); if (! qscCert.isEmpty()) { const QSslCertificate &qsc = qscCert.last(); qbaDigest = sha1(qsc.publicKey().toDer()); bUdp = database->getUdp(qbaDigest); } else { // Shouldn't reach this qCritical("Server must have a certificate. Dropping connection"); disconnect(); return; } MumbleProto::Version mpv; mpv.set_release(u8(QLatin1String(MUMBLE_RELEASE))); unsigned int version = MumbleVersion::getRaw(); if (version) { mpv.set_version(version); } if (!g.s.bHideOS) { mpv.set_os(u8(OSInfo::getOS())); mpv.set_os_version(u8(OSInfo::getOSDisplayableVersion())); } sendMessage(mpv); MumbleProto::Authenticate mpa; mpa.set_username(u8(qsUserName)); mpa.set_password(u8(qsPassword)); QStringList tokens = database->getTokens(qbaDigest); foreach(const QString &qs, tokens) mpa.add_tokens(u8(qs)); QMap::const_iterator i; for (i=g.qmCodecs.constBegin(); i != g.qmCodecs.constEnd(); ++i) mpa.add_celt_versions(i.key()); #ifdef USE_OPUS mpa.set_opus(true); #else mpa.set_opus(false); #endif sendMessage(mpa); { QMutexLocker qml(&qmUdp); qhaRemote = connection->peerAddress(); qhaLocal = connection->localAddress(); usResolvedPort = connection->peerPort(); if (qhaLocal.isNull()) { qFatal("ServerHandler: qhaLocal is unexpectedly a null addr"); } qusUdp = new QUdpSocket(this); if (! qusUdp) { qFatal("ServerHandler: qusUdp is unexpectedly a null addr"); } if (g.s.bUdpForceTcpAddr) { qusUdp->bind(qhaLocal, 0); } else { if (qhaRemote.protocol() == QAbstractSocket::IPv6Protocol) { qusUdp->bind(QHostAddress(QHostAddress::AnyIPv6), 0); } else { qusUdp->bind(QHostAddress(QHostAddress::Any), 0); } } connect(qusUdp, SIGNAL(readyRead()), this, SLOT(udpReady())); if (g.s.bQoS) { #if defined(Q_OS_UNIX) int val = 0xe0; if (setsockopt(static_cast(qusUdp->socketDescriptor()), IPPROTO_IP, IP_TOS, &val, sizeof(val))) { val = 0x80; if (setsockopt(static_cast(qusUdp->socketDescriptor()), IPPROTO_IP, IP_TOS, &val, sizeof(val))) qWarning("ServerHandler: Failed to set TOS for UDP Socket"); } #if defined(SO_PRIORITY) socklen_t optlen = sizeof(val); if (getsockopt(static_cast(qusUdp->socketDescriptor()), SOL_SOCKET, SO_PRIORITY, &val, &optlen) == 0) { if (val == 0) { val = 6; setsockopt(static_cast(qusUdp->socketDescriptor()), SOL_SOCKET, SO_PRIORITY, &val, sizeof(val)); } } #endif #elif defined(Q_OS_WIN) if (hQoS != NULL) { struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(usPort); addr.sin_addr.s_addr = htonl(qhaRemote.toIPv4Address()); dwFlowUDP = 0; if (! QOSAddSocketToFlow(hQoS, qusUdp->socketDescriptor(), reinterpret_cast(&addr), QOSTrafficTypeVoice, QOS_NON_ADAPTIVE_FLOW, reinterpret_cast(&dwFlowUDP))) qWarning("ServerHandler: Failed to add UDP to QOS"); } #endif } } emit connected(); } void ServerHandler::setConnectionInfo(const QString &host, unsigned short port, const QString &username, const QString &pw) { qsHostName = host; usPort = port; qsUserName = username; qsPassword = pw; } void ServerHandler::getConnectionInfo(QString &host, unsigned short &port, QString &username, QString &pw) const { host = qsHostName; port = usPort; username = qsUserName; pw = qsPassword; } bool ServerHandler::isStrong() const { return bStrong; } void ServerHandler::requestUserStats(unsigned int uiSession, bool statsOnly) { MumbleProto::UserStats mpus; mpus.set_session(uiSession); mpus.set_stats_only(statsOnly); sendMessage(mpus); } void ServerHandler::joinChannel(unsigned int uiSession, unsigned int channel) { MumbleProto::UserState mpus; mpus.set_session(uiSession); mpus.set_channel_id(channel); sendMessage(mpus); } void ServerHandler::createChannel(unsigned int parent_id, const QString &name, const QString &description, unsigned int position, bool temporary, unsigned int maxUsers) { MumbleProto::ChannelState mpcs; mpcs.set_parent(parent_id); mpcs.set_name(u8(name)); mpcs.set_description(u8(description)); mpcs.set_position(position); mpcs.set_temporary(temporary); mpcs.set_max_users(maxUsers); sendMessage(mpcs); } void ServerHandler::requestBanList() { MumbleProto::BanList mpbl; mpbl.set_query(true); sendMessage(mpbl); } void ServerHandler::requestUserList() { MumbleProto::UserList mpul; sendMessage(mpul); } void ServerHandler::requestACL(unsigned int channel) { MumbleProto::ACL mpacl; mpacl.set_channel_id(channel); mpacl.set_query(true); sendMessage(mpacl); } void ServerHandler::registerUser(unsigned int uiSession) { MumbleProto::UserState mpus; mpus.set_session(uiSession); mpus.set_user_id(0); sendMessage(mpus); } void ServerHandler::kickBanUser(unsigned int uiSession, const QString &reason, bool ban) { MumbleProto::UserRemove mpur; mpur.set_session(uiSession); mpur.set_reason(u8(reason)); mpur.set_ban(ban); sendMessage(mpur); } void ServerHandler::sendUserTextMessage(unsigned int uiSession, const QString &message_) { MumbleProto::TextMessage mptm; mptm.add_session(uiSession); mptm.set_message(u8(message_)); sendMessage(mptm); } void ServerHandler::sendChannelTextMessage(unsigned int channel, const QString &message_, bool tree) { MumbleProto::TextMessage mptm; if (tree) { mptm.add_tree_id(channel); } else { mptm.add_channel_id(channel); if (message_ == QString::fromUtf8(g.ccHappyEaster + 10)) g.bHappyEaster = true; } mptm.set_message(u8(message_)); sendMessage(mptm); } void ServerHandler::setUserComment(unsigned int uiSession, const QString &comment) { MumbleProto::UserState mpus; mpus.set_session(uiSession); mpus.set_comment(u8(comment)); sendMessage(mpus); } void ServerHandler::setUserTexture(unsigned int uiSession, const QByteArray &qba) { QByteArray texture; if ((uiVersion >= 0x010202) || qba.isEmpty()) { texture = qba; } else { QByteArray raw = qba; QBuffer qb(& raw); qb.open(QIODevice::ReadOnly); QImageReader qir; qir.setDecideFormatFromContent(false); QByteArray fmt; if (!RichTextImage::isValidImage(qba, fmt)) { return; } qir.setFormat(fmt); qir.setDevice(&qb); QSize sz = qir.size(); const int TEX_MAX_WIDTH = 600; const int TEX_MAX_HEIGHT = 60; const int TEX_RGBA_SIZE = TEX_MAX_WIDTH*TEX_MAX_HEIGHT*4; sz.scale(TEX_MAX_WIDTH, TEX_MAX_HEIGHT, Qt::KeepAspectRatio); qir.setScaledSize(sz); QImage tex = qir.read(); if (tex.isNull()) { return; } raw = QByteArray(TEX_RGBA_SIZE, 0); QImage img(reinterpret_cast(raw.data()), TEX_MAX_WIDTH, TEX_MAX_HEIGHT, QImage::Format_ARGB32); QPainter imgp(&img); imgp.setRenderHint(QPainter::Antialiasing); imgp.setRenderHint(QPainter::TextAntialiasing); imgp.setCompositionMode(QPainter::CompositionMode_SourceOver); imgp.drawImage(0, 0, tex); texture = qCompress(QByteArray(reinterpret_cast(img.bits()), TEX_RGBA_SIZE)); } MumbleProto::UserState mpus; mpus.set_session(uiSession); mpus.set_texture(blob(texture)); sendMessage(mpus); if (! texture.isEmpty()) { database->setBlob(sha1(texture), texture); } } void ServerHandler::setTokens(const QStringList &tokens) { MumbleProto::Authenticate msg; foreach(const QString &qs, tokens) msg.add_tokens(u8(qs)); sendMessage(msg); } void ServerHandler::removeChannel(unsigned int channel) { MumbleProto::ChannelRemove mpcr; mpcr.set_channel_id(channel); sendMessage(mpcr); } void ServerHandler::addChannelLink(unsigned int channel, unsigned int link) { MumbleProto::ChannelState mpcs; mpcs.set_channel_id(channel); mpcs.add_links_add(link); sendMessage(mpcs); } void ServerHandler::removeChannelLink(unsigned int channel, unsigned int link) { MumbleProto::ChannelState mpcs; mpcs.set_channel_id(channel); mpcs.add_links_remove(link); sendMessage(mpcs); } void ServerHandler::requestChannelPermissions(unsigned int channel) { MumbleProto::PermissionQuery mppq; mppq.set_channel_id(channel); sendMessage(mppq); } void ServerHandler::setSelfMuteDeafState(bool mute, bool deaf) { MumbleProto::UserState mpus; mpus.set_self_mute(mute); mpus.set_self_deaf(deaf); sendMessage(mpus); } void ServerHandler::announceRecordingState(bool recording) { MumbleProto::UserState mpus; mpus.set_recording(recording); sendMessage(mpus); } QUrl ServerHandler::getServerURL(bool withPassword) const { QUrl url; url.setScheme(QLatin1String("mumble")); url.setHost(qsHostName); if (usPort != DEFAULT_MUMBLE_PORT) { url.setPort(usPort); } url.setUserName(qsUserName); if (withPassword && !qsPassword.isEmpty()) { url.setPassword(qsPassword); } return url; } mumble-1.3.4/src/mumble/Plugins.ui0000664000175000017500000000775014010707273016702 0ustar builderbuilder PluginConfig 0 0 321 235 Plugins Options Enable plugins and transmit positional information This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. Link to Game and Transmit Position Plugins false false false false Name Enabled Reloads all plugins This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. &Reload plugins Qt::Horizontal 40 20 Information about plugin This shows a small information message about the plugin. &About Show configuration page of plugin This shows the configuration page of the plugin, if any. &Configure mumble-1.3.4/src/mumble/ConnectDialog.h0000664000175000017500000002307514010707273017602 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_CONNECTDIALOG_H_ #define MUMBLE_MUMBLE_CONNECTDIALOG_H_ #ifndef Q_MOC_RUN # include # include #endif #include #include #include #if QT_VERSION >= 0x050000 # include # include # include #else # include # include # include #endif #include #ifdef USE_BONJOUR #include #endif #include "BonjourRecord.h" #include "Net.h" #include "HostAddress.h" #include "Timer.h" #include "UnresolvedServerAddress.h" #include "ServerAddress.h" struct FavoriteServer; class QUdpSocket; struct PublicInfo { QString qsName; QUrl quUrl; QString qsIp; QString qsCountry; QString qsCountryCode; QString qsContinentCode; unsigned short usPort; bool bCA; }; struct PingStats { private: Q_DISABLE_COPY(PingStats) protected: void init(); public: quint32 uiVersion; quint32 uiPing; quint32 uiPingSort; quint32 uiUsers; quint32 uiMaxUsers; quint32 uiBandwidth; quint32 uiSent; quint32 uiRecv; double dPing; typedef boost::accumulators::accumulator_set > asQuantileType; asQuantileType *asQuantile; void reset(); PingStats(); ~PingStats(); }; class ServerItem; class ServerViewDelegate : public QStyledItemDelegate { Q_OBJECT Q_DISABLE_COPY(ServerViewDelegate) public: ServerViewDelegate(QObject *p = NULL); ~ServerViewDelegate(); void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE; }; class ServerView : public QTreeWidget { Q_OBJECT Q_DISABLE_COPY(ServerView) public: ServerItem *siFavorite, *siLAN, *siPublic; QMap qmContinentNames; QMap qmCountry; QMap qmContinent; ServerView(QWidget *); ~ServerView() Q_DECL_OVERRIDE; void fixupName(ServerItem *si); ServerItem *getParent(const QString &continent, const QString &countrycode, const QString &countryname, const QString &usercontinentcode, const QString &usercountrycode); protected: QMimeData *mimeData(const QList) const Q_DECL_OVERRIDE; QStringList mimeTypes() const Q_DECL_OVERRIDE; Qt::DropActions supportedDropActions() const Q_DECL_OVERRIDE; bool dropMimeData(QTreeWidgetItem *, int, const QMimeData *, Qt::DropAction) Q_DECL_OVERRIDE; }; #include "ui_ConnectDialog.h" #include "ui_ConnectDialogEdit.h" class ServerItem : public QTreeWidgetItem, public PingStats { Q_DISABLE_COPY(ServerItem) protected: void init(); public: enum ItemType { FavoriteType, LANType, PublicType }; static QMap qmIcons; bool bParent; ServerItem *siParent; QList qlChildren; QString qsName; QString qsHostname; unsigned short usPort; bool bCA; QString qsUsername; QString qsPassword; QString qsCountry; QString qsCountryCode; QString qsContinentCode; QString qsUrl; QString qsBonjourHost; BonjourRecord brRecord; /// Contains the resolved addresses for /// this ServerItem. QList qlAddresses; ItemType itType; ServerItem(const FavoriteServer &fs); ServerItem(const PublicInfo &pi); ServerItem(const QString &name, const QString &host, unsigned short port, const QString &uname, const QString &password = QString()); ServerItem(const BonjourRecord &br); ServerItem(const QString &name, ItemType itype, const QString &continent = QString(), const QString &country = QString()); ServerItem(const ServerItem *si); ~ServerItem(); /// Converts given mime data into a ServerItem object /// /// This function checks the clipboard for a valid mumble:// style /// URL and converts it into a ServerItem ready to add to the connect /// dialog. It also parses .lnk files of InternetShortcut/URL type /// to enable those to be dropped onto the clipboard. /// /// @note If needed can query the user for a user name using a modal dialog. /// @note If a server item is returned it's the callers reponsibility to delete it. /// /// @param mime Mime data to analyze /// @param default_name If true the hostname is set as item name if none is given /// @param p Parent widget to use in case the user has to be queried /// @return Server item or NULL if mime data invalid. /// static ServerItem *fromMimeData(const QMimeData *mime, bool default_name = true, QWidget *p = NULL, bool convertHttpUrls=false); /// Create a ServerItem from a mumble:// URL static ServerItem *fromUrl(QUrl url, QWidget *p); void addServerItem(ServerItem *child); FavoriteServer toFavoriteServer() const; QMimeData *toMimeData() const; static QMimeData *toMimeData(const QString &name, const QString &host, unsigned short port, const QString &channel = QString()); static QIcon loadIcon(const QString &name); void setDatas(double ping = 0.0, quint32 users = 0, quint32 maxusers = 0); bool operator< (const QTreeWidgetItem &) const Q_DECL_OVERRIDE; QVariant data(int column, int role) const Q_DECL_OVERRIDE; void hideCheck(); }; class ConnectDialogEdit : public QDialog, protected Ui::ConnectDialogEdit { private: Q_OBJECT Q_DISABLE_COPY(ConnectDialogEdit) void init(); protected: bool bOk; bool bCustomLabel; ServerItem *m_si; public slots: void validate(); void accept(); void on_qbFill_clicked(); void on_qbDiscard_clicked(); void on_qcbShowPassword_toggled(bool); void on_qleName_textEdited(const QString&); void on_qleServer_textEdited(const QString&); void showNotice(const QString &text); bool updateFromClipboard(); public: QString qsName, qsHostname, qsUsername, qsPassword; unsigned short usPort; ConnectDialogEdit(QWidget *parent, const QString &name, const QString &host, const QString &user, unsigned short port, const QString &password); /// Add a new Server /// Prefills from clipboard content or the connected to server if available ConnectDialogEdit(QWidget *parent); virtual ~ConnectDialogEdit(); }; class ConnectDialog : public QDialog, public Ui::ConnectDialog { friend class ServerView; private: Q_OBJECT Q_DISABLE_COPY(ConnectDialog) protected: static QList qlPublicServers; static QString qsUserCountry, qsUserCountryCode, qsUserContinentCode; static Timer tPublicServers; QMenu *qmPopup, *qmFilters; QActionGroup *qagFilters; QPushButton *qpbEdit; bool bPublicInit; bool bAutoConnect; Timer tPing; Timer tCurrent, tHover, tRestart; QUdpSocket *qusSocket4; QUdpSocket *qusSocket6; QTimer *qtPingTick; QList qlItems; ServerItem *siAutoConnect; QList qlDNSLookup; QSet qsDNSActive; QHash > qhDNSWait; QHash > qhDNSCache; QHash qhPingRand; QHash > qhPings; QMap qmPingCache; bool bIPv4; bool bIPv6; int iPingIndex; bool bLastFound; /// bAllowPing determines whether ConnectDialog can use /// UDP packets to ping remote hosts to be able to show a /// ping latency and user count. bool bAllowPing; /// bAllowHostLookup determines whether ConnectDialog can /// resolve hosts via DNS, Bonjour, and so on. bool bAllowHostLookup; /// bAllowBonjour determines whether ConfigDialog can use /// Bonjour to find nearby servers on the local network. bool bAllowBonjour; /// bAllowFilters determines whether filters are available /// in the ConfigDialog. If this option is diabled, the /// 'Show All' filter is forced, and no other filter can /// be chosen. bool bAllowFilters; QMap qmIcons; void sendPing(const QHostAddress &, unsigned short port); void initList(); void fillList(); void startDns(ServerItem *); void stopDns(ServerItem *); public slots: void accept(); void fetched(QByteArray xmlData, QUrl, QMap); void udpReply(); void lookedUp(); void timeTick(); void on_qaFavoriteAdd_triggered(); void on_qaFavoriteAddNew_triggered(); void on_qaFavoriteEdit_triggered(); void on_qaFavoriteRemove_triggered(); void on_qaFavoriteCopy_triggered(); void on_qaFavoritePaste_triggered(); void on_qaUrl_triggered(); void onFiltersTriggered(QAction *); void on_qtwServers_currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *); void on_qtwServers_itemDoubleClicked(QTreeWidgetItem *, int); void on_qtwServers_customContextMenuRequested(const QPoint &); void on_qtwServers_itemExpanded(QTreeWidgetItem *); void OnSortChanged(int, Qt::SortOrder); public: QString qsServer, qsUsername, qsPassword; unsigned short usPort; ConnectDialog(QWidget *parent, bool autoconnect); ~ConnectDialog(); #ifdef USE_BONJOUR protected: QList qlBonjourActive; public slots: void onUpdateLanList(const QList &); void onLanBrowseError(DNSServiceErrorType); void onResolved(BonjourRecord, QString, int); void onLanResolveError(BonjourRecord, DNSServiceErrorType); #endif }; #endif mumble-1.3.4/src/mumble/AppNap.h0000664000175000017500000000064414010707273016245 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_APPNAP_H_ #define MUMBLE_MUMBLE_APPNAP_H_ /// MUSuppressAppNap suppresses OS X's App Nap feature. void MUSuppressAppNap(bool suppress); #endif mumble-1.3.4/src/mumble/NetworkConfig.ui0000664000175000017500000003226214010707273020034 0ustar builderbuilder NetworkConfig 0 0 576 567 Form 0 0 Connection Use TCP compatibility mode <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). Force TCP mode Enable QoS to prioritize packets This will enable QoS, which will attempt to prioritize voice packets over other traffic. Use Quality of Service Reconnect when disconnected <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. Reconnect automatically Reconnect to last used server when starting Mumble Reconnect to last server on startup Don't send certificate to server and don't save passwords. (Not saved). <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> Suppress certificate and password storage 0 0 Proxy Type 0 0 Type of proxy to connect through <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. Direct connection HTTP(S) proxy SOCKS5 proxy Hostname Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 0 0 Hostname of the proxy <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. 0 0 0 0 Port 0 0 20 0 60 16777215 Port number of the proxy <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. 5 Username Username for proxy authentication <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Password Password for proxy authentication <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. QLineEdit::Password Privacy Prevent OS information being sent to Mumble servers and web servers <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. Do not send OS information to Mumble servers and web servers Mumble services Check for new releases of Mumble automatically. This will check for new releases of Mumble every time you start the program, and notify you if one is available. Check for application updates on startup Check for new releases of plugins automatically. This will check for new releases of plugins every time you start the program, and download them automatically. Download plugin and overlay updates on startup Submit anonymous statistics to the Mumble project <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. Submit anonymous statistics Qt::Vertical QSizePolicy::Expanding 20 40 MUComboBox QComboBox
widgets/MUComboBox.h
mumble-1.3.4/src/mumble/Tokens.cpp0000664000175000017500000000305214010707273016660 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "Tokens.h" #include "Database.h" #include "ServerHandler.h" // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" Tokens::Tokens(QWidget *p) : QDialog(p) { setupUi(this); qbaDigest = g.sh->qbaDigest; QStringList tokens = g.db->getTokens(qbaDigest); tokens.sort(); foreach(const QString &qs, tokens) { QListWidgetItem *qlwi = new QListWidgetItem(qs); qlwi->setFlags(qlwi->flags() | Qt::ItemIsEditable); qlwTokens->addItem(qlwi); } } void Tokens::accept() { QStringList qsl; QList items = qlwTokens->findItems(QString(), Qt::MatchStartsWith); foreach(QListWidgetItem *qlwi, items) { const QString &text = qlwi->text().trimmed(); if (! text.isEmpty()) qsl << text; } g.db->setTokens(qbaDigest, qsl); g.sh->setTokens(qsl); QDialog::accept(); } void Tokens::on_qpbAdd_clicked() { QListWidgetItem *qlwi = new QListWidgetItem(tr("Empty Token")); qlwi->setFlags(qlwi->flags() | Qt::ItemIsEditable); qlwTokens->addItem(qlwi); qlwTokens->editItem(qlwi); } void Tokens::on_qpbRemove_clicked() { foreach(QListWidgetItem *qlwi, qlwTokens->selectedItems()) delete qlwi; } mumble-1.3.4/src/mumble/mumble_tr.ts0000664000175000017500000142161014010707274017255 0ustar builderbuilder ACLEditor Deny Reddetmek Allow İzin ver Allow %1 Deny %1 %1 iznini reddet Mumble - Add channel Mumble - Kanal ekle Default server value Varsayılan sunucu değeri Failed: Invalid channel Başarısız: Geçersiz kanal Mumble - Edit %1 Mumble - %1'i düzenle ID: %1 Kimlik: %1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Bu, %1 iznini verir. Eğer bir izin hem verilir hem de reddedilirse, reddedilmiş sayılır.<br />%2 Channel must have a name Kanalın bir ismi olması lazım This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Bu, %1 iznini kaldırır. Eğer bir izin hem verilir hem de reddedilirse, reddedilmiş sayılır.<br />%2 Dialog Diyalog Name İsim Enter the channel name here. Kanalın ismini burada giriniz. Description Açıklama Password Parola Enter the channel password here. Kanalın parolasını burada giriniz. Check to create a temporary channel. Geçici kanal oluşturmak için seçiniz. Temporary Geçici <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Konum</b><br /> Bu değer Mumble'ın kanalları kanal ağacında düzenleme şeklini değiştirmenize imkân sağlar. Daha büyük bir <i>Konum</i> değeri olan bir kanal daha küçük değeri olan bir kanalın altında görüntülenecektir. <i>Konum</i> değeri eşit olan iki kanal isimlerine göre alfabetik olarak sıralanacaktır. Position Konum &Groups &Gruplar Group Grup List of groups Grup listesi Remove selected group Seçilen grubu kaldır Remove Kaldır Inherit group members from parent Grup üyelerini üst kanaldan al Inherit Al Make group inheritable to sub-channels Grubu alt kanallardan alınabilir olarak ayarla Inheritable Alınabilir Group was inherited from parent channel Grup üst kanaldan alındı Inherited Alınmış Members Üyeler Add Ekle Add member to group Gruba üye ekle Remove member from group Gruptan üye kaldır &ACL &EKL Active ACLs Etkin EKL'ler List of entries Unsur listesi Inherit ACL of parent? Üstten EKL özellikleri alınsın mı? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. Üst kanallar zincirinden EKL (Erişim Kontrol Listesi - Access Kontrol List ya da ACL olarak da bilinir) özelliklerinin alınıp alınmayacağını belirler. Sadece üst kanalda "Tüm alt kanallara uygula" olarak işaretlenen unsurlar alınacaktır. Inherit ACLs EKL'leri üstten al Move entry up Unsuru yukarı taşı This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. Unsuru listede yukarı taşır. Unsurlar sırayla değerlendirileceklerinden, bu kullanıcıların izinlerini değiştirmesine yol açabilir. Herhangi bir unsuru alınan bir unsurun üzerine taşıyamazsınız, bunu yapmanız hakîkaten gerekiyorsa alınan unsuru kopyalamanız gerekir. &Up &Yukarı Move entry down Unsuru aşağıya taşı This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. Unsuru listede yukarı taşır. Unsurlar sırayla değerlendirileceklerinden, bu kullanıcıların izinlerini değiştirmesine yol açabilir. &Down &Aşağı Add new entry Yeni unsur ekle This adds a new entry, initially set with no permissions and applying to all. Bu, başlangıçta hiçbir izni olmayan ve tümüne uygulanan yeni bir unsur ekler. &Add &Ekle Remove entry Unsur kaldır This removes the currently selected entry. Seçilen unsuru kaldırır. &Remove &Kaldır Context Bağlam Entry should apply to this channel. Entry should apply to this channel Bu kanala unsurun uygulanmasını sağlar. This makes the entry apply to this channel. Bu kanala unsurun uygulanmasını sağlar. Applies to this channel Bu kanala uygulanır Entry should apply to sub-channels. Unsur tüm alt kanallara uygulanır. Add new group Yeni grup ekle <b>Add</b><br/> Add a new group. <b>Ekle</b><br/> Yeni bir grup ekle. Inherited members Alınmış üyeler Contains the list of members added to the group by this channel. Gruba bu kanal tarafından eklenen üyelerin listesini içerir. Contains a list of members whose group membership will not be inherited from the parent channel. Üst kanaldan grup üyelikleri alınmayacak üyelerin listesini içerir. Contains the list of members inherited by other channels. Diğer kanallar tarafından alınan üyelerin listesini içerir. Type in the name of a user you wish to add to the group and click Add. Gruba ilâve etmek istediğiniz kullanıcının ismini girip Ekleye tıklayınız. Type in the name of a user you wish to remove from the group and click Add. Gruptan kaldırmak istediğiniz kullanıcının ismini girip Ekleye tıklayınız. Exclude Dışarıda tut Excluded members Dışarıda bırakılan üyeler This makes the entry apply to sub-channels of this channel. Bu seçenek, bu kanalın tüm alt kanallarına unsurun uygulanmasını sağlar. Applies to sub-channels Alt kanallara uygulanır Permissions İzinler User/Group Kullanıcı/Grup Group this entry applies to Bu unsurun uygulandığı grup User ID Kullanıcı kimliği User this entry applies to Bu unsurun uygulandığı kullanıcı This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. Bu unsurun hangi kullanıcıya uygulandığını yönetir. Sunucuda bir denkleşme aramak için bir kullanıcı ismi girmeniz yeterlidir. &Properties &Özellikler <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>İsim</b><br />Kanalın ismini bu alanda giriniz. İsmin, bağlandığınız sunucunun koyduğu sınırlamalara uyması gerekir. <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>Geçici</b><br /> Seçildiğinde, oluşturulan kanal geçici olarak işaretlenecektir. Bu, son kullanıcının çıktığında kanalın sunucu tarafından otomatik olarak silineceği anlamına gelir. <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>Grup</b><br /> Güncel olarak kanal için tanımlanmış tüm gruplar. Yeni bir grup oluşturmak için ismini yazıp giriş (enter) tuşuna basmanız kâfidir. <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>Kaldır</b><br />Seçilen grupları kaldırır. Eğer bir grup üst kanaldan alındıysa, listeden kaldırılmaz ancak grup hakkındaki tüm yerel bilgiler silinir. <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>Al</b><br />Üst kanalda grup <i>Alınabilir</i> olarak işaretlendiyse, gruptaki tüm üyeleri üst kanaldan alır. <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>Alınabilir</b><br />Bu, grubu alt kanallara verilebilir yapar. Eğer grup alt kanallardan alınamazsa, alt kanallar aynı isimde yeni bir grup oluşturabilirler. <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>Alınmış</b><br />Grubun üst kanaldan alındığını belirtir. Bu bayrağı düzenleyemezsiniz, sadece bilgi vermek için bulunur. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>Üyeler</b><br /> Bu liste, güncel kanal tarafından gruba eklenen tüm üyeleri gösterir. Kanal hiyerarşisinin daha üst seviyeleri tarafından alınan üyelerin buna dahil olmayacağını unutmayınız. Bu üyeler <i>Alınmış üyeler</i> listesinde bulunacaktır. Bu listenin alt kanallar tarafından alınmasını engellemek için <i>Alınabilir</i> seçeneğini devre dışı bırakın veya üyeleri <i>Dışarıda bırakılan üyeler</i> listesine elle ekleyin. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>Dışarıda bırakılan üyeler</b><br /> Üst kanaldan grup üyelikleri alınmayacak üyeler listesi içerir. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. <b>Alınmış üyeler</b><br /> Güncel kanal tarafından alınmış üyelerin listesini içerir. Üst kanallardan üye almamak için <i>Al</i> şıkkını devre dışı bırakınız. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. Bu unsurun hangi kullanıcı gruplarına uygulandığını yönetir.<br />Grubun, unsurun kullanıldığı kanal bağlamında değerlendirildiğini unutmayınız. Örneğin kök kanalda varsayılan EKL'ler <i>yöneticiler</i> grubuna <i>Yaz</i> iznini verir. Bu unsur, bir kanal tarafından alındıysa, kullanıcı EKL'in tanımlandığı kanalda <i>yöneticiler</i> grubuna üye olmasa bile, bu kanalda <i>yöneticiler</i> grubuna ait bir kullanıcıya yazma iznini verecektir. Bir grubun ismi '!' ile başlarsa üyeliği olumsuzlanır, '~' ile başlarsa EKL'in etkin olduğu kanal yerine tanımlandığı kanal bağlamında değerlendirilir.<br />Eğer bir grup ismi '#' ile başlarsa, bu bir erişim jetonu olarak değerlendirilir. Denk gelmesi için kullanıcıların erişim jeton listelerinde '#' karakterini izleyen metni girmiş olmaları gerekir. Kanallara kimliği doğrulanmamış kullanıcıların erişimi için çok basit bir parola sistemi olarak kullanılabilir.<br />Eğer grup ismi '$' ile başlarsa, sadece sertifikalarının hash değerinin '$' karakterini izleyen metne denk geldiği kullanıcılar dikkate alınır.<br />Birkaç öntanımlı özel grup vardır:<br /><b>all</b> - Herkes denk gelir.<br /><b>auth</b> - Kimliği doğrulanmış tüm kullanıcılar denk gelir.<br /><b>sub,a,b,c</b> - Güncel olarak <i>b</i> ilâ <i>c</i> sayı alt kanalda bulunan ve asgari <i>a</i> paylaşılan üst kanalı bulunan kullanıcılar. Bu unsur hakkında daha fazla bilgi için sitemize bakınız.<br /><b>in</b> - Güncel olarak kanalda bulunan kullanıcılar denk gelir ('<i>sub,0,0,0</i>' değeri için bir kısaltma olarak görülebilir.)<br /><br /><b>out</b> Kanal dışındaki kullanıcılar denk gelir ('<i>!sub,0,0,0</i>' değeri için bir kısaltma olarak kabul edilebilir).<br />Bir unsurun ya bir gruba ya da bir kullanıcıya uygulandığını, ancak her ikisine aynı anda uygulanmadığını unutmayınız. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. <b>Parola</b><br />Bu alan bir kanalın parolasını kolayca belirlemenize ya da değiştirmenize imkân sağlar. Arka planda Mumble'ın erişim jetonlarını kullanır. Daha güçlü ve ayrıntılı bir kontrole ihtiyacınız varsa grupları ve EKL'leri kullanınız. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. Bu kanalda etkin tüm unsurları gösterir. Üst kanallardan alınan unsurlar italik olarak gösterilecektir.<br />EKL'ler yukarıdan aşağıya değerlendirilirler, ki bu önceliğin listede aşağıya inildikçe artacağı anlamına gelir. ID of the channel. Kanalın kimliği. Maximum Users Azami Kullanıcı Sayısı Maximum number of users allowed in the channel Kanalda müsaade edilen azami kullanıcı sayısı <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. <b>Azami Kullanıcı Sayısı</b><br /> Bu değer kanalda izin verilen azami kullanıcı sayısını ayarlamanıza izin verir. Eğer değer sıfırdan yüksekse sadece o sayıdaki kullanıcı kanala girebilecektir. Eğer değer sıfırsa kanaldaki azami kullanıcı sayısı sunucunun varsayılan sınırı tarafından belirlenir. This is the sort order for the channel. ALSAAudioInput Default ALSA Card Varsayılan ALSA Kartı Opening chosen ALSA Input failed: %1 Seçilen ALSA girdisinin açılması başarısız oldu: %1 ALSAAudioOutput Default ALSA Card Varsayılan ALSA kartı Opening chosen ALSA Output failed: %1 Seçilen ALSA Çıktısı başarısız oldu: %1 ASIOConfig %1 (version %2) %1 (sürüm %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz %1 -> %2 örnek tamponu, %5 Hz frekansında %3 örnekleme çözünürlüğü ile (%4 önerilir) ASIO Initialization failed: %1 ASİO başlangıcı başarısız oldu: %1 Failed to instantiate ASIO driver ASİO sürücüsünün örneklemesi (instantiation) başarısız oldu ASIO ASİO Device selection Cihaz seçimi Device Cihaz Device to use for microphone Mikrofon için kullanılacak cihaz This chooses what device to query. You still need to actually query the device and select which channels to use. Sorgulanacak cihazı seçer. Bundan sonra cihazı sorgulamanız ve kullanılacak kanalları seçmeniz gerekir. Query selected device Seçilen cihazı sorgula This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. Bu, seçilen cihazı yapılandırır. Birçok ASİO sürücüsünün oldukça hatalı olduğunu ve onları sorgulamanın uygulama ya da sisteminizi çökertebileceği dikkatinize sunulur. &Query &Sorgula Configure selected device Seçilen cihazı yapılandır This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. Bu, seçilen cihazı yapılandırır. Birçok ASİO sürücüsünün oldukça hatalı olduğunu ve onları sorgulamanın uygulama ya da sisteminizi çökertebileceği dikkatinize sunulur. &Configure &Yapılandır Capabilities Yetenekler Driver name Sürücü ismi Buffer size Tampon boyutu This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. Bu, ASİO için girdi kanallarını yapılandırır. En az bir kanalı mikrofon ve hoparlör olarak seçtiğinize emin olunuz. <i>Mikrofon</i>, mikrofonunuzun bağlı olduğu konum ve <i>Hoparlör</i> '<i>duyduğunuzu</i>' örnekleyen bir kanal olmalıdır. Mesela Audigy 2 ZS için iyi bir mikrofon seçimi '<i>Mic L</i>' değeridir; Hoparlör ise '<i>Mix L</i>' ve '<i>Mix R</i>' olmalıdır. Configure input channels Girdi kanallarını yapılandır Channels Kanallar Microphone Mikrofon <- <- -> -> Unused Kullanılmıyor Speakers Hoparlörler ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. ASİO'yu kullanmak için en az bir mikrofon ve bir hoparlör kaynağı seçmeniz gerekir. Sadece mikrofon örneklemesine ihtiyacınız varsa, DirectSound'u kullanınız. Opening selected ASIO device failed. No input will be done. Seçilen ASİO cihazının açılması başarısız oldu. Hiçbir girdi alınmayacak. AboutDialog About Mumble Mumble Hakkında <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> <h3>Mumble (%1)</h3><p>%3</p><p><b>Oyuncular için sesle sohbet etme aracı</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble Mumble &Hakkında &License &Lisans A&uthors G&eliştiriciler &Third-Party Licenses OK Tamam AudioInput Interface Arayüz System Sistem Input method for audio Ses için girdi metodu <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Ses için kullanılacak girdi metodu.<b><br />Muhtemelen DirectSound'u kullanmak isteyeceksiniz. Device Cihaz Input device for audio Ses için girdi cihazı <b>This is the input device to use for audio.</b> <b>Bu, ses için kullanılacak girdi cihazıdır.</b> Transmission Aktarım &Transmit &Aktar When to transmit your speech Konuşmanızın ne zaman aktarılacağı <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. <b>Konuşmanızın ne zaman aktarılacağını ayarlar.</b><br /><i>Devamlı</i> - Her zaman<br /><i>Ses Etkinliği</i> - Açıkça konuştuğunuz zaman.<br /><i>Bas ve Konuş</i> - <i>Kısayollar</i>da belirtilen tuşa bastığınız zaman. DoublePush Time Çift basma süresi If you press the PTT key twice in this time it will get locked. Bu süre içinde Bas ve Konuş tuşuna ikinci kez basarsanız kilitlenecektir. <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. <b>Çift basma süresi</b><br />Eğer bas-ve-konuş tuşuna belirtilen süre içerisinde ikinci kez basarsanız kilitlenecektir. Mumble bu tuşa tekrar basıp kilidi açmadığınız sürece devamlı aktarım yapacaktır. Reset audio cue to default Ses işaretlerini sıfırla <b>Reset</b><br/>Reset the paths for the files to their default. <b>Sıfırla</b><br/>Dosya yollarını varsayılan değerlere geri al. Browse for on audio file Açık ses dosyası için tara Browse for off audio file Kapalı ses dosyası için tara Off Kapalı On Açık Preview the audio cues Ses işaretleri önizlemesi Use SNR based speech detection SNR'e dayalı konuşma tespiti Signal to Noise Sinyal / Gürültü <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. <b>Konuşma tespitinin amplitüd kullanmasını sağlar.</b><br />Bu kipte, girdi sinyalinin kaba kuvveti konuşma tespiti için kullanılır. Amplitude Amplitüd Voice &Hold Aktarım &Devamı How long to keep transmitting after silence Sessizlikten sonra ne kadar süre aktarıma devam edileceği Silence Below Aşağısında sessizlik <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. <b>Konuşma tespiti için tetikleyici değerleri belirler.</b><br />Ses İstatistikleri penceresi ile değerleri elle ayarlamanız tavsiye edilir. "Aşağısında sessizlik" değerinden düşük girdi değerleri her zaman sessizlik olarak sayılırlar. "Üstünde Konuşma"dan yüksek değerler daima konuşma sayılırlar. Aradaki değerler, zaten konuşmaktaysanız konuşma sayılırlar, ancak yeni bir tespit tetiklemezler. Speech Above Üstünde Konuşma Signal values above this count as voice Bu değerden yüksek sinyaller konuşma sayılır Compression Sıkıştırma &Quality &Kalite Quality of compression (peak bandwidth) Sıkıştırma kalitesi (azami bant genişliği) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. <b>Sıkıştırma kalitesini ayarlar.</b><br />Mumble'ın dışarıya giden ses verileri için kullanabileceği bant genişliği miktarını belirtir. Audio per packet Paket başı ses How many audio frames to send per packet Paket başına ne kadar ses verisi gönderileceği <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>Paket başına konulacak ses veri miktarını belirler.</b><br />Bu değeri arttırmanız konuşmanızın gecikmesini arttıracaktır, ancak aynı zamanda bant genişliği gereksinimlerini azaltacaktır. <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). <b>Dışarıya giden azami bant genişliğini gösterir.</b><br />Bilgisayarınızdan gönderilen azami bant genişliğini gösterir. Ses veri akışı (bitrate) sadece ses verileri için azami veri akışıdır (VBR kullandığımız için). Konum, konumsal veriler için kullanılan veri akışıdır. Yük ise veri bölme ve İP paket başlıklarıdır (İP ve UDP bu yükün %75'ini oluşturur). Audio Processing Ses İşlenmesi Noise Suppression Gürültü İptali Noise suppression Gürültü iptali <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. <b>Uygulanacak azami gürültü iptalini belirler.</b><br />Bu değer ne kadar büyükse, sabit gürültü o kadar çok silinecektir. Maximum amplification of input sound Girdi sesinin azami yükseltilmesi <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. <b>Girdinin azami yükseltilmesi (amplifikasyon)</b><br />Mumble sıkıştırmadan önce girdi sesini normalize eder, ve bu ne kadar yükseltebileceğini ayarlar.<br />Asli seviye konuşmanıza dayalı olarak devamlı güncellenir, fakat hiçbir zaman burada belirtilen değeri geçmez.<br />Eğer <i>Mikrofon hacmi</i> ses istatistikleri %100 civarındaysa, bunu muhtemelen 2.0 civarı bir değere ayarlamak en iyisidir. ama eğer kullanıcıların çoğu gibi %100 değerine erişemiyorsanız, çok daha yüksek bir değer seçiniz.<br />İdeal durumda, çok alçak sesle konuşuyorsanız bile <i>Mikrofon hacmi * Yükseltme faktörü >=100</i> olacak şekilde seçiniz.<br /><br />Azami değeri seçmenin hiçbir kötü yanı yoktur, ancak bu değere otomatik olarak ulaşmasına izin verirseniz, Mumble başka konuşmaları da duymaya başlar. Current speech detection chance Güncel ses tespiti ihtimâli Cancel echo from speakers Hoparlörlerden gelen yankı iptali Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. Bunu etkinleştirmeniz hoparlörlerden gelen yankıyı iptal eder. Karışığın mikroişlemciye yükü düşük olur ancak bu sadece hoparlörlerinizin ses hacmi eşitse ve mikrofondan eşit mesafede bulunuyorlarsa iyi sonuç verir. Çoklu kanal eko iptali çok daya iyi sonuç verir ancak mikroişlemciye ek yükü yüksektir. Disabled Devre dışı <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>Konuşma tespitinin Sinyal / Gürültü oranını kullanmasını sağlar.</b><br />Bu kipte, girdi net bir sinyale benzeyen bir şey bulmak için analiz edilir, ve sinyalin netliği konuşma tespiti için kullanılır. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>Güncel konuşma tespiti ayarlarını gösterir.</b><br />Bu ayarları Ayarlar diyaloğundan ya da Ses Sihirbazı vasıtasıyla değiştirebilirsiniz. Signal values below this count as silence Bu değerden düşük sinyaller sessiz sayılır Maximum bandwidth used for sending audio Ses gönderimi için kullanılacak azami bant genişliği Use Amplitude based speech detection Amplitüde dayalı konuşma tespiti kullan <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). <b>Bu, konuşmada algılanan bir durmadan sonra ne kadar süre boyunca ses aktarımının devam edeceğini belirler.</b><br />Bu değeri, konuştuğunuzda sesinizde kesiklikler oluşursa (isminizin yanında hızlı bir şekilde yanıp sönen bir ikon ile gösterilir) yükseltin. Exclusive mode Ayrıcalıklı kip <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>Cihazı ayrıcalıklı kipte açar.</b><br />Başka hiçbir uygulama bu cihazı kullanamaz. Exclusive Ayrıcalıklı R&eset &Sıfırla &Browse... &Tara... B&rowse... T&ara... &Preview &Önizleme <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. <b>Önizleme</b><br />Güncel <i>açık</i> sesini ve arkasından güncel <i>kapalı</i> sesini çalar. Displays an always on top window with a push to talk button in it Bas ve Konuş düğmesi bulunduran daima üstte bir pencere görüntüler Display push to talk window Bas ve Konuş penceresini göster Misc Çeşitli Audible audio cue when starting or stopping to transmit Aktarım başladığında ve bittiğinde duyulabilir işaret <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. <b>Aktarım ses işaretlerin etkinleştirir.</b><br />Seçilirse, aktarmaya başladığınızda ve bu sona erdiğinde kısa bir bip sesi duyarsınız. Audio cue Sesli işaretler Gets played when starting to transmit Aktarıma başlanıldığında çalınır Gets played when stopping to transmit Aktarım sona erdiğinde çalınır Hold Time Tutma Süresi Time the microphone stays open after the PTT key is released Bas ve Konuş tuşunun bırakılmasının ardından mikrofonun açık kalma süresi Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) Sunucun azami ses bant genişliği sadece şudur: %1 kbit/s. Ses kalitesi otomatik olarak şuna ayarlanmıştır: %2 kbit/s (%3 ms) Max. Amplification Azami Yükseltme Idle action Boşta faaliyet (Idle) minutes do dakika şunu yap: nothing hiçbir şey yapma deafen sağır et mute sustur after geçtikten sonra Echo Cancellation Yankı İptali Mixed echo cancellation Karışık yankı iptali Multichannel echo cancellation Çoklu kanal yankı iptali The idle action will be reversed upon any key or mouse button input Undo Idle action upon activity Apply RNNoise's noise suppression filter. <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. RNNoise Audio input AudioInputDialog Continuous Devamlı Voice Activity Ses Etkinliği Push To Talk Bas ve Konuş Audio Input Ses Girdisi %1 ms %1 ms Off Kapalı %1 s %1 s %1 kb/s %1 kb/s -%1 dB -%1 dB %1 kbit/s (Audio %2, Position %4, Overhead %3) %1 kbit/s (Ses %2, Konum %4, Yük %3) AudioOutput Interface Arayüz System Sistem Output method for audio Ses için çıktı metodu <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Ses için kullanılacak çıktı metodu.</b><br />Muhtemelen DirectSound'u kullanmak isteyeceksiniz. Device Cihaz Output device for audio Ses için çıktı cihazı <b>This is the output device to use for audio.</b> <b>Bu, ses için kullanılacak çıktı cihazıdır.</b> Positional Audio Konumsal Ses Audio Output Ses Çıktısı Default &Jitter Buffer Varsayılan &Jitter Tamponu Safety margin for jitter buffer Jitter tamponu için güvenlik aralığı <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. <b>Jitter (titreme) tamponu için asgari emniyet aralığını aralar.</b><br />İçeriye gelen tüm ses arabelleğe alınır, ve gecikmeyi en aza indirmek için jitter tamponu devamlı şebekenin kaldırabileceği asgari değere itmeye çalışır. Bu seçenek kullanılacak asgari tampon boyutunu belirler. Duyduğunuz cümlelerin başında bozukluk varsa bu değeri arttırınız. Minimum distance to user before sound volume decreases Ses hacmi düşülmeden önce asgari mesafe This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. Ses hesapları için asgari mesafeyi belirler. Diğer kullanıcıların ses seviyesi sizden en az bu kadar uzaklaşmadıkları sürece düşürülmeyecektir. This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. Ses hesapları için azami mesafeyi belirler. Bu mesafeden fazla uzaklaşırlarsa, ne kadar uzaklaşırlarsa uzaklaşsınlar diğer kullanıcıların ses seviyesi daha fazla düşürülmeyecektir. <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. <b>Geri döngü test kiplerinden birini etkinleştirir.</b><br /><i>Hiçbiri</i> -Geri döngüyü devre dışı bırakır<br /><i>Yerel</i> - Yerel bir sunucuyu taklit eder.<br /><i>Sunucu</i> - Sunucudan geri döngü talep eder.<br />Geri döngü etkinleştirildiğinde diğer kullanıcıların sesinizi duymayacaklarını unutmayınız. Bu ayar uygulamadan çıkıldığında saklanmaz. Volume Hacim Volume of incoming speech Gelen konuşma için ses hacmi <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. <b>İçeriye gelen konuşmaların ses seviyesini ayarlar.</b><br />Değeri %100'ün üzerine çıkarırsanız ses bozulur. Output Delay Çıktı Gecikmesi Amount of data to buffer Tampona alınacak veri miktarı The connected "speakers" are actually headphones The connected "speakers" are actually headphones. Bağlı "hoparlörler" aslında kulaklıktır Factor for sound volume decrease Ses hacmi düşürülmesi için katsayı Bloom Genişletme Factor for sound volume increase Ses hacmi yükseltilmesi için katsayı How much should sound volume increase for sources that are really close? Çok yakın olan kaynaklar için ses seviyesi ne kadar yükseltilmelidir? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. Bu şıkkı seçmeniz bağlı hoparlörlerinizin olmadığını, sadece kulaklık kullandığınızı belirtir. Bu mühimdir, çünkü hoparlörler tipik olarak önünüzde bulunurlar, halbuki kulaklıklar doğrudan sağ ve solunuzdadır. This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Çıktı tamponunda önbelleğe alınacak veri miktarını ayarlar. Değişik değerleri deneyiniz ve seste parazit yaratmayan en düşük değeri seçiniz. Headphones Kulaklıklar Minimum Distance Asgari Mesafe Maximum Distance Azami Mesafe Maximum distance, beyond which speech volume won't decrease Azami mesafe, geçildiğinde ses seviyesi düşürülmeyecektir Minimum Volume Asgari Hacim What should the volume be at the maximum distance? Azami mesafede ses seviyesi ne olmalıdır? Loopback Test Geri döngü Testi Delay Variance Gecikme Değişikliği Variance in packet latency Paket gecikmesinde değişmeler <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>Geri döngü testi için paket gecikmesinde değişkenliği (latency variance) ayarlar.</b><br />Ses yollarının çoğu değişik gecikme içerir. Bu seçenek bu değişmeleri geri döngü kipinde testler için belirtmenize izin verir. Mesela 15ms değerini seçerseniz, bu, 20-35ms ping gecikmesi ya da 80-95ms gecikme olan şebekeleri taklit eder. Kişisel İnternet bağlantılarının çoğu 5ms civarı bir değişme içerirler. Packet Loss Paket Kaybı Packet loss for loopback mode Geri döngü kipinde paket kaybı <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% <b>Geri döngü kipinde paket kaybını ayarlar.</b><br />Bu, kaybedilen paketlerin oranı olacaktır. Dışarıya giden bant genişliğinizde aşırı yük olmadığı ve bağlantınızda bir sorun meydana gelemediği sürece, bunun değeri %0 olur &Loopback &Geri döngü Desired loopback mode İstenilen geri döngü kipi Attenuate applications by... Uygulamaları bu kadar kıs... Attenuation of other applications during speech Diğer tüm uygulamaları konuşma sırasında kıs <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. <b>Diğer tüm uygulamaların sesini konuşma sırasında kıs</b><br />Mumble, diğer uygulamaların sesini, gelen ya da giden konuşma verileri bulunduğunda kısmayı destekler. Bu, etkinleştirildiyse, diğer uygulamaların sesinin kısılma miktarını belirler. If checked Mumble lowers the volume of other applications while other users talk Seçiliyse, Mumble kullanıcılar konuştuğunda diğer uygulamaların sesini kısar <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. <b>Diğer uygulamaların sesini kullanıcılar konuştuğunda kıs</b><br />Mumble, diğer uygulamaların sesini, gelen ya da giden konuşma verileri bulunduğunda kısmayı destekler. Bu seçenek işlevi diğer kullanıcılar sizinle konuştukları zaman için etkinleştirir. while other users talk diğer kullanıcılar konuşurken If checked Mumble lowers the volume of other applications while you talk Seçiliyse, Mumble konuştuğunuzda diğer uygulamaların sesini kısar <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. <b>Diğer uygulamaların sesini siz konuştuğunuzda kıs</b><br />Mumble, diğer uygulamaların sesini, gelen ya da giden konuşma verileri bulunduğunda kısmayı destekler. Bu seçenek işlevi siz konuştuğunuz zaman için etkinleştirir. while you talk konuştuğunuzda Exclusive mode, not recommended. Ayrıcalıklı kip, tavsiye edilmez. <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>Cihazı ayrıcalıklı kipte açar.</b><br />Başka hiçbir uygulama bu cihazı kullanamaz. Exclusive Ayrıcalıklı Priority Speaker Öncelikli Konuşmacı If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. "Öncelikli Konuşmacı" olarak işaretlendiğinizde, siz konuşurken Mumble diğer kullanıcıların sesini kısar. <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. <b>Öncelikli Konuşmacı olarak konuşurken diğer kullanıcıların sesini azalt.</b><br />Mumble <i>Öncelikli Konuşmacı</i> olarak konuşurken rahatsız edilmemeniz için, diğer kullanıcıların sesini kısabilir. Onay kutusunu işaretlemeniz bu özelliği açacaktır. Attenuate other users while talking as Priority Speaker. Öncelikli Konuşmacı iken diğer kullanıcıları sesini azalt. Advanced Attenuation Options Gelişmiş Ses Kısma Seçenekleri If checked, Mumble will only attenuate applications that are using the same output source as Mumble Seçiliyse, Mumble sadece kendisiyle aynı çıktı kaynağını kullanan uygulamaların sesini kısacaktır. <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. <b>Sadece Mumble ile aynı çıktıyı kullanan uygulamaların sesini kıs</b><br />Seçiliyse, Mumble'dan başka çıktı kullanan uygulamaların sesi kısılmayacaktır. Only attenuate applications using the same output device Sadece aynı çıktı cihazını kullanan uygulamaların sesini kıs If checked, PulseAudio loopback modules will be attenuated Seçiliyse, PulseAudio geri döngü öbeklerinin sesi kısılacaktır <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. <b>PulseAudio geri döngü öbeklerinin sesini kıs</b><br />Eğer geri döngü öbekleri Mumble'ın çıktı cihazına bağlı iseler, onların da sesi kısılacaktır. Attenuate PulseAudio loopback modules PulseAudio geri döngü öbeklerinin sesini kıs Audio output AudioOutputDialog None Hiçbiri Local Yerel Server Sunucu Audio Output Ses Çıktısı %1 ms %1 ms %1 % %1 % %1 m %1 m AudioOutputSample Choose sound file Ses dosyası seçiniz Invalid sound file Geçersiz ses dosyası The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. '%1' dosyası Mumble tarafından kullanılamaz. Lütfen uyumlu biçim ve kodlamalı bir dosya seçiniz. AudioStats >1000 ms >1000ms >1000 ms Audio Statistics Ses İstatistikleri Input Levels Girdi seviyeleri Peak microphone level Azami mikrofon seviyesi Peak power in last frame Önceki çerçevedeki azami güç This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. Son çerçevedeki (20 ms) azami gücü gösterir ve genelde "girdi gücü" olarak gösterilen ölçümün aynısıdır. Lütfen bunu göz ardı edip yerine <b>Mikrofon gücü</b>ne bakınız çünkü çok daha kararlıdır ve dengesiz değerleri göz ardı eder. Peak speaker level Azami hoparlör seviyesi This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. Son çerçevede (20 ms) hoparlörlerin azami seviyesini gösterir. Hoparlör kanalları yapılandırılmış çoklu-kanal örnekleme metodu kullanmıyorsanız bu 0 olacaktır. Eğer böyle bir düzenek yapılandırdıysanız ve başka uygulamalarda ses çalındığında bu değer hâlâ sıfırı gösteriyorsa, düzeneğiniz çalışmıyor demektir. Peak clean level Azami temiz seviye This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. Son çerçevede (20 ms) tüm işlenmeler bittikten sonraki azami gücü gösterir. İdeal olarak konuşmadığınızda -96dB olur, ancak gerçekte bir stüdyoda -60dB değeri elde edilebilir ve şanslıysanız -20dB civarı bir değer görürsünüz. Konuştuğunuzda bu değer -5 ilâ -10dB civarına yükselecektir.<br />Yankı iptali kullanıyorsanız ve konuşmadığınızda bu değer -15dB'nin üzerine çıkıyorsa yapılandırmanızda bir hata var demektir ve yankılarla diğer kullanıcıların canını sıkarsınız. Signal Analysis Sinyal Analizi Microphone power Mikrofon gücü How close the current input level is to ideal Güncel girdinin ideale ne kadar yakın olduğu This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. Şu andaki ses girdi seviyesinin ideale ne kadar yakın olduğunu gösterir. Mikrofon seviyenizi ayarlamak için, kaydetme seviyesini ayarlamak için kullandığınız uygulamayı başlatıp konuşun ve buradaki değere bakın.<br /><b>Bir çaylak tarafından öldürüldüğünüzde olacağı gibi yüksek sesle konuşun</b><br /> Seviyeyi %100'e yakın olacak ancak bunu geçmeyecek bir şekilde ayarlayın. Geçerseniz konuşmanızda muhtemelen ses kalitesini düşüren kırpmalar oluşacaktır. Signal-To-Noise ratio Sinyal / Gürültü oranı Signal-To-Noise ratio from the microphone Mikrofondan Sinyal / Gürültü oranı This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. Bu, son çerçevede (20 ms) mikrofonun Sinyal / Gürültü oranıdır. Gürültüye oranla sesinizin netliğini gösterir.<br />Bu değer 1.0'dan düşükse sinyalde sesten çok gürültü var demektir, dolayısıyla kalite düşer. Bu değerin üst sınırı yoktur ancak stüdyoda olmadan 40 ilâ 50'nin üstü bir değer görmeyi beklemeyin. Speech Probability Konuşma İhtimâli Probability of speech Konuşma olması ihtimâli This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). Son çerçevenin (20 ms) ortam gürültüsü yerine konuşma olması ihtimâli.<br />Konuşma aktarımı bu ayarın doğruluğuna bağlıdır. Bir cümlenin ortası daima konuşma olarak tespit edilir, ama sorun kelimeler arasındaki boşluklar ve konuşmanın başlangıcıdır. 'h' harfi ile başlayan bir kelime ile bir iç çekişi ayırt etmek zordur.<br />Bunun kalın yazı tipinde olması, Mumble'ın aktarım yaptığını gösterir (eğer çevrim içindeyseniz). Configuration feedback Yapılandırma geri bildirimi Current audio bitrate Güncel ses bit akış oranı Bitrate of last frame Son çerçevenin bit akış oranı DoublePush interval Çift basma aralığı Time between last two Push-To-Talk presses Son iki Bas-ve-Konuş basma arası zaman Speech Detection Konuşma Tespiti Current speech detection chance Güncel konuşma tespit ihtimâli <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>Güncel ses tespit ayarlarını gösterir.</b><br />Bu ayarları Ayarlar diyaloğunda ya da Ses Sihirbazı ile değiştirebilirsiniz. Signal and noise power spectrum Sinyal ve gürültü gücü spektrumu Power spectrum of input signal and noise estimate Girdi sinyali ve gürültü tahmininin güç spektrumu This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. Güncel girdi sinyal gücünün spektrumunu (kırmızı çizgi) ve güncel gürültü tahminini (mavi) gösterir.<br />Tüm amplitüdler, dikkate değer kısımları (her bant aralığında gürültüden çok ne kadar sinyal olduğunu) göstermek için 30'la çarpılmıştır.<br />Bu muhtemelen sadece mikrofonunuz ile gürültü koşullarının ince ayarını yapıyorsanız dikkate değerdir. İyi koşullarda en aşağıda sadece ince bir mavi bölüm olması gerekir. Eğer mavi grafiğin yarısının üzerine kadar çıkıyorsa, ciddi şekilde gürültülü bir ortamdasınız demektir. Echo Analysis Yankı Analizi Weights of the echo canceller Yankı iptalinin ağırlığı This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. Yankı iptalinin ağırlığını gösterir, zaman aşağıya doğru artar ve frekans sağda artar. İdeal durumda hiçbir yankının olmadığını siyah renk ile gösterir. Genel durumda bir ya da daha fazla mavimtırak yatay çizgiler görürsünüz ki bunlar yankıları gösterir. Ağırlıkların gerçek zamanlı güncellemelerinizi görmeniz gerekir.<br />Yankı yaratacak hiçbir şey olmadığı sürece burada dikkate değer veri görmeyeceğinizi unutmayınız. Müzik çalarsanız durum açıklaşır ve sabitleşir.<br />Frekans-alanı ağırlıklarının gerçek ya da sanal kısımlarını, veya hesaplanan modül ve fazı görüntülemeyi seçebilirsiniz. Muhtemelen bunların en yararlısı yankının amplitüdü olan modüldür ve gönderilen sinyalin bu zaman çerçevesinde ne kadarının kaldırıldığını gösterir. Diğer görüntüleme kipleri en çok yankı algoritmaları ayarlamak isteyen kişilerin işine yarar<br /> Lütfen dikkat: Modül kipinde bütün görüntü önemli bir şekilde dalgalanırsa, bu yankı iptalinin iki girdi kaynağı (mikrofon ve hoparlörler) arasında hiçbir korelasyon bulamadığı anlamına gelir. Ya yankı için çok yüksek bir süre bulunduğunu, ya da girdi kaynaklarının yanlış yapılandırılmış olduğunu gösterir bu. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. Son sıkıştırılmış çerçevenin (20 ms) ses veri akış oranıdır ve VBR kaliteyi ayarladıkça bu değer düşecek ve artacaktır. Azami veri akış oranı Ayarlar diyaloğunda belirtilebilir. AudioWizard Audio Tuning Wizard Ses Ayar Sihirbazı Introduction Başlangıç Welcome to the Mumble Audio Wizard Mumble Ses Ayar Sihirbazına hoş geldiniz Finished Tamamlandı Enjoy using Mumble Mumble'ı kullanmanın tadını çıkarın Device selection Cihaz seçimi Selecting the input and output device to use with Mumble. Mumble ile kullanılacak girdi ve çıktı cihazlarının seçimi. This is the device your microphone is connected to. Bu, mikrofonunuzun bağlı olduğu cihazdır. System Sistem Input method for audio Ses için giriş metodu <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Ses için kullanılacak girdi metodu.<b><br />Muhtemelen DirectSound'u kullanmak isteyeceksiniz. Device Cihaz Input device to use Kullanılacak girdi cihazı <b>Selects which sound card to use for audio input.</b> <b>Ses girişi için kullanılacak ses kartını seçer.</b> Cancel echo from headset or speakers Kulaklıklarda ya da hoparlörlerde yankı iptali Use echo cancellation Yankı iptali kullan This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. Bu, hem kulaklıklarda hem de hoparlörlerde yararlı olacak şekilde dışarıya giden ses için yankı iptalini etkinleştirir. This is the device your speakers or headphones are connected to. Bu, kulaklıklarınızın ya da hoparlörlerinizin bağlı olduğu cihazdır. Output method for audio Ses için çıktı metodu <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Ses için kullanılacak Çıktı metodu.</b><br />Muhtemelen DirectSound'u kullanmak isteyeceksiniz. Output device to use Kullanılacak çıktı cihazı <b>Selects which sound card to use for audio Output.</b> <b>Ses Çıktısı için kullanılacak ses kartını seçer.</b> Enable positional audio Konumsal sesi etkinleştir Allows positioning of sound Allows positioning of sound. Sesin konumsal olarak işlenmesini etkinleştirir <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> <p> Bu, Mumble için ses ayarı sihirbazıdır. Ses kartınız için girdi seviyelerini doğru olarak seçmenizi ve Mumble'ın ses işlemesi için doğru ayarları yapılandırmanıza yardımcı olacaktır. </p> <p> Lütfen bu sihirbaz etkin olduğu sürece, dinleyebilmeniz için sesin yerel döngüde olacağını ve sunucuya hiçbir sesin gönderilmeyeceğini unutmayınız. </p> Input Device Girdi Cihazı Output Device Çıktı Cihazı This allows Mumble to use positional audio to place voices. Sesleri konumlayabilmek için Mumble'ın yerlere göre ses kullanmasına izin verir. <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> <p> Gecikmeyi en aza indirebilmek için ses kartınında mümkün olduğu kadar az ses verisi tampona alınması önemlidir. Ancak birçok ses kartı gerçekte çalışabilecekleri tampon bellekten çok daha küçük bir tampon belirtir, dolayısıyla bu değeri ayarlamanın tek yolu deneme ve yanılmadır. </p> <p> Bir ses örneği duymalısınız. Aşağıdaki göstergeci, <b>hiçbir</b> parazit ve kesilme yaratmayan en düşük değere getiriniz. Bu test sırasında yerel ekonun devre dışı bırakıldığını dikkatinize sunarız. </p> Amount of data to buffer Tampona alınacak veri miktarı This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Çıktı tamponunda önbelleğe alınacak veri miktarını ayarlar. Değişik değerleri deneyiniz ve seste parazit yaratmayan en düşük değeri seçiniz. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> <p> Ses kontrol panelini açınız ve kayıt ayarlarına gidiniz. Etkin girdi olarak mikrofonun azami kayıt hacmiyle seçildiğinden emin olunuz. Eğer "Mikrofon güçlendirmesi" ya da "boost" gibi bir seçenek varsa etkinleştirildiğinden emin olunuz. </p> <p> Sinirli ya da coştuğunuz zamanlardaki gibi yüksek sesle konuşunuz. Kontrol panelinde, aşağıdaki çubuk mavi ve yeşil bölgede mümkün olduğu kadar en yüksek değerde bulunacağı ancak kırmızı bölgeye <b>ulaşmayacağı</b> şekilde hacmi düşrünüz. </p> Positional Audio Konumsal Ses Adjusting attenuation of positional audio. Konumsal ses zayıflama ayarı. <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> <p> Mumble bazı oyunlar için konumsal sesi destekler ve diğer kullanıcıların seslerini oyunda bulundukları yere uygun olarak konumlar. Bulundukları yere göre, konuşanların seslerinin hacmi, diğer kullanıcılara göre yön ve mesafeyi taklit edecek şekilde değiştirilecektir. Bu tip konumlama işletim sisteminizde hoparlör yapılandırmanızın doğru olmasına dayanır, dolayısıyla bu burada denenecektir. </p> <p> Aşağıdaki grafik kuşbaşı görünüşle <font color="red">sizi</font>, <font color="yellow">hoparlörlerinizi</font> ve <font color="green">hareket hâlinde bir ses kaynağı</font> gösterir. Sesi kanallarda hareket hâlinde olarak duymanız gerekir. </p> Use headphones instead of speakers Hoparlörler yerine kulaklık kullan <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> <p> Tebrikler. Artık Mumble ile daha zengin bir ses deneyimi yaşayabileceksiniz. </p> <p>Mumble devamlı olarak geliştirilmektedir ve geliştirme ekibi kullanıcıların en çoğuna faydası bulunacak işlevlere odaklanmak istemektedir. Bu amaçla, Mumble yapılandırmanız hakkında geliştiricilere anonim istatistik göndermeyi destekler. Bu istatistikler sürmekte olan programlama için çok önemlidir ve kullandığınız işlevlerin desteğinin sürmesine de yarar. </p> Use headphones Kulaklık kullan This ignores the OS speaker configuration and configures the positioning for headphones instead. İşletim sisteminin hoparlör yapılandırmasını görmezden gelir ve konumlamayı kulaklıklar için yapılandırır. Volume tuning Ses hacim ayarı Tuning microphone hardware volume to optimal settings. Mikrofonun donanım hacminin en uygun değerlere ayarı. Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. Şimdi gece geç saatte kimseyi rahatsız etmek istemediğiniz zamanki gibi alçak sesle konuşunuz. Aşağıdaki göstergeyi konuştuğunuzda yeşil alanda bulunacak, ancak sessiz olduğunuzda mavi alanda kalacak şekilde ayarlayınız. Voice Activity Detection Ses Etkinliği Tespiti Letting Mumble figure out when you're talking and when you're silent. Mumble'ın ne zaman konuştuğunuzu ve sustuğunuzu öğrenimi. This will help Mumble figure out when you are talking. The first step is selecting which data value to use. Bu, Mumble'ın ne zaman konuştuğunuzu ve sustuğunuzu tespit etmesine yardım eder. İlk adım hangi veri türünün kullanılacağını seçmektir. Raw amplitude from input Girdiden kaba amplitüd Signal-To-Noise ratio Sinyal / Gürültü oranı Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Şimdi aşağıdaki göstergeyi ayarlamanız gerekiyor. Söyleyeceğiniz ilk heceler yeşil alanda olmalıdır (mutlak konuşma). Konuştuğunuz sırada sarı alanda kalmanız gerekir (muhtemel konuşma) ve konuşmadığınızda, her şey kırmızı alanda olmalıdır (kesin olarak konuşma değil). Device tuning Cihaz ayarı Changing hardware output delays to their minimum value. Donanım çıktı gecikmelerini asgari değerlerine değiştirim. Submit anonymous statistics to the Mumble project Mumble projesine anonim istatistik gönder Push To Talk: Bas ve Konuş: Quality & Notifications Kalite & Bildirimler Adjust quality and notification settings. Kalite ve bildirim ayarları. Quality settings Kalite ayarları Low Düşük Balanced Dengeli Notification settings Bildirim ayarları Use Text-To-Speech to read notifications and messages to you. Konuşma sentezini size yollanan mesaj ve bildirimleri okumak için kullan. Disable Text-To-Speech and use sounds instead. Konuşma sentezini devre dışı bırak ve yerine sesleri kullan. %1 ms %1 ms Enables attenuation of other applications while users talk to you Kullanıcılar sizinle konuştuğunda diğer uygulamaların zayıflatılmasını etkinleştirir Attenuate applications while other users talk Diğer kullanıcılar konuştuğunda uygulamaları zayıflat High Yüksek Custom Özel You already set a customized quality configuration in Mumble. Select this setting to keep it. Mumble'da zaten özel kalite yapılandırması kurdunuz. Onu korumak için bu seçeneği seçiniz. Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. Kullanıcılar sizinle konuştuğunda diğer uygulamaların zayıflatılmasını etkinleştirir. Bu, birisinin sizinle konuşmaya başladığı zaman onu daha iyi duyabilmeniz için tüm diğer uygulamaların (müzik çalarlar gibi) sesinin zayıflatılacağı anlamına gelir. Apply some high contrast optimizations for visually impaired users Görme engelli kullanıcılar için yüksek kontrast ayarlarını uygula Use high contrast graphics Yüksek kontrastlı grafik kullan Keep custom Text-To-Speech settings. Özel konuşma sentezi ayarlarını koru. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode <p> Ses kontrol panelini açıp kayıt ayarlarına gidiniz. Mikrofonun azami hacimde etkin girdi olarak seçildiğinden emin olunuz. Eğer "Mikrofon güçlendirme" ya da "boost" gibi bir seçenek varsa seçildiğinden emin olunuz. </p> <p> Sinirli ya da coştuğunuz zamanlardaki gibi yüksek sesle konuşunuz. Kontrol panelinde, aşağıdaki çubuk çizgili ve boş bölgede mümkün olduğu kadar en yüksek değerde bulunacağı ancak çapraz çizgili bölgeye <b>ulaşmayacağı</b> şekilde hacmi düşürünüz. </p> Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode Şimdi gece geç saatte kimseyi rahatsız etmek istemediğiniz zaman olduğu gibi alçak sesle konuşunuz. Aşağıdaki göstergeyi konuştuğunuzda boş alanda bulunacak, ancak sessiz olduğunuzda çizgili alanda kalacak şekilde ayarlayınız. Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode Şimdi aşağıdaki göstergeyi ayarlamanız gerekiyor. Söyleyeceğiniz ilk heceler boş alanda olmalıdır (mutlak konuşma). Konuştuğunuz sırada çizgili alanda kalmanız gerekir (muhtemel konuşma) ve konuşmadığınızda, her şey çapraz çizgili alanda olmalıdır (kesin olarak konuşma değil). In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) Bu yapılandırmada Mumble'ın kullandığı <b>bant genişliği miktarı düşük</b> olacaktır. Bu kaçınılmaz olarak yüksek gecikmelere ve vasat kaliteye yol açar. Bu seçeneği sadece bağlantınız diğer ayarları kaldıramıyorsa seçiniz. (16kbit/s, paket başına 60ms) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) Bu, <b>tavsiye edilen varsayılan</b> yapılandırmadır. Kalite, gecikme ve bant genişliği kullanımı arasında iyi bir denge sağlar. (40kbit/s, paket başına 20ms) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) Bu yapılandırma sadece yerel ağlar (LAN) gibi bant genişliğinin bir problem olmadığı durumlar için tavsiye edilir. Mumble'ın desteklediği en düşük gecikmeyle <b>yüksek kalite</b> sunar. (72kbit/s, paket başına 10ms) BanEditor Mumble - Edit Bans Mumble - Yasaklamaları Düzenle &Address &Adres &Mask &Maske Reason Sebep Start Başlangıç End Sona eriş User Kullanıcı Hash Hash değeri &Add &Ekle &Update &Güncelle &Remove &Kaldır Ban List Yasaklı Listesi Search field Arama alanı This is the search field. Use it to find bans that have this username set in the username field. Burası arama alanı. Kullanıcı adı alanında adını yazdığınız yasaklı kullanıcıları bulmak için kullanın. Who are you looking for? Kimi arıyordunuz? No nickname Rumuz yok IP address IP adres No IP address IP adres yok Reason for the ban Yasaklanma sebebi No reason Sebep yok Ban end date Yasak bitiş tarihi Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). Yasak bitiş tarihi. Başlangıç ve bitiş için aynı tarihi ayarlarsanız yasak kalıcı olacaktır (Süresiz). Certificate hash Sertifika hash değeri No certificate hash Sertifika hash değeri yok Banned users Yasaklı kullanıcılar This is a list with banned users. Yasaklı kullanıcı listesi. Use this button if you want to add a new ban. Yeni yasaklı kullanıcı eklemek istiyorsanız bu düğmeyi kullanın. Use this button if you want to update ban information. Yasaklama bilgisini güncellemek için bu düğmeyi kullanın. Use this button if you want to remove user from the ban list. Kullanıcıyı yasaklı listesinden kaldırmak için bu düğmeyi kullanın. Clear all fields Tüm alanları temizle This button clears all fields. Use it if you want to add a new ban. Bu düğme tüm alanları temizler. Yeni yasaklı kullanıcı eklemek istediğinizde kullanın. Clear Temiz Ban List - %n Ban(s) Yasaklama listesi - %n yasaklamaYasaklama listesi - %n yasaklama CertView Name İsim Email E-posta Issuer Oluşturan Expiry Date Sona Erme Tarihi (none) (boş) Self-signed Kendisi imzalamış CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. E-posta doğrulanamadı.<br />Devam etmek için geçerli (ya da boş) bir e-posta giriniz. There was an error generating your certificate.<br />Please try again. Sertifikanızın oluşturulması sırasında bir hata meydana geldi.<br />Lütfen tekrar deneyiniz. Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. Sertifikanız ve anahtarınız PKCS#12 biçiminde dışa aktarılamadı. Sertifikanızda bir hata bulunuyor olabilir. The file could not be opened for writing. Please use another file. Dosya yazmak için açılamadı. Lütfen başka bir dosya kullanın. The file's permissions could not be set. No certificate and key has been written. Please use another file. Dosyanın izinleri ayarlanamadı. Hiçbir sertifika ve anahtar yazılmadı. Başka bir dosya kullanınız. The file could not be written successfully. Please use another file. Dosyaya yazma başarısız oldu. Lütfen başka bir dosya kullanın. The file could not be opened for reading. Please use another file. Dosya okumak için açılamadı. Lütfen başka bir dosya kullanın. The file is empty or could not be read. Please use another file. Bu dosya boş ya da okunamadı. Lütfen başka bir dosya kullanın. The file did not contain a valid certificate and key. Please use another file. Dosya hiçbir geçerli sertifika ve anahtar içermiyor. Lütfen başka bir dosya kullanın. Select file to export certificate to Sertifika dışa aktarmak için dosya seç Select file to import certificate from Sertifika içe aktarmak için dosya seç Unable to import. Missing password or incompatible file type. İçe aktarım yapılamıyor. Eksik parola ya da uyumsuz dosya türü. <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. <b>Sertifika Ömrü:</b> Sertifikanızın süresi dolmak üzere ve yenilemeniz lazım, aksi takdirde oturumunuz bulunan sunuculara bağlanamayacaksınız. Certificates Certificate Management Sertifika Yönetimi Certificate Authentication Sertifika Doğrulaması Authenticating to servers without using passwords Sunuculara parola kullanmadan doğrulama Current certificate Güncel sertifika This is the certificate Mumble currently uses. Bu, Mumble'ın şu anda kullandığı sertifikadır. Current Certificate Güncel Sertifika Create a new certificate Yeni sertifika oluştur This will create a new certificate. Bu, yeni bir sertifika oluşturacaktır. Import certificate from file Dosyadan sertifika içe aktar This will import a certificate from file. Bu, bir dosyadan sertifika içe aktaracaktır. Import a certificate Sertifika içe aktar Export Certificate Sertifika dışa aktar This will export a certificate to file. Bu, sertifikayı bir dosya olarak dışa aktaracaktır. Export current certificate Güncel sertifikayı dışa aktar Import Certificate Sertifika İçe Aktar PKCS #12 Certificate import PKCS #12 Sertifika içe aktarımı <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble PKCS #12 biçiminde saklanan sertifikaları içe aktarabilir. Bu, Mumble, Firefox, Internet Explorer, Opera vb. tarafından anahtar dışa aktarımında kullanılan biçimdir.</p><p>Dosya parola ile korunmuşsa, sertifikayı içe aktarabilmek için bu parolaya ihtiyacınız olacaktır.</p> Import from Şuradan içe aktar Filename to import from İçe aktarım için dosya ismi This is the filename you wish to import a certificate from. Bu, sertifikayı içe aktarmak için kullanılacak dosyanın ismidir. Select file to import from İçe aktarım için dosya This opens a file selection dialog to choose a file to import a certificate from. Bu, hangi dosyadan sertifika içe aktarılacağını belirlemek için dosya seçme diyaloğunu açar. Open... Aç... Password Parola Password for PKCS#12 file PKCS #12 dosyası için parola This is the password for the PKCS#12 file containing your certificate. Bu, sertifikanızı içeren PKCS #12 dosyasının parolasıdır. Certificate to import İçe aktarılacak sertifika This is the certificate you are importing. Bu, içe aktardığınız sertifikadır. Certificate Details Sertifika Detayları Replace Certificate Sertifikayı Değiştir Replace existing certificate with new certificate? Hâlihazırdaki sertifikanın yerine yeni bir sertifika getirilsin mi? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> <p>Mumble'da hâlihazırda bir sertifikanız var, ve bu sertifikanın yerine yenisini getirmek üzeresiniz.</p> <p>Eğer bir CA (Sertifika Yetkili Kurumu) tarafından size verilen bir sertifikaya yükseltiyorsanız ve e-posta adresi şimdiki sertifikanızla uyuşuyorsa, bu tamamen güvenli bir işlemdir ve bağlandığınız sunucular e-posta adresiniz için verilen güçlü sertifikayı otomatik olarak tanıyacaklardır. </p> <p>Eğer durum farklıysa, şimdiye kadar oturumunuz bulunan sunucuların hiçbiri sizi tanımayacaktır. Henüz herhangi bir sunucuda oturumunuz yoksa, endişelenecek bir şey de yoktur. </p> <p> Sertifikanızı değiştirmek istediğinize emin misiniz? </p> This is the certificate Mumble currently uses. It will be replaced. Bu, Mumble'ın şu anda kullandığı sertifikadır. Yerine başka bir sertifika getirilecektir. New certificate Yeni sertifika This is the new certificate that will replace the old one. Bu, eski sertifikanın yerine geçecek yeni sertifikadır. New Certificate Yeni Sertifika Make a backup of your certificate Sertifika için yedekleme yap Export to Şuraya dışa aktar Filename to export to Dışa aktarım için dosya ismi This is the filename you wish to export a certificate to. Bu, sertifikanın dışa aktarımında kullanılacak dosya ismidir. Save As... Farklı Kaydet... This is the certificate Mumble currently uses. It will be exported. Bu, Mumble'ın şu anda kullandığı sertifikadır. Dışa aktarılacaktır. Generate a new certificate for strong authentication Güçlü kimlik doğrulama için yeni bir sertifika oluştur <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> <p>Mumble şimdi sunucularda kimlik doğrulama için güçlü bir sertifika oluşturacaktır.</p><p>İsterseniz, bağlandığınızda sunuculara iletilecek bazı ilâve bilgiler girebilirsiniz. Geçerli bir e-posta adresi belirtirseniz, daha sonra bir CA (Sertifika Yetkili Kurumu) tarafından yayınlanan e-posta sertifikasına yükseltebilirsiniz, ki bu güçlü kimlik doğrulama imkânı sunar.</p> Name İsim Email E-posta Your email address (e.g. johndoe@mumble.info) E-posta adresiniz (mesela avanakavni@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. Bu sizin e-posta adresinizdir. Geçerli bir e-posta adresi belirtmeniz, kimlik doğrulama problemi çıkarmaksızın güçlü bir sertifikaya yükseltme imkânı vereceğinden, hararetle tavsiye edilir. Your name (e.g. John Doe) İsminiz (mesela Namık Kemal) This is your name, and will be filled out in the certificate. This field is entirely optional. Bu isminizdir ve sertifikada belirtilecektir. Bu alan zorunlu olmayıp tamamen seçiminize bağlıdır. Finish Sonuçlandır Certificate-based authentication is ready for use Sertifikaya dayalı kimlik doğrulaması kullanılmaya hazırdır Enjoy using Mumble with strong authentication. Mumble'ı güçlü kimlik doğrulaması ile kullanmanın tadını çıkarın. Automatic certificate creation Otomatik sertifika oluşturumu <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>Eğer güncel sertifikanızı kaybederseniz, ki bu bilgisayarınızda bir donanım arızası olursa ya da işletim sistemini tekrar kurarsanız meydana gelir, oturumunuz bulunan sunucularda kimlik doğrulaması yapamazsınız. Dolayısıyla sertifikanızın yedeklemesini yapmanız <b>mecburidir</b>. Bu yedeklemeyi USB flash diski gibi çıkarılabilir bir depo alanında saklamanızı hararetle tavsiye ederiz.</p> <p>Bu dosyanın şifrelenmeyeceğini, ve bu dosyayı ele geçiren birinin sizi taklit edebileceğinden ona iyi bakmanız gerektiğini dikkatinize sunarız.</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> ChanACL None Boş Traverse Geçiş Enter Gir Speak Konuş Mute/Deafen Sustur/Sağır et Make channel Kanal oluştur Make temporary Geçici yap Link channel Kanal bağla This represents no privileges. Bu, hiçbir izin olmadığını temsil eder. This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. Grup değiştirme ve EKL verileri dahil olmak üzere, kanala mutlak erişimi temsil eder. Bu izin diğer tüm izinleri de içerir. This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. Kanaldan geçiş yapma iznini temsil eder. Eğer kullanıcının bu izni yoksa, alt kanallardaki izinleri ne olursa olsun, bu kanala ve alt kanallara hiçbir şekilde erişemez. This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. Kanala katılma iznini temsil eder. Hiyerarşisel bir kanal yapısı söz konusuysa herkese geçiş izni vermek ve hiyerarşinizin köküne giriş iznini sınırlandırmak isteyebilirsiniz. This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. Kanalda konuşma iznini temsil eder. Bu izni bulunmayan kullanıcılar sunucu tarafından susturulmuş olarak görünecekler ve gerekli izinleri olan birisi bu susturmayı kaldırmadığı sürece konuşamayacaklardır. This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. Dışarıdan bu kanala fısıldama iznini temsil eder. Bu tıpkı <i>konuşma</i> izni gibidir ancak sadece Fısıltı tuşu basıldığında konuşulan paketlere uygulanır. Bağlı olmayan bir kanal hiyerarşisine mesaj yayınlamak için kullanılabilir. This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. Diğer kullanıcıları susturmak ya da sağır etmek iznini temsil eder. Susturulan bir kullanıcı gerekli izinleri bulunan başka birisi tarafından bu durum kaldırılmadıkça ya da sunucuya tekrar bağlanmadıkça konuşamaz. This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. Bir kullanıcıyı başka bir kanala gönderme ya da sunucudan kovma iznini temsil eder. Kullanıcının gönderilebilmesi için ya gönderen kullanıcının hedef kanalda taşıma izni bulunması ya da gönderilen kullanıcının bu kanala giriş izni olması gerekir. Gönderme izni bulunan kullanıcılar diğer kişileri normalde giriş izinleri olmayan bir kanala gönderebilirler. This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. Alt kanal oluşturma iznini temsil eder. Alt kanalı oluşturan kullanıcı bu alt kanalın yöneticiler grubuna eklenir. This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. Geçici bir alt kanal oluşturma iznini temsil eder. Alt kanalı oluşturan kullanıcı bu alt kanalın yöneticiler grubuna eklenir. Geçici kanallar saklanmaz ve son kullanıcı terk ettiğinde silinirler. This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. Kanalları bağlama iznini temsil eder. Bağlantılı kanallardaki kullanıcılar, konuşan kullanıcının dinleyenlerin bulunduğu kanalda <i>konuşma</i> izni varsa birbirlerini duyabilirler. Bağlantı yaratabilmek için her iki kanalda bağlama izniniz bulunması gerekir, ancak bağlantı kaldırmak için tek bir kanalda bu iznin bulunması yeterlidir. This represents the permission to write text messages to other users in this channel. Kanaldaki diğer kullanıcılara metin mesajı gönderme iznini temsil eder. This represents the permission to forcibly remove users from the server. Sunucudan kullanıcı kovma iznini temsil eder. This represents the permission to permanently remove users from the server. Sunucudan kullanıcı kovma ve dönmelerini engelleme, yani yasaklama iznini temsil eder. This represents the permission to register and unregister users on the server. Sunucuda kullanıcı kaydetme ve oturum silme iznini temsil eder. This represents the permission to register oneself on the server. Sunucuda kendini kaydetme iznini temsil eder. Whisper Fısılda Move Taşınma Text message Metin mesajı Kick Kov Ban Yasakla Register User Kullanıcı kaydet Register Self Kendini kaydet Write ACL EKL Yaz ChatbarTextEdit Paste and &Send Paste and send Yapıştır ve &yolla <center>Type chat message here</center> <center>Sohbet mesajını buraya yazınız</center> ClientUser Friend Arkadaş Authenticated Doğrulanmış Priority speaker Öncelikli konuşmacı Recording Kaydediyor Muted (server) Susturuldu (sunucu) Deafened (server) Sağır edildi (sunucu) Local Ignore (Text messages) Yerel Olarak Görmezden Gel (Metin mesajları) Local Mute Yerel olarak susturuldu Muted (self) Susturuldu (kendisi) Deafened (self) Sağır edildi (kendisi) ConfigDialog Accept changes Değişiklikleri kabul et This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. Bu buton şu andaki ayarları kabul edecek ve uygulamaya dönecektir.<br />Ayarlar uygulamadan çıktığınızda diskte saklanacaktır. Reject changes Değişiklikleri iptal et This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. Bu buton tüm değişiklikleri iptal edecek ve uygulamaya dönecektir.<br />Ayarlar önceki durumlarına alınacaktır. Apply changes Değişiklikleri uygula This button will immediately apply all changes. Bu buton tüm değişiklikleri hemen uygulayacaktır. Undo changes for current page Bu sayfadaki değişiklikleri geri al This button will revert any changes done on the current page to the most recent applied settings. Bu buton güncel sayfadaki tüm değişiklikleri geri alacak ve uygulanan en son ayarlara dönecektir. Restore defaults for current page Güncel sayfa için varsayılan değerleri uygula This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. Bu buton şu andaki sayfa için varsayılan değerleri kuracaktır. Diğer sayfalar değişime uğramayacaktır.<br />Tüm ayarları varsayılan değerlerine geri almak için bu butonu her sayfada kullanmanız gerekir. Mumble Configuration Mumble Yapılandırması ConnectDialog Connecting to %1 %1 adresine bağlanılıyor Enter username Kullanıcı ismi giriniz Adding host %1 %1 ekleniyor Servername Sunucu ismi Hostname Bilgisayar ismi Bonjour name Bonjour ismi Port Port Addresses Adresler Website Ağ sitesi Packet loss Paket kaybı Ping (80%) Ping (%80) %1 ms %1 ms Ping (95%) Ping (%95) Bandwidth Bant genişliği %1 kbit/s %1 kbit/s &Connect &Bağlan &Filters &Filtreler Unknown Users Kullanıcılar Version Sürüm Failed to fetch server list Sucunu listesi alımı başarısız oldu Mumble Server Connect Mumble Sunucu Bağlantısı Ping Ping Remove from Favorites Favorilerden Kaldır Add custom server Özel sunucu ekle Show all servers that respond to ping Ping'e cevap veren tüm sunucuları göster Show all servers with users Kullanıcı bulunan tüm sunucuları göster Show all servers Tüm sunucuları göster &Copy &Kopyala Copy favorite link to clipboard Favori bağlantısını panoya kopyala &Paste &Yapıştır Paste favorite from clipboard Favoriyi panodan yapıştır &Edit... &Düzenle... &Add New... &Yeni Ekle... Add to &Favorites &Favorilere Ekle Open &Webpage &Web Sayfasını Aç Show &Reachable &Ulaşılabilenleri Göster Show &Populated &Kullanıcı Olanları Göster Show &All &Hepsini Göster ConnectDialogEdit Edit Server Sunucu Düzenle Name of the server Sunucu ismi A&ddress A&dres Internet address of the server. Internet address of the server. Sunucunun İnternet adresi. <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Adres</b><br/> Sunucunun İnternet adresi. Bu normal bir bilgisayar ismi, bir İPv4/İPv6 adresi ya da bir Bonjour servis tanımlayıcısı olabilir. Bonjour servis tanımlayıcılarına Mumbe tarafından tanınmaları için '@' öneki konulmalıdır. &Port &Port Port on which the server is listening Sunucunun dinlediği port <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. <b>Port</b><br/> Sunucunun dinlediği port. Eğer sunucu bir Bonjour servis tanımlayıcısı ile tanımlandıysa bu alan görmezden gelinir. &Username &Kullanıcı ismi Username to send to the server Sunucuya yollanacak kullanıcı ismi <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. <b>Kullanıcı ismi</b><br/> Sunucuya yollanacak kullanıcı ismi. Sunucunun kullanıcı isimlerine sınırlama getirebileceklerini unutmayınız. Bu ek olarak kullanıcı isminiz hâlihazırda başka birisi tarafından alınmış olabilir. Label Etiket Add Server Sunucu Ekle You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 Password Parola Password to send to the server Sunucuya gönderilecek parola <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. <b>Parola</b><br/> Bağlantı kurulduğunda sunucuya gönderilecek parola. Bu parola bir sunucuya <i>SuperUser</i> olarak bağlandığınızda ya da parola ile doğrulanma gerektiren bir sunucuya bağlandığınızda gereklidir. Girilmezse bağlantı sırasında istenecektir. Show password Parolayı göster <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. <b>Etiket</b><br/> Sunucunun etiketi. Bu, sunucu listenizde sunucunun ismidir ve istediğinizi seçebilirsiniz. Local server label Yerel sunucu etiketi 127.0.0.1 127.0.0.1 64738 64738 Your username Kullanıcı isminiz Your password Parolanız &Fill CoreAudioSystem Default Device Varsayılan cihaz CrashReporter Mumble Crash Report Mumble Çökme Raporu <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> <p><b>Çok üzgünüz ama Mumble çöktü gibi görünüyor. Mumble geliştiricilerine çökme raporu göndermek ister misiniz?</b></p><p>Bu rapor Mumble'ın çöktüğü zamandaki kısmi bir bellek kopyasını içerir ve geliştiricilerin problemi çözmesine yardımcı olur.</p> Email address (optional) E-posta adresi (isteğe bağlı) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash Lütfen çökme sırasında ne yapmakta olduğunuzu kısaca ve İngilizce olarak belirtiniz Send Report Raporu yolla Don't send report Raporu yollama Crash upload successful Rapor gönderimi başarılı oldu Thank you for helping make Mumble better! Mumble'i geliştirmemize yardımınız için teşekkür ederiz! Crash upload failed Rapor gönderimi başarısız oldu We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. Çok üzgünüz ama rapor gönderimi %1 %2 hatası sebebiyle başarısızlığa uğradı. Lütfen bir geliştiriciyi bu konuda bilgilendirin. This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 Bu gerçekten hiç hoş değil ama öyle görünüyor ki çökme raporu gönderme kodunda bir hata var ve raporu gönderemedik. Geliştiricileri %1 hatası hakkında bilgilendirebilirsiniz Uploading crash report Çökme raporu gönderiliyor Abort upload Gönderimi iptal et DXAudioInput Default DirectSound Voice Input Varsayılan DirectSound Ses Girişi Opening chosen DirectSound Input device failed. No microphone capture will be done. Seçilen DirectSound Girdi cihazının açılışı başarısız oldu. Mikrofondan kayıt yapılmayacaktır. Opening chosen DirectSound Input failed. Default device will be used. DirectSound Girdi cihazının açılışı başarısız oldu. Varsayılan cihaz kullanılacaktır. Lost DirectSound input device. DirectSound girdi cihazı kaybedildi. DXAudioOutput Default DirectSound Voice Output Varsayılan DirectSound Ses Çıktısı Opening chosen DirectSound Output failed. Default device will be used. Seçilen DirectSound Çıktısı başarısız oldu. Varsayılan cihaz kullanılacaktır. Lost DirectSound output device. DirectSound çıktı cihazı kaybedildi. Opening chosen DirectSound Output failed. No audio will be heard. Seçilen DirectSound Çıktısının açılışı başarısız oldu. Hiçbir ses duyulmayacak. Database Mumble failed to initialize a database in any of the possible locations. Mumble mümkün yerlerin hiçbirinde veritabanını başlatamadı. The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. '%1' veritabanı sadece okunabilir. Mumble SSL sertifikaları gibi sunucu ayarlarını bu problem çözülene dek saklayamaz. DeveloperConsole Developer Console Geliştirici Konsolü DockTitleBar Drag here Buradan sürükle GlobalShortcut Shortcuts Kısayollar List of configured shortcuts Yapılandırılmış kısayol listesi Function İşlev Data Veriler Shortcut Kısayol Suppress Askıya al Add new shortcut Yeni kısayol ekle This will add a new global shortcut Bu yeni genel bir kısayol ekler &Add &Ekle Remove selected shortcut Seçilen kısayolu kaldır This will permanently remove a selected shortcut. Bu, seçilen kısayolu daimi olarak kaldırır. &Remove &Kaldır <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> <html><head/><body><p>Mumble, genel kısayollar için şu anda sadece fare düğmelerini ve klavyenin birleştirici tuşlarını (Alt, Ctrl, Cmd vs.) kullanabilir.</p><p>Daha fazla esneklik istiyorsanız sisteminizin Yardımcı teknolojiler veya Erişilebilirlik tercihlerinde <span style=" font-style:italic;">yardımcı cihazlar için erişimi</span> etkinleştirebilirsiniz. Ancak bunun potansiyel olarak kötücül programların klavyenizde ne yazıldığını okumalarına imkân verebileceğini unutmayınız.</p></body></html> Open Accessibility Preferences Erişilebilirlik Tercihlerini Aç Skip Atla Enable Global Shortcuts Genel Kısayolları Etkinleştir <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. Additional Shortcut Engines <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. Enable Windows hooks <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. Enable GKey <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. Enable XInput <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. Enable shortcuts in privileged applications GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> <html><head/><body><p>Genel kısayollar için güncel olarak Mumble sadece fare düğmelerini ve klavyenin değiştirici düğmelerini (Alt, Ctrl, Cmd, vs.) kullanabilir.</p><p>Eğer daha fazla esneklik istiyorsanız Mac bilgisayarınızın Sistem Tercihlerinin Güvenlik ve Gizlilik bölümünde Mumble'ı güvenilir erişilebilirlik programı olarak ekleyebilirsiniz. </p><p> Güvenlik ve Gizlilik panosunda Gizlilik semesine geçin. Ardından sol köşedeki listede Erişilebilirliği (alta yakın) seçin. Son olarak, Mumble'ı güvenilir erişilebilirlik programlarına ekleyin.</body></html> Shortcuts Kısayollar Shortcut button combination. Kısayol tuş birleşmesi. <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. <b>Bu, genel kısayol tuş kombinasyonudur.</b><br />Bu alana tıklayıp istediğiniz tuş/butonlara basarak bağlama yapabilirsiniz. Temizlemek için çift tıklayınız. Suppress keys from other applications Diğer uygulamalardan tuş sakla <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. <b> Bu, basılan tuşları diğer uygulamalardan saklar.</b><br />Bu seçeneği etkinleştirmek basılan tuşu (ya da çok tuşlu bir birleşimin son tuşunu) diğer uygulamalardan saklayacaktır. Tüm tuşların saklanamayacağını unutmayınız. GlobalShortcutTarget Whisper Target Fısıltı Hedefi Whisper to list of Users Kullanıcı listesine fısılda Channel Target Kanal Hedefi Restrict to Group Gruba Sınırla If specified, only members of this group will receive the whisper. Seçilirse, sadece grup üyeleri fısıltıyı alacaktır. List of users Kullanıcı listesi Add Ekle Remove Kaldır Modifiers Değiştiriciler Do not send positional audio information when using this whisper shortcut. Bu fısıltı kısayolu kullanıldığında ses konum verisi gönderme. Ignore positional audio Ses konum verisini görmezden gel Shout to Linked channels Bağlı kanallara bağır Shout to subchannels Alt kanallara bağır Shout to Channel Kanala Bağır The whisper will also be transmitted to linked channels. Fısıltı bağlı kanallara da iletilecektir. The whisper will also be sent to the subchannels of the channel target. Fısıltı hedef kanalın alt kanallarına da iletilecektir. GlobalShortcutX Mouse %1 Fare %1 JackAudioSystem Hardware Ports Mono Stereo LCD Not connected Çevrimdışı LCDConfig Enable this device Bu cihazı etkinleştir LCD LCD Devices Cihazlar Name İsim <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> <p>Bu, sisteminizde mevcut olan LCD cihazlarının listesidir. Cihazları isimleriyle listeler ve ekranlarının boyutlarını da içerir. Mumble aynı zamanda birçok LCD cihaza çıktı göndermeyi destekler.</p> <h3>Boyut:</h3> <p> Bu alan LCD cihazın boyutunu belirtir. Boyut ya piksel olarak (Grafik LCD ekranları için) ya da karakter olarak (karakter LCD ekranları için) belirtilir.</p> <h3>Etkin:</h3> <p>Bu Mumble'ın belli bir LCD cihazını kullanmasını ayarlar.</p> Size Boyut Enabled Etkin Views Görüntüler Minimum Column Width Asgari sütun genişliği <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> <p>Bu seçenek Kullanıcı görüntüsünde sütunların asgari genişliğini belirler.</p> <p>Eğer fazla kişi aynı anda konuşuyorsa Kullanıcı görüntüsü ikiye bölünecektir. Bu seçeneği, LCD ekranda gösterilen kullanıcı saysıyla kullanıcı isimlerinin genişliği arasında bir denge bulmak için kullanabilirsiniz.</p> This setting decides the width of column splitter. Bu ayar sütun ayracının genişliğini belirler. Splitter Width Ayraç genişliği Log Debug Hata ayıklama Critical Kritik Warning Uyarı Information Bilgi Server Connected Sunucu Bağlantıda Server Disconnected Sunucu Bağlantı Dışı Other self-muted/deafened Başkası kendini susturmuş/sağır yapmış Permission Denied İzin Reddedildi Text Message Metin Mesajı User Joined Server Kullanıcı Sunucuya Bağlandı User Left Server Kullanıcı Sunucudan Çıktı User recording state changed Kullanıcı kaydetme durumu değişti User kicked (you or by you) Kullanıcı kovuldu (siz ya da sizin tarafından) User kicked Kullanıcı kovuldu You self-muted Kendinizi susturmuşsunuz User muted (you) Kullanıcı susturuldu (siz) User muted (by you) Kullanıcı susturuldu (sizin tarafınızdan) User muted (other) Kullanıcı susturuldu (diğer) User Joined Channel Kullanıcı Kanala Katıldı User Left Channel Kullanıcı Kanaldan Çıktı You self-unmuted Kendinizi susturmanızı kaldırdınız You self-deafened Kendinizi sağır yapmışsınız You self-undeafened Kendinizi sağır etmenizi kaldırdınız User renamed Kullanıcı yeniden adlandırıldı You Joined Channel You Joined Channel (moved) User connected and entered channel User left channel and disconnected Private text message the server sunucu [[ Invalid size ]] [[ Geçersiz boyut ]] [[ Text object too large to display ]] [[ Metin görüntülenebilecekten uzun ]] [Date changed to %1] [Tarih şu değere değiştirildi: %1] link to %1 %1 adresiyle bağlantı FTP link to %1 player link oyuncu bağlantısı channel link kanal bağlantısı %1 link %1 bağlantı LogConfig Toggle console for %1 events %1 olayları için konsolu açıp kapat Toggle pop-up notifications for %1 events %1 olayları için pop-up bildirimlerini açıp kapat Toggle Text-To-Speech for %1 events %1 olayları için konuşma sentezini aç veya kapat Click here to toggle sound notification for %1 events %1 olayları için sesli bildirimleri açıp kapat Toggle window highlight (if not active) for %1 events Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change %1 olaylarının ses bildirimleri için ses dosyalarına erişim yolu<br />Çalmak için tıklayın<br />Değiştirmek için çift tıklayın Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. %1 olaylarının konsol çıktısını açıp kapatmak için buraya tıklayınız.<br />Etkinleştirilirse, Mumble tüm %1 faaliyetlerini mesaj kütüğüne döker. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. %1 olaylarının pop-up bildirimlerini açıp kapatmak için buraya tıklayınız.<br />Etkinleştirilirse, her %1 olayı için Mumble bir pop-up bildirimi oluşturur. Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. %1 olaylarının ses bildirimleri için ses dosyalarına erişim yolu<br />Çalmak için tıklayın<br />Değiştirmek için çift tıklayın<br />Bu olaylar için sesli bildirimlerin etkinleştirildiğinden emin olunuz, aksi takdirde bu alanın hiçbir etkisi olmaz. Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. %1 olayları için konuşma sentezini açık kapamak için buraya tıklayınız.<br />Etkinleştirilirse, Mumble %1 olaylarını yüksek sesle ve konuşma sentezi ile okur. Konuşma sentezi olayın içeriğini de okuyabilir ki ses dosyaları bunu yapamaz. Konuşma sentezi ve ses dosyaları aynı zamanda kullanılamaz. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. %1 olayları için sesli bildirimleri açıp kapamak için buraya tıklayınız.<br />Etkinleştirilirse, Mumble seçtiğiniz ses dosyasını %1 olaylarını belirtmek için çalar. Ses dosyaları ve konuşma sentezi aynı zamanda kullanılamaz. Messages Mesaj Message Mesaj Console Konsol Notification Bildirim Text-To-Speech Konuşma sentezi Soundfile Ses dosyası Path Yol Text To Speech Konuşma Sentezi Volume Seviye Volume of Text-To-Speech Engine Konuşma sentezinin seviyesi <b>This is the volume used for the speech synthesis.</b> <b>Bu, konuşma sentezi için kullanılacak ses hacmidir.</b> Length threshold Uzunluk sınırı Message length threshold for Text-To-Speech Engine Konuşma sentezi için mesaj uzunluğu sınırı <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. <b>Bu, konuşma sentezi için mesaj uzunluğu sınırıdır.</b><br />Bu sınırı geçen mesajların tüm içeriği yüksek sesle okunmayacaktır. Characters Karakter Whisper Fısıltı If checked you will only hear whispers from users you added to your friend list. Seçilirse, sadece arkadaş listenize eklenen kullanıcıların fısıltılarını duyarsınız. Only accept whispers from friends Sadece arkadaşların fısıltılarını kabul et If enabled text messages you send will be read back to you with TTS Etkinleştirilirse, sizin yolladığınız mesajlar konuşma sentezi ile okunacaktır Read back own messages Kendi mesajlarımı oku Chat Log Sohbet Kütüğü Maximum chat length Azami sohbet uzunluğu Unlimited Sınırsız Lines Satır Highlight LookConfig System default Varsayılan None Hiçbiri Only with users Sadece kullanıcı bulunan All Hepsi Ask Sor Do Nothing Hiçbir şey yapma Move Taşı <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory <a href="%1">Tara</a> User Interface Kullanıcı arayüzü This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. Hangi kanalların otomatik olarak genişletileceklerini belirler. <i>Hiçbiri</i> ve <i>Hepsi</i> ya tüm kanalları genişletir ya da hiçbirini genişletmez, <i>Sadece kullanıcı bulunan</i> ise sadece kanalları kullanıcılar giriş yapınca ve çıktıklarında genişletir ve küçültür. List users above subchannels (requires restart). Kullanıcıları alt kanalların üstünde listele (tekrar başlatma gerektirir). <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. <b>Seçiliyse, kanallar görüntüsünde kullanıcılar alt kanalların üzerinde görüntülenir.</b><br />Değişikliğin dikkate alınması için Mumble'ı tekrar başlatmanız gerekir. Users above Channels Kullanıcılar kanalların üstünde <b>If set, will verify you want to quit if connected.</b> <b>Bağlantıdayken programdan çıkmak istediğinizde, emin olup olmadığınızı sorar.</b> Show number of users in each channel Her kanaldaki kullanıcı sayısını göster Show channel user count Kanallardaki kullanıcı sayısını göster Language Lisan Language to use (requires restart) Kullanılacak lisan (tekrar başlatma gerektirir) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. <b>Mumble'ın kullanacağı dili belirler.</b><br />Bunun etkinleşmesi için Mumble'ı tekrar başlatmanız gerekecektir. Look and Feel Görünüm Layout Düzen Classic Klasik Stacked Yığılmış Hybrid Kırma Custom Özel This changes the behavior when moving channels. Kanalların kaydırılması sırasındaki davranışı değiştirir. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. İstenmeyen kaydırmaların önüne geçmek için kaydırma davranışını belirler. <i>Kaydır</i> kanalları hiçbir teyit istemeden kaydırır. <i>Hiçbir şey yapma</i> hiçbir faaliyette bulunmaz ve bir hata mesajı gösterir. <i>Sor</i> kanalı gerçekten kaydırmak isteyip istemediğinizi sorar. Expand Genişlet When to automatically expand channels Kanalların ne zaman otomatik olarak genişletileceği Channel Dragging Kanal Kaydırma Ask whether to close or minimize when quitting Mumble. Mumle'dan çıkış seçildiğinde uygulamanın kapatılması ve küçültülmesi seçimi sun. Ask on quit while connected Bağlantıdayken çıkışta sor Always On Top Her Zaman Üstte <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> <b>Etkinleştirildiyse, Mumble'ı küçültmek uygulamayı sistem çekmecesine saklayacak ve sadece buradan erişilmesini sağlayacaktır. Aksi takdirde normal bir pencere gibi küçültülecektir.</b> Hide in tray when minimized Küçültüldüğünde sistem çekmecesine sakla Hide the main Mumble window in the tray when it is minimized. Ana Mumble penceresini küçültüldüğünde sistem çekmecesine sakla. This setting controls when the application will be always on top. Bu seçenek uygulamanın ne zaman en üstte olacağını ayarlar. Never Hiçbir zaman Always Daima In minimal view Minimal görünümde In normal view Normal görünümde Displays talking status in system tray Konuşma durumunu sistem çekmecesinde görüntüler Show talking status in tray icon Konuşma durumunu sistem ikonunda göster This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. Bu seçenek hangi durumlarda uygulamanın en üstte kalacağını belirler. <i>Hiçbir zaman</i>ı seçerseniz uygulama üstte kalmaz. <i>Daima</i> uygulamayı her zaman en üstte tutar. <i>Minimal görünümde</i> / <i>Normal görünümde</i> uygulamayı en üste sadece minimal görünüm etkinleştirildiğinde / devre dışı bırakıldığında koyar. Show context menu in menu bar Menü çubuğunda bağlam menüsünü göster Apply some high contrast optimizations for visually impaired users Görme engelli kullanıcılar için yüksek kontrast ayarları uygula Optimize for high contrast Yüksek kontrast için ayarla Application Uygulama Adds user and channel context menus into the menu bar Menü çubuğuna kullanıcı ve kanal bağlam menüsü ekler Tray Icon Sistem ikonu Channel Tree Kanal ağacı Use selected item as the chat bar target Seçilen unsuru sohbet çubuğunun hedefi olarak kullan Filter automatically hides empty channels Filtre boş kanalları gizleyecektir. Show transmit mode dropdown in toolbar Aktarma kipi menüsünü araç çubuğunda göster Theme Tema Theme to use to style the user interface Kullanıcı arayüzünü biçemlendirecek tema <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. <b>Mumble kullanıcı arayüzünün hangi temayla biçemlendirileceğini yapılandır</b><br />Mumble temaları bazı klasörlerden alıp bu listede gösterecektir. Seçtiğiniz tema Mumble'ın görünümünü kişiselleştirmek için kullanılacaktır. Bu, renkleri, ikonları ve daha fazlasını içerir. User Dragging Kullanıcı Kaydırma This changes the behavior when moving users. Kullanıcıların kaydırılması sırasındaki davranışı değiştirir. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. Bu, kullanıcı kaydırılması sırasındaki davranışı belirler; istenmeyen kaydırmalara mani olmak için kullanılabilir. <i>Kaydır</i> kullanıcıları hiçbir teyit istemeden kaydırır. <i>Hiçbir şey yapma</i> hiçbir faaliyette bulunmaz ve bir hata mesajı gösterir. <i>Sor</i> kullanıcıyı hakikaten kaydırmak isteyip istemediğinizi sorar. <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. Enable Developer menu When in custom layout mode, checking this disables rearranging. Lock layout MainWindow Root Kök Push-to-Talk Global Shortcut Bas-ve-Konuş Push and hold this button to send voice. Global Shortcut Sesinizin aktarılması için bu butonu basılı tutunuz. This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut Bas-ve-Konuş butonunu yapılandırır. Bu butonu basılı tuttuğunuz sürece sesiniz aktarılacaktır. Reset Audio Processor Global Shortcut Ses Ön İşlemcisini Sıfırla Unlink Plugin Global Shortcut Eklentiyi Devre Dışı Bırak Push-to-Mute Global Shortcut Bas-ve-Sağır Et Join Channel Global Shortcut Kanala Katıl Toggle Overlay Global Shortcut Yerpaylaşanı açıp kapat Toggle state of in-game overlay. Global Shortcut Oyun içi yerpaylaşanı açıp kapatır. Toggle Minimal Global Shortcut Küçültülmüş hâli açıp kapat Volume Up (+10%) Global Shortcut Sesi Yükselt (+%10) Volume Down (-10%) Global Shortcut Sesi Kıs (-%10) Mumble Mumble Mumble -- %1 Mumble -- %1 &Window &Pencere Minimize Küçült Ctrl+M Ctrl+M Close Kapat Mumble is currently connected to a server. Do you want to Close or Minimize it? Mumble hâlihazırda bir sunucuya bağlıdır. Kapatmak mı istiyorsunuz, küçültmek mi? Mute Self Global Shortcut Kendini Sustur Set self-mute status. Global Shortcut Kendini sustur durumu ayarla. This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut Kendinizi susturmayı ayarlar. Devre dışı bırakırsanız, kendinizi sağır etme durumunu da kaldırmış olursunuz. Deafen Self Global Shortcut Kendini Sağır Et Set self-deafen status. Global Shortcut Kendini sağır et durumunu ayarla. This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut Kendinizi sağır etme durumunu ayarlar. Devre dışı bırakırsanız, kendinizi susturma durumunu da kaldırmış olursunuz. Whisper/Shout Whisper Fısılda/Bağır <center>Not connected</center> Not connected <center>Çevrimdışı</center> Clear Temizle Opening URL %1 %1 adresi açılıyor File does not exist Dosya mevcut değil File is not a configuration file. Dosya yapılandırma dosyası değil. Settings merged from file. Ayarlar dosyadan birleştirildi. URL scheme is not 'mumble' URL düzeni 'mumble' değil This version of Mumble can't handle URLs for Mumble version %1.%2.%3 Mumble'ın bu sürümü %1.%2.%3 sayılı sürümün URL'lerini işleyemez Connecting to %1 %1 adresine bağlanılıyor Enter username Kullanıcı ismi giriniz Connecting to server %1. %1 sunucusuna bağlanılıyor. Reconnecting. Tekrar bağlanılıyor. Transmit Mode set to Continuous Aktarma Kipi Devamlı olarak ayarlandı <p>%1 (%2)<br />%3</p> <p>%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> <h2>Ses kanalı</h2><p>128 bit OCB-AES128 ile şifrelenmiştir<br />%1 ms vasati gecikme (%4 sapma)</p> Register yourself as %1 Kendinizi %1 olarak kaydedin <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <p>Kendinizi bu sunucuda kaydetmek üzeresiniz. Bu faaliyet geriye alınamaz, ve tamamlandığında kullanıcı isminiz değiştirilemez. Bu sunucuda daima '%1' olarak tanınırsınız.</p><p>Kendinizi kaydetmek istediğinizden emin misiniz?</p> <h2>Version</h2><p>Protocol %1</p> <h2>Sürüm</h2><p>Protokol %1</p> <p>No build information or OS version available</p> <p>Hiçbir derleme ya da işletim sistemi bilgisi mevcut değildir</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) Bağlantı şifrelenmiştir, kimlik doğrulaması %1 kullanılarak yapılmıştır ve %2 anahtar alışveriş mekanizması olarak kullanılmıştır (%3) The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) Bağlantı %1 kullanılarak şifrelenmiştir, %2 mesaj kimlik doğrulaması için ve %3 anahtar alışveriş mekanizması olarak kullanılmıştır (%4) The connection is secured by the cipher suite that OpenSSL identifies as %1 Bağlantı, OpenSSL'in %1 olarak tanımladığı şifreleme paketi ile güvence altına alınmıştır <p>The connection provides perfect forward secrecy</p> <p>Bağlantı kusursuz iletme gizliliği (forward secrecy) sağlar</p> <p>The connection does not provide perfect forward secrecy</p> <p>Bağlantı kusursuz iletme gizliliği (forward secrecy) sağlamaz</p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> <h2>Kontrol kanalı</h2><p>Bağlantı şunu kullanır: %1</p>%2%3<p>%4 ms vasati gecikme (%5 sapma)</p><p>Uzaktaki makine %6 (port %7)</p> Voice channel is sent over control channel Ses kanalı kontrol kanalından gönderilmekte Register user %1 %1 adlı kullanıcıyı kaydet <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> <p>%1 adlı kullanıcıyı bu sunucuda kaydetmek üzeresiniz. Bu faaliyet geriye alınamaz ve tamamlandığında, kaydedilmiş bir kullanıcı olarak %1 bu sunucuya parolasını değiştirseniz bile erişebilecektir.</p>Bundan itibaren %1 şu anda kullanılan sertifika ile kimlik doğrulaması yapacaktır.</p><p>%1 adlı kullanıcıyı kaydetmek istediğinizden emin misiniz?</p> Kicking user %1 %1 adlı kullanıcı kovuluyor Banning user %1 %1 adlı kullanıcı yasaklanıyor View comment on user %1 %1 adlı kullanıcının yorumuna bak Message to channel %1 %1 adlı kanala mesaj Connected. Bağlandı. <li>Expected certificate digest (SHA-1): %1</li> <li>Beklenilen sertifika özeti (SHA-1): %1</li> Server presented a certificate which failed verification. Sunucu denetimi başarısız olan bir sertifika sundu. <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> <p>%1</p><ul>%2</ul><p>Bu sertifikayla ilgili hatalar şunlardır:</p><ol>%3</ol><p>Buna rağmen bu sertifikayı kabul etmek istiyor musunuz?<br />(Sertifika saklanacaktır ve bu soru tekrar sorulmayacaktır.)</p> SSL Version mismatch SSL Sürüm uyumsuzluğu Server connection failed. <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>'%1' adlı kanala mesajı burada giriniz</center> <center>Type message to user '%1' here</center> Type message to user '%1' here <center>'%1' adlı kullanıcıya mesajı burada giriniz</center> Choose image file Görsel dosyası seçiniz Failed to load image Görsel dosyasının yüklenmesi başarısız oldu Could not open file for reading. Dosya okunmak için açılamadı. Image format not recognized. Görsel biçimi tanınamadı. &User K&ullanıcı &Channel &Kanal Use in conjunction with Whisper to. Global Shortcut Fısıltı ile birlike kullanın. This will switch the states of the in-game overlay. Global Shortcut Bu, oyun içindeki yerpaylaşanın durumunu değiştirecektir. Link Channel Global Shortcut Kanal Bağla Cycle Transmit Mode Global Shortcut İletim moduna geç Set Transmit Mode to Push-To-Talk Global Shortcut Set Transmit Mode to Continuous Global Shortcut Set Transmit Mode to VAD Global Shortcut Send Text Message Global Shortcut Metin Mesajı Gönder Send Clipboard Text Message Global Shortcut Panodaki Metin Mesajını Gönder This will send your Clipboard content to the channel you are currently in. Global Shortcut Bu, panodaki içeriğinizi şimdi bağlantıda bulunduğunuz kanala gönderecektir. Continuous Devamlı Voice Activity Ses Etkinliği Push-to-Talk Bas-ve-Konuş Mumble - Minimal View -- %1 Mumble - Asgari Görünüm -- %1 Cancel İptal Save Image As... Resmi Farklı Kaydet... Save Image File Resim Dosyasını Kaydet Could not save image: %1 Resim kaydedilemedi: %1 Change your comment Yorumu değiştir Transmit Mode set to Voice Activity Aktarma Kipi Ses Etkinliği olarak ayarlandı Transmit Mode set to Push-to-Talk Aktarma Kipi Bas-ve-Konuş olarak ayarlandı <p>Connected users: %1/%2</p> <p>Çevrimiçi kullanıcılar: %1/%2</p> UDP Statistics UDP İstatistikleri To Server Sunucuya From Server Sunucudan Good İyi Late Gecikmeli Lost Kayıp Resync Tekrar Senkronize <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> <h2>Ses bant genişliği</h2><p>Azami %1 kbit/s<br />Güncel %2 kbit/s<br />Kodek: %3</p> Mumble Server Information Mumble Sunucu Verileri &View Certificate &Sertifika Görüntüle Enter reason Sebep gir Sending message to %1 %1 adlı kullanıcıya mesaj gönderiliyor To %1: %2 Şuna: %1: %2 Message to %1 %1 adlı kullanıcıya mesaj Are you sure you want to reset the comment of user %1? %1 adlı kullanıcının yorumunu sıfırlamak istediğinizden emin misiniz? Are you sure you want to reset the avatar of user %1? %1 kullanıcısının havarisini sıfırlamak istediğinizden emin misiniz? Are you sure you want to delete %1 and all its sub-channels? %1 adlı kanalı ve tüm alt kanallarını silmek istediğinizden emin misiniz? Sending message to channel %1 %1 adlı kanala mesaj gönderiliyor Message to tree %1 %1 ağacına mesaj To %1 (Tree): %2 (Tree) %1: %2 Şuna: %1 (Ağaç): %2 Unmuted and undeafened. Susturulması ve sağırlığı kaldırıldı. Unmuted. Susturulma kaldırıldı. Muted. Susturuldu. Muted and deafened. Susturuldu ve sağır edildi. Deafened. Sağır edildi. Undeafened. Sağırlığı kaldırıldı. Restart Mumble? Mumble tekrar başlatılsın mı? Some settings will only apply after a restart of Mumble. Restart Mumble now? Bazı ayarlar Mumble'ın tekrar başlatılmasından sonra uygulanacaktır. Şimdi yeniden başlatılsın mı? About Qt Qt Hakkında SSL Verification failed: %1 SSL denetlemesi başarısız oldu: %1 <li>Server certificate digest (SHA-1): %1</li> <li>Sunucu sertifikası özeti (SHA-1): %1</li> <b>WARNING:</b> The server presented a certificate that was different from the stored one. <b>UYARI:</b> Sunucu sakladığımız sertifikadan değişik bir sertifika sundu. This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. Bu sunucu Mumble'ın modern sürümleri tarafından artık desteklenmeyen eski bir şifreleme standardı kullanmaktadır. Server connection failed: %1. Sunucuyla bağlantı başarısız oldu: %1. Disconnected from server. Sunucuyla bağlantı kesildi. Invalid username Geçersiz kullanıcı ismi You connected with an invalid username, please try another one. Geçersiz bir kullanıcı ismi ile bağlantı kurdunuz, lütfen başka bir isim deneyiniz. Username in use İsim kullanılmakta That username is already in use, please try another username. İsim hâlihazırda kullanılmaktadır. lütfen başka bir isim deneyiniz. Wrong certificate or password Yanlış sertifika ya da parola Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. Kaydedilmiş kullanıcı için yanlış sertifika veya parola. Bu kullanıcının bir parola ile korunduğundan eminseniz tekrar deneyiniz. Yoksa iptal edip parolanızı kontrol ediniz. Wrong password Yanlış parola Wrong server password for unregistered user account, please try again. Kaydedilmemiş kullanıcı oturumu için yanlış sunucu parolası, tekrar deneyiniz. Images (*.png *.jpg *.jpeg) Resimler (*.png *.jpg *.jpeg) C&onfigure &Yapılandır &Help Yard&ım Log Kütük This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. Bu, yakın geçmişteki tüm etkinlikleri gösterir. Sunuculara bağlanmalar, hatalar ve veri mesajları burada görüntülenir.<br />Hangi mesajların görüntüleneceğini ayarlamak için menüden <b>Ayarlar</b> komutunu kullanınız. &Quit Mumble Mumble'dan &Çık Closes the program Programı kapatır Exits the application. Uygulamadan çıkar. Ctrl+Q Ctrl+Q Open the server connection dialog Sunucuya bağlanma diyaloğunu aç &Disconnect Bağlantıyı &Kes Disconnect from server Sunucuyla bağlantıyı kes Disconnects you from the server. Sunucuyla bağlantıyı keser. Show information about the server connection Sunucu bağlantısı hakkında veri göster This will show extended information about the connection to the server. Sunucuyla bağlantı hakkında ayrıntılı bilgi gösterir. &Mute &Sustur &Deafen Sa&ğır et &Local Mute Ye&rel Olarak Sustur Send a Text Message Metin Mesajı Gönder Sends a text message to another user. Başka bir kullanıcıya metin mesajı gönderir. Add new channel Yeni kanal ekle This adds a new sub-channel to the currently selected channel. Şu anda seçili olan kanala alt kanal ekler. Remove channel Kanalı kaldır This removes a channel and all sub-channels. Kanalı ve tüm alt kanallarını kaldırır. Edit Groups and ACL for channel Kanalın gruplarını ve EKL'lerini düzenle This opens the Group and ACL dialog for the channel, to control permissions. İzinleri denetlemek için Grup ve Erişim Kontrol Listesi diyaloğunu açar. &Link &Bağla Link your channel to another channel Kanalınızı başka bir kanala bağla This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. Bu sohbet çubuğudur.<br />Buraya bir metin girerseniz ve giriş (enter) tuşuna basarsanız, metin seçili kullanıcıya ya da kanala yollanır. Hiçbir şey seçili değilse mesaj güncel kanalınıza gönderilir. Chatbar Sohbet Çubuğu Shows a dialog of registered servers, and also allows quick-connect. Kayıtlı sunucular diyaloğunu gösterir, ek olarak çabuk bağlanmaya olanak verir. Kick user (with reason) Kullanıcıyı kov (sebep ile) Kick selected user off server. You'll be asked to specify a reason. Seçilen kullanıcıyı sunucudan kov. Bir neden göstermeniz istenecektir. Mute user Kullanıcıyı sustur Mute or unmute user on server. Unmuting a deafened user will also undeafen them. Kullanıcıyı sunucuda sustur ya da susturmayı kaldır. Sağır edilmiş bir kullanıcının susturulmasının kaldırılması aynı zamanda sağırlığını da kaldırır. Kick and ban user (with reason) Kullanıcı kov ve yasakla (sebep ile) Kick and ban selected user from server. You'll be asked to specify a reason. Seçilen kullanıcıyı sunucudan kov ve yasakla. Bir neden göstermeniz istenecektir. Deafen user Kullanıcıyı sağır et Deafen or undeafen user on server. Deafening a user will also mute them. Kullanıcıyı sunucuda sağır et ya da sağırlığını kaldır. Sağır edilmesi aynı zamanda susturulacağı anlamına da gelir. Mute user locally Kullanıcıyı yerel olarak sustur Mute or unmute user locally. Use this on other users in the same room. Kullanıcıyı yerel olarak sustur ya da susturulmasını kaldır. Bunu aynı kanaldaki diğer kullanıcılar üzerinde kullanınız. This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. Bu, güncel kanalınızı seçilen kanala bağlar. Kanallardan birinde kullanıcıların diğer kanalda konuşma izinleri varsa, bağlantıdan sonra birbirlerini duyabilirler. Bu daimi bir bağlantıdır ve sunucu tekrar başlatılmadığı ya da elle bağlantı kaldırılmadığı sürece silinmez. Bas-ve-bağla kısayollarına da bakınız. &Unlink Channel Bağlantıyı &Kaldır Unlink your channel from another channel Kanalın başka bir kanalla bağlantısını kaldır This unlinks your current channel from the selected channel. Bu, güncel kanalın seçilen kanalla bağlantısını kaldırır. Unlinks your channel from all linked channels. Kanalınızın tüm bağlantılarını kaldırır. This unlinks your current channel (not the selected one) from all linked channels. Bu, güncel kanalınızın (seçilen değil) tüm bağlantılarını kaldırır. &Reset &Sıfırla Reset audio preprocessor Ses ön işlemcisini sıfırla This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. Gürültü iptali, otomatik kazanım ve ses etkinliği tespiti de dahil olmak üzere ses ön işlemcisini sıfırlar. Ses ortamında herhangi bir şey aniden kötüleşirse ve bu geçiciyse (mikrofonun yere düşmesi gibi), ön işlemcinin yeniden ayarlanmasını beklememek için kullanabilirsiniz. &Mute Self &Kendini Sustur Mute yourself Kendini sustur Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. Sizi susturur ya da susturulmanızı kaldırır. Susturulduğunuzda sunucuya hiçbir veri göndermezsiniz. Sağırken susturulma kaldırılırsa, bu aynı zamanda sağırlığı da kaldırır. &Deafen Self &Kendini Sağır Et Deafen yourself Kendini sağır et Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. Sizi sağır eder ya da bunu kaldırır. Sağırken hiçbir şey duymazsınız. Kendinizi sağır etmeniz aynı zamanda sizi susturacaktır. &Text-To-Speech Konu&şma Sentezi Toggle Text-To-Speech Konuşma sentezini açıp kapatır Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. Konuşma sentezini etkinleştirip devre dışı bırakır. Sadece yapılandırma penceresinde konuşma sentezi için işaretlenen mesajlar söylenecektir. Display audio statistics Ses istatistiklerini göster Pops up a small dialog with information about your current audio input. Güncel ses girdiniz hakkında bilgi bulunduran küçük bir pencere açar. Forcibly unlink plugin Eklentinin devre dışı bırakılmasını zorla This forces the current plugin to unlink, which is handy if it is reading completely wrong data. Güncel eklentinin devre dışı bırakılmasını zorlar, ki yanlış veri okuyorsa bu kullanışlı olur. Configure Mumble Mumble'ı yapılandır Allows you to change most settings for Mumble. Mumble'ın ayarlarını değiştirmenize imkân verir. Start the audio configuration wizard Ses yapılandırma sihirbazını başlat This will guide you through the process of configuring your audio hardware. Bu, ses donanımınızı yapılandırmanızda size rehberlik edecektir. &What's This? &Bu Nedir? Enter What's This? mode Bu Nedir? kipine gir Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. "Bu Nedir?" kipine girmek için tıklayınız. İmleciniz bir soru işaretine dönüşecektir. Ardından. tanımlamasını görmek için istediğiniz düğmeye, menü seçeneğine ya da alana tıklayınız. Information about Mumble Mumble hakkında bilgi Shows a small dialog with information and license for Mumble. Mumble ve lisansı hakkında bilgi gösteren küçük bir pencere açar. Information about Speex Speex hakkında bilgi Shows a small dialog with information about Speex. Speex hakkında bilgi gösteren küçük bir pencere açar. Information about Qt Qt hakkında bilgi Shows a small dialog with information about Qt. Qt hakkında bilgi gösteren küçük bir pencere açar. Check for &Updates &Güncellemelere Bak Check for new version of Mumble Mumble'ın yeni sürümü olup olmadığını denetle Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. Yeni bir sürümün olup olmadığını denetlemek için Mumble'ın ağ sayfasına bağlanır ve yeni bir sürüm varsa gerekli indirme adresini içeren bir bildirim gösterir. Sends a text message to all users in a channel. Kanaldaki kullanıcıların tümüne metin mesajı gönderir. Configure certificates for strong authentication Güçlü kimlik doğrulaması için sertifikaları yapılandır This starts the wizard for creating, importing and exporting certificates for authentication against servers. Sunucularda kimlik doğrulaması için sertifika oluşturma, içe ve dışa aktarma sihirbazını başlatır. Register user on server Sunucuda kullanıcı kaydet This will permanently register the user on the server. Kullanıcıyı sunucuda daimi olarak kaydeder. Add &Friend &Arkadaş Ekle Adds a user as your friend. Kullanıcıyı arkadaş listenize ilâve eder. This will add the user as a friend, so you can recognize him on this and other servers. Bu ve diğer sunucularda tanıyabilmeniz için kullanıcıyı arkadaş listenize ekler. &Remove Friend Arkadaş &Kaldır Removes a user from your friends. Kullanıcıyı arkadaş listenizden kaldırır. This will remove a user from your friends list. Kullanıcıyı arkadaş listenizden kaldırır. &Update Friend Arkadaşı &Güncelle Update name of your friend. Arkadaşınızın ismini günceller. Your friend uses a different name than what is in your database. This will update the name. Arkadaşınız veritabanınızda belirtilenden değişik bir isim kullanmamaktadır. Bu, ismi güncelleyecektir. Edit registered users list Kayıtlı kullanıcı listesini düzenle This opens the editor for registered users, which allow you to change their name or unregister them. Kayıtlı kullanıcılar için isimlerini değiştirmenize ya da kayıtlarını kaldırmanıza imkân sağlayan düzenleyici penceresi açar. Add or remove text-based access tokens Metne dayalı erişim jetonlarını ekle ya da kaldır &Minimal View K&üçük Görüntü Toggle minimal window modes Küçük görüntü kipini açıp kapatır ya da değiştirir This will toggle minimal mode, where the log window and menu is hidden. Kütük ve menü pencerelerinin saklandığı küçük görüntü kipini açıp kapatır. You muted and deafened %1. %1 adlı kullanıcıyı susturdunuz ve sağır ettiniz. You unmuted and undeafened %1. %1 adlı kullanıcının susturulmasını ve sağırlığını kaldırdınız. You undeafened %1. %1 adlı kullanıcının sağırlığını kaldırdınız. You suppressed %1. %1 adlı kullanıcıyı askıya aldınız. %1 muted and deafened by %2. %1, %2 tarafından susturuldu ve sağır edildi. %1 unmuted and undeafened by %2. %1 adlı kullanıcının susturulması ve sağırlığı %2 tarafından kaldırıldı. %1 undeafened by %2. %1 adlı kullanıcının sağırlığı %2 tarafından kaldırıldı. %1 suppressed by %2. %1, %2 tarafından askıya alındı. %1 moved to %2. %1, %2 kanalına taşındı. %1 moved to %2 by %3. %1, %3 tarafından %2 kanalına taşındı. %1 moved in from %2 by %3. %1, %2 kanalından %3 tarafından getirildi. %1 is now muted and deafened. %1 artık susturuldu ve sağır edildi. Your account information can not be verified currently. Please try again later Şu anda hesap bilgileriniz doğrulanamıyor. Lütfen daha sonra tekrar deneyin Welcome message: %1 Hoş geldiniz mesajı: %1 Mumble: %1 Mumble: %1 You were denied %1 privileges in %2. %2 kanalında %1 izniniz reddedildi. %3 was denied %1 privileges in %2. %3 için %1 izinleri %2 kanalında reddedildi. Denied: Cannot modify SuperUser. Reddedildi: SuperUser değiştirilemez. Denied: Invalid channel name. Reddedildi: Geçersiz kanal ismi. Denied: Text message too long. Reddedildi: Metin mesajı çok uzun. Denied: Operation not permitted in temporary channel. Reddedildi: İşleme geçici kanallarda izin verilmez. You need a certificate to perform this operation. Bu işlemi yapabilmek için bir sertifikaya ihtiyacınız var. %1 does not have a certificate. %1 adlı kullanıcının sertifikası yok. Invalid username: %1. Geçersiz kullanıcı ismi: %1. Invalid username. Geçersiz kullanıcı ismi. Channel is full. Kanal dolu. Channel nesting limit reached. Kanal yuvalama sınırına ulaşıldı. Channel count limit reached. Need to delete channels before creating new ones. Permission denied. İzin reddedildi. %1 connected and entered channel. %1 connected. %1 bağlandı. %1 is now muted. %1 artık susturuldu. %1 is now unmuted. %1 adlı kullanıcının susturulması artık kaldırıldı. Recording started Kayıt başladı Recording stopped Kayıt durduruldu %1 started recording. %1 kayda başladı. %1 stopped recording. %1 kaydı durdurdu. You revoked your priority speaker status. Öncelikli konuşmacı durumunuzu iptal ettiniz. You assumed priority speaker status. Öncelikli konuşmacı durumu üstlendiniz. %1 revoked your priority speaker status. %1 öncelikli konuşmacı durumunuzu iptal etti. %1 gave you priority speaker status. %1 size öncelikli konuşmacı durumunu verdi. You revoked priority speaker status for %1. %1 için öncelikli konuşmacı durumunu iptal ettiniz. You gave priority speaker status to %1. %1 kullanıcısına öncelikli konuşmacı durumu verdiniz. %1 revoked own priority speaker status. %1 kendi öncelikli konuşmacı durumunu iptal etti. %1 assumed priority speaker status. %1 öncelikli konuşmacı durumu üstlendi. %1 revoked priority speaker status for %2. %1, %2 kullanıcısının öncelikli konuşmacı durumunu iptal etti. %1 gave priority speaker status to %2. %1, %2 kullanıcısına öncelikli konuşmacı durumu verdi. You were unmuted and undeafened by %1. Susturulmanız ve sağırlığınız %1 tarafından kaldırıldı. You were muted by %1. %1 tarafından susturuldunuz. You were undeafened by %1. Sağırlığınız %1 tarafından kaldırıldı. You were suppressed. You were suppressed by %1. Askıya alındınız. You were unsuppressed. Askıya alınmanız kaldırıldı. You were unsuppressed by %1. Askıya alınmanız %1 tarafından kaldırıldı. You joined %1. You moved %1 to %2. %1 unsurunu %2 konumuna taşıdınız. %1 is recording %1 kayıt yapıyor %1 renamed to %2 by %3. %1, %3 tarafından %2 olarak yeniden adlandırılmıştır. %1 disconnected. %1 sunucudan çıktı. Server message from Sunucu (Tree) (Ağaç) (Channel) (Kanal) (Private) (Özel) %2%1: %3 %2%1: %3 Failed to load Opus, it will not be available for audio encoding/decoding. The server requests minimum client version %1 Sunucu asgari %1 istemci sürümünü talep ediyor The server requests positional audio be enabled. Sunucu konumsal sesin etkinleştirilmesini talep ediyor. The server requests positional audio be disabled. Sunucu konumsal sesin devre dışı bırakılmasını talep ediyor. The server requests Push-to-Talk be enabled. Sunucu Bas-ve-Konuşun etkinleştirilmesini talep ediyor. The server requests Push-to-Talk be disabled. Sunucu Bas-ve-Konuşun devre dışı bırakılmasını talep ediyor. You were unmuted by %1. Susturulmanız %1 tarafından kaldırıldı. You muted %1. %1 adlı kullanıcıyı susturdunuz. You unsuppressed %1. %1 adlı kullanıcıyı askıya aldınız. You unmuted %1. %1 adlı kullanıcının susturulmasını kaldırdınız. %1 muted by %2. %1, %2 tarafından susturuldu. %1 unsuppressed by %2. %1 adlı kullanıcının askıya alınması %2 tarafından kaldırıldı. %1 unmuted by %2. %1 adlı kullanıcının susturulması %2 tarafından kaldırıldı. Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. Diğer istemcilerle uyumlu CELT kodekleri bulunamadı. Diğer kullanıcılar ile konuşamayacaksınız. You were muted and deafened by %1. You were deafened by %1. %1 tarafından susturuldunuz ve sağır edildiniz. You were kicked from the server by %1: %2. Sunucudan %1 tarafından kovuldunuz: %2. %3 was kicked from the server by %1: %2. %3 sunucudan %1 tarafından kovuldu: %2. You were kicked and banned from the server by %1: %2. %1 sizi sunucudan kovdu ve yasakladı: %2. %3 was kicked and banned from the server by %1: %2. %3 adlı kullanıcı %1 tarafından sunucudan kovuldu ve yasaklandı: %2. You were moved to %1 by %2. %2 tarafından %1 kanalına taşındınız. %1 entered channel. %1 kanala katıldı. Server connection rejected: %1. Sunucu bağlantısı reddedildi: %1. Denied: %1. Reddedildi: %1. %1 renamed to %2. %1, %2 olarak yeniden adlandırıldı. %1 left channel and disconnected. %1 kanaldan ayrıldı ve bağlantıyı kesti. Message from %1 %1 tarafından mesaj You have User Dragging set to "Do Nothing" so the user wasn't moved. Kullanıcı Kaydırmayı "Hiçbir Şey Yapma" olarak ayarladığınızdan kullanıcı taşınmadı. You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. Kalan Kaydırmayı "Hiçbir Şey Yapma" olarak ayarladığınızdan kanal taşınmadı. Unknown Channel Drag mode in UserModel::dropMimeData. UserModel::dropMimeData'da bilinmeyen Kanal Kaydırma kipi. Remote controlling Mumble: Mumble'ın uzaktan kontrolü: Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) -jn, --jackname Set custom Jack client name. --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status Invocation Çağrı Error: No RPC command specified Hata: Hiçbir RPC komutu belirtilmedi RPC RPC Welcome to Mumble. Mumble'a Hoş Geldiniz. Skipping version check in debug mode. Hata ayıklama kipinde sürüm denetlemesi atlandı. Hide Frame Çerçeveyi Sakla Toggle showing frame on minimal window Çerçevenin görüntülenmesini etkinleştirip devre dışı bırakır This will toggle whether the minimal window should have a frame for moving and resizing. Küçük pencerenin taşıma ve boyutlandırma için bir çerçevesinin olup olmayacağını ayarlar. &Unlink All Tüm &Bağlantıları Sil Reset the comment of the selected user. Seçilen kullanıcının yorumunu sıfırla. &Join Channel Kanala Ka&tıl View comment in editor Yorumu düzenleyicide görüntüle Query server for connection information for user Kullanıcı hakkında bilgi için sunucuyu sorgula S&erver S&unucu &Self Ke&ndiniz &Unlink Plugins Eklentiler Devre Dışı &Bırak Register yourself on the server Kendinizi sunucuda kaydedin Change your avatar image on this server Bu sunucuda havari görselinizi değiştirin &Remove Avatar &Havariyi Kaldır Remove currently defined avatar image. Güncel olarak tanımlı havari görselini kaldır. Icon Toolbar İkon Araç Çubuğu Change your own comment Kendi yorumunuzu değiştirin Recording Ses Kaydı Priority Speaker Öncelikli Konuşmacı &Copy URL URL'i &Kopyala Copies a link to this channel to the clipboard. Panoya bu kanal için bağlantı kopyalar. Ignore Messages Mesajları Görmezden Gel Locally ignore user's text chat messages. Kullanıcının metin mesajlarını yerel olarak görmezden gel. Silently drops all text messages from the user. Kullanıcının tüm metin mesajlarını sessiz sedasız görmezden gelir. Edit ban list on server Sunucuda yasaklama listesini düzenle This lets you edit the server-side IP ban list. Bu, sunucuda IP yasaklama listesini düzenlemenize izin verir. &Filter on/off &Filtre Aç/Kapat Toggle the channel filter (Ctrl+F) Kanal filtresini değiştir (Ctrl+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. Seçtiğiniz kanalların filtrelenmesini etkinleştirin yada devre dışı bırakın. Varsayılan olarak boş kanallar filtrelenir. Kanalın içerik menüsünden filtrelenmesi için ilave kanallar ekleyebilirsiniz. Ctrl+F Ctrl+F &Hide Channel when Filtering &Filtrelerken kanalı gizle Reset the avatar of the selected user. Seçilen kullanıcının havarisini sıfırla. Locally adjust the user's speech volume. Kullanıcının konuşma ses seviyesini yerel olarak ayarla Opens a dialog with a volume slider. Use this on other users in the same room. Ses seviyesini belirleyen kaydırıcı içeren bir diyalog açar. Bunu, aynı odadaki diğer kullanıcılar üzerinde kullanın. &Developer &Geliştirici &Hide Mumble &Mumble'ı Sakla Hides the main Mumble window. Ana Mumble penceresini saklar. Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. Ana Mumble penceresini saklar. Geri getirmek için sistem çekmecesi ikonuna tıklayın ya da Mumble'ı tekrar başlatın. Show the Developer Console Geliştirici Konsolünü Göster Shows the Mumble Developer Console, where Mumble's log output can be inspected. Mumble'ın kütük çıktısının kontrol edilebileceği Mumble Geliştirici Konsolünü gösterir. &Connect... &Ban list... &Information... &Kick... &Ban... Local Volume Adjustment... Send &Message... &Add... &Remove... &Edit... Audio S&tatistics... &Settings... &Audio Wizard... Developer &Console... &About... About &Speex... About &Qt... &Certificate Wizard... &Register... Registered &Users... Change &Avatar... &Access Tokens... Reset &Comment... Reset &Avatar... View Comment... &Change Comment... R&egister... Show Shows the main Mumble window. Manual Manual Mumble Positional Audio Elle Mumble Konumsal Ses Position Konum X X Y Y Z Z m m Heading Yön Azimuth Azimut Elevation Yükseklik ° ° Meta data Üst veriler Context Bağlam Identity Kimlik Set Ayarla State Durum Linked Bağlı Activated Etkinleştirilmiş Unhinge Ayır NetworkConfig Network Şebeke Updates are mandatory when using snapshot releases. Geliştirme sürümleri kullanıldığında güncellemeler mecburidir. Connection Bağlantı Use TCP compatibility mode Use TCP compatability mode TCP uyumluluk kipini kullan <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). <b>TCP uyumluluk kipi</b>.<br /> Mumble'ın sunucu ile iletişiminde sadece TCP kullanmasını sağlar. Bu ayar ek yükü arttırır ve kaybedilen paketlerin iletişimde farkına varılabilecek duraklamalara yol açmasına neden olur, dolayısıyla sadece varsayılan yapılandırmayı (ses için UDP ve kontrol için TCP) kullanamıyorsanız seçilmelidir. Reconnect when disconnected Bağlantı koptuğunda tekrar bağlan <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. <b>Bağlantı koptuğunda tekrar bağlan</b>.<br /> Bu ayar sunucuyla bağlantıda kesildiğinde Mumble'ın 10 saniye sonra tekrar bağlanmayı denemesini sağlar. Reconnect automatically Otomatik olarak tekrar bağlan Proxy Vekil sunucu Type Tür Type of proxy to connect through Aracılığıyla bağlanılacak vekil tipi Direct connection Doğrudan bağlantı HTTP(S) proxy HTTP(S) vekil SOCKS5 proxy SOCKS5 vekil Hostname Makine ismi Hostname of the proxy Vekilin makine ismi Force TCP mode TCP kipini zorla Enable QoS to prioritize packets Paketlerin önceliğini yönetmek için QoS'i etkinleştir This will enable QoS, which will attempt to prioritize voice packets over other traffic. Bu, ses paketlerine diğer paketlerden yüksek öncelik vermeyi deneyecek QoS'i (Quality of Service, Servis Kalitesi) etkinleştirecektir. Use Quality of Service Servis Kalitesini kullan Don't send certificate to server and don't save passwords. (Not saved). Sunucuya sertifika gönderme ve parolaları kaydetme (Seçenek durumu kaydedilmez). <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> <b>Bu, istemciden kimlik verilerini kaldıracaktır.</b><p>İstemci kendisini varsa bile sertifika ile doğrulamayacak, ve bağlantılar için parolaları saklamayacaktır. Öncelikle bir test seçeneği olup, kaydedilmez.</p> Suppress certificate and password storage Sertifika ve parola saklamasını kaldır <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>Aracılığıyla bağlanılacak vekil tipi</b><br />Bu ayar Mumble'ın tüm dışarıya giden bağlantılar için bir vekil sunucudan geçmesini sağlar. Not: Vekil tüneli kullanmak, Mumble'ı TCP uyumluluk kipine zorlar ve bu tüm ses verilerinin kontrol kanalından yollanmasına yol açar. <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. <b>Vekilin bilgisayar ismi.</b><br />Bu alan, şebeke trafiğinin tünelleneceği vekilin makine ismini (hostname) belirtir. Port Port Port number of the proxy Vekilin port numarası <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. <b>Vekilin port numarası.<b><br />Bu alan vekilin bağlantı beklediği port numarasını girmeye yarar. Username Kullanıcı ismi Username for proxy authentication Vekilde kimlik doğrulaması için kullanıcı adı <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>Vekilde kimlik doğrulaması için kullanıcı adı.</b><br />Vekil sunucuda kimliğinizi doğrulamak için kullanacağınız kullanıcı ismini belirtir. Vekil sunucu kimlik doğrulaması istemiyorsa ya da anonim olarak bağlanmak istiyorsanız bu alanı boş bırakınız. Password Parola Password for proxy authentication Vekilde kimlik doğrulaması için parola <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>Vekilde kimlik doğrulaması için parola.</b><br />Vekil sunucuda kimliğinizi doğrulamak için kullanacağınız parolayı belirtir. Vekil sunucu kimlik doğrulaması istemiyorsa ya da anonim olarak bağlanmak istiyorsanız bu alanı boş bırakınız. Mumble services Mumble servisleri Check for new releases of Mumble automatically. Yeni Mumble sürümlerini otomatik olarak kontrol et. This will check for new releases of Mumble every time you start the program, and notify you if one is available. Bu, programı her başlattığınızda, Mumble'ın yeni bir sürümünün olup olmadığını denetleyecek ve varsa size bildirecektir. Check for application updates on startup Uygulama güncellemelerini başlangıçta denetle Check for new releases of plugins automatically. Eklentilerin yeni sürümlerini otomatik olarak denetle. This will check for new releases of plugins every time you start the program, and download them automatically. Bu, programı her başlattığınızda, eklentilerin yeni sürümü olup olmadığını kontrol edecek ve varsa otomatik olarak indirecektir. <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. <b>Anonim istatistik gönder.</b><br />Mumble'ın geliştirme ekibi küçüktür, dolayısıyla çalışmalarını en çok ihtiyaç duyulan alanlara odaklamak zorundadır. Bu istatistikleri göndererek projenin hangi alanlara odaklanması gerektiğini belirlemesine yardımcı olursunuz. Submit anonymous statistics to the Mumble project Mumble projesine anonim istatistik gönder Submit anonymous statistics Anonim istatistik gönder Reconnect to last used server when starting Mumble Mumble başladığında son kullanılan sunucuya bağlansın Reconnect to last server on startup Başladığında son sunucuya bağlan Download plugin and overlay updates on startup Başladığında eklenti ve yerpaylaşan güncellemelerini indir Privacy Prevent OS information being sent to Mumble servers and web servers <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. Do not send OS information to Mumble servers and web servers Overlay Silent Sessiz Talking Konuşmakta Whisper Fısıltı Shout Bağırış Channel Kanal Failed to create communication with overlay at %2: %1. No overlay will be available. %2: %1 konumunda yerpaylaşan ile bağlantı kurulamadı. Hiçbir yerpaylaşan kullanılamayacaktır. OverlayClient Filter Filtre Only talking Sadece konuşanlar Talking and recently active Konuşanlar ve yakın geçmişte etkin olanlar All in current channel Güncel kanallardaki tüm All in linked channels Bağlantılı kanallardaki tüm Always show yourself Kendinizi her zaman gösterin Configure recently active time (%1 seconds)... Yakın geçmişte etkin oluş süresini ayarla (%1 saniye)... Columns Sütunlar Sort Sırala Alphabetically Alfabetik olarak Last state change Son durum değişimi Edit... Düzenle... Reset Zoom Yakınlaştırmayı sıfırla Configure recently active time Yakın geçmişte etkin olma süresini yapılandır Amount of seconds users remain active after talking: Konuştuktan sonra kullanıcıların etkin sayılacakları süre: OverlayConfig To move the users, drag the little red dot. Kullanıcıları taşımak için küçük kırmızı noktayı kaydırın. To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. Kullanıcıları yeniden boyutlandırmak için bir kullanıcı üzerinde fare tekerleğini kullanın. For more options, right click a user. For more options, rightclick a user. Daha fazla bilgi için kullanıcıya sağ buton ile tıklayın. Launcher Filter Overlay Yerpaylaşan Choose executable Çalıştırılabilir dosya seç Choose application Uygulama seç Choose path Load Overlay Presets Yerpaylaşan ön ayarlarını yükle Mumble overlay presets (*.mumblelay) Mumble yerpaylaşan ön ayarları (*.mumblelay) Save Overlay Presets Yerpaylaşan ön ayarlarını kaydet Options Seçenekler Enable overlay. Yerpaylaşanı etkinleştir. Enable Overlay Yerpaylaşanı Etkinleştir This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. Bu ayar yerpaylaşanın etkinleştirilip etkinleştirilmeyeceğini belirler. Bu ayar sadece uygulamalar başlatıldığında denetlenir, dolayısıyla Mumble'ın uygulamayı başlatmadan önce çalışmakta olduğundan emin olunuz.<br />Uygulama çalışmakta iken yerpaylaşanı devre dışı bırakırsanız ya da Mumble'ı uygulamadan sonra başlatırsanız, yerpaylaşanı güvenli olarak tekrar başlatmanın tek yolu uygulamayı tekrar başlatmaktır. Layout Düzen Blacklist Kara liste Whitelist Beyaz liste Uninstall Overlay Yerpaylaşanı kaldır Overlay Installation Yerpaylaşan kurulumu Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. Mumble, Mumble Yerpaylaşanın kurulu olmadığını tespit etti. Yerpaylaşanı kurmak için aşağıdaki düğmeyi tıklayınız. Install Mumble Overlay Mumble Yerpaylaşanı Kur Overlay Upgrade Yerpaylaşan Güncellemesi Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. Mumble, bilgisayarınızda eski yerpaylaşan destek dosyaları tespit etti. Bu dosyaları son sürümlerine güncellemek için aşağıdaki düğmeyi tıklayınız. Upgrade Mumble Overlay Mumble Yerpaylaşanı Güncelle Display a frame counter in the overlay Yerpaylaşanda çerçeve sayacı (FPS) göster Show FPS counter FPS sayacını göster Load an overlay preset from file Dosyadan yerpaylaşan ön ayarı yükle Load… Yükle... Save your overlay settings to file Yerpaylaşan ayarlarını dosyaya kaydet Save… Kaydet... Set the overlay font. Yerpaylaşan yazı tipini ayarla. Set the overlay text color. Yerpaylaşan metin rengini ayarla. Color Renk Remove Kaldır Font Yazı Tipi FPS and Clock Display FPS ve Saat Göstergesi Display a clock in the overlay showing the current local time (system time). Yer kaplayanda güncel yerel zamanı (sistem vaktini) gösteren bir saat görüntüle. Show Clock Saati Göster Overlay Exceptions Overlay Exception Mode Allowed launchers Add Allowed programs Allowed paths Blacklisted programs OverlayEditor State Durum User is not talking Kullanıcı konuşmuyor Passive Pasif User is talking in your channel or a linked channel Kullanıcı sizin kanalınızda ya da bağlantılı bir kanalda konuşuyor Talking Konuşuyor User is whispering to you privately Kullanıcı özel olarak size fısıldıyor Private Whisper Özel Fısıltı User is shouting to your channel Kullanıcı kanalınızda bağırıyor Channel Whisper Kanal Fısıltısı Zoom Yakınlaştırma Zoom Factor Yakınlaştırma Faktörü Enabled Elements Etkin Unsurlar User avatar, chosen by each user Kullanıcı havarisi, kullanıcılar tarafından seçilir Avatar Havari User's name Kullanıcının ismi Username Kullanıcı ismi Name of user's channel, if outside your current channel Kullanıcının kanal ismi. sizin güncel kanalınızın dışındaysa Channel Kanal Muted or deafened Susturulmuş ya da sağır Mute state Susturma durumu Bounding box, automatically shrunk to minimum size to contain all visible elements Sınırlayıcı kutu, otomatik olarak tüm görüntülenen unsurları kapsayacak asgari boyuta indirgenmiş Bounding box Sınırlayıcı kutu Overlay Editor Yerpaylaşan Düzenleyicisi OverlayEditorScene Layout preset Düzen ön ayarları Large square avatar Büyük kare havari Avatar and Name Havari ve İsim User Opacity Kullanıcı Opaklığı %1% %%1 Object Opacity Cisim Opaklığı Alignment Hizalama Left Sol Center Orta Right Sağ Top En üste Bottom En aşağıya Color... Renk... Font... Yazı tipi... Bounding box Sınırlayıcı kutu Pen width Kalem kalınlığı Padding Doldurma Pen color Kalem rengi Fill color Doldurma rengi Pick pen color Kalem rengi seç Pick fill color Doldurma rengi seç Pick color Renk seç Pick font Yazı tipi seç PluginConfig Plugins Eklentiler Plugin has no configure function. Eklentinin herhangi bir yapılandırma işlevi yoktur. Plugin has no about function. Eklentinin herhangi bir hakkında işlevi yoktur. Options Seçenekler Enable plugins and transmit positional information Eklentileri etkinleştir ve konum verisi gönder This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. Bu, destekleyen oyunlar için eklentilerin oyun içi konumunuzu öğrenmesi ve her ses paketi ile aktarmasına izin verir. Böylece diğer oyuncular sesinizi karakterinizin onlara göre konumundan duyarlar. Link to Game and Transmit Position Oyuna bağla ve Konum aktar Reloads all plugins Tüm eklentileri tekrar yükle This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. Bu, eklentileri tarar ve yeniden yükler. Eklentiler dizininizde bir eklenti değiştirdiyseniz veya eklediyseniz kullanınız. &Reload plugins &Eklentileri tekrar yükle Information about plugin Eklenti hakkında bilgi This shows a small information message about the plugin. Eklenti hakkında kısa bir mesaj gösterir. &About &Hakkında Show configuration page of plugin Eklentinin yapılandırma sayfasını göster This shows the configuration page of the plugin, if any. Varsa eklentinin yapılandırma ve ayar sayfasını gösterir. &Configure &Yapılandır Name İsim Enabled Etkin Plugins Skipping plugin update in debug mode. Hata ayıklama kipinde eklenti güncellemesi atlanıyor. Downloaded new or updated plugin to %1. Yeni ya da güncelleştirilmiş eklenti %1 konumuna indirildi. Failed to install new plugin to %1. Yeni eklenti %1 konumuna kurulamadı. %1 lost link. %1 bağlantı kaybetti. %1 linked. %1 bağlandı. PortAudioSystem Default Device Varsayılan Cihaz PulseAudioSystem Default Input Varsayılan Girdi Default Output Varsayılan Çıktı QApplication Failed to restart mumble Mumble'ın tekrar başlatılması başarısız oldu Mumble failed to restart itself. Please restart it manually. Mumble kendini tekrar başlatamadı. Lütfen elle başlatınız. RichTextEditor Failed to load image Resim yüklenemedi Image file too large to embed in document. Please use images smaller than %1 kB. Resim dosyası belgeye eklemek için çok büyük. Lütfen %1 kB değerinden küçük görseller kullanın. Message is too long. Mesaj çok uzun. Display Görüntü Source Text Kaynak Metin &Bold &Kalın Ctrl+B Ctrl+B &Italic &İtalik Italic İtalik Ctrl+I Ctrl+I Underline Altı çizili Ctrl+U Ctrl+U Color Renk Insert Link Bağlantı Ekle Ctrl+L Ctrl+L Insert Image Resim Ekle RichTextEditorLink Add Link Bağlantı Ekle URL URL Text Metin ServerHandler Unable to resolve hostname Server is not responding to TCP pings Sunucu TCP pinglerine cevap vermemektedir UDP packets cannot be sent to or received from the server. Switching to TCP mode. Sunucuya UDP paketleri gönderilemiyor ya da ondan bu paketler alınamıyor. TCP kipine geçiliyor. UDP packets cannot be sent to the server. Switching to TCP mode. UDP paketleri sunucuya gönderilemiyor. TCP kipine geçiliyor. UDP packets cannot be received from the server. Switching to TCP mode. Sunucudan UDP paketleri alınamıyor. TCP kipine geçiliyor. UDP packets can be sent to and received from the server. Switching back to UDP mode. UDP paketleri sunucuya gönderilebiliyor ve ondan alınabiliyor. UDP kipine dönüş yapılıyor. Connection timed out Bağlantı zaman aşımına uğradı ServerView Favorite Favori LAN Yerel ağ - LAN Public Internet İnternet Unknown Africa Afrika Asia Asya North America Kuzey Amerika South America Güney Amerika Europe Avrupa Oceania Okyanusya ShortcutActionWidget Unassigned Atanmamış ShortcutDelegate On Açık Off Kapalı Toggle Değiştir Unassigned Atanmamış ShortcutKeyWidget Press Shortcut Bir kısayola basın ShortcutTargetDialog Root Kök Parent Üst Current Güncel Subchannel #%1 Alt kanal #%1 ShortcutTargetWidget ... ... , , Root Kök Parent Üst Current Güncel Subchannel #%1 Alt kanal #%1 Invalid Geçersiz Empty <Empty> Boş ShortcutToggleWidget Off Kapalı Toggle Değiştir On Açık TextMessage Enter text Metin girin If checked the message is recursively sent to all subchannels Seçilirse mesaj yinelemeli olarak tüm alt kanallara yollanacaktır Send recursively to subchannels Yinelemeli olarak alt kanallara gönder Tokens Empty Token Boş Jeton Mumble - Access Tokens Mumble - Erişim Jetonları List of access tokens on current server Güncel sunucudaki erişim jetonlarının listesi <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. <b>Bu, bağlanılan sunucudaki erişim jetonlarının düzenlenilebilir listesidir.</b> <br /> Erişim jetonu bir metindir ve kanallara erişimin çok basit bir şekilde yönetilmesi için parola olarak kullanılabilir. Mumble kullandığınız jetonları hatırlayacak her defasında yeniden girmenize gerek olmaması için gelecek sefere sunucuya bağlandığınızda tekrar gönderecektir. Add a token Jeton ekle &Add &Ekle Remove a token Jeton kaldır &Remove &Kaldır UserEdit Registered Users Kayıtlı kullanıcılar Remove Kaldır Rename Yeniden isimlendir Who are you looking for? Kimi arıyordunuz? Days Gün Weeks Hafta Months Ay Years Yıl Inactive for Etkin olmadığı süre Registered users: %n account(s) Kayıtlı kullanıcı: %n hesapKayıtlı kullanıcılar: %n hesap UserInformation User Information Kullanıcı verileri Connection Information Bağlantı bilgileri Version Sürüm OS İS Certificate Sertifika IP Address İP Adresi CELT Versions CELT Sürümleri Details... Ayrıntılar... Ping Statistics Ping istatistikleri Pings received Alınan pingler Average ping Ortalama ping TCP (Control) TCP (Kontrol) UDP (Voice) UDP (Ses) UDP Network statistics UDP Şebeke İstatistikleri Good İyi Late Geç Lost Kayıp Resync Tekrar Senkronize From Client İstemciden To Client İstemciye Connection time Bağlantı süresi %1w %1h %1d %1g %1h %1s %1m %1d %1s %1s , , %1 (%2) %1.%2.%3 (%4) %1 (%2) Supported Destekli Not Supported Desteksiz Not Reported Belirtilmemiş %1 online (%2 idle) %1 çevrimiçi (%2 aylak) %1 online %1 çevrimiçi %1 kbit/s %1 kbit/s Bandwidth GroupBox Bant genişliği Bandwidth Label Bant genişliği Ping deviation Ping sapması UserListModel Nick Rumuz Inactive days Etkin olmadığı gün Last channel Son kanal Last seen: %1 Son görülme: %1 Never Hiçbir zaman Channel ID: %1 UserLocalVolumeDialog Local volume for other users Diğer kullanıcılar için yerel ses seviyesi <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. <b>Diğer kullanıcıların ses seviyesini yerel olarak ayarla</b><br />Mumble, diğer kullanıcıların ses seviyesinin yerel olarak ayarlanmasını destekler. Adjusting local volume for %1 %1 için yerel ses seviyesi ayarlanıyor dB dB <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> <html><head/><body><p>Kullanıcın ses seviyesini değiştirmek için sürgüyü ya da metin kutusunu kullanın. </p><p><span style="font-weight:600;">Dikkat!</span></p><p>Herhangi bir kullanıcının ses seviyesini fazla arttırmanız kalıcı işitme kaybına sebep olabilir. Aynı zamanda kullanıcının arka plan gürültüsünün artmasına yol açabilir.</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: Bu, sunucuya bağlı bir kullanıcıdır. Solundaki ikon konuşup konuşmadığını belirtir: Talking to your channel. Sizin kanalınıza konuşuyor. Shouting directly to your channel. Whispering directly to your channel. Sizin kanalınıza doğrudan bağırıyor. Whispering directly to you. Size doğrudan fısıldıyor. Not talking. Konuşmuyor. This is a channel on the server. The icon indicates the state of the channel: Bu, sunucuda bir kanaldır. İkon kanalın durumunu gösterir: Your current channel. Sizin güncel kanalınız. A channel that is linked with your channel. Linked channels can talk to each other. Kanalınızla bağlantılı bir başka kanal. Bağlantılı kanallar birbirleriyle konuşabilir. A channel on the server that you are not linked to. Sunucuda bağlı olmadığınız bir kanal. This shows the flags the user has on the server, if any: Bu, kullanıcıların varsa sunucuda taşıdıkları bayrakları gösterir: On your friend list Arkadaş listenizde Authenticated user Doğrulanmış kullanıcı Muted (manually muted by self) Susturulmuş (kendisi tarafından elle susturulmuş) Muted (manually muted by admin) Susturulmuş (yönetici tarafından elle susturulmuş) Muted (not allowed to speak in current channel) Susturulmuş (şu andaki kanalda konuşmasına izin yok) Muted (muted by you, only on your machine) Susturulmuş (sizin tarafınızdan, sadece sizin bilgisayarınızda) Muted (push-to-mute) Deafened (by self) Sağır edilmiş (kendisi tarafından) Deafened (by admin) Sağır edilmiş (yönetici tarafından) User has a new comment set (click to show) Kullanıcının yeni yorumu var (görüntülemek için tıklayınız) User has a comment set, which you've already seen. (click to show) Kullanıcının zaten gördüğünüz yorumu var. (görüntülemek için tıklayınız) Ignoring Text Messages Metin Mesajları Görmezden Geliniyor This shows the flags the channel has, if any: Bu, varsa kanalın taşıdığı bayrakları gösterir: Channel has a new comment set (click to show) Kanalın yeni yorumu var (görüntülemek için tıklayınız) Channel has a comment set, which you've already seen. (click to show) Kanalın zaten gördüğünüz yorumu var (görüntülemek için tıklayınız) Channel will be hidden when filtering is enabled Kanal filtre etkinleştirildiğinde gizlenecektir Name İsim Flags Bayraklar Are you sure you want to drag this user? Bu kullanıcıyı kaydırmak istediğinizden emin misiniz? Are you sure you want to drag this channel? Bu kanalı kaydırmak istediğinizden emin misiniz? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. Bu işlem otomatik olarak yapılamaz, lütfen sayısal sıralama göstergelerini sıfırlayın ya da elle ayarlayın. VersionCheck Upgrade Mumble Mumble'ı güncelle A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? Yeni bir Mumble sürümü otomatik olarak tespit edildi ve indirildi. Ya bu sürüme yükseltmeniz ya da en son kararlı sürüme dönmeniz önerilir. Kurucuyu şimdi başlatmak istiyor musunuz? Failed to launch snapshot installer. Kurucunun başlatılması başarısız oldu. Corrupt download of new version detected. Automatically removed. Yeni sürümün indiriminin bozuk olduğu tespit edildi. Otomatik olarak silindi. Downloading new snapshot from %1 to %2 Yeni bir geliştirme sürümü %1 konumundan %2 konumuna indiriliyor Failed to write new version to disk. Failed to write new version to disc. Yeni sürümün diske yazılması başarısız oldu. Mumble failed to retrieve version information from the central server. Mumble merkezi sunucudan sürüm bilgisi alamadı. ViewCert Certificate Chain Details Sertifika zinciri detayları Certificate chain Sertifika zinciri Certificate details Sertifika ayrıntıları Common Name Yaygın İsmi Organization Teşkilat Subunit Alt birim Country Ülke Locality İl, konum State Eyalet Valid from: %1 Şu tarihten itibaren geçerli: %1 Valid to: %1 Şu tarihe dek geçerli: %1 Serial: %1 Seri numarası: %1 Public Key: %1 bits %2 Kamu anahtarı (Public Key): %1 bits %2 RSA RSA DSA DSA Digest (SHA-1): %1 SHA-1 hash değeri: %1 Digest (SHA-256): %1 Özet (SHA-256): %1 Email: %1 E-posta: %1 DNS: %1 DNS: %1 Issued by: Çıkaran: Unit Name Birim İsmi VoiceRecorder Recorder failed to create directory '%1' Kaydedici '%1' dizinini oluşturamadı Recorder failed to open file '%1' Kaydedici '%1' dosyasını açamadı .wav - Uncompressed .wav - Sıkıştırılmamış .ogg (Vorbis) - Compressed .ogg (Vorbis) - Sıkıştırılmış .au - Uncompressed .au - Sıkıştırılmamış .flac - Lossless compressed .flac - Kayıpsız olarak sıkıştırılmış VoiceRecorderDialog Recorder Kaydedici Control Kontrol 00:00:00 00:00:00 &Start &Başla S&top &Dur Mode Kip Multichannel Çoklu kanal Output Çıktı Output format Çıktı biçimi Target directory Hedef dizin Filename Dosya ismi &Browse... &Tara... Valid variables are: Geçerli değişkenler şunlardır: Inserts the user's name Kullanıcı ismini ekler Inserts the current date Şimdiki tarihi ekler Inserts the current time Şimdiki saati ekler Inserts the hostname Bilgisayar ismini ekler Recorder still running Kaydedici halen çalışıyor Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? Kaydediciyi durdurmadan kapatmak yazılmamış ses kaydını kaybetmenize sebep olur. Kaydediciyi kapatmak istiyor musunuz? Unable to start recording. Not connected to a server. Kaydetme başlatılamadı. Herhangi bir sunucuya bağlı değilsiniz. The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. Şu anda bağlı bulunduğunuz sunucunun sürümü 1.2.2 ya da daha eskisidir. Özel yaşamınızı korumak amacıyla 1.2.3 sürümünden eski sunucularda kayıt mümkün değildir. Daha fazla bilgi için sunucu yöneticisi ile irtibata geçiniz. There is already a recorder active for this server. Bu sunucu için zaten etkin bir kaydedici bulunmaktadır. Please select a recording format. Kaydetme biçimini seçiniz. Stopping Durduruluyor Select target directory Hedef dizini seçiniz Downmix Kanalları azalt WASAPIInput Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone. WASAPISystem Default Device Varsayılan cihaz qwPTTButtonWidget Mumble PTT Mumble Bas ve Konuş Push to talk Tıklayıp konuşun mumble-1.3.4/src/mumble/CoreAudio.cpp0000664000175000017500000004624114010707273017276 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "CoreAudio.h" #include "User.h" #include "Global.h" // Ignore deprecation warnings for the whole file, for now. #pragma GCC diagnostic ignored "-Wdeprecated-declarations" class CoreAudioInputRegistrar : public AudioInputRegistrar { public: CoreAudioInputRegistrar(); virtual AudioInput *create(); virtual const QList getDeviceChoices(); virtual void setDeviceChoice(const QVariant &, Settings &); virtual bool canEcho(const QString &) const; }; class CoreAudioOutputRegistrar : public AudioOutputRegistrar { public: CoreAudioOutputRegistrar(); virtual AudioOutput *create(); virtual const QList getDeviceChoices(); virtual void setDeviceChoice(const QVariant &, Settings &); bool canMuteOthers() const; }; class CoreAudioInit : public DeferInit { CoreAudioInputRegistrar *cairReg; CoreAudioOutputRegistrar *caorReg; public: CoreAudioInit() : cairReg(NULL), caorReg(NULL) {} void initialize(); void destroy(); }; static CoreAudioInit cainit; void CoreAudioInit::initialize() { cairReg = new CoreAudioInputRegistrar(); caorReg = new CoreAudioOutputRegistrar(); } void CoreAudioInit::destroy() { delete cairReg; delete caorReg; } CFStringRef CoreAudioSystem::QStringToCFString(const QString &str) { return CFStringCreateWithCharacters(kCFAllocatorDefault, reinterpret_cast(str.unicode()), str.length()); } const QList CoreAudioSystem::getDeviceChoices(bool input) { QHash qhDevices = CoreAudioSystem::getDevices(input); QList qlReturn; QStringList qlDevices; qhDevices.insert(QString(), tr("Default Device")); qlDevices = qhDevices.keys(); const QString &qsDev = input ? g.s.qsCoreAudioInput : g.s.qsCoreAudioOutput; if (qlDevices.contains(qsDev)) { qlDevices.removeAll(qsDev); qlDevices.prepend(qsDev); } foreach(const QString &qsIdentifier, qlDevices) { qlReturn << audioDevice(qhDevices.value(qsIdentifier), qsIdentifier); } return qlReturn; } const QHash CoreAudioSystem::getDevices(bool input) { QHash qhReturn; UInt32 len, ndevs; OSStatus err; err = AudioHardwareGetPropertyInfo(kAudioHardwarePropertyDevices, &len, NULL); if (err != noErr) return qhReturn; ndevs = len / sizeof(AudioDeviceID); AudioDeviceID devs[ndevs]; err = AudioHardwareGetProperty(kAudioHardwarePropertyDevices, &len, devs); if (err != noErr) return qhReturn; for (UInt32 i = 0; i < ndevs; i++) { QString qsDeviceName; QString qsDeviceIdentifier; char buf[4096]; /* Get number of channels, to determine whether we're an input or an output... */ AudioBufferList *bufs = NULL; err = AudioDeviceGetPropertyInfo(devs[i], 0, input, kAudioDevicePropertyStreamConfiguration, &len, NULL); if (err != noErr) { qWarning("CoreAudioSystem: Failed to get length of AudioStreamConfiguration. Unable to allocate."); continue; } bufs = reinterpret_cast(malloc(len)); err = AudioDeviceGetProperty(devs[i], 0, input, kAudioDevicePropertyStreamConfiguration, &len, bufs); if (! bufs || err != noErr) { qWarning("CoreAudioSystem: Failed to get AudioStreamConfiguration from device."); free(bufs); continue; } UInt32 channels = 0; for (UInt32 j = 0; j < bufs->mNumberBuffers; j++) { channels += bufs->mBuffers[j].mNumberChannels; } free(bufs); if (! channels) continue; /* Get device name. */ len = sizeof(CFStringRef); CFStringRef devName = NULL; err = AudioDeviceGetProperty(devs[i], 0, 0, kAudioDevicePropertyDeviceNameCFString, &len, &devName); if (! devName || err != noErr) { qWarning("CoreAudioSystem: Failed to get device name. Skipping device."); } CFStringGetCString(devName, buf, 4096, kCFStringEncodingUTF8); qsDeviceName = QString::fromUtf8(buf); CFRelease(devName); /* Device UID. */ CFStringRef devUid = NULL; err = AudioDeviceGetProperty(devs[i], 0, 0, kAudioDevicePropertyDeviceUID, &len, &devUid); if (! devUid || err != noErr) { qWarning("CoreAudioSystem: Failed to get device UID. Skipping device."); } CFStringGetCString(devUid, buf, 4096, kCFStringEncodingUTF8); qsDeviceIdentifier = QString::fromUtf8(buf); CFRelease(devUid); qhReturn.insert(qsDeviceIdentifier, qsDeviceName); } return qhReturn; } CoreAudioInputRegistrar::CoreAudioInputRegistrar() : AudioInputRegistrar(QLatin1String("CoreAudio"), 10) { } AudioInput *CoreAudioInputRegistrar::create() { return new CoreAudioInput(); } const QList CoreAudioInputRegistrar::getDeviceChoices() { return CoreAudioSystem::getDeviceChoices(true); } void CoreAudioInputRegistrar::setDeviceChoice(const QVariant &choice, Settings &s) { s.qsCoreAudioInput = choice.toString(); } bool CoreAudioInputRegistrar::canEcho(const QString &outputsys) const { Q_UNUSED(outputsys); return false; } CoreAudioOutputRegistrar::CoreAudioOutputRegistrar() : AudioOutputRegistrar(QLatin1String("CoreAudio"), 10) { } AudioOutput *CoreAudioOutputRegistrar::create() { return new CoreAudioOutput(); } const QList CoreAudioOutputRegistrar::getDeviceChoices() { return CoreAudioSystem::getDeviceChoices(false); } void CoreAudioOutputRegistrar::setDeviceChoice(const QVariant &choice, Settings &s) { s.qsCoreAudioOutput = choice.toString(); } bool CoreAudioOutputRegistrar::canMuteOthers() const { return false; } CoreAudioInput::CoreAudioInput() { OSStatus err; AudioStreamBasicDescription fmt; AudioDeviceID devId = 0; CFStringRef devUid = NULL; UInt32 val, len; memset(&buflist, 0, sizeof(AudioBufferList)); if (! g.s.qsCoreAudioInput.isEmpty()) { qWarning("CoreAudioInput: Set device to '%s'.", qPrintable(g.s.qsCoreAudioInput)); devUid = CoreAudioSystem::QStringToCFString(g.s.qsCoreAudioInput); AudioValueTranslation avt; avt.mInputData = const_cast(&devUid); avt.mInputDataSize = sizeof(CFStringRef *); avt.mOutputData = &devId; avt.mOutputDataSize = sizeof(AudioDeviceID); len = sizeof(AudioValueTranslation); err = AudioHardwareGetProperty(kAudioHardwarePropertyDeviceForUID, &len, &avt); if (err != noErr) { qWarning("CoreAudioInput: Unable to query for AudioDeviceID."); return; } } else { qWarning("CoreAudioInput: Set device to 'Default Device'."); len = sizeof(AudioDeviceID); err = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultInputDevice, &len, &devId); if (err != noErr) { qWarning("CoreAudioInput: Unable to query for default input AudioDeviceID."); return; } len = sizeof(CFStringRef); err = AudioDeviceGetProperty(devId, 0, true, kAudioDevicePropertyDeviceUID, &len, &devUid); if (err != noErr) { qWarning("CoreAudioInput: Unable to get default device UID."); return; } } Component comp; ComponentDescription desc; desc.componentType = kAudioUnitType_Output; desc.componentSubType = kAudioUnitSubType_HALOutput; desc.componentManufacturer = kAudioUnitManufacturer_Apple; desc.componentFlags = 0; desc.componentFlagsMask = 0; comp = FindNextComponent(NULL, &desc); if (comp == NULL) { qWarning("CoreAudioInput: Unable to find AudioUnit."); return; } err = OpenAComponent(comp, &au); if (err != noErr) { qWarning("CoreAudioInput: Unable to open AudioUnit component."); return; } err = AudioUnitInitialize(au); if (err != noErr) { qWarning("CoreAudioInput: Unable to initialize AudioUnit."); return; } val = 1; err = AudioUnitSetProperty(au, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, 1, &val, sizeof(UInt32)); if (err != noErr) { qWarning("CoreAudioInput: Unable to configure input scope on AudioUnit."); return; } val = 0; err = AudioUnitSetProperty(au, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output, 0, &val, sizeof(UInt32)); if (err != noErr) { qWarning("CoreAudioInput: Unable to configure output scope on AudioUnit."); return; } len = sizeof(AudioDeviceID); err = AudioUnitSetProperty(au, kAudioOutputUnitProperty_CurrentDevice, kAudioUnitScope_Global, 0, &devId, len); if (err != noErr) { qWarning("CoreAudioInput: Unable to set device of AudioUnit."); return; } len = sizeof(AudioStreamBasicDescription); err = AudioUnitGetProperty(au, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 1, &fmt, &len); if (err != noErr) { qWarning("CoreAudioInput: Unable to query device for stream info."); return; } if (fmt.mFormatFlags & kAudioFormatFlagIsFloat) { eMicFormat = SampleFloat; } else if (fmt.mFormatFlags & kAudioFormatFlagIsSignedInteger) { eMicFormat = SampleShort; } if (fmt.mChannelsPerFrame > 1) { qWarning("CoreAudioInput: Input device with more than one channel detected. Defaulting to 1."); } iMicFreq = static_cast(fmt.mSampleRate); iMicChannels = 1; initializeMixer(); if (eMicFormat == SampleFloat) { fmt.mFormatFlags = kAudioFormatFlagIsFloat | kAudioFormatFlagIsPacked; fmt.mBitsPerChannel = sizeof(float) * 8; } else if (eMicFormat == SampleShort) { fmt.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked; fmt.mBitsPerChannel = sizeof(short) * 8; } fmt.mFormatID = kAudioFormatLinearPCM; fmt.mSampleRate = iMicFreq; fmt.mChannelsPerFrame = iMicChannels; fmt.mBytesPerFrame = iMicSampleSize; fmt.mBytesPerPacket = iMicSampleSize; fmt.mFramesPerPacket = 1; len = sizeof(AudioStreamBasicDescription); err = AudioUnitSetProperty(au, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &fmt, len); if (err != noErr) { qWarning("CoreAudioInput: Unable to set stream format for output device."); return; } err = AudioUnitAddPropertyListener(au, kAudioUnitProperty_StreamFormat, CoreAudioInput::propertyChange, this); if (err != noErr) { qWarning("CoreAudioInput: Unable to create input property change listener. Unable to listen to property change events."); } AURenderCallbackStruct cb; cb.inputProc = CoreAudioInput::inputCallback; cb.inputProcRefCon = this; len = sizeof(AURenderCallbackStruct); err = AudioUnitSetProperty(au, kAudioOutputUnitProperty_SetInputCallback, kAudioUnitScope_Global, 0, &cb, len); if (err != noErr) { qWarning("CoreAudioInput: Unable to setup callback."); return; } AudioValueRange range; len = sizeof(AudioValueRange); err = AudioDeviceGetProperty(devId, 0, true, kAudioDevicePropertyBufferFrameSizeRange, &len, &range); if (err != noErr) { qWarning("CoreAudioInput: Unable to query for allowed buffer size ranges."); } else { qWarning("CoreAudioInput: BufferFrameSizeRange = (%.2f, %.2f)", range.mMinimum, range.mMaximum); } int iActualBufferLength = iMicLength; val = iMicLength; err = AudioDeviceSetProperty(devId, NULL, 0, true, kAudioDevicePropertyBufferFrameSize, sizeof(UInt32), &val); if (err != noErr) { qWarning("CoreAudioInput: Unable to set preferred buffer size on device. Querying for device default."); len = sizeof(UInt32); err = AudioDeviceGetProperty(devId, 0, true, kAudioDevicePropertyBufferFrameSize, &len, &val); if (err != noErr) { qWarning("CoreAudioInput: Unable to query device for buffer size."); return; } iActualBufferLength = (int) val; } buflist.mNumberBuffers = 1; AudioBuffer *b = buflist.mBuffers; b->mNumberChannels = iMicChannels; b->mDataByteSize = iMicSampleSize * iActualBufferLength; b->mData = calloc(1, b->mDataByteSize); err = AudioOutputUnitStart(au); if (err != noErr) { qWarning("CoreAudioInput: Unable to start AudioUnit."); return; } bRunning = true; }; CoreAudioInput::~CoreAudioInput() { OSStatus err; bRunning = false; wait(); if (au) { err = AudioOutputUnitStop(au); if (err != noErr) { qWarning("CoreAudioInput: Unable to stop AudioUnit."); } } AudioBuffer *b = buflist.mBuffers; if (b && b->mData) free(b->mData); qWarning("CoreAudioInput: Shutting down."); } OSStatus CoreAudioInput::inputCallback(void *udata, AudioUnitRenderActionFlags *flags, const AudioTimeStamp *ts, UInt32 busnum, UInt32 nframes, AudioBufferList *buflist) { Q_UNUSED(udata); Q_UNUSED(buflist); CoreAudioInput *i = reinterpret_cast(udata); OSStatus err; err = AudioUnitRender(i->au, flags, ts, busnum, nframes, &i->buflist); if (err != noErr) { qWarning("CoreAudioInput: AudioUnitRender failed."); return err; } i->addMic(i->buflist.mBuffers->mData, nframes); return noErr; } void CoreAudioInput::propertyChange(void *udata, AudioUnit au, AudioUnitPropertyID prop, AudioUnitScope scope, AudioUnitElement element) { Q_UNUSED(udata); Q_UNUSED(au); Q_UNUSED(scope); Q_UNUSED(element); if (prop == kAudioUnitProperty_StreamFormat) { qWarning("CoreAudioInput: Stream format change detected. Restarting AudioInput."); Audio::stopInput(); Audio::startInput(); } else { qWarning("CoreAudioInput: Unexpected property changed event received."); } } void CoreAudioInput::run() { } CoreAudioOutput::CoreAudioOutput() { OSStatus err; AudioStreamBasicDescription fmt; unsigned int chanmasks[32]; AudioDeviceID devId = 0; CFStringRef devUid = NULL; UInt32 len; if (! g.s.qsCoreAudioOutput.isEmpty()) { devUid = CoreAudioSystem::QStringToCFString(g.s.qsCoreAudioOutput); qWarning("CoreAudioOutput: Set device to '%s'.", qPrintable(g.s.qsCoreAudioOutput)); AudioValueTranslation avt; avt.mInputData = const_cast(&devUid); avt.mInputDataSize = sizeof(CFStringRef *); avt.mOutputData = &devId; avt.mOutputDataSize = sizeof(AudioDeviceID); len = sizeof(AudioValueTranslation); err = AudioHardwareGetProperty(kAudioHardwarePropertyDeviceForUID, &len, &avt); if (err != noErr) { qWarning("CoreAudioOutput: Unable to query for AudioDeviceID."); return; } } else { qWarning("CoreAudioOutput: Set device to 'Default Device'."); len = sizeof(AudioDeviceID); err = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice, &len, &devId); if (err != noErr) { qWarning("CoreAudioOutput: Unable to query for default output AudioDeviceID"); return; } len = sizeof(CFStringRef); err = AudioDeviceGetProperty(devId, 0, false, kAudioDevicePropertyDeviceUID, &len, &devUid); if (err != noErr) { qWarning("CoreAudioOutput: Unable to get default device UID."); return; } } Component comp; ComponentDescription desc; desc.componentType = kAudioUnitType_Output; desc.componentSubType = kAudioUnitSubType_HALOutput; desc.componentManufacturer = kAudioUnitManufacturer_Apple; desc.componentFlags = 0; desc.componentFlagsMask = 0; comp = FindNextComponent(NULL, &desc); if (comp == NULL) { qWarning("CoreAudioOuput: Unable to find AudioUnit."); return; } err = OpenAComponent(comp, &au); if (err != noErr) { qWarning("CoreAudioOutput: Unable to open AudioUnit component."); return; } err = AudioUnitInitialize(au); if (err != noErr) { qWarning("CoreAudioOutput: Unable to initialize output AudioUnit"); return; } len = sizeof(AudioDeviceID); err = AudioUnitSetProperty(au, kAudioOutputUnitProperty_CurrentDevice, kAudioUnitScope_Global, 0, &devId, len); if (err != noErr) { qWarning("CoreAudioOutput: Unable to set CurrentDevice property on AudioUnit."); return; } len = sizeof(AudioStreamBasicDescription); err = AudioUnitGetProperty(au, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 0, &fmt, &len); if (err != noErr) { qWarning("CoreAudioOuptut: Unable to query device for stream info."); return; } iMixerFreq = static_cast(fmt.mSampleRate); iChannels = static_cast(fmt.mChannelsPerFrame); if (fmt.mFormatFlags & kAudioFormatFlagIsFloat) { eSampleFormat = SampleFloat; } else if (fmt.mFormatFlags & kAudioFormatFlagIsSignedInteger) { eSampleFormat = SampleShort; } chanmasks[0] = SPEAKER_FRONT_LEFT; chanmasks[1] = SPEAKER_FRONT_RIGHT; initializeMixer(chanmasks); if (eSampleFormat == SampleFloat) { fmt.mFormatFlags = kAudioFormatFlagIsFloat | kAudioFormatFlagIsPacked; fmt.mBitsPerChannel = sizeof(float) * 8; } else if (eSampleFormat == SampleShort) { fmt.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked; fmt.mBitsPerChannel = sizeof(short) * 8; } fmt.mFormatID = kAudioFormatLinearPCM; fmt.mSampleRate = iMixerFreq; fmt.mChannelsPerFrame = iChannels; fmt.mBytesPerFrame = iSampleSize; fmt.mBytesPerPacket = iSampleSize; fmt.mFramesPerPacket = 1; len = sizeof(AudioStreamBasicDescription); err = AudioUnitSetProperty(au, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &fmt, len); if (err != noErr) { qWarning("CoreAudioOutput: Unable to set stream format for output device."); return; } err = AudioUnitAddPropertyListener(au, kAudioUnitProperty_StreamFormat, CoreAudioOutput::propertyChange, this); if (err != noErr) { qWarning("CoreAudioOutput: Unable to create output property change listener. Unable to listen to property change events."); } AURenderCallbackStruct cb; cb.inputProc = CoreAudioOutput::outputCallback; cb.inputProcRefCon = this; len = sizeof(AURenderCallbackStruct); err = AudioUnitSetProperty(au, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Global, 0, &cb, len); if (err != noErr) { qWarning("CoreAudioOutput: Unable to setup callback."); return; } AudioValueRange range; len = sizeof(AudioValueRange); err = AudioDeviceGetProperty(devId, 0, false, kAudioDevicePropertyBufferFrameSizeRange, &len, &range); if (err != noErr) { qWarning("CoreAudioOutput: Unable to query for allowed buffer size ranges."); } else { qWarning("CoreAudioOutput: BufferFrameSizeRange = (%.2f, %.2f)", range.mMinimum, range.mMaximum); } UInt32 val = (iFrameSize * iMixerFreq) / SAMPLE_RATE; err = AudioDeviceSetProperty(devId, NULL, 0, false, kAudioDevicePropertyBufferFrameSize, sizeof(UInt32), &val); if (err != noErr) { qWarning("CoreAudioOutput: Could not set requested buffer size for device. Continuing with default."); } err = AudioOutputUnitStart(au); if (err != noErr) { qWarning("CoreAudioOutput: Unable to start AudioUnit"); return; } bRunning = true; } CoreAudioOutput::~CoreAudioOutput() { OSStatus err; bRunning = false; wait(); if (au) { err = AudioOutputUnitStop(au); if (err != noErr) { qWarning("CoreAudioOutput: Unable to stop AudioUnit."); } } qWarning("CoreAudioOutput: Shutting down."); } OSStatus CoreAudioOutput::outputCallback(void *udata, AudioUnitRenderActionFlags *flags, const AudioTimeStamp *ts, UInt32 busnum, UInt32 nframes, AudioBufferList *buflist) { Q_UNUSED(flags); Q_UNUSED(ts); Q_UNUSED(busnum); CoreAudioOutput *o = reinterpret_cast(udata); AudioBuffer *buf = buflist->mBuffers; bool done = o->mix(buf->mData, nframes); if (! done) { buf->mDataByteSize = 0; return -1; } return noErr; } void CoreAudioOutput::propertyChange(void *udata, AudioUnit au, AudioUnitPropertyID prop, AudioUnitScope scope, AudioUnitElement element) { Q_UNUSED(udata); Q_UNUSED(au); Q_UNUSED(scope); Q_UNUSED(element); if (prop == kAudioUnitProperty_StreamFormat) { qWarning("CoreAudioOuptut: Stream format change detected. Restarting AudioOutput."); Audio::stopOutput(); Audio::startOutput(); } else { qWarning("CoreAudioOutput: Unexpected property changed event received."); } } void CoreAudioOutput::run() { } mumble-1.3.4/src/mumble/VoiceRecorder.cpp0000664000175000017500000003323614010707274020160 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "VoiceRecorder.h" #include "AudioOutput.h" #include "ClientUser.h" #include "ServerHandler.h" #include "../Timer.h" // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" VoiceRecorder::RecordBuffer::RecordBuffer( int recordInfoIndex_, boost::shared_array buffer_, int samples_, quint64 absoluteStartSample_) : recordInfoIndex(recordInfoIndex_) , buffer(buffer_) , samples(samples_) , absoluteStartSample(absoluteStartSample_) { // Nothing } VoiceRecorder::RecordInfo::RecordInfo(const QString& userName_) : userName(userName_) , soundFile(NULL) , lastWrittenAbsoluteSample(0) { } VoiceRecorder::RecordInfo::~RecordInfo() { if (soundFile) { // Close libsndfile's handle if we have one. sf_close(soundFile); } } VoiceRecorder::VoiceRecorder(QObject *p, const Config& config) : QThread(p) , m_recordUser(new RecordUser()) , m_timestamp(new Timer()) , m_config(config) , m_recording(false) , m_abort(false) , m_recordingStartTime(QDateTime::currentDateTime()) , m_absoluteSampleEstimation(0) { // Nothing } VoiceRecorder::~VoiceRecorder() { stop(); wait(); } QString VoiceRecorder::sanitizeFilenameOrPathComponent(const QString &str) const { // Trim leading/trailing whitespaces QString res = str.trimmed(); if (res.isEmpty()) return QLatin1String("_"); #ifdef Q_OS_WIN // Rules according to http://en.wikipedia.org/wiki/Filename#Comparison_of_file_name_limitations // and http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx // Make sure name doesn't end in "." if (res.at(res.length() - 1) == QLatin1Char('.')) { if (res.length() == 255) { // Prevents possible infinite recursion later on res[254] = QLatin1Char('_'); } else { res = res.append(QLatin1Char('_')); } } // Replace < > : " / \ | ? * as well as chr(0) to chr(31) res = res.replace(QRegExp(QLatin1String("[<>:\"/\\\\|\\?\\*\\x00-\\x1F]")), QLatin1String("_")); // Prepend reserved filenames CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, and LPT9 res = res.replace(QRegExp(QLatin1String("^((CON|PRN|AUX|NUL|COM[1-9]|LPT1[1-9])(\\.|$))"), Qt::CaseInsensitive), QLatin1String("_\\1")); // Make sure we do not exceed 255 characters if (res.length() > 255) { res.truncate(255); // Call ourselves recursively to make sure we do not end up violating any of our rules because of this res = sanitizeFilenameOrPathComponent(res); } #else // For the rest just make sure the string doesn't contain a \0 or any forward-slashes res = res.replace(QRegExp(QLatin1String("\\x00|/")), QLatin1String("_")); #endif return res; } QString VoiceRecorder::expandTemplateVariables(const QString &path, const QString& userName) const { // Split path into components QString res; QStringList comp = path.split(QLatin1Char('/')); Q_ASSERT(!comp.isEmpty()); // Create a readable representation of the start date. QString date(m_recordingStartTime.date().toString(Qt::ISODate)); QString time(m_recordingStartTime.time().toString(QLatin1String("hh-mm-ss"))); QString hostname(QLatin1String("Unknown")); if (g.sh && g.uiSession != 0) { unsigned short port; QString uname, pw; g.sh->getConnectionInfo(hostname, port, uname, pw); } // Create hash which stores the names of the variables with the corresponding values. // Valid variables are: // %user Inserts the users name // %date Inserts the current date // %time Inserts the current time // %host Inserts the hostname QHash vars; vars.insert(QLatin1String("user"), userName); vars.insert(QLatin1String("date"), date); vars.insert(QLatin1String("time"), time); vars.insert(QLatin1String("host"), hostname); // Reassemble and expand bool first = true; foreach(QString str, comp) { bool replacements = false; QString tmp; tmp.reserve(str.length() * 2); for (int i = 0; i < str.size(); ++i) { bool replaced = false; if (str[i] == QLatin1Char('%')) { QHashIterator it(vars); while (it.hasNext()) { it.next(); if (str.midRef(i + 1, it.key().length()) == it.key()) { i += it.key().length(); tmp += it.value(); replaced = true; replacements = true; break; } } } if (!replaced) tmp += str[i]; } str = tmp; if (replacements) str = sanitizeFilenameOrPathComponent(str); if (first) { first = false; res.append(str); } else { res.append(QLatin1Char('/') + str); } } return res; } int VoiceRecorder::indexForUser(const ClientUser *clientUser) const { Q_ASSERT(!m_config.mixDownMode || clientUser == NULL); return (m_config.mixDownMode) ? 0 : clientUser->uiSession; } SF_INFO VoiceRecorder::createSoundFileInfo() const { Q_ASSERT(m_config.sampleRate != 0); // When adding new formats make sure to properly configure needed additional // behavior after opening the file handle (e.g. to enable clipping). // Convert |fmFormat| to a SF_INFO structure for libsndfile. SF_INFO sfinfo; switch (m_config.recordingFormat) { case VoiceRecorderFormat::WAV: default: sfinfo.frames = 0; sfinfo.samplerate = m_config.sampleRate; sfinfo.channels = 1; sfinfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM_24; sfinfo.sections = 0; sfinfo.seekable = 0; qWarning() << "VoiceRecorder: recording started to" << m_config.fileName << "@" << m_config.sampleRate << "hz in WAV format"; break; #ifndef NO_VORBIS_RECORDING case VoiceRecorderFormat::VORBIS: sfinfo.frames = 0; sfinfo.samplerate = m_config.sampleRate; sfinfo.channels = 1; sfinfo.format = SF_FORMAT_OGG | SF_FORMAT_VORBIS; sfinfo.sections = 0; sfinfo.seekable = 0; qWarning() << "VoiceRecorder: recording started to" << m_config.fileName << "@" << m_config.sampleRate << "hz in OGG/Vorbis format"; break; #endif case VoiceRecorderFormat::AU: sfinfo.frames = 0; sfinfo.samplerate = m_config.sampleRate; sfinfo.channels = 1; sfinfo.format = SF_ENDIAN_CPU | SF_FORMAT_AU | SF_FORMAT_FLOAT; sfinfo.sections = 0; sfinfo.seekable = 0; qWarning() << "VoiceRecorder: recording started to" << m_config.fileName << "@" << m_config.sampleRate << "hz in AU format"; break; case VoiceRecorderFormat::FLAC: sfinfo.frames = 0; sfinfo.samplerate = m_config.sampleRate; sfinfo.channels = 1; sfinfo.format = SF_FORMAT_FLAC | SF_FORMAT_PCM_24; sfinfo.sections = 0; sfinfo.seekable = 0; qWarning() << "VoiceRecorder: recording started to" << m_config.fileName << "@" << m_config.sampleRate << "hz in FLAC format"; break; } Q_ASSERT(sf_format_check(&sfinfo)); return sfinfo; } bool VoiceRecorder::ensureFileIsOpenedFor(SF_INFO& soundFileInfo, boost::shared_ptr& ri) { if (ri->soundFile != NULL) { // Nothing to do return true; } QString filename = expandTemplateVariables(m_config.fileName, ri->userName); // Try to find a unique filename. { int cnt = 1; QString nf(filename); QFileInfo tfi(filename); while (QFile::exists(nf)) { nf = tfi.path() + QLatin1Char('/') + tfi.completeBaseName() + QString(QLatin1String(" (%1).")).arg(cnt) + tfi.suffix(); ++cnt; } filename = nf; } qWarning() << "Recorder opens file" << filename; QFileInfo fi(filename); // Create the target path. if (!QDir().mkpath(fi.absolutePath())) { qWarning() << "Failed to create target directory: " << fi.absolutePath(); m_recording = false; emit error(CreateDirectoryFailed, tr("Recorder failed to create directory '%1'").arg(fi.absolutePath())); emit recording_stopped(); return false; } #ifdef Q_OS_WIN // This is needed for unicode filenames on Windows. ri->soundFile = sf_wchar_open(filename.toStdWString().c_str(), SFM_WRITE, &soundFileInfo); #else ri->soundFile = sf_open(qPrintable(filename), SFM_WRITE, &soundFileInfo); #endif if (ri->soundFile == NULL) { qWarning() << "Failed to open file for recorder: "<< sf_strerror(NULL); m_recording = false; emit error(CreateFileFailed, tr("Recorder failed to open file '%1'").arg(filename)); emit recording_stopped(); return false; } // Store the username in the title attribute of the file (if supported by the format). sf_set_string(ri->soundFile, SF_STR_TITLE, qPrintable(ri->userName)); // Enable hard-clipping for non-float formats to prevent wrapping if ((soundFileInfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_FLOAT && (soundFileInfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_VORBIS) { sf_command(ri->soundFile, SFC_SET_CLIPPING, NULL, SF_TRUE); } return true; } void VoiceRecorder::run() { Q_ASSERT(!m_recording); if (g.sh && g.sh->uiVersion < 0x010203) return; SF_INFO soundFileInfo = createSoundFileInfo(); m_recording = true; emit recording_started(); forever { // Sleep until there is new data for us to process. m_sleepLock.lock(); m_sleepCondition.wait(&m_sleepLock); if (!m_recording || m_abort || (g.sh && g.sh->uiVersion < 0x010203)) { m_sleepLock.unlock(); break; } while (!m_abort && !m_recordBuffer.isEmpty()) { boost::shared_ptr rb; { QMutexLocker l(&m_bufferLock); rb = m_recordBuffer.takeFirst(); } // Create the file for this RecordInfo instance if it's not yet open. Q_ASSERT(m_recordInfo.contains(rb->recordInfoIndex)); boost::shared_ptr ri = m_recordInfo.value(rb->recordInfoIndex); if (!ensureFileIsOpenedFor(soundFileInfo, ri)) { return; } const qint64 missingSamples = rb->absoluteStartSample - ri->lastWrittenAbsoluteSample; static const qint64 heuristicSilenceThreshold = m_config.sampleRate / 10; // 100ms if (missingSamples > heuristicSilenceThreshold) { static const qint64 maxSamplesPerIteration = m_config.sampleRate * 1; // 1s const bool requeue = missingSamples > maxSamplesPerIteration; // Write |missingSamples| samples of silence up to |maxSamplesPerIteration| const float buffer[1024] = {}; const qint64 silenceToWrite = std::min(missingSamples, maxSamplesPerIteration); qint64 rest = silenceToWrite; for (; rest > 1024; rest -= 1024) sf_write_float(ri->soundFile, buffer, 1024); if (rest > 0) sf_write_float(ri->soundFile, buffer, rest); ri->lastWrittenAbsoluteSample += silenceToWrite; if (requeue) { // Requeue the writing for this buffer to keep thread responsive QMutexLocker l(&m_bufferLock); m_recordBuffer.prepend(rb); continue; } } // Write the audio buffer and update the timestamp in |ri|. sf_write_float(ri->soundFile, rb->buffer.get(), rb->samples); ri->lastWrittenAbsoluteSample += rb->samples; } m_sleepLock.unlock(); } m_recording = false; { QMutexLocker l(&m_bufferLock); m_recordInfo.clear(); m_recordBuffer.clear(); } emit recording_stopped(); qWarning() << "VoiceRecorder: recording stopped"; } void VoiceRecorder::stop(bool force) { // Tell the main loop to terminate and wake up the sleep lock. m_recording = false; m_abort = force; m_sleepCondition.wakeAll(); } void VoiceRecorder::prepareBufferAdds() { // Should be ms accurat m_absoluteSampleEstimation = (m_timestamp->elapsed() / 1000) * (m_config.sampleRate / 1000); } void VoiceRecorder::addBuffer(const ClientUser *clientUser, boost::shared_array buffer, int samples) { Q_ASSERT(!m_config.mixDownMode || clientUser == NULL); if (!m_recording) return; // Create a new RecordInfo object if this is a new user. const int index = indexForUser(clientUser); if (!m_recordInfo.contains(index)) { boost::shared_ptr ri = boost::make_shared( m_config.mixDownMode ? QLatin1String("Mixdown") : clientUser->qsName); m_recordInfo.insert(index, ri); } { // Save the buffer in |qlRecordBuffer|. QMutexLocker l(&m_bufferLock); boost::shared_ptr rb = boost::make_shared( index, buffer, samples, m_absoluteSampleEstimation); m_recordBuffer << rb; } // Tell the main loop that we have new audio data. m_sleepCondition.wakeAll(); } quint64 VoiceRecorder::getElapsedTime() const { return m_timestamp->elapsed(); } RecordUser &VoiceRecorder::getRecordUser() const { return *m_recordUser; } bool VoiceRecorder::isInMixDownMode() const { return m_config.mixDownMode; } QString VoiceRecorderFormat::getFormatDescription(VoiceRecorderFormat::Format fm) { switch (fm) { case VoiceRecorderFormat::WAV: return VoiceRecorder::tr(".wav - Uncompressed"); #ifndef NO_VORBIS_RECORDING case VoiceRecorderFormat::VORBIS: return VoiceRecorder::tr(".ogg (Vorbis) - Compressed"); #endif case VoiceRecorderFormat::AU: return VoiceRecorder::tr(".au - Uncompressed"); case VoiceRecorderFormat::FLAC: return VoiceRecorder::tr(".flac - Lossless compressed"); default: return QString(); } } QString VoiceRecorderFormat::getFormatDefaultExtension(VoiceRecorderFormat::Format fm) { switch (fm) { case VoiceRecorderFormat::WAV: return QLatin1String("wav"); #ifndef NO_VORBIS_RECORDING case VoiceRecorderFormat::VORBIS: return QLatin1String("ogg"); #endif case VoiceRecorderFormat::AU: return QLatin1String("au"); case VoiceRecorderFormat::FLAC: return QLatin1String("flac"); default: return QString(); } } mumble-1.3.4/src/mumble/Overlay_unix.cpp0000664000175000017500000000130114010707273020074 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "Overlay.h" #include "OverlayConfig.h" void Overlay::platformInit() { d = NULL; } void Overlay::setActiveInternal(bool) { } bool OverlayConfig::supportsInstallableOverlay() { return false; } bool OverlayConfig::isInstalled() { return true; } bool OverlayConfig::needsUpgrade() { return false; } bool OverlayConfig::installFiles() { return false; } bool OverlayConfig::uninstallFiles() { return false; } mumble-1.3.4/src/mumble/TextToSpeech_unix.cpp0000664000175000017500000000567414010707273021053 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "TextToSpeech.h" #ifdef USE_SPEECHD # ifdef USE_SPEECHD_PKGCONFIG # include # else # include # endif #endif #include "Global.h" class TextToSpeechPrivate { #ifdef USE_SPEECHD protected: SPDConnection *spd; /// Used to store the requested volume of the TextToSpeech object /// before speech-dispatcher has been initialized. int volume; bool initialized; void ensureInitialized(); #endif public: TextToSpeechPrivate(); ~TextToSpeechPrivate(); void say(const QString &text); void setVolume(int v); }; #ifdef USE_SPEECHD TextToSpeechPrivate::TextToSpeechPrivate() { initialized = false; volume = -1; spd = NULL; } TextToSpeechPrivate::~TextToSpeechPrivate() { if (spd) { spd_close(spd); spd = NULL; } } void TextToSpeechPrivate::ensureInitialized() { if (initialized) { return; } spd = spd_open("Mumble", NULL, NULL, SPD_MODE_THREADED); if (! spd) { qWarning("TextToSpeech: Failed to contact speech dispatcher."); } else { QString lang; if (!g.s.qsTTSLanguage.isEmpty()) { lang = g.s.qsTTSLanguage; } else if (!g.s.qsLanguage.isEmpty()) { QLocale locale(g.s.qsLanguage); lang = locale.bcp47Name(); } else { QLocale systemLocale; lang = systemLocale.bcp47Name(); } if (!lang.isEmpty()) { if (spd_set_language(spd, lang.toLocal8Bit().constData()) != 0) { qWarning("TextToSpeech: Failed to set language."); } } if (spd_set_punctuation(spd, SPD_PUNCT_NONE) != 0) qWarning("TextToSpech: Failed to set punctuation mode."); if (spd_set_spelling(spd, SPD_SPELL_ON) != 0) qWarning("TextToSpeech: Failed to set spelling mode."); } initialized = true; if (volume != -1) { setVolume(volume); } } void TextToSpeechPrivate::say(const QString &txt) { ensureInitialized(); if (spd) spd_say(spd, SPD_MESSAGE, txt.toUtf8()); } void TextToSpeechPrivate::setVolume(int vol) { if (!initialized) { volume = vol; return; } if (spd) spd_set_volume(spd, vol * 2 - 100); } #else TextToSpeechPrivate::TextToSpeechPrivate() { qWarning("TextToSpeech: Compiled without support for speech-dispatcher"); } TextToSpeechPrivate::~TextToSpeechPrivate() { } void TextToSpeechPrivate::say(const QString &) { } void TextToSpeechPrivate::setVolume(int) { } #endif TextToSpeech::TextToSpeech(QObject *p) : QObject(p) { enabled = true; d = new TextToSpeechPrivate(); } TextToSpeech::~TextToSpeech() { delete d; } void TextToSpeech::say(const QString &text) { if (enabled) d->say(text); } void TextToSpeech::setEnabled(bool e) { enabled = e; } void TextToSpeech::setVolume(int volume) { d->setVolume(volume); } bool TextToSpeech::isEnabled() const { return enabled; } mumble-1.3.4/src/mumble/GlobalShortcut_unix.cpp0000664000175000017500000002252314010707273021420 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "GlobalShortcut_unix.h" #include "Global.h" #include "Settings.h" // We have to use a global 'diagnostic ignored' pragmas because // we still support old versions of GCC. (FreeBSD 9.3 ships with GCC 4.2) #if defined (__GNUC__) // ScreenCount(...) and so on are macros that access the private structure and // cast their return value using old-style-casts. Hence we suppress these warnings // for this section of code. # pragma GCC diagnostic ignored "-Wold-style-cast" // XKeycodeToKeysym is deprecated. // For backwards compatibility reasons we want to keep using the // old function as long as possible. The replacement function // XkbKeycodeToKeysym requires the XKB extension which isn't // guaranteed to be present. # pragma GCC diagnostic ignored "-Wdeprecated-declarations" #endif /** * Returns a platform specific GlobalShortcutEngine object. * * @see GlobalShortcutX * @see GlobalShortcutMac * @see GlobalShortcutWin */ GlobalShortcutEngine *GlobalShortcutEngine::platformInit() { return new GlobalShortcutX(); } GlobalShortcutX::GlobalShortcutX() { iXIopcode = -1; bRunning = false; display = XOpenDisplay(NULL); if (! display) { qWarning("GlobalShortcutX: Unable to open dedicated display connection."); return; } #ifdef Q_OS_LINUX if (g.s.bEnableEvdev) { QString dir = QLatin1String("/dev/input"); QFileSystemWatcher *fsw = new QFileSystemWatcher(QStringList(dir), this); connect(fsw, SIGNAL(directoryChanged(const QString &)), this, SLOT(directoryChanged(const QString &))); directoryChanged(dir); if (qsKeyboards.isEmpty()) { foreach(QFile *f, qmInputDevices) delete f; qmInputDevices.clear(); delete fsw; qWarning("GlobalShortcutX: Unable to open any keyboard input devices under /dev/input, falling back to XInput"); } else { return; } } #endif for (int i=0; i < ScreenCount(display); ++i) qsRootWindows.insert(RootWindow(display, i)); #ifndef NO_XINPUT2 int evt, error; if (g.s.bEnableXInput2 && XQueryExtension(display, "XInputExtension", &iXIopcode, &evt, &error)) { int major = XI_2_Major; int minor = XI_2_Minor; int rc = XIQueryVersion(display, &major, &minor); if (rc != BadRequest) { qWarning("GlobalShortcutX: Using XI2 %d.%d", major, minor); queryXIMasterList(); XIEventMask evmask; unsigned char mask[(XI_LASTEVENT + 7)/8]; memset(&evmask, 0, sizeof(evmask)); memset(mask, 0, sizeof(mask)); XISetMask(mask, XI_RawButtonPress); XISetMask(mask, XI_RawButtonRelease); XISetMask(mask, XI_RawKeyPress); XISetMask(mask, XI_RawKeyRelease); XISetMask(mask, XI_HierarchyChanged); evmask.deviceid = XIAllDevices; evmask.mask_len = sizeof(mask); evmask.mask = mask; foreach(Window w, qsRootWindows) XISelectEvents(display, w, &evmask, 1); XFlush(display); connect(new QSocketNotifier(ConnectionNumber(display), QSocketNotifier::Read, this), SIGNAL(activated(int)), this, SLOT(displayReadyRead(int))); return; } } #endif qWarning("GlobalShortcutX: No XInput support, falling back to polled input. This wastes a lot of CPU resources, so please enable one of the other methods."); bRunning=true; start(QThread::TimeCriticalPriority); } GlobalShortcutX::~GlobalShortcutX() { bRunning = false; wait(); if (display) XCloseDisplay(display); } // Tight loop polling void GlobalShortcutX::run() { Window root = XDefaultRootWindow(display); Window root_ret, child_ret; int root_x, root_y; int win_x, win_y; unsigned int mask[2]; int idx = 0; int next = 0; char keys[2][32]; memset(keys[0], 0, 32); memset(keys[1], 0, 32); mask[0] = mask[1] = 0; while (bRunning) { if (bNeedRemap) remap(); msleep(10); idx = next; next = idx ^ 1; if (XQueryPointer(display, root, &root_ret, &child_ret, &root_x, &root_y, &win_x, &win_y, &mask[next]) && XQueryKeymap(display, keys[next])) { for (int i=0;i<256;++i) { int index = i / 8; int keymask = 1 << (i % 8); bool oldstate = (keys[idx][index] & keymask) != 0; bool newstate = (keys[next][index] & keymask) != 0; if (oldstate != newstate) { handleButton(i, newstate); } } for (int i=8;i<=12;++i) { bool oldstate = (mask[idx] & (1 << i)) != 0; bool newstate = (mask[next] & (1 << i)) != 0; if (oldstate != newstate) { handleButton(0x110 + i, newstate); } } } } } // Find XI2 master devices so they can be ignored. void GlobalShortcutX::queryXIMasterList() { #ifndef NO_XINPUT2 XIDeviceInfo *info, *dev; int ndevices; qsMasterDevices.clear(); dev = info = XIQueryDevice(display, XIAllDevices, &ndevices); for (int i=0;iuse) { case XIMasterPointer: case XIMasterKeyboard: qsMasterDevices.insert(dev->deviceid); break; default: break; } ++dev; } XIFreeDeviceInfo(info); #endif } // XInput2 event is ready on socketnotifier. void GlobalShortcutX::displayReadyRead(int) { #ifndef NO_XINPUT2 XEvent evt; if (bNeedRemap) remap(); while (XPending(display)) { XNextEvent(display, &evt); XGenericEventCookie *cookie = & evt.xcookie; if ((cookie->type != GenericEvent) || (cookie->extension != iXIopcode) || !XGetEventData(display, cookie)) continue; XIDeviceEvent *xide = reinterpret_cast(cookie->data); switch (cookie->evtype) { case XI_RawKeyPress: case XI_RawKeyRelease: if (! qsMasterDevices.contains(xide->deviceid)) handleButton(xide->detail, cookie->evtype == XI_RawKeyPress); break; case XI_RawButtonPress: case XI_RawButtonRelease: if (! qsMasterDevices.contains(xide->deviceid)) handleButton(xide->detail + 0x117, cookie->evtype == XI_RawButtonPress); break; case XI_HierarchyChanged: queryXIMasterList(); } XFreeEventData(display, cookie); } #endif } // One of the raw /dev/input devices has ready input void GlobalShortcutX::inputReadyRead(int) { #ifdef Q_OS_LINUX if (!g.s.bEnableEvdev) { return; } struct input_event ev; if (bNeedRemap) remap(); QFile *f=qobject_cast(sender()->parent()); if (!f) return; bool found = false; while (f->read(reinterpret_cast(&ev), sizeof(ev)) == sizeof(ev)) { found = true; if (ev.type != EV_KEY) continue; bool down; switch (ev.value) { case 0: down = false; break; case 1: down = true; break; default: continue; } int evtcode = ev.code + 8; handleButton(evtcode, down); } if (! found) { int fd = f->handle(); int version = 0; if ((ioctl(fd, EVIOCGVERSION, &version) < 0) || (((version >> 16) & 0xFF) < 1)) { qWarning("GlobalShortcutX: Removing dead input device %s", qPrintable(f->fileName())); qmInputDevices.remove(f->fileName()); qsKeyboards.remove(f->fileName()); delete f; } } #endif } #define test_bit(bit, array) (array[bit/8] & (1<<(bit%8))) // The /dev/input directory changed void GlobalShortcutX::directoryChanged(const QString &dir) { #ifdef Q_OS_LINUX if (!g.s.bEnableEvdev) { return; } QDir d(dir, QLatin1String("event*"), 0, QDir::System); foreach(QFileInfo fi, d.entryInfoList()) { QString path = fi.absoluteFilePath(); if (! qmInputDevices.contains(path)) { QFile *f = new QFile(path, this); if (f->open(QIODevice::ReadOnly)) { int fd = f->handle(); int version; char name[256]; uint8_t events[EV_MAX/8 + 1]; memset(events, 0, sizeof(events)); if ((ioctl(fd, EVIOCGVERSION, &version) >= 0) && (ioctl(fd, EVIOCGNAME(sizeof(name)), name)>=0) && (ioctl(fd, EVIOCGBIT(0,sizeof(events)), &events) >= 0) && test_bit(EV_KEY, events) && (((version >> 16) & 0xFF) > 0)) { name[255]=0; qWarning("GlobalShortcutX: %s: %s", qPrintable(f->fileName()), name); // Is it grabbed by someone else? if ((ioctl(fd, EVIOCGRAB, 1) < 0)) { qWarning("GlobalShortcutX: Device exclusively grabbed by someone else (X11 using exclusive-mode evdev?)"); delete f; } else { ioctl(fd, EVIOCGRAB, 0); uint8_t keys[KEY_MAX/8 + 1]; if ((ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(keys)), &keys) >= 0) && test_bit(KEY_SPACE, keys)) qsKeyboards.insert(f->fileName()); fcntl(f->handle(), F_SETFL, O_NONBLOCK); connect(new QSocketNotifier(f->handle(), QSocketNotifier::Read, f), SIGNAL(activated(int)), this, SLOT(inputReadyRead(int))); qmInputDevices.insert(f->fileName(), f); } } else { delete f; } } else { delete f; } } } #else Q_UNUSED(dir); #endif } QString GlobalShortcutX::buttonName(const QVariant &v) { bool ok; unsigned int key=v.toUInt(&ok); if (!ok) return QString(); if ((key < 0x118) || (key >= 0x128)) { // For backwards compatibility reasons we want to keep using the // old function as long as possible. The replacement function // XkbKeycodeToKeysym requires the XKB extension which isn't // guaranteed to be present. KeySym ks=XKeycodeToKeysym(display, static_cast(key), 0); if (ks == NoSymbol) { return QLatin1String("0x")+QString::number(key,16); } else { const char *str=XKeysymToString(ks); if (*str == '\0') { return QLatin1String("KS0x")+QString::number(ks, 16); } else { return QLatin1String(str); } } } else { return tr("Mouse %1").arg(key-0x118); } } mumble-1.3.4/src/mumble/AudioOutputSpeech.cpp0000664000175000017500000002607014010707273021034 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "AudioOutputSpeech.h" #include "Audio.h" #include "CELTCodec.h" #include "OpusCodec.h" #include "ClientUser.h" #include "Global.h" #include "PacketDataStream.h" AudioOutputSpeech::AudioOutputSpeech(ClientUser *user, unsigned int freq, MessageHandler::UDPMessageType type) : AudioOutputUser(user->qsName) { int err; p = user; umtType = type; iMixerFreq = freq; cCodec = NULL; cdDecoder = NULL; dsSpeex = NULL; oCodec = NULL; opusState = NULL; bHasTerminator = false; bStereo = false; iSampleRate = SAMPLE_RATE; iFrameSize = iSampleRate / 100; iAudioBufferSize = iFrameSize; if (umtType == MessageHandler::UDPVoiceOpus) { #ifdef USE_OPUS oCodec = g.oCodec; if (oCodec) { iAudioBufferSize *= 12; opusState = oCodec->opus_decoder_create(iSampleRate, bStereo ? 2 : 1, NULL); } #endif } else if (umtType == MessageHandler::UDPVoiceSpeex) { speex_bits_init(&sbBits); dsSpeex = speex_decoder_init(speex_lib_get_mode(SPEEX_MODEID_UWB)); int iArg=1; speex_decoder_ctl(dsSpeex, SPEEX_SET_ENH, &iArg); speex_decoder_ctl(dsSpeex, SPEEX_GET_FRAME_SIZE, &iFrameSize); speex_decoder_ctl(dsSpeex, SPEEX_GET_SAMPLING_RATE, &iSampleRate); iAudioBufferSize = iFrameSize; } iOutputSize = static_cast(ceilf(static_cast(iAudioBufferSize * iMixerFreq) / static_cast(iSampleRate))); if (bStereo) { iAudioBufferSize *= 2; iOutputSize *= 2; } srs = NULL; fResamplerBuffer = NULL; if (iMixerFreq != iSampleRate) { srs = speex_resampler_init(bStereo ? 2 : 1, iSampleRate, iMixerFreq, 3, &err); fResamplerBuffer = new float[iAudioBufferSize]; } iBufferOffset = iBufferFilled = iLastConsume = 0; bLastAlive = true; iMissCount = 0; iMissedFrames = 0; ucFlags = 0xFF; jbJitter = jitter_buffer_init(iFrameSize); int margin = g.s.iJitterBufferSize * iFrameSize; jitter_buffer_ctl(jbJitter, JITTER_BUFFER_SET_MARGIN, &margin); fFadeIn = new float[iFrameSize]; fFadeOut = new float[iFrameSize]; float mul = static_cast(M_PI / (2.0 * static_cast(iFrameSize))); for (unsigned int i=0;i(i) * mul); } AudioOutputSpeech::~AudioOutputSpeech() { #ifdef USE_OPUS if (opusState) oCodec->opus_decoder_destroy(opusState); #endif if (cdDecoder) { cCodec->celt_decoder_destroy(cdDecoder); } else if (dsSpeex) { speex_bits_destroy(&sbBits); speex_decoder_destroy(dsSpeex); } if (srs) speex_resampler_destroy(srs); jitter_buffer_destroy(jbJitter); delete [] fFadeIn; delete [] fFadeOut; delete [] fResamplerBuffer; } void AudioOutputSpeech::addFrameToBuffer(const QByteArray &qbaPacket, unsigned int iSeq) { QMutexLocker lock(&qmJitter); if (qbaPacket.size() < 2) return; PacketDataStream pds(qbaPacket); // skip flags pds.next(); int samples = 0; if (umtType == MessageHandler::UDPVoiceOpus) { int size; pds >> size; size &= 0x1fff; if (size == 0) { return; } const QByteArray &qba = pds.dataBlock(size); if (size != qba.size() || !pds.isValid()) { return; } const unsigned char *packet = reinterpret_cast(qba.constData()); #ifdef USE_OPUS if (oCodec) { int frames = oCodec->opus_packet_get_nb_frames(packet, size); samples = frames * oCodec->opus_packet_get_samples_per_frame(packet, SAMPLE_RATE); } #else return; #endif // We can't handle frames which are not a multiple of 10ms. Q_ASSERT(samples % iFrameSize == 0); } else { unsigned int header = 0; do { header = static_cast(pds.next()); samples += iFrameSize; pds.skip(header & 0x7f); } while ((header & 0x80) && pds.isValid()); } if (pds.isValid()) { JitterBufferPacket jbp; jbp.data = const_cast(qbaPacket.constData()); jbp.len = qbaPacket.size(); jbp.span = samples; jbp.timestamp = iFrameSize * iSeq; jitter_buffer_put(jbJitter, &jbp); } } bool AudioOutputSpeech::needSamples(unsigned int snum) { for (unsigned int i=iLastConsume;i= snum) return bLastAlive; float *pOut; bool nextalive = bLastAlive; while (iBufferFilled < snum) { int decodedSamples = iFrameSize; resizeBuffer(iBufferFilled + iOutputSize); pOut = (srs) ? fResamplerBuffer : (pfBuffer + iBufferFilled); if (! bLastAlive) { memset(pOut, 0, iFrameSize * sizeof(float)); } else { if (p == &LoopUser::lpLoopy) { LoopUser::lpLoopy.fetchFrames(); } int avail = 0; int ts = jitter_buffer_get_pointer_timestamp(jbJitter); jitter_buffer_ctl(jbJitter, JITTER_BUFFER_GET_AVAILABLE_COUNT, &avail); if (p && (ts == 0)) { int want = iroundf(p->fAverageAvailable); if (avail < want) { ++iMissCount; if (iMissCount < 20) { memset(pOut, 0, iFrameSize * sizeof(float)); goto nextframe; } } } if (qlFrames.isEmpty()) { QMutexLocker lock(&qmJitter); char data[4096]; JitterBufferPacket jbp; jbp.data = data; jbp.len = 4096; spx_int32_t startofs = 0; if (jitter_buffer_get(jbJitter, &jbp, iFrameSize, &startofs) == JITTER_BUFFER_OK) { PacketDataStream pds(jbp.data, jbp.len); iMissCount = 0; ucFlags = static_cast(pds.next()); bHasTerminator = false; if (umtType == MessageHandler::UDPVoiceOpus) { int size; pds >> size; bHasTerminator = size & 0x2000; qlFrames << pds.dataBlock(size & 0x1fff); } else { unsigned int header = 0; do { header = static_cast(pds.next()); if (header) qlFrames << pds.dataBlock(header & 0x7f); else bHasTerminator = true; } while ((header & 0x80) && pds.isValid()); } if (pds.left()) { pds >> fPos[0]; pds >> fPos[1]; pds >> fPos[2]; } else { fPos[0] = fPos[1] = fPos[2] = 0.0f; } if (p) { float a = static_cast(avail); if (avail >= p->fAverageAvailable) p->fAverageAvailable = a; else p->fAverageAvailable *= 0.99f; } } else { jitter_buffer_update_delay(jbJitter, &jbp, NULL); iMissCount++; if (iMissCount > 10) nextalive = false; } } if (! qlFrames.isEmpty()) { QByteArray qba = qlFrames.takeFirst(); if (umtType == MessageHandler::UDPVoiceCELTAlpha || umtType == MessageHandler::UDPVoiceCELTBeta) { int wantversion = (umtType == MessageHandler::UDPVoiceCELTAlpha) ? g.iCodecAlpha : g.iCodecBeta; if ((p == &LoopUser::lpLoopy) && (! g.qmCodecs.isEmpty())) { QMap::const_iterator i = g.qmCodecs.constEnd(); --i; wantversion = i.key(); } if (cCodec && (cCodec->bitstreamVersion() != wantversion)) { cCodec->celt_decoder_destroy(cdDecoder); cdDecoder = NULL; } if (! cCodec) { cCodec = g.qmCodecs.value(wantversion); if (cCodec) { cdDecoder = cCodec->decoderCreate(); } } if (cdDecoder) cCodec->decode_float(cdDecoder, qba.isEmpty() ? NULL : reinterpret_cast(qba.constData()), qba.size(), pOut); else memset(pOut, 0, sizeof(float) * iFrameSize); } else if (umtType == MessageHandler::UDPVoiceOpus) { #ifdef USE_OPUS if (oCodec) { decodedSamples = oCodec->opus_decode_float(opusState, qba.isEmpty() ? NULL : reinterpret_cast(qba.constData()), qba.size(), pOut, iAudioBufferSize, 0); } if (decodedSamples < 0) { decodedSamples = iFrameSize; memset(pOut, 0, iFrameSize * sizeof(float)); } #endif } else if (umtType == MessageHandler::UDPVoiceSpeex) { if (qba.isEmpty()) { speex_decode(dsSpeex, NULL, pOut); } else { speex_bits_read_from(&sbBits, qba.data(), qba.size()); speex_decode(dsSpeex, &sbBits, pOut); } for (unsigned int i=0;i(umtType)); } bool update = true; if (p) { float &fPowerMax = p->fPowerMax; float &fPowerMin = p->fPowerMin; float pow = 0.0f; for (int i = 0; i < decodedSamples; ++i) pow += pOut[i] * pOut[i]; pow = sqrtf(pow / static_cast(decodedSamples)); if (pow >= fPowerMax) { fPowerMax = pow; } else { if (pow <= fPowerMin) { fPowerMin = pow; } else { fPowerMax = 0.99f * fPowerMax; fPowerMin += 0.0001f * pow; } } update = (pow < (fPowerMin + 0.01f * (fPowerMax - fPowerMin))); } if (qlFrames.isEmpty() && update) jitter_buffer_update_delay(jbJitter, NULL, NULL); if (qlFrames.isEmpty() && bHasTerminator) nextalive = false; } else { if (umtType == MessageHandler::UDPVoiceCELTAlpha || umtType == MessageHandler::UDPVoiceCELTBeta) { if (cdDecoder) cCodec->decode_float(cdDecoder, NULL, 0, pOut); else memset(pOut, 0, sizeof(float) * iFrameSize); } else if (umtType == MessageHandler::UDPVoiceOpus) { #ifdef USE_OPUS if (oCodec) { decodedSamples = oCodec->opus_decode_float(opusState, NULL, 0, pOut, iFrameSize, 0); } if (decodedSamples < 0) { decodedSamples = iFrameSize; memset(pOut, 0, iFrameSize * sizeof(float)); } #endif } else { speex_decode(dsSpeex, NULL, pOut); for (unsigned int i=0;i 0; --i) { jitter_buffer_tick(jbJitter); } } nextframe: spx_uint32_t inlen = decodedSamples; spx_uint32_t outlen = static_cast(ceilf(static_cast(decodedSamples * iMixerFreq) / static_cast(iSampleRate))); if (srs && bLastAlive) speex_resampler_process_float(srs, 0, fResamplerBuffer, &inlen, pfBuffer + iBufferFilled, &outlen); iBufferFilled += outlen; } if (p) { Settings::TalkState ts; if (! nextalive) ucFlags = 0xFF; switch (ucFlags) { case 0: ts = Settings::Talking; break; case 1: ts = Settings::Shouting; break; case 0xFF: ts = Settings::Passive; break; default: ts = Settings::Whispering; break; } p->setTalking(ts); } bool tmp = bLastAlive; bLastAlive = nextalive; return tmp; } mumble-1.3.4/src/mumble/GlobalShortcut.h0000664000175000017500000001674414010707273020032 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_GLOBALSHORTCUT_H_ #define MUMBLE_MUMBLE_GLOBALSHORTCUT_H_ #include #include #if QT_VERSION >= 0x050000 # include # include #else # include # include #endif #include "ConfigDialog.h" #include "Timer.h" #include "MUComboBox.h" #include "ui_GlobalShortcut.h" #include "ui_GlobalShortcutTarget.h" class GlobalShortcut : public QObject { friend class GlobalShortcutEngine; friend class GlobalShortcutConfig; private: Q_OBJECT Q_DISABLE_COPY(GlobalShortcut) protected: QList qlActive; signals: void down(QVariant); void triggered(bool, QVariant); public: QString qsToolTip; QString qsWhatsThis; QString name; QVariant qvDefault; int idx; GlobalShortcut(QObject *parent, int index, QString qsName, QVariant def = QVariant()); ~GlobalShortcut() Q_DECL_OVERRIDE; bool active() const { return ! qlActive.isEmpty(); } }; /** * Widget used to define and key combination for a shortcut. Once it gains * focus it will listen for a button combination until it looses focus. */ class ShortcutKeyWidget : public QLineEdit { private: Q_OBJECT Q_DISABLE_COPY(ShortcutKeyWidget) Q_PROPERTY(QList shortcut READ getShortcut WRITE setShortcut USER true) protected: virtual void focusInEvent(QFocusEvent *event); virtual void focusOutEvent(QFocusEvent *event); virtual void mouseDoubleClickEvent(QMouseEvent *e); virtual bool eventFilter(QObject *, QEvent *); public: QList qlButtons; bool bModified; ShortcutKeyWidget(QWidget *p = NULL); QList getShortcut() const; void displayKeys(bool last = true); public slots: void updateKeys(bool last); void setShortcut(const QList &shortcut); signals: void keySet(bool, bool); }; /** * Combo box widget used to define the kind of action a shortcut triggers. Then * entries get auto-generated from the GlobalShortcutEngine::qmShortcuts store. * * @see GlobalShortcutEngine */ class ShortcutActionWidget : public MUComboBox { private: Q_OBJECT Q_DISABLE_COPY(ShortcutActionWidget) Q_PROPERTY(unsigned int index READ index WRITE setIndex USER true) public: ShortcutActionWidget(QWidget *p = NULL); unsigned int index() const; void setIndex(int); }; class ShortcutToggleWidget : public MUComboBox { private: Q_OBJECT Q_DISABLE_COPY(ShortcutToggleWidget) Q_PROPERTY(int index READ index WRITE setIndex USER true) public: ShortcutToggleWidget(QWidget *p = NULL); int index() const; void setIndex(int); }; /** * Dialog which is used to select the targets of a targeted shortcut like Whisper. */ class ShortcutTargetDialog : public QDialog, public Ui::GlobalShortcutTarget { private: Q_OBJECT Q_DISABLE_COPY(ShortcutTargetDialog) protected: QMap qmHashNames; ShortcutTarget stTarget; public: ShortcutTargetDialog(const ShortcutTarget &, QWidget *p = NULL); ShortcutTarget target() const; public slots: void accept() Q_DECL_OVERRIDE; void on_qrbUsers_clicked(); void on_qrbChannel_clicked(); void on_qpbAdd_clicked(); void on_qpbRemove_clicked(); }; enum ShortcutTargetTypes { SHORTCUT_TARGET_ROOT = -1, SHORTCUT_TARGET_PARENT = -2, SHORTCUT_TARGET_CURRENT = -3, SHORTCUT_TARGET_SUBCHANNEL = -4, SHORTCUT_TARGET_PARENT_SUBCHANNEL = -12 }; /** * Widget used to display and change a ShortcutTarget. The widget displays a textual representation * of a ShortcutTarget and enable its editing with a ShortCutTargetDialog. */ class ShortcutTargetWidget : public QFrame { private: Q_OBJECT Q_DISABLE_COPY(ShortcutTargetWidget) Q_PROPERTY(ShortcutTarget target READ target WRITE setTarget USER true) protected: ShortcutTarget stTarget; QLineEdit *qleTarget; QToolButton *qtbEdit; public: ShortcutTargetWidget(QWidget *p = NULL); ShortcutTarget target() const; void setTarget(const ShortcutTarget &); static QString targetString(const ShortcutTarget &); public slots: void on_qtbEdit_clicked(); }; /** * Used to get custom display and edit behaviour for the model used in GlobalShortcutConfig::qtwShortcuts. * It registers custom handlers which link specific types to custom ShortcutXWidget editors and also * provides a basic textual representation for them when they are not edited. * * @see GlobalShortcutConfig * @see ShortcutKeyWidget * @see ShortcutActionWidget * @see ShortcutTargetWidget */ class ShortcutDelegate : public QStyledItemDelegate { Q_OBJECT Q_DISABLE_COPY(ShortcutDelegate) public: ShortcutDelegate(QObject *); ~ShortcutDelegate() Q_DECL_OVERRIDE; QString displayText(const QVariant &, const QLocale &) const Q_DECL_OVERRIDE; }; /** * Contains the Shortcut tab from the settings. This ConfigWidget provides * the user with the interface to add/edit/delete global shortcuts in Mumble. */ class GlobalShortcutConfig : public ConfigWidget, public Ui::GlobalShortcut { friend class ShortcutActionWidget; private: Q_OBJECT Q_DISABLE_COPY(GlobalShortcutConfig) protected: QList qlShortcuts; QTreeWidgetItem *itemForShortcut(const Shortcut &) const; bool showWarning() const; bool eventFilter(QObject *, QEvent *) Q_DECL_OVERRIDE; public: GlobalShortcutConfig(Settings &st); virtual QString title() const Q_DECL_OVERRIDE; virtual QIcon icon() const Q_DECL_OVERRIDE; public slots: void accept() const Q_DECL_OVERRIDE; void save() const Q_DECL_OVERRIDE; void load(const Settings &r) Q_DECL_OVERRIDE; void reload(); void commit(); void on_qcbEnableGlobalShortcuts_stateChanged(int); void on_qpbAdd_clicked(bool); void on_qpbRemove_clicked(bool); void on_qtwShortcuts_currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *); void on_qtwShortcuts_itemChanged(QTreeWidgetItem *, int); void on_qpbOpenAccessibilityPrefs_clicked(); void on_qpbSkipWarning_clicked(); }; struct ShortcutKey { Shortcut s; int iNumUp; GlobalShortcut *gs; }; /** * Creates a background thread which handles global shortcut behaviour. This class inherits * a system unspecific interface and basic functionality to the actually used native backend * classes (GlobalShortcutPlatform). * * @see GlobalShortcutX * @see GlobalShortcutMac * @see GlobalShortcutWin */ class GlobalShortcutEngine : public QThread { private: Q_OBJECT Q_DISABLE_COPY(GlobalShortcutEngine) public: bool bNeedRemap; Timer tReset; static GlobalShortcutEngine *engine; static GlobalShortcutEngine *platformInit(); QHash qmShortcuts; QList qlActiveButtons; QList qlDownButtons; QList qlSuppressed; QList qlButtonList; QList > qlShortcutList; GlobalShortcutEngine(QObject *p = NULL); ~GlobalShortcutEngine() Q_DECL_OVERRIDE; void resetMap(); void remap(); virtual void needRemap(); void run() Q_DECL_OVERRIDE; bool handleButton(const QVariant &, bool); static void add(GlobalShortcut *); static void remove(GlobalShortcut *); static QString buttonText(const QList &); virtual QString buttonName(const QVariant &) = 0; virtual bool canSuppress(); virtual void setEnabled(bool b); virtual bool enabled(); virtual bool canDisable(); signals: void buttonPressed(bool last); }; #endif mumble-1.3.4/src/mumble/JackAudio.cpp0000664000175000017500000004016414010707273017254 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "JackAudio.h" #include "Global.h" static JackAudioSystem *jasys = NULL; // jackStatusToStringList converts a jack_status_t (a flag type // that can contain multiple Jack statuses) to a QStringList. QStringList jackStatusToStringList(jack_status_t status) { QStringList statusList; if ((status & JackFailure) != 0) { statusList << QLatin1String("JackFailure - overall operation failed"); } if ((status & JackInvalidOption) != 0) { statusList << QLatin1String("JackInvalidOption - the operation contained an invalid or unsupported option"); } if ((status & JackNameNotUnique) != 0) { statusList << QLatin1String("JackNameNotUnique - the desired client name is not unique"); } if ((status & JackServerStarted) != 0) { statusList << QLatin1String("JackServerStarted - the server was started as a result of this operation"); } if ((status & JackServerFailed) != 0) { statusList << QLatin1String("JackServerFailed - unable to connect to the JACK server"); } if ((status & JackServerError) != 0) { statusList << QLatin1String("JackServerError - communication error with the JACK server"); } if ((status & JackNoSuchClient) != 0) { statusList << QLatin1String("JackNoSuchClient - requested client does not exist"); } if ((status & JackLoadFailure) != 0) { statusList << QLatin1String("JackLoadFailure - unable to load initial client"); } if ((status & JackInitFailure) != 0) { statusList << QLatin1String("JackInitFailure - unable to initialize client"); } if ((status & JackShmFailure) != 0) { statusList << QLatin1String("JackShmFailure - unable to access shared memory"); } if ((status & JackVersionError) != 0) { statusList << QLatin1String("JackVersionError - client's protocol version does not match"); } if ((status & JackBackendError) != 0) { statusList << QLatin1String("JackBackendError - a backend error occurred"); } if ((status & JackClientZombie) != 0) { statusList << QLatin1String("JackClientZombie - client zombified"); } return statusList; } class JackAudioInputRegistrar : public AudioInputRegistrar { public: JackAudioInputRegistrar(); virtual AudioInput *create(); virtual const QList getDeviceChoices(); virtual void setDeviceChoice(const QVariant &, Settings &); virtual bool canEcho(const QString &) const; }; class JackAudioOutputRegistrar : public AudioOutputRegistrar { public: JackAudioOutputRegistrar(); virtual AudioOutput *create(); virtual const QList getDeviceChoices(); virtual void setDeviceChoice(const QVariant &, Settings &); }; class JackAudioInit : public DeferInit { public: JackAudioInputRegistrar *airJackAudio; JackAudioOutputRegistrar *aorJackAudio; void initialize() { jasys = new JackAudioSystem(); jasys->qmWait.lock(); jasys->qwcWait.wait(&jasys->qmWait, 1000); jasys->qmWait.unlock(); if (jasys->bJackIsGood) { airJackAudio = new JackAudioInputRegistrar(); aorJackAudio = new JackAudioOutputRegistrar(); } else { airJackAudio = NULL; aorJackAudio = NULL; delete jasys; jasys = NULL; } } void destroy() { if (airJackAudio) delete airJackAudio; if (aorJackAudio) delete aorJackAudio; if (jasys) { delete jasys; jasys = NULL; } } }; static JackAudioInit jackinit; // To instantiate the classes (JackAudioSystem, JackAudioInputRegistrar and JackAudioOutputRegistrar). JackAudioSystem::JackAudioSystem() : bActive(false) , client(NULL) , in_port(NULL) , output_buffer(NULL) , iBufferSize(0) , bJackIsGood(false) , bInputIsGood(false) , bOutputIsGood(false) , iSampleRate(0) { if (g.s.qsJackAudioOutput.isEmpty()) { iOutPorts = 1; } else { iOutPorts = g.s.qsJackAudioOutput.toInt(); } memset(reinterpret_cast(&out_ports), 0, sizeof(out_ports)); qhInput.insert(QString(), tr("Hardware Ports")); qhOutput.insert(QString::number(1), tr("Mono")); qhOutput.insert(QString::number(2), tr("Stereo")); jack_status_t status = static_cast(0); int err = 0; jack_options_t jack_option = g.s.bJackStartServer ? JackNullOption : JackNoStartServer; client = jack_client_open(g.s.qsJackClientName.toStdString().c_str(), jack_option, &status); if (!client) { QStringList errors = jackStatusToStringList(status); qWarning("JackAudioSystem: unable to open client due to %i errors:", errors.count()); for (int i = 0; i < errors.count(); ++i) { qWarning("JackAudioSystem: %s", qPrintable(errors.at(i))); } return; } qWarning("JackAudioSystem: client \"%s\" opened successfully", jack_get_client_name(client)); iBufferSize = jack_get_buffer_size(client); iSampleRate = jack_get_sample_rate(client); err = jack_set_process_callback(client, process_callback, this); if (err != 0) { qWarning("JackAudioSystem: unable to set process callback - jack_set_process_callback() returned %i", err); return; } err = jack_set_sample_rate_callback(client, srate_callback, this); if (err != 0) { qWarning("JackAudioSystem: unable to set sample rate callback - jack_set_sample_rate_callback() returned %i", err); return; } err = jack_set_buffer_size_callback(client, buffer_size_callback, this); if (err != 0) { qWarning("JackAudioSystem: unable to set buffer size callback - jack_set_buffer_size_callback() returned %i", err); return; } jack_on_shutdown(client, shutdown_callback, this); // If we made it this far, then everything is okay bJackIsGood = true; } JackAudioSystem::~JackAudioSystem() { QMutexLocker lock(&qmWait); if (client) { int err = 0; err = jack_deactivate(client); if (err != 0) { qWarning("JackAudioSystem: unable to remove client from the process graph - jack_deactivate() returned %i", err); } bActive = false; err = jack_client_close(client); if (err != 0) { qWarning("JackAudioSystem: unable to disconnect from the server - jack_client_close() returned %i", err); } delete [] output_buffer; output_buffer = NULL; client = NULL; } bJackIsGood = false; } void JackAudioSystem::auto_connect_ports() { if (!(client && g.s.bJackAutoConnect)) { return; } disconnect_ports(); const char **ports = NULL; const int wanted_out_flags = JackPortIsPhysical | JackPortIsOutput; const int wanted_in_flags = JackPortIsPhysical | JackPortIsInput; int err; unsigned int connected_out_ports = 0; unsigned int connected_in_ports = 0; ports = jack_get_ports(client, 0, "audio", JackPortIsPhysical); if (ports != NULL) { int i = 0; while (ports[i] != NULL) { jack_port_t * const port = jack_port_by_name(client, ports[i]); if (port == NULL) { qWarning("JackAudioSystem: jack_port_by_name() returned an invalid port - skipping it"); continue; } const int port_flags = jack_port_flags(port); if (bInputIsGood && (port_flags & wanted_out_flags) == wanted_out_flags && connected_in_ports < 1) { err = jack_connect(client, ports[i], jack_port_name(in_port)); if (err != 0) { qWarning("JackAudioSystem: unable to connect port '%s' to '%s' - jack_connect() returned %i", ports[i], jack_port_name(in_port), err); } else { connected_in_ports++; } } else if (bOutputIsGood && (port_flags & wanted_in_flags) == wanted_in_flags && connected_out_ports < iOutPorts) { err = jack_connect(client, jack_port_name(out_ports[connected_out_ports]), ports[i]); if (err != 0) { qWarning("JackAudioSystem: unable to connect port '%s' to '%s' - jack_connect() returned %i", jack_port_name(out_ports[connected_out_ports]), ports[i], err); } else { connected_out_ports++; } } ++i; } } } void JackAudioSystem::disconnect_ports() { if (!client) { return; } // Disconnect the input port if (in_port != NULL) { int err = jack_port_disconnect(client, in_port); if (err != 0) { qWarning("JackAudioSystem: unable to disconnect in port - jack_port_disconnect() returned %i", err); } } // Disconnect the output ports for (unsigned int i = 0; i < iOutPorts; ++i) { if (out_ports[i] != NULL) { int err = jack_port_disconnect(client, out_ports[i]); if (err != 0) { qWarning("JackAudioSystem: unable to disconnect out port - jack_port_disconnect() returned %i", err); } } } } void JackAudioSystem::activate() { QMutexLocker lock(&qmWait); if (client) { if (bActive) { auto_connect_ports(); return; } int err = jack_activate(client); if (err != 0) { qWarning("JackAudioSystem: unable to activate client - jack_activate() returned %i", err); bJackIsGood = false; return; } bActive = true; auto_connect_ports(); } } int JackAudioSystem::process_callback(jack_nframes_t nframes, void *arg) { JackAudioSystem * const jas = static_cast(arg); if (jas && jas->bJackIsGood) { AudioInputPtr ai = g.ai; AudioOutputPtr ao = g.ao; JackAudioInput * const jai = dynamic_cast(ai.get()); JackAudioOutput * const jao = dynamic_cast(ao.get()); if (jai && jai->isRunning() && jai->iMicChannels > 0 && !jai->isFinished()) { QMutexLocker(&jai->qmMutex); void *input = jack_port_get_buffer(jas->in_port, nframes); if (input != NULL) { jai->addMic(input, nframes); } } if (jao && jao->isRunning() && jao->iChannels > 0 && !jao->isFinished()) { QMutexLocker(&jao->qmMutex); jack_default_audio_sample_t *port_buffers[JACK_MAX_OUTPUT_PORTS]; for (unsigned int i = 0; i < jao->iChannels; ++i) { port_buffers[i] = (jack_default_audio_sample_t*)jack_port_get_buffer(jas->out_ports[i], nframes); if (port_buffers[i] == NULL) { return 1; } } jack_default_audio_sample_t * const buffer = jas->output_buffer; memset(buffer, 0, sizeof(jack_default_audio_sample_t) * nframes * jao->iChannels); jao->mix(buffer, nframes); if (jao->iChannels == 1) { memcpy(port_buffers[0], buffer, sizeof(jack_default_audio_sample_t) * nframes); } else { // de-interleave channels for (unsigned int i = 0; i < nframes * jao->iChannels; ++i) { port_buffers[i % jao->iChannels][i / jao->iChannels] = buffer[i]; } } } } return 0; } int JackAudioSystem::srate_callback(jack_nframes_t frames, void *arg) { JackAudioSystem * const jas = static_cast(arg); jas->iSampleRate = frames; return 0; } void JackAudioSystem::allocOutputBuffer(jack_nframes_t frames) { iBufferSize = frames; AudioOutputPtr ao = g.ao; JackAudioOutput * const jao = dynamic_cast(ao.get()); if (jao) { jao->qmMutex.lock(); } if (output_buffer) { delete [] output_buffer; output_buffer = NULL; } output_buffer = new jack_default_audio_sample_t[frames * iOutPorts]; if (output_buffer == NULL) { bJackIsGood = false; } if (jao) { jao->qmMutex.unlock(); } } void JackAudioSystem::initializeInput() { QMutexLocker lock(&qmWait); if (!jasys->bJackIsGood) { return; } AudioInputPtr ai = g.ai; JackAudioInput * const jai = dynamic_cast(ai.get()); if (jai) { jai->qmMutex.lock(); } in_port = jack_port_register(client, "input", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0); if (in_port == NULL) { qWarning("JackAudioSystem: unable to register 'input' port"); return; } bInputIsGood = true; if (jai) { jai->qmMutex.unlock(); } } void JackAudioSystem::destroyInput() { AudioInputPtr ai = g.ai; JackAudioInput * const jai = dynamic_cast(ai.get()); if (jai) { jai->qmMutex.lock(); } if (in_port != NULL) { int err = jack_port_unregister(client, in_port); if (err != 0) { qWarning("JackAudioSystem: unable to unregister in port - jack_port_unregister() returned %i", err); return; } } bInputIsGood = false; if (jai) { jai->qmMutex.unlock(); } } void JackAudioSystem::initializeOutput() { QMutexLocker lock(&qmWait); if (!jasys->bJackIsGood) { return; } AudioOutputPtr ao = g.ao; JackAudioOutput * const jao = dynamic_cast(ao.get()); allocOutputBuffer(iBufferSize); if (jao) { jao->qmMutex.lock(); } for (unsigned int i = 0; i < iOutPorts; ++i) { char name[10]; snprintf(name, 10, "output_%d", i + 1); out_ports[i] = jack_port_register(client, name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0); if (out_ports[i] == NULL) { qWarning("JackAudioSystem: unable to register 'output' port"); break; } } bOutputIsGood = true; if (jao) { jao->qmMutex.unlock(); } } void JackAudioSystem::destroyOutput() { AudioOutputPtr ao = g.ao; JackAudioOutput * const jao = dynamic_cast(ao.get()); if (jao) { jao->qmMutex.lock(); } delete [] output_buffer; output_buffer = NULL; for (unsigned int i = 0; i < iOutPorts; ++i) { if (out_ports[i] != NULL) { int err = jack_port_unregister(client, out_ports[i]); if (err != 0) { qWarning("JackAudioSystem: unable to unregister out port - jack_port_unregister() returned %i", err); } out_ports[i] = NULL; } } bOutputIsGood = false; if (jao) { jao->qmMutex.unlock(); } } int JackAudioSystem::buffer_size_callback(jack_nframes_t frames, void *arg) { JackAudioSystem * const jas = static_cast(arg); jas->allocOutputBuffer(frames); return 0; } void JackAudioSystem::shutdown_callback(void *arg) { JackAudioSystem * const jas = static_cast(arg); jas->bJackIsGood = false; } JackAudioInputRegistrar::JackAudioInputRegistrar() : AudioInputRegistrar(QLatin1String("JACK"), 10) { } AudioInput *JackAudioInputRegistrar::create() { return new JackAudioInput(); } const QList JackAudioInputRegistrar::getDeviceChoices() { QList qlReturn; QStringList qlInputDevs = jasys->qhInput.keys(); qSort(qlInputDevs); foreach(const QString &dev, qlInputDevs) { qlReturn << audioDevice(jasys->qhInput.value(dev), dev); } return qlReturn; } void JackAudioInputRegistrar::setDeviceChoice(const QVariant &choice, Settings &s) { Q_UNUSED(choice); Q_UNUSED(s); } bool JackAudioInputRegistrar::canEcho(const QString &osys) const { Q_UNUSED(osys); return false; } JackAudioOutputRegistrar::JackAudioOutputRegistrar() : AudioOutputRegistrar(QLatin1String("JACK"), 10) { } AudioOutput *JackAudioOutputRegistrar::create() { return new JackAudioOutput(); } const QList JackAudioOutputRegistrar::getDeviceChoices() { QList qlReturn; QStringList qlOutputDevs = jasys->qhOutput.keys(); qSort(qlOutputDevs); if (qlOutputDevs.contains(g.s.qsJackAudioOutput)) { qlOutputDevs.removeAll(g.s.qsJackAudioOutput); qlOutputDevs.prepend(g.s.qsJackAudioOutput); } foreach(const QString &dev, qlOutputDevs) { qlReturn << audioDevice(jasys->qhOutput.value(dev), dev); } return qlReturn; } void JackAudioOutputRegistrar::setDeviceChoice(const QVariant &choice, Settings &s) { s.qsJackAudioOutput = choice.toString(); jasys->iOutPorts = qBound(1, choice.toInt(), JACK_MAX_OUTPUT_PORTS); } JackAudioInput::JackAudioInput() { bRunning = true; iMicChannels = 0; } JackAudioInput::~JackAudioInput() { bRunning = false; iMicChannels = 0; qmMutex.lock(); qwcWait.wakeAll(); qmMutex.unlock(); wait(); } void JackAudioInput::run() { if (!jasys) { exit(1); } jasys->initializeInput(); if (!jasys->bInputIsGood) { exit(1); } iMicFreq = jasys->iSampleRate; iMicChannels = 1; eMicFormat = SampleFloat; initializeMixer(); jasys->activate(); qmMutex.lock(); while (bRunning) qwcWait.wait(&qmMutex); qmMutex.unlock(); jasys->destroyInput(); } JackAudioOutput::JackAudioOutput() { bRunning = true; iChannels = 0; } JackAudioOutput::~JackAudioOutput() { bRunning = false; iChannels = 0; qmMutex.lock(); qwcWait.wakeAll(); qmMutex.unlock(); wait(); } void JackAudioOutput::run() { if (!jasys) { exit(1); } jasys->initializeOutput(); if (!jasys->bOutputIsGood) { exit(1); } unsigned int chanmasks[32]; chanmasks[0] = SPEAKER_FRONT_LEFT; chanmasks[1] = SPEAKER_FRONT_RIGHT; eSampleFormat = SampleFloat; iChannels = jasys->iOutPorts; iMixerFreq = jasys->iSampleRate; initializeMixer(chanmasks); jasys->activate(); qmMutex.lock(); while (bRunning) qwcWait.wait(&qmMutex); qmMutex.unlock(); jasys->destroyOutput(); } mumble-1.3.4/src/mumble/DBus.cpp0000664000175000017500000000613414010707273016256 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "DBus.h" #include "Channel.h" #include "ClientUser.h" #include "MainWindow.h" #include "ServerHandler.h" // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" MumbleDBus::MumbleDBus(QObject *mw) : QDBusAbstractAdaptor(mw) { } void MumbleDBus::openUrl(const QString &url, const QDBusMessage &msg) { QUrl u = QUrl::fromEncoded(url.toLatin1()); bool valid = u.isValid(); valid = valid && (u.scheme() == QLatin1String("mumble")); if (! valid) { QDBusConnection::sessionBus().send(msg.createErrorReply(QLatin1String("net.sourceforge.mumble.Error.url"), QLatin1String("Invalid URL"))); } else { g.mw->openUrl(u); } } void MumbleDBus::getCurrentUrl(const QDBusMessage &msg) { if (!g.sh || !g.sh->isRunning() || ! g.uiSession) { QDBusConnection::sessionBus().send(msg.createErrorReply(QLatin1String("net.sourceforge.mumble.Error.connection"), QLatin1String("Not connected"))); return; } QString host, user, pw; unsigned short port; QUrl u; g.sh->getConnectionInfo(host, port, user, pw); u.setScheme(QLatin1String("mumble")); u.setHost(host); u.setPort(port); u.setUserName(user); #if QT_VERSION >= 0x050000 QUrlQuery query; query.addQueryItem(QLatin1String("version"), QLatin1String("1.2.0")); u.setQuery(query); #else u.addQueryItem(QLatin1String("version"), QLatin1String("1.2.0")); #endif QStringList path; Channel *c = ClientUser::get(g.uiSession)->cChannel; while (c->cParent) { path.prepend(c->qsName); c = c->cParent; } QString fullpath = path.join(QLatin1String("/")); // Make sure fullpath starts with a slash for non-empty paths. Setting // a path without a leading slash clears the whole QUrl. if (!fullpath.isEmpty()) { fullpath.prepend(QLatin1String("/")); } u.setPath(fullpath); QDBusConnection::sessionBus().send(msg.createReply(QString::fromLatin1(u.toEncoded()))); } void MumbleDBus::getTalkingUsers(const QDBusMessage &msg) { if (!g.sh || !g.sh->isRunning() || ! g.uiSession) { QDBusConnection::sessionBus().send(msg.createErrorReply(QLatin1String("net.sourceforge.mumble.Error.connection"), QLatin1String("Not connected"))); return; } QStringList names; foreach(ClientUser *cu, ClientUser::getTalking()) { names.append(cu->qsName); } QDBusConnection::sessionBus().send(msg.createReply(names)); } void MumbleDBus::focus() { g.mw->show(); g.mw->raise(); g.mw->activateWindow(); } void MumbleDBus::setSelfMuted(bool mute) { g.mw->qaAudioMute->setChecked(!mute); g.mw->qaAudioMute->trigger(); } void MumbleDBus::setSelfDeaf(bool deafen) { g.mw->qaAudioDeaf->setChecked(!deafen); g.mw->qaAudioDeaf->trigger(); } bool MumbleDBus::isSelfMuted() { return g.s.bMute; } bool MumbleDBus::isSelfDeaf() { return g.s.bDeaf; } mumble-1.3.4/src/mumble/Log_macx.mm0000664000175000017500000000730714010707273017004 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "Log.h" #include "Global.h" #if MAC_OS_X_VERSION_MAX_ALLOWED >= 1080 @interface MUUserNotificationCenterDelegate : NSObject @end @implementation MUUserNotificationCenterDelegate - (void) userNotificationCenter:(NSUserNotificationCenter *)center didDeliverNotification:(NSUserNotification *)notification { Q_UNUSED(center); Q_UNUSED(notification); } - (void) userNotificationCenter:(NSUserNotificationCenter *)center didActivateNotification:(NSUserNotification *)notification { [center removeDeliveredNotification:notification]; } - (BOOL) userNotificationCenter:(NSUserNotificationCenter *)center shouldPresentNotification:(NSUserNotification *)notification { Q_UNUSED(center); Q_UNUSED(notification); return NO; } @end static NSString *Log_QString_to_NSString(const QString& string) { return const_cast(reinterpret_cast(CFStringCreateWithCharacters(kCFAllocatorDefault, reinterpret_cast(string.unicode()), string.length()))); } #endif #if QT_VERSION < 0x050800 extern bool qt_mac_execute_apple_script(const QString &script, AEDesc *ret); static bool growl_available() { static int isAvailable = -1; if (isAvailable == -1) { OSStatus err = LSFindApplicationForInfo('GRRR', CFSTR("com.Growl.GrowlHelperApp"), CFSTR("GrowlHelperApp.app"), NULL, NULL); isAvailable = (err != kLSApplicationNotFoundErr) ? 1 : 0; if (isAvailable) { QStringList qslAllEvents; for (int i = Log::firstMsgType; i <= Log::lastMsgType; ++i) { Log::MsgType t = static_cast(i); qslAllEvents << QString::fromLatin1("\"%1\"").arg(g.l->msgName(t)); } QString qsScript = QString::fromLatin1( "tell application \"GrowlHelperApp\"\n" " set the allNotificationsList to {%1}\n" " set the enabledNotificationsList to {%1}\n" " register as application \"Mumble\"" " all notifications allNotificationsList" " default notifications enabledNotificationsList" " icon of application \"Mumble\"\n" "end tell\n").arg(qslAllEvents.join(QLatin1String(","))); qt_mac_execute_apple_script(qsScript, NULL); } } return isAvailable == 1; } #endif // QT_VERSION void Log::postNotification(MsgType mt, const QString &plain) { QString title = msgName(mt); #if MAC_OS_X_VERSION_MAX_ALLOWED >= 1080 if (QSysInfo::MacintoshVersion >= QSysInfo::MV_MOUNTAINLION) { NSUserNotificationCenter *userNotificationCenter = [NSUserNotificationCenter defaultUserNotificationCenter]; if (userNotificationCenter.delegate == nil) { // We hand the delegate property a delegate with a retain count of 1. We don't keep // a reference to the delegate anywhere else, so it's not really a leak. userNotificationCenter.delegate = [[MUUserNotificationCenterDelegate alloc] init]; } NSUserNotification *userNotification = [[[NSUserNotification alloc] init] autorelease]; userNotification.title = [Log_QString_to_NSString(title) autorelease]; userNotification.informativeText = [Log_QString_to_NSString(plain) autorelease]; [userNotificationCenter scheduleNotification:userNotification]; } else #endif { #if QT_VERSION < 0x050800 QString qsScript = QString::fromLatin1( "tell application \"GrowlHelperApp\"\n" " notify with name \"%1\" title \"%1\" description \"%2\" application name \"Mumble\"\n" "end tell\n").arg(title).arg(plain); if (growl_available()) qt_mac_execute_apple_script(qsScript, NULL); #endif } } mumble-1.3.4/src/mumble/ConfigDialog.h0000664000175000017500000000215114010707273017406 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_CONFIGDIALOG_H_ #define MUMBLE_MUMBLE_CONFIGDIALOG_H_ #include "ConfigWidget.h" #include "Settings.h" #include "ui_ConfigDialog.h" class ConfigDialog : public QDialog, public Ui::ConfigDialog { private: Q_OBJECT Q_DISABLE_COPY(ConfigDialog) protected: QHash qhPages; QMap qmWidgets; QMap qmIconWidgets; void updateListView(); void addPage(ConfigWidget *aw, unsigned int idx); Settings s; public: ConfigDialog(QWidget *p = NULL); ~ConfigDialog() Q_DECL_OVERRIDE; public slots: void on_pageButtonBox_clicked(QAbstractButton *); void on_dialogButtonBox_clicked(QAbstractButton *); void on_qlwIcons_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous); void apply(); void accept() Q_DECL_OVERRIDE; }; #endif mumble-1.3.4/src/mumble/OverlayUserGroup.cpp0000664000175000017500000002616614010707273020725 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "OverlayUserGroup.h" #include "OverlayUser.h" #include "OverlayClient.h" #include "OverlayEditor.h" #include "OverlayText.h" #include "User.h" #include "Channel.h" #include "ClientUser.h" #include "Message.h" #include "Database.h" #include "NetworkConfig.h" #include "ServerHandler.h" #include "MainWindow.h" #include "GlobalShortcut.h" // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" template QRectF OverlayGroup::boundingRect() const { QRectF qr; foreach(const QGraphicsItem *item, childItems()) if (item->isVisible() && (item->type() == T::Type)) qr |= item->boundingRect().translated(item->pos()); return qr; } OverlayUserGroup::OverlayUserGroup(OverlaySettings *osptr) : OverlayGroup(), os(osptr), qgeiHandle(NULL), bShowExamples(false) { } OverlayUserGroup::~OverlayUserGroup() { reset(); } void OverlayUserGroup::reset() { foreach(OverlayUser *ou, qlExampleUsers) delete ou; qlExampleUsers.clear(); foreach(OverlayUser *ou, qmUsers) delete ou; qmUsers.clear(); delete qgeiHandle; qgeiHandle = NULL; } int OverlayUserGroup::type() const { return Type; } void OverlayUserGroup::contextMenuEvent(QGraphicsSceneContextMenuEvent *e) { e->accept(); #ifdef Q_OS_MAC bool embed = g.ocIntercept != NULL; QMenu qm(embed ? NULL : e->widget()); if (embed) { QGraphicsScene *scene = g.ocIntercept->qgv.scene(); scene->addWidget(&qm); } #else QMenu qm(g.ocIntercept ? g.mw : e->widget()); #endif QMenu *qmShow = qm.addMenu(OverlayClient::tr("Filter")); QAction *qaShowTalking = qmShow->addAction(OverlayClient::tr("Only talking")); qaShowTalking->setCheckable(true); if (os->osShow == OverlaySettings::Talking) qaShowTalking->setChecked(true); QAction *qaShowActive = qmShow->addAction(OverlayClient::tr("Talking and recently active")); qaShowActive->setCheckable(true); if (os->osShow == OverlaySettings::Active) qaShowActive->setChecked(true); QAction *qaShowHome = qmShow->addAction(OverlayClient::tr("All in current channel")); qaShowHome->setCheckable(true); if (os->osShow == OverlaySettings::HomeChannel) qaShowHome->setChecked(true); QAction *qaShowLinked = qmShow->addAction(OverlayClient::tr("All in linked channels")); qaShowLinked->setCheckable(true); if (os->osShow == OverlaySettings::LinkedChannels) qaShowLinked->setChecked(true); qmShow->addSeparator(); QAction *qaShowSelf = qmShow->addAction(OverlayClient::tr("Always show yourself")); qaShowSelf->setCheckable(true); qaShowSelf->setEnabled(os->osShow == OverlaySettings::Talking || os->osShow == OverlaySettings::Active); if (os->bAlwaysSelf) qaShowSelf->setChecked(true); qmShow->addSeparator(); QAction *qaConfigureRecentlyActiveTime = qmShow->addAction(OverlayClient::tr("Configure recently active time (%1 seconds)...").arg(os->uiActiveTime)); qaConfigureRecentlyActiveTime->setEnabled(os->osShow == OverlaySettings::Active); QMenu *qmColumns = qm.addMenu(OverlayClient::tr("Columns")); QAction *qaColumns[6]; for (unsigned int i=1;i<=5;++i) { qaColumns[i] = qmColumns->addAction(QString::number(i)); qaColumns[i]->setCheckable(true); qaColumns[i]->setChecked(i == os->uiColumns); } QMenu *qmSort = qm.addMenu(OverlayClient::tr("Sort")); QAction *qaSortAlphabetically = qmSort->addAction(OverlayClient::tr("Alphabetically")); qaSortAlphabetically->setCheckable(true); if (os->osSort == OverlaySettings::Alphabetical) qaSortAlphabetically->setChecked(true); QAction *qaSortLastStateChange = qmSort->addAction(OverlayClient::tr("Last state change")); qaSortLastStateChange->setCheckable(true); if (os->osSort == OverlaySettings::LastStateChange) qaSortLastStateChange->setChecked(true); QAction *qaEdit = qm.addAction(OverlayClient::tr("Edit...")); QAction *qaZoom = qm.addAction(OverlayClient::tr("Reset Zoom")); QAction *act = qm.exec(e->screenPos()); if (! act) return; if (act == qaEdit) { if (g.ocIntercept) { QMetaObject::invokeMethod(g.ocIntercept, "openEditor", Qt::QueuedConnection); } else { OverlayEditor oe(qApp->activeModalWidget(), NULL, os); connect(&oe, SIGNAL(applySettings()), this, SLOT(updateLayout())); oe.exec(); } } else if (act == qaZoom) { os->fZoom = 1.0f; updateLayout(); } else if (act == qaShowTalking) { os->osShow = OverlaySettings::Talking; updateUsers(); } else if (act == qaShowActive) { os->osShow = OverlaySettings::Active; updateUsers(); } else if (act == qaShowHome) { os->osShow = OverlaySettings::HomeChannel; updateUsers(); } else if (act == qaShowLinked) { os->osShow = OverlaySettings::LinkedChannels; updateUsers(); } else if (act == qaShowSelf) { os->bAlwaysSelf = ! os->bAlwaysSelf; updateUsers(); } else if (act == qaConfigureRecentlyActiveTime) { // FIXME: This might not be the best place to configure this setting, but currently // there's not really a suitable place to put this. In the future an additional tab // might be added for some advanced overlay options, which could then include this // setting. bool ok; int newValue = QInputDialog::getInt( qm.parentWidget(), OverlayClient::tr("Configure recently active time"), OverlayClient::tr("Amount of seconds users remain active after talking:"), os->uiActiveTime, 1, 2147483647, 1, &ok); if (ok) { os->uiActiveTime = newValue; } updateUsers(); } else if (act == qaSortAlphabetically) { os->osSort = OverlaySettings::Alphabetical; updateUsers(); } else if (act == qaSortLastStateChange) { os->osSort = OverlaySettings::LastStateChange; updateUsers(); } else { for (int i=1;i<=5;++i) { if (act == qaColumns[i]) { os->uiColumns = i; updateLayout(); } } } } void OverlayUserGroup::wheelEvent(QGraphicsSceneWheelEvent *e) { e->accept(); qreal scaleFactor = 0.875f; if (e->delta() > 0) scaleFactor = 1.0f / 0.875f; if ((scaleFactor < 1.0f) && (os->fZoom <= (1.0f / 4.0f))) return; else if ((scaleFactor > 1.0f) && (os->fZoom >= 4.0f)) return; os->fZoom *= scaleFactor; updateLayout(); } bool OverlayUserGroup::sceneEventFilter(QGraphicsItem *watched, QEvent *e) { switch (e->type()) { case QEvent::GraphicsSceneMouseMove: case QEvent::GraphicsSceneMouseRelease: QMetaObject::invokeMethod(this, "moveUsers", Qt::QueuedConnection); break; default: break; } return OverlayGroup::sceneEventFilter(watched, e); } void OverlayUserGroup::moveUsers() { if (! qgeiHandle) return; const QRectF &sr = scene()->sceneRect(); const QPointF &p = qgeiHandle->pos(); os->fX = static_cast(qBound(0.0, p.x() / sr.width(), 1.0)); os->fY = static_cast(qBound(0.0, p.y() / sr.height(), 1.0)); qgeiHandle->setPos(os->fX * sr.width(), os->fY * sr.height()); updateUsers(); } void OverlayUserGroup::updateLayout() { prepareGeometryChange(); reset(); updateUsers(); } void OverlayUserGroup::updateUsers() { const QRectF &sr = scene()->sceneRect(); unsigned int uiHeight = iroundf(sr.height() + 0.5f); QList items; foreach(QGraphicsItem *qgi, childItems()) items << qgi; QList users; if (bShowExamples) { if (qlExampleUsers.isEmpty()) { qlExampleUsers << new OverlayUser(Settings::Passive, uiHeight, os); qlExampleUsers << new OverlayUser(Settings::Talking, uiHeight, os); qlExampleUsers << new OverlayUser(Settings::Whispering, uiHeight, os); qlExampleUsers << new OverlayUser(Settings::Shouting, uiHeight, os); } users = qlExampleUsers; foreach(OverlayUser *ou, users) items.removeAll(ou); if (! qgeiHandle) { qgeiHandle = new QGraphicsEllipseItem(QRectF(-4.0f, -4.0f, 8.0f, 8.0f)); qgeiHandle->setPen(QPen(Qt::darkRed, 0.0f)); qgeiHandle->setBrush(Qt::red); qgeiHandle->setZValue(0.5f); qgeiHandle->setFlag(QGraphicsItem::ItemIsMovable); qgeiHandle->setFlag(QGraphicsItem::ItemIsSelectable); qgeiHandle->setPos(sr.width() * os->fX, sr.height() * os->fY); scene()->addItem(qgeiHandle); qgeiHandle->show(); qgeiHandle->installSceneEventFilter(this); } } else { delete qgeiHandle; qgeiHandle = NULL; } ClientUser *self = ClientUser::get(g.uiSession); if (self) { QList showusers; Channel *home = ClientUser::get(g.uiSession)->cChannel; switch (os->osShow) { case OverlaySettings::LinkedChannels: foreach(Channel *c, home->allLinks()) foreach(User *p, c->qlUsers) showusers << static_cast(p); foreach(ClientUser *cu, ClientUser::getTalking()) if (! showusers.contains(cu)) showusers << cu; break; case OverlaySettings::HomeChannel: foreach(User *p, home->qlUsers) showusers << static_cast(p); foreach(ClientUser *cu, ClientUser::getTalking()) if (! showusers.contains(cu)) showusers << cu; break; case OverlaySettings::Active: showusers = ClientUser::getActive(); if (os->bAlwaysSelf && !showusers.contains(self)) showusers << self; break; default: showusers = ClientUser::getTalking(); if (os->bAlwaysSelf && (self->tsState == Settings::Passive)) showusers << self; break; } ClientUser::sortUsersOverlay(showusers); foreach(ClientUser *cu, showusers) { OverlayUser *ou = qmUsers.value(cu); if (! ou) { ou = new OverlayUser(cu, uiHeight, os); connect(cu, SIGNAL(destroyed(QObject *)), this, SLOT(userDestroyed(QObject *))); qmUsers.insert(cu, ou); ou->hide(); } else { items.removeAll(ou); } users << ou; } } foreach(QGraphicsItem *qgi, items) { scene()->removeItem(qgi); qgi->hide(); } QRectF childrenBounds = os->qrfAvatar | os->qrfChannel | os->qrfMutedDeafened | os->qrfUserName; int pad = os->bBox ? iroundf(uiHeight * os->fZoom * (os->fBoxPad + os->fBoxPenWidth) + 0.5f) : 0; int width = iroundf(childrenBounds.width() * uiHeight * os->fZoom + 0.5f) + 2 * pad; int height = iroundf(childrenBounds.height() * uiHeight * os->fZoom + 0.5f) + 2 * pad; int xOffset = - iroundf(childrenBounds.left() * uiHeight * os->fZoom + 0.5f) + pad; int yOffset = - iroundf(childrenBounds.top() * uiHeight * os->fZoom + 0.5f) + pad; unsigned int yPos = 0; unsigned int xPos = 0; foreach(OverlayUser *ou, users) { if (ou->parentItem() == NULL) ou->setParentItem(this); ou->setPos(xPos * (width+4) + xOffset, yPos * (height + 4) + yOffset); ou->updateUser(); ou->show(); if (xPos >= (os->uiColumns - 1)) { xPos = 0; ++yPos; } else { ++xPos; } } QRectF br = boundingRect(); int basex = qBound(0, iroundf(sr.width() * os->fX + 0.5f), iroundf(sr.width() - br.width() + 0.5f)); int basey = qBound(0, iroundf(sr.height() * os->fY + 0.5f), iroundf(sr.height() - br.height() + 0.5f)); setPos(basex, basey); } void OverlayUserGroup::userDestroyed(QObject *obj) { OverlayUser *ou = qmUsers.take(obj); delete ou; } mumble-1.3.4/src/mumble/VoiceRecorderDialog.ui0000664000175000017500000001266414010707274021135 0ustar builderbuilder VoiceRecorderDialog 0 0 450 255 Recorder :/actions/media-record.svg:/actions/media-record.svg Control 20 50 false false 00:00:00 Qt::AlignCenter Qt::Horizontal QSizePolicy::Minimum 20 20 0 0 &Start false 0 0 S&top Mode true Downmix true true Multichannel Qt::Vertical 20 40 Output Output format Target directory Filename &Browse... MUComboBox QComboBox
widgets/MUComboBox.h
mumble-1.3.4/src/mumble/Audio.cpp0000664000175000017500000001736614010707273016473 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "Audio.h" #include "AudioInput.h" #include "AudioOutput.h" #include "CELTCodec.h" #include "OpusCodec.h" #include "Global.h" #include "PacketDataStream.h" class CodecInit : public DeferInit { public: void initialize(); void destroy(); }; #define DOUBLE_RAND (rand()/static_cast(RAND_MAX)) LoopUser LoopUser::lpLoopy; CodecInit ciInit; void CodecInit::initialize() { #ifdef USE_OPUS OpusCodec *oCodec = new OpusCodec(); if (oCodec->isValid()) { oCodec->report(); g.oCodec = oCodec; } else { qWarning("CodecInit: Failed to load Opus, it will not be available for encoding/decoding audio."); delete oCodec; } #endif if (g.s.bDisableCELT) { // Kill switch for CELT activated. Do not initialize it. return; } CELTCodec *codec = NULL; #ifdef USE_SBCELT codec = new CELTCodecSBCELT(); if (codec->isValid()) { codec->report(); g.qmCodecs.insert(codec->bitstreamVersion(), codec); } else { delete codec; } #else codec = new CELTCodec070(QLatin1String("0.7.0")); if (codec->isValid()) { codec->report(); g.qmCodecs.insert(codec->bitstreamVersion(), codec); } else { delete codec; codec = new CELTCodec070(QLatin1String("0.0.0")); if (codec->isValid()) { codec->report(); g.qmCodecs.insert(codec->bitstreamVersion(), codec); } else { delete codec; } } codec = new CELTCodec011(QLatin1String("0.11.0")); if (codec->isValid()) { codec->report(); g.qmCodecs.insert(codec->bitstreamVersion(), codec); } else { delete codec; codec = new CELTCodec011(QLatin1String("2.0.0")); if (codec->isValid()) { codec->report(); g.qmCodecs.insert(codec->bitstreamVersion(), codec); } else { delete codec; } } #endif } void CodecInit::destroy() { #ifdef USE_OPUS delete g.oCodec; #endif foreach(CELTCodec *codec, g.qmCodecs) delete codec; g.qmCodecs.clear(); } LoopUser::LoopUser() { qsName = QLatin1String("Loopy"); uiSession = 0; iId = 0; bMute = bDeaf = bSuppress = false; bLocalIgnore = bLocalMute = bSelfDeaf = false; tsState = Settings::Passive; cChannel = NULL; qtTicker.start(); qtLastFetch.start(); } void LoopUser::addFrame(const QByteArray &packet) { if (DOUBLE_RAND < g.s.dPacketLoss) { qWarning("Drop"); return; } { QMutexLocker l(&qmLock); bool restart = (qtLastFetch.elapsed() > 100); double time = qtTicker.elapsed(); double r; if (restart) r = 0.0; else r = DOUBLE_RAND * g.s.dMaxPacketDelay; qmPackets.insert(static_cast(time + r), packet); } // Restart check if (qtLastFetch.elapsed() > 100) { AudioOutputPtr ao = g.ao; if (ao) { MessageHandler::UDPMessageType msgType = static_cast((packet.at(0) >> 5) & 0x7); ao->addFrameToBuffer(this, QByteArray(), 0, msgType); } } } void LoopUser::fetchFrames() { QMutexLocker l(&qmLock); AudioOutputPtr ao(g.ao); if (!ao || qmPackets.isEmpty()) { return; } double cmp = qtTicker.elapsed(); QMultiMap::iterator i = qmPackets.begin(); while (i != qmPackets.end()) { if (i.key() > cmp) break; int iSeq; const QByteArray &data = i.value(); PacketDataStream pds(data.constData(), data.size()); unsigned int msgFlags = static_cast(pds.next()); pds >> iSeq; QByteArray qba; qba.reserve(pds.left() + 1); qba.append(static_cast(msgFlags)); qba.append(pds.dataBlock(pds.left())); MessageHandler::UDPMessageType msgType = static_cast((msgFlags >> 5) & 0x7); ao->addFrameToBuffer(this, qba, iSeq, msgType); i = qmPackets.erase(i); } qtLastFetch.restart(); } RecordUser::RecordUser() : LoopUser() { qsName = QLatin1String("Recorder"); } RecordUser::~RecordUser() { AudioOutputPtr ao = g.ao; if (ao) ao->removeBuffer(this); } void RecordUser::addFrame(const QByteArray &packet) { AudioOutputPtr ao(g.ao); if (!ao) return; int iSeq; PacketDataStream pds(packet.constData(), packet.size()); unsigned int msgFlags = static_cast(pds.next()); pds >> iSeq; QByteArray qba; qba.reserve(pds.left() + 1); qba.append(static_cast(msgFlags)); qba.append(pds.dataBlock(pds.left())); MessageHandler::UDPMessageType msgType = static_cast((msgFlags >> 5) & 0x7); ao->addFrameToBuffer(this, qba, iSeq, msgType); } void Audio::startOutput(const QString &output) { g.ao = AudioOutputRegistrar::newFromChoice(output); if (g.ao) g.ao->start(QThread::HighPriority); } void Audio::stopOutput() { // Take a copy of the global AudioOutput shared pointer // to keep a reference around. AudioOutputPtr ao = g.ao; // Reset the global AudioOutput shared pointer to the null pointer. g.ao.reset(); // Wait until our copy of the AudioOutput shared pointer (ao) // is the only one left. while (ao.get() && ! ao.unique()) { QThread::yieldCurrentThread(); } // Reset our copy of the AudioOutput shared pointer. // This causes the AudioOutput destructor to be called // right here in this function, on the main thread. // Our audio backends expect this to happen. // // One such example is PulseAudioInput, whose destructor // takes the PulseAudio mainloop lock. If the destructor // is called inside one of the PulseAudio callbacks that // take copies of g.ai, the destructor will try to also // take the mainloop lock, causing an abort(). ao.reset(); } void Audio::startInput(const QString &input) { g.ai = AudioInputRegistrar::newFromChoice(input); if (g.ai) g.ai->start(QThread::HighestPriority); } void Audio::stopInput() { // Take a copy of the global AudioInput shared pointer // to keep a reference around. AudioInputPtr ai = g.ai; // Reset the global AudioInput shared pointer to the null pointer. g.ai.reset(); // Wait until our copy of the AudioInput shared pointer (ai) // is the only one left. while (ai.get() && ! ai.unique()) { QThread::yieldCurrentThread(); } // Reset our copy of the AudioInput shared pointer. // This causes the AudioInput destructor to be called // right here in this function, on the main thread. // Our audio backends expect this to happen. // // One such example is PulseAudioInput, whose destructor // takes the PulseAudio mainloop lock. If the destructor // is called inside one of the PulseAudio callbacks that // take copies of g.ai, the destructor will try to also // take the mainloop lock, causing an abort(). ai.reset(); } void Audio::start(const QString &input, const QString &output) { startInput(input); startOutput(output); } void Audio::stop() { // Take copies of the global AudioInput and AudioOutput // shared pointers to keep a reference to each of them // around. AudioInputPtr ai = g.ai; AudioOutputPtr ao = g.ao; // Reset the global AudioInput and AudioOutput shared pointers // to the null pointer. g.ao.reset(); g.ai.reset(); // Wait until our copies of the AudioInput and AudioOutput shared pointers // (ai and ao) are the only ones left. while ((ai.get() && ! ai.unique()) || (ao.get() && ! ao.unique())) { QThread::yieldCurrentThread(); } // Reset our copies of the AudioInput and AudioOutput // shared pointers. // This causes the AudioInput and AudioOutput destructors // to be called right here in this function, on the main // thread. Our audio backends expect this to happen. // // One such example is PulseAudioInput, whose destructor // takes the PulseAudio mainloop lock. If the destructor // is called inside one of the PulseAudio callbacks that // take copies of g.ai, the destructor will try to also // take the mainloop lock, causing an abort(). ai.reset(); ao.reset(); } mumble-1.3.4/src/mumble/TaskList.h0000664000175000017500000000071514010707273016623 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_TASK_LIST_H_ #define MUMBLE_MUMBLE_TASK_LIST_H_ class TaskList { public: static void addToRecentList(QString name, QString user, QString host, int port); }; #endif // TASK_LIST_H_ mumble-1.3.4/src/mumble/LookConfig.h0000664000175000017500000000235114010707273017115 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_LOOKCONFIG_H_ #define MUMBLE_MUMBLE_LOOKCONFIG_H_ #include "ConfigDialog.h" #include "ThemeInfo.h" #include "ui_LookConfig.h" class QFileSystemWatcher; class QTimer; class LookConfig : public ConfigWidget, Ui::LookConfig { private: Q_OBJECT Q_DISABLE_COPY(LookConfig) public: LookConfig(Settings &st); virtual QString title() const Q_DECL_OVERRIDE; virtual QIcon icon() const Q_DECL_OVERRIDE; public slots: void accept() const Q_DECL_OVERRIDE; void save() const Q_DECL_OVERRIDE; void load(const Settings &r) Q_DECL_OVERRIDE; void themeDirectoryChanged(); private: /// Reload themes combobox and select given configuredStyle in it void reloadThemes(const boost::optional configuredStyle); /// Timer to prevent change event floods from triggering theme reloads QTimer *m_themeDirectoryDebouncer; /// Watcher to keep theme list up to date with user theme directory QFileSystemWatcher* m_themeDirectoryWatcher; }; #endif mumble-1.3.4/src/mumble/LookConfig.ui0000664000175000017500000004607414010707273017315 0ustar builderbuilder LookConfig 0 0 702 611 Form Look and Feel Language to use (requires restart) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. Theme 0 0 Theme to use to style the user interface <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. Show transmit mode dropdown in toolbar Apply some high contrast optimizations for visually impaired users Optimize for high contrast Qt::Vertical 20 40 Language qcbLanguage Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Tray Icon Hide the main Mumble window in the tray when it is minimized. <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> Hide in tray when minimized Displays talking status in system tray Show talking status in tray icon Qt::Vertical 20 40 Qt::Horizontal 40 20 Application Always On Top This setting controls when the application will be always on top. This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. Never Always In minimal view In normal view Adds user and channel context menus into the menu bar Show context menu in menu bar Ask whether to close or minimize when quitting Mumble. <b>If set, will verify you want to quit if connected.</b> Ask on quit while connected <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. Enable Developer menu When in custom layout mode, checking this disables rearranging. Lock layout Channel Tree Channel Dragging This changes the behavior when moving channels. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. User Dragging This changes the behavior when moving users. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. Expand When to automatically expand channels This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. List users above subchannels (requires restart). <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. Users above Channels Show number of users in each channel Show channel user count Use selected item as the chat bar target Filter automatically hides empty channels Layout 0 0 skin:layout_hybrid.svg false 0 0 Hybrid 64 64 0 0 Custom skin:layout_custom.svg 0 0 Stacked 64 64 0 0 Classic 64 64 Qt::Horizontal 40 20 0 0 skin:layout_classic.svg 0 0 skin:layout_stacked.svg Qt::Horizontal 40 20 Qt::Horizontal 40 20 Qt::Horizontal 40 20 Qt::Horizontal 40 20 MUComboBox QComboBox
widgets/MUComboBox.h
mumble-1.3.4/src/mumble/WinGUIDs.cpp0000664000175000017500000000160714010707274017013 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include #include #include #include #include #include #include #include #include #include #include #ifdef _INC_FUNCTIONDISCOVERYKEYS # undef _INC_FUNCTIONDISCOVERYKEYS #endif #include #include #include DEFINE_GUID(IID_IVistaAudioSessionControl2, 0x33969B1DL, 0xD06F, 0x4281, 0xB8, 0x37, 0x7E, 0xAA, 0xFD, 0x21, 0xA9, 0xC0); DEFINE_GUID(IID_IAudioSessionQuery, 0x94BE9D30L, 0x53AC, 0x4802, 0x82, 0x9C, 0xF1, 0x3E, 0x5A, 0xD3, 0x47, 0x75); mumble-1.3.4/src/mumble/AudioWizard.cpp0000664000175000017500000003751014010707273017645 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "AudioWizard.h" #include "AudioInput.h" #include "AudioOutputSample.h" #include "Log.h" #include "MainWindow.h" // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" CompletablePage::CompletablePage(QWizard *p) : QWizardPage(p) { bComplete = true; } void CompletablePage::setComplete(bool b) { bComplete = b; emit completeChanged(); } bool CompletablePage::isComplete() const { return bComplete; } AudioWizard::AudioWizard(QWidget *p) : QWizard(p) { bInit = true; bLastActive = false; g.bInAudioWizard = true; ticker = new QTimer(this); ticker->setObjectName(QLatin1String("Ticker")); setupUi(this); // Done qcbUsage->setChecked(g.s.bUsage); // Device if (AudioInputRegistrar::qmNew) { foreach(AudioInputRegistrar *air, *AudioInputRegistrar::qmNew) { qcbInput->addItem(air->name); if (air->name == AudioInputRegistrar::current) { qcbInput->setCurrentIndex(qcbInput->count() - 1); qcbEcho->setEnabled(air->canEcho(qcbOutput->currentText())); } QList ql= air->getDeviceChoices(); } } if (qcbInput->count() < 2) { qcbInput->setEnabled(false); } qcbEcho->setChecked(g.s.bEcho); if (AudioOutputRegistrar::qmNew) { foreach(AudioOutputRegistrar *aor, *AudioOutputRegistrar::qmNew) { qcbOutput->addItem(aor->name); if (aor->name == AudioOutputRegistrar::current) { qcbOutput->setCurrentIndex(qcbOutput->count() - 1); bDelay = aor->usesOutputDelay(); qcbAttenuateOthers->setEnabled(aor->canMuteOthers()); } QList ql= aor->getDeviceChoices(); } } if (qcbOutput->count() < 2) { qcbOutput->setEnabled(false); } qcbHighContrast->setChecked(g.s.bHighContrast); on_qcbHighContrast_clicked(g.s.bHighContrast); #ifdef Q_OS_WIN // On windows we can autodetect this qcbHighContrast->setVisible(false); #endif // Settings if (g.s.iQuality == 16000 && g.s.iFramesPerPacket == 6) qrbQualityLow->setChecked(true); else if (g.s.iQuality == 40000 && g.s.iFramesPerPacket == 2) qrbQualityBalanced->setChecked(true); else if (g.s.iQuality == 72000 && g.s.iFramesPerPacket == 1) qrbQualityUltra->setChecked(true); else qrbQualityCustom->setChecked(true); quint32 iMessage = Settings::LogNone; for (int i = Log::firstMsgType;i <= Log::lastMsgType; ++i) { iMessage |= (g.s.qmMessages[i] & (Settings::LogSoundfile | Settings::LogTTS)); } #ifdef USE_NO_TTS qrbNotificationCustom->setChecked(false); qrbNotificationCustom->setDisabled(true); qrbNotificationTTS->setChecked(false); qrbNotificationTTS->setDisabled(true); qrbNotificationSounds->setChecked(true); #else if (iMessage == Settings::LogTTS && g.s.bTTS) qrbNotificationTTS->setChecked(true); else if (iMessage == Settings::LogSoundfile) qrbNotificationSounds->setChecked(true); else // If we find mixed message types or only tts with main tts disable assume custom qrbNotificationCustom->setChecked(true); qrbNotificationCustom->setVisible(qrbNotificationCustom->isChecked()); #endif qrbQualityCustom->setVisible(qrbQualityCustom->isChecked()); qlQualityCustom->setVisible(qrbQualityCustom->isChecked()); qcbPositional->setChecked(g.s.bPositionalAudio); qcbAttenuateOthers->setChecked(g.s.bAttenuateOthers); on_qcbInput_activated(qcbInput->currentIndex()); on_qcbOutput_activated(qcbOutput->currentIndex()); abAmplify->qcBelow = Qt::blue; abAmplify->qcInside = Qt::green; abAmplify->qcAbove = Qt::red; // Trigger foreach(const Shortcut &s, g.s.qlShortcuts) { if (s.iIndex == g.mw->gsPushTalk->idx) { skwPTT->setShortcut(s.qlButtons); break; } } if (g.s.atTransmit == Settings::PushToTalk) qrPTT->setChecked(true); else if (g.s.vsVAD == Settings::Amplitude) qrAmplitude->setChecked(true); else qrSNR->setChecked(true); abVAD->qcBelow = Qt::red; abVAD->qcInside = Qt::yellow; abVAD->qcAbove = Qt::green; qsVAD->setValue(iroundf(g.s.fVADmax * 32767.f + 0.5f)); // Positional qcbHeadphone->setChecked(g.s.bPositionalHeadphone); fAngle = 0.0f; fX = fY = 0.0f; qgsScene = NULL; qgiSource = NULL; aosSource = NULL; qgvView->scale(1.0f, -1.0f); qgvView->viewport()->installEventFilter(this); // Volume qsMaxAmp->setValue(g.s.iMinLoudness); // Device Tuning qsOutputDelay->setValue(g.s.iOutputDelay); on_qsOutputDelay_valueChanged(qsOutputDelay->value()); setOption(QWizard::NoCancelButton, false); resize(700, 500); updateTriggerWidgets(qrPTT->isChecked()); sOldSettings = g.s; g.s.lmLoopMode = Settings::Local; g.s.dPacketLoss = 0.0; g.s.dMaxPacketDelay = 0.0; g.s.bMute = true; g.s.bDeaf = false; bTransmitChanged = false; iMaxPeak = 0; iTicks = 0; qpTalkingOn = QPixmap::fromImage(QImage(QLatin1String("skin:talking_on.svg")).scaled(64,64)); qpTalkingOff = QPixmap::fromImage(QImage(QLatin1String("skin:talking_off.svg")).scaled(64,64)); bInit = false; connect(this, SIGNAL(currentIdChanged(int)), this, SLOT(showPage(int))); ticker->setSingleShot(false); ticker->start(20); } bool AudioWizard::eventFilter(QObject *obj, QEvent *evt) { if ((evt->type() == QEvent::MouseButtonPress) || (evt->type() == QEvent::MouseMove)) { QMouseEvent *qme = dynamic_cast(evt); if (qme) { if (qme->buttons() & Qt::LeftButton) { QPointF qpf = qgvView->mapToScene(qme->pos()); fX = static_cast(qpf.x()); fY = static_cast(qpf.y()); } } } return QWizard::eventFilter(obj, evt); } void AudioWizard::on_qcbInput_activated(int) { qcbInputDevice->clear(); if (! AudioInputRegistrar::qmNew) return; AudioInputRegistrar *air = AudioInputRegistrar::qmNew->value(qcbInput->currentText()); QList ql = air->getDeviceChoices(); foreach(audioDevice d, ql) { qcbInputDevice->addItem(d.first, d.second); } qcbInputDevice->setEnabled(ql.count() > 1); on_qcbInputDevice_activated(0); } void AudioWizard::on_qcbInputDevice_activated(int) { if (bInit) return; if (! AudioInputRegistrar::qmNew) return; Audio::stopInput(); AudioInputRegistrar *air = AudioInputRegistrar::qmNew->value(qcbInput->currentText()); int idx = qcbInputDevice->currentIndex(); if (idx > -1) { air->setDeviceChoice(qcbInputDevice->itemData(idx), g.s); } qcbEcho->setEnabled(air->canEcho(qcbOutput->currentText())); g.ai = AudioInputPtr(air->create()); g.ai->start(QThread::HighestPriority); } void AudioWizard::on_qcbOutput_activated(int) { qcbOutputDevice->clear(); if (! AudioOutputRegistrar::qmNew) return; AudioOutputRegistrar *aor = AudioOutputRegistrar::qmNew->value(qcbOutput->currentText()); QList ql = aor->getDeviceChoices(); foreach(audioDevice d, ql) { qcbOutputDevice->addItem(d.first, d.second); } qcbAttenuateOthers->setEnabled(aor->canMuteOthers()); qcbOutputDevice->setEnabled(ql.count() > 1); on_qcbOutputDevice_activated(0); } void AudioWizard::on_qcbOutputDevice_activated(int) { if (bInit) return; if (! AudioOutputRegistrar::qmNew) return; Audio::stopOutput(); AudioOutputRegistrar *aor = AudioOutputRegistrar::qmNew->value(qcbOutput->currentText()); int idx = qcbOutputDevice->currentIndex(); if (idx > -1) { aor->setDeviceChoice(qcbOutputDevice->itemData(idx), g.s); bDelay = aor->usesOutputDelay(); } AudioInputRegistrar *air = AudioInputRegistrar::qmNew->value(qcbInput->currentText()); qcbEcho->setEnabled(air->canEcho(qcbOutput->currentText())); g.ao = AudioOutputPtr(aor->create()); g.ao->start(QThread::HighPriority); } void AudioWizard::on_qsOutputDelay_valueChanged(int v) { qlOutputDelay->setText(tr("%1 ms").arg(v*10)); g.s.iOutputDelay = v; restartAudio(); } void AudioWizard::on_qsMaxAmp_valueChanged(int v) { g.s.iMinLoudness = qMin(v, 30000); } void AudioWizard::showPage(int pageid) { if (pageid == -1) return; CompletablePage *cp = qobject_cast(currentPage()); AudioOutputPtr ao = g.ao; if (ao) ao->wipe(); aosSource = NULL; g.bPosTest = false; if (cp == qwpIntro) { g.s.bMute = true; } else if (cp == qwpDone) { g.s.bMute = true; } else if (cp == qwpDeviceTuning) { g.s.bMute = true; playChord(); } else if (cp == qwpPositional) { fX = fY = 0.0f; g.s.bMute = true; g.bPosTest = true; if (qgsScene) { delete qgsScene; qgiSource = NULL; qgsScene = NULL; } playChord(); } else { g.s.bMute = false; } if ((cp == qwpTrigger) || (cp == qwpSettings)) { if (! bTransmitChanged) g.s.atTransmit = sOldSettings.atTransmit; else if (qrPTT->isChecked()) g.s.atTransmit = Settings::PushToTalk; else g.s.atTransmit = Settings::VAD; } else { g.s.atTransmit = Settings::Continuous; } } int AudioWizard::nextId() const { AudioOutputPtr ao = g.ao; int nextid = QWizard::nextId(); if (currentPage() == qwpSettings && ! g.s.bPositionalAudio) nextid++; else if ((currentPage() == qwpDevice) && ! bDelay) nextid++; return nextid; } void AudioWizard::playChord() { AudioOutputPtr ao = g.ao; if (! ao || aosSource || bInit) return; aosSource = ao->playSample(QLatin1String(":/wb_male.oga"), true); } void AudioWizard::restartAudio() { aosSource = NULL; Audio::stop(); g.s.qsAudioInput = qcbInput->currentText(); g.s.qsAudioOutput = qcbOutput->currentText(); Audio::start(); if (qgsScene) { delete qgsScene; qgiSource = NULL; qgsScene = NULL; } if ((currentPage() == qwpPositional) || (currentPage() == qwpDeviceTuning)) playChord(); } void AudioWizard::reject() { g.s = sOldSettings; g.s.lmLoopMode = Settings::None; restartAudio(); AudioOutputPtr ao = g.ao; if (ao) ao->wipe(); aosSource = NULL; g.bInAudioWizard = false; QWizard::reject(); } void AudioWizard::accept() { if (! bTransmitChanged) g.s.atTransmit = sOldSettings.atTransmit; else if (qrPTT->isChecked()) g.s.atTransmit = Settings::PushToTalk; else g.s.atTransmit = Settings::VAD; g.s.bMute = sOldSettings.bMute; g.s.bDeaf = sOldSettings.bDeaf; g.s.lmLoopMode = Settings::None; // Switch TTS<->Sounds according to user selection if (!qrbNotificationCustom->isChecked()) { Settings::MessageLog mlReplace = qrbNotificationTTS->isChecked() ? Settings::LogSoundfile : Settings::LogTTS; for (int i = Log::firstMsgType;i <= Log::lastMsgType; ++i) { if (g.s.qmMessages[i] & mlReplace) g.s.qmMessages[i] ^= Settings::LogSoundfile | Settings::LogTTS; } if (qrbNotificationTTS->isChecked()) { g.s.bTTS = true; g.mw->qaAudioTTS->setChecked(true); } } g.s.bUsage = qcbUsage->isChecked(); g.bPosTest = false; restartAudio(); g.bInAudioWizard = false; QWizard::accept(); } bool AudioWizard::validateCurrentPage() { if (currentId() == 1) { if ((qcbInput->currentIndex() < 0) || (qcbOutput->currentIndex() < 0)) return false; } return true; } void AudioWizard::on_Ticker_timeout() { AudioInputPtr ai = g.ai; AudioOutputPtr ao = g.ao; if (! ai || ! ao) return; int iPeak = static_cast(ai->dMaxMic); if (iTicks++ >= 50) { iMaxPeak = 0; iTicks = 0; } if (iPeak > iMaxPeak) iMaxPeak = iPeak; abAmplify->iBelow = qsMaxAmp->value(); abAmplify->iValue = iPeak; abAmplify->iPeak = iMaxPeak; abAmplify->update(); abVAD->iBelow = iroundf(g.s.fVADmin * 32767.0f + 0.5f); abVAD->iAbove = iroundf(g.s.fVADmax * 32767.0f + 0.5f); if (g.s.vsVAD == Settings::Amplitude) { abVAD->iValue = iroundf((32767.f/96.0f) * (96.0f + ai->dPeakCleanMic) + 0.5f); } else { abVAD->iValue = iroundf(ai->fSpeechProb * 32767.0f + 0.5f); } abVAD->update(); bool active = ai->isTransmitting(); if (active != bLastActive) { bLastActive = active; qlTalkIcon->setPixmap(active ? qpTalkingOn : qpTalkingOff); } if (! qgsScene) { unsigned int nspeaker = 0; const float *spos = ao->getSpeakerPos(nspeaker); if ((nspeaker > 0) && spos) { qgsScene = new QGraphicsScene(QRectF(-4.0f, -4.0f, 8.0f, 8.0f), this); qgsScene->addEllipse(QRectF(-0.12f, -0.12f, 0.24f, 0.24f), QPen(Qt::black), QBrush(Qt::darkRed)); for (unsigned int i=0;iaddEllipse(QRectF(spos[3*i] - 0.1f, spos[3*i+2] - 0.1f, 0.2f, 0.2f), QPen(Qt::black), QBrush(Qt::yellow)); } qgiSource = qgsScene->addEllipse(QRectF(-.15f, -.15f, 0.3f, 0.3f), QPen(Qt::black), QBrush(Qt::green)); qgvView->setScene(qgsScene); qgvView->fitInView(-4.0f, -4.0f, 8.0f, 8.0f, Qt::KeepAspectRatio); } } else if (currentPage() == qwpPositional) { float xp, yp; if ((fX == 0.0f) && (fY == 0.0f)) { fAngle += 0.05f; xp = sinf(fAngle) * 2.0f; yp = cosf(fAngle) * 2.0f; } else { xp = fX; yp = fY; } qgiSource->setPos(xp, yp); if (aosSource) { aosSource->fPos[0] = xp; aosSource->fPos[1] = 0; aosSource->fPos[2] = yp; } } } void AudioWizard::on_qsVAD_valueChanged(int v) { if (! bInit) { g.s.fVADmax = static_cast(v) / 32767.0f; g.s.fVADmin = g.s.fVADmax * 0.9f; } } void AudioWizard::on_qrSNR_clicked(bool on) { if (on) { g.s.vsVAD = Settings::SignalToNoise; g.s.atTransmit = Settings::VAD; updateTriggerWidgets(false); bTransmitChanged = true; } } void AudioWizard::on_qrAmplitude_clicked(bool on) { if (on) { g.s.vsVAD = Settings::Amplitude; g.s.atTransmit = Settings::VAD; updateTriggerWidgets(false); bTransmitChanged = true; } } void AudioWizard::on_qrPTT_clicked(bool on) { if (on) { g.s.atTransmit = Settings::PushToTalk; updateTriggerWidgets(true); bTransmitChanged = true; } } void AudioWizard::on_skwPTT_keySet(bool valid, bool last) { if (valid) qrPTT->setChecked(true); else if (qrPTT->isChecked()) qrAmplitude->setChecked(true); updateTriggerWidgets(valid); bTransmitChanged = true; if (last) { const QList &buttons = skwPTT->getShortcut(); QList ql; bool found = false; foreach(Shortcut s, g.s.qlShortcuts) { if (s.iIndex == g.mw->gsPushTalk->idx) { if (buttons.isEmpty()) continue; else if (! found) { s.qlButtons = buttons; found = true; } } ql << s; } if (! found && ! buttons.isEmpty()) { Shortcut s; s.iIndex = g.mw->gsPushTalk->idx; s.bSuppress = false; s.qlButtons = buttons; ql << s; } g.s.qlShortcuts = ql; GlobalShortcutEngine::engine->bNeedRemap = true; GlobalShortcutEngine::engine->needRemap(); } } void AudioWizard::on_qcbEcho_clicked(bool on) { g.s.bEcho = on; restartAudio(); } void AudioWizard::on_qcbHeadphone_clicked(bool on) { g.s.bPositionalHeadphone = on; restartAudio(); } void AudioWizard::on_qcbPositional_clicked(bool on) { g.s.bPositionalAudio = on; g.s.bTransmitPosition = on; restartAudio(); } void AudioWizard::updateTriggerWidgets(bool ptt) { qwVAD->setEnabled(!ptt); qwpTrigger->setComplete(!ptt || (skwPTT->qlButtons.count() > 0)); } void AudioWizard::on_qcbAttenuateOthers_clicked(bool checked) { g.s.bAttenuateOthers = checked; } void AudioWizard::on_qcbHighContrast_clicked(bool on) { g.s.bHighContrast = on; qliAmpTuningText->setVisible(!g.s.bHighContrast); qliAmpTuningTextHC->setVisible(g.s.bHighContrast); qliVolumeTuningText->setVisible(!g.s.bHighContrast); qliVolumeTuningTextHC->setVisible(g.s.bHighContrast); qliVadTuningText->setVisible(!g.s.bHighContrast); qliVadTuningTextHC->setVisible(g.s.bHighContrast); } void AudioWizard::on_qrbQualityLow_clicked() { g.s.iQuality = 16000; g.s.iFramesPerPacket = 6; restartAudio(); } void AudioWizard::on_qrbQualityBalanced_clicked() { g.s.iQuality = 40000; g.s.iFramesPerPacket = 2; restartAudio(); } void AudioWizard::on_qrbQualityUltra_clicked() { g.s.iQuality = 72000; g.s.iFramesPerPacket = 1; restartAudio(); } void AudioWizard::on_qrbQualityCustom_clicked() { g.s.iQuality = sOldSettings.iQuality; g.s.iFramesPerPacket = sOldSettings.iFramesPerPacket; restartAudio(); } mumble-1.3.4/src/mumble/OverlayClient.cpp0000664000175000017500000004207614010707273020206 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "OverlayClient.h" #include "OverlayPositionableItem.h" #include "OverlayEditor.h" #include "OverlayText.h" #include "User.h" #include "Channel.h" #include "Message.h" #include "Database.h" #include "NetworkConfig.h" #include "ServerHandler.h" #include "MainWindow.h" #include "GlobalShortcut.h" #include "Themes.h" // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" OverlayClient::OverlayClient(QLocalSocket *socket, QObject *p) : QObject(p) , framesPerSecond(0) , ougUsers(&g.s.os) , iMouseX(0) , iMouseY(0) { qlsSocket = socket; qlsSocket->setParent(NULL); connect(qlsSocket, SIGNAL(readyRead()), this, SLOT(readyRead())); omMsg.omh.iLength = -1; smMem = NULL; uiWidth = uiHeight = 0; uiPid = ~0ULL; bWasVisible = false; bDelete = false; qgv.setScene(&qgs); qgv.installEventFilter(this); qgv.viewport()->installEventFilter(this); // Make sure it has a native window id qgv.winId(); qgpiCursor = new OverlayMouse(); qgpiCursor->hide(); qgpiCursor->setZValue(10.0f); ougUsers.setZValue(-1.0f); qgs.addItem(&ougUsers); ougUsers.show(); qgpiFPS = new OverlayPositionableItem(&g.s.os.qrfFps); qgs.addItem(qgpiFPS); qgpiFPS->setPos(g.s.os.qrfFps.x(), g.s.os.qrfFps.y()); qgpiFPS->show(); // Time qgpiTime = new OverlayPositionableItem(&g.s.os.qrfTime); qgs.addItem(qgpiTime); qgpiTime->setPos(g.s.os.qrfTime.x(), g.s.os.qrfTime.y()); qgpiTime->show(); qgpiLogo = NULL; iOffsetX = iOffsetY = 0; connect(&qgs, SIGNAL(changed(const QList &)), this, SLOT(changed(const QList &))); } OverlayClient::~OverlayClient() { delete qgpiFPS; delete qgpiTime; delete qgpiCursor; delete qgpiLogo; qlsSocket->disconnectFromServer(); if (!qlsSocket->waitForDisconnected(1000)) { qDebug() << "OverlayClient: Failed to cleanly disconnect: " << qlsSocket->errorString(); qlsSocket->abort(); } qlsSocket->deleteLater(); ougUsers.reset(); } bool OverlayClient::eventFilter(QObject *o, QEvent *e) { if (e->type() == QEvent::Paint) { e->accept(); return true; } return QObject::eventFilter(o, e); } void OverlayClient::updateFPS() { if (g.s.os.bFps) { const BasepointPixmap &pm = OverlayTextLine( QString(QLatin1String("%1")).arg(iroundf(framesPerSecond + 0.5f)), g.s.os.qfFps).createPixmap(g.s.os.qcFps); qgpiFPS->setVisible(true); qgpiFPS->setPixmap(pm); // offset to use basepoint //TODO: settings are providing a top left anchor, so shift down by ascent qgpiFPS->setOffset(-pm.qpBasePoint + QPoint(0, pm.iAscent)); qgpiFPS->updateRender(); } else { qgpiFPS->setVisible(false); } } void OverlayClient::updateTime() { if (g.s.os.bTime) { const BasepointPixmap &pm = OverlayTextLine(QString(QLatin1String("%1")).arg(QTime::currentTime().toString()), g.s.os.qfFps).createPixmap(g.s.os.qcFps); qgpiTime->setVisible(true); qgpiTime->setPixmap(pm); qgpiTime->setOffset(-pm.qpBasePoint + QPoint(0, pm.iAscent)); qgpiTime->updateRender(); } else { qgpiTime->setVisible(false); } } #if !defined(Q_OS_MAC) || (defined(Q_OS_MAC) && defined(USE_MAC_UNIVERSAL)) void OverlayClient::updateMouse() { #if defined(Q_OS_WIN) QPixmap pm; HICON c = ::GetCursor(); #if QT_VERSION < 0x050000 if (c == NULL) c = qgv.viewport()->cursor().handle(); #endif ICONINFO info; ZeroMemory(&info, sizeof(info)); if (c != NULL && ::GetIconInfo(c, &info)) { #if QT_VERSION >= 0x050000 extern QPixmap qt_pixmapFromWinHBITMAP(HBITMAP bitmap, int format = 0); #else # define qt_pixmapFromWinHBITMAP(bmp) QPixmap::fromWinHBITMAP(bmp) #endif if (info.hbmColor) { pm = qt_pixmapFromWinHBITMAP(info.hbmColor); pm.setMask(QBitmap(qt_pixmapFromWinHBITMAP(info.hbmMask))); } else { QBitmap orig(qt_pixmapFromWinHBITMAP(info.hbmMask)); QImage img = orig.toImage(); int h = img.height() / 2; int w = img.bytesPerLine() / sizeof(quint32); QImage out(img.width(), h, QImage::Format_MonoLSB); QImage outmask(img.width(), h, QImage::Format_MonoLSB); for (int i=0;i(img.scanLine(i + h)); const quint32 *srcmask = reinterpret_cast(img.scanLine(i)); quint32 *dstimg = reinterpret_cast(out.scanLine(i)); quint32 *dstmask = reinterpret_cast(outmask.scanLine(i)); for (int j=0;jsetPixmap(pm); #else #endif qgpiCursor->setPos(iMouseX - iOffsetX, iMouseY - iOffsetY); } #endif #if QT_VERSION < 0x050000 && (defined(Q_OS_WIN) || defined(Q_OS_MAC)) extern bool Q_GUI_EXPORT qt_use_native_dialogs; #endif // Qt gets very very unhappy if we embed or unmbed the widget that an event is called from. // This means that if any modal dialog is open, we'll be in a event loop of an object // that we're about to reparent. void OverlayClient::showGui() { #if defined(QT3_SUPPORT) || (defined(Q_OS_WIN) && QT_VERSION < 0x050000) if (QCoreApplication::loopLevel() > 1) return; #else int count = 0; { QWidgetList widgets = qApp->topLevelWidgets(); foreach(QWidget *w, widgets) { if (w->isHidden() && (w != g.mw)) continue; count++; } } // If there's more than one window up, we're likely deep in a message loop. if (count > 1) return; #endif g.ocIntercept = this; bWasVisible = ! g.mw->isHidden(); if (bWasVisible) { if (g.s.bMinimalView) { g.s.qbaMinimalViewGeometry = g.mw->saveGeometry(); g.s.qbaMinimalViewState = g.mw->saveState(); } else { g.s.qbaMainWindowGeometry = g.mw->saveGeometry(); g.s.qbaMainWindowState = g.mw->saveState(); g.s.qbaHeaderState = g.mw->qtvUsers->header()->saveState(); } } { outer: QWidgetList widgets = qApp->topLevelWidgets(); widgets.removeAll(g.mw); widgets.prepend(g.mw); foreach(QWidget *w, widgets) { if (w->graphicsProxyWidget() == NULL) { if ((w == g.mw) || (! w->isHidden())) { QGraphicsProxyWidget *qgpw = new QGraphicsProxyWidget(NULL, Qt::Window); qgpw->setOpacity(0.90f); qgpw->setWidget(w); if (w == g.mw) { qgpw->setPos(uiWidth / 10, uiHeight / 10); qgpw->resize((uiWidth * 8) / 10, (uiHeight * 8) / 10); } qgs.addItem(qgpw); qgpw->show(); qgpw->setActive(true); goto outer; } } } } QEvent activateEvent(QEvent::WindowActivate); qApp->sendEvent(&qgs, &activateEvent); QPoint p = QCursor::pos(); iMouseX = qBound(0, p.x(), uiWidth-1); iMouseY = qBound(0, p.y(), uiHeight-1); qgpiCursor->setPos(iMouseX, iMouseY); qgs.setFocus(); #ifndef Q_OS_MAC g.mw->qteChat->activateWindow(); #endif g.mw->qteChat->setFocus(); qgv.setAttribute(Qt::WA_WState_Hidden, false); qApp->setActiveWindow(&qgv); qgv.setFocus(); ougUsers.bShowExamples = true; #ifdef Q_OS_MAC qApp->setAttribute(Qt::AA_DontUseNativeMenuBar); g.mw->setUnifiedTitleAndToolBarOnMac(false); if (! g.s.os.qsStyle.isEmpty()) qApp->setStyle(g.s.os.qsStyle); #endif setupScene(true); #if QT_VERSION < 0x050000 && (defined(Q_OS_WIN) || defined(Q_OS_MAC)) qt_use_native_dialogs = false; #endif OverlayMsg om; om.omh.uiMagic = OVERLAY_MAGIC_NUMBER; om.omh.uiType = OVERLAY_MSGTYPE_INTERACTIVE; om.omh.iLength = sizeof(struct OverlayMsgInteractive); om.omin.state = true; qlsSocket->write(om.headerbuffer, sizeof(OverlayMsgHeader) + om.omh.iLength); g.o->updateOverlay(); } void OverlayClient::hideGui() { #if defined(QT3_SUPPORT) || (defined(Q_OS_WIN) && QT_VERSION < 0x050000) if (QCoreApplication::loopLevel() > 1) { QCoreApplication::exit_loop(); QMetaObject::invokeMethod(this, "hideGui", Qt::QueuedConnection); return; } #endif ougUsers.bShowExamples = false; QList widgetlist; foreach(QGraphicsItem *qgi, qgs.items(Qt::DescendingOrder)) { QGraphicsProxyWidget *qgpw = qgraphicsitem_cast(qgi); if (qgpw && qgpw->widget()) { QWidget *w = qgpw->widget(); qgpw->setVisible(false); widgetlist << w; } } foreach(QWidget *w, widgetlist) { QGraphicsProxyWidget *qgpw = w->graphicsProxyWidget(); if (qgpw) { qgpw->setVisible(false); qgpw->setWidget(NULL); delete qgpw; } } if (g.ocIntercept == this) g.ocIntercept = NULL; foreach(QWidget *w, widgetlist) { if (bWasVisible) w->show(); } if (bWasVisible) { if (g.s.bMinimalView && ! g.s.qbaMinimalViewGeometry.isNull()) { g.mw->restoreGeometry(g.s.qbaMinimalViewGeometry); g.mw->restoreState(g.s.qbaMinimalViewState); } else if (! g.s.bMinimalView && ! g.s.qbaMainWindowGeometry.isNull()) { g.mw->restoreGeometry(g.s.qbaMainWindowGeometry); g.mw->restoreState(g.s.qbaMainWindowState); } } #ifdef Q_OS_MAC qApp->setAttribute(Qt::AA_DontUseNativeMenuBar, false); g.mw->setUnifiedTitleAndToolBarOnMac(true); Themes::apply(); #endif setupScene(false); qgv.setAttribute(Qt::WA_WState_Hidden, true); #if QT_VERSION < 0x050000 && (defined(Q_OS_WIN) || defined(Q_OS_MAC)) qt_use_native_dialogs = true; #endif OverlayMsg om; om.omh.uiMagic = OVERLAY_MAGIC_NUMBER; om.omh.uiType = OVERLAY_MSGTYPE_INTERACTIVE; om.omh.iLength = sizeof(struct OverlayMsgInteractive); om.omin.state = false; qlsSocket->write(om.headerbuffer, sizeof(OverlayMsgHeader) + om.omh.iLength); g.o->updateOverlay(); if (bDelete) deleteLater(); } void OverlayClient::scheduleDelete() { bDelete = true; hideGui(); } void OverlayClient::readyReadMsgInit(unsigned int length) { if (length != sizeof(OverlayMsgInit)) { return; } OverlayMsgInit *omi = & omMsg.omi; uiWidth = omi->uiWidth; uiHeight = omi->uiHeight; qrLast = QRect(); delete smMem; smMem = new SharedMemory2(this, uiWidth * uiHeight * 4); if (! smMem->data()) { qWarning() << "OverlayClient: Failed to create shared memory" << uiWidth << uiHeight; delete smMem; smMem = NULL; return; } QByteArray key = smMem->name().toUtf8(); key.append(static_cast(0)); OverlayMsg om; om.omh.uiMagic = OVERLAY_MAGIC_NUMBER; om.omh.uiType = OVERLAY_MSGTYPE_SHMEM; om.omh.iLength = key.length(); Q_ASSERT(sizeof(om.oms.a_cName) >= static_cast(key.length())); // Name should be auto-generated and short memcpy(om.oms.a_cName, key.constData(), key.length()); qlsSocket->write(om.headerbuffer, sizeof(OverlayMsgHeader) + om.omh.iLength); setupRender(); Overlay *o = static_cast(parent()); QTimer::singleShot(0, o, SLOT(updateOverlay())); } void OverlayClient::readyRead() { while (true) { quint64 ready = static_cast(qlsSocket->bytesAvailable()); if (omMsg.omh.iLength == -1) { if (ready < sizeof(OverlayMsgHeader)) { break; } else { qlsSocket->read(omMsg.headerbuffer, sizeof(OverlayMsgHeader)); if ((omMsg.omh.uiMagic != OVERLAY_MAGIC_NUMBER) || (omMsg.omh.iLength < 0) || (omMsg.omh.iLength > static_cast(sizeof(OverlayMsgShmem)))) { disconnect(); return; } ready -= sizeof(OverlayMsgHeader); } } if (ready >= static_cast(omMsg.omh.iLength)) { qint64 length = qlsSocket->read(omMsg.msgbuffer, omMsg.omh.iLength); if (length != omMsg.omh.iLength) { disconnect(); return; } switch (omMsg.omh.uiType) { case OVERLAY_MSGTYPE_INIT: { readyReadMsgInit(static_cast(length)); } break; case OVERLAY_MSGTYPE_SHMEM: { if (smMem) smMem->systemRelease(); } break; case OVERLAY_MSGTYPE_PID: { if (length != static_cast(sizeof(OverlayMsgPid))) break; OverlayMsgPid *omp = & omMsg.omp; uiPid = omp->pid; #ifdef Q_OS_WIN HANDLE h = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, (DWORD)uiPid); if (h) { wchar_t buf[MAX_PATH]; if (GetModuleFileNameEx(h, 0, buf, MAX_PATH) != 0) { qsExecutablePath = QString::fromWCharArray(buf); } CloseHandle(h); } #else qsExecutablePath = QLatin1String("Unknown"); #endif } break; case OVERLAY_MSGTYPE_FPS: { if (length != sizeof(OverlayMsgFps)) break; OverlayMsgFps *omf = & omMsg.omf; framesPerSecond = omf->fps; //qWarning() << "FPS: " << omf->fps; Overlay *o = static_cast(parent()); QTimer::singleShot(0, o, SLOT(updateOverlay())); } break; default: break; } omMsg.omh.iLength = -1; } else { break; } } } void OverlayClient::reset() { if (! uiWidth || ! uiHeight || ! smMem) return; delete qgpiLogo; qgpiLogo = NULL; ougUsers.reset(); setupScene(g.ocIntercept == this); } void OverlayClient::setupScene(bool show) { if (show) { qgs.setBackgroundBrush(QColor(0,0,0,64)); if (! qgpiLogo) { qgpiLogo = new OverlayMouse(); qgpiLogo->hide(); qgpiLogo->setOpacity(0.8f); qgpiLogo->setZValue(-5.0f); QImageReader qir(QLatin1String("skin:mumble.svg")); QSize sz = qir.size(); sz.scale(uiWidth, uiHeight, Qt::KeepAspectRatio); qir.setScaledSize(sz); qgpiLogo->setPixmap(QPixmap::fromImage(qir.read())); QRectF qrf = qgpiLogo->boundingRect(); qgpiLogo->setPos(iroundf((uiWidth - qrf.width()) / 2.0f + 0.5f), iroundf((uiHeight - qrf.height()) / 2.0f + 0.5f)); } qgpiCursor->show(); qgs.addItem(qgpiCursor); qgpiLogo->show(); qgs.addItem(qgpiLogo); } else { qgs.setBackgroundBrush(Qt::NoBrush); if (qgpiCursor->scene()) qgs.removeItem(qgpiCursor); qgpiCursor->hide(); if (qgpiLogo) { if (qgpiLogo->scene()) qgs.removeItem(qgpiLogo); qgpiLogo->hide(); } } ougUsers.updateUsers(); updateFPS(); updateTime(); } void OverlayClient::setupRender() { qgs.setSceneRect(0, 0, uiWidth, uiHeight); qgv.setScene(NULL); qgv.setGeometry(-2, -2, uiWidth + 2, uiHeight + 2); qgv.viewport()->setGeometry(0, 0, uiWidth, uiHeight); qgv.setScene(&qgs); smMem->erase(); OverlayMsg om; om.omh.uiMagic = OVERLAY_MAGIC_NUMBER; om.omh.uiType = OVERLAY_MSGTYPE_BLIT; om.omh.iLength = sizeof(OverlayMsgBlit); om.omb.x = 0; om.omb.y = 0; om.omb.w = uiWidth; om.omb.h = uiHeight; qlsSocket->write(om.headerbuffer, sizeof(OverlayMsgHeader) + sizeof(OverlayMsgBlit)); reset(); } bool OverlayClient::update() { if (! uiWidth || ! uiHeight || ! smMem) return true; ougUsers.updateUsers(); updateFPS(); updateTime(); if (qlsSocket->bytesToWrite() > 1024) { return (t.elapsed() <= 5000000ULL); } else { t.restart(); return true; } } void OverlayClient::changed(const QList ®ion) { if (region.isEmpty()) return; qlDirty.append(region); QMetaObject::invokeMethod(this, "render", Qt::QueuedConnection); } void OverlayClient::render() { const QList region = qlDirty; qlDirty.clear(); if (! uiWidth || ! uiHeight || ! smMem) return; QRect active; QRectF dirtyf; if (region.isEmpty()) return; foreach(const QRectF &r, region) { dirtyf |= r; } QRect dirty = dirtyf.toAlignedRect(); dirty = dirty.intersected(QRect(0,0,uiWidth, uiHeight)); if ((dirty.width() <= 0) || (dirty.height() <= 0)) return; QRect target = dirty; target.moveTo(0,0); QImage img(reinterpret_cast(smMem->data()), uiWidth, uiHeight, QImage::Format_ARGB32_Premultiplied); QImage qi(target.size(), QImage::Format_ARGB32_Premultiplied); qi.fill(0); QPainter p; p.begin(&qi); p.setRenderHints(p.renderHints(), false); p.setCompositionMode(QPainter::CompositionMode_SourceOver); qgs.render(&p, target, dirty, Qt::IgnoreAspectRatio); p.end(); p.begin(&img); p.setRenderHints(p.renderHints(), false); p.setCompositionMode(QPainter::CompositionMode_Source); p.drawImage(dirty.x(), dirty.y(), qi); p.end(); if (dirty.isValid()) { OverlayMsg om; om.omh.uiMagic = OVERLAY_MAGIC_NUMBER; om.omh.uiType = OVERLAY_MSGTYPE_BLIT; om.omh.iLength = sizeof(OverlayMsgBlit); om.omb.x = dirty.x(); om.omb.y = dirty.y(); om.omb.w = dirty.width(); om.omb.h = dirty.height(); qlsSocket->write(om.headerbuffer, sizeof(OverlayMsgHeader) + sizeof(OverlayMsgBlit)); } if (qgpiCursor->isVisible()) { active = QRect(0,0,uiWidth,uiHeight); } else { active = qgs.itemsBoundingRect().toAlignedRect(); if (active.isEmpty()) active = QRect(0,0,0,0); active = active.intersected(QRect(0,0,uiWidth,uiHeight)); } if (active != qrLast) { qrLast = active; OverlayMsg om; om.omh.uiMagic = OVERLAY_MAGIC_NUMBER; om.omh.uiType = OVERLAY_MSGTYPE_ACTIVE; om.omh.iLength = sizeof(OverlayMsgActive); om.oma.x = qrLast.x(); om.oma.y = qrLast.y(); om.oma.w = qrLast.width(); om.oma.h = qrLast.height(); qlsSocket->write(om.headerbuffer, sizeof(OverlayMsgHeader) + sizeof(OverlayMsgActive)); } qlsSocket->flush(); } void OverlayClient::openEditor() { OverlayEditor oe(g.mw, &ougUsers); connect(&oe, SIGNAL(applySettings()), this, SLOT(updateLayout())); oe.exec(); } mumble-1.3.4/src/mumble/Log.h0000664000175000017500000000665614010707273015620 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_LOG_H_ #define MUMBLE_MUMBLE_LOG_H_ #include #include #include #include "ConfigDialog.h" #include "ui_Log.h" class TextToSpeech; class LogConfig : public ConfigWidget, public Ui::LogConfig { private: Q_OBJECT Q_DISABLE_COPY(LogConfig) public: enum Column { ColMessage, ColConsole, ColNotification, ColHighlight, ColTTS, ColStaticSound, ColStaticSoundPath }; LogConfig(Settings &st); QString title() const Q_DECL_OVERRIDE; QIcon icon() const Q_DECL_OVERRIDE; public slots: void accept() const Q_DECL_OVERRIDE; void save() const Q_DECL_OVERRIDE; void load(const Settings &) Q_DECL_OVERRIDE; void on_qtwMessages_itemChanged(QTreeWidgetItem*, int); void on_qtwMessages_itemClicked(QTreeWidgetItem*, int); void on_qtwMessages_itemDoubleClicked(QTreeWidgetItem*, int); void browseForAudioFile(); }; class ClientUser; class Channel; class Log : public QObject { friend class LogConfig; private: Q_OBJECT Q_DISABLE_COPY(Log) public: enum MsgType { DebugInfo, CriticalError, Warning, Information, ServerConnected, ServerDisconnected, UserJoin, UserLeave, Recording, YouKicked, UserKicked, SelfMute, OtherSelfMute, YouMuted, YouMutedOther, OtherMutedOther, ChannelJoin, ChannelLeave, PermissionDenied, TextMessage, SelfUnmute, SelfDeaf, SelfUndeaf, UserRenamed, SelfChannelJoin, SelfChannelJoinOther, ChannelJoinConnect, ChannelLeaveDisconnect, PrivateTextMessage }; enum LogColorType { Time, Server, Privilege, Source, Target }; static const MsgType firstMsgType = DebugInfo; static const MsgType lastMsgType = PrivateTextMessage; // Display order in settingsscreen, allows to insert new events without breaking config-compatibility with older versions. static const MsgType msgOrder[]; protected: QHash qmIgnore; static const char *msgNames[]; static const char *colorClasses[]; TextToSpeech *tts; unsigned int uiLastId; QDate qdDate; static const QStringList allowedSchemes(); void postNotification(MsgType mt, const QString &plain); void postQtNotification(MsgType mt, const QString &plain); public: Log(QObject *p = NULL); QString msgName(MsgType t) const; void setIgnore(MsgType t, int ignore = 1 << 30); void clearIgnore(); static QString validHtml(const QString &html, QTextCursor *tc = NULL); static QString imageToImg(const QByteArray &format, const QByteArray &image); static QString imageToImg(QImage img); static QString msgColor(const QString &text, LogColorType t); static QString formatClientUser(ClientUser *cu, LogColorType t, const QString &displayName=QString()); static QString formatChannel(::Channel *c); public slots: void log(MsgType t, const QString &console, const QString &terse=QString(), bool ownMessage = false); }; class LogDocument : public QTextDocument { private: Q_OBJECT Q_DISABLE_COPY(LogDocument) public: LogDocument(QObject *p = NULL); QVariant loadResource(int, const QUrl &) Q_DECL_OVERRIDE; public slots: void finished(); }; class LogDocumentResourceAddedEvent : public QEvent { public: static const QEvent::Type Type = static_cast(20145); LogDocumentResourceAddedEvent(); }; #endif mumble-1.3.4/src/mumble/mumble_zh_TW.ts0000664000175000017500000130400514010707274017661 0ustar builderbuilder ACLEditor Deny 拒絕 Allow 允許 Allow %1 允許 %1 Deny %1 拒絕 %1 Mumble - Add channel Mumble - 新增頻道 Default server value 伺服器預設值 Failed: Invalid channel 失敗: 無效的頻道 Mumble - Edit %1 Mumble - 編輯 %1 ID: %1 ID: %1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 授予 %1 權限.如果一個權限同時被拒絕和允許,則視為被拒絕。<br />%2 Channel must have a name 頻道必須指定一個名稱 This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 撤銷 %1 權限.如果一個權限同時被拒絕和允許,則視為被拒絕。<br />%2 Dialog 對話框 Name 名稱 Enter the channel name here. 在此輸入頻道名稱。 Description 描述 Password 密碼 Enter the channel password here. 在此輸入頻道密碼。 Check to create a temporary channel. 點此建立臨時頻道。 Temporary 臨時頻道 <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. 這個數值讓您改變頻道在 Mumble 清單樹的部署位置。當頻道擁有較小的數值時,將被放在比較上面的位置,如果有多個頻道擁有相同數值時,將依頻道名稱做排序。 Position 順位 &Groups 群組(&G) Group 群組 List of groups 群組清單 Remove selected group 刪除群組 Remove 刪除 Inherit group members from parent 繼承自父組成員 Inherit 繼承 Make group inheritable to sub-channels 使群組可被子頻道繼承 Inheritable 可繼承 Group was inherited from parent channel 繼承自父頻道的群組 Inherited 繼承的 Members 成員 Add 新增 Add member to group 新增群組成員 Remove member from group 刪除群組成員 &ACL 存取控制表(&A) Active ACLs 目前的存取控制規則 List of entries 存取規則列表 Inherit ACL of parent? 繼承自父存取控制表? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. 設定是否將父頻道的存取控制表套用至當前對象。只有在父頻道內被標記為“套用到子頻道”的項目將被繼承。 Inherit ACLs 繼承存取控制表 Move entry up 上移規則順位 This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. 在列表中上移規則順位。由於規則自上而下依序處理,這有可能改變使用者的有效權限。你不能將一個項目移到繼承的項目之上,如果你確實想這麼做,你需要複製繼承的規則。 &Up 上移(&U) Move entry down 下移規則順位 This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. 在列表中下移規則順位。由於規則自上而下依序處理,這有可能改變使用者的有效權限。 &Down 下移(&D) Add new entry 新增規則 This adds a new entry, initially set with no permissions and applying to all. 新增規則,預設值為無權限且套用到所有項目。 &Add 新增(&A) Remove entry 刪除規則 This removes the currently selected entry. 刪除選取的規則。 &Remove 刪除(&R) Context 前後關系 Entry should apply to this channel. Entry should apply to this channel 輸入的內容將應用於此頻道。 This makes the entry apply to this channel. 指定規則到目前頻道。 Applies to this channel 使用在目前頻道 Entry should apply to sub-channels. 使用在子頻道的規則。 Add new group 新增群組 <b>Add</b><br/> Add a new group. <b>新增</b><br/> 新增群組。 Inherited members 繼承的成員 Contains the list of members added to the group by this channel. 顯示被頻道加入群組的成員。 Contains a list of members whose group membership will not be inherited from the parent channel. 顯示不繼承父頻道的成員。 Contains the list of members inherited by other channels. 顯示繼承其他頻道的成員。 Type in the name of a user you wish to add to the group and click Add. 輸入欲移入本群組的使用者名稱並點選新增。 Type in the name of a user you wish to remove from the group and click Add. 輸入欲移出本群組的使用者名稱並點選移除。 Exclude 拒絕 Excluded members 排除的成員 This makes the entry apply to sub-channels of this channel. 使用該規則到目前頻道的子頻道。 Applies to sub-channels 套用到子頻道 Permissions 權限 User/Group 使用者/群組 Group this entry applies to 套用該規則的群組 User ID 使用者名稱 User this entry applies to 使用該規則的使用者 This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. 控制該規則應用到哪個使用者。請向伺服器送出使用者名稱來查詢。 &Properties 屬性(&P) <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>名稱</b><br />在此輸入頻道名稱。此名稱必須符合連線伺服器的使用規則。 <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>臨時頻道</b><br /> 選擇後將建立一個臨時頻道。這表示當最後一個使用者離開的時候,本頻道將自動關閉。 <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>群組</b><br /> 這些是頻道內已設定好的群組。要建立新群組,只要輸入名稱並送出即可。 <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>刪除</b><br />刪除選擇的群組。如果本群組是被繼承的,那將不會在此清單中消失,但是所有關於此群組的資訊將被清除。 <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>繼承</b><br />如果父群組被標記為<i>可繼承</i>則此群組的所有成員將來自父群組。 <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>可繼承</b><br/>使本群組可繼承到子頻道。如果群組不可繼承,則子頻道可以建立一個同名群組。 <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>繼承</b><br/>表示群組設定來自父頻道,你無法編輯這個旗幟,它僅供參考。 <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>成員</b><br/>這份清單涵蓋目前頻道所有已加入群組的成員。請注意,這並未包含來自頻道樹中繼承自父頻道的成員。繼承自父頻道的成員可以在<i>繼承的成員</i>清單中找到。要防止這份清單被等級較低的頻道繼承,取消<i>可繼承</i>或手動增加到<i>排除的成員</i>名單。 <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. ID of the channel. 頻道名稱。 Maximum Users 使用者最大值 Maximum number of users allowed in the channel 頻道內可允許的最大使用者數量 <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. This is the sort order for the channel. ALSAAudioInput Default ALSA Card 預設 ALSA 音效卡 Opening chosen ALSA Input failed: %1 無法打開所選 ALSA 輸入: %1 ALSAAudioOutput Default ALSA Card 預設 ALSA 音效卡 Opening chosen ALSA Output failed: %1 無法打開所選 ALSA 輸出: %1 ASIOConfig %1 (version %2) %1 (版本 %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz %1 -> %2 取樣緩衝, 使用 %3 取樣解析度 (%4 優先) 在 %5 Hz ASIO Initialization failed: %1 ASIO初始化失敗: %1 Failed to instantiate ASIO driver 無法初始化 ASIO 驅動 ASIO ASIO Device selection 選擇裝置 Device 裝置 Device to use for microphone 作為麥克風的裝置 This chooses what device to query. You still need to actually query the device and select which channels to use. 選擇要查詢的裝置。你仍需要實際查詢該裝置然後選擇要使用哪些聲道。 Query selected device 查詢所選裝置 This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. 查詢所選裝置的聲道。注意大多數 ASIO 驅動有極端漏洞,查詢裝置可能導致應用程式或系統當機。 &Query 查詢(&Q) Configure selected device 設定選則的裝置 This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. 設定選擇的裝置。注意大多數 ASIO 驅動有極端漏洞,查詢裝置可能導致應用程式或系統當機。 &Configure 設定(&C) Capabilities 裝置訊息 Driver name 裝置名稱 Buffer size 緩重區大小 This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. Configure input channels 設定輸入頻道 Channels 頻道 Microphone 麥克風 <- -> Unused 未使用 Speakers 喇叭 ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. 你至少要選擇一個麥克風和一個喇叭來使用 ASIO.如果你只要使用要麥克風進行取樣,請使用 DirectSound. Opening selected ASIO device failed. No input will be done. 無法打開所選 ASIO 裝置。沒有可用輸入。 AboutDialog About Mumble 關於 Mumble <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> <h3>Mumble (%1)</h3><p>%3</p><p><b>為玩家而生的語音工具</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble 關於 Mumble(&A) &License 授權(&L) A&uthors &Third-Party Licenses OK 確定 AudioInput Interface 界面 System 系統 Input method for audio 音源輸入 <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>這是用於聲音的輸入方式。</b><br />也許你想使用 DirectSound。 Device 裝置 Input device for audio 語音輸入裝置 <b>This is the input device to use for audio.</b> 這是用來輸入語音的裝置 Transmission 語音發送 &Transmit 語音發送時機(&T) When to transmit your speech 何時發送你的語音 <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. <b>設置何時語音將被發送。</b><br /><i>連續</i>一直<br /><i>有語音活動</i> 當你說話清晰時。<br /><i>按鍵通話</i> - 當你按住作為<i>快捷鍵</i>的自定義按鍵組合時。 DoublePush Time 兩次按鍵時間間隔 If you press the PTT key twice in this time it will get locked. 如果你在時限內連按兩次發送鍵將會鎖定。 <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. <b>連點時間</b><br />如果你在設定時間內連按兩次發送鍵將會鎖定並持續發送語音,直到你再按一次發送鍵才會解鎖。 Reset audio cue to default 重設指示音效成預設值 <b>Reset</b><br/>Reset the paths for the files to their default. <b>重設</b><br/>重設檔案路徑成預設值。 Browse for on audio file 選擇開始發送語音時的音效 Browse for off audio file 選擇停止發送語音時的音效 Off 停止發送時 On 開始發送時 Preview the audio cues 預覽語音發送指示音效 Use SNR based speech detection 使用基於 SNR(訊噪比) 的語音偵測 Signal to Noise 訊噪比 <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. <b>設置使用振幅來進行語音偵測。</b><br />在此模式下,輸入信號的原始強度被用於語音偵測。 Amplitude 振幅 Voice &Hold 持續時間(&H) How long to keep transmitting after silence 無聲後多少時間內繼續發送音效 Silence Below 以下沉默 <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. <b>設置語音檢測的觸發值。</b><br />與音訊統計窗口一起來使用該值以手工調整語音偵測的觸發值。輸入值低於"靜音判定" 時視為無聲。高於"語音判定"時視為講話中。如果你正在講話,期間的偵測值會被一直視為講話中,但是不會觸發一個新的偵測。 Speech Above 語音判定 Signal values above this count as voice 信號值高於這個值時視為語音 Compression 壓縮 &Quality 品質(&Q) Quality of compression (peak bandwidth) 壓縮品質(峰值頻寬) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. <b>設定壓縮品質。</b><br />決定 Mumble 發送語音時使用的頻寬大小。 Audio per packet 封包音框數 How many audio frames to send per packet 每個封包發送多少音框 <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>選擇一個封包裡放多少個音框。</b><br />增加這個數值會增加你的語音延遲,但也會減少頻寬需求。 <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). <b>顯示發送語音佔用的頻寬。</b><br />顯示從你的機器發送時佔用的頻寬大小。 Audio Processing 音效處理 Noise Suppression 雜訊抑制 Noise suppression 雜訊抑制 <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. Maximum amplification of input sound 輸入聲音的最大放大率 <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. <b>輸入的最大放大率。</b><br />Mumble 在壓縮前會規格化輸入音量,該選項設置音量被允許放大多少。<br />實際等級將根據你的語音模式來持續更新,但是不會高于這里指定的等級。<br />如果音頻統計的<i>麥克風響度</i>等級在 100%左右,你很有可能想把該值設為大約 2.0,但是如果像大多數人一樣,你不能達到 100%,設置一個更高的值。<br />理想狀態下,設置該值使<i>麥克風響度 * 放大率 >= 100</i>,甚至當你相當輕聲的講話時。<br /><br />注意設置該值為其最大值不會有任何副作用,但是如果你將該值設為自動調節到其最大值, Mumble 會開始拾取其他人的談話。 Current speech detection chance 目前語音偵測頻率 Cancel echo from speakers 取消聲音共鳴 Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. Disabled 停用 <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>設置使用訊噪比來進行語音偵測。</b><br /> 在此模式下,將從輸入中尋找並分析出一個近似清晰的信號,而這個信號的清晰度被用於觸發語音偵測。 <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>顯示目前語音偵測設定。</b><br />你能在設定對話框或音頻精靈裡修改目前設定。 Signal values below this count as silence 訊號小於此值時視為靜音 Maximum bandwidth used for sending audio 發送語音時可用的最大頻寬 Use Amplitude based speech detection 使用基於振幅的語音檢測 <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). Exclusive mode 排除模式 <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>選擇的裝置將使用獨占模式。</b><br />獨占時其他應用程式將無法使用此裝置。 Exclusive 獨占模式 R&eset 重設(&E) &Browse... 瀏覽(&B)... B&rowse... 瀏覽(&r)... &Preview 預覽(&P) <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. <b>預覽</b>播放目前<i>開始</i>音效接著播放目前<i>停止</i>音效。 Displays an always on top window with a push to talk button in it 按鍵發話鈕永遠顯示在最上層 Display push to talk window 顯示按鍵發話視窗 Misc 雜項 Audible audio cue when starting or stopping to transmit 當開始或停止傳送時發出聽得見的提示音效 <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. Audio cue 提示音效 Gets played when starting to transmit 開始發送時播放 Gets played when stopping to transmit 停止發送時播放 Hold Time 保持時間 Time the microphone stays open after the PTT key is released 隨按即說鍵放開後保持麥克風持續開啟的時間 Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) 伺服器最大可用頻寬為 %1 kbit/s,語音品質自動調整為 %2 kbit/s (%3 毫秒) Max. Amplification 放大上限 Idle action 閒置動作 minutes do 分鐘後 nothing 無動作 deafen 靜音 mute 關閉麥克風 after 經過 Echo Cancellation 取消回音 Mixed echo cancellation 取消混聲回音 Multichannel echo cancellation 取消多重頻道混音 The idle action will be reversed upon any key or mouse button input Undo Idle action upon activity Apply RNNoise's noise suppression filter. <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. RNNoise Audio input AudioInputDialog Continuous 連續 Voice Activity 語音活動 Push To Talk 按鍵發話 Audio Input 音效輸入 %1 ms %1 毫秒 Off 關閉 %1 s %1 秒 %1 kb/s %1 kb/s -%1 dB -%1 分貝 %1 kbit/s (Audio %2, Position %4, Overhead %3) %1 kbit/s (音效 %2, 位置 %4, 傳輸耗消 %3) AudioOutput Interface 界面 System 系統 Output method for audio 音效輸出方式 <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>音效輸出的方式。</b><br />也許你想使用 DirectSound。 Device 裝置 Output device for audio 音效輸出使用的裝置 <b>This is the output device to use for audio.</b> <b>音效輸出使用的裝置。</b> Positional Audio 聲音定位 Audio Output 音效輸出 Default &Jitter Buffer 預設語音緩衝(&J) Safety margin for jitter buffer 語音緩衝的安全邊界 <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. <b>設定語音的最小值。</b><br />緩衝機制在於強化語音品質,克服延遲抖動(Jitter)與封包丟失(Packet Drop)等網路損壞情況。設定緩衝區的最小值。如果你聽到的語音起始部分是顫音,請增加這個值。 Minimum distance to user before sound volume decreases This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. <b>啟用一個迴路測試模式.</b><br /><i>不使用</i> - 停用迴路<br /><i>本地伺服器</i> - 模擬一台本地伺服器.<br /><i>伺服器</i> - 連接到伺服器執行測試<br />請注意,執行迴路測試時其他使用者將不會聽到你的聲音,離開時此設定值將不會被儲存。 Volume 語音音量 Volume of incoming speech 收到語音的音量 <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. <b>調整收到語音的音量。</b><br />注意如果此數值超過 100%,聲音會失真。 Output Delay 輸出延遲 Amount of data to buffer 語音緩衝大小 The connected "speakers" are actually headphones The connected "speakers" are actually headphones. 使用耳機 Factor for sound volume decrease 音量減弱因子 Bloom 音量增強 Factor for sound volume increase 音量增強因子 How much should sound volume increase for sources that are really close? 當音源距離過近時音量增強上限? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. 選擇此項表示你使用的揚聲器是耳機而非喇叭。這很重要,因為喇叭通常放置在你面前,而耳機直接在你左右。 This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Headphones 耳機 Minimum Distance 最小距離 Maximum Distance 最大距離 Maximum distance, beyond which speech volume won't decrease 超過最大距離時音量將不再減弱 Minimum Volume 最小音量 What should the volume be at the maximum distance? 位於最大距離時的音量大小? Loopback Test 迴路測試 Delay Variance 封包延遲 Variance in packet latency 封包延遲變化量 <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>設置回路測試時的延遲時間變化量。</b><br />大多數音效路徑含有一定的延遲。該選項允許你設置回路測試模式時的參數。例如,如果你設置該值為 15毫秒,將模擬一個 20-35毫秒延遲或一個 80-95毫秒延遲的網路。大多數國內網路的延遲方差啊大概是5毫秒. Packet Loss 封包遺失 Packet loss for loopback mode 回路模式的封包遺失 <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% <b>設定回路模式的封包遺失。</b><br />該值為遺失率。除非你的出外的頻寬達到滿載或者你的網路連接有問題,該值會是 0% &Loopback 迴路(&L) Desired loopback mode 回路模式 Attenuate applications by... 干擾抑制... Attenuation of other applications during speech 講話時降低其他應用程式的音量 <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. If checked Mumble lowers the volume of other applications while other users talk 選用時,當其他使用者講話時 Mumble 將降低其他應用程式音量 <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. while other users talk 其他使用者發話時啟用 If checked Mumble lowers the volume of other applications while you talk 選用時,當你講話時 Mumble 將降低其他應用程式音量 <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. while you talk 自己講話時啟用 Exclusive mode, not recommended. 獨占模式,不推薦使用。 <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>選擇的裝置將使用獨占模式。</b><br />獨占時其他應用程式將無法使用此裝置。 Exclusive 獨占模式 Priority Speaker 優先講者 If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. Attenuate other users while talking as Priority Speaker. Advanced Attenuation Options 進階衰減設定 If checked, Mumble will only attenuate applications that are using the same output source as Mumble <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. Only attenuate applications using the same output device If checked, PulseAudio loopback modules will be attenuated <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. Attenuate PulseAudio loopback modules Audio output AudioOutputDialog None Local 本地 Server 伺服器 Audio Output 音效輸出 %1 ms %1 毫秒 %1 % %1 % %1 m %1 m AudioOutputSample Choose sound file 選擇音效檔 Invalid sound file 無效音效檔 The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. Mumble無法使用 %1 。請選擇可相容的檔案格式與編碼方式。 AudioStats >1000 ms >1000ms >1000毫秒 Audio Statistics 音效統計 Input Levels 輸入位準 Peak microphone level 麥克風位準 Peak power in last frame 最後遜框的尖峰傳輸率 This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. Peak speaker level 揚聲器位準 This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. Peak clean level 淨輸入位準 This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. Signal Analysis 訊號分析 Microphone power 麥克風功率 How close the current input level is to ideal 當前輸入級別離完美有多近 This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. Signal-To-Noise ratio 訊噪比 Signal-To-Noise ratio from the microphone 麥克風的信噪音比 This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. Speech Probability 語音的概率 Probability of speech 語音的概率 This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). Configuration feedback 設定回饋 Current audio bitrate 目前音效位元率 Bitrate of last frame 最後音效訊框的位元率 DoublePush interval 兩次按鍵時間間隔 Time between last two Push-To-Talk presses 鎖定按鍵發話功能的時間間隔 Speech Detection 語音偵測 Current speech detection chance 目前語音偵測機率 <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>顯示目前語音偵測設定。</b><br />你能在設定對話框或音效精靈裡修改目前設定。 Signal and noise power spectrum 訊號和噪音功率頻譜 Power spectrum of input signal and noise estimate 輸入訊號和噪音估計的功率頻譜 This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. Echo Analysis 回音分析 Weights of the echo canceller 回聲抵消器的影響 This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. AudioWizard Audio Tuning Wizard 音效設定精靈 Introduction 介紹 Welcome to the Mumble Audio Wizard 歡迎使用 Mumble 音效精靈 Finished 完成 Enjoy using Mumble Mumble 祝您使用愉快 Device selection 選擇裝置 Selecting the input and output device to use with Mumble. 選擇 Mumble 用來輸入和輸出的裝置。 This is the device your microphone is connected to. 與麥克風連接的裝置。 System 系統 Input method for audio 音效輸入方法 <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>這是用於音效的輸入方法。</b><br />也許你想使用 DirectSound。 Device 裝置 Input device to use 使用的輸入裝置 <b>Selects which sound card to use for audio input.</b> <b>選擇用於音效輸入的音效卡。</b> Cancel echo from headset or speakers 抑制來自耳機或喇叭的回音 Use echo cancellation 使用迴音消除 This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. 啟用送出音效的迴音消除,這在喇叭和耳機上都有幫助。 This is the device your speakers or headphones are connected to. 與喇叭或耳機連接的裝置。 Output method for audio 音效輸出方式 <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>這是用來輸出音效的方法。</b><br />也許你希望使用 DirectSound。 Output device to use 使用的輸出裝置 <b>Selects which sound card to use for audio Output.</b> <b>選擇輸出音效的音效卡。</b> Enable positional audio 啟用音效定位 Allows positioning of sound Allows positioning of sound. 允許音效定位 <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> <p> 這是 Mumblr 音效設定精靈. 將協助您正確設定 Mumble 音效輸入位準與音效處理參數。 </p> <p> 請注意!設定精靈關閉前,你的聲音將只在本地播放,不會被發送到伺服器。 </p> Input Device 輸入裝置 Output Device 輸出裝置 This allows Mumble to use positional audio to place voices. 這允許 Mumble 使用聲音定位來放置語音。 <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> <p> 為了讓語音的延遲降到最低,我們希望音效卡中的緩衝越低越好。然而很多音效卡在極低的緩衝下看起來依舊在工作, 因此我們只能試出一個音效卡能接受的最小值。 </p> <p> 你會聽到一段音效樣本。拉動下方的滑桿,在音效不會中斷破碎或卡住的情況下,盡可能調低。 </p> Amount of data to buffer 緩衝資料大小 This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> <p> 打開你的錄音裝置控制面板,確定麥克風輸入已經啟用並將麥克風音量調到最大。如果有『麥克風增量』選項,請確認該選項已開啟。 </p> <p> 大聲說話,就像你破口大罵時的樣子。接者降低錄音裝置控制面板中的麥克風音量,使你正常說話時下方的音量條處於藍色與綠色部份盡可能接近紅色區塊的位置,但是又不會到達紅色區塊。 </p> Positional Audio 定位音頻 Adjusting attenuation of positional audio. 調節定位音頻的衰減量. <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> <p> Mumble 支援部份遊戲的聲音定位功能,對方的聲音聽起來就像在他們在遊戲中與你的相對位置。Mumble會調整左右喇叭的音量來模擬對方的位置。在使用聲音定位前需要在此正確的設定。 </p> <p> 圖示顯示 <font color="red">你</font>、<font color="yellow">你的喇叭</font>還有<font color="green">移動的音源</font>的相對位置。你應該可以聽到音效在左右聲道間移動。 </p> Use headphones instead of speakers 使用耳機而不是喇叭 <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> <p> 恭喜你,好好享受 Mumble 帶來的絕妙體驗吧! </p> <p> Mumble 尚在持續開發中,開發人員希望知道使用者的需求。Mumble 可以向開發人員發送匿名資料,這對日後的專案發展非常重要。 </p> Use headphones 使用耳機 This ignores the OS speaker configuration and configures the positioning for headphones instead. 這將忽略操作系統的揚聲器配置并為耳機配置音頻定位. Volume tuning 音量調節 Tuning microphone hardware volume to optimal settings. 調節麥克風硬件音量到最佳設置。 Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. 現在輕聲講話,就像你在深夜時不想打擾任何人一樣。調節下面的滑塊直到下面的進度條在你講話時進入綠區,在你停止說話的時停留在藍區。 Voice Activity Detection 語言活動檢測 Letting Mumble figure out when you're talking and when you're silent. 讓 Mumble 分辨出你是在說話還是保持安靜. This will help Mumble figure out when you are talking. The first step is selecting which data value to use. 這將幫助 Mumble 知道你是在講話。第一步是選擇用哪個數據值。 Raw amplitude from input 輸入的原始振幅 Signal-To-Noise ratio 信噪比 Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). 下一步你需要調節下面兩個滑塊。你最初講几句話時進度條應該停留在綠區(確定是講話)。當你講話時,進度條應該停留在黃區(可能是講話)﹔當你沒講話時,進度條應該停留在紅區(明確沒在講話). Device tuning 裝置調整 Changing hardware output delays to their minimum value. 修改硬體輸出延遲到最小值。 Submit anonymous statistics to the Mumble project 發送匿名統計給 Mumble 專案 Push To Talk: 按鍵發話: Quality & Notifications 品質與通知 Adjust quality and notification settings. 品質調整與通知設定。 Quality settings 品質設定 Low Balanced 平衡 Notification settings 通知設定 Use Text-To-Speech to read notifications and messages to you. 使用文字轉語音功能讀取給您的通知與訊息。 Disable Text-To-Speech and use sounds instead. 停用文字轉語音並使用音效代替。 %1 ms %1 毫秒 Enables attenuation of other applications while users talk to you 當使用者對你講話時降低其他程式的音量 Attenuate applications while other users talk 當 Mumble 偵測到通訊活動時降低其他應用程式音量 High Custom 自訂 You already set a customized quality configuration in Mumble. Select this setting to keep it. 如果您已自行設定 Mumble 的音質,請選擇此項不予更動設定。 Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. 當其他使用者對您發話時降低其他程式音量。這是只當有人在 Mumble 中向您發話時,其他執行中的程式(像是音樂播放器之類)將會被降低音量,使您能聽到更清楚的訊息。 Apply some high contrast optimizations for visually impaired users 允許視障使用者使用高對比色彩配置 Use high contrast graphics 使用高對比圖形 Keep custom Text-To-Speech settings. 維持文字轉語音的自訂方案。 <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode <p> 打開你的錄音裝置控制面板,確定麥克風輸入已經啟用並將麥克風音量調到最大。如果有『麥克風增量』選項,請確認該選項已開啟。 </p> <p> 大聲說話,就像你破口大罵時的樣子。接者降低你錄音裝置控制面板中的麥克風音量,使你正常說話時下方的音量條處於藍色與綠色部份盡可能接近紅色區塊的位置,但又不會到達紅色區塊。 </p> Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode 現在輕聲講話,就像你在深夜時不想打擾任何人一樣。調節下面的滑塊直到下面的進度條在你講話時進入綠區,而在你關閉麥克風時停留在藍區。 Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode 下一步你需要調節下面兩個滑塊。你最初講幾句話時進度條應該停留在綠區(確定是講話)。當你講話時,進度條應該停留在黃區(可能是講話)﹔當你沒講話時,進度條應該停留在紅區(明確沒在講話). In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) 選此設定 Mumble 會盡可能降低頻寬的使用量,這將提高音效延遲與降低語音品質,只在你的網路環境差到極點時才選擇此項。(16kbit/s,封包間隔60毫秒) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) 這是<b>推薦的預設選項</b>,它在音質、延遲與頻寬的使用上取得了一個很好的平衡。(40kbit/s,封包間隔20毫秒) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) 此選項只建議使用在頻寬充裕的環境,Mumble將提供最低延遲與最好的品質。(72kbit/s, 封包間隔10毫秒) BanEditor Mumble - Edit Bans Mumble - 編輯黑名單 &Address IP位置(&A) &Mask 子網路遮罩(&M) Reason 原因 Start 開始 End 結束 User 使用者 Hash 雜湊值 &Add 新增(&A) &Update 更新(&U) &Remove 刪除(&R) Ban List 封鎖名單 Search field 搜尋欄 This is the search field. Use it to find bans that have this username set in the username field. 這個是搜尋條件。用來搜尋並封鎖擁有相似文字片段的使用者名稱。 Who are you looking for? 你在找誰? No nickname 沒有暱稱 IP address IP 位置 No IP address 沒有 IP 位置 Reason for the ban 封鎖理由 No reason 沒有理由 Ban end date 封鎖結束時間 Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). 封鎖結束時間。如果開始與結束時間相同,表示永久封鎖 (將不會過期)。 Certificate hash 憑證雜湊值 No certificate hash 沒有憑證雜湊值 Banned users 被封鎖的使用者 This is a list with banned users. 這是封鎖使用者名單。 Use this button if you want to add a new ban. 點擊此新增封鎖對象。 Use this button if you want to update ban information. 點此更新封鎖資訊。 Use this button if you want to remove user from the ban list. 點此將使用者自封鎖名單中刪除。 Clear all fields 清除所有條件 This button clears all fields. Use it if you want to add a new ban. 本按鈕將清除所有條件。如果您需要增加封鎖對象請點擊此鈕。 Clear 清除 Ban List - %n Ban(s) 封鎖清單 - %n 封鎖 CertView Name 姓名 Email 電子郵件 Issuer 發行人 Expiry Date 有效期限 (none) (none) Self-signed 自簽名 CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. 無法驗證電子郵件。<br />輸入正確的電子信箱地址或留白繼續下一步。 There was an error generating your certificate.<br />Please try again. 產生憑證時發生錯誤。<br />請重試。 Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. 你的憑證與金鑰無法依 PKCS#12 格式輸出。也許你的憑證有誤。 The file could not be opened for writing. Please use another file. 無法寫入,請選擇其他檔案。 The file's permissions could not be set. No certificate and key has been written. Please use another file. 無法設定檔案權限。無法寫入憑證或密鑰。請更換檔案。 The file could not be written successfully. Please use another file. 寫入失敗,請選擇其他檔案。 The file could not be opened for reading. Please use another file. 檔案無法開啟或讀取,請選擇其他檔案。 The file is empty or could not be read. Please use another file. 此為空檔案或無法讀取,請選擇其他檔案。 The file did not contain a valid certificate and key. Please use another file. 檔案不含有效憑證與金鑰,請選擇其他檔案。 Select file to export certificate to 選擇導出憑證到 Select file to import certificate from 選擇匯入憑證自 Unable to import. Missing password or incompatible file type. <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. <b>憑證到期:</b> 您的憑證即將到期。你需要更新它,否則將不能夠連接到您已註冊的伺服器上。 Certificates Certificate Management 憑證管理 Certificate Authentication 憑證認證 Authenticating to servers without using passwords 連接伺服器不使用密碼驗證 Current certificate 目前的憑證 This is the certificate Mumble currently uses. Mumble 目前使用的憑證。 Current Certificate 目前的憑證 Create a new certificate 建立新憑證 This will create a new certificate. 此選項將建立新憑證。 Import certificate from file 從檔案匯入憑證 This will import a certificate from file. 此選項將匯入憑證。 Import a certificate 匯入憑證 Export Certificate 匯出憑證 This will export a certificate to file. 此選項將會出憑證至檔案。 Export current certificate 匯出目前憑證 Import Certificate 匯入憑證 PKCS #12 Certificate import 匯入 PKCS #12憑證 <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble 可以匯入 PKCS #12 格式的憑證。不只 Mumble 在匯出時使用這種格式,包含 Firefox、Internet Explorer 還有 Opera 等等也是使用這種格式。</p><p>如果憑證有設定保護密碼,當您匯入憑證時需要輸入該密碼。</p> Import from 匯入自 Filename to import from 匯入的檔案名稱 This is the filename you wish to import a certificate from. 你希望匯入的檔案名稱。 Select file to import from 選擇匯入的檔案來源 This opens a file selection dialog to choose a file to import a certificate from. 開啟對話框選擇即將匯入的憑證。 Open... 開啟... Password 密碼 Password for PKCS#12 file PKCS#12 檔案密碼 This is the password for the PKCS#12 file containing your certificate. 這是包含密碼的 PKCS#12 憑證。 Certificate to import 匯入的憑證 This is the certificate you are importing. 這是正在匯入的憑證。 Certificate Details 憑證詳細資訊 Replace Certificate 置換憑證 Replace existing certificate with new certificate? 使用新憑證置換現存憑證? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> This is the certificate Mumble currently uses. It will be replaced. 這是 Mumble正在使用的憑證,即將被置換。 New certificate 新憑證 This is the new certificate that will replace the old one. 就憑證將被置換為新憑證。 New Certificate 新憑證 Make a backup of your certificate 建立憑證備份 Export to 匯出到 Filename to export to 匯出的檔案名稱 This is the filename you wish to export a certificate to. 你希望匯出的檔案名稱。 Save As... 另存成... This is the certificate Mumble currently uses. It will be exported. 即將匯出 Mumble 目前使用的憑證。 Generate a new certificate for strong authentication 建立高強度憑證 <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> Name 名稱 Email Email Your email address (e.g. johndoe@mumble.info) 你的電子郵件位址 (例: johndoe@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. 你的電子信箱地址。這裡強烈建議您使用正確的信箱地址,以便讓您升級成高強度憑證免於認證問題。 Your name (e.g. John Doe) 你的姓名 (例:John Doe) This is your name, and will be filled out in the certificate. This field is entirely optional. 你的大名,將填寫於憑證中,此項目可留白。 Finish 完成 Certificate-based authentication is ready for use 以憑證為基礎的認證方式已經準備好可以使用了 Enjoy using Mumble with strong authentication. 在強驗證之下享受 Mumble。 Automatic certificate creation 自動建立憑證 <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> ChanACL None Traverse 路過 Enter 進入 Speak 發言 Mute/Deafen 關閉麥克風/關閉喇叭 Make channel 建立頻道 Make temporary 建立臨時頻道 Link channel 連接頻道 This represents no privileges. 這代表無特權。 This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. 允許完整控制頻道,包含變更群組與存取控制表資訊。本權限包含所有其他權限。 This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. 允許縱覽頻道。如果一個使用者缺乏此權限,即使他擁有子頻道的權限,也無法進入此頻道以及下屬之子頻道。 This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. 允許進入頻道。如果您擁有較高層次的頻道,您可能會讓使用者路過,但限制他們進入你的根頻道。 This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. 允許在頻道發言。使用者缺乏此權限將被伺服器限制發言(看起來像關閉麥克風的),直到具有適當權限的人取消關閉麥克風。 This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. 允許使用者將其他人設為關閉麥克風或關閉喇叭。一旦被設為關閉麥克風,將一直保持關閉麥克風狀態到被其他有權限的使用者取消,或重新連線為止。 This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. 允許使用者將其他人驅逐到其他頻道或踢出這台伺服器。要驅逐使用者需要擁有目標頻道的移動權限,被驅逐者要有進入目標頻道的權限。擁有此權限的使用者可以將沒有進入某頻道權限的人拉入該頻道。 This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. 允許建立一個子頻道。使用者可以建立一個子頻道並被加入子頻道管理員群組。 This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. 允許使用者建立一個臨時的子頻道。使用者可以建立一個臨時子頻道並被加入子頻道管理員群組。臨時子頻道不會永久存在,當最後一個使用者離開時,臨時子頻道將會消失。 This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. 允許連結頻道。當發言的使用者擁有<i>發言</i>的權限時,被連接的頻道可以聽到彼此的發言,你需要同時擁有兩個頻道的連結權限,但僅擁有一方時可移除連結。 This represents the permission to write text messages to other users in this channel. 允許發送文字訊息給頻道內其他使用者。 This represents the permission to forcibly remove users from the server. 允許強制使用者離開伺服器。 This represents the permission to permanently remove users from the server. 允許永久禁止使用者進入伺服器。 This represents the permission to register and unregister users on the server. 允許使用者在伺服器上註冊與移除註冊。 This represents the permission to register oneself on the server. 允許使用者在伺服器上註冊。 Whisper 悄悄話 Move 移動 Text message 文字訊息 Kick 剔除 Ban 封鎖 Register User 註冊使用者 Register Self 註冊自己 Write ACL 建立存取控制表 ChatbarTextEdit Paste and &Send Paste and send 貼上與送出(&S) <center>Type chat message here</center> <center>在此輸入訊息</center> ClientUser Friend 朋友 Authenticated 已認證 Priority speaker 優先講者 Recording 錄音 Muted (server) 關閉麥克風 (伺服器) Deafened (server) 關閉喇叭 (伺服器) Local Ignore (Text messages) 本地忽略 (文字訊息) Local Mute 本地關閉麥克風 Muted (self) 關閉麥克風 (自己) Deafened (self) 關閉喇叭 (自己) ConfigDialog Accept changes 確定 This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. 該按鈕將接受當前設定並返回到應用程式。<br />當你退出應用程式時這些設定將被儲存。 Reject changes 取消變更 This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. 該按鈕將拒絕所有修改並回到應用程式。<br />這些設定將被重置到先前的設定。 Apply changes 套用 This button will immediately apply all changes. 該按鈕將立即套用所有修改。 Undo changes for current page 取消變更。 This button will revert any changes done on the current page to the most recent applied settings. 該按鈕將復原對當前頁的任意修改到最近使用的設置。 Restore defaults for current page 恢復預設值 This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. 此按鈕將回存目前頁面成預設值。其他頁面不會有所變更。<br />希望重設所有頁面設定為預設值時,你需要在所有頁面使用此按鈕。 Mumble Configuration Mumble 設定 ConnectDialog Connecting to %1 正在連接到 %1 Enter username 輸入帳號 Adding host %1 正在新增主機 %1 Servername 伺服器名稱 Hostname 主機名稱 Bonjour name Bonjour 名稱 Port 埠號 Addresses 網址 Website 網站 Packet loss 封包遺失 Ping (80%) 反應時間(80%) %1 ms %1 ms Ping (95%) 反應時間(95%) Bandwidth 頻寬 %1 kbit/s %1 kbit/s &Connect 連線(&C) &Filters 篩選(&F) Unknown Users 使用者 Version 版本 Failed to fetch server list 無法抓取伺服器清單 Mumble Server Connect Mumble 伺服器連線 Ping 反應時間 Remove from Favorites 從我的最愛中刪除 Add custom server 新增自訂伺服器 Show all servers that respond to ping 顯示所有回應 ping 的伺服器 Show all servers with users 顯示所有伺服器與使用者 Show all servers 顯示所有伺服器 &Copy 複製(&C) Copy favorite link to clipboard 複製我的最愛連結到剪貼簿 &Paste 貼上(&P) Paste favorite from clipboard 從剪貼簿貼上我的最愛連結 &Edit... 編輯(&E)... &Add New... 新增伺服器(&A)... Add to &Favorites 新增到我的最愛(&F) Open &Webpage 開啟網頁(&W) Show &Reachable 顯示可用的(&R) Show &Populated 顯示熱門的(&P) Show &All 顯示全部(&A) ConnectDialogEdit Edit Server 編輯伺服器 Name of the server 伺服器名稱 A&ddress 網址(&A) Internet address of the server. Internet address of the server. 伺服器網址。 <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>網址</b><br/> 伺服器的網路位置。可以是一般的主機名稱、一個 IPv4/IPv6 位置或者是一個 Bonjour 服務的標誌。 Bonjour 服務帶有 '@' 前綴的標誌可以被 Mumble 認可。 &Port 埠號(&P) Port on which the server is listening 伺服器監聽的埠號 <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. <b>埠</b><br/> 伺服器使用的監聽埠。如果伺服器標記使用 Bonjour 服務,此欄位將被忽略。 &Username 帳號(&U) Username to send to the server 發送給伺服器的使用者名稱 <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. <b>使用者名稱</b><br/> 發送給伺服器的使用者名稱。請注意該伺服器可能限制使用者名稱的樣式。同時您慣用的名稱可能已被其它人使用。 Label 標籤 Add Server 新增伺服器 You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 Password 密碼 Password to send to the server 發送給伺服器的密碼 <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. <b>密碼</b><br/> 與伺服器連線時發送的密碼。只有以<i>超級使用者</i>身份登入伺服器時才需要。如果不填寫此欄位,登入時需要填寫密碼。 Show password 顯示密碼 <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. <b>標籤</b><br/> 伺服器的標籤。伺服器在你的清單中顯示的名稱,可以自由設定。 Local server label 本地伺服器標籤 127.0.0.1 127.0.0.1 64738 64738 Your username 您的帳號 Your password 您的密碼 &Fill CoreAudioSystem Default Device 預設裝置 CrashReporter Mumble Crash Report Mumble 當機回報 <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> <p><b>非常抱歉,Mumble當機了。您願意送出當機回報給 Mumble 開發者嗎?</b></p><p>當機回報內容包含 Mumble 當機時的記憶體內容副本,將可協助開發者修復此問題。</p> Email address (optional) Email 地址(選填、非必要) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash 請使用英文填寫當機前的那一刻您在做什麼動作 Send Report 送出 Don't send report 不要送出 Crash upload successful 當機回報上傳成功 Thank you for helping make Mumble better! 感謝您的協助讓 Mumble 更完美! Crash upload failed 當機回報上傳失敗 We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. 真的很抱歉,當機回報因為 %1 %2 錯誤導致上傳失敗,請告知開發人員。 This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 真糟糕,當機回報程式遇上臭蟲了,報告上傳失敗。您可以將錯誤 %1 回報給開發者。 Uploading crash report 上傳當機回報中 Abort upload 放棄上傳 DXAudioInput Default DirectSound Voice Input 預設 DirectSound 語音輸入 Opening chosen DirectSound Input device failed. No microphone capture will be done. 開啟指定 DirectSound 輸入裝置失敗。抓不到麥克風。 Opening chosen DirectSound Input failed. Default device will be used. 開啟指定 DirectSound 輸入裝置失敗。將使用預設裝置。 Lost DirectSound input device. 遺失 DirectSound 輸入裝置。 DXAudioOutput Default DirectSound Voice Output 預設 DirectSound 語音輸出 Opening chosen DirectSound Output failed. Default device will be used. 開啟指定 DirectSound 輸出裝置失敗。將使用預設裝置。 Lost DirectSound output device. 遺失 DirectSound 輸出裝置。 Opening chosen DirectSound Output failed. No audio will be heard. 開啟指定 DirectSound 輸出裝置失敗。將無音效輸出。 Database Mumble failed to initialize a database in any of the possible locations. Mumble 初始化資料庫失敗。 The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. 資料庫 '%1' 目前為唯讀狀態。Mumble 無法儲存伺服器設定(例:SSL 憑證) 直到您修復此問題。 DeveloperConsole Developer Console DockTitleBar Drag here 拖曳至此 GlobalShortcut Shortcuts 快速鍵 List of configured shortcuts 設定好的快速鍵清單 Function 功能 Data 資料 Shortcut 快速鍵 Suppress 禁止 Add new shortcut 新增快速鍵 This will add a new global shortcut 即將新增全域的快速鍵 &Add 新增(&A) Remove selected shortcut 移除快速鍵 This will permanently remove a selected shortcut. 即將永久刪除選定的快速鍵。 &Remove 刪除(&R) <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> Open Accessibility Preferences 開啟無障礙選項 Skip 略過 Enable Global Shortcuts 啟用全域快速鍵 <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. Additional Shortcut Engines <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. Enable Windows hooks <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. Enable GKey <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. Enable XInput <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. Enable shortcuts in privileged applications GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> Shortcuts 快速鍵 Shortcut button combination. 快速鍵按鈕組合. <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. <b>這是全域快速鍵組合。</b><br />雙擊該區域然後綁定想要的按鍵/按鈕組合。 Suppress keys from other applications 禁止其他應用程序使用的按鍵 <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. <b>向其他應用程序隱藏這些按鍵。</b><br/>允許該選項將向其他應用程序隱藏指定按鍵(或者組合按鍵的最后一個按鍵)。注意并不是所有按鍵都能被禁用。 GlobalShortcutTarget Whisper Target 悄悄話對象 Whisper to list of Users 發送悄悄話給清單中的使用者 Channel Target 目標頻道 Restrict to Group 群組限制 If specified, only members of this group will receive the whisper. 如果指定,則只有此群組的成員可接收悄悄話。 List of users 使用者清單 Add 新增 Remove 刪除 Modifiers 修飾 Do not send positional audio information when using this whisper shortcut. 使用快速鍵發送悄悄話時不送出聲音定位資訊。 Ignore positional audio 忽略聲音定位 Shout to Linked channels 對連結的頻道大喊 Shout to subchannels 對子頻道大喊 Shout to Channel 對頻道大喊 The whisper will also be transmitted to linked channels. 悄悄話可以發送到所有相連結的頻道。 The whisper will also be sent to the subchannels of the channel target. 悄悄話內容可以發送到目標頻道的所有子頻道。 GlobalShortcutX Mouse %1 游標 %1 JackAudioSystem Hardware Ports Mono Stereo LCD Not connected 未連接 LCDConfig Enable this device 啟用裝置 LCD LCD Devices 裝置 Name 名稱 <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> <p>這是您系統上可用的LCD裝置清單。本清單包含裝置名稱與解析度。Mumble 支援同時輸出到數個LCD裝置。</p> <h3>尺寸:</h3> <p> 這邊顯示您 LCD 裝置的尺寸。這個尺寸可能使用像素或文字表示。</p> <h3>啟用:</h3> <p>Mumble 是否顯示在 LCD 裝置上。</p> Size 解析度 Enabled 已啟用 Views 檢視 Minimum Column Width 最小列寬 <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> This setting decides the width of column splitter. 設定列分割線寬度。 Splitter Width 分割線寬度 Log Debug 除錯 Critical 緊急 Warning 警告 Information 訊息 Server Connected 伺服器已連接 Server Disconnected 伺服器已斷線 Other self-muted/deafened 其他人自我關閉喇叭/關閉麥克風 Permission Denied 權限被拒絕 Text Message 文字訊息 User Joined Server 使用者加入伺服器 User Left Server 使用者離開伺服器 User recording state changed 使用者錄音狀態改變 User kicked (you or by you) 使用者被(你或因為你)踢出 User kicked 使用者被踢出 You self-muted 您設定關閉麥克風 User muted (you) 使用者關閉(你的)麥克風 User muted (by you) 使用者被關閉麥克風(由你) User muted (other) 使用者關閉麥克風(其他人) User Joined Channel 使用者加入頻道 User Left Channel 使用者離開頻道 You self-unmuted 您設定開啟麥克風 You self-deafened 您設定關閉喇叭 You self-undeafened 您設定開啟喇叭 User renamed 使用者已更名 You Joined Channel You Joined Channel (moved) User connected and entered channel User left channel and disconnected Private text message the server 伺服器 [[ Invalid size ]] [[ Text object too large to display ]] [[ 顯示的文字物件太大 ]] [Date changed to %1] [日期變更為 %1] link to %1 連接到 %1 FTP link to %1 player link 玩家連結 channel link 頻道連結 %1 link %1 連結 LogConfig Toggle console for %1 events 為 %1 事件啟用控制台 Toggle pop-up notifications for %1 events %1 事件跳出通知視窗 Toggle Text-To-Speech for %1 events %1 事件使用文本語音轉換 Click here to toggle sound notification for %1 events 點擊這里為 %1 事件啟用聲音通知 Toggle window highlight (if not active) for %1 events Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change %1 事件中使用提示音效檔案<br />單點播放音效<br />連按兩下以變更 Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. 點擊這裡為 %1 事件啟用控制台輸出。<br />如果選取,該選項使 Mumble 輸出所有 %1 事件到它的訊息日誌。 Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. 點擊這裡為 %1 事件啟用聲音通知。<br />如果選中, Mumble 會使用一個你預先定義的聲音文件來標示 %1 事件。聲音文件和文本語音轉換不能同時被使用。 Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. Messages 消息 Message 消息 Console 控制台 Notification 通知 Text-To-Speech 文本語音轉換 Soundfile 聲音文件 Path 路徑 Text To Speech 文本語音轉換 Volume 音量 Volume of Text-To-Speech Engine 文本語音轉換引擎的音量 <b>This is the volume used for the speech synthesis.</b> <b>這是用於語音合成的音量。</b> Length threshold 長度閾值 Message length threshold for Text-To-Speech Engine 用于文本語音轉換的消息長度閾值 <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. <b>這是用于文本語音轉換引擎的消息長度閾值。</b><br />消息長于此值時將不會被全部讀出來。 Characters 字元 Whisper 悄悄話 If checked you will only hear whispers from users you added to your friend list. 選擇此項則只有在您好友清單中的使用者才可發送悄悄話給你。 Only accept whispers from friends 只接受好友的悄悄話 If enabled text messages you send will be read back to you with TTS 啟此功能啟用後將使用文本轉語音讀出回傳的訊息。 Read back own messages 回送訊息 Chat Log 聊天紀錄 Maximum chat length 最大聊天長度 Unlimited 無限制 Lines Highlight LookConfig System default 系統預設 None Only with users 只顯示自己所在 All 全部 Ask 詢問 Do Nothing 無動作 Move 移動 <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory User Interface 使用者界面 This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. List users above subchannels (requires restart). 顯示頻道內使用者清單(需重新啟動)。 <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. <b>啟用時在各子頻道下將各自顯示使用者名單</b><br />需要重新啟動。 Users above Channels 顯示頻道內使用者清單 <b>If set, will verify you want to quit if connected.</b> <b>退出程式時如果與伺服器持續連線則進行重複確認。</b> Show number of users in each channel 顯示每一個頻道的使用人數 Show channel user count 顯示頻道人數 Language 語言 Language to use (requires restart) 使用的語言(需要重啟) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. <b>設置 Mumble 使用哪種語言。</b><br />你需要重啟 Mumble 來使用新語言。 Look and Feel 操作界面 Layout 界面布局 Classic 經典 Stacked 堆疊 Hybrid 混合 Custom 自訂 This changes the behavior when moving channels. 改變頻道拖曳時的行為。 This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. Expand 展開 When to automatically expand channels 何時自動展開頻道 Channel Dragging 頻道拖曳 Ask whether to close or minimize when quitting Mumble. 詢問退出 Mumble 時是關閉還是最小化。 Ask on quit while connected 與伺服器連線期間離開前確認 Always On Top 最上層顯示 <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> <b>如果選中,最小化 Mumble 主窗口時將使得它被隱藏到系統托盤。否則,它將會像通常一樣被最小化。</b> Hide in tray when minimized 最小化時隱藏到系統列 Hide the main Mumble window in the tray when it is minimized. 最小化時,隱藏 Mumble 主界面到系統列。 This setting controls when the application will be always on top. 本設定控制程式何時以最上層顯示。 Never 從不 Always 總是 In minimal view 簡潔視窗時 In normal view 一般顯示時 Displays talking status in system tray 在系統列顯示發話狀態 Show talking status in tray icon 在系統列顯示發話狀態 This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. Show context menu in menu bar 在選單列顯示使用者與頻道選單 Apply some high contrast optimizations for visually impaired users 允許視障使用者使用高對比色彩配置 Optimize for high contrast 高對比色彩配置最佳化 Application 程式界面 Adds user and channel context menus into the menu bar 在選單列顯示使用者與頻道選單 Tray Icon 系統列圖示 Channel Tree 頻道樹 Use selected item as the chat bar target 手動指定發送文字訊息的目標頻道 Filter automatically hides empty channels 過濾器會自動隱藏空頻道 Show transmit mode dropdown in toolbar 在工具列顯示傳輸模式的下拉選單 Theme 佈景主題 Theme to use to style the user interface 佈景主題用來設定使用者介面風格 <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. User Dragging This changes the behavior when moving users. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. Enable Developer menu When in custom layout mode, checking this disables rearranging. Lock layout MainWindow Root Push-to-Talk Global Shortcut 按鍵發話 Push and hold this button to send voice. Global Shortcut 按住發話鍵發送語音。 This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut 設定發話鍵,只要你按住該鍵,語音將被傳送。 Reset Audio Processor Global Shortcut 重設音效處理程序 Unlink Plugin Global Shortcut 停用外掛 Push-to-Mute Global Shortcut 按鍵關麥克風 Join Channel Global Shortcut 加入頻道 Toggle Overlay Global Shortcut 切換浮動視窗 Toggle state of in-game overlay. Global Shortcut 切換遊戲內浮動視窗狀態。 Toggle Minimal Global Shortcut 切換最小化 Volume Up (+10%) Global Shortcut 增加音量(+10%) Volume Down (-10%) Global Shortcut 降低音量(-10%) Mumble Mumble Mumble -- %1 Mumble -- %1 &Window 視窗(&W) Minimize 最小化 Ctrl+M Ctrl+M Close 關閉 Mumble is currently connected to a server. Do you want to Close or Minimize it? Mumble 正與伺服器連線中。你希望關閉還是最小化? Mute Self Global Shortcut 關閉麥克風 Set self-mute status. Global Shortcut 設定成關閉麥克風狀態。 This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut 這將設定或切換您的關閉麥克風狀態。如果您關閉此功能,您還可以停用自動消音。 Deafen Self Global Shortcut 自我關閉喇叭 Set self-deafen status. Global Shortcut 設定自我關閉喇叭狀態。 This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut 這將設定或切換您的關閉喇叭狀態。如果您開啟此功能,您將同時進入關閉麥克風狀態。 Whisper/Shout Whisper 悄悄話/大喊 <center>Not connected</center> Not connected <center>未連接</center> Clear 清除 Opening URL %1 開啟網址 %1 File does not exist 檔案不存在 File is not a configuration file. 不是設定檔。 Settings merged from file. 合併設定檔。 URL scheme is not 'mumble' 'Mumble' 不支援的網址 This version of Mumble can't handle URLs for Mumble version %1.%2.%3 目前的 Mumble 無法處理版本 %1.%2.%3 產生的網址 Connecting to %1 正在連接 %1 Enter username 輸入使用者名稱 Connecting to server %1. 連線到伺服器 %1。 Reconnecting. 正在重新連線。 Transmit Mode set to Continuous 語音發送模式設為連續 <p>%1 (%2)<br />%3</p> <p>%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> <h2>語音頻道</h2><p>使用 128 bit OCB-AES128 加密<br />平均延遲 %1 毫秒 (誤差 %4)</p> Register yourself as %1 註冊自己成為 %1 <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <h2>Version</h2><p>Protocol %1</p> <h2>版本</h2><p>協定 %1</p> <p>No build information or OS version available</p> <p>沒有可用的建置或作業系統資訊</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) The connection is secured by the cipher suite that OpenSSL identifies as %1 <p>The connection provides perfect forward secrecy</p> <p>The connection does not provide perfect forward secrecy</p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> Voice channel is sent over control channel Register user %1 註冊使用者 %1 <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> <p>您在此伺服器的註冊名稱為 %1。這個動作無法取消,未來也無法變更使用者名稱, %1 即使您變更密碼依舊可以連接此伺服器.</p><p>從此刻開始, %1 將使用憑證進行認證</p><p>您確定要註冊成 %1?</p> Kicking user %1 正在剔除使用者 %1 Banning user %1 正在禁封 %1 View comment on user %1 檢視使用者 %1 的註解 Message to channel %1 發送文字訊息到 %1 頻道 Connected. 已連線。 <li>Expected certificate digest (SHA-1): %1</li> Server presented a certificate which failed verification. 服務器提供的憑證認證失敗。 <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> SSL Version mismatch SSL版本不合 Server connection failed. <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>在此輸入給 %1 頻道的文字訊息</center> <center>Type message to user '%1' here</center> Type message to user '%1' here <center>在此輸入給使用者 %1 的文字訊息</center> Choose image file 選擇圖檔 Failed to load image 讀取圖檔失敗 Could not open file for reading. 無法讀取開啟的檔案。 Image format not recognized. 無法辨識圖檔格式。 &User 使用者(&U) &Channel 頻道(&C) Use in conjunction with Whisper to. Global Shortcut 結合悄悄話一起。 This will switch the states of the in-game overlay. Global Shortcut 這將切換遊戲中浮動視窗的狀態。 Link Channel Global Shortcut 連接頻道 Cycle Transmit Mode Global Shortcut 循環發送模式 Set Transmit Mode to Push-To-Talk Global Shortcut Set Transmit Mode to Continuous Global Shortcut Set Transmit Mode to VAD Global Shortcut Send Text Message Global Shortcut 送出文字訊息 Send Clipboard Text Message Global Shortcut This will send your Clipboard content to the channel you are currently in. Global Shortcut Continuous 連續 Voice Activity 語音活動 Push-to-Talk 按鍵發話 Mumble - Minimal View -- %1 Mumble - 精簡檢視 -- %1 Cancel 取消 Save Image As... 另存圖片 ... Save Image File 儲存圖片 Could not save image: %1 無法儲存圖片:%1 Change your comment 變更你的註解 Transmit Mode set to Voice Activity 語音發送模式設為語音活動時 Transmit Mode set to Push-to-Talk 語音發送模式設為按鍵發話 <p>Connected users: %1/%2</p> <p>已連接的使用者:%1/%2</p> UDP Statistics UDP 統計 To Server 到伺服器 From Server 來自伺服器 Good 良好 Late 延遲 Lost 遺失 Resync 重新同步 <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> <h2>語音頻寬</h2><p>最大 %1 kbit/s<br />目前 %2 kbit/s<br />編碼: %3</p> Mumble Server Information Mumble 伺服器資訊 &View Certificate 檢視憑證(&V) Enter reason 輸入原因 Sending message to %1 發送訊息給 %1 To %1: %2 發送給 %1: %2 Message to %1 發送訊息給 %1 Are you sure you want to reset the comment of user %1? 你確定要重製使用者 %1 的註解? Are you sure you want to reset the avatar of user %1? 你確定要重設使用者 %1 的頭像? Are you sure you want to delete %1 and all its sub-channels? 你確定要刪除 %1 和它的子頻道嗎? Sending message to channel %1 發送訊息給頻道 %1 Message to tree %1 發送消息給樹 %1 To %1 (Tree): %2 (Tree) %1: %2 給 %1 (樹): %2 Unmuted and undeafened. 解除關閉麥克風與喇叭。 Unmuted. 解除關閉麥克風。 Muted. 關閉麥克風。 Muted and deafened. 已關閉麥克風與喇叭。 Deafened. 已關閉喇叭。 Undeafened. 解除關閉喇叭。 Restart Mumble? 重新啟動 Mumble? Some settings will only apply after a restart of Mumble. Restart Mumble now? 部份設定只在 Mumble 重新啟動後生效。現在就重新啟動 Mumble? About Qt 關於 Qt SSL Verification failed: %1 SSL 認證失敗: %1 <li>Server certificate digest (SHA-1): %1</li> <b>WARNING:</b> The server presented a certificate that was different from the stored one. <b>警告:</b>伺服器提供的憑證與保存的憑證不同。 This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. 這台伺服器使用舊式加密標準,新版的 Mumble 已不再支援。 Server connection failed: %1. 伺服器連線失敗: %1. Disconnected from server. 與伺服器斷開連接。 Invalid username 無效的使用者名稱 You connected with an invalid username, please try another one. 你使用一個無效的使用者名稱連線,請嘗試另外一個。 Username in use 使用者名稱重複 That username is already in use, please try another username. 使用者名稱已經存在,請使用其他名稱。 Wrong certificate or password 錯誤的憑證或密碼 Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. Wrong password 密碼錯誤 Wrong server password for unregistered user account, please try again. 未註冊使用者的伺服器密碼錯誤,請重試。 Images (*.png *.jpg *.jpeg) 圖片 (*.png *.jpg *.jpeg) C&onfigure 設定(&C) &Help 說明(&H) Log 日誌 This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. 這裡顯示所有最近的活動。正在連線服務器、錯誤和通知消息都將在此顯示。<br />設定哪些訊息在此顯示,請從選單中使用<b>設定</b>。 &Quit Mumble 離開 Mumble(&Q) Closes the program 關閉程式 Exits the application. 退出應用程式。 Ctrl+Q Ctrl+Q Open the server connection dialog 打開伺服器連線對話框 &Disconnect 斷開連線(&D) Disconnect from server 從伺服器斷開連線 Disconnects you from the server. 使你從伺服器斷開連線。 Show information about the server connection 顯示伺服器連接訊息 This will show extended information about the connection to the server. 顯示服務器連接的額外訊息。 &Mute 關閉麥克風(&M) &Deafen 關閉喇叭(&D) &Local Mute 本地關閉麥克風(&L) Send a Text Message 發送文字訊息 Sends a text message to another user. 向其他使用者發送文字訊息。 Add new channel 新增頻道 This adds a new sub-channel to the currently selected channel. 在目前選頻道內新增一個子頻道。 Remove channel 移除頻道 This removes a channel and all sub-channels. 刪除頻道及其所有子頻道。 Edit Groups and ACL for channel 編輯頻道群組與存取控制表 This opens the Group and ACL dialog for the channel, to control permissions. 開啟頻道群組和存取控制表,來編輯頻道的連線權限。 &Link 連結(&L) Link your channel to another channel 連結你的頻道和另一個頻道 This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. Chatbar 聊天室 Shows a dialog of registered servers, and also allows quick-connect. 顯示已註冊伺服器的對話框,並允許快速連結。 Kick user (with reason) 踢出使用者 (附帶理由) Kick selected user off server. You'll be asked to specify a reason. 從伺服器踢出使用者。你將被要求提供理由。 Mute user 關閉使用者麥克風 Mute or unmute user on server. Unmuting a deafened user will also undeafen them. 關閉或開啟伺服器上使用者的麥克風。開啟一個關閉喇叭的使用者的麥克風的同時將會一併開啟他的喇叭。 Kick and ban user (with reason) 踢出與封鎖使用者 (附帶理由) Kick and ban selected user from server. You'll be asked to specify a reason. 從伺服器上踢出與封鎖使用者。你將被要求提出理由。 Deafen user 關閉使用者的喇叭 Deafen or undeafen user on server. Deafening a user will also mute them. 關閉或開啟伺服器上使用者的喇叭。關閉喇叭的同時將一併關閉麥克風。 Mute user locally 關閉局部使用者的麥克風 Mute or unmute user locally. Use this on other users in the same room. 關閉或開啟局部使用者麥克風。將此設定套用於同一個房間的使用者。 This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. &Unlink Channel 取消連結(&U) Unlink your channel from another channel 取消你的頻道和另一個頻道之間的連結 This unlinks your current channel from the selected channel. 取消你的當前頻道和所選頻道之間的連結。 Unlinks your channel from all linked channels. 取消你的頻道和所有已連結頻道之間的連結。 This unlinks your current channel (not the selected one) from all linked channels. 取消你的當前頻道(非所選頻道)和所有已連結的頻道之間的連結。 &Reset 重設(&R) Reset audio preprocessor 重設音效處理程序 This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. 該選項將重置音頻預處理器,包含噪音消除,自動獲取和語音活動檢測。如果音頻環境突然變的惡劣(比如掉麥)并且是暫時的,使用該選項來避免等待預處理器自我調節。 &Mute Self 自我關閉麥克風(&M) Mute yourself 自我關閉麥克風 Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. 對自己關閉麥克風或取消關閉麥克風。當關閉麥克風時,你將無法發送語音到伺服器。當取消關閉麥克風時將同時取消關閉喇叭。 &Deafen Self 自我關閉喇叭(&D) Deafen yourself 自我關閉喇叭 Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. 使自己關閉喇叭或取消關閉喇叭。當關閉喇叭時,你將聽不到聲音。自我關閉喇叭時亦關閉麥克風。 &Text-To-Speech 文字轉語音(&T) Toggle Text-To-Speech 切換文字轉語音 Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. 使用或庭用文字轉語音引擎。只有在設定對話框裡啟用了文字轉語音時英文文字訊息才會被讀出來。 Display audio statistics 顯示音效統計 Pops up a small dialog with information about your current audio input. 彈出一個關于你當前音頻輸入信息的對話框。 Forcibly unlink plugin 強制卸載外掛 This forces the current plugin to unlink, which is handy if it is reading completely wrong data. 強制卸載目前外掛,當外掛讀取的數據完全錯誤時相當有用。 Configure Mumble 設定 Mumble Allows you to change most settings for Mumble. 允許你改變 Mumble 的大多數設定。 Start the audio configuration wizard 啟動音效精靈 This will guide you through the process of configuring your audio hardware. 這將引導你設定你的音效硬體。 &What's This? 這是什麼(&W)? Enter What's This? mode 進入 這是什麼? 模式 Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. 點擊進入"這是什麼?"模式。你的滑鼠將變成一個問號。點擊任意按鈕,選單或區域來顯示它的描述。 Information about Mumble Mumble 的相關訊息 Shows a small dialog with information and license for Mumble. 顯示一個 Mumble 相關訊息和許可的對話框。 Information about Speex Speex 的相關訊息 Shows a small dialog with information about Speex. 顯示一個 Speex 相關信息的小對話框。 Information about Qt Qt 相關訊息 Shows a small dialog with information about Qt. 顯示一個 Qt 相關訊息的小對話框。 Check for &Updates 檢查與更新(&U) Check for new version of Mumble 檢查新版 Mumble Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. 連接到 Mumble 首頁檢查是否有新版可用,如果有新版本將通知你下載。 Sends a text message to all users in a channel. 向頻道內所有使用者發送純文字訊息。 Configure certificates for strong authentication 設定高強度驗證頻證 This starts the wizard for creating, importing and exporting certificates for authentication against servers. 開啟引導精靈,建立、匯入與匯出伺服器身份驗證憑證。 Register user on server 伺服器上註冊使用者 This will permanently register the user on the server. 使用者將永久註冊在伺服器上。 Add &Friend 新增朋友(&F) Adds a user as your friend. 增加一個使用者成為朋友。 This will add the user as a friend, so you can recognize him on this and other servers. 增加一個使用者成為朋友,不管在此伺服器或其他伺服器你都可以辨認他。 &Remove Friend 移除朋友(&R) Removes a user from your friends. 自朋友列中刪除一個使用者。 This will remove a user from your friends list. 你將從朋友清單中刪除一個使用者。 &Update Friend 更新朋友(&U) Update name of your friend. 更新你的朋友的名字。 Your friend uses a different name than what is in your database. This will update the name. 好友的名稱與資料庫紀錄不同。即將更新。 Edit registered users list 編輯已註冊使用者清單 This opens the editor for registered users, which allow you to change their name or unregister them. 開啟註冊帳號編輯器,允許您變更他們的名稱或取消註冊。 Add or remove text-based access tokens 增加或移除文字存取標記 &Minimal View 簡潔視窗(&M) Toggle minimal window modes 啟用簡潔視窗模式 This will toggle minimal mode, where the log window and menu is hidden. 這將啟用簡潔視窗模式,該模式將隱藏日誌欄與選單。 You muted and deafened %1. 你已關閉 %1 麥克風與喇叭。 You unmuted and undeafened %1. 你已開啟 %1 麥克風與喇叭。 You undeafened %1. 你的喇叭被 %1 開啟。 You suppressed %1. 你抑制了 %1。 %1 muted and deafened by %2. %2 關閉 %1 的麥克風與喇叭。 %1 unmuted and undeafened by %2. %2 開啟 %1 的麥克風與喇叭。 %1 undeafened by %2. %1 被 %2 取消關閉喇叭。 %1 suppressed by %2. %2 抑制了 %1。 %1 moved to %2. %1 移動至 %2。 %1 moved to %2 by %3. %3 將 %1 移動至 %2。 %1 moved in from %2 by %3. %3 將 %1 從 %2 移動到此。 %1 is now muted and deafened. %1 現在被關閉麥克風和關閉喇叭. Your account information can not be verified currently. Please try again later 您的帳戶信息目前無法確認,請稍候重試 Welcome message: %1 歡迎訊息:%1 Mumble: %1 Mumble:%1 You were denied %1 privileges in %2. 您在 %2 的 %1 權限被拒絕。 %3 was denied %1 privileges in %2. %3 在 %2 的 %1 權限被拒絕。 Denied: Cannot modify SuperUser. 拒絕:無法修改超級使用者。 Denied: Invalid channel name. 拒絕:無效的頻道名稱。 Denied: Text message too long. 拒絕:訊息太長。 Denied: Operation not permitted in temporary channel. 拒絕:此操作無法使用於臨時頻道。 You need a certificate to perform this operation. 您需要憑證才可進行此操作。 %1 does not have a certificate. %1 沒有憑證。 Invalid username: %1. 無效的使用者名稱: %1 Invalid username. 無效的用戶名。 Channel is full. 頻道已滿。 Channel nesting limit reached. Channel count limit reached. Need to delete channels before creating new ones. Permission denied. 沒有權限。 %1 connected and entered channel. %1 connected. %1 已連線。 %1 is now muted. %1 現在被關閉麥克風。 %1 is now unmuted. %1 現在被取消關閉麥克風。 Recording started 已開始錄音 Recording stopped 已停止錄音 %1 started recording. %1 已開始錄音。 %1 stopped recording. %1 已停止錄音。 You revoked your priority speaker status. You assumed priority speaker status. %1 revoked your priority speaker status. %1 gave you priority speaker status. You revoked priority speaker status for %1. You gave priority speaker status to %1. %1 revoked own priority speaker status. %1 assumed priority speaker status. %1 revoked priority speaker status for %2. %1 gave priority speaker status to %2. You were unmuted and undeafened by %1. You were muted by %1. 你被 %1 關閉麥克風。 You were undeafened by %1. 你被 %1 取消關閉喇叭。 You were suppressed. You were suppressed by %1. 你被抑制了。 You were unsuppressed. You were unsuppressed by %1. You joined %1. You moved %1 to %2. 您已移動 %1 到 %2。 %1 is recording %1 正在錄音 %1 renamed to %2 by %3. %1 disconnected. %1 離線。 Server message from 伺服器 (Tree) (樹) (Channel) (頻道) (Private) %2%1: %3 %2%1: %3 Failed to load Opus, it will not be available for audio encoding/decoding. The server requests minimum client version %1 伺服器要求使用 %1 以上版本客戶端 The server requests positional audio be enabled. 伺服器要求啟動定位音效。 The server requests positional audio be disabled. 伺服器要求關閉定位音效。 The server requests Push-to-Talk be enabled. 伺服器要求使用按鍵發話。 The server requests Push-to-Talk be disabled. 伺服器要求關閉按鍵發話。 You were unmuted by %1. 你被 %1 取消關閉麥克風。 You muted %1. 你關閉了 %1 的麥克風。 You unsuppressed %1. 你開啟了 %1 的麥克風。 You unmuted %1. 你開啟了 %1 的麥克風。 %1 muted by %2. %1 被 %2 關閉麥克風。 %1 unsuppressed by %2. %1 unmuted by %2. %1 被 %2 取消關閉麥克風。 Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. You were muted and deafened by %1. You were deafened by %1. 你被 %1 關閉麥克風與喇叭。 You were kicked from the server by %1: %2. 你被 %1 從服務器踢出: %2。 %3 was kicked from the server by %1: %2. %3 被 %1 從服務器踢出: %2。 You were kicked and banned from the server by %1: %2. 你被 %1 從服務器踢出並封鎖: %2。 %3 was kicked and banned from the server by %1: %2. %3 被 %1 從服務器踢出並封鎖: %2。 You were moved to %1 by %2. 你被從 %1 移動到 %2。 %1 entered channel. %1 進入頻道。 Server connection rejected: %1. 伺服器拒絕連接: %1。 Denied: %1. 拒絕: %1。 %1 renamed to %2. %1 更改名稱為 %2。 %1 left channel and disconnected. %1 離開頻道且離線。 Message from %1 來至 %1 的消息 You have User Dragging set to "Do Nothing" so the user wasn't moved. You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. 你設置頻道拖動為“無動作"因此頻道沒有被移動。 Unknown Channel Drag mode in UserModel::dropMimeData. UserModel::dropMimeData 中未知的頻道拖放模式。 Remote controlling Mumble: Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) -jn, --jackname Set custom Jack client name. --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status Invocation 調用 Error: No RPC command specified 錯誤:指定的 PRC 指令不存在。 RPC 遠端程序呼叫 Welcome to Mumble. 歡迎使用 Mumble。 Skipping version check in debug mode. 在除錯模式中略過版本檢查。 Hide Frame 隱藏邊框 Toggle showing frame on minimal window 在簡潔視窗模式下切換邊框顯示 This will toggle whether the minimal window should have a frame for moving and resizing. 該選項切換簡化窗口是否有個用來移動和改變大小的邊框。 &Unlink All 取消所有連結(&U) Reset the comment of the selected user. 重設使用者註解。 &Join Channel 加入頻道(&J) View comment in editor 在編輯器中檢視使用者註解 Query server for connection information for user 查詢伺服器的使用者資訊 S&erver 伺服器(&E) &Self 本機設定(&S) &Unlink Plugins 停用外掛(&U) Register yourself on the server 在此伺服器註冊 Change your avatar image on this server 更改你在此伺服器的頭像。 &Remove Avatar 移除頭像(&R) Remove currently defined avatar image. 移除目前定義的頭像圖片。 Icon Toolbar 工具欄圖示 Change your own comment 變更你自己的註解 Recording 錄音 Priority Speaker 優先講者 &Copy URL 複製網址(&C) Copies a link to this channel to the clipboard. 複製頻道網址到剪貼簿。 Ignore Messages 忽略訊息 Locally ignore user's text chat messages. 本地忽略使用者的文字聊天訊息。 Silently drops all text messages from the user. 自動刪除來自所有使用者的文字訊息。 Edit ban list on server 編輯伺服器上的封鎖名單 This lets you edit the server-side IP ban list. 讓你編輯伺服器端的封鎖 IP 清單。 &Filter on/off 開/關過濾器(&F) Toggle the channel filter (Ctrl+F) 切換頻道過濾器 (Ctrl+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. Ctrl+F Ctrl+F &Hide Channel when Filtering 隱藏被過濾的頻道 (&H) Reset the avatar of the selected user. 重設指定使用者的頭像。 Locally adjust the user's speech volume. 調整部份使用者的音量。 Opens a dialog with a volume slider. Use this on other users in the same room. &Developer &Hide Mumble Hides the main Mumble window. Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. Show the Developer Console Shows the Mumble Developer Console, where Mumble's log output can be inspected. &Connect... &Ban list... &Information... &Kick... &Ban... Local Volume Adjustment... Send &Message... &Add... &Remove... &Edit... Audio S&tatistics... &Settings... &Audio Wizard... Developer &Console... &About... About &Speex... About &Qt... &Certificate Wizard... &Register... Registered &Users... Change &Avatar... &Access Tokens... Reset &Comment... Reset &Avatar... View Comment... &Change Comment... R&egister... Show Shows the main Mumble window. Manual Manual Mumble Positional Audio Position X Y Z m Heading Azimuth Elevation ° Meta data Context Identity Set State Linked Activated Unhinge NetworkConfig Network 網路 Updates are mandatory when using snapshot releases. 使用快照版時將強制更新。 Connection 連接 Use TCP compatibility mode Use TCP compatability mode 使用 TCP 相容模式 <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). <b>啟用 TCP 兼容模式</b>。<br/>這將使 Mumble 與服務器通信時只使用 TCP。這將增加系統開銷并導致丟包從而使通信時出現明顯的暫停,因此只有在你不能使用默認模式時使用它(默認模式使用 UDP 來傳輸語音,TCP 來控制)。 Reconnect when disconnected 連接斷開后重新連接 <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. <b>連接斷開后重新連接</b>。<br/>這將使 Mumble 在與服務器的連接斷開 10秒后自動重新連接。 Reconnect automatically 自動重新連接 Proxy 代理伺服器 Type 類型 Type of proxy to connect through 代理伺服器的類型 Direct connection 直接連線 HTTP(S) proxy HTTP(S) 代理 SOCKS5 proxy SOCKS5 代理 Hostname 主機名 Hostname of the proxy 代理伺服器主機名稱 Force TCP mode 只用TCP模式 Enable QoS to prioritize packets 使用 QoS 優先發送封包 This will enable QoS, which will attempt to prioritize voice packets over other traffic. 啟用服務質量管理(QoS)後,語音封包將優先於其他流量處理。 Use Quality of Service 使用服務質量管理 (QoS) Don't send certificate to server and don't save passwords. (Not saved). 不要將憑證傳給伺服器也不要儲存密碼。(不儲存)。 <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> <b>這將阻止辨識客戶端的身份資訊</b><p>客戶端將無法使用憑證證明自己的身份,就算證明了,也無法儲存連線密碼。此為測試用選項且不儲存。</p> Suppress certificate and password storage 不儲存憑證與密碼 <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>通過代理伺服器的通訊協定類型</b><br/>讓 Mumble 所有通訊都透過代理伺服器。注意:使用代理穿隧將使 Mumble 進入 TCP 相容模式,所有語音資料將使用控制頻道發送。 <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. <b>代理伺服器的主機名稱</b><br/>用來指定存取網路的代理伺服器。 Port 埠號 Port number of the proxy 代理伺服器埠號 <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. <b>代理服務器埠號。</b><br/>該字段指定代理服務器使用的埠號。 Username 用戶名 Username for proxy authentication 用於代理認証的用戶名 <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>用於代理認証的用戶名。</b><br />該字段指定用於代理認証的用戶名。如果代理不需要認証,或者你想要使用匿名連接,請將此字段留白。 Password 密碼 Password for proxy authentication 用於代理認証的密碼 <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>用於代理認証的密碼。</b><br/>該字段指定用於代理認証的密碼。如果代理不需要認証,或者你想要使用匿名連接,請將此字段留白。 Mumble services Mumble 服務 Check for new releases of Mumble automatically. 讓 Mumble 自動偵測新發行版本。 This will check for new releases of Mumble every time you start the program, and notify you if one is available. 每次啟動 Mumble 時,將會自動檢查有無新版本發行,如果發行新版將提醒通知。 Check for application updates on startup 啟動時檢查更新 Check for new releases of plugins automatically. 自動檢查外掛更新。 This will check for new releases of plugins every time you start the program, and download them automatically. 當啟動程式的時候,Mumble 將自動檢查並更新外掛模組。 <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. <b>送出匿名統計。</b><br />Mumble 有一個重視未來發展的開發團隊,透過您的資訊能讓開發團隊更精確的抓住未來的發展方向。 Submit anonymous statistics to the Mumble project 遞交匿名統計數據給 Mumble 專案 Submit anonymous statistics 發送匿名統計 Reconnect to last used server when starting Mumble 啟動時連接最後使用的伺服器 Reconnect to last server on startup 啟動時自動連接到最後使用的伺服器 Download plugin and overlay updates on startup 啟動時下載外掛與浮動視窗的更新 Privacy Prevent OS information being sent to Mumble servers and web servers <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. Do not send OS information to Mumble servers and web servers Overlay Silent 靜音 Talking 講話 Whisper 悄悄話 Shout 大喊 Channel 頻道 Failed to create communication with overlay at %2: %1. No overlay will be available. 無法在 %2 建立連接:%1。沒有可用的浮動視窗。 OverlayClient Filter 過濾 Only talking 僅說話 Talking and recently active 說話語最近活動 All in current channel 目前頻道裡所有的 All in linked channels 所有相互連結的頻道 Always show yourself 總是顯視你自己 Configure recently active time (%1 seconds)... 設定最近活動時間 (%1 秒)… Columns Sort 排序 Alphabetically 按英文字母排序 Last state change 最後停留的頻道 Edit... 編輯… Reset Zoom 重設大小 Configure recently active time 重設最近活動時間 Amount of seconds users remain active after talking: 多少秒鐘內持續判定語音活動: OverlayConfig To move the users, drag the little red dot. 拖動小紅點移動使用者清單。 To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. 在使用者清單上使用滑鼠滾輪縮放使用者清單。 For more options, right click a user. For more options, rightclick a user. 右鍵點擊使用者開啟更多選項。 Launcher Filter Overlay 浮動視窗 Choose executable 選擇執行檔 Choose application 選擇應用程式 Choose path Load Overlay Presets 載入浮動視窗樣板 Mumble overlay presets (*.mumblelay) Mumble 浮動視窗樣板 (*.mumblelay) Save Overlay Presets 儲存浮動視窗樣板 Options 選項 Enable overlay. 啟用浮動視窗。 Enable Overlay 啟用浮動視窗 This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. 這裡設定開啟或關閉浮動視窗。這個設定只在啟動程式時檢查,因此要確定你啟動應用程式前 Mumble 還有本選項是開啟的。<br />請注意如果你已經開啟 Mumble 與應用程式或者在應用程式執行期間關閉了浮動視窗,除了重新啟動應用程式之外,沒有辦法重新啟動浮動視窗。 Layout 界面布局 Blacklist 黑名單 Whitelist 白名單 Uninstall Overlay 反安裝浮動視窗 Overlay Installation 安裝浮動視窗 Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. Mumble 偵測到你尚未安裝 Mumble 浮動視窗。 點選下方按鍵安裝浮動視窗。 Install Mumble Overlay 安裝 Mumble 浮動視窗 Overlay Upgrade 浮動視窗升級 Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. Mumble 偵測到你已安裝舊版的浮動視窗檔。 點選下方按鈕,升級浮動視窗到最新版。 Upgrade Mumble Overlay 升級 Mumble 浮動視窗 Display a frame counter in the overlay 在浮動視窗中顯示 FPS Show FPS counter 顯示 FPS Load an overlay preset from file 從檔案讀取浮動視窗設定 Load… 讀取… Save your overlay settings to file 儲存浮動視窗設定成檔案 Save… 儲存… Set the overlay font. 設定字型。 Set the overlay text color. 設定浮動視窗文字色彩。 Color 色彩 Remove 刪除 Font 字型 FPS and Clock Display 顯示 FPS 與時間 Display a clock in the overlay showing the current local time (system time). 在浮動視窗中顯示現在時間 (系統時間)。 Show Clock 顯示時間 Overlay Exceptions Overlay Exception Mode Allowed launchers Add Allowed programs Allowed paths Blacklisted programs OverlayEditor State 狀態 User is not talking 使用者沒有講話 Passive 被動 User is talking in your channel or a linked channel 使用者在你的頻道或與此頻道連結的頻道中講話。 Talking 講話中 User is whispering to you privately 使用者與你私下悄悄話中。 Private Whisper 私人的悄悄話 User is shouting to your channel 使用者在你的頻道中大喊 Channel Whisper 頻道悄悄話 Zoom 放大 Zoom Factor 縮放參數 Enabled Elements 可用元素 User avatar, chosen by each user 使用者頭像,由使用者自訂。 Avatar 頭像 User's name 使用者的名稱 Username 使用者名稱 Name of user's channel, if outside your current channel 使用者的頻道名稱,如果不在你目前所在頻道 Channel 頻道 Muted or deafened 關閉麥克風或喇叭 Mute state 靜默狀態 Bounding box, automatically shrunk to minimum size to contain all visible elements 邊框,自動將所有可見元素以最小顯示。 Bounding box 邊框 Overlay Editor 無縫嵌入編輯器 OverlayEditorScene Layout preset 預設布局 Large square avatar 大型頭像 Avatar and Name 頭像與名稱 User Opacity 名單透明度 %1% %1% Object Opacity 物件透明度 Alignment 對齊方式 Left 靠左對齊 Center 置中對齊 Right 靠右對齊 Top 靠上對齊 Bottom 靠下對齊 Color... 色彩… Font... 字型… Bounding box 背景 Pen width 線條寬度 Padding 間距 Pen color 線條色彩 Fill color 填充色彩 Pick pen color 選擇線條色彩 Pick fill color 選擇填充色彩 Pick color 選擇色彩 Pick font 選擇字型 PluginConfig Plugins 外掛 Plugin has no configure function. 外掛沒有設定選項。 Plugin has no about function. 外掛沒有額外資訊。 Options 選項 Enable plugins and transmit positional information 啟用外掛並傳送位置訊息 This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. Link to Game and Transmit Position 連結到遊戲並傳送位置 Reloads all plugins 重新載入所有外掛 This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. 重新掃描和重新載入外掛。當你增加或改變一個外掛時使用此選項。 &Reload plugins &重新載入外掛 Information about plugin 外掛資訊 This shows a small information message about the plugin. 顯示插件相關信息。 &About 關於(&A) Show configuration page of plugin 顯示外掛設定 This shows the configuration page of the plugin, if any. 顯示插件配置頁面。 &Configure 設定(&C) Name 名稱 Enabled 已啟用 Plugins Skipping plugin update in debug mode. 在除錯模式忽略外掛更新訊息。 Downloaded new or updated plugin to %1. 下載或更新 %1 外掛。 Failed to install new plugin to %1. 安裝 %1 外掛失敗。 %1 lost link. %1 連接遺失。 %1 linked. %1 已連接。 PortAudioSystem Default Device 預設裝置 PulseAudioSystem Default Input 預設輸入 Default Output 預設輸出 QApplication Failed to restart mumble 重新啟動 mumble 失敗 Mumble failed to restart itself. Please restart it manually. Mumble 自我重新啟動失敗。請手動重啟。 RichTextEditor Failed to load image 讀取圖片失敗 Image file too large to embed in document. Please use images smaller than %1 kB. 嵌入文件的圖片過大,請使用小於 %1 kB 的圖片。 Message is too long. 訊息太長。 Display 顯示 Source Text 原始文字 &Bold 粗體(&B) Ctrl+B Ctrl+B &Italic 斜體(&I) Italic 斜體 Ctrl+I Ctrl+I Underline 下底線 Ctrl+U Ctrl+U Color 顏色 Insert Link 插入連結 Ctrl+L Ctrl+L Insert Image 插入圖片 RichTextEditorLink Add Link 新增連結 URL 網址 Text 說明 ServerHandler Unable to resolve hostname Server is not responding to TCP pings UDP packets cannot be sent to or received from the server. Switching to TCP mode. UDP封包無法送發到伺服器或無法自伺服器接收。切換為 TCP 模式。 UDP packets cannot be sent to the server. Switching to TCP mode. UDP封包無法發送到伺服器。切換為 TCP 模式。 UDP packets cannot be received from the server. Switching to TCP mode. UDP封包無法自伺服器接收。切換為 TCP 模式。 UDP packets can be sent to and received from the server. Switching back to UDP mode. UDP封包可以送到伺服器且可以自伺服器接收。切換回 UDP 模式。 Connection timed out 連線逾時 ServerView Favorite 我的最愛 LAN 區域網路 Public Internet 公開網路 Unknown Africa 非洲 Asia 亞洲 North America 北美洲 South America 南美洲 Europe 歐洲 Oceania 大洋洲 ShortcutActionWidget Unassigned 未分配 ShortcutDelegate On 開啟 Off 關閉 Toggle 切換 Unassigned 未分配 ShortcutKeyWidget Press Shortcut 輸入熱鍵 ShortcutTargetDialog Root Parent 上層 Current 目前 Subchannel #%1 子頻道 #%1 ShortcutTargetWidget ... , Root Parent 父級 Current 目前 Subchannel #%1 子頻道 #%1 Invalid 無效 Empty <Empty> ShortcutToggleWidget Off 關閉 Toggle 切換 On 開啟 TextMessage Enter text 輸入文字 If checked the message is recursively sent to all subchannels 選擇後訊息將發送到所有子頻道。 Send recursively to subchannels 發送到所有子頻道。 Tokens Empty Token 空白授權碼 Mumble - Access Tokens Mumble - 授權碼 List of access tokens on current server 列出目前伺服器所有授權碼 <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. Add a token 新增授權碼 &Add 新增(&A) Remove a token 移除一個授權碼 &Remove 移除(&R) UserEdit Registered Users 註冊使用者 Remove 移除 Rename 更名 Who are you looking for? 您在找誰? Days Weeks Months Years Inactive for 停止活動 Registered users: %n account(s) 已註冊使用者:%n 個帳號 UserInformation User Information 使用者資訊 Connection Information 連線資訊 Version 版本 OS 作業系統 Certificate 憑證 IP Address IP位置 CELT Versions CELT 版本 Details... 細節... Ping Statistics Ping 統計 Pings received 接收的 Ping Average ping 平均 ping TCP (Control) TCP (控制) UDP (Voice) UDP (語音) UDP Network statistics UDP 網路統計 Good Late 延遲 Lost 遺失 Resync 重新同步 From Client 從客戶端 To Client 到客戶端 Connection time 連接時間 %1w %1w %1d %1d %1h %1h %1m %1m %1s %1s , %1 (%2) %1.%2.%3 (%4) %1 (%2) Supported 支援 Not Supported 不支援 Not Reported 不回報 %1 online (%2 idle) 線上 %1 (%2 發呆) %1 online 線上 %1 %1 kbit/s %1 kbit/s Bandwidth GroupBox 頻寬 Bandwidth Label 頻寬 Ping deviation Ping 誤差 UserListModel Nick 暱稱 Inactive days 停止活動天數 Last channel 最新頻道 Last seen: %1 最後看見: %1 Never 從不 Channel ID: %1 UserLocalVolumeDialog Local volume for other users <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. Adjusting local volume for %1 調整 %1 的本機音量 dB 分貝 <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: 這是一位與伺服器連接的使用者。使用者左邊的圖示顯示他是否正在發話。 Talking to your channel. 正在對你的頻道講話。 Shouting directly to your channel. Whispering directly to your channel. 直接對你的頻道大喊。 Whispering directly to you. 直接對您發送悄悄話。 Not talking. 沒有說話。 This is a channel on the server. The icon indicates the state of the channel: 此為伺服器上的一個頻道。圖示顯示頻道狀態: Your current channel. 你目前的頻道。 A channel that is linked with your channel. Linked channels can talk to each other. 一個與您的頻道連接的頻道。連接的頻道可以相互通話。 A channel on the server that you are not linked to. 伺服器上一個你沒有連接的頻道。 This shows the flags the user has on the server, if any: 如果有的話,顯示此伺服氣上的使用者標示: On your friend list 在好友清單中 Authenticated user 授權的使用者 Muted (manually muted by self) 關閉麥克風的 (自主關閉麥克風) Muted (manually muted by admin) 關閉麥克風的 (管理員設定關閉麥克風) Muted (not allowed to speak in current channel) 關閉麥克風的 (不允許在目前的頻道發話) Muted (muted by you, only on your machine) 關閉麥克風的 (自主關閉麥克風,只在您的機器上有效) Muted (push-to-mute) Deafened (by self) 關閉喇叭(自設) Deafened (by admin) 關閉喇叭(管理員設) User has a new comment set (click to show) 使用者更新了說明 (點擊顯示) User has a comment set, which you've already seen. (click to show) 使用者更新了說明,您已閱畢。(點擊顯示) Ignoring Text Messages 忽略文字訊息 This shows the flags the channel has, if any: 如果有的話,顯示頻道標誌: Channel has a new comment set (click to show) 頻道有新說明 (點擊顯示) Channel has a comment set, which you've already seen. (click to show) 頻道有新說明,您已閱畢。 (點擊顯示) Channel will be hidden when filtering is enabled 當過濾啟用時頻道將會隱藏 Name 名稱 Flags 標誌 Are you sure you want to drag this user? Are you sure you want to drag this channel? 你確定要移動這個頻道? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. 無法自動調整位置,請重新調整編號順序。 VersionCheck Upgrade Mumble 更新 Mumble A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? 檢測到新版的 Mumble 並已自動下載。建議您更新到此版本,或降版到最新穩定版。需要立即啟動安裝程式嗎? Failed to launch snapshot installer. 快照版安裝程式啟動失敗。 Corrupt download of new version detected. Automatically removed. 新版程式下載失敗。已自動移除。 Downloading new snapshot from %1 to %2 從 %1 下載新快照版到 %2 Failed to write new version to disk. Failed to write new version to disc. 新版程式寫入失敗。 Mumble failed to retrieve version information from the central server. Mumble 接收中央伺服器訊息失敗。 ViewCert Certificate Chain Details 認証鏈詳細信息 Certificate chain 認証鏈 Certificate details 認証詳細信息 Common Name Organization Subunit Country Locality State Valid from: %1 有效期始于: %1 Valid to: %1 有效期到: %1 Serial: %1 序列號: %1 Public Key: %1 bits %2 公開密鑰: %1 比特 %2 RSA 非對稱加密算法 DSA 數字簽名算法 Digest (SHA-1): %1 摘要 (SHA-1): %1 Digest (SHA-256): %1 Email: %1 Email: %1 DNS: %1 DNS: %1 Issued by: 發布者: Unit Name VoiceRecorder Recorder failed to create directory '%1' 建立 %1 目錄失敗 Recorder failed to open file '%1' 錄音機開啟 '%1' 失敗 .wav - Uncompressed .wav - 未壓縮 .ogg (Vorbis) - Compressed .ogg (Vorbis) - 有壓縮 .au - Uncompressed .au - 未壓縮 .flac - Lossless compressed .flac - 無損壓縮 VoiceRecorderDialog Recorder 錄音 Control 控制 00:00:00 00:00:00 &Start 開始(&S) S&top 停止(&t) Mode 模式 Multichannel 多聲道 Output 輸出 Output format 輸出格式 Target directory 輸出目錄 Filename 檔案名稱 &Browse... 瀏覽(&B)... Valid variables are: 無效的變量: Inserts the user's name 插入使用者名稱 Inserts the current date 插入目前日期 Inserts the current time 插入目前時間 Inserts the hostname 插入主機名稱 Recorder still running 持續錄音中 Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? 不停止錄音而直接關閉將導致未寫入的音效檔廢棄。您確定要關閉錄音? Unable to start recording. Not connected to a server. 無法開始錄音。沒有與伺服器連線。 The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. 目前連線的伺服器版本為 1.2.2 或更舊版,因此無法錄音。在低於 1.2.3 版的伺服器上無法錄音。 請聯絡伺服器管理員獲得更多訊息。 There is already a recorder active for this server. 已有一個錄音機在本伺服器使用。 Please select a recording format. 請選擇錄音格式。 Stopping 停止中 Select target directory 選擇目標目錄 Downmix 立體聲轉單聲道 WASAPIInput Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone. WASAPISystem Default Device 預設裝置 qwPTTButtonWidget Mumble PTT Mumble 按鍵發話 Push to talk 按鍵發話 mumble-1.3.4/src/mumble/VoiceRecorderDialog.cpp0000664000175000017500000002001214010707274021264 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "VoiceRecorderDialog.h" #include "AudioOutput.h" #include "ServerHandler.h" #include "VoiceRecorder.h" // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" VoiceRecorderDialog::VoiceRecorderDialog(QWidget *p) : QDialog(p), qtTimer(new QTimer(this)) { qtTimer->setObjectName(QLatin1String("qtTimer")); qtTimer->setInterval(200); setupUi(this); qleTargetDirectory->setText(g.s.qsRecordingPath); qleFilename->setText(g.s.qsRecordingFile); qrbDownmix->setChecked(g.s.rmRecordingMode == Settings::RecordingMixdown); qrbMultichannel->setChecked(g.s.rmRecordingMode == Settings::RecordingMultichannel); QString qsTooltip = QString::fromLatin1( "%1" "" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "
%user%2
%date%3
%time%4
%host%5
"). arg(tr("Valid variables are:")). arg(tr("Inserts the user's name")). arg(tr("Inserts the current date")). arg(tr("Inserts the current time")). arg(tr("Inserts the hostname")); qleTargetDirectory->setToolTip(qsTooltip); qleFilename->setToolTip(qsTooltip); // Populate available codecs Q_ASSERT(VoiceRecorderFormat::kEnd != 0); for (int fm = 0; fm < VoiceRecorderFormat::kEnd; fm++) { qcbFormat->addItem(VoiceRecorderFormat::getFormatDescription(static_cast(fm))); } if (g.s.iRecordingFormat < 0 || g.s.iRecordingFormat > VoiceRecorderFormat::kEnd) g.s.iRecordingFormat = 0; qcbFormat->setCurrentIndex(g.s.iRecordingFormat); } VoiceRecorderDialog::~VoiceRecorderDialog() { reset(); } void VoiceRecorderDialog::closeEvent(QCloseEvent *evt) { if (g.sh) { VoiceRecorderPtr recorder(g.sh->recorder); if (recorder && recorder->isRunning()) { int ret = QMessageBox::warning(this, tr("Recorder still running"), tr("Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No); if (ret == QMessageBox::No) { evt->ignore(); return; } recorder->stop(true); } } g.s.qsRecordingPath = qleTargetDirectory->text(); g.s.qsRecordingFile = qleFilename->text(); if (qrbDownmix->isChecked()) g.s.rmRecordingMode = Settings::RecordingMixdown; else g.s.rmRecordingMode = Settings::RecordingMultichannel; int i = qcbFormat->currentIndex(); g.s.iRecordingFormat = (i == -1) ? 0 : i; reset(); evt->accept(); QDialog::closeEvent(evt); } void VoiceRecorderDialog::on_qpbStart_clicked() { if (!g.uiSession || !g.sh) { QMessageBox::critical(this, tr("Recorder"), tr("Unable to start recording. Not connected to a server.")); reset(); return; } if (g.sh->uiVersion < 0x010203) { QMessageBox::critical(this, tr("Recorder"), tr("The server you are currently connected to is version 1.2.2 or older. " "For privacy reasons, recording on servers of versions older than 1.2.3 " "is not possible.\nPlease contact your server administrator for further " "information.")); return; } if (g.sh->recorder) { QMessageBox::information(this, tr("Recorder"), tr("There is already a recorder active for this server.")); return; } // Check validity of input int ifm = qcbFormat->currentIndex(); if (ifm == -1) { QMessageBox::critical(this, tr("Recorder"), tr("Please select a recording format.")); return; } QString dstr = qleTargetDirectory->text(); if (dstr.isEmpty()) { on_qpbTargetDirectoryBrowse_clicked(); dstr = qleTargetDirectory->text(); if (dstr.isEmpty()) return; } QDir dir(dstr); QFileInfo fi(qleFilename->text()); QString basename(fi.baseName()); QString suffix(fi.completeSuffix()); if (suffix.isEmpty()) suffix = VoiceRecorderFormat::getFormatDefaultExtension(static_cast(ifm)); if (basename.isEmpty()) { basename = QLatin1String("%user"); } qleFilename->setText(basename); AudioOutputPtr ao(g.ao); if (!ao) return; g.sh->announceRecordingState(true); // Create the recorder VoiceRecorder::Config config; config.sampleRate = ao->getMixerFreq(); config.fileName = dir.absoluteFilePath(basename + QLatin1Char('.') + suffix); config.mixDownMode = qrbDownmix->isChecked(); config.recordingFormat = static_cast(ifm); g.sh->recorder.reset(new VoiceRecorder(this, config)); VoiceRecorderPtr recorder(g.sh->recorder); // Wire it up connect(&*recorder, SIGNAL(recording_started()), this, SLOT(onRecorderStarted())); connect(&*recorder, SIGNAL(recording_stopped()), this, SLOT(onRecorderStopped())); connect(&*recorder, SIGNAL(error(int, QString)), this, SLOT(onRecorderError(int, QString))); recorder->start(); qpbStart->setDisabled(true); qpbStop->setEnabled(true); qgbMode->setDisabled(true); qgbOutput->setDisabled(true); } void VoiceRecorderDialog::on_qpbStop_clicked() { if (!g.sh) { reset(); return; } VoiceRecorderPtr recorder(g.sh->recorder); if (!recorder) { reset(); return; } // Stop clock and recording qtTimer->stop(); recorder->stop(); // Disable stop botton to indicate we reacted qpbStop->setDisabled(true); qpbStop->setText(tr("Stopping")); } void VoiceRecorderDialog::on_qtTimer_timeout() { if (!g.sh) { reset(); return; } if (!g.uiSession) { reset(false); return; } VoiceRecorderPtr recorder(g.sh->recorder); if (!g.sh->recorder) { reset(); return; } const QTime elapsedTime = QTime(0,0).addMSecs(static_cast(recorder->getElapsedTime() / 1000)); qlTime->setText(elapsedTime.toString()); } void VoiceRecorderDialog::on_qpbTargetDirectoryBrowse_clicked() { QString dir = QFileDialog::getExistingDirectory(this, tr("Select target directory"), QString(), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); if (!dir.isEmpty()) qleTargetDirectory->setText(dir); } void VoiceRecorderDialog::reset(bool resettimer) { qtTimer->stop(); if (g.sh) { VoiceRecorderPtr recorder(g.sh->recorder); if (recorder) { g.sh->recorder.reset(); g.sh->announceRecordingState(false); } } qpbStart->setEnabled(true); qpbStop->setDisabled(true); qpbStop->setText(tr("S&top")); qgbMode->setEnabled(true); qgbOutput->setEnabled(true); if (resettimer) qlTime->setText(QLatin1String("00:00:00")); } void VoiceRecorderDialog::onRecorderStopped() { reset(false); } void VoiceRecorderDialog::onRecorderStarted() { qlTime->setText(QLatin1String("00:00:00")); qtTimer->start(); } void VoiceRecorderDialog::onRecorderError(int err, QString strerr) { Q_UNUSED(err); QMessageBox::critical(this, tr("Recorder"), strerr); reset(false); } mumble-1.3.4/src/mumble/ViewCert.cpp0000664000175000017500000001343014010707274017147 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "ViewCert.h" static QString decode_utf8_qssl_string(const QString &input) { QString i = input; return QUrl::fromPercentEncoding(i.replace(QLatin1String("\\x"), QLatin1String("%")).toLatin1()); } #if QT_VERSION >= 0x050000 static QStringList processQSslCertificateInfo(QStringList in) { QStringList list; foreach (QString str, in) { list << decode_utf8_qssl_string(str); } return list; } #else static QStringList processQSslCertificateInfo(QString in) { QStringList out; out << decode_utf8_qssl_string(in); return out; } #endif static void addQSslCertificateInfo(QStringList &l, const QString &label, const QStringList &items) { foreach (const QString &item, items) { l << QString(QLatin1String("%1: %2")).arg(label, item); } } static QString certificateFriendlyName(const QSslCertificate &cert) { QStringList cnList = processQSslCertificateInfo(cert.subjectInfo(QSslCertificate::CommonName)); QStringList orgList = processQSslCertificateInfo(cert.subjectInfo(QSslCertificate::Organization)); QString cn; if (cnList.count() > 0) { cn = cnList.at(0); } QString org; if (orgList.count() > 0) { org = orgList.at(0); } return QString(QLatin1String("%1 %2")).arg(cn, org); } ViewCert::ViewCert(QList cl, QWidget *p) : QDialog(p) { qlCerts = cl; setWindowTitle(tr("Certificate Chain Details")); QHBoxLayout *h; QVBoxLayout *v; QGroupBox *qcbChain, *qcbDetails; qcbChain=new QGroupBox(tr("Certificate chain"), this); h = new QHBoxLayout(qcbChain); qlwChain = new QListWidget(qcbChain); qlwChain->setObjectName(QLatin1String("Chain")); // load certs into a set as a hacky fix to #2141 #if QT_VERSION >= 0x050400 QSet qlCertSet; #else QList qlCertSet; #endif foreach(QSslCertificate c, qlCerts) { if(!qlCertSet.contains(c)) { qlwChain->addItem(certificateFriendlyName(c)); qlCertSet << c; } } h->addWidget(qlwChain); qcbDetails=new QGroupBox(tr("Certificate details"), this); h = new QHBoxLayout(qcbDetails); qlwCert = new QListWidget(qcbDetails); h->addWidget(qlwCert); QDialogButtonBox *qdbb = new QDialogButtonBox(QDialogButtonBox::Ok, Qt::Horizontal, this); v = new QVBoxLayout(this); v->addWidget(qcbChain); v->addWidget(qcbDetails); v->addWidget(qdbb); QMetaObject::connectSlotsByName(this); connect(qdbb, SIGNAL(accepted()), this, SLOT(accept())); resize(510,300); } QString ViewCert::prettifyDigest(QString digest) { QString pretty_digest = digest.toUpper(); int step = 2; QChar separator = QChar::fromLatin1(':'); for (int i = step; i < pretty_digest.size(); i += step + 1) { pretty_digest.insert(i, separator); } return pretty_digest; } void ViewCert::on_Chain_currentRowChanged(int idx) { qlwCert->clear(); if ((idx < 0) || (idx >= qlCerts.size())) return; QStringList l; const QSslCertificate &c=qlCerts.at(idx); addQSslCertificateInfo(l, tr("Common Name"), processQSslCertificateInfo(c.subjectInfo(QSslCertificate::CommonName))); addQSslCertificateInfo(l, tr("Organization"), processQSslCertificateInfo(c.subjectInfo(QSslCertificate::Organization))); addQSslCertificateInfo(l, tr("Subunit"), processQSslCertificateInfo(c.subjectInfo(QSslCertificate::OrganizationalUnitName))); addQSslCertificateInfo(l, tr("Country"), processQSslCertificateInfo(c.subjectInfo(QSslCertificate::CountryName))); addQSslCertificateInfo(l, tr("Locality"), processQSslCertificateInfo(c.subjectInfo(QSslCertificate::LocalityName))); addQSslCertificateInfo(l, tr("State"), processQSslCertificateInfo(c.subjectInfo(QSslCertificate::StateOrProvinceName))); l << tr("Valid from: %1").arg(c.effectiveDate().toString()); l << tr("Valid to: %1").arg(c.expiryDate().toString()); l << tr("Serial: %1").arg(QString::fromLatin1(c.serialNumber().toHex())); l << tr("Public Key: %1 bits %2").arg(c.publicKey().length()).arg((c.publicKey().algorithm() == QSsl::Rsa) ? tr("RSA") : tr("DSA")); l << tr("Digest (SHA-1): %1").arg(prettifyDigest(QString::fromLatin1(c.digest(QCryptographicHash::Sha1).toHex()))); #if QT_VERSION >= 0x050000 l << tr("Digest (SHA-256): %1").arg(prettifyDigest(QString::fromLatin1(c.digest(QCryptographicHash::Sha256).toHex()))); #endif #if QT_VERSION >= 0x050000 const QMultiMap &alts = c.subjectAlternativeNames(); QMultiMap::const_iterator i; #else const QMultiMap &alts = c.alternateSubjectNames(); QMultiMap::const_iterator i; #endif for (i=alts.constBegin(); i != alts.constEnd(); ++i) { switch (i.key()) { case QSsl::EmailEntry: { l << tr("Email: %1").arg(i.value()); } break; case QSsl::DnsEntry: { l << tr("DNS: %1").arg(i.value()); } break; default: break; } } l << QString(); l << tr("Issued by:"); addQSslCertificateInfo(l, tr("Common Name"), processQSslCertificateInfo(c.issuerInfo(QSslCertificate::CommonName))); addQSslCertificateInfo(l, tr("Organization"), processQSslCertificateInfo(c.issuerInfo(QSslCertificate::Organization))); addQSslCertificateInfo(l, tr("Unit Name"), processQSslCertificateInfo(c.issuerInfo(QSslCertificate::OrganizationalUnitName))); addQSslCertificateInfo(l, tr("Country"), processQSslCertificateInfo(c.issuerInfo(QSslCertificate::CountryName))); addQSslCertificateInfo(l, tr("Locality"), processQSslCertificateInfo(c.issuerInfo(QSslCertificate::LocalityName))); addQSslCertificateInfo(l, tr("State"), processQSslCertificateInfo(c.issuerInfo(QSslCertificate::StateOrProvinceName))); qlwCert->addItems(l); } mumble-1.3.4/src/mumble/NetworkConfig.h0000664000175000017500000000203514010707273017641 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_NETWORKCONFIG_H_ #define MUMBLE_MUMBLE_NETWORKCONFIG_H_ class QNetworkReply; class QNetworkRequest; class QUrl; #include "ConfigDialog.h" #include "ui_NetworkConfig.h" class NetworkConfig : public ConfigWidget, Ui::NetworkConfig { private: Q_OBJECT Q_DISABLE_COPY(NetworkConfig) public: NetworkConfig(Settings &st); virtual QString title() const Q_DECL_OVERRIDE; virtual QIcon icon() const Q_DECL_OVERRIDE; static void SetupProxy(); static bool TcpModeEnabled(); public slots: void accept() const Q_DECL_OVERRIDE; void save() const Q_DECL_OVERRIDE; void load(const Settings &r) Q_DECL_OVERRIDE; void on_qcbType_currentIndexChanged(int v); }; namespace Network { void prepareRequest(QNetworkRequest &); QNetworkReply *get(const QUrl &); } #endif mumble-1.3.4/src/mumble/OpusCodec.h0000664000175000017500000000311114010707273016742 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_OPUSCODEC_H_ #define MUMBLE_MUMBLE_OPUSCODEC_H_ #include #include #ifndef Q_OS_WIN #define __cdecl #endif /// Loads Opus from a shared library and acts as a wrapper for its functions. class OpusCodec { private: Q_DISABLE_COPY(OpusCodec) protected: QLibrary qlOpus; bool bValid; public: OpusCodec(); virtual ~OpusCodec(); bool isValid() const; void report() const; const char *(__cdecl *opus_get_version_string)(); OpusEncoder *(__cdecl *opus_encoder_create)(opus_int32 Fs, int channels, int application, int *error); int (__cdecl *opus_encoder_ctl)(OpusEncoder *st, int request, ...); void (__cdecl *opus_encoder_destroy)(OpusEncoder *st); OpusDecoder *(__cdecl *opus_decoder_create)(opus_int32 Fs, int channels, int *error); void (__cdecl *opus_decoder_destroy)(OpusDecoder *st); int (__cdecl *opus_encode)(OpusEncoder *st, const opus_int16 *pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes); int (__cdecl *opus_decode_float)(OpusDecoder *st, const unsigned char *data, opus_int32 len, float *pcm, int frame_size, int decode_fec); int (__cdecl *opus_packet_get_nb_frames)(const unsigned char packet[], opus_int32 len); int (__cdecl *opus_packet_get_samples_per_frame)(const unsigned char *data, opus_int32 Fs); }; #endif // OPUSCODEC_H_ mumble-1.3.4/src/mumble/Cert.ui0000664000175000017500000004340614010707273016154 0ustar builderbuilder Certificates 0 0 669 606 Certificate Management QWizard::ClassicStyle Certificate Authentication Authenticating to servers without using passwords 0 <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> true Current certificate This is the certificate Mumble currently uses. Current Certificate Automatic certificate creation skin:actions/bookmark-new.svgskin:actions/bookmark-new.svg 32 32 Create a new certificate This will create a new certificate. Create a new certificate skin:actions/document-new.svgskin:actions/document-new.svg 32 32 true Import certificate from file This will import a certificate from file. Import a certificate skin:actions/document-open.svgskin:actions/document-open.svg 32 32 false Export Certificate This will export a certificate to file. Export current certificate skin:actions/document-save-as.svgskin:actions/document-save-as.svg 32 32 Import Certificate PKCS #12 Certificate import 2 <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> true Import from qleImportFile Filename to import from This is the filename you wish to import a certificate from. Select file to import from This opens a file selection dialog to choose a file to import a certificate from. Open... skin:actions/document-open.svgskin:actions/document-open.svg Password qlePassword Password for PKCS#12 file This is the password for the PKCS#12 file containing your certificate. QLineEdit::Password true true color:#ff0000; Certificate to import This is the certificate you are importing. Certificate Details Replace Certificate Replace existing certificate with new certificate? 4 true <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> true 1 0 Current certificate This is the certificate Mumble currently uses. It will be replaced. Current Certificate 1 0 New certificate This is the new certificate that will replace the old one. New Certificate Export Certificate Make a backup of your certificate 3 <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> true Export to qleExportFile Filename to export to This is the filename you wish to export a certificate to. Save As... skin:actions/document-save-as.svgskin:actions/document-save-as.svg Current certificate This is the certificate Mumble currently uses. It will be exported. Certificate Details New Certificate Generate a new certificate for strong authentication 1 <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> true Name qleName Email qleEmail Your email address (e.g. johndoe@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. Your name (e.g. John Doe) This is your name, and will be filled out in the certificate. This field is entirely optional. Finish Certificate-based authentication is ready for use 5 Enjoy using Mumble with strong authentication. true CompletablePage QWizardPage
AudioWizard.h
1
CertView QGroupBox
Cert.h
1
qrbQuick qrbCreate qrbImport qrbExport qleImportFile qpbImportFile qlePassword qleExportFile qpbExportFile qleName qleEmail
mumble-1.3.4/src/mumble/XMLTools.h0000664000175000017500000000277114010707274016553 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_XMLTOOLS_H_ #define MUMBLE_MUMBLE_XMLTOOLS_H_ #include #include #include #include class XMLTools : public QObject { Q_OBJECT public: /* Recursively parse and output XHTML. * This will drop , etc, take the contents of and strip out unnecesarry styles. * It will also change into matching , or . */ static void recurseParse(QXmlStreamReader &reader, QXmlStreamWriter &writer, int ¶graphs, const QMap &opstyle, const int close = 0, bool ignore = true); /* Iterate XML and remove close-followed-by-open. * For example, make "bold with italic" into * "bold with italic" * * If the input XML is or may not be valid, a "unduplicate" tag can be used as a root element, * which will be dropped and not written to writer. * * Input XML has to be valid XML. * * Works on b, i, u, and a elements. */ static bool unduplicateTags(QXmlStreamReader &reader, QXmlStreamWriter &writer); }; #endif // XMLTOOLS_H mumble-1.3.4/src/mumble/TextToSpeech_win.cpp0000664000175000017500000000303714010707273020654 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "TextToSpeech.h" #include #include #undef FAILED #define FAILED(Status) (static_cast(Status)<0) class TextToSpeechPrivate { public: ISpVoice * pVoice; TextToSpeechPrivate(); ~TextToSpeechPrivate(); void say(const QString &text); void setVolume(int v); }; TextToSpeechPrivate::TextToSpeechPrivate() { pVoice = NULL; HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice); if (FAILED(hr)) qWarning("TextToSpeechPrivate: Failed to allocate TTS Voice"); } TextToSpeechPrivate::~TextToSpeechPrivate() { if (pVoice) pVoice->Release(); } void TextToSpeechPrivate::say(const QString &text) { if (pVoice) { pVoice->Speak((const wchar_t *) text.utf16(), SPF_ASYNC, NULL); } } void TextToSpeechPrivate::setVolume(int volume) { if (pVoice) pVoice->SetVolume(volume); } TextToSpeech::TextToSpeech(QObject *p) : QObject(p) { enabled = true; d = new TextToSpeechPrivate(); } TextToSpeech::~TextToSpeech() { delete d; } void TextToSpeech::say(const QString &text) { if (enabled) d->say(text); } void TextToSpeech::setEnabled(bool e) { enabled = e; } void TextToSpeech::setVolume(int volume) { d->setVolume(volume); } bool TextToSpeech::isEnabled() const { return enabled; } mumble-1.3.4/src/mumble/Overlay_macx.mm0000664000175000017500000002752414010707273017707 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #import #import #include #include "OverlayConfig.h" #include "OverlayClient.h" #include "MainWindow.h" // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" extern "C" { #include } // Ignore deprecation warnings for the whole file, for now. #pragma GCC diagnostic ignored "-Wdeprecated-declarations" static NSString *MumbleOverlayLoaderBundle = @"/Library/ScriptingAdditions/MumbleOverlay.osax"; static NSString *MumbleOverlayLoaderBundleIdentifier = @"net.sourceforge.mumble.OverlayScriptingAddition"; @interface OverlayInjectorMac : NSObject { BOOL active; } - (id) init; - (void) dealloc; - (void) appLaunched:(NSNotification *)notification; - (void) setActive:(BOOL)flag; - (void) eventDidFail:(const AppleEvent *)event withError:(NSError *)error; @end #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 @interface OverlayInjectorMac () @end #endif @implementation OverlayInjectorMac - (id) init { self = [super init]; if (self) { active = NO; NSWorkspace *workspace = [NSWorkspace sharedWorkspace]; [[workspace notificationCenter] addObserver:self selector:@selector(appLaunched:) name:NSWorkspaceDidLaunchApplicationNotification object:workspace]; return self; } return nil; } - (void) dealloc { NSWorkspace *workspace = [NSWorkspace sharedWorkspace]; [[workspace notificationCenter] removeObserver:self name:NSWorkspaceDidLaunchApplicationNotification object:workspace]; [super dealloc]; } - (void) appLaunched:(NSNotification *)notification { if (active) { BOOL overlayEnabled = NO; NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSDictionary *userInfo = [notification userInfo]; NSString *bundleId = [userInfo objectForKey:@"NSApplicationBundleIdentifier"]; if ([bundleId isEqualToString:[[NSBundle mainBundle] bundleIdentifier]]) return; QString qsBundleIdentifier = QString::fromUtf8([bundleId UTF8String]); switch (g.s.os.oemOverlayExcludeMode) { case OverlaySettings::LauncherFilterExclusionMode: { qWarning("Overlay_macx: launcher filter mode not implemented on macOS, allowing everything"); overlayEnabled = YES; break; } case OverlaySettings::WhitelistExclusionMode: { if (g.s.os.qslWhitelist.contains(qsBundleIdentifier)) { overlayEnabled = YES; } break; } case OverlaySettings::BlacklistExclusionMode: { if (! g.s.os.qslBlacklist.contains(qsBundleIdentifier)) { overlayEnabled = YES; } break; } } if (overlayEnabled) { pid_t pid = [[userInfo objectForKey:@"NSApplicationProcessIdentifier"] intValue]; SBApplication *app = [SBApplication applicationWithProcessIdentifier:pid]; [app setDelegate:self]; // This timeout is specified in 'ticks'. // A tick defined as: "[...] (a tick is approximately 1/60 of a second) [...]" in the // Apple Event Manager Refernce documentation: // http://developer.apple.com/legacy/mac/library/documentation/Carbon/reference/Event_Manager/Event_Manager.pdf [app setTimeout:10*60]; [app setSendMode:kAEWaitReply]; [app sendEvent:kASAppleScriptSuite id:kGetAEUT parameters:0]; [app setSendMode:kAENoReply]; if (QSysInfo::MacintoshVersion == QSysInfo::MV_LEOPARD) { [app sendEvent:'MUOL' id:'daol' parameters:0]; } else if (QSysInfo::MacintoshVersion >= QSysInfo::MV_SNOWLEOPARD) { [app sendEvent:'MUOL' id:'load' parameters:0]; } } [pool release]; } } - (void) setActive:(BOOL)flag { active = flag; } // SBApplication delegate method - (void)eventDidFail:(const AppleEvent *)event withError:(NSError *)error { Q_UNUSED(event); Q_UNUSED(error); // Do nothing. This method is only here to avoid an exception. } @end class OverlayPrivateMac : public OverlayPrivate { protected: OverlayInjectorMac *olm; public: void setActive(bool); OverlayPrivateMac(QObject *); ~OverlayPrivateMac(); }; OverlayPrivateMac::OverlayPrivateMac(QObject *p) : OverlayPrivate(p) { olm = [[OverlayInjectorMac alloc] init]; } OverlayPrivateMac::~OverlayPrivateMac() { [olm release]; } void OverlayPrivateMac::setActive(bool act) { [olm setActive:act]; } void Overlay::platformInit() { d = new OverlayPrivateMac(this); } void Overlay::setActiveInternal(bool act) { if (d) { /// Only act if the private instance has been created already static_cast(d)->setActive(act); } } bool OverlayConfig::supportsInstallableOverlay() { return true; } void OverlayClient::updateMouse() { QCursor c = qgv.viewport()->cursor(); NSCursor *cursor = nil; Qt::CursorShape csShape = c.shape(); switch (csShape) { case Qt::IBeamCursor: cursor = [NSCursor IBeamCursor]; break; case Qt::CrossCursor: cursor = [NSCursor crosshairCursor]; break; case Qt::ClosedHandCursor: cursor = [NSCursor closedHandCursor]; break; case Qt::OpenHandCursor: cursor = [NSCursor openHandCursor]; break; case Qt::PointingHandCursor: cursor = [NSCursor pointingHandCursor]; break; case Qt::SizeVerCursor: cursor = [NSCursor resizeUpDownCursor]; break; case Qt::SplitVCursor: cursor = [NSCursor resizeUpDownCursor]; break; case Qt::SizeHorCursor: cursor = [NSCursor resizeLeftRightCursor]; break; case Qt::SplitHCursor: cursor = [NSCursor resizeLeftRightCursor]; break; default: cursor = [NSCursor arrowCursor]; break; } QPixmap pm = qmCursors.value(csShape); if (pm.isNull()) { NSImage *img = [cursor image]; CGImageRef cgimg = NULL; NSArray *reps = [img representations]; for (NSUInteger i = 0; i < [reps count]; i++) { NSImageRep *rep = [reps objectAtIndex:i]; if ([rep class] == [NSBitmapImageRep class]) { cgimg = [(NSBitmapImageRep *)rep CGImage]; } } #if QT_VERSION < 0x050000 if (cgimg) { pm = QPixmap::fromMacCGImageRef(cgimg); qmCursors.insert(csShape, pm); } #endif } NSPoint p = [cursor hotSpot]; iOffsetX = (int) p.x; iOffsetY = (int) p.y; qgpiCursor->setPixmap(pm); qgpiCursor->setPos(iMouseX - iOffsetX, iMouseY - iOffsetY); } QString installerPath() { NSString *installerPath = [[NSBundle mainBundle] pathForResource:@"MumbleOverlay" ofType:@"pkg"]; if (installerPath) { return QString::fromUtf8([installerPath UTF8String]); } return QString(); } bool OverlayConfig::isInstalled() { bool ret = false; // Determine if the installed bundle is correctly installed (i.e. it's loadable) NSBundle *bundle = [NSBundle bundleWithPath:MumbleOverlayLoaderBundle]; ret = [bundle preflightAndReturnError:NULL]; // Do the bundle identifiers match? if (ret) { ret = [[bundle bundleIdentifier] isEqualToString:MumbleOverlayLoaderBundleIdentifier]; } return ret; } // Check whether this installer installs something 'newer' than what we already have. // Also checks whether the new installer is compatiable with the current version of // Mumble. static bool isInstallerNewer(QString path, NSUInteger curVer) { xar_t pkg = NULL; xar_iter_t iter = NULL; xar_file_t file = NULL; char *data = NULL; size_t size = 0; bool ret = false; QString qsMinVer, qsOverlayVer; pkg = xar_open(path.toUtf8().constData(), READ); if (pkg == NULL) { qWarning("isInstallerNewer: Unable to open pkg."); goto out; } iter = xar_iter_new(); if (iter == NULL) { qWarning("isInstallerNewer: Unable to allocate iter"); goto out; } file = xar_file_first(pkg, iter); while (file != NULL) { if (!strcmp(xar_get_path(file), "upgrade.xml")) break; file = xar_file_next(iter); } if (file != NULL) { if (xar_extract_tobuffersz(pkg, file, &data, &size) == -1) { goto out; } QXmlStreamReader reader(QByteArray::fromRawData(data, size)); while (! reader.atEnd()) { QXmlStreamReader::TokenType tok = reader.readNext(); if (tok == QXmlStreamReader::StartElement) { if (reader.name() == QLatin1String("upgrade")) { qsOverlayVer = reader.attributes().value(QLatin1String("version")).toString(); qsMinVer = reader.attributes().value(QLatin1String("minclient")).toString(); } } } if (reader.hasError() || qsMinVer.isNull() || qsOverlayVer.isNull()) { qWarning("isInstallerNewer: Error while parsing XML version info."); goto out; } NSUInteger newVer = qsOverlayVer.toUInt(); QRegExp rx(QLatin1String("(\\d+)\\.(\\d+)\\.(\\d+)")); int major, minor, patch; int minmajor, minminor, minpatch; if (! rx.exactMatch(QLatin1String(MUMTEXT(MUMBLE_VERSION_STRING)))) goto out; major = rx.cap(1).toInt(); minor = rx.cap(2).toInt(); patch = rx.cap(3).toInt(); if (! rx.exactMatch(qsMinVer)) goto out; minmajor = rx.cap(1).toInt(); minminor = rx.cap(2).toInt(); minpatch = rx.cap(3).toInt(); ret = (major >= minmajor) && (minor >= minminor) && (patch >= minpatch) && (newVer > curVer); } out: xar_close(pkg); xar_iter_free(iter); free(data); return ret; } bool OverlayConfig::needsUpgrade() { NSDictionary *infoPlist = [NSDictionary dictionaryWithContentsOfFile:[NSString stringWithFormat:@"%@/Contents/Info.plist", MumbleOverlayLoaderBundle]]; if (infoPlist) { NSUInteger curVersion = [[infoPlist objectForKey:@"MumbleOverlayVersion"] unsignedIntegerValue]; QString path = installerPath(); if (path.isEmpty()) return false; return isInstallerNewer(path, curVersion); } return false; } static bool authExec(AuthorizationRef ref, const char **argv) { OSStatus err = noErr; int pid = 0, status = 0; err = AuthorizationExecuteWithPrivileges(ref, argv[0], kAuthorizationFlagDefaults, const_cast(&argv[1]), NULL); if (err == errAuthorizationSuccess) { do { pid = wait(&status); } while (pid == -1 && errno == EINTR); return (pid != -1 && WIFEXITED(status) && WEXITSTATUS(status) == 0); } qWarning("Overlay_macx: Failed to AuthorizeExecuteWithPrivileges. (err=%i)", err); qWarning("Overlay_macx: Status: (pid=%i, exited=%u, exitStatus=%u)", pid, WIFEXITED(status), WEXITSTATUS(status)); return false; } bool OverlayConfig::installFiles() { bool ret = false; QString path = installerPath(); if (path.isEmpty()) { qWarning("OverlayConfig: No installers found in search paths."); return false; } QProcess installer(this); QStringList args; args << QString::fromLatin1("-W"); args << path; installer.start(QLatin1String("/usr/bin/open"), args, QIODevice::ReadOnly); while (!installer.waitForFinished(1000)) { qApp->processEvents(); } return ret; } bool OverlayConfig::uninstallFiles() { AuthorizationRef auth; NSBundle *loaderBundle; bool ret = false, bundleOk = false; OSStatus err; // Load the installed loader bundle and check if it's something we're willing to uninstall. loaderBundle = [NSBundle bundleWithPath:MumbleOverlayLoaderBundle]; bundleOk = [[loaderBundle bundleIdentifier] isEqualToString:MumbleOverlayLoaderBundleIdentifier]; // Perform uninstallation using Authorization Services. (Pops up a dialog asking for admin privileges) if (bundleOk) { err = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, kAuthorizationFlagDefaults, &auth); if (err == errAuthorizationSuccess) { QByteArray tmp = QString::fromLatin1("/tmp/%1_Uninstalled_MumbleOverlay.osax").arg(QDateTime::currentMSecsSinceEpoch()).toLocal8Bit(); const char *remove[] = { "/bin/mv", [MumbleOverlayLoaderBundle UTF8String], tmp.constData(), NULL }; ret = authExec(auth, remove); } AuthorizationFree(auth, kAuthorizationFlagDefaults); } return ret; } mumble-1.3.4/src/mumble/VoiceRecorder.h0000664000175000017500000001461514010707274017625 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_VOICERECORDER_H_ #define MUMBLE_MUMBLE_VOICERECORDER_H_ #ifndef Q_MOC_RUN # include # include #endif #include #include #include #include #include #include #include class ClientUser; class RecordUser; class Timer; /// Utilities and enums for voice recorder format handling namespace VoiceRecorderFormat { /// List of all formats currently supported by the recorder. enum Format { /// WAVE Format WAV = 0, // When switching between a non vorbis capable lib and a vorbis capable one // this can mess up the selection stored in the config #ifndef NO_VORBIS_RECORDING /// Ogg Vorbis Format VORBIS, #endif /// AU Format AU, /// FLAC Format FLAC, kEnd }; /// Returns a human readable description of the format id. QString getFormatDescription(VoiceRecorderFormat::Format fm); /// Returns the default extension for the given format. QString getFormatDefaultExtension(VoiceRecorderFormat::Format fm); } /// Class for recording audio data. /// /// Runs as a seperate thread accepting audio data through the addBuffer method /// which is then encoded using one of the formats of VoiceRecordingFormat::Format /// and written to disk. /// class VoiceRecorder : public QThread { Q_OBJECT public: /// Possible error conditions inside the recorder enum Error { Unspecified, CreateDirectoryFailed, CreateFileFailed, InvalidSampleRate }; /// Structure for holding configuration of VoiceRecorder object struct Config { /// The current sample rate of the recorder. int sampleRate; /// The path to store recordings. QString fileName; /// True if multi channel recording is disabled. bool mixDownMode; /// The current recording format. VoiceRecorderFormat::Format recordingFormat; }; /// Creates a new VoiceRecorder instance. VoiceRecorder(QObject *p, const Config& config); ~VoiceRecorder() Q_DECL_OVERRIDE; /// The main event loop of the thread, which writes all buffers to files. void run() Q_DECL_OVERRIDE; /// Stops the main loop. /// @param force If true buffers are discarded. Otherwise the thread will not stop before writing everything. void stop(bool force = false); /// Remembers the current time for a set of coming addBuffer calls void prepareBufferAdds(); /// Adds an audio buffer which contains |samples| audio samples to the recorder. /// The audio data will be assumed to be recorded at the time /// prepareBufferAdds was last called. /// @param clientUser User for which to add the audio data. NULL in mixdown mode. void addBuffer(const ClientUser *clientUser, boost::shared_array buffer, int samples); /// Returns the elapsed time since the recording started. quint64 getElapsedTime() const; /// Returns a refence to the record user which is used to record local audio. RecordUser &getRecordUser() const; /// Returns true if the recorder is recording mixed down data instead of multichannel bool isInMixDownMode() const; signals: /// Emitted if an error is encountered void error(int err, QString strerr); /// Emitted when recording is started void recording_started(); /// Emitted when recording is stopped void recording_stopped(); private: /// Stores information about a recording buffer. struct RecordBuffer { /// Constructs a new RecordBuffer object. RecordBuffer(int recordInfoIndex_, boost::shared_array buffer_, int samples_, quint64 absoluteStartSample_); /// Hashmap index for the user const int recordInfoIndex; /// The buffer. boost::shared_array buffer; /// The number of samples in the buffer. int samples; /// Absolute sample number at the start of this buffer quint64 absoluteStartSample; }; /// Stores the recording state for one user. struct RecordInfo { RecordInfo(const QString& userName_); ~RecordInfo(); /// Name of the user being recorded const QString userName; /// libsndfile's handle. SNDFILE *soundFile; /// The last absolute sample we wrote for this users quint64 lastWrittenAbsoluteSample; }; typedef QHash< int, boost::shared_ptr > RecordInfoMap; /// Removes invalid characters in a path component. QString sanitizeFilenameOrPathComponent(const QString &str) const; /// Expands the template variables in |path| for the given |userName|. QString expandTemplateVariables(const QString &path, const QString& userName) const; /// Returns the RecordInfo hashmap index for the given user int indexForUser(const ClientUser *clientUser) const; /// Create a sndfile SF_INFO structure describing the currently configured recording format SF_INFO createSoundFileInfo() const; /// Opens the file for the given recording information /// Helper function for run method. Will abort recording on failure. bool ensureFileIsOpenedFor(SF_INFO &soundFileInfo, boost::shared_ptr &ri); /// Hash which maps the |uiSession| of all users for which we have to keep a recording state to the corresponding RecordInfo object. RecordInfoMap m_recordInfo; /// List containing all unprocessed RecordBuffer objects. QList< boost::shared_ptr > m_recordBuffer; /// The user which is used to record local audio. boost::scoped_ptr m_recordUser; /// High precision timer for buffer timestamps. boost::scoped_ptr m_timestamp; /// Protects the buffer list |qlRecordBuffer|. QMutex m_bufferLock; /// Wait condition and mutex to block until there is new data. QMutex m_sleepLock; QWaitCondition m_sleepCondition; /// Configuration for this instance const Config m_config; /// True if the main loop is active. bool m_recording; /// Tells the recorder to not finish writing its buffers before returning bool m_abort; /// The timestamp where the recording started. const QDateTime m_recordingStartTime; /// Absolute sample position to assume for buffer adds quint64 m_absoluteSampleEstimation; }; typedef boost::shared_ptr VoiceRecorderPtr; #endif mumble-1.3.4/src/mumble/WASAPI.h0000664000175000017500000000357014010707274016054 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_WASAPI_H_ #define MUMBLE_MUMBLE_WASAPI_H_ #include #include #include #include #include #include #include #include #include #include #ifdef _INC_FUNCTIONDISCOVERYKEYS # undef _INC_FUNCTIONDISCOVERYKEYS #endif #include #include #include #include "AudioInput.h" #include "AudioOutput.h" class WASAPISystem : public QObject { private: Q_OBJECT Q_DISABLE_COPY(WASAPISystem) public: static const QHash getDevices(EDataFlow dataflow); static const QHash getInputDevices(); static const QHash getOutputDevices(); static const QList mapToDevice(const QHash&, const QString&); }; class WASAPIInput : public AudioInput { private: Q_OBJECT Q_DISABLE_COPY(WASAPIInput) public: WASAPIInput(); ~WASAPIInput() Q_DECL_OVERRIDE; void run() Q_DECL_OVERRIDE; }; class WASAPIOutput : public AudioOutput { private: Q_OBJECT Q_DISABLE_COPY(WASAPIOutput) bool setVolumeForSessionControl(IAudioSessionControl *control, const DWORD mumblePID, QSet &seen); bool setVolumeForSessionControl2(IAudioSessionControl2 *control2, const DWORD mumblePID, QSet &seen); protected: typedef QPair VolumePair; QMap qmVolumes; void setVolumes(IMMDevice *, bool talking); public: WASAPIOutput(); ~WASAPIOutput() Q_DECL_OVERRIDE; void run() Q_DECL_OVERRIDE; }; #endif mumble-1.3.4/src/mumble/GKey.h0000664000175000017500000000406614010707273015727 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_GKEY_H #define MUMBLE_MUMBLE_GKEY_H #include #include #include #include #define GKEY_LOGITECH_DLL_REG_HKEY HKEY_CLASSES_ROOT #ifdef _M_X64 #define GKEY_LOGITECH_DLL_REG_PATH L"Wow6432Node\\CLSID\\{7bded654-f278-4977-a20f-6e72a0d07859}\\ServerBinary" #define GKEY_LOGITECH_DLL_DEFAULT_LOCATION "C:/Program Files/Logitech Gaming Software/SDK/G-key/x64/LogitechGkey.dll" #else #define GKEY_LOGITECH_DLL_REG_PATH L"CLSID\\{7bded654-f278-4977-a20f-6e72a0d07859}\\ServerBinary" #define GKEY_LOGITECH_DLL_DEFAULT_LOCATION "C:/Program Files/Logitech Gaming Software/SDK/G-key/x86/LogitechGkey.dll" #endif #define GKEY_MIN_MOUSE_BUTTON 6 #define GKEY_MAX_MOUSE_BUTTON 20 #define GKEY_MIN_KEYBOARD_BUTTON 1 #define GKEY_MAX_KEYBOARD_BUTTON 29 #define GKEY_MIN_KEYBOARD_MODE 1 #define GKEY_MAX_KEYBOARD_MODE 3 #define GKEY_BUTTON_MOUSE 1 #define GKEY_BUTTON_KEYBOARD 2 #define GKEY_MOUSE_GUID "c41e60af-9022-46cf-bc39-37981082d716" #define GKEY_KEYBOARD_GUID "153e64e6-98c8-4e03-80ef-5ffd33d25b8a" class GKeyLibrary { public: GKeyLibrary(); virtual ~GKeyLibrary(); bool isValid() const; static const QUuid quMouse; static const QUuid quKeyboard; bool isMouseButtonPressed(int button); bool isKeyboardGkeyPressed(int key, int mode); QString getMouseButtonString(int button); QString getKeyboardGkeyString(int key, int mode); protected: QLibrary qlLogiGkey; bool bValid; BOOL (*LogiGkeyInit)(void *); void (*LogiGkeyShutdown)(); BOOL (*LogiGkeyIsMouseButtonPressed)(int button); BOOL (*LogiGkeyIsKeyboardGkeyPressed)(int key, int mode); wchar_t *(*LogiGkeyGetMouseButtonString)(int button); wchar_t *(*LogiGkeyGetKeyboardGkeyString)(int key, int mode); }; #endif // MUMBLE_MUMBLE_GKEY_H mumble-1.3.4/src/mumble/ConfigDialog.ui0000664000175000017500000000646414010707273017607 0ustar builderbuilder ConfigDialog 0 0 709 505 Mumble Configuration true 0 0 24 24 QListView::Adjust QListView::Batched true Qt::Horizontal QDialogButtonBox::Reset|QDialogButtonBox::RestoreDefaults Qt::Horizontal 474 22 Qt::Horizontal QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok 1 0 dialogButtonBox accepted() ConfigDialog accept() 167 344 191 319 dialogButtonBox rejected() ConfigDialog reject() 260 356 284 319 mumble-1.3.4/src/mumble/SharedMemory_win.cpp0000664000175000017500000000505714010707273020700 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "SharedMemory.h" #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #include #endif #include struct SharedMemory2Private { HANDLE hMemory; }; SharedMemory2::SharedMemory2(QObject *p, unsigned int minsize, const QString &memname) : QObject(p) { a_ucData = NULL; d = new SharedMemory2Private(); d->hMemory = NULL; if (memname.isEmpty()) { // Create a new segment for (int i=0;i<100;++i) { qsName = QString::fromLatin1("Local\\MumbleOverlayMemory%1").arg(++uiIndex); d->hMemory = CreateFileMappingW(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, minsize, qsName.toStdWString().c_str()); if (d->hMemory && GetLastError() != ERROR_ALREADY_EXISTS) { break; } if (d->hMemory) CloseHandle(d->hMemory); d->hMemory = NULL; } } else { // Open existing segment qsName = memname; d->hMemory = CreateFileMappingW(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, minsize, qsName.toStdWString().c_str()); qWarning("%p %lx", d->hMemory, GetLastError()); if (GetLastError() != ERROR_ALREADY_EXISTS) { qWarning() << "SharedMemory2: Memory doesn't exist" << qsName; if (d->hMemory) { CloseHandle(d->hMemory); d->hMemory = NULL; } } } if (d->hMemory == NULL) { qWarning() << "SharedMemory2: CreateFileMapping failed for" << qsName; } else { a_ucData = reinterpret_cast(MapViewOfFile(d->hMemory, FILE_MAP_ALL_ACCESS, 0, 0, 0)); if (a_ucData == NULL) { qWarning() << "SharedMemory2: Failed to map memory" << qsName; } else { MEMORY_BASIC_INFORMATION mbi; memset(&mbi, 0, sizeof(mbi)); if ((VirtualQuery(a_ucData, &mbi, sizeof(mbi)) == 0) || (mbi.RegionSize < minsize)) { qWarning() << "SharedMemory2: Memory too small" << qsName << mbi.RegionSize; } else { uiSize = mbi.RegionSize; return; } } } if (a_ucData) { UnmapViewOfFile(a_ucData); a_ucData = NULL; } if (d->hMemory) { CloseHandle(d->hMemory); d->hMemory = NULL; } } SharedMemory2::~SharedMemory2() { if (a_ucData) UnmapViewOfFile(a_ucData); if (d->hMemory) CloseHandle(d->hMemory); delete d; } void SharedMemory2::systemRelease() { // This doesn't really do anything on Win32, since it has delete-on-close semantics anyway if (d->hMemory) { CloseHandle(d->hMemory); d->hMemory = NULL; } } mumble-1.3.4/src/mumble/mumble_es.ts0000664000175000017500000142030414010707274017236 0ustar builderbuilder ACLEditor Deny Denegar Allow Permitir Allow %1 Permitir %1 Deny %1 Denegar %1 Mumble - Add channel Mumble - Agregar canal Default server value Valor por defecto del servidor Failed: Invalid channel Falló: Canal inválido Mumble - Edit %1 Mumble - Editar %1 ID: %1 ID: %1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Concede el privilegio %1. Si un privilegio es permitido y denegado a la vez, entonces es denegado.<br />%2 Channel must have a name El canal debe tener un nombre This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Revoca el privilegio %1. Si un privilegio es permitido y denegado a la vez, entonces es denegado.<br />%2 Dialog Diálogo Name Nombre Enter the channel name here. Introduzca el nombre del canal aquí. Description Descripción Password Contraseña Enter the channel password here. Introduzca la contraseña del canal aquí. Check to create a temporary channel. Actívelo para crear un canal temporal. Temporary Temporal <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Posición</b><br/> Este valor le permite cambiar la forma en que Mumble ordena los canales en el árbol. Un canal con un valor de <i>Posición</i> mayor será colocado debajo de aquellos con un valor de posición menor y viceversa. Si el valor de <i>Posición</i> de dos canales es el mismo, se ordenarán alfabéticamente según su nombre. Position Posición &Groups &Grupos Group Grupo List of groups Lista de grupos Remove selected group Elimina el grupo seleccionado Remove Eliminar Inherit group members from parent Heredar miembros del grupo del padre Inherit Heredar Make group inheritable to sub-channels Hace al grupo heredable a los subcanales Inheritable Heredable Group was inherited from parent channel El grupo fue heredado del canal padre Inherited Heredado Members Miembros Add Agregar Add member to group Agregar miembro al grupo Remove member from group Eliminar miembro del grupo &ACL &LCA Active ACLs LCAs activas List of entries Lista de entradas Inherit ACL of parent? ¿Heredar LCA del padre? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. Establece si la LCA de la cadena de canales padre se aplican a este objeto o no. Sólo se heredarán aquellas entradas que estén marcadas en el padre con "Aplicar a Subcanales". Inherit ACLs Heredar LCAs Move entry up Mover entrada hacia arriba This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. Mueve la entrada hacia arriba en la lista. Ya que las entradas se evalúan en orden, esto podría cambiar los permisos efectivos de los usuarios. No puede mover una entrada por encima de una entrada heredada. Si realmente necesita hacer eso, tendrá que duplicar la entrada heredada. &Up &Subir Move entry down Mover entrada hacia abajo This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. Mueve la entrada hacia abajo en la lista. Ya que las entradas se evalúan en orden, esto podría cambiar los permisos efectivos de los usuarios. &Down &Bajar Add new entry Agregar nueva entrada This adds a new entry, initially set with no permissions and applying to all. Agrega una nueva entrada, inicialmente establecida sin permisos y aplicándose a todo. &Add &Agregar Remove entry Eliminar entrada This removes the currently selected entry. Elimina la entrada actualmente seleccionada. &Remove &Eliminar Context Contexto Entry should apply to this channel. Entry should apply to this channel La entrada debería aplicarse a este canal. This makes the entry apply to this channel. Hace que la entrada se aplique a este canal. Applies to this channel Se aplica a este canal Entry should apply to sub-channels. La entrada debería aplicarse a los subcanales. Add new group Agregar nuevo grupo <b>Add</b><br/> Add a new group. <b>Agregar</b><br/> Agrega un nuevo grupo. Inherited members Miembros heredados Contains the list of members added to the group by this channel. Contiene la lista de miembros agregados al grupo por este canal. Contains a list of members whose group membership will not be inherited from the parent channel. Contiene una lista con los miembros cuya pertenencia al grupo no será heredada desde el canal padre. Contains the list of members inherited by other channels. Contiene la lista de miembros heredados por otros canales. Type in the name of a user you wish to add to the group and click Add. Escriba el nombre de un usuario que desee agregar al grupo y haga clic en Agregar. Type in the name of a user you wish to remove from the group and click Add. Escriba el nombre de un usuario que desee eliminar del grupo y haga clic en Agregar. Exclude Excluir Excluded members Miembros excluidos This makes the entry apply to sub-channels of this channel. Hace que la entrada se aplique a los subcanales de este canal. Applies to sub-channels Se aplica a los subcanales Permissions Permisos User/Group Usuario/Grupo Group this entry applies to Grupo al que se aplica esta entrada User ID ID de usuario User this entry applies to Usuario al que se aplica esta entrada This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. Controla a qué usuario se le aplica esta entrada. Tan sólo escriba el nombre del usuario y pulse intro para buscar una correspondencia en el servidor. &Properties &Propiedades <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>Nombre</b><br />Introduzca el nombre del canal en este campo. El nombre debe cumplir con las restricciones impuestas por el servidor al que esté conectado. <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>Temporal</b><br /> Cuando se marca, el canal creado se marcará como temporal. Esto significa que cuando el último jugador lo abandone el canal será borrado automáticamente por el servidor. <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>Grupo</b><br /> Estos son todos los grupos definidos actualmente por el canal. Para crear un nuevo grupo, simplemente escriba el nombre y presione la tecla Retorno. <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>Eliminar</b><br>Elimina el grupo actualmente seleccionado. Si el grupo fue heredado, no se eliminará de la lista, pero toda la información sobre el grupo se borrará. <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>Heredar</b><br>Hereda todos los miembros del grupo del padre, si el grupo está marcado como <i>Heredable</i> en el canal padre. <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>Heredable</b><br>Hace este grupo heredable a los subcanales. Si el grupo no es heredable, los subcaneles son libres de crear un nuevo grupo con el mismo nombre. <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>Heredado</b><br>Indica que el grupo fue heredado del canal padre. No se puede editar este atributo, sólo es informativo. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>Mienbros</b><br> Esta lista contiene todos los miembros que fueron agregados al grupo por el canal actual. Sepa que esto no incluye los miembros heredados por niveles superiores del árbol de canales. Estos pueden encontrarse en la lista <i>miembros heredados</i>. Para impedir que esta lista sea heredada por los canales de nivel inferior desmarque <i>Heredable</i> o agregue manualmente los miembros a la lista <i>Miembros excluidos</i>. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>Miembros excluidos</b><br> Contiene una lista con los miembros cuya pertenencia al grupo no será heredada desde el canal padre. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. <b>Miembros heredados</b><br> Contiene la lista de miembros heredados por el canal actual. Desmarque <i>Heredar</i> para impedir la herencia desde canales de nivel superior. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. Controla a que grupo de usuarios se aplica esta entrada.<br />Preste atención a que el grupo se evalúa en el contexto del canal en el que se usa la entrada. Por ejemplo, la LCA por defecto en el canal Raíz da el permiso <i>Escritura</i> al grupo <i>admin</i>. Esta entrada, si es heredada por un canal, dará al usuario privilegios de escritura si pertenece al grupo <i>admin</i> en ese canal, incluso si no pertence al grupo <i>admin</i> en el canal donde la LCA se originó. <br />Si un nombre de grupo comienza por '!', se niega su pertenencia, y si comienza por '~', se evalúa en el canal en el que la LCA se definió, en vez de en el canal en el que la LCA está activa.<br />Si un nombre de un grupo comienza por '#', se interpreta como una credencial de acceso. Los usuarios deben haber introducido lo que siga al '#' en su lista de credenciales de acceso para que se consideren como coincidentes. Esto puede usarse como un control de acceso a canales muy simple para usuarios sin autenticar.<br />Si un nombre de grupo comienza por '$', sólo se aplicará a los usuarios cuyo certificado tenga un resúmen que coincida con lo que siga al '$'.<br/>Algunos grupos especiales predefinidos son:<br /><b>all</b> - Representa a todos los usuarios.<br /><b>auth</b> - Representa a todos los usuarios autenticados.<br /><b>sub,a,b,c</b> - Representa a un usuario en un subcanal con un mínimo de <i>a</i> padres comunes, y entre <i>b</i> y <i>c</i> canales por debajo en la cadena. Vea nuestro sitio web para una documentación más extensa acerca de este.<br /><b>in</b> - Representa a los usuarios actualmente en el canal (abreviatura de <i>sub,0,0,0</i>).<br /><b>out</b> - Representa los usuarios fuera del canal (abreviatura de <i>!sub,0,0,0</i>).<br />Fíjese en que una entrada se aplica o a un usuario o a un grupo, no a ambos. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. <b>Contraseña</b><br />Este campo le permite establecer y cambiar fácilmente la contraseña de un canal. Internamente se usa la característica de credenciales de acceso de Mumble. Use LCAs y grupos si necesita un control de acceso más fino y potente. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. Muestra todas las entradas activas en este canal. Las entradas heredadas de los canales padre se mostrarán en cursiva.<br />Las LCAs se evalúan de arriba a abajo, lo que significa que la prioridad aumenta al desplazarse hacia abajo en la lista. ID of the channel. ID del canal Maximum Users Número Máximo de Usuarios Maximum number of users allowed in the channel Número máximo de usuarios permitidos en el canal <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. <b>Número Máximo de Usuarios</b><br /> Este valor permite fijar el número máximo de usuarios permitidos en el canal. Si el valor es superior a cero, solo dicho número de usuarios podrán ingresar en el canal. Si el valor es cero, el número máximo de usuarios en el canal está definido por el número de usuarios máximo por defecto del servidor. This is the sort order for the channel. Este es el orden de clasificación para el canal. ALSAAudioInput Default ALSA Card Tarjeta ALSA por defecto Opening chosen ALSA Input failed: %1 Falló la apertura de la entrada ALSA elegida: %1 ALSAAudioOutput Default ALSA Card Tarjeta ALSA por defecto Opening chosen ALSA Output failed: %1 Falló la apertura de la salida ALSA elegida: %1 ASIOConfig %1 (version %2) %1 (versión %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz Búfer de %1 -> %2 muestras, con resolución de %3 muestras (se prefieren %4) a %5Hz ASIO Initialization failed: %1 Falló la inicialización de ASIO: %1 Failed to instantiate ASIO driver No se pudo instanciar el controlador ASIO ASIO ASIO Device selection Selección del dispositivo Device Dispositivo Device to use for microphone Dispositivo a usar para el micrófono This chooses what device to query. You still need to actually query the device and select which channels to use. Elige qué dispositivo consultar. Aún debe consultar realmente el dispositivo y seleccionar qué canales usar. Query selected device Consulta el dispositivo seleccionado This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. Consulta el dispositivo seleccionado en busca de canales. Sepa que muchos controladores ASIO son extremadamente defectuosos, y consultarlos podría bloquear la aplicación o el sistema. &Query &Consultar Configure selected device Configura el dispositivo seleccionado This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. Configura el dispositivo seleccionado. Sepa que muchos controladores ASIO son extremadamente defectuosos, y consultarlos podría bloquear la aplicación o el sistema. &Configure &Configurar Capabilities Capacidades Driver name Nombre del controlador Buffer size Tamaño del búfer This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. Configura los canales de entrada para ASIO. Asegúrese de seleccionar al menos un canal como micrófono y altavoz. <i>Micrófono</i> debería ser al que está conectado su micrófono, y <i>Altavoz</i> debería ser un canal que muestree <i>lo que oye</i>.<br />Por ejemplo, para Audigy 2 ZS, una buena selección para Micrófono sería <i>Mic L</i> mientras que Altavoz debería ser <i>Mix L</i> y <i>Mix R</i>. Configure input channels Configurar canales de entrada Channels Canales Microphone Micrófono <- <- -> -> Unused Sin usar Speakers Altavoces ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. Debe seleccionar al menos un micrófono y una fuente altavoz para usar ASIO. Si sólo necesita el muestreo del micrófono, use DirectSound. Opening selected ASIO device failed. No input will be done. Falló la apertura del dispositivo ASIO seleccionado. No se realizará ninguna entrada. AboutDialog About Mumble Acerca de Mumble <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> <h3>Mumble (%1)</h3><p>%3</p><p><b>Una utilidad de chat de voz para jugadores</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble &Acerca de Mumble &License &Licencia A&uthors A&utores &Third-Party Licenses Licencias de &Terceros. OK Aceptar AudioInput Interface Interfaz System Sistema Input method for audio Método de entrada para el audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Este es el método de entrada a usar para el audio.</b><br />Muy probablemente desee utilizar DirectSound. Device Dispositivo Input device for audio Dispositivo de salida para el audio <b>This is the input device to use for audio.</b> <b>Este es el dispositivo de salida a usar para el audio.</b> Transmission Transmisión &Transmit &Transmitir When to transmit your speech Cuándo transmitir su habla <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. <b>Establece cuándo debería transmitirse el habla.</b><br /><i>Contínuo</i> - Todo el tiempo<br /><i>Actividad Vocal</i> - Cuando está hablando claramente.<br /><i>Presionar Para Hablar</i> - Cuando presiona la tecla establecida en <i>Métodos abreviados</i>. DoublePush Time Tiempo para DoblePulsación If you press the PTT key twice in this time it will get locked. Si presiona la tecla PTT dos veces durante este tiempo, esta quedará bloqueada. <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. <b>Tiempo para DoblePulsación</b><br />Si presiona la tecla presionar-para-hablar dos veces durante el intervalo de tiempo configurado, esta quedará bloqueada. Mumble seguirá transmitiendo hasta que presione la tecla una vez más para desbloquear PTT otra vez. Reset audio cue to default Restaura la indicación sonora al valor por defecto <b>Reset</b><br/>Reset the paths for the files to their default. <b>Restaurar</b><br/>Reinicia las rutas de los ficheros a sus valores por defecto. Browse for on audio file Selecciona un archivo de audio para asignarlo a la activación Browse for off audio file Selecciona un archivo de audio para asignarlo a la desactivación Off Al desactivar On Al activar Preview the audio cues Reproducir las notificaciones sonoras Use SNR based speech detection Usar detección basada en SNR Signal to Noise Señal/ruido <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. <b>Establece el uso de la amplitud para la detección vocal.</b><br />En este modo, se usa la intensidad de la señal de entrada para detectar el habla. Amplitude Amplitud Voice &Hold &Persistencia de la voz How long to keep transmitting after silence Cuánto tiempo continuar transmitiendo tras un silencio Silence Below Silencio por debajo de <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. <b>Establece los valores que provocaran la detección vocal.</b><br />Use esto junto con la ventana la ventana de estadísticas del audio para ajustar manualmente los valores que provocan la detección del habla. Los valores de entrada por debajo del "Silencio por debajo de" siempre se consideran como silencio. Los valores por encima del "Habla por encima de" siempre se consideran como voz. Los valores intermedios se considerarán como voz si usted ya estaba hablando, pero no provocarán una nueva detección. Speech Above Habla por encima de Signal values above this count as voice Los valores de la señal por encima de este se consideran como voz Compression Compresión &Quality &Calidad Quality of compression (peak bandwidth) Calidad de la compresión (ancho de banda máximo) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. <b>Establece la calidad de compresión.</b><br />Esto determina cuánto ancho de banda se le permite usar a Mumble para el audio saliente. Audio per packet Audio por paquete How many audio frames to send per packet Cuántas tramas de audio enviar por paquete <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>Selecciona cuántas tramas de audio deberían insertarse en un paquete.</b><br />Aumentar esto incrementará la latencia de su voz, pero también reducirá los requisitos de ancho de banda. <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). <b>Muestra el ancho de banda máximo empleado.</b><br />Esto muestra la cantidad máxima de ancho de banda enviado desde su máquina. Velocidad de transmisión del audio es la velocidad de transmisión máxima (ya que se usa VBR) únicamente para los datos de audio. Posición es la velocidad de transmisión usada para información posicional. Carga adicional son las cabeceras de nuestras tramas y de los paquetes IP (IP y UDP son el 75% de esta sobrecarga). Audio Processing Procesamiento del audio Noise Suppression Supresión de ruido Noise suppression Supresión de ruido <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. <b>Establece la cantidad de supresión de ruido a aplicar.<b><br />Cuanto más alto sea este valor, mas agresivamente se suprimirá el ruido estacionario. Maximum amplification of input sound Amplificación máxima del sonido de entrada <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. <b>Amplificación máxima de la entrada.</b><br />Mumble normaliza el volumen de entrada antes de la compresión, y esto establece cuánto se le permite amplificar.<br />El nivel real se actualiza continuamente basado en su patrón de habla actual, pero nunca sobrepasará el nivel especificado aquí.<br />Si el nivel de <i>Volumen del Micrófono</i> de las estadísticas de audio ronda el 100%, probablemente desee establecer esto alrededor de 2.0, pero si, como la mayoría de la gente, no consigue alcanzar 100%, establezca esto a algo mucho mayor.<br />Idealmente, fíjelo de tal forma que <i>Volumen del Micrófono * Factor de Amplificación >= 100</i>, incluso cuando hable realmente bajo.<br /><br />Fíjese en que no es perjudicial establecer esto al máximo, pero Mumble comenzará a captar otras conversaciones si lo deja autoajustarse a ese nivel. Current speech detection chance Probabilidad actual de detección del habla Cancel echo from speakers Cancelar el eco de los altavoces Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. Habilitar esto cancelará el eco de sus altavoces. Mezclado tiene un impacto bajo en la CPU, pero sólo funciona bien si sus altavoces están al mismo volumen y son equidistantes al micrófono. La cancelación del eco multicanal proporciona mejor cancelación de eco, pero a un coste de CPU mayor. Disabled Desactivado <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>Establece el uso de la relación señal/ruido para la detección vocal.</b><br />En este modo, se analiza la entrada en busca de algo que parezca una señal clara, y la clarida de la señal se usa para provocar la detección vocal. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>Muestra las opciones actuales de detección del habla.</b><br />Puede cambiar las opciones desde el cuadro de diálogo Opciones o desde el Asistente de audio. Signal values below this count as silence Los valores de la señal por debajo de este se consideran como silencio Maximum bandwidth used for sending audio Ancho de banda máximo usado para enviar audio Use Amplitude based speech detection Usar detección vocal basada en la Amplitud <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). <b>Selecciona por cuánto tiempo tras una detección percibida en el habla debería continuar la transmisión .</b>Auméntelo si su voz es interrumpida mientras habla (observable por un icono de voz parpadeando rápidamente junto a su nombre). Exclusive mode Modo exclusivo <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>Abre el dispositivo en modo exclusivo.</b><br />Ninguna otra aplicación podrá usar el dispositivo. Exclusive Exclusivo R&eset R&einiciar &Browse... &Seleccionar... B&rowse... S&eleccionar... &Preview &Previsualizar <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. <b>Reproducir</b><br/>Reproduce el sonido <i>al activar</i> actual seguido del sonido <i>al desactivar</i> actual. Displays an always on top window with a push to talk button in it Muestra una ventana superpuesta con un botón presionar para hablar en ella Display push to talk window Mostrar ventana presionar para hablar Misc Varios Audible audio cue when starting or stopping to transmit Señal auditiva perceptible al comenzar o terminar de transmitir <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. <b>Habilita las señales auditivas.</b><br />Habilitar esto le proporcionará un breve pitido al comenzar o terminar de transmitir. Audio cue Señal auditiva Gets played when starting to transmit Es reproducido al comenzar a transmitir Gets played when stopping to transmit Es reproducido al terminar de transmitir Hold Time Tiempo de sostenimiento Time the microphone stays open after the PTT key is released Tiempo que el micrófono sigue abierte después de que se haya soltado la tecla PTT Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) El ancho de banda máximo del servidor es de solo %1 kbit/s. Se ha ajustado automáticamente la calidad de audio a %2 kbit/s (%3 ms) Max. Amplification Amplificación máx. Idle action Acción por inactividad minutes do minutos, hacer nothing nada deafen ensordecer mute enmudecer after tras Echo Cancellation Cancelación de Eco Mixed echo cancellation Cancelación de eco mixta Multichannel echo cancellation Cancelación de eco multicanal The idle action will be reversed upon any key or mouse button input La acción inactiva será revertida al presionar cualquier tecla o botón del mouse Undo Idle action upon activity Apply RNNoise's noise suppression filter. <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. RNNoise Audio input AudioInputDialog Continuous Contínuo Voice Activity Actividad Vocal Push To Talk Presionar Para Hablar Audio Input Entrada de audio %1 ms %1 ms Off Desconectado %1 s %1 s %1 kb/s %1 kb/s -%1 dB -%1 dB %1 kbit/s (Audio %2, Position %4, Overhead %3) %1 kbit/s (Audio %2, Posición %4, Carga adicional %3) AudioOutput Interface Interfaz System Sistema Output method for audio Método de salida para el audio <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Este es el método de salida a usar para el audio.</b><br />Muy probablemente desee utilizar DirectSound. Device Dispositivo Output device for audio Dispositivo de salida para el audio <b>This is the output device to use for audio.</b> <b>Este es el dispositivo de salida a usar para el audio.</b> Positional Audio Audio posicional Audio Output Salida de audio Default &Jitter Buffer Búfer de &fluctuación por defecto Safety margin for jitter buffer Márgen de seguridad para el búfer de fluctuación <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. <b>Establece el márgen de seguridad máximo para el búfer de fluctuación.</b><br />Todo el audio entrante es almacenado en un búfer, y el búfer de fluctuación trata de forzar continuamente a este búfer al mínimo sostenible por su red, para que la latencia sea tan baja como sea posible. Esto establece el tamaño mínimo de búfer a usar. Si el comienzo de las frases que oye es muy tembloroso, aumente este valor. Minimum distance to user before sound volume decreases Distancia mínima al usuario antes de que el sonido disminuya This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. Establece la distancia mínima para cálculos de sonido. El volumen del habla de otros usuarios no disminuirá hasta que estén al menos a esta distancia de ti. This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. Establece la distancia máxima para cálculos de sonido. Cuando estén más lejos que esto, el volumen del habla de otros usuarios no disminuirá más. <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. <b>Habilita uno de los modos de prueba de bucle de retorno.</b><br /><i>Ninguno</i> - Bucle de retorno desactivado<br /><i>Local</i> - Emula un servidor local.<br /><i>Servidor</i> - Solicita un bucle de retorno desde el servidor.<br />Por favor, fíjese en que cuando está activado el modo de bucle de retorno, ningún otro usuario oirá su voz. Esta opción no se guarda al salir de la aplicación. Volume Volumen Volume of incoming speech Volúmen del habla entrante <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. <b>Ajusta el volumen del habla entrante.</b><br />Fíjese en que si incrementa esto por encima de 100%, se distorsionará el audio. Output Delay Retraso de salida Amount of data to buffer Cantidad de datos a almacenar The connected "speakers" are actually headphones The connected "speakers" are actually headphones. Los "altavoces" conectados son en realidad auriculares Factor for sound volume decrease Factor para la disminución del volumen del sonido Bloom Bloom Factor for sound volume increase Factor de aumento del volumen del sonido How much should sound volume increase for sources that are really close? ¿Cuánto debería aumentar el sonido para fuentes que están muy cerca? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. Marcar esto indica que no tiene altavoces conectados, sólo auriculares. Esto es importante, ya que generalmente los altavoces están situados delante de usted, mientras que los auriculares están directamente a su izquierda/derecha. This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Establece la cantidad de datos que prealmacenar en el búfer de salida. Experimente con diferentes valores y fíjelo al más bajo que no cause ruido en el sonido. Headphones Auriculares Minimum Distance Distancia mínima Maximum Distance Distancia máxima Maximum distance, beyond which speech volume won't decrease Distancia máxima, más allá de la cual el volumen del habla no disminuirá Minimum Volume Volumen mínimo What should the volume be at the maximum distance? ¿Cuál debería ser el volumen a la distancia máxima? Loopback Test Prueba de bucle de retorno Delay Variance Varianza del retraso Variance in packet latency Varianza de la latencia de los paquetes <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>Establece la varianza de la latencia de los paquetes para la prueba de bucle de retorno</b><br />La mayoría de rutas de audio contienen algo de latencia variable. Esto le permite fijar esa varianza para la prueba de bucle de retorno. Por ejemplo, si fija esto a 15 ms, se emulará una red con 20-35 ms de latencia de ping u 80-95 ms de latencia. La mayoría de conexiones de red domésticas tienen una variancia de unos 5 ms. Packet Loss Pérdida de paquetes Packet loss for loopback mode Pérdida de paquetes para el modo de bucle de retorno <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% <b>Establece la pérdida de paquetes para el modo de bucle de retorno.</b><br />Esta será la tasa de paquetes perdidos. A menos que su ancho de banda de salida haya alcanzado el máximo o haya algún problema con su conexión, esta será siempre 0% &Loopback &Bucle de retorno Desired loopback mode Modo de bucle de retorno deseado Attenuate applications by... Atenuar las aplicaciones un... Attenuation of other applications during speech Atenuación de las otras aplicaciones durante el habla <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. <b>Atenuar el volumen de las otras aplicaciones durante el habla</b><br />Mumble puede disminuir el volúmen de las otras aplicaciones durante el habla entrante y/o saliente. Esto establece la atenuación de las otras aplicaciones si la característica está habilitada. If checked Mumble lowers the volume of other applications while other users talk Si se marca, Mumble disminuye el volumen de las otras aplicaciones mientras otros usuarios hablan <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. <b>Atenuar las aplicaciones mientras otros usuarios hablan</b><br />Mumble puede disminuir el volumen de las otras aplicaciones durante el habla entrante y/o saliente. Esto hace que Mumble active la característica mientras otros usuarios le hablan. while other users talk mientras otros usuarios hablan If checked Mumble lowers the volume of other applications while you talk Si se marca, Mumble disminuye el volumen de otras aplicaciones mientras usted habla <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. <b>Atenuar las aplicaciones mientras usted habla</b><br />Mumble puede disminuir el volumen de las otras aplicaciones durante el habla entrante y/o saliente. Esto hace que Mumble active la característica mientras usted habla. while you talk mientras usted habla Exclusive mode, not recommended. Modo exclusivo, no recomendado. <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>Abre el dispositivo en modo exclusivo.</b><br />Ninguna otra aplicación podrá usar el dispositivo. Exclusive Exclusivo Priority Speaker Orador prioritario If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. Si se marca Mumble disminuye el volumen de otros usuarios mientras usted habla si es usted un "Orador prioritario". <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. <b>Disminuír el volumen de otros usuarios mientras se habla como Orador Prioritario.</b><br />Mumble permite disminuír el volúmen de otros usuarios mientras usted habla <i>Orador Prioritario</i> para evitar ser interrumpido. Marcando esta casilla se activa esta función. Attenuate other users while talking as Priority Speaker. Atenuar a otros usuarios mientras se habla como Orador Prioritario. Advanced Attenuation Options Opciones Avanzadas de Atenuación If checked, Mumble will only attenuate applications that are using the same output source as Mumble Si está marcada, Mumble sólo atenuará aplicaciones que compartan el dispositivo de salida con Mumble. <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. <b>Atenuar únicamente las aplicaciones que compartan dispositivo de salida con Mumble</b><br />Si esta marcada, las aplicaciones que usen un dispositivo de salida distinto a Mumble no se atenuarán. Only attenuate applications using the same output device Atenuar únicamente aplicaciones que empleen el mismo dispositivo de salida. If checked, PulseAudio loopback modules will be attenuated Si está marcada, los módulos de loopback de PulseAudio se atenuarán <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. <b>Atenuar los módulos de loopback de Pulseaudio</b><br />Si los módulos de loopback estan enlazados con el dispositivo de salida de Mumble, también serán atenuados. Attenuate PulseAudio loopback modules Atenuar módulos de loopback de PulseAudio Audio output AudioOutputDialog None Ninguno Local Local Server Servidor Audio Output Salida de audio %1 ms %1 ms %1 % %1 % %1 m %1 m AudioOutputSample Choose sound file Elija el archivo de sonido Invalid sound file Archivo de sonido inválido The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. El archivo '%1' no puede ser usado por Mumble. Por favor, seleccione un archivo con un formato y codificación compatible. AudioStats >1000 ms >1000ms >1000 ms Audio Statistics Estadísticas del audio Input Levels Niveles de entrada Peak microphone level Nivel máximo del micrófono Peak power in last frame Potencia máxima en la última trama This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. Muestra la potencia máxima en la última trama (20 ms), y es la misma medida que generalmente encontrará mostrada como "potencia de entrada". Por favor, no haga caso a esto y vea <b>Potencia del micrófono</b> en su lugar, que es mucho más estable e ignora las muestras extremas. Peak speaker level Nivel máximo de los altavoces This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. Muestra la potencia máxima de los altavoces en la última trama (20 ms). A menos que esté usando un método de muestreo multi-canal (como ASIO) con los canales de altavoces configurados, esto será 0. Si ha configurado una instalación de este tipo, y esto aún muestra 0 mientras se reproduce audio de otros programas, su instalación no está funcionando. Peak clean level Nivel limpio máximo This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. Muestra la potencia máxima en la última trama (20 ms) tras todo el procesado. Idealmente, esto debería ser -96 dB cuando no esté hablando. En realidad, un estudio de sonido debería ver -60 dB, y usted debería ver en torno a -20 dB con un poco de suerte. Cuando hable, esto debería aumentar hasta un valor entre -5 y -10 dB.<br />Si está usando cancelación de eco, y esto sube a más de -15 dB cuando no está hablando, su instalación no está funcionando, y molestará con ecos a los otros usuarios. Signal Analysis Análisis de la señal Microphone power Potencia del micrófono How close the current input level is to ideal Cuán próximo al ideal está el nivel de entrada actual This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. Muestra cuán próximo al ideal está su nivel de volumen de entrada actual. Para ajustar su nivel de micrófono, abra el programa que emplea para ajustar el volumen de grabación, y observe el valor de aquí mientras habla.<br /><b>Hable alto, como lo haría cuando está enfadado por perder ante un novato.</b><br />Ajuste el volumen hasta que este valor esté próximo a 100%, pero asegúrese de que no lo sobrepasa. Si lo sobrepasa, es probable que se produzcan cortes en partes de su habla, lo que degradará la calidad de sonido. Signal-To-Noise ratio Relación señal/ruido Signal-To-Noise ratio from the microphone Tasa señal/ruido del micrófono This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. Muestra la Tasa Señal/Ruido (SNR) del micrófono en la última trama (20 ms). Muestra cuán clara es la voz en comparación con el ruido.<br />Si este valor está por debajo de 1.0, hay más ruido que voz en la señal, y por tanto se reduce la calidad.<br />No hay límite superior para este valor, pero no espere ver muy por encima de 40-50 sin un estudio de sonido. Speech Probability Probabilidad de habla Probability of speech Probabilidad de habla This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). Esta es la probabilidad de que la última trama (20 ms) fuera habla y no ruido ambiental.<br />La transmisión por Actividad Vocal depende de la correción de este valor. El truco de esto es que el medio de una frase se detecta siempre como habla, el problema son las pausas entre palabras y el comienzo del discurso. Es difícil distinguir un suspiro de una palabra que empiece con 'h'.<br />Si esto está en fuente negrita, significa que Mumble está transmitiendo actualmente (si está conectado). Configuration feedback Información para la configuración Current audio bitrate Velocidad actual de transmisión del audio Bitrate of last frame Velocidad de transmisión de la última trama DoublePush interval Intervalo de DoblePulsación Time between last two Push-To-Talk presses Tiempo entre las dos últimas pulsaciones de PresionarParaHablar Speech Detection Detección del habla Current speech detection chance Probabilidad actual de detección del habla <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>Muestra las opciones actuales de detección del habla.</b><br />Puede cambiar las opciones desde el cuadro de diálogo Opciones o desde el Asistente de audio. Signal and noise power spectrum Espectro de potencia de la señal y el ruido Power spectrum of input signal and noise estimate Espectro de potencia de la señal de entrada y estimación del ruido This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. Muestra el espectro de potencia de la señal de entrada actual (línea roja) y la estimación de ruido actual (relleno azul).<br />Todas las amplitudes se multiplican por 30 para mostrar las partes interesantes (cuánta más señal que ruido está presente en cada banda de onda).<br />Esto probablemente tiene interés solo si está tratando de ajustar con precisión las condiciones de ruido de su micrófono. Bajo buenas condiciones, debería haber tan sólo una pequeña palpitación de azul en la parte inferior. Si el azul sobrepasa más de la mitad del gráfico, posee un entorno seriamente ruidoso. Echo Analysis Análisis del eco Weights of the echo canceller Pesos del cancelador de eco This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. Muestra los pesos del cancelador de eco, con el tiempo incrementándose hacia abajo y la frecuencia incrementándose hacia la derecha.<br />Idealmente, esto debería ser negro, indicando que no existe eco alguno. Más comúnmente, habrá una o más bandas horizontales de color azulado que representan eco retrasado en el tiempo. Debería poder ver los pesos actualizados en tiempo real.<br />Fíjese en que mientras no haya nada a lo que cancelar el eco, no verá datos muy útiles aquí. Reproduzca algo de música y las cosas deberían estabilizarse.<br />Puede elegir ver las partes reales o imaginarias de los pesos en el dominio de la frecuencia, o de forma alternativa el módulo y la fase calculados. Lo más útil de estos probablemente sea el módulo, que es la amplitud del eco, y muestra cuánto de la señal saliente está siendo eliminado en este paso de tiempo. Los otros modos de visionado son útiles en su mayoría a personas que quieren ajustar los algoritmos de cancelación de eco.<br />Por favor, fíjese en que si la imagen completa fluctúa ampliamente mientras está en el modo módulo, el cancelador de eco no logra encontrar ninguna correlación entre las dos fuentes de entrada (altavoces y micrófono). O tiene un retraso muy largo en el eco, o una de las fuentes de entrada está mal configurada. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. Esta es la velocidad de transmisión de la última trama comprimida (20 ms), y como tal, aumentará y disminuirá mientras VBR ajusta la calidad. Puede ajustar la velocidad de transmisión máxima en el cuadro de diálogo Opciones. AudioWizard Audio Tuning Wizard Asistente para el ajuste del audio Introduction Introducción Welcome to the Mumble Audio Wizard Bienvenido al Asistente para el ajuste del audio de Mumble Finished Finalizado Enjoy using Mumble Disfrute usando Mumble Device selection Selección del dispositivo Selecting the input and output device to use with Mumble. Seleccionando el dispositivo de entrada y salida a usar con Mumble. This is the device your microphone is connected to. Este es el dispositivo al que esta conectado su micrófono. System Sistema Input method for audio Método de entrada para el audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Este es el método de entrada a usar para el audio.</b><br />Muy probablemente desee utilizar DirectSound. Device Dispositivo Input device to use Dispositivo de entrada a usar <b>Selects which sound card to use for audio input.</b> <b>Selecciona qué tarjeta de sonido usar para la entrada de audio.</b> Cancel echo from headset or speakers Cancelar el eco de los auriculares o altavoces Use echo cancellation Usar cancelación de eco This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. Esto habilita la cancelación de eco del audio saliente, que beneficia a altavoces y auriculares. This is the device your speakers or headphones are connected to. Este es el dispositivo al que están conectados sus altavoces o auriculares. Output method for audio Método de salida para el audio <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Este es el método de salida a usar para el audio.</b><br />Muy probablemente quiera utilizar DirectSound. Output device to use Dispositivo de salida a usar <b>Selects which sound card to use for audio Output.</b> <b>Selecciona qué tarjeta de sonido usar para la salida de audio.</b> Enable positional audio Habilitar audio posicional Allows positioning of sound Allows positioning of sound. Habilita el posicionamiento del sonido <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> <p> Este es el asistente para el ajuste del audio de Mumble. Le ayudará a establecer correctamente los niveles de entrada de su tarjeta de sonido, y también fijará los parámetros correctos para el procesamiento de sonido en Mumble. </p> <p> Por favor, sepa que mientras este asistente esté activo, todo el audio será redirigido localmente para permitirle escucharlo, y no se enviará al servidor. </p> Input Device Dispositivo de entrada Output Device Dispositivo de salida This allows Mumble to use positional audio to place voices. Permite a Mumble usar audio posicional para situar las voces. <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> <p> Para mantener la latencia en el mínimo absoluto, es importante almacenar en la tarjeta de sonido la menor cantidad de audio que sea posible. Sin embargo, muchas tarjetas de sonido informan de que requieren un búfer mucho más pequeño del que en realidad necesitan para funcionar, asi que la única forma de establecer este valor es mediante prueba y error. </p> <p> Debería oir una muestra de voz. Cambie el control deslizante de abajo al valor mas bajo con el que no obtenga <b>ninguna</b> interrupción ni ruido en el sonido. Por favor, fíjese en que el eco local se desactiva durante esta prueba. </p> Amount of data to buffer Cantidad de datos a almacenar This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Establece la cantidad de datos que prealmacenar en el búfer de salida. Experimente con diferentes valores y fíjelo al más bajo que no cause ruido en el sonido. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> <p> Abra su panel de control de sonido y vaya a las opciones de grabación. Asegúrese de que el micrófono está seleccionado como la entrada activa y con el máximo volumen de grabación. Si existe una opción para habilitar un "Potenciado del micrófono" asegúrese de que está activada. </p> <p> Hable fuerte en voz alta, como cuando está molesto o entusiasmado. Baje el volumen en el panel de control de sonido hasta que la barra de abajo permanezca, mientras habla, tan alto como sea posible en la zona azul y verde pero <b>no</b> en la zona roja. </p> Positional Audio Audio posicional Adjusting attenuation of positional audio. Ajustando la atenuación del audio posicional. <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> <p> Mumble adminte audio posicional para algunos juegos, y posicionará la voz de otros usuarios en relación a su posición en el juego. Dependiendo de su posición, el volumen de la voz cambiará entre los altavoces para simular la dirección y la distancia a la que están los otros usuarios. Tal posicionamiento depende de que la configuración de los altavoces sea correcta en su sistema operativo, así que se hará una prueba aquí. </p> <p> El gráfico de abajo muestra <font color="red">su</font> posición, los <font color="yellow">altavoces</font> y una <font color="green">fuente de sonido móvil</font> vistas desde arriba. Debería oir el audio moverse entre los canales. </p> Use headphones instead of speakers Usar auriculares en vez de altavoces <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> <p> Enhorabuena. Ya debería estar listo para disfrutar una experiencia de sonido más rica con Mumble. </p> <p> Mumble se encuentra en continuo desarrollo, y el equipo de desarrollo quiere centrarse en las características que beneficien a la mayoría de usuarios. Para ello, Mumble admite el envío de estadísticas anónimas acerca de su configuración a los desarrolladores. Dichas estadísticas son esenciales para el desarrollo futuro, y para asegurar que las características que usa no queden obsoletas. </p> Use headphones Usar auriculares This ignores the OS speaker configuration and configures the positioning for headphones instead. Esto hace que se ignore la configuración de altavoces del SO y configura el posicionamiento para auriculares en su lugar. Volume tuning Ajuste del volumen Tuning microphone hardware volume to optimal settings. Ajustando el volumen del hardware del micrófono al nivel óptimo. Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. Ahora hable bajito, como cuando está hablando tarde en la noche y no quiere molestar a nadie. Ajuste el control deslizante de abajo de forma que la barra alcance el verde mientras habla, pero permanezca en azul mientras guarde silencio. Voice Activity Detection Detección de la Actividad Vocal Letting Mumble figure out when you're talking and when you're silent. Permitir a Mumble suponer cuándo está hablando y cuándo guarda silencio. This will help Mumble figure out when you are talking. The first step is selecting which data value to use. Esto ayudará a Mumble averiguar cuándo está hablando. El primer paso es seleccionar qué valor de los datos usar. Raw amplitude from input Amplitud sin procesar de la entrada Signal-To-Noise ratio Relación señal-ruiido Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Ahora debe ajustar los siguientes dos controles deslizantes. Las primeras palabras que diga deberían terminar en el área verde (es habla con toda certeza). Mientras habla, debería permanecer en la amarilla (podria ser habla) y cuando no esté hablando, todo deberia estar en la roja (definitivamente no es habla). Device tuning Ajuste del dispositivo Changing hardware output delays to their minimum value. Cambiando el retraso del hardware de salida al valor mínimo. Submit anonymous statistics to the Mumble project Enviar estadísticas anónimas al proyecto Mumble Push To Talk: Presionar Para Hablar: Quality & Notifications &Notificaciones de calidad Adjust quality and notification settings. Ajusta las opciones de calidad y notificación. Quality settings Configuración de calidad Low Baja Balanced Equlibrada Notification settings Opciones de notificación Use Text-To-Speech to read notifications and messages to you. Usar Texto-A-Voz (TTS) para leer las notificaciones y mensajes para usted. Disable Text-To-Speech and use sounds instead. Inhabilitar Texto-A-Voz (TTS) y usar sonidos en su lugar. %1 ms %1 ms Enables attenuation of other applications while users talk to you Habilita la atenuación de las otras aplicaciones mientras los usuarios le hablan Attenuate applications while other users talk Atenuar las aplicaciones mientras otros usuarios hablan High Alta Custom Personalizada You already set a customized quality configuration in Mumble. Select this setting to keep it. Ya estableció una configuración de calidad personalizada en Mumble. Seleccione esta opción para mantenerla. Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. Habilita la atenuación de las otras aplicaciones mientras los usuarios le hablan. Esto significa que en cuanto alguien comience a hablarle en Mumble el sonido de las demás aplicaciones, como reproductores de audio, será atenuado para permitirle entenderlo mejor. Apply some high contrast optimizations for visually impaired users Aplica algunas optimizaciones de alto contraste para usuarios con discapacidades visuales Use high contrast graphics Usar gráficos de alto contraste Keep custom Text-To-Speech settings. Mantener las opciones personalizadas de Texto-A-Voz (TTS) <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode <p> Abra su panel de control de sonido y vaya a las opciones de grabación. Asegúrese de que el micrófono está seleccionado como la entrada activa y con el máximo volumen de grabación. Si existe una opción para habilitar un "Potenciado del micrófono" asegúrese de que está marcada. </p> <p> Hable fuerte en voz alta, como cuando está molesto o entusiasmado. Baje el volumen en el panel de control de sonido hasta que la barra de abajo permanezca, mientras habla, tan alto como sea posible en las zonas rayada y vacía pero <b>no</b> en la zona entrecruzada. </p> Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode Ahora hable bajito, como cuando está hablando tarde en la noche y no quiere molestar a nadie. Ajuste el control deslizante de abajo de forma que la barra alcance la zona vacía mientras habla, pero permanezca en la rayada mientras guarde silencio. Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode Ahora debe ajustar los siguientes dos controles deslizantes. Las primeras palabras que diga deberían terminar en el área vacía (es habla con toda certeza). Mientras habla, debería permanecer en la rayada (podria ser habla) y cuando no esté hablando, todo deberia estar en la entrecruzada (definitivamente no es habla). In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) En esta configuración Mumble usará una <b>baja cantidad de ancho de banda</b>. Esto ocasionará inevitablemente latencia alta y calidad pobre. Elija esto solo si su conexión no puede manejar las otras opciones. (16kbit/s, 60ms por paquete) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) Esta es la configuración <b>recomendada por defecto</b>. Proporciona un buen equilibrio entre calidad, latencia y uso de ancho de banda. (40kbit/s, 20ms por paquete) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) Solo se recomienda esta configuración para su uso en entornos en los que el ancho de banda no sea un problema, como una red de área local. Proporciona la latencia más baja soportada por Mumble y <b>alta calidad</b>. (72kbit/s, 10ms por paquete) BanEditor Mumble - Edit Bans Mumble - Editar prohibiciones &Address &Dirección &Mask &Máscara Reason Motivo Start Inicio End Fin User Usuario Hash Resúmen &Add &Agregar &Update A&ctualizar &Remove &Eliminar Ban List Lista de Bans Search field Búsqueda This is the search field. Use it to find bans that have this username set in the username field. Este es el campo de búsqueda. Empleelo para encontrar baneos a traves del nombre establecido en el campo de usuario. Who are you looking for? A quien está buscando? No nickname Sin nombre de usuario IP address Dirección IP No IP address Sin dirección IP Reason for the ban Razón del ban No reason Sin razón Ban end date Fecha de fin del ban Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). Fecha fin del ban. Si se emplea la misma fecha para el inicio y fin del ban, el ban sera permanente (no expirará). Certificate hash Hash del certificado No certificate hash Sin hash del certificado Banned users Usuarios baneados This is a list with banned users. Esta es una lista con usuarios baneados Use this button if you want to add a new ban. Emplee este botón si desea añadir un nuevo ban. Use this button if you want to update ban information. Emplee este botón si desea modificar la información de un ban. Use this button if you want to remove user from the ban list. Emplee este botón si desea eliminar un usuario de la lista de baneados. Clear all fields Limpiar todos los campos This button clears all fields. Use it if you want to add a new ban. Este botón limpia todos los campos. Empleelo si desea añadir un nuevo ban. Clear Limpiar Ban List - %n Ban(s) Lista de Baneados -%n Ban(s)Lista de Baneados -%n Ban(s) CertView Name Nombre Email Correo electrónico Issuer Emisor Expiry Date Fecha de vencimiento (none) (ninguno) Self-signed Autofirmado CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. No se pudo validar el correo electrónico.<br />Introduzca una dirección de correo electrónico válida (o en blanco) para continuar. There was an error generating your certificate.<br />Please try again. Hubo un error al generar su certificado.<br />Por favor, inténtelo de nuevo. Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. Su certificado y su clave no pudieron ser exportados al formato PKCS#12. Podría haber un error en su certificado. The file could not be opened for writing. Please use another file. No se pudo abrir el archivo para su escritura. Por favor, use otro archivo. The file's permissions could not be set. No certificate and key has been written. Please use another file. No se han podido modificar los permisos del fichero. No se han guardado certificado ni la clave. Por favor emplee otro fichero. The file could not be written successfully. Please use another file. El archivo no pudo ser escrito con éxito. Por favor, use otro archivo. The file could not be opened for reading. Please use another file. El archivo no pudo ser abierto para su lectura. Por favor, use otro archivo. The file is empty or could not be read. Please use another file. El archivo está vacío o no pudo ser leído. Por favor, use otro archivo. The file did not contain a valid certificate and key. Please use another file. El archivo no contenía un certificado y una clave válidos. Por favor, use otro archivo. Select file to export certificate to Seleccione el archivo al que exportar el certificado Select file to import certificate from Seleccione el archivo del que importar el certificado Unable to import. Missing password or incompatible file type. <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. <b>Vencimiento del certificado:</b> Su certificado está a punto de caducar. Debe renovarlo, o de lo contrario no podrá conectarse a los servidores en los que se haya registrado. Certificates Certificate Management Gestión de certificados Certificate Authentication Autenticación con certificado Authenticating to servers without using passwords Autenticarse con a los servidore sin usar contraseñas Current certificate Certificado actual This is the certificate Mumble currently uses. Este es el certificado que Mumble usa actualmente. Current Certificate Certificado actual Create a new certificate Crear un nuevo certificado This will create a new certificate. Esto creará un nuevo certificado. Import certificate from file Importar certificado desde un archivo This will import a certificate from file. Esto importará un certificado desde un archivo. Import a certificate Importar un certificado Export Certificate Exportar certificado This will export a certificate to file. Esto exportará un certificado a un archivo. Export current certificate Exportar certificado actual Import Certificate Importar certificado PKCS #12 Certificate import Importación de certificado PKCS #12 <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble puede importar certificados almacenados en el formato PKCS #12. Este es el formato que se usa al exportar una clave desde Mumble, y también cuando se importan claves desde Firefox, Internet Explorer, Opera, etc.</p><p>Si el archivo está protegido por contraseña, deberá introducir la contraseña para importar el certificado.</p> Import from Importar desde Filename to import from Nombre del archivo desde el que importar This is the filename you wish to import a certificate from. Este es el nombre del archivo desde el que desea importar un certificado. Select file to import from Seleccionar el fichero desde el que importar This opens a file selection dialog to choose a file to import a certificate from. Abre un cuadro de diálogo de selección de archivos para elegir un archivo desde el que importar un certificado. Open... Abrir... Password Contraseña Password for PKCS#12 file Contraseña para el archivo PKCS#12 This is the password for the PKCS#12 file containing your certificate. Esta es la contraseña para el archivo PKCS#12 que contiene su certificado. Certificate to import Certificado para importar This is the certificate you are importing. Este es el certificado que está importando. Certificate Details Detalles del certificado Replace Certificate Reemplazar certificado Replace existing certificate with new certificate? ¿Reemplazar el certificado existente con el nuevo certificado? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> <p>Ya tiene un certificado almacenado en Mumble, y está a punto de reemplazarlo</p> <p>Si lo está actualizando a un certificado emitido por una AC de confianza y las direcciones de correo electrónico coinciden con las de su certificado actual, esto es completamente seguro, y los servidores a los que se conecte reconocerán automáticamente el certificado mejorado para su dirección de correo electrónico. </p> <p>Si este no es el caso, ya no será reconocido por ningún servidor con el que se haya autenticado previamente. Si no se ha registrado en ningún servidor aún, no hay nada de qué preocuparse. </p> <p> ¿Está seguro de querer reemplazar su certificado? </p> This is the certificate Mumble currently uses. It will be replaced. Este es el certificado que Mumble usa actualmente. Será reemplazado. New certificate Nuevo certificado This is the new certificate that will replace the old one. Este es el nuevo certificado que reemplazará el antiguo. New Certificate Nuevo certificado Make a backup of your certificate Hacer una copia de seguridad de su certificado Export to Exportar en Filename to export to Nombre del archivo al que exportar This is the filename you wish to export a certificate to. Este es el nombre del archivo al que desea exportar el certificado. Save As... Guardar como... This is the certificate Mumble currently uses. It will be exported. Este es el certificado que Mumble usa actualmente. Será exportado. Generate a new certificate for strong authentication Genera un nuevo certificado para autenticación robusta <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> <p>Mumble generará ahora un certificado robusto para la autenticación con los servidores.</p><p>Si lo desea, puede proporcionar información adicional para que se almacene en el certificado, que será presentada a los servidores cuando se conecte. Si proporciona una dirección de correo electrónico válida, puede actualizarlo posteriormente a un certificado de correo electrónico emitido por una AC, que proporciona una identificación robusta.</p> Name Nombre Email Correo electrónico Your email address (e.g. johndoe@mumble.info) Su dirección de correo electrónico (p.e. usuario@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. Esta es su dirección de correo electrónico. Se recomienda encarecidamente que proporcione una dirección de correo electrónico válida, ya que le permitirá actualizar posteriormente su certificado a uno robusto sin que ocurran problemas de autenticación. Your name (e.g. John Doe) Su nombre (p.e. José Pérez) This is your name, and will be filled out in the certificate. This field is entirely optional. Este es su nombre, y se usará para rellenar el certificado. Este campo es totalmente opcional. Finish Finalizar Certificate-based authentication is ready for use La autenticación basada en certificados está lista para su uso Enjoy using Mumble with strong authentication. Disfrute usando Mumble con autenticación robusta. Automatic certificate creation Creación automática del certificado <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>Si alguna vez pierde su certificado actual, lo que ocurrirá si su ordenador sufre un fallo de hardware o si reinstala su máquina, no podrá autenticarse con ningún servidor en el que se haya registrado. Es por tanto <b>obligatorio</b> que haga una copia de seguridad de su certificado. Recomendamos encarecidamente que almacene esta copia de seguridad en almacenamiento extraíble, como una unidad extraíble USB.</p> <p>Fíjese en que este archivo no se encriptará, y si alguien consigue acceder a él, podrá hacerse pasar por usted, así que tenga cuidado con él.</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> ChanACL None Ninguno Traverse Recorrer Enter Ingresar Speak Hablar Mute/Deafen Enmudecer/Ensordecer Make channel Crear canal Make temporary Convertir en temporal Link channel Vincular canal This represents no privileges. No representa ningún privilegio. This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. Representa acceso total al canal, incluyendo la habilidad de cambiar la información de grupo y LCA. Este privilegio implica los otros privilegios. This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. Representa el permiso de recorrer el canal. Si se deniega este privilegio a un usuario, no podrá acceder a este canal ni ningún subcanal de ninguna forma, sin importar otros permisos en los subcanales. This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. Representa el permiso de unirse al canal. Si tiene una estructura de canales jerárquica, podría desear dar Recorrer a todos, pero restringir Ingresar en la raíz de su jerarquía. This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. Representa el permiso de hablar en un canal. Los usuarios sin este privilegio serán suprimidos por el servidor (vistos como mudos), y no podrán hablar hasta que se les de voz con los privilegios adecuados. This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. Representa el permiso de susurrar en un canal desde el exterior. Funciona exactamente como el privilegio <i>hablar</i>, pero se aplica a paquetes hablados con la tecla Susurrar pulsada. Se usa para transmitir a una jerarquía de canales sin vincular. This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. Representa el permiso de enmudecer y ensordecer a otros usuarios. Una vez enmudecido, un jugador permanecerá enmudecido hasta que se le otorgue voz por otro usuario con privilegios o se vuelva a conectar al servidor. This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. Representa el permiso de mover a un usuario a otro canal o expulsarlo del servidor. Para mover realmente al usuario, o bien el jugador que mueve debe tener privilegios Mover/Expulsar en el canal de destino, o debe estar permitido al usuario ingresar normalmente en el canal. Los usuarios con este privilegio pueden trasladar a usuarios a canales a los que el usuarios objetivo normalmente no tendría permiso para entrar. This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. Representa el permiso de crear subcanales. El usuarios que crea el subcanal será agregado al grupo admin del subcanal. This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. Representa el permiso de crear un subcanal temporal. El usuario que crea el subcanal se añadirá al grupo admin del subcanal. Los canales temporales no se almacenan y desaparecen cuando lo abandona el último usuario. This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. Representa el permiso de vincular canales. Los usuarios en canales vinculados se oirán entre sí, siempre que el jugador que habla tenga el privilegio <i>hablar</i> en el canal del oyente. Necesita el privilegio de vincular en ambos canales para crear un vínculo, pero sólo en uno de los caneles para eliminarlo. This represents the permission to write text messages to other users in this channel. Representa el permiso para escribir mensajes de texto a otros usuarios en este canal. This represents the permission to forcibly remove users from the server. Representa el permiso para eliminar usuarios del servidor por la fuerza. This represents the permission to permanently remove users from the server. Representa el permiso para eliminar usuarios del servidor permanentemente. This represents the permission to register and unregister users on the server. Represente el permiso para registrar y borrar usuarios del servidor. This represents the permission to register oneself on the server. Representa el permiso para registrarse a sí mismo en el servidor. Whisper Susurrar Move Mover Text message Mensaje de texto Kick Expulsar Ban Prohibir Register User Registrar usuario Register Self Registrarse a sí mismo Write ACL Escribir LCA ChatbarTextEdit Paste and &Send Paste and send Pegar y &enviar <center>Type chat message here</center> <center>Escriba aquí el mensaje de conversación</center> ClientUser Friend Amigo Authenticated Autenticado Priority speaker Orador prioritario Recording Grabando Muted (server) Mudo (servidor) Deafened (server) Sordo (servidor) Local Ignore (Text messages) Ignorado localmente (mensajes de texto) Local Mute Mudo localmente Muted (self) Mudo (por sí mismo) Deafened (self) Sordo (por sí mismo) ConfigDialog Accept changes Aceptar cambios This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. Este botón aceptará las opciones actuales y volverá a la aplicación.<br />Las opciones se almacenarán en el disco cuando salga de la aplicación. Reject changes Rechazar cambios This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. Este botón rechazará todos los cambios y volverá a la aplicación.<br />Las opciones se restaurarán a las posiciones previas. Apply changes Aplicar cambios This button will immediately apply all changes. Este botón aplicará inmediatamente todos los cambios. Undo changes for current page Deshace los cambios en la página actual This button will revert any changes done on the current page to the most recent applied settings. Este botón revertirá cualquier cambio hecho en la página actual a las opciones aplicadas mas recientemente. Restore defaults for current page Restaura las opciones por defecto en la página actual This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. Este boton restaurará sólo las opciones en la página actual a sus valores por defecto. No se cambiarán otras páginas.<br />Para restaurar todas las opciones a sus valores por defecto, tendrá que usar este botón en cada página. Mumble Configuration Configuración de Mumble ConnectDialog Connecting to %1 Conectando a %1 Enter username Introduzca el nombre de usuario Adding host %1 Agregando anfitrión %1 Servername Nombre del servidor Hostname Nombre del anfitrión Bonjour name Nombre Bonjour Port Puerto Addresses Direcciones Website Página web Packet loss Pérdida de paquetes Ping (80%) Ping (80%) %1 ms %1 ms Ping (95%) Ping (95%) Bandwidth Ancho de banda %1 kbit/s %1 kbit/s &Connect &Conectar &Filters &Filtros Unknown Users Usuarios Version Versión Failed to fetch server list No se pudo obtener la lista de servidores Mumble Server Connect Conexión al servidor Mumble Ping Ping Remove from Favorites Eliminar de favoritos Add custom server Agregar servidor personal Show all servers that respond to ping Muestra todos los servidores que responden al ping Show all servers with users Muestra todos los servidores con usuarios Show all servers Muestra todos los servidores &Copy &Copiar Copy favorite link to clipboard Copiar enlace a favorito al portapapeles &Paste &Pegar Paste favorite from clipboard Pegar favorito desde el portapapeles &Edit... &Editar... &Add New... &Agregar nuevo... Add to &Favorites Agregar a &favoritos Open &Webpage Abrir página &web Show &Reachable Mostrar a&lcanzables Show &Populated Mostrar en &uso Show &All Mostrar &todos ConnectDialogEdit Edit Server Editar servidor Name of the server Nombre del servidor A&ddress &Dirección Internet address of the server. Internet address of the server. Dirección de Internet del servidor. <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Dirección</b></br> Dirección de Internet del servidor. Puede ser un nombre de anfitrión normal, una dirección IPv4/IPv6 o un identificador de servicio Bonjour. Los identificadores de servicio Bonjour deben contener el prefijo '@' para que sean reconocidos por Mumble. &Port &Puerto Port on which the server is listening Puerto en el que el servidor está escuchando <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. <b>Puert</b><br/> Puerto en el que el servidor está escuchando. Si el servidor se identifica mediante un identificador de servicio Bonjour este campo será ignorado. &Username Nombre de &usuario Username to send to the server Nombre de usuario que se envia al servidor <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. <b>Nombre de usuario</b><br/> Nombre de usuario que se envia al servidor. Sepa que el servidor puede imponer restricciones acerca de que aspecto puede tener un nombre de usuario. Además, su nombre de usuario ya puede haber sido tomado por otro usuario. Label Etiqueta Add Server Agregar servidor You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 Password Contraseña Password to send to the server Contraseña que se enviará al servidor <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. <b>Contraseña</b><br/> Contraseña que se enviará al servidor al conectar. Se necesita esta contraseña cuando se conecta como <i>SuperUsuario</i> o a un servidor que use autenticación por contraseña. Si no se introduce aquí, se le solicitará al conectarse. Show password Mostrar contraseña <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. <b>Etiqueta</b><br/> Etiqueta de este servidor. Así es como se llamará el servidor en su lista del servidores y puede ser elegida libremente. Local server label Etiqueta del servidor local 127.0.0.1 127.0.0.1 64738 64738 Your username Tu nombre de usuario Your password Tu contraseña &Fill CoreAudioSystem Default Device Dispositivo por defecto CrashReporter Mumble Crash Report Informe de error de Mumble <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> <p><b>Lo sentimos muchísimo, pero parece que ha ocurrido un error en Mumble. ¿Desea enviar un informe de error a los desarrolladores de Mumble?</b></p><p>El informe de error contiene una copia parcial de la memoria de Mumble en el momento en el que ocurrió el error, y ayudará a que los desarrolladores corrijan el problema.</p> Email address (optional) Dirección de correo electrónico (opcional) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash Por favor, describa brevemente, en inglés, lo que estaba haciendo en el momento en que ocurrió el error Send Report Enviar informe Don't send report No enviar informe Crash upload successful Informe enviado con éxito Thank you for helping make Mumble better! ¡Gracias por ayudar a mejorar Mumble! Crash upload failed Falló el envío del informe We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. Lo sentimos de verdad, pero parece que el envío del informe ha fallado con el error %1 %2. Por favor, informe a un desarrollador. This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 Realmente esto no es nada divertido, pero aparentemente hay un error en el código de informe de errores, y no hemos conseguido enviar el informe. Puede informar a un desarrollador acerca del error %1 Uploading crash report Enviando informe de error Abort upload Suspender envio DXAudioInput Default DirectSound Voice Input Entrada de voz DirectSound por defecto Opening chosen DirectSound Input device failed. No microphone capture will be done. Falló la apertura del dispositivo DirectSound elegido. No se realizará ninguna captura del micrófono. Opening chosen DirectSound Input failed. Default device will be used. Falló la apertura del dispositivo DirectSound elegido. Se usará el dispositivo por defecto. Lost DirectSound input device. Dispositivo de entrada DirectSound perdido. DXAudioOutput Default DirectSound Voice Output Salida de voz DirectSound por defecto Opening chosen DirectSound Output failed. Default device will be used. Falló la apertura del dispositivo DirectSound elegido. Se usará el dispositivo por defecto. Lost DirectSound output device. Dispositivo de salida DirectSound perdido. Opening chosen DirectSound Output failed. No audio will be heard. Falló la apertura del dispositivo DirectSound elegido. No se oirá audio. Database Mumble failed to initialize a database in any of the possible locations. Mumble no logró inicializar una base de datos en ninguna de las ubicaciones posibles. The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. La base de datos '%1' es de solo lectura. Mumble no podrá almacenar los ajustes del servidor (p. ej., certificados SSL) hasta que arregle este problema. DeveloperConsole Developer Console DockTitleBar Drag here Arrastre aquí GlobalShortcut Shortcuts Métodos abreviados List of configured shortcuts Lista de métodos abreviados configurados Function Función Data Datos Shortcut Método abreviado Suppress Ocultar Add new shortcut Agregar nuevo método abreviado This will add a new global shortcut Esto agregará un nuevo método abreviado &Add &Agregar Remove selected shortcut Eliminar el método abreviado seleccionado This will permanently remove a selected shortcut. Esto eliminará permanentemente un método abreviado seleccionado. &Remove &Eliminar <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> <html><head/><body><p>Actualmente, Mumble solo puede usar concurrentemente para los métodos abreviados globales botones del ratón y teclas modificadoras del teclado (Alt, Ctrl, Cmd, etc.).</p><p>Si desea más flexibilidad, puede activar <span style=" font-style:italic;">Acceso para dispositivos de ayuda</span> en las preferencias de accesibilidad del sistema. Sin embargo, por favor fíjese en que este cambio también permite potencialmente que programas malintencionados lean lo que se escribe en su teclado.</p></body></html> Open Accessibility Preferences Abrir preferencias de accesibilidad Skip Omitir Enable Global Shortcuts Habilitar métodos abreviados globales <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. Additional Shortcut Engines <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. Enable Windows hooks <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. Enable GKey <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. Enable XInput <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. Enable shortcuts in privileged applications GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> <html><head/><body><p>Actualmente, Mumble solo puede usar para los métodos abreviados globales botones del ratón y teclas modificadoras del teclado (Alt, Ctrl, Cmd, etc.).</p><p>Si desea más flexibilidad, puede añadir Mumble como programa de confianza en la sección de Seguridad y Privacidad de las Preferencias del Sistema Mac.<p></p> En el panel de preferencias de Seguridad y Privacidad, cambia a la pestaña de Privacidad. Elige Accesibilidad (en la parte baja) de la lista a la izquierda. FInalmente, añade a Mumble a la lista de programas de confianza para la accesibilidad</body></html> Shortcuts Métodos abreviados Shortcut button combination. Combinación de botones del método abreviado. <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. <b>Esta es la combinación de teclas del método abreviado global.</b><br />Haga clic en este campo y después presione la combinación de teclas deseada para volver a asociarla. Suppress keys from other applications Ocultar las teclas a otras aplicaciones <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. <b>Oculta a otras aplicaciones las pulsaciones de teclas.</b><br />Habilitar esto ocultará el botón (o el último botón de una combinación de múltiples botones) a otras apliaciones. Tenga en cuenta que no todos los botones se pueden ocultar. GlobalShortcutTarget Whisper Target Objetivo del susurro Whisper to list of Users Susurrar a una lista de usuarios Channel Target Canal objetivo Restrict to Group Restringir al grupo If specified, only members of this group will receive the whisper. Si se especifica, sólo los miembros de este grupo recibirán el susurro. List of users Lista de usuarios Add Agregar Remove Eliminar Modifiers Modificadores Do not send positional audio information when using this whisper shortcut. No enviar información de audio posicional cuando se use este método abreviado. Ignore positional audio Ignorar audio posicional Shout to Linked channels Gritar en los canales vinculados Shout to subchannels Gritar en los subcanales Shout to Channel Gritar en el canal The whisper will also be transmitted to linked channels. El susurro también se transmitirá a los canales vinculados. The whisper will also be sent to the subchannels of the channel target. El susurro también se enviará a los subcanales del canal objetivo. GlobalShortcutX Mouse %1 Raton %1 JackAudioSystem Hardware Ports Mono Stereo LCD Not connected Desconectado LCDConfig Enable this device Habilitar este dispositivo LCD LCD Devices Dispositivos Name Nombre <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> <p>Esta es la lista de dispositivos LCD disponibles en su sistema. Enumera los dispositivos por nombre, pero también incluye el tamaño de la pantalla y el tipo de LCD. Mumble admite la salida hacia varios dispositivos LCD a la vez.</p> <h3>Tamaño:</h3> <p> Este campo describe el tamaño de un dispositivo LCD. El tamaño se da, o bien en píxeles (para LCDs gráficos), o bien en caracteres (para LCDs de caracteres).</p> <h3>Habilitado:</h3> <p>Determina si Mumble deberia dibujar en un dispositivo LCD en particular.</p> Size Tamaño Enabled Habilitado Views Vistas Minimum Column Width Ancho de columna mínimo <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> <p>Esta opción determina la anchura mínima de una columna en la vista del usuario.</p> <p>Si demasiada gente habla a la vez, la "vista del jugador" se dividirá en columnas. Puede usar esta opción para establecer un compromiso entre el número de jugadores mostrados en el LCD, y la anchura de los nombres de los jugadores.</p> This setting decides the width of column splitter. Esta opción determina la anchura del divisor de columnas. Splitter Width Anchura del divisor Log Debug Depuración Critical Crítico Warning Advertencia Information Información Server Connected Conectado al servidor Server Disconnected Desconectado del servidor Other self-muted/deafened Otro se enmudeció/ensordeció a sí mismo Permission Denied Permiso denegado Text Message Mensaje de texto User Joined Server Usuario se unió al servidor User Left Server Usuario dejó el servidor User recording state changed El estado de grabación del usuario ha cambiado User kicked (you or by you) Usuario expulsado (usted o por usted) User kicked Usuario expulsado You self-muted Te has enmudecido User muted (you) Usuario mudo (usted) User muted (by you) Usuario mudo (por usted) User muted (other) Usuario mudo (a otro) User Joined Channel Un usuario se unió al canal User Left Channel Usuario dejó el canal You self-unmuted Te has desenmudecido You self-deafened Te has ensordecido You self-undeafened Te has desensordecido User renamed Nombre de usuario modificado You Joined Channel You Joined Channel (moved) User connected and entered channel User left channel and disconnected Private text message the server el servidor [[ Invalid size ]] [[ Text object too large to display ]] [[ Objeto de texto demasiado grande para ser mostrado ]] [Date changed to %1] [Fecha cambiada a %1] link to %1 vínculo a %1 FTP link to %1 player link vínculo a jugador channel link vínculo a canal %1 link vínculo %1 LogConfig Toggle console for %1 events Conmutar consola para eventos "%1" Toggle pop-up notifications for %1 events Conmutar notificaciones emergentes para eventos "%1" Toggle Text-To-Speech for %1 events Conmutar Texto-A-Voz (TTS) para eventos "%1" Click here to toggle sound notification for %1 events Haga clic aquí para conmutar las notificaciones sonoras para eventos "%1" Toggle window highlight (if not active) for %1 events Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change Ruta al archivo de sonido usado para notificaciones de sonido en caso de eventos "%1"<br />Clic para reproducir<br />Doble clic para cambiar Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. Haga clic aquí para conmutar la salida a consola para los eventos "%1"<br />Si se marca, esta opción hará que Mumble escriba todos los eventos "%1" en su registro de mensajes. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. Haga clic aquí para conmutar las notificaciones emergentes para los eventos "%1"<br />Si se marca, Mumble creará una ventana emergente por cada evento "%1". Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. Ruta al archivo de sonido usado para notificaciones en caso de eventos "%1".<br />Clic para reproducir<br />Doble clic para cambiar<br />Asegúrese de que las notificaciones de sonido para estos eventos están habilitadas o este campo no tendrá efecto. Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. Haga clic aquí para conmutar el Texto-A-Voz para los eventos "%1"<br />Si se marca, Mumble usa Texto-A-Voz para leer los eventos "%1" en voz alta. El motor de Texto-A-Voz también puede leer el contenido del evento, algo que no puede conseguirse mediante ficheros de sonido. No se pueden usar Texto-A-Voz y archivos de sonido simultáneamente. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. Haga clic aquí para conmutar las notificaciones de sonido para los eventos "%1"<br />Si se marca, Mumble usa un archivo de sonido para indicarle los eventos "%1". No se pueden usar archivos de sonido y Texto-A-Voz simultáneamente. Messages Mensajes Message Mensaje Console Consola Notification Notificación Text-To-Speech Texto-A-Voz Soundfile Archivo de sonido Path Ruta Text To Speech Texto A Voz (TTS) Volume Volumen Volume of Text-To-Speech Engine Volumen del motor Texto-A-Voz (TTS) <b>This is the volume used for the speech synthesis.</b> <b>Este es el volumen usado para la síntesis de voz.</b> Length threshold Umbral de longitud Message length threshold for Text-To-Speech Engine Umbral de longitud del mensaje para el motor Texto-A-Voz <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. <b>Establece el umbral de longitud a usar para el motor de Texto-A-Voz.</b><br />No se leeran en voz alta por completo los mensajes mayores que este límite. Characters Caracteres Whisper Susurros If checked you will only hear whispers from users you added to your friend list. Si se marca, sólo oirá susurros de los usuarios que haya agregado a su lista de amigos. Only accept whispers from friends Sólo aceptar susurros de amigos If enabled text messages you send will be read back to you with TTS Si se habilita, los mensajes de texto que envíe se leerán mediante Texto-A-Voz (TTS) Read back own messages Leer los mensajes propios Chat Log Registro de charlas Maximum chat length Longitud máxima de la charla Unlimited Ilimitada Lines líneas Highlight LookConfig System default Predeterminado del sistema None Ninguno Only with users Sólo con usuarios All Todos Ask Preguntar Do Nothing No hacer nada Move Mover <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory <a href="%1">Buscar</a> User Interface Interfaz de usuario This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. Establece qué canales expandir automáticamente. <i>Ninguno</i> y <i>Todos</i> harán que se expandan ninguno o todos los canales, mientras que <i>Sólo con usuarios</i> hará que los canales se expandan y contraigan según los usuarios se unan a ellos o los abandonen. List users above subchannels (requires restart). Listar los usuarios encima de los subcanales (requiere reiniciar). <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. <b>Si se marca, los usuarios se mostrarán encima de los subcanales en la vista del canal.</b><br />Se requiere reiniciar Mumble para ver el cambio. Users above Channels Usuarios encima de los canales <b>If set, will verify you want to quit if connected.</b> <b>Si se marca, le pedirá confirmar que desea salir si está conectado.<b> Show number of users in each channel Muestra el número de usuarios en cada canal Show channel user count Mostrar el recuento de usuarios del canal Language Idioma Language to use (requires restart) Idioma a usar (requiere reiniciar) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. <b>Establece qué idioma debería usar mumble.</b><br />Tendrá que reiniciar Mumble para usar el nuevo idioma. Look and Feel Apariencia Layout Diseño Classic Clásico Stacked Apilado Hybrid Híbrido Custom Personal This changes the behavior when moving channels. Cambia el comportamiento al mover canales. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. Establece la conducta del arrastre de canales, puede ser usada para prevenir arrastres accidentales. <i>Mover</i> mueve el canal sin avisar. <i>No hacer nada</i> no hace nada y muestra un mensaje de error. <i>Preguntar</i> usa un cuadro de mensajes para confirmar si usted realmente deseaba mover el canal. Expand Expandir When to automatically expand channels Cuándo expandir automáticamente los canales Channel Dragging Arrastre de canales Ask whether to close or minimize when quitting Mumble. Preguntar si cerrar o minimizar al salir de Mumble. Ask on quit while connected Preguntar al salir mientras esté conectado Always On Top Siempre visible <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> <b>Si se marca, minimizar la ventana principal de Mumble hará que se oculte y sólo sea accesible desde el área de notificación. De lo contrario, será minimizada como lo haría normalmente una ventana.</b> Hide in tray when minimized Ocultar en el área de notificación al minimizar Hide the main Mumble window in the tray when it is minimized. Oculta la ventana principal de Mumble en el área de notificación cuando está minimizada. This setting controls when the application will be always on top. Esta opción controla cuando se mantendrá la aplicación sobre las demás. Never Nunca Always Siempre In minimal view En la vista mínima In normal view En la vista normal Displays talking status in system tray Mostrar el estado del habla en el área de notificación Show talking status in tray icon Mostrar el estado del habla en el área de notificación This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. Esta opción controla en qué situaciones la aplicación permanecerá visible sobre todas las demás. Si selecciona <i>Nunca</i> la aplicación no se mantendrá sobre las demás. <i>Siempre</i> hará que la aplicación se mantenga sobre las demás. <i>En la vista mínima</i> / <i>En modo normal</i> hará que la aplicación se mantenga sobre las demás sólo cuando la vista mínima se active / desactive. Show context menu in menu bar Mostrar el menú contextual en la barra de menú Apply some high contrast optimizations for visually impaired users Aplica algunas optimizaciones de alto contraste para usuarios con deficiencias visuales Optimize for high contrast Optimizar para alto contraste Application Aplicación Adds user and channel context menus into the menu bar Añade los menús contextuales de usuario y canal a la barra de menús Tray Icon Icono del área de notificación Channel Tree Árbol de canales Use selected item as the chat bar target Usar el elemento seleccionado como objetivo de la barra de charla Filter automatically hides empty channels FIltra automáticamente los canales vacios Show transmit mode dropdown in toolbar Mostrar desplegable de modo de transmisión en la barra de tareas Theme Tema Theme to use to style the user interface Tema para el estilo de la interfaz de usuario <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. <b>Configura el tema de la interfaz de usuario de Mumble</b><br />Mumble buscará temas en ciertos directorios y los mostrará en esta lista. El tema seleccionado será empleado para personalizar la apariencia visual de Mumble. Esto incluye colores, iconos y más. User Dragging This changes the behavior when moving users. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. Enable Developer menu When in custom layout mode, checking this disables rearranging. Lock layout MainWindow Root Root Push-to-Talk Global Shortcut Presionar-para-Hablar (PTT) Push and hold this button to send voice. Global Shortcut Mantenga pulsado este botón para enviar la voz. This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut Esto configura el botón presionar-para-hablar que, mientra mantenga pulsado, hará que se transmita la voz. Reset Audio Processor Global Shortcut Reiniciar el preprocesador de audio Unlink Plugin Global Shortcut Desvincular complemento Push-to-Mute Global Shortcut Presionar-para-Enmudecer Join Channel Global Shortcut Unirse al canal Toggle Overlay Global Shortcut Conmutar sobreimpresión Toggle state of in-game overlay. Global Shortcut Conmutar el estado de la sobreimpresión en el juego. Toggle Minimal Global Shortcut Conmutar mínimo Volume Up (+10%) Global Shortcut Aumentar el volumen (+10%) Volume Down (-10%) Global Shortcut Disminuir el volumen (-10%) Mumble Mumble Mumble -- %1 Mumble -- %1 &Window &Ventana Minimize Minimizar Ctrl+M Ctrl+M Close Cerrar Mumble is currently connected to a server. Do you want to Close or Minimize it? Mumble está conectado a un servidor actualmente. ¿Desea cerrarlo o minimizarlo? Mute Self Global Shortcut Enmudecerse Set self-mute status. Global Shortcut Fija su estado de enmudecimiento. This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut Esto establecerá o conmutará su estado de enmudecimiento. Si lo desactiva, también desactivará el ensordecimiento. Deafen Self Global Shortcut Ensordecerse Set self-deafen status. Global Shortcut Fija su estado de ensordecimiento. This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut Esto fijará o conmutará su estado de ensordecimiento. Si lo activa, también activara su enmudecimiento. Whisper/Shout Whisper Susurrar/Gritar <center>Not connected</center> Not connected <center>Desconectado</center> Clear Borrar Opening URL %1 Abriendo URL %1 File does not exist El archivo no existe File is not a configuration file. El archivo no es un archivo de configuración. Settings merged from file. Opciones combinadas desde el archivo. URL scheme is not 'mumble' El esquema del URL no es 'mumble' This version of Mumble can't handle URLs for Mumble version %1.%2.%3 Esta versión de Mumble no puede manejar URLs para la versión %1.%2.%3 de Mumble Connecting to %1 Conectando a %1 Enter username Introduzca el nombre de usuario Connecting to server %1. Conectando al servidor %1. Reconnecting. Volviendo a conectar. Transmit Mode set to Continuous Modo de Transmision ajustado a Continuo <p>%1 (%2)<br />%3</p> <p>%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> <h2>Canal de voz</h2><p>Cifrado con OCB-AES128 de 128 bit<br />%1 ms de latencia media (desviación %4)</p> Register yourself as %1 Registrarse como %1 <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <p>Está a punto de registrarse en este servidor. Esta acción no puede deshacerse, y su nombre de usuario no puede cambiarse una vez que se complete. Será conocido para siempre como '%1' en este servidor.</p><p>¿Está seguro de que desea registrarse?</p> <h2>Version</h2><p>Protocol %1</p> <h2>Versión</h2><p>Protocolo %1</p> <p>No build information or OS version available</p> <p>No hay información de compilación o versión de S.O. disponible.</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) La conexión está encriptada y autenticada mediante %1 y empleando %2 como mecanismo de intercambio de clave (%3) The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) La conexión está encriptada mediante %1 , con %2 para la autenticación de mensajes y %3 como mecanismo de intercambio de clave (%4) The connection is secured by the cipher suite that OpenSSL identifies as %1 La conexión es segura mediante la suite de cifrado que OpenSSL identifica como %1 <p>The connection provides perfect forward secrecy</p> <p>La conexión proporciona perfect formard secrecy</p> <p>The connection does not provide perfect forward secrecy</p> <p>La conexión no proporciona perfect forward secrecy</p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> <h2>Canal de control</h2><p>La conexión usa %1</p>%2%3<p>%4 ms de latencia media (%5 desviación)</p><p>Anfitrión remoto %6 (puerto %7)</p> Voice channel is sent over control channel El canal de voz se envía a través del canal de control. Register user %1 Registrar al usuario %1 <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> <p>Está a punto de registrar a %1 en el servidor. Esta acción no puede deshacerse, el nombre de usuario no puede cambiarse, y como usuario registrado, %1 tendrá acceso al servidor incluso si cambia la contraseña del servidor.</p><p>De ahora en adelante, %1 será autenticado mediante el certificado actualmente en uso.</p><p>¿Está seguro de que desea registrar a %1?</p> Kicking user %1 Expulsando al usuario %1 Banning user %1 Prohibiendo al usuario %1 View comment on user %1 Ver los comentarios sobre el usuario %1 Message to channel %1 Mensaje al canal %1 Connected. Conectado. <li>Expected certificate digest (SHA-1): %1</li> Server presented a certificate which failed verification. El servidor presento un certificado que no superó la verificación. <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> SSL Version mismatch Las versiones de SSL no coinciden Server connection failed. <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>Escriba aquí el mensaje al canal '%1'</center> <center>Type message to user '%1' here</center> Type message to user '%1' here <center>Escriba aquí el mensaje al usuario '%1'</center> Choose image file Elija el archivo de imágen Failed to load image Fallo al cargar archivo de imágen Could not open file for reading. No se pudo abrir el archivo para su lectura. Image format not recognized. Formato de imágen no reconocido. &User &Usuario &Channel &Canal Use in conjunction with Whisper to. Global Shortcut Emplee junto con Susurro a. This will switch the states of the in-game overlay. Global Shortcut Esto conmutará el estado de la sobreimpresión durante el juego. Link Channel Global Shortcut Vincular canal Cycle Transmit Mode Global Shortcut Modo de Transmisión Cíclica Set Transmit Mode to Push-To-Talk Global Shortcut Set Transmit Mode to Continuous Global Shortcut Set Transmit Mode to VAD Global Shortcut Send Text Message Global Shortcut Enviar Mensaje de Texto Send Clipboard Text Message Global Shortcut This will send your Clipboard content to the channel you are currently in. Global Shortcut Continuous Continuo Voice Activity Actividad Vocal Push-to-Talk Presionar-para-Hablar Mumble - Minimal View -- %1 Mumble - Vista Mínima -- %1 Cancel Cancelar Save Image As... Guardar Imagen como... Save Image File Guardar Imagen Could not save image: %1 No se pudo guardar la imagen: %1 Change your comment Cambia su comentario Transmit Mode set to Voice Activity Modo de transmisión ajustado a Actividad Vocal Transmit Mode set to Push-to-Talk Modo de transmisión ajustado a Presionar-para-Hablar <p>Connected users: %1/%2</p> <p>Usuarios conectados: %1/%2</p> UDP Statistics Estadísticas de UDP To Server Hacia el servidor From Server Desde el servidor Good Correctos Late Tardíos Lost Perdidos Resync Resincronizaciones <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> <h2>Ancho de banda del audio</h2><p>Máximo %1 kbit/s<br />Actual %2 kbit/s<br />Códec: %3</p> Mumble Server Information Información del servidor Mumble &View Certificate &Ver certificado Enter reason Introduzca el motivo Sending message to %1 Enviando mensaje a %1 To %1: %2 A %1: %2 Message to %1 Mensaje para %1 Are you sure you want to reset the comment of user %1? ¿Está seguro de que desea reiniciar el comentario sobre el usuario %1? Are you sure you want to reset the avatar of user %1? Estás seguro de que desea reiniciar el avatar del usuario %1? Are you sure you want to delete %1 and all its sub-channels? ¿Está seguro de que desa borrar %1 y todos sus subcanales? Sending message to channel %1 Enviando mensaje al canal %1 Message to tree %1 Mensaje para el árbol %1 To %1 (Tree): %2 (Tree) %1: %2 Al (Árbol) %1: %2 Unmuted and undeafened. Con voz y escucha. Unmuted. Con voz. Muted. Mudo. Muted and deafened. Mudo y sordo. Deafened. Sordo. Undeafened. Con escucha. Restart Mumble? Reiniciar Mumble? Some settings will only apply after a restart of Mumble. Restart Mumble now? Algunas opciones tendrán efecto despues de reiniciar Mumble. Reiniciar Mumble ahora? About Qt Acerca de Qt SSL Verification failed: %1 Falló la verificación SSL: %1 <li>Server certificate digest (SHA-1): %1</li> <b>WARNING:</b> The server presented a certificate that was different from the stored one. <b>ADVERTENCIA:</b> El servidor presentó un certificado que es diferente del almacenado. This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. El servidor usa un estándar de cifrado antiguo y no es soportado por versiones modernas de Mumble. Server connection failed: %1. Falló la conexión con el servidor: %1. Disconnected from server. Desconectado del servidor. Invalid username Nombre de usuario inválido You connected with an invalid username, please try another one. Se ha conectado con un nombre de usuario no válido, por favor, intente con otro. Username in use Nombre de usuario en uso That username is already in use, please try another username. Ese nombre de usuario ya esta en uso, por favor, intente con otro nombre de usuario. Wrong certificate or password Certificado o contraseña incorrecta Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. Certificado o contraseña incorrecta para el usuario registrado. Si está seguro de que este usuario está protegido por contraseña, por favor, inténtelo de nuevo. De lo contrario, aborte y compruebe su certificado y nombre de usuario. Wrong password Contraseña incorrecta Wrong server password for unregistered user account, please try again. Contraseña del servidor incorrecta para cuenta de usuario no registrada, por favor, inténtelo de nuevo. Images (*.png *.jpg *.jpeg) Imágenes (*.png *.jpg *.jpeg) C&onfigure C&onfigurar &Help &Ayuda Log Registro This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. Muestra toda la actividad reciente. Aquí se muestran conexiones a servidores, errores y mensajes informativos.<br />Para configurar exactamente qué mensajes se muestran aquí, use la orden <b>Opciones</b> del menú. &Quit Mumble &Salir de Mumble Closes the program Cierra el programa Exits the application. Sale de la aplicación. Ctrl+Q Ctrl+S Open the server connection dialog Abre el cuadro de diálogo de conexión con el servidor &Disconnect &Desconectar Disconnect from server Desconectarse del servidor Disconnects you from the server. Le desconecta del servidor. Show information about the server connection Muestra información acerca de la conexión con el servidor This will show extended information about the connection to the server. Muestra información extendida acerca de la conexión con el servidor. &Mute En&mudecer &Deafen En&sordecer &Local Mute Enmudecer &localmente Send a Text Message Enviar un mensaje de texto Sends a text message to another user. Envía un mensaje de texto a otro usuario. Add new channel Agrega un nuevo canal This adds a new sub-channel to the currently selected channel. Agrega un nuevo subcanal al canal actualmente seleccionado. Remove channel Elimina un canal This removes a channel and all sub-channels. Elimina un canal y todos sus subcanales. Edit Groups and ACL for channel Edita los Grupos y la LCA para el canal This opens the Group and ACL dialog for the channel, to control permissions. Abre el cuadro de diálogo Grupo y LCA para el canal, para controlar los permisos. &Link &Vincular Link your channel to another channel Vincula su canal a otro canal This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. Esta es la barra de charla<br />Si introduce texto aquí y después presiona intro, el texto se enviará al usuario o canal que esté seleccionado. Si no se selecciona nada, el mensaje se envía a su canal actual. Chatbar Barra de charla Shows a dialog of registered servers, and also allows quick-connect. Muestra un cuadro de diálogo con los servidores registrados, y también le permite establecer una conexión rápida. Kick user (with reason) Expulsar usuario (con motivo) Kick selected user off server. You'll be asked to specify a reason. Expulsa del servidor al usuario seleccionado. Se le pedirá que especifique un motivo. Mute user Enmudecer usuario Mute or unmute user on server. Unmuting a deafened user will also undeafen them. Enmudece o da voz en el servidor al usuario. Dar voz a un usuario ensordecido también le dará escucha. Kick and ban user (with reason) Expulsar y prohibir usuario (con motivo) Kick and ban selected user from server. You'll be asked to specify a reason. Expulsa y prohibe del servidor al usuario seleccionado. Se le pedirá que especifique un motivo. Deafen user Ensordecer usuario Deafen or undeafen user on server. Deafening a user will also mute them. Ensordece o da escucha en el servidor al usuario. Ensordecer a un usuario también lo enmudecerá. Mute user locally Enmudecer usuario localmente Mute or unmute user locally. Use this on other users in the same room. Enmudece o da voz localmente a un usuario. Use esto sobre otros usuarios de la misma sala. This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. Vincula su canal actual con el canal seleccionado. Si tienen permiso para hablar en el otro canal, los usuarios podrán oírse entre sí. Este vínculo es permanente, y durará hasta que se desvincule manualmente o se reinicie el servidor. Por favor, vea los método abreviados para pulsar-para-vincular. &Unlink Channel &Desvincular Unlink your channel from another channel Desvincula su canal de otro canal This unlinks your current channel from the selected channel. Desvincula su canal actual del canal seleccionado. Unlinks your channel from all linked channels. Desvincula su canal de todos los canales vinculados. This unlinks your current channel (not the selected one) from all linked channels. Desvincula su canal actual (no el seleccionado) de todos los canales vinculados. &Reset &Reiniciar Reset audio preprocessor Reinicia el preprocesador de audio This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. Reinicia el preprocesador de audio, incluyendo cancelación de ruido, ganancia automática y detección de actividad vocal. Si de pronto algo empeora el entorno de audio (como dejar caer el micrófono) y fue temporal, use esto para evitar tener que esperar a que se reajuste el preprocesador. &Mute Self En&mudecerse Mute yourself Se enmudece a sí mismo Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. Se enmudece o se da voz a sí mismo. Cuando enmudezca, no enviará ningún dato al servidor. Darse voz mientras está ensordecido también le dará escucha. &Deafen Self En&sordecerse Deafen yourself Se ensordece a sí mismo Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. Se ensordece o se da escucha a sí mismo. Cuando ensordezca, no oirá nada. Darse escucha a sí mismo también le dará voz. &Text-To-Speech &Texto-A-Voz Toggle Text-To-Speech Conmuta Texto-A-Voz Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. Habilita o inhabilita el motor de texto-a-voz (TTS). Realmente sólo se dirán los mensajes habilitados para TTS en el cuadro de diálogo Configuración. Display audio statistics Muestra estadísticas de audio Pops up a small dialog with information about your current audio input. Muestra un pequeño cuadro de diálogo con información acerca de la entrada de audio. Forcibly unlink plugin Desvincular complemento forzosamente This forces the current plugin to unlink, which is handy if it is reading completely wrong data. Fuerza al complemento actual a desvincularse, lo que es útil si está leyendo datos completamente erróneos. Configure Mumble Configura Mumble Allows you to change most settings for Mumble. Le permite cambiar la mayoría de opciones de Mumble. Start the audio configuration wizard Inicia el asistente de configuración de audio This will guide you through the process of configuring your audio hardware. Le guiará a través del proceso de configuración de su hardware de audio. &What's This? ¿&Qué es esto? Enter What's This? mode Entra en el modo "¿Qué es esto?" Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. Haga clic en esto para entrar en el modo "¿Qué es esto?". Su cursor se transformará en una interrogación. Haga clic en cualquier botón, opción de menú o área para mostrar una descripción de lo que es. Information about Mumble Información acerca de Mumble Shows a small dialog with information and license for Mumble. Muestra un pequeño cuadro de diálogo con información y la licencia de Mumble. Information about Speex Información acerca de Speex Shows a small dialog with information about Speex. Muestra un pequeño cuadro de diálogo con información acerca de Speex. Information about Qt Información acerca de Qt Shows a small dialog with information about Qt. Muestra un pequeño cuadro de diálogo con información acerca de Qt. Check for &Updates Comprobar &actualizaciones Check for new version of Mumble Comprueba si existe una nueva versión de Mumble Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. Se conecta a la página web de Mumble para comprobar si está disponible una nueva versión, y le notifica con una URL de descarga apropiada si este es el caso. Sends a text message to all users in a channel. Envía un mensaje de texto a todos los usuario de un canal. Configure certificates for strong authentication Configura los certificados para autenticación robusta This starts the wizard for creating, importing and exporting certificates for authentication against servers. Inicia el asistente para crear, importar y exporar certificados para autenticarse con los servidores. Register user on server Registra un usuario en el servidor This will permanently register the user on the server. Esto registrará al usuario permanentemente en el servidor. Add &Friend Agregar &amigo Adds a user as your friend. Agrega un usuario como su amigo. This will add the user as a friend, so you can recognize him on this and other servers. Esto agregará al usuario como un amigo, para que pueda reconocerlo en este y otros servidores. &Remove Friend &Eliminar amigo Removes a user from your friends. Elimina a un usuario de su lista de amigos. This will remove a user from your friends list. Esto eliminará a un usuario de su lista de amigos. &Update Friend &Actualizar amigo Update name of your friend. Actualiza el nombre de su amigo. Your friend uses a different name than what is in your database. This will update the name. Su amigo usa un nombre distinto al del que está en su base de datos. Esto actualizará el nombre. Edit registered users list Editar la lista de usuarios registrados This opens the editor for registered users, which allow you to change their name or unregister them. Abre el editor de usuarios registrados, que le permite cambiar sus nombres o borrarlos. Add or remove text-based access tokens Agrega o elimina credenciales de acceso basadas en texto &Minimal View Vista &mínima Toggle minimal window modes Conmutar los modos de ventana mínima This will toggle minimal mode, where the log window and menu is hidden. Esto conmutará el modo mínimo, en el que la ventana del registro de mensajes y el menú están ocultos. You muted and deafened %1. Fue enmudecido y ensordecido por %1. You unmuted and undeafened %1. Enmudeció y ensordeció a %1. You undeafened %1. Le dio escucha a %1. You suppressed %1. Contuvo a %1. %1 muted and deafened by %2. %1 fue enmudecido y ensordecido por %2. %1 unmuted and undeafened by %2. %2 dio voz y escucha a %1. %1 undeafened by %2. %2 dio escucha a %1. %1 suppressed by %2. %1 fue contenido por %2. %1 moved to %2. %1 fue llevado a %2. %1 moved to %2 by %3. %1 fue llevado a %2 por %3. %1 moved in from %2 by %3. %1 fue traído desde %2 por %3. %1 is now muted and deafened. %1 está ahora mudo y sordo. Your account information can not be verified currently. Please try again later La informacion de su cuenta no se puede verificar en este momento, por favor intente mas tarde Welcome message: %1 Mensaje de bienvenida: %1 Mumble: %1 Mumble: %1 You were denied %1 privileges in %2. Se le denegó el privilegio %1 en %2. %3 was denied %1 privileges in %2. Se le denegó el privilegio %1 en %2 a %3. Denied: Cannot modify SuperUser. Denegado: No puede modificar al SuperUsuario. Denied: Invalid channel name. Denegado: Nombre de canal inválido. Denied: Text message too long. Denegado: Mensaje de texto demasiado largo. Denied: Operation not permitted in temporary channel. Denegado: Operación no permitida en un canal temporal. You need a certificate to perform this operation. Necesita un certificado para realizar esta operación. %1 does not have a certificate. %1 no posee un certificado. Invalid username: %1. Nombre de usuario inválido: %1. Invalid username. Nombre de usuario inválido. Channel is full. El canal está lleno. Channel nesting limit reached. Se ha alcanzado el límite de anidamiento de canales. Channel count limit reached. Need to delete channels before creating new ones. Permission denied. Permiso denegado. %1 connected and entered channel. %1 connected. %1 se ha conectado. %1 is now muted. %1 está ahora mudo. %1 is now unmuted. %1 ahora tiene voz. Recording started Grabación iniciada Recording stopped Grabación detenida %1 started recording. %1 ha comenzado a grabar. %1 stopped recording. %1 ha dejado de grabar. You revoked your priority speaker status. Revocaste tu estado de hablante prioritario. You assumed priority speaker status. Asumiste el estado de hablante prioritario. %1 revoked your priority speaker status. %1 revocó tu estado de hablante prioritario. %1 gave you priority speaker status. %1 te dio el estado de hablante prioritario. You revoked priority speaker status for %1. Le revocaste el estado de hablante prioritario a %1. You gave priority speaker status to %1. Le diste el estado de hablante prioritario a %1. %1 revoked own priority speaker status. %1 revocó su estado de hablante prioritario. %1 assumed priority speaker status. %1 asumió el estado de hablante prioritario. %1 revoked priority speaker status for %2. %1 le revocó el estado de hablante prioritario a %2. %1 gave priority speaker status to %2. %1 le dió el estado de hablante prioritario a %2. You were unmuted and undeafened by %1. %1 le dio voz y sonido. You were muted by %1. Fue silenciado por %1. You were undeafened by %1. %1 le dio escucha. You were suppressed. You were suppressed by %1. Ha sido silenciado. You were unsuppressed. Ya no está silenciado You were unsuppressed by %1. %1 le ha desmuteado You joined %1. You moved %1 to %2. Moviste %1 a %2. %1 is recording %1 está grabando %1 renamed to %2 by %3. %1 renombrado como %2 por %3. %1 disconnected. %1 se ha desconectado. Server message from Servidor (Tree) (Árbol) (Channel) (Canal) (Private) %2%1: %3 %2%1: %3 Failed to load Opus, it will not be available for audio encoding/decoding. The server requests minimum client version %1 El servidor solicita que el cliente tenga la versión %1 como mínimo The server requests positional audio be enabled. El servidor solicita que el audio posicional esté habilitado. The server requests positional audio be disabled. El servidor solicita que el audio posicional esté desactivado The server requests Push-to-Talk be enabled. El servidor solicita que Presionar-para-Hablar (PTT) esté habilitado. The server requests Push-to-Talk be disabled. El servidor solicita que Presionar-para-Hablar (PTT) esté desactivado. You were unmuted by %1. %1 le dio voz. You muted %1. Enmudeció a %1. You unsuppressed %1. Liberó a %1. You unmuted %1. Dio voz a %1. %1 muted by %2. %1 enmudecido por %2. %1 unsuppressed by %2. %1 liberado por %2. %1 unmuted by %2. %2 dio voz a %1. Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. No se pudieron encontrar codecs CELT adecuados para los otros clientes. No podrá hablar a todos los usuarios. You were muted and deafened by %1. You were deafened by %1. Fue enmudecido y ensordecido por %1. You were kicked from the server by %1: %2. Fue expulsado del servidor por %1: %2. %3 was kicked from the server by %1: %2. %3 fue expulsado del servidor por %1: %2. You were kicked and banned from the server by %1: %2. Fue expulsado y prohibido del servidor por %1: %2. %3 was kicked and banned from the server by %1: %2. %3 fue expulsado y prohibido del servidor por %1: %2. You were moved to %1 by %2. Fue movido a %1 por %2. %1 entered channel. %1 ingresó en el canal. Server connection rejected: %1. Conexión con el servidor rechazada: %1. Denied: %1. Denegado: %1. %1 renamed to %2. %1 renombrado a %2 %1 left channel and disconnected. %1 dejó el canal y se desconectó. Message from %1 Mensaje de %1 You have User Dragging set to "Do Nothing" so the user wasn't moved. You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. Ha establecido el arrastre de canales a "No hacer nada" así que el canal no se movió. Unknown Channel Drag mode in UserModel::dropMimeData. Modo de arrastre de canales desconocido en UserModel::dropMimeData. Remote controlling Mumble: Controlando Mumble de forma remota Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) -jn, --jackname Set custom Jack client name. --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status Invocation Invocación Error: No RPC command specified Error: Comando RPC no especificado RPC RPC Welcome to Mumble. Bienvenido a Mumble. Skipping version check in debug mode. Omitiendo la comprobación de versión en modo de depuración. Hide Frame Ocultar marco Toggle showing frame on minimal window Conmuta entre mostrar o no el marco de la ventana mínima This will toggle whether the minimal window should have a frame for moving and resizing. Esto determina si la ventana mínima tiene un marco para ser movida o cambiada de tamaño. &Unlink All Desvincular &todo Reset the comment of the selected user. Restaura el comentario sobre el usuario seleccionado. &Join Channel &Unirse al canal View comment in editor Ver comentario en el editor Query server for connection information for user Solicitar al servidor información del usuario S&erver S&ervidor &Self Mi &usuario &Unlink Plugins &Desvincular complementos Register yourself on the server Le registra como usuario en el servidor Change your avatar image on this server Cambia su imágen avatar en este servidor &Remove Avatar &Eliminar Avatar Remove currently defined avatar image. Elimina la imágen avatar actualmente definida. Icon Toolbar Barra de herramientas de iconos Change your own comment Cambia su propio comentario Recording Grabación Priority Speaker Orador prioritario &Copy URL &Copiar URL Copies a link to this channel to the clipboard. Copia un vínculo a este canal en el portapapeles. Ignore Messages Ignorar mensajes Locally ignore user's text chat messages. Ignora localmente los mensajes de texto de un usuario. Silently drops all text messages from the user. Omite silenciosamente todos los mensajes de texto del usuario. Edit ban list on server Editar la lista de bans del servidor This lets you edit the server-side IP ban list. Esto le permite editar la lista de bans por IP del servidor. &Filter on/off &Filtro on/off Toggle the channel filter (Ctrl+F) Active/Desactive el filtro del canal (Crtl+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. Activa o desactiva el filtro de los canales seleccionados. Por defecto todos los canales vacios serán filtrados. Puede marcar canales adicionales para ser filtrados si así lo desea en el menu contextual del canal. Ctrl+F Ctrl+F &Hide Channel when Filtering &Ocultar el Canal cuando el filtro esté activo Reset the avatar of the selected user. Reiniciar el avatar del usuario seleccionado Locally adjust the user's speech volume. Ajustar de modo local el volumen de voz del usuario. Opens a dialog with a volume slider. Use this on other users in the same room. Abre un diálogo con una barra de volumen. Usa esto para otros usuarios en la misma sala. &Developer &Hide Mumble Hides the main Mumble window. Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. Show the Developer Console Shows the Mumble Developer Console, where Mumble's log output can be inspected. &Connect... &Ban list... &Information... &Kick... &Ban... Local Volume Adjustment... Send &Message... &Add... &Remove... &Edit... Audio S&tatistics... &Settings... &Audio Wizard... Developer &Console... &About... About &Speex... About &Qt... &Certificate Wizard... &Register... Registered &Users... Change &Avatar... &Access Tokens... Reset &Comment... Reset &Avatar... View Comment... &Change Comment... R&egister... Show Shows the main Mumble window. Manual Manual Mumble Positional Audio Position X Y Z m Heading Azimuth Elevation ° Meta data Context Identity Set State Linked Activated Unhinge NetworkConfig Network Red Updates are mandatory when using snapshot releases. Las actualizaciones son obligatorias cuando se usan versiones en desarrollo. Connection Conexión Use TCP compatibility mode Use TCP compatability mode Usar modo de compatibilidad TCP <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). <b>Habilita el modo de Compatibilidad TCP</b>.<br />Esto hará que Mumble sólo use TCP cuando se comunique con el servidor. Esto aumentará la carga adicional y provocará que los paquetes perdidos produzcan notables pausas en la comunicación, así que sólo debería ser usado si no consigue usar la opción por defecto (que emplea UDP para la voz y TCP para el control). Reconnect when disconnected Vuelve a conectarse cuando sea desconectado <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. <b>Volver a conectar cuando sea desconectado</b>.<br />Hace que Mumble intente volver a conectar automáticamente después de 10 segundos si falla su conexión con el servidor. Reconnect automatically Reconectar automáticamente Proxy Proxy Type Tipo Type of proxy to connect through Tipo de proxy a través del que conectar Direct connection Conexión directa HTTP(S) proxy Proxy HTTP(S) SOCKS5 proxy Proxy SOCKS5 Hostname Nombre del servidor Hostname of the proxy Nombre del servidor proxy Force TCP mode Forzar modo TCP Enable QoS to prioritize packets Habilita QoS para dar prioridad a los paquetes This will enable QoS, which will attempt to prioritize voice packets over other traffic. Esto habilitará QoS (<i>quality of service</i>,calidad de servicio), lo que tratará de dar mayor prioridad a los paquetes de voz sobre el resto del tráfico. Use Quality of Service Usar Calidad de Servicio (QoS) Don't send certificate to server and don't save passwords. (Not saved). No enviar información de certificados al servidor y no almacenar las contraseñas. (No se guarda). <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> <b>Esto suprime la información de identidad del cliente.</b><p>El cliente no se identificará con un certificado, incluso si está definido, y no almacenará las contraseñas de las conexiones. Se trata principalmente de una opción para pruebas y no se guarda.</p> Suppress certificate and password storage Suprimir certificados y almacenamiento de contraseñas <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>Tipo de proxy a través del que conectar</b><br />Esto hace que Mumble se conecte a través de un proxy para todas las conexiones salientes. Nota: El uso de túneles proxy fuerza a Mumble al modo de compatibilidad TCP, causando que todos los datos de voz se envíen a través del canal de control. <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. <b>Nombre del servidor proxy.<b><br />Este campo especifica el nombre del servidor proxy a través del que desea enviar el tráfico. Port Puerto Port number of the proxy Número de puerto del proxy <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. <b>Número de puerto del proxy.</b><br />Este campo especifica el número de puerto al que el proxy espera las conexiones. Username Nombre de usuario Username for proxy authentication Nombre de usuario para la autenticación con el proxy <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>Nombre de usuario para la autenticación con el proxy.</b><br />Esto especifica el nombre de usuario que utilizará para autentificarse con el proxy. En caso de que el proxy no use autenticación, o que desee conectarse anónimamente, simplemente deje este campo en blanco. Password Contraseña Password for proxy authentication Contraseña para la autenticación con el proxy <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>Contraseña para la autenticación con el proxy.</b><br />Esto especifica la contraseña que usará para autenticarse con el proxy. En caso de que el proxy no use autenticación, o que desee conectarse anónimamente, sencillamente deje este campo en blanco. Mumble services Servicios de Mumble Check for new releases of Mumble automatically. Buscar nuevas versiones de Mumble automáticamente. This will check for new releases of Mumble every time you start the program, and notify you if one is available. Esto hará que se busquen nuevas versiones de Mumble cada vez que se inicia el programa, y se le informe si hay una disponible. Check for application updates on startup Buscar actualizaciones de la aplicación durante al inicio Check for new releases of plugins automatically. Buscar nuevas versiones de los complementos automáticamente. This will check for new releases of plugins every time you start the program, and download them automatically. Esto hará que se busquen nuevas versiones de los complementos cada vez que inicia el programa, y las descará automáticamente. <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. <b>Envíar estadísticas anónimas.</b><br />Mumble tiene un equipo de desarrollo pequeño, y como tal necesita centrar su desarrollo donde mas se necesita. Con el envío de algunas estadísticas está contribuyendo a determinar dónde centrar el desarrollo. Submit anonymous statistics to the Mumble project Envia estadísticas anónimas al proyecto Mumble Submit anonymous statistics Enviar estadísticas anónimas Reconnect to last used server when starting Mumble Vuelve a conectarse al último servidor usado cuando se inicia Mumble Reconnect to last server on startup Reconectar al último servidor al inicio Download plugin and overlay updates on startup Descargar actualizaciones de los complementos y la superposición al inicio Privacy Prevent OS information being sent to Mumble servers and web servers <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. Do not send OS information to Mumble servers and web servers Overlay Silent Callado Talking Hablando Whisper Susurro Shout Grito Channel Canal Failed to create communication with overlay at %2: %1. No overlay will be available. No se pudo establecer la comunicación con la sobreimpresión en %2: %1. La sobreimpresión no estará disponible. OverlayClient Filter Filtro Only talking Sólo hablando Talking and recently active Hablando y activo recientemente All in current channel Todos en el canal actual All in linked channels Todos en los canales vinculados Always show yourself Siempre mostrarse a sí mismo Configure recently active time (%1 seconds)... Configura el tiempo para considerar como activo recientemente (%1 segundos)... Columns Columnas Sort Ordenar Alphabetically Alfabéticamente Last state change Último cambio de estado Edit... Editar... Reset Zoom Restaurar zoom Configure recently active time Configura el tiempo para considerar como activo recientemente Amount of seconds users remain active after talking: Cantidad de segundos que los usuarios permanecerán activos después de hablar: OverlayConfig To move the users, drag the little red dot. Para mover a los usuarios, arrarstre el punto rojo pequeño. To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. Para cambiar el tamaño de los usuarios, use la rueda del ratón sobre un usuario. For more options, right click a user. For more options, rightclick a user. Para más opciones, haga clic con el botón derecho sobre un usuario. Launcher Filter Overlay Sobreimpresión Choose executable Elija el fichero ejecutable Choose application Elija una aplicación Choose path Load Overlay Presets Cargar ajustes de superposición Mumble overlay presets (*.mumblelay) Ajustes de superposición de Mumble (*.mumblelay) Save Overlay Presets Guardar ajustes de superposición Options Opciones Enable overlay. Habilita la sobreimpresión. Enable Overlay Habilitar Sobreimpresión This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. Establece si la sobreimpresión está habilitada o no. Esta opción se comprueba sólo cuando se inician las aplicaciones, así que asegúrese de que Mumble está ejecutándose y esta opción está activada antes de que inicie la aplicación.<br />Por favor, fíjese en que si inicia la aplicación después de iniciar Mumble, o si desactiva la sobreimpresión mientras se está ejecutando, no existe ninguna forma segura de reiniciar la sobreimpresión sin reiniciar también la aplicación. Layout Diseño Blacklist Lista negra Whitelist Lista blanca Uninstall Overlay Desinstalar la sobreimpresión Overlay Installation Instalación de la sobreimpresión Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. Mumble ha detectado que no se ha instalado la sobreimpresión de Mumble. Haga clic en el botón inferior para instalar la sobreimpresión. Install Mumble Overlay Instalar la sobreimpresión de Mumble Overlay Upgrade Actualizar la sobreimpresión Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. Mumble ha detectado en su ordenador una versión antigua de los ficheros de soporte a la sobreimpresión. Para actualizar estos ficheros a la última versión, haga clic en el botón inferior. Upgrade Mumble Overlay Actualizar la sobreimpresión de Mumble Display a frame counter in the overlay Mostrar un contador de fotogramas en la superposición Show FPS counter Mostrar contador de FPS Load an overlay preset from file Carga un conjunto de ajustes de superposición desde un archivo Load… Cargar... Save your overlay settings to file Guarda sus ajustes de superposición a un archivo Save… Guardar Set the overlay font. Establece la fuente de la superposición. Set the overlay text color. Establece el color del texto la superposición. Color Color Remove Eliminar Font Fuente FPS and Clock Display FPS y Reloj Display Display a clock in the overlay showing the current local time (system time). Mostrar un reloj en la sobreimpresión mostrando la hora actual local (hora del sistema). Show Clock Mostrar Reloj Overlay Exceptions Overlay Exception Mode Allowed launchers Add Allowed programs Allowed paths Blacklisted programs OverlayEditor State Estado User is not talking El usuario no está hablando Passive Pasivo User is talking in your channel or a linked channel El usuario está hablando en su canal o en un canal vinculado Talking Hablando User is whispering to you privately El usuario está susurrándole en privado Private Whisper Susurro privado User is shouting to your channel El usuario está gritando en su canal Channel Whisper Susurro al canal Zoom Zoom Zoom Factor Factor de zoom Enabled Elements Elementos habilitados User avatar, chosen by each user Avatar del usuario, elegido por cada usuario Avatar Avatar User's name Nombre de usuario Username Nombre de usuario Name of user's channel, if outside your current channel Nombre del canal del usuario, si está fuera de su canal actual Channel Canal Muted or deafened Mudo o sordo Mute state Estado mudo Bounding box, automatically shrunk to minimum size to contain all visible elements Caja circundante, encogida automáticamente al tamaño mínimo que puede contener todos los elementos visibles Bounding box Caja circundante Overlay Editor Editor de superposición OverlayEditorScene Layout preset Diseño preprogramado Large square avatar Gran avatar cuadrado Avatar and Name Avatar y nombre User Opacity Opacidad del usuario %1% %1% Object Opacity Opacidad del objeto Alignment Alineación Left Izquierda Center Centro Right Derecha Top Superior Bottom Inferior Color... Color... Font... Fuente... Bounding box Caja circundante Pen width Ancho de la línea Padding Relleno Pen color Color de la línea Fill color Color de relleno Pick pen color Escoja el color de la línea Pick fill color Escoja el color de relleno Pick color Escoja el color Pick font Escoja la fuente PluginConfig Plugins Complementos Plugin has no configure function. El complemento no tiene función de configuración. Plugin has no about function. El complemento no tiene información "acerca de". Options Opciones Enable plugins and transmit positional information Habilita los complementos y transmite información posicional This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. Permite que los complementos para los juegos soportados extraigan su posición en el juego y transmitan eso con cada paquete de voz. Esto permite que otros jugadores oigan su voz en el juego desde la dirección en la que su personaje está en relación al suyo. Link to Game and Transmit Position Vincularse con el juego y transmitir la posición Reloads all plugins Recarga todos los complementos This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. Vuelve a buscar y a recargar los complementos. Use esto si acaba de agregar o cambiar un complemento en el directorio de complementos. &Reload plugins &Recargar complementos Information about plugin Información acerca del complemento This shows a small information message about the plugin. Muestra un pequeño mensaje de información acerca del complemento. &About &Acerca de Show configuration page of plugin Muestra la página de configuración del complemento This shows the configuration page of the plugin, if any. Muestra la página de configuración del complemento, si la hay. &Configure &Configurar Name Nombre Enabled Habilitado Plugins Skipping plugin update in debug mode. Omitiendo la actualización de los complementos en el modo de depuración. Downloaded new or updated plugin to %1. Se ha descargado un complemento nuevo o actualizado para %1. Failed to install new plugin to %1. No se pudo instalar un nuevo complemento para %1. %1 lost link. %1 perdió el vínculo. %1 linked. %1 vinculado. PortAudioSystem Default Device Dispositivo por defecto PulseAudioSystem Default Input Entrada por defecto Default Output Salida por defecto QApplication Failed to restart mumble Falló el reinicio de mumble Mumble failed to restart itself. Please restart it manually. Mumble falló al intentar reiniciarse. Por favor reinicia manualmente. RichTextEditor Failed to load image No se pudo cargar la imágen Image file too large to embed in document. Please use images smaller than %1 kB. Archivo de imágen demasiado grande para ser incrustado en el documento. Por favor, use imágenes más pequeñas que %1 kB. Message is too long. El mensaje es demasiado largo. Display Visualización Source Text Texto fuente &Bold &Negrita Ctrl+B Ctrl+N &Italic Curs&iva Italic Cursiva Ctrl+I Ctrl+I Underline Subrayado Ctrl+U Ctrl+S Color Color Insert Link Insertar vínculo Ctrl+L Ctrl+L Insert Image Insertar imágen RichTextEditorLink Add Link Agregar vínculo URL URL Text Texto ServerHandler Unable to resolve hostname Server is not responding to TCP pings UDP packets cannot be sent to or received from the server. Switching to TCP mode. No se pueden enviar o recibir paquetes UDP del servidor. Cambiando al modo TCP. UDP packets cannot be sent to the server. Switching to TCP mode. No se pueden enviar paquetes UDP al servidor. Cambiando al modo TCP. UDP packets cannot be received from the server. Switching to TCP mode. No se pueden recibir paquetes UDP del servidor. Cambiando al modo TCP. UDP packets can be sent to and received from the server. Switching back to UDP mode. Se pueden enviar y recibir paquetes UDP del servidor. Volviendo al modo UDP. Connection timed out Expiró el tiempo de espera para la conexión ServerView Favorite Favorito LAN LAN Public Internet Internet pública Unknown Africa África Asia Asia North America América del Norte South America América del Sur Europe Europa Oceania Oceanía ShortcutActionWidget Unassigned Sin asignar ShortcutDelegate On Activado Off Desactivado Toggle Conmutar Unassigned Sin asignar ShortcutKeyWidget Press Shortcut Presione la tecla de método abreviado ShortcutTargetDialog Root Raíz Parent Padre Current Actual Subchannel #%1 Subcanal nª %1 ShortcutTargetWidget ... ... , , Root Raíz Parent Padre Current Actual Subchannel #%1 Subcanal nª %1 Invalid Inválido Empty <Empty> Vacío ShortcutToggleWidget Off Desactivado Toggle Conmutar On Activado TextMessage Enter text Introduzca el texto If checked the message is recursively sent to all subchannels Si se marca, el mensaje se envía recursivamente a todos los subcanales Send recursively to subchannels Enviar recursivamente a los subcanales Tokens Empty Token Credencial vacía Mumble - Access Tokens Mumble - Credenciales de acceso List of access tokens on current server Lista de credenciales de acceso en el servidor actual <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. <b>Esta es una lista editable de credenciales de acceso en el servidor al que está conectado.</b> <br /> Una credencial de acceso es una cadena de texto que puede ser usada como contraseña para una gestión de acceso a los canales muy simple. Mumble recordará las credenciales que ha usado y las volverá a enviar al servidor la próxima vez que se conecte, de manera que no tenga que introducirlas cada vez. Add a token Agrega una credencial &Add &Agregar Remove a token Elimina una credencial &Remove &Eliminar UserEdit Registered Users Usuarios registrados Remove Eliminar Rename Renombrar Who are you looking for? A quién estás buscando? Days Dias Weeks Semanas Months Meses Years Años Inactive for Inactivo durante Registered users: %n account(s) Usuarios registrados: %n cuenta(s)Usuarios registrados: %n cuenta(s) UserInformation User Information Información del usuario Connection Information Información de la conexión Version Versión OS S.O. Certificate Certificado IP Address Dirección IP CELT Versions Versiones CELT Details... Detalles... Ping Statistics Estadísticas de ping Pings received Pings recibidos Average ping Ping medio TCP (Control) TCP (Control) UDP (Voice) UDP (Voz) UDP Network statistics Estadísticas de red de UDP Good Correctos Late Tardíos Lost Perdidos Resync Resincronizaciones From Client Desde el cliente To Client Hacia el cliente Connection time Tiempo de conexión %1w %1sem %1d %1d %1h %1h %1m %1m %1s %1s , , %1 (%2) %1.%2.%3 (%4) %1 (%2) Supported Soportado Not Supported No soportado Not Reported No declarado %1 online (%2 idle) %1 conectado (%2 inactivo) %1 online %1 conectado %1 kbit/s %1 kbit/s Bandwidth GroupBox Ancho de banda Bandwidth Label Ancho de banda Ping deviation Desviación del ping UserListModel Nick Nick Inactive days Dias inactivo Last channel Último canal Last seen: %1 Visto por última vez: %1 Never Nunca Channel ID: %1 UserLocalVolumeDialog Local volume for other users Volumen local para otros usuarios <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. <b>Ajusta el volumen de otros usuarios de forma local</b><br />Mumble permite ajustar el volumen de otros usuarios de forma local. Adjusting local volume for %1 Ajustando volumen local en %1 dB dB <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> <html><head/><body><p>Usa el slider o el texto para cambiar el volumen del usuario</p><p><span style="font-weight:600;">Atención!</span></p><p>Aumentar demasiado el volumen de un usuario puede dañar tu capacidad auditiva. También podría incrementar el ruido de fondo del usuario</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: Este es un usuario conectado al servidor. El icono a la izquierda del usuario indica si está o no hablando: Talking to your channel. Hablando a su canal. Shouting directly to your channel. Whispering directly to your channel. Susurrando directamente a su canal. Whispering directly to you. Susurrándote directamente a ti. Not talking. Callado. This is a channel on the server. The icon indicates the state of the channel: Esto es un canal del servidor. El icono indica el estado del canal: Your current channel. Su canal actual. A channel that is linked with your channel. Linked channels can talk to each other. Un canal que está vinculado con su canal. Los canales vinculados pueden hablarse entre sí. A channel on the server that you are not linked to. Un canal del servidor al que no está vinculado. This shows the flags the user has on the server, if any: Esto muestra los emblemas que tiene el usuario en el servidor, si los hay: On your friend list En su lista de amigos Authenticated user Usuario autenticado Muted (manually muted by self) Mudo (enmudecido manualmente por sí mismo) Muted (manually muted by admin) Mudo (enmudecido manualmente por un administrado) Muted (not allowed to speak in current channel) Mudo (no se le permite hablar en el canal actual) Muted (muted by you, only on your machine) Mudo (enmudecido por usted, sólo en su máquina) Muted (push-to-mute) Deafened (by self) Sordo (por sí mismo) Deafened (by admin) Sordo (por un administrador) User has a new comment set (click to show) El usuario ha recibido un nuevo comentario (clic para mostrar) User has a comment set, which you've already seen. (click to show) El usuario tiene un comentario que ya ha visto (clic para mostrar) Ignoring Text Messages Ignorando mensajes de texto This shows the flags the channel has, if any: Muestra los emblemas que tiene el canal, si los hay: Channel has a new comment set (click to show) El canal ha recibido un nuevo comentario (clic para mostrar) Channel has a comment set, which you've already seen. (click to show) El canal tiene un comentario que ya ha visto (clic para mostrar) Channel will be hidden when filtering is enabled El canal será ocultado cuando el filtro esté activado Name Nombre Flags Emblemas Are you sure you want to drag this user? Are you sure you want to drag this channel? ¿Está seguro de que desea arrastrar este canal? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. No se puede realizar este movimiento automáticamente, por favor, reinicie los indicadores numéricos de órden o ajústelo manualmente. VersionCheck Upgrade Mumble Actualizar Mumble A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? Se ha detectado y descargado una nueva versión de Mumble. Se recomienda que se actualice a esta versión o que se desactualice a la última versión estable. ¿Desea iniciar el instalador ahora? Failed to launch snapshot installer. No se pudo iniciar el instalador de la versión en desarrollo. Corrupt download of new version detected. Automatically removed. Se ha detectado una descarga corrupta de la nueva versión. Se ha eliminado automáticamente. Downloading new snapshot from %1 to %2 Descargando nueva versión en desarrollo desde %1 en %2 Failed to write new version to disk. Failed to write new version to disc. No se pudo escribir la nueva versión en el disco. Mumble failed to retrieve version information from the central server. Mumble no pudo recuperar del servidor central la información de la versión. ViewCert Certificate Chain Details Detalles de la cadena de certificados Certificate chain Cadena de certificados Certificate details Detalles del certificado Common Name Organization Subunit Country Locality State Valid from: %1 Válido desde: %1 Valid to: %1 Válido hasta: %1 Serial: %1 Número de serie: %1 Public Key: %1 bits %2 Clave pública: %1 bits %2 RSA RSA DSA DSA Digest (SHA-1): %1 Huella digital (SHA-1): %1 Digest (SHA-256): %1 Email: %1 Correo electrónico: %1 DNS: %1 DNS: %1 Issued by: Emitido por: Unit Name VoiceRecorder Recorder failed to create directory '%1' La grabadora no pudo crear el directorio '%1' Recorder failed to open file '%1' La grabadora falló al abrir el archivo '%1' .wav - Uncompressed .wav - Sin comprimir .ogg (Vorbis) - Compressed .ogg (Vorbis) - Comprimido .au - Uncompressed .au - Sin comprimir .flac - Lossless compressed .flac - Comprimido sin pérdidas VoiceRecorderDialog Recorder Grabadora Control Control 00:00:00 00:00:00 &Start &Iniciar S&top &Detener Mode Modo Multichannel Multicanal Output Salida Output format Formato de salida Target directory Directorio de destino Filename Nombre del archivo &Browse... &Seleccionar... Valid variables are: Las variables válidas son: Inserts the user's name Inserta el nombre del usuario Inserts the current date Inserta la fecha actual Inserts the current time Inserta la hora actual Inserts the hostname Inserta el nombre del equipo Recorder still running Grabadora en funcionamiento Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? Cerrar la grabadora sin detenerla previamente puede causa una perdida de audio. Desea cerrar la grabadora? Unable to start recording. Not connected to a server. No se pudo iniciar la grabación. No está conectado a un servidor. The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. El servidor al que está conectado actualmente funciona con la versión 1.2.2 o anterior. Por razones de privacidad, no es posible la grabación en servidores con versiones anteriores a la 1.2.3. Por favor, contacte con el administrador de su servidor para más información. There is already a recorder active for this server. Ya hay una grabadora activa para este servidor. Please select a recording format. Por favor, seleccione un formato de grabación. Stopping Parando Select target directory Seleccione un directorio de destino Downmix Mezclar WASAPIInput Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone. WASAPISystem Default Device Dispositivo por defecto qwPTTButtonWidget Mumble PTT Presionar-para-Hablar (PTT) de Mumble Push to talk Presionar-para-Hablar (PTT) mumble-1.3.4/src/mumble/AudioInput.h0000664000175000017500000001160314010707273017144 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_AUDIOINPUT_H_ #define MUMBLE_MUMBLE_AUDIOINPUT_H_ #include #include #include #include #include #include #include #include #include #include "Audio.h" #include "Settings.h" #include "Timer.h" #include "Message.h" class AudioInput; class CELTCodec; class OpusCodec; struct CELTEncoder; struct OpusEncoder; struct DenoiseState; typedef boost::shared_ptr AudioInputPtr; class AudioInputRegistrar { private: Q_DISABLE_COPY(AudioInputRegistrar) public: static QMap *qmNew; static QString current; static AudioInputPtr newFromChoice(QString choice = QString()); const QString name; int priority; AudioInputRegistrar(const QString &n, int priority = 0); virtual ~AudioInputRegistrar(); virtual AudioInput *create() = 0; virtual const QList getDeviceChoices() = 0; virtual void setDeviceChoice(const QVariant &, Settings &) = 0; virtual bool canEcho(const QString &outputsys) const = 0; virtual bool canExclusive() const; }; class AudioInput : public QThread { friend class AudioNoiseWidget; friend class AudioEchoWidget; friend class AudioStats; friend class AudioInputDialog; private: Q_OBJECT Q_DISABLE_COPY(AudioInput) protected: typedef enum { CodecCELT, CodecSpeex } CodecFormat; typedef enum { SampleShort, SampleFloat } SampleFormat; typedef void (*inMixerFunc)(float * RESTRICT, const void * RESTRICT, unsigned int, unsigned int, quint64); private: SpeexResamplerState *srsMic, *srsEcho; QMutex qmEcho; QList qlEchoFrames; unsigned int iJitterSeq; int iMinBuffered; unsigned int iMicFilled, iEchoFilled; inMixerFunc imfMic, imfEcho; inMixerFunc chooseMixer(const unsigned int nchan, SampleFormat sf, quint64 mask); void resetAudioProcessor(); OpusCodec *oCodec; OpusEncoder *opusState; DenoiseState *denoiseState; bool selectCodec(); typedef boost::array EncodingOutputBuffer; int encodeOpusFrame(short *source, int size, EncodingOutputBuffer& buffer); int encodeCELTFrame(short *pSource, EncodingOutputBuffer& buffer); protected: MessageHandler::UDPMessageType umtType; SampleFormat eMicFormat, eEchoFormat; unsigned int iSampleRate; unsigned int iMicChannels, iEchoChannels; unsigned int iMicFreq, iEchoFreq; unsigned int iMicLength, iEchoLength; unsigned int iMicSampleSize, iEchoSampleSize; unsigned int iEchoMCLength, iEchoFrameSize; quint64 uiMicChannelMask, uiEchoChannelMask; bool bEchoMulti; int iFrameSize; QMutex qmSpeex; SpeexPreprocessState *sppPreprocess; SpeexEchoState *sesEcho; CELTCodec *cCodec; CELTEncoder *ceEncoder; /// bResetEncoder is a flag that notifies /// our encoder functions that the encoder /// needs to be reset. bool bResetEncoder; /// Encoded audio rate in bit/s int iAudioQuality; /// Number of 10ms audio "frames" per packet (!= frames in packet) int iAudioFrames; short *psMic; short *psSpeaker; short *psClean; float *pfMicInput; float *pfEchoInput; float *pfOutput; std::vector opusBuffer; void encodeAudioFrame(); void addMic(const void *data, unsigned int nsamp); void addEcho(const void *data, unsigned int nsamp); volatile bool bRunning; volatile bool bPreviousVoice; int iFrameCounter; int iSilentFrames; int iHoldFrames; int iBufferedFrames; QList qlFrames; void flushCheck(const QByteArray &, bool terminator, int voiceTargetID); void initializeMixer(); static void adjustBandwidth(int bitspersec, int &bitrate, int &frames); signals: void doDeaf(); void doMute(); public: typedef enum { ActivityStateIdle, ActivityStateReturnedFromIdle, ActivityStateActive } ActivityState; ActivityState activityState; bool bResetProcessor; Timer tIdle; int iBitrate; float dPeakSpeaker, dPeakSignal, dMaxMic, dPeakMic, dPeakCleanMic; float fSpeechProb; static int getNetworkBandwidth(int bitrate, int frames); static void setMaxBandwidth(int bitspersec); /// Construct an AudioInput. /// /// This constructor is only ever called by Audio::startInput(), and is guaranteed /// to be called on the application's main thread. AudioInput(); /// Destroy an AudioInput. /// /// This destructor is only ever called by Audio::stopInput() and Audio::stop(), /// and is guaranteed to be called on the application's main thread. ~AudioInput() Q_DECL_OVERRIDE; void run() Q_DECL_OVERRIDE = 0; virtual bool isAlive() const; bool isTransmitting() const; }; #endif mumble-1.3.4/src/mumble/TextToSpeech.h0000664000175000017500000000153614010707273017446 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_TEXTTOSPEECH_H_ #define MUMBLE_MUMBLE_TEXTTOSPEECH_H_ #include class TextToSpeechPrivate; class TextToSpeech : public QObject { friend class TextToSpeechPrivate; private: Q_OBJECT Q_DISABLE_COPY(TextToSpeech) Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled) protected: bool enabled; public: TextToSpeech(QObject *parent = NULL); ~TextToSpeech() Q_DECL_OVERRIDE; bool isEnabled() const; public slots: void say(const QString &text); void setEnabled(bool ena); void setVolume(int volume); private: TextToSpeechPrivate *d; }; #endif mumble-1.3.4/src/mumble/AudioInput.ui0000664000175000017500000010113414010707273017331 0ustar builderbuilder AudioInput 0 0 569 764 Audio input Interface System qcbSystem 0 0 Input method for audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Qt::Horizontal QSizePolicy::Maximum 24 16 Device qcbDevice 1 0 Input device for audio <b>This is the input device to use for audio.</b> QComboBox::AdjustToContents 16 0 27 Exclusive mode <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive Echo Cancellation Cancel echo from speakers Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. Disabled Mixed echo cancellation Multichannel echo cancellation 0 0 Transmission &Transmit qcbTransmit When to transmit your speech <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. 0 0 1 DoublePush Time qsDoublePush 0 0 TextLabel Displays an always on top window with a push to talk button in it Display push to talk window Qt::Vertical 20 40 If you press the PTT key twice in this time it will get locked. <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. 1000 10 100 Qt::Horizontal Hold Time TextLabel Time the microphone stays open after the PTT key is released 5000 10 Qt::Horizontal Use Amplitude based speech detection <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. Amplitude Use SNR based speech detection <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. Signal to Noise Voice &Hold qsTransmitHold How long to keep transmitting after silence <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). 20 250 Qt::Horizontal 40 0 16777215 10 Current speech detection chance <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Silence Below Signal values below this count as silence <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. 1 32767 100 1000 Qt::Horizontal Speech Above Signal values above this count as voice <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. 1 32767 100 1000 Qt::Horizontal Compression &Quality qsQuality Quality of compression (peak bandwidth) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. 8000 96000 1000 5000 32000 Qt::Horizontal 30 0 Audio per packet qsFrames How many audio frames to send per packet <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. 1 4 2 Qt::Horizontal 40 0 true Maximum bandwidth used for sending audio <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). Qt::AlignCenter Audio Processing Noise Suppression qsNoise Noise suppression <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. 14 60 5 Qt::Horizontal 30 0 Max. Amplification qsAmp Maximum amplification of input sound <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. 19500 500 2000 Qt::Horizontal 30 0 0 27 Apply RNNoise's noise suppression filter. <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. RNNoise Misc Browse for off audio file B&rowse... Off Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter On Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Preview the audio cues <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. &Preview Reset audio cue to default <b>Reset</b><br/>Reset the paths for the files to their default. R&eset Browse for on audio file &Browse... Gets played when starting to transmit Gets played when stopping to transmit Audible audio cue when starting or stopping to transmit <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. Audio cue Idle action The idle action will be reversed upon any key or mouse button input Undo Idle action upon activity 1 5000 5 30 0 minutes do nothing deafen mute Qt::Horizontal 40 20 after Qt::Vertical 1 151 AudioBar QWidget
AudioStats.h
1
MUComboBox QComboBox
widgets/MUComboBox.h
qcbSystem qcbDevice qcbEcho qcbTransmit qsDoublePush qrbSNR qsTransmitHold qsTransmitMin qsTransmitMax qsQuality qsFrames qsNoise qcbDenoise qsAmp
mumble-1.3.4/src/mumble/G15LCDEngine_helper.cpp0000664000175000017500000001146014010707273020763 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "G15LCDEngine_helper.h" #include "MumbleApplication.h" static LCDEngine *G15LCDEngineNew() { return new G15LCDEngineHelper(); } static LCDEngineRegistrar registrar(G15LCDEngineNew); G15LCDEngineHelper::G15LCDEngineHelper() : LCDEngine() { bRunning = false; bUnavailable = true; #if defined(Q_OS_WIN) qsHelperExecutable = QString::fromLatin1("\"%1/mumble-g15-helper.exe\"").arg(MumbleApplication::instance()->applicationVersionRootPath()); #elif defined(Q_OS_MAC) qsHelperExecutable = QString::fromLatin1("\"%1/mumble-g15-helper\"").arg(MumbleApplication::instance()->applicationVersionRootPath()); #endif qpHelper = new QProcess(this); qpHelper->setObjectName(QLatin1String("Helper")); qpHelper->setWorkingDirectory(qApp->applicationDirPath()); /* * Call our helper to detect whether any Logitech Gamepanel devices * are available on the system. */ qpHelper->start(qsHelperExecutable, QStringList(QLatin1String("/detect"))); qpHelper->waitForFinished(); if (qpHelper->exitCode() != 0) { qWarning("G15LCDEngine_lglcd: Logitech LCD Manager not detected."); return; } qlDevices << new G15LCDDeviceHelper(this); bUnavailable = false; QMetaObject::connectSlotsByName(this); } G15LCDEngineHelper::~G15LCDEngineHelper() { setProcessStatus(false); } QList G15LCDEngineHelper::devices() const { return qlDevices; } void G15LCDEngineHelper::setProcessStatus(bool run) { if (bUnavailable) return; if (run && !bRunning) { bRunning = true; qpHelper->start(qsHelperExecutable, QStringList(QLatin1String("/mumble"))); if (! qpHelper->waitForStarted(2000)) { qWarning("G15LCDEngine_lglcd: Unable to launch G15 helper."); bRunning = false; return; } } else if (!run && bRunning) { bRunning = false; qpHelper->kill(); qpHelper->waitForFinished(); } } void G15LCDEngineHelper::on_Helper_finished(int exitCode, QProcess::ExitStatus status) { /* Skip the signal if we killed ourselves. */ if (! bRunning) return; if (status == QProcess::CrashExit) { qWarning("G15LCDEngine_lglcd: Helper process crashed. Restarting."); qpHelper->start(qsHelperExecutable, QStringList(QLatin1String("/mumble"))); } else if (status == QProcess::NormalExit && exitCode != 0) { qWarning("G15LCDEngine_lglcd: Helper process exited. Exit code was: `%i'. Not attempting recovery.", exitCode); bUnavailable = true; } } bool G15LCDEngineHelper::framebufferReady() const { return !bUnavailable && (qpHelper->state() == QProcess::Running); } void G15LCDEngineHelper::submitFrame(bool alert, unsigned char *buf, qint64 len) { char pri = alert ? 1 : 0; if ((qpHelper->write(&pri, 1) != 1) || (qpHelper->write(reinterpret_cast(buf), len) != len)) qWarning("G15LCDEngine_lglcd: failed to write"); } /* -- */ G15LCDDeviceHelper::G15LCDDeviceHelper(G15LCDEngineHelper *e) : LCDDevice(), bEnabled(false) { engine = e; } G15LCDDeviceHelper::~G15LCDDeviceHelper() { } bool G15LCDDeviceHelper::enabled() { return bEnabled; } void G15LCDDeviceHelper::setEnabled(bool b) { engine->setProcessStatus(b); bEnabled = b; } void G15LCDDeviceHelper::blitImage(QImage *img, bool alert) { Q_ASSERT(img); int len = G15_MAX_FBMEM_BITS; uchar *tmp = img->bits(); uchar buf[G15_MAX_FBMEM]; if (! engine->framebufferReady()) return; if (! bEnabled) return; /* * The amount of copying/conversion we're doing is hideous. * * To draw to the LCD display using Logitech's SDK, we need to pass * it a byte array (in which each byte represents a single pixel on * the LCD.) * * Unfortunately, there's no way out, really. We *could* perhaps draw * directly to a monochrome "bytemap" (via Format_Indexed8, and a mono- * chrome colormap), but QPainter simply doesn't want to draw to a * QImage of Format_Indexed8. * * (What's even worse is that the byte array passed to the Logitech SDK * isn't even the native format of the LCD. It has to convert it once * more, when it receives a frame.) */ for (int i = 0; i < len; i++) { int idx = i*8; buf[idx+7] = tmp[i] & 0x80 ? 0xff : 0x00; buf[idx+6] = tmp[i] & 0x40 ? 0xff : 0x00; buf[idx+5] = tmp[i] & 0x20 ? 0xff : 0x00; buf[idx+4] = tmp[i] & 0x10 ? 0xff : 0x00; buf[idx+3] = tmp[i] & 0x08 ? 0xff : 0x00; buf[idx+2] = tmp[i] & 0x04 ? 0xff : 0x00; buf[idx+1] = tmp[i] & 0x02 ? 0xff : 0x00; buf[idx+0] = tmp[i] & 0x01 ? 0xff : 0x00; } engine->submitFrame(alert, buf, G15_MAX_FBMEM); } QString G15LCDDeviceHelper::name() const { return QString::fromLatin1("Logitech Gamepanel"); } QSize G15LCDDeviceHelper::size() const { return QSize(G15_MAX_WIDTH, G15_MAX_HEIGHT); } mumble-1.3.4/src/mumble/RichTextEditor.ui0000664000175000017500000000667214010707273020164 0ustar builderbuilder RichTextEditor 0 0 700 518 TabWidget QTabWidget::South 0 Display QTextEdit::AutoAll Source Text true skin:actions/format-text-bold.svgskin:actions/format-text-bold.svg &Bold Ctrl+B true skin:actions/format-text-italic.svgskin:actions/format-text-italic.svg &Italic Italic Ctrl+I true skin:actions/format-text-underline.svgskin:actions/format-text-underline.svg Underline Ctrl+U Color skin:mimetypes/text-html.svgskin:mimetypes/text-html.svg Insert Link Ctrl+L skin:mimetypes/image-x-generic.svgskin:mimetypes/image-x-generic.svg Insert Image RichTextHtmlEdit QTextEdit
RichTextEditor.h
mumble-1.3.4/src/mumble/Overlay.ui0000664000175000017500000006220314010707273016674 0ustar builderbuilder OverlayConfig 0 0 649 526 Form 0 1 0 0 6 QLayout::SetDefaultConstraint 0 0 0 Options Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop Enable overlay. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. Enable Overlay Qt::Horizontal 40 0 QLayout::SetDefaultConstraint Load an overlay preset from file Load… Save your overlay settings to file Save… Uninstall Overlay true 0 0 FPS and Clock Display QLayout::SetDefaultConstraint Display a frame counter in the overlay Show FPS counter Display a clock in the overlay showing the current local time (system time). Show Clock Set the overlay font. Font Set the overlay text color. Color Qt::Vertical 20 0 true 0 0 256 100 16777215 100 0 40 Qt::ScrollBarAlwaysOff Qt::ScrollBarAlwaysOff 128 128 128 0 0 0 QPainter::Antialiasing|QPainter::TextAntialiasing 0 Layout 1 1 Qt::ScrollBarAlwaysOff Qt::ScrollBarAlwaysOff 128 128 128 QPainter::Antialiasing|QPainter::HighQualityAntialiasing|QPainter::SmoothPixmapTransform|QPainter::TextAntialiasing Overlay Exceptions Overlay Exception Mode Qt::Horizontal 40 20 Qt::Horizontal Allowed launchers Add false Remove Allowed programs Add false Remove Allowed paths Add false Remove Blacklisted programs Add false Remove Overlay Installation 0 0 :/config_osd.png 0 0 Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter true Qt::Horizontal 40 20 Install Mumble Overlay Qt::Horizontal 40 20 Qt::Vertical 20 40 Overlay Upgrade QFormLayout::ExpandingFieldsGrow :/config_osd.png Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. true Qt::Horizontal 40 20 Upgrade Mumble Overlay Qt::Horizontal 40 20 Qt::Vertical 20 40 PathListWidget QListWidget
PathListWidget.h
mumble-1.3.4/src/mumble/mumble_gl.ts0000664000175000017500000115447214010707274017243 0ustar builderbuilder ACLEditor Deny Rexeitar Allow Permitir Allow %1 Permitir %1 Deny %1 Rexeitar %1 Mumble - Add channel Mumble - Engadir canle Default server value Valor por defecto do servidor Failed: Invalid channel Fallou: Canle non válida Mumble - Edit %1 Mumble - Editar %1 ID: %1 ID: %1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Esto dáche o %1 privilexio. Se un privilexio é permitido e rexeitado o mesmo tempo, este é finalmente rexeitado.<br />%2 Channel must have a name A canle debe ter un nome This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Esto rexeita o %1 privilexio. Se un privilexio é permitido e rexeitado o mesmo tempo, este é finalmente rexeitado.<br />%2 Dialog Diálogo Name Nome Enter the channel name here. Introduce o nome da canle aquí. Description Descrición Password Contrasinal Enter the channel password here. Introduce o nome da canle aquí. Check to create a temporary channel. Marca para crear unha canle temporal. Temporary Temporal <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Posición</b><br/> Este valor permíteche cambiar o xeito no que Mumble coloca as canles na árbore. Unha canle cun valor de <i>Posición</i> maior sempre será situado debaixo dun cun valor menor e viceversa. Se o valor <i>Posición</i> de dúas canles é a mesma ordenaránse alfabéticamente. Position Posición &Groups &Grupos Group Grupo List of groups Lista de grupos Remove selected group Borrar o grupo seleccionado Remove Borrar Inherit group members from parent Herdar os membros do grupo do pai Inherit Herdar Make group inheritable to sub-channels Facer o grupo herdable para as subcanles Inheritable Herdable Group was inherited from parent channel O grupo herdóuse da canle pai Inherited Herdado Members Membros Add Engadir Add member to group Engadir membro ó grupo Remove member from group Borrar membro do grupo &ACL &ACL Active ACLs ACLs activas List of entries Lista de entradas Inherit ACL of parent? Herdar ACL do pai? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. Inherit ACLs Herdar ACLs Move entry up Mover entrada cara arriba This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. Esto move a entrada cara arriba na lista. As entradas evalúanse en orde, esto podería cambiar os permisos efectivos dos usuarios. Non se pode mover unha entrada por riba de unha entrada herdada, se realmente o precisas terás que duplicar a entrada herdada. &Up &Arriba Move entry down Mover entrada cara abaixo This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. Esto move a entrada cara abaixo na lista. As entradas son evaluadas en orde, esto podería cambiar os permisos dos usuarios. &Down &Abaixo Add new entry Engadir nova entrada This adds a new entry, initially set with no permissions and applying to all. Esto engade unha nova entrada, inicialmente sen permisos e afectándo a todos. &Add &Engadir Remove entry Borrar entrada This removes the currently selected entry. Esto borra a entrada seleccionada actualmente. &Remove &Borrar Context Contexto Entry should apply to this channel. Entry should apply to this channel A entrada debería afectar a este canle. This makes the entry apply to this channel. Esto fai que a entrada afecte a esta canle. Applies to this channel Afecta a este canle. Entry should apply to sub-channels. A entrada debería afectar ós sub-canales. Add new group Engadir un novo grupo <b>Add</b><br/> Add a new group. <b>Engadir</b><br/> Engadir un novo grupo. Inherited members Membros herdados Contains the list of members added to the group by this channel. Contén a lista de membros engadidos ó grupo por esta canle. Contains a list of members whose group membership will not be inherited from the parent channel. Contén a lista de membros dos cales non serán herdados os grupos os que pertencen dende a canle pai. Contains the list of members inherited by other channels. Contén a lista de membros herdados por outras canles. Type in the name of a user you wish to add to the group and click Add. Introduce o nome do usuario que desexas engadir ó grupo e fai click en Engadir. Type in the name of a user you wish to remove from the group and click Add. Introduce o nome do usuario que desexas eliminar do grupo e fai click en Engadir. Exclude Excluir Excluded members Membros excluídos This makes the entry apply to sub-channels of this channel. Esto fai que a entrada se aplique ás sub-canles desta canle. Applies to sub-channels Afecta ás sub-canles Permissions Permisos User/Group Usuario/Grupo Group this entry applies to Grupos ós que esta entrada afecta User ID ID Usuario User this entry applies to Usuario ó que afecta esta entrada This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. &Properties &Propiedades <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>Nome</b><br />Introduce o nome da canle neste campo. O nome debe cumplir cas restricción impostas polo servidor o que estás conectado. <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. ID of the channel. ID da canle. Maximum Users Número Máximo de Usuarios Maximum number of users allowed in the channel Número máximo de usuarios permitidos na canle <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. This is the sort order for the channel. ALSAAudioInput Default ALSA Card Tarxeta ALSA por defecto Opening chosen ALSA Input failed: %1 Fallou a apertura do dispositivo ALSA: %1 ALSAAudioOutput Default ALSA Card Tarxeta ALSA por defecto Opening chosen ALSA Output failed: %1 Fallou a apertura do dispositivo ALSA: %1 ASIOConfig %1 (version %2) %1 (versión %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz ASIO Initialization failed: %1 Failed to instantiate ASIO driver ASIO ASIO Device selection Selección de dispositivo Device Dispositivo Device to use for microphone This chooses what device to query. You still need to actually query the device and select which channels to use. Query selected device Consultar el dispositivo seleccionado This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Query &Consulta Configure selected device Configurar o dispositivo seleccionado This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Configure &Configurar Capabilities Capacidades Driver name Nome do driver Buffer size Tamaño do buffer This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. Configure input channels Configurar canles de entrada Channels Canles Microphone Micrófono <- <- -> -> Unused Speakers Altofalantes ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. Opening selected ASIO device failed. No input will be done. AboutDialog About Mumble Acerca de Mumble <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble &Acerca de Mumble &License &Licencia A&uthors &Third-Party Licenses OK OK AudioInput Interface Interfaz System Sistema Input method for audio Método de entrada para o audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Dispositivo Input device for audio Dispositivo de entrada para o audio <b>This is the input device to use for audio.</b> Transmission Transmisión &Transmit &Transmitir When to transmit your speech Cando transmitir a súa voz <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. DoublePush Time If you press the PTT key twice in this time it will get locked. <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. Reset audio cue to default <b>Reset</b><br/>Reset the paths for the files to their default. Browse for on audio file Browse for off audio file Off Off On On Preview the audio cues Use SNR based speech detection Signal to Noise <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. Amplitude Amplitude Voice &Hold How long to keep transmitting after silence Silence Below <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. Speech Above Signal values above this count as voice Compression Compresión &Quality &Calidade Quality of compression (peak bandwidth) Calidade da compresión (pico ancho de banda) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. Audio per packet Audio por paquete How many audio frames to send per packet <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). Audio Processing Procesado de Audio Noise Suppression Supresión de Ruido Noise suppression Supresión de ruido <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. Maximum amplification of input sound <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. Current speech detection chance Cancel echo from speakers Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. Disabled <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal values below this count as silence Maximum bandwidth used for sending audio Use Amplitude based speech detection <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). Exclusive mode <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive R&eset R&eset &Browse... &Buscar... B&rowse... B&uscar... &Preview &Previsualizar <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. Displays an always on top window with a push to talk button in it Display push to talk window Misc Misc Audible audio cue when starting or stopping to transmit <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. Audio cue Gets played when starting to transmit Gets played when stopping to transmit Hold Time Time the microphone stays open after the PTT key is released Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) Max. Amplification Idle action minutes do nothing deafen mute after Echo Cancellation Mixed echo cancellation Multichannel echo cancellation The idle action will be reversed upon any key or mouse button input Undo Idle action upon activity Apply RNNoise's noise suppression filter. <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. RNNoise Audio input AudioInputDialog Continuous Voice Activity Push To Talk Audio Input %1 ms Off %1 s %1 kb/s -%1 dB %1 kbit/s (Audio %2, Position %4, Overhead %3) AudioOutput Interface System Output method for audio <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Output device for audio <b>This is the output device to use for audio.</b> Positional Audio Audio Output Default &Jitter Buffer Safety margin for jitter buffer <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. Minimum distance to user before sound volume decreases This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. Volume Volume of incoming speech <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. Output Delay Amount of data to buffer The connected "speakers" are actually headphones The connected "speakers" are actually headphones. Factor for sound volume decrease Bloom Factor for sound volume increase How much should sound volume increase for sources that are really close? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Headphones Minimum Distance Maximum Distance Maximum distance, beyond which speech volume won't decrease Minimum Volume What should the volume be at the maximum distance? Loopback Test Delay Variance Variance in packet latency <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. Packet Loss Packet loss for loopback mode <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% &Loopback Desired loopback mode Attenuate applications by... Attenuation of other applications during speech <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. If checked Mumble lowers the volume of other applications while other users talk <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. while other users talk If checked Mumble lowers the volume of other applications while you talk <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. while you talk Exclusive mode, not recommended. <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive Priority Speaker If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. Attenuate other users while talking as Priority Speaker. Advanced Attenuation Options If checked, Mumble will only attenuate applications that are using the same output source as Mumble <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. Only attenuate applications using the same output device If checked, PulseAudio loopback modules will be attenuated <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. Attenuate PulseAudio loopback modules Audio output AudioOutputDialog None Local Server Audio Output %1 ms %1 % %1 m AudioOutputSample Choose sound file Invalid sound file The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. AudioStats >1000 ms >1000ms Audio Statistics Input Levels Peak microphone level Peak power in last frame This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. Peak speaker level This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. Peak clean level This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. Signal Analysis Microphone power How close the current input level is to ideal This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. Signal-To-Noise ratio Signal-To-Noise ratio from the microphone This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. Speech Probability Probability of speech This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). Configuration feedback Current audio bitrate Bitrate of last frame DoublePush interval Time between last two Push-To-Talk presses Speech Detection Current speech detection chance <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal and noise power spectrum Power spectrum of input signal and noise estimate This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. Echo Analysis Weights of the echo canceller This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. AudioWizard Audio Tuning Wizard Introduction Welcome to the Mumble Audio Wizard Finished Enjoy using Mumble Device selection Selecting the input and output device to use with Mumble. This is the device your microphone is connected to. System Input method for audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Input device to use <b>Selects which sound card to use for audio input.</b> Cancel echo from headset or speakers Use echo cancellation This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. This is the device your speakers or headphones are connected to. Output method for audio <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. Output device to use <b>Selects which sound card to use for audio Output.</b> Enable positional audio Allows positioning of sound Allows positioning of sound. <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> Input Device Output Device This allows Mumble to use positional audio to place voices. <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> Amount of data to buffer This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> Positional Audio Adjusting attenuation of positional audio. <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> Use headphones instead of speakers <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> Use headphones This ignores the OS speaker configuration and configures the positioning for headphones instead. Volume tuning Tuning microphone hardware volume to optimal settings. Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. Voice Activity Detection Letting Mumble figure out when you're talking and when you're silent. This will help Mumble figure out when you are talking. The first step is selecting which data value to use. Raw amplitude from input Signal-To-Noise ratio Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Device tuning Changing hardware output delays to their minimum value. Submit anonymous statistics to the Mumble project Push To Talk: Quality & Notifications Adjust quality and notification settings. Quality settings Low Balanced Notification settings Use Text-To-Speech to read notifications and messages to you. Disable Text-To-Speech and use sounds instead. %1 ms Enables attenuation of other applications while users talk to you Attenuate applications while other users talk High Custom You already set a customized quality configuration in Mumble. Select this setting to keep it. Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. Apply some high contrast optimizations for visually impaired users Use high contrast graphics Keep custom Text-To-Speech settings. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) BanEditor Mumble - Edit Bans &Address &Mask Reason Start End User Hash &Add &Update &Remove Ban List Search field This is the search field. Use it to find bans that have this username set in the username field. Who are you looking for? No nickname IP address No IP address Reason for the ban No reason Ban end date Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). Certificate hash No certificate hash Banned users This is a list with banned users. Use this button if you want to add a new ban. Use this button if you want to update ban information. Use this button if you want to remove user from the ban list. Clear all fields This button clears all fields. Use it if you want to add a new ban. Clear Ban List - %n Ban(s) CertView Name Email Issuer Expiry Date (none) Self-signed CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. There was an error generating your certificate.<br />Please try again. Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. The file could not be opened for writing. Please use another file. The file's permissions could not be set. No certificate and key has been written. Please use another file. The file could not be written successfully. Please use another file. The file could not be opened for reading. Please use another file. The file is empty or could not be read. Please use another file. The file did not contain a valid certificate and key. Please use another file. Select file to export certificate to Select file to import certificate from Unable to import. Missing password or incompatible file type. <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. Certificates Certificate Management Certificate Authentication Authenticating to servers without using passwords Current certificate This is the certificate Mumble currently uses. Current Certificate Create a new certificate This will create a new certificate. Import certificate from file This will import a certificate from file. Import a certificate Export Certificate This will export a certificate to file. Export current certificate Import Certificate PKCS #12 Certificate import <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> Import from Filename to import from This is the filename you wish to import a certificate from. Select file to import from This opens a file selection dialog to choose a file to import a certificate from. Open... Password Password for PKCS#12 file This is the password for the PKCS#12 file containing your certificate. Certificate to import This is the certificate you are importing. Certificate Details Replace Certificate Replace existing certificate with new certificate? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> This is the certificate Mumble currently uses. It will be replaced. New certificate This is the new certificate that will replace the old one. New Certificate Make a backup of your certificate Export to Filename to export to This is the filename you wish to export a certificate to. Save As... This is the certificate Mumble currently uses. It will be exported. Generate a new certificate for strong authentication <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> Name Email Your email address (e.g. johndoe@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. Your name (e.g. John Doe) This is your name, and will be filled out in the certificate. This field is entirely optional. Finish Certificate-based authentication is ready for use Enjoy using Mumble with strong authentication. Automatic certificate creation <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> ChanACL None Traverse Enter Speak Mute/Deafen Make channel Make temporary Link channel This represents no privileges. This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. This represents the permission to write text messages to other users in this channel. This represents the permission to forcibly remove users from the server. This represents the permission to permanently remove users from the server. This represents the permission to register and unregister users on the server. This represents the permission to register oneself on the server. Whisper Move Text message Kick Ban Register User Register Self Write ACL ChatbarTextEdit Paste and &Send Paste and send <center>Type chat message here</center> ClientUser Friend Authenticated Priority speaker Recording Muted (server) Deafened (server) Local Ignore (Text messages) Local Mute Muted (self) Deafened (self) ConfigDialog Accept changes This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. Reject changes This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. Apply changes This button will immediately apply all changes. Undo changes for current page This button will revert any changes done on the current page to the most recent applied settings. Restore defaults for current page This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. Mumble Configuration ConnectDialog Connecting to %1 Enter username Adding host %1 Servername Hostname Bonjour name Port Addresses Website Packet loss Ping (80%) %1 ms Ping (95%) Bandwidth %1 kbit/s &Connect &Filters Unknown Users Version Failed to fetch server list Mumble Server Connect Ping Remove from Favorites Add custom server Show all servers that respond to ping Show all servers with users Show all servers &Copy Copy favorite link to clipboard &Paste Paste favorite from clipboard &Edit... &Add New... Add to &Favorites Open &Webpage Show &Reachable Show &Populated Show &All ConnectDialogEdit Edit Server Name of the server A&ddress Internet address of the server. Internet address of the server. <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. &Port Port on which the server is listening <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. &Username Username to send to the server <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. Label Add Server You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 Password Password to send to the server <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. Show password <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. Local server label 127.0.0.1 64738 Your username Your password &Fill CoreAudioSystem Default Device CrashReporter Mumble Crash Report <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> Email address (optional) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash Send Report Don't send report Crash upload successful Thank you for helping make Mumble better! Crash upload failed We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 Uploading crash report Abort upload DXAudioInput Default DirectSound Voice Input Opening chosen DirectSound Input device failed. No microphone capture will be done. Opening chosen DirectSound Input failed. Default device will be used. Lost DirectSound input device. DXAudioOutput Default DirectSound Voice Output Opening chosen DirectSound Output failed. Default device will be used. Lost DirectSound output device. Opening chosen DirectSound Output failed. No audio will be heard. Database Mumble failed to initialize a database in any of the possible locations. The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. DeveloperConsole Developer Console DockTitleBar Drag here GlobalShortcut Shortcuts List of configured shortcuts Function Data Shortcut Suppress Add new shortcut This will add a new global shortcut &Add Remove selected shortcut This will permanently remove a selected shortcut. &Remove <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> Open Accessibility Preferences Skip Enable Global Shortcuts <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. Additional Shortcut Engines <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. Enable Windows hooks <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. Enable GKey <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. Enable XInput <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. Enable shortcuts in privileged applications GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> Shortcuts Shortcut button combination. <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. Suppress keys from other applications <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. GlobalShortcutTarget Whisper Target Whisper to list of Users Channel Target Restrict to Group If specified, only members of this group will receive the whisper. List of users Add Remove Modifiers Do not send positional audio information when using this whisper shortcut. Ignore positional audio Shout to Linked channels Shout to subchannels Shout to Channel The whisper will also be transmitted to linked channels. The whisper will also be sent to the subchannels of the channel target. GlobalShortcutX Mouse %1 JackAudioSystem Hardware Ports Mono Stereo LCD Not connected LCDConfig Enable this device LCD Devices Name <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> Size Enabled Views Minimum Column Width <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> This setting decides the width of column splitter. Splitter Width Log Debug Critical Warning Information Server Connected Server Disconnected Other self-muted/deafened Permission Denied Text Message User Joined Server User Left Server User recording state changed User kicked (you or by you) User kicked You self-muted User muted (you) User muted (by you) User muted (other) User Joined Channel User Left Channel You self-unmuted You self-deafened You self-undeafened User renamed You Joined Channel You Joined Channel (moved) User connected and entered channel User left channel and disconnected Private text message the server [[ Invalid size ]] [[ Text object too large to display ]] [Date changed to %1] link to %1 FTP link to %1 player link channel link %1 link LogConfig Toggle console for %1 events Toggle pop-up notifications for %1 events Toggle Text-To-Speech for %1 events Click here to toggle sound notification for %1 events Toggle window highlight (if not active) for %1 events Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. Messages Message Console Notification Text-To-Speech Soundfile Path Text To Speech Volume Volume of Text-To-Speech Engine <b>This is the volume used for the speech synthesis.</b> Length threshold Message length threshold for Text-To-Speech Engine <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. Characters Whisper If checked you will only hear whispers from users you added to your friend list. Only accept whispers from friends If enabled text messages you send will be read back to you with TTS Read back own messages Chat Log Maximum chat length Unlimited Lines Highlight LookConfig System default None Only with users All Ask Do Nothing Move <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory User Interface This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. List users above subchannels (requires restart). <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. Users above Channels <b>If set, will verify you want to quit if connected.</b> Show number of users in each channel Show channel user count Language Language to use (requires restart) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. Look and Feel Layout Classic Stacked Hybrid Custom This changes the behavior when moving channels. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. Expand When to automatically expand channels Channel Dragging Ask whether to close or minimize when quitting Mumble. Ask on quit while connected Always On Top <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> Hide in tray when minimized Hide the main Mumble window in the tray when it is minimized. This setting controls when the application will be always on top. Never Always In minimal view In normal view Displays talking status in system tray Show talking status in tray icon This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. Show context menu in menu bar Apply some high contrast optimizations for visually impaired users Optimize for high contrast Application Adds user and channel context menus into the menu bar Tray Icon Channel Tree Use selected item as the chat bar target Filter automatically hides empty channels Show transmit mode dropdown in toolbar Theme Theme to use to style the user interface <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. User Dragging This changes the behavior when moving users. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. Enable Developer menu When in custom layout mode, checking this disables rearranging. Lock layout MainWindow Root Push-to-Talk Global Shortcut Push and hold this button to send voice. Global Shortcut This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut Reset Audio Processor Global Shortcut Unlink Plugin Global Shortcut Push-to-Mute Global Shortcut Join Channel Global Shortcut Toggle Overlay Global Shortcut Toggle state of in-game overlay. Global Shortcut Toggle Minimal Global Shortcut Volume Up (+10%) Global Shortcut Volume Down (-10%) Global Shortcut Mumble Mumble -- %1 &Window Minimize Ctrl+M Close Mumble is currently connected to a server. Do you want to Close or Minimize it? Mute Self Global Shortcut Set self-mute status. Global Shortcut This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut Deafen Self Global Shortcut Set self-deafen status. Global Shortcut This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut Whisper/Shout Whisper <center>Not connected</center> Not connected Clear Opening URL %1 File does not exist File is not a configuration file. Settings merged from file. URL scheme is not 'mumble' This version of Mumble can't handle URLs for Mumble version %1.%2.%3 Connecting to %1 Enter username Connecting to server %1. Reconnecting. Transmit Mode set to Continuous <p>%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> Register yourself as %1 <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <h2>Version</h2><p>Protocol %1</p> <p>No build information or OS version available</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) The connection is secured by the cipher suite that OpenSSL identifies as %1 <p>The connection provides perfect forward secrecy</p> <p>The connection does not provide perfect forward secrecy</p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> Voice channel is sent over control channel Register user %1 <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> Kicking user %1 Banning user %1 View comment on user %1 Message to channel %1 Connected. <li>Expected certificate digest (SHA-1): %1</li> Server presented a certificate which failed verification. <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> SSL Version mismatch Server connection failed. <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>Type message to user '%1' here</center> Type message to user '%1' here Choose image file Failed to load image Could not open file for reading. Image format not recognized. &User &Channel Use in conjunction with Whisper to. Global Shortcut This will switch the states of the in-game overlay. Global Shortcut Link Channel Global Shortcut Cycle Transmit Mode Global Shortcut Set Transmit Mode to Push-To-Talk Global Shortcut Set Transmit Mode to Continuous Global Shortcut Set Transmit Mode to VAD Global Shortcut Send Text Message Global Shortcut Send Clipboard Text Message Global Shortcut This will send your Clipboard content to the channel you are currently in. Global Shortcut Continuous Voice Activity Push-to-Talk Mumble - Minimal View -- %1 Cancel Save Image As... Save Image File Could not save image: %1 Change your comment Transmit Mode set to Voice Activity Transmit Mode set to Push-to-Talk <p>Connected users: %1/%2</p> UDP Statistics To Server From Server Good Late Lost Resync <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> Mumble Server Information &View Certificate Enter reason Sending message to %1 To %1: %2 Message to %1 Are you sure you want to reset the comment of user %1? Are you sure you want to reset the avatar of user %1? Are you sure you want to delete %1 and all its sub-channels? Sending message to channel %1 Message to tree %1 To %1 (Tree): %2 (Tree) %1: %2 Unmuted and undeafened. Unmuted. Muted. Muted and deafened. Deafened. Undeafened. Restart Mumble? Some settings will only apply after a restart of Mumble. Restart Mumble now? About Qt SSL Verification failed: %1 <li>Server certificate digest (SHA-1): %1</li> <b>WARNING:</b> The server presented a certificate that was different from the stored one. This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. Server connection failed: %1. Disconnected from server. Invalid username You connected with an invalid username, please try another one. Username in use That username is already in use, please try another username. Wrong certificate or password Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. Wrong password Wrong server password for unregistered user account, please try again. Images (*.png *.jpg *.jpeg) C&onfigure &Help Log This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. &Quit Mumble Closes the program Exits the application. Ctrl+Q Open the server connection dialog &Disconnect Disconnect from server Disconnects you from the server. Show information about the server connection This will show extended information about the connection to the server. &Mute &Deafen &Local Mute Send a Text Message Sends a text message to another user. Add new channel This adds a new sub-channel to the currently selected channel. Remove channel This removes a channel and all sub-channels. Edit Groups and ACL for channel This opens the Group and ACL dialog for the channel, to control permissions. &Link Link your channel to another channel This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. Chatbar Shows a dialog of registered servers, and also allows quick-connect. Kick user (with reason) Kick selected user off server. You'll be asked to specify a reason. Mute user Mute or unmute user on server. Unmuting a deafened user will also undeafen them. Kick and ban user (with reason) Kick and ban selected user from server. You'll be asked to specify a reason. Deafen user Deafen or undeafen user on server. Deafening a user will also mute them. Mute user locally Mute or unmute user locally. Use this on other users in the same room. This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. &Unlink Channel Unlink your channel from another channel This unlinks your current channel from the selected channel. Unlinks your channel from all linked channels. This unlinks your current channel (not the selected one) from all linked channels. &Reset Reset audio preprocessor This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. &Mute Self Mute yourself Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. &Deafen Self Deafen yourself Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. &Text-To-Speech Toggle Text-To-Speech Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. Display audio statistics Pops up a small dialog with information about your current audio input. Forcibly unlink plugin This forces the current plugin to unlink, which is handy if it is reading completely wrong data. Configure Mumble Allows you to change most settings for Mumble. Start the audio configuration wizard This will guide you through the process of configuring your audio hardware. &What's This? Enter What's This? mode Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. Information about Mumble Shows a small dialog with information and license for Mumble. Information about Speex Shows a small dialog with information about Speex. Information about Qt Shows a small dialog with information about Qt. Check for &Updates Check for new version of Mumble Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. Sends a text message to all users in a channel. Configure certificates for strong authentication This starts the wizard for creating, importing and exporting certificates for authentication against servers. Register user on server This will permanently register the user on the server. Add &Friend Adds a user as your friend. This will add the user as a friend, so you can recognize him on this and other servers. &Remove Friend Removes a user from your friends. This will remove a user from your friends list. &Update Friend Update name of your friend. Your friend uses a different name than what is in your database. This will update the name. Edit registered users list This opens the editor for registered users, which allow you to change their name or unregister them. Add or remove text-based access tokens &Minimal View Toggle minimal window modes This will toggle minimal mode, where the log window and menu is hidden. You muted and deafened %1. You unmuted and undeafened %1. You undeafened %1. You suppressed %1. %1 muted and deafened by %2. %1 unmuted and undeafened by %2. %1 undeafened by %2. %1 suppressed by %2. %1 moved to %2. %1 moved to %2 by %3. %1 moved in from %2 by %3. %1 is now muted and deafened. Your account information can not be verified currently. Please try again later Welcome message: %1 Mumble: %1 You were denied %1 privileges in %2. %3 was denied %1 privileges in %2. Denied: Cannot modify SuperUser. Denied: Invalid channel name. Denied: Text message too long. Denied: Operation not permitted in temporary channel. You need a certificate to perform this operation. %1 does not have a certificate. Invalid username: %1. Invalid username. Channel is full. Channel nesting limit reached. Channel count limit reached. Need to delete channels before creating new ones. Permission denied. %1 connected and entered channel. %1 connected. %1 is now muted. %1 is now unmuted. Recording started Recording stopped %1 started recording. %1 stopped recording. You revoked your priority speaker status. You assumed priority speaker status. %1 revoked your priority speaker status. %1 gave you priority speaker status. You revoked priority speaker status for %1. You gave priority speaker status to %1. %1 revoked own priority speaker status. %1 assumed priority speaker status. %1 revoked priority speaker status for %2. %1 gave priority speaker status to %2. You were unmuted and undeafened by %1. You were muted by %1. You were undeafened by %1. You were suppressed. You were suppressed by %1. You were unsuppressed. You were unsuppressed by %1. You joined %1. You moved %1 to %2. %1 is recording %1 renamed to %2 by %3. %1 disconnected. Server message from (Tree) (Channel) (Private) %2%1: %3 Failed to load Opus, it will not be available for audio encoding/decoding. The server requests minimum client version %1 The server requests positional audio be enabled. The server requests positional audio be disabled. The server requests Push-to-Talk be enabled. The server requests Push-to-Talk be disabled. You were unmuted by %1. You muted %1. You unsuppressed %1. You unmuted %1. %1 muted by %2. %1 unsuppressed by %2. %1 unmuted by %2. Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. You were muted and deafened by %1. You were deafened by %1. You were kicked from the server by %1: %2. %3 was kicked from the server by %1: %2. You were kicked and banned from the server by %1: %2. %3 was kicked and banned from the server by %1: %2. You were moved to %1 by %2. %1 entered channel. Server connection rejected: %1. Denied: %1. %1 renamed to %2. %1 left channel and disconnected. Message from %1 You have User Dragging set to "Do Nothing" so the user wasn't moved. You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. Unknown Channel Drag mode in UserModel::dropMimeData. Remote controlling Mumble: Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) -jn, --jackname Set custom Jack client name. --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status Invocation Error: No RPC command specified RPC Welcome to Mumble. Skipping version check in debug mode. Hide Frame Toggle showing frame on minimal window This will toggle whether the minimal window should have a frame for moving and resizing. &Unlink All Reset the comment of the selected user. &Join Channel View comment in editor Query server for connection information for user S&erver &Self &Unlink Plugins Register yourself on the server Change your avatar image on this server &Remove Avatar Remove currently defined avatar image. Icon Toolbar Change your own comment Recording Priority Speaker &Copy URL Copies a link to this channel to the clipboard. Ignore Messages Locally ignore user's text chat messages. Silently drops all text messages from the user. Edit ban list on server This lets you edit the server-side IP ban list. &Filter on/off Toggle the channel filter (Ctrl+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. Ctrl+F &Hide Channel when Filtering Reset the avatar of the selected user. Locally adjust the user's speech volume. Opens a dialog with a volume slider. Use this on other users in the same room. &Developer &Hide Mumble Hides the main Mumble window. Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. Show the Developer Console Shows the Mumble Developer Console, where Mumble's log output can be inspected. &Connect... &Ban list... &Information... &Kick... &Ban... Local Volume Adjustment... Send &Message... &Add... &Remove... &Edit... Audio S&tatistics... &Settings... &Audio Wizard... Developer &Console... &About... About &Speex... About &Qt... &Certificate Wizard... &Register... Registered &Users... Change &Avatar... &Access Tokens... Reset &Comment... Reset &Avatar... View Comment... &Change Comment... R&egister... Show Shows the main Mumble window. Manual Manual Mumble Positional Audio Position X Y Z m Heading Azimuth Elevation ° Meta data Context Identity Set State Linked Activated Unhinge NetworkConfig Network Updates are mandatory when using snapshot releases. Connection Use TCP compatibility mode Use TCP compatability mode <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). Reconnect when disconnected <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. Reconnect automatically Proxy Type Type of proxy to connect through Direct connection HTTP(S) proxy SOCKS5 proxy Hostname Hostname of the proxy Force TCP mode Enable QoS to prioritize packets This will enable QoS, which will attempt to prioritize voice packets over other traffic. Use Quality of Service Don't send certificate to server and don't save passwords. (Not saved). <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> Suppress certificate and password storage <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. Port Port number of the proxy <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. Username Username for proxy authentication <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Password Password for proxy authentication <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Mumble services Check for new releases of Mumble automatically. This will check for new releases of Mumble every time you start the program, and notify you if one is available. Check for application updates on startup Check for new releases of plugins automatically. This will check for new releases of plugins every time you start the program, and download them automatically. <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. Submit anonymous statistics to the Mumble project Submit anonymous statistics Reconnect to last used server when starting Mumble Reconnect to last server on startup Download plugin and overlay updates on startup Privacy Prevent OS information being sent to Mumble servers and web servers <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. Do not send OS information to Mumble servers and web servers Overlay Silent Talking Whisper Shout Channel Failed to create communication with overlay at %2: %1. No overlay will be available. OverlayClient Filter Only talking Talking and recently active All in current channel All in linked channels Always show yourself Configure recently active time (%1 seconds)... Columns Sort Alphabetically Last state change Edit... Reset Zoom Configure recently active time Amount of seconds users remain active after talking: OverlayConfig To move the users, drag the little red dot. To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. For more options, right click a user. For more options, rightclick a user. Launcher Filter Overlay Choose executable Choose application Choose path Load Overlay Presets Mumble overlay presets (*.mumblelay) Save Overlay Presets Options Enable overlay. Enable Overlay This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. Layout Blacklist Whitelist Uninstall Overlay Overlay Installation Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. Install Mumble Overlay Overlay Upgrade Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. Upgrade Mumble Overlay Display a frame counter in the overlay Show FPS counter Load an overlay preset from file Load… Save your overlay settings to file Save… Set the overlay font. Set the overlay text color. Color Remove Font FPS and Clock Display Display a clock in the overlay showing the current local time (system time). Show Clock Overlay Exceptions Overlay Exception Mode Allowed launchers Add Allowed programs Allowed paths Blacklisted programs OverlayEditor State User is not talking Passive User is talking in your channel or a linked channel Talking User is whispering to you privately Private Whisper User is shouting to your channel Channel Whisper Zoom Zoom Factor Enabled Elements User avatar, chosen by each user Avatar User's name Username Name of user's channel, if outside your current channel Channel Muted or deafened Mute state Bounding box, automatically shrunk to minimum size to contain all visible elements Bounding box Overlay Editor OverlayEditorScene Layout preset Large square avatar Avatar and Name User Opacity %1% Object Opacity Alignment Left Center Right Top Bottom Color... Font... Bounding box Pen width Padding Pen color Fill color Pick pen color Pick fill color Pick color Pick font PluginConfig Plugins Plugin has no configure function. Plugin has no about function. Options Enable plugins and transmit positional information This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. Link to Game and Transmit Position Reloads all plugins This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. &Reload plugins Information about plugin This shows a small information message about the plugin. &About Show configuration page of plugin This shows the configuration page of the plugin, if any. &Configure Name Enabled Plugins Skipping plugin update in debug mode. Downloaded new or updated plugin to %1. Failed to install new plugin to %1. %1 lost link. %1 linked. PortAudioSystem Default Device PulseAudioSystem Default Input Default Output QApplication Failed to restart mumble Mumble failed to restart itself. Please restart it manually. RichTextEditor Failed to load image Image file too large to embed in document. Please use images smaller than %1 kB. Message is too long. Display Source Text &Bold Ctrl+B &Italic Italic Ctrl+I Underline Ctrl+U Color Insert Link Ctrl+L Insert Image RichTextEditorLink Add Link URL Text ServerHandler Unable to resolve hostname Server is not responding to TCP pings UDP packets cannot be sent to or received from the server. Switching to TCP mode. UDP packets cannot be sent to the server. Switching to TCP mode. UDP packets cannot be received from the server. Switching to TCP mode. UDP packets can be sent to and received from the server. Switching back to UDP mode. Connection timed out ServerView Favorite LAN Public Internet Unknown Africa Asia North America South America Europe Oceania ShortcutActionWidget Unassigned ShortcutDelegate On Off Toggle Unassigned ShortcutKeyWidget Press Shortcut ShortcutTargetDialog Root Parent Current Subchannel #%1 ShortcutTargetWidget ... , Root Parent Current Subchannel #%1 Invalid Empty <Empty> ShortcutToggleWidget Off Toggle On TextMessage Enter text If checked the message is recursively sent to all subchannels Send recursively to subchannels Tokens Empty Token Mumble - Access Tokens List of access tokens on current server <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. Add a token &Add Remove a token &Remove UserEdit Registered Users Remove Rename Who are you looking for? Days Weeks Months Years Inactive for Registered users: %n account(s) UserInformation User Information Connection Information Version OS Certificate IP Address CELT Versions Details... Ping Statistics Pings received Average ping TCP (Control) UDP (Voice) UDP Network statistics Good Late Lost Resync From Client To Client Connection time %1w %1d %1h %1m %1s , %1 (%2) %1.%2.%3 (%4) Supported Not Supported Not Reported %1 online (%2 idle) %1 online %1 kbit/s Bandwidth GroupBox Bandwidth Label Ping deviation UserListModel Nick Inactive days Last channel Last seen: %1 Never Channel ID: %1 UserLocalVolumeDialog Local volume for other users <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. Adjusting local volume for %1 dB <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: Talking to your channel. Shouting directly to your channel. Whispering directly to your channel. Whispering directly to you. Not talking. This is a channel on the server. The icon indicates the state of the channel: Your current channel. A channel that is linked with your channel. Linked channels can talk to each other. A channel on the server that you are not linked to. This shows the flags the user has on the server, if any: On your friend list Authenticated user Muted (manually muted by self) Muted (manually muted by admin) Muted (not allowed to speak in current channel) Muted (muted by you, only on your machine) Muted (push-to-mute) Deafened (by self) Deafened (by admin) User has a new comment set (click to show) User has a comment set, which you've already seen. (click to show) Ignoring Text Messages This shows the flags the channel has, if any: Channel has a new comment set (click to show) Channel has a comment set, which you've already seen. (click to show) Channel will be hidden when filtering is enabled Name Flags Are you sure you want to drag this user? Are you sure you want to drag this channel? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. VersionCheck Upgrade Mumble A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? Failed to launch snapshot installer. Corrupt download of new version detected. Automatically removed. Downloading new snapshot from %1 to %2 Failed to write new version to disk. Failed to write new version to disc. Mumble failed to retrieve version information from the central server. ViewCert Certificate Chain Details Certificate chain Certificate details Common Name Organization Subunit Country Locality State Valid from: %1 Valid to: %1 Serial: %1 Public Key: %1 bits %2 RSA DSA Digest (SHA-1): %1 Digest (SHA-256): %1 Email: %1 DNS: %1 Issued by: Unit Name VoiceRecorder Recorder failed to create directory '%1' Recorder failed to open file '%1' .wav - Uncompressed .ogg (Vorbis) - Compressed .au - Uncompressed .flac - Lossless compressed VoiceRecorderDialog Recorder Control 00:00:00 &Start S&top Mode Multichannel Output Output format Target directory Filename &Browse... Valid variables are: Inserts the user's name Inserts the current date Inserts the current time Inserts the hostname Recorder still running Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? Unable to start recording. Not connected to a server. The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. There is already a recorder active for this server. Please select a recording format. Stopping Select target directory Downmix WASAPIInput Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone. WASAPISystem Default Device qwPTTButtonWidget Mumble PTT Push to talk mumble-1.3.4/src/mumble/mumble_uk.ts0000664000175000017500000115465314010707274017261 0ustar builderbuilder ACLEditor Deny Відкинути Allow Прийняти Allow %1 Прийняти %1 Deny %1 Відхилити %1 Mumble - Add channel Mumble - Додати канал Default server value Типовий сервер Failed: Invalid channel Невдача: Невірний канал Mumble - Edit %1 Mumble - Редагувати %1 ID: %1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Channel must have a name Необхідно вказати ім'я каналу This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Dialog Діалог Name Ім'я Enter the channel name here. Введіть ім'я каналу. Description Опис Password Пароль Enter the channel password here. Введіть пароль каналу. Check to create a temporary channel. Відмітити для створення тимчасового каналу. Temporary Тимчасовий <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. Position Посада &Groups Гру&пи Group Група List of groups Перелік груп Remove selected group Видалити обрану групу Remove Видалити Inherit group members from parent Успадкувати членів від батьківської групи Inherit Успадкувати Make group inheritable to sub-channels Зробити групу успадковуємою підгрупами Inheritable Успадковуєма Group was inherited from parent channel Групу було успадковано від батьківського каналу Inherited Успадковано Members Члени Add Додати Add member to group Додати члена до групи Remove member from group Прибрати члена з групи &ACL Списки контролю доступу (&Ф) Active ACLs Активні списки доступу List of entries Перелік записів Inherit ACL of parent? Успадкувати списки контролю доступу? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. Inherit ACLs Успадкувати списки контролю доступу Move entry up Перемістити запис вище This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. &Up В&гору Move entry down Перемістити запис нижче This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. &Down &Вниз Add new entry Додати запис This adds a new entry, initially set with no permissions and applying to all. &Add Додати Remove entry Видалити запис This removes the currently selected entry. Видалити обраний запис. &Remove &Видалити Context Контекст Entry should apply to this channel. Entry should apply to this channel This makes the entry apply to this channel. Applies to this channel Entry should apply to sub-channels. Add new group Додати нову групу <b>Add</b><br/> Add a new group. Inherited members Успадкувати членів Contains the list of members added to the group by this channel. Contains a list of members whose group membership will not be inherited from the parent channel. Contains the list of members inherited by other channels. Type in the name of a user you wish to add to the group and click Add. Введіть ім'я користувача, якого ви бажажте додати до групи, та натисніть кнопку Додати. Type in the name of a user you wish to remove from the group and click Add. Введіть ім'я користувача, якого ви бажажте видалити з групи, та натисніть кнопку Додати. Exclude Виключити Excluded members Виключити членів This makes the entry apply to sub-channels of this channel. Applies to sub-channels Permissions Дозволи User/Group Користувач/Група Group this entry applies to User ID ID Користувача User this entry applies to This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. &Properties Властивості <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. ID of the channel. ID каналу. Maximum Users Максимальна кількість користувачів Maximum number of users allowed in the channel Максимально допустима кількість користувачів на каналі <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. This is the sort order for the channel. ALSAAudioInput Default ALSA Card Opening chosen ALSA Input failed: %1 ALSAAudioOutput Default ALSA Card Opening chosen ALSA Output failed: %1 ASIOConfig %1 (version %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz ASIO Initialization failed: %1 Failed to instantiate ASIO driver ASIO Device selection Device Device to use for microphone This chooses what device to query. You still need to actually query the device and select which channels to use. Query selected device This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Query Configure selected device This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Configure Capabilities Driver name Buffer size This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. Configure input channels Channels Канали Microphone Мікрофон <- <- -> -> Unused Speakers Колонки ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. Opening selected ASIO device failed. No input will be done. AboutDialog About Mumble Про Mumble <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble Про Mumble &License Ліцензія A&uthors &Third-Party Licenses OK Гаразд AudioInput Interface Інтерфейс System Система Input method for audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Пристрій Input device for audio <b>This is the input device to use for audio.</b> Transmission Передача &Transmit П&ередати When to transmit your speech Коли передавати голос <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. DoublePush Time If you press the PTT key twice in this time it will get locked. <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. Reset audio cue to default <b>Reset</b><br/>Reset the paths for the files to their default. Browse for on audio file Browse for off audio file Off Вимкнено On Ввімкнено Preview the audio cues Use SNR based speech detection Signal to Noise <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. Amplitude Амплітуда Voice &Hold Зат&римка голосу How long to keep transmitting after silence Silence Below Тиша нижче ніж <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. Speech Above Голос вище ніж Signal values above this count as voice Compression Стиснення &Quality Якість Quality of compression (peak bandwidth) Якість стиснення (пікова пропускна здатність) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. Audio per packet How many audio frames to send per packet <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). Audio Processing Обробка звуку Noise Suppression Подавлення шумів Noise suppression Подавлення шумів <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. Maximum amplification of input sound Максимальне підсилення вхідного звуку <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. Current speech detection chance Cancel echo from speakers Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. Disabled Вимкнено <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal values below this count as silence Maximum bandwidth used for sending audio Use Amplitude based speech detection <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). Exclusive mode <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive R&eset &Browse... B&rowse... &Preview <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. Displays an always on top window with a push to talk button in it Display push to talk window Misc Різне Audible audio cue when starting or stopping to transmit <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. Audio cue Gets played when starting to transmit Gets played when stopping to transmit Hold Time Time the microphone stays open after the PTT key is released Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) Max. Amplification Idle action minutes do nothing deafen mute after Echo Cancellation Mixed echo cancellation Multichannel echo cancellation The idle action will be reversed upon any key or mouse button input Undo Idle action upon activity Apply RNNoise's noise suppression filter. <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. RNNoise Audio input AudioInputDialog Continuous Voice Activity Push To Talk Audio Input %1 ms Off %1 s %1 kb/s -%1 dB %1 kbit/s (Audio %2, Position %4, Overhead %3) AudioOutput Interface System Output method for audio <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Output device for audio <b>This is the output device to use for audio.</b> Positional Audio Audio Output Default &Jitter Buffer Safety margin for jitter buffer <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. Minimum distance to user before sound volume decreases This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. Volume Volume of incoming speech <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. Output Delay Amount of data to buffer The connected "speakers" are actually headphones The connected "speakers" are actually headphones. Factor for sound volume decrease Bloom Factor for sound volume increase How much should sound volume increase for sources that are really close? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Headphones Minimum Distance Maximum Distance Maximum distance, beyond which speech volume won't decrease Minimum Volume What should the volume be at the maximum distance? Loopback Test Delay Variance Variance in packet latency <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. Packet Loss Packet loss for loopback mode <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% &Loopback Desired loopback mode Attenuate applications by... Attenuation of other applications during speech <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. If checked Mumble lowers the volume of other applications while other users talk <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. while other users talk If checked Mumble lowers the volume of other applications while you talk <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. while you talk Exclusive mode, not recommended. <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive Priority Speaker If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. Attenuate other users while talking as Priority Speaker. Advanced Attenuation Options If checked, Mumble will only attenuate applications that are using the same output source as Mumble <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. Only attenuate applications using the same output device If checked, PulseAudio loopback modules will be attenuated <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. Attenuate PulseAudio loopback modules Audio output AudioOutputDialog None Local Server Audio Output %1 ms %1 % %1 m AudioOutputSample Choose sound file Invalid sound file The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. AudioStats >1000 ms >1000ms Audio Statistics Input Levels Peak microphone level Peak power in last frame This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. Peak speaker level This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. Peak clean level This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. Signal Analysis Microphone power How close the current input level is to ideal This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. Signal-To-Noise ratio Signal-To-Noise ratio from the microphone This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. Speech Probability Probability of speech This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). Configuration feedback Current audio bitrate Bitrate of last frame DoublePush interval Time between last two Push-To-Talk presses Speech Detection Current speech detection chance <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal and noise power spectrum Power spectrum of input signal and noise estimate This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. Echo Analysis Weights of the echo canceller This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. AudioWizard Audio Tuning Wizard Introduction Welcome to the Mumble Audio Wizard Finished Enjoy using Mumble Device selection Selecting the input and output device to use with Mumble. This is the device your microphone is connected to. System Input method for audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Input device to use <b>Selects which sound card to use for audio input.</b> Cancel echo from headset or speakers Use echo cancellation This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. This is the device your speakers or headphones are connected to. Output method for audio <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. Output device to use <b>Selects which sound card to use for audio Output.</b> Enable positional audio Allows positioning of sound Allows positioning of sound. <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> Input Device Output Device This allows Mumble to use positional audio to place voices. <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> Amount of data to buffer This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> Positional Audio Adjusting attenuation of positional audio. <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> Use headphones instead of speakers <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> Use headphones This ignores the OS speaker configuration and configures the positioning for headphones instead. Volume tuning Tuning microphone hardware volume to optimal settings. Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. Voice Activity Detection Letting Mumble figure out when you're talking and when you're silent. This will help Mumble figure out when you are talking. The first step is selecting which data value to use. Raw amplitude from input Signal-To-Noise ratio Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Device tuning Changing hardware output delays to their minimum value. Submit anonymous statistics to the Mumble project Push To Talk: Quality & Notifications Adjust quality and notification settings. Quality settings Low Balanced Notification settings Use Text-To-Speech to read notifications and messages to you. Disable Text-To-Speech and use sounds instead. %1 ms Enables attenuation of other applications while users talk to you Attenuate applications while other users talk High Custom You already set a customized quality configuration in Mumble. Select this setting to keep it. Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. Apply some high contrast optimizations for visually impaired users Use high contrast graphics Keep custom Text-To-Speech settings. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) BanEditor Mumble - Edit Bans &Address &Mask Reason Start End User Hash &Add &Update &Remove Ban List Search field This is the search field. Use it to find bans that have this username set in the username field. Who are you looking for? No nickname IP address No IP address Reason for the ban No reason Ban end date Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). Certificate hash No certificate hash Banned users This is a list with banned users. Use this button if you want to add a new ban. Use this button if you want to update ban information. Use this button if you want to remove user from the ban list. Clear all fields This button clears all fields. Use it if you want to add a new ban. Clear Ban List - %n Ban(s) CertView Name Email Issuer Expiry Date (none) Self-signed CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. There was an error generating your certificate.<br />Please try again. Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. The file could not be opened for writing. Please use another file. The file's permissions could not be set. No certificate and key has been written. Please use another file. The file could not be written successfully. Please use another file. The file could not be opened for reading. Please use another file. The file is empty or could not be read. Please use another file. The file did not contain a valid certificate and key. Please use another file. Select file to export certificate to Select file to import certificate from Unable to import. Missing password or incompatible file type. <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. Certificates Certificate Management Certificate Authentication Authenticating to servers without using passwords Current certificate This is the certificate Mumble currently uses. Current Certificate Create a new certificate This will create a new certificate. Import certificate from file This will import a certificate from file. Import a certificate Export Certificate This will export a certificate to file. Export current certificate Import Certificate PKCS #12 Certificate import <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> Import from Filename to import from This is the filename you wish to import a certificate from. Select file to import from This opens a file selection dialog to choose a file to import a certificate from. Open... Password Password for PKCS#12 file This is the password for the PKCS#12 file containing your certificate. Certificate to import This is the certificate you are importing. Certificate Details Replace Certificate Replace existing certificate with new certificate? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> This is the certificate Mumble currently uses. It will be replaced. New certificate This is the new certificate that will replace the old one. New Certificate Make a backup of your certificate Export to Filename to export to This is the filename you wish to export a certificate to. Save As... This is the certificate Mumble currently uses. It will be exported. Generate a new certificate for strong authentication <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> Name Email Your email address (e.g. johndoe@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. Your name (e.g. John Doe) This is your name, and will be filled out in the certificate. This field is entirely optional. Finish Certificate-based authentication is ready for use Enjoy using Mumble with strong authentication. Automatic certificate creation <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> ChanACL None Traverse Enter Speak Mute/Deafen Make channel Make temporary Link channel This represents no privileges. This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. This represents the permission to write text messages to other users in this channel. This represents the permission to forcibly remove users from the server. This represents the permission to permanently remove users from the server. This represents the permission to register and unregister users on the server. This represents the permission to register oneself on the server. Whisper Move Text message Kick Ban Register User Register Self Write ACL ChatbarTextEdit Paste and &Send Paste and send <center>Type chat message here</center> ClientUser Friend Authenticated Priority speaker Recording Muted (server) Deafened (server) Local Ignore (Text messages) Local Mute Muted (self) Deafened (self) ConfigDialog Accept changes This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. Reject changes This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. Apply changes This button will immediately apply all changes. Undo changes for current page This button will revert any changes done on the current page to the most recent applied settings. Restore defaults for current page This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. Mumble Configuration ConnectDialog Connecting to %1 Enter username Adding host %1 Servername Hostname Bonjour name Port Порт Addresses Website Веб-сайт Packet loss Ping (80%) %1 ms Ping (95%) Bandwidth %1 kbit/s &Connect &Filters Unknown Users Version Failed to fetch server list Mumble Server Connect Ping Remove from Favorites Add custom server Show all servers that respond to ping Show all servers with users Show all servers Показати всі сервери &Copy &Копіювати Copy favorite link to clipboard &Paste Paste favorite from clipboard &Edit... &Редагувати... &Add New... Add to &Favorites Open &Webpage Show &Reachable Show &Populated Show &All ConnectDialogEdit Edit Server Name of the server A&ddress Internet address of the server. Internet address of the server. <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. &Port Port on which the server is listening <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. &Username Username to send to the server <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. Label Add Server You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 Password Password to send to the server <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. Show password <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. Local server label 127.0.0.1 64738 Your username Your password &Fill CoreAudioSystem Default Device CrashReporter Mumble Crash Report <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> Email address (optional) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash Send Report Don't send report Crash upload successful Thank you for helping make Mumble better! Crash upload failed We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 Uploading crash report Abort upload DXAudioInput Default DirectSound Voice Input Opening chosen DirectSound Input device failed. No microphone capture will be done. Opening chosen DirectSound Input failed. Default device will be used. Lost DirectSound input device. DXAudioOutput Default DirectSound Voice Output Opening chosen DirectSound Output failed. Default device will be used. Lost DirectSound output device. Opening chosen DirectSound Output failed. No audio will be heard. Database Mumble failed to initialize a database in any of the possible locations. The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. DeveloperConsole Developer Console DockTitleBar Drag here GlobalShortcut Shortcuts List of configured shortcuts Function Data Shortcut Suppress Add new shortcut This will add a new global shortcut &Add Remove selected shortcut This will permanently remove a selected shortcut. &Remove <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> Open Accessibility Preferences Skip Enable Global Shortcuts <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. Additional Shortcut Engines <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. Enable Windows hooks <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. Enable GKey <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. Enable XInput <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. Enable shortcuts in privileged applications GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> Shortcuts Shortcut button combination. <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. Suppress keys from other applications <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. GlobalShortcutTarget Whisper Target Whisper to list of Users Channel Target Restrict to Group If specified, only members of this group will receive the whisper. List of users Add Remove Modifiers Do not send positional audio information when using this whisper shortcut. Ignore positional audio Shout to Linked channels Shout to subchannels Shout to Channel The whisper will also be transmitted to linked channels. The whisper will also be sent to the subchannels of the channel target. GlobalShortcutX Mouse %1 JackAudioSystem Hardware Ports Mono Stereo LCD Not connected LCDConfig Enable this device LCD Devices Name <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> Size Enabled Views Minimum Column Width <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> This setting decides the width of column splitter. Splitter Width Log Debug Critical Warning Information Server Connected Server Disconnected Other self-muted/deafened Permission Denied Text Message User Joined Server User Left Server User recording state changed User kicked (you or by you) User kicked You self-muted User muted (you) User muted (by you) User muted (other) User Joined Channel User Left Channel You self-unmuted You self-deafened You self-undeafened User renamed You Joined Channel You Joined Channel (moved) User connected and entered channel User left channel and disconnected Private text message the server [[ Invalid size ]] [[ Text object too large to display ]] [Date changed to %1] link to %1 FTP link to %1 player link channel link %1 link LogConfig Toggle console for %1 events Toggle pop-up notifications for %1 events Toggle Text-To-Speech for %1 events Click here to toggle sound notification for %1 events Toggle window highlight (if not active) for %1 events Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. Messages Message Console Notification Text-To-Speech Soundfile Path Text To Speech Volume Volume of Text-To-Speech Engine <b>This is the volume used for the speech synthesis.</b> Length threshold Message length threshold for Text-To-Speech Engine <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. Characters Whisper If checked you will only hear whispers from users you added to your friend list. Only accept whispers from friends If enabled text messages you send will be read back to you with TTS Read back own messages Chat Log Maximum chat length Unlimited Lines Highlight LookConfig System default None Only with users All Ask Do Nothing Move <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory User Interface This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. List users above subchannels (requires restart). <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. Users above Channels <b>If set, will verify you want to quit if connected.</b> Show number of users in each channel Show channel user count Language Language to use (requires restart) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. Look and Feel Layout Classic Stacked Hybrid Custom This changes the behavior when moving channels. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. Expand When to automatically expand channels Channel Dragging Ask whether to close or minimize when quitting Mumble. Ask on quit while connected Always On Top <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> Hide in tray when minimized Hide the main Mumble window in the tray when it is minimized. This setting controls when the application will be always on top. Never Always In minimal view In normal view Displays talking status in system tray Show talking status in tray icon This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. Show context menu in menu bar Apply some high contrast optimizations for visually impaired users Optimize for high contrast Application Adds user and channel context menus into the menu bar Tray Icon Channel Tree Use selected item as the chat bar target Filter automatically hides empty channels Show transmit mode dropdown in toolbar Theme Theme to use to style the user interface <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. User Dragging This changes the behavior when moving users. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. Enable Developer menu When in custom layout mode, checking this disables rearranging. Lock layout MainWindow Root Push-to-Talk Global Shortcut Push and hold this button to send voice. Global Shortcut This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut Reset Audio Processor Global Shortcut Unlink Plugin Global Shortcut Push-to-Mute Global Shortcut Join Channel Global Shortcut Toggle Overlay Global Shortcut Toggle state of in-game overlay. Global Shortcut Toggle Minimal Global Shortcut Volume Up (+10%) Global Shortcut Volume Down (-10%) Global Shortcut Mumble Mumble -- %1 &Window Minimize Ctrl+M Close Mumble is currently connected to a server. Do you want to Close or Minimize it? Mute Self Global Shortcut Set self-mute status. Global Shortcut This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut Deafen Self Global Shortcut Set self-deafen status. Global Shortcut This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut Whisper/Shout Whisper <center>Not connected</center> Not connected Clear Opening URL %1 File does not exist File is not a configuration file. Settings merged from file. URL scheme is not 'mumble' This version of Mumble can't handle URLs for Mumble version %1.%2.%3 Connecting to %1 Enter username Connecting to server %1. Reconnecting. Transmit Mode set to Continuous <p>%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> Register yourself as %1 <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <h2>Version</h2><p>Protocol %1</p> <p>No build information or OS version available</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) The connection is secured by the cipher suite that OpenSSL identifies as %1 <p>The connection provides perfect forward secrecy</p> <p>The connection does not provide perfect forward secrecy</p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> Voice channel is sent over control channel Register user %1 <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> Kicking user %1 Banning user %1 View comment on user %1 Message to channel %1 Connected. <li>Expected certificate digest (SHA-1): %1</li> Server presented a certificate which failed verification. <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> SSL Version mismatch Server connection failed. <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>Type message to user '%1' here</center> Type message to user '%1' here Choose image file Failed to load image Could not open file for reading. Image format not recognized. &User &Channel Use in conjunction with Whisper to. Global Shortcut This will switch the states of the in-game overlay. Global Shortcut Link Channel Global Shortcut Cycle Transmit Mode Global Shortcut Set Transmit Mode to Push-To-Talk Global Shortcut Set Transmit Mode to Continuous Global Shortcut Set Transmit Mode to VAD Global Shortcut Send Text Message Global Shortcut Send Clipboard Text Message Global Shortcut This will send your Clipboard content to the channel you are currently in. Global Shortcut Continuous Voice Activity Push-to-Talk Mumble - Minimal View -- %1 Cancel Save Image As... Save Image File Could not save image: %1 Change your comment Transmit Mode set to Voice Activity Transmit Mode set to Push-to-Talk <p>Connected users: %1/%2</p> UDP Statistics To Server From Server Good Late Lost Resync <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> Mumble Server Information &View Certificate Enter reason Sending message to %1 To %1: %2 Message to %1 Are you sure you want to reset the comment of user %1? Are you sure you want to reset the avatar of user %1? Are you sure you want to delete %1 and all its sub-channels? Sending message to channel %1 Message to tree %1 To %1 (Tree): %2 (Tree) %1: %2 Unmuted and undeafened. Unmuted. Muted. Muted and deafened. Deafened. Undeafened. Restart Mumble? Some settings will only apply after a restart of Mumble. Restart Mumble now? About Qt SSL Verification failed: %1 <li>Server certificate digest (SHA-1): %1</li> <b>WARNING:</b> The server presented a certificate that was different from the stored one. This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. Server connection failed: %1. Disconnected from server. Invalid username You connected with an invalid username, please try another one. Username in use That username is already in use, please try another username. Wrong certificate or password Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. Wrong password Wrong server password for unregistered user account, please try again. Images (*.png *.jpg *.jpeg) C&onfigure &Help Log This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. &Quit Mumble Closes the program Exits the application. Ctrl+Q Open the server connection dialog &Disconnect Disconnect from server Disconnects you from the server. Show information about the server connection This will show extended information about the connection to the server. &Mute &Deafen &Local Mute Send a Text Message Sends a text message to another user. Add new channel This adds a new sub-channel to the currently selected channel. Remove channel This removes a channel and all sub-channels. Edit Groups and ACL for channel This opens the Group and ACL dialog for the channel, to control permissions. &Link Link your channel to another channel This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. Chatbar Shows a dialog of registered servers, and also allows quick-connect. Kick user (with reason) Kick selected user off server. You'll be asked to specify a reason. Mute user Mute or unmute user on server. Unmuting a deafened user will also undeafen them. Kick and ban user (with reason) Kick and ban selected user from server. You'll be asked to specify a reason. Deafen user Deafen or undeafen user on server. Deafening a user will also mute them. Mute user locally Mute or unmute user locally. Use this on other users in the same room. This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. &Unlink Channel Unlink your channel from another channel This unlinks your current channel from the selected channel. Unlinks your channel from all linked channels. This unlinks your current channel (not the selected one) from all linked channels. &Reset Reset audio preprocessor This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. &Mute Self Mute yourself Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. &Deafen Self Deafen yourself Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. &Text-To-Speech Toggle Text-To-Speech Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. Display audio statistics Pops up a small dialog with information about your current audio input. Forcibly unlink plugin This forces the current plugin to unlink, which is handy if it is reading completely wrong data. Configure Mumble Allows you to change most settings for Mumble. Start the audio configuration wizard This will guide you through the process of configuring your audio hardware. &What's This? Enter What's This? mode Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. Information about Mumble Shows a small dialog with information and license for Mumble. Information about Speex Shows a small dialog with information about Speex. Information about Qt Shows a small dialog with information about Qt. Check for &Updates Check for new version of Mumble Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. Sends a text message to all users in a channel. Configure certificates for strong authentication This starts the wizard for creating, importing and exporting certificates for authentication against servers. Register user on server This will permanently register the user on the server. Add &Friend Adds a user as your friend. This will add the user as a friend, so you can recognize him on this and other servers. &Remove Friend Removes a user from your friends. This will remove a user from your friends list. &Update Friend Update name of your friend. Your friend uses a different name than what is in your database. This will update the name. Edit registered users list This opens the editor for registered users, which allow you to change their name or unregister them. Add or remove text-based access tokens &Minimal View Toggle minimal window modes This will toggle minimal mode, where the log window and menu is hidden. You muted and deafened %1. You unmuted and undeafened %1. You undeafened %1. You suppressed %1. %1 muted and deafened by %2. %1 unmuted and undeafened by %2. %1 undeafened by %2. %1 suppressed by %2. %1 moved to %2. %1 moved to %2 by %3. %1 moved in from %2 by %3. %1 is now muted and deafened. Your account information can not be verified currently. Please try again later Welcome message: %1 Mumble: %1 You were denied %1 privileges in %2. %3 was denied %1 privileges in %2. Denied: Cannot modify SuperUser. Denied: Invalid channel name. Denied: Text message too long. Denied: Operation not permitted in temporary channel. You need a certificate to perform this operation. %1 does not have a certificate. Invalid username: %1. Invalid username. Невірне ім'я користувача. Channel is full. Channel nesting limit reached. Channel count limit reached. Need to delete channels before creating new ones. Permission denied. %1 connected and entered channel. %1 connected. %1 is now muted. %1 is now unmuted. Recording started Запис розпочато Recording stopped Запис завершено %1 started recording. %1 stopped recording. You revoked your priority speaker status. You assumed priority speaker status. %1 revoked your priority speaker status. %1 gave you priority speaker status. You revoked priority speaker status for %1. You gave priority speaker status to %1. %1 revoked own priority speaker status. %1 assumed priority speaker status. %1 revoked priority speaker status for %2. %1 gave priority speaker status to %2. You were unmuted and undeafened by %1. You were muted by %1. You were undeafened by %1. You were suppressed. You were suppressed by %1. You were unsuppressed. You were unsuppressed by %1. You joined %1. You moved %1 to %2. %1 is recording %1 renamed to %2 by %3. %1 disconnected. Server message from (Tree) (Channel) (Private) %2%1: %3 Failed to load Opus, it will not be available for audio encoding/decoding. The server requests minimum client version %1 The server requests positional audio be enabled. The server requests positional audio be disabled. The server requests Push-to-Talk be enabled. The server requests Push-to-Talk be disabled. You were unmuted by %1. You muted %1. You unsuppressed %1. You unmuted %1. %1 muted by %2. %1 unsuppressed by %2. %1 unmuted by %2. Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. You were muted and deafened by %1. You were deafened by %1. You were kicked from the server by %1: %2. %3 was kicked from the server by %1: %2. You were kicked and banned from the server by %1: %2. %3 was kicked and banned from the server by %1: %2. You were moved to %1 by %2. %1 entered channel. Server connection rejected: %1. Denied: %1. %1 renamed to %2. %1 left channel and disconnected. Message from %1 You have User Dragging set to "Do Nothing" so the user wasn't moved. You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. Unknown Channel Drag mode in UserModel::dropMimeData. Remote controlling Mumble: Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) -jn, --jackname Set custom Jack client name. --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status Invocation Error: No RPC command specified RPC Welcome to Mumble. Skipping version check in debug mode. Hide Frame Toggle showing frame on minimal window This will toggle whether the minimal window should have a frame for moving and resizing. &Unlink All Reset the comment of the selected user. &Join Channel View comment in editor Query server for connection information for user S&erver &Self &Unlink Plugins Register yourself on the server Change your avatar image on this server &Remove Avatar Remove currently defined avatar image. Icon Toolbar Change your own comment Recording Priority Speaker &Copy URL Copies a link to this channel to the clipboard. Ignore Messages Ігнорувати повідомлення Locally ignore user's text chat messages. Silently drops all text messages from the user. Edit ban list on server This lets you edit the server-side IP ban list. &Filter on/off Toggle the channel filter (Ctrl+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. Ctrl+F &Hide Channel when Filtering Reset the avatar of the selected user. Locally adjust the user's speech volume. Opens a dialog with a volume slider. Use this on other users in the same room. &Developer &Hide Mumble Hides the main Mumble window. Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. Show the Developer Console Shows the Mumble Developer Console, where Mumble's log output can be inspected. &Connect... &Ban list... &Information... &Kick... &Ban... Local Volume Adjustment... Send &Message... &Add... &Remove... &Edit... Audio S&tatistics... &Settings... &Audio Wizard... Developer &Console... &About... About &Speex... About &Qt... &Certificate Wizard... &Register... Registered &Users... Change &Avatar... &Access Tokens... Reset &Comment... Reset &Avatar... View Comment... &Change Comment... R&egister... Show Shows the main Mumble window. Manual Manual Mumble Positional Audio Position X Y Z m Heading Azimuth Elevation ° Meta data Context Identity Set State Linked Activated Unhinge NetworkConfig Network Updates are mandatory when using snapshot releases. Connection Use TCP compatibility mode Use TCP compatability mode <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). Reconnect when disconnected <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. Reconnect automatically Proxy Type Type of proxy to connect through Direct connection HTTP(S) proxy SOCKS5 proxy Hostname Hostname of the proxy Force TCP mode Enable QoS to prioritize packets This will enable QoS, which will attempt to prioritize voice packets over other traffic. Use Quality of Service Don't send certificate to server and don't save passwords. (Not saved). <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> Suppress certificate and password storage <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. Port Port number of the proxy <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. Username Username for proxy authentication <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Password Password for proxy authentication <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Mumble services Check for new releases of Mumble automatically. This will check for new releases of Mumble every time you start the program, and notify you if one is available. Check for application updates on startup Check for new releases of plugins automatically. This will check for new releases of plugins every time you start the program, and download them automatically. <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. Submit anonymous statistics to the Mumble project Submit anonymous statistics Reconnect to last used server when starting Mumble Reconnect to last server on startup Download plugin and overlay updates on startup Privacy Prevent OS information being sent to Mumble servers and web servers <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. Do not send OS information to Mumble servers and web servers Overlay Silent Talking Whisper Shout Channel Канал Failed to create communication with overlay at %2: %1. No overlay will be available. OverlayClient Filter Only talking Talking and recently active All in current channel All in linked channels Always show yourself Показувати себе завжди Configure recently active time (%1 seconds)... Columns Sort Alphabetically В алфавітному порядку Last state change Edit... Редагувати... Reset Zoom Configure recently active time Amount of seconds users remain active after talking: OverlayConfig To move the users, drag the little red dot. To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. For more options, right click a user. For more options, rightclick a user. Launcher Filter Overlay Choose executable Choose application Choose path Load Overlay Presets Mumble overlay presets (*.mumblelay) Save Overlay Presets Options Enable overlay. Enable Overlay This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. Layout Blacklist Чорний список Whitelist Білий список Uninstall Overlay Overlay Installation Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. Install Mumble Overlay Overlay Upgrade Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. Upgrade Mumble Overlay Display a frame counter in the overlay Show FPS counter Load an overlay preset from file Load… Save your overlay settings to file Save… Set the overlay font. Set the overlay text color. Color Remove Font FPS and Clock Display Display a clock in the overlay showing the current local time (system time). Show Clock Overlay Exceptions Overlay Exception Mode Allowed launchers Add Allowed programs Allowed paths Blacklisted programs OverlayEditor State User is not talking Passive User is talking in your channel or a linked channel Talking User is whispering to you privately Private Whisper User is shouting to your channel Channel Whisper Zoom Zoom Factor Enabled Elements User avatar, chosen by each user Avatar User's name Username Name of user's channel, if outside your current channel Channel Muted or deafened Mute state Bounding box, automatically shrunk to minimum size to contain all visible elements Bounding box Overlay Editor OverlayEditorScene Layout preset Large square avatar Avatar and Name User Opacity %1% Object Opacity Alignment Left Center Right Top Верх Bottom Низ Color... Колір... Font... Шрифт... Bounding box Pen width Padding Pen color Fill color Pick pen color Pick fill color Pick color Pick font PluginConfig Plugins Plugin has no configure function. Plugin has no about function. Options Enable plugins and transmit positional information This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. Link to Game and Transmit Position Reloads all plugins Перезавантажити всі плагіни This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. &Reload plugins Information about plugin This shows a small information message about the plugin. &About Show configuration page of plugin This shows the configuration page of the plugin, if any. &Configure Name Enabled Plugins Skipping plugin update in debug mode. Downloaded new or updated plugin to %1. Failed to install new plugin to %1. %1 lost link. %1 linked. PortAudioSystem Default Device PulseAudioSystem Default Input Default Output QApplication Failed to restart mumble Mumble failed to restart itself. Please restart it manually. RichTextEditor Failed to load image Image file too large to embed in document. Please use images smaller than %1 kB. Message is too long. Display Source Text &Bold Ctrl+B &Italic Italic Ctrl+I Underline Ctrl+U Color Insert Link Ctrl+L Insert Image RichTextEditorLink Add Link URL Text ServerHandler Unable to resolve hostname Server is not responding to TCP pings UDP packets cannot be sent to or received from the server. Switching to TCP mode. UDP packets cannot be sent to the server. Switching to TCP mode. UDP packets cannot be received from the server. Switching to TCP mode. UDP packets can be sent to and received from the server. Switching back to UDP mode. Connection timed out ServerView Favorite LAN Public Internet Unknown Africa Asia North America South America Europe Oceania ShortcutActionWidget Unassigned ShortcutDelegate On Off Toggle Unassigned ShortcutKeyWidget Press Shortcut ShortcutTargetDialog Root Parent Current Subchannel #%1 ShortcutTargetWidget ... , Root Parent Current Subchannel #%1 Invalid Empty <Empty> ShortcutToggleWidget Off Toggle On TextMessage Enter text If checked the message is recursively sent to all subchannels Send recursively to subchannels Tokens Empty Token Mumble - Access Tokens List of access tokens on current server <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. Add a token &Add Remove a token &Remove UserEdit Registered Users Remove Rename Who are you looking for? Days Weeks Months Years Inactive for Registered users: %n account(s) UserInformation User Information Connection Information Version OS Certificate IP Address CELT Versions Details... Ping Statistics Pings received Average ping TCP (Control) UDP (Voice) UDP Network statistics Good Late Lost Resync From Client To Client Connection time %1w %1d %1h %1m %1s , %1 (%2) %1.%2.%3 (%4) Supported Not Supported Not Reported %1 online (%2 idle) %1 online %1 kbit/s Bandwidth GroupBox Bandwidth Label Ping deviation UserListModel Nick Inactive days Last channel Last seen: %1 Never Channel ID: %1 UserLocalVolumeDialog Local volume for other users <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. Adjusting local volume for %1 dB <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: Talking to your channel. Shouting directly to your channel. Whispering directly to your channel. Whispering directly to you. Not talking. This is a channel on the server. The icon indicates the state of the channel: Your current channel. A channel that is linked with your channel. Linked channels can talk to each other. A channel on the server that you are not linked to. This shows the flags the user has on the server, if any: On your friend list Authenticated user Muted (manually muted by self) Muted (manually muted by admin) Muted (not allowed to speak in current channel) Muted (muted by you, only on your machine) Muted (push-to-mute) Deafened (by self) Deafened (by admin) User has a new comment set (click to show) User has a comment set, which you've already seen. (click to show) Ignoring Text Messages This shows the flags the channel has, if any: Channel has a new comment set (click to show) Channel has a comment set, which you've already seen. (click to show) Channel will be hidden when filtering is enabled Name Flags Are you sure you want to drag this user? Are you sure you want to drag this channel? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. VersionCheck Upgrade Mumble A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? Failed to launch snapshot installer. Corrupt download of new version detected. Automatically removed. Downloading new snapshot from %1 to %2 Failed to write new version to disk. Failed to write new version to disc. Mumble failed to retrieve version information from the central server. ViewCert Certificate Chain Details Certificate chain Certificate details Common Name Organization Subunit Country Locality State Valid from: %1 Valid to: %1 Serial: %1 Public Key: %1 bits %2 RSA DSA Digest (SHA-1): %1 Digest (SHA-256): %1 Email: %1 DNS: %1 Issued by: Unit Name VoiceRecorder Recorder failed to create directory '%1' Recorder failed to open file '%1' .wav - Uncompressed .ogg (Vorbis) - Compressed .au - Uncompressed .flac - Lossless compressed VoiceRecorderDialog Recorder Control 00:00:00 &Start S&top Mode Multichannel Output Output format Target directory Filename &Browse... Valid variables are: Inserts the user's name Inserts the current date Inserts the current time Inserts the hostname Recorder still running Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? Unable to start recording. Not connected to a server. Неможливо розпочати запис. Немає з'єднання з сервером. The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. There is already a recorder active for this server. Please select a recording format. Будь ласка, виберіть формат запису. Stopping Select target directory Downmix WASAPIInput Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone. WASAPISystem Default Device Пристрій за замовчуванням qwPTTButtonWidget Mumble PTT Push to talk Натисніть щоб говорити mumble-1.3.4/src/mumble/Global.h0000664000175000017500000000647514010707273016276 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_GLOBAL_H_ #define MUMBLE_MUMBLE_GLOBAL_H_ #include #include #include "ACL.h" #include "Settings.h" #include "Timer.h" #include "Version.h" // Global helper class to spread variables around across threads. class MainWindow; class ServerHandler; class AudioInput; class AudioOutput; class Database; class Log; class Plugins; class QSettings; class Overlay; class LCD; class BonjourClient; class OverlayClient; class CELTCodec; class OpusCodec; class LogEmitter; class DeveloperConsole; class QNetworkAccessManager; struct Global Q_DECL_FINAL { private: Q_DISABLE_COPY(Global) public: static Global *g_global_struct; MainWindow *mw; Settings s; boost::shared_ptr sh; boost::shared_ptr ai; boost::shared_ptr ao; /** * @remark Must only be accessed from the main event loop */ Database *db; Log *l; Plugins *p; QSettings *qs; Overlay *o; LCD *lcd; BonjourClient *bc; QNetworkAccessManager *nam; QSharedPointer le; DeveloperConsole *c; int iPushToTalk; Timer tDoublePush; quint64 uiDoublePush; /// Holds the current VoiceTarget ID to send audio to int iTarget; /// Holds the value of iTarget before its last change until the current /// audio-stream ends (and it has a value > 0). See the comment in /// AudioInput::flushCheck for further details on this. int iPrevTarget; bool bPushToMute; bool bCenterPosition; bool bPosTest; bool bInAudioWizard; OverlayClient *ocIntercept; int iAudioPathTime; unsigned int uiSession; ChanACL::Permissions pPermissions; int iMaxBandwidth; int iAudioBandwidth; QDir qdBasePath; QMap qmCodecs; OpusCodec *oCodec; int iCodecAlpha, iCodecBeta; bool bPreferAlpha; bool bOpus; bool bAttenuateOthers; /// If set the AudioOutput::mix will forcefully adjust the volume of all /// non-priority speakers. bool prioritySpeakerActiveOverride; bool bAllowHTML; unsigned int uiMessageLength; unsigned int uiImageLength; unsigned int uiMaxUsers; bool bQuit; bool bHappyEaster; static const char ccHappyEaster[]; Global(); ~Global(); }; // Class to handle ordered initialization of globals. // This allows the same link-time magic as used everywhere else // for globals that need an init before the GUI starts, but // after we reach main(). class DeferInit { private: Q_DISABLE_COPY(DeferInit) protected: static QMultiMap *qmDeferers; void add(int priority); public: DeferInit(int priority) { add(priority); }; DeferInit() { add(0); }; virtual ~DeferInit(); virtual void initialize() { }; virtual void destroy() { }; static void run_initializers(); static void run_destroyers(); }; /// Special exit code which causes mumble to restart itself. The outward facing return code with be 0 const int MUMBLE_EXIT_CODE_RESTART = 64738; // -Wshadow is bugged. If an inline function of a class uses a variable or // parameter named 'g', that will generate a warning even if the class header // is included long before this definition. #define g (*Global::g_global_struct) #endif mumble-1.3.4/src/mumble/Log.cpp0000664000175000017500000005523314010707273016146 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "Log.h" #include "AudioOutput.h" #include "AudioOutputSample.h" #include "Channel.h" #include "MainWindow.h" #include "NetworkConfig.h" #include "RichTextEditor.h" #include "ServerHandler.h" #include "TextToSpeech.h" // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" static ConfigWidget *LogConfigDialogNew(Settings &st) { return new LogConfig(st); } static ConfigRegistrar registrar(4000, LogConfigDialogNew); LogConfig::LogConfig(Settings &st) : ConfigWidget(st) { setupUi(this); #ifdef USE_NO_TTS qgbTTS->setDisabled(true); #endif #if QT_VERSION >= 0x050000 qtwMessages->header()->setSectionResizeMode(ColMessage, QHeaderView::Stretch); qtwMessages->header()->setSectionResizeMode(ColConsole, QHeaderView::ResizeToContents); qtwMessages->header()->setSectionResizeMode(ColNotification, QHeaderView::ResizeToContents); qtwMessages->header()->setSectionResizeMode(ColHighlight, QHeaderView::ResizeToContents); qtwMessages->header()->setSectionResizeMode(ColTTS, QHeaderView::ResizeToContents); qtwMessages->header()->setSectionResizeMode(ColStaticSound, QHeaderView::ResizeToContents); #else qtwMessages->header()->setResizeMode(ColMessage, QHeaderView::Stretch); qtwMessages->header()->setResizeMode(ColConsole, QHeaderView::ResizeToContents); qtwMessages->header()->setResizeMode(ColNotification, QHeaderView::ResizeToContents); qtwMessages->header()->setResizeMode(ColHighlight, QHeaderView::ResizeToContents); qtwMessages->header()->setResizeMode(ColTTS, QHeaderView::ResizeToContents); qtwMessages->header()->setResizeMode(ColStaticSound, QHeaderView::ResizeToContents); #endif QTreeWidgetItem *twi; for (int i = Log::firstMsgType; i <= Log::lastMsgType; ++i) { Log::MsgType t = Log::msgOrder[i]; const QString messageName = g.l->msgName(t); twi = new QTreeWidgetItem(qtwMessages); twi->setData(ColMessage, Qt::UserRole, static_cast(t)); twi->setText(ColMessage, messageName); twi->setCheckState(ColConsole, Qt::Unchecked); twi->setCheckState(ColNotification, Qt::Unchecked); twi->setCheckState(ColHighlight, Qt::Unchecked); twi->setCheckState(ColStaticSound, Qt::Unchecked); twi->setToolTip(ColConsole, tr("Toggle console for %1 events").arg(messageName)); twi->setToolTip(ColNotification, tr("Toggle pop-up notifications for %1 events").arg(messageName)); twi->setToolTip(ColHighlight, tr("Toggle window highlight (if not active) for %1 events").arg(messageName)); twi->setToolTip(ColStaticSound, tr("Click here to toggle sound notification for %1 events").arg(messageName)); twi->setToolTip(ColStaticSoundPath, tr("Path to sound file used for sound notifications in the case of %1 events
Single click to play
Double-click to change").arg(messageName)); twi->setWhatsThis(ColConsole, tr("Click here to toggle console output for %1 events.
If checked, this option makes Mumble output all %1 events in its message log.").arg(messageName)); twi->setWhatsThis(ColNotification, tr("Click here to toggle pop-up notifications for %1 events.
If checked, a notification pop-up will be created by Mumble for every %1 event.").arg(messageName)); twi->setWhatsThis(ColHighlight, tr("Click here to toggle window highlight for %1 events.
If checked, Mumble's window will be highlighted for every %1 event, if not active.").arg(messageName)); twi->setWhatsThis(ColStaticSound, tr("Click here to toggle sound notification for %1 events.
If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time.").arg(messageName)); twi->setWhatsThis(ColStaticSoundPath, tr("Path to sound file used for sound notifications in the case of %1 events.
Single click to play
Double-click to change
Ensure that sound notifications for these events are enabled or this field will not have any effect.").arg(messageName)); #ifndef USE_NO_TTS twi->setCheckState(ColTTS, Qt::Unchecked); twi->setToolTip(ColTTS, tr("Toggle Text-To-Speech for %1 events").arg(messageName)); twi->setWhatsThis(ColTTS, tr("Click here to toggle Text-To-Speech for %1 events.
If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time.").arg(messageName)); #endif } } QString LogConfig::title() const { return windowTitle(); } QIcon LogConfig::icon() const { return QIcon(QLatin1String("skin:config_msgs.png")); } void LogConfig::load(const Settings &r) { QList qlItems = qtwMessages->findItems(QString(), Qt::MatchContains); foreach(QTreeWidgetItem *i, qlItems) { Log::MsgType mt = static_cast(i->data(ColMessage, Qt::UserRole).toInt()); Settings::MessageLog ml = static_cast(r.qmMessages.value(mt)); i->setCheckState(ColConsole, (ml & Settings::LogConsole) ? Qt::Checked : Qt::Unchecked); i->setCheckState(ColNotification, (ml & Settings::LogBalloon) ? Qt::Checked : Qt::Unchecked); i->setCheckState(ColHighlight, (ml & Settings::LogHighlight) ? Qt::Checked : Qt::Unchecked); #ifndef USE_NO_TTS i->setCheckState(ColTTS, (ml & Settings::LogTTS) ? Qt::Checked : Qt::Unchecked); #endif i->setCheckState(ColStaticSound, (ml & Settings::LogSoundfile) ? Qt::Checked : Qt::Unchecked); i->setText(ColStaticSoundPath, r.qmMessageSounds.value(mt)); } qsbMaxBlocks->setValue(r.iMaxLogBlocks); #ifdef USE_NO_TTS qtwMessages->hideColumn(ColTTS); #else loadSlider(qsVolume, r.iTTSVolume); qsbThreshold->setValue(r.iTTSThreshold); qcbReadBackOwn->setChecked(r.bTTSMessageReadBack); #endif qcbWhisperFriends->setChecked(r.bWhisperFriends); } void LogConfig::save() const { QList qlItems = qtwMessages->findItems(QString(), Qt::MatchContains); foreach(QTreeWidgetItem *i, qlItems) { Log::MsgType mt = static_cast(i->data(ColMessage, Qt::UserRole).toInt()); int v = 0; if (i->checkState(ColConsole) == Qt::Checked) v |= Settings::LogConsole; if (i->checkState(ColNotification) == Qt::Checked) v |= Settings::LogBalloon; if (i->checkState(ColHighlight) == Qt::Checked) v |= Settings::LogHighlight; #ifndef USE_NO_TTS if (i->checkState(ColTTS) == Qt::Checked) v |= Settings::LogTTS; #endif if (i->checkState(ColStaticSound) == Qt::Checked) v |= Settings::LogSoundfile; s.qmMessages[mt] = v; s.qmMessageSounds[mt] = i->text(ColStaticSoundPath); } s.iMaxLogBlocks = qsbMaxBlocks->value(); #ifndef USE_NO_TTS s.iTTSVolume=qsVolume->value(); s.iTTSThreshold=qsbThreshold->value(); s.bTTSMessageReadBack = qcbReadBackOwn->isChecked(); #endif s.bWhisperFriends = qcbWhisperFriends->isChecked(); } void LogConfig::accept() const { g.l->tts->setVolume(s.iTTSVolume); g.mw->qteLog->document()->setMaximumBlockCount(s.iMaxLogBlocks); } void LogConfig::on_qtwMessages_itemChanged(QTreeWidgetItem* i, int column) { if (! i->isSelected()) return; switch (column) { case ColTTS: if (i->checkState(ColTTS)) i->setCheckState(ColStaticSound, Qt::Unchecked); break; case ColStaticSound: if (i->checkState(ColStaticSound)) { i->setCheckState(ColTTS, Qt::Unchecked); if (i->text(ColStaticSoundPath).isEmpty()) browseForAudioFile(); } break; default: break; } } void LogConfig::on_qtwMessages_itemClicked(QTreeWidgetItem * item, int column) { if (item && column == ColStaticSoundPath) { AudioOutputPtr ao = g.ao; if (ao) { if (!ao->playSample(item->text(ColStaticSoundPath), false)) browseForAudioFile(); } } } void LogConfig::on_qtwMessages_itemDoubleClicked(QTreeWidgetItem * item, int column) { if (item && column == ColStaticSoundPath) browseForAudioFile(); } void LogConfig::browseForAudioFile() { QTreeWidgetItem *i = qtwMessages->selectedItems()[0]; QString defaultpath(i->text(ColStaticSoundPath)); QString file = AudioOutputSample::browseForSndfile(defaultpath); if (!file.isEmpty()) { i->setText(ColStaticSoundPath, file); i->setCheckState(ColStaticSound, Qt::Checked); } } Log::Log(QObject *p) : QObject(p) { tts=new TextToSpeech(this); tts->setVolume(g.s.iTTSVolume); uiLastId = 0; qdDate = QDate::currentDate(); } // Display order in settingsscreen, allows to insert new events without breaking config-compatibility with older versions const Log::MsgType Log::msgOrder[] = { DebugInfo, CriticalError, Warning, Information, ServerConnected, ServerDisconnected, UserJoin, UserLeave, Recording, YouKicked, UserKicked, UserRenamed, SelfMute, SelfUnmute, SelfDeaf, SelfUndeaf, OtherSelfMute, YouMuted, YouMutedOther, OtherMutedOther, SelfChannelJoin, SelfChannelJoinOther, ChannelJoin, ChannelLeave, ChannelJoinConnect, ChannelLeaveDisconnect, PermissionDenied, TextMessage, PrivateTextMessage }; const char *Log::msgNames[] = { QT_TRANSLATE_NOOP("Log", "Debug"), QT_TRANSLATE_NOOP("Log", "Critical"), QT_TRANSLATE_NOOP("Log", "Warning"), QT_TRANSLATE_NOOP("Log", "Information"), QT_TRANSLATE_NOOP("Log", "Server Connected"), QT_TRANSLATE_NOOP("Log", "Server Disconnected"), QT_TRANSLATE_NOOP("Log", "User Joined Server"), QT_TRANSLATE_NOOP("Log", "User Left Server"), QT_TRANSLATE_NOOP("Log", "User recording state changed"), QT_TRANSLATE_NOOP("Log", "User kicked (you or by you)"), QT_TRANSLATE_NOOP("Log", "User kicked"), QT_TRANSLATE_NOOP("Log", "You self-muted"), QT_TRANSLATE_NOOP("Log", "Other self-muted/deafened"), QT_TRANSLATE_NOOP("Log", "User muted (you)"), QT_TRANSLATE_NOOP("Log", "User muted (by you)"), QT_TRANSLATE_NOOP("Log", "User muted (other)"), QT_TRANSLATE_NOOP("Log", "User Joined Channel"), QT_TRANSLATE_NOOP("Log", "User Left Channel"), QT_TRANSLATE_NOOP("Log", "Permission Denied"), QT_TRANSLATE_NOOP("Log", "Text Message"), QT_TRANSLATE_NOOP("Log", "You self-unmuted"), QT_TRANSLATE_NOOP("Log", "You self-deafened"), QT_TRANSLATE_NOOP("Log", "You self-undeafened"), QT_TRANSLATE_NOOP("Log", "User renamed"), QT_TRANSLATE_NOOP("Log", "You Joined Channel"), QT_TRANSLATE_NOOP("Log", "You Joined Channel (moved)"), QT_TRANSLATE_NOOP("Log", "User connected and entered channel"), QT_TRANSLATE_NOOP("Log", "User left channel and disconnected"), QT_TRANSLATE_NOOP("Log", "Private text message") }; QString Log::msgName(MsgType t) const { return tr(msgNames[t]); } const char *Log::colorClasses[] = { "time", "server", "privilege" }; const QStringList Log::allowedSchemes() { QStringList qslAllowedSchemeNames; qslAllowedSchemeNames << QLatin1String("mumble"); qslAllowedSchemeNames << QLatin1String("http"); qslAllowedSchemeNames << QLatin1String("https"); qslAllowedSchemeNames << QLatin1String("ftp"); qslAllowedSchemeNames << QLatin1String("clientid"); qslAllowedSchemeNames << QLatin1String("channelid"); qslAllowedSchemeNames << QLatin1String("spotify"); qslAllowedSchemeNames << QLatin1String("steam"); qslAllowedSchemeNames << QLatin1String("irc"); qslAllowedSchemeNames << QLatin1String("gg"); // Gadu-Gadu http://gg.pl - Polish instant massager qslAllowedSchemeNames << QLatin1String("mailto"); qslAllowedSchemeNames << QLatin1String("xmpp"); qslAllowedSchemeNames << QLatin1String("skype"); qslAllowedSchemeNames << QLatin1String("rtmp"); // http://en.wikipedia.org/wiki/Real_Time_Messaging_Protocol return qslAllowedSchemeNames; } QString Log::msgColor(const QString &text, LogColorType t) { QString classname; return QString::fromLatin1("%2").arg(QString::fromLatin1(colorClasses[t])).arg(text); } QString Log::formatChannel(::Channel *c) { return QString::fromLatin1("%2").arg(c->iId).arg(Qt::escape(c->qsName)).arg(QString::fromLatin1(g.sh->qbaDigest.toBase64())); } QString Log::formatClientUser(ClientUser *cu, LogColorType t, const QString &displayName) { QString className; if (t == Log::Target) { className = QString::fromLatin1("target"); } else if (t == Log::Source) { className = QString::fromLatin1("source"); } if (cu) { QString name = Qt::escape(displayName.isNull() ? cu->qsName : displayName); if (cu->qsHash.isEmpty()) { return QString::fromLatin1("%3").arg(className).arg(cu->uiSession).arg(name).arg(QString::fromLatin1(g.sh->qbaDigest.toBase64())); } else { return QString::fromLatin1("%3").arg(className).arg(cu->qsHash).arg(name); } } else { return QString::fromLatin1("%2").arg(className).arg(tr("the server")); } } void Log::setIgnore(MsgType t, int ignore) { qmIgnore.insert(t, ignore); } void Log::clearIgnore() { qmIgnore.clear(); } QString Log::imageToImg(const QByteArray &format, const QByteArray &image) { QString fmt = QLatin1String(format); if (fmt.isEmpty()) fmt = QLatin1String("qt"); QByteArray rawbase = image.toBase64(); QByteArray encoded; int i = 0; int begin = 0, end = 0; do { begin = i*72; end = begin+72; encoded.append(QUrl::toPercentEncoding(QLatin1String(rawbase.mid(begin,72)))); if (end < rawbase.length()) encoded.append('\n'); ++i; } while (end < rawbase.length()); return QString::fromLatin1("").arg(fmt).arg(QLatin1String(encoded)); } QString Log::imageToImg(QImage img) { if ((img.width() > 480) || (img.height() > 270)) { img = img.scaled(480, 270, Qt::KeepAspectRatio, Qt::SmoothTransformation); } int quality = 100; QByteArray format = "PNG"; QByteArray qba; { QBuffer qb(&qba); qb.open(QIODevice::WriteOnly); QImageWriter imgwrite(&qb, format); imgwrite.write(img); } while ((qba.length() >= 65536) && (quality > 0)) { qba.clear(); QBuffer qb(&qba); qb.open(QIODevice::WriteOnly); format = "JPEG"; QImageWriter imgwrite(&qb, format); imgwrite.setQuality(quality); imgwrite.write(img); quality -= 10; } if (qba.length() < 65536) { return imageToImg(format, qba); } return QString(); } QString Log::validHtml(const QString &html, QTextCursor *tc) { QDesktopWidget dw; LogDocument qtd; QRectF qr = dw.availableGeometry(dw.screenNumber(g.mw)); qtd.setTextWidth(qr.width() / 2); qtd.setDefaultStyleSheet(qApp->styleSheet()); // Call documentLayout on our LogDocument to ensure // it has a layout backing it. With a layout set on // the document, it will attempt to load all the // resources it contains as soon as we call setHtml(), // allowing our validation checks for things such as // data URL images to run. (void) qtd.documentLayout(); qtd.setHtml(html); QStringList qslAllowed = allowedSchemes(); for (QTextBlock qtb = qtd.begin(); qtb != qtd.end(); qtb = qtb.next()) { for (QTextBlock::iterator qtbi = qtb.begin(); qtbi != qtb.end(); ++qtbi) { const QTextFragment &qtf = qtbi.fragment(); QTextCharFormat qcf = qtf.charFormat(); if (! qcf.anchorHref().isEmpty()) { QUrl url(qcf.anchorHref()); if (! url.isValid() || ! qslAllowed.contains(url.scheme())) { QTextCharFormat qcfn = QTextCharFormat(); QTextCursor qtc(&qtd); qtc.setPosition(qtf.position(), QTextCursor::MoveAnchor); qtc.setPosition(qtf.position()+qtf.length(), QTextCursor::KeepAnchor); qtc.setCharFormat(qcfn); qtbi = qtb.begin(); } } } } qtd.adjustSize(); QSizeF s = qtd.size(); if (!s.isValid()) { QString errorInvalidSizeMessage = tr("[[ Invalid size ]]"); if (tc) { tc->insertText(errorInvalidSizeMessage); return QString(); } else { return errorInvalidSizeMessage; } } int messageSize = s.width() * s.height(); int allowedSize = 2048 * 2048; if (messageSize > allowedSize) { QString errorSizeMessage = tr("[[ Text object too large to display ]]"); if (tc) { tc->insertText(errorSizeMessage); return QString(); } else { return errorSizeMessage; } } if (tc) { QTextCursor tcNew(&qtd); tcNew.movePosition(QTextCursor::End, QTextCursor::KeepAnchor); tc->insertFragment(tcNew.selection()); return QString(); } else { return qtd.toHtml(); } } void Log::log(MsgType mt, const QString &console, const QString &terse, bool ownMessage) { QDateTime dt = QDateTime::currentDateTime(); int ignore = qmIgnore.value(mt); if (ignore) { ignore--; qmIgnore.insert(mt, ignore); return; } QString plain = QTextDocumentFragment::fromHtml(console).toPlainText(); quint32 flags = g.s.qmMessages.value(mt); // Message output on console if ((flags & Settings::LogConsole)) { QTextCursor tc = g.mw->qteLog->textCursor(); LogTextBrowser *tlog = g.mw->qteLog; const int oldscrollvalue = tlog->getLogScroll(); const bool scroll = (oldscrollvalue == tlog->getLogScrollMaximum()); tc.movePosition(QTextCursor::End); if (qdDate != dt.date()) { qdDate = dt.date(); tc.insertBlock(); tc.insertHtml(tr("[Date changed to %1]\n").arg(Qt::escape(qdDate.toString(Qt::DefaultLocaleShortDate)))); tc.movePosition(QTextCursor::End); } if (plain.contains(QRegExp(QLatin1String("[\\r\\n]")))) { QTextFrameFormat qttf; qttf.setBorder(1); qttf.setPadding(2); qttf.setBorderStyle(QTextFrameFormat::BorderStyle_Solid); tc.insertFrame(qttf); } else if (! g.mw->qteLog->document()->isEmpty()) { tc.insertBlock(); } tc.insertHtml(Log::msgColor(QString::fromLatin1("[%1] ").arg(Qt::escape(dt.time().toString())), Log::Time)); validHtml(console, &tc); tc.movePosition(QTextCursor::End); g.mw->qteLog->setTextCursor(tc); if (scroll || ownMessage) tlog->scrollLogToBottom(); else tlog->setLogScroll(oldscrollvalue); } if (!ownMessage) { if (!(g.mw->isActiveWindow() && g.mw->qdwLog->isVisible())) { // Message notification with window highlight if (flags & Settings::LogHighlight) { QApplication::alert(g.mw); } // Message notification with balloon tooltips if (flags & Settings::LogBalloon) { postNotification(mt, plain); } } // Don't make any noise if we are self deafened (Unless it is the sound for activating self deaf) if (g.s.bDeaf && mt != Log::SelfDeaf) { return; } // Message notification with static sounds if ((flags & Settings::LogSoundfile)) { QString sSound = g.s.qmMessageSounds.value(mt); AudioOutputPtr ao = g.ao; if (!ao || !ao->playSample(sSound, false)) { qWarning() << "Sound file" << sSound << "is not a valid audio file, fallback to TTS."; flags ^= Settings::LogSoundfile | Settings::LogTTS; // Fallback to TTS } } } else if (!g.s.bTTSMessageReadBack) { return; } // Message notification with Text-To-Speech if (g.s.bDeaf || !g.s.bTTS || !(flags & Settings::LogTTS)) { return; } // Apply simplifications to spoken text QRegExp identifyURL(QLatin1String("[a-z-]+://[^ <]*"), Qt::CaseInsensitive, QRegExp::RegExp2); QStringList qslAllowed = allowedSchemes(); int pos = 0; while ((pos = identifyURL.indexIn(plain, pos)) != -1) { QUrl url(identifyURL.cap(0).toLower()); int len = identifyURL.matchedLength(); if (url.isValid() && qslAllowed.contains(url.scheme())) { // Replace it appropriatly QString replacement; QString host = url.host().replace(QRegExp(QLatin1String("^www.")), QString()); if (url.scheme() == QLatin1String("http") || url.scheme() == QLatin1String("https")) replacement = tr("link to %1").arg(host); else if (url.scheme() == QLatin1String("ftp")) replacement = tr("FTP link to %1").arg(host); else if (url.scheme() == QLatin1String("clientid")) replacement = tr("player link"); else if (url.scheme() == QLatin1String("channelid")) replacement = tr("channel link"); else replacement = tr("%1 link").arg(url.scheme()); plain.replace(pos, len, replacement); } else { pos += len; } } // TTS threshold limiter. if (plain.length() <= g.s.iTTSThreshold) tts->say(plain); else if ((! terse.isEmpty()) && (terse.length() <= g.s.iTTSThreshold)) tts->say(terse); } // Post a notification using the MainWindow's QSystemTrayIcon. void Log::postQtNotification(MsgType mt, const QString &plain) { if (g.mw->qstiIcon->isSystemTrayAvailable() && g.mw->qstiIcon->supportsMessages()) { QSystemTrayIcon::MessageIcon msgIcon; switch (mt) { case DebugInfo: case CriticalError: msgIcon = QSystemTrayIcon::Critical; break; case Warning: msgIcon = QSystemTrayIcon::Warning; break; default: msgIcon = QSystemTrayIcon::Information; break; } g.mw->qstiIcon->showMessage(msgName(mt), plain, msgIcon); } } LogDocument::LogDocument(QObject *p) : QTextDocument(p) { } QVariant LogDocument::loadResource(int type, const QUrl &url) { // Ignore requests for all external resources // that aren't images. We don't support any of them. if (type != QTextDocument::ImageResource) { addResource(type, url, QByteArray()); return QByteArray(); } QImage qi(1, 1, QImage::Format_Mono); addResource(type, url, qi); if (! url.isValid()) { return qi; } if (url.scheme() != QLatin1String("data")) { return qi; } QNetworkReply *rep = Network::get(url); connect(rep, SIGNAL(finished()), this, SLOT(finished())); // Handle data URLs immediately without a roundtrip to the event loop. // We need this to perform proper validation for data URL images when // a LogDocument is used inside Log::validHtml(). QCoreApplication::sendPostedEvents(rep, 0); return qi; } void LogDocument::finished() { QNetworkReply *rep = qobject_cast(sender()); if (rep->error() == QNetworkReply::NoError) { QByteArray ba = rep->readAll(); QByteArray fmt; QImage qi; // Sniff the format instead of relying on the MIME type. // There are many misconfigured servers out there and // Mumble has historically sniffed the received data // instead of strictly requiring a correct Content-Type. if (RichTextImage::isValidImage(ba, fmt)) { if (qi.loadFromData(ba, fmt)) { addResource(QTextDocument::ImageResource, rep->request().url(), qi); // Force a re-layout of the QTextEdit the next // time we enter the event loop. // We must not trigger a re-layout immediately. // Doing so can trigger crashes deep inside Qt // if the QTextDocument has just been set on the // text edit widget. QTextEdit *qte = qobject_cast(parent()); if (qte != NULL) { QEvent *e = new QEvent(QEvent::FontChange); QApplication::postEvent(qte, e); e = new LogDocumentResourceAddedEvent(); QApplication::postEvent(qte, e); } } } } rep->deleteLater(); } LogDocumentResourceAddedEvent::LogDocumentResourceAddedEvent() : QEvent(LogDocumentResourceAddedEvent::Type) { } mumble-1.3.4/src/mumble/DeveloperConsole.cpp0000664000175000017500000000246314010707273020672 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "DeveloperConsole.h" #include "LogEmitter.h" #include "Global.h" DeveloperConsole::DeveloperConsole(QObject *parent) : QObject(parent) { connect(g.le.data(), SIGNAL(newLogEntry(const QString &)), this, SLOT(addLogMessage(const QString &))); } DeveloperConsole::~DeveloperConsole() { QMainWindow *mw = m_window.data(); delete mw; } void DeveloperConsole::show() { if (m_window.isNull()) { QMainWindow *mw = new QMainWindow(); mw->setAttribute(Qt::WA_DeleteOnClose); QTextBrowser *tb = new QTextBrowser(); mw->resize(675, 300); mw->setCentralWidget(tb); mw->setWindowTitle(tr("Developer Console")); connect(g.le.data(), SIGNAL(newLogEntry(const QString &)), tb, SLOT(append(const QString &))); foreach(const QString &m, m_logEntries) tb->append(m); m_window = QPointer(mw); } m_window.data()->show(); m_window.data()->activateWindow(); } void DeveloperConsole::addLogMessage(const QString &msg) { if (m_logEntries.count() >= 1000) m_logEntries.removeFirst(); m_logEntries.append(msg); } mumble-1.3.4/src/mumble/mumble_eu.ts0000664000175000017500000125015214010707274017242 0ustar builderbuilder ACLEditor Deny Ukatu Allow Onartu Allow %1 Onartu %1 Deny %1 Ukatu %1 Mumble - Add channel Mumble - Gehitu kanala Default server value Zerbitzariko balio lehenetsia Failed: Invalid channel Akatsa: Baliogabeko kanala Mumble - Edit %1 Mumble - Editatu %1 ID: %1 ID: %1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Honek %1 pribilegioa ematen du. Pribilegio bat aldi berean onartua eta ukatua baldin bada, ukatua izango da.<br />%2 Channel must have a name Kanalak izena eduki behar du This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Honek %1 pribilegioa ezeztatzen du. Pribilegio bat aldi berean onartua eta ukatua baldin bada, ukatua izango da.<br /> %2 Dialog Elkarrizketa Name Izena Enter the channel name here. Sartu kanalaren izena hemen. Description Deskribapena Password Pasahitza Enter the channel password here. Sartu kanalaren pasahitza hemen. Check to create a temporary channel. Behin behineko kanala sortzeko egiaztatu. Temporary Behin-behineko <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Kokapena</b><br/> Balio honek Mumblek zuhaitzean zehar kanalak antolatzeko duen modua aldatzeko gaitzen zaitu. <i>Kokapen</i> handiagoa duen kanal bat balio txikiagoa duen beste baten aurretik kokatua egongo da beti eta baita alderantziz. Bi kanalen <i>Kokapen</i> balioa berdina denean hauen izenen arabera alfabetikoki ordenatuak izango dira. Position Kokapena &Groups &Taldeak Group Taldea List of groups Talde zerrenda Remove selected group Ezabatu aukeratutako taldea Remove Ezabatu Inherit group members from parent Taldeko kideak gurasotik heredatu Inherit Heredatu Make group inheritable to sub-channels Taldea azpi-kanalentzat heredagarria egin Inheritable Heredagarria Group was inherited from parent channel Talde hau kanal nagusi batetik heredatua izan da Inherited Heredatua Members Kideak Add Gehitu Add member to group Taldera kidea gehitu Remove member from group Kidea taldetik ezabatu &ACL &SKZ Active ACLs SKZ aktiboak List of entries Sarrera zerrenda Inherit ACL of parent? Gurasoaren SKZ heredatu? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. Hemen ACL sistemaren objektu gurasoak kanal honi eragingo dioten edo ez zehazten da. Soilik "sub-kanalak aplikatu" doituta duten sarrera horiek heredatuko dira. Inherit ACLs SKZak heredatu Move entry up Sarrera igo This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. Honek sarrera gorantz mugitzen du zerrendan. Sarrerak ordenean ebaluatzen direnez, honek erabiltzaileen baimenetan eragina izan lezake. Ezin duzu heredatutako sarrera baten gainera mugitu, hori egin nahi baduzu, sarrera bikoiztu beharko duzu. &Up &Gora Move entry down Sarrera jeitsi This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. Honek sarrera zerrendan behera mugitzen du. Sarrerak ordenan ebaluatzen direnez, honek erabiltzaileen baimen eraginkorrak alda ditzake. &Down &Behera Add new entry Sarrera gehitu This adds a new entry, initially set with no permissions and applying to all. Honek sarrera berri bat gehitzen du, hasiera batean baimenik gabe eta guztiei aplikatuz. &Add &Gehitu Remove entry Sarrera ezabatu This removes the currently selected entry. Honek aukeratutako sarrerak ezabatzen ditu &Remove &Ezabatu Context Testuinguru Entry should apply to this channel. Entry should apply to this channel Sarrera kanal honi ezarri behar zaio. This makes the entry apply to this channel. Honek sarrera kanal honi ezartzen dio. Applies to this channel Kanal honi ezartzen dio Entry should apply to sub-channels. Sarrera azpi-kanalei ezarri behar zaie. Add new group Taldea gehitu <b>Add</b><br/> Add a new group. <b>Gehitu</b><br/> Talde berria gehitu. Inherited members Heredatutako jokalariak Contains the list of members added to the group by this channel. Kanal honek taldera gehitutako jokalarien zerrenda du. Contains a list of members whose group membership will not be inherited from the parent channel. Kideen zerrenda du. Kideen talde-jatorria ez da pareko kanaletik heredatuko. Contains the list of members inherited by other channels. Beste kanaletatik jasotako kideen zerrenda du. Type in the name of a user you wish to add to the group and click Add. Taldera gehitu nahi duzun erabiltzailearen izena idatzi, eta 'Gehitu' botoia sakatu. Type in the name of a user you wish to remove from the group and click Add. Taldetik ezabatu nahi duzun erabiltzailearen izena idatzi, eta 'Ezabatu' botoia sakatu. Exclude Baztertu Excluded members Baztertutako kideak This makes the entry apply to sub-channels of this channel. Honek sarrera kanal honetako azpi-kanalei ezartzen die. Applies to sub-channels Azpi-kanalei ezartzen die. Permissions Baimenak User/Group Erabiltzailea/Taldea Group this entry applies to Sarrera honi dagokion taldea User ID Erabiltzaile ID User this entry applies to Sarrera honi dagokion erabiltzailea This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. Honek zein erabiltzaileri ezartzen zaion sarrera hau kontrolatzen du. Erabiltzaile izena idatzi besterik ez duzu zerbitzariari bat etortzerik dagoen galdetzeko. &Properties &Propietateak <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>Izena</b><br />Sartu kanalaren izena eremu honetan. Izenak konektatuta zauden zerbitzariak ezarritako murrizketak bete behar ditu. <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>Behin behinekoa</b><br /> Aukeratutakoan sortutako kanala behin behineko bezala markatua izango da. Honek esan nahi du azken jokalariak kanala uztean, hau automatikoki ezabatua izango dela zerbitzariagatik. <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>Taldea</b><br /> Hauek kanal honetarako definitutako talde guztiak dira. Talde berri bat sortzeko izena idatzi eta enter sakatu besterik ez duzu. <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>Ezabatu</b><br />Honek uneko aukeratutako taldea ezabatzen du. Taldea heredatua bada, ez da ezabatua izango zerrendatik baina taldeari buruzko informazio lokal guztia garbitua izango da. <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b> Oinordetza </ b> <br /> Honek gurasoaren taldeko kide guztiak heredatuko ditu, taldea <i> Heredagarri </ i> bezala markatua badago. <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>Heredagarria/b><br /> Taldea azpi-kanalentzako heredagarria bilakatzen du. Taldea ez bada heredagarria, azpi-kanalek, izen berdina duen talde berri bat sor dezakete. <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>Heredatua</b><br /> Talde gurasotik heredatua izan dela erakusten du. Ezin duzu eremu hau aldatu, informazioa bakarrik da. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>Kideak</b><br /> Zerrenda honek uneko kanalera gehitutako kide guztiak biltzen ditu. Kontuan hartu maila altuagoetatik heredatutakoak ez direla ageri. Horiek <i>Heredatutako kideak</i> zerrendan aurki ditzakezu. Zerrenda hau maila txikiagoetara heredatzea ekiditeko begiratu <i>Heredagarria</i> eremua edo manualki gehitu erabiltzaileak <i>Baztertutako kideaki> zerrendara. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>Baztertutako kideak</b><br /> Baztertutako kideen zerrendu. Kideen talde-jatorria ez da guraso kanaletik heredatuko. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. <b>Heredatutako kideak</b><br> Momentuko kanalak heredatutako kideen zerrenda du. Desgaitu <i>Heredatu</i> goi nibeleko kanaletatik heredatzea ekiditeko. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. ID of the channel. Kanalaren ID-a Maximum Users Gehienezko Erabiltzaileak Maximum number of users allowed in the channel Baimendutako gehienezko jokalari kopurua kanaleko <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. This is the sort order for the channel. ALSAAudioInput Default ALSA Card ALSA txartel lehenetsia Opening chosen ALSA Input failed: %1 Aukeratutako ALSA Sarrera zabaltzen huts egin du: %1 ALSAAudioOutput Default ALSA Card ALSA txartel lehenetsia Opening chosen ALSA Output failed: %1 Aukeratutako ALSA Irteera zabaltzen huts egin du: %1 ASIOConfig %1 (version %2) %1 (%2 bertsioa) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz %1 -> %2 lagindun buffer-a, %3 lagin bereizmenarekin (%4 nahiago) %5 Hz-tan ASIO Initialization failed: %1 ASIO hasieraketak huts egin du: %1 Failed to instantiate ASIO driver ASIO kontrolatzailea instantziatzeak huts egin du ASIO ASIO Device selection Gailu aukeraketa Device Gailua Device to use for microphone Mikrofonotzat erabiltzeko gailua This chooses what device to query. You still need to actually query the device and select which channels to use. Honekin ze gailu kontsultatu nahi duzun zehazten da. Oraindik gailua kontsultatu eta ze kanal erabali zehaztu behar duzu. Query selected device Aukeratutako gailua galdetu This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. Honek gailua kontsultatuko du kanalen bila. Jakin ezazu ASIO kontroladore askok akatsak dituztela eta berauek kontsultatzeak aplikazioan edo sisteman erroreak sor ditzake. &Query &Kontsulta Configure selected device Aukeratutako gailua prestatu This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Configure &Ezarpenak Capabilities Gaitasunak Driver name Kontrolatzaile izena Buffer size Buffer tamaina This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. Configure input channels Sarrera kanalak prestatu Channels Kanalak Microphone Mikrofonoa <- <- -> -> Unused Erabili gabea Speakers Bozgorailuak ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. Opening selected ASIO device failed. No input will be done. Aukeratutako ASIO gailuaren irekierak huts egin du. Sarrerarik ez da egingo. AboutDialog About Mumble Mumbleri buruz. <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble Mumble-ri &Buruz &License &Lizentzia A&uthors &Third-Party Licenses OK OK AudioInput Interface Interfazea System Sistema Input method for audio Audioaren sarrera mota <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Hau da audioarentzat erabiltzeko sarrera metodoa.</b><br />Ziurrenik DirectSound erabili nahi duzu. Device Gailua Input device for audio Audioaren sarrera gailua <b>This is the input device to use for audio.</b> <b>Hau da audioarentzat erabiltzeko sarrera gailua.</b> Transmission Transmisioa &Transmit &Emititu When to transmit your speech Noiz emititu zure hizketa <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. DoublePush Time Pultsazio bikoitzerako denbora If you press the PTT key twice in this time it will get locked. Orain PTT tekla bi aldiz sakatuz gero, blokeatuko da. <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. Reset audio cue to default Berrezarri lehenetsitako audio seinalea <b>Reset</b><br/>Reset the paths for the files to their default. <b>Berrezarri</b><br/>Berrezarri fitxategi bideak lehenetsietakoetara. Browse for on audio file Arakatu 'on' audio fitxategia aukeratzeko Browse for off audio file Arakatu 'off' audio fitxategia aukeratzeko Off Itzali On Piztu Preview the audio cues Aurreikusi audio seinaleak Use SNR based speech detection SNR sisteman oinarritutako sistema Signal to Noise Zaratara Seinalea <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. Amplitude Amplitudea Voice &Hold Ahotsa & Eutsi How long to keep transmitting after silence Isiltasuna datorrenean zenbat denbora mantendu emititzen Silence Below Isiltasuna Behean <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. Speech Above Hizketa Goian Signal values above this count as voice Nibel honetatik goragoko seinaleak ahots kontsideratuak izango dira Compression Konprimitzea &Quality &Kalitatea Quality of compression (peak bandwidth) Konprimitze kalitatea (banda zabalera gailurra) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. <b>Honek konprimitze kalitatea ezartzen du.</b><br />Honek Mumble-ek zenbat banda zabalera erabiltzeko baimena duen zehazten du irteera audiorako. Audio per packet Audioa paketeko How many audio frames to send per packet Zenbat audio marko bidali paketeko <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>Honek zenbat audio marko jarri behar diren pakete batean aukeratzen du.</b><br />Hau handitzeak zure ahotsaren atzerapena handituko du, baina banda zabalera eskakizunak ere gutxituko ditu. <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). Audio Processing Audio Prozesamendua Noise Suppression Zarata Ezabaketa Noise suppression Zarata ezabaketa <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. Maximum amplification of input sound Sarrera soinuaren gehienezko anplifikazioa <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. Current speech detection chance Momentuko abiadura atzemateko aukera Cancel echo from speakers Oihartzuna ezabatu bozgorailuetatik Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. Disabled Ezgaitua <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal values below this count as silence Honen azpiko balio-seinaleak isilunetzat hartzen dira Maximum bandwidth used for sending audio Audioa bidaltzeko erabilitako gehienezko banda zabalera Use Amplitude based speech detection Erabili anplitudean oinarritutako hizketa detekzioa <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). Exclusive mode Modu esklusiboa <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>Honek gailua modu esklusiboan zabaltzen du.</b><br />Beste aplikazioek ezingo dute erabili gailu hau. Exclusive Esklusiboa R&eset B&errezarri &Browse... &Bilatu... B&rowse... A&ukeratu... &Preview &Aurreikusi <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. Displays an always on top window with a push to talk button in it Beti gainkaldean dagoen leiho bat erakusten du sakatu hitz egiteko botoi batekin Display push to talk window Sakatu hitz egiteko leihoa erakutsi Misc Misc Audible audio cue when starting or stopping to transmit Audio seinale entzungarria transmisioa hasi edo amaitzerakoan <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. Audio cue Audio seinalea Gets played when starting to transmit Transmititzen hasi ondoren, martxan jartzen da Gets played when stopping to transmit Transmititzen gelditu ondoren, martxan jartzen da Hold Time Eutsi Denbora Time the microphone stays open after the PTT key is released PTT tekla aske utzi ondoren, mikrofonoa irekia dagoen denbora. Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) Zerbitzariko gehienezko sare banda zabalera %1 kbit/s-koa da soilik. Audio kalitatea automatikoki doitua dago %2 kbit/s-ra (%3 ms) Max. Amplification Gehienezko Anplifikazioa Idle action Ekintza baliogabea???? minutes do Egindako minutuak nothing ezer ez deafen gortu mute ixildu after ondoren Echo Cancellation Oihartzun indargabetzailea Mixed echo cancellation Multichannel echo cancellation The idle action will be reversed upon any key or mouse button input Undo Idle action upon activity Apply RNNoise's noise suppression filter. <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. RNNoise Audio input AudioInputDialog Continuous Etengabekoa Voice Activity Ahots Jarduera Push To Talk Sakatu Hitz egiteko Audio Input Audio Sarrera %1 ms %1 ms Off Itzalita %1 s %1 s %1 kb/s %1 kb/s -%1 dB -%1 dB %1 kbit/s (Audio %2, Position %4, Overhead %3) AudioOutput Interface Interfazea System Sistema Output method for audio Irteera metodoa audioarentzat <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Hau da audioarentzat erabiltzeko irteera metodoa.</b><br />Ziurrenik DirectSound erabili nahi duzu. Device Gailua Output device for audio Audioarentzat irteera gailua <b>This is the output device to use for audio.</b> <b>Hau da audioarentzat erabiltzeko irteera gailua.</b> Positional Audio Audio Posizionala Audio Output Audio Irteera Default &Jitter Buffer Fluktuazio bufer lehenetsia Safety margin for jitter buffer Fluktuazio buferrarentzako segurtasun marjina <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. Minimum distance to user before sound volume decreases Erabiltzailearenganako gutxieneko distantzia soinu bolumena jaitsi aurretik This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. Honek soinu kalkuluetarako gutxieneko distantzia ezartzen du. Beste erabiltzaileen hizketa bolumena ez da jaitsiko zugandik hau bezain urrun ez dauden bitartean. This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. Volume Bolumena Volume of incoming speech Sarrerako hizketaren bolumena <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. Honek sarrera hizketaren bolumena doitzen du.</b><br />Izan kontutan hau %100 gora igotzen baduzu, audioa distortsionatu egingo dela. Output Delay Irteera Atzerapena Amount of data to buffer Buffer-ean gordetzeko datu kantitatea The connected "speakers" are actually headphones The connected "speakers" are actually headphones. Konektatutako "bozgorailuak" egia esan, aurikularrak dira Factor for sound volume decrease Soinu bolumena jaisteko faktorea Bloom Factor for sound volume increase Soinu bolumena igotzeko faktorea How much should sound volume increase for sources that are really close? Zenbat igo beharko litzateke soinu bolumena oso hurbil dauden iturrientzat? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. Hau egiaztatzeak bozgorailuak konektatu gabe eta aurikularrak soilik dituzula adierazten du. Hau garrantzitsua da zeren bozgorailuak normalean zure aurrean egon ohi dira, eta aurikularrak zuzenean zure ezker/eskuinean daude. This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Headphones Aurikularrak Minimum Distance Distantzia minimoa Maximum Distance Distantzia maximoa Maximum distance, beyond which speech volume won't decrease Minimum Volume Bolumen minimoa What should the volume be at the maximum distance? Zein izan beharko litzateke bolumena gehienezko distantzian? Loopback Test Itzulera bukle testa Delay Variance Atzerapen Diferentzia Variance in packet latency Diferentzia pakete latentzian <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. Packet Loss Pakete Galera Packet loss for loopback mode Pakete galera loopback modurako <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% &Loopback &Loopback Desired loopback mode Attenuate applications by... Aplikazioen ahultze balorea Attenuation of other applications during speech Beste aplikazioen ahultzea hizketaren bitartean <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. If checked Mumble lowers the volume of other applications while other users talk Hautatuz gero Mumble-k beste aplikazioen bolumena jaisten du beste erabiltzaileek hitz egiten duten bitartean <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. while other users talk besteek hitz egiten duten bitartean If checked Mumble lowers the volume of other applications while you talk Hautatuz gero Mumble-k beste aplikazioen bolumena jaisten du zuk hitz egiten duzun bitartean <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. while you talk zuk hitz egiten duzun bitartean Exclusive mode, not recommended. Modu esklusiboa, ez gomendatua. <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>Honek gailua modu esklusiboan zabaltzen du.</b><br />Beste aplikazioek ezingo dute erabili gailu hau. Exclusive Esklusiboa Priority Speaker Lehentasun Bozgorailua If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. Hautatuz gero Mumble-k beste erabiltzaileen bolumena jaisten du zuk hitz egiten duzun bitartean "Lehentasunezko Bozgorailua" egoera baldin baduzu. <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. Attenuate other users while talking as Priority Speaker. Arindu beste erabiltzaileak lehentasun bozgorailuan hitzegin bitartean Advanced Attenuation Options If checked, Mumble will only attenuate applications that are using the same output source as Mumble <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. Only attenuate applications using the same output device If checked, PulseAudio loopback modules will be attenuated <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. Attenuate PulseAudio loopback modules Audio output AudioOutputDialog None Bat ere ez Local Lokala Server Zerbitzaria Audio Output Audio Irteera %1 ms %1 ms %1 % %1 % %1 m %1 m AudioOutputSample Choose sound file Ahots fitxategia aukeratu Invalid sound file Ahots fitxategi baliogabea The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. Mumble-k ezin du %1 fitxategia erabili. Mesedez, aukeratu formatu eta kodeketa bateragarria duen fitxategi bat. AudioStats >1000 ms >1000ms >1000 ms Audio Statistics Audio estatistikak Input Levels Sarrera Mailak Peak microphone level Mikrofonoaren maila maximoa Peak power in last frame Azken frame-aren potentzia maximoa This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. Peak speaker level This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. Peak clean level Maila garbi maximoa This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. Signal Analysis Seinale analisia Microphone power Mikrofono indarra How close the current input level is to ideal Zein urbil dago sarrera maila egokitik This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. Honek zure oraingo sarrera bolumena balio egokienetik zein gertu dagoen erakusten du. Zure mikrofonoaren maila doitzeko, zabaldu grabaketa bolumena doitzeko erabiltzen duzun programa eta begiratu hemengo balioa hitz egiten duzun biartean.<br /><b>Hitz egin altu, hasiberri batek zirikatuko balizu bezala.</b><br />Doitu bolumena balio hau %100-etik ahalik eta gertuen utziz, baina pasatu gabe. Pasatuz gero, ziurrenik mozketak izango dituzu zure hizketaldien zati batzuetan eta honek soinu kalitatea gutxituko du. Signal-To-Noise ratio Seinalea-Zaratara ratioa Signal-To-Noise ratio from the microphone Seinalea-Zaratara ratioa mikrofonotik This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. Speech Probability Hizketa Probabilitatea Probability of speech Hizketaren probabilitatea This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). Configuration feedback Current audio bitrate Oraingo audio bitrate-a Bitrate of last frame Azken frame-aren bitrate-a DoublePush interval Time between last two Push-To-Talk presses Azken bi Sakatu-hitz-egiteko sakaketen arteko denbora. Speech Detection Hizketa Detekzioa Current speech detection chance <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal and noise power spectrum Seinalea eta zarataren espektru energetikoa Power spectrum of input signal and noise estimate Sarrerako seinalearen eta estimatutako zarataren espektru energetikoa This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. Echo Analysis Oihartzun Analisia Weights of the echo canceller Oihartzun indargabetzailearen pisuak This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. AudioWizard Audio Tuning Wizard Audioa doitzeko laguntzailea Introduction Sarrera Welcome to the Mumble Audio Wizard Ongi etorri Mumble Audio Laguntzailera Finished Amaituta Enjoy using Mumble Gozatu Mumble erabiltzen Device selection Gailu aukeraketa Selecting the input and output device to use with Mumble. Mumble-rekin erabiltzeko sarrera eta irteera gailuak aukeratzen. This is the device your microphone is connected to. Zure mikrofonoa gailu honetara dago konektatua. System Sistema Input method for audio Sarrera metodoa audioarentzat <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Hau da audioarentzat erabiltzeko sarrera metodoa.</b><br />Ziurrenik DirectSound erabili nahi duzu. Device Gailua Input device to use Erabiliko den sarrera gailua <b>Selects which sound card to use for audio input.</b> <b>Zein soinu txartel erabili Sarrera audioarentzat aukeratzen du.</b> Cancel echo from headset or speakers Oihartzuna ezabatu aurikular edo bozgorailuetatik Use echo cancellation Oihartzun indargabetzailea erabili This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. Honek irteera audioaren ohiartzunaren ezabatzea gaitzen du, zeinak bozgorailu eta aurikularretan laguntzen duen. This is the device your speakers or headphones are connected to. Zure bozgorailu edo aurikularrak gailu honetara daude konektatuak. Output method for audio Irteera metodoa audioarentzat <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Hau da audioarentzat erabiltzeko Irteera metodoa.</b><br />Ziurrenik DirectSound erabili nahi duzu. Output device to use Erabiliko den irteera gailua <b>Selects which sound card to use for audio Output.</b> <b>Zein soinu txartel erabili Irteera audioarentzat aukeratzen du.</b> Enable positional audio Audio posizionala aktibatu Allows positioning of sound Allows positioning of sound. Soinuaren posizionamendua baimentzen du <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> Input Device Sarrera Gailua Output Device Irteera Gailua This allows Mumble to use positional audio to place voices. Honek Mumble ahotsak kokatzeko audio posizionala erabiltzera baimentzen du. <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> Amount of data to buffer Buffer-ean gordetzeko datu kantitatea This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> Positional Audio Audio Posizionala Adjusting attenuation of positional audio. Audio posizionalaren ahultzea doitzen. <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> Use headphones instead of speakers Aurikularrak erabili bozgorailuen ordez <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> Use headphones Erabili entzungailuak This ignores the OS speaker configuration and configures the positioning for headphones instead. Honek ez dio kasurik egiten SE-ren bozgorailu konfigurazioari eta honen ordez aurikularrentzat posizionamendua konfiguratzen du. Volume tuning Bolumenaren doikuntza Tuning microphone hardware volume to optimal settings. Mikrofonoaren hardware bolumena egokitzen ezarpen ezin hobeak edukitzeko. Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. Orain hitz egin suabe, gauez hitz egingo bazenu bezala, inor gogaitu nahi gabe. Beheko graduatzailea doitu, hitz egiten duzunean barra berde egon dadin, baina isilik zaudenean urdin egon dadila. Voice Activity Detection Ahots Jardueraren Detekzioa Letting Mumble figure out when you're talking and when you're silent. Mumble-i uzten pentsatzen ea hitz egiten ari zaren edo isilik zauden. This will help Mumble figure out when you are talking. The first step is selecting which data value to use. Honek Mumble lagunduko du noiz ari zaren hitz egiten jakiten. Lehen pausua zein datu balio erabili aukeratzea da. Raw amplitude from input Anplitude gordina sarreratik Signal-To-Noise ratio Seinalea-Zaratara ratioa Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Device tuning Gailu sintonia Changing hardware output delays to their minimum value. Hardware-aren irteera atzerapenak gutxienezko balioetara aldatzen. Submit anonymous statistics to the Mumble project Estatistika anonimoak bidali Mumble proiektura Push To Talk: Sakatu hitz egiteko Quality & Notifications Kalitate eta Jakinarazpenak Adjust quality and notification settings. Doitu kalitate eta jakinarazpen ezarpenak. Quality settings Kalitate jakinarazpenak Low Baxua Balanced Orekatua Notification settings Jakinarazpenen ezarpenak Use Text-To-Speech to read notifications and messages to you. Disable Text-To-Speech and use sounds instead. %1 ms %1 ms Enables attenuation of other applications while users talk to you Attenuate applications while other users talk High Altua Custom Pertsonalizatu You already set a customized quality configuration in Mumble. Select this setting to keep it. Dagoeneko, kalitate konfigurazio pertsonalizatua ezarri duzu Mumblen. Hautatu ezarpena hau, mantentzeko. Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. Apply some high contrast optimizations for visually impaired users Kontraste handiko optimizazioak aplikatu begi murriztasunak dituzten erabiltzaileentzat Use high contrast graphics Kontraste handiko grafikoak erabili Keep custom Text-To-Speech settings. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) BanEditor Mumble - Edit Bans Mumble - Editatu Kanporaketak &Address &Helbidea &Mask &Maskara Reason Arrazoia Start Hasi End Amaitu User Erabiltzailea Hash Hash &Add &Gehitu &Update &Eguneratu &Remove &Ezabatu Ban List Kanporatutakoen zerrenda Search field Bilaketa eremua This is the search field. Use it to find bans that have this username set in the username field. Who are you looking for? Noren bila zabiltza? No nickname Erabiltzaile izenik ez IP address IP helbidea No IP address IP helbiderik ez Reason for the ban Kanporaketaren arrazoia No reason Arrazoirik ez Ban end date Kanporaketaren iraungintzea Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). Certificate hash Ziurtagiri hash-a No certificate hash Ziurtagiri hash-ik ez Banned users Kanporatutako erabiltzaileak This is a list with banned users. Kanporatutako erabiltzaileen zerrenda da hau Use this button if you want to add a new ban. Norbait kanporatzeko erabili botoi hau Use this button if you want to update ban information. Kanporatzeen informazioa eguneratzeko erabili botoi hau Use this button if you want to remove user from the ban list. Norbait kanporatuen zerrendatik kentzeko erabili botoi hau Clear all fields Garbitu dena This button clears all fields. Use it if you want to add a new ban. Botoi honek eremu guztiak garbitzen ditu. Norbait kanporatu nahi duzunean erabili. Clear Garbitu Ban List - %n Ban(s) Kanporaketen Zerrenda - %n KanporaketaKanporaketen Zerrenda - %n Kanporaketa CertView Name Izena Email e-maila Issuer Igorle Expiry Date Iraungitze Data (none) (Bat ere ez) Self-signed Autosinatua CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. Ezin izan da e-posta helbidea balioztatu.<br />Sartu helbide zuzen bat (edo hutsunea) jarraitzeko. There was an error generating your certificate.<br />Please try again. Zure ziurtagiria sortzen errore bat egon da.<br />Mesedez saiatu berriro. Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. Ezin izan dira zure ziurtagaria eta giltza PKCS#12 formatura exportatu. Baliteke errore bat egotea zure ziurtagirian. The file could not be opened for writing. Please use another file. Ezin izan da fitxategian idatzi. Mesedez, erabili beste bat. The file's permissions could not be set. No certificate and key has been written. Please use another file. The file could not be written successfully. Please use another file. Ezin izan da fitxategian idatzi. Mesedez, erabili beste bat. The file could not be opened for reading. Please use another file. Ezin izan da fitxategia irakurri. Mesedez erabili beste bat. The file is empty or could not be read. Please use another file. Fitxategia hutsik dago, edo ezin izan da irakurri. Mesedez, erabili beste bat. The file did not contain a valid certificate and key. Please use another file. Ez da baliozko ziurtagiririk aurkitu. Mesedez, erabili beste bat. Select file to export certificate to Aukeratu ziurtagaria non exportatuko den Select file to import certificate from Aukeratu ziurtagiria nondik inportatuko den Unable to import. Missing password or incompatible file type. <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. Certificates Certificate Management Ziurtagiri Kudeaketa Certificate Authentication Ziurtagiri Kautotzea Authenticating to servers without using passwords Zerbitzarietan kautotu pasahitzak erabili gabe Current certificate Uneko ziurtagiria This is the certificate Mumble currently uses. Hau da Mumble-k orain darabilen ziurtagiria Current Certificate Uneko Ziurtagiria Create a new certificate Ziurtagiri berri bat sortu This will create a new certificate. Honek ziurtagiri berri bat sortuko du. Import certificate from file Ziurtagiri bat inportatu fitxategitik This will import a certificate from file. Honek ziurtagiri bat inportatuko du fitxategitik. Import a certificate Ziurtagiri bat inportatu Export Certificate Ziurtagiria esportatu This will export a certificate to file. Honek ziurtagiri bat esportatuko du fitxategira. Export current certificate Uneko ziurtagiria esportatu Import Certificate Ziurtagiria inportatu PKCS #12 Certificate import PKCS #12 Ziurtagiria inportatu <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> Mumble-k PKCS #12 formatuan gordetako ziurtagiriak inportatu ditzake. Hau da Mumble-tik giltza bat esportatzean erabilitako formatua, baita ere Firefox-etik, Internet Explorer-etik, Opera-tik etab. giltzak esportatzerakoan.</p><p>Fitxategia pasahitzaz babestua badago, pasahitza beharko duzu ziurtagiria inportatzeko.</p> Import from Inportatu -tik Filename to import from This is the filename you wish to import a certificate from. Select file to import from Aukeratu nondik inportatu This opens a file selection dialog to choose a file to import a certificate from. Open... Ireki... Password Pasahitza Password for PKCS#12 file PKCS#12 fitxategiarentzat pasahitza This is the password for the PKCS#12 file containing your certificate. Hau da PKCS#12 fitxategiaren pasahitza, zeinak zure ziurtagiria duen. Certificate to import Inportatzeko Ziurtagiria This is the certificate you are importing. Hau da inportatzen ari zaren ziurtagiria. Certificate Details Ziurtagiriaren Xehetasunak Replace Certificate Ordezkatu Ziurtagiria Replace existing certificate with new certificate? Uneko ziurtagiria ordezkatu ziurtagiri berriarekin? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> This is the certificate Mumble currently uses. It will be replaced. Hau da Mumble-k orain darabilen ziurtagiria. Ordezkatua izango da. New certificate Ziurtagiri berria This is the new certificate that will replace the old one. Hau da zaharra ordezkatuko duen ziurtagiri berria. New Certificate Ziurtagiri berria Make a backup of your certificate Zure ziurtagiriaren segurtasun kopia bat egin Export to Esprtatu -ra Filename to export to This is the filename you wish to export a certificate to. Save As... Gorde honela... This is the certificate Mumble currently uses. It will be exported. Hau da Mumble-k orain darabilen ziurtagiria. Esportatua izango da. Generate a new certificate for strong authentication Kautotzeko gogorrerako ziurtagiri berria sortu <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> Name Izena Email e-maila Your email address (e.g. johndoe@mumble.info) Zure post elektronikoa (Adb. johndoe@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. Your name (e.g. John Doe) Zure izena (adib. Pernando Amezketarra) This is your name, and will be filled out in the certificate. This field is entirely optional. Finish Amaitu Certificate-based authentication is ready for use Ziurtagirian oinarritutako kautotzea erabiltzeko gertu dago Enjoy using Mumble with strong authentication. Gozatu Mumble erabiltzen kautotze gogorrarekin. Automatic certificate creation <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> ChanACL None Bat ere ez Traverse Zeharkatu Enter Sartu Speak Hitz egin Mute/Deafen Isildu/Gortu Make channel Kanala sortu Make temporary Link channel Kanala lotu This represents no privileges. Baimen eza adierazten du This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. This represents the permission to write text messages to other users in this channel. Honek, erabiltzaileei testu mezuak bidaltzeko baimena adierazten du kanal honetan. This represents the permission to forcibly remove users from the server. This represents the permission to permanently remove users from the server. Honek, zerbitzaritik erabiltzaileak ezabatzeko baimena adierazten du. This represents the permission to register and unregister users on the server. Honek zerbitzarian erabiltzaileak erregistratzeko baimena adierazten du. This represents the permission to register oneself on the server. Honek bere burua zerbitzarian erregistratzeko baimena adierazten du. Whisper Marmarra Move Mugitu Text message Testu Mezua Kick Ostikatu Ban Kanporatu Register User Erregistratu erabiltzailea Register Self Erregistratu zure burua Write ACL ChatbarTextEdit Paste and &Send Paste and send Itsatsi eta &Bidali <center>Type chat message here</center> ClientUser Friend Laguna Authenticated Kautotua Priority speaker Lehentasun Bozgorailua Recording Grabatzen Muted (server) Isilik (zerbitzaria) Deafened (server) Gortua(zerbitzaria) Local Ignore (Text messages) Lokalki alde batera utzi (Testu mezuak) Local Mute Lokalki Isildu Muted (self) Isilik (nik) Deafened (self) Gortua (nik) ConfigDialog Accept changes Onartu aldaketak This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. Reject changes This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. Apply changes Ezarri aldaketak This button will immediately apply all changes. Botoi honek berehala ezarriko ditu aldaketak. Undo changes for current page Aldaketak ezeztatu uneko orriarentzat This button will revert any changes done on the current page to the most recent applied settings. Botoi honek orrialdean egindako azken aldaketak alde batera utziko ditu. Restore defaults for current page Berreskuratu lehenetsiak uneko orriarentzat This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. Botoi honek orrialdeako ezarpen lehenetsiak berreskuratuko ditu. Gainerako orrialdeak ez dira aldatuko.<br />Ezarpen guztiak berreskuratzeko, orrialdez orrialdea joan beharko zara botoi hau sakatuz. Mumble Configuration Mumble ezarpenak ConnectDialog Connecting to %1 %1-era konektatzen Enter username Sartu erabiltzailea Adding host %1 %1 ostalaria gehitzen Servername Zerbitzari izena Hostname Ostalaria Bonjour name Bonjour izena Port Portua Addresses Helbidea Website Web orria Packet loss Pakete galera Ping (80%) Ping (%80) %1 ms %1 ms Ping (95%) Ping (%95) Bandwidth Banda zabalera %1 kbit/s %1 kbit/s &Connect &Konektatu &Filters &Iragazkiak Unknown Users Erabiltzaileak Version Bertsioa Failed to fetch server list Zerbitzari zerrenda eskuratzen huts egin du Mumble Server Connect Ping Ping Remove from Favorites Ezabatu Gogokoenetatik Add custom server Gehitu zerbitzari pertsonalizatua Show all servers that respond to ping Erakutsi ping-ari erantzuten dioten zerbitzari guztiak Show all servers with users Erakutsi zerbitzari denak erabiltzaileekin Show all servers Erakutsi zerbitzari denak &Copy &Kopiatu Copy favorite link to clipboard &Paste &Itsatsi Paste favorite from clipboard &Edit... &Editatu &Add New... &Gehitu Berria... Add to &Favorites Gehitu &Gogokoetara Open &Webpage Ireki &Webgunea Show &Reachable Show &Populated Show &All Erakutsi &Dena ConnectDialogEdit Edit Server Editatu Zerbitzaria Name of the server Zerbitzariaren izena A&ddress &Helbidea Internet address of the server. Internet address of the server. Zerbitzariaren Internet helbidea. <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Helbidea</b><br/> Zerbitzariaren interneteko helbidea. Ostalari arrunt bat, IPv4/IPv6 helbide bat, edo Bounjour zerbitzari identifikatzaile bat izan daiteke. Bounjourren kasuan, @ aurrizkia behar du Mumblek behar bezala detektatzeko. &Port &Portua Port on which the server is listening Zerbitzaria entzuten ari den portua <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. &Username &Erabiltzaile izena Username to send to the server Zerbitzarira bidaltzeko erabiltzaile izena <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. <b>Erabiltzaile izena</b><br/> Zerbitzariarian erabiliko duzun erabiltzaile izena. Kontuan hartu zerbitzariak izen baldintza jakin batzuk izan ditzakeela, edo izen hori dagoeneko beste erabiltzaile batek erabil dezakeela. Label Etiketa Add Server Gehitu zerbitzaria You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 Password Pasahitza Password to send to the server Pasahitza zerbitzarira bidaltzeko <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. Show password Erakutsi pasahitza <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. <b>Etiketa</b><br/> Zerbitzariaren etika. Zerbitzari zerrendan agertuko zaizun izena ezartzen du, edozein izan daiteke. Local server label Zerbitzariaren etiketa lokala 127.0.0.1 127.0.0.1 64738 64738 Your username Zure erabiltzaile izena Your password Zure pasahitza &Fill CoreAudioSystem Default Device Gailu Lehenetsia CrashReporter Mumble Crash Report Mumble Huts-egite Txostena <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> <p><b>Asko sentitzen dugu, badirudi Mumble erori egin dela. Mumble garatzaileei errore txostena bidali nahi al diezu?</b></p><p>Txosten honek Mumble erori deneko informazioaren kopia partzial bat gordetzen du, garatzaileei arazoa konpontzen lagunduko diena.</p> Email address (optional) Post elektronikoa (aukerazkoa) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash Mesedez deskribatu laburki, eta ingelesez, Mumble erori denean egiten ari zinena Send Report Bidali Txostena Don't send report Ez bidali txostena Crash upload successful Errore informea bidalia izan da Thank you for helping make Mumble better! Ekerrik asko Mumble hobetzen laguntzeagatik! Crash upload failed Errore txostenaren bidalketak huts egin du We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 Uploading crash report Errore-txostena bildaltzen Abort upload Igotzea ezeztatu DXAudioInput Default DirectSound Voice Input Lehenetsitako DirectSound Ahots Sarrera Opening chosen DirectSound Input device failed. No microphone capture will be done. Aukeratutako DirectSound gailuaren irekierak huts egin du. MIkrofono sarrerarik ez da egingo. Opening chosen DirectSound Input failed. Default device will be used. Aukeratutako DirectSound sarrera gailuaren irekierak huts egin du. Gailu lehenetsia erabiliko da. Lost DirectSound input device. DirectSound sarrera gailua galdu da. DXAudioOutput Default DirectSound Voice Output Lehenetsitako DirectSound Ahots Irteera Opening chosen DirectSound Output failed. Default device will be used. Aukeratutako DirectSound irteera gailuaren irekierak huts egin du. Gailu lehenetsia erabiliko da. Lost DirectSound output device. DirectSound irteera gailua galdu da. Opening chosen DirectSound Output failed. No audio will be heard. Aukeratutako DirectSound irteera gailuaren irekierak huts egin du. Ez da audiorik entzungo. Database Mumble failed to initialize a database in any of the possible locations. The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. DeveloperConsole Developer Console DockTitleBar Drag here Askatu hemen GlobalShortcut Shortcuts Laster-teklak List of configured shortcuts Konfiguratutako laster-teklen zerrenda Function Funtzioa Data Datuak Shortcut Laster-teklak Suppress Zigortu Add new shortcut Laster-tekla berria gehitu This will add a new global shortcut Honek laster-tekla global berri bat gehituko du &Add &Gehitu Remove selected shortcut Aukeratutako laster-tekla ezabatu This will permanently remove a selected shortcut. Honek aukeratutako laster-tekla behin betiko ezabatuko du &Remove &Ezabatu <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> Open Accessibility Preferences Skip Irten Enable Global Shortcuts Laster-tekla Globalak gaitu <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. Additional Shortcut Engines <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. Enable Windows hooks <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. Enable GKey <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. Enable XInput <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. Enable shortcuts in privileged applications GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> Shortcuts Laster-teklak Shortcut button combination. Laster-tekla konbinazioak. <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. Suppress keys from other applications <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. GlobalShortcutTarget Whisper Target Whisper to list of Users Channel Target Restrict to Group If specified, only members of this group will receive the whisper. Zehaztuz gero, talde honetako kideek soilik jasoko dute marmarra. List of users Erabiltzaile zerrenda Add Gehitu Remove Ezabatu Modifiers Do not send positional audio information when using this whisper shortcut. Ignore positional audio Ez ikusia egin audio posizionalari Shout to Linked channels Lotutako kanaletara ohiukatu Shout to subchannels Azpikanaletara Oihukatu Shout to Channel Kanalera Oihukatu The whisper will also be transmitted to linked channels. The whisper will also be sent to the subchannels of the channel target. GlobalShortcutX Mouse %1 Sagua %1 JackAudioSystem Hardware Ports Mono Stereo LCD Not connected Konektatu gabe LCDConfig Enable this device Gailu hau gaitu LCD LCD Devices Gailuak Name Izena <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> Size Tamaina Enabled Gaituta Views Bistak Minimum Column Width Zutabearen Gutxieneko Zabalera <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> This setting decides the width of column splitter. Splitter Width Log Debug Critical Kritikoa Warning Kontuz Information Informazioa Server Connected Zerbitzaria Konektatua Server Disconnected Zerbitzaria Deskonektatua Other self-muted/deafened Permission Denied Baimena Ukatua Text Message Testu Mezua User Joined Server Erabiltzailea zerbitzarira batu da User Left Server Erabiltzailea zerbitzaritik atera da User recording state changed User kicked (you or by you) User kicked Erabiltzailea kanporatua You self-muted Zure burua isildu duzu User muted (you) Erabiltzaile isildua (zu) User muted (by you) Erabiltzailea isildua (zuk egina) User muted (other) Erabiltzaile isildua (beste batek egina) User Joined Channel Erabiltzailea kanalera batu da User Left Channel Erabiltzaileak kanala utzi du You self-unmuted You self-deafened You self-undeafened User renamed Erabiltzailea berrizendatua You Joined Channel You Joined Channel (moved) User connected and entered channel User left channel and disconnected Private text message the server zerbitzaria [[ Invalid size ]] [[ Text object too large to display ]] [[ Testua luzeegia da erakusteko ]] [Date changed to %1] [Data %1 -era aldatu da] link to %1 esteka %1 -era FTP link to %1 player link jokalariaren esteka channel link kanalaren esteka %1 link esteka %1 LogConfig Toggle console for %1 events Toggle pop-up notifications for %1 events Toggle Text-To-Speech for %1 events Click here to toggle sound notification for %1 events Toggle window highlight (if not active) for %1 events Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. Messages Mezuak Message Mezua Console Kontsola Notification Jakinarazpena Text-To-Speech Soundfile Soinu-fitxategia Path Bidea Text To Speech Volume Bolumena Volume of Text-To-Speech Engine <b>This is the volume used for the speech synthesis.</b> Length threshold Message length threshold for Text-To-Speech Engine <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. Characters Karaktereak Whisper If checked you will only hear whispers from users you added to your friend list. Only accept whispers from friends If enabled text messages you send will be read back to you with TTS Read back own messages Chat Log Txataren erregistroa Maximum chat length Gehienezko chat luzera Unlimited Mugagabea Lines Lerroak Highlight LookConfig System default Sistemako lehenetsia None Bat ere ez Only with users Erabiltzaileekin bakarrik All Dena Ask Galdetu Do Nothing Ez egin ezer Move Mugitu <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory <a href="%1">Arakatu</a> User Interface Erabiltzaile Interfazea This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. List users above subchannels (requires restart). <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. Users above Channels <b>If set, will verify you want to quit if connected.</b> Show number of users in each channel Erakutsi kanal bakoitzeko erabiltzaile kopurua Show channel user count Language Hizkuntza Language to use (requires restart) Erabiltzeko hizkuntza (berrabiaraztea behar du) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. <b>Honek, Mumblek erabiliko duen hizkuntza zehazten du.</b><br />Mumble berrabiarazi beharko duzu hizkuntza aldatuz gero. Look and Feel Itxura eta izaera Layout Maketazioa Classic Klasikoa Stacked Hybrid Hibridoa Custom Pertsonalizatua This changes the behavior when moving channels. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. Expand Hedatu When to automatically expand channels Noiz hedatu automatikoki kanalak Channel Dragging Ask whether to close or minimize when quitting Mumble. Mumble ixtean, itxi edo txikitu nahi duzun galdetu. Ask on quit while connected Galdetu irteterakoan konektatua zauden bitarten Always On Top Beti gainean <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> Hide in tray when minimized Ikonoan ezkutatu minimizatzerakoan Hide the main Mumble window in the tray when it is minimized. This setting controls when the application will be always on top. Never Inoiz ez Always Beti In minimal view Ikuspegi txikituan In normal view Ikuspegi arruntean Displays talking status in system tray Show talking status in tray icon Erakutsi hizketa egoera sistemaren ikonoan This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. Show context menu in menu bar Apply some high contrast optimizations for visually impaired users Kontraste handiko optimizazioak aplikatu begi murriztasunak dituzten erabiltzaileentzat Optimize for high contrast Kontraste handirako optimizatu Application Aplikazioa Adds user and channel context menus into the menu bar Tray Icon Sistema ikonoa Channel Tree Kanalen zuhaitza Use selected item as the chat bar target Filter automatically hides empty channels Iragazkiak kanal hutsak ezkutatzen ditu automatikoki Show transmit mode dropdown in toolbar Theme Gaia Theme to use to style the user interface <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. User Dragging This changes the behavior when moving users. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. Enable Developer menu When in custom layout mode, checking this disables rearranging. Lock layout MainWindow Root Erro Push-to-Talk Global Shortcut Sakatu-hitz-egiteko Push and hold this button to send voice. Global Shortcut This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut Reset Audio Processor Global Shortcut Audio Prozesagailua Berrezarri Unlink Plugin Global Shortcut Push-to-Mute Global Shortcut Sakatu-Isiltzeko Join Channel Global Shortcut Kanalera batu Toggle Overlay Global Shortcut Toggle state of in-game overlay. Global Shortcut Toggle Minimal Global Shortcut Volume Up (+10%) Global Shortcut Igo Bolumena (+%10) Volume Down (-10%) Global Shortcut Jaitsi Bolumena (-%10) Mumble Mumble Mumble -- %1 Mumble -- %1 &Window &Leihoa Minimize Txikitu Ctrl+M Ktrl+M Close Itxi Mumble is currently connected to a server. Do you want to Close or Minimize it? Mumble zerbitzari batera dago konektatuta orain. Itxi edo Minimizatu nahi al duzu? Mute Self Global Shortcut Mututu Set self-mute status. Global Shortcut Ezarri zure buruaren isiltze egoera This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut Deafen Self Global Shortcut Gortu zure burua Set self-deafen status. Global Shortcut This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut Whisper/Shout Whisper Ahopeka/Ohiuka <center>Not connected</center> Not connected <center>Konektatu gabe</center> Clear Garbitu Opening URL %1 %1 URL-a zabaltzen File does not exist Fitxategia ez da existitzen File is not a configuration file. Fitxategia ez da konfigurazio fitxategia Settings merged from file. Ezarpenak fitxategitik batu dira. URL scheme is not 'mumble' URL eskema ez da 'mumble' This version of Mumble can't handle URLs for Mumble version %1.%2.%3 Connecting to %1 %1-era konektatzen Enter username Sartu erabiltzaile izena Connecting to server %1. %1 zerbitzarira konektatzen. Reconnecting. Birkonektatzen. Transmit Mode set to Continuous <p>%1 (%2)<br />%3</p> <p>%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> Register yourself as %1 Erregistratu zure burua %1 bezala <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <h2>Version</h2><p>Protocol %1</p> <p>No build information or OS version available</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) The connection is secured by the cipher suite that OpenSSL identifies as %1 <p>The connection provides perfect forward secrecy</p> <p>The connection does not provide perfect forward secrecy</p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> Voice channel is sent over control channel Register user %1 Erregistratu %1 erabiltzailea <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> <p>%1 zerbitzarian erregistratzera zoaz. Ekintza hau ezin da desegin, erabiltzaile izena ezin da aldatu, eta erregistratutako erabiltzailea izanik, %1-ek zerbitzarira sarrera izango du zuk zerbitzariko pasahitza aldatzen baduzu ere.</p><p>Puntu honetatik aurrera, %1 orain erabiltzen ari den ziurtagiriaz kautotuko da..</p><p>Ziur zaude %1 erregistratu nahi duzula?</p> Kicking user %1 %1 erabiltzailea bidaltzen Banning user %1 %1 erabiltzailea kanporatzen View comment on user %1 Message to channel %1 Mezua %1 kanalera Connected. Konektatuta. <li>Expected certificate digest (SHA-1): %1</li> Server presented a certificate which failed verification. <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> SSL Version mismatch SSL bertsioa ez dator bat Server connection failed. <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>Type message to user '%1' here</center> Type message to user '%1' here Choose image file Irudi fitxategia aukeratu Failed to load image Errorea gertatu da irudia kargatzean Could not open file for reading. Ezin da irakurtzeko ireki fitxategia. Image format not recognized. Irudi formatua ez da ezagutzen. &User &Erabiltzailea &Channel &Kanala Use in conjunction with Whisper to. Global Shortcut This will switch the states of the in-game overlay. Global Shortcut Link Channel Global Shortcut Kanala lotu Cycle Transmit Mode Global Shortcut Set Transmit Mode to Push-To-Talk Global Shortcut Set Transmit Mode to Continuous Global Shortcut Set Transmit Mode to VAD Global Shortcut Send Text Message Global Shortcut Bidali testu mezua Send Clipboard Text Message Global Shortcut This will send your Clipboard content to the channel you are currently in. Global Shortcut Continuous Etengabekoa Voice Activity Ahots Jarduera Push-to-Talk Sakatu-hitz-egiteko Mumble - Minimal View -- %1 Cancel Ezeztatu Save Image As... Gorde irudia honela... Save Image File Gorde irudi fitxategia Could not save image: %1 Ezin izan da irudia gorde: %1 Change your comment Aldatu zure iruzkina Transmit Mode set to Voice Activity Igorpen modua ezarria: ahotsa detektatzean Transmit Mode set to Push-to-Talk Igorpen modua ezarria: zapaldu hitz egiteko <p>Connected users: %1/%2</p> <p>Konektatutako jokalariak: %1/%2</p> UDP Statistics UDP Estatistikak To Server Zerbitzarira From Server Zerbitzaritik Good Ona Late Berandu Lost Galdua Resync Bersinkronizatu <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> Mumble Server Information Mumble Zerbitzariaren Informazioa &View Certificate &Ziurtagiria ikusi Enter reason Sartu arrazoia Sending message to %1 %1-ri mezua bidaltzen To %1: %2 Message to %1 %1-ri mezua Are you sure you want to reset the comment of user %1? Ziur al zaude %1 erabiltzailearen iruzkina berrabiarazi nahi duzula? Are you sure you want to reset the avatar of user %1? Are you sure you want to delete %1 and all its sub-channels? Ziur al zaude %1 eta bere azpi-kanal guztiak ezabatu nahi dituzula? Sending message to channel %1 Mezua %1 kanalera bidaltzen Message to tree %1 To %1 (Tree): %2 (Tree) %1: %2 Unmuted and undeafened. Isiltasuna eta gortasuna kenduak. Unmuted. Isiltasuna kendua. Muted. Isildua. Muted and deafened. Isildu eta gortua. Deafened. Gortua. Undeafened. Gortasuna kendua. Restart Mumble? Berrabiarazi Mumble? Some settings will only apply after a restart of Mumble. Restart Mumble now? About Qt Qt-ri buruz SSL Verification failed: %1 SSL egiaztapenak huts egin du: %1 <li>Server certificate digest (SHA-1): %1</li> <b>WARNING:</b> The server presented a certificate that was different from the stored one. This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. Server connection failed: %1. Zerbitzarirako konexioak huts egin du: %1 Disconnected from server. Zerbitzaritik deskonektatuta. Invalid username Erabiltzaile-izen baliogabea You connected with an invalid username, please try another one. Erabiltzaile baliogabe batekin konektatu zara, mesedez probatu beste batekin. Username in use Erabiltzaile izena jada hartuta That username is already in use, please try another username. Erabiltzaile izen hori jada hartuta dago, mesedez beste batekin saiatu. Wrong certificate or password Ziurtagiri edo pasahitz okerra Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. Wrong password Pasahitz okerra Wrong server password for unregistered user account, please try again. Zerbitzariko pasahitz okerra erregistratu gabeko erabiltzaile konturako, mesedez saiatu berriz. Images (*.png *.jpg *.jpeg) Irudiak (*.png *.jpg *.jpeg) C&onfigure Ezarpenak &Help &Laguntza Log Loga This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. &Quit Mumble Mumble &itxi Closes the program Programa ixten du Exits the application. Aplikazioa ixten du. Ctrl+Q Ktrl+Q Open the server connection dialog Ireki zerbitzari zerrenda &Disconnect &Deskonektatu Disconnect from server Zerbitzaritik deskonektatu Disconnects you from the server. Zerbitzaritik deskonektatzen zaitu Show information about the server connection Zerbitzariaren konexioari buruzko informazioa erakusten du This will show extended information about the connection to the server. Zerbitzariaren konexioari buruzko informazio zabala erakusten du. &Mute &Isildu &Deafen &Gortu &Local Mute Send a Text Message Testu-mezu bat bidali Sends a text message to another user. Erabiltzaile bati testu-mezua bidaltzen dio Add new channel Kanal berria gehitu This adds a new sub-channel to the currently selected channel. Honek azpi-kanal bat gehitzen du aukeratutako kanalean Remove channel Kanala ezabatu This removes a channel and all sub-channels. Kanala eta azpi-kanal guztiak ezabatzen ditu Edit Groups and ACL for channel This opens the Group and ACL dialog for the channel, to control permissions. &Link &Lotu Link your channel to another channel Zure kanala beste kanal batekin lotu This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. Chatbar Txat barra Shows a dialog of registered servers, and also allows quick-connect. Kick user (with reason) Bidali erabiltzailea (arrazoiarekin) Kick selected user off server. You'll be asked to specify a reason. Aukeratutako erabiltzailea zerbitzaritik bota. Arrazoi bat adierazi beharko duzu. Mute user Erabiltzailea isildu. Mute or unmute user on server. Unmuting a deafened user will also undeafen them. Kick and ban user (with reason) Erabiltzailea kanporatu eta baneatu (Arrazoiarekin) Kick and ban selected user from server. You'll be asked to specify a reason. Aukeratutako erabiltzailea kanporatu eta baneatu zerbitzaritik. Arrazoi bat adierazi beharko duzu. Deafen user Gortu erabiltzailea Deafen or undeafen user on server. Deafening a user will also mute them. Mute user locally Erabiltzailea isildu Mute or unmute user locally. Use this on other users in the same room. This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. &Unlink Channel Unlink your channel from another channel This unlinks your current channel from the selected channel. Unlinks your channel from all linked channels. This unlinks your current channel (not the selected one) from all linked channels. &Reset &Berrabiarazi Reset audio preprocessor Berabiarazi audio preprozesagailua This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. &Mute Self &Isildu zure burua Mute yourself Isildu zure burua Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. &Deafen Self &Gortu zure burua Deafen yourself Gortu zure burua Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. &Text-To-Speech Toggle Text-To-Speech Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. Display audio statistics Erakutsi audio estatistikak Pops up a small dialog with information about your current audio input. Forcibly unlink plugin This forces the current plugin to unlink, which is handy if it is reading completely wrong data. Configure Mumble Mumble konfiguratu Allows you to change most settings for Mumble. Mumble-ren aukera gehiago aldatzeko aukera ematen dizu. Start the audio configuration wizard Hasi audio konfigurazio laguntzailea This will guide you through the process of configuring your audio hardware. Honek zure audio hardware-a konfiguratzeko prozesuan zehar lagunduko dizu. &What's This? &Zer da hau? Enter What's This? mode Zer da hau? moduan sartu Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. Klikatu "Zer da hau?" moduan sartzeko. Zure kurtsorea galdera ikur batean bilakatuko da. Klikatu edozein botoi edo menutan zertarako den azaltzen duen deskribapena ikusteko. Information about Mumble Mumble-ri buruzko informazioa Shows a small dialog with information and license for Mumble. Mumble-ri buruzko informazio eta lizentziak erakusten ditu lehio batean. Information about Speex Speex-i buruzko informazioa Shows a small dialog with information about Speex. Speex-i buruzko informazioa erakusten du lehio batean. Information about Qt Qt-ri buruzko informazioa Shows a small dialog with information about Qt. Qt-ri buruzko informazioa erakusten du lehio batean. Check for &Updates &Eguneraketak bilatu Check for new version of Mumble Mumble-ren bertsio berri bat bilatu Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. Mumble-ren orrialdera konektatzen zaitu bertsio berriren bat dagoen ikusteko, eta egotekotan deskargatzeko URL egoki bat erakusten dizu. Sends a text message to all users in a channel. Kanaleko erabiltzaile guztiei bildaltzen dio textu mezu bat. Configure certificates for strong authentication Zertifikatuak konfiguratu autentifikazio sendoago bat lortzeko. This starts the wizard for creating, importing and exporting certificates for authentication against servers. Register user on server Zerbitzarian erabiltzailea erregistratu. This will permanently register the user on the server. Honek erabiltzailea betirako erregistratzen du zerbitzarian. Add &Friend &Laguna gehitu Adds a user as your friend. Erabiltzaile bat laguntzat gehitzen du. This will add the user as a friend, so you can recognize him on this and other servers. Honek erabiltzailea laguntzat gehitzen du, beraz bera zerbitzari honetan nahiz besteetan igartzen du. &Remove Friend Laguna &Ezabatu Removes a user from your friends. Erabiltzailea lagunetatik ezabatzen du. This will remove a user from your friends list. Honek erabiltzailea zure lagunen zerrendatik ezabatzen du. &Update Friend Laguna &Eguneratu Update name of your friend. Zure lagunaren izena eguneratu. Your friend uses a different name than what is in your database. This will update the name. Zure lagunak database-an dagoen izenaren ezberdin bat erabiltzen du. Honek izena eguneratuko du. Edit registered users list Editatu erabiltzaile erregistratuen zerrenda. This opens the editor for registered users, which allow you to change their name or unregister them. Add or remove text-based access tokens Gehitu edo kendu testuan oinarritutako sarrera tokenak. &Minimal View Toggle minimal window modes This will toggle minimal mode, where the log window and menu is hidden. You muted and deafened %1. %1 isildu eta gortu duzu You unmuted and undeafened %1. You undeafened %1. You suppressed %1. %1 muted and deafened by %2. %2 -(e)k %1 isildu eta gortu du %1 unmuted and undeafened by %2. %1 undeafened by %2. %1 suppressed by %2. %1 moved to %2. %1 moved to %2 by %3. %1 moved in from %2 by %3. %1 is now muted and deafened. %1 isildu eta gortua dago Your account information can not be verified currently. Please try again later Zure kontuko informazioa ezin da orain egiaztatu.. Mesedez saiatu beranduago. Welcome message: %1 Ongietorri mezua: %1 Mumble: %1 Mumble: %1 You were denied %1 privileges in %2. %3 was denied %1 privileges in %2. Denied: Cannot modify SuperUser. Ukatua: Ezin da SuperUser-a modifikatu. Denied: Invalid channel name. Ukatua: Kanalaren izen okerra. Denied: Text message too long. Ukatua: Textu mezu luzeegia. Denied: Operation not permitted in temporary channel. Ukatua: Behin behineko kanalean eragiketa hau ez dago onartua. You need a certificate to perform this operation. Eragiketa hau egiteko ziurtagiri bat behar duzu. %1 does not have a certificate. %1-ek ez dauka ziurtagiririk. Invalid username: %1. Erabiltzaile-izen okerra: %1. Invalid username. Erabiltzaile-izen okerra. Channel is full. Kanala beterik dago. Channel nesting limit reached. Channel count limit reached. Need to delete channels before creating new ones. Permission denied. Baimena ukatua. %1 connected and entered channel. %1 connected. -%1 konektatua. %1 is now muted. %1 isildua izan da. %1 is now unmuted. Recording started Grabaketa hasita. Recording stopped Grabaketa gelditua. %1 started recording. %1 grabatzen hasi da. %1 stopped recording. %1-ek grabatzea amaitu du. You revoked your priority speaker status. You assumed priority speaker status. %1 revoked your priority speaker status. %1 -ek hizlari lehentasun egoera ezeztatu dizu %1 gave you priority speaker status. %1 -ek hizlari lehentasun egoera eman dizu You revoked priority speaker status for %1. Hizlari lehentasun egoera kendu diozu %1 -eri You gave priority speaker status to %1. Hizlari lehentasun egoera eman diozu %1 -eri %1 revoked own priority speaker status. %1 -ek hizlari lehentasun egoera ezeztatu dio bere buruari %1 assumed priority speaker status. %1 -ek hizlari lehentasun egoera eman dio bere buruari %1 revoked priority speaker status for %2. %1 -ek hizlari lehentasun egoera ezeztatu dio %2 -ri %1 gave priority speaker status to %2. %1 -ek hizlari lehentasun egoera eman dio %2 -ri You were unmuted and undeafened by %1. You were muted by %1. %1-ek isildu zaitu. You were undeafened by %1. You were suppressed. You were suppressed by %1. You were unsuppressed. You were unsuppressed by %1. You joined %1. You moved %1 to %2. %1 -a %2-ra mugitu duzu %1 is recording %1 grabatzen ari da %1 renamed to %2 by %3. %1 disconnected. %1 deskonektatua. Server message from Zerbitzaria (Tree) (Zuhaitza) (Channel) (Kanala) (Private) %2%1: %3 %2%1: %3 Failed to load Opus, it will not be available for audio encoding/decoding. The server requests minimum client version %1 Zerbitzariak gutxienez %1 bertsioa eskatzen du. The server requests positional audio be enabled. The server requests positional audio be disabled. The server requests Push-to-Talk be enabled. The server requests Push-to-Talk be disabled. You were unmuted by %1. You muted %1. %1 isildu duzu. You unsuppressed %1. You unmuted %1. %2 -k %1 -ra mugitua dizu %1 muted by %2. %2 -(e)k %1 isildu du. %1 unsuppressed by %2. %1 unmuted by %2. Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. You were muted and deafened by %1. You were deafened by %1. %1 -(e)k isildu eta gortu zaitu You were kicked from the server by %1: %2. %1 (e)k zerbitzaritik bota zaitu: %2 %3 was kicked from the server by %1: %2. %1 (e)k %3 zerbitzaritik bota du: %2 You were kicked and banned from the server by %1: %2. %1 -(e)k zerbitzaritik baneatu eta bota zaitu: %2 %3 was kicked and banned from the server by %1: %2. %1 (e)k %3 zerbitzaritik baneatu eta bota du: %2 You were moved to %1 by %2. %2 -(e)k &1 -ra mugitu zaitu %1 entered channel. &1 kanalean sartu da Server connection rejected: %1. Zerbitzarira konexioa ezeztatua: %1 Denied: %1. Ukatua: %1. %1 renamed to %2. %1 left channel and disconnected. %1 -(e)k kanala utzi eta deskonektatu da Message from %1 %1-en mezua You have User Dragging set to "Do Nothing" so the user wasn't moved. You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. Unknown Channel Drag mode in UserModel::dropMimeData. Remote controlling Mumble: Mumble urrutitik kontrolatzen Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) -jn, --jackname Set custom Jack client name. --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status Invocation Error: No RPC command specified RPC Welcome to Mumble. Ongietorri Mumble-ra. Skipping version check in debug mode. Hide Frame Markoa ezkutatu Toggle showing frame on minimal window This will toggle whether the minimal window should have a frame for moving and resizing. &Unlink All Reset the comment of the selected user. Aukeratutako erabiltzailearen iruzkina egokitu. &Join Channel Kanalera %Batu View comment in editor Editorean iruzkina ikusi Query server for connection information for user S&erver Z&erbitzaria &Self &Ni &Unlink Plugins Register yourself on the server Erregistratu zure burua zerbitzarian Change your avatar image on this server Aldatu zerbitzari honetako zure irudia &Remove Avatar Irudia &Ezabatu Remove currently defined avatar image. Icon Toolbar Ikonoen barra Change your own comment Aldatu zure iruzkina Recording Grabaketa Priority Speaker Lehentasun Bozgorailua &Copy URL URL-a &kopiatu Copies a link to this channel to the clipboard. Ignore Messages Mezuak alde batera utzi Locally ignore user's text chat messages. Lokalki alde batera utzi erabiltzaileen mezuak. Silently drops all text messages from the user. Edit ban list on server Baneatu zerrenda editatu zerbitzarian This lets you edit the server-side IP ban list. &Filter on/off &Iragazkia piztuta/itzalita Toggle the channel filter (Ctrl+F) Gaitu / ezgaitu kanal iragazkiak (Ktrl+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. Ctrl+F Ktrl+F &Hide Channel when Filtering Iragazterakoan kanala &ezkutatu Reset the avatar of the selected user. Locally adjust the user's speech volume. Opens a dialog with a volume slider. Use this on other users in the same room. &Developer &Hide Mumble Hides the main Mumble window. Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. Show the Developer Console Shows the Mumble Developer Console, where Mumble's log output can be inspected. &Connect... &Ban list... &Information... &Kick... &Ban... Local Volume Adjustment... Send &Message... &Add... &Remove... &Edit... Audio S&tatistics... &Settings... &Audio Wizard... Developer &Console... &About... About &Speex... About &Qt... &Certificate Wizard... &Register... Registered &Users... Change &Avatar... &Access Tokens... Reset &Comment... Reset &Avatar... View Comment... &Change Comment... R&egister... Show Shows the main Mumble window. Manual Manual Mumble Positional Audio Position X Y Z m Heading Azimuth Elevation ° Meta data Context Identity Set State Linked Activated Unhinge NetworkConfig Network Sarea Updates are mandatory when using snapshot releases. Connection Konexioa Use TCP compatibility mode Use TCP compatability mode Erabili TCP bateragarritasun modua <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). Reconnect when disconnected Birkonektatu deskonektatzean <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. <b>Birkonektatu deskonektatzean</b>.<br />Honen ondorioz Mumble automatikoki saiatuko da birkonektatzen 10 segunduren ostean zure zerbitzariaren konexioak huts egiten badu. Reconnect automatically Birkonektatu automatikoki Proxy Proxy Type Mota Type of proxy to connect through Proxy mota Direct connection Konexio zuzena HTTP(S) proxy HTTP(S) proxy-a SOCKS5 proxy SOCKS5 proxy-a Hostname Ostalaria Hostname of the proxy Proxy-aren ostalaria Force TCP mode Behartu TCP modua Enable QoS to prioritize packets QoS gaitu paketeak lehenesteko This will enable QoS, which will attempt to prioritize voice packets over other traffic. Honek QoS gaituko du, zeinak ahots paketeak lehenesten saiatuko den beste trafikoaren aurretik. Use Quality of Service Erabili Zerbitzuaren Kalitatea Don't send certificate to server and don't save passwords. (Not saved). Ez bidali ziurtagiririk zerbitzarira eta ez gorde pasahitzik. (Gorde gabe). <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> Suppress certificate and password storage Ezabatu ziurtagiri eta pasahitzen gordetzea <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. Port Portua Port number of the proxy Proxy-aren portu zenbakia <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. Username Erabiltzaile izena Username for proxy authentication Erabiltzaile izena proxy kautotzerako <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Password Pasahitza Password for proxy authentication Pasahitza proxy kautotzerako <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Mumble services Mumble zerbitzuak Check for new releases of Mumble automatically. Egiaztatu Mumble bertsio berriak automatikoki. This will check for new releases of Mumble every time you start the program, and notify you if one is available. Honek, Mumble eguneraketarik dagoen egiaztatuko du programa hasten duzun bakoitzean, eta baldin badago jakinarazi. Check for application updates on startup Egiaztatu aplikazio eguneraketak automatikoki. Check for new releases of plugins automatically. Egiaztatu plugin eguneraketak automatikoki. This will check for new releases of plugins every time you start the program, and download them automatically. Honek, plugin eguneraketarik dagoen egiaztatuko du programa hasten duzun bakoitzean, eta ldin badago automatikoki deskargatu. <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. Submit anonymous statistics to the Mumble project Estatistika anonimoak bidali Mumble proiektura Submit anonymous statistics Bidali estatistika anonimoak Reconnect to last used server when starting Mumble Birkonektatu erabilitako azken zerbitzarira Mumble hastean Reconnect to last server on startup Birkonektatu azken zerbitzarira hastean Download plugin and overlay updates on startup Privacy Prevent OS information being sent to Mumble servers and web servers <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. Do not send OS information to Mumble servers and web servers Overlay Silent Isilik Talking Hitz egiten Whisper Shout Oihukatu Channel Kanala Failed to create communication with overlay at %2: %1. No overlay will be available. OverlayClient Filter Iragazkia Only talking Hizketan soilik Talking and recently active All in current channel All in linked channels Always show yourself Beti zure burua erakutsi Configure recently active time (%1 seconds)... Columns Zutabeak Sort Ordenatu Alphabetically Alfabetikoki Last state change Azken egoera aldaketa Edit... Editatu... Reset Zoom Zoom-a Berrabiarazi Configure recently active time Amount of seconds users remain active after talking: Erabiltzaileak aktibo mantentzen diren segundu kantitatea hitz egin ondoren: OverlayConfig To move the users, drag the little red dot. To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. For more options, right click a user. For more options, rightclick a user. Aukera gehiagotarako egin eskuineko klik erabiltzaileari. Launcher Filter Overlay Choose executable Exekutagarria aukeratu Choose application Aplikazioa aukeratu Choose path Load Overlay Presets Mumble overlay presets (*.mumblelay) Save Overlay Presets Options Aukerak Enable overlay. Enable Overlay This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. Layout Blacklist Zerrenda beltza Whitelist Zerrenda txuria Uninstall Overlay Overlay Installation Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. Install Mumble Overlay Overlay Upgrade Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. Upgrade Mumble Overlay Display a frame counter in the overlay Segunduko fotograma kontagailu bat erakusten du Show FPS counter FPS kontagailua erakutsi Load an overlay preset from file Load… Kargatu... Save your overlay settings to file Save… Gorde... Set the overlay font. Set the overlay text color. Color Kolorea Remove Ezabatu Font Letra-mota FPS and Clock Display FPS eta Erloju erakuslea Display a clock in the overlay showing the current local time (system time). Show Clock Erakutsi Erlojua Overlay Exceptions Overlay Exception Mode Allowed launchers Add Allowed programs Allowed paths Blacklisted programs OverlayEditor State Egoera User is not talking Erabiltzailea ez da hitz egiten ari Passive Pasiboa User is talking in your channel or a linked channel Talking Hitz egiten User is whispering to you privately Private Whisper User is shouting to your channel Erabiltzailea zure kanalari oihukatzen ari da Channel Whisper Zoom Zoom Zoom Factor Enabled Elements Gaitutako Elementuak User avatar, chosen by each user Erabiltzaile irudia, erabiltzaile bakoitzak aukeratua Avatar Irudia User's name Erabiltzailearen izena Username Erabiltzaile izena Name of user's channel, if outside your current channel Erabiltzailearen kanalaren izena, zure kanaletik kanpo badago Channel Kanala Muted or deafened Isildu edo gortua Mute state Isiltasun egoera Bounding box, automatically shrunk to minimum size to contain all visible elements Bounding box Overlay Editor OverlayEditorScene Layout preset Large square avatar Avatar and Name Izena eta Irudia User Opacity Erabiltzaileen gardentasuna %1% %1% Object Opacity Objektuen gardentasuna Alignment Lerrokatzea Left Ezkerra Center Erdialdea Right Eskuina Top Hasiera Bottom Amaiera Color... Kolorea... Font... Letra-mota... Bounding box Pen width Idazlumaren zabalera Padding Pen color Idazluma kolorea Fill color Betetze kolorea Pick pen color Idazlumaren kolorea aukeratu Pick fill color Betetze kolorea aukeratu Pick color Kolorea aukeratu Pick font Letra-mota aukeratu PluginConfig Plugins Pluginak Plugin has no configure function. Pluginak ez dauka ezarpenik. Plugin has no about function. Pluginak ez dauka deskribapenik. Options Aukerak Enable plugins and transmit positional information Pluginak gaitu eta posizio informazioa igorri This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. Link to Game and Transmit Position Jokoarekin lotu eta posizioa igorri Reloads all plugins Berrabiarazi plugin guztiak This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. &Reload plugins &Berrabiarazi pluginak Information about plugin Pluginari buruzko informazioa This shows a small information message about the plugin. Pluginari buruzko informazio labur bat erakusten du. &About &Honi buruz Show configuration page of plugin Pluginaren ezarpen orrialdea erakutsi This shows the configuration page of the plugin, if any. Pluginaren ezarpen orrialdea erakusten du, baldin badago. &Configure &Konfiguratu Name Izena Enabled Gaituta Plugins Skipping plugin update in debug mode. Downloaded new or updated plugin to %1. Eguneratutako edo berria den gehigarria deskargatuta %1 -era. Failed to install new plugin to %1. %1-era gehigarri berria instalatzean errorea. %1 lost link. %1 lotura galdua. %1 linked. %1 lotuta. PortAudioSystem Default Device Gailu Lehenetsia PulseAudioSystem Default Input Audio sarrera lehenetsia Default Output Audio irteera lehenetsia QApplication Failed to restart mumble Ezin izan da mumble berrabiarazi Mumble failed to restart itself. Please restart it manually. RichTextEditor Failed to load image Errorea gertatu da irudia kargatzean Image file too large to embed in document. Please use images smaller than %1 kB. Irudia handiegia da dokumentuan txertatzeko. Mesedez erabili %1 kB baino irudi txikiagoak. Message is too long. Mezua luzeegia da. Display Erakutsi Source Text Iturburuko Testua &Bold &Lodia Ctrl+B Ktrl+B &Italic &Etzana Italic Etzana Ctrl+I Ktrl+I Underline Azpimarratu Ctrl+U Ktrl+U Color Kolorea Insert Link Esteka gehitu Ctrl+L Ktrl+L Insert Image Irudia gehitu RichTextEditorLink Add Link Esteka gehitu URL URL Text Testua ServerHandler Unable to resolve hostname Server is not responding to TCP pings UDP packets cannot be sent to or received from the server. Switching to TCP mode. UDP paketeak ezin dira zerbitzariruntz bidali edo zerbitzaritik jaso. TCP modura aldatzen. UDP packets cannot be sent to the server. Switching to TCP mode. UDP paketea ezin dira bidali zerbitzarira. TCP modura aldatzen. UDP packets cannot be received from the server. Switching to TCP mode. UDP paketeak ezin dira jaso zerbitzaritik. TCP modura aldatzen. UDP packets can be sent to and received from the server. Switching back to UDP mode. UDP paketeak zerbitzariruntz bidali eta zerbitzaritik jaso daitezke. UDP modura aldatzen berriz. Connection timed out Konexioa denboraz kanpo geratu da ServerView Favorite Gustukoak LAN LAN Public Internet Publikoak Unknown Africa Afrika Asia Asia North America Ipar Amerika South America Hego Amerika Europe Europa Oceania Ozeania ShortcutActionWidget Unassigned Esleitu gabea ShortcutDelegate On Piztuta Off Itzalita Toggle Aktibatu Unassigned Esleitu gabea ShortcutKeyWidget Press Shortcut Laster-tekla sakatu ShortcutTargetDialog Root Erro Parent Gurasoa Current Uneko Subchannel #%1 #%1 azpikanala ShortcutTargetWidget ... ... , , Root Erro Parent Gurasoa Current Uneko Subchannel #%1 #%1 azpikanala Invalid Baliogabea Empty <Empty> Hutsik ShortcutToggleWidget Off Itzalita Toggle Aktibatu On Piztuta TextMessage Enter text Testua sartu If checked the message is recursively sent to all subchannels Ezarriz gero mezua errekurtsiboki azpikanal guztietara bidaltzen da Send recursively to subchannels Bidali errekurtsiboki azpikanaletara Tokens Empty Token Token hutsa Mumble - Access Tokens Mumble - Sarrera Tokenak List of access tokens on current server Oraingo zerbitzariko sarrera tokenen zerrenda <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. Add a token Gehitu token-a &Add &Gehitu Remove a token Kendu token-a &Remove &Ezabatu UserEdit Registered Users Erregistratutako erabiltzaileak Remove Ezabatu Rename Berrizendatu Who are you looking for? Noren bila zabiltza? Days Egunak Weeks Asteak Months Hilabeteak Years Urteak Inactive for Registered users: %n account(s) Erregistratutako erabiltzaileak: %n kontuErregistratutako erabiltzaileak: %n kontu UserInformation User Information Erabiltzaile informazioa Connection Information Konexio informazioa Version Bertsioa OS SE Certificate Ziurtagiria IP Address IP Helbidea CELT Versions CELT bertsioak Details... Xehetasunak... Ping Statistics Ping estatistikak Pings received Jasotako Ping-ak Average ping Batez besteko Ping-a TCP (Control) TCP (kontrola) UDP (Voice) UDP (Ahotsa) UDP Network statistics UDP Sare estatistikak Good Ongi Late Berandu Lost Galdu Resync Bersinkronizatu From Client Bezerotik To Client Bezerora Connection time Konexio denbora %1w %1w %1d %1d %1h %1h %1m %1m %1s %1s , , %1 (%2) %1.%2.%3 (%4) %1 (%2) Supported Jasandakoa Not Supported Ez jasandakoa Not Reported %1 online (%2 idle) %1 online (%2 egonean) %1 online %1 online %1 kbit/s %1 kbit/s Bandwidth GroupBox Banda zabalera Bandwidth Label Banda zabalera Ping deviation Ping desbideratzea UserListModel Nick Goitizena Inactive days Egun ez aktiboak Last channel Azken kanala Last seen: %1 Azken aldiz ikusia: %1 Never Inoiz ez Channel ID: %1 UserLocalVolumeDialog Local volume for other users <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. Adjusting local volume for %1 dB <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: Hau zerbitzarira konektatutako erabiltzaile bat da. Erabiltzailearen ezkerrean dagoen ikonoak hitz egiten daogen edo ez adierazten du: Talking to your channel. Zure kanalera hitz egiten. Shouting directly to your channel. Whispering directly to your channel. Zure kanalera zuzenean oihukatzen. Whispering directly to you. Not talking. Isilik. This is a channel on the server. The icon indicates the state of the channel: Hau zerbitzariko kanal bat da. Ikonoak kanalaren egoera adierazten du: Your current channel. Zure oraingo kanala. A channel that is linked with your channel. Linked channels can talk to each other. Zure kanalarekin lotuta dagoen kanal bat. Lotutako kanalek beraien artean hitz egin dezakete. A channel on the server that you are not linked to. Kanal bat zerbitzarian zeinari lotuta ez zauden. This shows the flags the user has on the server, if any: Honek erabiltzaileak zerbitzarian dituen banderak erakusten ditu, baldin baditu: On your friend list Zure lagunen zerrendan Authenticated user Erabiltzaile kautotua Muted (manually muted by self) Isildua( berak, bere buruari) Muted (manually muted by admin) Isildua (administratzaile batek isildua) Muted (not allowed to speak in current channel) Isildua (ez dauka uneko kanalean hitz egiteko baimenik) Muted (muted by you, only on your machine) Isildua(zuk isildua, zure ordenagailuan bakarrik) Muted (push-to-mute) Deafened (by self) Gortua (nik) Deafened (by admin) Gortua (administratzaileak) User has a new comment set (click to show) Erabiltzaileak iruzkin multzo berri bat du (egin klik ikusteko) User has a comment set, which you've already seen. (click to show) Erabiltzaileak iruzkin multzo bat du, jadanik ikusita duzuna (egin klik ikusteko) Ignoring Text Messages Mezuak alde batera uzten This shows the flags the channel has, if any: Honek kanalak dituen banderak erakusten ditu, baldin baditu: Channel has a new comment set (click to show) Kanalak iruzkin multzo berri bat du (egin klik ikusteko) Channel has a comment set, which you've already seen. (click to show) Kanalak iruzkin multzo bat du, jadanik ikusita duzuna (egin klik ikusteko) Channel will be hidden when filtering is enabled Kanala ezkutatuko da iragazkiak gaituta daudenean Name Izena Flags Banderak Are you sure you want to drag this user? Are you sure you want to drag this channel? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. Ezin da mugimendua automatikoki egin, mesedez berrezarri zenbaki ordenatze adierazleak edo eskuz doitu. VersionCheck Upgrade Mumble Mumble eguneratu A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? Mumble bertsio berri bat detektatu da eta automatikoki deskargatu da. Bertsio honetara eguneratzea edo azken bertsio egonkorrera bertsioa jaistea gomendatzen da. Nahi al duzu instalatzailea martxan jartzea orain? Failed to launch snapshot installer. Errorea gertatu da snapshot instalatzailea abiaraztean. Corrupt download of new version detected. Automatically removed. Bertsio berri baten deskarga okerra aurkitu da. Automatikoki ezabatu da. Downloading new snapshot from %1 to %2 Failed to write new version to disk. Failed to write new version to disc. Bertsio berria diskora idaztean errorea. Mumble failed to retrieve version information from the central server. Mumble-k huts egin du zerbitzari zentraletik bertsio informazioa lortzen. ViewCert Certificate Chain Details Ziurtagiri Katearen Xehetasunak Certificate chain Ziurtagiri katea Certificate details Ziurtagiriaren xehetasunak Common Name Organization Subunit Country Locality State Valid from: %1 Balio honetatik aurrera onargarria: %1 Valid to: %1 Balio honetaraino onargarria: %1 Serial: %1 Serial-a: %1 Public Key: %1 bits %2 Gako Publikoa: %1 bits %2 RSA RSA DSA DSA Digest (SHA-1): %1 Laburpena (SHA-1): %1 Digest (SHA-256): %1 Email: %1 E-posta: %1 DNS: %1 DNS-a: %1 Issued by: Unit Name VoiceRecorder Recorder failed to create directory '%1' Grabagailuak direktorioa sortzen huts egin du: '%1' Recorder failed to open file '%1' Grabagailuak '%1' fitxategia zabaltzen huts egin du .wav - Uncompressed .wav - Konprimatu gabe .ogg (Vorbis) - Compressed .ogg (Vorbis) - Konprimitua .au - Uncompressed .au - Konprimatu gabe .flac - Lossless compressed .flac - Galera gabe konprimitua VoiceRecorderDialog Recorder Grabagailua Control Agintea 00:00:00 00:00:00 &Start &Hasi S&top &Gelditu Mode Modua Multichannel Multi-kanala Output Irteera Output format Irteera formatua Target directory Helburu direktorioa Filename Fitxategi-izena &Browse... &Bilatu... Valid variables are: Balizko aldagaiak: Inserts the user's name Erabiltzaile izena sartzen du Inserts the current date Unean-uneko data sartzen du Inserts the current time Unean-uneko ordua sartzen du Inserts the hostname Ostalari izena sartzen du Recorder still running Grabagailua oraindik martxan Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? Grabagailua martxan dagoela gelditzeak, gorde gabeko audioa galtzea ekarriko du. Grabagailua benetan itxi nahi al duzu? Unable to start recording. Not connected to a server. Ezin izan da grabaketa hasi. Ez dago zerbitzarira konektatuta. The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. Zerbitzari honek 1.2.2 bertsioa darabil. Pribatutasun arrazoiengatik, ezin da 1.2.3 baino bertsio zaharragoa darabilten zerbitzarietan grabatu. Mesedez informazio gehiagorako jarri kontaktuan administratzaile batekin. There is already a recorder active for this server. Dagoeneko badago grabagailu bat gaituta zerbitzari honetarako. Please select a recording format. Mesedez, grabaketa formatua aukeratu. Stopping Gelditzen Select target directory Helburuko karpeta aukeratu Downmix WASAPIInput Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone. WASAPISystem Default Device Gailu Lehenetsia qwPTTButtonWidget Mumble PTT Push to talk Sakatu hitz egiteko mumble-1.3.4/src/mumble/ApplicationPaletteTemplate.h0000664000175000017500000000541014010707273022340 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . // See scripts/generate-ApplicationPalette-class.py %(warning)s #ifndef APPLICATIONPALETTE_H #define APPLICATIONPALETTE_H #include #include #ifndef Q_MOC_RUN #include #endif #include #include /// /// Class enabling theming of QApplication::palette from stylesheets. /// /// QPalette cannot be styled which creates issues as not all /// GUI elements in Qt can be styled. This class works around /// that by offering a QPROPERTY for each color role and group /// combination in QPalette. As you can set custom QPROPERTYs /// from stylesheet this allows the user to set all relevant /// palette brushes from the stylesheet. /// /// Due to restrictions on allowed property names as well as a /// mandatory prefix the attributes are exposed as lower cased: /// "qproperty-_". /// /// So a group of QPalette::Active and QPalette::Text role /// would be styled by: /// /// ApplicationPalette { /// qproperty-text_active: #ff0000; /* Set color for active group */ /// } /// /// See http://qt-project.org/doc/qt-4.8/qpalette.html#ColorGroup-enum /// for the available groups and roles. /// /// You can also use the shorthand "qproperty-" to set all groups /// to the same brush. /// /// The class will automatically pick up style changes on itself /// and update the application palette accordingly. To use the class /// simply instantiate it before setting the theme and keep it around /// till the application terminates. /// class ApplicationPalette : public QWidget { Q_OBJECT %(properties)s public: explicit ApplicationPalette(QWidget *p = 0) : QWidget(p) , m_originalPalette(QApplication::palette()){ // Empty } %(getterssetters)s private slots: void updateApplicationPalette() { qWarning() << "Updating application palette"; QPalette newPalette = m_originalPalette; // Do not re-use potentially already styled palette. Might not pick up system style changes though. %(paletteupdates)s QApplication::setPalette(newPalette); resetAllProperties(); } void resetAllProperties() { %(propertyresets)s } protected: bool event(QEvent *e) Q_DECL_OVERRIDE { bool result = QWidget::event(e); if (e->type() == QEvent::StyleChange) { // Update global palette. Have to defer it // as property updates are also signals. QTimer::singleShot(0, this, SLOT(updateApplicationPalette())); } return result; } private: const QPalette m_originalPalette; %(variables)s }; #endif // APPLICATIONPALETTE_H mumble-1.3.4/src/mumble/mumble_pt_BR.ts0000664000175000017500000142644014010707274017644 0ustar builderbuilder ACLEditor Deny Negar Allow Permitir Allow %1 Permitir %1 Deny %1 Negar %1 Mumble - Add channel Mumble - Adicionar Canal Default server value Valor padrão do servidor Failed: Invalid channel Falhou. Canal inválido Mumble - Edit %1 Mumble - Editar %1 ID: %1 ID: %1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Concede o privilégio %1. Se um privilégio é ambos permitido e negado, ele é negado.<br />%2 Channel must have a name Canal deve possuir um nome This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Revoga o privilégio %1. Se um privilégio é ambos permitido e negado, ele é negado.<br />%2 Dialog Diálogo Name Nome Enter the channel name here. Especifique o nome do canal aqui. Description Descrição Password Senha Enter the channel password here. Especifique a senha do canal aqui. Check to create a temporary channel. Marque para criar um canal temporário. Temporary Temporário <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Posição</b><br/> Este valor permite-lhe trocar a forma com que o Mumble ordena os canais na árvore. Um canal com um valor de <i>Posição</i> maior será sempre colocado abaixo daqueles com um valor de posição menor e vice-versa. Se o valor de <i>Posição</i> dos canais é igual, eles são dispostos alfabeticamente pelos seus nomes. Position Posição &Groups &Grupos Group Grupo List of groups Lista de grupos Remove selected group Elimina o grupo selecionado Remove Eliminar Inherit group members from parent Herdar membros de grupo do pai Inherit Herdar Make group inheritable to sub-channels Tornar o grupo herdável para subcanais Inheritable Herdável Group was inherited from parent channel O grupo foi herdado do canal pai Inherited Herdado Members Membros Add Adicionar Add member to group Adicionar membro ao grupo Remove member from group Eliminar membro do grupo &ACL &LCA Active ACLs LCAs ativas List of entries Lista de entradas Inherit ACL of parent? Herdar LCA do pai? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. Ajusta se a LCA acima na cadeia de canais pai se aplica a este objeto ou não. Apenas se herdarão entradas que estiverem marcadas no pai para "Aplicada a subcanais". Inherit ACLs Herdar LCAs Move entry up Mover entrada para cima This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. Move a entrada para cima na lista. Já que as entradas são avaliadas em ordem, isto pode mudar as permissões efetivas dos usuários. Não se pode mover uma entrada acima de uma entrada herdada, se realmente precisar fazer isto, você terá que duplicar a entrada herdada. &Up &Subir Move entry down Mover entrada para baixo This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. Move a entrada para baixo na lista. Já que as entradas são avaliadas em ordem, isto pode mudar as permissões efetivas dos usuários. &Down &Baixar Add new entry Adicionar nova entrada This adds a new entry, initially set with no permissions and applying to all. Adiciona uma nova entrada, inicialmente estabelecida sem permissões e aplicada em tudo. &Add &Adicionar Remove entry Eliminar entrada This removes the currently selected entry. Elimina a entrada selecionada atualmente. &Remove &Eliminar Context Contexto Entry should apply to this channel. Entry should apply to this channel A entrada deve ser aplicada neste canal. This makes the entry apply to this channel. Faz com que a entrada seja aplicada a esse canal. Applies to this channel Aplicada a este canal Entry should apply to sub-channels. A entrada deve ser aplicada nos subcanais. Add new group Adicionar novo grupo <b>Add</b><br/> Add a new group. <b>Adicionar</b><br/> Adiciona um grupo novo. Inherited members Membros herdados Contains the list of members added to the group by this channel. Contém a lista dos membros adicionados ao grupo por este canal. Contains a list of members whose group membership will not be inherited from the parent channel. Contém uma lista de membros cuja associação de grupo não será herdada do canal pai. Contains the list of members inherited by other channels. Contém a lista de membros herdados por outros canais. Type in the name of a user you wish to add to the group and click Add. Digite o nome de um usuário que você quer adicionar ao grupo e clique em Adicionar. Type in the name of a user you wish to remove from the group and click Add. Digite o nome de um usuário que deseja eliminar do grupo e clique em Adicionar. Exclude Ignorar Excluded members Membros ignorados This makes the entry apply to sub-channels of this channel. Faz com que a entrada seja aplicada aos subcanais deste canal. Applies to sub-channels Aplicada a subcanais Permissions Permissões User/Group Usuário/Grupo Group this entry applies to Grupo ao qual a entrada é aplicada User ID ID de usuário User this entry applies to Usuário ao qual a entrada é aplicada This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. Controla a qual usuário essa entrada é aplicada. Apenas digite o nome de usuário e pressione enter para buscar um resultado no servidor. &Properties &Propriedades <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>Nome</b><br />Especifique o nome do canal neste campo. O nome deve cumprir as restrições impostas pelo servidor ao qual está conectado. <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>Temporário</b><br /> Quando marcado o canal criado será marcado como temporário. Isto significa que quando o último usuário sair dele, ele será automaticamente eliminado pelo servidor. <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>Grupo</b><br /> Estes são todos grupos atualmente definidos para o canal. Para criar um novo grupo, apenas digite o nome e pressione enter. <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>Eliminar</b><br />Isto eliminar o grupo selecionado atualmente. Se o grupo foi herdado, ele não será eliminado da lista, mas toda informação local sobre o grupo será limpa. <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>Herdar</b><br />Isto herda todos membros no grupo do pai, se o grupo está marcado como <i>Herdável</i> no canal pai. <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>Herdável</b><br />Isto torna o grupo herdável para subcanais. Se o grupo é não-herdável, subcanais ainda podem criar um novo grupo com o mesmo nome. <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>Herdado</b><br />Isto indica que o grupo foi herdado do canal pai. Você não pode editar esta marcação, ela é apenas informativa. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>Membros</b><br /> Esta lista contém todos os membros que foram adicionados ao grupo pelo canal atual. Lembre-se que isto não inclui membros herdados por níveis mais altos na árvore de canais. Estes podem ser encontrados na lista <i>Membros herdados</i>. Para evitar que esta lista seja herdada por canais de níveis mais baixos, desmarque a opção <i>Herdável</i> ou adicione manualmente os membros à lista <i>Membros ignorados</i>. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>Membros ignorados</b><br /> Contém uma lista de membros cuja associação de grupo não será herdada do canal pai. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. <b>Membros herdados</b><br /> Contém a lista de membros herdados pelo canal atual. Desmarque <i>Herdar</i> para evitar a herança de canais de níveis mais altos. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. Isto controla a qual grupo de usuários esta entrada é aplicada.<br />Perceba que o grupo é avaliado no contexto do canal no qual a entrada é usada. Por exemplo, a LCA padrão no canal Raiz fornece permissão de <i>Escrita</i> para o grupo <i>admin</i>. Esta entrada, se herdada por um canal, fornecerá ao usuário permissões de escrita se ele pertencer ao grupo <i>admin</i> naquele canal, mesmo se ele não pertencer ao grupo <i>admin</i> no canal onde a LCA foi originada.<br />Se um nome de grupo começa com '!', sua associação é negada, e se ele inicia com '~', ele é avaliado no canal onde a LCA foi definida, e não no canal onde a LCA está efetivamente ativa.<br />Se um nome de grupo começa com '#', ele é interpretado como uma credencial de acesso. Usuários devem ter digitado seja o que for que siga o '#' nas suas listas de chaves de acesso, para coincidir com a entrada. Isso pode ser usado para acessos ao canal utilizando senha para usuários não autenticados, de maneira muito simples.<br />Se um nome de grupo começa com '$', ele só vai coincidir usuários cujo hash de certificado coincidir o que está depois do '$'.<br />Alguns grupos predefinidos especiais são:<br /><b>all</b> - Todos vão coincidir.<br /><b>auth</b> - Todos usuários autenticados vão coincidir.<br /><b>sub,a,b,c</b> - Usuário atualmente em um subcanal com um mínimo <i>a</i> de pais comuns, e entre <i>b</i> e <i>c</i> canais abaixo na cadeia. Veja o site para mais documentação sobre este último.<br /><b>in</b> - Usuários atualmente neste canal vão coincidir (conveniência para '<i>sub,0,0,0</i>').<br /><b>out</b> - Usuários fora deste canal coincidirão (conveniência para '<i>!sub,0,0,0</i>').<br />Note que uma entrada aplica para um usuário ou grupo, mas não ambos. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. <b>Senha</b><br />Este campo permite que você especifique e mude facilmente a senha de um canal. Ela usa o recurso de credenciais de acesso do Mumble nos bastidores. Use LCAs e grupos se você precisa de um controle de acesso mais poderoso e detalhado. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. Isto mostra todas entradas ativas neste canal, Entradas herdadas de canais pai será mostradas em itálico.<br />LCAs são avaliadas de cima para baixo, significando que a prioridade aumenta ao se ir para baixo na lista. ID of the channel. ID do canal. Maximum Users Máximo de Usuários Maximum number of users allowed in the channel Número máximo de usuários permitidos no canal <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. <b>Máximo de Usuários</b><br /> Este valor permite que você especifique o número máximo de usuários permitidos no canal. Se o valor for acima de zero, apenas aquele número máximo de usuários será permitido entrar no canal. Se o valor é zero, o número máximo de usuários no canal é definido pelo limite padrão do servidor. This is the sort order for the channel. Esse é o critério de ordenação para o canal. ALSAAudioInput Default ALSA Card Placa ALSA padrão Opening chosen ALSA Input failed: %1 Abrir a Entrada ALSA escolhida falhou: %1 ALSAAudioOutput Default ALSA Card Placa ALSA padrão Opening chosen ALSA Output failed: %1 Abrir a Saída ALSA escolhida falhou: %1 ASIOConfig %1 (version %2) %1 (versão %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz Buffer de amostra %1 → %2, com resolução de amostra de%3 (%4 preferencialmente) em %5 Hz ASIO Initialization failed: %1 Falha na inicialização de ASIO: %1 Failed to instantiate ASIO driver Falha ao instanciar o controlador ASIO ASIO ASIO Device selection Escolha de dispositivo Device Dispositivo Device to use for microphone Dispositivo a usar como microfone This chooses what device to query. You still need to actually query the device and select which channels to use. Escolha qual dispositivo consultar. Você precisará realmente consultar o dispositivo e, selecionar quais canais usar. Query selected device Consultar o dispositivo selecionado This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. Consulta o dispositivo selecionado em busca de canais. Perceba que muitos controladores ASIO são extremamente defeituosos, e consultá-los pode travar o aplicativo ou o sistema. &Query C&onsultar Configure selected device Configure o dispositivo selecionado This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. Configura o dispositivo selecionado. Perceba que muitos controladores ASIO são extremamente defeituosos, e consultá-los pode travar o aplicativo ou o sistema. &Configure &Configurar Capabilities Capacidades Driver name Nome do controlador Buffer size Tamanho do buffer This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. Configura os canais de entrada para ASIO. Tenha certeza de selecionar pelo menos um canal como microfone e alto-falante. <i>Microfone</i> deve ser onde seu microfone está conectado, e <i>Alto-falante</i> deve ser um canal que mostra '<i>O que você ouve</i>'.<br />Por exemplo, na Audigy 2 ZS, uma boa seleção para Microfone seria '<i>Mic L</i>' enquanto Alto-falante seria '<i>Mix L</i>' e '<i>Mix R</i>'. Configure input channels Configurar canais de entrada Channels Canais Microphone Microfone <- <- -> -> Unused Não usado Speakers Alto-falantes ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. Você deve selecionar ao menos uma fonte de microfone e uma de alto-falante para usar ASIO. Se você só precisa de amostras de microfone, use DirectSound. Opening selected ASIO device failed. No input will be done. Falha ao abrir o dispositivo ASIO. Nenhuma entrada será feita. AboutDialog About Mumble Sobre o Mumble <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> <h3>Mumble (%1)</h3><p>%3</p><p>Tradução para o Português do Brasil por<br />Morris Arozi Moraes <morrisarozi@gmail.com></p><p><b>Uma utilidade de conversa por voz para gamers</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble &Sobre o Mumble &License &Licença A&uthors A&utores &Third-Party Licenses Licenças de &Terceiros OK OK AudioInput Interface Interface System Sistema Input method for audio Método de entrada para áudio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Este é o método de entrada para usar para áudio.</b><br />Muito provavelmente você quer usar DirectSound. Device Dispositivo Input device for audio Dispositivo para entrada de áudio <b>This is the input device to use for audio.</b> <b>Este é o dispositivo de entrada a ser usado para áudio.</b> Transmission Transmissão &Transmit &Transmitir When to transmit your speech Quando transmitir sua fala <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. <b>Define quando sua fala deve ser transmitida.</b><br /><i>Contínua</i> - Todo o tempo<br /><i>Atividade vocal</i> - Quando você fala claramente.<br /><i>Pressionar Para Falar</i> - Quando você pressionar a tecla de atalho escolhida em <i>Atalhos</i>. DoublePush Time Tempo para DuploPressionar If you press the PTT key twice in this time it will get locked. Se pressionar a tecla PPF duas vezes neste tempo ela ficará travada. <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. <b>Tempo para DuploPressionar</b><br />Se você pressionar a tecla para falar duas vezes durante o intervalo de tempo configurado ela ficará travada. O Mumble continuará transmitindo até que você pressione-a uma vez mais para destravar o PPF de novo. Reset audio cue to default Resetar notificação de áudio para padrão <b>Reset</b><br/>Reset the paths for the files to their default. <b>Resetar</b><br/>Reseta os caminhos para os arquivos para os padrões. Browse for on audio file Procurar por um arquivo de áudio para Ativo Browse for off audio file Procurar por um arquivo de áudio para Inativo Off Inativo On Ativo Preview the audio cues Prever notificações sonoras Use SNR based speech detection Usar detecção de áudio baseada em SNR Signal to Noise Sinal/ruído <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. <b>Configura a detecção de fala para usar Amplitude.</b><br />Neste modo, a força bruta do sinal de entrada é usado para detectar fala. Amplitude Amplitude Voice &Hold &Persistência de voz How long to keep transmitting after silence Quanto tempo continuar a transmissão após silêncio Silence Below Silêncio abaixo <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. <b>Estabelece os gatilhos para a detecção de voz.</b><br />Use isto junto com a janela de Estatísticas de Áudio para afinar manualmente os valores para o gatilho de detecção de voz. Valores de entrada baixo de "Silêncio abaixo" sempre contam como silêncio. Valores acima de "Fala acima" sempre contam como voz. Valores entre ambos contam como voz se você já está falando, mas não levam a uma nova detecção. Speech Above Fala acima Signal values above this count as voice Sinal acima disto conta como voz Compression Compressão &Quality &Qualidade Quality of compression (peak bandwidth) Qualidade da compressão (pico de banda) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. <b>Configura a qualidade da compressão.</b><br />Determina quanta banda o Mumble pode usar para transmissão de áudio. Audio per packet Áudio por pacote How many audio frames to send per packet Quantos quadros de áudio para enviar por pacote <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>Seleciona quantos quadros de áudio devem ser colocados em um pacote.</b><br />Aumentar isto também aumentará a latência para sua voz, reduzindo as exigências de banda. <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). <b>Mostra o pico da banda de transmissão usada.</b><br />Mostra o pico na quantia de banda enviada da sua máquina. A taxa de áudio é a taxa máxima (já que usamos VBR) para os dados de áudio sozinhos. Posição é a taxa usada para informação posicional. Sobrecarga são nossos quadros e cabeçalhos de pacotes IP (IP e UDP são 75% desta sobrecarga). Audio Processing Processamento de áudio Noise Suppression Supressão de Ruídos Noise suppression Supressão de ruídos <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. <b>Configura a quantia de supressão de ruído aplicada.</b><br />Quão maior este valor, mais agressivamente o ruído estacionário será suprimido. Maximum amplification of input sound Amplificação máxima do som de entrada <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. <b>Amplificação máxima da entrada.</b><br />O Mumble normaliza o volume de entrada antes da compressão, e isso configura o quanto ele pode amplificar.<br />O nível real é continuamente atualizado baseado no seu padrão atual de fala mas, nunca passará do nível aqui especificado.<br />Se o nível da <i>Altura do microfone</i> das estatísticas de áudio tende a ficar perto dos 100%, você provavelmente quer configurar o valor aqui para 2.0 ou algo parecido mas se, como a maioria das pessoas, você é incapaz de chegar aos 100%, configure o valor muito mais alto.<br />Idealmente, configure de modo que <i>Altura do microfone * Fator de Amplificação >= 100</i>, mesmo quando você está falando baixo.<br /><br />Note que não há dano em configurar o valor aqui para o máximo, mas o Mumble começará a transmitir outras conversas se você deixá-lo auto-afinado para tal nível. Current speech detection chance Probabilidade atual de detecção da fala Cancel echo from speakers Anular eco dos alto-falantes Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. Ativar isto vai cancelar o eco de seus alto-falantes. Misto tem pouco impacto no uso de CPU, mas só funciona direito se seus alto-falantes são igualmente altos e equidistantes do microfone. Anulação multicanal de eco fornece uma anulação muito melhor, mas a um custo de CPU maior. Disabled Desativado <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>Configura a detecção de fala usada na taxa de Sinal para Ruído.</b><br />Nesse modo, a entrada é analisada em busca de algo lembrando um sinal limpo, e a clareza deste sinal é usada para ativar a detecção de fala. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>Mostra as configurações atuais de detecção de fala.</b><br />Você pode mudar as configurações no diálogo de Configurações ou no Assistente de Áudio. Signal values below this count as silence Valores de sinal abaixo disto contam como silêncio Maximum bandwidth used for sending audio Banda máxima usada para enviar áudio Use Amplitude based speech detection Usar Amplitude baseada na detecção de fala <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). <b>Seleciona por quanto tempo após uma perceptível parada na fala a transmissão deve continuar.</b><br />Configure isso mais alto se sua voz quebra durante sua fala (percebido pelo ícone de voz piscando rapidamente ao lado do seu nome). Exclusive mode Modo exclusivo <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>Abre o dispositivo em modo exclusivo.</b><br />Nenhum outro aplicativo será capaz de utilizá-lo. Exclusive Exclusivo R&eset R&esetar &Browse... &Procurar... B&rowse... N&avegar... &Preview &Prever <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. <b>Prever</b><br/>Toca o som padrão <i>Ativo</i> seguido do som <i>Inativo</i> atual. Displays an always on top window with a push to talk button in it Mostra uma janela sempre no topo com um botão de pressionar para falar, nela. Display push to talk window Mostrar janela pressionar para falar Misc Misc Audible audio cue when starting or stopping to transmit Aviso audível ao começar ou parar de transmitir <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. <b>Isso ativa pistas da transmissão de áudio.</b><br />Ativar isso lhe trará um curto bipe ao começar e terminar de transmitir. Audio cue Aviso de áudio Gets played when starting to transmit É usado no começo da transmissão Gets played when stopping to transmit É usado no final da transmissão Hold Time Tempo Mantido Time the microphone stays open after the PTT key is released Tempo que o microfone fica aberto após a tecla PPF ser solta Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) A largura máxima de banda do servidor é apenas %1 kbit/s. Qualidade de áudio ajustada para %2 kbit/s (%3 ms) Max. Amplification Amplificação Máx. Idle action Ação ociosa minutes do minutos fazer nothing nada deafen ensurdecer mute emudecer after após Echo Cancellation Atenuação de Eco Mixed echo cancellation Atenuação de eco misto Multichannel echo cancellation Atenuação de eco multicanal The idle action will be reversed upon any key or mouse button input A ação ausente será revertida por qualquer modificação de mouse ou teclas Undo Idle action upon activity Desfazer Ausência por atividade Apply RNNoise's noise suppression filter. Aplicar filtro de ruídos do RNNoise. <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. <b>Isso aplica o filtro de supressão de ruídos do RNNoise.</b><br />RNNoise é baseado em aprendizado de máquina e usado no WebRTC. RNNoise RNNoise Audio input AudioInputDialog Continuous Contínuo Voice Activity Atividade de voz Push To Talk Pressionar Para Falar Audio Input Entrada de Áudio %1 ms %1 ms Off Inativo %1 s %1 s %1 kb/s %1 kb/s -%1 dB -%1 dB %1 kbit/s (Audio %2, Position %4, Overhead %3) %1 kbit/s (Áudio %2, Posição %4, Sobrecarga %3) AudioOutput Interface Interface System Sistemas Output method for audio Método de saída para Áudio <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Este é o método de saída para o áudio</b><br />Provavelmente você quer usar DirectSound. Device Dispositivo Output device for audio Dispositivo de saída para áudio <b>This is the output device to use for audio.</b> <b>Este é o dispositivo de saída para usar para o áudio.</b> Positional Audio Áudio Posicional Audio Output Saída de Áudio Default &Jitter Buffer Buffer &Jitter Padrão Safety margin for jitter buffer Margem de segurança para o buffer jitter <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. <b>Isto configura a margem mínima de segurança para o buffer jitter.</b><br />Todo áudio recebido é armazenado em buffer, e o buffer jitter busca continuamente empurrar o buffer para o tamanho mínimo suportado pela sua rede, diminuindo a latência. Configure o tamanho do buffer para o menor possível. Se o começo das frases recebidas é muito irregular, aumente esse valor. Minimum distance to user before sound volume decreases Distância mínima do usuário antes que o volume do som diminua This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. Configura a distância mínima para cálculos de som. O volume da fala dos usuários não irá diminuir antes de, no mínimo, esta distância de você. This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. Configura a distância máxima para cálculos de som. Quando além desta distância, o volume de fala de outros usuários não vai diminuir nada a mais. <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. <b>Configura os métodos de teste de retorno.</b><br /><i>Nenhum</i> - Retorno desativado<br /><i>Local</i> - Emula um servidor local.<br /><i>Servidor</i> - Pede retorno do servidor.<br />Por favor note que quando o retorno está ativo, nenhum outro usuário ouvirá sua voz. Esta configuração não é salva ao finalizar o programa. Volume Volume Volume of incoming speech Volume para fala recebida <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. <b>Configura o volume da fala recebida.</b><br />Note que se você aumentar isso além de 100%, o áudio será distorcido. Output Delay Atraso de Saída Amount of data to buffer Quantia de dados a armazenar em buffer The connected "speakers" are actually headphones The connected "speakers" are actually headphones. Os "alto-falantes" conectados são na realidade fones de ouvido Factor for sound volume decrease Fator para redução do volume Bloom Floração Factor for sound volume increase Fator para aumento do volume How much should sound volume increase for sources that are really close? Quanto o volume deve aumentar para fontes que estão realmente próximas? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. Marcar isto indica que você não tem alto-falantes conectados, apenas fones de ouvido. Isso é importante, já que alto-falantes geralmente ficam na sua frente, enquanto que fones de ouvido ficam diretamente à sua esquerda/direita. This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Configura a quantia de dados a pré-armazenar no buffer de saída. Experimente com valores diferentes e configure para o menor valor que não causa irregularidades repentinas no som. Headphones Fones de ouvido Minimum Distance Distância Mínima Maximum Distance Distância Máxima Maximum distance, beyond which speech volume won't decrease Distância máxima, depois da qual o volume da fala não diminuirá Minimum Volume Volume mínimo What should the volume be at the maximum distance? Qual deve ser o volume na distância máxima? Loopback Test Teste de Retorno Delay Variance Variação do Atraso Variance in packet latency Variação na latência do pacote <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>Configura a variação da latência de pacote para o teste de retorno.</b><br />A maior parte dos caminhos de áudio contêm alguma latência variável. Isso permite que você configure a latência para o modo de teste de retorno. Por exemplo, se você escolher 15ms, isso vai emular uma rede com ping de 20-35ms ou uma com 80-95ms de latência. A maioria das redes domésticas têm uma variação de cerca de 5ms. Packet Loss Perda de Pacotes Packet loss for loopback mode Perda de pacotes para o modo de retorno <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% <b>Configura a perda de pacotes para o modo de retorno.</b><br />Esta vai ser a taxa de pacotes perdidos. A menos que a sua banda de saída esteja sobrecarregada ou se há algo de errado com a sua conexão de rede, isso será 0% &Loopback &Retorno Desired loopback mode Modo de retorno desejado Attenuate applications by... Atenuar aplicativos por... Attenuation of other applications during speech Atenuação de outros programas durante a fala <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. <b>Atenuar volume dos outros programas durante a fala</b><br />O Mumble suporta a diminuição do volume de outros programas durante a entrada/saída de fala. Configura a atenuação de outros programas quando ativo. If checked Mumble lowers the volume of other applications while other users talk Se marcado o Mumble diminui o volume de outros programas enquanto outros usuários falam <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. <b>Atenuar aplicativos enquanto outros usuários falam</b><br />O Mumble suporta a diminuição do volume de outros programas durante a entrada e saída de fala. Isto faz com que o mumble ative o recurso enquanto outros falam com você. while other users talk enquanto outros falam If checked Mumble lowers the volume of other applications while you talk Se marcado o Mumble diminui o volume de outros aplicativos enquanto você fala <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. <b>Atenuar aplicativos enquanto você fala</b><br />Mumble suporta a diminuição do volume de outros programas durante o recebimento ou envio de fala. Isto faz com que o mumble ative o recurso enquanto você fala. while you talk enquanto você fala Exclusive mode, not recommended. Modo exclusivo, não recomendado. <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>Abre o dispositivo em modo exclusivo</b><br />Nenhum outro aplicativo poderá usar o dispositivo. Exclusive Exclusivo Priority Speaker Falante Prioritário If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. Se marcado o Mumble diminui o volume dos outros usuários enquanto você fala se você tiver status de "Falante Prioritário". <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. <b>Atenuar outros usuários ao falar como Falante Prioritário.</b><br />O Mumble permite reduzir o volume de outros usuários enquanto você fala como o <i>Falante Prioritário</i> para evitar ser perturbado. Marcar esta opção ativa esse recurso. Attenuate other users while talking as Priority Speaker. Atenuar outros usuários enquanto fala como Falante Prioritário. Advanced Attenuation Options Opções de Atenuação Avançada If checked, Mumble will only attenuate applications that are using the same output source as Mumble Se marcada, o Mumble irá atenuar apenas aplicações que estão usando a mesma fonte de saída do Mumble <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. <b>Atenuar apenas aplicações usando a mesma saída do Mumble.</b><br />Se marcado, aplicações que usam saídas diferentes da usada pelo Mumble não serão atenuadas. Only attenuate applications using the same output device Atenuar apenas aplicações usando o mesmo dispositivo de saída If checked, PulseAudio loopback modules will be attenuated Se marcado, os módulos de retorno do PulseAudio serão atenuados <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. <b>Atenuar módulos de retorno do PulseAudio</b><br />Se módulos de retorno estão ligados aos dispositivos/destinos de saída do Mumble, eles serão atenuados também. Attenuate PulseAudio loopback modules Atenuar módulos de retorno do PulseAudio Audio output AudioOutputDialog None Nenhum Local Local Server Servidor Audio Output Saída de Áudio %1 ms %1 ms %1 % %1 % %1 m %1 m AudioOutputSample Choose sound file Escolha o arquivo de som Invalid sound file Arquivo de som inválido The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. O arquivo '%1' não pode ser usado pelo Mumble. Por favor escolha um arquivo de formato e codificação compatíveis. AudioStats >1000 ms >1000ms >1000 ms Audio Statistics Estatísticas de Áudio Input Levels Níveis de Entrada Peak microphone level Nível máximo do microfone Peak power in last frame Potência máxima no último quadro This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. Mostra a potência máxima no último quadro (20 ms), e é a mesma medida que você geralmente encontra como "potência de entrada". Por favor desconsidere isto e veja <b>Potência do microfone</b>, que é muito mais regular e desconsidera extremos. Peak speaker level Nível máximo de alto-falante This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. Mostra o pico de potência dos alto-falantes no último quadro (20ms). A menos que você esteja usando um método de amostra multicanal (como ASIO) com alto-falantes configurados, isto será 0. Se você possui tal instalação configurada, e isto ainda mostra 0 enquanto você está tocando áudio de outros programas, sua configuração não está funcionando. Peak clean level Pico de nível limpo This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. Mostra a potência máxima no último quadro (20ms) depois de todo processamento. Idealmente, isto deve ser -96 dB quando você não está falando. Na realidade, um estúdio sonoro deve ver -60 dB, e com sorte você deve ver algo ao redor de -20 dB. Quando você está falando, isto deve aumentar para algo em torno de -5 e -10 dB.<br />Se você está usando anulação de eco, e isto aumenta para mais de -15 dB quando você não está falando, sua configuração não está funcionando, e você vai incomodar outros usuários com ecos. Signal Analysis Análise de sinal Microphone power Potência do microfone How close the current input level is to ideal Quão próximo o nível de entrada atual está do ideal This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. Mostra quão perto seu volume de entrada atual está do ideal. Para ajustar o nível do seu microfone, abra seja qual for o programa que você usa para configurar o volume de gravação, e olha para o valor enquanto fala.<br /><b>Fale alto, como você faria quando você está incomodado por ser morto por um novato.</b><br />Ajuste o volume até que este valor esteja próximo a 100%, mas certifique-se que ele não vá acima, é provável que você consiga cliques em partes da sua fala que vão degradar a qualidade do som. Signal-To-Noise ratio Relação sinal/ruído Signal-To-Noise ratio from the microphone Taxa sinal/ruído do microfone This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. Esta é a relação sinal/ruído (SNR) do microfone no último quadro (20 ms). Ele mostra quão mais clara a voz é compara com o ruído.<br />Se este valor está abaixo de 1.0, há muito mais ruído do que voz no sinal, e então a qualidade é reduzida.<br />Não há um limite superior para este valor, mas não espere ver muito acima de 40-50 sem um estúdio de som. Speech Probability Probabilidade de Fala Probability of speech Provabilidade de fala This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). Este é provavelmente o último quadro (20 ms) que era fala e não ruído ambiente.<br />Transmissão da atividade vocal depende disto estar certo. O truque com isto é que o meio da sentença é sempre detectado como fala; o problema são as pausas entre as palavras e o começo da fala. É difícil distinguir um suspiro de uma palavra começando com 'h'.<br />Se isto está em negrito, significa que o Mumble está transmitindo atualmente (se você está conectado). Configuration feedback Retroalimentação de configuração Current audio bitrate Velocidade atual de transmissão de áudio Bitrate of last frame Velocidade do último quadro DoublePush interval Intervalo de DuploPressionar Time between last two Push-To-Talk presses Tempo entre os dois últimos pressionamentos de Pressionar-para-Falar Speech Detection Deteção de fala Current speech detection chance Probabilidade atual de deteção de fala <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>Mostra as configurações atuais de detecção de fala</b><br />Você pode mudar as configurações do diálogo d Configurações ou do Assistente de áudio. Signal and noise power spectrum Espectro de potência de sinal e ruído Power spectrum of input signal and noise estimate Espectro de potência do sinal de entrada e estimativa de ruído This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. Mostra o espectro da potência do sinal de entrada atual (linha vermelha) e a estimativa de ruído atual (azul preenchido).<br />Todas amplitudes são multiplicadas por 30 para mostrar as partes interessantes (quão mais sinal do que ruído está presente em cada banda de onda).<br />Provavelmente isto só é de interesse se você está tentando afinar condições de ruído no seu microfone. Sob boas condições, deve haver apenas uma pequena agitação de azul no fundo. Se o azul é mais do que metade do gráfico, você tem um ambiente bem ruidoso. Echo Analysis Análise de eco Weights of the echo canceller Pesos do anulador de eco This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. Mostra os pesos do cancelador de ecos, com o tempo aumentando para baixo e a frequência para a direita.<br />Idealmente, isto deve ser preto, indicando que nenhum eco existe. Mais comumente, você verá uma ou mais listras horizontais de tom azul representando eco com tempo atrasado. Você deve ser capaz de ver os pesos atualizados em tempo real.<br />Por favor note que enquanto você não tiver nada para ecoar, você não verá muitos dados úteis aqui. Toque alguma música e as coisas devem estabilizar.<br />Você pode escolher ver as partes reais ou imaginárias dos pesos no domínio da frequência, ou alternativamente a fase e o módulo calculados. Os mais úteis destes provavelmente serão o módulo, que é a amplitude do eco, e mostra quanto do sinal transmitido está sendo eliminado naquela etapa no tempo. Os outros modos de visão são mais úteis para pessoas que querem melhorar os algoritmos de anulação de echo.<br />Por favor note: Se a imagem inteira flutua massivamente no modo de módulo, o anulador de eco falha ao encontrar qualquer correlação entre as duas fontes de entrada (alto-falantes e microfone). Ou você possui um atraso muito longo no eco, ou as fontes de entrada estão configuradas errado. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. Esta é a taxa de áudio para o último quadro comprimido (20 ms), e como tal irá pular para cima e para baixo conforme o VBR ajusta a qualidade. O pico da taxa de bits pode ser ajustado no diálogo de Configuração. AudioWizard Audio Tuning Wizard Assistente para Ajuste do Áudio Introduction Introdução Welcome to the Mumble Audio Wizard Bem-vindo ao Assistente para Ajuste do Áudio do Mumble Finished Finalizado Enjoy using Mumble Desfrute do uso do Mumble Device selection Escolha de dispositivo Selecting the input and output device to use with Mumble. Selecionar o dispositivo de entrada e saída para usar com o Mumble. This is the device your microphone is connected to. Este é o dispositivo ao qual o seu microfone está conectado. System Sistema Input method for audio Método de entrada para áudio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Este é o método de entrada para usar para o áudio.</b><br />Provavelmente você quer usar DirectSound. Device Dispositivo Input device to use Dispositivo de entrada a usar <b>Selects which sound card to use for audio input.</b> <b>Seleciona qual placa de som a usar para entrada de áudio.</b> Cancel echo from headset or speakers Anular eco das caixas de som ou fones de ouvido Use echo cancellation Usar anulação de eco This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. Isto ativa a anulação de eco para o áudio enviado, o que ajuda em ambos fones de ouvido e alto-falantes. This is the device your speakers or headphones are connected to. Este é o dispositivo ao qual seus alto-falantes ou fones de ouvido estão conectados. Output method for audio Método de saída para áudio <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Este é o método de saída para usar para o áudio.</b><br />Provavelmente você quer usar DirectSound. Output device to use Dispositivo de saída a usar <b>Selects which sound card to use for audio Output.</b> <b>Seleciona qual placa de som a usar para saída de áudio.</b> Enable positional audio Ativar áudio posicional Allows positioning of sound Allows positioning of sound. Permitir posicionamento de som <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> <p> Este é o assistente para ajuste de áudio do Mumble. Ele vai ajudá-lo a configurar corretamente os níveis de entrada para sua placa de som, e também os parâmetros para processamento de som no Mumble. </p> <p> Por favor lembre-se que enquanto o assistente estiver ativo, o som será retornado localmente para permitir que você o escute, e nenhum áudio será enviado para o servidor. </p> Input Device Dispositivo de Entrada Output Device Dispositivo de Saída This allows Mumble to use positional audio to place voices. Isto permite que o Mumble use áudio posicional para posicionar vozes. <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> <p> Para manter a latência em um mínimo absoluto, é importante que o buffer na placa de som tenha menor tamanho possível. No entanto, muitas placas de som anunciam precisar de um buffer muito menor do que elas realmente aceitam, então o único modo de configurar este valor é por tentativa e erro. </p> <p> Você deve ouvir um exemplo de fala. Mude a barra deslizante abaixo para o menor valor que garanta <b>nenhuma</b> interrpução ou irregularidade no som. Por favor note que o eco local é desativado durante este teste. </p> Amount of data to buffer Quantia de dados a armazenar em buffer This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Configura a quantidade de dados a pré-armazenar no buffer de saída. Experimente com diferentes valores e use o menor que não cause irregularidades no som. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> <p> Abra seus painel de controle de som e vá para as configurações de gravação. Tenha certeza de que o microfone está marcado como ativo e com o máximo de volume. Se houver uma opção para ativar o "Aumento de sensibilidade", certifique-se de marcá-la. </p> <p> Fale alto, como quando você está incomodado ou animado. Diminua o volume no painel de controle até que a barra baixo fique o mais alto possível no azul e verde, mas <b>não</b> na zona vermelha enquanto você fala. </p> Positional Audio Áudio Posicional Adjusting attenuation of positional audio. Ajustar atenuação do áudio posicional. <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> <p> O Mumble suporta áudio posicional para alguns jogos, e vai posicionar a voz de outros usuários relativa a posição deles no jogo. Dependendo da posição deles, o volume da voz será alterada nos alto-falantes para simular a direção e distância que o outro usuário está. Tal posicionamento depende da configuração do seu alto-falante estar correta no seu sistema operativo, então um teste é feito aqui. </p> <p> O gráfico abaixo mostra a posição de <font color="red">você</font>, os <font color="yellow">alto-falantes</font> e uma <font color="green">fonte móvel de áudio</font> vista de cima. Você deve ouvir o áudio mover entre os canais. </p> Use headphones instead of speakers Use fones de ouvido ao invés de alto-falantes <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> <p> Parabéns. Você deve estar pronto para aproveitar uma experiência de som mais rica com o Mumble. </p> <p> O Mumble está sob constante desenvolvimento, e a equipe de desenvolvimento quer se focar nos recursos que beneficiem a maioria dos usuários. Para este fim, o Mumble suporta o envio de estatísticas anônimas sobre a sua configuração para os desenvolvedores. Estas estatísticas são essenciais para o desenvolvimento futuro, e também asseguram que recursos que você use não serão depreciados. </p> Use headphones Usar fones de ouvido This ignores the OS speaker configuration and configures the positioning for headphones instead. Ignora a configuração de alto-falantes do SO e configura o posicionamento para fones de ouvido em seu lugar. Volume tuning Ajuste de Volume Tuning microphone hardware volume to optimal settings. Ajustando o volume do hardware para níveis ideais. Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. Agora fale suavemente, como você falaria tarde da noite, quando você não quer perturbar ninguém. Ajuste a barra de rolagem abaixo de modo que a barra se mova até o verde quando você fala, mas permaneça no azul do contrário. Voice Activity Detection Detecção de Atividade de Voz Letting Mumble figure out when you're talking and when you're silent. Permitir que o Mumble suponha quando você está falando e quando você está calado. This will help Mumble figure out when you are talking. The first step is selecting which data value to use. Ajuda o Mumble a supor quando você fala. O primeiro passo é selecionar que valor de dados a usar. Raw amplitude from input Amplitude bruta da entrada Signal-To-Noise ratio Relação sinal-ruído Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). A seguir você precisa ajustar a seguinte barra de rolagem. As primeiras palavras que você falar devem chegar a área verde (definitivamente fala). Enquanto você fala você deve ficar dentro do amarelo (pode ser fala) e quando você não estiver falando tudo deve ficar no vermelho (definitivamente não é fala). Device tuning Ajuste de dispositivo Changing hardware output delays to their minimum value. Alterar os atrasos de saída de hardware para o seu valor mínimo. Submit anonymous statistics to the Mumble project Enviar estatísticas anônimas ao projeto Mumble Push To Talk: Pressionar Para Falar: Quality & Notifications Qualidade & Notificações Adjust quality and notification settings. Ajustar qualidade e configurações de notificações. Quality settings Configurações de qualidade Low Baixa Balanced Equilibrada Notification settings Configurações de notificação Use Text-To-Speech to read notifications and messages to you. Usar Texto-para-Fala para ler mensagens de notificação para você. Disable Text-To-Speech and use sounds instead. Desativar Texto-para-Fala e usar sons em seu lugar. %1 ms %1 ms Enables attenuation of other applications while users talk to you Ativar atenuação de outros aplicativos enquanto usuários falam com você Attenuate applications while other users talk Atenuar aplicativos enquanto outros falam High Alta Custom Pessoal You already set a customized quality configuration in Mumble. Select this setting to keep it. Você já escolheu uma configuração pessoal de qualidade no Mumble. Selecione esta opção para mantê-la. Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. Ativa a atenuação de outros aplicativos enquanto usuários falam com você. Isso significa que, assim que alguém começa a falar com você no Mumble, o som de todos os outros programas (como tocadores de áudio) será atenuado para que você possa ouvi-los mais claramente. Apply some high contrast optimizations for visually impaired users Aplicar algumas otimizações de alto contraste para usuários com deficiência visual Use high contrast graphics Usar gráficos de alto contraste Keep custom Text-To-Speech settings. Manter configurações personalizadas de Texto-para-Fala. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode <p> Abra o seu painel de controle de som e bá para as configurações de gravação. Certifique-se de que o Microfone está seleciona como a entrada ativa e está com o máximo de volume. Se há uma opção para ativar o "Aumento de sensibilidade" lembre-se de marcá-la. </p> <p> Fale alto, como quando você está incomodado ou animado. Diminua o volume no painel de controle até que a barra abaixo fique o mais alto possível na listrada e vazia, mas <b>não</b> na zona xadrez enquanto você fala. </p> Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode Agora fale suavemente, como você falaria tarde da noite, quando você não quer perturbar ninguém. Ajuste a barra de rolagem abaixo de modo que a barra se mova até a zona vazia quando você fala, mas, permaneça na listrada assim que você ficar em silêncio. Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode A seguir você precisa ajustar a barra de rolagem abaixo. As primeiras palavras que você falar devem chegar até a área vazia (definitivamente fala). Enquanto você fala, ela deve ficar dentro da área listrada (pode ser fala) e, quando você não estiver falando, tudo deve ficar na área xadrez (definitivamente não é fala). In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) Nesta configuração o Mumble usará <b>baixa quantia de banda</b>. Isso inevitavelmente resultará em alta latência e qualidade ruim. Escolha essa opção somente se sua conexão não suportar as outras configurações. (16kbit/s, 60ms por pacote) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) Esta é a configuração <b>padrão recomendada</b>. Ela fornece um bom equilíbrio entre qualidade, latência e uso de banda. (40 bit/s, 20ms por pacote) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) Esta configuração só é recomendada em situações em que a largura de banda não é problema, como uma rede local. Ela fornece a menor latência suportada pelo Mumble e <b>alta qualidade</b>. (72kbit/s, 10ms por pacote) BanEditor Mumble - Edit Bans Mumble - Editar Banimentos &Address &Endereço &Mask &Máscara Reason Motivo Start Início End Fim User Usuário Hash Hash &Add &Adicionar &Update At&ualizar &Remove &Eliminar Ban List Lista de Banidos Search field Campo de busca This is the search field. Use it to find bans that have this username set in the username field. Este é o campo de busca. Use-o para encontrar banidos que possuem esse nome de usuário no campo de nome de usuário. Who are you looking for? Quem você procura? No nickname Nenhum apelido IP address Endereço IP No IP address Nenhum endereço IP Reason for the ban Motivo para o banimento No reason Nenhum motivo Ban end date Data final do banimento Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). Data final do banimento. Se você definir a mesma data para início e fim, o banimento será permanente (não expira). Certificate hash Hash de certificado No certificate hash Nenhum hash de certificado Banned users Usuários banidos This is a list with banned users. Esta é uma lista de usuários banidos. Use this button if you want to add a new ban. Use esse botão se você quer adicionar um novo banimento Use this button if you want to update ban information. Use esse botão se você quer atualizar a informação de banimento Use this button if you want to remove user from the ban list. Use esse botão se você quer remover o usuário da lista de banidos. Clear all fields Limpar todos os campos This button clears all fields. Use it if you want to add a new ban. Esse botão limpa todos os campos. Use-o se quiser adicionar um novo banimento Clear Limpar Ban List - %n Ban(s) Lista de Banidos - %n Banimento(s)Lista de Banidos - %n Banimento(s) CertView Name Nome Email Email Issuer Emissor Expiry Date Data de Expiração (none) (nenhum) Self-signed Autoassinado CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. Impossível validar email.<br />Especifique um email válido (ou em branco) para continuar. There was an error generating your certificate.<br />Please try again. Houve um erro gerando seu certificado.<br />Por favor tente novamente. Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. Seu certificado e chave não podem ser exportados para o formato PKCS#12. Pode haver um erro em seu certificado. The file could not be opened for writing. Please use another file. O arquivo não pôde ser aberto para escrita. Por favor use outro arquivo. The file's permissions could not be set. No certificate and key has been written. Please use another file. As permissões de arquivo não puderam ser alteradas. Nenhum certificado e chave foram escritos. Por favor use outro arquivo. The file could not be written successfully. Please use another file. O arquivo não pôde ser escrito com sucesso. Por favor use outro arquivo. The file could not be opened for reading. Please use another file. O arquivo não pôde ser aberto para leitura. Por favor use outro arquivo. The file is empty or could not be read. Please use another file. O arquivo está vazio ou não pôde ser lido. Por favor use outro arquivo. The file did not contain a valid certificate and key. Please use another file. O arquivo não continha um certificado e chave válidos. Por favor use outro arquivo. Select file to export certificate to Selecione o arquivo para o qual exportar o certificado Select file to import certificate from Selecione o arquivo do qual importar o certificado Unable to import. Missing password or incompatible file type. Impossível importar. Senha perdida ou arquivo incompatível. <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. <b>Expiração do Certificado:</b> Seu certificado está para expirar. Você precisa renová-lo, ou você não será mais capaz de conectar aos servidores em que está registrado. Certificates Certificate Management Gerenciamento de Certificados Certificate Authentication Autenticação de Certificado Authenticating to servers without using passwords Autenticar em servidores sem usar senhas Current certificate Certificado atual This is the certificate Mumble currently uses. Este é o certificado que o Mumble usa atualmente. Current Certificate Certificado Atual Create a new certificate Criar um novo certificado This will create a new certificate. Criará um novo certificado. Import certificate from file Importar certificado de arquivo This will import a certificate from file. Importará certificado de arquivo. Import a certificate Importar um certificado Export Certificate Exportar Certificado This will export a certificate to file. Exportará um certificado para um arquivo. Export current certificate Exportar certificado atual Import Certificate Importar Certificado PKCS #12 Certificate import Importar certificado PKCS #12 <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>O Mumble pode importar certificados salvos no formato PKCS #12. Esse é o formato usado ao exportar uma chave do Mumble, e também ao exportar chaves do Firefox, Internet Explorer, Opera, etc.</p><p>Se o arquivo é protegido com senha, você precisará da senha para importar o certificado.</p> Import from Importar de Filename to import from Nome do arquivo do qual importar This is the filename you wish to import a certificate from. Este é o nome do arquivo do qual você pretende importar um certificado. Select file to import from Selecione um arquivo do qual importar This opens a file selection dialog to choose a file to import a certificate from. Abre um diálogo de seleção de arquivo para escolher um arquivo do qual importar certificado. Open... Abrir... Password Senha Password for PKCS#12 file Senha para arquivo PKCS #12 This is the password for the PKCS#12 file containing your certificate. Esta é a senha para o arquivo PKCS #12 contendo seu certificado. Certificate to import Certificado a importar This is the certificate you are importing. Este é o certificado que você está importando. Certificate Details Detalhes do certificado Replace Certificate Substituir certificado Replace existing certificate with new certificate? Substituir certificado atual com novo certificado? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> <p>Você já possui um certificado salvo no Mumble, e esta prestes a substituí-lo.</p> <p>Se você está atualizando um certificado emitido pela sua AC confiável e o endereço de e-mail coincide com o seu certificado atual, isto é totalmente seguro, e servidores aos quais você se conectar vão reconhecer automaticamente o certificado robusto para seu endereço de email. </p> <p>Se este não é o caso, você não será mais reconhecido em nenhum servidor onde você se autenticou. Se você ainda não se registrou em nenhum servidor, isto também não é nada para se preocupar. </p> <p> Você tem certeza de que quer substituir o seu certificado? </p> This is the certificate Mumble currently uses. It will be replaced. Este é o certificado que o Mumble usa atualmente. Ele será substituído. New certificate Novo certificado This is the new certificate that will replace the old one. Este é o novo certificado que substituirá o antigo. New Certificate Novo cerificado Make a backup of your certificate Fazer uma cópia de segurança do seu certificado Export to Exportar para Filename to export to Nome do arquivo para o qual exportar This is the filename you wish to export a certificate to. Este é o nome do arquivo para o qual você quer exportar o certificado. Save As... Salvar como... This is the certificate Mumble currently uses. It will be exported. Este é o certificado que o Mumble usa atualmente. Ele será exportado. Generate a new certificate for strong authentication Gerar um novo certificado para autenticação robusta <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> <p>O Mumble gerará um certificado robusto para autenticação nos servidores.</p><p>Se você quiser você pode fornecer algumas informações adicionais que podem ser salvas no certificado, que serão apresentadas aos servidores ao se conectar. Se você fornecer um endereço de email válido, você pode atualizar para um certificado de email emitido por uma AC no futuro, o que fornece uma identificação robusta.</p> Name Nome Email Email Your email address (e.g. johndoe@mumble.info) Seu endereço de email (ex. joaoromao@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. Este é seu endereço de email. Recomenda-se encarecidamente você fornece um endereço de e-mail válido, já que isto permitirá que você atualize para um certificado robusto sem problemas de autenticação. Your name (e.g. John Doe) Seu nome (ex. João Romão) This is your name, and will be filled out in the certificate. This field is entirely optional. Este é seu nome, e será preenchido no certificado. Este campo é inteiramente opcional. Finish Finalizar Certificate-based authentication is ready for use Autenticação baseada em certificado pronta para uso Enjoy using Mumble with strong authentication. Aproveite o Mumble com autenticação robusta. Automatic certificate creation Criação automática de certificado <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>Se você algum dia perder seu certificado atual, o que aconteceria se seu computador sofresse uma falha de hardware ou se você reinstalar sua máquina, você não poderá mais se autenticar em nenhum servidor no qual você se registrou. É portanto <b>mandatório</b> que você faça uma cópia de segurança do seu certificado. Nos recomendamos encarecidamente que você salve esta cópia de segurança em um dispositivo de armazenamento removível, como um pen-drive.</p> <p>Note que este arquivo não será criptografado, e se alguém obtiver acesso a ele, eles serão capazes de se passar por você, então cuide muito bem dele.</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> <p>O Mumble pode usar certificados para autenticar com servidores. Usar certificados evita senhas, o que significa que você não precisa expor nenhuma senha com um local remoto. Ele também permite um registro de usuário muito fácil e uma lista de amigos de cliente que independe dos servidores.</p><p>Embora o Mumble possa funcionar sem certificados, a maioria dos servidores suporá que você tenha um.</p><p>Criar um novo certificado automaticamente é suficiente na maioria dos casos. Mas o Mumble também suporta certificados representando confiança na titulação de um e-mail por parte do usuário. Esses certificados são emitidos por terceiros. Para mais informações consulte nossa <a href="http://mumble.info/certificate.php">documentário de certificado de usuário</a>.</p> ChanACL None Nenhum Traverse Percorrer Enter Entrar Speak Falar Mute/Deafen Emudecer/Ensurdecer Make channel Criar canal Make temporary Criar temporário Link channel Vincular canal This represents no privileges. No representa nenhum privilégio. This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. Representa acesso total ao canal, incluindo a habilidade de mudar informações de grupo e LCA. Este privilégio implica todos outros privilégios. This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. Representa a permissão de percorrer o canal. Se esse privilégio é negado a um usuário, ele não conseguirá acessar o canal ou qualquer subcanal de modo algum, independentemente de outras permissões nos subcanais. This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. Representa a permissão de entrar no canal. Se você possui uma estrutura hierárquica de canais, você pode querer conceder Percorrer para todas as pessoas mas, restringir Entrar na raiz de sua hierarquia. This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. Representa a permissão de falar em um canal. Usuários sem este privilégio serão suprimidos pelo servidor (visto como mudo), e serão incapazes de falar até serem desemudecidos por alguém com os privilégios apropriados. This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. Representa a permissão de sussurrar para esse canal a partir de fora. Isto funciona exatamente como o privilégio <i>falar</i>, mas se aplica a pacotes falados com a tecla de Sussurro pressionada. Isso pode ser usado para transmitir para uma hierarquia de canais sem vinculá-los. This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. Representa a permissão de emudecer e ensurdecer outros usuários. Uma vez emudecido, um usuário permanecerá assim até ser desemudecido por usuário com privilégios ou, ao reconectar com o servidor. This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. Representa a permissão de mover um usuário para outro canal ou expulsá-lo do servidor. Para realmente mover o usuário, ou o usuário deve possuir o privilégio Mover no canal destino, ou o usuário deve ser normalmente permitido de entrar no canal. Usuários com este privilégio podem mover usuários para canais onde o usuário normalmente não teria permissão para entrar. This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. Representa a permissão de criar subcanais. O usuário criando o subcanal vai ser adicionado ao grupo admin do subcanal. This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. Representa a permissão de criar um subcanal temporário. O usuário que criar o subcanal será adicionado ao grupo admin do subcanal. Canais temporários não são armazenados, e desaparecem quando o último usuário sair dele. This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. Representa a permissão de vincular canais. Usuários em canais vinculados podem escutar uns aos outros, desde que o usuário falando possua privilégio <i>falar</i> no canal do ouvinte. Você precisa do privilégio vincular em ambos os canais criar um vínculo, mas apenas em um deles para desfazer. This represents the permission to write text messages to other users in this channel. Representa a permissão de escrever mensagens de texto para outros usuários nesse canal. This represents the permission to forcibly remove users from the server. Representa a permissão de remover usuários do servidor à força. This represents the permission to permanently remove users from the server. Representa a permissão de remover usuários permanentemente do servidor. This represents the permission to register and unregister users on the server. Representa a permissão de registrar e eliminar usuários do servidor. This represents the permission to register oneself on the server. Representa a permissão de se registrar no servidor. Whisper Sussurrar Move Mover Text message Mensagem de texto Kick Expulsar Ban Banir Register User Registrar usuário Register Self Registrar-se Write ACL Escrever LCA ChatbarTextEdit Paste and &Send Paste and send Colar e &Enviar <center>Type chat message here</center> <center>Digite a mensagem aqui</center> ClientUser Friend Amigo Authenticated Autenticado Priority speaker Falante prioritário Recording Gravando Muted (server) Mudo (servidor) Deafened (server) Surdo (servidor) Local Ignore (Text messages) Ignorado Localmente (Mensagens de texto) Local Mute Mudo Localmente Muted (self) Mudo (próprio) Deafened (self) Surdo (próprio) ConfigDialog Accept changes Aceitar alterações This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. Esse botão vai aceitar as configurações atuais e retornar ao programa.<br />As configurações serão salvas no disco quando você sair do programa. Reject changes Rejeitar alterações This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. Este botão rejeitará todas alterações e voltar ao aplicativo.<br />As configurações serão resetadas para as posições anteriores. Apply changes Aplicar alterações This button will immediately apply all changes. Este botão vai aplicar todas alterações imediatamente. Undo changes for current page Desfazer alterações para a página atual This button will revert any changes done on the current page to the most recent applied settings. Esse botão vai reverter qualquer alteração feita na página atual para as configurações aplicadas mais recentemente. Restore defaults for current page Restaurar padrões na página atual This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. Este botão irá restaurar as configurações para o padrão da página atual. Outras páginas não serão alteradas.<br />Para restaurar todas as configurações para seus padrões, você terá que usar o botão em cada página. Mumble Configuration Configuração do Mumble ConnectDialog Connecting to %1 Conectando a %1 Enter username Especifique um nome de usuário Adding host %1 Adicionando servidor %1 Servername Nome do servidor Hostname Nome de host Bonjour name Nome Bonjour Port Porta Addresses Endereços Website Página web Packet loss Perda de pacotes Ping (80%) Ping (80%) %1 ms %1 ms Ping (95%) Ping (95%) Bandwidth Largura de banda %1 kbit/s %1 kbit/s &Connect &Conectar &Filters &Filtros Unknown Users Usuários Version Versão Failed to fetch server list Falha ao obter lista de servidores Mumble Server Connect Conexão ao servidor Mumble Ping Ping Remove from Favorites Eliminar dos favoritos Add custom server Adicionar servidor pessoal Show all servers that respond to ping Mostrar todos servidores que respondem ao ping Show all servers with users Mostrar todos servidores com usuários Show all servers Mostrar todos servidores &Copy &Copiar Copy favorite link to clipboard Copiar ligação a favorito para área de transferência &Paste &Colar Paste favorite from clipboard Colar favorito da área de transferência &Edit... &Editar... &Add New... &Adicionar novo... Add to &Favorites Adicionar a &Favoritos Open &Webpage Abrir página &web Show &Reachable Mostrar a&lcançáveis Show &Populated Mostrar em &uso Show &All Mostrar &todos ConnectDialogEdit Edit Server Editar servidor Name of the server Nome do servidor A&ddress &Endereço Internet address of the server. Internet address of the server. Endereço de internet do servidor. <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Endereço</b><br/> Endereço de internet do servidor. Isto pode ser um nome de host normal, um endereço IPv4/IPv6 ou um identificador de serviços Bonjour. Identificadores de serviço Bonjour devem ser prefixados com '@' para serem reconhecidos pelo Mumble. &Port &Porta Port on which the server is listening Porta que o servidor escuta <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. <b>Porta</b><br/> Porta que o servidor escuta. Se o servidor é identificado por um identificador Bonjour, este campo é ignorado. &Username Nome de &usuário Username to send to the server Nome de usuário enviado ao servidor <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. <b>Nome de usuário</b><br/> Nome de usuário para enviar ao servidor. Lembre-se que o servidor pode impor restrições em como um nome de usuário pode parecer. Além disso, seu nome pode já ter sido adotado por outro usuário. Label Etiqueta Add Server Adicionar servidor You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 Atualmente você está conectado a um servidor. Você deseja preencher o diálogo com os dados de conexão desse servidor? Host: %1 Porta: %2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 Você tem uma URL na sua área de transferência. Você quer preencher o diálogo com esses dados? Host: %1 Porta: %2 Password Senha Password to send to the server Senha para enviar ao servidor <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. <b>Senha</b><br/> Senha para enviar ao servidor na conexão. Essa senha é necessária ao conectar-se como <i>SuperUser</i> ou para servidor com autenticação por senha. Se não especificada a senha é perguntada na conexão. Show password Mostrar senha <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. <b>Etiqueta</b><br/> Etiqueta do favorito. É como o favorito será exibido na lista de favoritos, e pode ser livremente escolhida. Local server label Etiqueta do servidor local 127.0.0.1 127.0.0.1 64738 64738 Your username Seu nome de usuário Your password Sua senha &Fill &Preencher CoreAudioSystem Default Device Dispositivo padrão CrashReporter Mumble Crash Report Informe de Erro do Mumble <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> <p><b>Sentimos muitíssimo, mas parece que o Mumble travou. Você quer enviar um informe de erro para os desenvolvedores do Mumble?</b></p><p>O informe contém uma cópia parcial da memória do Mumble durante o travamento, e ajudará os desenvolvedores a consertar o problema.</p> Email address (optional) Endereço de email (opcional) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash Por favor, descreva brevemente, em Inglês, o que você estava fazendo durante o travamento Send Report Enviar informe Don't send report Não enviar informe Crash upload successful Informe enviado com sucesso Thank you for helping make Mumble better! Obrigado por ajudar fazer o Mumble melhor! Crash upload failed Envio de informe falhou We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. Nós sentimos muito, mas parece que o informe do erro falhou com o erro: %1 %2. Por favor informe um desenvolvedor. This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 Isto realmente não é nada divertido, mas aparentemente há uma falha no código para reportar falhas, e nós não pudemos enviar o informe. Você pode informar um desenvolver sobre o erro %1 Uploading crash report Enviando informe de erro Abort upload Abortar envio DXAudioInput Default DirectSound Voice Input Entrada de voz padrão do DirectSound Opening chosen DirectSound Input device failed. No microphone capture will be done. Abrir o dispositivo de entrada escolhido para o DirectSound falhou. Nenhuma captura de microfone será feita. Opening chosen DirectSound Input failed. Default device will be used. Abrir a entrada escolhida para o DirectSound falhou. O dispositivo padrão será usado. Lost DirectSound input device. Dispositivo de entrada do DirectSound perdido. DXAudioOutput Default DirectSound Voice Output Dispositivo padrão de saída do DirectSound Opening chosen DirectSound Output failed. Default device will be used. Abrir o dispositivo de saída escolhido para o DirectSound falhou. O dispositivo padrão será usado. Lost DirectSound output device. Dispositivo de saída do DirectSound perdido. Opening chosen DirectSound Output failed. No audio will be heard. Abrir o dispositivo de saída escolhido para o DirectSound falhou. Nenhum áudio será ouvido. Database Mumble failed to initialize a database in any of the possible locations. Falha ao iniciar a base de dados em qualquer dos locais possíveis. The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. A base de dados '%1' é somente leitura. O Mumble não pode salvar as configurações do servidor (ex. certificados TLS) até você resolver este problema. DeveloperConsole Developer Console Console de Desenvolvedor DockTitleBar Drag here Arrastar aqui GlobalShortcut Shortcuts Atalhos List of configured shortcuts Lista dos atalhos configurados Function Função Data Dados Shortcut Atalho Suppress Suprimir Add new shortcut Adicionar novo atalho This will add a new global shortcut Adiciona um novo atalho global &Add &Adicionar Remove selected shortcut Eliminar o atalho selecionado This will permanently remove a selected shortcut. Eliminará permanentemente o atalho selecionado. &Remove &Eliminar <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> <html><head/><body><p>Atualmente o Mumble só pode usar botões do mouse e as teclas modificadoras do teclado (Alt, Ctrl, Cmd, etc.) para atalhos globais.</p><p>Se você quer mais flexibilidade você pode ativar <span style=" font-style:italic;">Acesso para dispositivos de assistência</span> nas preferências de Acessibilidade do sistema. Por favor note, no entanto, que essa mudança também permite programas potencialmente maliciosos de ver o que é digitado em seu teclado.</p></body></html> Open Accessibility Preferences Abrir Preferências de Acessibilidade Skip Pular Enable Global Shortcuts Ativar Atalhos Globais <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. <b>Motores de Atalhos Adicionais</b><br />Essa seção permite a você configurar a utilização de motores adicionais de AtalhosGlobais. Additional Shortcut Engines Motores de Atalho Adicionais <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. <b>Ativar ganchos de janela</b>.<br />Isso permite ganchos de Janela no motor de atalho. Usar esse motor permite ao Mumble suprimir pressionamento de teclas e cliques de mouse. Enable Windows hooks Permitir gatilhos de janela <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. <b>Ativar GKey</b>.<br />Essa opção ativa o suporte para o motor de atalhos GKey, para "G"-keys/teclas encontradas em teclados Logitech. Enable GKey Ativar GKey <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. <b>Ativar XInput</b>.<br />Essa opção ativa suporte para o motor de atalhos XInput, para controladores compatíveis com Xbox. Enable XInput Ativar XInput <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. <b>Ativar atalhos em aplicações privilegiadas</b>.<br />Também conhecido como "UIAccess". Isso permite ao Mumble receber eventos globais de atalho de programas executando sob níveis de privilégio elevado, como um Prompt de Comando de Administrador ou jogos antigos que executam com privilégios de administrador. <br /><br /> Sem essa opção ativada, usar os atalhos globais do Mumble em aplicações privilegiadas não funcionará. Isso pode parecer inconsistente: por exemplo, se o botão Pressionar-para-Falar é pressionado de um programa não privilegiado, mas solto num aplicativo privilegiado, o Mumble não observará que ele foi solto e você continuará falando até pressionar o botão de Pressionar-para-Falar novamente. Enable shortcuts in privileged applications Ativar atalhos em aplicações privilegiadas GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> <html><head/><body><p>Atualmente o Mumble só pode utilizar teclas modificadoras do mouse e do teclado (Alt, Ctrl, Cmd, etc.) para atalhos globais.</p><p>Se você deseja mais flexibilidade, você pode adicionar o Mumble como um programa de acessibilidade confiável na seção de Segurança e Privacidade nas Preferências do Sistema do seu Mac.</p><p>No painel de Segurança e Privacidade, modifique a aba Privacidade. Depois escolhe Acessibilidade (próximo à parte inferior) na lista à esquerda. Finalmente, adicione o Mumble à lista de programas de acessibilidade confiáveis.</body></html> Shortcuts Atalhos Shortcut button combination. Combinação de teclas do atalho. <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. <b>Esta é a combinação de teclas global.</b><br />Clique neste campo e depois pressione a combinação desejada de teclas/botões para reassociá-los. Clique duas vezes para limpar. Suppress keys from other applications Suprimir teclas de outros programas <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. <b>Oculta o pressionamento de botões de outros programas.</b><br />Ativar isto ocultará o botão (ou pelo menos o último botão de uma combinação de vários botões) de outros programas. Note que nem todos botões podem ser suprimidos. GlobalShortcutTarget Whisper Target Alvo do Sussurro Whisper to list of Users Sussurrar para lista de Usuários Channel Target Canal Alvo Restrict to Group Restringir para Grupo If specified, only members of this group will receive the whisper. Se especificado, apenas membros desse grupo receberão o sussurro. List of users Lista de usuários Add Adicionar Remove Eliminar Modifiers Modificadores Do not send positional audio information when using this whisper shortcut. Não enviar informação de áudio posicional quando usar este atalho de sussurro. Ignore positional audio Ignorar áudio posicional Shout to Linked channels Gritar para canais vinculados Shout to subchannels Gritar para subcanais Shout to Channel Gritar para Canal The whisper will also be transmitted to linked channels. O sussurro também será transmitido para canais vinculados. The whisper will also be sent to the subchannels of the channel target. O sussurro também será enviado para subcanais no canal alvo. GlobalShortcutX Mouse %1 Mouse %1 JackAudioSystem Hardware Ports Portas de Hardware Mono Mono Stereo Estéreo LCD Not connected Não conectado LCDConfig Enable this device Ativar esse dispositivo LCD LCD Devices Dispositivos Name Nome <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> <p>Esta é a lista de dispositivos LCD disponíveis no seu sistema. Ela lista dispositivos pelo nome, mas também inclui o tamanho do visor. O Mumble suporta saídas em vários dispositivos LCD ao mesmo tempo.</p> <h3>Tamanho:</h3> <p> Este campo descreve o tamanho de um dispositivo LCD. O tamanho é dado em pixels (para LCDs Gráficos) ou em caracteres (para LCDs de Caracteres).</p> <h3>Ativo:</h3> <p>Decide se o Mumble deve ou não desenhar em determinado dispositivo LCD.</p> Size Tamanho Enabled Ativo Views Visualizações Minimum Column Width Largura Mínima da Coluna <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> <p>Decide a largura mínima de uma coluna na Visualização de Usuário.</p> <p>Se muitas pessoas estão falando ao mesmo tempo, a Visualização de usuário se dividirá em colunas. Você pode usar essa opção para escolher um meio-termo entre o número de usuários mostrados no LCD, e o comprimento dos nomes de usuário.</p> This setting decides the width of column splitter. Decide a largura do divisor de colunas. Splitter Width Largura do divisor Log Debug Depuração Critical Crítico Warning Atenção Information Informação Server Connected Servidor conectado Server Disconnected Servidor desconectado Other self-muted/deafened Outro se emudeceu/ensurdeceu Permission Denied Permissão negada Text Message Mensagem de texto User Joined Server Usuário entrou no servidor User Left Server Usuário deixou o servidor User recording state changed Usuário mudou o estado de gravação User kicked (you or by you) Usuário expulso (você ou por você) User kicked Usuário expulso You self-muted Você emudeceu-se User muted (you) Usuário emudecido (você) User muted (by you) Usuário emudecido (por você) User muted (other) Usuário emudecido (outro) User Joined Channel Usuário entrou no canal User Left Channel Usuário deixou o canal You self-unmuted Você desemudeceu-se You self-deafened Você ensurdeceu-se You self-undeafened Você desensurdeceu-se User renamed Usuário renomeado You Joined Channel Você Ingressou no Canal You Joined Channel (moved) Você Ingressou no Canal (movido) User connected and entered channel Usuário conectou e entrou no canal User left channel and disconnected Usuário deixou o canal e desconectou Private text message Mensagem de texto privada the server o servidor [[ Invalid size ]] [[ Tamanho Inválido ]] [[ Text object too large to display ]] [[ Objeto de texto muito grande para mostrar ]] [Date changed to %1] [Data alterada para %1] link to %1 link para %1 FTP link to %1 Endereço FTP para %1 player link link para jogador channel link link para canal %1 link link para %1 LogConfig Toggle console for %1 events Alternar console para eventos %1 Toggle pop-up notifications for %1 events Alternar notificações de pop-up para eventos %1 Toggle Text-To-Speech for %1 events Alternar Texto-para-Fala para eventos %1 Click here to toggle sound notification for %1 events Clique aqui para alternar notificações de som para eventos %1 Toggle window highlight (if not active) for %1 events Alterna realce de janela (se inativo) para eventos %1 Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change Caminho para o arquivo de som usado nas notificações de som para o caso de eventos %1<br />Clique uma vez para tocar<br />Clique duas vezes para alterar Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. Clique aqui para alterar a saída do console para eventos %1.<br />Se marcado, o Mumble escreverá todos os eventos %1 no seu registro de mensagens. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. Clique aqui para alternar as notificações de pop-up para eventos %1.<br />Se marcado, uma pop-up de notificação será criada pelo Mumble para cada evento %1. Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. Clique aqui para alternar realce de janela para eventos %1. <br />Se marcado, a janela do Mumble será destacada para cara evento %1, se inativa. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. Caminho para o arquivo de som usado para notificações de som no caso de eventos %1.<br />Clique uma vez para tocar<br />Clique duas vezes para alterar<br />Certifique-se de que notificações sonoras para estes eventos estão ativas ou esse campo não terá efeito. Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. Clique aqui para alternar Texto-para-Fala para eventos %1.<br />Se marcado, o Mumble usa Texto-para-Fala para ler eventos %1 para você. Texto-para-Fala também é capaz de ler o conteúdo do evento, o que não é possível para arquivos sonoros. Texto-para-Fala e arquivos sonoros não podem ser usados ao mesmo tempo. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. Clique aqui para alternar notificações sonoras para eventos %1.<br />Se marcado, o Mumble usará um arquivo de som predefinido por você para indicar eventos %1. Arquivos de som e Texto-para-Fala não podem ser usados ao mesmo tempo. Messages Mensagens Message Mensagem Console Console Notification Notificação Text-To-Speech Texto-para-Fala Soundfile Arquivo sonoro Path Caminho Text To Speech Texto-para-Fala Volume Volume Volume of Text-To-Speech Engine Volume do motor de Texto-para-Fala <b>This is the volume used for the speech synthesis.</b> <b>Este é o volume usado para síntese da fala.</b> Length threshold Limite de duração Message length threshold for Text-To-Speech Engine Limite de tamanho de mensagem para o motor de Texto-para-Fala <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. <b>Este é o limite usado para o motor de Texto-para-Fala.</b><br />Mensagens maiores do que o limite não serão lidas até o fim. Characters Caracteres Whisper Sussurro If checked you will only hear whispers from users you added to your friend list. Se marcado você só ouvirá sussurros de usuários na sua lista de amigos. Only accept whispers from friends Só aceitar sussurros de amigos If enabled text messages you send will be read back to you with TTS Se ativado mensagens de texto que enviar serão lidas pela TPF Read back own messages Ler próprias mensagens Chat Log Registro de conversa Maximum chat length Tamanho máximo da conversa Unlimited Ilimitado Lines Linhas Highlight Realce LookConfig System default Padrão do sistemas None Nenhum Only with users Apenas com usuários All Todos Ask Perguntar Do Nothing Nada fazer Move Mover <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory <a href="%1">Procurar</a> User Interface Interface de usuário This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. Especifica quais canais expandir automaticamente. <i>Nenhum</i> e <i>Todos</i> expandira ou não todos os canais, enquanto <i>Apenas com usuários</i> expandirá e compactará canais conforme usuários entram e saem. List users above subchannels (requires restart). Listar usuários acima dos subcanais (exige reinício). <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. <b>Se marcado, usuários serão mostrados acima dos subcanais na visão dos canais.</b><br />Um reinicio do Mumble é necessário para ver a alteração. Users above Channels Usuários acima dos canais <b>If set, will verify you want to quit if connected.</b> <b>Se marcado, verificará se você quer sair se conectado</b> Show number of users in each channel Mostrar número de usuários em cada canal Show channel user count Mostrar contagem de usuários no canal Language Idioma Language to use (requires restart) Idioma a usar (exige reinicio) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. <b>Escolhe qual idioma o Mumble deve usar.</b><br />Você deve reiniciar o Mumble para usar o novo idioma. Look and Feel Aparência Layout Disposição Classic Clássica Stacked Empilhada Hybrid Híbrida Custom Pessoal This changes the behavior when moving channels. Altera o comportamento ao mover canais. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. Configura o comportamento da moção de canais; pode ser usado para evitar moções acidentais. <i>Mover</i> move o canal sem perguntar. <i>Não fazer nada</I> não faz nada e mostra uma mensagem de erro. <i>Perguntar</i> usa uma caixa de mensagem para confirmar se você realmente quer mover o canal. Expand Expandir When to automatically expand channels Quando expandir canais automaticamente Channel Dragging Moção de canais Ask whether to close or minimize when quitting Mumble. Perguntar quando fechar ou minimizar ao fechar o Mumble. Ask on quit while connected Perguntar ao sair enquanto conectado Always On Top Sempre visível <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> <b>Se marcado, minimizar a janela principal do Mumble fará com que ela seja escondida e acessível apenas através da bandeja. De outro modo, ela será minimizada como uma janela normalmente seria.</b> Hide in tray when minimized Esconder na bandeja quando minimizado Hide the main Mumble window in the tray when it is minimized. Esconder a janela principal do Mumble na bandeja quando minimizada. This setting controls when the application will be always on top. Esta configuração controla quando o aplicativo ficará sempre visível. Never Nunca Always Sempre In minimal view Na visão mínima In normal view Na visão normal Displays talking status in system tray Mostrar estado de fala na bandeja de sistema Show talking status in tray icon Mostrar estado de fala no ícone da bandeja This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. Controla em que situações o aplicativo ficará sempre visível. Se você escolher <i>Nunca</i> o aplicativo não ficará sempre visível. <i>Sempre</i> manterá o aplicativo sempre visível. <i>Na visão mínima</i> / <i>Na visão normal</i> apenas manterá o aplicativo sempre visível quando a visão mínima estiver ativa /inativa. Show context menu in menu bar Mostra o menu de contexto na barra de menus Apply some high contrast optimizations for visually impaired users Aplica otimizações de alto contraste para usuários com deficiência visual Optimize for high contrast Otimiza para alto contraste Application Aplicativo Adds user and channel context menus into the menu bar Adicionar menus de contexto de usuário e canal na barra de menu Tray Icon Ícone da bandeja Channel Tree Árvore de canais Use selected item as the chat bar target Usar item selecionado como o alvo da barra de conversa Filter automatically hides empty channels O filtro oculta canais vazios automaticamente Show transmit mode dropdown in toolbar Mostrar modo de transmissão na barra de ferramentas Theme Tema Theme to use to style the user interface Tema usado para estilizar a interface de usuario <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. <b>Configura com qual tema a interface de usuário do Mumble deve ser estilizada</b><br />Mumble detectará temas de determinados diretórios e os exibirá nesta lista. O tema que você selecionar selecionado será usado para personalizar a aparência do Mumble. Isso inclui cores, ícones e mais. User Dragging Arrasto de Usuário This changes the behavior when moving users. Isso altera o comportamento ao mover usuários. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. Isso define o comportamento de arrasto de usuário; ele pode ser usado para evitar arrasto acidental. <i>Mover</i> move o usuário sem confirmação. <i>Fazer nada</i> faz nada e produz uma mensagem de erro. <i>Perguntar</i> usa uma caixa de diálogo para confirmar o desejo de mover o usuário. <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. <b>Ativar menu de Desenvolvedor</b><br />Isso ativa o menu de "Desenvolvedor" no Mumble. Esse menu é usado para recursos específicos de desenvolvimento, como no Console de Desenvolvedor. Enable Developer menu Ativar menu de Desenvolvedor When in custom layout mode, checking this disables rearranging. No modo de disposição pessoal, marcar isso desativa a reordenação. Lock layout Trancar Disposição MainWindow Root Raiz Push-to-Talk Global Shortcut Pressionar-para-Falar Push and hold this button to send voice. Global Shortcut Aperte e segura este botão para enviar voz. This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut Configura o botão pressionar-para-falar, e enquanto você mantiver este botão pressionado, você transmitira voz. Reset Audio Processor Global Shortcut Resetar processador de áudio Unlink Plugin Global Shortcut Desvincular complemento Push-to-Mute Global Shortcut Pressionar-para-Emudecer Join Channel Global Shortcut Entrar no canal Toggle Overlay Global Shortcut Alternar sobreimpressão Toggle state of in-game overlay. Global Shortcut Alternar estado da sobreimpressão em jogo. Toggle Minimal Global Shortcut Alternar mínimo Volume Up (+10%) Global Shortcut Aumentar volume (+10%) Volume Down (-10%) Global Shortcut Baixar volume (-10%) Mumble Mumble Mumble -- %1 Mumble -- %1 &Window &Janela Minimize Minimizar Ctrl+M Ctrl+M Close Fechar Mumble is currently connected to a server. Do you want to Close or Minimize it? O Mumble está conectado a um servidor atualmente. Você gostaria de fechá-lo ou minimizá-lo? Mute Self Global Shortcut Ficar mudo Set self-mute status. Global Shortcut Configura seu estado de emudecimento. This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut Configura ou altera o seu estado de emudecido. Se você desativar isto, você também desativará o ensurdecimento. Deafen Self Global Shortcut Ficar surdo Set self-deafen status. Global Shortcut Configura estado de ensurdecimento. This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut Configura ou altera o seu estado surdo. Se você ativar isso, você também ativar o emudecimento. Whisper/Shout Whisper Sussurrar/Gritar <center>Not connected</center> Not connected <center>Não conectado</center> Clear Limpar Opening URL %1 Abrindo URL %1 File does not exist Arquivo não existe File is not a configuration file. Arquivo não é de configuração. Settings merged from file. Configurações combinadas de arquivo. URL scheme is not 'mumble' Forma de URL não é 'mumble' This version of Mumble can't handle URLs for Mumble version %1.%2.%3 Esta versão do Mumble não pode lidar com URLs para o Mumble versão %1.%2.%3 Connecting to %1 Conectando a %1 Enter username Especifique o nome de usuário Connecting to server %1. Conectando ao servidor %1. Reconnecting. Reconectando. Transmit Mode set to Continuous Modo de Transmissão ajustado para Contínuo <p>%1 (%2)<br />%3</p> <p>%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> <h2>Canal de voz</h2><p>Criptografado com OCB-AES128 de 128 bit<br />%1 ms de latência média (desvio %4)</p> Register yourself as %1 Registrar-se como %1 <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <p>Você está prestes a se registrar nesse servidor. Esta ação não pode ser desfeita, e, seu nome de usuário não pode ser alterado após isso ser feito. Para sempre você será conhecido como '%1' nesse servidor.</p><p>Você tem certeza de que quer se registrar?</p> <h2>Version</h2><p>Protocol %1</p> <h2>Versão</h2><p>Protocolo %1</p> <p>No build information or OS version available</p> <p>Nenhuma informação disponível sobre a compilação ou versão do SO.</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) A conexão é criptografada e autenticada usando %1 e usa %2 como mecanismo de troca de chaves (%3) The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) A conexão é criptografada usando %1, com %2 para autenticação de mensagens e %3 como mecanismo de troca de chaves (%4) The connection is secured by the cipher suite that OpenSSL identifies as %1 A conexão é assegurada pela suíte de cifras que o OpenSSL identifica como %1 <p>The connection provides perfect forward secrecy</p> <p>A conexão fornece sigilo permanente (<i>perfect forward secrecy</i>)</p> <p>The connection does not provide perfect forward secrecy</p> <p>A conexão não fornece sigilo permanente (<i>perfect forward secrecy</i>)</p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> <h2>Canal de controle</h2><p>A conexão usa %1</p>%2%3<p>%4 ms de latência média (%5 de desvio)</p><p>Host remoto %6 (porta %7)</p> Voice channel is sent over control channel Canal de voz é enviado pelo canal de controle Register user %1 Registrar usuário %1 <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> <p>Você está para registrar %1 no servidor. Essa ação não pode ser desfeita, o nome de usuário não pode ser alterado e como um usuário registrado, %1 terá acesso ao servidor mesmo se você trocar a senha do servidor.</p><p>Deste ponto em diante, %1 será autenticado com o certificado em uso atualmente.</p><p>Você tem certeza de que quer registrar %1?</p> Kicking user %1 Expulsando usuário %1 Banning user %1 Banindo usuário %1 View comment on user %1 Ver comentário no usuário %1 Message to channel %1 Mensagem para canal %1 Connected. Conectado. <li>Expected certificate digest (SHA-1): %1</li> <li>Resumo de certificado (SHA-1) esperado: %1</li> Server presented a certificate which failed verification. Servidor apresentou um certificado que falhou na verificação. <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> <p>%1</p><ul>%2</ul><p>Os erros específicos com esse certificado são:</p><ol>%3</ol><p>Você quer aceitar o certificado mesmo assim?<br />(Ele também sera armazenado então você não será perguntado novamente.)</p> SSL Version mismatch Versões TLS não coincidem Server connection failed. Conexão com o servidor falhou. <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>Digite a mensagem para o canal '%1' aqui</center> <center>Type message to user '%1' here</center> Type message to user '%1' here <center>Digite a mensagem para o usuário '%1' aqui</center> Choose image file Escolher um arquivo de imagem Failed to load image Falha ao carregar imagem Could not open file for reading. Não pude abrir o arquivo para leitura. Image format not recognized. Formato de imagem não reconhecido. &User &Usuário &Channel &Canal Use in conjunction with Whisper to. Global Shortcut Use em conjunto com o Sussurrar para. This will switch the states of the in-game overlay. Global Shortcut Alterna os estados da sobreimpressão em jogo. Link Channel Global Shortcut Ligar Canal Cycle Transmit Mode Global Shortcut Mudar Modo de Transmissão Set Transmit Mode to Push-To-Talk Global Shortcut Set Transmit Mode to Continuous Global Shortcut Set Transmit Mode to VAD Global Shortcut Send Text Message Global Shortcut Enviar Mensagem de Texto Send Clipboard Text Message Global Shortcut Enviar Mensagem da Área de Transferência This will send your Clipboard content to the channel you are currently in. Global Shortcut Isso enviará o conteúdo da área de transferência para o canal em que você está atualmente. Continuous Contínuo Voice Activity Atividade de Voz Push-to-Talk Pressionar-para-Falar Mumble - Minimal View -- %1 Mumble - Visão Mínima -- %1 Cancel Cancelar Save Image As... Salvar Imagem Como... Save Image File Salvar Arquivo de Imagem Could not save image: %1 Impossível salvar imagem: %1 Change your comment Alterar seu comentário Transmit Mode set to Voice Activity Modo de transmissão ajustado para Atividade de Voz Transmit Mode set to Push-to-Talk Modo de transmissão ajustado para Pressionar-para-Falar <p>Connected users: %1/%2</p> <p>Usuários conectados: %1/%2</p> UDP Statistics Estatísticas UDP To Server Para servidor From Server Do servidor Good Bons Late Tardios Lost Perdidos Resync Resinc <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> <h2>Largura de banda do áudio</h2><p>Máxima %1 kbit/s<br />Atual %2 kbit/s<br />Codec: %3</p> Mumble Server Information Informação do servidor Mumble &View Certificate &Ver certificado Enter reason Especifique o motivo Sending message to %1 Enviando mensagem para %1 To %1: %2 Para %1: %2 Message to %1 Mensagem para %1 Are you sure you want to reset the comment of user %1? Você tem certeza de que quer resetar o comentário do usuário %1? Are you sure you want to reset the avatar of user %1? Realmente deseja restabelecer o avatar do usuário %1? Are you sure you want to delete %1 and all its sub-channels? Você tem certeza de que quer eliminar %1 e todos os seus subcanais? Sending message to channel %1 Enviando mensagem para o canal %1 Message to tree %1 Mensagem para árvore %1 To %1 (Tree): %2 (Tree) %1: %2 Para %1 (Árvore): %2 Unmuted and undeafened. Desemudecido e desensurdecido. Unmuted. Desemudecido. Muted. Mudo. Muted and deafened. Mudo e surdo. Deafened. Surdo. Undeafened. Desensurdecido. Restart Mumble? Reiniciar Mumble? Some settings will only apply after a restart of Mumble. Restart Mumble now? Algumas configurações só serão aplicadas reiniciar o Mumble. Reiniciar o Mumble agora? About Qt Sobre o Qt SSL Verification failed: %1 Verificação TLS falhou: %1 <li>Server certificate digest (SHA-1): %1</li> <li>Resumo de certificado (SHA-1): %1</li> <b>WARNING:</b> The server presented a certificate that was different from the stored one. <b>ATENÇÃO:</b> O servidor apresentou um certificado diferente do armazenado. This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. Este servidor utiliza um padrão criptográfico antigo, e não é mais aceita por versões modernas do Mumble. Server connection failed: %1. Conexão com o servidor falhou: %1. Disconnected from server. Desconectado do servidor. Invalid username Nome de usuário inválido You connected with an invalid username, please try another one. Você conectou com um nome de usuário inválido, por favor tente outro. Username in use Nome de usuário em uso That username is already in use, please try another username. Este nome de usuário já está em uso, por favor escolha outro nome de usuário. Wrong certificate or password Certificado ou senha errados Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. Certificado ou senha errado para usuário registrado. Se tem certeza que este usuário é protegido por senha por favor tente novamente. Do contrário aborte e verifique seu certificado e nome de usuário. Wrong password Senha incorreta Wrong server password for unregistered user account, please try again. Senha de servidor incorreta para conta de usuário não registrada, por favor tente novamente. Images (*.png *.jpg *.jpeg) Imagens (*.png *.jpg *.jpeg) C&onfigure C&onfigurar &Help &Ajuda Log Registro This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. Mostra toda atividade recente. Conexões a servidores, erros e mensagens de informação serão exibidas aqui.<br />Para configurar exatamente quais mensagens aparecem aqui, use o comando <b>Configurações</b> do menu. &Quit Mumble Sa&ir do Mumble Closes the program Fecha o programa Exits the application. Sair do programa. Ctrl+Q Ctrl+Q Open the server connection dialog Abrir o diálogo de conexão com o servidor &Disconnect &Desconectar Disconnect from server Desconectar-se do servidor Disconnects you from the server. Desconecta você do servidor. Show information about the server connection Mostra informação sobre a conexão do servidor This will show extended information about the connection to the server. Mostra informação estendida sobre a conexão com o servidor. &Mute E&mudecer &Deafen Ensur&decer &Local Mute Emudecer &localmente Send a Text Message Enviar uma mensagem de texto Sends a text message to another user. Envia mensagens de texto para outro usuário. Add new channel Adicionar novo canal This adds a new sub-channel to the currently selected channel. Adicionar um novo subcanal ao canal selecionado atualmente. Remove channel Eliminar canal This removes a channel and all sub-channels. Eliminar um canal e todos subcanais. Edit Groups and ACL for channel Editar grupos e LCAs para canal This opens the Group and ACL dialog for the channel, to control permissions. Abre o diálogo de grupos e LCA para o canal, para controlar permissões. &Link &Vincular Link your channel to another channel Vincular canal com outro This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. Esta é a barra de conversa<br />Se você digitar texto aqui e pressionar enter, o texto é enviado para o usuário ou canal que foi selecionado. Se nada foi selecionado, o texto é enviado para o seu canal atual. Chatbar Barra de conversa Shows a dialog of registered servers, and also allows quick-connect. Mostra um diálogo de servidores registrar, e também permite a conexão rápida. Kick user (with reason) Expulsar usuário (com motivo) Kick selected user off server. You'll be asked to specify a reason. Expulsar usuário selecionado do servidor. Você será perguntado um motivo específico. Mute user Emudecer usuário Mute or unmute user on server. Unmuting a deafened user will also undeafen them. Emudecer ou desemudecer usuário no servidor. Desemudecer um usuário surdo também vai desensurdecê-lo. Kick and ban user (with reason) Expulsar e banir usuário (com motivo) Kick and ban selected user from server. You'll be asked to specify a reason. Expulsar e banir o usuário selecionado do servidor. Você será perguntado um motivo específico. Deafen user Ensurdecer usuário Deafen or undeafen user on server. Deafening a user will also mute them. Ensurdecer ou desensurdecer usuário no servidor. Ensurdecer um usuário também irá emudecê-lo. Mute user locally Emudecer usuário localmente Mute or unmute user locally. Use this on other users in the same room. Emudecer ou desemudecer usuário localmente. Use esta opção em outros usuários na mesma sala. This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. Vincula o seu canal atual ao canal selecionado. Se usuários em um canal possuem permissão para falar no outro canal, esses usuários podem agora ouvir uns aos outros. Esta é uma vinculação permanente, e durará até ser manualmente desfeita, ou se o servidor for reiniciado. Por favor, consulte os atalhos para pressionar-para-vincular. &Unlink Channel Desvinc&ular Unlink your channel from another channel Desvincula seu canal de outro canal This unlinks your current channel from the selected channel. Desvincula seu canal do canal selecionado. Unlinks your channel from all linked channels. Desvincula seu canal de todos canais vinculados. This unlinks your current channel (not the selected one) from all linked channels. Desvincula seu canal atual (não o selecionado atualmente) de todos canais vinculados. &Reset &Resetar Reset audio preprocessor Resetar o preprocessador de áudio This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. Reseta o preprocessador de áudio, incluindo atenuação de ruídos, ganho automático e detecção de atividade vocal. Se algo piora subitamente o ambiente de áudio (como derrubar o microfone) e isto foi temporário, use isto para evitar ter que esperar o processador se reajustar. &Mute Self Ficar &mudo Mute yourself Emudecer-se Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. Emudecer ou desemudecer-se. Quando mudo, você não enviará nenhum dado ao servidor. Desemudecer enquanto surdo também irá lhe desensurdecer. &Deafen Self Ficar sur&do Deafen yourself Ensurdecer-se Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. Ensurdecer ou desensurdecer-se. Quando ensurdecido, você não irá ouvir nada. Ensurdecer-se também o irá emudecer. &Text-To-Speech &Texto-para-Fala Toggle Text-To-Speech Alternar Texto-para-Fala Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. Ativar ou desativar o motor de texto-para-fala. Apenas mensagens ativadas para TPF no diálogo de configuração serão realmente faladas. Display audio statistics Mostrar estatísticas de áudio Pops up a small dialog with information about your current audio input. Pop-up um pequeno diálogo com informação sobre a sua entrada de áudio atual. Forcibly unlink plugin Desvincular complemento forçosamente This forces the current plugin to unlink, which is handy if it is reading completely wrong data. Isto força o complemento atual a desvincular, o que é útil se você está lendo dados completamente errôneos. Configure Mumble Configurar Mumble Allows you to change most settings for Mumble. Permite a você alterar a maioria das configurações do Mumble. Start the audio configuration wizard Iniciar o assistente de ajuste de áudio This will guide you through the process of configuring your audio hardware. O guiará através do processo de configurar seu hardware de áudio. &What's This? &O que é isso? Enter What's This? mode Entrar no modo "O que é isto?" Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. Clique aqui para entrar no modo "O que é isto?". Seu cursor vai virar um ponto de interrogação. Clique em qualquer botão, escolha de menu ou área para mostrar uma descrição do que isto é. Information about Mumble Informação sobre o Mumble Shows a small dialog with information and license for Mumble. Mostra um pequeno diálogo com informações e licença para o Mumble. Information about Speex Informação sobre Speex Shows a small dialog with information about Speex. Mostra um pequeno diálogo com informação sobre Speex. Information about Qt Informação sobre o Qt Shows a small dialog with information about Qt. Mostra um pequeno diálogo com informações sobre Qt. Check for &Updates Proc&urar atualizações Check for new version of Mumble Procurar por uma nova versão do Mumble Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. Conecta à página web do Mumble para verificar se uma nova versão está disponível, e notifica você com uma URL para baixá-la se for o caso. Sends a text message to all users in a channel. Envia uma mensagem de texto para todos usuários em um canal. Configure certificates for strong authentication Configura os certificados para autenticação robusta This starts the wizard for creating, importing and exporting certificates for authentication against servers. Isto inicia o assistente para criar e exportar certificados para autenticar em servidores. Register user on server Registrar usuário no servidor This will permanently register the user on the server. Registra o usuário permanentemente no servidor. Add &Friend Adicionar A&migo Adds a user as your friend. Adiciona um usuário como seu amigo. This will add the user as a friend, so you can recognize him on this and other servers. Adicionará o usuário como um amigo, para que você possa reconhecê-lo neste e em outros servidores. &Remove Friend Elimina&r amigo Removes a user from your friends. Eliminar um usuário dos seus amigos. This will remove a user from your friends list. Eliminar um usuário da sua lista de amigos. &Update Friend At&ualizar amigo Update name of your friend. Atualizar o nome de seu amigo. Your friend uses a different name than what is in your database. This will update the name. Seu amigo usa um nome diferente do que está na sua base de dados. Isto vai atualizar o nome. Edit registered users list Editar lista de usuários registrados This opens the editor for registered users, which allow you to change their name or unregister them. Abre o editor para usuários registrados, que permite que você altere seus nomes ou elimine seus registros. Add or remove text-based access tokens Adicionar ou eliminar credenciais de acesso baseadas em texto &Minimal View Visão &mínima Toggle minimal window modes Alternar modos mínimos de janela This will toggle minimal mode, where the log window and menu is hidden. Alterna o modo mínimo, em que a janela de registro e o menu são escondidos. You muted and deafened %1. Você emudeceu e ensurdeceu %1. You unmuted and undeafened %1. Você desemudeceu e desensurdeceu %1. You undeafened %1. Você desensurdeceu %1. You suppressed %1. Você reprimiu %1. %1 muted and deafened by %2. %1 emudecido e ensurdecido por %2. %1 unmuted and undeafened by %2. %1 desemudecido e desensurdecido por %2. %1 undeafened by %2. %1 desensurdecido por %2. %1 suppressed by %2. %1 reprimido por %2. %1 moved to %2. %1 movido para %2. %1 moved to %2 by %3. %1 movido para %2 por %3. %1 moved in from %2 by %3. %1 foi trazido de %2 por %3. %1 is now muted and deafened. %1 agora está mudo e surdo. Your account information can not be verified currently. Please try again later A informação da sua conta não pode ser verificada de momento. Por favor tente mais tarde Welcome message: %1 Mensagem de boas-vindas: %1 Mumble: %1 Mumble: %1 You were denied %1 privileges in %2. Foram lhe negados privilégios de %1 em %2. %3 was denied %1 privileges in %2. %3 foi negado privilégios de %1 em %2. Denied: Cannot modify SuperUser. Negado: não pode modificar o SuperUser. Denied: Invalid channel name. Negado: nome de canal inválido. Denied: Text message too long. Negado: mensagem de texto longa demais. Denied: Operation not permitted in temporary channel. Negado: operação não permitida em um canal temporário. You need a certificate to perform this operation. Você precisa de um certificado para realizar esta ação. %1 does not have a certificate. %1 não possui um certificado. Invalid username: %1. Nome de usuário inválido: %1. Invalid username. Nome de usuário inválido. Channel is full. Canal está cheio. Channel nesting limit reached. Limite de canais aninhados atingido. Channel count limit reached. Need to delete channels before creating new ones. Limite de contagem de canais atingido. É preciso deletar canais antes de criar novos. Permission denied. Permissão negada. %1 connected and entered channel. %1 conectou e entrou no canal. %1 connected. %1 conectou. %1 is now muted. %1 agora está mudo. %1 is now unmuted. %1 agora está desemudecido. Recording started Gravação iniciada Recording stopped Gravação interrompida %1 started recording. %1 começou a gravar. %1 stopped recording. %1 parou de gravar. You revoked your priority speaker status. Você revogou seu status de falante prioritário. You assumed priority speaker status. Você assumiu status de falante prioritário. %1 revoked your priority speaker status. %1 revogou seu status de falante prioritário. %1 gave you priority speaker status. %1 lhe concedeu status de falante prioritário. You revoked priority speaker status for %1. Você revogou status de falante prioritário de %1 You gave priority speaker status to %1. Você concedeu status de falante prioritário para %1 %1 revoked own priority speaker status. %1 revogou o próprio status de falante prioritário. %1 assumed priority speaker status. %1 assumiu status de falante prioritário. %1 revoked priority speaker status for %2. %1 revogou status de falante prioritário de %2 %1 gave priority speaker status to %2. %1 concedeu status de falante prioritário para %2 You were unmuted and undeafened by %1. Você foi desemudecido e desensurdecido por %1. You were muted by %1. Você foi emudecido por %1. You were undeafened by %1. Você foi desensurdecido por %1. You were suppressed. You were suppressed by %1. Você foi reprimido. You were unsuppressed. Você foi liberado. You were unsuppressed by %1. Você foi liberado por %1. You joined %1. Você ingressou %1. You moved %1 to %2. Você moveu %1 para %2 %1 is recording %1 está gravando %1 renamed to %2 by %3. %1 renomeado para %2 por %3. %1 disconnected. %1 desconectou. Server message from Servidor (Tree) (Árvore) (Channel) (Canal) (Private) (Privado) %2%1: %3 %2%1: %3 Failed to load Opus, it will not be available for audio encoding/decoding. Falhou ao carregar Opus, ele estará indisponível para de/codificação de áudio. The server requests minimum client version %1 O servidor requer a versão %1 mínima de cliente The server requests positional audio be enabled. O servidor requer áudio posicional ativo. The server requests positional audio be disabled. O servidor requer áudio posicional inativo. The server requests Push-to-Talk be enabled. O servidor requer Pressionar-para-Falar ativo. The server requests Push-to-Talk be disabled. O servidor requer Pressionar-para-Falar inativo. You were unmuted by %1. Você foi desemudecido por %1. You muted %1. Você emudeceu %1. You unsuppressed %1. Você liberou %1. You unmuted %1. Você desemudeceu %1. %1 muted by %2. %1 emudecido por %2. %1 unsuppressed by %2. %1 liberado por %2. %1 unmuted by %2. %1 desemudecido por %2. Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. Impossível encontrar decodificadores CELT correspondentes com outros clientes. Você não será capaz de falar com todos usuários. You were muted and deafened by %1. You were deafened by %1. Você foi emudecido e ensurdecido por %1. You were kicked from the server by %1: %2. Você foi expulso do servidor por %1: %2. %3 was kicked from the server by %1: %2. %3 foi expulso do servidor por %1: %2. You were kicked and banned from the server by %1: %2. Você foi expulso e banido do servidor por %1: %2. %3 was kicked and banned from the server by %1: %2. %3 foi expulso e banido do servidor por %1: %2. You were moved to %1 by %2. Você foi movido para %1 por %2. %1 entered channel. %1 entrou no canal. Server connection rejected: %1. Conexão com o servidor rejeitada: %1. Denied: %1. Negado: %1. %1 renamed to %2. %1 renomeado para %2. %1 left channel and disconnected. %1 deixou o canal e desconectou-se. Message from %1 Mensagem de %1 You have User Dragging set to "Do Nothing" so the user wasn't moved. Você possui Arrasto de Usuário definido para "Fazer Nada" então o usuário não foi movido. You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. Você possui Moção de Canal ajustado para "Não fazer nada", então o canal não foi movido. Unknown Channel Drag mode in UserModel::dropMimeData. Modo de moção de canal desconhecido em UserModel::dropMimeData. Remote controlling Mumble: Controlando remotamente o Mumble: Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) -jn, --jackname Set custom Jack client name. --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. Uso: mumble [opções] [<url>] <url> especifica uma URL a se conectar na inicialização ao invés de mostrar a janela de conexão, e tem a forma seguinte: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] O parâmetro version deve ser definido para invocar a versão correta do cliente. Por padrão a 1.2.0. Opções válidas são: -h, --help Exibe esse texto de ajuda e finaliza. -m, --multiple Permite iniciar múltiplas instâncias do cliente. -n, --noidentity Suprime o carregamento dos arquivos de identificação (i.e., certificados). -jn, --jackname Define nome pessoal de cliente Jack. --license Exibe a licença do Mumble. --authors Exibe os autores do Mumble. --third-party-licenses Exibe licenças para software de terceiros no Mumble. Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status Uso: mumble rpc <açao> [opções] É possível controlar remotamente uma instância do Mumble usando o comando 'mumble rpc'. São ações válidas: mute Emudecer-se unmute Desemudecer-se togglemute Alternar auto emudecimento deaf Ensudecer-se undeaf Desensudecer-se toggledeaf Alternar auto ensurdecimento Invocation Invocação Error: No RPC command specified Erro: Nenhum comando RPC especificado RPC RPC Welcome to Mumble. Bem-vindo ao Mumble. Skipping version check in debug mode. Pular verificação de versão no modo de depuração. Hide Frame Esconder quadro Toggle showing frame on minimal window Alternar mostrar quadro na janela mínima This will toggle whether the minimal window should have a frame for moving and resizing. Isto vai alternar se a janela mínima deve ter um quadro para mover e redimensioná-la. &Unlink All Desvinc&ular tudo Reset the comment of the selected user. Resetar o comentário do usuário selecionado. &Join Channel &Entrar no canal View comment in editor Ver comentário no editor Query server for connection information for user Buscar no servidor informações da conexão do usuário S&erver S&ervidor &Self &Si &Unlink Plugins Desvinc&ula complementos Register yourself on the server Registrar-se no servidor Change your avatar image on this server Alterar sua imagem de avatar neste servidor &Remove Avatar Elimina&r avatar Remove currently defined avatar image. Eliminar a imagem definida como avatar atualmente. Icon Toolbar Barra de ícones Change your own comment Alterar seu próprio comentário Recording Gravar Priority Speaker Falante prioritário &Copy URL &Copiar URL Copies a link to this channel to the clipboard. Copia uma ligação a este canal para a área de transferência. Ignore Messages Ignorar mensagens Locally ignore user's text chat messages. Ignora localmente as mensagens de texto do usuário. Silently drops all text messages from the user. Silenciosamente cancela todas mensagens de texto do usuário. Edit ban list on server Editar lista de banimentos do servidor This lets you edit the server-side IP ban list. Permite que você edite a lista de banimentos de IP usada pelo servidor &Filter on/off &Filtro ativo/inativo Toggle the channel filter (Ctrl+F) Alternar o filtro de canais (Ctrl+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. Ativar ou desativar o filtro dos canais selecionados. Por padrão todos os canais vazios serão filtrados. Você pode marcar canais adicionais para filtrar no menu contextual do canal. Ctrl+F Ctrl+F &Hide Channel when Filtering &Esconder Canal ao Filtrar Reset the avatar of the selected user. Restabelece o avatar do usuário selecionado. Locally adjust the user's speech volume. Ajusta localmente o volume de fala do usuário. Opens a dialog with a volume slider. Use this on other users in the same room. Abre um diálogo com um controle deslizante de volume. Use isso nos outros usuários na mesma sala. &Developer &Desenvolvedor &Hide Mumble &Esconder Mumble Hides the main Mumble window. Esconde a janela principal do Mumble Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. Esconde a janela principal do Mumble. Restaure ao clicar no ícone da bandeja ou iniciar novamente o Mumble. Show the Developer Console Mostrar o Console de Desenvolvedor Shows the Mumble Developer Console, where Mumble's log output can be inspected. Mostra o Console de Desenvolvedor Mumble, no qual a saída de relatório do Mumble pode ser inspecionada. &Connect... &Conectar... &Ban list... Lista de &banidos... &Information... &Informação... &Kick... &Expulsar... &Ban... &Banir... Local Volume Adjustment... Ajuste Local de Volume... Send &Message... Enviar &Mensagem... &Add... &Adicionar.. &Remove... &Eliminar... &Edit... &Editar... Audio S&tatistics... E&statísticas de Áudio... &Settings... &Configurações &Audio Wizard... &Assistente de Áudio... Developer &Console... &Console de Desenvolvedor... &About... &Sobre... About &Speex... Sobre &Speex... About &Qt... Sobre &Qt... &Certificate Wizard... Assistente de &Certificado... &Register... &Registrar... Registered &Users... Usuários &Registrados.. Change &Avatar... Alterar &Avatar.. &Access Tokens... Chaves de &Acesso... Reset &Comment... Resetar &Comentário... Reset &Avatar... Resetar &Avatar... View Comment... Ver Comentário... &Change Comment... Alterar &Comentário... R&egister... R&egistrar.. Show Shows the main Mumble window. Manual Manual Mumble Positional Audio Áudio Posicional Manual do Mumble Position Posição X X Y Y Z Z m m Heading Cabeçalho Azimuth Azimute Elevation Elevação ° ° Meta data Meta dados Context Contexto Identity Identidade Set Definir State Estado Linked Ligado Activated Ativado Unhinge Desarticular NetworkConfig Network Rede Updates are mandatory when using snapshot releases. Atualizações são mandatórias ao se utilizar versões de teste. Connection Conexão Use TCP compatibility mode Use TCP compatability mode Usar modo de compatibilidade TCP <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). <b>Ativar modo de compatibilidade TCP</b>.<br />Fará com que o Mumble use apenas TCP ao se comunicar com o servidor. Isso aumenta a sobrecarga e, faz com que pacotes perdidos produzam pausas perceptíveis na comunicação, portanto isso só deve ser usado se você é incapaz de usar o padrão (que faz uso de UDP para voz e TCP para controle). Reconnect when disconnected Reconectar ao desconectar <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. <b>Reconectar ao desconectar-se</b>.<br />Fará com que o Mumble tente reconectar automaticamente após 10 segundos, se a conexão com o servidor falhar. Reconnect automatically Reconectar automaticamente Proxy Proxy Type Tipo Type of proxy to connect through Tipo do proxy ao qual se conectar Direct connection Conexão direta HTTP(S) proxy Proxy HTTP(S) SOCKS5 proxy Proxy SOCKS5 Hostname Nome de host Hostname of the proxy Nome de host do proxy Force TCP mode Forçar modo TCP Enable QoS to prioritize packets Ativar QoS para priorizar pacotes This will enable QoS, which will attempt to prioritize voice packets over other traffic. Ativa o QoS, que vai tentar priorizar pacotes de voz com relação a outro tráfego. Use Quality of Service Usar qualidade de serviços (QoS) Don't send certificate to server and don't save passwords. (Not saved). Não enviar certificado para o servidor e não salva senhas. (Não salvo). <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> <b>Suprime informação de identidade do cliente.</b><p>O cliente não vai se identificar com um certificado, mesmo se definido, e não vai salvar senhas nas conexões. Essa é basicamente uma opção de teste e não é salva.</p> Suppress certificate and password storage Impedir armazenamento de certificados e senhas <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>Tipo de proxy pelo qual se conectar</b><br />Isso faz o Mumble se conectar através de um proxy para todas as conexões externas. Nota: o uso de túneis por proxies força o Mumble ao modo de compatibilidade TCP, que causa o envio de todos os dados de voz usando o canal de controle. <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. <b>Endereço do servidor proxy.</b><br />Este campo especifica o nome de host do proxy que você deseja enviar o tráfego. Port Porta Port number of the proxy Número da porta do proxy <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. <b>Número da porta do proxy.</b><br />Este campo especifica o número da porta em que o proxy está esperando conexões. Username Usuário Username for proxy authentication Usuário para autenticação no proxy <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>Usuário para autenticação no proxy</b><br />Especifica o nome de usuário para autenticar você com o proxy. Caso o proxy não exija autenticação, ou você queira conectar anonimamente, simplesmente deixe este campo em branco. Password Senha Password for proxy authentication Senha para autenticação no proxy <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>Senha para autenticação no proxy</b><br />Especifica a senha para você usar para se autenticar com o proxy. No caso do proxy não exigir autenticação, ou você quiser se conectar anonimamente, simplesmente deixe esse campo em branco. Mumble services Serviços do Mumble Check for new releases of Mumble automatically. Verifica por novos lançamentos do Mumble automaticamente. This will check for new releases of Mumble every time you start the program, and notify you if one is available. Verifica por novos lançamentos do Mumble sempre que você iniciar o programa, e notifica você se uma estiver disponível. Check for application updates on startup Verifica por atualizações de aplicativo ao iniciar Check for new releases of plugins automatically. Verifica por novos lançamentos de complementos automaticamente. This will check for new releases of plugins every time you start the program, and download them automatically. Verifica por novos lançamentos de complementos toda vez que você iniciar o programa, e as baixa automaticamente. <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. <b>Enviar estatísticas anônimas.</b><br />O Mumble possui uma equipe de desenvolvimento pequena, e por isso precisa focar seu desenvolvimento onde ele é mais necessário. Ao enviar um pouco de estatísticas, você ajuda o projeto a determinar onde focar o desenvolvimento. Submit anonymous statistics to the Mumble project Enviar estatísticas anônimas ao projeto Mumble Submit anonymous statistics Enviar estatísticas anônimas Reconnect to last used server when starting Mumble Reconectar ao último servidor utilizado ao iniciar o Mumble Reconnect to last server on startup Reconectar ao último servidor ao iniciar Download plugin and overlay updates on startup Baixar atualizações de complementos e sobreimpressão ao iniciar Privacy Privacidade Prevent OS information being sent to Mumble servers and web servers Evitar o envio de informações sobre o SO para servidores e web servidores Mumble <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. <b>Não envie informação de SO para servidores</b><br/> Evita que o cliente envie informações potencialmente capazes de identificação sobre o sistema operativo para servidores e web servidores Mumble. Do not send OS information to Mumble servers and web servers Não enviar informação de SO para servidores e web servidores Mumble Overlay Silent Em Silêncio Talking Falando Whisper Sussurro Shout Grupo Channel Canal Failed to create communication with overlay at %2: %1. No overlay will be available. Falha ao cruzar comunicação com sobreimpressão em %2: %1. Nenhuma sobreimpressão estará disponível. OverlayClient Filter Filtrar Only talking Apenas falando Talking and recently active Falando e recentemente ativo All in current channel Todos no canal atual All in linked channels Todos em canais vinculados Always show yourself Sempre mostrar si próprio Configure recently active time (%1 seconds)... Configurar o tempo recentemente ativo (%1 segundos)... Columns Colunas Sort Ordenar Alphabetically Alfabeticamente Last state change Última mudança de estado Edit... Editar... Reset Zoom Redefinir aproximação Configure recently active time Configurar tempo recentemente ativo Amount of seconds users remain active after talking: Quantia de segundos usuários permanecem ativos após falar: OverlayConfig To move the users, drag the little red dot. Para mover usuários, arraste o pequeno ponto vermelho. To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. Para redimensionar os usuários, mova a roda do mouse sobre eles. For more options, right click a user. For more options, rightclick a user. Para mais opções, clique com o botão inverso em um usuário. Launcher Filter Filtro de Inicializador Overlay Sobreimpressão Choose executable Escolher executivo Choose application Escolher aplicativo Choose path Escolha o local Load Overlay Presets Carregar predefinições de sobreimpressão Mumble overlay presets (*.mumblelay) Predefinições de sobreimpressão do Mumble (*.mumblelay) Save Overlay Presets Salvar predefinições de sobreimpressão Options Opções Enable overlay. Ativar sobreimpressão. Enable Overlay Ativar Sobreimpressão This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. Configura se a sobreimpressão está ativa ou não. Esta configuração só é verificada quando aplicativos são iniciados, portanto tenha certeza de que o Mumble está rodando e esta opção está marcada antes de iniciar o aplicativo.<br />Por favor lembre-se que se você iniciar o Mumble depois do aplicativo, ou se você desativar a sobreimpressão com o aplicativo em execução, não um modo seguro de reiniciar a sobreimpressão sem também reiniciar o aplicativo. Layout Disposição Blacklist Lista negra Whitelist Lista branca Uninstall Overlay Desinstalar sobreimpressão Overlay Installation Instalação de sobreimpressão Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. O Mumble detectou que você não possui uma sobreposição instalada. Clique no botão abaixo para instalar a sobreposição. Install Mumble Overlay Instalar sobreposição Overlay Upgrade Atualizar sobreposição Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. O Mumble detectou uma versão antigo dos arquivos de suporte da sobreposição instalados no computador. Para atualizar estes arquivos para suas últimas versões, clique no botão abaixo. Upgrade Mumble Overlay Atualizar a sobreposição do Mumble Display a frame counter in the overlay Mostrar um contador de quadros na sobreposição Show FPS counter Mostrar contagem de FPS Load an overlay preset from file Carregar uma predefinição de sobreposição de um arquivo Load… Carregar... Save your overlay settings to file Salvar suas configurações de sobreposição para um arquivo Save… Salvar... Set the overlay font. Escolher a fonte da sobreposição. Set the overlay text color. Escolher cor do texto de sobreposição. Color Cor Remove Eliminar Font Fonte FPS and Clock Display Mostrador Relógio e FPS Display a clock in the overlay showing the current local time (system time). Mostrar um relógio na sobreimpressão exibindo a hora local atual (hora do sistema). Show Clock Mostrar Relógio Overlay Exceptions Exceções de Sobreimpressão Overlay Exception Mode Modo Sobreimpressão de Exceção Allowed launchers Inicializadores permitidos Add Adicionar Allowed programs Programas permitidos Allowed paths Locais permitidos Blacklisted programs Programas na lista negra OverlayEditor State Estado User is not talking O usuário não está falando Passive Passivo User is talking in your channel or a linked channel Usuário está falando para seu canal ou algum vinculado a ele Talking Falando User is whispering to you privately Usuário está sussurrando para você privadamente Private Whisper Sussurro privado User is shouting to your channel Usuário está gritando para seu canal Channel Whisper Sussurro ao canal Zoom Aproximação Zoom Factor Fator de aproximação Enabled Elements Ativar elementos User avatar, chosen by each user Avatar do usuário, escolhido por cada usuário Avatar Avatar User's name Nome do usuário Username Nome de usuário Name of user's channel, if outside your current channel Nome do canal do usuário, se fora do seu canal atual Channel Canal Muted or deafened Mudo ou surdo Mute state Estado mudo Bounding box, automatically shrunk to minimum size to contain all visible elements Caixa circundante, encolhe automaticamente a um tamanho mínimo para conter todos elementos visíveis Bounding box Caixa circundante Overlay Editor Editor de sobreposição OverlayEditorScene Layout preset Disposição predefinida Large square avatar Grande avatar quadrado Avatar and Name Avatar e Nome User Opacity Opacidade de Usuário %1% %1% Object Opacity Opacidade do Objeto Alignment Alinhamento Left Esquerda Center Centro Right Direita Top Superior Bottom Inferior Color... Cor... Font... Fonte... Bounding box Caixa circundante Pen width Espessura da linha Padding Preenchimento Pen color Cor da linha Fill color Cor de preenchimento Pick pen color Escolher cor da linha Pick fill color Escolher cor de preenchimento Pick color Escolher cor Pick font Escolher fonte PluginConfig Plugins Complementos Plugin has no configure function. Complemente não possui função de configuração. Plugin has no about function. Complemento não possui função sobre. Options Opções Enable plugins and transmit positional information Ativar complementos e transmitir informação posicional This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. Permite aos jogos suportados obter sua posição no jogo e, transmiti-la com cada pacote de voz. Isso permite outros que usuários ouçam sua voz no jogo da direção do seu personagem em relação aos deles. Link to Game and Transmit Position Ligar ao jogo e transmitir posição Reloads all plugins Recarregar todos complementos This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. Reescaneia e recarrega complementos. Use isto se você adicionou ou alterou um complemento no diretório de complementos. &Reload plugins &Recarregar complementos Information about plugin Informação sobre complemento This shows a small information message about the plugin. Mostra uma pequena mensagem de informação sobre o complemento. &About &Sobre Show configuration page of plugin Mostra a página de configuração do complemento This shows the configuration page of the plugin, if any. Mostra a página de configuração do complemento, se existir. &Configure &Configurar Name Nome Enabled Ativo Plugins Skipping plugin update in debug mode. Pulando atualização de complementos no modo de depuração. Downloaded new or updated plugin to %1. Baixou complemento novo ou atualizado para %1. Failed to install new plugin to %1. Falha ao instalar a novo complemento para %1. %1 lost link. %1 perdeu vínculo. %1 linked. %1 vinculado. PortAudioSystem Default Device Dispositivo padrão PulseAudioSystem Default Input Entrada padrão Default Output Saída padrão QApplication Failed to restart mumble Falha em reiniciar Mumble Mumble failed to restart itself. Please restart it manually. Mumble falhou em reiniciar. Por favor reinicie-o manualmente. RichTextEditor Failed to load image Falha ao carregar imagem Image file too large to embed in document. Please use images smaller than %1 kB. Arquivo de imagem grande demais para embutir no documento. Por favor utilize imagens com menos de %1 kB. Message is too long. Mensagem é longa demais. Display Visualização Source Text Texto Original &Bold &Negrito Ctrl+B Ctrl+B &Italic &Itálico Italic Itálico Ctrl+I Ctrl+I Underline Sublinhado Ctrl+U Ctrl+U Color Cor Insert Link Inserir link Ctrl+L Ctrl+L Insert Image Inserir imagem RichTextEditorLink Add Link Adicionar Link URL URL Text Texto ServerHandler Unable to resolve hostname Impossível resolver nome de host Server is not responding to TCP pings Servidor não responde pings TCP UDP packets cannot be sent to or received from the server. Switching to TCP mode. Pacotes UDP não podem ser enviados ou recebidos do servidor. Alternando para modo TCP. UDP packets cannot be sent to the server. Switching to TCP mode. Pacotes UDP não podem ser enviados ao servidor. Alternando para o modo TCP. UDP packets cannot be received from the server. Switching to TCP mode. Pacotes UDP não podem ser recebidos do servidor. Alternando para modo TCP. UDP packets can be sent to and received from the server. Switching back to UDP mode. Pacotes UDP podem ser enviados e recebidos do servidor. Alternando de volta para o modo UDP. Connection timed out Tempo de conexão esgotado ServerView Favorite Favorito LAN LAN Public Internet Internet Pública Unknown Africa África Asia Ásia North America América do norte South America América do sul Europe Europa Oceania Oceania ShortcutActionWidget Unassigned Não designado ShortcutDelegate On Ativo Off Inativo Toggle Alternar Unassigned Não designado ShortcutKeyWidget Press Shortcut Pressione atalho ShortcutTargetDialog Root Raiz Parent Pai Current Atual Subchannel #%1 Subcanal #%1 ShortcutTargetWidget ... ... , , Root Raiz Parent Pai Current Atual Subchannel #%1 Subcanal #%1 Invalid Inválido Empty <Empty> Vazio ShortcutToggleWidget Off Inativo Toggle Alternar On Ativo TextMessage Enter text Especifique o texto If checked the message is recursively sent to all subchannels Se marcado, a mensagem é enviada recursivamente para todos subcanais Send recursively to subchannels Enviar recursivamente aos subcanais Tokens Empty Token Credencial vazia Mumble - Access Tokens Mumble - Credenciais de acesso List of access tokens on current server Lista de credenciais no servidor atual <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. <b>Esta é uma lista editável de credenciais de acesso no servidor conectado.</b> <br /> Uma credencial de acesso é uma cadeia de caracteres de texto, que podem ser usada como uma senha para um gerenciamento de acesso simples nos canais. O Mumble lembrará das credenciais que você usar e irá reenviá-las para o servidor na próxima vez que você conectar, então você não precisa digitá-las sempre. Add a token Adicionar credencial &Add &Adicionar Remove a token Eliminar uma credencial &Remove &Eliminar UserEdit Registered Users Usuários registrados Remove Eliminar Rename Renomear Who are you looking for? Quem você procura? Days Dias Weeks Semanas Months Meses Years Anos Inactive for Inativo por Registered users: %n account(s) Usuários registrados: %n conta(s)Usuários registrados: %n conta(s) UserInformation User Information Informação de usuário Connection Information Informação da conexão Version Versão OS SO Certificate Certificado IP Address Endereço IP CELT Versions Versões do CELT Details... Detalhes... Ping Statistics Estatísticas de Ping Pings received Pings recebidos Average ping Ping médio TCP (Control) TCP (controle) UDP (Voice) UDP (voz) UDP Network statistics Estatísticas da rede UDP Good Bons Late Atrasados Lost Perdidos Resync Resinc From Client Do cliente To Client Para cliente Connection time Tempo de conexão %1w %1sem %1d %1d %1h %1h %1m %1m %1s %1s , , %1 (%2) %1.%2.%3 (%4) %1 (%2) Supported Suportado Not Supported Não Suportado Not Reported Não Informado %1 online (%2 idle) %1 conectado (%2 inativo) %1 online %1 conectado %1 kbit/s %1 kbit/s Bandwidth GroupBox Banda Bandwidth Label Largura de banda Ping deviation Variação de ping UserListModel Nick Apelido Inactive days Dias inativo Last channel Último canal Last seen: %1 Visto pela última vez: %1 Never Nunca Channel ID: %1 ID do canal: %1 UserLocalVolumeDialog Local volume for other users Volume local para outros usuários <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. <b>Ajusta o volume de outros usuários localmente</b><br />Mumble permite ajustar o volume de outros usuários localmente. Adjusting local volume for %1 Ajustando volume local para %1 dB dB <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> <html><head/><body><p>Use o controle deslizante ou a caixa de texto para alterar o volume do usuário.</p><p><span style="font-weight:600;">Atenção!</span></p><p>Aumentar o volume de um usuário demais pode danificar permanentemente sua audição. Também pode aumentar o ruído ambiente do usuário.</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: Este é um usuário conectado ao servidor. O ícone a esquerda do usuário indica se ele está ou não falando: Talking to your channel. Falando ao seu canal. Shouting directly to your channel. Whispering directly to your channel. Gritando diretamente ao seu canal. Whispering directly to you. Sussurrando diretamente a você. Not talking. Não falando. This is a channel on the server. The icon indicates the state of the channel: Este é um canal no servidor. O ícone indica o estado do canal: Your current channel. Seu canal atual. A channel that is linked with your channel. Linked channels can talk to each other. Um canal que esta vinculado ao seu canal. Canais vinculados podem conversar entre si. A channel on the server that you are not linked to. Um canal no servidor ao qual você não esta vinculado. This shows the flags the user has on the server, if any: Mostra as marcações que o usuário possui no servidor, caso possua: On your friend list Na sua lista de amigos Authenticated user Usuário autenticado Muted (manually muted by self) Mudo (manualmente por si) Muted (manually muted by admin) Mudo (manualmente pelo admin) Muted (not allowed to speak in current channel) Mudo (não permitido de falar no canal atual) Muted (muted by you, only on your machine) Mudo (por você, apenas na sua máquina) Muted (push-to-mute) Emudecido (pressione-para-emudecer) Deafened (by self) Ensurdecido (por si) Deafened (by admin) Ensurdecido (por admin) User has a new comment set (click to show) O usuário possui um novo comentário (clique para mostrar) User has a comment set, which you've already seen. (click to show) O usuário possui um comentário, que você já viu (clique para mostrar) Ignoring Text Messages Ignorando Mensagens de Texto This shows the flags the channel has, if any: Mostra as marcações que o canal possui, caso possua: Channel has a new comment set (click to show) O canal possui um novo comentário (clique para ver) Channel has a comment set, which you've already seen. (click to show) O canal possui um comentário, que você já viu. (clique para mostrar) Channel will be hidden when filtering is enabled Canal será ocultado quando filtro estiver ativo Name Nome Flags Marcações Are you sure you want to drag this user? Você tem certeza que deseja arrastar esse usuário? Are you sure you want to drag this channel? Você tem certeza de que quer mover este canal? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. Impossível realizar este movimento automaticamente, por favor redefina os indicadores de ordenação numérica ou ajuste manualmente. VersionCheck Upgrade Mumble Atualizar o Mumble A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? Uma nova versão do Mumble foi detectada e baixada automaticamente. É recomendado, ou você atualizar para essa versão, ou retornar para a última versão estável. Você deseja executar o instalador agora? Failed to launch snapshot installer. Falha ao executar o instalador da versão. Corrupt download of new version detected. Automatically removed. Detectado download corrupto da nova versão. Automaticamente eliminado. Downloading new snapshot from %1 to %2 Baixando nova versão teste de %1 para %2 Failed to write new version to disk. Failed to write new version to disc. Falha ao escrever a nova versão no disco. Mumble failed to retrieve version information from the central server. O Mumble falhou ao obter a informação de versão do servidor central. ViewCert Certificate Chain Details Detalhes da Cadeia de Certificados Certificate chain Cadeia de certificado Certificate details Detalhes do certificado Common Name Nome Comum Organization Organização Subunit Subunidade Country País Locality Localidade State Estado Valid from: %1 Válido de: %1 Valid to: %1 Válido até: %1 Serial: %1 Número de série: %1 Public Key: %1 bits %2 Chave pública: %1 bits %2 RSA RSA DSA DSA Digest (SHA-1): %1 Resumo (SHA-1): %1 Digest (SHA-256): %1 Resumo (SHA-256): %1 Email: %1 Email: %1 DNS: %1 DNS: %1 Issued by: Emitido por: Unit Name Nome de Unidade VoiceRecorder Recorder failed to create directory '%1' Gravador falhou ao criar o diretório '%1' Recorder failed to open file '%1' Gravador não conseguiu abrir o arquivo '%1' .wav - Uncompressed .wav - Não comprimido .ogg (Vorbis) - Compressed .ogg (Vorbis) - Comprimido .au - Uncompressed .au - Não comprimido .flac - Lossless compressed .flac - Comprimido sem perdas VoiceRecorderDialog Recorder Gravador Control Controle 00:00:00 00:00:00 &Start &Início S&top &Parar Mode Modo Multichannel Multicanal Output Saída Output format Formato da saída Target directory Caminho destino Filename Nome do arquivo &Browse... &Procurar... Valid variables are: Variáveis válidas são: Inserts the user's name Insere o nome do usuário Inserts the current date Insere a data atual Inserts the current time Insere o horário atual Inserts the hostname Insere o nome de host Recorder still running Gravador ainda em execução Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? Fechar o gravador sem pará-lo rejeitará todo áudio não salvo. Realmente deseja fechá-lo? Unable to start recording. Not connected to a server. Impossível iniciar a gravação. Não conectado a um servidor. The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. O servidor ao qual você está conectado é versão 1.2.2 ou anterior. Por motivos de privacidade, gravar em servidores anteriores à versão 1.2.3 não é possível. Por favor contate seu administrador de servidor para mais informações. There is already a recorder active for this server. Já há um gravador ativo para esse servidor. Please select a recording format. Por favor escolha um formato de gravação. Stopping Parando Select target directory Selecione o caminho destino Downmix Remixagem WASAPIInput Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone. Acesso ao microfone foi negado. Por favor verifique que as configurações do microfone em seu sistema operativo permitem que o Mumble utilize o microfone. WASAPISystem Default Device Dispositivo padrão qwPTTButtonWidget Mumble PTT Mumble PPF Push to talk Pressione para falar mumble-1.3.4/src/mumble/ThemeInfo.cpp0000664000175000017500000001200114010707273017265 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "ThemeInfo.h" QFileInfo ThemeInfo::StyleInfo::getPlatformQss() const { #if defined(Q_OS_WIN) return qssFiles.value(QLatin1String("WIN"), defaultQss); #elif defined(Q_OS_LINUX) return qssFiles.value(QLatin1String("LINUX"), defaultQss); #elif defined(Q_OS_MAC) return qssFiles.value(QLatin1String("MAC"), defaultQss); #else return defaultQss; #endif } boost::optional readStyleFromConfig(QSettings &themeConfig, const QString &styleId, const ThemeInfo &theme, const QDir &themeDir) { QRegExp qssPlatformRegex(QString::fromLatin1("^%1/qss_(.*)").arg(styleId)); ThemeInfo::StyleInfo style; style.name = themeConfig.value(QString::fromLatin1("%1/name").arg(styleId)).toString(); style.themeName = theme.name; style.defaultQss = QFileInfo(themeDir.filePath(themeConfig.value(QString::fromLatin1("%1/qss").arg(styleId)).toString())); if (style.name.isNull()) { qWarning() << "Style " << styleId << " of theme" << theme.name << " has no name, skipping theme"; return boost::none; } if (!style.defaultQss.exists() || !style.defaultQss.isFile()) { qWarning() << "Style " << style.name << " of theme " << theme.name << " references invalid qss " << style.defaultQss.filePath() << ", skipping theme"; return boost::none; } foreach (const QString &platformQssConfig, themeConfig.allKeys().filter(qssPlatformRegex)) { qssPlatformRegex.indexIn(platformQssConfig); const QString platform = qssPlatformRegex.cap(1); QFileInfo platformQss = (themeDir.filePath(themeConfig.value(platformQssConfig).toString())); if (!platformQss.exists() || !platformQss.isFile()) { qWarning() << "Style" << style.name << " of theme " << theme.name << " references invalid qss " << platformQss.filePath() << " for platform " << platform << ", skipping theme"; return boost::none; } style.qssFiles.insert(platform, platformQss); } return style; } boost::optional loadLegacyThemeInfo(const QDir &themeDirectory) { ThemeInfo theme; theme.name = themeDirectory.dirName(); QStringList filters; filters << QLatin1String("*.qss"); foreach (const QFileInfo &qssFile, themeDirectory.entryInfoList(filters, QDir::Files)) { ThemeInfo::StyleInfo style; style.name = qssFile.baseName(); style.themeName = theme.name; style.defaultQss = qssFile; theme.styles.insert(style.name, style); } if (theme.styles.isEmpty()) { qWarning() << themeDirectory.absolutePath() << " does not seem to contain a old-style theme, skipping"; return boost::none; } theme.defaultStyle = theme.styles.begin()->name; return theme; } boost::optional ThemeInfo::load(const QDir &themeDirectory) { QFile themeFile(themeDirectory.absoluteFilePath(QLatin1String("theme.ini"))); if (!themeFile.exists()) { qWarning() << "Directory " << themeDirectory.absolutePath() << " has no theme.ini, trying fallback"; return loadLegacyThemeInfo(themeDirectory); } QSettings themeConfig(themeFile.fileName(), QSettings::IniFormat); if (themeConfig.status() != QSettings::NoError) { qWarning() << "Failed to load theme config from " << themeFile.fileName() << ", skipping"; return boost::none; } ThemeInfo theme; QStringList styleIds; theme.name = themeConfig.value(QLatin1String("theme/name")).toString(); styleIds = themeConfig.value(QLatin1String("theme/styles")).toStringList(); if (theme.name.isNull()) { qWarning() << "Theme in " << themeFile.fileName() << " does not have a name, skipping"; return boost::none; } if (styleIds.isEmpty()) { qWarning() << "Theme " << theme.name << " doesn't have any styles, skipping"; return boost::none; } foreach (const QString &styleId, styleIds) { boost::optional style = readStyleFromConfig(themeConfig, styleId, theme, themeDirectory); if (!style) { return boost::none; } theme.styles.insert(style->name, *style); } theme.defaultStyle = theme.styles.begin()->name; return theme; } ThemeInfo::StyleInfo ThemeInfo::getStyle(QString name_) const { Q_ASSERT(styles.contains(defaultStyle)); return styles.value(name_, styles.value(defaultStyle)); } ThemeMap ThemeInfo::scanDirectory(const QDir &themesDirectory) { ThemeMap themes; foreach (const QFileInfo &subdirInfo, themesDirectory.entryInfoList(QDir::AllDirs | QDir::NoDotAndDotDot)) { QDir subdir(subdirInfo.absoluteFilePath()); boost::optional theme = ThemeInfo::load(subdir); if (!theme) { continue; } themes.insert(theme->name, *theme); }; return themes; } ThemeMap ThemeInfo::scanDirectories(const QVector &themesDirectories) { ThemeMap themes; foreach (const QDir &themesDirectory, themesDirectories) { foreach (const ThemeInfo &theme, scanDirectory(themesDirectory)) { themes.insert(theme.name, theme); } } return themes; } mumble-1.3.4/src/mumble/ManualPlugin.ui0000664000175000017500000003066514010707273017656 0ustar builderbuilder Manual 0 0 631 436 Manual Mumble Positional Audio 2 0 Position Qt::ScrollBarAlwaysOff Qt::ScrollBarAlwaysOff 0 0 0 0 0 0 true -50.000000000000000 -50.000000000000000 100.000000000000000 100.000000000000000 QPainter::Antialiasing|QPainter::TextAntialiasing X Qt::AlignCenter Y Qt::AlignCenter Z Qt::AlignCenter m m m 0 0 Heading ° 360 0 0 Azimuth Qt::AlignCenter -180 180 30 90 90 true 6.000000000000000 true ° -90 90 0 0 Elevation Qt::AlignCenter 0 360 30 true 6.000000000000000 true Qt::Vertical 20 40 Meta data Context Identity Set Set 0 0 State true Link true false Activate true false Unhinge Qt::Horizontal QDialogButtonBox::Close|QDialogButtonBox::Reset false buttonBox accepted() Manual accept() 248 254 157 274 buttonBox rejected() Manual reject() 316 260 286 274 mumble-1.3.4/src/mumble/mumble_he.ts0000664000175000017500000146166514010707274017242 0ustar builderbuilder ACLEditor Deny אסור Allow התר Allow %1 התר %1 Deny %1 אסור %1 Mumble - Add channel ‫Mumble - הוסף ערוץ Default server value ערך שרת ברירת מחדל Failed: Invalid channel שגיאה: ערוץ לא חוקי Mumble - Edit %1 Mumble - ערוך %1 ID: %1 מזהה: %1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 אפשרות זו מקנה הרשאת %1. אם הרשאה הינה מותרת וגם אסורה בו-זמנית, היא תבוטל.<br/>%2 Channel must have a name ערוץ מוכרח להכיל שם This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 פעולה זו מבטלת הרשאת %1. אם הרשאה הינה מאופשרת וגם מבוטלת בו-זמנית, היא תבוטל.</br>%2 Dialog דו שיח Name שם Enter the channel name here. הזן את שם הערוץ כאן. Description תיאור Password סיסמא Enter the channel password here. הזן סיסמת ערוץ כאן. Check to create a temporary channel. סמן כדי ליצור ערוץ זמני. Temporary זמני <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>מיקום</b></br> ערך זה מאפשר לך לשנות את הדרך שבה Mumble מארגנת את הערוצים ברשימת הערוצים. ערוץ בעל ערך <i>מיקום</i>גדול יותר ימוקם תמיד מתחת לערוץ בעל ערך מיקום נמוך יותר, ולהפך. אם ערך ה<i>מיקום</i> עבור שני ערוצים זהה, הם ימוקמו לפי סדר אלפבתי. Position מיקום &Groups &קבוצות Group קבוצה List of groups רשימה של קבוצות Remove selected group הסר קבוצה נבחרת Remove הסרה Inherit group members from parent הורש חברי קבוצה מן הורה Inherit הורש Make group inheritable to sub-channels הפוך קבוצה לברת הרשה לערוצי משנה Inheritable בר הורשה Group was inherited from parent channel קבוצה עברה בירושה מן ערוץ הורה Inherited תורשתי Members חברים Add הוספה Add member to group הוסף חבר אל קבוצה Remove member from group הסר חבר מן קבוצה &ACL &הרשאות Active ACLs ‏ACL־ים פעילים List of entries רשימת ערכים Inherit ACL of parent? קבל בתורשה את הרשאות קבוצת האב? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. אפשרות זו קובעת האם ההרשאות-של ערוצי האב תעבורנה בתורשה גם לערוץ זה. רק רשומות שעבורן הוגדרה האפשרות "העבר בתורשה לערוצי המשנה" בערוצי האב נכללים בהגדרה זו. Inherit ACLs קבל הרשאות בירושה Move entry up הזז רשומה מעלה This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. מעלה את הרשומה ברשימה. כיוון שהרשומות נקראות לפי הסדר, פעולה זו עלולה להשפיע על ההרשאות בפועל של המשתמש. אין אפשרות להעביר רשומה מעל לרשומה שנורשה מערוץ אב. אם יש צורך בכך, עליך לשכפל את הרשומה של ערוץ האב. &Up מ&עלה Move entry down הזז רשומה מטה This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. מוריד את הרשומה מקום אחד למטה. כיוון שהרשומות נקראות לפי הסדר, פעולה זו עלולה להשפיע על ההרשאות בפועל של המשתמש. &Down מ&טה Add new entry הוסף רשומה חדשה This adds a new entry, initially set with no permissions and applying to all. מוסיף רשומה חדשה לרשימה, שברירת המחדל שלה היא "ללא הרשאות" עבור "כולם". &Add הוס&ף Remove entry הסר רשומה This removes the currently selected entry. מסיר את הרשומה המסומנת. &Remove הס&ר Context הקשר Entry should apply to this channel. Entry should apply to this channel הרשומה תיושם בערוץ זה. This makes the entry apply to this channel. מיישם את הרשומה בערוץ הנוכחי. Applies to this channel מיושם לערוץ זה Entry should apply to sub-channels. מיישם את הרשומה בכל ערוצי המשנה. Add new group הוספת קבוצה חדשה <b>Add</b><br/> Add a new group. <b>הוסף</b><br/> מוסיף קבוצה חדשה. Inherited members חברים שנורשו Contains the list of members added to the group by this channel. מכיל רשימה של המשתמשים שנוספו לקבוצה דרך הערוץ הזה. Contains a list of members whose group membership will not be inherited from the parent channel. מכיל רשימה של חברים שחברותם בקבוצה לא תתקבל בירושה מערוץ האב. Contains the list of members inherited by other channels. כולל רשימה של חברי הקבוצה שהתקבלו בירושה מערוצים אחרים. Type in the name of a user you wish to add to the group and click Add. הכנס את שמו של המשתמש אותו ברצונך להוסיף לקבוצה ולחץ על "הוסף". Type in the name of a user you wish to remove from the group and click Add. הכנס את שמו של המשתמש אותו ברצונך להסיר מן הקבוצה ולחץ על "הוסף". Exclude הוצאה Excluded members חברים מוצאים This makes the entry apply to sub-channels of this channel. מיישם את הרשומה בערוצי המשנה של הערוץ הזה. Applies to sub-channels מיושם בערוצי המשנה Permissions הרשאות User/Group משתמש/קבוצה Group this entry applies to הקבוצה שבה הרשומה הזו מיושמת User ID ID משתמש User this entry applies to המשתמש שעבורו מיושמת הרשומה הזו This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. מגדיר עבור איזה משתמש תיושם הרשומה הזו. הכנס את שם המשתמש והקש אנטר כדי לתשאל את השרת למציאת התאמה. &Properties &מאפיינים <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>שם</b><br />הכנס את שם הערוץ. השם חייב להתאים לחוק השמות של השרת שאליו אתה מחובר. <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>זמני</b><br /> יוצר את הערוץ כזמני. ערוצים זמניים נמחקים אוטומטית ברגע שהשחקן האחרון עוזב אותם. <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>קבוצה</b><br /> אלו הן כל הקבוצות אשר מוגדרות עבור הערוץ. כדי ליצור קבוצה חדשה, הכנס את שמה והקש אנטר. <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>הסר</b><br /> אפשרות זו תסיר את הקבוצה הנבחרת. אם הקבוצה נורשת מערוץ אב כלשהו, היא לא תוסר, אך כל ההגדרות שלה עבור הערוץ הספציפי הזה יימחקו. <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>קבל קבוצות בירושה</b><br /> מכליל את כל החברים מקבוצת האב, אם קבוצת האב מסומנת כניתנת להורשה. <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>ניתנת להורשה</b><br />אפשרות זו מאפשרת לקבוצה לעבור בתורשה לערוצי משנה. אם אפשרות זו מבוטלת, לערוצי המשנה עדיין יש אפשרות ליצור קבוצה נוספת עם אותו השם. <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>התקבלה בהורשה</b><br />מסמל שהקבוצה התקבלה בתורשה מערוץ אב כלשהו. אין אפשרות לערוך את הסמן הזה, כיוון שהוא ליידוע בלבד. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>חברים</b><br />זוהי רשימה שמכילה את כל החברים שנוספו לקבוצה דרך ערוץ זה. שימו לב שרשימה זו אינה מכילה חברים שנורשו מערוצי אב כלשהם, שכן את אלו ניתן למצוא ברשימת <i>חברים שנורשו</i>. כדי למנוע מהרשימה הזאת לעבור בתורשה לערוצי משנה, יש לבטל את הסימון של אפשרות "<i>ניתנת להורשה</i> או להוסיף באופן ידני את חברי הקבוצה אל רשימת ה<i>חברים לא כלולים</i>. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>חברים לא כלולים</b><br /> זוהי רשימה שמכילה את חברי הקבוצה שלא יועברו בתורשה מערוץ האב. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. <b>חברים שנורשו</b><br /> רשימה זו מכילה את כל חברי הקבוצה שנורשו מערוצי האב. כדי לבטל קבלת חברים בירושה, יש לבטל את הסימון של <i>קבל קבוצות בירושה</i>. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. אפשרות זו שולטת בקבוצת המשתמשים שעבורה תיושם הרשומה הזו.<br />שימו לב שהיישום יהיה רק על הקבוצה שמוגדרת בערוץ הנבחר. למשל: רשימת ההרשאות ברירת המחדל בערוץ השורש מעניקה הרשאת <i>כתיבה</i> לקבוצת <i>admin</i>. הרשומה הזו, אם תועבר בתורשה לערוץ אחר, תיתן למשתמש הרשאת כתיבה אם הוא שייך לקבוצת האדמין של הערוץ הזה, גם אם הוא לא שייך לקבוצת האדמין בערוץ שממנו נורשה ההרשאה.<br />אם שמה של קבוצה מסוימת מתחיל ב'!', החברות בה מתהפכת, ואם הוא מתחיל '~', ההרשאות שלה ייושמו בערוץ שממנו מגיעות ההרשאות, ולא בערוץ שבו הן מופעלות.<br />אם שם הקבוצה מתחיל ב'#', היא מפורשת כמפתח גישה. המשתמש חייב להכניס את מה שבא לאחר ה'#' ברשימת הסיסמאות שלהם כדי להתאים. זה יכול לשמש כגישה מבוססת סיסמא בסיסית מאוד לערוצים עבור משתמשים לא רשומים או לא מזוהים.<br />אם שמה של קבוצה מתחיל '$', היא תתאים רק למשתמשים שהצפנת תעודות האבטחה שלהם מתאימה למה שבא לאחר ה'$'.<br />מספר קבוצות מיוחדות הוגדרו מראש, ואלו הן:<br /><b>all</b> - כל המשתמשים נכללים בה.<br /><b>auth</b> - כל המשתמשים הרשומים יתאימו לה.<br /><b>sub,a,b,c</b> - משתמשים בתת ערוץ בעומק מינמלי של <i>a</i> ובין <i>b</i> ל-<i>c</i> בשרשרת הערוצים. הכנסו לאתר Mumble לעוד מידע על קבוצה זו.<br /><b>in</b> - משתמשים שמצאים ברגע זה בערוץ יתאימו (שימושי עבור קבוצת sub).<br /><b></b> - משתמשים מחוץ לערוץ ברגע זה יתאימו (שימושי עבורי קבוצת sub).<br />שימו לב שהרשומה תיושם למשתמש או לקבוצה, אך לא לשניהם. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. <b>סיסמא</b><br />שדה זה מאפשר לך להגדיר בקלות את סיסמאת הערוץ. הגדרה זו משתמשת בתכונת "מפתחות-גישה" של Mumble. ניתן להשתמש במערכת ההרשאות והקבוצות אם יש צורך בשליטה מדויקת יותר על הגישות לערוץ. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. מראה את כל הרשומות הפעילות בערוץ זה. רשומות שנורשו מערוצי אב יוצגו בכתב נטוי. ההרשאות נקראות מלמעלה למטה, כך שעדיפותן גדלה ככל שמתקדמים ברשימה. ID of the channel. מזהה של הערוץ. Maximum Users מספר משתמשים מקסימלי Maximum number of users allowed in the channel <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. This is the sort order for the channel. ALSAAudioInput Default ALSA Card כרטיס ALSA משתמט Opening chosen ALSA Input failed: %1 פתיחת קלט ה-ALSA שנבחר נכשלה: %1 ALSAAudioOutput Default ALSA Card כרטיס ALSA משתמט Opening chosen ALSA Output failed: %1 פתיחת פלט ה-ALSA שנבחר נכשלה: %1 ASIOConfig %1 (version %2) %1 (גירסא %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz %1 -> %2 דגימות אגירה, עם %3 רזולוצית דגימה (%4 מועדף) ב-%5 הרץ ASIO Initialization failed: %1 אתחול ASIO נכשל: %1 Failed to instantiate ASIO driver טעינת מנהל ההתקן של ASIO נכשלה ASIO ASIO Device selection בחירת התקן Device התקן Device to use for microphone התקן לשימוש עבור מיקרופון This chooses what device to query. You still need to actually query the device and select which channels to use. אפשרות זו קובעת את ההתקן שיתושאל. עם זאת, עדיין יש צורך לתשאל את ההתקן בפועל ולבחור את הערוצים שיהיו בשימוש. Query selected device תחקור התקן נבחר This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. אפשרות זו תתשאל את ההתקן על הערוצים שבו. שים לב שמנהלי התקנים רבים של ASIO עדיין מלאים בתקלות, ולכן ייתכן שתשאול שלהם יגרום לתוכנה או למערכת כולה לקרוס. &Query &שאילתא Configure selected device הגדרת התקן נבחר This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. אפשרות זו תגדיר את ההתקן. שימו לב שמנהלי התקנים רבים של ASIO עדיין מלאים בתקלות, ולכן ייתכן שתשאול שלהם יגרום לתוכנה או למערכת כולה לקרוס. &Configure &תצורה Capabilities יכולות Driver name שם מנהל התקן Buffer size שיעור אגירה This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. אפשרות זו תגדיר את ערוצי הקלט עבור ASIO. וודאו שבחרתם לפחןת ערוץ אחד כמיקרופון ואחד כרמקולים. <i>מיקרופון</i> צריך להיות המקום שאליו מחובר המיקרופון שלכם, ו<i>רמקולים</i> צריך להיות ערוץ קול שדוגם את '<i>מה שאתם שומע</i>'.<br />לדוגמא, במקרה של Audigy 2 ZS, בחירה טובה עבור המיקרופון תהיה '<i>Mic L</i>, והרמקולים יהיו '<i>Mix L</i> ו'<i>Mix R</i>. Configure input channels הגדרת ערוצי קלט Channels ערוצים Microphone מיקרופון <- -> -> <- Unused לא בשימוש Speakers רמקולים ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. עליך לבחור לפחות מיקרופון אחד ורמקול אחד כדי להשתמש ב-ASIO. אם אתה זקוק רק לדגימות מיקרופון, השתמש ב-DirectSound. Opening selected ASIO device failed. No input will be done. פתיחת התקן ה-ASIO הנבחר נכשלה. לא יבוצע קלט. AboutDialog About Mumble אודות Mumble <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble &אודות Mumble &License &רשיון A&uthors &Third-Party Licenses OK אישור AudioInput Interface ממשק System מערכת Input method for audio שיטת קלט לשמע <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>זוהי שיטת הקלט עבור שמע שבה תרצה להשתמש.</b><br />כנראה שתרצו להשתמש בשיטת DirectSound. Device התקן Input device for audio <p dir="RTL">התקן קלט עבור שמע</p> <b>This is the input device to use for audio.</b> <b>זהו התקן הקלט שישמש עבור קול</b> Transmission שידור &Transmit &שדר When to transmit your speech מתי לשדר את הדיבור שלך <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. <p dir="RTL"><b>אפשרות זו קובעת מתי לשדר את הדיבור שלך.</b> <br /><i>מתמשך</i> - כל הזמן<br /><i>פעילות קולית</i> - כאשר אתם מדברים.<br /><i>לחץ כדי לדבר</i> - כאשר אתם מחזיקים את מקש הדיבור שנקבע בהגדרות.</p> DoublePush Time זמן לחיצה כפולה If you press the PTT key twice in this time it will get locked. אם תקישו פעמיים על מקש הדיבור בפרק הזמן שתקבעו כאן, הוא יינעל. <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. <p dir="RTL"><b>זמן הלחיצה הכפולה</b><br />אם תלחץ על לחצן הדיבור פעמיים בטווח הזמן שהוגדר הלחצן יינעל. Mumble ימשיך לשדר עד שתלחץ על הלחצן שוב כדי לשחרר את לחצן הדיבור מחדש.</p> Reset audio cue to default החזר את איתות השמע לברירת המחדל <b>Reset</b><br/>Reset the paths for the files to their default. <b>אפס</b><br/>מאפס את הנתיב אל הקבצים לברירת המחדל. Browse for on audio file בחר צליל ללחיצה Browse for off audio file בחר קובץ לעזיבה Off מבוטל On לחיצה Preview the audio cues תצוגה מקדימה של צלילי הלחיצה Use SNR based speech detection השתמש בזיהוי דיבור מבוסס SNR Signal to Noise יחס אות לרעש <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. מגדיר את זיהוי הקול למבוסס עוצמ. המצב הזה, העוצמה עצמה של אות הקלט תפעיל את זיהוי הדיבור. Amplitude מבוסס עוצמה Voice &Hold ה&משכיות קול How long to keep transmitting after silence לכמה זמן ימשיך שידור הקול מאז סוף הדיבור Silence Below עוצמת שקט <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. <b>מגדיר את הרף לזיהוי קול. </b><br />השתמשו באפשרות זו ביחד עם חלון סטטיסטיקות הקול כדי לכוון את ערכי הרף ידנית. ערכי קלט מתחת ל"עוצמתשקט" תמיד ייחשבו כשקט. ערכים מעל ל"עוצמת דיבור" נחשבים תמיד לדיבור. ערכים ביניהם ייחשבו כדיבור אם כבר זוהה דיבור, אך לא יגרמו לזיהוי חדש. Speech Above עוצמת דיבור Signal values above this count as voice עוצמת אות מעל לערך הזה ייחשבו כדיבור Compression דחיסה &Quality &איכות Quality of compression (peak bandwidth) איכות הדחיסה (בשיא רוחב הפס) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. <p dir="RTL"><b>אפשרות זו קובעת את איכות הדחיסה</b><br />זה יקבע בכמה רוחב פס מותר ל-Mumble להשתמש עבור שידור שמע.</p> Audio per packet שמע בכל חבילה How many audio frames to send per packet כמה יחידות שמע לשלוח בכל חבילת מידע <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>אפשרות זו קובעת כמה מסגרות קול יכללו בחבילהאחת.</b><br />הגדלת הערך הז יגדיל את האחזור של הקול שלכם, אך יפחית צריכת רוחב פס. <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). <b>אפשרות זו מראה את רוחב הפס שנמצא בשימוש בשיא.</b><br />מראה את תפוסת רוחב הפס של שידור הקול שלכם. קצב סיביות הקול הוא קצב הסיביות המקסימלי (כיוון שאנו משתמשים ב-VBR) של נתוני הקול בלבד. מיקום הוא קצב הסיביות של מידע המיקום. סיכומית היא כמות המסגרות והתחיליות של חבילות ה-IP (IP ו-UDP הם 75% מהסיכומית). Audio Processing עיבוד שמע Noise Suppression דיכוי רעש Noise suppression דיכוי רעש <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. <b>אפשרות זו מגדירה את עוצמת דיכוי הרעש </b><br />שתיושם. ככל שערך גבוה יותר, כך השתקת הרעש תהיה עוצמתית יותר. Maximum amplification of input sound הגברה מקסימלית של קלט השמע <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. <b>הגברה מקסימלית עבור קלט.</b><br />Mumble מאזן את עוצמת הקלט לפני הדחיסה, והגדרה זו קובעת עד כמה מותר להגביר.<br />העוצמה בפועל מתעדכנת באופן מתמשך לפי הדיבור שלכם, אך היא לעולם לא תעלה מעל לערך שהוגדר כאן.<br />אם <i>עוצמתיות המיקרופון</i> של סטטיסטיקות הקול שואפת ל-100%, כנראה שתרצו להגדיר את הערך הזה לערך 2.0, אך עבור רוב האנשים אין אפשרות להגיע ל-100, ולכן כדאי להגדיר ערך גבוה הרבה יותר.<br />באופן אידאלי, הנוסחא המומלצת לקביעת הערך היא <i>עוצמתיות מיקרופון * ערך ההגברה >= 100</i>, אפילו אם אתם מדברים נורא חלש.<br /><br />שימו לב שקביעת ערך מקסימלי כאן לא תגרום לנזק, אך Mumble יתחיל להגביר מאוד גם שיחות אחרות אם תשאירו את הערך הזה למקסימום. Current speech detection chance סיכוי זיהוי הדיבור הנוכחי Cancel echo from speakers ביטול הד מן רמקולים Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. אפשרות זו תבטל את ההד האקוסטי מהרמקולים שלכם. למצב 'ערבול' יש צריכת מעבד נמוכה מאוד, אך הוא יעבוד כראוי רק אם הרמקולים שלכם שווים בעוצמתם ובמרחקם מהמיקרופון. ביטול הד רב-ערוצי מספק ביטול הד הרבה יותר טוב, אך במחיר של צריכת מעבד גבוהה יותר. Disabled מבוטל <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>אפשרות זו מגדירה את זיהוי הקול למצב 'יחס אות-לרעש'.</b><br />במצב זה, הקלט מנותח כנגד דוגמית שנחשבת לאות נקי לחלוטין, וההשוואה בין שני הקולות קובעת בסופו של דבר אם להפעיל את הזיהוי. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>חלק זה מראה את הגדרות זיהוי הדיבור הנוכחיות.</b><br />אתם יכולים לשנות את ההגדרות הללו מחלון ההגדרות או באשף הקול. Signal values below this count as silence ערכים מתחת לערך הזה נחשבים לשקט Maximum bandwidth used for sending audio רוחב פס מקסימלי לשליחת קול Use Amplitude based speech detection השתמש בזיהוי דיבור מבוסס עוצמה <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). <b>אפשרות זו קובעת למשך כמה זמן ימשיך שידור הקול לאחר שזוהה שקט.</b><br />בחרו כאן ערך גבוה יותר אם קולכם נקטע באמצע בזמן שאתם מדברים (ניתן לראות זאת אם סמל הדיבור ליד שמכם מהבהב שוב ושוב). Exclusive mode מצב בלעדי <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>אפשרות זו פותחת את ההתקן במצב בלעדיות.</b><br />אף תוכנה אחרת לא תוכל להשתמש בהתקן הזה. Exclusive בלעדי R&eset &אפס &Browse... &עיון... B&rowse... &עיון... &Preview ת&צוגה מקדימה <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. <b>השמעה מקדימה</b><br/>משמיע את צליל ה<i>לחיצה</i> הנוכחי ומיד אחריו את צליל ה<i>עזיבה</i>. Displays an always on top window with a push to talk button in it מציג חלון עם כפתור "לחץ-כדי-לדבר" שנשאר תמיד עליון Display push to talk window מראה את חלון "לחץ-כדי-לדבר" Misc שונות Audible audio cue when starting or stopping to transmit סמן קול שמשמיע צליל כאשר השידור מתחיל ומפסיק <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. <b>אפשרות זו מפעילה את סמן השידור.</b><br />סמן השידור ישמיע אות קצר כשאתם מתחילים ומפסיקים לשדר. Audio cue איתות שידור Gets played when starting to transmit מושמע כשהשידור מתחיל Gets played when stopping to transmit מושמע כשהשידור מפסיק Hold Time התמשכות קול Time the microphone stays open after the PTT key is released פרק הזמן שבו המיקרופון נשאר פתוח לאחר שמקש הדיבור נעזב Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) רוחב הפס של תעבורת הרשת של השרת הוא רק %1 קב"ש. איכות הקול כוונה אוטומטית ל-%2 קב"ש (%3 מ"ש) Max. Amplification הגברה מרבית Idle action פעולה עצלה minutes do דקות nothing אל תעשה כלום deafen החרש את עצמך mute השתק את עצמך after לאחר Echo Cancellation Mixed echo cancellation Multichannel echo cancellation The idle action will be reversed upon any key or mouse button input Undo Idle action upon activity Apply RNNoise's noise suppression filter. <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. RNNoise Audio input AudioInputDialog Continuous מתמשך Voice Activity פעילות קול Push To Talk לחץ כדי לדבר Audio Input קלט שמע %1 ms %1 מ"ש Off כבוי %1 s %1 ש %1 kb/s %1 קב"ש -%1 dB -%1 דציבלים %1 kbit/s (Audio %2, Position %4, Overhead %3) %1 קב"ש (קולי %2, מיקום %4, סיכומית %3) AudioOutput Interface ממשק System מערכת Output method for audio שיטת פלט עבור שמע <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>זוהי שיטת הפלט עבור קול.</b><br />רוב הסיכויים הם שתרצו להשתמש ב-DirectSound. Device התקן Output device for audio התקן פלט עבור קול <b>This is the output device to use for audio.</b> <b>זהו ההתקן שישמש כפלט קול.</b> Positional Audio שמע מיקומי Audio Output פלט שמע Default &Jitter Buffer אגירת רי&צוד עיקרית Safety margin for jitter buffer שולי ביטחון עבור אגירת ריצוד <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. <b>אפשרות זו מגדירה את שולי הביטחון עבור אגירת הריצוד.</b><br />כל הצלילים הנכנסים נאגרים, ואגירת הריצוד מנסה באופן מתמשך להקטין את המאגר הזה למינימום האפשרי ברשת שלך, כך שאחזור בדיבור יהיה קטן ככל האפשר. אפשרות זו מגדירה את גודל האגירה המינימלי לשימוש. אם תחילת הדיבור של משתמשים אחרים מקוטעת, יש להגדיל את הערך הזה. Minimum distance to user before sound volume decreases מרחק מינימלי עד משתמש אחר טרם ירידה בעוצמת קול This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. אפשרות זו קובעת את המרחק המינימלי לחישובי קול. עוצמת הקול של הדיבור של המשתמש האחר לא יונמך עד אשר המרחק בינכם יהיה לפחות הערך שנקבע כאן. This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. אפשרות זו קובעת את המרחק המקסימלי לחישובי קול. עוצמת הקול של שחקן אחר לא תונמך יותר כאשר המרחק ממנו גדול מהערך הזה. <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. <b>אפשרות זו מפעילה את אחד ממצבי בדיקת ההחזר.</b><br /><i>ללא</i> - ביטול מצב ההחזר<br /><i>מקומי</i> - הדמייה של שרת מקומי.<br /><i>שרת</i> - מנסה לקבל החזר מן השרת.<br />שימו לב שבמידה וההחזר מופעל, משתמשים אחרים לא ישמעו את קולכם.ההגדרה הזו אינה נשמרת כאשר יוצאים מתוך Mumble. Volume עוצמת קול Volume of incoming speech עוצמת קול של דיבור נכנס <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. <p dir="RTL"><b>אפשרות זו קובעת את עוצמת הקול של דיבור נכנס</b><br />שימו לב שאם תעלו ערך זה מעל 100%, איכות הקול כנראה תושפע לרעה.</p> Output Delay השהיית פלט Amount of data to buffer כמות נתונים לאגירה The connected "speakers" are actually headphones The connected "speakers" are actually headphones. הרמקולים המחוברים הם למעשה אוזניות Factor for sound volume decrease הערך להפחתת עוצמת הקול Bloom הגברה Factor for sound volume increase ערך עבור הגברת עוצמת הקול How much should sound volume increase for sources that are really close? בכמה תעלה עוצמת הקול עבור מקורות קרובים מאוד? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. סימון אפשרות זו משמעו שאין ברשותכם רמקולים, רק אוזניות. זה עניין חשוב, כיוון שרמקולים בדרך נמצאים מלפני המשתמש, בעוד שאוזניות נמצאות היישר מצדדי הראש. This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. אפשרות זו קובעת את כמות הנתונים לאחסון במאגר הזמני לפני שחרור הפלט. נסו ערכים שונים ובחרו את הערך הכי נמוך שאינו גורם לרעידות והפרעות בשמע. Headphones אוזניות Minimum Distance מרחק מינימלי Maximum Distance מרחק מקסימלי Maximum distance, beyond which speech volume won't decrease המרחק מקסימלי שאחריו עוצמת הקול לא תונמך עוד Minimum Volume עוצמת קול מינימלית What should the volume be at the maximum distance? מה תהיה עוצמת הקול במרחק המקסימלי? Loopback Test בדיקת החזר קול Delay Variance שוני שהייה Variance in packet latency שוני באחזור של חבילת מידע <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>אפשרות זו מגדירה את שוני האחזור עבור בדיקת החזר.</b><br />רוב תשתיות הקול מכילות כמות מסוימת של השהייה.אפשרות זו מאפשרת לכם לקבוע השהיית קול נוספת על האחזור שכבר קיים ברשת שלכם עבור בדיקת ההחזר. לדוגמה, אם תגדירו את הערך ל-15 מ"ש, תיווצר הדמייה של רשת עם פינג של 25-30 מ"ש או של 80-95 מ"ש בהתאם למצב הרשת. רוב הרשתות הביתיות מכילות כ-5 מ"ש של השהייה נוספת. Packet Loss איבוד חבילת מידע Packet loss for loopback mode מידע שאבד במצב החזר <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% <b>מגדיר את איבוד המידע למצב החזר.</b><br />זה יהיה אחוז החבילות שלא הגיעו. כל עוד רוחב הפס היוצא שלכם אינו תפוס לחלוטין או שמשהו לא בסדר עם הרשת שלכם, הערך כאן יהיה 0% &Loopback הח&זר Desired loopback mode מצב החזר רצוי Attenuate applications by... החלשת אפליקציות בשיעור של... Attenuation of other applications during speech הנמכת תוכניות אחרות בזמן דיבור <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. <p dir="RTL"><b>הנמכת תוכניות אחרות בזמן דיבור</b><br />Mumble תומך בהפחתת העוצמה של תוכניות אחרות בזמן קליטה ו/או שידור של דיבור. ערך זה קובע בכמה תונמך עוצמת הקול של תוכניות אחרות כשאפשרות זו מופעלת.</p> If checked Mumble lowers the volume of other applications while other users talk כאשר מסומן, Mumble ינמיך את עוצמת הקול של יישומים אחרים בזמן שמשתמשים אחרים מדברים <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. <p dir="RTL"><b>הנמכת תוכניות אחרות בזמן שמשתמשים אחרים מדברים</b><br />Mumble תומך בהפחתת העוצמה של תוכנות אחרות בזמן דיבור נכנס או יוצא. סימון התיבה יגרום ל-Mumble להנמיך תוכניות אחרות בזמן שמשתמשים אחרים מדברים.</p> while other users talk כאשר משתמשים אחרים מדברים If checked Mumble lowers the volume of other applications while you talk כאשר מסומן, Mumble ינמיך את עוצמת הקול של יישומים אחרים בזמן שאתה מדבר <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. <p dir="RTL"><b>הנמכת תוכניות אחרות בזמן שאתה מדבר</b><br />Mumble תומך בהפחתת העוצמה של תוכניות אחרות בעת דיבור נכנס או יוצא. סימון התיבה יגרום ל-Mumble להנמיך תוכניות אחרות בזמן שמשתמשים אחרים מדברים.</p> while you talk כאשר אתה מדבר Exclusive mode, not recommended. מצב בלעדי, לא מומלץ. <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>אפשרות זו תפתח את ההתקן במצב בלעדיות.</b><br />אף תוכנה אחרת לא תוכל להשתמש בהתקן זה. Exclusive בלעדי Priority Speaker מועדף דיבור If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. כאשר מסומן, Mumble ינמיך את עוצמת הקול של משתמשים אחרים בזמן שאתם מדברים בתנאי שיש לכם את המצב :מועדפי דיבור". <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. <p dir="RTL"><b>הנמכת משתמשים אחרים בזמן דיבור כמועדף דיבור</b><br />Mumble תומך בהנמכת עוצמת הקול של משתמשים אחרים כאשר אתם מדברים בתור <i>מועדפי דיבור</i> כדי למנוע מאחרים להפריע לכם. סימון תיבה זו יפעיל את האפשרות הזו.</p> Attenuate other users while talking as Priority Speaker. הנמך משתמשים אחרים בזמן דיבור כמועדף דיבור. Advanced Attenuation Options If checked, Mumble will only attenuate applications that are using the same output source as Mumble <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. Only attenuate applications using the same output device If checked, PulseAudio loopback modules will be attenuated <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. Attenuate PulseAudio loopback modules Audio output AudioOutputDialog None ללא Local מקומי Server שרת Audio Output פלט שמע %1 ms %1 מ"ש %1 % %1 % %1 m %1 מ AudioOutputSample Choose sound file בחר קובץ צליל Invalid sound file קובץ צליל לא תקין The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. לא ניתן להשתמש בקובץ %1 עם Mumble. אנא בחרו קובץ בעל פורמט וקידוד נתמכים. AudioStats >1000 ms >1000ms >1000 מ"ש Audio Statistics סטטיסטיקת קול Input Levels רמות קלט Peak microphone level רמת מיקרופון מירבית Peak power in last frame עוצמה מירבית במסגרת האחרונה This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. מראה את העוצמה המירבית במסגרת הזמן האחרונה (20 מ"ש), שתהיה בדרך כלל זהה לזאת שמוצגת כ"עוצמת קלט". מומלץ להתעלם מנתון זה ולבדוק את <b>עוצמת המיקרופון</b> במקום, שכן היא הרבה יותר יציבה ומדויקת. Peak speaker level רמת רמקולים מירבית This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. מראה את העוצמה המירבית של הרמקולים במסגרת הזמן האחרונה (20 מ"ש). כל עוד אינכם משתמשים בשיטת דגימה רב-ערוצית (כמו ASIO) שמוגדרים בה רמקולים, הערך הזה יהיה 0. אם הגדרתם שיטה כזו אך הערך הוא עדיין 0 כאשר מושמע קול מתוכניות אחרות, ההגדרות שלכם אינן תקינות. Peak clean level שיא רמה נקייה This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. מראה את העוצמה המירבית במסגרת הזמן האחרונה (20 מ"ש) לאחר כל תהליכי העיבוד.באופן אידאלי, הערך צרך להיות -96dB כשאינכם מדברים. במציאות, אולפן הקלטות יקבל ערך של כ-60 dB ואתם אמורים לקבל כ-20 dB במצב טוב. כשאתם מדברים, העוצמה צריכה לעלות לערך בין -5 ו-10 dB.<br />אם אתם משתמשים בביטול הד אקוסטי, והערך הזה עולה מעל ל-15 dB כשאינכם מדברים, ההגדרות שלם אינן תקינות ואתם עלולים לחרפן משתמשים אחרים עם הדים עוצמתיים. Signal Analysis ניתוח אותות Microphone power עוצמת מיקרופון How close the current input level is to ideal כמה קרובה רמת הקלט הנוכחית למצב אידאלי This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. זה מראה עד כמה קרובה עוצמת הקלט הנוכחית למצב אידאלי. כדי לשנות את עוצמת המיקרופון שלכם, פתחו את ממשק הגדרות הקול שלכם והביטו על הערך שכאן כאשר אתם מדברים.<b>דברו חזק, כאילו אתם עצבניים שאיזה נוב הרג אתכם בצורה משפילה.</b><br />שנו את עוצמת הקול עד שהערך הזה יהיה קרוב ל-100%, אך וודאו שהוא לא עולה על כך. אם הוא כן עולה על כך, רוב הסיכויים שהעוצמה תעבור את הגבול בזמן שתדברו, וזה יגרום לאיכות הקול לרדת. Signal-To-Noise ratio יחס אות-לרעש Signal-To-Noise ratio from the microphone יחס אות-לרעש מהמיקרופון This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. זהו יחס האות-לרעש (יא"ר או SNR) של המיקרופון שלכם במסגרת הזמן האחרונה (20 מ"ש). זה מראה כמה קל להבדיל בין קולכם לבין רעשי רקע.<br />אם הערך הזה הוא מעל ל-1.0, סימן שיש יותר רעש מאשר קול, ומכאן שהאיכות ירודה.<br /> אין גבול עליון לערך הזה, אבל אל תצפו לראות יותר מ-40 או 50 אם אתם לא באולפן הקלטות מקצועי. Speech Probability סיכוי לדיבור Probability of speech הסיכוי לדיבור This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). זהו הסיכוי שהאות במסגרת הזמן האחרונה (20 מ"ש) היה דיבור ולא רעש רקע.<br />הפעלה קולית של המיקרופון תלויה בנכונות הערך הזה. אמצע המשפט שלכם תמיד יזוהה כדיבור; הבעיה היא ההפסקה בין המילים והתחלת הדיבור. קשה לזהות במדויק מתי המשתמש מדבר ומתי לא, כמו להבדיל בין אנחה לבין מילה שמתחילה באות ה'.<br />אם הערך מודגש, סימן ש-Mumble משדרת את קולכם כרגע (אם אתם מחוברים לשרת). Configuration feedback משוב הגדרות Current audio bitrate קצב סיביות נוכחי Bitrate of last frame קצב הסיביות של מסגרת הזמן האחרונה DoublePush interval טווח לחיצה-כפולה Time between last two Push-To-Talk presses הזמן בין שתי הלחיצת האחרונות על מקש הדיבור Speech Detection זיהוי דיבור Current speech detection chance סיכוי זיהוי הדיבור הנוכחי <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>ערך זה מראה את הגדרות זיהוי הדיבור הנוכחיות.</b><br />ניתן לשנות אותן בחלון האפשרויות או באשף הגדרות הקול. Signal and noise power spectrum מרחב עוצמות אות ורעש Power spectrum of input signal and noise estimate הערכת מרחב העוצמות של אותות ורעשים This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. ערך זה מראה את מרחב העוצמות של קלט האותות (קו אדום) והשערות הרעש הנוכחיות (קו כחול מלא).<br />כל המשרעות מוכפלות ב-30 כדי להראות את החלקים המעניינים יותר (כמה אותות לעומת רעש יש בכל דגימה).<br />כנראה שתתעניינו בנתון זה רק אם אתם מנסים לתקן את תנאי הרעש מן המיקרופון שלהם. בתנאים טובים, צריך להיות רק מעט מהצבע הכחול בתחתית. אם הצבע הכחול נמצא מעל למחצית הגרף, אתם נמצאים בסביבה יותר מדי רועשת. Echo Analysis ניתוח הד Weights of the echo canceller משקל מבטל ההד האקוסטי This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. ערך זה מראה את משקלו של מבטל ההד האקוסטי, כשציר הזמן החיובי הוא כלפי מטה והשכיחות כלפי צד ימין.<br />במצב אידאלי, הגרף אמור להיות שחור לחלוטין, מה שמראה שאיןהד כלל. מצב נפוץ יותר הוא שיש פס אופקי אחד או יותר של צבע כחלחל שמראה את ההד המעוכב. אתם אמורים לראות את התונים מתעדכנים בזמן אמת.<br />שימו לב שאם אין לכם בעיות עם הדים, אתם לא תמצאו כאן מידע שימושי. נגנו קצת מוזיקה והמצב יתייצב.<br />אתם יכולים לבחור לראות את החלקים האמיתיים או הדמיוניים של ציר השכיחות, או לחלופין את המודולים המחושבים. רוב הסיכויים שהמודולים המחושבים יהיו המידע השימושי יותר, שכן הם למעשה משרעת ההד, ומראים כמה מהקול נמחק בפעימה. שאר התצוגות שימושיות רק למי שרוצה לתקן את אלגוריתם ביטול ההד.<br />שימו לב: אם התמונה זזה במהירות כשאתם צופים במודולים, זה אומר שמבטל ההד האקוסטי לא מצליח למצוא כל תיאום בין המיקרופון והרמקולים. במצב כזה, כנראה שיש השהייה ארוכה של ההד, או שאחד מההתקנים אינו מוגדר כראוי. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. זהו קצב סיביות הקול של מסגרת הזמן הדחוסה האחרונה (20 מ"ש), ולכן הערך ישתנה במהירות כשה-VBR משנה את האיכות. קצב הסיביות המירבי ניתן לשינוי בחלון ההגדרות. AudioWizard Audio Tuning Wizard אשף כיוון צלילים Introduction מבוא Welcome to the Mumble Audio Wizard ברוך בואך אל אשף כיוון השמע של Mumble Finished מוגמר Enjoy using Mumble המשך שימוש נעים בתוכנית Mumble Device selection בחירת התקן Selecting the input and output device to use with Mumble. <p dir="RTL">בחירת התקני הקלט והפלט לשימוש עם Mumble.</p> This is the device your microphone is connected to. זהו ההתקן שהמיקרופון שלך מחובר אליו. System מערכת Input method for audio שיטת קלט לשמע <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <p dir="RTL"><b>זוהי השיטה לקליטת קול.</b><br />רוב הסיכויים שתרצו להשתמש ב-DirectSound.</p> Device התקן Input device to use התקן קלט לשימוש <b>Selects which sound card to use for audio input.</b> <p dir="RTL"><b>בוחר באיזה כרטיס קול להשתמש עבור קלט הקול.</b></p> Cancel echo from headset or speakers <p dir="RTL">בטל הד אקוסטי מהרמקולים או מהאוזניות</p> Use echo cancellation ביטול הד This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. <p dir="RTL">אפשרות זו מפעילה את מבטל ההדים על צלילים יוצאים, שיכול לעזור גם עם רמקולים וגם עם אוזניות.</p> This is the device your speakers or headphones are connected to. <p dir="RTL">זהו ההתקן שאליו מחוברים הרמקולים או האוזניות.</p> Output method for audio <p dir="RTL">שיטת פלט השמע</p> <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. <p dir="RTL"><b>זוהי השיטה לפלט הקול.</b><br />רוב הסיכויים שתרצו להשתמש ב DirectSound.</p> Output device to use <p dir="RTL">התקן הפלט לשימוש</p> <b>Selects which sound card to use for audio Output.</b> <p dir="RTL"><b>בוחר באיזה כרטיס קול להשתמש עבור פלט הקול.</b></p> Enable positional audio הפעל צליל מבוסס מיקום Allows positioning of sound Allows positioning of sound. <p dir="RTL">מאפשר מיקום של צלילים</p> <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> <p> זהו אשף כיוון הצלילים עבור Mumble. הוא יעזור לך להכניס את דרגות הקלט הנכונות עבור כרטיס הקול שלך, וגם את ההגדרות הנכונות לעיבוד הקול בתוך Mumble. </p> <p> בבקשה לשים לב כי כל עוד האשף פועל, הקול יועבד מקומית במערכת ויחזור אליך כדי שתוכל להקשיב לו, ושום דבר לא ישלח אל השרת. </p> Input Device התקן קלט Output Device התקן פלט This allows Mumble to use positional audio to place voices. <p dir="RTL">אפשרות זו מאפשרת ל-Mumble להשתמש בצלילים מבוססי מיקום כדי למקם קולות בתאם למרחקם ממכם.</p> <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> <p>כדי לשמור על אחזור קטן ככל האפשר, זה חשוב שכרטיס הקול יעבד כמה שפחות צלילים. לעומת זאת, הרבה כרטיסי קול מדווחים שהם דורשים מעט מדי מידע ממה שהם מסוגלים לעבד, כך שהדרך היחידה לקבוע זאת היא ניסיון ותהייה. </p> <p> אתם אמורים לשמוע דוגמית קול. הזיזו את הכוון לערך הנמוך ביותר <b>שלא</b> יוצר הפרעות או תקיעות בצליל. נא לשים לב שההד המקומי מבוטל בזמן מבחן זה. </p> Amount of data to buffer כמות של נתונים לאגירה This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. <p dir="RTL">זה קובע את כמות המידע לעיבוד מקדים במעבד הפלט. התנסה בערכים שונים וקבע את זה בנמוך ביותר שלא גורםריצוד מהיר בצליל.</p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> <p dir="RTL"> פתחו את הגדרות השמע של המחשב שלכם ועברו להגדרות הקלט. וודאו שהמיקרופון שלכם פועל ושעוצמת ההקלטה שלו מקסימלית. אם קיימת אפשרות בשם "הגברת מיקרופון" (Microphone Boost), וודאו שהיא מסומנת גם כן. </p> <p dir="RTL"> כעת דברו בקול רם, כאילו שאתם עצבניים או נרגשים. הנמיכו את עוצמת ההקלטה בהגדרות הקלט של המחשב עד שהפס שבחלון זה מגיע כמה שיותר רחוק באזור הירוק והכחול, אך <b>לא</b> באזור האדום בזמן שאתם מדברים. </p> Positional Audio <p dir="RTL">צליל מבוסס מיקום</p> Adjusting attenuation of positional audio. <p dir="RTL">כוונון הנמכת הקול עבור צליל מבוסס מיקום.</p> <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> <p dir="RTL"> Mumble תומך בצליל מבוסס מיקום עבור משחקים מסוימים, וימקם את הצליל של משתמשים אחרים בהתאם למיקומם במשחק. לפי מיקום זה, עוצמת הקול של המשתמש תשתנה בין שני זוגות הרמקולים או האוזניות כדי ליצור אשליה של דיבור ממקום אחר. אפשרות זו דורשת הגדרה נכונה של הרמקולים במערכת ההפעלה, ולכן נבצע כאן בדיקה. </p> <p dir="RTL"> בתרשים למטה מוצג המיקום font color="red">שלכם</font>, של <font color="yellow">הרמקולים</font> ושל <font color="green">מקור הקול הנע</font>, במבט מלמעלה. אם הכל מוגדר כראוי, אתם אמורים לשמוע את הצליל משתנה לפי מיקומו מסביבכם. </p> Use headphones instead of speakers השתמש באוזניות במקום ברמקולים <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> <p>מזל טוב! כעת באפשרותך להנות מחווית קול עשירה יותר עם Mumble. </p> <p> תהליך הפיתוח של Mumble נמשך כל הזמן, וצוות הפיתוח רוצה להתמקד על אפשרויות שיועילו לרוב המשתמשים. בשביל זה, Mumble תומך בשליחת סטטיסטיקות אנונימיות לגבי הגדרות התצורה שלך אל המפתחים. הסטטיסטיקות הללו חיוניות לפיתוח, וגם מבטיחות שהאפשרויות שבהן אתה משתמש לא יבוטלו בעתיד. </p> Use headphones השתמש באוזניות This ignores the OS speaker configuration and configures the positioning for headphones instead. אפשרות זו תתעלם מהגדרות מערכת ההפעלה עבור הרמקולים ותשתמש בהגדרות המתאימות לאוזניות במקום. Volume tuning כיוון עצמת קול Tuning microphone hardware volume to optimal settings. <p dir="RTL">כיוונון הווליום של המיקרופון לרמה האופטימלית.</p> Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. כעת דברו חלש, כאילו אתם מדברים באמצע הלילה ולא רוצים להעיר אף אחד. הזיזו את המחוון שלמטה כך שהמד יגיע אל האזור הירוק כאשר אתם מדברים, אך ישאר באזור הכחול כאשר אתם שותקים. Voice Activity Detection <p dir="RTL">הפעלה קולית</p> Letting Mumble figure out when you're talking and when you're silent. <p dir="RTL">אפשר ל-Mumble להבין מתי אתם מדברים ומתי אתם שותקים.</p> This will help Mumble figure out when you are talking. The first step is selecting which data value to use. <p dir="RTL">זה יאפשר ל-Mumble להבין מתי אתה מדבר. הצעד הראשון הוא לבחור באיזה ערך להשתמש.</p> Raw amplitude from input <p dir="RTL">עוצמת קול מן הקלט</p> Signal-To-Noise ratio <p dir="RTL">יחס אות-לרעש</p> Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). <p dir="RTL">כעת אתם צריכים לכוון את המחוון הבא. ההברות הראשונות שאתם אומרים צריכות להגיע לחלק הירוק (דיבור וודאי). בזמן שאתם מדברים, הפס צריך להישאר בחלק הצהוב (דיבור אפשרי) וכשאתם לא מדברים, הפס צריך להישאר בחלק האדום (שתיקה וודאית).</p> Device tuning כיונון התקן Changing hardware output delays to their minimum value. שינוי שהיות פלט חומרה אל ערכם הקטן ביותר. Submit anonymous statistics to the Mumble project שלח סטטיסטיקות אנונימיות אל הפרוייקט Mumble Push To Talk: לחץ כדי לדבר: Quality & Notifications איכות וגם התראות Adjust quality and notification settings. <p dir="RTL">הגדרות איכות והתראות.</p> Quality settings הגדרות איכות Low נמוכה Balanced מאוזנת Notification settings הגדרות התראה Use Text-To-Speech to read notifications and messages to you. השתמש בתכונת טקסט-לדיבור של המחשב שלך כדי להקריא לך הודעות והתראות. Disable Text-To-Speech and use sounds instead. בטל את תכונת טקסט-לדיבור והשתמש בצלילים במקומה. %1 ms %1 מ"ש Enables attenuation of other applications while users talk to you <p dir="RTL">אפשר הנמכה של תוכניות אחרות בזמן שמשתמשים מדברים אליך</p> Attenuate applications while other users talk הנמך תוכניות אחרות בזמן שמשתמשים אחרים מדברים High גבוהה Custom מותאמת You already set a customized quality configuration in Mumble. Select this setting to keep it. כבר קבעת תצורת איכות מותאמת בתוך Mumble. בחר את אפשרות זו כדי להמשיך ולהשתמש בה. Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. <p dir="RTL">מאפשר הנמכה של תוכניות אחרות בזמן שמשתמשים מדברים אליך. הכוונה היא שברגע שמישהו מתחיל לדבר אליך ב-Mumble, העוצמה של כל שאר התוכניות (כמו נגני מוזיקה) יונמכו כדי שיהיה אפשר לשמוע אותם טוב יותר.</p> Apply some high contrast optimizations for visually impaired users <p dir="RTL">הפעל מצב ניגודיות תצוגה גבוהה למשתמשים כבדי ראייה.</p> Use high contrast graphics השתמש בגרפיקה בעלת חדות גבוהה Keep custom Text-To-Speech settings. שמור הגדרות טקסט-לדיבור מותאמות אישית. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode <p dir="RTL"> פתחו את בקרת עוצמת השמע שלכם ועברו להגדרות ההקלטה. ודאו שהמיקרופון מסומן כקלט הפעיל עם עוצמת ההקלטה המקסימלית. אם קיימת אפשרות בשם "Microphone Boost" (הגברת מיקרופון),ודאו שהיא מסומנת. </p> <p dir="RTL"> כעת דברו חזק, כאילו שאתם עצבניים או נרגשים. הורידו את העוצמה בחלון בקרת העוצמה עד שהפס שלפניכם נשאר גבוה ככל האפשר באזור ההחלק או המפוספס אבל <b>לא</b> באזור הזיגזג בזמן שאתם מדברים. </p> Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode <p dir="RTL">כעת דברו חלש, כאילו שאתם מדברים באמצע הלילה ולא רוצים להפריע לאף אחד. התאימו את המחוון כך שהפס יזוז אל תוך החלק הריק בזמן שאתם מדברים, אבל ישאר בחלק המפוספס כאשר אתם שותקים.</p> Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode <p dir="RTL">כעת אתם צריכים לכוון את המחוון הבא. ההברות הראשונות שאתם אומרים צריכות להגיע לחלק הריק (דיבור וודאי). בזמן שאתם מדברים, הפס צריך להישאר בחלק המפוספס (סיכוי לדיבור) וכשאתם לא מדברים, הפס צריך ליהיות בחלק הזיגזגים (שתיקה וודאית).</p> In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) כשהגדרה זו פעילה, Mumble ישתמש ב<b>כמות נמוכה מרוחב הפס</b>. אפשרות זו תוביל בוודאות לאחזור ארוך ולאיכות קול ירודה. השתמשו בה רק אם החיבור שלכם לא עומד בשאר ההגדרות. (16 קב"ש, 60 מ"ש לכל חבילה) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) זוהי <b>הגדרת ברירת המחדל המומלצת</b>. היא מספקת איזון טוב בין איכות, אחזור וניצול רוחב פס. (40 קב"ש, 20 מ"ש לכל חבילה) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) ההגדרה הזאת מומלצת רק במקרים שבהם רוחב פס אינו יכול להוות בעיה, כמו רשת מקומית (LAN). היא מספקת את האחזור הנמוך ביותר על ידי Mumble תומך בה ו<b>איכות גבוהה</b>. (72 קב"ש, 10 10 מ"ש לחבילה) BanEditor Mumble - Edit Bans ‫Mumble - ערוך מנודים &Address &כתובת &Mask &מסיכה Reason סיבה Start התחלה End סוף User משתמש Hash ערבול &Add הוס&ף &Update &עדכן &Remove הס&ר Ban List רשימת נידוי Search field שדה חיפוש This is the search field. Use it to find bans that have this username set in the username field. זהו שדה החיפוש. השתמש בזה כדי למצוא מנודים אשר להם שם משתמש זה הוגדת בתוך השדה שם משתמש. Who are you looking for? את מי אתה מחפש? No nickname אין שם כינוי IP address כתובת IP No IP address אין כתובת IP Reason for the ban סיבה לנידוי No reason אין סיבה Ban end date תאריך סיום נידוי Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). תאריך סיום נידוי. אם תקבע את אותו תאריך לתחילה ולסוף, הנידוי יהיה לצמיתה (זה לא תיפקע). Certificate hash מערבל תעודה No certificate hash אין מערבל תעודה Banned users משתמשים מנודים This is a list with banned users. <p dir="RTL">זוהי רשימת המשתמשים החסומים.</p> Use this button if you want to add a new ban. <p dir="RTL">לחצו כאן אם תרצו להוסיף חסימה חדשה.</p> Use this button if you want to update ban information. <p dir="RTL">לחצו כאן אם תרצו לעדכן נתוני חסימה מסוימת.</p> Use this button if you want to remove user from the ban list. <p dir="RTL">לחצו כאן אם ברצונכם להסיר משתמש מסוים מרשימת החסומים.</p> Clear all fields טהר את כל השדות This button clears all fields. Use it if you want to add a new ban. <p dir="RTL">כפתור זה מנקה את כל השדות. לחצו כאן אם ברצונכם להוסיף חסימה חדשה.</p> Clear טהר Ban List - %n Ban(s) רשימת נידוי - מנודה %nרשימת נידוי - %n מנודיםרשימת נידוי - %n מנודיםרשימת נידוי - %n מנודים CertView Name שם Email דוא"ל Issuer מנפיק Expiry Date תאריך פקיעה (none) (ללא) Self-signed חתומה באופן עצמי CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. לא ניתן לאמת את כתובת הדוא"ל. הכניסו כתובת חוקית (או השאר ריק) כדי להמשיך. There was an error generating your certificate.<br />Please try again. חלה תקלה בתהליך יצירת תעודת האבטחה שלכם.<br /> אאנא נסו שוב. Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. לא ניתן לייצא את תעודת האבטחה והמפתח לפורמט PKCS#12. ייתכן כי יש שגיאה בתוך התעודה שלכם. The file could not be opened for writing. Please use another file. לא ניתן לפתוח את הקובץ לכתיבה. בחרו קובץ אחר בבקשה. The file's permissions could not be set. No certificate and key has been written. Please use another file. הרשאות הקובץ לא היו ניתנות לקביעה. לא נכתבו תעודה וגם מפתח. אנא השתמש בקובץ אחר. The file could not be written successfully. Please use another file. לא ניתן לכתוב לקובץ. בחרו קובץ אחר בבקשה. The file could not be opened for reading. Please use another file. לא ניתן לפתוח את הקובץ לקריאה. בחרו קובץ אחר בבקשה. The file is empty or could not be read. Please use another file. הקובץ ריק או שלא ניתן לקרוא ממנו. בחרו קובץ אחר בבקשה. The file did not contain a valid certificate and key. Please use another file. הקובץ אינו מכיל תעודת אבטחה ומפתח תקינים. בחרו קובץ אחר בבקשה. Select file to export certificate to בחרו קובץ שאליו תיוצא התעודה Select file to import certificate from בחרו קובץ שממנו תיובא התעודה Unable to import. Missing password or incompatible file type. <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. <b>פקיעת תעודה:</b> תוקפה של תעודת האבטחה שלכם עומד לפקוע. עליכם לחדש אותה או שלא תוכלו להתחבר יותר אל השרתים שאתם רשומים בהם. Certificates Certificate Management ניהול תעודה Certificate Authentication אימות תעודה Authenticating to servers without using passwords אימות עם שרתים ללא שימוש בסיסמאות Current certificate תעודה נוכחית This is the certificate Mumble currently uses. זוהי התעודה בה Mumble משתמש כעת. Current Certificate תעודה נוכחית Create a new certificate יצירת תעודה חדשה This will create a new certificate. זו תיצור תעודה חדשה. Import certificate from file ייבוא תעודה מתוך קובץ This will import a certificate from file. זו תייבא תעודה מתוך קובץ. Import a certificate ייבוא תעודה Export Certificate ייצוא תעודה This will export a certificate to file. זו תייצא תעודה אל קובץ. Export current certificate ייצוא תעודה נוכחית Import Certificate ייבוא תעודה PKCS #12 Certificate import ייבוא תעודת PKCS #12 <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p dir="rtl">Mumble יכול לייבא תעודות שמאוכסנות בפורמט PKCS #12. זהו הפורמט שבשימוש כאשר מייבאים מפתח מתוך Mumble, וגם כאשר מייבאים מפתחות מתוך Firefox, Internet Explorer, Opera ואחרים</p><p>במידה והקובץ הינו מוגן סיסמה, יהיה עליך לעשות שימוש בסיסמה כדי לייבא את הסיסמה.</p> Import from ייבוא מן Filename to import from שם קובץ לייבא ממנו This is the filename you wish to import a certificate from. זהו שם הקובץ ממנו תרצו לייבא תעודה. Select file to import from בחירת קובץ לייבא ממנו This opens a file selection dialog to choose a file to import a certificate from. כפתור זה פותח תיבת דו-שיח לבחירת הקובץ שממנו תיובא תעודה. Open... פתיחה... Password סיסמה Password for PKCS#12 file סיסמה עבור קובץ PKCS#12 This is the password for the PKCS#12 file containing your certificate. זוהי הסיסמא לקובץ ה-PKCS #12 שמכיל את התעודה לייבוא. Certificate to import תעודה לייבוא This is the certificate you are importing. זוהי התעודה שאתם מייבאים. Certificate Details פרטי תעודה Replace Certificate החלפת תעודה Replace existing certificate with new certificate? להחליף תעודה קיימת עם אחת חדשה? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> <p>יש לכם כבר תעודת אבטחה ש-Mumble משתמש בו, ואתם עומדים להחליף אותו.</p> <p>אם אתם משדרגים לתעודת אבטחה שהונפק על ידי מנפיק מורשה וכתובת הדוא"ל זהה לכתובת הדואר הנוכחית, אין מה לדאוג, שכן השרתים שבהם אתם רשומים ימשיכו לזהות אתכם ואת תעודת האבטחה המורשה. </p> <p>אם זה לא המצב, אתה לא תזוהה יותר על ידי השרתים שכבר הזדהת בפניהם. אם עוד לא נרשמת לאף שרת, אין ממה לדאוג. </p> <p> האם אתה בטוח כי ברצונך להחליף את תעודת האבטחה שלך? </p> This is the certificate Mumble currently uses. It will be replaced. זוהי התעודה אשר Mumble משתמש בה כרגע. תעודה זו תוחלף. New certificate תעודה חדשה This is the new certificate that will replace the old one. זוהי תעודת האבטחה החדשה אשר תחליף את זו הישנה. New Certificate תעודה חדשה Make a backup of your certificate הכן גיבוי של תעודתך Export to יצא אל Filename to export to שם קובץ לייצא אליו This is the filename you wish to export a certificate to. זהו שם הקובץ שאליו תרצו לייצא את התעודה. Save As... שמירה בתור... This is the certificate Mumble currently uses. It will be exported. זוהי התעודה אשר Mumble משתמש בה כרגע. תעודה זו תיוצא. Generate a new certificate for strong authentication הלחנת תעודה חדשה לאימות חזק <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> <p dir="rtl">‫Mumble יחולל כעת תעודה חזקה עבור אימות עם שרתים.</p><p>באם רצונך בכך, באפשרותך לספק מידע נוסף לאחסון בתעודה, שיוצג לשרתים בעת התחברותך. אם תסופק כתובת דוא"ל תקפה, תהיה ביכולתך לשדרג אל תעודת דוא"ל מונפקת CA אחר כך, המספקת זהות חזקה.</p> Name שם Email דוא"ל Your email address (e.g. johndoe@mumble.info) כתובת הדוא"ל שלך (למשל johndoe@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. זוהי כתובת הדוא"ל שלכם. מומלץ מאוד לספק כתובת תקינה, כיוון שכך תוכלו לשדרג לתעודת אבטחה משודרגת ללא בעיות זיהוי. Your name (e.g. John Doe) שמך (למשל John Doe) This is your name, and will be filled out in the certificate. This field is entirely optional. זהו שמכם, והוא ירשם בתעודת האבטחה. שדה זה הוא בחירה בלבד, וניתן לוותר עליו. Finish סיום Certificate-based authentication is ready for use תעודה מבוססת אימות הינה מוכנה לשימוש Enjoy using Mumble with strong authentication. המשך שימוש נעים בתוכנית Mumble בעזרת אימות חזק. Automatic certificate creation יצירה אוטומטית של תעודה <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p dir="rtl">אם אי פעם תאובד לך תעודתך הנוכחית, דבר שיקרה אם מחשבך סובל מן כשל קושחה או שמכונתך תותקן מחדש, לא תהיה לך היכולת להתאמת עם אף שרת בו הינך נרשמת אליו. לכן זה <b>מחוייב</b> שיוכן גיבוי של תעודתך. אנחנו ממליצים בחוזקה לאחסן את גיבוי זה על אחסון בר הזזה, כגון דיסקון USB.</p> <p dir="rtl">לתשומת לבך: קובץ זה לא יהיה מוצפן, ואם מישהו ישיג גישה אליו, תעמוד להם האפשרות להתחזות אליך, ולכן מוטב לשמור על תעודה זו באופן קפדני.</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> ChanACL None אין Traverse מעבר Enter כניסה Speak דיבור Mute/Deafen השתק/החרש Make channel יצירת ערוץ Make temporary יצירת ערוץ זמני Link channel קישור ערוץ This represents no privileges. מייצג אפס הרשאות. This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. מייצג גישה מלאה לערוץ, כולל היכולת לשנות את קבוצתו ואת ה-ACL שלו. הרשאה זו מכילה את כל שאר ההרשאות. This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. מייצג את ההרשאה לעבור בערוץ. אם למשתמש אין את ההרשאה הזו, הוא לא יוכל להצטרף לערוץ הזה ולכל תת-ערוץ שלו בכל דרך, ללא קשר להרשאות בתת ערוצים. This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. מייצג את ההרשאה להכנס לערוץ. אם יש לשרת מבנה ערוצים היררכי, אולי תרצו לתת לכולם גישת מעבר בשרת, אך להגביל את כניסתם לערוץ השורש. This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. מייצג את ההרשאה לדבר בערוץ. משתמשים שאין להם את ההרשאה הזו יושתקו על ידי השרת (סימן השתק עם איקס ירוק), ולא יוכלו לדבר אלא אם משתמש בעל הרשאה מתאימה יבטל את השתקתם. This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. מייצג את ההרשאה ללחוש לערוץ הזה מערוץ אחר. הרשאה זו עובדת בדיוק כמו הרשאת ה<i>הדיבור</i>, אך מיושמת לקול שמועבר בעזרת מקש הלחישה. ניתן להשתמש בהרשאה זו כדי לשדר לקבוצה שלמה של ערוצים ללא צורך בקישור. This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. מייצג את ההרשאה להשתיק או להחריש משתמשים אחרים. כשמשתמש מושתק, הוא ישאר כך עד שתוסר ההשתקה על ידי משתמש בעל גישות או עד שיתחבר מחדש לשרת. This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. מייצג את הרשאת ההזזה, שמאפשרת להזיז משתמשים אחרים או להעיף אותם מהשרת. כדי להזיז את המשתמש בפועל, יש צורך שלמשתמש המזיז יהיו גישות הזזה גם בערוץ המטרה, או שלמשתמש שהוא מזיז תהיה הרשאה להכנס לערוץ המטרה. משתמש עם הרשאה. משתמש עם ההרשאה הזו יכול להזיז משתמשים לערוצים שהם לא יכולים להכנס אליהם בדרך כלל. This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. מייצג את ההרשאה ליצור תת-ערוצים. המשתמש שיצר את תת-הערוץ יתווסף לקבוצת המנהלים של תת הערוץ. This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. מייצג את ההרשאה ליצור תת-ערוץ זמני. המשתמש שיצר את תת-הערוץ יתווסף לקבוצת המנהלים שלו. ערוצים זמניים לא נשמרים, והם יימחקו ברגע שהמשתמש האחרון עזב אותם. This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. מייצג את ההרשאה לקשר ערוצים. משתמשים בערוצים מקושרים שומעים זה את זה, כל עוד למשתמש יש הרשאות דיבור בערוץ המקבל. משתמש צריך הרשאת קישור בשני הערוצים שברצונו לקשר כדי לקשר בינהם, אך רק באחד מהם כדי לבטל קישור. This represents the permission to write text messages to other users in this channel. מייצג את ההרשאה לשלוח הודעות טקסט למשתמשים בערוץ. This represents the permission to forcibly remove users from the server. מייצג את ההרשאה להוצאה בכוח (העפה) של משתמש מהשרת. This represents the permission to permanently remove users from the server. מייצג את ההרשאה לנדות (להשעות) משתמשים מהשרת. This represents the permission to register and unregister users on the server. מייצג את ההרשאה לרשום משתמשים ולבטל הרשמה של משתמשים לשרת. This represents the permission to register oneself on the server. מייצג את ההרשאה של משתמש לרשום את עצמו לשרת. Whisper לחש Move הזז Text message הודעת תמליל Kick העפה Ban נידוי Register User רישום Register Self רישום עצמי Write ACL עריכת הרשאות ChatbarTextEdit Paste and &Send Paste and send הדבק ו&שלח <center>Type chat message here</center> <center>הקלד הודעת שיחה כאן</center> ClientUser Friend חבר Authenticated מאומת Priority speaker מועדף דיבור Recording מקליט Muted (server) מושתק (שרת) Deafened (server) מוחרש (שרת) Local Ignore (Text messages) התעלמות מקומית (טקסט) Local Mute השתקה מקומית Muted (self) מושתק (עצמית) Deafened (self) מוחרש (עצמית) ConfigDialog Accept changes קבל לשינויים This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. <p dir="RTL">הכפתור הזה יאשר את ההגדרות הנוכחיות ויחזור אל Mumble.<br />ההגדרות ישמרו לדיסק כשתצא מתוך Mumble.</p> Reject changes דחה שינויים This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. <p dir="RTL">הכפתור הזה יבטל את כל השינויים ויחזור אל Mumble.<br />ההגדרות יאופסו למצבם הקודם.</p> Apply changes החל שינויים This button will immediately apply all changes. כפתור זה יישם את כל השינויים לאלתר. Undo changes for current page בטל שינויים עבור עמוד נוכחי This button will revert any changes done on the current page to the most recent applied settings. <p dir="RTL">כפתור זה יחזיר את כל השינויים שנעשו בדף הנוכחי אל ההגדרות האחרונות שהוחלו.</p> Restore defaults for current page שחזר הגדרות ברירת מחדל עבור עמוד נוכחי This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. <p dir="RTL">הכפתור הזה ישחזר את הגדרותברירת המחדל בדף הנוכחי שאר הדפים לא ישתנו.<br />כדי להחזיר את כל ההגדרות בכל הדפים לברירת המחדל, עליך להשתמש בכפתור זה בכל הדפים.</p> Mumble Configuration הגדרות ‫Mumble ConnectDialog Connecting to %1 מתחבר כעת אל %1 Enter username הכנס שם משתמש Adding host %1 הוספת מארח %1 Servername שם שרת Hostname שם מארח Bonjour name מזהה Bonjour Port פורט Addresses כתובות Website אתר רשת Packet loss אובדן חבילה Ping (80%) פינג (80%) %1 ms %1 מ"ש Ping (95%) פינג (95%) Bandwidth רוחב פס %1 kbit/s %1 קב"ש &Connect הת&חבר &Filters מ&סננים Unknown Users משתמשים Version גירסא Failed to fetch server list נכשל לתפוס רשימת שרתים Mumble Server Connect התחברות לשרת Mumble Ping פינג Remove from Favorites הסר מהמועדפים Add custom server הוסף שרת ידנית Show all servers that respond to ping <p dir="RTL">הצג את כל השרתים שמגיבים לבקשות Ping</p> Show all servers with users <p dir="RTL">הצג את כל השרתים עם משתמשים מחוברים.</p> Show all servers הצג את כל השרתים &Copy ה&עתק Copy favorite link to clipboard העתק את קישור המועדפים ללוח העריכה &Paste ה&דבק Paste favorite from clipboard הדבק מועדפים מלוח העריכה &Edit... &עריכה... &Add New... &הוספת חדש... Add to &Favorites הוסף ל &מועדפים Open &Webpage פתח &עמוד רשת Show &Reachable <p dir="RTL">הצג &ברי-השגה</p> Show &Populated <p dir="RTL">הצג &מאוכלסים</p> Show &All הצג ה&כל ConnectDialogEdit Edit Server ערוך שרת Name of the server שם השרת A&ddress כ&תובת Internet address of the server. Internet address of the server. כתובת אינטרנט של השרת. <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>כתובת</b><br/> כתובת אינטרנט של השרת. זו יכולה להיות שם מארח רגיל, כתובות IPv4/IPv6 או מזהה של שירות Bonjour. מזהה של שירות Bonjour חייב להתחיל בתו @ בכדי שזה יוכל להיות בר הזדהות על ידי Mumble. &Port &פורט Port on which the server is listening פורט לו מאזין השרת <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. <b>פורט</b><br/> פורט לו מאזין השרת. אם השרת מזוהה על ידי מזהה של שירות Bonjour אזי Mumble יתעלם משדה זה. &Username &שם משתמש Username to send to the server שם משתמש לשליחה אל השרת <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. <b>שם משתמש</b><br/> שם משתמש לשליחה אל השרת. שים לב שהשרת יכול לאכוף מגבלות על איך שם השתמש יכול להיראות. כמו כן שם המשתמש שלך עלול להיות בשימוש על ידי משתמש אחר. Label כותרת Add Server הוסף שרת You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 Password סיסמא Password to send to the server סיסמא לשליחה אל השרת <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. <b>סיסמא</b><br/> סיסמא לשליחה אל השרת בעת התחברות. סיסמא זו הינה נצרכת בעת התחברות <i>כמשתמש על</i> או אל שרת באמצעות אימות סיסמא. היה וזו לא תוזן כאן הסיסמא תישאל בעת התחברות. Show password הצג סיסמא <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. <b>כותרת</b><br/> כותרת של השרת. כך השרת יכונה ברשימת שרת וניתן לברורו באופן חופשי. Local server label כינוי שרת מקומי 127.0.0.1 127.0.0.1 64738 64738 Your username שם משתמש Your password סיסמה &Fill CoreAudioSystem Default Device התקן משתמט CrashReporter Mumble Crash Report דיווח קריסה של Mumble <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> <p dir="RTL"><b>אנו מאוד מצטערים, אך נראה כי Mumble קרס. האם יש ברצונך לשלוח דיווח קריסה למפתחי Mumble?</b></p><p dir="RTL">דיווח הקריסה מכיל עותק חלקי של מצב התוכנה ברגע הקריסה, ויעזור מאוד למפתחים לתקן את הבעיה.</p> Email address (optional) כתובת דוא"ל (רשות) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash אנא הסבר בקצרה, באנגלית בלבד, מה עשית בזמן הקריסה Send Report שלח דיווח Don't send report אל תשלח דיווח Crash upload successful הדיווח הועלה בהצלחה Thank you for helping make Mumble better! תודה רבה על העזרה בשיפור Mumble! Crash upload failed העלאת דיווח קריסה נכשלה We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. אנו נורא מצטערים, אבל נראה ששליחת דיווח הקריסה נכשלה בעקבות השגיאה הבאה: %1 %2. אנא דווחו על כך למפתחים. This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 באמת שאין לנו מושג איך זה קרה (וזה לא נראה מאוד טוב!), אבל נראה שיש תקלה בקוד של מדווח הקריסות, ולא הצלחנו לשלוח את הדיווח. אנא דווח על כך בדחיפות Uploading crash report שלח דיווח קריסה Abort upload בטל שליחה DXAudioInput Default DirectSound Voice Input קלט קול DirectSound משתמש Opening chosen DirectSound Input device failed. No microphone capture will be done. פתיחת התקן הקלט הנבחר נכשלה. לכידת מיקרופון לא תבוצע. Opening chosen DirectSound Input failed. Default device will be used. פתיחת התקן הקלט הנבחר נכשלה. התקן ברירת המחדל יהיה בשימוש במקום. Lost DirectSound input device. התקן הקלט אבד. DXAudioOutput Default DirectSound Voice Output פלט קול DirectSound משתמש Opening chosen DirectSound Output failed. Default device will be used. פתיחת התקן הפלט הנבחר נכשלה. התקן ברירת המחדל יהיה בשימוש במקומו. Lost DirectSound output device. התקן הפלט אבד. Opening chosen DirectSound Output failed. No audio will be heard. פתיחת התקן הפלט הנבחר נכשלה. לא יישמע קול. Database Mumble failed to initialize a database in any of the possible locations. ‏Mumble נכשלה ליצור מסד נתונים בכל אחד מן המיקומים האפשריים. The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. בסיס הנתונים '%1' מוגדר לקריאה בלבד. Mumble לא יכול לשמור את הגדרות השרת (כמו תעודות SSL) עד שהבעיה תתוקן. DeveloperConsole Developer Console DockTitleBar Drag here גרור לכאן GlobalShortcut Shortcuts קיצורי דרך List of configured shortcuts רשימת הקיצורים המוגדרים Function פונקציה Data נתון Shortcut קיצור דרך Suppress שתק Add new shortcut הוסף קיצור דרך חדש This will add a new global shortcut זו תוסיף קיצור גלובלי חדש &Add הוס&ף Remove selected shortcut הסר קיצור נבחר This will permanently remove a selected shortcut. זו תסיר לצמיתות קיצור נבחר. &Remove הס&ר <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> <html><head/><body><p dir="RTL">Mumble תומך כעת רק בכפתורי עכבר ובכפתורי שליטה במקלדת (Alt, Ctrl, Shift וכו') עבור קיצורים גלובאליים.</p><p dir="RTL">אם תרצו להשתמש בעוד, תוכלו להפעיל את <span style=" font-style:italic;">גישה להתקני תמיכה</span> בהגדרות הנגישות של המערכת. למרות זאת, שימו לב שזה עלול לאפשר לתוכנות זדוניות לקרוא את הקשות המקלדת שלכם.</p></body></html> Open Accessibility Preferences פתח העדפות נגישות Skip דלג Enable Global Shortcuts הפעל קיצורים גלובאלים <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. Additional Shortcut Engines <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. Enable Windows hooks <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. Enable GKey <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. Enable XInput <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. Enable shortcuts in privileged applications GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> Shortcuts קיצורי דרך Shortcut button combination. צירוף מקשי קיצור. <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. <b>זהו צירוף מקשי הקיצור הגלובאלי.</b><br />לחץ על שדה זה ואז לחץ על המקש או הצירוף הרצויים כדי להגדירם מחדש. הקש פעמיים כדילמחוק. Suppress keys from other applications דכא מקשים מתוכניות אחרות <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. <b>אפשרות זו מסתירה את הלחיצות מתוכנות אחרות.</b><br />הפעלה של אפשרות זו תסתיר את הכפתורים או) את הכפתור האחרון של צירוף מקשים) מתוכניות אחרות. שימו לב שלא כל הכפתורים ניתנים להסתרה. GlobalShortcutTarget Whisper Target יעד הלחישה Whisper to list of Users לחש לרשימה של משתמשים Channel Target יעד ערוץ Restrict to Group הגבל לקבוצה If specified, only members of this group will receive the whisper. אם מצויין, רק חברים של קבוצה זו יקבלו את הלחישה. List of users רשימה של משתמשים Add הוספה Remove הסרה Modifiers משתנים Do not send positional audio information when using this whisper shortcut. אל תשלח מידע למיקום צלילים כאשר משתמשים בקיצור דרך לחישה זה. Ignore positional audio התעלם ממיקום צלילים Shout to Linked channels צעק אל ערוצים מקושרים Shout to subchannels צעק אל-ערוצי משנה Shout to Channel צעק אל ערוץ The whisper will also be transmitted to linked channels. הלחישה תשלח גם לערוצים המקושרים לערוץ המטרה. The whisper will also be sent to the subchannels of the channel target. הלחישה תשלח גם לתתי-הערוצים של ערוץ המטרה. GlobalShortcutX Mouse %1 עכבר %1 JackAudioSystem Hardware Ports Mono Stereo LCD Not connected לא מחובר LCDConfig Enable this device אפשר את מכשיר זה LCD LCD Devices מכשירים Name שם <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> <p dir="RTL">זוהי רשימת התקני ה-LCD במערכת שלכם. היא מסודרת בצורה אלפאבתית, אבל גם מכילה את גודל הצג. Mumble תומכת בפלט למספר התקני LCD בו זמנית.</p> <h3>גודל:</h3> <p dir="RTL"> שדה זה מתאר את גודלו של התקן ה-LCD. הגודל נתון בתור פיקסלים (התקנים גרפיים) או בתווים (התקנים תוויים).</p> <h3>פעיל:</h3> <p dir="RTL">קובע האם Mumble ישתמש בהתקן זה.</p> Size גודל Enabled מאופשר Views תצוגות Minimum Column Width רוחב טור מינימלי <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> <p dir="RTL">אפשרות זו קובעת את הגודל המינימלי של טור בתצוגת המשתמשים.</p> <p dir="RTL">אם יותר מדי אנשים מדברים בו זמנית, תצוגת המשתמשים תחלק את עצמה לטורים. אתם יכולים להשתמש באפשרות זו כדי לבחור איזון בין מספר המשתמשים שנראים בהתקן ה-LCD, וברוחב השם שלהם.</p> This setting decides the width of column splitter. אפשרות זו מגדירה את רוחב חוצץ הטורים. Splitter Width חוצץ טורים Log Debug דיבאג Critical קריטי Warning אזהרה Information מידע Server Connected שרת התחבר Server Disconnected שרת התנתק Other self-muted/deafened משתמש אחר השתיק/החריש את עצמו Permission Denied הרשאה נדחתה Text Message הודעת תמליל User Joined Server משתמש הצטרף לשרת User Left Server משתמש עזב את השרת User recording state changed משתמש שינה את מצב ההקלטה User kicked (you or by you) משתמש הועף (אתה או מישהו על ידיך) User kicked משתמש הועף You self-muted השתקת את עצמך User muted (you) משתמש הושתק (אותך) User muted (by you) משתמש הושתק (על ידך) User muted (other) משתמש הושתק (אחר) User Joined Channel משתמש הצטרף לערוץ User Left Channel משתמש עזב את הערוץ You self-unmuted ביטלת את השתקתך You self-deafened החרשת את עצמך You self-undeafened ביטלת את ההחרשתך User renamed משתמש שינה שם You Joined Channel You Joined Channel (moved) User connected and entered channel User left channel and disconnected Private text message the server השרת [[ Invalid size ]] [[ Text object too large to display ]] [[ התוכן גדול מדי מכדי להציגו ]] [Date changed to %1] [תאריך השתנה אל %1] link to %1 קישור אל %1 FTP link to %1 player link קישור שחקן channel link קישור ערוץ %1 link קישור %1 LogConfig Toggle console for %1 events הפעל/בטל פלט טקסט עבור אירועי %1 Toggle pop-up notifications for %1 events הפעל/בטל התראות קופצות עבור אירועי %1 Toggle Text-To-Speech for %1 events הפעל/בטל טקסט-לדיבור עבור אירועי %1 Click here to toggle sound notification for %1 events לחץ כאן כדי להפעיל/לבטל התראות קוליות עבור אירועי %1 Toggle window highlight (if not active) for %1 events Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change נתיב אל קובץ הקול שיהיה בשימוש להתראות קוליות עבור אירועי %1<br />לחץ פעם אחת כדי להשמיע<br />לחץ פעמיים כדי לשנות Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. לחצו כאן כדי להפעיל/לכבות פלט טקסט עבור אירועי %1.<br /> אם מסומן, אפשרות זו גורמת ל-Mumble להדפיס את כל אירועי %1 לחלון היומן. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. לחצו כאן כדי להפעיל/לכבות התראות קופצות עבור אירועי %1.<br />אם מסומן, התראות קופצות יווצרו על ידי Mumble לכל אירוע %1. Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. הנתיב אל קובץ הקול שיהיה בשימוש להתראות קוליות עבור אירועי %1.<br />לחיצה אחת כדי לנגן.<br />לחיצה כפולה כדי לשנות.<br />אנא וודאו שאפשרתם שימוש בהתראות קוליות לאירועים הללו או שלהגדרה הזו לא תהיה כל השפעה. Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. לחצו כאן כדי להפעיל/לכבות את תכונת הטקסט-לדיבור עבור אירועי %1.<br />אם מסומן, Mumble ישתמש בטקסט-לדיבור כדי להקריא בקול אירועי %1. תכונת הטקסט-לדיבור יכולה גם להקריא את תוכן האירוע, מה שלא אפשרי עם קבצי קול. טקסט-לדיבור וקבצי קול לא יכולים להיות בשימוש בו זמנית. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. לחצו כאן כדי להפעיל/לכבות התראות קוליות עבור אירועי %1. <br />אם מסומן, Mumble ישתמש בקובץ קול מוגדר מראש על ידיכם כדי להודיע על אירועי %1. קבצי קול ותכונת הטקסט-לדיבור לא יכולים להיות פעילים בו זמנית. Messages הודעות Message הודעה Console מסוף Notification התראה Text-To-Speech טקסט-אל-דיבור Soundfile קובץ צליל Path נתיב Text To Speech טקסט אל דיבור Volume עוצמה Volume of Text-To-Speech Engine עוצמת הטקסט-לדיבור <b>This is the volume used for the speech synthesis.</b> <b>זוהי עוצמת הקול של הודעות הטקסט-לדיבור.</b> Length threshold סף אריכות Message length threshold for Text-To-Speech Engine אורך מירבי להודעות טקסט-לדיבור <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. <b>זהו האורך המירבי עבור הודעות טקסט-לדיבור.</b><br />הודעות שאורכן גדול מהערך הזה לא יושמעו בקול רם באורכם המירבי. Characters תווים Whisper לחש If checked you will only hear whispers from users you added to your friend list. אם מסומן, אתה תשמע לחישות רק ממשתמשים שהוספת לרשימת החברים שלך. Only accept whispers from friends קבל לחשים מידידים בלבד If enabled text messages you send will be read back to you with TTS אם מסומן, גם הודעות שתשלח בעצמך יקראו בקול רם על ידי טקסט-לדיבור Read back own messages קרא בקול גם את ההודעות שלי Chat Log יומן צ'אט Maximum chat length אורך שיחה מרבי Unlimited לא מוגבל Lines שורות Highlight LookConfig System default ברירת מחדל מערכת None ללא Only with users רק עם משתמשים All הכל Ask שאל Do Nothing אל תעשה דבר Move הזז <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory <a href="%1">עיין</a> User Interface ממשק משתמש This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. אפשרות זו מגדירה אילו מהערוצים ברשימה יש להרחיב אוטומטית. <i>אף אחד</i> ו<i>כולם</i> ירחיבו את כולם הערוצים או אף אחד מהם, בעוד ש-<i>רק עם משתמשים</i> ירחיבו ויכווצו ערוצים ברשימה כשמשתמשים נכנסים ויוצאים מהם. List users above subchannels (requires restart). רשום משתמשים מעל ערוצי-משנה (נדרשת הפעלה מחדש). <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. <b>אם אפשרות זו מוגדרת, משתמשים יופיעו מעל לערוצי המשנה ברשימת הערוצים.</b><br />יש להפעיל מחדש את Mumble כדי להחיל את השינויים. Users above Channels משתמשים מעל ערוצים <b>If set, will verify you want to quit if connected.</b> <b>אם מוגדר, תצטרכו לאשר שוב יציאה מהתוכנה.</b> Show number of users in each channel הצג את מספר משתמשים בכל ערוץ Show channel user count הצג מספר משתמשים בערוץ Language שפה Language to use (requires restart) באיזו שפה להשתמש (דורש הפעלה מחדש) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. <b>אפשרות זו מגדירה את השפה ש-Mumble ישתמש בה.</b><br />עליך להפעיל מחדש את Mumble כדי להשתמש בשפה החדשה. Look and Feel מראה ותחושה Layout פריסה Classic קלאסית Stacked מערום Hybrid מעורב Custom מותאמת This changes the behavior when moving channels. זו משנה את ההתנהגות כאשר מזיזים ערוצים. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. אפשרות זו מגדירה את התוצאה של גרירת ערוצים; ניתן להשתמש בה כדי למנוע גרירה לא מכוונת. <i>הזז</i> תזיז את הערוצים מבלי לשאול. <i>אל תעשה דבר</i> לא תזיז את הערוצים ותציג הודעה בחלון היומן. <i>שאל</i> תקפיץ תיבת דו-שיח שבה תשאל אם אתה בטוח כי ברצונך להזיז את הערוץ. Expand הרחב When to automatically expand channels מתי להרחיב ערוצים אוטומטית Channel Dragging גרירת ערוצים Ask whether to close or minimize when quitting Mumble. <p dir="RTL">שאל האם לסגור או למזער את Mumble ביציאה.</p> Ask on quit while connected <p dir="RTL">שאל האם לצאת כאשר מחובר לשרת.</p> Always On Top תמיד למעלה <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> <b>אם אפשרות זו מסומנת, מזעור החלון הראשי של Mumble יגרום לתוכנה להתחבא במגש המערכת ולהיות נגישה רק משם. אם לא, היא תמוזער בדיוק כמו שחלון רגיל ממועזר.</b> Hide in tray when minimized הסתר במגש בעת מזעור Hide the main Mumble window in the tray when it is minimized. הסתר את החלון הראשי בתוך מגש המערכת כאשר Mumble הינו ממוזער. This setting controls when the application will be always on top. <p dir="RTL">הגדרה זו קובעת מתי Mumble יוצג תמיד מעל לכל החלונות.</p> Never אף פעם Always תמיד In minimal view בתצוגה מינימלית In normal view בתצוגה רגילה Displays talking status in system tray מראה את מצב הדיבור בסמל התוכנה במגש המערכת Show talking status in tray icon <p dir="RTL">הראה את מצב הדיבור בסמל מגש המערכת</p> This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. הגדרה זו קובעת באיזה מצבים התוכנה תשאר תמיד מעל לשאר החלונות. אם תבחרו ב<i>אף פעם</i> התוכנה לא תשאר אף פעם מעל לשאר החלונות. <i>תמיד</i> תשאיר תמיד את חלון התוכנה עליון. <i>בתצוגה מינימלית</i> / <i>במצב רגיל</i> ישיארו את החלון הראשי עליון רק כאשר מצב תצוגה מינימלית מופעל/כבוי. Show context menu in menu bar הראה את תפריט ההקשר בפס התפריט Apply some high contrast optimizations for visually impaired users <p dir="RTL">הפעל מצב ניגודיות תצוגה גבוהה למשתמשים כבדי ראיייה</p> Optimize for high contrast מצב ניגודיות תצוגה גבוהה Application יישום Adds user and channel context menus into the menu bar מוסף את תפריטי ההקשר "משתמש" ו"ערוץ" לשורת התפריט Tray Icon סמל מגש Channel Tree עץ ערוץ Use selected item as the chat bar target ערוץ/משתמש מסומנים יהוו יעד לצ'אט Filter automatically hides empty channels <p dir="RTL">סנן ערוצים ריקים אוטומטית.</p> Show transmit mode dropdown in toolbar Theme ערכת נושא Theme to use to style the user interface ערכת נושא לשימוש כדי לסגנן את הממשק משתמש <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. User Dragging This changes the behavior when moving users. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. Enable Developer menu When in custom layout mode, checking this disables rearranging. Lock layout MainWindow Root שורש Push-to-Talk Global Shortcut לחץ-כדי-לדבר Push and hold this button to send voice. Global Shortcut לחץ ואחוז בכפתור זה כדי לשלוח צליל. This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut <p dir="RTL">אפשרות זו מגדירה את מקש "לחץ-כדי-לדבר". כל עוד תחזיקו את מקש זה לחוץ, קולכם ישודר.</p> Reset Audio Processor Global Shortcut אפס מעבד צלילים Unlink Plugin Global Shortcut איין קישור תוספת Push-to-Mute Global Shortcut לחץ-כדי-להשתיק Join Channel Global Shortcut הצטרף לערוץ Toggle Overlay Global Shortcut הצג/הסתר ממשק-משחק Toggle state of in-game overlay. Global Shortcut שנה את מצב התצוגה של ממשק המשחק. Toggle Minimal Global Shortcut הפעל/בטל מצב מינימלי Volume Up (+10%) Global Shortcut הגבר עוצמה (‪-10%‬) Volume Down (-10%) Global Shortcut הנמך עוצמה (‪-10%‬) Mumble Mumble Mumble -- %1 Mumble -- %1 &Window &חלון Minimize מזער Ctrl+M Ctrl+M Close סגור Mumble is currently connected to a server. Do you want to Close or Minimize it? <p dir="RTL">‫Mumble מחוברת כרגע לשרת, האם ברצונך לסגור או למזער אותה?</p> Mute Self Global Shortcut השתק את עצמך Set self-mute status. Global Shortcut הגדר מצב השתקה עצמית. This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut כפתור זה יפעיל או יבטל את מצב ההשתקה העצמית שלכם. אם תבטלו את ההשתקה, גם ההחרשה עצמית שלכם תבוטל (אם קיימת). Deafen Self Global Shortcut החרש את עצמך Set self-deafen status. Global Shortcut הגדר מצב החרשה עצמית. This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut כפתור זה יפעיל או יבטל את מצב ההחרשה העצמית. אם תפעילו זאת, אתם גם תושתקו עצמית באופן אוטומטי. Whisper/Shout Whisper לחש/צעק <center>Not connected</center> Not connected <center>לא מחובר</center> Clear טהר Opening URL %1 פתיחת URL %1 File does not exist קובץ לא קיים File is not a configuration file. קובץ אינו קובץ תצורה. Settings merged from file. הגדרות מוזגו מן קובץ. URL scheme is not 'mumble' <p dir="RTL">צורת הכתובת היא לא 'mumble'</p> This version of Mumble can't handle URLs for Mumble version %1.%2.%3 גירסא זו של Mumble לא יכולה לטפל בכתובות עבור Mumble גירסא %1.%2.%3 Connecting to %1 מתחבר כעת אל %1 Enter username הכנס שם משתמש Connecting to server %1. מתחבר כעת אל שרת %1. Reconnecting. מתחבר מחדש כעת. Transmit Mode set to Continuous <p>%1 (%2)<br />%3</p> <p dir="RTL">%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> <h2>ערוץ קול</h2><p>מוצפן עם 128 bit OCB-AES128<br />אחזור ממוצע של %1 מ"ש (סטייה של %4)</p> Register yourself as %1 רשום את עצמך בשם %1 <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <p dir="RTL">אתם עומדים לרשום את עצמכם לשרת. אין אפשרות לבטל פעולה זו, ואין אפשרות לשנות את שם המשתמש מרגע שנרשמתם. אתם תמיד תוצגו תחת השם '%1' בשרת הזה, גם אם תשנו אותו בעת ההתחברות. </p><p dir="RTL">האם אתם בטוחים שברצונכם להרשם?</p> <h2>Version</h2><p>Protocol %1</p> <h2>גרסא</h2><p>פרוטוקול %1</p> <p>No build information or OS version available</p> <p>אין מידע בניה או גרסת מערכת הפעלה זמין</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) The connection is secured by the cipher suite that OpenSSL identifies as %1 <p>The connection provides perfect forward secrecy</p> <p>The connection does not provide perfect forward secrecy</p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> Voice channel is sent over control channel Register user %1 רשום משתמש %1 <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> <p>אתם עומדים לרשום את %1 בשרת. לא ניתן לבטל את הפעולה הזו, שם המשתמש לא ניתן לשינוי מרגע ההרשמה, ובתור משתמש רשום, ל-%1 תהיה גישה לשרת גם אם תשנו את הסיסמא.</p><p>מנקודה זו ואילך, %1 יזוהה בעזרת תעודת האבטחה שבו הוא משתמש כעת.</p><p>האם אתה בטוח כי ברצונך לרשום את %1?</p> Kicking user %1 מעיף משתמש %1 Banning user %1 אוסר משתמש %1 View comment on user %1 צפה בהערה על משתמש %1 Message to channel %1 הודעה לערוץ %1 Connected. מחובר. <li>Expected certificate digest (SHA-1): %1</li> Server presented a certificate which failed verification. שרת הציג תעודה אשר אימותה נכשל <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> SSL Version mismatch גירסאת SSL לא תואמת Server connection failed. <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>רשום הודעה לערוץ %1 כאן</center> <center>Type message to user '%1' here</center> Type message to user '%1' here <center>רשום הודעה למשתמש %1 כאן</center> Choose image file בחר קובץ תמונה Failed to load image נכשל לטעון תמונה Could not open file for reading. לא היה ניתן לפתוח קובץ לקריאה. Image format not recognized. פורמט תמונה לא מזוהה. &User &משתמש &Channel &ערוץ Use in conjunction with Whisper to. Global Shortcut <p dir="RTL">השתמש ביחד עם אפשרות הלחישה.</p> This will switch the states of the in-game overlay. Global Shortcut משנה את המצב של ממשק-המשחק. Link Channel Global Shortcut קשר ערוץ Cycle Transmit Mode Global Shortcut <p dir="RTL">החלף מצב שידור</p> Set Transmit Mode to Push-To-Talk Global Shortcut Set Transmit Mode to Continuous Global Shortcut Set Transmit Mode to VAD Global Shortcut Send Text Message Global Shortcut שלח הודעת טקסט Send Clipboard Text Message Global Shortcut This will send your Clipboard content to the channel you are currently in. Global Shortcut Continuous מתמשך Voice Activity פעילות קול Push-to-Talk לחץ-כדי-לדבר Mumble - Minimal View -- %1 Cancel ביטול Save Image As... Save Image File Could not save image: %1 Change your comment שנה את הודעתך האישית Transmit Mode set to Voice Activity מצב שידור הוחלף למצב פעילות קול Transmit Mode set to Push-to-Talk מצב שידור הוחלף למצב לחץ-כדי-לדבר <p>Connected users: %1/%2</p> UDP Statistics סטטיסטיקות UDP To Server אל שרת From Server מן שרת Good טוב Late אוחר Lost אבד Resync סינכרון מחדש <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> <h2>רוחב הפס של תעבורת קול</h2><p>מקסימלי: %1 קב"ש<br />נוכחי: %2 קב"ש<br />קידוד: %3</p> Mumble Server Information מידע שרת ‫Mumble &View Certificate ה&צג תעודת אבטחה Enter reason הכנס סיבה Sending message to %1 שליחת הודעה אל %1 To %1: %2 לכבוד %1: %2 Message to %1 הודעה לכבוד %1 Are you sure you want to reset the comment of user %1? האם אתה בטוח כי ברצונך לאפס את ההודעה האישית של משתמש %1? Are you sure you want to reset the avatar of user %1? האם אתה בטוח כי ברצונך לאפס את התמונה האישית של המשתמש %1? Are you sure you want to delete %1 and all its sub-channels? האם אתה בטוח כי ברצונך למחוק את %1 ואת כל ערוצי המשנה שלו? Sending message to channel %1 שליחת הודעה לערוץ %1 Message to tree %1 הודעה לעץ-ערוצים %1 To %1 (Tree): %2 (Tree) %1: %2 אל %1 (עץ): %2 Unmuted and undeafened. השתקה והחרשה בוטלו. Unmuted. השתקה בוטלה. Muted. מושתק. Muted and deafened. מושתק ומוחרש. Deafened. מוחרש. Undeafened. החרשה בוטלה. Restart Mumble? להתחיל מחדש את Mumble? Some settings will only apply after a restart of Mumble. Restart Mumble now? About Qt אודות Qt SSL Verification failed: %1 אימות SSL נכשל: %1 <li>Server certificate digest (SHA-1): %1</li> <b>WARNING:</b> The server presented a certificate that was different from the stored one. <b>אזהרה!</b> השרת הציג תעודת אבטחה שונה מזו האחרונה אשר שמורה באופן מקומי. This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. שרת זה משתמש בתקן הצפנה ישן, ולא נתמך יותר על ידי גרסאות מודרניות של Mumble. Server connection failed: %1. התחברות שרת נכשלה: %1. Disconnected from server. נותק מן שרת. Invalid username שם משתמש לא תקין You connected with an invalid username, please try another one. <p dir="RTL">התחברתם עם שם משתמש לא תקין, נסו אחד אחר.</p> Username in use שם משתמש מצוי בשימוש That username is already in use, please try another username. <p dir="RTL">שם המשתמש שלכם כבר בשימוש, נסו אחד אחר.</p> Wrong certificate or password תעודת אבטחה או סיסמא שגויות Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. תעודת אבטחה או סיסמא שגויות. אם אתה בטוח כי משתמש זה מוגן על ידי סיסמא נסה שוב.אחרת בטל ובדוק את תעודת האבטחה שלך ושם המשתמש. Wrong password סיסמא שגויה Wrong server password for unregistered user account, please try again. <p dir="RTL">הסיסמה שהזנתם אינה נכונה, אנא נסו שנית.</p> Images (*.png *.jpg *.jpeg) תמונות (‎*.png *.jpg *.jpeg) C&onfigure &תצורה &Help &עזרה Log יומן This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. היומן מראה את כל הפעילות האחרונה. התחברות לשרתים, שגיאות והודעות מידע יופיעו כאן.<br />כדי להגדיר בדיוק אילו הודעות יופיעו כאן, השתמש בחלון ה<b>הגדרות</b>. &Quit Mumble י&ציאה מן Mumble Closes the program סוגר את התוכנה Exits the application. <p dir="RTL">יוצא מתוך היישום.</p> Ctrl+Q Ctrl+Q Open the server connection dialog פתח את תיבת ההתחברות לשרת &Disconnect הת&נתק Disconnect from server התנתק מהשרת Disconnects you from the server. מנתק אותך מהשרת. Show information about the server connection הצגת מידע אודות החיבור של הרשת This will show extended information about the connection to the server. אפשרות זו מראה מידע מורחב על החיבור לשרת. &Mute &השתק &Deafen &החרש &Local Mute &השתק מקומית Send a Text Message שלח הודעת טקסט Sends a text message to another user. שולחת הודעת טקסט אל משתמש אחר. Add new channel הוסף ערוץ חדש This adds a new sub-channel to the currently selected channel. זו מוסיפה ערוץ משנה חדש לחדר שמסומן ברגע נתון. Remove channel הסר ערוץ This removes a channel and all sub-channels. זו מסירה ערוץ וכל ערוץ משנה. Edit Groups and ACL for channel ערוך קבוצות ו-ACL עבור הערוץ This opens the Group and ACL dialog for the channel, to control permissions. פותח את חלון הקבוצות וה-ACL עבור הערוץ, לשליטה בהרשאות. &Link &קישור Link your channel to another channel מקשר את הערוץ לערוץ אחר This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. זהו חלון הצ'אט.<br />אם תכניסו כאן טקסט ותקישו אנטר, הטקסט ישלח למשתמש או לערוץ שהיו מסומנים. אם לא מסומן אף משתמש או ערוץ, ההודעה תשלח לערוץ הנוכחי שלכם. Chatbar סרגל שיחה Shows a dialog of registered servers, and also allows quick-connect. מראה את רשימת השרתים ומאפשר חיבור מהיר. Kick user (with reason) העף משתמש (עם סיבה) Kick selected user off server. You'll be asked to specify a reason. מעיף את המשתמש מהשרת. תתבקש להכניס סיבה. Mute user השתק משתמש Mute or unmute user on server. Unmuting a deafened user will also undeafen them. משתיק או מבטח השתקה של משתמש בשרת. ביטול השתקה של משתמש מוחרש תבטל גם את החרשתו. Kick and ban user (with reason) העף ונדה משתמש (עם סיבה) Kick and ban selected user from server. You'll be asked to specify a reason. מעיף ומנדה את המשתמש הנבחר מהשרת. תתבקש להכניס סיבה. Deafen user החרש משתמש Deafen or undeafen user on server. Deafening a user will also mute them. מחריש את מבטל החרשה של משתמש בשרת. החרשה של משתמש גם תשתיק אותו. Mute user locally השתק משתמש מקומית Mute or unmute user locally. Use this on other users in the same room. משתיק או מבטל השתקה מקומית של משתמש. השתמש באפשרות זו על משתמשים אחרים בערוץ זה. This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. אפשרות זו מקשרת את הערוץ הנוכחי שלכם לערוץ הנבחר. אם למשתמשים באחד הערוצים יש הרשאת דיבור בערוץ האחר, המשתמשים יוכלו לשמוע אחד את השני. זהו קישור קבוע, ויישאר עד שתנתק אותו ידנית או עד שהשרת יופעל מחדש. ראו גם את מקש הקיצור "לחץ כדי לקשר". &Unlink Channel &איין קישור Unlink your channel from another channel מבטל את הקישור של הערוץ הנוכחי לערוץ אחר This unlinks your current channel from the selected channel. מבטל את הקישור של הערוץ הנוכחי לערוץ הנבחר. Unlinks your channel from all linked channels. מבטל את כל הקישורים של הערוץ לערוצים אחרים. This unlinks your current channel (not the selected one) from all linked channels. אפשרות זו מבטלת את כל הקישורים של הערוץ הנוכחי (לא הערוץ הנבחר) מכל הערוצים האחרים שהוא מקושר אליהם. &Reset &אפס Reset audio preprocessor מאפס את מעבד הצלילים This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. אפשרות זו תאפס את מעבד הצלילים המקדים, כולל את ביטול הרעשים ואת ההפעלה מבוססת הדיבור. אם הסביבה הקולית שלכם הורעה לפתע (למשל נפילה של המיקרופון או רעש פתאומי) ומדובר בשינוי זמני, השתמשו באפשרות זו כדי להמנע מהצורך לחכות למעבד לכוון את עצמו מחדש. &Mute Self &השתקה עצמית Mute yourself השתק את עצמך Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. משתיק או מבטל השתקה עצמית. כאשר אתם מושתקים, שום מידע קולי לא ישלח לשרת. ביטול השתקה בעודכם מוחרשים יבטל גם את ההחרשה. &Deafen Self &החרשה עצמית Deafen yourself החרש את עצמך Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. מחריש או מבטל החרשה עצמית. כשאתם מוחרשים, אתם לא תשמעו שום דבר. החרשה עצמית גם משתיקה אתכם. &Text-To-Speech &טקסט-אל דיבור Toggle Text-To-Speech הפעל/כבה טקסט-לדיבור Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. הפעל או כבה את תכונת הטקסט-לדיבור. רק הודעות שעבורן איפשרתם טקסט-לדיבור בהגדרות התוכנה יוקראו בקול. Display audio statistics הראה סטטיסטיקות קול Pops up a small dialog with information about your current audio input. מראה חלון קטן עם מידע על קלט הקול הנוכחי שלכם. Forcibly unlink plugin נתק תוסף בכוח This forces the current plugin to unlink, which is handy if it is reading completely wrong data. מכריח את התוסף הנבחר להתנתק, מה שכול לעזור אם הוא מקבל מידע שגוי לחלוטין. Configure Mumble תצורת Mumble Allows you to change most settings for Mumble. מאפשר לכם לשנות את רוב האפשרויות עבור Mumble. Start the audio configuration wizard מפעיל את אשף כיוון הצלילים This will guide you through the process of configuring your audio hardware. אשף זה ידריך אותך בהתליך הגדרת חומרת הקול שלך. &What's This? &מה זה? Enter What's This? mode נכנס למצב "מה-זה?" Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. לחצו כאן כדי להכנס למצב "מה זה?". הסמן שלכם יהפוך לסימן שאלה. לחצו על כל כפתור, תפריט או אזור כדי להציג תיאור אודותיו. Information about Mumble מידע אודות Mumble Shows a small dialog with information and license for Mumble. הצגת תיבת דו שיח קטנה עם מידע ורשיון עבור Mumble. Information about Speex מידע אודות Speex Shows a small dialog with information about Speex. הצגת תיבת דו שיח קטנה עם מידע אודות Speex. Information about Qt מידע אודות Qt Shows a small dialog with information about Qt. הצגת תיבת דו שיח קטנה עם מידע אודות Qt. Check for &Updates בדוק עבור &עדכונים Check for new version of Mumble בדוק עבור גירסא חדשה של Mumble Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. מתחבר לשרת המרכזי של Mumble כדי לבדוק אם קיימת גרסא חדשה, ומודיע לכם על קישור ההורדה אם אכן יש עדכון. Sends a text message to all users in a channel. שולח הודעת טקסט לכל המשתמשים בערוץ מסוים. Configure certificates for strong authentication הגדרת תעודות אבטחה לשם אימות חזק This starts the wizard for creating, importing and exporting certificates for authentication against servers. מפעיל את אשף תעודות האבטחה, שמאפשר יצירה, ייבוא וייצוא של תעודת אבטחה להזדהות מול שרתים. Register user on server רשום את המשתמש בשרת This will permanently register the user on the server. אפשרות זו תרשום את המשתמש באופן קבוע בשרת. Add &Friend הוסף &חבר Adds a user as your friend. מוסיף משתמש כחבר. This will add the user as a friend, so you can recognize him on this and other servers. מוסיף את המשתמש כחבר, כך שתוכלו לזהות אותו בשרת הזה ובשרתים אחרים. &Remove Friend הס&ר חבר Removes a user from your friends. הסר משתמש מרשימת החברים. This will remove a user from your friends list. אפשרות זו תסיר משתמש מרשימת החברים שלכם. &Update Friend &עדכן חבר Update name of your friend. מעדכן את זהותו של החבר. Your friend uses a different name than what is in your database. This will update the name. <p dir="RTL">חברכם משתמש בשם אחר מזה שנשמר אצלכם. אפשרות זו תעדכן את השם.</p> Edit registered users list ערוך את רשימת המשתמשים הרשומים This opens the editor for registered users, which allow you to change their name or unregister them. אפשרות זו פותחת את העורך של רשימת המשתמשים הרשומים, שמאפשר לשנות את שמם או לבטל את הרשמתם. Add or remove text-based access tokens הוסף או הסר סיסמאות מבוססות טקסט (מפתחות גישה) &Minimal View &תצוגה מינימלית Toggle minimal window modes משנה את מצב התצוגה המינימלית This will toggle minimal mode, where the log window and menu is hidden. אפשרות זו מפעילה או מכבה את התצוגה המינימלית, שבה התפריט וחלונות הצ'אט והיומן מוסתרים. You muted and deafened %1. השתקת והחרשת את %1. You unmuted and undeafened %1. ביטלת את ההשתקה וההחרשה של %1. You undeafened %1. ביטלת את ההחרשה של %1. You suppressed %1. שיתקת את %1. %1 muted and deafened by %2. %1 הושתק והוחרש על ידי %2. %1 unmuted and undeafened by %2. %2 ביטל את השתקתו והחרשתו של %1. %1 undeafened by %2. %2 ביטל את החרשתו של %1. %1 suppressed by %2. %1 שותק על ידי %2. %1 moved to %2. <p dir="RTL">%1 הועבר ל %2.</p> %1 moved to %2 by %3. <p dir="RTL">%1 הועבר ל %2 על ידי %3.</p> %1 moved in from %2 by %3. <p dir="RTL">%1 הועבר לחדר זה מ %2 על ידי %3.</p> %1 is now muted and deafened. %1 מושתק ומוחרש כעת. Your account information can not be verified currently. Please try again later <p dir="RTL">אנו לא יכולים לאמת את חשבונך. נסה שנית מאוחר יותר</p> Welcome message: %1 הודעת פתיחה: %1 Mumble: %1 ‫Mumble: ‫%1 You were denied %1 privileges in %2. אין לך הרשאת %1 ב-%2. %3 was denied %1 privileges in %2. ל-%3 אין הרשאת %1 ב-%2. Denied: Cannot modify SuperUser. נדחה: לא ניתן לשנות SuperUser. Denied: Invalid channel name. נדחה: שם ערוץ לא חוקי. Denied: Text message too long. נדחה: הודעת תמליל ארוכה מדי. Denied: Operation not permitted in temporary channel. נדחה: פעולה לא מורשית בתוך ערוץ זמני. You need a certificate to perform this operation. אתם זקוקים לתעודת אבטחה כדי לבצע את פעולה זו. %1 does not have a certificate. ל-%1 אין תעודת אבטחה. Invalid username: %1. שם משתמש לא חוקי: %1. Invalid username. שם משתמש לא .חוקי. Channel is full. ערוץ מלא. Channel nesting limit reached. מגבלת קינון ערוץ מוצתה. Channel count limit reached. Need to delete channels before creating new ones. Permission denied. הרשאה נדחתה. %1 connected and entered channel. %1 connected. %1 התחבר. %1 is now muted. %1 הושתק. %1 is now unmuted. %1 לא מושתק יותר. Recording started ההקלטה התחילה Recording stopped ההקלטה הסתיימה %1 started recording. %1 התחיל להקליט. %1 stopped recording. %1 הפסיק להקליט. You revoked your priority speaker status. ביטלת את עדיפות הדיבור שלך You assumed priority speaker status. קיבלת את עדיפות הדיבור %1 revoked your priority speaker status. %1 ביטל לך את עדיפות הדיבור %1 gave you priority speaker status. %1 העניק לך את עדיפות הדיבור You revoked priority speaker status for %1. ביטלת את עדיפות הדיבור של %1 You gave priority speaker status to %1. הענקת את עדיפות הדיבור ל %1 %1 revoked own priority speaker status. %1 ביטל לעצמו את עדיפות הדיבור %1 assumed priority speaker status. %1 קיבל את עדיפות הדיבור %1 revoked priority speaker status for %2. %1 ביטל את עדיפות הדיבור של %2 %1 gave priority speaker status to %2. %1 העביר את עדיפות הדיבור ל %2 You were unmuted and undeafened by %1. %1 ביטל את ההשתקה וההחרשה שלך. You were muted by %1. הושתקת על ידי %1. You were undeafened by %1. %1 ביטל את החרשתך. You were suppressed. You were suppressed by %1. שותקת על ידי השרת. You were unsuppressed. <p dir="RTL">שיתוקך בוטל.</p> You were unsuppressed by %1. %1 ביטל את שיתוקך. You joined %1. You moved %1 to %2. העברת את %1 ל %2 %1 is recording %1 מקליט %1 renamed to %2 by %3. %1 disconnected. %1 התנתק. Server message from שרת (Tree) (עץ) (Channel) (ערוץ) (Private) %2%1: %3 %2%1: %3 Failed to load Opus, it will not be available for audio encoding/decoding. The server requests minimum client version %1 השרת הנוכחי דורש גרסאת לקוח מינימאלית %1 The server requests positional audio be enabled. שרת זה דורש שצליל מבוסס מיקום יהיה מופעל. The server requests positional audio be disabled. שרת זה דורש שצליל מבוסס מיקום יהיה מבוטל. The server requests Push-to-Talk be enabled. שרת זה דורש שימוש בתכונת לחץ-כדי-לדבר. The server requests Push-to-Talk be disabled. שרת זה אוסר על שימוש בתכונת לחץ-כדי-לדבר. You were unmuted by %1. השתקתך בוטלה על ידי %1. You muted %1. השתקת את %1. You unsuppressed %1. ביטלת את שיתוקו של %1. You unmuted %1. ביטלת את השתקתו של %1. %1 muted by %2. %1 הושתק על די %2. %1 unsuppressed by %2. %2 ביטל את שיתוקו של %1. %1 unmuted by %2. %2 ביטל את השתקתו של %1. Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. לא ניתן למצוא קידודי CELT תואמים עבור משתמשים אחרים. ייתכן ולא תוכלו לדבר לכל המשתמשים. You were muted and deafened by %1. You were deafened by %1. הושתקת והוחרשת על ידי %1. You were kicked from the server by %1: %2. <p dir="RTL">הועפת מהשרת על ידי %1: %2.</p> %3 was kicked from the server by %1: %2. <p dir="RTL">%3 הועף מהשרת על ידי %1: %2.</p> You were kicked and banned from the server by %1: %2. <p dir="RTL">הועפת והושעת מהשרת על ידי %1: %2.</p> %3 was kicked and banned from the server by %1: %2. <p dir="RTL">%3 הועף והושעה מהשרת על ידי %1: %2.</p> You were moved to %1 by %2. <p dir="RTL">הועברת אל %1 על ידי %2.</p> %1 entered channel. <p dir="RTL">%1 נכנס לערוץ.</p> Server connection rejected: %1. התקשרות שרת נדחתה: %1. Denied: %1. נדחה: %1. %1 renamed to %2. %1 שינה שם אל %2. %1 left channel and disconnected. %1 עזב ערוץ והתנתק Message from %1 הודעה מן %1 You have User Dragging set to "Do Nothing" so the user wasn't moved. You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. הגדרתם את פעולת גרירת הערוצים ל"אל תעשה דבר", ולכן הערוץ לא הוזז. Unknown Channel Drag mode in UserModel::dropMimeData. אופס! מצב גרירת ערוץ לא יודע בפעולה UserModel::dropMimeData. Remote controlling Mumble: Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) -jn, --jackname Set custom Jack client name. --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status Invocation קריאה Error: No RPC command specified RPC RPC Welcome to Mumble. ברוך בואך אל Mumble. Skipping version check in debug mode. מדלג על בדיקת גרסא במצב דיבאג. Hide Frame הסתר מסגרת Toggle showing frame on minimal window הצג/הסתר מסגרת במצב תצוגה מינימלית This will toggle whether the minimal window should have a frame for moving and resizing. אפשרות זו תקבע האם לחלון הראשי תהיה מסגרת להזזה ושינוי גודל במצב תצוגה מינימלית. &Unlink All &איין קישור הכל Reset the comment of the selected user. אפס את ההודעה האישית של המשתמש הנבחר. &Join Channel &הצטרף לערוץ View comment in editor הראה את ההודעה האישית בעורך Query server for connection information for user מתשאל את השרת על מידע החיבור של המשתמש S&erver &שרת &Self ע&צמי &Unlink Plugins &איין קישור תוספת Register yourself on the server רושם אתכם בשרת Change your avatar image on this server שנה את האווטאר שלך בשרת זה &Remove Avatar הס&ר אווטאר Remove currently defined avatar image. הסר תמונת אווטאר מוגדרת נוכחית. Icon Toolbar סמל סרגל כלים Change your own comment שנו את ההודעה האישית שלכם Recording הקלטה Priority Speaker מועדף דיבור &Copy URL &העתק URL Copies a link to this channel to the clipboard. מעתיק את הקישור ללוח ההעתקה. Ignore Messages התעלם מהודעות Locally ignore user's text chat messages. התעלם מהודעותיו של המשתמש באופן מקומי. Silently drops all text messages from the user. מתעלם בחשאי מכל הודעות הטקסט של המשתמש. Edit ban list on server <p dir="RTL">ערוך את רשימת החסומים של השרת</p> This lets you edit the server-side IP ban list. <p dir="RTL">אפשרות זו מאפשרת לערוך את רשימת חסימות ה-IP של השרת.</p> &Filter on/off הדלק/כבה &מסננת Toggle the channel filter (Ctrl+F) <p dir="RTL">הפעל או בטל את מסנן הערוצים (Ctrl+F)</p> Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. <p dir="RTL">מאפשר או מבטל סינון של ערוצים. כברירת מחדל, כל הערוצים הריקים יסוננו. תוכלו להגדיר ערוצים נוספים לסינון דרך תפריט ההקשר של הערוץ.</p> Ctrl+F Ctrl+F &Hide Channel when Filtering <p dir="RTL">&סנן ערוץ</p> Reset the avatar of the selected user. איפוס התמונה האישית של המשתמש. Locally adjust the user's speech volume. Opens a dialog with a volume slider. Use this on other users in the same room. &Developer &Hide Mumble Hides the main Mumble window. Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. Show the Developer Console Shows the Mumble Developer Console, where Mumble's log output can be inspected. &Connect... &Ban list... &Information... &Kick... &Ban... Local Volume Adjustment... Send &Message... &Add... &Remove... &Edit... Audio S&tatistics... &Settings... &Audio Wizard... Developer &Console... &About... About &Speex... About &Qt... &Certificate Wizard... &Register... Registered &Users... Change &Avatar... &Access Tokens... Reset &Comment... Reset &Avatar... View Comment... &Change Comment... R&egister... Show Shows the main Mumble window. Manual Manual Mumble Positional Audio Position X Y Z m Heading Azimuth Elevation ° Meta data Context Identity Set State Linked Activated Unhinge NetworkConfig Network רשת עבודה Updates are mandatory when using snapshot releases. עדכונים הם חובה כאשר משתמשים בגרסאות בדיקה. Connection חיבור Use TCP compatibility mode Use TCP compatability mode הפעלת מצב תואם TCP <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). <b>הפעל מצב תאימות ל-TCP</b>.<br />אפשרות זו תגרום ל-Mumble להשתמש אך ורק בפרוטוקול TCP בזמן תקשורת עם השרת. הפעלה של אפשרות זו תעלה את השהיית הקול ותגרום למידע אבוד לקטוע את התקשורת, ולכן יש להשתמש בה רק במידה ואין באפשרותכם להשתמש במצב הרגיל (UDP עבור קול ו-TCP עבור שליטה). Reconnect when disconnected התחבר מחדש כאשר מנותק <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. <b>התחבר מחדש כאשר מנותק</b>.<br />אפשרות זו תגרום ל-Mumble לנסות ולהתחבר מחדש אחרי 10 שניות אם החיבור שלך לשרת נכשל. Reconnect automatically התחבר שוב אוטומטית Proxy ציר Type טיפוס Type of proxy to connect through טיפוס ציר להתחבר דרכו Direct connection חיבור ישיר HTTP(S) proxy ציר HTTP(S)‎ SOCKS5 proxy ציר SOCKS5 Hostname שם מארח Hostname of the proxy שם מארח של הציר Force TCP mode כפה מצב TCP Enable QoS to prioritize packets הפעלת QoS על מנת לתעדף חבילות מידע This will enable QoS, which will attempt to prioritize voice packets over other traffic. אפשרות זו תאפשר את תכונת QoS, שתנסה לתעדף את תעבורת הדיבור לעומת תעבורה אחרת. Use Quality of Service אפשר Quality of Service Don't send certificate to server and don't save passwords. (Not saved). אל תשלח תעודת אבטחה ואל תשמור סיסמאות (לא נשמר בעת יציאה). <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> <b>אפשרות זו תמנע שליחה של מידע זיהוי מן הלקוח.</b><p dir="RTL">הלקוח לא יזהה את עצמו בעזרת תעודת אבטחה, גם אם הוגדרה תעודה כזה, ולא ישמור סיסמאות עבור חיבורים. אפשרות זו היא בעיקר עבור ניפוי שגיאות ולא תשמר בעת יציאה מתוך Mumble.</p> Suppress certificate and password storage בטל אחסון תעודה וסיסמה <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>טיפוס ציר להתחבר דרכו.</b><br />זה מאפשר ל-Mumble להתחבר דרך ציר עבור כל החיבורים היוצאים. שים לב: תיעול ציר מחייב את Mumble להשתמש במצב תאימות ל-TCP, שגורם לכל נתוני הקול להשלח דרך ערוץ הבקרה. <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. <b>שם מארח של הציר/</b><br />שדה זה מגדיר את שם המארח של הציר דרכו ברצונך לתעל תעבורה. Port פורט Port number of the proxy מספר הפורט של הציר <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. <b>פורט של הציר</b><br />שדה זה מגדיר את הפורט שדרכו תתחברו אל שרת הציר. Username שם משתמש Username for proxy authentication שם משתמש עבור אימות ציר <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>שם משתמש לשם אימות ציר</b></br >אפשרות זו מגדירה את שם המשתמש שבו אתם משתמשים כדי להזדהות בפני שרת הציר. במידה ושרת הציר לא מצריך הזדהות, או שאתם רוצים להתחבר בצורה אנונימית, פשוט השאירו את השדה ריק. Password סיסמא Password for proxy authentication סיסמא לשם אימות ציר <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>סיסמא לשם אימות ציר</b></br >אפשרות זו מגדירה את הסיסמא שבה אתם משתמשים כדי להזדהות בפני שרת הציר. במידה ושרת הציר לא מצריך הזדהות, או שאתם רוצים להתחבר בצורה אנונימית, פשוט השאירו את השדה ריק. Mumble services שירותי Mumble Check for new releases of Mumble automatically. בדוק אם יש הוצאות חדשות של Mumble אוטומטית. This will check for new releases of Mumble every time you start the program, and notify you if one is available. אפשרות זו תבדוק אם יש עדכונים חדשים עבור Mumble בכל פעם שתפעיל את Mumble, ותודיע לך אם כן. Check for application updates on startup בדוק אם יש עדכונים בעת ההפעלה Check for new releases of plugins automatically. בדוק אם יש עדכונים לתוספים אוטומטית. This will check for new releases of plugins every time you start the program, and download them automatically. אפשרות זו תבדוק אם יש עדכונים לתוספים שלכם בכל פעם שתפעילו את Mumble, ותוריד אותם אוטומטית אם יש. <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. <b>שלח סטטיסטיקות אנונימיות.</b><br />ל-Mumble יש צוות פיתוח קטן, ולכן הוא צריך להתמקד בפיתוח החלקים שבהם יש את הצורך הגבוה ביותר. על ידי שליחת סטטיסטיקות אנונימיות אתם יכולים לעזור להם לדעת באיזה חלק של הפיתוח להתמקד. Submit anonymous statistics to the Mumble project שליחת סטטיסטיקות אנונימיות אל הפרוייקט Mumble Submit anonymous statistics שלח סטטיסטיקות אנונימיות Reconnect to last used server when starting Mumble התחברות מחודשת אל שרת אחרון בשימוש כאשר מפעילים את Mumble Reconnect to last server on startup התחבר שוב אל שרת אחרון בעת הפעלה Download plugin and overlay updates on startup הורד עדכונים עבור תוספים וממשק-המשחק Privacy Prevent OS information being sent to Mumble servers and web servers <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. Do not send OS information to Mumble servers and web servers Overlay Silent שותק Talking מדבר Whisper לוחש Shout צועק Channel ערוץ Failed to create communication with overlay at %2: %1. No overlay will be available. נכשל ביצירת קישוריות עם ממשק-המשחק ב-%2:%1. הממשק לא יוצג. OverlayClient Filter סנן Only talking רק מדברים Talking and recently active מדברים ופעילים לאחרונה All in current channel כולם בערוץ הנוכחי All in linked channels כולם בערוצים מקושרים Always show yourself הראה את עצמך תמיד Configure recently active time (%1 seconds)... הגדר את זמן הפעילות האחרונה (%1 שניות)... Columns טורים Sort מיין Alphabetically אלפבתית Last state change שינוי מצב אחרון Edit... עריכה... Reset Zoom אפס זום Configure recently active time הגדר את זמן הפעולה אחרונה Amount of seconds users remain active after talking: מספר השניות שבהן המשתמש נשאר פעיל מאז שדיבר פעם אחרונה: OverlayConfig To move the users, drag the little red dot. כדי להזיז משתמשים, גרור את הנקודה האדומה. To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. כדי לשנות את גודלם של משתמשים, הצבע עליהם וגלול עם העכבר. For more options, right click a user. For more options, rightclick a user. לעוד אפשרויות, הקש קליק ימני על משתמש. Launcher Filter Overlay ממשק-המשחק Choose executable בחר קובץ יישום Choose application בחר יישום Choose path Load Overlay Presets טען הגדרות ממשק מוכנות Mumble overlay presets (*.mumblelay) הגדרות מוכנות עבור ממשק-משחק של Mumble ‏(mumblelay.*) Save Overlay Presets שמור הגדרות ממשק Options אפשרויות Enable overlay. הפעל ממשק-משחק. Enable Overlay הפעל ממשק-משחק This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. אפשרות זו מגדירה האם ממשק-המשחק פעיל או לא. טעינת הממשק מתבצעת רק בעת הפעלת המשחק, ולכן יש לוודא כי Mumble הינו פעיל וכי אפשרות זו הינה פעילה טרם הפעלת המשחק. <br />שימו לב שאם תפעילו את Mumble אחרי הפעלת המשחק, או שתבטלו את הממשק בזמן שהמשחק רץ, אין דרך להפעיל מחדש את הממשק מבלי להפעיל מחדש את המשחק. Layout פריסה Blacklist רשימת התעלמות Whitelist רשימת הכרחה Uninstall Overlay הסר את ממשק-המשחק Overlay Installation התקנת ממשק-המשחק Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. ‏Mumble זיהה שממשק המשחק אינו מותקן במחשב זה. לחץ על הכפתור למטה כדי להתקין את הממשק. Install Mumble Overlay התקן ממשק-משחק של Mumble Overlay Upgrade עדכון ממשק-המשחק Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. ‏Mumble זיהה שגרסאת ממשק-המשחק שמותקנת במחשבך ישנה. כדי לעדכן את הגרסא, לחץ על הכפתור הבא. Upgrade Mumble Overlay עדכן ממשק-משחק Display a frame counter in the overlay הראה ספירת FPS בממשק Show FPS counter הצג מונה FPS Load an overlay preset from file טען הגדרות ממשק מקובץ Load… טעינה... Save your overlay settings to file שמור את הגדרות הממשק לקובץ Save… שמירה... Set the overlay font. בחר את סגנון הכתב של הממשק. Set the overlay text color. בחר את צבע הטקסט של הממשק. Color צבע Remove הסר Font גופן FPS and Clock Display <p dir="RTL">תצוגת FPS ושעון</p> Display a clock in the overlay showing the current local time (system time). <p dir="RTL">מציג את השעה בממשק-המשחק לפי שעון המחשב.</p> Show Clock <p dir="RTL">הראה שעון</p> Overlay Exceptions Overlay Exception Mode Allowed launchers Add Allowed programs Allowed paths Blacklisted programs OverlayEditor State מצב User is not talking המשתמש אינו מדבר Passive פסיבי User is talking in your channel or a linked channel המשתמש מדבר בערוץ שלכם או בערוץ מקושר Talking מדבר User is whispering to you privately המשתמש לוחש לכם בפרטיות Private Whisper לחישה פרטית User is shouting to your channel המשתמש צועק לערוץ שלכם Channel Whisper לחישה לערוץ Zoom זום Zoom Factor עוצמת הזום Enabled Elements עצמים נראים User avatar, chosen by each user תמונת משתמש אישית, נבחרת על ידי כל משתמש Avatar תמונה אישית User's name שמו של המשתש Username שם משתמש Name of user's channel, if outside your current channel שם הערוץ של המשתמש, אם נמצא בערוץ אחר Channel ערוץ Muted or deafened מושתק או מוחרש Mute state מצב השתקה Bounding box, automatically shrunk to minimum size to contain all visible elements מסגרת סביב המשתמש, שתשנה את גודלה אוטומטית כדי להכיל את כל העצמים Bounding box מסגרת Overlay Editor עורך ממשק OverlayEditorScene Layout preset הגדרות פריסה Large square avatar ריבוע תמונה אישית גדול Avatar and Name תמונה אישית ושם User Opacity שקיפות משתמש %1% %1% Object Opacity שקיפות אובייקט Alignment יישור Left שמאל Center מרכז Right ימין Top שיא Bottom תחתית Color... צבע... Font... גופן... Bounding box מסגרת Pen width עובי העט Padding ריפוד Pen color צבע עט Fill color צבע מילוי Pick pen color בחר צבע עט Pick fill color בחר צבע מילוי Pick color בחר צבע Pick font בחר גופן PluginConfig Plugins תוספות Plugin has no configure function. לתוסף אין אפשרות הגדרה. Plugin has no about function. לתוסף אין נתוני אודות. Options אפשרויות Enable plugins and transmit positional information מאפשר לתוספים לשלוח מידע על מיקום This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. מאפשר לתוספים של משחקים נתמכים לשלוח את מיקומכם במשחק עם תעבורת הקול. כך ניתן לאפשר למשתמשים אחרים לשמוע את קולך מהכיוון שבו אתה נמצא ביחס לשלהם (צליל מבוסס מיקום). Link to Game and Transmit Position שדר נתוני מיקום ממשחקים Reloads all plugins טעינה מחודשת של כל התוספות This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. סורק מחדש וטוען מחדש את כל התוספים. השתמשו בזאת רק אם הוספת או שינית תוסף בתיקיית התוספים. &Reload plugins &טען תוספות מחדש Information about plugin מידע אודות תוספת This shows a small information message about the plugin. מראה הודעה קטנה אודות התוסף. &About &אודות Show configuration page of plugin הצגת עמוד תצורה של תוספת This shows the configuration page of the plugin, if any. מראה את דף ההגדרות של התוסף, אם יש כזה. &Configure &תצורה Name שם Enabled מאופשרת Plugins Skipping plugin update in debug mode. מדלג על עדכון תוספים במצב ניפוי-שגיאות. Downloaded new or updated plugin to %1. מוריד או מעדכן תוסף עבור %1. Failed to install new plugin to %1. נכשל בהתקנת תוסף חדש ל-%1. %1 lost link. %1 איבד קישור. %1 linked. %1 קושר. PortAudioSystem Default Device התקן ברירת מחדל PulseAudioSystem Default Input קלט ברירת מחדל Default Output פלט ברירת מחדל QApplication Failed to restart mumble נכשל להתחיל מחדש את Mumble Mumble failed to restart itself. Please restart it manually. Mumble failed נכשל להתחיל עצמו מחדש. אנא התחל אותו מחדש ידנית. RichTextEditor Failed to load image טעינת תמונה נכשלה Image file too large to embed in document. Please use images smaller than %1 kB. קובץ התמונה גדול מדי מכדי להשתלב בתוך המסמך. אנא השתמש בתמונות קטנות מאשר %1 ק"ב. Message is too long. הודעה הינה ארוכה מדי. Display תצוגה Source Text קוד מקור &Bold &בולט Ctrl+B Ctrl+B &Italic &נטוי Italic נטוי Ctrl+I Ctrl+I Underline קו תחתון Ctrl+U Ctrl+U Color צבע Insert Link שיבוץ קישור Ctrl+L Ctrl+L Insert Image שיבוץ תמונה RichTextEditorLink Add Link הוסף קישור URL כתובת Text טקסט ServerHandler Unable to resolve hostname Server is not responding to TCP pings UDP packets cannot be sent to or received from the server. Switching to TCP mode. לא ניתן לשלוח או לקבל חבילות UDP. עובר למצב TCP. UDP packets cannot be sent to the server. Switching to TCP mode. לא ניתן לשלוח חבילות UDP לשרת. עובר למצב TCP. UDP packets cannot be received from the server. Switching to TCP mode. לא ניתן לקבל חבילות UDP מהשרת. מחליף למצב TCP. UDP packets can be sent to and received from the server. Switching back to UDP mode. ניתן לשלוח ולקבל חבילות UDP כעת. חוזר למצב UDP. Connection timed out זמן חיבור פקע ServerView Favorite מועדף LAN רשת מקומית Public Internet אינטרנט ציבורי Unknown Africa אפריקה Asia אסיה North America אמריקה הצפונית South America אמריקה הדרומית Europe אירופה Oceania אוקיאניה ShortcutActionWidget Unassigned לא מוקצה ShortcutDelegate On לחיצה Off מבוטל Toggle החלף Unassigned לא מוקצה ShortcutKeyWidget Press Shortcut לחץ על קיצור דרך ShortcutTargetDialog Root שורש Parent הורה Current נוכחי Subchannel #%1 ערוץ משנה מס' %1 ShortcutTargetWidget ... ... , , Root שורש Parent הורה Current נוכחי Subchannel #%1 ערוץ משנה מס' %1 Invalid לא תקין Empty <Empty> ריק ShortcutToggleWidget Off מבוטל Toggle החלף On לחיצה TextMessage Enter text הכנס טקסט If checked the message is recursively sent to all subchannels אם אפשרות זו מסומנת, ההודעה תשלח באופן רקורסיבי לכל תת הערוצים Send recursively to subchannels שלח לכל תת הערוצים Tokens Empty Token סיסמא ריקה Mumble - Access Tokens <p dir="RTL">Mumble - מפתחות גישה</p> List of access tokens on current server רשימת הסיסמאות השמורות עבור השרת נוכחי <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. <b>זוהי רשימה הניתנת לעריכה של הסיסמאות שהגדרת עבור השרת הנוכחי</b> <br /> סיסמא (או מפתח גישה) היא מחרוזת אותיות שמאפשרת שליטה בסיסית מאוד בגישה לערוצים. Mumble יזכור את כל הסיסמאות שהשתמשתם בהן וישלח אותן מחדש אל השרת בפעם הבאה שתתחברו, כדי שלא תצטרכו להכניס אותן שוב בכל פעם. Add a token הוסף סיסמא &Add הוס&ף Remove a token הסר סיסמא &Remove הס&ר UserEdit Registered Users משתמשים רשומים Remove הסרה Rename שנה שם Who are you looking for? <p dir="RTL">את מי אתם מחפשים?</p> Days ימים Weeks שבועות Months חודשים Years שנים Inactive for חסר פעילות למשך Registered users: %n account(s) משתמשים רשומים: חשבון %nמשתמשים רשומים: %n חשבונותמשתמשים רשומים: %n חשבונותמשתמשים רשומים: %n חשבונות UserInformation User Information מידע משתמש Connection Information מידע חיבור Version גירסא OS מערכת הפעלה Certificate אישור אבטחה IP Address כתובת IP CELT Versions גירסאות CELT Details... פרטים... Ping Statistics סטטיסטיקות פינג Pings received פינג שהתקבלו Average ping פינג ממוצע TCP (Control) TCP (בקרה) UDP (Voice) UDP (קול) UDP Network statistics UDP סטטיסטיקות רשת עבודה Good טוב Late איחר Lost נאבד Resync סינכרון מחדש From Client מן לקוח To Client אל לקוח Connection time זמן חיבור %1w %1 שב' %1d %1 י' %1h %1 ש' %1m %1 ד' %1s %1 שנ' , , %1 (%2) %1.%2.%3 (%4) %1 (%2) Supported נתמך Not Supported לא נתמך Not Reported לא מדווח %1 online (%2 idle) %1 מקוון (%2 לא פעילים) %1 online %1 מקוון %1 kbit/s %1 קב"ש Bandwidth GroupBox רוחב פס Bandwidth Label רוחב פס Ping deviation סטיית פינג UserListModel Nick כינוי Inactive days ימי חוסר פעילות Last channel ערוץ אחרון Last seen: %1 נראה לאחרונה: %1 Never אף פעם Channel ID: %1 UserLocalVolumeDialog Local volume for other users <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. Adjusting local volume for %1 dB <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: זהו משתמש מחובר לשרת. הסמל שמשמאל למשתמש מראה האם המשתמש מדבר או לא: Talking to your channel. מדבר אל הערוץ שלכם. Shouting directly to your channel. Whispering directly to your channel. צועק ישירות אל הערוץ שלכם. Whispering directly to you. לוחש ישירות אליכם. Not talking. לא מדבר. This is a channel on the server. The icon indicates the state of the channel: <p dir="RTL">זהו ערוץ בשרת. סמל הערוץ מסמל את מצבו:</p> Your current channel. הערוץ הנוכחי שלכם. A channel that is linked with your channel. Linked channels can talk to each other. ערוץ שמקושר אל הערוץ שלכם. ערוצים מקושרים יכולים לדבר אחד עם השני. A channel on the server that you are not linked to. ערוץ בשרת שאינכם מקושרים אליו. This shows the flags the user has on the server, if any: מראה את מצבי המשתמש, אם יש כאלה: On your friend list ברשימת החברים שלכם Authenticated user משתמש מזוהה Muted (manually muted by self) מושתק (השתקה עצמית) Muted (manually muted by admin) מושתק (על ידי מנהל) Muted (not allowed to speak in current channel) מושתק (לא רשאי לדבר בערוץ הנוכחי) Muted (muted by you, only on your machine) מושתק (על ידיך באופן מקומי) Muted (push-to-mute) Deafened (by self) מוחרש (עצמית) Deafened (by admin) מוחרש (על ידי מנהל) User has a new comment set (click to show) למשתמש יש הודעה אישית חדשה (לחצו כדי להציגה) User has a comment set, which you've already seen. (click to show) למשתמש יש הודעה אישית שכבר ראיתם (לחצו כדי לצפות) Ignoring Text Messages אתם מתעלמים מהודעות הטקסט של משתמש זה This shows the flags the channel has, if any: זה מראה את מצבי הערוץ, אם יש כאלה: Channel has a new comment set (click to show) לערוץ יש הערה חדשה (לחצו כדי לראות) Channel has a comment set, which you've already seen. (click to show) לערוץ יש הערה שכבר ראיתם (לחצו כדי לראות) Channel will be hidden when filtering is enabled <p dir="RTL">הערוץ יוסתר כאשר הסינון פעיל</p> Name שם Flags מצבים Are you sure you want to drag this user? Are you sure you want to drag this channel? האם אתה בטוח כי ברצונך לגרור את הערוץ הזה? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. לא ניתן לבצע את ההזזה הזאת אוטומטית, עליכם לאפס את מספור הערוצים או לערוך אותו ידנית. VersionCheck Upgrade Mumble שדרג את Mumble A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? גירסא חדשה של Mumble אותרה והיא תורד אוטומטית. מומלץ שתשדרג/י אל גירסא זו, או שתשוב/י אל השחרור היציב האחרון. האם ברצונך להפעיל את אשף ההתקנה כעת? Failed to launch snapshot installer. הפעלת ההתקנה נכשלה. Corrupt download of new version detected. Automatically removed. הורדה פגומה של גרסה חדשה זוהתה. ההורדה נמחקה אוטומטית. Downloading new snapshot from %1 to %2 מוריד עדכון משנה מגרסה %1 לגרסה %2 Failed to write new version to disk. Failed to write new version to disc. כתיבת הגרסא החדשה לדיסק נכשלה. Mumble failed to retrieve version information from the central server. ‏Mumble נכשל לקבל מידע אודות הגרסא מן השרת המרכזי. ViewCert Certificate Chain Details פרטי תעודת שרשרת Certificate chain תעודת שרשרת Certificate details פרטי תעודה Common Name Organization Subunit Country Locality State Valid from: %1 תקפה מן: %1 Valid to: %1 תקפה עד: %1 Serial: %1 סידורי: %1 Public Key: %1 bits %2 מפתח ציבורי: %1 סיביות %2 RSA RSA DSA DSA Digest (SHA-1): %1 הצפנה (SHA-1): %1 Digest (SHA-256): %1 Email: %1 דוא"ל: %1 DNS: %1 DNS: %1 Issued by: הונפקה על ידי: Unit Name VoiceRecorder Recorder failed to create directory '%1' הרשמקול נכשל ביצירת התיקייה '%1' Recorder failed to open file '%1' הרשמקול נכשל בפתיחת הקובץ '%1' .wav - Uncompressed .wav - לא דחוס .ogg (Vorbis) - Compressed .ogg (Vorbis) - דחוס .au - Uncompressed .au - לא דחוס .flac - Lossless compressed .flac - דחיסה משמרת איכות VoiceRecorderDialog Recorder רשמקול Control בקרה 00:00:00 ‭00:00:00 &Start ה&תחל S&top &עצור Mode מצב Multichannel רב ערוצי Output פלט Output format פורמט פלט Target directory מדור יעד Filename שם קובץ &Browse... &עיון... Valid variables are: משתנים תקפים הינם: Inserts the user's name מוסיף את שם המשתמש Inserts the current date מוסיף את התאריך הנוכחי Inserts the current time מוסיף את הזמן הנוכחי Inserts the hostname מוסיף את שם המארח Recorder still running רשמקול עדיין רץ Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? סגירת הרשמקול מבלי לעצור אותו תגרום לאיבוד השמע שעוד לא נשמר. האם אכן ברצונך לסגור את הרשמקול? Unable to start recording. Not connected to a server. לא ניתן להתחיל את ההקלטה. אינכם מחוברים לשרת. The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. השרת שאליו אתם מחוברים כעת הוא מגרסא 1.2.2 או ישנה יותר. מסיבות של פרטיות, הקלטה בשרתים שגרסאתם ישנה מ-1.2.3 אינה אפשרית. אנא צרו קשר עם מנהל השרת למידע נוסף. There is already a recorder active for this server. כבר יש רשמקול פועל עבור שרת זה. Please select a recording format. אנא בחרו פורמט הקלטה. Stopping עוצר Select target directory בחר תיקיית יעד Downmix ערבול WASAPIInput Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone. WASAPISystem Default Device התקן ברירת מחדל qwPTTButtonWidget Mumble PTT לחץ כדי לדבר של Mumble Push to talk לחץ כדי לדבר mumble-1.3.4/src/mumble/mumble_be.ts0000664000175000017500000114656314010707274017231 0ustar builderbuilder ACLEditor Deny Allow Allow %1 Deny %1 Mumble - Add channel Default server value Failed: Invalid channel Mumble - Edit %1 ID: %1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Channel must have a name This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Dialog Name Enter the channel name here. Description Password Enter the channel password here. Check to create a temporary channel. Temporary <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. Position &Groups Group List of groups Remove selected group Remove Inherit group members from parent Inherit Make group inheritable to sub-channels Inheritable Group was inherited from parent channel Inherited Members Add Add member to group Remove member from group &ACL Active ACLs List of entries Inherit ACL of parent? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. Inherit ACLs Move entry up This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. &Up Move entry down This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. &Down Add new entry This adds a new entry, initially set with no permissions and applying to all. &Add Remove entry This removes the currently selected entry. &Remove Context Entry should apply to this channel. Entry should apply to this channel This makes the entry apply to this channel. Applies to this channel Entry should apply to sub-channels. Add new group <b>Add</b><br/> Add a new group. Inherited members Contains the list of members added to the group by this channel. Contains a list of members whose group membership will not be inherited from the parent channel. Contains the list of members inherited by other channels. Type in the name of a user you wish to add to the group and click Add. Type in the name of a user you wish to remove from the group and click Add. Exclude Excluded members This makes the entry apply to sub-channels of this channel. Applies to sub-channels Permissions User/Group Group this entry applies to User ID User this entry applies to This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. &Properties <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. ID of the channel. Maximum Users Maximum number of users allowed in the channel <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. This is the sort order for the channel. ALSAAudioInput Default ALSA Card Opening chosen ALSA Input failed: %1 ALSAAudioOutput Default ALSA Card Opening chosen ALSA Output failed: %1 ASIOConfig %1 (version %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz ASIO Initialization failed: %1 Failed to instantiate ASIO driver ASIO Device selection Device Device to use for microphone This chooses what device to query. You still need to actually query the device and select which channels to use. Query selected device This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Query Configure selected device This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Configure Capabilities Driver name Buffer size This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. Configure input channels Channels Microphone <- -> Unused Speakers ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. Opening selected ASIO device failed. No input will be done. AboutDialog About Mumble <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble &License A&uthors &Third-Party Licenses OK AudioInput Interface System Input method for audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Input device for audio <b>This is the input device to use for audio.</b> Transmission &Transmit When to transmit your speech <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. DoublePush Time If you press the PTT key twice in this time it will get locked. <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. Reset audio cue to default <b>Reset</b><br/>Reset the paths for the files to their default. Browse for on audio file Browse for off audio file Off On Preview the audio cues Use SNR based speech detection Signal to Noise <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. Amplitude Voice &Hold How long to keep transmitting after silence Silence Below <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. Speech Above Signal values above this count as voice Compression &Quality Quality of compression (peak bandwidth) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. Audio per packet How many audio frames to send per packet <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). Audio Processing Noise Suppression Noise suppression <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. Maximum amplification of input sound <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. Current speech detection chance Cancel echo from speakers Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. Disabled <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal values below this count as silence Maximum bandwidth used for sending audio Use Amplitude based speech detection <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). Exclusive mode <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive R&eset &Browse... B&rowse... &Preview <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. Displays an always on top window with a push to talk button in it Display push to talk window Misc Audible audio cue when starting or stopping to transmit <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. Audio cue Gets played when starting to transmit Gets played when stopping to transmit Hold Time Time the microphone stays open after the PTT key is released Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) Max. Amplification Idle action minutes do nothing deafen mute after Echo Cancellation Mixed echo cancellation Multichannel echo cancellation The idle action will be reversed upon any key or mouse button input Undo Idle action upon activity Apply RNNoise's noise suppression filter. <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. RNNoise Audio input AudioInputDialog Continuous Voice Activity Push To Talk Audio Input %1 ms Off %1 s %1 kb/s -%1 dB %1 kbit/s (Audio %2, Position %4, Overhead %3) AudioOutput Interface System Output method for audio <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Output device for audio <b>This is the output device to use for audio.</b> Positional Audio Audio Output Default &Jitter Buffer Safety margin for jitter buffer <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. Minimum distance to user before sound volume decreases This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. Volume Volume of incoming speech <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. Output Delay Amount of data to buffer The connected "speakers" are actually headphones The connected "speakers" are actually headphones. Factor for sound volume decrease Bloom Factor for sound volume increase How much should sound volume increase for sources that are really close? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Headphones Minimum Distance Maximum Distance Maximum distance, beyond which speech volume won't decrease Minimum Volume What should the volume be at the maximum distance? Loopback Test Delay Variance Variance in packet latency <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. Packet Loss Packet loss for loopback mode <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% &Loopback Desired loopback mode Attenuate applications by... Attenuation of other applications during speech <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. If checked Mumble lowers the volume of other applications while other users talk <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. while other users talk If checked Mumble lowers the volume of other applications while you talk <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. while you talk Exclusive mode, not recommended. <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive Priority Speaker If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. Attenuate other users while talking as Priority Speaker. Advanced Attenuation Options If checked, Mumble will only attenuate applications that are using the same output source as Mumble <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. Only attenuate applications using the same output device If checked, PulseAudio loopback modules will be attenuated <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. Attenuate PulseAudio loopback modules Audio output AudioOutputDialog None Local Server Audio Output %1 ms %1 % %1 m AudioOutputSample Choose sound file Invalid sound file The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. AudioStats >1000 ms >1000ms Audio Statistics Input Levels Peak microphone level Peak power in last frame This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. Peak speaker level This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. Peak clean level This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. Signal Analysis Microphone power How close the current input level is to ideal This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. Signal-To-Noise ratio Signal-To-Noise ratio from the microphone This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. Speech Probability Probability of speech This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). Configuration feedback Current audio bitrate Bitrate of last frame DoublePush interval Time between last two Push-To-Talk presses Speech Detection Current speech detection chance <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal and noise power spectrum Power spectrum of input signal and noise estimate This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. Echo Analysis Weights of the echo canceller This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. AudioWizard Audio Tuning Wizard Introduction Welcome to the Mumble Audio Wizard Finished Enjoy using Mumble Device selection Selecting the input and output device to use with Mumble. This is the device your microphone is connected to. System Input method for audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Input device to use <b>Selects which sound card to use for audio input.</b> Cancel echo from headset or speakers Use echo cancellation This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. This is the device your speakers or headphones are connected to. Output method for audio <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. Output device to use <b>Selects which sound card to use for audio Output.</b> Enable positional audio Allows positioning of sound Allows positioning of sound. <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> Input Device Output Device This allows Mumble to use positional audio to place voices. <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> Amount of data to buffer This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> Positional Audio Adjusting attenuation of positional audio. <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> Use headphones instead of speakers <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> Use headphones This ignores the OS speaker configuration and configures the positioning for headphones instead. Volume tuning Tuning microphone hardware volume to optimal settings. Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. Voice Activity Detection Letting Mumble figure out when you're talking and when you're silent. This will help Mumble figure out when you are talking. The first step is selecting which data value to use. Raw amplitude from input Signal-To-Noise ratio Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Device tuning Changing hardware output delays to their minimum value. Submit anonymous statistics to the Mumble project Push To Talk: Quality & Notifications Adjust quality and notification settings. Quality settings Low Balanced Notification settings Use Text-To-Speech to read notifications and messages to you. Disable Text-To-Speech and use sounds instead. %1 ms Enables attenuation of other applications while users talk to you Attenuate applications while other users talk High Custom You already set a customized quality configuration in Mumble. Select this setting to keep it. Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. Apply some high contrast optimizations for visually impaired users Use high contrast graphics Keep custom Text-To-Speech settings. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) BanEditor Mumble - Edit Bans &Address &Mask Reason Start End User Hash &Add &Update &Remove Ban List Search field This is the search field. Use it to find bans that have this username set in the username field. Who are you looking for? No nickname IP address No IP address Reason for the ban No reason Ban end date Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). Certificate hash No certificate hash Banned users This is a list with banned users. Use this button if you want to add a new ban. Use this button if you want to update ban information. Use this button if you want to remove user from the ban list. Clear all fields This button clears all fields. Use it if you want to add a new ban. Clear Ban List - %n Ban(s) CertView Name Email Issuer Expiry Date (none) Self-signed CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. There was an error generating your certificate.<br />Please try again. Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. The file could not be opened for writing. Please use another file. The file's permissions could not be set. No certificate and key has been written. Please use another file. The file could not be written successfully. Please use another file. The file could not be opened for reading. Please use another file. The file is empty or could not be read. Please use another file. The file did not contain a valid certificate and key. Please use another file. Select file to export certificate to Select file to import certificate from Unable to import. Missing password or incompatible file type. <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. Certificates Certificate Management Certificate Authentication Authenticating to servers without using passwords Current certificate This is the certificate Mumble currently uses. Current Certificate Create a new certificate This will create a new certificate. Import certificate from file This will import a certificate from file. Import a certificate Export Certificate This will export a certificate to file. Export current certificate Import Certificate PKCS #12 Certificate import <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> Import from Filename to import from This is the filename you wish to import a certificate from. Select file to import from This opens a file selection dialog to choose a file to import a certificate from. Open... Password Password for PKCS#12 file This is the password for the PKCS#12 file containing your certificate. Certificate to import This is the certificate you are importing. Certificate Details Replace Certificate Replace existing certificate with new certificate? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> This is the certificate Mumble currently uses. It will be replaced. New certificate This is the new certificate that will replace the old one. New Certificate Make a backup of your certificate Export to Filename to export to This is the filename you wish to export a certificate to. Save As... This is the certificate Mumble currently uses. It will be exported. Generate a new certificate for strong authentication <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> Name Email Your email address (e.g. johndoe@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. Your name (e.g. John Doe) This is your name, and will be filled out in the certificate. This field is entirely optional. Finish Certificate-based authentication is ready for use Enjoy using Mumble with strong authentication. Automatic certificate creation <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> ChanACL None Traverse Enter Speak Mute/Deafen Make channel Make temporary Link channel This represents no privileges. This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. This represents the permission to write text messages to other users in this channel. This represents the permission to forcibly remove users from the server. This represents the permission to permanently remove users from the server. This represents the permission to register and unregister users on the server. This represents the permission to register oneself on the server. Whisper Move Text message Kick Ban Register User Register Self Write ACL ChatbarTextEdit Paste and &Send Paste and send <center>Type chat message here</center> ClientUser Friend Authenticated Priority speaker Recording Muted (server) Deafened (server) Local Ignore (Text messages) Local Mute Muted (self) Deafened (self) ConfigDialog Accept changes This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. Reject changes This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. Apply changes This button will immediately apply all changes. Undo changes for current page This button will revert any changes done on the current page to the most recent applied settings. Restore defaults for current page This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. Mumble Configuration ConnectDialog Connecting to %1 Enter username Adding host %1 Servername Hostname Bonjour name Port Addresses Website Packet loss Ping (80%) %1 ms Ping (95%) Bandwidth %1 kbit/s &Connect &Filters Unknown Users Version Failed to fetch server list Mumble Server Connect Ping Remove from Favorites Add custom server Show all servers that respond to ping Show all servers with users Show all servers &Copy Copy favorite link to clipboard &Paste Paste favorite from clipboard &Edit... &Add New... Add to &Favorites Open &Webpage Show &Reachable Show &Populated Show &All ConnectDialogEdit Edit Server Name of the server A&ddress Internet address of the server. Internet address of the server. <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. &Port Port on which the server is listening <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. &Username Username to send to the server <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. Label Add Server You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 Password Password to send to the server <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. Show password <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. Local server label 127.0.0.1 64738 Your username Your password &Fill CoreAudioSystem Default Device CrashReporter Mumble Crash Report <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> Email address (optional) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash Send Report Don't send report Crash upload successful Thank you for helping make Mumble better! Crash upload failed We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 Uploading crash report Abort upload DXAudioInput Default DirectSound Voice Input Opening chosen DirectSound Input device failed. No microphone capture will be done. Opening chosen DirectSound Input failed. Default device will be used. Lost DirectSound input device. DXAudioOutput Default DirectSound Voice Output Opening chosen DirectSound Output failed. Default device will be used. Lost DirectSound output device. Opening chosen DirectSound Output failed. No audio will be heard. Database Mumble failed to initialize a database in any of the possible locations. The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. DeveloperConsole Developer Console DockTitleBar Drag here GlobalShortcut Shortcuts List of configured shortcuts Function Data Shortcut Suppress Add new shortcut This will add a new global shortcut &Add Remove selected shortcut This will permanently remove a selected shortcut. &Remove <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> Open Accessibility Preferences Skip Enable Global Shortcuts <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. Additional Shortcut Engines <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. Enable Windows hooks <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. Enable GKey <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. Enable XInput <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. Enable shortcuts in privileged applications GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> Shortcuts Shortcut button combination. <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. Suppress keys from other applications <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. GlobalShortcutTarget Whisper Target Whisper to list of Users Channel Target Restrict to Group If specified, only members of this group will receive the whisper. List of users Add Remove Modifiers Do not send positional audio information when using this whisper shortcut. Ignore positional audio Shout to Linked channels Shout to subchannels Shout to Channel The whisper will also be transmitted to linked channels. The whisper will also be sent to the subchannels of the channel target. GlobalShortcutX Mouse %1 JackAudioSystem Hardware Ports Mono Stereo LCD Not connected LCDConfig Enable this device LCD Devices Name <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> Size Enabled Views Minimum Column Width <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> This setting decides the width of column splitter. Splitter Width Log Debug Critical Warning Information Server Connected Server Disconnected Other self-muted/deafened Permission Denied Text Message User Joined Server User Left Server User recording state changed User kicked (you or by you) User kicked You self-muted User muted (you) User muted (by you) User muted (other) User Joined Channel User Left Channel You self-unmuted You self-deafened You self-undeafened User renamed You Joined Channel You Joined Channel (moved) User connected and entered channel User left channel and disconnected Private text message the server [[ Invalid size ]] [[ Text object too large to display ]] [Date changed to %1] link to %1 FTP link to %1 player link channel link %1 link LogConfig Toggle console for %1 events Toggle pop-up notifications for %1 events Toggle Text-To-Speech for %1 events Click here to toggle sound notification for %1 events Toggle window highlight (if not active) for %1 events Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. Messages Message Console Notification Text-To-Speech Soundfile Path Text To Speech Volume Volume of Text-To-Speech Engine <b>This is the volume used for the speech synthesis.</b> Length threshold Message length threshold for Text-To-Speech Engine <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. Characters Whisper If checked you will only hear whispers from users you added to your friend list. Only accept whispers from friends If enabled text messages you send will be read back to you with TTS Read back own messages Chat Log Maximum chat length Unlimited Lines Highlight LookConfig System default None Only with users All Ask Do Nothing Move <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory User Interface This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. List users above subchannels (requires restart). <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. Users above Channels <b>If set, will verify you want to quit if connected.</b> Show number of users in each channel Show channel user count Language Language to use (requires restart) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. Look and Feel Layout Classic Stacked Hybrid Custom This changes the behavior when moving channels. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. Expand When to automatically expand channels Channel Dragging Ask whether to close or minimize when quitting Mumble. Ask on quit while connected Always On Top <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> Hide in tray when minimized Hide the main Mumble window in the tray when it is minimized. This setting controls when the application will be always on top. Never Always In minimal view In normal view Displays talking status in system tray Show talking status in tray icon This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. Show context menu in menu bar Apply some high contrast optimizations for visually impaired users Optimize for high contrast Application Adds user and channel context menus into the menu bar Tray Icon Channel Tree Use selected item as the chat bar target Filter automatically hides empty channels Show transmit mode dropdown in toolbar Theme Theme to use to style the user interface <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. User Dragging This changes the behavior when moving users. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. Enable Developer menu When in custom layout mode, checking this disables rearranging. Lock layout MainWindow Root Push-to-Talk Global Shortcut Push and hold this button to send voice. Global Shortcut This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut Reset Audio Processor Global Shortcut Unlink Plugin Global Shortcut Push-to-Mute Global Shortcut Join Channel Global Shortcut Toggle Overlay Global Shortcut Toggle state of in-game overlay. Global Shortcut Toggle Minimal Global Shortcut Volume Up (+10%) Global Shortcut Volume Down (-10%) Global Shortcut Mumble Mumble -- %1 &Window Minimize Ctrl+M Close Mumble is currently connected to a server. Do you want to Close or Minimize it? Mute Self Global Shortcut Set self-mute status. Global Shortcut This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut Deafen Self Global Shortcut Set self-deafen status. Global Shortcut This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut Whisper/Shout Whisper <center>Not connected</center> Not connected Clear Opening URL %1 File does not exist File is not a configuration file. Settings merged from file. URL scheme is not 'mumble' This version of Mumble can't handle URLs for Mumble version %1.%2.%3 Connecting to %1 Enter username Connecting to server %1. Reconnecting. Transmit Mode set to Continuous <p>%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> Register yourself as %1 <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <h2>Version</h2><p>Protocol %1</p> <p>No build information or OS version available</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) The connection is secured by the cipher suite that OpenSSL identifies as %1 <p>The connection provides perfect forward secrecy</p> <p>The connection does not provide perfect forward secrecy</p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> Voice channel is sent over control channel Register user %1 <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> Kicking user %1 Banning user %1 View comment on user %1 Message to channel %1 Connected. <li>Expected certificate digest (SHA-1): %1</li> Server presented a certificate which failed verification. <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> SSL Version mismatch Server connection failed. <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>Type message to user '%1' here</center> Type message to user '%1' here Choose image file Failed to load image Could not open file for reading. Image format not recognized. &User &Channel Use in conjunction with Whisper to. Global Shortcut This will switch the states of the in-game overlay. Global Shortcut Link Channel Global Shortcut Cycle Transmit Mode Global Shortcut Set Transmit Mode to Push-To-Talk Global Shortcut Set Transmit Mode to Continuous Global Shortcut Set Transmit Mode to VAD Global Shortcut Send Text Message Global Shortcut Send Clipboard Text Message Global Shortcut This will send your Clipboard content to the channel you are currently in. Global Shortcut Continuous Voice Activity Push-to-Talk Mumble - Minimal View -- %1 Cancel Save Image As... Save Image File Could not save image: %1 Change your comment Transmit Mode set to Voice Activity Transmit Mode set to Push-to-Talk <p>Connected users: %1/%2</p> UDP Statistics To Server From Server Good Late Lost Resync <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> Mumble Server Information &View Certificate Enter reason Sending message to %1 To %1: %2 Message to %1 Are you sure you want to reset the comment of user %1? Are you sure you want to reset the avatar of user %1? Are you sure you want to delete %1 and all its sub-channels? Sending message to channel %1 Message to tree %1 To %1 (Tree): %2 (Tree) %1: %2 Unmuted and undeafened. Unmuted. Muted. Muted and deafened. Deafened. Undeafened. Restart Mumble? Some settings will only apply after a restart of Mumble. Restart Mumble now? About Qt SSL Verification failed: %1 <li>Server certificate digest (SHA-1): %1</li> <b>WARNING:</b> The server presented a certificate that was different from the stored one. This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. Server connection failed: %1. Disconnected from server. Invalid username You connected with an invalid username, please try another one. Username in use That username is already in use, please try another username. Wrong certificate or password Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. Wrong password Wrong server password for unregistered user account, please try again. Images (*.png *.jpg *.jpeg) C&onfigure &Help Log This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. &Quit Mumble Closes the program Exits the application. Ctrl+Q Open the server connection dialog &Disconnect Disconnect from server Disconnects you from the server. Show information about the server connection This will show extended information about the connection to the server. &Mute &Deafen &Local Mute Send a Text Message Sends a text message to another user. Add new channel This adds a new sub-channel to the currently selected channel. Remove channel This removes a channel and all sub-channels. Edit Groups and ACL for channel This opens the Group and ACL dialog for the channel, to control permissions. &Link Link your channel to another channel This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. Chatbar Shows a dialog of registered servers, and also allows quick-connect. Kick user (with reason) Kick selected user off server. You'll be asked to specify a reason. Mute user Mute or unmute user on server. Unmuting a deafened user will also undeafen them. Kick and ban user (with reason) Kick and ban selected user from server. You'll be asked to specify a reason. Deafen user Deafen or undeafen user on server. Deafening a user will also mute them. Mute user locally Mute or unmute user locally. Use this on other users in the same room. This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. &Unlink Channel Unlink your channel from another channel This unlinks your current channel from the selected channel. Unlinks your channel from all linked channels. This unlinks your current channel (not the selected one) from all linked channels. &Reset Reset audio preprocessor This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. &Mute Self Mute yourself Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. &Deafen Self Deafen yourself Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. &Text-To-Speech Toggle Text-To-Speech Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. Display audio statistics Pops up a small dialog with information about your current audio input. Forcibly unlink plugin This forces the current plugin to unlink, which is handy if it is reading completely wrong data. Configure Mumble Allows you to change most settings for Mumble. Start the audio configuration wizard This will guide you through the process of configuring your audio hardware. &What's This? Enter What's This? mode Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. Information about Mumble Shows a small dialog with information and license for Mumble. Information about Speex Shows a small dialog with information about Speex. Information about Qt Shows a small dialog with information about Qt. Check for &Updates Check for new version of Mumble Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. Sends a text message to all users in a channel. Configure certificates for strong authentication This starts the wizard for creating, importing and exporting certificates for authentication against servers. Register user on server This will permanently register the user on the server. Add &Friend Adds a user as your friend. This will add the user as a friend, so you can recognize him on this and other servers. &Remove Friend Removes a user from your friends. This will remove a user from your friends list. &Update Friend Update name of your friend. Your friend uses a different name than what is in your database. This will update the name. Edit registered users list This opens the editor for registered users, which allow you to change their name or unregister them. Add or remove text-based access tokens &Minimal View Toggle minimal window modes This will toggle minimal mode, where the log window and menu is hidden. You muted and deafened %1. You unmuted and undeafened %1. You undeafened %1. You suppressed %1. %1 muted and deafened by %2. %1 unmuted and undeafened by %2. %1 undeafened by %2. %1 suppressed by %2. %1 moved to %2. %1 moved to %2 by %3. %1 moved in from %2 by %3. %1 is now muted and deafened. Your account information can not be verified currently. Please try again later Welcome message: %1 Mumble: %1 You were denied %1 privileges in %2. %3 was denied %1 privileges in %2. Denied: Cannot modify SuperUser. Denied: Invalid channel name. Denied: Text message too long. Denied: Operation not permitted in temporary channel. You need a certificate to perform this operation. %1 does not have a certificate. Invalid username: %1. Invalid username. Channel is full. Channel nesting limit reached. Channel count limit reached. Need to delete channels before creating new ones. Permission denied. %1 connected and entered channel. %1 connected. %1 is now muted. %1 is now unmuted. Recording started Recording stopped %1 started recording. %1 stopped recording. You revoked your priority speaker status. You assumed priority speaker status. %1 revoked your priority speaker status. %1 gave you priority speaker status. You revoked priority speaker status for %1. You gave priority speaker status to %1. %1 revoked own priority speaker status. %1 assumed priority speaker status. %1 revoked priority speaker status for %2. %1 gave priority speaker status to %2. You were unmuted and undeafened by %1. You were muted by %1. You were undeafened by %1. You were suppressed. You were suppressed by %1. You were unsuppressed. You were unsuppressed by %1. You joined %1. You moved %1 to %2. %1 is recording %1 renamed to %2 by %3. %1 disconnected. Server message from (Tree) (Channel) (Private) %2%1: %3 Failed to load Opus, it will not be available for audio encoding/decoding. The server requests minimum client version %1 The server requests positional audio be enabled. The server requests positional audio be disabled. The server requests Push-to-Talk be enabled. The server requests Push-to-Talk be disabled. You were unmuted by %1. You muted %1. You unsuppressed %1. You unmuted %1. %1 muted by %2. %1 unsuppressed by %2. %1 unmuted by %2. Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. You were muted and deafened by %1. You were deafened by %1. You were kicked from the server by %1: %2. %3 was kicked from the server by %1: %2. You were kicked and banned from the server by %1: %2. %3 was kicked and banned from the server by %1: %2. You were moved to %1 by %2. %1 entered channel. Server connection rejected: %1. Denied: %1. %1 renamed to %2. %1 left channel and disconnected. Message from %1 You have User Dragging set to "Do Nothing" so the user wasn't moved. You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. Unknown Channel Drag mode in UserModel::dropMimeData. Remote controlling Mumble: Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) -jn, --jackname Set custom Jack client name. --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status Invocation Error: No RPC command specified RPC Welcome to Mumble. Skipping version check in debug mode. Hide Frame Toggle showing frame on minimal window This will toggle whether the minimal window should have a frame for moving and resizing. &Unlink All Reset the comment of the selected user. &Join Channel View comment in editor Query server for connection information for user S&erver &Self &Unlink Plugins Register yourself on the server Change your avatar image on this server &Remove Avatar Remove currently defined avatar image. Icon Toolbar Change your own comment Recording Priority Speaker &Copy URL Copies a link to this channel to the clipboard. Ignore Messages Locally ignore user's text chat messages. Silently drops all text messages from the user. Edit ban list on server This lets you edit the server-side IP ban list. &Filter on/off Toggle the channel filter (Ctrl+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. Ctrl+F &Hide Channel when Filtering Reset the avatar of the selected user. Locally adjust the user's speech volume. Opens a dialog with a volume slider. Use this on other users in the same room. &Developer &Hide Mumble Hides the main Mumble window. Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. Show the Developer Console Shows the Mumble Developer Console, where Mumble's log output can be inspected. &Connect... &Ban list... &Information... &Kick... &Ban... Local Volume Adjustment... Send &Message... &Add... &Remove... &Edit... Audio S&tatistics... &Settings... &Audio Wizard... Developer &Console... &About... About &Speex... About &Qt... &Certificate Wizard... &Register... Registered &Users... Change &Avatar... &Access Tokens... Reset &Comment... Reset &Avatar... View Comment... &Change Comment... R&egister... Show Shows the main Mumble window. Manual Manual Mumble Positional Audio Position X Y Z m Heading Azimuth Elevation ° Meta data Context Identity Set State Linked Activated Unhinge NetworkConfig Network Updates are mandatory when using snapshot releases. Connection Use TCP compatibility mode Use TCP compatability mode <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). Reconnect when disconnected <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. Reconnect automatically Proxy Type Type of proxy to connect through Direct connection HTTP(S) proxy SOCKS5 proxy Hostname Hostname of the proxy Force TCP mode Enable QoS to prioritize packets This will enable QoS, which will attempt to prioritize voice packets over other traffic. Use Quality of Service Don't send certificate to server and don't save passwords. (Not saved). <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> Suppress certificate and password storage <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. Port Port number of the proxy <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. Username Username for proxy authentication <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Password Password for proxy authentication <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Mumble services Check for new releases of Mumble automatically. This will check for new releases of Mumble every time you start the program, and notify you if one is available. Check for application updates on startup Check for new releases of plugins automatically. This will check for new releases of plugins every time you start the program, and download them automatically. <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. Submit anonymous statistics to the Mumble project Submit anonymous statistics Reconnect to last used server when starting Mumble Reconnect to last server on startup Download plugin and overlay updates on startup Privacy Prevent OS information being sent to Mumble servers and web servers <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. Do not send OS information to Mumble servers and web servers Overlay Silent Talking Whisper Shout Channel Failed to create communication with overlay at %2: %1. No overlay will be available. OverlayClient Filter Only talking Talking and recently active All in current channel All in linked channels Always show yourself Configure recently active time (%1 seconds)... Columns Sort Alphabetically Last state change Edit... Reset Zoom Configure recently active time Amount of seconds users remain active after talking: OverlayConfig To move the users, drag the little red dot. To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. For more options, right click a user. For more options, rightclick a user. Launcher Filter Overlay Choose executable Choose application Choose path Load Overlay Presets Mumble overlay presets (*.mumblelay) Save Overlay Presets Options Enable overlay. Enable Overlay This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. Layout Blacklist Whitelist Uninstall Overlay Overlay Installation Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. Install Mumble Overlay Overlay Upgrade Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. Upgrade Mumble Overlay Display a frame counter in the overlay Show FPS counter Load an overlay preset from file Load… Save your overlay settings to file Save… Set the overlay font. Set the overlay text color. Color Remove Font FPS and Clock Display Display a clock in the overlay showing the current local time (system time). Show Clock Overlay Exceptions Overlay Exception Mode Allowed launchers Add Allowed programs Allowed paths Blacklisted programs OverlayEditor State User is not talking Passive User is talking in your channel or a linked channel Talking User is whispering to you privately Private Whisper User is shouting to your channel Channel Whisper Zoom Zoom Factor Enabled Elements User avatar, chosen by each user Avatar User's name Username Name of user's channel, if outside your current channel Channel Muted or deafened Mute state Bounding box, automatically shrunk to minimum size to contain all visible elements Bounding box Overlay Editor OverlayEditorScene Layout preset Large square avatar Avatar and Name User Opacity %1% Object Opacity Alignment Left Center Right Top Bottom Color... Font... Bounding box Pen width Padding Pen color Fill color Pick pen color Pick fill color Pick color Pick font PluginConfig Plugins Plugin has no configure function. Plugin has no about function. Options Enable plugins and transmit positional information This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. Link to Game and Transmit Position Reloads all plugins This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. &Reload plugins Information about plugin This shows a small information message about the plugin. &About Show configuration page of plugin This shows the configuration page of the plugin, if any. &Configure Name Enabled Plugins Skipping plugin update in debug mode. Downloaded new or updated plugin to %1. Failed to install new plugin to %1. %1 lost link. %1 linked. PortAudioSystem Default Device PulseAudioSystem Default Input Default Output QApplication Failed to restart mumble Mumble failed to restart itself. Please restart it manually. RichTextEditor Failed to load image Image file too large to embed in document. Please use images smaller than %1 kB. Message is too long. Display Source Text &Bold Ctrl+B &Italic Italic Ctrl+I Underline Ctrl+U Color Insert Link Ctrl+L Insert Image RichTextEditorLink Add Link URL Text ServerHandler Unable to resolve hostname Server is not responding to TCP pings UDP packets cannot be sent to or received from the server. Switching to TCP mode. UDP packets cannot be sent to the server. Switching to TCP mode. UDP packets cannot be received from the server. Switching to TCP mode. UDP packets can be sent to and received from the server. Switching back to UDP mode. Connection timed out ServerView Favorite LAN Public Internet Unknown Africa Asia North America South America Europe Oceania ShortcutActionWidget Unassigned ShortcutDelegate On Off Toggle Unassigned ShortcutKeyWidget Press Shortcut ShortcutTargetDialog Root Parent Current Subchannel #%1 ShortcutTargetWidget ... , Root Parent Current Subchannel #%1 Invalid Empty <Empty> ShortcutToggleWidget Off Toggle On TextMessage Enter text If checked the message is recursively sent to all subchannels Send recursively to subchannels Tokens Empty Token Mumble - Access Tokens List of access tokens on current server <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. Add a token &Add Remove a token &Remove UserEdit Registered Users Remove Rename Who are you looking for? Days Weeks Months Years Inactive for Registered users: %n account(s) UserInformation User Information Connection Information Version OS Certificate IP Address CELT Versions Details... Ping Statistics Pings received Average ping TCP (Control) UDP (Voice) UDP Network statistics Good Late Lost Resync From Client To Client Connection time %1w %1d %1h %1m %1s , %1 (%2) %1.%2.%3 (%4) Supported Not Supported Not Reported %1 online (%2 idle) %1 online %1 kbit/s Bandwidth GroupBox Bandwidth Label Ping deviation UserListModel Nick Inactive days Last channel Last seen: %1 Never Channel ID: %1 UserLocalVolumeDialog Local volume for other users <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. Adjusting local volume for %1 dB <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: Talking to your channel. Shouting directly to your channel. Whispering directly to your channel. Whispering directly to you. Not talking. This is a channel on the server. The icon indicates the state of the channel: Your current channel. A channel that is linked with your channel. Linked channels can talk to each other. A channel on the server that you are not linked to. This shows the flags the user has on the server, if any: On your friend list Authenticated user Muted (manually muted by self) Muted (manually muted by admin) Muted (not allowed to speak in current channel) Muted (muted by you, only on your machine) Muted (push-to-mute) Deafened (by self) Deafened (by admin) User has a new comment set (click to show) User has a comment set, which you've already seen. (click to show) Ignoring Text Messages This shows the flags the channel has, if any: Channel has a new comment set (click to show) Channel has a comment set, which you've already seen. (click to show) Channel will be hidden when filtering is enabled Name Flags Are you sure you want to drag this user? Are you sure you want to drag this channel? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. VersionCheck Upgrade Mumble A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? Failed to launch snapshot installer. Corrupt download of new version detected. Automatically removed. Downloading new snapshot from %1 to %2 Failed to write new version to disk. Failed to write new version to disc. Mumble failed to retrieve version information from the central server. ViewCert Certificate Chain Details Certificate chain Certificate details Common Name Organization Subunit Country Locality State Valid from: %1 Valid to: %1 Serial: %1 Public Key: %1 bits %2 RSA DSA Digest (SHA-1): %1 Digest (SHA-256): %1 Email: %1 DNS: %1 Issued by: Unit Name VoiceRecorder Recorder failed to create directory '%1' Recorder failed to open file '%1' .wav - Uncompressed .ogg (Vorbis) - Compressed .au - Uncompressed .flac - Lossless compressed VoiceRecorderDialog Recorder Control 00:00:00 &Start S&top Mode Multichannel Output Output format Target directory Filename &Browse... Valid variables are: Inserts the user's name Inserts the current date Inserts the current time Inserts the hostname Recorder still running Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? Unable to start recording. Not connected to a server. The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. There is already a recorder active for this server. Please select a recording format. Stopping Select target directory Downmix WASAPIInput Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone. WASAPISystem Default Device qwPTTButtonWidget Mumble PTT Push to talk mumble-1.3.4/src/mumble/WASAPINotificationClient.cpp0000664000175000017500000001406414010707274022115 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "MainWindow.h" #include "WASAPINotificationClient.h" #include #include // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" HRESULT STDMETHODCALLTYPE WASAPINotificationClient::OnDefaultDeviceChanged(EDataFlow flow, ERole role, LPCWSTR pwstrDefaultDevice) { const QString device = QString::fromWCharArray(pwstrDefaultDevice); qWarning() << "WASAPINotificationClient: Default device changed flow=" << flow << "role=" << role << "device" << device; QMutexLocker lock(&listsMutex); if (!usedDefaultDevices.empty() && role == eCommunications) { restartAudio(); } return S_OK; } HRESULT STDMETHODCALLTYPE WASAPINotificationClient::OnPropertyValueChanged(LPCWSTR pwstrDeviceId, const PROPERTYKEY key) { const QString device = QString::fromWCharArray(pwstrDeviceId); const bool formatChanged = (key == PKEY_AudioEngine_DeviceFormat); const bool channelConfigChanged = (key == PKEY_AudioEndpoint_PhysicalSpeakers); QMutexLocker lock(&listsMutex); if ((formatChanged || channelConfigChanged) && usedDevices.contains(device)) { qWarning() <<"WASAPINotificationClient: Property changed device=" << device << "formatChanged=" << formatChanged << "channelConfigChanged=" << channelConfigChanged; restartAudio(); } return S_OK; } HRESULT STDMETHODCALLTYPE WASAPINotificationClient::OnDeviceAdded(LPCWSTR pwstrDeviceId) { const QString device = QString::fromWCharArray(pwstrDeviceId); qWarning() << "WASAPINotificationClient: Device added=" << device; return S_OK; } HRESULT STDMETHODCALLTYPE WASAPINotificationClient::OnDeviceRemoved(LPCWSTR pwstrDeviceId) { const QString device = QString::fromWCharArray(pwstrDeviceId); qWarning() << "WASAPINotificationClient: Device removed=" << device; return S_OK; } HRESULT STDMETHODCALLTYPE WASAPINotificationClient::OnDeviceStateChanged(LPCWSTR pwstrDeviceId, DWORD dwNewState) { const QString device = QString::fromWCharArray(pwstrDeviceId); qWarning() << "WASAPINotificationClient: Device state changed newState=" << dwNewState << "device=" << device; return S_OK; } HRESULT STDMETHODCALLTYPE WASAPINotificationClient::QueryInterface(REFIID riid, VOID **ppvInterface) { if (IID_IUnknown == riid) { *ppvInterface = (IUnknown*)this; AddRef(); } else if (__uuidof(IMMNotificationClient) == riid) { *ppvInterface = (IMMNotificationClient*)this; AddRef(); } else { *ppvInterface = NULL; return E_NOINTERFACE; } return S_OK; } ULONG STDMETHODCALLTYPE WASAPINotificationClient::AddRef() { return InterlockedIncrement(&_cRef); } ULONG STDMETHODCALLTYPE WASAPINotificationClient::Release() { // We hold a ref to ourselves all the time (static singleton) so no // need to clean ourselves up or anything. ULONG ulRef = InterlockedDecrement(&_cRef); Q_ASSERT(ulRef > 0); return ulRef; } void WASAPINotificationClient::enlistDefaultDeviceAsUsed(LPCWSTR pwstrDefaultDevice) { const QString device = QString::fromWCharArray(pwstrDefaultDevice); QMutexLocker lock(&listsMutex); if (!usedDefaultDevices.contains(device)) { usedDefaultDevices.append(device); _enlistDeviceAsUsed(device); } } void WASAPINotificationClient::enlistDeviceAsUsed(LPCWSTR pwstrDevice) { const QString device = QString::fromWCharArray(pwstrDevice); QMutexLocker lock(&listsMutex); _enlistDeviceAsUsed(device); } void WASAPINotificationClient::_enlistDeviceAsUsed(const QString& device) { if (!usedDevices.contains(device)) { usedDevices.append(device); } } void WASAPINotificationClient::enlistDeviceAsUsed(const QString& device) { QMutexLocker lock(&listsMutex); _enlistDeviceAsUsed(device); } void WASAPINotificationClient::unlistDevice(LPCWSTR pwstrDevice) { const QString device = QString::fromWCharArray(pwstrDevice); QMutexLocker lock(&listsMutex); usedDevices.removeOne(device); usedDefaultDevices.removeOne(device); } void WASAPINotificationClient::clearUsedDefaultDeviceList() { QMutexLocker lock(&listsMutex); usedDefaultDevices.clear(); } void WASAPINotificationClient::_clearUsedDeviceLists() { usedDefaultDevices.clear(); usedDevices.clear(); } void WASAPINotificationClient::clearUsedDeviceLists() { QMutexLocker lock(&listsMutex); _clearUsedDeviceLists(); } void WASAPINotificationClient::doGetOnce() { (void)WASAPINotificationClient::doGet(); } WASAPINotificationClient& WASAPINotificationClient::doGet() { static WASAPINotificationClient instance; return instance; } static boost::once_flag notification_client_init_once = BOOST_ONCE_INIT; WASAPINotificationClient& WASAPINotificationClient::get() { // Hacky way of making sure we get a thread-safe yet lazy initialization of the static. boost::call_once(&WASAPINotificationClient::doGetOnce, notification_client_init_once); return doGet(); } WASAPINotificationClient::WASAPINotificationClient() : QObject(), pEnumerator(0), listsMutex() { AddRef(); // Static singleton, always has a self-reference HRESULT hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), reinterpret_cast(&pEnumerator)); if (!pEnumerator || FAILED(hr)) { if (pEnumerator) { pEnumerator->Release(); pEnumerator = 0; } qWarning() << "WASAPINotificationClient: Failed to create enumerator, will not receive notifications"; return; } g.mw->connect(this, SIGNAL(doResetAudio()), SLOT(onResetAudio()), Qt::QueuedConnection); pEnumerator->RegisterEndpointNotificationCallback(this); } WASAPINotificationClient::~WASAPINotificationClient() { if (pEnumerator) pEnumerator->Release(); } void WASAPINotificationClient::restartAudio() { qWarning("WASAPINotificationClient: Triggering audio reset"); _clearUsedDeviceLists(); emit doResetAudio(); } mumble-1.3.4/src/mumble/PulseAudio.h0000664000175000017500000000762614010707273017147 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_PULSEAUDIO_H_ #define MUMBLE_MUMBLE_PULSEAUDIO_H_ #include #include #include #include "AudioInput.h" #include "AudioOutput.h" struct PulseAttenuation { uint32_t index; QString name; QString stream_restore_id; pa_cvolume normal_volume; pa_cvolume attenuated_volume; }; class PulseAudioInput; class PulseAudioOutput; class PulseAudioSystem : public QObject { private: Q_OBJECT Q_DISABLE_COPY(PulseAudioSystem) protected: void wakeup(); pa_context *pacContext; pa_stream *pasInput, *pasOutput, *pasSpeaker; pa_threaded_mainloop *pam; pa_defer_event *pade; bool bSourceDone, bSinkDone, bServerDone, bRunning; QString qsDefaultInput, qsDefaultOutput; int iDelayCache; QString qsOutputCache, qsInputCache, qsEchoCache; bool bPositionalCache; bool bEchoMultiCache; QHash qhEchoMap; QHash qhSpecMap; QHash qhChanMap; bool bAttenuating; int iRemainingOperations; int iSinkId; QHash qhVolumes; QList qlMatchedSinks; QHash qhUnmatchedSinks; QHash qhMissingSinks; static void defer_event_callback(pa_mainloop_api *a, pa_defer_event *e, void *userdata); static void context_state_callback(pa_context *c, void *userdata); static void subscribe_callback(pa_context *c, pa_subscription_event_type_t t, uint32_t idx, void *userdata); static void sink_callback(pa_context *c, const pa_sink_info *i, int eol, void *userdata); static void source_callback(pa_context *c, const pa_source_info *i, int eol, void *userdata); static void server_callback(pa_context *c, const pa_server_info *i, void *userdata); static void sink_info_callback(pa_context *c, const pa_sink_info *i, int eol, void *userdata); static void stream_callback(pa_stream *s, void *userdata); static void read_callback(pa_stream *s, size_t bytes, void *userdata); static void write_callback(pa_stream *s, size_t bytes, void *userdata); static void volume_sink_input_list_callback(pa_context *c, const pa_sink_input_info *i, int eol, void *userdata); static void restore_sink_input_list_callback(pa_context *c, const pa_sink_input_info *i, int eol, void *userdata); static void stream_restore_read_callback(pa_context *c, const pa_ext_stream_restore_info *i, int eol, void *userdata); static void restore_volume_success_callback(pa_context *c, int success, void *userdata); void contextCallback(pa_context *c); void eventCallback(pa_mainloop_api *a, pa_defer_event *e); void query(); QString outputDevice() const; QString inputDevice() const; void setVolumes(); PulseAttenuation* getAttenuation(QString stream_restore_id); public: QHash qhInput; QHash qhOutput; bool bPulseIsGood; QMutex qmWait; QWaitCondition qwcWait; void wakeup_lock(); PulseAudioSystem(); ~PulseAudioSystem() Q_DECL_OVERRIDE; }; class PulseAudioInput : public AudioInput { friend class PulseAudioSystem; private: Q_OBJECT Q_DISABLE_COPY(PulseAudioInput) protected: QMutex qmMutex; QWaitCondition qwcWait; pa_sample_spec pssMic, pssEcho; public: PulseAudioInput(); ~PulseAudioInput() Q_DECL_OVERRIDE; void run() Q_DECL_OVERRIDE; }; class PulseAudioOutput : public AudioOutput { friend class PulseAudioSystem; private: Q_OBJECT Q_DISABLE_COPY(PulseAudioOutput) protected: QMutex qmMutex; QWaitCondition qwcWait; pa_sample_spec pss; pa_channel_map pcm; public: PulseAudioOutput(); ~PulseAudioOutput() Q_DECL_OVERRIDE; void run() Q_DECL_OVERRIDE; }; #endif mumble-1.3.4/src/mumble/Overlay.h0000664000175000017500000000564314010707273016513 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_OVERLAY_H_ #define MUMBLE_MUMBLE_OVERLAY_H_ #include #include #include #if QT_VERSION >= 0x050000 # include #else # include #endif #include "ConfigDialog.h" #include "OverlayText.h" #include "../../overlay/overlay.h" #include "ui_OverlayEditor.h" class ClientUser; class Overlay; class QLocalServer; class OverlayClient; class OverlayConfig; struct OverlayAppInfo { static QString applicationIdentifierForPath(const QString &path); static OverlayAppInfo applicationInfoForId(const QString &identifier); QString qsDisplayName; QIcon qiIcon; private: OverlayAppInfo(QString name, QIcon icon = QIcon()); }; class OverlayGroup : public QGraphicsItem { private: Q_DISABLE_COPY(OverlayGroup); public: enum { Type = UserType + 5 }; public: OverlayGroup(); QRectF boundingRect() const Q_DECL_OVERRIDE; void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *) Q_DECL_OVERRIDE; int type() const Q_DECL_OVERRIDE; template QRectF boundingRect() const; }; class OverlayMouse : public QGraphicsPixmapItem { private: Q_DISABLE_COPY(OverlayMouse) public: bool contains(const QPointF &) const Q_DECL_OVERRIDE; bool collidesWithPath(const QPainterPath &, Qt::ItemSelectionMode = Qt::IntersectsItemShape) const Q_DECL_OVERRIDE; OverlayMouse(QGraphicsItem * = NULL); }; class OverlayPrivate : public QObject { private: Q_OBJECT Q_DISABLE_COPY(OverlayPrivate) public: OverlayPrivate(QObject *p) : QObject(p) {}; }; class Overlay : public QObject { friend class OverlayConfig; friend class OverlayClient; friend class OverlayUser; private: Q_OBJECT Q_DISABLE_COPY(Overlay) protected: OverlayPrivate *d; QSet qsQueried; QSet qsQuery; /// A flag indicating if the platformInit has been called already bool m_initialized; /// Initializes the overlay, if it hasn't been initialized yet void initialize(); // These 2 functions (among others) are implemented by the system-specific backend void platformInit(); void setActiveInternal(bool act); void createPipe(); QMap qmOverlayHash; QLocalServer *qlsServer; QList qlClients; protected slots: void disconnected(); void error(QLocalSocket::LocalSocketError); void newConnection(); public: Overlay(); ~Overlay() Q_DECL_OVERRIDE; bool isActive() const; void verifyTexture(ClientUser *cp, bool allowupdate = true); void requestTexture(ClientUser *); public slots: void updateOverlay(); void setActive(bool act); void toggleShow(); void forceSettings(); }; #endif mumble-1.3.4/src/mumble/Log_win.cpp0000664000175000017500000000061314010707273017013 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "Log.h" void Log::postNotification(MsgType mt, const QString &plain) { postQtNotification(mt, plain); } mumble-1.3.4/src/mumble/mumble.rc0000664000175000017500000000252714010707274016527 0ustar builderbuilder// Copyright 2005-2021 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include IDI_ICON1 ICON DISCARDABLE "../../icons/mumble.ico" #ifndef DEBUG #define VER_DEBUG 0L #else #define VER_DEBUG VS_FF_DEBUG #endif #ifdef SNAPSHOT_BUILD #define VER_RELEASE VS_FF_SPECIALBUILD|VS_FF_PRERELEASE #else #define VER_RELEASE 0L #endif VS_VERSION_INFO VERSIONINFO FILEVERSION 1,3,4,0 PRODUCTVERSION 1,3,4,0 FILEFLAGSMASK VS_FFI_FILEFLAGSMASK FILEFLAGS (VER_DEBUG|VER_RELEASE) FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_APP FILESUBTYPE 0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904E4" BEGIN VALUE "CompanyName", "The Mumble Developers" VALUE "FileDescription", "Mumble - Low-latency VoIP client" VALUE "FileVersion", "1.3.4" VALUE "ProductVersion", "1.3.4" VALUE "LegalCopyright", "Copyright (c) 2005-2021 The Mumble Developers" VALUE "OriginalFilename", "mumble.exe" VALUE "ProductName", "Mumble" #ifdef SNAPSHOT_BUILD VALUE "SpecialBuild", "Snapshot development release" #endif END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1252 END END mumble-1.3.4/src/mumble/WebFetch.h0000664000175000017500000001000414010707274016545 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_WEBFETCH_H_ #define MUMBLE_MUMBLE_WEBFETCH_H_ #include #include #include #include class QNetworkReply; /// WebFetch is a utility class to download data from Mumble services. class WebFetch : public QObject { private: Q_OBJECT Q_DISABLE_COPY(WebFetch) protected: QObject *qoObject; const char *cpSlot; QNetworkReply *qnr; QString m_service; QString prefixedServiceHost() const; QString serviceHost() const; WebFetch(QString service, QUrl url, QObject *obj, const char *slot); signals: void fetched(QByteArray data, QUrl url, QMap headers); protected slots: void finished(); public: /// The fetch function downloads the resource specified by the url parameter from the /// Mumble service given in the service parameter. Once the download completes, the /// function invokes the slot specified via the slot parameter. /// /// Only the path part of the url parameter /// is used to construct the final, fully-qualified URL from which the resource is /// downloaded. /// /// By default, the service parameter and the url parameter are combined to create /// a service as follows: /// /// fullyQualifiedURL = https://${service}.mumble.info/${url.path} /// /// When a resource is downloaded from a Mumble service, the service may optionally /// specify a service prefix to use for future requests to all Mumble services. This /// is communicated via the Use-Service-Prefix HTTP header in HTTP responses from /// Mumble services. When this function encounters such a response header, it stores /// the service prefix in the "net/serviceprefix" Mumble setting. If this setting /// is non-empty, the fully-qualified URL is instead constructed as such: /// /// fullyQualifiedURL = https://${serivcePrefixSetting}-${service}.mumble.info/${url.path} /// /// The service prefix must only contain ASCII characters 'A' through 'Z' (upper case) /// or 'a' through 'z (lower case). /// /// @param service The Mumble service name to use for this request. /// /// The service name specified is used to create base URL /// used by the final, fully-qualified URL as follows: /// /// baseURL = https://${service}.mumble.info /// /// If the Mumble setting "net/serviceprefix" is non-empty, /// it will be used as a prefix to the base URL. In this case, /// the base URL will be constructed as follows: /// /// baseURL = https://${servicePrefixSetting}-${service}.mumble.info /// /// @param url The path to the endpoint that the request is targetted at. /// Only the path of the URL will be used. The specified path is /// used in combination with the base URL constructed by the service /// parameter to construct the fully-qualified URL for the HTTP request /// that will be sent by this function. /// The path is used in combination with the base URL from the service /// parameter as follows: /// /// fullyQualifiedURL = ${baseURL}/${url.path} /// /// @param slot A Qt slot of the form fetched(QByteArray data, QUrl url, /// QMap httpHeaders) /// If the download initiated by the function was succesful, the data /// parameter will be a non-null QByteArray. /// If the download failed, the data parameter will be a null QByteArray. static void fetch(const QString &service, const QUrl &url, QObject *obj, const char *slot); }; #endif mumble-1.3.4/src/mumble/mumble_da.ts0000664000175000017500000140003014010707274017205 0ustar builderbuilder ACLEditor Deny Nægt Allow Tillad Allow %1 Tillad %1 Deny %1 Nægt %1 Mumble - Add channel Mumble - Tilføj kanal Default server value Failed: Invalid channel Mislykkedes: Ugyldig kanal Mumble - Edit %1 Mumble - Redigér %1 ID: %1 ID: %1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Dette tildeler %1-privilegiet. Hvis et privilegium både er tilladt og nægtet, er det nægtet.<br />%2 Channel must have a name Kanalen skal have et navn This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Dette ophæver %1-privilegiet. Hvis et privilegium både er tilladt og nægtet, er det nægtet.<br />%2 Dialog Dialogboks Name Navn Enter the channel name here. Skriv kanalnavnet hér. Description Beskrivelse Password Adgangskode Enter the channel password here. Skriv adgangskoden for kanalen hér. Check to create a temporary channel. Markér for at oprette en midlertidig kanal. Temporary Midlertidig <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Placering</b><br/> Denne værdi gør dig i stand til at ændre måden Mumble arrangerer kanalerne i træet. En kanal med en højere <i>placerings</i>-værdi vil altid blive placeret under én med en lavere værdi og omvendt. Hvis <i>placerings</i>-værdien er ens for to kanaler, vil de blive sorteres alfabetisk efter deres navn. Position Placering &Groups &Grupper Group Gruppe List of groups Liste over grupper Remove selected group Fjern den valgte gruppe Remove Fjern Inherit group members from parent Arv gruppemedlemmer fra forælder Inherit Arv Make group inheritable to sub-channels Lav gruppe arvelig for underkanaler Inheritable Arvelig Group was inherited from parent channel Gruppe var arvet fra forælderkanal Inherited Arvet Members Medlemmer Add Tilføj Add member to group Tilføj medlem til gruppe Remove member from group Fjern medlem fra gruppe &ACL &ACL Active ACLs Aktive ACLs List of entries Liste over indtastninger Inherit ACL of parent? Arv ACL fra forælder? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. Dette indstiller hvorvidt ACL fra forælderkanaler anvendes på denne kanal. Kun indtastninger i forælderkanaler, der er markeret som "Anvend på underkanaler", vil blive arvet. Inherit ACLs Arv ACLs Move entry up Flyt regel op This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. Dette flytter reglen op ad listen. Eftersom regler bliver evalueret i rækkefølge, kan dette ændre de faktiske rettigheder for brugere. Du kan ikke flytte en regel op over arvede regler, men hvis du virkelig behøver dette, så skal du gentage den arvede regel. &Up &Op Move entry down Flyt regel ned This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. Dette flytter reglen ned på listen. Eftersom regler bliver evalueret i rækkefølge, kan dette ændre de faktiske rettigheder for brugere. &Down &Ned Add new entry Tilføj ny regel This adds a new entry, initially set with no permissions and applying to all. Dette tilføjer en ny regel, hvori der fra start af ikke er specificeret nogle rettigheder, og som anvendes på alle. &Add &Tilføj Remove entry Fjern regel This removes the currently selected entry. Dette fjerner den nuværende valgte regel. &Remove &Fjern Context Indflydelse Entry should apply to this channel. Entry should apply to this channel Reglen skal anvendes på denne kanal. This makes the entry apply to this channel. Dette gør, så reglen anvendes på denne kanal. Applies to this channel Anvend på denne kanal Entry should apply to sub-channels. Reglen skal anvendes på underkanaler. Add new group Tilføj ny gruppe <b>Add</b><br/> Add a new group. <b>Tilføj</b><br/> Tilføj en ny gruppe. Inherited members Arvede medlemmer Contains the list of members added to the group by this channel. Indeholder listen over brugere tilføjet til gruppen af denne kanal. Contains a list of members whose group membership will not be inherited from the parent channel. Indeholder en liste over brugere hvis gruppemedlemskab ikke vil blive arvet fra forælderkanalen. Contains the list of members inherited by other channels. Indeholder listen over brugere arvet fra andre kanaler. Type in the name of a user you wish to add to the group and click Add. Skriv navnet på en bruger du vil tilføje til gruppen og klik <i>Tilføj</i>. Type in the name of a user you wish to remove from the group and click Add. Skriv navnet på en bruger du vil fjerne fra gruppen og klik <i>Tilføj</i>. Exclude Udelad Excluded members Udeladte medlemmer This makes the entry apply to sub-channels of this channel. Dette gør, så reglen anvendes på underkanaler til denne kanal. Applies to sub-channels Anvend på underkanaler Permissions Tilladelser User/Group Bruger/gruppe Group this entry applies to Gruppen som denne regel anvendes på User ID Bruger ID User this entry applies to Brugere som denne regel gælder for This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. Dette kontrollerer, hvilken bruger reglen anvendes på. Skriv bare brugernavnet og tryk enter for at forespørge serveren for et match. &Properties &Egenskaber <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>Navn</b><br />Skriv kanalnavnet i dette felt. Navnet skal imødekomme de begrænsninger, som serveren, du har forbindelse til, pålægger. <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>Midlertidig</b><br > Hvis denne er markeret, vil kanalen, der oprettes, blive markeret som midlertidig. Dette betyder, at når den sidste bruger forlader kanalen, vil den automatisk blive slettet af serveren. <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>Gruppe</b><br > Disse er alle grupperne, der i øjeblikket gælder for kanalen. For at oprette en ny gruppe skal du bare skrive navnet og trykke enter. <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>Fjern</b><br >Dette fjerner den nuværende valgte gruppe. Hvis gruppen var arvet, vil den ikke blive fjernet fra listen, men alt lokal information om gruppen vil blive slettet. <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>Arv</b><br >Dette arver alle medlemmer i gruppen fra forælderen, hvis gruppen er markeret som <i>arvelig</i> i forælderkanalen. <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>Arvelig</b><br >Dette gør denne gruppe arvelig for underkanaler. Hvis gruppen ikke er arvelig, kan der i underkanaler oprettes en ny gruppe med samme navn. <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>Arvet</b><br >Dette indikerer at gruppen er arvet fra forælderkanalen. Du kan ikke ændre dette flag, det er kun til information. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>Medlemmer</b><br > Denne liste inderholder medlemmer, der er blevet tilføjet til gruppen af den nuværende kanal. Vær opmærksom på at listen ikke inkluderer medlemmer arvet fra højere niveauer i kanaltræet. Disse kan findes i listen <i>Arvede medlemmer</i>. For at forhindre denne liste i at blive arvet til underkanaler, skal du fjerne markeringen <i>Arvelig</i> eller manuelt tilføje medlemmer til listen <i>Udeladte medlemmer</i>. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>Udeladte medlemmer</b><br /> Inderholder en liste over medlemmer hvis gruppemedlemskab ikke vil blive arvet fra forælderkanalen. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. <b>Arvede medlemmer</b><br > Indeholder listen over medlemmer der er arvet af den nuværende kanal. Fjern markeringen af <i>Arv</i> for at forhindre, at der kan arves fra kanaler i højere niveauer. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. Dette kontrollerer hvilken gruppe brugere, som denne regel gælder for.<br />Vær opmærksom på at gruppen bliver evalueret i sammenhæng med kanalen, som reglen er brugt i. Fx giver standard ACL på rod-kanalen <i>Skrive</i>-rettigheder til <i>admin</i>-gruppen. Denne regel, hvis den altså er arvet fra en kanal, vil give en bruger skrive-rettigheder, hvis han tilhører <i>admin</i>-gruppen i den kanal, også selvom brugeren ikke tilhører <i>admin</i>-gruppen i den kanal, hvor den oprindelige ACL er sat.<br />Hvis et gruppenavn starter med et '!', bliver gruppens medlemskab ophævet, og hvis det starter med '~', bliver gruppen evalueret i kanalen, hvor dens ACL er defineret i, i stedet for kanalen hvor dens ACL er aktiv i.<br />Hvis et gruppenavn starter med en '#', bliver det aflæst som et adgangsudtryk. Brugere skal have indtastet dét, der står efter '#', i deres liste over adgangsudtryk for at matche. Dette kan bruges til meget simpel adgangskodebaseret adgang til kanaler, for brugere der ikke er autentificeret.<br />Hvis et gruppenavn starter med '$', vil det kun matche brugere, hvis certifikat-hash matcher dét, der kommer efter '$'.<br />Nogle få specielle foruddefinerede grupper er:<br /><b>all</b> - Alle vil matche.<br /><b>auth</b> - Alle autentificerede brugere vil matche.<br /><b>sub,a,b,c</b> - Brugere der i øjeblikket er i en underkanal med minimum <i>a</i> fælles forældre, og mellem <i>b</i> og <i>c</i> kanaler ned ad rækken. Se webstedet for mere omfattende dokumentation relateret til dette.<br /><b>in</b> - Brugere der i øjeblikket er i kanalen vil matche (en fordel for '<i>sub,0,0,0</i>').<br /><b>out</b> - Brugere uden for kanalen vil matche (en fordel for '<i>!sub,0,0,0</i>').<br />Bemærk at en indtastning gælder for enten en bruger eller en gruppe men aldrig begge. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. <b>Adgangskode</b><br />Dette felt giver dig mulighed for at indstille og ændre adgangskoden for en kanal. Det bruger Mumble's adgangsudtryk-funktion i baggrunden. Brug ACLs og grupper hvis du har brug for mere finjusteret og kraftfuld adgangskontrol. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. Dette viser alle aktive regler for denne kanal. Regler arvet fra forælderkanaler vil vises med kursiv.<br />ACLs bliver evalueret oppefra og ned, hvilket vil sige at prioriteringen forøges, når du rykker en regel ned ad listen. ID of the channel. ID for kanalen Maximum Users Maximum number of users allowed in the channel <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. This is the sort order for the channel. ALSAAudioInput Default ALSA Card Standard ALSA-kort Opening chosen ALSA Input failed: %1 Åbning af valgte ALSA-afspilning mislykkedes: %1 ALSAAudioOutput Default ALSA Card Standard ALSA-kort Opening chosen ALSA Output failed: %1 Åbning af valgte ALSA afspilnings mislykkedes: %1 ASIOConfig %1 (version %2) %1 (version %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz %1 -> %2 prøvebuffer, med %3 prøveopløsning (%4 foretrukken) ved %5 Hz ASIO Initialization failed: %1 ASIO initialisering mislykkedes: %1 Failed to instantiate ASIO driver Instantiering af ASIO-driver mislykkedes ASIO ASIO Device selection Enhedsvalg Device Enhed Device to use for microphone Enhed til brug som mikrofon This chooses what device to query. You still need to actually query the device and select which channels to use. Dette vælger hvilken enhed der skal forespørges. Du behøver stadig at egentlig forespørge enheden og vælge hvilke kanaler der skal bruges. Query selected device Forespørg valgt enhed This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. Dette forespørger den valgte enhed for kanaler. Vær opmærksom på at mange ASIO-drivere er ekstremt fejlfyldte, og at forespørge dem kan foresage et nedbrud af enten programmet eller systemet. &Query &Forespørgsel Configure selected device Konfigurér valgt enhed This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. Dette konfigurerer den valgte enhed. Vær opmærksom på at mange ASIO-drivere er ekstremt fejlfyldte, og at forespørge dem kan foresage et nedbrud af enten programmet eller systemet. &Configure &Konfigurér Capabilities Evner Driver name Drivernavn Buffer size Bufferstørrelse This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. Dette vil konfigurere indspilningskanalerne for ASIO. Vær sikker på at du har valgt mindst én kanal som mikrofon og højtaler. <i>Mikrofon</i> skal være hvor din mikrofon er fastgjort, og <i>højtaler</i> skal være en kanal afprøver '<i>hvad du hører</i>'.<br />For eksempel på Audigy 2 ZS'en ville et godt valg for mikrofon være '<i>Mic L</i>' mens højtaler skal være '<i>Mix L</i>' og '<i>Mix R</i>'. Configure input channels Konfigurér indspilningskanaler Channels Kanaler Microphone Mikrofon <- <- -> -> Unused Ubenyttet Speakers Højtalere ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. Du skal vælge mindst én mikrofon- og én højtalerkilde til at bruge ASIO. Hvis du kun behøver mikrofon-sampling, så brug DirectSound. Opening selected ASIO device failed. No input will be done. Åbning af valgte ASIO-enhed mislykkedes. Ingen indspilning vil blive udført. AboutDialog About Mumble Om Mumble <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble &Om Mumble &License &Licens A&uthors &Third-Party Licenses OK OK AudioInput Interface Grænseflade System System Input method for audio Indspilningsmetode for lyd <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Indspilningsmetoden der skal bruges for lyd.</b><br />Du skal højest sansynligt bruge DirectSound. Device Enhed Input device for audio Indspilningsenhed for lyd <b>This is the input device to use for audio.</b> <b>Dette er indspilningsenheden der skal bruges for lyd.</b> Transmission Transmission &Transmit &Transmittér lyd When to transmit your speech Hvornår din tale skal transmitteres <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. <b>Dette indstiller hvornår tale skal transmitteres.</b><br /><i>Uafbrudt</i> - Hele tiden<br /><i>Stemmeaktivering</i> - Når du taler klart.<br /><i>Tryk-for-snak</i> - Når du holder en genvejsknap nede, som du har indstilt under <i>Genveje</i>. DoublePush Time Dobbelttryk-tid If you press the PTT key twice in this time it will get locked. Hvis du trykker to gange på tryk-for-snak-knappen inden for denne tid, vil den blive låst. <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. <b>Dobbelttryk-tid</b><br />Hvis du trykker tryk-for-snak-knappen to gange i løbet af af det konfigurerede tidsinterval, vil den blive låst. Mumble vil fortsætte med at transmittere lyd, indtil du trykker knappen én gang mere, hvilket låser tryk-for-snak-knappen op igen. Reset audio cue to default Nulstil lydsignal til standard <b>Reset</b><br/>Reset the paths for the files to their default. <b>Nulstil</b><br/>Nulstiller stien for filerne til standard. Browse for on audio file Gennemse for en <i>til</i>-lydfil Browse for off audio file Gennemse for en <i>fra</i>-lydfil Off Fra On Til Preview the audio cues Afprøv lydsignalet Use SNR based speech detection Brug signal-til-støj-baseret stemmeaktivering Signal to Noise Signal til støj <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. <b>Dette indstiller stemmeaktiveringen der skal bruges ved <i>Forstærkning</i></b><br />I denne tilstand, bruges den rå kraft fra indspilningssignalet til at detektere tale. Amplitude Forstærk Voice &Hold Lyd &Hold How long to keep transmitting after silence Hvor lang tid skal der fortsat transmitteres, efter der er blevet stille Silence Below Stilhed under <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. <b>Dette indstiller værdien der udløser stemmeaktivering.</b><br />Brug denne, sammen med lydstatistikker-vinduet, for manuelt at indstille værdierne der udløser stemmeaktivering. Indspilnings-værdierne under "Stilhed under" tæller altid som stilhed. Værdier over "Tale over" tæller altid som stemme. Værdier i mellem vil tælle som stemme, hvis du allerede taler, men vil ikke udløse en ny aktivering. Speech Above Tale over Signal values above this count as voice Signal-værdier over dette tæller som stemme Compression Komprimering &Quality &Kvalitet Quality of compression (peak bandwidth) Kvalitet af komprimering (maksimal båndbredde) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. <b>Dette indstiller kvaliteten af komprimeringen.</b><br />Dette fastslår hvor meget båndbredde Mumble må bruge til udgående lyd. Audio per packet Lyd per pakke How many audio frames to send per packet Hvor mange lyd-frames der skal sendes per pakke <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>Dette indstiller hvor mange lyd-frames der skal puttes i én pakke.</b><br />Forøgelse af dette vil øge forsinkelsen af din stemme, men vil også reducere båndbredde-krav. <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). <b>Dette viser den maksimale udgående båndbredde-brug.</b><br />Dette viser den maksimale mængde båndbredde, der bliver sendt fra din maskine. Lyd-bitrate er den maksimale bitrate (eftersom vi bruger VBR) for alene lyddata. <i>Placering</i> er bitrate'en der bliver brugt til placeringsinformation. <i>Tab</i> er vores framing og IP-pakke-headers (IP og UDP er 75% af denne overhead). Audio Processing Lydbehandling Noise Suppression Støjdæmpning Noise suppression Støjdæmpning <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. <b>Dette indstiller hvor meget støjdæmpning der skal anvendes.</b><br />Jo højere denne værdi er, des mere aggressivt vil stationær støj blive dæmpet. Maximum amplification of input sound Maksimal forstærkning af indspilningslyd <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. <b>Maksimal forstærkning af indspilning</b><br />Mumble normaliserer inspilnings-lydstyrken før komprimering, og dette indstiller hvor meget Mumble må forstærke.<br />Det egentlige niveau bliver hele tiden opdateret baseret på det nuværende talemønster, men det vil aldrig komme over niveauet angivet hér.<br />Hvis <i>Mikrofon lydstyrke</i>-niveauet ligger omkring 100%, skal du sandsynligvis sætte denne til 2.0 eller deromkring, men hvis du som de fleste folk ikke er i stand til at opnå 100%, skal du sætte denne til noget meget højere.<br />Ideelt skal du sætte den til <i>Mikrofon lydstyrke * forstærkning faktor >= 100</i>, selv når du taler dæmpet.<br /><br />Bemærk at det ikke gør noget, hvis du sætter denne til maksimum, men Mumble vil begynde at opsamle andre samtaler, hvis du lader den automatisk tune i dette niveau. Current speech detection chance Nuværende stemmeaktiverings-sansynlighed Cancel echo from speakers Eliminér ekko fra højtalere Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. Aktivering af dette vil eliminere ekko fra din højtalere. <i>Blandet</i> forbruger ikke så meget CPU, men vil kun virke godt, hvis dine højtalere er lige høje og lige langt væk fra din mikrofon. <i>Multikanal</i>-ekkoeliminering giver meget bedre ekkoeliminering, men ved et højere CPU-forbrug. Disabled Deaktiveret <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>Dette indstiller stemmeaktivering til at bruge Signal til støj forhold.</b><br />I denne tilstand, er indspilningen analyseret for noget der minder om rent signal, og klarhed af signalet er brugt til udløse stemmeaktivering. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>Dette viser de nuværende stemmeaktiverings-indstillinger.</b><br />Du kan ændre indstillingerne fra "Indstillinger"-dialogboksen eller fra lydguiden. Signal values below this count as silence Signalværdier under dette tæller som stilhed Maximum bandwidth used for sending audio Maksimal båndbredde ved afsendelse af lyd Use Amplitude based speech detection Brug styke-baseret stemmegenkendelse <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). <b>Dette indstiller hvor længe transmissionen skal fortsætte efter et opfattet stop.</b><br />Indstil denne højere hvis din stemme afbrydes, når du snakker (det ses ved at lydikonet ved siden af dit navn blinker hurtigt). Exclusive mode Eneretstilstand <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>Dette giver eneret over enheden.</b><br />Ingen andre programmer vil være i stand til at bruge enheden. Exclusive Eneret R&eset &Nulstil &Browse... &Gennemse... B&rowse... &Gennemse... &Preview &Afprøv <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. <b>Afprøv</b><br/>Afspiller den nuværende <i>til</i>-lydfil efterfulgt af den nuværende <i>fra</i>-lydfil. Displays an always on top window with a push to talk button in it Vis en vindue der altid er øverst og har en tryk-tryk-for-snak knap i det Display push to talk window Vis tryk-for-snak-vindue Misc Diverse Audible audio cue when starting or stopping to transmit Hørbart lydsignal når transmittering startes og stoppes <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. <b>Dette aktiverer transmissions-lydsignal.</b><br />Aktivering af dette vil give dig en kort biplyd, når du starter og stopper transmittering. Audio cue Lydsignal Gets played when starting to transmit Bliver afspillet når transmittering starter Gets played when stopping to transmit Bliver afspillet når transmittering stopper Hold Time Fasthold-tid Time the microphone stays open after the PTT key is released Tiden hvor mikrofonen forbliver aktiv efter tryk-for-snak-knappen er sluppet Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) Serverens maksimale netværksbåndbredde er kun %1 kbit/s. Lydkvaliteten blev automatisk justeret til %2 kbit/s (%3 ms) Max. Amplification Max forstærkning Idle action Inaktiv handling minutes do minutter udfør nothing intet deafen deaktivér lyd mute deaktivér mikrofon after efter Echo Cancellation Mixed echo cancellation Multichannel echo cancellation The idle action will be reversed upon any key or mouse button input Undo Idle action upon activity Apply RNNoise's noise suppression filter. <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. RNNoise Audio input AudioInputDialog Continuous Uafbrudt Voice Activity Stemmeaktivering Push To Talk Tryk for snak Audio Input Lydindspilning %1 ms %1 ms Off Fra %1 s %1 s %1 kb/s %1 kb/s -%1 dB -%1 dB %1 kbit/s (Audio %2, Position %4, Overhead %3) %1 kbit/s (Lyd %2, Placering %4, Overhead %3) AudioOutput Interface Grænseflade System System Output method for audio Afspilningsmetode for lyd <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Dette er afspilningsmetoden der skal bruges for lyd</b><br />Du skal højest sansynligt bruge DirectSound. Device Enhed Output device for audio Afspilningsenhed for lyd <b>This is the output device to use for audio.</b> <b>Dette er afspilningsenheden der skal bruges for lyd.</b> Positional Audio Placeringsbestemt lyd Audio Output Lydafspilning Default &Jitter Buffer Standard &flimmerbuffer Safety margin for jitter buffer Sikkerhedsmargin for flimmerbuffer <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. <b>Dette indstiller den minimale sikkerhedsmargen for flimmer-bufferen.</b><br />Alt indgående lyd er buffet, og flimmer-bufferen prøver uafbrudt at presse bufferen til det minimale opretholdelige af dit netværk, så forsinkelsen kan være så lille som muligt. Dette indstiller den minimale buffer-størrelse der kan bruges. Hvis starten af sætninger, du hører, er meget flimrende, så forøg denne værdi. Minimum distance to user before sound volume decreases Minimum afstand til bruger før lydstyrken reduceres This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. Dette indstiller den minimale distance for lydberegninger. Lydstyrken fra andre brugeres tale vil ikke formindskes før de er mindst dette væk fra dig. This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. Dette indstiller den maksimale distance for lydberegninger. Hvis længere væk end dette, vil andre brugeres talelydstyrke ikke formindskes yderligere. <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. <b>Dette aktiverer én af loopback-testtilstandene.</b><br /><i>Ingen</i> - Loopback deaktiveret<br /><i>Lokal</i> - Efterlign en lokal server.<br /><i>Server</i> - Anmod om loopback fra server<br />Vær opmærksom på at når loopback er aktiveret, vil ingen andre brugere høre din stemme. Denne indstilling bliver ikke gemt, når programmet afsluttes. Volume Lydstyrke Volume of incoming speech Lydstyrke for indgående tale <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. <b>Dette justere lydstyrken af ingående tale.</b><br />Vær opmærksom på, at hvis du for forøger den endnu mere end 100%, vil lyden blive forvrænget. Output Delay Afspilningsforsinkelse Amount of data to buffer Mængde af data der skal buffers The connected "speakers" are actually headphones The connected "speakers" are actually headphones. De forbundne "højtalere" er rent faktisk et headset Factor for sound volume decrease Faktor for lydstyrke formindskelse Bloom Bloom Factor for sound volume increase Faktor for lydstyrkeforøgelse How much should sound volume increase for sources that are really close? Hvor meget skal lydstyrken forhøjes for kilder der er rigtig tæt på? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. Markering af denne indikerer, at du ikke har højtalere sat til, men bare headset. Dette er vigtigt, eftersom højtalere normalt er foran dig, mens et headset sidder direkte på din højre og venstre side. This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Dette indstiller mængden af data der skal forud-buffers i afspilningsbufferen. Eksperimentér med forskellige værdier og indstil den til det laveste som ikke forårsager flimmer i lyden. Headphones Headset Minimum Distance Minimum distance Maximum Distance Maksimal distance Maximum distance, beyond which speech volume won't decrease Maksimal afstand, hvor tale-lydstyrken udover denne afstand ikke reduceres Minimum Volume Minimal lydstyrke What should the volume be at the maximum distance? Hvad skal lydstyrken være ved maksimal distance? Loopback Test Loopback-test Delay Variance Forsinkelse varians Variance in packet latency Variation i pakkeforsinkelse <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>Dette indstiller pakkeforsinkelses-variationen for loopback-test.</b><br />De fleste lydstier inderholder noget varierende forsinkelse. Dette gør dig i stand til, at indstille den variation for loopback-tilstands-test. Hvis du fx sætter denne til 15ms, vil det svare til et netværk med 20-35ms ping forsinkelse eller 80-95ms forsinkelse. De fleste indenlandske internetforbindelser har en variation på omkring 5ms. Packet Loss Pakketab Packet loss for loopback mode Pakketab for loopback-tilstand <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% <b>Dette indstiller pakketabet for loopback-tilstand.</b><br />Dette vil være forholdet for tabte pakker. Medmindre din udgående båndbredde er maksimeret ud, eller der er noget galt med din netværksforbindelse, vil dette være 0% &Loopback &Loopback Desired loopback mode Ønsket loopback-tilstand Attenuate applications by... Dæmp andre programmer med... Attenuation of other applications during speech Dæmpning af andre programmer når der snakkes <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. <b>Dæmp lydstyrke for andre programmer når der tales</b><br />Mumble giver mulighed for at formindske lydstyrken af andre programmer under indgående og/eller udgående tale. Dette indstillinger dæmpningen af andre programmer, hvis funktionen er aktiveret. If checked Mumble lowers the volume of other applications while other users talk Hvis denne er markeret, vil Mumble dæmpe lydstyrken af andre programmer, når andre brugere snakker <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. <b>Dæmp programmer når andre brugere snakker</b><br />Mumble giver mulighed for at formindske lydstyrken af andre programmer under indgående og/eller udgående tale. Dette får Mumble til at aktivere funktionen, når andre brugere snakker til dig. while other users talk når andre brugere snakker If checked Mumble lowers the volume of other applications while you talk Hvis denne er markeret, vil Mumble dæmpe lydstyrken af andre programmer, når du snakker <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. <b>Dæmp programmer når du snakker</b><br />Mumble giver mulighed for at formindske lydstyrken af andre programmer under indgående og/eller udgående tale. Dette får Mumble til at aktivere funktionen, når du snakker. while you talk når du snakker Exclusive mode, not recommended. Eneretstilstand, anbefales ikke. <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>Dette giver eneret over enheden.</b><br />Ingen andre programmer vil være i stand til at bruge enheden. Exclusive Eneret Priority Speaker Prioriteret taler If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. Hvis denne er markeret, vil Mumble dæmpe lydstyrken af andre brugere, når du snakker, hvis du har status som "Prioriteret taler". <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. <b>Dæmp andre brugere når du snakker som prioriteret taler.</b><br />Mumble understøtter reducering af lydstyrken af andre brugere, når du snakker som <i>Prioriteret taler</i> for at undgå at blive afbrudt. Markering i dette afkrydsningsfelt vil aktivere denne funktion. Attenuate other users while talking as Priority Speaker. Dæmp andre brugere når du snakker som prioriteret taler. Advanced Attenuation Options Avancerede valgmuligheder for dæmpning If checked, Mumble will only attenuate applications that are using the same output source as Mumble Hvis denne er markeret, vil Mumble kun dæmpe programmer der bruger den samme afspilningsenhed som Mumble <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. Only attenuate applications using the same output device If checked, PulseAudio loopback modules will be attenuated <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. Attenuate PulseAudio loopback modules Audio output AudioOutputDialog None Ingen Local Lokal Server Server Audio Output Lydafspilning %1 ms %1 ms %1 % %1 % %1 m %1 m AudioOutputSample Choose sound file Vælg lydfil Invalid sound file Ugyldig lydfil The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. Filen '%1' kan ikke bruges af Mumble. Vælg venligst en fil med et kompatibelt format og kodning. AudioStats >1000 ms >1000ms >1000 ms Audio Statistics Lydstatistikker Input Levels Indspilningsniveau Peak microphone level Maksimalt mikrofonniveau Peak power in last frame Maksimal kraft i sidste frame This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. Dette viser den maksimale kraft i den forrige frame (20 ms), og det er den samme måling som du normalt vil finde vist som "indspilningskraft". Vær venlig at ignorere dette og se i stedet på <b>mikrofonkraft</b>, som er meget mere jævnt og ser bort fra afvigelser. Peak speaker level Maksimalt højtaler niveau This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. Dette viser den maksimale styrke fra højtalere i forrige frame (20 ms). Medmindre du bruger en multi-kanal-sampling metode (såsom ASIO) med konfigurerede højtalerkanaler, vil dette være 0. Hvis du har konfigureret en sådan opsætning, og denne stadig viser 0, mens du afspiller lyd fra andre programmer, virker din opsætning ikke. Peak clean level Maksimalt rent niveau This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. Dette viser den maksimale kraft i den forrige frame (20 ms) efter al behandling. Ideelt set skulle dette være -96 dB, når du ikke snakker. I realiteten vil dette være -60 dB i et lydstudie, og du skulle gerne se noget omkring -20 dB. Når du snakker, burde dette stige til et sted mellem -5 og -10 dB.<br />Hvis du bruger ekkoeliminering, og dette stiger til mere end -15 dB, når du ikke snakker, virker din opsætning ikke, og du vil genere andre brugere med ekko. Signal Analysis Signal analyse Microphone power Mikrofonstyrke How close the current input level is to ideal Hvor tæt det nuværende indspilnings-niveau er på det ideelle This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. Dette viser hvor tæt din nuværende indspilningslydstyrke er på det ideelle. For at justere dit mikrofinniveau skal du åbne dét program, du bruger til at justere din optagelydstyrke, og kigge på værdierne hér, mens du snakker.<br /><b>Snak højt, som om at du er oprevet over at blive nakket af en noob.</b><br />Justér lydstyrken indtil denne værdi er tæt på 100%, men vær sikker på den ikke kommer over. Hvis den kommer, vil din stemme sansynligvis "falde ud", når du snakker, hvilket vil forringe lydkvaliteten. Signal-To-Noise ratio Signal-til-støj forhold Signal-To-Noise ratio from the microphone Signal-til-støj forhold fra mikrofonen This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. Dette er Signal-til-Støj forholdet (SNR) af mikrofonen i den forrige frame (20 ms). Det viser hvor meget tydeligere din stemme er i forhold til støjen.<br />Hvis denne værdi er under 1.0, er der mere støj end stemme i signalet, og så er kvaliteten nedsat.<br />Der er ingen øvre grænse for denne værdi, men forvent ikke at se noget over 40-50 uden at være i et lydstudie. Speech Probability Sandsynlighed for tale Probability of speech Sandsynlighed for tale This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). Dette er sandsynligheden for, at den forrige frame (20 ms) var tale og ikke støj fra omgivelserne.<br />Stemmeaktivitets-transmission afhænger af, at dette er rigtigt. Tricket ved dette er, at midten af en sætning altid bliver detekteret som tale; problemet er pauserne mellem ordene og starten af tale. Det er svært at skelne et suk fra et ord, der starter med 'h'.<br />Hvis dette vises med fed skrift, betyder det, at Mumble i øjeblikket transmittere (hvis du har oprettet forbindelse). Configuration feedback Konfiguration af feedback Current audio bitrate Nuværende lydbitrate Bitrate of last frame Bitrate for sidste frame DoublePush interval Dobbelttryk interval Time between last two Push-To-Talk presses Tid mellem to Tryk-for-snak tryk Speech Detection Stemmeaktivering Current speech detection chance Nuværende stemmegenkendelses-sansynlighed <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>Dette viser de nuværende stemmeaktiverings-indstillinger.</b><br />Du kan skifte indstillingerne i <i>Indstillinger</i>-dialogboksen eller i lydguiden. Signal and noise power spectrum Signal og støj kraftspektrum Power spectrum of input signal and noise estimate Kraftspektrum for indspilningssignal og støjvurdering This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. Dette viser kraftspektrummet af det nuværende indgående signal (rød linje) and den nuværende støjeliminering (udfyldt blå).<br />Alle forstærkninger er ganget med 30 for at vise den interessante del (hvor meget mere signal end støj der er til stede i hvert waveband).<br />Dette er sansynligvis kun interessant, hvis du prøver at finindstille støjforholdende for din mikrofon. Under gode forhold burde der kun være en lillebitte antydning af blå ved bunden. Hvis det blå er mere end halvejs oppe ad grafen, er du i et seriøst støjende miljø. Echo Analysis Ekkoanalyse Weights of the echo canceller Vægt af ekkoeliminering This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. Dette viser vægten af ekkoelimineringen, hvor tiden forøges nedad og svingningstal forøges mod højre.<br />Ideelt set skulle dette være sort, hvilket indikere at der overhovedet ikke er noget ekko. Du skulle være i stand til at se vægten blive opdateret i real time.<br />Læg venligst mærke til at så længe du ikke har noget, der kan være ekko, vil du ikke se ret meget brugtbar data hér. Afspil noget musik og tingene skulle gerne stabilisere sig.<br />Du kan vælge at se den rigtige eller indbildte dele af frekvens-område vægten, eller alternativt den beregnede absolutte værdi og fase. Den mest brugbare af disse, vil være den absolutte værdi, som er amplituden af ekkoet, og som viser dig hvor meget af det udgående signal, der bliver fjernet på dét tidstrin. De andre visningstilstande er mest brugbare for folk, der gerne vil tune ekkoeliminerings-algoritmerne.<br />Bemærk: Hvis hele billedet svinger enormt ved absolut værdi tilstanden, vil det mislykkedes ekkoelimineringen at finde nogen sammenhæng overhovedet mellem de to indspilningskilder (højtalere og mikrofon). Enten har du en meget lang forsinkel på ekkoet, eller også er en af indspilningskilderne konfigureret forkert. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. Dette er lyd-bitrate'en for den seneste komprimerede frame (20 ms) og vil som sådan hoppe op og ned samtidig med, at VBR justerer kvaliteten. Den maksimale bitrate kan blive justeret i dialogboksen "Indstillinger". AudioWizard Audio Tuning Wizard Lydjusteringsguide Introduction Introduktion Welcome to the Mumble Audio Wizard Velkommen til Mumble lydguide Finished Færdig Enjoy using Mumble Nyd at bruge Mumble Device selection Enhedsvalg Selecting the input and output device to use with Mumble. Vælg indspilnings- og afspilningsenheden der skal bruges med Mumble. This is the device your microphone is connected to. Dette er enheden din mikrofon er forbundet til. System System Input method for audio Indspilningsmetode for lyd <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Indspilningsmetoden der skal bruges for lyd.</b><br />Du skal højest sansynligt bruge DirectSound. Device Enhed Input device to use Indspilningsenhed <b>Selects which sound card to use for audio input.</b> <b>Vælger hvilket lydkort der skal bruges for lydindspilning.</b> Cancel echo from headset or speakers Eliminér ekko fra headset eller højtalere Use echo cancellation Brug ekkoeliminering This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. Dette aktiverer ekkoeliminering for udgående lyd, hvilket både hjælper for højtalere og headsets. This is the device your speakers or headphones are connected to. Dette er enheden dine højtalere eller dit headset er forbundet til. Output method for audio Afspilningsmetode for lyd <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Dette er afspilningsmetoden der skal bruges for lyd</b><br />Du skal højest sansynligt bruge DirectSound. Output device to use Afspilningsenhed <b>Selects which sound card to use for audio Output.</b> <b>Vælg hvilket lydkort der skal bruges til lydafspilnings.</b> Enable positional audio Aktivér placeringsbestemt lyd Allows positioning of sound Allows positioning of sound. Tillad placering af lyd <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> <p> Dette er lydindstillings-guiden for Mumble. Dette vil hjælpe dig med at indstille indspilningsniveauerne for dit lydkort korrekt, og også indstille de korrekte parametre for lydbehandling i Mumble. </p> <p> Vær opmærksom på at så længe denne guide er aktiv, vil lyden blive gentaget lokalt for at gøre dig i stand til at lytte til det, og ingen lyd vil blive sendt til serveren. </p> Input Device Indspilningsenhed Output Device Afspilningsenhed This allows Mumble to use positional audio to place voices. Dette tillader Mumble at bruge placeringsbestemt lyd til at placere stemmer. <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> <p> For at opnå minimal forsinkelse, er det vigtigt at buffer så lidt lyd på lydkortet som muligt. Mange lydkort opgives imidlertid til at kunne bruge en meget mindre buffer, end hvad de rent faktisk kan arbejde ved, så den eneste måde at indstille denne værdi er ved at prøve sig frem. </p> <p> Du skulle hér høre et stemme-eksempel. Flyt skyderen neden for til den laveste værdi, som <b>ikke giver</b> nogen som helst afbrydelser eller flimmer i lyden. Vær opmærksom på at lokalt ekko er deaktiveret under denne test. </p> Amount of data to buffer Mængde af data der skal buffers This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Dette indstiller mængden af data der skal forud-buffers i afspilnings-bufferen. Eksperimentér med forskellige værdier og sæt den til den laveste, der ikke giver flimmer i lyden. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> <p> Åben dit lydkontrolpanel og gå ind under indstillingerne for optagelse. Vær sikker på at mikrofonen er valgt som det aktive input og med maksimal optagelydstyrke. Hvis der er mulighed for at aktivere "Mikrofon boost", så vær sikker på at den er markeret. </p> <p> Tal højlydt som når du er irriteret og ophidset. Formindsk nu lydstyrken i lydkontrolpanelet indtil baren nedenunder forbliver som højt som muligt i det blå og grønne, men <b>ikke</b> i det røde område når du snakker. </p> Positional Audio Placeringsbestemt lyd Adjusting attenuation of positional audio. Justér reducering af placeringsbestemt lyd. <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> <p>Mumble understøtter placeringsbestemt lyd i nogle spil, og dette vil placere andre brugeres stemme i forhold til deres placering i spillet. Afhængig af deres placering vil lydstyrken af deres stemme blive ændret mellem højtalerne, for at simulere retningen og afstanden til brugerne. Denne slags placering afhænger af at din højtalerkonfiguration er korrekt i dit operativsystem, så derfor bliver der hér udført en test. </p> <p> Grafen nedenunder viser placeringen af <font color="red">dig</font>, <font color="yellow">højtalere</font> og en <font color="green">bevægende lydkilde</font>, som hvis det er set fra oven. Du skulle gerne kunne høre lyden bevæge sig mellem kanalerne. </p> Use headphones instead of speakers Brug headset i stedet for højtalere <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> <p> Tillykke. Du skulle nu være klar til at nyde bedre lydoplevelse med Mumble. </p> <p> Mumble er under konstant udvikling, og udviklerteamet vil gerne fokusere på funktioner, der er til gavn for flest brugere. Til at hjælpe med dette formål understøtter Mumble mulighed for at indsende anonymse statistikker om din konfiguration til udviklerne. Disse statistikker er en væsentlig forudsætning for fremtidig udvikling, og sikrer også at funktionerne du bruger ikke mangler. </p> Use headphones Bruge headset This ignores the OS speaker configuration and configures the positioning for headphones instead. Dette ignorerer operativsystem-højtalerkonfigurationen og konfigurerer placeringen af headset i stedet. Volume tuning Lydstyrkejustering Tuning microphone hardware volume to optimal settings. Justér hardware-lydstyrken for mikrofonen til de optimale indstillinger. Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. Tal nu dæmpet som du ville gøre sent om natten, hvor du ikke vil forstyrre nogen. Justér skyderen nedenunder, så baren bevæger sig ind i det grønne område, når du snakker, men forbliver i det blå område når du er stille. Voice Activity Detection Stemmeaktivering Letting Mumble figure out when you're talking and when you're silent. Lader Mumble finde ud af hvornår du taler, og hvornår du er stille. This will help Mumble figure out when you are talking. The first step is selecting which data value to use. Dette hjælper Mumble med at finde ud af hvornår du snakker. Det første du skal gøre er at vælge hvilke dataværdier der skal bruges. Raw amplitude from input Rå styrke af input Signal-To-Noise ratio Signal-til-støj forhold Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Dernæst skal du justere følgende skyder. De første få udtalelser, du siger, burde ende i det grønne område (definitivt tale). Når du snakker, burde du forblive inden for det gule (kan være tale), og når du ikke snakker, burde alt være i det røde (definitivt ikke tale). Device tuning Enhedsjustering Changing hardware output delays to their minimum value. Indstil hardware-afspilningsforsinkelse til den mindst mulige værdi. Submit anonymous statistics to the Mumble project Indsend anonyme statistikker til Mumble-projektet Push To Talk: Tryk-for-snak: Quality & Notifications Kvalitet & notifikationer Adjust quality and notification settings. Justér kvalitet og notifikationsindstillinger. Quality settings Kvalitetsindstillinger Low Lav Balanced Balanceret Notification settings Notifikationsindstillinger Use Text-To-Speech to read notifications and messages to you. Brug Tekst-til-tale til at læse notifikationer og beskeder for dig. Disable Text-To-Speech and use sounds instead. Deaktivér Tekst-til-tale og brug lyde i stedet. %1 ms %1 ms Enables attenuation of other applications while users talk to you Aktiverer dæmpning af andre programmer når brugere snakker til dig Attenuate applications while other users talk Dæmp programmer når andre brugere snakker High Høj Custom Brugerdefineret You already set a customized quality configuration in Mumble. Select this setting to keep it. Du har allerede indstillet en brugerdefineret opsætning af kvalitet i Mumble. Vælg denne indstilling for at beholde den. Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. Aktiverer dæmpning af andre programmer mens brugere snakker til dig. Det betyder at så snart nogen begynder at snakke til dig i Mumble, vil lyden af alle andre programmer (så som musikafspillere) blive dæmpet så du kan høre dem bedre. Apply some high contrast optimizations for visually impaired users Anvend nogle høje kontrast optimeringer for brugere med nedsat syn Use high contrast graphics Brug grafik med høj kontrast Keep custom Text-To-Speech settings. Behold brugerdefineret Tekst-til-tale indstillinger. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode <p> Åben dit lydkontrolpanel og gå ind under indstillingerne for optagelse. Vær sikker på at mikrofonen er valgt som det aktive input og med maksimal optagelydstyrke. Hvis der er mulighed for at aktivere "Mikrofon boost", så vær sikker på at den er slået til. </p> <p> Tal højlydt som når du er irriteret og ophidset. Formindsk nu lydstyrken i lydkontrolpanelet indtil baren nedenunder forbliver så højt som muligt i det blå og grønne, men <b>ikke</b> i det ternede område når du snakker. </p> Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode Tal nu dæmpet som du ville gøre sent om natten, hvor du ikke vil forstyrre nogen. Justér skyderen nedenunder, så baren bevæger sig ind i det tomme område, når du snakker, men forbliver i det stribede område, når du er stille. Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode Dernæst skal du justere følgende skyder. De første få udtalelser, du siger, burde ende i det tomme område (definitivt tale). Når du snakker, burde du forblive inden for det stribede (kan være tale), og når du ikke snakker, burde alt være i det ternede (definitivt ikke tale). In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) Med denne konfiguration bruger Mumble en <b>lav mængde båndbredde</b>. Dette vil uundgåeligt resultere i høj forsinkelse og dårlig kvalitet. Vælg kun dette, hvis din forbindelse ikke kan håndtere de andre indstillinger. (16kbit/s, 60ms per pakke) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) Dette er den <b>anbefalede standard</b>-konfiguration. Denne giver en god balance mellem kvalitet, forsinkelse og båndbredde-forbrug. (40kbit/s, 20ms per pakke) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) Det anbefales kun at bruge denne konfiguration i opsætninger, hvor båndbredde ikke er noget problem, fx til LAN. Denne giver den mindst mulige forsinkelse, som Mumble understøtter, og <b>høj kvalitet</b>. (72kbit/s, 10ms per pakke) BanEditor Mumble - Edit Bans Mumble - Redigér bandlysninger &Address &Adresse &Mask &Maske Reason Begrundelse Start Start End Slut User Bruger Hash Hash &Add &Tilføj &Update &Opdatér &Remove &Fjern Ban List Bandlysningsliste Search field Søgefelt This is the search field. Use it to find bans that have this username set in the username field. Dette er søgefeltet. Anvend det til at finde bandlysninger der har dette brugernavn sat i brugernavnsfeltet. Who are you looking for? Hvem leder du efter? No nickname Intet kaldenavn IP address IP-adresse No IP address Ingen IP-adresse Reason for the ban Begrundelse for bandlysningen No reason Ingen begrundelse Ban end date Bandlysning slutdato Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). Bandlysning slutdato. Hvis du sætter den samme dato som start og slut, vil bandlysningen være permanent (den vil ikke udløbe). Certificate hash Certifikat-hash No certificate hash Ingen certifikat-hash Banned users Bandlyste brugere This is a list with banned users. Dette er en liste med bandlyste brugere. Use this button if you want to add a new ban. Brug denne knap hvis du vil tilføje en ny bandlysning. Use this button if you want to update ban information. Brug denne knap hvis du vil opdatere bandlysningsinformation. Use this button if you want to remove user from the ban list. Brug denne knap hvis du vil fjerne brugere fra bandlysningslisten. Clear all fields Ryd alle felter This button clears all fields. Use it if you want to add a new ban. Denne knap rydder alle felter. Brug den hvis du vil tilføje en ny bandlysning. Clear Ryd Ban List - %n Ban(s) Bandlysningsliste - %n bandlysning(er)Bandlysningsliste - %n bandlysning(er) CertView Name Navn Email Email Issuer Udsteder Expiry Date Udløbsdato (none) (ingen) Self-signed Selv-signeret CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. Ikke i stand til at validere emailen.<br />Skriv en gyldig (eller tom) email for at fortsætte. There was an error generating your certificate.<br />Please try again. There opstod en fejl under genereringen af dit certifikat<br />Prøv venligst igen. Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. Dit certifikat og nøgle kunne ikke blive eksporteres til PKCS#12-format. Der kan være en fejl i dit certifikat. The file could not be opened for writing. Please use another file. Denne fil kunne ikke åbnes for skrivning. Brug venligst en anden fil. The file's permissions could not be set. No certificate and key has been written. Please use another file. Filens tilladelser kunne ikke indstilles. Certifikat og nøgle er ikke blevet nedskrevet. Benyt venligst en anden fil. The file could not be written successfully. Please use another file. Denne fil kunne der ikke skrives succesfuldt til. Brug venligst en anden fil. The file could not be opened for reading. Please use another file. Denne fil kunne ikke åbnes for læsning. Brug venligst en anden fil. The file is empty or could not be read. Please use another file. Denne fil er tom eller kunne ikke læses. Brug venligst en anden fil. The file did not contain a valid certificate and key. Please use another file. Filen indeholdt ikke et gyldigt certifikat og nøgle. Brug venligst en anden fil. Select file to export certificate to Vælg filen certifikatet skal eksporteres til Select file to import certificate from Vælg filen der skal importeres certifikat fra Unable to import. Missing password or incompatible file type. <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. <b>Certifikat Udløb:</b> Dit certifikat er ved at udløbe. Du skal fornye det, ellers vil du ikke længere være i stand til at forbinde til servere du registreret på. Certificates Certificate Management Certifikat administration Certificate Authentication Certifikat autentificering Authenticating to servers without using passwords Autentificér til servere uden at bruge adgangskoder Current certificate Nuværende certifikat This is the certificate Mumble currently uses. Dette er certifikatet Mumble i øjeblikket bruger. Current Certificate Nuværende certifikat Create a new certificate Opret et nyt certifikat This will create a new certificate. Dette vil oprette et nyt certifikat. Import certificate from file Importér certifikat fra fil This will import a certificate from file. Dette vil importere et certifikat fra en fil. Import a certificate Importér et certifikat Export Certificate Eksportér certifikat This will export a certificate to file. Dette vil eksportere et certifikat til en fil. Export current certificate Exportér nuværende certifikat Import Certificate Importér certifikat PKCS #12 Certificate import PKCS #12 Certifikatimportering <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble kan importere certifikater gemt i PKCS #12-formatet. Dette er formatet der bliver brugt når man eksporterer en nøgle fra Mumble, og også når man eksportere nøgler fra Firefox, Internet Explorer, Opera osv.</p><p>Hvis filen er beskyttet af en adgangskode, skal du bruge adgangskoden for at importere certifikatet.</p> Import from Importér fra Filename to import from Filnavn der skal importeres fra This is the filename you wish to import a certificate from. Dette er filnavnet du ønsker at importere et certifikat fra. Select file to import from Vælg fil at importere fra This opens a file selection dialog to choose a file to import a certificate from. Dette åbner en filvalgs-dialogboks for at vælge en fil der skal importeres et certifikat fra. Open... Åben... Password Adgangskode Password for PKCS#12 file Adgangskode for PKCS#12 fil This is the password for the PKCS#12 file containing your certificate. Dette er adgangskoden for PKCS#12-filen der indeholder dit certifikat. Certificate to import Certifikat der skal importeres This is the certificate you are importing. Dette er certifikatet du importerer. Certificate Details Certifikatdetaljer Replace Certificate Erstat certifikat Replace existing certificate with new certificate? Erstat eksisterende certifikat med nyt certifikat? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> <p>Du har allerede gemt et certifikat i Mumble, og du er ved at erstatte det.</p> <p>Hvis du er ved at opgradere til et certifikat udstedt af en betroet CA og emailadressen matcher dit nuværende certifikat, er dette fuldt ud sikker, og servere, du forbinder til, vil automatisk genkende det stærke certifikat med din emailadresse. </p> <p>Hvis ovenstående ikke er tilfældet, vil du ikke længere blive genkendt af nogen server, som du tidligere er blevet autentificeret på. Hvis du ikke er blevet registreret på nogen server endnu, skal du ikke bekymre dig. </p> <p> Er du sikker på du vil erstatte dit certifikat? </p> This is the certificate Mumble currently uses. It will be replaced. Dette er certifikatet Mumble i øjeblikket bruger. Det vil blive erstattet. New certificate Nyt certifikat This is the new certificate that will replace the old one. Dette er det nye certifikat som vil erstatte det gamle. New Certificate Nyt certifikat Make a backup of your certificate Lav en backup af dit certifikat Export to Eksportér til Filename to export to Filnavn der skal eksporteres til This is the filename you wish to export a certificate to. Dette er filnavnet du ønsker at eksportere et certifikat til. Save As... Gem som... This is the certificate Mumble currently uses. It will be exported. Dette er certifikatet Mumble i øjeblikket bruger. Det vil blive eksporteret. Generate a new certificate for strong authentication Generér et nyt certifikat til stærk autentificering <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> <p>Mumble vil nu generere et stærkt certifikat, der kan bruges til at autentificere med servere.</p><p>Hvis du ønsker, kan du tilføje yderligere information, som skal gemmes i certifikatet, hvilket vil blive sendt til servere, når du opretter forbindelse. Hvis du tilføjer en gyldig emailadresse, kan du opgradere til et CA-udstedt email-certifikat senere, som giver stærk identifikation.</p> Name Navn Email Email Your email address (e.g. johndoe@mumble.info) Din emailadresse (fx johndoe@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. Dette er din emailadresse. Det anbefales kraftigt at opgive en gyldig emailadresse, eftersom dette vil gøre dig i stand til at opgradere til et stærkt certifikat uden autenticiferingsproblemer. Your name (e.g. John Doe) Dit navn (fx John Doe) This is your name, and will be filled out in the certificate. This field is entirely optional. Dette er dit navn, og vil blive udfyldt i dit certifikat. Dette felt er fuldstændigt valgfrit. Finish Færdig Certificate-based authentication is ready for use Certifikat-baseret autentificering er klar til brug Enjoy using Mumble with strong authentication. Nyd at brug Mumble med stærk autentificering. Automatic certificate creation Automatisk oprettelse af certifikat <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>Hvis du nogensinde mister dit nuværende certifikat, hvilket vil ske, hvis din computer udsættes for et hardware-nedbrud, eller hvis du geninstallerer dit system, vil du ikke længere være i stand til at autentificere på nogen server, som du er registreret på. Det er derfor <b>påkrævet</b>, at du laver en backup af dit certifikat. Vi anbefaler dig kraftigt at gemme denne backup på et flytbart lager, fx en USB-nøgle.</p> <p>Vær opmærksom på at denne fil ikke vil blive krypteret, og hvis nogen får adgang til den, vil de være i stand til at udgive sig for at være dig, så pas godt på den.</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> ChanACL None Ingen Traverse Gennemse Enter Gå ind i Speak Tal Mute/Deafen Deaktivér mikrofon/lyd Make channel Lav kanal Make temporary Lav midlertidig Link channel Sammenkæd kanal This represents no privileges. Dette repræsenterer ingen privilegier. This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. Dette repræsenterer total adgang til kanalen, inklusiv muligheden for at ændre grupper og ACL-information. Dette privilegie indebærer alle andre privilegier. This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. Dette repræsenterer rettigheden til at gennemse kanalen. Hvis en bruger er nægtet dette privilegie, vil brugeren ikke være i stand til at tilgå denne kanal og nogen underkanaler på nogen måde usanset andre rettigheder i underkanalerne. This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. Dette repræsenterer rettigheden til at gå ind i kanalen. Hvis du har en hierarkisk-kanalstruktur, vil du måske have gavn af at give alle <i>Gennemse</i>, men begrænse <i>Gå ind i</i> for rod-kanalen i hierarkiet. This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. Dette repræsenterer rettigheden til at tale i en kanal. Serveren vil deaktivere mikrofonen for brugere uden dette privilegie, og de vil være ude af stand til at snakke, indtil nogen med de fornødne privilegier aktiverer deres mikrofon igen. This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. Dette repræsenterer rettigheden til at hviske til denne kanal udefra. Dette virker præcis ligesom <i>Tal</i>-privilegiet, men gælder for tale der bliver sendt ved hjælp af hviske-knappen. Dette kan bruges til at tale til et hierarki af kanaler uden at sammenkæde dem. This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. Dette repræsenterer rettigheden til at deaktivere andre brugeres lyd og mikrofon. Når en brugers mikrofon først er blevet deaktiveret, vil brugeren være ude af stand til at snakke, indtil nogen med de fornødne privilegier aktiverer brugerens mikrofon igen, eller hvis brugeren opretter forbindelse til serveren igen. This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. Dette repræsenterer rettigheden til at flytte en bruger til en anden kanal eller kicke brugeren fra serveren. For rent faktisk at flytte brugeren, skal brugeren der flytter den anden bruger have flyt-privilegiet i destinationskanalen, eller brugeren, der bliver flyttet, skal have rettigheder til at gå ind i destinationskanalen. Brugere med dette privilegium kan flytte brugere ind i kanaler, som brugeren, der bliver flyttet, normalt ikke har rettigheder til at gå ind i. This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. Dette repræsenterer rettigheden til at lave underkanaler. Brugeren, der laver underkanaler, vil blive tilføjet til admin-gruppen i underkanalen. This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. Dette repræsenterer rettigheden til at lave en midlertidig underkanal. Brugeren, der laver underkanaler, vil blive tilføjet til admin-gruppen i underkanalen. Midlertidige kanaler er ikke gemt og forsvinder, når den sidste bruger forlader kanelen. This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. Dette repræsenterer rettigheden til at sammenkæde kanaler. Brugere i sammenkædede kanaler kan høre hinanden, så længe den snakkende bruger har <i>tale</i>-privilegiet i kanalen med lytterne. Du skal have sammenkæd-privilegiet i begge kanaler for at oprette en sammenkædning, men kun i én af kanalerne for at fjerne sammenkædningen. This represents the permission to write text messages to other users in this channel. Dette repræsenterer rettigheden til at skrive tekstbeskeder til andre brugere i denne kanal. This represents the permission to forcibly remove users from the server. Dette repræsenterer rettigheden til at tvangsfjerne brugere fra serveren. This represents the permission to permanently remove users from the server. Dette repræsenterer rettigheden til permanent at fjerne brugere fra serveren. This represents the permission to register and unregister users on the server. Dette repræsenterer rettigheden til at registrere og fjerne registreringen af brugere på serveren. This represents the permission to register oneself on the server. Dette repræsenterer rettigheden til at registrere sig selv på serveren. Whisper Hvisk Move Flyt Text message Tekstbeskeder Kick Kick Ban Bandlys Register User Registrér bruger Register Self Registrér selv Write ACL Skriv ACL ChatbarTextEdit Paste and &Send Paste and send &Indsæt og send <center>Type chat message here</center> <center>Skriv chatbesked hér</center> ClientUser Friend Ven Authenticated Autentificeret Priority speaker Prioriteret taler Recording Optager Muted (server) Mikrofon deaktiveret (server) Deafened (server) Lyd deaktiveret (server) Local Ignore (Text messages) Ignorér lokalt (tekstbeskeder) Local Mute Lokal deaktivering af mikrofon Muted (self) Mikrofon deaktiveret (selv) Deafened (self) Lyd deaktiveret (selv) ConfigDialog Accept changes Acceptér ændringer This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. Denne knap vil anvende nuværende indstillinger og vende tilbage til programmet.<br />Indstillingerne vil blive gemt, når du forlader programmet. Reject changes Forkast ændringer This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. Denne knap vil forkaste alle ændringer og vende tilbage til programmet.<br />Indstillingerne vil blive sat til deres tidligere positioner. Apply changes Anvend ændringer This button will immediately apply all changes. Denne knap vil øjeblikkeligt anvende alle ændringer. Undo changes for current page Fortryd ændringer på nuværende side This button will revert any changes done on the current page to the most recent applied settings. Denne knap vil genskabe alle tidligere anvendte indstillinger for den nuværende side. Restore defaults for current page Genskab standardindstillinger for nuværende side This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. Denne knap vil genskabe indstillingerne for den nuværende side til deres oprindelige standardindstilling. Der vil ikke blive ændret på andre sider.<br />For at genskabe alle standardindstillinger skal du bruge denne knap på hver enkelt side. Mumble Configuration Mumble konfiguration ConnectDialog Connecting to %1 Opretter forbindelse til %1 Enter username Skriv brugernavn Adding host %1 Tilføjer vært %1 Servername Servernavn Hostname Værtsnavn Bonjour name Bonjour navn Port Port Addresses Adresser Website Websted Packet loss Pakketab Ping (80%) Ping (80%) %1 ms %1 ms Ping (95%) Ping (95%) Bandwidth Båndbredde %1 kbit/s %1 kbit/s &Connect &Opret forbindelse &Filters &Filtre Unknown Users Brugere Version Version Failed to fetch server list Hentning af serverliste mislykkedes Mumble Server Connect Mumble serverforbindelse Ping Ping Remove from Favorites Fjern fra favoritter Add custom server Tilføj brugerdefineret server Show all servers that respond to ping Vis alle servere der besvare ping Show all servers with users Vis alle servere med brugere Show all servers Vis alle servere &Copy &Kopiér Copy favorite link to clipboard Kopiér favorit link til udklipsholder &Paste &Indsæt Paste favorite from clipboard Indsæt favorit fra udklipsholder &Edit... &Redigér... &Add New... &Tilføj ny... Add to &Favorites Tilføj til &favoritter Open &Webpage Åben &websted Show &Reachable Vis &opnåelige Show &Populated Vis &befolkede Show &All Vis &alle ConnectDialogEdit Edit Server Redigér server Name of the server Navn på serveren A&ddress &Adresse Internet address of the server. Internet address of the server. Internetadresse for serveren. <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Addresse</b><br/> Internetadressen for serveren. Dette kan være et normalt værtsnavn, en IPv4/IPv6-adresse eller en Bonjour-tjeneste identifikator. Bonjour-tjeneste identifikatorer skal have et '@' foran for at blive genkendt af Mumble. &Port &Port Port on which the server is listening Port som serveren lytter på <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. <b>Port</b><br/> Port som serveren lytter på. Hvis serveren er opdaget af Bonjour-tjeneste finderen, vil dette felt blive ignoreret. &Username &Brugernavn Username to send to the server Brugernavn der skal sendes til serveren <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. <b>Brugernavn</b><br/> Brugernavn der skal sendes til serveren. Vær opmærksom på at serveren kan have restriktioner, for hvordan et brugernavn må se ud. Desuden kan dit brugernavn allerede være taget af en anden bruger. Label Etikette Add Server Tilføj server You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 Password Adgangskode Password to send to the server Adgangskoden der bruges til serveren <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. <b>Adgangskode</b><br/> Adgangskoden der bruges til serveren, når der oprettes forbindelse. Denne adgangskode er påkrævet, når man opretter forbindelse som <i>SuperUser</i> eller til en server, der bruger adgangskode-autentificering. Hvis adgangskoden ikke indtastes hér, vil den blive forespurgt, når der oprettes forbindelse. Show password Vis adgangskode <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. <b>Etikette</b><br/> Etikette for serveren. Dette er, hvad serveren vil blive navngivet som i din serverliste og kan frit vælges. Local server label Etikette for lokal server 127.0.0.1 127.0.0.1 64738 64738 Your username Dit brugernavn Your password Din adgangskode &Fill CoreAudioSystem Default Device Standardenhed CrashReporter Mumble Crash Report Mumble nedbrudsrapport <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> <p><b>Vi undskylder mange gange, men det ser ud som om Mumble gik ned. Vil du sende en nedbrudsrapport til udviklerne af Mumble?</b></p><p>Nedbrudsrapporten indeholder en delvis kopi af Mumbles hukommelse på det tidspunkt det gik ned, og dette kan hjælpe udviklerne til at løse problemet.</p> Email address (optional) Email-adresse (valgfri) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash Skriv venligst i korte træk, på engelsk, hvad du gjorde da Mumble gik ned Send Report Send rapport Don't send report Send ikke rapport Crash upload successful Nedbrudsrapport vellykket uploadet Thank you for helping make Mumble better! Tak fordi du hjælper med at gøre Mumble bedre! Crash upload failed Det mislykkedes at uploade nedbrudsrapporten We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. Vi undeskylder mange gange, men det ser ud som om uploading af nedbrudsrapporten mislykkedes med fejlen %1 %2. Vær venlig at informér en udvikler. This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 Det her er ikke sjovt, for der er tilsyneladende en fejl i nedbrudsrapporterings-koden, og rapporten kunne derfor ikke uploades. Du må gerne informere en udvikler om fejlen %1 Uploading crash report Uploader nedbrudsrapport Abort upload Afbryd upload DXAudioInput Default DirectSound Voice Input Standard DirectSounds stemmeindspilning Opening chosen DirectSound Input device failed. No microphone capture will be done. Åbning af valgte DirectSound indspilningsenhed mislykkedes. Ingen mikrofonopfangelse vil blive udført. Opening chosen DirectSound Input failed. Default device will be used. Åbning af valgte DirectSound indspilning mislykkedes. Standardenheden vil blive brugt. Lost DirectSound input device. Mistede DirectSound indspilningsenhed. DXAudioOutput Default DirectSound Voice Output Standard DirectSound lydafspilning Opening chosen DirectSound Output failed. Default device will be used. Åbning af valgte DirectSound afspilnings mislykkedes. Standardenhed vil blive brugt. Lost DirectSound output device. Mistede DirectSound afspilningsenhed. Opening chosen DirectSound Output failed. No audio will be heard. Åbning af valgte DirectSounds afspilnings mislykkedes. Ingen lyd vil kunne høres. Database Mumble failed to initialize a database in any of the possible locations. Det mislykkedes Mumble at initialisere en database i nogen som helst mulige placeringer. The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. Databasen '%1' er kun læsbar (read-only). Mumble kan ikke gemme server-indstillinger (fx SSL-certifikater), før du har fikset dette problem. DeveloperConsole Developer Console DockTitleBar Drag here Træk hér GlobalShortcut Shortcuts Genveje List of configured shortcuts Liste over konfigurerede genveje Function Funktion Data Data Shortcut Genvej Suppress Eneret Add new shortcut Tilføj ny genvej This will add a new global shortcut Dette vil tilføje en ny global genvej &Add &Tilføj Remove selected shortcut Fjern valgte genvej This will permanently remove a selected shortcut. Dette vil permanent fjerne en valgt genvej. &Remove &Fjern <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> <html><head/><body><p>Mumble kan på nuværende tidspunkt kun bruge knapper på musen og tastatur-modifikationsknapper (Alt, Ctrl, Cmd, etc.) som globale genveje.</p><p>Hvis du ønsker større fleksibilitet, kan du aktivere <span style=" font-style:italic;">Adgang for hjælpemiddelenheder</span> i systemets tilgængelighedspræferencer. Vær imidlertid opmærksom på, at denne ændring også potentielt tillader ondsindede programmer, at læse hvad der blivet skrevet på tastaturet.</p></body></html> Open Accessibility Preferences Åben tilgængelighedspræferencer Skip Spring over Enable Global Shortcuts Aktivér globale genveje <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. Additional Shortcut Engines <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. Enable Windows hooks <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. Enable GKey <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. Enable XInput <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. Enable shortcuts in privileged applications GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> Shortcuts Genveje Shortcut button combination. Kombination af genvejsknapper. <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. <b>Dette er den globale genvejstast kombination.</b><br />Klik i dette felt og tryk derefter på den ønskede knap/tastkombination. Dobbeltklik for at fjerne. Suppress keys from other applications Tilbagehold knappen fra andre programmer <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. <b>Dette fjerner tryk på knappen fra andre programmer.</b><br />Aktivering vil skjule tryk på knappen (eller i det mindste den sidste knap i en tastkombination) fra andre programmer. Vær opmærksom på at ikke alle knapper kan tilbageholdes. GlobalShortcutTarget Whisper Target Hviskemål Whisper to list of Users Hvisk til liste over brugere Channel Target Kanalmål Restrict to Group Begræns til gruppe If specified, only members of this group will receive the whisper. Hvis anført vil kun medlemmer af denne gruppe modtage hvisken. List of users Liste over brugere Add Tilføj Remove Fjern Modifiers Modifikatorer Do not send positional audio information when using this whisper shortcut. Send ikke placeringsbestemt lydinformation når hviskegenvejen bliver brugt. Ignore positional audio Ignorér placeringsbestemt lyd Shout to Linked channels Råb til sammenkædede kanaler Shout to subchannels Råb til underkanaler Shout to Channel Råb til kanal The whisper will also be transmitted to linked channels. Denne hvisken vil også blive transmitteret til sammenkædede kanaler. The whisper will also be sent to the subchannels of the channel target. Hvisken vil også blive sendt til underkanalerne for kanal-målet. GlobalShortcutX Mouse %1 Mus %1 JackAudioSystem Hardware Ports Mono Stereo LCD Not connected Ingen forbindelse oprettet LCDConfig Enable this device Aktivér denne enhed LCD LCD Devices Enheder Name Navn <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> <p>Dette er listen over tilgængelige LCD-enheder på dit system. Enhederne er vist efter navn, men der vises også størrelsen af displayet. Mumble understøtter visning på flere LCD-enheder på samme tid.</p> <h3>Størrelse:</h3> <p> Dette felt beskriver størrelsen af en LCD-enhed. Størrelsen er enten opgivet i pixels (for grafiske LCD'er) eller i tegn (for tegnbaserede LCD'er)</p> <h3>Aktiveret:</h3> <p>Dette afgør om Mumble skal aktivere visning på den pågældende enhed.</p> Size Størrelse Enabled Aktiveret Views Visninger Minimum Column Width Minimum kolonnebredde <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> <p>Denne valgmulighed afgør minimumsbredden af en kolonne i brugervisningen.</p> <p>Hvis for mange folk snakker på engang, vil brugervisningen dele sig selv i kolonner. Du kan bruge denne valgmulighed til at vælge et kompromis mellem antallet af brugere vist på LCD'en, og bredden af brugernavne.</p> This setting decides the width of column splitter. Denne indstilning afgør bredden af kolonnemellemrumene. Splitter Width Bredde af mellemrum Log Debug Fejlfinding Critical Kritisk Warning Advarsel Information Information Server Connected Forbindelse til server oprettet Server Disconnected Forbindelse til server afbrudt Other self-muted/deafened Andre (de)aktiverede deres mikrofon/lyd Permission Denied Tilladelse nægtet Text Message Tekstbesked User Joined Server Bruger oprettede forbindelse til serveren User Left Server Bruger forlod serveren User recording state changed Brugers optagelse-tilstand ændret User kicked (you or by you) Bruger kicked (dig eller af dig) User kicked Bruger kicked You self-muted Du deaktiverede din mikrofon User muted (you) Bruger deaktiverede mikrofon (dig) User muted (by you) Bruger deaktiverede mikrofon (af dig) User muted (other) Bruger deaktiverede mikrofon (andre) User Joined Channel Bruger deltager i kanalen User Left Channel Bruger forlod kanalen You self-unmuted Du aktiverede din mikrofon You self-deafened Du deaktiverede din lyd You self-undeafened Du aktiverede lyd User renamed Bruger omdøbt You Joined Channel You Joined Channel (moved) User connected and entered channel User left channel and disconnected Private text message the server serveren [[ Invalid size ]] [[ Text object too large to display ]] [[ Tekstobjekt for stort til at blive vist ]] [Date changed to %1] [Datoen skiftede til %1] link to %1 link til %1 FTP link to %1 player link bruger-link channel link kanal-link %1 link %1 link LogConfig Toggle console for %1 events Slå konsol til/fra for %1-hændelser Toggle pop-up notifications for %1 events Slå pop-up-meddelelser til/fra for %1-hændelser Toggle Text-To-Speech for %1 events Slå Tekst-til-tale til/fra for %1-hændelser Click here to toggle sound notification for %1 events Klik her for at slå lydmeddelelser til/fra for %1-hændelser Toggle window highlight (if not active) for %1 events Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change Sti til lydfilen der skal bruges ved lydnotifikationer i tilfælde af %1-hændelser<br />Enkeltklik for at afspille<br />Dobbeltklik for at skifte Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. Klik hér for at slå udskrivning i konsol af %1-hændelser til/fra.<br />Hvis denne er markeret, vil denne valgmulighed få Mumble til at udskrive alle %1-hændelser i beskedloggen. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. Klik her for at slå pop-up-notifikationer for %1-hændelser til/fra.<br />Hvis denne er markeret, vil der blive lavet en pop-up-notifikation ved alle %1-hændelser. Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. Sti til lydfil der skal bruges ved lydnotifikationer i tilfælde af %1-hændelser.<br />Enkeltklik for at afspille<br />Dobbeltklik for at skifte<br />Vær sikker på at lydnotifikationer for disse hændelser er slået til, eller vil dette felt ikke have nogen virkning. Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. Klik hér for at slå Tekst-til-tale for %1-hændelser til/fra.<br />Hvis denne er markeret, vil Mumble bruge Tekst-til-tale til at læse %1-hændelser højt for dig. Tekst-til-tale er også i stand til at læse indholdet af hændelserne, der ikke er erstattet af lydfiler. Tekst-til-tale og lydfiler kan ikke bruges på samme tid. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. Klik hér for at slå lydmeddelelser for %1-hændelser til/fra.<br />Hvis denne er markeret, vil Mumble bruge en lydfil, som er valgt af dig, til at indikere %1-hændelser. Lydfiler og Tekst-til-tale kan ikke bruges på samme tid. Messages Beskeder Message Besked Console Konsol Notification Notifikation Text-To-Speech Tekst-til-tale Soundfile Lydfil Path Sti Text To Speech Tekst til tale Volume Lydstyrke Volume of Text-To-Speech Engine Lydstyrke for Tekst-til-tale <b>This is the volume used for the speech synthesis.</b> <b>Dette er lydstyrken for talen.</b> Length threshold Længde tærskel Message length threshold for Text-To-Speech Engine Den maksimale længde af en besked til oplæsning <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. <b>Dette er tærsklen for længden af beskeder i Tekst-til-tale.</b><br />Beskeder der er længere end denne grænse, vil ikke blive læst højt i deres fulde længde. Characters tegn Whisper Hviske If checked you will only hear whispers from users you added to your friend list. Hvis denne er markeret, vil du kun høre hvisken, fra venner du har tilføjet til din venneliste. Only accept whispers from friends Acceptér kun hvisken fra venner If enabled text messages you send will be read back to you with TTS Hvis denne er slået til, vil tekstbeskeder, som du sender, blive læst op for dig med tekst-til-tale Read back own messages Læs egne beskeder op Chat Log Chatlog Maximum chat length Maksimal længde af chat Unlimited Ubegrænset Lines Linjer Highlight LookConfig System default Systemstandard None Ingen Only with users Kun med brugere All Alle Ask Spørg Do Nothing Gør intet Move Flyt <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory <a href="%1">Gennemse</a> User Interface Brugergrænseflade This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. Dette indstiller hvilke kanaler der automatisk skal udvides. <i>Ingen</i> og <i>Alle</i> vil enten udvide ingen eller alle kanaler, hvorimod <i>Kun med brugere</i> vil udvide og sammenklappe kanaler i takt med at brugere går ind og ud af dem. List users above subchannels (requires restart). Vis brugere over underkanaler (kræver genstart). <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. <b>Hvis denne er markeret, vil brugere blive vist over underkanaler i kanaloversigten.</b><br />Det er nødvendigt at genstarte Mumble for at anvende ændringen. Users above Channels Brugere over underkanaler <b>If set, will verify you want to quit if connected.</b> <b>Hvis denne er markeret, vil du skulle bekræfte, at du vil afslutte, hvis du har oprettet forbindelse.</b> Show number of users in each channel Vis antallet af brugere i hver kanal Show channel user count Vis optælling af brugere Language Sprog Language to use (requires restart) Sprog der skal bruges (kræver genstart) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. <b>Dette indstiller hvilket sprog Mumble skal bruge.</b><br />Du skal genstarte Mumble for at bruge det nye sprog. Look and Feel Udseende og opførsel Layout Layout Classic Klassisk Stacked Stablet Hybrid Hybrid Custom Brugerdefineret This changes the behavior when moving channels. Dette ændrer opførslen når kanaler flyttes. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. Dette indstiller opførslen ved flytning af kanaler; det kan bruges til at forhindre uønsket flytning. <i>Flyt</i> flytter kanalen uden at spørge. <i>Gør ingenting</i> gør ingenting og skriver en fejlbesked i loggen. <i>Spørg</i> viser en dialogboks hvor du skal bekræfte, om du virkelig ønsker at flytte kanalen. Expand Udvid kanaler When to automatically expand channels Hvornår kanaler automatisk skal udvides Channel Dragging Flytning af kanaler Ask whether to close or minimize when quitting Mumble. Spørg om du vil lukke eller minimere, når du afslutter Mumble. Ask on quit while connected Spørg før afslutning (hvis forbindelse er oprettet) Always On Top Altid øverst <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> <b>Hvis denne er markeret, vil minimering af Mumble's hovedvindue få det til at blive skjult og kun være tilgængeligt fra systembakken. Ellers vil det blive minimeret, som et vindue normalt bliver.</b> Hide in tray when minimized Skjul i systembakken (når minimeret) Hide the main Mumble window in the tray when it is minimized. Skjul Mumble hovedvinduet i systembakken når det er minimeret. This setting controls when the application will be always on top. Denne indstilling kontrollerer, hvornår programmet altid vil være øverst. Never Aldrig Always Altid In minimal view I minimal visning In normal view I normal visning Displays talking status in system tray Vis i ikonet i systembakken om du taler Show talking status in tray icon Vis i systembakken om du taler This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. Denne indstilling kontrollere i hvilke situationer programmet altid vil være øverst. Hvis du vælger <i>Aldrig</i> vil programmet ikke være øverst. <i>Altid</i> vil altid holde programmet øverst. <i>I minimal visning</i> / <i>I normal visning</i> vil kun holde programmet øverst hele tiden når minimal visning er aktiveret / deaktiveret. Show context menu in menu bar Vis genvejsmenuen i menulinjen Apply some high contrast optimizations for visually impaired users Anvend nogle høje kontrast optimeringer for brugere med nedsat syn Optimize for high contrast Optimér for høj kontrast Application Program Adds user and channel context menus into the menu bar Tilføj kanal- og brugermenu i menulinjen Tray Icon Statusikon Channel Tree Kanaltræ Use selected item as the chat bar target Brug valgte genstand som mål for chatbaren Filter automatically hides empty channels Filtret skjuler automatisk tomme kanaler Show transmit mode dropdown in toolbar Theme Tema Theme to use to style the user interface <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. User Dragging This changes the behavior when moving users. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. Enable Developer menu When in custom layout mode, checking this disables rearranging. Lock layout MainWindow Root Rod Push-to-Talk Global Shortcut Tryk-for-snak Push and hold this button to send voice. Global Shortcut Tryk og hold denne knap for at sende stemme. This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut Dette konfigurerer tryk-for-snak knappen, og så længe du holder denne knap nede, vil du transmittere stemme. Reset Audio Processor Global Shortcut Nulstil Lyd Processor Unlink Plugin Global Shortcut Unlink plugin Push-to-Mute Global Shortcut Tryk-for-deaktivere-mikrofon Join Channel Global Shortcut Gå ind i kanal Toggle Overlay Global Shortcut Slå overlægning til/fra Toggle state of in-game overlay. Global Shortcut Skift tilstand for overlægning i spillet. Toggle Minimal Global Shortcut Slå minimal tilstand til/fra Volume Up (+10%) Global Shortcut Lydstyrke op (+10%) Volume Down (-10%) Global Shortcut Lydstyrke ned (-10%) Mumble Mumble Mumble -- %1 Mumble -- %1 &Window &Vindue Minimize Minimér Ctrl+M Ctrl+M Close Luk Mumble is currently connected to a server. Do you want to Close or Minimize it? Mumble har i øjeblikket forbindelse til en server. Vil du lukke eller minimere det? Mute Self Global Shortcut Deaktivér din mikrofon Set self-mute status. Global Shortcut Indstil din mikrofon on/off-status. This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut Dette vil indstille eller skifte din mikrofon on/off-status. Hvis du slår dette fra, vil du også aktivere din lyd igen. Deafen Self Global Shortcut Deaktivér din lyd Set self-deafen status. Global Shortcut Indstil din lyd on/off-status. This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut Dette vil slå din mikrofon- og lydstatus til/fra. Hvis du slår dette til, vil du også deaktivere din mikrofon. Whisper/Shout Whisper Hvisk/råb <center>Not connected</center> Not connected <center>Ingen forbindelse oprettet</center> Clear Ryd Opening URL %1 Åbner URL %1 File does not exist Filen eksisterer ikke File is not a configuration file. Filen er ikke en konfigurationsfil. Settings merged from file. Indstillinger fletted fra fil. URL scheme is not 'mumble' URL ordning er ikke 'mumble' This version of Mumble can't handle URLs for Mumble version %1.%2.%3 Denne version af Mumble kan ikke håndtere URLs for Mumble version %1.%2.%3 Connecting to %1 Opretter forbindelse til %1 Enter username Skriv brugernavn Connecting to server %1. Opretter forbindelse til server %1. Reconnecting. Opretter forbindelse igen. Transmit Mode set to Continuous <p>%1 (%2)<br />%3</p> <p>%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> <h2>Stemmekanal</h2><p>Krypteret med 128 bit OCB-AES128<br />%1 ms gennemsnitlig forsinkelse (%4 afvigelse)</p> Register yourself as %1 Registrér dig selv som %1 <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <p>Du er ved at registrere dig selv på denne server. Denne handling kan ikke fortrydes, og dit brugernavn kan ikke senere ændres. Du vil for altid være kendt som '%1' på denne server.</p><p>Er du sikker på du vil registrere dig selv?</p> <h2>Version</h2><p>Protocol %1</p> <p>No build information or OS version available</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) The connection is secured by the cipher suite that OpenSSL identifies as %1 <p>The connection provides perfect forward secrecy</p> <p>The connection does not provide perfect forward secrecy</p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> Voice channel is sent over control channel Register user %1 Registrér bruger %1 <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> <p>Du er ved at registrere '%1' på serveren. Denne handling kan ikke fortrydes, brugernavnet kan ikke ændres, og som en registreret bruger vil '%1' have adgang til serveren, selvom du skifter adgangskoden til serveren.</p><p>%1 vil blive autentificeret med certifikatet, der i øjeblikket er i brug.</p><p>Er du sikker på du vil registrere '%1'?</p> Kicking user %1 Kicker bruger %1 Banning user %1 Bandlyser brugeren %1 View comment on user %1 Vis kommentar på bruger %1 Message to channel %1 Besked til kanal %1 Connected. Forbindelse oprettet. <li>Expected certificate digest (SHA-1): %1</li> Server presented a certificate which failed verification. Serveren forelagde et certifikat som mislykkedes verificering. <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> SSL Version mismatch SSL-version uoverenstemmelse Server connection failed. <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>Skriv besked til kanalen '%1' hér</center> <center>Type message to user '%1' here</center> Type message to user '%1' here <center>Skriv besked til brugeren '%1' hér</center> Choose image file Vælg billedfil Failed to load image Indlæsning af billede mislykkedes Could not open file for reading. Kunne ikke åbne filen for læsning. Image format not recognized. Billedformatet blev ikke genkendt. &User &Bruger &Channel &Kanal Use in conjunction with Whisper to. Global Shortcut Anvend i forening med hvisken. This will switch the states of the in-game overlay. Global Shortcut Dette vil skifte tilstanden for overlægningen i spillet. Link Channel Global Shortcut Sammenkæd kanal Cycle Transmit Mode Global Shortcut Skift transmitteringsindstilling Set Transmit Mode to Push-To-Talk Global Shortcut Set Transmit Mode to Continuous Global Shortcut Set Transmit Mode to VAD Global Shortcut Send Text Message Global Shortcut Send tekstbesked Send Clipboard Text Message Global Shortcut This will send your Clipboard content to the channel you are currently in. Global Shortcut Continuous Uafbrudt Voice Activity Stemmeaktivering Push-to-Talk Tryk-for-snak Mumble - Minimal View -- %1 Cancel Annullér Save Image As... Save Image File Could not save image: %1 Change your comment Skift din kommentar Transmit Mode set to Voice Activity Transmit Mode set to Push-to-Talk <p>Connected users: %1/%2</p> UDP Statistics UDP-statistikker To Server Til server From Server Fra server Good Gode Late Forsinkede Lost Tabte Resync Gensynkroniseret <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> <h2>Lydbåndbredde</h2><p>Maksimum %1 kbit/s<br />Nuværende %2 kbit/s<br />Codec: %3</p> Mumble Server Information Mumble serverinformation &View Certificate &Se certifikat Enter reason Skriv begrundelse Sending message to %1 Sender besked til %1 To %1: %2 Til %1: %2 Message to %1 Besked til %1 Are you sure you want to reset the comment of user %1? Er du sikker på, at du vil nulstille kommentaren for brugeren %1? Are you sure you want to reset the avatar of user %1? Er du sikker på, at du vil nulstille avataren for brugeren %1? Are you sure you want to delete %1 and all its sub-channels? Er du sikker på, at du vil slette %1 og alle dens underkanaler? Sending message to channel %1 Sender besked til kanalen %1 Message to tree %1 Besked til træet %1 To %1 (Tree): %2 (Tree) %1: %2 Til %1 (træ): %2 Unmuted and undeafened. Mikrofon og lyd aktiveret. Unmuted. Mikrofon aktiveret. Muted. Mikrofon deaktiveret. Muted and deafened. Mikrofon og lyd deaktiveret. Deafened. Lyd deaktiveret. Undeafened. Lyd aktiveret. Restart Mumble? Genstart Mumble? Some settings will only apply after a restart of Mumble. Restart Mumble now? Nogle indstillinger vil først blive anvendt efter en genstart af Mumble. Genstart Mumble nu? About Qt Om Qt SSL Verification failed: %1 SSL-verificering mislykkedes: %1 <li>Server certificate digest (SHA-1): %1</li> <b>WARNING:</b> The server presented a certificate that was different from the stored one. <b>ADVARSEL:</b> Serveren forelagde et certifikat, der var forskellig fra det, du i forvejen har gemt. This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. Denne server bruger en ældre krypteringsstandard og er ikke længere understøttet af nyere versioner af Mumble. Server connection failed: %1. Serverforbindelse fejlede: %1. Disconnected from server. Forbindelse til server afbrudt. Invalid username Ugyldigt brugernavn You connected with an invalid username, please try another one. Du oprettede forbindelse med et ugyldigt brugernavn. Prøv venligst et andet. Username in use Brugernavn er i brug That username is already in use, please try another username. Dét brugernavn er allerede i brug, prøv venligst et andet brugernavn. Wrong certificate or password Forkert certifikat eller adgangskode Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. Forkert certifikat eller adgangskode for registreret bruger. Hvis du er sikker på, at denne bruger er beskyttet af en adgangskode, prøv venligst igen. Wrong password Forkert adgangskode Wrong server password for unregistered user account, please try again. Forkert serveradgangskode for uregistreret brugerkonto, prøv venligst igen. Images (*.png *.jpg *.jpeg) Billeder (*.png *.jpg *.jpeg) C&onfigure K&onfigurér &Help &Hjælp Log Log This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. Dette viser alle seneste aktiviter. Oprettelse af forbindelse til serveren, fejl og informationbeskeder vises alle hér.<br />For at konfigurere præcis hvilke beskeder der vises her, skal du gå ind under <b>Indstillinger</b> som du finder i menuen. &Quit Mumble &Afslut Mumble Closes the program Lukker programmet Exits the application. Går ud af programmet. Ctrl+Q CTRL+Q Open the server connection dialog Åben serverforbindelse-dialogen &Disconnect &Afbryd forbindelse Disconnect from server Afbryd forbindelse til server Disconnects you from the server. Afbryder din forbindelse til serveren. Show information about the server connection Viser information om serverforbindelsen This will show extended information about the connection to the server. Dette vil vise udvidet information om forbindelsen til serveren. &Mute &Deaktivér mikrofon &Deafen &Deaktivér lyd &Local Mute &Deaktivér mikrofon lokalt Send a Text Message Send en tekstbesked Sends a text message to another user. Sender en tekstbesked til en anden bruger. Add new channel Tilføj ny kanal This adds a new sub-channel to the currently selected channel. Dette tilføjer en ny underkanal til den nuværende valgte kanal. Remove channel Fjern kanal This removes a channel and all sub-channels. Dette fjerner en kanal og alle underkanaler. Edit Groups and ACL for channel Redigér grupper og ACL for kanal This opens the Group and ACL dialog for the channel, to control permissions. Dette åbner dialogboksen med grupper og ACL for denne kanal, så du kan kontrollere rettigheder. &Link &Sammenkæd Link your channel to another channel Sammenkæd din kanal med en anden kanal This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. Dette er chatbaren<br />Hvis du skriver tekst hér og trykker enter, vil teksten blive sendt til brugeren eller kanalen som du har valgt. Hvis ingenting er valgt, vil beskeden blive sendt til din nuværende kanal. Chatbar Chatbar Shows a dialog of registered servers, and also allows quick-connect. Viser en dialogboks med registrerede servere, og giver også mulighed for lynforbindelse. Kick user (with reason) Kick bruger (med begrundelse) Kick selected user off server. You'll be asked to specify a reason. Kick valgte bruger fra server. Du vil blive bedt om at angive en grund. Mute user Deaktivér brugers mikrofon Mute or unmute user on server. Unmuting a deafened user will also undeafen them. Aktivér eller deaktivér en brugers mikrofon på serveren. Aktivering af en brugers mikrofon, vil også aktivere brugerens lyd. Kick and ban user (with reason) Kick og bandlys bruger (med begrundelse) Kick and ban selected user from server. You'll be asked to specify a reason. Kick og bandlys den valgte bruger fra serveren. Du vil blive bedt om at angive en begrundelse. Deafen user Deaktivér brugers lyd Deafen or undeafen user on server. Deafening a user will also mute them. Aktivér eller deaktivér en brugers mikrofon og lyd på serveren. Deaktivering af en brugers lyd, vil også deaktivere brugerens mikrofon. Mute user locally Deaktivér brugeren mikrofon lokalt Mute or unmute user locally. Use this on other users in the same room. Aktivér eller deaktivér en brugers mikrofon lokalt. Brug denne på andre brugere i det samme rum. This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. Dette sammenkæder din nuværende kanal med den valgte kanal. Hvis brugere i en kanal har rettighedder til at snakke i den anden kanal, kan brugerne nu høre hinanden. Dette er en permanent sammenkædning, som vil vare indtil sammenkædningen fjernes manuelt eller serveren genstartes. Du kan kigge under genveje for at finde <i>Tryk-for-sammenkædning</i>. &Unlink Channel &Fjern sammenkædning Unlink your channel from another channel Fjern sammenkædningen af din kanal med en anden kanal This unlinks your current channel from the selected channel. Fjerner sammenkædningen mellem din nuværende kanal og den valgte kanal. Unlinks your channel from all linked channels. Fjerner sammenkædningen af alle de kanaler, som din kanal er sammenkædet med. This unlinks your current channel (not the selected one) from all linked channels. Dette fjerner sammenkædning fra din kanal (ikke den valgte) til alle andre kanaler. &Reset &Nulstil Reset audio preprocessor Nulstil lyd-forudbearbejdning This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. Dette vil nulstille lydforudbehandlingen. Herunder støjedæmpning automatisk stemmeaktivitet. Hvis noget pludselig forværrer lydmiljøet (fx dropper mikrofonen) og det er midlertidigt, brug denne til at undgå, at skulle vente på at forudbehandlingen justerer. &Mute Self &Deaktivér din mikrofon Mute yourself Deaktivér din mikrofon Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. Aktivér eller deaktivér din mikrofon. Hvis din mikrofon er deaktiveret, vil der ikke sendes nogen data til serveren. Aktivering af mikrofon, når lyd er deaktiveret, vil også aktivere lyd. &Deafen Self &Deaktivér din lyd Deafen yourself Deaktivér din lyd Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. Aktivér eller deaktivér din mikrofon og lyd. Når din mikrofon og lyd er deaktiveret, vil du ikke høre noget. Hvis du deaktiverer din lyd, vil dette også deaktivere din mikrofon. &Text-To-Speech &Tekst-til-tale Toggle Text-To-Speech Slå Tekst-til-tale til/fra Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. Aktivér eller deaktivér Tekst-til-tale. Kun beskedtyper der er aktiveret for Tekst-til-tale under konfiguration, vil blive læst højt. Display audio statistics Vis lydstatistikker Pops up a small dialog with information about your current audio input. Åbner en lille dialogboks med information om din nuværende lydindspilning. Forcibly unlink plugin Tving unlink af plugin This forces the current plugin to unlink, which is handy if it is reading completely wrong data. Dette tvinger det nuværende plugin til at unlink, som er praktisk hvis læser totalt forkerte data. Configure Mumble Konfigurér Mumble Allows you to change most settings for Mumble. Gør dig i stand til at ændre de fleste indstillinger i Mumble. Start the audio configuration wizard Start lydkonfigurations-guiden This will guide you through the process of configuring your audio hardware. Dette vil guide dig gennem processen, hvor du kan konfigurere din lydhardware. &What's This? &Hvad er dette? Enter What's This? mode Gå ind i <i>Hvad er dette?</i>-tilstand Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. Klik hér for at gå ind i "Hvad er dette?"-tilstand. Din markør vil skifte til et spørgsmåltegn. Klik på enhver knap, et menupunkt eller et område for at vise en beskrivelse af <i>hvad det er</i>. Information about Mumble Information om Mumble Shows a small dialog with information and license for Mumble. Viser en lille dialogboks med information om licens for Mumble. Information about Speex Information om Speex Shows a small dialog with information about Speex. Viser en lille dialogboks med information om Speex. Information about Qt Information om Qt Shows a small dialog with information about Qt. Viser en lille dialogboks med information om Qt. Check for &Updates Tjek for &opdateringer Check for new version of Mumble Tjek for ny version af Mumble Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. Opretter forbindelse til Mumble-webstedet for at tjekke om der er en ny version tilgængelig, og informerer dig med en relevant download-URL hvis dette er tilfældet. Sends a text message to all users in a channel. Sender en tekstbesked til alle brugere i en kanal. Configure certificates for strong authentication Konfigurér certifikater for stærk autentificering This starts the wizard for creating, importing and exporting certificates for authentication against servers. Dette starter guiden, der kan bruges til at oprette, importere og eksportere certifikater til stærk autentificering på servere. Register user on server Registrér bruger på server This will permanently register the user on the server. Dette vil permanent registere brugeren på serveren. Add &Friend Tilføj som &ven Adds a user as your friend. Tilføj en bruger som din ven. This will add the user as a friend, so you can recognize him on this and other servers. Dette vil tilføje brugeren som en ven, så du kan genkende brugeren på denne og andre servere. &Remove Friend &Fjern som ven Removes a user from your friends. Fjerner en bruger som din ven. This will remove a user from your friends list. Dette vil fjerne en bruger fra din venneliste. &Update Friend &Opdatér ven Update name of your friend. Opdater navn på din ven. Your friend uses a different name than what is in your database. This will update the name. Din ven bruger et andet navn, end det som er i din database. Dette vil opdatere navnet. Edit registered users list Redigér listen over registrerede brugere This opens the editor for registered users, which allow you to change their name or unregister them. Dette åbner redigeringsværktøjet for registrerede brugere, som gør dig i stand til at skifte deres navn eller fjerne deres registrering. Add or remove text-based access tokens Tilføj eller fjer tekstbaserede adgangsudtryk &Minimal View &Minimal visning Toggle minimal window modes Slå minimal tilstand til/fra This will toggle minimal mode, where the log window and menu is hidden. Dette vil slå minimal tilstand til/fra, hvor log-vinduet og menuen er skjult. You muted and deafened %1. Du deaktiverede mikrofon og lyd for %1. You unmuted and undeafened %1. Du aktiverede mikrofon og lyd for %1. You undeafened %1. Du aktiverede lyd for %1. You suppressed %1. Du deaktiverede mikrofon for %1. %1 muted and deafened by %2. %2 deaktiverede mikrofon og lyd for %1. %1 unmuted and undeafened by %2. %2 aktiverede mikrofon og lyd for %1. %1 undeafened by %2. %2 aktiverede lyd for %1. %1 suppressed by %2. %2 deaktiverede mikrofon for %1. %1 moved to %2. %1 flyttet til %2. %1 moved to %2 by %3. %1 flyttet til %2 af %3. %1 moved in from %2 by %3. %1 flyttet ind fra %2 af %3. %1 is now muted and deafened. %1 deaktiverede mikrofon og lyd. Your account information can not be verified currently. Please try again later Din kontoinformation kan i øjeblikket ikke verificeres. Prøv igen senere Welcome message: %1 Velkomstbesked: %1 Mumble: %1 Mumble: %1 You were denied %1 privileges in %2. Du blev nægtet <i>%1</i>-privilegier i %2. %3 was denied %1 privileges in %2. %3 blev nægtet %1-privilegier i %2. Denied: Cannot modify SuperUser. Nægtet: Kan ikke modificere SuperUser. Denied: Invalid channel name. Nægtet: Ugyldigt kanalnavn. Denied: Text message too long. Nægtet: Tekstbesked for lang. Denied: Operation not permitted in temporary channel. Nægtet: Handling ikke tilladt i midlertidig kanal. You need a certificate to perform this operation. Du skal bruge et certifikat for at gøre dette. %1 does not have a certificate. %1 har ikke et certifikat. Invalid username: %1. Ugyldigt brugernavn: %1. Invalid username. Ugyldigt brugernavn. Channel is full. Kanalen er fuld. Channel nesting limit reached. Udbygningsgrænsen for kanalen opnået. Channel count limit reached. Need to delete channels before creating new ones. Permission denied. Tilladelser nægtet. %1 connected and entered channel. %1 connected. %1 oprettede forbindelse. %1 is now muted. %1 har deaktiveret mikrofon og lyd. %1 is now unmuted. %1 aktiverede mikrofon. Recording started Optagelse startet Recording stopped Optagelse stoppet %1 started recording. %1 startede optagelse. %1 stopped recording. %1 stoppede optagelse. You revoked your priority speaker status. Du ophævede din status som prioriteret taler You assumed priority speaker status. Du antog status som prioriteret taler. %1 revoked your priority speaker status. %1 ophævede din status som prioriteret taler. %1 gave you priority speaker status. %1 tildelte dig status som prioriteret taler. You revoked priority speaker status for %1. Du ophævede status som prioriteret taler for %1. You gave priority speaker status to %1. Du tildelte status som prioriteret taler til %1. %1 revoked own priority speaker status. %1 ophævede sin egen status som prioriteret taler. %1 assumed priority speaker status. %1 antog status som prioriteret taler. %1 revoked priority speaker status for %2. %1 ophævede status som prioriteret taler for %2. %1 gave priority speaker status to %2. %1 tildelte status som prioriteret taler til %2. You were unmuted and undeafened by %1. %1 aktiverede din mikrofon og lyd. You were muted by %1. %1 deaktiverede din mikrofon og lyd. You were undeafened by %1. %1 aktiverede din lyd. You were suppressed. You were suppressed by %1. Din mikrofon blev deaktiveret. You were unsuppressed. Din mikrofon blev aktiveret. You were unsuppressed by %1. %1 aktiverede din mikrofon. You joined %1. You moved %1 to %2. Di flyttede %1 til %2. %1 is recording %1 optager %1 renamed to %2 by %3. %1 disconnected. %1 afbrød forbindelsen. Server message from server (Tree) (Træ) (Channel) (Kanal) (Private) %2%1: %3 %2%1: %3 Failed to load Opus, it will not be available for audio encoding/decoding. The server requests minimum client version %1 Serveren kræver minimum klientversion %1 The server requests positional audio be enabled. Serveren kræver, at placeringsbestemt lyd er aktiveret. The server requests positional audio be disabled. Serveren kræver, at placeringsbestemt lyd er deaktiveret. The server requests Push-to-Talk be enabled. Serveren kræver, at tryk-for-snak er aktiveret. The server requests Push-to-Talk be disabled. Serveren kræver, at tryk-for-snak er deaktiveret. You were unmuted by %1. %1 aktiverede din mikrofon. You muted %1. Du deaktiverede mikrofon for %1. You unsuppressed %1. Du aktiverede mikrofon for %1. You unmuted %1. Du aktiverede mikrofon for %1. %1 muted by %2. %2 deaktiverede mikrofon for %1. %1 unsuppressed by %2. %2 aktiverede mikrofon for %1. %1 unmuted by %2. %2 aktiverede mikrofon for %1. Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. Kunne ikke finde matchende CELT-codecs host andre klienter. Du vil ikke være i stand til at snakke med alle brugere. You were muted and deafened by %1. You were deafened by %1. %1 deaktiverede din mikrofon og lyd. You were kicked from the server by %1: %2. Du blev kicked fra serveren af %1: %2. %3 was kicked from the server by %1: %2. %3 blev kicked fra serveren af %1: %2. You were kicked and banned from the server by %1: %2. Du blev kicked og bandlyst fra serveren af %1: %2. %3 was kicked and banned from the server by %1: %2. %3 blev kicked og bandlyst fra serveren af %1: %2. You were moved to %1 by %2. Du blev flyttet til %1 af %2. %1 entered channel. %1 deltager i kanalen. Server connection rejected: %1. Forbindelse til server afvist: %1. Denied: %1. Nægtet. %1. %1 renamed to %2. %1 omdøbt til %2. %1 left channel and disconnected. %1 forlod kanalen og afbrød forbindelsen. Message from %1 Besked fra %1 You have User Dragging set to "Do Nothing" so the user wasn't moved. You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. Du har "Flytning af kanaler" sat til "Gør intet", så kanalen blev ikke flyttet. Unknown Channel Drag mode in UserModel::dropMimeData. Ukendt tilstand for flytning af kanaler i UserModel::dropMimeData. Remote controlling Mumble: Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) -jn, --jackname Set custom Jack client name. --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status Invocation Opmærksomhed Error: No RPC command specified RPC RPC Welcome to Mumble. Velkommen til Mumble. Skipping version check in debug mode. Springer over versionstjek i fejlfindingstilstand. Hide Frame Skjul ramme Toggle showing frame on minimal window Slå visning af ramme på minimal-vinduet til/fra This will toggle whether the minimal window should have a frame for moving and resizing. Dette vil slå til/fra hvorvidt det minimale vindue skal have en ramme der kan bruges til flytning eller ændring af størrelsen. &Unlink All &Fjern alle sammenkædninger Reset the comment of the selected user. Fjern kommentaren for den valgte bruger. &Join Channel &Gå ind i kanal View comment in editor Vis kommentar i redigeringsprogram Query server for connection information for user Forespørg serveren om forbindelses information til bruger S&erver S&erver &Self &Selv &Unlink Plugins &Unlink plugins Register yourself on the server Registrér dig selv på serveren Change your avatar image on this server Skift dit avaterbillede på denne server &Remove Avatar &Fjern avatar Remove currently defined avatar image. Fjern nuværende indstilte avatarbillede. Icon Toolbar Ikon værktøjslinje Change your own comment Skift din egen kommentar Recording Optager Priority Speaker Prioriteret taler &Copy URL &Kopiér URL Copies a link to this channel to the clipboard. Kopierer et link til denne kanal til udklipsholderen. Ignore Messages Ignorér beskeder Locally ignore user's text chat messages. Ignorerer lokalt brugerens tekst-chatbeskeder. Silently drops all text messages from the user. Ser lydløst bort fra alle tekstbeskeder fra brugeren. Edit ban list on server Redigér bandlysningslisten på serveren This lets you edit the server-side IP ban list. Dette lader dig ændre den serverbaserede IP-bandlysningsliste. &Filter on/off &Filter til/fra Toggle the channel filter (Ctrl+F) Slå kanalfiltret til/fra (Ctrl+f) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. Aktivér eller deaktivér filtreringen af valgte kanaler. Som standard vil alle tomme kanaler blive filtreret. Du kan markere yderligere kanaler til filtrerering fra kanalens genvejsmenu. Ctrl+F Ctrl+F &Hide Channel when Filtering &Skjul kanal ved filtrering Reset the avatar of the selected user. Fjern avataret for den valgte bruger. Locally adjust the user's speech volume. Opens a dialog with a volume slider. Use this on other users in the same room. &Developer &Hide Mumble Hides the main Mumble window. Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. Show the Developer Console Shows the Mumble Developer Console, where Mumble's log output can be inspected. &Connect... &Ban list... &Information... &Kick... &Ban... Local Volume Adjustment... Send &Message... &Add... &Remove... &Edit... Audio S&tatistics... &Settings... &Audio Wizard... Developer &Console... &About... About &Speex... About &Qt... &Certificate Wizard... &Register... Registered &Users... Change &Avatar... &Access Tokens... Reset &Comment... Reset &Avatar... View Comment... &Change Comment... R&egister... Show Shows the main Mumble window. Manual Manual Mumble Positional Audio Position X Y Z m Heading Azimuth Elevation ° Meta data Context Identity Set State Linked Activated Unhinge NetworkConfig Network Netværk Updates are mandatory when using snapshot releases. Opdateringer er påkrævet, når man bruger snapshot-udgaver. Connection Forbindelse Use TCP compatibility mode Use TCP compatability mode Brug TCP-kompatibilitetstilstand <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). <b>Aktivér TCP-kompatibilitetstilstand</b>.<br />Dette vil få Mumble til kun at bruge TCP når der kommunikeres med serveren. Dette vil forøge tabet, og forårsage at mistede pakker frembringer hørbare pauser i kommunikationen, så dette skal kun bruges, hvis du ikke er i stand til at bruge standarden (som bruger UDP for tale og TCP for kontrol). Reconnect when disconnected Opret forbindelse igen ved afbrudt forbindelse <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. <b>Opret forbindelse igen ved mistet forbindelse</b>.<br />Dette vil få Mumble til at forsøge at oprette forbindelse igen efter 10 sekunder hvis forbindelsen mistes. Reconnect automatically Opret automatisk forbindelse igen Proxy Proxy Type Type Type of proxy to connect through Proxytype der skal forbindes gennem Direct connection Direkte forbindelse HTTP(S) proxy HTTP(S) proxy SOCKS5 proxy SOCKS5 proxy Hostname Værtsnavn Hostname of the proxy Værtsnavn for proxy'en Force TCP mode Gennemtving TCP-tilstand Enable QoS to prioritize packets Aktivér QoS til pakkeprioritering This will enable QoS, which will attempt to prioritize voice packets over other traffic. Dette vil aktivere QOS, som vil forsøge at prioritere lydpakker over andet trafik. Use Quality of Service Brug Quality of Service Don't send certificate to server and don't save passwords. (Not saved). Send ikke certifikat til server og gem ikke adgangskoder. (Gemmes ikke). <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> <b>Dette vil tilbageholde identificerbar information, så det ikke sendes til serveren.</b><p>Du vil ikke autenticifere med et certifikat, selvom du har ét, og du vil ikke opbevare adgangskoder for forbindelser. Dette er primært en test-indstilling og bliver derfor ikke gemt.</p> Suppress certificate and password storage Tilbagehold certifikat og gemte adgangskoder <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>Typen af proxyen der skal oprettes forbindelse gennem.</b><br />Dette får Mumble til at oprette forbindelse gennem en proxy for alle udgående forbindelser. Vær opmærksom på, at brug af proxy tvinger Mumble til at bruge TCP-kompatibilitetstilstand, som resulterer, i at alt tale-data vil blive sendt gennem kontrolkanalen. <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. <b>Værtsnavn for proxyen.</b><br />Dette felt angiver værtsnavnet for proxyen, som du ønsker at føre alt netværkstrafik gennem. Port Port Port number of the proxy Portnummer for proxyen <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. <b>Portnummeret for proxyen.</b><br />Dette felt angiver portnummeret som proxyen forventer forbindelser på. Username Brugernavn Username for proxy authentication Brugernavn for proxyautentificering <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>Brugernavn for proxy-autentificering.</b><br />Dette angiver brugernavnet, som du vil bruge til at autenticifere dig selv med proxyen. I tilfælde af at proxyen ikke bruger autenticikation, eller hvis du ønsker at oprette forbindelse anonymt, skal du blot lade dette være tomt. Password Adgangskode Password for proxy authentication Adgangskode for proxyautentificering <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>Adgangskode for proxy-autentificering.</b><br />Dette felt angiver adgangskoden, som du vil bruge til at autentificere dig selv med proxyen. I tilfælde af at proxyen ikke bruger autenticikation, eller hvis du ønsker at oprette forbindelse anonymt, skal du blot lade dette være tomt. Mumble services Mumble tjenester Check for new releases of Mumble automatically. Tjek automatisk for ny Mumble version. This will check for new releases of Mumble every time you start the program, and notify you if one is available. Dette vil tjekke for nye udgivelser af Mumble, hver gang du starter programmet, og give dig besked hvis en ny er tilgængelig. Check for application updates on startup Tjek for programopdateringer ved start Check for new releases of plugins automatically. Tjek automatisk for nye pluginudgivelser. This will check for new releases of plugins every time you start the program, and download them automatically. Dette vil tjekke for nye udgivelser af plugins, hver gang du starter programmet, og downloade dem automatisk. <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. <b>Indsend anonyme statistikker.</b><br />Mumble har et lille udviklingsteam, og der skal derfor fokuseres på udvikling, hvor det er mest nødvendigt. Ved at indsende en smule statistikker vil du hjælpe projektet med at finde ud af, hvor der skal fokuseres på udvikling. Submit anonymous statistics to the Mumble project Indsend anonyme statistikker til Mumble-projektet Submit anonymous statistics Send anonyme statistikker Reconnect to last used server when starting Mumble Forbind igen til den sidst anvendte server når Mumble starter Reconnect to last server on startup Forbind igen til sidst anvendte server ved opstart Download plugin and overlay updates on startup Download plugin- og overlægningsopdateringer ved opstart Privacy Prevent OS information being sent to Mumble servers and web servers <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. Do not send OS information to Mumble servers and web servers Overlay Silent Stille Talking Taler Whisper Hvisker Shout Råber Channel Kanal Failed to create communication with overlay at %2: %1. No overlay will be available. Det mislykkedes at oprette kommunikation med overlægningen på %2: %1. Der vil ikke være nogen overlægning tilgængelig. OverlayClient Filter Filter Only talking Kun talende Talking and recently active Snakkende og nyligt aktive All in current channel Alle i nuværende kanal All in linked channels Alle i sammenkædede kanaler Always show yourself Vis altid dig selv Configure recently active time (%1 seconds)... Konfigurér tiden for værende nyligt aktiv (%1 sekunder)... Columns Kolonner Sort Sortering Alphabetically Alfabetisk Last state change Seneste tilstandsændring Edit... Redigér... Reset Zoom Nulstil zoom Configure recently active time Konfigurér tiden for værende nyligt aktiv Amount of seconds users remain active after talking: Antal sekunder brugere forbliver aktive efter at have snakket: OverlayConfig To move the users, drag the little red dot. For at flytte brugerne, træk i den lille røde prik. To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. For at ændre størrelsen af brugerne, drej på musehjulet over en bruger. For more options, right click a user. For more options, rightclick a user. For flere valgmuligheder, højreklik på en bruger. Launcher Filter Overlay Overlægning Choose executable Vælg eksekverbar Choose application Vælg program Choose path Load Overlay Presets Indlæs forudindstillede overlægninger Mumble overlay presets (*.mumblelay) Mumble forudindstillede overlægninger (*.mumblelay) Save Overlay Presets Gem forudindstillede overlægninger Options Valgmuligheder Enable overlay. Aktivér overlægning. Enable Overlay Aktivér overlægning This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. Dette indstiller hvorvidt overlægningen er aktiveret eller ej. Denne indstilling bliver kun tjekket, når programmer startes, så vær sikker på at Mumble er startet, og denne valgmulighed er slået til, før du starter et program.<br />Vær opmærksom på at hvis du starter Mumble efter du har startet programmet, eller hvis du deaktiverer overlægningen mens programmet kører, er der ingen sikker måde at genstarte overlægningen uden også at genstarte programmet. Layout Layout Blacklist Blacklist Whitelist Whitelist Uninstall Overlay Afinstallér overlægning Overlay Installation Installation af overlægning Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. Mumble har detekteret, at du ikke har Mumble-overlægningen installeret. Klik på knappen nedenfor for at installere overlægningen. Install Mumble Overlay Installér Mumble overlægning Overlay Upgrade Opgradering for overlægning Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. Mumble har detekteret en gammel version af overlægnings-support-filerne på din computer. For at opgradere disse filer til deres nyeste version, klik på knappen nedenfor. Upgrade Mumble Overlay Opgradér Mumble overlægning Display a frame counter in the overlay Vis en frame-tæller på overlægningen Show FPS counter Vis FPS-tæller Load an overlay preset from file Indlæs en forudindstillet overlægning fra en fil Load… Indlæs... Save your overlay settings to file Gem dine indstillinger for overlægningen i en fil Save… Gem... Set the overlay font. Indstil skrifttypen for overlægningen. Set the overlay text color. Indstil tekstfarven for overlægningen. Color Farve Remove Fjern Font Skrifttype FPS and Clock Display FPS- og klokkeslætsvisning Display a clock in the overlay showing the current local time (system time). Vis et ur i overlægningen der viser det nuværende lokale klokkeslæt (systemklokkeslæt). Show Clock Vis ur Overlay Exceptions Overlay Exception Mode Allowed launchers Add Allowed programs Allowed paths Blacklisted programs OverlayEditor State Tilstand User is not talking Brugeren taler ikke Passive Passiv User is talking in your channel or a linked channel Brugeren snakker i din kanal eller en sammenkædet kanal Talking Snakker User is whispering to you privately Brugeren hvisker privat til dig Private Whisper Privat hvisken User is shouting to your channel Brugeren råber til din kanal Channel Whisper Hvisken til kanal Zoom Zoom Zoom Factor Zoom-faktor Enabled Elements Aktiverede elementer User avatar, chosen by each user Bruger-avatar, valgt af den enkelte bruger Avatar Avatar User's name Brugerens navn Username Brugernavn Name of user's channel, if outside your current channel Navnet på brugerens kanal, hvis brugeren er uden for din nuværende kanal Channel Kanal Muted or deafened Hvorvidt mikrofon eller lyd er aktiveret eller deaktiveret Mute state Lyd on/off Bounding box, automatically shrunk to minimum size to contain all visible elements Afgrænsningsrammen skrumper automatisk til den mindst mulige størrelse, hvor alle synlige elementer kan være Bounding box Afgrænsningsramme Overlay Editor Redigering af overlægning OverlayEditorScene Layout preset Forudindstillet layout Large square avatar Stort firkantet avatar Avatar and Name Avatar og navn User Opacity Uigennemsigtighed for brugere %1% %1% Object Opacity Uigennemsigtighed for objekter Alignment Justering Left Venstre Center Centreret Right Højre Top Top Bottom Bund Color... Farve... Font... Skrifttype... Bounding box Afgrænsningsramme Pen width Pen-bredde Padding Spaltefyld Pen color Pen-farve Fill color Udfyldningsfarve Pick pen color Vælg pen-farve Pick fill color Vælg udfyldningsfarve Pick color Vælg farve Pick font Vælg skrifttype PluginConfig Plugins Plugins Plugin has no configure function. Plugin'et har ingen konfigurationsfunktioner. Plugin has no about function. Plugin'et har ingen om-funktion. Options Valgmuligheder Enable plugins and transmit positional information Aktivér plugins og transmittér placeringsinformation This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. Dette tillader plugins for understøttede spil, at aflæse din position i spillet og transmittere den sammen med hver enkelt lydpakke. Dette gør andre brugere i stand til, at høre din stemme i spillet fra den retning din karakter er i forhold til deres egen. Link to Game and Transmit Position Sammenkæd til spil og transmittér placering Reloads all plugins Genindlæs alle plugins This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. Dette scanner og loader plugins igen. Brug dette hvis du lige har ændret eller tilføjet et plugin til plugin-biblioteket. &Reload plugins &Genindlæs plugins Information about plugin Information om plugin This shows a small information message about the plugin. Dette viser en lille informationsbesked om pluginet. &About &Om Show configuration page of plugin Vis konfigurationsside for plugin This shows the configuration page of the plugin, if any. Dette viser konfigurations-siden for pluginet, hvis der er nogen. &Configure &Konfigurér Name Navn Enabled Aktiveret Plugins Skipping plugin update in debug mode. Springer over pluginopdateringer i fejlfindingstilstand. Downloaded new or updated plugin to %1. Downloadede nyt eller opdateret plugin til %1. Failed to install new plugin to %1. Installation af nyt plugin til %1 mislykkedes. %1 lost link. %1 mistede link. %1 linked. %1 er linket. PortAudioSystem Default Device Standardenhed PulseAudioSystem Default Input Standardindspilning Default Output Standardafspilning QApplication Failed to restart mumble Kunne ikke genstarte mumble Mumble failed to restart itself. Please restart it manually. Mumble kunne ikke selv genstarte. Genstart det venligst manuelt. RichTextEditor Failed to load image Indlæsning af billede mislykkedes Image file too large to embed in document. Please use images smaller than %1 kB. Billedfilen er for stor til at blive indsat. Brug venligst billeder mindre end %1 kB. Message is too long. Beskeden er for lang. Display Vis Source Text Kildekode &Bold &Fed Ctrl+B CTRL+F &Italic &Kursiv Italic Kursiv Ctrl+I CTRL+K Underline Understregning Ctrl+U CTRL+U Color Farve Insert Link Insæt link Ctrl+L CTRL+L Insert Image Indsæt billede RichTextEditorLink Add Link Tilføj link URL URL Text Tekst ServerHandler Unable to resolve hostname Server is not responding to TCP pings UDP packets cannot be sent to or received from the server. Switching to TCP mode. UDP-pakker kan ikke blive sendt eller modtaget fra serveren. Skifter til TCP-tilstand. UDP packets cannot be sent to the server. Switching to TCP mode. UDP-pakker kan ikke blive sendt til serveren. Skifter til TCP-tilstand. UDP packets cannot be received from the server. Switching to TCP mode. UDP-pakker kan ikke blive modtaget fra serveren. Skifter til TCP-tilstand. UDP packets can be sent to and received from the server. Switching back to UDP mode. UDP-pakker kan igen blive sendt og modtaget fra serveren. Skifter tilbage til UDP-tilstand. Connection timed out Forbindelse fik timeout ServerView Favorite Favoritter LAN LAN Public Internet Offentligt internet Unknown Africa Afrika Asia Asien North America Nordamerika South America Sydamerika Europe Europa Oceania Oceanien ShortcutActionWidget Unassigned Ubenyttet ShortcutDelegate On Til Off Fra Toggle Slå til/fra Unassigned Ubenyttet ShortcutKeyWidget Press Shortcut Tryk genvej ShortcutTargetDialog Root Rod Parent Forælder Current Nuværende Subchannel #%1 Underkanal #%1 ShortcutTargetWidget ... ... , , Root Rod Parent Forælder Current Nuværende Subchannel #%1 Underkanal #%1 Invalid Ugyldig Empty <Empty> Tom ShortcutToggleWidget Off Fra Toggle Slå til/fra On Til TextMessage Enter text Skriv tekst If checked the message is recursively sent to all subchannels Hvis denne er markeret, bliver beskeden rekursivt sendt til alle underkanaler Send recursively to subchannels Send rekursivt til underkanaler Tokens Empty Token Tomt udtryk Mumble - Access Tokens Mumble - Adgangsudtryk List of access tokens on current server Liste over adgangsudtryk på nuværende server <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. <b>Dette er en redigerbar liste over adgangsudtryk for den forbundne server.</b> <br /> Et adgangsudtryk er en tekststreng, der kan bruges som en adgangskode for meget simpel adgangsadministration på kanaler. Mumble vil huske de udtryk du har brugt, og gensende dem til serveren næste gang du forbinder, så du ikke skal skrive dem hver gang. Add a token Tilføj et adgangsudtryk &Add &Tilføj Remove a token Fjern et adgangsudtryk &Remove &Fjern UserEdit Registered Users Registrerede brugere Remove Fjern Rename Omdøb Who are you looking for? Hvem leder du efter? Days Dage Weeks Uger Months Måneder Years År Inactive for Inaktiv i Registered users: %n account(s) Registrerede brugere: %n konto(er)Registrerede brugere: %n konto(er) UserInformation User Information Bruger Information Connection Information Forbindelses Information Version Version OS OS Certificate Certifikat IP Address IP Adresse CELT Versions CELT Versioner Details... Detaljer... Ping Statistics Ping-statistikker Pings received Pings modtaget Average ping Gennemsnitlig ping TCP (Control) TCP (Kontrol) UDP (Voice) UDP (Stemme) UDP Network statistics UDP Netværks statistik Good God Late Sen Lost Tabt Resync Resynkroniser From Client Fra Klient To Client Til Klient Connection time Forbindelsestid %1w %1u %1d %1d %1h %1t %1m %1m %1s %1s , , %1 (%2) %1.%2.%3 (%4) %1 (%2) Supported Understøttet Not Supported Ikke undersøttet Not Reported Ikke rapporteret %1 online (%2 idle) %1 online (%2 inaktiv) %1 online %1 online %1 kbit/s %1 kbit/s Bandwidth GroupBox Båndbredde Bandwidth Label Båndbredde Ping deviation Ping afvigelse UserListModel Nick Kaldenavn Inactive days Antal inaktive dage Last channel Sidste kanal Last seen: %1 Sidst set: %1 Never Aldrig Channel ID: %1 UserLocalVolumeDialog Local volume for other users <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. Adjusting local volume for %1 dB <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: Dette er en bruger, der har oprettet forbindelse til serveren. Ikonet til venstre for brugeren viser, om vedkommende snakker: Talking to your channel. Snakker til din kanal. Shouting directly to your channel. Whispering directly to your channel. Råben direkte til din kanal. Whispering directly to you. Hvisken direkte til dig. Not talking. Snakker ikke. This is a channel on the server. The icon indicates the state of the channel: Dette er en kanal på serveren. Ikonet viser tilstanden af kanalen: Your current channel. Din nuværende kanal. A channel that is linked with your channel. Linked channels can talk to each other. En kanal der er sammenkædet med din kanal. Brugere i sammenkædede kanaler kan snakke med hinanden. A channel on the server that you are not linked to. En kanal på serveren som du ikke er sammenkædet med. This shows the flags the user has on the server, if any: Dette viser de flag brugeren har på serveren, hvis der er nogen: On your friend list På din venneliste Authenticated user Autentificeret bruger Muted (manually muted by self) Mikrofon deaktiveret (manuelt deaktiveret af sig selv) Muted (manually muted by admin) Mikrofon deaktiveret (manuelt deaktiveret af admin) Muted (not allowed to speak in current channel) Mikrofon deaktiveret (har ikke tilladelse til at tale i nuværende kanal) Muted (muted by you, only on your machine) Mikrofon deaktiveret (deaktiveret af dig, og kun på din computer) Muted (push-to-mute) Deafened (by self) Lyd deaktiveret (af sig selv) Deafened (by admin) Lyd deaktiveret (af admin) User has a new comment set (click to show) Brugeren har sat en ny kommentar (klik for at vise) User has a comment set, which you've already seen. (click to show) Brugeren har sat en kommentar, som du allerede har set. (klik for at vise) Ignoring Text Messages Ignorerer tekstbeskeder This shows the flags the channel has, if any: Dette viser kanalernes flag, hvis der er nogen: Channel has a new comment set (click to show) Kanalen har fået en ny kommentar (klik for at vise) Channel has a comment set, which you've already seen. (click to show) Kanalen har en kommentar, som du allerede har set (klik for at vise) Channel will be hidden when filtering is enabled Kanalen vil blive skjult når filtrering aktiveres Name Navn Flags Flag Are you sure you want to drag this user? Are you sure you want to drag this channel? Er du sikker på, at du vil flytte denne kanal? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. Kan ikke udføre denne flytning automatisk. Vær venlig at nulstille de numeriske sorteringsindikatorer eller juster det manuelt. VersionCheck Upgrade Mumble Opgradér Mumble A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? En ny version af Mumble er blevet hentet automatisk. Det anbefales, at du enten opgraderer til denne version eller nedgraderer til den seneste stabile udgivelse. Ønsker du at starte installationsprogrammet nu? Failed to launch snapshot installer. Start af snapshot-installationsprogrammet mislykkedes. Corrupt download of new version detected. Automatically removed. Nyeste downloadede version er korrupt og blev automatisk fjernet. Downloading new snapshot from %1 to %2 Downloader nyt snapshot fra %1 til %2 Failed to write new version to disk. Failed to write new version to disc. Kunne ikke gemme ny version på disken. Mumble failed to retrieve version information from the central server. Det mislykkedes Mumble at hente version-information fra den centrale server. ViewCert Certificate Chain Details Certifikatkæde-detaljer Certificate chain Certifikatkæde Certificate details Certifikatdetaljer Common Name Organization Subunit Country Locality State Valid from: %1 Gyldig fra: %1 Valid to: %1 Gyldig til: %1 Serial: %1 Serial: %1 Public Key: %1 bits %2 Offentlig nøgle: %1 bits %2 RSA RSA DSA DSA Digest (SHA-1): %1 Digest (SHA-1): %1 Digest (SHA-256): %1 Email: %1 Email: %1 DNS: %1 DNS: %1 Issued by: Udstedt af: Unit Name VoiceRecorder Recorder failed to create directory '%1' Det mislykkeds optageren at oprette mappen '%1' Recorder failed to open file '%1' Det mislykkedes at åbne filen '%1' .wav - Uncompressed .wav - Ukomprimeret .ogg (Vorbis) - Compressed .ogg (Vorbis) - Komprimeret .au - Uncompressed .au - Ukomprimeret .flac - Lossless compressed .flac - Tabsfri komprimeret VoiceRecorderDialog Recorder Optager Control Kontrol 00:00:00 00:00:00 &Start &Start S&top S&top Mode Indstilling Multichannel Multikanal Output Output Output format Output format Target directory Målsti Filename Filnavn &Browse... &Gennemse... Valid variables are: Gyldige variabler er: Inserts the user's name Indsætter brugerens navn Inserts the current date Indsætter den nuværende dato Inserts the current time Indsætter det nuværende tidspunkt Inserts the hostname Indsætter værtsnavnet Recorder still running Optageren kører stadig Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? Lukning af optageren uden at stoppe den vil kassere lyd, der endnu ikke er nedskrevet. Vil du virkelig lukke optageren? Unable to start recording. Not connected to a server. Kunne ikke starte optagelse. Ikke forbundet til en server. The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. Serveren, som du i øjeblikket er forbundet til, er version 1.2.2 eller ældre. For at beskytte privatlivet er det ikke muligt at optage på servere ældre end version 1.2.3. Kontakt venligst din serveradministrator for yderligere information. There is already a recorder active for this server. Der er allerede en igangværende optagelse på denne server. Please select a recording format. Vælg venligst et optageformat. Stopping Stopper Select target directory Vælg målsti Downmix Nedmixet WASAPIInput Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone. WASAPISystem Default Device Standard enhed qwPTTButtonWidget Mumble PTT Mumble tryk-for-snak Push to talk Tryk for at snakke mumble-1.3.4/src/mumble/mumble_cs.ts0000664000175000017500000141152714010707274017243 0ustar builderbuilder ACLEditor Deny Zakázat Allow Povolit Allow %1 Povolit %1 Deny %1 Zakázat %1 Mumble - Add channel Mumble - Přidat kanál Default server value Výchozí hodnota serveru Failed: Invalid channel Selhalo: Neplatný kanál Mumble - Edit %1 Mumble - Upravit %1 ID: %1 ID: %1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Toto uděli privilegium %1. Pokud je privilegium zároveň povoleno i zakázáno, považuje se za odepřené.<br />%2 Channel must have a name Kanál musí mít jméno This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Toto odebere privilegium %1. Pokud je privilegium zároveň povoleno i zakázáno, považuje se za odepřené.<br />%2 Dialog Dialogové Okno Name Jméno Enter the channel name here. Zde zdejte jméno kanálu. Description Popis Password Heslo Enter the channel password here. Zde zadejte heslo kanálu. Check to create a temporary channel. Zaškrtněte pro vytvoření dočasného kanálu. Temporary Dočasný <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Umístění</b><br/> Tato hodnota Vám umožní změnit způsob, jakým Mumble uspořádá kanály ve stromu. Kanál s vyšší hodnotou <i>Umístění</i> bude vždy umístěn pod kanálem s nižší hodnotou a naopak. Pokud hodnota <i>Umístění</i> dvou kanálů je shodná, budou seřazeny abecedně podle jejích jména. Position Umístění &Groups &Skupiny Group Skupina List of groups Seznam skupin Remove selected group Odstranit vybranou skupinu Remove Odstranit Inherit group members from parent Zdědit členy skupiny od nadřazené Inherit Zdědit Make group inheritable to sub-channels Učiní skupinu děditelnou pro podkanály Inheritable Děditelné Group was inherited from parent channel Skupina byla zděděna od nadřazeného kanálu Inherited Zděděno Members Členové Add Přidat Add member to group Přidat člena do skupiny Remove member from group Odebrat uživatele ze skupiny &ACL &ACL Active ACLs Aktivní ACL List of entries Seznam záznamů Inherit ACL of parent? Zdědit ACL nadřazeného? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. Toto nastaví, jestli ACL, v řetězu nadřazených kanálů, budou aplikovány na tento objekt. Zděděny mohou být pouze záznamy označené v nadřazeném kanálu jako "použit na podkanály". Inherit ACLs Zdědit ACL Move entry up Přesunout záznam nahoru This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. Přesune záznam nahoru v seznamu. Protože záznamy pravidel jsou vyhodnocovány postupně, to může změnit privilegia přidělená uživateli. Nemůžete přesunout záznam nad zděděný záznam -- pokud je to opravdu potřeba pak musíte duplikovat zděděný záznam. &Up &Nahoru Move entry down Přesunout záznam dolů This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. Přesune záznam dolů v seznamu. Protože záznamy pravidel jsou vyhodnocovány postupně, může to změnit privilegia přidělená uživateli. &Down &Dolů Add new entry Přidat nový záznam This adds a new entry, initially set with no permissions and applying to all. Toto přidá nový záznam, ze záčátku nastaven bez jakýchkoli oprávnění a použitý na vše. &Add &Přidat Remove entry Odstranit záznam This removes the currently selected entry. Odstraní vybraný záznam. &Remove &Odstranit Context Kontext Entry should apply to this channel. Entry should apply to this channel Záznam by měl být použit pro tento kanál. This makes the entry apply to this channel. Tímto se daná položka použije pro tento kanál. Applies to this channel Použít pro tento kanál Entry should apply to sub-channels. Záznam by měl být použit v podkanálech. Add new group Přidat novou skupinu <b>Add</b><br/> Add a new group. <b>Přidat</b><br/> Přidat novou skupinu. Inherited members Zdědění členové Contains the list of members added to the group by this channel. Obsahuje seznam členů přidaných do skupiny tímto kanálem. Contains a list of members whose group membership will not be inherited from the parent channel. Obsahuje seznam členů, jejichž členství ve skupině nebude zděděno z nadřazeného kanálu. Contains the list of members inherited by other channels. Obsahuje seznam členů zděděných z jiných kanálů. Type in the name of a user you wish to add to the group and click Add. Zadejte jméno uživatele, kterého chcete do skupiny přidat a klikněte na Přidat. Type in the name of a user you wish to remove from the group and click Add. Zadejte jméno uživatele, kterého chcete ze skupiny odstranit a klikněte na Přidat. Exclude Vyřadit Excluded members Vyřazení členové This makes the entry apply to sub-channels of this channel. Tímto se daná položka stane platnou pro podkanály tohoto kanálu. Applies to sub-channels Použít pro podkanály Permissions Oprávnění User/Group Uživatel/skupina Group this entry applies to Skupina, na kterou je záznam použit User ID ID Uživatele User this entry applies to Uživatel, na kterého je záznam použit This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. Toto kontroluje, na kterého uživatele se záznam použije. Jednoduše napište jméno uživatele a stiskněte enter k prohledání serveru pro shodu. &Properties &Vlastnosti <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>Jméno</b><br />Zadejte do pole jméno kanálu. Jméno musí souhlasit s omezeními předepsaná serverem, ke kterému jste připojeni. <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>Dočasný</b><br /> Když je zaškrtnuto, kanál, který je vytvořen bude označen jako dočasný. To znamená, že když poslední hráč z kanálu odejde, bude automaticky ze serveru smazán. <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>Skupina</b><br /> Toto jsou všechny skupiny v současnosti definované pro kanál. Pro vytvoření nové skupiny, jednoduše zadejte jméno a stiskněte enter. <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>Odstranit</b><br />Toto odstraní právě zvolenou skupinu. Pokud skupina byla zděděna, nebude ze seznamu odstraněna, ale všechny místní informace o ní budou vyčištěny. <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>Zdědit</b><br />Toto zdědí všechny členy ve skupině z nadřazené, pokud je skupina v nadřazeném kanálu označena jako <i>Nezděditelná</i>. <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>Děditelná</b><br />Toto dělá skupinu děditelnou do podkanálů. Pokud je skupina neděditelná, podkanály stále můžou vytvořit nové skupiny se stejným jménem. <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>Zděděno</b><br />Toto označuje, že skupina byla zděděna z nadřazeného kanálu. Tuto možnost nemůžete upravit, je zde pouze pro informaci. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>Členové</b><br /> Tento seznam obsahuje všechny členy, kteří byli do skupiny přidáni současným kanálem. Nezapomeňte, že toto nezahrnuje členy zděděné vyššími úrovněmi stromu kanálů. Ti můžou být nalezeni v seznamu <i>Zdědění členové</i>. Aby se zabránilo zdědění tohoto seznamu kanály nižší úrovně, odškrtněte <i>Děditelné</i> nebo ručně členy přidejte do seznamu <i>Vyřazení členové</i>. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>Vyřazení členové</b><br /> Obsahuje seznam členů, jejichž členství ve skupině nebude zděděno z nadřazeného kanálu. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. <b>Zdědění členové</b><br /> Obsahuje seznam členů, zděděných současným kanálem. Odškrtněte <i>Zdědit</i>, abyste zabránili dědění z kanálů vyšší úrovně. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. Toto kontroluje, na kterou skupinu uživatelů se tento záznam použije.<br />Nezapomeňte, že skupina je vyhodnocena v kontextu kanálu, v kterém je záznam použit. Například, výchozí ACL v Kořenovém kanálu dává oprávnění k <i>Zápisu</i> skupině <i>admin</i>. Tento záznam, pokud je zděděn kanálem, dá uživateli oprávnění k zápisu, pokud patři do skupiny <i>admin</i> v onom kanálu, i když do skupiny <i>admin</i> nepatří v kanále kde ACL vznikl.<br />Pokud jméno skupiny začíná '!', její členství je znegováno, a pokud začíná '~', je vyhodnoceno v kanále, kde byl ACL definováno, spíše než kde je ACL aktivní.<br />Pokud jméno skupiny začíná '#',je vyloženo jako znak přístupu. Uživatelé musí zadat cokoliv, co následuje po '#' v jejich seznamu znaků přístupu ke shodě. Toto může být použito pro velmi jednoduchý přístup heslem do kanálů pro neověřené uživatele.<br >Pokud jméno skupiny začíná '$', skupina se bude shodovat pouze s uživateli, jejichž haš certifikátu se shoduje s tím co následuje po '$'.<br />Několik speciálních přednastavených skupin je:<br /><b>all</b>- Shoda se všemi.<br /><b>auth</b> - Všichni ověření uživatelé se budou shodovat.<br /><b>sub,a,b,c</b> - Uživatel současně v podkanále minimum <i>a</i> společných nadřazených, a mezi <i>b</i> a <i>c</i> kanály níže v řetězci. Navštivte stránku pro rozsáhlejší dokumentaci této skupiny.<br /><b>in</b> - Uživatelé, kteří jsou nyní v kanále se budou shodovat (nemusíte psát '<i>sub,0,0,0</i>').<br /><b>out</b> - Uživatelé mimo kanál se budou shodovat (nemusíte psát '<i>!sub,0,0,0</i>').<br />Nezapomeňte, že záznam bude použit buď na skupinu, nebo na uživatele, ne na obojí. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. <b>Heslo</b><br />Toto pole Vám dovolí jednoduše nastavit a změnit heslo kanálu. Používá funkci Mumble znaků přístupu v pozadí. Použijte ACL a skupiny, pokud potřebujete podrobnější a silnější kontrolu přístupu. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. Toto zobrazí všechny aktivní záznamy v tomto kanále. Záznamy zděděné z nadřazených kanálů budou zobrazeny kurzívou.<br />AACL jsou vyhodnocovány od shora dolů, což znamená, že se priorita zvyšuje, jak postupujete seznamem dolů. ID of the channel. ID kanálu. Maximum Users Maximum uživatelů Maximum number of users allowed in the channel Maximum povolených uživatelů v kanálu <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. <b>Maximum uživatel</b><br /> Tato hodnota Vám umožňuje nastavit maximální počet povolených uživatelů v kanále. Pokud je hodnota vyšší než nula, pak je povolen pouze daný počet uživatelů. Pokud je hodnota nula, pak je maximální počet určen výchozím nastavením serveru. This is the sort order for the channel. ALSAAudioInput Default ALSA Card Výchozí Karta ALSA Opening chosen ALSA Input failed: %1 Otevírání zvoleného ALSA vstupu selhalo: %1 ALSAAudioOutput Default ALSA Card Výchozí Karta ALSA Opening chosen ALSA Output failed: %1 Otevírání zvukového výstupu selhalo: %1 ASIOConfig %1 (version %2) %1 (verze %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz %1 -> %2 , velikost vyrovnávací paměti %3 rozlišení vzorku (%4 preferováno) při %5 Hz ASIO Initialization failed: %1 Spuštení ASIO selhalo: %1 Failed to instantiate ASIO driver Nelze instancovat ovladač ASIO ASIO ASIO Device selection Výběr zařízení Device Zařízení Device to use for microphone Zařízení, které použít jako mikrofon This chooses what device to query. You still need to actually query the device and select which channels to use. Toto zvolí, které zařízení má být dotázáno. Stále se musíte zařízení dotázat a vybrat, které kanály použít. Query selected device Dotázat se zvoleného zařízení This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. Toto se dotáže zvoleného zařízení pro kanály. Berte na vědomí, že mnoho ovladačů ASIO má mnoho chyb, a dotazovat se jich může způsobit pád aplikace nebo systému. &Query &Dotázat Configure selected device Nastavit zvolené zařízení This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. Toto nastaví zvolené zařízení. Berte na vědomí, že mnoho ovladačů ASIO má mnoho chyb, a dotazovat se jich může způsobit pád aplikace nebo systému. &Configure &Nastavit Capabilities Schopnosti Driver name Jméno ovladače Buffer size Velikost vyrovnávací paměti This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. Toto nastaví kanály vstupu pro ASIO. Ujistěte se, že vyberete alespoň jeden kanál jako mikrofon a reproduktor. <i>Mikrofon</i> by měl být tam, kde je Váš mikrofon připojen, a <i>Reproduktor</i> by měl být kanál, který vzorkuje '<i>To co slyšíte</i>'.<br />Například, na Audigy 2 ZS, dobrý výběr pro mikrofon by mohl být '<i>Mic L</i>' zatímco Reproduktor by mohl být '<i>Mix L</i>' a '<i>Mix R</i>'. Configure input channels Nastavit kanály vstupu Channels Kanály Microphone Mikrofon <- <- -> -> Unused Nepoužité Speakers Reproduktory ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. Musíte zvolit alespoň jeden zdroj mikrofonu a reproduktoru, abyste mohli ASIO použít. Pokud potřebujete vzorkovat pouze mikrofon, použijte DirectSound. Opening selected ASIO device failed. No input will be done. Otevření zvoleného zařízení ASIO selhalo. Žádný vstup nebude proveden. AboutDialog About Mumble O programu Mumble <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> <h3>Mumble (%1)</h3><p>%3</p><p><b>Nástroj pro hlasovou komunikaci hráčů</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble &O Mumble &License &Licenční ujednání A&uthors &Third-Party Licenses OK OK AudioInput Interface Rozhraní System Systém Input method for audio Vstupní metoda pro zvuk <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Toto je metoda vstupu pro zvuk.</b><br />Pravděpododně budete chtít použít DirectSound. Device Zařízení Input device for audio Vstupní metoda pro zvuk <b>This is the input device to use for audio.</b> <b>Toto je vstupní zařízení, použité pro zvuk.</b> Transmission Vysílání &Transmit &Vysílat When to transmit your speech Kdy vysílat Vaši řeč <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. Nastaví, kdy bude Vaše řeč vysílána.</b><br /><i>Průběžně</i> - neustále<br /><i>Při aktivitě hlasu</i> - když je zjištěna aktivita hlasu .<br /><i>Mluvení při stisku tlačítka</i> - mluvení je vysíláno, pouze když držíte stisknutou určenou klávesu pro mluvení. DoublePush Time Čas pro opětovné stisknutí If you press the PTT key twice in this time it will get locked. Pokud v tomto čase stisknete klávesu pro mluvení dvakrát, bude uzamčena. <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. <b>Čas pro opětovné stisknutí</b><br /> Pokud dvakrát zmáčknete klávesu pro mluvení během nastaveného intervalu, bude uzamčena. Mumble bude stále přenášet, dokud klávesu nestisknete ještě jednou pro znovu odemčení. Reset audio cue to default Resetovat zvukový signál na výchozí <b>Reset</b><br/>Reset the paths for the files to their default. <b>Resetovat</b><br/>Nastaví cesty k souborům na výchozí. Browse for on audio file Procházet pro soubor zvuku při zapnutí Browse for off audio file Procházet pro soubor zvuku při vypnutí Off Vypnuto On Zapnuto Preview the audio cues Náhled zvukových signálů Use SNR based speech detection Použít zjištění hlasu na základě poměru signál-šum Signal to Noise Signál-Šum <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. <b>Toto nastaví zjištění hlasu, aby používalo Amplitudu.</b><br /> V tomto režimu, je čistá síla vstupního signálu použita pro zjištění hlasu. Amplitude Amplituda Voice &Hold Podržení &Hlasu How long to keep transmitting after silence Jak dlouho se ještě vysílá po ukončení hlasové aktivity Silence Below Ticho Pod <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. <b>Toto nastaví spouštěcí hodnoty pro zjištění hlasu</b><br />Použijte toto spolu s oknem Statistika Zvuku, pro ruční ladění spouštěcích hodnot pro zjištění hlasu. Vstupní hodnoty níže než "Ticho Pod" jsou vždy brány jako ticho. Hodnoty výše než "Řeč Nad" jsou vždy brány jako hlas. Hodnoty mezi budou brány jako hlas, pokud již mluvíte, ale nespustí nové zjišťování. Speech Above Řeč Nad Signal values above this count as voice Hodnoty signálu výše než tato hodnota jsou brány jako hlas Compression Komprimace &Quality &Kvalita Quality of compression (peak bandwidth) Kvalita komprimace (maximální šířka pásma) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. <b>Toto nastaví kvalitu komprimace.</b><br /> To určí jakou šířku pásma může Mumble použít pro výstupní zvuk. Audio per packet Zvuk na paket How many audio frames to send per packet Kolik zvukových rámců poslat přes jeden paket <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>Vybere kolik zvukových rámců by mělo být dáno do jednoho paketu.</b><br />Zvětšením této hodnoty se zvětší zpoždění ve Vašem hlase, ale také sníží využití šířky pásma. <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). <b>Toto zobrazuje špičku využití odchozí šírky pásma.</b><br /> Toto zobrazuje špičku množství šírky pásma odeslané z Vašeho stroje. Bitový tok zvuku je nejvyšší (protože používáme VBR) pro samotná zvuková data. Pozice je bitový tok, používaný pro informace o pozici. Čas zpracování se skládá z našeho rámečkování a hlavičky paketů IP( IP a UDP tvoří 75% z tohoto času). Audio Processing Zpracování Zvuku Noise Suppression Potlačení Šumu Noise suppression Potlačení šumu <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. <b>Toto nastaví jak moc potlačení šumu použít.</b><br />Čím vyšší je hodnota, tím agresivněji bude neměnný hluk potlačen. Maximum amplification of input sound Maximální zesílení vstupního zvuku <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. <b>Maximální zesílení vstupu.</b><br />Mumble normalizuje hlasitost vstupu před komprimací, a toto nastavuje jak moc je dovoleno zesilovat.<br />Skutečná úroveň je neustále aktualizována podle Vaši současné řeči, ale nikdy nepřesáhne úroveň zadanou zde.<br />Pokud úroveň<i>Hlasitosti Mikrofonu</i> statistiky zvuku se pohybuje okol 100%, pravděpodobně budete toto chtít nastavit na 2.0 nebo tak nějak, ale pokud, jako většina lidí, nemůžete 100% dosáhnout, tak toto nastavte na mnohem větší úroveň.<br /> Ideálně to nastavte na <i>Hlasitost Mikrofonu * Faktor Zesílení >= 100</i>, i když mluvíte velmi jemně.<br /><br />Nezapomeňte, že neuškodí toto nastavit na maximum, ale Mumble začne zachycovat jiné konverzace, pokud ho necháte toto automaticky nastavit na tuto úroveň. Current speech detection chance Současná šance zjištění řeči Cancel echo from speakers Vyrušit ozvěnu z reproduktorů Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. Povolením tohoto zrušíte ozvěnu z Vašich reproduktorů. Smíšená má malý dopad na procesor, ale funguje dobře pouze, pokud mají reproduktory stejnou hlasitost a jsou ve stejné vzdálenosti od mikrofonu. Vícekanálové rušení ozvěny poskytuje mnohem lepší rušení ozvěny, ale za vyšší požadavky na procesor. Disabled Vypnuto <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>Toto nastaví zjištění řeči, aby používalo poměr Signál-Šum.</b><br />V tomto režimu je vstup analyzován pro něco připomínající čistý signál, a čistota tohoto signálu je použita při spuštění zjištění řeči. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>Toto zobrazuje současné nastavení zjištění řeči.</b><br />Tato nastavení můžete měnit z dialogového okna Nastavení nebo z Průvodce Zvukem. Signal values below this count as silence Hodnoty signálu nížší než tento počet jsou brány jako ticho Maximum bandwidth used for sending audio Maximální šířka pásma použitá pro odesílání zvuku Use Amplitude based speech detection Použít zjištění řeči na základě Amplitudy <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). <b>Toto zvolí, jak dlouho po domnělém zastavení by mělo odesílání pokračovat.</b><br />Nastavte toto výše, pokud se Váš hlas při mluvení láme (jak můžete vidět díky rychle blikající ikoně zvuku vedle Vašeho jména). Exclusive mode Výhradní režim <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>Toto otevře zařízení ve výhradním režimu.</b><br /> Žádná jiná aplikace nebude schopna toto zařízení použít. Exclusive Výhradně R&eset R&esetovat &Browse... &Procházet... B&rowse... P&rocházet... &Preview &Náhled <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. <b>Náhled</b><br/>Přehraje aktuální zvuk <i>zapnutí</i> následován aktuálním zvukem <i>vypnutí</i>. Displays an always on top window with a push to talk button in it Zobrazí okno, které je vždycky nahoře a v něm tlačítko pro mluvení Display push to talk window Zobrazit okno tlačítka pro pro mluvení Misc Ostatní Audible audio cue when starting or stopping to transmit Slyšitelné zvukové znamení při spuštění, nebo zastavení přenosu <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. <b>Toto zapíná zvuková znamení přenosu.</b><br />Nastavením tohoto Vám dá krátké pípnutí, když spustíte, nebo zastavíte přenos. Audio cue Zvukové znamení Gets played when starting to transmit Je přehráno při spuštění přenosu Gets played when stopping to transmit Je přehráno při zastavení přenosu Hold Time Doba podržení Time the microphone stays open after the PTT key is released Doba, kdy mikrofon stále přijímá po uvolnění klávesy pro mluvení Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) Maximální propustnost sítě na serveru je %1 kbit/s. Kvalita zvuku byla automaticky upravena na %2 kbit/s (%3 ms) Max. Amplification Max. zesílení Idle action Akce při nečinnosti minutes do minutách provést nothing nic deafen ohlušit mute ztlumit after po Echo Cancellation Potlačení ozvěny Mixed echo cancellation Potlačení smíšené ozvěny Multichannel echo cancellation Potlačení vícekanálové ozvěny The idle action will be reversed upon any key or mouse button input Undo Idle action upon activity Apply RNNoise's noise suppression filter. <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. RNNoise Audio input AudioInputDialog Continuous Průběžný Voice Activity Při aktivitě hlasu Push To Talk Mluvení při stisku tlačítka Audio Input Vstup Zvuku %1 ms %1 ms Off Vypnuto %1 s %1 s %1 kb/s %1 kb/s -%1 dB -%1 dB %1 kbit/s (Audio %2, Position %4, Overhead %3) %1 kbit/s (Zvuk %2, Pozice %4, Čas na zpracování %3) AudioOutput Interface Rozhraní System Systém Output method for audio Vstupní metoda pro zvuk <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Toto je výstupní metoda k použití pro zvuk.</b><br /> Pravděpodobně budete chtít použít DirectSound. Device Zařízení Output device for audio Výstupní zařízení pro zvuk <b>This is the output device to use for audio.</b> <b>Toto je výstupní zařízení k použití pro zvuk.</b> Positional Audio Poziční Zvuk Audio Output Výstup Zvuku Default &Jitter Buffer &Výchozí vyr. pam. chvění Safety margin for jitter buffer Bezpečnostní hranice pro vyrovnávací pamět chvění <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. <b>Toto nastaví minimální bezpečnostní hranici pro vyrovnávací paměť chvění.</b><br />Veškerý příchozí zvuk je uložen, a vyrovnávací paměť chvění se neustále snaží vyrovnávací paměť dotlačit na minimum udržitelné Vaší sítí, aby bylo zpoždění co nejmenší. Toto nastaví minimální velikost vyrovnávací paměti, kterou použít. Pokud je začátek vět, které slyšíte velmi roztřesený, tuto hodnotu zvyšte. Minimum distance to user before sound volume decreases Minimální vzdálenost od uživatele před snížením hlasitosti zvuku This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. Toto nastaví minimální vzdálenost pro kalkulace zvuku. Hlasitost řeči ostatních uživatelů se nesníží, dokud nebudou mít alespoň tuto vzdálenost. This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. Toto nastaví maximálníí vzdálenost pro kalkulace zvuku. Když mají uživatelé vzdálenost větší než toto, jejich hlasitost řeči se již nebude dále snižovat. <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. <b> Toto povolí jeden z testovacích režimů zpětné smyčky.</b><br /><i>Žádná</i> - Zpětná smyčka zakázána<br /><i>Místní</i> - Emulovat místní server.<br /><i>Server</i> - Požádat o zpětnou smyčku ze serveru.</br> Uvědomte si, prosím, že když je zpětná smyčka zapnuta, ostatní uživatelé neuslyší Váš hlas. Toto nastavení se při ukončení aplikace neukládá. Volume Hlasitost Volume of incoming speech Hlasitost příchozí řeči <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. <b>Toto upraví hlasitost příchozí řeči.</b><br />Nezapomeňte , že pokud toto zvýšíte nad 100%, bude zvuk zkreslený. Output Delay Spoždění výstupu Amount of data to buffer Množství dat k uložení do vyrovnávací paměti The connected "speakers" are actually headphones The connected "speakers" are actually headphones. Připojené "reproduktory" jsou vlastně sluchátka Factor for sound volume decrease Faktor pro snížení hlasitosti zvuku Bloom Bloom Factor for sound volume increase Faktor pro zvýšení hlasitosti How much should sound volume increase for sources that are really close? Jak moc by se měla hlasitost zvuku zvyšovat pro zdroje, které jsou velmi blízko? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. Když toto zaškrtnete, označujete tím, že nemáte připojené reproduktory, ale pouze sluchátka. To je důležité, protože reproduktory jsou většinou přímo před Vámi, zatímco sluchátka jsou od Vás přímo nalevo/napravo. This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Toto nastaví množství dat pro před uložení do vyrovnávací paměti výstupu. Zkoušejte různé hodnoty a nastavte toto na nejnižší hodnotu, která ve zvuku nezpůsobuje rychlé chvění. Headphones Sluchátka Minimum Distance Minimální Vzdálenost Maximum Distance Maximální Vzdálenost Maximum distance, beyond which speech volume won't decrease Maximální vzdálenost, za níž se hlasitost řeči nebude zvyšovat Minimum Volume Minimální Hlasitost What should the volume be at the maximum distance? Jaká by měla být hlasitost při maximálni vzdálenosti? Loopback Test Testování zpětné smyčky Delay Variance Variace Zpoždění Variance in packet latency Variace ve zpoždění paketů <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>Toto nastaví variaci zpoždění paketů pro testování zpětné smyčky.</b><br />Většina zvukových cest obsahuje nějakou variaci zpoždění. Tímto je Vám umožněno tuto variaci nastavit pro test zpětné smyčky. Například, pokud ji nastavite na 15ms, tak bude síť emulována s 20-35ms zpožděním odezvy nebo síť se zpožděním 80-95ms. Většina domácích síťových připojení má variaci okolo 5ms. Packet Loss Ztráta paketů Packet loss for loopback mode Ztráta paketů pro režim zpětné smyčky <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% <b>Toto nastaví ztrátu paketů do režimu zpětné smyčky.</b><br /> Toto bude poměr ztracených paketů. Pokud Vaše odchozí připojení není intenzivně používáno, nebo není něco v nepořádku s Vaším síťovým připojením, toto by mělo být 0% &Loopback &Zpětná smyčka Desired loopback mode Požadovaný režim zpětné smyčky Attenuate applications by... Ztišit aplikace o... Attenuation of other applications during speech Ztišení ostatních aplikací během mluvení <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. <b>Ztišit hlasitost ostatních aplikací během mluvení</b><br />Mumble podporuje zmenšení hlasitosti jiných aplikací při příchozí a/nebo odchozí řeči. Toto nastaví ztišení ostatních aplikací, je-li funkce zapnuta. If checked Mumble lowers the volume of other applications while other users talk Pokud toto zaškrtnete, Mumble sníží hlasitost ostatních aplikací, když mluví ostatní <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. <b>Ztišit aplikace, když ostatní uživatelé mluví</b><br />Mumble podporuje zmenšení hlasitosti jiných aplikací při příchozí a/nebo odchozí řeči. Tímto Mumble funkci aktivuje, když ostatní uživatelé mluví k Vám. while other users talk když ostatní mluví If checked Mumble lowers the volume of other applications while you talk Pokud je zaškrtnuto, Mumble sníží hlasitost ostatních plikací, když Vy mluvíte <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. <b>Ztišit aplikace, když Vy mluvíte.</b><br />Mumble podporuje zmenšení hlasitosti jiných aplikací při příchozí a/nebo odchozí řeči. Tímto Mumble funkci aktivuje, když Vy mluvíte. while you talk když Vy mluvíte Exclusive mode, not recommended. Výhradní režim, nedoporučuje se. <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>Toto otevře zařízení ve výhradním režimu.</b><br /> Žádná jiná aplikace nebude schopna toto zařízení použít. Exclusive Výhradně Priority Speaker Přednostní Řečník If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. Při zaškrtnutí Mumble sníží hlasitost ostatních uživatelů, pokud mluvíte a máte stav "Přednostní řečník". <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. <b>Ztlumit ostatní uživatele když mkuvíte jako Přednostní Řečník.</b><br />Mumble podporuje snížení hlasitosti ostatních uživatelů, když mluvítejako <i>Přednostní Řečník</i>, abyste nemuseli být rušeni. Zaškrtnutím tohoto políčka tuto možnost povolíte. Attenuate other users while talking as Priority Speaker. Ztlumit ostatní uživatele když mkuvíte jako Přednostní Řečník. Advanced Attenuation Options Pokročilé možnosti tlumení If checked, Mumble will only attenuate applications that are using the same output source as Mumble Při zaškrtnutí Mumble ztlumí pouze aplikace, které používají stejný výstupní zdroj jako Mumble <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. <b>Ztlumit pouze ty aplikace, které používají stejný výstupní zdroj jako Mumble</b><br />Při zaškrtnutí nebudou ztlumeny aplikace, které používají výstup odlišný od Mumble. Only attenuate applications using the same output device Ztlumit aplikace které používají stejné výstupní zařízení If checked, PulseAudio loopback modules will be attenuated Při zaškrtnutí budou ztlumeny modul zpětné smyčky PulseAudio <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. <b>Ztlumit moduly zpětné smyčky PulseAudio</b><br />Tyto moduly budou také ztišeny, pokud jsou připojeny k výstupnímu zařízení/spotřebiči Mumble. Attenuate PulseAudio loopback modules Ztlumit moduly zpětné smyčky PulseAudio Audio output AudioOutputDialog None Žádná Local Místní Server Server Audio Output Výstup Zvuku %1 ms %1 ms %1 % %1 % %1 m %1 m AudioOutputSample Choose sound file Zvolte zvukový soubor Invalid sound file Neplatný zvukový soubor The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. Mumble nemůže soubor '%1' použít. Vyberte, prosím, soubor s kompatibilním formátem a kódováním. AudioStats >1000 ms >1000ms >1000 ms Audio Statistics Statistiky Zvuku Input Levels Hladiny Vstupu Peak microphone level Nejvyšší úroveň mikrofonu Peak power in last frame Max. výkon v posledním rámci This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. Toto zobrazuje nejvyšší výkon v posledním rámci (20 ms), a je to stejné měření, které byste normálně našli pojmenované jako "síla vstupu". Tohoto si, prosím, nevšímejte a podívejte se místo toho na <b>Sílu mikrofonu</b>, které je mnohem stabilnější a nevšímá si extrémních výchylek. Peak speaker level Nejvyšší úroveň výstupu This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. Ukazuje maximální výkon reproduktorů za poslední snímek (20 ms). Pokud nepoužíváte vícekanálovou vzorkovací metodu (jako např. ASIO) s nastavenými kanály reproduktoru, pak tato hodnota bude rovna 0. Pokud máte takové nastavení a stále vidíte 0 zatímco jiné aplikace hrají zvuk, Vaše nastavení asi není v pořádku. Peak clean level Nejnižší klidová úroveň This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. Toto zobrazuje nejvyšší výkon v posledním rámci (20 ms) po veškerém zpracování. Ideálně by toto mělo být -96 dB, když nemluvíte. Ve skutečnosti by hodnota ve zvukovém studiu měla být -60 dB, a Vy byste měli mít něco okolo -20 dB. Když mluvíte, tak by měla vzrůst na něco mezi -5 a -10 dB.<br />Pokud používáte vyrušení ozvěny a hodnota vzroste na více než -15 dB, když nemluvíte, Vaše nastavení nefunguje, a Vy budete ostatní uživatele otravovat ozvěnami. Signal Analysis Analýza Signálu Microphone power Síla mikrofonu How close the current input level is to ideal Jak blízko je současná hlasitost vstupu k ideální hlasitosti This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. Toto zobrazuje jak blízko je současný vstup k ideálnímu. Pro úpravu hladiny Vašeho mikrofonu, otevřete jakýkoli program, který používáte pro úpravu hlasitosti nahrávání,a podívejte na hodnotu zde, když mluvíte<br /><b> Mluvte tak hlasitě, jako když jste rozčílení, že Vás nějaká lama zastřelila.</b><br />Upravte hlasitost dokud hodnota nebude blízko ke 100%, ale ujistěte se, že nebude vyšší. Pokud bude výš, pravděpodobně budou části Vaši řeči oříznuty, což sníží kvalitu zvuku. Signal-To-Noise ratio Poměr zvuku k šumu Signal-To-Noise ratio from the microphone Poměr Signál-Šum z mikrofonu This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. Toto je poměr signál-šum mikrofonu v posledním snímku (20 ms). Ukazuje jak je čistý hlas v porovnání s hlukem.<br /> Pokud je tato hodnota pod 1.0, je šum silnější než hlas a kvalita je tedy snížena. <br /> Neexistuje žádný horní limit pro tuto hodnotu, ale neočekávejte hodnoty větší než 40 nebo 50 bez zvukového studia. Speech Probability Pravděpodobnost řeči Probability of speech Pravděpodobnost, že se mluví This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). Toto je pravděpodobnost, že poslední zvukový rámec (20 ms) byla řeč, ne jenom šum okolního prostředí.<br /> Přenos při hlasová aktivitě ns tomto závisí. Trik je v tom, že prostředek věty je vždy rozpoznána jako řeč; problémem jsou pauzy mezi slovy a začátek mluvení. Je obtížné rozpoznat povzdech od slova, začínajícího na 'h'.<br /> Pokud je toto zobrazeno tučně, znamená to, že nyní probíhá přenos. Configuration feedback Zpětná vazba nastavení Current audio bitrate Současný bitový tok zvuku Bitrate of last frame Šířka zvukového pásma DoublePush interval Interval Opětovného stisknutí Time between last two Push-To-Talk presses Čas mezi posledními dvěma stisknutími klávesy pro mluvení Speech Detection Detekce Řeči Current speech detection chance Současná šance zjištění řeči <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>Toto zobrazuje současná nastavení zjištění řeči.</b><br />Tato nastavení můžete změnit v dialogovém okně Nastavení nebo z Průvodce Zvukem. Signal and noise power spectrum Výkonové spektrum signálu a šumu Power spectrum of input signal and noise estimate Výkonové spektrum vstupního signálu a odhad šumu This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. Ukazuje výkonové spektrum aktuálního vstupního signálu (červená čára) a aktuální odhad šumu (vyplněno modře).<br />Všechny amplitudy jsou vynásobeny 30x aby byly vidět zajímavé části (jak moc je signál větší než hluk, přítomný v každém vlnovém pásmu).<br /> Toto je pravděpodobně zajímavé pouze, pokud zkoušíte vyladit šumové podmínky Vašeho mikrofonu. V dobrých podmínkách bude dole pouze malé chvění modré. Pokud modrá oblast dosahuje do poloviny výšky grafu, znamená to, že máte velmi rušné prostředí. Echo Analysis Analýza ozvěny Weights of the echo canceller Intenzita snahy o odstranění ozvěny This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. Toto zobrazuje váhy rušitele ozvěny s časem zvyšujícím se dolů a frekvencí zvyšující se doprava.<br /> Ideálně by toto mělo být černé, což znamená, že neexistuje žádná ozvěna. Běžně budete mít jednu nebo více vodorovných modrých čar, označující časově zpožděnou ozvěnu. Měli byste vidět, jak jsou váhy aktualizovány ve skutečném čase.<br />Uvědomte si, prosím, že dokud nebudete mít něco, od čeho ozvěnu odrážet, tak zde moc užitečná data neuvidíte. Přehrajte nějakou hudbu a věci by se měli ustálit. <br /> Můžete si zvolit k zobrazení skutečné nebo domnělé části vah kmitočtového pásma, nebo jinak vypočítaná modulace a fáze. Z těchto bude asi nejužitečnější modulace, což je amplituda ozvěny, a ukazuje kolik výstupního signálu je v onom časovém kroku odstraněno. Ostatní režimy zobrazení jsou většinou užitečné pro lidi, kteří si chtějí vyladit jejich algoritmy vyrušení ozvěny.<br /> Uvědomte si, prosím, že pokud se celý obrázek hodně mění, když je v režimu modulace, rušitel ozvěny nemůže najít žádnou souvztažnost mezi dvěma vstupními zdroji (reproduktory a mikrofon). Buď máte velmi dlouhou prodlevu ozvěny, nebo jeden ze vstupních zdrojů není správně nastaven. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. Toto je bitový tok posledního komprimovaného rámce (20ms), a jako takový bude skákat nahoru a dolů jak VBR upravuje kvalitu. Nejvyšší bitový tok může být upraven v dialogovém okně Nastavení. AudioWizard Audio Tuning Wizard Průvodce Laděním Zvuku Introduction Úvod Welcome to the Mumble Audio Wizard Vítejte v průvodci nastavením zvuku pro aplikaci Mumble Finished Dokončeno Enjoy using Mumble Užijte si používání Mumble Device selection Výběr zařízení Selecting the input and output device to use with Mumble. Vyberte vstupní a výstupní zařízení pro použití v Mumble. This is the device your microphone is connected to. Toto je zařízení, do kterého je Váš mikrofon připojen. System Systém Input method for audio Vstupní metoda pro zvuk <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Toto je vstupní metoda k použíti pro zvuk.</b><br /> Pravděpodobně budete chtít použít DirectSound. Device Zařízení Input device to use Které vstupní zařízení použít <b>Selects which sound card to use for audio input.</b> <b>Vybere, která zvuková karta bude použita pro zvukový vstup.</b> Cancel echo from headset or speakers Zrušit ozvěnu z reproduktorů nebo sluchátek Use echo cancellation Použít vyrušení ozvěny This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. Toto povolí vyrušení ozvěny ve výstupním zvuku, což pomáhá jak na reproduktorech, tak na sluchátcích. This is the device your speakers or headphones are connected to. Zařízení, ke kterému jsou připojeny Vaše reproduktory nebo sluchátka. Output method for audio Výstupní metoda pro zvuk <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Toto je výstupní metoda k použíti pro zvuk</b><br /> Pravděpodobně budete chtít použít DirectSound. Output device to use Které výstupní zařízení použít <b>Selects which sound card to use for audio Output.</b> <b>Vybere, která zvuková karta bude použita pro Výstup zvuku.</b> Enable positional audio Zapnout poziční zvuk Allows positioning of sound Allows positioning of sound. Povolí umísťování zvuku <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> <p> Toto je průvodce laděním zvuku pro Mumble. Pomůže Vám správně nastavit vstupní úrovně Vaši zvukové karty, a také nastavit správné parametry pro zpracování zvuku v Mumble </p> <p> Uvědomte si, prosím, že dokud bude tento průvodce spuštěn, zvuk bude ve smyčce posílán zpátky k Vám, abyste si ho mohli poslechnout, a žádný zvuk nebude odeslán na server. </p> Input Device Vstupní Zařízení Output Device Výstupní Zařízení This allows Mumble to use positional audio to place voices. Toto povolí Mumble používat poziční zvuk pro umístění hlasů. <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> <p> Aby bylo zpoždění co nejmenší, je důležité na zvukovou kartu ukládat co nejméně zvuku, jak jen to jde. Nicméně, mnoho zvukových karet hlásí, že potřebují mnohem menší vyrovnávací pameť, než s čím můžou ve skutečnosti pracovat, takže jediný způsob, jak tuto hodnotu nastavit je pokus-omyl. </p> <p> Měli byste slyšet ukázku hlasu. Změňte šoupátko pod nejnižší hodnotu, která ve zvuku nedává <b>žádné</b> přerušení nebo chvění. Nezapomeňte, prosím, že místní ozvěna je během tohoto tesu vypnuta. </p> Amount of data to buffer Množství dat k uložení This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Toto nastaví množství dat pro před uložení do vyrovnávací paměti výstupu. Zkoušejte různé hodnoty a nastavte toto na nejnižší hodnotu, která ve zvuku nezpůsobuje rychlé chvění. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> <p> Otevřete Váš ovládací panel zvuku a jděte do nastavení záznamu. Ujistěte se, že je mikrofon vybrán jako aktivní vstup s maximální hlasitostí záznamu. Pokud existuje také možnost povolit "Zesílení Mikrofonu" ujistěte se, že je zaškrtnuta. </p> <p> Mluvte nahlas, jako kdybyste byli podráždění nebo nadšení. Snižujte hlasitost v kontrolním panelu zvuk, dokud lišta níže zůstane nejvýše, jak je to možné, v modré a zelené ale <b>ne</b> červené oblasti, zatímco vy mluvíte. </p> Positional Audio Poziční Zvuk Adjusting attenuation of positional audio. Úprava ztišení pozičního zvuku. <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> <p> Mumble podporuje v některých hrách poziční audio, a umístí hlasy ostatních uživatelů relativně k jejich pozici ve hře. V závislosti na jejich pozici, hlasitost hlasu bude v reproduktorech měněna, aby napodobila směr a vzdálenost, kde se jiný uživatel nachází. Takovéto umisťování závisí na správnosti nastavení Vašich reproduktorů ve Vašem operačním systému, proto se zde dělá test. </p> <p> Graf níže zobrazuje <font color="red">Vaši</font> pozici, <font color="yellow">reproduktorů</font> a <font color="green">hýbajícího se zdroje zvuku</font>, jak můžete vidět výše. Měli byste slyšet, jak se zvuk mezi kanály pohybuje. </p> Use headphones instead of speakers Použít sluchátka místo reproduktorů <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> <p> Gratulujeme. Nyní byste měli být připraveni si vychutnat bohatší zážitek ze zvuku pomocí Mumble. </p> <p> Mumble je pod neustálým vývojem, a tým vývojářů se chce zaměřit na funkce, které nejvíce vyhovoují uživatelům. Za tímto účelem, Mumble podporuje zasílání vývojářům anonymní statistiky o Vašem nastavení. Tyto statistiky jsou zásadní pro budoucí vývoj, a také zajišťují, že funkce, které používáte, nejsou zavrhnuty. </p> Use headphones Použít sluchátka This ignores the OS speaker configuration and configures the positioning for headphones instead. Toto ignoruje nastavení reproduktorů v OS a místo toho nastaví umístění sluchátek. Volume tuning Vyladění hlasitosti Tuning microphone hardware volume to optimal settings. Ladění hardwarové hlasitosti mikrofonu na optimální nastavení. Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. Nyní mluvte potichu, jako kdybyste mluvili pozdě v noci a nechtěli nikoho rušit. Nastavte táhlo níže tak, aby se při mluvení lišta pohybovala v zelené oblasti, ale aby zůstala v modré oblasti, když jste potichu. Voice Activity Detection Zjištění hlasové aktivity Letting Mumble figure out when you're talking and when you're silent. Nechat na Mumble, aby rozpoznal, kdy mluvíte a kdy jste potichu. This will help Mumble figure out when you are talking. The first step is selecting which data value to use. Toto pomůže aplikaci Mumble rozpoznat, kdy mluvíte. První krok je výběr, podle které hodnoty dat se má rozpoznání provádět. Raw amplitude from input Čistá amplituda ze vstupu Signal-To-Noise ratio Poměr zvuku k šumu Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Nyní je potřeba nastavit následující dvě hodnoty. Prvních několik Vašich slabik by mělo skončit v zelené oblasti (určitě řeč). Pokud mluvíte, měli byste zůstávat ve žluté (pravděpodobně řeč)a když nemluvíte, vše by mělo být v červené oblasti (určitě není řeč). Device tuning Vyladění zařízení Changing hardware output delays to their minimum value. Změna zpoždění výstupu hardwaru na jeho minimální hodnotu. Submit anonymous statistics to the Mumble project Posílat anonymní statistiky projektu Mumble Push To Talk: Klávesa Pro Mluvení: Quality & Notifications Kvalita & oznámení Adjust quality and notification settings. Upraví kvalitu a nastavení oznamení. Quality settings Nastavení kvality Low Nízké Balanced Vyrovnané Notification settings Nastavení oznamení Use Text-To-Speech to read notifications and messages to you. Použít Text-Na-Řeč pro čtení oznámení a zpráv pro Vás. Disable Text-To-Speech and use sounds instead. Vypnout Text-Na-Řeč a míst toho použít zvuky. %1 ms %1 ms Enables attenuation of other applications while users talk to you Povolí ztišení ostatních aplikací, když uživatelé mluví k Vám Attenuate applications while other users talk Ztiší aplikace, když ostatní uživatelé mluví High Vysoké Custom Vlastní You already set a customized quality configuration in Mumble. Select this setting to keep it. Již jste nastavili vlastní nastavení kvality v Mumble. Vyberte toto nastavení pro jeho uchování. Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. Zapne ztišení jiných aplikací, když uživatelé mluví k Vám. To znamená, že jakmile někdo začne v Mumble mluvit k Vám, zvuk ostatních aplikací (jako hudební přehrávače), bude ztišen, abyste je mohli lépe slyšet. Apply some high contrast optimizations for visually impaired users Použít některé vysoko kontrastní optimalizace pro zrakově postižené uživatele Use high contrast graphics Použít grafiku s vysokým kontrastem Keep custom Text-To-Speech settings. Ponechat vlastní nastavení Text-Na-Řeč. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode <p> Otevřete Váš ovládací panel zvuku a jděte do nastavení záznamu. Ujistěte se, že je mikrofon vybrán jako aktivní vstup s maximální hlasitostí záznamu. Pokud existuje také možnost povolit "Zesílení Mikrofonu" ujistěte se, že je zaškrtnuta. </p> <p> Mluvte nahlas, jako kdybyste byli podráždění nebo nadšení. Snižujte hlasitost v kontrolním panelu zvuk, dokud lišta níže zůstane nejvýše, jak je to možné, v pruhované a prázdné, ale <b>ne</b> křížkované oblasti, zatímco vy mluvíte. </p> Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode Nyní mluvte potichu, jako kdybyste mluvili pozdě v noci a nechtěli nikoho rušit. Nastavte šoupátko níže tak, aby se při mluvení lišta posunula do prázdné oblasti, ale zůstala v pruhované, když jste potichu. Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode Nyní je potřeba nastavit následující dvě hodnoty. Prvních několik Vašich slabik by mělo skončit v prázdné oblasti (určitě řeč). Pokud mluvíte, měli byste zůstávat v pruhované (pravděpodobně řeč)a když nemluvíte, vše by mělo být v křížkované oblasti (určitě není řeč). In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) V tomto nastavení Mumble použije <b>malé množství šířky pásma</b>. Toto nevyhnutelně vyústí ve vysoké zpoždění a špatnou kvalitu. Toto si zvolte pouze, pokud Vaše připojení ostatní nastavení nezvládne. (16kbit/s, 60ms na paket) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) Toto je <b>výchozí doporučené</b> nastavení. Poskytuje dobrou rovnováhu mezi kvalitou, zpožděním a využití šířky pásma. (40kbit/s, 20ms na paket) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) Toto nastavení je doporučené pouze v systému, kde šířka pásma není problém, jako například LAN. Poskytuje nejnižší zpoždění, které Mumble podporuje a <b>vysokou kvalitu</b>. (72kbit/s, 10ms na paket) BanEditor Mumble - Edit Bans Mumble - Upravit zákazy &Address &Adresa &Mask &Maska Reason Důvod Start Začátek End Konec User Uživatel Hash Hash &Add Přid&at &Update Akt&ualizovat &Remove Odst&ranit Ban List Seznam zákazů Search field Pole vyhledávání This is the search field. Use it to find bans that have this username set in the username field. Toto je pole pro vyhledávání. Použíjte ho k nalezení zákazů, které mají v poli uživatelské jméno nastaveny na zadanou hodnotu. Who are you looking for? Koho hledáte? No nickname Žádná přezdívka IP address IP adresa No IP address Žádná IP adresa Reason for the ban Důvod zákazu No reason Bez důvodu Ban end date Datum konce zákazu Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). Datum konce zákazu. Pokud nastavíte stejné datum pro začátek i konec, bude zákaz platit pořád (nikdy nevyprší). Certificate hash Hash certifikátu No certificate hash Žádný hash certifikátu Banned users Zakázaní uživatelé This is a list with banned users. Toto je seznam zakázaných uživatelů. Use this button if you want to add a new ban. Toto tlačítko použijte pro přidání nového zákazu. Use this button if you want to update ban information. Toto tlačítko použijte pro aktualizaci informací o zákazu. Use this button if you want to remove user from the ban list. Toto tlačítko použijte pro odstranění uživatele ze seznamu zákazů. Clear all fields Vyčistit všechna pole This button clears all fields. Use it if you want to add a new ban. Toto tlačítko vyčistí všechna pole. Použijte pokud chcete přidat nový zákaz. Clear Vyčistit Ban List - %n Ban(s) Seznam zákazů - %n zákazSeznam zákazů - %n zákazySeznam zákazů - %n zákazůSeznam zákazů - %n zákazů CertView Name Jméno Email E-mail Issuer Vydal Expiry Date Platný do (none) (žádný) Self-signed Podepsaný sám sebou CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. Nelze potvrdit e-mail.<br />Pro pokračování zadejte platný (nebo prázdný) e-mail. There was an error generating your certificate.<br />Please try again. Při vytváření Vašeho certifikátu došlo k chybě.<br />Zkuste to, prosím, znovu. Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. Váš certifikát a klíč nemohli být exportovány do formátu PKCS#12. Ve Vašem certifikátu může být chyba. The file could not be opened for writing. Please use another file. Soubor nemohl být otevřen pro zápis. Použijte, prosím, jiný soubor. The file's permissions could not be set. No certificate and key has been written. Please use another file. Oprávnění souboru nemohla být nastavena. Certifikát a klíč nebyly zapsány. Prosím použijte jiný soubor. The file could not be written successfully. Please use another file. Soubor nemohl být úspěšně zapsán. Použijte, prosím, jiný soubor. The file could not be opened for reading. Please use another file. Soubor nemohl být otevřen pro čtení. Použijte, prosím, jiný soubor. The file is empty or could not be read. Please use another file. Soubor je prázdný, nebo z něj nelze číst. Použijte, prosím, jiný soubor. The file did not contain a valid certificate and key. Please use another file. Soubor neobsahoval platný certifikát a klíč. Použijte, prosím, jiný soubor. Select file to export certificate to Vyberte soubor, do kterého certifikát exportovat Select file to import certificate from Vyberte soubor, z kterého certifikát importovat Unable to import. Missing password or incompatible file type. <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. <b>Vypršení Certifikátu:</b> Váš certifikát brzy vyprší. Musíte ho obnovit, nebo se už nebudete moci připojit k serverům, na kterých jste registrování. Certificates Certificate Management Správce Certifikátů Certificate Authentication Ověření Certifikátů Authenticating to servers without using passwords Ověřování pomocí serveru bez použití hesel Current certificate Současný Certifikát This is the certificate Mumble currently uses. Toto je certifikát, který Mumble v současnosti používá. Current Certificate Současný Certifikát Create a new certificate Vytvořit nový certifikát This will create a new certificate. Toto vytvoří nový certifikát. Import certificate from file Importovat certifikát ze souboru This will import a certificate from file. Toto importuje certifikát ze souboru. Import a certificate Importovat certifikát Export Certificate Exportovat certifikát This will export a certificate to file. Toto exportuje certifikát do souboru. Export current certificate Exportovat současný certifikát Import Certificate Importovat Certifikát PKCS #12 Certificate import Import Certifikátu PKCS #12 <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble může importovat certifikáty uložené ve formátu PKCS #12. Toto je formát používaný při exportu klíče z Mumble, a také při exportu klíčů z Firefox, Internet Explorer, Opera atd.</p><p>Pokud soubor je chráněn heslem, budete toto heslo potřebovat při importu certifikátu.</p> Import from Importovat z Filename to import from Jméno souboru, z kterého importovat This is the filename you wish to import a certificate from. Toto je název souboru, z kterého chcete certifikát importovat. Select file to import from Vyberte soubor z kterého importovat This opens a file selection dialog to choose a file to import a certificate from. Toto otevře dialogové okno výběru souboru ke zvolení souboru, z kterého certifikát importovat. Open... Otevřít... Password Heslo Password for PKCS#12 file Heslo pro soubor PKCS#12 This is the password for the PKCS#12 file containing your certificate. Toto je heslo pro soubor PKCS#12, obsahující Váš certifikát. Certificate to import Který certifikát importovat This is the certificate you are importing. Toto je certifikát, který importujete. Certificate Details Podrobnosti Certifikátu Replace Certificate Nahradit Certifikát Replace existing certificate with new certificate? Nahradit existující certifikát novým certifikátem? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> <p>V Mumble už máte uložen certifikát, a chystáte se ho nahradit.</p> <p>Pokud aktualizujete na certifikát, který Vám vydal důvěryhodná CA a e-mailová adresa se shoduje s tou na Vašem současném certifikátu, toto je naprosto bezpečné, a servery, na které se připojujete, automaticky rozpoznají silný certifikát pro Vaši e-mailovou adresu. </p> <p>Pokud to tak není, už nebudete žádným serverem, kterým jste předtím byli ověřováni, rozpoznán. Pokud jste se ještě na žádných serverech neregistrovali, není se čeho obávat. </p> <p> Jste si jisti, že chcete certifikát nahradit? </p> This is the certificate Mumble currently uses. It will be replaced. Toto je certifikát, který Mumble nyní používá. Bude nahrazen. New certificate Nový certifikát This is the new certificate that will replace the old one. Toto je nový certifikát, který nahradí starý. New Certificate Nový Certifikát Make a backup of your certificate Vytvořit zálohu Vašeho certifikátu Export to Exportovat do Filename to export to Jméno souboru, do kterého exportovat This is the filename you wish to export a certificate to. Toto je jméno souboru, do kterého chcete certifikát exportovat. Save As... Uložit Jako... This is the certificate Mumble currently uses. It will be exported. Toto je certifikát, který Mumble nyní používá. Bude exportován. Generate a new certificate for strong authentication Vytvořit nový certifikát, pro silné ověření <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> <p>Mumble nyní vytvoří silný certifikát pro ověření serverem.</p><p>Pokud chcete, můžete zadat další dodatečné informace, které budou uloženy do certifikátu, který bude při připojení k serverům prezentován. Pokud zadáte platnou e-mailovou adresu, můžete později aktualizovat na e-mailový certifikát vydaný CA, který poskytuje silný průkaz totožnosti.</p> Name Jméno Email E-mail Your email address (e.g. johndoe@mumble.info) Vaše e-mailová adresa (např. jannovak@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. Toto je Vaše e-mailová adresa. Je výrazně doporučeno, abyste zadali platnou e-mailovou adresu, protože Vám umožní aktualizovat na silný certifikát bez problémů s ověřením. Your name (e.g. John Doe) Vaše jméno (např. Jan Novák) This is your name, and will be filled out in the certificate. This field is entirely optional. Toto je Vaše jméno, které bude v certifikátu vyplněno. Toto pole je nepovinné. Finish Dokončit Certificate-based authentication is ready for use Ověření pomocí certifikátů je připraveno k použití Enjoy using Mumble with strong authentication. Užijte si použivání Mumble se silným ověřením. Automatic certificate creation Vytvořit certifikát automaticky <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>Pokud někdy certifikát ztratíte, což se může stát, pokud Váš počítač utrpí chybu hardwaru, nebo přeinstalujete počítač, nebudete se už moci na jakémkoliv serveru, na kterém jste registrován ověřit. Je tedy <b>nutné</b>, abyste si udělali zálohu Vašeho certifikátu. Výrazně doporučujeme si tuto zálohu uložit na vyměnitelném úložišti, jako například USB flash disk.</p> <p>Nezapomeňte, že tento soubor nebude zašifrován, a pokud k němu získá někdo jiný přístup, může se za Vás vydávat, takže se o něj dobře starejte.</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> ChanACL None Žádné Traverse Procházet Enter Vstup Speak Mluvit Mute/Deafen Ztlumit/Ohlušit Make channel Vytvořit kanál Make temporary Udělat dočasným Link channel Propojit kanál This represents no privileges. Toto představuje absenci jakýchkoliv výsad. This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. Toto představuje úplný přístup do kanálu, zahrnující schopnost měnit skupiny a informace ACL. Tato výsada zahrnuje všechny ostatní. This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. Toto představuje oprávnění procházet kanálem. Pokud je uživateli tato výsada odepřena, nebude moci do těchto kanálu a podkanálů jakýmkoliv způsobem vstoupit, bez ohledu na jiná oprávnění v podkanálech. This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. Toto představuje oprávnění vstoupit do kanálu. Pokud máte hierarchickou strukturu kanálu, asi byste mohli chtít dát všem Procházet, ale omezit Vstup v kořeni Vaší hierarchie. This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. Toto představuje oprávnění v kanálu mluvit. Uživatelé bez tohoto oprávnění budou serverem potlačeni (zobrazeni jako ztlumení), a nebudou moci mluvit, dokud je někdo s odpovídajícími výsadami jejich ztlumení nezruší. This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. Toto představuje oprávnění do tohoto kanálu šeptat z venčí. Toto funguje stejně jako výsada <i>mluvit</i>, ale týká se paketů mluvených při držení klávesy Šeptat. Toto může být použito pro vysílání do hierarchie kanálů bez propojení. This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. Toto představuje oprávnění ztlumit a ohlušit jiné uživatele. Jakmile je uživatel ztlumen, zůstane tak, dokud ztlumení není zrušeno jiným uživatelem s výsadami, nebo se znovu nepřipojí k serveru. This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. Toto představuje oprávnění přesunout uživatele na jiný kanál nebo ho vykopnout ze serveru. Abyste uživatele přesunuli, buď musí přesunující uživatel mít oprávnění Přesunout v cílovém kanálu, nebo musí mít uživatel povolení vstoupit běžně do kanálu. Uživatelé s touto výsadou můžou přesunovat uživatele do kanálů, do kterých by přesunovaný uživatel normálně neměl oprávnění vstoupit. This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. Toto představuje oprávnění vytvářet podkanály. Uživatel, který je vytváří, bude přidán do skupiny administrátorů tohoto podkanálu. This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. Toto představuje oprávnění vytvořit dočasný podkanál. Uživatel, který ho vytváří, bude přidán do skupiny administrátorů tohoto podkanálu. Dočasné kanály nejsou ukládány a zmizí, když poslední uživatel odejde. This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. Toto představuje oprávnění propojit kanály. Uživatelé v propojených kanálech se slyší navzájem, pokud mluvící uživatel má výsadu <i>mluvit</i> v kanálu posluchače. Musíte mít výsadu propojit v obou kanálech pro vytvoření propojení, ale pro odstranění pouze v jednom. This represents the permission to write text messages to other users in this channel. Toto představuje oprávnění psát textové zprávy ostatním uživatelům v tomto kanálu. This represents the permission to forcibly remove users from the server. Toto představuje oprávnění násilím odstranit uživatele ze serveru. This represents the permission to permanently remove users from the server. Toto představuje oprávnění natrvalo odstranit uživatele ze serveru. This represents the permission to register and unregister users on the server. Toto představuje oprávnění registrovat a odregistrovat uživatele ze serveru. This represents the permission to register oneself on the server. Toto představuje oprávnění registrovat sám sebe na server. Whisper Šeptat Move Přesunout Text message Textová zpráva Kick Vykopnout Ban Zakázat Register User Registrovat Uživatele Register Self Registrovat Sám Sebe Write ACL Zapsat ACL ChatbarTextEdit Paste and &Send Paste and send &Vložit a odeslat <center>Type chat message here</center> <center>Zde zadejte chatovou zprávu</center> ClientUser Friend Přítel Authenticated Ověřený Priority speaker Přednostní řečník Recording Nahrávám Muted (server) Ztlumen (serverem) Deafened (server) Ohlušen (serverem) Local Ignore (Text messages) Místní ignorování (Textové zprávy) Local Mute Místní ztlumení Muted (self) Ztlumil (sám sebe) Deafened (self) Ohlušen (sám sebe) ConfigDialog Accept changes Přijmout změny This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. Toto tlačítko přijme současná nastavení a navrátí Vás do aplikace.<br />Nastavení bude uloženo na disk, když z aplikace odejdete. Reject changes Odmítnout změny This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. Toto tlačítko odmítne veškeré změny a navrátí Vás do aplikace.<br />Nastavení budou navrácena do původních pozic. Apply changes Potvrdit změny This button will immediately apply all changes. Toto tlačítko okamžitě provede všechny vybrané změny. Undo changes for current page Vrátit změny ze současné stránky This button will revert any changes done on the current page to the most recent applied settings. Toto tlačítko vrátí jakékoliv změny provedené na současné stránce na nejnovější potvrzená nastavení. Restore defaults for current page Obnovit výchozí nastavení na současné stránce This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. Toto tlačítko obnoví výchozí nastavení na současné stránce. Jiné stránky nebudou změněny.<br />Pro obnovení všech nastavení na výchozí, budete muset tlačítko použít na každé stránce. Mumble Configuration Nastavení Mumble ConnectDialog Connecting to %1 Připojuji se k %1 Enter username Zadejte jméno uživatele Adding host %1 Přidávám hostitele %1 Servername Jméno serveru Hostname Jméno hostitele Bonjour name Jméno Bonjour Port Port Addresses Adresy Website Internetová stránka Packet loss Ztráta paketů Ping (80%) Odezva (80%) %1 ms %1 ms Ping (95%) Odezva (95%) Bandwidth Šířka pásma %1 kbit/s %1 kbit/s &Connect &Připojit &Filters &Filtry Unknown Users Uživatelé Version Verze Failed to fetch server list Stažení seznamu serverů selhalo Mumble Server Connect Připojení k Serveru Mumble Ping Odezva Remove from Favorites Odstranit z Oblíbených Add custom server Přidat vlastní server Show all servers that respond to ping Zobrazit všechny servery, které odpovídají na odezvu Show all servers with users Zobrazit všechny servery s uživateli Show all servers Zobrazit všechny servery &Copy &Kopírovat Copy favorite link to clipboard Zkopírovat oblíbený odkaz do schránky &Paste &Vložit Paste favorite from clipboard Vložit oblíbený odkaz ze schránky &Edit... &Upravit... &Add New... &Přidat Nový... Add to &Favorites Přidat do &Oblíbených Open &Webpage Otevřít &Internetovou stránku Show &Reachable Zobrazit &Dosažitelné Show &Populated Zobrazit &Zalidněné Show &All Zobrazit &Vše ConnectDialogEdit Edit Server Upravit Server Name of the server Jméno Serveru A&ddress A&dresa Internet address of the server. Internet address of the server. Internetová adresa serveru. <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Adresa</b><br/> Internetová adresa serveru. To může být normální jméno hostitele, adresa IPv4/IPv6 nebo identifikátor služby Bonjour. Identifikátory služby Bonjour musí mít předponu @, aby je Mumble rozpoznal. &Port &Port Port on which the server is listening Port, na kterém server posluchá <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. <b>Port</b><br/> Port, na kterém server poslouchá. Pokud server je identifikován identifikátorem služby Bonjour, toto pole je ignorováno. &Username &Uživatelské jméno Username to send to the server Uživatelské jméno, které bude odesláno na server <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. <b>Uživatelské jméno</b><br/> Uživatelské jméno k odeslání na server. Nezapomeňte, že server může předepisovat, jak má uživatelské jméno vypadat. Také může být Vaše uživatelské jméno zabráno jiným uživatelem. Label Jmenovka Add Server Přidat Server You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 Password Heslo Password to send to the server Heslo, které bude odesláno na server <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. <b>Heslo</b><br/> Heslo, které má být odesláno při připojení na server. Toto heslo je potřeba při připojování jako <i>SuperUživatel</i> nebo na server používající ověření heslem. Pokud nezadáno zde, bude o heslo požádáno při připojení. Show password Zobrazit heslo <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. <b>Jmenovka</b><br/> Jmenovka serveru. Takto se bude server jmenovat ve Vašem seznamu serverů a může být zvoleno, jak chcete. Local server label Jmenovka místního serveru 127.0.0.1 127.0.0.1 64738 64738 Your username Vaše uživatelské jméno Your password Vaše heslo &Fill CoreAudioSystem Default Device Vychozí zařízení CrashReporter Mumble Crash Report Hlášení o Pádu Mumble <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> <p><b>Je nám velice líto, ale zdá se, že Mumble se zhroutil. Chcete odeslat hlášení o pádu vývojářům Mumble?</b></p><p>Hlášení o pádu obsahuje částečnou kopii paměti Mumble v době zhroucení, a pomůže vývojářům problém spravit.</p> Email address (optional) E-mailová adresa (nepovinné) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash Stručně, prosím, popište v angličtině, co jste dělali v době zhroucení Send Report Odeslat Hlášení Don't send report Neodesílat hlášení Crash upload successful Hlášení úspěšně nahráno Thank you for helping make Mumble better! Děkujeme Vám, že jste pomohli Mumble udělat lepším! Crash upload failed Nahrávání hlášení selhalo We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. Je nám velmi líto, ale zdá se že nahrávání hlášení selhalo s chybou %1 %2. Informujte, prosím, vývojáře. This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 Tohle opravdu není legrační, ale zdá se, že v kódu ohlášení pádu je chyba, a nepodařilo se nám hlášení nahrát. Můžete vývojáře o této chybě informovat %1 Uploading crash report Nahrávám hlášení o pádu Abort upload Zrušit nahrávání DXAudioInput Default DirectSound Voice Input Výchozí Hlasový vstup DirectSound Opening chosen DirectSound Input device failed. No microphone capture will be done. Otevření vybraného vstupního zařízení DirectSound selhalo. Nebude prováděn záznam mikrofonu. Opening chosen DirectSound Input failed. Default device will be used. Otevření vybraného vstupu DirectSound selhalo. Bude použito výchozí zařízení. Lost DirectSound input device. Ztracené vstupní zařízení DirectSound. DXAudioOutput Default DirectSound Voice Output Výchozí Výstup Hlasu DirectSound Opening chosen DirectSound Output failed. Default device will be used. Otevření vybraného výstupu DirectSound selhalo. Bude použito výchozí zařízení. Lost DirectSound output device. Ztracené výstupní zařízení DirectSound. Opening chosen DirectSound Output failed. No audio will be heard. Otevření vybraného výstupu DirectSound selhalo. Nebude slyšet žádný zvuk. Database Mumble failed to initialize a database in any of the possible locations. Mumble nedokázalo spustit databázi v žádném z možných míst. The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. Databáze %1 je jen pro čtení. Mumble nemůže ukládat nastavení serveru (např. certifikáty SSL), dokud tento problém nevyřešíte. DeveloperConsole Developer Console DockTitleBar Drag here Zde táhněte GlobalShortcut Shortcuts Zkratky List of configured shortcuts Seznam nastavených zkratek Function Funkce Data Data Shortcut Zkratka Suppress Potlačit Add new shortcut Přidá novou zkratku This will add a new global shortcut Toto přidá novou globální zkratku &Add Při&dat Remove selected shortcut Odstraní vybranou zkratku This will permanently remove a selected shortcut. Toto navždy odstraní vybranou zkratku. &Remove &Odstranit <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> <html><head/><body><p>Mumble může v současnosti používat pro globální zkratky pouze tlačítka myši a modifikátory na klávesnici (Alt, Ctrl, Cmd, atd.).</p><p>Pokud chcete větší přizpůsobivost, můžete povolit <span style=" font-style:italic;">přístup pro pomocná zařízení</span> v nastavení přístupnosti v systému. Tato změna ale může případně umožnit škodlivým programům číst to, co je psáno na vaší klávesnici.</p></body></html> Open Accessibility Preferences Otevřít nastavení přístupnosti Skip Přeskočit Enable Global Shortcuts Povolit globální zkratky <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. Additional Shortcut Engines <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. Enable Windows hooks <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. Enable GKey <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. Enable XInput <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. Enable shortcuts in privileged applications GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> <html><head/><body><p>Mumble nyní může používat pro globální zkratky pouze tlačítka myši a modifikační klávesy klávesnice (Alt, Ctrl, Cmd, atd.).</p><p>Pokud chcete používat více kláves můžete Mumble přidat jako důvěryhodný program pro usnadnění v části Zabezpečení a Soukromí v nastavení systému Mac.</p><p>V panelu přejděte na kartu Soukromí, pak v seznamu vlevo zvolte Usnadnění (ve spodní části). Nakonec přidejte Mubme do seznamu důvěryhodných programů.</body></html> Shortcuts Zkratky Shortcut button combination. Tlačítková kombinace zkratky. <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. <b>Toto je globální klávesová kombinace zkratky.</b><br />Klikněte na toto pole a pak zmáčkněte požadovanou kombinaci kláves/tlačítek pro znovu svázání. Klikněte dvakrát pro vyčištění. Suppress keys from other applications Potlačit klávesy z jiných aplikací <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. <b>Toto skryje stisknutí tlačítek před ostatními aplikacemi.</b><br />Zapnutí tohoto skryje tlačítko (nebo poslední tlačítko vícetlačítkové kombinace) před jinými aplikacemi. Nezapomeňte, že ne všechny tlačítka mohou být potlačena. GlobalShortcutTarget Whisper Target Šeptat Cíl Whisper to list of Users Šeptat seznamu Uživatelů Channel Target Cílový Kanál Restrict to Group Omezit na Skupinu If specified, only members of this group will receive the whisper. Pokud zadáno, pouze členové této skupiny šepot dostanou. List of users Seznam Uživatelů Add Přidat Remove Odstranit Modifiers Modifikátory Do not send positional audio information when using this whisper shortcut. Neposílat informace pozičního zvuku, když používáte zkratku šeptání. Ignore positional audio Ignorovat poziční zvuk Shout to Linked channels Křičet do propojených kanálů Shout to subchannels Křičet do podkanálů Shout to Channel Křičet do Kanálu The whisper will also be transmitted to linked channels. Šepot bude také vysílán do propojených kanálů. The whisper will also be sent to the subchannels of the channel target. Šepot bude také odeslán do podkanálů cílového kanálu. GlobalShortcutX Mouse %1 Myš %1 JackAudioSystem Hardware Ports Mono Stereo LCD Not connected Nepřipojeno LCDConfig Enable this device Povolit toto zařízení LCD LCD Devices Zařízení Name Jméno <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> <p>Toto je seznam dostupných LCD zařízení ve Vašem systému. Zařízení jsou zobrazena podle názvu, ale také je zde velikost obrazovky. Mumble podporuje výstup obrazu do několika zařízení LCD najednou.</p> <h3>Velikost:</h3> <p> Toto pole popisuje velikost LCD zařízení. Velikost je udávána buď v pixelech (pro Grafická LCD), nebo ve znacích (pro Znaková LCD).</p> <h3>Povoleno:</h3> <p>Toto rozhoduje, zda-li má Mumble do konkrétního LCD zařízení vykreslovat.</p> Size Velikost Enabled Povoleno Views Zobrazení Minimum Column Width Minimální Šířka Sloupce <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> <p>Tato volba rozhoduje o minimální šířce sloupce v Zobrazení Uživatelů.</p> <p>Pokud mluví najednou příliš mnoho lidí, Zobrazení Uživatelů se rozdělí na dva sloupce. Tuto volbu můžete použít, pro vybrání kompromisu mezi počtem uživatelů, zobrazených na LCD, a šířkou jmen uživatelů.</p> This setting decides the width of column splitter. Toto nastavení rozhoduje o šířce separátoru sloupce. Splitter Width Šířka Separátoru Log Debug Ladění Critical Kritické Warning Varování Information Informace Server Connected Server připojen Server Disconnected Server odpojen Other self-muted/deafened Ostatní se ztlumili/ohlušili Permission Denied Oprávnění zamítnuto Text Message Textová zpráva User Joined Server Uživatel Se Připojil Na Server User Left Server Uživatel Odešel Ze Serveru User recording state changed Stav nahrávání uživatele změněn User kicked (you or by you) Uživatel vykopnut (Vás nebo Vámi) User kicked Uživatel vykopnut You self-muted Sami jste se ztlumili User muted (you) Uživatel ztlumil Vás User muted (by you) Uživatel ztlumen (Vámi) User muted (other) Uživatel ztlumen (jiné) User Joined Channel Uživatel vstoupil do kanálu User Left Channel Uživatel odešel z kanálu You self-unmuted Sami jste zrušili své ztlumení You self-deafened Sami jste se ohlušili You self-undeafened Sami jste zrušili své ohlušení User renamed Uživatel přejmenován You Joined Channel You Joined Channel (moved) User connected and entered channel User left channel and disconnected Private text message the server server [[ Invalid size ]] [[ Text object too large to display ]] [[ Textový objekt je příliš velký pro zobrazení ]] [Date changed to %1] [Datum změněno na %1] link to %1 odkaz na %1 FTP link to %1 player link odkaz hráče channel link odkaz kanálu %1 link odkaz %1 LogConfig Toggle console for %1 events Zapnout konzoli pro události %1 Toggle pop-up notifications for %1 events Zapnout vyskakující oznamení pro události %1 Toggle Text-To-Speech for %1 events Zapnout Text-Na-Řeč pro události %1 Click here to toggle sound notification for %1 events Klikněte zde pro zapnutí oznámení zvukem pro události %1 Toggle window highlight (if not active) for %1 events Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change Cesta k zvukovému souboru, který bude použit pro oznámení zvukem v případě událostí %1<br />Jednou klikněte pro přehrání<br />Dvakrát pro změnu Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. Klikněte zde pro zapnutí výstupu konzole pro události %1.<br />Je-li zaškrtnuto, tato volba donutí Mumble vypsat všechny události %1 v záznamu zpráv. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. Klikněte zde pro zapnutí vyskakujících oznámení pro události %1. <br />Je-li zaškrtnuto, vyskakující oznámení bude Mumblem vytvořeno pro každou událost %1. Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. Cesta k zvukovému souboru, který bude použit pro oznámení zvukem v případě událostí %1.<br />Jednou klikněte pro přehrání<br />Dvakrát pro změnu<br />Ujistěte se, že oznámení zvukem jsou pro tyto události povoleny, nebo toto pole nebude mít žádný účinek. Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. Klikněte zde pro zapnutí Textu-Na-Řeč pro události %1.<br />Je-li zaškrtnuto. Mumble použije Text-Na-Řeč, aby Vám události %1 nahlas přečetl. Text-Na-Řeč je také schopen přečíst obsah události, což není tak pravda pro zvukové soubory. Text-Na-Řeč a zvukové soubory nemůžou být používány najednou. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. klikněte zde pro zapnutí oznámení zvukem pro události %1.<br />Je-li zaškrtnuto, Mumble použije zvukový soubor Vámi přednastavený, pro signalizaci událostí %1. Zvukové soubory a Text-Na-Řeč nemůžou být použity najednou. Messages Zprávy Message Zpráva Console Konzole Notification Oznámení Text-To-Speech Text-Na-Řeč Soundfile Zvukový soubor Path Cesta Text To Speech Text na Řeč Volume Hlasitost Volume of Text-To-Speech Engine Hlasitost Textu-Na-Řeč <b>This is the volume used for the speech synthesis.</b> <b>Toto je hlasitost použitá pro syntézu hlasu.</b> Length threshold Maximální Délka Message length threshold for Text-To-Speech Engine Maximální délka zprávy pro Text-Na-Řeč <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. <b>Toto je maximální délka zprávy použitá Textem-Na-Řeč.</b><br />Zprávy delší než tento limit nebudou nahlas přečteny v celé svojí délce. Characters Znaků Whisper Šepot If checked you will only hear whispers from users you added to your friend list. Je-li zaškrtnuto, šepoty budete slyšet pouze od uživatelů, které jste přidali na seznam přátel. Only accept whispers from friends Šepoty přijímat pouze od přátel If enabled text messages you send will be read back to you with TTS Pokud zapnuto, textové zprávy, které odesíláte, Vám budou přečteny zpátky pomocí Textu-Na-Řeč Read back own messages Vlastní zprávy přečíst zpět Chat Log Záznam chatu Maximum chat length Maximální délka chatu Unlimited Neomezená Lines Řádků Highlight LookConfig System default Výchozí nastavení systému None Žádný Only with users Pouze s uživateli All Všechny Ask Zeptat se Do Nothing Nedělat Nic Move Přesunout <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory <a href="%1">Procházet</a> User Interface Uživatelské Rozhraní This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. Toto nastavuje, který kanál má být automaticky rozšířen. <i>Žádný<i/> a <i>Všechny</i> rozšíří žádný nebo všechny kanály, zatímco <i>Pouze s uživateli</i> rozšíří a zúží kanály, jak uživatelé přicházejí a odcházejí. List users above subchannels (requires restart). Zobrazí uživatele nad podkanály (vyžaduje restart). <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. <b>Je-li nastaveno, uživatelé budou zobrazeni nad podkanály v zobrazení kanálů.</b><br />Pro zobrazení změny je vyžadován restart Mumble. Users above Channels Uživatelé nad Kanály <b>If set, will verify you want to quit if connected.</b> <b>Je-li nastaveno, potvrdí, zda chcete odejít, pokud jste připojeni.</b> Show number of users in each channel Zobrazí počet uživatelů v každém kanále Show channel user count Zobrazit počet uživatelů kanálu Language Jazyk Language to use (requires restart) Který jazyk použít (vyžaduje restart) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. <b>Nastaví jazyk, který má aplikace Mumble použít.</b><br />Pro použití nového jazyka musíte Mumble restartovat. Look and Feel Styl vzhledu Layout Rozvržení Classic Klasické Stacked Na sobě Hybrid Smíšené Custom Vlastní This changes the behavior when moving channels. Toto změní chování při přesunu kanálů. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. Toto nastavuje chování při táhnutí kanálů; může být použito pro zabránění neúmyslného táhnutí. <i>Přesunout</i> přesune kanály bez potvrzení. <i>Nedělat nic</i> nic neudělá a vypíše chybovou zprávu. <i>Zeptat se</i> použije rámeček se zprávou pro potvrzení, jetli opravdu chcete kanál přesunout. Expand Zvětšit When to automatically expand channels Kdy automaticky zvětšit kanály Channel Dragging Táhnutí Kanálů Ask whether to close or minimize when quitting Mumble. Zeptat se, jestli zavřít či minimalizovat při ukončení Mumble. Ask on quit while connected Zeptat se na ukončení, je-li připojeno Always On Top Vždy Nahoře <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> <b>Je-li nastaveno, minimalizováním hlavního okna Mumble, způsobí, že je skryt a přístupný pouze z hlavního panelu. Jinak bude minimalizován jako normální okno.</b> Hide in tray when minimized Při minimalizaci skrýt do hlavního panelu Hide the main Mumble window in the tray when it is minimized. Skryje hlavní okno Mumble při minimalizaci do hlavního panelu. This setting controls when the application will be always on top. Toto nastavení kontroluje kdy je aplikace vždy nahoře. Never Nikdy Always Vždy In minimal view V minimálním zobrazení In normal view V normálním zobrazení Displays talking status in system tray Zobrazí stav mluvení v hlavním panelu Show talking status in tray icon Zobrazit stav mluvení v ikoně hlavního panelu This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. Toto nastavení kontroluje, v kterých situacích aplikace zůstane vždy nahoře. Pokud zvolíte <i>Nikdy</i> aplikace nikdy nezůstane nahoře. <i>Vždy</i> zůstane aplikace nahoře vždycky. <i>V minimálním zobrazení</i> / <i>V normálním zobrazení</i> ponechá aplikaci vždy nahoře, když minimální zobrazení je zapnuto / vypnuto. Show context menu in menu bar Zobrazit kontextové menu v liště menu Apply some high contrast optimizations for visually impaired users Použít některé vysoko kontrastní optimalizace pro zrakově postižené uživatele Optimize for high contrast Optimalizovat pro vysoký kontrast Application Aplikace Adds user and channel context menus into the menu bar Přidá kontextové menu uživatel a kanál do lišty s menu Tray Icon Ikona hlavního panelu Channel Tree Strom kanálů Use selected item as the chat bar target Použít zvolenou položku jako cíl chatové lišty Filter automatically hides empty channels Filtr automaticky skryje prázdné kanály Show transmit mode dropdown in toolbar Zobrazit režim přenosu v nástrojové liště Theme Vzhled Theme to use to style the user interface Vzhled který bude použit ke změně stylu uživatelského rozhraní <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. <b>Zde můžete zvolit vzhled, pomocí kterého bude změněn styl uživatelského rozhraní Mumble</b><br />Mumble vzhledy hledá v určitých adresářích a zobrazí je v tomto seznamu. Ten, který zvolíte, budde použit k přizpůsobení vizuálního vzhledu Mumble. To zahrnuje barvy, ikony a další. User Dragging This changes the behavior when moving users. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. Enable Developer menu When in custom layout mode, checking this disables rearranging. Lock layout MainWindow Root Kořen Push-to-Talk Global Shortcut Mluvení při stisku klávesy Push and hold this button to send voice. Global Shortcut Zmáčkněte a držte toto tlačítko pro odeslání hlasu. This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut Toto nastaví tlačítko pro mluvení při stisku klávesy, dokavaď budete tlačítko držet, budete zvuk vysílat. Reset Audio Processor Global Shortcut Resetovat Zvukový Procesor Unlink Plugin Global Shortcut Odpojit Zásuvný Modul Push-to-Mute Global Shortcut Ztlumení při stisku klávesy Join Channel Global Shortcut Vstoupit do kanálu Toggle Overlay Global Shortcut Zapnout Překryv Toggle state of in-game overlay. Global Shortcut Přepnout stav překryvu ve hře. Toggle Minimal Global Shortcut Zapnout Minimálni Zobrazení Volume Up (+10%) Global Shortcut Zvýšit Hlasitost (+10%) Volume Down (-10%) Global Shortcut Snížit Hlasitost (-10%) Mumble Mumble Mumble -- %1 Mumble -- %1 &Window &Okno Minimize Minimalizovat Ctrl+M Ctrl+M Close Zavřít Mumble is currently connected to a server. Do you want to Close or Minimize it? Mumble je nyní připojen k serveru. Opravdu ho chcete Zavřit nebo Minimalizovat? Mute Self Global Shortcut Ztlumit se Set self-mute status. Global Shortcut Nastavit stav sebe-ztlumení. This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut Toto nastaví nebo přepne Váš stav ztlumení. Pokud toto vypnete, vypnete tím i sebe-ohlušení. Deafen Self Global Shortcut Ohlušit se Set self-deafen status. Global Shortcut Nastavit stav sebe-ohlušení. This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut Toto nastaví nebo přepne Váš stav ohlušení. Pokud toto zapnete, zapnete tím i sebe-ztlumení. Whisper/Shout Whisper Šeptat/Křičet <center>Not connected</center> Not connected <center>Nepřipojen</center> Clear Vyčistit Opening URL %1 Otevírám URL %1 File does not exist Soubor neexistuje File is not a configuration file. Soubor není soubor nastavení. Settings merged from file. Nastavení sloučena ze souboru. URL scheme is not 'mumble' Schéma URL není 'mumble' This version of Mumble can't handle URLs for Mumble version %1.%2.%3 Tato verze Mumble neumí pracovat s URL pro verzi Mumble %1.%2.%3 Connecting to %1 Připojuji se k %1 Enter username Zadejte jméno uživatele Connecting to server %1. Připojuji se k serveru %1. Reconnecting. Znovu se připojuji. Transmit Mode set to Continuous Režim přenosu přepnut na Nepřetržitý <p>%1 (%2)<br />%3</p> <p>%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> <h2>Zvukový kanál</h2><p>Zašifrován pomocí 128 bit OCB-AES128<br />průměrné zpoždění %1 ms (odchylka %4)</p> Register yourself as %1 Registrovat se jako %1 <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <p>Chystáte se k registraci na tomto serveru. Tuto činnost nelze vrátit zpět, a jakmile je toto provedeno, Vaše uživatelské jméno nelze změnit. Na tomto serveru budete navždy známi jako '%1'.</p><p>Jste si jisti, že se chcete zaregistrovat?</p> <h2>Version</h2><p>Protocol %1</p> <h2>Verze</h2><p>Protokol %1</p> <p>No build information or OS version available</p> <p>Nejsou dostupné žádné informace o sestavení nebo verzi OS</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) Připojení je zabezpečeno a ověřeno pomocí %1 využívající %2 jako nástroj pro výměnu klíčů (%3) The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) Připojení je zabezpečeno pomocí %1, kde %2 je použito pro ověření zpráv a %3 jako nástroj pro výměnu klíčů (%4) The connection is secured by the cipher suite that OpenSSL identifies as %1 Připojení je zabezpečeno šifrovací sadou, kterou OpenSSL identifikuje jako %1 <p>The connection provides perfect forward secrecy</p> <p>Připojení poskytuje perfect forward secrecy</p> <p>The connection does not provide perfect forward secrecy</p> <p>Připojení neposkytuje perfect forward secrecy</p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> <h2>Kontrolní kanál</h2><p>Připojení využívá %1</p>%2%3<p>Průměrná odezva %4 ms (Odchylka %5)</p><p>Vzdálený hostitel %6 (Port %7)</p> Voice channel is sent over control channel Zvukový kanál je odesílán přes kontrolní kanál Register user %1 Registrovat uživatele %1 <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> <p>Chystáte se k registraci %1 na tomto serveru. Tuto činnost nelze vzít zpět, uživatelské jméno nelze změnit, a jako registrovaný uživatel, %1 bude mít přístup na server i když změníte jeho heslo.</p><p>Od této chvíle, %1 bude ověřen pomocí právě používaného certifikátu.</p><p>Jste si jisti, že chcete registrovat %1?</p> Kicking user %1 Vykopávám uživatele %1 Banning user %1 Zakazuji uživatele %1 View comment on user %1 Zobrazit komentář na uživatele %1 Message to channel %1 Zpráva do kanálu %1 Connected. Připojen. <li>Expected certificate digest (SHA-1): %1</li> Server presented a certificate which failed verification. Server předložil certifikát, u kterého selhalo ověření. <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> SSL Version mismatch Neshoda verze SSL Server connection failed. <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>Zde napište zprávu pro kanál '%1'</center> <center>Type message to user '%1' here</center> Type message to user '%1' here <center>Zde napište zprávu pro uživatele '%1'</center> Choose image file Zvolte obrázkový soubor Failed to load image Načtení obrázku selhalo Could not open file for reading. Nelze otevřít soubor pro čtení. Image format not recognized. Formát obrázku nerozpoznán. &User &Uživatel &Channel &Kanál Use in conjunction with Whisper to. Global Shortcut Použijte spolu s Šepotem. This will switch the states of the in-game overlay. Global Shortcut Toto přepne stavy překryvu ve hře. Link Channel Global Shortcut Propojit Kanál Cycle Transmit Mode Global Shortcut Přepnout režim přenosu Set Transmit Mode to Push-To-Talk Global Shortcut Set Transmit Mode to Continuous Global Shortcut Set Transmit Mode to VAD Global Shortcut Send Text Message Global Shortcut Poslat textovou zprávu Send Clipboard Text Message Global Shortcut This will send your Clipboard content to the channel you are currently in. Global Shortcut Continuous Průběžný Voice Activity Při aktivitě hlasu Push-to-Talk Mluvení při stisku klávesy Mumble - Minimal View -- %1 Mumble - Minimální zobrazení -- %1 Cancel Zrušit Save Image As... Uložit obrázek jako... Save Image File Uložit soubor obrázku Could not save image: %1 Nelze uložit obrázek: %1 Change your comment Změnit Váš komentář Transmit Mode set to Voice Activity Režim přenosu přepnut na Při aktivitě hlasu Transmit Mode set to Push-to-Talk Režim přenosu přepnut na Mluvení při stisku klávesy <p>Connected users: %1/%2</p> <p>Připojeno uživatelů: %1/%2</p> UDP Statistics Statistiky UDP To Server Na Server From Server Ze Serveru Good Dobré Late Zpožděné Lost Ztracené Resync Resynch <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> <h2>Šířka pásma zvuku</h2><p>Maximum %1 kbit/s<br />Současná %2 kbit/s<br />Kodek: %3</p> Mumble Server Information Informace o Serveru Mumble &View Certificate Zobrazit &Certifikát Enter reason Zadejte důvod Sending message to %1 Posílam zprávu pro %1 To %1: %2 Pro %1: %2 Message to %1 Zpráva pro %1 Are you sure you want to reset the comment of user %1? Jste si jisti, že chcete resetovat komentář uživatele %1? Are you sure you want to reset the avatar of user %1? Opravdu chcete resetovat avatara uživatele %1? Are you sure you want to delete %1 and all its sub-channels? Jste si jisti, že chcete odstranit kanál %1 a všechny jeho podkanály? Sending message to channel %1 Odesílám zprávu do kanálu %1 Message to tree %1 Zpráva pro strom %1 To %1 (Tree): %2 (Tree) %1: %2 Do %1 (Strom): %2 Unmuted and undeafened. Zrušeno ohlušení a zesílen. Unmuted. Zesílen. Muted. Ztlumen. Muted and deafened. Ztlumen a ohlušen. Deafened. Ohlušen. Undeafened. Ohlušení zrušeno. Restart Mumble? Restartovat Mumble? Some settings will only apply after a restart of Mumble. Restart Mumble now? Některá nastavení budou použita až po restartu Mumble. Chcete ho nyní restartovat? About Qt O Qt SSL Verification failed: %1 Ověření SSL selhalo: %1 <li>Server certificate digest (SHA-1): %1</li> <b>WARNING:</b> The server presented a certificate that was different from the stored one. <b>VAROVÁNÍ:</b> Server předložil certifikát, který se liší od uloženého. This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. Tento server používá starý šifrovací standard, a nebude nadále podporován novými verzemi Mumble. Server connection failed: %1. Připojování k serveru selhalo: %1. Disconnected from server. Odpojeno od serveru. Invalid username Neplatné jméno uživatele You connected with an invalid username, please try another one. Připojili jste se s neplatným uživatelským jménem, zkuste jiné, prosím. Username in use Uživatelské jméno se používá That username is already in use, please try another username. Toto uživatelské jméno se již používá, zkuste jiné, prosím. Wrong certificate or password Špatný certifikát nebo heslo Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. Špatný certifikát, nebo heslo pro registrovaného uživatele. Pokud jste si jisti, že tento uživatel je chráněn heslem, prosíme, zkuste to znovu. Jinak přerušte a zkontrolujte Váš certifikát a uživatelské jméno. Wrong password Špatné heslo Wrong server password for unregistered user account, please try again. Špatné heslo serveru pro účet neregistrovaného uživatele, prosím zkuste znovu. Images (*.png *.jpg *.jpeg) Obrázky (*.png *.jpg *.jpeg) C&onfigure &Nastavit &Help &Nápověda Log Záznam This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. Toto zobrazí nedávnou aktivitu. Připojování k serverům, chyby a informační zprávy jsou všechny zobrazeny zde.<br /> Abyste přesně nastavili, které zprávy se zde zobrazí, použijte z menu příkaz <b>Nastavení</b>. &Quit Mumble &Ukončit Mumble Closes the program Uzavře aplikaci Exits the application. Ukončí aplikaci. Ctrl+Q Ctrl+Q Open the server connection dialog Otevřít dialogové okno spojení se serverem &Disconnect O&dpojit Disconnect from server Odpojit od serveru Disconnects you from the server. Odpojí Vás od serveru. Show information about the server connection Zobrazit informace o připojení k serveru This will show extended information about the connection to the server. Toto zobrazí podrobné informace o připojení k serveru. &Mute Ztlu&mit &Deafen &Ohlušit &Local Mute &Místní Ztlumení Send a Text Message Poslat textovou zprávu Sends a text message to another user. Pošle textovou zprávu jinému uživateli. Add new channel Přidat nový kanál This adds a new sub-channel to the currently selected channel. Toto přidá nový podkanál do současně vybraného kanálu. Remove channel Odstranit kanál This removes a channel and all sub-channels. Toto odstraní kanál a všechny podkanály. Edit Groups and ACL for channel Upravit Skupiny a ACL pro kanál This opens the Group and ACL dialog for the channel, to control permissions. Toto otevře dialogové okno skupin a ACL daného kanálu, pro kontrolu oprávnění. &Link &Propojit Link your channel to another channel Propojí současný kanál s jiným kanálem This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. Toto je chatová lišta<br />Pokud zde zadáte text a pak zmáčknete enter, tex je poslán zvolenému uživateli nebo kanálu. Pokud nic není zvoleno, zpráva bude poslána do současného kanálu. Chatbar Chatová lišta Shows a dialog of registered servers, and also allows quick-connect. Zobrazí dialogové okno registrovaných serverů, a také umožňuje rychlé připojení. Kick user (with reason) Vykopnout uživatele (s důvodem) Kick selected user off server. You'll be asked to specify a reason. Vykopne vybraného uživatele ze serveru. Budete požádáni o udání důvodu. Mute user Zeslabit uživatele Mute or unmute user on server. Unmuting a deafened user will also undeafen them. Ztlumit nebo zesílit uživatele na serveru. Zesílení ohlušeného uživatele také zruší jejich ohlušení. Kick and ban user (with reason) Vykopnout a zakázat uživatele (s důvodem) Kick and ban selected user from server. You'll be asked to specify a reason. Vykopnout a zakázat uživatele na serveru. Budete požádáni o udání důvodu. Deafen user Ohlušit uživatele Deafen or undeafen user on server. Deafening a user will also mute them. Ohluší nebo zruší ohlušení uživatele na serveru. Ohlušením jsou uživatelé také ztlumeni. Mute user locally Ztlumit uživatele místně Mute or unmute user locally. Use this on other users in the same room. Ztlumit nebo zesílit uživatele místně. Toto použijte na ostatní uživatele ve stejné místnosti. This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. Toto propojí Váš současný kanál s vybraným. Pokud mají uživatelé v kanálu oprávnění mluvit v druhém kanálu, mohou se teď navzájem sloučit. Toto je trvalé propojení, a bude trvat do doby, než budou ručně rozpojeni nebo server restartován. Prohlédněte si, prosím, zkratky pro zmáčknutí k propojení. &Unlink Channel &Odpojit Unlink your channel from another channel Rozpojit Váš kanálu od jiného kanálu This unlinks your current channel from the selected channel. Rozpojí Váš současný kanál od vybraného kanálu. Unlinks your channel from all linked channels. Rozpojí Váš kanál od všech propojených kanálů. This unlinks your current channel (not the selected one) from all linked channels. Toto rozpojí Váš současný kanál (ne ten vybraný) od všech propojených kanálů. &Reset &Resetovat Reset audio preprocessor Resetovat preprocesor This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. Toto resetuje zvukový preprocesor, včetně rušení šumu, automatického získání hlasitosti a detekce hlasové aktivity. Pokud něco náhle zhorší zvukové prostředí (například mikrofon upadne) a je to pouze dočasné, použijte toto, abyste se vyhnuli čekáním, až se preprocesor přizpůsobí. &Mute Self &Zeslabit se Mute yourself Zeslabit se Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. Zeslabit/zesílit sám sebe. Když jste zeslabeni, neposíláte žádná data na server. Zesílením při ohlušení zároveň ohlušení zrušíte. &Deafen Self &Ohlušit se Deafen yourself Ohlušit se Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. Ohlušit sám sebe nebo zrušit ohlušení. Když jste ohlušeni, tak nic neuslyšíte. Ohlušením se také zeslabíte. &Text-To-Speech &Text-Na-Řeč Toggle Text-To-Speech Zapnout Text-Na-Řeč Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. Zapnout nebo vypnout text-na-řeč. Pouze zprávy povolené pro text-na-řeč v dialogovém okně nastavení budou přečteny. Display audio statistics Zobrazit statistiku zvuku Pops up a small dialog with information about your current audio input. Vyskočí malé dialogové okno s informacemi o současném zvukovém vstupu. Forcibly unlink plugin Násilně odpojit zásuvný modul This forces the current plugin to unlink, which is handy if it is reading completely wrong data. Toto násilně donutí zásuvný modul k odpojení, což je užitečné, pokud načítá naprosto špatná data. Configure Mumble Nastavit Mumble Allows you to change most settings for Mumble. Umožňuje Vám změnit většinu nastavení Mumble. Start the audio configuration wizard Spustit průvodce nastavením zvuku This will guide you through the process of configuring your audio hardware. Toto Vás provede skrz proces nastavení Vašeho hardware zvuku. &What's This? &Co je to? Enter What's This? mode Vstoupit do režimu "Co je To?" Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. Klikněte pro vstoupení do režimu "Co je To?" Váš kurzor se změní na otazník. Klikněte na jakékoli tlačítko, volbu menu nebo oblast pro zobrazení popisu co je to zač. Information about Mumble Informace o Mumble Shows a small dialog with information and license for Mumble. Zobrazí malé dialogové okno s informacemi a licencí pro Mumble. Information about Speex Informace o Speex Shows a small dialog with information about Speex. Zobrazí malé dialogové okno s informacemi o Speex. Information about Qt Informace o Qt Shows a small dialog with information about Qt. Zobrazí malé dialogové okno s informacemi o QT. Check for &Updates Zkontrolovat akt&ualizace Check for new version of Mumble Zkontroluje aktualizace Mumble Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. Připojí se k webové stránce Mumble pro zjištění, je-li nová verze dostupná, a oznámí Vám to vhodným odkazem na stažení, pokud tomu opravdu tak je. Sends a text message to all users in a channel. Pošle textovou zprávu všem uživatelům v kanálu. Configure certificates for strong authentication Nastavit certifiákaty pro silné ověření This starts the wizard for creating, importing and exporting certificates for authentication against servers. Toto spustí průvodce pro vytvoření, importování a exportování certifikátu pro ověření pomocí serverů. Register user on server Registrovat uživatele na serveru This will permanently register the user on the server. Toto natrvalo registruje uživatele na serveru. Add &Friend &Přidat Přítele Adds a user as your friend. Přidá uživatele jako Vašeho přítele. This will add the user as a friend, so you can recognize him on this and other servers. Toto přidá uživatele jako přítele, takže ho můžete rozpoznat na tomto a dalších serverech. &Remove Friend O&dstranit Přítele Removes a user from your friends. Odstraní uživatele z Vašich přátel. This will remove a user from your friends list. Toto odstraní uživatele ze seznamu Vašich přátel. &Update Friend Akt&ualizovat Přítele Update name of your friend. Aktualizovat jméno Vašeho přítele. Your friend uses a different name than what is in your database. This will update the name. Váš přítel používá jiné jméno, než jaké je ve Vaši databázi. Toto jméno aktualizuje. Edit registered users list Upravit seznam registrovaných uživatelů This opens the editor for registered users, which allow you to change their name or unregister them. Toto otevře editor pro registrované uživatele, což Vám dovolí měnit jejich jména nebo zrušit jejich registraci. Add or remove text-based access tokens Přidá nebo odstraní textové znaky přístupu &Minimal View &Minimální Zobrazení Toggle minimal window modes Zapnout režim minimálního okna This will toggle minimal mode, where the log window and menu is hidden. Toto zapne minimální zobrazení, kde jsou okna záznamu a menu skryta. You muted and deafened %1. Zeslabili a ohlušili jste uživatele %1. You unmuted and undeafened %1. Zesílili jste a zrušili ohlušení uživatele %1. You undeafened %1. Zrušili jste ohlušení uživatele %1. You suppressed %1. Potlačili jste %1. %1 muted and deafened by %2. %1 byl zeslaben a ohlušen uživatelem %2. %1 unmuted and undeafened by %2. %1 byl zesílen a zbaven ohlušení uživatelem %2. %1 undeafened by %2. %1 zrušil ohlušení uživatele %2. %1 suppressed by %2. %1 potlačen uživatelem %2. %1 moved to %2. %1 přesunut do %2. %1 moved to %2 by %3. %1 přesunut do %2 uživatelem %3. %1 moved in from %2 by %3. %1 přesunut z %2 uživatelem %3. %1 is now muted and deafened. %1 je nyní zeslaben a ohlušen. Your account information can not be verified currently. Please try again later Informace o vašem účtu nemohou být momentálně ověřeny. Zkuste to prosím později Welcome message: %1 Uvítací zpráva: %1 Mumble: %1 Mumble: %1 You were denied %1 privileges in %2. Byli Vám zamítnuty výsady %1 v %2. %3 was denied %1 privileges in %2. %3 byly zamítnuty výsady %1 v %2. Denied: Cannot modify SuperUser. Zamítnuto: Nelze změnit SuperUživatele. Denied: Invalid channel name. Zamítnuto: Neplatné jméno kanálu. Denied: Text message too long. Zamítnuto: Textová zpráva je příliš dlouhá. Denied: Operation not permitted in temporary channel. Zamítnuto: Operace není v dočasném kanálu povolena. You need a certificate to perform this operation. K provedení této operace potřebujete certifikát. %1 does not have a certificate. %1 nemá certifikát. Invalid username: %1. Neplatné uživatelské jméno: %1. Invalid username. Neplatné uživatelské jméno. Channel is full. Kanál je plný. Channel nesting limit reached. Dosaženo limitu vnoření kanálu. Channel count limit reached. Need to delete channels before creating new ones. Permission denied. Oprávnění zamítnuto. %1 connected and entered channel. %1 connected. %1 se připojil. %1 is now muted. %1 je nyní zeslaben. %1 is now unmuted. %1 je nyní zesílen. Recording started Nahrávání spuštěno Recording stopped Nahrávání zastaveno %1 started recording. %1 začal nahrávat. %1 stopped recording. %1 přestal nahrávat. You revoked your priority speaker status. Zrušili jste svůj stav přednostního řečníka. You assumed priority speaker status. Přijali jste stav přednostního řečníka. %1 revoked your priority speaker status. %1 zrušil váš stav přednostního řečníka. %1 gave you priority speaker status. %1 vám dal stav přednostního řečníka. You revoked priority speaker status for %1. %1 jste zrušili stav přednostního řečníka. You gave priority speaker status to %1. %1 jste dali stav přednostního řečníka. %1 revoked own priority speaker status. %1 si zrušil svůj stav přednostního řečníka. %1 assumed priority speaker status. %1 přijal stav přednostního řečníka. %1 revoked priority speaker status for %2. %1 zrušil %2 stav přednostního řečníka. %1 gave priority speaker status to %2. %1 dal %2 stav přednostního řečníka. You were unmuted and undeafened by %1. %1 Vás zesílil a zrušil Vaše ohlušení. You were muted by %1. %1 Vás zeslabil. You were undeafened by %1. %1 zrušil Vaše ohlušení. You were suppressed. You were suppressed by %1. Byli jste potlačeni. You were unsuppressed. Vaše potlačení bylo zrušeno. You were unsuppressed by %1. Vaše potlačení bylo zrušeno uživatelem %1. You joined %1. You moved %1 to %2. %1 jste přesunuli do %2. %1 is recording %1 nahrává %1 renamed to %2 by %3. %1 přejmenován na %2 uživatelem %3. %1 disconnected. %1 odpojen. Server message from Serveru (Tree) (Strom) (Channel) (Kanál) (Private) %2%1: %3 %2%1: %3 Failed to load Opus, it will not be available for audio encoding/decoding. The server requests minimum client version %1 Server vyžaduje minimální verze klienta %1 The server requests positional audio be enabled. Server vyžaduje, aby byl poziční zvuk zapnut. The server requests positional audio be disabled. Server vyžaduje, aby byl poziční zvuk vypnut. The server requests Push-to-Talk be enabled. Server vyžaduje, aby mluvení při stisku tlačítka bylo zapnuto. The server requests Push-to-Talk be disabled. Server vyžaduje, aby mluvení při stisku tlačítka bylo vypnuto. You were unmuted by %1. %1 Vás zesílil. You muted %1. Zeslabili jste %1. You unsuppressed %1. Zrušili jste potlačení uživatele %1. You unmuted %1. Zesílili jste %1. %1 muted by %2. %2 zeslabil %1. %1 unsuppressed by %2. %1 byl zbaven potlačení uživatelem %2. %1 unmuted by %2. %1 zesílil %2. Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. Nelze nalézt odpovídající kodeky CELT s ostatními klienty. Nebudete schopni mluvit ke všem uživatelům. You were muted and deafened by %1. You were deafened by %1. %1 Vás zeslabil a ohlušil. You were kicked from the server by %1: %2. Byli jste vykopnuti ze serveru uživatelem %1: %2. %3 was kicked from the server by %1: %2. %3 byl vykopnut ze serveru uživatelem %1: %2. You were kicked and banned from the server by %1: %2. Byli jste vykopnuti a zakázáni uživatelem %1: %2. %3 was kicked and banned from the server by %1: %2. %3 byl vykopnut a zakázán uživatelem %1: %2. You were moved to %1 by %2. Byli jste přesunuti do %1 uživatelem %2. %1 entered channel. %1 vstoupil do kanálu. Server connection rejected: %1. Spojení se serverem odmítnuto: %1. Denied: %1. Zamítnuto: %1. %1 renamed to %2. %1 přejmenován na %2. %1 left channel and disconnected. %1 opustil kanál a odpojil se. Message from %1 Zpráva od %1 You have User Dragging set to "Do Nothing" so the user wasn't moved. You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. Táhnutí kanálu máte nastavené na "Nedělej Nic", takže kanál nebyl přesunut. Unknown Channel Drag mode in UserModel::dropMimeData. Neznámý režim Táhnutí Kanálů v UserModel::dropMimeData. Remote controlling Mumble: Vzdálené ovládání Mumble: Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) -jn, --jackname Set custom Jack client name. --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status Invocation Vyvolání Error: No RPC command specified Chyba: Nezadán příkaz RPC RPC RPC Welcome to Mumble. Vítejte v aplikaci Mumble. Skipping version check in debug mode. V režimu ladění přeskakuji kontrolu verze. Hide Frame Skrýt Rámeček Toggle showing frame on minimal window Přepne zobrazení rámečku v minimálním okně This will toggle whether the minimal window should have a frame for moving and resizing. Toto nastaví, zda-li okno minimálního zobrazení by mělo mít rámeček pro přesunování a změny velikosti. &Unlink All Odpojit &Vše Reset the comment of the selected user. Resetuje komentář zvoleného uřživatele. &Join Channel &Vstoupit do Kanálu View comment in editor Zobrazit komentář v editoru Query server for connection information for user Požádat server o informace o připojení uživatele S&erver S&erver &Self &Sebe &Unlink Plugins Odpojit Zásuvné &Moduly Register yourself on the server Registrovat se na serveru Change your avatar image on this server Změnit obrázek avatara na tomto serveru &Remove Avatar &Odstranit Avatara Remove currently defined avatar image. Odstranit současně nastavený obrázek avatara. Icon Toolbar Panel nástrojů s Ikonami Change your own comment Změnit Váš vlastní komentář Recording Nahrávání Priority Speaker Přednostní Řečník &Copy URL &Kopírovat URL Copies a link to this channel to the clipboard. Zkopíruje odkaz na tento kanál do schránky. Ignore Messages Ignorovat zprávy Locally ignore user's text chat messages. Místně ignorovat textové chatové zprávy uživatele. Silently drops all text messages from the user. Tiše zahodí všechny textové zprávy od uživatele. Edit ban list on server Upravit seznam zákazů na serveru This lets you edit the server-side IP ban list. Toto vám umožňuje upravit seznam zákazů IP serveru. &Filter on/off &Filtr zpanout/vypnout Toggle the channel filter (Ctrl+F) Přepínat filtr kanálů (Ctrl+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. Povolit nebo zakázat filtrování zvolených kanálů. Standardně jsou filtrovány všechny prázdné kanály. Další kanály můžete vyfiltrovat označením v kontextové nabídce kanálů. Ctrl+F Ctrl+F &Hide Channel when Filtering &Skrýt kanál při filtrování Reset the avatar of the selected user. Resetovat avatar zvoleného uživatele. Locally adjust the user's speech volume. Upravit místní hlasitost mluvení uživatele. Opens a dialog with a volume slider. Use this on other users in the same room. Otevře dialogové okno s posuvníkem pro hlasitost. Toto použijte u ostatních uživatelů v místnosti. &Developer &Hide Mumble Hides the main Mumble window. Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. Show the Developer Console Shows the Mumble Developer Console, where Mumble's log output can be inspected. &Connect... &Ban list... &Information... &Kick... &Ban... Local Volume Adjustment... Send &Message... &Add... &Remove... &Edit... Audio S&tatistics... &Settings... &Audio Wizard... Developer &Console... &About... About &Speex... About &Qt... &Certificate Wizard... &Register... Registered &Users... Change &Avatar... &Access Tokens... Reset &Comment... Reset &Avatar... View Comment... &Change Comment... R&egister... Show Shows the main Mumble window. Manual Manual Mumble Positional Audio Position X Y Z m Heading Azimuth Elevation ° Meta data Context Identity Set State Linked Activated Unhinge NetworkConfig Network Síť Updates are mandatory when using snapshot releases. Aktualizace jsou povinné, když používáte vývojové verze. Connection Připojení Use TCP compatibility mode Use TCP compatability mode Použít kompatibilní režim TCP <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). <b>Zapnout Kompatibilní režim TCP</b>.<br />Toto donutí Mumble použít pouze TCP při komunikaci se serverem. Tím se zvýší čas zpracování a způsobuje, že ztracené pakety vytvářejí nápadné pauzy v komunikaci, takže toto by mělo být použito pouze, když nemůžete použít výchozí nastavení (které používá UDP pro hlas a TCP pro kontrolu). Reconnect when disconnected Po odpojení se znovu připojit <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. <b>Při odpojení se znovu připojit<b>.<br />Toto donutí Mumble se automaticky znovu pokusit o připojení po 10 sekundách od selhání připojení k serveru. Reconnect automatically Připojit se znovu automaticky Proxy Proxy Type Typ Type of proxy to connect through Typ proxy, přes které se připojit Direct connection Přímé spojení HTTP(S) proxy HTTP(S) proxy SOCKS5 proxy SOCKS5 proxy Hostname Jméno hostitele Hostname of the proxy Jméno hostitele proxy Force TCP mode Vynutit režim TCP Enable QoS to prioritize packets Zapnout QoS pro upřednostňování paketů This will enable QoS, which will attempt to prioritize voice packets over other traffic. Toto zapne QoS, které se pokusí upřednostňovat hlasové pakety před jinými připojeními. Use Quality of Service Použít Quality of Service Don't send certificate to server and don't save passwords. (Not saved). Neposílat certifikáty na server a neukládat hesla. (Neukládá se). <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> <b>Toto potlačí identifikační informace od klientu</b><p>Klient se certifikátem nebude identifikovat, i když je nastaven, a nebude ukládat hesla pro připojení. Toto je zejména volba pro testování a nebude ukládána.</p> Suppress certificate and password storage Potlačit ukládání certifikátů a hesel <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>Typ proxy, přes které se připojit.</b><br />Toto donutí Mumble se připojit přes proxy pro všechna odchozí připojení. Poznámka: Tunelování přes proxy donutí Mumble použít kompatibilní režim TCP, což způsobí, že všechna hlasová data budou posílána přes kontrolní kanál. <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. <b>Jméno hostitele proxy.</b><br />Toto pole určuje jméno hostitele proxy, přes které chcete tunelovat připojení. Port Port Port number of the proxy Číslo portu proxy <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. <b>Číslo portu proxy.</b><br />Toto pole určuje číslo portu, na kterém proxy očekává spojení. Username Uživatelské jméno Username for proxy authentication Uživatelské jméno pro ověření na proxy <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>Uživatelské jméno pro ověření na proxy.</b><br />Toto určuje uživatelské jméno, které se použije pro Vaše ověření na proxy. V případě, že proxy ověření na proxy, nebo se chcete připojit anonymně, jednoduše nechte toto pole prázdné. Password Heslo Password for proxy authentication Heslo pro ověření na proxy <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>Heslo pro ověření na proxy.</b><br />Toto určuje heslo, které má být použito pro Vaše ověření na proxy. V případě, že proxy ověření na proxy, nebo se chcete připojit anonymně, jednoduše nechte toto pole prázdné. Mumble services Služby Mumble Check for new releases of Mumble automatically. Automaticky zkontrolovat, jestli jsou nové verze Mumble k dispozici. This will check for new releases of Mumble every time you start the program, and notify you if one is available. Toto zkontroluje nové verze Mumble pokaždé, když spustíte program, a upozorní Vás, je-li nová verze dostupná. Check for application updates on startup Při startu zkontrolovat aktualizace aplikace Check for new releases of plugins automatically. Automaticky zkontrolovat nové verze zásuvných modulů. This will check for new releases of plugins every time you start the program, and download them automatically. Toto zkontroluje nové verze zásuvných modulů pokaždé, když spustíte program, a automaticky je stáhne. <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. <b>Posílat anonymní statistiky.</b><br />Mumble má malý tým vývojářů, a tak potřebuje svůj vývoj soustředit tam, kde je ho nejvíc třeba. Posíláním trošky statistiky pomáháte projektu rozhodnout, kam zaměřit svůj vývoj. Submit anonymous statistics to the Mumble project Posílat anonymní statistiky projektu Mumble Submit anonymous statistics Posílat anonymní statistiky Reconnect to last used server when starting Mumble Při spuštení Mumble se znovu připojit na poslední server Reconnect to last server on startup Při startu se znovu připojit na poslední server Download plugin and overlay updates on startup Při startu stáhnout aktualizace zásuvných modulů a překryvů Privacy Prevent OS information being sent to Mumble servers and web servers <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. Do not send OS information to Mumble servers and web servers Overlay Silent Mlčící Talking Mluvící Whisper Šeptající Shout Křičící Channel Kanál Failed to create communication with overlay at %2: %1. No overlay will be available. Nelze vytvořit komunikaci s překryvem v %2: %1. Nebude dostupný žádný překryv. OverlayClient Filter Filtr Only talking Pouze mluvící Talking and recently active Mluvící a nedávno aktivní All in current channel Všichni v současném kanálu All in linked channels Všichni v propojených kanálech Always show yourself Sebe zobrazovat vždy Configure recently active time (%1 seconds)... Nastavit čas pro nedávnou aktivitu (%1 sekund)... Columns Sloupce Sort Seřadit Alphabetically Podle abecedy Last state change Podle poslední změny stavu Edit... Upravit... Reset Zoom Resetovat Přiblížení Configure recently active time Nastavit čas pro nedávnou aktivitu Amount of seconds users remain active after talking: Počet sekund, kdy poté, co uživatelé domluví, zůstanou aktivní: OverlayConfig To move the users, drag the little red dot. Pro přesun uživatelů, táhněte malou červenou tečkou. To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. Pro změnu velikosti uživatelů použijte kolečko myši. For more options, right click a user. For more options, rightclick a user. Pro více možností, na ně klikněte pravým tlačítkem. Launcher Filter Overlay Překryv Choose executable Zvolte spustitelný soubor Choose application Zvolte aplikaci Choose path Load Overlay Presets Nahrát Předvolby Překryvu Mumble overlay presets (*.mumblelay) Předvolby překryvu Mumble (*.mumblelay) Save Overlay Presets Uložit Předvolby Překryvu Options Volby Enable overlay. Zapnout překryv. Enable Overlay Zapnout Překryv This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. Toto nastavuje, zda je překryv zapnut či nikoliv. Toto nastavení se kontroluje pouze při startu aplikací, takže se ujistěte, že Mumble běží a tato volba je zapnuta předtím, než aplikaci spustíte.<br />Uvědomte si, prosím, že pokud spustíte Mumble až po spuštění aplikace, nebo překryv vypnete, zatímco aplikace běží, není žádný bezpečný způsob, jak překryv restartovat, aniž byste restartovali aplikaci. Layout Rozvržení Blacklist Nikdy Nezobrazit Whitelist Vždy Zobrazit Uninstall Overlay Odinstalovat Překryv Overlay Installation Instalace Překryvu Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. Mumble zjistil, že nemáte Překryv Mumble nainstalovaný. klikněte na tlačítko níže pro instalaci překryvu. Install Mumble Overlay Instalovat Překryv Mumble Overlay Upgrade Aktualizace Překryvu Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. Mumble zjistil starou verzi souboru podpory překryvu instalovaného na Vašem počítači. Pro aktualizaci těchto souborů na jejich poslední verzi, klikněte na tlačítko níže. Upgrade Mumble Overlay Aktualizovat Překryv Mumble Display a frame counter in the overlay Zobrazí v překryvu počítadlo snímků Show FPS counter Zobrazit počítadlo FPS Load an overlay preset from file Nahrát předvolby překryvu ze souboru Load… Nahrát... Save your overlay settings to file Uložit předvolby překryvu do souboru Save… Uložit... Set the overlay font. Nastavit typ písma překryvu. Set the overlay text color. Nastavit barvu textu překryvu. Color Barva Remove Odstranit Font Písmo FPS and Clock Display Zobrazení hodin a FPS Display a clock in the overlay showing the current local time (system time). Zobrazit hodiny v překryvu ukazující současný místní čas (systémový čas). Show Clock Zobrazit hodiny Overlay Exceptions Overlay Exception Mode Allowed launchers Add Allowed programs Allowed paths Blacklisted programs OverlayEditor State Stav User is not talking Uživtel nemluví Passive Pasivní User is talking in your channel or a linked channel Uživatel mluví ve Vašem nebo propojeném kanálu Talking Mluví User is whispering to you privately Uživatel k Vám soukromě šeptá Private Whisper Soukromý Šepot User is shouting to your channel Uživatel křiči do Vašeho kanálu Channel Whisper Šepot v Kanálu Zoom Přiblížit Zoom Factor Faktor Přiblížení Enabled Elements Povolené Prvky User avatar, chosen by each user Avatar uživatele, zvolen každým uživatelem Avatar Avatar User's name Jméno uživatele Username Uživatelské jméno Name of user's channel, if outside your current channel Jméno kanálu uživatele, je-li mimo Váš současný kanál Channel Kanál Muted or deafened Zeslaben nebo ohlušen Mute state Stav zeslabení Bounding box, automatically shrunk to minimum size to contain all visible elements Ohraničující rámeček, automaticky zmenšen na minimální velikost pro obsažení všech viditelných prvků Bounding box Ohraničující rámeček Overlay Editor Editor Překryvu OverlayEditorScene Layout preset Předvolba rozvržení Large square avatar Avatar ve velkém čtverečku Avatar and Name Avatar a Jméno User Opacity Průhlednost Uživatele %1% %1% Object Opacity Průhlednost Objektu Alignment Zarovnání Left Doleva Center Na střed Right Doprava Top Nahoru Bottom Dolů Color... Barva... Font... Písmo... Bounding box Ohraničující rámeček Pen width Šířka pera Padding Výplň Pen color Barva Pera Fill color Barva výplně Pick pen color Vybrat barvu pera Pick fill color Vybrat barvu výplně Pick color Vybrat barvu Pick font Vybrat typ písma PluginConfig Plugins Zásuvné Moduly Plugin has no configure function. Zásuvný modul nemá žádnou funkci nastavení. Plugin has no about function. Zásuvný modul nemá žádnou funkci O modul. Options Volby Enable plugins and transmit positional information Zapne zásuvné moduly a vysílá informace o pozici This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. Toto umožňuje zásuvným modulům pro podporované hry získat Vaši pozici ve hře a vysílat ji s každým hlasovým paketem. Tím můžou ostatní uživatelé slyšet Váš hlas ve hře ze směru, ve kterém se Vaše postava nachází v souvislosti jejich vlastní pozicí. Link to Game and Transmit Position Propojit s Hrou a Vysílat Pozici Reloads all plugins Znovu nahraje všechny zásuvné moduly This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. Toto opětovně skenuje a znovu nahraje zásuvné moduly. Toto použijte, pokud jste právě přidali nebo změnili zásuvné moduly v jejich adresáři. &Reload plugins &Znovu nahrát moduly Information about plugin Informace o zásuvném modulu This shows a small information message about the plugin. Toto zobrazí malou informační zprávu o zásuvném modulu. &About O &modulu Show configuration page of plugin Zobrazit stránku nastavení zásuvného modulu This shows the configuration page of the plugin, if any. Toto zobrazí informační stránku zásuvného modulu, pokud existuje. &Configure &Nastavit Name Jméno Enabled Povoleno Plugins Skipping plugin update in debug mode. V režimu ladění přeskakuji aktualizaci zásuvných modulů. Downloaded new or updated plugin to %1. Aktualizován nebo stáhnut nový zásuvný modul do %1. Failed to install new plugin to %1. Nelze instalovat nový zásuvný modul do %1. %1 lost link. %1 ztraceno propojení. %1 linked. %1 propojen. PortAudioSystem Default Device Výchozí Zařízení PulseAudioSystem Default Input Výchozí Vstup Default Output Výchozí Výstup QApplication Failed to restart mumble Nelze restartovat Mumble Mumble failed to restart itself. Please restart it manually. Mumble se nemohl restartovat. Prosím restartujte ho ručně. RichTextEditor Failed to load image Nelze načíst obrázek Image file too large to embed in document. Please use images smaller than %1 kB. Obrázkový soubor je příliš velký pro vnoření do dokumentu. Použijte, prosím, obrázky menší než %1 kB. Message is too long. Zpráva je příliš dlouhá. Display Zobrazení Source Text Zdrojový Text &Bold &Tučné Ctrl+B Ctrl+B &Italic &Kurzíva Italic Kurzíva Ctrl+I Ctrl+I Underline Podtržení Ctrl+U Ctrl+U Color Barva Insert Link Vložit odkaz Ctrl+L Ctrl+L Insert Image Vložit Obrázek RichTextEditorLink Add Link Přidat Odkaz URL URL Text Text ServerHandler Unable to resolve hostname Server is not responding to TCP pings UDP packets cannot be sent to or received from the server. Switching to TCP mode. Pakety UDP nelze na server odeslat ani je ze serveru přijímat. Přepínám na režim TCP. UDP packets cannot be sent to the server. Switching to TCP mode. Pakety UDP nelze odeslat na server. Přepínám na režim TCP. UDP packets cannot be received from the server. Switching to TCP mode. Pakety UDP nelze ze serveru přijmout. Přepínám na režim TCP. UDP packets can be sent to and received from the server. Switching back to UDP mode. Pakety UDP lze na server odeslat i je ze serveru přijímat. Přepínám zpět na režim UDP. Connection timed out Spojení vypršelo ServerView Favorite Oblíbené LAN LAN Public Internet Veřejný Internet Unknown Africa Afrika Asia Asie North America Severní Amerika South America Jižní Amerika Europe Evropa Oceania Oceánie ShortcutActionWidget Unassigned Nepřiřazeno ShortcutDelegate On Zapnuto Off Vypnuto Toggle Sepnout Unassigned Nepřiřazeno ShortcutKeyWidget Press Shortcut Zmáčkněte Zkratku ShortcutTargetDialog Root Kořen Parent Nadřazený Current Současný Subchannel #%1 Podkanál #%1 ShortcutTargetWidget ... ... , , Root Kořen Parent Nadřazený Current Současný Subchannel #%1 Podkanál #%1 Invalid Neplatný Empty <Empty> Prázdný ShortcutToggleWidget Off Vypnuto Toggle Sepnout On Zapnuto TextMessage Enter text Zadat text If checked the message is recursively sent to all subchannels Je-li zaškrtnuto, zpráva bude rekurzivně poslána do všech podkanálů Send recursively to subchannels Poslat rekurzivně do podkanálů Tokens Empty Token Prázdný Znak Mumble - Access Tokens Mumble - Znaky Přístupu List of access tokens on current server Seznam znaků přístupu na současném serveru <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. <b>Toto je upravitelný seznam znaků přístupu na připojeném serveru.</b> <br /> Znak přístupu je textový řetězec, který může být použit jako heslo pro velmi jednoduchou správu přístupu v kanálech. Mumble si zapamatuje znaky, které jste použili a pošle je znovu na server, když se příště připojíte znovu, takže je nemusíte pokaždé zadávat. Add a token Přidat znak &Add &Přidat Remove a token Odstranit znak &Remove &Odstranit UserEdit Registered Users Registrovaní Uživatelé Remove Odstranit Rename Přejmenovat Who are you looking for? Koho hledáte? Days Dny Weeks Týdny Months Měsíce Years Roky Inactive for Neaktivní po Registered users: %n account(s) Registrovaní uživatelé: %n účetRegistrovaní uživatelé: %n účtyRegistrovaní uživatelé: %n účtůRegistrovaní uživatelé: %n účtů UserInformation User Information Informace O Uživateli Connection Information Informace O Připojení Version Verze OS OS Certificate Certifikáty IP Address IP Adresa CELT Versions Verze CELT Details... Podrobnosti... Ping Statistics Statistiky Odezvy Pings received Přijaté odezvy Average ping Průmerná odezva TCP (Control) TCP (Kontrola) UDP (Voice) UDP (Hlas) UDP Network statistics Statistiky Sítě UDP Good Dobré Late Ztracené Lost Zpožděné Resync Resynch From Client Od Klientu To Client Ke Klientu Connection time Čas připojení %1w %1w %1d %1d %1h %1h %1m %1m %1s %1s , , %1 (%2) %1.%2.%3 (%4) %1 (%2) Supported Podporováno Not Supported Nepodporováno Not Reported Nenahlášeno %1 online (%2 idle) %1 online (%2 nečinný) %1 online %1 online %1 kbit/s %1 kbit/s Bandwidth GroupBox Šířka pásma Bandwidth Label Šířka pásma Ping deviation Odchylka odezvy UserListModel Nick Přezdívka Inactive days Dní neaktivity Last channel Poslední kanál Last seen: %1 Naposledy viděn: %1 Never Nikdy Channel ID: %1 UserLocalVolumeDialog Local volume for other users Místní hlasitost pro ostatní uživatele <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. <b>Upraví místní hlasitost ostatních uživatelů</b><br />Mumble podporuje místní úpravu hlasitosti ostatních uižvatelů. Adjusting local volume for %1 Upravování místní hlasitosti pro %1 dB dB <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> <html><head/><body><p>Použijte posuvník nebo textový rámeček pro změnu hlasitosti uživatele.</p><p><span style="font-weight:600;">Upozornění!</span></p><p>Přílišným zvýšením hlasitosti uživatele si můžete natrvalo pškodit svůj sluch. Můžete tím také zvýšit hluk z jeho okolí.</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: Toto je uživatel připojený k serveru. Ikona nalevo od uživatele udává, jestli mluví nebo ne: Talking to your channel. Mluví s Vaším kanálem. Shouting directly to your channel. Whispering directly to your channel. Křičí přímo do Vašeho kanálu. Whispering directly to you. Šeptá přímo k Vám. Not talking. Nemluví. This is a channel on the server. The icon indicates the state of the channel: Toto je kanál na serveru. Ikona udává stav kanálu: Your current channel. Váš současný kanál. A channel that is linked with your channel. Linked channels can talk to each other. Kanál, který je propojen s Vaším. Propojené kanály si můžou povídat k sobě navzájem. A channel on the server that you are not linked to. Kanál na serveru, s kterým nejste propojen. This shows the flags the user has on the server, if any: Toto zobrazí indikátory, které uživatel na serveru má, jestli vůbec: On your friend list Na Vašem seznamu příátel Authenticated user Ověřený uživatel Muted (manually muted by self) Zeslaben (ručně sebe zeslabil) Muted (manually muted by admin) Zeslaben (ručně zeslaben administrátorem) Muted (not allowed to speak in current channel) Zeslaben (není mu v současném kanálu dovoleno mluvit) Muted (muted by you, only on your machine) Zeslaben (zeslaben Vámi, pouze na Vašem počítači) Muted (push-to-mute) Deafened (by self) Ohlušen (sám sebe) Deafened (by admin) Ohlušen (administrátorem) User has a new comment set (click to show) Uživatel má nastaven nový komentář (klikněte pro zobrazení) User has a comment set, which you've already seen. (click to show) Uživatel má nastaven komentář, který jste už viděli (klikněte pro zobrazení) Ignoring Text Messages Ignorování textových zpráv This shows the flags the channel has, if any: Toto zobrazí indikátory, které kanál má, jestli vůbec: Channel has a new comment set (click to show) Kanál má nastaven nový komentář (klikněte pro zobrazení) Channel has a comment set, which you've already seen. (click to show) Kanál má nastaven komentář, který jste už viděli (klikněte pro zobrazení) Channel will be hidden when filtering is enabled Kanál bude schován při zapnutí filtrování Name Jméno Flags Příznaky Are you sure you want to drag this user? Are you sure you want to drag this channel? Jste si jisti, že chcete tento kanál přetáhnout? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. Nelze provést tento pohyb automaticky, restartujte, prosím, indikátory číselného řazení nebo ho upravte ručně. VersionCheck Upgrade Mumble Aktualizovat Mumble A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? Byla zjištěna a automaticky stáhnuta nová verze Mumble. Je doporučeno buď aktualizovat na tuto verzi, nebo přeinstalovat na poslední stabilní verzi. Chcete teď spustit instalátor? Failed to launch snapshot installer. Nelze spustit instalátor vývojové verze. Corrupt download of new version detected. Automatically removed. Zjištěno poškození stáhnuté nové verze. Byla automaticky odstraněna. Downloading new snapshot from %1 to %2 Stahuji novou vývojovou verzi z %1 do %2 Failed to write new version to disk. Failed to write new version to disc. Nelze zapsat novou verzi na disk. Mumble failed to retrieve version information from the central server. Mumble nemohl z centrálního serveru získat informace o verzi. ViewCert Certificate Chain Details Podrobnosti Řetězu Certifikátů Certificate chain Řetěz certifikátů Certificate details Podrobnosti certifikátu Common Name Organization Subunit Country Locality State Valid from: %1 Platný od: %1 Valid to: %1 Platný do: %1 Serial: %1 Sériové Číslo: %1 Public Key: %1 bits %2 Veřejný Klíč %1 bitů %2 RSA RSA DSA DSA Digest (SHA-1): %1 Digest ((SHA-1): %1 Digest (SHA-256): %1 Email: %1 E-mail: %1 DNS: %1 DNS: %1 Issued by: Vydal: Unit Name VoiceRecorder Recorder failed to create directory '%1' Nahrávač nemohl vytvořit adresář '%1' Recorder failed to open file '%1' Nahrávač nemohl otevřít soubor '%1' .wav - Uncompressed .wav - Nekomprimováno .ogg (Vorbis) - Compressed .ogg (Vorbis) - Komprimováno .au - Uncompressed .au - Nekomprimováno .flac - Lossless compressed .flac - Komprimováno bezeztrátově VoiceRecorderDialog Recorder Nahrávač Control Ovládání 00:00:00 00:00:00 &Start &Spustit S&top &Zastavit Mode Režim Multichannel Vícekanálové Output Výstup Output format Výstupní formát Target directory Cílový adresář Filename Jméno souboru &Browse... &Procházet... Valid variables are: Platné proměnné jsou: Inserts the user's name Vloží jméno uživatele Inserts the current date Vloží aktuální datum Inserts the current time Vloží aktuální čas Inserts the hostname Vloží jméno hostitele Recorder still running Nahrávač stále běží Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? Zavřením nahrávače bez jeho zastavení zahodíte nezapsaný zvuk. Opravdu chcete nahrávač zavřít? Unable to start recording. Not connected to a server. Nelze spustit nahrávání. Nejste připojeni k serveru. The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. Server, na kterém jste nyní připojeni, je verze 1.2.2 nebo starší. Z důvodů soukromí, nahrávání na serverech verze starší než 1.2.3 není možné. Prosím kontaktujte Vašeho administrátora serveru pro další informace. There is already a recorder active for this server. Pro tento server již existuje aktivní nahrávání. Please select a recording format. Prosím zvolte formát nahrávání. Stopping Zastavování Select target directory Zvolte cílový adresář Downmix Smíšení Kanálů WASAPIInput Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone. WASAPISystem Default Device Výchozí zařízení qwPTTButtonWidget Mumble PTT Mumble PTT Push to talk Stiskněte pro mluvení mumble-1.3.4/src/mumble/OverlayPositionableItem.h0000664000175000017500000000220614010707273021673 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_OVERLAYPOSITIONABLEITEM_H #define MUMBLE_MUMBLE_OVERLAYPOSITIONABLEITEM_H #include #if QT_VERSION >= 0x050000 # include #else # include #endif class OverlayPositionableItem : public QObject, public QGraphicsPixmapItem { Q_OBJECT Q_DISABLE_COPY(OverlayPositionableItem); public: OverlayPositionableItem(QRectF *posPtr, const bool isPositionable=false); virtual ~OverlayPositionableItem(); void updateRender(); void setItemVisible(const bool &visible); private: /// Float value between 0 and 1 where 0,0 is top left, and 1,1 is bottom right QRectF *m_position; const bool m_isPositionEditable; QGraphicsEllipseItem *m_qgeiHandle; void createPositioningHandle(); bool sceneEventFilter(QGraphicsItem *, QEvent *) Q_DECL_OVERRIDE; private slots: void onMove(); }; #endif mumble-1.3.4/src/mumble/Messages.cpp0000664000175000017500000007750214010707273017177 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "About.h" #include "ACLEditor.h" #include "AudioInput.h" #include "AudioStats.h" #include "AudioWizard.h" #include "BanEditor.h" #include "Channel.h" #include "Connection.h" #include "ConnectDialog.h" #include "Database.h" #include "GlobalShortcut.h" #include "Log.h" #include "MainWindow.h" #include "Overlay.h" #include "Plugins.h" #include "ServerHandler.h" #include "User.h" #include "UserEdit.h" #include "UserInformation.h" #include "UserModel.h" #include "VersionCheck.h" #include "ViewCert.h" #include "CryptState.h" // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" #define ACTOR_INIT \ ClientUser *pSrc=NULL; \ if (msg.has_actor()) \ pSrc = ClientUser::get(msg.actor()); \ Q_UNUSED(pSrc); #define VICTIM_INIT \ ClientUser *pDst=ClientUser::get(msg.session()); \ if (!pDst) { \ qWarning("MainWindow: Message for nonexistent victim %d.", msg.session()); \ return; \ } #define SELF_INIT \ ClientUser *pSelf = ClientUser::get(g.uiSession); \ if (!pSelf) { \ qWarning("MainWindow: Received message outside of session (sid %d).", g.uiSession); \ return; \ } void MainWindow::msgAuthenticate(const MumbleProto::Authenticate &) { } void MainWindow::msgBanList(const MumbleProto::BanList &msg) { if (banEdit) { banEdit->reject(); delete banEdit; banEdit = NULL; } banEdit = new BanEditor(msg, this); banEdit->show(); } void MainWindow::msgReject(const MumbleProto::Reject &msg) { rtLast = msg.type(); QString reason; switch (rtLast) { case MumbleProto::Reject_RejectType_InvalidUsername: reason = tr("Invalid username"); break; case MumbleProto::Reject_RejectType_UsernameInUse: reason = tr("Username in use"); break; case MumbleProto::Reject_RejectType_WrongUserPW: reason = tr("Wrong certificate or password"); break; case MumbleProto::Reject_RejectType_WrongServerPW: reason = tr("Wrong password"); break; case MumbleProto::Reject_RejectType_AuthenticatorFail: reason = tr("Your account information can not be verified currently. Please try again later"); break; default: reason = Qt::escape(u8(msg.reason())); break; } g.l->log(Log::ServerDisconnected, tr("Server connection rejected: %1.").arg(reason)); g.l->setIgnore(Log::ServerDisconnected, 1); } void MainWindow::msgServerSync(const MumbleProto::ServerSync &msg) { g.sh->sendPing(); // Send initial ping to establish UDP connection g.uiSession = msg.session(); g.pPermissions = ChanACL::Permissions(static_cast(msg.permissions())); g.l->clearIgnore(); if (msg.has_welcome_text()) { QString str = u8(msg.welcome_text()); if (!str.isEmpty()) { g.l->log(Log::Information, tr("Welcome message: %1").arg(str)); } } pmModel->ensureSelfVisible(); pmModel->recheckLinks(); qmTargetUse.clear(); qmTargets.clear(); for (int i=1;i<6;++i) { qmTargetUse.insert(i, i); } iTargetCounter = 100; AudioInput::setMaxBandwidth(msg.max_bandwidth()); findDesiredChannel(); QString host, uname, pw; unsigned short port; g.sh->getConnectionInfo(host, port, uname, pw); QList sc = g.db->getShortcuts(g.sh->qbaDigest); if (! sc.isEmpty()) { for (int i=0;igsWhisper->idx; } g.s.qlShortcuts << sc; GlobalShortcutEngine::engine->bNeedRemap = true; } const ClientUser *user = ClientUser::get(g.uiSession); connect(user, SIGNAL(talkingStateChanged()), this, SLOT(userStateChanged())); connect(user, SIGNAL(muteDeafStateChanged()), this, SLOT(userStateChanged())); connect(user, SIGNAL(prioritySpeakerStateChanged()), this, SLOT(userStateChanged())); connect(user, SIGNAL(recordingStateChanged()), this, SLOT(userStateChanged())); qstiIcon->setToolTip(tr("Mumble: %1").arg(Qt::escape(Channel::get(0)->qsName))); // Update QActions and menues on_qmServer_aboutToShow(); on_qmSelf_aboutToShow(); qmChannel_aboutToShow(); qmUser_aboutToShow(); on_qmConfig_aboutToShow(); updateTrayIcon(); g.sh->setServerSynchronized(true); } void MainWindow::msgServerConfig(const MumbleProto::ServerConfig &msg) { if (msg.has_welcome_text()) { QString str = u8(msg.welcome_text()); if (!str.isEmpty()) { g.l->log(Log::Information, tr("Welcome message: %1").arg(str)); } } if (msg.has_max_bandwidth()) AudioInput::setMaxBandwidth(msg.max_bandwidth()); if (msg.has_allow_html()) g.bAllowHTML = msg.allow_html(); if (msg.has_message_length()) g.uiMessageLength = msg.message_length(); if (msg.has_image_message_length()) g.uiImageLength = msg.image_message_length(); if (msg.has_max_users()) g.uiMaxUsers = msg.max_users(); } void MainWindow::msgPermissionDenied(const MumbleProto::PermissionDenied &msg) { switch (msg.type()) { case MumbleProto::PermissionDenied_DenyType_Permission: { VICTIM_INIT; SELF_INIT; Channel *c = Channel::get(msg.channel_id()); if (! c) return; QString pname = ChanACL::permName(static_cast(msg.permission())); if (pDst == pSelf) g.l->log(Log::PermissionDenied, tr("You were denied %1 privileges in %2.").arg(Log::msgColor(pname, Log::Privilege)).arg(Log::formatChannel(c))); else g.l->log(Log::PermissionDenied, tr("%3 was denied %1 privileges in %2.").arg(Log::msgColor(pname, Log::Privilege)).arg(Log::formatChannel(c)).arg(Log::formatClientUser(pDst, Log::Target))); } break; case MumbleProto::PermissionDenied_DenyType_SuperUser: { g.l->log(Log::PermissionDenied, tr("Denied: Cannot modify SuperUser.")); } break; case MumbleProto::PermissionDenied_DenyType_ChannelName: { g.l->log(Log::PermissionDenied, tr("Denied: Invalid channel name.")); } break; case MumbleProto::PermissionDenied_DenyType_TextTooLong: { g.l->log(Log::PermissionDenied, tr("Denied: Text message too long.")); } break; case MumbleProto::PermissionDenied_DenyType_H9K: { if (g.bHappyEaster) { bool bold = g.s.bDeaf; bool bold2 = g.s.bTTS; g.s.bDeaf = false; g.s.bTTS = true; quint32 oflags = g.s.qmMessages.value(Log::PermissionDenied); g.s.qmMessages[Log::PermissionDenied] = (oflags | Settings::LogTTS) & (~Settings::LogSoundfile); g.l->log(Log::PermissionDenied, QString::fromUtf8(g.ccHappyEaster + 39).arg(Qt::escape(g.s.qsUsername))); g.s.qmMessages[Log::PermissionDenied] = oflags; g.s.bDeaf = bold; g.s.bTTS = bold2; g.mw->setWindowIcon(QIcon(QString::fromUtf8(g.ccHappyEaster))); g.mw->setStyleSheet(QString::fromUtf8(g.ccHappyEaster + 82)); qWarning() << "Happy Easter"; } } break; case MumbleProto::PermissionDenied_DenyType_TemporaryChannel: { g.l->log(Log::PermissionDenied, tr("Denied: Operation not permitted in temporary channel.")); } break; case MumbleProto::PermissionDenied_DenyType_MissingCertificate: { VICTIM_INIT; SELF_INIT; if (pDst == pSelf) g.l->log(Log::PermissionDenied, tr("You need a certificate to perform this operation.")); else g.l->log(Log::PermissionDenied, tr("%1 does not have a certificate.").arg(Log::formatClientUser(pDst, Log::Target))); } break; case MumbleProto::PermissionDenied_DenyType_UserName: { if (msg.has_name()) g.l->log(Log::PermissionDenied, tr("Invalid username: %1.").arg(Qt::escape(u8(msg.name())))); else g.l->log(Log::PermissionDenied, tr("Invalid username.")); } break; case MumbleProto::PermissionDenied_DenyType_ChannelFull: { g.l->log(Log::PermissionDenied, tr("Channel is full.")); } break; case MumbleProto::PermissionDenied_DenyType_NestingLimit: { g.l->log(Log::PermissionDenied, tr("Channel nesting limit reached.")); } break; case MumbleProto::PermissionDenied_DenyType_ChannelCountLimit: { g.l->log(Log::PermissionDenied, tr("Channel count limit reached. Need to delete channels before creating new ones.")); } break; default: { if (msg.has_reason()) g.l->log(Log::PermissionDenied, tr("Denied: %1.").arg(Qt::escape(u8(msg.reason())))); else g.l->log(Log::PermissionDenied, tr("Permission denied.")); } break; } } void MainWindow::msgUDPTunnel(const MumbleProto::UDPTunnel &) { } void MainWindow::msgUserState(const MumbleProto::UserState &msg) { ACTOR_INIT; ClientUser* pSelf = ClientUser::get(g.uiSession); ClientUser *pDst = ClientUser::get(msg.session()); Channel *channel = NULL; if (msg.has_channel_id()) { channel = Channel::get(msg.channel_id()); if (!channel) { qWarning("msgUserState(): unknown channel."); channel = Channel::get(0); } } // User just connected if (!pDst) { if (!msg.has_name()) { return; } pDst = pmModel->addUser(msg.session(), u8(msg.name())); if (channel) { pmModel->moveUser(pDst, channel); } if (msg.has_hash()) { pmModel->setHash(pDst, u8(msg.hash())); } if (pSelf) { if (pDst->cChannel == pSelf->cChannel) { g.l->log(Log::ChannelJoinConnect, tr("%1 connected and entered channel.").arg(Log::formatClientUser(pDst, Log::Source))); } else { g.l->log(Log::UserJoin, tr("%1 connected.").arg(Log::formatClientUser(pDst, Log::Source))); } } } if (msg.has_user_id()) { pmModel->setUserId(pDst, msg.user_id()); } if (channel) { Channel *oldChannel = pDst->cChannel; if (channel != oldChannel) { pmModel->moveUser(pDst, channel); if (pSelf) { if (pDst == pSelf) { g.mw->updateChatBar(); qsDesiredChannel = channel->getPath(); } if (pDst == pSelf) { if (pSrc == pSelf) { g.l->log(Log::SelfChannelJoin, tr("You joined %1.").arg(Log::formatChannel(channel))); } else { g.l->log(Log::SelfChannelJoinOther, tr("You were moved to %1 by %2.").arg(Log::formatChannel(channel)).arg(Log::formatClientUser(pSrc, Log::Source))); } } else if (pSrc == pSelf) { if (channel == pSelf->cChannel) { g.l->log(Log::ChannelJoin, tr("You moved %1 to %2.").arg(Log::formatClientUser(pDst, Log::Target)).arg(Log::formatChannel(channel))); } else { g.l->log(Log::ChannelLeave, tr("You moved %1 to %2.").arg(Log::formatClientUser(pDst, Log::Target)).arg(Log::formatChannel(channel))); } } else if ((channel == pSelf->cChannel) || (oldChannel == pSelf->cChannel)) { if (pDst == pSrc) { if (channel == pSelf->cChannel) { g.l->log(Log::ChannelJoin, tr("%1 entered channel.").arg(Log::formatClientUser(pDst, Log::Target))); } else { g.l->log(Log::ChannelLeave, tr("%1 moved to %2.").arg(Log::formatClientUser(pDst, Log::Target)).arg(Log::formatChannel(channel))); } } else { if (channel == pSelf->cChannel) { g.l->log(Log::ChannelJoin, tr("%1 moved in from %2 by %3.").arg(Log::formatClientUser(pDst, Log::Target)).arg(Log::formatChannel(oldChannel)).arg(Log::formatClientUser(pSrc, Log::Source))); } else { g.l->log(Log::ChannelLeave, tr("%1 moved to %2 by %3.").arg(Log::formatClientUser(pDst, Log::Target)).arg(Log::formatChannel(channel)).arg(Log::formatClientUser(pSrc, Log::Source))); } } } if ((channel == pSelf->cChannel) && pDst->bRecording) { g.l->log(Log::Recording, tr("%1 is recording").arg(Log::formatClientUser(pDst, Log::Target))); } } } } if (msg.has_name()) { QString oldName = pDst->qsName; QString newName = u8(msg.name()); pmModel->renameUser(pDst, newName); if (! oldName.isNull() && oldName != newName) { if (pSrc != pDst) { g.l->log(Log::UserRenamed, tr("%1 renamed to %2 by %3.").arg(Log::formatClientUser(pDst, Log::Target, oldName)) .arg(Log::formatClientUser(pDst, Log::Target)).arg(Log::formatClientUser(pSrc, Log::Source))); } else { g.l->log(Log::UserRenamed, tr("%1 renamed to %2.").arg(Log::formatClientUser(pDst, Log::Target, oldName), Log::formatClientUser(pDst, Log::Target))); } } } if (!pDst->qsHash.isEmpty()) { const QString &name = g.db->getFriend(pDst->qsHash); if (! name.isEmpty()) pmModel->setFriendName(pDst, name); if (g.db->isLocalMuted(pDst->qsHash)) pDst->setLocalMute(true); if (g.db->isLocalIgnored(pDst->qsHash)) pDst->setLocalIgnore(true); pDst->fLocalVolume = g.db->getUserLocalVolume(pDst->qsHash); } if (msg.has_self_deaf() || msg.has_self_mute()) { if (msg.has_self_mute()) pDst->setSelfMute(msg.self_mute()); if (msg.has_self_deaf()) pDst->setSelfDeaf(msg.self_deaf()); if (pSelf && pDst != pSelf && ((pDst->cChannel == pSelf->cChannel) || pDst->cChannel->allLinks().contains(pSelf->cChannel))) { if (pDst->bSelfMute && pDst->bSelfDeaf) g.l->log(Log::OtherSelfMute, tr("%1 is now muted and deafened.").arg(Log::formatClientUser(pDst, Log::Target))); else if (pDst->bSelfMute) g.l->log(Log::OtherSelfMute, tr("%1 is now muted.").arg(Log::formatClientUser(pDst, Log::Target))); else g.l->log(Log::OtherSelfMute, tr("%1 is now unmuted.").arg(Log::formatClientUser(pDst, Log::Target))); } } if (msg.has_recording()) { pDst->setRecording(msg.recording()); // Do nothing during initial sync if (pSelf) { if (pDst == pSelf) { if (pDst->bRecording) { g.l->log(Log::Recording, tr("Recording started")); } else { g.l->log(Log::Recording, tr("Recording stopped")); } } else if (pDst->cChannel->allLinks().contains(pSelf->cChannel)) { if (pDst->bRecording) { g.l->log(Log::Recording, tr("%1 started recording.").arg(Log::formatClientUser(pDst, Log::Source))); } else { g.l->log(Log::Recording, tr("%1 stopped recording.").arg(Log::formatClientUser(pDst, Log::Source))); } } } } if (msg.has_priority_speaker()) { if (pSelf && ((pDst->cChannel == pSelf->cChannel) || (pDst->cChannel->allLinks().contains(pSelf->cChannel)) || (pSrc == pSelf))) { if ((pSrc == pDst) && (pSrc == pSelf)) { if (pDst->bPrioritySpeaker) { g.l->log(Log::YouMuted, tr("You revoked your priority speaker status.")); } else { g.l->log(Log::YouMuted, tr("You assumed priority speaker status.")); } } else if ((pSrc != pSelf) && (pDst == pSelf) ) { if (pDst->bPrioritySpeaker) { g.l->log(Log::YouMutedOther, tr("%1 revoked your priority speaker status.").arg(Log::formatClientUser(pSrc, Log::Source))); } else { g.l->log(Log::YouMutedOther, tr("%1 gave you priority speaker status.").arg(Log::formatClientUser(pSrc, Log::Source))); } } else if ((pSrc == pSelf) && (pSrc != pDst)) { if (pDst->bPrioritySpeaker) { g.l->log(Log::YouMutedOther, tr("You revoked priority speaker status for %1.").arg(Log::formatClientUser(pDst, Log::Target))); } else { g.l->log(Log::YouMutedOther, tr("You gave priority speaker status to %1.").arg(Log::formatClientUser(pDst, Log::Target))); } } else if ((pSrc == pDst) && (pSrc != pSelf)) { if (pDst->bPrioritySpeaker) { g.l->log(Log::OtherMutedOther, tr("%1 revoked own priority speaker status.").arg(Log::formatClientUser(pSrc, Log::Source))); } else { g.l->log(Log::OtherMutedOther, tr("%1 assumed priority speaker status.").arg(Log::formatClientUser(pSrc, Log::Source))); } } else if ((pSrc != pSelf) && (pDst != pSelf)) { if (pDst->bPrioritySpeaker) { g.l->log(Log::OtherMutedOther, tr("%1 revoked priority speaker status for %2.").arg(Log::formatClientUser(pSrc, Log::Source), Log::formatClientUser(pDst, Log::Target))); } else if (!pDst->bPrioritySpeaker) { g.l->log(Log::OtherMutedOther, tr("%1 gave priority speaker status to %2.").arg(Log::formatClientUser(pSrc, Log::Source), Log::formatClientUser(pDst, Log::Target))); } } } pDst->setPrioritySpeaker(msg.priority_speaker()); } if (msg.has_deaf() || msg.has_mute() || msg.has_suppress()) { if (msg.has_mute()) pDst->setMute(msg.mute()); if (msg.has_deaf()) pDst->setDeaf(msg.deaf()); if (msg.has_suppress()) pDst->setSuppress(msg.suppress()); if (pSelf && ((pDst->cChannel == pSelf->cChannel) || (pDst->cChannel->allLinks().contains(pSelf->cChannel)) || (pSrc == pSelf))) { if (pDst == pSelf) { if (msg.has_mute() && msg.has_deaf() && pDst->bMute && pDst->bDeaf) { g.l->log(Log::YouMuted, tr("You were muted and deafened by %1.").arg(Log::formatClientUser(pSrc, Log::Source))); } else if (msg.has_mute() && msg.has_deaf() && !pDst->bMute && !pDst->bDeaf) { g.l->log(Log::YouMuted, tr("You were unmuted and undeafened by %1.").arg(Log::formatClientUser(pSrc, Log::Source))); } else { if (msg.has_mute()) { if (pDst->bMute) g.l->log(Log::YouMuted, tr("You were muted by %1.").arg(Log::formatClientUser(pSrc, Log::Source))); else g.l->log(Log::YouMuted, tr("You were unmuted by %1.").arg(Log::formatClientUser(pSrc, Log::Source))); } if (msg.has_deaf()) { if (!pDst->bDeaf) g.l->log(Log::YouMuted, tr("You were undeafened by %1.").arg(Log::formatClientUser(pSrc, Log::Source))); } } if (msg.has_suppress()) { if (pDst->bSuppress) g.l->log(Log::YouMuted, tr("You were suppressed.")); else { if (msg.has_channel_id()) g.l->log(Log::YouMuted, tr("You were unsuppressed.")); else g.l->log(Log::YouMuted, tr("You were unsuppressed by %1.").arg(Log::formatClientUser(pSrc, Log::Source))); } } updateTrayIcon(); } else if (pSrc == pSelf) { if (msg.has_mute() && msg.has_deaf() && pDst->bMute && pDst->bDeaf) { g.l->log(Log::YouMutedOther, tr("You muted and deafened %1.").arg(Log::formatClientUser(pDst, Log::Target))); } else if (msg.has_mute() && msg.has_deaf() && !pDst->bMute && !pDst->bDeaf) { g.l->log(Log::YouMutedOther, tr("You unmuted and undeafened %1.").arg(Log::formatClientUser(pDst, Log::Target))); } else { if (msg.has_mute()) { if (pDst->bMute) g.l->log(Log::YouMutedOther, tr("You muted %1.").arg(Log::formatClientUser(pDst, Log::Target))); else g.l->log(Log::YouMutedOther, tr("You unmuted %1.").arg(Log::formatClientUser(pDst, Log::Target))); } if (msg.has_deaf()) { if (!pDst->bDeaf) g.l->log(Log::YouMutedOther, tr("You undeafened %1.").arg(Log::formatClientUser(pDst, Log::Target))); } } if (msg.has_suppress()) { if (! msg.has_channel_id()) { if (pDst->bSuppress) g.l->log(Log::YouMutedOther, tr("You suppressed %1.").arg(Log::formatClientUser(pDst, Log::Target))); else g.l->log(Log::YouMutedOther, tr("You unsuppressed %1.").arg(Log::formatClientUser(pDst, Log::Target))); } } } else { if (msg.has_mute() && msg.has_deaf() && pDst->bMute && pDst->bDeaf) { g.l->log(Log::OtherMutedOther, tr("%1 muted and deafened by %2.").arg(Log::formatClientUser(pDst, Log::Target), Log::formatClientUser(pSrc, Log::Source))); } else if (msg.has_mute() && msg.has_deaf() && !pDst->bMute && !pDst->bDeaf) { g.l->log(Log::OtherMutedOther, tr("%1 unmuted and undeafened by %2.").arg(Log::formatClientUser(pDst, Log::Target), Log::formatClientUser(pSrc, Log::Source))); } else { if (msg.has_mute()) { if (pDst->bMute) g.l->log(Log::OtherMutedOther, tr("%1 muted by %2.").arg(Log::formatClientUser(pDst, Log::Target), Log::formatClientUser(pSrc, Log::Source))); else g.l->log(Log::OtherMutedOther, tr("%1 unmuted by %2.").arg(Log::formatClientUser(pDst, Log::Target), Log::formatClientUser(pSrc, Log::Source))); } if (msg.has_deaf()) { if (!pDst->bDeaf) g.l->log(Log::OtherMutedOther, tr("%1 undeafened by %2.").arg(Log::formatClientUser(pDst, Log::Target), Log::formatClientUser(pSrc, Log::Source))); } } if (msg.has_suppress()) { if (! msg.has_channel_id()) { if (pDst->bSuppress) g.l->log(Log::OtherMutedOther, tr("%1 suppressed by %2.").arg(Log::formatClientUser(pDst, Log::Target), Log::formatClientUser(pSrc, Log::Source))); else g.l->log(Log::OtherMutedOther, tr("%1 unsuppressed by %2.").arg(Log::formatClientUser(pDst, Log::Target), Log::formatClientUser(pSrc, Log::Source))); } } } } } if (msg.has_texture_hash()) { pDst->qbaTextureHash = blob(msg.texture_hash()); pDst->qbaTexture = QByteArray(); g.o->verifyTexture(pDst); } if (msg.has_texture()) { pDst->qbaTexture = blob(msg.texture()); if (pDst->qbaTexture.isEmpty()) { pDst->qbaTextureHash = QByteArray(); } else { pDst->qbaTextureHash = sha1(pDst->qbaTexture); g.db->setBlob(pDst->qbaTextureHash, pDst->qbaTexture); } g.o->verifyTexture(pDst); } if (msg.has_comment_hash()) pmModel->setCommentHash(pDst, blob(msg.comment_hash())); if (msg.has_comment()) pmModel->setComment(pDst, u8(msg.comment())); } void MainWindow::msgUserRemove(const MumbleProto::UserRemove &msg) { VICTIM_INIT; ACTOR_INIT; SELF_INIT; QString reason = Qt::escape(u8(msg.reason())); if (pDst == pSelf) { bRetryServer = false; if (msg.ban()) g.l->log(Log::YouKicked, tr("You were kicked and banned from the server by %1: %2.").arg(Log::formatClientUser(pSrc, Log::Source)).arg(reason)); else g.l->log(Log::YouKicked, tr("You were kicked from the server by %1: %2.").arg(Log::formatClientUser(pSrc, Log::Source)).arg(reason)); } else if (pSrc) { if (msg.ban()) g.l->log((pSrc == pSelf) ? Log::YouKicked : Log::UserKicked, tr("%3 was kicked and banned from the server by %1: %2.").arg(Log::formatClientUser(pSrc, Log::Source)).arg(reason).arg(Log::formatClientUser(pDst, Log::Target))); else g.l->log((pSrc == pSelf) ? Log::YouKicked : Log::UserKicked, tr("%3 was kicked from the server by %1: %2.").arg(Log::formatClientUser(pSrc, Log::Source)).arg(reason).arg(Log::formatClientUser(pDst, Log::Target))); } else { if (pDst->cChannel == pSelf->cChannel || pDst->cChannel->allLinks().contains(pSelf->cChannel)) { g.l->log(Log::ChannelLeaveDisconnect, tr("%1 left channel and disconnected.").arg(Log::formatClientUser(pDst, Log::Source))); } else { g.l->log(Log::UserLeave, tr("%1 disconnected.").arg(Log::formatClientUser(pDst, Log::Source))); } } if (pDst != pSelf) pmModel->removeUser(pDst); } void MainWindow::msgChannelState(const MumbleProto::ChannelState &msg) { if (! msg.has_channel_id()) return; Channel *c = Channel::get(msg.channel_id()); Channel *p = msg.has_parent() ? Channel::get(msg.parent()) : NULL; if (!c) { // Addresses channel does not exist so create it if (p && msg.has_name()) { c = pmModel->addChannel(msg.channel_id(), p, u8(msg.name())); c->bTemporary = msg.temporary(); p = NULL; // No need to move it later ServerHandlerPtr sh = g.sh; if (sh) c->bFiltered = g.db->isChannelFiltered(sh->qbaDigest, c->iId); } else { qWarning("Server attempted state change on nonexistent channel"); return; } } if (p) { // Channel move Channel *pp = p; while (pp) { if (pp == c) { qWarning("Server asked to move a channel into itself or one of its children"); return; } pp = pp->cParent; } pmModel->moveChannel(c, p); } if (msg.has_name()) pmModel->renameChannel(c, u8(msg.name())); if (msg.has_description_hash()) pmModel->setCommentHash(c, blob(msg.description_hash())); if (msg.has_description()) pmModel->setComment(c, u8(msg.description())); if (msg.has_position()) { pmModel->repositionChannel(c, msg.position()); } if (msg.links_size()) { QList ql; pmModel->unlinkAll(c); for (int i=0;ilinkChannels(c, ql); } if (msg.links_remove_size()) { QList ql; for (int i=0;iunlinkChannels(c, ql); } if (msg.links_add_size()) { QList ql; for (int i=0;ilinkChannels(c, ql); } if (msg.has_max_users()) { c->uiMaxUsers = msg.max_users(); } } void MainWindow::msgChannelRemove(const MumbleProto::ChannelRemove &msg) { Channel *c = Channel::get(msg.channel_id()); if (c && (c->iId != 0)) { if (c->bFiltered) { ServerHandlerPtr sh = g.sh; if (sh) g.db->setChannelFiltered(sh->qbaDigest, c->iId, false); c->bFiltered = false; } if (!pmModel->removeChannel(c, true)) { g.l->log(Log::CriticalError, tr("Protocol violation. Server sent remove for occupied channel.")); g.sh->disconnect(); return; } } } void MainWindow::msgTextMessage(const MumbleProto::TextMessage &msg) { ACTOR_INIT; QString target; // Silently drop the message if this user is set to "ignore" if (pSrc && pSrc->bLocalIgnore) return; const QString &plainName = pSrc ? pSrc->qsName : tr("Server", "message from"); const QString &name = pSrc ? Log::formatClientUser(pSrc, Log::Source) : tr("Server", "message from"); bool privateMessage = false; if (msg.tree_id_size() > 0) { target += tr("(Tree) "); } else if (msg.channel_id_size() > 0) { target += tr("(Channel) "); } else if (msg.session_size() > 0) { target += tr("(Private) "); privateMessage = true; } g.l->log(privateMessage ? Log::PrivateTextMessage : Log::TextMessage, tr("%2%1: %3").arg(name).arg(target).arg(u8(msg.message())), tr("Message from %1").arg(plainName)); } void MainWindow::msgACL(const MumbleProto::ACL &msg) { if (aclEdit) { aclEdit->reject(); delete aclEdit; aclEdit = NULL; } if (Channel::get(msg.channel_id())) { aclEdit = new ACLEditor(msg.channel_id(), msg, this); aclEdit->show(); } } void MainWindow::msgQueryUsers(const MumbleProto::QueryUsers &msg) { if (aclEdit) aclEdit->returnQuery(msg); } void MainWindow::msgPing(const MumbleProto::Ping &) { } void MainWindow::msgCryptSetup(const MumbleProto::CryptSetup &msg) { ConnectionPtr c= g.sh->cConnection; if (! c) return; if (msg.has_key() && msg.has_client_nonce() && msg.has_server_nonce()) { const std::string &key = msg.key(); const std::string &client_nonce = msg.client_nonce(); const std::string &server_nonce = msg.server_nonce(); if (key.size() == AES_KEY_SIZE_BYTES && client_nonce.size() == AES_BLOCK_SIZE && server_nonce.size() == AES_BLOCK_SIZE) c->csCrypt.setKey(reinterpret_cast(key.data()), reinterpret_cast(client_nonce.data()), reinterpret_cast(server_nonce.data())); } else if (msg.has_server_nonce()) { const std::string &server_nonce = msg.server_nonce(); if (server_nonce.size() == AES_BLOCK_SIZE) { c->csCrypt.uiResync++; memcpy(c->csCrypt.decrypt_iv, server_nonce.data(), AES_BLOCK_SIZE); } } else { MumbleProto::CryptSetup mpcs; mpcs.set_client_nonce(std::string(reinterpret_cast(c->csCrypt.encrypt_iv), AES_BLOCK_SIZE)); g.sh->sendMessage(mpcs); } } void MainWindow::msgContextAction(const MumbleProto::ContextAction &) { } void MainWindow::msgContextActionModify(const MumbleProto::ContextActionModify &msg) { if (msg.has_operation() && msg.operation() == MumbleProto::ContextActionModify_Operation_Remove) { removeContextAction(msg); return; } if (msg.has_operation() && msg.operation() != MumbleProto::ContextActionModify_Operation_Add) return; QAction *a = new QAction(u8(msg.text()), g.mw); a->setData(u8(msg.action())); connect(a, SIGNAL(triggered()), this, SLOT(context_triggered())); unsigned int ctx = msg.context(); if (ctx & MumbleProto::ContextActionModify_Context_Server) qlServerActions.append(a); if (ctx & MumbleProto::ContextActionModify_Context_User) qlUserActions.append(a); if (ctx & MumbleProto::ContextActionModify_Context_Channel) qlChannelActions.append(a); } void MainWindow::removeContextAction(const MumbleProto::ContextActionModify &msg) { QString action = u8(msg.action()); QSet qs; qs += qlServerActions.toSet(); qs += qlChannelActions.toSet(); qs += qlUserActions.toSet(); foreach(QAction *a, qs) { if (a->data() == action) { qlServerActions.removeOne(a); qlChannelActions.removeOne(a); qlUserActions.removeOne(a); delete a; } } } void MainWindow::msgVersion(const MumbleProto::Version &msg) { if (msg.has_version()) g.sh->uiVersion = msg.version(); if (msg.has_release()) g.sh->qsRelease = u8(msg.release()); if (msg.has_os()) { g.sh->qsOS = u8(msg.os()); if (msg.has_os_version()) g.sh->qsOSVersion = u8(msg.os_version()); } } void MainWindow::msgUserList(const MumbleProto::UserList &msg) { if (userEdit) { userEdit->reject(); delete userEdit; userEdit = NULL; } userEdit = new UserEdit(msg, this); userEdit->show(); } void MainWindow::msgVoiceTarget(const MumbleProto::VoiceTarget &) { } void MainWindow::msgPermissionQuery(const MumbleProto::PermissionQuery &msg) { Channel *current = pmModel->getChannel(qtvUsers->currentIndex()); if (msg.flush()) { foreach(Channel *c, Channel::c_qhChannels) c->uiPermissions = 0; // We always need the permissions of the current focus channel if (current && current->iId != static_cast(msg.channel_id())) { g.sh->requestChannelPermissions(current->iId); current->uiPermissions = ChanACL::All; } } Channel *c = Channel::get(msg.channel_id()); if (c) { c->uiPermissions = msg.permissions(); if (c->iId == 0) g.pPermissions = static_cast(c->uiPermissions); if (c == current) { updateMenuPermissions(); } } } void MainWindow::msgCodecVersion(const MumbleProto::CodecVersion &msg) { int alpha = msg.has_alpha() ? msg.alpha() : -1; int beta = msg.has_beta() ? msg.beta() : -1; bool pref = msg.prefer_alpha(); #ifdef USE_OPUS static bool warnedOpus = false; g.bOpus = msg.opus(); if (!g.oCodec && !warnedOpus) { g.l->log(Log::CriticalError, tr("Failed to load Opus, it will not be available for audio encoding/decoding.")); warnedOpus = true; } #endif // Workaround for broken 1.2.2 servers if (g.sh && g.sh->uiVersion == 0x010202 && alpha != -1 && alpha == beta) { if (pref) beta = g.iCodecBeta; else alpha = g.iCodecAlpha; } if ((alpha != -1) && (alpha != g.iCodecAlpha)) { g.iCodecAlpha = alpha; if (pref && ! g.qmCodecs.contains(alpha)) pref = ! pref; } if ((beta != -1) && (beta != g.iCodecBeta)) { g.iCodecBeta = beta; if (! pref && ! g.qmCodecs.contains(beta)) pref = ! pref; } g.bPreferAlpha = pref; int willuse = pref ? g.iCodecAlpha : g.iCodecBeta; static bool warnedCELT = false; if (! g.qmCodecs.contains(willuse)) { if (! warnedCELT) { g.l->log(Log::CriticalError, tr("Unable to find matching CELT codecs with other clients. You will not be able to talk to all users.")); warnedCELT = true; } } else { warnedCELT = false; } } void MainWindow::msgUserStats(const MumbleProto::UserStats &msg) { UserInformation *ui = qmUserInformations.value(msg.session()); if (ui) { ui->update(msg); } else { ui = new UserInformation(msg, g.ocIntercept ? g.mw : NULL); ui->setAttribute(Qt::WA_DeleteOnClose, true); connect(ui, SIGNAL(destroyed()), this, SLOT(destroyUserInformation())); qmUserInformations.insert(msg.session(), ui); ui->show(); } } void MainWindow::msgRequestBlob(const MumbleProto::RequestBlob &) { } void MainWindow::msgSuggestConfig(const MumbleProto::SuggestConfig &msg) { if (msg.has_version() && (msg.version() > MumbleVersion::getRaw())) { g.l->log(Log::Warning, tr("The server requests minimum client version %1").arg(MumbleVersion::toString(msg.version()))); } if (msg.has_positional() && (msg.positional() != g.s.doPositionalAudio())) { if (msg.positional()) g.l->log(Log::Warning, tr("The server requests positional audio be enabled.")); else g.l->log(Log::Warning, tr("The server requests positional audio be disabled.")); } if (msg.has_push_to_talk() && (msg.push_to_talk() != (g.s.atTransmit == Settings::PushToTalk))) { if (msg.push_to_talk()) g.l->log(Log::Warning, tr("The server requests Push-to-Talk be enabled.")); else g.l->log(Log::Warning, tr("The server requests Push-to-Talk be disabled.")); } } mumble-1.3.4/src/mumble/ApplicationPalette.h0000664000175000017500000011626214010707273020654 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . // See scripts/generate-ApplicationPalette-class.py // Auto-generated from ApplicationPaletteTemplate.h . Do not edit manually. #ifndef APPLICATIONPALETTE_H #define APPLICATIONPALETTE_H #include #include #ifndef Q_MOC_RUN #include #endif #include #include /// /// Class enabling theming of QApplication::palette from stylesheets. /// /// QPalette cannot be styled which creates issues as not all /// GUI elements in Qt can be styled. This class works around /// that by offering a QPROPERTY for each color role and group /// combination in QPalette. As you can set custom QPROPERTYs /// from stylesheet this allows the user to set all relevant /// palette brushes from the stylesheet. /// /// Due to restrictions on allowed property names as well as a /// mandatory prefix the attributes are exposed as lower cased: /// "qproperty-_". /// /// So a group of QPalette::Active and QPalette::Text role /// would be styled by: /// /// ApplicationPalette { /// qproperty-text_active: #ff0000; /* Set color for active group */ /// } /// /// See http://qt-project.org/doc/qt-4.8/qpalette.html#ColorGroup-enum /// for the available groups and roles. /// /// You can also use the shorthand "qproperty-" to set all groups /// to the same brush. /// /// The class will automatically pick up style changes on itself /// and update the application palette accordingly. To use the class /// simply instantiate it before setting the theme and keep it around /// till the application terminates. /// class ApplicationPalette : public QWidget { Q_OBJECT Q_PROPERTY(QBrush windowtext READ get_windowtext WRITE set_windowtext) Q_PROPERTY(QBrush windowtext_active READ get_windowtext_active WRITE set_windowtext_active) Q_PROPERTY(QBrush windowtext_disabled READ get_windowtext_disabled WRITE set_windowtext_disabled) Q_PROPERTY(QBrush windowtext_inactive READ get_windowtext_inactive WRITE set_windowtext_inactive) Q_PROPERTY(QBrush button READ get_button WRITE set_button) Q_PROPERTY(QBrush button_active READ get_button_active WRITE set_button_active) Q_PROPERTY(QBrush button_disabled READ get_button_disabled WRITE set_button_disabled) Q_PROPERTY(QBrush button_inactive READ get_button_inactive WRITE set_button_inactive) Q_PROPERTY(QBrush light READ get_light WRITE set_light) Q_PROPERTY(QBrush light_active READ get_light_active WRITE set_light_active) Q_PROPERTY(QBrush light_disabled READ get_light_disabled WRITE set_light_disabled) Q_PROPERTY(QBrush light_inactive READ get_light_inactive WRITE set_light_inactive) Q_PROPERTY(QBrush midlight READ get_midlight WRITE set_midlight) Q_PROPERTY(QBrush midlight_active READ get_midlight_active WRITE set_midlight_active) Q_PROPERTY(QBrush midlight_disabled READ get_midlight_disabled WRITE set_midlight_disabled) Q_PROPERTY(QBrush midlight_inactive READ get_midlight_inactive WRITE set_midlight_inactive) Q_PROPERTY(QBrush dark READ get_dark WRITE set_dark) Q_PROPERTY(QBrush dark_active READ get_dark_active WRITE set_dark_active) Q_PROPERTY(QBrush dark_disabled READ get_dark_disabled WRITE set_dark_disabled) Q_PROPERTY(QBrush dark_inactive READ get_dark_inactive WRITE set_dark_inactive) Q_PROPERTY(QBrush mid READ get_mid WRITE set_mid) Q_PROPERTY(QBrush mid_active READ get_mid_active WRITE set_mid_active) Q_PROPERTY(QBrush mid_disabled READ get_mid_disabled WRITE set_mid_disabled) Q_PROPERTY(QBrush mid_inactive READ get_mid_inactive WRITE set_mid_inactive) Q_PROPERTY(QBrush text READ get_text WRITE set_text) Q_PROPERTY(QBrush text_active READ get_text_active WRITE set_text_active) Q_PROPERTY(QBrush text_disabled READ get_text_disabled WRITE set_text_disabled) Q_PROPERTY(QBrush text_inactive READ get_text_inactive WRITE set_text_inactive) Q_PROPERTY(QBrush brighttext READ get_brighttext WRITE set_brighttext) Q_PROPERTY(QBrush brighttext_active READ get_brighttext_active WRITE set_brighttext_active) Q_PROPERTY(QBrush brighttext_disabled READ get_brighttext_disabled WRITE set_brighttext_disabled) Q_PROPERTY(QBrush brighttext_inactive READ get_brighttext_inactive WRITE set_brighttext_inactive) Q_PROPERTY(QBrush buttontext READ get_buttontext WRITE set_buttontext) Q_PROPERTY(QBrush buttontext_active READ get_buttontext_active WRITE set_buttontext_active) Q_PROPERTY(QBrush buttontext_disabled READ get_buttontext_disabled WRITE set_buttontext_disabled) Q_PROPERTY(QBrush buttontext_inactive READ get_buttontext_inactive WRITE set_buttontext_inactive) Q_PROPERTY(QBrush base READ get_base WRITE set_base) Q_PROPERTY(QBrush base_active READ get_base_active WRITE set_base_active) Q_PROPERTY(QBrush base_disabled READ get_base_disabled WRITE set_base_disabled) Q_PROPERTY(QBrush base_inactive READ get_base_inactive WRITE set_base_inactive) Q_PROPERTY(QBrush window READ get_window WRITE set_window) Q_PROPERTY(QBrush window_active READ get_window_active WRITE set_window_active) Q_PROPERTY(QBrush window_disabled READ get_window_disabled WRITE set_window_disabled) Q_PROPERTY(QBrush window_inactive READ get_window_inactive WRITE set_window_inactive) Q_PROPERTY(QBrush shadow READ get_shadow WRITE set_shadow) Q_PROPERTY(QBrush shadow_active READ get_shadow_active WRITE set_shadow_active) Q_PROPERTY(QBrush shadow_disabled READ get_shadow_disabled WRITE set_shadow_disabled) Q_PROPERTY(QBrush shadow_inactive READ get_shadow_inactive WRITE set_shadow_inactive) Q_PROPERTY(QBrush highlight READ get_highlight WRITE set_highlight) Q_PROPERTY(QBrush highlight_active READ get_highlight_active WRITE set_highlight_active) Q_PROPERTY(QBrush highlight_disabled READ get_highlight_disabled WRITE set_highlight_disabled) Q_PROPERTY(QBrush highlight_inactive READ get_highlight_inactive WRITE set_highlight_inactive) Q_PROPERTY(QBrush highlightedtext READ get_highlightedtext WRITE set_highlightedtext) Q_PROPERTY(QBrush highlightedtext_active READ get_highlightedtext_active WRITE set_highlightedtext_active) Q_PROPERTY(QBrush highlightedtext_disabled READ get_highlightedtext_disabled WRITE set_highlightedtext_disabled) Q_PROPERTY(QBrush highlightedtext_inactive READ get_highlightedtext_inactive WRITE set_highlightedtext_inactive) Q_PROPERTY(QBrush link READ get_link WRITE set_link) Q_PROPERTY(QBrush link_active READ get_link_active WRITE set_link_active) Q_PROPERTY(QBrush link_disabled READ get_link_disabled WRITE set_link_disabled) Q_PROPERTY(QBrush link_inactive READ get_link_inactive WRITE set_link_inactive) Q_PROPERTY(QBrush linkvisited READ get_linkvisited WRITE set_linkvisited) Q_PROPERTY(QBrush linkvisited_active READ get_linkvisited_active WRITE set_linkvisited_active) Q_PROPERTY(QBrush linkvisited_disabled READ get_linkvisited_disabled WRITE set_linkvisited_disabled) Q_PROPERTY(QBrush linkvisited_inactive READ get_linkvisited_inactive WRITE set_linkvisited_inactive) Q_PROPERTY(QBrush alternatebase READ get_alternatebase WRITE set_alternatebase) Q_PROPERTY(QBrush alternatebase_active READ get_alternatebase_active WRITE set_alternatebase_active) Q_PROPERTY(QBrush alternatebase_disabled READ get_alternatebase_disabled WRITE set_alternatebase_disabled) Q_PROPERTY(QBrush alternatebase_inactive READ get_alternatebase_inactive WRITE set_alternatebase_inactive) Q_PROPERTY(QBrush tooltipbase READ get_tooltipbase WRITE set_tooltipbase) Q_PROPERTY(QBrush tooltipbase_active READ get_tooltipbase_active WRITE set_tooltipbase_active) Q_PROPERTY(QBrush tooltipbase_disabled READ get_tooltipbase_disabled WRITE set_tooltipbase_disabled) Q_PROPERTY(QBrush tooltipbase_inactive READ get_tooltipbase_inactive WRITE set_tooltipbase_inactive) Q_PROPERTY(QBrush tooltiptext READ get_tooltiptext WRITE set_tooltiptext) Q_PROPERTY(QBrush tooltiptext_active READ get_tooltiptext_active WRITE set_tooltiptext_active) Q_PROPERTY(QBrush tooltiptext_disabled READ get_tooltiptext_disabled WRITE set_tooltiptext_disabled) Q_PROPERTY(QBrush tooltiptext_inactive READ get_tooltiptext_inactive WRITE set_tooltiptext_inactive) public: explicit ApplicationPalette(QWidget *p = 0) : QWidget(p) , m_originalPalette(QApplication::palette()){ // Empty } QBrush get_windowtext() { if (property("windowtext_active") == property("windowtext_disabled") && property("windowtext_active") == property("windowtext_inactive")) { return qvariant_cast(property("windowtext_active")); } return QBrush(); } void set_windowtext(const QBrush& brush) { m_windowtext_active = brush; m_windowtext_disabled = brush; m_windowtext_inactive = brush; } QBrush get_windowtext_active() { if (!m_windowtext_active) return QBrush(); return *m_windowtext_active; } void set_windowtext_active(const QBrush& brush) { m_windowtext_active = brush; } QBrush get_windowtext_disabled() { if (!m_windowtext_disabled) return QBrush(); return *m_windowtext_disabled; } void set_windowtext_disabled(const QBrush& brush) { m_windowtext_disabled = brush; } QBrush get_windowtext_inactive() { if (!m_windowtext_inactive) return QBrush(); return *m_windowtext_inactive; } void set_windowtext_inactive(const QBrush& brush) { m_windowtext_inactive = brush; } QBrush get_button() { if (property("button_active") == property("button_disabled") && property("button_active") == property("button_inactive")) { return qvariant_cast(property("button_active")); } return QBrush(); } void set_button(const QBrush& brush) { m_button_active = brush; m_button_disabled = brush; m_button_inactive = brush; } QBrush get_button_active() { if (!m_button_active) return QBrush(); return *m_button_active; } void set_button_active(const QBrush& brush) { m_button_active = brush; } QBrush get_button_disabled() { if (!m_button_disabled) return QBrush(); return *m_button_disabled; } void set_button_disabled(const QBrush& brush) { m_button_disabled = brush; } QBrush get_button_inactive() { if (!m_button_inactive) return QBrush(); return *m_button_inactive; } void set_button_inactive(const QBrush& brush) { m_button_inactive = brush; } QBrush get_light() { if (property("light_active") == property("light_disabled") && property("light_active") == property("light_inactive")) { return qvariant_cast(property("light_active")); } return QBrush(); } void set_light(const QBrush& brush) { m_light_active = brush; m_light_disabled = brush; m_light_inactive = brush; } QBrush get_light_active() { if (!m_light_active) return QBrush(); return *m_light_active; } void set_light_active(const QBrush& brush) { m_light_active = brush; } QBrush get_light_disabled() { if (!m_light_disabled) return QBrush(); return *m_light_disabled; } void set_light_disabled(const QBrush& brush) { m_light_disabled = brush; } QBrush get_light_inactive() { if (!m_light_inactive) return QBrush(); return *m_light_inactive; } void set_light_inactive(const QBrush& brush) { m_light_inactive = brush; } QBrush get_midlight() { if (property("midlight_active") == property("midlight_disabled") && property("midlight_active") == property("midlight_inactive")) { return qvariant_cast(property("midlight_active")); } return QBrush(); } void set_midlight(const QBrush& brush) { m_midlight_active = brush; m_midlight_disabled = brush; m_midlight_inactive = brush; } QBrush get_midlight_active() { if (!m_midlight_active) return QBrush(); return *m_midlight_active; } void set_midlight_active(const QBrush& brush) { m_midlight_active = brush; } QBrush get_midlight_disabled() { if (!m_midlight_disabled) return QBrush(); return *m_midlight_disabled; } void set_midlight_disabled(const QBrush& brush) { m_midlight_disabled = brush; } QBrush get_midlight_inactive() { if (!m_midlight_inactive) return QBrush(); return *m_midlight_inactive; } void set_midlight_inactive(const QBrush& brush) { m_midlight_inactive = brush; } QBrush get_dark() { if (property("dark_active") == property("dark_disabled") && property("dark_active") == property("dark_inactive")) { return qvariant_cast(property("dark_active")); } return QBrush(); } void set_dark(const QBrush& brush) { m_dark_active = brush; m_dark_disabled = brush; m_dark_inactive = brush; } QBrush get_dark_active() { if (!m_dark_active) return QBrush(); return *m_dark_active; } void set_dark_active(const QBrush& brush) { m_dark_active = brush; } QBrush get_dark_disabled() { if (!m_dark_disabled) return QBrush(); return *m_dark_disabled; } void set_dark_disabled(const QBrush& brush) { m_dark_disabled = brush; } QBrush get_dark_inactive() { if (!m_dark_inactive) return QBrush(); return *m_dark_inactive; } void set_dark_inactive(const QBrush& brush) { m_dark_inactive = brush; } QBrush get_mid() { if (property("mid_active") == property("mid_disabled") && property("mid_active") == property("mid_inactive")) { return qvariant_cast(property("mid_active")); } return QBrush(); } void set_mid(const QBrush& brush) { m_mid_active = brush; m_mid_disabled = brush; m_mid_inactive = brush; } QBrush get_mid_active() { if (!m_mid_active) return QBrush(); return *m_mid_active; } void set_mid_active(const QBrush& brush) { m_mid_active = brush; } QBrush get_mid_disabled() { if (!m_mid_disabled) return QBrush(); return *m_mid_disabled; } void set_mid_disabled(const QBrush& brush) { m_mid_disabled = brush; } QBrush get_mid_inactive() { if (!m_mid_inactive) return QBrush(); return *m_mid_inactive; } void set_mid_inactive(const QBrush& brush) { m_mid_inactive = brush; } QBrush get_text() { if (property("text_active") == property("text_disabled") && property("text_active") == property("text_inactive")) { return qvariant_cast(property("text_active")); } return QBrush(); } void set_text(const QBrush& brush) { m_text_active = brush; m_text_disabled = brush; m_text_inactive = brush; } QBrush get_text_active() { if (!m_text_active) return QBrush(); return *m_text_active; } void set_text_active(const QBrush& brush) { m_text_active = brush; } QBrush get_text_disabled() { if (!m_text_disabled) return QBrush(); return *m_text_disabled; } void set_text_disabled(const QBrush& brush) { m_text_disabled = brush; } QBrush get_text_inactive() { if (!m_text_inactive) return QBrush(); return *m_text_inactive; } void set_text_inactive(const QBrush& brush) { m_text_inactive = brush; } QBrush get_brighttext() { if (property("brighttext_active") == property("brighttext_disabled") && property("brighttext_active") == property("brighttext_inactive")) { return qvariant_cast(property("brighttext_active")); } return QBrush(); } void set_brighttext(const QBrush& brush) { m_brighttext_active = brush; m_brighttext_disabled = brush; m_brighttext_inactive = brush; } QBrush get_brighttext_active() { if (!m_brighttext_active) return QBrush(); return *m_brighttext_active; } void set_brighttext_active(const QBrush& brush) { m_brighttext_active = brush; } QBrush get_brighttext_disabled() { if (!m_brighttext_disabled) return QBrush(); return *m_brighttext_disabled; } void set_brighttext_disabled(const QBrush& brush) { m_brighttext_disabled = brush; } QBrush get_brighttext_inactive() { if (!m_brighttext_inactive) return QBrush(); return *m_brighttext_inactive; } void set_brighttext_inactive(const QBrush& brush) { m_brighttext_inactive = brush; } QBrush get_buttontext() { if (property("buttontext_active") == property("buttontext_disabled") && property("buttontext_active") == property("buttontext_inactive")) { return qvariant_cast(property("buttontext_active")); } return QBrush(); } void set_buttontext(const QBrush& brush) { m_buttontext_active = brush; m_buttontext_disabled = brush; m_buttontext_inactive = brush; } QBrush get_buttontext_active() { if (!m_buttontext_active) return QBrush(); return *m_buttontext_active; } void set_buttontext_active(const QBrush& brush) { m_buttontext_active = brush; } QBrush get_buttontext_disabled() { if (!m_buttontext_disabled) return QBrush(); return *m_buttontext_disabled; } void set_buttontext_disabled(const QBrush& brush) { m_buttontext_disabled = brush; } QBrush get_buttontext_inactive() { if (!m_buttontext_inactive) return QBrush(); return *m_buttontext_inactive; } void set_buttontext_inactive(const QBrush& brush) { m_buttontext_inactive = brush; } QBrush get_base() { if (property("base_active") == property("base_disabled") && property("base_active") == property("base_inactive")) { return qvariant_cast(property("base_active")); } return QBrush(); } void set_base(const QBrush& brush) { m_base_active = brush; m_base_disabled = brush; m_base_inactive = brush; } QBrush get_base_active() { if (!m_base_active) return QBrush(); return *m_base_active; } void set_base_active(const QBrush& brush) { m_base_active = brush; } QBrush get_base_disabled() { if (!m_base_disabled) return QBrush(); return *m_base_disabled; } void set_base_disabled(const QBrush& brush) { m_base_disabled = brush; } QBrush get_base_inactive() { if (!m_base_inactive) return QBrush(); return *m_base_inactive; } void set_base_inactive(const QBrush& brush) { m_base_inactive = brush; } QBrush get_window() { if (property("window_active") == property("window_disabled") && property("window_active") == property("window_inactive")) { return qvariant_cast(property("window_active")); } return QBrush(); } void set_window(const QBrush& brush) { m_window_active = brush; m_window_disabled = brush; m_window_inactive = brush; } QBrush get_window_active() { if (!m_window_active) return QBrush(); return *m_window_active; } void set_window_active(const QBrush& brush) { m_window_active = brush; } QBrush get_window_disabled() { if (!m_window_disabled) return QBrush(); return *m_window_disabled; } void set_window_disabled(const QBrush& brush) { m_window_disabled = brush; } QBrush get_window_inactive() { if (!m_window_inactive) return QBrush(); return *m_window_inactive; } void set_window_inactive(const QBrush& brush) { m_window_inactive = brush; } QBrush get_shadow() { if (property("shadow_active") == property("shadow_disabled") && property("shadow_active") == property("shadow_inactive")) { return qvariant_cast(property("shadow_active")); } return QBrush(); } void set_shadow(const QBrush& brush) { m_shadow_active = brush; m_shadow_disabled = brush; m_shadow_inactive = brush; } QBrush get_shadow_active() { if (!m_shadow_active) return QBrush(); return *m_shadow_active; } void set_shadow_active(const QBrush& brush) { m_shadow_active = brush; } QBrush get_shadow_disabled() { if (!m_shadow_disabled) return QBrush(); return *m_shadow_disabled; } void set_shadow_disabled(const QBrush& brush) { m_shadow_disabled = brush; } QBrush get_shadow_inactive() { if (!m_shadow_inactive) return QBrush(); return *m_shadow_inactive; } void set_shadow_inactive(const QBrush& brush) { m_shadow_inactive = brush; } QBrush get_highlight() { if (property("highlight_active") == property("highlight_disabled") && property("highlight_active") == property("highlight_inactive")) { return qvariant_cast(property("highlight_active")); } return QBrush(); } void set_highlight(const QBrush& brush) { m_highlight_active = brush; m_highlight_disabled = brush; m_highlight_inactive = brush; } QBrush get_highlight_active() { if (!m_highlight_active) return QBrush(); return *m_highlight_active; } void set_highlight_active(const QBrush& brush) { m_highlight_active = brush; } QBrush get_highlight_disabled() { if (!m_highlight_disabled) return QBrush(); return *m_highlight_disabled; } void set_highlight_disabled(const QBrush& brush) { m_highlight_disabled = brush; } QBrush get_highlight_inactive() { if (!m_highlight_inactive) return QBrush(); return *m_highlight_inactive; } void set_highlight_inactive(const QBrush& brush) { m_highlight_inactive = brush; } QBrush get_highlightedtext() { if (property("highlightedtext_active") == property("highlightedtext_disabled") && property("highlightedtext_active") == property("highlightedtext_inactive")) { return qvariant_cast(property("highlightedtext_active")); } return QBrush(); } void set_highlightedtext(const QBrush& brush) { m_highlightedtext_active = brush; m_highlightedtext_disabled = brush; m_highlightedtext_inactive = brush; } QBrush get_highlightedtext_active() { if (!m_highlightedtext_active) return QBrush(); return *m_highlightedtext_active; } void set_highlightedtext_active(const QBrush& brush) { m_highlightedtext_active = brush; } QBrush get_highlightedtext_disabled() { if (!m_highlightedtext_disabled) return QBrush(); return *m_highlightedtext_disabled; } void set_highlightedtext_disabled(const QBrush& brush) { m_highlightedtext_disabled = brush; } QBrush get_highlightedtext_inactive() { if (!m_highlightedtext_inactive) return QBrush(); return *m_highlightedtext_inactive; } void set_highlightedtext_inactive(const QBrush& brush) { m_highlightedtext_inactive = brush; } QBrush get_link() { if (property("link_active") == property("link_disabled") && property("link_active") == property("link_inactive")) { return qvariant_cast(property("link_active")); } return QBrush(); } void set_link(const QBrush& brush) { m_link_active = brush; m_link_disabled = brush; m_link_inactive = brush; } QBrush get_link_active() { if (!m_link_active) return QBrush(); return *m_link_active; } void set_link_active(const QBrush& brush) { m_link_active = brush; } QBrush get_link_disabled() { if (!m_link_disabled) return QBrush(); return *m_link_disabled; } void set_link_disabled(const QBrush& brush) { m_link_disabled = brush; } QBrush get_link_inactive() { if (!m_link_inactive) return QBrush(); return *m_link_inactive; } void set_link_inactive(const QBrush& brush) { m_link_inactive = brush; } QBrush get_linkvisited() { if (property("linkvisited_active") == property("linkvisited_disabled") && property("linkvisited_active") == property("linkvisited_inactive")) { return qvariant_cast(property("linkvisited_active")); } return QBrush(); } void set_linkvisited(const QBrush& brush) { m_linkvisited_active = brush; m_linkvisited_disabled = brush; m_linkvisited_inactive = brush; } QBrush get_linkvisited_active() { if (!m_linkvisited_active) return QBrush(); return *m_linkvisited_active; } void set_linkvisited_active(const QBrush& brush) { m_linkvisited_active = brush; } QBrush get_linkvisited_disabled() { if (!m_linkvisited_disabled) return QBrush(); return *m_linkvisited_disabled; } void set_linkvisited_disabled(const QBrush& brush) { m_linkvisited_disabled = brush; } QBrush get_linkvisited_inactive() { if (!m_linkvisited_inactive) return QBrush(); return *m_linkvisited_inactive; } void set_linkvisited_inactive(const QBrush& brush) { m_linkvisited_inactive = brush; } QBrush get_alternatebase() { if (property("alternatebase_active") == property("alternatebase_disabled") && property("alternatebase_active") == property("alternatebase_inactive")) { return qvariant_cast(property("alternatebase_active")); } return QBrush(); } void set_alternatebase(const QBrush& brush) { m_alternatebase_active = brush; m_alternatebase_disabled = brush; m_alternatebase_inactive = brush; } QBrush get_alternatebase_active() { if (!m_alternatebase_active) return QBrush(); return *m_alternatebase_active; } void set_alternatebase_active(const QBrush& brush) { m_alternatebase_active = brush; } QBrush get_alternatebase_disabled() { if (!m_alternatebase_disabled) return QBrush(); return *m_alternatebase_disabled; } void set_alternatebase_disabled(const QBrush& brush) { m_alternatebase_disabled = brush; } QBrush get_alternatebase_inactive() { if (!m_alternatebase_inactive) return QBrush(); return *m_alternatebase_inactive; } void set_alternatebase_inactive(const QBrush& brush) { m_alternatebase_inactive = brush; } QBrush get_tooltipbase() { if (property("tooltipbase_active") == property("tooltipbase_disabled") && property("tooltipbase_active") == property("tooltipbase_inactive")) { return qvariant_cast(property("tooltipbase_active")); } return QBrush(); } void set_tooltipbase(const QBrush& brush) { m_tooltipbase_active = brush; m_tooltipbase_disabled = brush; m_tooltipbase_inactive = brush; } QBrush get_tooltipbase_active() { if (!m_tooltipbase_active) return QBrush(); return *m_tooltipbase_active; } void set_tooltipbase_active(const QBrush& brush) { m_tooltipbase_active = brush; } QBrush get_tooltipbase_disabled() { if (!m_tooltipbase_disabled) return QBrush(); return *m_tooltipbase_disabled; } void set_tooltipbase_disabled(const QBrush& brush) { m_tooltipbase_disabled = brush; } QBrush get_tooltipbase_inactive() { if (!m_tooltipbase_inactive) return QBrush(); return *m_tooltipbase_inactive; } void set_tooltipbase_inactive(const QBrush& brush) { m_tooltipbase_inactive = brush; } QBrush get_tooltiptext() { if (property("tooltiptext_active") == property("tooltiptext_disabled") && property("tooltiptext_active") == property("tooltiptext_inactive")) { return qvariant_cast(property("tooltiptext_active")); } return QBrush(); } void set_tooltiptext(const QBrush& brush) { m_tooltiptext_active = brush; m_tooltiptext_disabled = brush; m_tooltiptext_inactive = brush; } QBrush get_tooltiptext_active() { if (!m_tooltiptext_active) return QBrush(); return *m_tooltiptext_active; } void set_tooltiptext_active(const QBrush& brush) { m_tooltiptext_active = brush; } QBrush get_tooltiptext_disabled() { if (!m_tooltiptext_disabled) return QBrush(); return *m_tooltiptext_disabled; } void set_tooltiptext_disabled(const QBrush& brush) { m_tooltiptext_disabled = brush; } QBrush get_tooltiptext_inactive() { if (!m_tooltiptext_inactive) return QBrush(); return *m_tooltiptext_inactive; } void set_tooltiptext_inactive(const QBrush& brush) { m_tooltiptext_inactive = brush; } private slots: void updateApplicationPalette() { qWarning() << "Updating application palette"; QPalette newPalette = m_originalPalette; // Do not re-use potentially already styled palette. Might not pick up system style changes though. if (m_windowtext_active) { newPalette.setBrush(QPalette::Active, QPalette::WindowText, *m_windowtext_active); } if (m_windowtext_disabled) { newPalette.setBrush(QPalette::Disabled, QPalette::WindowText, *m_windowtext_disabled); } if (m_windowtext_inactive) { newPalette.setBrush(QPalette::Inactive, QPalette::WindowText, *m_windowtext_inactive); } if (m_button_active) { newPalette.setBrush(QPalette::Active, QPalette::Button, *m_button_active); } if (m_button_disabled) { newPalette.setBrush(QPalette::Disabled, QPalette::Button, *m_button_disabled); } if (m_button_inactive) { newPalette.setBrush(QPalette::Inactive, QPalette::Button, *m_button_inactive); } if (m_light_active) { newPalette.setBrush(QPalette::Active, QPalette::Light, *m_light_active); } if (m_light_disabled) { newPalette.setBrush(QPalette::Disabled, QPalette::Light, *m_light_disabled); } if (m_light_inactive) { newPalette.setBrush(QPalette::Inactive, QPalette::Light, *m_light_inactive); } if (m_midlight_active) { newPalette.setBrush(QPalette::Active, QPalette::Midlight, *m_midlight_active); } if (m_midlight_disabled) { newPalette.setBrush(QPalette::Disabled, QPalette::Midlight, *m_midlight_disabled); } if (m_midlight_inactive) { newPalette.setBrush(QPalette::Inactive, QPalette::Midlight, *m_midlight_inactive); } if (m_dark_active) { newPalette.setBrush(QPalette::Active, QPalette::Dark, *m_dark_active); } if (m_dark_disabled) { newPalette.setBrush(QPalette::Disabled, QPalette::Dark, *m_dark_disabled); } if (m_dark_inactive) { newPalette.setBrush(QPalette::Inactive, QPalette::Dark, *m_dark_inactive); } if (m_mid_active) { newPalette.setBrush(QPalette::Active, QPalette::Mid, *m_mid_active); } if (m_mid_disabled) { newPalette.setBrush(QPalette::Disabled, QPalette::Mid, *m_mid_disabled); } if (m_mid_inactive) { newPalette.setBrush(QPalette::Inactive, QPalette::Mid, *m_mid_inactive); } if (m_text_active) { newPalette.setBrush(QPalette::Active, QPalette::Text, *m_text_active); } if (m_text_disabled) { newPalette.setBrush(QPalette::Disabled, QPalette::Text, *m_text_disabled); } if (m_text_inactive) { newPalette.setBrush(QPalette::Inactive, QPalette::Text, *m_text_inactive); } if (m_brighttext_active) { newPalette.setBrush(QPalette::Active, QPalette::BrightText, *m_brighttext_active); } if (m_brighttext_disabled) { newPalette.setBrush(QPalette::Disabled, QPalette::BrightText, *m_brighttext_disabled); } if (m_brighttext_inactive) { newPalette.setBrush(QPalette::Inactive, QPalette::BrightText, *m_brighttext_inactive); } if (m_buttontext_active) { newPalette.setBrush(QPalette::Active, QPalette::ButtonText, *m_buttontext_active); } if (m_buttontext_disabled) { newPalette.setBrush(QPalette::Disabled, QPalette::ButtonText, *m_buttontext_disabled); } if (m_buttontext_inactive) { newPalette.setBrush(QPalette::Inactive, QPalette::ButtonText, *m_buttontext_inactive); } if (m_base_active) { newPalette.setBrush(QPalette::Active, QPalette::Base, *m_base_active); } if (m_base_disabled) { newPalette.setBrush(QPalette::Disabled, QPalette::Base, *m_base_disabled); } if (m_base_inactive) { newPalette.setBrush(QPalette::Inactive, QPalette::Base, *m_base_inactive); } if (m_window_active) { newPalette.setBrush(QPalette::Active, QPalette::Window, *m_window_active); } if (m_window_disabled) { newPalette.setBrush(QPalette::Disabled, QPalette::Window, *m_window_disabled); } if (m_window_inactive) { newPalette.setBrush(QPalette::Inactive, QPalette::Window, *m_window_inactive); } if (m_shadow_active) { newPalette.setBrush(QPalette::Active, QPalette::Shadow, *m_shadow_active); } if (m_shadow_disabled) { newPalette.setBrush(QPalette::Disabled, QPalette::Shadow, *m_shadow_disabled); } if (m_shadow_inactive) { newPalette.setBrush(QPalette::Inactive, QPalette::Shadow, *m_shadow_inactive); } if (m_highlight_active) { newPalette.setBrush(QPalette::Active, QPalette::Highlight, *m_highlight_active); } if (m_highlight_disabled) { newPalette.setBrush(QPalette::Disabled, QPalette::Highlight, *m_highlight_disabled); } if (m_highlight_inactive) { newPalette.setBrush(QPalette::Inactive, QPalette::Highlight, *m_highlight_inactive); } if (m_highlightedtext_active) { newPalette.setBrush(QPalette::Active, QPalette::HighlightedText, *m_highlightedtext_active); } if (m_highlightedtext_disabled) { newPalette.setBrush(QPalette::Disabled, QPalette::HighlightedText, *m_highlightedtext_disabled); } if (m_highlightedtext_inactive) { newPalette.setBrush(QPalette::Inactive, QPalette::HighlightedText, *m_highlightedtext_inactive); } if (m_link_active) { newPalette.setBrush(QPalette::Active, QPalette::Link, *m_link_active); } if (m_link_disabled) { newPalette.setBrush(QPalette::Disabled, QPalette::Link, *m_link_disabled); } if (m_link_inactive) { newPalette.setBrush(QPalette::Inactive, QPalette::Link, *m_link_inactive); } if (m_linkvisited_active) { newPalette.setBrush(QPalette::Active, QPalette::LinkVisited, *m_linkvisited_active); } if (m_linkvisited_disabled) { newPalette.setBrush(QPalette::Disabled, QPalette::LinkVisited, *m_linkvisited_disabled); } if (m_linkvisited_inactive) { newPalette.setBrush(QPalette::Inactive, QPalette::LinkVisited, *m_linkvisited_inactive); } if (m_alternatebase_active) { newPalette.setBrush(QPalette::Active, QPalette::AlternateBase, *m_alternatebase_active); } if (m_alternatebase_disabled) { newPalette.setBrush(QPalette::Disabled, QPalette::AlternateBase, *m_alternatebase_disabled); } if (m_alternatebase_inactive) { newPalette.setBrush(QPalette::Inactive, QPalette::AlternateBase, *m_alternatebase_inactive); } if (m_tooltipbase_active) { newPalette.setBrush(QPalette::Active, QPalette::ToolTipBase, *m_tooltipbase_active); } if (m_tooltipbase_disabled) { newPalette.setBrush(QPalette::Disabled, QPalette::ToolTipBase, *m_tooltipbase_disabled); } if (m_tooltipbase_inactive) { newPalette.setBrush(QPalette::Inactive, QPalette::ToolTipBase, *m_tooltipbase_inactive); } if (m_tooltiptext_active) { newPalette.setBrush(QPalette::Active, QPalette::ToolTipText, *m_tooltiptext_active); } if (m_tooltiptext_disabled) { newPalette.setBrush(QPalette::Disabled, QPalette::ToolTipText, *m_tooltiptext_disabled); } if (m_tooltiptext_inactive) { newPalette.setBrush(QPalette::Inactive, QPalette::ToolTipText, *m_tooltiptext_inactive); } QApplication::setPalette(newPalette); resetAllProperties(); } void resetAllProperties() { m_windowtext_active = boost::none; m_windowtext_disabled = boost::none; m_windowtext_inactive = boost::none; m_button_active = boost::none; m_button_disabled = boost::none; m_button_inactive = boost::none; m_light_active = boost::none; m_light_disabled = boost::none; m_light_inactive = boost::none; m_midlight_active = boost::none; m_midlight_disabled = boost::none; m_midlight_inactive = boost::none; m_dark_active = boost::none; m_dark_disabled = boost::none; m_dark_inactive = boost::none; m_mid_active = boost::none; m_mid_disabled = boost::none; m_mid_inactive = boost::none; m_text_active = boost::none; m_text_disabled = boost::none; m_text_inactive = boost::none; m_brighttext_active = boost::none; m_brighttext_disabled = boost::none; m_brighttext_inactive = boost::none; m_buttontext_active = boost::none; m_buttontext_disabled = boost::none; m_buttontext_inactive = boost::none; m_base_active = boost::none; m_base_disabled = boost::none; m_base_inactive = boost::none; m_window_active = boost::none; m_window_disabled = boost::none; m_window_inactive = boost::none; m_shadow_active = boost::none; m_shadow_disabled = boost::none; m_shadow_inactive = boost::none; m_highlight_active = boost::none; m_highlight_disabled = boost::none; m_highlight_inactive = boost::none; m_highlightedtext_active = boost::none; m_highlightedtext_disabled = boost::none; m_highlightedtext_inactive = boost::none; m_link_active = boost::none; m_link_disabled = boost::none; m_link_inactive = boost::none; m_linkvisited_active = boost::none; m_linkvisited_disabled = boost::none; m_linkvisited_inactive = boost::none; m_alternatebase_active = boost::none; m_alternatebase_disabled = boost::none; m_alternatebase_inactive = boost::none; m_tooltipbase_active = boost::none; m_tooltipbase_disabled = boost::none; m_tooltipbase_inactive = boost::none; m_tooltiptext_active = boost::none; m_tooltiptext_disabled = boost::none; m_tooltiptext_inactive = boost::none; } protected: bool event(QEvent *e) Q_DECL_OVERRIDE { bool result = QWidget::event(e); if (e->type() == QEvent::StyleChange) { // Update global palette. Have to defer it // as property updates are also signals. QTimer::singleShot(0, this, SLOT(updateApplicationPalette())); } return result; } private: const QPalette m_originalPalette; boost::optional m_windowtext_active; boost::optional m_windowtext_disabled; boost::optional m_windowtext_inactive; boost::optional m_button_active; boost::optional m_button_disabled; boost::optional m_button_inactive; boost::optional m_light_active; boost::optional m_light_disabled; boost::optional m_light_inactive; boost::optional m_midlight_active; boost::optional m_midlight_disabled; boost::optional m_midlight_inactive; boost::optional m_dark_active; boost::optional m_dark_disabled; boost::optional m_dark_inactive; boost::optional m_mid_active; boost::optional m_mid_disabled; boost::optional m_mid_inactive; boost::optional m_text_active; boost::optional m_text_disabled; boost::optional m_text_inactive; boost::optional m_brighttext_active; boost::optional m_brighttext_disabled; boost::optional m_brighttext_inactive; boost::optional m_buttontext_active; boost::optional m_buttontext_disabled; boost::optional m_buttontext_inactive; boost::optional m_base_active; boost::optional m_base_disabled; boost::optional m_base_inactive; boost::optional m_window_active; boost::optional m_window_disabled; boost::optional m_window_inactive; boost::optional m_shadow_active; boost::optional m_shadow_disabled; boost::optional m_shadow_inactive; boost::optional m_highlight_active; boost::optional m_highlight_disabled; boost::optional m_highlight_inactive; boost::optional m_highlightedtext_active; boost::optional m_highlightedtext_disabled; boost::optional m_highlightedtext_inactive; boost::optional m_link_active; boost::optional m_link_disabled; boost::optional m_link_inactive; boost::optional m_linkvisited_active; boost::optional m_linkvisited_disabled; boost::optional m_linkvisited_inactive; boost::optional m_alternatebase_active; boost::optional m_alternatebase_disabled; boost::optional m_alternatebase_inactive; boost::optional m_tooltipbase_active; boost::optional m_tooltipbase_disabled; boost::optional m_tooltipbase_inactive; boost::optional m_tooltiptext_active; boost::optional m_tooltiptext_disabled; boost::optional m_tooltiptext_inactive; }; #endif // APPLICATIONPALETTE_H mumble-1.3.4/src/mumble/About.cpp0000664000175000017500000000505314010707273016472 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "About.h" #include "MainWindow.h" #include "License.h" // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" AboutDialog::AboutDialog(QWidget *p) : QDialog(p) { setWindowTitle(tr("About Mumble")); QTabWidget *qtwTab = new QTabWidget(this); QVBoxLayout *vblMain = new QVBoxLayout(this); QTextEdit *qteLicense = new QTextEdit(qtwTab); qteLicense->setReadOnly(true); qteLicense->setPlainText(License::license()); QTextEdit *qteAuthors = new QTextEdit(qtwTab); qteAuthors->setReadOnly(true); qteAuthors->setPlainText(License::authors()); QTextBrowser *qtb3rdPartyLicense = new QTextBrowser(qtwTab); qtb3rdPartyLicense->setReadOnly(true); qtb3rdPartyLicense->setOpenExternalLinks(true); QList thirdPartyLicenses = License::thirdPartyLicenses(); foreach(LicenseInfo li, thirdPartyLicenses) { qtb3rdPartyLicense->append(QString::fromLatin1("

%1 (%2)

%3
") .arg(Qt::escape(li.name)) .arg(Qt::escape(li.url)) .arg(Qt::escape(li.license))); } qtb3rdPartyLicense->moveCursor(QTextCursor::Start); QWidget *about = new QWidget(qtwTab); QLabel *icon = new QLabel(about); icon->setPixmap(g.mw->qiIcon.pixmap(g.mw->qiIcon.actualSize(QSize(128, 128)))); QLabel *text = new QLabel(about); text->setTextInteractionFlags(Qt::TextBrowserInteraction); text->setOpenExternalLinks(true); text->setText(tr( "

Mumble (%1)

" "

%3

" "

A voice-chat utility for gamers

" "

%2

" ).arg(QLatin1String(MUMBLE_RELEASE)) .arg(QLatin1String("http://www.mumble.info/")) .arg(QLatin1String("Copyright 2005-2019 The Mumble Developers"))); QHBoxLayout *qhbl = new QHBoxLayout(about); qhbl->addWidget(icon); qhbl->addWidget(text); qtwTab->addTab(about, tr("&About Mumble")); qtwTab->addTab(qteLicense, tr("&License")); qtwTab->addTab(qteAuthors, tr("A&uthors")); qtwTab->addTab(qtb3rdPartyLicense, tr("&Third-Party Licenses")); QPushButton *okButton = new QPushButton(tr("OK"), this); connect(okButton, SIGNAL(clicked()), this, SLOT(accept())); vblMain->addWidget(qtwTab); vblMain->addWidget(okButton); } mumble-1.3.4/src/mumble/ACLEditor.ui0000664000175000017500000010411514010707273017020 0ustar builderbuilder ACLEditor 0 0 881 503 Dialog 1 &Properties QFormLayout::AllNonFixedFieldsGrow Password Enter the channel password here. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. Position 16777215 16777215 This is the sort order for the channel. <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. 99 Maximum Users 16777215 16777215 Maximum number of users allowed in the channel <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. Check to create a temporary channel. <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. Temporary Enter the channel name here. <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. ID of the channel. ChannelID Name 0 1 Description &Groups Group 0 0 300 16777215 0 0 List of groups <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. true Add new group <b>Add</b><br/> Add a new group. Add Remove selected group <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. Remove false Inherit group members from parent <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. Inherit Make group inheritable to sub-channels <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. Inheritable false Group was inherited from parent channel <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. Inherited Qt::Horizontal 0 20 Members 0 0 0 0 Contains the list of members added to the group by this channel. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. 0 0 Add member to group Type in the name of a user you wish to add to the group and click Add. true QComboBox::NoInsert QComboBox::AdjustToContents Add Members qlwGroupAdd Remove 0 0 0 0 Contains a list of members whose group membership will not be inherited from the parent channel. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. 0 0 Remove member from group Type in the name of a user you wish to remove from the group and click Add. true QComboBox::NoInsert QComboBox::AdjustToContents Add Remove Excluded members qlwGroupRemove 0 0 0 0 Inherited members qlwGroupInherit Contains the list of members inherited by other channels. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. Exclude &ACL Active ACLs List of entries This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. Inherit ACL of parent? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. Inherit ACLs Move entry up This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. &Up false Move entry down This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. &Down false Add new entry This adds a new entry, initially set with no permissions and applying to all. &Add false Remove entry This removes the currently selected entry. &Remove false 0 0 Context Entry should apply to sub-channels. This makes the entry apply to sub-channels of this channel. Applies to sub-channels Entry should apply to this channel. This makes the entry apply to this channel. Applies to this channel 0 0 User/Group Group qcbACLGroup 0 0 Group this entry applies to This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. true User ID qcbACLUser 0 0 User this entry applies to This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. true QComboBox::AdjustToContents Permissions Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok RichTextEditor QWidget
RichTextEditor.h
1
MUComboBox QComboBox
widgets/MUComboBox.h
qleChannelPassword qsbChannelPosition qsbChannelMaxUsers qcbChannelTemporary qcbGroupList qpbGroupAdd qpbGroupRemove qcbGroupInherit qcbGroupInheritable qcbGroupInherited qlwGroupAdd qcbGroupAdd qpbGroupAddAdd qpbGroupAddRemove qlwGroupRemove qcbGroupRemove qpbGroupRemoveAdd qpbGroupRemoveRemove qlwGroupInherit qpbGroupInheritRemove qlwACLs qcbACLInherit qpbACLUp qpbACLDown qpbACLAdd qpbACLRemove qcbACLApplySubs qcbACLApplyHere qcbACLGroup qcbACLUser qdbbButtons qdbbButtons accepted() ACLEditor accept() 236 499 157 274 qdbbButtons rejected() ACLEditor reject() 304 499 286 274 qlwGroupInherit doubleClicked(QModelIndex) qpbGroupInheritRemove animateClick() 476 316 574 445 qleChannelName returnPressed() ACLEditor accept() 331 50 303 254 qleChannelPassword returnPressed() ACLEditor accept() 331 274 303 254
mumble-1.3.4/src/mumble/PAAudio.cpp0000664000175000017500000003200514010707273016677 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . /* Copyright (C) 2005-2011, Thorvald Natvig Copyright (C) 2007, Stefan Gehn All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Mumble Developers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "mumble_pch.hpp" #include "PAAudio.h" #include "Global.h" QMutex PortAudioSystem::qmStream; class PortAudioInputRegistrar : public AudioInputRegistrar { public: PortAudioInputRegistrar(); virtual AudioInput *create(); virtual const QList getDeviceChoices(); virtual void setDeviceChoice(const QVariant &, Settings &); virtual bool canEcho(const QString &) const; }; class PortAudioOutputRegistrar : public AudioOutputRegistrar { public: PortAudioOutputRegistrar(); virtual AudioOutput *create(); virtual const QList getDeviceChoices(); virtual void setDeviceChoice(const QVariant &, Settings &); }; class PAInit : public DeferInit { protected: bool bInit; PortAudioInputRegistrar *pairReg; PortAudioOutputRegistrar *paorReg; public: void initialize(); void destroy(); }; static PAInit spaiInit; void PAInit::initialize() { pairReg = NULL; paorReg = NULL; bInit = false; PaError err = Pa_Initialize(); if (err != paNoError) { qWarning("PortAudio: Failed library initialization: %s",Pa_GetErrorText(err)); return; } bInit = true; pairReg = new PortAudioInputRegistrar(); paorReg = new PortAudioOutputRegistrar(); } void PAInit::destroy() { delete pairReg; delete paorReg; if (bInit) { PaError err = Pa_Terminate(); if (err != paNoError) { qWarning("PortAudio: Failed termination: %s", Pa_GetErrorText(err)); } } } PortAudioInputRegistrar::PortAudioInputRegistrar() : AudioInputRegistrar(QLatin1String("PortAudio")) { } AudioInput *PortAudioInputRegistrar::create() { return new PortAudioInput(); } const QList PortAudioInputRegistrar::getDeviceChoices() { return PortAudioSystem::enumerateDevices(true, g.s.iPortAudioInput); } void PortAudioInputRegistrar::setDeviceChoice(const QVariant &choice, Settings &s) { s.iPortAudioInput = choice.toInt(); } bool PortAudioInputRegistrar::canEcho(const QString &) const { return false; } PortAudioOutputRegistrar::PortAudioOutputRegistrar() : AudioOutputRegistrar(QLatin1String("PortAudio")) { } AudioOutput *PortAudioOutputRegistrar::create() { return new PortAudioOutput(); } const QList PortAudioOutputRegistrar::getDeviceChoices() { return PortAudioSystem::enumerateDevices(false, g.s.iPortAudioOutput); } void PortAudioOutputRegistrar::setDeviceChoice(const QVariant &choice, Settings &s) { s.iPortAudioOutput = choice.toInt(); } bool PortAudioSystem::initStream(PaStream **stream, PaDeviceIndex devIndex, int frameSize, int *chans, bool isInput) { QMutexLocker lock(&qmStream); PaError err; PaStreamParameters streamPar; int nchans = 1; if (!stream) // null pointer passed return false; if (*stream) // pointer valid but already initialized, exit gracefully return true; // -1 is default device, otherwise pass value straight to PA if (devIndex == -1) devIndex = (isInput ? Pa_GetDefaultInputDevice() : Pa_GetDefaultOutputDevice()); const PaDeviceInfo *devInfo = Pa_GetDeviceInfo(devIndex); if (!devInfo) { qWarning("PortAudioSystem: Failed to find information about device %d", devIndex); return false; } const PaHostApiInfo *apiInfo = Pa_GetHostApiInfo(devInfo->hostApi); if (!apiInfo) { qWarning("PortAudioSystem: Failed to find information about API %d (dev %d)", devInfo->hostApi, devIndex); return false; } qWarning("PortAudioSystem: Will use device %d: %s %s",devIndex, apiInfo->name, devInfo->name); if (!isInput) { if (g.s.doPositionalAudio() && devInfo->maxOutputChannels > 1) nchans = 2; } if (chans) *chans = nchans; streamPar.device = devIndex; streamPar.channelCount = nchans; streamPar.sampleFormat = paInt16; //TODO: Can I determine this latency from mumble settings? streamPar.suggestedLatency = (isInput ? devInfo->defaultLowInputLatency : devInfo->defaultLowOutputLatency); streamPar.hostApiSpecificStreamInfo = NULL; qWarning("suggestedLatency : %6d ms",int(streamPar.suggestedLatency * 1000)); qWarning("channels: : %6d", nchans); qWarning("frameSize : %6d bytes", frameSize); qWarning("sample rate : %6d samples/sec", SAMPLE_RATE); err = Pa_OpenStream(stream, (isInput ? &streamPar : NULL), // input parameters (isInput ? NULL : &streamPar), // output parameters SAMPLE_RATE, // sample rate (from Audio.h) frameSize, // frames per buffer paClipOff|paDitherOff, // stream flags, do not clip or dither data NULL, // callback funtion, UNUSED NULL); // callback data, UNUSED if (err != paNoError) { qCritical("PortAudioSystem: Could not open PortAudio stream, error %s", Pa_GetErrorText(err)); stream = 0; return false; } qWarning("PortAudioSystem Opened PortAudio stream %p", *stream); return true; } bool PortAudioSystem::terminateStream(PaStream *stream) { QMutexLocker lock(&qmStream); PaError err; if (!stream) { return false; } err = Pa_CloseStream(stream); if (err != paNoError) { qCritical("PortAudioSystem: Could not close PortAudio stream, error %s", Pa_GetErrorText(err)); return false; } qWarning("PortAudioSystem: Closed PortAudio stream %p", stream); return true; } bool PortAudioSystem::startStream(PaStream *stream) { PaError err; if (!stream) { qWarning("PortAudioSystem: NULL PaStream passed to startStream()"); return false; } err = Pa_IsStreamStopped(stream); if (err == 0) { // stream running return true; } else if (err != 1) { // some error, 1 means "stopped" qCritical("PortAudioSystem: Could not determine status of PortAudio stream, error %s", Pa_GetErrorText(err)); return false; } err = Pa_StartStream(stream); if (err != paNoError) { qCritical("PortAudioSystem: Could not start PortAudio stream, error %s",Pa_GetErrorText(err)); return false; } return true; } bool PortAudioSystem::stopStream(PaStream *stream) { PaError err; if (!stream) { qWarning("PortAudioSystem: NULL PaStream passed to stopStream()"); return false; } err = Pa_IsStreamStopped(stream); if (err == 1) { // stream already stopped return true; } else if (err != 0) { // some error, 0 means "running" qCritical("PortAudioSystem: Could not determine status of PortAudio stream, error %s", Pa_GetErrorText(err)); return false; } err = Pa_StopStream(stream); if (err != paNoError) { qWarning("PortAudioSystem: Could not stop PortAudio stream, error %s",Pa_GetErrorText(err)); return false; } //qWarning() << "PortAudioSystem::stopStream(); stopped stream" << stream ; return true; } const QList PortAudioSystem::enumerateDevices(bool input, PaDeviceIndex match) { PaHostApiIndex iApiCnt; PaHostApiIndex iApiIndex; int iApiDevIndex; PaDeviceIndex iDevIndex; const PaDeviceInfo *pDevInfo; QList adl; adl << audioDevice(tr("Default Device"), -1); iApiCnt = Pa_GetHostApiCount(); for (iApiIndex = 0; iApiIndex < iApiCnt; iApiIndex++) { const PaHostApiInfo *apiInfo = Pa_GetHostApiInfo(iApiIndex); if (!apiInfo) continue; QString qsApiName = QLatin1String(apiInfo->name); for (iApiDevIndex = 0; iApiDevIndex < apiInfo->deviceCount; iApiDevIndex++) { iDevIndex = Pa_HostApiDeviceIndexToDeviceIndex(iApiIndex, iApiDevIndex); pDevInfo = Pa_GetDeviceInfo(iDevIndex); if (!pDevInfo) continue; QString qsDevName = QLatin1String(pDevInfo->name); if ((input && (pDevInfo->maxInputChannels > 0)) || (!input && (pDevInfo->maxOutputChannels > 0))) adl << audioDevice(qsApiName + QLatin1String(": ") + qsDevName, iDevIndex); } } for (int i=0;i(&iMicChannels), true)) return; // PA init or stream opening failed, we will give up iMicFreq = SAMPLE_RATE; eMicFormat = SampleShort; initializeMixer(); short inBuffer[iMicLength * iMicChannels]; // depend on the stream having started bRunning = PortAudioSystem::startStream(inputStream); while (bRunning) { err = Pa_ReadStream(inputStream, inBuffer, iMicLength); if (err == paNoError) { addMic(inBuffer, iMicLength); } else if (err == paInputOverflowed) { qWarning("PortAudioInput: Overflow on PortAudio input-stream, we lost incoming data!"); } else { // other error, aborg qWarning("PortAudioInput: Could not read from PortAudio stream, error %s", Pa_GetErrorText(err)); bRunning = false; } } // ignoring return value on purpose, we cannot do anything about it anyway PortAudioSystem::stopStream(inputStream); // ignoring return value on purpose, we cannot do anything about it anyway PortAudioSystem::terminateStream(inputStream); inputStream = 0; // just for gdb sessions ;) } // ------------------------------------------------------------------------------------------------ PortAudioOutput::PortAudioOutput() { bRunning = true; } PortAudioOutput::~PortAudioOutput() { bRunning = false; // inform loop in run() about exit wipe(); // Call destructor of all children wait(); // wait for thread termination } //TODO: redo this without busy waiting if possible void PortAudioOutput::run() { PaStream *outputStream = 0; PaError err = paNoError; int chans = 0; bool zero = true; if (!PortAudioSystem::initStream(&outputStream, g.s.iPortAudioOutput, iFrameSize, &chans, false)) return; // PA initialization or stream opening failed, we will give up const unsigned int cmask[2] = { SPEAKER_FRONT_LEFT, SPEAKER_FRONT_RIGHT }; iChannels = chans; iMixerFreq = SAMPLE_RATE; eSampleFormat = SampleShort; initializeMixer(cmask); short outBuffer[iFrameSize * iChannels]; while (bRunning) { bool avail = true; if (zero) memset(outBuffer, 0, sizeof(short) * iFrameSize * iChannels); else avail = mix(outBuffer, iFrameSize); if (avail) { if (! PortAudioSystem::startStream(outputStream)) { bRunning = false; break; } err = Pa_WriteStream(outputStream, outBuffer, iFrameSize); if (err == paOutputUnderflowed) { qWarning("PortAudioOutput: Output underflowed. Attempting graceful recovery."); zero = true; continue; } else if (err != paNoError) { qWarning("PortAudioOutput: Could not write to PortAudio stream, error %s", Pa_GetErrorText(err)); bRunning = false; } } else { if (! PortAudioSystem::stopStream(outputStream)) bRunning = false; this->msleep(20); } zero = false; } PortAudioSystem::terminateStream(outputStream); outputStream = NULL; // just for gdb sessions } mumble-1.3.4/src/mumble/GlobalShortcut_unix.h0000664000175000017500000000240614010707273021063 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_GLOBALSHORTCUT_UNIX_H_ #define MUMBLE_MUMBLE_GLOBALSHORTCUT_UNIX_H_ #include "GlobalShortcut.h" #include "ConfigDialog.h" #include "Global.h" #include #include #ifndef NO_XINPUT2 #include #include #endif #include #ifdef Q_OS_LINUX #include #include #endif #define NUM_BUTTONS 0x2ff class GlobalShortcutX : public GlobalShortcutEngine { private: Q_OBJECT Q_DISABLE_COPY(GlobalShortcutX) public: Display *display; QSet qsRootWindows; int iXIopcode; QSet qsMasterDevices; volatile bool bRunning; QSet qsKeyboards; QMap qmInputDevices; GlobalShortcutX(); ~GlobalShortcutX() Q_DECL_OVERRIDE; void run() Q_DECL_OVERRIDE; QString buttonName(const QVariant &) Q_DECL_OVERRIDE; void queryXIMasterList(); public slots: void displayReadyRead(int); void inputReadyRead(int); void directoryChanged(const QString &); }; #endif mumble-1.3.4/src/mumble/Themes.cpp0000664000175000017500000001152314010707273016644 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "Themes.h" #include "MainWindow.h" #include "MumbleApplication.h" // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" boost::optional Themes::getConfiguredStyle(const Settings &settings) { if (settings.themeName.isEmpty() && settings.themeStyleName.isEmpty()) { return boost::none; } const ThemeMap themes = getThemes(); ThemeMap::const_iterator themeIt = themes.find(settings.themeName); if (themeIt == themes.end()) { qWarning() << "Could not find configured theme" << settings.themeName; return boost::none; } ThemeInfo::StylesMap::const_iterator styleIt = themeIt->styles.find(settings.themeStyleName); if (styleIt == themeIt->styles.end()) { qWarning() << "Configured theme" << settings.themeName << "does not have configured style" << settings.themeStyleName; return boost::none; } return *styleIt; } void Themes::setConfiguredStyle(Settings &settings, boost::optional style, bool &outChanged) { if (style) { if (settings.themeName != style->themeName || settings.themeStyleName != style->name) { settings.themeName = style->themeName; settings.themeStyleName = style->name; outChanged = true; } } else { if (!settings.themeName.isEmpty() || !settings.themeStyleName.isEmpty()) { settings.themeName = settings.themeStyleName = QString(); outChanged = true; } } } void Themes::applyFallback() { qWarning() << "Applying fallback style sheet"; QStringList skinPaths; skinPaths << QLatin1String(":/themes/Mumble"); QString defaultTheme = getDefaultStylesheet(); setTheme(defaultTheme, skinPaths); } bool Themes::applyConfigured() { boost::optional style = Themes::getConfiguredStyle(g.s); if (!style) { return false; } const QFileInfo qssFile(style->getPlatformQss()); qWarning() << "Theme:" << style->themeName; qWarning() << "Style:" << style->name; qWarning() << "--> qss:" << qssFile.absoluteFilePath(); QFile file(qssFile.absoluteFilePath()); if (!file.open(QFile::ReadOnly)) { qWarning() << "Failed to open theme stylesheet:" << file.errorString(); return false; } QStringList skinPaths; skinPaths << qssFile.path(); skinPaths << QLatin1String(":/themes/Mumble"); // Some skins might want to fall-back on our built-in resources QString themeQss = QString::fromUtf8(file.readAll()); setTheme(themeQss, skinPaths); return true; } void Themes::setTheme(QString &themeQss, QStringList &skinPaths) { QDir::setSearchPaths(QLatin1String("skin"), skinPaths); QString userStylesheetFn = userStylesheetPath(); QString userStylesheetContent; if (readStylesheet(userStylesheetFn, userStylesheetContent)) { qWarning("Themes: allowing user stylesheet at '%s' to override the stylesheet", qPrintable(userStylesheetFn)); } qApp->setStyleSheet( themeQss + QLatin1String("\n") + userStylesheetContent ); } bool Themes::apply() { const bool result = applyConfigured(); if (!result) { applyFallback(); } if (g.mw != NULL) { g.mw->qteLog->document()->setDefaultStyleSheet(qApp->styleSheet()); } return result; } ThemeMap Themes::getThemes() { return ThemeInfo::scanDirectories(getSearchDirectories()); } QDir Themes::getUserThemesDirectory() { return QDir(g.qdBasePath.absolutePath() + QLatin1String("/Themes")); } QVector Themes::getSearchDirectories() { QVector themeSearchDirectories; // Built-in themes contained in the binary have the lowest priority themeSearchDirectories << QDir(QLatin1String(":themes")); // Next come themes found in the applications Themes directory themeSearchDirectories << QDir(MumbleApplication::instance()->applicationVersionRootPath() + QLatin1String("/Themes")); // Highest priorty have themes located in the user directory themeSearchDirectories << getUserThemesDirectory(); return themeSearchDirectories; } QString Themes::userStylesheetPath() { return g.qdBasePath.absolutePath() + QLatin1String("/user.qss"); } bool Themes::readStylesheet(const QString &stylesheetFn, QString &stylesheetContent) { QFile file(stylesheetFn); if (!file.open(QFile::ReadOnly)) { stylesheetContent = QString(); return false; } stylesheetContent = QString::fromUtf8(file.readAll()); return true; } QString Themes::getDefaultStylesheet() { return QLatin1String(".log-channel{text-decoration:none;}.log-user{text-decoration:none;}p{margin:0;}#qwMacWarning,#qwInlineNotice{background-color:#FFFEDC;border-radius:5px;border:1px solid #B5B59E;}"); } mumble-1.3.4/src/mumble/main.cpp0000664000175000017500000005065514010707274016355 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "Overlay.h" #include "MainWindow.h" #include "ServerHandler.h" #include "AudioInput.h" #include "AudioOutput.h" #include "AudioWizard.h" #include "Cert.h" #include "Database.h" #include "Log.h" #include "Plugins.h" #include "LogEmitter.h" #include "DeveloperConsole.h" #include "Global.h" #include "LCD.h" #ifdef USE_BONJOUR #include "BonjourClient.h" #endif #ifdef USE_DBUS #include "DBus.h" #endif #ifdef USE_VLD #include "vld.h" #endif #include "VersionCheck.h" #include "NetworkConfig.h" #include "CrashReporter.h" #include "SocketRPC.h" #include "SSL.h" #include "MumbleApplication.h" #include "ApplicationPalette.h" #include "Themes.h" #include "UserLockFile.h" #include "License.h" #include "EnvUtils.h" #if defined(Q_OS_WIN) && defined(QT_NO_DEBUG) #include // For CommandLineToArgvW() #endif #if defined(USE_STATIC_QT_PLUGINS) && QT_VERSION < 0x050000 Q_IMPORT_PLUGIN(qtaccessiblewidgets) # ifdef Q_OS_WIN Q_IMPORT_PLUGIN(qico) # endif Q_IMPORT_PLUGIN(qsvg) Q_IMPORT_PLUGIN(qsvgicon) # ifdef Q_OS_MAC Q_IMPORT_PLUGIN(qicnsicon) # endif #endif #ifdef BOOST_NO_EXCEPTIONS namespace boost { void throw_exception(std::exception const &) { qFatal("Boost exception caught!"); } } #endif extern void os_init(); extern char *os_lang; #ifdef Q_OS_WIN // from os_early_win.cpp extern int os_early_init(); // from os_win.cpp extern HWND mumble_mw_hwnd; #endif // Q_OS_WIN #if defined(Q_OS_WIN) && !defined(QT_NO_DEBUG) extern "C" __declspec(dllexport) int main(int argc, char **argv) { #else int main(int argc, char **argv) { #endif int res = 0; #if defined(Q_OS_WIN) int ret = os_early_init(); if (ret != 0) { return ret; } #endif QT_REQUIRE_VERSION(argc, argv, "4.4.0"); #if defined(Q_OS_WIN) SetDllDirectory(L""); #else #ifndef Q_OS_MAC EnvUtils::setenv(QLatin1String("AVAHI_COMPAT_NOWARN"), QLatin1String("1")); #endif #endif // Initialize application object. MumbleApplication a(argc, argv); a.setApplicationName(QLatin1String("Mumble")); a.setOrganizationName(QLatin1String("Mumble")); a.setOrganizationDomain(QLatin1String("mumble.sourceforge.net")); a.setQuitOnLastWindowClosed(false); #if QT_VERSION >= 0x050100 a.setAttribute(Qt::AA_UseHighDpiPixmaps); #endif #if QT_VERSION >= 0x050000 && defined(Q_OS_WIN) a.installNativeEventFilter(&a); #endif MumbleSSL::initialize(); #ifdef USE_SBCELT { QDir d(a.applicationVersionRootPath()); QString helper = d.absoluteFilePath(QString::fromLatin1("sbcelt-helper")); EnvUtils::setenv(QLatin1String("SBCELT_HELPER_BINARY"), helper.toUtf8().constData()); } #endif Global::g_global_struct = new Global(); qsrand(QDateTime::currentDateTime().toTime_t()); g.le = QSharedPointer(new LogEmitter()); g.c = new DeveloperConsole(); os_init(); bool bAllowMultiple = false; bool suppressIdentity = false; bool customJackClientName = false; bool bRpcMode = false; QString rpcCommand; QUrl url; if (a.arguments().count() > 1) { QStringList args = a.arguments(); for (int i = 1; i < args.count(); ++i) { if (args.at(i) == QLatin1String("-h") || args.at(i) == QLatin1String("--help") #if defined(Q_OS_WIN) || args.at(i) == QLatin1String("/?") #endif ) { QString helpMessage = MainWindow::tr( "Usage: mumble [options] []\n" "\n" " specifies a URL to connect to after startup instead of showing\n" "the connection window, and has the following form:\n" "mumble://[[:]@][:][/[/...]][?version=]\n" "\n" "The version query parameter has to be set in order to invoke the\n" "correct client version. It currently defaults to 1.2.0.\n" "\n" "Valid options are:\n" " -h, --help Show this help text and exit.\n" " -m, --multiple\n" " Allow multiple instances of the client to be started.\n" " -n, --noidentity\n" " Suppress loading of identity files (i.e., certificates.)\n" " -jn, --jackname\n" " Set custom Jack client name.\n" " --license\n" " Show the Mumble license.\n" " --authors\n" " Show the Mumble authors.\n" " --third-party-licenses\n" " Show licenses for third-party software used by Mumble.\n" "\n" ); QString rpcHelpBanner = MainWindow::tr( "Remote controlling Mumble:\n" "\n" ); QString rpcHelpMessage = MainWindow::tr( "Usage: mumble rpc [options]\n" "\n" "It is possible to remote control a running instance of Mumble by using\n" "the 'mumble rpc' command.\n" "\n" "Valid actions are:\n" " mute\n" " Mute self\n" " unmute\n" " Unmute self\n" " togglemute\n" " Toggle self-mute status\n" " deaf\n" " Deafen self\n" " undeaf\n" " Undeafen self\n" " toggledeaf\n" " Toggle self-deafen status\n" "\n" ); QString helpOutput = helpMessage + rpcHelpBanner + rpcHelpMessage; if (bRpcMode) { helpOutput = rpcHelpMessage; } #if defined(Q_OS_WIN) QMessageBox::information(NULL, MainWindow::tr("Invocation"), helpOutput); #else printf("%s", qPrintable(helpOutput)); #endif return 1; } else if (args.at(i) == QLatin1String("-m") || args.at(i) == QLatin1String("--multiple")) { bAllowMultiple = true; } else if (args.at(i) == QLatin1String("-n") || args.at(i) == QLatin1String("--noidentity")) { suppressIdentity = true; g.s.bSuppressIdentity = true; } else if (args.at(i) == QLatin1String("-jn") || args.at(i) == QLatin1String("--jackname")) { g.s.qsJackClientName = QString(args.at(i+1)); customJackClientName = true; } else if (args.at(i) == QLatin1String("-license") || args.at(i) == QLatin1String("--license")) { printf("%s\n", qPrintable(License::license())); return 0; } else if (args.at(i) == QLatin1String("-authors") || args.at(i) == QLatin1String("--authors")) { printf("%s\n", qPrintable(License::authors())); return 0; } else if (args.at(i) == QLatin1String("-third-party-licenses") || args.at(i) == QLatin1String("--third-party-licenses")) { printf("%s", qPrintable(License::printableThirdPartyLicenseInfo())); return 0; } else if (args.at(i) == QLatin1String("rpc")) { bRpcMode = true; if (args.count() - 1 > i) { rpcCommand = QString(args.at(i + 1)); } else { QString rpcError = MainWindow::tr("Error: No RPC command specified"); #if defined(Q_OS_WIN) QMessageBox::information(NULL, MainWindow::tr("RPC"), rpcError); #else printf("%s\n", qPrintable(rpcError)); #endif return 1; } } else { if (!bRpcMode) { QUrl u = QUrl::fromEncoded(args.at(i).toUtf8()); if (u.isValid() && (u.scheme() == QLatin1String("mumble"))) { url = u; } else { QFile f(args.at(i)); if (f.exists()) { url = QUrl::fromLocalFile(f.fileName()); } } } } } } #ifdef USE_DBUS #ifdef Q_OS_WIN // By default, windbus expects the path to dbus-daemon to be in PATH, and the path // should contain bin\\, and the path to the config is hardcoded as ..\etc { size_t reqSize; if (_wgetenv_s(&reqSize, NULL, 0, L"PATH") != 0)) { qWarning() << "Failed to get PATH. Not adding application directory to PATH. DBus bindings may not work."; } else if (reqSize > 0) { STACKVAR(wchar_t, buff, reqSize+1); if (_wgetenv_s(&reqSize, buff, reqSize, L"PATH") != 0) { qWarning() << "Failed to get PATH. Not adding application directory to PATH. DBus bindings may not work."; } else { QString path = QString::fromLatin1("%1;%2").arg(QDir::toNativeSeparators(MumbleApplication::instance()->applicationVersionRootPath())).arg(QString::fromWCharArray(buff)); STACKVAR(wchar_t, buffout, path.length() + 1); path.toWCharArray(buffout); if (_wputenv_s(L"PATH", buffout) != 0) { qWarning() << "Failed to set PATH. DBus bindings may not work."; } } } } #endif #endif if (bRpcMode) { bool sent = false; QMap param; param.insert(rpcCommand, rpcCommand); sent = SocketRPC::send(QLatin1String("Mumble"), QLatin1String("self"), param); if (sent) { return 0; } else { return 1; } } if (! bAllowMultiple) { if (url.isValid()) { #ifndef USE_DBUS QMap param; param.insert(QLatin1String("href"), url); #endif bool sent = false; #ifdef USE_DBUS QDBusInterface qdbi(QLatin1String("net.sourceforge.mumble.mumble"), QLatin1String("/"), QLatin1String("net.sourceforge.mumble.Mumble")); QDBusMessage reply=qdbi.call(QLatin1String("openUrl"), QLatin1String(url.toEncoded())); sent = (reply.type() == QDBusMessage::ReplyMessage); #else sent = SocketRPC::send(QLatin1String("Mumble"), QLatin1String("url"), param); #endif if (sent) return 0; } else { bool sent = false; #ifdef USE_DBUS QDBusInterface qdbi(QLatin1String("net.sourceforge.mumble.mumble"), QLatin1String("/"), QLatin1String("net.sourceforge.mumble.Mumble")); QDBusMessage reply=qdbi.call(QLatin1String("focus")); sent = (reply.type() == QDBusMessage::ReplyMessage); #else sent = SocketRPC::send(QLatin1String("Mumble"), QLatin1String("focus")); #endif if (sent) return 0; } } #ifdef Q_OS_WIN // The code above this block is somewhat racy, in that it might not // be possible to do RPC/DBus if two processes start at almost the // same time. // // In order to be completely sure we don't open multiple copies of // Mumble, we open a lock file. The file is opened without any sharing // modes enabled. This gives us exclusive access to the file. // If another Mumble instance attempts to open the file, it will fail, // and that instance will know to terminate itself. UserLockFile userLockFile(g.qdBasePath.filePath(QLatin1String("mumble.lock"))); if (! bAllowMultiple) { if (!userLockFile.acquire()) { qWarning("Another process has already acquired the lock file at '%s'. Terminating...", qPrintable(userLockFile.path())); return 1; } } #endif // Load preferences g.s.load(); // Check whether we need to enable accessibility features #ifdef Q_OS_WIN // Only windows for now. Could not find any information on how to query this for osx or linux { HIGHCONTRAST hc; hc.cbSize = sizeof(HIGHCONTRAST); SystemParametersInfo(SPI_GETHIGHCONTRAST, sizeof(HIGHCONTRAST), &hc, 0); if (hc.dwFlags & HCF_HIGHCONTRASTON) g.s.bHighContrast = true; } #endif DeferInit::run_initializers(); ApplicationPalette applicationPalette; Themes::apply(); QString qsSystemLocale = QLocale::system().name(); #ifdef Q_OS_MAC if (os_lang) { qWarning("Using Mac OS X system language as locale name"); qsSystemLocale = QLatin1String(os_lang); } #endif const QString locale = g.s.qsLanguage.isEmpty() ? qsSystemLocale : g.s.qsLanguage; qWarning("Locale is \"%s\" (System: \"%s\")", qPrintable(locale), qPrintable(qsSystemLocale)); QTranslator translator; if (translator.load(QLatin1String(":mumble_") + locale)) a.installTranslator(&translator); QTranslator loctranslator; if (loctranslator.load(QLatin1String("mumble_") + locale, a.applicationDirPath())) a.installTranslator(&loctranslator); // Can overwrite strings from bundled mumble translation // With modularization of Qt 5 some - but not all - of the qt_.ts files have become // so-called meta catalogues which no longer contain actual translations but refer to other // more specific ts files like qtbase_.ts . To successfully load a meta catalogue all // of its referenced translations must be available. As we do not want to bundle them all // we now try to load the old qt_.ts file first and then fall back to loading // qtbase_.ts if that failed. // // See http://doc.qt.io/qt-5/linguist-programmers.html#deploying-translations for more information QTranslator qttranslator; if (qttranslator.load(QLatin1String("qt_") + locale, QLibraryInfo::location(QLibraryInfo::TranslationsPath))) { // Try system qt translations a.installTranslator(&qttranslator); } else if (qttranslator.load(QLatin1String("qtbase_") + locale, QLibraryInfo::location(QLibraryInfo::TranslationsPath))) { a.installTranslator(&qttranslator); } else if (qttranslator.load(QLatin1String(":qt_") + locale)) { // Try bundled translations a.installTranslator(&qttranslator); } else if (qttranslator.load(QLatin1String(":qtbase_") + locale)) { a.installTranslator(&qttranslator); } // Initialize proxy settings NetworkConfig::SetupProxy(); g.nam = new QNetworkAccessManager(); #ifndef NO_CRASH_REPORT CrashReporter *cr = new CrashReporter(); cr->run(); delete cr; #endif // Initialize logger g.l = new Log(); // Initialize database g.db = new Database(QLatin1String("main")); #ifdef USE_BONJOUR // Initialize bonjour g.bc = new BonjourClient(); #endif g.o = new Overlay(); g.o->setActive(g.s.os.bEnable); g.lcd = new LCD(); // Process any waiting events before initializing our MainWindow. // The mumble:// URL support for Mac OS X happens through AppleEvents, // so we need to loop a little before we begin. a.processEvents(); // Main Window g.mw=new MainWindow(NULL); g.mw->show(); #ifdef Q_OS_WIN // Set mumble_mw_hwnd in os_win.cpp. // Used by APIs in ASIOInput, DirectSound and GlobalShortcut_win that require a HWND. mumble_mw_hwnd = GetForegroundWindow(); #endif #ifdef USE_DBUS new MumbleDBus(g.mw); QDBusConnection::sessionBus().registerObject(QLatin1String("/"), g.mw); QDBusConnection::sessionBus().registerService(QLatin1String("net.sourceforge.mumble.mumble")); #endif SocketRPC *srpc = new SocketRPC(QLatin1String("Mumble")); g.l->log(Log::Information, MainWindow::tr("Welcome to Mumble.")); // Plugins g.p = new Plugins(NULL); g.p->rescanPlugins(); Audio::start(); a.setQuitOnLastWindowClosed(false); // Configuration updates bool runaudiowizard = false; if (g.s.uiUpdateCounter == 0) { // Previous version was an pre 1.2.3 release or this is the first run runaudiowizard = true; } else if (g.s.uiUpdateCounter == 1) { // Previous versions used old idle action style, convert it if (g.s.iIdleTime == 5 * 60) { // New default g.s.iaeIdleAction = Settings::Nothing; } else { g.s.iIdleTime = 60 * qRound(g.s.iIdleTime / 60.); // Round to minutes g.s.iaeIdleAction = Settings::Deafen; // Old behavior } } if (runaudiowizard) { AudioWizard *aw = new AudioWizard(g.mw); aw->exec(); delete aw; } g.s.uiUpdateCounter = 2; if (! CertWizard::validateCert(g.s.kpCertificate)) { #if QT_VERSION >= 0x050000 QDir qd(QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)); #else QDir qd(QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation)); #endif QFile qf(qd.absoluteFilePath(QLatin1String("MumbleAutomaticCertificateBackup.p12"))); if (qf.open(QIODevice::ReadOnly | QIODevice::Unbuffered)) { Settings::KeyPair kp = CertWizard::importCert(qf.readAll()); qf.close(); if (CertWizard::validateCert(kp)) g.s.kpCertificate = kp; } if (! CertWizard::validateCert(g.s.kpCertificate)) { CertWizard *cw = new CertWizard(g.mw); cw->exec(); delete cw; if (! CertWizard::validateCert(g.s.kpCertificate)) { g.s.kpCertificate = CertWizard::generateNewCert(); if (qf.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Unbuffered)) { qf.write(CertWizard::exportCert(g.s.kpCertificate)); qf.close(); } } } } if (QDateTime::currentDateTime().daysTo(g.s.kpCertificate.first.first().expiryDate()) < 14) g.l->log(Log::Warning, CertWizard::tr("Certificate Expiry: Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on.")); #ifdef QT_NO_DEBUG #ifndef SNAPSHOT_BUILD if (g.s.bUpdateCheck) #endif new VersionCheck(true, g.mw); #ifdef SNAPSHOT_BUILD new VersionCheck(false, g.mw, true); #endif #else g.mw->msgBox(MainWindow::tr("Skipping version check in debug mode.")); #endif if (g.s.bPluginCheck) { g.p->checkUpdates(); } if (url.isValid()) { OpenURLEvent *oue = new OpenURLEvent(url); qApp->postEvent(g.mw, oue); #ifdef Q_OS_MAC } else if (! a.quLaunchURL.isEmpty()) { OpenURLEvent *oue = new OpenURLEvent(a.quLaunchURL); qApp->postEvent(g.mw, oue); #endif } else { g.mw->on_qaServerConnect_triggered(true); } if (! g.bQuit) res=a.exec(); g.s.save(); url.clear(); ServerHandlerPtr sh = g.sh; if (sh && sh->isRunning()) { url = sh->getServerURL(); g.db->setShortcuts(g.sh->qbaDigest, g.s.qlShortcuts); } Audio::stop(); if (sh) sh->disconnect(); delete srpc; g.sh.reset(); while (sh && ! sh.unique()) QThread::yieldCurrentThread(); sh.reset(); delete g.mw; delete g.nam; delete g.lcd; delete g.db; delete g.p; delete g.l; #ifdef USE_BONJOUR delete g.bc; #endif delete g.o; delete g.c; g.le.clear(); DeferInit::run_destroyers(); delete Global::g_global_struct; Global::g_global_struct = NULL; #ifndef QT_NO_DEBUG // Hide Qt memory leak. QSslSocket::setDefaultCaCertificates(QList()); // Release global protobuf memory allocations. #if (GOOGLE_PROTOBUF_VERSION >= 2001000) google::protobuf::ShutdownProtobufLibrary(); #endif #endif #ifdef Q_OS_WIN // Release the userLockFile. // // It is important that we release it before we attempt to // restart Mumble (if requested). If we do not release it // before that, the new instance might not be able to start // correctly. userLockFile.release(); #endif // Tear down OpenSSL state. MumbleSSL::destroy(); // At this point termination of our process is immenent. We can safely // launch another version of Mumble. The reason we do an actual // restart instead of re-creating our data structures is that making // sure we won't leave state is quite tricky. Mumble has quite a // few spots which might not consider seeing to basic initializations. // Until we invest the time to verify this, rather be safe (and a bit slower) // than sorry (and crash/bug out). Also take care to reconnect if possible. if (res == MUMBLE_EXIT_CODE_RESTART) { QStringList arguments; if (bAllowMultiple) arguments << QLatin1String("--multiple"); if (suppressIdentity) arguments << QLatin1String("--noidentity"); if (customJackClientName) arguments << QLatin1String("--jackname ") + g.s.qsJackClientName; if (!url.isEmpty()) arguments << url.toString(); qWarning() << "Triggering restart of Mumble with arguments: " << arguments; #ifdef Q_OS_WIN // Work around bug related to QTBUG-7645. Mumble has uiaccess=true set // on windows which makes normal CreateProcess calls (like Qt uses in // startDetached) fail unless they specifically enable additional priviledges. // Note that we do not actually require user interaction by UAC nor full admin // rights but only the right token on launch. Here we use ShellExecuteEx // which handles this transparently for us. const std::wstring applicationFilePath = qApp->applicationFilePath().toStdWString(); const std::wstring argumentsString = arguments.join(QLatin1String(" ")).toStdWString(); SHELLEXECUTEINFO si; ZeroMemory(&si, sizeof(SHELLEXECUTEINFO)); si.cbSize = sizeof(SHELLEXECUTEINFO); si.lpFile = applicationFilePath.data(); si.lpParameters = argumentsString.data(); bool ok = (ShellExecuteEx(&si) == TRUE); #else bool ok = QProcess::startDetached(qApp->applicationFilePath(), arguments); #endif if(!ok) { QMessageBox::warning(NULL, QApplication::tr("Failed to restart mumble"), QApplication::tr("Mumble failed to restart itself. Please restart it manually.") ); return 1; } return 0; } return res; } #if defined(Q_OS_WIN) && defined(QT_NO_DEBUG) extern "C" __declspec(dllexport) int MumbleMain(HINSTANCE instance, HINSTANCE prevInstance, LPSTR cmdArg, int cmdShow) { Q_UNUSED(instance) Q_UNUSED(prevInstance) Q_UNUSED(cmdArg) Q_UNUSED(cmdShow) int argc; wchar_t **argvW = CommandLineToArgvW(GetCommandLineW(), &argc); if (argvW == Q_NULLPTR) { return -1; } QVector argvS; argvS.reserve(argc); QVector argvV(argc, Q_NULLPTR); for (int i = 0; i < argc; ++i) { argvS.append(QString::fromWCharArray(argvW[i]).toLocal8Bit()); argvV[i] = argvS.back().data(); } LocalFree(argvW); return main(argc, argvV.data()); } #endif mumble-1.3.4/src/mumble/os_unix.cpp0000664000175000017500000000333014010707274017101 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "LogEmitter.h" #include "Global.h" static QSharedPointer le; static void mumbleMessageOutputQString(QtMsgType type, const QString &msg) { char c; switch (type) { case QtDebugMsg: c='D'; break; case QtWarningMsg: c='W'; break; case QtFatalMsg: c='F'; break; default: c='X'; } #define LOG(f, msg) fprintf(f, "<%c>%s %s\n", c, \ qPrintable(QDateTime::currentDateTime().toString(QLatin1String("yyyy-MM-dd hh:mm:ss.zzz"))), qPrintable(msg)) QString date = QDateTime::currentDateTime().toString(QLatin1String("yyyy-MM-dd hh:mm:ss.zzz")); QString fmsg = QString::fromLatin1("<%1>%2 %3").arg(c).arg(date).arg(msg); fprintf(stderr, "%s\n", qPrintable(fmsg)); le->addLogEntry(fmsg); if (type == QtFatalMsg) { exit(1); } } #if QT_VERSION < 0x050000 static void mumbleMessageOutput(QtMsgType type, const char *msg) { mumbleMessageOutputQString(type, QString::fromUtf8(msg)); } #elif QT_VERSION >= 0x050000 static void mumbleMessageOutputWithContext(QtMsgType type, const QMessageLogContext &ctx, const QString &msg) { Q_UNUSED(ctx); mumbleMessageOutputQString(type, msg); } #endif void os_init() { // Make a copy of the global LogEmitter, such that // os_unix.cpp doesn't have to consider the deletion // of the Global object and its LogEmitter object. le = g.le; #if QT_VERSION >= 0x050000 qInstallMessageHandler(mumbleMessageOutputWithContext); #else qInstallMsgHandler(mumbleMessageOutput); #endif } mumble-1.3.4/src/mumble/WebFetch.cpp0000664000175000017500000000662314010707274017114 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "WebFetch.h" #include "Global.h" #include "NetworkConfig.h" WebFetch::WebFetch(QString service, QUrl url, QObject *obj, const char *slot) : QObject() , qoObject(obj) , cpSlot(slot) , m_service(service) { url.setScheme(QLatin1String("https")); if (!g.s.qsServicePrefix.isEmpty()) { url.setHost(prefixedServiceHost()); } else { url.setHost(serviceHost()); } qnr = Network::get(url); connect(qnr, SIGNAL(finished()), this, SLOT(finished())); connect(this, SIGNAL(fetched(QByteArray,QUrl,QMap)), obj, slot); } QString WebFetch::prefixedServiceHost() const { if (g.s.qsServicePrefix.isEmpty()) { return serviceHost(); } return QString::fromLatin1("%1-%2.mumble.info").arg(g.s.qsServicePrefix, m_service); } QString WebFetch::serviceHost() const { return QString::fromLatin1("%1.mumble.info").arg(m_service); } static QString fromUtf8(const QByteArray &qba) { if (qba.isEmpty()) return QString(); return QString::fromUtf8(qba.constData(), qba.length()); } void WebFetch::finished() { // Note that if this functions succeeds, it should deleteLater() itself, as this is a temporary object. Q_ASSERT(qobject_cast(sender()) == qnr); qnr->disconnect(); qnr->deleteLater(); QUrl url = qnr->request().url(); if (qnr->error() == QNetworkReply::NoError) { QByteArray a = qnr->readAll(); // empty response is not an error if (a.isNull()) a.append(""); QMap headers; foreach(const QByteArray &headerName, qnr->rawHeaderList()) { QString name = fromUtf8(headerName); QString value = fromUtf8(qnr->rawHeader(headerName)); if (! name.isEmpty() && ! value.isEmpty()) { headers.insert(name, value); if (name == QLatin1String("Use-Service-Prefix")) { QRegExp servicePrefixRegExp(QLatin1String("^[a-zA-Z]+$")); if (servicePrefixRegExp.exactMatch(value)) { g.s.qsServicePrefix = value.toLower(); } } } } emit fetched(a, url, headers); deleteLater(); } else if (url.host() == prefixedServiceHost() && url.host() != serviceHost()) { // We have tried to fetch from a local service domain (e.g. de-update.mumble.info) // which has failed, so naturally we want to try the non-local one (update.mumble.info) // as well as maybe that one will work. // This of course only makes sense, if prefixedServiceHost() and serviceHost() are in fact // different hosts. url.setHost(serviceHost()); qnr = Network::get(url); connect(qnr, SIGNAL(finished()), this, SLOT(finished())); } else { emit fetched(QByteArray(), url, QMap()); deleteLater(); } } /** * @brief Fetch URL from mumble servers. * * If fetching fails, the slot is invoked with a null QByteArray. * @param url URL to fetch. Hostname and scheme must be blank. * @param obj Object to invoke slot on. * @param slot Slot to be triggered, invoked with the signature of \link fetched. */ void WebFetch::fetch(const QString &service, const QUrl &url, QObject *obj, const char *slot) { Q_ASSERT(!service.isEmpty()); Q_ASSERT(url.scheme().isEmpty()); Q_ASSERT(url.host().isEmpty()); Q_ASSERT(obj); Q_ASSERT(slot); new WebFetch(service, url, obj, slot); } mumble-1.3.4/src/mumble/UserView.h0000664000175000017500000000412014010707274016631 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_USERVIEW_H_ #define MUMBLE_MUMBLE_USERVIEW_H_ #include #if QT_VERSION >= 0x050000 # include # include #else # include # include #endif #include "Timer.h" class UserDelegate : public QStyledItemDelegate { private: Q_OBJECT Q_DISABLE_COPY(UserDelegate) public: UserDelegate(QObject *parent = NULL); void paint(QPainter * painter, const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE; //! Width/height in px of user/channel flag icons const static int FLAG_ICON_DIMENSION; //! Padding in px around user/channel flag icons const static int FLAG_ICON_PADDING; //! Width/height in px of user/channel flags including padding const static int FLAG_DIMENSION; public slots: bool helpEvent(QHelpEvent *event, QAbstractItemView *view, const QStyleOptionViewItem &option, const QModelIndex &index) Q_DECL_OVERRIDE; }; class UserView : public QTreeView { private: Q_OBJECT Q_DISABLE_COPY(UserView) protected: void mouseReleaseEvent(QMouseEvent *) Q_DECL_OVERRIDE; void keyPressEvent(QKeyEvent *) Q_DECL_OVERRIDE; bool event(QEvent *) Q_DECL_OVERRIDE; QTimer *qtSearch; QPersistentModelIndex qpmiSearch; Timer tSearch; QString qsSearch; public: UserView(QWidget *); void keyboardSearch(const QString &search) Q_DECL_OVERRIDE; #if QT_VERSION >= 0x050000 void dataChanged(const QModelIndex & topLeft, const QModelIndex & bottomRight, const QVector & roles = QVector ()) Q_DECL_OVERRIDE; #else void dataChanged(const QModelIndex & topLeft, const QModelIndex & bottomRight) Q_DECL_OVERRIDE; #endif public slots: void nodeActivated(const QModelIndex &idx); void selectSearchResult(); void updateChannel(const QModelIndex &index); }; #endif mumble-1.3.4/src/mumble/CoreAudio.h0000664000175000017500000000367514010707273016747 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_COREAUDIO_H_ #define MUMBLE_MUMBLE_COREAUDIO_H_ #include "AudioInput.h" #include "AudioOutput.h" #include class CoreAudioSystem : public QObject { private: Q_OBJECT Q_DISABLE_COPY(CoreAudioSystem) public: static CFStringRef QStringToCFString(const QString &str); static const QHash getDevices(bool input); static const QList getDeviceChoices(bool input); }; class CoreAudioInput : public AudioInput { private: Q_OBJECT Q_DISABLE_COPY(CoreAudioInput) protected: AudioUnit au; AUEventListenerRef el; AudioBufferList buflist; static void propertyChange(void *udata, AudioUnit au, AudioUnitPropertyID prop, AudioUnitScope scope, AudioUnitElement element); static OSStatus inputCallback(void *udata, AudioUnitRenderActionFlags *flags, const AudioTimeStamp *ts, UInt32 busnum, UInt32 npackets, AudioBufferList *buflist); public: CoreAudioInput(); ~CoreAudioInput() Q_DECL_OVERRIDE; void run() Q_DECL_OVERRIDE; }; class CoreAudioOutput : public AudioOutput { private: Q_OBJECT Q_DISABLE_COPY(CoreAudioOutput) protected: AudioUnit au; AUEventListenerRef el; static void propertyChange(void *udata, AudioUnit au, AudioUnitPropertyID prop, AudioUnitScope scope, AudioUnitElement element); static OSStatus outputCallback(void *udata, AudioUnitRenderActionFlags *flags, const AudioTimeStamp *ts, UInt32 busnum, UInt32 npackets, AudioBufferList *buflist); public: CoreAudioOutput(); ~CoreAudioOutput() Q_DECL_OVERRIDE; void run() Q_DECL_OVERRIDE; }; #else class CoreAudioSystem; class CoreAudioInput; class CoreAudioOutput; #endif mumble-1.3.4/src/mumble/mumble_en_GB.ts0000664000175000017500000123452314010707274017607 0ustar builderbuilder ACLEditor Deny Deny Allow Allow Allow %1 Allow %1 Deny %1 Deny %1 Mumble - Add channel Mumble - Add channel Default server value Failed: Invalid channel Failed: Invalid channel Mumble - Edit %1 Mumble - Edit %1 ID: %1 ID: %1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Channel must have a name Channel must have a name This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Dialog Dialogue Name Name Enter the channel name here. Enter the channel name here. Description Description Password Password Enter the channel password here. Enter the channel password here. Check to create a temporary channel. Check to create a temporary channel. Temporary Temporary <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. Position Position &Groups &Groups Group Group List of groups List of groups Remove selected group Remove selected group Remove Remove Inherit group members from parent Inherit group members from parent Inherit Inherit Make group inheritable to sub-channels Make group inheritable to sub-channels Inheritable Inheritable Group was inherited from parent channel Group was inherited from parent channel Inherited Inherited Members Members Add Add Add member to group Add member to group Remove member from group Remove member from group &ACL &ACL Active ACLs Active ACLs List of entries List of entries Inherit ACL of parent? Inherit ACL of parent? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. Inherit ACLs Inherit ACLs Move entry up Move entry up This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry if you really need that you'll have to duplicate the inherited entry. &Up &Up Move entry down Move entry down This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. &Down &Down Add new entry Add new entry This adds a new entry, initially set with no permissions and applying to all. This adds a new entry, initially set with no permissions and applying to all. &Add &Add Remove entry Remove entry This removes the currently selected entry. This removes the currently selected entry. &Remove &Remove Context Context Entry should apply to this channel. Entry should apply to this channel Entry should apply to this channel. This makes the entry apply to this channel. This makes the entry apply to this channel. Applies to this channel Applies to this channel Entry should apply to sub-channels. Entry should apply to sub-channels. Add new group Add new group <b>Add</b><br/> Add a new group. <b>Add</b><br/> Add a new group. Inherited members Inherited members Contains the list of members added to the group by this channel. Contains the list of members added to the group by this channel. Contains a list of members whose group membership will not be inherited from the parent channel. Contains a list of members whose group membership will not be inherited from the parent channel. Contains the list of members inherited by other channels. Contains the list of members inherited by other channels. Type in the name of a user you wish to add to the group and click Add. Type in the name of a user you wish to add to the group and click Add. Type in the name of a user you wish to remove from the group and click Add. Type in the name of a user you wish to remove from the group and click Add. Exclude Exclude Excluded members Excluded members This makes the entry apply to sub-channels of this channel. This makes the entry apply to sub-channels of this channel. Applies to sub-channels Applies to sub-channels Permissions Permissions User/Group User/Group Group this entry applies to Group this entry applies to User ID User ID User this entry applies to User this entry applies to This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. &Properties &Properties <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>Temporary</b><br /> When ticked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels untick <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Untick <i>Inherit</i> to prevent inheritance from higher level channels. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give users write privileges if they belongs to the <i>admin</i> group in that channel, even if they don't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. ID of the channel. ID of the channel. Maximum Users Maximum Users Maximum number of users allowed in the channel Maximum number of users allowed in the channel <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. <b>Maximum Users</b><br />? This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. This is the sort order for the channel. ALSAAudioInput Default ALSA Card Default ALSA Card Opening chosen ALSA Input failed: %1 Opening chosen ALSA Input failed: %1 ALSAAudioOutput Default ALSA Card Default ALSA Card Opening chosen ALSA Output failed: %1 Opening chosen ALSA Output failed: %1 ASIOConfig %1 (version %2) %1 (version %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz ASIO Initialization failed: %1 ASIO Initialisation failed: %1 Failed to instantiate ASIO driver Failed to instantiate ASIO driver ASIO ASIO Device selection Device selection Device Device Device to use for microphone Device to use for microphone This chooses what device to query. You still need to actually query the device and select which channels to use. This chooses what device to query. You still need to actually query the device and select which channels to use. Query selected device Query selected device This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Query &Query Configure selected device Configure selected device This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Configure &Configure Capabilities Capabilities Driver name Driver name Buffer size Buffer size This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. Configure input channels Configure input channels Channels Channels Microphone Microphone <- <- -> -> Unused Unused Speakers Speakers ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. Opening selected ASIO device failed. No input will be done. Opening selected ASIO device failed. No input will be done. AboutDialog About Mumble About Mumble <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble &About Mumble &License &Licence A&uthors &Third-Party Licenses OK OK AudioInput Interface Interface System System Input method for audio Input method for audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Device Input device for audio Input device for audio <b>This is the input device to use for audio.</b> <b>This is the input device to use for audio.</b> Transmission Transmission &Transmit &Transmit When to transmit your speech When to transmit your speech <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. DoublePush Time DoublePush Time If you press the PTT key twice in this time it will get locked. If you press the PTT key twice in this time it will get locked. <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. Reset audio cue to default Reset audio cue to default <b>Reset</b><br/>Reset the paths for the files to their default. <b>Reset</b><br/>Reset the paths for the files to their default. Browse for on audio file Browse for on audio file Browse for off audio file Browse for off audio file Off Off On On Preview the audio cues Preview the audio cues Use SNR based speech detection Use SNR based speech detection Signal to Noise Signal to Noise <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. Amplitude Amplitude Voice &Hold Voice & Hold How long to keep transmitting after silence How long to keep transmitting after silence Silence Below Silence Below <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. Speech Above Signal values above this count as voice Compression &Quality Quality of compression (peak bandwidth) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. Audio per packet How many audio frames to send per packet <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). Audio Processing Noise Suppression Noise suppression <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. Maximum amplification of input sound <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. <b>Maximum amplification of input.</b><br />Mumble normalises the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. Current speech detection chance Cancel echo from speakers Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. Disabled <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analysed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialogue or from the Audio Wizard. Signal values below this count as silence Maximum bandwidth used for sending audio Use Amplitude based speech detection <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). Exclusive mode <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive R&eset &Browse... B&rowse... &Preview <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. Displays an always on top window with a push to talk button in it Display push to talk window Misc Audible audio cue when starting or stopping to transmit <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. Audio cue Gets played when starting to transmit Gets played when stopping to transmit Hold Time Time the microphone stays open after the PTT key is released Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) Max. Amplification Idle action minutes do nothing deafen mute after Echo Cancellation Mixed echo cancellation Multichannel echo cancellation The idle action will be reversed upon any key or mouse button input Undo Idle action upon activity Apply RNNoise's noise suppression filter. <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. RNNoise Audio input AudioInputDialog Continuous Voice Activity Push To Talk Audio Input %1 ms Off %1 s %1 kb/s -%1 dB %1 kbit/s (Audio %2, Position %4, Overhead %3) AudioOutput Interface System Output method for audio <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Output device for audio <b>This is the output device to use for audio.</b> Positional Audio Audio Output Default &Jitter Buffer Safety margin for jitter buffer <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. Minimum distance to user before sound volume decreases This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. Volume Volume of incoming speech <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. Output Delay Amount of data to buffer The connected "speakers" are actually headphones The connected "speakers" are actually headphones. Factor for sound volume decrease Bloom Factor for sound volume increase How much should sound volume increase for sources that are really close? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. Ticking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Headphones Minimum Distance Maximum Distance Maximum distance, beyond which speech volume won't decrease Minimum Volume What should the volume be at the maximum distance? Loopback Test Delay Variance Variance in packet latency <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. Packet Loss Packet loss for loopback mode <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% &Loopback Desired loopback mode Attenuate applications by... Attenuation of other applications during speech <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. If checked Mumble lowers the volume of other applications while other users talk If ticked Mumble lowers the volume of other applications while other users talk <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. while other users talk If checked Mumble lowers the volume of other applications while you talk If ticked Mumble lowers the volume of other applications while you talk <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. while you talk Exclusive mode, not recommended. <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive Priority Speaker If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. If ticked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Selecting this tickbox will enable this feature. Attenuate other users while talking as Priority Speaker. Advanced Attenuation Options If checked, Mumble will only attenuate applications that are using the same output source as Mumble <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. Only attenuate applications using the same output device If checked, PulseAudio loopback modules will be attenuated <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. Attenuate PulseAudio loopback modules Audio output AudioOutputDialog None Local Server Audio Output %1 ms %1 % %1 m AudioOutputSample Choose sound file Invalid sound file The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. AudioStats >1000 ms >1000ms Audio Statistics Input Levels Peak microphone level Peak power in last frame This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. Peak speaker level This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. Peak clean level This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. Signal Analysis Microphone power How close the current input level is to ideal This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. Signal-To-Noise ratio Signal-To-Noise ratio from the microphone This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. Speech Probability Probability of speech This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). Configuration feedback Current audio bitrate Bitrate of last frame DoublePush interval Time between last two Push-To-Talk presses Speech Detection Current speech detection chance <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialogue or from the Audio Wizard. Signal and noise power spectrum Power spectrum of input signal and noise estimate This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. Echo Analysis Weights of the echo canceller This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish colour representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilise. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialogue. AudioWizard Audio Tuning Wizard Introduction Welcome to the Mumble Audio Wizard Finished Enjoy using Mumble Device selection Selecting the input and output device to use with Mumble. This is the device your microphone is connected to. System Input method for audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Input device to use <b>Selects which sound card to use for audio input.</b> Cancel echo from headset or speakers Use echo cancellation This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. This is the device your speakers or headphones are connected to. Output method for audio <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. Output device to use <b>Selects which sound card to use for audio Output.</b> Enable positional audio Allows positioning of sound Allows positioning of sound. <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> Input Device Output Device This allows Mumble to use positional audio to place voices. <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> Amount of data to buffer This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's ticked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> Positional Audio Adjusting attenuation of positional audio. <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> Use headphones instead of speakers <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> Use headphones This ignores the OS speaker configuration and configures the positioning for headphones instead. Volume tuning Tuning microphone hardware volume to optimal settings. Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. Voice Activity Detection Letting Mumble figure out when you're talking and when you're silent. This will help Mumble figure out when you are talking. The first step is selecting which data value to use. Raw amplitude from input Signal-To-Noise ratio Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Device tuning Changing hardware output delays to their minimum value. Submit anonymous statistics to the Mumble project Push To Talk: Quality & Notifications Adjust quality and notification settings. Quality settings Low Balanced Notification settings Use Text-To-Speech to read notifications and messages to you. Disable Text-To-Speech and use sounds instead. %1 ms Enables attenuation of other applications while users talk to you Attenuate applications while other users talk High Custom You already set a customized quality configuration in Mumble. Select this setting to keep it. You have already set a customised quality configuration in Mumble. Select this setting to keep it. Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. Apply some high contrast optimizations for visually impaired users Apply some high contrast optimisations for visually impaired users Use high contrast graphics Keep custom Text-To-Speech settings. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's ticked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) area, and when you're not talking, everything should be in the criss-crossed (definitively not speech) area. In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency and bandwidth usage. (40kbit/s, 20ms per packet) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) BanEditor Mumble - Edit Bans &Address &Mask Reason Start End User Hash &Add &Update &Remove Ban List Search field This is the search field. Use it to find bans that have this username set in the username field. Who are you looking for? No nickname IP address No IP address Reason for the ban No reason Ban end date Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). Certificate hash No certificate hash Banned users This is a list with banned users. Use this button if you want to add a new ban. Use this button if you want to update ban information. Use this button if you want to remove user from the ban list. Clear all fields This button clears all fields. Use it if you want to add a new ban. Clear Ban List - %n Ban(s) CertView Name Email Issuer Expiry Date (none) Self-signed CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. There was an error generating your certificate.<br />Please try again. Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. The file could not be opened for writing. Please use another file. The file's permissions could not be set. No certificate and key has been written. Please use another file. The file could not be written successfully. Please use another file. The file could not be opened for reading. Please use another file. The file is empty or could not be read. Please use another file. The file did not contain a valid certificate and key. Please use another file. Select file to export certificate to Select file to import certificate from Unable to import. Missing password or incompatible file type. <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. Certificates Certificate Management Certificate Authentication Authenticating to servers without using passwords Current certificate This is the certificate Mumble currently uses. Current Certificate Create a new certificate This will create a new certificate. Import certificate from file This will import a certificate from file. Import a certificate Export Certificate This will export a certificate to file. Export current certificate Import Certificate PKCS #12 Certificate import <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> Import from Filename to import from This is the filename you wish to import a certificate from. Select file to import from This opens a file selection dialog to choose a file to import a certificate from. This opens a file selection dialogue to choose a file to import a certificate from. Open... Password Password for PKCS#12 file This is the password for the PKCS#12 file containing your certificate. Certificate to import This is the certificate you are importing. Certificate Details Replace Certificate Replace existing certificate with new certificate? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognise the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognised by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> This is the certificate Mumble currently uses. It will be replaced. New certificate This is the new certificate that will replace the old one. New Certificate Make a backup of your certificate Export to Filename to export to This is the filename you wish to export a certificate to. Save As... This is the certificate Mumble currently uses. It will be exported. Generate a new certificate for strong authentication <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> Name Email Your email address (e.g. johndoe@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. Your name (e.g. John Doe) This is your name, and will be filled out in the certificate. This field is entirely optional. This is your name, and will be filled out in the certificate. This field is entirely optional. Finish Certificate-based authentication is ready for use Enjoy using Mumble with strong authentication. Automatic certificate creation <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> ChanACL None Traverse Enter Speak Mute/Deafen Make channel Make temporary Link channel This represents no privileges. This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. This represents the permission to traverse the channel. If users are denied this privilege, they will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. This represents the permission to mute and deafen other users. Once muted, users will stay muted until they are unmuted by another privileged user or reconnects to the server. This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. This represents the permission to move users to another channel or kick them from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. This represents the permission to write text messages to other users in this channel. This represents the permission to forcibly remove users from the server. This represents the permission to permanently remove users from the server. This represents the permission to register and unregister users on the server. This represents the permission to register oneself on the server. Whisper Move Text message Kick Ban Register User Register Self Write ACL ChatbarTextEdit Paste and &Send Paste and send <center>Type chat message here</center> ClientUser Friend Authenticated Priority speaker Recording Muted (server) Deafened (server) Local Ignore (Text messages) Local Mute Muted (self) Deafened (self) ConfigDialog Accept changes This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. Reject changes This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. Apply changes This button will immediately apply all changes. Undo changes for current page This button will revert any changes done on the current page to the most recent applied settings. Restore defaults for current page This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. Mumble Configuration ConnectDialog Connecting to %1 Enter username Adding host %1 Servername Hostname Bonjour name Port Addresses Website Packet loss Ping (80%) %1 ms Ping (95%) Bandwidth %1 kbit/s &Connect &Filters Unknown Users Version Failed to fetch server list Mumble Server Connect Ping Remove from Favorites Remove from Favourites Add custom server Show all servers that respond to ping Show all servers with users Show all servers &Copy Copy favorite link to clipboard Copy favourite link to clipboard &Paste Paste favorite from clipboard Paste favourite from clipboard &Edit... &Add New... Add to &Favorites Add to &Favourites Open &Webpage Show &Reachable Show &Populated Show &All ConnectDialogEdit Edit Server Name of the server A&ddress Internet address of the server. Internet address of the server. <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognised by Mumble. &Port Port on which the server is listening <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. &Username Username to send to the server <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. Label Add Server You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 Password Password to send to the server <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. Show password <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. Local server label 127.0.0.1 64738 Your username Your password &Fill CoreAudioSystem Default Device CrashReporter Mumble Crash Report <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> Email address (optional) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash Send Report Don't send report Crash upload successful Thank you for helping make Mumble better! Crash upload failed We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 Uploading crash report Abort upload DXAudioInput Default DirectSound Voice Input Opening chosen DirectSound Input device failed. No microphone capture will be done. Opening chosen DirectSound Input failed. Default device will be used. Lost DirectSound input device. DXAudioOutput Default DirectSound Voice Output Opening chosen DirectSound Output failed. Default device will be used. Lost DirectSound output device. Opening chosen DirectSound Output failed. No audio will be heard. Database Mumble failed to initialize a database in any of the possible locations. Mumble failed to initialise a database in any of the possible locations. The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. DeveloperConsole Developer Console DockTitleBar Drag here GlobalShortcut Shortcuts List of configured shortcuts Function Data Shortcut Suppress Add new shortcut This will add a new global shortcut &Add Remove selected shortcut This will permanently remove a selected shortcut. &Remove <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> Open Accessibility Preferences Skip Enable Global Shortcuts <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. Additional Shortcut Engines <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. Enable Windows hooks <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. Enable GKey <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. Enable XInput <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. Enable shortcuts in privileged applications GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> Shortcuts Shortcut button combination. <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. Suppress keys from other applications <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. GlobalShortcutTarget Whisper Target Whisper to list of Users Channel Target Restrict to Group If specified, only members of this group will receive the whisper. List of users Add Remove Modifiers Do not send positional audio information when using this whisper shortcut. Ignore positional audio Shout to Linked channels Shout to subchannels Shout to Channel The whisper will also be transmitted to linked channels. The whisper will also be sent to the subchannels of the channel target. GlobalShortcutX Mouse %1 JackAudioSystem Hardware Ports Mono Stereo LCD Not connected LCDConfig Enable this device LCD Devices Name <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> Size Enabled Views Minimum Column Width <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> This setting decides the width of column splitter. Splitter Width Log Debug Critical Warning Information Server Connected Server Disconnected Other self-muted/deafened Permission Denied Text Message User Joined Server User Left Server User recording state changed User kicked (you or by you) User kicked You self-muted User muted (you) User muted (by you) User muted (other) User Joined Channel User Left Channel You self-unmuted You self-deafened You self-undeafened User renamed You Joined Channel You Joined Channel (moved) User connected and entered channel User left channel and disconnected Private text message the server [[ Invalid size ]] [[ Text object too large to display ]] [Date changed to %1] link to %1 FTP link to %1 player link channel link %1 link LogConfig Toggle console for %1 events Toggle pop-up notifications for %1 events Toggle Text-To-Speech for %1 events Click here to toggle sound notification for %1 events Toggle window highlight (if not active) for %1 events Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. Click here to toggle console output for %1 events.<br />If ticked, this option makes Mumble output all %1 events in its message log. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If ticked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. Click here to toggle Text-To-Speech for %1 events.<br />If ticked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. Click here to toggle sound notification for %1 events.<br />If selected, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Messages Message Console Notification Text-To-Speech Soundfile Path Text To Speech Volume Volume of Text-To-Speech Engine <b>This is the volume used for the speech synthesis.</b> Length threshold Message length threshold for Text-To-Speech Engine <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. Characters Whisper If checked you will only hear whispers from users you added to your friend list. If ticked you will only hear whispers from users you added to your friend list. Only accept whispers from friends If enabled text messages you send will be read back to you with TTS Read back own messages Chat Log Maximum chat length Unlimited Lines Highlight LookConfig System default None Only with users All Ask Do Nothing Move <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory User Interface This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. List users above subchannels (requires restart). <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. Users above Channels <b>If set, will verify you want to quit if connected.</b> Show number of users in each channel Show channel user count Language Language to use (requires restart) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. Look and Feel Layout Classic Stacked Hybrid Custom This changes the behavior when moving channels. This changes the behaviour when moving channels. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behaviour of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. Expand When to automatically expand channels Channel Dragging Ask whether to close or minimize when quitting Mumble. Ask whether to close or minimise when quitting Mumble. Ask on quit while connected Always On Top <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> <b>If set, minimising the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimised as a window normally would.</b> Hide in tray when minimized Hide in tray when minimised Hide the main Mumble window in the tray when it is minimized. Hide the main Mumble window in the tray when it is minimised. This setting controls when the application will be always on top. Never Always In minimal view In normal view Displays talking status in system tray Show talking status in tray icon This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. Show context menu in menu bar Apply some high contrast optimizations for visually impaired users Apply some high contrast optimisations for visually impaired users Optimize for high contrast Optimise for high contrast Application Adds user and channel context menus into the menu bar Tray Icon Channel Tree Use selected item as the chat bar target Filter automatically hides empty channels Show transmit mode dropdown in toolbar Theme Theme to use to style the user interface <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. User Dragging This changes the behavior when moving users. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. Enable Developer menu When in custom layout mode, checking this disables rearranging. Lock layout MainWindow Root Push-to-Talk Global Shortcut Push and hold this button to send voice. Global Shortcut This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Reset Audio Processor Global Shortcut Unlink Plugin Global Shortcut Push-to-Mute Global Shortcut Join Channel Global Shortcut Toggle Overlay Global Shortcut Toggle state of in-game overlay. Global Shortcut Toggle Minimal Global Shortcut Volume Up (+10%) Global Shortcut Volume Down (-10%) Global Shortcut Mumble Mumble -- %1 &Window Minimize Minimise Ctrl+M Close Mumble is currently connected to a server. Do you want to Close or Minimize it? Mumble is currently connected to a server. Do you want to Close or Minimise it? Mute Self Global Shortcut Set self-mute status. Global Shortcut This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut Deafen Self Global Shortcut Set self-deafen status. Global Shortcut This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut Whisper/Shout Whisper <center>Not connected</center> Not connected Clear Opening URL %1 File does not exist File is not a configuration file. Settings merged from file. URL scheme is not 'mumble' This version of Mumble can't handle URLs for Mumble version %1.%2.%3 Connecting to %1 Enter username Connecting to server %1. Reconnecting. Transmit Mode set to Continuous <p>%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> Register yourself as %1 <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <h2>Version</h2><p>Protocol %1</p> <p>No build information or OS version available</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) The connection is secured by the cipher suite that OpenSSL identifies as %1 <p>The connection provides perfect forward secrecy</p> <p>The connection does not provide perfect forward secrecy</p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> Voice channel is sent over control channel Register user %1 <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> Kicking user %1 Banning user %1 View comment on user %1 Message to channel %1 Connected. <li>Expected certificate digest (SHA-1): %1</li> Server presented a certificate which failed verification. <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> SSL Version mismatch Server connection failed. <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>Type message to user '%1' here</center> Type message to user '%1' here Choose image file Failed to load image Could not open file for reading. Image format not recognized. Image format not recognised. &User &Channel Use in conjunction with Whisper to. Global Shortcut This will switch the states of the in-game overlay. Global Shortcut Link Channel Global Shortcut Cycle Transmit Mode Global Shortcut Set Transmit Mode to Push-To-Talk Global Shortcut Set Transmit Mode to Continuous Global Shortcut Set Transmit Mode to VAD Global Shortcut Send Text Message Global Shortcut Send Clipboard Text Message Global Shortcut This will send your Clipboard content to the channel you are currently in. Global Shortcut Continuous Voice Activity Push-to-Talk Mumble - Minimal View -- %1 Cancel Save Image As... Save Image File Could not save image: %1 Change your comment Transmit Mode set to Voice Activity Transmit Mode set to Push-to-Talk <p>Connected users: %1/%2</p> UDP Statistics To Server From Server Good Late Lost Resync <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> Mumble Server Information &View Certificate Enter reason Sending message to %1 To %1: %2 Message to %1 Are you sure you want to reset the comment of user %1? Are you sure you want to reset the avatar of user %1? Are you sure you want to delete %1 and all its sub-channels? Sending message to channel %1 Message to tree %1 To %1 (Tree): %2 (Tree) %1: %2 Unmuted and undeafened. Unmuted. Muted. Muted and deafened. Deafened. Undeafened. Restart Mumble? Some settings will only apply after a restart of Mumble. Restart Mumble now? About Qt SSL Verification failed: %1 <li>Server certificate digest (SHA-1): %1</li> <b>WARNING:</b> The server presented a certificate that was different from the stored one. This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. Server connection failed: %1. Disconnected from server. Invalid username You connected with an invalid username, please try another one. Username in use That username is already in use, please try another username. Wrong certificate or password Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. Wrong password Wrong server password for unregistered user account, please try again. Images (*.png *.jpg *.jpeg) C&onfigure &Help Log This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. &Quit Mumble Closes the program Exits the application. Ctrl+Q Open the server connection dialog Open the server connection dialogue &Disconnect Disconnect from server Disconnects you from the server. Show information about the server connection This will show extended information about the connection to the server. &Mute &Deafen &Local Mute Send a Text Message Sends a text message to another user. Add new channel This adds a new sub-channel to the currently selected channel. Remove channel This removes a channel and all sub-channels. Edit Groups and ACL for channel This opens the Group and ACL dialog for the channel, to control permissions. This opens the Group and ACL dialogue for the channel to control permissions. &Link Link your channel to another channel This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. Chatbar Shows a dialog of registered servers, and also allows quick-connect. Shows a dialogue of registered servers, and also allows quick-connect. Kick user (with reason) Kick selected user off server. You'll be asked to specify a reason. Mute user Mute or unmute user on server. Unmuting a deafened user will also undeafen them. Kick and ban user (with reason) Kick and ban selected user from server. You'll be asked to specify a reason. Deafen user Deafen or undeafen user on server. Deafening a user will also mute them. Mute user locally Mute or unmute user locally. Use this on other users in the same room. This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. &Unlink Channel Unlink your channel from another channel This unlinks your current channel from the selected channel. Unlinks your channel from all linked channels. This unlinks your current channel (not the selected one) from all linked channels. &Reset Reset audio preprocessor This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. &Mute Self Mute yourself Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. &Deafen Self Deafen yourself Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. &Text-To-Speech Toggle Text-To-Speech Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialogue will actually be spoken. Display audio statistics Pops up a small dialog with information about your current audio input. Pops up a small dialogue with information about your current audio input. Forcibly unlink plugin This forces the current plugin to unlink, which is handy if it is reading completely wrong data. This forces the current plugin to unlink, which is handy if it is reading completely wrong data. Configure Mumble Allows you to change most settings for Mumble. Start the audio configuration wizard This will guide you through the process of configuring your audio hardware. &What's This? Enter What's This? mode Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. Information about Mumble Shows a small dialog with information and license for Mumble. Shows a small dialogue with information and licence for Mumble. Information about Speex Shows a small dialog with information about Speex. Shows a small dialogue with information about Speex. Information about Qt Shows a small dialog with information about Qt. Shows a small dialogue with information about Qt. Check for &Updates Check for new version of Mumble Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. Sends a text message to all users in a channel. Configure certificates for strong authentication This starts the wizard for creating, importing and exporting certificates for authentication against servers. This starts the wizard for creating, importing and exporting certificates for authentication against servers. Register user on server This will permanently register the user on the server. Add &Friend Adds a user as your friend. This will add the user as a friend, so you can recognize him on this and other servers. This will add the user as a friend so you can recognise them on this and other servers. &Remove Friend Removes a user from your friends. This will remove a user from your friends list. &Update Friend Update name of your friend. Your friend uses a different name than what is in your database. This will update the name. Edit registered users list This opens the editor for registered users, which allow you to change their name or unregister them. Add or remove text-based access tokens &Minimal View Toggle minimal window modes This will toggle minimal mode, where the log window and menu is hidden. This will toggle minimal mode, where the log window and menu is hidden. You muted and deafened %1. You unmuted and undeafened %1. You undeafened %1. You suppressed %1. %1 muted and deafened by %2. %1 unmuted and undeafened by %2. %1 undeafened by %2. %1 suppressed by %2. %1 moved to %2. %1 moved to %2 by %3. %1 moved in from %2 by %3. %1 is now muted and deafened. Your account information can not be verified currently. Please try again later Welcome message: %1 Mumble: %1 You were denied %1 privileges in %2. %3 was denied %1 privileges in %2. Denied: Cannot modify SuperUser. Denied: Invalid channel name. Denied: Text message too long. Denied: Operation not permitted in temporary channel. You need a certificate to perform this operation. %1 does not have a certificate. Invalid username: %1. Invalid username. Channel is full. Channel nesting limit reached. Channel count limit reached. Need to delete channels before creating new ones. Permission denied. %1 connected and entered channel. %1 connected. %1 is now muted. %1 is now unmuted. Recording started Recording stopped %1 started recording. %1 stopped recording. You revoked your priority speaker status. You assumed priority speaker status. %1 revoked your priority speaker status. %1 gave you priority speaker status. You revoked priority speaker status for %1. You gave priority speaker status to %1. %1 revoked own priority speaker status. %1 assumed priority speaker status. %1 revoked priority speaker status for %2. %1 gave priority speaker status to %2. You were unmuted and undeafened by %1. You were muted by %1. You were undeafened by %1. You were suppressed. You were suppressed by %1. You were unsuppressed. You were unsuppressed by %1. You joined %1. You moved %1 to %2. %1 is recording %1 renamed to %2 by %3. %1 disconnected. Server message from (Tree) (Channel) (Private) %2%1: %3 Failed to load Opus, it will not be available for audio encoding/decoding. The server requests minimum client version %1 The server requests positional audio be enabled. The server requests positional audio be disabled. The server requests Push-to-Talk be enabled. The server requests Push-to-Talk be disabled. You were unmuted by %1. You muted %1. You unsuppressed %1. You unmuted %1. %1 muted by %2. %1 unsuppressed by %2. %1 unmuted by %2. Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. You were muted and deafened by %1. You were deafened by %1. You were kicked from the server by %1: %2. %3 was kicked from the server by %1: %2. You were kicked and banned from the server by %1: %2. %3 was kicked and banned from the server by %1: %2. You were moved to %1 by %2. %1 entered channel. Server connection rejected: %1. Denied: %1. %1 renamed to %2. %1 left channel and disconnected. Message from %1 You have User Dragging set to "Do Nothing" so the user wasn't moved. You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. Unknown Channel Drag mode in UserModel::dropMimeData. Remote controlling Mumble: Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) -jn, --jackname Set custom Jack client name. --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status Invocation Error: No RPC command specified RPC Welcome to Mumble. Skipping version check in debug mode. Hide Frame Toggle showing frame on minimal window This will toggle whether the minimal window should have a frame for moving and resizing. &Unlink All Reset the comment of the selected user. &Join Channel View comment in editor Query server for connection information for user S&erver &Self &Unlink Plugins Register yourself on the server Change your avatar image on this server &Remove Avatar Remove currently defined avatar image. Icon Toolbar Change your own comment Recording Priority Speaker &Copy URL Copies a link to this channel to the clipboard. Ignore Messages Locally ignore user's text chat messages. Silently drops all text messages from the user. Edit ban list on server This lets you edit the server-side IP ban list. &Filter on/off Toggle the channel filter (Ctrl+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. Ctrl+F &Hide Channel when Filtering Reset the avatar of the selected user. Locally adjust the user's speech volume. Opens a dialog with a volume slider. Use this on other users in the same room. &Developer &Hide Mumble Hides the main Mumble window. Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. Show the Developer Console Shows the Mumble Developer Console, where Mumble's log output can be inspected. &Connect... &Ban list... &Information... &Kick... &Ban... Local Volume Adjustment... Send &Message... &Add... &Remove... &Edit... Audio S&tatistics... &Settings... &Audio Wizard... Developer &Console... &About... About &Speex... About &Qt... &Certificate Wizard... &Register... Registered &Users... Change &Avatar... &Access Tokens... Reset &Comment... Reset &Avatar... View Comment... &Change Comment... R&egister... Show Shows the main Mumble window. Manual Manual Mumble Positional Audio Position X Y Z m Heading Azimuth Elevation ° Meta data Context Identity Set State Linked Activated Unhinge NetworkConfig Network Updates are mandatory when using snapshot releases. Connection Use TCP compatibility mode Use TCP compatability mode <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). Reconnect when disconnected <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. Reconnect automatically Proxy Type Type of proxy to connect through Direct connection HTTP(S) proxy SOCKS5 proxy Hostname Hostname of the proxy Force TCP mode Enable QoS to prioritize packets Enable QoS to prioritise packets This will enable QoS, which will attempt to prioritize voice packets over other traffic. This will enable QoS, which will attempt to prioritise voice packets over other traffic. Use Quality of Service Don't send certificate to server and don't save passwords. (Not saved). <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> Suppress certificate and password storage <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunnelling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. Port Port number of the proxy <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. Username Username for proxy authentication <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Password Password for proxy authentication <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Mumble services Check for new releases of Mumble automatically. This will check for new releases of Mumble every time you start the program, and notify you if one is available. This will check for new releases of Mumble every time you start the program, and notify you if one is available. Check for application updates on startup Check for new releases of plugins automatically. This will check for new releases of plugins every time you start the program, and download them automatically. This will check for new releases of plugins every time you start the program, and download them automatically. <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. Submit anonymous statistics to the Mumble project Submit anonymous statistics Reconnect to last used server when starting Mumble Reconnect to last server on startup Download plugin and overlay updates on startup Privacy Prevent OS information being sent to Mumble servers and web servers <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. Do not send OS information to Mumble servers and web servers Overlay Silent Talking Whisper Shout Channel Failed to create communication with overlay at %2: %1. No overlay will be available. OverlayClient Filter Only talking Talking and recently active All in current channel All in linked channels Always show yourself Configure recently active time (%1 seconds)... Columns Sort Alphabetically Last state change Edit... Reset Zoom Configure recently active time Amount of seconds users remain active after talking: OverlayConfig To move the users, drag the little red dot. To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. For more options, right click a user. For more options, rightclick a user. Launcher Filter Overlay Choose executable Choose application Choose path Load Overlay Presets Mumble overlay presets (*.mumblelay) Save Overlay Presets Options Enable overlay. Enable Overlay This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only ticked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. Layout Blacklist Whitelist Uninstall Overlay Overlay Installation Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. Install Mumble Overlay Overlay Upgrade Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. Upgrade Mumble Overlay Display a frame counter in the overlay Show FPS counter Load an overlay preset from file Load… Save your overlay settings to file Save… Set the overlay font. Set the overlay text color. Set the overlay text colour. Color Colour Remove Font FPS and Clock Display Display a clock in the overlay showing the current local time (system time). Show Clock Overlay Exceptions Overlay Exception Mode Allowed launchers Add Allowed programs Allowed paths Blacklisted programs OverlayEditor State User is not talking Passive User is talking in your channel or a linked channel Talking User is whispering to you privately Private Whisper User is shouting to your channel Channel Whisper Zoom Zoom Factor Enabled Elements User avatar, chosen by each user Avatar User's name Username Name of user's channel, if outside your current channel Channel Muted or deafened Mute state Bounding box, automatically shrunk to minimum size to contain all visible elements Bounding box Overlay Editor OverlayEditorScene Layout preset Large square avatar Avatar and Name User Opacity %1% Object Opacity Alignment Left Center Centre Right Top Bottom Color... Colour... Font... Bounding box Pen width Padding Pen color Pen colour Fill color Fill colour Pick pen color Pick pen colour Pick fill color Pick fill colour Pick color Pick colour Pick font PluginConfig Plugins Plugin has no configure function. Plugin has no about function. Options Enable plugins and transmit positional information This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. Link to Game and Transmit Position Reloads all plugins This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. &Reload plugins Information about plugin This shows a small information message about the plugin. &About Show configuration page of plugin This shows the configuration page of the plugin, if any. &Configure Name Enabled Plugins Skipping plugin update in debug mode. Downloaded new or updated plugin to %1. Failed to install new plugin to %1. %1 lost link. %1 linked. PortAudioSystem Default Device PulseAudioSystem Default Input Default Output QApplication Failed to restart mumble Mumble failed to restart itself. Please restart it manually. RichTextEditor Failed to load image Image file too large to embed in document. Please use images smaller than %1 kB. Message is too long. Display Source Text &Bold Ctrl+B &Italic Italic Ctrl+I Underline Ctrl+U Color Colour Insert Link Ctrl+L Insert Image RichTextEditorLink Add Link URL Text ServerHandler Unable to resolve hostname Server is not responding to TCP pings UDP packets cannot be sent to or received from the server. Switching to TCP mode. UDP packets cannot be sent to the server. Switching to TCP mode. UDP packets cannot be received from the server. Switching to TCP mode. UDP packets can be sent to and received from the server. Switching back to UDP mode. Connection timed out ServerView Favorite Favourite LAN Public Internet Unknown Africa Asia North America South America Europe Oceania ShortcutActionWidget Unassigned ShortcutDelegate On Off Toggle Unassigned ShortcutKeyWidget Press Shortcut ShortcutTargetDialog Root Parent Current Subchannel #%1 ShortcutTargetWidget ... , Root Parent Current Subchannel #%1 Invalid Empty <Empty> ShortcutToggleWidget Off Toggle On TextMessage Enter text If checked the message is recursively sent to all subchannels If ticked the message is recursively sent to all subchannels Send recursively to subchannels Tokens Empty Token Mumble - Access Tokens List of access tokens on current server <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. Add a token &Add Remove a token &Remove UserEdit Registered Users Remove Rename Who are you looking for? Days Weeks Months Years Inactive for Registered users: %n account(s) UserInformation User Information Connection Information Version OS Certificate IP Address CELT Versions Details... Ping Statistics Pings received Average ping TCP (Control) UDP (Voice) UDP Network statistics Good Late Lost Resync From Client To Client Connection time %1w %1d %1h %1m %1s , %1 (%2) %1.%2.%3 (%4) Supported Not Supported Not Reported %1 online (%2 idle) %1 online %1 kbit/s Bandwidth GroupBox Bandwidth Label Ping deviation UserListModel Nick Inactive days Last channel Last seen: %1 Never Channel ID: %1 UserLocalVolumeDialog Local volume for other users <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. Adjusting local volume for %1 dB <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: Talking to your channel. Shouting directly to your channel. Whispering directly to your channel. Whispering directly to you. Not talking. This is a channel on the server. The icon indicates the state of the channel: Your current channel. A channel that is linked with your channel. Linked channels can talk to each other. A channel on the server that you are not linked to. This shows the flags the user has on the server, if any: On your friend list Authenticated user Muted (manually muted by self) Muted (manually muted by admin) Muted (not allowed to speak in current channel) Muted (muted by you, only on your machine) Muted (push-to-mute) Deafened (by self) Deafened (by admin) User has a new comment set (click to show) User has a comment set, which you've already seen. (click to show) Ignoring Text Messages This shows the flags the channel has, if any: Channel has a new comment set (click to show) Channel has a comment set, which you've already seen. (click to show) Channel will be hidden when filtering is enabled Name Flags Are you sure you want to drag this user? Are you sure you want to drag this channel? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. VersionCheck Upgrade Mumble A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? Failed to launch snapshot installer. Corrupt download of new version detected. Automatically removed. Downloading new snapshot from %1 to %2 Failed to write new version to disk. Failed to write new version to disc. Mumble failed to retrieve version information from the central server. ViewCert Certificate Chain Details Certificate chain Certificate details Common Name Organization Subunit Country Locality State Valid from: %1 Valid to: %1 Serial: %1 Public Key: %1 bits %2 RSA DSA Digest (SHA-1): %1 Digest (SHA-256): %1 Email: %1 DNS: %1 Issued by: Unit Name VoiceRecorder Recorder failed to create directory '%1' Recorder failed to open file '%1' .wav - Uncompressed .ogg (Vorbis) - Compressed .au - Uncompressed .flac - Lossless compressed VoiceRecorderDialog Recorder Control 00:00:00 &Start S&top Mode Multichannel Output Output format Target directory Filename &Browse... Valid variables are: Inserts the user's name Inserts the current date Inserts the current time Inserts the hostname Recorder still running Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? Unable to start recording. Not connected to a server. The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. There is already a recorder active for this server. Please select a recording format. Stopping Select target directory Downmix WASAPIInput Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone. WASAPISystem Default Device qwPTTButtonWidget Mumble PTT Push to talk mumble-1.3.4/src/mumble/ConnectDialog.ui0000664000175000017500000001135014010707273017761 0ustar builderbuilder ConnectDialog 0 0 574 366 Mumble Server Connect Qt::CustomContextMenu true QAbstractItemView::DragDrop true 250 true true true false Servername Ping Users QDialogButtonBox::Cancel|QDialogButtonBox::Ok Remove from Favorites &Edit... &Add New... Add custom server Add to &Favorites Open &Webpage true true Show &Reachable Show all servers that respond to ping true true Show &Populated Show all servers with users true Show &All Show all servers &Copy Copy favorite link to clipboard &Paste Paste favorite from clipboard ServerView QTreeWidget
ConnectDialog.h
qdbbButtonBox accepted() ConnectDialog accept() 365 270 365 513 qdbbButtonBox rejected() ConnectDialog reject() 459 275 456 494
mumble-1.3.4/src/mumble/mumble_nl_BE.ts0000664000175000017500000106275714010707274017624 0ustar builderbuilder ACLEditor Deny Allow Allow %1 Deny %1 Mumble - Add channel Failed: Invalid channel Mumble - Edit %1 ID: %1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Channel must have a name This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Dialog Name Enter the channel name here. Description Password Enter the channel password here. Check to create a temporary channel. Temporary Channel positioning facility value <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. Position &Groups Group List of groups Remove selected group Remove Inherit group members from parent Inherit Make group inheritable to sub-channels Inheritable Group was inherited from parent channel Inherited Members Add Add member to group Remove member from group &ACL Active ACLs List of entries Inherit ACL of parent? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. Inherit ACLs Move entry up This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. &Up Move entry down This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. &Down Add new entry This adds a new entry, initially set with no permissions and applying to all. &Add Remove entry This removes the currently selected entry. &Remove Context Entry should apply to this channel. Entry should apply to this channel This makes the entry apply to this channel. Applies to this channel Entry should apply to sub-channels. Add new group <b>Add</b><br/> Add a new group. Inherited members Contains the list of members added to the group by this channel. Contains a list of members whose group membership will not be inherited from the parent channel. Contains the list of members inherited by other channels. Type in the name of a user you wish to add to the group and click Add. Type in the name of a user you wish to remove from the group and click Add. Exclude Excluded members This makes the entry apply to sub-channels of this channel. Applies to sub-channels Permissions User/Group Group this entry applies to User ID User this entry applies to This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. &Properties <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. ID of the channel. ChannelID ALSAAudioInput Default ALSA Card Opening chosen ALSA Input failed: %1 ALSAAudioOutput Default ALSA Card Opening chosen ALSA Output failed: %1 ASIOConfig %1 (version %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz ASIO Initialization failed: %1 Failed to instantiate ASIO driver ASIO Form Device selection Device Device to use for microphone This chooses what device to query. You still need to actually query the device and select which channels to use. Query selected device This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Query Configure selected device This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Configure Capabilities Driver name Buffer size This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. Configure input channels Channels Microphone <- -> Unused Speakers ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. Opening selected ASIO device failed. No input will be done. AboutDialog About Mumble <h3>Mumble (%1)</h3><p>Copyright %3 The Mumble team</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble &License 3rd &party licenses OK AudioInput Form Interface System Input method for audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Input device for audio <b>This is the input device to use for audio.</b> Transmission &Transmit When to transmit your speech <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. DoublePush Time If you press the PTT key twice in this time it will get locked. <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. Reset audio cue to default <b>Reset</b><br/>Reset the paths for the files to their default. Browse for on audio file Browse for off audio file Off On Preview the audio cues Use SNR based speech detection Signal to Noise <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. Amplitude Voice &Hold How long to keep transmitting after silence Silence Below <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. Speech Above Signal values above this count as voice Compression &Quality Quality of compression (peak bandwidth) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. Audio per packet How many audio frames to send per packet <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). Audio Processing Noise Suppression Noise suppression <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. Maximum amplification of input sound <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. Current speech detection chance Cancel echo from speakers Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. Disabled Mixed Multichannel Echo <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal values below this count as silence Maximum bandwidth used for sending audio Use Amplitude based speech detection <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). Exclusive mode <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive R&eset &Browse... B&rowse... &Preview <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. Displays an always on top window with a push to talk button in it Display push to talk window Misc Audible audio cue when starting or stopping to transmit <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. Audio cue Gets played when starting to transmit Gets played when stopping to transmit Hold Time Time the microphone stays open after the PTT key is released Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) Max. Amplification Idle action minutes do nothing deafen mute after AudioInputDialog Continuous Voice Activity Push To Talk Audio Input %1 ms Off %1 s %1 kb/s -%1 dB %1 kbit/s (Audio %2, Position %4, Overhead %3) AudioOutput Form Interface System Output method for audio <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Output device for audio <b>This is the output device to use for audio.</b> Positional Audio Audio Output Default &Jitter Buffer Safety margin for jitter buffer <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. Minimum distance to user before sound volume decreases This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. Volume Volume of incoming speech <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. Output Delay Amount of data to buffer The connected "speakers" are actually headphones The connected "speakers" are actually headphones. Factor for sound volume decrease Bloom Factor for sound volume increase How much should sound volume increase for sources that are really close? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Headphones Minimum Distance Maximum Distance Maximum distance, beyond which speech volume won't decrease Minimum Volume What should the volume be at the maximum distance? Loopback Test Delay Variance Variance in packet latency <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. Packet Loss Packet loss for loopback mode <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% &Loopback Desired loopback mode Attenuate applications by... Attenuation of other applications during speech <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. If checked Mumble lowers the volume of other applications while other users talk <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. while other users talk If checked Mumble lowers the volume of other applications while you talk <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. while you talk Exclusive mode, not recommended. <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive Priority Speaker If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. Attenuate other users while talking as Priority Speaker. AudioOutputDialog None Local Server Audio Output %1 ms %1 % %1 m AudioOutputSample Choose sound file Invalid sound file The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. AudioStats >1000 ms >1000ms Audio Statistics Input Levels Peak microphone level Peak power in last frame This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. Peak speaker level This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. Peak clean level This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. Signal Analysis Microphone power How close the current input level is to ideal This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. Signal-To-Noise ratio Signal-To-Noise ratio from the microphone This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. Speech Probability Probability of speech This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). Configuration feedback Current audio bitrate Bitrate of last frame DoublePush interval Time between last two Push-To-Talk presses Speech Detection Current speech detection chance <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal and noise power spectrum Power spectrum of input signal and noise estimate This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. Echo Analysis Weights of the echo canceller This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. AudioWizard Audio Tuning Wizard Introduction Welcome to the Mumble Audio Wizard Finished Enjoy using Mumble Device selection Selecting the input and output device to use with Mumble. This is the device your microphone is connected to. System Input method for audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Input device to use <b>Selects which sound card to use for audio input.</b> Cancel echo from headset or speakers Use echo cancellation This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. This is the device your speakers or headphones are connected to. Output method for audio <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. Output device to use <b>Selects which sound card to use for audio Output.</b> Enable positional audio Allows positioning of sound Allows positioning of sound. <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> Input Device Output Device This allows Mumble to use positional audio to place voices. <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> Amount of data to buffer This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> Positional Audio Adjusting attenuation of positional audio. <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> Use headphones instead of speakers <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> Use headphones This ignores the OS speaker configuration and configures the positioning for headphones instead. Volume tuning Tuning microphone hardware volume to optimal settings. Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. Voice Activity Detection Letting Mumble figure out when you're talking and when you're silent. This will help Mumble figure out when you are talking. The first step is selecting which data value to use. Raw amplitude from input Signal-To-Noise ratio Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Device tuning Changing hardware output delays to their minimum value. Submit anonymous statistics to the Mumble project Push To Talk: Quality & Notifications Adjust quality and notification settings. Quality settings Low Balanced Notification settings Use Text-To-Speech to read notifications and messages to you. Disable Text-To-Speech and use sounds instead. %1 ms Enables attenuation of other applications while users talk to you Attenuate applications while other users talk High Custom You already set a customized quality configuration in Mumble. Select this setting to keep it. Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. Apply some high contrast optimizations for visually impaired users Use high contrast graphics Keep custom Text-To-Speech settings. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) BanEditor Mumble - Edit Bans &Address &Mask Reason Start End User Hash &Add &Update &Remove Ban List Search field This is the search field. Use it to find bans that have this username set in the username field. Who are you looking for? No nickname IP address No IP address Reason for the ban No reason Ban end date Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). Certificate hash No certificate hash Banned users This is a list with banned users. Use this button if you want to add a new ban. Use this button if you want to update ban information. Use this button if you want to remove user from the ban list. Clear all fields This button clears all fields. Use it if you want to add a new ban. Clear Ban List - %n Ban(s) CertView Name Email Issuer Expiry Date (none) Self-signed CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. There was an error generating your certificate.<br />Please try again. Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. The file could not be opened for writing. Please use another file. The file's permissions could not be set. No certificate and key has been written. Please use another file. The file could not be written successfully. Please use another file. The file could not be opened for reading. Please use another file. The file is empty or could not be read. Please use another file. The file did not contain a valid certificate and key. Please use another file. Select file to export certificate to Select file to import certificate from Mumble User <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. Certificates Certificate Management Certificate Authentication Authenticating to servers without using passwords Current certificate This is the certificate Mumble currently uses. Current Certificate Create a new certificate This will create a new certificate. Import certificate from file This will import a certificate from file. Import a certificate Export Certificate This will export a certificate to file. Export current certificate Import Certificate PKCS #12 Certificate import <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> Import from Filename to import from This is the filename you wish to import a certificate from. Select file to import from This opens a file selection dialog to choose a file to import a certificate from. Open... Password Password for PKCS#12 file This is the password for the PKCS#12 file containing your certificate. Certificate to import This is the certificate you are importing. Certificate Details Replace Certificate Replace existing certificate with new certificate? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> This is the certificate Mumble currently uses. It will be replaced. New certificate This is the new certificate that will replace the old one. New Certificate Make a backup of your certificate Export to Filename to export to This is the filename you wish to export a certificate to. Save As... This is the certificate Mumble currently uses. It will be exported. Generate a new certificate for strong authentication <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> Name Email Your email address (e.g. johndoe@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. Your name (e.g. John Doe) This is your name, and will be filled out in the certificate. This field is entirely optional. Finish Certificate-based authentication is ready for use Enjoy using Mumble with strong authentication. Automatic certificate creation <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p> <p> It is <b>strongly</b> recommended that you <a href="http://mumble.info/certificate.php">create a trusted certificate</a>. </p> <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> ChanACL None Traverse Enter Speak Mute/Deafen Make channel Make temporary Link channel This represents no privileges. This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. This represents the permission to write text messages to other users in this channel. This represents the permission to forcibly remove users from the server. This represents the permission to permanently remove users from the server. This represents the permission to register and unregister users on the server. This represents the permission to register oneself on the server. Whisper Move Text message Kick Ban Register User Register Self Write ACL ChatbarTextEdit Paste and &Send Paste and send <center>Type chat message here</center> ClientUser Friend Authenticated Priority speaker Recording Muted (server) Deafened (server) Local Ignore (Text messages) Local Mute Muted (self) Deafened (self) ConfigDialog Accept changes This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. Reject changes This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. Apply changes This button will immediately apply all changes. Undo changes for current page This button will revert any changes done on the current page to the most recent applied settings. Restore defaults for current page This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. Mumble Configuration Advanced ConnectDialog Connecting to %1 Enter username Adding host %1 Servername Hostname Bonjour name Port Addresses Website Packet loss Ping (80%) %1 ms Ping (95%) Bandwidth %1 kbit/s &Connect &Filters Users Version Failed to fetch server list Mumble Server Connect Ping Remove from Favorites Add custom server Show all servers that respond to ping Show all servers with users Show all servers &Copy Copy favorite link to clipboard &Paste Paste favorite from clipboard &Edit... &Add New... Add to &Favorites Open &Webpage Show &Reachable Show &Populated Show &All ConnectDialogEdit Edit Server Name of the server A&ddress Internet address of the server. Internet address of the server. <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. &Port Port on which the server is listening <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. &Username Username to send to the server <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. Label Add Server Password Password to send to the server <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. Show password <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. Local server label 127.0.0.1 64738 Your username Your password CoreAudioSystem Default Device CrashReporter Mumble Crash Report <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> Email address (optional) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash Send Report Don't send report Crash upload successful Thank you for helping make Mumble better! Crash upload failed We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 Uploading crash report Abort upload DXAudioInput Default DirectSound Voice Input Opening chosen DirectSound Input device failed. No microphone capture will be done. Opening chosen DirectSound Input failed. Default device will be used. Lost DirectSound input device. DXAudioOutput Default DirectSound Voice Output Opening chosen DirectSound Output failed. Default device will be used. Lost DirectSound output device. Opening chosen DirectSound Output failed. No audio will be heard. Database Mumble failed to initialize a database in any of the possible locations. The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. DockTitleBar Drag here GlobalShortcut Shortcuts List of configured shortcuts Function Data Shortcut Suppress Add new shortcut This will add a new global shortcut &Add Remove selected shortcut This will permanently remove a selected shortcut. &Remove <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> Open Accessibility Preferences Skip Enable Global Shortcuts GlobalShortcutConfig Shortcuts Shortcut button combination. <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. Suppress keys from other applications <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. GlobalShortcutTarget Whisper Target Whisper to list of Users Channel Target Restrict to Group If specified, only members of this group will receive the whisper. List of users Add Remove Modifiers Do not send positional audio information when using this whisper shortcut. Ignore positional audio Shout to Linked channels Shout to subchannels Shout to Channel The whisper will also be transmitted to linked channels. The whisper will also be sent to the subchannels of the channel target. GlobalShortcutX Mouse %1 LCD Not connected LCDConfig Enable this device LCD Form Devices Name <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> Size Enabled Views Minimum Column Width <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> This setting decides the width of column splitter. Splitter Width Log Debug Critical Warning Information Server Connected Server Disconnected Other self-muted/deafened Permission Denied Text Message User Joined Server User Left Server User recording state changed User kicked (you or by you) User kicked You self-muted User muted (you) User muted (by you) User muted (other) User Joined Channel User Left Channel You self-unmuted You self-deafened You self-undeafened the server [[ Text object too large to display ]] [Date changed to %1] link to %1 ftp link to %1 player link channel link %1 link LogConfig Toggle console for %1 events Toggle pop-up notifications for %1 events Toggle Text-To-Speech for %1 events Click here to toggle sound notification for %1 events Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. Messages Message Console Notification Text-To-Speech Soundfile Path Text To Speech Volume Volume of Text-To-Speech Engine <b>This is the volume used for the speech synthesis.</b> Length threshold Message length threshold for Text-To-Speech Engine <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. Characters Whisper If checked you will only hear whispers from users you added to your friend list. Only accept whispers from friends If enabled text messages you send will be read back to you with TTS Read back own messages Chat Log Maximum chat length Unlimited Lines LookConfig System default None Only with users All Ask Do Nothing Move User Interface Choose skin file This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. List users above subchannels (requires restart). <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. Users above Channels <b>If set, will verify you want to quit if connected.</b> Show number of users in each channel Show channel user count Language Language to use (requires restart) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. Look and Feel Layout Classic Stacked Hybrid Custom This changes the behavior when moving channels. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. Style Basic widget style <b>This sets the basic look and feel to use.</b> Skin Skin file to use <b>This sets which skin Mumble should use.</b><br />The skin is a style file applied on top of the basic widget style. If there are icons in the same directory as the style sheet, those will replace the default icons. Expand When to automatically expand channels Channel Dragging Ask whether to close or minimize when quitting Mumble. Ask on quit while connected Always On Top <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> Hide in tray when minimized Hide the main Mumble window in the tray when it is minimized. This setting controls when the application will be always on top. Never Always In minimal view In normal view Displays talking status in system tray Show talking status in tray icon This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. Show context menu in menu bar Apply some high contrast optimizations for visually impaired users Optimize for high contrast Application Adds user and channel context menus into the menu bar Tray Icon Channel Tree &Browse... Use selected item as the chat bar target Filter automatically hides empty channels MainWindow Root Push-to-Talk Global Shortcut Push and hold this button to send voice. Global Shortcut This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut Reset Audio Processor Global Shortcut Unlink Plugin Global Shortcut Push-to-Mute Global Shortcut Join Channel Global Shortcut Toggle Overlay Global Shortcut Toggle state of in-game overlay. Global Shortcut Toggle Minimal Global Shortcut Volume Up (+10%) Global Shortcut Volume Down (-10%) Global Shortcut Mumble Mumble -- %1 &Window Minimize Ctrl+M Close Mumble is currently connected to a server. Do you want to Close or Minimize it? Mute Self Global Shortcut Set self-mute status. Global Shortcut This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut Deafen Self Global Shortcut Set self-deafen status. Global Shortcut This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut Whisper/Shout Whisper <center>Not connected</center> Not connected Clear Opening URL %1 File does not exist File is not a configuration file. Settings merged from file. URL scheme is not 'mumble' This version of Mumble can't handle URLs for Mumble version %1.%2.%3 Connecting to %1 Enter username Connecting to server %1. Reconnecting. <p>No build information or OS version available.</p> <p>%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> Register yourself as %1 <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> Register user %1 <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> Kicking user %1 Banning user %1 View comment on user %1 Message to channel %1 Connected. Server presented a certificate which failed verification. SSL Version mismatch <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>Type message to user '%1' here</center> Type message to user '%1' here Choose image file Failed to load image Could not open file for reading. Image format not recognized. Voice channel is sent over control channel. &User &Channel Use in conjunction with Whisper to. Global Shortcut This will switch the states of the in-game overlay. Global Shortcut Link Channel Global Shortcut Cycle Transmit Mode Global Shortcut Cancel Change your comment <h2>Version</h2><p>Protocol %1.</p> <h2>Control channel</h2><p>Encrypted with %1 bit %2<br />%3 ms average latency (%4 deviation)</p><p>Remote host %5 (port %6)</p> UDP Statistics To Server From Server Good Late Lost Resync <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> Mumble Server Information &View Certificate Enter reason Sending message to %1 To %1: %2 Message to %1 Are you sure you want to reset the comment of user %1? Are you sure you want to reset the avatar of user %1? Are you sure you want to delete %1 and all its sub-channels? Sending message to channel %1 Message to tree %1 To %1 (Tree): %2 (Tree) %1: %2 Unmuted and undeafened. Unmuted. Muted. Muted and deafened. Deafened. Undeafened. About Qt Cycled Transmit Mode to %1 SSL Verification failed: %1 <b>WARNING:</b> The server presented a certificate that was different from the stored one. <p>%1.<br />The specific errors with this certificate are: </p><ol>%2</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. Server connection failed: %1. Disconnected from server. Invalid username You connected with an invalid username, please try another one. Username in use That username is already in use, please try another username. Wrong certificate or password Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. Wrong password Wrong server password for unregistered user account, please try again. Images (*.png *.jpg *.jpeg) C&onfigure &Help Log This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. &Quit Mumble Closes the program Exits the application. Ctrl+Q &Connect Open the server connection dialog &Disconnect Disconnect from server Disconnects you from the server. &Information Show information about the server connection This will show extended information about the connection to the server. &Kick &Mute &Ban &Deafen &Local Mute Send a Text Message Sends a text message to another user. &Add Add new channel This adds a new sub-channel to the currently selected channel. &Remove Remove channel This removes a channel and all sub-channels. Edit Groups and ACL for channel This opens the Group and ACL dialog for the channel, to control permissions. &Link Link your channel to another channel This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. Chatbar Shows a dialog of registered servers, and also allows quick-connect. Kick user (with reason) Kick selected user off server. You'll be asked to specify a reason. Mute user Mute or unmute user on server. Unmuting a deafened user will also undeafen them. Kick and ban user (with reason) Kick and ban selected user from server. You'll be asked to specify a reason. Deafen user Deafen or undeafen user on server. Deafening a user will also mute them. Mute user locally Mute or unmute user locally. Use this on other users in the same room. &Edit This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. &Unlink Channel Unlink your channel from another channel This unlinks your current channel from the selected channel. Unlinks your channel from all linked channels. This unlinks your current channel (not the selected one) from all linked channels. &Reset Reset audio preprocessor This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. &Mute Self Mute yourself Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. &Deafen Self Deafen yourself Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. &Text-To-Speech Toggle Text-To-Speech Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. Display audio statistics Pops up a small dialog with information about your current audio input. Forcibly unlink plugin This forces the current plugin to unlink, which is handy if it is reading completely wrong data. &Settings Configure Mumble Allows you to change most settings for Mumble. &Audio Wizard Start the audio configuration wizard This will guide you through the process of configuring your audio hardware. &What's This? Enter What's This? mode Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. &About Information about Mumble Shows a small dialog with information and license for Mumble. About &Speex Information about Speex Shows a small dialog with information about Speex. About &Qt Information about Qt Shows a small dialog with information about Qt. Check for &Updates Check for new version of Mumble Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. Sends a text message to all users in a channel. &Change Comment Configure certificates for strong authentication This starts the wizard for creating, importing and exporting certificates for authentication against servers. Register user on server This will permanently register the user on the server. Add &Friend Adds a user as your friend. This will add the user as a friend, so you can recognize him on this and other servers. &Remove Friend Removes a user from your friends. This will remove a user from your friends list. &Update Friend Update name of your friend. Your friend uses a different name than what is in your database. This will update the name. Registered &Users Edit registered users list This opens the editor for registered users, which allow you to change their name or unregister them. &Access Tokens Add or remove text-based access tokens &Minimal View Toggle minimal window modes This will toggle minimal mode, where the log window and menu is hidden. You muted and deafened %1. You unmuted and undeafened %1. You undeafened %1. You suppressed %1. %1 muted and deafened by %2. %1 unmuted and undeafened by %2. %1 undeafened by %2. %1 suppressed by %2. %1 moved to %2. %1 moved to %2 by %3. %1 moved in from %2 by %3. %1 is now muted and deafened. Your account information can not be verified currently. Please try again later Welcome message: %1 Mumble: %1 You were denied %1 privileges in %2. %3 was denied %1 privileges in %2. Denied: Cannot modify SuperUser. Denied: Invalid channel name. Denied: Text message too long. Denied: Operation not permitted in temporary channel. You need a certificate to perform this operation. %1 does not have a certificate. Invalid username: %1. Invalid username. Channel is full. Channel nesting limit reached. Permission denied. %1 connected. %1 is now muted. %1 is now unmuted. Recording started Recording stopped %1 started recording. %1 stopped recording. You revoked your priority speaker status. You assumed priority speaker status. %1 revoked your priority speaker status. %1 gave you priority speaker status. You revoked priority speaker status for %1. You gave priority speaker status to %1. %1 revoked own priority speaker status. %1 assumed priority speaker status. %1 revoked priority speaker status for %2. %1 gave priority speaker status to %2. You were unmuted and undeafened by %1. You were muted by %1. You were undeafened by %1. You were suppressed. You were suppressed by %1. You were unsuppressed. You were unsuppressed by %1. You moved %1 to %2. %1 is recording %1 renamed to %2 %1 left channel. %1 disconnected. Server message from (Tree) (Channel) %2%1: %3 The server requests minimum client version %1 The server requests positional audio be enabled. The server requests positional audio be disabled. The server requests Push-to-Talk be enabled. The server requests Push-to-Talk be disabled. You were unmuted by %1. You muted %1. You unsuppressed %1. You unmuted %1. %1 muted by %2. %1 unsuppressed by %2. %1 unmuted by %2. Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. You were muted and deafened by %1. You were deafened by %1. You were kicked from the server by %1: %2. %3 was kicked from the server by %1: %2. You were kicked and banned from the server by %1: %2. %3 was kicked and banned from the server by %1: %2. You were moved to %1 by %2. %1 entered channel. Server connection rejected: %1. Denied: %1. Message from %1 You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. Unknown Channel Drag mode in UserModel::dropMimeData. Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) Invocation Welcome to Mumble. Skipping version check in debug mode. Hide Frame Toggle showing frame on minimal window This will toggle whether the minimal window should have a frame for moving and resizing. Send &Message &Unlink All &Certificate Wizard &Register Reset &Comment Reset the comment of the selected user. &Join Channel View Comment View comment in editor Query server for connection information for user S&erver &Self Audio S&tatistics &Unlink Plugins R&egister Register yourself on the server Change &Avatar Change your avatar image on this server &Remove Avatar Remove currently defined avatar image. Icon Toolbar Change your own comment Recording Priority Speaker &Copy URL Copies a link to this channel to the clipboard. Ignore Messages Locally ignore user's text chat messages. Silently drops all text messages from the user. &Ban list Edit ban list on server This lets you edit the server-side IP ban list. &Filter on/off Toggle the channel filter (Ctrl+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. Ctrl+F &Hide Channel when Filtering Reset &Avatar Reset the avatar of the selected user. NetworkConfig Network Updates are mandatory when using snapshot releases. Connection Use TCP compatibility mode Use TCP compatability mode <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). Reconnect when disconnected <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. Reconnect automatically Proxy Type Type of proxy to connect through Direct connection HTTP(S) proxy SOCKS5 proxy Hostname Hostname of the proxy Force TCP mode Enable QoS to prioritize packets This will enable QoS, which will attempt to prioritize voice packets over other traffic. Use Quality of Service Don't send certificate to server and don't save passwords. (Not saved). <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> Suppress certificate and password storage <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. Port Port number of the proxy <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. Username Username for proxy authentication <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Password Password for proxy authentication <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Misc Prevent log from downloading images <b>Disable image download</b><br/> Prevents the client from downloading images embedded into chat messages with the img tag. Disable image download Mumble services Check for new releases of Mumble automatically. This will check for new releases of Mumble every time you start the program, and notify you if one is available. Check for application updates on startup Check for new releases of plugins automatically. This will check for new releases of plugins every time you start the program, and download them automatically. <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. Submit anonymous statistics to the Mumble project Submit anonymous statistics Reconnect to last used server when starting Mumble Reconnect to last server on startup Download plugin and overlay updates on startup Overlay Silent Talking Whisper Shout Channel Failed to create communication with overlay at %2: %1. No overlay will be available. OverlayClient Filter Only talking Talking and recently active All in current channel All in linked channels Always show yourself Configure recently active time (%1 seconds)... Columns Sort Alphabetically Last state change Edit... Reset Zoom Configure recently active time Amount of seconds users remain active after talking: OverlayConfig To move the users, drag the little red dot. To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. For more options, right click a user. For more options, rightclick a user. Overlay Choose executable Choose application Load Overlay Presets Mumble overlay presets (*.mumblelay) Save Overlay Presets Options Enable overlay. Enable Overlay This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. Layout Overlay exceptions Blacklist Whitelist Uninstall Overlay Overlay Installation Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. Install Mumble Overlay Overlay Upgrade Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. Upgrade Mumble Overlay Display a frame counter in the overlay Show FPS counter Load an overlay preset from file Load… Save your overlay settings to file Save… Set the overlay font. Set the overlay text color. Color Add... Remove Font To list exceptions, use a Show the overlay in all applicable programs except Show the overlay only in FPS and Clock Display Display a clock in the overlay showing the current local time (system time). Show Clock OverlayEditor State User is not talking Passive User is talking in your channel or a linked channel Talking User is whispering to you privately Private Whisper User is shouting to your channel Channel Whisper Zoom Zoom Factor Enabled Elements User avatar, chosen by each user Avatar User's name Username Name of user's channel, if outside your current channel Channel Muted or deafened Mute state Bounding box, automatically shrunk to minimum size to contain all visible elements Bounding box Overlay Editor OverlayEditorScene Layout preset Large square avatar Avatar and Name User Opacity %1% Object Opacity Alignment Left Center Right Top Bottom Color... Font... Bounding box Pen width Padding Pen color Fill color Pick pen color Pick fill color Pick color Pick font PluginConfig Plugins Plugin has no configure function. Plugin has no about function. Form Options Enable plugins and transmit positional information This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. Link to Game and Transmit Position Reloads all plugins This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. &Reload plugins Information about plugin This shows a small information message about the plugin. &About Show configuration page of plugin This shows the configuration page of the plugin, if any. &Configure Name Enabled Plugins Skipping plugin update in debug mode. Downloaded new or updated plugin to %1. Failed to install new plugin to %1. %1 lost link. %1 linked. PortAudioSystem Default Device PulseAudioSystem Default Input Default Output RichTextEditor Failed to load image Image file too large to embed in document. Please use images smaller than %1 kB. Message is too long. Display Source Text &Bold Ctrl+B &Italic Italic Ctrl+I Underline Ctrl+U Color Insert Link Ctrl+L Insert Image RichTextEditorLink Add Link URL Text ServerHandler UDP packets cannot be sent to or received from the server. Switching to TCP mode. UDP packets cannot be sent to the server. Switching to TCP mode. UDP packets cannot be received from the server. Switching to TCP mode. UDP packets can be sent to and received from the server. Switching back to UDP mode. Connection timed out ServerView Favorite LAN Public Internet Africa Asia North America South America Europe Oceania ShortcutActionWidget Unassigned ShortcutDelegate On Off Toggle Unassigned ShortcutKeyWidget Press Shortcut ShortcutTargetDialog Root Parent Current Subchannel #%1 ShortcutTargetWidget ... , Root Parent Current Subchannel #%1 Invalid Empty <Empty> ShortcutToggleWidget Off Toggle On TextMessage Enter text If checked the message is recursively sent to all subchannels Send recursively to subchannels Tokens Empty Token Mumble - Access Tokens List of access tokens on current server <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. Add a token &Add Remove a token &Remove UserEdit Registered Users Remove Rename Who are you looking for? Days Weeks Months Years Inactive for Registered users: %n account(s) UserInformation User Information Connection Information Version OS Certificate IP Address CELT Versions Details... Ping Statistics Pings received Average ping TCP (Control) UDP (Voice) UDP Network statistics Good Late Lost Resync From Client To Client Connection time %1w %1d %1h %1m %1s , %1 (%2) %1.%2.%3 (%4) Supported Not Supported Not Reported %1 online (%2 idle) %1 online %1 kbit/s Bandwidth GroupBox Bandwidth Label Ping deviation UserListModel Nick Inactive days Last channel Last seen: %1 Never Channel id: %1 UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: Talking to your channel. Shouting directly to your channel. Whispering directly to your channel. Whispering directly to you. Not talking. This is a channel on the server. The icon indicates the state of the channel: Your current channel. A channel that is linked with your channel. Linked channels can talk to each other. A channel on the server that you are not linked to. This shows the flags the user has on the server, if any: On your friend list Authenticated user Muted (manually muted by self) Muted (manually muted by admin) Muted (not allowed to speak in current channel) Muted (muted by you, only on your machine) Deafened (by self) Deafened (by admin) User has a new comment set (click to show) User has a comment set, which you've already seen. (click to show) Ignoring Text Messages This shows the flags the channel has, if any: Channel has a new comment set (click to show) Channel has a comment set, which you've already seen. (click to show) Channel will be hidden when filtering is enabled Name Flags Are you sure you want to drag this channel? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. VersionCheck Upgrade Mumble A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? Failed to launch snapshot installer. Corrupt download of new version detected. Automatically removed. Downloading new snapshot from %1 to %2 Failed to write new version to disk. Failed to write new version to disc. Mumble failed to retrieve version information from the central server. ViewCert Certificate Chain Details Certificate chain %1 %2 Certificate details Common Name: %1 Organization: %1 Subunit: %1 Country: %1 Locality: %1 State: %1 Valid from: %1 Valid to: %1 Serial: %1 Public Key: %1 bits %2 RSA DSA Digest (SHA-1): %1 Email: %1 DNS: %1 Issued by: Unit Name: %1 VoiceRecorder Recorder failed to create directory '%1' Recorder failed to open file '%1' .wav - Uncompressed .ogg (Vorbis) - Compressed .au - Uncompressed .flac - Lossless compressed VoiceRecorderDialog Recorder Control 00:00:00 &Start S&top Mode Multichannel Output Output format Target directory Filename &Browse... Valid variables are: Inserts the user's name Inserts the current date Inserts the current time Inserts the hostname Recorder still running Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? Unable to start recording. Not connected to a server. The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. There is already a recorder active for this server. Please select a recording format. Stopping Select target directory Downmix WASAPISystem Default Device qwPTTButtonWidget Mumble PTT Push to talk mumble-1.3.4/src/mumble/AudioOutputSample.h0000664000175000017500000000363214010707273020512 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_AUDIOOUTPUTSAMPLE_H_ #define MUMBLE_MUMBLE_AUDIOOUTPUTSAMPLE_H_ #include #include #include #include #include "AudioOutputUser.h" class SoundFile : public QObject { private: Q_OBJECT Q_DISABLE_COPY(SoundFile) protected: SNDFILE *sfFile; SF_INFO siInfo; QFile qfFile; static sf_count_t vio_get_filelen(void *user_data); static sf_count_t vio_seek(sf_count_t offset, int whence, void *user_data); static sf_count_t vio_read(void *ptr, sf_count_t count, void *user_data); static sf_count_t vio_write(const void *ptr, sf_count_t count, void *user_data); static sf_count_t vio_tell(void *user_data); public: SoundFile(const QString &fname); ~SoundFile(); int channels() const; int samplerate() const; int error() const ; QString strError() const; bool isOpen() const; sf_count_t seek(sf_count_t frames, int whence); sf_count_t read(float *ptr, sf_count_t items); }; class AudioOutputSample : public AudioOutputUser { private: Q_OBJECT Q_DISABLE_COPY(AudioOutputSample) protected: unsigned int iLastConsume; unsigned int iBufferFilled; unsigned int iOutSampleRate; SpeexResamplerState *srs; SoundFile *sfHandle; bool bLoop; bool bEof; signals: void playbackFinished(); public: static SoundFile* loadSndfile(const QString &filename); static QString browseForSndfile(QString defaultpath=QString()); virtual bool needSamples(unsigned int snum) Q_DECL_OVERRIDE; AudioOutputSample(const QString &name, SoundFile *psndfile, bool repeat, unsigned int freq); ~AudioOutputSample() Q_DECL_OVERRIDE; }; #endif // AUDIOOUTPUTSAMPLE_H_ mumble-1.3.4/src/mumble/MainWindow.h0000664000175000017500000002423514010707273017144 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_MAINWINDOW_H_ #define MUMBLE_MUMBLE_MAINWINDOW_H_ #include #if QT_VERSION >= 0x050000 # include # include # include #else # include # include # include #endif #include #include "CustomElements.h" #include "Message.h" #include "Mumble.pb.h" #include "Usage.h" #include "UserLocalVolumeDialog.h" #include "MUComboBox.h" #include "ui_MainWindow.h" #define MB_QEVENT (QEvent::User + 939) #define OU_QEVENT (QEvent::User + 940) class ACLEditor; class BanEditor; class UserEdit; class ServerHandler; class GlobalShortcut; class TextToSpeech; class UserModel; class Tokens; class Channel; class UserInformation; class VoiceRecorderDialog; class PTTButtonWidget; struct ShortcutTarget; class MessageBoxEvent : public QEvent { public: QString msg; MessageBoxEvent(QString msg); }; class OpenURLEvent : public QEvent { public: QUrl url; OpenURLEvent(QUrl url); }; class MainWindow : public QMainWindow, public MessageHandler, public Ui::MainWindow { friend class UserModel; private: Q_OBJECT Q_DISABLE_COPY(MainWindow) public: UserModel *pmModel; QSystemTrayIcon *qstiIcon; QMenu *qmUser; QMenu *qmChannel; QMenu *qmDeveloper; QMenu *qmTray; QIcon qiIcon, qiIconMutePushToMute, qiIconMuteSelf, qiIconMuteServer, qiIconDeafSelf, qiIconDeafServer, qiIconMuteSuppressed; QIcon qiTalkingOn, qiTalkingWhisper, qiTalkingShout, qiTalkingOff; QMap qmUserVolTracker; GlobalShortcut *gsPushTalk, *gsResetAudio, *gsMuteSelf, *gsDeafSelf; GlobalShortcut *gsUnlink, *gsPushMute, *gsJoinChannel, *gsToggleOverlay; GlobalShortcut *gsMinimal, *gsVolumeUp, *gsVolumeDown, *gsWhisper, *gsLinkChannel; GlobalShortcut *gsCycleTransmitMode, *gsTransmitModePushToTalk, *gsTransmitModeContinuous, *gsTransmitModeVAD; GlobalShortcut *gsSendTextMessage, *gsSendClipboardTextMessage; DockTitleBar *dtbLogDockTitle, *dtbChatDockTitle; ACLEditor *aclEdit; BanEditor *banEdit; UserEdit *userEdit; Tokens *tokenEdit; VoiceRecorderDialog *voiceRecorderDialog; MumbleProto::Reject_RejectType rtLast; bool bRetryServer; QString qsDesiredChannel; bool bSuppressAskOnQuit; /// Restart the client after shutdown bool restartOnQuit; bool bAutoUnmute; /// Contains the cursor whose position is immediately before the image to /// save when activating the "Save Image As..." context menu item. QTextCursor qtcSaveImageCursor; #if QT_VERSION >= 0x050000 QPointer cContextChannel; QPointer cuContextUser; #else QWeakPointer cContextChannel; QWeakPointer cuContextUser; #endif QPoint qpContextPosition; void recheckTTS(); void msgBox(QString msg); void setOnTop(bool top); void setShowDockTitleBars(bool doShow); void updateTrayIcon(); void updateUserModel(); void focusNextMainWidget(); void updateTransmitModeComboBox(); QPair openImageFile(); void updateChatBar(); void openTextMessageDialog(ClientUser *p); void openUserLocalVolumeDialog(ClientUser *p); #ifdef Q_OS_WIN #if QT_VERSION >= 0x050000 bool nativeEvent(const QByteArray &eventType, void *message, long *result) Q_DECL_OVERRIDE; #else bool winEvent(MSG *, long *) Q_DECL_OVERRIDE; #endif unsigned int uiNewHardware; #endif protected: Usage uUsage; QTimer *qtReconnect; QList qlServerActions; QList qlChannelActions; QList qlUserActions; QHash qmCurrentTargets; QHash, int> qmTargets; QMap qmTargetUse; Channel *mapChannel(int idx) const; int iTargetCounter; QMap qmUserInformations; PTTButtonWidget *qwPTTButtonWidget; MUComboBox *qcbTransmitMode; QAction *qaTransmitMode; QAction *qaTransmitModeSeparator; void createActions(); void setupGui(); void updateWindowTitle(); /// updateToolbar updates the state of the toolbar depending on the current /// window layout setting. /// If the window layout setting is 'custom', the toolbar is made movable. If the /// window layout is not 'custom', the toolbar is locked in place at the top of /// the MainWindow. void updateToolbar(); void customEvent(QEvent *evt) Q_DECL_OVERRIDE; void findDesiredChannel(); void setupView(bool toggle_minimize = true); void closeEvent(QCloseEvent *e) Q_DECL_OVERRIDE; void hideEvent(QHideEvent *e) Q_DECL_OVERRIDE; void showEvent(QShowEvent *e) Q_DECL_OVERRIDE; void changeEvent(QEvent* e) Q_DECL_OVERRIDE; void keyPressEvent(QKeyEvent *e) Q_DECL_OVERRIDE; QMenu *createPopupMenu() Q_DECL_OVERRIDE; bool handleSpecialContextMenu(const QUrl &url, const QPoint &pos_, bool focus = false); Channel* getContextMenuChannel(); ClientUser* getContextMenuUser(); public slots: void on_qmServer_aboutToShow(); void on_qaServerConnect_triggered(bool autoconnect = false); void on_qaServerDisconnect_triggered(); void on_qaServerBanList_triggered(); void on_qaServerUserList_triggered(); void on_qaServerInformation_triggered(); void on_qaServerTexture_triggered(); void on_qaServerTextureRemove_triggered(); void on_qaServerTokens_triggered(); void on_qmSelf_aboutToShow(); void on_qaSelfComment_triggered(); void on_qaSelfRegister_triggered(); void qcbTransmitMode_activated(int index); void qmUser_aboutToShow(); void on_qaUserCommentReset_triggered(); void on_qaUserTextureReset_triggered(); void on_qaUserCommentView_triggered(); void on_qaUserKick_triggered(); void on_qaUserBan_triggered(); void on_qaUserMute_triggered(); void on_qaUserDeaf_triggered(); void on_qaSelfPrioritySpeaker_triggered(); void on_qaUserPrioritySpeaker_triggered(); void on_qaUserLocalIgnore_triggered(); void on_qaUserLocalMute_triggered(); void on_qaUserLocalVolume_triggered(); void on_qaUserTextMessage_triggered(); void on_qaUserRegister_triggered(); void on_qaUserInformation_triggered(); void on_qaUserFriendAdd_triggered(); void on_qaUserFriendRemove_triggered(); void on_qaUserFriendUpdate_triggered(); void qmChannel_aboutToShow(); void on_qaChannelJoin_triggered(); void on_qaChannelAdd_triggered(); void on_qaChannelRemove_triggered(); void on_qaChannelACL_triggered(); void on_qaChannelLink_triggered(); void on_qaChannelUnlink_triggered(); void on_qaChannelUnlinkAll_triggered(); void on_qaChannelSendMessage_triggered(); void on_qaChannelFilter_triggered(); void on_qaChannelCopyURL_triggered(); void on_qaAudioReset_triggered(); void on_qaAudioMute_triggered(); void on_qaAudioDeaf_triggered(); void on_qaRecording_triggered(); void on_qaAudioTTS_triggered(); void on_qaAudioUnlink_triggered(); void on_qaAudioStats_triggered(); void on_qaConfigDialog_triggered(); void on_qaConfigHideFrame_triggered(); void on_qmConfig_aboutToShow(); void on_qaConfigMinimal_triggered(); void on_qaConfigCert_triggered(); void on_qaAudioWizard_triggered(); void on_qaDeveloperConsole_triggered(); void on_qaHelpWhatsThis_triggered(); void on_qaHelpAbout_triggered(); void on_qaHelpAboutQt_triggered(); void on_qaHelpVersionCheck_triggered(); void on_qaQuit_triggered(); void on_qaHide_triggered(); void on_qteChat_tabPressed(); void on_qteChat_backtabPressed(); void on_qteChat_ctrlSpacePressed(); void on_qtvUsers_customContextMenuRequested(const QPoint &mpos); void on_qteLog_customContextMenuRequested(const QPoint &pos); void on_qteLog_anchorClicked(const QUrl &); void on_qteLog_highlighted(const QUrl & link); void on_PushToTalk_triggered(bool, QVariant); void on_PushToMute_triggered(bool, QVariant); void on_VolumeUp_triggered(bool, QVariant); void on_VolumeDown_triggered(bool, QVariant); void on_gsMuteSelf_down(QVariant); void on_gsDeafSelf_down(QVariant); void on_gsWhisper_triggered(bool, QVariant); void addTarget(ShortcutTarget *); void removeTarget(ShortcutTarget *); void on_gsCycleTransmitMode_triggered(bool, QVariant); void on_gsTransmitModePushToTalk_triggered(bool, QVariant); void on_gsTransmitModeContinuous_triggered(bool, QVariant); void on_gsTransmitModeVAD_triggered(bool, QVariant); void on_gsSendTextMessage_triggered(bool, QVariant); void on_gsSendClipboardTextMessage_triggered(bool, QVariant); void on_Reconnect_timeout(); void on_Icon_activated(QSystemTrayIcon::ActivationReason); void voiceRecorderDialog_finished(int); void qtvUserCurrentChanged(const QModelIndex &, const QModelIndex &); void serverConnected(); void serverDisconnected(QAbstractSocket::SocketError, QString reason); void resolverError(QAbstractSocket::SocketError, QString reason); void viewCertificate(bool); void openUrl(const QUrl &url); void context_triggered(); void updateTarget(); void updateMenuPermissions(); /// Handles state changes like talking mode changes and mute/unmute /// or priority speaker flag changes for the gui user void userStateChanged(); void destroyUserInformation(); void trayAboutToShow(); void sendChatbarMessage(QString msg); void pttReleased(); void whisperReleased(QVariant scdata); void onResetAudio(); void showRaiseWindow(); void on_qaFilterToggle_triggered(); /// Opens a save dialog for the image referenced by qtcSaveImageCursor. void saveImageAs(); /// Returns the path to the user's image directory, optionally with a /// filename included. QString getImagePath(QString filename = QString()) const; /// Updates the user's image directory to the given path (any included /// filename is discarded). void updateImagePath(QString filepath) const; public: MainWindow(QWidget *parent); ~MainWindow() Q_DECL_OVERRIDE; // From msgHandler. Implementation in Messages.cpp #define MUMBLE_MH_MSG(x) void msg##x(const MumbleProto:: x &); MUMBLE_MH_ALL #undef MUMBLE_MH_MSG void removeContextAction(const MumbleProto::ContextActionModify &msg); }; #endif mumble-1.3.4/src/mumble/MumbleApplication.cpp0000664000175000017500000000567314010707273021035 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "MumbleApplication.h" #include "MainWindow.h" #include "GlobalShortcut.h" #include "Global.h" #include "EnvUtils.h" #if defined(Q_OS_WIN) # include "GlobalShortcut_win.h" #endif MumbleApplication *MumbleApplication::instance() { return static_cast(QCoreApplication::instance()); } MumbleApplication::MumbleApplication(int &pargc, char **pargv) : QApplication(pargc, pargv) { connect(this, SIGNAL(commitDataRequest(QSessionManager&)), SLOT(onCommitDataRequest(QSessionManager&)), Qt::DirectConnection); } QString MumbleApplication::applicationVersionRootPath() { QString versionRoot = EnvUtils::getenv(QLatin1String("MUMBLE_VERSION_ROOT")); if (versionRoot.count() > 0) { return versionRoot; } return this->applicationDirPath(); } void MumbleApplication::onCommitDataRequest(QSessionManager &) { // Make sure the config is saved and supress the ask on quit message if (g.mw) { g.s.save(); g.mw->bSuppressAskOnQuit = true; qWarning() << "Session likely ending. Suppressing ask on quit"; } } bool MumbleApplication::event(QEvent *e) { if (e->type() == QEvent::FileOpen) { QFileOpenEvent *foe = static_cast(e); if (! g.mw) { this->quLaunchURL = foe->url(); } else { g.mw->openUrl(foe->url()); } return true; } return QApplication::event(e); } #ifdef Q_OS_WIN /// gswForward forwards a native Windows keyboard/mouse message /// into GlobalShortcutWin's event stream. /// /// @return Returns true if the forwarded event was suppressed /// by GlobalShortcutWin. Otherwise, returns false. static bool gswForward(MSG *msg) { GlobalShortcutWin *gsw = static_cast(GlobalShortcutEngine::engine); if (gsw == NULL) { return false; } switch (msg->message) { case WM_LBUTTONDOWN: case WM_LBUTTONUP: case WM_RBUTTONDOWN: case WM_RBUTTONUP: case WM_MBUTTONDOWN: case WM_MBUTTONUP: case WM_XBUTTONDOWN: case WM_XBUTTONUP: return gsw->injectMouseMessage(msg); case WM_KEYDOWN: case WM_KEYUP: case WM_SYSKEYDOWN: case WM_SYSKEYUP: return gsw->injectKeyboardMessage(msg); } return false; } # if QT_VERSION >= 0x050000 bool MumbleApplication::nativeEventFilter(const QByteArray &, void *message, long *) { MSG *msg = reinterpret_cast(message); if (QThread::currentThread() == thread()) { bool suppress = gswForward(msg); if (suppress) { return true; } } return false; } # else bool MumbleApplication::winEventFilter(MSG *msg, long *result) { if (QThread::currentThread() == thread()) { bool suppress = gswForward(msg); if (suppress) { return true; } } return QApplication::winEventFilter(msg, result); } # endif #endif mumble-1.3.4/src/mumble/OverlayUser.cpp0000664000175000017500000002035314010707273017700 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "OverlayUser.h" #include "OverlayText.h" #include "User.h" #include "Channel.h" #include "ClientUser.h" #include "Message.h" #include "Database.h" #include "NetworkConfig.h" #include "ServerHandler.h" #include "MainWindow.h" #include "GlobalShortcut.h" // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" OverlayUser::OverlayUser(ClientUser *cu, unsigned int height, OverlaySettings *osptr) : OverlayGroup(), os(osptr), uiSize(height), cuUser(cu), tsColor(Settings::Passive) { setup(); updateLayout(); } OverlayUser::OverlayUser(Settings::TalkState ts, unsigned int height, OverlaySettings *osptr) : OverlayGroup(), os(osptr), uiSize(height), cuUser(NULL), tsColor(ts) { qsChannelName = Overlay::tr("Channel"); setup(); updateLayout(); } int OverlayUser::type() const { return Type; } void OverlayUser::setup() { qgpiMuted = new QGraphicsPixmapItem(this); qgpiMuted->hide(); qgpiDeafened = new QGraphicsPixmapItem(this); qgpiDeafened->hide(); qgpiAvatar = new QGraphicsPixmapItem(this); for (int i=0;i<4;++i) { qgpiName[i] = new QGraphicsPixmapItem(this); qgpiName[i]->hide(); } qgpiChannel = new QGraphicsPixmapItem(this); qgpiChannel->hide(); qgpiBox = new QGraphicsPathItem(this); qgpiBox->hide(); } #undef SCALESIZE #define SCALESIZE(var) iroundf(uiSize * os->fZoom * os->qrf##var .width() + 0.5f), iroundf(uiSize * os->fZoom * os->qrf##var .height() + 0.5f) void OverlayUser::updateLayout() { QPixmap pm; if (scene()) uiSize = iroundf(scene()->sceneRect().height() + 0.5); prepareGeometryChange(); for (int i=0;i<4;++i) qgpiName[i]->setPixmap(pm); qgpiAvatar->setPixmap(pm); qgpiChannel->setPixmap(pm); { QImageReader qir(QLatin1String("skin:muted_self.svg")); QSize sz = qir.size(); sz.scale(SCALESIZE(MutedDeafened), Qt::KeepAspectRatio); qir.setScaledSize(sz); qgpiMuted->setPixmap(QPixmap::fromImage(qir.read())); } { QImageReader qir(QLatin1String("skin:deafened_self.svg")); QSize sz = qir.size(); sz.scale(SCALESIZE(MutedDeafened), Qt::KeepAspectRatio); qir.setScaledSize(sz); qgpiDeafened->setPixmap(QPixmap::fromImage(qir.read())); } qgpiMuted->setPos(alignedPosition(scaledRect(os->qrfMutedDeafened, uiSize * os->fZoom), qgpiMuted->boundingRect(), os->qaMutedDeafened)); qgpiMuted->setZValue(1.0f); qgpiMuted->setOpacity(os->fMutedDeafened); qgpiDeafened->setPos(alignedPosition(scaledRect(os->qrfMutedDeafened, uiSize * os->fZoom), qgpiDeafened->boundingRect(), os->qaMutedDeafened)); qgpiDeafened->setZValue(1.0f); qgpiDeafened->setOpacity(os->fMutedDeafened); qgpiAvatar->setPos(0.0f, 0.0f); qgpiAvatar->setOpacity(os->fAvatar); for (int i=0;i<4;++i) { qgpiName[i]->setPos(0.0f, 0.0f); qgpiName[i]->setZValue(2.0f); qgpiName[i]->setOpacity(os->fUserName); } qgpiChannel->setPos(0.0f, 0.0f); qgpiChannel->setZValue(3.0f); qgpiChannel->setOpacity(os->fChannel); QRectF childrenBounds = os->qrfAvatar | os->qrfChannel | os->qrfMutedDeafened | os->qrfUserName; bool haspen = (os->qcBoxPen != os->qcBoxFill) && (! qFuzzyCompare(os->qcBoxPen.alphaF(), static_cast(0.0f))); qreal pw = haspen ? qMax(1.0f, os->fBoxPenWidth * uiSize * os->fZoom) : 0.0f; qreal pad = os->fBoxPad * uiSize * os->fZoom; QPainterPath pp; pp.addRoundedRect(childrenBounds.x() * uiSize * os->fZoom + -pw / 2.0f - pad, childrenBounds.y() * uiSize * os->fZoom + -pw / 2.0f - pad, childrenBounds.width() * uiSize * os->fZoom + pw + 2.0f * pad, childrenBounds.height() * uiSize * os->fZoom + pw + 2.0f * pad, 2.0f * pw, 2.0f * pw); qgpiBox->setPath(pp); qgpiBox->setPos(0.0f, 0.0f); qgpiBox->setZValue(-1.0f); qgpiBox->setPen(haspen ? QPen(os->qcBoxPen, pw) : Qt::NoPen); qgpiBox->setBrush(qFuzzyCompare(os->qcBoxFill.alphaF(), static_cast(0.0f)) ? Qt::NoBrush : os->qcBoxFill); qgpiBox->setOpacity(1.0f); if (! cuUser) { switch (tsColor) { case Settings::Passive: qsName = Overlay::tr("Silent"); break; case Settings::Talking: qsName = Overlay::tr("Talking"); break; case Settings::Whispering: qsName = Overlay::tr("Whisper"); break; case Settings::Shouting: qsName = Overlay::tr("Shout"); break; } } } void OverlayUser::updateUser() { if (os->bUserName && (qgpiName[0]->pixmap().isNull() || (cuUser && (qsName != cuUser->qsName)))) { if (cuUser) qsName = cuUser->qsName; OverlayTextLine tl(qsName, os->qfUserName); for (int i=0; i<4; ++i) { const QPixmap &pm = tl.createPixmap(SCALESIZE(UserName), os->qcUserName[i]); qgpiName[i]->setPixmap(pm); if (i == 0) qgpiName[0]->setPos(alignedPosition(scaledRect(os->qrfUserName, uiSize * os->fZoom), qgpiName[0]->boundingRect(), os->qaUserName)); else qgpiName[i]->setPos(qgpiName[0]->pos()); } } if (os->bChannel && (qgpiChannel->pixmap().isNull() || (cuUser && (qsChannelName != cuUser->cChannel->qsName)))) { if (cuUser) qsChannelName = cuUser->cChannel->qsName; const QPixmap &pm = OverlayTextLine(qsChannelName, os->qfChannel).createPixmap(SCALESIZE(Channel), os->qcChannel); qgpiChannel->setPixmap(pm); qgpiChannel->setPos(alignedPosition(scaledRect(os->qrfChannel, uiSize * os->fZoom), qgpiChannel->boundingRect(), os->qaChannel)); } if (os->bAvatar && (qgpiAvatar->pixmap().isNull() || (cuUser && (qbaAvatar != cuUser->qbaTextureHash)))) { if (cuUser) qbaAvatar = cuUser->qbaTextureHash; QImage img; if (! qbaAvatar.isNull() && cuUser->qbaTexture.isEmpty()) { g.o->requestTexture(cuUser); } else if (qbaAvatar.isNull()) { QImageReader qir(QLatin1String("skin:default_avatar.svg")); QSize sz = qir.size(); sz.scale(SCALESIZE(Avatar), Qt::KeepAspectRatio); qir.setScaledSize(sz); img = qir.read(); } else { QBuffer qb(& cuUser->qbaTexture); qb.open(QIODevice::ReadOnly); QImageReader qir(&qb, cuUser->qbaTextureFormat); QSize sz = qir.size(); sz.scale(SCALESIZE(Avatar), Qt::KeepAspectRatio); qir.setScaledSize(sz); img = qir.read(); } qgpiAvatar->setPixmap(QPixmap::fromImage(img)); qgpiAvatar->setPos(alignedPosition(scaledRect(os->qrfAvatar, uiSize * os->fZoom), qgpiAvatar->boundingRect(), os->qaAvatar)); } qgpiAvatar->setVisible(os->bAvatar); if (cuUser) { ClientUser *self = ClientUser::get(g.uiSession); if (os->bMutedDeafened) { if (cuUser->bDeaf || cuUser->bSelfDeaf) { qgpiMuted->hide(); qgpiDeafened->show(); } else if (cuUser->bMute || cuUser->bSelfMute || cuUser->bLocalMute || cuUser->bSuppress) { qgpiMuted->show(); qgpiDeafened->hide(); } else { qgpiMuted->hide(); qgpiDeafened->hide(); } } else { qgpiMuted->hide(); qgpiDeafened->hide(); } bool samechannel = self && (self->cChannel == cuUser->cChannel); qgpiChannel->setVisible(os->bChannel && ! samechannel); tsColor = cuUser->tsState; } else { qgpiChannel->setVisible(os->bChannel && (tsColor != Settings::Passive) && (tsColor != Settings::Talking)); qgpiMuted->setVisible(os->bChannel); qgpiDeafened->hide(); } if (os->bUserName) for (int i=0;i<4;++i) qgpiName[i]->setVisible(i == tsColor); else for (int i=0;i<4;++i) qgpiName[i]->setVisible(false); qgpiBox->setVisible(os->bBox); setOpacity(os->fUser[tsColor]); } QRectF OverlayUser::scaledRect(const QRectF &qr, qreal scale) { return QRectF(qr.x() * scale, qr.y() * scale, qr.width() * scale, qr.height() * scale); } QPointF OverlayUser::alignedPosition(const QRectF &box, const QRectF &item, Qt::Alignment a) { qreal boxw = box.width(); qreal boxh = box.height(); qreal itemw = item.width(); qreal itemh = item.height(); qreal wdiff = boxw - itemw; qreal hdiff = boxh - itemh; qreal xofs = box.x() - item.x(); qreal yofs = box.y() - item.y(); if (a & Qt::AlignRight) xofs += wdiff; else if (a & Qt::AlignHCenter) xofs += wdiff * 0.5f; if (a & Qt::AlignBottom) yofs += hdiff; else if (a & Qt::AlignVCenter) yofs += hdiff * 0.5f; return QPointF(iroundf(xofs + 0.5f), iroundf(yofs + 0.5f)); } mumble-1.3.4/src/mumble/OSS.cpp0000664000175000017500000002022114010707273016056 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "OSS.h" #include #include #include #include #include "User.h" #include "MainWindow.h" // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" #define NBLOCKS 8 class OSSEnumerator { public: QHash qhInput; QHash qhOutput; QHash qhDevices; OSSEnumerator(); }; static OSSEnumerator *cards = NULL; class OSSInit : public DeferInit { void initialize() { cards = new OSSEnumerator(); }; void destroy() { delete cards; cards = NULL; }; }; static OSSInit ossi; class OSSInputRegistrar : public AudioInputRegistrar { public: OSSInputRegistrar(); virtual AudioInput *create(); virtual const QList getDeviceChoices(); virtual void setDeviceChoice(const QVariant &, Settings &); virtual bool canEcho(const QString &) const; }; class OSSOutputRegistrar : public AudioOutputRegistrar { public: OSSOutputRegistrar(); virtual AudioOutput *create(); virtual const QList getDeviceChoices(); virtual void setDeviceChoice(const QVariant &, Settings &); }; static OSSInputRegistrar airOSS; static OSSOutputRegistrar aorOSS; OSSInputRegistrar::OSSInputRegistrar() : AudioInputRegistrar(QLatin1String("OSS")) { } AudioInput *OSSInputRegistrar::create() { return new OSSInput(); } const QList OSSInputRegistrar::getDeviceChoices() { QList qlReturn; QStringList qlInputDevs = cards->qhInput.keys(); qSort(qlInputDevs); if (qlInputDevs.contains(g.s.qsOSSInput)) { qlInputDevs.removeAll(g.s.qsOSSInput); qlInputDevs.prepend(g.s.qsOSSInput); } foreach(const QString &dev, qlInputDevs) { qlReturn << audioDevice(cards->qhInput.value(dev), dev); } return qlReturn; } void OSSInputRegistrar::setDeviceChoice(const QVariant &choice, Settings &s) { s.qsOSSInput = choice.toString(); } bool OSSInputRegistrar::canEcho(const QString &) const { return false; } OSSOutputRegistrar::OSSOutputRegistrar() : AudioOutputRegistrar(QLatin1String("OSS")) { } AudioOutput *OSSOutputRegistrar::create() { return new OSSOutput(); } const QList OSSOutputRegistrar::getDeviceChoices() { QList qlReturn; QStringList qlOutputDevs = cards->qhOutput.keys(); qSort(qlOutputDevs); if (qlOutputDevs.contains(g.s.qsOSSOutput)) { qlOutputDevs.removeAll(g.s.qsOSSOutput); qlOutputDevs.prepend(g.s.qsOSSOutput); } foreach(const QString &dev, qlOutputDevs) { qlReturn << audioDevice(cards->qhOutput.value(dev), dev); } return qlReturn; } void OSSOutputRegistrar::setDeviceChoice(const QVariant &choice, Settings &s) { s.qsOSSOutput = choice.toString(); } OSSEnumerator::OSSEnumerator() { qhInput.insert(QString(), QLatin1String("Default OSS Device")); qhOutput.insert(QString(), QLatin1String("Default OSS Device")); qhDevices.insert(QString(), QLatin1String("/dev/dsp")); #if (SOUND_VERSION >= 0x040002) int mixerfd = open("/dev/mixer", O_RDWR, 0); if (mixerfd == -1) { qWarning("OSSEnumerator: Failed to open /dev/mixer"); return; } oss_sysinfo sysinfo; if (ioctl(mixerfd, SNDCTL_SYSINFO, &sysinfo) == -1) { qWarning("OSSEnumerator: Failed SNDCTL_SYSINFO"); return; } for (int i=0;i< sysinfo.numaudios;i++) { oss_audioinfo ainfo; ainfo.dev = i; if (ioctl(mixerfd, SNDCTL_AUDIOINFO, &ainfo) == -1) { qWarning("OSSEnumerator: SNDCTL_AUDIOINFO failed for device %d", i); continue; } QString handle = QLatin1String(ainfo.handle); QString name = QLatin1String(ainfo.name); QString device = QLatin1String(ainfo.devnode); if (ainfo.caps & PCM_CAP_HIDDEN) continue; qhDevices.insert(handle, device); if (ainfo.caps & PCM_CAP_INPUT) qhInput.insert(handle, name); if (ainfo.caps & PCM_CAP_OUTPUT) qhOutput.insert(handle, name); } close(mixerfd); #endif } OSSInput::OSSInput() { bRunning = true; } OSSInput::~OSSInput() { // Signal input thread to end bRunning = false; wait(); } void OSSInput::run() { QByteArray device = cards->qhDevices.value(g.s.qsOSSInput).toLatin1(); if (device.isEmpty()) { qWarning("OSSInput: Stored device not found, falling back to default"); device = cards->qhDevices.value(QString()).toLatin1(); } int fd = open(device.constData(), O_RDONLY, 0); if (fd == -1) { qWarning("OSSInput: Failed to open %s", device.constData()); return; } int ival; ival = AFMT_S16_NE; if ((ioctl(fd, SNDCTL_DSP_SETFMT, &ival) == -1) || (ival != AFMT_S16_NE)) { qWarning("OSSInput: Failed to set sound format"); goto out; } ival = 1; if ((ioctl(fd, SNDCTL_DSP_CHANNELS, &ival) == -1)) { qWarning("OSSInput: Failed to set mono mode"); goto out; } iMicChannels = ival; ival = SAMPLE_RATE; if (ioctl(fd, SNDCTL_DSP_SPEED, &ival) == -1) { qWarning("OSSInput: Failed to set speed"); goto out; } iMicFreq = ival; qWarning("OSSInput: Starting audio capture from %s", device.constData()); eMicFormat = SampleShort; initializeMixer(); while (bRunning) { short buffer[iMicLength]; int len = static_cast(iMicLength * iMicChannels * sizeof(short)); ssize_t l = read(fd, buffer, len); if (l != len) { qWarning("OSSInput: Read %zd", l); break; } addMic(buffer, iMicLength); } qWarning("OSSInput: Releasing."); ioctl(fd, SNDCTL_DSP_RESET, NULL); out: close(fd); } OSSOutput::OSSOutput() { bRunning = true; qWarning("OSSOutput: Initialized"); } OSSOutput::~OSSOutput() { bRunning = false; // Call destructor of all children wipe(); // Wait for terminate wait(); qWarning("OSSOutput: Destroyed"); } void OSSOutput::run() { QByteArray device = cards->qhDevices.value(g.s.qsOSSOutput).toLatin1(); if (device.isEmpty()) { qWarning("OSSOutput: Stored device not found, falling back to default"); device = cards->qhDevices.value(QString()).toLatin1(); } int fd = open(device.constData(), O_WRONLY, 0); if (fd == -1) { qWarning("OSSOutput: Failed to open %s", device.constData()); return; } int ival; ival = (g.s.iOutputDelay+1) << 16 | 11; if (ioctl(fd, SNDCTL_DSP_SETFRAGMENT, &ival) == -1) { qWarning("OSSOutput: Failed to set fragment"); } ival = AFMT_S16_NE; if ((ioctl(fd, SNDCTL_DSP_SETFMT, &ival) == -1) || (ival != AFMT_S16_NE)) { qWarning("OSSOutput: Failed to set sound format"); if ((ival != AFMT_S16_NE)) close(fd); return; } iChannels = 0; if (g.s.doPositionalAudio()) iChannels = 2; else iChannels = 1; ival = iChannels; if ((ioctl(fd, SNDCTL_DSP_CHANNELS, &ival) == -1) && (ival == static_cast(iChannels))) { qWarning("OSSOutput: Failed to set channels"); return; } iChannels = ival; ival = SAMPLE_RATE; if (ioctl(fd, SNDCTL_DSP_SPEED, &ival) == -1) { qWarning("OSSOutput: Failed to set speed"); return; } iMixerFreq = ival; const unsigned int chanmasks[32] = { SPEAKER_FRONT_LEFT, SPEAKER_FRONT_RIGHT, SPEAKER_FRONT_CENTER, SPEAKER_LOW_FREQUENCY, SPEAKER_BACK_LEFT, SPEAKER_BACK_RIGHT, SPEAKER_SIDE_LEFT, SPEAKER_SIDE_RIGHT, SPEAKER_BACK_CENTER }; eSampleFormat = SampleShort; initializeMixer(chanmasks); int iOutputBlock = (iFrameSize * iMixerFreq) / SAMPLE_RATE; qWarning("OSSOutput: Starting audio playback to %s", device.constData()); ssize_t blocklen = iOutputBlock * iChannels * sizeof(short); short mbuffer[iOutputBlock * iChannels]; while (bRunning) { bool stillRun = mix(mbuffer, iOutputBlock); if (stillRun) { ssize_t l = write(fd, mbuffer, blocklen); if (l != blocklen) { qWarning("OSSOutput: Write %zd != %zd", l, blocklen); break; } } else { while (! mix(mbuffer, iOutputBlock) && bRunning) this->msleep(20); ssize_t l = write(fd, mbuffer, blocklen); if (l != blocklen) { qWarning("OSSOutput: Write %zd != %zd", l, blocklen); break; } } } qWarning("OSSOutput: Releasing device"); ioctl(fd, SNDCTL_DSP_RESET, NULL); close(fd); } mumble-1.3.4/src/mumble/mumble.plist0000664000175000017500000000214314010707274017250 0ustar builderbuilder CFBundleExecutable Mumble CFBundleGetInfoString An open source, low-latency, high quality voice chat software primarily intended for use while gaming. CFBundleIconFile mumble.icns CFBundleIdentifier net.sourceforge.mumble.Mumble CFBundlePackageType APPL CFBundleSignature MBLE CFBundleURLTypes CFBundleURLName Mumble Server URL CFBundleURLSchemes mumble CFBundleVersion 1.3.4 NSHumanReadableCopyright Copyright (c) 2005-2021 The Mumble Developers NSPrincipalClass NSApplication NSHighResolutionCapable mumble-1.3.4/src/mumble/mumble_sv.ts0000664000175000017500000140463314010707274017266 0ustar builderbuilder ACLEditor Deny Neka Allow Tillåt Allow %1 Tillåt %1 Deny %1 Neka %1 Mumble - Add channel Mumble - Lägg till kanal Default server value Standardvärde för servern Failed: Invalid channel Fel: Ogiltig kanal Mumble - Edit %1 Mumble - Ändra %1 ID: %1 ID: %1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Detta ger behörigheten %1. Om en behörighet både är tillåten och otillåten, förblir den otillåten.<br />%2 Channel must have a name Kanaler måste ha ett namn This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Detta återkallar behörigheten %1. Om en behörighet både är tillåten och otillåten, förblir den otillåten.<br />%2 Dialog Dialog Name Namn Enter the channel name here. Ange kanalens namn här. Description Beskrivning Password Lösenord Enter the channel password here. Ange kanalens lösenord här. Check to create a temporary channel. Markera för att skapa en temporär kanal. Temporary Temporär <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> Detta värde tillåter dig att ändra hur Mumble sorterar kanalerna i trädet. En kanal med högre <i>position</i> kommer alltid placeras ovanför en med lägre värde. Om <i>positionsvärdet</i> av två kanaler är lika kommer de sorteras efter namn. Position Position &Groups &Grupper Group Grupp List of groups Lista med grupper Remove selected group Ta bort vald grupp Remove Ta bort Inherit group members from parent Ärv gruppmedlemmar från förälder Inherit Ärv Make group inheritable to sub-channels Gör gruppärvning till underkanaler Inheritable Ärvda Group was inherited from parent channel Gruppen ärvdes från föräldrakanalen Inherited Ärvd Members Medlemmar Add Lägg till Add member to group Lägg till medlem i grupp Remove member from group Ta bort medlem från grupp &ACL &ACL Active ACLs Aktiva ACLer List of entries Lista med poster Inherit ACL of parent? Ärv ACL från förälder? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. Detta ställer in om ACL upp i kedjan av föräldrakanaler är verkställda till detta objekt. Endast de poster som är markerade i förälder som "Verkställ till underkanaler" kommer att ärvas. Inherit ACLs Ärv ACLer Move entry up Flytta upp post This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. Detta flyttar upp posten i listan. Då poster är utvärderade i ordning kan detta ändra gällande behörigheter av användare. Du kan inte flytta en post ovan en ärvd post. Om du verkligen behöver göra detta måste du kopiera den ärvda posten. &Up &Upp Move entry down Flytta ned post This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. Detta flyttar ned posten i listan. Då poster är utvärderade i ordning kan detta ändra gällande behörigheter av användare. &Down &Ner Add new entry Lägg till en ny post This adds a new entry, initially set with no permissions and applying to all. Detta lägger till en ny post som från början är inställd utan behörigheter och verkställs till alla. &Add &Lägg till Remove entry Ta bort post This removes the currently selected entry. Detta tar bort den valda posten. &Remove &Ta bort Context Innehåll Entry should apply to this channel. Entry should apply to this channel Posten bör verkställas till denna kanal. This makes the entry apply to this channel. Detta gör att posten verkställs till den här kanalen. Applies to this channel Verkställs till den här kanalen Entry should apply to sub-channels. Posten borde verkställas till underkanaler. Add new group Lägg till en ny grupp <b>Add</b><br/> Add a new group. <b>Lägg till</b><br/> Lägg till en ny grupp. Inherited members Ärvda medlemmar Contains the list of members added to the group by this channel. Innehåller listan med medlemmar som lagts till i gruppen av kanalen. Contains a list of members whose group membership will not be inherited from the parent channel. Innehåller en lista med medlemmar, vars gruppmedlemsskap inte kommer att ärvas från föräldrakanalen. Contains the list of members inherited by other channels. Innehåller listan med medlemmar ärvda av andra kanaler. Type in the name of a user you wish to add to the group and click Add. Skriv in en användares namn du vill lägga till i gruppen och tryck på Lägg till. Type in the name of a user you wish to remove from the group and click Add. Skriv in en användares namn du vill ta bort från gruppen och tryck på Lägg till. Exclude Exkludera Excluded members Exkluderade medlemmar This makes the entry apply to sub-channels of this channel. Detta gör att posten verkställs till underkanaler för denna kanal. Applies to sub-channels Verkställs till underkanaler Permissions Behörigheter User/Group Användare/Grupp Group this entry applies to Grupper denna post verkställs till User ID Användar-ID User this entry applies to Användare denna post gäller This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. Detta kontrollerar vilken användare posten verkställs till. Skriv in användarnamnet och tryck på enter för att förfråga servern om en matchning. &Properties &Egenskaper <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>Namn</b><br />Ange kanalens namn i detta fält. Namnet måste följa reglerna på servern du är ansluten till. <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>Temporär</b><br /> Vid markering kommer den nuvarande kanalen markeras som temporär. Detta betyder att när den sista användaren som lämnar kanalen kommer den automatiskt tas bort från servern. <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>Grupp</b><br /> Alla dessa är de grupper som som för närvarande definieras för kanalen. För att skapa en ny grupp behöver du bara skriva in namnet och trycka på enter. <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>Ta bort</b><br />Detta tar bort den valda gruppen. Om gruppen var ärvd kommer den inte tas bort från listan, men all lokal information om gruppen kommer att rensas. <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>Ärv</b><br />Detta ärver alla medlemmar i gruppen från föräldern om gruppen är markerad som <i>ärvd</i> i föräldrakanalen. <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>Ärftlig</b><br />Detta gör gruppen ärftlig till underkanaler. Om gruppen ej är ärftlig kan fortfarande undergrupper skapa en ny grupp med samma namn. <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>Ärftlig</b><br />Detta indikerar om gruppen ärvdes av en föräldrakanal. Du kan inte ändra den här flaggan, den är endast till för information. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>Exkluderade medlemmar</b><br /> Innehåller en lista med medlemmar, vars gruppmedlemsskap inte kommer att ärvas från föräldrakanalen. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. <b>Ärvda medlemmar</b><br /> Innehåller listan med ärvda medlemmar av den nuvarande kanalen. Avmarkera <i>Ärv</i> för att förhindra arv från kanaler med högre nivå. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. Detta kontrollerar vilken grupp användare denna post verkställs till.<br />Kom ihåg att gruppen är utvärderad i samband av kanalen posten används i. T.ex. standard-ACL på Rotkanalen ger <i>Skrivbehörighet</i> till <i>administratörsgruppen</i>. Om denna post är ärvd av en kanal kommer den att ge en användare skrivbehörigheter, om den tillhör <i>administratörsgruppen</i> i kanalen, även om den inte tillhör <i>admininistratörsgruppen</i> i kanalen för ACLens ursprung.<br />Om ett gruppnamn börjar med ett '!', är dess medlemsskap upphävt. Om det börjar med ett '~', är det utvärderat i kanalen där ACLen definierades, istället för kanalen som ACLen är aktiv i.<br />Om ett gruppnamn börjar med ett '#', tolkas det som en tillgångstoken. Användare måste ha angett det som följer '#' i deras lista med tillgångstokens för att matchas. Detta kan användas som enkel lösenordstillgång till kanalerför ej autentiserade användare.<br />Om ett gruppnamn börjar med ett '$', kommer det endast att matcha användare vars certrifikat matchar det som följer '$'.<br />Ett par speciella fördefinierade grupper är:<br /><b>alla</b> - Alla kommer att matchas.<br /><b>ver</b> - Alla autentiserade användare kommer att matchas.<br /><b>under,a,b,c</b> - Användare för närvarande i en underkanal minst <i>a</i> gemensamma föräldrar och mellan <i>b</i> och <i>c</i> kanaler under kedjan. Se hemsidan för mer omfattande dokumentation för detta.<br /><b>i</b> - Användare som för närvarande är i kanalen kommer (förmån för '<i>under,0,0,0</i>').<br /><b>ut</b> - Användare utanför kanalen kommer matcha (förmån för '<i>!under,0,0,0</i>').<br />Kom ihåg att en post verkställs till antingen en användare eller en grupp, inte båda. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. <b>Lösenord</b><br />Detta fält tillåter dig att lätt ändra lösenordet för en kanal. I bakgrunden används tillgångstoken-funktionen. Använd ACLer och grupper om du behöver bättre och mer kraftfull tillgångskontroll. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. Detta visar alla poster aktiva i den här kanalen. Poster ärvda från föräldrakanaler kommer att visas kursivt.<br />ACLer utvärderas från topp till botten, vilket betyder att prioriteten ökar om du flyttar nedåt i listan. ID of the channel. Kanalens ID. Maximum Users Max användare Maximum number of users allowed in the channel Maximalt antal tillåtna användare i kanalen <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. <b>Max användare</b><br /> Det värdet tillåter dig att ställa in ett maximalt antal av användare som är tillåtna i kanalen. Om värdet är noll så är det maximala antalet användare för kanalen densamma som serverns standard begränsning. This is the sort order for the channel. Det är den inställda sorteringen för kanalen. ALSAAudioInput Default ALSA Card Standardkort för ALSA Opening chosen ALSA Input failed: %1 Kunde inte öppna vald ALSA-ingång: %1 ALSAAudioOutput Default ALSA Card Standardkort för ALSA Opening chosen ALSA Output failed: %1 Kunde inte öppna vald ALSA-utgång: %1 ASIOConfig %1 (version %2) %1 (version %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz %1 -> %2 sample-buffert, med %3 sample-upplösning (%4 föredras) vid %5 Hz ASIO Initialization failed: %1 ASIO kunde inte initieras: %1 Failed to instantiate ASIO driver ASIO-drivrutin kude inte initieras ASIO ASIO Device selection Val av enhet Device Enhet Device to use for microphone Enhet att använda som mikrofon This chooses what device to query. You still need to actually query the device and select which channels to use. Detta förfrågar vilken enhet som ska användas. Du behöver fortfarande förfråga enheten och välja vilken kanal som ska användas. Query selected device Förfråga vald enhet This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. Detta förfrågar den valda enheten om kanaler. Var medveten om att många ASIO-drivrutiner är mycket buggiga och förfrågning kan orsaka en krasch av programmet eller systemet. &Query &Förfråga Configure selected device Konfigurera den valda enheten This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. Detta konfigurerar den valda enheten. Var medveten om att många ASIO-drivrutiner är mycket buggiga och förfrågning kan orsaka en krasch av programmet eller systemet. &Configure &Konfigurera Capabilities Kapabeliteter Driver name Enhetsnamn Buffer size Buffertstorlek This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. Detta kommer att konfigurera ingångskanalerna för ASIO. Var säker på att du väljer minst en kanal för mikrofon och högtalare. <i>Mikrofon</i> ska vara där din mikrofon är ansluten. <i>Högtalare</i> ska vara en kanal som samplar '<i>Vad du hör</i>'.<br />T.ex. för Audigy 2 ZS är ett bra val för mikrofon '<i>Mic L</i>', medan högtalare borde vara '<i>Mix L</i>' och '<i>Mix R</i>'. Configure input channels Konfigurera ingångskanaler Channels Kanaler Microphone Mikrofon <- <- -> -> Unused Oanvänd Speakers Högtalare ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. Du måste välja minst en mikrofon och en högtalarkälla för att använda ASIO. Om du behöver mikrofonsampling, använd DirectSound. Opening selected ASIO device failed. No input will be done. Kunde inte öppna vald enhet för ASIO. Ingen ändring kommer att göras. AboutDialog About Mumble Om Mumble <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> <h3>Mumble (%1)</h3><p>%3</p><p><b>Ett röstchattverktyg för spelare</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble &Om Mumble &License &Licens A&uthors A&uthors &Third-Party Licenses OK OK AudioInput Interface Gränssnitt System System Input method for audio Ingångsmetod för ljud <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Detta är ingångsmetoden att använda för ljud.</b><br />Troligtvis vill du använda DirectSound. Device Enhet Input device for audio Ingångsenhet för ljud <b>This is the input device to use for audio.</b> <b>Detta är ingångsmetoden att använda för ljud.</b> Transmission Överföring &Transmit &Överför When to transmit your speech När din röst ska överföras <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. <b>Detta ställer in när tal ska överföras.</b><br /><i>Kontinuerligt</i> - Alltid<br /><i>Röstaktivitet</i> - När du talar tydligt.<br /><i>Tryck-för-att-Tala</i> - När du håller nere snabbknappen under <i>Genvägar</i>. DoublePush Time Dubbelklicks-tid If you press the PTT key twice in this time it will get locked. Om du trycker på TfaT-knappen två gånger inom denna tid kommer den att låsas. <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. <b>Dubbelklicks-tid</b><br />Om du trycker på Tryck-för-att-Tala-knappen två gånger inom den konfigurerade tidsintervallen, kommer den att låsas. Mumble kommer överföra tills du trycker på knappen en gång till, för att låsa upp TfaT igen. Reset audio cue to default Återställ ljudsignal till standard <b>Reset</b><br/>Reset the paths for the files to their default. <b>Återställ</b><br/>Återställ sökvägarna för filerna till standard. Browse for on audio file Bläddra efter en ljudfil för på Browse for off audio file Bläddra efter en ljudfil för av Off Av On Preview the audio cues Förhandsvisa ljudsignalen Use SNR based speech detection Använd STB-baserad talaktivitet Signal to Noise Signal till Buller <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. <b>Detta ställer in talaktiviteten att använda förstärkning.</b><br />I detta läget, används råstyrkan av ljudsignalen till upptäckt av ljudaktivitet. Amplitude Förstärkning Voice &Hold &Tysta ljud How long to keep transmitting after silence Tid att fortsätta överföring efter tystnad Silence Below Tystnad under <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. <b>Detta ställer in utlösarvärden för upptäckning av ljudaktivitet.</b><br />Använd detta tillsammans med ljudstatistiken för att manuellt justera utlösaren för upptäckning av ljudaktivitet. Ingångsvärden under "Tystnad under" räknas alltid som tystnad. Värden ovan "Tala över" räknas alltid som röst. Värden däremellan räknas som röst om du redan talar, men kommmer inte utlösa en ny upptäckt. Speech Above Tala över Signal values above this count as voice Signalvärden ovanför detta räknas som röst Compression Komprimering &Quality &Kvalitet Quality of compression (peak bandwidth) Kvalitet av komprimering (höjdpunkt för bandbredd) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. <b>Detta ställer in kvaliteten av komprimering.</b><br /> Detta bestämmer hur mycket bandbredd Mumble tillåts att använda till utgående ljud. Audio per packet Ljud per paket How many audio frames to send per packet Mängden ljud att skicka per paket <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>Detta ställer in mängden ljud att paketera i ett paket.</b><br />Genom att öka detta kommer latensen för din röst ökas, men också minska bandbreddskravet. <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). <b>Detta visar höjdpunkten för använd utgående bandbredd.</b><br />Detta visar höjdpunkten för mängden bandbredd utsänd från dig. Ljudbitraten är den högsta bitraten (som vi använder VBR) för själva ljuddatan. Positionen är bitraten som används för platsinformation. Totalt är våran inramning IP-paketet (IP och UDP är 75% av detta totalt). Audio Processing Ljudbearbetning Noise Suppression Bullerdämpning Noise suppression Bullerdämpning <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. <b>Detta ställer in mängden ljuddämpning att verkställa.</b><br />Ju högre värdet är, kommer högre stationärt buller att dämpas. Maximum amplification of input sound Högsta förstärkning av ingångsljud <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. <b>Högsta förstärkning av ingångsljud.</b><br />Mumble normaliserar ingångsvolymen innan komprimering och ställer in hur mycket det tillåts att förstärkas.<br />Den verkliga nivån är kontinuerligt uppdaterad baserad på ditt nuvarande talmönster, men kommer aldrig att gå under nivån specifierad här.<br />Om <i>mikrofonstyrkan</i> av ljudstatistiken är över ungefär 100% kommer du säkerligen villa ställa in detta till 2.0 eller liknande, men som de allra flesta kan du inte nå 100%, ställ in till något mycket högre.<br />Ställ helst in det till <i>mikrofonstyrka * förstärkningsfaktor >= 100</i> även när du talar mjukt.<br /><br />Kom ihåg att det inte tar någon skada att ställa in detta till det högsta. Mumble kommer ta upp andra konversationer om du låter det vara för att automatiskt justera nivån. Current speech detection chance Nuvarande talupptäckningsrisk Cancel echo from speakers Förhindra eko från högtalare Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. Aktivering av detta kommer att hindra eko från dina högtalare. Blandad har låg CPU-kraft, men fungerar bara bra om dina högtalare hörs lika högt och från samma avstånd från din mikrofon. Multikanals-ekoavbrytning ger mycket bättre ekoavbrytning, men tar mer CPU-kraft. Disabled Avaktiverat <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>Detta ställer in upptäckning av röstaktivitet att använda Signal-till-Buller-kvot.</b><br />I detta läge analyseras ingången för något som liknar en ren signal och klarhet, vilket används för att växla upptäckning av röstaktivitet. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>Detta visar de nuvarande inställningarna för upptäckning av röstaktivitet.</b><br />Du kan ändra inställningarna från dialogen med inställningar, eller från konfigurationen för ljud. Signal values below this count as silence Signalvärden under detta räknas som tystnad Maximum bandwidth used for sending audio Högsta bandbredd att använda för sändning av ljud Use Amplitude based speech detection Använd förstärkning baserad på upptäckning av talaktivitet <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). <b>Detta väljer hur länge ett avbrott uppfattat i röstöverföringen bör fortsätta.</b><br />Ändra detta till ett högre värde om din röst bryts när du talar (ses av en snabbt blinkande röstikon intill ditt namn). Exclusive mode Exklusivt läge <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>Detta öppnar enheten i exklusivt läge.</b><br />Inga andra program kommer kunna använda enheten. Exclusive Exklusiv R&eset Å&terställ &Browse... &Bläddra... B&rowse... B&läddra... &Preview &Förhandsgranska <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. <b>Förhandsgranska</b><br/>Spelar upp det nuvarande <i>på-ljudet</i> följt av det nuvarande <i>av-ljudet</i>. Displays an always on top window with a push to talk button in it Visa alltid ett alltid-överst-fönster med en tryck-för-att-tala-knapp Display push to talk window Visa tryck-för-att-tala-fönster Misc Blandat Audible audio cue when starting or stopping to transmit Ljudmeddelande vid början och slut av röstöverföring <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. <b>Detta tillåter överföring av ljudmeddelanden.</b><br />Detta kommer att ge dig ett kort ljudpip när du börjar eller slutar röstöverföring. Audio cue Ljudmeddelande Gets played when starting to transmit Spelas vid början av röstöverföring Gets played when stopping to transmit Spelas vid slut av röstöverföring Hold Time Väntetid Time the microphone stays open after the PTT key is released Tiden som mikrofonen är igång efter att tryck-för-att-tala-knappen släppts Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) Serverns maximala nätverkskapacitet är bara %1 kbit/s. Ljudkvaliteten justerades till %2 kbit/s (%3 ms) Max. Amplification Maximal förstärkning Idle action Efteråtgärd minutes do minuter, gör nothing ingenting deafen tysta mute avaktivera mikrofon after efter Echo Cancellation Ekoavbrytning Mixed echo cancellation Blandad ekavbrutning Multichannel echo cancellation Ekoavbrutning för multikanal The idle action will be reversed upon any key or mouse button input Undo Idle action upon activity Apply RNNoise's noise suppression filter. <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. RNNoise Audio input AudioInputDialog Continuous Kontinuerligt Voice Activity Ljudaktivitet Push To Talk Tryck för att Tala Audio Input Ljudingång %1 ms %1 ms Off Av %1 s %1 s %1 kb/s %1 kb/s -%1 dB -%1 dB %1 kbit/s (Audio %2, Position %4, Overhead %3) %1 kbit/s (Ljud %2, Position %4, Över %3) AudioOutput Interface Gränssnitt System System Output method for audio Utgångsmetod för ljud <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Detta är utgångsmetoden att använda för ljud.</b><br />Troligtvis vill du använda DirectSound. Device Enhet Output device for audio Utgångsenhet för ljud <b>This is the output device to use for audio.</b> <b>Detta är utgångsenheten att använda för ljud.</b> Positional Audio Positionellt ljud Audio Output Ljudutgång Default &Jitter Buffer Standard &jitterbuffert Safety margin for jitter buffer Säkerhetsmarginal för jitterbuffert <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. <b>Detta ställer in den lägsta säkerhetsmarginalen för jitterbufferten.</b><br />Allt inkommande ljud buffras och jitterbufferten fortsätter att tvinga bufferten så lågt som möjligt av ditt nätverk, för att få en så låg latens som möjligt. Detta ställer in den lägsta buffertstorleken att använda. Om början på meningar är skakiga, öka detta värde. Minimum distance to user before sound volume decreases Lägsta avstånd att använda innan ljudvolymen sänks This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. Detta ställer in det lägsta avståndet att använda för ljudberäkningar. Volymen för andra användares tal kommer inte att sänkas tills de är så här långt ifrån dig. This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. Detta ställer in det lägsta avståndet att använda för ljudberäkningar. Vid längre avstånd än detta kommer andra användares talvolym inte att sänkas lägre. <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. <b>Detta aktiverar någon av testlägena för tillbakaloping.</b><br /><i>Ingen</i> - Tillbakaloping avaktiverat<br /><i>Lokal</i> - Emulera en lokal servererver.<br /><i>Server</i> - Önska en tillbakaloping från servern.<br />Kom ihåg att när tillbakaloping är aktiverar. Annars kan inga andra användare höra dig. Den här inställningen sparas ej när du stänger Mumble. Volume Volym Volume of incoming speech Volym för inkommande tal <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. <b>Detta justerar volymen för inkommande tal.</b><br />Kom ihåg att om du ökar detta över 100%, kommer ljudet att förvrängas. Output Delay Utgångsfördröjning Amount of data to buffer Mängd data att buffra The connected "speakers" are actually headphones The connected "speakers" are actually headphones. De anslutna "högtalarna" är faktiskt hörlurar Factor for sound volume decrease Faktisk sänkning av volym Bloom Bloom Factor for sound volume increase Faktisk ökning av volym How much should sound volume increase for sources that are really close? Hur mycket ska ljudvolymen ökas för källor som är väldigt nära? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. Markering av detta ökar att du inte har högtalare anslutna, endast hörlurar. Detta är viktigt, då högtalare oftast är framför dig medan hörlurar är direkt på höger/vänster-sidorna. This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Detta ställer in mängden data att förbuffra i utgångsbufferten. Experimentera med olika värden och ställ in det lägsta som inte orsakar snabbt jitter i ljudet. Headphones Hörlurar Minimum Distance Lägsta avstånd Maximum Distance Högsta avstånd Maximum distance, beyond which speech volume won't decrease Högsta avstånd, under detta kommer volymen inte kommer att minska Minimum Volume Lägsta volym What should the volume be at the maximum distance? Vad borde volymen vara vid högsta avstånd? Loopback Test Test för tillbakalop Delay Variance Fördröjnings-motsättning Variance in packet latency Motsättning i paketlatens <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>Detta ställer in paketlatensen för tillbakalop-testning.</b><br />De felsta ljudsökvägar innehåller viss motsättslatens. Detta tillåter dig att ställa in motsättningen för läget tillbakalop. T.ex. om du ställer in detta till 15ms, kommer detta emulera ett nätverk med 20-35ms latens eller ett med 80-95ms latens. De flesta stora nätverksanslutningar har en motsättning vid ungefär 5ms. Packet Loss Paketförluster Packet loss for loopback mode Paketförluster för läget tillbakalop <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% <b>Detta ställer in paketförluster för läget tillbakalop.</b><br />Detta kommer att bli kvoten av paketförluster. Om inte din utgående bandbredd är toppad eller att någonting är fel med din internetanslutning, kommer detta bli 0% &Loopback &Tillbakalop Desired loopback mode Önskat läge för tillbakalop Attenuate applications by... Dämpa program med... Attenuation of other applications during speech Dämpning av andra program vid tal <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. <b>Dämpa andra programs volym vid tal</b><br />Mumble stödjer sänkning av volymen för andra program vid inkommande och/eller utgående tal. Detta ställer in dämpningen för andra program, om funktionen är aktiverad. If checked Mumble lowers the volume of other applications while other users talk Vid markering sänker Mumble volymen för andra program när andra användare talar <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. <b>Dämpa program då andra användare talar</b><br />Mumble stödjer sänkning av volymen för andra program vid inkommande och/eller utgående tal. Detta gör att Mumble aktiverar funktionen då andra användare talar med dig. while other users talk när andra talar If checked Mumble lowers the volume of other applications while you talk Vid markering sänker Mumble volymen för andra program när du talar <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. <b>Dämpa program när du talar</b><br />Mumble stödjer sänkning av volymen för andra program vid inkommande och/eller utgående tal. Detta gör att volymen för andra program vid inkommande och/eller utgående tal. Detta för att Mumble aktiverar funktionen då du talar. while you talk när du talar Exclusive mode, not recommended. Exklusivt läge, ej rekommenderat. <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>Detta öppnar enheten i exklusivt läge.</b><br />Inga andra program kommer kunna använda enheten. Exclusive Exklusiv Priority Speaker Prioriterad talare If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. Vid markering sänker Mumble volymen för övriga användare medan du talar om du har "Prioriterad talare" som status. <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. <b>Dämpa andra spelare när du talar som Prioriterad talare.</b><br />Mumble stödjer minskning av volym för andra spelare medan du talar som <i>Prioriterad talare</i>, för att undvika att du blir störd. Markera för att aktivera funktionen. Attenuate other users while talking as Priority Speaker. Dämpa andra användare medan du talar som Prioriterad talare. Advanced Attenuation Options Avancerade dämpningsinställningar If checked, Mumble will only attenuate applications that are using the same output source as Mumble Vid markering kommer Mumble endast att dämpa program som använder sig av samma utgångskälla som Mumble. <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. <b>Dämpa endast program som använder samma utgångskälla som Mumble.</b><br />Vid markering kommer program som använder en annan utgångskälla än Mumble inte att bli dämpat. Only attenuate applications using the same output device Dämpa endast program som använder samma utgångskälla. If checked, PulseAudio loopback modules will be attenuated Vid markering kommer PulsAudio returkopploingsmoduler att bli dämpade. <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. <b>Dämpa PulsAudio returkopplingsmoduler</b><br />Om returkopplingsmoduler är länkade till Mumble's utgångsenhet kommer även dessa att bli dämpade. Attenuate PulseAudio loopback modules Dämpa PulseAudio returkopplingsmoduler Audio output AudioOutputDialog None Ingen Local Lokal Server Server Audio Output Ljudutgång %1 ms %1 ms %1 % %1 % %1 m %1 m AudioOutputSample Choose sound file Välj ljudfil Invalid sound file Ogiltig ljudfil The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. Filen '%1' kan inte användas av Mumble. Välj en annan fil med ett kompatibelt format och kodning. AudioStats >1000 ms >1000ms >1000 ms Audio Statistics Ljudstatistik Input Levels Ingångsnivåer Peak microphone level Högsta mikrofonnivå Peak power in last frame Toppkraft i sista ruta This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. Detta visar den högsta kraften i den senaste rutan (20 ms) och är samma mätning som du skulle hittat under "ingångskraft". Ignorera detta och titta på <b>mikrofonkraft</b> istället, vilket är mycket jämnare och bortser från avvikelser. Peak speaker level Högsta högtalarnivå This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. Detta visar den högsta kraften för högtalarna i den senaste rutan (20 ms). Såvida du inte använder en samplingsmetod för multikanal (t.ex. ASIO) med högtalarkanaler konfigurerade, kommer detta blir 0. Om du har en sådan uppsättning konfigurerad kommer detta visas som 0 då du spelar ljud från andra program, fungerar inte din uppsättning. Peak clean level Högsta klara nivå This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. Detta visar den högsta kraften den senaste rutan (20 ms) efter alla procedurer. I bästa fall ska detta vara -96 dB när du inte talar. I verkligeheten är ett ljud -60 dB, men du borde se någonting vid ungefär -20 dB. När du talar ska detta höjas till någonting mellan -5 och -10 dB.<br />Om du använder ekoborttagning och detta ökar till mer än -15 dB när du inte talar, är din uppsättning felaktig och du kommer att störa andra användare med ekon. Signal Analysis Signalanalys Microphone power Mikrofonkraft How close the current input level is to ideal Hur nära den nuvarande ingångsnivån är till idealisk This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. Detta visar hur nära din nuvarande ingångsvolym är till idealisk. För att justera din mikrofonnivå, öppna ett program som du använder för att justera inspelningsvolymen och leta efter värdet här medan du talar.<br /><b>Tala högt, som om att du vore upprörd för att du sköts av en liten n00big P12:a.</b><br />Justera volymen tills detta värda är nära 100%, men se till att det inte för över det. Om det går över, kommer du säkerligen att få klippningar i ditt tal, som kommer att försämra ljudkvaliteten. Signal-To-Noise ratio Signal-till-Buller-kvot Signal-To-Noise ratio from the microphone Signal-till-Buller-kvot från mikrofon This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. Detta är Signal-till-Buller-kvoten (STR) för mikrofonen i den senaste rutan (20 ms). Det visas hur mycket klarare rösten är jämfört med bullret.<br />Om detta värde är under 1.0, finns det mer buller än ljudet i signalen och kvaliteten har minskat.<br />Det finns ingen begränsning på hur högt detta värde kan vara, men förvänta dig inte att se mer än 40-50 utan en ljudstudio. Speech Probability Tallikhet Probability of speech Talsannolikhet This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). Detta är förmodligen den senaste rutan (20 ms) som var tal och inte miljöbuller.<br />Överföring av ljudaktivitet beror på detta att det är rätt. Tricket md detta är att mitten av en mening alltid upptäcks som tal. Problemet är pauserna mellan ord och början av talet. Det är svårt att skilja en suck från ett ord som börjar med "h".<br />Om detta är med fet stil betyder det att Mumble överför för närvarande (om du är ansluten). Configuration feedback Detaljerad information Current audio bitrate Nuvarande ljudbitrate Bitrate of last frame Bitrate för den senaste rutan DoublePush interval Dubbelklicks-intervall Time between last two Push-To-Talk presses Tid mellan de senaste två Tryck-för-att-Tala-aktiviteterna Speech Detection Upptäckning av talaktivitet Current speech detection chance Nuvarande sannolikhet för upptäckning av talaktivitet <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>Detta visar de nuvarande inställningarna för upptäckning av tal.</b><br />Du kan ändra inställningen från dialogen med inställningar, eller från konfigurationen för ljud. Signal and noise power spectrum Kraftspektrum för signal och buller Power spectrum of input signal and noise estimate Kraftspektrum för ingångssignaler och bulleruppskattning This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. Detta visar kraftspektrumet för den nuvarande ingångssignalen (röd) och de nuvarande bulleruppskattningen (fylls blå).<br />Alla amplituder multipliceras med 30 för att visa de intressanta delarna (hur mycket mer signal än buller som presenteras i varje våg).<br />Detta är intressant om du försöker att finjustera bullerförutsättningen på din mikrofon. Under goda förutsättningar ska det endast vara en liten mängd blått vid botten. Om det blåa är mer än halvvägs upp i grafen, har du en dålig bulleromgivning. Echo Analysis Ekoanalyser Weights of the echo canceller Vikter för ekoavbrytaren This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. Detta visar vikterna för ekoavbrytaren, med tiden ökande nedåt och frekvensen ökande till höger.<br />Helst ska detta vara svart, vilket visar att det inte finns något eko alls. Vanligtvis, har du en eller flera horisontella linjer som representerar tidfördröjda ekon. Du borde se hur vikterna uppdateras i realtid.<br />Kom ihåg att så länge du har något att ta bort eko ifrån, kommer du inte se någon användbar data här. Spela lite musik så kommer saker att stabiliseras. <br />Du kan välja mellan att välja riktida eller tänkta delar av frekvensdomänens vikter, eller alternativt beräknade moduler och faser. Det mest användbara av dessa kommer säkerligen vara moduler, som är amplituden för ekot och visar hur mycket av den utgående signalen som tas bort just då. De andra visningslägena fär mest användbara för människor som vill ställa in ekoavbrytnings-algoritmer.<br />Kom ihåg att om hela bilden fluktuerar massivt i modulläget misslyckas ekoavbrytaren att hitta ett växelförhållande mellan ingångskällorna (högtalare och mikrofon). Antingen har du en hög latens för ekot, eller så är en av ingångskällorna felkonfigurerade. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. Detta är ljudbitraten av den senast komprimerade rutan (20 ms) och som kommer att hoppa upp och ner så länge VBR justerar kvaliteten. Den högsta bitraten kan justeras i inställningsdialogen. AudioWizard Audio Tuning Wizard Inställningsguiden för ljud Introduction Introduktion Welcome to the Mumble Audio Wizard Välkommen till inställningsguiden för ljud i Mumble Finished Slutfört Enjoy using Mumble Njut av att använda Mumble Device selection Enhetsval Selecting the input and output device to use with Mumble. Välj ingångs- och utgångsenheter att använda i Mumble. This is the device your microphone is connected to. Detta är enheten din mikrofon är ansluten till. System System Input method for audio Ingångsmetod för ljud <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Detta är ingångsmetoden att använda för ljud.</b><br />Troligtvis vill du använda DirectSound. Device Enhet Input device to use Ingångsenhet att använda <b>Selects which sound card to use for audio input.</b> <b>Väljer vilket ljudkort som ska användas för ljudingång.</b> Cancel echo from headset or speakers Avbryt eko från headset eller högtalare Use echo cancellation Använd ekoavbrytning This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. Detta aktiverar ekoavbrytning för utgående ljud, som hjälper för både högtalare och headsets. This is the device your speakers or headphones are connected to. Detta är enheten dina högtalare eller hörlurar är anslutna till. Output method for audio Utgångsmetod för ljud <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Detta är utgångsmetoden att använda för ljud.</b><br />Troligtvis vill du använda DirectSound. Output device to use Utgångsenhet att använda <b>Selects which sound card to use for audio Output.</b> <b>Väljer vilket ljudkort som ska användas för ljudutgång.</b> Enable positional audio Aktivera positionellt ljud Allows positioning of sound Allows positioning of sound. Tillåter positionering för ljud <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> <p> Detta är konfigurationsguiden för ljud i Mumble. Detta kommer att hjälpa dig med att ställa in ingångsnivåerna för ditt ljudkort, men också ställa in de korrekta parametrarna för ljudbearbetning i Mumble. </p> <p> Kom ihåg att du kommer höra ditt eget ljud lokalt så länge konfigurationsguiden är igång. Under den tiden kommer inget ljud heller att skickas till servern. </p> Input Device Ingångsenhet Output Device Utgångsenhet This allows Mumble to use positional audio to place voices. Detta tillåter Mumble att använda positionellt ljud för att placera röster. <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> <p> För att hålla latensen så låg som möjligt, är det viktigt att buffra så lite ljud som möjligt på ljudkortet. Många ljudkort rapporterar att de kräver en mindre buffert än vad de kan jobba med. Den enda vägen för att ställa in detta värdet är att testa sig fram själv. </p> <p> Du kommer att höra ett rösttest. Ställ in inställningen nedan till det lägsta värdet som <b>inte</b> ger dig några störningar eller jitter i ljudet. Kom ihåg att lokalt ljud är avaktiverat under detta test. </p> Amount of data to buffer Mängd data att buffra This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Detta ställer in mängden data att förbuffra i utgångsbufferten. Exprimentera med olika värden för att ställa in det lägsta som inte orsakar snabbt jitter i ljudet. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> <p> Öppna din kontrollpanel för ljud och gå till inspelningsinställningar. Se till att mikrofonen är vald som aktiv ingång, med högsta inspelningsvolym. Om det finns ett alternativ för att aktivera "Mikrofonförstärkning", se till att det är markerat. </p> <p> Tala högljutt, som om att du är irriterad eller nyfiken. Sänk volymen i kontrollpanelen för ljud tills baren under stannar så högt som möjligt i den gröna och blåa, men <b>inte</b> i det röda området medan du talar. </p> Positional Audio Positionellt ljud Adjusting attenuation of positional audio. Justerar dämpning av positionellt ljud. <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> <p> Mumble stödjer positionellt ljud för vissa spel och kommer att överföra röst med positionsinformation för var användare befinner sig. Beroende på deras position kommer volymen för ljudet att ändras mellan högtalarna för att simulera platsen och avståndet för där användaren är. Sådan positionering beror på om din högtalarkonfiguration är korrekt inställd i ditt operativsystem. Ett sådant test görs här. </p> <p> Grafen visar positionen för <font color="red">dig</font>,<font color="yellow">högtalarna</font> och en <font color="green">flyttande ljudkälla</font> som om att den syns från ovan. Du bör höra ljudflytten mellan kanalerna. </p> Use headphones instead of speakers Använd hörlurar istället för högtalare <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> <p> Mumble är under utveckling och utvecklingslaget vill fokusera på funktionerna som flest användare vill ha. I slutändan stödjer Mumble inskickning av anonym statistik om din konfiguration till utvecklarna. Denna statistik är nödvändig för framtida utveckling, samt för att se till så att funtionerna du använder inte föråldras. </p> Use headphones Använd hörlurar This ignores the OS speaker configuration and configures the positioning for headphones instead. Detta ignorerar högtalarkonfigurationen för ditt OS och konfigurerar positioneringen för högtalare istället. Volume tuning Volymjustering Tuning microphone hardware volume to optimal settings. Ljustera mikrofonvolymen till optimala inställningar. Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. Tala lugnt, som om du talar mitt i natten och inte vill störa någon. Justera inställningen nedan så att baren flyttas till grönt när du talar, men förblir blå när du är tyst. Voice Activity Detection Upptäckning av röstaktivitet Letting Mumble figure out when you're talking and when you're silent. Låt Mumble räkna ut när du talar och när du är tyst. This will help Mumble figure out when you are talking. The first step is selecting which data value to use. Detta hjälper Mumble att räkna ut när du talar. Det första steget är att välja vilket datavärde som ska användas. Raw amplitude from input Råamplitud från ingång Signal-To-Noise ratio Signal-till-Buller-kvot Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Nu behöver du justera följande inställning. De första få yttranden du säger bör hamna i det gröna området (slutgiltigt tal). Vid tal, bör du stanna inom den gula (kan vara tal), så när du inte talar ska allt vara rött (definitivt inte tal). Device tuning Enhetsjustering Changing hardware output delays to their minimum value. Ändrar fördröjningen för hårdvaruutgångar till det lägsta värdet. Submit anonymous statistics to the Mumble project Skicka anonym statistik till projektet Mumble Push To Talk: Tryck för att Tala: Quality & Notifications Kvalitet & notifieringar Adjust quality and notification settings. Justera kvalitets- och notifieringsinställningar. Quality settings Kvalitetsinställningar Low Låg Balanced Balanserat Notification settings Notifieringsinställningar Use Text-To-Speech to read notifications and messages to you. Använd Text-till-Tal för att läsa notifieringar och meddelande för dig. Disable Text-To-Speech and use sounds instead. Avaktivera Text-till-Tal och använd ljud istället. %1 ms %1 ms Enables attenuation of other applications while users talk to you Aktiverar dämpning av andra program när användare talar med dig Attenuate applications while other users talk Dämpa program när andra användare talar High Hög Custom Anpassad You already set a customized quality configuration in Mumble. Select this setting to keep it. Du har redan ställt in en anpassad kvalitetskonfiguration i Mumble. Välj den här inställningen för att behålla den. Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. Aktiverar dämpning av andra program när användare talar med dig. Detta betyder att så snart någon börjar tala i Mumble, kommer ljudet för andra program (som musikspelare) att dämpas så att du kan höra Mumble bättre. Apply some high contrast optimizations for visually impaired users Verkställ höga kontrastoptimeringar för synskadade användare Use high contrast graphics Använd grafik med hög kontrast Keep custom Text-To-Speech settings. Behåll anpassade Text-till-Tal-inställningar. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode <p> Öppna din kontrollpanel och gå till inspelningsinställningarna. Var säker på att mikrofonen är vald som aktiv ingång med högsta inspelningsvolym. Om det finns ett alternativ för att aktivera "Mikrofonförstärkning", se till att det är markerat. </p> <p> Tala högt, som om du är irriterad eller upphetsad. Minska volymen i kontrollpanelen för ljud tills baren stannar så högt som möjligt i randig och tom men <b>inte</b> i det genomkorsade området när du talar. </p> Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode Tala lugnt, som om du skulle prata mitt i natten och inte vill störa någon. Justera inställningen nedan så att baren flyttas till det tomma området när du talar, men i det randiga när du är tyst. Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode Nu behöver du justera följande inställning. De första yttranden du säger borde hamna i det tomma området (slutgiltigt tal). Vid tal borde du stanna inom det randiga (kan vara tal) och när du inte talar ska allt vara i det genomkorsade (definitivt inte tal). In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) Vid denna konfiguration kommer Mumble använda en <b>låg mängd bandbredd</b>. Detta kommer oundvikligen resultera i hög latens och dålig ljudkvalitet. Används endast den här konfigurationen om din anslutning ej klarar andra inställningar. (16kbit/s, 60ms per paket) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) Detta är den <b>rekommenderade standardkonfigurationen</b>. Den ger bra kvalitet, latens och bandbreddsanvändning. (40kbit/s, 20ms per paket) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) Denna konfiguration är endast rekommenderad för användning där bandbreddskapacitet inte är ett problem, som på ett lokalt nätverk. Konfigurationen ger den lägsta latensen som stöds av Mumble och <b>hög ljudkvalitet</b>. (72kbit/s, 10ms per paket) BanEditor Mumble - Edit Bans Mumble - Bannlysningar &Address &Adress &Mask &Mask Reason Anledning Start Börjar End Slutar User Användare Hash Hash &Add &Lägg till &Update &Uppdatera &Remove &Ta bort Ban List Bannlista Search field Sökfält This is the search field. Use it to find bans that have this username set in the username field. Detta är sökfältet. Använd det för att hitta bannlysta användare som använder smeknamnet. Who are you looking for? Vem letar du efter? No nickname Inget användarnamn IP address IP-adress No IP address Ingen IP-adress Reason for the ban Orsak för bannlysning No reason Ingen orsak Ban end date Slutdatum för bannlysning Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). Slutdatum för bannlysning. Om du sätter samma datum som start och slut så blir bannen permanent (gäller för alltid). Certificate hash Certifikat-hash No certificate hash Ingen certificat-hash Banned users Bannlysta användare This is a list with banned users. Det här är en lista med bannlysta användare. Use this button if you want to add a new ban. Använd den här knappen om du vill lägga till en ny bannlysning. Use this button if you want to update ban information. Använd den här knappen om du vill uppdatera informationen för bannlysningen. Use this button if you want to remove user from the ban list. Använd den här knappen om du vill ta bort en användare från bannlistan. Clear all fields Rensa alla fält This button clears all fields. Use it if you want to add a new ban. Den här knappen rensar alla fält. Använd den om du vill lägga till en ny bannlysning. Clear Rensa Ban List - %n Ban(s) Bannlista - %n Bannlysning(ar)Bannlista - %n Bannlysning(ar) CertView Name Namn Email E-post Issuer Utfärdare Expiry Date Utgångsdatum (none) (ingen) Self-signed Självsignerat CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. Kunde inte verifiera e-post.<br />Ange en giltig (eller blank) e-post för att fortsätta. There was an error generating your certificate.<br />Please try again. Det blev ett fel vid generering av ditt certifikat.<br />Försök igen. Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. Ditt certifikat och nyckel kunde inte exporteras till PKCS#12-formatet. Det kan finnas ett fel i ditt certifikat. The file could not be opened for writing. Please use another file. Filen kunde inte öppnas för skrivning. Använd en annan fil. The file's permissions could not be set. No certificate and key has been written. Please use another file. Filens behörigheter kunde inte verkställas. Ingen nyckel eller något certifikat har skrivits. Skicka en annan fil. The file could not be written successfully. Please use another file. Filen kunde inte skrivas. Använd en annan fil. The file could not be opened for reading. Please use another file. Filen kunde inte öppnas för läsning. Använd en annan fil. The file is empty or could not be read. Please use another file. Filen är tom eller kunde inte läsas. Använd en annan fil. The file did not contain a valid certificate and key. Please use another file. Filen innehöll inte ett giltigt certifikat och nyckel. Använd en annan fil. Select file to export certificate to Välj fil att exportera certifikat till Select file to import certificate from Välj fil att importera certifikat från Unable to import. Missing password or incompatible file type. Ej möjlig att importera. Lösenord saknas eller inkompatibel filtyp. <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. <b>Certifikatutgång:</b> Ditt certifikat håller på att gå ut. Du måste förnya det, annars kan du inte längre ansluta till servrar du är registrerad på. Certificates Certificate Management Certifikathantering Certificate Authentication Certifikatautentisering Authenticating to servers without using passwords Autentisering till servrar utan att använda lösenord Current certificate Nuvarande certifikat This is the certificate Mumble currently uses. Detta är det certifikat som Mumble för närvarande använder. Current Certificate Nuvarande certifikat Create a new certificate Skapa ett nytt certifikat This will create a new certificate. Detta kommer att skapa ett nytt certifikat. Import certificate from file Importera ett certifikat från en fil This will import a certificate from file. Detta kommer att importera ett certifikat från en fil. Import a certificate Importera ett certifikat Export Certificate Exportera certifikat This will export a certificate to file. Detta kommer att exportera ett certifikat till en fil. Export current certificate Exportera det nuvarande certifikatet Import Certificate Importera certifikat PKCS #12 Certificate import PKCS #12 Certifikatimportering <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble kan importera certifikat lagrade i PKCS #12-formatet. Detta är det format som används vid exportering av en nyckel från Mumble, men också vid exportering av nycklar från t.ex. Firefox, Internet Explorer eller Opera.</p><p>Om filen är lösenordsskyddad kommer du att behöva lösenordet för att kunna importera ditt certifikat.</p> Import from Importera från Filename to import from Filnamn att importera från This is the filename you wish to import a certificate from. Detta är filnamnet du vill importera ett certifikat från. Select file to import from Välj fil att importera från This opens a file selection dialog to choose a file to import a certificate from. Detta öppnar en dialog för att välja en fil att importera ett certifikat från. Open... Öppna... Password Lösenord Password for PKCS#12 file Lösenord för PKCS#12 fil This is the password for the PKCS#12 file containing your certificate. Detta är lösenordet för PKCS#12-filen som innehåller ditt certifikat. Certificate to import Certifikat att importera This is the certificate you are importing. Detta är det certifikat du importerar. Certificate Details Certifikatdetaljer Replace Certificate Ersätt certifikat Replace existing certificate with new certificate? Vill du ersätta det existerande certifikatet med ett nytt certifikat? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> <p>Du har redan ett certifikat lagrat i Mumble, som du nu försöker att ersätta.</p> <p>Om du uppgraderar till ett certifikat utfärdat till dig av ett pålitligt CA och e-postadresserna matchar ditt nuvarande certifikat är det fullt säkert att byta. Servrar du automatiskt ansluter till kommer att känna igen det starka certifikatet med din e-postadress. </p> <p>Om så inte är fallet, kommer du inte längre att kännas igen av någon server du tidigare varit autentiserad till. Om du inte varit registrerad på någon server än, är detta inget att oroa sig för. </p> <p> Är du säker på att du vill ersätta ditt certifikat? </p> This is the certificate Mumble currently uses. It will be replaced. Detta är certifikatet som Mumble för närvarande använder. Det kommer att ersättas. New certificate Nytt certifikat This is the new certificate that will replace the old one. Detta är det nya certifikat som kommer att ersätta det gamla. New Certificate Nytt certifikat Make a backup of your certificate Skapa en säkerhetskopia av ditt certifikat Export to Exportera till Filename to export to Filnamn att exportera till This is the filename you wish to export a certificate to. Detta är filnamnet du vill exportera ett certifikat till. Save As... Spara som... This is the certificate Mumble currently uses. It will be exported. Detta är certifikatet som Mumble för närvarande använder. Det kommer att exporteras. Generate a new certificate for strong authentication Generera ett nytt certifikat för stark autentisering <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> <p>Mumble kommer nu att generera ett starkt certifikat för autentisering till servrar.</p><p>Om du vill kan du ange extra information att lagra i certifikatet, som kommer att presenteras till servrar du ansluter till. Om du anger en giltig e-postadress kan du uppgradera till ett CA-utfärdat e-postcertifikat senare, som ger stark identifiering.</p> Name Namn Email E-post Your email address (e.g. johndoe@mumble.info) Din e-postadress (t.ex. johndoe@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. Detta är din e-postadress. Det är starkt rekommmenderat att ange en giltig e-postadress, då detta tillåter dig att uppgradera till ett starkt certifikat utan autentiseringsproblem. Your name (e.g. John Doe) Ditt namn (t.ex. John Doe) This is your name, and will be filled out in the certificate. This field is entirely optional. Detta är ditt namn som kommer att fyllas in i certifikatet. Detta fält är helt frivilligt. Finish Slutför Certificate-based authentication is ready for use Certifikatbaserad autentisering är redo att användas Enjoy using Mumble with strong authentication. Njut av att använda Mumble med stark autentisering. Automatic certificate creation Automatisk skapning av certifikat <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>Om du någonsin förlorar ditt nuvarande certifikat, som kommer att hända om din hårdvara går sönder eller du installerar om din dator kommer du ej längre att kunna autentisera till någon server du varit registrerad på. Det är därför <b>obligatoriskt</b> att du skapar en säkerhetskopia av dina certifikat. Vi rekommenderar starkt att du lagrar denna säkerhetskopia på borttagningsbar lagring, såsom ett USB-minne.</p> <p>Kom ihåg att den här filen inte kommer att krypteras, så om någon får tillgång till den kommer de kunna identifiera dig. Ta därför väl hand om det.</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> ChanACL None Ingen Traverse Åtkomst Enter Gå med Speak Tala Mute/Deafen Avaktivera mikrofon/ljud Make channel Skapa kanal Make temporary Skapa temporär Link channel Länka kanal This represents no privileges. Detta motsvarar inga behörigheter. This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. Detta motsvarar total tillgång till kanalen, såsom behörighet att ändra grupp- och ACL-information. Dessa behörigheter innebär också tillgång till allt annat. This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. Detta motsvarar behörigheten för att ändra åkomst för kanalen. Om en användare nekas den här behörigheten, kan han inte komma åt denna kanalen eller någon underkanal över huvud taget, oavsett andra behörigheter i underkanalerna. This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. Detta motsvarar behörigheten för att gå med i kanalen. Om du har en listad kanalstruktur vill du kanske ge alla "Åtkomst", men begränsa "Gå med" i roten för din lista. This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. Detta motsvarar behörigheten för att tala i en kanal. Användare utan denna behörighet kommer att tystas av servern (visas som avaktiverad mikrofon) och kommer inte att kunna tala tills deras mikrofon aktiveras av någon med behörigheter att göra det. This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. Detta motsvarar behörigheten för att viska till den här kanalen från utsidan. Detta fungerar precis som <i>tala</i> behörigheten, men verkställs till paket med Viska-knappen nedtryckt. Detta kan användas för att skicka till flera kanaler utan länkning. This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. Detta motsvarar behörigheten för att avaktivera mikrofon/ljud för andra användare. När mikrofonen är avstängd kommer användaren vara det tills mikrofonen aktiveras av en annan användare med behörigheter, eller återansluter till servern. This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. Detta motsvarar behörigheten för att flytta en användare till en annan kanal eller slänga ut honom från servern. För att verkligen flytta en användare måste användaren som flyttar ha behörigheten "Flytta" i målskanalen, eller så måste användaren manuellt tillåtas att gå med i kanalen. Användare med denna behörighet kan flytta användare till kanaler där den valda användaren vanligtvis inte har behörigheter att gå med i. This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. Detta motsvarar behörigheten för att skapa underkanaler. Användaren som skapar underkanalen kommer läggas till i administratörsgruppen för underkanalen. This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. Detta motsvarar behörigheten för att skapa en temporär underkanal. Användaren som skapar underkanalen kommer läggas till i administratörsgruppen för underkanalen. Temporära kanaler lagras inte och kommer att försvinna så snart den sista användaren lämnar. This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. Detta motsvarar behörigheten för att länka kanaler. Användare i länkade kanaler kan höra varandra sålänge användaren som talar har behörigheten "Tala" i kanalen med lyssnare. Du behöver behörigheten för att länka i båda kanalerna för att skapa en länk, men endast i en kanal för att ta bort den. This represents the permission to write text messages to other users in this channel. Detta motsvarar behörigheten för att skriva textmeddelanden till andra användare i kanalen. This represents the permission to forcibly remove users from the server. Detta motsvarar behörigheten för att tvinga borttagning av användare från servern. This represents the permission to permanently remove users from the server. Detta motsvarar behörigheten för att permanent ta bort användare från servern. This represents the permission to register and unregister users on the server. Detta motsvarar behörigheten för att registrera och avregistrera användare på servern. This represents the permission to register oneself on the server. Detta motsvarar behörigheten för att registrera sig själv på servern. Whisper Viska Move Flytta Text message Textmeddelande Kick Slänga ut Ban Bannlysa Register User Registrera användare Register Self Registrera sig Write ACL Skriva ACL ChatbarTextEdit Paste and &Send Paste and send Klistra in och &skicka <center>Type chat message here</center> <center>Skriv chattmeddelande här</center> ClientUser Friend Vän Authenticated Autentiserad Priority speaker Prioriterad talare Recording Spelar in Muted (server) Mikrofon avaktiverad (server) Deafened (server) Ljud avaktiverat (server) Local Ignore (Text messages) Lokal blockering (textmeddelanden) Local Mute Blockera ljud (lokalt) Muted (self) Mikrofon avaktiverad (användare) Deafened (self) Ljud avaktiverat (användare) ConfigDialog Accept changes Acceptera ändringar This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. Den här knappen kommer att acceptera nuvarande inställningar och återgå till programmet.<br />Inställningarna kommer att lagras till disken där du lämnade programmet. Reject changes Ångra ändringar This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. Den här knappen kommer att ångra alla ändringar och återgå till programmet.<br />Inställningarna kommer att återställas till tidigare positioner. Apply changes Verkställ ändringar This button will immediately apply all changes. Den här knappen kommer omedelbart att verkställa alla ändringar. Undo changes for current page Ångra ändringar för den nuvarande sidan This button will revert any changes done on the current page to the most recent applied settings. Den här knappen kommer att ångra alla inställningar som gjorts på den nuvarande sidan till de senast verkställda inställningarna. Restore defaults for current page Återställ till standardinställningar på nuvarande sida This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. Den här knappen kommer endast att återställa inställningarna för den nuvarande sidan till sitt ursprung. Andra sidor kommer inte att ändras.<br />För att återställa alla inställningar till sitt ursprung behöver du använda den här knappen på alla sidor. Mumble Configuration Mumble-konfiguration ConnectDialog Connecting to %1 Ansluter till %1 Enter username Ange användarnamn Adding host %1 Lägger till värd %1 Servername Servernamn Hostname Värdnamn Bonjour name Bonjournamn Port Port Addresses Adress Website Hemsida Packet loss Paketförluster Ping (80%) Ping (80%) %1 ms %1 ms Ping (95%) Ping (95%) Bandwidth Bandbredd %1 kbit/s %1 kbit/s &Connect &Anslut &Filters &Filter Unknown Users Användare Version Version Failed to fetch server list Serverlistan kunde inte hämtas Mumble Server Connect Mumble - Anslut till server Ping Ping Remove from Favorites Ta bort från favoriter Add custom server Lägg till anpassad server Show all servers that respond to ping Visa alla servrar som svarar på ping Show all servers with users Visa alla servrar med användare Show all servers Visa alla servrar &Copy &Kopiera Copy favorite link to clipboard Kopiera favoritlänk till urklipp &Paste &Klistra in Paste favorite from clipboard Klistra in favorit från urklipp &Edit... &Ändra... &Add New... &Lägg till ny... Add to &Favorites Lägg till i &Favoriter Open &Webpage Öppna &hemsida Show &Reachable Visa &Tillgängliga Show &Populated Visa &Populära Show &All Visa &Alla ConnectDialogEdit Edit Server Ändra server Name of the server Serverns namn A&ddress A&dress Internet address of the server. Internet address of the server. Webbadress till servern. <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Adress</b><br/> Internetadress för servern. Detta kan vara ett normalt värdnamn, en IPv4/IPv6-adress eller en Bonjour-identitet. Bonjour-identiteter måste ha ett '@' före sig för att kännas igen av Mumble. &Port &Port Port on which the server is listening Porten som servern lyssnar till <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. <b>Port</b><br/> Porten servern lyssnar till. Om servern är identifierad av en Bonjour-identifierare kommer detta fält att ignoreras. &Username &Användarnamn Username to send to the server Användarnamn att skicka till servern <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. <b>Användarnamn</b><br/> Användarnamnet skickas till servern. Var medveten om att servern kan införa begränsningar på hur ett användarnamn ska se ut. Ditt användarnamn kan också redan vara taget av en annnan användare. Label Namn Add Server Lägg till server You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 Password Lösenord Password to send to the server Lösenord att skicka till servern <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. <b>Lösenord</b><br/> Lösenordet som kommer att skickas till servern vid anslutning. Lösenordet behövs när du ansluter som <i>SuperUser</i> eller till en server med lösenordsautentisering. Om inget är angivet, kommer du att förfrågas vid anslutning. Show password Visa lösenord <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. <b>Namn</b><br/> Serverns namn. Detta är vad servern kommer att kallas i din serverlista, som du väljer själv. Local server label Lokal server namn 127.0.0.1 127.0.0.1 64738 64738 Your username Ditt användarnamn Your password Ditt lösenord &Fill &Fill CoreAudioSystem Default Device Standardenhet CrashReporter Mumble Crash Report Mumble Kraschrapport <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> <p><b>Vi är mycket ledsna, men det verkar som att Mumble har kraschat. Vill du skicka en kraschrapport till utvecklarna av Mumble?</b></p><p>Kraschrapporten innehåller en mindre kopia av minnet från kraschen och kommer att hjälpa utvecklarna att lösa problemet.</p> Email address (optional) E-postadress (valfritt) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash Beskriv kortfattat vad du gjorde då kraschen ägde rum, på engelska Send Report Skicka rapport Don't send report Skicka inte rapport Crash upload successful Kraschuppladdning lyckades Thank you for helping make Mumble better! Tack för att du hjälper till att göra Mumble bättre! Crash upload failed Kraschuppladdning misslyckades We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. Tyvärr, men det verkar som att kraschuppladdningen misslyckades med felet %1 %2. Du borde informera en utvecklare om detta. This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 Det finns tydligen en bugg i koden för att rapportera krascher, vi kunde heller inte ladda upp rapporten. Du borde informera en utvecklare om felet %1 Uploading crash report Laddar upp kraschrapportering Abort upload Avbryt uppladdning DXAudioInput Default DirectSound Voice Input Standard-ljudingång för DirectSound Opening chosen DirectSound Input device failed. No microphone capture will be done. Kunde inte öppna den valda ingångsenheten för DirectSound. Ingen mikrofon kommer att användas. Opening chosen DirectSound Input failed. Default device will be used. Kunde inte öppna den valda ingången för DirectSound. Standardenheten kommer att användas. Lost DirectSound input device. Förlorade ingångsenheten för DirectSound. DXAudioOutput Default DirectSound Voice Output Standardljudutgång för DirectSound Opening chosen DirectSound Output failed. Default device will be used. Kunde inte öppna den valda utgångsenheten för DirectSound. Standardenheten kommer att användas. Lost DirectSound output device. Förlorade utgångsenheten för DirectSound. Opening chosen DirectSound Output failed. No audio will be heard. Kunde inte öppna den valda utgången för DirectSound. Inget ljud kommer att höras. Database Mumble failed to initialize a database in any of the possible locations. Mumble kunde inte initiera en databas i någon av dessa möjliga platser. The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. Databasen '%1' är skrivskyddad. Mumble kan inte lagra serverinställningar (t.ex. SSL certifikat) förrän du fixat detta problem. DeveloperConsole Developer Console Utvecklarkonsol DockTitleBar Drag here Dra här GlobalShortcut Shortcuts Genvägar List of configured shortcuts Lista med konfigurerade genvägar Function Funktion Data Data Shortcut Genväg Suppress Blockera Add new shortcut Lägg till ny genväg This will add a new global shortcut Detta kommer lägga till en ny global genväg &Add &Lägg till Remove selected shortcut Ta bort vald genväg This will permanently remove a selected shortcut. Detta kommer ta bort en vald genväg permanent. &Remove &Ta bort <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> <html><head/><body><p>Mumble kan för närvarande bara använda musknappar och vissa tangenter (Alt, Ctrl, Cmd, osv.) för globala genvägar.</p><p>Om du vill ha bättre flexibilitet, kan du använda <span style=" font-style:italic;">Åtkomst för tillgänglighetsenheter</span> i systemets alternativ för hjälpmedel. Kom ihåg att den här ändringen möjligtvis ochså kan tillåta skadlig programvara att läsa vad som skrivs på ditt tangentbord.</p></body></html> Open Accessibility Preferences Öppna tillgänglighetsinställningar Skip Hoppa över Enable Global Shortcuts Aktivera globala snabbtangenter <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. Additional Shortcut Engines <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. Enable Windows hooks <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. Enable GKey Aktivera GKey <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. Enable XInput Aktivera XInput <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. Enable shortcuts in privileged applications GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> <html><head/><body><p>Mumble kan för närvarande bara använda musknappar och vissa tangenter (Alt, Ctrl, Cmd, osv.) för globala genvägar. </p><p>Om du vill ha bättre flexibilitet, kan du lägga till Mumble som säkert tillgänglighetsprogram i Säkerhet & Sekretess inställningspanelen i dina Mac's Systeminställningar.</p<><p>I Säkerhet & Sekretess inställningspanelen, byt till Sektretess fliken. Efteråt välj tillgänglighet (nästan längst ner) i listan till vänster. Slutligen, lägg till Mumble i listan över betrodda tillgänglighetsprogram.</body></html> Shortcuts Genvägar Shortcut button combination. Knappkombination för genväg. <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. <b>Detta är den globala genvägs-knappkombinationen.</b><br />Klicka på detta fält och tryck på knappen/knappkombinationen att binda. Dubbelklicka för att rensa. Suppress keys from other applications Blockera knappar från andra program <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. <b>Detta förhindrar knapptryck från andra program.</b><br />Vid aktivering av detta kommer knappen att blockeras (åtminstone den senaste knappen från en kombination) från andra program. Kom ihåg att alla knappar inte kan blockeras. GlobalShortcutTarget Whisper Target Viskningsmål Whisper to list of Users Viska till en lista med användare Channel Target Kanalmål Restrict to Group Begränsa till grupp If specified, only members of this group will receive the whisper. Endast medlemmar i den här gruppen kommer att ta emot viskningarna, om så är angivet. List of users Lista med användare Add Lägg till Remove Ta bort Modifiers Redigerare Do not send positional audio information when using this whisper shortcut. Skicka inte positionell ljudinformation när denna viskningsgenväg används. Ignore positional audio Ignorera positionellt ljud Shout to Linked channels Skrik till länkade kanaler Shout to subchannels Skrik till underkanaler Shout to Channel Skrik till kanal The whisper will also be transmitted to linked channels. Viskningen kommer också att överföras till länkade kanaler. The whisper will also be sent to the subchannels of the channel target. Viskningen kommer också att skickas till underkanalerna för den valda kanalen. GlobalShortcutX Mouse %1 Mus %1 JackAudioSystem Hardware Ports Mono Stereo LCD Not connected Ej ansluten LCDConfig Enable this device Aktivera den här enheten LCD LCD Devices Enheter Name Namn <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> <p>Här är listan med tillgängliga LCD-enheterpå din dator. Enheter listas enligt namn,men inkluderar även storleken på skärmen. Mumble stödjer utskrift till flera LCD-enheter samtidigt.</p> <h3>Storlek:</h3> <p> Detta fält beskriver storleken av en LCD-enhet. Storleken mäts i pixlar (för grafiska LCD:er), eller med tecken (för LCD:er med tecken).</p> <h3>Aktiverat:</h3> <p>Detta beslutar om Mumble ska skrivas till en särskild LCD-enhet.</p> Size Storlek Enabled Aktiverad Views Visningar Minimum Column Width Minimal kolumnbredd <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> <p>Detta alternativ beslutar den lägsta kolumnbredd i användarvyn.</p> <p>Om för många människor talar samtidiga kommer användarvyn dela sig själv till kolumner. Du kan använda detta alternativ för att välja en kompromiss mellan antalet användare som visas på LCD samt bredd för användarnamn.</p> This setting decides the width of column splitter. Den här inställningen bestämmer bredden för kolumndelning. Splitter Width Delningsbredd Log Debug Felsök Critical Kritiskt Warning Varning Information Information Server Connected Server ansluten Server Disconnected Server frånkopplad Other self-muted/deafened Någon avaktiverade sin mikrofon/sitt ljud Permission Denied Behörighet nekad Text Message Textmeddelande User Joined Server Användare anslöt till servern User Left Server Användare lämnade servern User recording state changed Inspelningsstatus för användare ändrad User kicked (you or by you) Användare utslängd (du eller av dig) User kicked Användare utslängd You self-muted Du avaktiverade din mikrofon User muted (you) Mikrofon avaktiverad (du) User muted (by you) Mikrofon avaktiverad (av dig) User muted (other) Mikrofon avaktiverad (annan) User Joined Channel Användare gick med i kanalen User Left Channel Användare lämnade kanalen You self-unmuted Du aktiverade din mikrofon You self-deafened Du avaktiverade ditt ljud You self-undeafened Du aktiverade ditt ljud User renamed Användare omdöpt You Joined Channel Du gick med i kanalen You Joined Channel (moved) Du gick med i kanlen (flyttat) User connected and entered channel User left channel and disconnected Private text message the server servern [[ Invalid size ]] [[ Ogiltig storlek ]] [[ Text object too large to display ]] [[ Textobjekt för stort för att visas ]] [Date changed to %1] [Datum ändrad till %1] link to %1 länk till %1 FTP link to %1 player link spelarlänk channel link kanallänk %1 link %1 länk LogConfig Toggle console for %1 events Växla konsoll för %1 händelser Toggle pop-up notifications for %1 events Växla pop-up-notifieringar för %1 händelser Toggle Text-To-Speech for %1 events Växla Text-till-Tal för %1 händelsesr Click here to toggle sound notification for %1 events Klicka här för att växla ljudnotifieringar för %1 händelser Toggle window highlight (if not active) for %1 events Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change Sökväg till ljudfilen för ljudnotifieringar i fallet för %1 händelser<br />Ett klick för att spela<br />Dubbelklick för att ändra Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. Klicka här för att växla konsoll-utgång för %1 händelser.<br />Vid markering kommer Mumble att ge ut alla %1 händelser i loggen. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. Klicka här för att växla pop-up-notifieringar för %1 händelser.<br />Vid markering kommer en notifierings-pop-up skapas av Mumble för varje %1 händelse. Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. Sökväg till ljudfilen som används för ljudnotifieringar i fallet för %1 händelser.<br />Ett klick för att spela<br />Dubbelklick för att ändra<br />Var säker på att ljudnotifieringar för dessa händelser är aktiverade annars kommer inte detta fält att ha någon betydelse. Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. Klicka här för att växla Text-till-Tal för %1 händelser.<br />Vid markering kommer Mumble att använda Text-till-Tal för att läsa %1 händelser högt för dig. Text-till-Tal kan också läsa innehåll för händelsen som det inte finns ljudfiler för. Text-till-Tal och ljudfiler kan inte användas tillsammans. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. Klicka här för att växla ljudnotifieringar för %1 händelser.<br />Vid markering kommer Mumble att använda en ljudfil fördefinierad av dig för att indikera %1 händelser. Ljudfiler och Text-till-Tal kan inte användas tillsammans. Messages Meddelanden Message Meddelande Console Konsoll Notification Notifiering Text-To-Speech Text-till-Tal Soundfile Ljudfil Path Sökväg Text To Speech Text-till-Tal Volume Volym Volume of Text-To-Speech Engine Volym för Text-till-Tal-motorn <b>This is the volume used for the speech synthesis.</b> <b>Detta är volmen som används för talsyntesen.</b> Length threshold Längdtröskel Message length threshold for Text-To-Speech Engine Längdtröskeln för meddelande till Text-till-Tal-motorn <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. <b>Detta är längden tröskel som används för Text-till-Tal-motorn.</b><br />Meddelanden längre är denna gräns kommer inte att läsas högt. Characters tecken Whisper Viska If checked you will only hear whispers from users you added to your friend list. Vid markering kan du endast höra viskningar från användare du lagt till på din vänlista. Only accept whispers from friends Acceptera endast viskningar från vänner If enabled text messages you send will be read back to you with TTS Vid aktivering kommer textmeddelanden du skickar läsas tillbaka till dig med TTS Read back own messages Läs upp egna meddelanden Chat Log Chattlogg Maximum chat length Högsta chattlängd Unlimited Obegränsat Lines Rader Highlight LookConfig System default Systemstandard None Ingen Only with users Bara med användare All Alla Ask Fråga Do Nothing Gör ingenting Move Flytta <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory <a href="%1">Bläddra</a> User Interface Användargränssnitt This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. Detta ställer in vilka kanaler som automatiskt ska expanderas. <i>Inga</i> och <i>Alla</i> kommer expandera alla eller inga kanaler medan <i>Endast med användare</i> kommer att expandera och kollapsa kanaler, då användare går med i och lämnar dem. List users above subchannels (requires restart). Lista användare ovan underkanaler (kräver omstart). <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. <b>Om detta är inställt kommer användare att visas ovan underkanaler i kanalvyn.</b><br />En omstart av Mumble krävs för att se förändringen. Users above Channels Visa användare ovan kanaler <b>If set, will verify you want to quit if connected.</b> <b>Vid markering, kommer vi att verifiera om du vill avsluta vid anslutning.</b> Show number of users in each channel Visa antalet användare i varje kanal Show channel user count Visa antalet användare i kanalen Language Språk Language to use (requires restart) Språk att använda (kräver omstart) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. <b>Detta ställer in vilket språk Mumble ska använda.</b><br />Du måste starta om Mumble för att använda det nya språket. Look and Feel Utseende och känsla Layout Utseende Classic Klassisk Stacked Staplade Hybrid Blandat Custom Anpassad This changes the behavior when moving channels. Detta ändrar beteendet när du flyttar kanaler. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. Detta ställer in beteendet för kanaldragningar, vilket kan användas för att undvika oavsiktlig dragning. <i>Flytta</i> flyttar kanalen utan att fråga. <i>Gör ingenting</i> gör ingenting och visar ett felmeddelande. <i>Fråga</i> använder en meddelanderuta för att bekräfta om du verkligen vill flytta kanalen. Expand Expandera When to automatically expand channels Expandera automatiskt kanaler Channel Dragging Kanaldragning Ask whether to close or minimize when quitting Mumble. Fråga om att stänga eller minimera vid avslut av Mumble. Ask on quit while connected Fråga vid avslut om stängning Always On Top Alltid överst <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> <b>Om detta är inställt kommer minimering av huvudfönstret för Mumble göra att det göms och endast kan kommas åt från meddelandefältet. Annars kommer det att minimeras som ett vanligt fönster gör.</b> Hide in tray when minimized Göm i aktivitetsfältet vid minimering Hide the main Mumble window in the tray when it is minimized. Göm huvudfönstret i aktivitetsfältet när det är minimerat. This setting controls when the application will be always on top. Den här inställningen kontrollerar när programmet alltid ska vara överst. Never Aldrig Always Alltid In minimal view I minimal vy In normal view I normal vy Displays talking status in system tray Visar tal-status i aktivitetsfältet Show talking status in tray icon Visa tal-status i ikonen i aktivitetsfältet This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. Denna inställning kontrollerar i vilka situationer som programmet ska visas överst. Om du väljer <i>Aldrig</i> kommer programmet inte att visas överst. <i>Alltid</i> kommer alltid att visa programmet överst. <i>I minimal vy</i> / <i>I normal vy</i> kommer endast att behålla programmet överst om den minimala vyn är aktiverad / avaktiverad. Show context menu in menu bar Visa innehållsmenyer i menyfältet Apply some high contrast optimizations for visually impaired users Verkställ höga kontrastoptimeringar för synskadade användare Optimize for high contrast Optimera för hög kontrast Application Program Adds user and channel context menus into the menu bar Lägger till innehållsmenyer för användare och kanaler i menyraden Tray Icon Ikon i aktivitetsfältet Channel Tree Kanalträd Use selected item as the chat bar target Använd valt objekt som mål för chattfält Filter automatically hides empty channels Filter gömmer automatiskt tomma kanaler Show transmit mode dropdown in toolbar Visa överföringsläge i verktygsfältet Theme Tema Theme to use to style the user interface Tema används för att anpassa utseendet av användargränssnittet. <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. <b>Konfigurerar vilket tema Mumble användargränssnittet ska vara utformad med<b><br />Mumble kommer att plocka teman från en vissa kataloger och visar dem i den här listan. Det du väljer kommer att användas för att anpassa utseendet av Mumble. Detta inkluderar färger, ikoner och mer. User Dragging This changes the behavior when moving users. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. Enable Developer menu Aktivera utvecklarmeny When in custom layout mode, checking this disables rearranging. Lock layout Lås layout MainWindow Root Rot Push-to-Talk Global Shortcut Tryck-för-att-Tala Push and hold this button to send voice. Global Shortcut Tryck och håll nere den här knappen för att skicka röst. This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut Detta konfigurerar tryck-för-att-tala-knappen. Så länge du håller nere den här knappen kommer du överföra röst. Reset Audio Processor Global Shortcut Återställ ljudprocessor Unlink Plugin Global Shortcut Avaktivera insticksmodul Push-to-Mute Global Shortcut Tryck-för-att-Tysta Join Channel Global Shortcut Gå med i kanal Toggle Overlay Global Shortcut Växla i-spelet funktionen Toggle state of in-game overlay. Global Shortcut Växla läget av i-spelet funktionen. Toggle Minimal Global Shortcut Växla minimal Volume Up (+10%) Global Shortcut Volym upp (+10%) Volume Down (-10%) Global Shortcut Volym ner (-10%) Mumble Mumble Mumble -- %1 Mumble - %1 &Window &Fönster Minimize Minimera Ctrl+M Ctrl+M Close Stäng Mumble is currently connected to a server. Do you want to Close or Minimize it? Mumble är för närvarande anslutet till en server. Vill du stänga eller minimera? Mute Self Global Shortcut Avaktivera mikrofon Set self-mute status. Global Shortcut Aktivera eller avaktivera mikrofon. This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut Detta kommer att aktivera eller avaktivera din mikrofon. Om du avaktiverar detta kommer du också aktivera ljudet. Deafen Self Global Shortcut Avaktivera ljud Set self-deafen status. Global Shortcut Aktivera eller avaktivera ljud. This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut Detta kommer aktivera eller avaktivera ljudet. Om du har detta avaktiverat kommer du också avaktivera mikrofon. Whisper/Shout Whisper Viska/Skrika <center>Not connected</center> Not connected <center>Ej ansluten</center> Clear Rensa Opening URL %1 Öppnar URL %1 File does not exist Filen finns ej File is not a configuration file. Filen är inte en konfigurationsfil. Settings merged from file. Inställningar sammanslagna från fil. URL scheme is not 'mumble' URL schemat kan inte användas av Mumble This version of Mumble can't handle URLs for Mumble version %1.%2.%3 Den här versionen av Mumble kan inte hantera URLer för Mumble version %1.%2.%3 Connecting to %1 Ansluter till %1 Enter username Ange användarnamn Connecting to server %1. Ansluter till servern %1. Reconnecting. Återansluter. Transmit Mode set to Continuous Överföringsläge inställt till Kontinuerligt <p>%1 (%2)<br />%3</p> <p>%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> <h2>Ljudkanal</h2><p>Krypterad med 128 bitars OCB-AES128<br />Genomsnittlig fördröjning: %1 ms (%4 avvikelse)</p> Register yourself as %1 Registrera dig som %1 <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <p>Du kommer registrera dig på den här servern. Denna åtgärd kan inte ångras. Ditt användarnamn kan inte heller ändras när detta är gjort. Du kommer vara känd som "%1" på den här servern.</p><p>Är du säker på att du vill registrera dig?</p> <h2>Version</h2><p>Protocol %1</p> <h2>Version</h2><p>Protokoll %1.</p> <p>No build information or OS version available</p> <p>Ingen versionsinformation eller OS version tillgänglig.</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) Anslutningen är krypterad och autentiserad med %1 och använder %2 som nyckelbytesmekanism (%3) The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) Anslutningen är krypterad och använder %1, med %2 för meddelandeautentisering och %3 som nyckelbytesmekanism (%4) The connection is secured by the cipher suite that OpenSSL identifies as %1 Anslutningen är säkrad med cipher suiten vilken OpenSSL identifierar som %1 <p>The connection provides perfect forward secrecy</p> <p>Anslutningen stödjer perfect forward secrecy</p> <p>The connection does not provide perfect forward secrecy</p> <p>Anslutningen stödjer inte perfect forward secrecy</p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> <h2>Kontrollkanal</h2><p>Anslutningen använder %1</p>%2%3<p>Genomsnittlig fördröjning: %4ms (%5 avvikelse)</p><p>Fjärrvärd %6 (port %7)</p> Voice channel is sent over control channel Ljudkanal skickas över kontrollkanal. Register user %1 Registrera användare %1 <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> <p>Du kommer registrera %1 på servern. Denna åtgärd kan inte ångras. Användarnamnet kan inte ändras. Som registrerad användare kommer %1 ha tillgång till servern även om du ändrar lösenordet.</p><p>Från och med nu kommer %1 att bli autentiserad med det certifikat som för närvarande används.</p><p>Är du säker på att du vill registrera %1?</p> Kicking user %1 Slänger ut %1 Banning user %1 Bannlyser användare %1 View comment on user %1 Visa kommentar på %1 Message to channel %1 Meddelande till kanalen %1 Connected. Ansluten. <li>Expected certificate digest (SHA-1): %1</li> Server presented a certificate which failed verification. Servern använder ett certifikat som inte kan verifieras. <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> SSL Version mismatch SSL-version matchar inte Server connection failed. Serveranslutning misslyckades. <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>Skicka ett meddelande till kanalen "%1" här</center> <center>Type message to user '%1' here</center> Type message to user '%1' here <center>Skriv ett meddelande till användaren "%1" här</center> Choose image file Välj bildfil Failed to load image Kunde inte ladda bild Could not open file for reading. Kunde inte öppna fil för läsning. Image format not recognized. Bildformatet stöds ej. &User &Användare &Channel &Kanal Use in conjunction with Whisper to. Global Shortcut Används tillsammans med Viska till. This will switch the states of the in-game overlay. Global Shortcut Detta kommer ändra i-spelet-läget. Link Channel Global Shortcut Länka kanal Cycle Transmit Mode Global Shortcut Växla överföringsläge Set Transmit Mode to Push-To-Talk Global Shortcut Set Transmit Mode to Continuous Global Shortcut Set Transmit Mode to VAD Global Shortcut Send Text Message Global Shortcut Skicka textmeddelande Send Clipboard Text Message Global Shortcut This will send your Clipboard content to the channel you are currently in. Global Shortcut Continuous Kontinuerligt Voice Activity Ljudaktivitet Push-to-Talk Tryck-för-att-Tala Mumble - Minimal View -- %1 Mumble - Minimal Vy -- %1 Cancel Avbryt Save Image As... Spara bilden som... Save Image File Spara bildfilen Could not save image: %1 Kunde inte spara bilden: %1 Change your comment Ändra din kommentar Transmit Mode set to Voice Activity Överföringsläge inställt till Ljudaktivitet Transmit Mode set to Push-to-Talk Överföringsläge inställt till Tryck-för-att-Tala <p>Connected users: %1/%2</p> <p>Anslutna användare: %1/%2</p> UDP Statistics UDP-statistik To Server Till server From Server Från server Good Bra Late Sent Lost Förlorat Resync Omsynkroniserat <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> <h2>Ljudbandbredd</h2><p>Maximalt %1 kbit/s<br />Nuvarande %2 kbit/s<br />Kodek: %3</p> Mumble Server Information Mumble Server-information &View Certificate &Visa certifikat Enter reason Ange anledning Sending message to %1 Skickar meddelande till %1 To %1: %2 Till %1: %2 Message to %1 Meddelande till %1 Are you sure you want to reset the comment of user %1? Är du säker på att du vill återställa kommentaren av användaren %1? Are you sure you want to reset the avatar of user %1? Är du säker på att du vill återställa visningsbilden för användaren %1? Are you sure you want to delete %1 and all its sub-channels? Är du säker på att du vill ta bort %1 och alla dess underkanaler? Sending message to channel %1 Skickar meddelande till kanalen %1 Message to tree %1 Meddelande till träd %1 To %1 (Tree): %2 (Tree) %1: %2 Till %1 (Träd): %2 Unmuted and undeafened. Ljud och mikrofon aktiverad. Unmuted. Mikrofon aktiverad. Muted. Mikrofon avaktiverad. Muted and deafened. Mikrofon och ljud avaktiverat. Deafened. Ljud avaktiverat. Undeafened. Ljud aktiverat. Restart Mumble? Starta om Mumble? Some settings will only apply after a restart of Mumble. Restart Mumble now? Några inställningar kommer endast att gälla efter en omstart av Mumble. Starta om Mumble nu? About Qt Om Qt SSL Verification failed: %1 SSL-verifiering misslyckades: %1 <li>Server certificate digest (SHA-1): %1</li> <b>WARNING:</b> The server presented a certificate that was different from the stored one. <b>VARNING:</b> Servern använder ett certifikat som inte är samma som det lagrade. This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. Den här servern använder en äldre krypteringsstandard och stöds ej längre av nyare versioner av Mumble. Server connection failed: %1. Serveranslutning misslyckades: %1. Disconnected from server. Frånkopplad från servern. Invalid username Ogiltigt användarnamn You connected with an invalid username, please try another one. Du anslöt med ett ogiltigt användarnamn, försök med ett annat. Username in use Användarnamn finns redan That username is already in use, please try another username. Användarnamnet används redan, försök med ett annat användarnamn. Wrong certificate or password Felaktigt certifikat eller lösenord Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. Felaktigt certifikat eller lösenord för registrerad användare. Om du är säker på att denna användaren skyddas av ett lösenord, försök igen. Om inte, avbryt och kontrollera ditt certifikat eller användarnamn. Wrong password Felaktigt lösenord Wrong server password for unregistered user account, please try again. Felaktigt serverlösenord för oregistrerat användarkonto, försök igen. Images (*.png *.jpg *.jpeg) Bilder (*.png *.jpg *.jpeg) C&onfigure K&onfigurera &Help &Hjälp Log Logg This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. Detta visar all ny aktivitet. Anslutning till servrar, fel- och informationsmeddelanden visas här.<br />För att konfigurera vilka meddelanden som ska visas här kan du använda <b>Inställningar</b> kommandot från menyn. &Quit Mumble &Avsluta Mumble Closes the program Stänger programmet Exits the application. Avslutar programmet. Ctrl+Q Ctrl+Q Open the server connection dialog Anslut till server &Disconnect &Koppla ifrån Disconnect from server Frånkopplad från servern Disconnects you from the server. Kopplar ifrån dig från servern. Show information about the server connection Visa information om serveranslutningen This will show extended information about the connection to the server. Detta kommer visa utökad information om anslutningen till servern. &Mute Avaktivera &mikrofon &Deafen Avaktivera &ljud &Local Mute Avaktivera mikrofon (&lokalt) Send a Text Message Skicka ett textmeddelande Sends a text message to another user. Skickar ett textmeddelande till en annan användare. Add new channel Lägg till en ny kanal This adds a new sub-channel to the currently selected channel. Detta lägger till en ny underkanal till den nuvarande valda kanalen. Remove channel Ta bort kanal This removes a channel and all sub-channels. Detta tar bort kanalen och alla underkanaler. Edit Groups and ACL for channel Ändra grupper och ACL för kanalen This opens the Group and ACL dialog for the channel, to control permissions. Detta öppnar grupp- och ACL-dialogen för kanalen, för att kontrollera behörigheter. &Link &Länka Link your channel to another channel Länka din kanal till en annan This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. Detta är chattboxen<br />Om du anger text här och trycker på enter kommer texten skickas till användaren eller kanalen som var vald. Om inget är valt kommer meddelandet att skickas till din nuvarande kanal. Chatbar Chattbox Shows a dialog of registered servers, and also allows quick-connect. Visar en dialog med registrerade servrar, tillåter även snabbanslutning. Kick user (with reason) Släng ut användare (med anledning) Kick selected user off server. You'll be asked to specify a reason. Slänger ut vald användare från servern. Du kommer tillfrågas att specifiera en anledning. Mute user Tysta användare Mute or unmute user on server. Unmuting a deafened user will also undeafen them. Aktivera eller avaktivera mikrofon för en användare på servern. Om du aktiverar mikrofonen för en användare kommer ljudet också att aktiveras. Kick and ban user (with reason) Släng ut och bannlys användare (med anledning) Kick and ban selected user from server. You'll be asked to specify a reason. Släng ut och bannlys vald användare från servern. Du kommer att bli tillfrågad att specifiera en anledning. Deafen user Avaktivera ljud för användare Deafen or undeafen user on server. Deafening a user will also mute them. Aktivera eller avaktivera ljudet för en användare på servern. Om du avaktiverar ljudet för en användare, kommer också mikrofonen att avaktiveras. Mute user locally Avaktivera mikrofon för användare lokalt Mute or unmute user locally. Use this on other users in the same room. Aktivera eller avaktivera mikrofon för en användare lokalt. Använd detta på andra användare i samma rum. This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. Detta länkar din nuvarande kanal till den valda kanalen. Om användare i en kanal har behörighet att tala i en annan kanal kan användare nu höra varandra. Detta är en permanent länk och kommer att pågå tills servern startats om, eller tills den är borttagen manuellt. Se genvägar för Tryck-för-att-Länka. &Unlink Channel Avlä&nka Unlink your channel from another channel Avlänka din kanal från en annan This unlinks your current channel from the selected channel. Detta avlänkar din nuvarande kanal från den valda kanalen. Unlinks your channel from all linked channels. Avlänkar din kanal från alla länkade kanaler. This unlinks your current channel (not the selected one) from all linked channels. Detta avlänkar din nuvarande kanal (ej den valda) från alla länkade kanaler. &Reset Åte&rställ Reset audio preprocessor Återställ förprocessen This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. Detta kommer återställa förprocessen inkluderande bulleravbrytning, automatisk förstärkning och upptäckning av röstaktivitet. Om någonting plötsligt förvärras i ljudmiljön (t.ex. att en mikrofon tappas) och det var tillfälligt kan du använda detta för att undvika att vänta på förprocessen att återjusteras. &Mute Self &Avaktivera egen mikrofon Mute yourself Avaktivera din mikrofon Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. Aktivera eller avaktivera din mikrofon. När den är avaktiverad kommer du inte skicka någon data till servern. Aktivering av mikrofonen vid avaktiverat ljud kommer också att aktivera ljudet. &Deafen Self &Avaktivera eget ljud Deafen yourself Avaktivera ditt ljud Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. Aktivera eller avaktivera ditt ljud. När det är avaktiverat kan du inte höra något. Avaktivering av ljud kommer också att avaktivera din mikrofon. &Text-To-Speech &Text-till-Tal Toggle Text-To-Speech Växla Text-till-Tal Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. Aktivera eller avaktivera text-till-tal-motorn. Endast meddelande aktiverade för TTS i konfigurationsdialogen kommer talas. Display audio statistics Visa ljudstatistik Pops up a small dialog with information about your current audio input. Öppnar en liten dialog med information om din nuvarande ljudingång. Forcibly unlink plugin Tvinga avlänkning av insticksmodul This forces the current plugin to unlink, which is handy if it is reading completely wrong data. Detta tvingar den nuvarande insticksmodulen att avlänkas, vilket är praktiskt om den läser helt fel data. Configure Mumble Konfigurera Mumble Allows you to change most settings for Mumble. Tillåter dig att ändra många inställningar för Mumble. Start the audio configuration wizard Starta ljudkonfigurationsguiden This will guide you through the process of configuring your audio hardware. Detta kommer att guidea dig genom processen att konfigurera din ljudhårdvara. &What's This? &Vad är detta? Enter What's This? mode Aktivera "Vad är detta?"-läget Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. Tryck för att aktivera "Vad är detta?"-läget. Din muspekare kommer att bli ett frågetecken. Klicka på valfri knapp, menyval eller område för att visa en beskrivning av vad det är. Information about Mumble Information om Mumble Shows a small dialog with information and license for Mumble. Visar en liten dialog med information och licens för Mumble. Information about Speex Information om Speex Shows a small dialog with information about Speex. Visar en liten dialog med information om Speex. Information about Qt Information om Qt Shows a small dialog with information about Qt. Visar en liten dialog med information om Qt. Check for &Updates Leta efter &uppdateringar Check for new version of Mumble Leta efter en ny version av Mumble Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. Ansluter till Mumbles hemsida för att kolla om en ny version finns tillgänglig och notifierar dig med en lämplig nedladdningslänk om det finns en uppdatering tillgänglig. Sends a text message to all users in a channel. Skickar ett textmeddelande till alla användare i en kanal. Configure certificates for strong authentication Konfigurera certifikat för stark autentisering This starts the wizard for creating, importing and exporting certificates for authentication against servers. Detta startar guiden för att skapa, importera eller exportera certifikat för autentisering mot servrar. Register user on server Registrera användare på server This will permanently register the user on the server. Detta kommer permanent att registrera användaren på servern. Add &Friend Lägg till &vän Adds a user as your friend. Lägger till en användare som din vän. This will add the user as a friend, so you can recognize him on this and other servers. Detta kommer att lägga till användaren som en vän så att du kan känna igen honom på den här eller andra servrar. &Remove Friend Ta bo&rt vän Removes a user from your friends. Tar bort en vän från din vänlista. This will remove a user from your friends list. Detta kommer att ta bort en användare från din vänlista. &Update Friend &Uppdatera vän Update name of your friend. Uppdatera din väns namn. Your friend uses a different name than what is in your database. This will update the name. Din vän använder ett annat namn än det som är i din databas. Det här kommer uppdatera namnet. Edit registered users list Ändra registrerade användare i listan This opens the editor for registered users, which allow you to change their name or unregister them. Detta öppnar redigeraren för registrerade användare som tillåter dig att ändra deras namn eller avregistrera dem. Add or remove text-based access tokens Lägg till eller ta bort textbaserade tokens &Minimal View &Minimal vy Toggle minimal window modes Växla minimala fönsterlägen This will toggle minimal mode, where the log window and menu is hidden. Detta kommer växla minimalt läge när loggfönstret och menyn är gömd. You muted and deafened %1. Du avaktiverade mikrofon och ljud för %1. You unmuted and undeafened %1. Du aktiverade mikrofon och ljud för %1. You undeafened %1. Du aktiverade ljudet för %1. You suppressed %1. Du tystade %1. %1 muted and deafened by %2. %2 aktiverade mikrofon och ljud för %1. %1 unmuted and undeafened by %2. %2 aktiverade mikrofon och ljud för %1. %1 undeafened by %2. %2 aktiverade ljud för %1. %1 suppressed by %2. %2 tystade %1. %1 moved to %2. %1 flyttade till %2. %1 moved to %2 by %3. %1 flyttades till %2 av %3. %1 moved in from %2 by %3. %1 flyttades in från %2 av %3. %1 is now muted and deafened. %1 har avaktiverat sin mikrofon och sitt ljud. Your account information can not be verified currently. Please try again later Din kontoinformation kan inte verifieras just nu. Var god försök igen senare Welcome message: %1 Välkomstmeddelande: %1 Mumble: %1 Mumble: %1 You were denied %1 privileges in %2. Du nekades behörigheten "%1" i %2. %3 was denied %1 privileges in %2. %3 nekades behörigheten "%1" i %2. Denied: Cannot modify SuperUser. Nekad: Kan ej modifiera superanvändare. Denied: Invalid channel name. Nekad: Ogiltigt kanalnamn. Denied: Text message too long. Nekad: Textmeddelande för långt. Denied: Operation not permitted in temporary channel. Nekad: Åtgärden tillåts inte i temporär kanal. You need a certificate to perform this operation. Du behöver ett certifikat för att utföra den här åtgärden. %1 does not have a certificate. %1 har ej något certifikat. Invalid username: %1. Ogiltigt användarnamn: %1. Invalid username. Ogiltigt användarnamn. Channel is full. Kanalen är full. Channel nesting limit reached. Gränsen för antalet kanaler har nåtts. Channel count limit reached. Need to delete channels before creating new ones. Permission denied. Åtkomst nekad. %1 connected and entered channel. %1 connected. %1 anslöt till servern. %1 is now muted. %1 har avaktiverat sin mikrofon. %1 is now unmuted. %1 har aktiverat sin mikrofon. Recording started Inspelning startad Recording stopped Inspelning stoppad %1 started recording. %1 började spela in. %1 stopped recording. %1 slutade spela in. You revoked your priority speaker status. Du upphävde din prioriterad talare status. You assumed priority speaker status. Du tilldelades prioriterad talare status. %1 revoked your priority speaker status. %1 upphävde din prioriterad talare status. %1 gave you priority speaker status. %1 gav dig prioriterad talare status. You revoked priority speaker status for %1. Du upphävde prioriterad talare status för %1. You gave priority speaker status to %1. Du gav prioriterad talare status till %1. %1 revoked own priority speaker status. %1 upphävde egen prioriterad talare status. %1 assumed priority speaker status. %1 tilldelades prioriterad talade status. %1 revoked priority speaker status for %2. %1 upphävde prioriterad talare status för %2. %1 gave priority speaker status to %2. %1 gav prioriterad talare status till %2. You were unmuted and undeafened by %1. %1 aktiverade mikrofon och ljud för dig. You were muted by %1. %1 avaktiverade mikrofon för dig. You were undeafened by %1. %1 aktiverade ljud för dig. You were suppressed. You were suppressed by %1. Du tystades. You were unsuppressed. Du avtystades. You were unsuppressed by %1. Du avtystades av %1. You joined %1. Du gick med %1. You moved %1 to %2. Du flyttade %1 till %2. %1 is recording %1 spelar in %1 renamed to %2 by %3. %1 namnbyte till %2 av %3 %1 disconnected. %1 lämnade servern. Server message from server (Tree) (Träd) (Channel) (Kanal) (Private) (Privat) %2%1: %3 %2%1: %3 Failed to load Opus, it will not be available for audio encoding/decoding. The server requests minimum client version %1 Servern kräver klientversionen %1 The server requests positional audio be enabled. Servern efterfrågar användning av positionellt ljud. The server requests positional audio be disabled. Servern efterfrågar avaktivering av positionellt ljud. The server requests Push-to-Talk be enabled. Servern efterfrågar användning av Tryck-för-att-Tala-funktionen. The server requests Push-to-Talk be disabled. Servern efterfrågar avaktivering av Tryck-för-att-Tala-funktionen. You were unmuted by %1. Din mikrofon aktiverades av %1. You muted %1. Du avaktiverade mikrofon för %1. You unsuppressed %1. Du avtystade %1. You unmuted %1. Du aktiverade mikrofon för %1. %1 muted by %2. %2 avaktiverade mikrofon för %1. %1 unsuppressed by %2. %2 avtystades av %1. %1 unmuted by %2. %2 aktiverade mikrofon för %1. Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. Kunde inte hitta liknande CELT-kodekar med andra klienter. Du kan inte tala med alla användare. You were muted and deafened by %1. You were deafened by %1. Din mikrofon och ljud avaktiverades av %1. You were kicked from the server by %1: %2. Du slängdes ut från servern av %1: %2. %3 was kicked from the server by %1: %2. %3 slängdes ut från servern av %1: %2. You were kicked and banned from the server by %1: %2. Du slängdes ut och blev bannlyst från servern av %1: %2. %3 was kicked and banned from the server by %1: %2. %3 slängdes ut och blev bannlyst från servern av %1: %2. You were moved to %1 by %2. Du flyttades till %1 av %2. %1 entered channel. %1 gick med i kanalen. Server connection rejected: %1. Serveranslutning avbröts: %1. Denied: %1. Nekad: %1. %1 renamed to %2. %1 omdöpt till %2 %1 left channel and disconnected. %1 lämnade kanalen och servern. Message from %1 Meddelande från %1 You have User Dragging set to "Do Nothing" so the user wasn't moved. You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. Du har kanaldragning inställd på "Gör ingenting" så kanalen flyttades inte. Unknown Channel Drag mode in UserModel::dropMimeData. Okänd kanaldragnings läge i Användarmodell::dropMimeData. Remote controlling Mumble: Fjärrstyra Mumble: Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) -jn, --jackname Set custom Jack client name. --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status Invocation Anropande Error: No RPC command specified Fel: Inget PRC kommando specificerat RPC RPC Welcome to Mumble. Välkommen till Mumble. Skipping version check in debug mode. Hoppar över kontroll av uppdatering i felsökningsläge. Hide Frame Göm ram Toggle showing frame on minimal window Växla visningsram på minimalt fönster This will toggle whether the minimal window should have a frame for moving and resizing. Detta kommer att välxa om det minimala fönstret ska ha en ram för att flytta och ändra storlek. &Unlink All &Avlänka alla Reset the comment of the selected user. Återställ kommentaren för den valda användaren. &Join Channel &Gå med i kanal View comment in editor Visa kommentar i redigerare Query server for connection information for user Fråga server om anslutningsinfo för användare S&erver S&erver &Self &Själv &Unlink Plugins &Avlänka insticksmoduler Register yourself on the server Registrera dig på servern Change your avatar image on this server Ändra din visningsbild på servern &Remove Avatar &Ta bort visningsbild Remove currently defined avatar image. Ta bort nuvarande definierade visningsbild. Icon Toolbar Verktygsfältet Change your own comment Ändra din kommentar Recording Spela in Priority Speaker Prioriterad talare &Copy URL &Kopiera URL Copies a link to this channel to the clipboard. Kopierar en länk till den här kanalen till urklipp. Ignore Messages Ignorera meddelanden Locally ignore user's text chat messages. Ignorera användares textmeddelande lokalt. Silently drops all text messages from the user. Blockerar tyst alla textmeddelanden från användaren. Edit ban list on server Redigera bannlistan på servern This lets you edit the server-side IP ban list. Detta låter dig redigera listan över bannlysta IP-adresser på servern. &Filter on/off &Filter på/av Toggle the channel filter (Ctrl+F) Växla kanalfilter (Ctrl+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. Aktivera eller inaktivera filtreringen för valda kanaler. Som standard är alla tomma kanaler filtrerade. Du kan markera ytterligare kanaler för filtrering från kanalens innehållsmeny. Ctrl+F Ctrl+F &Hide Channel when Filtering &Göm kanalen vid filtrering Reset the avatar of the selected user. Återställ visningsbild för den valda användaren. Locally adjust the user's speech volume. Lokal justering av användarens talvolym Opens a dialog with a volume slider. Use this on other users in the same room. Öppnar ett fönster med en volymkontroll. Använd den på andra användare i samma kanal. &Developer &Hide Mumble Hides the main Mumble window. Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. Show the Developer Console Shows the Mumble Developer Console, where Mumble's log output can be inspected. &Connect... &Anslut... &Ban list... &Information... &Information... &Kick... &Ban... Local Volume Adjustment... Send &Message... Skicka &Meddelande... &Add... &Remove... &Edit... Audio S&tatistics... &Settings... &Inställningar... &Audio Wizard... Developer &Console... &About... &Om... About &Speex... Om &Speex... About &Qt... Om &Qt... &Certificate Wizard... &Register... &Registrera... Registered &Users... Change &Avatar... Byt &Avatar... &Access Tokens... Reset &Comment... Reset &Avatar... Återställ &Avatar... View Comment... Visa kommentar... &Change Comment... R&egister... R&egistrera... Show Shows the main Mumble window. Manual Manual Mumble Positional Audio Position Position X X Y Y Z Z m m Heading Azimuth Elevation ° ° Meta data Metadata Context Kontext Identity Identitet Set State Linked Länkad Activated Unhinge NetworkConfig Network Nätverk Updates are mandatory when using snapshot releases. Uppdateringar är obligatoriska vid användning av utvecklarutsläpp. Connection Anslutning Use TCP compatibility mode Use TCP compatability mode Använd kompatibilitetsläge för TCP <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). <b>Aktivera kompatibilitetsläge för TCP</b>.<br />Detta kommer att göra så att Mumble endast använder TCP vid kommunikation med servern. Detta kommer att öka och orsaka borttappade paket för att producera märkbara pauser i kommunikationen, så detta bör bara användas om du inte kan använda standarden (som använder UDP för röst och TCP för kontroll). Reconnect when disconnected Återanslut vid frånkoppling <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. <b>Återanslut vid frånkoppling</b>.<br />Detta kommer att göra så att Mumble försöker att automatiskt återansluta efter 10 sekunder om din serveranslutning misslyckas. Reconnect automatically Återanslut automatiskt Proxy Proxy Type Typ Type of proxy to connect through Typ av proxy att ansluta genom Direct connection Direktanslutning HTTP(S) proxy HTTP(S)-proxy SOCKS5 proxy SOCKS5-proxy Hostname Värdnamn Hostname of the proxy Proxyns värdnamn Force TCP mode Tvinga TCP-läge Enable QoS to prioritize packets Aktivera QoS för att prioritera paket This will enable QoS, which will attempt to prioritize voice packets over other traffic. Detta kommer att aktivera QoS som kommer att prioritera röstpaket före annan trafik. Use Quality of Service Använd kvalitet för tjänst (QoS) Don't send certificate to server and don't save passwords. (Not saved). Skicka inte certifikat till servern eller spara lösenord. (Inte sparat). <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> <b>Detta kommer att avlägsna information om indentitet från klienten.</b><p>Klienten kommer inte att identifiera sig själv utan något certifikat, eller lagra lösenord för anslutningar. Detta är primärt ett testalternativ och kommer inte att sparas.</p> Suppress certificate and password storage Avaktivera certifikat- och lösenordslagring <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>Typ av proxy att ansluta genom.</b><br />Detta gör att Mumble ansluter genom en proxy för atta utgående anslutningar. Kom ihåg: Tunnling av proxy tvingar Mumble till kompatibilitetsläge för TCP, vilket orsakar att all ljuddata skickas via kontrollkanalen. <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. <b>Värdnamn för proxyn.</b><br />Detta fält specifierar värdnamnet för proxyn som du vill tunnla nätverkstrafik genom. Port Port Port number of the proxy Proxyns portnummer <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. <b>Portnummer för proxyn.</b><br />Detta fält specifierar portnumret som proxyn väntar anslutningar på. Username Användarnamn Username for proxy authentication Användarnamn för proxyautentisering <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>Användarnamn för proxyautentisering.</b><br />Detta specifierar användarnamnet du använder för att autentisera dig själv med proxyn. Om proxyn inte använder autentisering, eller du vill ansluta anonymt, lämna detta fält tomt. Password Lösenord Password for proxy authentication Lösenord för proxyautentisering <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>Lösenord för proxyautentisering.</b><br />Detta specifierar lösenordet du använder för att autentisera dig själv med proxyn. Om proxyn inte använder autentisering, eller du vill ansluta anonymt, lämna detta fält tomt. Mumble services Tjänster för Mumble Check for new releases of Mumble automatically. Leta efter nya utsälpp av Mumble automatiskt. This will check for new releases of Mumble every time you start the program, and notify you if one is available. Detta kommer att leta efter nya utsläpp av Mumble varje gång du startar programmet, och notifiera dig om det finns tillgängligt. Check for application updates on startup Leta efter programuppdateringar vid uppstart Check for new releases of plugins automatically. Leta automatiskt för nya utsälpp av insticksmoduler. This will check for new releases of plugins every time you start the program, and download them automatically. Detta kommer att leta efter nya utsläpp av insticksmoduler varje gång du startar programmet och ladda ner dem automatiskt. <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. <b>Skicka anonym statistik.</b><br />Mumble har ett litet utvecklingslag och fokuserar alltid på där utvecklingen behövs mest. Genom att skicka statistik hjälper du till med var utvecklarna behöver fokusera. Submit anonymous statistics to the Mumble project Skicka anonym statistik till projektet Mumble Submit anonymous statistics Skicka anonym statistik Reconnect to last used server when starting Mumble Återanslut till den senast använda servern vid uppstart av Mumble Reconnect to last server on startup Återanslut till den senaste servern vid uppstart Download plugin and overlay updates on startup Ladda ner uppdateringar för insticksmoduler och överlag vid uppstart Privacy Prevent OS information being sent to Mumble servers and web servers <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. Do not send OS information to Mumble servers and web servers Overlay Silent Tyst Talking Talar Whisper Viskar Shout Skriker Channel Kanal Failed to create communication with overlay at %2: %1. No overlay will be available. Kunde inte skapa kommunikation med överlag på %2: %1. Inget överlag kommer att vara tillgängligt. OverlayClient Filter Filter Only talking Endast tal Talking and recently active Talar och nyligen aktiv All in current channel Alla i den nuvarande kanalen All in linked channels Alla i länkade kanaler Always show yourself Visa alltid dig själv Configure recently active time (%1 seconds)... Konfigurera senast aktiva tid (%1 sekunder)... Columns Kolumner Sort Sortera Alphabetically Alfabetiskt Last state change Senaste statusändring Edit... Ändra... Reset Zoom Återställ zoom Configure recently active time Konfigurera senast aktiva tid Amount of seconds users remain active after talking: Antalet sekunder användare förblir aktiva efter tal: OverlayConfig To move the users, drag the little red dot. Drag i den lilla röda punkten för att flytta användare. To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. Skrolla över en användare för att ändra storleken för den. For more options, right click a user. For more options, rightclick a user. Högerklicka på en användare för att få fler alternativ. Launcher Filter Overlay Överlag Choose executable Välj körbar fil Choose application Välj program Choose path Välj sökväg Load Overlay Presets Ladda förinställningar till överlag Mumble overlay presets (*.mumblelay) Förinställningar till överlag för Mumble (*.mumblelay) Save Overlay Presets Spara förinställningar till överlag Options Alternativ Enable overlay. Aktivera överlag. Enable Overlay Aktivera överlag This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. Detta ställer in när överlag är aktiverat eller ej. Denna inställning kontrolleras endast när program startas, så se till att Mumble körs och att detta alternativ är aktiverat innan du startar programmet.<br />Kom ihåg att om du startar Mumble efter programmet, eller om du avaktiverar överlaget när programmet körs finns det ingen säker väg att starta om överlaget utan att samtidigt starta om programmet. Layout Utseende Blacklist Svartlista Whitelist Vitlista Uninstall Overlay Avinstallera överlag Overlay Installation Överlagsinstallation Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. Mumble har upptäckt att du inte har något överlag installerat. Tryck på den här knappen för att installera överlaget. Install Mumble Overlay Installera överlag för Mumble Overlay Upgrade Uppgradering av överlag Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. Mumble har hittat en äldre version av supportfilerna för överlaget installerat på din dator. Tryck på knappen nedan för att uppgradera dessa filer till de senaste versionerna. Upgrade Mumble Overlay Uppgradera överlag för Mumble Display a frame counter in the overlay Visar en bildruteräknare i överlaget Show FPS counter Visa FPS-räknare Load an overlay preset from file Ladda förinställningar för överlag från en fil Load… Ladda... Save your overlay settings to file Spara dina inställningar för överlag till en fil Save… Spara... Set the overlay font. Ställ in typsnittet för överlag. Set the overlay text color. Ställ in textfärgen för överlag. Color Färg Remove Ta bort Font Typsnitt FPS and Clock Display Visning av FPS och klocka Display a clock in the overlay showing the current local time (system time). Visar en klocka i överlaget som visar den aktuella systemtiden. Show Clock Visa klocka Overlay Exceptions Overlay Exception Mode Allowed launchers Add Lägg till Allowed programs Tillåtna program Allowed paths Tillåtna sökvägar Blacklisted programs OverlayEditor State Status User is not talking Användaren talar inte Passive Passiv User is talking in your channel or a linked channel Användaren talar i din kanal eller i en länkad kanal Talking Talar User is whispering to you privately Användaren viskar privat till dig Private Whisper Privatviskning User is shouting to your channel Användaren skriker till din kanal Channel Whisper Kanalviskning Zoom Zoom Zoom Factor Zoomfaktor Enabled Elements Aktiverade element User avatar, chosen by each user Använd visningsbild, vald av varje användare Avatar Visningsbild User's name Användarens namn Username Användarnamn Name of user's channel, if outside your current channel Namn för användarens kanal, om den är utanför din kanal Channel Kanal Muted or deafened Avaktiverad mikrofon eller avaktiverat ljud Mute state Mikrofonstatus Bounding box, automatically shrunk to minimum size to contain all visible elements Avgränsarbox, kommer automatiskt att krympas till den minsta storleken för att innehålla alla synliga element Bounding box Avgränsningsbox Overlay Editor Överlagsredigerare OverlayEditorScene Layout preset Förinställd layout Large square avatar Stor kvadratisk visningsbild Avatar and Name Visningsbild och namn User Opacity Användaropacitet %1% %1% Object Opacity Objektsopacitet Alignment Justering Left Vänster Center Mitt Right Höger Top Topp Bottom Botten Color... Färg... Font... Typsnitt... Bounding box Avgränsarbox Pen width Pennbredd Padding Stoppning Pen color Pennfärg Fill color Fyllningsfärg Pick pen color Välj pennfärg Pick fill color Välj fyllningsfärg Pick color Välj färg Pick font Välj typsnitt PluginConfig Plugins Insticksmoduler Plugin has no configure function. Insticksmodulen har ingen konfigurationsfunktion. Plugin has no about function. Insticksmodulen har ingen om-funktion. Options Alternativ Enable plugins and transmit positional information Aktivera insticksmoduler och överför platsinformation This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. Detta tillåter insticksmoduler för spel som stöds för att hämta din position i spelet och överföra den med röstpaketet. Detta tillåter andra användare att höra din röst i spelet från platsen din karaktär befinner sig. Link to Game and Transmit Position Länka till spel och överför position Reloads all plugins Ladda om alla insticksmoduler This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. Detta skannar/laddar om insticksmoduler. Använd endast detta om du nyss lagt till en insticksmodul till mappen. &Reload plugins &Ladda om insticksmoduler Information about plugin Information om insticksmodul This shows a small information message about the plugin. Detta visar ett litet informationsmeddelande om insticksmodulen. &About &Om Show configuration page of plugin Visa konfigurationssidan för insticksmodulen This shows the configuration page of the plugin, if any. Detta visar konfigurationssidan för insticksmodulen. &Configure &Konfigurera Name Namn Enabled Aktiverad Plugins Skipping plugin update in debug mode. Hoppar över uppdatering för insticksmoduler i felsökningsläge. Downloaded new or updated plugin to %1. Laddade ner ny/uppdaterad insticksmodul till %1. Failed to install new plugin to %1. Kude inte installera ny insticksmodul till %1. %1 lost link. %1 förlorade länk. %1 linked. %1 länkad. PortAudioSystem Default Device Standardenhet PulseAudioSystem Default Input Standardingång Default Output Standardutgång QApplication Failed to restart mumble Omstart av Mumble misslyckades Mumble failed to restart itself. Please restart it manually. Mumble misslyckades att starta om själv. Vänligen starta om manuellt. RichTextEditor Failed to load image Kunde inte ladda ladda bild Image file too large to embed in document. Please use images smaller than %1 kB. Bildfil för stor för att bädda in i dokument. Använd bilder som är mindre än %1 kB. Message is too long. Meddelandet är för långt. Display Visa Source Text Källtext &Bold &Fet Ctrl+B Ctrl+B &Italic Kurs&iv Italic Kursiv Ctrl+I Ctrl+I Underline Understruken Ctrl+U Ctrl+U Color Färg Insert Link Infoga länk Ctrl+L Ctrl+L Insert Image Infoga bild RichTextEditorLink Add Link Lägg till länk URL URL Text Text ServerHandler Unable to resolve hostname Server is not responding to TCP pings UDP packets cannot be sent to or received from the server. Switching to TCP mode. UDP-paket kan inte skickas till ellet tas emot från servern. Byter till TCP-läge. UDP packets cannot be sent to the server. Switching to TCP mode. UDP-paket kan inte skickas till servern. Byter till TCP-läge. UDP packets cannot be received from the server. Switching to TCP mode. UDP-paket kan inte skickas från servern. Byter till TCP-läge. UDP packets can be sent to and received from the server. Switching back to UDP mode. UDP-paket kan skickas till och tas emot från servern. Byter tillbaka till UDP-läge. Connection timed out Anslutningstiden överskreds ServerView Favorite Favoriter LAN LAN Public Internet Publikt internet Unknown Africa Afrika Asia Asien North America Nordamerika South America Sydamerika Europe Europa Oceania Oceanien ShortcutActionWidget Unassigned Otilldelad ShortcutDelegate On Off Av Toggle Växla Unassigned Otilldelad ShortcutKeyWidget Press Shortcut Tryck på en eller flera knappar att använda som genväg ShortcutTargetDialog Root Rot Parent Förälder Current Nuvarande Subchannel #%1 Underkanal #%1 ShortcutTargetWidget ... ... , , Root Rot Parent Förälder Current Nuvarande Subchannel #%1 Underkanal #%1 Invalid Ogiltig Empty <Empty> Tom ShortcutToggleWidget Off Av Toggle Växla On TextMessage Enter text Ange text If checked the message is recursively sent to all subchannels Vid markering skickas meddelandet rekursivt till alla underkanaler Send recursively to subchannels Skicka rekursivt till underkanaler Tokens Empty Token Tom token Mumble - Access Tokens Mumble - Hantera tokens List of access tokens on current server Lista med tokens som används på den nuvarande servern <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. <b>Detta är en redigerbar lista med tokens på den anslutna servern.</b> <br /> En token är en textsträng, som kan användas som ett lösenord för enkel tillgång till underhåll på kanaler. Mumble kommer att komma ihåg de tokens du har använt och skicka dem till servern nästa gång du ansluter, så att du inte behöver ange dessa varje gång. Add a token Lägg till en token &Add &Lägg till Remove a token Ta bort en token &Remove Ta bo&rt UserEdit Registered Users Registrerade användare Remove Ta bort Rename Byt namn Who are you looking for? Vem letar du efter? Days Dagar Weeks Veckor Months Månader Years År Inactive for Inaktiv i Registered users: %n account(s) Registrerade användare: %n konto(n)Registrerade användare: %n konto(n) UserInformation User Information Användarinformation Connection Information Anslutningsinformation Version Version OS OS Certificate Certifikat IP Address IP adress CELT Versions CELT versioner Details... Detaljer... Ping Statistics Pingstatistik Pings received Ping mottaget Average ping Genomsnittlig ping TCP (Control) TCP (kontroll) UDP (Voice) UDP (röst) UDP Network statistics UDP-nätverksstatistik Good Bra Late Sent Lost Förlorat Resync Omsynkronisera From Client Från klient To Client Till klient Connection time Anslutningstid %1w %1v %1d %1d %1h %1h %1m %1m %1s %1s , , %1 (%2) %1.%2.%3 (%4) %1 (%2) Supported Stöds Not Supported Stöds inte Not Reported Inte rapporterad %1 online (%2 idle) %1 tillgänglig (%2 inaktiv) %1 online %1 tillgänglig %1 kbit/s %1 kbit/s Bandwidth GroupBox Bandbredd Bandwidth Label Bandbredd Ping deviation Pingavvikelser UserListModel Nick Smeknamn Inactive days Inaktiv i (dagar) Last channel Senaste kanal Last seen: %1 Senast sedd: %1 Never Aldrig Channel ID: %1 UserLocalVolumeDialog Local volume for other users Lokal volym för andra användare <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. <b>Anpassar volymen av andra användare lokalt.</b><br />Mumble stödjer justering av volymen lokalt för andra användare. Adjusting local volume for %1 Anpassa lokal volym för %1 dB dB <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> <html><head/><body><p>Använd reglaget eller textboxen för att ändra volymen på användaren.</p><p><span style="font-weight:600;">OBS!</span></p><p>Höja volymen av en användare för mycket kan permanent skada din hörsel. Det kanske även höjer bakgrundljudet från användaren.</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: Detta är en användare som är ansluten till servern. Ikonen till vänster visar om användaren talar eller ej: Talking to your channel. Talar till din kanal. Shouting directly to your channel. Whispering directly to your channel. Skriker direkt till din kanal. Whispering directly to you. Viskar direkt till dig. Not talking. Talar inte. This is a channel on the server. The icon indicates the state of the channel: Detta är en kanal på servern. Ikonen visar kanalens status: Your current channel. Din nuvarande kanal. A channel that is linked with your channel. Linked channels can talk to each other. En kanal som är länkad till din kanal. Länkade kanaler kan tala med varandra. A channel on the server that you are not linked to. En kanal på servern som du inte är länkad till. This shows the flags the user has on the server, if any: Detta visar flaggorna användaren har på servern, om det finns några: On your friend list På din vänlista Authenticated user Autentiserad användare Muted (manually muted by self) Mikrofon avaktiverad (manuellt av dig) Muted (manually muted by admin) Mikrofon avaktiverad (manuellt av administratör) Muted (not allowed to speak in current channel) Mikrofon avaktiverad (har ej tillåtelse att prata i den nuvarande kanalen) Muted (muted by you, only on your machine) Mikrofon avaktiverad (endast för dig) Muted (push-to-mute) Deafened (by self) Ljud avaktiverat (av dig) Deafened (by admin) Ljud avaktiverat (av administratör) User has a new comment set (click to show) Användaren har en ny kommentar (klicka för att visa) User has a comment set, which you've already seen. (click to show) Användaren har en kommentar, som du redan sett. (klicka för att visa) Ignoring Text Messages Ignorera textmeddelanden This shows the flags the channel has, if any: Detta visar flaggorna en kanal har, om det finns några: Channel has a new comment set (click to show) Kanalen har en ny kommentar (klicka för att visa) Channel has a comment set, which you've already seen. (click to show) Kanalen har en kommentar, som du redan sett. (klicka för att visa) Channel will be hidden when filtering is enabled Kanalen kommer att vara gömd när filtrering är aktiverat. Name Namn Flags Flaggor Are you sure you want to drag this user? Are you sure you want to drag this channel? Är du säker på att du vill dra den här kanalen? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. Kan inte utföra den här förflyttningen automatiskt. Återställ den numeriska sorteringen eller gör det manuellt. VersionCheck Upgrade Mumble Uppgradera Mumble A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? En ny version av Mumble har hittats och laddats ner automatiskt. Det är rekommenderat att du uppgraderar till den senaste versionen, eller nedgraderar till den senaste stabila utgåvan. Vill du starta installationen nu? Failed to launch snapshot installer. Kunde inte starta installationen för utvecklarversionen. Corrupt download of new version detected. Automatically removed. Korrupt nedladdning av ny version upptäckt. Automatiskt borttagen. Downloading new snapshot from %1 to %2 Laddar ner ny utvecklarversion från %1 till %2 Failed to write new version to disk. Failed to write new version to disc. Kunde inte skriva ny version till disk. Mumble failed to retrieve version information from the central server. Mumble kunde inte ta emot versionsinformation från centralservern. ViewCert Certificate Chain Details Certifikatdetaljer Certificate chain Certifikatkedja Certificate details Certifikatdetaljer Common Name Organization Organisation Subunit Country Land Locality State Valid from: %1 Giltigt från: %1 Valid to: %1 Giltigt till: %1 Serial: %1 Serie: %1 Public Key: %1 bits %2 Publik nyckel: %1 bitar %2 RSA RSA DSA DSA Digest (SHA-1): %1 Klassificering (SHA-1): %1 Digest (SHA-256): %1 Email: %1 E-post: %1 DNS: %1 DNS: %1 Issued by: Utfärdat av: Unit Name VoiceRecorder Recorder failed to create directory '%1' Inspelare kunde inte skapa mappen "%1" Recorder failed to open file '%1' Inspelaren kunde inte öppna filen '%1' .wav - Uncompressed .wav - Okomprimerad .ogg (Vorbis) - Compressed .ogg (Vorbis) - Komprimerad .au - Uncompressed .au - Okomprimerad .flac - Lossless compressed .flac - Förlustfritt komprimerad VoiceRecorderDialog Recorder Inspelare Control Kontroll 00:00:00 00:00:00 &Start &Starta S&top S&toppa Mode Läge Multichannel Multikanal Output Utgång Output format Utgångsformat Target directory Målmapp Filename Filnamn &Browse... &Bläddra... Valid variables are: Giltiga variabler är: Inserts the user's name Lägger till användarens namn Inserts the current date Lägger till dagens datum Inserts the current time Lägger till den nuvarande tiden Inserts the hostname Lägger till värdnamnet Recorder still running Inspelning pågår fortfarande Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? Att stänga inspelaren utan att stoppa resulterar i osparad ljudfil. Vill du verkligen stänga inspelaren? Unable to start recording. Not connected to a server. Kunde inte starta inspelning. Ej ansluten till server. The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. Servern du är ansluten till använder version 1.2.2 eller äldre. Av integritetsskäl kan inspelningar på servrar med versioner äldre än 1.2.3 inte göras. Kontakta din serveradministratör för mer information. There is already a recorder active for this server. Det finns redan en inspelare aktiv för den här servern. Please select a recording format. Välj ett annat inspelningsformat. Stopping Stoppar Select target directory Välj målmapp Downmix Nedmixning WASAPIInput Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone. WASAPISystem Default Device Standardenhet qwPTTButtonWidget Mumble PTT Mumble TFT Push to talk Tryck-för-att-tala mumble-1.3.4/src/mumble/UserInformation.h0000664000175000017500000000201414010707273020203 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_USERINFORMATION_H_ #define MUMBLE_MUMBLE_USERINFORMATION_H_ #include #include "Message.h" #include "ui_UserInformation.h" namespace MumbleProto { class UserStats; } class QTimer; class UserInformation : public QDialog, Ui::UserInformation { private: Q_OBJECT Q_DISABLE_COPY(UserInformation) protected: bool bRequested; unsigned int uiSession; QTimer *qtTimer; QList qlCerts; static QString secsToString(unsigned int secs); QFont qfCertificateFont; protected slots: void tick(); void on_qpbCertificate_clicked(); public: UserInformation(const MumbleProto::UserStats &msg, QWidget *p = NULL); void update(const MumbleProto::UserStats &msg); unsigned int session() const; }; #endif mumble-1.3.4/src/mumble/mumble_en.ts0000664000175000017500000122311214010707274017227 0ustar builderbuilder ACLEditor Deny Allow Allow %1 Deny %1 Mumble - Add channel Default server value Failed: Invalid channel Mumble - Edit %1 ID: %1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Channel must have a name This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Dialog Name Enter the channel name here. Description Password Enter the channel password here. Check to create a temporary channel. Temporary <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. Position &Groups Group List of groups Remove selected group Remove Inherit group members from parent Inherit Make group inheritable to sub-channels Inheritable Group was inherited from parent channel Inherited Members Add Add member to group Remove member from group &ACL Active ACLs List of entries Inherit ACL of parent? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. Inherit ACLs Move entry up This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. &Up Move entry down This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. &Down Add new entry This adds a new entry, initially set with no permissions and applying to all. &Add Remove entry This removes the currently selected entry. &Remove Context Entry should apply to this channel. Entry should apply to this channel This makes the entry apply to this channel. Applies to this channel Entry should apply to sub-channels. Add new group <b>Add</b><br/> Add a new group. Inherited members Contains the list of members added to the group by this channel. Contains a list of members whose group membership will not be inherited from the parent channel. Contains the list of members inherited by other channels. Type in the name of a user you wish to add to the group and click Add. Type in the name of a user you wish to remove from the group and click Add. Exclude Excluded members This makes the entry apply to sub-channels of this channel. Applies to sub-channels Permissions User/Group Group this entry applies to User ID User this entry applies to This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. &Properties <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. ID of the channel. Maximum Users Maximum number of users allowed in the channel <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. This is the sort order for the channel. ALSAAudioInput Default ALSA Card Opening chosen ALSA Input failed: %1 ALSAAudioOutput Default ALSA Card Opening chosen ALSA Output failed: %1 ASIOConfig %1 (version %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz ASIO Initialization failed: %1 Failed to instantiate ASIO driver ASIO Device selection Device Device to use for microphone This chooses what device to query. You still need to actually query the device and select which channels to use. Query selected device This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Query Configure selected device This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Configure Capabilities Driver name Buffer size This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. Configure input channels Channels Microphone <- -> Unused Speakers ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. Opening selected ASIO device failed. No input will be done. AboutDialog About Mumble <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble &License A&uthors &Third-Party Licenses OK AudioInput Interface System Input method for audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Input device for audio <b>This is the input device to use for audio.</b> Transmission &Transmit When to transmit your speech <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. DoublePush Time If you press the PTT key twice in this time it will get locked. <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. Reset audio cue to default <b>Reset</b><br/>Reset the paths for the files to their default. Browse for on audio file Browse for off audio file Off On Preview the audio cues Use SNR based speech detection Signal to Noise <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. Amplitude Voice &Hold How long to keep transmitting after silence Silence Below <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. Speech Above Signal values above this count as voice Compression &Quality Quality of compression (peak bandwidth) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. Audio per packet How many audio frames to send per packet <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). Audio Processing Noise Suppression Noise suppression <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. Maximum amplification of input sound <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. Current speech detection chance Cancel echo from speakers Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. Disabled <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal values below this count as silence Maximum bandwidth used for sending audio Use Amplitude based speech detection <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). Exclusive mode <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive R&eset &Browse... B&rowse... &Preview <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. Displays an always on top window with a push to talk button in it Display push to talk window Misc Audible audio cue when starting or stopping to transmit <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. Audio cue Gets played when starting to transmit Gets played when stopping to transmit Hold Time Time the microphone stays open after the PTT key is released Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) Max. Amplification Idle action minutes do nothing deafen mute after Echo Cancellation Mixed echo cancellation Multichannel echo cancellation The idle action will be reversed upon any key or mouse button input Undo Idle action upon activity Apply RNNoise's noise suppression filter. <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. RNNoise Audio input AudioInputDialog Continuous Voice Activity Push To Talk Audio Input %1 ms Off %1 s %1 kb/s -%1 dB %1 kbit/s (Audio %2, Position %4, Overhead %3) AudioOutput Interface System Output method for audio <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Output device for audio <b>This is the output device to use for audio.</b> Positional Audio Audio Output Default &Jitter Buffer Safety margin for jitter buffer <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. Minimum distance to user before sound volume decreases This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. Volume Volume of incoming speech <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. Output Delay Amount of data to buffer The connected "speakers" are actually headphones The connected "speakers" are actually headphones. Factor for sound volume decrease Bloom Factor for sound volume increase How much should sound volume increase for sources that are really close? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Headphones Minimum Distance Maximum Distance Maximum distance, beyond which speech volume won't decrease Minimum Volume What should the volume be at the maximum distance? Loopback Test Delay Variance Variance in packet latency <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. Packet Loss Packet loss for loopback mode <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% &Loopback Desired loopback mode Attenuate applications by... Attenuation of other applications during speech <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. If checked Mumble lowers the volume of other applications while other users talk <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. while other users talk If checked Mumble lowers the volume of other applications while you talk <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. while you talk Exclusive mode, not recommended. <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive Priority Speaker If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. Attenuate other users while talking as Priority Speaker. Advanced Attenuation Options If checked, Mumble will only attenuate applications that are using the same output source as Mumble <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. Only attenuate applications using the same output device If checked, PulseAudio loopback modules will be attenuated <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. Attenuate PulseAudio loopback modules Audio output AudioOutputDialog None Local Server Audio Output %1 ms %1 % %1 m AudioOutputSample Choose sound file Invalid sound file The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. AudioStats >1000 ms >1000ms Audio Statistics Input Levels Peak microphone level Peak power in last frame This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. Peak speaker level This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. Peak clean level This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. Signal Analysis Microphone power How close the current input level is to ideal This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. Signal-To-Noise ratio Signal-To-Noise ratio from the microphone This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. Speech Probability Probability of speech This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). Configuration feedback Current audio bitrate Bitrate of last frame DoublePush interval Time between last two Push-To-Talk presses Speech Detection Current speech detection chance <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal and noise power spectrum Power spectrum of input signal and noise estimate This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. Echo Analysis Weights of the echo canceller This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. AudioWizard Audio Tuning Wizard Introduction Welcome to the Mumble Audio Wizard Finished Enjoy using Mumble Device selection Selecting the input and output device to use with Mumble. This is the device your microphone is connected to. System Input method for audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Input device to use <b>Selects which sound card to use for audio input.</b> Cancel echo from headset or speakers Use echo cancellation This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. This is the device your speakers or headphones are connected to. Output method for audio <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. Output device to use <b>Selects which sound card to use for audio Output.</b> Enable positional audio Allows positioning of sound Allows positioning of sound. <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> Input Device Output Device This allows Mumble to use positional audio to place voices. <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> Amount of data to buffer This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> Positional Audio Adjusting attenuation of positional audio. <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> Use headphones instead of speakers <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> Use headphones This ignores the OS speaker configuration and configures the positioning for headphones instead. Volume tuning Tuning microphone hardware volume to optimal settings. Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. Voice Activity Detection Letting Mumble figure out when you're talking and when you're silent. This will help Mumble figure out when you are talking. The first step is selecting which data value to use. Raw amplitude from input Signal-To-Noise ratio Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Device tuning Changing hardware output delays to their minimum value. Submit anonymous statistics to the Mumble project Push To Talk: Quality & Notifications Adjust quality and notification settings. Quality settings Low Balanced Notification settings Use Text-To-Speech to read notifications and messages to you. Disable Text-To-Speech and use sounds instead. %1 ms Enables attenuation of other applications while users talk to you Attenuate applications while other users talk High Custom You already set a customized quality configuration in Mumble. Select this setting to keep it. Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. Apply some high contrast optimizations for visually impaired users Use high contrast graphics Keep custom Text-To-Speech settings. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) BanEditor Mumble - Edit Bans &Address &Mask Reason Start End User Hash &Add &Update &Remove Ban List Search field This is the search field. Use it to find bans that have this username set in the username field. Who are you looking for? No nickname IP address No IP address Reason for the ban No reason Ban end date Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). Certificate hash No certificate hash Banned users This is a list with banned users. Use this button if you want to add a new ban. Use this button if you want to update ban information. Use this button if you want to remove user from the ban list. Clear all fields This button clears all fields. Use it if you want to add a new ban. Clear Ban List - %n Ban(s) CertView Name Email Issuer Expiry Date (none) Self-signed CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. There was an error generating your certificate.<br />Please try again. Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. The file could not be opened for writing. Please use another file. The file's permissions could not be set. No certificate and key has been written. Please use another file. The file could not be written successfully. Please use another file. The file could not be opened for reading. Please use another file. The file is empty or could not be read. Please use another file. The file did not contain a valid certificate and key. Please use another file. Select file to export certificate to Select file to import certificate from Unable to import. Missing password or incompatible file type. <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. Certificates Certificate Management Certificate Authentication Authenticating to servers without using passwords Current certificate This is the certificate Mumble currently uses. Current Certificate Create a new certificate This will create a new certificate. Import certificate from file This will import a certificate from file. Import a certificate Export Certificate This will export a certificate to file. Export current certificate Import Certificate PKCS #12 Certificate import <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> Import from Filename to import from This is the filename you wish to import a certificate from. Select file to import from This opens a file selection dialog to choose a file to import a certificate from. Open... Password Password for PKCS#12 file This is the password for the PKCS#12 file containing your certificate. Certificate to import This is the certificate you are importing. Certificate Details Replace Certificate Replace existing certificate with new certificate? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> This is the certificate Mumble currently uses. It will be replaced. New certificate This is the new certificate that will replace the old one. New Certificate Make a backup of your certificate Export to Filename to export to This is the filename you wish to export a certificate to. Save As... This is the certificate Mumble currently uses. It will be exported. Generate a new certificate for strong authentication <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> Name Email Your email address (e.g. johndoe@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. Your name (e.g. John Doe) This is your name, and will be filled out in the certificate. This field is entirely optional. Finish Certificate-based authentication is ready for use Enjoy using Mumble with strong authentication. Automatic certificate creation <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> ChanACL None Traverse Enter Speak Mute/Deafen Make channel Make temporary Link channel This represents no privileges. This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. This represents the permission to write text messages to other users in this channel. This represents the permission to forcibly remove users from the server. This represents the permission to permanently remove users from the server. This represents the permission to register and unregister users on the server. This represents the permission to register oneself on the server. Whisper Move Text message Kick Ban Register User Register Self Write ACL ChatbarTextEdit Paste and &Send Paste and send <center>Type chat message here</center> ClientUser Friend Authenticated Priority speaker Recording Muted (server) Deafened (server) Local Ignore (Text messages) Local Mute Muted (self) Deafened (self) ConfigDialog Accept changes This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. Reject changes This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. Apply changes This button will immediately apply all changes. Undo changes for current page This button will revert any changes done on the current page to the most recent applied settings. Restore defaults for current page This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. Mumble Configuration ConnectDialog Connecting to %1 Enter username Adding host %1 Servername Hostname Bonjour name Port Addresses Website Packet loss Ping (80%) %1 ms Ping (95%) Bandwidth %1 kbit/s &Connect &Filters Unknown Users Version Failed to fetch server list Mumble Server Connect Ping Remove from Favorites Add custom server Show all servers that respond to ping Show all servers with users Show all servers &Copy Copy favorite link to clipboard &Paste Paste favorite from clipboard &Edit... &Add New... Add to &Favorites Open &Webpage Show &Reachable Show &Populated Show &All ConnectDialogEdit Edit Server Name of the server A&ddress Internet address of the server. Internet address of the server. <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. &Port Port on which the server is listening <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. &Username Username to send to the server <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. Label Add Server You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 Password Password to send to the server <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. Show password <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. Local server label 127.0.0.1 64738 Your username Your password &Fill CoreAudioSystem Default Device CrashReporter Mumble Crash Report <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> Email address (optional) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash Send Report Don't send report Crash upload successful Thank you for helping make Mumble better! Crash upload failed We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 Uploading crash report Abort upload DXAudioInput Default DirectSound Voice Input Opening chosen DirectSound Input device failed. No microphone capture will be done. Opening chosen DirectSound Input failed. Default device will be used. Lost DirectSound input device. DXAudioOutput Default DirectSound Voice Output Opening chosen DirectSound Output failed. Default device will be used. Lost DirectSound output device. Opening chosen DirectSound Output failed. No audio will be heard. Database Mumble failed to initialize a database in any of the possible locations. The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. DeveloperConsole Developer Console DockTitleBar Drag here GlobalShortcut Shortcuts List of configured shortcuts Function Data Shortcut Suppress Add new shortcut This will add a new global shortcut &Add Remove selected shortcut This will permanently remove a selected shortcut. &Remove <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> Open Accessibility Preferences Skip Enable Global Shortcuts <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. Additional Shortcut Engines <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. Enable Windows hooks <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. Enable GKey <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. Enable XInput <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. Enable shortcuts in privileged applications GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> Shortcuts Shortcut button combination. <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. Suppress keys from other applications <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. GlobalShortcutTarget Whisper Target Whisper to list of Users Channel Target Restrict to Group If specified, only members of this group will receive the whisper. List of users Add Remove Modifiers Do not send positional audio information when using this whisper shortcut. Ignore positional audio Shout to Linked channels Shout to subchannels Shout to Channel The whisper will also be transmitted to linked channels. The whisper will also be sent to the subchannels of the channel target. GlobalShortcutX Mouse %1 JackAudioSystem Hardware Ports Mono Stereo LCD Not connected LCDConfig Enable this device LCD Devices Name <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> Size Enabled Views Minimum Column Width <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> This setting decides the width of column splitter. Splitter Width Log Debug Critical Warning Information Server Connected Server Disconnected Other self-muted/deafened Permission Denied Text Message User Joined Server User Left Server User recording state changed User kicked (you or by you) User kicked You self-muted User muted (you) User muted (by you) User muted (other) User Joined Channel User Left Channel You self-unmuted You self-deafened You self-undeafened User renamed You Joined Channel You Joined Channel (moved) User connected and entered channel User left channel and disconnected Private text message the server [[ Invalid size ]] [[ Text object too large to display ]] [Date changed to %1] link to %1 FTP link to %1 player link channel link %1 link LogConfig Toggle console for %1 events Toggle pop-up notifications for %1 events Toggle Text-To-Speech for %1 events Click here to toggle sound notification for %1 events Toggle window highlight (if not active) for %1 events Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. Messages Message Console Notification Text-To-Speech Soundfile Path Text To Speech Volume Volume of Text-To-Speech Engine <b>This is the volume used for the speech synthesis.</b> Length threshold Message length threshold for Text-To-Speech Engine <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. Characters Whisper If checked you will only hear whispers from users you added to your friend list. Only accept whispers from friends If enabled text messages you send will be read back to you with TTS Read back own messages Chat Log Maximum chat length Unlimited Lines Highlight LookConfig System default None Only with users All Ask Do Nothing Move <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory User Interface This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. List users above subchannels (requires restart). <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. Users above Channels <b>If set, will verify you want to quit if connected.</b> Show number of users in each channel Show channel user count Language Language to use (requires restart) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. Look and Feel Layout Classic Stacked Hybrid Custom This changes the behavior when moving channels. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. Expand When to automatically expand channels Channel Dragging Ask whether to close or minimize when quitting Mumble. Ask on quit while connected Always On Top <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> Hide in tray when minimized Hide the main Mumble window in the tray when it is minimized. This setting controls when the application will be always on top. Never Always In minimal view In normal view Displays talking status in system tray Show talking status in tray icon This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. Show context menu in menu bar Apply some high contrast optimizations for visually impaired users Optimize for high contrast Application Adds user and channel context menus into the menu bar Tray Icon Channel Tree Use selected item as the chat bar target Filter automatically hides empty channels Show transmit mode dropdown in toolbar Theme Theme to use to style the user interface <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. User Dragging This changes the behavior when moving users. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. Enable Developer menu When in custom layout mode, checking this disables rearranging. Lock layout MainWindow Root Push-to-Talk Global Shortcut Push and hold this button to send voice. Global Shortcut This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut Reset Audio Processor Global Shortcut Unlink Plugin Global Shortcut Push-to-Mute Global Shortcut Join Channel Global Shortcut Toggle Overlay Global Shortcut Toggle state of in-game overlay. Global Shortcut Toggle Minimal Global Shortcut Volume Up (+10%) Global Shortcut Volume Down (-10%) Global Shortcut Mumble Mumble -- %1 &Window Minimize Ctrl+M Close Mumble is currently connected to a server. Do you want to Close or Minimize it? Mute Self Global Shortcut Set self-mute status. Global Shortcut This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut Deafen Self Global Shortcut Set self-deafen status. Global Shortcut This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut Whisper/Shout Whisper <center>Not connected</center> Not connected Clear Opening URL %1 File does not exist File is not a configuration file. Settings merged from file. URL scheme is not 'mumble' This version of Mumble can't handle URLs for Mumble version %1.%2.%3 Connecting to %1 Enter username Connecting to server %1. Reconnecting. Transmit Mode set to Continuous <p>%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> Register yourself as %1 <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <h2>Version</h2><p>Protocol %1</p> <p>No build information or OS version available</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) The connection is secured by the cipher suite that OpenSSL identifies as %1 <p>The connection provides perfect forward secrecy</p> <p>The connection does not provide perfect forward secrecy</p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> Voice channel is sent over control channel Register user %1 <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> Kicking user %1 Banning user %1 View comment on user %1 Message to channel %1 Connected. <li>Expected certificate digest (SHA-1): %1</li> Server presented a certificate which failed verification. <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> SSL Version mismatch Server connection failed. <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>Type message to user '%1' here</center> Type message to user '%1' here Choose image file Failed to load image Could not open file for reading. Image format not recognized. &User &Channel Use in conjunction with Whisper to. Global Shortcut This will switch the states of the in-game overlay. Global Shortcut Link Channel Global Shortcut Cycle Transmit Mode Global Shortcut Set Transmit Mode to Push-To-Talk Global Shortcut Set Transmit Mode to Continuous Global Shortcut Set Transmit Mode to VAD Global Shortcut Send Text Message Global Shortcut Send Clipboard Text Message Global Shortcut This will send your Clipboard content to the channel you are currently in. Global Shortcut Continuous Voice Activity Push-to-Talk Mumble - Minimal View -- %1 Cancel Save Image As... Save Image File Could not save image: %1 Change your comment Transmit Mode set to Voice Activity Transmit Mode set to Push-to-Talk <p>Connected users: %1/%2</p> UDP Statistics To Server From Server Good Late Lost Resync <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> Mumble Server Information &View Certificate Enter reason Sending message to %1 To %1: %2 Message to %1 Are you sure you want to reset the comment of user %1? Are you sure you want to reset the avatar of user %1? Are you sure you want to delete %1 and all its sub-channels? Sending message to channel %1 Message to tree %1 To %1 (Tree): %2 (Tree) %1: %2 Unmuted and undeafened. Unmuted. Muted. Muted and deafened. Deafened. Undeafened. Restart Mumble? Some settings will only apply after a restart of Mumble. Restart Mumble now? About Qt SSL Verification failed: %1 <li>Server certificate digest (SHA-1): %1</li> <b>WARNING:</b> The server presented a certificate that was different from the stored one. This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. Server connection failed: %1. Disconnected from server. Invalid username You connected with an invalid username, please try another one. Username in use That username is already in use, please try another username. Wrong certificate or password Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. Wrong password Wrong server password for unregistered user account, please try again. Images (*.png *.jpg *.jpeg) C&onfigure &Help Log This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. &Quit Mumble Closes the program Exits the application. Ctrl+Q Open the server connection dialog &Disconnect Disconnect from server Disconnects you from the server. Show information about the server connection This will show extended information about the connection to the server. &Mute &Deafen &Local Mute Send a Text Message Sends a text message to another user. Add new channel This adds a new sub-channel to the currently selected channel. Remove channel This removes a channel and all sub-channels. Edit Groups and ACL for channel This opens the Group and ACL dialog for the channel, to control permissions. &Link Link your channel to another channel This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. Chatbar Shows a dialog of registered servers, and also allows quick-connect. Kick user (with reason) Kick selected user off server. You'll be asked to specify a reason. Mute user Mute or unmute user on server. Unmuting a deafened user will also undeafen them. Kick and ban user (with reason) Kick and ban selected user from server. You'll be asked to specify a reason. Deafen user Deafen or undeafen user on server. Deafening a user will also mute them. Mute user locally Mute or unmute user locally. Use this on other users in the same room. This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. &Unlink Channel Unlink your channel from another channel This unlinks your current channel from the selected channel. Unlinks your channel from all linked channels. This unlinks your current channel (not the selected one) from all linked channels. &Reset Reset audio preprocessor This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. &Mute Self Mute yourself Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. &Deafen Self Deafen yourself Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. &Text-To-Speech Toggle Text-To-Speech Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. Display audio statistics Pops up a small dialog with information about your current audio input. Forcibly unlink plugin This forces the current plugin to unlink, which is handy if it is reading completely wrong data. Configure Mumble Allows you to change most settings for Mumble. Start the audio configuration wizard This will guide you through the process of configuring your audio hardware. &What's This? Enter What's This? mode Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. Information about Mumble Shows a small dialog with information and license for Mumble. Information about Speex Shows a small dialog with information about Speex. Information about Qt Shows a small dialog with information about Qt. Check for &Updates Check for new version of Mumble Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. Sends a text message to all users in a channel. Configure certificates for strong authentication This starts the wizard for creating, importing and exporting certificates for authentication against servers. Register user on server This will permanently register the user on the server. Add &Friend Adds a user as your friend. This will add the user as a friend, so you can recognize him on this and other servers. &Remove Friend Removes a user from your friends. This will remove a user from your friends list. &Update Friend Update name of your friend. Your friend uses a different name than what is in your database. This will update the name. Edit registered users list This opens the editor for registered users, which allow you to change their name or unregister them. Add or remove text-based access tokens &Minimal View Toggle minimal window modes This will toggle minimal mode, where the log window and menu is hidden. You muted and deafened %1. You unmuted and undeafened %1. You undeafened %1. You suppressed %1. %1 muted and deafened by %2. %1 unmuted and undeafened by %2. %1 undeafened by %2. %1 suppressed by %2. %1 moved to %2. %1 moved to %2 by %3. %1 moved in from %2 by %3. %1 is now muted and deafened. Your account information can not be verified currently. Please try again later Welcome message: %1 Mumble: %1 You were denied %1 privileges in %2. %3 was denied %1 privileges in %2. Denied: Cannot modify SuperUser. Denied: Invalid channel name. Denied: Text message too long. Denied: Operation not permitted in temporary channel. You need a certificate to perform this operation. %1 does not have a certificate. Invalid username: %1. Invalid username. Channel is full. Channel nesting limit reached. Channel count limit reached. Need to delete channels before creating new ones. Permission denied. %1 connected and entered channel. %1 connected. %1 is now muted. %1 is now unmuted. Recording started Recording stopped %1 started recording. %1 stopped recording. You revoked your priority speaker status. You assumed priority speaker status. %1 revoked your priority speaker status. %1 gave you priority speaker status. You revoked priority speaker status for %1. You gave priority speaker status to %1. %1 revoked own priority speaker status. %1 assumed priority speaker status. %1 revoked priority speaker status for %2. %1 gave priority speaker status to %2. You were unmuted and undeafened by %1. You were muted by %1. You were undeafened by %1. You were suppressed. You were suppressed by %1. You were unsuppressed. You were unsuppressed by %1. You joined %1. You moved %1 to %2. %1 is recording %1 renamed to %2 by %3. %1 disconnected. Server message from (Tree) (Channel) (Private) %2%1: %3 Failed to load Opus, it will not be available for audio encoding/decoding. The server requests minimum client version %1 The server requests positional audio be enabled. The server requests positional audio be disabled. The server requests Push-to-Talk be enabled. The server requests Push-to-Talk be disabled. You were unmuted by %1. You muted %1. You unsuppressed %1. You unmuted %1. %1 muted by %2. %1 unsuppressed by %2. %1 unmuted by %2. Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. You were muted and deafened by %1. You were deafened by %1. You were kicked from the server by %1: %2. %3 was kicked from the server by %1: %2. You were kicked and banned from the server by %1: %2. %3 was kicked and banned from the server by %1: %2. You were moved to %1 by %2. %1 entered channel. Server connection rejected: %1. Denied: %1. %1 renamed to %2. %1 left channel and disconnected. Message from %1 You have User Dragging set to "Do Nothing" so the user wasn't moved. You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. Unknown Channel Drag mode in UserModel::dropMimeData. Remote controlling Mumble: Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) -jn, --jackname Set custom Jack client name. --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status Invocation Error: No RPC command specified RPC Welcome to Mumble. Skipping version check in debug mode. Hide Frame Toggle showing frame on minimal window This will toggle whether the minimal window should have a frame for moving and resizing. &Unlink All Reset the comment of the selected user. &Join Channel View comment in editor Query server for connection information for user S&erver &Self &Unlink Plugins Register yourself on the server Change your avatar image on this server &Remove Avatar Remove currently defined avatar image. Icon Toolbar Change your own comment Recording Priority Speaker &Copy URL Copies a link to this channel to the clipboard. Ignore Messages Locally ignore user's text chat messages. Silently drops all text messages from the user. Edit ban list on server This lets you edit the server-side IP ban list. &Filter on/off Toggle the channel filter (Ctrl+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. Ctrl+F &Hide Channel when Filtering Reset the avatar of the selected user. Locally adjust the user's speech volume. Opens a dialog with a volume slider. Use this on other users in the same room. &Developer &Hide Mumble Hides the main Mumble window. Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. Show the Developer Console Shows the Mumble Developer Console, where Mumble's log output can be inspected. &Connect... &Ban list... &Information... &Kick... &Ban... Local Volume Adjustment... Send &Message... &Add... &Remove... &Edit... Audio S&tatistics... &Settings... &Audio Wizard... Developer &Console... &About... About &Speex... About &Qt... &Certificate Wizard... &Register... Registered &Users... Change &Avatar... &Access Tokens... Reset &Comment... Reset &Avatar... View Comment... &Change Comment... R&egister... Show Shows the main Mumble window. Manual Manual Mumble Positional Audio Position X Y Z m Heading Azimuth Elevation ° Meta data Context Identity Set State Unhinge Link Activate NetworkConfig Network Updates are mandatory when using snapshot releases. Connection Use TCP compatibility mode Use TCP compatability mode <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). Reconnect when disconnected <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. Reconnect automatically Proxy Type Type of proxy to connect through Direct connection HTTP(S) proxy SOCKS5 proxy Hostname Hostname of the proxy Force TCP mode Enable QoS to prioritize packets This will enable QoS, which will attempt to prioritize voice packets over other traffic. Use Quality of Service Don't send certificate to server and don't save passwords. (Not saved). <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> Suppress certificate and password storage <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. Port Port number of the proxy <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. Username Username for proxy authentication <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Password Password for proxy authentication <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Mumble services Check for new releases of Mumble automatically. This will check for new releases of Mumble every time you start the program, and notify you if one is available. Check for application updates on startup Check for new releases of plugins automatically. This will check for new releases of plugins every time you start the program, and download them automatically. <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. Submit anonymous statistics to the Mumble project Submit anonymous statistics Reconnect to last used server when starting Mumble Reconnect to last server on startup Download plugin and overlay updates on startup Privacy Prevent OS information being sent to Mumble servers and web servers <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. Do not send OS information to Mumble servers and web servers Overlay Silent Talking Whisper Shout Channel Failed to create communication with overlay at %2: %1. No overlay will be available. OverlayClient Filter Only talking Talking and recently active All in current channel All in linked channels Always show yourself Configure recently active time (%1 seconds)... Columns Sort Alphabetically Last state change Edit... Reset Zoom Configure recently active time Amount of seconds users remain active after talking: OverlayConfig To move the users, drag the little red dot. To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. For more options, right click a user. For more options, rightclick a user. Launcher Filter Overlay Choose executable Choose application Choose path Load Overlay Presets Mumble overlay presets (*.mumblelay) Save Overlay Presets Options Enable overlay. Enable Overlay This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. Layout Blacklist Whitelist Uninstall Overlay Overlay Installation Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. Install Mumble Overlay Overlay Upgrade Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. Upgrade Mumble Overlay Display a frame counter in the overlay Show FPS counter Load an overlay preset from file Load… Save your overlay settings to file Save… Set the overlay font. Set the overlay text color. Color Remove Font FPS and Clock Display Display a clock in the overlay showing the current local time (system time). Show Clock Overlay Exceptions Overlay Exception Mode Allowed launchers Add Allowed programs Allowed paths Blacklisted programs OverlayEditor State User is not talking Passive User is talking in your channel or a linked channel Talking User is whispering to you privately Private Whisper User is shouting to your channel Channel Whisper Zoom Zoom Factor Enabled Elements User avatar, chosen by each user Avatar User's name Username Name of user's channel, if outside your current channel Channel Muted or deafened Mute state Bounding box, automatically shrunk to minimum size to contain all visible elements Bounding box Overlay Editor OverlayEditorScene Layout preset Large square avatar Avatar and Name User Opacity %1% Object Opacity Alignment Left Center Right Top Bottom Color... Font... Bounding box Pen width Padding Pen color Fill color Pick pen color Pick fill color Pick color Pick font PluginConfig Plugins Plugin has no configure function. Plugin has no about function. Options Enable plugins and transmit positional information This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. Link to Game and Transmit Position Reloads all plugins This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. &Reload plugins Information about plugin This shows a small information message about the plugin. &About Show configuration page of plugin This shows the configuration page of the plugin, if any. &Configure Name Enabled Plugins Skipping plugin update in debug mode. Downloaded new or updated plugin to %1. Failed to install new plugin to %1. %1 lost link. %1 linked. PortAudioSystem Default device PulseAudioSystem Default Input Default Output QApplication Failed to restart mumble Mumble failed to restart itself. Please restart it manually. <b>Blocked URL scheme "%1"</b> The URL uses a scheme that has been blocked for security reasons. Blocked URL: "%1" RichTextEditor Failed to load image Image file too large to embed in document. Please use images smaller than %1 kB. Message is too long. Display Source Text &Bold Ctrl+B &Italic Italic Ctrl+I Underline Ctrl+U Color Insert Link Ctrl+L Insert Image RichTextEditorLink Add Link URL Text ServerHandler Unable to resolve hostname Server is not responding to TCP pings UDP packets cannot be sent to or received from the server. Switching to TCP mode. UDP packets cannot be sent to the server. Switching to TCP mode. UDP packets cannot be received from the server. Switching to TCP mode. UDP packets can be sent to and received from the server. Switching back to UDP mode. Connection timed out ServerView Favorite LAN Public Internet Unknown Africa Asia North America South America Europe Oceania ShortcutActionWidget Unassigned ShortcutDelegate On Off Toggle Unassigned ShortcutKeyWidget Press Shortcut ShortcutTargetDialog Root Parent Current Subchannel #%1 ShortcutTargetWidget ... , Root Parent Current Subchannel #%1 Invalid Empty <Empty> ShortcutToggleWidget Off Toggle On TextMessage Enter text If checked the message is recursively sent to all subchannels Send recursively to subchannels Tokens Empty Token Mumble - Access Tokens List of access tokens on current server <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. Add a token &Add Remove a token &Remove UserEdit Registered Users Remove Rename Who are you looking for? Days Weeks Months Years Inactive for Registered users: %n account(s) UserInformation User Information Connection Information Version OS Certificate IP Address CELT Versions Details... Ping Statistics Pings received Average ping TCP (Control) UDP (Voice) UDP Network statistics Good Late Lost Resync From Client To Client Connection time %1w %1d %1h %1m %1s , %1 (%2) %1.%2.%3 (%4) Supported Not Supported Not Reported %1 online (%2 idle) %1 online %1 kbit/s Bandwidth GroupBox Bandwidth Label Ping deviation UserListModel Nick Inactive days Last channel Last seen: %1 Never Channel ID: %1 UserLocalVolumeDialog Local volume for other users <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. Adjusting local volume for %1 dB <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: Talking to your channel. Shouting directly to your channel. Whispering directly to your channel. Whispering directly to you. Not talking. This is a channel on the server. The icon indicates the state of the channel: Your current channel. A channel that is linked with your channel. Linked channels can talk to each other. A channel on the server that you are not linked to. This shows the flags the user has on the server, if any: On your friend list Authenticated user Muted (manually muted by self) Muted (manually muted by admin) Muted (not allowed to speak in current channel) Muted (muted by you, only on your machine) Muted (push-to-mute) Deafened (by self) Deafened (by admin) User has a new comment set (click to show) User has a comment set, which you've already seen. (click to show) Ignoring Text Messages This shows the flags the channel has, if any: Channel has a new comment set (click to show) Channel has a comment set, which you've already seen. (click to show) Channel will be hidden when filtering is enabled Name Flags Are you sure you want to drag this user? Are you sure you want to drag this channel? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. VersionCheck Upgrade Mumble A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? Failed to launch snapshot installer. Corrupt download of new version detected. Automatically removed. Downloading new snapshot from %1 to %2 Failed to write new version to disk. Failed to write new version to disc. Mumble failed to retrieve version information from the central server. ViewCert Certificate Chain Details Certificate chain Certificate details Common Name Organization Subunit Country Locality State Valid from: %1 Valid to: %1 Serial: %1 Public Key: %1 bits %2 RSA DSA Digest (SHA-1): %1 Digest (SHA-256): %1 Email: %1 DNS: %1 Issued by: Unit Name VoiceRecorder Recorder failed to create directory '%1' Recorder failed to open file '%1' .wav - Uncompressed .ogg (Vorbis) - Compressed .au - Uncompressed .flac - Lossless compressed VoiceRecorderDialog Recorder Control 00:00:00 &Start S&top Mode Multichannel Output Output format Target directory Filename &Browse... Valid variables are: Inserts the user's name Inserts the current date Inserts the current time Inserts the hostname Recorder still running Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? Unable to start recording. Not connected to a server. The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. There is already a recorder active for this server. Please select a recording format. Stopping Select target directory Downmix WASAPIInput Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone. WASAPISystem Default Device qwPTTButtonWidget Mumble PTT Push to talk mumble-1.3.4/src/mumble/Settings.h0000664000175000017500000002705614010707273016674 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_SETTINGS_H_ #define MUMBLE_MUMBLE_SETTINGS_H_ #include #include #include #include #include #include #include #include #include #include // Global helper classes to spread variables around across threads // especially helpful to initialize things like the stored // preference for audio transmission, since the GUI elements // will be created long before the AudioInput object, and the // latter lives in a separate thread and so cannot touch the // GUI. struct Shortcut { int iIndex; QList qlButtons; QVariant qvData; bool bSuppress; bool operator <(const Shortcut &) const; bool isServerSpecific() const; bool operator ==(const Shortcut &) const; }; struct ShortcutTarget { bool bUsers; QStringList qlUsers; QList qlSessions; int iChannel; QString qsGroup; bool bLinks; bool bChildren; bool bForceCenter; ShortcutTarget(); bool isServerSpecific() const; bool operator <(const ShortcutTarget &) const; bool operator ==(const ShortcutTarget &) const; }; quint32 qHash(const ShortcutTarget &); quint32 qHash(const QList &); QDataStream &operator<<(QDataStream &, const ShortcutTarget &); QDataStream &operator>>(QDataStream &, ShortcutTarget &); Q_DECLARE_METATYPE(ShortcutTarget) struct OverlaySettings { enum OverlayPresets { AvatarAndName, LargeSquareAvatar }; enum OverlayShow { Talking, Active, HomeChannel, LinkedChannels }; enum OverlaySort { Alphabetical, LastStateChange }; enum OverlayExclusionMode { LauncherFilterExclusionMode, WhitelistExclusionMode, BlacklistExclusionMode }; bool bEnable; QString qsStyle; OverlayShow osShow; bool bAlwaysSelf; int uiActiveTime; // Time in seconds for a user to stay active after talking OverlaySort osSort; float fX; float fY; qreal fZoom; unsigned int uiColumns; QColor qcUserName[4]; QFont qfUserName; QColor qcChannel; QFont qfChannel; QColor qcFps; QFont qfFps; qreal fBoxPad; qreal fBoxPenWidth; QColor qcBoxPen; QColor qcBoxFill; bool bUserName; bool bChannel; bool bMutedDeafened; bool bAvatar; bool bBox; bool bFps; bool bTime; qreal fUserName; qreal fChannel; qreal fMutedDeafened; qreal fAvatar; qreal fUser[4]; qreal fFps; QRectF qrfUserName; QRectF qrfChannel; QRectF qrfMutedDeafened; QRectF qrfAvatar; QRectF qrfFps; QRectF qrfTime; Qt::Alignment qaUserName; Qt::Alignment qaChannel; Qt::Alignment qaMutedDeafened; Qt::Alignment qaAvatar; OverlayExclusionMode oemOverlayExcludeMode; QStringList qslLaunchers; QStringList qslLaunchersExclude; QStringList qslWhitelist; QStringList qslWhitelistExclude; QStringList qslPaths; QStringList qslPathsExclude; QStringList qslBlacklist; QStringList qslBlacklistExclude; OverlaySettings(); void setPreset(const OverlayPresets preset = AvatarAndName); void load(); void load(QSettings*); void save(); void save(QSettings*); }; struct Settings { enum AudioTransmit { Continuous, VAD, PushToTalk }; enum VADSource { Amplitude, SignalToNoise }; enum LoopMode { None, Local, Server }; enum ChannelExpand { NoChannels, ChannelsWithUsers, AllChannels }; enum ChannelDrag { Ask, DoNothing, Move }; enum ServerShow { ShowPopulated, ShowReachable, ShowAll }; enum TalkState { Passive, Talking, Whispering, Shouting }; enum IdleAction { Nothing, Deafen, Mute }; typedef QPair, QSslKey> KeyPair; AudioTransmit atTransmit; quint64 uiDoublePush; quint64 pttHold; /// Removed. This was previously used to configure whether the Mumble /// ConfigDialog should show advanced options or not. bool bExpert; bool bTxAudioCue; static const QString cqsDefaultPushClickOn; static const QString cqsDefaultPushClickOff; QString qsTxAudioCueOn; QString qsTxAudioCueOff; bool bTransmitPosition; bool bMute, bDeaf; bool bTTS; bool bUserTop; bool bWhisperFriends; bool bTTSMessageReadBack; int iTTSVolume, iTTSThreshold; /// The Text-to-Speech language to use. This setting overrides /// the default language for the Text-to-Speech engine, which /// is usually inferred from the current locale. /// /// The language is expected to be in BCP47 form. /// /// The setting is currently only supported by the speech-dispatcher ///backend. QString qsTTSLanguage; int iQuality, iMinLoudness, iVoiceHold, iJitterBufferSize; int iNoiseSuppress; bool bDenoise; quint64 uiAudioInputChannelMask; // Idle auto actions unsigned int iIdleTime; IdleAction iaeIdleAction; bool bUndoIdleActionUponActivity; VADSource vsVAD; float fVADmin, fVADmax; int iFramesPerPacket; QString qsAudioInput, qsAudioOutput; float fVolume; float fOtherVolume; bool bAttenuateOthersOnTalk; bool bAttenuateOthers; bool bAttenuateUsersOnPrioritySpeak; bool bOnlyAttenuateSameOutput; bool bAttenuateLoopbacks; int iOutputDelay; bool bUseOpusMusicEncoding; QString qsALSAInput, qsALSAOutput; QString qsPulseAudioInput, qsPulseAudioOutput; QString qsJackClientName, qsJackAudioOutput; bool bJackStartServer, bJackAutoConnect; QString qsOSSInput, qsOSSOutput; int iPortAudioInput, iPortAudioOutput; bool bASIOEnable; QString qsASIOclass; QList qlASIOmic; QList qlASIOspeaker; QString qsCoreAudioInput, qsCoreAudioOutput; QString qsWASAPIInput, qsWASAPIOutput; /// qsWASAPIRole is configured via 'wasapi/role'. /// It is a string explaining Mumble's purpose for opening /// the audio device. This can be used to force Windows /// to not treat Mumble as a communications program /// (the default). /// /// The default is "communications". When this is set, /// Windows treats Mumble as a telephony app, including /// potential audio ducking. /// /// Other values include: /// /// "console", which should be used for games, system /// notification sounds, and voice commands. /// /// "multimedia", which should be used for music, movies, /// narration, and live music recording. /// /// This is practically a direct mapping of the ERole enum /// from Windows: https://msdn.microsoft.com/en-us/library/windows/desktop/dd370842 QString qsWASAPIRole; QByteArray qbaDXInput, qbaDXOutput; bool bExclusiveInput, bExclusiveOutput; bool bEcho; bool bEchoMulti; bool bPositionalAudio; bool bPositionalHeadphone; float fAudioMinDistance, fAudioMaxDistance, fAudioMaxDistVolume, fAudioBloom; QMap qmPositionalAudioPlugins; OverlaySettings os; int iOverlayWinHelperRestartCooldownMsec; bool bOverlayWinHelperX86Enable; bool bOverlayWinHelperX64Enable; int iLCDUserViewMinColWidth; int iLCDUserViewSplitterWidth; QMap qmLCDDevices; bool bShortcutEnable; bool bSuppressMacEventTapWarning; bool bEnableEvdev; bool bEnableXInput2; bool bEnableGKey; bool bEnableXboxInput; bool bEnableWinHooks; /// Enable verbose logging in GlobalShortcutWin's DirectInput backend. bool bDirectInputVerboseLogging; /// Enable use of UIAccess (Windows's UI automation feature). This allows /// Mumble greater access to global shortcuts. bool bEnableUIAccess; QList qlShortcuts; enum MessageLog { LogNone = 0x00, LogConsole = 0x01, LogTTS = 0x02, LogBalloon = 0x04, LogSoundfile = 0x08, LogHighlight = 0x10 }; int iMaxLogBlocks; QMap qmMessageSounds; QMap qmMessages; QString qsLanguage; /// Name of the theme to use. @see Themes QString themeName; /// Name of the style to use from theme. @see Themes QString themeStyleName; QByteArray qbaMainWindowGeometry, qbaMainWindowState, qbaMinimalViewGeometry, qbaMinimalViewState, qbaSplitterState, qbaHeaderState; QByteArray qbaConfigGeometry; enum WindowLayout { LayoutClassic, LayoutStacked, LayoutHybrid, LayoutCustom }; WindowLayout wlWindowLayout; ChannelExpand ceExpand; ChannelDrag ceChannelDrag; ChannelDrag ceUserDrag; bool bMinimalView; bool bHideFrame; enum AlwaysOnTopBehaviour { OnTopNever, OnTopAlways, OnTopInMinimal, OnTopInNormal }; AlwaysOnTopBehaviour aotbAlwaysOnTop; bool bAskOnQuit; bool bEnableDeveloperMenu; bool bLockLayout; bool bHideInTray; bool bStateInTray; bool bUsage; bool bShowUserCount; bool bChatBarUseSelection; bool bFilterHidesEmptyChannels; bool bFilterActive; QByteArray qbaConnectDialogHeader, qbaConnectDialogGeometry; bool bShowContextMenuInMenuBar; QString qsUsername; QString qsLastServer; ServerShow ssFilter; QString qsImagePath; bool bUpdateCheck; bool bPluginCheck; // PTT Button window bool bShowPTTButtonWindow; QByteArray qbaPTTButtonWindowGeometry; // Network settings enum ProxyType { NoProxy, HttpProxy, Socks5Proxy }; bool bTCPCompat; bool bReconnect; bool bAutoConnect; bool bQoS; ProxyType ptProxyType; QString qsProxyHost, qsProxyUsername, qsProxyPassword; unsigned short usProxyPort; /// The ping interval in milliseconds. The Mumble client /// will regularly send TCP and UDP pings to the remote /// server. This setting specifies the time (in milliseconds) /// between each ping message. int iPingIntervalMsec; /// The connection timeout duration in milliseconds. /// If a connection is not fully established to the /// server within this duration, the client will /// forcefully disconnect. int iConnectionTimeoutDurationMsec; /// bUdpForceTcpAddr forces Mumble to bind its UDP /// socket to the same address as its TCP /// connection is using. bool bUdpForceTcpAddr; /// iMaxInFlightTCPPings specifies the maximum /// number of ping messages that the client has /// sent, but not yet recieved a response for /// from the server. This value is checked when /// the client sends its next ping message. If /// the maximum is reached, the connection will /// be closed. /// If this setting is assigned a value of 0 or /// a negative number, the TCP ping check is /// disabled. int iMaxInFlightTCPPings; /// The service prefix that the WebFetch class will use /// when it constructs its fully-qualified URL. If this /// is empty, no prefix is used. /// /// When the WebFetch class receives a HTTP response which /// includes the header "Use-Service-Prefix", this setting /// is updated to reflect the received service prefix. /// /// For more information, see the documentation for WebFetch::fetch(). QString qsServicePrefix; // Network settings - SSL QString qsSslCiphers; // Privacy settings bool bHideOS; int iMaxImageWidth; int iMaxImageHeight; KeyPair kpCertificate; bool bSuppressIdentity; bool bShowTransmitModeComboBox; // Accessibility bool bHighContrast; // Recording QString qsRecordingPath; QString qsRecordingFile; enum RecordingMode { RecordingMixdown, RecordingMultichannel }; RecordingMode rmRecordingMode; int iRecordingFormat; // Special configuration options not exposed to UI /// Codec kill-switch bool bDisableCELT; /// Disables the "Public Internet" section in the connect dialog if set. bool disablePublicList; /// Removes the add and edit options in the connect dialog if set. bool disableConnectDialogEditing; // Config updates unsigned int uiUpdateCounter; // Nonsaved LoopMode lmLoopMode; float dPacketLoss; float dMaxPacketDelay; /// If true settings in this structure require a client restart to apply fully bool requireRestartToApply; bool doEcho() const; bool doPositionalAudio() const; Settings(); void load(); void load(QSettings*); void save(); }; #endif mumble-1.3.4/src/mumble/mumble_zh_CN.ts0000664000175000017500000136517214010707274017643 0ustar builderbuilder ACLEditor Deny 拒绝 Allow 允许 Allow %1 允许%1 Deny %1 拒绝%1 Mumble - Add channel Mumble - 添加频道 Default server value 服务器默认设置 Failed: Invalid channel 失败:无效的频道 Mumble - Edit %1 Mumble - 编辑 %1 ID: %1 ID:%1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 授予“%1”权限。如果一项权限既被设为允许又被设为禁止,那么它将被禁止。<br />%2 Channel must have a name 必须给频道命名 This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 撤销“%1”权限。如果一项权限既被设为允许又被设为禁止,那么它将被禁止。<br />%2 Dialog 对话框 Name 名称 Enter the channel name here. 在这里输入频道名。 Description 描述 Password 密码 Enter the channel password here. 在这里输入频道密码。 Check to create a temporary channel. 选中此项以创建一个临时频道。 Temporary 临时频道 <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>位置</b><br/> 这个值允许您更改 Mumble 在频道树列表中排列频道的方式。一个拥有较高<i>位置</i>值的频道总是被排在拥有较低值的频道下方。如果两个频道的<i>位置</i>值相同,它们将按名称顺序排列。 Position 位置序号 &Groups 分组(&G) Group 分组 List of groups 分组列表 Remove selected group 删除所选分组 Remove 删除 Inherit group members from parent 从上级分组继承组成员 Inherit 继承 Make group inheritable to sub-channels 允许分组被子频道继承 Inheritable 可继承 Group was inherited from parent channel 分组是从上级频道继承的 Inherited 来自继承 Members 成员 Add 添加 Add member to group 添加成员到分组 Remove member from group 将成员从分组删除 &ACL &ACL(访问控制列表) Active ACLs 激活的 ACL List of entries 规则列表 Inherit ACL of parent? 是否从父级继承 ACL? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. 设置是否应用从父频道继承的 ACL 选项。只有被标记为“作用于子频道”的规则才会被继承。 Inherit ACLs 继承 ACL Move entry up 规则上移 This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. 在列表中将您选中的规则向上移动。一条规则通过顺序来决定优先级,这将会改变用户的权限的实际效果。您不能将一条规则移动到到继承的规则之上。如果您确实需要这样做,就需要新建一条重复的规则。 &Up 上移(&U) Move entry down 规则下移 This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. 在列表中将您选中的规则向下移动。一条规则通过顺序来决定优先级,这将会改变用户的权限的实际效果。 &Down 下移(&D) Add new entry 添加新规则 This adds a new entry, initially set with no permissions and applying to all. 添加一条新的规则,它默认没有任何权限,并对所有成员生效。 &Add 添加(&A) Remove entry 删除规则 This removes the currently selected entry. 删除当前所选的规则。 &Remove 删除(&R) Context 上下文 Entry should apply to this channel. Entry should apply to this channel 规则应作用于当前频道。 This makes the entry apply to this channel. 将此规则设置为作用于当前频道。 Applies to this channel 作用于当前频道 Entry should apply to sub-channels. 规则应作用于子频道。 Add new group 添加新分组 <b>Add</b><br/> Add a new group. <b>添加</b><br/> 添加一个新的分组。 Inherited members 被继承的成员 Contains the list of members added to the group by this channel. 包含被该频道添加到分组的成员列表。 Contains a list of members whose group membership will not be inherited from the parent channel. 包含不从父频道继承分组成员关系的成员列表。 Contains the list of members inherited by other channels. 包含被其他频道继承的成员列表。 Type in the name of a user you wish to add to the group and click Add. 输入您希望添加到分组的用户名并点击添加。 Type in the name of a user you wish to remove from the group and click Add. 输入您希望从分组删除的用户名并点击添加。 Exclude 例外 Excluded members 例外成员 This makes the entry apply to sub-channels of this channel. 这将使规则作用于此频道的所有子频道。 Applies to sub-channels 作用于子频道 Permissions 权限 User/Group 用户/分组 Group this entry applies to 该规则作用的分组 User ID 用户 ID User this entry applies to 该规则作用的用户 This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. 此选项控制规则将作用于哪些用户。请输入用户名并按回车键,以向服务器查询匹配。 &Properties 属性(&P) <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>名称</b><br />在此输入频道名称。名称需要符合您所连接的服务器的限制。 <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>临时频道</b><br /> 选中后,创建的频道将被标记为临时频道。这意味着此频道的最后一名用户离开后,频道将被服务器自动删除。 <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>分组</b><br /> 此频道目前定义的所有分组。要创建一个新的分组,只需要输入名称并按回车键。 <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>删除</b><br />删除当前所选分组。如果分组是继承的,将无法从列表中删除,但所有关于此分组的本地信息将被清除。 <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>继承</b><br />如果此分组在父频道被标记为<i>可继承</i>,则从父级继承此分组的所有成员。 <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>可继承</b><br />标记此分组能够被子频道继承。如果分组不可被继承,子频道也可以自由建立一个同名的新分组。 <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>来自继承</b><br />表示此分组是从父频道继承来的,您不能编辑这个标识,这仅仅是一条信息。 <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>成员</b><br /> 此列表包含所有被当前频道添加到该分组的成员。请注意这里不包含继承自频道树中更高层级频道的成员。您可以在<i>继承的成员</i>列表中找到此类成员。如果不希望成员被低层级的频道继承,可以取消选择<i>可继承</i>选项或者将成员添加到<i>例外成员</i>列表。 <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>例外成员</b><br /> 包含不会从父频道继承分组成员关系的成员列表。 <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. <b>继承的成员</b><br /> 包含被当前频道继承的成员列表。取消<i>继承</i>选项可以阻止从高层级频道继承。 This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. 控制此规则作用于哪个用户组。<br />请注意分组由规则所作用的频道的上下文关系决定。例如,Root 频道的默认 ACL 允许 <i>admin</i> 组的<i>编辑</i>权限。如果某个频道继承了这条规则,并且一名用户属于此频道的 <i>admin</i> 组,即使他不属于该 ACL 原始定义频道的 <i>admin</i> 组,此用户也会有编辑权限。<br />如果一个分组名以“!”符号开头,则它的规则会被反转,而如果分组名以“~”开头,则它的规则会按照定义 ACL 的原始频道而非当前频道进行计算。<br />如果分组名以“#”开头,它将会被解释为一个访问令牌。用户需要在他们的访问令牌列表中添加“#”号后面对应的字符串才能匹配。这是一种非常简单的使未认证用户通过密码访问频道的方式。<br />如果分组名以“$”开头,则只会匹配证书哈希与“$”后面的字符串匹配的用户。<br />还有一些特殊的预定义组如下:<br /><b>all</b> - 匹配所有人。<br /><b>auth</b> - 匹配所有已认证用户。<br /><b>sub,a,b,c</b> - 匹配处于共同父频道数至少为 <i>a</i> 的、子频道深度介于 <i>b</i> 和 <i>c</i> 之间的频道中的用户。查看网站上的扩展文档以了解本预定义组的更多信息。<br /><b>in</b> - 匹配在当前频道的用户(“<i>sub,0,0,0</i>”的简写)。<br /><b>out</b> - 匹配不在当前频道的用户(“<i>!sub,0,0,0</i>”的简写)。<br />请注意,规则仅适用于用户或分组之一,而不能同时适用于两者。 <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. <b>密码</b><br />您可以为频道设置一个密码,其本质为 Mumble 的访问令牌功能。如果您需要更细致、强大的访问控制,请使用 ACL 和分组功能。 This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. 显示当前频道被激活的所有规则。从父频道继承的规则以斜体显示。<br />ACL 的优先级是自上而下的,这意味着列表最下面的规则拥有最高的优先级。 ID of the channel. 频道的 ID。 Maximum Users 最大用户数 Maximum number of users allowed in the channel 频道内允许的最大用户数 <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. <b>最大用户数</b><br /> 该值设置频道内允许的最大用户数。如果该值为 0,则使用服务器的默认设置。 This is the sort order for the channel. 这是用于排序此频道的参数。 ALSAAudioInput Default ALSA Card 默认 ALSA 声卡 Opening chosen ALSA Input failed: %1 开启所选 ALSA 输入设备失败:%1 ALSAAudioOutput Default ALSA Card 默认 ALSA 声卡 Opening chosen ALSA Output failed: %1 开启所选 ALSA 输出设备失败:%1 ASIOConfig %1 (version %2) %1(版本 %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz %1 -> %2 采样缓冲,%3 采样分辨率(%4 首选),频率 %5 Hz ASIO Initialization failed: %1 ASIO 初始化失败:%1 Failed to instantiate ASIO driver ASIO 驱动实例化失败 ASIO ASIO Device selection 设备选择 Device 设备 Device to use for microphone 麦克风使用的硬件 This chooses what device to query. You still need to actually query the device and select which channels to use. 此选项选择需要查询的设备。您需要实际查询设备并且选择需要使用的通道。 Query selected device 查询所选设备 This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. 查询所选设备的通道。请注意很多 ASIO 驱动是非常不完善的,查询它们可能会导致应用或系统崩溃。 &Query 查询(&Q) Configure selected device 配置所选设备 This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. 配置所选的设备。请注意很多 ASIO 驱动是非常不完善的,查询它们可能会导致应用或系统崩溃。 &Configure 配置(&C) Capabilities 性能 Driver name 设备名 Buffer size 缓存大小 This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. 配置 ASIO 的输入通道。确保至少选择一个通道作为麦克风和扬声器。<i>麦克风</i>应当是您的麦克风所连接的通道,而<i>扬声器</i>应当是发出“<i>您听到的声音</i>”的通道。<br />例如,在 Audigy 2 ZS 上,麦克风应选择“<i>Mic L</i>”,而扬声器应选择“<i>Mix L</i>”和“<i>Mix R</i>”。 Configure input channels 设置输入通道 Channels 通道 Microphone 麦克风 <- <- -> -> Unused 未使用 Speakers 扬声器 ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. 至少需要选择一个麦克风源和一个扬声器源才能使用 ASIO。如果仅需要麦克风采样,请使用 DirectSound。 Opening selected ASIO device failed. No input will be done. 开启所选 ASIO 设备失败。无法进行输入。 AboutDialog About Mumble 关于 Mumble <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> <h3>Mumble (%1)</h3><p>%3</p><p><b>面向游戏玩家的语音聊天工具</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble 关于 Mumble(&A) &License 许可(&L) A&uthors 作者(&U) &Third-Party Licenses 第三方许可(&T) OK 确定 AudioInput Interface 接口 System 系统 Input method for audio 音频输入方式 <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>音频采用的输入方式。</b><br />通常应该选择 DirectSound。 Device 设备 Input device for audio 音频输入设备 <b>This is the input device to use for audio.</b> <b>音频采用的输入设备。</b> Transmission 传输 &Transmit 传输模式(&T) When to transmit your speech 何时传输您的语音 <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. <b>设置何时传输您的语音。</b><br /><i>连续发言</i> - 始终发送语音。<br /><i>语音激活</i> - 当您清楚地发言时。<br /><i>按键发言</i> - 当您按住您设置的<i>快捷键</i>时。 DoublePush Time 双击时间 If you press the PTT key twice in this time it will get locked. 如果您在这个时间内连续按下两次按键发言键,它将会被锁定。 <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. <b>双击时间</b><br />如果您在配置的时间间隔内按下两次按键发言快捷键,它将会被锁定。 Mumble 将连续传输语音,直到您再次按下该键解锁按键发言状态。 Reset audio cue to default 重置音频提示为默认值 <b>Reset</b><br/>Reset the paths for the files to their default. <b>重置</b><br/>重置文件的路径为默认值。 Browse for on audio file 浏览传输开启时的音频文件 Browse for off audio file 浏览传输关闭时的音频文件 Off 关闭 On 开启 Preview the audio cues 试听音频提示 Use SNR based speech detection 使用信噪比语音检测 Signal to Noise 信噪比 <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. <b>设置使用振幅进行语音检测</b><br />在此模式下,使用输入信号的原始强度检测您是否在说话。 Amplitude 振幅 Voice &Hold 语音保持(&H) How long to keep transmitting after silence 安静后保持多久的传输时间 Silence Below 安静阈值 <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. <b>设置语音检测的触发值。</b><br />将此功能与“音频统计”窗口一起使用,可手动调整用于检测语音的触发值。低于“安静阈值”的输入值始终算作安静。高于“语音阈值”的值始终算作语音。如果您已经在说话,那么介于中间的值不会触发新的检测,都算作语音。 Speech Above 语音阈值 Signal values above this count as voice 超过此值的信号即为语音 Compression 压缩 &Quality 质量(&Q) Quality of compression (peak bandwidth) 压缩质量(峰值带宽) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. <b>设置压缩质量</b><br />这决定了允许 Mumble 传出音频使用的带宽。 Audio per packet 数据包音频量 How many audio frames to send per packet 每个数据包发送多少音频帧 <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>选择应将多少个音频帧放入一个数据包中。</b><br />增加此值会增加语音的延迟,但也会降低带宽要求。 <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). <b>显示使用的峰值传出带宽。</b><br />显示从您的计算机发出的峰值带宽量。音频比特率是单独音频数据的最大比特率(因为我们使用 VBR)。位置是用于位置信息的比特率。开销是我们的帧数据和 IP 数据包标头(IP 和 UDP 占此开销的 75%)。 Audio Processing 音频处理 Noise Suppression 噪声抑制 Noise suppression 噪声抑制 <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. <b>设置要应用的噪声抑制量。</b><br />该值越高,被消除的静止噪声就越多。 Maximum amplification of input sound 输入声音的最大放大倍数 <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. <b>输入的最大放大倍数</b><br />Mumble 会在压缩前将输入音量标准化,并设置允许放大的倍数。<br />实际级别会根据您当前的语音模式不断更新,但永远不会超过此处指定的级别。<br />如果音频统计的<i>麦克风响度</i>级别徘徊在 100% 左右,您可能希望将此值设置为 2.0 左右,但如果像大多数人一样,无法达到 100%,请将此值设置得更高。<br />一般来说,应该将其设置到<i>麦克风响度 * 放大倍数 >= 100</i>,即使您说话十分柔和。<br /><br />请注意,将此值设置为最大没有任何害处,但如果您使其自动调整到该级别,Mumble 将会开始接收其他对话。 Current speech detection chance 当前语音检测状态 Cancel echo from speakers 消除扬声器的回声 Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. 启用该选项将消除从您的扬声器里发出的回声。混合模式消耗的 CPU 资源较少,但是它仅在扬声器与麦克风音量等级相近并距离相等时工作良好。多通道回声消除提供更好的回声消除效果,但是消耗的 CPU 资源较多。 Disabled 禁用 <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>设置使用信噪比进行语音检测。</b><br />在此模式下,分析输入信号是否类似于清晰信号,并以该信号的清晰度触发语音检测。 <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>显示当前的语音检测设置。</b><br />您可以在设置对话框或者音频向导中改变设置。 Signal values below this count as silence 低于此值的信号被视为安静 Maximum bandwidth used for sending audio 用于发送的音频的最大带宽 Use Amplitude based speech detection 使用振幅语音检测 <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). <b>选择感知到说话停止后应该持续传输多长时间。</b><br />如果您发言时遇到声音中断(通过您名字旁边快速闪烁的语音图标检查),请将此值调高。 Exclusive mode 独占模式 <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>以独占模式开启设备</b><br />其他应用程序将无法使用该设备。 Exclusive 独占 R&eset 重置(&E) &Browse... 浏览(&B)... B&rowse... 浏览(&R)... &Preview 试听(&P) <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. <b>试听</b><br/>播放当前设置的<i>开启</i>提示音和<i>关闭</i>提示音。 Displays an always on top window with a push to talk button in it 显示一个总是置顶的窗口,其中包含一个“按键发言”按钮 Display push to talk window 显示按键发言窗口 Misc 其他 Audible audio cue when starting or stopping to transmit 开始或停止传输时发出提示音 <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. <b>启用传输状态提示音</b><br />设置在开始传输音频和停止传输音频时播放的简短提示音。 Audio cue 音频提示 Gets played when starting to transmit 开始传输时播放 Gets played when stopping to transmit 停止传输时播放 Hold Time 保持时间 Time the microphone stays open after the PTT key is released 释放按键发言键后麦克风保持打开的时间 Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) 服务器限制带宽为 %1 千比特/秒。语音质量已自动调整到 %2 千比特/秒(%3 毫秒) Max. Amplification 最大放大倍数 Idle action 空闲操作 minutes do 分钟后 nothing 什么也不做 deafen 关闭扬声器 mute 关闭麦克风 after 在空闲 Echo Cancellation 回声消除 Mixed echo cancellation 混合回声消除 Multichannel echo cancellation 多通道回声消除 The idle action will be reversed upon any key or mouse button input 在检测到任何鼠标或键盘动作后,撤销空闲操作 Undo Idle action upon activity 在活动时撤消空闲操作 Apply RNNoise's noise suppression filter. 应用 RNNoise 的噪声抑制滤波器。 <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. <b>应用 RNNoise 的噪声抑制滤波器。</b><br />RNNoise 基于机器学习技术,并已在 WebRTC 中应用。 RNNoise RNNoise Audio input 音频输入 AudioInputDialog Continuous 连续发言 Voice Activity 语音激活 Push To Talk 按键发言 Audio Input 音频输入 %1 ms %1 毫秒 Off 关闭 %1 s %1 秒 %1 kb/s %1 千字节/秒 -%1 dB -%1 分贝 %1 kbit/s (Audio %2, Position %4, Overhead %3) %1 千比特/秒(音频 %2,位置 %4,开销 %3) AudioOutput Interface 接口 System 系统 Output method for audio 音频输出方式 <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>音频采用的输出方式。</b><br />通常应该选择 DirectSound。 Device 设备 Output device for audio 音频输出设备 <b>This is the output device to use for audio.</b> <b>音频采用的输出设备。</b> Positional Audio 位置音频 Audio Output 音频输出 Default &Jitter Buffer 默认抖动缓冲区(&J) Safety margin for jitter buffer 抖动缓冲安全边际 <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. <b>设置抖动缓冲区的最小安全边际。</b><br />所有传入的音频都被缓冲,抖动缓冲区不断尝试将缓冲区推进到您的网络最低的可持续限度,以尽可能降低延迟。这将设置要使用的最小缓冲区大小。如果您听到的句子开头抖动较大,请增大这个值。 Minimum distance to user before sound volume decreases 语音音量开始减小的最小用户距离 This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. 设置声音计算的最小距离。在其他用户与您的距离超出这个值之前,他们的语音音量不会被减小。 This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. 设置声音计算的最大距离。在其他用户与您的距离超过这个值时,他们的语音音量将不会继续被减小。 <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. <b>启用回放测试模式</b><br /><i>无</i> - 禁用回放<br /><i>本地</i> - 模拟一个本地服务器<br /><i>服务器</i> - 向服务器请求回放<br />请注意,启用回放时,其他用户将无法听到您的声音。此设置在退出程序后不会被保存。 Volume 音量 Volume of incoming speech 传入语音音量 <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. </b>调整传入的语音音量</b><br />注意,如果您将这个值增大到超过 100%,音频将会失真。 Output Delay 输出延迟 Amount of data to buffer 缓冲的数据总量 The connected "speakers" are actually headphones The connected "speakers" are actually headphones. 已连接的“扬声器”实际上是耳机 Factor for sound volume decrease 音量减小因子 Bloom 增幅 Factor for sound volume increase 音量增大因子 How much should sound volume increase for sources that are really close? 对于非常接近的音源,音量应该增大多少? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. 如果您仅使用耳机,而未连接任何扬声器,请选中此选项。这非常重要,因为扬声器通常在您面前,而耳机则直接将声音传输到您的左右耳。 This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. 设置输出缓冲区中需要预缓冲的数据量。尝试不同的值并将其设置为最低值,可以避免声音中的快速抖动。 Headphones 耳机 Minimum Distance 最小距离 Maximum Distance 最大距离 Maximum distance, beyond which speech volume won't decrease 语音音量不再减小的最大用户距离 Minimum Volume 最小音量 What should the volume be at the maximum distance? 在最大距离时的音量应有多大? Loopback Test 回放测试 Delay Variance 延迟差异 Variance in packet latency 数据包延迟的差异 <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>设置回放测试的数据包延迟差异。</b><br />大多数音频路径包含一些可变延迟。这使您可以为回放模式测试设置该差异。例如,如果将此值设置为 15 毫秒,则会模拟具有 20-35 毫秒 Ping 延迟的网络或具有 80-95 毫秒延迟的网络。大多数区域的网络连接的差异约为 5 毫秒。 Packet Loss 丢包 Packet loss for loopback mode 回放模式丢包 <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% <b>设置回放模式的丢包。</b><br />设置丢包率。除非您的带宽太小或者网络出现问题,否则应该为 0% &Loopback 回放(&L) Desired loopback mode 预期回放模式 Attenuate applications by... 减小其他应用音量 Attenuation of other applications during speech 说话时减小其他应用程序的音量 <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. <b>在有人说话时减小其他应用程序的音量</b><br />Mumble 支持在传入和/或传出语音期间减小其他应用程序的音量。如果启用此功能,则会设置其他应用程序的音量衰减。 If checked Mumble lowers the volume of other applications while other users talk 选中时,Mumble 会在其他用户说话时减小其他应用程序的音量 <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. <b>在其他用户说话时减小其他应用程序的音量</b><br />Mumble 支持在传入和/或传出语音期间减小其他应用程序的音量。该选项使 Mumble 在其他用户与您交谈时激活该功能。 while other users talk 当其他人说话时 If checked Mumble lowers the volume of other applications while you talk 选中时,Mumble 会在您说话时减小其他应用程序的音量 <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. <b>在您说话时减小其他应用程序的音量</b><br />Mumble 支持在传入和/或传出语音期间减小其他应用程序的音量。该选项使 Mumble 在您说话时激活该功能。 while you talk 当您说话时 Exclusive mode, not recommended. 独占模式(不推荐)。 <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>以独占模式开启设备。</b><br />其他应用程序将无法使用该设备。 Exclusive 独占 Priority Speaker 优先发言人 If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. 选中时,如果您具有“优先发言人”状态,Mumble 会在您说话时减小其他用户的音量。 <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. <b>在作为优先发言人说话时减小其他用户的音量。</b><br />Mumble 支持您在作为<i>优先发言人</i>说话时减小其他用户的音量以避免受到干扰。选中此选项将启用此功能。 Attenuate other users while talking as Priority Speaker. 在以优先发言人身份说话时减小其他用户的音量。 Advanced Attenuation Options 高级衰减选项 If checked, Mumble will only attenuate applications that are using the same output source as Mumble 如果选中,Mumble 将仅减小音频输出源与 Mumble 相同的应用程序的音量 <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. <b>仅减小音频输出源与 Mumble 相同的应用程序的音量</b><br />如果选中,则输出源与 Mumble 不同的应用程序将不会被减小音量。 Only attenuate applications using the same output device 仅衰减音频输出设备与 Mumble 相同的应用程序 If checked, PulseAudio loopback modules will be attenuated 如果选中,将减小 PulseAudio 回放模块的音量 <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. <b>减小 PulseAudio 回放模块的音量</b><br />如果回放模块被链接到 Mumble 的输出设备/接收器,它们也将被衰减。 Attenuate PulseAudio loopback modules 衰减 PulseAudio 回放模块 Audio output 音频输出 AudioOutputDialog None Local 本地 Server 服务器 Audio Output 音频输出 %1 ms %1 毫秒 %1 % %1 % %1 m %1 米 AudioOutputSample Choose sound file 选择声音文件 Invalid sound file 无效的声音文件 The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. Mumble 无法使用文件“%1”。请选择格式与编码兼容的文件。 AudioStats >1000 ms >1000ms >1000 毫秒 Audio Statistics 音频统计 Input Levels 输入电平 Peak microphone level 麦克风峰值电平 Peak power in last frame 最后一帧的峰值功率 This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. 显示最后一帧(20 毫秒)的峰值功率,与常见的显示为“输入功率”的测量值相同。请忽略此值,然后查看<b>麦克风功率</b>,这样更加稳定并且会忽略异常值。 Peak speaker level 扬声器峰值电平 This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. 显示最后一帧(20 毫秒)扬声器的峰值功率。除非您配置了扬声器通道的多通道采样方法(例如 ASIO),否则将为 0。如果您进行了这样的配置,并且当您用其他应用程序播放音频时仍然显示 0,则说明您的设置无效。 Peak clean level 清洁峰值电平 This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. 显示经过处理后的最后一帧(20 毫秒)的峰值功率。理想情况下,在您未说话时,它应该是 -96 分贝。实际上,音频工作室应该看到 -60 分贝,有时可能会达到 -20 分贝左右。在您说话时,它应该上升到介于 -5 到 -10 分贝之间。<br />如果您正在使用回声消除,并且这个值在您未说话时上升到超过 -15 分贝,则表示您的设置不起作用,您的回声会干扰到其他用户。 Signal Analysis 信号分析 Microphone power 麦克风功率 How close the current input level is to ideal 当前输入电平与理想电平的接近程度 This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. 这表明您当前的输入音量与理想值的接近程度。要调整麦克风音量,请打开用于调节录音音量的任何程序,并在说话时查看此处的值。<br /><b>然后像您被菜鸟击杀时那样暴躁地大声说话。</b><br />调整音量直到此值接近 100%,但请确保它不要更高。如果更高,您的部分语音可能会出现裁切,这会降低音质。 Signal-To-Noise ratio 信噪比 Signal-To-Noise ratio from the microphone 麦克风的信噪比 This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. 这是最后一帧(20 毫秒)麦克风的信噪比(SNR)。它表示声音与噪声的清晰程度的对比。<br />如果此值低于 1.0,则信号中的噪声比声音更多,因此质量会降低。<br />这个值没有上限,但是如果您没有一个专业级的音频工作室,就不要期望能够达到 40-50 以上。 Speech Probability 语音概率 Probability of speech 声音是语音的概率 This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). 这是最后一帧(20 毫秒)是语音而非环境噪声的概率。<br />语音激活的传输取决于此概率。其策略是句子的中间部分总是被检测为语音;问题在于词语之间和语句开始的停顿。很难区分叹气与以“h”开头的单词。<br />如果此值为粗体字,则表示 Mumble 当前正在传输(如果您已连接)。 Configuration feedback 配置反馈 Current audio bitrate 当前音频比特率 Bitrate of last frame 最后一帧比特率 DoublePush interval 双击间隔 Time between last two Push-To-Talk presses 最后两次按下按键发言键的间隔时间 Speech Detection 语音检测 Current speech detection chance 当前语音检测状态 <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>显示当前的语音检测设置。</b><br />您可以在设置对话框或者音频向导中改变设置。 Signal and noise power spectrum 信噪功率谱 Power spectrum of input signal and noise estimate 输入信号和噪声估值的功率谱 This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. 显示当前输入信号(红线)和噪声估值(蓝色区域)的功率谱。<br />所有幅度都被乘以 30 以显示有趣的部分(每个波段中信号比噪声多出多少)。<br />这可能只在您尝试微调麦克风上的噪声条件时有意义。在良好的条件下,底部应该只有一点点蓝色的颤动。如果图表上的蓝色超过一半,则您的环境非常嘈杂。 Echo Analysis 回声分析 Weights of the echo canceller 回声消除器权重 This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. 显示回声消除器的权重,时间向下增加,频率向右增加。<br />理想情况下,图表应该是黑色,表示根本不存在回声。更常见的是,您会看见一个或多个蓝色水平条纹代表延时回声。您应该能够看到实时更新的权重。<br />请注意,只要您没有任何回声,您就不会在这里看到太多有用的数据。播放一些音乐,它就应该会稳定下来。<br />您可以选择查看频域权重的实部或虚部,或者经计算的模数和相位。其中最有用的可能是模数,它是回声的幅度,并显示在该时间步内消除了多少输出信号。其他查看模式对于想要调整回声消除算法的人来说非常有用。<br />请注意:如果整个图像在模数模式下大幅波动,则回声消除器无法在两个输入源(扬声器与麦克风)之间找到任何相关性。您或者在回声上有很长的延迟,或者其中一个输入源配置错误。 This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. 这是最后一个压缩帧(20 毫秒)的音频比特率,因此当 VBR 调整质量时,它会上下跳转。可以在“设置”对话框中调整峰值比特率。 AudioWizard Audio Tuning Wizard 音频设置向导 Introduction 简介 Welcome to the Mumble Audio Wizard 欢迎来到 Mumble 音频设置向导 Finished 完成 Enjoy using Mumble 祝您使用 Mumble 愉快 Device selection 设备选择 Selecting the input and output device to use with Mumble. 选择 Mumble 使用的输入和输出设备。 This is the device your microphone is connected to. 这是您的麦克风连接的设备。 System 系统 Input method for audio 音频输入方式 <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>音频采用的输入方式。</b><br />通常应该选择 DirectSound。 Device 设备 Input device to use 要使用的输入设备 <b>Selects which sound card to use for audio input.</b> <b>选择您用于音频输入的声卡。</b> Cancel echo from headset or speakers 消除耳机或扬声器的回声 Use echo cancellation 使用回声消除 This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. 这将启用输出音频的回声消除,这对耳机和扬声器都很有帮助。 This is the device your speakers or headphones are connected to. 连接到您的扬声器或者耳机的设备。 Output method for audio 音频输出方式 <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>音频采用的输出方式。</b><br />通常应该选择 DirectSound。 Output device to use 要使用的输出设备 <b>Selects which sound card to use for audio Output.</b> <b>选择您用于音频输出的声卡。</b> Enable positional audio 启用位置音频 Allows positioning of sound Allows positioning of sound. 允许声音包含位置信息 <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> <p> 这是 Mumble 的音频设置向导。它将帮助您正确地设置您的声卡的输入电平,以及正确的 Mumble 声音处理参数。 </p> <p> 请注意,在整个设置过程中,音频将采用本地回放的方式使您能听到,而且没有任何音频会被发送到服务器。 </p> Input Device 输入设备 Output Device 输出设备 This allows Mumble to use positional audio to place voices. 允许 Mumble 根据位置的不同播放位置音频。 <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> <p> 要想降低音频延迟,尽量减少声卡缓冲区缓冲的音频是非常重要的。但是,很多声卡声称所需的缓冲区大小都小于正常工作所需的大小,所以唯一的办法就是调整和尝试。 </p> <p> 您应该听到一段语音示例。调整下面的滑块,在<b>不</b>造成声音卡顿和抖动的前提下,尽可能调低。请注意,在此测试期间,本地回放暂时关闭。 </p> Amount of data to buffer 要缓冲的数据量 This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. 设置输出缓冲区中需要预缓冲的数据量。尝试不同的值并将其设置为最低值,可以避免声音中的快速抖动。 <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> <p> 打开操作系统的声音控制面板,前往“录制”设置。确保“麦克风”是当前激活的输入,并且录制音量为最大,如果有“麦克风加强”选项,那么也请启用。 </p> <p>现在对着麦克风大声说话,并同时逐渐降低“麦克风”面板中的音量,直到下方的指示条在您说话时始终处于蓝色和绿色区域,而<b>不会</b>到达红色区域。 </p> Positional Audio 位置音频 Adjusting attenuation of positional audio. 调整位置音频的衰减。 <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> <p> Mumble 支持在一些游戏中使用位置音频功能,能够根据玩家在游戏中的相对位置来将用户的语音方位化。根据他们的位置,用户之间语音的音量会随着距离和方向而模拟变化。这需要您在操作系统中正确配置扬声器的立体声,此测试就是为了保证这一点。 </p> <p> 下方的图像显示了<font color="red">您</font>、<font color="yellow">扬声器</font>和<font color="green">移动的音源</font>的俯视图,您应该能够听到音频在声道中的移动。 </p> Use headphones instead of speakers 使用耳机代替扬声器 <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> <p> 祝贺,您现在可以开始体验 Mumble 的丰富音频功能。 </p> <p> Mumble 仍在持续开发中,开发团队希望能专注于大多数用户需要的功能。所以这个选项使 Mumble 支持向开发者提交关于设置的匿名统计数据。这些数据会帮助我们未来的开发进程,也保证您需要的功能不会被废弃。 </p> Use headphones 使用耳机 This ignores the OS speaker configuration and configures the positioning for headphones instead. 忽略系统扬声器配置,并改为耳机配置位置音频。 Volume tuning 音量调节 Tuning microphone hardware volume to optimal settings. 调节麦克风硬件音量来优化设置。 Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. 现在请轻声说话,像夜间的悄悄话一样。调节下方的滑块,使指示条能够在您说话时处于绿色区域,但在不说话时保持在蓝色区域。 Voice Activity Detection 语音激活检测 Letting Mumble figure out when you're talking and when you're silent. 让 Mumble 能够判断您是否正在说话。 This will help Mumble figure out when you are talking. The first step is selecting which data value to use. 这些设置能让 Mumble 判断您是否正在说话。首先选择使用哪种数据来判断发言状态。 Raw amplitude from input 原始输入振幅 Signal-To-Noise ratio 信噪比 Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). 然后我们来调节下方的滑块,使您说的前几个音节能让上方的指示条达到绿色区域(明确发言);当您正在说话时,指示条应该在黄色区域(疑似发言);当您不说话时,指示条应该处于红色区域(明确不发言)。 Device tuning 设备调整 Changing hardware output delays to their minimum value. 尽量调节硬件输出延迟到最小。 Submit anonymous statistics to the Mumble project 向 Mumble 发送匿名统计数据 Push To Talk: 按键发言: Quality & Notifications 音频质量与通知 Adjust quality and notification settings. 调节音频质量与通知设置。 Quality settings 质量设置 Low Balanced 均衡 Notification settings 通知设置 Use Text-To-Speech to read notifications and messages to you. 启用语音播报来朗读通知和其他人的消息。 Disable Text-To-Speech and use sounds instead. 禁用语音播报,改用提示音。 %1 ms %1 毫秒 Enables attenuation of other applications while users talk to you 允许在其他用户说话时减小其他应用程序的音量 Attenuate applications while other users talk 其他用户说话时减小应用程序音量 High Custom 自定义 You already set a customized quality configuration in Mumble. Select this setting to keep it. 您已在 Mumble 中设置了自定义质量。选择此设置以保留它。 Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. 在其他用户与您交谈时衰减其他应用程序的音量。这意味着一旦有人开始在 Mumble 中与您交谈,所有其他应用程序(如音频播放器)的声音音量将会被减小,以便您可以更清楚地听到其他人的声音。 Apply some high contrast optimizations for visually impaired users 为视障用户应用一些高对比度优化 Use high contrast graphics 使用高对比度图像 Keep custom Text-To-Speech settings. 保留自定义的语音播报设置。 <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode <p> 打开操作系统的声音控制面板,前往“录制”设置。确保“麦克风”是当前激活的输入,并且录制音量为最大,如果有“麦克风加强”选项,那么也请启用。 </p> <p>现在对着麦克风大声说话,并同时逐渐降低“麦克风”面板中的音量,直到下方的指示条在您说话时始终处于条纹和空白区域,而<b>不会</b>到达网格区域。 </p> Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode 现在请轻声说话,像夜间的悄悄话一样。调节下方的滑块,使指示条能够在您说话时处于空白区域,但在不说话时保持在条纹区域。 Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode 然后我们来调节下方的滑块,使您说的前几个音节能让上方的指示条达到空白区域(明确发言);当您正在说话时,指示条应该在条纹区域(疑似发言);当您不说话时,指示条应该处于网格区域(明确不发言)。 In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) 在此配置下,Mumble 会使用<b>较小的带宽</b>,但不可避免地会导致较高的延迟和较低的音质。仅在网络连接无法支持其他配置时使用。(16 千比特/秒,每个数据包 60 毫秒) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) 这是<b>推荐的默认设置</b>。在音质、延迟和带宽上有良好的平衡。(40 千比特/秒,每个数据包 20 毫秒) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) 仅在带宽完全不是问题的情况下使用,例如局域网中。使 Mumble 启用所支持的最低延迟和<b>最高音质</b>。(72 千比特/秒,每个数据包 10 毫秒) BanEditor Mumble - Edit Bans Mumble - 编辑封禁 &Address 地址(&A) &Mask 掩码(&M) Reason 原因 Start 开始 End 结束 User 用户 Hash 哈希 &Add 添加(&A) &Update 更新(&U) &Remove 删除(&R) Ban List 封禁名单 Search field 搜索框 This is the search field. Use it to find bans that have this username set in the username field. 这是搜索框。使用它来查找用户名字段包含此用户名的封禁。 Who are you looking for? 您在找谁? No nickname 无昵称 IP address IP 地址 No IP address 无 IP 地址 Reason for the ban 封禁原因 No reason 无原因 Ban end date 封禁结束时间 Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). 封禁结束时间。如果您设置的开始与结束时间相同,此封禁将会是永久的(永不过期)。 Certificate hash 证书哈希 No certificate hash 无证书哈希 Banned users 封禁用户 This is a list with banned users. 显示被封禁用户的列表。 Use this button if you want to add a new ban. 使用此按钮添加一个新的封禁。 Use this button if you want to update ban information. 使用此按钮更新一个封禁的信息。 Use this button if you want to remove user from the ban list. 使用此按钮从封禁列表中删除一名用户。 Clear all fields 清除所有输入 This button clears all fields. Use it if you want to add a new ban. 此按钮可以清除全部输入内容。在您需要添加新封禁时使用。 Clear 清空 Ban List - %n Ban(s) 封禁列表 - %n 个封禁 CertView Name 名称 Email 电子邮件 Issuer 颁发者 Expiry Date 过期时间 (none) (无) Self-signed 自签名 CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. 无法验证电子邮件。<br />输入一个有效的电子邮件地址或留空以继续。 There was an error generating your certificate.<br />Please try again. 生成证书时发生错误。<br />请重试。 Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. 您的证书和密钥无法导出为 PKCS#12 格式。您的证书可能存在错误。 The file could not be opened for writing. Please use another file. 无法打开并写入文件。请选择其他文件。 The file's permissions could not be set. No certificate and key has been written. Please use another file. 无法设置文件权限。证书和密钥未被写入。请选择其他文件。 The file could not be written successfully. Please use another file. 无法成功写入文件。请选择其他文件。 The file could not be opened for reading. Please use another file. 无法打开并读取文件。请选择其他文件。 The file is empty or could not be read. Please use another file. 文件为空或不可读。请选择其他文件。 The file did not contain a valid certificate and key. Please use another file. 文件不包含有效的证书和密钥。请选择其他文件。 Select file to export certificate to 选择证书要导出到的文件 Select file to import certificate from 选择要导入的证书文件 Unable to import. Missing password or incompatible file type. 无法导入。密码错误或文件类型不受支持。 <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. <b>证书过期:</b>您的证书已过期。您需要重新生成一个新的证书,否则将无法连接到注册过的服务器。 Certificates Certificate Management 证书管理 Certificate Authentication 证书认证 Authenticating to servers without using passwords 免密码登录服务器 Current certificate 当前证书 This is the certificate Mumble currently uses. Mumble 当前正在使用的证书。 Current Certificate 当前证书 Create a new certificate 创建新证书 This will create a new certificate. 创建一个新的证书。 Import certificate from file 从文件导入证书 This will import a certificate from file. 从文件导入一个证书。 Import a certificate 导入证书 Export Certificate 导出证书 This will export a certificate to file. 导出一个证书到文件。 Export current certificate 导出当前证书 Import Certificate 导入证书 PKCS #12 Certificate import 导入 PKS #12 证书 <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble 可以导入一个 PKCS #12 格式的证书。这种格式的证书不仅可以被 Mumble 导入,还可以由 Firefox、Internet Explorer、Opera 等浏览器导出。</p><p>如果文件是被密码保护的,您需要输入密码才能导入证书。</p> Import from 导入自 Filename to import from 导入证书的文件名 This is the filename you wish to import a certificate from. 您需要导入的证书文件名。 Select file to import from 选择需要导入的文件 This opens a file selection dialog to choose a file to import a certificate from. 打开一个对话框以选择需要导入的证书。 Open... 打开... Password 密码 Password for PKCS#12 file PKCS#12 证书文件的密码 This is the password for the PKCS#12 file containing your certificate. 包含证书的 PKCS#12 文件的密码。 Certificate to import 导入的证书 This is the certificate you are importing. 您要导入的证书。 Certificate Details 证书详情 Replace Certificate 替换证书 Replace existing certificate with new certificate? 用新证书替换已存在的证书? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> <p>您已经在 Mumble 中保存了一个证书,并且您现在将要替换它。</p> <p>如果您升级到一个由可信证书机构签发的证书,并且证书的使用的电子邮件符合您的当前证书,这是完全安全的,而且您连接到的服务器会根据您的电子邮件地址自动识别这个强证书。 </p> <p>如果情况不是这样,您将不会被任何注册过的服务器认可。如果您尚未在任何服务器注册过,则没有任何影响。 </p> <p> 确定要替换证书? </p> This is the certificate Mumble currently uses. It will be replaced. Mumble 当前正在使用的证书。它将会被替换。 New certificate 新证书 This is the new certificate that will replace the old one. 用于替换当前证书的新证书。 New Certificate 新证书 Make a backup of your certificate 创建证书的备份 Export to 导出至 Filename to export to 导出证书的文件名 This is the filename you wish to export a certificate to. 您需要导出的证书文件名。 Save As... 保存为... This is the certificate Mumble currently uses. It will be exported. Mumble 当前正在使用的证书。它将会被导出。 Generate a new certificate for strong authentication 生成一个用于强认证的证书 <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> <p>Mumble 将会生成一个强证书用于服务器认证。</p><p>您可以提供一些额外的信息,这些信息将写在证书内,并向您连接的服务器呈现。如果您提供了一个有效的电子邮件地址,就可以随时升级到由证书机构签发的电子邮件证书,可以提供更强的身份认证。</p> Name 姓名 Email 电子邮件 Your email address (e.g. johndoe@mumble.info) 您的电子邮件地址(例如 johndoe@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. 您的电子邮件地址。强烈推荐使用有效的邮件地址,否则可能会在升级强认证的时候遇到问题。 Your name (e.g. John Doe) 您的姓名(例如 John Doe) This is your name, and will be filled out in the certificate. This field is entirely optional. 您希望填写到证书里的名称。这完全是可选的。 Finish 完成 Certificate-based authentication is ready for use 证书认证已可用 Enjoy using Mumble with strong authentication. 享受 Mumble 的强认证功能。 Automatic certificate creation 自动证书创建 <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>如果您丢失了当前证书,例如计算机硬件发送故障或者重新安装了操作系统,您将无法通过已注册服务器的身份认证。因此需要<b>强制</b>备份证书文件。我们强烈建议您将此备份存储到可移动设备中,例如 U 盘。</p> <p>注意:这个文件是未加密的,如果其他人获得此文件,他们将可以冒充您,所以请小心保管。</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> <p>Mumble 可以使用证书来登录服务器。使用证书代替密码来登陆,意味着您无需向远程站点透露密码。这让注册过程更加简单,并且您可以在客户端管理独立于服务端的好友列表。</p><p>尽管证书对于 Mumble 不是必须的,但大部分服务器仍然希望您拥有一个证书。</p><p>一般来说,直接创建一个新证书即可,但 Mumble 也支持认证由第三方签发的、证明用户电子邮件地址所有权的证书。要获取更多信息,可以查看我们的<a href="http://mumble.info/certificate.php">用户证书文档</a>。</p> ChanACL None Traverse 通过 Enter 进入 Speak 说话 Mute/Deafen 禁言/禁听 Make channel 创建频道 Make temporary 创建临时频道 Link channel 链接频道 This represents no privileges. 表示没有任何权限。 This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. 允许完全控制频道,包括改变分组和 ACL 信息。此权限包含了所有其他权限。 This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. 允许通过频道。如果用户不具有此权限,他将无法进入此频道和所有子频道,即使他拥有子频道的其他权限。 This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. 允许进入频道。如果您设定了分级频道结构,则可能需要授予所有人通过权限,但限制根频道的进入权限。 This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. 允许在频道内说话。用户如果没有此权限,将会在此频道内被服务器禁言(关闭麦克风),直到被具有相关权限的人解除禁言。 This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. 允许在频道外时对此频道发送密语。与<i>说话</i>权限类似。但仅当用户按下密语键时才有效。此功能可以在不链接频道的情况下向多级频道广播内容。 This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. 允许关闭其他用户的麦克风(禁言)和扬声器(禁听)。一旦被禁言,用户将一直处于麦克风关闭状态,直到被其他拥有权限的用户解除或者重新连接服务器。 This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. 允许将用户移动到另一个频道或者将其踢出服务器。对于移动操作,需要移动者拥有目标频道的移动权限,或者被移动者拥有进入目标频道的权限。拥有此权限的用户可以将没有进入某个频道权限的用户移动到该频道。 This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. 允许创建子频道。用户可以创建一个子频道并被加入子频道的 admin(管理员)组。 This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. 允许创建临时子频道。用户可以创建一个临时子频道并被加入其 admin(管理员)组。临时频道不会一直存在,在最后一名用户离开后,临时频道就会消失。 This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. 允许链接频道。只要说话的用户拥有对应频道的说话权限,被链接的频道内的用户就可以听到彼此的说话。您需要同时拥有两个频道的链接权限才能创建频道链接,但是只要拥有其中一个频道的链接权限就能删除此链接。 This represents the permission to write text messages to other users in this channel. 允许在频道内发送文字消息给其他用户。 This represents the permission to forcibly remove users from the server. 允许强制用户离开服务器。 This represents the permission to permanently remove users from the server. 允许永久阻止用户进入服务器。 This represents the permission to register and unregister users on the server. 允许在服务器上为其他用户注册和取消注册。 This represents the permission to register oneself on the server. 允许用户在服务器上注册自己。 Whisper 密语 Move 移动用户 Text message 文字消息 Kick 踢出用户 Ban 封禁用户 Register User 注册用户 Register Self 注册自己 Write ACL 编辑 ACL ChatbarTextEdit Paste and &Send Paste and send 粘贴并发送(&S) <center>Type chat message here</center> <center>在这里输入聊天消息</center> ClientUser Friend 好友 Authenticated 已认证 Priority speaker 优先发言人 Recording 正在录音 Muted (server) 麦克风关闭(禁言) Deafened (server) 扬声器关闭(禁听) Local Ignore (Text messages) 本地屏蔽(文字消息) Local Mute 本地屏蔽(语音) Muted (self) 麦克风关闭(自己) Deafened (self) 扬声器关闭(自己) ConfigDialog Accept changes 接受修改 This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. 接受当前的设置并返回应用程序。<br />在您退出应用时,这些设置将被保存到硬盘。 Reject changes 拒绝修改 This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. 拒绝所有的修改并返回应用程序。<br />设置将被重置为上一个状态。 Apply changes 应用修改 This button will immediately apply all changes. 立即应用所有的修改。 Undo changes for current page 撤销此页面的修改 This button will revert any changes done on the current page to the most recent applied settings. 撤销您在此页面上的所有修改。 Restore defaults for current page 恢复此页面为默认值 This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. 恢复此页面上的所有设置为默认值。其他页面不会被修改。<br />要将所有设置恢复为默认,您必须在每个页面上使用此按钮。 Mumble Configuration Mumble 配置 ConnectDialog Connecting to %1 正在连接 %1 Enter username 输入用户名 Adding host %1 添加主机 %1 Servername 服务器名 Hostname 主机名 Bonjour name Bonjour 名称 Port 端口 Addresses 地址 Website 网页 Packet loss 丢包 Ping (80%) Ping(80%) %1 ms %1 毫秒 Ping (95%) Ping(95%) Bandwidth 带宽 %1 kbit/s %1 千比特/秒 &Connect 连接(&C) &Filters 筛选(&F) Unknown 未知 Users 用户数 Version 版本 Failed to fetch server list 获取服务器列表失败 Mumble Server Connect Mumble 服务器连接 Ping Ping Remove from Favorites 从收藏夹中删除 Add custom server 添加自定义服务器 Show all servers that respond to ping 显示所有响应 Ping 的服务器 Show all servers with users 显示所有有用户的服务器 Show all servers 显示所有服务器 &Copy 复制(&C) Copy favorite link to clipboard 复制收藏夹链接到剪贴板 &Paste 粘贴(&P) Paste favorite from clipboard 从剪贴板粘贴到收藏夹 &Edit... 编辑(&E)... &Add New... 添加(&A)... Add to &Favorites 添加到收藏夹(&F) Open &Webpage 打开网页(&W) Show &Reachable 显示可连接的服务器(&R) Show &Populated 显示有用户在线的服务器(&P) Show &All 显示所有服务器(&A) ConnectDialogEdit Edit Server 编辑服务器 Name of the server 服务器名称 A&ddress 地址(&D) Internet address of the server. Internet address of the server. 服务器的 Internet 地址。 <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>地址</b><br/> 服务器的 Internet 地址,可以是普通的主机名、IPv4/IPv6 地址或者一个 Bonjour 服务 ID。Bonjour 服务 ID 必须以“@”为前缀,Mumble 才能识别。 &Port 端口(&P) Port on which the server is listening 服务器所监听的端口 <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. <b>端口</b><br/> 服务器所使用的监听端口。如果服务器由 Bonjour 服务 ID 标识,此值会被忽略。 &Username 用户名(&U) Username to send to the server 发送到服务器的用户名 <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. <b>用户名</b><br/> 发送到服务器的用户名。请注意,服务器可以限制用户名的格式。您的用户名也可能已被其他用户使用。 Label 别名 Add Server 添加服务器 You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 您当前已连接到一个服务器。 您想要将当前连接服务器的数据填写到此对话框吗? 主机:%1 端口:%2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 您的剪贴板中有一个 URL。 您想要将它填写到此对话框吗? 主机:%1 端口:%2 Password 密码 Password to send to the server 发送到服务器的密码 <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. <b>密码</b><br/> 连接服务器时发送到服务器的密码。如果您以 <i>SuperUser</i>(超级用户)身份连接服务器或者连接一个通过密码认证的服务器,则需要填写密码。如果您没有在此处输入,则连接服务器时会被要求输入密码。 Show password 显示密码 <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. <b>别名</b><br/> 服务器的别名。此名称会在服务器列表中显示,您可以随意选择此名称。 Local server label 本地服务器别名 127.0.0.1 127.0.0.1 64738 64738 Your username 用户名 Your password 密码 &Fill 填写(&F) CoreAudioSystem Default Device 默认设备 CrashReporter Mumble Crash Report Mumble 崩溃报告 <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> <p><b>很抱歉,Mumble 发生了崩溃。您是否需要向 Mumble 开发者发送崩溃报告?</b></p><p>此报告包含部分 Mumble 崩溃时的内存快照,可以帮助开发者更好地解决问题。</p> Email address (optional) 电子邮件地址(选填) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash 请使用英语简单地描述您在崩溃之前的操作 Send Report 发送报告 Don't send report 不发送报告 Crash upload successful 崩溃报告上传成功 Thank you for helping make Mumble better! 感谢您帮助 Mumble 变得更好! Crash upload failed 崩溃报告上传失败 We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. 非常抱歉,发送崩溃报告因错误 %1 %2 而失败。请通知开发者。 This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 这并不有趣,显然崩溃报告代码中存在漏洞,所以无法成功发送报告。您可以将错误 %1 告知开发者 Uploading crash report 正在上传崩溃报告 Abort upload 取消上传 DXAudioInput Default DirectSound Voice Input 默认 DirectSound 声音输入 Opening chosen DirectSound Input device failed. No microphone capture will be done. 开启所选 DirectSound 输入设备失败。将无法捕获麦克风。 Opening chosen DirectSound Input failed. Default device will be used. 开启所选 DirectSound 输入失败。将使用默认设备。 Lost DirectSound input device. DirectSound 输入设备丢失。 DXAudioOutput Default DirectSound Voice Output 默认 DirectSound 声音输出 Opening chosen DirectSound Output failed. Default device will be used. 开启所选 DirectSound 输出失败。将使用默认设备。 Lost DirectSound output device. DirectSound 输出设备丢失。 Opening chosen DirectSound Output failed. No audio will be heard. 开启所选 DirectSound 输出失败。将无法播放声音。 Database Mumble failed to initialize a database in any of the possible locations. Mumble 从某处初始化数据库时失败。 The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. 数据库“%1”是只读的。在修复此错误前,Mumble 将无法保存服务器设置(即 SSL 证书)。 DeveloperConsole Developer Console 开发者控制台 DockTitleBar Drag here 拖放到此处 GlobalShortcut Shortcuts 快捷键 List of configured shortcuts 已设置快捷键列表 Function 操作 Data 数据 Shortcut 快捷键 Suppress 屏蔽 Add new shortcut 添加新的快捷键 This will add a new global shortcut 添加一个新的全局快捷键 &Add 添加(&A) Remove selected shortcut 删除所选快捷键 This will permanently remove a selected shortcut. 永久删除被选中的快捷键。 &Remove 删除(&R) <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> <html><head/><body><p>Mumble 目前仅支持鼠标按钮和键盘修饰键(Alt、Ctrl、Cmd 等)作为全局快捷键。</p><p>如果您希望更灵活,可以在系统辅助功能偏好设置中启用<span style=" font-style:italic;">辅助设备访问</span>。但请注意,此更改还可能允许恶意程序读取键盘上键入的内容。</p></body></html> Open Accessibility Preferences 打开辅助功能偏好设置 Skip 跳过 Enable Global Shortcuts 启用全局快捷键 <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. <b>其他快捷键引擎</b><br />本部分允许您配置其他全局快捷键引擎的使用。 Additional Shortcut Engines 其他快捷键引擎 <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. <b>启用 Windows 钩子</b>。<br />这将启用 Windows 钩子快捷键引擎。 启用此引擎可使 Mumble 屏蔽按键和鼠标点击。 Enable Windows hooks 启用 Windows 钩子 <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. <b>启用 GKey</b>。<br />此设置启用对 GKey 快捷键引擎的支持,用于 Logitech 键盘上的 G 键。 Enable GKey 启用 GKey <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. <b>启用 XInput</b><br />此设置启用对 XInput 快捷键引擎的支持,用于兼容 Xbox 的游戏控制器。 Enable XInput 启用 XInput <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. <b>允许在特权应用中使用快捷键</b>。<br />这也被称为“UIAccess”,使 Mumble 可以从高权限应用程序接收全局快捷键事件,例如在管理员命令提示符或以管理员权限运行的旧游戏中。 <br /><br /> 如果未启用此选项,则在特权应用程序中,Mumble 全局快捷键将不起作用。这可能导致看起来不一致的行为:例如,如果在非特权程序中按住按键发言键,但在特权应用程序中松开,Mumble 将无法发现它已被释放,您将会继续保持说话状态,直到您再次按下按键发言键。 Enable shortcuts in privileged applications 在特权应用中启用快捷键 GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> <html><head/><body><p>Mumble 目前仅支持鼠标按钮和键盘修饰键(Alt、Ctrl、Cmd 等)作为全局快捷键。</p><p>如果您希望更灵活,可以在 Mac 系统偏好设置的“安全性与隐私”中将 Mumble 添加为信任的辅助功能程序。</p><p>在偏好设置的“安全性与隐私”面板,转到“隐私”标签。然后在左侧的列表内选择“辅助功能”(靠近底部)。最后,在右侧添加 Mumble 作为信任的辅助功能程序</body></html> Shortcuts 快捷键 Shortcut button combination. 快捷键组合。 <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. <b>全局快捷键组合。</b><br />点击此框,然后按下相应的按键/按钮组合,以重新绑定快捷键,双击清除已绑定的快捷键。 Suppress keys from other applications 屏蔽其他应用程序的按键 <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. <b>隐藏其他应用程序的按键。</b><br />启用此功能将隐藏其他应用程序的按键(或组合键的最后一个键)。请注意,并非所有按键都可以被屏蔽。 GlobalShortcutTarget Whisper Target 密语目标 Whisper to list of Users 对列表中的用户密语 Channel Target 频道目标 Restrict to Group 限制分组 If specified, only members of this group will receive the whisper. 如果指定,只有分组中的用户才能接收到密语。 List of users 用户列表 Add 添加 Remove 删除 Modifiers 选项 Do not send positional audio information when using this whisper shortcut. 使用密语快捷键时不发送位置音频信息。 Ignore positional audio 忽略位置语音 Shout to Linked channels 对链接的频道呼喊 Shout to subchannels 对子频道呼喊 Shout to Channel 对频道呼喊 The whisper will also be transmitted to linked channels. 密语也会被传输到链接的频道。 The whisper will also be sent to the subchannels of the channel target. 密语也会被传输到目标频道的子频道。 GlobalShortcutX Mouse %1 鼠标 %1 JackAudioSystem Hardware Ports 硬件端口 Mono 单声道 Stereo 立体声 LCD Not connected 未连接 LCDConfig Enable this device 启用此设备 LCD LCD Devices 设备 Name 名称 <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> <p>您系统中可用的 LCD 设备列表。此列表按设备名称排列,也包含屏幕的尺寸。Mumble 支持在同时输出到多个 LCD 设备。</p> <h3>尺寸:</h3> <p> 此区域显示了 LCD 设备的尺寸。该尺寸以像素(图像 LCD)或者字符数(字符 LCD)表示。</p> <h3>启用:</h3> <p>表示 Mumble 是否应该向该 LCD 设备输出显示。</p> Size 尺寸 Enabled 启用 Views 视图 Minimum Column Width 最小列宽 <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> <p>此选项定义用户视图中一列的最小宽度。</p> <p>如果太多用户在同一时间说话,用户视图会被分割成不同的列。您可以使用此选项,在 LCD 上显示的用户数量与用户名宽度之间找到一个平衡。</p> This setting decides the width of column splitter. 设置列分割线的宽度。 Splitter Width 分割线宽度 Log Debug 日志(调试) Critical 日志(严重) Warning 日志(警告) Information 日志(信息) Server Connected 已连接到服务器 Server Disconnected 与服务器断开连接 Other self-muted/deafened 其他人关闭自己的麦克风/扬声器 Permission Denied 权限被拒绝 Text Message 文字消息 User Joined Server 用户加入服务器 User Left Server 用户离开服务器 User recording state changed 用户录音状态改变 User kicked (you or by you) 用户踢出你或被你踢出 User kicked 用户踢出 You self-muted 您关闭自己的麦克风 User muted (you) 用户关闭您的麦克风 User muted (by you) 用户被您关闭麦克风 User muted (other) 用户关闭麦克风(其他) User Joined Channel 用户加入频道 User Left Channel 用户离开频道 You self-unmuted 您开启自己的麦克风 You self-deafened 您关闭自己的扬声器 You self-undeafened 您开启自己的扬声器 User renamed 用户重命名 You Joined Channel 您进入频道 You Joined Channel (moved) 您进入频道(被移动) User connected and entered channel 用户连接到服务器并进入频道 User left channel and disconnected 用户离开频道并断开连接 Private text message 私人文字消息 the server 服务器 [[ Invalid size ]] [[ 无效尺寸 ]] [[ Text object too large to display ]] [[ 文字对象太大,无法显示 ]] [Date changed to %1] [日期变更为 %1] link to %1 链接到 %1 FTP link to %1 FTP 链接到 %1 player link 播放器链接 channel link 频道链接 %1 link %1 链接 LogConfig Toggle console for %1 events 开关“%1”事件的控制台输出 Toggle pop-up notifications for %1 events 开关“%1”事件的弹出通知 Toggle Text-To-Speech for %1 events 开关“%1”事件的语音播报 Click here to toggle sound notification for %1 events 开关“%1”事件的提示音 Toggle window highlight (if not active) for %1 events 开关“%1”事件的窗口高亮(如果未激活) Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change 为“%1”事件的提示音选择一个声音文件<br />点击播放<br />双击更改 Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. 点击这里开关“%1”事件的控制台输出。<br />如果选中此选项,Mumble 将会把所有“%1”事件输出到消息日志。 Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. 点击这里开关“%1”事件的弹出通知。<br />如果选中此选项,Mumble 将会为所有“%1”事件弹出一个通知。 Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. 点击这里开关“%1”事件的窗口高亮。<br />如果选中此选项,在 Mumble 窗口未激活的情况下,每次“%1”事件都会高亮窗口。 Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. 为“%1”事件选择提示音文件路径。<br />点击播放<br />双击更改<br />请确保这些事件已经开启提示音或者未设置其他提醒效果。 Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. 点击这里开关“%1”事件的语音播报。<br />如果选中此选项,Mumble 将会使用文字转语音引擎为您播报“%1”事件。语音播报能够读出事件内容,这是提示音所不具备的功能。语音播报和提示音不能同时启用。 Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. 点击这里开关“%1”事件的提示音。<br />如果选中此选项,Mumble 会使用您设定好的声音文件提示“%1”事件。提示音和语音播报不能同时启用。 Messages 消息 Message 消息 Console 控制台 Notification 通知 Text-To-Speech 语音播报 Soundfile 提示音文件 Path 路径 Text To Speech 语音播报 Volume 音量 Volume of Text-To-Speech Engine 语音播报引擎的音量 <b>This is the volume used for the speech synthesis.</b> <b>设置语音合成的音量</b> Length threshold 长度限制 Message length threshold for Text-To-Speech Engine 语音播放引擎的消息长度限制 <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. <b>设置语音播报消息的长度</b><br />超过这个长度限制的消息将不会被完整播报内容。 Characters 字符 Whisper 密语 If checked you will only hear whispers from users you added to your friend list. 如果选中此选项,您将只能听到好友列表内用户的密语。 Only accept whispers from friends 仅接受好友的密语 If enabled text messages you send will be read back to you with TTS 如果启用,您发送的文字消息也会被语音播报给您 Read back own messages 播报自己的消息 Chat Log 聊天记录 Maximum chat length 最大聊天长度 Unlimited 无限制 Lines Highlight 窗口高亮 LookConfig System default 系统默认 None Only with users 仅有用户时 All 全部展开 Ask 询问 Do Nothing 无动作 Move 移动 <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory <a href="%1">浏览</a> User Interface 界面 This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. 设置频道的自动展开。<i>不展开</i>和<i>全部展开</i>将会折叠所有频道或展开所有频道。<i>仅有用户时</i>将会在用户加入或离开频道时自动展开或折叠。 List users above subchannels (requires restart). 将用户显示在子频道上方(需要重启)。 <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. <b>如果选中,频道的用户将会显示在其子频道的上方。</b><br />此更改需要重启 Mumble 才能生效。 Users above Channels 用户显示在频道上方 <b>If set, will verify you want to quit if connected.</b> <b>如果选中,在您已连接服务器时退出需要确认。</b> Show number of users in each channel 显示每个频道的用户数 Show channel user count 显示频道用户数 Language 语言 Language to use (requires restart) 将使用的语言(需要重启) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. <b>设置 Mumble 应该使用的语言。</b><br />您需要重启 Mumble 才能使用新的语言。 Look and Feel 外观和体验 Layout 布局 Classic 经典 Stacked 堆叠 Hybrid 混合 Custom 自定义 This changes the behavior when moving channels. 改变移动频道时的行为。 This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. 设置频道被拖动时的行为,用于防止意外的拖动。<i>移动</i>表示立刻移动频道而不需要任何确认。<i>无动作</i>表示不做任何改变并显示一条错误消息。<i>询问</i>表示弹出一个消息框以确认您是否确实要移动频道。 Expand 频道展开 When to automatically expand channels 何时自动展开频道 Channel Dragging 频道拖动 Ask whether to close or minimize when quitting Mumble. 在退出 Mumble 时,询问您要关闭还是最小化。 Ask on quit while connected 在已连接服务器时确认退出 Always On Top 始终置顶 <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> <b>如果设置,最小化时 Mumble 主窗口将被最小化到系统托盘。否则将以普通窗口方式最小化。</b> Hide in tray when minimized 最小化时隐藏到系统托盘 Hide the main Mumble window in the tray when it is minimized. 在最小化时隐藏 Mumble 主窗口到系统托盘。 This setting controls when the application will be always on top. 此选项控制应用程序何时需要置顶显示。 Never 从不 Always 总是 In minimal view 简洁视图时 In normal view 普通视图时 Displays talking status in system tray 在系统托盘显示说话状态 Show talking status in tray icon 使用系统托盘图标显示说话状态 This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. 此选项控制何时将应用置于顶层。如果选择<i>从不</i>,应用程序将永远不会至于顶层。<i>总是</i>表示应用程序总是显示在顶层。<i>简洁视图时</i>/<i>普通视图时</i>表示将仅在激活/未激活简洁视图时将应用程序置于顶层。 Show context menu in menu bar 菜单栏显示右键菜单 Apply some high contrast optimizations for visually impaired users 为视障用户启用一些高对比度优化 Optimize for high contrast 高对比度优化 Application 应用程序 Adds user and channel context menus into the menu bar 在菜单栏添加“用户”和“频道”的右键菜单 Tray Icon 系统托盘图标 Channel Tree 频道树 Use selected item as the chat bar target 以所选对象作为聊天栏目标 Filter automatically hides empty channels 筛选频道时自动隐藏空频道 Show transmit mode dropdown in toolbar 在工具栏显示传输模式下拉列表 Theme 主题 Theme to use to style the user interface 用于设置界面样式的主题 <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. <b>配置 Mumble 界面应该使用哪种主题设置样式</b><br />Mumble 将从特定目录中获取主题并将其显示在此列表中。您选择的主题将用于自定义 Mumble 的外观,包括颜色、图标等。 User Dragging 用户拖动 This changes the behavior when moving users. 改变移动用户时的行为。 This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. 设置用户被拖动时的行为,用于防止意外的拖动。<i>移动</i>表示立刻移动用户而不需要任何确认。<i>无动作</i>表示不做任何改变并显示一条错误消息。<i>询问</i>表示弹出一个消息框以确认您是否确实要移动用户。 <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. <b>启用开发者菜单</b><br />Mumble 将启用“开发者”菜单。此菜单用于开发者使用的功能,例如开发者控制台。 Enable Developer menu 启用开发者菜单 When in custom layout mode, checking this disables rearranging. 在自定义布局模式下,选中此选项将禁止重新排列。 Lock layout 锁定布局 MainWindow Root Root Push-to-Talk Global Shortcut 按键发言 Push and hold this button to send voice. Global Shortcut 按住此按钮时发送语音。 This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut 设置“按键发言”按钮,只要按住这个按钮,就会发送您的语音。 Reset Audio Processor Global Shortcut 重置音频处理器 Unlink Plugin Global Shortcut 取消链接插件 Push-to-Mute Global Shortcut 按键静音 Join Channel Global Shortcut 加入频道 Toggle Overlay Global Shortcut 开关游戏内界面 Toggle state of in-game overlay. Global Shortcut 开关游戏内界面显示状态。 Toggle Minimal Global Shortcut 开关简洁视图 Volume Up (+10%) Global Shortcut 音量增大(10%) Volume Down (-10%) Global Shortcut 音量减小(10%) Mumble Mumble Mumble -- %1 Mumble - %1 &Window 窗口(&W) Minimize 最小化 Ctrl+M Ctrl+M Close 关闭 Mumble is currently connected to a server. Do you want to Close or Minimize it? Mumble 已连接到服务器。您要关闭或者最小化吗? Mute Self Global Shortcut 开关自己的麦克风 Set self-mute status. Global Shortcut 设置自己麦克风的开关状态。 This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut 开启或关闭自己的麦克风。如果您打开麦克风,同时也会打开扬声器。 Deafen Self Global Shortcut 开关自己的扬声器 Set self-deafen status. Global Shortcut 设置自己扬声器的开关状态。 This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut 开启或关闭自己的扬声器。如果您关闭扬声器,同时也会关闭麦克风。 Whisper/Shout Whisper 密语/呼喊 <center>Not connected</center> Not connected <center>未连接</center> Clear 清空 Opening URL %1 打开网址 %1 File does not exist 文件不存在 File is not a configuration file. 文件不是配置文件。 Settings merged from file. 从文件合并设置。 URL scheme is not 'mumble' URL 协议不是“mumble” This version of Mumble can't handle URLs for Mumble version %1.%2.%3 当前版本的 Mumble 无法处理用于 Mumble %1.%2.%3 的 URL Connecting to %1 正在连接 %1 Enter username 输入用户名 Connecting to server %1. 正在连接服务器 %1 。 Reconnecting. 正在重新连接。 Transmit Mode set to Continuous 传输模式设置为连续发言 <p>%1 (%2)<br />%3</p> <p>%1(%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> <h2>语音信道</h2><p>使用 128 位 OCB-AES128 算法加密<br />平均延迟 %1 毫秒(%4 误差)</p> Register yourself as %1 以 %1 身份注册自己 <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <p>您将要在服务器上注册自己,此操作无法撤销,用户名注册后无法修改,“%1”将一直作为您在此服务器的用户名。</p><p>确认注册自己?</p> <h2>Version</h2><p>Protocol %1</p> <h2>版本</h2><p>协议 %1</p> <p>No build information or OS version available</p> <p>无可用的构建信息或操作系统版本</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) 该连接使用 %1 算法进行加密和身份认证,并使用 %2 作为密钥交换机制(%3) The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) 该连接使用 %1 算法进行加密,使用 %2 进行消息认证,并使用 %3 作为密钥交换机制(%4) The connection is secured by the cipher suite that OpenSSL identifies as %1 该连接由 OpenSSL 标识为 %1 的密码套件保护 <p>The connection provides perfect forward secrecy</p> <p>该连接已提供完美的前向安全性</p> <p>The connection does not provide perfect forward secrecy</p> <p>该连接未提供完美的前向安全性</p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> <h2>控制信道</h2><p>该连接使用 %1</p>%2%3<p>平均延迟 %4 毫秒(%5 误差)</p><p>远程主机 %6(端口 %7)</p> Voice channel is sent over control channel 语音信道通过控制信道发送 Register user %1 注册用户 %1 <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> <p>您将要在服务器上注册 %1。此操作无法撤销,用户名注册后无法修改,作为已注册用户,%1 将一直可以加入此服务器,即使您修改了服务器密码。</p><p>从此之后,%1 将通过当前使用的证书进行身份认证。</p><p>确认注册 %1 ?</p> Kicking user %1 踢出用户 %1 Banning user %1 封禁用户 %1 View comment on user %1 浏览用户 %1 的简介 Message to channel %1 向频道 %1 发送消息 Connected. 已连接。 <li>Expected certificate digest (SHA-1): %1</li> <li>预期证书摘要(SHA-1): %1</li> Server presented a certificate which failed verification. 服务器提供的证书验证失败。 <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> <p>%1</p><ul>%2</ul><p>此证书的具体错误为:</p><ol>%3</ol><p>您仍希望接受此证书吗?<br />(此信任会被保存,您只会被询问这一次。)</p> SSL Version mismatch SSL 版本不匹配 Server connection failed. 连接服务器失败。 <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>在此输入发送到频道“%1”的消息</center> <center>Type message to user '%1' here</center> Type message to user '%1' here <center>在此输入发送给用户“%1”的消息</center> Choose image file 选择图片文件 Failed to load image 读取图片失败 Could not open file for reading. 无法打开并读取文件。 Image format not recognized. 无法识别图片格式。 &User 用户(&U) &Channel 频道(&C) Use in conjunction with Whisper to. Global Shortcut 与密语一同使用。 This will switch the states of the in-game overlay. Global Shortcut 切换游戏内界面的状态。 Link Channel Global Shortcut 链接频道 Cycle Transmit Mode Global Shortcut 循环切换传输模式 Set Transmit Mode to Push-To-Talk Global Shortcut 设置传输模式为按键发言 Set Transmit Mode to Continuous Global Shortcut 设置传输模式为连续发言 Set Transmit Mode to VAD Global Shortcut 设置传输模式为语音激活 Send Text Message Global Shortcut 发送文字消息 Send Clipboard Text Message Global Shortcut 发送剪贴板上的文字消息 This will send your Clipboard content to the channel you are currently in. Global Shortcut 将您的剪贴板内容发送到当前所在的频道。 Continuous 连续发言 Voice Activity 语音激活 Push-to-Talk 按键发言 Mumble - Minimal View -- %1 Mumble - 简洁视图 -- %1 Cancel 取消 Save Image As... 保存图片为... Save Image File 保存图片文件 Could not save image: %1 无法保存图片:%1 Change your comment 修改您的简介 Transmit Mode set to Voice Activity 传输模式设置为语音激活 Transmit Mode set to Push-to-Talk 传输模式设置为按键发言 <p>Connected users: %1/%2</p> <p>已连接用户:%1/%2</p> UDP Statistics UDP 统计 To Server 发送到服务器 From Server 从服务器接收 Good 良好 Late 延迟 Lost 丢失 Resync 重新同步 <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> <h2>音频带宽</h2><p>最大 %1 千比特/秒<br />当前 %2 千比特/秒<br />编解码器:%3</p> Mumble Server Information Mumble 服务器信息 &View Certificate 查看证书(&V) Enter reason 输入原因 Sending message to %1 正在向 %1 发送消息 To %1: %2 至 %1:%2 Message to %1 向 %1 发送消息 Are you sure you want to reset the comment of user %1? 确定要重置用户 %1 的简介? Are you sure you want to reset the avatar of user %1? 确定要重置用户 %1 的头像? Are you sure you want to delete %1 and all its sub-channels? 确定要删除 %1 及其所有子频道? Sending message to channel %1 正在向频道 %1 发送消息 Message to tree %1 向频道树 %1 发送消息 To %1 (Tree): %2 (Tree) %1: %2 至 %1(频道树):%2 Unmuted and undeafened. 开启麦克风和扬声器。 Unmuted. 开启麦克风。 Muted. 关闭麦克风。 Muted and deafened. 关闭麦克风和扬声器。 Deafened. 关闭扬声器。 Undeafened. 开启扬声器。 Restart Mumble? 重新启动 Mumble? Some settings will only apply after a restart of Mumble. Restart Mumble now? 某些设置仅在重启 Mumble 后才应用。现在重启 Mumble 吗? About Qt 关于 Qt SSL Verification failed: %1 SSL 验证失败:%1 <li>Server certificate digest (SHA-1): %1</li> <li>服务器证书摘要(SHA-1): %1</li> <b>WARNING:</b> The server presented a certificate that was different from the stored one. <b>警告:</b>服务器现有证书与已保存的证书不一致。 This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. 此服务器使用了一个早期的加密标准,当前版本 Mumble 已不支持该标准。 Server connection failed: %1. 连接服务器失败:%1。 Disconnected from server. 从服务器断开连接。 Invalid username 用户名无效 You connected with an invalid username, please try another one. 您正以无效的用户名连接,请尝试其他用户名。 Username in use 用户名已被使用 That username is already in use, please try another username. 此用户名已经被使用,请尝试其他用户名。 Wrong certificate or password 证书或者密码错误 Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. 已注册用户的证书或者密码错误。如果您的确是被密码保护的用户,请重试。否则请退出并检查您的证书与用户名。 Wrong password 密码错误 Wrong server password for unregistered user account, please try again. 未注册用户输入的密码错误,请重试。 Images (*.png *.jpg *.jpeg) 图片文件 (*.png *.jpg *.jpeg) C&onfigure 配置(&O) &Help 帮助(&H) Log 日志 This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. 显示所有最近的动态。连接到服务器、错误和信息等消息都将显示在这里。<br />如果要设置这里显示的信息,请在菜单里选择<b>设置</b>命令。 &Quit Mumble 退出 Mumble (&Q) Closes the program 关闭程序 Exits the application. 退出应用程序。 Ctrl+Q Ctrl+Q Open the server connection dialog 打开服务器连接对话框 &Disconnect 断开连接(&D) Disconnect from server 从服务器断开连接 Disconnects you from the server. 从服务器断开您的连接。 Show information about the server connection 显示服务器连接的信息 This will show extended information about the connection to the server. 显示关于服务器连接的扩展信息。 &Mute 禁言(&M) &Deafen 禁听(&D) &Local Mute 本地屏蔽(&L) Send a Text Message 发送一条文字消息 Sends a text message to another user. 向其他用户发送一条文字消息。 Add new channel 添加新频道 This adds a new sub-channel to the currently selected channel. 在当前所选频道下添加一个新的子频道。 Remove channel 删除频道 This removes a channel and all sub-channels. 删除一个频道及其所有子频道。 Edit Groups and ACL for channel 编辑频道的分组和 ACL This opens the Group and ACL dialog for the channel, to control permissions. 打开频道的分组和 ACL 对话框,以控制权限。 &Link 链接(&L) Link your channel to another channel 将您的频道链接到其他频道 This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. 这里是聊天栏<br />如果您在这里输入文字并且按下回车,文字将会被发送到您选中的用户或频道。如果未选择,则会发送到当前频道。 Chatbar 聊天栏 Shows a dialog of registered servers, and also allows quick-connect. 显示已注册服务器对话框,可以在此进行快速连接。 Kick user (with reason) 踢出用户(包含原因) Kick selected user off server. You'll be asked to specify a reason. 将选中的用户踢出服务器。您必须输入一条原因。 Mute user 禁言用户 Mute or unmute user on server. Unmuting a deafened user will also undeafen them. 关闭或开启服务器上用户的麦克风。为一名已关闭扬声器的用户开启麦克风也会同时开启他的扬声器。 Kick and ban user (with reason) 踢出并且封禁用户(包含原因) Kick and ban selected user from server. You'll be asked to specify a reason. 将所选的用户从服务器踢出并封禁。您必须输入一条原因。 Deafen user 禁听用户 Deafen or undeafen user on server. Deafening a user will also mute them. 关闭或开启服务器用户的扬声器。为一名用户关闭扬声器也会同时关闭他的麦克风。 Mute user locally 仅在本地屏蔽用户 Mute or unmute user locally. Use this on other users in the same room. 仅在本地屏蔽或解禁用户的麦克风。需要对同一频道的其他用户使用。 This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. 将您当前的频道链接到所选频道。如果频道中的用户有权在另一个频道中发言,则用户可以互相听到彼此的声音。这是一个永久链接,将持续到手动取消链接或服务器重新启动。请参阅按键链接的快捷键。 &Unlink Channel 取消链接(&U) Unlink your channel from another channel 取消您的频道与其他频道的链接 This unlinks your current channel from the selected channel. 取消您的当前频道与所选频道的链接。 Unlinks your channel from all linked channels. 取消您的频道与所有已链接频道的链接。 This unlinks your current channel (not the selected one) from all linked channels. 取消您的频道到所有已链接的频道(而非仅已选频道)的链接。 &Reset 重置(&R) Reset audio preprocessor 重置音频预处理器 This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. 这将重置音频预处理器,包括噪声消除,自动增益和语音活动检测。如果某些因素突然暂时恶化了音频环境(例如麦克风摔落),可以使用此功能避免等待预处理器重新调整。 &Mute Self 关闭自己的麦克风(&M) Mute yourself 关闭自己的麦克风 Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. 关闭或开启您自己的麦克风。当麦克风被关闭时,您将不会向服务器发送任何数据。开启麦克风也会同时开启扬声器。 &Deafen Self 关闭自己的扬声器(&D) Deafen yourself 关闭自己的扬声器 Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. 关闭或开启您自己的扬声器。当扬声器被关闭时,您无法听到任何谈话。关闭扬声器也会同时关闭麦克风。 &Text-To-Speech 语音播报(&T) Toggle Text-To-Speech 开关语音播报 Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. 启用或禁用文字转语音引擎。只有在“配置”对话框中启用语音播报的消息才会被实际朗读。 Display audio statistics 显示音频统计 Pops up a small dialog with information about your current audio input. 弹出关于您当前音频输入的对话框。 Forcibly unlink plugin 强制取消链接插件 This forces the current plugin to unlink, which is handy if it is reading completely wrong data. 强制当前插件取消链接。在插件数据读取错误时非常方便。 Configure Mumble 配置 Mumble Allows you to change most settings for Mumble. 允许您更改 Mumble 的大多数设置。 Start the audio configuration wizard 开始音频配置向导 This will guide you through the process of configuring your audio hardware. 指导您配置您的音频硬件。 &What's This? 这是什么(&W)? Enter What's This? mode 进入“这是什么?”模式 Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. 点击进入“这是什么?”模式。您的鼠标会变成问号形状。点击其他的按钮、菜单选项或者其他区域以显示对应内容的帮助。 Information about Mumble 关于 Mumble 的信息 Shows a small dialog with information and license for Mumble. 显示包含 Mumble 信息和许可的对话框。 Information about Speex 关于 Speex 的信息 Shows a small dialog with information about Speex. 显示包含 Speex 信息的对话框。 Information about Qt 关于 QT 的信息 Shows a small dialog with information about Qt. 显示包含 QT 信息的对话框。 Check for &Updates 检查更新(&U) Check for new version of Mumble 检查 Mumble 的新版本 Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. 连接到 Mumble 网站,查找是否有可用的新版本,并通知您一个可用的下载地址。 Sends a text message to all users in a channel. 向频道中的所有人发送文字消息。 Configure certificates for strong authentication 配置证书进行强认证 This starts the wizard for creating, importing and exporting certificates for authentication against servers. 开始证书向导,进行创建、导入或导出用于服务器认证的证书。 Register user on server 在服务器上注册用户 This will permanently register the user on the server. 在此服务器上永久注册用户。 Add &Friend 添加好友(&F) Adds a user as your friend. 添加一名用户为您的好友。 This will add the user as a friend, so you can recognize him on this and other servers. 添加一名用户为您的好友,使您可以在此服务器和其他服务器认出他。 &Remove Friend 删除好友(&R) Removes a user from your friends. 从您的好友中删除一名用户。 This will remove a user from your friends list. 从您的好友列表中删除一名用户。 &Update Friend 更新好友(&U) Update name of your friend. 更新好友的名称。 Your friend uses a different name than what is in your database. This will update the name. 您的好友使用的名称与您的数据库存储不同。此功能将更新此名称。 Edit registered users list 编辑已注册用户列表 This opens the editor for registered users, which allow you to change their name or unregister them. 打开已注册用户编辑器,允许您修改已注册用户的名称或者取消他们的注册。 Add or remove text-based access tokens 添加或删除文本形式的访问令牌 &Minimal View 简洁视图(&M) Toggle minimal window modes 开关简洁视图模式 This will toggle minimal mode, where the log window and menu is hidden. 开关简洁视图模式,日志窗口和菜单将被隐藏。 You muted and deafened %1. 您关闭了 %1 的麦克风和扬声器。 You unmuted and undeafened %1. 您开启了 %1 的麦克风和扬声器。 You undeafened %1. 您开启了 %1 的扬声器。 You suppressed %1. 您禁言了 %1。 %1 muted and deafened by %2. %2 关闭了 %1 的麦克风和扬声器。 %1 unmuted and undeafened by %2. %2 开启了 %1 的麦克风和扬声器。 %1 undeafened by %2. %2 开启了 %1 的扬声器。 %1 suppressed by %2. %1 被 %2 禁言。 %1 moved to %2. %1 移动到 %2。 %1 moved to %2 by %3. %1 被 %3 移动到 %2。 %1 moved in from %2 by %3. %1 被 %3 从 %2 移动至此。 %1 is now muted and deafened. %1 关闭了麦克风和扬声器。 Your account information can not be verified currently. Please try again later 当前无法验证您的帐户信息,请稍后重试 Welcome message: %1 欢迎消息:%1 Mumble: %1 Mumble:%1 You were denied %1 privileges in %2. 您在 %2 的“%1”权限被拒绝。 %3 was denied %1 privileges in %2. %3 在 %2 的“%1”权限被拒绝。 Denied: Cannot modify SuperUser. 拒绝:无法修改 SuperUser(超级用户)。 Denied: Invalid channel name. 拒绝:频道名称无效。 Denied: Text message too long. 拒绝:文本消息过长。 Denied: Operation not permitted in temporary channel. 拒绝:临时频道不允许此操作。 You need a certificate to perform this operation. 您需要一个证书以执行该操作。 %1 does not have a certificate. %1 没有证书。 Invalid username: %1. 用户名无效:%1。 Invalid username. 用户名无效。 Channel is full. 频道已满。 Channel nesting limit reached. 频道嵌套层次达到上限。 Channel count limit reached. Need to delete channels before creating new ones. 频道数量达到上限。需要在创建新频道之前删除一些频道。 Permission denied. 权限被拒绝。 %1 connected and entered channel. %1 连接到服务器并加入频道。 %1 connected. %1 已连接。 %1 is now muted. %1 关闭了麦克风。 %1 is now unmuted. %1 开启了麦克风。 Recording started 录音开始 Recording stopped 录音结束 %1 started recording. %1 开始录音。 %1 stopped recording. %1 结束录音。 You revoked your priority speaker status. 您撤销了自己的优先发言人状态。 You assumed priority speaker status. 您获得优先发言人状态。 %1 revoked your priority speaker status. %1 撤销了您的优先发言人状态。 %1 gave you priority speaker status. %1 授予您优先发言人状态。 You revoked priority speaker status for %1. 您撤销了 %1 的优先发言人状态。 You gave priority speaker status to %1. 您授予 %1 优先发言人状态。 %1 revoked own priority speaker status. %1 撤销了自己的优先发言人状态。 %1 assumed priority speaker status. %1 获得优先发言人状态。 %1 revoked priority speaker status for %2. %1 撤销了 %2 的优先发言人状态。 %1 gave priority speaker status to %2. %1 授予 %2 优先发言人状态。 You were unmuted and undeafened by %1. %1 开启了您的的麦克风和扬声器。 You were muted by %1. %1 关闭了您的麦克风。 You were undeafened by %1. %1 开启了您的扬声器。 You were suppressed. You were suppressed by %1. 您被禁言。 You were unsuppressed. 您被解除禁言。 You were unsuppressed by %1. %1 解除了您的禁言。 You joined %1. 您加入了 %1。 You moved %1 to %2. 您将 %1 移动到 %2。 %1 is recording %1 正在录音 %1 renamed to %2 by %3. %1 被 %3 重命名为 %2。 %1 disconnected. %1 断开连接。 Server message from 服务器 (Tree) (频道树) (Channel) (频道) (Private) (私人) %2%1: %3 %2%1:%3 Failed to load Opus, it will not be available for audio encoding/decoding. 加载 Opus 失败,无法进行音频编解码。 The server requests minimum client version %1 服务器要求客户端版本至少为 %1 The server requests positional audio be enabled. 服务器要求启用位置音频。 The server requests positional audio be disabled. 服务器要求禁用位置音频。 The server requests Push-to-Talk be enabled. 服务器要求启用按键发言。 The server requests Push-to-Talk be disabled. 服务器要求禁用按键发言。 You were unmuted by %1. %1 开启了您的麦克风。 You muted %1. 您关闭了 %1 的麦克风。 You unsuppressed %1. 您解除了 %1 的禁言。 You unmuted %1. 您开启了 %1 的麦克风。 %1 muted by %2. %2 关闭了 %1 的麦克风。 %1 unsuppressed by %2. %2 解除了 %1 的禁言。 %1 unmuted by %2. %2 开启了 %1 麦克风。 Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. 无法找到与其他客户端匹配的 CELT 编解码器。您将无法与所有用户交谈。 You were muted and deafened by %1. You were deafened by %1. %1 关闭了您的麦克风和扬声器。 You were kicked from the server by %1: %2. %1 将您踢出了服务器:%2。 %3 was kicked from the server by %1: %2. %1 将 %3 踢出了服务器:%2。 You were kicked and banned from the server by %1: %2. %1 将您踢出了服务器并封禁:%2。 %3 was kicked and banned from the server by %1: %2. %1 将 %3 踢出了服务器并封禁:%2。 You were moved to %1 by %2. 您被 %2 移动到 %1。 %1 entered channel. %1 进入频道。 Server connection rejected: %1. 服务器拒绝连接:%1。 Denied: %1. 拒绝:%1。 %1 renamed to %2. %1 重命名为 %2。 %1 left channel and disconnected. %1 离开频道并断开连接。 Message from %1 来自 %1 的消息 You have User Dragging set to "Do Nothing" so the user wasn't moved. 用户未被移动,因为您将用户拖动设置为“无动作”。 You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. 频道未被移动,因为您将频道拖动设置为“无动作”。 Unknown Channel Drag mode in UserModel::dropMimeData. UserModel::dropMimeData 中的频道拖动模式未知。 Remote controlling Mumble: 远程控制 Mumble: Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) -jn, --jackname Set custom Jack client name. --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. 用法:mumble [选项] [<URL>] <URL> 指定启动时连接的 URL,而不是显示连接窗口,URL 的格式为: mumble://[<用户名>[:<密码>]@]<主机名>[:<端口>][/<频道名>[/<子频道名>...]][?version=<x.y.z>] 必须设置 version 请求参数以调用正确的客户端版本,当前的默认值为 1.2.0。 可用的选项: -h, --help 显示此帮助信息并退出。 -m, --multiple 允许启动多个客户端实例。 -n, --noidentity 禁止加载身份认证文件(即证书)。 -jn, --jackname 设置自定义 Jack 客户端名称。 --license 显示 Mumble 许可。 --authors 显示 Mumble 作者。 --third-party-licenses 显示 Mumble 使用的第三方软件的许可。 Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status 用法:mumble rpc <操作> [选项] 可以通过“mumble rpc”命令远程控制一个正在运行的 Mumble 实例。 可用的操作: mute 关闭自己的麦克风 unmute 开启自己的麦克风 togglemute 开关自己的麦克风 deaf 关闭自己的扬声器 undeaf 开启自己的扬声器 toggledeaf 开关自己的扬声器 Invocation 调用 Error: No RPC command specified 错误:无指定的 RPC 命令 RPC RPC Welcome to Mumble. 欢迎使用 Mumble。 Skipping version check in debug mode. 在调试模式跳过版本检查。 Hide Frame 隐藏边框 Toggle showing frame on minimal window 切换简洁视图下的窗口边框显示 This will toggle whether the minimal window should have a frame for moving and resizing. 切换在简洁视图模式下是否显示用于移动或改变窗口大小的边框。 &Unlink All 取消所有链接(&U) Reset the comment of the selected user. 重置所选用户的简介。 &Join Channel 加入频道(&J) View comment in editor 在编辑器中查看简介 Query server for connection information for user 向服务器查询用户的连接信息 S&erver 服务器(&E) &Self 自己(&S) &Unlink Plugins 取消链接插件(&U) Register yourself on the server 在服务器上注册自己 Change your avatar image on this server 修改您在此服务器上的头像 &Remove Avatar 删除头像(&R) Remove currently defined avatar image. 删除当前头像图片。 Icon Toolbar 图标工具栏 Change your own comment 修改您自己的简介 Recording 录音 Priority Speaker 优先发言人 &Copy URL 复制网址(&C) Copies a link to this channel to the clipboard. 将指向此频道的链接复制到剪贴板。 Ignore Messages 忽略消息 Locally ignore user's text chat messages. 本地忽略用户的文字聊天消息。 Silently drops all text messages from the user. 静默地删除此用户的所有文字消息。 Edit ban list on server 编辑服务器封禁列表 This lets you edit the server-side IP ban list. 使您可以编辑服务端的 IP 封禁列表。 &Filter on/off 切换筛选(&F) Toggle the channel filter (Ctrl+F) 开关频道筛选器 (Ctrl+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. 对所选频道启用或禁用筛选。 默认情况下,所有空频道会被隐藏。 您可以通过频道的右键菜单将频道标记为筛选时隐藏。 Ctrl+F Ctrl+F &Hide Channel when Filtering 筛选时隐藏频道(&H) Reset the avatar of the selected user. 重置所选用户的头像。 Locally adjust the user's speech volume. 本地调整用户的语音音量。 Opens a dialog with a volume slider. Use this on other users in the same room. 打开一个带有音量滑块的对话框。需要对同一频道的其他用户使用。 &Developer 开发者(&D) &Hide Mumble 隐藏 Mumble (&H) Hides the main Mumble window. 隐藏 Mumble 主窗口。 Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. 隐藏 Mumble 主窗口。点击系统托盘图标或者再次启动 Mumble 以恢复。 Show the Developer Console 显示开发者控制台 Shows the Mumble Developer Console, where Mumble's log output can be inspected. 显示开发者控制台,用于检查 Mumble 的日志输出。 &Connect... 连接(&C)… &Ban list... 封禁列表(&B)… &Information... 服务器信息(&I)… &Kick... 踢出(&K)... &Ban... 封禁(&B)... Local Volume Adjustment... 本地音量调整... Send &Message... 发送消息(&M)... &Add... 添加(&A)... &Remove... 删除(&R)... &Edit... 编辑(&E)... Audio S&tatistics... 音频统计(&T)... &Settings... 设置(&S)… &Audio Wizard... 音频向导(&A)... Developer &Console... 开发者控制台(&C)... &About... 关于(&A)... About &Speex... 关于 &Speex... About &Qt... 关于 &Qt... &Certificate Wizard... 证书向导(&C)... &Register... 注册(&R)... Registered &Users... 已注册用户(&U)... Change &Avatar... 修改头像(&A)... &Access Tokens... 访问令牌(&A)... Reset &Comment... 重置简介(&C)... Reset &Avatar... 重置头像(&A)... View Comment... 查看简介... &Change Comment... 修改简介(&C)... R&egister... 注册(&E)... Show 显示 Shows the main Mumble window. 显示 Mumble 主窗口。 Manual Manual Mumble Positional Audio 手动 Mumble 位置音频 Position 位置 X X Y Y Z Z m Heading 朝向 Azimuth 方位 Elevation 俯仰 ° ° Meta data 元数据 Context 上下文 Identity 标识符 Set 设置 State 状态 Linked 已链接 Activated 已激活 Unhinge 分离窗口 NetworkConfig Network 网络 Updates are mandatory when using snapshot releases. 在使用快照版本时,升级是强制性的。 Connection 连接 Use TCP compatibility mode Use TCP compatability mode 使用 TCP 兼容模式 <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). <b>启用 TCP 兼容模式</b>。<br />设置 Mumble 仅使用 TCP 协议与服务器通信。这将会增加开销并且会导致丢包,使您在交谈中遇到中断,所以请仅在无法使用默认模式(UDP 语音,TCP 控制)的情况下使用。 Reconnect when disconnected 在连接断开时重新连接 <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. <b>在连接断开时重新连接</b>。<br />如果您连接服务器失败,Mumble 将在 10 秒后自动重新连接。 Reconnect automatically 自动重连 Proxy 代理 Type 类型 Type of proxy to connect through 连接的代理类型 Direct connection 直接连接 HTTP(S) proxy HTTP(S) 代理 SOCKS5 proxy SOCKS5 代理 Hostname 主机名 Hostname of the proxy 代理的主机名 Force TCP mode 强制 TCP 模式 Enable QoS to prioritize packets 启用 QoS 以调整数据包优先级 This will enable QoS, which will attempt to prioritize voice packets over other traffic. 启用 QoS,尝试优先于其他网络流量发送语音数据包。 Use Quality of Service 使用 QoS Don't send certificate to server and don't save passwords. (Not saved). 不向服务器发送证书并且不保存密码。(此设置不会被保存)。 <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> <b>禁用客户端身份验证。</b><p>禁用后,客户端将无法通过证书认证自己,也不会保存连接的密码。该选项主要用于测试目的,不会被保存。</p> Suppress certificate and password storage 禁用证书和密码存储 <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>连接的代理的类型。</b><br />Mumble 将为所有出站连接使用代理服务器。注意:代理隧道将强制 Mumble 使用 TCP 兼容模式,因此所有的语音数据将通过控制信道传输。 <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. <b>代理的主机名。</b><br />指定您用于隧道传输网络流量的代理的主机名。 Port 端口 Port number of the proxy 代理的端口号 <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. <b>代理的端口号。</b><br />指定代理连接的端口号。 Username 用户名 Username for proxy authentication 用于代理认证的用户名 <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>用于代理认证的用户名。</b><br />指定您向代理认证身份时使用的用户名。如果您使用的代理不认证身份,或者您希望匿名连接,请留空。 Password 密码 Password for proxy authentication 用于代理认证的密码 <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>用于代理认证的密码。</b><br />指定您向代理认证身份时使用的密码。如果您使用的代理不认证身份,或者您希望匿名连接,请留空。 Mumble services Mumble 服务 Check for new releases of Mumble automatically. 自动检查 Mumble 更新。 This will check for new releases of Mumble every time you start the program, and notify you if one is available. 在您每次启动程序时检查 Mumble 的新版本,并在有新版本时通知您。 Check for application updates on startup 在启动时检查应用程序更新 Check for new releases of plugins automatically. 自动检查插件更新。 This will check for new releases of plugins every time you start the program, and download them automatically. 每次启动程序时检查插件的更新并自动下载。 <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. <b>提交匿名统计数据。</b><br />Mumble 开发团队的规模很小,因此需要将开发重点放在用户最需要的地方。通过提交一些统计数据,您可以帮助开发团队决定重点开发哪些功能。 Submit anonymous statistics to the Mumble project 提交匿名统计数据至 Mumble 项目 Submit anonymous statistics 提交匿名统计 Reconnect to last used server when starting Mumble 启动 Mumble 时自动连接到最后使用的服务器 Reconnect to last server on startup 启动时自动连接上次的服务器 Download plugin and overlay updates on startup 启动时下载插件和游戏内界面更新 Privacy 隐私 Prevent OS information being sent to Mumble servers and web servers 阻止向 Mumble 服务器和网页服务器发送操作系统信息 <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. <b>请勿向服务器发送操作系统信息</b><br/> 阻止客户端向 Mumble 服务器和网页服务器发送潜在的操作系统识别信息。 Do not send OS information to Mumble servers and web servers 请勿向 Mumble 服务器和网页服务器发送操作系统信息 Overlay Silent 安静 Talking 说话 Whisper 密语 Shout 呼喊 Channel 频道 Failed to create communication with overlay at %2: %1. No overlay will be available. 在 %2:%1 与游戏内界面建立通信失败。游戏内界面将不可用。 OverlayClient Filter 筛选 Only talking 仅正在说话 Talking and recently active 正在说话与最近活跃 All in current channel 频道内所有人 All in linked channels 已链接频道内所有人 Always show yourself 总是显示自己 Configure recently active time (%1 seconds)... 配置最近活跃时间(%1 秒)... Columns 列数 Sort 排序 Alphabetically 按字母顺序 Last state change 最后状态变化 Edit... 编辑... Reset Zoom 重置缩放 Configure recently active time 配置最近活跃时间 Amount of seconds users remain active after talking: 用户停止说话后保持活跃状态的秒数: OverlayConfig To move the users, drag the little red dot. 要移动用户列表,请拖动小红点。 To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. 要改变用户列表尺寸,请在列表上滚动鼠标滚轮。 For more options, right click a user. For more options, rightclick a user. 查看更多选项,请在用户列表上点击鼠标右键。 Launcher Filter 启动器筛选 Overlay 游戏内界面 Choose executable 选择可执行文件 Choose application 选择应用程序 Choose path 选择路径 Load Overlay Presets 加载游戏内界面预设 Mumble overlay presets (*.mumblelay) Mumble 游戏内界面预设 (*.mumblelay) Save Overlay Presets 保存游戏内界面预设 Options 选项 Enable overlay. 启用游戏内界面。 Enable Overlay 启用游戏内界面 This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. 设置是否启用游戏内界面。此设置仅在应用程序启动时检查,因此请确保在启动应用程序前已经运行了 Mumble 并且已启用此选项。<br />请注意,如果您在启动应用程序之后启动 Mumble,或者在应用程序运行期间禁用了游戏内界面,则除了重启应用程序之外,没有办法安全的重新启动游戏内界面。 Layout 布局 Blacklist 黑名单 Whitelist 白名单 Uninstall Overlay 卸载游戏内界面 Overlay Installation 游戏内界面安装 Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. Mumble 检测到您尚未安装 Mumble 游戏内界面。 点击下面的按钮安装它。 Install Mumble Overlay 安装 Mumble 游戏内界面 Overlay Upgrade 游戏内界面升级 Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. Mumble 检测到您的计算机上安装了低版本的游戏内界面支持文件。 点击下面的按钮将这些文件升级到新版本。 Upgrade Mumble Overlay 升级 Mumble 游戏内界面 Display a frame counter in the overlay 在游戏内界面显示帧数 Show FPS counter 显示 FPS 计数 Load an overlay preset from file 从文件中加载游戏内界面预设 Load… 加载... Save your overlay settings to file 将您的游戏内界面设置保存到文件 Save… 保存... Set the overlay font. 设置游戏内界面字体。 Set the overlay text color. 设置游戏内界面文字颜色。 Color 颜色 Remove 删除 Font 字体 FPS and Clock Display FPS 与时钟显示 Display a clock in the overlay showing the current local time (system time). 在游戏内界面上显示时钟(当前系统时间)。 Show Clock 显示时钟 Overlay Exceptions 游戏内界面例外 Overlay Exception Mode 例外模式 Allowed launchers 允许的启动器 Add 添加 Allowed programs 允许的程序 Allowed paths 允许的路径 Blacklisted programs 黑名单程序 OverlayEditor State 状态 User is not talking 用户未在说话 Passive 安静 User is talking in your channel or a linked channel 用户正在当前频道或链接频道内说话 Talking 说话 User is whispering to you privately 用户正在私下与您密语 Private Whisper 私人密语 User is shouting to your channel 用户正在对当前频道呼喊 Channel Whisper 频道密语 Zoom 缩放 Zoom Factor 缩放参数 Enabled Elements 启用元素 User avatar, chosen by each user 每名用户自己选择的头像 Avatar 头像 User's name 用户的名称 Username 用户名 Name of user's channel, if outside your current channel 用户所在的频道名称,如果他不在您的当前频道 Channel 频道 Muted or deafened 关闭麦克风或关闭扬声器 Mute state 静音状态 Bounding box, automatically shrunk to minimum size to contain all visible elements 背景会自动收缩到最小尺寸以包含所有可见元素 Bounding box 背景 Overlay Editor 游戏内界面编辑器 OverlayEditorScene Layout preset 布局预设 Large square avatar 大尺寸方形头像 Avatar and Name 头像加用户名 User Opacity 用户不透明度 %1% %1% Object Opacity 组件不透明度 Alignment 对齐方式 Left 左对齐 Center 居中对齐 Right 右对齐 Top 顶端对齐 Bottom 底端对齐 Color... 颜色... Font... 字体... Bounding box 背景 Pen width 线条宽度 Padding 间距 Pen color 线条颜色 Fill color 填充颜色 Pick pen color 选择线条颜色 Pick fill color 选择填充颜色 Pick color 选择颜色 Pick font 选择字体 PluginConfig Plugins 插件 Plugin has no configure function. 插件不支持配置。 Plugin has no about function. 插件不支持关于信息。 Options 选项 Enable plugins and transmit positional information 启用插件并传输位置信息 This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. 允许支持的游戏的插件获取您在游戏中的位置并在每个语音数据包中传输。使其他用户能从您在游戏内的角色与他们的角色之间的相对方向听到您的语音。 Link to Game and Transmit Position 链接到游戏并传输位置信息 Reloads all plugins 重新加载所有插件 This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. 重新扫描并重载插件。如果您添加或者修改了插件目录中的插件,请使用此功能。 &Reload plugins 重新加载插件(&R) Information about plugin 插件信息 This shows a small information message about the plugin. 显示关于插件的简要信息。 &About 关于(&A) Show configuration page of plugin 显示插件的配置页面 This shows the configuration page of the plugin, if any. 如果可用的话,显示此插件的配置页面。 &Configure 设置(&C) Name 名称 Enabled 启用 Plugins Skipping plugin update in debug mode. 在调试模式跳过插件更新。 Downloaded new or updated plugin to %1. 下载新版或升级插件到 %1。 Failed to install new plugin to %1. 安装新插件到 %1 失败。 %1 lost link. %1 链接丢失。 %1 linked. %1 已链接。 PortAudioSystem Default Device 默认设备 PulseAudioSystem Default Input 默认输入 Default Output 默认输出 QApplication Failed to restart mumble 重新启动 Mumble 失败 Mumble failed to restart itself. Please restart it manually. Mumble 重新启动自身失败。请手动重启。 RichTextEditor Failed to load image 读取图片失败 Image file too large to embed in document. Please use images smaller than %1 kB. 图片文件太大,无法嵌入文档。请选择小于 %1 KB 的图片。 Message is too long. 消息过长。 Display 可视化 Source Text 源代码 &Bold 粗体(&B) Ctrl+B Ctrl+B &Italic 斜体(&I) Italic 斜体 Ctrl+I Ctrl+I Underline 下划线 Ctrl+U Ctrl+U Color 颜色 Insert Link 插入链接 Ctrl+L Ctrl+L Insert Image 插入图片 RichTextEditorLink Add Link 添加链接 URL URL Text 文字 ServerHandler Unable to resolve hostname 无法解析主机名 Server is not responding to TCP pings 服务器未响应 TCP Ping UDP packets cannot be sent to or received from the server. Switching to TCP mode. UDP 数据包无法发送到服务器或从服务器接收。将切换为 TCP 模式。 UDP packets cannot be sent to the server. Switching to TCP mode. UDP 数据包无法发送到服务器。将切换为 TCP 模式。 UDP packets cannot be received from the server. Switching to TCP mode. 无法从服务器接收 UDP 数据包。将切换为 TCP 模式。 UDP packets can be sent to and received from the server. Switching back to UDP mode. UDP 数据包可以发送到服务器或从服务器接收。将切换回 UDP 模式。 Connection timed out 连接超时 ServerView Favorite 收藏夹 LAN 局域网 Public Internet 公共服务器 Unknown 未知 Africa 非洲 Asia 亚洲 North America 北美洲 South America 南美洲 Europe 欧洲 Oceania 大洋洲 ShortcutActionWidget Unassigned 未绑定 ShortcutDelegate On 开启 Off 关闭 Toggle 切换 Unassigned 未绑定 ShortcutKeyWidget Press Shortcut 按下快捷键 ShortcutTargetDialog Root Root Parent 父级 Current 当前 Subchannel #%1 子频道 #%1 ShortcutTargetWidget ... ... , Root Root Parent 父级 Current 当前 Subchannel #%1 子频道 #%1 Invalid 无效 Empty <Empty> ShortcutToggleWidget Off 关闭 Toggle 切换 On 开启 TextMessage Enter text 输入文字 If checked the message is recursively sent to all subchannels 如果选中,则将消息递归发送到所有子频道 Send recursively to subchannels 发送至所有子频道 Tokens Empty Token 空令牌 Mumble - Access Tokens Mumble - 访问令牌 List of access tokens on current server 当前服务器的令牌列表 <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. <b>这是包含已连接服务器上访问令牌的可编辑列表。</b> <br /> 一个访问令牌就是一条文本字符串,像密码一样使用,用于简单地管理频道访问权限。Mumble 将会记住您使用过的令牌,并在您下次连接此服务器的时候发送,所以您不需要每次重新输入。 Add a token 添加一个令牌 &Add 添加(&A) Remove a token 删除一个令牌 &Remove 删除(&R) UserEdit Registered Users 已注册用户 Remove 删除 Rename 重命名 Who are you looking for? 您在找谁? Days Weeks Months Years Inactive for 已离开 Registered users: %n account(s) 已注册用户:%n 个帐户 UserInformation User Information 用户信息 Connection Information 连接信息 Version 版本 OS 操作系统 Certificate 证书 IP Address IP 地址 CELT Versions CELT 版本 Details... 详情... Ping Statistics Ping 统计 Pings received 接收 Average ping 平均 TCP (Control) TCP(控制信道) UDP (Voice) UDP(语音信道) UDP Network statistics UDP 网络统计 Good 良好 Late 延迟 Lost 丢失 Resync 重新同步 From Client 客户端发送 To Client 客户端接收 Connection time 连接时间 %1w %1 周 %1d %1 天 %1h %1 时 %1m %1 分 %1s %1 秒 , %1 (%2) %1.%2.%3 (%4) %1(%2) Supported 支持 Not Supported 不支持 Not Reported 未报告 %1 online (%2 idle) %1 在线(%2 空闲) %1 online %1 在线 %1 kbit/s %1 千比特/秒 Bandwidth GroupBox 带宽 Bandwidth Label 带宽 Ping deviation 误差 UserListModel Nick 昵称 Inactive days 离开天数 Last channel 最后所在频道 Last seen: %1 上次出现:%1 Never 从未 Channel ID: %1 频道 ID:%1 UserLocalVolumeDialog Local volume for other users 其他用户本地音量 <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. <b>调整其他用户的本地音量</b><br />Mumble 支持在本地调整其他用户的语音音量。 Adjusting local volume for %1 调整 %1 的本地音量 dB 分贝 <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> <html><head/><body><p>使用滑块或文本框改变此用户的音量。</p><p><span style="font-weight:600;">注意!</span></p><p>过度增大用户的音量可能会永久性地损害您的听力。同时也可能会增大此用户的背景噪声。</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: 这是一名已连接到服务器的用户。用户左侧的图标表明他们是否正在说话: Talking to your channel. 正在对您的频道说话。 Shouting directly to your channel. Whispering directly to your channel. 正在直接对您的频道呼喊。 Whispering directly to you. 正在直接对您密语。 Not talking. 未在说话。 This is a channel on the server. The icon indicates the state of the channel: 这是服务器上的一个频道。图标显示了频道的状态: Your current channel. 您当前所在的频道。 A channel that is linked with your channel. Linked channels can talk to each other. 一个链接到您的频道的频道。被链接的频道之间可以互相说话。 A channel on the server that you are not linked to. 一个在服务器上的您未链接的频道。 This shows the flags the user has on the server, if any: 如果有的话,显示此用户在此服务器上的标识: On your friend list 您的好友 Authenticated user 已认证用户 Muted (manually muted by self) 麦克风关闭(自己设置) Muted (manually muted by admin) 麦克风关闭(管理员设置) Muted (not allowed to speak in current channel) 麦克风关闭(当前频道不允许说话) Muted (muted by you, only on your machine) 麦克风关闭(被您屏蔽,仅在您的设备上生效) Muted (push-to-mute) 麦克风关闭(按键静音) Deafened (by self) 扬声器关闭(自己设置) Deafened (by admin) 扬声器关闭(管理员设置) User has a new comment set (click to show) 用户有新简介(点击显示) User has a comment set, which you've already seen. (click to show) 用户的简介已被您看过。(点击显示) Ignoring Text Messages 忽略文字消息 This shows the flags the channel has, if any: 如果有的话,显示此频道的标记: Channel has a new comment set (click to show) 频道有新简介(点击显示) Channel has a comment set, which you've already seen. (click to show) 频道的简介已被您看过。(点击显示) Channel will be hidden when filtering is enabled 启用频道筛选时,此频道会被隐藏 Name 名称 Flags 标识 Are you sure you want to drag this user? 确定要移动此用户? Are you sure you want to drag this channel? 确定要移动此频道? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. 无法自动完成移动操作,请重设或手动调整位置序号。 VersionCheck Upgrade Mumble 升级 Mumble A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? 已检测到并自动下载新版本 Mumble。推荐您升级到此新版本,或者降级至最新的稳定版。是否立即运行安装程序? Failed to launch snapshot installer. 运行快照版本安装程序失败。 Corrupt download of new version detected. Automatically removed. 检测到的新版本下载失败。已自动删除。 Downloading new snapshot from %1 to %2 从 %1 下载新的快照版本到 %2 Failed to write new version to disk. Failed to write new version to disc. 将新版本写入到硬盘失败。 Mumble failed to retrieve version information from the central server. 从中心服务器获取 Mumble 版本信息失败。 ViewCert Certificate Chain Details 证书链详情 Certificate chain 证书链 Certificate details 证书详情 Common Name 通用名称 Organization 组织 Subunit 子部门 Country 国家 Locality 城市 State 省份 Valid from: %1 有效期始于:%1 Valid to: %1 有效期止于:%1 Serial: %1 序列号:%1 Public Key: %1 bits %2 公钥:%1 位 %2 RSA RSA DSA DSA Digest (SHA-1): %1 摘要(SHA-1):%1 Digest (SHA-256): %1 摘要(SHA-256):%1 Email: %1 电子邮件:%1 DNS: %1 DNS:%1 Issued by: 颁发者: Unit Name 部门名称 VoiceRecorder Recorder failed to create directory '%1' 录音机创建目录“%1”失败 Recorder failed to open file '%1' 录音机打开文件“%1”失败 .wav - Uncompressed .wav - 不压缩 .ogg (Vorbis) - Compressed .ogg (Vorbis) - 压缩 .au - Uncompressed .au - 不压缩 .flac - Lossless compressed .flac - 无损压缩 VoiceRecorderDialog Recorder 录音机 Control 控制 00:00:00 00:00:00 &Start 开始(&S) S&top 停止(&T) Mode 模式 Multichannel 多轨 Output 输出 Output format 输出格式 Target directory 目标目录 Filename 文件名 &Browse... 浏览(&B)... Valid variables are: 有效的变量: Inserts the user's name 插入用户名称 Inserts the current date 插入当前日期 Inserts the current time 插入当前时间 Inserts the hostname 插入主机名 Recorder still running 录音机仍在运行 Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? 不停止录音而直接关闭录音机会导致丢弃未保存的音频。确定要关闭录音机吗? Unable to start recording. Not connected to a server. 无法开始录音。尚未连接到服务器。 The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. 当前连接的服务器为 1.2.2 或更早版本。由于隐私原因,不支持在低于版本 1.2.3 的服务器上录音。 请联系此服务器的管理员获取更多信息。 There is already a recorder active for this server. 此服务器上已经有一个录音机被激活。 Please select a recording format. 请选择录音格式。 Stopping 正在停止 Select target directory 选择目标文件夹 Downmix 缩混 WASAPIInput Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone. 访问麦克风的权限被拒绝。请您检查操作系统的麦克风设置,允许 Mumble 使用麦克风。 WASAPISystem Default Device 默认设备 qwPTTButtonWidget Mumble PTT Mumble 按键发言 Push to talk 按键发言 mumble-1.3.4/src/mumble/PAAudio.h0000664000175000017500000000654514010707273016356 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . /* Copyright (C) 2005-2011, Thorvald Natvig Copyright (C) 2007, Stefan Gehn All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Mumble Developers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef MUMBLE_MUMBLE_PAAUDIO_H_ #define MUMBLE_MUMBLE_PAAUDIO_H_ #include "AudioInput.h" #include "AudioOutput.h" #include class PortAudioSystem; typedef boost::shared_ptr PortAudioSystemPtr; typedef boost::weak_ptr WeakPortAudioSystemPtr; /** * Small wrapper around some critical PortAudio functions. * * Basically this ensures that the PA lib is initialized and terminated properly and that * several threads can open/close streams as they like. */ class PortAudioSystem : public QObject { private: Q_OBJECT Q_DISABLE_COPY(PortAudioSystem) protected: //! Mutex around PA stream creation/deletion static QMutex qmStream; public: static bool initStream(PaStream **stream, PaDeviceIndex devIndex, int frameSize, int *chans, bool isInput); static bool terminateStream(PaStream *stream); static bool startStream(PaStream *stream); static bool stopStream(PaStream *stream); static const QList enumerateDevices(bool input, PaDeviceIndex match = -1); }; class PortAudioInput : public AudioInput { private: Q_OBJECT Q_DISABLE_COPY(PortAudioInput) public: PortAudioInput(); ~PortAudioInput() Q_DECL_OVERRIDE; void run() Q_DECL_OVERRIDE; }; class PortAudioOutput : public AudioOutput { private: Q_OBJECT Q_DISABLE_COPY(PortAudioOutput) public: PortAudioOutput(); ~PortAudioOutput() Q_DECL_OVERRIDE; void run() Q_DECL_OVERRIDE; }; #else class PortAudioSystem; class PortAudioInput; class PortAudioOutput; #endif mumble-1.3.4/src/mumble/TextMessage.cpp0000664000175000017500000000325514010707273017653 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "TextMessage.h" TextMessage::TextMessage(QWidget *p, QString title, bool bChannel) : QDialog(p) { setupUi(this); if (!bChannel) qcbTreeMessage->setHidden(true); setWindowTitle(title); bTreeMessage = false; QObject::connect(rteMessage, SIGNAL(accept()), this, SLOT(accept())); } void TextMessage::on_qcbTreeMessage_stateChanged(int s) { bTreeMessage = s == Qt::Checked ? true : false; } QString TextMessage::autoFormat(QString qsPlain) { QRegExp qr; qr.setMinimal(true); qr.setPatternSyntax(QRegExp::RegExp2); qr.setCaseSensitivity(Qt::CaseInsensitive); qr.setPattern(QLatin1String("[\\r\\n]+")); qsPlain.replace(qr, QLatin1String("
")); qr.setPattern(QLatin1String("\\*(\\w+)\\*")); qsPlain.replace(qr, QLatin1String("\\1")); qr.setPattern(QLatin1String("\"([^\"]+)\"")); qsPlain.replace(qr, QLatin1String("\"\\1\"")); qr.setPattern(QLatin1String("[a-z-]+://[^ <]*")); qr.setMinimal(false); int idx = 0; do { idx = qr.indexIn(qsPlain, idx); if (idx >= 0) { QString url = qr.capturedTexts().at(0); QUrl u(url); if (u.isValid()) { int len = qr.matchedLength(); QString replacement = QString::fromLatin1("%1").arg(url); qsPlain.replace(idx, len, replacement); idx += replacement.length(); } else { idx++; } } } while (idx >= 0); return qsPlain; } QString TextMessage::message() { return rteMessage->text(); } mumble-1.3.4/src/mumble/mumble_it.ts0000664000175000017500000143674014010707274017256 0ustar builderbuilder ACLEditor Deny Nega Allow Consenti Allow %1 Consenti %1 Deny %1 Nega %1 Mumble - Add channel Mumble - Aggiungi canale Default server value Valore predefinito server Failed: Invalid channel Errore: Canale non valido Mumble - Edit %1 Mumble - Modifica %1 ID: %1 ID: %1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Concede il privilegio %1. Se un privilegio è contemporaneamente permesso e negato, sarà negato.<br />%2 Channel must have a name Il canale deve avere un nome This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Revoca il privilegio %1. Se un privilegio è contemporaneamente permesso e negato, sarà negato.<br />%2 Dialog Dialogo Name Nome Enter the channel name here. Inserisci qui il nome del canale. Description Descrizione Password Password Enter the channel password here. Inserisci qui la password del canale. Check to create a temporary channel. Seleziona per creare un canale temporaneo. Temporary Temporaneo <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Posizione</b><br/> Questo valore ti dà la possibilità di modificare l'ordine in cui Mumble posiziona i canali. Un canale con un valore di <i>Posizione</i> più alto sarà sempre posto sotto uno con un valore più basso e così via. Se il valore della <i>Posizione</i> di due canali è uguale allora questi saranno ordinati in ordine alfabetico secondo il loro nome. Position Posizione &Groups &Gruppi Group Gruppo List of groups Lista dei gruppi Remove selected group Rimuove il gruppo selezionato Remove Rimuovi Inherit group members from parent Eredita i membri del gruppo dal canale superiore Inherit Eredita Make group inheritable to sub-channels Rende un gruppo ereditabile ai sottocanali Inheritable Ereditabile Group was inherited from parent channel Gruppo ereditato dal canale superiore Inherited Ereditato Members Membri Add Aggiungi Add member to group Aggiungi membro al gruppo Remove member from group Rimuove un membro dal gruppo &ACL &ACL Active ACLs ACL attive List of entries Elenco di voci Inherit ACL of parent? Ereditare le ACL dal canale superiore? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. Permette di applicare a questo canale le ACL dei canali superiori nella catena parentale. Solo le voci che sono contrassegnate nel canale superiore come "Applica ai sottocanali" verranno ereditate. Inherit ACLs Eredita ACL Move entry up Sposta voce in alto This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. Sposta la voce selezionata di un posto in alto nella lista. Dato che le voci vengono valutate in ordine, questo potrebbe cambiare le autorizzazioni attive per gli utenti. Non è possibile spostare una voce al di sopra di una ereditata, se proprio hai bisogno di farlo puoi duplicare la voce ereditata. &Up &Su Move entry down Sposta la voce in basso This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. Sposta la voce selezionata di un posto in basso nella lista. Dato che le voci vengono valutate in ordine, questo potrebbe cambiare le autorizzazioni attive per gli utenti. &Down &Giú Add new entry Aggiungi una nuova voce This adds a new entry, initially set with no permissions and applying to all. Aggiunge una nuova voce, inizialmente impostata senza permessi e applicata a tutti. &Add &Aggiungi Remove entry Rimuove la voce selezionata This removes the currently selected entry. Rimuove la voce selezionata. &Remove &Rimuovi Context Contesto Entry should apply to this channel. Entry should apply to this channel Applica la voce a questo canale. This makes the entry apply to this channel. Applica la voce a questo canale. Applies to this channel Applica a questo canale Entry should apply to sub-channels. La voce verrà applicata ai sottocanali che sono impostati per ereditare le ACL. Add new group Aggiungi un nuovo gruppo <b>Add</b><br/> Add a new group. <b>Aggiungi</b><br/> Aggiunge un nuovo gruppo. Inherited members Membri ereditati Contains the list of members added to the group by this channel. Contiene la lista dei membri aggiunti al gruppo da questo canale. Contains a list of members whose group membership will not be inherited from the parent channel. Contiene una lista dei membri che non saranno ereditati ai canali inferiori. Contains the list of members inherited by other channels. Contiene la lista degli utenti ereditati da altri canali. Type in the name of a user you wish to add to the group and click Add. Inserisci il nome dell'utente che vuoi aggiungere al gruppo e premi Aggiungi. Type in the name of a user you wish to remove from the group and click Add. Inserisci il nome dell'utente che vuoi rimuovere dal gruppo e premi Aggiungi. Exclude Escludi Excluded members Membri esclusi This makes the entry apply to sub-channels of this channel. Applica la voce ai sottocanali di questo canale. Applies to sub-channels Applica ai sottocanali Permissions Permessi User/Group Utente/Gruppo Group this entry applies to Gruppo a cui si applica questa voce User ID ID Utente User this entry applies to Utente a cui applicare questa voce This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. Controlla a quale utente si applica questa voce. Basta digitare il nome utente e premere invio per chiedere al server una corrispondenza. &Properties &Proprietà <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>Nome</b><br />Inserisci il nome del canale in questo campo. Il nome deve attenersi alle restrizioni imposte dal server a cui sei connesso. <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>Temporaneo</b><br /> Quando selezionato il canale creato sarà segnato come temporaneo. Questo vuol dire che quando l'ultimo utente uscirà dal canale, questo verrà automaticamente cancellato dal server. <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>Gruppo</b><br /> Questi sono tutti i gruppi attualmente definiti per il canale. Per creare un nuovo gruppo basta inserire il nome e premere invio. <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>Rimuovi</b><br />Rimuove il gruppo selezionato. Se il gruppo è stato ereditato, questo non sarà rimosso dalla lista, ma tutte le informazioni locali saranno rimosse. <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>Eredita</b><br />Eredita tutti i membri nel gruppo dal canale superiore, se il gruppo è segnato come <i>Ereditabile</i> nel canale superiore. <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>Ereditabile</b><br />Permette al gruppo di essere ereditato ai sottocanali. Se il gruppo non è ereditabile, i sottocanali possono comunque creare un gruppo con lo stesso nome. <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>Ereditato</b><br />Indica che il gruppo è stato ereditato dal canale superiore. Non puoi cambiare questa selezione, è solamente un'informazione. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>Membri</b><br /> Questa lista contiene tutti i membri che sono stati aggiunti al gruppo dal canale attuale. Attenzione, non include i membri ereditati da livelli superiori dell'albero dei canali. Questi possono essere trovati nella lista dei <i>Membri ereditati</i>. Per prevenire che questa lista sia ereditata dai canali inferiori deseleziona <i>Ereditabile</i> o aggiungi manualmente i membri alla lista dei <i>Membri esclusi dall'eredità</i>. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>Membri esclusi</b><br /> Contiene una lista dei membri la cui appartenenza ad un gruppo non sarà ereditata dal canale superiore. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. <b>Membri ereditati</b><br /> Contiene la lista dei membri ereditati dal canale attuale. Deseleziona <i>Eredita</i> per prevenire l'ereditazione dai canali superiori. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. Controlla a quale gruppo di utenti si applica questa voce.<br />Si noti che il gruppo è valutato nel contesto del canale in cui la voce è inserita. Ad esempio, il valore predefinito ACL sul canale Radice dà il permesso <i>Scrivi</i> al gruppo <i>admin</i>. Questa voce, se ereditata da un canale, darà ad un utente i privilegi di scrittura se egli appartiene al gruppo <i>admin</i> in quel canale, anche se non apparteneva al gruppo <i>admin</i> nel canale in cui è originato l'ACL.<br />Se il nome di un gruppo inizia con un '!', è negata ai suoi membri, e se inizia con un '~', è valutata nel canale in cui l'ACL è stata definita, al posto che nel canale in cui è stata attivata l'ACL.<br />Se il nome di un gruppo inizia con '#' viene interpretato come un token di accesso. Gli utenti devono avere inserito nella loro lista dei token tutto quello che segue '#' per appartenere a quel gruppo. Questo può essere utilizzato per un semplice accesso ai canali con password da parte di utenti non registrati. Se il nome di un gruppo inizia con '$', gli utenti che ne faranno parte saranno solo quelli il cui hash del certificato sarà quello che è scritto dopo '$'. Alcuni particolari gruppi predefiniti sono i seguenti:<br /><b>all</b> - Tutti ne fanno parte.<b>auth</b> - Tutti gli utenti autenticati ne fanno parte.<br /><b>sub,a,b,c</b> - Utenti attualmente in un canale con almeno <i>a</i> canali superiori comuni, e tra <i>b</i> e <i>c</i> canali verso il basso nella catena. Visitare il sito web per una documentazione piú estesa su questo punto.<br /><b>in</b> - Utenti attualmente nel canale (scorciatoia per '<i>sub,0,0,0</i>').<br /><b>out</b> - Gli utenti al di fuori del canale (scorciatoia per '<i>!sub,0,0,0</i>').<br />Nota: una voce si applica ad un utente o ad un gruppo, non a entrambi. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. <b>Password</b><br />Questo campo ti permette di impostare e cambiare facilmente la password di un canale. Utilizza la funzione di Mumble accesso con token. Se hai bisogno di un controllo maggiore sull'accesso a questo canale utilizza le ACL e i gruppi. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. Mostra tutte le voci attive su questo canale. Le voci ereditate dal canale superiore verranno visualizzate in corsivo.<br />Le ACL sono valutate dall'alto verso il basso, quindi le voci piú in basso hanno maggiore priorità e quindi vengono applicate in caso di conflitto. ID of the channel. ID del canale. Maximum Users Utenti Massimi Maximum number of users allowed in the channel Numero massimo di utenti permessi nel canale <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. <b>Utenti Massimi</b><br /> Questo valore ti permette di impostare il numero massimo di utenti consentiti nel canale. Se il valore è superiore a zero, solo quel numero di utenti potranno entrare nel canale. Se il valore è zero, il numero massimo di utenti è dato dal limite predefinito del server. This is the sort order for the channel. Questo è l'ordine di posizionamento del canale. ALSAAudioInput Default ALSA Card Scheda ALSA predefinita Opening chosen ALSA Input failed: %1 Errore nell'apertura dell'ingresso ALSA selezionato: %1 ALSAAudioOutput Default ALSA Card Scheda ALSA predefinita Opening chosen ALSA Output failed: %1 Errore nell'apertura dell'uscita ALSA selezionata: %1 ASIOConfig %1 (version %2) %1 (versione %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz %1 -> %2 campioni del buffer, con risoluzione campioni %3 (%4 preferito) a %5Hz ASIO Initialization failed: %1 Errore nell'inizializzazione di ASIO: %1 Failed to instantiate ASIO driver Errore nell'instanziazione del driver ASIO ASIO ASIO Device selection Selezione del dispositivo Device Dispositivo Device to use for microphone Dispositivo da usare per il microfono This chooses what device to query. You still need to actually query the device and select which channels to use. Sceglie quale dispositivo interrogare. Devi comunque interrogare il dispositivo e selezionare quale canale usare. Query selected device Interroga il dispositivo selezionato This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. Interroga il dispositivo selezionato per i canali. Molti driver ASIO sono estremamente difettati, e utilizzandoli potrebbero causare un crash dell'applicazione o del sistema. &Query &Interroga Configure selected device Configura il dispositivo selezionato This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. Configura il dispositivo selezionato. Molti driver ASIO sono estremamente difettati, e utilizzandoli potrebbero causare un crash dell'applicazione o del sistema. &Configure &Configura Capabilities Funzionalità Driver name Nome del driver Buffer size Grandezza del buffer This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. Questo configurerà i canali d'ingresso per ASIO. Assicurati di aver selezionato almeno un canale per il microfono e le cuffie/casse. <i>Microfono</i> dovrebbe essere dove il tuo microfono è attaccato, e <i>Casse</i> dovrebbe essere dove sono i canali di '<i>Quello che senti</i>'.<br /> Per esempio, sull'Audigy 2 ZS, una buona selezione per Microfono potrebbe essere '<i>Mic L</i>' mentre Casse '<i>Mix L</i>' e '<i>Mix R</i>'. Configure input channels Configura i canali di ingresso Channels Canali Microphone Microfono <- <- -> -> Unused Non usato Speakers Casse/cuffie ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. Devi selezionare almeno un microfono e un altoparlante per usare ASIO. Se hai bisogno solo il campionamento microfonico, usa DirectSound. Opening selected ASIO device failed. No input will be done. Apertura del dispositivo ASIO fallita. Non ci sarà nessun ingresso. AboutDialog About Mumble Informazioni su Mumble <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> <h3>Mumble (%1)</h3><p>%3</p><p><b>Utility di chat vocale per videogiocatori</b></p><p><tt><a href="%2">%2</a></tt></p><p>Traduzione italiana a cura di Spaccaossi<br />spaccaossi@users.sourceforge.net</p> &About Mumble &Informazioni su Mumble &License &Licenza A&uthors &Autori &Third-Party Licenses Licenze di 3e &parti OK OK AudioInput Interface Interfaccia System Sistema Input method for audio Metodo di acquisizione audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Metodo di acquisizione audio.</b><br />Molto probabilmente vorrai usare DirectSound. Device Dispositivo Input device for audio Dispositivo di ingresso audio <b>This is the input device to use for audio.</b> <b>Questo è il dispositivo d'ingresso da usare per il suono.</b> Transmission Trasmissione &Transmit &Metodo di trasmissione When to transmit your speech Quando trasmettere la tua voce <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. <b>Imposta quando la voce dovrebbe essere trasmessa.</b><br /><i>Sempre attivo</i> - Trasmette sempre<br /><i>Attivazione vocale</i> - Trasmette solo quando Mumble rileva che stai parlando.<br /><i>Push-To-Talk</i> - Trasmette solamente quando tieni premuto il pulsante impostato. DoublePush Time Doppia pressione If you press the PTT key twice in this time it will get locked. Se premi il pulsante PTT due volte entro questo tempo la trasmissione si blocca. <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. <b>Tempo di doppia pressione</b><br />Se premi il pulsante Push-To-Talk due volte durante l'intervallo di tempo configurato, la trasmissione non finirà fino a che non premerai di nuovo il pulsante PTT. Reset audio cue to default Reimposta segnale sonoro su quello predefinito <b>Reset</b><br/>Reset the paths for the files to their default. <b>Reimposta</b><br/>Reimposta il percorso dei file al loro valore predefinito. Browse for on audio file Seleziona un file sonoro per l'attivazione della trasmissione Browse for off audio file Seleziona un file sonoro per la disattivazione della trasmissione Off Disattivazione On Attivazione Preview the audio cues Anteprima del segnale sonoro Use SNR based speech detection Usa il riconoscimento della voce basato sul rapporto segnale/rumore Signal to Noise Rapporto segnale/rumore <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. <b>Seleziona l'uso dell'ampiezza per il rilevamento della voce.</b><br />In questa modalità, il livello grezzo del segnale d'ingresso viene utilizzato per rilevare la voce. Amplitude Ampiezza del segnale Voice &Hold &Continua trasmissione per How long to keep transmitting after silence Per quanto tempo continuare a trasmettere dopo l'inizio del silenzio Silence Below Soglia di disattivazione <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. <b>Questo cursore imposta il valore di soglia per il rilevamento del discorso.</b><br />Usa questo insieme alla finestra delle statistiche audio per impostare manualmente i cursori per l'individuazione del discorso. Un segnale al di sotto del cursore "Soglia di disattivazione" viene sempre considerato come silenzio. Un segnale al di sopra del cursore "Soglia di attivazione" viene considerato come discorso. Un segnale compreso tra i due cursori conterà come discorso solo se la trasmissione è già iniziata, ma non ne farà iniziare una nuova. Speech Above Soglia di attivazione Signal values above this count as voice Valore del segnale sopra il quale l'ingresso conta come discorso e la trasmissione ha inizio Compression Compressione &Quality &Qualità Quality of compression (peak bandwidth) Qualità di compressione (picco di banda) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. <b>Imposta la qualità della compressione.</b><br />Determina quanta banda Mumble sarà autorizzato ad usare per l'audio in uscita. Audio per packet Audio per pacchetto How many audio frames to send per packet Quante parti dell'audio inserire in un pacchetto <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>Questo imposta quante parti dell'audio saranno inserite in un pacchetto</b><br />Incrementare questo parametro incrementerà la latenza della tua voce, ma verrà ridotta la banda richiesta. <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). <b>Questo mostra il picco della larghezza di banda utilizzata in uscita.</b><br /> Questo mostra il picco della larghezza di banda inviata dal tuo computer. Bitrate audio è il massimo bitrate (visto che usiamo VBR) per i dati audio da soli. Posizione è il bitrate utilizzato per le informazioni sulla posizione. Overhead è l'insieme di header ed intestrazione dei pacchetti IP (IP e UDP sono il 75% dell'overhead). Audio Processing Elaborazione Audio Noise Suppression Riduzione Rumore Noise suppression Riduzione rumore <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. <b>Imposta la quantità di rumore da eliminare.<b><br />Più alto sarà questo valore e più rumore di sottofondo verrà eliminato. Maximum amplification of input sound Massima amplificazione del segnale di ingresso <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. <b>Massima amplificazione dell'ingresso.</b><br /> Mumble normalizza il volume in ingresso prima della compressione, e questo imposta quanto gli è consentito amplificarlo.<br />Il livello effettivo è continuamente aggiornato in base ai suoni ricevuti, ma non potrà mai andare al di sopra del livello indicato qui.<br />Se il livello del <i>Volume del microfono</i> nelle statistiche audio si aggira intorno al 100%, probabilmente vorrai impostare questo parametro a 2.0 o più, ma se , come la maggior parte delle persone, non riesci a raggiungere il 100%, imposta un livello anche molto più alto.<br />Idealmente, dovresti impostarlo in modo che <i>Volume del microfono x Fattore di amplificazione>= 100</i>, anche quando stai parlando piano.<br /><br />Si noti che non vi è nulla di male nel mettere questa impostazione al massimo, ma Mumble inizierà raccogliendo le altre conversazioni se lasciato per l'auto-tune a quel livello. Current speech detection chance Probabilità attuale di riconoscimento della voce Cancel echo from speakers Elimina l'eco dalle casse Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. Abilitando questo si cancellerà l'eco dalle casse. La modalità 'Misto' ha un impatto minore sulla CPU, ma funziona meglio se le tue casse/cuffie hanno un livello sonoro uguale e se sono equidistanti dal microfono. L'eliminazione eco multicanale fornisce invece una cancellazione eco migliore, ma con un maggior utilizzo della CPU. Disabled Disabilitato <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>Imposta l'individuazione del discorso con il rapporto segnale/rumore.</b><br />In questa modalità, l'ingresso è analizzato per trovare qualcosa di simile a un chiaro segnale, e la chiarezza del segnale viene utilizzata per attivare il rilevamento del discorso. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>Questo visualizza le impostazioni correnti per il riconoscimento del parlato.</b><br />Puoi cambiare le impostazioni dalla finestra delle impostazioni o dalla Procedura Guidata Audio. Signal values below this count as silence Valore del segnale sotto il quale l'ingresso conta come silenzio Maximum bandwidth used for sending audio Banda massima utilizzata per inviare l'audio Use Amplitude based speech detection Usa riconoscimento della voce basato sull'Ampiezza <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). <b>Imposta per quanto tempo dopo la fine del discorso la trasmissione deve continuare.</b><br />Aumentalo se la tua voce viene tagliata mentre stai parlando (si vedi un lampeggiamento rapido dell'icona voce accanto al tuo nome). Exclusive mode Modalità esclusiva <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b> Utilizza il dispositivo in modalità esclusiva.</b><br />Le altre applicazioni non potranno utilizzare questo dispositivo. Exclusive Esclusivo R&eset &Reset &Browse... &Sfoglia... B&rowse... S&foglia... &Preview &Anteprima <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. <b>Anteprima</b><br/>Riproduce un'anteprima dei file attualmente selezionati per <i>Attivazione</i> e di seguito<i>Disattivazione</i>. Displays an always on top window with a push to talk button in it Visualizza una finestra che rimane sempre in primo piano con un pulsante Push-To-Talk Display push to talk window Visualizza finestra Push-To-Talk Misc Varie Audible audio cue when starting or stopping to transmit Riproduce un segnale sonoro all'inizio e alla fine della trasmissione <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. <b>Abilita dei suoni per segnalare la trasmissione audio.</b><br />Selezionando questo sentirai un segnale sonoro all'inizio ed alla fine della trasmissione. Audio cue Segnale sonoro Gets played when starting to transmit Segnale che viene riprodotto all'inizio della trasmissione Gets played when stopping to transmit Segnale che viene riprodotto alla fine della trasmissione Hold Time Attesa Time the microphone stays open after the PTT key is released Tempo che deve passare tra il rilascio del pulsante PTT e la disattivazione del microfono Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) La banda massima del server è %1 kbit/s. Qualità audio impostata su %2 kbit/s (%3 ms) Max. Amplification Amplificazione Massima Idle action Inattività minutes do minuti nothing nulla deafen escluditi mute mutati after dopo Echo Cancellation Cancellazione Eco Mixed echo cancellation Cancellazione eco mista Multichannel echo cancellation Cancellazione eco multicanale The idle action will be reversed upon any key or mouse button input Questa azione di inattività verrà annullata in seguito a qualsiasi input Undo Idle action upon activity Annulla azione di inattività in caso di input Apply RNNoise's noise suppression filter. Applica il filtro di RNNoise per la cancellazione del rumore. <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. <b>Questo applica il filtro di RNNoise per la cancellazione del rumore.</b><br />RNNoise è basato sul machine learning ed è utilizzato in WebRTC. RNNoise RNNoise Audio input Input audio AudioInputDialog Continuous Sempre attivo Voice Activity Attività vocale Push To Talk Push To Talk Audio Input Ingresso audio %1 ms %1 ms Off Disattivato %1 s %1 s %1 kb/s %1 kb/s -%1 dB -%1 dB %1 kbit/s (Audio %2, Position %4, Overhead %3) %1 kbit/s (Audio %2, Posizione %4, Overhead %3) AudioOutput Interface Interfaccia System Sistema Output method for audio Metodo d'uscita per l'audio <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Questo è il sistema d'uscita da utilizzare per l'audio.</b><br />Molto probabilmente vorrai utilizzare DirectSound. Device Dispositivo Output device for audio Dispositivo sonoro di uscita <b>This is the output device to use for audio.</b> <b>Questo è il dispositivo di uscita da usare per il suono.</b> Positional Audio Audio posizionale Audio Output Uscita audio Default &Jitter Buffer Spazio &buffer predefinito Safety margin for jitter buffer Margine di sicurezza per lo spazio del buffer <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. <b>Imposta il margine minimo di sicurezza per il jitter del buffer.</b><br />Tutto l'audio in ingresso è messo nel buffer, ed il jitter del buffer cerca continuamente di tenere il buffer al minimo sostenibile dalla tua rete, in modo da avere una latenza quanto più bassa possibile. Imposta la dimensione minima del buffer da utilizzare. Se all'inizio delle frasi c'è un rumore distorto, aumenta questo valore. Minimum distance to user before sound volume decreases Distanza minima dall'utente prima che il volume del suono inizi a diminuire This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. Imposta la distanza minima per i calcoli sonori. Il volume della voce degli altri utenti non diminuirà fino a che non saranno almeno a questa distanza da voi. This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. Imposta la massima distanza per il calcolo del suono. Quando saranno più distanti il volume dei discorsi degli altri utenti non diminuirà più. <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. <b>Abilita una delle modalità di test di loopback.</b><br /><i>Nessuno</i> - Loopback disattivato<br /><i>Locale</i> - Emula un server locale.<br /><i>Server</i> - Richiesta di loopback dal server.<br />Si prega di notare che quando il loopback è abilitato, gli altri utenti non sentiranno la tua voce. Questa impostazione non viene salvata all'uscita dall'applicazione. Volume Volume Volume of incoming speech Volume della voce in arrivo <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. <b>Regola il volume della voce in arrivo.</b><br />Si noti che se si imposta oltre il 100%, l'audio verrà distorto. Output Delay Ritardo uscita Amount of data to buffer Quantità di dati da mettere nel buffer The connected "speakers" are actually headphones The connected "speakers" are actually headphones. Gli altoparlanti attualmente connessi sono delle cuffie Factor for sound volume decrease Fattore di decremento del volume Bloom Volume massimo Factor for sound volume increase Fattore di incremento del volume How much should sound volume increase for sources that are really close? Quanto dovrebbe aumentare il volume del suono per le sorgenti molto vicine? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. Se impostato indica che non sono collegati degli altoparlanti, ma delle cuffie. Questo è importante, in quanto gli altoparlanti solitamente sono di fronte a voi, mentre le cuffie sono direttamente a sinistra/destra. This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Imposta la quantità di dati da tenere nel pre-buffer per il buffer d'uscita. Sperimentare diversi valori e tenere al valore minimo che non causa una distorsione del suono. Headphones Cuffie Minimum Distance Distanza minima Maximum Distance Distanza massima Maximum distance, beyond which speech volume won't decrease Distanza massima, dopo la quale il volume del discorso non diminuirà piú Minimum Volume Volume minimo What should the volume be at the maximum distance? Quale dovrebbe essere il volume alla distanza massima? Loopback Test Test di Loopback Delay Variance Variazione ritardo Variance in packet latency Variazione nel ritardo dei pacchetti <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>Imposta la variazione nella latenza del pacchetto per il test di loopback locale. </b><br /> La maggior parte dei percorsi dell'audio contengono della latenza variabile. Questo permette di impostare questa variazione per la modalità di test di loopback. Ad esempio, se si imposta questo a 15ms, verrà emulata una rete con 20-35ms di latenza oppure con 80-95ms di latenza. La maggior parte delle connessioni di rete domestiche ha una variazione di circa 5ms. Packet Loss Perdita pacchetti Packet loss for loopback mode Perdita dei pacchetti in modalità loopback <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% <b>Imposta la perdita dei pacchetti per la modalità di loopback.</b><br />Questo sarà il rapporto dei pacchetti persi. A meno che non ci sono dei picchi di banda in uscita o se c'è qualcosa che non va con la connessione di rete, questo sarà 0% &Loopback &Loopback Desired loopback mode Modalità loopback desiderata Attenuate applications by... Attenua applicazioni del... Attenuation of other applications during speech Attenuazione del volume delle altre applicazioni durante il discorso <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. <b>Attenua il volume delle altre applicazioni durante il discorso</b><br />Mumble supporta l'attenuazione del volume delle altre applicazioni durante il discorso in ingresso e/o in uscita. Questo seleziona di quanto le altre applicazioni verranno attenuate se l'impostazione è abilitata. If checked Mumble lowers the volume of other applications while other users talk Se selezionato Mumble attenuerà il volume delle altre applicazioni mentre gli altri utenti parlano <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. <b>Attenua applicazioni mentre gli altri utenti parlano</b><br />Mumble supporta l'attenuazione del volume delle altre applicazioni durante il discorso in ingresso e/o in uscita. Questo imposta l'attenuazione delle altre applicazioni mentre gli altri utenti stanno parlando. while other users talk mentre gli altri parlano If checked Mumble lowers the volume of other applications while you talk Se selezionato Mumble diminuisce il volume delle altre applicazioni mentre tu stai parlando <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. <b>Attenua applicazioni mentre stai parlando</b><br />Mumble supporta l'attenuazione del volume delle altre applicazioni durante il discorso in ingresso e/o in uscita. Questo imposta l'attenuazione delle altre applicazioni mentre tu stai parlando. while you talk mentre stai parlando Exclusive mode, not recommended. Modalità esclusiva, non raccomandata. <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b> Utilizza il dispositivo in modalità esclusiva.</b><br />Le altre applicazioni non potranno utilizzare questo dispositivo. Exclusive Esclusivo Priority Speaker Priorità If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. Se selezionato Mumble abbasserà il volume degli altri utenti mentre stai parlando, ma solo quando hai lo stato di "Priorità". <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. <b>Attenua gli altri utenti quando hai lo stato di "Priorità".</b><br />Mumble può abbassare il volume degli altri utenti quando tu stai parlando ed hai lo stato di <i>Priorità</i> per evitare di essere disturbato. Qui puoi abilitare questa funzione. Attenuate other users while talking as Priority Speaker. Attenua gli altri utenti quando hai Priorità. Advanced Attenuation Options Opzioni Avanzate Attenuazione If checked, Mumble will only attenuate applications that are using the same output source as Mumble Se selezionato, Mumble attenuerà solo le applicazioni che utilizzano lo stesso dispositivo di uscita di Mumble <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. <b>Attenua solo le applicazioni che utilizzano lo stesso dispositivo di uscita di Mumble</b><br />Se selezionato, le applicazioni che utilizzano un dispositivo di uscita differente da quello che utilizza Mumble, non verranno attenuate. Only attenuate applications using the same output device Attenua solo le applicazioni che utilizzano lo stesso dispositivo di uscita If checked, PulseAudio loopback modules will be attenuated Se selezionato, i moduli di loopback di PulseAudio verranno attenuati <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. <b>Attenua i moduli di loopback di PulseAudio</b><br />Se i moduli di loopback sono collegati al dispositivo di uscita utilizzato da Mumble, verranno a loro volta attenuati. Attenuate PulseAudio loopback modules Attenua i moduli di loopback di PulseAudio Audio output Output audio AudioOutputDialog None Disattivato Local Locale Server Server Audio Output Uscita Audio %1 ms %1 ms %1 % %1 % %1 m %1 m AudioOutputSample Choose sound file Scegli il file sonoro Invalid sound file File sonoro non valido The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. Il file '%1' non può essere usato da Mumble. Per favore seleziona un file con un formato e una codifica compatibile. AudioStats >1000 ms >1000ms >1000 ms Audio Statistics Statistiche Audio Input Levels Livelli in ingresso Peak microphone level Livello di picco del microfono Peak power in last frame Picco di potenza nell'ultimo frame This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. Mostra la potenza di picco nell'ultimo frame (20 ms), ed è la stessa misurazione che si trova solitamente visualizzata come "potenza in ingresso". Si prega di ignorare questo aspetto e invece guardare <b>Volume del microfono</b>, che è molto più costante e non tiene conto delle anomalie. Peak speaker level Livello di picco dell'uscita This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. Questo mostra la potenza di picco dell'uscita nell'ultimo frame (20 ms). A meno che non si sta utilizzando un metodo di campionamento multi-canale (come ASIO), questo sarà 0. Se avete configurato una tale impostazione, e questo mostra ancora 0 mentre si sta riproducendo l'audio da altri programmi, la configurazione non funziona. Peak clean level Livello di picco pulito This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. Mostra la potenza di picco nell'ultimo frame (20 ms) dopo tutti i processi. Idealmente, questa dovrebbe essere -96 dB quando non stai parlando. In realtà, uno studio audio dovrebbe vedere -60 dB, e si spera che tu veda qualcosa intorno a -20 dB. Mentre stai parlando, questo dovrebbe salire tra -5 e -10 dB.<br />Se stai usando la cancellazione dell'eco, ed è piú alta di -15 dB quando non stai parlando, l'impostazione non funziona, e infastidirai gli altri giocatori con l'eco. Signal Analysis Analisi del segnale Microphone power Volume del microfono How close the current input level is to ideal Quanto il livello dell'ingresso attuale è vicino a quello ideale This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. Mostra quanto il livello dell'ingresso attuale è vicino a quello ideale. Per regolare il livello del microfono, apri il programma che usi per regolare il volume di registrazione, e guarda il valore mentre stai parlando.<br /><b>Parla forte, come faresti quando sei spaventato.</b><br />Regola il volume fino a quando questo valore è vicino al 100%, ma assicurarsi che non vada al di sopra. Se va al di sopra, potresti avere dei tagli in parti del tuo discorso, che degraderà la qualità del suono. Signal-To-Noise ratio Rapporto Segnale/Rumore Signal-To-Noise ratio from the microphone Rapporto Segnale/Rumore dal microfono This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. E' il rapporto segnale/rumore (SNR) del microfono nell'ultimo frame (20 ms). Mostra quanto è piú forte la voce rispetto al rumore.<br />Se questo valore è inferiore a 1.0, nel segnale c'è piú rumore che voce, e quindi la qualità sarà bassa.<br />Non vi è alcun limite a questo valore, ma non aspettatevi di vederlo molto al di sopra di 40-50 senza essere in uno studio audio. Speech Probability Probabilità di voce Probability of speech Probabilità che il segnale sia voce This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). E' la probabilità che l'ultimo frame (20 ms) sia della voce e non rumore ambientale.<br />L'attivazione vocale dipende da quanto è corretto questo valore. Il trucco sta nel fare in modo che la parte centrale di una frase sia sempre individuata come voce, il problema è nelle pause tra le parole e l'inizio del discorso. E' difficile distinguere un sospiro da una parola che comincia con la 'h'.<br />Se è in grassetto, significa che Mumble è attualmente in trasmissione (se connesso). Configuration feedback Feedback della configurazione Current audio bitrate Bitrate audio attuale Bitrate of last frame Banda dell'ultimo frame DoublePush interval Intervallo di doppia pressione Time between last two Push-To-Talk presses Tempo tra le ultime due pressioni del tasto Push-To-Talk Speech Detection Riconoscimento della voce Current speech detection chance Probabilità attuale di riconoscimento della voce <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>Mostra l'attuale intervento di rilevamento della voce.</b><br />Puoi cambiare le impostazioni dalla finestra di dialogo Impostazioni o dalla Procedura Guidata Audio. Signal and noise power spectrum Spettro della potenza del segnale e del rumore Power spectrum of input signal and noise estimate Potenza spettrale del segnale e del rumore di ingresso stimata This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. Mostra lo spettro della potenza del segnale di ingresso attuale (linea rossa) e l'attuale stima del rumore (area di colore blu).<br />Tutte le ampiezze sono moltiplicate per 30 per mostrare le parti interessanti (quanto piú il segnale rispetto al rumore è presente in ogni banda di frequenza).<br />Probabilmente è di interesse solo se si sta cercando di mettere a punto il rumore del microfono. In buone condizioni, ci dovrebbe essere solo una piccola vibrazione di colore blu nella parte inferiore. Se il blu è piú di metà sul grafico, ci si trova in un ambiente molto rumoroso. Echo Analysis Analisi dell'eco Weights of the echo canceller Potenza della cancellazione dell'eco This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. Mostra la potenza della cancellazione dell'eco, con il tempo crescente verso il basso e la frequenza crescente a destra.<br />In teoria, dovrebbe essere nero, cioè che non esiste eco. Più comunemente, otterrai una o piú strisce orizzontali di colore bluastro che rappresentano l'eco in ritardo. Si dovrebbe poter vedere i pesi aggiornati in tempo reale.<br />Notare che finché l'eco è nullo, qui non sarà possibile visualizzare dati molto utili. Riproduci un po' di musica e le cose dovrebbero stabilizzarsi.<br />Puoi scegliere di visualizzare la parte reale o immaginaria dei pesi nel dominio della frequenza, o alternativamente il modulo e la fase calcolati. Il piú utile di questi sarà probabilmente il modulo, che è l'ampiezza dell'eco, e mostra quanta parte del segnale in uscita è stata rimossa in quel momento. Le altre modalità di visualizzazione sono per lo piú utili per le persone che vogliono affinare gli algoritmi per la cancellazione dell'eco.<br />Notare: Se l'intera immagine oscilla molto mentre si è in modalità modulo, il cancellatore di echo non sta fallendo nel trovare una correlazione tra le due sorgenti di ingresso (altoparlanti e microfono). O hai un ritardo di eco veramente lungo, o una delle sorgenti di ingresso è configurata male. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. Questo indica il bitrate audio dell'ultimo frame compresso (20 ms), e come tale, si muove su e giú mentre il VBR regola la qualità. Puoi regolare il bitrate di picco attraverso la finestra delle Impostazioni. AudioWizard Audio Tuning Wizard Procedura guidata di impostazione dell'audio Introduction Introduzione Welcome to the Mumble Audio Wizard Benvenuto nella Procedura Guidata Audio di Mumble Finished Finito Enjoy using Mumble Divertiti ad usare Mumble Device selection Selezione dispositivo Selecting the input and output device to use with Mumble. Seleziona i dispositivi di ingresso ed uscita da usare con Mumble. This is the device your microphone is connected to. Questo è il dispositivo a cui è connesso il microfono. System Sistema Input method for audio Metodo di ingresso per l'audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Questo è il metodo dell'ingresso da usare per l'audio.</b><br />è probabile che si desideri utilizzare DirectSound. Device Dispositivo Input device to use Dispositivo di ingresso da utilizzare <b>Selects which sound card to use for audio input.</b> <b>Seleziona la scheda audio da usare come ingresso sonoro.</b> Cancel echo from headset or speakers Cancella l'eco dalle cuffie o dalle casse Use echo cancellation Utilizza cancellazione eco This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. Abilita l'eliminazione del riverbero per il suono in uscita, che aiuta sia con gli altoparlanti che con le cuffie. This is the device your speakers or headphones are connected to. Questo è il dispositivo a cui sono connessi gli altoparlanti o le cuffie. Output method for audio Metodo di uscita per l'audio <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Questo è il metodo dell'uscita da usare per l'audio.</b><br />è probabile che si desideri utilizzare DirectSound. Output device to use Dispositivo di uscita da utilizzare <b>Selects which sound card to use for audio Output.</b> <b>Seleziona la scheda audio da usare come uscita sonora.</b> Enable positional audio Abilita audio posizionale Allows positioning of sound Allows positioning of sound. Consente il posizionamento del suono <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> <p> Questa è la procedura guidata per le impostazioni audio di Mumble. Verrai aiutato ad impostare correttamente i livelli di ingresso della tua scheda audio, e anche ad impostare i parametri corretti per l'elaborazione del suono da parte di Mumble. </p> <p> Ricordati che fino a quando la procedura guidata sarà attiva, il suono sarà riprodotto localmente per darti la possibilità di sentirlo e niente sarà inviato al server. </p> Input Device Dispositivo di ingresso Output Device Dispositivo di uscita This allows Mumble to use positional audio to place voices. Questo consente a Mumble di usare l'audio posizionale per posizionare le voci degli altri utenti. <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> <p> Per mantenere la latenza al minimo possibile è importante avere come buffer la minor quantità di audio possibile sulla scheda audio. Tuttavia, molte schede audio riportano che esse richiedono molto meno buffer di quello con cui possono effettivamente lavorare, quindi l'unico modo per impostare al meglio questo valore è quello di trovarlo provando a diminurlo il più possibile. </p> <p> Dovresti sentire un esempio di voce.Imposta il cursore sottostante al minor valore possibile con il quale <b>NON</b> ci sono interruzioni o distorsioni nel suono. Ricorda che l'eco locale è disabilitato durante questo test. </p> Amount of data to buffer Quantità di dati da inserire nel buffer This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Imposta la quantità di pre-buffer da mettere nel buffer in uscita. Prova con diversi valori e imposta quello più basso che non causa distorsioni nel suono. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> <p> Apri il pannello di controllo del suono e vai alle impostazioni di registrazione. Assicurati che il microfono sia selezionato come input attivo con il massimo volume di registrazione. Se c'è un'opzione da abilitare chiamata "Preamplificazione microfono" assicurati che sia selezionata. </p> <p> Parla ad alta voce, come quando sei arrabbiato. In seguito diminuisci il volume del suono dal pannello di controllo fino a che la barra sotto rimane il piú alto possibile nella zona blu e verde quando stai parlando, ma <b>non</b> in quella rossa. </p> Positional Audio Audio posizionale Adjusting attenuation of positional audio. Aggiustamento dell'attenuazione dell'audio posizionale. <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> <p> Mumble supporta l'audio posizionale per alcuni videogiochi, e posizionerà la voce degli altri giocatori relativamente alla sua posizione nel gioco. Il volume dipenderà dalla loro posizione e distanza e sarà aumentato o diminuito su un altoparlante o l'altro per simulare la direzione e la distanza degli altri giocatori. L'audio posizionale dipenderà dai tuoi altoparlanti e dalla loro configurazione nel sistema operativo, quindi qui sarà effettuato un test. </p> <p> Il grafico sottostante visualizza la posizione di <font color="red">Tu</font>, gli <font color="yellow">Altoparlanti</font> e <font color="green">la fonte mobile dell'audio</font>come se fosse visto da sopra.Dovresti sentire l'audio muoversi tra gli altoparlanti. </p> Use headphones instead of speakers Utilizza cuffie invece delle casse <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> <p> Congratulazioni. Ora dovresti essere pronto a provare una ricca esperienza audio con Mumble. </p> <p> Mumble è in continuo sviluppo, e gli sviluppatori cercano di concentrarsi sulle caratteristiche di cui beneficiano la maggior parte degli utenti. A tal fine Mumble supporta l'invio agli sviluppatori di statistiche anonime sulle tue configurazioni. Queste statistiche sono essenziali per lo sviluppo futuro, e anche per essere sicuri che lo sviluppo delle caratteristiche che usi non sia tralasciato. </p> Use headphones Utilizza cuffie This ignores the OS speaker configuration and configures the positioning for headphones instead. Questo ignora la configurazione degli altoparlanti impostata nel sistema operativo e invece configura il posizionamento per le cuffie. Volume tuning Impostazioni volume Tuning microphone hardware volume to optimal settings. Sintonizza il volume dell'hardware del microfono sulle impostazioni ottimali. Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. Ora parla a bassa voce, come se fosse tarda notte e non volessi disturbare nessuno. Regola il cursore sotto in modo che la barra si sposti nella zona verde quando stai parlando, ma rimanga nella zona blu mentre stai in silenzio. Voice Activity Detection Rilevamento dell'attività vocale Letting Mumble figure out when you're talking and when you're silent. Lascia capire a Mumble quando stai parlando e quando stai in silenzio. This will help Mumble figure out when you are talking. The first step is selecting which data value to use. Ciò aiuterà Mumble a capire quando stai parlando. Il primo passo è la scelta dei valori da usare. Raw amplitude from input Ampiezza grezza dell'input Signal-To-Noise ratio Rapporto Segnale/Rumore Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Ora devi aggiustare il seguente cursore. Le prime parole pronunciate dovrebbero rientrare nella zona verde (inizio del discorso). Mentre stai parlando dovrebbe rientrare nella zona gialla (discorso) e quando non stai parlando, tutto dovrebbe stare nella zona rossa (sottofondo). Device tuning Impostazioni dispositivo Changing hardware output delays to their minimum value. Modifica l'uscita dell'hardware al suo valore minimo. Submit anonymous statistics to the Mumble project Invia statistiche anonime al progetto Mumble per migliorare il programma Push To Talk: Push To Talk: Quality & Notifications Qualità & notifiche Adjust quality and notification settings. Regola impostazioni di qualità e notifiche. Quality settings Impostazioni qualità Low Basso Balanced Bilanciato Notification settings Impostazioni notifiche Use Text-To-Speech to read notifications and messages to you. Utilizza la sintesi vocale per leggere le notifiche ed i messaggi diretti a te. Disable Text-To-Speech and use sounds instead. Disabilita la sintesi vocale e utilizza invece i suoni. %1 ms %1 ms Enables attenuation of other applications while users talk to you Abilita l'attenuazione delle altre applicazioni mentre gli utenti ti stanno parlando Attenuate applications while other users talk Attenua applicazioni mentre gli altri utenti stanno parlando High Alto Custom Personalizzato You already set a customized quality configuration in Mumble. Select this setting to keep it. Hai già impostato una configurazione di qualità personalizzata in Mumble. Seleziona questa impostazione per mantenerla. Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. Abilita attenuazione delle altre applicazioni mentre gli utenti ti stanno parlando. Questo vuol dire che appena qualcuno inizia a parlarti su Mumble il suono di tutte le altre applicazioni, come lettori audio, sarà attenuato in modo da sentire meglio chi ti stà parlando. Apply some high contrast optimizations for visually impaired users Applica alcune ottimizzazioni per ottenere un contrasto elevato (utile per gli utenti con problemi visivi) Use high contrast graphics Utilizza grafica ad alto contrasto Keep custom Text-To-Speech settings. Mantieni le impostazioni già personalizzate in precedenza. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode <p> Apri il pannello di controllo del suono e vai alle impostazioni di registrazione. Assicurati che il microfono sia selezionato come input attivo con il massimo volume di registrazione. Se c'è un'opzione da abilitare chiamata "Preamplificazione microfono" assicurati che sia selezionata. </p> <p> Parla ad alta voce, come quando sei infastidito o eccitato. Poi diminuisci il volume del suono dal pannello di controllo fino a che la barra sotto rimane il più alto possibile nella zona a strisce e vuota mentre stai parlando, ma <b>non</b> in quella crocettata. </p> Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode Adesso parla a bassa voce, come se stessi parlando a tarda notte e non volessi disturbare nessuno. Regola il cursore sotto in modo che la barra si sposti nella zona vuota mentre stai parlando, ma rimanga nella zona a strisce mentre stai in silenzio. Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode Ora devi aggiustare il seguente cursore. Le prime parole pronunciate dovrebbero rientrare nella zona vuota (inizio del discorso). Mentre stai parlando dovrebbe rimanere entro la zona a strisce (discorso) e quando non stai parlando, tutto dovrebbe stare nella zona crocettata (sottofondo). In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) In questa configurazione Mumble utilizzerà un <b>basso quantitativo di banda</b>. Questo porterà ad un inevitabile aumento di latenza ed una peggior qualità. Seleziona questo solo se la tua connessione non può sostenere le altre impostazioni. (16kbit/s, 60ms per pacchetto) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) Questa è la configurazione <b>raccomandata</b>. Offre un buon compromesso tra qualità, latenza e utilizzo di banda. (40kbit/s, 20ms per pacchetto) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) Questa configurazione è raccomandata solo in casi in cui la banda non è un problema, come in una LAN. Offre la minor latenza supportata da Mumble ed un'<b>alta qualità</b>. (72kbit/s, 10ms per pacchetto) BanEditor Mumble - Edit Bans Mumble - Modifica della lista degli utenti banditi &Address &Indirizzo IP &Mask &Subnet mask Reason Motivo Start Inizio End Fine User Utente Hash Hash &Add &Aggiungi &Update &Aggiorna &Remove &Rimuovi Ban List Lista Ban Search field Campo di ricerca This is the search field. Use it to find bans that have this username set in the username field. Questo è il campo di ricerca. Usalo per trovare i ban tramite nome utente. Who are you looking for? Chi stai cercando? No nickname Nessun nome utente IP address Indirizzo IP No IP address Nessun indirizzo IP Reason for the ban Motivo del ban No reason Nessun motivo Ban end date Data di fine del ban Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). Data di fine del ban. Se uguale a quella di inizio, il ban sarà permanente (non finirà). Certificate hash Hash del certificato No certificate hash Nessun hash del certificato Banned users Utenti Banditi This is a list with banned users. Questa è una lista degli utenti banditi. Use this button if you want to add a new ban. Utilizza questo pulsante se vuoi aggiungere un nuovo ban. Use this button if you want to update ban information. Utilizza questo pulsante se vuoi aggiornare le informazioni del ban. Use this button if you want to remove user from the ban list. Utilizza questo pulsante se vuoi rimuovere un utente dalla lista dei ban. Clear all fields Azzera tutti i campi This button clears all fields. Use it if you want to add a new ban. Questo pulsante azzera tutti i campi. Usalo se vuoi aggiungere un nuovo ban. Clear Azzera Ban List - %n Ban(s) Lista Ban - %n BanLista Ban - %n Ban CertView Name Nome Email Email Issuer Emittente Expiry Date Data di scadenza (none) (nessuno) Self-signed Autofirmato CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. Impossibile validare l'email.<br />Inserisci un'email valida (o lascia vuoto) per continuare. There was an error generating your certificate.<br />Please try again. C'è stato un errore durante la generazione del tuo certificato.<br />Riprova. Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. La tua chiave e il tuo certificato non possono essere esportati nel formato PKCS#12. Ci potrebbe essere un errore nel tuo certificato. The file could not be opened for writing. Please use another file. Il file non può essere aperto per la scrittura. Per favore usa un'altro file. The file's permissions could not be set. No certificate and key has been written. Please use another file. Non è stato possibile impostare i permessi del file. Il certificato e la chiave non sono stati salvati. Per favore usa un'altro file. The file could not be written successfully. Please use another file. Il file non può essere scritto. Per favore usa un'altro file. The file could not be opened for reading. Please use another file. Il file non può essere aperto per la lettura. Per favore usa un'altro file. The file is empty or could not be read. Please use another file. Il file è vuoto o non può essere letto. Per favore usa un'altro file. The file did not contain a valid certificate and key. Please use another file. Il file non contiene un valido certificato e/o chiave. Per favore usa un'altro file. Select file to export certificate to Seleziona il file su cui esportare il certificato Select file to import certificate from Seleziona il file da cui importare il certificato Unable to import. Missing password or incompatible file type. Impossibile importare. Password mancante o tipo di file incompatibile. <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. <b>Scadenza certificato:</b> Il tuo certificato sta per scadere. Devi rinnovarlo, o non sarai più in grado di connetterti ai server a cui ti sei registrato. Certificates Certificate Management Gestione del certificato Certificate Authentication Autenticazione tramite certificato Authenticating to servers without using passwords Autenticazione con il server senza l'utilizzo di password Current certificate Certificato attuale This is the certificate Mumble currently uses. Questo è il certificato attualmente in uso da Mumble. Current Certificate Certificato attuale Create a new certificate Crea un nuovo certificato This will create a new certificate. Questo creerà un nuovo certificato. Import certificate from file Importa certificato da un file This will import a certificate from file. Questo importerà un certificato da un file. Import a certificate Importa certificato Export Certificate Esporta certificato This will export a certificate to file. Questo esporterà un certificato su un file. Export current certificate Esporta certificato attuale Import Certificate Importa certificato PKCS #12 Certificate import Importa certificato PKCS #12 <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble può importare certificati salvati in formato PKCS #12. Questo è il formato usato quando esporti una chiave per Mumble, e anche quando esporti chiavi da FireFox, Internet Explorer, Opera etc.</p><p>Se il file è protetto da password, avrai bisogno della password per importare il certificato.<p> Import from Importa da Filename to import from Nome del file da cui importare This is the filename you wish to import a certificate from. Questo è il nome del file da cui vuoi importare il certificato. Select file to import from Seleziona il file da cui importare This opens a file selection dialog to choose a file to import a certificate from. Apre una finestra di dialogo per scegliere il file da dove importare il certificato. Open... Apri... Password Password Password for PKCS#12 file Password del file PKCS#12 This is the password for the PKCS#12 file containing your certificate. Questa è la password del file PKCS #12 contenente il tuo certificato. Certificate to import Certificato da importare This is the certificate you are importing. Questo è il certificato che stai importando. Certificate Details Dettagli certificato Replace Certificate Sostituisci certificato Replace existing certificate with new certificate? Sostituire il certificato esistente con quello nuovo? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> <p>Hai già un certificato conservato in Mumble, e stai per sostituirlo.</p> <p>Se stai aggiornando ad un certificato rilasciato a te da un CA attendibile e l'indirizzo email corrisponde a quello del tuo attuale certificato, quest'azione è completamente sicura ed i server a cui ti connetterai riconosceranno automaticamente il certificato. </p> <p>Se questo non è il caso, il tuo certificato non sarà più riconosciuto da nessun server in cui ti eri autenticato in precedenza. Se non ti sei registrato ancora su nessun server, non hai niente di cui preoccuparti. </p> <p> Sei sicuro di voler sostituire il tuo certificato? </p> This is the certificate Mumble currently uses. It will be replaced. Questo è il certificato che Mumble sta utilizzando adesso. Verrà sostituito. New certificate Nuovo certificato This is the new certificate that will replace the old one. Questo è il nuovo certificato che sostituirà quello vecchio. New Certificate Nuovo certificato Make a backup of your certificate Crea un backup del tuo certificato Export to Esporta in Filename to export to Nome del file su cui esportare This is the filename you wish to export a certificate to. Questo è il nome del file su cui vuoi esportare il certificato. Save As... Salva come... This is the certificate Mumble currently uses. It will be exported. Questo è il certificato che Mumble sta utilizzando adesso. Verrà esportato. Generate a new certificate for strong authentication Genera un nuovo certificato per un'autenticazione sicura <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> <p>Mumble ora genererà un certificato sicuro per l'autenticazione ai server.</p><p>Se desideri, puoi fornire alcune informazioni aggiuntive da salvare nel certificato, che saranno presentate ai server quando ti connetterai. Se fornisci un indirizzo email valido, puoi aggiornare il tuo certificato ad uno migliore che fornisce una migliore identificazione.</p> Name Nome Email Email Your email address (e.g. johndoe@mumble.info) Il tuo indirizzo email (es. johndoe@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. Questo è il tuo indirizzo email. Si raccomanda fortemente di fornire un indirizzo email valido, perchè questo ti permetterà di poterlo aggiornare ad uno più sicuro senza problemi di autenticazione. Your name (e.g. John Doe) Il tuo nome (es. John Doe) This is your name, and will be filled out in the certificate. This field is entirely optional. Questo è il tuo nome, e sarà inserito nel tuo certificato. Questo campo è completamente facoltativo. Finish Fine Certificate-based authentication is ready for use L' autenticazione basata sul certificato è pronta per l'uso Enjoy using Mumble with strong authentication. Divertiti utilizzando Mumble con un'autenticazione sicura. Automatic certificate creation Crea un certificato automaticamente <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>Se mai perdessi il tuo certificato attuale, che potrebbe accadere nel caso in cui l'hardware del tuo PC si guasti o se reinstallerai il tuo SO, non sarai più in grado di autenticarti a nessuno dei server in cui ti eri registrato. Per questo è quindi <b>necessario</b> fare una copia di backup del tuo certificato. Noi raccomandiamo fortemente di tenere questo backup in un dispositivo rimovibile, come una memoria esterna USB.</p> <p>Nota che questo file non sarà criptato, e se qualcuno ne otterà l'accesso, sarà in grado di impersonare te, quindi abbine cura.</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> <p>Mumble può usare i certificati per autenticarsi con i server. Usare i certificati evita di dover usare password, vuol dire che non c'è bisogno di inviare password al sito remoto. In questo modo è possibile registrarsi ai server molto più facilmente.</p><p>Anche se Mumble può funzionare senza certificati, molti server ne richiedono uno.</p><p>Creare un nuovo certificato automaticamente è sufficiente in molti casi. Mumble supporta inoltre i certificati rappresentanti la fiducia della proprietà di un indirizzo email dell'utente. Questi certificati sono rilasciati da terze parti. Per maggiori informazioni visita la nostra<a href="http://mumble.info/certificate.php">documentazione sui certificati utente</a>.</p> ChanACL None Nessuno Traverse Attraversare Enter Entrare Speak Parlare Mute/Deafen Escludere/mutare utente Make channel Creare canale Make temporary Creare canale temporaneo Link channel Collegare canale This represents no privileges. Non rappresenta privilegi. This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. Rappresenta il totale controllo sul canale, includendo la possibilità di cambiare gruppo ad ACL. Questo privilegio implica tutti gli altri privilegi. This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. Rappresenta il permesso di attraversare il canale. Se ad un utente è negato questo privilegio, non potrà accedere al canale ed a tutti i suoi sottocanali, indipendentemente dai permessi dei sottocanali. This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. Rappresenta il permesso di entrare nel canale. In una struttura gerarchica di canali, potresti voler dare a tutti il permesso di Attraversare, ma impedire di Entrare nel canale principale. This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. Rappresenta il permesso di parlare in un canale. Un utente senza questo privilegio verrà mutato dal server (come se avesse il microfono disattivato), e non sarà in grado di parlare fino a che non sarà attivato da qualcuno con i diritti sufficienti. This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. Rappresenta il permesso di sussurrare in un canale da fuori. Funziona esattamente come il privilegio <i>parla</i> , ma si applica ai pacchetti trasmessi mentre si stà tenendo premuto il pulsante Sussurra. Può essere usato per trasmettere ad una gerarchia di canali senza collegarli. This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. Rappresenta il permesso di disattivare il microfono e l'audio degli altri utenti. una volta disattivato il suo microfono , questo rimarrà tale fino a che un'altro utente con gli stessi privilegi non lo riattiverà, oppure dopo una riconnessione al server. This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. Rappresenta il permesso di spostare un utente su un canale differente o di espellerlo dal server. Per spostare un utente, l'utente che sposta deve avere il privilegio Sposta nel canale di destinazione, o l'utente spostato deve essere autorizzato a entrare nel canale. Gli utenti con questo privilegio possono muovere altri utenti in canali dove normalmente non avrebbero permesso di entrare. This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. Rappresenta il permesso di creare sottocanali. L'utente che creerà il canale sarà automaticamente aggiunto al gruppo degli admin di quel sottocanale. This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. Rappresenta il permesso di creare sottocanali temporanei. L'utente che creerà il canale sarà automaticamente aggiunto al gruppo degli admin di quel sottocanale. I canali temporanei non saranno salvati e spariranno quando l'ultimo utente lascerà il canale. This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. Rappresenta il permesso di collegare i canali. Gli utenti in canali collegati si possono ascoltare a vicenda se l'utente che parla ha il privilegio <i>Parlare</i> nel canale dell'ascoltatore. È necessario il privilegio di Collegare in entrambi i canali per poter creare un collegamento, ma in uno qualsiasi dei canali per rimuoverlo. This represents the permission to write text messages to other users in this channel. Rappresenta il permesso di scrivere messaggi di testo agli altri utenti di questo canale. This represents the permission to forcibly remove users from the server. Rappresenta il permesso di rimuovere gli utenti dal server. This represents the permission to permanently remove users from the server. Rappresenta il permesso di rimuovere permanentemente gli utenti dal server. This represents the permission to register and unregister users on the server. Rappresenta il permesso di registrare e cancellare gli utenti dal server. This represents the permission to register oneself on the server. Rappresenta il permesso di registrarsi da soli sul server. Whisper Sussurrare Move Spostare Text message Inviare messaggi Kick Espellere Ban Bandire Register User Registrare utenti Register Self Registrarsi da solo Write ACL Scrivere le ACL ChatbarTextEdit Paste and &Send Paste and send Incolla ed in&via <center>Type chat message here</center> <center>Inserisci qui il messaggio</center> ClientUser Friend Amico Authenticated Autenticato Priority speaker Priorità Recording Registrazione in corso Muted (server) Mutato (server) Deafened (server) Escluso (server) Local Ignore (Text messages) Ignora (Messaggi di testo) Local Mute Mutato localmente Muted (self) Mutato (auto) Deafened (self) Escluso (auto) ConfigDialog Accept changes Accetta cambiamenti This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. Il pulsante accetterà le impostazioni attuali e tornerà all'applicazione.<br />Le impostazioni verranno salvate su disco quando uscirai dall'applicazione. Reject changes Annulla cambiamenti This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. Il pulsante annullerà tutti i cambiamenti e tornerà all'applicazione.<br />Quello che hai modificato verrà riportato al valore precedente. Apply changes Applica cambiamenti This button will immediately apply all changes. Il pulsante applicherà immediatamente tutti i cambiamenti. Undo changes for current page Annulla i cambiamenti apportati nella pagina attuale This button will revert any changes done on the current page to the most recent applied settings. Il pulsante annullerà tutti i cambiamenti fatti sulla pagina corrente e ripristinerà le impostazioni precedente. Restore defaults for current page Reimposta i valori predefiniti per la pagina attuale This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. Questo pulsante reimposterà i valori della pagina attuale a quelli predefiniti. Le altre pagine non verranno modificate.<br />Per reimpostare tutti i valori (compresi quelli delle altre pagine) devi usare questo pulsante su tutte le pagine. Mumble Configuration Configurazione di Mumble ConnectDialog Connecting to %1 Connessione a %1 Enter username Inserisci il nome utente Adding host %1 Aggiunta host %1 Servername Nome server Hostname Nome host Bonjour name Nome Bonjour Port Porta Addresses Indirizzi Website Sito web Packet loss Perdita pacchetti Ping (80%) Ping (80%) %1 ms %1 ms Ping (95%) Ping (95%) Bandwidth Banda %1 kbit/s %1 kbit/s &Connect &Connetti &Filters &Filtri Unknown Sconosciuto Users Utenti Version Versione Failed to fetch server list Errore nello scaricamento della lista dei server Mumble Server Connect Connessione ad un Server Mumble Ping Ping Remove from Favorites Rimuovi dai preferiti Add custom server Aggiungi server personalizzato Show all servers that respond to ping Visualizza tutti i server che rispondono al ping Show all servers with users Visualizza tutti i server con utenti Show all servers Visualizza tutti i server &Copy &Copia Copy favorite link to clipboard Copia collegamento al server preferito negli appunti &Paste &Incolla Paste favorite from clipboard Incolla preferito dagli appunti &Edit... &Modifica... &Add New... &Aggiungi... Add to &Favorites Aggiungi ai &Preferiti Open &Webpage Apri Pagina &Web Show &Reachable Visualizza &Raggiungibili Show &Populated Visualizza &Popolati Show &All Visualizza &Tutti ConnectDialogEdit Edit Server Modifica server Name of the server Nome che apparirà sulla tua lista dei server preferiti A&ddress &Indirizzo Internet address of the server. Internet address of the server. Indirizzo internet del server. <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Indirizzo</b></br> Indirizzo internet del server. Può essere un normale nome di host, un indirizzo IPv4/IPv6, o un identificatore di servizio Bonjour. Gli identificatori di servizi Bonjour devono avere il prefisso '@' per essere riconosciuti da Mumble. &Port &Porta Port on which the server is listening Porta di ascolto del server <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. <b>Porta</b><br/> Porta sulla quale il server è in ascolto. Se il server è identificato con un identificatore di servizio Bonjour questo campo sarà ignorato. &Username &Nome utente Username to send to the server Nome utente da inviare al server <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. <b>Nome utente</b><br/> Nome utente da inviare al server. ll server potrebbe avere delle restrizioni su come il nome utente deve essere. Un nome utente potrebbe essere già stato preso da un'altro utente. Label Nome Add Server Aggiungi server You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 Al momento sei connesso ad un server. Vuoi riempire il modulo con le informazioni di connessione di questo server? Host: %1 Port: %2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 Hai un URL nei tuoi appunti. Vuoi riempire il modulo con queste informazioni di connessione? Host: %1 Port: %2 Password Password Password to send to the server Password del server <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. <b>Password</b><br/> Password da inviare al server a cui devi connetterti. La password è richiesta solo se ti stai connettendo come <i>SuperUser</i> o se il server ne richiede una per connettersi. Se non verrà inserita e sarà richiesta dal server, ti apparirà una finestra dove dovrai inserirla. Show password Visualizza password <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. <b>Nome</b><br/> Nome del server. Questo è il nome che apparirà sulla tua lista dei server preferiti, può essere scelto liberamente. Local server label Etichetta locale server 127.0.0.1 127.0.0.1 64738 64738 Your username Il tuo nome utente Your password La tua password &Fill &Riempi CoreAudioSystem Default Device Dispositivo predefinito CrashReporter Mumble Crash Report Rapporto errori di Mumble <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> <p><b>Siamo terribilmente spiacenti, ma sembra che Mumble si sia chiuso per colpa di un errore. Vuoi inviare un rapporto sugli errori agli sviluppatori di Mumble?</b></p><p>Il rapporto contiene una copia parziale della memoria di Mumble al momento dell'errore, e questo aiuterà gli sviluppatori a correggere il problema.</p> Email address (optional) Indirizzo email (facoltativo) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash Per favore descrivi brevemente cosa stavi facendo al momento della chiusura (in inglese) Send Report Invia rapporto Don't send report Non inviare rapporto Crash upload successful Invio rapporto completato con successo Thank you for helping make Mumble better! Grazie per averci aiutato a rendere Mumble migliore! Crash upload failed Invio rapporto fallito We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. Siamo veramente spiacenti, ma sembra che l'invio del rapporto è fallito con l'errore %1 %2. Per favore informa uno sviluppatore. This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 Questo veramente non è divertente, ma apparentemente c'è un bug nel codice del rapporto, e abbiamo fallito ad inviare il rapporto. Puoi informare uno sviluppatore sull'errore %1 Uploading crash report Invio rapporto errore in corso Abort upload Interrompi invio DXAudioInput Default DirectSound Voice Input Ingresso DirectSound predefinito Opening chosen DirectSound Input device failed. No microphone capture will be done. Apertura del dispositivo di ingresso DirectSound fallita. Non ci sarà nessun ingresso microfonico. Opening chosen DirectSound Input failed. Default device will be used. Apertura dell'ingresso DirectSound fallita. Verrà usato il dispositivo predefinito. Lost DirectSound input device. Dispositivo di ingresso DirectSound disconnesso. DXAudioOutput Default DirectSound Voice Output Uscita DirectSound predefinita Opening chosen DirectSound Output failed. Default device will be used. Apertura dell'uscita DirectSound scelta fallita. Verrà usato il dispositivo predefinito. Lost DirectSound output device. Dispositivo di uscita DirectSound disconnesso. Opening chosen DirectSound Output failed. No audio will be heard. Apertura dell'uscita DirectSound fallita. Non si udirà nessun audio. Database Mumble failed to initialize a database in any of the possible locations. Mumble non è riuscito a inizializzare il database in nessuna delle possibili posizioni. The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. Il database '%1' è in sola lettura. Mumble non può salvare le impostazioni del server (es. certificati SSl) fino a che non risolverai il problema. DeveloperConsole Developer Console Console Sviluppatore DockTitleBar Drag here Trascina qui GlobalShortcut Shortcuts Scorciatoie List of configured shortcuts lista delle scorciatoie configurate Function Funzione Data Dati Shortcut Scorciatoia Suppress Disabilita Add new shortcut Aggiungi una nuova scorciatoia This will add a new global shortcut Questo aggiugerà una scorciatoia globale &Add &Aggiungi Remove selected shortcut Rimuove la scorciatoia selezionata This will permanently remove a selected shortcut. Questo rimuoverà permanentemente la scorciatoia selezionata. &Remove &Rimuovi <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> <html><head/><body><p>Mumble può attualmente utilizzare solo pulsanti del mouse e tasti modificatori della tastiera (Alt, Ctrl, Cmd, etc.) per le scorciatoie globali.</p><p>Se vuoi più flessibilità, puoi abilitare <span style=" font-style:italic;">Accesso per dispositivi di assistenza</span> nelle impostazioni di Accessibilità del sistema. Comunque, nota che questo può potenzialmente permettere a software maligni di leggere quello che stai scrivendo con la tastiera.</p></body></html> Open Accessibility Preferences Apri Preferenze Accessibilità Skip Salta Enable Global Shortcuts Abilita Scorciatoie Globali <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. <b>Motori di Scorciatoie Aggiuntivi</b><br />Questa sezione ti permette di configurare l'uso di motori di Scorciatoie Globali aggiuntivi. Additional Shortcut Engines Motori di Scorciatoie Aggiuntivi <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. <b>Abilita Hook di Windows</b>.<br />Abilita il motore di scorciatoie Windows hook. Utilizzare questo motore permette a Mumble di sopprimere gli input di mouse e tastiera. Enable Windows hooks Abilita Hook di Windows <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. <b>Abilita GKey</b>.<br />Abilita il motore di scorciatoie Gkey, per i tasti "G" che si trovano nelle tastiere Logitech. Enable GKey Abilita GKey <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. <b>Abilita XInput</b>.<br />Abilita il motore di scorciatoie XInput, per i controller compatibili con Xbox. Enable XInput Abilita XInput <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. <b>Abilita scorciatoie in applicazioni con privilegi</b>.<br />Conosciuto anche come "UIAccess". Permette a Mumble di ricevere input per le scorciatoie globali anche da applicazioni con alti livelli di privilegi, come il Prompt di Comandi Amministratore o alcuni vecchi giochi che vengono eseguito con privilegi di amministratore. <br /><br /> Senza questa opzione abilitata, le scorciatoie globali di Mumble non funzioneranno nella applicazioni con privilegi. Questo potrebbe apparire incoerente: per esempio, se il pulsante Push-to-Talk viene premuto in un'applicazione senza privilegi, ma rilasciato in una con privilegi, Mumble non osserverà il rilascio e continuerai a trasmettere fino alla prossima pressione del pulsante Push-to-Talk. Enable shortcuts in privileged applications Abilita scorciatoie in applicazioni con privilegi GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> <html><head/><body><p>Mumble può attualmente utilizzare solo pulsanti del mouse e tasti modificatori della tastiera (Alt, Ctrl, Cmd, etc.) per le scorciatoie globali.</p><p>Se vuoi più flessibilità, puoi aggiungere Mumble ai programmi di accessibilità fidati nella sezione Sicurezza e Privacy delle Impostazioni di Sistema Mac.</p><p>Nel pannello delle impostazioni di Sicurezza e Privacy, seleziona la scheda Privacy. Dopo scegli Accessibilità (nella parte bassa) nella lista sulla sinistra. Infine, aggiungi Mumble alla lista dei programmi di accessibilità fidati.</p></body></html> Shortcuts Scorciatoie Shortcut button combination. Combinazione di pulsanti della scorciatoia. <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. <b>Questa è la combinazione della scorciatoia globale.</b><br />Fai doppio click in questo campo e poi premi la combinazione di tasti per riassegnarla. Suppress keys from other applications Elimina tasti da altre applicazioni <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. <b>Nasconde le pressioni dei tasti nelle altre applicazioni.</b><br />Abilitando verranno nascosti i pulsanti (o l'ultimo pulsante di una sequenza multi pulsante) dalle altre applicazioni. Nota che non tutti i pulsanti possono essere disattivati. GlobalShortcutTarget Whisper Target Destinatario del sussurro Whisper to list of Users "Sussurra" a lista di utenti Channel Target Canale destinatario Restrict to Group Limita al gruppo If specified, only members of this group will receive the whisper. Se specificato, solo i membri di questo gruppo riceveranno il sussurro. List of users Lista degli utenti Add Aggiungi Remove Rimuovi Modifiers Modificatori Do not send positional audio information when using this whisper shortcut. Non spedisce audio posizionale quando si stà usando questo collegamento per il sussurro. Ignore positional audio Ignora audio posizionale Shout to Linked channels "Urla" ai canali Collegati Shout to subchannels "Urla" ai sottocanali Shout to Channel "Urla" al canale The whisper will also be transmitted to linked channels. Il sussurro sarà inviato anche ai canali collegati a quello selezionato. The whisper will also be sent to the subchannels of the channel target. Il sussurro sarà inviato anche ai sottocanali del canale selezionato. GlobalShortcutX Mouse %1 Mouse %1 JackAudioSystem Hardware Ports Porte hardware Mono Mono Stereo Stereo LCD Not connected Non connesso LCDConfig Enable this device Abilita questo dispositivo LCD LCD Devices Dispositivo Name Nome <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> <p>Questa è la lista dei dispositivi LCD nel tuo sistema. Nella lista ci sono i nomi, ma include anche la dimensione del display e il tipo.Mumble supporta l'invio a molti dispositivi LCD allo stesso tempo.</p> <h3>Dimensione:</h3> <p> Questo campo descrive la dimensione di un dispositivo LCD. La dimensione è espressa in pixel o in caratteri.</p> <h3>Abilitato:</h3> <p>Questo decide se Mumble deve attingere ad un particolare dispositivo LCD.</p> Size Dimensione Enabled Abilitato Views Visualizzazioni Minimum Column Width Larghezza minima colonna <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> <p>Questa opzione imposta la minima larghezza della colonna nella visuale dell'utente</p> <p>Se troppe persone stanno parlando insieme, la Vista Giocatore verrà divisa in colonne. Puoi usare questa opzione per scegliere un compromesso tra il numero di giocatori mostrati sull'LCD, e la larghezza dei nomi dei giocatori.</p> This setting decides the width of column splitter. Questa impostazione decide la larghezza della divisione tra le colonne. Splitter Width Larghezza divisione Log Debug Debug Critical Critico Warning Avviso Information Informazione Server Connected Connessione al server Server Disconnected Disconnessione dal server Other self-muted/deafened Mutato/escluso (altro utente) Permission Denied Permesso Negato Text Message Messaggio di Testo User Joined Server Utente entrato nel server User Left Server Utente uscito dal server User recording state changed Un utente sta registrando User kicked (you or by you) Utente espulso (tu o da te) User kicked Utente espulso You self-muted Ti sei mutato User muted (you) Utente mutato (tu) User muted (by you) Utente mutato (da te) User muted (other) Utente mutato (altro utente) User Joined Channel Utente entrato nel canale User Left Channel Utente uscito dal canale You self-unmuted Microfono riattivato You self-deafened Ti sei escluso You self-undeafened Ti sei riattivato User renamed Utente rinominato You Joined Channel Sei Entrato nel Canale You Joined Channel (moved) Sei Stato Spostato nel Canale User connected and entered channel Utente entrato nel server e nel canale User left channel and disconnected Utente uscito dal canale e dal server Private text message Messaggio di testo privato the server il server [[ Invalid size ]] [[ Dimensione non valida ]] [[ Text object too large to display ]] [[ Oggetto di testo troppo grande per essere visualizzato ]] [Date changed to %1] [Cambio data a %1] link to %1 collegamento a %1 FTP link to %1 Collegamento FTP a %1 player link collegamento utente channel link collegamento canale %1 link %1 collegamento LogConfig Toggle console for %1 events Imposta console per gli eventi %1 Toggle pop-up notifications for %1 events Imposta notifica pop-up per gli eventi %1 Toggle Text-To-Speech for %1 events Imposta Sintesi vocale per gli eventi %1 Click here to toggle sound notification for %1 events Premi qui per impostare la notifica audio per gli eventi %1 Toggle window highlight (if not active) for %1 events Porta in primo piano la finestra (se non lo è già) in seguito agli eventi %1 Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change Percorso del file sonoro da usare come notifica nel caso degli eventi %1<br />Click singolo per ascoltare<br />Doppio-click per modificare Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. Premi qui per attivare i messaggi della console per gli eventi %1.<br /> Se selezionata, questa opzione fa scrivere a Mumble tutti gli eventi %1 nel log. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. Premi qui per impostare le notifiche pop-up per gli eventi %1.<br />Se selezionato, un pop-up di notifica verrà creato da Mumble per gli eventi %1. Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. Premi qui per impostare il primo piano per gli eventi %1.<br />Se selezionato, la finestra di Mumble verrà portata in primo piano (se non lo è già) in seguito ad ogni evento %1. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. Percorso del file sonoro da usare come notifica nel caso degli eventi %1<br />Click singolo per ascoltare<br />Doppio-click per modificare<br />Assicurati che le notifiche sonore siano abilitate per questi eventi o questo campo non avrà effetto. Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. Premi qui per impostare la sintesi vocale per gli eventi %1.<br />Se selezionato, Mumble utilizzarà la sintesi vocale per leggere gli eventi %1. La sintesi vocale è anche in grado di leggere il contenuto degli eventi, cosa che non è possibile fare con i file sonori. File sonori e Sintesi Vocale non possono essere usati allo stesso tempo. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. Premi qui per impostare le notifiche sonore per gli eventi %1.<br />Se selezionato, Mumble userà un file definito dall'utente per indicare gli eventi %1. File sonori e sintesi vocale non possono essere usati allo stesso tempo. Messages Notifiche Message Notifica Console Console Notification Pop-up Text-To-Speech Sintesi vocale Soundfile File sonoro Path Percorso Text To Speech Sintesi vocale Volume Volume Volume of Text-To-Speech Engine Volume del motore di Sintesi Vocale <b>This is the volume used for the speech synthesis.</b> <b>Volume usato per la sintesi vocale.</b> Length threshold Lettura massima Message length threshold for Text-To-Speech Engine Soglia massima di lunghezza del messaggio per il Motore di Sintesi Vocale <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. <b>Soglia di lunghezza usata per il Motore di Sintesi Vocale.</b><br>I messaggi più lunghi di questo limite non verranno letti. Characters Caratteri Whisper Sussurri If checked you will only hear whispers from users you added to your friend list. Se selezionato sentirai sussurri solo dagli utenti aggiunti alla tua lista amici. Only accept whispers from friends Accetta "sussurri" solo dagli amici If enabled text messages you send will be read back to you with TTS Se abilitato i messaggi che invierai verranno riprodotti dalla sintesi vocale Read back own messages Leggi messaggi inviati Chat Log Log della Chat Maximum chat length Lunghezza massima chat Unlimited Illimitata Lines Linee Highlight Primo piano LookConfig System default Predefinito del sistema None Nessuno Only with users Solo con utenti All Tutti Ask Chiedi Do Nothing Non fare nulla Move Sposta <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory <a href="%1">Sfoglia</a> User Interface Interfaccia Utente This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. Imposta quali canali verranno espansi automaticamente. <i>Nessuno</i> e <i>Tutti</i> espanderanno o no tutti i canali, mentre <i>Solo con utenti</i> espanderà e comprimerà i canali solo quando gli utenti entreranno o usciranno dai canali. List users above subchannels (requires restart). Elenca gli utenti sopra i sottocanali (richiede riavvio di Mumble). <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. <b>Se selezionato, gli utenti saranno mostrati sopra i sottocanali.</b><br />Un riavvio di Mumble è richiesto per vedere i cambiamenti. Users above Channels Visualizza utenti sopra i canali <b>If set, will verify you want to quit if connected.</b> <b>Se selezionato chiederà conferma alla chiusura di Mumble, se connesso ad un server</b> Show number of users in each channel Visualizza il numero degli utenti in ogni canale Show channel user count Visualizza numero utenti nel canale Language Lingua Language to use (requires restart) Lingua da utilizzare (richiede riavvio) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. <b>Imposta quale linguaggio deve utilizzare Mumble.</b><br />Devi riavviare Mumble per utilizzare il nuovo linguaggio. Look and Feel Aspetto Layout Disposizione Classic Classica Stacked Impilata Hybrid Ibrida Custom Personalizzata This changes the behavior when moving channels. Questo cambia il comportamento quando sposterai dei canali. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. Imposta il comportamento dei trascinamenti di canale, può essere utilizzato per evitare il trascinamento accidentale. <i>Sposta</i> il canale viene spostato senza chiedere conferma. <i>Non fare nulla</i> non sposta e visualizza un messaggio di errore. <i>Chiedi</i> mostra una finestra di dialogo per chiedere conferma. Expand Espandi canali When to automatically expand channels Quando espandere automaticamente i canali Channel Dragging Trascinamento Canale Ask whether to close or minimize when quitting Mumble. Chiede se chiudere o minimizzare la finestra all'uscita da Mumble. Ask on quit while connected Quando connesso, chiedi conferma all'uscita Always On Top Sempre in primo piano <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> <b>Se impostato, minimizzare la finestra principale di Mumble la nascoderà e la renderà accessibile solamente dall'icona in tray. Altrimenti sarà minimizzata come una normale finestra.</b> Hide in tray when minimized Nascondi in tray quando minimizzato Hide the main Mumble window in the tray when it is minimized. Nascondi la finestra principale di Mumble in tray quando viene minimizzata. This setting controls when the application will be always on top. Questa impostazione controlla quando l'applicazione deve rimanere sempre in primo piano. Never Mai Always Sempre In minimal view In interfaccia minima In normal view In visuale normale Displays talking status in system tray Visualizza stato nella tray di sistema Show talking status in tray icon Visualizza stato nell'icona in tray This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. Questa impostazione controlla in quali situazioni l'applicazione deve rimanere sempre in primo piano. Se selezioni <i>Mai</i> l'applicazione non starà sopra le altre. <i>Sempre</i> manterrà l'applicazione sempre sopra le altre. <i>In interfaccia minima</i> / <i>In interfaccia normale</i> manterrà l'applicazione sopra le altre quando l'interfaccia minima è attivata/disattivata. Show context menu in menu bar Visualizza menu contestuale nella barra dei menu Apply some high contrast optimizations for visually impaired users Applica alcune ottimizzazioni di contrasto elevato per gli utenti con problemi visivi Optimize for high contrast Utilizza interfaccia a contrasto elevato Application Applicazione Adds user and channel context menus into the menu bar Aggiunge menu contestuale per l'utente e il canale nella barra del menu Tray Icon Icona in tray Channel Tree Canali Use selected item as the chat bar target Seleziona manualmente il destinatario per i messaggi inviati dalla barra della chat Filter automatically hides empty channels Nascondi canali vuoti quando usi il filtro Show transmit mode dropdown in toolbar Mostra selettore della modalità di trasmissione nella toolbar Theme Tema Theme to use to style the user interface Tema da utilizzare per lo stile dell'interfaccia utente <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. <b>Seleziona quale tema usare per l'interfaccia utente di Mumble</b><br />Mumble individuerà i temi da certe cartelle e li visualizzerà in questa lista. Quello che selezionerai verrà utilizzato per personalizzare l'aspetto di Mumble, inclusi colori, icone ed altro. User Dragging Trascinamento Utente This changes the behavior when moving users. Imposta l'azione da compiere al trascinamento di utenti. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. Imposta il comportamento del trascinamento utenti, può essere utilizzato per evitare il trascinamento accidentale. <i>Sposta</i> l'utente viene spostato senza chiedere conferma. <i>Non fare nulla</i> non sposta e visualizza un messaggio di errore. <i>Chiedi</i> mostra una finestra di dialogo per chiedere conferma. <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. <b>Abilita menu Sviluppatore</b><br />Abilita il menu "Sviluppatore" su Mumble. Questo menu viene usato per caratteristiche specifiche per gli sviluppatori, come la Console Sviluppatore. Enable Developer menu Abilita menu Sviluppatore When in custom layout mode, checking this disables rearranging. Quando in modalità personalizzata, spuntare questo disabilita il riposizionamento. Lock layout Disposizione aspetto MainWindow Root Canale principale Push-to-Talk Global Shortcut Push-To-Talk Push and hold this button to send voice. Global Shortcut Tieni premuto questo pulsante per inviare la voce. This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut Questo configura il pulsante Push-To-Talk, fino a quando manterrai premuto questo pulsante, trasmetterai la voce. Reset Audio Processor Global Shortcut Reset processore audio Unlink Plugin Global Shortcut Scollega Plugin Push-to-Mute Global Shortcut Push-to-Mute Join Channel Global Shortcut Entra nel canale Toggle Overlay Global Shortcut Sovrapposizione Toggle state of in-game overlay. Global Shortcut Attiva/Disattiva la sovrapposizione nei giochi. Toggle Minimal Global Shortcut Interfaccia minima Volume Up (+10%) Global Shortcut Aumenta volume (+10%) Volume Down (-10%) Global Shortcut Diminuisci volume (-10%) Mumble Mumble Mumble -- %1 Mumble -- %1 &Window &Finestra Minimize Minimizza Ctrl+M Ctrl+M Close Chiudi Mumble is currently connected to a server. Do you want to Close or Minimize it? Mumble è attualmente connesso ad un server. Vuoi Chiuderlo o Minimizzarlo? Mute Self Global Shortcut Mutati Set self-mute status. Global Shortcut Alterna il tuo stato tra attivo e mutato. This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut Questo imposta o cambia il tuo stato tra mutato ed attivo. Se lo imposti su off, disabiliterai anche l'esclusione automatica. Deafen Self Global Shortcut Disattivati Set self-deafen status. Global Shortcut Imposta stato di escluso (tuo). This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut Questo imposta o cambia lo stato di escluso. Se lo imposti su ON, abiliterai anche l'auto-mutati. Whisper/Shout Whisper Sussurra/Urla <center>Not connected</center> Not connected <center>Disconnesso</center> Clear Cancella Opening URL %1 Apertura URL %1 File does not exist Il file non esiste File is not a configuration file. Il file non è un file di configurazione. Settings merged from file. Impostazioni importate dal file. URL scheme is not 'mumble' Lo schema dell'URL non è 'mumble' This version of Mumble can't handle URLs for Mumble version %1.%2.%3 Questa versione di Mumble non può utilizzare gli URL di Mumble versione %1.%2.%3 Connecting to %1 Connessione a %1 Enter username Inserisci nome utente Connecting to server %1. Connessione al server %1. Reconnecting. Riconnessione. Transmit Mode set to Continuous Modalità di Trasmissione impostata su Continua <p>%1 (%2)<br />%3</p> <p>%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> <h2>Canale di voce</h2><p>Crittografato con 128 bit OCB-AES128<br/>%1 ms latenza media (%4 deviazione)</p> Register yourself as %1 Registrati come %1 <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <p>Stai per registrarti sul server. Quest'azione non può essere annullata, il tuo nome utente non potrà essere cambiato. Sarai per sempre conosciuto come '%1' su questo server.<p>Se sicuro di volerti registrare?</p> <h2>Version</h2><p>Protocol %1</p> <h2>Versione</h2><p>Protocollo %1</p> <p>No build information or OS version available</p> <p>Nessuna informazione disponibile su protocollo o SO</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) La connessione è criptata ed autenticata utilizzando %1 e %2 come meccanismo di scambio chiavi (%3) The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) La connessione è criptata utilizzando %1, con %2 come autenticazione messaggi e %3 come meccanismo di scambio chiavi (%4) The connection is secured by the cipher suite that OpenSSL identifies as %1 La connessione è resa sicura dalla suite crittografica che OpenSSL indentifica come %1 <p>The connection provides perfect forward secrecy</p> <p>La connessione fornisce una perfetta forward secrecy</p> <p>The connection does not provide perfect forward secrecy</p> <p>La connessione non fornisce una perfetta forward secrecy</p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> <h2>Canale di controllo</h2><p>La connessione utilizza %1</p>%2%3<p>%4 ms latenza media (%5 deviazione)</p><p>Host remoto %6 (porta %7)</p> Voice channel is sent over control channel Il canale voce viene inviato sul canale di controllo Register user %1 Registra utente %1 <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> <p>Stai per registrare %1 sul server. Quest'azione non può essere annullata, il nome utente non può essere cambiato, ed essendo un utente registrato, %1 avrà accesso al server anche se il server cambierà password.</p><p>Da questo punto in poi, %1 sarà autenticato con il certificato attualmente in uso.</p><p>Se sicuro di voler registrare %1?</p> Kicking user %1 Espulsione utente %1 Banning user %1 Bandimento utente %1 View comment on user %1 Visualizza commento dell'utente %1 Message to channel %1 Messaggio per il canale %1 Connected. Connesso. <li>Expected certificate digest (SHA-1): %1</li> <li>Digest certificato previsto (SHA-1): %1</li> Server presented a certificate which failed verification. Il server ha presentato un certificato che ha fallito la verifica. <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> <p>%1</p><ul>%2</ul><p>Gli errori specifici con questo certificato sono:</p><ol>%3</ol><p>Vuoi comunque accettare questo certificato?<br />(Verrà anche salvato, così non ti verrà più chiesto.)</p> SSL Version mismatch Versione SSL diversa Server connection failed. Connessione al server fallita. <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>Inserisci qui il messaggio per il canale '%1'</center> <center>Type message to user '%1' here</center> Type message to user '%1' here <center>Inserisci qui il messaggio per l'utente '%1'</center> Choose image file Scegli file immagine Failed to load image Caricamento immagine fallito Could not open file for reading. Impossibile aprire il file per la lettura. Image format not recognized. Formato dell'immagine non riconosciuto. &User &Utente &Channel &Canale Use in conjunction with Whisper to. Global Shortcut Usa in congiunzione con Sussurra a. This will switch the states of the in-game overlay. Global Shortcut Attiva/disattiva la sovrapposizione nei giochi. Link Channel Global Shortcut Collega Canale Cycle Transmit Mode Global Shortcut Cambia modalità di trasmissione Set Transmit Mode to Push-To-Talk Global Shortcut Imposta modalità trasmissione su Push-To-Talk Set Transmit Mode to Continuous Global Shortcut Imposta modalità trasmissione su Continua Set Transmit Mode to VAD Global Shortcut Imposta modalità trasmissione su VAD Send Text Message Global Shortcut Invia Messaggio di Testo Send Clipboard Text Message Global Shortcut Invia Appunti come Messaggio di Testo This will send your Clipboard content to the channel you are currently in. Global Shortcut Invierà il contenuto dei tuoi Appunti come messaggio di testo al canale in cui sei al momento. Continuous Sempre Attivo Voice Activity Attività Vocale Push-to-Talk Push-To-Talk Mumble - Minimal View -- %1 Mumble - Visuale Minima -- %1 Cancel Annulla Save Image As... Salva Immagine Con Nome... Save Image File Salva File Immagine Could not save image: %1 Impossibile salvare l'immagine: %1 Change your comment Modifica il tuo commento Transmit Mode set to Voice Activity Modalità trasmissione impostata su Attività Vocale Transmit Mode set to Push-to-Talk Modalità trasmissione impostata su Push-to-Talk <p>Connected users: %1/%2</p> <p>Utenti connessi: %1/%2</p> UDP Statistics Statistiche UDP To Server Al server From Server Dal server Good Buoni Late In ritardo Lost Persi Resync Risincronizzazione <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> <h2>Banda audio</h2><p>Massima %1 kbit/s<br />Attuale %2 kbit/s<br />Codec: %3</p> Mumble Server Information Informazioni sul server Mumble &View Certificate &Visualizza certificato Enter reason Inserisci motivazione Sending message to %1 Invio messaggio a %1 To %1: %2 Per %1: %2 Message to %1 Messaggio per %1 Are you sure you want to reset the comment of user %1? Sei sicuro di voler cancellare il commento dell'utente%1? Are you sure you want to reset the avatar of user %1? Sei sicuro di voler rimuovere l'avatar dell'utente %1? Are you sure you want to delete %1 and all its sub-channels? Sei sicuro di voler cancellare %1 e tutti i suoi sottocanali? Sending message to channel %1 Invio messaggio al canale %1 Message to tree %1 Messaggio al canale %1 e sottocanali To %1 (Tree): %2 (Tree) %1: %2 Per il canale %1 e sottocanali:%2 Unmuted and undeafened. Ti sei riattivato. Unmuted. Hai riattivato il tuo microfono. Muted. Ti sei mutato. Muted and deafened. Ti sei escluso. Deafened. Ti sei escluso. Undeafened. Ti sei riattivato. Restart Mumble? Riavviare Mumble Some settings will only apply after a restart of Mumble. Restart Mumble now? Alcune impostazioni verranno applicate solo dopo un riavvio di Mumble. Riavviare Mumble adesso? About Qt Informazioni su Qt SSL Verification failed: %1 Verifica SSL fallita: %1 <li>Server certificate digest (SHA-1): %1</li> <li>Digest certificato server (SHA-1): %1</li> <b>WARNING:</b> The server presented a certificate that was different from the stored one. <b>ATTENZIONE:</b> Il server ha presentato un certificato che è differente da quello posseduto. This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. Questo server utilizza un vecchio standard di criptazione che non è più supportato dalle nuove versioni di Mumble. Server connection failed: %1. Connessione al server fallita: %1. Disconnected from server. Disconnesso dal server. Invalid username Nome utente non valido You connected with an invalid username, please try another one. Ti sei connesso con un nome utente non valido, provane un'altro. Username in use Nome utente in uso That username is already in use, please try another username. Questo nome utente è già in uso, prova con un'altro nome. Wrong certificate or password Certificato o password errati Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. Certificato o password errati per un utente registrato. Se sei certo che questo utente è protetto con una password, riprova.Altrimenti annulla e controlla il tuo certificato ed il nome utente. Wrong password Password errata Wrong server password for unregistered user account, please try again. Password errata per un account non registrato, prova di nuovo. Images (*.png *.jpg *.jpeg) Immagini (*.png *.jpg *.jpeg) C&onfigure &Impostazioni &Help A&iuto Log Log This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. Questo visualizza tutte le attività recenti. Connessioni ai server, errori e messaggi informativi vengono visualizzati qui.<br />Per configurare quali messaggi visualizzare qui, usa il comando <b>Impostazioni</b> dal menu. &Quit Mumble &Esci da Mumble Closes the program Chiude il programma Exits the application. Esce dall'applicazione. Ctrl+Q Ctrl+Q Open the server connection dialog Apre la finestra per la connessione al server &Disconnect &Disconnetti Disconnect from server Disconnettiti dal server Disconnects you from the server. Ti disconnette dal server. Show information about the server connection Visualizza le informazioni della connessione al server This will show extended information about the connection to the server. Questo visualizza informazioni estese sulla connessione al server. &Mute &Muta &Deafen &Escludi &Local Mute Muta &localmente Send a Text Message Invia un messaggio di testo Sends a text message to another user. Invia un messaggio di testo ad un'altro utente. Add new channel Aggiungi un nuovo canale This adds a new sub-channel to the currently selected channel. Questo aggiungerà un nuovo sottocanale al canale selezionato. Remove channel Rimuove il canale This removes a channel and all sub-channels. Questo rimuoverà il canale e tutti i suoi sottocanali. Edit Groups and ACL for channel Modifica Gruppi e ACL del canale This opens the Group and ACL dialog for the channel, to control permissions. Questo apre la finestra Gruppi e ACL del canale, per controllarne i permessi. &Link &Collega Link your channel to another channel Collega il canale ad un'altro canale This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. Questa è la barra di chat<br />Se inserisci qui del testo e dopo premi invio, il testo sarà inviato all'utente o al canale selezionato. Se non hai selezionato niente il messaggio sarà inviato al canale attuale. Chatbar Barra della chat Shows a dialog of registered servers, and also allows quick-connect. Visualizza una finestra dei server registrati, e permette anche la connessione rapida. Kick user (with reason) Espelli utente (con motivazione) Kick selected user off server. You'll be asked to specify a reason. Espelle l'utente dal server. Ti verrà chiesto di specificarne la motivazione. Mute user Muta l'utente Mute or unmute user on server. Unmuting a deafened user will also undeafen them. Muta o riattiva un utente sul server. Kick and ban user (with reason) Espelli e bandisci l'utente (con motivazione) Kick and ban selected user from server. You'll be asked to specify a reason. Espelli e bandisci l'utente selezionato dal server. Ti sarà chiesto di specificare una ragione. Deafen user Esclude l'utente dalle conversazioni Deafen or undeafen user on server. Deafening a user will also mute them. Esclude o riattiva l'utente sul server. Escudendo un utente lo muterai automaticamente. Mute user locally Muta localmente l' utente Mute or unmute user locally. Use this on other users in the same room. Muta o riattiva il microfono di un utente localmente. Usa questo su altri giocatore nello stesso canale. This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. Questo collega il canale corrente con il canale selezionato. Se gli utenti hanno il permesso di parlare nell'altro canale, potranno comunicare con gli altri. Questo è un collegamento permanente, e non terminerà fino a che i canali non saranno scollegati manualmente o il server verrà riavviato. Per favore guarda la scorciatoia per il Premi-per-collegare. &Unlink Channel &Scollega Unlink your channel from another channel Scollega il tuo canale da un'altro canale This unlinks your current channel from the selected channel. Questo scollegherà il tuo canale dal canale selezionato. Unlinks your channel from all linked channels. Scollega il tuo canale da tutti gli altri canali collegati precedentemente. This unlinks your current channel (not the selected one) from all linked channels. Questo scollegerà il canale corrente(non quello selezionato) da tutti i canali collegati. &Reset &Reset Reset audio preprocessor Reset preprocesore audio This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. Questo resetta il preprocessore audio, inclusa la cancellazione del rumore, il guadagno automatico e la rilevazione dell'attività della voce. Se qualcosa peggiorasse improvvisamente e temporaneamente l'audio (come far cadere il microfono), puoi usare questo per evitare di aspettare che il preprocessore audio si riaggiusti automaticamente. &Mute Self &Mutati Mute yourself Disattiva il tuo microfono Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. Muta o riattiva il tuo microfono. Quando il tuo microfono è disattivato tu non invii nessun dato al server. Riattivarsi il microfono quando si è escusi implica anche riattivarsi. &Deafen Self &Escluditi Deafen yourself Escude te stesso dalle comunicazioni Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. Escude o riattiva te stesso. Quando sei escuso non sentirai niente e non potrai comunicare vocalmente con gli altri perchè escudersi implica mutarsi. &Text-To-Speech &Sintesi vocale Toggle Text-To-Speech Sintesi vocale Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. Abilita o disabilita il motore di sintesi vocale. Solamente i messaggi abilitati per la sintesi vocale nella finestra di configurazione saranno trasmessi. Display audio statistics Visualizza le statistiche audio Pops up a small dialog with information about your current audio input. Visualizza una piccola finestra di dialogo con le informazioni sull'input audio corrente. Forcibly unlink plugin Forza scollegamento plugin This forces the current plugin to unlink, which is handy if it is reading completely wrong data. Questo forza il plugin corrente a scollegarsi, che è utile se questo stà leggendo delle informazioni completamente sbagliate. Configure Mumble Configura Mumble Allows you to change most settings for Mumble. Permette di cambiare molte delle impostazioni di Mumble. Start the audio configuration wizard Inizia la procedura guidata per la configurazione dell'audio This will guide you through the process of configuring your audio hardware. Questo ti guiderà attraverso il processo di configurazione dell'hardware audio. &What's This? &Cos'è questo? Enter What's This? mode Entra nella modalità Cos'è questo Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. Premi qui per entrare nella modalità "Cos'è questo?". Il cursore diventerà un punto interrogativo. Premendo su qualsiasi pulsante, scelta del menu o area, verrà visualizzata una descrizione di cosa è quello. Information about Mumble Informazioni su Mumble Shows a small dialog with information and license for Mumble. Visualizza una piccola finestra con le informazioni e la licenza di Mumble. Information about Speex Informazioni su Speex Shows a small dialog with information about Speex. Visualizza una piccola finestra con le informazioni su Speex. Information about Qt Informazioni su Qt Shows a small dialog with information about Qt. Visualizza un dialogo con le informazioni su Qt. Check for &Updates Cerca &Aggiornamenti Check for new version of Mumble Cerca una nuova versione di Mumble Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. Controlla sul sito di Mumble se è disponibile una nuova versione del programma, nel caso in cui lo fosse, fornisce un undirizzo per scaricarla. Sends a text message to all users in a channel. Invia un messaggio di testo a tutti gli utenti in questo canale. Configure certificates for strong authentication Configurazione del certificato per un'autenticazione sicura This starts the wizard for creating, importing and exporting certificates for authentication against servers. Questo avvia la procedura guidata per creare, importare o esportare i certificati per autenticarsi ai server. Register user on server Registra utente sul server This will permanently register the user on the server. Questo registrerà permanentemente l'utente nel server. Add &Friend Aggiungi &amico Adds a user as your friend. Aggiunge utente come tuo amico. This will add the user as a friend, so you can recognize him on this and other servers. Questo aggiunge l'utente alla lista degli amici, così potrai trovarlo in questo ed altri server. &Remove Friend &Rimuovi amico Removes a user from your friends. Rimuove un utente dai tuoi amici. This will remove a user from your friends list. Questo rimuove l'utente dalla lista degli amici. &Update Friend &Aggiorna amico Update name of your friend. Aggiorna il nome del tuo amico. Your friend uses a different name than what is in your database. This will update the name. Il tuo amico usa un nome differente da quello che è nel tuo database. Questo aggiornerà il nome. Edit registered users list Modifica la lista degli utenti registrati This opens the editor for registered users, which allow you to change their name or unregister them. Questo apre l'editor degli utenti registrati, che ti permette di cambiare il loro nome o di eliminare la loro registrazione. Add or remove text-based access tokens Aggiungi o rimuovi Token di accesso testuali &Minimal View Interfaccia &Minima Toggle minimal window modes Imposta la modalità interfaccia minima This will toggle minimal mode, where the log window and menu is hidden. Attiva/disattiva l'interfaccia minima, dove la finestra del log e il menu sono nascosti. You muted and deafened %1. Hai escluso %1. You unmuted and undeafened %1. Hai riattivato %1. You undeafened %1. Hai riattivato %1. You suppressed %1. Hai mutato %1. %1 muted and deafened by %2. %2 ha escluso %1. %1 unmuted and undeafened by %2. %2 ha riattivato %1. %1 undeafened by %2. %2 ha riattivato%1. %1 suppressed by %2. %2 ha mutato %1. %1 moved to %2. %1 si è spostato su %2. %1 moved to %2 by %3. %3 ha spostato %1 su %2. %1 moved in from %2 by %3. %3 ha spostato %1 qui dal canale %2. %1 is now muted and deafened. %1 si è escluso. Your account information can not be verified currently. Please try again later Le tue informazioni d'accesso non possono essere verificate attualmente. Sei pregato di riprovare più tardi Welcome message: %1 Messaggio di benvenuto: %1 Mumble: %1 Mumble: %1 You were denied %1 privileges in %2. Ti è stato negato il privilegio %1 su %2. %3 was denied %1 privileges in %2. A %3 è stato negato il privilegio %1 su %2. Denied: Cannot modify SuperUser. Negato: Impossibile modificare SuperUser. Denied: Invalid channel name. Negato: Nome del canale non valido. Denied: Text message too long. Negato: Messaggio di testo troppo lungo. Denied: Operation not permitted in temporary channel. Negato: Operazione non permessa in un canale temporaneo. You need a certificate to perform this operation. Hai bisogno di un certificato per eseguire questa operazione. %1 does not have a certificate. %1 non ha un certificato. Invalid username: %1. Nome utente non valido: %1. Invalid username. Nome utente non valido. Channel is full. Il canale è pieno. Channel nesting limit reached. Limite annidamento canali raggiunto. Channel count limit reached. Need to delete channels before creating new ones. Limite di canali raggiunto. Bisogna eliminarne prima di crearne di nuovi. Permission denied. Permesso negato. %1 connected and entered channel. %1 si è connesso ed è entrato nel canale. %1 connected. Si è connesso %1. %1 is now muted. %1 si è mutato. %1 is now unmuted. %1 ha riattivato il suo microfono. Recording started Registrazione avviata Recording stopped Registrazione interrotta %1 started recording. %1 ha iniziato a registrare. %1 stopped recording. %1 ha smesso di registrare. You revoked your priority speaker status. Hai revocato la tua priorità. You assumed priority speaker status. Hai assunto la priorità. %1 revoked your priority speaker status. %1 ti ha tolto la priorità. %1 gave you priority speaker status. %1 ti ha dato la priorità. You revoked priority speaker status for %1. Hai tolto la priorità a %1. You gave priority speaker status to %1. Hai dato la priorità a %1. %1 revoked own priority speaker status. %1 si è tolto la priorità. %1 assumed priority speaker status. %1 ha assunto la priorità. %1 revoked priority speaker status for %2. %1 ha tolto la priorità a %2. %1 gave priority speaker status to %2. %1 ha dato la priorità a %2. You were unmuted and undeafened by %1. %1 ti ha riattivato. You were muted by %1. Sei stato mutato da %1. You were undeafened by %1. %1 ti ha riattivato. You were suppressed. You were suppressed by %1. Sei stato mutato dal server. You were unsuppressed. Sei stato riattivato dal server. You were unsuppressed by %1. Sei stato riattivato da %1. You joined %1. Sei entrato in %1 You moved %1 to %2. Hai spostato %1 su %2. %1 is recording %1 stà registrando %1 renamed to %2 by %3. %3 ha rinominato %1 in %2 %1 disconnected. %1 si è disconnesso. Server message from Server (Tree) (Canale e sottocanali) (Channel) (Canale) (Private) (Privato) %2%1: %3 %2%1: %3 Failed to load Opus, it will not be available for audio encoding/decoding. Caricamento Opus fallito, non sarà disponibile per la codifica/decodifica audio. The server requests minimum client version %1 Il server richiede una versione superiore o uguale alla %1 The server requests positional audio be enabled. Il server richiede l'audio posizionale abilitato. The server requests positional audio be disabled. Il server richiede l'audio posizionale disabilitato. The server requests Push-to-Talk be enabled. Il server richiede il Push-To-Talk abilitato. The server requests Push-to-Talk be disabled. Il server richiede il Push-To-Talk disabilitato. You were unmuted by %1. %1 ti ha riattivato il microfono. You muted %1. Hai mutato %1. You unsuppressed %1. Hai riattivato %1. You unmuted %1. Hai riattivato il microfono di %1. %1 muted by %2. %2 ha mutato %1. %1 unsuppressed by %2. %2 ha riattivato %1. %1 unmuted by %2. %2 ha riattivato il microfono di %1. Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. Impossibile trovare una versione del codec CELT uguale a quella degli altri utenti. Non sarai in grado di parlare con gli altri utenti. You were muted and deafened by %1. You were deafened by %1. %1 ti ha mutato. You were kicked from the server by %1: %2. %1 ti ha espulso dal server per la seguente motivazione: %2. %3 was kicked from the server by %1: %2. %1 ha espulso %3 dal server per la seguente motivazione: %2. You were kicked and banned from the server by %1: %2. %1 ti ha espulso e bandito dal server per la seguente motivazione: %2. %3 was kicked and banned from the server by %1: %2. %1 ha espulso e bandito %3 dal server per la seguente motivazione: %2. You were moved to %1 by %2. %2 ti ha spostato sul canale %1. %1 entered channel. %1 è entrato nel canale. Server connection rejected: %1. Connessione al server respinta: %1. Denied: %1. Negato: %1. %1 renamed to %2. %1 rinominato in %2 %1 left channel and disconnected. %1 è uscito dal canale e si è disconnesso. Message from %1 Messaggio da %1 You have User Dragging set to "Do Nothing" so the user wasn't moved. Hai impostato "Non Fare Nulla" su Trascinamento Utente quindi l'utente non è stato spostato. You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. Hai selezionato "non fare niente" sulle impostazioni del trascinamento del canale, quindi il canale non verrà spostato. Unknown Channel Drag mode in UserModel::dropMimeData. Modalità trascinamento canale sconosciuta in UserModel::dropMimeData. Remote controlling Mumble: Controllare Mumble da remoto: Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) -jn, --jackname Set custom Jack client name. --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. Utilizzo: mumble [opzioni] [<url>] <url>Specifica un URL a cui connettersi dopo l'avvio, invece di visualizzare la finestra di connessione, ed ha la seguente forma: mumble://[<nomeutente>[:<password>]@]<host>[:<porta>][/<canale>[/<sottocanale>...]][?version=<x.y.z>] I parametri di versione devono essere messi nel giusto ordine per richiamare la giusta versione del client. Il valore attuale di default è 1.2.0. Opzioni valide: -h, --help Visualizza questo messaggio di aiuto ed esce. -m, --multiple Permette di avviare più di un'istanza del programma contemporaneamente. -n, --noidentity Impedisce il caricamento di file di identificazione (es. certificati) -jn, --jackname Imposta un nome personalizzato per il client Jack. --license Mostra la licenza di Mumble. --authors Mostra gli autori di Mumble. --third-party-licenses Mostra le licenze dei software di terze parti utilizzati da Mumble. Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status Utilizzo: mumble rpc <action> [opzioni] È possibile controllare da remoto un'istanza di Mumble già avviata utilizzando il comando "mumble rpc". Le azioni valide sono: mute Muta te stesso unmute Riattiva il tuo microfono togglemute Mutati/Riattivati deaf Esclude te stesso undeaf Riattiva te stesso toggledeaf Escluditi/Riattivati Invocation Invocazione Error: No RPC command specified Errore: Nessun comando RPC specificato RPC RPC Welcome to Mumble. Benvenuto su Mumble. Skipping version check in debug mode. Salta il controllo di versione in modalità debug. Hide Frame Nascondi cornice Toggle showing frame on minimal window Imposta visualizzazione cornice nell'interfaccia minina This will toggle whether the minimal window should have a frame for moving and resizing. Imposta se la finestra nella visualizzazione minima deve avere la cornice per muoverla e ridimensionarla. &Unlink All &Scollega tutti Reset the comment of the selected user. Cancella il commento dell'utente selezionato. &Join Channel &Entra nel Canale View comment in editor Visualizza commento nell'editor Query server for connection information for user Interroga il server sulle informazioni di connessione dell'utente S&erver &Server &Self &Utente &Unlink Plugins &Scollega plugin Register yourself on the server Registrati sul server Change your avatar image on this server Cambia l'immagine dell'avatar in questo server &Remove Avatar &Rimuovi avatar Remove currently defined avatar image. Rimuove l'immagine attualmente impostata come avatar. Icon Toolbar Toolbar delle icone Change your own comment Cambia il tuo commento Recording Registra audio Priority Speaker Priorità &Copy URL &Copia URL Copies a link to this channel to the clipboard. Copia negli appunti un link a questo canale. Ignore Messages Ignora Messaggi Locally ignore user's text chat messages. Ignora locamente i messaggi di testo dell'utente. Silently drops all text messages from the user. Elimina silenziosamente tutti i messaggi di testo provenienti dall'utente. Edit ban list on server Modifica la lista ban del server This lets you edit the server-side IP ban list. Questo ti permette di modificare la lista dei ban per IP dal server. &Filter on/off &Filtro on/off Toggle the channel filter (Ctrl+F) Filtro canali (Ctrl+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. Abilita p disabilita il filtraggio dei canali selezionati. Normalmente tutti i canali vuoti vengono filtrati. Puoi impostare altri canale per il filtraggio dal menu contestuale del canale. Ctrl+F Ctrl+F &Hide Channel when Filtering &Nascondi canale durante il filtraggio Reset the avatar of the selected user. Rimuove l'avatar dell'utente selezionato, ripristinando quello predefinito. Locally adjust the user's speech volume. Regola localmente il volume dell'utente. Opens a dialog with a volume slider. Use this on other users in the same room. Apre una finestra di dialogo con un cursore del volume. Usalo su utenti nello stesso canale. &Developer &Sviluppatore &Hide Mumble &Nascondi Mumble Hides the main Mumble window. Nasconde la finestra principale di Mumble. Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. Nasconde la finestra principale di Mumble. Ripristinala premendo sull'icona in Tray o aprendo Mumble nuovamente. Show the Developer Console Mostra la Console Sviluppatore Shows the Mumble Developer Console, where Mumble's log output can be inspected. Mostra la Console Sviluppatore di Mumble, dove l'output del log di Mumble può venir ispezionato. &Connect... &Connetti... &Ban list... Lista &ban... &Information... &Informazioni... &Kick... &Espelli... &Ban... &Bandisci... Local Volume Adjustment... Regolazione Volume Locale... Send &Message... Invia &Messaggio... &Add... &Aggiungi... &Remove... &Rimuovi... &Edit... &Modifica... Audio S&tatistics... &Statistiche audio... &Settings... &Configurazione... &Audio Wizard... Procedura Guidata &Audio... Developer &Console... &Console Sviluppatore... &About... &Informazioni... About &Speex... Info su &Speex... About &Qt... Info su &Qt... &Certificate Wizard... &Procedura Guidata Certificato... &Register... &Registra... Registered &Users... &Utenti registrati... Change &Avatar... Cambia &avatar... &Access Tokens... &Token di accesso... Reset &Comment... Cancella &Commento... Reset &Avatar... Rimuovi &Avatar... View Comment... Visualizza Commento... &Change Comment... &Modifica commento... R&egister... R&egistrati... Show Mostra Shows the main Mumble window. Mostra la finestra principale di Mumble. Manual Manual Mumble Positional Audio Audio Posizionale Mumble Manuale Position Posizione X X Y Y Z Z m m Heading Direzione Azimuth Azimut Elevation Elevazione ° ° Meta data Meta data Context Contesto Identity Identità Set Imposta State Stato Linked Collegato Activated Attivato Unhinge Scollega NetworkConfig Network Rete Updates are mandatory when using snapshot releases. Gli aggiornamenti sono obbligatori quando stai usando una versione "Snapshot". Connection Connessione Use TCP compatibility mode Use TCP compatability mode Usa la modalità compatibilità TCP <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). <b>Abilita la modalità compatibilità TCP</b>.<br />Farà in modo che Mumble utilizzi solo il protocollo TCP quando comunica con il server. Ciò aumenterà il sovraccarico di rete e causerà la perdita di pacchetti che creeranno vuoti nelle comunicazioni, quindi va usato solo se con il sistema standard (che usa UDP per la voce e il TCP per il controllo) non funziona. Reconnect when disconnected Ricollegati quando disconnesso <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. <b>Riconnetti quando disconnesso</b>.<br />Mumble proverà a ricollegarsi automaticamente dopo 10 secondi se cade la connessione al server. Reconnect automatically Ricollegati automaticamente Proxy Proxy Type Tipo Type of proxy to connect through Tipo di proxy da utilizzare per la connessione Direct connection Connessione diretta HTTP(S) proxy HTTP(S) proxy SOCKS5 proxy SOCKS5 proxy Hostname Hostname Hostname of the proxy Nome dell'host del proxy Force TCP mode Forza modalità TCP Enable QoS to prioritize packets Abilita QoS per priorizzare i pacchetti This will enable QoS, which will attempt to prioritize voice packets over other traffic. Questo abilita QoS, che tenterà di priorizzare i pacchetti vocali rispetto all'altro traffico. Use Quality of Service Utilizza Quality Of Service Don't send certificate to server and don't save passwords. (Not saved). Non inviare certificati al server e non salvare le password. (Non salvato). <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> <b>Questo evita l'invio di informazioni di identità da parte del client. </b><p> Il client non si identificarà con un certificato, anche se definito, e non salverà le password per le connessioni. Ciò è principalmente un'opzione di prova e non viene salvata.</P> Suppress certificate and password storage Disabilita conservazione certificati e password <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>Tipo di proxy tramite cui connettersi.</b><br />Ciò fà connettere Mumble attraverso un proxy per tutte le connessioni in uscita. Nota: il proxy tunneling forza Mumble nella modalita di compatibilità TCP, causando l'invio di tutti i dati vocali tramite il canale di controllo. <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. <b>Nome dell'host del proxy.</b><br />Specifica il nome dell'host del proxy attraverso cui vuoi che passi il traffico di rete. Port Porta Port number of the proxy Numero della porta del proxy <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. <b>Numero della porta del proxy.</b><br />Specifica il numero della porta su cui il proxy è in ascolto per le connessioni. Username Nome utente Username for proxy authentication Nome utente per l'autenticazione al proxy <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>Nome utente per l'autenticazione al proxy.</b><br />Specifica il nome utente utilizzato per l'autenticazione con il proxy. Nel caso in cui il proxy non utilizzi l'autenticazione, o se si desidera effettuare la connessione anonima, è sufficiente lasciare vuoto questo campo. Password Password Password for proxy authentication Password per l'autenticazione al proxy <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>Password per l'autenticazione al proxy.</b><br />Specifica la password utilizzata per l'autenticazione con il proxy. Nel caso in cui il proxy non utilizzi l'autenticazione, o se si desidera effettuare la connessione anonima, è sufficiente lasciare vuoto questo campo. Mumble services Servizi di Mumble Check for new releases of Mumble automatically. Cerca nuove versioni di Mumble automaticamente. This will check for new releases of Mumble every time you start the program, and notify you if one is available. Cercherà nuove versioni di Mumble ogni volta che aprirai il programma, e ti avviserà se una di queste è disponibile. Check for application updates on startup Controlla aggiornamenti all'avvio Check for new releases of plugins automatically. Cerca nuove versioni dei plugin automaticamente. This will check for new releases of plugins every time you start the program, and download them automatically. Cercherà nuove versioni dei plugin ogni volta che aprirai il programma, e li scaricherà automaticamente. <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. <b>Invia statistiche anonime.</b><br />Mumble ha un piccolo team di sviluppo, e come tale ha bisogno di concentrare lo sviluppo dove è maggiormente necessario. Inviando un po' di statistiche permetterai al progetto di stabilire dove concentrare lo sviluppo. Submit anonymous statistics to the Mumble project Invia statistiche anonime al progetto Mumble Submit anonymous statistics Invia statistiche anonime Reconnect to last used server when starting Mumble All'avvio di Mumble riconnetti all'ultimo server visitato Reconnect to last server on startup All'avvio connettiti all'ultimo server visitato Download plugin and overlay updates on startup Aggiorna plugin e sovrapposizione all'avvio Privacy Privacy Prevent OS information being sent to Mumble servers and web servers Previene l'invio di informazioni del SO ai server Mumble ed ai server web <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. <b>Non inviare informazioni SO ai server</b><br/> Previene l'invio da parte del client di informazioni potenzialmente identificanti del sistema operativo al server Mumble e ai server web. Do not send OS information to Mumble servers and web servers Non inviare informazioni SO ai server Mumble ed ai server web Overlay Silent Silenzio Talking Parlato Whisper "Sussurro" Shout "Urlo" Channel Canale Failed to create communication with overlay at %2: %1. No overlay will be available. Impossibile comunicare con la sovrapposizione su %2 :%1. La sovrapposizione non sarà disponibile. OverlayClient Filter Filtro Only talking Solo attivi Talking and recently active Attivi e recentemente attivi All in current channel Tutti gli utenti nel canale All in linked channels Tutti gli utenti nei canali collegati Always show yourself Visualizza sempre te stesso Configure recently active time (%1 seconds)... Configura tempo recentemente attivi (%1 secondi)... Columns Colonne Sort Ordine Alphabetically Alfabetico Last state change Ultimo a cambiare stato Edit... Modifica... Reset Zoom Reimposta zoom Configure recently active time Configura tempo recentemente attivi Amount of seconds users remain active after talking: Numero di secondi per i quali un utente rimane attivo dopo aver parlato: OverlayConfig To move the users, drag the little red dot. Per spostare gli utenti, muovere il piccolo punto rosso. To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. Per ridimensionare gli utenti, usare la rotella del mouse. For more options, right click a user. For more options, rightclick a user. Per altre impostazioni, premere con il pulsante destro del mouse su di un utente. Launcher Filter Filtro Launcher Overlay Sovrapposizione Choose executable Seleziona eseguibile Choose application Seleziona applicazione Choose path Scegli percorso Load Overlay Presets Carica configurazione per la sovrapposizione Mumble overlay presets (*.mumblelay) File di configurazione della sovrapposizione (*.mumblelay) Save Overlay Presets Salva configurazione della sovrapposizione Options Opzioni Enable overlay. Abilita la sovrapposizione. Enable Overlay Abilita la Sovrapposizione This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. Stabilisce se la sovrapposizione è attivata oppure no. Questa impostazione viene controllata solo all'apertura delle applicazioni, quindi assicurati che Mumble sia in esecuzione e che questa opzione sia attiva prima di avviare l'applicazione.<br />Si noti che se si avvia Mumble prima dell'applicazione, o se si disattiva la sovrapposizione durante l'esecuzione, non vi è alcun modo sicuro per riavviare la sovrapposizione senza dover riavviare l'applicazione. Layout Aspetto Blacklist Blacklist Whitelist Whitelist Uninstall Overlay Disinstalla la sovrapposizione Overlay Installation Installazione Sovrapposizione Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. Mumble ha rilevato che non hai la Sovrapposizione installata. Premere il pulsante sottostante per installarla. Install Mumble Overlay Installa la sovrapposizione di Mumble Overlay Upgrade Aggiornamento Sovrapposizione Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. Mumble ha rilevato una vecchia versione dei file di configurazione della sovrapposizione. Per aggiornare questi file all'ultima versione, premi il pulsante sottostante. Upgrade Mumble Overlay Aggiorna Sovrapposizione di Mumble Display a frame counter in the overlay Visualizza un contatore di frame nella sovrapposizione Show FPS counter Mostra contatore FPS Load an overlay preset from file Carica da file una configurazione per la sovrapposizione Load… Carica... Save your overlay settings to file Salva la configurazione della sovrapposizione su file Save… Salva... Set the overlay font. Imposta il carattere del testo della sovrapposizione. Set the overlay text color. Imposta il colore del testo della sovrapposizione. Color Colore Remove Rimuovi Font Carattere FPS and Clock Display FPS ed orologio Display a clock in the overlay showing the current local time (system time). Mostra un orologio con l'ora locale nella sovrapposizione (ora del sistema). Show Clock Mostra orologio Overlay Exceptions Eccezioni Sovrapposizione Overlay Exception Mode Modalità Eccezione Sovrapposizione Allowed launchers Launcher consentiti Add Aggiungi Allowed programs Programmi consentiti Allowed paths Percorsi consentiti Blacklisted programs Programmi non consentiti OverlayEditor State Stato User is not talking L'utente non sta parlando Passive Silenzio User is talking in your channel or a linked channel L'utente sta parlando nel tuo canale od in uno collegato Talking Parlato User is whispering to you privately L'utente ti sta "sussurrando" privatamente Private Whisper "Sussurro" privato User is shouting to your channel L'utente sta "urlando" al tuo canale Channel Whisper "Urlo" al canale Zoom Zoom Zoom Factor Fattore di Zoom Enabled Elements Elementi abilitati User avatar, chosen by each user Avatar dell'utente, scelto da ogni utente Avatar Avatar User's name Nome dell'utente Username Nome utente Name of user's channel, if outside your current channel Nome del canale dell'utente, se lui si trova fuori dal tuo stesso canale Channel Canale Muted or deafened Mutato o escluso Mute state Stato Bounding box, automatically shrunk to minimum size to contain all visible elements Riquadro, ridimensionato automaticamente per contenere tutti gli elementi visibili Bounding box Riquadro Overlay Editor Editor della sovrapposizione OverlayEditorScene Layout preset Preimpostazioni Large square avatar Avatar larghi e quadrati Avatar and Name Avatar e Nome User Opacity Opacità utenti %1% %1% Object Opacity Opacità oggetti Alignment Allineamento Left Sinistra Center Centrato Right Destra Top Alto Bottom Basso Color... Colore... Font... Carattere... Bounding box Riquadro Pen width Larghezza penna Padding Padding Pen color Colore penna Fill color Colore del riempimento Pick pen color Seleziona il colore della penna Pick fill color Seleziona il colore di riempimento Pick color Seleziona colore Pick font Seleziona il carattere PluginConfig Plugins Plugin Plugin has no configure function. Il Plugins non ha la funzione di configurazione. Plugin has no about function. Il Plugin non ha informazioni. Options Opzioni Enable plugins and transmit positional information Abilita i plugins e trasmette le informazioni sulla posizione This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. Questo permette ai plugin dei giochi supportati di ottenere la tua posizione nel gioco e trasmettere l'audio di conseguenza. Questo permette inoltre agli altri utenti di sentire la tua voce dalla direzione del tuo personaggio e in relazione alla loro posizione. Link to Game and Transmit Position Collegati ai giochi e trasmetti la posizione Reloads all plugins Ricarica tutti i plugin This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. Cerca di nuovo e ricarica tutti i plugin. Usalo se hai appena aggiunto o modificato un plugin nella cartella dei plugin. &Reload plugins &Ricarica i plugin Information about plugin Informazioni sul plugin This shows a small information message about the plugin. Mostra qualche informazione riguardo al plugin. &About &Informazioni Show configuration page of plugin Visualizza la pagina di configurazione del plugin This shows the configuration page of the plugin, if any. Visualizza la pagina di configurazione del plugin, se presente. &Configure &Configura Name Nome Enabled Abilitato Plugins Skipping plugin update in debug mode. I plugin non verranno aggiornati in modalità Debug. Downloaded new or updated plugin to %1. Aggiunto o aggiornato il seguente plugin: %1. Failed to install new plugin to %1. Installazione del seguente plugin fallita: %1. %1 lost link. Collegamento perso con %1. %1 linked. collegato con %1. PortAudioSystem Default Device Dispositivo predefinito PulseAudioSystem Default Input Ingresso predefinito Default Output Uscita predefinita QApplication Failed to restart mumble Impossibile riavviare Mumble Mumble failed to restart itself. Please restart it manually. Il riavvio automatico di Mumble è fallito. Per favore riavvialo manualmente. RichTextEditor Failed to load image Caricamento immagine fallito Image file too large to embed in document. Please use images smaller than %1 kB. File immagine troppo grande. Per favore utilizza un'immagine più piccola di %1 kB. Message is too long. Il messaggio è troppo lungo. Display Visualizzato Source Text Testo sorgente &Bold &Grassetto Ctrl+B Ctrl+B &Italic &Corsivo Italic Corsivo Ctrl+I Ctrl+I Underline Sottolineato Ctrl+U Ctrl+U Color Colore Insert Link Inserisci link Ctrl+L Ctrl+L Insert Image Inserisci immagine RichTextEditorLink Add Link Aggiungi collegamento URL Indirizzo Text Testo ServerHandler Unable to resolve hostname Impossibile risolvere nome host Server is not responding to TCP pings Il server non risponde ai ping TCP UDP packets cannot be sent to or received from the server. Switching to TCP mode. Impossibile inviare o ricevere pacchetti UDP dal server. Passaggio alla modalità TCP. UDP packets cannot be sent to the server. Switching to TCP mode. Impossibile inviare pacchetti UDP al server. Passaggio alla modalità TCP. UDP packets cannot be received from the server. Switching to TCP mode. Impossibile ricevere pacchetti UDP dal server. Passaggio alla modalità TCP. UDP packets can be sent to and received from the server. Switching back to UDP mode. I pacchetti UDP possono di nuovo essere inviati e ricevuti dal server. Ritorno alla modalità UDP. Connection timed out Connessione scaduta ServerView Favorite Preferiti LAN LAN Public Internet Internet Unknown Sconosciuto Africa Africa Asia Asia North America Nord America South America Sud America Europe Europa Oceania Oceania ShortcutActionWidget Unassigned Non assegnata ShortcutDelegate On On Off Off Toggle Alterna Unassigned Non assegnato ShortcutKeyWidget Press Shortcut Premi scorciatoia ShortcutTargetDialog Root Principale Parent Superiore Current Attuale Subchannel #%1 Sottocanale #%1 ShortcutTargetWidget ... ... , , Root Principale Parent Superiore Current Attuale Subchannel #%1 Sottocanale #%1 Invalid Non valido Empty <Empty> Vuoto ShortcutToggleWidget Off Off Toggle Alterna On On TextMessage Enter text Inserisci testo If checked the message is recursively sent to all subchannels Se selezionato il messaggio verrà inviato ricorsivamente a tutti i sottocanali Send recursively to subchannels Invia ricorsivamente ai sottocanali Tokens Empty Token Token vuoto Mumble - Access Tokens Mumble - Token di accesso List of access tokens on current server Lista di token di accesso sul server attuale <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. <b>Questa è una lista modificabile dei token di accesso sul server connesso.</b> <br /> Un token di accesso è una stringa di testo, che può essere usata come password per una semplice gestione delle password dei canali. Mumble ricorderà i token usati e li invierà di nuovo al server la prossima volta che ti riconnetterai, così da non doverli inserire ogni volta. Add a token Aggiunge un token &Add &Aggiungi Remove a token Rimuove un token &Remove &Rimuovi UserEdit Registered Users Utenti registrati Remove Rimuovi Rename Rinomina Who are you looking for? Chi stai cercando? Days Giorni Weeks Settimane Months Mesi Years Anni Inactive for Inattivo da Registered users: %n account(s) Utenti registrati: %n accountUtenti registrati: %n account UserInformation User Information Informazioni utente Connection Information Informazioni connessione Version Versione OS Sistema Operativo Certificate Certificato IP Address Indirizzo IP CELT Versions Versioni CELT Details... Dettagli... Ping Statistics Statistiche ping Pings received Ping ricevuti Average ping Ping medio TCP (Control) TCP (Controllo) UDP (Voice) UDP (Voce) UDP Network statistics Statistiche pacchetti UDP Good Buoni Late In ritardo Lost Persi Resync Risincronizzazioni From Client In uscita To Client In ingresso Connection time Connessione %1w %1sett %1d %1g %1h %1o %1m %1m %1s %1s , , %1 (%2) %1.%2.%3 (%4) %1 (%2) Supported Supportato Not Supported Non supportato Not Reported Non riportato %1 online (%2 idle) Online da %1 (inattivo da %2) %1 online Online da %1 %1 kbit/s %1 kbit/s Bandwidth GroupBox Banda Bandwidth Label Banda Ping deviation Deviazione ping UserListModel Nick Nome utente Inactive days Giorni di inattività Last channel Ultimo canale Last seen: %1 Ultima visita: %1 Never Mai Channel ID: %1 ID canale: %1 UserLocalVolumeDialog Local volume for other users Volume locale per altri utenti <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. <b>Regola localmente il volume di altri utenti</b><br />Mumble supporta la regolazione locale del volume degli altri utenti. Adjusting local volume for %1 Regolazione locale del volume di %1 dB dB <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> <html><head/><body><p>Usa il cursore o la casella di testo per cambiare il volume di un utente.</p><p><span style="font-weight:600;">Attenzione!</span></p><p>Aumentare troppo il volume di un utente può danneggiare permanentemente il tuo udito. Potrebbe anche aumentare il rumore di sottofondo prodotto dall'utente.</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: Questo è un utente connesso al server. L'icona a sinistra dell'utente indica se sta parlando o no: Talking to your channel. Sta parlando al tuo canale. Shouting directly to your channel. Whispering directly to your channel. Sta "urlando" direttamente al tuo canale. Whispering directly to you. Sta "sussurrando" direttamente a te. Not talking. Non sta parlando. This is a channel on the server. The icon indicates the state of the channel: Questo è un canale nel server. L'icona indica lo stato del canale: Your current channel. Il tuo canale attuale. A channel that is linked with your channel. Linked channels can talk to each other. Un canale che è collegato al tuo canale. Canali collegati possono comunicare tra di loro. A channel on the server that you are not linked to. Un canale nel server al quale non sei collegato. This shows the flags the user has on the server, if any: Mostra delle informazioni sull'utente relative a questo server: On your friend list Nella tua lista amici Authenticated user Utente autenticato Muted (manually muted by self) Mutato (manualmente da se stesso) Muted (manually muted by admin) Mutato (manualmente da un'amministratore) Muted (not allowed to speak in current channel) Mutato (non ha il permesso di parlare nel canale attuale) Muted (muted by you, only on your machine) Mutato localmente (solo tu non potrai sentirlo) Muted (push-to-mute) Mutato (push-to-mute) Deafened (by self) Escluso (da solo) Deafened (by admin) Escluso (da un amministratore) User has a new comment set (click to show) Utente con un nuovo commento (click per mostrarlo) User has a comment set, which you've already seen. (click to show) Utente con commento già visto (click per mostrare) Ignoring Text Messages Stai ignorando i suoi messaggi di testo This shows the flags the channel has, if any: Mostra alcune informazioni sul canale: Channel has a new comment set (click to show) Il canale ha un nuovo commento (click per mostrare) Channel has a comment set, which you've already seen. (click to show) Il canale ha un commento già visto. (click per mostrare) Channel will be hidden when filtering is enabled Il canale verrà nascosto quando il filtro è attivo Name Nome Flags Segnali Are you sure you want to drag this user? Sei sicuro di voler trascinare questo utente? Are you sure you want to drag this channel? Sei sicuro di voler spostare questo canale? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. Impossibile eseguire l'azione automaticamente, per favore reimposta gli indicatori numerici della posizione dei canali o spostalo manualmente. VersionCheck Upgrade Mumble Aggiorna Mumble A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? Una nuova versione di Mumble è stata individuata e scaricata automaticamente. Si raccomanda di aggiornare a questa versione, o di reinstallare l'ultima versione stabile. Vuoi lanciare l'installazione ora? Failed to launch snapshot installer. Impossibile lanciare l'installazione della Snapshot. Corrupt download of new version detected. Automatically removed. La nuova versione scaricata si è rivelata corrotta ed è quindi stata automaticamente rimossa. Downloading new snapshot from %1 to %2 Download in corso della nuova Snapshot da %1 su %2 Failed to write new version to disk. Failed to write new version to disc. Impossibile scrivere la nuova versione su disco. Mumble failed to retrieve version information from the central server. Mumble non è riuscito a recuperare le informazioni sull'ultima versione dal server centrale. ViewCert Certificate Chain Details Dettagli sulla catena del certificato Certificate chain Catena del certificato Certificate details Dettagli del Certificato Common Name Nome Comune Organization Organizzazione Subunit Sotto-unità Country Paese Locality Località State Stato Valid from: %1 Valido da: %1 Valid to: %1 Valido fino a: %1 Serial: %1 Seriale: %1 Public Key: %1 bits %2 Chiave Pubblica: %1 bits %2 RSA RSA DSA DSA Digest (SHA-1): %1 Firma (SHA-1): %1 Digest (SHA-256): %1 Digest (SHA-256): %1 Email: %1 Email: %1 DNS: %1 DNS: %1 Issued by: Rilasciato da: Unit Name Nome Unità VoiceRecorder Recorder failed to create directory '%1' Il registratore non è riuscito a creare la cartella '%1' Recorder failed to open file '%1' Il registratore non è riuscito ad aprire il file '%1' .wav - Uncompressed .wav - non compresso .ogg (Vorbis) - Compressed .ogg (Vorbis) - Compresso .au - Uncompressed .au - Non compresso .flac - Lossless compressed .flac - Compresso senza perdite VoiceRecorderDialog Recorder Registratore Control Controllo 00:00:00 00:00:00 &Start &Avvia S&top &Interrompi Mode Modalità Multichannel Multicanale Output Output Output format Formato dell'output Target directory Cartella di destinazione Filename Nome del file &Browse... &Sfoglia... Valid variables are: Variabili valide: Inserts the user's name Inserisce il nome dell'utente Inserts the current date Inserisce la data attuale Inserts the current time Inserisce l'ora attuale Inserts the hostname Inserisce il nome del server Recorder still running Il registratore è ancora in funzione Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? Chiudere il registratore senza fermare la registrazione scarterà l'audio non ancora salvato. Vuoi davvero chiudere il registratore? Unable to start recording. Not connected to a server. Impossibile iniziare la registrazione. Non sei connesso ad un server. The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. Il server a cui sei attualmente connesso è versione 1.2.2 o inferiore. Per ragioni di privacy non è possibile registrare nei server con versione inferiore a 1.2.3. Per favore contatta l'amministratore del server per maggiori informazioni. There is already a recorder active for this server. C'è già in corso una registrazione in questo server. Please select a recording format. Seleziona un formato di registrazione. Stopping Interruzione Select target directory Seleziona la cartella di destinazione Downmix Downmix WASAPIInput Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone. L'accesso al microfono è stato negato. Per favore controlla che le impostazioni del microfono sul tuo sistema operativo consentano a Mumble di utilizzare il microfono. WASAPISystem Default Device Dispositivo predefinito qwPTTButtonWidget Mumble PTT Mumble PTT Push to talk Push To Talk mumble-1.3.4/src/mumble/mumble_br.ts0000664000175000017500000114665214010707274017245 0ustar builderbuilder ACLEditor Deny Allow Aotren Allow %1 Deny %1 Mumble - Add channel Default server value Failed: Invalid channel Mumble - Edit %1 ID: %1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Channel must have a name This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Dialog Name Enter the channel name here. Description Password Enter the channel password here. Check to create a temporary channel. Temporary <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. Position &Groups Group List of groups Remove selected group Remove Inherit group members from parent Inherit Make group inheritable to sub-channels Inheritable Group was inherited from parent channel Inherited Members Add Add member to group Remove member from group &ACL Active ACLs List of entries Inherit ACL of parent? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. Inherit ACLs Move entry up This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. &Up Move entry down This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. &Down Add new entry This adds a new entry, initially set with no permissions and applying to all. &Add Remove entry This removes the currently selected entry. &Remove Context Entry should apply to this channel. Entry should apply to this channel This makes the entry apply to this channel. Applies to this channel Entry should apply to sub-channels. Add new group <b>Add</b><br/> Add a new group. Inherited members Contains the list of members added to the group by this channel. Contains a list of members whose group membership will not be inherited from the parent channel. Contains the list of members inherited by other channels. Type in the name of a user you wish to add to the group and click Add. Type in the name of a user you wish to remove from the group and click Add. Exclude Excluded members This makes the entry apply to sub-channels of this channel. Applies to sub-channels Permissions User/Group Group this entry applies to User ID User this entry applies to This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. &Properties <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. ID of the channel. Maximum Users Maximum number of users allowed in the channel <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. This is the sort order for the channel. ALSAAudioInput Default ALSA Card Opening chosen ALSA Input failed: %1 ALSAAudioOutput Default ALSA Card Opening chosen ALSA Output failed: %1 ASIOConfig %1 (version %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz ASIO Initialization failed: %1 Failed to instantiate ASIO driver ASIO Device selection Device Device to use for microphone This chooses what device to query. You still need to actually query the device and select which channels to use. Query selected device This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Query Configure selected device This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Configure Capabilities Driver name Buffer size This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. Configure input channels Channels Microphone <- -> Unused Speakers ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. Opening selected ASIO device failed. No input will be done. AboutDialog About Mumble <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble &License A&uthors &Third-Party Licenses OK AudioInput Interface System Input method for audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Input device for audio <b>This is the input device to use for audio.</b> Transmission &Transmit When to transmit your speech <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. DoublePush Time If you press the PTT key twice in this time it will get locked. <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. Reset audio cue to default <b>Reset</b><br/>Reset the paths for the files to their default. Browse for on audio file Browse for off audio file Off On Preview the audio cues Use SNR based speech detection Signal to Noise <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. Amplitude Voice &Hold How long to keep transmitting after silence Silence Below <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. Speech Above Signal values above this count as voice Compression &Quality Quality of compression (peak bandwidth) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. Audio per packet How many audio frames to send per packet <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). Audio Processing Noise Suppression Noise suppression <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. Maximum amplification of input sound <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. Current speech detection chance Cancel echo from speakers Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. Disabled <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal values below this count as silence Maximum bandwidth used for sending audio Use Amplitude based speech detection <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). Exclusive mode <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive R&eset &Browse... B&rowse... &Preview <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. Displays an always on top window with a push to talk button in it Display push to talk window Misc Audible audio cue when starting or stopping to transmit <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. Audio cue Gets played when starting to transmit Gets played when stopping to transmit Hold Time Time the microphone stays open after the PTT key is released Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) Max. Amplification Idle action minutes do nothing deafen mute after Echo Cancellation Mixed echo cancellation Multichannel echo cancellation The idle action will be reversed upon any key or mouse button input Undo Idle action upon activity Apply RNNoise's noise suppression filter. <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. RNNoise Audio input AudioInputDialog Continuous Voice Activity Push To Talk Audio Input %1 ms Off %1 s %1 kb/s -%1 dB %1 kbit/s (Audio %2, Position %4, Overhead %3) AudioOutput Interface System Output method for audio <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Output device for audio <b>This is the output device to use for audio.</b> Positional Audio Audio Output Default &Jitter Buffer Safety margin for jitter buffer <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. Minimum distance to user before sound volume decreases This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. Volume Volume of incoming speech <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. Output Delay Amount of data to buffer The connected "speakers" are actually headphones The connected "speakers" are actually headphones. Factor for sound volume decrease Bloom Factor for sound volume increase How much should sound volume increase for sources that are really close? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Headphones Minimum Distance Maximum Distance Maximum distance, beyond which speech volume won't decrease Minimum Volume What should the volume be at the maximum distance? Loopback Test Delay Variance Variance in packet latency <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. Packet Loss Packet loss for loopback mode <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% &Loopback Desired loopback mode Attenuate applications by... Attenuation of other applications during speech <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. If checked Mumble lowers the volume of other applications while other users talk <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. while other users talk If checked Mumble lowers the volume of other applications while you talk <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. while you talk Exclusive mode, not recommended. <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive Priority Speaker If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. Attenuate other users while talking as Priority Speaker. Advanced Attenuation Options If checked, Mumble will only attenuate applications that are using the same output source as Mumble <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. Only attenuate applications using the same output device If checked, PulseAudio loopback modules will be attenuated <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. Attenuate PulseAudio loopback modules Audio output AudioOutputDialog None Local Server Audio Output %1 ms %1 % %1 m AudioOutputSample Choose sound file Invalid sound file The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. AudioStats >1000 ms >1000ms Audio Statistics Input Levels Peak microphone level Peak power in last frame This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. Peak speaker level This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. Peak clean level This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. Signal Analysis Microphone power How close the current input level is to ideal This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. Signal-To-Noise ratio Signal-To-Noise ratio from the microphone This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. Speech Probability Probability of speech This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). Configuration feedback Current audio bitrate Bitrate of last frame DoublePush interval Time between last two Push-To-Talk presses Speech Detection Current speech detection chance <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal and noise power spectrum Power spectrum of input signal and noise estimate This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. Echo Analysis Weights of the echo canceller This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. AudioWizard Audio Tuning Wizard Introduction Welcome to the Mumble Audio Wizard Finished Enjoy using Mumble Device selection Selecting the input and output device to use with Mumble. This is the device your microphone is connected to. System Input method for audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Input device to use <b>Selects which sound card to use for audio input.</b> Cancel echo from headset or speakers Use echo cancellation This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. This is the device your speakers or headphones are connected to. Output method for audio <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. Output device to use <b>Selects which sound card to use for audio Output.</b> Enable positional audio Allows positioning of sound Allows positioning of sound. <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> Input Device Output Device This allows Mumble to use positional audio to place voices. <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> Amount of data to buffer This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> Positional Audio Adjusting attenuation of positional audio. <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> Use headphones instead of speakers <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> Use headphones This ignores the OS speaker configuration and configures the positioning for headphones instead. Volume tuning Tuning microphone hardware volume to optimal settings. Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. Voice Activity Detection Letting Mumble figure out when you're talking and when you're silent. This will help Mumble figure out when you are talking. The first step is selecting which data value to use. Raw amplitude from input Signal-To-Noise ratio Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Device tuning Changing hardware output delays to their minimum value. Submit anonymous statistics to the Mumble project Push To Talk: Quality & Notifications Adjust quality and notification settings. Quality settings Low Balanced Notification settings Use Text-To-Speech to read notifications and messages to you. Disable Text-To-Speech and use sounds instead. %1 ms Enables attenuation of other applications while users talk to you Attenuate applications while other users talk High Custom You already set a customized quality configuration in Mumble. Select this setting to keep it. Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. Apply some high contrast optimizations for visually impaired users Use high contrast graphics Keep custom Text-To-Speech settings. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) BanEditor Mumble - Edit Bans &Address &Mask Reason Start End User Hash &Add &Update &Remove Ban List Search field This is the search field. Use it to find bans that have this username set in the username field. Who are you looking for? No nickname IP address No IP address Reason for the ban No reason Ban end date Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). Certificate hash No certificate hash Banned users This is a list with banned users. Use this button if you want to add a new ban. Use this button if you want to update ban information. Use this button if you want to remove user from the ban list. Clear all fields This button clears all fields. Use it if you want to add a new ban. Clear Ban List - %n Ban(s) CertView Name Email Issuer Expiry Date (none) Self-signed CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. There was an error generating your certificate.<br />Please try again. Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. The file could not be opened for writing. Please use another file. The file's permissions could not be set. No certificate and key has been written. Please use another file. The file could not be written successfully. Please use another file. The file could not be opened for reading. Please use another file. The file is empty or could not be read. Please use another file. The file did not contain a valid certificate and key. Please use another file. Select file to export certificate to Select file to import certificate from Unable to import. Missing password or incompatible file type. <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. Certificates Certificate Management Certificate Authentication Authenticating to servers without using passwords Current certificate This is the certificate Mumble currently uses. Current Certificate Create a new certificate This will create a new certificate. Import certificate from file This will import a certificate from file. Import a certificate Export Certificate This will export a certificate to file. Export current certificate Import Certificate PKCS #12 Certificate import <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> Import from Filename to import from This is the filename you wish to import a certificate from. Select file to import from This opens a file selection dialog to choose a file to import a certificate from. Open... Password Password for PKCS#12 file This is the password for the PKCS#12 file containing your certificate. Certificate to import This is the certificate you are importing. Certificate Details Replace Certificate Replace existing certificate with new certificate? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> This is the certificate Mumble currently uses. It will be replaced. New certificate This is the new certificate that will replace the old one. New Certificate Make a backup of your certificate Export to Filename to export to This is the filename you wish to export a certificate to. Save As... This is the certificate Mumble currently uses. It will be exported. Generate a new certificate for strong authentication <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> Name Email Your email address (e.g. johndoe@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. Your name (e.g. John Doe) This is your name, and will be filled out in the certificate. This field is entirely optional. Finish Certificate-based authentication is ready for use Enjoy using Mumble with strong authentication. Automatic certificate creation <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> ChanACL None Traverse Enter Speak Mute/Deafen Make channel Make temporary Link channel This represents no privileges. This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. This represents the permission to write text messages to other users in this channel. This represents the permission to forcibly remove users from the server. This represents the permission to permanently remove users from the server. This represents the permission to register and unregister users on the server. This represents the permission to register oneself on the server. Whisper Move Text message Kick Ban Register User Register Self Write ACL ChatbarTextEdit Paste and &Send Paste and send <center>Type chat message here</center> ClientUser Friend Authenticated Priority speaker Recording Muted (server) Deafened (server) Local Ignore (Text messages) Local Mute Muted (self) Deafened (self) ConfigDialog Accept changes This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. Reject changes This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. Apply changes This button will immediately apply all changes. Undo changes for current page This button will revert any changes done on the current page to the most recent applied settings. Restore defaults for current page This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. Mumble Configuration ConnectDialog Connecting to %1 Enter username Adding host %1 Servername Hostname Bonjour name Port Addresses Website Packet loss Ping (80%) %1 ms Ping (95%) Bandwidth %1 kbit/s &Connect &Filters Unknown Users Version Failed to fetch server list Mumble Server Connect Ping Remove from Favorites Add custom server Show all servers that respond to ping Show all servers with users Show all servers &Copy Copy favorite link to clipboard &Paste Paste favorite from clipboard &Edit... &Add New... Add to &Favorites Open &Webpage Show &Reachable Show &Populated Show &All ConnectDialogEdit Edit Server Name of the server A&ddress Internet address of the server. Internet address of the server. <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. &Port Port on which the server is listening <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. &Username Username to send to the server <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. Label Add Server You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 Password Password to send to the server <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. Show password <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. Local server label 127.0.0.1 64738 Your username Your password &Fill CoreAudioSystem Default Device CrashReporter Mumble Crash Report <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> Email address (optional) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash Send Report Don't send report Crash upload successful Thank you for helping make Mumble better! Crash upload failed We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 Uploading crash report Abort upload DXAudioInput Default DirectSound Voice Input Opening chosen DirectSound Input device failed. No microphone capture will be done. Opening chosen DirectSound Input failed. Default device will be used. Lost DirectSound input device. DXAudioOutput Default DirectSound Voice Output Opening chosen DirectSound Output failed. Default device will be used. Lost DirectSound output device. Opening chosen DirectSound Output failed. No audio will be heard. Database Mumble failed to initialize a database in any of the possible locations. The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. DeveloperConsole Developer Console DockTitleBar Drag here GlobalShortcut Shortcuts List of configured shortcuts Function Data Shortcut Suppress Add new shortcut This will add a new global shortcut &Add Remove selected shortcut This will permanently remove a selected shortcut. &Remove <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> Open Accessibility Preferences Skip Enable Global Shortcuts <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. Additional Shortcut Engines <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. Enable Windows hooks <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. Enable GKey <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. Enable XInput <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. Enable shortcuts in privileged applications GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> Shortcuts Shortcut button combination. <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. Suppress keys from other applications <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. GlobalShortcutTarget Whisper Target Whisper to list of Users Channel Target Restrict to Group If specified, only members of this group will receive the whisper. List of users Add Remove Modifiers Do not send positional audio information when using this whisper shortcut. Ignore positional audio Shout to Linked channels Shout to subchannels Shout to Channel The whisper will also be transmitted to linked channels. The whisper will also be sent to the subchannels of the channel target. GlobalShortcutX Mouse %1 JackAudioSystem Hardware Ports Mono Stereo LCD Not connected LCDConfig Enable this device LCD Devices Name <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> Size Enabled Views Minimum Column Width <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> This setting decides the width of column splitter. Splitter Width Log Debug Critical Warning Information Server Connected Server Disconnected Other self-muted/deafened Permission Denied Text Message User Joined Server User Left Server User recording state changed User kicked (you or by you) User kicked You self-muted User muted (you) User muted (by you) User muted (other) User Joined Channel User Left Channel You self-unmuted You self-deafened You self-undeafened User renamed You Joined Channel You Joined Channel (moved) User connected and entered channel User left channel and disconnected Private text message the server [[ Invalid size ]] [[ Text object too large to display ]] [Date changed to %1] link to %1 FTP link to %1 player link channel link %1 link LogConfig Toggle console for %1 events Toggle pop-up notifications for %1 events Toggle Text-To-Speech for %1 events Click here to toggle sound notification for %1 events Toggle window highlight (if not active) for %1 events Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. Messages Message Console Notification Text-To-Speech Soundfile Path Text To Speech Volume Volume of Text-To-Speech Engine <b>This is the volume used for the speech synthesis.</b> Length threshold Message length threshold for Text-To-Speech Engine <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. Characters Whisper If checked you will only hear whispers from users you added to your friend list. Only accept whispers from friends If enabled text messages you send will be read back to you with TTS Read back own messages Chat Log Maximum chat length Unlimited Lines Highlight LookConfig System default None Only with users All Ask Do Nothing Move <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory User Interface This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. List users above subchannels (requires restart). <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. Users above Channels <b>If set, will verify you want to quit if connected.</b> Show number of users in each channel Show channel user count Language Language to use (requires restart) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. Look and Feel Layout Classic Stacked Hybrid Custom This changes the behavior when moving channels. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. Expand When to automatically expand channels Channel Dragging Ask whether to close or minimize when quitting Mumble. Ask on quit while connected Always On Top <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> Hide in tray when minimized Hide the main Mumble window in the tray when it is minimized. This setting controls when the application will be always on top. Never Always In minimal view In normal view Displays talking status in system tray Show talking status in tray icon This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. Show context menu in menu bar Apply some high contrast optimizations for visually impaired users Optimize for high contrast Application Adds user and channel context menus into the menu bar Tray Icon Channel Tree Use selected item as the chat bar target Filter automatically hides empty channels Show transmit mode dropdown in toolbar Theme Theme to use to style the user interface <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. User Dragging This changes the behavior when moving users. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. Enable Developer menu When in custom layout mode, checking this disables rearranging. Lock layout MainWindow Root Push-to-Talk Global Shortcut Push and hold this button to send voice. Global Shortcut This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut Reset Audio Processor Global Shortcut Unlink Plugin Global Shortcut Push-to-Mute Global Shortcut Join Channel Global Shortcut Toggle Overlay Global Shortcut Toggle state of in-game overlay. Global Shortcut Toggle Minimal Global Shortcut Volume Up (+10%) Global Shortcut Volume Down (-10%) Global Shortcut Mumble Mumble -- %1 &Window Minimize Ctrl+M Close Mumble is currently connected to a server. Do you want to Close or Minimize it? Mute Self Global Shortcut Set self-mute status. Global Shortcut This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut Deafen Self Global Shortcut Set self-deafen status. Global Shortcut This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut Whisper/Shout Whisper <center>Not connected</center> Not connected Clear Opening URL %1 File does not exist File is not a configuration file. Settings merged from file. URL scheme is not 'mumble' This version of Mumble can't handle URLs for Mumble version %1.%2.%3 Connecting to %1 Enter username Connecting to server %1. Reconnecting. Transmit Mode set to Continuous <p>%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> Register yourself as %1 <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <h2>Version</h2><p>Protocol %1</p> <p>No build information or OS version available</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) The connection is secured by the cipher suite that OpenSSL identifies as %1 <p>The connection provides perfect forward secrecy</p> <p>The connection does not provide perfect forward secrecy</p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> Voice channel is sent over control channel Register user %1 <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> Kicking user %1 Banning user %1 View comment on user %1 Message to channel %1 Connected. <li>Expected certificate digest (SHA-1): %1</li> Server presented a certificate which failed verification. <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> SSL Version mismatch Server connection failed. <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>Type message to user '%1' here</center> Type message to user '%1' here Choose image file Failed to load image Could not open file for reading. Image format not recognized. &User &Channel Use in conjunction with Whisper to. Global Shortcut This will switch the states of the in-game overlay. Global Shortcut Link Channel Global Shortcut Cycle Transmit Mode Global Shortcut Set Transmit Mode to Push-To-Talk Global Shortcut Set Transmit Mode to Continuous Global Shortcut Set Transmit Mode to VAD Global Shortcut Send Text Message Global Shortcut Send Clipboard Text Message Global Shortcut This will send your Clipboard content to the channel you are currently in. Global Shortcut Continuous Voice Activity Push-to-Talk Mumble - Minimal View -- %1 Cancel Save Image As... Save Image File Could not save image: %1 Change your comment Transmit Mode set to Voice Activity Transmit Mode set to Push-to-Talk <p>Connected users: %1/%2</p> UDP Statistics To Server From Server Good Late Lost Resync <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> Mumble Server Information &View Certificate Enter reason Sending message to %1 To %1: %2 Message to %1 Are you sure you want to reset the comment of user %1? Are you sure you want to reset the avatar of user %1? Are you sure you want to delete %1 and all its sub-channels? Sending message to channel %1 Message to tree %1 To %1 (Tree): %2 (Tree) %1: %2 Unmuted and undeafened. Unmuted. Muted. Muted and deafened. Deafened. Undeafened. Restart Mumble? Some settings will only apply after a restart of Mumble. Restart Mumble now? About Qt SSL Verification failed: %1 <li>Server certificate digest (SHA-1): %1</li> <b>WARNING:</b> The server presented a certificate that was different from the stored one. This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. Server connection failed: %1. Disconnected from server. Invalid username You connected with an invalid username, please try another one. Username in use That username is already in use, please try another username. Wrong certificate or password Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. Wrong password Wrong server password for unregistered user account, please try again. Images (*.png *.jpg *.jpeg) C&onfigure &Help Log This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. &Quit Mumble Closes the program Exits the application. Ctrl+Q Open the server connection dialog &Disconnect Disconnect from server Disconnects you from the server. Show information about the server connection This will show extended information about the connection to the server. &Mute &Deafen &Local Mute Send a Text Message Sends a text message to another user. Add new channel This adds a new sub-channel to the currently selected channel. Remove channel This removes a channel and all sub-channels. Edit Groups and ACL for channel This opens the Group and ACL dialog for the channel, to control permissions. &Link Link your channel to another channel This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. Chatbar Shows a dialog of registered servers, and also allows quick-connect. Kick user (with reason) Kick selected user off server. You'll be asked to specify a reason. Mute user Mute or unmute user on server. Unmuting a deafened user will also undeafen them. Kick and ban user (with reason) Kick and ban selected user from server. You'll be asked to specify a reason. Deafen user Deafen or undeafen user on server. Deafening a user will also mute them. Mute user locally Mute or unmute user locally. Use this on other users in the same room. This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. &Unlink Channel Unlink your channel from another channel This unlinks your current channel from the selected channel. Unlinks your channel from all linked channels. This unlinks your current channel (not the selected one) from all linked channels. &Reset Reset audio preprocessor This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. &Mute Self Mute yourself Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. &Deafen Self Deafen yourself Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. &Text-To-Speech Toggle Text-To-Speech Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. Display audio statistics Pops up a small dialog with information about your current audio input. Forcibly unlink plugin This forces the current plugin to unlink, which is handy if it is reading completely wrong data. Configure Mumble Allows you to change most settings for Mumble. Start the audio configuration wizard This will guide you through the process of configuring your audio hardware. &What's This? Enter What's This? mode Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. Information about Mumble Shows a small dialog with information and license for Mumble. Information about Speex Shows a small dialog with information about Speex. Information about Qt Shows a small dialog with information about Qt. Check for &Updates Check for new version of Mumble Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. Sends a text message to all users in a channel. Configure certificates for strong authentication This starts the wizard for creating, importing and exporting certificates for authentication against servers. Register user on server This will permanently register the user on the server. Add &Friend Adds a user as your friend. This will add the user as a friend, so you can recognize him on this and other servers. &Remove Friend Removes a user from your friends. This will remove a user from your friends list. &Update Friend Update name of your friend. Your friend uses a different name than what is in your database. This will update the name. Edit registered users list This opens the editor for registered users, which allow you to change their name or unregister them. Add or remove text-based access tokens &Minimal View Toggle minimal window modes This will toggle minimal mode, where the log window and menu is hidden. You muted and deafened %1. You unmuted and undeafened %1. You undeafened %1. You suppressed %1. %1 muted and deafened by %2. %1 unmuted and undeafened by %2. %1 undeafened by %2. %1 suppressed by %2. %1 moved to %2. %1 moved to %2 by %3. %1 moved in from %2 by %3. %1 is now muted and deafened. Your account information can not be verified currently. Please try again later Welcome message: %1 Mumble: %1 You were denied %1 privileges in %2. %3 was denied %1 privileges in %2. Denied: Cannot modify SuperUser. Denied: Invalid channel name. Denied: Text message too long. Denied: Operation not permitted in temporary channel. You need a certificate to perform this operation. %1 does not have a certificate. Invalid username: %1. Invalid username. Channel is full. Channel nesting limit reached. Channel count limit reached. Need to delete channels before creating new ones. Permission denied. %1 connected and entered channel. %1 connected. %1 is now muted. %1 is now unmuted. Recording started Recording stopped %1 started recording. %1 stopped recording. You revoked your priority speaker status. You assumed priority speaker status. %1 revoked your priority speaker status. %1 gave you priority speaker status. You revoked priority speaker status for %1. You gave priority speaker status to %1. %1 revoked own priority speaker status. %1 assumed priority speaker status. %1 revoked priority speaker status for %2. %1 gave priority speaker status to %2. You were unmuted and undeafened by %1. You were muted by %1. You were undeafened by %1. You were suppressed. You were suppressed by %1. You were unsuppressed. You were unsuppressed by %1. You joined %1. You moved %1 to %2. %1 is recording %1 renamed to %2 by %3. %1 disconnected. Server message from (Tree) (Channel) (Private) %2%1: %3 Failed to load Opus, it will not be available for audio encoding/decoding. The server requests minimum client version %1 The server requests positional audio be enabled. The server requests positional audio be disabled. The server requests Push-to-Talk be enabled. The server requests Push-to-Talk be disabled. You were unmuted by %1. You muted %1. You unsuppressed %1. You unmuted %1. %1 muted by %2. %1 unsuppressed by %2. %1 unmuted by %2. Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. You were muted and deafened by %1. You were deafened by %1. You were kicked from the server by %1: %2. %3 was kicked from the server by %1: %2. You were kicked and banned from the server by %1: %2. %3 was kicked and banned from the server by %1: %2. You were moved to %1 by %2. %1 entered channel. Server connection rejected: %1. Denied: %1. %1 renamed to %2. %1 left channel and disconnected. Message from %1 You have User Dragging set to "Do Nothing" so the user wasn't moved. You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. Unknown Channel Drag mode in UserModel::dropMimeData. Remote controlling Mumble: Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) -jn, --jackname Set custom Jack client name. --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status Invocation Error: No RPC command specified RPC Welcome to Mumble. Skipping version check in debug mode. Hide Frame Toggle showing frame on minimal window This will toggle whether the minimal window should have a frame for moving and resizing. &Unlink All Reset the comment of the selected user. &Join Channel View comment in editor Query server for connection information for user S&erver &Self &Unlink Plugins Register yourself on the server Change your avatar image on this server &Remove Avatar Remove currently defined avatar image. Icon Toolbar Change your own comment Recording Priority Speaker &Copy URL Copies a link to this channel to the clipboard. Ignore Messages Locally ignore user's text chat messages. Silently drops all text messages from the user. Edit ban list on server This lets you edit the server-side IP ban list. &Filter on/off Toggle the channel filter (Ctrl+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. Ctrl+F &Hide Channel when Filtering Reset the avatar of the selected user. Locally adjust the user's speech volume. Opens a dialog with a volume slider. Use this on other users in the same room. &Developer &Hide Mumble Hides the main Mumble window. Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. Show the Developer Console Shows the Mumble Developer Console, where Mumble's log output can be inspected. &Connect... &Ban list... &Information... &Kick... &Ban... Local Volume Adjustment... Send &Message... &Add... &Remove... &Edit... Audio S&tatistics... &Settings... &Audio Wizard... Developer &Console... &About... About &Speex... About &Qt... &Certificate Wizard... &Register... Registered &Users... Change &Avatar... &Access Tokens... Reset &Comment... Reset &Avatar... View Comment... &Change Comment... R&egister... Show Shows the main Mumble window. Manual Manual Mumble Positional Audio Position X Y Z m Heading Azimuth Elevation ° Meta data Context Identity Set State Linked Activated Unhinge NetworkConfig Network Updates are mandatory when using snapshot releases. Connection Use TCP compatibility mode Use TCP compatability mode <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). Reconnect when disconnected <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. Reconnect automatically Proxy Type Type of proxy to connect through Direct connection HTTP(S) proxy SOCKS5 proxy Hostname Hostname of the proxy Force TCP mode Enable QoS to prioritize packets This will enable QoS, which will attempt to prioritize voice packets over other traffic. Use Quality of Service Don't send certificate to server and don't save passwords. (Not saved). <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> Suppress certificate and password storage <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. Port Port number of the proxy <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. Username Username for proxy authentication <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Password Password for proxy authentication <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Mumble services Check for new releases of Mumble automatically. This will check for new releases of Mumble every time you start the program, and notify you if one is available. Check for application updates on startup Check for new releases of plugins automatically. This will check for new releases of plugins every time you start the program, and download them automatically. <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. Submit anonymous statistics to the Mumble project Submit anonymous statistics Reconnect to last used server when starting Mumble Reconnect to last server on startup Download plugin and overlay updates on startup Privacy Prevent OS information being sent to Mumble servers and web servers <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. Do not send OS information to Mumble servers and web servers Overlay Silent Talking Whisper Shout Channel Failed to create communication with overlay at %2: %1. No overlay will be available. OverlayClient Filter Only talking Talking and recently active All in current channel All in linked channels Always show yourself Configure recently active time (%1 seconds)... Columns Sort Alphabetically Last state change Edit... Reset Zoom Configure recently active time Amount of seconds users remain active after talking: OverlayConfig To move the users, drag the little red dot. To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. For more options, right click a user. For more options, rightclick a user. Launcher Filter Overlay Choose executable Choose application Choose path Load Overlay Presets Mumble overlay presets (*.mumblelay) Save Overlay Presets Options Enable overlay. Enable Overlay This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. Layout Blacklist Whitelist Uninstall Overlay Overlay Installation Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. Install Mumble Overlay Overlay Upgrade Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. Upgrade Mumble Overlay Display a frame counter in the overlay Show FPS counter Load an overlay preset from file Load… Save your overlay settings to file Save… Set the overlay font. Set the overlay text color. Color Remove Font FPS and Clock Display Display a clock in the overlay showing the current local time (system time). Show Clock Overlay Exceptions Overlay Exception Mode Allowed launchers Add Allowed programs Allowed paths Blacklisted programs OverlayEditor State User is not talking Passive User is talking in your channel or a linked channel Talking User is whispering to you privately Private Whisper User is shouting to your channel Channel Whisper Zoom Zoom Factor Enabled Elements User avatar, chosen by each user Avatar User's name Username Name of user's channel, if outside your current channel Channel Muted or deafened Mute state Bounding box, automatically shrunk to minimum size to contain all visible elements Bounding box Overlay Editor OverlayEditorScene Layout preset Large square avatar Avatar and Name User Opacity %1% Object Opacity Alignment Left Center Right Top Bottom Color... Font... Bounding box Pen width Padding Pen color Fill color Pick pen color Pick fill color Pick color Pick font PluginConfig Plugins Plugin has no configure function. Plugin has no about function. Options Enable plugins and transmit positional information This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. Link to Game and Transmit Position Reloads all plugins This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. &Reload plugins Information about plugin This shows a small information message about the plugin. &About Show configuration page of plugin This shows the configuration page of the plugin, if any. &Configure Name Enabled Plugins Skipping plugin update in debug mode. Downloaded new or updated plugin to %1. Failed to install new plugin to %1. %1 lost link. %1 linked. PortAudioSystem Default Device PulseAudioSystem Default Input Default Output QApplication Failed to restart mumble Mumble failed to restart itself. Please restart it manually. RichTextEditor Failed to load image Image file too large to embed in document. Please use images smaller than %1 kB. Message is too long. Display Source Text &Bold Ctrl+B &Italic Italic Ctrl+I Underline Ctrl+U Color Insert Link Ctrl+L Insert Image RichTextEditorLink Add Link URL Text ServerHandler Unable to resolve hostname Server is not responding to TCP pings UDP packets cannot be sent to or received from the server. Switching to TCP mode. UDP packets cannot be sent to the server. Switching to TCP mode. UDP packets cannot be received from the server. Switching to TCP mode. UDP packets can be sent to and received from the server. Switching back to UDP mode. Connection timed out ServerView Favorite LAN Public Internet Unknown Africa Asia North America South America Europe Oceania ShortcutActionWidget Unassigned ShortcutDelegate On Off Toggle Unassigned ShortcutKeyWidget Press Shortcut ShortcutTargetDialog Root Parent Current Subchannel #%1 ShortcutTargetWidget ... , Root Parent Current Subchannel #%1 Invalid Empty <Empty> ShortcutToggleWidget Off Toggle On TextMessage Enter text If checked the message is recursively sent to all subchannels Send recursively to subchannels Tokens Empty Token Mumble - Access Tokens List of access tokens on current server <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. Add a token &Add Remove a token &Remove UserEdit Registered Users Remove Rename Who are you looking for? Days Weeks Months Years Inactive for Registered users: %n account(s) UserInformation User Information Connection Information Version OS Certificate IP Address CELT Versions Details... Ping Statistics Pings received Average ping TCP (Control) UDP (Voice) UDP Network statistics Good Late Lost Resync From Client To Client Connection time %1w %1d %1h %1m %1s , %1 (%2) %1.%2.%3 (%4) Supported Not Supported Not Reported %1 online (%2 idle) %1 online %1 kbit/s Bandwidth GroupBox Bandwidth Label Ping deviation UserListModel Nick Inactive days Last channel Last seen: %1 Never Channel ID: %1 UserLocalVolumeDialog Local volume for other users <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. Adjusting local volume for %1 dB <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: Talking to your channel. Shouting directly to your channel. Whispering directly to your channel. Whispering directly to you. Not talking. This is a channel on the server. The icon indicates the state of the channel: Your current channel. A channel that is linked with your channel. Linked channels can talk to each other. A channel on the server that you are not linked to. This shows the flags the user has on the server, if any: On your friend list Authenticated user Muted (manually muted by self) Muted (manually muted by admin) Muted (not allowed to speak in current channel) Muted (muted by you, only on your machine) Muted (push-to-mute) Deafened (by self) Deafened (by admin) User has a new comment set (click to show) User has a comment set, which you've already seen. (click to show) Ignoring Text Messages This shows the flags the channel has, if any: Channel has a new comment set (click to show) Channel has a comment set, which you've already seen. (click to show) Channel will be hidden when filtering is enabled Name Flags Are you sure you want to drag this user? Are you sure you want to drag this channel? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. VersionCheck Upgrade Mumble A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? Failed to launch snapshot installer. Corrupt download of new version detected. Automatically removed. Downloading new snapshot from %1 to %2 Failed to write new version to disk. Failed to write new version to disc. Mumble failed to retrieve version information from the central server. ViewCert Certificate Chain Details Certificate chain Certificate details Common Name Organization Subunit Country Locality State Valid from: %1 Valid to: %1 Serial: %1 Public Key: %1 bits %2 RSA DSA Digest (SHA-1): %1 Digest (SHA-256): %1 Email: %1 DNS: %1 Issued by: Unit Name VoiceRecorder Recorder failed to create directory '%1' Recorder failed to open file '%1' .wav - Uncompressed .ogg (Vorbis) - Compressed .au - Uncompressed .flac - Lossless compressed VoiceRecorderDialog Recorder Control 00:00:00 &Start S&top Mode Multichannel Output Output format Target directory Filename &Browse... Valid variables are: Inserts the user's name Inserts the current date Inserts the current time Inserts the hostname Recorder still running Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? Unable to start recording. Not connected to a server. The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. There is already a recorder active for this server. Please select a recording format. Stopping Select target directory Downmix WASAPIInput Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone. WASAPISystem Default Device qwPTTButtonWidget Mumble PTT Push to talk mumble-1.3.4/src/mumble/widgets/0000775000175000017500000000000014010707274016360 5ustar builderbuildermumble-1.3.4/src/mumble/widgets/MUComboBox.cpp0000664000175000017500000000247614010707274021047 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "MUComboBox.h" MUComboBox::MUComboBox(QWidget *parent) : QComboBox(parent) { // Set the QComboBox to be backed by a QListView. // By default on macOS, QComboBoxes are backed by // something that tries to emulate a native macOS // menu. // // However, that QAbstractItemView behaves // inconsistently when styled. For example, it does // not seem possible to set the size of individual // items, because they're restricted to the height // of a normal macOS menu item. // Also, at least for this QComboBox (which lives // inside a QToolbar), the height of the QAbstractItemView // was also wrong when styled. This caused the combo box // to always scroll, even though it seemingly was sized // correctly. // // To get consistent behavior, we use QListView instead. QListView *lv = new QListView(); // Don't show ellipses. In this combo box, the // text does fit -- and is resized automatically to fit. // But ellipses are added anyway. // So, forcefully disable them. lv->setTextElideMode(Qt::ElideNone); this->setView(lv); } mumble-1.3.4/src/mumble/widgets/MUComboBox.h0000664000175000017500000000072414010707274020506 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_WIDGETS_MUCOMBOBOX_H_ #define MUMBLE_MUMBLE_WIDGETS_MUCOMBOBOX_H_ #include class MUComboBox : public QComboBox { Q_OBJECT public: MUComboBox(QWidget *parent = NULL); }; #endif mumble-1.3.4/src/mumble/AudioOutput.cpp0000664000175000017500000003761314010707273017711 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "AudioOutput.h" #include "AudioInput.h" #include "AudioOutputSample.h" #include "AudioOutputSpeech.h" #include "User.h" #include "Message.h" #include "Plugins.h" #include "PacketDataStream.h" #include "ServerHandler.h" #include "Timer.h" #include "VoiceRecorder.h" // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" // Remember that we cannot use static member classes that are not pointers, as the constructor // for AudioOutputRegistrar() might be called before they are initialized, as the constructor // is called from global initialization. // Hence, we allocate upon first call. QMap *AudioOutputRegistrar::qmNew; QString AudioOutputRegistrar::current = QString(); AudioOutputRegistrar::AudioOutputRegistrar(const QString &n, int p) : name(n), priority(p) { if (! qmNew) qmNew = new QMap(); qmNew->insert(name,this); } AudioOutputRegistrar::~AudioOutputRegistrar() { qmNew->remove(name); } AudioOutputPtr AudioOutputRegistrar::newFromChoice(QString choice) { if (! qmNew) return AudioOutputPtr(); if (!choice.isEmpty() && qmNew->contains(choice)) { g.s.qsAudioOutput = choice; current = choice; return AudioOutputPtr(qmNew->value(choice)->create()); } choice = g.s.qsAudioOutput; if (qmNew->contains(choice)) { current = choice; return AudioOutputPtr(qmNew->value(choice)->create()); } AudioOutputRegistrar *r = NULL; foreach(AudioOutputRegistrar *aor, *qmNew) if (!r || (aor->priority > r->priority)) r = aor; if (r) { current = r->name; return AudioOutputPtr(r->create()); } return AudioOutputPtr(); } bool AudioOutputRegistrar::canMuteOthers() const { return false; } bool AudioOutputRegistrar::usesOutputDelay() const { return true; } bool AudioOutputRegistrar::canExclusive() const { return false; } AudioOutput::AudioOutput() : fSpeakers(NULL) , fSpeakerVolume(NULL) , bSpeakerPositional(NULL) , eSampleFormat(SampleFloat) , bRunning(true) , iFrameSize(SAMPLE_RATE / 100) , iMixerFreq(0) , iChannels(0) , iSampleSize(0) , qrwlOutputs() , qmOutputs() { // Nothing } AudioOutput::~AudioOutput() { bRunning = false; wait(); wipe(); delete [] fSpeakers; delete [] fSpeakerVolume; delete [] bSpeakerPositional; } // Here's the theory. // We support sound "bloom"ing. That is, if sound comes directly from the left, if it is sufficiently // close, we'll hear it full intensity from the left side, and "bloom" intensity from the right side. float AudioOutput::calcGain(float dotproduct, float distance) { float dotfactor = (dotproduct + 1.0f) / 2.0f; float att; // No distance attenuation if (g.s.fAudioMaxDistVolume > 0.99f) { att = qMin(1.0f, dotfactor + g.s.fAudioBloom); } else if (distance < g.s.fAudioMinDistance) { float bloomfac = g.s.fAudioBloom * (1.0f - distance/g.s.fAudioMinDistance); att = qMin(1.0f, bloomfac + dotfactor); } else { float datt; if (distance >= g.s.fAudioMaxDistance) { datt = g.s.fAudioMaxDistVolume; } else { float mvol = g.s.fAudioMaxDistVolume; if (mvol < 0.01f) mvol = 0.01f; float drel = (distance-g.s.fAudioMinDistance) / (g.s.fAudioMaxDistance - g.s.fAudioMinDistance); datt = powf(10.0f, log10f(mvol) * drel); } att = datt * dotfactor; } return att; } void AudioOutput::wipe() { foreach(AudioOutputUser *aop, qmOutputs) removeBuffer(aop); } const float *AudioOutput::getSpeakerPos(unsigned int &speakers) { if ((iChannels > 0) && fSpeakers) { speakers = iChannels; return fSpeakers; } return NULL; } void AudioOutput::addFrameToBuffer(ClientUser *user, const QByteArray &qbaPacket, unsigned int iSeq, MessageHandler::UDPMessageType type) { if (iChannels == 0) return; qrwlOutputs.lockForRead(); AudioOutputSpeech *aop = qobject_cast(qmOutputs.value(user)); if (!UDPMessageTypeIsValidVoicePacket(type)) { qWarning("AudioOutput: ignored frame with invalid message type 0x%x in addFrameToBuffer().", static_cast(type)); return; } if (! aop || (aop->umtType != type)) { qrwlOutputs.unlock(); if (aop) removeBuffer(aop); while ((iMixerFreq == 0) && isAlive()) { QThread::yieldCurrentThread(); } if (! iMixerFreq) return; qrwlOutputs.lockForWrite(); aop = new AudioOutputSpeech(user, iMixerFreq, type); qmOutputs.replace(user, aop); } aop->addFrameToBuffer(qbaPacket, iSeq); qrwlOutputs.unlock(); } void AudioOutput::removeBuffer(const ClientUser *user) { removeBuffer(qmOutputs.value(user)); } void AudioOutput::removeBuffer(AudioOutputUser *aop) { QWriteLocker locker(&qrwlOutputs); QMultiHash::iterator i; for (i=qmOutputs.begin(); i != qmOutputs.end(); ++i) { if (i.value() == aop) { qmOutputs.erase(i); delete aop; break; } } } AudioOutputSample *AudioOutput::playSample(const QString &filename, bool loop) { SoundFile *handle = AudioOutputSample::loadSndfile(filename); if (handle == NULL) return NULL; Timer t; const quint64 oneSecond = 1000000; while (!t.isElapsed(oneSecond) && (iMixerFreq == 0) && isAlive()) { QThread::yieldCurrentThread(); } // If we've waited for more than one second, we declare timeout. if (t.isElapsed(oneSecond)) { qWarning("AudioOutput: playSample() timed out after 1 second: device not ready"); return NULL; } if (! iMixerFreq) return NULL; QWriteLocker locker(&qrwlOutputs); AudioOutputSample *aos = new AudioOutputSample(filename, handle, loop, iMixerFreq); qmOutputs.insert(NULL, aos); return aos; } void AudioOutput::initializeMixer(const unsigned int *chanmasks, bool forceheadphone) { delete[] fSpeakers; delete[] bSpeakerPositional; delete[] fSpeakerVolume; fSpeakers = new float[iChannels * 3]; bSpeakerPositional = new bool[iChannels]; fSpeakerVolume = new float[iChannels]; memset(fSpeakers, 0, sizeof(float) * iChannels * 3); memset(bSpeakerPositional, 0, sizeof(bool) * iChannels); for (unsigned int i=0;i 1)) { for (unsigned int i=0;i 0.0f) { fSpeakers[3*i+0] /= d; fSpeakers[3*i+1] /= d; fSpeakers[3*i+2] /= d; } } } iSampleSize = static_cast(iChannels * ((eSampleFormat == SampleFloat) ? sizeof(float) : sizeof(short))); qWarning("AudioOutput: Initialized %d channel %d hz mixer", iChannels, iMixerFreq); } bool AudioOutput::mix(void *outbuff, unsigned int nsamp) { QList qlMix; QList qlDel; if (g.s.fVolume < 0.01f) { return false; } const float adjustFactor = std::pow(10.f , -18.f / 20); const float mul = g.s.fVolume; const unsigned int nchan = iChannels; ServerHandlerPtr sh = g.sh; VoiceRecorderPtr recorder; if (sh) { recorder = g.sh->recorder; } qrwlOutputs.lockForRead(); bool prioritySpeakerActive = false; QMultiHash::const_iterator it = qmOutputs.constBegin(); while (it != qmOutputs.constEnd()) { AudioOutputUser *aop = it.value(); if (! aop->needSamples(nsamp)) { qlDel.append(aop); } else { qlMix.append(aop); const ClientUser *user = it.key(); if (user && user->bPrioritySpeaker) { prioritySpeakerActive = true; } } ++it; } if (g.prioritySpeakerActiveOverride) { prioritySpeakerActive = true; } if (! qlMix.isEmpty()) { STACKVAR(float, speaker, iChannels*3); STACKVAR(float, svol, iChannels); STACKVAR(float, fOutput, iChannels * nsamp); float *output = (eSampleFormat == SampleFloat) ? reinterpret_cast(outbuff) : fOutput; bool validListener = false; memset(output, 0, sizeof(float) * nsamp * iChannels); boost::shared_array recbuff; if (recorder) { recbuff = boost::shared_array(new float[nsamp]); memset(recbuff.get(), 0, sizeof(float) * nsamp); recorder->prepareBufferAdds(); } for (unsigned int i=0;i 1) && g.p->fetch() && (g.bPosTest || g.p->fCameraPosition[0] != 0 || g.p->fCameraPosition[1] != 0 || g.p->fCameraPosition[2] != 0)) { float front[3] = { g.p->fCameraFront[0], g.p->fCameraFront[1], g.p->fCameraFront[2] }; float top[3] = { g.p->fCameraTop[0], g.p->fCameraTop[1], g.p->fCameraTop[2] }; // Front vector is dominant; if it's zero we presume all is zero. float flen = sqrtf(front[0]*front[0]+front[1]*front[1]+front[2]*front[2]); if (flen > 0.0f) { front[0] *= (1.0f / flen); front[1] *= (1.0f / flen); front[2] *= (1.0f / flen); float tlen = sqrtf(top[0]*top[0]+top[1]*top[1]+top[2]*top[2]); if (tlen > 0.0f) { top[0] *= (1.0f / tlen); top[1] *= (1.0f / tlen); top[2] *= (1.0f / tlen); } else { top[0] = 0.0f; top[1] = 1.0f; top[2] = 0.0f; } if (std::abs(front[0] * top[0] + front[1] * top[1] + front[2] * top[2]) > 0.01f) { // Not perpendicular. Assume Y up and rotate 90 degrees. float azimuth = 0.0f; if ((front[0] != 0.0f) || (front[2] != 0.0f)) azimuth = atan2f(front[2], front[0]); float inclination = acosf(front[1]) - static_cast(M_PI) / 2.0f; top[0] = sinf(inclination)*cosf(azimuth); top[1] = cosf(inclination); top[2] = sinf(inclination)*sinf(azimuth); } } else { front[0] = 0.0f; front[1] = 0.0f; front[2] = 1.0f; top[0] = 0.0f; top[1] = 1.0f; top[2] = 0.0f; } // Calculate right vector as front X top float right[3] = {top[1]*front[2] - top[2]*front[1], top[2]*front[0] - top[0]*front[2], top[0]*front[1] - top[1] * front[0] }; /* qWarning("Front: %f %f %f", front[0], front[1], front[2]); qWarning("Top: %f %f %f", top[0], top[1], top[2]); qWarning("Right: %f %f %f", right[0], right[1], right[2]); */ // Rotate speakers to match orientation for (unsigned int i=0;ipfBuffer; float volumeAdjustment = 1; AudioOutputSpeech *speech = qobject_cast(aop); if (speech) { const ClientUser *user = speech->p; volumeAdjustment *= user->fLocalVolume; if (prioritySpeakerActive) { if (user->tsState != Settings::Whispering && !user->bPrioritySpeaker) { volumeAdjustment *= adjustFactor; } } } if (recorder) { AudioOutputSpeech *aos = qobject_cast(aop); if (aos) { for (unsigned int i = 0; i < nsamp; ++i) { recbuff[i] += pfBuffer[i] * volumeAdjustment; } if (!recorder->isInMixDownMode()) { recorder->addBuffer(aos->p, recbuff, nsamp); recbuff = boost::shared_array(new float[nsamp]); memset(recbuff.get(), 0, sizeof(float) * nsamp); } // Don't add the local audio to the real output if (qobject_cast(aos->p)) { continue; } } } if (validListener && ((aop->fPos[0] != 0.0f) || (aop->fPos[1] != 0.0f) || (aop->fPos[2] != 0.0f))) { float dir[3] = { aop->fPos[0] - g.p->fCameraPosition[0], aop->fPos[1] - g.p->fCameraPosition[1], aop->fPos[2] - g.p->fCameraPosition[2] }; float len = sqrtf(dir[0] * dir[0] + dir[1] * dir[1] + dir[2] * dir[2]); if (len > 0.0f) { dir[0] /= len; dir[1] /= len; dir[2] /= len; } /* qWarning("Voice pos: %f %f %f", aop->fPos[0], aop->fPos[1], aop->fPos[2]); qWarning("Voice dir: %f %f %f", dir[0], dir[1], dir[2]); */ if (! aop->pfVolume) { aop->pfVolume = new float[nchan]; for (unsigned int s=0;spfVolume[s] = -1.0; } for (unsigned int s=0;spfVolume[s] >= 0.0f) ? aop->pfVolume[s] : str; const float inc = (str - old) / static_cast(nsamp); aop->pfVolume[s] = str; /* qWarning("%d: Pos %f %f %f : Dot %f Len %f Str %f", s, speaker[s*3+0], speaker[s*3+1], speaker[s*3+2], dot, len, str); */ if ((old >= 0.00000001f) || (str >= 0.00000001f)) for (unsigned int i=0;i(i)); } } else { for (unsigned int s=0;sisInMixDownMode()) { recorder->addBuffer(NULL, recbuff, nsamp); } // Clip if (eSampleFormat == SampleFloat) for (unsigned int i=0;i(outbuff)[i] = static_cast(qBound(-32768.f, (output[i] * 32768.f), 32767.f)); } qrwlOutputs.unlock(); foreach(AudioOutputUser *aop, qlDel) removeBuffer(aop); return (! qlMix.isEmpty()); } bool AudioOutput::isAlive() const { return isRunning(); } unsigned int AudioOutput::getMixerFreq() const { return iMixerFreq; } mumble-1.3.4/src/mumble/OverlayEditor.h0000664000175000017500000000243414010707273017655 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_OVERLAYEDITOR_H_ #define MUMBLE_MUMBLE_OVERLAYEDITOR_H_ #include "OverlayEditorScene.h" #include "ui_OverlayEditor.h" struct OverlaySettings; class OverlayEditor : public QDialog, public Ui::OverlayEditor { private: Q_OBJECT Q_DISABLE_COPY(OverlayEditor) protected: QGraphicsItem *qgiPromote; OverlayEditorScene oes; OverlaySettings *os; void enterEvent(QEvent *e) Q_DECL_OVERRIDE; void leaveEvent(QEvent *e) Q_DECL_OVERRIDE; public: OverlayEditor(QWidget *p = NULL, QGraphicsItem *qgi = NULL, OverlaySettings *osptr = NULL); ~OverlayEditor() Q_DECL_OVERRIDE; signals: void applySettings(); public slots: void reset(); void apply(); void accept() Q_DECL_OVERRIDE; void on_qrbPassive_clicked(); void on_qrbTalking_clicked(); void on_qrbWhisper_clicked(); void on_qrbShout_clicked(); void on_qcbAvatar_clicked(); void on_qcbUser_clicked(); void on_qcbChannel_clicked(); void on_qcbMutedDeafened_clicked(); void on_qcbBox_clicked(); void on_qsZoom_valueChanged(int); }; #endif mumble-1.3.4/src/mumble/mumble_bg.ts0000664000175000017500000120621114010707274017216 0ustar builderbuilder ACLEditor Deny Забрани Allow Позволи Allow %1 Позволи %1 Deny %1 Забрани %1 Mumble - Add channel Мъмбъл - Добавяне на канал Default server value Първоначални стойности на сървъра Failed: Invalid channel Неуспех: Невалиден канал Mumble - Edit %1 Мъмбъл - Редактирай %1 ID: %1 ID: %1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Това дава привилегия на %1. Ако привилегия е едновременно позволена и забранена, то тя е забранена. <br />%2 Channel must have a name Каналът трябва да има име This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Това отхвърля привилегията на %1. Ако привилегия е едновременно позволена и забранена, то тя е забранена. <br />%2 Dialog Диалог Name Име Enter the channel name here. Въведете името на канала тук. Description Описание Password Парола Enter the channel password here. Въведете паролата на канала тук. Check to create a temporary channel. Отметнете за създаване на временен канал. Temporary Временен <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Пози;ия</b><br/> Тази стойност позволява да промените начина, по който Мъмбъл подрежда каналите в списъка. Канал с по-висока стойност <i>Позиция</i> ще бъде винаги поставен под канал с по-ниска стойност и обратно. Ако стойността <i>Позиция</i> на два канала е еднаква, те ще бъдат подредени по азбучен ред. Position Позиция &Groups &Групи Group Групи List of groups Списък с групи Remove selected group Премахване на избраната група Remove Премахване Inherit group members from parent Наследяване на членовете на групата от родителя Inherit Наследяване Make group inheritable to sub-channels Правене на групата наследима за подканали Inheritable Наследима Group was inherited from parent channel Групата беше наследена от родителски канал Inherited Наследена Members Членове Add Добавяне Add member to group Добавяне на член в групата Remove member from group Премахване на член от групата &ACL Active ACLs List of entries Inherit ACL of parent? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. Inherit ACLs Move entry up Преместване на записа нагоре This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. &Up Move entry down Преместване на записа надолу This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. &Down Add new entry Добавяне на нов запис This adds a new entry, initially set with no permissions and applying to all. &Add &Добавяне Remove entry Премахване на записа This removes the currently selected entry. Премахва текущо избрания запис. &Remove &Премахване Context Контекст Entry should apply to this channel. Entry should apply to this channel This makes the entry apply to this channel. Applies to this channel Entry should apply to sub-channels. Add new group Добавяне на нова група <b>Add</b><br/> Add a new group. Inherited members Наследени членове Contains the list of members added to the group by this channel. Съдържа списък с хора добавени към групата от този канал. Contains a list of members whose group membership will not be inherited from the parent channel. Contains the list of members inherited by other channels. Type in the name of a user you wish to add to the group and click Add. Type in the name of a user you wish to remove from the group and click Add. Exclude Excluded members This makes the entry apply to sub-channels of this channel. Applies to sub-channels Permissions Позволения User/Group Group this entry applies to User ID Номер на потребител User this entry applies to This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. &Properties &Свойства <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. ID of the channel. Номер на канала. Maximum Users Максимален брой потребители Maximum number of users allowed in the channel Максимален брой потребители в канала <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. This is the sort order for the channel. Това е редът на подреждане в този канал. ALSAAudioInput Default ALSA Card Opening chosen ALSA Input failed: %1 ALSAAudioOutput Default ALSA Card Opening chosen ALSA Output failed: %1 ASIOConfig %1 (version %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz ASIO Initialization failed: %1 Failed to instantiate ASIO driver ASIO Device selection Избор на устройство Device Устройство Device to use for microphone This chooses what device to query. You still need to actually query the device and select which channels to use. Query selected device This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Query Configure selected device This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Configure &Настройване Capabilities Възможности Driver name Buffer size This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. Configure input channels Channels Канали Microphone Микрофон <- <- -> -> Unused Неизползвано Speakers Колонки ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. Opening selected ASIO device failed. No input will be done. AboutDialog About Mumble За Мъмбъл <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble &За Мъмбъл &License &Разрешително A&uthors &Third-Party Licenses OK Добре AudioInput Interface Интерфейс System Система Input method for audio Входен метод за звук <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Устройство Input device for audio Входно устройство за звук <b>This is the input device to use for audio.</b> Transmission Предаване &Transmit &Предаване When to transmit your speech <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. DoublePush Time If you press the PTT key twice in this time it will get locked. <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. Reset audio cue to default <b>Reset</b><br/>Reset the paths for the files to their default. Browse for on audio file Browse for off audio file Off Изключено On Включено Preview the audio cues Use SNR based speech detection Signal to Noise <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. Amplitude Амплитудата Voice &Hold How long to keep transmitting after silence Silence Below <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. Speech Above Signal values above this count as voice Compression Компресия &Quality &Качество Quality of compression (peak bandwidth) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. Audio per packet How many audio frames to send per packet <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). Audio Processing Noise Suppression Noise suppression <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. Maximum amplification of input sound <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. Current speech detection chance Cancel echo from speakers Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. Disabled Забранено <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal values below this count as silence Maximum bandwidth used for sending audio Use Amplitude based speech detection <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). Exclusive mode <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive R&eset &Нулиране &Browse... &Разглеждане... B&rowse... &Разглеждане... &Preview &Преглед <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. Displays an always on top window with a push to talk button in it Display push to talk window Misc Разни Audible audio cue when starting or stopping to transmit <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. Audio cue Gets played when starting to transmit Gets played when stopping to transmit Hold Time Time the microphone stays open after the PTT key is released Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) Max. Amplification Idle action minutes do nothing deafen mute after Echo Cancellation Mixed echo cancellation Multichannel echo cancellation The idle action will be reversed upon any key or mouse button input Undo Idle action upon activity Apply RNNoise's noise suppression filter. <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. RNNoise Audio input AudioInputDialog Continuous Постоянно Voice Activity Гласова активност Push To Talk Натискане за говорене Audio Input Звуков вход %1 ms %1 мс Off Изключено %1 s %1 с %1 kb/s %1 кб/с -%1 dB -%1 дБ %1 kbit/s (Audio %2, Position %4, Overhead %3) AudioOutput Interface Интерфейс System Система Output method for audio Изходен метод за звук <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Устройство Output device for audio Изходно устройство за звук <b>This is the output device to use for audio.</b> Positional Audio Audio Output Звуков изход Default &Jitter Buffer Safety margin for jitter buffer <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. Minimum distance to user before sound volume decreases This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. Volume Гръмкост Volume of incoming speech Гръмкост на входящата реч <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. Output Delay Amount of data to buffer The connected "speakers" are actually headphones The connected "speakers" are actually headphones. Factor for sound volume decrease Bloom Factor for sound volume increase How much should sound volume increase for sources that are really close? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Headphones Слушалки Minimum Distance Минимално разстояние Maximum Distance Максимално разстояние Maximum distance, beyond which speech volume won't decrease Максимално разстояние, отвъд което силата на речта няма да намалява Minimum Volume Минимална гръмкост What should the volume be at the maximum distance? Loopback Test Delay Variance Variance in packet latency <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. Packet Loss Загуба на пакети Packet loss for loopback mode <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% &Loopback Desired loopback mode Attenuate applications by... Attenuation of other applications during speech <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. If checked Mumble lowers the volume of other applications while other users talk <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. while other users talk If checked Mumble lowers the volume of other applications while you talk <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. while you talk Exclusive mode, not recommended. <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive Priority Speaker If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. Attenuate other users while talking as Priority Speaker. Advanced Attenuation Options If checked, Mumble will only attenuate applications that are using the same output source as Mumble <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. Only attenuate applications using the same output device If checked, PulseAudio loopback modules will be attenuated <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. Attenuate PulseAudio loopback modules Audio output AudioOutputDialog None Local Server Сървър Audio Output Звуков изход %1 ms %1 мс %1 % %1 % %1 m %1 м AudioOutputSample Choose sound file Изберете звуков файл Invalid sound file Недействителен звуков файл The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. AudioStats >1000 ms >1000ms >1000 мс Audio Statistics Статистики за звука Input Levels Peak microphone level Peak power in last frame This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. Peak speaker level This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. Peak clean level This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. Signal Analysis Microphone power How close the current input level is to ideal This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. Signal-To-Noise ratio Signal-To-Noise ratio from the microphone This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. Speech Probability Probability of speech This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). Configuration feedback Current audio bitrate Текуща скорост на предаване на звука Bitrate of last frame DoublePush interval Time between last two Push-To-Talk presses Speech Detection Current speech detection chance <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal and noise power spectrum Power spectrum of input signal and noise estimate This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. Echo Analysis Разбор на ехото Weights of the echo canceller This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. AudioWizard Audio Tuning Wizard Помощник за настройка на звука Introduction Въведение Welcome to the Mumble Audio Wizard Добре дошли в звуковия помощник на Мъмбъл Finished Завършено Enjoy using Mumble Насладете се на използването на Мъмбъл Device selection Избор на устройство Selecting the input and output device to use with Mumble. This is the device your microphone is connected to. System Система Input method for audio Входен метод за звук <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Устройство Input device to use Входно устройство за използване <b>Selects which sound card to use for audio input.</b> Cancel echo from headset or speakers Use echo cancellation This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. This is the device your speakers or headphones are connected to. Output method for audio Изходен метод за звук <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. Output device to use Изходно устройство за използване <b>Selects which sound card to use for audio Output.</b> Enable positional audio Allows positioning of sound Allows positioning of sound. <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> Input Device Входно устройство Output Device Изходно устройство This allows Mumble to use positional audio to place voices. <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> Amount of data to buffer This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> Positional Audio Adjusting attenuation of positional audio. <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> Use headphones instead of speakers <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> Use headphones Използване на слушалки This ignores the OS speaker configuration and configures the positioning for headphones instead. Volume tuning Tuning microphone hardware volume to optimal settings. Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. Voice Activity Detection Letting Mumble figure out when you're talking and when you're silent. This will help Mumble figure out when you are talking. The first step is selecting which data value to use. Raw amplitude from input Signal-To-Noise ratio Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Device tuning Changing hardware output delays to their minimum value. Submit anonymous statistics to the Mumble project Push To Talk: Quality & Notifications Качество и известия Adjust quality and notification settings. Quality settings Настройки на качеството Low Balanced Notification settings Настройки на известията Use Text-To-Speech to read notifications and messages to you. Disable Text-To-Speech and use sounds instead. %1 ms %1 мс Enables attenuation of other applications while users talk to you Attenuate applications while other users talk High Custom You already set a customized quality configuration in Mumble. Select this setting to keep it. Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. Apply some high contrast optimizations for visually impaired users Use high contrast graphics Keep custom Text-To-Speech settings. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) BanEditor Mumble - Edit Bans Редактиране на забраните &Address &Адрес &Mask &Маска Reason Причина Start Начало End Край User Потребител Hash &Add &Добавяне &Update &Обновяване &Remove &Премахване Ban List Списък със забрани Search field This is the search field. Use it to find bans that have this username set in the username field. Who are you looking for? Кого търсите? No nickname IP address Адрес по ИП No IP address Reason for the ban Причина за забраната No reason Без причина Ban end date Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). Certificate hash No certificate hash Banned users Потребители със забрана This is a list with banned users. Това е списъка с потребители, които имат забрана. Use this button if you want to add a new ban. Използвайте това копче, ако искате да добавите нова забрана. Use this button if you want to update ban information. Използвайте това копче, ако искате да обновите данните на забрана. Use this button if you want to remove user from the ban list. Използвайте това копче, ако искате да премахнете потребители от списъка. Clear all fields Изчистване на всички полета This button clears all fields. Use it if you want to add a new ban. Това копче изчиства всички полета. Използвайте го, ако искате да добавите нова забрана. Clear Изчистване Ban List - %n Ban(s) CertView Name Име Email Електронна поща Issuer Издал Expiry Date Дата на изтичане (none) Self-signed CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. There was an error generating your certificate.<br />Please try again. Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. The file could not be opened for writing. Please use another file. The file's permissions could not be set. No certificate and key has been written. Please use another file. The file could not be written successfully. Please use another file. The file could not be opened for reading. Please use another file. The file is empty or could not be read. Please use another file. The file did not contain a valid certificate and key. Please use another file. Select file to export certificate to Select file to import certificate from Unable to import. Missing password or incompatible file type. <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. Certificates Certificate Management Управление на удостоверения Certificate Authentication Проверка на удостоверения Authenticating to servers without using passwords Удостоверяване към сървъри без да се използва парола Current certificate Текущо удостоверение This is the certificate Mumble currently uses. Това е текущо използваното от Мъмбъл удостоверение. Current Certificate Текущо удостоверение Create a new certificate Създаване на ново удостоверение This will create a new certificate. Това ще създаде ново удостоверение. Import certificate from file Внасяне на удостоверение от файл This will import a certificate from file. Това ще внесе удостоверение от файл. Import a certificate Внасяне на удостоверение Export Certificate Изнасяне на удостоверение This will export a certificate to file. Това ще изнесе удостоверение във файл. Export current certificate Изнасяне на текущото удостоверение Import Certificate Внасяне на удостоверение PKCS #12 Certificate import <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> Import from Внасяне от Filename to import from Име на файл за внасяне This is the filename you wish to import a certificate from. Select file to import from Изберете файл за внасяне This opens a file selection dialog to choose a file to import a certificate from. Open... Отваряне... Password Парола Password for PKCS#12 file This is the password for the PKCS#12 file containing your certificate. Certificate to import Удостоверение за внасяне This is the certificate you are importing. Това е удостоверението, което внасяте. Certificate Details Подробности за удостоверението Replace Certificate Заменяне на удостоверение Replace existing certificate with new certificate? Заменяне на съществуващото удостоверение с ново? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> This is the certificate Mumble currently uses. It will be replaced. Това е текущо използваното удостоверение. То ще бъде заменено. New certificate Ново удостоверение This is the new certificate that will replace the old one. Това е новото удостоверение, което ще замени старото. New Certificate Ново удостоверение Make a backup of your certificate Направете резервно копие на удостоверението ви Export to Изнасяне към Filename to export to This is the filename you wish to export a certificate to. Save As... Запазване като... This is the certificate Mumble currently uses. It will be exported. Generate a new certificate for strong authentication <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> Name Име Email Електронна поща Your email address (e.g. johndoe@mumble.info) Вашата електронна поща (например ivan@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. Your name (e.g. John Doe) Вашето име (например Иван Иванов) This is your name, and will be filled out in the certificate. This field is entirely optional. Finish Завършване Certificate-based authentication is ready for use Enjoy using Mumble with strong authentication. Automatic certificate creation Автоматично създаване на удостоверение <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> ChanACL None Traverse Enter Speak Mute/Deafen Make channel Make temporary Link channel This represents no privileges. This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. This represents the permission to write text messages to other users in this channel. This represents the permission to forcibly remove users from the server. This represents the permission to permanently remove users from the server. This represents the permission to register and unregister users on the server. This represents the permission to register oneself on the server. Whisper Шепнене Move Преместване Text message Текстово съобщение Kick Изритване Ban Поставяне на забрана Register User Регистриране на потребител Register Self Регистриране на себе си Write ACL ChatbarTextEdit Paste and &Send Paste and send <center>Type chat message here</center> ClientUser Friend Authenticated Priority speaker Recording Записване Muted (server) Deafened (server) Local Ignore (Text messages) Local Mute Muted (self) Deafened (self) ConfigDialog Accept changes Приемане на промените This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. Reject changes Отхвърляне на промените This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. Apply changes Прилагане на промените This button will immediately apply all changes. Undo changes for current page This button will revert any changes done on the current page to the most recent applied settings. Restore defaults for current page This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. Mumble Configuration ConnectDialog Connecting to %1 Свързване към %1 Enter username Въведете потребителско име Adding host %1 Servername Hostname Bonjour name Port Порт Addresses Адреси Website Сайт Packet loss Загуба на пакети Ping (80%) Латентност (80%) %1 ms %1 мс Ping (95%) Латентност (95%) Bandwidth Трафик %1 kbit/s %1 кбит/с &Connect &Свързване &Filters &Филтри Unknown Users Потребители Version Версия Failed to fetch server list Mumble Server Connect Ping Латентност Remove from Favorites Премахване от любими Add custom server Show all servers that respond to ping Show all servers with users Show all servers Показване на всички сървъри &Copy &Копиране Copy favorite link to clipboard &Paste &Поставяне Paste favorite from clipboard &Edit... &Редактиране... &Add New... &Добавяне на нов... Add to &Favorites Добавяне в &любими Open &Webpage Show &Reachable Show &Populated Show &All ConnectDialogEdit Edit Server Редактиране на сървър Name of the server Име на сървъра A&ddress &Адрес Internet address of the server. Internet address of the server. Адрес на сървъра в интернет <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. &Port &Порт Port on which the server is listening Порт за слушане на сървъра <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. &Username &Потребителско име Username to send to the server Потребителско име, което да се изпрати на сървъра <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. Label Надпис Add Server Добавяне на сървър You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 Password Парола Password to send to the server Парола, която да се изпрати на сървъра <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. Show password Показване на паролата <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. Local server label 127.0.0.1 127.0.0.1 64738 64738 Your username Вашето потребителско име Your password Вашата парола &Fill CoreAudioSystem Default Device Устройство по подразбиране CrashReporter Mumble Crash Report Доклад за срутване <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> Email address (optional) Електронна поща (по избор) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash Моля, опишете кратко на английски какво правихте по време на срива Send Report Изпращане на доклад Don't send report Без изпращане на доклад Crash upload successful Качването на данните за срива е успешно Thank you for helping make Mumble better! Благодарим ви, че помагате за подобряването на програмата! Crash upload failed Качването на данните за срива е неуспешно We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 Uploading crash report Качване на доклада Abort upload Прекратяване на качването DXAudioInput Default DirectSound Voice Input Opening chosen DirectSound Input device failed. No microphone capture will be done. Opening chosen DirectSound Input failed. Default device will be used. Lost DirectSound input device. DXAudioOutput Default DirectSound Voice Output Opening chosen DirectSound Output failed. Default device will be used. Lost DirectSound output device. Opening chosen DirectSound Output failed. No audio will be heard. Database Mumble failed to initialize a database in any of the possible locations. The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. DeveloperConsole Developer Console DockTitleBar Drag here GlobalShortcut Shortcuts Преки пътища List of configured shortcuts Списък с преки пътища Function Функция Data Данни Shortcut Пряк път Suppress Add new shortcut Добавяне на нов пряк път This will add a new global shortcut &Add &Добавяне Remove selected shortcut Премахване на избрания пряк път This will permanently remove a selected shortcut. &Remove &Премахване <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> Open Accessibility Preferences Skip Пропускане Enable Global Shortcuts <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. Additional Shortcut Engines <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. Enable Windows hooks <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. Enable GKey <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. Enable XInput <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. Enable shortcuts in privileged applications GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> Shortcuts Преки пътища Shortcut button combination. <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. Suppress keys from other applications <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. GlobalShortcutTarget Whisper Target Whisper to list of Users Channel Target Restrict to Group If specified, only members of this group will receive the whisper. List of users Списък с потребители Add Добавяне Remove Премахване Modifiers Do not send positional audio information when using this whisper shortcut. Ignore positional audio Shout to Linked channels Shout to subchannels Shout to Channel The whisper will also be transmitted to linked channels. The whisper will also be sent to the subchannels of the channel target. GlobalShortcutX Mouse %1 JackAudioSystem Hardware Ports Mono Stereo LCD Not connected LCDConfig Enable this device LCD Devices Устройства Name Име <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> Size Размер Enabled Включено Views Minimum Column Width <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> This setting decides the width of column splitter. Splitter Width Log Debug Отстраняване на грешки Critical Критично Warning Внимание Information Сведения Server Connected Сървърът се свърза Server Disconnected Прекъсната връзка със сървър Other self-muted/deafened Permission Denied Text Message User Joined Server Потребител влезе User Left Server Потребител излезе User recording state changed User kicked (you or by you) Потребителят е изритан (вие или от вас) User kicked Потребителят е изритан You self-muted User muted (you) User muted (by you) User muted (other) User Joined Channel User Left Channel You self-unmuted You self-deafened You self-undeafened User renamed You Joined Channel You Joined Channel (moved) User connected and entered channel User left channel and disconnected Private text message the server [[ Invalid size ]] [[ Text object too large to display ]] [Date changed to %1] link to %1 FTP link to %1 player link channel link %1 link LogConfig Toggle console for %1 events Toggle pop-up notifications for %1 events Toggle Text-To-Speech for %1 events Click here to toggle sound notification for %1 events Toggle window highlight (if not active) for %1 events Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. Messages Съобщения Message Съобщение Console Конзола Notification Известие Text-To-Speech Текст към реч Soundfile Path Път Text To Speech Текст към реч Volume Гръмкост Volume of Text-To-Speech Engine Гръмкост на функцията "текст към реч" <b>This is the volume used for the speech synthesis.</b> Length threshold Message length threshold for Text-To-Speech Engine <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. Characters Whisper Шепнене If checked you will only hear whispers from users you added to your friend list. Only accept whispers from friends If enabled text messages you send will be read back to you with TTS Read back own messages Chat Log Maximum chat length Unlimited Lines Highlight LookConfig System default None Only with users All Ask Do Nothing Move Преместване <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory User Interface Потребителски интерфейс This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. List users above subchannels (requires restart). <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. Users above Channels <b>If set, will verify you want to quit if connected.</b> Show number of users in each channel Show channel user count Language Език Language to use (requires restart) Език за използване (изисква рестартиране) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. Look and Feel Външен вид Layout Оформление Classic Класическо Stacked Натрупано Hybrid Кръстоска Custom По избор This changes the behavior when moving channels. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. Expand When to automatically expand channels Channel Dragging Ask whether to close or minimize when quitting Mumble. Ask on quit while connected Always On Top <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> Hide in tray when minimized Hide the main Mumble window in the tray when it is minimized. This setting controls when the application will be always on top. Never Никога Always Винаги In minimal view В минимален изглед In normal view В нормален изглед Displays talking status in system tray Show talking status in tray icon This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. Show context menu in menu bar Apply some high contrast optimizations for visually impaired users Optimize for high contrast Application Adds user and channel context menus into the menu bar Tray Icon Channel Tree Use selected item as the chat bar target Filter automatically hides empty channels Show transmit mode dropdown in toolbar Theme Тема Theme to use to style the user interface Тема, която да оформи потребителския интерфейс <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. User Dragging This changes the behavior when moving users. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. Enable Developer menu When in custom layout mode, checking this disables rearranging. Lock layout MainWindow Root Push-to-Talk Global Shortcut Push and hold this button to send voice. Global Shortcut This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut Reset Audio Processor Global Shortcut Unlink Plugin Global Shortcut Push-to-Mute Global Shortcut Join Channel Global Shortcut Toggle Overlay Global Shortcut Toggle state of in-game overlay. Global Shortcut Toggle Minimal Global Shortcut Volume Up (+10%) Global Shortcut Увеличаване на гръмкостта (+10%) Volume Down (-10%) Global Shortcut Намаляване на гръмкостта (-10%) Mumble Мъмбъл Mumble -- %1 Мъмбъл -- %1 &Window Minimize Смаляване Ctrl+M Close Затваряне Mumble is currently connected to a server. Do you want to Close or Minimize it? Mute Self Global Shortcut Set self-mute status. Global Shortcut This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut Deafen Self Global Shortcut Set self-deafen status. Global Shortcut This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut Whisper/Shout Whisper <center>Not connected</center> Not connected Clear Изчистване Opening URL %1 File does not exist File is not a configuration file. Settings merged from file. URL scheme is not 'mumble' This version of Mumble can't handle URLs for Mumble version %1.%2.%3 Connecting to %1 Свързване с %1. Enter username Въведете потребителско име Connecting to server %1. Свързване със сървър %1. Reconnecting. Повторно свързване. Transmit Mode set to Continuous <p>%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> Register yourself as %1 <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <h2>Version</h2><p>Protocol %1</p> <p>No build information or OS version available</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) The connection is secured by the cipher suite that OpenSSL identifies as %1 <p>The connection provides perfect forward secrecy</p> <p>The connection does not provide perfect forward secrecy</p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> Voice channel is sent over control channel Register user %1 <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> Kicking user %1 Изритване на потребител %1 Banning user %1 View comment on user %1 Message to channel %1 Connected. <li>Expected certificate digest (SHA-1): %1</li> Server presented a certificate which failed verification. <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> SSL Version mismatch Server connection failed. <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>Type message to user '%1' here</center> Type message to user '%1' here Choose image file Failed to load image Could not open file for reading. Image format not recognized. &User &Потребител &Channel &Канал Use in conjunction with Whisper to. Global Shortcut This will switch the states of the in-game overlay. Global Shortcut Link Channel Global Shortcut Cycle Transmit Mode Global Shortcut Set Transmit Mode to Push-To-Talk Global Shortcut Set Transmit Mode to Continuous Global Shortcut Set Transmit Mode to VAD Global Shortcut Send Text Message Global Shortcut Изпращане на текстово съобщение Send Clipboard Text Message Global Shortcut This will send your Clipboard content to the channel you are currently in. Global Shortcut Continuous Постоянно Voice Activity Гласова активност Push-to-Talk Mumble - Minimal View -- %1 Мъмбъл - Минимален изглед -- %1 Cancel Отказ Save Image As... Запазване на изображението като... Save Image File Запазване на изображение Could not save image: %1 Change your comment Transmit Mode set to Voice Activity Transmit Mode set to Push-to-Talk <p>Connected users: %1/%2</p> UDP Statistics To Server From Server Good Late Lost Resync <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> Mumble Server Information Сведения за сървъра &View Certificate &Преглед на удостоверението Enter reason Sending message to %1 To %1: %2 Message to %1 Are you sure you want to reset the comment of user %1? Are you sure you want to reset the avatar of user %1? Are you sure you want to delete %1 and all its sub-channels? Sending message to channel %1 Message to tree %1 To %1 (Tree): %2 (Tree) %1: %2 Unmuted and undeafened. Unmuted. Muted. Muted and deafened. Deafened. Undeafened. Restart Mumble? Рестартиране на Мъмбъл? Some settings will only apply after a restart of Mumble. Restart Mumble now? Някои настройки се прилагат само след рестарт на Мъмбъл. Рестартиране на Мъмбъл сега? About Qt SSL Verification failed: %1 <li>Server certificate digest (SHA-1): %1</li> <b>WARNING:</b> The server presented a certificate that was different from the stored one. This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. Server connection failed: %1. Disconnected from server. Връзката със сървъра беше прекъсната. Invalid username Недействително потребителско име You connected with an invalid username, please try another one. Username in use Потребителското име се използва That username is already in use, please try another username. Wrong certificate or password Грешно удостоверение или парола Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. Wrong password Грешна парола Wrong server password for unregistered user account, please try again. Images (*.png *.jpg *.jpeg) Изображения (*.png *.jpg *.jpeg) C&onfigure &Help &Помощ Log Журнал This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. &Quit Mumble &Изход от Мъмбъл Closes the program Затваря програмата Exits the application. Затваря приложението. Ctrl+Q Open the server connection dialog &Disconnect &Прекъсване на връзката Disconnect from server Прекъсване на връзка със сървъра Disconnects you from the server. Прекъсва връзката със сървъра. Show information about the server connection This will show extended information about the connection to the server. &Mute &Deafen &Local Mute Send a Text Message Изпращане на текстово съобщение Sends a text message to another user. Изпраща текстово съобщение до друг потребител. Add new channel Добавяне на нов канал This adds a new sub-channel to the currently selected channel. Добавя подканал към избрания канал. Remove channel Премахване на канал This removes a channel and all sub-channels. Премахва канала и всички подканали. Edit Groups and ACL for channel This opens the Group and ACL dialog for the channel, to control permissions. &Link &Връзка Link your channel to another channel This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. Chatbar Shows a dialog of registered servers, and also allows quick-connect. Kick user (with reason) Изритай потребител (с основание) Kick selected user off server. You'll be asked to specify a reason. Изритване на потребител от сървъра. Ще бъдете помолени да посочите причина. Mute user Mute or unmute user on server. Unmuting a deafened user will also undeafen them. Kick and ban user (with reason) Изритай и банни потребител (с основание) Kick and ban selected user from server. You'll be asked to specify a reason. Изритване и бан на потребител от сървъра. Ще бъдете помолени да посочите причина. Deafen user Deafen or undeafen user on server. Deafening a user will also mute them. Mute user locally Mute or unmute user locally. Use this on other users in the same room. This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. &Unlink Channel &Премахване на връзката Unlink your channel from another channel This unlinks your current channel from the selected channel. Unlinks your channel from all linked channels. This unlinks your current channel (not the selected one) from all linked channels. &Reset &Нулиране Reset audio preprocessor This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. &Mute Self Mute yourself Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. &Deafen Self Deafen yourself Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. &Text-To-Speech &Текст към реч Toggle Text-To-Speech Превключване на функцията "текст към реч" Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. Display audio statistics Pops up a small dialog with information about your current audio input. Forcibly unlink plugin This forces the current plugin to unlink, which is handy if it is reading completely wrong data. Configure Mumble Настройване на програмата Allows you to change most settings for Mumble. Start the audio configuration wizard This will guide you through the process of configuring your audio hardware. &What's This? &Какво е това? Enter What's This? mode Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. Information about Mumble Сведения за Мъмбъл Shows a small dialog with information and license for Mumble. Information about Speex Информация за Speex Shows a small dialog with information about Speex. Information about Qt Shows a small dialog with information about Qt. Check for &Updates Check for new version of Mumble Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. Sends a text message to all users in a channel. Configure certificates for strong authentication This starts the wizard for creating, importing and exporting certificates for authentication against servers. Register user on server This will permanently register the user on the server. Add &Friend &Добавяне на приятел Adds a user as your friend. This will add the user as a friend, so you can recognize him on this and other servers. &Remove Friend &Премахване на приятел Removes a user from your friends. This will remove a user from your friends list. &Update Friend Update name of your friend. Your friend uses a different name than what is in your database. This will update the name. Edit registered users list This opens the editor for registered users, which allow you to change their name or unregister them. Add or remove text-based access tokens &Minimal View &Минимален изглед Toggle minimal window modes This will toggle minimal mode, where the log window and menu is hidden. You muted and deafened %1. You unmuted and undeafened %1. You undeafened %1. You suppressed %1. %1 muted and deafened by %2. %1 unmuted and undeafened by %2. %1 undeafened by %2. %1 suppressed by %2. %1 moved to %2. %1 moved to %2 by %3. %1 moved in from %2 by %3. %1 is now muted and deafened. Your account information can not be verified currently. Please try again later Welcome message: %1 Mumble: %1 Мъмбъл: %1 You were denied %1 privileges in %2. %3 was denied %1 privileges in %2. Denied: Cannot modify SuperUser. Denied: Invalid channel name. Denied: Text message too long. Denied: Operation not permitted in temporary channel. You need a certificate to perform this operation. %1 does not have a certificate. Invalid username: %1. Invalid username. Недействително потребителско име. Channel is full. Каналът е пълен Channel nesting limit reached. Channel count limit reached. Need to delete channels before creating new ones. Permission denied. %1 connected and entered channel. %1 connected. %1 is now muted. %1 is now unmuted. Recording started Recording stopped %1 started recording. %1 stopped recording. You revoked your priority speaker status. You assumed priority speaker status. %1 revoked your priority speaker status. %1 gave you priority speaker status. You revoked priority speaker status for %1. You gave priority speaker status to %1. %1 revoked own priority speaker status. %1 assumed priority speaker status. %1 revoked priority speaker status for %2. %1 gave priority speaker status to %2. You were unmuted and undeafened by %1. You were muted by %1. You were undeafened by %1. You were suppressed. You were suppressed by %1. You were unsuppressed. You were unsuppressed by %1. You joined %1. You moved %1 to %2. %1 is recording %1 renamed to %2 by %3. %1 disconnected. %1 прекъсна връзката. Server message from (Tree) (Channel) (Private) %2%1: %3 Failed to load Opus, it will not be available for audio encoding/decoding. The server requests minimum client version %1 The server requests positional audio be enabled. The server requests positional audio be disabled. The server requests Push-to-Talk be enabled. The server requests Push-to-Talk be disabled. You were unmuted by %1. You muted %1. You unsuppressed %1. You unmuted %1. %1 muted by %2. %1 unsuppressed by %2. %1 unmuted by %2. Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. You were muted and deafened by %1. You were deafened by %1. You were kicked from the server by %1: %2. Бяхте изритан от сървъра от %1: %2. %3 was kicked from the server by %1: %2. %3 е изритан от сървъра от %1: %2. You were kicked and banned from the server by %1: %2. Бяхте изритан и баннат от сървъра от %1: %2. %3 was kicked and banned from the server by %1: %2. %3 е изритан и баннат от сървъра от %1: %2. You were moved to %1 by %2. %1 entered channel. Server connection rejected: %1. Denied: %1. %1 renamed to %2. %1 left channel and disconnected. %1 напусна канала и прекъсна връзката. Message from %1 You have User Dragging set to "Do Nothing" so the user wasn't moved. You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. Unknown Channel Drag mode in UserModel::dropMimeData. Remote controlling Mumble: Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) -jn, --jackname Set custom Jack client name. --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status Invocation Error: No RPC command specified RPC Welcome to Mumble. Добре дошли в Мъмбъл. Skipping version check in debug mode. Hide Frame Toggle showing frame on minimal window This will toggle whether the minimal window should have a frame for moving and resizing. &Unlink All Reset the comment of the selected user. &Join Channel View comment in editor Query server for connection information for user S&erver &Self &Unlink Plugins Register yourself on the server Change your avatar image on this server &Remove Avatar Remove currently defined avatar image. Icon Toolbar Change your own comment Recording Priority Speaker &Copy URL Copies a link to this channel to the clipboard. Ignore Messages Locally ignore user's text chat messages. Silently drops all text messages from the user. Edit ban list on server This lets you edit the server-side IP ban list. &Filter on/off Toggle the channel filter (Ctrl+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. Ctrl+F &Hide Channel when Filtering Reset the avatar of the selected user. Locally adjust the user's speech volume. Opens a dialog with a volume slider. Use this on other users in the same room. &Developer &Hide Mumble Hides the main Mumble window. Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. Show the Developer Console Shows the Mumble Developer Console, where Mumble's log output can be inspected. &Connect... &Свързване... &Ban list... &Information... &Kick... &Изритване... &Ban... Local Volume Adjustment... Send &Message... &Add... &Remove... &Edit... &Редактиране... Audio S&tatistics... &Settings... &Настройки... &Audio Wizard... Developer &Console... &About... About &Speex... About &Qt... &Certificate Wizard... &Register... Registered &Users... Change &Avatar... &Access Tokens... Reset &Comment... Reset &Avatar... View Comment... &Change Comment... R&egister... Show Shows the main Mumble window. Manual Manual Mumble Positional Audio Position X Y Z m Heading Azimuth Elevation ° ° Meta data Мета данни Context Контекст Identity Set State Linked Activated Unhinge NetworkConfig Network Мрежа Updates are mandatory when using snapshot releases. Connection Връзка Use TCP compatibility mode Use TCP compatability mode <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). Reconnect when disconnected Потворно свързване при прекъсване <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. <b>Повторно свързване при прекъсване</b>.<br />Mumble автоматично опитва да се свърже след 10 секунди, ако връзката със сървъра е неуспешна. Reconnect automatically Автоматично повторно свързване Proxy Посредник Type Тип Type of proxy to connect through Direct connection Пряка връзка HTTP(S) proxy SOCKS5 proxy Hostname Hostname of the proxy Force TCP mode Enable QoS to prioritize packets This will enable QoS, which will attempt to prioritize voice packets over other traffic. Use Quality of Service Don't send certificate to server and don't save passwords. (Not saved). <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> Suppress certificate and password storage <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. Port Порт Port number of the proxy Номер на порта на посредника <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. Username Потребителско име Username for proxy authentication Потребителско име за удостоверяване с посредника <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Password Парола Password for proxy authentication Парола за удостоверяване с посредника <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Mumble services Check for new releases of Mumble automatically. Автоматична проверка за нови издания на Мъмбъл. This will check for new releases of Mumble every time you start the program, and notify you if one is available. Check for application updates on startup Проверка за обновления при пускане на програмата Check for new releases of plugins automatically. Автоматична проверка за нови издания на приставки. This will check for new releases of plugins every time you start the program, and download them automatically. <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. Submit anonymous statistics to the Mumble project Submit anonymous statistics Подаване на анонимни статистики Reconnect to last used server when starting Mumble Reconnect to last server on startup Свързване към последния сървър при пускане на програмата Download plugin and overlay updates on startup Сваляне на обновления за слоя и приставките при пускане на програмата Privacy Поверителност Prevent OS information being sent to Mumble servers and web servers <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. Do not send OS information to Mumble servers and web servers Overlay Silent Talking Говор Whisper Шепнене Shout Вик Channel Канал Failed to create communication with overlay at %2: %1. No overlay will be available. OverlayClient Filter Only talking Talking and recently active All in current channel All in linked channels Always show yourself Configure recently active time (%1 seconds)... Columns Колони Sort Подреждане Alphabetically Азбучно Last state change Edit... Редактиране... Reset Zoom Configure recently active time Amount of seconds users remain active after talking: OverlayConfig To move the users, drag the little red dot. To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. For more options, right click a user. For more options, rightclick a user. Launcher Filter Overlay Слой Choose executable Choose application Choose path Load Overlay Presets Mumble overlay presets (*.mumblelay) Save Overlay Presets Options Настройки Enable overlay. Enable Overlay This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. Layout Оформление Blacklist Черен списък Whitelist Бял списък Uninstall Overlay Overlay Installation Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. Install Mumble Overlay Overlay Upgrade Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. Upgrade Mumble Overlay Display a frame counter in the overlay Show FPS counter Показване на брояч на кадрите в секунда Load an overlay preset from file Load… Зареждане... Save your overlay settings to file Save… Запазване... Set the overlay font. Set the overlay text color. Color Цвят Remove Премахване Font Шрифт FPS and Clock Display Display a clock in the overlay showing the current local time (system time). Show Clock Показване на часовник Overlay Exceptions Изключения за слой Overlay Exception Mode Allowed launchers Add Allowed programs Allowed paths Blacklisted programs OverlayEditor State User is not talking Passive User is talking in your channel or a linked channel Talking User is whispering to you privately Private Whisper User is shouting to your channel Channel Whisper Zoom Мащабиране Zoom Factor Коефициент на мащабиране Enabled Elements User avatar, chosen by each user Avatar Снимка User's name Име на потребител Username Потребителско име Name of user's channel, if outside your current channel Channel Канал Muted or deafened Mute state Bounding box, automatically shrunk to minimum size to contain all visible elements Bounding box Overlay Editor Редактор на слой OverlayEditorScene Layout preset Large square avatar Avatar and Name User Opacity %1% Object Opacity Alignment Подравняване Left Отляво Center В центъра Right Отдясно Top Отгоре Bottom Отдолу Color... Цвят... Font... Шрифт... Bounding box Pen width Padding Pen color Fill color Pick pen color Pick fill color Pick color Pick font PluginConfig Plugins Приставки Plugin has no configure function. Plugin has no about function. Options Настройки Enable plugins and transmit positional information This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. Link to Game and Transmit Position Reloads all plugins Презареждане на всички приставки This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. &Reload plugins &Презареждане на приставките Information about plugin Сведения за приставката This shows a small information message about the plugin. &About &Относно Show configuration page of plugin This shows the configuration page of the plugin, if any. &Configure Name Име Enabled Включено Plugins Skipping plugin update in debug mode. Downloaded new or updated plugin to %1. Failed to install new plugin to %1. %1 lost link. %1 linked. PortAudioSystem Default Device PulseAudioSystem Default Input Default Output QApplication Failed to restart mumble Mumble failed to restart itself. Please restart it manually. RichTextEditor Failed to load image Image file too large to embed in document. Please use images smaller than %1 kB. Message is too long. Display Source Text &Bold &Удебеляване Ctrl+B &Italic &Накланяне Italic Накланяне Ctrl+I Underline Подчертаване Ctrl+U Color Цвят Insert Link Вмъкване на връзка Ctrl+L Insert Image Вмъкване на изображение RichTextEditorLink Add Link Добавяне на връзка URL Адрес Text Текст ServerHandler Unable to resolve hostname Server is not responding to TCP pings UDP packets cannot be sent to or received from the server. Switching to TCP mode. UDP packets cannot be sent to the server. Switching to TCP mode. UDP packets cannot be received from the server. Switching to TCP mode. UDP packets can be sent to and received from the server. Switching back to UDP mode. Connection timed out ServerView Favorite LAN Местна мрежа Public Internet Публичен интернет Unknown Africa Африка Asia Азия North America Северна Америка South America Южна Америка Europe Европа Oceania Океания ShortcutActionWidget Unassigned Необозначено ShortcutDelegate On Включено Off Изключено Toggle Превключване Unassigned Необозначено ShortcutKeyWidget Press Shortcut ShortcutTargetDialog Root Parent Current Subchannel #%1 ShortcutTargetWidget ... , Root Parent Current Subchannel #%1 Invalid Empty <Empty> ShortcutToggleWidget Off Изключено Toggle Превключване On Включено TextMessage Enter text If checked the message is recursively sent to all subchannels Send recursively to subchannels Tokens Empty Token Mumble - Access Tokens List of access tokens on current server <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. Add a token &Add &Добавяне Remove a token &Remove &Премахване UserEdit Registered Users Remove Премахване Rename Преименуване Who are you looking for? Days Дни Weeks Седмици Months Месеци Years Години Inactive for Registered users: %n account(s) UserInformation User Information Сведения за потребителя Connection Information Сведения за връзката Version Версия OS Операционна система Certificate Удостоверение IP Address Адрес по ИП CELT Versions Details... Подробности... Ping Statistics Статистика за латентността Pings received Average ping Средна латентност TCP (Control) UDP (Voice) UDP Network statistics Good Late Lost Resync From Client To Client Connection time %1w %1d %1h %1m %1s , %1 (%2) %1.%2.%3 (%4) Supported Not Supported Not Reported %1 online (%2 idle) %1 online %1 kbit/s %1 кбит/с Bandwidth GroupBox Bandwidth Label Ping deviation UserListModel Nick Прякор Inactive days Last channel Last seen: %1 Never Channel ID: %1 UserLocalVolumeDialog Local volume for other users <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. Adjusting local volume for %1 dB <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: Talking to your channel. Shouting directly to your channel. Whispering directly to your channel. Whispering directly to you. Not talking. This is a channel on the server. The icon indicates the state of the channel: Your current channel. A channel that is linked with your channel. Linked channels can talk to each other. A channel on the server that you are not linked to. This shows the flags the user has on the server, if any: On your friend list Authenticated user Muted (manually muted by self) Muted (manually muted by admin) Muted (not allowed to speak in current channel) Muted (muted by you, only on your machine) Muted (push-to-mute) Deafened (by self) Deafened (by admin) User has a new comment set (click to show) User has a comment set, which you've already seen. (click to show) Ignoring Text Messages This shows the flags the channel has, if any: Channel has a new comment set (click to show) Channel has a comment set, which you've already seen. (click to show) Channel will be hidden when filtering is enabled Name Име Flags Are you sure you want to drag this user? Are you sure you want to drag this channel? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. VersionCheck Upgrade Mumble A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? Failed to launch snapshot installer. Corrupt download of new version detected. Automatically removed. Downloading new snapshot from %1 to %2 Failed to write new version to disk. Failed to write new version to disc. Mumble failed to retrieve version information from the central server. ViewCert Certificate Chain Details Certificate chain Certificate details Common Name Organization Subunit Country Locality State Valid from: %1 Valid to: %1 Serial: %1 Public Key: %1 bits %2 RSA DSA Digest (SHA-1): %1 Digest (SHA-256): %1 Email: %1 Електронна поща: %1 DNS: %1 Issued by: Unit Name VoiceRecorder Recorder failed to create directory '%1' Recorder failed to open file '%1' .wav - Uncompressed .ogg (Vorbis) - Compressed .au - Uncompressed .flac - Lossless compressed VoiceRecorderDialog Recorder Control 00:00:00 &Start S&top Mode Multichannel Output Output format Target directory Filename &Browse... Valid variables are: Inserts the user's name Inserts the current date Inserts the current time Inserts the hostname Recorder still running Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? Unable to start recording. Not connected to a server. The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. There is already a recorder active for this server. Please select a recording format. Stopping Select target directory Downmix WASAPIInput Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone. WASAPISystem Default Device qwPTTButtonWidget Mumble PTT Push to talk mumble-1.3.4/src/mumble/os_early_win.cpp0000664000175000017500000001137614010707274020120 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include #include #include #include #include // Alert shows a fatal error dialog and waits for the user to click OK. static void Alert(LPCWSTR title, LPCWSTR msg) { MessageBox(NULL, msg, title, MB_OK|MB_ICONERROR); } // GetExecutablePath returns the path to mumble.exe. static const std::wstring GetExecutablePath() { wchar_t path[MAX_PATH]; if (GetModuleFileNameW(NULL, path, MAX_PATH) == 0) return std::wstring(); std::wstring exe_path(path); return exe_path; } // UIAccessDisabledViaConfig queries the configuration store, and returns // whether UIAccess has been disabled by the user via the // "shortcut/windows/uiaccess/enable" config option. static bool UIAccessDisabledViaConfig() { // RegQueryValueEx only zero-terminates if the registry value's type is // one of the Windows registry's string types. Because of this, we have // to use a buffer of 7 elements in order to query for the string "false". // // If the value's type is string, we'll end up with "false\0\0", because we // always zero-pad. // // But that's better than ending up in an infinite loop because we failed // to zero-terminate. wchar_t buf[7]; memset(&buf, 0, sizeof(buf)); DWORD sz = sizeof(buf) - 1*sizeof(wchar_t); HKEY key = NULL; bool success = (RegOpenKeyExW(HKEY_CURRENT_USER, L"Software\\Mumble\\Mumble\\shortcut\\windows\\uiaccess", 0, KEY_READ, &key) == ERROR_SUCCESS) && (RegQueryValueExW(key, L"enable" , NULL, NULL, (LPBYTE)&buf, &sz) == ERROR_SUCCESS); if (success && _wcsicmp(buf, L"false") == 0) { return true; } return false; } // ProcessHasUIAccess returns true if the current process has UIAccess enabled. static bool ProcessHasUIAccess() { HANDLE token = NULL; if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token)) { return false; } DWORD ui_access = 0; DWORD ui_access_size = sizeof(ui_access); if (!GetTokenInformation(token, TokenUIAccess, &ui_access, sizeof(ui_access), &ui_access_size)) { CloseHandle(token); return false; } CloseHandle(token); return ui_access != 0; } // RelaunchWithoutUIAccessIfNecessary relaunches the process // without UIAccess, if necessary. // // If a relaunch of Mumble is necessary, the new process is // spawned and the existing process is terminated. In that // situation, this function will not return to the caller. static bool RelaunchWithoutUIAccessIfNecessary() { if (!ProcessHasUIAccess()) { return true; } if (!UIAccessDisabledViaConfig()) { return true; } STARTUPINFO startup_info; memset(&startup_info, 0, sizeof(startup_info)); GetStartupInfo(&startup_info); PROCESS_INFORMATION process_info; memset(&process_info, 0, sizeof(process_info)); // Store the original value of __COMPAT_LAYER so we can // restore it (which may be equivalent to not setting it all) // once we've been relaunched. const wchar_t *compat_layer_env = _wgetenv(L"__COMPAT_LAYER"); if (compat_layer_env == NULL) { compat_layer_env = L"mumble_exe_none"; } _wputenv_s(L"mumble_exe_prev_compat_layer", compat_layer_env); // The only way we have found thus far to ignore the executable's // manifest when calling CreateProcess, is to use the __COMPAT_LAYER // environment variable. // // Setting this to RunAsInvoker seemingly ignores the application's // manifest. RunAsInvoker is the default execution level for Windows // programs. _wputenv_s(L"__COMPAT_LAYER", L"RunAsInvoker"); std::wstring exe_path = GetExecutablePath(); if (exe_path.empty()) { return false; } if (!CreateProcessW(exe_path.c_str(), GetCommandLineW(), NULL, NULL, FALSE, 0, NULL, NULL, &startup_info, &process_info)) { return false; } exit(0); } // CleanupEnvironmentVariables cleans up any // unnecessary environment variables. // // For now, this function cleans up any environment // variables set by RelaunchWithoutUIAccessIfNecessary. static void CleanupEnvironmentVariables() { wchar_t *prev_compat_layer_env = _wgetenv(L"mumble_exe_prev_compat_layer"); if (prev_compat_layer_env != NULL) { if (wcscmp(prev_compat_layer_env, L"mumble_exe_none") == 0) { _wputenv_s(L"__COMPAT_LAYER", L""); } else { _wputenv_s(L"__COMPAT_LAYER", prev_compat_layer_env); } } } int os_early_init() { CleanupEnvironmentVariables(); if (!RelaunchWithoutUIAccessIfNecessary()) { Alert(L"Mumble Early Init Error 50", L"Unable to complete RelaunchWithoutUIAccessIfNecessary"); return 50; } return 0; } mumble-1.3.4/src/mumble/Tokens.h0000664000175000017500000000120614010707273016324 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_TOKENS_H_ #define MUMBLE_MUMBLE_TOKENS_H_ #include "ui_Tokens.h" class Tokens : public QDialog, public Ui::Tokens { private: Q_OBJECT Q_DISABLE_COPY(Tokens) protected: QByteArray qbaDigest; public: Tokens(QWidget *p = NULL); public slots: void accept() Q_DECL_OVERRIDE; public slots: void on_qpbAdd_clicked(); void on_qpbRemove_clicked(); }; #endif mumble-1.3.4/src/mumble/ConnectDialogEdit.ui0000664000175000017500000002131714010707273020573 0ustar builderbuilder ConnectDialogEdit 0 0 430 272 0 0 430 0 Edit Server 0 0 4 0 Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop true 1 0 0 0 0 0 0 0 &Fill 0 0 &Ignore A&ddress qleServer Internet address of the server. <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. 127.0.0.1 &Port qlePort Port on which the server is listening <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. 64738 &Username qleUsername Password qlePassword Username to send to the server <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. Your username QDialogButtonBox::Cancel|QDialogButtonBox::Ok Password to send to the server <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. Your password Show password Label qleName Name of the server <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. Local server label qleServer qlePort qleUsername qlePassword qleName qcbShowPassword qdbbButtonBox qdbbButtonBox accepted() ConnectDialogEdit accept() 175 231 50 198 qdbbButtonBox rejected() ConnectDialogEdit reject() 254 231 224 268 mumble-1.3.4/src/mumble/PTTButtonWidget.cpp0000664000175000017500000000156014010707273020426 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "PTTButtonWidget.h" #include "Global.h" PTTButtonWidget::PTTButtonWidget(QWidget *p) : QWidget(p) { setupUi(this); setWindowFlags(Qt::Tool | Qt::WindowStaysOnTopHint); if (!g.s.qbaPTTButtonWindowGeometry.isEmpty()) { restoreGeometry(g.s.qbaPTTButtonWindowGeometry); } } void PTTButtonWidget::closeEvent(QCloseEvent *e) { g.s.qbaPTTButtonWindowGeometry = saveGeometry(); QWidget::closeEvent(e); } void PTTButtonWidget::on_qpbPushToTalk_pressed() { emit triggered(true, QVariant()); } void PTTButtonWidget::on_qpbPushToTalk_released() { emit triggered(false, QVariant()); } mumble-1.3.4/src/mumble/mumble.appcompat.manifest0000664000175000017500000000123114010707274021703 0ustar builderbuilder mumble-1.3.4/src/mumble/DeveloperConsole.h0000664000175000017500000000153014010707273020331 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_DEVELOPERCONSOLE_H_ #define MUMBLE_MUMBLE_DEVELOPERCONSOLE_H_ #include #include # include #if QT_VERSION >= 0x050000 # include #else # include #endif class DeveloperConsole : public QObject { private: Q_OBJECT Q_DISABLE_COPY(DeveloperConsole); protected: QPointer m_window; QStringList m_logEntries; public slots: void addLogMessage(const QString &); public: DeveloperConsole(QObject *parent = NULL); ~DeveloperConsole(); void show(); }; #endif mumble-1.3.4/src/mumble/ACLEditor.h0000664000175000017500000000563014010707273016634 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_ACLEDITOR_H_ #define MUMBLE_MUMBLE_ACLEDITOR_H_ #include "ACL.h" #include "Group.h" #include "Mumble.pb.h" #include "ui_ACLEditor.h" class ACLGroup : public Group { private: Q_DISABLE_COPY(ACLGroup) public: bool bInherited; ACLGroup(const QString &name); }; class ACLEditor : public QDialog, public Ui::ACLEditor { private: Q_OBJECT Q_DISABLE_COPY(ACLEditor) protected: typedef QPair idname; MumbleProto::ACL msg; enum WaitID { GroupAdd, GroupRemove, GroupInherit, ACLList }; QHash qhNameCache; QHash qhIDCache; QHash qhNameWait; int iUnknown; void refill(WaitID what); ACLGroup *currentGroup(); ChanACL *currentACL(); int iId; bool bInheritACL; QList qlACLs; QList qlGroups; ChanACL *pcaPassword; int numInheritACL; int iChannel; bool bAddChannelMode; const QString userName(int id); int id(const QString &uname); QList qlACLAllow; QList qlACLDeny; QList qlPerms; void updatePasswordACL(void); void updatePasswordField(void); void showEvent(QShowEvent *) Q_DECL_OVERRIDE; void fillWidgetFromSet(QListWidget *, const QSet &); public: ACLEditor(int parentchannelid, QWidget *p = NULL); ACLEditor(int channelid, const MumbleProto::ACL &mea, QWidget *p = NULL); ~ACLEditor(); void returnQuery(const MumbleProto::QueryUsers &mqu); public slots: void accept() Q_DECL_OVERRIDE; public slots: void refillACL(); void refillGroupNames(); void refillGroupAdd(); void refillGroupRemove(); void refillGroupInherit(); void refillComboBoxes(); void groupEnableCheck(); void ACLEnableCheck(); void on_qtwTab_currentChanged(int index); void on_qlwACLs_currentRowChanged(); void on_qpbACLAdd_clicked(); void on_qpbACLRemove_clicked(); void on_qpbACLUp_clicked(); void on_qpbACLDown_clicked(); void on_qcbACLInherit_clicked(bool checked); void on_qcbACLApplyHere_clicked(bool checked); void on_qcbACLApplySubs_clicked(bool checked); void on_qcbACLGroup_activated(const QString &text); void on_qcbACLUser_activated(); void ACLPermissions_clicked(); void on_qcbGroupList_activated(const QString &text); void on_qcbGroupList_editTextChanged(const QString & text); void on_qpbGroupAdd_clicked(); void on_qpbGroupRemove_clicked(); void on_qcbGroupInherit_clicked(bool checked); void on_qcbGroupInheritable_clicked(bool checked); void on_qpbGroupAddAdd_clicked(); void on_qpbGroupAddRemove_clicked(); void on_qpbGroupRemoveAdd_clicked(); void on_qpbGroupRemoveRemove_clicked(); void on_qpbGroupInheritRemove_clicked(); }; #endif mumble-1.3.4/src/mumble/SharedMemory.cpp0000664000175000017500000000132114010707273020011 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "SharedMemory.h" unsigned int SharedMemory2::uiIndex = 0; QString SharedMemory2::name() const { return a_ucData ? qsName : QString(); } unsigned int SharedMemory2::size() const { return a_ucData ? uiSize : 0; } unsigned char *SharedMemory2::data() { return a_ucData; } const unsigned char *SharedMemory2::data() const { return a_ucData; } void SharedMemory2::erase() { if (a_ucData) { memset(a_ucData, 0, uiSize); } } mumble-1.3.4/src/mumble/SocketRPC.h0000664000175000017500000000250114010707273016655 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_SOCKETRPC_H_ #define MUMBLE_MUMBLE_SOCKETRPC_H_ #include #include #include #include #include class QBuffer; class QLocalServer; class SocketRPCClient : public QObject { private: Q_OBJECT Q_DISABLE_COPY(SocketRPCClient) protected: QLocalSocket *qlsSocket; QXmlStreamReader qxsrReader; QXmlStreamWriter qxswWriter; QBuffer *qbBuffer; QByteArray qbaOutput; void processXml(); public: SocketRPCClient(QLocalSocket *s, QObject *p = NULL); public slots: void disconnected(); void error(QLocalSocket::LocalSocketError); void readyRead(); }; class SocketRPC : public QObject { private: Q_OBJECT Q_DISABLE_COPY(SocketRPC) protected: QLocalServer *qlsServer; public: typedef QMap ParameterMap; SocketRPC(const QString &basename, QObject *p = NULL); static bool send(const QString &basename, const QString &request, const ParameterMap ¶m = ParameterMap()); public slots: void newConnection(); }; #endif mumble-1.3.4/src/mumble/Plugins.h0000664000175000017500000000420614010707273016505 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_PLUGINS_H_ #define MUMBLE_MUMBLE_PLUGINS_H_ #include #include #include #include #ifdef Q_OS_WIN #include #endif #include "ConfigDialog.h" #include "ui_Plugins.h" struct PluginInfo; class PluginConfig : public ConfigWidget, public Ui::PluginConfig { private: Q_OBJECT Q_DISABLE_COPY(PluginConfig) protected: void refillPluginList(); PluginInfo *pluginForItem(QTreeWidgetItem *) const; public: PluginConfig(Settings &st); virtual QString title() const Q_DECL_OVERRIDE; virtual QIcon icon() const Q_DECL_OVERRIDE; public slots: void save() const Q_DECL_OVERRIDE; void load(const Settings &r) Q_DECL_OVERRIDE; void on_qpbConfig_clicked(); void on_qpbAbout_clicked(); void on_qpbReload_clicked(); void on_qtwPlugins_currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *); }; struct PluginFetchMeta; class Plugins : public QObject { friend class PluginConfig; private: Q_OBJECT Q_DISABLE_COPY(Plugins) protected: QReadWriteLock qrwlPlugins; QMutex qmPluginStrings; QList qlPlugins; PluginInfo *locked; PluginInfo *prevlocked; void clearPlugins(); int iPluginTry; QMap qmPluginFetchMeta; QString qsSystemPlugins; QString qsUserPlugins; #ifdef Q_OS_WIN HANDLE hToken; TOKEN_PRIVILEGES tpPrevious; DWORD cbPrevious; #endif public: std::string ssContext, ssContextSent; std::wstring swsIdentity, swsIdentitySent; bool bValid; bool bUnlink; float fPosition[3], fFront[3], fTop[3]; float fCameraPosition[3], fCameraFront[3], fCameraTop[3]; Plugins(QObject *p = NULL); ~Plugins() Q_DECL_OVERRIDE; public slots: void on_Timer_timeout(); void rescanPlugins(); bool fetch(); void checkUpdates(); void fetchedUpdatePAPlugins(QByteArray, QUrl); void fetchedPAPluginDL(QByteArray, QUrl); }; #endif mumble-1.3.4/src/mumble/UserEdit.h0000664000175000017500000000464014010707273016612 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_USEREDIT_H_ #define MUMBLE_MUMBLE_USEREDIT_H_ #include "Message.h" #include "User.h" #include "ui_UserEdit.h" #include class UserListModel; class UserListFilterProxyModel; namespace MumbleProto { class UserList; class UserList_User; } /// /// Dialog used for server-side registered user list editing. /// class UserEdit : public QDialog, public Ui::UserEdit { Q_OBJECT Q_DISABLE_COPY(UserEdit) public: /// Constructs a dialog for editing the given userList. UserEdit(const MumbleProto::UserList &userList, QWidget *p = NULL); public slots: void accept() Q_DECL_OVERRIDE; void on_qlSearch_textChanged(QString); void on_qpbRemove_clicked(); void on_qpbRename_clicked(); void on_qtvUserList_customContextMenuRequested(const QPoint&); void onSelectionChanged(const QItemSelection& /*selected*/, const QItemSelection& /*deselected*/); void onCurrentRowChanged(const QModelIndex & current, const QModelIndex &/*previous*/); void on_qsbInactive_valueChanged(int); void on_qcbInactive_currentIndexChanged(int); private: enum TimespanUnits { TU_DAYS, TU_WEEKS, TU_MONTHS, TU_YEARS, COUNT_TU }; /// Polls the inactive-filter controls for their current value and updates the model filter. void updateInactiveDaysFilter(); UserListModel *m_model; UserListFilterProxyModel *m_filter; }; /// /// Provides filtering and sorting capabilities for UserListModel instances to UserEdit. /// @see UserEdit /// @see UserListModel /// class UserListFilterProxyModel : public QSortFilterProxyModel { Q_OBJECT public: explicit UserListFilterProxyModel(QObject *parent = NULL); bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const Q_DECL_OVERRIDE; public slots: /// Sets the amount of inactive days below which rows will get filterd by the proxy void setFilterMinimumInactiveDays(int minimumInactiveDays); /// Helper function for removing all rows involved in a given selection (must include COL_NICK). void removeRowsInSelection(const QItemSelection& selection); private: /// Every row with less inactive days will be filtered. int m_minimumInactiveDays; }; #endif // MUMBLE_MUMBLE_USEREDIT_H_ mumble-1.3.4/src/mumble/ASIOInput.cpp0000664000175000017500000004133214010707273017173 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "ASIOInput.h" #include "MainWindow.h" #include "Global.h" // From os_win.cpp. extern HWND mumble_mw_hwnd; class ASIOAudioInputRegistrar : public AudioInputRegistrar { public: ASIOAudioInputRegistrar(); virtual AudioInput *create(); virtual const QList getDeviceChoices(); virtual void setDeviceChoice(const QVariant &, Settings &); virtual bool canEcho(const QString &) const; }; ASIOAudioInputRegistrar::ASIOAudioInputRegistrar() : AudioInputRegistrar(QLatin1String("ASIO")) { } AudioInput *ASIOAudioInputRegistrar::create() { return new ASIOInput(); } const QList ASIOAudioInputRegistrar::getDeviceChoices() { QList qlReturn; return qlReturn; } bool ASIOAudioInputRegistrar::canEcho(const QString &) const { return true; } void ASIOAudioInputRegistrar::setDeviceChoice(const QVariant &, Settings &) { } static ConfigWidget *ASIOConfigDialogNew(Settings &st) { return new ASIOConfig(st); } class ASIOInit : public DeferInit { ASIOAudioInputRegistrar *airASIO; ConfigRegistrar *crASIO; public: ASIOInit() : airASIO(NULL), crASIO(NULL) {} void initialize(); void destroy(); }; void ASIOInit::initialize() { HKEY hkDevs; HKEY hk; FILETIME ft; airASIO = NULL; crASIO = NULL; bool bFound = false; if (!g.s.bASIOEnable) { qWarning("ASIOInput: ASIO forcefully disabled via 'asio/enable' config option."); return; } // List of devices known to misbehave or be totally useless QStringList blacklist; blacklist << QLatin1String("{a91eaba1-cf4c-11d3-b96a-00a0c9c7b61a}"); // ASIO DirectX blacklist << QLatin1String("{e3186861-3a74-11d1-aef8-0080ad153287}"); // ASIO Multimedia #ifdef QT_NO_DEBUG blacklist << QLatin1String("{232685c6-6548-49d8-846d-4141a3ef7560}"); // ASIO4ALL #endif if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Software\\ASIO", 0, KEY_READ, &hkDevs) == ERROR_SUCCESS) { DWORD idx = 0; DWORD keynamelen = 255; WCHAR keyname[255]; while (RegEnumKeyEx(hkDevs, idx++, keyname, &keynamelen, NULL, NULL, NULL, &ft) == ERROR_SUCCESS) { QString name=QString::fromUtf16(reinterpret_cast(keyname),keynamelen); if (RegOpenKeyEx(hkDevs, keyname, 0, KEY_READ, &hk) == ERROR_SUCCESS) { DWORD dtype = REG_SZ; WCHAR wclsid[255]; DWORD datasize = 255; CLSID clsid; if (RegQueryValueEx(hk, L"CLSID", 0, &dtype, reinterpret_cast(wclsid), &datasize) == ERROR_SUCCESS) { if (datasize > 76) datasize = 76; QString qsCls = QString::fromUtf16(reinterpret_cast(wclsid), datasize / 2).toLower().trimmed(); if (! blacklist.contains(qsCls.toLower()) && ! FAILED(CLSIDFromString(wclsid, &clsid))) { bFound = true; } } RegCloseKey(hk); } keynamelen = 255; } RegCloseKey(hkDevs); } if (bFound) { airASIO = new ASIOAudioInputRegistrar(); crASIO = new ConfigRegistrar(2002, ASIOConfigDialogNew); } else { qWarning("ASIO: No valid devices found, disabling"); } } void ASIOInit::destroy() { delete airASIO; delete crASIO; } static class ASIOInit asioinit; ASIOInput *ASIOInput::aiSelf; ASIOConfig::ASIOConfig(Settings &st) : ConfigWidget(st) { setupUi(this); // List of devices known to misbehave or be totally useless QStringList blacklist; blacklist << QLatin1String("{a91eaba1-cf4c-11d3-b96a-00a0c9c7b61a}"); // ASIO DirectX blacklist << QLatin1String("{e3186861-3a74-11d1-aef8-0080ad153287}"); // ASIO Multimedia #ifdef QT_NO_DEBUG blacklist << QLatin1String("{232685c6-6548-49d8-846d-4141a3ef7560}"); // ASIO4ALL #endif HKEY hkDevs; if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Software\\ASIO", 0, KEY_READ, &hkDevs) == ERROR_SUCCESS) { const DWORD keynamebufsize = 255; WCHAR keyname[keynamebufsize]; FILETIME ft; DWORD idx = 0; DWORD keynamelen = keynamebufsize; while (RegEnumKeyEx(hkDevs, idx++, keyname, &keynamelen, NULL, NULL, NULL, &ft) == ERROR_SUCCESS) { QString name=QString::fromUtf16(reinterpret_cast(keyname), keynamelen); HKEY hk; if (RegOpenKeyEx(hkDevs, keyname, 0, KEY_READ, &hk) == ERROR_SUCCESS) { DWORD dtype = REG_SZ; WCHAR wclsid[255]; DWORD datasize = 255; if (RegQueryValueEx(hk, L"CLSID", 0, &dtype, reinterpret_cast(wclsid), &datasize) == ERROR_SUCCESS) { if (datasize > 76) datasize = 76; QString qsCls = QString::fromUtf16(reinterpret_cast(wclsid), datasize / 2).toLower().trimmed(); CLSID clsid; if (! blacklist.contains(qsCls) && ! FAILED(CLSIDFromString(wclsid, &clsid))) { ASIODev ad(name, qsCls); qlDevs << ad; } } RegCloseKey(hk); } keynamelen = keynamebufsize; } RegCloseKey(hkDevs); } bOk = false; ASIODev ad; foreach(ad, qlDevs) { qcbDevice->addItem(ad.first, QVariant(ad.second)); } if (qlDevs.count() == 0) { qpbQuery->setEnabled(false); qpbConfig->setEnabled(false); } } void ASIOConfig::on_qpbQuery_clicked() { QString qsCls = qcbDevice->itemData(qcbDevice->currentIndex()).toString(); CLSID clsid; IASIO *iasio; clearQuery(); CLSIDFromString(const_cast(reinterpret_cast(qsCls.utf16())), &clsid); if (CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, clsid, reinterpret_cast(&iasio)) == S_OK) { SleepEx(10, false); if (iasio->init(mumble_mw_hwnd)) { SleepEx(10, false); char buff[512]; memset(buff, 0, 512); iasio->getDriverName(buff); SleepEx(10, false); long ver = iasio->getDriverVersion(); SleepEx(10, false); ASIOSampleRate srate = 0.0; iasio->setSampleRate(48000.0); iasio->getSampleRate(&srate); SleepEx(10, false); long minSize, maxSize, prefSize, granSize; iasio->getBufferSize(&minSize, &maxSize, &prefSize, &granSize); SleepEx(10, false); QString str = tr("%1 (version %2)").arg(QLatin1String(buff)).arg(ver); qlName->setText(str); str = tr("%1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz").arg(minSize).arg(maxSize).arg(granSize).arg(prefSize).arg(srate,0,'f',0); qlBuffers->setText(str); long ichannels, ochannels; iasio->getChannels(&ichannels, &ochannels); SleepEx(10, false); long cnum; bool match = (s.qsASIOclass == qsCls); for (cnum=0;cnumgetChannelInfo(&aci); SleepEx(10, false); switch (aci.type) { case ASIOSTFloat32LSB: case ASIOSTInt32LSB: case ASIOSTInt24LSB: case ASIOSTInt16LSB: { QListWidget *widget = qlwUnused; QVariant v = static_cast(cnum); if (match && s.qlASIOmic.contains(v)) widget = qlwMic; else if (match && s.qlASIOspeaker.contains(v)) widget = qlwSpeaker; QListWidgetItem *item = new QListWidgetItem(QLatin1String(aci.name), widget); item->setData(Qt::UserRole, static_cast(cnum)); } break; default: qWarning("ASIOInput: Channel %ld %s (Unusable format %ld)", cnum, aci.name,aci.type); } } bOk = true; } else { SleepEx(10, false); char err[255]; iasio->getErrorMessage(err); SleepEx(10, false); QMessageBox::critical(this, QLatin1String("Mumble"), tr("ASIO Initialization failed: %1").arg(Qt::escape(QLatin1String(err))), QMessageBox::Ok, QMessageBox::NoButton); } iasio->Release(); } else { QMessageBox::critical(this, QLatin1String("Mumble"), tr("Failed to instantiate ASIO driver"), QMessageBox::Ok, QMessageBox::NoButton); } } void ASIOConfig::on_qpbConfig_clicked() { QString qsCls = qcbDevice->itemData(qcbDevice->currentIndex()).toString(); CLSID clsid; IASIO *iasio; CLSIDFromString(const_cast(reinterpret_cast(qsCls.utf16())), &clsid); if (CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, clsid, reinterpret_cast(&iasio)) == S_OK) { SleepEx(10, false); if (iasio->init(mumble_mw_hwnd)) { SleepEx(10, false); iasio->controlPanel(); SleepEx(10, false); } else { SleepEx(10, false); char err[255]; iasio->getErrorMessage(err); SleepEx(10, false); QMessageBox::critical(this, QLatin1String("Mumble"), tr("ASIO Initialization failed: %1").arg(Qt::escape(QLatin1String(err))), QMessageBox::Ok, QMessageBox::NoButton); } iasio->Release(); } else { QMessageBox::critical(this, QLatin1String("Mumble"), tr("Failed to instantiate ASIO driver"), QMessageBox::Ok, QMessageBox::NoButton); } } void ASIOConfig::on_qcbDevice_activated(int) { clearQuery(); } void ASIOConfig::on_qpbAddMic_clicked() { int row = qlwUnused->currentRow(); if (row < 0) return; qlwMic->addItem(qlwUnused->takeItem(row)); } void ASIOConfig::on_qpbRemMic_clicked() { int row = qlwMic->currentRow(); if (row < 0) return; qlwUnused->addItem(qlwMic->takeItem(row)); } void ASIOConfig::on_qpbAddSpeaker_clicked() { int row = qlwUnused->currentRow(); if (row < 0) return; qlwSpeaker->addItem(qlwUnused->takeItem(row)); } void ASIOConfig::on_qpbRemSpeaker_clicked() { int row = qlwSpeaker->currentRow(); if (row < 0) return; qlwUnused->addItem(qlwSpeaker->takeItem(row)); } QString ASIOConfig::title() const { return tr("ASIO"); } QIcon ASIOConfig::icon() const { return QIcon(QLatin1String("skin:config_asio.png")); } void ASIOConfig::save() const { if (! bOk) return; s.qsASIOclass = qcbDevice->itemData(qcbDevice->currentIndex()).toString(); QList list; for (int i=0;icount();i++) { QListWidgetItem *item = qlwMic->item(i); list << item->data(Qt::UserRole); } s.qlASIOmic = list; list.clear(); for (int i=0;icount();i++) { QListWidgetItem *item = qlwSpeaker->item(i); list << item->data(Qt::UserRole); } s.qlASIOspeaker = list; } void ASIOConfig::load(const Settings &r) { int i = 0; ASIODev ad; foreach(ad, qlDevs) { if (ad.second == r.qsASIOclass) { loadComboBox(qcbDevice, i); } i++; } s.qlASIOmic = r.qlASIOmic; s.qlASIOspeaker = r.qlASIOspeaker; qlName->setText(QString()); qlBuffers->setText(QString()); qlwMic->clear(); qlwUnused->clear(); qlwSpeaker->clear(); } void ASIOConfig::clearQuery() { bOk = false; qlName->setText(QString()); qlBuffers->setText(QString()); qlwMic->clear(); qlwUnused->clear(); qlwSpeaker->clear(); } ASIOInput::ASIOInput() { QString qsCls = g.s.qsASIOclass; CLSID clsid; iasio = NULL; abiInfo = NULL; aciInfo = NULL; // Sanity check things first. iNumMic=g.s.qlASIOmic.count(); iNumSpeaker=g.s.qlASIOspeaker.count(); if ((iNumMic == 0) || (iNumSpeaker == 0)) { QMessageBox::warning(NULL, QLatin1String("Mumble"), tr("You need to select at least one microphone and one speaker source to use ASIO. " "If you just need microphone sampling, use DirectSound."), QMessageBox::Ok, QMessageBox::NoButton); return; } CLSIDFromString(const_cast(reinterpret_cast(qsCls.utf16())), &clsid); if (CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, clsid, reinterpret_cast(&iasio)) == S_OK) { if (iasio->init(NULL)) { iasio->setSampleRate(48000.0); ASIOSampleRate srate = 0.0; iasio->getSampleRate(&srate); if (srate <= 0.0) return; long minSize, maxSize, prefSize, granSize; iasio->getBufferSize(&minSize, &maxSize, &prefSize, &granSize); bool halfit = true; double wbuf = (srate / 100.0); long wantBuf = lround(wbuf); lBufSize = wantBuf; if (static_cast(wantBuf) == wbuf) { qWarning("ASIOInput: Exact buffer match possible."); if ((wantBuf >= minSize) && (wantBuf <= maxSize)) { if (wantBuf == minSize) halfit = false; else if ((granSize >= 1) && (((wantBuf-minSize)%granSize)==0)) halfit = false; } } if (halfit) { if (granSize == 0) { qWarning("ASIOInput: Single buffer size"); lBufSize = minSize; } else { long target = wantBuf / 2; lBufSize = target; while (lBufSize < target) { if (granSize < 0) lBufSize *= 2; else lBufSize += granSize; } } qWarning("ASIOInput: Buffer mismatch mode. Wanted %li, got %li", wantBuf, lBufSize); } abiInfo = new ASIOBufferInfo[iNumMic + iNumSpeaker]; aciInfo = new ASIOChannelInfo[iNumMic + iNumSpeaker]; int i, idx = 0; for (i=0;igetChannelInfo(&aciInfo[idx]); SleepEx(10, false); idx++; } for (i=0;igetChannelInfo(&aciInfo[idx]); SleepEx(10, false); idx++; } iEchoChannels = iNumSpeaker; iMicChannels = iNumMic; iEchoFreq = iMicFreq = iroundf(srate); initializeMixer(); ASIOCallbacks asioCallbacks; ZeroMemory(&asioCallbacks, sizeof(asioCallbacks)); asioCallbacks.bufferSwitch = &bufferSwitch; asioCallbacks.sampleRateDidChange = &sampleRateChanged; asioCallbacks.asioMessage = &asioMessages; asioCallbacks.bufferSwitchTimeInfo = &bufferSwitchTimeInfo; if (iasio->createBuffers(abiInfo, idx, lBufSize, &asioCallbacks) == ASE_OK) { bRunning = true; return; } } } if (iasio) { iasio->Release(); iasio = NULL; } QMessageBox::critical(NULL, QLatin1String("Mumble"), tr("Opening selected ASIO device failed. No input will be done."), QMessageBox::Ok, QMessageBox::NoButton); } ASIOInput::~ASIOInput() { qwDone.wakeAll(); wait(); if (iasio) { iasio->stop(); iasio->disposeBuffers(); iasio->Release(); iasio = NULL; } delete [] abiInfo; abiInfo = NULL; delete [] aciInfo; aciInfo = NULL; } void ASIOInput::run() { QMutex m; m.lock(); if (iasio) { aiSelf = this; iasio->start(); qwDone.wait(&m); } } ASIOTime *ASIOInput::bufferSwitchTimeInfo(ASIOTime *, long index, ASIOBool) { aiSelf->bufferReady(index); return 0L; } void ASIOInput::addBuffer(ASIOSampleType sampType, int interleave, void *src, float * RESTRICT dst) { switch (sampType) { case ASIOSTInt16LSB: { const float m = 1.0f / 32768.f; const short * RESTRICT buf=static_cast(src); for (int i=0;i(src); for (int i=0;i(0x7FFFFFFF - 0xFF); const unsigned char * RESTRICT buf=static_cast(src); for (int i=0;i(src); for (int i=0;iiasio->getSamplePosition(&timeInfo.timeInfo.samplePosition, &timeInfo.timeInfo.systemTime) == ASE_OK) timeInfo.timeInfo.flags = kSystemTimeValid | kSamplePositionValid; bufferSwitchTimeInfo(&timeInfo, index, processNow); } void ASIOInput::sampleRateChanged(ASIOSampleRate) { qFatal("ASIOInput: sampleRateChanged"); } long ASIOInput::asioMessages(long selector, long value, void*, double*) { long ret = 0; switch (selector) { case kAsioSelectorSupported: if (value == kAsioResetRequest || value == kAsioEngineVersion || value == kAsioResyncRequest || value == kAsioLatenciesChanged || value == kAsioSupportsTimeInfo || value == kAsioSupportsTimeCode || value == kAsioSupportsInputMonitor) ret = 1L; break; case kAsioResetRequest: qFatal("ASIOInput: kAsioResetRequest"); ret = 1L; break; case kAsioResyncRequest: ret = 1L; break; case kAsioLatenciesChanged: ret = 1L; break; case kAsioEngineVersion: ret = 2L; break; case kAsioSupportsTimeInfo: ret = 1; break; case kAsioSupportsTimeCode: ret = 0; break; } return ret; } mumble-1.3.4/src/mumble/ASIOInput.h0000664000175000017500000000411014010707273016631 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_ASIOINPUT_H_ #define MUMBLE_MUMBLE_ASIOINPUT_H_ #include #include #include #include #include #include #include "AudioInput.h" #include "ConfigDialog.h" #include "ui_ASIOInput.h" typedef QPair ASIODev; class ASIOConfig : public ConfigWidget, public Ui::ASIOConfig { private: Q_OBJECT Q_DISABLE_COPY(ASIOConfig) protected: QList qlDevs; bool bOk; public: ASIOConfig(Settings &st); virtual QString title() const Q_DECL_OVERRIDE; virtual QIcon icon() const Q_DECL_OVERRIDE; public slots: void save() const Q_DECL_OVERRIDE; void load(const Settings &r) Q_DECL_OVERRIDE; void clearQuery(); void on_qcbDevice_activated(int index); void on_qpbQuery_clicked(); void on_qpbConfig_clicked(); void on_qpbAddMic_clicked(); void on_qpbRemMic_clicked(); void on_qpbAddSpeaker_clicked(); void on_qpbRemSpeaker_clicked(); }; #define IEEE754_64FLOAT 1 #include "asio.h" class ASIOInput : public AudioInput { private: Q_OBJECT Q_DISABLE_COPY(ASIOInput) protected: IASIO *iasio; int iNumMic, iNumSpeaker; long lBufSize; ASIOBufferInfo *abiInfo; ASIOChannelInfo *aciInfo; // ASIO Callbacks static ASIOInput *aiSelf; static void sampleRateChanged(ASIOSampleRate sRate); static long asioMessages(long selector, long value, void* message, double* opt); static void bufferSwitch(long index, ASIOBool processNow); static ASIOTime *bufferSwitchTimeInfo(ASIOTime *timeInfo, long index, ASIOBool processNow); void addBuffer(long sampType, int interleave, void *src, float * RESTRICT dst); void bufferReady(long index); bool initializeDriver(); QWaitCondition qwDone; public: ASIOInput(); ~ASIOInput() Q_DECL_OVERRIDE; void run() Q_DECL_OVERRIDE; }; #endif mumble-1.3.4/src/mumble/SharedMemory.h0000664000175000017500000000164414010707273017466 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_SHAREDMEMORY_H_ #define MUMBLE_MUMBLE_SHAREDMEMORY_H_ #include #include struct SharedMemory2Private; class SharedMemory2 : QObject { private: Q_DISABLE_COPY(SharedMemory2) Q_OBJECT protected: QString qsName; SharedMemory2Private *d; unsigned char *a_ucData; unsigned int uiSize; static unsigned int uiIndex; public: SharedMemory2(QObject *p, unsigned int minsize, const QString &name = QString()); ~SharedMemory2() Q_DECL_OVERRIDE; void erase(); void systemRelease(); QString name() const; unsigned int size() const; unsigned char *data(); const unsigned char *data() const; }; #endif mumble-1.3.4/src/mumble/UserModel.cpp0000664000175000017500000012617014010707273017323 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "UserModel.h" #include "ClientUser.h" #include "Channel.h" #include "Database.h" #include "LCD.h" #include "Log.h" #include "MainWindow.h" #include "Message.h" #include "Overlay.h" #include "ServerHandler.h" #include "Usage.h" #include "User.h" // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" QHash ModelItem::c_qhChannels; QHash ModelItem::c_qhUsers; bool ModelItem::bUsersTop = false; ModelItem::ModelItem(Channel *c) { this->cChan = c; this->pUser = NULL; bCommentSeen = true; c_qhChannels.insert(c, this); parent = c_qhChannels.value(c->cParent); iUsers = 0; } ModelItem::ModelItem(ClientUser *p) { this->cChan = NULL; this->pUser = p; bCommentSeen = true; c_qhUsers.insert(p, this); parent = c_qhChannels.value(p->cChannel); iUsers = 0; } ModelItem::ModelItem(ModelItem *i) { // Create a shallow clone this->cChan = i->cChan; this->pUser = i->pUser; this->parent = i->parent; this->bCommentSeen = i->bCommentSeen; if (pUser) c_qhUsers.insert(pUser, this); else if (cChan) c_qhChannels.insert(cChan, this); iUsers = i->iUsers; } ModelItem::~ModelItem() { Q_ASSERT(qlChildren.count() == 0); if (cChan && c_qhChannels.value(cChan) == this) c_qhChannels.remove(cChan); if (pUser && c_qhUsers.value(pUser) == this) c_qhUsers.remove(pUser); } void ModelItem::wipe() { foreach(ModelItem *i, qlChildren) { i->wipe(); delete i; } qlChildren.clear(); iUsers = 0; } ModelItem *ModelItem::child(int idx) const { if (! validRow(idx)) return NULL; return qlChildren.at(idx); } bool ModelItem::validRow(int idx) const { return ((idx >= 0) && (idx < qlChildren.count())); } ClientUser *ModelItem::userAt(int idx) const { if (! validRow(idx)) return NULL; return qlChildren.at(idx)->pUser; } Channel *ModelItem::channelAt(int idx) const { if (! validRow(idx)) return NULL; return qlChildren.at(idx)->cChan; } int ModelItem::rowOf(Channel *c) const { for (int i=0;icChan == c) return i; return -1; } int ModelItem::rowOf(ClientUser *p) const { for (int i=0;ipUser == p) return i; return -1; } int ModelItem::rowOfSelf() const { // Root? if (! parent) return 0; if (pUser) return parent->rowOf(pUser); else return parent->rowOf(cChan); } int ModelItem::rows() const { return qlChildren.count(); } int ModelItem::insertIndex(Channel *c) const { QList qlpc; ModelItem *item; int ocount = 0; foreach(item, qlChildren) { if (item->cChan) { if (item->cChan != c) { qlpc << item->cChan; } } else ocount++; } qlpc << c; qSort(qlpc.begin(), qlpc.end(), Channel::lessThan); return qlpc.indexOf(c) + (bUsersTop ? ocount : 0); } int ModelItem::insertIndex(ClientUser *p) const { QList qlclientuser; ModelItem *item; int ocount = 0; foreach(item, qlChildren) { if (item->pUser) { if (item->pUser != p) qlclientuser << item->pUser; } else ocount++; } qlclientuser << p; qSort(qlclientuser.begin(), qlclientuser.end(), ClientUser::lessThan); return qlclientuser.indexOf(p) + (bUsersTop ? 0 : ocount); } QString ModelItem::hash() const { if (pUser) { if (! pUser->qsHash.isEmpty()) return pUser->qsHash; else return QLatin1String(sha1(pUser->qsName).toHex()); } else { QCryptographicHash chash(QCryptographicHash::Sha1); chash.addData(cChan->qsName.toUtf8()); chash.addData(QString::number(cChan->iId).toUtf8()); if (g.sh && g.sh->isRunning()) { QString host, user, pw; unsigned short port; g.sh->getConnectionInfo(host, port, user, pw); chash.addData(host.toUtf8()); chash.addData(QString::number(port).toUtf8()); } return QLatin1String(chash.result().toHex()); } } UserModel::UserModel(QObject *p) : QAbstractItemModel(p) { qiTalkingOff=QIcon(QLatin1String("skin:talking_off.svg")); qiTalkingOn=QIcon(QLatin1String("skin:talking_on.svg")); qiTalkingShout=QIcon(QLatin1String("skin:talking_alt.svg")); qiTalkingWhisper=QIcon(QLatin1String("skin:talking_whisper.svg")); qiPrioritySpeaker=QIcon(QLatin1String("skin:priority_speaker.svg")); qiRecording=QIcon(QLatin1String("skin:actions/media-record.svg")); qiMutedPushToMute.addFile(QLatin1String("skin:muted_pushtomute.svg")); qiMutedSelf=QIcon(QLatin1String("skin:muted_self.svg")); qiMutedServer=QIcon(QLatin1String("skin:muted_server.svg")); qiMutedLocal=QIcon(QLatin1String("skin:muted_local.svg")); qiIgnoredLocal=QIcon(QLatin1String("skin:status/text-missing.svg")); qiMutedSuppressed=QIcon(QLatin1String("skin:muted_suppressed.svg")); qiDeafenedSelf=QIcon(QLatin1String("skin:deafened_self.svg")); qiDeafenedServer=QIcon(QLatin1String("skin:deafened_server.svg")); qiAuthenticated=QIcon(QLatin1String("skin:authenticated.svg")); qiChannel=QIcon(QLatin1String("skin:channel.svg")); qiActiveChannel=QIcon(QLatin1String("skin:channel_active.svg")); qiLinkedChannel=QIcon(QLatin1String("skin:channel_linked.svg")); qiFriend=QIcon(QLatin1String("skin:emblems/emblem-favorite.svg")); qiComment=QIcon(QLatin1String("skin:comment.svg")); qiCommentSeen=QIcon(QLatin1String("skin:comment_seen.svg")); qiFilter=QIcon(QLatin1String("skin:filter.svg")); ModelItem::bUsersTop = g.s.bUserTop; uiSessionComment = 0; iChannelDescription = -1; bClicked = false; miRoot = new ModelItem(Channel::get(0)); } UserModel::~UserModel() { removeAll(); Q_ASSERT(ModelItem::c_qhUsers.count() == 0); Q_ASSERT(ModelItem::c_qhChannels.count() == 1); delete miRoot; } int UserModel::columnCount(const QModelIndex &) const { return 1; } QModelIndex UserModel::index(int row, int column, const QModelIndex &p) const { ModelItem *item; QModelIndex idx = QModelIndex(); if ((row < 0) || (column < 0) || (column > 1)) { return QModelIndex(); } if (! p.isValid()) { return createIndex(row, column, miRoot); } else { item = static_cast(p.internalPointer()); } if (! item) return idx; if (! item->validRow(row)) return idx; idx = createIndex(row, column, item->child(row)); return idx; } QModelIndex UserModel::index(ClientUser *p, int column) const { ModelItem *item = ModelItem::c_qhUsers.value(p); Q_ASSERT(p); Q_ASSERT(item); if (!p || ! item) return QModelIndex(); QModelIndex idx=createIndex(item->rowOfSelf(), column, item); return idx; } QModelIndex UserModel::index(Channel *c, int column) const { ModelItem *item = ModelItem::c_qhChannels.value(c); Q_ASSERT(c); Q_ASSERT(item); if (!item || !c) return QModelIndex(); QModelIndex idx=createIndex(item->rowOfSelf(), column, item); return idx; } QModelIndex UserModel::index(ModelItem *item) const { return createIndex(item->rowOfSelf(), 0, item); } QModelIndex UserModel::parent(const QModelIndex &idx) const { if (! idx.isValid()) return QModelIndex(); ModelItem *item = static_cast(idx.internalPointer()); ModelItem *parent_item = (item) ? item->parent : NULL; if (! parent_item) return QModelIndex(); return createIndex(parent_item->rowOfSelf(), 0, parent_item); } int UserModel::rowCount(const QModelIndex &p) const { ModelItem *item; int val = 0; if (!p.isValid()) return 1; else item = static_cast(p.internalPointer()); if (! item || (p.column() != 0)) return 0; val = item->rows(); return val; } QString UserModel::stringIndex(const QModelIndex &idx) const { ModelItem *item = static_cast(idx.internalPointer()); if (!idx.isValid()) return QLatin1String("invIdx"); if (!item) return QLatin1String("invPtr"); if (item->pUser) return QString::fromLatin1("P:%1 [%2,%3]").arg(item->pUser->qsName).arg(idx.row()).arg(idx.column()); else return QString::fromLatin1("C:%1 [%2,%3]").arg(item->cChan->qsName).arg(idx.row()).arg(idx.column()); } QVariant UserModel::data(const QModelIndex &idx, int role) const { if (!idx.isValid()) return QVariant(); ModelItem *item = static_cast(idx.internalPointer()); Channel *c = item->cChan; ClientUser *p = item->pUser; ClientUser *pSelf = ClientUser::get(g.uiSession); if (!c && !p) { return QVariant(); } QVariant v = otherRoles(idx, role); if (v.isValid()) return v; QList l; if (p) { switch (role) { case Qt::DecorationRole: if (idx.column() == 0) { if (p == pSelf && p->bSelfMute) { // This is a workaround for a bug that can lead to the user having muted him/herself but // the talking icon is stuck at qiTalkingOn for some reason. // Until someone figures out how to fix the root of the problem, we'll have this workaround // to cure the symptoms of the bug. return qiTalkingOff; } switch (p->tsState) { case Settings::Talking: return qiTalkingOn; case Settings::Whispering: return qiTalkingWhisper; case Settings::Shouting: return qiTalkingShout; case Settings::Passive: default: return qiTalkingOff; } } break; case Qt::FontRole: if ((idx.column() == 0) && (p->uiSession == g.uiSession)) { QFont f = g.mw->font(); f.setBold(! f.bold()); return f; } break; case Qt::DisplayRole: if (idx.column() == 0) { if (! p->qsFriendName.isEmpty() && (p->qsFriendName.toLower() != p->qsName.toLower())) return QString::fromLatin1("%1 (%2)").arg(p->qsName).arg(p->qsFriendName); else return p->qsName; } if (! p->qbaCommentHash.isEmpty()) l << (item->bCommentSeen ? qiCommentSeen : qiComment); if (p->bPrioritySpeaker) l << qiPrioritySpeaker; if (p->bRecording) l << qiRecording; // ClientUser doesn't contain a push-to-mute // state because it isn't sent to the server. // We can show the icon only for the local user. if (p == pSelf && g.bPushToMute) l << qiMutedPushToMute; if (p->bMute) l << qiMutedServer; if (p->bSuppress) l << qiMutedSuppressed; if (p->bSelfMute) l << qiMutedSelf; if (p->bLocalMute) l << qiMutedLocal; if (p->bLocalIgnore) l << qiIgnoredLocal; if (p->bDeaf) l << qiDeafenedServer; if (p->bSelfDeaf) l << qiDeafenedSelf; if (p->iId >= 0) l << qiAuthenticated; if (! p->qsFriendName.isEmpty()) l << qiFriend; return l; default: break; } } else { switch (role) { case Qt::DecorationRole: if (idx.column() == 0) { if (g.uiSession && qsLinked.contains(c)) { if (ClientUser::get(g.uiSession)->cChannel == c) return qiActiveChannel; else return qiLinkedChannel; } return qiChannel; } break; case Qt::DisplayRole: if (idx.column() == 0) { if (! g.s.bShowUserCount || item->iUsers == 0) return c->qsName; return QString::fromLatin1("%1 (%2)").arg(c->qsName).arg(item->iUsers); } if (! c->qbaDescHash.isEmpty()) l << (item->bCommentSeen ? qiCommentSeen : qiComment); if (c->bFiltered) l << (qiFilter); return l; case Qt::FontRole: if (g.uiSession) { Channel *home = ClientUser::get(g.uiSession)->cChannel; if ((c == home) || qsLinked.contains(c)) { QFont f = g.mw->font(); if (qsLinked.count() > 1) f.setItalic(! f.italic()); if (c == home) f.setBold(! f.bold()); return f; } } break; case Qt::BackgroundRole: if ((c->iId == 0) && g.sh && g.sh->isStrong()) { QColor qc(Qt::green); qc.setAlpha(32); return qc; } break; default: break; } } return QVariant(); } Qt::ItemFlags UserModel::flags(const QModelIndex &idx) const { if (!idx.isValid()) return Qt::ItemIsDropEnabled; if (idx.column() != 0) return Qt::ItemIsEnabled | Qt::ItemIsDropEnabled | Qt::ItemIsDragEnabled; return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled; } QVariant UserModel::otherRoles(const QModelIndex &idx, int role) const { ModelItem *item = static_cast(idx.internalPointer()); ClientUser *p = item->pUser; Channel *c = item->cChan; int section = idx.column(); bool isUser = p != NULL; switch (role) { case Qt::ToolTipRole: const_cast(this)->uiSessionComment = 0; const_cast(this)->iChannelDescription = -1; const_cast(this)->bClicked = false; switch (section) { case 0: { if (isUser) { QString qsImage; if (! p->qbaTextureHash.isEmpty()) { if (p->qbaTexture.isEmpty()) { p->qbaTexture = g.db->blob(p->qbaTextureHash); if (p->qbaTexture.isEmpty()) { MumbleProto::RequestBlob mprb; mprb.add_session_texture(p->uiSession); g.sh->sendMessage(mprb); } else { g.o->verifyTexture(p); } } if (! p->qbaTexture.isEmpty()) { QBuffer qb(&p->qbaTexture); qb.open(QIODevice::ReadOnly); QImageReader qir(&qb, p->qbaTextureFormat); QSize sz = qir.size(); if (sz.width() > 0) { qsImage = QString::fromLatin1("qbaTexture.toBase64().toPercentEncoding())); if (sz.width() > 128) { int targ = sz.width() / ((sz.width()+127)/ 128); qsImage.append(QString::fromLatin1("\" width=\"%1\" />").arg(targ)); } else { qsImage.append(QString::fromLatin1("\" />")); } } } } if (p->qbaCommentHash.isEmpty()) { if (! qsImage.isEmpty()) return qsImage; else return p->qsName; } else { if (p->qsComment.isEmpty()) { p->qsComment = QString::fromUtf8(g.db->blob(p->qbaCommentHash)); if (p->qsComment.isEmpty()) { const_cast(this)->uiSessionComment = p->uiSession; MumbleProto::RequestBlob mprb; mprb.add_session_comment(p->uiSession); g.sh->sendMessage(mprb); return QVariant(); } } const_cast(this)->seenComment(idx); QString base = Log::validHtml(p->qsComment); if (! qsImage.isEmpty()) return QString::fromLatin1("
%1%2
").arg(qsImage,base); return base; } } else { if (c->qbaDescHash.isEmpty()) { return c->qsName; } else { if (c->qsDesc.isEmpty()) { c->qsDesc = QString::fromUtf8(g.db->blob(c->qbaDescHash)); if (c->qsDesc.isEmpty()) { const_cast(this)->iChannelDescription = c->iId; MumbleProto::RequestBlob mprb; mprb.add_channel_description(c->iId); g.sh->sendMessage(mprb); return QVariant(); } } const_cast(this)->seenComment(idx); return Log::validHtml(c->qsDesc); } } } break; case 1: return isUser ? p->getFlagsString() : QVariant(); } break; case Qt::WhatsThisRole: switch (section) { case 0: if (isUser) return QString::fromLatin1("%1" "" "" "" "" "" "
%2
%3
%4
%5
").arg(tr("This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking:"), tr("Talking to your channel."), tr("Shouting directly to your channel."), tr("Whispering directly to you."), tr("Not talking.") ); else return QString::fromLatin1("%1" "" "" "" "" "
%2
%3
%4
").arg(tr("This is a channel on the server. The icon indicates the state of the channel:"), tr("Your current channel."), tr("A channel that is linked with your channel. Linked channels can talk to each other."), tr("A channel on the server that you are not linked to.") ); case 1: if (isUser) return QString::fromLatin1("%1" "" "" "" "" "" "" "" "" "" "" "" "" "" "
%2
%3
%4
%5
%6
%7
%8
%9
%10
%11
%12
%13
").arg(tr("This shows the flags the user has on the server, if any:"), tr("On your friend list"), tr("Authenticated user"), tr("Muted (manually muted by self)"), tr("Muted (manually muted by admin)"), tr("Muted (not allowed to speak in current channel)"), tr("Muted (muted by you, only on your machine)"), tr("Muted (push-to-mute)") ).arg( tr("Deafened (by self)"), tr("Deafened (by admin)"), tr("User has a new comment set (click to show)"), tr("User has a comment set, which you've already seen. (click to show)"), tr("Ignoring Text Messages") ); else return QString::fromLatin1("%1" "" "" "" "" "
%10
%11
%12
").arg(tr("This shows the flags the channel has, if any:"), tr("Channel has a new comment set (click to show)"), tr("Channel has a comment set, which you've already seen. (click to show)"), tr("Channel will be hidden when filtering is enabled") ); } break; } return QVariant(); } QVariant UserModel::headerData(int section, Qt::Orientation orientation, int role) const { if (orientation != Qt::Horizontal) return QVariant(); switch (role) { case Qt::DisplayRole: switch (section) { case 0: return tr("Name"); case 1: return tr("Flags"); } } return QVariant(); } void UserModel::recursiveClone(const ModelItem *old, ModelItem *item, QModelIndexList &from, QModelIndexList &to) { if (old->qlChildren.isEmpty()) return; beginInsertRows(index(item), 0, old->qlChildren.count()); for (int i=0;iqlChildren.count();++i) { ModelItem *o = old->qlChildren.at(i); ModelItem *mi = new ModelItem(o); mi->parent = item; item->qlChildren << mi; from << createIndex(i, 0, o); from << createIndex(i, 1, o); to << createIndex(i, 0, mi); to << createIndex(i, 1, mi); } endInsertRows(); for (int i=0;iqlChildren.count();++i) recursiveClone(old->qlChildren.at(i), item->qlChildren.at(i), from, to); } ModelItem *UserModel::moveItem(ModelItem *oldparent, ModelItem *newparent, ModelItem *item) { // Here's the idea. We insert the item, update persistent indexes, THEN remove it. int oldrow = oldparent->qlChildren.indexOf(item); int newrow = -1; if (item->cChan) newrow = newparent->insertIndex(item->cChan); else newrow = newparent->insertIndex(item->pUser); if ((oldparent == newparent) && (newrow == oldrow)) { emit dataChanged(index(item),index(item)); return item; } // Shallow clone ModelItem *t = new ModelItem(item); // Store the index if it's "active". // The selection is stored as "from"-"to" pairs, so if we move up in the same channel, // we'd move only "from" and select half the channel. QTreeView *v=g.mw->qtvUsers; QItemSelectionModel *sel=v->selectionModel(); QPersistentModelIndex active; QModelIndex oindex = createIndex(oldrow, 0, item); if (sel->isSelected(oindex) || (oindex == v->currentIndex())) { active = index(item); v->clearSelection(); v->setCurrentIndex(QModelIndex()); } bool expanded = v->isExpanded(index(item)); if (newparent == oldparent) { // Mangle rows. newrow needs to be pre-remove. oldrow needs to be postremove. if (oldrow >= newrow) { oldrow++; } else { newrow++; } } beginInsertRows(index(newparent), newrow, newrow); t->parent = newparent; newparent->qlChildren.insert(newrow, t); if (item->cChan) { oldparent->cChan->removeChannel(item->cChan); newparent->cChan->addChannel(item->cChan); } else { newparent->cChan->addClientUser(item->pUser); } endInsertRows(); QModelIndexList from, to; from << createIndex(oldrow, 0, item); from << createIndex(oldrow, 1, item); to << createIndex(newrow, 0, t); to << createIndex(newrow, 1, t); recursiveClone(item, t, from, to); changePersistentIndexList(from, to); beginRemoveRows(index(oldparent), oldrow, oldrow); oldparent->qlChildren.removeAt(oldrow); endRemoveRows(); item->wipe(); delete item; if (active.isValid()) { sel->select(active, QItemSelectionModel::SelectCurrent); v->setCurrentIndex(active); } if (expanded) v->expand(index(t)); return t; } void UserModel::expandAll(Channel *c) { QStack chans; while (c) { chans.push(c); c = c->cParent; } while (! chans.isEmpty()) { c = chans.pop(); g.mw->qtvUsers->setExpanded(index(c), true); } } void UserModel::collapseEmpty(Channel *c) { while (c) { ModelItem *mi = ModelItem::c_qhChannels.value(c); if (mi->iUsers == 0) g.mw->qtvUsers->setExpanded(index(c), false); else break; c = c->cParent; } } void UserModel::ensureSelfVisible() { if (! g.uiSession) return; g.mw->qtvUsers->scrollTo(index(ClientUser::get(g.uiSession))); } void UserModel::recheckLinks() { if (! g.uiSession) return; ClientUser *clientUser = ClientUser::get(g.uiSession); if (! clientUser) return; bool bChanged = false; Channel *home = clientUser->cChannel; QSet all = home->allLinks(); if (all == qsLinked) return; QSet changed = (all - qsLinked); changed += (qsLinked - all); if ((all.count() == 1) || (qsLinked.count() == 1)) changed += home; qsLinked = all; foreach(Channel *c, changed) { QModelIndex idx = index(c); emit dataChanged(idx, idx); bChanged = true; } if (bChanged) updateOverlay(); } ClientUser *UserModel::addUser(unsigned int id, const QString &name) { ClientUser *p = ClientUser::add(id, this); p->qsName = name; ModelItem *item = new ModelItem(p); connect(p, SIGNAL(talkingStateChanged()), this, SLOT(userStateChanged())); connect(p, SIGNAL(muteDeafStateChanged()), this, SLOT(userStateChanged())); connect(p, SIGNAL(prioritySpeakerStateChanged()), this, SLOT(userStateChanged())); connect(p, SIGNAL(recordingStateChanged()), this, SLOT(userStateChanged())); Channel *c = Channel::get(0); ModelItem *citem = ModelItem::c_qhChannels.value(c); item->parent = citem; int row = citem->insertIndex(p); beginInsertRows(index(citem), row, row); citem->qlChildren.insert(row, item); c->addClientUser(p); endInsertRows(); while (citem) { citem->iUsers++; citem = citem->parent; } updateOverlay(); return p; } void UserModel::removeUser(ClientUser *p) { if (g.uiSession && p->uiSession == g.uiSession) g.uiSession = 0; Channel *c = p->cChannel; ModelItem *item = ModelItem::c_qhUsers.value(p); ModelItem *citem = ModelItem::c_qhChannels.value(c); int row = citem->qlChildren.indexOf(item); beginRemoveRows(index(citem), row, row); c->removeUser(p); citem->qlChildren.removeAt(row); endRemoveRows(); p->cChannel = NULL; ClientUser::remove(p); qmHashes.remove(p->qsHash); while (citem) { citem->iUsers--; citem = citem->parent; } if (g.s.ceExpand == Settings::ChannelsWithUsers) collapseEmpty(c); updateOverlay(); delete p; delete item; } void UserModel::moveUser(ClientUser *p, Channel *np) { Channel *oc = p->cChannel; ModelItem *opi = ModelItem::c_qhChannels.value(oc); ModelItem *pi = ModelItem::c_qhChannels.value(np); ModelItem *item = ModelItem::c_qhUsers.value(p); item = moveItem(opi, pi, item); if (p->uiSession == g.uiSession) { ensureSelfVisible(); recheckLinks(); } while (opi) { opi->iUsers--; opi = opi->parent; } while (pi) { pi->iUsers++; pi = pi->parent; } if (g.s.ceExpand == Settings::ChannelsWithUsers) { expandAll(np); collapseEmpty(oc); } updateOverlay(); } void UserModel::renameUser(ClientUser *p, const QString &name) { Channel *c = p->cChannel; p->qsName = name; ModelItem *pi = ModelItem::c_qhChannels.value(c); ModelItem *item = ModelItem::c_qhUsers.value(p); moveItem(pi, pi, item); updateOverlay(); } void UserModel::setUserId(ClientUser *p, int id) { p->iId = id; QModelIndex idx = index(p, 0); emit dataChanged(idx, idx); } void UserModel::setHash(ClientUser *p, const QString &hash) { if (! p->qsHash.isEmpty()) qmHashes.remove(p->qsHash); p->qsHash = hash; qmHashes.insert(p->qsHash, p); } void UserModel::setFriendName(ClientUser *p, const QString &name) { p->qsFriendName = name; QModelIndex idx = index(p, 0); emit dataChanged(idx, idx); } void UserModel::setComment(ClientUser *cu, const QString &comment) { cu->qbaCommentHash = comment.isEmpty() ? QByteArray() : sha1(comment); if (comment != cu->qsComment) { ModelItem *item = ModelItem::c_qhUsers.value(cu); int oldstate = (cu->qsComment.isEmpty() && cu->qbaCommentHash.isEmpty()) ? 0 : (item->bCommentSeen ? 2 : 1); int newstate = 0; cu->qsComment = comment; if (! comment.isEmpty()) { g.db->setBlob(cu->qbaCommentHash, cu->qsComment.toUtf8()); if (cu->uiSession == uiSessionComment) { uiSessionComment = 0; item->bCommentSeen = false; if (bClicked) { QRect r = g.mw->qtvUsers->visualRect(index(cu)); QWhatsThis::showText(g.mw->qtvUsers->viewport()->mapToGlobal(r.bottomRight()), data(index(cu, 0), Qt::ToolTipRole).toString(), g.mw->qtvUsers); } else { QToolTip::showText(QCursor::pos(), data(index(cu, 0), Qt::ToolTipRole).toString(), g.mw->qtvUsers); } } else if (cu->uiSession == ~uiSessionComment) { uiSessionComment = 0; if (cu->uiSession == g.uiSession) { QTimer::singleShot(0, g.mw, SLOT(on_qaSelfComment_triggered())); } else { g.mw->cuContextUser = cu; QTimer::singleShot(0, g.mw, SLOT(on_qaUserCommentView_triggered())); } } else { item->bCommentSeen = g.db->seenComment(item->hash(), cu->qbaCommentHash); newstate = item->bCommentSeen ? 2 : 1; } } else { item->bCommentSeen = true; } if (oldstate != newstate) { QModelIndex idx = index(cu, 0); emit dataChanged(idx, idx); } } } void UserModel::setCommentHash(ClientUser *cu, const QByteArray &hash) { if (hash != cu->qbaCommentHash) { ModelItem *item = ModelItem::c_qhUsers.value(cu); int oldstate = (cu->qsComment.isEmpty() && cu->qbaCommentHash.isEmpty()) ? 0 : (item->bCommentSeen ? 2 : 1); int newstate; cu->qsComment = QString(); cu->qbaCommentHash = hash; item->bCommentSeen = g.db->seenComment(item->hash(), cu->qbaCommentHash); newstate = item->bCommentSeen ? 2 : 1; if (oldstate != newstate) { QModelIndex idx = index(cu, 0); emit dataChanged(idx, idx); } } } void UserModel::setComment(Channel *c, const QString &comment) { c->qbaDescHash = comment.isEmpty() ? QByteArray() : sha1(comment); if (comment != c->qsDesc) { ModelItem *item = ModelItem::c_qhChannels.value(c); int oldstate = c->qsDesc.isEmpty() ? 0 : (item->bCommentSeen ? 2 : 1); int newstate = 0; c->qsDesc = comment; if (! comment.isEmpty()) { g.db->setBlob(c->qbaDescHash, c->qsDesc.toUtf8()); if (c->iId == iChannelDescription) { iChannelDescription = -1; item->bCommentSeen = false; if (bClicked) { QRect r = g.mw->qtvUsers->visualRect(index(c)); QWhatsThis::showText(g.mw->qtvUsers->viewport()->mapToGlobal(r.bottomRight()), data(index(c, 0), Qt::ToolTipRole).toString(), g.mw->qtvUsers); } else { QToolTip::showText(QCursor::pos(), data(index(c, 0), Qt::ToolTipRole).toString(), g.mw->qtvUsers); } } else { item->bCommentSeen = g.db->seenComment(item->hash(), c->qbaDescHash); newstate = item->bCommentSeen ? 2 : 1; } } else { item->bCommentSeen = true; } if (oldstate != newstate) { QModelIndex idx = index(c, 0); emit dataChanged(idx, idx); } } } void UserModel::setCommentHash(Channel *c, const QByteArray &hash) { if (hash != c->qbaDescHash) { ModelItem *item = ModelItem::c_qhChannels.value(c); int oldstate = (c->qsDesc.isEmpty() && c->qbaDescHash.isEmpty()) ? 0 : (item->bCommentSeen ? 2 : 1); int newstate; c->qsDesc = QString(); c->qbaDescHash = hash; item->bCommentSeen = g.db->seenComment(item->hash(), hash); newstate = item->bCommentSeen ? 2 : 1; if (oldstate != newstate) { QModelIndex idx = index(c, 0); emit dataChanged(idx, idx); } } } void UserModel::seenComment(const QModelIndex &idx) { ModelItem *item; item = static_cast(idx.internalPointer()); if (item->bCommentSeen) return; item->bCommentSeen = true; emit dataChanged(idx, idx); if (item->pUser) g.db->setSeenComment(item->hash(), item->pUser->qbaCommentHash); else g.db->setSeenComment(item->hash(), item->cChan->qbaDescHash); } void UserModel::renameChannel(Channel *c, const QString &name) { c->qsName = name; if (c->iId == 0) { QModelIndex idx = index(c); emit dataChanged(idx, idx); } else { Channel *pc = c->cParent; ModelItem *pi = ModelItem::c_qhChannels.value(pc); ModelItem *item = ModelItem::c_qhChannels.value(c); moveItem(pi, pi, item); } } void UserModel::repositionChannel(Channel *c, const int position) { c->iPosition = position; if (c->iId == 0) { QModelIndex idx = index(c); emit dataChanged(idx, idx); } else { Channel *pc = c->cParent; ModelItem *pi = ModelItem::c_qhChannels.value(pc); ModelItem *item = ModelItem::c_qhChannels.value(c); moveItem(pi, pi, item); } } Channel *UserModel::addChannel(int id, Channel *p, const QString &name) { Channel *c = Channel::add(id, name); if (! c) return NULL; ModelItem *item = new ModelItem(c); ModelItem *citem = ModelItem::c_qhChannels.value(p); item->parent = citem; int row = citem->insertIndex(c); beginInsertRows(index(citem), row, row); p->addChannel(c); citem->qlChildren.insert(row, item); endInsertRows(); if (g.s.ceExpand == Settings::AllChannels) g.mw->qtvUsers->setExpanded(index(item), true); return c; } bool UserModel::removeChannel(Channel *c, const bool onlyIfUnoccupied) { const ModelItem *item = ModelItem::c_qhChannels.value(c); if (onlyIfUnoccupied && item->iUsers !=0) return false; // Checks full hierarchy foreach(const ModelItem *i, item->qlChildren) { if (i->pUser) removeUser(i->pUser); else removeChannel(i->cChan); } Channel *p = c->cParent; if (! p) return true; ModelItem *citem = ModelItem::c_qhChannels.value(p); int row = citem->rowOf(c); beginRemoveRows(index(citem), row, row); p->removeChannel(c); citem->qlChildren.removeAt(row); qsLinked.remove(c); endRemoveRows(); Channel::remove(c); delete item; delete c; return true; } void UserModel::moveChannel(Channel *c, Channel *p) { Channel *oc = c->cParent; ModelItem *opi = ModelItem::c_qhChannels.value(c->cParent); ModelItem *pi = ModelItem::c_qhChannels.value(p); ModelItem *item = ModelItem::c_qhChannels.value(c); item = moveItem(opi, pi, item); while (opi) { opi->iUsers -= item->iUsers; opi = opi->parent; } while (pi) { pi->iUsers += item->iUsers; pi = pi->parent; } ensureSelfVisible(); if (g.s.ceExpand == Settings::ChannelsWithUsers) { collapseEmpty(oc); } } void UserModel::linkChannels(Channel *c, QList links) { foreach(Channel *l, links) c->link(l); recheckLinks(); } void UserModel::unlinkChannels(Channel *c, QList links) { foreach(Channel *l, links) c->unlink(l); recheckLinks(); } void UserModel::unlinkAll(Channel *c) { c->unlink(NULL); recheckLinks(); } void UserModel::removeAll() { ModelItem *item = miRoot; ModelItem *i; uiSessionComment = 0; iChannelDescription = -1; bClicked = false; foreach(i, item->qlChildren) { if (i->pUser) removeUser(i->pUser); else removeChannel(i->cChan); } qsLinked.clear(); updateOverlay(); } ClientUser *UserModel::getUser(const QModelIndex &idx) const { if (! idx.isValid()) return NULL; ModelItem *item; item = static_cast(idx.internalPointer()); return item->pUser; } ClientUser *UserModel::getUser(const QString &hash) const { return qmHashes.value(hash); } Channel *UserModel::getChannel(const QModelIndex &idx) const { if (! idx.isValid()) return NULL; ModelItem *item; item = static_cast(idx.internalPointer()); if (item->pUser) return item->pUser->cChannel; else return item->cChan; } Channel *UserModel::getSubChannel(Channel *p, int idx) const { ModelItem *item=ModelItem::c_qhChannels.value(p); if (! item) return NULL; foreach(ModelItem *i, item->qlChildren) { if (i->cChan) { if (idx == 0) return i->cChan; idx--; } } return NULL; } void UserModel::userStateChanged() { ClientUser *user = qobject_cast(sender()); if (user == NULL) return; const QModelIndex idx = index(user); emit dataChanged(idx, idx); updateOverlay(); } void UserModel::toggleChannelFiltered(Channel *c) { QModelIndex idx; if(c) { c->bFiltered = !c->bFiltered; ServerHandlerPtr sh = g.sh; g.db->setChannelFiltered(sh->qbaDigest, c->iId, c->bFiltered); idx = index(c); } emit dataChanged(idx, idx); updateOverlay(); } Qt::DropActions UserModel::supportedDropActions() const { return Qt::MoveAction; } QStringList UserModel::mimeTypes() const { QStringList sl; sl << QLatin1String("mumble/dragentry"); return sl; } QMimeData *UserModel::mimeData(const QModelIndexList &idxs) const { QModelIndex idx; QByteArray qba; QDataStream ds(&qba, QIODevice::WriteOnly); foreach(idx, idxs) { ClientUser *p = getUser(idx); Channel *c = getChannel(idx); if (p) { ds << false; ds << p->uiSession; } else if (c) { ds << true; ds << c->iId; } } QMimeData *md = new QMimeData(); md->setData(QLatin1String("mumble/dragentry"), qba); return md; } bool UserModel::dropMimeData(const QMimeData *md, Qt::DropAction, int row, int column, const QModelIndex &p) { #define NAMECMPCHANNEL(first, second) (QString::localeAwareCompare(first->qsName, second->qsName) > 0) if (! md->hasFormat(mimeTypes().at(0))) return false; QByteArray qba = md->data(mimeTypes().at(0)); QDataStream ds(qba); bool isChannel; int iId = -1; unsigned int uiSession = 0; ds >> isChannel; if (isChannel) ds >> iId; else ds >> uiSession; Channel *c; if (! p.isValid()) { c = Channel::get(0); } else { c = getChannel(p); } if (! c) return false; expandAll(c); if (! isChannel) { // User dropped somewhere int ret; switch (g.s.ceUserDrag) { case Settings::Ask: ret=QMessageBox::question(g.mw, QLatin1String("Mumble"), tr("Are you sure you want to drag this user?"), QMessageBox::Yes, QMessageBox::No); if (ret == QMessageBox::No) return false; break; case Settings::DoNothing: g.l->log(Log::Information, MainWindow::tr("You have User Dragging set to \"Do Nothing\" so the user wasn't moved.")); return false; break; case Settings::Move: break; } MumbleProto::UserState mpus; mpus.set_session(uiSession); mpus.set_channel_id(c->iId); g.sh->sendMessage(mpus); } else if (c->iId != iId) { // Channel dropped somewhere (not on itself) int ret; switch (g.s.ceChannelDrag) { case Settings::Ask: ret=QMessageBox::question(g.mw, QLatin1String("Mumble"), tr("Are you sure you want to drag this channel?"), QMessageBox::Yes, QMessageBox::No); if (ret == QMessageBox::No) return false; break; case Settings::DoNothing: g.l->log(Log::Information, MainWindow::tr("You have Channel Dragging set to \"Do Nothing\" so the channel wasn't moved.")); return false; break; case Settings::Move: break; default: g.l->log(Log::CriticalError, MainWindow::tr("Unknown Channel Drag mode in UserModel::dropMimeData.")); return false; break; } long long inewpos = 0; Channel *dropped = Channel::c_qhChannels.value(iId); if (! dropped) return false; if (p.isValid()) { ModelItem *pi = static_cast(p.internalPointer()); if (pi->pUser) pi = pi->parent; int ifirst = 0; int ilast = pi->rows() - 1; if (ilast > 0) { while (pi->userAt(ifirst) && ifirst < ilast) ifirst++; while (pi->userAt(ilast) && ilast > 0) ilast--; } if (row == -1 && column == -1) { // Dropped on item if (getUser(p)) { // Dropped on player if (ilast > 0) { if (pi->bUsersTop) { if (pi->channelAt(ifirst) == dropped || NAMECMPCHANNEL(pi->channelAt(ifirst), dropped)) { if (dropped->iPosition == pi->channelAt(ifirst)->iPosition) return true; inewpos = pi->channelAt(ifirst)->iPosition; } else { inewpos = static_cast(pi->channelAt(ifirst)->iPosition) - 20; } } else { if (dropped == pi->channelAt(ilast) || NAMECMPCHANNEL(dropped, pi->channelAt(ilast))) { if (pi->channelAt(ilast)->iPosition == dropped->iPosition) return true; inewpos = pi->channelAt(ilast)->iPosition; } else { inewpos = static_cast(pi->channelAt(ilast)->iPosition) + 20; } } } } } else { // Dropped between items if (ilast == 0) { // No channels in there yet } else if (row <= ifirst) { if (pi->channelAt(ifirst) == dropped || NAMECMPCHANNEL(pi->channelAt(ifirst), dropped)) { if (dropped->iPosition == pi->channelAt(ifirst)->iPosition) return true; inewpos = pi->channelAt(ifirst)->iPosition; } else { inewpos = static_cast(pi->channelAt(ifirst)->iPosition) - 20; } } else if (row > ilast) { if (dropped == pi->channelAt(ilast) || NAMECMPCHANNEL(dropped, pi->channelAt(ilast))) { if (pi->channelAt(ilast)->iPosition == dropped->iPosition) return true; inewpos = pi->channelAt(ilast)->iPosition; } else { inewpos = static_cast(pi->channelAt(ilast)->iPosition) + 20; } } else { // Dropped between channels Channel *lower = pi->channelAt(row); Channel *upper = pi->channelAt(row - 1); if (lower->iPosition == upper->iPosition && NAMECMPCHANNEL(lower, dropped) && NAMECMPCHANNEL(dropped, upper)) { inewpos = upper->iPosition; } else if (lower->iPosition > upper->iPosition && NAMECMPCHANNEL(lower, dropped)) { inewpos = lower->iPosition; } else if (lower->iPosition > upper->iPosition && NAMECMPCHANNEL(dropped, upper)) { inewpos = upper->iPosition; } else if (lower == dropped || upper == dropped) { return true; } else if (abs(lower->iPosition) - abs(upper->iPosition) > 1) { inewpos = upper->iPosition + (abs(lower->iPosition) - abs(upper->iPosition))/2; } else { // Not enough space, other channels have to be moved if (static_cast(pi->channelAt(ilast)->iPosition) + 40 > INT_MAX) { QMessageBox::critical(g.mw, QLatin1String("Mumble"), tr("Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually.")); return false; } for (int i = row; i <= ilast; i++) { Channel *tmp = pi->channelAt(i); if (tmp != dropped) { MumbleProto::ChannelState mpcs; mpcs.set_channel_id(tmp->iId); mpcs.set_position(tmp->iPosition + 40); g.sh->sendMessage(mpcs); } } inewpos = upper->iPosition + 20; } } } } if (inewpos > INT_MAX || inewpos < INT_MIN) { QMessageBox::critical(g.mw, QLatin1String("Mumble"), tr("Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually.")); return false; } MumbleProto::ChannelState mpcs; mpcs.set_channel_id(iId); if (dropped->parent() != c) mpcs.set_parent(c->iId); mpcs.set_position(static_cast(inewpos)); g.sh->sendMessage(mpcs); } return true; } void UserModel::updateOverlay() const { g.o->updateOverlay(); g.lcd->updateUserView(); } mumble-1.3.4/src/mumble/OverlayEditorScene.h0000664000175000017500000000371614010707273020637 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_OVERLAYEDITORSCENE_H_ #define MUMBLE_MUMBLE_OVERLAYEDITORSCENE_H_ #include #if QT_VERSION >= 0x050000 # include #else # include #endif #include "Settings.h" class OverlayEditorScene : public QGraphicsScene { private: Q_OBJECT Q_DISABLE_COPY(OverlayEditorScene) protected: QGraphicsItem *qgiGroup; QGraphicsPixmapItem *qgpiMuted; QGraphicsPixmapItem *qgpiAvatar; QGraphicsPixmapItem *qgpiName; QGraphicsPixmapItem *qgpiChannel; QGraphicsPathItem *qgpiBox; QGraphicsRectItem *qgriSelected; QGraphicsPixmapItem *qgpiSelected; int iDragCorner; Qt::WindowFrameSection wfsHover; unsigned int uiSize; void setup(); void contextMenuEvent(QGraphicsSceneContextMenuEvent *e) Q_DECL_OVERRIDE; void mousePressEvent(QGraphicsSceneMouseEvent *e) Q_DECL_OVERRIDE; void mouseMoveEvent(QGraphicsSceneMouseEvent *e) Q_DECL_OVERRIDE; void mouseReleaseEvent(QGraphicsSceneMouseEvent *e) Q_DECL_OVERRIDE; void updateCursorShape(const QPointF &point); void drawBackground(QPainter *, const QRectF &) Q_DECL_OVERRIDE; QGraphicsPixmapItem *childAt(const QPointF &); QRectF selectedRect() const; static Qt::WindowFrameSection rectSection(const QRectF &rect, const QPointF &point, qreal dist = 3.0f); public: Settings::TalkState tsColor; unsigned int uiZoom; OverlaySettings os; OverlayEditorScene(const OverlaySettings &, QObject *p = NULL); public slots: void resync(); void updateSelected(); void updateMuted(); void updateUserName(); void updateChannel(); void updateAvatar(); void moveMuted(); void moveUserName(); void moveChannel(); void moveAvatar(); void moveBox(); }; #endif mumble-1.3.4/src/mumble/UserInformation.ui0000664000175000017500000004555614010707273020413 0ustar builderbuilder UserInformation 0 0 379 401 User Information Connection Information Version 1 0 Qt::PlainText Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse OS 1 0 Qt::PlainText Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse Certificate 1 0 Qt::PlainText Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse IP Address 1 0 Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse CELT Versions 1 0 Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse false 0 0 150 16777215 Details... Opus Ping Statistics Pings received Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Average ping Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Ping deviation Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter TCP (Control) Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse UDP (Voice) Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse UDP Network statistics Good Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Late Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Lost Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Resync Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter From Client Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse To Client Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse % Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter % Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Bandwidth Connection time 1 0 Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse Bandwidth 1 0 Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse mumble-1.3.4/src/mumble/RichTextEditor.h0000664000175000017500000000422714010707273017770 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_RICHTEXTEDITOR_H_ #define MUMBLE_MUMBLE_RICHTEXTEDITOR_H_ #include #if QT_VERSION >= 0x050000 # include #else # include #endif class LogDocument; class RichTextHtmlEdit : public QTextEdit { private: Q_OBJECT Q_DISABLE_COPY(RichTextHtmlEdit) protected: void insertFromMimeData(const QMimeData *source); public: RichTextHtmlEdit(QWidget *p); private: LogDocument *m_document; }; #include "ui_RichTextEditor.h" #include "ui_RichTextEditorLink.h" class RichTextEditorLink : public QDialog, Ui::RichTextEditorLink { private: Q_OBJECT Q_DISABLE_COPY(RichTextEditorLink) public: RichTextEditorLink(const QString &text = QString(), QWidget *p = NULL); QString text() const; }; class RichTextEditor : public QTabWidget, Ui::RichTextEditor { private: Q_OBJECT Q_DISABLE_COPY(RichTextEditor) protected: bool bModified; bool bChanged; bool bReadOnly; void richToPlain(); QColor qcColor; bool eventFilter(QObject *obj, QEvent *event) Q_DECL_OVERRIDE; public: RichTextEditor(QWidget *p = NULL); QString text(); bool isModified() const; signals: /// The accept signal is emitted when Ctrl-Enter is pressed inside the RichTextEditor. void accept(); public slots: void setText(const QString &text, bool readonly = false); void updateColor(const QColor &); void updateActions(); protected slots: void on_qaBold_triggered(bool); void on_qaItalic_triggered(bool); void on_qaUnderline_triggered(bool); void on_qaColor_triggered(); void on_qaLink_triggered(); void on_qaImage_triggered(); void on_qptePlainText_textChanged(); void on_qteRichText_textChanged(); void on_qteRichText_cursorPositionChanged(); void on_qteRichText_currentCharFormatChanged(); void onCurrentChanged(int); }; class RichTextImage { public: static bool isValidImage(const QByteArray &buf, QByteArray &fmt); }; #endif mumble-1.3.4/src/mumble/WASAPINotificationClient.h0000664000175000017500000000431614010707274021561 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_WASAPINOTIFICATIONCLIENT_H_ #define MUMBLE_MUMBLE_WASAPINOTIFICATIONCLIENT_H_ #include #include #include /** * @brief Singleton for acting on WASAPINotification events for given devices. */ class WASAPINotificationClient : public QObject, public IMMNotificationClient { Q_OBJECT public: /* IMMNotificationClient interface */ HRESULT STDMETHODCALLTYPE OnDefaultDeviceChanged(EDataFlow flow, ERole role, LPCWSTR pwstrDefaultDevice); HRESULT STDMETHODCALLTYPE OnPropertyValueChanged(LPCWSTR pwstrDeviceId, const PROPERTYKEY key); HRESULT STDMETHODCALLTYPE OnDeviceAdded(LPCWSTR pwstrDeviceId); HRESULT STDMETHODCALLTYPE OnDeviceRemoved(LPCWSTR pwstrDeviceId); HRESULT STDMETHODCALLTYPE OnDeviceStateChanged(LPCWSTR pwstrDeviceId, DWORD dwNewState); HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, VOID **ppvInterface); ULONG STDMETHODCALLTYPE AddRef(); ULONG STDMETHODCALLTYPE Release(); /* Enlist/Unlist functionality */ void enlistDefaultDeviceAsUsed(LPCWSTR pwstrDefaultDevice); void enlistDeviceAsUsed(LPCWSTR pwstrDevice); void enlistDeviceAsUsed(const QString& device); void unlistDevice(LPCWSTR pwstrDevice); void clearUsedDefaultDeviceList(); void clearUsedDeviceLists(); /** * @return Singleton instance reference. */ static WASAPINotificationClient& get(); private: WASAPINotificationClient(); ~WASAPINotificationClient() Q_DECL_OVERRIDE; WASAPINotificationClient(const WASAPINotificationClient&); WASAPINotificationClient& operator=(const WASAPINotificationClient&); static WASAPINotificationClient& doGet(); static void doGetOnce(); void restartAudio(); /* _fu = Non locking versions */ void _clearUsedDeviceLists(); void _enlistDeviceAsUsed(const QString& device); QStringList usedDefaultDevices; QStringList usedDevices; IMMDeviceEnumerator *pEnumerator; LONG _cRef; QMutex listsMutex; signals: void doResetAudio(); }; #endif // WASAPINOTIFICATIONCLIENT_H_ mumble-1.3.4/src/mumble/BonjourClient.h0000664000175000017500000000122714010707273017641 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_BONJOURCLIENT_H_ #define MUMBLE_MUMBLE_BONJOURCLIENT_H_ #include class BonjourServiceBrowser; class BonjourServiceResolver; class BonjourClient : public QObject { private: Q_OBJECT Q_DISABLE_COPY(BonjourClient) public: BonjourClient(); ~BonjourClient() Q_DECL_OVERRIDE; BonjourServiceBrowser *bsbBrowser; BonjourServiceResolver *bsrResolver; }; #endif mumble-1.3.4/src/mumble/CrashReporter.cpp0000664000175000017500000001742714010707273020213 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "CrashReporter.h" #include "Global.h" #include "NetworkConfig.h" #include "OSInfo.h" #include "EnvUtils.h" CrashReporter::CrashReporter(QWidget *p) : QDialog(p) { setWindowTitle(tr("Mumble Crash Report")); QVBoxLayout *vbl= new QVBoxLayout(this); QLabel *l; l = new QLabel(tr("

We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?

" "

The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.

")); vbl->addWidget(l); QHBoxLayout *hbl = new QHBoxLayout(); qleEmail = new QLineEdit(g.qs->value(QLatin1String("crashemail")).toString()); l = new QLabel(tr("Email address (optional)")); l->setBuddy(qleEmail); hbl->addWidget(l); hbl->addWidget(qleEmail, 1); vbl->addLayout(hbl); qteDescription=new QTextEdit(); l->setBuddy(qteDescription); l = new QLabel(tr("Please describe briefly, in English, what you were doing at the time of the crash")); vbl->addWidget(l); vbl->addWidget(qteDescription, 1); QPushButton *pbOk = new QPushButton(tr("Send Report")); pbOk->setDefault(true); QPushButton *pbCancel = new QPushButton(tr("Don't send report")); pbCancel->setAutoDefault(false); QDialogButtonBox *dbb = new QDialogButtonBox(Qt::Horizontal); dbb->addButton(pbOk, QDialogButtonBox::AcceptRole); dbb->addButton(pbCancel, QDialogButtonBox::RejectRole); connect(dbb, SIGNAL(accepted()), this, SLOT(accept())); connect(dbb, SIGNAL(rejected()), this, SLOT(reject())); vbl->addWidget(dbb); qelLoop = new QEventLoop(this); qpdProgress = NULL; qnrReply = NULL; } CrashReporter::~CrashReporter() { g.qs->setValue(QLatin1String("crashemail"), qleEmail->text()); delete qnrReply; } void CrashReporter::uploadFinished() { qpdProgress->reset(); if (qnrReply->error() == QNetworkReply::NoError) { if (qnrReply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() == 200) QMessageBox::information(NULL, tr("Crash upload successful"), tr("Thank you for helping make Mumble better!")); else QMessageBox::critical(NULL, tr("Crash upload failed"), tr("We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer.").arg(qnrReply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt()).arg(qnrReply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString())); } else { QMessageBox::critical(NULL, tr("Crash upload failed"), tr("This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1").arg(qnrReply->error())); } qelLoop->exit(0); } void CrashReporter::uploadProgress(qint64 sent, qint64 total) { qpdProgress->setMaximum(static_cast(total)); qpdProgress->setValue(static_cast(sent)); } void CrashReporter::run() { QByteArray qbaDumpContents; QFile qfCrashDump(g.qdBasePath.filePath(QLatin1String("mumble.dmp"))); if (! qfCrashDump.exists()) return; qfCrashDump.open(QIODevice::ReadOnly); #if defined(Q_OS_WIN) /* On Windows, the .dmp file is a real minidump. */ if (qfCrashDump.peek(4) != "MDMP") return; qbaDumpContents = qfCrashDump.readAll(); #elif defined(Q_OS_MAC) /* * On OSX, the .dmp file is simply a dummy file that we * use to find the *real* crash dump, made by the OSX * built in crash reporter. */ QFileInfo qfiDump(qfCrashDump); QDateTime qdtModification = qfiDump.lastModified(); /* Find the real crash report. */ QDir qdCrashReports(QDir::home().absolutePath() + QLatin1String("/Library/Logs/DiagnosticReports/")); if (! qdCrashReports.exists()) { qdCrashReports = QDir::home().absolutePath() + QLatin1String("/Library/Logs/CrashReporter/"); } QStringList qslFilters; qslFilters << QString::fromLatin1("Mumble_*.crash"); qdCrashReports.setNameFilters(qslFilters); qdCrashReports.setSorting(QDir::Time); QFileInfoList qfilEntries = qdCrashReports.entryInfoList(); /* * Figure out if our delta is sufficiently close to the Apple crash dump, or * if something weird happened. */ foreach(QFileInfo fi, qfilEntries) { qint64 delta = qAbs(qdtModification.secsTo(fi.lastModified())); if (delta < 8) { QFile f(fi.absoluteFilePath()); f.open(QIODevice::ReadOnly); qbaDumpContents = f.readAll(); break; } } #endif QString details; #ifdef Q_OS_WIN { QTemporaryFile qtf; if (qtf.open()) { qtf.close(); QProcess qp; QStringList qsl; qsl << QLatin1String("/t"); qsl << qtf.fileName(); QString app = QLatin1String("dxdiag.exe"); QString systemRoot = EnvUtils::getenv(QLatin1String("SystemRoot")); if (systemRoot.count() > 0) { app = QDir::fromNativeSeparators(systemRoot + QLatin1String("/System32/dxdiag.exe")); } qp.start(app, qsl); if (qp.waitForFinished(30000)) { if (qtf.open()) { QByteArray qba = qtf.readAll(); details = QString::fromLocal8Bit(qba); } } else { details = QLatin1String("Failed to run dxdiag"); } qp.kill(); } } #endif if (qbaDumpContents.isEmpty()) { qWarning("CrashReporter: Empty crash dump file, not reporting."); return; } if (exec() == QDialog::Accepted) { qpdProgress = new QProgressDialog(tr("Uploading crash report"), tr("Abort upload"), 0, 100, this); qpdProgress->setMinimumDuration(500); qpdProgress->setValue(0); connect(qpdProgress, SIGNAL(canceled()), qelLoop, SLOT(quit())); QString boundary = QString::fromLatin1("---------------------------%1").arg(QDateTime::currentDateTime().toTime_t()); QString os = QString::fromLatin1("--%1\r\nContent-Disposition: form-data; name=\"os\"\r\nContent-Transfer-Encoding: 8bit\r\n\r\n%2 %3\r\n").arg(boundary, OSInfo::getOS(), OSInfo::getOSVersion()); QString ver = QString::fromLatin1("--%1\r\nContent-Disposition: form-data; name=\"ver\"\r\nContent-Transfer-Encoding: 8bit\r\n\r\n%2 %3\r\n").arg(boundary, QLatin1String(MUMTEXT(MUMBLE_VERSION_STRING)), QLatin1String(MUMBLE_RELEASE)); QString email = QString::fromLatin1("--%1\r\nContent-Disposition: form-data; name=\"email\"\r\nContent-Transfer-Encoding: 8bit\r\n\r\n%2\r\n").arg(boundary, qleEmail->text()); QString descr = QString::fromLatin1("--%1\r\nContent-Disposition: form-data; name=\"desc\"\r\nContent-Transfer-Encoding: 8bit\r\n\r\n%2\r\n").arg(boundary, qteDescription->toPlainText()); QString det = QString::fromLatin1("--%1\r\nContent-Disposition: form-data; name=\"details\"\r\nContent-Transfer-Encoding: 8bit\r\n\r\n%2\r\n").arg(boundary, details); QString head = QString::fromLatin1("--%1\r\nContent-Disposition: form-data; name=\"dump\"; filename=\"mumble.dmp\"\r\nContent-Type: binary/octet-stream\r\n\r\n").arg(boundary); QString end = QString::fromLatin1("\r\n--%1--\r\n").arg(boundary); QByteArray post = os.toUtf8() + ver.toUtf8() + email.toUtf8() + descr.toUtf8() + det.toUtf8() + head.toUtf8() + qbaDumpContents + end.toUtf8(); QUrl url(QLatin1String("https://crash-report.mumble.info/v1/report")); QNetworkRequest req(url); req.setHeader(QNetworkRequest::ContentTypeHeader, QString::fromLatin1("multipart/form-data; boundary=%1").arg(boundary)); req.setHeader(QNetworkRequest::ContentLengthHeader, QString::number(post.size())); Network::prepareRequest(req); qnrReply = g.nam->post(req, post); connect(qnrReply, SIGNAL(finished()), this, SLOT(uploadFinished())); connect(qnrReply, SIGNAL(uploadProgress(qint64, qint64)), this, SLOT(uploadProgress(qint64, qint64))); qelLoop->exec(QEventLoop::DialogExec); } if (! qfCrashDump.remove()) qWarning("CrashReporeter: Unable to remove crash file."); } mumble-1.3.4/src/mumble/AudioStats.h0000664000175000017500000000316214010707273017144 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_AUDIOSTATS_H_ #define MUMBLE_MUMBLE_AUDIOSTATS_H_ #include #include #include #if QT_VERSION >= 0x050000 # include #else # include #endif class AudioBar : public QWidget { private: Q_OBJECT Q_DISABLE_COPY(AudioBar) protected: void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE; public: AudioBar(QWidget *parent = NULL); int iMin, iMax; int iBelow, iAbove; int iValue, iPeak; QColor qcBelow, qcInside, qcAbove; QList qlReplacableColors; QList qlReplacementBrushes; }; class AudioEchoWidget : public QWidget { private: Q_OBJECT Q_DISABLE_COPY(AudioEchoWidget) public: AudioEchoWidget(QWidget *parent); protected slots: void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE; }; class AudioNoiseWidget : public QWidget { private: Q_OBJECT Q_DISABLE_COPY(AudioNoiseWidget) public: AudioNoiseWidget(QWidget *parent); protected slots: void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE; }; #include "ui_AudioStats.h" class AudioStats : public QDialog, public Ui::AudioStats { private: Q_OBJECT Q_DISABLE_COPY(AudioStats) protected: QTimer *qtTick; bool bTalking; public: AudioStats(QWidget *parent); ~AudioStats() Q_DECL_OVERRIDE; public slots: void on_Tick_timeout(); }; #else class AudioStats; #endif mumble-1.3.4/src/mumble/ConfigWidget.cpp0000664000175000017500000000313614010707273017771 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "ConfigWidget.h" QMap *ConfigRegistrar::c_qmNew; ConfigRegistrar::ConfigRegistrar(int priority, ConfigWidgetNew n) { if (! c_qmNew) c_qmNew = new QMap(); iPriority = priority; c_qmNew->insert(priority,n); } ConfigRegistrar::~ConfigRegistrar() { c_qmNew->remove(iPriority); if (c_qmNew->isEmpty()) { delete c_qmNew; c_qmNew = NULL; } } ConfigWidget::ConfigWidget(Settings &st) : s(st) { } QIcon ConfigWidget::icon() const { return qApp->windowIcon(); } void ConfigWidget::accept() const { } void ConfigWidget::loadSlider(QSlider *slider, int v) { if (v != slider->value()) { slider->setValue(v); } else { connect(this, SIGNAL(intSignal(int)), slider, SIGNAL(valueChanged(int))); emit intSignal(v); disconnect(SIGNAL(intSignal(int))); } } void ConfigWidget::loadCheckBox(QAbstractButton *c, bool v) { if (v != c->isChecked()) { c->setChecked(v); } else { connect(this, SIGNAL(intSignal(int)), c, SIGNAL(stateChanged(int))); emit intSignal(v ? 1 : 0); disconnect(SIGNAL(intSignal(int))); } } void ConfigWidget::loadComboBox(QComboBox *c, int v) { if (c->currentIndex() != v) { c->setCurrentIndex(v); } else { connect(this, SIGNAL(intSignal(int)), c, SIGNAL(currentIndexChanged(int))); emit intSignal(v); disconnect(SIGNAL(intSignal(int))); } } mumble-1.3.4/src/mumble/G15LCDEngine_lglcd.cpp0000664000175000017500000001117414010707273020573 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "G15LCDEngine_lglcd.h" #define G15_MAX_DEV 5 #define G15_MAX_WIDTH 160 #define G15_MAX_HEIGHT 43 #define G15_MAX_BPP 1 #define G15_MAX_FBMEM (G15_MAX_WIDTH * G15_MAX_HEIGHT * G15_MAX_BPP) #define G15_MAX_FBMEM_BITS (G15_MAX_FBMEM / 8) #if defined(WIN32) #define G15_WIDGET_NAME L"Mumble G15 Display" #elif defined(APPLE) #define G15_WIDGET_NAME CFSTR("Mumble G15 Display") #endif static LCDEngine *G15LCDEngineNew() { return new G15LCDEngineLGLCD(); } static LCDEngineRegistrar registrar(G15LCDEngineNew); G15LCDEngineLGLCD::G15LCDEngineLGLCD() : LCDEngine() { DWORD dwErr; ZeroMemory(&llcceConnect, sizeof(llcceConnect)); ZeroMemory(&llcContext, sizeof(llcContext)); llcceConnect.appFriendlyName = G15_WIDGET_NAME; llcceConnect.isAutostartable = FALSE; llcceConnect.isPersistent = FALSE; llcceConnect.dwAppletCapabilitiesSupported =LGLCD_APPLET_CAP_BASIC | LGLCD_APPLET_CAP_BW; llcceConnect.connection = LGLCD_INVALID_CONNECTION; llcContext.device = LGLCD_INVALID_DEVICE; dwErr = lgLcdInit(); if (dwErr != ERROR_SUCCESS) { qWarning() << "LGLCD: Unable to initialize Logitech LCD library" << dwErr; return; } dwErr = lgLcdConnectEx(&llcceConnect); if (dwErr != ERROR_SUCCESS) { qWarning() << "LGLCD: Unable to connect to Logitech LCD manager" << dwErr; return; } qlDevices << new G15LCDDeviceLGLCD(this); QMetaObject::connectSlotsByName(this); } G15LCDEngineLGLCD::~G15LCDEngineLGLCD() { if (llcContext.device != LGLCD_INVALID_DEVICE) { lgLcdClose(llcContext.device); llcContext.device = LGLCD_INVALID_DEVICE; } if (llcceConnect.connection != LGLCD_INVALID_CONNECTION) { lgLcdDisconnect(llcceConnect.connection); llcceConnect.connection = LGLCD_INVALID_CONNECTION; } lgLcdDeInit(); } QList G15LCDEngineLGLCD::devices() const { return qlDevices; } /* -- */ G15LCDDeviceLGLCD::G15LCDDeviceLGLCD(G15LCDEngineLGLCD *e) : LCDDevice(), bEnabled(false) { engine = e; } G15LCDDeviceLGLCD::~G15LCDDeviceLGLCD() { } bool G15LCDDeviceLGLCD::enabled() { return bEnabled; } void G15LCDDeviceLGLCD::setEnabled(bool b) { bEnabled = b; if (bEnabled && (engine->llcContext.device == LGLCD_INVALID_DEVICE)) { ZeroMemory(&engine->llcContext, sizeof(engine->llcContext)); engine->llcContext.connection = engine->llcceConnect.connection; engine->llcContext.device = LGLCD_INVALID_DEVICE; engine->llcContext.deviceType =LGLCD_DEVICE_BW; DWORD dwErr = lgLcdOpenByType(&engine->llcContext); } else if (! bEnabled && (engine->llcContext.device != LGLCD_INVALID_DEVICE)) { lgLcdClose(engine->llcContext.device); engine->llcContext.device = LGLCD_INVALID_DEVICE; } } void G15LCDDeviceLGLCD::blitImage(QImage *img, bool alert) { Q_ASSERT(img); int len = G15_MAX_FBMEM_BITS; uchar *tmp = img->bits(); lgLcdBitmap160x43x1 bitmap; unsigned char *buf = bitmap.pixels; if (engine->llcContext.device == LGLCD_INVALID_DEVICE) return; if (! bEnabled) return; /* * The amount of copying/conversion we're doing is hideous. * * To draw to the LCD display using Logitech's SDK, we need to pass * it a byte array (in which each byte represents a single pixel on * the LCD.) * * Unfortunately, there's no way out, really. We *could* perhaps draw * directly to a monochrome "bytemap" (via Format_Indexed8, and a mono- * chrome colormap), but QPainter simply doesn't want to draw to a * QImage of Format_Indexed8. * * (What's even worse is that the byte array passed to the Logitech SDK * isn't even the native format of the LCD. It has to convert it once * more, when it receives a frame.) */ for (int i = 0; i < len; i++) { int idx = i*8; buf[idx+7] = tmp[i] & 0x80 ? 0xff : 0x00; buf[idx+6] = tmp[i] & 0x40 ? 0xff : 0x00; buf[idx+5] = tmp[i] & 0x20 ? 0xff : 0x00; buf[idx+4] = tmp[i] & 0x10 ? 0xff : 0x00; buf[idx+3] = tmp[i] & 0x08 ? 0xff : 0x00; buf[idx+2] = tmp[i] & 0x04 ? 0xff : 0x00; buf[idx+1] = tmp[i] & 0x02 ? 0xff : 0x00; buf[idx+0] = tmp[i] & 0x01 ? 0xff : 0x00; } bitmap.hdr.Format = LGLCD_BMP_FORMAT_160x43x1; DWORD dwErr = lgLcdUpdateBitmap(engine->llcContext.device, &bitmap.hdr, alert ? LGLCD_SYNC_UPDATE(LGLCD_PRIORITY_ALERT) : LGLCD_SYNC_UPDATE(LGLCD_PRIORITY_NORMAL)); } QString G15LCDDeviceLGLCD::name() const { return QString::fromLatin1("Logitech Gamepanel"); } QSize G15LCDDeviceLGLCD::size() const { return QSize(G15_MAX_WIDTH, G15_MAX_HEIGHT); } mumble-1.3.4/src/mumble/XboxInput.h0000664000175000017500000000522014010707274017022 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_XBOXINPUT_H_ #define MUMBLE_MUMBLE_XBOXINPUT_H_ #include #include #include /// XBOXINPUT_MAX_DEVICES defines the maximum /// number of devices that can be connected /// to the system at once. /// /// In typical operation, one calls GetState() /// in a loop bounded by XBOXINPUT_MAX_DEVICES. #define XBOXINPUT_MAX_DEVICES 4 /// XBOXINPUT_TRIGGER_THRESHOLD defines the thresold /// that an analog trigger (leftTrigger and /// rightTrigger of XboxInputState) must have exceeded /// in order to count as a button press. #define XBOXINPUT_TRIGGER_THRESHOLD 30 /// XboxInputState represents the state of an /// Xbox controller as returned by GetState(). struct XboxInputState { uint32_t packetNumber; uint16_t buttons; uint8_t leftTrigger; uint8_t rightTrigger; uint16_t leftThumbX; uint16_t leftThumbY; uint16_t rightThumbY; uint16_t rightThumbX; uint32_t paddingReserved; // Required for XInputGetStateEx. Not required for XInputGetState. }; typedef uint32_t (WINAPI *XboxInputGetStateFunc)(uint32_t deviceIndex, XboxInputState *state); /// XboxInput is an XInput wrapper that dynamically loads an appropriate /// xinput*.dll on construction and provides access to its GetState(Ex) /// function. class XboxInput { public: XboxInput(); virtual ~XboxInput(); /// s_XboxInputGuid is the GUID used by GlobalShortcut_win /// to distinguish XboxInputLibrary's events from other event /// soures. static const QUuid s_XboxInputGuid; /// isValid determines wheter the XboxInputLibrary /// is usable. bool isValid() const; /// Query the state of the Xbox controller at deviceIndex. /// If the function succeeds, it returns 0 (Windows's ERROR_SUCCESS). /// If no device is connected, it returns 0x48F (Windows's ERROR_DEVICE_NOT_CONNECTED). XboxInputGetStateFunc GetState; protected: /// m_getStateFunc represents XInputGetState from the XInput DLL. XboxInputGetStateFunc m_getStateFunc; /// m_getStateFuncEx represents XInputGetStateEx, which is optionally /// available in the XInput DLL. XboxInputGetStateFunc m_getStateExFunc; /// m_xinputlib is the handle to the XInput DLL as returned by /// LoadLibrary. HMODULE m_xinputlib; /// m_valid determines whether or not the XboxInputLibrary /// is valid for use. bool m_valid; }; #endif mumble-1.3.4/src/mumble/mumble_pch.hpp0000664000175000017500000000624014010707274017540 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef Q_MOC_RUN #ifndef MUMBLE_MUMBLE_MUMBLE_PCH_H_ #define MUMBLE_MUMBLE_MUMBLE_PCH_H_ #define QT_NO_CAST_TO_ASCII #define QT_NO_CAST_FROM_ASCII #define QT_USE_FAST_CONCATENATION #define QT_USE_FAST_OPERATOR_PLUS #define NOMINMAX #define WIN32_LEAN_AND_MEAN #define BOOST_TYPEOF_SUPPRESS_UNNAMED_NAMESPACE #ifdef __APPLE__ #include #include #include #undef nil #undef check #undef TYPE_BOOL #endif #ifdef __MINGW32__ // Our MinGW build targets Windows 7 for now. // Set up the appropriate Windows macros such that // MinGW's Windows headers expose all the functionality // we need. #define _WIN32_WINNT 0x0601 #define NTDDI_VERSION NTDDI_WIN7 #include #endif #include #include #if QT_VERSION >= 0x050000 # include "Qt4Compat.h" # include #endif #include #ifdef USE_DBUS #include #endif #include #include #include #ifdef Q_OS_WIN #define ENABLE_SNDFILE_WINDOWS_PROTOTYPES 1 #endif #include #include #ifdef USE_SBCELT #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "Utils.h" #ifdef Q_OS_WIN #include "../qos2_mingw.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #else // ifndef Q_OS_WIN #include #include #include #include #include #include #endif #if !defined(Q_OS_OPENBSD) && (defined(__MMX__) || defined(Q_OS_WIN)) #include #endif #ifdef USE_BONJOUR #include #endif #ifdef __OBJC__ #define nil 0 #endif #include #include #include #include #include #include #include /* OpenSSL defines set_key. This breaks our protobuf-generated setters. */ #undef set_key #endif #endif mumble-1.3.4/src/mumble/GlobalShortcutTarget.ui0000664000175000017500000001635114010707273021361 0ustar builderbuilder GlobalShortcutTarget 0 0 421 310 Whisper Target Whisper to list of Users 1 Channel Target 10 true true true Name Restrict to Group If specified, only members of this group will receive the whisper. The whisper will also be transmitted to linked channels. Shout to Linked channels The whisper will also be sent to the subchannels of the channel target. Shout to subchannels List of users Add Remove Qt::Vertical 20 94 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok Shout to Channel Modifiers Do not send positional audio information when using this whisper shortcut. Ignore positional audio qrbUsers qrbChannel qlwUsers qcbUser qpbAdd qpbRemove qtwChannels qleGroup qcbLinks qcbChildren qcbForceCenter qbbButtons qbbButtons accepted() GlobalShortcutTarget accept() 227 290 157 274 qbbButtons rejected() GlobalShortcutTarget reject() 295 296 286 274 MUComboBox QComboBox
widgets/MUComboBox.h
mumble-1.3.4/src/mumble/mumble_lt.ts0000664000175000017500000126005514010707274017253 0ustar builderbuilder ACLEditor Deny Drausti Allow Leisti Allow %1 Leisti %1 Deny %1 Drausti %1 Mumble - Add channel Mumble - Pridėti kanalą Default server value Numatytoji serverio reikšmė Failed: Invalid channel Nepavyko: Neteisingas kanalas Mumble - Edit %1 Mumble - Keisti %1 ID: %1 ID: %1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Channel must have a name Kanalas privalo turėti pavadinimą This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Dialog Dialogas Name Pavadinimas Enter the channel name here. Čia įrašykite kanalo pavadinimą. Description Aprašas Password Slaptažodis Enter the channel password here. Čia įrašykite kanalo slaptažodį. Check to create a temporary channel. Pažymėkite, kad sukurtumėte laikiną kanalą. Temporary Laikinas <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Pozicija</b><br/> Ši reikšmė leidžia jums keisti būdą, kuriuo Mumble išdėsto kanalus medyje. Kanalas su aukštesne <i>pozicijos</i> reikšme bus visada išdėstytas žemiau to, kurio reikšmė yra žemesnė, ir atvirkščiai. Jeigu dviejų kanalų <i>pozicijų</i> reikšmės vienodos, tuomet jie bus išdėstyti abėcėlės tvarka pagal savo pavadinimą. Position Pozicija &Groups &Grupės Group List of groups Grupių sąrašas Remove selected group Šalinti pasirinktą grupę Remove Šalinti Inherit group members from parent Inherit Make group inheritable to sub-channels Inheritable Group was inherited from parent channel Inherited Members Add Pridėti Add member to group Pridėti narį į grupę Remove member from group Šalinti narį iš grupės &ACL Active ACLs List of entries Inherit ACL of parent? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. Inherit ACLs Move entry up Perkelti įrašą aukštyn This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. &Up A&ukštyn Move entry down Nuleisti įrašą žemyn This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. &Down Ž&emyn Add new entry Pridėti naują įrašą This adds a new entry, initially set with no permissions and applying to all. &Add &Pridėti Remove entry Šalinti įrašą This removes the currently selected entry. Tai pašalina šiuo metu pasirinktą įrašą. &Remove Ša&linti Context Kontekstas Entry should apply to this channel. Entry should apply to this channel Įrašas turėtų būti taikomas šiam kanalui. This makes the entry apply to this channel. Tai padaro, kad įrašas būtų pritaikytas šiam kanalui. Applies to this channel Taikoma šiam kanalui Entry should apply to sub-channels. Add new group Pridėti naują grupę <b>Add</b><br/> Add a new group. Inherited members Contains the list of members added to the group by this channel. Contains a list of members whose group membership will not be inherited from the parent channel. Contains the list of members inherited by other channels. Type in the name of a user you wish to add to the group and click Add. Type in the name of a user you wish to remove from the group and click Add. Exclude Excluded members This makes the entry apply to sub-channels of this channel. Applies to sub-channels Permissions Leidimai User/Group Naudotojas/Grupė Group this entry applies to Grupė, kuriai taikomas šis įrašas User ID Naudotojo ID User this entry applies to Naudotojas, kuriam taikomas šis įrašas This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. Tai valdo, kuriam naudotojui šis įrašas bus taikomas. Tiesiog, įrašykite naudotojo vardą ir paspauskite enter, norėdami užklausti serverio atitikmens. &Properties Savy&bės <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>Pavadinimas</b><br />Šiame lauke įrašykite kanalo pavadinimą. Pavadinime turi būti laikomasi serverio, prie kurio esate prisijungę, priskirtų apribojimų. <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>Laikinas</b><br /> Jei pažymėta, sukurtas kanalas bus pažymėtas kaip laikinas. Tai reiškia, kad kai paskutinis žaidėjas išeis iš kanalo, serveris automatiškai kanalą ištrins. <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. ID of the channel. Kanalo ID. Maximum Users Maximum number of users allowed in the channel <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. This is the sort order for the channel. ALSAAudioInput Default ALSA Card Numatytoji ALSA plokštė Opening chosen ALSA Input failed: %1 Nepavyko atverti pasirinktos ALSA įvesties: %1 ALSAAudioOutput Default ALSA Card Numatytoji ALSA plokštė Opening chosen ALSA Output failed: %1 Nepavyko atverti pasirinktos ALSA išvesties: %1 ASIOConfig %1 (version %2) %1 (versija %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz ASIO Initialization failed: %1 ASIO inicijavimas nepavyko: %1 Failed to instantiate ASIO driver ASIO ASIO Device selection Įrenginio pasirinkimas Device Įrenginys Device to use for microphone This chooses what device to query. You still need to actually query the device and select which channels to use. Query selected device This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Query Configure selected device This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Configure &Konfigūruoti Capabilities Driver name Tvarkyklės pavadinimas Buffer size Buferio dydis This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. Configure input channels Channels Kanalai Microphone Mikrofonas <- <- -> -> Unused Speakers Garsiakalbiai ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. Opening selected ASIO device failed. No input will be done. AboutDialog About Mumble Apie Mumble <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> <h3>Mumble (%1)</h3><p>%3</p><p><b>Balso pokalbių paslaugų programa, skirta žaidėjams</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble &Apie Mumble &License &Licencija A&uthors A&utoriai &Third-Party Licenses &Trečiųjų šalių licencijos OK Gerai AudioInput Interface Sąsaja System Sistema Input method for audio Garso įvesties metodas <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Tai yra garsui naudojamas įvesties metodas.</b><br />Greičiausiai, jūs norėtumėte naudoti DirectSound. Device Įrenginys Input device for audio Garso įvesties įrenginys <b>This is the input device to use for audio.</b> <b>Tai yra garsui naudojamas įvesties įrenginys.</b> Transmission Perdavimas &Transmit Perduo&ti When to transmit your speech Kada perdavinėti jūsų kalbą <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. DoublePush Time If you press the PTT key twice in this time it will get locked. <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. Reset audio cue to default Atstatyti garsinį orientyrą į numatytąjį <b>Reset</b><br/>Reset the paths for the files to their default. Browse for on audio file Browse for off audio file Off Išjungta On Įjungta Preview the audio cues Garsinių orientyrų peržiūra Use SNR based speech detection Signal to Noise <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. Amplitude Amplitudė Voice &Hold Balso &užlaikymas How long to keep transmitting after silence Kaip ilgai tęsti perdavimą po tylos Silence Below Tyla žemiau <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. Speech Above Kalba aukščiau Signal values above this count as voice Signalo reikšmės aukščiau šios ribos yra traktuojamos kaip balsas Compression Glaudinimas &Quality &Kokybė Quality of compression (peak bandwidth) Glaudinimo kokybė (didžiausioji siuntimo sparta) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. <b>Tai nustato glaudinimo kokybę.</b><br />Tai apibrėžia kokią siuntimo spartą programai Mumble yra leidžiama naudoti išsiunčiamam garsui. Audio per packet How many audio frames to send per packet <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). Audio Processing Garso apdorojimas Noise Suppression Triukšmo malšinimas Noise suppression Triukšmo malšinimas <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. Maximum amplification of input sound Didžiausias įvesties garso stiprinimas <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. Current speech detection chance Esama kalbos atpažinimo tikimybė Cancel echo from speakers Malšinti aidą iš garsiakalbių Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. Disabled Išjungta <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>Tai rodo esamus kalbos aptikimo nustatymus.</b><br />Jūs galite pakeisti nustatymus, pasinaudoję Nustatymų dialogu arba Garso vedikliu. Signal values below this count as silence Signalo reikšmės žemiau šios ribos yra traktuojamos kaip tyla Maximum bandwidth used for sending audio Use Amplitude based speech detection Naudoti amplitude pagrįstą kalbos aptikimą <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). Exclusive mode Išskirtinė veiksena <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>Tai atveria įrenginį išskirtinėje veiksenoje.</b><br />Jokia kita programa negalės naudoti šio įrenginio. Exclusive Išskirtinė R&eset At&statyti &Browse... &Naršyti... B&rowse... Na&ršyti... &Preview &Peržiūra <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. Displays an always on top window with a push to talk button in it Display push to talk window Misc Įvairūs Audible audio cue when starting or stopping to transmit Girdimas garso orientyras, kai perdavimas pradedamas ar sustabdomas <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. <b>Tai įjungia garsinius perdavimo orientyrus.</b><br />Tai nustačius, pradedant ir sustabdant perdavimą, girdėsite trumpą garsinį pyptelėjimą. Audio cue Garsinis orientyras Gets played when starting to transmit Gets played when stopping to transmit Hold Time Time the microphone stays open after the PTT key is released Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) Didžiausia serverio tinklo siuntimo sparta yra tik %1 kbit/s. Garso kokybė automatiškai sureguliuota į %2 kbit/s (%3 ms) Max. Amplification Didžiausias stiprinimas Idle action Veiksmas, esant neveiklumui minutes do minučių nothing nieko nedaryti deafen apkurtinti mute nutildyti after po Echo Cancellation Aido malšinimas Mixed echo cancellation Maišytas aido malšinimas Multichannel echo cancellation Daugiakanalis aido malšinimas The idle action will be reversed upon any key or mouse button input Undo Idle action upon activity Apply RNNoise's noise suppression filter. <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. RNNoise Audio input AudioInputDialog Continuous Nepertraukiamai Voice Activity Esant balso aktyvumui Push To Talk Audio Input Garso įvestis %1 ms %1 ms Off Išjungta %1 s %1 s %1 kb/s %1 kb/s -%1 dB -%1 dB %1 kbit/s (Audio %2, Position %4, Overhead %3) AudioOutput Interface Sąsaja System Sistema Output method for audio Garso išvesties metodas <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Įrenginys Output device for audio Garso išvesties įrenginys <b>This is the output device to use for audio.</b> Positional Audio Pozicinis garsas Audio Output Garso išvestis Default &Jitter Buffer Numatytasis &drebėjimo buferis Safety margin for jitter buffer Drebėjimo buferio saugumo riba <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. Minimum distance to user before sound volume decreases Mažiausias atstumas iki naudotojo prieš tai, kai garso garsis sumažės This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. Volume Garsis Volume of incoming speech Gaunamos kalbos garsis <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. Output Delay Išvesties delsa Amount of data to buffer Buferizuojamų duomenų kiekis The connected "speakers" are actually headphones The connected "speakers" are actually headphones. Prijungti "garsiakalbiai", iš tikrųjų, yra ausinės Factor for sound volume decrease Bloom Factor for sound volume increase How much should sound volume increase for sources that are really close? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Headphones Ausinės Minimum Distance Mažiausias atstumas Maximum Distance Didžiausias atstumas Maximum distance, beyond which speech volume won't decrease Didžiausias atstumas, kurį viršijus, kalbos garsis nemažės Minimum Volume Mažiausias garsis What should the volume be at the maximum distance? Koks turėtų būti garsis didžiausiame atstume? Loopback Test Delay Variance Variance in packet latency <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. Packet Loss Paketų praradimas Packet loss for loopback mode <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% &Loopback Desired loopback mode Attenuate applications by... Slopinti programas... Attenuation of other applications during speech Kitų programų slopinimas kalbos metu <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. If checked Mumble lowers the volume of other applications while other users talk Jei pažymėta, Mumble sumažina kitų programų garsį, kol kalba kiti naudotojai <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. while other users talk kol kiti naudotojai kalba If checked Mumble lowers the volume of other applications while you talk Jei pažymėta, Mumble sumažina kitų programų garsį, kol kalbate jūs <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. while you talk kol jūs kalbate Exclusive mode, not recommended. Išskirtinė veiksena, nerekomenduojama. <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>Tai atveria įrenginį išskirtinėje veiksenoje.</b><br />Jokia kita programa negalės naudoti šio įrenginio. Exclusive Išskirtinė Priority Speaker If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. Attenuate other users while talking as Priority Speaker. Advanced Attenuation Options Išplėstinės slopinimo parinktys If checked, Mumble will only attenuate applications that are using the same output source as Mumble Jei pažymėta, Mumble slopins tik tas programas, kurios naudoja tą patį išvesties šaltinį kaip ir Mumble <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. Only attenuate applications using the same output device Slopinti tik programas, naudojančias tą patį išvesties įrenginį If checked, PulseAudio loopback modules will be attenuated <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. Attenuate PulseAudio loopback modules Audio output AudioOutputDialog None Nėra Local Server Serveris Audio Output Garso išvestis %1 ms %1 ms %1 % %1 % %1 m %1 m AudioOutputSample Choose sound file Invalid sound file Neteisingas garso failas The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. Mumble negali naudoti failo "%1". Prašome pasirinkti suderinamo formato ir kodavimo failą. AudioStats >1000 ms >1000ms >1000 ms Audio Statistics Garso statistika Input Levels Įvesties lygiai Peak microphone level Maksimalus mikrofono lygis Peak power in last frame This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. Peak speaker level Maksimalus garsiakalbio lygis This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. Peak clean level This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. Signal Analysis Signalo analizė Microphone power Mikrofono galia How close the current input level is to ideal Ant kiek esamas įvesties lygis yra artimas tobulam This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. Signal-To-Noise ratio Signalo ir triukšmo santykis Signal-To-Noise ratio from the microphone Signalo ir triukšmo santykis iš mikrofono This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. Speech Probability Kalbos tikimybė Probability of speech Kalbos tikimybė This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). Configuration feedback Konfigūracijos grįžtamasis ryšys Current audio bitrate Esamas garso pralaidumas Bitrate of last frame DoublePush interval Time between last two Push-To-Talk presses Speech Detection Kalbos aptikimas Current speech detection chance Esama kalbos atpažinimo tikimybė <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>Tai rodo esamus kalbos aptikimo nustatymus.</b><br />Jūs galite pakeisti nustatymus, pasinaudoję Nustatymų dialogu arba Garso vedikliu. Signal and noise power spectrum Signalo ir triukšmo galios spektras Power spectrum of input signal and noise estimate Įvesties signalo ir triukšmo apytikrio apskaičiavimo galios spektras This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. Echo Analysis Aido analizė Weights of the echo canceller This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. AudioWizard Audio Tuning Wizard Garso suderinimo vediklis Introduction Įžanga Welcome to the Mumble Audio Wizard Sveiki atvykę į Mumble garso vediklį Finished Užbaigta Enjoy using Mumble Mėgaukitės, naudodamiesi Mumble Device selection Įrenginio pasirinkimas Selecting the input and output device to use with Mumble. Įvesties ir išvesties įrenginio, skirto naudoti su Mumble, pasirinkimas. This is the device your microphone is connected to. Tai įrenginys, prie kurio yra prijungtas jūsų mikrofonas. System Sistema Input method for audio Garso įvesties metodas <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Tai yra garsui naudojamas įvesties metodas.</b><br />Greičiausiai, jūs norėtumėte naudoti DirectSound. Device Įrenginys Input device to use Įvesties įrenginys, kurį naudoti <b>Selects which sound card to use for audio input.</b> <b>Pasirenka kurią garso plokštę naudoti garso įvesčiai.</b> Cancel echo from headset or speakers Malšinti aidą iš ausinių ar garsiakalbių Use echo cancellation Naudoti aido malšinimą This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. Tai įjungia aido malšinimą, kas savo ruožtu padeda naudojant tiek garsiakalbius, tiek ausines. This is the device your speakers or headphones are connected to. Tai įrenginys, prie kurio yra prijungti jūsų garsiakalbiai ar ausinės. Output method for audio Garso išvesties metodas <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. Output device to use Išvesties įrenginys, kurį naudoti <b>Selects which sound card to use for audio Output.</b> <b>Pasirenka kurią garso plokštę naudoti garso išvesčiai.</b> Enable positional audio Įjungti pozicinį garsą Allows positioning of sound Allows positioning of sound. Leidžia garso pozicionavimą <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> <p> Tai yra garso suderinimo vediklis, skirtas Mumble. Jis padės jums teisingai nustatyti garso plokštės įvesties lygius bei nustatyti teisingus garso apdorojimo parametrus programoje Mumble. </p> <p> Prašome turėti omenyje, kad tol, kol šis vediklis yra aktyvus, pakartotinai bus grojamas garsas tam, kad jūs galėtumėte jo klausytis, ir joks kitas garsas nebus siunčiamas į serverį. </p> Input Device Įvesties įrenginys Output Device Išvesties įrenginys This allows Mumble to use positional audio to place voices. Tai leidžia Mumble naudoti pozicinį garsą, kad išdėstytų balsus. <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> <p> Tam, kad būtų išlaikyta pati mažiausia delsa, yra svarbu kuo mažiau garso buferizuoti garso plokštei. Kita vertus, daugelis garso plokščių teigia, jog jos reikalauja žymiai mažesnio buferio, negu tas, su kuriuo jos iš tikrųjų gali veikti, taigi, vienintelis būdas kaip nustatyti šią reikšmę yra bandymų ir klaidų metodas. </p> <p> Jūs turėtumėte girdėti balso elementą. Keiskite žemiau esantį slinktuką į žemiausią reikšmę, kurią nustačius, garse negirdėsite <b>jokių</b> pertraukų ar drebėjimo. Turėkite omenyje, kad šio bandymo metu vietinis aidas yra išjungtas. </p> Amount of data to buffer Buferizuojamų duomenų kiekis This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> <p> Atverkite savo garso valdymo skydelį ir pereikite į įrašymo nustatymus. Įsitikinkite, kad mikrofonas yra pasirinktas kaip aktyvi įvestis su didžiausiu įrašymo garsiu. Jei ten yra parinktis, skirta įjungti "Mikrofono užkėlimą", įsitikinkite, kad ji pažymėta. </p> <p> Kalbėkite taip garsiai, lyg būtumėte susierzinę ar susijaudinę. Mažinkite garsį garso skydelyje tol, kol jums kalbant, žemiau esanti juosta neišliks kaip įmanoma aukščiau mėlynoje ir žalioje, bet <b>ne</b> raudonoje zonoje. </p> Positional Audio Pozicinis garsas Adjusting attenuation of positional audio. Pozicinio garso slopinimo reguliavimas. <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> <p> Mumble kai kuriuose žaidimuose palaiko pozicinį garsą ir nustatys kitų naudotojų balso padėtį, atsižvelgiant į jų padėtį žaidime. Priklausomai nuo kitų naudotojų vietos, bus keičiamas balso garsis tarp garsiakalbių, kad būtų simuliuojamas nuotolis ir kryptis, kurioje yra naudotojas. Toks padėties nustatymas priklauso nuo to, ar jūsų garsiakalbių konfigūracija operacinėje sistemoje yra teisinga, taigi, čia yra atliekamas bandymas. </p> <p> Žemiau esantis grafikas rodo <font color="red">jūsų</font>, <font color="yellow">garsiakalbių</font> ir <font color="green">judančio garso šaltinio</font> padėtį, žiūrint iš viršaus. Jūs turėtumėte girdėti kaip garsas juda tarp kanalų. </p> Use headphones instead of speakers Vietoj garsiakalbių, naudoti ausines <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> <p> Sveikiname. Dabar, su Mumble, jūs turėtumėte būti pasiruošę mėgautis turtingesniu garso patyrimu. </p> <p> Mumble yra pastoviai kuriama, o kūrimo komanda nori susitelkti ties tomis ypatybėmis, kurios pravers didžiajai daliai naudotojų. Dėl to, Mumble palaiko anoniminės statistikos, apie jūsų konfigūraciją, pateikimą kūrėjams. Ši statistika yra svarbi būsimam kūrimui, o taip pat užtikrina, kad ypatybės, kuriomis naudojatės, nebūtų apleistos. </p> Use headphones Naudoti ausines This ignores the OS speaker configuration and configures the positioning for headphones instead. Volume tuning Garsio suderinimas Tuning microphone hardware volume to optimal settings. Mikrofono aparatinės įrangos garsio suderinimas iki optimalių nustatymų. Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. Dabar kalbėkite taip švelniai, lyg kalbėtumėte vėlai naktį ir nenorėtumėte niekam sutrukdyti. Reguliuokite žemiau esantį slinktuką taip, kad jums kalbant, juosta pereitų į žalią zoną, tačiau jums tylint, išliktų mėlynoje zonoje. Voice Activity Detection Balso aktyvumo aptikimas Letting Mumble figure out when you're talking and when you're silent. Leidžiama Mumble išsiaiškinti kada jūs kalbate, o kada tylite. This will help Mumble figure out when you are talking. The first step is selecting which data value to use. Tai padės Mumble išsiaiškinti kada jūs kalbate. Pirmas žingsnis yra pasirinkti kokią duomenų reikšmę naudoti. Raw amplitude from input Neapdorota amplitudė iš įvesties Signal-To-Noise ratio Signalo ir triukšmo santykis Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Toliau jums reikia sureguliuoti šį slinktuką. Pirmi keli jūsų išsireiškimai turėtų atsidurti žalioje zonoje (tikrai kalbama). Kalbėdami, jūs turėtumėte išlikti geltonoje zonoje (galbūt kalbama), o jums nekalbant, viskas turėtų būti raudonoje zonoje (tikrai nekalbama). Device tuning Įrenginio suderinimas Changing hardware output delays to their minimum value. Aparatinės įrangos išvesties delsų į jų mažiausias reikšmes keitimas. Submit anonymous statistics to the Mumble project Pateikti Mumble projektui anoniminę statistiką Push To Talk: Quality & Notifications Kokybė ir pranešimai Adjust quality and notification settings. Sureguliuokite kokybės ir pranešimų nustatymus. Quality settings Kokybės nustatymai Low Žema Balanced Subalansuota Notification settings Pranešimų nustatymai Use Text-To-Speech to read notifications and messages to you. Naudoti garsinį teksto atkūrimą, kad jums būtų skaitomi pranešimai ir žinutės. Disable Text-To-Speech and use sounds instead. Išjungti garsinį teksto atkūrimą ir, vietoj to, naudoti garsus. %1 ms %1 ms Enables attenuation of other applications while users talk to you Įjungia kitų programų slopinimą tuo metu, kai kiti naudotojai jums kalba Attenuate applications while other users talk Slopinti programas, kol kiti naudotojai kalba High Aukšta Custom You already set a customized quality configuration in Mumble. Select this setting to keep it. Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. Apply some high contrast optimizations for visually impaired users Taikyti kai kuriuos kontrasto optimizavimus, skirtus silpnaregiams naudotojams Use high contrast graphics Naudoti aukšto kontrasto grafiką Keep custom Text-To-Speech settings. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) Šioje konfigūracijoje Mumble naudos <b>mažą siuntimo spartą</b>. Tai neišvengiamai prives prie didelės delsos ir prastos kokybės. Rinkitės šią parinktį tik tuo atveju, jeigu jūsų ryšys negali apdoroti kitų nustatymų. (16kbit/s, 60ms vienam paketui) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) Tai yra <b>rekomenduojama numatytoji</b> konfigūracija. Ji pateikia gerą pusiausvyrą tarp kokybės, delsos ir siuntimo spartos naudojimo. (40kbit/s, 20ms vienam paketui) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) Ši konfigūracija yra rekomenduojama tik toms sąrankoms, kuriose siuntimo sparta nėra problema, kaip pvz., vietiniame tinkle. Ji pateikia mažiausią Mumble palaikomą delsą ir <b>aukštą kokybę</b>. (72kbit/s, 10ms vienam paketui) BanEditor Mumble - Edit Bans Mumble - Taisyti uždraudimus &Address &Adresas &Mask Reason Priežastis Start End User Naudotojas Hash &Add &Pridėti &Update Atna&ujinti &Remove Ša&linti Ban List Užraudimų sąrašas Search field This is the search field. Use it to find bans that have this username set in the username field. Who are you looking for? Ko ieškote? No nickname IP address IP adresas No IP address Reason for the ban Uždraudimo priežastis No reason Ban end date Uždraudimo pabaigos data Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). Uždraudimo pabaigos data. Jeigu nustatysite tokią pačią pradžios ir pabaigos datą, tuomet uždraudimas bus nuolatinis (jo galiojimas nesibaigs). Certificate hash Liudijimo maiša No certificate hash Banned users Uždrausti naudotojai This is a list with banned users. Tai yra sąrašas su uždraustais naudotojais. Use this button if you want to add a new ban. Naudokite šį mygtuką, jeigu norite pridėti naują uždraudimą. Use this button if you want to update ban information. Naudokite šį mygtuką, jeigu norite atnaujinti uždraudimo informaciją. Use this button if you want to remove user from the ban list. Naudokite šį mygtuką, jeigu norite pašalinti naudotoją iš uždraudimų sąrašo. Clear all fields Išvalyti visus laukus This button clears all fields. Use it if you want to add a new ban. Šis mygtukas išvalo visus laukus. Naudokite jį, jeigu norite pridėti naują uždraudimą. Clear Išvalyti Ban List - %n Ban(s) Uždraudimų sąrašas - %n uždraudimasUždraudimų sąrašas - %n uždraudimaiUždraudimų sąrašas - %n uždraudimųUždraudimų sąrašas - %n uždraudimų CertView Name Vardas Email El. paštas Issuer Išdavėjas Expiry Date Galioja iki (none) (joks) Self-signed Paties pasirašytas CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. There was an error generating your certificate.<br />Please try again. Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. The file could not be opened for writing. Please use another file. Nepavyko atverti failą rašymui. Naudokite kitą failą. The file's permissions could not be set. No certificate and key has been written. Please use another file. The file could not be written successfully. Please use another file. Nepavyko sėkmingai įrašyti failą. Naudokite kitą failą. The file could not be opened for reading. Please use another file. Nepavyko atverti failą skaitymui. Naudokite kitą failą. The file is empty or could not be read. Please use another file. Failas tuščias arba jo nepavyko perskaityti. Naudokite kitą failą. The file did not contain a valid certificate and key. Please use another file. Select file to export certificate to Pasirinkite failą į kurį eksportuoti liudijimą Select file to import certificate from Pasirinkite failą iš kurio importuoti liudijimą Unable to import. Missing password or incompatible file type. Nepavyko importuoti. Trūksta slaptažodžio arba nesuderinamas failo tipas. <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. Certificates Certificate Management Liudijimų tvarkymas Certificate Authentication Tapatybės nustatymas liudijimu Authenticating to servers without using passwords Tapatybės nustatymas serveriuose, nenaudojant slaptažodžių Current certificate Esamas liudijimas This is the certificate Mumble currently uses. Tai yra liudijimas, kurį Mumble šiuo metu naudoja. Current Certificate Esamas liudijimas Create a new certificate Sukurti naują liudijimą This will create a new certificate. Tai sukurs naują liudijimą. Import certificate from file Importuoti liudijimą iš failo This will import a certificate from file. Tai importuos liudijimą iš failo. Import a certificate Importuoti liudijimą Export Certificate Eksportuoti liudijimą This will export a certificate to file. Tai eksportuos liudijimą į failą. Export current certificate Eksportuoti esamą liudijimą Import Certificate Importuoti liudijimą PKCS #12 Certificate import PKCS #12 liudijimo importavimas <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble gali importuoti liudijimus, kurie yra saugomi PKCS #12 formatu. Tai yra formatas, kuris naudojamas eksportuojant raktą iš Mumble, o taip pat eksportuojant raktus iš Firefox, Internet Explorer, Opera ir t.t.</p><p>Jeigu failas yra apsaugotas slaptažodžiu, norint importuoti liudijimą, jums prireiks slaptažodžio.</p> Import from Importuoti iš Filename to import from Failo, iš kurio importuoti, pavadinimas This is the filename you wish to import a certificate from. Tai yra failo, iš kurio norite importuoti liudijimą, pavadinimas. Select file to import from This opens a file selection dialog to choose a file to import a certificate from. Tai atveria failo pasirinkimo dialogą, skirtą pasirinkti failą, iš kurio importuoti liudijimą. Open... Atverti... Password Slaptažodis Password for PKCS#12 file Slaptažodis, skirtas PKCS#12 failui This is the password for the PKCS#12 file containing your certificate. Tai yra PKCS#12 failo, kuriame yra jūsų liudijimas, slaptažodis. Certificate to import Liudijimas, kurį importuoti This is the certificate you are importing. Tai yra liudijimas, kurį importuojate. Certificate Details Išsamesnė liudijimo informacija Replace Certificate Pakeisti liudijimą Replace existing certificate with new certificate? Pakeisti esamą liudijimą nauju liudijimu? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> <p>Jūs jau turite programoje Mumble saugomą liudijimą ir jūs ketinate jį pakeisti.</p> <p>Jeigu jūs naujinate į liudijimą, kurį jums išdavė patikima LĮ, ir el. pašto adresai sutampa su jūsų dabartiniu liudijimu, tuomet tai yra visiškai saugu, ir serveriai, prie kurių jungsitės automatiškai atpažins jūsų el. paštui skirtą stiprų liudijimą. </p> <p>Jeigu tai nėra anksčiau paminėtas atvejis, tuomet jūs daugiau nebūsite atpažįstami jokio serverio, kuriame ankščiau buvote nustatę savo tapatybę. Jeigu jūs dar iki šiol nebuvote užsiregistravę jokiame serveryje, tuomet jums nėra dėl ko rūpintis. </p> <p> Ar tikrai norite pakeisti savo liudijimą? </p> This is the certificate Mumble currently uses. It will be replaced. Tai yra liudijimas, kurį Mumble šiuo metu naudoja. Jis bus pakeistas. New certificate Naujas liudijimas This is the new certificate that will replace the old one. Tai yra naujas liudijimas, kuris pakeis seną. New Certificate Naujas liudijimas Make a backup of your certificate Padarykite atsarginę savo liudijimo kopiją Export to Eksportuoti į Filename to export to Failo, į kurį eksportuoti, pavadinimas This is the filename you wish to export a certificate to. Tai yra failo, į kurį norite eksportuoti liudijimą, pavadinimas. Save As... Įrašyti kaip... This is the certificate Mumble currently uses. It will be exported. Tai yra liudijimas, kurį šiuo metu naudoja Mumble. Jis bus eksportuotas. Generate a new certificate for strong authentication Sukurkite naują liudijimą, skirtą tvirtam tapatybės nustatymui <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> <p>Dabar Mumble sukurs tvirtą liudijimą, skirtą tapatybės nustatymui serveriuose.</p><p>Jei norite, galite pateikti papildomą informaciją, kuria bus papildytas jūsų liudijimas, kuris bus pateikiamas serveriams, kuomet prisijungsite. Jeigu pateiksite teisingą el. pašto adresą, vėliau galėsite atsinaujinti į LĮ išduotą el. pašto liudijimą, kuris pateikia tvirtą identifikavimą.</p> Name Vardas Email El. paštas Your email address (e.g. johndoe@mumble.info) Jūsų el. pašto adresas (pvz., johndoe@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. Your name (e.g. John Doe) Jūsų vardas (pvz., Jonas Do) This is your name, and will be filled out in the certificate. This field is entirely optional. Finish Pabaiga Certificate-based authentication is ready for use Liudijimu grįstas atpažinimas yra paruoštas naudoti Enjoy using Mumble with strong authentication. Automatic certificate creation Automatinis liudijimo kūrimas <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>Jeigu kada nors prarasite savo esamą liudijimą (kas gali nutikti tuo atveju, jeigu jūsų kompiuteris patirs aparatinės įrangos gedimą arba jūs savo kompiuteryje iš naujo įdiegsite programinę įrangą), tuomet jūs daugiau nebegalėsite jokiame serveryje, kuriame esate užsiregistravę, patvirtinti savo tapatybę. Štai kodėl yra <b>privaloma</b>, kad jūs sukurtumėte atsarginę savo liudijimo kopiją. Mes primygtinai rekomenduojame, kad šią atsarginę kopiją laikytumėte keičiamajame įrenginyje, tokiame kaip USB atmintukas.</p> <p>Turėkite omenyje, kad šis failas nebus užšifruotas, taigi, jeigu koks nors asmuo gaus prie jo prieigą, jis galės apsimesti jumis, todėl kaip reikiant pasirūpinkite šiuo failu.</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> ChanACL None Traverse Enter Speak Mute/Deafen Make channel Kurti kanalą Make temporary Link channel This represents no privileges. This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. This represents the permission to write text messages to other users in this channel. This represents the permission to forcibly remove users from the server. This represents the permission to permanently remove users from the server. This represents the permission to register and unregister users on the server. This represents the permission to register oneself on the server. Whisper Move Perkelti Text message Kick Išmesti Ban Uždrausti Register User Registruoti naudotoją Register Self Registruoti save Write ACL ChatbarTextEdit Paste and &Send Paste and send Įdėti ir &siųsti <center>Type chat message here</center> ClientUser Friend Draugas Authenticated Priority speaker Recording Įrašymas Muted (server) Deafened (server) Local Ignore (Text messages) Local Mute Muted (self) Deafened (self) ConfigDialog Accept changes Priimti pakeitimus This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. Reject changes Atmesti pakeitimus This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. Šis mygtukas atmes visus pakeitimus ir sugrąžins į programą.<br />Nustatymai bus atstatyti į ankstesnes reikšmes. Apply changes Pritaikyti pakeitimus This button will immediately apply all changes. Šis mygtukas nedelsiant pritaikys visus pakeitimus. Undo changes for current page Atšaukti pakeitimus esamame puslapyje This button will revert any changes done on the current page to the most recent applied settings. Šis mygtukas sugrąžins visus esamame puslapyje atliktus pakeitimus į paskiausiai pritaikytus nustatymus. Restore defaults for current page Atkurti esamo puslapio numatytąsias reikšmes This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. Šis mygtukas atkurs visus esamo puslapio numatytuosius nustatymus. Kiti puslapiai nebus pakeisti.<br />Norėdami atkurti visus nustatymus į numatytąsias reikšmes, turėsite nuspausti šį mygtuką kiekviename puslapyje. Mumble Configuration Mumble konfigūracija ConnectDialog Connecting to %1 Jungiamasi prie %1 Enter username Įrašykite naudotojo vardą Adding host %1 Servername Serverio pavadinimas Hostname Bonjour name Port Prievadas Addresses Adresai Website Tinklalapis Packet loss Paketų praradimas Ping (80%) Ping (80%) %1 ms %1 ms Ping (95%) Ping (95%) Bandwidth Siuntimo sparta %1 kbit/s %1 kbit/s &Connect Prisi&jungti &Filters Unknown Users Naudotojų Version Versija Failed to fetch server list Nepavyko gauti serverių sąrašo Mumble Server Connect Mumble prisijungimas prie serverio Ping Ping Remove from Favorites Šalinti iš mėgstamų Add custom server Show all servers that respond to ping Rodyti visus serverius, kurie atsako į ping Show all servers with users Rodyti visus serverius su naudotojais Show all servers Rodyti visus serverius &Copy &Kopijuoti Copy favorite link to clipboard &Paste Į&dėti Paste favorite from clipboard &Edit... &Taisyti... &Add New... &Pridėti naują... Add to &Favorites Pridėti į &mėgstamus Open &Webpage Atverti &tinklalapį Show &Reachable Show &Populated Show &All ConnectDialogEdit Edit Server Taisyti serverį Name of the server Serverio pavadinimas A&ddress A&dresas Internet address of the server. Internet address of the server. Internetinis serverio adresas. <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. &Port &Prievadas Port on which the server is listening Prievadas, ties kuriuo serveris klausosi <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. &Username Na&udotojo vardas Username to send to the server Naudotojo vardas, kurį siųsti į serverį <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. Label Etiketė Add Server Pridėti serverį You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 Password Slaptažodis Password to send to the server Slaptažodis, kurį siųsti į serverį <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. Show password Rodyti slaptažodį <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. Local server label Vietinio serverio etiketė 127.0.0.1 127.0.0.1 64738 64738 Your username Jūsų naudotojo vardas Your password Jūsų slaptažodis &Fill CoreAudioSystem Default Device Numatytasis įrenginys CrashReporter Mumble Crash Report Mumble strigties ataskaita <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> <p><b>Labai apgailestaujame, tačiau atrodo, kad Mumble užstrigo. Ar norite Mumble kūrėjams išsiųsti strigties ataskaitą?</b></p><p>Strigties ataskaitoje yra dalinė Mumble atminties kopija strigties metu ir ji padės kūrėjams pataisyti problemą.</p> Email address (optional) El. pašto adresas (nebūtina) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash Prašome trumpai, anglų kalba aprašyti ką darėte, kai programa užstrigo Send Report Siųsti ataskaitą Don't send report Nesiųsti ataskaitos Crash upload successful Strigties įkėlimas sėkmingas Thank you for helping make Mumble better! Dėkojame, kad padedate padaryti Mumble geresnę! Crash upload failed Strigties įkėlimas nepavyko We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 Uploading crash report Abort upload Nutraukti įkėlimą DXAudioInput Default DirectSound Voice Input Numatytoji DirectSound balso įvestis Opening chosen DirectSound Input device failed. No microphone capture will be done. Opening chosen DirectSound Input failed. Default device will be used. Pasirinktos DirectSound įvesties atvėrimas nepavyko. Bus naudojamas numatytasis įrenginys. Lost DirectSound input device. DXAudioOutput Default DirectSound Voice Output Opening chosen DirectSound Output failed. Default device will be used. Pasirinktos DirectSound išvesties atvėrimas nepavyko. Bus naudojamas numatytasis įrenginys. Lost DirectSound output device. Opening chosen DirectSound Output failed. No audio will be heard. Database Mumble failed to initialize a database in any of the possible locations. The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. Duomenų bazė "%1" yra tik skaitymui. Mumble negali saugoti serverio nustatymų (pvz., SSL liudijimų) tol, kol nepataisysite šios problemos. DeveloperConsole Developer Console Kūrėjo pultas DockTitleBar Drag here Vilkite čia GlobalShortcut Shortcuts Trumpiniai List of configured shortcuts Konfigūruotų trumpinių sąrašas Function Funkcija Data Duomenys Shortcut Trumpinys Suppress Add new shortcut Pridėti naują trumpinį This will add a new global shortcut Tai pridės naują visuotinį trumpinį &Add &Pridėti Remove selected shortcut Šalinti pasirinktą trumpinį This will permanently remove a selected shortcut. Tai negrįžtamai pašalins pasirinktą trumpinį. &Remove Ša&linti <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> Open Accessibility Preferences Skip Praleisti Enable Global Shortcuts Įjungti visuotinius trumpinius <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. Additional Shortcut Engines <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. Enable Windows hooks <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. Enable GKey <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. Enable XInput Įjungti XInput <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. Enable shortcuts in privileged applications GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> Shortcuts Trumpiniai Shortcut button combination. Trumpinio mygtukų kombinacija. <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. <b>Tai yra visuotinė trumpinio kombinacija.</b><br />Spustelėkite šį lauką, o tuomet nuspauskite norimą klavišų/mygtukų kombinaciją, kad susietumėte. Spustelėkite du kartus, kad išvalytumėte. Suppress keys from other applications <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. GlobalShortcutTarget Whisper Target Whisper to list of Users Channel Target Restrict to Group If specified, only members of this group will receive the whisper. List of users Naudotojų sąrašas Add Pridėti Remove Šalinti Modifiers Do not send positional audio information when using this whisper shortcut. Ignore positional audio Nepaisyti pozicinio garso Shout to Linked channels Shout to subchannels Shout to Channel The whisper will also be transmitted to linked channels. The whisper will also be sent to the subchannels of the channel target. GlobalShortcutX Mouse %1 Pelė %1 JackAudioSystem Hardware Ports Mono Mono Stereo Stereo LCD Not connected LCDConfig Enable this device Įjungti šį įrenginį LCD LCD Devices Įrenginiai Name <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> Size Dydis Enabled Įjungta Views Minimum Column Width Mažiausias stulpelio plotis <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> This setting decides the width of column splitter. Splitter Width Log Debug Critical Warning Įspėjimas Information Informacija Server Connected Prisijungta prie serverio Server Disconnected Atsijungta nuo serverio Other self-muted/deafened Permission Denied Leidimas atmestas Text Message Tekstinė žinutė User Joined Server Naudotojas atėjo į serverį User Left Server Naudotojas išėjo iš serverio User recording state changed User kicked (you or by you) Naudotojas išmestas (jūs išmestas arba jus išmetė) User kicked Naudotojas išmestas You self-muted User muted (you) User muted (by you) User muted (other) User Joined Channel Naudotojas atėjo į kanalą User Left Channel Naudotojas išėjo iš kanalo You self-unmuted You self-deafened You self-undeafened User renamed You Joined Channel You Joined Channel (moved) User connected and entered channel User left channel and disconnected Private text message the server Serveris [[ Invalid size ]] [[ Neteisingas dydis ]] [[ Text object too large to display ]] [Date changed to %1] [Data pasikeitė į %1] link to %1 nuoroda į %1 FTP link to %1 FTP nuoroda į %1 player link channel link %1 link LogConfig Toggle console for %1 events Toggle pop-up notifications for %1 events Toggle Text-To-Speech for %1 events Click here to toggle sound notification for %1 events Toggle window highlight (if not active) for %1 events Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. Messages Žinutės Message Žinutė Console Pultas Notification Pranešimas Text-To-Speech Garsinis teksto atkūrimas Soundfile Garso failas Path Kelias Text To Speech Garsinis teksto atkūrimas Volume Garsis Volume of Text-To-Speech Engine Garsinio teksto atkūrimo modulio garsis <b>This is the volume used for the speech synthesis.</b> Length threshold Ilgio slenkstis Message length threshold for Text-To-Speech Engine <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. Characters simbolių Whisper Šnabždesys If checked you will only hear whispers from users you added to your friend list. Jei pažymėta, jūs girdėsite šnabždesius tik iš naudotojų, kurie yra pridėti į jūsų draugų sąrašą. Only accept whispers from friends Priimti šnabždesius tik iš draugų If enabled text messages you send will be read back to you with TTS Read back own messages Chat Log Pokalbių žurnalas Maximum chat length Didžiausias pokalbio ilgis Unlimited Neribota Lines eilučių Highlight LookConfig System default Sistemos numatytoji None Nėra Only with users Tik su naudotojais All Visus Ask Klausti Do Nothing Nieko nedaryti Move Perkelti <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory <a href="%1">Naršyti</a> User Interface Naudotojo sąsaja This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. List users above subchannels (requires restart). <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. Users above Channels <b>If set, will verify you want to quit if connected.</b> <b>Jei nustatyta, jums išeinant ir vis dar tebesant prisijungus, bus klausiama patvirtinimo.</b> Show number of users in each channel Rodyti kiekviename kanale naudotojų skaičių Show channel user count Rodyti kanalo naudotojų skaičių Language Kalba Language to use (requires restart) Kalba, kurią naudoti (reikalauja paleidimo iš naujo) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. <b>Tai nustato, kurią kalbą turėtų naudoti Mumble.</b><br />Tam, kad naudotumėte naują kalbą, turite iš naujo paleisti Mumble. Look and Feel Išvaizda ir turinys Layout Išdėstymas Classic Klasikinis Stacked Hybrid Hibridinis Custom This changes the behavior when moving channels. Tai keičia elgseną, perkeliant kanalus. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. Tai nustato kanalų tempimo elgseną; tai gali būti naudojama, kad būtų neleistas atsitiktinis tempimas. <i>Perkelti</i> perkelia kanalą, neklausiant. <i>Nieko nedaryti</i> nieko nedaro ir parodo klaidos žinutę. <i>Klausti</i> naudoja žinutės langelį, kad patvirtintų, ar jūs tikrai norėjote perkelti kanalą. Expand Išskleisti When to automatically expand channels Kada automatiškai išskleisti kanalus Channel Dragging Kanalų tempimas Ask whether to close or minimize when quitting Mumble. Išeinant iš Mumble, klausti ar programą užverti ar suskleisti. Ask on quit while connected Klausti išeinant, kai tebeesama prisijungta Always On Top Visada viršuje <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> Hide in tray when minimized Suskleidus, slėpti į dėklą Hide the main Mumble window in the tray when it is minimized. Suskleidus pagrindinį Mumble langą, slėpti jį į dėklą This setting controls when the application will be always on top. Šis nustatymas valdo, kada programa bus visada viršuje. Never Niekada Always Visada In minimal view Minimaliame rodinyje In normal view Normaliame rodinyje Displays talking status in system tray Rodo kalbėjimo būseną sistemos dėkle Show talking status in tray icon Rodyti dėklo piktogramoje kalbėjimo būseną This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. Show context menu in menu bar Rodyti meniu juostoje kontekstinį meniu Apply some high contrast optimizations for visually impaired users Taikyti kai kuriuos kontrasto optimizavimus, skirtus silpnaregiams naudotojams Optimize for high contrast Optimizuoti aukštam kontrastui Application Programa Adds user and channel context menus into the menu bar Prideda į meniu juostą naudotojo ir kanalo kontekstinius meniu Tray Icon Dėklo piktograma Channel Tree Kanalų medis Use selected item as the chat bar target Filter automatically hides empty channels Filtras automatiškai slepia tuščius kanalus Show transmit mode dropdown in toolbar Theme Tema Theme to use to style the user interface Tema, kurią naudoti, siekiant stilizuoti naudotojo sąsają <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. User Dragging This changes the behavior when moving users. Tai keičia elgseną, perkeliant naudotojus. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. Tai nustato naudotojų tempimo elgseną; tai gali būti naudojama, kad būtų neleistas atsitiktinis tempimas. <i>Perkelti</i> perkelia naudotoją, neklausiant. <i>Nieko nedaryti</i> nieko nedaro ir parodo klaidos žinutę. <i>Klausti</i> naudoja žinutės langelį, kad patvirtintų, ar jūs tikrai norėjote perkelti naudotoją. <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. Enable Developer menu Įjungti kūrėjo meniu When in custom layout mode, checking this disables rearranging. Lock layout Užrakinti išdėstymą MainWindow Root Push-to-Talk Global Shortcut Push and hold this button to send voice. Global Shortcut This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut Reset Audio Processor Global Shortcut Atstatyti garso doroklę Unlink Plugin Global Shortcut Atsieti įskiepį Push-to-Mute Global Shortcut Join Channel Global Shortcut Prisijungti prie kanalo Toggle Overlay Global Shortcut Perjungti perdangą Toggle state of in-game overlay. Global Shortcut Toggle Minimal Global Shortcut Volume Up (+10%) Global Shortcut Pagarsinti (+10%) Volume Down (-10%) Global Shortcut Patildyti (-10%) Mumble Mumble Mumble -- %1 Mumble -- %1 &Window &Langas Minimize Suskleisti Ctrl+M Ctrl+M Close Užverti Mumble is currently connected to a server. Do you want to Close or Minimize it? Programa Mumble šiuo metu yra prisijungusi prie serverio. Norite programą užverti ar suskleisti? Mute Self Global Shortcut Set self-mute status. Global Shortcut This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut Deafen Self Global Shortcut Set self-deafen status. Global Shortcut This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut Whisper/Shout Whisper <center>Not connected</center> Not connected <center>Neprisijungta</center> Clear Išvalyti Opening URL %1 Atveriamas URL %1 File does not exist Failo nėra File is not a configuration file. Failas nėra konfigūracijos failas. Settings merged from file. Nustatymai sulieti iš failo. URL scheme is not 'mumble' URL schema nėra 'mumble' This version of Mumble can't handle URLs for Mumble version %1.%2.%3 Ši Mumble versija negali apdoroti URL, skirtus Mumble versijai %1.%2.%3 Connecting to %1 Jungiamasi prie %1 Enter username Connecting to server %1. Jungiamasi prie serverio %1. Reconnecting. Jungiamasi iš naujo. Transmit Mode set to Continuous <p>%1 (%2)<br />%3</p> <p>%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> <h2>Balso kanalas</h2><p>Užšifruota su 128 bitų OCB-AES128<br />%1 ms vidutinė delsa (%4 nuokrypis)</p> Register yourself as %1 Užsiregistruoti kaip %1 <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <p>Jūs ruošiatės užsiregistruoti šiame serveryje. Šis veiksmas negalės būti atšauktas ir, kai tai atliksite, negalėsite keisti savo naudotojo vardą. Jūs visiems laikams šiame serveryje būsite žinomi kaip "%1".</p><p>Ar tikrai norite užsiregistruoti?</p> <h2>Version</h2><p>Protocol %1</p> <h2>Versija</h2><p>Protokolas %1</p> <p>No build information or OS version available</p> <p>Nėra prieinamos darinio informacijos ar OS versijos</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) Ryšys yra užšifruotas bei tapatybė nustatyta, naudojant %1 ir ryšys naudoja %2 kaip rakto mainų mechanizmą (%3) The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) Ryšys yra užšifruotas, naudojant %1, su %2, skirtu žinučių tapatybės nustatymui ir %3 kaip rakto mainų mechanizmu (%4) The connection is secured by the cipher suite that OpenSSL identifies as %1 <p>The connection provides perfect forward secrecy</p> <p>The connection does not provide perfect forward secrecy</p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> <h2>Valdymo kanalas</h2><p>Ryšys naudoja %1</p>%2%3<p>%4 ms vidutinė delsa (%5 nuokrypis)</p><p>Nuotolinis serveris %6 (prievadas %7)</p> Voice channel is sent over control channel Balso kanalas yra siunčiamas per valdymo kanalą Register user %1 <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> Kicking user %1 Išmetamas naudotojas %1 Banning user %1 Uždraudžiamas naudotojas %1 View comment on user %1 Rodomas naudotojo %1 komentaras Message to channel %1 Connected. Prisijungta. <li>Expected certificate digest (SHA-1): %1</li> <li>Tikėtina liudijimo maišos reikšmė (SHA-1): %1</li> Server presented a certificate which failed verification. Serveris pateikė liudijimą, kuris nepraėjo patikrinimo. <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> SSL Version mismatch SSL versijos neatitikimas Server connection failed. <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>Rašykite žinutę į kanalą "%1" čia</center> <center>Type message to user '%1' here</center> Type message to user '%1' here <center>Čia įrašykite žinutę, skirta naudotojui "%1"</center> Choose image file Failed to load image Nepavyko įkelti paveikslo Could not open file for reading. Nepavyko atverti failo skaitymui. Image format not recognized. Neatpažintas atvaizdo formatas. &User Na&udotojas &Channel &Kanalas Use in conjunction with Whisper to. Global Shortcut This will switch the states of the in-game overlay. Global Shortcut Link Channel Global Shortcut Cycle Transmit Mode Global Shortcut Set Transmit Mode to Push-To-Talk Global Shortcut Set Transmit Mode to Continuous Global Shortcut Set Transmit Mode to VAD Global Shortcut Send Text Message Global Shortcut Send Clipboard Text Message Global Shortcut This will send your Clipboard content to the channel you are currently in. Global Shortcut Continuous Nepertraukiamai Voice Activity Push-to-Talk Mumble - Minimal View -- %1 Mumble - Minimalus rodinys -- %1 Cancel Atsisakyti Save Image As... Įrašyti paveikslą kaip... Save Image File Įrašyti paveikslo failą Could not save image: %1 Nepavyko įrašyti paveikslo: %1 Change your comment Keiskite savo komentarą Transmit Mode set to Voice Activity Transmit Mode set to Push-to-Talk <p>Connected users: %1/%2</p> <p>Prisijungusių naudotojų: %1/%2</p> UDP Statistics UDP statistika To Server Į serverį From Server Iš serverio Good Gerai Late Pavėluota Lost Prarasta Resync <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> <h2>Garso siuntimo sparta</h2><p>Didžiausia %1 kbit/s<br />Esama %2 kbit/s<br />Kodekas: %3</p> Mumble Server Information Mumble serverio informacija &View Certificate Ž&iūrėti liudijimą Enter reason Sending message to %1 Siunčiama žinutė naudotojui %1 To %1: %2 Skirta %1: %2 Message to %1 Žinutė, skirta %1 Are you sure you want to reset the comment of user %1? Ar tikrai norite atstatyti naudotojo %1 komentarą? Are you sure you want to reset the avatar of user %1? Ar tikrai norite atstatyti naudotojo %1 avatarą? Are you sure you want to delete %1 and all its sub-channels? Sending message to channel %1 Siunčiama žinutė į kanalą %1 Message to tree %1 To %1 (Tree): %2 (Tree) %1: %2 Unmuted and undeafened. Unmuted. Muted. Nutildyta. Muted and deafened. Deafened. Undeafened. Restart Mumble? Paleisti Mumble iš naujo? Some settings will only apply after a restart of Mumble. Restart Mumble now? Kai kurie nustatymai bus pritaikyti tik iš naujo paleidus Mumble. Paleisti Mumble iš naujo dabar? About Qt Apie Qt SSL Verification failed: %1 SSL patikrinimas nepavyko: %1 <li>Server certificate digest (SHA-1): %1</li> <li>Serverio liudijimo maišos reikšmė (SHA-1): %1</li> <b>WARNING:</b> The server presented a certificate that was different from the stored one. This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. Šis serveris naudoja senesnį šifravimo standartą ir daugiau yra nebepalaikomas šiuolaikinių Mumble versijų. Server connection failed: %1. Prisijungimas prie serverio nepavyko: %1. Disconnected from server. Atsijungta nuo serverio. Invalid username Neteisingas naudotojo vardas You connected with an invalid username, please try another one. Jūs prisijungėte su neteisingu naudotojo vardu, prašome pabandyti kitą. Username in use Naudotojo vardas yra naudojamas That username is already in use, please try another username. Šis naudotojas vardas jau yra naudojamas, prašome pabandyti kitą naudotojo vardą. Wrong certificate or password Neteisingas liudijimas ar slaptažodis Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. Wrong password Neteisingas slaptažodis Wrong server password for unregistered user account, please try again. Images (*.png *.jpg *.jpeg) Paveikslai (*.png *.jpg *.jpeg) C&onfigure K&onfigūruoti &Help &Pagalba Log Žurnalas This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. &Quit Mumble &Išeiti iš Mumble Closes the program Užveria programą Exits the application. Išeina iš programos. Ctrl+Q Ctrl+Q Open the server connection dialog Atverti serverio prisijungimo dialogą &Disconnect &Atsijungti Disconnect from server Atsijungti nuo serverio Disconnects you from the server. Atjungia jus nuo serverio. Show information about the server connection Rodyti informaciją apie serverio ryšį This will show extended information about the connection to the server. Tai parodys išplėstinę informaciją apie ryšį su serveriu. &Mute &Deafen &Local Mute Send a Text Message Sends a text message to another user. Siunčia tekstinę žinutę kitam naudotojui. Add new channel Pridėti naują kanalą This adds a new sub-channel to the currently selected channel. Remove channel Šalinti kanalą This removes a channel and all sub-channels. Edit Groups and ACL for channel This opens the Group and ACL dialog for the channel, to control permissions. &Link Link your channel to another channel This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. Chatbar Shows a dialog of registered servers, and also allows quick-connect. Kick user (with reason) Išmesti naudotoją (su priežastimi) Kick selected user off server. You'll be asked to specify a reason. Išmesti pasirinktą naudotoją iš serverio. Jūsų bus paprašyta nurodyti priežastį. Mute user Mute or unmute user on server. Unmuting a deafened user will also undeafen them. Kick and ban user (with reason) Išmesti ir uždrausti naudotoją (su priežastimi) Kick and ban selected user from server. You'll be asked to specify a reason. Išmesti pasirinktą naudotoją iš serverio ir jį uždrausti. Jūsų bus paprašyta nurodyti priežastį. Deafen user Deafen or undeafen user on server. Deafening a user will also mute them. Mute user locally Mute or unmute user locally. Use this on other users in the same room. This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. &Unlink Channel Unlink your channel from another channel This unlinks your current channel from the selected channel. Unlinks your channel from all linked channels. This unlinks your current channel (not the selected one) from all linked channels. &Reset &Atstatyti Reset audio preprocessor Atstatyti parengiamąją doroklę This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. &Mute Self &Nutildyti save Mute yourself Nutildyti save Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. &Deafen Self &Apkurtinti save Deafen yourself Apkurtinti save Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. &Text-To-Speech Garsinis &teksto atkūrimas Toggle Text-To-Speech Perjungti garsinį teksto atkūrimą Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. Display audio statistics Rodyti garso statistiką Pops up a small dialog with information about your current audio input. Parodo nedidelį dialogą su informacija apie jūsų esamą garso įvestį. Forcibly unlink plugin Priverstinai atsieti įskiepį This forces the current plugin to unlink, which is handy if it is reading completely wrong data. Tai priverstinai atsieja esamą įskiepį, kas praverčia tuo atveju, jei įskiepis skaito visiškai neteisingus duomenis. Configure Mumble Konfigūruoti Mumble Allows you to change most settings for Mumble. Leidžia jums keisti didžiąją Mumble nustatymų dalį. Start the audio configuration wizard Paleisti garso konfigūravimo vediklį This will guide you through the process of configuring your audio hardware. Tai vadovaus jums per jūsų garso aparatinės įrangos konfigūravimo procesą. &What's This? &Kas tai? Enter What's This? mode Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. Information about Mumble Informacija apie Mumble Shows a small dialog with information and license for Mumble. Information about Speex Informacija apie Speex Shows a small dialog with information about Speex. Rodo mažą dialogą su informacija apie Speex. Information about Qt Informacija apie Qt Shows a small dialog with information about Qt. Rodo mažą dialogą su informacija apie Qt. Check for &Updates Tikrinti ar yra atna&ujinimų Check for new version of Mumble Tikrinti ar yra nauja Mumble versija Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. Sends a text message to all users in a channel. Siunčia tekstinę žinutę visiems naudotojams kanale. Configure certificates for strong authentication This starts the wizard for creating, importing and exporting certificates for authentication against servers. Register user on server Registruoti naudotoją serveryje This will permanently register the user on the server. Tai ilgam užregistruos naudotoją serveryje. Add &Friend Pridėti &draugą Adds a user as your friend. Prideda naudotoją kaip jūsų draugą. This will add the user as a friend, so you can recognize him on this and other servers. Tai pridės naudotoją kaip draugą, taigi, galėsite jį atpažinti šiame bei kituose serveriuose. &Remove Friend Ša&linti draugą Removes a user from your friends. Pašalina naudotoją iš jūsų draugų. This will remove a user from your friends list. Tai pašalins naudotoją iš jūsų draugų sąrašo. &Update Friend Atna&ujinti draugą Update name of your friend. Atnaujinti jūsų draugo vardą. Your friend uses a different name than what is in your database. This will update the name. Jūsų draugas naudoją kitą vardą, nei tas kuris yra jūsų duomenų bazėje. Tai atnaujins jo vardą. Edit registered users list Redaguoti registruotų naudotojų sąrašą This opens the editor for registered users, which allow you to change their name or unregister them. Tai atveria registruotų naudotojų redaktorių, leidžiantį jums keisti naudotojų vardus ar juos išregistruoti. Add or remove text-based access tokens &Minimal View &Minimalus rodinys Toggle minimal window modes Perjungti minimalią lango veikseną This will toggle minimal mode, where the log window and menu is hidden. Tai perjungs minimalią veikseną, tokią, kurioje žurnalo langas ir meniu yra paslėpti. You muted and deafened %1. You unmuted and undeafened %1. You undeafened %1. You suppressed %1. %1 muted and deafened by %2. %1 unmuted and undeafened by %2. %1 undeafened by %2. %1 suppressed by %2. %1 moved to %2. Naudotojas %1 perkeltas į %2. %1 moved to %2 by %3. %3 perkėlė naudotoją %1 į %2. %1 moved in from %2 by %3. %3 perkėlė %1 iš %2. %1 is now muted and deafened. Your account information can not be verified currently. Please try again later Welcome message: %1 Pasisveikinimo žinutė: %1 Mumble: %1 Mumble: %1 You were denied %1 privileges in %2. Jums buvo uždraustas leidimas %1, kanale %2. %3 was denied %1 privileges in %2. %3 buvo uždraustas leidimas %1, kanale %2. Denied: Cannot modify SuperUser. Denied: Invalid channel name. Atmesta: Neteisingas kanalo pavadinimas. Denied: Text message too long. Atmesta: Teksto žinutė yra per ilga. Denied: Operation not permitted in temporary channel. Atmesta: Laikiname kanale operacija nėra leidžiama. You need a certificate to perform this operation. Jums reikalingas liudijimas, norint atlikti šią operaciją. %1 does not have a certificate. %1 neturi liudijimo. Invalid username: %1. Neteisingas naudotojo vardas: %1. Invalid username. Neteisingas naudotojo vardas. Channel is full. Kanalas pilnas. Channel nesting limit reached. Channel count limit reached. Need to delete channels before creating new ones. Permission denied. Leidimas atmestas. %1 connected and entered channel. %1 connected. %1 prisijungė. %1 is now muted. %1 is now unmuted. Recording started Įrašymas pradėtas Recording stopped Įrašymas sustabdytas %1 started recording. %1 pradėjo įrašymą. %1 stopped recording. %1 sustabdė įrašymą. You revoked your priority speaker status. You assumed priority speaker status. %1 revoked your priority speaker status. %1 gave you priority speaker status. You revoked priority speaker status for %1. You gave priority speaker status to %1. %1 revoked own priority speaker status. %1 assumed priority speaker status. %1 revoked priority speaker status for %2. %1 gave priority speaker status to %2. You were unmuted and undeafened by %1. You were muted by %1. %1 jus nutildė. You were undeafened by %1. You were suppressed. You were suppressed by %1. You were unsuppressed. You were unsuppressed by %1. You joined %1. You moved %1 to %2. Jūs perkėlėte %1 į %2. %1 is recording %1 įrašinėja %1 renamed to %2 by %3. %3 pervadino %1 į %2. %1 disconnected. %1 atsijungė. Server message from Serveris (Tree) (Channel) (Private) %2%1: %3 %2%1: %3 Failed to load Opus, it will not be available for audio encoding/decoding. The server requests minimum client version %1 The server requests positional audio be enabled. Serveris prašo, kad pozicinis garsas būtų įjungtas. The server requests positional audio be disabled. Serveris prašo, kad pozicinis garsas būtų išjungtas. The server requests Push-to-Talk be enabled. The server requests Push-to-Talk be disabled. You were unmuted by %1. You muted %1. You unsuppressed %1. You unmuted %1. %1 muted by %2. %1 unsuppressed by %2. %1 unmuted by %2. Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. You were muted and deafened by %1. You were deafened by %1. %1 jus nutildė ir apkurtino. You were kicked from the server by %1: %2. %1 išmetė jus iš serverio: %2. %3 was kicked from the server by %1: %2. %1 išmetė naudotoją %3 iš serverio: %2. You were kicked and banned from the server by %1: %2. %1 išmetė jus iš serverio ir uždraudė jus: %2. %3 was kicked and banned from the server by %1: %2. %1 išmetė naudotoją %3 iš serverio ir jį uždraudė: %2. You were moved to %1 by %2. %2 jus perkėlė į %1. %1 entered channel. %1 užėjo į kanalą. Server connection rejected: %1. Denied: %1. Atmesta: %1. %1 renamed to %2. %1 left channel and disconnected. %1 išėjo iš kanalo ir atsijungė. Message from %1 Žinutė nuo %1 You have User Dragging set to "Do Nothing" so the user wasn't moved. You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. Jūs esate nusistatę kanalų tempimą į "Nieko nedaryti", taigi, kanalas nebuvo perkeltas. Unknown Channel Drag mode in UserModel::dropMimeData. Nežinoma kanalų tempimo veiksena ties UserModel::dropMimeData. Remote controlling Mumble: Nuotolinis Mumble valdymas: Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) -jn, --jackname Set custom Jack client name. --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status Invocation Error: No RPC command specified Klaida: Nenurodyta RPC komanda RPC RPC Welcome to Mumble. Sveiki atvykę į Mumble. Skipping version check in debug mode. Derinimo veiksenoje, praleidžiamas versijos tikrinimas. Hide Frame Slėpti rėmelį Toggle showing frame on minimal window Perjungia rėmelio rodymą minimaliame lange This will toggle whether the minimal window should have a frame for moving and resizing. &Unlink All Reset the comment of the selected user. Atstatyti pasirinkto naudotojo komentarą. &Join Channel &Prisijungti prie kanalo View comment in editor Rodyti komentarą redaktoriuje Query server for connection information for user S&erver S&erveris &Self &Save &Unlink Plugins A&tsieti įskiepius Register yourself on the server Užregistruoti save serveryje Change your avatar image on this server Keisti savo avataro paveikslą šiame serveryje &Remove Avatar Ša&linti avatarą Remove currently defined avatar image. Šalinti šiuo metu nustatytą avataro paveikslą. Icon Toolbar Piktogramų įrankių juosta Change your own comment Keisti savo komentarą Recording Įrašymas Priority Speaker &Copy URL &Kopijuoti URL Copies a link to this channel to the clipboard. Kopijuoja nuorodą į šį kanalą į iškarpinę. Ignore Messages Nepaisyti žinučių Locally ignore user's text chat messages. Silently drops all text messages from the user. Edit ban list on server Taisyti uždraudimų serveryje sąrašą This lets you edit the server-side IP ban list. Tai leidžia jums serveryje taisyti IP uždraudimų sąrašą. &Filter on/off Toggle the channel filter (Ctrl+F) Perjungti kanalo filtrą (Ctrl+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. Ctrl+F Ctrl+F &Hide Channel when Filtering &Filtruojant, slėpti kanalą Reset the avatar of the selected user. Atstatyti pasirinkto naudotojo avatarą. Locally adjust the user's speech volume. Vietos mastu reguliuoti naudotojo kalbos garsį. Opens a dialog with a volume slider. Use this on other users in the same room. &Developer &Kūrėjas &Hide Mumble &Slėpti Mumble Hides the main Mumble window. Slepia pagrindinį Mumble langą. Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. Slepia pagrindinį Mumble langą. Atkurkite, spusteldami dėklo piktogramą arba vėl paleisdami Mumble. Show the Developer Console Rodyti kūrėjo pultą Shows the Mumble Developer Console, where Mumble's log output can be inspected. Rodo Mumble kūrėjo pultą, kuriame gali būti išnagrinėta Mumble žurnalo išvestis. &Connect... &Ban list... &Information... &Informacija... &Kick... &Ban... Local Volume Adjustment... Vietinio garsio reguliavimas... Send &Message... Siųsti &žinutę... &Add... &Pridėti... &Remove... Š&alinti... &Edit... &Taisyti... Audio S&tatistics... Garso s&tatistika... &Settings... Nu&statymai... &Audio Wizard... G&arso vediklis... Developer &Console... Kūrėjo &pultas... &About... &Apie... About &Speex... Apie &Speex... About &Qt... Apie &Qt... &Certificate Wizard... &Liudijimų vediklis... &Register... &Registruoti... Registered &Users... Registruoti na&udotojai... Change &Avatar... Keisti &avatarą... &Access Tokens... P&rieigos raktai... Reset &Comment... Atstatyti &komentarą... Reset &Avatar... Atstatyti &avatarą... View Comment... Žiūrėti komentarą... &Change Comment... K&eisti komentarą... R&egister... R&egistruoti... Show Shows the main Mumble window. Manual Manual Mumble Positional Audio Position X X Y Y Z Z m Heading Azimuth Elevation ° ° Meta data Metaduomenys Context Kontekstas Identity Tapatybė Set State Linked Activated Unhinge NetworkConfig Network Tinklas Updates are mandatory when using snapshot releases. Atnaujinimai yra privalomi, naudojant momentinių kopijų laidas. Connection Ryšys Use TCP compatibility mode Use TCP compatability mode Naudoti TCP suderinamumo veikseną <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). Reconnect when disconnected Atsijungus, prisijungti iš naujo <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. <b>Atsijungus, prisijungti iš naujo</b>.<br />Tai padarys, kad Mumble, nutrūkus ryšiui su serveriu, automatiškai po 10 sekundžių bandytų prisijungti iš naujo. Reconnect automatically Automatiškai prisijungti iš naujo Proxy Įgaliotasis serveris Type Tipas Type of proxy to connect through Įgaliotojo serverio, per kurį jungtis, tipas Direct connection Tiesioginis ryšys HTTP(S) proxy HTTP(S) įgaliotasis serveris SOCKS5 proxy SOCKS5 įgaliotasis serveris Hostname Hostname of the proxy Force TCP mode Priverstinė TCP veiksena Enable QoS to prioritize packets This will enable QoS, which will attempt to prioritize voice packets over other traffic. Use Quality of Service Don't send certificate to server and don't save passwords. (Not saved). <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> Suppress certificate and password storage <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. Port Prievadas Port number of the proxy Įgaliotojo serverio prievado numeris <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. Username Naudotojo vardas Username for proxy authentication <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Password Slaptažodis Password for proxy authentication <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Mumble services Mumble tarnybos Check for new releases of Mumble automatically. Automatiškai tikrinti naujas Mumble laidas. This will check for new releases of Mumble every time you start the program, and notify you if one is available. Check for application updates on startup Check for new releases of plugins automatically. Automatiškai tikrinti ar yra naujų įskiepių laidų. This will check for new releases of plugins every time you start the program, and download them automatically. Tai, kas kartą jums paleidus programą, tikrins ar yra naujų įskiepių laidų ir automatiškai jas atsisiųs. <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. Submit anonymous statistics to the Mumble project Pateikti Mumble projektui anoniminę statistiką Submit anonymous statistics Siųsti anoniminę statistiką Reconnect to last used server when starting Mumble Paleidžiant Mumble, iš naujo prisijungti prie paskutinio naudoto serverio Reconnect to last server on startup Paleidus programą, iš naujo prisijungti prie paskutinio serverio Download plugin and overlay updates on startup Privacy Privatumas Prevent OS information being sent to Mumble servers and web servers Neleisti siųsti OS informaciją į Mumble serverius ir saityno serverius <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. Do not send OS information to Mumble servers and web servers Nesiųsti OS informaciją į Mumble serverius ir saityno serverius Overlay Silent Talking Whisper Shout Channel Kanalas Failed to create communication with overlay at %2: %1. No overlay will be available. OverlayClient Filter Filtras Only talking Tik kalbantys Talking and recently active Kalbantys ir paskiausiai aktyvūs All in current channel Visi esamame kanale All in linked channels Visi susietuose kanaluose Always show yourself Visada rodyti mane Configure recently active time (%1 seconds)... Konfigūruoti paskiausiai aktyvių laiką (%1 sekundės)... Columns Stulpeliai Sort Rikiuoti Alphabetically Pagal abėcėlę Last state change Edit... Keisti... Reset Zoom Atstatyti mastelį Configure recently active time Konfigūruoti paskiausiai aktyvių laiką Amount of seconds users remain active after talking: OverlayConfig To move the users, drag the little red dot. Norėdami perkelti naudotojus, tempkite raudoną taškelį. To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. Norėdami keisti naudotojų dydį, slinkite virš jų pelės ratuką. For more options, right click a user. For more options, rightclick a user. Launcher Filter Overlay Perdanga Choose executable Choose application Choose path Load Overlay Presets Mumble overlay presets (*.mumblelay) Save Overlay Presets Options Parinktys Enable overlay. Įjungti perdangą. Enable Overlay Įjungti perdangą This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. Layout Išdėstymas Blacklist Whitelist Uninstall Overlay Pašalinti perdangą Overlay Installation Perdangos įdiegimas Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. Mumble aptiko, kad neturite įdiegę Mumble perdangos. Spustelėkite mygtuką žemiau, norėdami įdiegti perdangą. Install Mumble Overlay Įdiegti Mumble perdangą Overlay Upgrade Perdangos naujinimas Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. Mumble jūsų kompiuteryje aptiko įdiegtą senąją perdangos palaikymo failų versiją. Norėdami naujinti šiuos failus į naujausią versiją, spustelėkite mygtuką žemiau. Upgrade Mumble Overlay Naujinti Mumble perdangą Display a frame counter in the overlay Rodyti perdangoje kadrų skaitiklį Show FPS counter Rodyti kadr./s skaitiklį Load an overlay preset from file Įkelti išankstines perdangos parinktis iš failo Load… Įkelti... Save your overlay settings to file Įrašyti jūsų perdangos nustatymus į failą Save… Įrašyti... Set the overlay font. Nustatyti perdangos šriftą. Set the overlay text color. Nustatyti perdangos teksto spalvą. Color Spalva Remove Šalinti Font Šriftas FPS and Clock Display Kadr./s ir laikrodžio rodymas Display a clock in the overlay showing the current local time (system time). Rodyti perdangoje laikrodį, rodantį dabartinį vietinį laiką (sistemos laiką). Show Clock Rodyti laikrodį Overlay Exceptions Perdangos išimtys Overlay Exception Mode Perdangos išimčių veiksena Allowed launchers Add Pridėti Allowed programs Allowed paths Blacklisted programs OverlayEditor State Būsena User is not talking Naudotojas nekalba Passive Pasyvi User is talking in your channel or a linked channel Talking Kalbėjimo User is whispering to you privately Private Whisper User is shouting to your channel Channel Whisper Zoom Mastelis Zoom Factor Enabled Elements Įjungti elementai User avatar, chosen by each user Naudotojo avataras, pasirenkamas kiekvieno naudotojo Avatar Avataras User's name Naudotojo vardas Username Naudotojo vardas Name of user's channel, if outside your current channel Naudotojo kanalo pavadinimas, jeigu naudotojas yra už jūsų dabartinio kanalo ribų Channel Kanalas Muted or deafened Mute state Nutildymo būsena Bounding box, automatically shrunk to minimum size to contain all visible elements Bounding box Overlay Editor Perdangos redaktorius OverlayEditorScene Layout preset Large square avatar Didelis kvadratinis avataras Avatar and Name User Opacity %1% %1% Object Opacity Alignment Lygiavimas Left Kairė Center Centras Right Dešinė Top Viršus Bottom Apačia Color... Spalva... Font... Šriftas... Bounding box Pen width Padding Pen color Fill color Pick pen color Pick fill color Pick color Pick font PluginConfig Plugins Įskiepiai Plugin has no configure function. Įskiepis neturi konfigūravimo funkcijos. Plugin has no about function. Įskiepis neturi "apie" funkcijos. Options Parinktys Enable plugins and transmit positional information Įjungti įskiepius ir perduoti pozicinę informaciją This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. Tai leidžia įskiepiams palaikomuose žaidimuose gauti jūsų poziciją žaidime ir perduoti ją su kiekvienu balso paketu. Tai leidžia kitiems naudotojams girdėti žaidime jūsų balsą iš tos vietos, kurioje yra jūsų veikėjas jų veikėjo atžvilgiu. Link to Game and Transmit Position Susieti su žaidimu ir perduoti poziciją Reloads all plugins Iš naujo įkelti visus įskiepius This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. Tai peržiūri ir iš naujo įkelia įskiepius. Naudokite tai, jeigu jūs ką tik į įskiepių katalogą pridėjote ar pakeitėte įskiepį. &Reload plugins &Iš naujo įkelti įskiepius Information about plugin Informacija apie įskiepį This shows a small information message about the plugin. Tai rodo mažą informacinį pranešimą apie įskiepį. &About &Apie Show configuration page of plugin Rodyti įskiepio konfigūravimo puslapį This shows the configuration page of the plugin, if any. Tai rodo įskiepio konfigūracijos puslapį, jei toks yra. &Configure &Konfigūruoti Name Pavadinimas Enabled Įjungta Plugins Skipping plugin update in debug mode. Derinimo veiksenoje, praleidžiamas įskiepio atnaujinimas. Downloaded new or updated plugin to %1. Atsisiųstas naujas ar atnaujintas įskiepis į %1. Failed to install new plugin to %1. Nepavyko įdiegti naujo įskiepio į %1. %1 lost link. %1 linked. PortAudioSystem Default Device Numatytasis įrenginys PulseAudioSystem Default Input Numatytoji įvestis Default Output Numatytoji išvestis QApplication Failed to restart mumble Nepavyko iš naujo paleisti Mumble Mumble failed to restart itself. Please restart it manually. Programai Mumble nepavyko paleisti savęs iš naujo. Prašome paleisti ją iš naujo rankiniu būdu. RichTextEditor Failed to load image Nepavyko įkelti paveikslo Image file too large to embed in document. Please use images smaller than %1 kB. Message is too long. Žinutė per ilga. Display Rodyti Source Text Šaltinio tekstas &Bold &Pusjuodis Ctrl+B Ctrl+B &Italic &Kursyvas Italic Kursyvas Ctrl+I Ctrl+I Underline Pabraukimas Ctrl+U Ctrl+U Color Spalva Insert Link Įterpti nuorodą Ctrl+L Ctrl+L Insert Image Įterpti paveikslą RichTextEditorLink Add Link Pridėti nuorodą URL URL Text Tekstas ServerHandler Unable to resolve hostname Server is not responding to TCP pings UDP packets cannot be sent to or received from the server. Switching to TCP mode. UDP paketai negali būti išsiųsti ar gauti iš serverio. Perjungiama į TCP veikseną. UDP packets cannot be sent to the server. Switching to TCP mode. UDP paketai negali būti išsiųsti į serverį. Perjungiama į TCP veikseną. UDP packets cannot be received from the server. Switching to TCP mode. UDP paketai negali būti gauti iš serverio. Perjungiama į TCP veikseną. UDP packets can be sent to and received from the server. Switching back to UDP mode. UDP paketai gali būti išsiųsti ir gauti iš serverio. Perjungiama atgal į UDP veikseną. Connection timed out Pasibaigė ryšiui skirtas laikas ServerView Favorite Mėgstami LAN Public Internet Viešas internetas Unknown Africa Afrika Asia Azija North America Šiaurės Amerika South America Pietų Amerika Europe Europa Oceania Okeanija ShortcutActionWidget Unassigned Nepriskirta ShortcutDelegate On Įjungta Off Išjungta Toggle Unassigned Nepriskirta ShortcutKeyWidget Press Shortcut Nuspauskite trumpinį ShortcutTargetDialog Root Parent Current Subchannel #%1 ShortcutTargetWidget ... ... , , Root Parent Current Subchannel #%1 Invalid Empty <Empty> ShortcutToggleWidget Off Išjungta Toggle On Įjungta TextMessage Enter text If checked the message is recursively sent to all subchannels Jei pažymėta, žinutė bus rekursyviai išsiųsta į visus pokanalius Send recursively to subchannels Siųsti rekursyviai į pokanalius Tokens Empty Token Tuščias prieigos raktas Mumble - Access Tokens Mumble - Prieigos raktai List of access tokens on current server Esamame serveryje esančių prieigos raktų sąrašas <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. <b>Tai yra redaguojamas prisijungtame serveryje esančių prieigos raktų sąrašas.</b> <br /> Prieigos raktas yra tekstinė eilutė, kuri gali būti naudojama kaip slaptažodis ir kuri yra skirta lengvam prieigos tvarkymui kanaluose. Mumble prisimins jūsų naudotus prieigos raktus ir kitą kartą jums vėl prisijungus prie serverio, išsiųs juos iš naujo, taigi, tokiu būdu jums nereikės kas kartą juos įvedinėti. Add a token Pridėti prieigos raktą &Add &Pridėti Remove a token Šalinti prieigos raktą &Remove Ša&linti UserEdit Registered Users Registruoti naudotojai Remove Šalinti Rename Pervadinti Who are you looking for? Ko ieškote? Days Weeks Months Years Inactive for Registered users: %n account(s) Registruoti naudotojai: %n paskyraRegistruoti naudotojai: %n paskyrosRegistruoti naudotojai: %n paskyrųRegistruoti naudotojai: %n paskyrų UserInformation User Information Naudotojo informacija Connection Information Ryšio informacija Version Versija OS OS Certificate Liudijimas IP Address IP adresas CELT Versions CELT versijos Details... Išsamiau... Ping Statistics Ping statistika Pings received Gauta ping Average ping Vidutinis ping TCP (Control) UDP (Voice) UDP Network statistics UDP tinklo statistika Good Gerai Late Pavėluota Lost Prarasta Resync From Client Nuo kliento To Client Klientui Connection time Ryšio laikas %1w %1sav. %1d %1d. %1h %1val. %1m %1min. %1s %1s , , %1 (%2) %1.%2.%3 (%4) %1 (%2) Supported Palaikoma Not Supported Nepalaikoma Not Reported %1 online (%2 idle) %1 prisijungęs (%2 neveiklus) %1 online %1 prisijungęs %1 kbit/s %1 kbit/s Bandwidth GroupBox Siuntimo sparta Bandwidth Label Siuntimo sparta Ping deviation Ping nuokrypis UserListModel Nick Slapyvardis Inactive days Last channel Last seen: %1 Paskutinį kartą matytas: %1 Never Niekada Channel ID: %1 Kanalo ID: %1 UserLocalVolumeDialog Local volume for other users Kitų naudotojų vietinis garsis <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. Adjusting local volume for %1 Vietinio garsio reguliavimas naudotojui %1 dB dB <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> <html><head/><body><p>Naudokite slinktuką arba tekstinį langelį, kad pakeistumėte naudotojo garsį.</p><p><span style="font-weight:600;">Dėmesio!</span></p><p>Per didelis naudotojo garsio padidinimas gali visiems laikams pažeisti jūsų klausą. Be to, jis taip pat gali padidinti naudotojo foninį triukšmą.</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: Tai yra prie serverio prisijungęs naudotojas. Iš kairės nuo naudotojo esanti piktograma nurodo ar naudotojas kalba ar ne: Talking to your channel. Kalba jūsų kanalui. Shouting directly to your channel. Whispering directly to your channel. Šaukia tiesiogiai jūsų kanalui. Whispering directly to you. Šnabžda tiesiogiai jums. Not talking. Nekalba. This is a channel on the server. The icon indicates the state of the channel: Tai yra kanalas serveryje. Piktograma nurodo kanalo būseną: Your current channel. A channel that is linked with your channel. Linked channels can talk to each other. A channel on the server that you are not linked to. This shows the flags the user has on the server, if any: On your friend list Authenticated user Muted (manually muted by self) Muted (manually muted by admin) Muted (not allowed to speak in current channel) Muted (muted by you, only on your machine) Muted (push-to-mute) Deafened (by self) Deafened (by admin) User has a new comment set (click to show) User has a comment set, which you've already seen. (click to show) Ignoring Text Messages This shows the flags the channel has, if any: Channel has a new comment set (click to show) Kanale yra nustatytas naujas komentaras (spustelėkite, norėdami rodyti) Channel has a comment set, which you've already seen. (click to show) Kanale yra nustatytas komentaras, kurį jau matėte. (spustelėkite, norėdami rodyti) Channel will be hidden when filtering is enabled Įjungus filtravimą, kanalas bus paslėptas Name Flags Vėliavėlės Are you sure you want to drag this user? Are you sure you want to drag this channel? Ar tikrai norite tempti šį kanalą? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. VersionCheck Upgrade Mumble Naujinti Mumble A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? Buvo aptikta ir automatiškai atsiųsta nauja Mumble versija. Yra rekomenduojama, kad jūs arba naujintumėte iki šios versijos, arba sendintumėte iki naujausios stabilios laidos. Ar norėtumėte paleisti diegimo programą dabar? Failed to launch snapshot installer. Nepavyko paleisti momentinės kopijos diegimo programos. Corrupt download of new version detected. Automatically removed. Aptiktas pažeistas naujos versijos atsiuntimas. Automatiškai pašalintas. Downloading new snapshot from %1 to %2 Atsiunčiama nauja momentinė kopija iš %1 į %2 Failed to write new version to disk. Failed to write new version to disc. Nepavyko įrašyti naujos versijos į diską. Mumble failed to retrieve version information from the central server. Programai Mumble nepavyko iš centrinio serverio gauti versijos informacijos. ViewCert Certificate Chain Details Išsamesnė liudijimų grandinės informacija Certificate chain Liudijimų grandinė Certificate details Išsamesnė liudijimo informacija Common Name Bendrinis pavadinimas Organization Organizacija Subunit Country Šalis Locality Vietovė State Valstija/Regionas Valid from: %1 Galioja nuo: %1 Valid to: %1 Galioja iki: %1 Serial: %1 Numeris: %1 Public Key: %1 bits %2 Viešasis raktas: %1 bitų %2 RSA RSA DSA DSA Digest (SHA-1): %1 Maišos reikšmė (SHA-1): %1 Digest (SHA-256): %1 Maišos reikšmė (SHA-256): %1 Email: %1 El. paštas: %1 DNS: %1 DNS: %1 Issued by: Išdavė: Unit Name Padalinio pavadinimas VoiceRecorder Recorder failed to create directory '%1' Rašytuvui nepavyko sukurti katalogo "%1" Recorder failed to open file '%1' Rašytuvui nepavyko atverti failo "%1" .wav - Uncompressed .wav - Nesuglaudintas .ogg (Vorbis) - Compressed .ogg (Vorbis) - Suglaudintas .au - Uncompressed .au - Nesuglaudintas .flac - Lossless compressed .flac - Nenuostolingasis suglaudintas VoiceRecorderDialog Recorder Rašytuvas Control Valdymas 00:00:00 00:00:00 &Start &Pradėti S&top S&tabdyti Mode Veiksena Multichannel Daugiakanalė Output Išvestis Output format Išvesties formatas Target directory Paskirties katalogas Filename Failo pavadinimas &Browse... &Naršyti... Valid variables are: Teisingi kintamieji yra: Inserts the user's name Įterpia naudotojo vardą Inserts the current date Įterpia esamą datą Inserts the current time Įterpia esamą laiką Inserts the hostname Įterpia serverį Recorder still running Rašytuvas yra vis dar vykdomas Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? Rašytuvo užvėrimas, jo nesustabdžius, atmes neįrašytą garsą. Ar tikrai norite užverti rašytuvą? Unable to start recording. Not connected to a server. The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. There is already a recorder active for this server. Please select a recording format. Prašome pasirinkti įrašymo formatą. Stopping Select target directory Pasirinkite paskirties katalogą Downmix WASAPIInput Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone. WASAPISystem Default Device Numatytasis įrenginys qwPTTButtonWidget Mumble PTT Push to talk mumble-1.3.4/src/mumble/VersionCheck.cpp0000664000175000017500000001543614010707274020012 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "VersionCheck.h" #include "MainWindow.h" #include "WebFetch.h" // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" VersionCheck::VersionCheck(bool autocheck, QObject *p, bool focus) : QObject(p) { QUrl url; url.setPath(focus ? QLatin1String("/v1/banner") : QLatin1String("/v1/version-check")); QList > queryItems; queryItems << qMakePair(QString::fromLatin1("ver"), QString::fromLatin1(QUrl::toPercentEncoding(QLatin1String(MUMBLE_RELEASE)))); #if defined(Q_OS_WIN) # if defined(Q_OS_WIN64) queryItems << qMakePair(QString::fromLatin1("os"), QString::fromLatin1("WinX64")); # else queryItems << qMakePair(QString::fromLatin1("os"), QString::fromLatin1("Win32")); # endif #elif defined(Q_OS_MAC) # if defined(USE_MAC_UNIVERSAL) queryItems << qMakePair(QString::fromLatin1("os"), QString::fromLatin1("MacOSX-Universal")); # else queryItems << qMakePair(QString::fromLatin1("os"), QString::fromLatin1("MacOSX")); # endif #else queryItems << qMakePair(QString::fromLatin1("os"), QString::fromLatin1("Unix")); #endif if (! g.s.bUsage) queryItems << qMakePair(QString::fromLatin1("nousage"), QString::fromLatin1("1")); if (autocheck) queryItems << qMakePair(QString::fromLatin1("auto"), QString::fromLatin1("1")); queryItems << qMakePair(QString::fromLatin1("locale"), g.s.qsLanguage.isEmpty() ? QLocale::system().name() : g.s.qsLanguage); QFile f(qApp->applicationFilePath()); if (! f.open(QIODevice::ReadOnly)) { qWarning("VersionCheck: Failed to open binary"); } else { QByteArray a = f.readAll(); if (a.size() < 1) { qWarning("VersionCheck: suspiciously small binary"); } else { QCryptographicHash qch(QCryptographicHash::Sha1); qch.addData(a); queryItems << qMakePair(QString::fromLatin1("sha1"), QString::fromLatin1(qch.result().toHex())); } } #if QT_VERSION >= 0x050000 QUrlQuery query; query.setQueryItems(queryItems); url.setQuery(query); #else for (int i = 0; i < queryItems.size(); i++) { const QPair &queryPair = queryItems.at(i); url.addQueryItem(queryPair.first, queryPair.second); } #endif WebFetch::fetch(QLatin1String("update"), url, this, SLOT(fetched(QByteArray,QUrl))); } void VersionCheck::fetched(QByteArray a, QUrl url) { if (! a.isNull()) { if (! a.isEmpty()) { #ifdef SNAPSHOT_BUILD if (url.path() == QLatin1String("/v1/banner")) { g.mw->msgBox(QString::fromUtf8(a)); } else if (url.path() == QLatin1String("/v1/version-check")) { #ifndef Q_OS_WIN g.mw->msgBox(QString::fromUtf8(a)); #else QDomDocument qdd; qdd.setContent(a); QDomElement elem = qdd.firstChildElement(QLatin1String("p")); elem = elem.firstChildElement(QLatin1String("a")); QUrl fetch = QUrl(elem.attribute(QLatin1String("href"))); fetch.setHost(QString()); fetch.setScheme(QString()); if (! fetch.isValid()) { g.mw->msgBox(QString::fromUtf8(a)); } else { QString filename = g.qdBasePath.absoluteFilePath(QLatin1String("Snapshots/") + QFileInfo(fetch.path()).fileName()); QFile qf(filename); if (qf.exists()) { std::wstring native = QDir::toNativeSeparators(filename).toStdWString(); WINTRUST_FILE_INFO file; ZeroMemory(&file, sizeof(file)); file.cbStruct = sizeof(file); file.pcwszFilePath = native.c_str(); WINTRUST_DATA data; ZeroMemory(&data, sizeof(data)); data.cbStruct = sizeof(data); data.dwUIChoice = WTD_UI_NONE; data.fdwRevocationChecks = WTD_REVOKE_NONE; data.dwUnionChoice = WTD_CHOICE_FILE; data.pFile = &file; data.dwProvFlags = WTD_SAFER_FLAG | WTD_USE_DEFAULT_OSVER_CHECK; data.dwUIContext = WTD_UICONTEXT_INSTALL; static GUID guid = WINTRUST_ACTION_GENERIC_VERIFY_V2; LONG ts = WinVerifyTrust(0, &guid , &data); if (ts == 0) { if (QMessageBox::question(g.mw, tr("Upgrade Mumble"), tr("A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::Yes) { SHELLEXECUTEINFOW execinfo; std::wstring filenative = filename.toStdWString(); std::wstring dirnative = QDir::toNativeSeparators(QDir::tempPath()).toStdWString(); ZeroMemory(&execinfo, sizeof(execinfo)); execinfo.cbSize = sizeof(execinfo); execinfo.lpFile = filenative.c_str(); execinfo.lpDirectory = dirnative.c_str(); execinfo.nShow = SW_NORMAL; if (ShellExecuteExW(&execinfo)) { g.mw->bSuppressAskOnQuit = true; qApp->closeAllWindows(); } else { g.mw->msgBox(tr("Failed to launch snapshot installer.")); } } } else { g.mw->msgBox(tr("Corrupt download of new version detected. Automatically removed.")); qf.remove(); } // Delete all but the N most recent snapshots size_t numberOfSnapshotsToKeep = 1; QDir snapdir(g.qdBasePath.absolutePath() + QLatin1String("/Snapshots/"), QString(), QDir::Name, QDir::Files); foreach(const QFileInfo fileInfo, snapdir.entryInfoList(QStringList(), QDir::NoFilter, QDir::Time)) { if (numberOfSnapshotsToKeep) { --numberOfSnapshotsToKeep; continue; } qWarning() << "Purging old snapshot" << fileInfo.fileName(); QFile file(fileInfo.absoluteFilePath()); file.remove(); } } else { g.mw->msgBox(tr("Downloading new snapshot from %1 to %2").arg(Qt::escape(fetch.toString()), Qt::escape(filename))); WebFetch::fetch(QLatin1String("dl"), fetch, this, SLOT(fetched(QByteArray,QUrl))); return; } } } else { QString filename = g.qdBasePath.absoluteFilePath(QLatin1String("Snapshots/") + QFileInfo(url.path()).fileName()); QFile qf(filename); if (qf.open(QIODevice::WriteOnly)) { qf.write(a); qf.close(); new VersionCheck(true, g.mw); } else { g.mw->msgBox(tr("Failed to write new version to disk.")); } #endif } #else Q_UNUSED(url); g.mw->msgBox(QString::fromUtf8(a)); #endif } } else { g.mw->msgBox(tr("Mumble failed to retrieve version information from the central server.")); } deleteLater(); } mumble-1.3.4/src/mumble/G15LCDEngine_helper.h0000664000175000017500000000275714010707273020441 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_G15LCDENGINE_HELPER_H_ #define MUMBLE_MUMBLE_G15LCDENGINE_HELPER_H_ #include "mumble_pch.hpp" #include "LCD.h" #include "../../g15helper/g15helper.h" class G15LCDDeviceHelper; class G15LCDEngineHelper : public LCDEngine { friend class G15LCDDeviceHelper; private: Q_OBJECT Q_DISABLE_COPY(G15LCDEngineHelper) protected: bool bUnavailable; bool bRunning; QProcess *qpHelper; QString qsHelperExecutable; bool framebufferReady() const; void submitFrame(bool alert, uchar *buf, qint64 len); void setProcessStatus(bool run); public: G15LCDEngineHelper(); ~G15LCDEngineHelper() Q_DECL_OVERRIDE; QList devices() const Q_DECL_OVERRIDE; public slots: void on_Helper_finished(int exitCode, QProcess::ExitStatus status); }; class G15LCDDeviceHelper : public LCDDevice { protected: G15LCDEngineHelper *engine; bool bEnabled; public: G15LCDDeviceHelper(G15LCDEngineHelper *e); ~G15LCDDeviceHelper() Q_DECL_OVERRIDE; bool enabled() Q_DECL_OVERRIDE; void setEnabled(bool e) Q_DECL_OVERRIDE; void blitImage(QImage *img, bool alert) Q_DECL_OVERRIDE; QString name() const Q_DECL_OVERRIDE; QSize size() const Q_DECL_OVERRIDE; }; #else class G15LCDEngineHelper; class G15LCDDeviceHelper; #endif mumble-1.3.4/src/mumble/mumble_fa_IR.ts0000664000175000017500000115214614010707274017615 0ustar builderbuilder ACLEditor Deny ردکردن Allow اجازه Allow %1 اجازه %1 Deny %1 ممنوع %1 Mumble - Add channel Mumble-اضافه کردن کانال Default server value مقدار پیش فرض سرور Failed: Invalid channel ناموفق: کانال نامعتبر Mumble - Edit %1 Mumble - ویرایش %1 ID: %1 شناسه: %1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Channel must have a name کانال باید نام داشته باشد This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Dialog دیالوگ Name نام Enter the channel name here. نام کانال را اینجا وارد نمایید. Description توضیحات Password رمزعبور Enter the channel password here. رمز کانال را اینجا وارد نمایید. Check to create a temporary channel. بررسی برای ایجاد کانال موقت Temporary موقتی <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. Position جایگاه &Groups &گروه ها Group گروه List of groups لیست گروه ها Remove selected group پاک کردن گروه انتخاب شده Remove پاک کردن Inherit group members from parent Inherit Make group inheritable to sub-channels Inheritable Group was inherited from parent channel Inherited Members اعضا Add اضافه کردن Add member to group اضافه کردن عضو به گروه Remove member from group حذف عضو از گروه &ACL Active ACLs List of entries Inherit ACL of parent? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. Inherit ACLs Move entry up This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. &Up Move entry down This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. &Down Add new entry This adds a new entry, initially set with no permissions and applying to all. &Add Remove entry This removes the currently selected entry. &Remove Context Entry should apply to this channel. Entry should apply to this channel This makes the entry apply to this channel. Applies to this channel اضافه کردن به این کانال Entry should apply to sub-channels. Add new group اضافه کردن گروه جدید <b>Add</b><br/> Add a new group. Inherited members Contains the list of members added to the group by this channel. Contains a list of members whose group membership will not be inherited from the parent channel. Contains the list of members inherited by other channels. Type in the name of a user you wish to add to the group and click Add. Type in the name of a user you wish to remove from the group and click Add. Exclude Excluded members This makes the entry apply to sub-channels of this channel. Applies to sub-channels Permissions دسترسی ها User/Group عضو/گروه Group this entry applies to User ID User this entry applies to This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. &Properties <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. ID of the channel. Maximum Users Maximum number of users allowed in the channel <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. This is the sort order for the channel. ALSAAudioInput Default ALSA Card Opening chosen ALSA Input failed: %1 ALSAAudioOutput Default ALSA Card Opening chosen ALSA Output failed: %1 ASIOConfig %1 (version %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz ASIO Initialization failed: %1 Failed to instantiate ASIO driver ASIO Device selection انتخاب دستگاه Device دستگاه Device to use for microphone دستگاهی که برای میکروفن استفاده شود This chooses what device to query. You still need to actually query the device and select which channels to use. Query selected device This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Query Configure selected device This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Configure Capabilities توانایی‌ها Driver name Buffer size This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. Configure input channels Channels کانال‌ها Microphone میکروفُن <- -> Unused Speakers ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. Opening selected ASIO device failed. No input will be done. AboutDialog About Mumble درباره Mumble <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble &درباره Mumble &License &مجوزها A&uthors &Third-Party Licenses OK خُب AudioInput Interface System Input method for audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Input device for audio <b>This is the input device to use for audio.</b> Transmission انتقال &Transmit When to transmit your speech هنگامه انتقال گفتگو <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. DoublePush Time If you press the PTT key twice in this time it will get locked. <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. Reset audio cue to default <b>Reset</b><br/>Reset the paths for the files to their default. Browse for on audio file Browse for off audio file Off خاموش On روشن Preview the audio cues Use SNR based speech detection Signal to Noise سیگنال به نویز <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. Amplitude بلندی Voice &Hold How long to keep transmitting after silence Silence Below سکوتِ زیرِ <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. Speech Above Signal values above this count as voice Compression فشردگی &Quality Quality of compression (peak bandwidth) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. Audio per packet How many audio frames to send per packet چند فریم صوتی در هر بسته ارسال شود <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). Audio Processing Noise Suppression Noise suppression <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. Maximum amplification of input sound <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. Current speech detection chance Cancel echo from speakers Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. Disabled <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal values below this count as silence Maximum bandwidth used for sending audio Use Amplitude based speech detection <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). Exclusive mode <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive R&eset &Browse... B&rowse... &Preview <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. Displays an always on top window with a push to talk button in it Display push to talk window Misc Audible audio cue when starting or stopping to transmit <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. Audio cue Gets played when starting to transmit Gets played when stopping to transmit Hold Time Time the microphone stays open after the PTT key is released Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) Max. Amplification Idle action minutes do nothing deafen mute after Echo Cancellation Mixed echo cancellation Multichannel echo cancellation The idle action will be reversed upon any key or mouse button input Undo Idle action upon activity Apply RNNoise's noise suppression filter. <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. RNNoise Audio input AudioInputDialog Continuous Voice Activity Push To Talk Audio Input %1 ms Off %1 s %1 kb/s -%1 dB %1 kbit/s (Audio %2, Position %4, Overhead %3) AudioOutput Interface System Output method for audio <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Output device for audio <b>This is the output device to use for audio.</b> Positional Audio Audio Output خروجی صدا Default &Jitter Buffer Safety margin for jitter buffer <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. Minimum distance to user before sound volume decreases This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. Volume حجم صدا Volume of incoming speech <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. Output Delay Amount of data to buffer The connected "speakers" are actually headphones The connected "speakers" are actually headphones. Factor for sound volume decrease Bloom Factor for sound volume increase How much should sound volume increase for sources that are really close? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Headphones Minimum Distance Maximum Distance Maximum distance, beyond which speech volume won't decrease Minimum Volume What should the volume be at the maximum distance? Loopback Test Delay Variance Variance in packet latency <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. Packet Loss Packet loss for loopback mode <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% &Loopback Desired loopback mode Attenuate applications by... Attenuation of other applications during speech <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. If checked Mumble lowers the volume of other applications while other users talk <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. while other users talk If checked Mumble lowers the volume of other applications while you talk <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. while you talk Exclusive mode, not recommended. <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive Priority Speaker If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. Attenuate other users while talking as Priority Speaker. Advanced Attenuation Options If checked, Mumble will only attenuate applications that are using the same output source as Mumble <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. Only attenuate applications using the same output device If checked, PulseAudio loopback modules will be attenuated <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. Attenuate PulseAudio loopback modules Audio output AudioOutputDialog None Local Server Audio Output %1 ms %1 % %1 m AudioOutputSample Choose sound file Invalid sound file The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. AudioStats >1000 ms >1000ms Audio Statistics Input Levels Peak microphone level Peak power in last frame This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. Peak speaker level This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. Peak clean level This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. Signal Analysis Microphone power How close the current input level is to ideal This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. Signal-To-Noise ratio Signal-To-Noise ratio from the microphone This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. Speech Probability Probability of speech This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). Configuration feedback Current audio bitrate Bitrate of last frame DoublePush interval Time between last two Push-To-Talk presses Speech Detection Current speech detection chance <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal and noise power spectrum Power spectrum of input signal and noise estimate This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. Echo Analysis Weights of the echo canceller This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. AudioWizard Audio Tuning Wizard Introduction Welcome to the Mumble Audio Wizard Finished Enjoy using Mumble Device selection Selecting the input and output device to use with Mumble. This is the device your microphone is connected to. System Input method for audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Input device to use <b>Selects which sound card to use for audio input.</b> Cancel echo from headset or speakers Use echo cancellation This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. This is the device your speakers or headphones are connected to. Output method for audio <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. Output device to use <b>Selects which sound card to use for audio Output.</b> Enable positional audio Allows positioning of sound Allows positioning of sound. <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> Input Device Output Device This allows Mumble to use positional audio to place voices. <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> Amount of data to buffer This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> Positional Audio Adjusting attenuation of positional audio. <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> Use headphones instead of speakers <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> Use headphones This ignores the OS speaker configuration and configures the positioning for headphones instead. Volume tuning Tuning microphone hardware volume to optimal settings. Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. Voice Activity Detection Letting Mumble figure out when you're talking and when you're silent. This will help Mumble figure out when you are talking. The first step is selecting which data value to use. Raw amplitude from input Signal-To-Noise ratio Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Device tuning Changing hardware output delays to their minimum value. Submit anonymous statistics to the Mumble project Push To Talk: Quality & Notifications Adjust quality and notification settings. Quality settings Low Balanced Notification settings Use Text-To-Speech to read notifications and messages to you. Disable Text-To-Speech and use sounds instead. %1 ms Enables attenuation of other applications while users talk to you Attenuate applications while other users talk High Custom You already set a customized quality configuration in Mumble. Select this setting to keep it. Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. Apply some high contrast optimizations for visually impaired users Use high contrast graphics Keep custom Text-To-Speech settings. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) BanEditor Mumble - Edit Bans &Address &Mask Reason Start End User Hash &Add &Update &Remove Ban List Search field This is the search field. Use it to find bans that have this username set in the username field. Who are you looking for? No nickname IP address No IP address Reason for the ban No reason Ban end date Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). Certificate hash No certificate hash Banned users This is a list with banned users. Use this button if you want to add a new ban. Use this button if you want to update ban information. Use this button if you want to remove user from the ban list. Clear all fields This button clears all fields. Use it if you want to add a new ban. Clear Ban List - %n Ban(s) CertView Name Email Issuer Expiry Date (none) Self-signed CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. There was an error generating your certificate.<br />Please try again. Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. The file could not be opened for writing. Please use another file. The file's permissions could not be set. No certificate and key has been written. Please use another file. The file could not be written successfully. Please use another file. The file could not be opened for reading. Please use another file. The file is empty or could not be read. Please use another file. The file did not contain a valid certificate and key. Please use another file. Select file to export certificate to Select file to import certificate from Unable to import. Missing password or incompatible file type. <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. Certificates Certificate Management Certificate Authentication Authenticating to servers without using passwords Current certificate This is the certificate Mumble currently uses. Current Certificate Create a new certificate This will create a new certificate. Import certificate from file This will import a certificate from file. Import a certificate Export Certificate This will export a certificate to file. Export current certificate Import Certificate PKCS #12 Certificate import <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> Import from Filename to import from This is the filename you wish to import a certificate from. Select file to import from This opens a file selection dialog to choose a file to import a certificate from. Open... Password Password for PKCS#12 file This is the password for the PKCS#12 file containing your certificate. Certificate to import This is the certificate you are importing. Certificate Details Replace Certificate Replace existing certificate with new certificate? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> This is the certificate Mumble currently uses. It will be replaced. New certificate This is the new certificate that will replace the old one. New Certificate Make a backup of your certificate Export to Filename to export to This is the filename you wish to export a certificate to. Save As... This is the certificate Mumble currently uses. It will be exported. Generate a new certificate for strong authentication <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> Name Email Your email address (e.g. johndoe@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. Your name (e.g. John Doe) This is your name, and will be filled out in the certificate. This field is entirely optional. Finish Certificate-based authentication is ready for use Enjoy using Mumble with strong authentication. Automatic certificate creation <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> ChanACL None Traverse Enter Speak Mute/Deafen Make channel Make temporary Link channel This represents no privileges. This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. This represents the permission to write text messages to other users in this channel. This represents the permission to forcibly remove users from the server. This represents the permission to permanently remove users from the server. This represents the permission to register and unregister users on the server. This represents the permission to register oneself on the server. Whisper Move انتقال Text message پیغام متنی Kick بیرون انداختن Ban ممنوع Register User کاربر ثبت شده Register Self Write ACL ChatbarTextEdit Paste and &Send Paste and send <center>Type chat message here</center> ClientUser Friend دوست Authenticated Priority speaker Recording درحال ضبط Muted (server) ساکت شده (میزبان) Deafened (server) Local Ignore (Text messages) Local Mute ساکت شده محلی Muted (self) Deafened (self) ConfigDialog Accept changes قبول تغییرات This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. Reject changes This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. Apply changes اعمال تغییرات This button will immediately apply all changes. این کلید به صورت خودکار تمام تغییرات را اعمال می کند. Undo changes for current page باز گردادن تغییرات برای این صفحه This button will revert any changes done on the current page to the most recent applied settings. Restore defaults for current page This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. Mumble Configuration پیکربندی Mumble ConnectDialog Connecting to %1 Enter username نام کاربری خود را وارد کنید Adding host %1 Servername Hostname نام میزبان Bonjour name Port پورت Addresses ادرس ها Website تارنما Packet loss Ping (80%) %1 ms Ping (95%) Bandwidth پهنای باند %1 kbit/s &Connect &Filters Unknown Users کاربران Version Failed to fetch server list Mumble Server Connect Ping Remove from Favorites حذف کردن از علاقه مندی ها Add custom server Show all servers that respond to ping Show all servers with users تمامی میزبان ها و کاربرانشان را نشان بده Show all servers تمامی میزبان ها را نشان بده &Copy Copy favorite link to clipboard &Paste &چسباندن Paste favorite from clipboard &Edit... &Add New... Add to &Favorites به &علاقه مندی ها اضافه کن Open &Webpage Show &Reachable Show &Populated Show &All &همه را نشان ده ConnectDialogEdit Edit Server ویرایش میزبان Name of the server A&ddress &آدرس ها Internet address of the server. Internet address of the server. آدرس های اینترنتی میزبان <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. &Port &پورت Port on which the server is listening <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. &Username &نام کاربری Username to send to the server <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. Label برچسب Add Server اضافه کردن میزبان You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 Password رمزعبور Password to send to the server رمزی که قرار است برای میزبان ارسال شود <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. Show password رمز را نشان ده <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. Local server label 127.0.0.1 ۱۲۷.۰.۰.۱ 64738 ۶۴۷۳۸ Your username نام کاربری شما Your password &Fill CoreAudioSystem Default Device CrashReporter Mumble Crash Report <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> Email address (optional) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash Send Report Don't send report Crash upload successful Thank you for helping make Mumble better! Crash upload failed We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 Uploading crash report Abort upload DXAudioInput Default DirectSound Voice Input Opening chosen DirectSound Input device failed. No microphone capture will be done. Opening chosen DirectSound Input failed. Default device will be used. Lost DirectSound input device. DXAudioOutput Default DirectSound Voice Output Opening chosen DirectSound Output failed. Default device will be used. Lost DirectSound output device. Opening chosen DirectSound Output failed. No audio will be heard. Database Mumble failed to initialize a database in any of the possible locations. The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. DeveloperConsole Developer Console DockTitleBar Drag here GlobalShortcut Shortcuts List of configured shortcuts Function Data Shortcut Suppress Add new shortcut This will add a new global shortcut &Add Remove selected shortcut This will permanently remove a selected shortcut. &Remove <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> Open Accessibility Preferences Skip Enable Global Shortcuts <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. Additional Shortcut Engines <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. Enable Windows hooks <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. Enable GKey <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. Enable XInput <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. Enable shortcuts in privileged applications GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> Shortcuts Shortcut button combination. <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. Suppress keys from other applications <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. GlobalShortcutTarget Whisper Target Whisper to list of Users Channel Target Restrict to Group If specified, only members of this group will receive the whisper. List of users Add Remove Modifiers Do not send positional audio information when using this whisper shortcut. Ignore positional audio Shout to Linked channels Shout to subchannels Shout to Channel The whisper will also be transmitted to linked channels. The whisper will also be sent to the subchannels of the channel target. GlobalShortcutX Mouse %1 JackAudioSystem Hardware Ports Mono Stereo LCD Not connected LCDConfig Enable this device LCD Devices Name <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> Size Enabled Views Minimum Column Width <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> This setting decides the width of column splitter. Splitter Width Log Debug Critical Warning Information Server Connected Server Disconnected Other self-muted/deafened Permission Denied Text Message User Joined Server User Left Server User recording state changed User kicked (you or by you) User kicked You self-muted User muted (you) User muted (by you) User muted (other) User Joined Channel User Left Channel You self-unmuted You self-deafened You self-undeafened User renamed You Joined Channel You Joined Channel (moved) User connected and entered channel User left channel and disconnected Private text message the server [[ Invalid size ]] [[ Text object too large to display ]] [Date changed to %1] link to %1 FTP link to %1 player link channel link %1 link LogConfig Toggle console for %1 events Toggle pop-up notifications for %1 events Toggle Text-To-Speech for %1 events Click here to toggle sound notification for %1 events Toggle window highlight (if not active) for %1 events Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. Messages Message Console Notification Text-To-Speech Soundfile Path Text To Speech Volume Volume of Text-To-Speech Engine <b>This is the volume used for the speech synthesis.</b> Length threshold Message length threshold for Text-To-Speech Engine <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. Characters Whisper If checked you will only hear whispers from users you added to your friend list. Only accept whispers from friends If enabled text messages you send will be read back to you with TTS Read back own messages Chat Log Maximum chat length Unlimited Lines Highlight LookConfig System default None Only with users All Ask Do Nothing Move <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory User Interface This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. List users above subchannels (requires restart). <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. Users above Channels <b>If set, will verify you want to quit if connected.</b> Show number of users in each channel Show channel user count Language Language to use (requires restart) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. Look and Feel Layout Classic Stacked Hybrid Custom This changes the behavior when moving channels. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. Expand When to automatically expand channels Channel Dragging Ask whether to close or minimize when quitting Mumble. Ask on quit while connected Always On Top <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> Hide in tray when minimized Hide the main Mumble window in the tray when it is minimized. This setting controls when the application will be always on top. Never Always In minimal view In normal view Displays talking status in system tray Show talking status in tray icon This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. Show context menu in menu bar Apply some high contrast optimizations for visually impaired users Optimize for high contrast Application Adds user and channel context menus into the menu bar Tray Icon Channel Tree Use selected item as the chat bar target Filter automatically hides empty channels Show transmit mode dropdown in toolbar Theme Theme to use to style the user interface <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. User Dragging This changes the behavior when moving users. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. Enable Developer menu When in custom layout mode, checking this disables rearranging. Lock layout MainWindow Root Push-to-Talk Global Shortcut Push and hold this button to send voice. Global Shortcut This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut Reset Audio Processor Global Shortcut Unlink Plugin Global Shortcut Push-to-Mute Global Shortcut Join Channel Global Shortcut Toggle Overlay Global Shortcut Toggle state of in-game overlay. Global Shortcut Toggle Minimal Global Shortcut Volume Up (+10%) Global Shortcut Volume Down (-10%) Global Shortcut Mumble Mumble -- %1 &Window Minimize Ctrl+M Close Mumble is currently connected to a server. Do you want to Close or Minimize it? Mute Self Global Shortcut Set self-mute status. Global Shortcut This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut Deafen Self Global Shortcut Set self-deafen status. Global Shortcut This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut Whisper/Shout Whisper <center>Not connected</center> Not connected Clear Opening URL %1 File does not exist File is not a configuration file. Settings merged from file. URL scheme is not 'mumble' This version of Mumble can't handle URLs for Mumble version %1.%2.%3 Connecting to %1 Enter username Connecting to server %1. Reconnecting. Transmit Mode set to Continuous <p>%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> Register yourself as %1 <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <h2>Version</h2><p>Protocol %1</p> <p>No build information or OS version available</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) The connection is secured by the cipher suite that OpenSSL identifies as %1 <p>The connection provides perfect forward secrecy</p> <p>The connection does not provide perfect forward secrecy</p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> Voice channel is sent over control channel Register user %1 <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> Kicking user %1 Banning user %1 View comment on user %1 Message to channel %1 Connected. <li>Expected certificate digest (SHA-1): %1</li> Server presented a certificate which failed verification. <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> SSL Version mismatch Server connection failed. <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>Type message to user '%1' here</center> Type message to user '%1' here Choose image file Failed to load image Could not open file for reading. Image format not recognized. &User &Channel Use in conjunction with Whisper to. Global Shortcut This will switch the states of the in-game overlay. Global Shortcut Link Channel Global Shortcut Cycle Transmit Mode Global Shortcut Set Transmit Mode to Push-To-Talk Global Shortcut Set Transmit Mode to Continuous Global Shortcut Set Transmit Mode to VAD Global Shortcut Send Text Message Global Shortcut Send Clipboard Text Message Global Shortcut This will send your Clipboard content to the channel you are currently in. Global Shortcut Continuous Voice Activity Push-to-Talk Mumble - Minimal View -- %1 Cancel Save Image As... Save Image File Could not save image: %1 Change your comment Transmit Mode set to Voice Activity Transmit Mode set to Push-to-Talk <p>Connected users: %1/%2</p> UDP Statistics To Server From Server Good Late Lost Resync <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> Mumble Server Information &View Certificate Enter reason Sending message to %1 To %1: %2 Message to %1 Are you sure you want to reset the comment of user %1? Are you sure you want to reset the avatar of user %1? Are you sure you want to delete %1 and all its sub-channels? Sending message to channel %1 Message to tree %1 To %1 (Tree): %2 (Tree) %1: %2 Unmuted and undeafened. Unmuted. Muted. Muted and deafened. Deafened. Undeafened. Restart Mumble? Some settings will only apply after a restart of Mumble. Restart Mumble now? About Qt SSL Verification failed: %1 <li>Server certificate digest (SHA-1): %1</li> <b>WARNING:</b> The server presented a certificate that was different from the stored one. This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. Server connection failed: %1. Disconnected from server. Invalid username You connected with an invalid username, please try another one. Username in use That username is already in use, please try another username. Wrong certificate or password Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. Wrong password Wrong server password for unregistered user account, please try again. Images (*.png *.jpg *.jpeg) C&onfigure &Help Log This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. &Quit Mumble Closes the program Exits the application. Ctrl+Q Open the server connection dialog &Disconnect Disconnect from server Disconnects you from the server. Show information about the server connection This will show extended information about the connection to the server. &Mute &Deafen &Local Mute Send a Text Message Sends a text message to another user. Add new channel This adds a new sub-channel to the currently selected channel. Remove channel This removes a channel and all sub-channels. Edit Groups and ACL for channel This opens the Group and ACL dialog for the channel, to control permissions. &Link Link your channel to another channel This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. Chatbar Shows a dialog of registered servers, and also allows quick-connect. Kick user (with reason) Kick selected user off server. You'll be asked to specify a reason. Mute user Mute or unmute user on server. Unmuting a deafened user will also undeafen them. Kick and ban user (with reason) Kick and ban selected user from server. You'll be asked to specify a reason. Deafen user Deafen or undeafen user on server. Deafening a user will also mute them. Mute user locally Mute or unmute user locally. Use this on other users in the same room. This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. &Unlink Channel Unlink your channel from another channel This unlinks your current channel from the selected channel. Unlinks your channel from all linked channels. This unlinks your current channel (not the selected one) from all linked channels. &Reset Reset audio preprocessor This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. &Mute Self Mute yourself Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. &Deafen Self Deafen yourself Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. &Text-To-Speech Toggle Text-To-Speech Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. Display audio statistics Pops up a small dialog with information about your current audio input. Forcibly unlink plugin This forces the current plugin to unlink, which is handy if it is reading completely wrong data. Configure Mumble Allows you to change most settings for Mumble. Start the audio configuration wizard This will guide you through the process of configuring your audio hardware. &What's This? Enter What's This? mode Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. Information about Mumble Shows a small dialog with information and license for Mumble. Information about Speex Shows a small dialog with information about Speex. Information about Qt Shows a small dialog with information about Qt. Check for &Updates Check for new version of Mumble Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. Sends a text message to all users in a channel. Configure certificates for strong authentication This starts the wizard for creating, importing and exporting certificates for authentication against servers. Register user on server This will permanently register the user on the server. Add &Friend Adds a user as your friend. This will add the user as a friend, so you can recognize him on this and other servers. &Remove Friend Removes a user from your friends. This will remove a user from your friends list. &Update Friend Update name of your friend. Your friend uses a different name than what is in your database. This will update the name. Edit registered users list This opens the editor for registered users, which allow you to change their name or unregister them. Add or remove text-based access tokens &Minimal View Toggle minimal window modes This will toggle minimal mode, where the log window and menu is hidden. You muted and deafened %1. You unmuted and undeafened %1. You undeafened %1. You suppressed %1. %1 muted and deafened by %2. %1 unmuted and undeafened by %2. %1 undeafened by %2. %1 suppressed by %2. %1 moved to %2. %1 moved to %2 by %3. %1 moved in from %2 by %3. %1 is now muted and deafened. Your account information can not be verified currently. Please try again later Welcome message: %1 Mumble: %1 You were denied %1 privileges in %2. %3 was denied %1 privileges in %2. Denied: Cannot modify SuperUser. Denied: Invalid channel name. Denied: Text message too long. Denied: Operation not permitted in temporary channel. You need a certificate to perform this operation. %1 does not have a certificate. Invalid username: %1. Invalid username. Channel is full. Channel nesting limit reached. Channel count limit reached. Need to delete channels before creating new ones. Permission denied. %1 connected and entered channel. %1 connected. %1 is now muted. %1 is now unmuted. Recording started Recording stopped %1 started recording. %1 stopped recording. You revoked your priority speaker status. You assumed priority speaker status. %1 revoked your priority speaker status. %1 gave you priority speaker status. You revoked priority speaker status for %1. You gave priority speaker status to %1. %1 revoked own priority speaker status. %1 assumed priority speaker status. %1 revoked priority speaker status for %2. %1 gave priority speaker status to %2. You were unmuted and undeafened by %1. You were muted by %1. You were undeafened by %1. You were suppressed. You were suppressed by %1. You were unsuppressed. You were unsuppressed by %1. You joined %1. You moved %1 to %2. %1 is recording %1 renamed to %2 by %3. %1 disconnected. Server message from (Tree) (Channel) (Private) %2%1: %3 Failed to load Opus, it will not be available for audio encoding/decoding. The server requests minimum client version %1 The server requests positional audio be enabled. The server requests positional audio be disabled. The server requests Push-to-Talk be enabled. The server requests Push-to-Talk be disabled. You were unmuted by %1. You muted %1. You unsuppressed %1. You unmuted %1. %1 muted by %2. %1 unsuppressed by %2. %1 unmuted by %2. Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. You were muted and deafened by %1. You were deafened by %1. You were kicked from the server by %1: %2. %3 was kicked from the server by %1: %2. You were kicked and banned from the server by %1: %2. %3 was kicked and banned from the server by %1: %2. You were moved to %1 by %2. %1 entered channel. Server connection rejected: %1. Denied: %1. %1 renamed to %2. %1 left channel and disconnected. Message from %1 You have User Dragging set to "Do Nothing" so the user wasn't moved. You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. Unknown Channel Drag mode in UserModel::dropMimeData. Remote controlling Mumble: Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) -jn, --jackname Set custom Jack client name. --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status Invocation Error: No RPC command specified RPC Welcome to Mumble. Skipping version check in debug mode. Hide Frame Toggle showing frame on minimal window This will toggle whether the minimal window should have a frame for moving and resizing. &Unlink All Reset the comment of the selected user. &Join Channel View comment in editor Query server for connection information for user S&erver &Self &Unlink Plugins Register yourself on the server Change your avatar image on this server &Remove Avatar Remove currently defined avatar image. Icon Toolbar Change your own comment Recording Priority Speaker &Copy URL Copies a link to this channel to the clipboard. Ignore Messages Locally ignore user's text chat messages. Silently drops all text messages from the user. Edit ban list on server This lets you edit the server-side IP ban list. &Filter on/off Toggle the channel filter (Ctrl+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. Ctrl+F &Hide Channel when Filtering Reset the avatar of the selected user. Locally adjust the user's speech volume. Opens a dialog with a volume slider. Use this on other users in the same room. &Developer &Hide Mumble Hides the main Mumble window. Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. Show the Developer Console Shows the Mumble Developer Console, where Mumble's log output can be inspected. &Connect... &Ban list... &Information... &Kick... &Ban... Local Volume Adjustment... Send &Message... &Add... &Remove... &Edit... Audio S&tatistics... &Settings... &Audio Wizard... Developer &Console... &About... About &Speex... About &Qt... &Certificate Wizard... &Register... Registered &Users... Change &Avatar... &Access Tokens... Reset &Comment... Reset &Avatar... View Comment... &Change Comment... R&egister... Show Shows the main Mumble window. Manual Manual Mumble Positional Audio Position X Y Z m Heading Azimuth Elevation ° Meta data Context Identity Set State Linked Activated Unhinge NetworkConfig Network Updates are mandatory when using snapshot releases. Connection Use TCP compatibility mode Use TCP compatability mode <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). Reconnect when disconnected <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. Reconnect automatically Proxy Type Type of proxy to connect through Direct connection HTTP(S) proxy SOCKS5 proxy Hostname Hostname of the proxy Force TCP mode Enable QoS to prioritize packets This will enable QoS, which will attempt to prioritize voice packets over other traffic. Use Quality of Service Don't send certificate to server and don't save passwords. (Not saved). <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> Suppress certificate and password storage <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. Port Port number of the proxy <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. Username Username for proxy authentication <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Password Password for proxy authentication <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Mumble services Check for new releases of Mumble automatically. This will check for new releases of Mumble every time you start the program, and notify you if one is available. Check for application updates on startup Check for new releases of plugins automatically. This will check for new releases of plugins every time you start the program, and download them automatically. <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. Submit anonymous statistics to the Mumble project Submit anonymous statistics Reconnect to last used server when starting Mumble Reconnect to last server on startup Download plugin and overlay updates on startup Privacy Prevent OS information being sent to Mumble servers and web servers <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. Do not send OS information to Mumble servers and web servers Overlay Silent Talking Whisper Shout Channel Failed to create communication with overlay at %2: %1. No overlay will be available. OverlayClient Filter Only talking Talking and recently active All in current channel All in linked channels Always show yourself Configure recently active time (%1 seconds)... Columns Sort Alphabetically Last state change Edit... Reset Zoom Configure recently active time Amount of seconds users remain active after talking: OverlayConfig To move the users, drag the little red dot. To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. For more options, right click a user. For more options, rightclick a user. Launcher Filter Overlay Choose executable Choose application Choose path Load Overlay Presets Mumble overlay presets (*.mumblelay) Save Overlay Presets Options Enable overlay. Enable Overlay This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. Layout Blacklist Whitelist Uninstall Overlay Overlay Installation Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. Install Mumble Overlay Overlay Upgrade Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. Upgrade Mumble Overlay Display a frame counter in the overlay Show FPS counter Load an overlay preset from file Load… Save your overlay settings to file Save… Set the overlay font. Set the overlay text color. Color Remove Font FPS and Clock Display Display a clock in the overlay showing the current local time (system time). Show Clock Overlay Exceptions Overlay Exception Mode Allowed launchers Add Allowed programs Allowed paths Blacklisted programs OverlayEditor State User is not talking Passive User is talking in your channel or a linked channel Talking User is whispering to you privately Private Whisper User is shouting to your channel Channel Whisper Zoom Zoom Factor Enabled Elements User avatar, chosen by each user Avatar User's name Username Name of user's channel, if outside your current channel Channel Muted or deafened Mute state Bounding box, automatically shrunk to minimum size to contain all visible elements Bounding box Overlay Editor OverlayEditorScene Layout preset Large square avatar Avatar and Name User Opacity %1% Object Opacity Alignment Left Center Right Top Bottom Color... Font... Bounding box Pen width Padding Pen color Fill color Pick pen color Pick fill color Pick color Pick font PluginConfig Plugins Plugin has no configure function. Plugin has no about function. Options Enable plugins and transmit positional information This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. Link to Game and Transmit Position Reloads all plugins This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. &Reload plugins Information about plugin This shows a small information message about the plugin. &About Show configuration page of plugin This shows the configuration page of the plugin, if any. &Configure Name Enabled Plugins Skipping plugin update in debug mode. Downloaded new or updated plugin to %1. Failed to install new plugin to %1. %1 lost link. %1 linked. PortAudioSystem Default Device PulseAudioSystem Default Input Default Output QApplication Failed to restart mumble Mumble failed to restart itself. Please restart it manually. RichTextEditor Failed to load image Image file too large to embed in document. Please use images smaller than %1 kB. Message is too long. Display Source Text &Bold Ctrl+B &Italic Italic Ctrl+I Underline Ctrl+U Color Insert Link Ctrl+L Insert Image RichTextEditorLink Add Link URL Text ServerHandler Unable to resolve hostname Server is not responding to TCP pings UDP packets cannot be sent to or received from the server. Switching to TCP mode. UDP packets cannot be sent to the server. Switching to TCP mode. UDP packets cannot be received from the server. Switching to TCP mode. UDP packets can be sent to and received from the server. Switching back to UDP mode. Connection timed out ServerView Favorite LAN Public Internet Unknown Africa Asia North America South America Europe Oceania ShortcutActionWidget Unassigned ShortcutDelegate On Off Toggle Unassigned ShortcutKeyWidget Press Shortcut ShortcutTargetDialog Root Parent Current Subchannel #%1 ShortcutTargetWidget ... , Root Parent Current Subchannel #%1 Invalid Empty <Empty> ShortcutToggleWidget Off Toggle On TextMessage Enter text If checked the message is recursively sent to all subchannels Send recursively to subchannels Tokens Empty Token Mumble - Access Tokens List of access tokens on current server <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. Add a token &Add Remove a token &Remove UserEdit Registered Users Remove Rename Who are you looking for? Days Weeks Months Years Inactive for Registered users: %n account(s) UserInformation User Information Connection Information Version OS Certificate IP Address CELT Versions Details... Ping Statistics Pings received Average ping TCP (Control) UDP (Voice) UDP Network statistics Good Late Lost Resync From Client To Client Connection time %1w %1d %1h %1m %1s , %1 (%2) %1.%2.%3 (%4) Supported Not Supported Not Reported %1 online (%2 idle) %1 online %1 kbit/s Bandwidth GroupBox Bandwidth Label Ping deviation UserListModel Nick Inactive days Last channel Last seen: %1 Never Channel ID: %1 UserLocalVolumeDialog Local volume for other users <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. Adjusting local volume for %1 dB <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: Talking to your channel. Shouting directly to your channel. Whispering directly to your channel. Whispering directly to you. Not talking. This is a channel on the server. The icon indicates the state of the channel: Your current channel. A channel that is linked with your channel. Linked channels can talk to each other. A channel on the server that you are not linked to. This shows the flags the user has on the server, if any: On your friend list Authenticated user Muted (manually muted by self) Muted (manually muted by admin) Muted (not allowed to speak in current channel) Muted (muted by you, only on your machine) Muted (push-to-mute) Deafened (by self) Deafened (by admin) User has a new comment set (click to show) User has a comment set, which you've already seen. (click to show) Ignoring Text Messages This shows the flags the channel has, if any: Channel has a new comment set (click to show) Channel has a comment set, which you've already seen. (click to show) Channel will be hidden when filtering is enabled Name Flags Are you sure you want to drag this user? Are you sure you want to drag this channel? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. VersionCheck Upgrade Mumble A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? Failed to launch snapshot installer. Corrupt download of new version detected. Automatically removed. Downloading new snapshot from %1 to %2 Failed to write new version to disk. Failed to write new version to disc. Mumble failed to retrieve version information from the central server. ViewCert Certificate Chain Details Certificate chain Certificate details Common Name Organization Subunit Country Locality State Valid from: %1 Valid to: %1 Serial: %1 Public Key: %1 bits %2 RSA DSA Digest (SHA-1): %1 Digest (SHA-256): %1 Email: %1 DNS: %1 Issued by: Unit Name VoiceRecorder Recorder failed to create directory '%1' Recorder failed to open file '%1' .wav - Uncompressed .ogg (Vorbis) - Compressed .au - Uncompressed .flac - Lossless compressed VoiceRecorderDialog Recorder Control 00:00:00 &Start S&top Mode Multichannel Output Output format Target directory Filename &Browse... Valid variables are: Inserts the user's name Inserts the current date Inserts the current time Inserts the hostname Recorder still running Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? Unable to start recording. Not connected to a server. The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. There is already a recorder active for this server. Please select a recording format. Stopping Select target directory Downmix WASAPIInput Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone. WASAPISystem Default Device qwPTTButtonWidget Mumble PTT Push to talk mumble-1.3.4/src/mumble/Log.ui0000664000175000017500000001500514010707273015772 0ustar builderbuilder LogConfig 0 0 446 334 Messages true QAbstractItemView::SingleSelection false true false Message Console Notification Highlight Text-To-Speech Soundfile Path Text To Speech Volume qsVolume Volume of Text-To-Speech Engine <b>This is the volume used for the speech synthesis.</b> 100 5 20 Qt::Horizontal QSlider::TicksBelow 5 Length threshold qsbThreshold Message length threshold for Text-To-Speech Engine <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. QAbstractSpinBox::PlusMinus Characters 5000 10 If enabled text messages you send will be read back to you with TTS Read back own messages Whisper If checked you will only hear whispers from users you added to your friend list. Only accept whispers from friends Chat Log Maximum chat length QAbstractSpinBox::PlusMinus Unlimited Lines 1000000 100 Qt::Horizontal 8 16 mumble-1.3.4/src/mumble/WASAPI.cpp0000664000175000017500000010024314010707274016402 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "WASAPI.h" #include "WASAPINotificationClient.h" #include "MainWindow.h" // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" // Now that Win7 is published, which includes public versions of these // interfaces, we simply inherit from those but use the "old" IIDs. DEFINE_GUID(IID_IVistaAudioSessionControl2, 0x33969B1DL, 0xD06F, 0x4281, 0xB8, 0x37, 0x7E, 0xAA, 0xFD, 0x21, 0xA9, 0xC0); MIDL_INTERFACE("33969B1D-D06F-4281-B837-7EAAFD21A9C0") IVistaAudioSessionControl2 : public IAudioSessionControl2 { }; DEFINE_GUID(IID_IAudioSessionQuery, 0x94BE9D30L, 0x53AC, 0x4802, 0x82, 0x9C, 0xF1, 0x3E, 0x5A, 0xD3, 0x47, 0x75); MIDL_INTERFACE("94BE9D30-53AC-4802-829C-F13E5AD34775") IAudioSessionQuery : public IUnknown { virtual HRESULT STDMETHODCALLTYPE GetQueryInterface(IAudioSessionEnumerator **) = 0; }; /// Convert the configured 'wasapi/role' to an ERole. static ERole WASAPIRoleFromSettings() { QString role = g.s.qsWASAPIRole.toLower().trimmed(); if (role == QLatin1String("console")) { return eConsole; } else if (role == QLatin1String("multimedia")) { return eMultimedia; } return eCommunications; } class WASAPIInputRegistrar : public AudioInputRegistrar { public: WASAPIInputRegistrar(); virtual AudioInput *create(); virtual const QList getDeviceChoices(); virtual void setDeviceChoice(const QVariant &, Settings &); virtual bool canEcho(const QString &) const; virtual bool canExclusive() const; }; class WASAPIOutputRegistrar : public AudioOutputRegistrar { public: WASAPIOutputRegistrar(); virtual AudioOutput *create(); virtual const QList getDeviceChoices(); virtual void setDeviceChoice(const QVariant &, Settings &); bool canMuteOthers() const; virtual bool canExclusive() const; }; class WASAPIInit : public DeferInit { WASAPIInputRegistrar *wirReg; WASAPIOutputRegistrar *worReg; public: WASAPIInit() : wirReg(NULL), worReg(NULL) { } void initialize(); void destroy(); }; static WASAPIInit wasapiinit; extern bool bIsWin7, bIsVistaSP1; void WASAPIInit::initialize() { wirReg = NULL; worReg = NULL; if (! bIsVistaSP1) { qWarning("WASAPIInit: Requires Vista SP1"); return; } HMODULE hLib = LoadLibrary(L"AVRT.DLL"); if (hLib == NULL) { qWarning("WASAPIInit: Failed to load avrt.dll"); return; } FreeLibrary(hLib); wirReg = new WASAPIInputRegistrar(); worReg = new WASAPIOutputRegistrar(); } void WASAPIInit::destroy() { delete wirReg; delete worReg; } WASAPIInputRegistrar::WASAPIInputRegistrar() : AudioInputRegistrar(QLatin1String("WASAPI"), 10) { } /// Calls getMixFormat on given IAudioClient and checks whether it is compatible. /// At the moment this means the format is either 32bit float or 16bit PCM. /// /// @param sourceName Name to prepend to log in case of error /// @param deviceName Device name to refer to in case of error /// @param audioClient IAudioClient to get and check mix format for /// @param waveFormatEx WAVEFORMATEX structure to store getMixFormat result in /// @param waveFormatExtensible If waveFormatEx is of type WAVEFORMATEXTENSIBLE receives a cast pointer. /// @param sampleFormat Receives either SampleFloat or SampleShort as valid format /// @return True if mix format is ok. False if incompatible or another error occured. template // Template on SampleFormat enum as AudioOutput and AudioInput each define their own bool getAndCheckMixFormat(const char* sourceName, const char* deviceName, IAudioClient* audioClient, WAVEFORMATEX **waveFormatEx, WAVEFORMATEXTENSIBLE **waveFormatExtensible, SAMPLEFORMAT *sampleFormat) { *waveFormatEx = NULL; *waveFormatExtensible = NULL; HRESULT hr = audioClient->GetMixFormat(waveFormatEx); if (FAILED(hr)) { qWarning("%s: %s GetMixFormat failed: hr=0x%08lx", sourceName, deviceName, hr); return false; } if ((*waveFormatEx)->wFormatTag == WAVE_FORMAT_EXTENSIBLE) { (*waveFormatExtensible) = reinterpret_cast((*waveFormatEx)); if ((*waveFormatExtensible)->SubFormat == KSDATAFORMAT_SUBTYPE_IEEE_FLOAT) { *sampleFormat = SAMPLEFORMAT::SampleFloat; } else if ((*waveFormatExtensible)->SubFormat == KSDATAFORMAT_SUBTYPE_PCM) { *sampleFormat = SAMPLEFORMAT::SampleShort; } else { qWarning() << sourceName << ":" << deviceName << "Subformat is not IEEE Float or PCM but:" << (*waveFormatExtensible)->SubFormat; return false; } } else { if ((*waveFormatEx)->wFormatTag == WAVE_FORMAT_IEEE_FLOAT) { *sampleFormat = SAMPLEFORMAT::SampleFloat; } else if ((*waveFormatEx)->wFormatTag != WAVE_FORMAT_PCM) { *sampleFormat = SAMPLEFORMAT::SampleShort; } else { qWarning() << sourceName << ":" << deviceName << "format tag is not IEEE Float or PCM but:" << (*waveFormatEx)->wFormatTag; return false; } } if (*sampleFormat == SAMPLEFORMAT::SampleFloat) { if ((*waveFormatEx)->wBitsPerSample != (sizeof(float) * 8)) { qWarning() << sourceName << ":" << deviceName << "unexpected number of bits per sample for IEEE Float:" << (*waveFormatEx)->wBitsPerSample; return false; } } else if (*sampleFormat == SAMPLEFORMAT::SampleShort) { if ((*waveFormatEx)->wBitsPerSample != (sizeof(short) * 8)) { qWarning() << sourceName << ":" << deviceName << "unexpected number of bits per sample for PCM:" << (*waveFormatEx)->wBitsPerSample; return false; } } else { qFatal("%s: %s unexpected sample format %lu", sourceName, deviceName, static_cast(*sampleFormat)); return false; } return true; } AudioInput *WASAPIInputRegistrar::create() { return new WASAPIInput(); } const QList WASAPIInputRegistrar::getDeviceChoices() { return WASAPISystem::mapToDevice(WASAPISystem::getInputDevices(), g.s.qsWASAPIInput); } void WASAPIInputRegistrar::setDeviceChoice(const QVariant &choice, Settings &s) { s.qsWASAPIInput = choice.toString(); } bool WASAPIInputRegistrar::canEcho(const QString &outputsys) const { return (outputsys == name); } bool WASAPIInputRegistrar::canExclusive() const { return true; } WASAPIOutputRegistrar::WASAPIOutputRegistrar() : AudioOutputRegistrar(QLatin1String("WASAPI"), 10) { } AudioOutput *WASAPIOutputRegistrar::create() { return new WASAPIOutput(); } const QList WASAPIOutputRegistrar::getDeviceChoices() { return WASAPISystem::mapToDevice(WASAPISystem::getOutputDevices(), g.s.qsWASAPIOutput); } void WASAPIOutputRegistrar::setDeviceChoice(const QVariant &choice, Settings &s) { s.qsWASAPIOutput = choice.toString(); } bool WASAPIOutputRegistrar::canMuteOthers() const { return true; } bool WASAPIOutputRegistrar::canExclusive() const { return true; } const QHash WASAPISystem::getInputDevices() { return getDevices(eCapture); } const QHash WASAPISystem::getOutputDevices() { return getDevices(eRender); } const QHash WASAPISystem::getDevices(EDataFlow dataflow) { QHash devices; HRESULT hr; IMMDeviceEnumerator *pEnumerator = NULL; IMMDeviceCollection *pCollection = NULL; hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), reinterpret_cast(&pEnumerator)); if (! pEnumerator || FAILED(hr)) { qWarning("WASAPI: Failed to instatiate enumerator: hr=0x%08lx", hr); } else { hr = pEnumerator->EnumAudioEndpoints(dataflow, DEVICE_STATE_ACTIVE, &pCollection); if (! pCollection || FAILED(hr)) { qWarning("WASAPI: Failed to enumerate: hr=0x%08lx", hr); } else { devices.insert(QString(), tr("Default Device")); UINT ndev = 0; pCollection->GetCount(&ndev); for (unsigned int idx=0;idxItem(idx, &pDevice); pDevice->OpenPropertyStore(STGM_READ, &pStore); LPWSTR strid = NULL; pDevice->GetId(&strid); PROPVARIANT varName; PropVariantInit(&varName); pStore->GetValue(PKEY_Device_FriendlyName, &varName); devices.insert(QString::fromWCharArray(strid), QString::fromWCharArray(varName.pwszVal)); PropVariantClear(&varName); CoTaskMemFree(strid); pStore->Release(); pDevice->Release(); } pCollection->Release(); } pEnumerator->Release(); } return devices; } const QList WASAPISystem::mapToDevice(const QHash& devs, const QString& match) { QList qlReturn; QStringList qlDevices = devs.keys(); qSort(qlDevices); if (qlDevices.contains(match)) { qlDevices.removeAll(match); qlDevices.prepend(match); } foreach(const QString &dev, qlDevices) { qlReturn << audioDevice(devs.value(dev), dev); } return qlReturn; } WASAPIInput::WASAPIInput() { }; WASAPIInput::~WASAPIInput() { bRunning = false; wait(); } static IMMDevice *openNamedOrDefaultDevice(const QString& name, EDataFlow dataFlow, ERole role) { HRESULT hr; IMMDeviceEnumerator *pEnumerator = NULL; hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), reinterpret_cast(&pEnumerator)); if (!pEnumerator || FAILED(hr)) { qWarning("WASAPI: Failed to instantiate enumerator: hr=0x%08lx", hr); return NULL; } IMMDevice *pDevice = NULL; // Try to find a device pointer for |name|. if (!name.isEmpty()) { STACKVAR(wchar_t, devname, name.length() + 1); int len = name.toWCharArray(devname); devname[len] = 0; hr = pEnumerator->GetDevice(devname, &pDevice); if (FAILED(hr)) { qWarning("WASAPI: Failed to open selected device %s %ls (df=%d, e=%d, hr=0x%08lx), falling back to default", qPrintable(name), devname, dataFlow, role, hr); } else { WASAPINotificationClient::get().enlistDeviceAsUsed(devname); } } // Use the default device if |pDevice| is still NULL. // We retrieve the actual device name for the currently selected default device and // open the device by it's real name to work around triggering the automatic // ducking behavior. if (!pDevice) { hr = pEnumerator->GetDefaultAudioEndpoint(dataFlow, role, &pDevice); if (FAILED(hr)) { qWarning("WASAPI: Failed to open device: df=%d, e=%d, hr=0x%08lx", dataFlow, role, hr); goto cleanup; } wchar_t *devname = NULL; hr = pDevice->GetId(&devname); if (FAILED(hr)) { qWarning("WASAPI: Failed to query device: df=%d, e=%d, hr=0x%08lx", dataFlow, role, hr); goto cleanup; } pDevice->Release(); hr = pEnumerator->GetDevice(devname, &pDevice); if (FAILED(hr)) { qWarning("WASAPI: Failed to reopen default device: df=%d, e=%d, hr=0x%08lx", dataFlow, role, hr); goto cleanup; } WASAPINotificationClient::get().enlistDefaultDeviceAsUsed(devname); CoTaskMemFree(devname); } cleanup: if (pEnumerator) pEnumerator->Release(); return pDevice; } void WASAPIInput::run() { HRESULT hr; IMMDevice *pMicDevice = NULL; IAudioClient *pMicAudioClient = NULL; IAudioCaptureClient *pMicCaptureClient = NULL; IMMDevice *pEchoDevice = NULL; IAudioClient *pEchoAudioClient = NULL; IAudioCaptureClient *pEchoCaptureClient = NULL; WAVEFORMATEX *micpwfx = NULL, *echopwfx = NULL; WAVEFORMATEXTENSIBLE *micpwfxe = NULL, *echopwfxe = NULL; WAVEFORMATEXTENSIBLE wfe; UINT32 bufferFrameCount; UINT32 numFramesAvailable; UINT32 micPacketLength = 0, echoPacketLength = 0; UINT32 allocLength; UINT64 devicePosition; UINT64 qpcPosition; HANDLE hEvent; BYTE *pData; DWORD flags; DWORD dwTaskIndex = 0; HANDLE hMmThread; float *tbuff = NULL; short *sbuff = NULL; bool doecho = g.s.doEcho(); REFERENCE_TIME def, min, latency, want; bool exclusive = false; CoInitialize(NULL); hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); hMmThread = AvSetMmThreadCharacteristics(L"Pro Audio", &dwTaskIndex); if (hMmThread == NULL) { qWarning("WASAPIInput: Failed to set Pro Audio thread priority"); } // Open mic device. pMicDevice = openNamedOrDefaultDevice(g.s.qsWASAPIInput, eCapture, WASAPIRoleFromSettings()); if (!pMicDevice) goto cleanup; // Open echo capture device. if (doecho) { pEchoDevice = openNamedOrDefaultDevice(g.s.qsWASAPIOutput, eRender, WASAPIRoleFromSettings()); if (!pEchoDevice) doecho = false; } hr = pMicDevice->Activate(__uuidof(IAudioClient), CLSCTX_ALL, NULL, (void **) &pMicAudioClient); if (FAILED(hr)) { qWarning("WASAPIInput: Activate Mic AudioClient failed: hr=0x%08lx", hr); goto cleanup; } def = min = latency = 0; pMicAudioClient->GetDevicePeriod(&def, &min); want = qMax(min, 100000); qWarning("WASAPIInput: Latencies %lld %lld => %lld", def, min, want); if (g.s.bExclusiveInput && ! doecho) { for (int channels = 1; channels<=2; ++channels) { ZeroMemory(&wfe, sizeof(wfe)); wfe.Format.cbSize = 0; wfe.Format.wFormatTag = WAVE_FORMAT_PCM; wfe.Format.nChannels = channels; wfe.Format.nSamplesPerSec = 48000; wfe.Format.wBitsPerSample = 16; wfe.Format.nBlockAlign = wfe.Format.nChannels * wfe.Format.wBitsPerSample / 8; wfe.Format.nAvgBytesPerSec = wfe.Format.nBlockAlign * wfe.Format.nSamplesPerSec; micpwfxe = &wfe; micpwfx = reinterpret_cast(&wfe); hr = pMicAudioClient->Initialize(AUDCLNT_SHAREMODE_EXCLUSIVE, AUDCLNT_STREAMFLAGS_EVENTCALLBACK, want, want, micpwfx, NULL); if (SUCCEEDED(hr)) { eMicFormat = SampleShort; exclusive = true; qWarning("WASAPIInput: Successfully opened exclusive mode"); break; } micpwfxe = NULL; micpwfx = NULL; } } if (! micpwfxe) { if (g.s.bExclusiveInput) qWarning("WASAPIInput: Failed to open exclusive mode."); if (!getAndCheckMixFormat("WASAPIInput", "Mic", pMicAudioClient, &micpwfx, &micpwfxe, &eMicFormat)) { goto cleanup; } hr = pMicAudioClient->Initialize(AUDCLNT_SHAREMODE_SHARED, AUDCLNT_STREAMFLAGS_EVENTCALLBACK, 0, 0, micpwfx, NULL); if (FAILED(hr)) { qWarning("WASAPIInput: Mic Initialize failed: hr=0x%08lx", hr); if (hr == E_ACCESSDENIED) { g.mw->msgBox(tr("Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone.")); } goto cleanup; } } qWarning() << "WASAPIInput: Mic Stream format" << eMicFormat; pMicAudioClient->GetStreamLatency(&latency); hr = pMicAudioClient->GetBufferSize(&bufferFrameCount); qWarning("WASAPIInput: Stream Latency %lld (%d)", latency, bufferFrameCount); hr = pMicAudioClient->GetService(__uuidof(IAudioCaptureClient), (void**)&pMicCaptureClient); if (FAILED(hr)) { qWarning("WASAPIInput: Mic GetService failed: hr=0x%08lx", hr); goto cleanup; } pMicAudioClient->SetEventHandle(hEvent); if (FAILED(hr)) { qWarning("WASAPIInput: Failed to set mic event: hr=0x%08lx", hr); goto cleanup; } hr = pMicAudioClient->Start(); if (FAILED(hr)) { qWarning("WASAPIInput: Failed to start mic: hr=0x%08lx", hr); goto cleanup; } iMicChannels = micpwfx->nChannels; iMicFreq = micpwfx->nSamplesPerSec; if (doecho) { hr = pEchoDevice->Activate(__uuidof(IAudioClient), CLSCTX_ALL, NULL, (void **) &pEchoAudioClient); if (FAILED(hr)) { qWarning("WASAPIInput: Activate Echo AudioClient failed: hr=0x%08lx", hr); goto cleanup; } if (!getAndCheckMixFormat("WASAPIInput", "Echo", pEchoAudioClient, &echopwfx, &echopwfxe, &eEchoFormat)) { goto cleanup; } hr = pEchoAudioClient->Initialize(AUDCLNT_SHAREMODE_SHARED, AUDCLNT_STREAMFLAGS_EVENTCALLBACK | AUDCLNT_STREAMFLAGS_LOOPBACK, 0, 0, echopwfx, NULL); if (FAILED(hr)) { qWarning("WASAPIInput: Echo Initialize failed: hr=0x%08lx", hr); goto cleanup; } hr = pEchoAudioClient->GetBufferSize(&bufferFrameCount); hr = pEchoAudioClient->GetService(__uuidof(IAudioCaptureClient), (void**)&pEchoCaptureClient); if (FAILED(hr)) { qWarning("WASAPIInput: Echo GetService failed: hr=0x%08lx", hr); goto cleanup; } pEchoAudioClient->SetEventHandle(hEvent); if (FAILED(hr)) { qWarning("WASAPIInput: Failed to set echo event: hr=0x%08lx", hr); goto cleanup; } hr = pEchoAudioClient->Start(); if (FAILED(hr)) { qWarning("WASAPIInput: Failed to start Echo: hr=0x%08lx", hr); goto cleanup; } qWarning() << "WASAPIInput: Echo Stream format" << eEchoFormat; iEchoChannels = echopwfx->nChannels; iEchoFreq = echopwfx->nSamplesPerSec; } initializeMixer(); allocLength = (iMicLength / 2) * micpwfx->nChannels; if (exclusive) { sbuff = new short[allocLength]; while (bRunning && ! FAILED(hr)) { hr = pMicCaptureClient->GetBuffer(&pData, &numFramesAvailable, &flags, &devicePosition, &qpcPosition); if (hr != AUDCLNT_S_BUFFER_EMPTY) { if (FAILED(hr)) goto cleanup; UINT32 nFrames = numFramesAvailable * micpwfx->nChannels; if (nFrames > allocLength) { delete [] sbuff; allocLength = nFrames; sbuff = new short[allocLength]; } memcpy(sbuff, pData, nFrames * sizeof(short)); hr = pMicCaptureClient->ReleaseBuffer(numFramesAvailable); if (FAILED(hr)) goto cleanup; addMic(sbuff, numFramesAvailable); } if (! FAILED(hr)) WaitForSingleObject(hEvent, 100); } } else { tbuff = new float[allocLength]; while (bRunning && ! FAILED(hr)) { hr = pMicCaptureClient->GetNextPacketSize(&micPacketLength); if (! FAILED(hr) && iEchoChannels) hr = pEchoCaptureClient->GetNextPacketSize(&echoPacketLength); if (FAILED(hr)) { qWarning("WASAPIInput: GetNextPacketSize failed: hr=0x%08lx", hr); goto cleanup; } while ((micPacketLength > 0) || (echoPacketLength > 0)) { if (echoPacketLength > 0) { hr = pEchoCaptureClient->GetBuffer(&pData, &numFramesAvailable, &flags, &devicePosition, &qpcPosition); if (FAILED(hr)) { qWarning("WASAPIInput: GetBuffer failed: hr=0x%08lx", hr); goto cleanup; } UINT32 nFrames = numFramesAvailable * echopwfx->nChannels; if (nFrames > allocLength) { delete [] tbuff; allocLength = nFrames; tbuff = new float[allocLength]; } memcpy(tbuff, pData, nFrames * sizeof(float)); hr = pEchoCaptureClient->ReleaseBuffer(numFramesAvailable); if (FAILED(hr)) { qWarning("WASAPIInput: ReleaseBuffer failed: hr=0x%08lx", hr); goto cleanup; } addEcho(tbuff, numFramesAvailable); } else if (micPacketLength > 0) { hr = pMicCaptureClient->GetBuffer(&pData, &numFramesAvailable, &flags, &devicePosition, &qpcPosition); if (FAILED(hr)) { qWarning("WASAPIInput: GetBuffer failed: hr=0x%08lx", hr); goto cleanup; } UINT32 nFrames = numFramesAvailable * micpwfx->nChannels; if (nFrames > allocLength) { delete [] tbuff; allocLength = nFrames; tbuff = new float[allocLength]; } memcpy(tbuff, pData, nFrames * sizeof(float)); hr = pMicCaptureClient->ReleaseBuffer(numFramesAvailable); if (FAILED(hr)) { qWarning("WASAPIInput: ReleaseBuffer failed: hr=0x%08lx", hr); goto cleanup; } addMic(tbuff, numFramesAvailable); } hr = pMicCaptureClient->GetNextPacketSize(&micPacketLength); if (! FAILED(hr) && iEchoChannels) hr = pEchoCaptureClient->GetNextPacketSize(&echoPacketLength); } if (! FAILED(hr)) WaitForSingleObject(hEvent, 2000); } } cleanup: if (micpwfx && !exclusive) CoTaskMemFree(micpwfx); if (echopwfx) CoTaskMemFree(echopwfx); if (pMicAudioClient) { pMicAudioClient->Stop(); pMicAudioClient->Release(); } if (pMicCaptureClient) pMicCaptureClient->Release(); if (pMicDevice) pMicDevice->Release(); if (pEchoAudioClient) { pEchoAudioClient->Stop(); pEchoAudioClient->Release(); } if (pEchoCaptureClient) pEchoCaptureClient->Release(); if (pEchoDevice) pEchoDevice->Release(); if (hMmThread != NULL) AvRevertMmThreadCharacteristics(hMmThread); if (hEvent != NULL) CloseHandle(hEvent); delete [] tbuff; delete [] sbuff; } WASAPIOutput::WASAPIOutput() { } WASAPIOutput::~WASAPIOutput() { bRunning = false; wait(); } void WASAPIOutput::setVolumes(IMMDevice *pDevice, bool talking) { HRESULT hr; if (! talking) { QMap::const_iterator i; for (i=qmVolumes.constBegin(); i != qmVolumes.constEnd(); ++i) { float fVolume = 1.0f; hr = i.key()->GetMasterVolume(&fVolume); if (qFuzzyCompare(i.value().second, fVolume)) hr = i.key()->SetMasterVolume(i.value().first, NULL); i.key()->Release(); } qmVolumes.clear(); return; } IAudioSessionManager2 *pAudioSessionManager = NULL; int max = 0; DWORD dwMumble = GetCurrentProcessId(); qmVolumes.clear(); if (qFuzzyCompare(g.s.fOtherVolume, 1.0f)) return; // FIXME: Try to keep the session object around when returning volume. if (SUCCEEDED(hr = pDevice->Activate(bIsWin7 ? __uuidof(IAudioSessionManager2) : __uuidof(IAudioSessionManager), CLSCTX_ALL, NULL, (void **) &pAudioSessionManager))) { IAudioSessionEnumerator *pEnumerator = NULL; IAudioSessionQuery *pMysticQuery = NULL; if (! bIsWin7) { if (SUCCEEDED(hr = pAudioSessionManager->QueryInterface(IID_IAudioSessionQuery, (void **) &pMysticQuery))) { hr = pMysticQuery->GetQueryInterface(&pEnumerator); } } else { hr = pAudioSessionManager->GetSessionEnumerator(&pEnumerator); } QSet seen; if (SUCCEEDED(hr)) { if (SUCCEEDED(hr = pEnumerator->GetCount(&max))) { for (int i=0;iGetSession(i, &pControl))) { setVolumeForSessionControl(pControl, dwMumble, seen); pControl->Release(); } } } pEnumerator->Release(); } if (pMysticQuery) pMysticQuery->Release(); pAudioSessionManager->Release(); } } bool WASAPIOutput::setVolumeForSessionControl2(IAudioSessionControl2 *control2, const DWORD mumblePID, QSet &seen) { HRESULT hr; DWORD pid; // Don't set the volume for our own control if (FAILED(hr = control2->GetProcessId(&pid)) || (pid == mumblePID)) return true; // Don't work on expired audio sessions AudioSessionState ass; if (FAILED(hr = control2->GetState(&ass)) || (ass == AudioSessionStateExpired)) return false; // Don't act twice on the same session GUID group; if (FAILED(hr = control2->GetGroupingParam(&group))) return false; QUuid quuid(group); if (seen.contains(quuid)) return true; seen.insert(quuid); // Adjust volume ISimpleAudioVolume *pVolume = NULL; if (FAILED(hr = control2->QueryInterface(__uuidof(ISimpleAudioVolume), (void **) &pVolume))) return false; BOOL bMute = TRUE; bool keep = false; if (SUCCEEDED(hr = pVolume->GetMute(&bMute)) && ! bMute) { float fVolume = 1.0f; if (SUCCEEDED(hr = pVolume->GetMasterVolume(&fVolume)) && ! qFuzzyCompare(fVolume,0.0f)) { float fSetVolume = fVolume * g.s.fOtherVolume; if (SUCCEEDED(hr = pVolume->SetMasterVolume(fSetVolume, NULL))) { hr = pVolume->GetMasterVolume(&fSetVolume); qmVolumes.insert(pVolume, VolumePair(fVolume,fSetVolume)); keep = true; } } } if (! keep) pVolume->Release(); return true; } bool WASAPIOutput::setVolumeForSessionControl(IAudioSessionControl *control, const DWORD mumblePID, QSet &seen) { HRESULT hr; IAudioSessionControl2 *pControl2 = NULL; if (!SUCCEEDED(hr = control->QueryInterface(bIsWin7 ? __uuidof(IAudioSessionControl2) : IID_IVistaAudioSessionControl2, (void **) &pControl2))) return false; bool result = setVolumeForSessionControl2(pControl2, mumblePID, seen); pControl2->Release(); return result; } static void SetDuckingOptOut(IMMDevice *pDevice) { if (!bIsWin7) return; HRESULT hr; IAudioSessionManager2 *pSessionManager2 = NULL; IAudioSessionControl *pSessionControl = NULL; IAudioSessionControl2 *pSessionControl2 = NULL; // Get session manager & control1+2 to disable ducking hr = pDevice->Activate(__uuidof(IAudioSessionManager2), CLSCTX_ALL, NULL, reinterpret_cast(&pSessionManager2)); if (FAILED(hr)) { qWarning("WASAPIOutput: Activate AudioSessionManager2 failed: hr=0x%08lx", hr); goto cleanup; } hr = pSessionManager2->GetAudioSessionControl(NULL, 0, &pSessionControl); if (FAILED(hr)) { qWarning("WASAPIOutput: GetAudioSessionControl failed: hr=0x%08lx", hr); goto cleanup; } hr = pSessionControl->QueryInterface(__uuidof(IAudioSessionControl2), reinterpret_cast(&pSessionControl2)); if (FAILED(hr)) { qWarning("WASAPIOutput: Querying SessionControl2 failed: hr=0x%08lx", hr); goto cleanup; } hr = pSessionControl2->SetDuckingPreference(TRUE); if (FAILED(hr)) { qWarning("WASAPIOutput: Failed to set ducking preference: hr=0x%08lx", hr); goto cleanup; } cleanup: if (pSessionControl2) pSessionControl2->Release(); if (pSessionControl) pSessionControl->Release(); if (pSessionManager2) pSessionManager2->Release(); } void WASAPIOutput::run() { HRESULT hr; IMMDevice *pDevice = NULL; IAudioClient *pAudioClient = NULL; IAudioRenderClient *pRenderClient = NULL; WAVEFORMATEX *pwfx = NULL; WAVEFORMATEXTENSIBLE *pwfxe = NULL; UINT32 bufferFrameCount; REFERENCE_TIME def, min, latency, want; UINT32 numFramesAvailable; HANDLE hEvent; BYTE *pData; DWORD dwTaskIndex = 0; HANDLE hMmThread; int ns = 0; unsigned int chanmasks[32]; QMap qmVolumes; bool lastspoke = false; REFERENCE_TIME bufferDuration = (g.s.iOutputDelay > 1) ? (g.s.iOutputDelay + 1) * 100000 : 0; bool exclusive = false; bool mixed = false; CoInitialize(NULL); hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); hMmThread = AvSetMmThreadCharacteristics(L"Pro Audio", &dwTaskIndex); if (hMmThread == NULL) { qWarning("WASAPIOutput: Failed to set Pro Audio thread priority"); } // Open the output device. pDevice = openNamedOrDefaultDevice(g.s.qsWASAPIOutput, eRender, WASAPIRoleFromSettings()); if (!pDevice) goto cleanup; // Opt-out of the Windows 7 ducking behavior SetDuckingOptOut(pDevice); hr = pDevice->Activate(__uuidof(IAudioClient), CLSCTX_ALL, NULL, (void **) &pAudioClient); if (FAILED(hr)) { qWarning("WASAPIOutput: Activate AudioClient failed: hr=0x%08lx", hr); goto cleanup; } pAudioClient->GetDevicePeriod(&def, &min); want = qMax(min, 100000); qWarning("WASAPIOutput: Latencies %lld %lld => %lld", def, min, want); if (g.s.bExclusiveOutput) { hr = pAudioClient->GetMixFormat(&pwfx); if (FAILED(hr)) { qWarning("WASAPIOutput: GetMixFormat failed: hr=0x%08lx", hr); goto cleanup; } if (pwfx->wFormatTag == WAVE_FORMAT_EXTENSIBLE) { pwfxe = reinterpret_cast(pwfx); } if (!g.s.bPositionalAudio) { // Override mix format and request stereo pwfx->nChannels = 2; if (pwfxe) { pwfxe->dwChannelMask = KSAUDIO_SPEAKER_STEREO; } } pwfx->cbSize = 0; if (pwfxe) { pwfxe->SubFormat = KSDATAFORMAT_SUBTYPE_PCM; } else { pwfx->wFormatTag = WAVE_FORMAT_PCM; } pwfx->nSamplesPerSec = 48000; pwfx->wBitsPerSample = 16; pwfx->nBlockAlign = pwfx->nChannels * pwfx->wBitsPerSample / 8; pwfx->nAvgBytesPerSec = pwfx->nBlockAlign * pwfx->nSamplesPerSec; hr = pAudioClient->Initialize(AUDCLNT_SHAREMODE_EXCLUSIVE, AUDCLNT_STREAMFLAGS_EVENTCALLBACK, want, want, pwfx, NULL); if (SUCCEEDED(hr)) { eSampleFormat = SampleShort; exclusive = true; qWarning("WASAPIOutput: Successfully opened exclusive mode"); } else { CoTaskMemFree(pwfx); pwfxe = NULL; pwfx = NULL; } } if (!pwfx) { if (g.s.bExclusiveOutput) qWarning("WASAPIOutput: Failed to open exclusive mode."); if (!getAndCheckMixFormat("WASAPIOutput", "Output", pAudioClient, &pwfx, &pwfxe, &eSampleFormat)) { goto cleanup; } if (!g.s.bPositionalAudio) { pwfx->nChannels = 2; pwfx->nBlockAlign = pwfx->nChannels * pwfx->wBitsPerSample / 8; pwfx->nAvgBytesPerSec = pwfx->nBlockAlign * pwfx->nSamplesPerSec; if (pwfxe) { pwfxe->dwChannelMask = KSAUDIO_SPEAKER_STEREO; } WAVEFORMATEX *closestFormat = NULL; hr = pAudioClient->IsFormatSupported(AUDCLNT_SHAREMODE_SHARED, pwfx, &closestFormat); if (hr == S_FALSE) { qWarning("WASAPIOutput: Driver says no to 2 channel output. Closest format: %d channels @ %lu kHz", closestFormat->nChannels, static_cast(closestFormat->nSamplesPerSec)); CoTaskMemFree(pwfx); // Fall back to whatever the device offers. if (!getAndCheckMixFormat("WASAPIOutput", "Output", pAudioClient, &pwfx, &pwfxe, &eSampleFormat)) { CoTaskMemFree(closestFormat); goto cleanup; } } else if (FAILED(hr)) { qWarning("WASAPIOutput: IsFormatSupported failed: hr=0x%08lx", hr); } CoTaskMemFree(closestFormat); } hr = pAudioClient->Initialize(AUDCLNT_SHAREMODE_SHARED, AUDCLNT_STREAMFLAGS_EVENTCALLBACK, bufferDuration, 0, pwfx, NULL); if (FAILED(hr)) { qWarning("WASAPIOutput: Initialize failed: hr=0x%08lx", hr); goto cleanup; } } qWarning() << "WASAPIOutput: Output stream format" << eSampleFormat; pAudioClient->GetStreamLatency(&latency); pAudioClient->GetBufferSize(&bufferFrameCount); qWarning("WASAPIOutput: Stream Latency %lld (%d)", latency, bufferFrameCount); iMixerFreq = pwfx->nSamplesPerSec; qWarning("WASAPIOutput: Periods %lldus %lldus (latency %lldus)", def / 10LL, min / 10LL, latency / 10LL); qWarning("WASAPIOutput: Buffer is %dus (%d)", (bufferFrameCount * 1000000) / iMixerFreq, g.s.iOutputDelay); hr = pAudioClient->GetService(__uuidof(IAudioRenderClient), (void**)&pRenderClient); if (FAILED(hr)) { qWarning("WASAPIOutput: GetService failed: hr=0x%08lx", hr); goto cleanup; } pAudioClient->SetEventHandle(hEvent); if (FAILED(hr)) { qWarning("WASAPIOutput: Failed to set event: hr=0x%08lx", hr); goto cleanup; } hr = pAudioClient->Start(); if (FAILED(hr)) { qWarning("WASAPIOutput: Failed to start: hr=0x%08lx", hr); goto cleanup; } if (pwfxe) { for (int i=0;i<32;i++) { if (pwfxe->dwChannelMask & (1 << i)) { chanmasks[ns++] = 1 << i; } } } else { qWarning("WASAPIOutput: No chanmask available. Assigning in order."); for (int i = 0; i < pwfx->nChannels && i < 32; ++i) { chanmasks[ns++] = 1 << i; } } if (ns != pwfx->nChannels) { qWarning("WASAPIOutput: Chanmask bits doesn't match number of channels."); } iChannels = pwfx->nChannels; initializeMixer(chanmasks); numFramesAvailable = 0; while (bRunning && ! FAILED(hr)) { if (!exclusive) { // Attenuate stream volumes. if (lastspoke != (g.bAttenuateOthers || mixed)) { lastspoke = g.bAttenuateOthers || mixed; setVolumes(pDevice, lastspoke); } hr = pAudioClient->GetCurrentPadding(&numFramesAvailable); if (FAILED(hr)) { qWarning("WASAPIOutput: GetCurrentPadding failed: hr=0x%08lx", hr); goto cleanup; } } UINT32 packetLength = bufferFrameCount - numFramesAvailable; while (packetLength > 0) { hr = pRenderClient->GetBuffer(packetLength, &pData); if (FAILED(hr)) { qWarning("WASAPIOutput: GetBuffer failed: hr=0x%08lx", hr); goto cleanup; } mixed = mix(reinterpret_cast(pData), packetLength); if (mixed) hr = pRenderClient->ReleaseBuffer(packetLength, 0); else hr = pRenderClient->ReleaseBuffer(packetLength, AUDCLNT_BUFFERFLAGS_SILENT); if (FAILED(hr)) { qWarning("WASAPIOutput: ReleaseBuffer failed: hr=0x%08lx", hr); goto cleanup; } // Exclusive mode rendering ends here. if (exclusive) break; if (!g.s.bAttenuateOthers && !g.bAttenuateOthers) { mixed = false; } if (lastspoke != (g.bAttenuateOthers || mixed)) { lastspoke = g.bAttenuateOthers || mixed; setVolumes(pDevice, lastspoke); } hr = pAudioClient->GetCurrentPadding(&numFramesAvailable); if (FAILED(hr)) { qWarning("WASAPIOutput: GetCurrentPadding failed: hr=0x%08lx", hr); goto cleanup; } packetLength = bufferFrameCount - numFramesAvailable; } if (! FAILED(hr)) WaitForSingleObject(hEvent, exclusive ? 100 : 2000); } cleanup: if (pwfx) CoTaskMemFree(pwfx); if (pDevice) { setVolumes(pDevice, false); } if (pAudioClient) { pAudioClient->Stop(); pAudioClient->Release(); } if (pRenderClient) pRenderClient->Release(); if (pDevice) pDevice->Release(); if (hMmThread != NULL) AvRevertMmThreadCharacteristics(hMmThread); if (hEvent != NULL) CloseHandle(hEvent); } mumble-1.3.4/src/mumble/AppNap.mm0000664000175000017500000000276514010707273016435 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 static bool appNapSuppressed = false; #endif void MUSuppressAppNap(bool suppress) { #if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 NSProcessInfo *processInfo = [NSProcessInfo processInfo]; if (![processInfo respondsToSelector:@selector(disableAutomaticTermination:)]) { return; } if (suppress == appNapSuppressed) { qWarning("AppNap: attempt to set AppNap suppression state to %s while already in that state.", suppress ? "true" : "false"); return; } QString translatedReason = QApplication::tr("Mumble is currently connected to a server"); NSString *reason = const_cast(reinterpret_cast(CFStringCreateWithCharacters(kCFAllocatorDefault, reinterpret_cast(translatedReason.unicode()), translatedReason.length()))); if (suppress) { [[NSProcessInfo processInfo] disableAutomaticTermination:reason]; qWarning("AppNap: suppressed with reason: '%s'", qPrintable(translatedReason)); } else { [[NSProcessInfo processInfo] enableAutomaticTermination:reason]; qWarning("AppNap: re-enabled, was suppressed with reason: '%s'", qPrintable(translatedReason)); } appNapSuppressed = suppress; [reason release]; #else Q_UNUSED(suppress); #endif } mumble-1.3.4/src/mumble/OverlayPositionableItem.cpp0000664000175000017500000000545614010707273022240 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "OverlayPositionableItem.h" OverlayPositionableItem::OverlayPositionableItem(QRectF *posPtr, const bool isPositionable) : m_position(posPtr) , m_isPositionEditable(isPositionable) , m_qgeiHandle(NULL) { } OverlayPositionableItem::~OverlayPositionableItem() { delete m_qgeiHandle; m_qgeiHandle = NULL; } void OverlayPositionableItem::createPositioningHandle() { m_qgeiHandle = new QGraphicsEllipseItem(QRectF(-4.0f, -4.0f, 8.0f, 8.0f)); m_qgeiHandle->setPen(QPen(Qt::darkRed, 0.0f)); m_qgeiHandle->setBrush(Qt::red); m_qgeiHandle->setZValue(0.5f); m_qgeiHandle->setFlag(QGraphicsItem::ItemIsMovable); m_qgeiHandle->setFlag(QGraphicsItem::ItemIsSelectable); scene()->addItem(m_qgeiHandle); m_qgeiHandle->installSceneEventFilter(this); } bool OverlayPositionableItem::sceneEventFilter(QGraphicsItem *watched, QEvent *e) { switch (e->type()) { case QEvent::GraphicsSceneMouseMove: case QEvent::GraphicsSceneMouseRelease: QMetaObject::invokeMethod(this, "onMove", Qt::QueuedConnection); break; default: break; } return QGraphicsItem::sceneEventFilter(watched, e); } void OverlayPositionableItem::onMove() { if (m_qgeiHandle == NULL) { return; } const QRectF &sr = scene()->sceneRect(); const QPointF &p = m_qgeiHandle->pos(); m_position->setX(qBound(0.0f, p.x() / sr.width(), 1.0f)); m_position->setY(qBound(0.0f, p.y() / sr.height(), 1.0f)); m_qgeiHandle->setPos(m_position->x() * sr.width(), m_position->y() * sr.height()); updateRender(); } void OverlayPositionableItem::updateRender() { const QRectF &sr = scene()->sceneRect(); // Translate the 0..1 float position to the real scene coordinates (relative to absolute position) QPoint absPos(iroundf(sr.width() * m_position->x() + 0.5f), iroundf(sr.height() * m_position->y() + 0.5f)); if (m_isPositionEditable) { if (m_qgeiHandle == NULL) { createPositioningHandle(); } m_qgeiHandle->setPos(absPos.x(), absPos.y()); } QRectF br = boundingRect(); // Limit the position by the elements width (to make sure it is right-/bottom-bound rather than outside of the scene QPoint maxPos(iroundf(sr.width() - br.width() + 0.5f), iroundf(sr.height() - br.height() + 0.5f)); int basex = qBound(0, absPos.x(), maxPos.x()); int basey = qBound(0, absPos.y(), maxPos.y()); setPos(basex, basey); } void OverlayPositionableItem::setItemVisible(const bool &visible) { setVisible(visible); if (m_qgeiHandle != NULL) { m_qgeiHandle->setVisible(visible); } } mumble-1.3.4/src/mumble/GlobalShortcut_macx.h0000664000175000017500000000271714010707273021035 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_GLOBALSHORTCUT_MACX_H_ #define MUMBLE_MUMBLE_GLOBALSHORTCUT_MACX_H_ #include #include #include #include "GlobalShortcut.h" #include "Global.h" class GlobalShortcutMac : public GlobalShortcutEngine { private: Q_OBJECT Q_DISABLE_COPY(GlobalShortcutMac) public: GlobalShortcutMac(); ~GlobalShortcutMac() Q_DECL_OVERRIDE; QString buttonName(const QVariant &) Q_DECL_OVERRIDE; void dumpEventTaps(); void needRemap() Q_DECL_OVERRIDE; bool handleModButton(CGEventFlags newmask); bool canSuppress() Q_DECL_OVERRIDE; void setEnabled(bool) Q_DECL_OVERRIDE; bool enabled() Q_DECL_OVERRIDE; bool canDisable() Q_DECL_OVERRIDE; public slots: void forwardEvent(void *evt); protected: CFRunLoopRef loop; CFMachPortRef port; CGEventFlags modmask; UCKeyboardLayout *kbdLayout; void run() Q_DECL_OVERRIDE; static CGEventRef callback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *udata); QString translateMouseButton(const unsigned int keycode) const; QString translateModifierKey(const unsigned int keycode) const; QString translateKeyName(const unsigned int keycode) const; }; #endif mumble-1.3.4/src/mumble/UserInformation.cpp0000664000175000017500000001541314010707273020545 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "UserInformation.h" #include "Audio.h" #include "CELTCodec.h" #include "HostAddress.h" #include "ServerHandler.h" #include "ViewCert.h" // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" static QString decode_utf8_qssl_string(const QString &input) { QString i = input; return QUrl::fromPercentEncoding(i.replace(QLatin1String("\\x"), QLatin1String("%")).toLatin1()); } #if QT_VERSION >= 0x050000 static QString decode_utf8_qssl_string(const QStringList &list) { if (list.count() > 0) { return decode_utf8_qssl_string(list.at(0)); } return QString(); } #endif UserInformation::UserInformation(const MumbleProto::UserStats &msg, QWidget *p) : QDialog(p) { setupUi(this); uiSession = msg.session(); qtTimer = new QTimer(this); connect(qtTimer, SIGNAL(timeout()), this, SLOT(tick())); qtTimer->start(6000); qgbConnection->setVisible(false); qlOpus->setText(tr("Not Reported")); update(msg); resize(sizeHint()); qfCertificateFont = qlCertificate->font(); } unsigned int UserInformation::session() const { return uiSession; } void UserInformation::tick() { if (bRequested) return; bRequested = true; g.sh->requestUserStats(uiSession, true); } void UserInformation::on_qpbCertificate_clicked() { ViewCert *vc = new ViewCert(qlCerts, this); vc->setWindowModality(Qt::WindowModal); vc->setAttribute(Qt::WA_DeleteOnClose, true); vc->show(); } QString UserInformation::secsToString(unsigned int secs) { QStringList qsl; int weeks = secs / (60 * 60 * 24 * 7); secs = secs % (60 * 60 * 24 * 7); int days = secs / (60 * 60 * 24); secs = secs % (60 * 60 * 24); int hours = secs / (60 * 60); secs = secs % (60 * 60); int minutes = secs / 60; int seconds = secs % 60; if (weeks) qsl << tr("%1w").arg(weeks); if (days) qsl << tr("%1d").arg(days); if (hours) qsl << tr("%1h").arg(hours); if (minutes || hours) qsl << tr("%1m").arg(minutes); qsl << tr("%1s").arg(seconds); return qsl.join(QLatin1String(" ")); } void UserInformation::update(const MumbleProto::UserStats &msg) { bRequested = false; bool showcon = false; ClientUser *cu = ClientUser::get(uiSession); if (cu) setWindowTitle(cu->qsName); if (msg.certificates_size() > 0) { showcon = true; qlCerts.clear(); for (int i=0;i certs = QSslCertificate::fromData(QByteArray(s.data(), static_cast(s.length())), QSsl::Der); qlCerts <setEnabled(true); const QSslCertificate &cert = qlCerts.last(); #if QT_VERSION >= 0x050000 const QMultiMap &alts = cert.subjectAlternativeNames(); #else const QMultiMap &alts = cert.alternateSubjectNames(); #endif if (alts.contains(QSsl::EmailEntry)) qlCertificate->setText(QStringList(alts.values(QSsl::EmailEntry)).join(tr(", "))); else qlCertificate->setText(decode_utf8_qssl_string(cert.subjectInfo(QSslCertificate::CommonName))); if (msg.strong_certificate()) { QFont f = qfCertificateFont; f.setBold(true); qlCertificate->setFont(f); } else { qlCertificate->setFont(qfCertificateFont); } } else { qpbCertificate->setEnabled(false); qlCertificate->setText(QString()); } } if (msg.has_address()) { showcon = true; HostAddress ha(msg.address()); qlAddress->setText(ha.toString()); } if (msg.has_version()) { showcon = true; const MumbleProto::Version &mpv = msg.version(); qlVersion->setText(tr("%1 (%2)").arg(MumbleVersion::toString(mpv.version())).arg(u8(mpv.release()))); qlOS->setText(tr("%1 (%2)").arg(u8(mpv.os())).arg(u8(mpv.os_version()))); } if (msg.celt_versions_size() > 0) { QStringList qsl; for (int i=0;iversion(); else qsl << QString::number(v, 16); } qlCELT->setText(qsl.join(tr(", "))); } if (msg.has_opus()) { qlOpus->setText(msg.opus() ? tr("Supported") : tr("Not Supported")); } if (showcon) qgbConnection->setVisible(true); qlTCPCount->setText(QString::number(msg.tcp_packets())); qlUDPCount->setText(QString::number(msg.udp_packets())); qlTCPAvg->setText(QString::number(msg.tcp_ping_avg(), 'f', 2)); qlUDPAvg->setText(QString::number(msg.udp_ping_avg(), 'f', 2)); qlTCPVar->setText(QString::number(msg.tcp_ping_var() > 0.0f ? sqrtf(msg.tcp_ping_var()) : 0.0f, 'f', 2)); qlUDPVar->setText(QString::number(msg.udp_ping_var() > 0.0f ? sqrtf(msg.udp_ping_var()) : 0.0f, 'f', 2)); if (msg.has_from_client() && msg.has_from_server()) { qgbUDP->setVisible(true); const MumbleProto::UserStats_Stats &from = msg.from_client(); qlFromGood->setText(QString::number(from.good())); qlFromLate->setText(QString::number(from.late())); qlFromLost->setText(QString::number(from.lost())); qlFromResync->setText(QString::number(from.resync())); const MumbleProto::UserStats_Stats &to = msg.from_server(); qlToGood->setText(QString::number(to.good())); qlToLate->setText(QString::number(to.late())); qlToLost->setText(QString::number(to.lost())); qlToResync->setText(QString::number(to.resync())); quint32 allFromPackets = from.good() + from.late() + from.lost(); qlFromLatePercent->setText(QString::number(allFromPackets > 0 ? from.late() * 100.0 / allFromPackets : 0., 'f', 2)); qlFromLostPercent->setText(QString::number(allFromPackets > 0 ? from.lost() * 100.0 / allFromPackets : 0., 'f', 2)); quint32 allToPackets = to.good() + to.late() + to.lost(); qlToLatePercent->setText(QString::number(allToPackets > 0 ? to.late() * 100.0 / allToPackets : 0., 'f', 2)); qlToLostPercent->setText(QString::number(allToPackets > 0 ? to.lost() * 100.0 / allToPackets : 0., 'f', 2)); } else { qgbUDP->setVisible(false); } if (msg.has_onlinesecs()) { if (msg.has_idlesecs()) qlTime->setText(tr("%1 online (%2 idle)").arg(secsToString(msg.onlinesecs()), secsToString(msg.idlesecs()))); else qlTime->setText(tr("%1 online").arg(secsToString(msg.onlinesecs()))); } if (msg.has_bandwidth()) { qlBandwidth->setVisible(true); qliBandwidth->setVisible(true); qlBandwidth->setText(tr("%1 kbit/s").arg(msg.bandwidth() / 125.0, 0, 'f', 1)); } else { qlBandwidth->setVisible(false); qliBandwidth->setVisible(false); qlBandwidth->setText(QString()); } } mumble-1.3.4/src/mumble/ManualPlugin.h0000664000175000017500000000305414010707273017460 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_MANUALPLUGIN_H_ #define MUMBLE_MUMBLE_MANUALPLUGIN_H_ #include #if QT_VERSION >= 0x050000 # include # include # include #else # include # include # include #endif #include "ui_ManualPlugin.h" #include "../../plugins/mumble_plugin.h" class Manual : public QDialog, public Ui::Manual { Q_OBJECT public: Manual(QWidget *parent = 0); public slots: void on_qpbUnhinge_pressed(); void on_qpbLinked_clicked(bool); void on_qpbActivated_clicked(bool); void on_qdsbX_valueChanged(double); void on_qdsbY_valueChanged(double); void on_qdsbZ_valueChanged(double); void on_qsbAzimuth_valueChanged(int); void on_qsbElevation_valueChanged(int); void on_qdAzimuth_valueChanged(int); void on_qdElevation_valueChanged(int); void on_qleContext_editingFinished(); void on_qleIdentity_editingFinished(); void on_buttonBox_clicked(QAbstractButton *); protected: QGraphicsScene *qgsScene; QGraphicsItem *qgiPosition; bool eventFilter(QObject *, QEvent *); void changeEvent(QEvent *e); void updateTopAndFront(int orientation, int azimut); }; MumblePlugin *ManualPlugin_getMumblePlugin(); MumblePluginQt *ManualPlugin_getMumblePluginQt(); #endif mumble-1.3.4/src/mumble/UserListModel.cpp0000664000175000017500000001712214010707273020153 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "UserListModel.h" #include "Channel.h" #include "Message.h" #include #include UserListModel::UserListModel(const MumbleProto::UserList& userList, QObject *parent_) : QAbstractTableModel(parent_) , m_legacyMode(false) { m_userList.reserve(userList.users_size()); for (int i = 0; i < userList.users_size(); ++i) { m_userList.append(userList.users(i)); } if (!m_userList.empty()) { const MumbleProto::UserList_User& user = m_userList.back(); m_legacyMode = !user.has_last_seen() || !user.has_last_channel(); } } int UserListModel::rowCount(const QModelIndex &parentIndex) const { if (parentIndex.isValid()) return 0; return m_userList.size(); } int UserListModel::columnCount(const QModelIndex &parentIndex) const { if (parentIndex.isValid()) return 0; if (m_legacyMode) { // Only COL_NICK return 1; } return COUNT_COL; } QVariant UserListModel::headerData(int section, Qt::Orientation orientation, int role) const { if (orientation != Qt::Horizontal) return QVariant(); if (section < 0 || section >= columnCount()) return QVariant(); if (role == Qt::DisplayRole) { switch (section) { case COL_NICK: return tr("Nick"); case COL_INACTIVEDAYS: return tr("Inactive days"); case COL_LASTCHANNEL: return tr("Last channel"); default: return QVariant(); } } return QVariant(); } QVariant UserListModel::data(const QModelIndex &dataIndex, int role) const { if (!dataIndex.isValid()) return QVariant(); if (dataIndex.row() < 0 || dataIndex.row() >= m_userList.size()) return QVariant(); if (dataIndex.column() >= columnCount()) return QVariant(); const MumbleProto::UserList_User& user = m_userList[dataIndex.row()]; if (role == Qt::DisplayRole) { switch (dataIndex.column()) { case COL_NICK: return u8(user.name()); case COL_INACTIVEDAYS: return lastSeenToTodayDayCount(user.last_seen()); case COL_LASTCHANNEL: return pathForChannelId(user.last_channel()); default: return QVariant(); } } else if (role == Qt::ToolTipRole) { switch (dataIndex.column()) { case COL_INACTIVEDAYS: return tr("Last seen: %1").arg(user.last_seen().empty() ? tr("Never") : Qt::escape(u8(user.last_seen()))); case COL_LASTCHANNEL: return tr("Channel ID: %1").arg(user.last_channel()); default: return QVariant(); } } else if (role == Qt::UserRole) { switch (dataIndex.column()) { case COL_INACTIVEDAYS: return isoUTCToDateTime(user.last_seen()); case COL_LASTCHANNEL: return user.last_channel(); default: return QVariant(); } } else if (role == Qt::EditRole) { if (dataIndex.column() == COL_NICK) { return u8(user.name()); } } return QVariant(); } bool UserListModel::setData(const QModelIndex &dataIndex, const QVariant &value, int role) { if (!dataIndex.isValid()) return false; if (dataIndex.column() != COL_NICK || role != Qt::EditRole) return false; if (dataIndex.row() < 0 || dataIndex.row() >= m_userList.size()) return false; const std::string newNick = u8(value.toString()); if (newNick.empty()) { // Empty nick is not valid return false; } MumbleProto::UserList_User& user = m_userList[dataIndex.row()]; if (newNick != user.name()) { foreach (const MumbleProto::UserList_User& otherUser, m_userList) { if (otherUser.name() == newNick) { // Duplicate is not valid return false; } } user.set_name(newNick); m_changes[user.user_id()] = user; emit dataChanged(dataIndex, dataIndex); } return true; } Qt::ItemFlags UserListModel::flags(const QModelIndex &flagIndex) const { const Qt::ItemFlags original = QAbstractTableModel::flags(flagIndex); if (flagIndex.column() == COL_NICK) { return original | Qt::ItemIsEditable; } return original; } bool UserListModel::removeRows(int row, int count, const QModelIndex &parentIndex) { if (row + count > m_userList.size()) return false; beginRemoveRows(parentIndex, row, row + count - 1); ModelUserList::Iterator startIt = m_userList.begin() + row; ModelUserList::Iterator endIt = startIt + count; for (ModelUserList::Iterator it = startIt; it != endIt; ++it) { it->clear_name(); m_changes[it->user_id()] = *it; } m_userList.erase(startIt, endIt); endRemoveRows(); return true; } void UserListModel::removeRowsInSelection(const QItemSelection &selection) { QModelIndexList indices = selection.indexes(); std::vector rows; rows.reserve(indices.size()); foreach (const QModelIndex& idx, indices) { if (idx.column() != COL_NICK) continue; rows.push_back(idx.row()); } // Make sure to presort the rows so we work from back (high) to front (low). // This prevents the row numbers from becoming invalid after removing a group. // The basic idea is to take a number of sorted rows (e.g. 10,9,5,3,2,1) and // delete them with the minimum number of removeRows calls. This means grouping // adjacent rows (e.g. (10,9),(5),(3,2,1)) and using a removeRows call for each group. std::sort(rows.begin(), rows.end(), std::greater()); int nextRow = -2; int groupRowCount = 0; for (size_t i = 0; i < rows.size(); ++i) { if (rows[i] == nextRow) { ++groupRowCount; --nextRow; } else { if (groupRowCount > 0) { // Remove previous group const int lastRowInGroup = nextRow + 1; removeRows(lastRowInGroup, groupRowCount); } // Start next group nextRow = rows[i] - 1; groupRowCount = 1; } } if (groupRowCount > 0) { // Remove leftover group const int lastRowInGroup = nextRow + 1; removeRows(lastRowInGroup, groupRowCount); } } MumbleProto::UserList UserListModel::getUserListUpdate() const { MumbleProto::UserList updateList; for (ModelUserListChangeMap::ConstIterator it = m_changes.constBegin(); it != m_changes.constEnd(); ++it) { MumbleProto::UserList_User* user = updateList.add_users(); *user = it.value(); } return updateList; } bool UserListModel::isUserListDirty() const { return !m_changes.empty(); } bool UserListModel::isLegacy() const { return m_legacyMode; } QVariant UserListModel::lastSeenToTodayDayCount(const std::string &lastSeenDate) const { if (lastSeenDate.empty()) return QVariant(); QVariant count = m_stringToLastSeenToTodayCount.value(u8(lastSeenDate)); if (count.isNull()) { QDateTime dt = isoUTCToDateTime(lastSeenDate); if (!dt.isValid()) { // Not convertable to int return QVariant(); } count = dt.daysTo(QDateTime::currentDateTime().toUTC()); m_stringToLastSeenToTodayCount.insert(u8(lastSeenDate), count); } return count; } QString UserListModel::pathForChannelId(const int channelId) const { QString path = m_channelIdToPathMap.value(channelId); if (path.isNull()) { path = QLatin1String("-"); Channel *channel = Channel::get(channelId); if (channel != NULL) { QStringList pathParts; while (channel->cParent != NULL) { pathParts.prepend(channel->qsName); channel = channel->cParent; } pathParts.append(QString()); path = QLatin1String("/ ") + pathParts.join(QLatin1String(" / ")); } m_channelIdToPathMap.insert(channelId, path); } return path; } QDateTime UserListModel::isoUTCToDateTime(const std::string &isoTime) const { QDateTime dt = QDateTime::fromString(u8(isoTime), Qt::ISODate); dt.setTimeSpec(Qt::UTC); return dt; } mumble-1.3.4/src/mumble/Cert.h0000664000175000017500000000354214010707273015763 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_CERT_H_ #define MUMBLE_MUMBLE_CERT_H_ #include #include #if QT_VERSION >= 0x050000 # include #else # include #endif #include #include #include "Settings.h" class QLabel; class QWidget; class CertView : public QGroupBox { private: Q_OBJECT Q_DISABLE_COPY(CertView) protected: QList qlCert; QLabel *qlSubjectName, *qlSubjectEmail, *qlIssuerName, *qlExpiry; public: CertView(QWidget *p); void setCert(const QList &cert); }; #include "ui_Cert.h" class CertWizard : public QWizard, public Ui::Certificates { private: Q_OBJECT Q_DISABLE_COPY(CertWizard) protected: Settings::KeyPair kpCurrent, kpNew; public: CertWizard(QWidget *p = NULL); int nextId() const Q_DECL_OVERRIDE; void initializePage(int) Q_DECL_OVERRIDE; bool validateCurrentPage() Q_DECL_OVERRIDE; static bool validateCert(const Settings::KeyPair &); static Settings::KeyPair generateNewCert(QString name = QString(), const QString &email = QString()); static QByteArray exportCert(const Settings::KeyPair &cert); static Settings::KeyPair importCert(QByteArray, const QString & = QString()); public slots: void on_qleEmail_textChanged(const QString &); void on_qpbExportFile_clicked(); void on_qleExportFile_textChanged(const QString &); void on_qpbImportFile_clicked(); void on_qleImportFile_textChanged(const QString &); void on_qlePassword_textChanged(const QString &); void on_qlIntroText_linkActivated(const QString &); }; #endif mumble-1.3.4/src/mumble/Global.cpp0000664000175000017500000001667414010707273016633 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "Global.h" Global *Global::g_global_struct; #ifndef Q_OS_WIN static void migrateDataDir() { #ifdef Q_OS_MAC QString olddir = QDir::homePath() + QLatin1String("/Library/Preferences/Mumble"); #if QT_VERSION >= 0x050000 QString newdir = QStandardPaths::writableLocation(QStandardPaths::DataLocation); #else QString newdir = QDesktopServices::storageLocation(QDesktopServices::DataLocation); #endif // QT_VERSION QString linksTo = QFile::readLink(olddir); if (!QFile::exists(newdir) && QFile::exists(olddir) && linksTo.isEmpty()) { QDir d; d.mkpath(newdir + QLatin1String("/..")); if (d.rename(olddir, newdir)) { if (d.cd(QDir::homePath() + QLatin1String("/Library/Preferences"))) { if (QFile::link(d.relativeFilePath(newdir), olddir)) { qWarning("Migrated application data directory from '%s' to '%s'", qPrintable(olddir), qPrintable(newdir)); return; } } } } else { /* Data dir has already been migrated. */ return; } qWarning("Application data migration failed."); #endif // Q_OS_MAC // Qt4 used another data directory on Unix-like systems, to ensure a seamless // transition we must first move the users data to the new directory. #if defined(Q_OS_UNIX) && ! defined(Q_OS_MAC) #if QT_VERSION >= 0x050000 QString olddir = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QLatin1String("/data/Mumble"); QString newdir = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QLatin1String("/Mumble"); if (!QFile::exists(newdir) && QFile::exists(olddir)) { QDir d; if (d.rename(olddir, newdir)) { qWarning("Migrated application data directory from '%s' to '%s'", qPrintable(olddir), qPrintable(newdir)); return; } } else { /* Data dir has already been migrated. */ return; } qWarning("Application data migration failed."); #endif // QT_VERSION #endif // defined(Q_OS_UNIX) && ! defined(Q_OS_MAC) } #endif // Q_OS_WIN Global::Global() { mw = 0; db = 0; p = 0; nam = 0; c = 0; uiSession = 0; uiDoublePush = 1000000; iPushToTalk = 0; iTarget = 0; iPrevTarget = 0; bPushToMute = false; bCenterPosition = false; bPosTest = false; bInAudioWizard = false; iAudioPathTime = 0; iAudioBandwidth = -1; iMaxBandwidth = -1; iCodecAlpha = 0; iCodecBeta = 0; bPreferAlpha = true; #ifdef USE_OPUS bOpus = true; #else bOpus = false; #endif bAttenuateOthers = false; prioritySpeakerActiveOverride = false; bAllowHTML = true; uiMessageLength = 5000; uiImageLength = 131072; uiMaxUsers = 0; qs = NULL; ocIntercept = NULL; bc = NULL; lcd = NULL; o = NULL; l = NULL; bHappyEaster = false; bQuit = false; QStringList qsl; qsl << QCoreApplication::instance()->applicationDirPath(); #if QT_VERSION >= 0x050000 qsl << QStandardPaths::writableLocation(QStandardPaths::DataLocation); #else qsl << QDesktopServices::storageLocation(QDesktopServices::DataLocation); #endif #if defined(Q_OS_WIN) QString appdata; wchar_t appData[MAX_PATH]; if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, appData))) { appdata = QDir::fromNativeSeparators(QString::fromWCharArray(appData)); if (!appdata.isEmpty()) { appdata.append(QLatin1String("/Mumble")); qsl << appdata; } } #endif foreach(const QString &dir, qsl) { QFile inifile(QString::fromLatin1("%1/mumble.ini").arg(dir)); if (inifile.exists() && inifile.permissions().testFlag(QFile::WriteUser)) { qdBasePath = dir; qs = new QSettings(inifile.fileName(), QSettings::IniFormat); break; } } if (!qs) { qs = new QSettings(); #if defined(Q_OS_WIN) if (! appdata.isEmpty()) qdBasePath.setPath(appdata); #else migrateDataDir(); #if QT_VERSION >= 0x050000 qdBasePath = QStandardPaths::writableLocation(QStandardPaths::DataLocation); #else qdBasePath = QDesktopServices::storageLocation(QDesktopServices::DataLocation); #endif #endif if (! qdBasePath.exists()) { QDir::root().mkpath(qdBasePath.absolutePath()); if (! qdBasePath.exists()) qdBasePath = QDir::home(); } } if (! qdBasePath.exists(QLatin1String("Plugins"))) qdBasePath.mkpath(QLatin1String("Plugins")); if (! qdBasePath.exists(QLatin1String("Overlay"))) qdBasePath.mkpath(QLatin1String("Overlay")); if (! qdBasePath.exists(QLatin1String("Themes"))) qdBasePath.mkpath(QLatin1String("Themes")); qs->setIniCodec("UTF-8"); } Global::~Global() { delete qs; } const char Global::ccHappyEaster[] = {072, 057, 0162, 0145, 0143, 056, 0163, 0166, 0147, 0, 0117, 0160, 0145, 0156, 040, 0164, 0150, 0145, 040, 0160, 0157, 0144, 040, 0142, 0141, 0171, 040, 0144, 0157, 0157, 0162, 0163, 054, 040, 0110, 0101, 0114, 056, 0, 0111, 047, 0155, 040, 0163, 0157, 0162, 0162, 0171, 054, 040, 045, 061, 056, 040, 0111, 047, 0155, 040, 0141, 0146, 0162, 0141, 0151, 0144, 040, 0111, 040, 0143, 0141, 0156, 047, 0164, 040, 0144, 0157, 040, 0164, 0150, 0141, 0164, 056, 0, 0121,0127,0151,0144,0147,0145,0164,0173,0142,0141,0143,0153,0147,0162,0157,0165,0156,0144,055,0143,0157,0154,0157,0162,072,0142,0154,0141,0143,0153,073,0141,0154,0164,0145,0162,0156,0141,0164,0145,055,0142,0141,0143,0153,0147,0162,0157,0165,0156,0144,055,0143,0157,0154,0157,0162,072,043,063,063,060,060,060,060,073,0143,0157,0154,0157,0162,072,0167,0150,0151,0164,0145,073,0175,0121,0124,0145,0170,0164,0102,0162,0157,0167,0163,0145,0162,0173,0142,0141,0143,0153,0147,0162,0157,0165,0156,0144,055,0151,0155,0141,0147,0145,072,0165,0162,0154,050,072,057,0162,0145,0143,056,0163,0166,0147,051,073,0142,0141,0143,0153,0147,0162,0157,0165,0156,0144,055,0160,0157,0163,0151,0164,0151,0157,0156,072,0143,0145,0156,0164,0145,0162,0143,0145,0156,0164,0145,0162,073,0142,0141,0143,0153,0147,0162,0157,0165,0156,0144,055,0143,0154,0151,0160,072,0160,0141,0144,0144,0151,0156,0147,073,0142,0141,0143,0153,0147,0162,0157,0165,0156,0144,055,0157,0162,0151,0147,0151,0156,072,0160,0141,0144,0144,0151,0156,0147,073,0142,0141,0143,0153,0147,0162,0157,0165,0156,0144,055,0162,0145,0160,0145,0141,0164,072,0156,0157,055,0162,0145,0160,0145,0141,0164,073,0142,0141,0143,0153,0147,0162,0157,0165,0156,0144,055,0141,0164,0164,0141,0143,0150,0155,0145,0156,0164,072,0146,0151,0170,0145,0144,073,0175,0121,0115,0145,0156,0165,0102,0141,0162,072,072,0151,0164,0145,0155,0173,0142,0141,0143,0153,0147,0162,0157,0165,0156,0144,072,0164,0162,0141,0156,0163,0160,0141,0162,0145,0156,0164,073,0175,0121,0110,0145,0141,0144,0145,0162,0126,0151,0145,0167,072,072,0163,0145,0143,0164,0151,0157,0156,0173,0142,0141,0143,0153,0147,0162,0157,0165,0156,0144,072,0164,0162,0141,0156,0163,0160,0141,0162,0145,0156,0164,073,0175,0121,0124,0141,0142,0102,0141,0162,072,072,0164,0141,0142,0173,0142,0141,0143,0153,0147,0162,0157,0165,0156,0144,072,0164,0162,0141,0156,0163,0160,0141,0162,0145,0156,0164,073,0175,0}; QMultiMap *DeferInit::qmDeferers = NULL; void DeferInit::add(int priority) { if (qmDeferers == NULL) { qmDeferers = new QMultiMap(); } qmDeferers->insert(priority, this); } DeferInit::~DeferInit() { } void DeferInit::run_initializers() { if (! qmDeferers) return; foreach(DeferInit *d, *qmDeferers) { d->initialize(); } } void DeferInit::run_destroyers() { if (! qmDeferers) return; foreach(DeferInit *d, *qmDeferers) { d->destroy(); } delete qmDeferers; qmDeferers = NULL; } mumble-1.3.4/src/mumble/OverlayText.h0000664000175000017500000000332714010707273017355 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_OVERLAYTEXT_H_ #define MUMBLE_MUMBLE_OVERLAYTEXT_H_ #include #include #include //! Annotated QPixmap supplying a basepoint. class BasepointPixmap : public QPixmap { public: //! Local coordinates of the base point. QPoint qpBasePoint; //@{ /** * Font ascent and descent. * The pixmap may exceed those font metrics, so if you need to * transform rendered text properly, use these attributes. */ int iAscent; int iDescent; //@} BasepointPixmap(); //! Create from QPixmap, basepoint is bottom left. BasepointPixmap(const QPixmap&); //! Empty pixmap, basepoint is bottom left. BasepointPixmap(int, int); //! Empty pixmap with specified basepoint. BasepointPixmap(int, int, const QPoint&); }; class OverlayTextLine { private: const float fEdgeFactor; QString qsText; QFont qfFont; QPainterPath qpp; float fAscent, fDescent; float fXCorrection, fYCorrection; int iCurWidth, iCurHeight; float fEdge; float fBaseliningThreshold; bool bElided; BasepointPixmap render(int, int, const QColor&, const QPoint&) const; public: OverlayTextLine(const QString&, const QFont&); void setFont(const QFont&); void setEdge(float); //! Render text with current font. BasepointPixmap createPixmap(QColor col); //! Render text to fit a bounding box. BasepointPixmap createPixmap(unsigned int maxwidth, unsigned int height, QColor col); }; #endif //_OVERLAYTEXT_H mumble-1.3.4/src/mumble/Plugins.cpp0000664000175000017500000005102214010707273017036 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "Plugins.h" #include "Log.h" #include "MainWindow.h" #include "Message.h" #include "ServerHandler.h" #include "../../plugins/mumble_plugin.h" #include "WebFetch.h" #include "MumbleApplication.h" #include "ManualPlugin.h" // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" static ConfigWidget *PluginConfigDialogNew(Settings &st) { return new PluginConfig(st); } static ConfigRegistrar registrar(5000, PluginConfigDialogNew); struct PluginInfo { bool locked; bool enabled; QLibrary lib; QString filename; QString description; QString shortname; MumblePlugin *p; MumblePlugin2 *p2; MumblePluginQt *pqt; PluginInfo(); }; PluginInfo::PluginInfo() { locked = false; enabled = false; p = NULL; p2 = NULL; pqt = NULL; } struct PluginFetchMeta { QString hash; QString path; PluginFetchMeta(const QString &hash_ = QString(), const QString &path_ = QString()) : hash(hash_) , path(path_) { /* Empty */ } }; PluginConfig::PluginConfig(Settings &st) : ConfigWidget(st) { setupUi(this); #if QT_VERSION >= 0x050000 qtwPlugins->header()->setSectionResizeMode(0, QHeaderView::Stretch); qtwPlugins->header()->setSectionResizeMode(1, QHeaderView::ResizeToContents); #else qtwPlugins->header()->setResizeMode(0, QHeaderView::Stretch); qtwPlugins->header()->setResizeMode(1, QHeaderView::ResizeToContents); #endif refillPluginList(); } QString PluginConfig::title() const { return tr("Plugins"); } QIcon PluginConfig::icon() const { return QIcon(QLatin1String("skin:config_plugin.png")); } void PluginConfig::load(const Settings &r) { loadCheckBox(qcbTransmit, r.bTransmitPosition); } void PluginConfig::save() const { QReadLocker lock(&g.p->qrwlPlugins); s.bTransmitPosition = qcbTransmit->isChecked(); s.qmPositionalAudioPlugins.clear(); QList list = qtwPlugins->findItems(QString(), Qt::MatchContains); foreach(QTreeWidgetItem *i, list) { bool enabled = (i->checkState(1) == Qt::Checked); PluginInfo *pi = pluginForItem(i); if (pi) { s.qmPositionalAudioPlugins.insert(pi->filename, enabled); pi->enabled = enabled; } } } PluginInfo *PluginConfig::pluginForItem(QTreeWidgetItem *i) const { if (i) { foreach(PluginInfo *pi, g.p->qlPlugins) { if (pi->filename == i->data(0, Qt::UserRole).toString()) return pi; } } return NULL; } void PluginConfig::on_qpbConfig_clicked() { PluginInfo *pi; { QReadLocker lock(&g.p->qrwlPlugins); pi = pluginForItem(qtwPlugins->currentItem()); } if (! pi) return; if (pi->pqt && pi->pqt->config) { pi->pqt->config(this); } else if (pi->p->config) { pi->p->config(0); } else { QMessageBox::information(this, QLatin1String("Mumble"), tr("Plugin has no configure function."), QMessageBox::Ok, QMessageBox::NoButton); } } void PluginConfig::on_qpbAbout_clicked() { PluginInfo *pi; { QReadLocker lock(&g.p->qrwlPlugins); pi = pluginForItem(qtwPlugins->currentItem()); } if (! pi) return; if (pi->pqt && pi->pqt->about) { pi->pqt->about(this); } else if (pi->p->about) { pi->p->about(0); } else { QMessageBox::information(this, QLatin1String("Mumble"), tr("Plugin has no about function."), QMessageBox::Ok, QMessageBox::NoButton); } } void PluginConfig::on_qpbReload_clicked() { g.p->rescanPlugins(); refillPluginList(); } void PluginConfig::refillPluginList() { QReadLocker lock(&g.p->qrwlPlugins); qtwPlugins->clear(); foreach(PluginInfo *pi, g.p->qlPlugins) { QTreeWidgetItem *i = new QTreeWidgetItem(qtwPlugins); i->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable); i->setCheckState(1, pi->enabled ? Qt::Checked : Qt::Unchecked); i->setText(0, pi->description); if (pi->p->longdesc) i->setToolTip(0, Qt::escape(QString::fromStdWString(pi->p->longdesc()))); i->setData(0, Qt::UserRole, pi->filename); } qtwPlugins->setCurrentItem(qtwPlugins->topLevelItem(0)); on_qtwPlugins_currentItemChanged(qtwPlugins->topLevelItem(0), NULL); } void PluginConfig::on_qtwPlugins_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *) { QReadLocker lock(&g.p->qrwlPlugins); PluginInfo *pi=pluginForItem(current); if (pi) { bool showAbout = false; if (pi->p->about) { showAbout = true; } if (pi->pqt && pi->pqt->about) { showAbout = true; } qpbAbout->setEnabled(showAbout); bool showConfig = false; if (pi->p->config) { showConfig = true; } if (pi->pqt && pi->pqt->config) { showConfig = true; } qpbConfig->setEnabled(showConfig); } else { qpbAbout->setEnabled(false); qpbConfig->setEnabled(false); } } Plugins::Plugins(QObject *p) : QObject(p) { QTimer *timer=new QTimer(this); timer->setObjectName(QLatin1String("Timer")); timer->start(500); locked = prevlocked = NULL; bValid = false; iPluginTry = 0; for (int i=0;i<3;i++) fPosition[i]=fFront[i]=fTop[i]= 0.0; QMetaObject::connectSlotsByName(this); #ifdef QT_NO_DEBUG #ifndef PLUGIN_PATH qsSystemPlugins=QString::fromLatin1("%1/plugins").arg(MumbleApplication::instance()->applicationVersionRootPath()); #ifdef Q_OS_MAC qsSystemPlugins=QString::fromLatin1("%1/../Plugins").arg(qApp->applicationDirPath()); #endif #else qsSystemPlugins=QLatin1String(MUMTEXT(PLUGIN_PATH)); #endif qsUserPlugins = g.qdBasePath.absolutePath() + QLatin1String("/Plugins"); #else qsSystemPlugins = QString::fromLatin1("%1/plugins").arg(MumbleApplication::instance()->applicationVersionRootPath()); qsUserPlugins = QString(); #endif #ifdef Q_OS_WIN // According to MS KB Q131065, we need this to OpenProcess() hToken = NULL; if (!OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, FALSE, &hToken)) { if (GetLastError() == ERROR_NO_TOKEN) { ImpersonateSelf(SecurityImpersonation); OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, FALSE, &hToken); } } TOKEN_PRIVILEGES tp; LUID luid; cbPrevious=sizeof(TOKEN_PRIVILEGES); LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid); tp.PrivilegeCount = 1; tp.Privileges[0].Luid = luid; tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), &tpPrevious, &cbPrevious); #endif } Plugins::~Plugins() { clearPlugins(); #ifdef Q_OS_WIN AdjustTokenPrivileges(hToken, FALSE, &tpPrevious, cbPrevious, NULL, NULL); CloseHandle(hToken); #endif } void Plugins::clearPlugins() { QWriteLocker lock(&g.p->qrwlPlugins); foreach(PluginInfo *pi, qlPlugins) { if (pi->locked) pi->p->unlock(); pi->lib.unload(); delete pi; } qlPlugins.clear(); } void Plugins::rescanPlugins() { clearPlugins(); QWriteLocker lock(&g.p->qrwlPlugins); prevlocked = locked = NULL; bValid = false; QDir qd(qsSystemPlugins, QString(), QDir::Name, QDir::Files | QDir::Readable); #ifdef QT_NO_DEBUG QDir qud(qsUserPlugins, QString(), QDir::Name, QDir::Files | QDir::Readable); QFileInfoList libs = qud.entryInfoList() + qd.entryInfoList(); #else QFileInfoList libs = qd.entryInfoList(); #endif QSet evaluated; foreach(const QFileInfo &libinfo, libs) { QString fname = libinfo.fileName(); QString libname = libinfo.absoluteFilePath(); if (!evaluated.contains(fname) && QLibrary::isLibrary(libname)) { PluginInfo *pi = new PluginInfo(); pi->lib.setFileName(libname); pi->filename = fname; if (pi->lib.load()) { mumblePluginFunc mpf = reinterpret_cast(pi->lib.resolve("getMumblePlugin")); if (mpf) { evaluated.insert(fname); pi->p = mpf(); // Check whether the plugin has a valid plugin magic and that it's not retracted. // A retracted plugin is a plugin that clients should disregard, typically because // the game the plugin was written for now provides positional audio via the // link plugin (see null_plugin.cpp). if (pi->p && pi->p->magic == MUMBLE_PLUGIN_MAGIC && pi->p->shortname != L"Retracted") { pi->description = QString::fromStdWString(pi->p->description); pi->shortname = QString::fromStdWString(pi->p->shortname); pi->enabled = g.s.qmPositionalAudioPlugins.value(pi->filename, true); mumblePlugin2Func mpf2 = reinterpret_cast(pi->lib.resolve("getMumblePlugin2")); if (mpf2) { pi->p2 = mpf2(); if (pi->p2->magic != MUMBLE_PLUGIN_MAGIC_2) { pi->p2 = NULL; } } mumblePluginQtFunc mpfqt = reinterpret_cast(pi->lib.resolve("getMumblePluginQt")); if (mpfqt) { pi->pqt = mpfqt(); if (pi->pqt->magic != MUMBLE_PLUGIN_MAGIC_QT) { pi->pqt = NULL; } } qlPlugins << pi; continue; } } pi->lib.unload(); } else { qWarning("Plugins: Failed to load %s: %s", qPrintable(pi->filename), qPrintable(pi->lib.errorString())); } delete pi; } } // Handle built-in plugins { #if defined(USE_MANUAL_PLUGIN) // Manual plugin PluginInfo *pi = new PluginInfo(); pi->filename = QLatin1String("manual.builtin"); pi->p = ManualPlugin_getMumblePlugin(); pi->pqt = ManualPlugin_getMumblePluginQt(); pi->description = QString::fromStdWString(pi->p->description); pi->shortname = QString::fromStdWString(pi->p->shortname); pi->enabled = g.s.qmPositionalAudioPlugins.value(pi->filename, true); qlPlugins << pi; #endif } } bool Plugins::fetch() { if (g.bPosTest) { fPosition[0] = fPosition[1] = fPosition[2] = 0.0f; fFront[0] = 0.0f; fFront[1] = 0.0f; fFront[2] = 1.0f; fTop[0] = 0.0f; fTop[1] = 1.0f; fTop[2] = 0.0f; for (int i=0;i<3;++i) { fCameraPosition[i] = fPosition[i]; fCameraFront[i] = fFront[i]; fCameraTop[i] = fTop[i]; } bValid = true; return true; } if (! locked) { bValid = false; return bValid; } QReadLocker lock(&qrwlPlugins); if (! locked) { bValid = false; return bValid; } if (!locked->enabled) bUnlink = true; bool ok; { QMutexLocker mlock(&qmPluginStrings); ok = locked->p->fetch(fPosition, fFront, fTop, fCameraPosition, fCameraFront, fCameraTop, ssContext, swsIdentity); } if (! ok || bUnlink) { lock.unlock(); QWriteLocker wlock(&qrwlPlugins); if (locked) { locked->p->unlock(); locked->locked = false; prevlocked = locked; locked = NULL; for (int i=0;i<3;i++) fPosition[i]=fFront[i]=fTop[i]=fCameraPosition[i]=fCameraFront[i]=fCameraTop[i] = 0.0f; } } bValid = ok; return bValid; } void Plugins::on_Timer_timeout() { fetch(); QReadLocker lock(&qrwlPlugins); if (prevlocked) { g.l->log(Log::Information, tr("%1 lost link.").arg(Qt::escape(prevlocked->shortname))); prevlocked = NULL; } { QMutexLocker mlock(&qmPluginStrings); if (! locked) { ssContext.clear(); swsIdentity.clear(); } std::string context; if (locked) context.assign(u8(QString::fromStdWString(locked->p->shortname)) + static_cast(0) + ssContext); if (! g.uiSession) { ssContextSent.clear(); swsIdentitySent.clear(); } else if ((context != ssContextSent) || (swsIdentity != swsIdentitySent)) { MumbleProto::UserState mpus; mpus.set_session(g.uiSession); if (context != ssContextSent) { ssContextSent.assign(context); mpus.set_plugin_context(context); } if (swsIdentity != swsIdentitySent) { swsIdentitySent.assign(swsIdentity); mpus.set_plugin_identity(u8(QString::fromStdWString(swsIdentitySent))); } if (g.sh) g.sh->sendMessage(mpus); } } if (locked) { return; } if (! g.s.bTransmitPosition) return; lock.unlock(); QWriteLocker wlock(&qrwlPlugins); if (qlPlugins.isEmpty()) return; ++iPluginTry; if (iPluginTry >= qlPlugins.count()) iPluginTry = 0; std::multimap pids; #if defined(Q_OS_WIN) PROCESSENTRY32 pe; pe.dwSize = sizeof(pe); HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnap != INVALID_HANDLE_VALUE) { BOOL ok = Process32First(hSnap, &pe); while (ok) { pids.insert(std::pair(std::wstring(pe.szExeFile), pe.th32ProcessID)); ok = Process32Next(hSnap, &pe); } CloseHandle(hSnap); } #elif defined(Q_OS_LINUX) QDir d(QLatin1String("/proc")); QStringList entries = d.entryList(); bool ok; foreach (const QString &entry, entries) { // Check if the entry is a PID // by checking whether it's a number. // If it is not, skip it. unsigned long long int pid = static_cast(entry.toLongLong(&ok, 10)); if (!ok) { continue; } QString exe = QFile::symLinkTarget(QString(QLatin1String("/proc/%1/exe")).arg(entry)); QFileInfo fi(exe); QString firstPart = fi.baseName(); QString completeSuffix = fi.completeSuffix(); QString baseName; if (completeSuffix.isEmpty()) { baseName = firstPart; } else { baseName = firstPart + QLatin1String(".") + completeSuffix; } if (baseName == QLatin1String("wine-preloader") || baseName == QLatin1String("wine64-preloader")) { QFile f(QString(QLatin1String("/proc/%1/cmdline")).arg(entry)); if (f.open(QIODevice::ReadOnly)) { QByteArray cmdline = f.readAll(); f.close(); int nul = cmdline.indexOf('\0'); if (nul != -1) { cmdline.truncate(nul); } QString exe = QString::fromUtf8(cmdline); if (exe.contains(QLatin1String("\\"))) { int lastBackslash = exe.lastIndexOf(QLatin1String("\\")); if (exe.count() > lastBackslash + 1) { baseName = exe.mid(lastBackslash + 1); } } } } if (!baseName.isEmpty()) { pids.insert(std::pair(baseName.toStdWString(), pid)); } } #endif PluginInfo *pi = qlPlugins.at(iPluginTry); if (pi->enabled) { if (pi->p2 ? pi->p2->trylock(pids) : pi->p->trylock()) { pi->shortname = QString::fromStdWString(pi->p->shortname); g.l->log(Log::Information, tr("%1 linked.").arg(Qt::escape(pi->shortname))); pi->locked = true; bUnlink = false; locked = pi; } } } void Plugins::checkUpdates() { QUrl url; url.setPath(QLatin1String("/v1/pa-plugins")); QList > queryItems; queryItems << qMakePair(QString::fromUtf8("ver"), QString::fromUtf8(QUrl::toPercentEncoding(QString::fromUtf8(MUMBLE_RELEASE)))); #if defined(Q_OS_WIN) # if defined(Q_OS_WIN64) queryItems << qMakePair(QString::fromUtf8("os"), QString::fromUtf8("WinX64")); # else queryItems << qMakePair(QString::fromUtf8("os"), QString::fromUtf8("Win32")); # endif queryItems << qMakePair(QString::fromUtf8("abi"), QString::fromUtf8(MUMTEXT(_MSC_VER))); #elif defined(Q_OS_MAC) # if defined(USE_MAC_UNIVERSAL) queryItems << qMakePair(QString::fromUtf8("os"), QString::fromUtf8("MacOSX-Universal")); # else queryItems << qMakePair(QString::fromUtf8("os"), QString::fromUtf8("MacOSX")); # endif #else queryItems << qMakePair(QString::fromUtf8("os"), QString::fromUtf8("Unix")); #endif #ifdef QT_NO_DEBUG #if QT_VERSION >= 0x050000 QUrlQuery query; query.setQueryItems(queryItems); url.setQuery(query); #else for (int i = 0; i < queryItems.size(); i++) { const QPair &queryPair = queryItems.at(i); url.addQueryItem(queryPair.first, queryPair.second); } #endif WebFetch::fetch(QLatin1String("update"), url, this, SLOT(fetchedUpdatePAPlugins(QByteArray,QUrl))); #else g.mw->msgBox(tr("Skipping plugin update in debug mode.")); #endif } void Plugins::fetchedUpdatePAPlugins(QByteArray data, QUrl) { if (data.isNull()) return; bool rescan = false; qmPluginFetchMeta.clear(); QDomDocument doc; doc.setContent(data); QDomElement root=doc.documentElement(); QDomNode n = root.firstChild(); while (!n.isNull()) { QDomElement e = n.toElement(); if (!e.isNull()) { if (e.tagName() == QLatin1String("plugin")) { QString name = QFileInfo(e.attribute(QLatin1String("name"))).fileName(); QString hash = e.attribute(QLatin1String("hash")); QString path = e.attribute(QLatin1String("path")); qmPluginFetchMeta.insert(name, PluginFetchMeta(hash, path)); } } n = n.nextSibling(); } QDir qd(qsSystemPlugins, QString(), QDir::Name, QDir::Files | QDir::Readable); QDir qdu(qsUserPlugins, QString(), QDir::Name, QDir::Files | QDir::Readable); QFileInfoList libs = qd.entryInfoList(); foreach(const QFileInfo &libinfo, libs) { QString libname = libinfo.absoluteFilePath(); QString filename = libinfo.fileName(); PluginFetchMeta pfm = qmPluginFetchMeta.value(filename); QString wanthash = pfm.hash; if (! wanthash.isNull() && QLibrary::isLibrary(libname)) { QFile f(libname); if (wanthash.isEmpty()) { // Outdated plugin if (f.exists()) { clearPlugins(); f.remove(); rescan=true; } } else if (f.open(QIODevice::ReadOnly)) { QString h = QLatin1String(sha1(f.readAll()).toHex()); f.close(); if (h == wanthash) { if (qd != qdu) { QFile qfuser(qsUserPlugins + QString::fromLatin1("/") + filename); if (qfuser.exists()) { clearPlugins(); qfuser.remove(); rescan=true; } } // Mark for removal from userplugins qmPluginFetchMeta.insert(filename, PluginFetchMeta()); } } } } if (qd != qdu) { libs = qdu.entryInfoList(); foreach(const QFileInfo &libinfo, libs) { QString libname = libinfo.absoluteFilePath(); QString filename = libinfo.fileName(); PluginFetchMeta pfm = qmPluginFetchMeta.value(filename); QString wanthash = pfm.hash; if (! wanthash.isNull() && QLibrary::isLibrary(libname)) { QFile f(libname); if (wanthash.isEmpty()) { // Outdated plugin if (f.exists()) { clearPlugins(); f.remove(); rescan=true; } } else if (f.open(QIODevice::ReadOnly)) { QString h = QLatin1String(sha1(f.readAll()).toHex()); f.close(); if (h == wanthash) { qmPluginFetchMeta.remove(filename); } } } } } QMap::const_iterator i; for (i = qmPluginFetchMeta.constBegin(); i != qmPluginFetchMeta.constEnd(); ++i) { PluginFetchMeta pfm = i.value(); if (! pfm.hash.isEmpty()) { QUrl pluginDownloadUrl; if (pfm.path.isEmpty()) { pluginDownloadUrl.setPath(QString::fromLatin1("%1").arg(i.key())); } else { pluginDownloadUrl.setPath(pfm.path); } WebFetch::fetch(QLatin1String("pa-plugin-dl"), pluginDownloadUrl, this, SLOT(fetchedPAPluginDL(QByteArray,QUrl))); } } if (rescan) rescanPlugins(); } void Plugins::fetchedPAPluginDL(QByteArray data, QUrl url) { if (data.isNull()) return; bool rescan = false; const QString &urlPath = url.path(); QString fname = QFileInfo(urlPath).fileName(); if (qmPluginFetchMeta.contains(fname)) { PluginFetchMeta pfm = qmPluginFetchMeta.value(fname); if (pfm.hash == QLatin1String(sha1(data).toHex())) { bool verified = true; #ifdef Q_OS_WIN verified = false; QString tempname; std::wstring tempnative; { QTemporaryFile temp(QDir::tempPath() + QLatin1String("/plugin_XXXXXX.dll")); if (temp.open()) { tempname = temp.fileName(); tempnative = QDir::toNativeSeparators(tempname).toStdWString(); temp.write(data); temp.setAutoRemove(false); } } if (! tempname.isNull()) { WINTRUST_FILE_INFO file; ZeroMemory(&file, sizeof(file)); file.cbStruct = sizeof(file); file.pcwszFilePath = tempnative.c_str(); WINTRUST_DATA data; ZeroMemory(&data, sizeof(data)); data.cbStruct = sizeof(data); data.dwUIChoice = WTD_UI_NONE; data.fdwRevocationChecks = WTD_REVOKE_NONE; data.dwUnionChoice = WTD_CHOICE_FILE; data.pFile = &file; data.dwProvFlags = WTD_SAFER_FLAG | WTD_USE_DEFAULT_OSVER_CHECK; data.dwUIContext = WTD_UICONTEXT_INSTALL; static GUID guid = WINTRUST_ACTION_GENERIC_VERIFY_V2; LONG ts = WinVerifyTrust(0, &guid , &data); QFile deltemp(tempname); deltemp.remove(); verified = (ts == 0); } #endif if (verified) { clearPlugins(); QFile f; f.setFileName(qsSystemPlugins + QLatin1String("/") + fname); if (f.open(QIODevice::WriteOnly)) { f.write(data); f.close(); g.mw->msgBox(tr("Downloaded new or updated plugin to %1.").arg(Qt::escape(f.fileName()))); } else { f.setFileName(qsUserPlugins + QLatin1String("/") + fname); if (f.open(QIODevice::WriteOnly)) { f.write(data); f.close(); g.mw->msgBox(tr("Downloaded new or updated plugin to %1.").arg(Qt::escape(f.fileName()))); } else { g.mw->msgBox(tr("Failed to install new plugin to %1.").arg(Qt::escape(f.fileName()))); } } rescan=true; } } } if (rescan) rescanPlugins(); } mumble-1.3.4/src/mumble/mumble_hi.ts0000664000175000017500000114640714010707274017240 0ustar builderbuilder ACLEditor Deny Allow Allow %1 Deny %1 Mumble - Add channel Default server value Failed: Invalid channel Mumble - Edit %1 ID: %1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Channel must have a name This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Dialog Name Enter the channel name here. Description Password Enter the channel password here. Check to create a temporary channel. Temporary <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. Position &Groups Group List of groups Remove selected group Remove Inherit group members from parent Inherit Make group inheritable to sub-channels Inheritable Group was inherited from parent channel Inherited Members Add Add member to group Remove member from group &ACL Active ACLs List of entries Inherit ACL of parent? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. Inherit ACLs Move entry up This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. &Up Move entry down This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. &Down Add new entry This adds a new entry, initially set with no permissions and applying to all. &Add Remove entry This removes the currently selected entry. &Remove Context Entry should apply to this channel. Entry should apply to this channel This makes the entry apply to this channel. Applies to this channel Entry should apply to sub-channels. Add new group <b>Add</b><br/> Add a new group. Inherited members Contains the list of members added to the group by this channel. Contains a list of members whose group membership will not be inherited from the parent channel. Contains the list of members inherited by other channels. Type in the name of a user you wish to add to the group and click Add. Type in the name of a user you wish to remove from the group and click Add. Exclude Excluded members This makes the entry apply to sub-channels of this channel. Applies to sub-channels Permissions User/Group Group this entry applies to User ID User this entry applies to This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. &Properties <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. ID of the channel. Maximum Users Maximum number of users allowed in the channel <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. This is the sort order for the channel. ALSAAudioInput Default ALSA Card Opening chosen ALSA Input failed: %1 ALSAAudioOutput Default ALSA Card Opening chosen ALSA Output failed: %1 ASIOConfig %1 (version %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz ASIO Initialization failed: %1 Failed to instantiate ASIO driver ASIO Device selection Device Device to use for microphone This chooses what device to query. You still need to actually query the device and select which channels to use. Query selected device This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Query Configure selected device This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Configure Capabilities Driver name Buffer size This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. Configure input channels Channels Microphone <- -> Unused Speakers ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. Opening selected ASIO device failed. No input will be done. AboutDialog About Mumble <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble &License A&uthors &Third-Party Licenses OK AudioInput Interface System Input method for audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Input device for audio <b>This is the input device to use for audio.</b> Transmission &Transmit When to transmit your speech <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. DoublePush Time If you press the PTT key twice in this time it will get locked. <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. Reset audio cue to default <b>Reset</b><br/>Reset the paths for the files to their default. Browse for on audio file Browse for off audio file Off On Preview the audio cues Use SNR based speech detection Signal to Noise <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. Amplitude Voice &Hold How long to keep transmitting after silence Silence Below <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. Speech Above Signal values above this count as voice Compression &Quality Quality of compression (peak bandwidth) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. Audio per packet How many audio frames to send per packet <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). Audio Processing Noise Suppression Noise suppression <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. Maximum amplification of input sound <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. Current speech detection chance Cancel echo from speakers Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. Disabled <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal values below this count as silence Maximum bandwidth used for sending audio Use Amplitude based speech detection <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). Exclusive mode <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive R&eset &Browse... B&rowse... &Preview <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. Displays an always on top window with a push to talk button in it Display push to talk window Misc Audible audio cue when starting or stopping to transmit <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. Audio cue Gets played when starting to transmit Gets played when stopping to transmit Hold Time Time the microphone stays open after the PTT key is released Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) Max. Amplification Idle action minutes do nothing deafen mute after Echo Cancellation Mixed echo cancellation Multichannel echo cancellation The idle action will be reversed upon any key or mouse button input Undo Idle action upon activity Apply RNNoise's noise suppression filter. <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. RNNoise Audio input AudioInputDialog Continuous Voice Activity Push To Talk Audio Input %1 ms Off %1 s %1 kb/s -%1 dB %1 kbit/s (Audio %2, Position %4, Overhead %3) AudioOutput Interface System Output method for audio <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Output device for audio <b>This is the output device to use for audio.</b> Positional Audio Audio Output Default &Jitter Buffer Safety margin for jitter buffer <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. Minimum distance to user before sound volume decreases This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. Volume Volume of incoming speech <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. Output Delay Amount of data to buffer The connected "speakers" are actually headphones The connected "speakers" are actually headphones. Factor for sound volume decrease Bloom Factor for sound volume increase How much should sound volume increase for sources that are really close? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Headphones Minimum Distance Maximum Distance Maximum distance, beyond which speech volume won't decrease Minimum Volume What should the volume be at the maximum distance? Loopback Test Delay Variance Variance in packet latency <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. Packet Loss Packet loss for loopback mode <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% &Loopback Desired loopback mode Attenuate applications by... Attenuation of other applications during speech <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. If checked Mumble lowers the volume of other applications while other users talk <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. while other users talk If checked Mumble lowers the volume of other applications while you talk <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. while you talk Exclusive mode, not recommended. <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive Priority Speaker If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. Attenuate other users while talking as Priority Speaker. Advanced Attenuation Options If checked, Mumble will only attenuate applications that are using the same output source as Mumble <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. Only attenuate applications using the same output device If checked, PulseAudio loopback modules will be attenuated <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. Attenuate PulseAudio loopback modules Audio output AudioOutputDialog None Local Server Audio Output %1 ms %1 % %1 m AudioOutputSample Choose sound file Invalid sound file The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. AudioStats >1000 ms >1000ms Audio Statistics Input Levels Peak microphone level Peak power in last frame This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. Peak speaker level This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. Peak clean level This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. Signal Analysis Microphone power How close the current input level is to ideal This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. Signal-To-Noise ratio Signal-To-Noise ratio from the microphone This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. Speech Probability Probability of speech This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). Configuration feedback Current audio bitrate Bitrate of last frame DoublePush interval Time between last two Push-To-Talk presses Speech Detection Current speech detection chance <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal and noise power spectrum Power spectrum of input signal and noise estimate This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. Echo Analysis Weights of the echo canceller This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. AudioWizard Audio Tuning Wizard Introduction Welcome to the Mumble Audio Wizard Finished Enjoy using Mumble Device selection Selecting the input and output device to use with Mumble. This is the device your microphone is connected to. System Input method for audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Input device to use <b>Selects which sound card to use for audio input.</b> Cancel echo from headset or speakers Use echo cancellation This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. This is the device your speakers or headphones are connected to. Output method for audio <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. Output device to use <b>Selects which sound card to use for audio Output.</b> Enable positional audio Allows positioning of sound Allows positioning of sound. <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> Input Device Output Device This allows Mumble to use positional audio to place voices. <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> Amount of data to buffer This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> Positional Audio Adjusting attenuation of positional audio. <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> Use headphones instead of speakers <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> Use headphones This ignores the OS speaker configuration and configures the positioning for headphones instead. Volume tuning Tuning microphone hardware volume to optimal settings. Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. Voice Activity Detection Letting Mumble figure out when you're talking and when you're silent. This will help Mumble figure out when you are talking. The first step is selecting which data value to use. Raw amplitude from input Signal-To-Noise ratio Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Device tuning Changing hardware output delays to their minimum value. Submit anonymous statistics to the Mumble project Push To Talk: Quality & Notifications Adjust quality and notification settings. Quality settings Low Balanced Notification settings Use Text-To-Speech to read notifications and messages to you. Disable Text-To-Speech and use sounds instead. %1 ms Enables attenuation of other applications while users talk to you Attenuate applications while other users talk High Custom You already set a customized quality configuration in Mumble. Select this setting to keep it. Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. Apply some high contrast optimizations for visually impaired users Use high contrast graphics Keep custom Text-To-Speech settings. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) BanEditor Mumble - Edit Bans &Address &Mask Reason Start End User Hash &Add &Update &Remove Ban List Search field This is the search field. Use it to find bans that have this username set in the username field. Who are you looking for? No nickname IP address No IP address Reason for the ban No reason Ban end date Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). Certificate hash No certificate hash Banned users This is a list with banned users. Use this button if you want to add a new ban. Use this button if you want to update ban information. Use this button if you want to remove user from the ban list. Clear all fields This button clears all fields. Use it if you want to add a new ban. Clear Ban List - %n Ban(s) CertView Name Email Issuer Expiry Date (none) Self-signed CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. There was an error generating your certificate.<br />Please try again. Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. The file could not be opened for writing. Please use another file. The file's permissions could not be set. No certificate and key has been written. Please use another file. The file could not be written successfully. Please use another file. The file could not be opened for reading. Please use another file. The file is empty or could not be read. Please use another file. The file did not contain a valid certificate and key. Please use another file. Select file to export certificate to Select file to import certificate from Unable to import. Missing password or incompatible file type. <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. Certificates Certificate Management Certificate Authentication Authenticating to servers without using passwords Current certificate This is the certificate Mumble currently uses. Current Certificate Create a new certificate This will create a new certificate. Import certificate from file This will import a certificate from file. Import a certificate Export Certificate This will export a certificate to file. Export current certificate Import Certificate PKCS #12 Certificate import <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> Import from Filename to import from This is the filename you wish to import a certificate from. Select file to import from This opens a file selection dialog to choose a file to import a certificate from. Open... Password Password for PKCS#12 file This is the password for the PKCS#12 file containing your certificate. Certificate to import This is the certificate you are importing. Certificate Details Replace Certificate Replace existing certificate with new certificate? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> This is the certificate Mumble currently uses. It will be replaced. New certificate This is the new certificate that will replace the old one. New Certificate Make a backup of your certificate Export to Filename to export to This is the filename you wish to export a certificate to. Save As... This is the certificate Mumble currently uses. It will be exported. Generate a new certificate for strong authentication <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> Name Email Your email address (e.g. johndoe@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. Your name (e.g. John Doe) This is your name, and will be filled out in the certificate. This field is entirely optional. Finish Certificate-based authentication is ready for use Enjoy using Mumble with strong authentication. Automatic certificate creation <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> ChanACL None Traverse Enter Speak Mute/Deafen Make channel Make temporary Link channel This represents no privileges. This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. This represents the permission to write text messages to other users in this channel. This represents the permission to forcibly remove users from the server. This represents the permission to permanently remove users from the server. This represents the permission to register and unregister users on the server. This represents the permission to register oneself on the server. Whisper Move Text message Kick Ban Register User Register Self Write ACL ChatbarTextEdit Paste and &Send Paste and send <center>Type chat message here</center> ClientUser Friend Authenticated Priority speaker Recording Muted (server) Deafened (server) Local Ignore (Text messages) Local Mute Muted (self) Deafened (self) ConfigDialog Accept changes This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. Reject changes This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. Apply changes This button will immediately apply all changes. Undo changes for current page This button will revert any changes done on the current page to the most recent applied settings. Restore defaults for current page This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. Mumble Configuration ConnectDialog Connecting to %1 Enter username Adding host %1 Servername Hostname Bonjour name Port Addresses Website Packet loss Ping (80%) %1 ms Ping (95%) Bandwidth %1 kbit/s &Connect &Filters Unknown Users Version Failed to fetch server list Mumble Server Connect Ping Remove from Favorites Add custom server Show all servers that respond to ping Show all servers with users Show all servers &Copy Copy favorite link to clipboard &Paste Paste favorite from clipboard &Edit... &Add New... Add to &Favorites Open &Webpage Show &Reachable Show &Populated Show &All ConnectDialogEdit Edit Server Name of the server A&ddress Internet address of the server. Internet address of the server. <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. &Port Port on which the server is listening <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. &Username Username to send to the server <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. Label Add Server You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 Password Password to send to the server <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. Show password <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. Local server label 127.0.0.1 64738 Your username Your password &Fill CoreAudioSystem Default Device CrashReporter Mumble Crash Report <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> Email address (optional) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash Send Report Don't send report Crash upload successful Thank you for helping make Mumble better! Crash upload failed We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 Uploading crash report Abort upload DXAudioInput Default DirectSound Voice Input Opening chosen DirectSound Input device failed. No microphone capture will be done. Opening chosen DirectSound Input failed. Default device will be used. Lost DirectSound input device. DXAudioOutput Default DirectSound Voice Output Opening chosen DirectSound Output failed. Default device will be used. Lost DirectSound output device. Opening chosen DirectSound Output failed. No audio will be heard. Database Mumble failed to initialize a database in any of the possible locations. The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. DeveloperConsole Developer Console DockTitleBar Drag here GlobalShortcut Shortcuts List of configured shortcuts Function Data Shortcut Suppress Add new shortcut This will add a new global shortcut &Add Remove selected shortcut This will permanently remove a selected shortcut. &Remove <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> Open Accessibility Preferences Skip Enable Global Shortcuts <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. Additional Shortcut Engines <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. Enable Windows hooks <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. Enable GKey <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. Enable XInput <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. Enable shortcuts in privileged applications GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> Shortcuts Shortcut button combination. <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. Suppress keys from other applications <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. GlobalShortcutTarget Whisper Target Whisper to list of Users Channel Target Restrict to Group If specified, only members of this group will receive the whisper. List of users Add Remove Modifiers Do not send positional audio information when using this whisper shortcut. Ignore positional audio Shout to Linked channels Shout to subchannels Shout to Channel The whisper will also be transmitted to linked channels. The whisper will also be sent to the subchannels of the channel target. GlobalShortcutX Mouse %1 JackAudioSystem Hardware Ports Mono Stereo LCD Not connected LCDConfig Enable this device LCD Devices Name <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> Size Enabled Views Minimum Column Width <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> This setting decides the width of column splitter. Splitter Width Log Debug Critical Warning Information Server Connected Server Disconnected Other self-muted/deafened Permission Denied Text Message User Joined Server User Left Server User recording state changed User kicked (you or by you) User kicked You self-muted User muted (you) User muted (by you) User muted (other) User Joined Channel User Left Channel You self-unmuted You self-deafened You self-undeafened User renamed You Joined Channel You Joined Channel (moved) User connected and entered channel User left channel and disconnected Private text message the server [[ Invalid size ]] [[ Text object too large to display ]] [Date changed to %1] link to %1 FTP link to %1 player link channel link %1 link LogConfig Toggle console for %1 events Toggle pop-up notifications for %1 events Toggle Text-To-Speech for %1 events Click here to toggle sound notification for %1 events Toggle window highlight (if not active) for %1 events Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. Messages Message Console Notification Text-To-Speech Soundfile Path Text To Speech Volume Volume of Text-To-Speech Engine <b>This is the volume used for the speech synthesis.</b> Length threshold Message length threshold for Text-To-Speech Engine <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. Characters Whisper If checked you will only hear whispers from users you added to your friend list. Only accept whispers from friends If enabled text messages you send will be read back to you with TTS Read back own messages Chat Log Maximum chat length Unlimited Lines Highlight LookConfig System default None Only with users All Ask Do Nothing Move <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory User Interface This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. List users above subchannels (requires restart). <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. Users above Channels <b>If set, will verify you want to quit if connected.</b> Show number of users in each channel Show channel user count Language Language to use (requires restart) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. Look and Feel Layout Classic Stacked Hybrid Custom This changes the behavior when moving channels. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. Expand When to automatically expand channels Channel Dragging Ask whether to close or minimize when quitting Mumble. Ask on quit while connected Always On Top <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> Hide in tray when minimized Hide the main Mumble window in the tray when it is minimized. This setting controls when the application will be always on top. Never Always In minimal view In normal view Displays talking status in system tray Show talking status in tray icon This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. Show context menu in menu bar Apply some high contrast optimizations for visually impaired users Optimize for high contrast Application Adds user and channel context menus into the menu bar Tray Icon Channel Tree Use selected item as the chat bar target Filter automatically hides empty channels Show transmit mode dropdown in toolbar Theme Theme to use to style the user interface <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. User Dragging This changes the behavior when moving users. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. Enable Developer menu When in custom layout mode, checking this disables rearranging. Lock layout MainWindow Root Push-to-Talk Global Shortcut Push and hold this button to send voice. Global Shortcut This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut Reset Audio Processor Global Shortcut Unlink Plugin Global Shortcut Push-to-Mute Global Shortcut Join Channel Global Shortcut Toggle Overlay Global Shortcut Toggle state of in-game overlay. Global Shortcut Toggle Minimal Global Shortcut Volume Up (+10%) Global Shortcut Volume Down (-10%) Global Shortcut Mumble Mumble -- %1 &Window Minimize Ctrl+M Close Mumble is currently connected to a server. Do you want to Close or Minimize it? Mute Self Global Shortcut Set self-mute status. Global Shortcut This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut Deafen Self Global Shortcut Set self-deafen status. Global Shortcut This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut Whisper/Shout Whisper <center>Not connected</center> Not connected Clear Opening URL %1 File does not exist File is not a configuration file. Settings merged from file. URL scheme is not 'mumble' This version of Mumble can't handle URLs for Mumble version %1.%2.%3 Connecting to %1 Enter username Connecting to server %1. Reconnecting. Transmit Mode set to Continuous <p>%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> Register yourself as %1 <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <h2>Version</h2><p>Protocol %1</p> <p>No build information or OS version available</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) The connection is secured by the cipher suite that OpenSSL identifies as %1 <p>The connection provides perfect forward secrecy</p> <p>The connection does not provide perfect forward secrecy</p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> Voice channel is sent over control channel Register user %1 <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> Kicking user %1 Banning user %1 View comment on user %1 Message to channel %1 Connected. <li>Expected certificate digest (SHA-1): %1</li> Server presented a certificate which failed verification. <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> SSL Version mismatch Server connection failed. <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>Type message to user '%1' here</center> Type message to user '%1' here Choose image file Failed to load image Could not open file for reading. Image format not recognized. &User &Channel Use in conjunction with Whisper to. Global Shortcut This will switch the states of the in-game overlay. Global Shortcut Link Channel Global Shortcut Cycle Transmit Mode Global Shortcut Set Transmit Mode to Push-To-Talk Global Shortcut Set Transmit Mode to Continuous Global Shortcut Set Transmit Mode to VAD Global Shortcut Send Text Message Global Shortcut Send Clipboard Text Message Global Shortcut This will send your Clipboard content to the channel you are currently in. Global Shortcut Continuous Voice Activity Push-to-Talk Mumble - Minimal View -- %1 Cancel Save Image As... Save Image File Could not save image: %1 Change your comment Transmit Mode set to Voice Activity Transmit Mode set to Push-to-Talk <p>Connected users: %1/%2</p> UDP Statistics To Server From Server Good Late Lost Resync <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> Mumble Server Information &View Certificate Enter reason Sending message to %1 To %1: %2 Message to %1 Are you sure you want to reset the comment of user %1? Are you sure you want to reset the avatar of user %1? Are you sure you want to delete %1 and all its sub-channels? Sending message to channel %1 Message to tree %1 To %1 (Tree): %2 (Tree) %1: %2 Unmuted and undeafened. Unmuted. Muted. Muted and deafened. Deafened. Undeafened. Restart Mumble? Some settings will only apply after a restart of Mumble. Restart Mumble now? About Qt SSL Verification failed: %1 <li>Server certificate digest (SHA-1): %1</li> <b>WARNING:</b> The server presented a certificate that was different from the stored one. This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. Server connection failed: %1. Disconnected from server. Invalid username You connected with an invalid username, please try another one. Username in use That username is already in use, please try another username. Wrong certificate or password Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. Wrong password Wrong server password for unregistered user account, please try again. Images (*.png *.jpg *.jpeg) C&onfigure &Help Log This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. &Quit Mumble Closes the program Exits the application. Ctrl+Q Open the server connection dialog &Disconnect Disconnect from server Disconnects you from the server. Show information about the server connection This will show extended information about the connection to the server. &Mute &Deafen &Local Mute Send a Text Message Sends a text message to another user. Add new channel This adds a new sub-channel to the currently selected channel. Remove channel This removes a channel and all sub-channels. Edit Groups and ACL for channel This opens the Group and ACL dialog for the channel, to control permissions. &Link Link your channel to another channel This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. Chatbar Shows a dialog of registered servers, and also allows quick-connect. Kick user (with reason) Kick selected user off server. You'll be asked to specify a reason. Mute user Mute or unmute user on server. Unmuting a deafened user will also undeafen them. Kick and ban user (with reason) Kick and ban selected user from server. You'll be asked to specify a reason. Deafen user Deafen or undeafen user on server. Deafening a user will also mute them. Mute user locally Mute or unmute user locally. Use this on other users in the same room. This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. &Unlink Channel Unlink your channel from another channel This unlinks your current channel from the selected channel. Unlinks your channel from all linked channels. This unlinks your current channel (not the selected one) from all linked channels. &Reset Reset audio preprocessor This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. &Mute Self Mute yourself Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. &Deafen Self Deafen yourself Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. &Text-To-Speech Toggle Text-To-Speech Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. Display audio statistics Pops up a small dialog with information about your current audio input. Forcibly unlink plugin This forces the current plugin to unlink, which is handy if it is reading completely wrong data. Configure Mumble Allows you to change most settings for Mumble. Start the audio configuration wizard This will guide you through the process of configuring your audio hardware. &What's This? Enter What's This? mode Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. Information about Mumble Shows a small dialog with information and license for Mumble. Information about Speex Shows a small dialog with information about Speex. Information about Qt Shows a small dialog with information about Qt. Check for &Updates Check for new version of Mumble Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. Sends a text message to all users in a channel. Configure certificates for strong authentication This starts the wizard for creating, importing and exporting certificates for authentication against servers. Register user on server This will permanently register the user on the server. Add &Friend Adds a user as your friend. This will add the user as a friend, so you can recognize him on this and other servers. &Remove Friend Removes a user from your friends. This will remove a user from your friends list. &Update Friend Update name of your friend. Your friend uses a different name than what is in your database. This will update the name. Edit registered users list This opens the editor for registered users, which allow you to change their name or unregister them. Add or remove text-based access tokens &Minimal View Toggle minimal window modes This will toggle minimal mode, where the log window and menu is hidden. You muted and deafened %1. You unmuted and undeafened %1. You undeafened %1. You suppressed %1. %1 muted and deafened by %2. %1 unmuted and undeafened by %2. %1 undeafened by %2. %1 suppressed by %2. %1 moved to %2. %1 moved to %2 by %3. %1 moved in from %2 by %3. %1 is now muted and deafened. Your account information can not be verified currently. Please try again later Welcome message: %1 Mumble: %1 You were denied %1 privileges in %2. %3 was denied %1 privileges in %2. Denied: Cannot modify SuperUser. Denied: Invalid channel name. Denied: Text message too long. Denied: Operation not permitted in temporary channel. You need a certificate to perform this operation. %1 does not have a certificate. Invalid username: %1. Invalid username. Channel is full. Channel nesting limit reached. Channel count limit reached. Need to delete channels before creating new ones. Permission denied. %1 connected and entered channel. %1 connected. %1 is now muted. %1 is now unmuted. Recording started Recording stopped %1 started recording. %1 stopped recording. You revoked your priority speaker status. You assumed priority speaker status. %1 revoked your priority speaker status. %1 gave you priority speaker status. You revoked priority speaker status for %1. You gave priority speaker status to %1. %1 revoked own priority speaker status. %1 assumed priority speaker status. %1 revoked priority speaker status for %2. %1 gave priority speaker status to %2. You were unmuted and undeafened by %1. You were muted by %1. You were undeafened by %1. You were suppressed. You were suppressed by %1. You were unsuppressed. You were unsuppressed by %1. You joined %1. You moved %1 to %2. %1 is recording %1 renamed to %2 by %3. %1 disconnected. Server message from (Tree) (Channel) (Private) %2%1: %3 Failed to load Opus, it will not be available for audio encoding/decoding. The server requests minimum client version %1 The server requests positional audio be enabled. The server requests positional audio be disabled. The server requests Push-to-Talk be enabled. The server requests Push-to-Talk be disabled. You were unmuted by %1. You muted %1. You unsuppressed %1. You unmuted %1. %1 muted by %2. %1 unsuppressed by %2. %1 unmuted by %2. Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. You were muted and deafened by %1. You were deafened by %1. You were kicked from the server by %1: %2. %3 was kicked from the server by %1: %2. You were kicked and banned from the server by %1: %2. %3 was kicked and banned from the server by %1: %2. You were moved to %1 by %2. %1 entered channel. Server connection rejected: %1. Denied: %1. %1 renamed to %2. %1 left channel and disconnected. Message from %1 You have User Dragging set to "Do Nothing" so the user wasn't moved. You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. Unknown Channel Drag mode in UserModel::dropMimeData. Remote controlling Mumble: Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) -jn, --jackname Set custom Jack client name. --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status Invocation Error: No RPC command specified RPC Welcome to Mumble. Skipping version check in debug mode. Hide Frame Toggle showing frame on minimal window This will toggle whether the minimal window should have a frame for moving and resizing. &Unlink All Reset the comment of the selected user. &Join Channel View comment in editor Query server for connection information for user S&erver &Self &Unlink Plugins Register yourself on the server Change your avatar image on this server &Remove Avatar Remove currently defined avatar image. Icon Toolbar Change your own comment Recording Priority Speaker &Copy URL Copies a link to this channel to the clipboard. Ignore Messages Locally ignore user's text chat messages. Silently drops all text messages from the user. Edit ban list on server This lets you edit the server-side IP ban list. &Filter on/off Toggle the channel filter (Ctrl+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. Ctrl+F &Hide Channel when Filtering Reset the avatar of the selected user. Locally adjust the user's speech volume. Opens a dialog with a volume slider. Use this on other users in the same room. &Developer &Hide Mumble Hides the main Mumble window. Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. Show the Developer Console Shows the Mumble Developer Console, where Mumble's log output can be inspected. &Connect... &Ban list... &Information... &Kick... &Ban... Local Volume Adjustment... Send &Message... &Add... &Remove... &Edit... Audio S&tatistics... &Settings... &Audio Wizard... Developer &Console... &About... About &Speex... About &Qt... &Certificate Wizard... &Register... Registered &Users... Change &Avatar... &Access Tokens... Reset &Comment... Reset &Avatar... View Comment... &Change Comment... R&egister... Show Shows the main Mumble window. Manual Manual Mumble Positional Audio Position X Y Z m Heading Azimuth Elevation ° Meta data Context Identity Set State Linked Activated Unhinge NetworkConfig Network Updates are mandatory when using snapshot releases. Connection Use TCP compatibility mode Use TCP compatability mode <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). Reconnect when disconnected <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. Reconnect automatically Proxy Type Type of proxy to connect through Direct connection HTTP(S) proxy SOCKS5 proxy Hostname Hostname of the proxy Force TCP mode Enable QoS to prioritize packets This will enable QoS, which will attempt to prioritize voice packets over other traffic. Use Quality of Service Don't send certificate to server and don't save passwords. (Not saved). <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> Suppress certificate and password storage <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. Port Port number of the proxy <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. Username Username for proxy authentication <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Password Password for proxy authentication <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Mumble services Check for new releases of Mumble automatically. This will check for new releases of Mumble every time you start the program, and notify you if one is available. Check for application updates on startup Check for new releases of plugins automatically. This will check for new releases of plugins every time you start the program, and download them automatically. <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. Submit anonymous statistics to the Mumble project Submit anonymous statistics Reconnect to last used server when starting Mumble Reconnect to last server on startup Download plugin and overlay updates on startup Privacy Prevent OS information being sent to Mumble servers and web servers <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. Do not send OS information to Mumble servers and web servers Overlay Silent Talking Whisper Shout Channel Failed to create communication with overlay at %2: %1. No overlay will be available. OverlayClient Filter Only talking Talking and recently active All in current channel All in linked channels Always show yourself Configure recently active time (%1 seconds)... Columns Sort Alphabetically Last state change Edit... Reset Zoom Configure recently active time Amount of seconds users remain active after talking: OverlayConfig To move the users, drag the little red dot. To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. For more options, right click a user. For more options, rightclick a user. Launcher Filter Overlay Choose executable Choose application Choose path Load Overlay Presets Mumble overlay presets (*.mumblelay) Save Overlay Presets Options Enable overlay. Enable Overlay This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. Layout Blacklist Whitelist Uninstall Overlay Overlay Installation Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. Install Mumble Overlay Overlay Upgrade Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. Upgrade Mumble Overlay Display a frame counter in the overlay Show FPS counter Load an overlay preset from file Load… Save your overlay settings to file Save… Set the overlay font. Set the overlay text color. Color Remove Font FPS and Clock Display Display a clock in the overlay showing the current local time (system time). Show Clock Overlay Exceptions Overlay Exception Mode Allowed launchers Add Allowed programs Allowed paths Blacklisted programs OverlayEditor State User is not talking Passive User is talking in your channel or a linked channel Talking User is whispering to you privately Private Whisper User is shouting to your channel Channel Whisper Zoom Zoom Factor Enabled Elements User avatar, chosen by each user Avatar User's name Username Name of user's channel, if outside your current channel Channel Muted or deafened Mute state Bounding box, automatically shrunk to minimum size to contain all visible elements Bounding box Overlay Editor OverlayEditorScene Layout preset Large square avatar Avatar and Name User Opacity %1% Object Opacity Alignment Left Center Right Top Bottom Color... Font... Bounding box Pen width Padding Pen color Fill color Pick pen color Pick fill color Pick color Pick font PluginConfig Plugins Plugin has no configure function. Plugin has no about function. Options Enable plugins and transmit positional information This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. Link to Game and Transmit Position Reloads all plugins This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. &Reload plugins Information about plugin This shows a small information message about the plugin. &About Show configuration page of plugin This shows the configuration page of the plugin, if any. &Configure Name Enabled Plugins Skipping plugin update in debug mode. Downloaded new or updated plugin to %1. Failed to install new plugin to %1. %1 lost link. %1 linked. PortAudioSystem Default Device PulseAudioSystem Default Input Default Output QApplication Failed to restart mumble Mumble failed to restart itself. Please restart it manually. RichTextEditor Failed to load image Image file too large to embed in document. Please use images smaller than %1 kB. Message is too long. Display Source Text &Bold Ctrl+B &Italic Italic Ctrl+I Underline Ctrl+U Color Insert Link Ctrl+L Insert Image RichTextEditorLink Add Link URL Text ServerHandler Unable to resolve hostname Server is not responding to TCP pings UDP packets cannot be sent to or received from the server. Switching to TCP mode. UDP packets cannot be sent to the server. Switching to TCP mode. UDP packets cannot be received from the server. Switching to TCP mode. UDP packets can be sent to and received from the server. Switching back to UDP mode. Connection timed out ServerView Favorite LAN Public Internet Unknown Africa Asia North America South America Europe Oceania ShortcutActionWidget Unassigned ShortcutDelegate On Off Toggle Unassigned ShortcutKeyWidget Press Shortcut ShortcutTargetDialog Root Parent Current Subchannel #%1 ShortcutTargetWidget ... , Root Parent Current Subchannel #%1 Invalid Empty <Empty> ShortcutToggleWidget Off Toggle On TextMessage Enter text If checked the message is recursively sent to all subchannels Send recursively to subchannels Tokens Empty Token Mumble - Access Tokens List of access tokens on current server <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. Add a token &Add Remove a token &Remove UserEdit Registered Users Remove Rename Who are you looking for? Days Weeks Months Years Inactive for Registered users: %n account(s) UserInformation User Information Connection Information Version OS Certificate IP Address CELT Versions Details... Ping Statistics Pings received Average ping TCP (Control) UDP (Voice) UDP Network statistics Good Late Lost Resync From Client To Client Connection time %1w %1d %1h %1m %1s , %1 (%2) %1.%2.%3 (%4) Supported Not Supported Not Reported %1 online (%2 idle) %1 online %1 kbit/s Bandwidth GroupBox Bandwidth Label Ping deviation UserListModel Nick Inactive days Last channel Last seen: %1 Never Channel ID: %1 UserLocalVolumeDialog Local volume for other users <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. Adjusting local volume for %1 dB <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: Talking to your channel. Shouting directly to your channel. Whispering directly to your channel. Whispering directly to you. Not talking. This is a channel on the server. The icon indicates the state of the channel: Your current channel. A channel that is linked with your channel. Linked channels can talk to each other. A channel on the server that you are not linked to. This shows the flags the user has on the server, if any: On your friend list Authenticated user Muted (manually muted by self) Muted (manually muted by admin) Muted (not allowed to speak in current channel) Muted (muted by you, only on your machine) Muted (push-to-mute) Deafened (by self) Deafened (by admin) User has a new comment set (click to show) User has a comment set, which you've already seen. (click to show) Ignoring Text Messages This shows the flags the channel has, if any: Channel has a new comment set (click to show) Channel has a comment set, which you've already seen. (click to show) Channel will be hidden when filtering is enabled Name Flags Are you sure you want to drag this user? Are you sure you want to drag this channel? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. VersionCheck Upgrade Mumble A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? Failed to launch snapshot installer. Corrupt download of new version detected. Automatically removed. Downloading new snapshot from %1 to %2 Failed to write new version to disk. Failed to write new version to disc. Mumble failed to retrieve version information from the central server. ViewCert Certificate Chain Details Certificate chain Certificate details Common Name Organization Subunit Country Locality State Valid from: %1 Valid to: %1 Serial: %1 Public Key: %1 bits %2 RSA DSA Digest (SHA-1): %1 Digest (SHA-256): %1 Email: %1 DNS: %1 Issued by: Unit Name VoiceRecorder Recorder failed to create directory '%1' Recorder failed to open file '%1' .wav - Uncompressed .ogg (Vorbis) - Compressed .au - Uncompressed .flac - Lossless compressed VoiceRecorderDialog Recorder Control 00:00:00 &Start S&top Mode Multichannel Output Output format Target directory Filename &Browse... Valid variables are: Inserts the user's name Inserts the current date Inserts the current time Inserts the hostname Recorder still running Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? Unable to start recording. Not connected to a server. The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. There is already a recorder active for this server. Please select a recording format. Stopping Select target directory Downmix WASAPIInput Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone. WASAPISystem Default Device qwPTTButtonWidget Mumble PTT Push to talk mumble-1.3.4/src/mumble/Database.cpp0000664000175000017500000005200014010707273017116 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "Database.h" #include "Global.h" #include "Message.h" #include "Net.h" #include "Version.h" static void logSQLError(const QSqlQuery &query) { const QSqlError error(query.lastQuery()); qWarning() << "SQL Query failed" << query.lastQuery(); qWarning() << error.number() << query.lastError().text(); } static bool execQueryAndLogFailure(QSqlQuery &query) { if(!query.exec()) { logSQLError(query); return false; } return true; } static bool execQueryAndLogFailure(QSqlQuery &query, const QString &queryString) { if(!query.exec(queryString)) { logSQLError(query); return false; } return true; } Database::Database(const QString &dbname) { db = QSqlDatabase::addDatabase(QLatin1String("QSQLITE"), dbname); QSettings qs; QStringList datapaths; int i; datapaths << g.qdBasePath.absolutePath(); #if QT_VERSION >= 0x050000 datapaths << QStandardPaths::writableLocation(QStandardPaths::DataLocation); #else datapaths << QDesktopServices::storageLocation(QDesktopServices::DataLocation); #endif #if defined(Q_OS_UNIX) && ! defined(Q_OS_MAC) datapaths << QDir::homePath() + QLatin1String("/.config/Mumble"); #endif datapaths << QDir::homePath(); datapaths << QDir::currentPath(); datapaths << qApp->applicationDirPath(); datapaths << qs.value(QLatin1String("InstPath")).toString(); bool found = false; for (i = 0; (i < datapaths.size()) && ! found; i++) { if (!datapaths[i].isEmpty()) { // Try the legacy path first, and use it if it exists. // If it doesn't, use the new, non-hidden version. QFile legacyDatabaseFile(datapaths[i] + QLatin1String("/.mumble.sqlite")); if (legacyDatabaseFile.exists()) { db.setDatabaseName(legacyDatabaseFile.fileName()); found = db.open(); } if (found) { break; } QFile databaseFile(datapaths[i] + QLatin1String("/mumble.sqlite")); if (databaseFile.exists()) { db.setDatabaseName(databaseFile.fileName()); found = db.open(); } } } if (! found) { for (i = 0; (i < datapaths.size()) && ! found; i++) { if (!datapaths[i].isEmpty()) { QDir::root().mkpath(datapaths[i]); QFile f(datapaths[i] + QLatin1String("/mumble.sqlite")); db.setDatabaseName(f.fileName()); found = db.open(); } } } if (! found) { QMessageBox::critical(NULL, QLatin1String("Mumble"), tr("Mumble failed to initialize a database in any\nof the possible locations."), QMessageBox::Ok | QMessageBox::Default, QMessageBox::NoButton); qFatal("Database: Failed initialization"); } QFileInfo fi(db.databaseName()); if (! fi.isWritable()) { QMessageBox::critical(NULL, QLatin1String("Mumble"), tr("The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem.").arg(Qt::escape(fi.filePath())), QMessageBox::Ok | QMessageBox::Default, QMessageBox::NoButton); qWarning("Database: Database is read-only"); } { QFile f(db.databaseName()); f.setPermissions(f.permissions() & ~(QFile::ReadGroup | QFile::WriteGroup | QFile::ExeGroup | QFile::ReadOther | QFile::WriteOther | QFile::ExeOther)); } QSqlQuery query(db); execQueryAndLogFailure(query, QLatin1String("CREATE TABLE IF NOT EXISTS `servers` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT, `hostname` TEXT, `port` INTEGER DEFAULT " MUMTEXT(DEFAULT_MUMBLE_PORT) ", `username` TEXT, `password` TEXT)")); query.exec(QLatin1String("ALTER TABLE `servers` ADD COLUMN `url` TEXT")); // Upgrade path, failing this query is not noteworthy execQueryAndLogFailure(query, QLatin1String("CREATE TABLE IF NOT EXISTS `comments` (`who` TEXT, `comment` BLOB, `seen` DATE)")); execQueryAndLogFailure(query, QLatin1String("CREATE UNIQUE INDEX IF NOT EXISTS `comments_comment` ON `comments`(`who`, `comment`)")); execQueryAndLogFailure(query, QLatin1String("CREATE INDEX IF NOT EXISTS `comments_seen` ON `comments`(`seen`)")); execQueryAndLogFailure(query, QLatin1String("CREATE TABLE IF NOT EXISTS `blobs` (`hash` TEXT, `data` BLOB, `seen` DATE)")); execQueryAndLogFailure(query, QLatin1String("CREATE UNIQUE INDEX IF NOT EXISTS `blobs_hash` ON `blobs`(`hash`)")); execQueryAndLogFailure(query, QLatin1String("CREATE INDEX IF NOT EXISTS `blobs_seen` ON `blobs`(`seen`)")); execQueryAndLogFailure(query, QLatin1String("CREATE TABLE IF NOT EXISTS `tokens` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `digest` BLOB, `token` TEXT)")); execQueryAndLogFailure(query, QLatin1String("CREATE INDEX IF NOT EXISTS `tokens_host_port` ON `tokens`(`digest`)")); execQueryAndLogFailure(query, QLatin1String("CREATE TABLE IF NOT EXISTS `shortcut` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `digest` BLOB, `shortcut` BLOB, `target` BLOB, `suppress` INTEGER)")); execQueryAndLogFailure(query, QLatin1String("CREATE INDEX IF NOT EXISTS `shortcut_host_port` ON `shortcut`(`digest`)")); execQueryAndLogFailure(query, QLatin1String("CREATE TABLE IF NOT EXISTS `udp` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `digest` BLOB)")); execQueryAndLogFailure(query, QLatin1String("CREATE UNIQUE INDEX IF NOT EXISTS `udp_host_port` ON `udp`(`digest`)")); execQueryAndLogFailure(query, QLatin1String("CREATE TABLE IF NOT EXISTS `cert` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `hostname` TEXT, `port` INTEGER, `digest` TEXT)")); execQueryAndLogFailure(query, QLatin1String("CREATE UNIQUE INDEX IF NOT EXISTS `cert_host_port` ON `cert`(`hostname`,`port`)")); execQueryAndLogFailure(query, QLatin1String("CREATE TABLE IF NOT EXISTS `friends` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT, `hash` TEXT)")); execQueryAndLogFailure(query, QLatin1String("CREATE UNIQUE INDEX IF NOT EXISTS `friends_name` ON `friends`(`name`)")); execQueryAndLogFailure(query, QLatin1String("CREATE UNIQUE INDEX IF NOT EXISTS `friends_hash` ON `friends`(`hash`)")); execQueryAndLogFailure(query, QLatin1String("CREATE TABLE IF NOT EXISTS `ignored` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `hash` TEXT)")); execQueryAndLogFailure(query, QLatin1String("CREATE UNIQUE INDEX IF NOT EXISTS `ignored_hash` ON `ignored`(`hash`)")); execQueryAndLogFailure(query, QLatin1String("CREATE TABLE IF NOT EXISTS `muted` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `hash` TEXT)")); execQueryAndLogFailure(query, QLatin1String("CREATE UNIQUE INDEX IF NOT EXISTS `muted_hash` ON `muted`(`hash`)")); execQueryAndLogFailure(query, QLatin1String("CREATE TABLE IF NOT EXISTS `volume` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `hash` TEXT, `volume` FLOAT)")); execQueryAndLogFailure(query, QLatin1String("CREATE UNIQUE INDEX IF NOT EXISTS `volume_hash` ON `volume`(`hash`)")); //Note: A previous snapshot version created a table called 'hidden' execQueryAndLogFailure(query, QLatin1String("CREATE TABLE IF NOT EXISTS `filtered_channels` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `server_cert_digest` TEXT NOT NULL, `channel_id` INTEGER NOT NULL)")); execQueryAndLogFailure(query, QLatin1String("CREATE UNIQUE INDEX IF NOT EXISTS `filtered_channels_entry` ON `filtered_channels`(`server_cert_digest`, `channel_id`)")); execQueryAndLogFailure(query, QLatin1String("CREATE TABLE IF NOT EXISTS `pingcache` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `hostname` TEXT, `port` INTEGER, `ping` INTEGER)")); execQueryAndLogFailure(query, QLatin1String("CREATE UNIQUE INDEX IF NOT EXISTS `pingcache_host_port` ON `pingcache`(`hostname`,`port`)")); execQueryAndLogFailure(query, QLatin1String("DELETE FROM `comments` WHERE `seen` < datetime('now', '-1 years')")); execQueryAndLogFailure(query, QLatin1String("DELETE FROM `blobs` WHERE `seen` < datetime('now', '-1 months')")); execQueryAndLogFailure(query, QLatin1String("VACUUM")); execQueryAndLogFailure(query, QLatin1String("PRAGMA synchronous = NORMAL")); #ifdef Q_OS_WIN // Windows can not handle TRUNCATE with multiple connections to the DB. Thus less performant DELETE. execQueryAndLogFailure(query, QLatin1String("PRAGMA journal_mode = DELETE")); #else execQueryAndLogFailure(query, QLatin1String("PRAGMA journal_mode = TRUNCATE")); #endif execQueryAndLogFailure(query, QLatin1String("SELECT sqlite_version()")); while (query.next()) qWarning() << "Database SQLite:" << query.value(0).toString(); } Database::~Database() { QSqlQuery query(db); execQueryAndLogFailure(query, QLatin1String("PRAGMA journal_mode = DELETE")); execQueryAndLogFailure(query, QLatin1String("VACUUM")); } QList Database::getFavorites() { QSqlQuery query(db); QList ql; query.prepare(QLatin1String("SELECT `name`, `hostname`, `port`, `username`, `password`, `url` FROM `servers` ORDER BY `name`")); execQueryAndLogFailure(query); while (query.next()) { FavoriteServer fs; fs.qsName = query.value(0).toString(); fs.qsHostname = query.value(1).toString(); fs.usPort = static_cast(query.value(2).toUInt()); fs.qsUsername = query.value(3).toString(); fs.qsPassword = query.value(4).toString(); fs.qsUrl = query.value(5).toString(); ql << fs; } return ql; } void Database::setFavorites(const QList &servers) { QSqlQuery query(db); QSqlDatabase::database().transaction(); query.prepare(QLatin1String("DELETE FROM `servers`")); execQueryAndLogFailure(query); query.prepare(QLatin1String("REPLACE INTO `servers` (`name`, `hostname`, `port`, `username`, `password`, `url`) VALUES (?,?,?,?,?,?)")); foreach(const FavoriteServer &s, servers) { query.addBindValue(s.qsName); query.addBindValue(s.qsHostname); query.addBindValue(s.usPort); query.addBindValue(s.qsUsername); query.addBindValue(s.qsPassword); query.addBindValue(s.qsUrl); execQueryAndLogFailure(query); } QSqlDatabase::database().commit(); } bool Database::isLocalIgnored(const QString &hash) { QSqlQuery query(db); query.prepare(QLatin1String("SELECT `hash` FROM `ignored` WHERE `hash` = ?")); query.addBindValue(hash); execQueryAndLogFailure(query); return query.next(); } void Database::setLocalIgnored(const QString &hash, bool ignored) { QSqlQuery query(db); if (ignored) query.prepare(QLatin1String("INSERT INTO `ignored` (`hash`) VALUES (?)")); else query.prepare(QLatin1String("DELETE FROM `ignored` WHERE `hash` = ?")); query.addBindValue(hash); execQueryAndLogFailure(query); } bool Database::isLocalMuted(const QString &hash) { QSqlQuery query(db); query.prepare(QLatin1String("SELECT `hash` FROM `muted` WHERE `hash` = ?")); query.addBindValue(hash); execQueryAndLogFailure(query); return query.next(); } void Database::setUserLocalVolume(const QString &hash, float volume) { QSqlQuery query(db); query.prepare(QLatin1String("INSERT OR REPLACE INTO `volume` (`hash`, `volume`) VALUES (?,?)")); query.addBindValue(hash); query.addBindValue(QString::number(volume)); execQueryAndLogFailure(query); } float Database::getUserLocalVolume(const QString &hash) { QSqlQuery query(db); query.prepare(QLatin1String("SELECT `volume` FROM `volume` WHERE `hash` = ?")); query.addBindValue(hash); execQueryAndLogFailure(query); if (query.first()) { return query.value(0).toString().toFloat(); } return 1.0f; } void Database::setLocalMuted(const QString &hash, bool muted) { QSqlQuery query(db); if (muted) query.prepare(QLatin1String("INSERT INTO `muted` (`hash`) VALUES (?)")); else query.prepare(QLatin1String("DELETE FROM `muted` WHERE `hash` = ?")); query.addBindValue(hash); execQueryAndLogFailure(query); } bool Database::isChannelFiltered(const QByteArray &server_cert_digest, const int channel_id) { QSqlQuery query(db); query.prepare(QLatin1String("SELECT `channel_id` FROM `filtered_channels` WHERE `server_cert_digest` = ? AND `channel_id` = ?")); query.addBindValue(server_cert_digest); query.addBindValue(channel_id); execQueryAndLogFailure(query); return query.next(); } void Database::setChannelFiltered(const QByteArray &server_cert_digest, const int channel_id, const bool hidden) { QSqlQuery query(db); if (hidden) query.prepare(QLatin1String("INSERT INTO `filtered_channels` (`server_cert_digest`, `channel_id`) VALUES (?, ?)")); else query.prepare(QLatin1String("DELETE FROM `filtered_channels` WHERE `server_cert_digest` = ? AND `channel_id` = ?")); query.addBindValue(server_cert_digest); query.addBindValue(channel_id); execQueryAndLogFailure(query); } QMap Database::getPingCache() { QSqlQuery query(db); QMap map; query.prepare(QLatin1String("SELECT `hostname`, `port`, `ping` FROM `pingcache`")); execQueryAndLogFailure(query); while (query.next()) { map.insert(UnresolvedServerAddress(query.value(0).toString(), static_cast(query.value(1).toUInt())), query.value(2).toUInt()); } return map; } void Database::setPingCache(const QMap &map) { QSqlQuery query(db); QMap::const_iterator i; QSqlDatabase::database().transaction(); query.prepare(QLatin1String("DELETE FROM `pingcache`")); execQueryAndLogFailure(query); query.prepare(QLatin1String("REPLACE INTO `pingcache` (`hostname`, `port`, `ping`) VALUES (?,?,?)")); for (i = map.constBegin(); i != map.constEnd(); ++i) { query.addBindValue(i.key().hostname); query.addBindValue(i.key().port); query.addBindValue(i.value()); execQueryAndLogFailure(query); } QSqlDatabase::database().commit(); } bool Database::seenComment(const QString &hash, const QByteArray &commenthash) { QSqlQuery query(db); query.prepare(QLatin1String("SELECT COUNT(*) FROM `comments` WHERE `who` = ? AND `comment` = ?")); query.addBindValue(hash); query.addBindValue(commenthash); execQueryAndLogFailure(query); if (query.next()) { if (query.value(0).toInt() > 0) { query.prepare(QLatin1String("UPDATE `comments` SET `seen` = datetime('now') WHERE `who` = ? AND `comment` = ?")); query.addBindValue(hash); query.addBindValue(commenthash); execQueryAndLogFailure(query); return true; } } return false; } void Database::setSeenComment(const QString &hash, const QByteArray &commenthash) { QSqlQuery query(db); query.prepare(QLatin1String("REPLACE INTO `comments` (`who`, `comment`, `seen`) VALUES (?, ?, datetime('now'))")); query.addBindValue(hash); query.addBindValue(commenthash); execQueryAndLogFailure(query); } QByteArray Database::blob(const QByteArray &hash) { QSqlQuery query(db); query.prepare(QLatin1String("SELECT `data` FROM `blobs` WHERE `hash` = ?")); query.addBindValue(hash); execQueryAndLogFailure(query); if (query.next()) { QByteArray qba = query.value(0).toByteArray(); query.prepare(QLatin1String("UPDATE `blobs` SET `seen` = datetime('now') WHERE `hash` = ?")); query.addBindValue(hash); execQueryAndLogFailure(query); return qba; } return QByteArray(); } void Database::setBlob(const QByteArray &hash, const QByteArray &data) { if (hash.isEmpty() || data.isEmpty()) return; QSqlQuery query(db); query.prepare(QLatin1String("REPLACE INTO `blobs` (`hash`, `data`, `seen`) VALUES (?, ?, datetime('now'))")); query.addBindValue(hash); query.addBindValue(data); execQueryAndLogFailure(query); } QStringList Database::getTokens(const QByteArray &digest) { QList qsl; QSqlQuery query(db); query.prepare(QLatin1String("SELECT `token` FROM `tokens` WHERE `digest` = ?")); query.addBindValue(digest); execQueryAndLogFailure(query); while (query.next()) { qsl << query.value(0).toString(); } return qsl; } void Database::setTokens(const QByteArray &digest, QStringList &tokens) { QSqlQuery query(db); query.prepare(QLatin1String("DELETE FROM `tokens` WHERE `digest` = ?")); query.addBindValue(digest); execQueryAndLogFailure(query); query.prepare(QLatin1String("INSERT INTO `tokens` (`digest`, `token`) VALUES (?,?)")); foreach(const QString &qs, tokens) { query.addBindValue(digest); query.addBindValue(qs); execQueryAndLogFailure(query); } } QList Database::getShortcuts(const QByteArray &digest) { QList ql; QSqlQuery query(db); query.prepare(QLatin1String("SELECT `shortcut`,`target`,`suppress` FROM `shortcut` WHERE `digest` = ?")); query.addBindValue(digest); execQueryAndLogFailure(query); while (query.next()) { Shortcut sc; QByteArray a = query.value(0).toByteArray(); { QDataStream s(&a, QIODevice::ReadOnly); s.setVersion(QDataStream::Qt_4_0); s >> sc.qlButtons; } a = query.value(1).toByteArray(); { QDataStream s(&a, QIODevice::ReadOnly); s.setVersion(QDataStream::Qt_4_0); s >> sc.qvData; } sc.bSuppress=query.value(2).toBool(); ql << sc; } return ql; } bool Database::setShortcuts(const QByteArray &digest, QList &shortcuts) { QSqlQuery query(db); bool updated = false; query.prepare(QLatin1String("DELETE FROM `shortcut` WHERE `digest` = ?")); query.addBindValue(digest); execQueryAndLogFailure(query); const QList scs = shortcuts; query.prepare(QLatin1String("INSERT INTO `shortcut` (`digest`, `shortcut`, `target`, `suppress`) VALUES (?,?,?,?)")); foreach(const Shortcut &sc, scs) { if (sc.isServerSpecific()) { shortcuts.removeAll(sc); updated = true; query.addBindValue(digest); QByteArray a; { QDataStream s(&a, QIODevice::WriteOnly); s.setVersion(QDataStream::Qt_4_0); s << sc.qlButtons; } query.addBindValue(a); a.clear(); { QDataStream s(&a, QIODevice::WriteOnly); s.setVersion(QDataStream::Qt_4_0); s << sc.qvData; } query.addBindValue(a); query.addBindValue(sc.bSuppress); execQueryAndLogFailure(query); } } return updated; } const QMap Database::getFriends() { QMap qm; QSqlQuery query(db); query.prepare(QLatin1String("SELECT `name`, `hash` FROM `friends`")); execQueryAndLogFailure(query); while (query.next()) qm.insert(query.value(0).toString(), query.value(1).toString()); return qm; } const QString Database::getFriend(const QString &hash) { QSqlQuery query(db); query.prepare(QLatin1String("SELECT `name` FROM `friends` WHERE `hash` = ?")); query.addBindValue(hash); execQueryAndLogFailure(query); if (query.next()) return query.value(0).toString(); return QString(); } void Database::addFriend(const QString &name, const QString &hash) { QSqlQuery query(db); query.prepare(QLatin1String("REPLACE INTO `friends` (`name`, `hash`) VALUES (?,?)")); query.addBindValue(name); query.addBindValue(hash); execQueryAndLogFailure(query); } void Database::removeFriend(const QString &hash) { QSqlQuery query(db); query.prepare(QLatin1String("DELETE FROM `friends` WHERE `hash` = ?")); query.addBindValue(hash); execQueryAndLogFailure(query); } const QString Database::getDigest(const QString &hostname, unsigned short port) { QSqlQuery query(db); query.prepare(QLatin1String("SELECT `digest` FROM `cert` WHERE `hostname` = ? AND `port` = ?")); query.addBindValue(hostname); query.addBindValue(port); execQueryAndLogFailure(query); if (query.next()) { return query.value(0).toString(); } return QString(); } void Database::setDigest(const QString &hostname, unsigned short port, const QString &digest) { QSqlQuery query(db); query.prepare(QLatin1String("REPLACE INTO `cert` (`hostname`,`port`,`digest`) VALUES (?,?,?)")); query.addBindValue(hostname); query.addBindValue(port); query.addBindValue(digest); execQueryAndLogFailure(query); } void Database::setPassword(const QString &hostname, unsigned short port, const QString &uname, const QString &pw) { QSqlQuery query(db); query.prepare(QLatin1String("UPDATE `servers` SET `password` = ? WHERE `hostname` = ? AND `port` = ? AND `username` = ?")); query.addBindValue(pw); query.addBindValue(hostname); query.addBindValue(port); query.addBindValue(uname); execQueryAndLogFailure(query); } bool Database::getUdp(const QByteArray &digest) { QSqlQuery query(db); query.prepare(QLatin1String("SELECT COUNT(*) FROM `udp` WHERE `digest` = ? ")); query.addBindValue(digest); execQueryAndLogFailure(query); if (query.next()) { return (query.value(0).toInt() == 0); } return true; } void Database::setUdp(const QByteArray &digest, bool udp) { QSqlQuery query(db); if (! udp) query.prepare(QLatin1String("REPLACE INTO `udp` (`digest`) VALUES (?)")); else query.prepare(QLatin1String("DELETE FROM `udp` WHERE `digest` = ?")); query.addBindValue(digest); execQueryAndLogFailure(query); } bool Database::fuzzyMatch(QString &name, QString &user, QString &pw, QString &hostname, unsigned short port) { QSqlQuery query(db); if (! user.isEmpty()) { query.prepare(QLatin1String("SELECT `username`, `password`, `hostname`, `name` FROM `servers` WHERE `username` LIKE ? AND `hostname` LIKE ? AND `port`=?")); query.addBindValue(user); } else { query.prepare(QLatin1String("SELECT `username`, `password`, `hostname`, `name` FROM `servers` WHERE `hostname` LIKE ? AND `port`=?")); } query.addBindValue(hostname); query.addBindValue(port); execQueryAndLogFailure(query); if (query.next()) { user = query.value(0).toString(); if (pw.isEmpty()) pw = query.value(1).toString(); hostname = query.value(2).toString(); if (name.isEmpty()) name = query.value(3).toString(); return true; } else { return false; } } mumble-1.3.4/src/mumble/OverlayEditorScene.cpp0000664000175000017500000005462214010707273021174 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "OverlayEditorScene.h" #include "OverlayClient.h" #include "OverlayUser.h" #include "OverlayText.h" #include "User.h" #include "Channel.h" #include "Message.h" #include "Database.h" #include "NetworkConfig.h" #include "ServerHandler.h" #include "MainWindow.h" #include "GlobalShortcut.h" // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" OverlayEditorScene::OverlayEditorScene(const OverlaySettings &srcos, QObject *p) : QGraphicsScene(p), os(srcos) { tsColor = Settings::Talking; uiZoom = 2; if (g.ocIntercept) uiSize = g.ocIntercept->uiHeight; else uiSize = 1080.f; qgiGroup = new OverlayGroup(); qgiGroup->setAcceptHoverEvents(true); qgiGroup->setPos(0.0f, 0.0f); addItem(qgiGroup); qgpiMuted = new QGraphicsPixmapItem(qgiGroup); qgpiMuted->hide(); qgpiAvatar = new QGraphicsPixmapItem(qgiGroup); qgpiAvatar->hide(); qgpiName = new QGraphicsPixmapItem(qgiGroup); qgpiName->hide(); qgpiChannel = new QGraphicsPixmapItem(qgiGroup); qgpiChannel->hide(); qgpiBox = new QGraphicsPathItem(qgiGroup); qgpiBox->hide(); qgpiSelected = NULL; qgriSelected = new QGraphicsRectItem; qgriSelected->hide(); qgriSelected->setFlag(QGraphicsItem::ItemIgnoresParentOpacity, true); qgriSelected->setOpacity(1.0f); qgriSelected->setBrush(Qt::NoBrush); qgriSelected->setPen(QPen(Qt::black, 4.0f)); qgriSelected->setZValue(5.0f); addItem(qgriSelected); qgpiChannel->setZValue(2.0f); qgpiName->setZValue(1.0f); qgpiMuted->setZValue(3.0f); qgpiBox->setZValue(-1.0f); resync(); } #define SCALESIZE(var) iroundf(uiSize * uiZoom * os.qrf##var .width() + 0.5f), iroundf(uiSize * uiZoom * os.qrf##var .height() + 0.5f) void OverlayEditorScene::updateMuted() { QImageReader qir(QLatin1String("skin:muted_self.svg")); QSize sz = qir.size(); sz.scale(SCALESIZE(MutedDeafened), Qt::KeepAspectRatio); qir.setScaledSize(sz); qgpiMuted->setPixmap(QPixmap::fromImage(qir.read())); moveMuted(); } void OverlayEditorScene::moveMuted() { qgpiMuted->setVisible(os.bMutedDeafened); qgpiMuted->setPos(OverlayUser::alignedPosition(OverlayUser::scaledRect(os.qrfMutedDeafened, uiSize * uiZoom), qgpiMuted->boundingRect(), os.qaMutedDeafened)); qgpiMuted->setOpacity(os.fMutedDeafened); } void OverlayEditorScene::updateUserName() { QString qsName; switch (tsColor) { case Settings::Passive: qsName = Overlay::tr("Silent"); break; case Settings::Talking: qsName = Overlay::tr("Talking"); break; case Settings::Whispering: qsName = Overlay::tr("Whisper"); break; case Settings::Shouting: qsName = Overlay::tr("Shout"); break; } const QPixmap &pm = OverlayTextLine(qsName, os.qfUserName).createPixmap(SCALESIZE(UserName), os.qcUserName[tsColor]); qgpiName->setPixmap(pm); moveUserName(); } void OverlayEditorScene::moveUserName() { qgpiName->setVisible(os.bUserName); qgpiName->setPos(OverlayUser::alignedPosition(OverlayUser::scaledRect(os.qrfUserName, uiSize * uiZoom), qgpiName->boundingRect(), os.qaUserName)); qgpiName->setOpacity(os.fUserName); } void OverlayEditorScene::updateChannel() { const QPixmap &pm = OverlayTextLine(Overlay::tr("Channel"), os.qfChannel).createPixmap(SCALESIZE(Channel), os.qcChannel); qgpiChannel->setPixmap(pm); moveChannel(); } void OverlayEditorScene::moveChannel() { qgpiChannel->setVisible(os.bChannel); qgpiChannel->setPos(OverlayUser::alignedPosition(OverlayUser::scaledRect(os.qrfChannel, uiSize * uiZoom), qgpiChannel->boundingRect(), os.qaChannel)); qgpiChannel->setOpacity(os.fChannel); } void OverlayEditorScene::updateAvatar() { QImage img; QImageReader qir(QLatin1String("skin:default_avatar.svg")); QSize sz = qir.size(); sz.scale(SCALESIZE(Avatar), Qt::KeepAspectRatio); qir.setScaledSize(sz); img = qir.read(); qgpiAvatar->setPixmap(QPixmap::fromImage(img)); moveAvatar(); } void OverlayEditorScene::moveAvatar() { qgpiAvatar->setVisible(os.bAvatar); qgpiAvatar->setPos(OverlayUser::alignedPosition(OverlayUser::scaledRect(os.qrfAvatar, uiSize * uiZoom), qgpiAvatar->boundingRect(), os.qaAvatar)); qgpiAvatar->setOpacity(os.fAvatar); } void OverlayEditorScene::moveBox() { QRectF childrenBounds = os.qrfAvatar | os.qrfChannel | os.qrfMutedDeafened | os.qrfUserName; bool haspen = (os.qcBoxPen != os.qcBoxFill) && (! qFuzzyCompare(os.qcBoxPen.alphaF(), static_cast(0.0f))); qreal pw = haspen ? qMax(1.0f, os.fBoxPenWidth * uiSize * uiZoom) : 0.0f; qreal pad = os.fBoxPad * uiSize * uiZoom; QPainterPath pp; pp.addRoundedRect(childrenBounds.x() * uiSize * uiZoom + -pw / 2.0f - pad, childrenBounds.y() * uiSize * uiZoom + -pw / 2.0f - pad, childrenBounds.width() * uiSize * uiZoom + pw + 2.0f * pad, childrenBounds.height() * uiSize * uiZoom + pw + 2.0f * pad, 2.0f * pw, 2.0f * pw); qgpiBox->setPath(pp); qgpiBox->setPos(0.0f, 0.0f); qgpiBox->setPen(haspen ? QPen(os.qcBoxPen, pw) : Qt::NoPen); qgpiBox->setBrush(qFuzzyCompare(os.qcBoxFill.alphaF(), static_cast(0.0f)) ? Qt::NoBrush : os.qcBoxFill); qgpiBox->setOpacity(1.0f); qgpiBox->setVisible(os.bBox); } void OverlayEditorScene::updateSelected() { if (qgpiSelected == qgpiAvatar) updateAvatar(); else if (qgpiSelected == qgpiName) updateUserName(); else if (qgpiSelected == qgpiMuted) updateMuted(); } void OverlayEditorScene::resync() { QRadialGradient gradient(0, 0, 10 * uiZoom); gradient.setSpread(QGradient::ReflectSpread); gradient.setColorAt(0.0f, QColor(255, 255, 255, 64)); gradient.setColorAt(0.2f, QColor(0, 0, 0, 64)); gradient.setColorAt(0.4f, QColor(255, 128, 0, 64)); gradient.setColorAt(0.6f, QColor(0, 0, 0, 64)); gradient.setColorAt(0.8f, QColor(0, 128, 255, 64)); gradient.setColorAt(1.0f, QColor(0, 0, 0, 64)); setBackgroundBrush(gradient); updateMuted(); updateUserName(); updateChannel(); updateAvatar(); moveMuted(); moveUserName(); moveChannel(); moveAvatar(); moveBox(); qgiGroup->setOpacity(os.fUser[tsColor]); qgpiSelected = NULL; qgriSelected->setVisible(false); } void OverlayEditorScene::drawBackground(QPainter *p, const QRectF &rect) { p->setBrushOrigin(0, 0); p->fillRect(rect, backgroundBrush()); QRectF upscaled = OverlayUser::scaledRect(rect, 128.f / static_cast(uiSize * uiZoom)); { int min = iroundf(upscaled.left()); int max = iroundf(ceil(upscaled.right())); for (int i=min;i<=max;++i) { qreal v = (i / 128) * static_cast(uiSize * uiZoom); if (i != 0) p->setPen(QPen(QColor(128, 128, 128, 255), 0.0f)); else p->setPen(QPen(QColor(0, 0, 0, 255), 2.0f)); p->drawLine(QPointF(v, rect.top()), QPointF(v, rect.bottom())); } } { int min = iroundf(upscaled.top()); int max = iroundf(ceil(upscaled.bottom())); for (int i=min;i<=max;++i) { qreal v = (i / 128) * static_cast(uiSize * uiZoom); if (i != 0) p->setPen(QPen(QColor(128, 128, 128, 255), 0.0f)); else p->setPen(QPen(QColor(0, 0, 0, 255), 2.0f)); p->drawLine(QPointF(rect.left(), v), QPointF(rect.right(), v)); } } } QGraphicsPixmapItem *OverlayEditorScene::childAt(const QPointF &pos) { QGraphicsItem *item = NULL; if (qgriSelected->isVisible()) { if (qgriSelected->rect().contains(pos)) { return qgpiSelected; } } foreach(QGraphicsItem *qgi, items(Qt::AscendingOrder)) { if (!qgi->isVisible() || ! qgraphicsitem_cast(qgi)) continue; QPointF qp = pos - qgi->pos(); if (qgi->contains(qp)) { item = qgi; } } return static_cast(item); } QRectF OverlayEditorScene::selectedRect() const { const QRectF *qrf = NULL; if (qgpiSelected == qgpiMuted) qrf = & os.qrfMutedDeafened; else if (qgpiSelected == qgpiAvatar) qrf = & os.qrfAvatar; else if (qgpiSelected == qgpiChannel) qrf = & os.qrfChannel; else if (qgpiSelected == qgpiName) qrf = & os.qrfUserName; if (! qrf) return QRectF(); return OverlayUser::scaledRect(*qrf, uiSize * uiZoom).toAlignedRect(); } void OverlayEditorScene::mousePressEvent(QGraphicsSceneMouseEvent *e) { QGraphicsScene::mousePressEvent(e); if (e->isAccepted()) return; if (e->button() == Qt::LeftButton) { e->accept(); if (wfsHover == Qt::NoSection) { qgpiSelected = childAt(e->scenePos()); if (qgpiSelected) { qgriSelected->setRect(selectedRect()); qgriSelected->show(); } else { qgriSelected->hide(); } } updateCursorShape(e->scenePos()); } } void OverlayEditorScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) { QGraphicsScene::mouseReleaseEvent(e); if (e->isAccepted()) return; if (e->button() == Qt::LeftButton) { e->accept(); QRectF rect = qgriSelected->rect(); if (! qgpiSelected || (rect == selectedRect())) { return; } QRectF scaled(rect.x() / (uiSize * uiZoom), rect.y() / (uiSize * uiZoom), rect.width() / (uiSize * uiZoom), rect.height() / (uiSize * uiZoom)); if (qgpiSelected == qgpiMuted) { os.qrfMutedDeafened = scaled; updateMuted(); } else if (qgpiSelected == qgpiAvatar) { os.qrfAvatar = scaled; updateAvatar(); } else if (qgpiSelected == qgpiChannel) { os.qrfChannel = scaled; updateChannel(); } else if (qgpiSelected == qgpiName) { os.qrfUserName = scaled; updateUserName(); } moveBox(); } } void OverlayEditorScene::mouseMoveEvent(QGraphicsSceneMouseEvent *e) { QGraphicsScene::mouseMoveEvent(e); if (e->isAccepted()) return; if (qgpiSelected && (e->buttons() & Qt::LeftButton)) { e->accept(); if (wfsHover == Qt::NoSection) return; QPointF delta = e->scenePos() - e->buttonDownScenePos(Qt::LeftButton); bool square = e->modifiers() & Qt::ShiftModifier; QRectF orig = selectedRect(); switch (wfsHover) { case Qt::TitleBarArea: orig.translate(delta); break; case Qt::TopSection: orig.setTop(orig.top() + delta.y()); if (orig.height() < 8.0f) orig.setTop(orig.bottom() - 8.0f); if (square) orig.setRight(orig.left() + orig.height()); break; case Qt::BottomSection: orig.setBottom(orig.bottom() + delta.y()); if (orig.height() < 8.0f) orig.setBottom(orig.top() + 8.0f); if (square) orig.setRight(orig.left() + orig.height()); break; case Qt::LeftSection: orig.setLeft(orig.left() + delta.x()); if (orig.width() < 8.0f) orig.setLeft(orig.right() - 8.0f); if (square) orig.setBottom(orig.top() + orig.width()); break; case Qt::RightSection: orig.setRight(orig.right() + delta.x()); if (orig.width() < 8.0f) orig.setRight(orig.left() + 8.0f); if (square) orig.setBottom(orig.top() + orig.width()); break; case Qt::TopLeftSection: orig.setTopLeft(orig.topLeft() + delta); if (orig.height() < 8.0f) orig.setTop(orig.bottom() - 8.0f); if (orig.width() < 8.0f) orig.setLeft(orig.right() - 8.0f); if (square) { qreal size = qMin(orig.width(), orig.height()); QPointF sz(-size, -size); orig.setTopLeft(orig.bottomRight() + sz); } break; case Qt::TopRightSection: orig.setTopRight(orig.topRight() + delta); if (orig.height() < 8.0f) orig.setTop(orig.bottom() - 8.0f); if (orig.width() < 8.0f) orig.setRight(orig.left() + 8.0f); if (square) { qreal size = qMin(orig.width(), orig.height()); QPointF sz(size, -size); orig.setTopRight(orig.bottomLeft() + sz); } break; case Qt::BottomLeftSection: orig.setBottomLeft(orig.bottomLeft() + delta); if (orig.height() < 8.0f) orig.setBottom(orig.top() + 8.0f); if (orig.width() < 8.0f) orig.setLeft(orig.right() - 8.0f); if (square) { qreal size = qMin(orig.width(), orig.height()); QPointF sz(-size, size); orig.setBottomLeft(orig.topRight() + sz); } break; case Qt::BottomRightSection: orig.setBottomRight(orig.bottomRight() + delta); if (orig.height() < 8.0f) orig.setBottom(orig.top() + 8.0f); if (orig.width() < 8.0f) orig.setRight(orig.left() + 8.0f); if (square) { qreal size = qMin(orig.width(), orig.height()); QPointF sz(size, size); orig.setBottomRight(orig.topLeft() + sz); } break; case Qt::NoSection: // Handled above, but this makes the compiler happy. return; } qgriSelected->setRect(orig); } else { updateCursorShape(e->scenePos()); } } void OverlayEditorScene::updateCursorShape(const QPointF &point) { Qt::CursorShape cs; if (qgriSelected->isVisible()) { wfsHover = rectSection(qgriSelected->rect(), point); } else { wfsHover = Qt::NoSection; } switch (wfsHover) { case Qt::TopLeftSection: case Qt::BottomRightSection: cs = Qt::SizeFDiagCursor; break; case Qt::TopRightSection: case Qt::BottomLeftSection: cs = Qt::SizeBDiagCursor; break; case Qt::TopSection: case Qt::BottomSection: cs = Qt::SizeVerCursor; break; case Qt::LeftSection: case Qt::RightSection: cs = Qt::SizeHorCursor; break; case Qt::TitleBarArea: cs = Qt::OpenHandCursor; break; default: cs = Qt::ArrowCursor; break; } foreach(QGraphicsView *v, views()) { if (v->viewport()->cursor().shape() != cs) { v->viewport()->setCursor(cs); // But an embedded, injected GraphicsView doesn't propagage mouse cursors... QWidget *p = v->parentWidget(); if (p) { QGraphicsProxyWidget *qgpw = p->graphicsProxyWidget(); if (qgpw) { qgpw->setCursor(cs); if (g.ocIntercept) g.ocIntercept->updateMouse(); } } } } } void OverlayEditorScene::contextMenuEvent(QGraphicsSceneContextMenuEvent *e) { QGraphicsScene::contextMenuEvent(e); if (e->isAccepted()) return; if (! e->widget()) return; QGraphicsPixmapItem *item = childAt(e->scenePos()); QMenu qm(e->widget()); QMenu *qmLayout = qm.addMenu(tr("Layout preset")); QAction *qaLayoutLargeAvatar = qmLayout->addAction(tr("Large square avatar")); QAction *qaLayoutText = qmLayout->addAction(tr("Avatar and Name")); QMenu *qmTrans = qm.addMenu(tr("User Opacity")); QActionGroup *qagUser = new QActionGroup(&qm); QAction *userOpacity[8]; for (int i=0;i<8;++i) { qreal o = (i + 1) / 8.0; userOpacity[i] = new QAction(tr("%1%").arg(o * 100.0f, 0, 'f', 1), qagUser); userOpacity[i]->setCheckable(true); userOpacity[i]->setData(o); if (qFuzzyCompare(qgiGroup->opacity(), o)) userOpacity[i]->setChecked(true); qmTrans->addAction(userOpacity[i]); } QAction *color = NULL; QAction *fontAction = NULL; QAction *objectOpacity[8]; for (int i=0;i<8;++i) objectOpacity[i] = NULL; QAction *boxpen[4] = { NULL, NULL, NULL, NULL}; QAction *boxpad[4] = { NULL, NULL, NULL, NULL}; QAction *boxpencolor = NULL; QAction *boxfillcolor = NULL; QAction *align[6]; for (int i=0;i<6;++i) align[i] = NULL; if (item) { qm.addSeparator(); QMenu *qmObjTrans = qm.addMenu(tr("Object Opacity")); QActionGroup *qagObject = new QActionGroup(&qm); for (int i=0;i<8;++i) { qreal o = (i + 1) / 8.0; objectOpacity[i] = new QAction(tr("%1%").arg(o * 100.0f, 0, 'f', 1), qagObject); objectOpacity[i]->setCheckable(true); objectOpacity[i]->setData(o); if (qFuzzyCompare(item->opacity(), o)) objectOpacity[i]->setChecked(true); qmObjTrans->addAction(objectOpacity[i]); } QMenu *qmObjAlign = qm.addMenu(tr("Alignment")); Qt::Alignment a; if (item == qgpiAvatar) a = os.qaAvatar; else if (item == qgpiChannel) a = os.qaChannel; else if (item == qgpiMuted) a = os.qaMutedDeafened; else a = os.qaUserName; align[0] = qmObjAlign->addAction(tr("Left")); align[0]->setCheckable(true); align[0]->setData(Qt::AlignLeft); if (a & Qt::AlignLeft) align[0]->setChecked(true); align[1] = qmObjAlign->addAction(tr("Center")); align[1]->setCheckable(true); align[1]->setData(Qt::AlignHCenter); if (a & Qt::AlignHCenter) align[1]->setChecked(true); align[2] = qmObjAlign->addAction(tr("Right")); align[2]->setCheckable(true); align[2]->setData(Qt::AlignRight); if (a & Qt::AlignRight) align[2]->setChecked(true); qmObjAlign->addSeparator(); align[3] = qmObjAlign->addAction(tr("Top")); align[3]->setCheckable(true); align[3]->setData(Qt::AlignTop); if (a & Qt::AlignTop) align[3]->setChecked(true); align[4] = qmObjAlign->addAction(tr("Center")); align[4]->setCheckable(true); align[4]->setData(Qt::AlignVCenter); if (a & Qt::AlignVCenter) align[4]->setChecked(true); align[5] = qmObjAlign->addAction(tr("Bottom")); align[5]->setCheckable(true); align[5]->setData(Qt::AlignBottom); if (a & Qt::AlignBottom) align[5]->setChecked(true); if ((item != qgpiAvatar) && (item != qgpiMuted)) { color = qm.addAction(tr("Color...")); fontAction = qm.addAction(tr("Font...")); } } if (qgpiBox->isVisible()) { qm.addSeparator(); QMenu *qmBox = qm.addMenu(tr("Bounding box")); QMenu *qmPen = qmBox->addMenu(tr("Pen width")); QMenu *qmPad = qmBox->addMenu(tr("Padding")); boxpencolor = qmBox->addAction(tr("Pen color")); boxfillcolor = qmBox->addAction(tr("Fill color")); QActionGroup *qagPen = new QActionGroup(qmPen); QActionGroup *qagPad = new QActionGroup(qmPad); for (int i=0;i<4;++i) { qreal v = (i) ? powf(2.0f, static_cast(-10 + i)) : 0.0f; boxpen[i] = new QAction(QString::number(i), qagPen); boxpen[i]->setData(v); boxpen[i]->setCheckable(true); if (qFuzzyCompare(os.fBoxPenWidth, v)) boxpen[i]->setChecked(true); qmPen->addAction(boxpen[i]); boxpad[i] = new QAction(QString::number(i), qagPad); boxpad[i]->setData(v); boxpad[i]->setCheckable(true); if (qFuzzyCompare(os.fBoxPad, v)) boxpad[i]->setChecked(true); qmPad->addAction(boxpad[i]); } } QAction *act = qm.exec(e->screenPos()); if (! act) return; for (int i=0;i<8;++i) { if (userOpacity[i] == act) { float o = static_cast(act->data().toReal()); os.fUser[tsColor] = o; qgiGroup->setOpacity(o); } } for (int i=0;i<8;++i) { if (objectOpacity[i] == act) { qreal o = act->data().toReal(); if (item == qgpiMuted) os.fMutedDeafened = o; else if (item == qgpiAvatar) os.fAvatar = o; else if (item == qgpiChannel) os.fChannel = o; else if (item == qgpiName) os.fUserName = o; item->setOpacity(o); } } for (int i=0;i<4;++i) { if (boxpen[i] == act) { os.fBoxPenWidth = act->data().toReal(); moveBox(); } else if (boxpad[i] == act) { os.fBoxPad = act->data().toReal(); moveBox(); } } for (int i=0;i<6;++i) { if (align[i] == act) { Qt::Alignment *aptr; if (item == qgpiAvatar) aptr = & os.qaAvatar; else if (item == qgpiChannel) aptr = & os.qaChannel; else if (item == qgpiMuted) aptr = & os.qaMutedDeafened; else aptr = & os.qaUserName; Qt::Alignment a = static_cast(act->data().toInt()); if (a & Qt::AlignHorizontal_Mask) { *aptr = (*aptr & ~Qt::AlignHorizontal_Mask) | a; } else { *aptr = (*aptr & ~Qt::AlignVertical_Mask) | a; } updateSelected(); } } if (act == boxpencolor) { QColor qc = QColorDialog::getColor(os.qcBoxPen, e->widget(), tr("Pick pen color"), QColorDialog::DontUseNativeDialog | QColorDialog::ShowAlphaChannel); if (! qc.isValid()) return; os.qcBoxPen = qc; moveBox(); } else if (act == boxfillcolor) { QColor qc = QColorDialog::getColor(os.qcBoxFill, e->widget(), tr("Pick fill color"), QColorDialog::DontUseNativeDialog | QColorDialog::ShowAlphaChannel); if (! qc.isValid()) return; os.qcBoxFill = qc; moveBox(); } else if (act == color) { QColor *col = NULL; if (item == qgpiChannel) col = & os.qcChannel; else if (item == qgpiName) col = & os.qcUserName[tsColor]; if (! col) return; QColor qc = QColorDialog::getColor(*col, e->widget(), tr("Pick color"), QColorDialog::DontUseNativeDialog); if (! qc.isValid()) return; qc.setAlpha(255); if (qc == *col) return; *col = qc; updateSelected(); } else if (act == fontAction) { QFont *fontptr = (item == qgpiChannel) ? &os.qfChannel : &os.qfUserName; qgpiSelected = NULL; qgriSelected->hide(); // QFontDialog doesn't really like graphics view. At all. QFontDialog qfd; qfd.setOptions(QFontDialog::DontUseNativeDialog); qfd.setCurrentFont(*fontptr); qfd.setWindowTitle(tr("Pick font")); int ret; if (g.ocIntercept) { QGraphicsProxyWidget *qgpw = new QGraphicsProxyWidget(NULL, Qt::Window); qgpw->setWidget(&qfd); addItem(qgpw); qgpw->setZValue(3.0f); qgpw->setPanelModality(QGraphicsItem::PanelModal); qgpw->setPos(- qgpw->boundingRect().width() / 2.0f, - qgpw->boundingRect().height() / 2.0f); qgpw->show(); ret = qfd.exec(); qgpw->hide(); qgpw->setWidget(NULL); delete qgpw; } else { Qt::WindowFlags wf = g.mw->windowFlags(); if (wf.testFlag(Qt::WindowStaysOnTopHint)) qfd.setWindowFlags(qfd.windowFlags() | Qt::WindowStaysOnTopHint); ret = qfd.exec(); } if (! ret) return; *fontptr = qfd.selectedFont(); resync(); } else if (act == qaLayoutLargeAvatar) { os.setPreset(OverlaySettings::LargeSquareAvatar); resync(); } else if (act == qaLayoutText) { os.setPreset(OverlaySettings::AvatarAndName); resync(); } } static qreal distancePointLine(const QPointF &a, const QPointF &b, const QPointF &p) { qreal xda = a.x() - p.x(); qreal xdb = p.x() - b.x(); qreal xd = 0; if (xda > 0) xd = xda; if (xdb > 0) xd = qMax(xd, xdb); qreal yda = a.y() - p.y(); qreal ydb = p.y() - b.y(); qreal yd = 0; if (yda > 0) yd = yda; if (ydb > 0) yd = qMax(yd, ydb); return qMax(xd, yd); } Qt::WindowFrameSection OverlayEditorScene::rectSection(const QRectF &qrf, const QPointF &qp, qreal dist) { qreal left, right, top, bottom; top = distancePointLine(qrf.topLeft(), qrf.topRight(), qp); bottom = distancePointLine(qrf.bottomLeft(), qrf.bottomRight(), qp); left = distancePointLine(qrf.topLeft(), qrf.bottomLeft(), qp); right = distancePointLine(qrf.topRight(), qrf.bottomRight(), qp); if ((top < dist) && (top < bottom)) { if ((left < dist) && (left < right)) return Qt::TopLeftSection; else if (right < dist) return Qt::TopRightSection; return Qt::TopSection; } else if (bottom < dist) { if ((left < dist) && (left < right)) return Qt::BottomLeftSection; else if (right < dist) return Qt::BottomRightSection; return Qt::BottomSection; } else if (left < dist) { return Qt::LeftSection; } else if (right < dist) { return Qt::RightSection; } if (qrf.contains(qp)) return Qt::TitleBarArea; return Qt::NoSection; } mumble-1.3.4/src/mumble/MumbleApplication.h0000664000175000017500000000403514010707273020471 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_MUMBLEAPPLICATION_H #define MUMBLE_MUMBLE_MUMBLEAPPLICATION_H #include #include #if QT_VERSION >= 0x050000 && defined(Q_OS_WIN) # include #endif /** * @brief Implements custom system shutdown behavior as well as event filtering. */ #if QT_VERSION >= 0x050000 && defined(Q_OS_WIN) class MumbleApplication : public QApplication, public QAbstractNativeEventFilter { #else class MumbleApplication : public QApplication { #endif Q_OBJECT public: /// The instance function returns an instance /// of the MumbleApplication singleton. static MumbleApplication *instance(); MumbleApplication(int &pargc, char **pargv); /// applicationVersionRootPath returns /// Mumble's "versioned root"-path. /// /// This is a version-specific path that contains /// supplementary binaries and other products /// that Mumble needs to function. /// /// In the current implementation, the versioned /// root path is set by the MUMBLE_VERSION_ROOT /// environment variable. This environment variable /// is set in the mumble.exe launcher. /// /// If a versioned root path has not been /// configured in the environment, the function /// returns the same path as Qt's own /// QApplication::applicationDirPath(). QString applicationVersionRootPath(); bool event(QEvent *e) Q_DECL_OVERRIDE; #ifdef Q_OS_WIN # if QT_VERSION >= 0x050000 bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) Q_DECL_OVERRIDE; # else bool winEventFilter(MSG *msg, long *result) Q_DECL_OVERRIDE; # endif #endif QUrl quLaunchURL; public slots: /// Saves state and suppresses ask on quit before system shutdown. void onCommitDataRequest(QSessionManager&); }; #endif // MUMBLE_MUMBLE_MUMBLEAPPLICATION_H mumble-1.3.4/src/mumble/SocketRPC.cpp0000664000175000017500000002167014010707273017220 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "SocketRPC.h" #include "Channel.h" #include "ClientUser.h" #include "MainWindow.h" #include "ServerHandler.h" // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" SocketRPCClient::SocketRPCClient(QLocalSocket *s, QObject *p) : QObject(p), qlsSocket(s), qbBuffer(NULL) { qlsSocket->setParent(this); connect(qlsSocket, SIGNAL(disconnected()), this, SLOT(disconnected())); connect(qlsSocket, SIGNAL(error(QLocalSocket::LocalSocketError)), this, SLOT(error(QLocalSocket::LocalSocketError))); connect(qlsSocket, SIGNAL(readyRead()), this, SLOT(readyRead())); qxsrReader.setDevice(qlsSocket); qxswWriter.setAutoFormatting(true); qbBuffer = new QBuffer(&qbaOutput, this); qbBuffer->open(QIODevice::WriteOnly); qxswWriter.setDevice(qbBuffer); } void SocketRPCClient::disconnected() { deleteLater(); } void SocketRPCClient::error(QLocalSocket::LocalSocketError) { } void SocketRPCClient::readyRead() { forever { switch (qxsrReader.readNext()) { case QXmlStreamReader::Invalid: { if (qxsrReader.error() != QXmlStreamReader::PrematureEndOfDocumentError) { qWarning() << "Malformed" << qxsrReader.error(); qlsSocket->abort(); } return; } break; case QXmlStreamReader::EndDocument: { qxswWriter.writeCurrentToken(qxsrReader); processXml(); qxsrReader.clear(); qxsrReader.setDevice(qlsSocket); qxswWriter.setDevice(NULL); delete qbBuffer; qbaOutput = QByteArray(); qbBuffer = new QBuffer(&qbaOutput, this); qbBuffer->open(QIODevice::WriteOnly); qxswWriter.setDevice(qbBuffer); } break; default: qxswWriter.writeCurrentToken(qxsrReader); break; } } } void SocketRPCClient::processXml() { QDomDocument qdd; qdd.setContent(qbaOutput, false); QDomElement request = qdd.firstChildElement(); if (! request.isNull()) { bool ack = false; QMap qmRequest; QMap qmReply; QMap::const_iterator iter; QDomNamedNodeMap attributes = request.attributes(); for (int i=0;ishow(); g.mw->raise(); g.mw->activateWindow(); ack = true; } else if (request.nodeName() == QLatin1String("self")) { iter = qmRequest.find(QLatin1String("mute")); if (iter != qmRequest.constEnd()) { bool set = iter.value().toBool(); if (set != g.s.bMute) { g.mw->qaAudioMute->setChecked(! set); g.mw->qaAudioMute->trigger(); } } iter = qmRequest.find(QLatin1String("unmute")); if (iter != qmRequest.constEnd()) { bool set = iter.value().toBool(); if (set == g.s.bMute) { g.mw->qaAudioMute->setChecked(set); g.mw->qaAudioMute->trigger(); } } iter = qmRequest.find(QLatin1String("togglemute")); if (iter != qmRequest.constEnd()) { bool set = iter.value().toBool(); if (set == g.s.bMute) { g.mw->qaAudioMute->setChecked(set); g.mw->qaAudioMute->trigger(); } else { g.mw->qaAudioMute->setChecked(! set); g.mw->qaAudioMute->trigger(); } } iter = qmRequest.find(QLatin1String("deaf")); if (iter != qmRequest.constEnd()) { bool set = iter.value().toBool(); if (set != g.s.bDeaf) { g.mw->qaAudioDeaf->setChecked(! set); g.mw->qaAudioDeaf->trigger(); } } iter = qmRequest.find(QLatin1String("undeaf")); if (iter != qmRequest.constEnd()) { bool set = iter.value().toBool(); if (set == g.s.bDeaf) { g.mw->qaAudioDeaf->setChecked(set); g.mw->qaAudioDeaf->trigger(); } } iter = qmRequest.find(QLatin1String("toggledeaf")); if (iter != qmRequest.constEnd()) { bool set = iter.value().toBool(); if (set == g.s.bDeaf) { g.mw->qaAudioDeaf->setChecked(set); g.mw->qaAudioDeaf->trigger(); } else { g.mw->qaAudioDeaf->setChecked(! set); g.mw->qaAudioDeaf->trigger(); } } ack = true; } else if (request.nodeName() == QLatin1String("url")) { if (g.sh && g.sh->isRunning() && g.uiSession) { QString host, user, pw; unsigned short port; QUrl u; g.sh->getConnectionInfo(host, port, user, pw); u.setScheme(QLatin1String("mumble")); u.setHost(host); u.setPort(port); u.setUserName(user); #if QT_VERSION >= 0x050000 QUrlQuery query; query.addQueryItem(QLatin1String("version"), QLatin1String("1.2.0")); u.setQuery(query); #else u.addQueryItem(QLatin1String("version"), QLatin1String("1.2.0")); #endif QStringList path; Channel *c = ClientUser::get(g.uiSession)->cChannel; while (c->cParent) { path.prepend(c->qsName); c = c->cParent; } u.setPath(path.join(QLatin1String("/"))); qmReply.insert(QLatin1String("href"), u); } iter = qmRequest.find(QLatin1String("href")); if (iter != qmRequest.constEnd()) { QUrl u = iter.value().toUrl(); if (u.isValid() && u.scheme() == QLatin1String("mumble")) { OpenURLEvent *oue = new OpenURLEvent(u); qApp->postEvent(g.mw, oue); ack = true; } } else { ack = true; } } QDomDocument replydoc; QDomElement reply = replydoc.createElement(QLatin1String("reply")); qmReply.insert(QLatin1String("succeeded"), ack); for (iter = qmReply.constBegin(); iter != qmReply.constEnd(); ++iter) { QDomElement elem = replydoc.createElement(iter.key()); QDomText text = replydoc.createTextNode(iter.value().toString()); elem.appendChild(text); reply.appendChild(elem); } replydoc.appendChild(reply); qlsSocket->write(replydoc.toByteArray()); } } SocketRPC::SocketRPC(const QString &basename, QObject *p) : QObject(p) { qlsServer = new QLocalServer(this); QString pipepath; #ifdef Q_OS_WIN pipepath = basename; #else { QString xdgRuntimePath = QProcessEnvironment::systemEnvironment().value(QLatin1String("XDG_RUNTIME_DIR")); QDir xdgRuntimeDir = QDir(xdgRuntimePath); if (! xdgRuntimePath.isNull() && xdgRuntimeDir.exists()) { pipepath = xdgRuntimeDir.absoluteFilePath(basename + QLatin1String("Socket")); } else { pipepath = QDir::home().absoluteFilePath(QLatin1String(".") + basename + QLatin1String("Socket")); } } { QFile f(pipepath); if (f.exists()) { qWarning() << "SocketRPC: Removing old socket on" << pipepath; f.remove(); } } #endif if (! qlsServer->listen(pipepath)) { qWarning() << "SocketRPC: Listen failed"; delete qlsServer; qlsServer = NULL; } else { connect(qlsServer, SIGNAL(newConnection()), this, SLOT(newConnection())); } } void SocketRPC::newConnection() { while (true) { QLocalSocket *qls = qlsServer->nextPendingConnection(); if (! qls) break; new SocketRPCClient(qls, this); } } bool SocketRPC::send(const QString &basename, const QString &request, const QMap ¶m) { QString pipepath; #ifdef Q_OS_WIN pipepath = basename; #else { QString xdgRuntimePath = QProcessEnvironment::systemEnvironment().value(QLatin1String("XDG_RUNTIME_DIR")); QDir xdgRuntimeDir = QDir(xdgRuntimePath); if (! xdgRuntimePath.isNull() && xdgRuntimeDir.exists()) { pipepath = xdgRuntimeDir.absoluteFilePath(basename + QLatin1String("Socket")); } else { pipepath = QDir::home().absoluteFilePath(QLatin1String(".") + basename + QLatin1String("Socket")); } } #endif QLocalSocket qls; qls.connectToServer(pipepath); if (! qls.waitForConnected(1000)) { return false; } QDomDocument requestdoc; QDomElement req = requestdoc.createElement(request); for (QMap::const_iterator iter = param.constBegin(); iter != param.constEnd(); ++iter) { QDomElement elem = requestdoc.createElement(iter.key()); QDomText text = requestdoc.createTextNode(iter.value().toString()); elem.appendChild(text); req.appendChild(elem); } requestdoc.appendChild(req); qls.write(requestdoc.toByteArray()); qls.flush(); if (! qls.waitForReadyRead(2000)) { return false; } QByteArray qba = qls.readAll(); QDomDocument replydoc; replydoc.setContent(qba); QDomElement succ = replydoc.firstChildElement(QLatin1String("reply")); succ = succ.firstChildElement(QLatin1String("succeeded")); if (succ.isNull()) return false; return QVariant(succ.text()).toBool(); } mumble-1.3.4/src/mumble/UserLocalVolumeDialog.ui0000664000175000017500000000657114010707273021462 0ustar builderbuilder UserLocalVolumeDialog 0 0 500 224 500 224 16777215 224 Local volume for other users <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. -60 30 0 Qt::Horizontal QSlider::TicksBelow 10 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::Reset false Local volume for other users <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. dB -60 30 <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter true mumble-1.3.4/src/mumble/LCD.h0000664000175000017500000000434614010707273015473 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_LCD_H_ #define MUMBLE_MUMBLE_LCD_H_ #include "ConfigDialog.h" #include "Timer.h" #include "ui_LCD.h" class User; class LCDDevice; class LCDConfig : public ConfigWidget, public Ui::LCDConfig { private: Q_OBJECT Q_DISABLE_COPY(LCDConfig) public: LCDConfig(Settings &st); QString title() const Q_DECL_OVERRIDE; QIcon icon() const Q_DECL_OVERRIDE; public slots: void on_qsMinColWidth_valueChanged(int v); void on_qsSplitterWidth_valueChanged(int v); void accept() const Q_DECL_OVERRIDE; void save() const Q_DECL_OVERRIDE; void load(const Settings &r) Q_DECL_OVERRIDE; }; class LCDEngine : public QObject { private: Q_OBJECT Q_DISABLE_COPY(LCDEngine) protected: QList qlDevices; public: LCDEngine(); virtual ~LCDEngine() Q_DECL_OVERRIDE; virtual QList devices() const = 0; }; class LCDDevice { public: LCDDevice(); virtual ~LCDDevice(); virtual bool enabled() = 0; virtual void setEnabled(bool e) = 0; virtual void blitImage(QImage *img, bool alert = false) = 0; virtual QString name() const = 0; virtual QSize size() const = 0; }; typedef LCDEngine *(*LCDEngineNew)(void); class LCDEngineRegistrar Q_DECL_FINAL { protected: LCDEngineNew n; public: static QList *qlInitializers; LCDEngineRegistrar(LCDEngineNew n); ~LCDEngineRegistrar(); }; class LCD : public QObject { private: Q_OBJECT Q_DISABLE_COPY(LCD) protected: QFont qfNormal, qfBold, qfItalic, qfItalicBold; QMap qmSpeaking; QMap qmNew; QMap qmOld; QMap qmNameCache; int iFontHeight; int iFrameIndex; QHash qhImageBuffers; QHash qhImages; void initBuffers(); void destroyBuffers(); QImage qiLogo; QTimer *qtTimer; public slots: void tick(); public: LCD(); ~LCD() Q_DECL_OVERRIDE; void updateUserView(); bool hasDevices(); }; uint qHash(const QSize &size); #endif mumble-1.3.4/src/mumble/TextToSpeech_macx.mm0000664000175000017500000001163114010707273020635 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . /* Copyright (C) 2005-2011, Thorvald Natvig Copyright (C) 2007, Sebastian Schlingmann Copyright (C) 2008-2011, Mikkel Krautz Copyright (C) 2014, Mayur Pawashe All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Mumble Developers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #import #include "mumble_pch.hpp" #include "Global.h" #include "TextToSpeech.h" @interface MUSpeechSynthesizerPrivateHelper : NSObject { NSMutableArray *m_messages; NSSpeechSynthesizer *m_synthesizer; } - (NSSpeechSynthesizer *)synthesizer; - (void)appendMessage:(NSString *)message; - (void)processSpeech; @end #if !defined(USE_MAC_UNIVERSAL) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 @interface MUSpeechSynthesizerPrivateHelper () @end #endif @implementation MUSpeechSynthesizerPrivateHelper - (id)init { if ((self = [super init])) { m_synthesizer = [[NSSpeechSynthesizer alloc] initWithVoice:nil]; m_messages = [[NSMutableArray alloc] init]; [m_synthesizer setDelegate:self]; } return self; } - (void)dealloc { [m_synthesizer release]; [m_messages release]; [super dealloc]; } - (NSSpeechSynthesizer *)synthesizer { return m_synthesizer; } - (void)appendMessage:(NSString *)message { [m_messages insertObject:message atIndex:0]; } - (void)processSpeech { Q_ASSERT([m_messages count] == 0); NSString *poppedMessage = [m_messages lastObject]; [m_synthesizer startSpeakingString:poppedMessage]; [m_messages removeLastObject]; } - (void)speechSynthesizer:(NSSpeechSynthesizer *)synthesizer didFinishSpeaking:(BOOL)success { Q_UNUSED(synthesizer); Q_UNUSED(success); if ([m_messages count] != 0) { [self processSpeech]; } } @end class TextToSpeechPrivate { public: MUSpeechSynthesizerPrivateHelper *m_synthesizerHelper; TextToSpeechPrivate(); ~TextToSpeechPrivate(); void say(const QString &text); void setVolume(int v); }; TextToSpeechPrivate::TextToSpeechPrivate() { m_synthesizerHelper = [[MUSpeechSynthesizerPrivateHelper alloc] init]; } TextToSpeechPrivate::~TextToSpeechPrivate() { [m_synthesizerHelper release]; } void TextToSpeechPrivate::say(const QString &text) { QByteArray byteArray = text.toUtf8(); NSString *message = [[NSString alloc] initWithBytes:byteArray.constData() length:byteArray.size() encoding:NSUTF8StringEncoding]; if (message == nil) { return; } [m_synthesizerHelper appendMessage:message]; [message release]; if (![[m_synthesizerHelper synthesizer] isSpeaking]) { [m_synthesizerHelper processSpeech]; } } void TextToSpeechPrivate::setVolume(int volume) { // Check for setVolume: availability. It's only available on 10.5+. if ([[m_synthesizerHelper synthesizer] respondsToSelector:@selector(setVolume:)]) { [[m_synthesizerHelper synthesizer] setVolume:volume / 100.0]; } } TextToSpeech::TextToSpeech(QObject *) { enabled = true; d = new TextToSpeechPrivate(); } TextToSpeech::~TextToSpeech() { delete d; } void TextToSpeech::say(const QString &text) { if (d && enabled) d->say(text); } void TextToSpeech::setEnabled(bool e) { enabled = e; } void TextToSpeech::setVolume(int volume) { if (d && enabled) d->setVolume(volume); } bool TextToSpeech::isEnabled() const { return enabled; } mumble-1.3.4/src/mumble/GlobalShortcut_win.cpp0000664000175000017500000006505014010707273021234 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" // MinGW does not support std::future/std::promise // at present. Use Boost's implementation for now. #define BOOST_THREAD_VERSION 4 #include #include #include "GlobalShortcut_win.h" #include "MainWindow.h" #include "OverlayClient.h" #include "Global.h" // 3rdparty/xinputcheck-src. #include #undef FAILED #define FAILED(Status) (static_cast(Status)<0) #define DX_SAMPLE_BUFFER_SIZE 512 // from os_win.cpp extern HWND mumble_mw_hwnd; /// The QEvent::Type value to use for InjectKeyboardMessageEvent. #define INJECTKEYBOARDMESSAGE_QEVENT (QEvent::User + 200) /// The QEvent::Type value to use for InjectKeyboardMouseEvent. #define INJECTMOUSEMESSAGE_QEVENT (QEvent::User + 201) /// InjectKeyboardMessageEvent is an event that can be sent to /// the GlobalShortcutWin engine to inject a native Windows keyboard /// event into GlobalShortcutWin's event stream. class InjectKeyboardMessageEvent : public QEvent { Q_DISABLE_COPY(InjectKeyboardMessageEvent); public: boost::promise m_suppressionPromise; DWORD m_scancode; DWORD m_vkcode; bool m_extended; bool m_down; /// Construct a new InjectKeyboardMessageEvent. /// /// @param scancode The Windows scancode of the button. /// @param vkcode The Windows virtual keycode of the button. /// @param extended Indicates whether the button is an extended key in /// Windows nomenclature. ("[...] such as the right-hand ALT /// and CTRL keys that appear on an enhanced 101- or 102-key /// keyboard") /// @param down The down/pressed status of the keyboard button. InjectKeyboardMessageEvent(DWORD scancode, DWORD vkcode, bool extended, bool down) : QEvent(static_cast(INJECTKEYBOARDMESSAGE_QEVENT)) , m_scancode(scancode) , m_vkcode(vkcode) , m_extended(extended) , m_down(down) {} inline boost::future shouldSuppress() { return m_suppressionPromise.get_future(); } }; /// InjectMouseMessageEvent is an event that can be sent to /// the GlobalShortcutWin engine to inject a native Windows mouse /// event into GlobalShortcutWin's event stream. class InjectMouseMessageEvent : public QEvent { Q_DISABLE_COPY(InjectMouseMessageEvent); public: boost::promise m_suppressionPromise; unsigned int m_btn; bool m_down; /// Construct a new InjectMouseMessageEvent. /// /// @param btn The DirectInput button index of the mouse event. /// @param down The down/pressed status of the mouse button. InjectMouseMessageEvent(unsigned int btn, bool down) : QEvent(static_cast(INJECTMOUSEMESSAGE_QEVENT)) , m_btn(btn) , m_down(down) {} inline boost::future shouldSuppress() { return m_suppressionPromise.get_future(); } }; uint qHash(const GUID &a) { uint val = a.Data1 ^ a.Data2 ^ a.Data3; for (int i=0;i<8;i++) val += a.Data4[i]; return val; } /** * Returns a platform specific GlobalShortcutEngine object. * * @see GlobalShortcutX * @see GlobalShortcutMac * @see GlobalShortcutWin */ GlobalShortcutEngine *GlobalShortcutEngine::platformInit() { return new GlobalShortcutWin(); } GlobalShortcutWin::GlobalShortcutWin() : pDI(NULL) , hhMouse(NULL) , hhKeyboard(NULL) , uiHardwareDevices(0) #ifdef USE_GKEY , gkey(NULL) #endif #ifdef USE_XBOXINPUT , xboxinput(NULL) , nxboxinput(0) #endif { // Hidden setting to disable hooking bHook = g.qs->value(QLatin1String("winhooks"), true).toBool(); moveToThread(this); start(QThread::LowestPriority); } GlobalShortcutWin::~GlobalShortcutWin() { quit(); wait(); } void GlobalShortcutWin::run() { if (FAILED(DirectInput8Create(GetModuleHandle(NULL), DIRECTINPUT_VERSION, IID_IDirectInput8, reinterpret_cast(&pDI), NULL))) { qFatal("GlobalShortcutWin: Failed to create d8input"); return; } // Print the user's LowLevelHooksTimeout registry key for debugging purposes. // On Windows 7 and greater, Windows will silently remove badly behaving hooks // without telling the application. Users can tweak the timeout themselves // with this registry key. HKEY key = NULL; DWORD type = 0; DWORD value = 0; DWORD len = sizeof(DWORD); if (RegOpenKeyExA(HKEY_CURRENT_USER, "Control Panel\\Desktop", 0, KEY_READ, &key) == ERROR_SUCCESS) { LONG err = RegQueryValueExA(key, "LowLevelHooksTimeout", NULL, &type, reinterpret_cast(&value), &len); if (err == ERROR_SUCCESS && type == REG_DWORD) { qWarning("GlobalShortcutWin: Found LowLevelHooksTimeout with value = 0x%lx", static_cast(value)); } else if (err == ERROR_FILE_NOT_FOUND) { qWarning("GlobalShortcutWin: No LowLevelHooksTimeout registry key found."); } else { qWarning("GlobalShortcutWin: Error looking up LowLevelHooksTimeout. (Error: 0x%lx, Type: 0x%lx, Value: 0x%lx)", static_cast(err), static_cast(type), static_cast(value)); } } // Wait for MainWindow's constructor to finish before we enumerate DirectInput devices. // We need to do this because adding a new device requires a Window handle. (SetCooperativeLevel()) while (! g.mw) this->yieldCurrentThread(); #ifdef USE_GKEY if (g.s.bEnableGKey) { gkey = new GKeyLibrary(); qWarning("GlobalShortcutWin: GKeys initialized, isValid: %d", gkey->isValid()); } #endif #ifdef USE_XBOXINPUT if (g.s.bEnableXboxInput) { xboxinput = new XboxInput(); ZeroMemory(&xboxinputLastPacket, sizeof(xboxinputLastPacket)); qWarning("GlobalShortcutWin: XboxInput initialized, isValid: %d", xboxinput->isValid()); } #endif QTimer *timer = new QTimer; connect(timer, SIGNAL(timeout()), this, SLOT(timeTicked())); timer->start(20); setPriority(QThread::TimeCriticalPriority); exec(); delete timer; #ifdef USE_GKEY delete gkey; #endif #ifdef USE_XBOXINPUT delete xboxinput; #endif if (bHook) { if (hhMouse != NULL) { UnhookWindowsHookEx(hhMouse); } if (hhKeyboard != NULL) { UnhookWindowsHookEx(hhKeyboard); } } foreach(InputDevice *id, qhInputDevices) { if (id->pDID) { id->pDID->Unacquire(); id->pDID->Release(); } delete id; } pDI->Release(); } bool GlobalShortcutWin::event(QEvent *event) { QEvent::Type type = event->type(); if (type == INJECTKEYBOARDMESSAGE_QEVENT) { InjectKeyboardMessageEvent *ikme = static_cast(event); bool suppress = handleKeyboardMessage(ikme->m_scancode, ikme->m_vkcode, ikme->m_extended, ikme->m_down); ikme->m_suppressionPromise.set_value(suppress); return true; } else if (type == INJECTMOUSEMESSAGE_QEVENT) { InjectMouseMessageEvent *imme = static_cast(event); bool suppress = handleMouseMessage(imme->m_btn, imme->m_down); imme->m_suppressionPromise.set_value(suppress); return true; } return GlobalShortcutEngine::event(event); } bool GlobalShortcutWin::injectKeyboardMessage(MSG *msg) { if (!bHook) { return false; } // Only allow keyboard messages. switch (msg->message) { case WM_KEYDOWN: case WM_KEYUP: case WM_SYSKEYDOWN: case WM_SYSKEYUP: break; default: return false; } DWORD scancode = (msg->lParam >> 16) & 0xff; DWORD vkcode = msg->wParam; bool extended = !!(msg->lParam & 0x01000000); bool up = !!(msg->lParam & 0x80000000); InjectKeyboardMessageEvent *ikme = new InjectKeyboardMessageEvent(scancode, vkcode, extended, !up); boost::future suppress = ikme->shouldSuppress(); qApp->postEvent(this, ikme); return suppress.get(); } bool GlobalShortcutWin::injectMouseMessage(MSG *msg) { if (!bHook) { return false; } bool down = false; unsigned int btn = 0; // Convert the Windows mouse message into a DirectInput // button index, and store the pressed state of the button. switch (msg->message) { case WM_LBUTTONDOWN: down = true; case WM_LBUTTONUP: btn = 3; break; case WM_RBUTTONDOWN: down = true; case WM_RBUTTONUP: btn = 4; break; case WM_MBUTTONDOWN: down = true; case WM_MBUTTONUP: btn = 5; break; case WM_XBUTTONDOWN: down = true; case WM_XBUTTONUP: { unsigned int offset = (msg->wParam >> 16) & 0xffff; btn = 5 + offset; } default: // Non-mouse event. Return early. return false; } InjectMouseMessageEvent *imme = new InjectMouseMessageEvent(btn, down); boost::future suppress = imme->shouldSuppress(); qApp->postEvent(this, imme); return suppress.get(); } bool GlobalShortcutWin::handleKeyboardMessage(DWORD scancode, DWORD vkcode, bool extended, bool down) { GlobalShortcutWin *gsw = static_cast(engine); QList ql; // Convert the low-level key event to // a DirectInput key ID. unsigned int keyid = static_cast((scancode << 8) | 0x4); if (extended) { keyid |= 0x8000U; } // NumLock and Pause need special handling. // For those keys, the method above of setting // bit 15 high when the LLKHF_EXTENDED flag is // set on the low-level key event does not work. // // When we receive a low-level Windows // Pause key event, the extended flag isn't // set, but DirectInput expects it to be. // // The opposite is true for NumLock key, // where the extended flag for the low-level // Windows event is set, but DirectInput expects // it not to be. // // Without this fix-up, we would emit Pause as // NumLock, and NumLock as pause. That was // problematic, because at the same time, // DirectInput would emit the correct key. // This meant that when pressing one of Pause // and NumLock, shortcut actions for both keys // would be triggered. // // Originally reported in mumble-voip/mumble#1353 if (vkcode == VK_PAUSE) { // Always set the extended bit for Pause. keyid |= 0x8000U; } else if (vkcode == VK_NUMLOCK) { // Never set the extended bit for NumLock. keyid &= ~0x8000U; } ql << keyid; ql << QVariant(QUuid(GUID_SysKeyboard)); bool suppress = gsw->handleButton(ql, down); return suppress; } bool GlobalShortcutWin::handleMouseMessage(unsigned int btn, bool down) { GlobalShortcutWin *gsw = static_cast(engine); bool suppress = false; if (btn > 0) { QList ql; ql << static_cast((btn << 8) | 0x4); ql << QVariant(QUuid(GUID_SysMouse)); // Do not suppress LBUTTONUP though (so suppression can be deactivated via mouse). bool wantsuppress = gsw->handleButton(ql, down); suppress = wantsuppress && (btn != 3); } return suppress; } LRESULT CALLBACK GlobalShortcutWin::HookKeyboard(int nCode, WPARAM wParam, LPARAM lParam) { GlobalShortcutWin *gsw=static_cast(engine); KBDLLHOOKSTRUCT *key=reinterpret_cast(lParam); #ifndef QT_NO_DEBUG static int safety = 0; if ((++safety < 100) && (nCode >= 0)) { #else if (nCode >= 0) { #endif DWORD scancode = key->scanCode; DWORD vkcode = key->vkCode; bool extended = !!(key->flags & LLKHF_EXTENDED); bool up = !!(key->flags & LLKHF_UP); bool suppress = handleKeyboardMessage(scancode, vkcode, extended, !up); if (suppress) { return 1; } } return CallNextHookEx(gsw->hhKeyboard, nCode, wParam, lParam); } LRESULT CALLBACK GlobalShortcutWin::HookMouse(int nCode, WPARAM wParam, LPARAM lParam) { GlobalShortcutWin *gsw=static_cast(engine); MSLLHOOKSTRUCT *mouse=reinterpret_cast(lParam); if (nCode >= 0) { bool suppress = false; UINT msg = wParam; // Convert the hooked Windows mouse message into a DirectInput // button index, and store the pressed state of the button. bool down = false; unsigned int btn = 0; switch (msg) { case WM_LBUTTONDOWN: down = true; case WM_LBUTTONUP: btn = 3; break; case WM_RBUTTONDOWN: down = true; case WM_RBUTTONUP: btn = 4; break; case WM_MBUTTONDOWN: down = true; case WM_MBUTTONUP: btn = 5; break; case WM_XBUTTONDOWN: down = true; case WM_XBUTTONUP: btn = 5 + (mouse->mouseData >> 16); default: break; } if (btn > 0) { suppress = handleMouseMessage(btn, down); if (suppress) { return 1; } } } return CallNextHookEx(gsw->hhMouse, nCode, wParam, lParam); } BOOL CALLBACK GlobalShortcutWin::EnumDeviceObjectsCallback(LPCDIDEVICEOBJECTINSTANCE lpddoi, LPVOID pvRef) { InputDevice *id=static_cast(pvRef); QString name = QString::fromUtf16(reinterpret_cast(lpddoi->tszName)); id->qhNames[lpddoi->dwType] = name; if (g.s.bDirectInputVerboseLogging) { qWarning("GlobalShortcutWin: EnumObjects: device %s %s object 0x%.8lx %s", qPrintable(QUuid(id->guid).toString()), qPrintable(id->name), static_cast(lpddoi->dwType), qPrintable(name)); } return DIENUM_CONTINUE; } BOOL GlobalShortcutWin::EnumDevicesCB(LPCDIDEVICEINSTANCE pdidi, LPVOID pContext) { GlobalShortcutWin *cbgsw=static_cast(pContext); HRESULT hr; QString name = QString::fromUtf16(reinterpret_cast(pdidi->tszProductName)); QString sname = QString::fromUtf16(reinterpret_cast(pdidi->tszInstanceName)); InputDevice *id = new InputDevice; id->pDID = NULL; id->name = name; id->guid = pdidi->guidInstance; id->vguid = QVariant(QUuid(id->guid).toString()); id->guidproduct = pdidi->guidProduct; id->vguidproduct = QVariant(QUuid(id->guidproduct).toString()); // Is it an XInput device? Skip it. // // This check is not restricted to USE_XBOXINPUT because // Windows 10 (10586.122, ~March 2016) has issues with // using XInput devices via DirectInput. // // See issues mumble-voip/mumble#2104 and mumble-voip/mumble#2147 // for more information. if (XInputCheck_IsGuidProductXInputDevice(&id->guidproduct)) { cbgsw->nxboxinput += 1; qWarning("GlobalShortcutWin: excluded XInput device '%s' (guid %s guid product %s) from DirectInput", qPrintable(id->name), qPrintable(id->vguid.toString()), qPrintable(id->vguidproduct.toString())); delete id; return DIENUM_CONTINUE; } // Check for PIDVID at the end of the GUID, as // per http://stackoverflow.com/q/25622780. BYTE pidvid[8] = { 0, 0, 'P', 'I', 'D', 'V', 'I', 'D' }; if (memcmp(id->guidproduct.Data4, pidvid, 8) == 0) { uint16_t vendor_id = id->guidproduct.Data1 & 0xffff; uint16_t product_id = (id->guidproduct.Data1 >> 16) & 0xffff; id->vendor_id = vendor_id; id->product_id = product_id; } else { id->vendor_id = 0x00; id->product_id = 0x00; } // Reject devices if they are blacklisted. // // Device Name: ODAC-revB // Vendor/Product ID: 0x262A, 0x1048 // https://github.com/mumble-voip/mumble/issues/1977 // // Device Name: Aune T1 MK2 - HID-compliant consumer control device // Vendor/Product ID: 0x262A, 0x1168 // https://github.com/mumble-voip/mumble/issues/1880 // // For now, we simply disable the 0x262A vendor ID. // // 0x26A is SAVITECH Corp. // http://www.savitech-ic.com/, or // http://www.saviaudio.com/product.html // (via https://usb-ids.gowdy.us/read/UD/262a) // // In the future, if there are more devices in the // blacklist, we need a more structured aproach. { if (id->vendor_id == 0x262A) { qWarning("GlobalShortcutWin: rejected blacklisted device %s (GUID: %s, PGUID: %s, VID: 0x%.4x, PID: 0x%.4x, TYPE: 0x%.8lx)", qPrintable(id->name), qPrintable(id->vguid.toString()), qPrintable(id->vguidproduct.toString()), id->vendor_id, id->product_id, static_cast(pdidi->dwDevType)); delete id; return DIENUM_CONTINUE; } } foreach(InputDevice *dev, cbgsw->qhInputDevices) { if (dev->guid == id->guid) { delete id; return DIENUM_CONTINUE; } } if (FAILED(hr = cbgsw->pDI->CreateDevice(pdidi->guidInstance, &id->pDID, NULL))) qFatal("GlobalShortcutWin: CreateDevice: %lx", hr); if (FAILED(hr = id->pDID->EnumObjects(EnumDeviceObjectsCallback, static_cast(id), DIDFT_BUTTON))) qFatal("GlobalShortcutWin: EnumObjects: %lx", hr); if (id->qhNames.count() > 0) { QList types = id->qhNames.keys(); qSort(types); int nbuttons = types.count(); STACKVAR(DIOBJECTDATAFORMAT, rgodf, nbuttons); DIDATAFORMAT df; ZeroMemory(&df, sizeof(df)); df.dwSize = sizeof(df); df.dwObjSize = sizeof(DIOBJECTDATAFORMAT); df.dwFlags=DIDF_ABSAXIS; df.dwDataSize = (nbuttons + 3) & (~0x3); df.dwNumObjs = nbuttons; df.rgodf = rgodf; for (int i=0;iqhOfsToType[dwOfs] = dwType; id->qhTypeToOfs[dwType] = dwOfs; } if (FAILED(hr = id->pDID->SetCooperativeLevel(mumble_mw_hwnd, DISCL_NONEXCLUSIVE|DISCL_BACKGROUND))) qFatal("GlobalShortcutWin: SetCooperativeLevel: %lx", hr); if (FAILED(hr = id->pDID->SetDataFormat(&df))) qFatal("GlobalShortcutWin: SetDataFormat: %lx", hr); DIPROPDWORD dipdw; dipdw.diph.dwSize = sizeof(DIPROPDWORD); dipdw.diph.dwHeaderSize = sizeof(DIPROPHEADER); dipdw.diph.dwObj = 0; dipdw.diph.dwHow = DIPH_DEVICE; dipdw.dwData = DX_SAMPLE_BUFFER_SIZE; if (FAILED(hr = id->pDID->SetProperty(DIPROP_BUFFERSIZE, &dipdw.diph))) qFatal("GlobalShortcutWin: SetProperty: %lx", hr); qWarning("Adding device %s %s %s:%d type 0x%.8lx guid product %s", qPrintable(QUuid(id->guid).toString()), qPrintable(name), qPrintable(sname), id->qhNames.count(), static_cast(pdidi->dwDevType), qPrintable(id->vguidproduct.toString())); cbgsw->qhInputDevices[id->guid] = id; } else { id->pDID->Release(); delete id; } return DIENUM_CONTINUE; } void GlobalShortcutWin::timeTicked() { if (g.mw->uiNewHardware != uiHardwareDevices) { uiHardwareDevices = g.mw->uiNewHardware; XInputCheck_ClearDeviceCache(); nxboxinput = 0; pDI->EnumDevices(DI8DEVCLASS_ALL, EnumDevicesCB, static_cast(this), DIEDFL_ATTACHEDONLY); } if (bNeedRemap) remap(); foreach(InputDevice *id, qhInputDevices) { DIDEVICEOBJECTDATA rgdod[DX_SAMPLE_BUFFER_SIZE]; DWORD dwItems = DX_SAMPLE_BUFFER_SIZE; HRESULT hr; hr = id->pDID->Acquire(); switch (hr) { case DI_OK: case S_FALSE: break; case DIERR_UNPLUGGED: case DIERR_GENERIC: qWarning("Removing device %s", qPrintable(QUuid(id->guid).toString())); id->pDID->Release(); qhInputDevices.remove(id->guid); delete id; return; case DIERR_OTHERAPPHASPRIO: continue; default: break; } { QElapsedTimer timer; timer.start(); id->pDID->Poll(); // If a call to Poll takes more than // a second, warn the user that they // might have a misbehaving device. if (timer.elapsed() > 1000) { qWarning("GlobalShortcut_win: Poll() for device %s took %li msec. This is abnormal, the device is possibly misbehaving...", qPrintable(QUuid(id->guid).toString()), static_cast(timer.elapsed())); } } hr = id->pDID->GetDeviceData(sizeof(DIDEVICEOBJECTDATA), rgdod, &dwItems, 0); if (FAILED(hr)) continue; if (dwItems <= 0) continue; for (DWORD j=0; j ql; quint32 uiType = id->qhOfsToType.value(rgdod[j].dwOfs); ql << uiType; ql << id->vguid; handleButton(ql, rgdod[j].dwData & 0x80); } } #ifdef USE_GKEY if (g.s.bEnableGKey && gkey != NULL && gkey->isValid()) { for (int button = GKEY_MIN_MOUSE_BUTTON; button <= GKEY_MAX_MOUSE_BUTTON; button++) { QList ql; ql << button; ql << GKeyLibrary::quMouse; handleButton(ql, gkey->isMouseButtonPressed(button)); } for (int mode = GKEY_MIN_KEYBOARD_MODE; mode <= GKEY_MAX_KEYBOARD_MODE; mode++) { for (int key = GKEY_MIN_KEYBOARD_BUTTON; key <= GKEY_MAX_KEYBOARD_BUTTON; key++) { QList ql; // Store the key and mode in one int // bit 0..15: mode, bit 16..31: key ql << (key | (mode << 16)); ql << GKeyLibrary::quKeyboard; handleButton(ql, gkey->isKeyboardGkeyPressed(key, mode)); } } } #endif #ifdef USE_XBOXINPUT if (g.s.bEnableXboxInput && xboxinput != NULL && xboxinput->isValid() && nxboxinput > 0) { XboxInputState state; for (uint32_t i = 0; i < XBOXINPUT_MAX_DEVICES; i++) { if (xboxinput->GetState(i, &state) == 0) { // Skip the result of GetState() if the packet number hasn't changed, // or if we're at the first packet. if (xboxinputLastPacket[i] != 0 && state.packetNumber == xboxinputLastPacket[i]) { continue; } // The buttons field of XboxInputState contains a bit // for each button on the Xbox controller. The official // headers enumerate the bits via XINPUT_GAMEPAD_*. // The official mapping uses all 16-bits, but leaves // bit 10 and 11 (counting from 0) undocumented. // // It turns out that bit 10 is the guide button, // which can be queried using the non-public // XInputGetStateEx() function. // // Our mapping uses the bit number as a button index. // So 0x1 -> 0, 0x2 -> 1, 0x4 -> 2, and so on... // // However, since the buttons field is only a 16-bit value, // and we also want to use the left and right triggers as // buttons, we assign them the button indexes 16 and 17. uint32_t buttonMask = state.buttons; for (uint32_t j = 0; j < 18; j++) { QList ql; bool pressed = false; if (j >= 16) { if (j == 16) { // LeftTrigger pressed = state.leftTrigger > XBOXINPUT_TRIGGER_THRESHOLD; } else if (j == 17) { // RightTrigger pressed = state.rightTrigger > XBOXINPUT_TRIGGER_THRESHOLD; } } else { uint32_t currentButtonMask = (1 << j); pressed = (buttonMask & currentButtonMask) != 0; } uint32_t type = (i << 24) | j; ql << static_cast(type); ql << XboxInput::s_XboxInputGuid; handleButton(ql, pressed); } xboxinputLastPacket[i] = state.packetNumber; } } } #endif // Initialize winhooks. // // We do this here, because at this point, we've just run our // first timeTicked() slot. The GlobalShortcut_win thread's event // loop has nothing else to do at this point, so there is nothing // that blocks the callbacks of the hooks. // // That is, if we initialize here, our callbacks *can* be called // immediately after initialization, which gives the best results // as far as interactivity and user experience goes. The initialization // cannot be "felt". // // Let me explain... // // Originally, this code lived in the body of run, ::run(), just // before exec() was called. // // It turns out that if our hooks are initialized there, it can take // a short while before the mouse and keyboard callbacks can be processed. // // During this time, where the mouse callback is not able to be called, // the mouse in Windows becomes laggy. It makes the whole computer feel // like it has locked up -- because input "stops". // // As explained above, initializing the hooks here yields a much superior // experience, where this initialization has no observable effect on the // behavior of the system's mouse input. if (bHook && hhMouse == NULL && hhKeyboard == NULL) { HMODULE hSelf; GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, reinterpret_cast(&HookKeyboard), &hSelf); hhMouse = SetWindowsHookEx(WH_MOUSE_LL, HookMouse, hSelf, 0); hhKeyboard = SetWindowsHookEx(WH_KEYBOARD_LL, HookKeyboard, hSelf, 0); } } QString GlobalShortcutWin::buttonName(const QVariant &v) { GlobalShortcutWin *gsw = static_cast(GlobalShortcutEngine::engine); const QList &sublist = v.toList(); if (sublist.count() != 2) return QString(); bool ok = false; DWORD type = sublist.at(0).toUInt(&ok); QUuid guid(sublist.at(1).toString()); if (guid.isNull() || (!ok)) return QString(); QString device=guid.toString(); QString name=QLatin1String("Unknown"); #ifdef USE_GKEY if (g.s.bEnableGKey && gkey != NULL && gkey->isValid()) { bool isGKey = false; if (guid == GKeyLibrary::quMouse) { isGKey = true; name = gkey->getMouseButtonString(type); } else if (guid == GKeyLibrary::quKeyboard) { isGKey = true; name = gkey->getKeyboardGkeyString(type & 0xFFFF, type >> 16); } if (isGKey) { device = QLatin1String("GKey:"); return device + name; // Example output: "Gkey:G6/M1" } } #endif #ifdef USE_XBOXINPUT if (g.s.bEnableXboxInput && xboxinput != NULL && xboxinput->isValid() && guid == XboxInput::s_XboxInputGuid) { uint32_t idx = (type >> 24) & 0xff; uint32_t button = (type & 0x00ffffff); // Translate from our own button index mapping to // the actual Xbox controller button names. // For a description of the mapping, see the state // querying code in GlobalShortcutWin::timeTicked(). switch (button) { case 0: return QString::fromLatin1("Xbox%1:Up").arg(idx + 1); case 1: return QString::fromLatin1("Xbox%1:Down").arg(idx + 1); case 2: return QString::fromLatin1("Xbox%1:Left").arg(idx + 1); case 3: return QString::fromLatin1("Xbox%1:Right").arg(idx + 1); case 4: return QString::fromLatin1("Xbox%1:Start").arg(idx + 1); case 5: return QString::fromLatin1("Xbox%1:Back").arg(idx + 1); case 6: return QString::fromLatin1("Xbox%1:LeftThumb").arg(idx + 1); case 7: return QString::fromLatin1("Xbox%1:RightThumb").arg(idx + 1); case 8: return QString::fromLatin1("Xbox%1:LeftShoulder").arg(idx + 1); case 9: return QString::fromLatin1("Xbox%1:RightShoulder").arg(idx + 1); case 10: return QString::fromLatin1("Xbox%1:Guide").arg(idx + 1); case 11: return QString::fromLatin1("Xbox%1:11").arg(idx + 1); case 12: return QString::fromLatin1("Xbox%1:A").arg(idx + 1); case 13: return QString::fromLatin1("Xbox%1:B").arg(idx + 1); case 14: return QString::fromLatin1("Xbox%1:X").arg(idx + 1); case 15: return QString::fromLatin1("Xbox%1:Y").arg(idx + 1); case 16: return QString::fromLatin1("Xbox%1:LeftTrigger").arg(idx + 1); case 17: return QString::fromLatin1("Xbox%1:RightTrigger").arg(idx + 1); } } #endif InputDevice *id = gsw->qhInputDevices.value(guid); if (guid == GUID_SysMouse) device=QLatin1String("M:"); else if (guid == GUID_SysKeyboard) device=QLatin1String("K:"); else if (id) device=id->name+QLatin1String(":"); if (id) { QString result = id->qhNames.value(type); if (!result.isEmpty()) { name = result; } } return device+name; } bool GlobalShortcutWin::canSuppress() { return bHook; } mumble-1.3.4/src/mumble/mumble_vi.ts0000664000175000017500000114632114010707274017251 0ustar builderbuilder ACLEditor Deny Allow Allow %1 Deny %1 Mumble - Add channel Default server value Failed: Invalid channel Mumble - Edit %1 ID: %1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Channel must have a name This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Dialog Name Enter the channel name here. Description Password Enter the channel password here. Check to create a temporary channel. Temporary <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. Position &Groups Group List of groups Remove selected group Remove Inherit group members from parent Inherit Make group inheritable to sub-channels Inheritable Group was inherited from parent channel Inherited Members Add Add member to group Remove member from group &ACL Active ACLs List of entries Inherit ACL of parent? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. Inherit ACLs Move entry up This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. &Up Move entry down This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. &Down Add new entry This adds a new entry, initially set with no permissions and applying to all. &Add Remove entry This removes the currently selected entry. &Remove Context Entry should apply to this channel. Entry should apply to this channel This makes the entry apply to this channel. Applies to this channel Entry should apply to sub-channels. Add new group <b>Add</b><br/> Add a new group. Inherited members Contains the list of members added to the group by this channel. Contains a list of members whose group membership will not be inherited from the parent channel. Contains the list of members inherited by other channels. Type in the name of a user you wish to add to the group and click Add. Type in the name of a user you wish to remove from the group and click Add. Exclude Excluded members This makes the entry apply to sub-channels of this channel. Applies to sub-channels Permissions User/Group Group this entry applies to User ID User this entry applies to This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. &Properties <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. ID of the channel. Maximum Users Maximum number of users allowed in the channel <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. This is the sort order for the channel. ALSAAudioInput Default ALSA Card Opening chosen ALSA Input failed: %1 ALSAAudioOutput Default ALSA Card Opening chosen ALSA Output failed: %1 ASIOConfig %1 (version %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz ASIO Initialization failed: %1 Failed to instantiate ASIO driver ASIO Device selection Device Device to use for microphone This chooses what device to query. You still need to actually query the device and select which channels to use. Query selected device This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Query Configure selected device This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Configure Capabilities Driver name Buffer size This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. Configure input channels Channels Microphone <- -> Unused Speakers ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. Opening selected ASIO device failed. No input will be done. AboutDialog About Mumble <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble &License A&uthors &Third-Party Licenses OK AudioInput Interface System Input method for audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Input device for audio <b>This is the input device to use for audio.</b> Transmission &Transmit When to transmit your speech <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. DoublePush Time If you press the PTT key twice in this time it will get locked. <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. Reset audio cue to default <b>Reset</b><br/>Reset the paths for the files to their default. Browse for on audio file Browse for off audio file Off On Preview the audio cues Use SNR based speech detection Signal to Noise <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. Amplitude Voice &Hold How long to keep transmitting after silence Silence Below <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. Speech Above Signal values above this count as voice Compression &Quality Quality of compression (peak bandwidth) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. Audio per packet How many audio frames to send per packet <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). Audio Processing Noise Suppression Noise suppression <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. Maximum amplification of input sound <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. Current speech detection chance Cancel echo from speakers Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. Disabled <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal values below this count as silence Maximum bandwidth used for sending audio Use Amplitude based speech detection <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). Exclusive mode <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive R&eset &Browse... B&rowse... &Preview <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. Displays an always on top window with a push to talk button in it Display push to talk window Misc Audible audio cue when starting or stopping to transmit <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. Audio cue Gets played when starting to transmit Gets played when stopping to transmit Hold Time Time the microphone stays open after the PTT key is released Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) Max. Amplification Idle action minutes do nothing deafen mute after Echo Cancellation Mixed echo cancellation Multichannel echo cancellation The idle action will be reversed upon any key or mouse button input Undo Idle action upon activity Apply RNNoise's noise suppression filter. <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. RNNoise Audio input AudioInputDialog Continuous Voice Activity Push To Talk Audio Input %1 ms Off %1 s %1 kb/s -%1 dB %1 kbit/s (Audio %2, Position %4, Overhead %3) AudioOutput Interface System Output method for audio <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Output device for audio <b>This is the output device to use for audio.</b> Positional Audio Audio Output Default &Jitter Buffer Safety margin for jitter buffer <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. Minimum distance to user before sound volume decreases This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. Volume Volume of incoming speech <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. Output Delay Amount of data to buffer The connected "speakers" are actually headphones The connected "speakers" are actually headphones. Factor for sound volume decrease Bloom Factor for sound volume increase How much should sound volume increase for sources that are really close? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Headphones Minimum Distance Maximum Distance Maximum distance, beyond which speech volume won't decrease Minimum Volume What should the volume be at the maximum distance? Loopback Test Delay Variance Variance in packet latency <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. Packet Loss Packet loss for loopback mode <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% &Loopback Desired loopback mode Attenuate applications by... Attenuation of other applications during speech <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. If checked Mumble lowers the volume of other applications while other users talk <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. while other users talk If checked Mumble lowers the volume of other applications while you talk <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. while you talk Exclusive mode, not recommended. <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive Priority Speaker If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. Attenuate other users while talking as Priority Speaker. Advanced Attenuation Options If checked, Mumble will only attenuate applications that are using the same output source as Mumble <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. Only attenuate applications using the same output device If checked, PulseAudio loopback modules will be attenuated <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. Attenuate PulseAudio loopback modules Audio output AudioOutputDialog None Local Server Audio Output %1 ms %1 % %1 m AudioOutputSample Choose sound file Invalid sound file The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. AudioStats >1000 ms >1000ms Audio Statistics Input Levels Peak microphone level Peak power in last frame This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. Peak speaker level This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. Peak clean level This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. Signal Analysis Microphone power How close the current input level is to ideal This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. Signal-To-Noise ratio Signal-To-Noise ratio from the microphone This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. Speech Probability Probability of speech This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). Configuration feedback Current audio bitrate Bitrate of last frame DoublePush interval Time between last two Push-To-Talk presses Speech Detection Current speech detection chance <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal and noise power spectrum Power spectrum of input signal and noise estimate This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. Echo Analysis Weights of the echo canceller This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. AudioWizard Audio Tuning Wizard Introduction Welcome to the Mumble Audio Wizard Finished Enjoy using Mumble Device selection Selecting the input and output device to use with Mumble. This is the device your microphone is connected to. System Input method for audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Input device to use <b>Selects which sound card to use for audio input.</b> Cancel echo from headset or speakers Use echo cancellation This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. This is the device your speakers or headphones are connected to. Output method for audio <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. Output device to use <b>Selects which sound card to use for audio Output.</b> Enable positional audio Allows positioning of sound Allows positioning of sound. <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> Input Device Output Device This allows Mumble to use positional audio to place voices. <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> Amount of data to buffer This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> Positional Audio Adjusting attenuation of positional audio. <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> Use headphones instead of speakers <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> Use headphones This ignores the OS speaker configuration and configures the positioning for headphones instead. Volume tuning Tuning microphone hardware volume to optimal settings. Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. Voice Activity Detection Letting Mumble figure out when you're talking and when you're silent. This will help Mumble figure out when you are talking. The first step is selecting which data value to use. Raw amplitude from input Signal-To-Noise ratio Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Device tuning Changing hardware output delays to their minimum value. Submit anonymous statistics to the Mumble project Push To Talk: Quality & Notifications Adjust quality and notification settings. Quality settings Low Balanced Notification settings Use Text-To-Speech to read notifications and messages to you. Disable Text-To-Speech and use sounds instead. %1 ms Enables attenuation of other applications while users talk to you Attenuate applications while other users talk High Custom You already set a customized quality configuration in Mumble. Select this setting to keep it. Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. Apply some high contrast optimizations for visually impaired users Use high contrast graphics Keep custom Text-To-Speech settings. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) BanEditor Mumble - Edit Bans &Address &Mask Reason Start End User Hash &Add &Update &Remove Ban List Search field This is the search field. Use it to find bans that have this username set in the username field. Who are you looking for? No nickname IP address No IP address Reason for the ban No reason Ban end date Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). Certificate hash No certificate hash Banned users This is a list with banned users. Use this button if you want to add a new ban. Use this button if you want to update ban information. Use this button if you want to remove user from the ban list. Clear all fields This button clears all fields. Use it if you want to add a new ban. Clear Ban List - %n Ban(s) CertView Name Email Issuer Expiry Date (none) Self-signed CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. There was an error generating your certificate.<br />Please try again. Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. The file could not be opened for writing. Please use another file. The file's permissions could not be set. No certificate and key has been written. Please use another file. The file could not be written successfully. Please use another file. The file could not be opened for reading. Please use another file. The file is empty or could not be read. Please use another file. The file did not contain a valid certificate and key. Please use another file. Select file to export certificate to Select file to import certificate from Unable to import. Missing password or incompatible file type. <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. Certificates Certificate Management Certificate Authentication Authenticating to servers without using passwords Current certificate This is the certificate Mumble currently uses. Current Certificate Create a new certificate This will create a new certificate. Import certificate from file This will import a certificate from file. Import a certificate Export Certificate This will export a certificate to file. Export current certificate Import Certificate PKCS #12 Certificate import <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> Import from Filename to import from This is the filename you wish to import a certificate from. Select file to import from This opens a file selection dialog to choose a file to import a certificate from. Open... Password Password for PKCS#12 file This is the password for the PKCS#12 file containing your certificate. Certificate to import This is the certificate you are importing. Certificate Details Replace Certificate Replace existing certificate with new certificate? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> This is the certificate Mumble currently uses. It will be replaced. New certificate This is the new certificate that will replace the old one. New Certificate Make a backup of your certificate Export to Filename to export to This is the filename you wish to export a certificate to. Save As... This is the certificate Mumble currently uses. It will be exported. Generate a new certificate for strong authentication <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> Name Email Your email address (e.g. johndoe@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. Your name (e.g. John Doe) This is your name, and will be filled out in the certificate. This field is entirely optional. Finish Certificate-based authentication is ready for use Enjoy using Mumble with strong authentication. Automatic certificate creation <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> ChanACL None Traverse Enter Speak Mute/Deafen Make channel Make temporary Link channel This represents no privileges. This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. This represents the permission to write text messages to other users in this channel. This represents the permission to forcibly remove users from the server. This represents the permission to permanently remove users from the server. This represents the permission to register and unregister users on the server. This represents the permission to register oneself on the server. Whisper Move Text message Kick Ban Register User Register Self Write ACL ChatbarTextEdit Paste and &Send Paste and send <center>Type chat message here</center> ClientUser Friend Authenticated Priority speaker Recording Muted (server) Deafened (server) Local Ignore (Text messages) Local Mute Muted (self) Deafened (self) ConfigDialog Accept changes This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. Reject changes This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. Apply changes This button will immediately apply all changes. Undo changes for current page This button will revert any changes done on the current page to the most recent applied settings. Restore defaults for current page This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. Mumble Configuration ConnectDialog Connecting to %1 Enter username Adding host %1 Servername Hostname Bonjour name Port Addresses Website Packet loss Ping (80%) %1 ms Ping (95%) Bandwidth %1 kbit/s &Connect &Filters Unknown Users Version Failed to fetch server list Mumble Server Connect Ping Remove from Favorites Add custom server Show all servers that respond to ping Show all servers with users Show all servers &Copy Copy favorite link to clipboard &Paste Paste favorite from clipboard &Edit... &Add New... Add to &Favorites Open &Webpage Show &Reachable Show &Populated Show &All ConnectDialogEdit Edit Server Name of the server A&ddress Internet address of the server. Internet address of the server. <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. &Port Port on which the server is listening <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. &Username Username to send to the server <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. Label Add Server You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 Password Password to send to the server <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. Show password <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. Local server label 127.0.0.1 64738 Your username Your password &Fill CoreAudioSystem Default Device CrashReporter Mumble Crash Report <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> Email address (optional) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash Send Report Don't send report Crash upload successful Thank you for helping make Mumble better! Crash upload failed We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 Uploading crash report Abort upload DXAudioInput Default DirectSound Voice Input Opening chosen DirectSound Input device failed. No microphone capture will be done. Opening chosen DirectSound Input failed. Default device will be used. Lost DirectSound input device. DXAudioOutput Default DirectSound Voice Output Opening chosen DirectSound Output failed. Default device will be used. Lost DirectSound output device. Opening chosen DirectSound Output failed. No audio will be heard. Database Mumble failed to initialize a database in any of the possible locations. The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. DeveloperConsole Developer Console DockTitleBar Drag here GlobalShortcut Shortcuts List of configured shortcuts Function Data Shortcut Suppress Add new shortcut This will add a new global shortcut &Add Remove selected shortcut This will permanently remove a selected shortcut. &Remove <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> Open Accessibility Preferences Skip Enable Global Shortcuts <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. Additional Shortcut Engines <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. Enable Windows hooks <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. Enable GKey <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. Enable XInput <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. Enable shortcuts in privileged applications GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> Shortcuts Shortcut button combination. <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. Suppress keys from other applications <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. GlobalShortcutTarget Whisper Target Whisper to list of Users Channel Target Restrict to Group If specified, only members of this group will receive the whisper. List of users Add Remove Modifiers Do not send positional audio information when using this whisper shortcut. Ignore positional audio Shout to Linked channels Shout to subchannels Shout to Channel The whisper will also be transmitted to linked channels. The whisper will also be sent to the subchannels of the channel target. GlobalShortcutX Mouse %1 JackAudioSystem Hardware Ports Mono Stereo LCD Not connected LCDConfig Enable this device LCD Devices Name <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> Size Enabled Views Minimum Column Width <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> This setting decides the width of column splitter. Splitter Width Log Debug Critical Warning Information Server Connected Server Disconnected Other self-muted/deafened Permission Denied Text Message User Joined Server User Left Server User recording state changed User kicked (you or by you) User kicked You self-muted User muted (you) User muted (by you) User muted (other) User Joined Channel User Left Channel You self-unmuted You self-deafened You self-undeafened User renamed You Joined Channel You Joined Channel (moved) User connected and entered channel User left channel and disconnected Private text message the server [[ Invalid size ]] [[ Text object too large to display ]] [Date changed to %1] link to %1 FTP link to %1 player link channel link %1 link LogConfig Toggle console for %1 events Toggle pop-up notifications for %1 events Toggle Text-To-Speech for %1 events Click here to toggle sound notification for %1 events Toggle window highlight (if not active) for %1 events Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. Messages Message Console Notification Text-To-Speech Soundfile Path Text To Speech Volume Volume of Text-To-Speech Engine <b>This is the volume used for the speech synthesis.</b> Length threshold Message length threshold for Text-To-Speech Engine <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. Characters Whisper If checked you will only hear whispers from users you added to your friend list. Only accept whispers from friends If enabled text messages you send will be read back to you with TTS Read back own messages Chat Log Maximum chat length Unlimited Lines Highlight LookConfig System default None Only with users All Ask Do Nothing Move <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory User Interface This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. List users above subchannels (requires restart). <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. Users above Channels <b>If set, will verify you want to quit if connected.</b> Show number of users in each channel Show channel user count Language Language to use (requires restart) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. Look and Feel Layout Classic Stacked Hybrid Custom This changes the behavior when moving channels. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. Expand When to automatically expand channels Channel Dragging Ask whether to close or minimize when quitting Mumble. Ask on quit while connected Always On Top <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> Hide in tray when minimized Hide the main Mumble window in the tray when it is minimized. This setting controls when the application will be always on top. Never Always In minimal view In normal view Displays talking status in system tray Show talking status in tray icon This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. Show context menu in menu bar Apply some high contrast optimizations for visually impaired users Optimize for high contrast Application Adds user and channel context menus into the menu bar Tray Icon Channel Tree Use selected item as the chat bar target Filter automatically hides empty channels Show transmit mode dropdown in toolbar Theme Theme to use to style the user interface <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. User Dragging This changes the behavior when moving users. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. Enable Developer menu When in custom layout mode, checking this disables rearranging. Lock layout MainWindow Root Push-to-Talk Global Shortcut Push and hold this button to send voice. Global Shortcut This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut Reset Audio Processor Global Shortcut Unlink Plugin Global Shortcut Push-to-Mute Global Shortcut Join Channel Global Shortcut Toggle Overlay Global Shortcut Toggle state of in-game overlay. Global Shortcut Toggle Minimal Global Shortcut Volume Up (+10%) Global Shortcut Volume Down (-10%) Global Shortcut Mumble Mumble -- %1 &Window Minimize Ctrl+M Close Mumble is currently connected to a server. Do you want to Close or Minimize it? Mute Self Global Shortcut Set self-mute status. Global Shortcut This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut Deafen Self Global Shortcut Set self-deafen status. Global Shortcut This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut Whisper/Shout Whisper <center>Not connected</center> Not connected Clear Opening URL %1 File does not exist File is not a configuration file. Settings merged from file. URL scheme is not 'mumble' This version of Mumble can't handle URLs for Mumble version %1.%2.%3 Connecting to %1 Enter username Connecting to server %1. Reconnecting. Transmit Mode set to Continuous <p>%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> Register yourself as %1 <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <h2>Version</h2><p>Protocol %1</p> <p>No build information or OS version available</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) The connection is secured by the cipher suite that OpenSSL identifies as %1 <p>The connection provides perfect forward secrecy</p> <p>The connection does not provide perfect forward secrecy</p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> Voice channel is sent over control channel Register user %1 <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> Kicking user %1 Banning user %1 View comment on user %1 Message to channel %1 Connected. <li>Expected certificate digest (SHA-1): %1</li> Server presented a certificate which failed verification. <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> SSL Version mismatch Server connection failed. <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>Type message to user '%1' here</center> Type message to user '%1' here Choose image file Failed to load image Could not open file for reading. Image format not recognized. &User &Channel Use in conjunction with Whisper to. Global Shortcut This will switch the states of the in-game overlay. Global Shortcut Link Channel Global Shortcut Cycle Transmit Mode Global Shortcut Set Transmit Mode to Push-To-Talk Global Shortcut Set Transmit Mode to Continuous Global Shortcut Set Transmit Mode to VAD Global Shortcut Send Text Message Global Shortcut Send Clipboard Text Message Global Shortcut This will send your Clipboard content to the channel you are currently in. Global Shortcut Continuous Voice Activity Push-to-Talk Mumble - Minimal View -- %1 Cancel Save Image As... Save Image File Could not save image: %1 Change your comment Transmit Mode set to Voice Activity Transmit Mode set to Push-to-Talk <p>Connected users: %1/%2</p> UDP Statistics To Server From Server Good Late Lost Resync <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> Mumble Server Information &View Certificate Enter reason Sending message to %1 To %1: %2 Message to %1 Are you sure you want to reset the comment of user %1? Are you sure you want to reset the avatar of user %1? Are you sure you want to delete %1 and all its sub-channels? Sending message to channel %1 Message to tree %1 To %1 (Tree): %2 (Tree) %1: %2 Unmuted and undeafened. Unmuted. Muted. Muted and deafened. Deafened. Undeafened. Restart Mumble? Some settings will only apply after a restart of Mumble. Restart Mumble now? About Qt SSL Verification failed: %1 <li>Server certificate digest (SHA-1): %1</li> <b>WARNING:</b> The server presented a certificate that was different from the stored one. This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. Server connection failed: %1. Disconnected from server. Invalid username You connected with an invalid username, please try another one. Username in use That username is already in use, please try another username. Wrong certificate or password Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. Wrong password Wrong server password for unregistered user account, please try again. Images (*.png *.jpg *.jpeg) C&onfigure &Help Log This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. &Quit Mumble Closes the program Exits the application. Ctrl+Q Open the server connection dialog &Disconnect Disconnect from server Disconnects you from the server. Show information about the server connection This will show extended information about the connection to the server. &Mute &Deafen &Local Mute Send a Text Message Sends a text message to another user. Add new channel This adds a new sub-channel to the currently selected channel. Remove channel This removes a channel and all sub-channels. Edit Groups and ACL for channel This opens the Group and ACL dialog for the channel, to control permissions. &Link Link your channel to another channel This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. Chatbar Shows a dialog of registered servers, and also allows quick-connect. Kick user (with reason) Kick selected user off server. You'll be asked to specify a reason. Mute user Mute or unmute user on server. Unmuting a deafened user will also undeafen them. Kick and ban user (with reason) Kick and ban selected user from server. You'll be asked to specify a reason. Deafen user Deafen or undeafen user on server. Deafening a user will also mute them. Mute user locally Mute or unmute user locally. Use this on other users in the same room. This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. &Unlink Channel Unlink your channel from another channel This unlinks your current channel from the selected channel. Unlinks your channel from all linked channels. This unlinks your current channel (not the selected one) from all linked channels. &Reset Reset audio preprocessor This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. &Mute Self Mute yourself Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. &Deafen Self Deafen yourself Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. &Text-To-Speech Toggle Text-To-Speech Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. Display audio statistics Pops up a small dialog with information about your current audio input. Forcibly unlink plugin This forces the current plugin to unlink, which is handy if it is reading completely wrong data. Configure Mumble Allows you to change most settings for Mumble. Start the audio configuration wizard This will guide you through the process of configuring your audio hardware. &What's This? Enter What's This? mode Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. Information about Mumble Shows a small dialog with information and license for Mumble. Information about Speex Shows a small dialog with information about Speex. Information about Qt Shows a small dialog with information about Qt. Check for &Updates Check for new version of Mumble Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. Sends a text message to all users in a channel. Configure certificates for strong authentication This starts the wizard for creating, importing and exporting certificates for authentication against servers. Register user on server This will permanently register the user on the server. Add &Friend Adds a user as your friend. This will add the user as a friend, so you can recognize him on this and other servers. &Remove Friend Removes a user from your friends. This will remove a user from your friends list. &Update Friend Update name of your friend. Your friend uses a different name than what is in your database. This will update the name. Edit registered users list This opens the editor for registered users, which allow you to change their name or unregister them. Add or remove text-based access tokens &Minimal View Toggle minimal window modes This will toggle minimal mode, where the log window and menu is hidden. You muted and deafened %1. You unmuted and undeafened %1. You undeafened %1. You suppressed %1. %1 muted and deafened by %2. %1 unmuted and undeafened by %2. %1 undeafened by %2. %1 suppressed by %2. %1 moved to %2. %1 moved to %2 by %3. %1 moved in from %2 by %3. %1 is now muted and deafened. Your account information can not be verified currently. Please try again later Welcome message: %1 Mumble: %1 You were denied %1 privileges in %2. %3 was denied %1 privileges in %2. Denied: Cannot modify SuperUser. Denied: Invalid channel name. Denied: Text message too long. Denied: Operation not permitted in temporary channel. You need a certificate to perform this operation. %1 does not have a certificate. Invalid username: %1. Invalid username. Channel is full. Channel nesting limit reached. Channel count limit reached. Need to delete channels before creating new ones. Permission denied. %1 connected and entered channel. %1 connected. %1 is now muted. %1 is now unmuted. Recording started Recording stopped %1 started recording. %1 stopped recording. You revoked your priority speaker status. You assumed priority speaker status. %1 revoked your priority speaker status. %1 gave you priority speaker status. You revoked priority speaker status for %1. You gave priority speaker status to %1. %1 revoked own priority speaker status. %1 assumed priority speaker status. %1 revoked priority speaker status for %2. %1 gave priority speaker status to %2. You were unmuted and undeafened by %1. You were muted by %1. You were undeafened by %1. You were suppressed. You were suppressed by %1. You were unsuppressed. You were unsuppressed by %1. You joined %1. You moved %1 to %2. %1 is recording %1 renamed to %2 by %3. %1 disconnected. Server message from (Tree) (Channel) (Private) %2%1: %3 Failed to load Opus, it will not be available for audio encoding/decoding. The server requests minimum client version %1 The server requests positional audio be enabled. The server requests positional audio be disabled. The server requests Push-to-Talk be enabled. The server requests Push-to-Talk be disabled. You were unmuted by %1. You muted %1. You unsuppressed %1. You unmuted %1. %1 muted by %2. %1 unsuppressed by %2. %1 unmuted by %2. Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. You were muted and deafened by %1. You were deafened by %1. You were kicked from the server by %1: %2. %3 was kicked from the server by %1: %2. You were kicked and banned from the server by %1: %2. %3 was kicked and banned from the server by %1: %2. You were moved to %1 by %2. %1 entered channel. Server connection rejected: %1. Denied: %1. %1 renamed to %2. %1 left channel and disconnected. Message from %1 You have User Dragging set to "Do Nothing" so the user wasn't moved. You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. Unknown Channel Drag mode in UserModel::dropMimeData. Remote controlling Mumble: Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) -jn, --jackname Set custom Jack client name. --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status Invocation Error: No RPC command specified RPC Welcome to Mumble. Skipping version check in debug mode. Hide Frame Toggle showing frame on minimal window This will toggle whether the minimal window should have a frame for moving and resizing. &Unlink All Reset the comment of the selected user. &Join Channel View comment in editor Query server for connection information for user S&erver &Self &Unlink Plugins Register yourself on the server Change your avatar image on this server &Remove Avatar Remove currently defined avatar image. Icon Toolbar Change your own comment Recording Priority Speaker &Copy URL Copies a link to this channel to the clipboard. Ignore Messages Locally ignore user's text chat messages. Silently drops all text messages from the user. Edit ban list on server This lets you edit the server-side IP ban list. &Filter on/off Toggle the channel filter (Ctrl+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. Ctrl+F &Hide Channel when Filtering Reset the avatar of the selected user. Locally adjust the user's speech volume. Opens a dialog with a volume slider. Use this on other users in the same room. &Developer &Hide Mumble Hides the main Mumble window. Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. Show the Developer Console Shows the Mumble Developer Console, where Mumble's log output can be inspected. &Connect... &Ban list... &Information... &Kick... &Ban... Local Volume Adjustment... Send &Message... &Add... &Remove... &Edit... Audio S&tatistics... &Settings... &Audio Wizard... Developer &Console... &About... About &Speex... About &Qt... &Certificate Wizard... &Register... Registered &Users... Change &Avatar... &Access Tokens... Reset &Comment... Reset &Avatar... View Comment... &Change Comment... R&egister... Show Shows the main Mumble window. Manual Manual Mumble Positional Audio Position X Y Z m Heading Azimuth Elevation ° Meta data Context Identity Set State Linked Activated Unhinge NetworkConfig Network Updates are mandatory when using snapshot releases. Connection Use TCP compatibility mode Use TCP compatability mode <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). Reconnect when disconnected <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. Reconnect automatically Proxy Type Type of proxy to connect through Direct connection HTTP(S) proxy SOCKS5 proxy Hostname Hostname of the proxy Force TCP mode Enable QoS to prioritize packets This will enable QoS, which will attempt to prioritize voice packets over other traffic. Use Quality of Service Don't send certificate to server and don't save passwords. (Not saved). <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> Suppress certificate and password storage <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. Port Port number of the proxy <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. Username Username for proxy authentication <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Password Password for proxy authentication <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Mumble services Check for new releases of Mumble automatically. This will check for new releases of Mumble every time you start the program, and notify you if one is available. Check for application updates on startup Check for new releases of plugins automatically. This will check for new releases of plugins every time you start the program, and download them automatically. <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. Submit anonymous statistics to the Mumble project Submit anonymous statistics Reconnect to last used server when starting Mumble Reconnect to last server on startup Download plugin and overlay updates on startup Privacy Prevent OS information being sent to Mumble servers and web servers <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. Do not send OS information to Mumble servers and web servers Overlay Silent Talking Whisper Shout Channel Failed to create communication with overlay at %2: %1. No overlay will be available. OverlayClient Filter Only talking Talking and recently active All in current channel All in linked channels Always show yourself Configure recently active time (%1 seconds)... Columns Sort Alphabetically Last state change Edit... Reset Zoom Configure recently active time Amount of seconds users remain active after talking: OverlayConfig To move the users, drag the little red dot. To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. For more options, right click a user. For more options, rightclick a user. Launcher Filter Overlay Choose executable Choose application Choose path Load Overlay Presets Mumble overlay presets (*.mumblelay) Save Overlay Presets Options Enable overlay. Enable Overlay This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. Layout Blacklist Whitelist Uninstall Overlay Overlay Installation Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. Install Mumble Overlay Overlay Upgrade Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. Upgrade Mumble Overlay Display a frame counter in the overlay Show FPS counter Load an overlay preset from file Load… Save your overlay settings to file Save… Set the overlay font. Set the overlay text color. Color Remove Font FPS and Clock Display Display a clock in the overlay showing the current local time (system time). Show Clock Overlay Exceptions Overlay Exception Mode Allowed launchers Add Allowed programs Allowed paths Blacklisted programs OverlayEditor State User is not talking Passive User is talking in your channel or a linked channel Talking User is whispering to you privately Private Whisper User is shouting to your channel Channel Whisper Zoom Zoom Factor Enabled Elements User avatar, chosen by each user Avatar User's name Username Name of user's channel, if outside your current channel Channel Muted or deafened Mute state Bounding box, automatically shrunk to minimum size to contain all visible elements Bounding box Overlay Editor OverlayEditorScene Layout preset Large square avatar Avatar and Name User Opacity %1% Object Opacity Alignment Left Center Right Top Bottom Color... Font... Bounding box Pen width Padding Pen color Fill color Pick pen color Pick fill color Pick color Pick font PluginConfig Plugins Plugin has no configure function. Plugin has no about function. Options Enable plugins and transmit positional information This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. Link to Game and Transmit Position Reloads all plugins This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. &Reload plugins Information about plugin This shows a small information message about the plugin. &About Show configuration page of plugin This shows the configuration page of the plugin, if any. &Configure Name Enabled Plugins Skipping plugin update in debug mode. Downloaded new or updated plugin to %1. Failed to install new plugin to %1. %1 lost link. %1 linked. PortAudioSystem Default Device PulseAudioSystem Default Input Default Output QApplication Failed to restart mumble Mumble failed to restart itself. Please restart it manually. RichTextEditor Failed to load image Image file too large to embed in document. Please use images smaller than %1 kB. Message is too long. Display Source Text &Bold Ctrl+B &Italic Italic Ctrl+I Underline Ctrl+U Color Insert Link Ctrl+L Insert Image RichTextEditorLink Add Link URL Text ServerHandler Unable to resolve hostname Server is not responding to TCP pings UDP packets cannot be sent to or received from the server. Switching to TCP mode. UDP packets cannot be sent to the server. Switching to TCP mode. UDP packets cannot be received from the server. Switching to TCP mode. UDP packets can be sent to and received from the server. Switching back to UDP mode. Connection timed out ServerView Favorite LAN Public Internet Unknown Africa Asia North America South America Europe Oceania ShortcutActionWidget Unassigned ShortcutDelegate On Off Toggle Unassigned ShortcutKeyWidget Press Shortcut ShortcutTargetDialog Root Parent Current Subchannel #%1 ShortcutTargetWidget ... , Root Parent Current Subchannel #%1 Invalid Empty <Empty> ShortcutToggleWidget Off Toggle On TextMessage Enter text If checked the message is recursively sent to all subchannels Send recursively to subchannels Tokens Empty Token Mumble - Access Tokens List of access tokens on current server <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. Add a token &Add Remove a token &Remove UserEdit Registered Users Remove Rename Who are you looking for? Days Weeks Months Years Inactive for Registered users: %n account(s) UserInformation User Information Connection Information Version OS Certificate IP Address CELT Versions Details... Ping Statistics Pings received Average ping TCP (Control) UDP (Voice) UDP Network statistics Good Late Lost Resync From Client To Client Connection time %1w %1d %1h %1m %1s , %1 (%2) %1.%2.%3 (%4) Supported Not Supported Not Reported %1 online (%2 idle) %1 online %1 kbit/s Bandwidth GroupBox Bandwidth Label Ping deviation UserListModel Nick Inactive days Last channel Last seen: %1 Never Channel ID: %1 UserLocalVolumeDialog Local volume for other users <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. Adjusting local volume for %1 dB <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: Talking to your channel. Shouting directly to your channel. Whispering directly to your channel. Whispering directly to you. Not talking. This is a channel on the server. The icon indicates the state of the channel: Your current channel. A channel that is linked with your channel. Linked channels can talk to each other. A channel on the server that you are not linked to. This shows the flags the user has on the server, if any: On your friend list Authenticated user Muted (manually muted by self) Muted (manually muted by admin) Muted (not allowed to speak in current channel) Muted (muted by you, only on your machine) Muted (push-to-mute) Deafened (by self) Deafened (by admin) User has a new comment set (click to show) User has a comment set, which you've already seen. (click to show) Ignoring Text Messages This shows the flags the channel has, if any: Channel has a new comment set (click to show) Channel has a comment set, which you've already seen. (click to show) Channel will be hidden when filtering is enabled Name Flags Are you sure you want to drag this user? Are you sure you want to drag this channel? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. VersionCheck Upgrade Mumble A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? Failed to launch snapshot installer. Corrupt download of new version detected. Automatically removed. Downloading new snapshot from %1 to %2 Failed to write new version to disk. Failed to write new version to disc. Mumble failed to retrieve version information from the central server. ViewCert Certificate Chain Details Certificate chain Certificate details Common Name Organization Subunit Country Locality State Valid from: %1 Valid to: %1 Serial: %1 Public Key: %1 bits %2 RSA DSA Digest (SHA-1): %1 Digest (SHA-256): %1 Email: %1 DNS: %1 Issued by: Unit Name VoiceRecorder Recorder failed to create directory '%1' Recorder failed to open file '%1' .wav - Uncompressed .ogg (Vorbis) - Compressed .au - Uncompressed .flac - Lossless compressed VoiceRecorderDialog Recorder Control 00:00:00 &Start S&top Mode Multichannel Output Output format Target directory Filename &Browse... Valid variables are: Inserts the user's name Inserts the current date Inserts the current time Inserts the hostname Recorder still running Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? Unable to start recording. Not connected to a server. The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. There is already a recorder active for this server. Please select a recording format. Stopping Select target directory Downmix WASAPIInput Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone. WASAPISystem Default Device qwPTTButtonWidget Mumble PTT Push to talk mumble-1.3.4/src/mumble/BonjourClient.cpp0000664000175000017500000000155214010707273020175 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "BonjourClient.h" #include "BonjourServiceBrowser.h" #include "BonjourServiceResolver.h" BonjourClient::BonjourClient() { bsrResolver = NULL; bsbBrowser = NULL; #ifdef Q_OS_WIN HMODULE hLib = LoadLibrary(L"DNSSD.DLL"); if (hLib == NULL) { qWarning("Bonjour: Failed to load dnssd.dll"); return; } FreeLibrary(hLib); #endif bsbBrowser = new BonjourServiceBrowser(this); bsbBrowser->browseForServiceType(QLatin1String("_mumble._tcp")); bsrResolver = new BonjourServiceResolver(this); return; } BonjourClient::~BonjourClient() { delete bsbBrowser; delete bsrResolver; } mumble-1.3.4/src/mumble/SharedMemory_unix.cpp0000664000175000017500000000446214010707273021065 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "SharedMemory.h" #include #include #include #include #include #include struct SharedMemory2Private { int iShmemFD; }; SharedMemory2::SharedMemory2(QObject *p, unsigned int minsize, const QString &memname) : QObject(p) { a_ucData = NULL; d = new SharedMemory2Private(); d->iShmemFD = -1; int prot = PROT_READ; if (memname.isEmpty()) { prot |= PROT_WRITE; for (int i=0;i<100;++i) { qsName = QString::fromLatin1("/MumbleOverlayMemory%1").arg(++uiIndex); d->iShmemFD=shm_open(qsName.toUtf8().constData(), O_RDWR|O_CREAT|O_EXCL, 0600); if (d->iShmemFD != -1) { if (ftruncate(d->iShmemFD, minsize) == 0) { break; } else { close(d->iShmemFD); d->iShmemFD = -1; shm_unlink(qsName.toUtf8().constData()); } } } } else { qsName = memname; d->iShmemFD=shm_open(qsName.toUtf8().constData(), O_RDONLY, 0600); } if (d->iShmemFD == -1) { qWarning() << "SharedMemory2: Failed to open shared memory segment" << qsName; return; } struct stat buf; fstat(d->iShmemFD, &buf); unsigned int memsize = static_cast(buf.st_size); if (memsize < minsize) { qWarning() << "SharedMemory2: Segment too small" << memsize << minsize; } else if (memsize > std::numeric_limits::max()) { qWarning() << "SharedMemory2: Segment too big" << memsize; } else { a_ucData = reinterpret_cast(mmap(NULL, minsize, prot, MAP_SHARED, d->iShmemFD, 0)); if (a_ucData != reinterpret_cast(-1)) { uiSize = memsize; return; } qWarning() << "SharedMemory2: Failed to map shared memory segment" << qsName; a_ucData = NULL; } close(d->iShmemFD); d->iShmemFD = -1; shm_unlink(qsName.toUtf8().constData()); } SharedMemory2::~SharedMemory2() { systemRelease(); if (a_ucData) { munmap(a_ucData, uiSize); a_ucData = NULL; } } void SharedMemory2::systemRelease() { if (d->iShmemFD != -1) { close(d->iShmemFD); d->iShmemFD = -1; shm_unlink(qsName.toUtf8().constData()); } } mumble-1.3.4/src/mumble/mumble_nb_NO.ts0000664000175000017500000140164014010707274017624 0ustar builderbuilder ACLEditor Deny Nekt Allow Tillat Allow %1 Tillat %1 Deny %1 Nekt %1 Mumble - Add channel Mumble - Legg til kanal Default server value Forvalgt tjenerverdi Failed: Invalid channel Feilet: Ugyldig kanal Mumble - Edit %1 Mumble - Rediger %1 ID: %1 ID: %1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Dette gir %1-privilegiet. Hvis et privilegie både er gitt og nektet, blir det nektet.<br />%2 Channel must have a name Kanalen må ha et navn. This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Dette tilbakekaller %1-priviligiet. Hvis et privilegium både er nektet og gitt, blir det nektet.<br />%2 Dialog Dialog Name Navn Enter the channel name here. Skriv inn navnet på kanalen her. Description Beskrivelse Password Passord Enter the channel password here. Skriv inn kanalpassord her. Check to create a temporary channel. Huk av for å lage en midlertidig kanal. Temporary Midlertidig <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Plassering</b><br/> Denne verdien lar deg endre måten Mumble arrangerer kanalene i treet. En kanal med høyere <i>plasserings</i>-verdi vil allti bli plassert under en med lavere verdi og omvendt. Hvis <i>posisjons</i>verdien er den samme for to kanaler, vil de bli sortert alfabetisk. Position Plassering &Groups &Grupper Group Gruppe List of groups Liste over grupper Remove selected group Fjern valgt gruppe Remove Fjern Inherit group members from parent Arv gruppemdlemmer fra forelder Inherit Arv Make group inheritable to sub-channels Gjør gruppen arvbar for underkanaler Inheritable Arvbar Group was inherited from parent channel Gruppen ble nedarvet fra opphavskanalen Inherited Nedarvet Members Medlemmer Add Legg til Add member to group Leg til medlem i gruppe Remove member from group Fjern medlem fra gruppe &ACL &ACL Active ACLs Aktive ACL-er List of entries Liste over oppføringer Inherit ACL of parent? Arv ACL fra forelder? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. Dette velger hvorvidt ACL-er oppover i kjeden av opphavskanaler skal ha innvirkning på dette objektet. Bare oppføringer som er markert i opphav som "Oppføring skal ha innvirkning på underkanaler" vil nedarves. Inherit ACLs Arv ACL-er Move entry up Flytt oppføring opp This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. Dette flytter oppføringen oppover på listen. En oppføring tas hensyn til i rekkefølge, dette kan endre de faktiske tilgangene brukerne har. Du kan ikke flytte en oppføring over en som er nedarvet. Hvis du virkelig trenger det må du lage en kopi av den nedarvede oppføringen. &Up &Oppover Move entry down Flytt oppføring ned This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. Dette flytter oppføringen nedover på lista. Siden oppføringer tas hensyn til i denne rekkefølgen, kan det endre de faktiske tilgangene brukerne har. &Down &Ned Add new entry Legg til ny oppføring This adds a new entry, initially set with no permissions and applying to all. Dette legger til en ny oppføring, oppstartsvis uten tillatelser, gjeldende for alle. &Add &Legg til Remove entry Fjern oppføring This removes the currently selected entry. Dette fjerner valgt oppføring. &Remove &Fjern Context Bindeleddsinformasjon Entry should apply to this channel. Entry should apply to this channel Oppføring burde ha med kanalen å gjøre. This makes the entry apply to this channel. Dette anvender oppføringen på denne kanalen. Applies to this channel Gjelder for denne kanalen Entry should apply to sub-channels. Regelen skal ha innvirkning på underkanaler. Add new group Legg til ny gruppe <b>Add</b><br/> Add a new group. <b>Legg til</b><br/> Legg til en ny gruppe Inherited members Arvede medlemmer Contains the list of members added to the group by this channel. Inneholder listen over medlemmer lagt til i gruppen av denne kanalen. Contains a list of members whose group membership will not be inherited from the parent channel. Inneholder en liste over medlemmer hvis gruppemedlemskap ikke vil nedarves fra opphavskanalen. Contains the list of members inherited by other channels. Inneholder listen over brukere nedarvet fra andre kanaler. Type in the name of a user you wish to add to the group and click Add. Skriv navnet på en bruker du vil tilføye gruppen og klikk Legg til. Type in the name of a user you wish to remove from the group and click Add. Skriv inn navnet på en bruker du ønsker å fjerne fra gruppen og klikk Legg til. Exclude Utelukk Excluded members Utelukkede medlemmer This makes the entry apply to sub-channels of this channel. Dette anvender oppføringen på denne kanalens underkanaler. Applies to sub-channels Har innvirkning på underkanaler Permissions Tillatelser User/Group Bruker/Gruppe Group this entry applies to Gruppen denne oppføringen har innvirkning på User ID Bruker-ID User this entry applies to Brukere denne oppføringen har innvirkning på This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. Dette kontrollerer hvilken bruker oppføringen har innvirkning på. Skriv inn brukernavnet og trykke enter for å spørre tjeneren om noe som stemmer overens. &Properties &Egenskaper <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>Navn</b><br />Skriv inn kanalnavnet i dette feltet. Navnet må følge restriksjonen som kommer fra tjeneren du er koblet til. <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>Midlertidig</b><br /> Når uthaket vil kanalen som blir opprettet bli markert som midlertidig. Dette betyr at når den siste spilleren forlater kanalen vil den bli automatisk slettet på tjeneren. <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>Gruppe</b><br /> Disse er alle grupper definert for kanalen. For å opprette en ny gruppe, skriv in navnet og trykk enter. <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>Fjern</b><br />Fjerner valgt gruppe. Hvis gruppen var nedarvet, vil den ikke bli fjernet fra listen, men all lokal informasjon om gruppen vil bli fjernet. <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>Nedarv</b><br />Dette arver alle medlemmene i gruppen fra sin forelder, hvis gruppen er markert som <i>Arvbar</i> i stamkanalen. <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>Arvbar</b><br />Dette gjør denne gruppen arvbar for underkanaler. Hvis gruppen er ikke-arvbar kan underkanaler fremdeles opprette en ny gruppe med det samme navnet. <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>Arvet</b><br />Dette indikerer at gruppen ble nedarvet fra en stamkanal. Du kan ikke redigerer dette flagget, det er der bare av informasjonshensyn. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>Members</b><br /> Denne listen inneholder medlemmer som ble lagt til gruppen av den nåværende kanalen. Merk at dette ikke inkluderer medlemmer nedarvet fra høyere nivåer i kanaltreet. Disse kan finnes i listen over <i>Arvede medlemmer</i>. For å forhindre denne listen i å bli arvet av lavere kanaler, kan du fravelge <i>Arvbar</i> eller manuelt legge til medlemmene i listen over <i>Ekskluderte medlemmer</i>. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>Ekskluderte medlemmer</b><br /> Inneholder en liste over medlemmer hvis gruppemedlemskap ikke vil bli arvet fra opphavskanalen. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. <b>Arvede medlemmer</b><br /> Inneholder en liste over medlemmer arvet av den nåværende kanalen. Fravelg <i>Arv</i> for å forhindre dem fra å bli arvet av høyere kanaler. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. Dette kontrollerer hvilken gruppe brukere denne regelen gjelder for.<br />Vær oppmerksom på at gruppen blir evaluert i sammenheng med kanalen som reglen er brukt i. F.eks. gir forvalgt ACL på rot-kanalen <i>Skrive</i>-rettigheter til <i>admin</i>-gruppen. Denne regelen, hvis den er arvet fra en kanal, vil gi en bruker skrive-rettigheter om den er medlem i <i>admin</i>-gruppen i den kanalen, også selvom brukeren ikke tilhører <i>admin</i>-gruppen i den kanalen den opprinnelige ACL-en er satt.<br />Hvis et gruppenavn starter med et '!', blir gruppens medlemskap opphevet, og hvis det starter med '~', blir gruppen evaluert i kanalen dens ACL er definert i, i stedet for at kanalen dens ACL er aktiv i.<br />Hvis et gruppenavn starter med en '#', blir det lest som et tilgangssymbol. Brukere må ha skrevet inn det som står etter '#', i deres liste over tilgangssymboler for å samsvare. Dette kan brukes til meget simpel adgangskodebasert adgang til kanaler, for brukere som ikke er identitetsbekreftet.<br />Hvis et gruppenavn starter med '$', vil det kun samsvare med brukere, hvis sertifikat-sjekksum samsvarer med det som kommer etter '$'.<br />Noen få spesielle forutdefinerte grupper er:<br /><b>all</b> - Alle vil samsvare.<br /><b>auth</b> - Alle identitetsbekreftede brukere vil samsvare.<br /><b>sub,a,b,c</b> - Brukere som i øyeblikket er i en underkanal med minimum <i>a</i> felles opphav, og mellom <i>b</i> og <i>c</i> kanaler nedover i rekken. Se nettstedet for mere omfattende dokumentasjon om dette.<br /><b>in</b> - Brukere som i øyeblikket er i kanalen vil samsvare (en fordel for '<i>sub,0,0,0</i>').<br /><b>out</b> - Brukere utenfor kanalen vil samsvare (en fordel for '<i>!sub,0,0,0</i>').<br />Merk at en oppføring gjelder for enten én bruker eller en gruppe, men aldri begge. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. <b>Passord</b><br />Dette feltet lar deg enkelt velge og endre passordet for en kanal. Det bruker Mumble sine tilgangssymbolfunsksjon i bakgrunnen. Bruk ACL-er og grupper hvis du trenger mer finstemt og kraftigere tilgangskontroll. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. Dette viser alle oppføringene som er aktive i denne kanalen. Oppføringer arvet fra opphavskanaler vil bli vist i kursiv.<br />ACL-er blir tatt stilling til fra topp til bunn, noe som betyr at prioritet øker ettersom du forflytter deg nedover på listen. ID of the channel. Kanalens ID. Maximum Users Maksimalt antall brukere Maximum number of users allowed in the channel Maksimalt antall brukere tillatt i denne kanalen <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. <b>Maksimalt antall brukere</b><br /> Denne verdien gjør at du setter maksimalt antall brukere tillatt i kanalen. Hvis verdien er over null, vil bare det antallet brukere bli tillatt i kanalen. Hvis verdien er null, er maksimalt antall brukere i kanalen gitt av tjenerens forvalgte grense. This is the sort order for the channel. Dette er sorteringsrekkefølgen for kanalen. ALSAAudioInput Default ALSA Card Forvalgt ALSA-kort Opening chosen ALSA Input failed: %1 Åpning av valgt ALSA-inngang feilet: %1 ALSAAudioOutput Default ALSA Card Forvalgt ALSA-kort Opening chosen ALSA Output failed: %1 Kunne ikke åpne valgt ALSA-utgang: %1 ASIOConfig %1 (version %2) %1 (versjon %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz %1 -> %2 datapunkters hurtiglager, med %3 samplingsoppløsning (%4 foretrukket) på %5 Hz ASIO Initialization failed: %1 Igangsetting av ASIO mislyktes: %1 Failed to instantiate ASIO driver Klarte ikke å igangsette ASIO-driver ASIO ASIO Form Skjema Device selection Valg av enhet Device Enhet Device to use for microphone Enhet til bruk som mikrofon This chooses what device to query. You still need to actually query the device and select which channels to use. Velger hvilken enhet som skal spørres. Du må fremdeles spørre enheten og hvilke kanaler den skal bruke. Query selected device Spør valgt enhet This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. Dette spør valgt enhet etter kanaler. Merk at mange ASIO-drivere er feilaktige til det ekstreme, og å spørre dem kan forårsake et kræsj av enten programmet eller systemet. &Query &Spørring Configure selected device Sett opp valgt enhet This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. Dette setter opp den valgte enheten. Merk at mange ASIO-drivere er feilaktige til det ekstreme, og å spørre dem kan forårsake et kræsj av enten programmet eller systemet. &Configure &Sett opp Capabilities Evner Driver name Drivernavn Buffer size Størrelse på mellomlager This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. Dette vil sette opp lydinnganger for ASIO. Forsikre deg om at du har minst én kanal som mikrofon og høytaler. <i>Mikrofon</i> burde være der mikrofonen din er innkoblet, og <i>Høyttaler</i> burde være en kanal som sampler '<i>Det du hører</i>'.<br />For eksempel, på Audigy 2 ZS, vil et bra valg for mikrofon være '<i>Mic L</i>' mens høytaler burde være '<i>Mix L</i>' og '<i>Mix R</i>'. Configure input channels Sett opp inndatakanaler Channels Kanaler Microphone Mikrofon <- <- -> -> Unused Ubrukt Speakers Høytalere ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. Du trenger ihvertfall én mikrofon og en høytalerkilde for å bruke ASIO. Hvis du bare trenger mikrofonsampling, bruk DirectSound. Opening selected ASIO device failed. No input will be done. Åpning av valgt ASIO-enhet feilet. Ingen inndataenhet vil bli lagt til. AboutDialog About Mumble Om Mumble <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> <h3>Mumble (%1)</h3><p>%3</p><p><b>Et prateverktøy for spillere</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble &Om Mumble &License &Lisens A&uthors &Utviklere &Third-Party Licenses %Tredjepartslisenser OK OK AudioInput Form Skjema Interface Grensesnitt System System Input method for audio Inndatametode for lyd <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Inndatametode til bruk for lyd.</b><br />Antageligvis ønsker du å bruke DirectSound. Device Enhet Input device for audio Inndataenhet for lyd <b>This is the input device to use for audio.</b> <b>Inndataenhet til bruk for lyd.</b> Transmission Overøring &Transmit &Overfør When to transmit your speech Når du ønsker å overføre lyd <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. <b>Angir når tale skal overføres.</b><br /><i>Sammenhengende</i> - Hele tiden<br /><i>Stemmeaktivitet</i> - Når du snakker rent.<br /><i>Trykk-for-å-snakke</i> - Når du holder ned tastatursnarveien i <i>Tastatursnarveier</i>. DoublePush Time Dobbelttrykkstid If you press the PTT key twice in this time it will get locked. Hvis du trykker to ganger på trykk-for-å-snakke -knappen innenfor denne tidsrammen, vil den bli låst. <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. <b>Dobbelttrykkstid</b><br />Hvis du brukker trykk-for-å-snakke -tasten to ganger under tidsavgrensningen vil den låses. Forsendelse vil fortsette til du trykker igjen for å låse opp tasten igjen. Reset audio cue to default Nullstill lydhint til forvalg <b>Reset</b><br/>Reset the paths for the files to their default. <b>Nullstill</b><br/>Tilbakestiller stien for filene til forvalget. Browse for on audio file Utforsk for lydfil Browse for off audio file Se etter en lydfil for forsendelsesslutt Off Av On Påslått Preview the audio cues Prøvehør lydhintene Use SNR based speech detection Bruk signal-til-støy -basert stemmeoppdagelse Signal to Noise Signalforhold <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. <b>Dette valget vil bruke amplitude for stemmeoppdaging.</b><br />I dette moduset er det den råe styrken til inngangssignalet som brukes for å oppdage tale. Amplitude Amplitude Voice &Hold Tid på &gløtt for stemme How long to keep transmitting after silence Hvor lang tid skal forsendelse fortsettes etter at det har blitt stille Silence Below Fortiet under <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. <b>Dette setter utløserfunksjonsverdier for stemmeoppdaging.</b><br />Bruk dette sammen med lydstatistikk-vinduet for å manuelt justere dem. Inndataverdier som "Stille under" teller alltid som stillhet. Verdier over "Tale over" teller alltid som tale. Verdier imellom vil telle som tale hvis du allerede snakker, men vil ikke utløse ny oppdagelse. Speech Above Tale høyere enn Signal values above this count as voice Signalverdier over dette teller som tale Compression Kompresjon &Quality &Kvalitet Quality of compression (peak bandwidth) Kvalitet på komprimering (toppnivå for båndbredde) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. <b>Kvalitetsinstilling for komprimering.</b><br />Dette bestemmer hvor mye båndbredde Mumble skal tillates å bruke for utgående lyd. Audio per packet Lyd per pakke How many audio frames to send per packet Antall lydrammer å sende per pakke <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>Dette angir hvir mange lydrammer som skal puttes i en pakke.</b><br />Å øke dette vil heve forsinkelsen for din stemme, men vil også senke båndbreddekrav. <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). <b>Dette viser toppnivået for brukt utgående båndbredde.</b><br /> Dvs, akkurat i det tidspunktet der du sendte ut mest data. Lydbitraten er den maksimale bitraten (siden vi bruker VBR) for lyddataen alene. Posisjon er bitraten brukt for posisjonsbasert informasjon. Overskudd er vår innramming og IP-pakke hodene (IP og UDP er 75% av overskuddsdataen). Audio Processing Lydbehandling Noise Suppression Støydempning Noise suppression Støydempning <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. <b>Velger mengden støydempning som skal utføres</b><br />Desto høyere verdi, desto mer undertrykking av transmisjonsstøy. Maximum amplification of input sound Maksimal forsterkning av inndatalyd <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. <b>Maksimal forsterkning av opptak</b><br />Mumble normaliserer innspillings-lydstyrken før komprimering, og dette har innvirkning på hvor mye Mumble forsterker.<br />Det egentlige nivået blir hele tiden oppdatert basert på det nåværende talemønster, men det vil aldri komme over nivået angitt her.<br />Hvis <i>Mikrofon lydstyrke</i>-nivået ligger omkring 100%, skal du sannsynligvis sette denne til 2.0 eller deromkring, men hvis du som de fleste folk ikke er i stand til at oppnå 100%, skal du sette denne til noe mye høyere.<br />Ideelt sett skal du sette den til <i>Mikrofon lydstyrke * forsterkningsfaktor >= 100</i>, selv når du snakker lavt.<br /><br />Merk at det ikke gjør noe hvis du setter denne til maksimum, men Mumble vil begynne å plukke opp andre samtaler, hvis du lar det justere dette nivået automatisk. Current speech detection chance Nåværende sjanse for stemmeoppdagelse Cancel echo from speakers Lydkansellering av ekko fra høytalere Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. Å skru på dette vil kansellere ekko fra høytalerne dine. Miksing har liten innvirkning på CPU bruk, men fungerer bare bra hvis høytalerne dine har samme lydstyrke og hver av dem er like langt unna mikrofonen. Multikanals ekko-kansellering gir mye bede resultater, men til en høyere CPU-pris. Disabled Avskrudd <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>Dette setter stemmeoppdagelse til å bruke signal-til-støy -forhold</b><br />I dette moduset blir inngangssignalet analysert for noe som ligner på et rent signal, og renheten på det signalet brukes for å igangsette stemmeoppdagelse. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>Dette viser gjeldende stemmeoppdagelses-innstillinger</b><br />Du kan endre disse innstillingene fra innstillingsdialogen eller fra lydveiviseren. Signal values below this count as silence Signalverdier under dette anses som stillhet Maximum bandwidth used for sending audio Maksimal båndbredde brukt til forsendelse av lyd Use Amplitude based speech detection Bruk amplitudebasert stemmeoppdagelse <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). <b>Dette velger hvor lenge etter et antatt stopp i taleoverføringen den skal fortsette.</b><br />Sett denne høyere hvis du blir hakkete (kan ses som en raskt blinkende stemmeikon ved siden av navnet ditt). Exclusive mode Eksklusivt modus <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>Dette åpner enheten i eksklusivt modus.</b><br />Inget annet program vil kunne bruke enheten. Exclusive Eksklusiv R&eset &Tilbakestill &Browse... &Bla gjennom... B&rowse... &Surf… &Preview &Forhåndsvisning <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. <b>Forhåndslytt</b><br/>Spiller nåværende <i>på</i>-lyd, etterfulgt av nåværende <i>av</i>-lyd. Displays an always on top window with a push to talk button in it Viser et vindu som alltid er i forgrunnen med en trykk-for-å-snakke knapp Display push to talk window Vis trykk-for-å-snakke -vindu Misc Ymse Audible audio cue when starting or stopping to transmit Hørbar lydhint når lydoverføring stoppes eller startes <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. <b>Dette skrur på lydhint for lydoverføringer.</b><br />Å sette på dette vil gi deg et kort pip når du starter og slutter overføring. Audio cue Lydhint Gets played when starting to transmit Spilles når lydoverføring starter Gets played when stopping to transmit Spilles når lydoverføring stopper Hold Time Tid på gløtt Time the microphone stays open after the PTT key is released Tiden mikrofonen går for åpent hus etter at trykk-for-å-snakke -knappen har blitt sluppet Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) Tjenerens maksimumsbåndbredde er bare %1 kbit/s. Lydkvalitet auto-justert til %2 kbit/s (%3 ms) Max. Amplification Maks. forsterkning Idle action Lediggangshandling minutes do minutter utfør nothing ingenting deafen gjør døv mute stum after etter Echo Cancellation Ekko-kansellering Mixed echo cancellation Blandet ekko-kansellering Multichannel echo cancellation Multikanals ekko-kansellering The idle action will be reversed upon any key or mouse button input Lediggangshandlingen vil motvirkes ved enhver annen tast eller musebevegelse Undo Idle action upon activity Fjern lediggangshandling ved aktivitet AudioInputDialog Continuous Sammenhengende Voice Activity Stemmeaktivitet Push To Talk Trykk for å snakke Audio Input Lydinngang %1 ms %1 ms Off Av %1 s %1 s %1 kb/s %1 kb/s -%1 dB -%1 dB %1 kbit/s (Audio %2, Position %4, Overhead %3) %1 kbit/s (Lyd %2, Posisjon %4, Overskudd %3) AudioOutput Form Skjema Interface Grensesnitt System System Output method for audio Utdatametode for lyd <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Dette er utdatametoden til bruk for lyd.</b><br/>Du vil mest sannsynlig ønske å bruke DirectSound. Device Enhet Output device for audio Utdataenhet for lyd <b>This is the output device to use for audio.</b> <b>Dette er utdataenheten til bruk for lyd.</b> Positional Audio Posisjonell lyd Audio Output Lydutdata Default &Jitter Buffer Forvalgt &jutter-hurtiglager Safety margin for jitter buffer Sikkerhetsmargin for jitterhurtiglager <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. <b>Dette setter minimum sikkerhetsmargin for jitterhurtiglageret.</b><br />All innkommende lyd hurtiglagres, og jitterhurtiglageret prøver kontinuerlig å redusere seg selv til det minimum som er bærekraftig på ditt nettverk, slik at forsinkelsen kan være så lav som mulig. Hvis begynnelsen på setninger du hører har mye jitter, øk denne verdien. Minimum distance to user before sound volume decreases Minimumsdistanse til bruker før lydvolum senkes This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. Minimumsdistanse for lydutregninger. Lydstyrken på andre brukeres tale vil ikke senkes til de er ihvertfall denne avstanden unna deg. This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. Dette setter maksimal avstand for lydutregninger. Når du er lenger unna enn dette vil andres stemme ikke bli dempet ytterligere. <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. <b>Dette skrur på ett av testmodusene for nøytal tilbakekobling.</b><br /><i>Ingen</i> - Nøytral tilbakekobling avskrudd<br /><i>Lokal</i> - Emuler en lokal tjener.<br /><i>Tjener</i> - Forespør nøytral tilbakekobling fra tjener.<br />Merk at når nøytral tilbakekobling er påskrudd, vil brukere ikke lenger høre stemmen din. Denne innstillingen blir ikke lagret ved programslutt. Volume Lydstyrke Volume of incoming speech Lydstyrke for innkommende tale <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. <b>Dette justerer lydstyrke på innkommende tale.</b><br />Økning utover 100% betyr forvrenging. Output Delay Tidsforsinkelse for utdata Amount of data to buffer Mengden data som skal hurtiglagres The connected "speakers" are actually headphones The connected "speakers" are actually headphones. De tilkoblede "høyttalerne" er faktisk hodetelefoner Factor for sound volume decrease Faktor for lydstyrkesenkning Bloom Glød Factor for sound volume increase Faktor for lydstyrkeøkning How much should sound volume increase for sources that are really close? Hvor mye skal lydstyrken økes for kilder som er virkelig nære? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. Uthaking av denne indikerer at du ikke har høyttalere tilkoblet, bare hodetelefoner. Dette er viktig, siden høyttalere vanligvis er foran deg, mens hodetelefoner er direkte på sidene. This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Dette angir mengden data som skal hurtiglagres i utdatahurtiglageret. Eksperimenter med forskjellige verdier og sett til den laveste verdien som ikke forårsaker rask jitter i lyden. Headphones Hodetelefoner Minimum Distance Minimumsavstand Maximum Distance Maksimumsavstand Maximum distance, beyond which speech volume won't decrease Maksimal distanse, etter dette vil ikke lydstyrkenivået for tale senkes Minimum Volume Minimum lydstyrkenivå What should the volume be at the maximum distance? Hva skal lydstyrken være på maksimalt hold? Loopback Test Lydsløyfetest Delay Variance Forsinkningsvariasjon Variance in packet latency Variasjon for pakkesvartid <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>Setter variasjon i pakkeforsinkelse for nøytral tilbakekoblingstesting.</b><br />De fleste lydveier inneholder en del variabel forsinkelse. For eksempel hvis du setter dette til 15ms, vil det emulere et nettverk med 20-35 ms spørringsforsinkelse eller et med 80-95ms forsinkelse. De fleste tilkoblinger for konsumenter har en forsinkelse på omentrent 5ms. Packet Loss Pakketap Packet loss for loopback mode Pakketap for lydsløyfemodus <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% <b>Dette setter pakketap for nøytralt tilbakekoblingsmodus</b><br />Forholdet på pakker som går tapt. Om ikke din utgående båndbredde er helt i taket eller det er noe galt med din nettverkstilkobling, vil dette være 0% &Loopback &Lydsløyfe Desired loopback mode Ønsket nøytralt tilbakekoblingsmodus Attenuate applications by... Senk lydnivå på andre programmer med… Attenuation of other applications during speech Senkning av andre programmer under tale <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. <b>Senk lydstyrken på andre programmer under tale</b><br />Mumble støtter senkning av lydstyrken på andre programmer under innkommende og/eller utgående tale. Dette senker lydstyrken på andre programmet hvis funksjonen slås på. If checked Mumble lowers the volume of other applications while other users talk Hvis påslått vil Mumble senke lydstyrken på andre programmer mens andre brukere snakker <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. <b>Senk lydstyrken på andre programmer mens brukere snakker</b><br />Mumble støtter senkning av lydstyrken på andre programmer under innkommende og/eller utgående tale. Dette får Mumble til å aktivere funksjonen mens andre brukere snakker til deg. while other users talk mens andre snakker If checked Mumble lowers the volume of other applications while you talk Ved å skru på dette vil andre samtaledeltagere bli dempet mens du snakker. <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. <b>Senk lydstyrken på programmer mens du snakker</b><br />Mumble støtter senkning av lydstyrken på andre programmer under innkommende og/eller utgående tale. Dette senker lydstyrken på andre programmet hvis funksjonen slås på. while you talk mens du snakker Exclusive mode, not recommended. Ekslusiv modus, ikke anbefalt <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>Dette åpner enheten i eksklusivt modus.</b><br />Ingen andre programmer vil kunne bruke enheten. Exclusive Eksklusiv Priority Speaker Prioritert taler If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. Hvis valgt vil Mumble senke lydstyrken på andre brukere mens du snakker hvis du har "Prioritert taler"-status. <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. <b>Senk andres lydnivå mens du snakker som prioritert taler.</b><br />Senker andres utgangsnivå når du snakker som <i>prioritert taler</i> for å unngå å bli forstyrret. Å velge dette vil skru på dette valget.. Attenuate other users while talking as Priority Speaker. Senk lydstyrken på andre mens du snakker som Prioritert taler. Advanced Attenuation Options Avanserte dempningsvalg If checked, Mumble will only attenuate applications that are using the same output source as Mumble Hvis valgt vil Mumble bare senke lydstyrken på programmer som bruker samme utgangskilde som Mumble <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. <b>Bare senk lydnivået på programmer som bruker samme utgang som Mumble</b><br />Programmer som bruker en annen utgang enn Mumble vil ikke bli få sitt lydnivå endret. Only attenuate applications using the same output device Bare senk lydstyrken på programmer som bruker den samme utgangsenheten If checked, PulseAudio loopback modules will be attenuated Hvis valgt vil PulseAudio sine nøytrale tilbakekoblingsmoduler få sitt lydnivå senket <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. <b>Senk lydnivået på PulseAudio moduler med nøytral tilbakekobling</b><br />Hvis de er lenket til Mumbles utgangsenhet/sink, vil også de få sitt lydnivå senket. Attenuate PulseAudio loopback modules Senk lydnivået på PulseAudio nøytrale tilbakekoblingsmoduler AudioOutputDialog None Ingen Local Lokal Server Tjener Audio Output Lydutgang %1 ms %1 ms %1 % %1 % %1 m %1 m AudioOutputSample Choose sound file Velg lydfil Invalid sound file Ugyldig lydfil The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. Fila '%1' kan ikke brukes av Mumble. Velg ei fil med kompatibelt format og koding. AudioStats >1000 ms >1000ms >1000 ms Audio Statistics Lydstatistikk Input Levels Inngangsnivå Peak microphone level Toppnivå for mikrofon Peak power in last frame Toppnivå for effekt i siste ramme This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. Dette viser toppnivå for effekt i siste ramme (20 ms) og er samme måling som du vanligvis finner vist i "inngangseffekt". Se bort fra dette og se på <b>Mikrofoneffekt</b> i steden for, som er mye jevnere og ikke tar hensyn til toppnivået til transienter. Peak speaker level Toppnivå for høytaler This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. Dette viser toppnivået til effekten av høytalerne i forrige ramme (20 ms). Om du bruker en kringlydskanals-samplingsmetode (som ASIO) med høyttaleroppsett konfigurert, vil dette være 0. Hvis du har et slikt oppsett konfigurert, og dette fremdeles viser 0 mens du spiller lyd fra andre programmer, fungerer ikke oppsettet ditt. Peak clean level Toppnivå for rent signal This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. "Toppnivå for effekt i siste ramme (20 ms) (etter behandling). Dette er toppnivåene for forskjellige fall: -96dB ideell, teoretisk -60dB flott, studio -20dB bra, vanlig. Når du snakker på vanlig konsumentutstyr bør nivået ligge mellom -5 and -10dB. Når du bruker lydkansellering og du ser at det stiger til mer enn -15dB har du feil i systemet som irriterer brukere ved å legge til ekko." Signal Analysis Signalanalyse Microphone power Elektrisk effekt til mikrofon How close the current input level is to ideal Hvor nært nåværende inngangsnivå er til idealet til enhver tid This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. Dette viser hvor nært ditt nåværende inngangsvolum er til idealet. For å justere mikrofonnivået, åpne programmet du bruker til lydstyrkejustering og se på verdien her mens du snakker<br /><b>Snakk høyt, som når en noob får inn et grisetreff.</b><br />Juster volumet til verdien er nært 100%, men forsikre deg om at den ikke går over. Hvis den gjør det, får du antagelig klipping i deler av talen din, som forverrer lydkvaliteten. Signal-To-Noise ratio Signal-til-støy -forhold Signal-To-Noise ratio from the microphone Signal-til-støy -forhold fra mikrofonen This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. Signal-til-støy-forhold (SNR) for mikrofonen i siste ramme (20 ms). Det viser hvor mye klarere tale er i forhold til støyen.<br />Hvis denne verdien er under 1.0, er det mer støy enn tale i signalet, så kvaliteten er redusert.<br />Det er ingen øvre grense for denne verdien, men ikke forvent å se mye over 40-50 uten et lydstudio. Speech Probability Talesannsynlighet Probability of speech Sannsynlighet for tale This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). Sannsynligheten for at siste ramme (20 ms) var tale og ikke miljøstøy.<br />Forsendelse av stemmeaktivitet avhenger av at dette er rett. Trekset er at midten av setningen alltid blir oppdaget som tale; problemet er at pauser mellom or og starten av setningen. Det er vanskelig å skille et sukk fra et ord som starter med 'h'.<br />Hvis dette er i fet skrift, betyr det at Mumble sender nå (hvis du er tilkoblet). Configuration feedback Tilbakemelding om oppsett Current audio bitrate Gjeldende lydbitrate Bitrate of last frame Bitraten til forrige ramme DoublePush interval Dobbeltrykksintervall Time between last two Push-To-Talk presses Tid mellom de to siste brukene av trykk-for-å-snakke knappen Speech Detection Stemmeoppdagelse Current speech detection chance Nåværende sjanse for stemmeoppdagelse <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>Dette viser gjeldende stemmeoppdagelses-innstillinger</b><br />Du kan endre disse innstillingene fra innstillingsdialogen eller fra lydveiviseren. Signal and noise power spectrum Effektspektrum for signal og støy Power spectrum of input signal and noise estimate Effektspektrumet til inngangssignalet og støyanslag This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. Dette viser effektspektrumet til nåværende inngangssignal (rød linje) og<br /> gjeldende støyoverslag (innfylt blått).<br /> Alle amplituder er ganget med 30 for å vise den interessante delen (overskuddet av signal over støy i hvert frekvensband).<br />Av interesse hvis du prøver å finjustere støy ut av dine opptak. Under gode forhold vil det bare være en liten antydning til små bevegelser av blått på bunnen. Hvis dette beveger seg mer enn halvveis opp på grafen har du et veldig bråkete miljø eller et problem med din mikrofon. Echo Analysis Ekkoanalyse Weights of the echo canceller Vekting av ekko-kansellator This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. Dette viser vektingen af ekkokanselleringen, der tiden øker nedover og frekvens økes mot høyre.<br />Ideelt sett skulle dette være svart, hvilket ville indikert at det overhodet ikke er noe ekko. Du bør være i stand til at se vektingen oppdateres i sanntid.<br />Legg merke til at så lenge du ikke har noe som kan være ekko, vil du ikke se noe nyttig data her. Spill av noe musikk og tingene skulle vil begynne å stabilisere seg.<br />Du kan velge å se den rette eller innbilte delen av frekvens-områdets vekt, eller alternativt den beregnede absolutte verdi og fase. Den mest brukbare av disse, vil være den absolutte verdi, som er amplituden av ekkoet, og som viser deg hvor mye av utgangssignalet, som blir fjernet på det tidspunktet. De andre visningstilstandene er mest brukbare for folk som gjerne vil justere ekkokansellerings-algoritmene.<br />Merk: Hvis hele bildet svinger enormt i modulus-tilstand, vil det mislykkes ekkokanselleringen å finne noen sammenheng overhodet mellem de to inngangskildene (høyttalere og mikrofon). Enten har du en meget lang forsinkelse på ekkoet, eller så er en av inngangskildene satt opp feil. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. Bitraten for lyd i siste komprimerte ramme (20 ms), den vil hoppe opp og ned ettersom VBR justerer kvaliteten. Toppnivået for bitrate kan justeres i innstillingsdialogen. AudioWizard Audio Tuning Wizard Veiviser for lydjustering Introduction Introduksjon Welcome to the Mumble Audio Wizard Velkommen til veilderen for lydjustering i Mumble Finished Fullført Enjoy using Mumble Kos deg med Mumble Device selection Enhetsvalg Selecting the input and output device to use with Mumble. Valg av inn og utdata -enhet til bruk i Mumble. This is the device your microphone is connected to. Dette er enheten mikrofonen din er tilkoblet. System System Input method for audio Inndatametode for lyd <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Inndatametode til bruk for lyd.</b><br />Antageligvis ønsker du å bruke DirectSound. Device Enhet Input device to use Inndataenhet i bruk <b>Selects which sound card to use for audio input.</b> <b>Velger lydkort til bruk for inngangsignal</b> Cancel echo from headset or speakers Kanseller ekko fra hodesett eller høytalere Use echo cancellation Bruk ekkokansellering This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. Dette skrur på ekkokansellering for utgående lyd, noe som hjelper både på høytalere og hodesett. This is the device your speakers or headphones are connected to. Dette er enheten dine høyttalere eller hodetelefoner er tilkoblet. Output method for audio Utdatametode for lyd <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Dette er utdatametoden til bruk for lyd.</b><br/>Du vil mest sannsynlig ønske å bruke DirectSound. Output device to use Utgangsenhet å bruke <b>Selects which sound card to use for audio Output.</b> <b>Velger hvilket lydkort som skal brukes for lydutgang.</b> Enable positional audio Skru på posisjonell lyd Allows positioning of sound Allows positioning of sound. Tillater posisjonering av lyd <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> <p> Dette er lydjusteringsveiviseren i Mumble. Hjelper deg å korrigere inngangsnivåene på ditt lydkort og å sette opp rette parameter for lydbehandling i Mumble. </p> <p> Merk at mens denne veiviseren er aktiv vil lyd aktivt bli bli tilbakekoblet nøytralt lokalt for at du skal kunne prøvelytte, og ingen lyd vil bli sendt til tjeneren. </p> Input Device Inndataenhet Output Device Utdataenhet This allows Mumble to use positional audio to place voices. Dette lar Mumble bruke posisjonsbasert lyd for å plassere stemmer. <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> <p> For å holde forsinkelsen til et absolutt minimum, er det viktig å hurtiglagre så lite lyd som mulig på lydkortet. Dog oppgir mange lydkort at de krever mye mindre lager enn de fungerer med, så den eneste måten er prøving og feiling. </p> <p> Du bør høre et lydklipp. Endre glidebryteren nedenfor til laveste verdi som <b>ingen</b> forstyrrelser eller jitter i lydsignalet. Merk at lokalt ekko er avskrudd under testen. </p> Amount of data to buffer Mengde data i mellomlagring This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Dette angir mengden data som skal hurtiglagres i utdatahurtiglageret. Eksperimenter med forskjellige verdier og sett til den laveste verdien som ikke forårsaker rask jitter i lyden. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> <p> Åpne ditt lydkontrolpanel og gå inn under innstillingene for opptak. Forsikre deg om at mikrofonen er valgt som aktiv inngang med maksimal opptaksstyrke. Hvis der er mulighet for å aktivere "Mikrofon-boost", så forsikre deg om at denne er huket av. </p> <p> Snakk høyt, som når du er irritert eller opprømt. Senk lydstyrken i lydkontrollpanelet til den grønne stolpen nedenfor er så høy som mulig i den blå og grønne, men <b>ikke</b> i det røde området når du snakker. </p> Positional Audio Posisjonell lyd Adjusting attenuation of positional audio. Dempingsjustering av lydnivået for posisjonsbasert lyd. <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> <p> Mumble støtter posisjonsbasert lyd for noen spill, og vil posisjonere stemmen til andre brukere relativt til deres posisjon i spillet. Avhengig av deres posisjon, vil lydnivået på stemmen deres endres mellom høyttalerne for å simulere retning og distanse til den andre brukeren. Slik posisjonering avhenger av at ditt høyttaleroppsett er rett i operativsystemet ditt, så en test gjøres her. </p> <p> Grafen nedenfor viser posisjonen på deg <font color="red">deg</font>, dine <font color="yellow">høyttalere</font> og en <font color="green">flyttbar lydkilde</font> som hvis sett fra oven. Du bør også høre at lyden flytter seg mellom kanalene. </p> Use headphones instead of speakers Bruk hodetelefoner istedenfor høyttalere <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> <p> Gratulerer. Du er nå klar til å nyte en rikere lydopplevelse med Mumble. </p> <p> Mumble er i stadig utvikling og utviklingslaget ønsker å fokusere på funksjoner som best hjelper de fleste brukerne. For å få til dette støtter Mumble innsending av anonym statistikk om ditt oppsett til utviklerne. Denne statistikken er essensiell for videre utvikling, og sørger også for at noen av funksjonene du bruker ikke blir foreldet. </p> Use headphones Bruk hodetelefoner This ignores the OS speaker configuration and configures the positioning for headphones instead. Dette ser bort fra operativsystemets oppsett og setter opp posisjon myntet på hodetelefoner i steden. Volume tuning Lydstyrkejustering Tuning microphone hardware volume to optimal settings. Justering av maskinvare-lydnivået til mikrofon til optimale innstilllinger Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. Nå, snakk så mykt som du kan, som om du snakket sent på kvelden og ikke ville forstyrre noen. Juster glidebryteren nedenfor slik at bjelken går inn i en grønn sone når du snakker, men holder seg i det blå feltet når du er stille. Voice Activity Detection Stemme-deteksjon Letting Mumble figure out when you're talking and when you're silent. Lar Mumble finne ut når du snakker og når du holder munn. This will help Mumble figure out when you are talking. The first step is selecting which data value to use. Dette hjelper Mumble å finne ut når du snakker. Første steg er å velge hvilken data som skal brukes. Raw amplitude from input Ubehandlet amplitude fra inngang Signal-To-Noise ratio Signal-til-støy -forhold Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Si noe mens du opererer glidebryteren slik at disse avgrensningene observeres. Det første du sier. Grønt (Helt sikkert tale) Vanlig snakking. Gult (Kan være tale) Ingen snakking. Rødt (Definitivt ikke tale) Device tuning Enhetstilpasning Changing hardware output delays to their minimum value. Endrer forsinkelse for maskinvareutgang til deres minimumsverdi. Submit anonymous statistics to the Mumble project Send inn anonym statistikk til Mumble-prosjektet Push To Talk: Trykk for å snakke: Quality & Notifications Kvalitet og merknader Adjust quality and notification settings. Juster kvalitet og merknadsinnstillinger. Quality settings Kvalitetsinnstillinger Low Lav Balanced Balansert Notification settings Merknadsinnstillinger Use Text-To-Speech to read notifications and messages to you. Bruk tekst-til-tale for å lese merknader og meldinger til deg. Disable Text-To-Speech and use sounds instead. Skru av tekst-til-tale og bruk lyder istedenfor. %1 ms %1 ms Enables attenuation of other applications while users talk to you Skrur på senkning av lydnivået for andre programmer mens brukere snakker til deg Attenuate applications while other users talk Senker lydnivået på programmer mens andre brukere snakker High Høy Custom Egenvalgt You already set a customized quality configuration in Mumble. Select this setting to keep it. Du har allerede valgt et egendefinert kvalitetsoppsett i Mumble. Velg denne innstillingen for å beholde det. Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. Senkning av lydnivået på andre programmer mens brukere snakker til deg. Så snart noen begynner å snakker til deg i Mumble vil lyden av alle andre programmer (som lydavspillere) få sitt lydnivå senket slik at du kan høre dem bedre. Apply some high contrast optimizations for visually impaired users Legg til noen høykontrastforbedringer for brukere med synshemning Use high contrast graphics Bruk høykontrastsgrafikk Keep custom Text-To-Speech settings. Behold brukerdefinerte tekst-til-tale -innstillinger. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode <p> Åpne ditt lydkontrollpanel og gå inn under innstillingene for opptak. Forsikre deg om at mikrofonen er valgt som det aktive inngang og med maksimal opptaksstyrke. Hvis der er mulighet for at aktivere "Mikrofon-boost", så huk av denne. </p> <p> Snakk høyt, som når du er irritert eller opprømt. Senk lydstyrken i lydkontrollpanelet til den grønne stolpen nedenfor er så høy som mulig i den blå og grønne, men <b>ikke</b> i det kryssete området når du snakker. </p> Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode Nå, snakk så mykt som du kan, som om du snakket sent på kvelden og ikke ville forstyrre noen. Juster glidebryteren nedenfor slik at bjelken går inn i en tom sone når du snakker, men holder seg i det stripete feltet når du er stille. Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode Si noe mens du opererer glidebryteren slik at disse avgrensningene observeres. Det første du sier. Tomt (Helt sikkert tale) Vanlig snakking. Stripet (Kan være tale) Ingen snakking. Krysset (Definitivt ikke tale) In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) "<b>Lav mengde båndbredde</b>. Å bruke mindre vil føre med seg høy forsinkelse og dårlig kvalitet. Bare velg dette hvis din tilkobling ikke kan takle andre innstillinger (16kbit/s, 60ms per pakke) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) Dette oppsettet er <b>anbefalt forvalg</b>. Det gir en god balanse mellom kvalitet, forsinkelse, og båndbreddebruk. (40kbit/s, 20ms per packet) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) Dette oppsettet er bare anbefalt til bruk i oppsett der man ikke trenger å ta hensyn til båndbredde, som et LAN. Det gir lavest mulig forsinkelse som støttes av Mumble og <b>høy kvalitet</b>.(72kbit/s, 10ms per packet) BanEditor Mumble - Edit Bans Mumble - Rediger bannlysninger &Address &Adresse &Mask &Masker Reason Grunn Start Begynnelse End Slutt User Bruker Hash Sjekksum &Add &Legg til &Update &Oppdater &Remove &Fjern Ban List Blokkeringsliste Search field Søkefelt This is the search field. Use it to find bans that have this username set in the username field. Dette er søkefeltet. Bruk det til å finne samsvar med brukernavn i listen over bannlysninger. Who are you looking for? Hvem leter du etter? No nickname Inget brukernavn IP address IP-adresse No IP address Ingen IP-adresse Reason for the ban Grunn til blokkering No reason Ingen grunn Ban end date Sluttdato for blokkering Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). Sluttdato for blokkering. Hvis du velger samme dato for begynnelse og slutt, vil blokkeringen være permanent (den utløper altså ikke). Certificate hash Sertifikatets sjekksum No certificate hash Sertifikat mangler sjekksum Banned users Blokkerte brukere This is a list with banned users. Liste over blokkerte brukere. Use this button if you want to add a new ban. Bruk denne knappen hvis du vil legge til en ny blokkering. Use this button if you want to update ban information. Bruk denne kanppen hvis du ønsker å oppdatere blokkeringsinformasjon. Use this button if you want to remove user from the ban list. Bruk dennne knappen hvis du ønsker å fjerne en bruker fra blokkeringslisten. Clear all fields Tøm alle felter This button clears all fields. Use it if you want to add a new ban. Denne knappen tømmer alle felter. Bruk den hvis du ønsker å legge til en ny blokkering. Clear Tøm Ban List - %n Ban(s) Blokkeringsliste - %n blokkeringBlokkeringsliste - %n blokkeringer CertView Name Navn Email E-post Issuer Utsteder Expiry Date Utløpsdato (none) (ingen) Self-signed Selv-signert CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. Kunne ikke bekrefte e-post.<br />Skriv en gyldig (eller tom) e-post for å fortsette. There was an error generating your certificate.<br />Please try again. Feil oppstod under opprettelse av ditt sertifikat <br />Prøv igjen. Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. Sertifikat og nøkkel tilhørende deg kunne ikke eksporteres til PKCS#12-format. Det kan være en feil i ditt sertifikat. The file could not be opened for writing. Please use another file. Filen kunne ikke åpnes for skriving. Bruk en annen fil. The file's permissions could not be set. No certificate and key has been written. Please use another file. Filens tilgangsinnstillinger kunne ikke endres. Det kunne ikke opprettes noe sertifikat. Bruk en annen fil. The file could not be written successfully. Please use another file. Kunne ikke skrive til denne fila. Velg en annen fil. The file could not be opened for reading. Please use another file. Denne fila kunne ikke åpnes for lesning. Velg en annen fil. The file is empty or could not be read. Please use another file. Denne fila er tom eller kunne ikke leses. Velg en annen fil. The file did not contain a valid certificate and key. Please use another file. Fila inneholdt ikke gyldig sertifikat og nøkkel. Bruk en annen fil. Select file to export certificate to Velg fil å eksportere sertifikat til Select file to import certificate from Velg fil å importere sertifikat fra Unable to import. Missing password or incompatible file type. Klarer ikke å importere. Manglende passord eller ukompatibel filtype. <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. <b>Sertifikatsutløp:</b>Ditt sertifikat er i ferd med å utløpe. Du må fornye det, ellers vil du ikke lenger kunne koble til tjenere du er registrert på. Certificates Certificate Management Behandling av sertifikat Certificate Authentication Bekreftelse av sertifikat Authenticating to servers without using passwords Identitetsbekreftelse til tjenere uten bruk av passord Current certificate Gjeldende sertifikat This is the certificate Mumble currently uses. Dette er det sertifikatet Mumble bruker for øyeblikket. Current Certificate Gjeldende sertifikat Create a new certificate Opprett et nytt sertifikat This will create a new certificate. Dette vil opprette et nytt sertifikat. Import certificate from file Importer et sertifikat fra fil This will import a certificate from file. Dette vil importere et sertifikat fra en fil. Import a certificate Importer et sertifikat Export Certificate Eksporter et sertifikat This will export a certificate to file. Dette vil eksportere et sertifikat til en fil. Export current certificate Eksporter gjeldende sertifikat Import Certificate Importer sertifikat PKCS #12 Certificate import PKCS#12 Sertifikatsimportering <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble kan importere sertifikater lagret i PKCS #12-format. Dette formatet brukes ved eksportering av nøkkel fra Mumble, og når nøkler eksporteres fra Firefox, Internet Explorer, Opera osv.</p><p>Hvis fila er passordbeskyttet, vil du trenge passordet for å importere sertifikatet.</p> Import from Importer fra Filename to import from Filnavn det skal importeres fra This is the filename you wish to import a certificate from. Filnavnet du ønsker å importere et sertifikat fra. Select file to import from Velg en fil å importere fra This opens a file selection dialog to choose a file to import a certificate from. Åpner en filutvalgsdialog for åpning av sertifikatet som skal importeres. Open... Åpne... Password Passord Password for PKCS#12 file Passord for PKCS#12-filen This is the password for the PKCS#12 file containing your certificate. Dette er passordet for PKCS#12-filen som inneholder ditt sertifikat. Certificate to import Sertifikat som skal importeres This is the certificate you are importing. Dette er sertifikatet du importerer. Certificate Details Sertifikatdetaljer Replace Certificate Erstatt sertifikat Replace existing certificate with new certificate? Erstatt eksisterende sertifikat med nytt? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> <p>Du har allerede et sertifikat lagret i Mumble og du er i ferd med å erstatte det.</p> <p>Hvis du oppgraderer til et sertifikat utstedt deg av en tiltrodd CA (sertifikatsmyndighet) og e-posten samsvarer med ditt gjeldende sertifikat, er dette helt trygt, og tjenerne du kobler til vil automatisk gjenkjenne det sterke sertifikatet for din e-postadresse. </p> <p>Hvis dette ikke er tilfelle, vil du ikke lenger bli gjenkjent av noen tjener du tidligere har identifisert deg mot. Hvis du ikke har blitt registrert på noen tjener enda, er ikke dette noe du trenger å uroe deg over. </p> <p> Er du sikker på at du vil erstatte ditt sertifikat? </p> This is the certificate Mumble currently uses. It will be replaced. Dette er sertifikatet Mumble bruker nå. Det vil bli erstattet. New certificate Nytt sertifikat This is the new certificate that will replace the old one. Dette er det nye sertifikatet som erstatter det gamle. New Certificate Nytt serfifikat Make a backup of your certificate Lag sikkerhetskopi av ditt sertifikat Export to Eksporter til Filename to export to Filnavn å ekspotere til This is the filename you wish to export a certificate to. Dette er filnavnet du ønsker å eksportere et sertifikat til. Save As... Lagre som... This is the certificate Mumble currently uses. It will be exported. Dette er sertifikatet Mumble bruker akkurat nå. Det vil bli eksportert. Generate a new certificate for strong authentication Opprett et nytt sertifikat for sterk identitetsbekreftelse <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> <p>Mumble vil nå opprette et sterkt sertifikat for identitetsbekreftelse til tjenere.</p><p>Hvis du ønsker kan du oppgi ytterligere informasjon som skal lagres i ditt sertifikat, som vil bli presentert ovenfor tjenerne du kobler til. Hvis du oppgir en gyldig e-postadresse, kan du oppgradere til en CA(sertifikasjonsmyndighets)-utstedt sertifikat senere, som gir sterk identifikasjon.</p> Name Navn Email E-post Your email address (e.g. johndoe@mumble.info) Din e-postadresse (f.eks. ola@nordmann.no) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. Dette er din e-postadresse. Det anbefales sterkt at du oppgir en gyldig e-postadresse. Dette vil la deg oppgradere til et sterkt sertifikat uten identitetsbekreftelsesproblemer. Your name (e.g. John Doe) Ditt navn (f.eks. Ola Nordmann) This is your name, and will be filled out in the certificate. This field is entirely optional. Dett er ditt navn, og vil bli fylt ut sammen med sertifikatet. Dette feltet er helt valgfritt. Finish Sluttfør Certificate-based authentication is ready for use Sertifikatsbasert identitetsbekreftelse klar til bruk Enjoy using Mumble with strong authentication. Nyt bruk av Mumble med sterk identitetsbekreftelse Automatic certificate creation Automatisk sertifikatsopprettelse <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>Hvis du noensinne mister ditt nåværende sertifikat, hvilket vil skje om harddisken på din maskin blir ødelagt eller hvis du reinstallerer ditt operativsystem, vil du ikke lenger kunne identitetsbekrefte deg ovenfor tjenere du er registrert på. Det er derfor <b>påkrevd</b> at du tar en sikkerhetskopi av ditt sertifikat. Vi anbefaler sterkt at du lagrer denne sikkerhetskopien på et flyttbart medium, som en USB-minnepinne.</p> <p>Merk at denne filen ikke er kryptert, slik at alle som får tilgang til den vil kunne opptre som deg, så ta godt vare på den.</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> <p>Mumble kan bruke sertifikater for identitetsbekreftelse ovenfor tjenere. Bruk av sertifikater unngår bruk av passord, som betyr at du ikke må oppgi et passord fra brukersiden. Det gir også veldig enkel brukerregistrering og en venneliste som er uavhengig av tjenere.</p><p>Selv om Mumble kan fungere uten sertifikater, forventer de fleste tjenere at du har et. </p><p>Automatisk opprettelse av et nytt sertifikat er nok for de fleste brukstilfeller, men Mumble støtter også sertifikater som representerer tillit til brukernes eierforhold til en e-postadresse. Disse sertifikatene utstedes av tredjeparter. For mer informasjon, se vår<a href="http://mumble.info/certificate.php">brukersertifikatdokumentasjon</a></p> ChanACL None Ingen Traverse Overgang Enter Gå inn i Speak Snakk Mute/Deafen Gjør stum/døv Make channel Opprett kanal Make temporary Gjør midlertidig Link channel Lenk kanal This represents no privileges. Dette representerer ingen privilegier. This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. Dette representerer total tilgang til kanalen, inkludert muligheten til å endre gruppe- og ACL -informasjon. Dette privilegiet impliserer alle andre privilegier. This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. Dette representerer tilgang til overgang av kanalen. Hvis en bruker nektes denne retten, vil vedkommende ikke kunne nå denne kanalen eller noen av kanalene under den, uavhenging av andre tilgangsrettigheter i underkanalene. This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. Muligheten til å ta del i kanalen. Hvis du har en hierarkisk kanalstruktur, kan det hende du vil gi alle overgangsrettigheter, men håndheve inngang i rot-kanalen av ditt hierarki. This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. Muligheten til å snakke i en kanal. Brukere uten dette privilegiet vil bli undertrykt av brukeren (ses som stum), og vil ikke kunne snakke før de får sin stumhet opphevet av noen med tilstrekkelige rettigheter. This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. Tilgangen til å hviske til denne kanalen fra utsiden. Fungerer akkurat som <i>snakke</i>-privilegiet, men har innvirkning på pakker sagt med hviske-knappen aktuert. Dette kan også brukes til å kringkaste til et kanalhierarki uten å lenke. This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. Muligheten til å gjøre andre brukere døve og stumme. Når først gjort stum vil en bruker forbli stum til vedkommende får sin stumhet opphevet av en annen priviligert bruker eller kobler til igjen på tjeneren. This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. Muligheten til å flytte en bruker til en annen kanal eller sparke ut vedkommende fra tjeneren. Brukere må normalt ha tilgang til en kanal for å bli flyttet dit. Flytteren kan også ha flyttingstilgang til målkanalen. Brukeren kan da bli flyttet til kanaler den ikke normalt har mulighet til å ta del i. This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. Tilgang til opprettelse av underkanaler vil føre med seg administratorrettigheter til den opprettede underkanalen. This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. Tilgang til opprettelse av midlertidige underkanaler vil føre med seg administratorrettigheter til den opprettede underkanalen. Midlertidige kanaler er ikke lagret, og forsvinner når den siste brukeren forlater den. This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. Bruk av muligheten til å lenke sammen kanaler gjør at brukere i de sammenlenkede kanalene hører hverandre, såfremt taleren har <i>tale</i>-privilegie i lytterens kanal. Du trenger lenkeprivilegie i begge kanaler for å opprette en lenke, men bare i hver av dem for å fjerne den. This represents the permission to write text messages to other users in this channel. Dette representerer retten til å skrive tekstmeldinger til andre brukere i kanalen. This represents the permission to forcibly remove users from the server. Dette representerer retten til å tvangsfjerne brukere fra tjeneren. This represents the permission to permanently remove users from the server. Dette representerer retten til å fjerne brukere fra tjeneren permanent. This represents the permission to register and unregister users on the server. Representerer rettigheten til å registrere og avregistrere brukere på tjeneren. This represents the permission to register oneself on the server. Dette representerer retten til å registrere seg selv på tjeneren. Whisper Hvisk Move Flytt Text message Tekstmeldinger Kick Spark ut Ban Bannlys Register User Registrer bruker Register Self Registrer deg selv Write ACL Skriv ACL ChatbarTextEdit Paste and &Send Paste and send Lim inn og &send <center>Type chat message here</center> <center>Skriv inn sludremelding her</center> ClientUser Friend Venn Authenticated Identitetsbekreftet Priority speaker Prioritert taler Recording Spiller inn Muted (server) Stum (tjener) Deafened (server) Gjort døv (tjener) Local Ignore (Text messages) Lokal ignorering (teksmeldinger) Local Mute Lokal stumhet Muted (self) Stum (selv) Deafened (self) Gjord døv (selv) ConfigDialog Accept changes Godta endringer This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. Denne knappen vil godta gjeldende innstillinger og gå tilbake til programmet.<br />Innstillingene vil lagres til disk når du forlater programmet. Reject changes Forkast endringer This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. Denne knappen vil avslå alle endringer og returnere til programmet.<br />Innstillingene vil bli satt til sine tidligere posisjoner. Apply changes Bruk endringer This button will immediately apply all changes. Denne knappen vil utføre alle endringer umiddelbart. Undo changes for current page Angre endringer for nåværende side This button will revert any changes done on the current page to the most recent applied settings. Denne knappen vil tilbakestille alle endringer gjort på denne siden til de nyligst tillagte innstillingene. Restore defaults for current page Gjenopprett forvalg for gjeldende side This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. Denne knappen vil tilbakestille innstillingene på denne siden tilbake til forvalg. Andre sider vil ikke bli endret.<br />For å endre alle innstillinger til deres forvalg må du bruke denne knappen på hver side. Mumble Configuration Mumble-oppsett ConnectDialog Connecting to %1 Kobler til %1 Enter username Skriv inn brukernavn Adding host %1 Legger til vert %1 Servername Tjenernavn Hostname Vertsnavn Bonjour name Bonjour-navn Port Port Addresses Adresser Website Nettside Packet loss Pakketap Ping (80%) Ping(80%) %1 ms %1 ms Ping (95%) Ping (95%) Bandwidth Båndbredde %1 kbit/s %1 kbit/s &Connect &Koble til &Filters &Filtre Users Brukere Version Versjon Failed to fetch server list Innhenting av tjenerliste feilet Mumble Server Connect Mumble tjenertilknytning Ping Ping Remove from Favorites Fjern fra favoritter Add custom server Tilføy brukerdefinert tjener Show all servers that respond to ping Vis alle tjenerene som besvarte ping Show all servers with users Vis alle de tjenerne som har brukere Show all servers Vis alle tjenere &Copy &Kopier Copy favorite link to clipboard Kopier favorittlenke til utklippstavle &Paste &Lim inn Paste favorite from clipboard Lim inn favoritt fra utklippstavle &Edit... &Rediger &Add New... &Legg til ny... Add to &Favorites Legg til i &favoritter Open &Webpage Åpne &nettsted Show &Reachable Vis &innen rekkevidde Show &Populated Vis &befolkede Show &All Vis &alle ConnectDialogEdit Edit Server Rediger tjener Name of the server Navn på tjeneren A&ddress &Adresse Internet address of the server. Internet address of the server. Internettadresse for tjeneren. <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Adresse</b><br/> Internettadresse til denne tjeneren. Dette kan være et normalt vertsnavn, en IPv4/IPv6-adresse eller en Bonjour-tjenesteidentifikator. Bonjour-tjenesteidentifikatorer må innledes med en '@' for å gjenkjennes av Mumble. &Port &Port Port on which the server is listening Porten tjeneren lytter på <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. <b>Port</b><br/> Porten tjenren lytter til. Hvis tjeneren er identifisert av en Bonjourtjenesteidentifikator vil dette feltet bli oversett. &Username &Brukernavn Username to send to the server Brukernavn som skal sendes til tjeneren <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. <b>Brukernavn</b><br/> Brukernavn å sende til tjeneren. Merk at tjeneren kan utøve en restriksjon på hvordan et brukernavn kan se ut. Ditt brukernavn kan også være tatt av en annen bruker allerede. Label Etikett Add Server Legg til tjener You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 Password Passord Password to send to the server Passord som skal sendes til tjeneren <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. <b>Passord</b><br/> Passord kan sendes til tjeneren ved tilkobling. Dette passordet trengs for å koble til som <i>SuperBruker</i> eller til en tjener ved bruk av passord for identitetsbekreftelse. Hvis ikke oppført her, vil passordet bli forespurt ved tilkobling. Show password Vis passord <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. <b>Merkelapp</b><br/> Hva tjeneren er beskrevet som. Dette er hva tjeneren vil bli navngitt som i din tjenerliste og kan velges fritt. Local server label Etikett for lokal tjener 127.0.0.1 127.0.0.1 64738 64738 Your username Ditt brukernavn Your password Ditt passord &Fill CoreAudioSystem Default Device Forvalgt enhet CrashReporter Mumble Crash Report Mumble krasjrapport <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> <p><b>Vi er veldig lei oss, men det later til at Mumble har kræsjet. Ønsker du å sende en kræsjrapport til Mumble-utviklerne?</b></p><p>Kræsjrapporten inneholder en delvis kopi av Mumble på kræsjtidspunktet, og vil hjelpe utviklere å ordne problemet.</p> Email address (optional) E-postadresse (valgfritt) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash Beskriv i korte trekk, på Engelsk, hva du gjorde når Mumble krasjet Send Report Send rapport Don't send report Ikke send rapport Crash upload successful Kræsjrapportering vellykket Thank you for helping make Mumble better! Takk for at du hjelper til med å gjøre Mumble bedre! Crash upload failed Opplasting av kræsj mislyktes We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. Det beklages på det mest innstendige at kræsjrapportering har mislyktes med feil %1 %2. Informer en utvikler om dette. This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 Dette er ikke gøy, men det later til at det er en feil i kræsjrapporteringskoden, og dermed kunne ikke rapporten lastes opp. Informer en utvikler om denne feilet %1 Uploading crash report Laster opp kræsjrapport Abort upload Avbryt opplasting DXAudioInput Default DirectSound Voice Input Forvalgt DirectSound inngang for tale Opening chosen DirectSound Input device failed. No microphone capture will be done. Åpning av valgt DirectSound-inngang mislyktes. Inget mikrofonopptak vil bli gjort. Opening chosen DirectSound Input failed. Default device will be used. Åpning av valgt DirectSound-inngang mislyktes. Forvalgt enhet vil bli brukt. Lost DirectSound input device. Mistet DirectSound-inngangsenhet DXAudioOutput Default DirectSound Voice Output Forvalgt DirectSound ugang for tale Opening chosen DirectSound Output failed. Default device will be used. Åpning av valgt DirectSound-ugang feilet. Forvalgt enhet vil bli brukt. Lost DirectSound output device. Mistet DirectSound-utgangsenhet Opening chosen DirectSound Output failed. No audio will be heard. Åpning av valgt DirectSound-utgang feilet. Ingen lyd vil bli hørt. Database Mumble failed to initialize a database in any of the possible locations. Mumble klarte ikke å igangsette en database på noen av de mulige plasseringene. The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. Databasen '%1' er kun lesbar. Mumble kan ikke lagre tjener-innstillinger (f.eks SSL-sertifikater) til du ordner dette problemet. DeveloperConsole Developer Console Utviklerkonsoll DockTitleBar Drag here Dra hit GlobalShortcut Shortcuts Tastatursnarveier List of configured shortcuts Liste over oppsatte tastatursnarveier Function Funksjon Data Data Shortcut Snarvei Suppress Undertrykk Add new shortcut Legg til ny snarvei This will add a new global shortcut Dette vil legge til en ny global snarvei &Add &Legg til Remove selected shortcut Fjern valgt snarvei This will permanently remove a selected shortcut. Dette vil slette valgt snarvei for godt. &Remove &Fjern <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> <html><head/><body><p>Kun valgtaster fra tastatur eller mus (Alt, Ctrl, Cmd, osv.) kan brukes for snarveier som gjelder for hele systemet.</p><p>Hvis du ønsker mer fleksibilitet kan du endre <span style=" font-style:italic;">Tilgang for hjelpeenheter</span> i systemets tilgjengelighetsinnstillinger. Merk at denne endringen har potensiale til å la skadelig programvare se hva som skrives på ditt tastatur.</p></body></html> Open Accessibility Preferences Åpne tilgjengelighetsinnstillinger Skip Hopp over Enable Global Shortcuts Aktiver globale tatatursnarveier <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. <b>Ytterligere snarveismotorer</b><br />Denne delen lar deg sette opp bruken av ytterligere GlobalShortcut-motrorer. Additional Shortcut Engines Ytterligere snarveismotorer <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. <b>Skru på Windows-kroker</b>.<br />Dette skrur på snarveismotoren for Windows-kroker. Bruk av denne motoren lar Mumble undertrykke tastetrykk og museklikk. Enable Windows hooks Skru på Windows-kroker <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. <b>Skru på GKey</b>.<br />Denne innstillinger skrur på støtte for GKey-snarveismotorer for "G"-taster på Logitech-tastatur. Enable GKey Skru på GKey <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. <b>Skru på XInput</b><br />Denne innstillinger skrur på støtte for Xinput-snarveismotoren for Xbox-kompatible kontrollerer. Enable XInput Skru på Xinput <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. Enable shortcuts in privileged applications GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> <html><head/><body><p>Kun valgtaster fra tastatur eller mus (Alt, Ctrl, Cmd, osv.) kan brukes for snarveier som gjelder for hele systemet. </p><p>Hvis du ønsker mer fleksibilitet kan du legge til Mumble som et betrodd hjelpefunksjons-program i Sikkerhet & Personvern på din Macs systeminnstillinger.</p><p>I sikkerhet og personvernsfanen, endre til personvernsfanen. Velg så Tilgjengelighet (nært bunnen) i listen på venstresiden. Til sist, legg til Mumble i listen over betrodde tilgjengelighetsprogrammer.</body></html> Shortcuts Tastatursnarveier Shortcut button combination. Tastatursnarveiskombinasjon <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. <b>Dette er tastatursnarveien for hele systemet.</b><br />Klikk i dette feltet og trykk på ønsket knapp/kombinasjon for å tilknytte ny snarvei. Dobbeltklikk for å tømme. Suppress keys from other applications Undertrykker tastetrykk fra andre program <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. <b>Dette skjuler tastetrykk fra andre programmer.</b><br />Å skru på dette vil gjemme knappen (eller den siste knappen i en kombinasjonssnarvei) fra andre programmer. Merk at ikke alle knapper kan undertrykkes. GlobalShortcutTarget Whisper Target Hvisk til utvalgt Whisper to list of Users Hvisk til liste over brukere Channel Target Kanalmål Restrict to Group Begrens til gruppe If specified, only members of this group will receive the whisper. Hvis spesifisert, vil bare medlemmer av denne gruppen motta din hvisken. List of users Liste over brukere Add Legg til Remove Fjern Modifiers Valgtaster Do not send positional audio information when using this whisper shortcut. Ikke send posisjonsbasert lydinformasjon når denne hviske-snarveien brukes. Ignore positional audio Se bort fra posisjonsbasert lyd Shout to Linked channels Rop til lenkede kanaler Shout to subchannels Rop til underkanaler Shout to Channel Rop til kanal The whisper will also be transmitted to linked channels. Denne hvisken vil også bli oversendt til lenkede kanaler. The whisper will also be sent to the subchannels of the channel target. Denne hvisken vil bli sendt til underkanalene av kanalmålet. GlobalShortcutX Mouse %1 Mus %1 JackAudioSystem Hardware Ports Mono Stereo LCD Not connected Ikke tilkoblet LCDConfig Enable this device Aktiver denne enheten LCD LCD Form Skjema Devices Enheter Name Navn <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> <p>Liste over tilgjengelige LCD-enheter på ditt system. Opplistet etter navn, men også med størrelsen på skjermen. Mumble støtter forsendelse av data til flere LCD-enheter samtidig</p> <h3>Størrelse:</h3> <p> Dette feltet beskriver størrelsen på en LCD-enhet. Enten gitt i piksler (for grafiske LCD-paneler) eller i tegn (for segmentbaserte LCD-er).</p> <h3>Påskrudd:</h3> <p>Dette bestemmer hvorvidt Mumble skal tegne på en gitt LCD-enhet.</p> Size Størrelse Enabled Aktivert Views Visninger Minimum Column Width Minimumskolonnebredde <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> <p>Dette valget bestemmer minimumsbredden på en kolonne i brukervisning.</p> <p>Hvis for mange folk snakker samtidig, vil brukervisningen dele seg selv inn i kolonner. Du kan bruke dette valget for å velge et kompromiss mellom antallet brukere vist på en LCD, og bredden på brukernavn.</p> This setting decides the width of column splitter. Denne innstillingen avgjør bredden på kollonneoppdalingen. Splitter Width Mellomrom på oppdeling Log Debug Feilretting Critical Kritisk Warning Advarsel Information Informasjon Server Connected Tilkoblet tjener Server Disconnected Frakoblet tjener Other self-muted/deafened Andre selv-stumhet/døvhet Permission Denied Tilgang nektet Text Message Tekstmelding User Joined Server Bruker tok del i rommet User Left Server Bruker forlot tjeneren User recording state changed Brukerens opptakstilstand ble endret User kicked (you or by you) Bruker kastet ut (deg eller av deg) User kicked Bruker kastet ut You self-muted Du gjorde deg selv stum User muted (you) Bruker gjort stum (deg) User muted (by you) Bruker gjort stum (av deg) User muted (other) Bruker gjort stum (andre) User Joined Channel Bruker ble med i kanalen User Left Channel Bruker forlot kanalen You self-unmuted Du opphevet egen stumhet You self-deafened Du gjorde deg selv døv You self-undeafened Du opphevet egen døvhet User renamed Bruker tok nytt navn You Joined Channel You Joined Channel (moved) the server tjeneren [[ Invalid size ]] [[ Ugyldig størrelse ]] [[ Text object too large to display ]] [[ Tekst for vidtfavnende for visning ]] [Date changed to %1] [Dato endret til %1] link to %1 lenk til %1 FTP link to %1 player link bruker-lenke channel link kanal-lenke %1 link %1 lenk LogConfig Toggle console for %1 events Veksle konsoll for %1-handlinger Toggle pop-up notifications for %1 events Veksle oppsprettsmerknader for %1-hendelser Toggle Text-To-Speech for %1 events Veksle tekst-til-tale for %1-hendelser Click here to toggle sound notification for %1 events Klikk her for å veksle lydmerknader for %1-hendelser Toggle window highlight (if not active) for %1 events Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change Sti til lydfil brukt for lydmerknader i fall %1-hendelser inntreffer<br />Enkelttrykk for å spille<br />Dobbeltklikk for å endre Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. Klikk her for å veksle konsollutdata for %1-hendelser.<br />Hvis valgt vil dette valget få Mumble til å sende alle %1-hendelser til sin meldingslogg. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. Klikk her for å veksle oppsprettsmerknader for %1-hendelser.<br />Hvis valgt, vil en oppsprettsmerknad for Mumble bli opprettet for hver %1-hendelse. Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. Sti til lydfil brukt for lydmerknader i fall %1-hendelser inntreffer.<br />Enkeltklikk for avspilling<br />Dobbeltklikk for å endre<br />Forsikre deg om at lydmerknader for disse hendelsene er påskrudd, ellers vil ikke dette feltet ha noen effekt. Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. Klikk her for å veksle tekst-til-tale for %1-hendelser.<br />Hvis valgt, vil Mumble bruke tekst-til-tale til opplesning av %1-hendelser for deg. Tekst-til-taler er også i stand til å lese innholdet av hendelsen, noe som ikke er tilfelle for lydfiler. Tekst-til-tale og lydfiler kan ikke brukes samtidig. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. Klikk her for å veksle lydmerknader for %1-hendelser.<br />Hvis valgt vil Mumble bruke ei lydfil oppgitt av deg for å indikere %1-hendelser. Lydfiler og tekst-til-tale kan ikke brukes samtidig. Messages Meldinger Message Melding Console Konsoll Notification Merknad Text-To-Speech Tekst-til-tale Soundfile Lydfil Path Sti Text To Speech Tekst til tale Volume Lydstyrke Volume of Text-To-Speech Engine Lydstyrke for tekst-til-tale -motor <b>This is the volume used for the speech synthesis.</b> <b>Lydstyrke brukt for talesyntese.</b> Length threshold Lengdeterskel Message length threshold for Text-To-Speech Engine Maksimal lengdeterskel for tekst-til-tale -motor <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. <b>Dette er varighetsterskelen brukt for tekst-til-tale -motoren.</b><br />Meldinger lenger enn denne grensen vil ikke bli lest høyt i deres fulle lengde. Characters Tegn Whisper Hvisk If checked you will only hear whispers from users you added to your friend list. Hvis valgt vil du bare høre hvisken fra brukere du har lagt til på vennelista. Only accept whispers from friends Bare aksepter hvisken fra venner If enabled text messages you send will be read back to you with TTS Hvis påskrudd vil tekstmeldinger du sender bli lest opp for deg med tekst-til-tale Read back own messages Less opp egne meldinger Chat Log Sludrelogg Maximum chat length Maksimal sludrelengde Unlimited Ubegrenset Lines Linjer Highlight LookConfig System default Systemforvalg None Ingen Only with users Kun dem som inneholder brukere All Alle Ask Spør Do Nothing Ikke gjør noe Move Flytt <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory <a href="%1">Utforsk</a> User Interface Brukergrensesnitt This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. Dette velger hvilke kanaler som skal utvides automatisk. <i>Ingen</i> og <i>Alle</i> utvider ingen eller alle kanaler, mens <i>Kun dem som inneholder brukere</i> vil utvide og sammenfolde kanaler ettersom brukere tar del i og forlater dem. List users above subchannels (requires restart). List opp brukere over underkanaler (krever omstart). <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. <b>Dette vil vise brukere før underkanaler i kanalvisningen.</b><br />Omstart av Mumble kreves for å se endringen. Users above Channels Brukere over kanaler <b>If set, will verify you want to quit if connected.</b> <b>Hvis satt, vil spørre deg om bekreftelse ved avslutting hvis tilkoblet.</b> Show number of users in each channel Vis antalle brukere i hver kanal Show channel user count Vis brukerantall for kanal Language Språk Language to use (requires restart) Språk i bruk (krever omstart) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. <b>Dette velger hvilket språk Mumble skal bruke.</b><br />Du må starte om Mumble for å bruke det nye språket. Look and Feel Utseende og oppførsel Layout Oppsett Classic Klassisk Stacked Stablet Hybrid Hybrid Custom Brukerdefinert This changes the behavior when moving channels. Dette endrer oppførselen når kanaler flyttes. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. Dette angir opprørselen ved kanaldraging; det kan brukes til å forhindre utilsiktet draging. <i>Flytt</i> flytter kanalen uten forespørsel. <i>Gjør ingenting</i> gjør ingenting og skriver en feilmelding. <i>Spør</i> bruker en meldingsboks til å bekrefte at du virkelig ønsket å flytte kanalen. Expand Utvid When to automatically expand channels Tidspunkt for automatisk ekspansjon av kanaler Channel Dragging Kanaldraging Ask whether to close or minimize when quitting Mumble. Spør hvorvidt det skal lukkes eller minimeres når Mumble avsluttes. Ask on quit while connected Spør ved avslutning når tilkoblet Always On Top Alltid øverst <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> <b>Hvis satt vil minimering av hovedvinduet til Mumble forårsake gjemming og gjøre det kun tilgjengelig fra systemkurven. Ellers vil det minimeres som vindu ellers.</b> Hide in tray when minimized Gjem i systemkurven når minimert Hide the main Mumble window in the tray when it is minimized. Gjem hovedvinduet til Mumble i systemkurven når minimert. This setting controls when the application will be always on top. Denne innstillingen kontrollerer hvorvidt programmet alltid skal være i forgrunnen. Never Aldri Always Alltid In minimal view I minimal visning In normal view I normalvisning Displays talking status in system tray Vis snakkestatus i systemkurven Show talking status in tray icon Vis snakkestatus i systemkurvsikonet This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. Denne innstillingen har kontrollerer hvilke situasjoner programmet vil forbli i forgrunnen. Hvis du velger <i>Aldri</i> vil programmet ikke forbli i forgrunnen. <i>Alltid</i> beholder alltid programmet i forgrunnen. <i>I minimert tilstand</i> / <i>I normal tilstand</i> beholder programmet i forgrunnen hvis minimering er aktivert / deaktivert. Show context menu in menu bar Vis kontekstmeny i menylinjen Apply some high contrast optimizations for visually impaired users Legg til noen høykontrastforbedringer for brukere med synshemning Optimize for high contrast Optimaliser for høy kontrast Application Program Adds user and channel context menus into the menu bar Tilføy kanal- og bruker-meny i menylinjen Tray Icon Systemkurvsikon Channel Tree Kanaltre Use selected item as the chat bar target Bruk valgt element som mål for sladrelinjen Filter automatically hides empty channels Filteret skjuler automatisk tomme kanaler Show transmit mode dropdown in toolbar Vis rullegardin for forsendelsesmodus i verktøyslinjen Theme Drakt Theme to use to style the user interface Drakt til bruk for å skreddersy brukergrensesnittet <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. <b>Setter opp hvilken drakt grensesnittet til Mumble skal bruke</b><br />Mumble vil plukke opp drakter fra noen mapper, hvis plassering er gitt, og vise dem i denne listen. Den du velger vil bli brukt til å tilpasse den visuelle framtoningen av Mumble. Dette inkluderer farger, ikoner med mer. User Dragging Brukerdraging This changes the behavior when moving users. Dette endrer oppførselen når brukere flyttes. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. Dette angir opprørselen ved brukerdraging; det kan brukes til å forhindre utilsiktet draging. <i>Flytt</i> flytter brukeren uten forespørsel. <i>Gjør ingenting</i> gjør ingenting og skriver en feilmelding. <i>Spør</i> bruker en meldingsboks til å bekrefte at du virkelig ønsket å flytte brukeren. <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. <b>Skru på utvikler-meny</b><br />Dette skrur på "Utvikler"-menyen i Mumble. Denne menyen brukes for utvikler-spesifikke funksjoner, som utviklingskonsollen. Enable Developer menu Skru på utviklermeny When in custom layout mode, checking this disables rearranging. Når du er i egendefinert oppsettsmodus, vil uthuking av denne skru av omorganisering. Lock layout Lås oppsett MainWindow Root Rot Push-to-Talk Global Shortcut Trykk-for-å-snakke Push and hold this button to send voice. Global Shortcut Trykk og hold denne knappen for åpne for stemmeforsendelse. This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut Dette setter opp trykk-for-å-snakke -knappen, og så lenge du holder denne knappen nede, vil du sende tale. Reset Audio Processor Global Shortcut Nullstill lydbehandler Unlink Plugin Global Shortcut Fjern lenking av programtillegg Push-to-Mute Global Shortcut Trykk-for-å-gjøre-stum Join Channel Global Shortcut Ta del i kanal Toggle Overlay Global Shortcut Veksle skjermforgrunnsinfo Toggle state of in-game overlay. Global Shortcut Veksle statusen til i-spill-skjermforgrunnsinfo Toggle Minimal Global Shortcut Veksle minimal Volume Up (+10%) Global Shortcut Øket lydstyrke (+10%) Volume Down (-10%) Global Shortcut Senket lydstyrke (-10%) Mumble Mumble Mumble -- %1 Mumble -- %1 &Window &Vindu Minimize Minimer Ctrl+M Ctrl+M Close Lukk Mumble is currently connected to a server. Do you want to Close or Minimize it? Mumble er ikke koblet til en tjener. Ønsker du å lukke eller minimere det? Mute Self Global Shortcut Gjør deg selv stum Set self-mute status. Global Shortcut Velg egen stumhetssatus. This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut Dette vil sette eller veksle din stumhetssatus. Hvis du skrur dette av, vil du også kunne skru av at man kan gjøre seg selv stum. Deafen Self Global Shortcut Gjør deg selv døv Set self-deafen status. Global Shortcut Velg selv-døvhetsstatus. This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut Dette vil velge eller veksle din døvhetsstatus. Hvis du skrur det på, vil du også skru på at man kan gjøre seg selv stum. Whisper/Shout Whisper Hvisk/Skrik <center>Not connected</center> Not connected <center>Ikke tilkoblet</center> Clear Tøm Opening URL %1 Åpner URL %1 File does not exist Filen finnes ikke File is not a configuration file. Filen er ikke en oppsettsfil. Settings merged from file. Innstillinger innflettet fra fil. URL scheme is not 'mumble' URL-forordningen er ikke 'mumble' This version of Mumble can't handle URLs for Mumble version %1.%2.%3 Denne versjonen av Mumble kan ikke håndtere URL-er for Mumble versjon %1.%2.%3 Connecting to %1 Kobler til %1 Enter username Skriv inn brukernavn Connecting to server %1. Oppretter forbindelse til tjener %1. Reconnecting. Kobler til igjen. Transmit Mode set to Continuous Forsendelsesmodus satt til sammenhengende <p>%1 (%2)<br />%3</p> <p>%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> <h2>Stemmekanal</h2><p>Kryptert med 128 bit OCB-AES128<br />%1 ms gjennomsnittlig forsinkelse (%4 avvik)</p> Register yourself as %1 Registrer deg selv som %1 <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <p>Du er i ferd med å registrere deg selv på denne tjeneren. Dette kan ikke angres, og ditt brukernavn kan ikke endres når dette først er gjort. Du vil for alltid være kjent som '%1' på denne tjeneren.</p><p>Er du sikker på at du vil registrere deg?</p> <h2>Version</h2><p>Protocol %1</p> <h2>Versjon</h2><p>Protokoll %1</p> <p>No build information or OS version available</p> <p>Ingen bygg- eller OS -versjon tilgjengelig</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) Tilkoblingen er kryptert og identitetsbekreftet ved bruk av %1 og bruker %2 som nøkkelutvekslingsmekanisme (%3) The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) Tilkoblingen er kryptert ved bruk av %1, med %2 for bekreftelse av meldinger og %3 som nøkkelutvekslingsmekanisme (%4) The connection is secured by the cipher suite that OpenSSL identifies as %1 Tilkoblingen er sikret ved bruk av chiffreringsprogrampakken som OpenSSL identifiserer seg som %1 <p>The connection provides perfect forward secrecy</p> <p>Denne tilkoblingen gir perfekt sikkerhetsvidreformidling</p> <p>The connection does not provide perfect forward secrecy</p> <p><p>Denne tilkoblingen gir ikke perfekt sikkerhetsvidreformidling</p></p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> <h2>Kontrollkanal</h2><p>Denne tilkoblingen bruker %1</p>%2%3<p>%4 ms gjennomsnittlig forsinkelse (%5 avvik)</p><p>Fjernvert %6 (port %7)</p> Voice channel is sent over control channel Talekanal blir sendt over kontrollkanalen Register user %1 Registrer bruker %1 <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> <p>Du er i ferd med å registrere %1 på tjeneren. Denne handlingen kan ikke angres, brukernavnet kan ikke endret, og som registrert bruker vil, %1 ha tilgang til tjeneren selv om du endrer tjenerpassordet.</p><p>Fra nå av vil %1 bli identitetsbekreftet med sertifikatet som er i bruk nå.</p><p>Er du sikker på at du ønsker å registrere %1?</p> Kicking user %1 Kaster ut brukeren %1 Banning user %1 Lyser %1 i bann View comment on user %1 Vis kommentar på bruker %1 Message to channel %1 Melding til kanal %1 Connected. Tilkoblet. <li>Expected certificate digest (SHA-1): %1</li> <li>Forventet sertifikatportefølje (SHA-1): %1</li> Server presented a certificate which failed verification. Tjeneren forela et sertifikat som feilet identitetsbekreftelse. <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> <p>%1</p><ul>%2</ul><p>Den spesifikke feilen med dette sertifikatet er:</p><ol>%3</ol><p>Ønsker du å godta dette sertifikatet likevel?<br />(dette vil også bli lagret og du vil ikke bli spurt igjen.)</p> SSL Version mismatch SSL-versjon samsvarer ikke Server connection failed. <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>Skriv melding til kanalen '%1' her</center> <center>Type message to user '%1' here</center> Type message to user '%1' here <center>Skriv melding til brukeren '%1' her</center> Choose image file Velg billedfil Failed to load image Innlesning av bilde feilet Could not open file for reading. Kunne ikke åpne bilde for lesning. Image format not recognized. Billedformat ikke gjenkjent. &User &Bruker &Channel &Kanal Use in conjunction with Whisper to. Global Shortcut Bruk i kombinasjon med hvisken for å. This will switch the states of the in-game overlay. Global Shortcut Dette veksler statusen til i-spill-forgrunnsinfoen. Link Channel Global Shortcut Lenk kanal Cycle Transmit Mode Global Shortcut Veksle forsendelsesmodus Send Text Message Global Shortcut Send tekstmelding Send Clipboard Text Message Global Shortcut Send utklippstavleinnhold som tekstmelding This will send your Clipboard content to the channel you are currently in. Global Shortcut Dette vil sende innholdet fra utklippstavla til den kanalen du er i for øyeblikket. Continuous Sammenhengende Voice Activity Stemmeaktivitet Push-to-Talk Trykk-for-å-snakke Mumble - Minimal View -- %1 Mumble - Minimal visning -- %1 Cancel Avbryt Save Image As... Lagre bilde som… Save Image File Lagre bildefil Could not save image: %1 Kunne ikke lagre bilde: %1 Change your comment Endre din kommentar Transmit Mode set to Voice Activity Forsendelsesmodus satt til stemmeaktivitet Transmit Mode set to Push-to-Talk Forsendelsesmodus satt til trykk-for-å-snakke <p>Connected users: %1/%2</p> <p>Tilkoblede brukere: %1/%2</p> UDP Statistics UDP-statistikk To Server Til tjener From Server Fra tjener Good God Late Forsinket Lost Tapt Resync Resynkronisert <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> <h2>Lydbåndbredde</h2><p>Maksimalt %1 kbit/s<br />Nå %2 kbit/s<br />Kodek: %3</p> Mumble Server Information Mumble tjenerinformasjon &View Certificate &Vis sertifikat Enter reason Oppgi begrunnelse Sending message to %1 Sender melding til %1 To %1: %2 Til %1: %2 Message to %1 Melding til %1 Are you sure you want to reset the comment of user %1? Bekreft nullstilling av kommentar på bruker %1. Are you sure you want to reset the avatar of user %1? Bekreft nullstilling av avatar for bruker %1. Are you sure you want to delete %1 and all its sub-channels? Bekreft sletting av %1 og alle dens underkanaler. Sending message to channel %1 Sender melding til kanalen %1 Message to tree %1 Melding til treet %1 To %1 (Tree): %2 (Tree) %1: %2 Til %1 (tre): %2 Unmuted and undeafened. Stum. og døv-het opphevet. Unmuted. Stumhet opphevet. Muted. Stum. Muted and deafened. Gjort stum og døv. Deafened. Gjort døv. Undeafened. Døvhet opphevet. Restart Mumble? Omstart av Mumble? Some settings will only apply after a restart of Mumble. Restart Mumble now? Noen innstillinger vil bare trå i kraft etter at Mumble er startet på ny. Omstart nå? About Qt Om Qt SSL Verification failed: %1 SSL-bekreftelse mislyktes: %1 <li>Server certificate digest (SHA-1): %1</li> <li>Tjenersertifikatsportefølje (SHA-1): %1</li> <b>WARNING:</b> The server presented a certificate that was different from the stored one. <b>ADVARSEL:</b> Tjeneren presenterte et sertifikat som er forskjellig fra det som er lagret. This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. Denne tjeneren kjører en gammel krypteringsstandard som ikke lenger støttes. Server connection failed: %1. Tilkobling til tjener feilet: %1. Disconnected from server. Frakoblet tjener. Invalid username Ugyldig brukernavn You connected with an invalid username, please try another one. Du koblet til med ugyldig brukernavn, velg nytt. Username in use Brukernavnet er i bruk That username is already in use, please try another username. Brukernavnet er allerede i bruk, prøv et annet. Wrong certificate or password Feil sertifikat eller passord Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. Feil sertifikat eller passord for registrert bruker. Hvis du er sikker på at denne brukeren er beskyttet med et passord, prøv igjen. Ellers avbryt alt og sjekk ditt sertifikat og brukernavn. Wrong password Feil passord Wrong server password for unregistered user account, please try again. Feil tjenerpassord for uregistrert brukerkonto, prøv igjen. Images (*.png *.jpg *.jpeg) Bilder (*.png *.jpg *.jpeg) C&onfigure &Sett opp &Help &Hjelp Log Logg This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. Dette viser nylig aktivitet. Tilkobling til tjenere, feil og informasjonsmeldinger vil alle vises her.<br />For å bestemme akkurat hvilke meldinger som skal vises her, bruk <b>Innstillings</b>-kommandoen fra menyen. &Quit Mumble &Avslutt Mumble Closes the program Lukker programmet Exits the application. Avslutter programmet. Ctrl+Q Ctrl+Q Open the server connection dialog Åpne tjenertilkoblingsdialogen &Disconnect &Koble fra Disconnect from server Koble fra tjeneren Disconnects you from the server. Kobler deg fra tjeneren Show information about the server connection VIs informasjon om tjenerforbindelse This will show extended information about the connection to the server. Viser utvidet informasjon om din tilkobling til tjeneren. &Mute &Gjør stum &Deafen &Gjør døv &Local Mute &Lokal stumhet Send a Text Message Send en tekstmelding Sends a text message to another user. Sender en tekstmelding til en annen bruker. Add new channel Legg til ny kanal This adds a new sub-channel to the currently selected channel. Dette legger til en ny underkanal i valgt kanal. Remove channel Fjern kanal This removes a channel and all sub-channels. Dette fjerner en kanal og alle dens underkanaler Edit Groups and ACL for channel Rediger grupper og ACL for kanal This opens the Group and ACL dialog for the channel, to control permissions. Dette åpne gruppe- og ACL -dialogen for kanalen, for kontrolltilganger. &Link &Lenk Link your channel to another channel Lenk din kanal til en annen kanal This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. Dette er sludrefeltet<br />Hvis du skriver inn tekst her og trykker enter vil teksten bli sendt til valgt bruker. Hvis ingenting er valgt vil meldingen sendes til din nåværende kanal. Chatbar Sludrefelt Shows a dialog of registered servers, and also allows quick-connect. Viser en dialog over registrerte brukere, og tillater også hurtigtilkobling. Kick user (with reason) Hiv ut bruker (med grunnlag) Kick selected user off server. You'll be asked to specify a reason. Hiv valgt bruker ut av tjeneren. Du vil bli spurt om å oppgi en grunn. Mute user Gjør bruker stum Mute or unmute user on server. Unmuting a deafened user will also undeafen them. Gjør eller fjern stumhet fra bruker på tjener. Fjerning av stumhet fra bruker vil også fjerne døvhet for vedkommende. Kick and ban user (with reason) Spark ut og bannlys bruker (med grunnlag) Kick and ban selected user from server. You'll be asked to specify a reason. Spark ut og bannlys valgt bruker fra tjener. Du vil også bli spurt om å oppgi en grunn. Deafen user Gjør bruker døv Deafen or undeafen user on server. Deafening a user will also mute them. Gjør eller fjern døvhet fra bruker på tjeneren. Å gjøre noen døv vil også gjøre vedkommende stum. Mute user locally Gjør bruker stum lokalt Mute or unmute user locally. Use this on other users in the same room. Legg til eller fjern lokal stumhet fra bruker. Bruk dette på andre brukere i samme rom. This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. Dette lenker din nåværende kanal til valgt kanal. Hvis brukere i en kanal har tilgang til å snakke i den andre kanalen, kan de forskjellige brukerne nå høre hverandre. Dette er en permanent lenke, og vil vare til den manuelt blir opphevet eller tjeneren blir startet om. Se snarveier for trykk-for-å-lenke. &Unlink Channel &Fjern lenking Unlink your channel from another channel Fjern lenke fra din kanal til en annen This unlinks your current channel from the selected channel. Dette fjerner lenken mellom din nåværende kanal fra valgt kanal. Unlinks your channel from all linked channels. Fjerner lenken mellom din kanal og alle lenkede kanaler. This unlinks your current channel (not the selected one) from all linked channels. Dette fjerner lenken fra din nåværende kanal (ikke valgt kanal) fra alle lenkede kanaler. &Reset &Tilbakestill Reset audio preprocessor Tilbakestill lydbehandler This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. Dette vil tilbakestille lyd for-behandleren, inkludert lydkansellering, automatisk forsterkningsjustering og aktivitetsoppdagelse. Hvis noe plutselig forverrer lydmiljøet (som at noen mister mikrofonen) og det var midlertidig, bruk dette for å forhindre at for-behandleren skal rejustere seg. &Mute Self &Gjør deg selv stum Mute yourself Gjør deg selv stum Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. Gjør deg selv stum eller fjern stumhet fra deg selv. Når du er stum vil du ikke sende noe data til tjeneren. Å fjerne stumhet mens du er døv vil også fjerne døvheten. &Deafen Self &Gjør deg selv døv Deafen yourself Gjør deg selv døv Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. Legg til eller fjern døvhet for deg selv. Når gjort døv, vil du ikke høre noe. Å gjøre deg selv døv gjør deg også stum. &Text-To-Speech &Tekst-til-tale Toggle Text-To-Speech Veksle tekst-til-tale Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. Skru på eller av tekst-til-tale -motoren. Bare meldinger ment for TTT i oppsettsdialogen vil bli uttalt. Display audio statistics Vis lydstatistikk Pops up a small dialog with information about your current audio input. Viser et lite oppsprettsvindu med informasjon om din nåværende lydinngang. Forcibly unlink plugin Fralenk programtillegg med tvang This forces the current plugin to unlink, which is handy if it is reading completely wrong data. Dette tvinger det nåværende programtillegget til å ikke lenger være lenket, noe som er nyttig hvis det leser helt feil data. Configure Mumble Sett opp Mumble Allows you to change most settings for Mumble. Lar deg endre de fleste innstillingene i Mumble. Start the audio configuration wizard Start lydoppsettsveiviseren This will guide you through the process of configuring your audio hardware. Denne veilederen vil ta deg gjennom måten din lydmaskinvare settes opp. &What's This? &Hva er dette? Enter What's This? mode Gå inn i "Hva er dette?"-modus Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. Klikk for å tre inn i "Hva er dette?"-modus. Din peker vil forvandles til et spørsmålstegn. Klikk på vilkårlig knapp, menyvalg eller område for å få en beskrivelse av hva noe er. Information about Mumble Informasjon om Mumble Shows a small dialog with information and license for Mumble. Viser en liten dialog med informasjon og lisensinfo om Mumble. Information about Speex Informasjon om Speex Shows a small dialog with information about Speex. Viser en liten dialog med informasjon om Speex. Information about Qt Informasjon om Qt Shows a small dialog with information about Qt. Viser en liten dialog med informasjon om Qt. Check for &Updates Se etter &oppdateringer Check for new version of Mumble Se etter ny Mumble-versjon Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. Kolber til Mumble sin nettside for å se om en ny versjon er tilgjengelig, og gir deg beskjed om en passende nedlastingsnettadresse hvis dette viser seg å være tilfelle. Sends a text message to all users in a channel. Sender en tekstmelding til alle brukere i en kanal. Configure certificates for strong authentication Sett opp sertifikater for sterk identitetsbekreftelse This starts the wizard for creating, importing and exporting certificates for authentication against servers. Starter veiviseren for opprettelse, importering og eksport av sertifikater for identitetsbekreftelse mot tjenere. Register user on server Registrer bruker på tjener This will permanently register the user on the server. Dette vil registrere brukeren på tjeneren for godt. Add &Friend Legg til &venn Adds a user as your friend. Legger til en bruker som din venn. This will add the user as a friend, so you can recognize him on this and other servers. Dette vil legge til brukeren som venn, slik at du kan gjenkjenne vedkommende på denne og andre tjenere. &Remove Friend &Fjern venn Removes a user from your friends. Fjerner en bruker fra din venneliste. This will remove a user from your friends list. Dette vil fjerne en bruker fra din venneliste. &Update Friend &Oppdater venn Update name of your friend. Oppdater navnet til vennen din. Your friend uses a different name than what is in your database. This will update the name. Din venn bruker et annet navn en hva som er oppgitt i din database. Dette vil oppdatere navnet. Edit registered users list Rediger liste over registrerte brukere This opens the editor for registered users, which allow you to change their name or unregister them. Dette åpner tekstbehandleren for registrerte brukere, som lar deg endre navnet deres og avregistrere dem. Add or remove text-based access tokens Legg til eller fjern tekstbaserte tilgangssymbol &Minimal View &Minimal visning Toggle minimal window modes Veksle minimerte vindusmodi This will toggle minimal mode, where the log window and menu is hidden. Dette vil veksle minimal modus, der loggingsvinduet og menyen er gjemt. You muted and deafened %1. Du gjorde %1 stum og døv. You unmuted and undeafened %1. Du opphevet stumhet og døvhet fra %1. You undeafened %1. Du opphevet døvhet fra %1. You suppressed %1. Du undertrykte %1. %1 muted and deafened by %2. %1 gjort stum og døv av %2. %1 unmuted and undeafened by %2. %1 fikk sin stumhet og døvhet opphevet av %2. %1 undeafened by %2. %1 fikk sin døvhet opphevet av %2. %1 suppressed by %2. %1 undertrykt av %2. %1 moved to %2. %1 flyttet til %2. %1 moved to %2 by %3. %1 flyttet til %2 av %3. %1 moved in from %2 by %3. %1 overbragt fra %2 av %3. %1 is now muted and deafened. %1 er nå stum og døv. Your account information can not be verified currently. Please try again later Din kontoinformasjon kan ikke bekreftes for øyeblikket. Prøv igjen senere Welcome message: %1 Velkomstmelding: %1 Mumble: %1 Mumble: %1 You were denied %1 privileges in %2. Du ble nektet %1 privilegium i %2. %3 was denied %1 privileges in %2. %3 ble nektet %1 privilegium i %2. Denied: Cannot modify SuperUser. Nektet: Kan ikke endre SuperBruker. Denied: Invalid channel name. Nektet: Ugyldig kanalnavn. Denied: Text message too long. Nektet: Tekstmelding for lang. Denied: Operation not permitted in temporary channel. Nektet: Operasjonen tillates ikke i en midlertidig kanal. You need a certificate to perform this operation. Du trenger et sertifikat for å utføre denne handlingen. %1 does not have a certificate. %1 har ikke et sertifikat. Invalid username: %1. Ugyldig brukernavn: %1 Invalid username. Ugyldig brukernavn. Channel is full. Kanalen er full. Channel nesting limit reached. Grensen for tillegg av underkanaler er nådd. Channel count limit reached. Need to delete channels before creating new ones. Permission denied. Tilgang nektet. %1 connected. %1 tilkoblet. %1 is now muted. %1 er nå stum. %1 is now unmuted. %1 har nå fått sin stumhet opphevet. Recording started Opptak startet Recording stopped Opptak stoppet %1 started recording. %1 begynte å ta opp. %1 stopped recording. %1 sluttet å ta opp. You revoked your priority speaker status. Du tilbakekalte din prioriterte talerstatus. You assumed priority speaker status. Du tok prioritert taler-status. %1 revoked your priority speaker status. %1 tilbakekalte din prioritert taler-status. %1 gave you priority speaker status. %1 ga deg prioritert taler-status You revoked priority speaker status for %1. Du tilbakekalte prioritert taler-status for %1. You gave priority speaker status to %1. Du ga prioritert taler-status til %1. %1 revoked own priority speaker status. %1 tilbakekalte egen prioritert taler-status. %1 assumed priority speaker status. %1 tok prioritert taler-status. %1 revoked priority speaker status for %2. %1 tilbakekalte prioritert-taler status for %2. %1 gave priority speaker status to %2. %1 ga prioritert-taler status til %2. You were unmuted and undeafened by %1. Du fikk din stum- og døv-het opphevet av %1. You were muted by %1. Du ble gjort stum av %1. You were undeafened by %1. Du fikk din demping opphevet av %1. You were suppressed. You were suppressed by %1. Du ble undertrykt. You were unsuppressed. Undertrykking av deg ble opphevet. You were unsuppressed by %1. Du fikk din undertrykking opphevet av %1. You joined %1. You moved %1 to %2. Du flyttet %1 til %2. %1 is recording %1 tar opp %1 renamed to %2 by %3. %1 gitt nytt navn til %2 av %3. %1 disconnected. %1 koblet fra. Server message from Tjener (Tree) (Tre) (Channel) (Kanal) (Private) (Privat) %2%1: %3 %2%1: %3 The server requests minimum client version %1 Tjeneren forespør minimum klientversjon %1 The server requests positional audio be enabled. Tjeneren forespør at posisjonsbasert lyd er påskrudd. The server requests positional audio be disabled. Tjeneren forespør at posisjonsbasert lyd er avskrudd. The server requests Push-to-Talk be enabled. Tjeneren forespør at trykk-for-å-snakke er påskrudd. The server requests Push-to-Talk be disabled. Tjeneren forespør at trykk-for-å-snakke er avskrudd. You were unmuted by %1. Du fikk din stumhet opphevet av %1. You muted %1. Du gjorde %1 stum. You unsuppressed %1. Du opphevet undertrykking av %1. You unmuted %1. Du opphevet forstumming av %1. %1 muted by %2. %1 gjort stum av %2. %1 unsuppressed by %2. %2 fikk sin undertrykking opphevet av %1. %1 unmuted by %2. %2 opphevet %1 sin stumhet. Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. Kunne ikke finne samsvarende CELT-kodek delt av andre klienter. Du vil ikke kunne snakke med alle brukerne. You were muted and deafened by %1. You were deafened by %1. Du ble gjort stum og døv av %1. You were kicked from the server by %1: %2. Du ble sparket ut av tjeneren av %1: %2. %3 was kicked from the server by %1: %2. %3 ble sparket ut av tjeneren av %1: %2. You were kicked and banned from the server by %1: %2. Du ble sparket ut og bannlyst fra tjeneren av %1. %2. %3 was kicked and banned from the server by %1: %2. %3 ble sparket ut og bannlyst fra tjeneren av %1: %2. You were moved to %1 by %2. Du ble flyttet til %1 av %2. %1 entered channel. %1 kom inn i kanalen. Server connection rejected: %1. Tjenertilkobling avslått: %1 Denied: %1. Nektet: %1. %1 renamed to %2. %1 heter nå %2. %1 left channel and disconnected. %1 forlot kanalen og koblet fra. Message from %1 Melding fra %1 You have User Dragging set to "Do Nothing" so the user wasn't moved. Du har brukerdraging satt til "Gjør ingenting" så brukeren ble ikke flyttet. You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. Du har kanaldraging satt til "Gjør ingenting" så kanalen ble ikke flyttet. Unknown Channel Drag mode in UserModel::dropMimeData. Ukjent kanaldragingsmodus i UserModel::dropMimeData. Remote controlling Mumble: Fjernkontroll av Mumble: Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. Bruk: mumble [options] [<url>] <url> spesifiserer en URL å koble til etter oppstart i stedet for å vise tilkoblingsvinduet, og har følgende form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] Versjonsspørringsparameteret må settes for å kunne kalle rett klientversjon. Det har 1.2.0 som forvalg nå Gyldige valg: -h, --help Viser denne hjelpeteksten og avslutter. -m, --multiple Tillater å starte flerfoldige utgaver av klienten. -n, --noidentity Undertrykk lasting av identitetsfiler (altså sertifikater.) --license Vis Mumble-lisensen. --authors Vis hvem som har utviklet Mumble. --third-party-licenses Vis lisenser for tredjepartsprogramvare brukt av Mumble. Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status Bruk: mumble rpc <action> [options] Det er mulig å fjernstyre en kjørende utgave av Mumble ved å bruke 'mumble rpc'-kommandoen. Gyldige valg: mute Gjør deg selv stum unmute Opphev egen stumhet togglemute Veksle status for egen stumhet deaf Gjør deg selv døv undeaf Opphev egen døvhet toggledeaf Veksle status for egen døvhet Invocation Påkallelse Error: No RPC command specified Feil: Ingen RPC-kommendo oppgitt RPC RPC Welcome to Mumble. Velkommen til Mumble. Skipping version check in debug mode. Hopper over versjonssjekk i feilrettingsmodus. Hide Frame Skjul ramme Toggle showing frame on minimal window Veksle visning av ramme i minimalt vindu This will toggle whether the minimal window should have a frame for moving and resizing. Dette vil veksle hvorvidt det minimale vinduet skal ha en ramme for flytting og endring av størrelse. &Unlink All &Fjern alle sammenlenkinger Reset the comment of the selected user. Tilbakestill kommentar for valgt bruker &Join Channel &Ta del i kanal View comment in editor Vis kommentar i tekstbehandler Query server for connection information for user Spør tjeneren om tilkoblingsinformasjon om bruker S&erver &Tjener &Self &Selv &Unlink Plugins &Fjern lenking av programtillegg Register yourself on the server Registrer deg selv på tjeneren Change your avatar image on this server Fjern ditt avatarbilde på denne tjeneren &Remove Avatar &Fjern avatar Remove currently defined avatar image. Fjern gjeldende avatarbilde Icon Toolbar Ikonverktøyslinje Change your own comment Endre din egen kommentar Recording Opptak Priority Speaker Prioritert taler &Copy URL &Kopier URL Copies a link to this channel to the clipboard. Kopierer en lenke til denne kanalen til utklippstavlen. Ignore Messages Ignorer meldinger Locally ignore user's text chat messages. Ignorer brukerens sludremeldinger lokalt Silently drops all text messages from the user. Avskjediger alle tekstmeldinger fra brukeren i all stillhet. Edit ban list on server Rediger bannlysningslisten på tjeneren This lets you edit the server-side IP ban list. Dette lar deg endre den tjenerbaserte bannlysningslisten over IP-adresser. &Filter on/off &Filter på/av Toggle the channel filter (Ctrl+F) Veksle kanalfiteret (Ctrl+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. Skru på eller av filtrering av valgte kanaler. Som forvalg vil alle tomme kanaler bli filtrert. Du kan markere ytterligere kanaler fra filtrering fra kanalens kontekstmeny. Ctrl+F Ctrl+F &Hide Channel when Filtering &Skrul kanal ved filtrering Reset the avatar of the selected user. Tilbakestill avataren tilhørende valgt bruker. Locally adjust the user's speech volume. Lokal justering av brukerens talelydstyrkenivå Opens a dialog with a volume slider. Use this on other users in the same room. Åpner en dialog med en lydstyrkeglidebryter. Bruk denne på andre brukere i samme rom. &Developer &Utvikler &Hide Mumble &Skjul Mumble Hides the main Mumble window. Gjemmer hovedvinduet til Mumble. Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. Skjuler hovedvinduet til Mumble. Gjenopprett det ved å klikke på systemkurven eller å starte Mumble igjen. Show the Developer Console Vis utviklerkonsollen Shows the Mumble Developer Console, where Mumble's log output can be inspected. Viser utviklerkonsollen i Mumble, der du kan se Mumbles loggutdata og inspisere den. &Connect... &Koble til… &Ban list... &Bannlysningsliste… &Information... &Informasjon… &Kick... &Kast ut… &Ban... &Bannlys… Local Volume Adjustment... Lokal lydstyrkejustering… Send &Message... Send &melding… &Add... &Legg til… &Remove... &Fjern… &Edit... &Rediger… Audio S&tatistics... &Lydstatistikk… &Settings... &Innstillinger… &Audio Wizard... &Lydveiviser… Developer &Console... &Utviklerkonsoll &About... &Om… About &Speex... Om &Speex… About &Qt... Om &Qt… &Certificate Wizard... &Sertifikatsveiviser… &Register... &Registrer… Registered &Users... Registrerte &brukere… Change &Avatar... Endre &avatar… &Access Tokens... &Tilgangssymboler… Reset &Comment... Tilbakestill &kommentar… Reset &Avatar... Tilbakestill &avatar… View Comment... Vis kommentar… &Change Comment... &Endre kommentar… R&egister... &Registrer… Manual Manual Mumble Positional Audio Manuell posisjonsbasert lyd for Mumble Position Posisjon X X Y Y Z Z m m Heading Retning Azimuth Asimut Elevation Høyde ° ° Meta data Metadata Context Bindeleddsinformasjon Identity Identitet Set Sett State Tilstand Linked Lenket Activated Akivert Unhinge Henglse fra NetworkConfig Network Nettverk Updates are mandatory when using snapshot releases. Oppdateringer er påkrevde når du bruker øyeblikksutgaver. Connection Tilkobling Use TCP compatibility mode Use TCP compatability mode Bruk TCP kompabilitetsmodus <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). <b>Skru på TCP kompabilitetsmodus</b>.<br />Dette får Mumble til å kommunisere bare ved bruk av TCP mot tjeneren. Dette øker overskuddet og forårsaker pakketap som igjen gir merkbare stopp i kommunikasjonen, så de bør bare brukes hvis du ikke kan bruke forvalget (som bruker UDP for tale og TCP for kontrollsignal). Reconnect when disconnected Koble til igjen ved frakobling <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. <b>Koble til igjen ved frakobling</b>.<br />Mumble vil automatisk prøve å koble til igjen 10 sekunder etter at din tjenerforbindelse feiler. Reconnect automatically Koble til igjen automatisk Proxy Mellomtjener Type Type Type of proxy to connect through Typen mellomtjener å koble til gjennom Direct connection Direkte tilkobling HTTP(S) proxy HTTP(S)-mellomtjener SOCKS5 proxy SOCKS5-mellomtjener Hostname Vertsnavn Hostname of the proxy Vertsnavnet til mellomtjeneren Force TCP mode Tving TCP-modus Enable QoS to prioritize packets Skru på QoS for å prioritere pakker This will enable QoS, which will attempt to prioritize voice packets over other traffic. Dette vil skru på QoS, som vil etterstrebe prioritering av stemmepakker framfor annen trafikk. Use Quality of Service Bruk tjenestekvalitetsprioritering Don't send certificate to server and don't save passwords. (Not saved). Ikke send sertifikat til tjener og ikke lagre passord. (Ikke lagret). <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> <b>Dette undertrykker identitetsinformasjon fra klienten.</b><p>Klienten vil ikke identifisere seg med et sertifikat selv om det er definert, og vil ikke mellomlagre passord for tilkoblinger. Dette er i hovedsak et test-valg og blir ikke lagret.</p> Suppress certificate and password storage Undertrykk sertifikat- og passords-lagring <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>Typen mellomtjener Mumble kobler til gjennom.</b><br /> for alle utgående tilkoblinger. Merk: Mellomtjenertunnelering tvinger Mumble til å bruke TCP kompabilitetsmodus, slik at all taledata blir sendt gjennom kontrollkanalen. <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. <b>Vertsnavnet til mellomtjeneren.</b><br />Dette felter spesifiserer vertsnavnet til mellomtjeneren du prøver å tunnelere nettverkstrafikk gjennom. Port Port Port number of the proxy Portnummeret til mellomtjeneren <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. <b>Portnummeret til mellomtjeneren.</b><br />Dette feltet spesifiserer portnummberet som mellomtjeneren forventer tilkoblinger på. Username Brukernavn Username for proxy authentication Brukernavn for mellomtjener-identitetsbekreftelse <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>Brukernavn for identitetsbekreftelse til mellomtjener.</b><br />Angir brukernavnet brukt til bekreftelse ovenfor mellomtjeneren. I fall den ikke bruker identitetsbekreftelse, eller du ønsker å koble til anonymt, la dette feltet stå tomt. Password Passord Password for proxy authentication Passord for mellomtjener-identitetsbekreftelse <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>Passord for identitetsbekreftelse til mellomtjener.</b><br />Angir passordet brukt til bekreftelse ovenfor mellomtjeneren. I fall den ikke bruker identitetsbekreftelse, eller du ønsker å koble til anonymt, la dette feltet stå tomt. Mumble services Mumble-tjenester Check for new releases of Mumble automatically. Se etter nye utgaver av Mumble automatisk. This will check for new releases of Mumble every time you start the program, and notify you if one is available. Dette vil se etter nye versjoner av Mumble hver gang du starter programmet, og gjøre det oppmerksom på oppdateringer. Check for application updates on startup Se etter programoppdateringer ved oppstart Check for new releases of plugins automatically. Se etter nye utgaver av programtillegg automatisk. This will check for new releases of plugins every time you start the program, and download them automatically. Dette vil se etter nye versjoner av Mumble hver gang du starter programmet, og laste dem ned automatisk. <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. <b>Send inn anonym statistikk.</b><br />Mumble har et lite utviklerlag, og trenger derfor å fokusere sin utvikling der det trengs mest. Ved å sende inn en del statistikk kan du hjelpe prosjektet å fastslå hvor utvikling bør fokuseres. Submit anonymous statistics to the Mumble project Send inn anonym statistikk til Mumble-prosjektet Submit anonymous statistics Send anonym statistikk Reconnect to last used server when starting Mumble Koble til tjeneren som sist ble brukt ved oppstart av Mumble Reconnect to last server on startup Koble til tjeneren som sist ble brukt ved oppstart Download plugin and overlay updates on startup Last ned programtillegg og forgrunnsinformasjonsoppdateringer ved oppstart Privacy Personvern Prevent OS information being sent to Mumble servers and web servers Forhindre OS-informasjon fra å bli sendt til Mumble-tjenere og vev-tjenere <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. <b>Ikke send OS-informasjon til tjenere</b><br/> Forhindrer klienten fra å sende potensielt identifiserende informasjon om operativsystemet til Mumble-tjeneren og vev-tjenere. Do not send OS information to Mumble servers and web servers Ikke send OS-informasjon til Mumble-tjenere og vev-tjenere Overlay Silent Stille Talking Snakker Whisper Hvisk Shout Rop Channel Kanal Failed to create communication with overlay at %2: %1. No overlay will be available. Klarte ikke å opprette kommunikasjon med forgrunnslag på %2: %1. Ingen forgrunnsinformasjonslag vil være tilgjengelige. OverlayClient Filter Filter Only talking Snakker bare Talking and recently active Snakker og var nylig aktiv All in current channel Alle i nåværende kanal All in linked channels Alle i sammenlenkede kanaler Always show yourself Alltid vis deg selv Configure recently active time (%1 seconds)... Sett opp tidsavbrudd for nylig aktiv tid (%1 sekunder)… Columns Kolonner Sort Sorter Alphabetically Alfabetisk Last state change Siste statusendring Edit... Rediger… Reset Zoom Tilbakestill forstørrelsesnivå Configure recently active time Sett opp tid for nylig aktiv tid Amount of seconds users remain active after talking: Antall sekunder brukerne forblir aktive etter å ha snakket: OverlayConfig To move the users, drag the little red dot. For å flytte brukerne, dra den lille røde prikken. To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. For å endre størrelsen på brukerne, drei musehjulet over en bruker. For more options, right click a user. For more options, rightclick a user. For flere valgmuligheter, høyreklikk på en bruker. Launcher Filter Oppstarterfilter Overlay Forgrunnslag Choose executable Velg kjørbar fil Choose application Velg program Choose path Velg sti Load Overlay Presets Last inn forvalg for forgrunnslag Mumble overlay presets (*.mumblelay) Forvalg for overlag i Mumble (*.mumblelay) Save Overlay Presets Lagre forvalg for forgrunnslag Options Valg Enable overlay. Skru på forgrunnslag. Enable Overlay Skru på forgrunnslag This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. Endringer i forgrunnslag trer kun i effekt i det et program startes. Start programmer på ny etter å ha gjort endringer for å se dem. Layout Oppsett Blacklist Svarteliste Whitelist Hvitliste Uninstall Overlay Avinstaller forgrunnslag Overlay Installation Installasjon av forgrunnslag Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. Mumble har oppdaget at du ikke har Mumble-forgrunnslaget installert. Klikk på knappen nedenfor for å installere forgrunnslaget. Install Mumble Overlay Installer Mumble-forgrunnslaget Overlay Upgrade Forgrunnslags-oppdatering Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. Forgrunnslag utdatert. Trykk på knappen nedefor for å oppgradere. Upgrade Mumble Overlay Opgrader Mumble-forgrunnslag Display a frame counter in the overlay Vis en rammeteller i forgrunnslaget Show FPS counter Vis FPS-teller Load an overlay preset from file Last inn et forgrunnslagsforvalg fra ei fil Load… Last inn… Save your overlay settings to file Lagre dine forgrunnsinnstillinger til ei fil Save… Lagre… Set the overlay font. Velg forgrunnslagsskriften. Set the overlay text color. Velg tekstfarge for forgrunnslag. Color Farge Remove Fjern Font Skrift FPS and Clock Display FPS og klokkevisning Display a clock in the overlay showing the current local time (system time). Vis en klokke i forgrunnslaget med gjeldende lokaltid (systemtid). Show Clock Vis klokke Overlay Exceptions Unntak fra forgrunnslag Overlay Exception Mode Unntak fra forgrunnslag-modus Allowed launchers Tillatte oppstartere Add Legg til Allowed programs Tillatte programmer Allowed paths Tillatte stier Blacklisted programs Svartelistede programmer OverlayEditor State Tilstand User is not talking Brukeren snakker ikke Passive Passiv User is talking in your channel or a linked channel En bruker snakker i din kanal eller en lenket kanal Talking Snakker User is whispering to you privately En bruker hvisker privat til deg Private Whisper Privat hvisken User is shouting to your channel Brukeren roper til kanalen din Channel Whisper Kanalhvisken Zoom Forstørr Zoom Factor Forstørrelsesfaktor Enabled Elements Påskrudde elementer User avatar, chosen by each user Bruk avatar, valgt av hver bruker Avatar Avatar User's name Brukerens navn Username Brukernavn Name of user's channel, if outside your current channel Navnet på brukerens kanal, hvis vedkommende er utefor din egen Channel Kanal Muted or deafened Gjort stum eller døv Mute state Døvhetsstatus Bounding box, automatically shrunk to minimum size to contain all visible elements Avgrensningsramme, automatisk krympet til minimumstørrelse for alle synlige elementer Bounding box Avgrensningsramme Overlay Editor Behandler for forgrunnslag OverlayEditorScene Layout preset Forgrunnslagsforvalg Large square avatar Stor firkantet avatar Avatar and Name Avatar og navn User Opacity Brukerugjennomsiktighet %1% %1% Object Opacity Objektugjennomsiktighet Alignment Justering Left Venstre Center Midten Right Høyre Top Toppen Bottom Bunnen Color... Farge… Font... Skrift… Bounding box Avgrensningsramme Pen width Skriftsbredde Padding Spaltefyll Pen color Skriftsfarge Fill color Utfyllingsfarge Pick pen color Velg skriftsfarge Pick fill color Velg utfyllingsfarge Pick color Velg farge Pick font Velg skrifttype PluginConfig Plugins Programtillegg Plugin has no configure function. Programtillegget har ingen oppsettsfunksjoner. Plugin has no about function. Programtillegget har ingen informasjonsfunksjon Form Skjema Options Valg Enable plugins and transmit positional information Skru på programtillegg og oversend posisjonsbasert informasjon This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. Dette tillater programtillegg for støttede spill å innhente din posisjon inne i spillet og oversende den i hver talepakke. Dette lar andre brukere høre stemmen din inne i spillet fra der din karakter befinner seg relativt til seg selv. Link to Game and Transmit Position Lenke til spill og forsendelsesposisjon Reloads all plugins Gjeninnlast alle programtillegg This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. Dette skanner og gjeninnlaster programtillegg. Bruk dette hvis du akkurat la til eller endret et programtillegg i programtilleggsmappa. &Reload plugins &Gjeninnlast programtillegg Information about plugin Informasjon om programtillegg This shows a small information message about the plugin. Dette viser en liten informasjonsmelding om programtillegget. &About &Om Show configuration page of plugin Vis oppsettside tilhørende programtillegg This shows the configuration page of the plugin, if any. Dette viser oppsettssiden tilhørende programtillegget, hvis noen. &Configure &Sett opp Name Navn Enabled Påskrudd Plugins Skipping plugin update in debug mode. Hopper over programoppdatering i feilrettingsmodus. Downloaded new or updated plugin to %1. Programtillegg lastet ned eller oppdatert til %1. Failed to install new plugin to %1. Klarte ikke å installere nytt programtillegg til %1. %1 lost link. %1 mistet lenke. %1 linked. %1 er lenket. PortAudioSystem Default Device Forvalgt enhet PulseAudioSystem Default Input Forvalgt inngang Default Output Forvalgt utgang QApplication Failed to restart mumble Klarte ikke å utføre omstart av Mumble Mumble failed to restart itself. Please restart it manually. Mumble klarte ikke å starte seg selv på nytt. Start det på nytt manuelt. RichTextEditor Failed to load image Klarte ikke å laste inn bilde Image file too large to embed in document. Please use images smaller than %1 kB. Bildet er for stort for innebygging i dokument. Bruk et bilde mindre enn %1 kB. Message is too long. Meldingen er for lang. Display Vis Source Text Kildetekst &Bold &Fet Ctrl+B Ctrl+B &Italic &Kursiv Italic Kursiv Ctrl+I Ctrl+I Underline Understreking Ctrl+U Ctrl+U Color Farge Insert Link Sett inn lenke Ctrl+L Ctrl+L Insert Image Sett inn bilde RichTextEditorLink Add Link Legg til lenke URL URL Text Tekst ServerHandler Unable to resolve hostname Server is not responding to TCP pings Tjeneren besvarer ikke TCP-ping UDP packets cannot be sent to or received from the server. Switching to TCP mode. UDP-pakker kan ikke bli sendt eller mottatt av tjeneren. Bytter til TCP-modus. UDP packets cannot be sent to the server. Switching to TCP mode. UDP-pakker kan ikke sendes til tjeneren. Bytter til TCP-modus. UDP packets cannot be received from the server. Switching to TCP mode. UDP-pakker kan ikke mottas fra tjeneren. Bytter til TCP-modus. UDP packets can be sent to and received from the server. Switching back to UDP mode. UDP-pakker kan sendes og mottas av tjeneren. Bytter tilbake til UDP-modus. Connection timed out Tidsavbrudd for forbindelse ServerView Favorite Favoritt LAN LAN Public Internet Offentlig Internett Africa Afrika Asia Asia North America Nord-Amerika South America Sør-Amerika Europe Europa Oceania Australia ShortcutActionWidget Unassigned Utildelt ShortcutDelegate On Off Av Toggle Veksle Unassigned Utildelt ShortcutKeyWidget Press Shortcut Trykk snarvei ShortcutTargetDialog Root Rot Parent Opphav Current Nåværende Subchannel #%1 Underkanal #%1 ShortcutTargetWidget ... , , Root Rot Parent Opphav Current Nåværende Subchannel #%1 Underkanal #%1 Invalid Ugyldig Empty <Empty> Tom ShortcutToggleWidget Off Av Toggle Veksle On TextMessage Enter text Skriv inn tekst If checked the message is recursively sent to all subchannels Hvis valgt vil meldingen bli sendt rekursivt til alle underkanaler Send recursively to subchannels Send rekursivt til alle underkanaler Tokens Empty Token Tomt symbol Mumble - Access Tokens Mumble - Tilgangssymbol List of access tokens on current server Liste over tilgangssymbol på gjeldende tjener <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. <b>Dette er en redigerbar liste over tilgangssymbol på den tilkoblede tjeneren.</b> <br /> Et tilgangssymbol er en tekststring, som kan brukes som et passord for veldig enkl tilgangsbehandling på kanaler. Mumble vil huske symbolene du har brukt og sende til tjenere igjen neste gang du kobler til, slik at du ikke må skrive dem inn hver gang. Add a token Legg til et symbol &Add &Legg til Remove a token Fjern et symbol &Remove &Fjern UserEdit Registered Users Registrerte brukere Remove Fjern Rename Gi nytt navn Who are you looking for? Hvem leter du etter? Days Dager Weeks Uker Months Måneder Years År Inactive for Inaktiv i Registered users: %n account(s) Registrerte brukere: %n konto(er)Registrerte brukere: %n konto(er) UserInformation User Information Brukerinformasjon Connection Information Tilkoblingsinformasjon Version Versjon OS OS Certificate Sertifikat IP Address IP-adresse CELT Versions CELT-versjoner Details... Detaljer… Ping Statistics Svartidsstatistikk Pings received Svartidspakker mottatt Average ping Gjennomsnittlig svartid TCP (Control) TCP (Kontroll) UDP (Voice) UDP (Stemme) UDP Network statistics UDP nettverksstatistikk Good God Late Sen Lost Tapt Resync Resynkroniser From Client Fra klient To Client Til klient Connection time Tilkoblingstid %1w %1u %1d %1d %1h %1t %1m %1m %1s %1s , , %1 (%2) %1.%2.%3 (%4) %1 (%2) Supported Støttet Not Supported Ikke støttet Not Reported Ikke innrapportert %1 online (%2 idle) %1 pålogget (%2 lediggang) %1 online %1 pålogget %1 kbit/s %1 kbit/s Bandwidth GroupBox Båndbredde Bandwidth Label Båndbredde Ping deviation Svartidsavvik UserListModel Nick Kallenavn Inactive days Inaktive dager Last channel Siste kanal Last seen: %1 Sist sett: %1 Never Aldri Channel ID: %1 UserLocalVolumeDialog Local volume for other users Lokalt lydstyrkenivå for andre brukere <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. <b>Juster lydstyrkenivået til andre brukere lokalt</b><br />Mumble støtter justering av volumet til andre brukere lokalt. Adjusting local volume for %1 Justerer lokalt voum for %1 dB dB <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> <html><head/><body><p>Bruk glidebryteren eller tekstboksen for å endre lydstyrken på brukeren.</p><p><span style="font-weight:600;">Advarsel!</span></p><p>Økning av lydstyrken av en bruker kan skade hørselen din permanent. Det kan også øke bakgrunnstøten til brukeren.</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: Dette er en bruker tilknyttet tjeneren. Ikonet til venstre for brukeren indikerer hvorvidt de snakker: Talking to your channel. Snakker til din kanal Shouting directly to your channel. Whispering directly to your channel. Roper direkte til din kanal. Whispering directly to you. Hvisker direkte til deg. Not talking. Snakker ikke. This is a channel on the server. The icon indicates the state of the channel: Dette er en kanal på tjeneren. Ikonet indikerer kanalstatus. Your current channel. Din gjeldende kanal. A channel that is linked with your channel. Linked channels can talk to each other. En kanal som er lenket til din kanal. Lenkede kanaler kan snakke til hverandre. A channel on the server that you are not linked to. En kanal på tjeneren som du ikke er lenket til. This shows the flags the user has on the server, if any: Dette viser flaggene brukeren har på tjeneren, hvis noen: On your friend list På din venneliste Authenticated user Identitetsbekreftet bruker Muted (manually muted by self) Stum (manuelt gjort stum av eget grep) Muted (manually muted by admin) Stum (manuelt gjort stum av en administrator) Muted (not allowed to speak in current channel) Stum (får ikke snakke i gjeldende kanal) Muted (muted by you, only on your machine) Stum (gjort stum av deg, bare på din maskin) Muted (push-to-mute) Deafened (by self) Gjort døv (av eget valg) Deafened (by admin) Gjort døv (av administrator) User has a new comment set (click to show) Brukeren har en ny kommentar satt (klikk for å vise) User has a comment set, which you've already seen. (click to show) Brukeren har en kommentar satt, som du allerede har sett. (Klikk for å vise) Ignoring Text Messages Ignorerer tekstmeldinger This shows the flags the channel has, if any: Dette viser flaggene kanalen har, hvis noen: Channel has a new comment set (click to show) Kanalen har en ny kommentar (klikk for å vise) Channel has a comment set, which you've already seen. (click to show) Kanalen har en kommentar satt, som du allerede har sett. (Klikk for å vise) Channel will be hidden when filtering is enabled Kanalen vil bli gjemt når filtrering er påslått Name Navn Flags Flagg Are you sure you want to drag this user? Er du sikker på at du vil dra denne brukeren? Are you sure you want to drag this channel? Er du sikker på at du vil dra denne kanalen? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. Kan ikke utføre denne bevegelsen automatisk, tilbakestill de numeriske sorteringsindikatorene eller juster dem manuelt. VersionCheck Upgrade Mumble Oppgrader Mumble A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? En ny versjon av Mumble har blitt oppdaget og automatisk nedlastet. Det er anbefalt at du enten oppgraderer til denne versjonen, eller endgraderer til seneste ferdige utgave. Ønsker du å starte opp installasjonskandidaten nå? Failed to launch snapshot installer. Klarte ikke å starte opp øyeblikks-installasjonskandidat. Corrupt download of new version detected. Automatically removed. Ødelagt nedlasting av ny versjon oppdaget. Automatisk fjernet. Downloading new snapshot from %1 to %2 Laster ned nytt øyeblikks-installasjonskandidat fra %1 til %2 Failed to write new version to disk. Failed to write new version to disc. Kunne ikke skrive ny versjon til disk. Mumble failed to retrieve version information from the central server. Mumble klarte ikke å hente versjonsinformasjon fra den sentrale tjeneren. ViewCert Certificate Chain Details Detaljer for sertifikatkjeden Certificate chain Sertifikatskjede Certificate details Sertifikatsdetaljer Common Name Vanlig navn Organization Organisasjon Subunit Underenhet Country Land Locality Lokalitet State Stat/fylke Valid from: %1 Gyldig fra: %1 Valid to: %1 Gyldig til: %1 Serial: %1 Serienummer: %1 Public Key: %1 bits %2 Offentlig nøkkel: %1 bit %2 RSA RSA DSA DSA Digest (SHA-1): %1 Digest (SHA-1): %1 Digest (SHA-256): %1 Digest (SHA-256): %1 Email: %1 E-post: %1 DNS: %1 DNS: %1 Issued by: Utstedt av: Unit Name Enhetsnavn VoiceRecorder Recorder failed to create directory '%1' Opptaker klarte ikke å lage mappe '%1' Recorder failed to open file '%1' Opptaker klarte ikke å åpne fil '%1' .wav - Uncompressed .wav - Ukomprimert .ogg (Vorbis) - Compressed .ogg (Vorbis) - Komprimert .au - Uncompressed .au - Ukomprimert .flac - Lossless compressed .flac - Tapsfritt komprimert VoiceRecorderDialog Recorder Opptaker Control Kontroll 00:00:00 00:00:00 &Start &Start S&top S&topp Mode Modus Multichannel Multikanal Output Utdata Output format Utdata-format Target directory Målmappe Filename Filnavn &Browse... &Utforsk… Valid variables are: Gyldige variabler: Inserts the user's name Skriver inn brukerens navn Inserts the current date Skriver inn nåværende dato Inserts the current time Skriver inn gjeldende tid Inserts the hostname Skriver inn vertsnavn Recorder still running Opptakeren kjører fremdeles Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? Lukking av opptakeren uten å stoppe den vil forkaste ulagret lyd. Ønsker du virkelig å lukke opptakeren? Unable to start recording. Not connected to a server. Klarte ikke å starte opptak. Ikke tilkoblet en tjener. The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. Tjeneren du har koblet til er på versjon 1.2.2 eller eldre. Av sikkerhetshensyn, er opptak på tjenere eldre enn 1.2.3 ikke mulig. Kontakt din tjeneradministrator for ytterligere informasjon. There is already a recorder active for this server. Det er allerede en aktiv opptaker i bruk for denne tjeneren. Please select a recording format. Velg et opptaksformat. Stopping Stopper Select target directory Velg målmappe Downmix Nedmikset WASAPISystem Default Device Forvalgt enhet qwPTTButtonWidget Mumble PTT Mumble trykk-for-å-snakke Push to talk Trykk for å snakke mumble-1.3.4/src/mumble/XboxInput.cpp0000664000175000017500000000475314010707274017367 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "XboxInput.h" const QUuid XboxInput::s_XboxInputGuid = QUuid(QString::fromLatin1("ca3937e3-640c-4d9e-9ef3-903f8b4fbcab")); XboxInput::XboxInput() : GetState(NULL) , m_getStateFunc(NULL) , m_getStateExFunc(NULL) , m_xinputlib(NULL) , m_valid(false) { // Load the most suitable XInput DLL available. // // We prefer 1_4 and 1_3 over the others because they provide // XInputGetStateEx(), which allows us to query the state of // the guide button. // // See https://msdn.microsoft.com/en-us/library/windows/desktop/hh405051(v=vs.85).aspx // for more information. QStringList alternatives; alternatives << QLatin1String("XInput1_4.dll"); alternatives << QLatin1String("xinput1_3.dll"); alternatives << QLatin1String("XInput9_1_0.dll"); alternatives << QLatin1String("xinput1_2.dll"); alternatives << QLatin1String("xinput1_1.dll"); foreach(const QString &lib, alternatives) { m_xinputlib = LoadLibraryW(reinterpret_cast(lib.utf16())); if (m_xinputlib != NULL) { qWarning("XboxInput: using XInput DLL '%s'", qPrintable(lib)); m_valid = true; break; } } if (!m_valid) { qWarning("XboxInput: no valid XInput DLL was found on the system."); return; } m_getStateFunc = reinterpret_cast(GetProcAddress(m_xinputlib, "XInputGetState")); // Undocumented XInputGetStateEx -- ordinal 100. It is available in XInput 1.3 and greater. // It provides access to the state of the guide button. // For reference, see SDL's XInput support: http://www.libsdl.org/tmp/SDL/src/core/windows/SDL_xinput.c m_getStateExFunc = reinterpret_cast(GetProcAddress(m_xinputlib, (char *)100)); if (m_getStateExFunc != NULL) { GetState = m_getStateExFunc; qWarning("XboxInput: using XInputGetStateEx() as querying function."); } else if (m_getStateFunc != NULL) { GetState = m_getStateFunc; qWarning("XboxInput: using XInputGetState() as querying function."); } else { m_valid = false; qWarning("XboxInput: no valid querying function found."); } } XboxInput::~XboxInput() { if (m_xinputlib) { FreeLibrary(m_xinputlib); } } bool XboxInput::isValid() const { return m_valid; } mumble-1.3.4/src/mumble/mumble_zh_HK.ts0000664000175000017500000121440614010707274017636 0ustar builderbuilder ACLEditor Deny 拒絕 Allow 允許 Allow %1 允許 %1 Deny %1 拒絕 %1 Mumble - Add channel Mumble - 新增頻道 Default server value 預設伺服器參數 Failed: Invalid channel 失敗: 無效的頻道 Mumble - Edit %1 Mumble - 編輯 %1 ID: %1 ID: %1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 這會繼承 %1 權限。 如果該權限設為兩者皆可,即視為拒絕。<br />%2 Channel must have a name 頻道必須擁有名稱 This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 這會撤消 %1 權限。 如果該權限設為兩者皆可,即視為拒絕。<br />%2 Dialog 會話 Name 名稱 Enter the channel name here. 在此輸入頻道名稱 Description 描述 Password 密碼 Enter the channel password here. 在此輸入頻道密碼 Check to create a temporary channel. 按此新增臨時頻道。 Temporary 臨時 <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. Position 位置 &Groups &群組 Group 群組 List of groups 群組列表 Remove selected group 移除所選的群組 Remove 移除 Inherit group members from parent 成員從上級繼承 Inherit 繼承 Make group inheritable to sub-channels 將群組繼承至子頻道 Inheritable 可繼承 Group was inherited from parent channel 群組從上級頻道繼承 Inherited 繼承 Members 成員 Add 加入 Add member to group 將成員加入至群組 Remove member from group 將成員從群組移除 &ACL &訪問控制列表 Active ACLs 啟用訪問控制列表 List of entries 項目列表 Inherit ACL of parent? 繼續上級的訪問控制列表? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. Inherit ACLs 繼續訪問控制列表 Move entry up 向上移動 This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. &Up &向上 Move entry down 向下移動 This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. &Down &向下 Add new entry 新增項目 This adds a new entry, initially set with no permissions and applying to all. &Add &新增 Remove entry 移除項目 This removes the currently selected entry. &Remove &移除 Context 背景 Entry should apply to this channel. Entry should apply to this channel This makes the entry apply to this channel. Applies to this channel Entry should apply to sub-channels. Add new group <b>Add</b><br/> Add a new group. Inherited members Contains the list of members added to the group by this channel. Contains a list of members whose group membership will not be inherited from the parent channel. Contains the list of members inherited by other channels. Type in the name of a user you wish to add to the group and click Add. Type in the name of a user you wish to remove from the group and click Add. Exclude Excluded members This makes the entry apply to sub-channels of this channel. Applies to sub-channels Permissions User/Group Group this entry applies to User ID User this entry applies to This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. &Properties <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. ID of the channel. Maximum Users Maximum number of users allowed in the channel <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. This is the sort order for the channel. ALSAAudioInput Default ALSA Card Opening chosen ALSA Input failed: %1 ALSAAudioOutput Default ALSA Card Opening chosen ALSA Output failed: %1 ASIOConfig %1 (version %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz ASIO Initialization failed: %1 Failed to instantiate ASIO driver ASIO Device selection Device Device to use for microphone This chooses what device to query. You still need to actually query the device and select which channels to use. Query selected device This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Query Configure selected device This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Configure &設定 Capabilities Driver name Buffer size This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. Configure input channels Channels Microphone <- -> Unused Speakers ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. Opening selected ASIO device failed. No input will be done. AboutDialog About Mumble <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble &License A&uthors &Third-Party Licenses OK AudioInput Interface System Input method for audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Input device for audio <b>This is the input device to use for audio.</b> Transmission &Transmit When to transmit your speech <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. DoublePush Time If you press the PTT key twice in this time it will get locked. <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. Reset audio cue to default <b>Reset</b><br/>Reset the paths for the files to their default. Browse for on audio file Browse for off audio file Off 關閉 On 開啟 Preview the audio cues Use SNR based speech detection Signal to Noise <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. Amplitude Voice &Hold How long to keep transmitting after silence Silence Below <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. Speech Above Signal values above this count as voice Compression &Quality Quality of compression (peak bandwidth) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. Audio per packet How many audio frames to send per packet <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). Audio Processing Noise Suppression Noise suppression <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. Maximum amplification of input sound <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. Current speech detection chance Cancel echo from speakers Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. Disabled <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal values below this count as silence Maximum bandwidth used for sending audio Use Amplitude based speech detection <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). Exclusive mode <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive R&eset &Browse... B&rowse... &Preview <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. Displays an always on top window with a push to talk button in it Display push to talk window Misc 其他 Audible audio cue when starting or stopping to transmit <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. Audio cue Gets played when starting to transmit Gets played when stopping to transmit Hold Time Time the microphone stays open after the PTT key is released Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) Max. Amplification Idle action minutes do nothing deafen mute after Echo Cancellation Mixed echo cancellation Multichannel echo cancellation The idle action will be reversed upon any key or mouse button input Undo Idle action upon activity Apply RNNoise's noise suppression filter. <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. RNNoise Audio input AudioInputDialog Continuous 連續 Voice Activity 語音活動 Push To Talk Audio Input %1 ms Off 關閉 %1 s %1 kb/s -%1 dB %1 kbit/s (Audio %2, Position %4, Overhead %3) AudioOutput Interface System Output method for audio <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Output device for audio <b>This is the output device to use for audio.</b> Positional Audio Audio Output Default &Jitter Buffer Safety margin for jitter buffer <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. Minimum distance to user before sound volume decreases This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. Volume Volume of incoming speech <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. Output Delay Amount of data to buffer The connected "speakers" are actually headphones The connected "speakers" are actually headphones. Factor for sound volume decrease Bloom Factor for sound volume increase How much should sound volume increase for sources that are really close? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Headphones Minimum Distance Maximum Distance Maximum distance, beyond which speech volume won't decrease Minimum Volume What should the volume be at the maximum distance? Loopback Test Delay Variance Variance in packet latency <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. Packet Loss Packet loss for loopback mode <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% &Loopback Desired loopback mode Attenuate applications by... Attenuation of other applications during speech <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. If checked Mumble lowers the volume of other applications while other users talk <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. while other users talk If checked Mumble lowers the volume of other applications while you talk <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. while you talk Exclusive mode, not recommended. <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive Priority Speaker 優先講者 If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. Attenuate other users while talking as Priority Speaker. Advanced Attenuation Options If checked, Mumble will only attenuate applications that are using the same output source as Mumble <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. Only attenuate applications using the same output device If checked, PulseAudio loopback modules will be attenuated <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. Attenuate PulseAudio loopback modules Audio output AudioOutputDialog None Local Server 伺服器 Audio Output %1 ms %1 % %1 m AudioOutputSample Choose sound file Invalid sound file The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. AudioStats >1000 ms >1000ms Audio Statistics Input Levels Peak microphone level Peak power in last frame This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. Peak speaker level This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. Peak clean level This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. Signal Analysis Microphone power How close the current input level is to ideal This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. Signal-To-Noise ratio Signal-To-Noise ratio from the microphone This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. Speech Probability Probability of speech This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). Configuration feedback Current audio bitrate Bitrate of last frame DoublePush interval Time between last two Push-To-Talk presses Speech Detection Current speech detection chance <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal and noise power spectrum Power spectrum of input signal and noise estimate This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. Echo Analysis Weights of the echo canceller This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. AudioWizard Audio Tuning Wizard Introduction Welcome to the Mumble Audio Wizard Finished Enjoy using Mumble Device selection Selecting the input and output device to use with Mumble. This is the device your microphone is connected to. System Input method for audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Input device to use <b>Selects which sound card to use for audio input.</b> Cancel echo from headset or speakers Use echo cancellation This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. This is the device your speakers or headphones are connected to. Output method for audio <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. Output device to use <b>Selects which sound card to use for audio Output.</b> Enable positional audio Allows positioning of sound Allows positioning of sound. <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> Input Device Output Device This allows Mumble to use positional audio to place voices. <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> Amount of data to buffer This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> Positional Audio Adjusting attenuation of positional audio. <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> Use headphones instead of speakers <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> Use headphones This ignores the OS speaker configuration and configures the positioning for headphones instead. Volume tuning Tuning microphone hardware volume to optimal settings. Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. Voice Activity Detection Letting Mumble figure out when you're talking and when you're silent. This will help Mumble figure out when you are talking. The first step is selecting which data value to use. Raw amplitude from input Signal-To-Noise ratio Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Device tuning Changing hardware output delays to their minimum value. Submit anonymous statistics to the Mumble project 遞交匿名統計數據給 Mumble 開發團隊 Push To Talk: Quality & Notifications Adjust quality and notification settings. Quality settings Low Balanced Notification settings Use Text-To-Speech to read notifications and messages to you. Disable Text-To-Speech and use sounds instead. %1 ms Enables attenuation of other applications while users talk to you Attenuate applications while other users talk High Custom You already set a customized quality configuration in Mumble. Select this setting to keep it. Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. Apply some high contrast optimizations for visually impaired users Use high contrast graphics Keep custom Text-To-Speech settings. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) BanEditor Mumble - Edit Bans &Address &Mask Reason Start End User Hash &Add &新增 &Update &Remove &移除 Ban List Search field This is the search field. Use it to find bans that have this username set in the username field. Who are you looking for? 您在找誰? No nickname IP address No IP address Reason for the ban No reason Ban end date Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). Certificate hash No certificate hash Banned users This is a list with banned users. Use this button if you want to add a new ban. Use this button if you want to update ban information. Use this button if you want to remove user from the ban list. Clear all fields This button clears all fields. Use it if you want to add a new ban. Clear 清除 Ban List - %n Ban(s) CertView Name 名稱 Email Issuer Expiry Date (none) Self-signed CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. There was an error generating your certificate.<br />Please try again. Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. The file could not be opened for writing. Please use another file. The file's permissions could not be set. No certificate and key has been written. Please use another file. The file could not be written successfully. Please use another file. The file could not be opened for reading. Please use another file. The file is empty or could not be read. Please use another file. The file did not contain a valid certificate and key. Please use another file. Select file to export certificate to Select file to import certificate from Unable to import. Missing password or incompatible file type. <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. Certificates Certificate Management Certificate Authentication Authenticating to servers without using passwords Current certificate This is the certificate Mumble currently uses. Current Certificate Create a new certificate This will create a new certificate. Import certificate from file This will import a certificate from file. Import a certificate Export Certificate This will export a certificate to file. Export current certificate Import Certificate PKCS #12 Certificate import <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> Import from Filename to import from This is the filename you wish to import a certificate from. Select file to import from This opens a file selection dialog to choose a file to import a certificate from. Open... Password 密碼 Password for PKCS#12 file This is the password for the PKCS#12 file containing your certificate. Certificate to import This is the certificate you are importing. Certificate Details Replace Certificate Replace existing certificate with new certificate? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> This is the certificate Mumble currently uses. It will be replaced. New certificate This is the new certificate that will replace the old one. New Certificate Make a backup of your certificate Export to Filename to export to This is the filename you wish to export a certificate to. Save As... This is the certificate Mumble currently uses. It will be exported. Generate a new certificate for strong authentication <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> Name 名稱 Email Your email address (e.g. johndoe@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. Your name (e.g. John Doe) This is your name, and will be filled out in the certificate. This field is entirely optional. Finish Certificate-based authentication is ready for use Enjoy using Mumble with strong authentication. Automatic certificate creation <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> ChanACL None Traverse Enter Speak Mute/Deafen Make channel Make temporary Link channel This represents no privileges. This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. This represents the permission to write text messages to other users in this channel. This represents the permission to forcibly remove users from the server. This represents the permission to permanently remove users from the server. This represents the permission to register and unregister users on the server. This represents the permission to register oneself on the server. Whisper 悄悄話 Move Text message Kick Ban Register User Register Self Write ACL ChatbarTextEdit Paste and &Send Paste and send <center>Type chat message here</center> ClientUser Friend Authenticated Priority speaker Recording 錄音 Muted (server) Deafened (server) Local Ignore (Text messages) Local Mute Muted (self) Deafened (self) ConfigDialog Accept changes This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. Reject changes This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. Apply changes This button will immediately apply all changes. Undo changes for current page This button will revert any changes done on the current page to the most recent applied settings. Restore defaults for current page This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. Mumble Configuration ConnectDialog Connecting to %1 正在連線到 %1 Enter username 輸入使用者名稱 Adding host %1 Servername Hostname 主機名稱 Bonjour name Port 連接埠 Addresses Website Packet loss Ping (80%) %1 ms Ping (95%) Bandwidth %1 kbit/s %1 kbit/s &Connect &連線 &Filters Unknown Users Version 版本 Failed to fetch server list Mumble Server Connect Ping Remove from Favorites Add custom server Show all servers that respond to ping Show all servers with users Show all servers &Copy Copy favorite link to clipboard &Paste Paste favorite from clipboard &Edit... &Add New... Add to &Favorites Open &Webpage Show &Reachable Show &Populated Show &All ConnectDialogEdit Edit Server Name of the server A&ddress Internet address of the server. Internet address of the server. <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. &Port Port on which the server is listening <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. &Username Username to send to the server <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. Label Add Server You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 Password 密碼 Password to send to the server <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. Show password <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. Local server label 127.0.0.1 64738 Your username Your password &Fill CoreAudioSystem Default Device 預設裝置 CrashReporter Mumble Crash Report <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> Email address (optional) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash Send Report Don't send report Crash upload successful Thank you for helping make Mumble better! Crash upload failed We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 Uploading crash report Abort upload DXAudioInput Default DirectSound Voice Input Opening chosen DirectSound Input device failed. No microphone capture will be done. Opening chosen DirectSound Input failed. Default device will be used. Lost DirectSound input device. DXAudioOutput Default DirectSound Voice Output Opening chosen DirectSound Output failed. Default device will be used. Lost DirectSound output device. Opening chosen DirectSound Output failed. No audio will be heard. Database Mumble failed to initialize a database in any of the possible locations. The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. DeveloperConsole Developer Console DockTitleBar Drag here GlobalShortcut Shortcuts List of configured shortcuts Function Data Shortcut Suppress Add new shortcut This will add a new global shortcut &Add &新增 Remove selected shortcut This will permanently remove a selected shortcut. &Remove &移除 <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> Open Accessibility Preferences Skip Enable Global Shortcuts <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. Additional Shortcut Engines <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. Enable Windows hooks <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. Enable GKey <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. Enable XInput <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. Enable shortcuts in privileged applications GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> Shortcuts Shortcut button combination. <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. Suppress keys from other applications <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. GlobalShortcutTarget Whisper Target Whisper to list of Users Channel Target Restrict to Group If specified, only members of this group will receive the whisper. List of users Add Remove 移除 Modifiers Do not send positional audio information when using this whisper shortcut. Ignore positional audio Shout to Linked channels Shout to subchannels Shout to Channel The whisper will also be transmitted to linked channels. The whisper will also be sent to the subchannels of the channel target. GlobalShortcutX Mouse %1 JackAudioSystem Hardware Ports Mono Stereo LCD Not connected LCDConfig Enable this device LCD Devices Name 名稱 <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> Size Enabled 啟用 Views Minimum Column Width <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> This setting decides the width of column splitter. Splitter Width Log Debug Critical Warning Information Server Connected Server Disconnected Other self-muted/deafened Permission Denied Text Message User Joined Server User Left Server User recording state changed User kicked (you or by you) User kicked You self-muted User muted (you) User muted (by you) User muted (other) User Joined Channel User Left Channel You self-unmuted You self-deafened You self-undeafened User renamed You Joined Channel You Joined Channel (moved) User connected and entered channel User left channel and disconnected Private text message the server [[ Invalid size ]] [[ Text object too large to display ]] [Date changed to %1] link to %1 FTP link to %1 player link channel link %1 link LogConfig Toggle console for %1 events Toggle pop-up notifications for %1 events Toggle Text-To-Speech for %1 events Click here to toggle sound notification for %1 events Toggle window highlight (if not active) for %1 events Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. Messages Message Console Notification Text-To-Speech Soundfile Path Text To Speech Volume Volume of Text-To-Speech Engine <b>This is the volume used for the speech synthesis.</b> Length threshold Message length threshold for Text-To-Speech Engine <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. Characters Whisper 悄悄話 If checked you will only hear whispers from users you added to your friend list. Only accept whispers from friends If enabled text messages you send will be read back to you with TTS Read back own messages Chat Log Maximum chat length Unlimited Lines Highlight LookConfig System default None Only with users All Ask Do Nothing Move <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory User Interface This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. List users above subchannels (requires restart). <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. Users above Channels <b>If set, will verify you want to quit if connected.</b> Show number of users in each channel Show channel user count Language Language to use (requires restart) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. Look and Feel Layout 浮動視窗 Classic Stacked Hybrid Custom This changes the behavior when moving channels. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. Expand When to automatically expand channels Channel Dragging Ask whether to close or minimize when quitting Mumble. Ask on quit while connected Always On Top <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> Hide in tray when minimized Hide the main Mumble window in the tray when it is minimized. This setting controls when the application will be always on top. Never Always In minimal view In normal view Displays talking status in system tray Show talking status in tray icon This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. Show context menu in menu bar Apply some high contrast optimizations for visually impaired users Optimize for high contrast Application Adds user and channel context menus into the menu bar Tray Icon Channel Tree Use selected item as the chat bar target Filter automatically hides empty channels Show transmit mode dropdown in toolbar Theme Theme to use to style the user interface <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. User Dragging This changes the behavior when moving users. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. Enable Developer menu When in custom layout mode, checking this disables rearranging. Lock layout MainWindow Root Push-to-Talk Global Shortcut 按鍵說話 Push and hold this button to send voice. Global Shortcut This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut Reset Audio Processor Global Shortcut Unlink Plugin Global Shortcut Push-to-Mute Global Shortcut Join Channel Global Shortcut Toggle Overlay Global Shortcut Toggle state of in-game overlay. Global Shortcut Toggle Minimal Global Shortcut 切換至最小化 Volume Up (+10%) Global Shortcut 提升音量(+10%) Volume Down (-10%) Global Shortcut 降低音量(-10%) Mumble Mumble Mumble -- %1 Mumble -- %1 &Window &視窗 Minimize 最小化 Ctrl+M Ctrl+M Close 關閉 Mumble is currently connected to a server. Do you want to Close or Minimize it? Mumble 正與伺服器連線中。您希望關閉還是最小化? Mute Self Global Shortcut 關閉麥克風 Set self-mute status. Global Shortcut 設定成關閉麥克風狀態。 This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut 這將設定或切換您的關閉麥克風狀態。如果您關閉此狀態,您將同時進入重開麥克風狀態。 Deafen Self Global Shortcut 全域靜音 Set self-deafen status. Global Shortcut 設定全域靜音狀態。 This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut 這將設定或切換您的全域靜音狀態。如果您開啟此狀態,您將同時進入關閉麥克風狀態。 Whisper/Shout Whisper 悄悄話/大喊 <center>Not connected</center> Not connected <center>未連線</center> Clear 清除 Opening URL %1 開啟網址 %1 File does not exist 檔案不存在 File is not a configuration file. 此檔案不是設定檔。 Settings merged from file. 合併設定檔。 URL scheme is not 'mumble' “Mumble” 不支援的網址 This version of Mumble can't handle URLs for Mumble version %1.%2.%3 目前的 Mumble 無法處理版本 %1.%2.%3 產生的網址 Connecting to %1 正在連線到 %1 Enter username 輸入使用者名稱 Connecting to server %1. 連線到伺服器 %1。 Reconnecting. 正在重新連線。 Transmit Mode set to Continuous 語音發送模式設為連續 <p>%1 (%2)<br />%3</p> <p>%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> <h2>語音頻道</h2><p>使用 128 bit OCB-AES128 加密<br />平均延遲 %1 毫秒 (誤差 %4)</p> Register yourself as %1 註冊成為 %1 <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <p>您正在為自己註冊一個獨特的帳戶。一但確認,將不能取消,並且您的名稱不能再更換。在此後,您將會以名稱 “%1” 進行伺服器活動。</p><p>您確定要進行註冊嗎?</p> <h2>Version</h2><p>Protocol %1</p> <h2>版本</h2><p>協議 %1</p> <p>No build information or OS version available</p> <p>沒有可用的建立資訊或認證系統版本</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) 此連線使用 %1 加密及認證,訊息使用 %2 及 使用金鑰交換機制 %3 The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) 此連線使用 %1 加密,訊息認證 %2 及 金鑰交換機制 %3 (%4) The connection is secured by the cipher suite that OpenSSL identifies as %1 此連線由加密套件保護,OpenSSL識別身份為 %1 <p>The connection provides perfect forward secrecy</p> <p>此連線提供完美遠期保密</p> <p>The connection does not provide perfect forward secrecy</p> <p>此連線不提供完美遠期保密</p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> <h2>控制頻道</h2><p>The connection uses %1</p>%2%3<p>平均延遲 %4 毫秒 (誤差 %5)</p><p>遠端主機 %6 (連接埠 %7)</p> Voice channel is sent over control channel 語音頻道透過控制頻道發送。 Register user %1 註冊使用者 %1 <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> <p>您在此伺服器的註冊名稱為 %1。這個動作無法取消,未來也無法變更使用者名稱, %1 即使您變更密碼依舊可以連接此伺服器。</p><p>從此刻開始, %1 將使用憑證進行認證。</p><p>您確定要註冊成 %1?</p> Kicking user %1 正在踢除使用者 %1 Banning user %1 正在封禁 %1 View comment on user %1 檢視使用者 %1 的註解 Message to channel %1 發送文字訊息到頻道 %1 Connected. 已連線。 <li>Expected certificate digest (SHA-1): %1</li> Server presented a certificate which failed verification. 伺服器認證失敗。 <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> SSL Version mismatch SSL版本不符 Server connection failed. <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>在此輸入給頻道 “%1” 的文字訊息</center> <center>Type message to user '%1' here</center> Type message to user '%1' here <center>在此輸入給使用者 “%1” 的文字訊息</center> Choose image file 讀取圖片失敗 Failed to load image 讀取圖片失敗 Could not open file for reading. 無法讀取檔案以供查看。 Image format not recognized. 無法辨識圖片格式。 &User &使用者 &Channel &頻道 Use in conjunction with Whisper to. Global Shortcut 結合悄悄話一起。 This will switch the states of the in-game overlay. Global Shortcut 這將切換遊戲中浮動視窗的狀態。 Link Channel Global Shortcut 關聯頻道 Cycle Transmit Mode Global Shortcut 循環發送模式 Set Transmit Mode to Push-To-Talk Global Shortcut Set Transmit Mode to Continuous Global Shortcut Set Transmit Mode to VAD Global Shortcut Send Text Message Global Shortcut 送出文字訊息 Send Clipboard Text Message Global Shortcut This will send your Clipboard content to the channel you are currently in. Global Shortcut Continuous 連續 Voice Activity 語音活動 Push-to-Talk 按鍵說話 Mumble - Minimal View -- %1 Cancel 取消 Save Image As... Save Image File Could not save image: %1 Change your comment 變更您的註解 Transmit Mode set to Voice Activity 語音發送模式設為語音活動時 Transmit Mode set to Push-to-Talk 語音發送模式設為按鍵說話 <p>Connected users: %1/%2</p> UDP Statistics UDP 統計 To Server 到伺服器 From Server 來自伺服器 Good 良好 Late 延遲 Lost 遺失 Resync 重新同步 <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> <h2>語音頻寬</h2><p>最大 %1 kbit/s<br />目前 %2 kbit/s<br />編碼: %3</p> Mumble Server Information Mumble 伺服器資訊 &View Certificate &檢視憑證 Enter reason 輸入原因 Sending message to %1 發送訊息給 %1 To %1: %2 發送給 %1: %2 Message to %1 發送訊息給 %1 Are you sure you want to reset the comment of user %1? 您確定要重設使用者 %1 的註解? Are you sure you want to reset the avatar of user %1? 您確定要重設使用者 %1 的頭像? Are you sure you want to delete %1 and all its sub-channels? 您確定要刪除 %1 和它的子頻道嗎? Sending message to channel %1 發送訊息給頻道 %1 Message to tree %1 發送消息給樹 %1 To %1 (Tree): %2 (Tree) %1: %2 給 %1 (樹): %2 Unmuted and undeafened. 重開麥克風及解除靜音。 Unmuted. 重開麥克風。 Muted. 已關閉麥克風。 Muted and deafened. 關閉麥克風及全域靜音。 Deafened. 全域靜音。 Undeafened. 解除全域靜音。 Restart Mumble? 重新啟動 Mumble? Some settings will only apply after a restart of Mumble. Restart Mumble now? 部份設定只在 Mumble 重新啟動後生效。現在就重新啟動 Mumble? About Qt 關於 Qt SSL Verification failed: %1 SSL 認證失敗: %1 <li>Server certificate digest (SHA-1): %1</li> <b>WARNING:</b> The server presented a certificate that was different from the stored one. <b>警告:</b> 伺服器提供的憑證與保存的憑證不同。 This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. 這個伺服器使用舊式加密標準,新版的 Mumble 已不再支援。 Server connection failed: %1. 伺服器連線失敗: %1。 Disconnected from server. 與伺服器斷開連接。 Invalid username 無效的使用者名稱 You connected with an invalid username, please try another one. 您使用了一個無效的使用者名稱連線,請嘗試另外一個名稱。 Username in use 使用者名稱重複 That username is already in use, please try another username. 使用者名稱已經存在,請使用其他名稱。 Wrong certificate or password 錯誤的憑證或密碼 Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. 錯誤的憑證或密碼。如果您是 使用密碼的使用者,請重試。 如不是,請檢查您的憑證及使用者名稱。 Wrong password 密碼錯誤 Wrong server password for unregistered user account, please try again. 伺服器密碼錯誤,請重試。 Images (*.png *.jpg *.jpeg) 圖片 (*.png *.jpg *.jpeg) C&onfigure &設定 &Help &說明 Log 日誌 This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. 顯示最近所有活動。正在連接的伺服器、錯誤和通知消息都將在此顯示。<br />設定哪些訊息在此顯示,請從選單中使用<b>設定</b> 。 &Quit Mumble 離開 Mumble Closes the program 關閉程式 Exits the application. 退出應用程式。 Ctrl+Q Ctrl+Q Open the server connection dialog 打開伺服器連線對話框 &Disconnect &斷開連線 Disconnect from server 伺服器斷開連線 Disconnects you from the server. 斷開伺服器連線。 Show information about the server connection 顯示伺服器連線訊息 This will show extended information about the connection to the server. 顯示伺服器連線的額外訊息。 &Mute &靜音 &Deafen &關閉聲音 &Local Mute &關閉本地麥克風 Send a Text Message 發送文字訊息 Sends a text message to another user. 向其他使用者發送文字訊息。 Add new channel 新增頻道 This adds a new sub-channel to the currently selected channel. 在目前頻道內新增一個子頻道。 Remove channel 刪除頻道 This removes a channel and all sub-channels. 刪除頻道及所有子頻道。 Edit Groups and ACL for channel 編輯頻道群組與訪問控制列表 This opens the Group and ACL dialog for the channel, to control permissions. 開啟頻道群組和訪問控制列表,以編輯訪問權限。 &Link &關聯 Link your channel to another channel 關聯您的頻道至另一個頻道 This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. 這是對話框<br />如果您在此輸入文字及按下輸入鍵將會傳送至您所選的使用者或頻道。如果沒有。則是傳送至您目前所在的頻道。 Chatbar 聊天室 Shows a dialog of registered servers, and also allows quick-connect. 顯示已註冊伺服器的對話框,並允許快速連接。 Kick user (with reason) 踢出使用者 (附帶理由) Kick selected user off server. You'll be asked to specify a reason. 從伺服器踢出使用者。您需要提供理由。 Mute user 關閉使用者語音 Mute or unmute user on server. Unmuting a deafened user will also undeafen them. 禁止或重新開啟使用者語音。重新開啟一個已靜音的使用者語音會一併關閉靜音。 Kick and ban user (with reason) 踢出與封鎖使用者 (附帶理由) Kick and ban selected user from server. You'll be asked to specify a reason. 從伺服器上踢出與封鎖使用者。您需要提供理由。 Deafen user 開啟使用者靜音狀態 Deafen or undeafen user on server. Deafening a user will also mute them. 關閉或開啟使用者靜音。開啟靜音的同時會一併禁止語音。 Mute user locally 關閉局部使用者的語音 Mute or unmute user locally. Use this on other users in the same room. 禁止或開啟局部使用者語音。將此設定套用於同一個房間的使用者。 This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. 這可以關聯您的頻道和您選取的頻道。如果他們擁有發言權限在其他頻道,使用者能聽到其他人對話。這是永久關聯,必須要手動取消或重開伺服器才能取消關聯。請看關聯快捷键。 &Unlink Channel &取消關聯 Unlink your channel from another channel 取消您的頻道和另一個頻道之間的關聯 This unlinks your current channel from the selected channel. 取消您的當前頻道和所選頻道之間的關聯。 Unlinks your channel from all linked channels. 取消您目前頻道和其他頻道的所有關聯。 This unlinks your current channel (not the selected one) from all linked channels. 取消您目前頻道(非所選頻道)和其他頻道的所有關聯。 &Reset &重設 Reset audio preprocessor 重置音訊預處理器 This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. 該選項將重置音訊預處理器,包含噪音消除,自動獲取和語音活動檢測。如果音訊環境突然變得惡劣(比如掉麥)並且是暫時的,使用該選項來避免等待預處理器自我調整。 &Mute Self &自我關閉語音 Mute yourself &自我關閉語音 Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. 自我關閉語音或重新開啟語音。當關閉語音時,您將無法發送語音到伺服器。當解除靜音時將同時重新開啟語音。 &Deafen Self &自我開啟靜音 Deafen yourself 自我開啟靜音 Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. 使自己開啟靜音或取消靜音。當開啟靜音時,您將聽不到聲音。自我開啟靜音時亦關閉語音。 &Text-To-Speech &文字轉語音 Toggle Text-To-Speech 切換文字轉語音 Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. 使用或停用文字轉語音引擎。只有在設定對話框裡啟用了文字轉語音時,文字訊息才會讀出來。 Display audio statistics 顯示音訊統計 Pops up a small dialog with information about your current audio input. 彈出一個關於您當前音訊輸入信息的對話框。 Forcibly unlink plugin 強制取消關聯外掛 This forces the current plugin to unlink, which is handy if it is reading completely wrong data. 強制取消關聯目前外掛,當外掛讀取的數據完全錯誤時相當有用。 Configure Mumble 設定 Mumble Allows you to change most settings for Mumble. 允許您改變 Mumble 的更多設定。 Start the audio configuration wizard 啟動音訊精靈 This will guide you through the process of configuring your audio hardware. 這將引導您設定您的音訊硬體。 &What's This? &這是什麼? Enter What's This? mode 進入 這是什麼? 模式 Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. 點擊進入"這是什麼?"模式。您的滑鼠將變成一個問號。點擊任意按鈕,選單或區域來顯示它的描述。 Information about Mumble Mumble 的相關訊息 Shows a small dialog with information and license for Mumble. 顯示一個 Mumble 相關訊息和許可證的對話框。 Information about Speex Speex 的相關訊息 Shows a small dialog with information about Speex. 顯示一個 Speex 相關信息的小對話框。 Information about Qt Qt 相關訊息 Shows a small dialog with information about Qt. 顯示一個 Qt 相關訊息的小對話框。 Check for &Updates 檢查更新 Check for new version of Mumble 檢查新版 Mumble Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. 連接到 Mumble 首頁檢查是否有新版可用,如果有新版本將通知您下載。 Sends a text message to all users in a channel. 向頻道內所有使用者發送文字訊息。 Configure certificates for strong authentication 設定高強度驗證憑證 This starts the wizard for creating, importing and exporting certificates for authentication against servers. 開啟引導精靈,新增、匯入與匯出伺服器身份驗證憑證。 Register user on server 伺服器的註冊使用者 This will permanently register the user on the server. 使用者將永久註冊在伺服器。 Add &Friend 新增好友 Adds a user as your friend. 增加一個使用者成為好友。 This will add the user as a friend, so you can recognize him on this and other servers. 增加一個使用者成為好友,不管在此伺服器或其他伺服器您都可以辨認他。 &Remove Friend &移除好友 Removes a user from your friends. 自好友中刪除一個使用者。 This will remove a user from your friends list. 您將從好友列表中刪除一個使用者。 &Update Friend &更新朋友 Update name of your friend. 更新您的好友名稱。 Your friend uses a different name than what is in your database. This will update the name. 好友的名稱與資料庫紀錄不同。即將更新。 Edit registered users list 編輯已註冊使用者列表 This opens the editor for registered users, which allow you to change their name or unregister them. 開啟註冊用戶編輯器,允許您變更他們的名稱或取消註冊。 Add or remove text-based access tokens 增加或移除文字授權碼 &Minimal View &簡潔視窗 Toggle minimal window modes 啟用簡潔視窗模式 This will toggle minimal mode, where the log window and menu is hidden. 啟用簡潔視窗模式,該模式將隱藏日誌欄與選單。 You muted and deafened %1. 您禁止 %1 的語音及開啟靜音。 You unmuted and undeafened %1. 您重新開啟 %1 的語音及解除靜音。 You undeafened %1. 您解除了 %1 的靜音狀態。 You suppressed %1. 您抑制了 %1。 %1 muted and deafened by %2. %2 禁止 %1 的語音及開啟靜音。 %1 unmuted and undeafened by %2. %2 重新開啟 %1 的語音及解除靜音。 %1 undeafened by %2. %1 被 %2 解除靜音狀態。 %1 suppressed by %2. %2 抑制了 %1 的語音。 %1 moved to %2. %1 移動至 %2。 %1 moved to %2 by %3. %3 將 %1 移動至 %2 。 %1 moved in from %2 by %3. %3 將 %1 從 %2 移動到此。 %1 is now muted and deafened. %1 進入完全靜音狀態。 Your account information can not be verified currently. Please try again later 您的帳戶訊息目前無法確認。 請稍候再試 Welcome message: %1 歡迎訊息: %1 Mumble: %1 Mumble:%1 You were denied %1 privileges in %2. 您在 %2 的 %1 權限被拒絕。< %3 was denied %1 privileges in %2. %3 在 %2 的 %1 權限被拒絕。 Denied: Cannot modify SuperUser. 拒絕:無法變更SuperUser。 Denied: Invalid channel name. 拒絕:無效的頻道名稱。 Denied: Text message too long. 拒絕:訊息太長。 Denied: Operation not permitted in temporary channel. 拒絕:此操作無法使用於臨時頻道。 You need a certificate to perform this operation. 您需要憑證才可進行此操作。 %1 does not have a certificate. %1 沒有憑證。 Invalid username: %1. 無效的使用者名: %1 。 Invalid username. 無效的使用者名稱。 Channel is full. 頻道已滿。 Channel nesting limit reached. 頻道嵌套已達上限。 Channel count limit reached. Need to delete channels before creating new ones. Permission denied. 沒有權限。 %1 connected and entered channel. %1 connected. %1 已連線。 %1 is now muted. %1 禁止語音。 %1 is now unmuted. %1 重新開啟語音。 Recording started 已開始錄音 Recording stopped 已停止錄音 %1 started recording. %1 已開始錄音。 %1 stopped recording. %1 已停止錄音。 You revoked your priority speaker status. 您移除了自己的優先發言權。 You assumed priority speaker status. 您獲得優先發言權。 %1 revoked your priority speaker status. %1 移除了您的優先發言權。 %1 gave you priority speaker status. %1 讓您有優先發言權。 You revoked priority speaker status for %1. 您移除了 %1 的優先發言權。 You gave priority speaker status to %1. 您轉讓優先發言權給 %1 。 %1 revoked own priority speaker status. %1 移除了自己的優先發言權。 %1 assumed priority speaker status. %1 獲得優先發言權。 %1 revoked priority speaker status for %2. %1 移除了 %2 的優先發言權 。 %1 gave priority speaker status to %2. %1 轉讓優先發言權給 %2 。 You were unmuted and undeafened by %1. %1 解除了您的完全靜音狀態。 You were muted by %1. 您被 %1 禁止語音。 You were undeafened by %1. 您被 %1 解除靜音效果。 You were suppressed. You were suppressed by %1. 您被抑制語音了。 You were unsuppressed. 您已解除抑制語音。 You were unsuppressed by %1. 您被 %1 抑制語音了。 You joined %1. You moved %1 to %2. 您從 %1 移動到 %2。 %1 is recording %1 正在錄音 %1 renamed to %2 by %3. %1 disconnected. %1 離線。 Server message from 伺服器 (Tree) (樹) (Channel) (頻道) (Private) %2%1: %3 %2%1: %3 Failed to load Opus, it will not be available for audio encoding/decoding. The server requests minimum client version %1 伺服器要求使用 %1 以上版本客戶端 The server requests positional audio be enabled. 伺服器要求開啟定位音訊。 The server requests positional audio be disabled. 伺服器要求關閉定位音訊。 The server requests Push-to-Talk be enabled. 伺服器要求開啟按鍵說話。 The server requests Push-to-Talk be disabled. 伺服器要求關閉按鍵說話。 You were unmuted by %1. %1 重新開啟您的語音。 You muted %1. 您禁止了 %1 的語音。 You unsuppressed %1. 您解除抑制了 %1 的語音。 You unmuted %1. 您重新開啟了 %1 的語音。 %1 muted by %2. %1 被 %2 禁止語音。 %1 unsuppressed by %2. %2 解除抑制 %1 的語音 。 %1 unmuted by %2. %1 被 %2 重新開啟語音。 Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. 找不到符合CELT編碼的使用者。您不能對所有人說話。 You were muted and deafened by %1. You were deafened by %1. 您被 %1 關閉語音與聲音。 You were kicked from the server by %1: %2. 您被 %1 從伺服器踢出: %2。 %3 was kicked from the server by %1: %2. %3 被 %1 從伺服器踢出: %2。 You were kicked and banned from the server by %1: %2. 您被 %1 從伺服器踢出並封鎖: %2。 %3 was kicked and banned from the server by %1: %2. %3 被 %1 從伺服器踢出並封鎖: %2。 You were moved to %1 by %2. 您被 %2 移動到 %1。 %1 entered channel. %1 進入頻道。 Server connection rejected: %1. 伺服器拒絕連接: %1。 Denied: %1. 拒絕: %1。 %1 renamed to %2. %1 更改名稱為 %2。 %1 left channel and disconnected. %1 離開頻道並離線。 Message from %1 來自 %1 的消息 You have User Dragging set to "Do Nothing" so the user wasn't moved. You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. 您設置頻道拖動為"無動作"可以禁止頻道移動。 Unknown Channel Drag mode in UserModel::dropMimeData. UserModel::dropMimeData 中未知的頻道拖曳模式。 Remote controlling Mumble: 遠端控制 Mumble Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) -jn, --jackname Set custom Jack client name. --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status Invocation 調用 Error: No RPC command specified 錯誤: 沒有指定的RPC指令 RPC 遠端程序呼叫 Welcome to Mumble. 歡迎使用 Mumble。 Skipping version check in debug mode. 在除錯模式中略過版本檢查。 Hide Frame 隱藏邊框 Toggle showing frame on minimal window 在簡潔視窗模式下切換邊框顯示 This will toggle whether the minimal window should have a frame for moving and resizing. 該選項切換簡潔視窗是否有一個用來移動和改變大小的邊框。 &Unlink All 取消所有關聯 Reset the comment of the selected user. 重設使用者留言。 &Join Channel 加入頻道 View comment in editor 在編輯器中檢視使用者註解 Query server for connection information for user 查詢伺服器的使用者資訊 S&erver 伺服器 &Self 本機 &Unlink Plugins 停用外掛 Register yourself on the server 在此伺服器註冊 Change your avatar image on this server 更改您在此伺服器的頭像。 &Remove Avatar &移除頭像 Remove currently defined avatar image. 移除目前定義的頭像圖片。 Icon Toolbar 工具欄圖示 Change your own comment 變更您自己的註解 Recording 錄音 Priority Speaker 優先發言 &Copy URL &複製網址 Copies a link to this channel to the clipboard. 複製頻道網址到剪貼簿。 Ignore Messages 忽略訊息 Locally ignore user's text chat messages. 本地忽略使用者的文字聊天訊息。 Silently drops all text messages from the user. 自動刪除來自使用者的文字訊息。 Edit ban list on server 編輯伺服器上的封鎖名單 This lets you edit the server-side IP ban list. 讓您編輯伺服器端的封鎖 IP 列表。 &Filter on/off &開啟/關閉過濾器 Toggle the channel filter (Ctrl+F) 切換頻道過濾器 (Ctrl+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. 啟用或停用頻道過濾器。 預設為過濾所有頻道。 您可以在頻道列表中過濾其他的頻道。 Ctrl+F Ctrl+F &Hide Channel when Filtering &隱藏被過濾的頻道 Reset the avatar of the selected user. 重設指定使用者的頭像。 Locally adjust the user's speech volume. Opens a dialog with a volume slider. Use this on other users in the same room. &Developer &Hide Mumble Hides the main Mumble window. Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. Show the Developer Console Shows the Mumble Developer Console, where Mumble's log output can be inspected. &Connect... &Ban list... &Information... &Kick... &Ban... Local Volume Adjustment... Send &Message... &Add... &Remove... &Edit... Audio S&tatistics... &Settings... &Audio Wizard... Developer &Console... &About... About &Speex... About &Qt... &Certificate Wizard... &Register... Registered &Users... Change &Avatar... &Access Tokens... Reset &Comment... Reset &Avatar... View Comment... &Change Comment... R&egister... Show Shows the main Mumble window. Manual Manual Mumble Positional Audio Position X Y Z m Heading Azimuth Elevation ° Meta data Context Identity Set State Linked Activated Unhinge NetworkConfig Network 網路 Updates are mandatory when using snapshot releases. 使用快照版時將強制更新。 Connection 連接 Use TCP compatibility mode Use TCP compatability mode 使用 TCP 相容模式 <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). Reconnect when disconnected <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. <b>連接斷開後重新連接</b>。<br />Mumble 會在與伺服器的連接斷開 10秒後自動重新連接。 Reconnect automatically 自動重新連接 Proxy 代理伺服器 Type 類型 Type of proxy to connect through 代理伺服器類型 Direct connection 直接連線 HTTP(S) proxy HTTP(S) 代理 SOCKS5 proxy SOCKS5 代理 Hostname 主機名稱 Hostname of the proxy 代理伺服器主機名稱 Force TCP mode 強制TCP模式 Enable QoS to prioritize packets 使用 QoS 優先發送封包 This will enable QoS, which will attempt to prioritize voice packets over other traffic. 啟用服務品質(QoS)後,語音封包將優先於其他流量處理。 Use Quality of Service 使用服務品質 (QoS) Don't send certificate to server and don't save passwords. (Not saved). 不要將憑證傳給伺服器也不要儲存密碼。(不儲存)。 <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> <b>這將阻止辨識客戶端的身份資訊。</b><p>客戶端將無法使用憑證證明自己的身份,就算證明了,也無法儲存連線密碼。此為測試用選項且不儲存。</p> Suppress certificate and password storage 不儲存憑證與密碼 <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>通過代理伺服器的通訊協定類型。</b><br />讓 Mumble 所有通訊都透過代理伺服器。注意:使用代理穿隧將使 Mumble 進入 TCP 相容模式,所有語音資料將使用控制頻道發送。 <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. <b>代理伺服器的主機名稱</b><br />用來指定存取網路的代理伺服器。 Port 連接埠 Port number of the proxy 代理伺服器連接埠 <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. <b>代理伺服器連接埠。</b><br />用來指定代理伺服器的連接埠。 Username 使用者名稱 Username for proxy authentication 用於代理認証的使用者名稱 <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>用於代理認証的使用者名稱。</b><br />用來指定代理認証的使用者名稱。如果代理不需要認証,或者您想要使用匿名連接,請將此位置留空。 Password 密碼 Password for proxy authentication 用於代理認証的密碼 <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>用於代理認証的密碼。</b><br />用來指定代理認証的密碼。如果代理不需要認証,或者您想要使用匿名連接,請將此位置留空。 Mumble services Mumble 服務 Check for new releases of Mumble automatically. 讓 Mumble 自動檢查新版本。 This will check for new releases of Mumble every time you start the program, and notify you if one is available. 每次啟動 Mumble 時,將會自動檢查有無新版本發行,如果有新版本,將提醒通知。 Check for application updates on startup 啟動時檢查更新 Check for new releases of plugins automatically. 自動檢查外掛更新。 This will check for new releases of plugins every time you start the program, and download them automatically. 當啟動程式的時候,Mumble 會自動檢查並更新外掛模組。 <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. <b>遞交匿名統計。</b><br />有一個重視未來發展的開發團隊,透過您的資訊能讓開發團隊更精確的抓住未來的發展方向。 Submit anonymous statistics to the Mumble project 遞交匿名統計數據給 Mumble 開發團隊 Submit anonymous statistics 發送匿名統計 Reconnect to last used server when starting Mumble 當啟動Mumble時連接最後使用的伺服器 Reconnect to last server on startup 啟動時自動連接到最後使用的伺服器 Download plugin and overlay updates on startup 啟動時下載外掛與浮動視窗的更新 Privacy Prevent OS information being sent to Mumble servers and web servers <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. Do not send OS information to Mumble servers and web servers Overlay Silent 靜音 Talking 說話中 Whisper 悄悄話 Shout 大喊 Channel 頻道 Failed to create communication with overlay at %2: %1. No overlay will be available. 無法在 %2 新增關聯:%1。沒有可用的浮動視窗。 OverlayClient Filter 過濾 Only talking 僅說話 Talking and recently active 說話及最近活動 All in current channel 所有目前的頻道 All in linked channels 所有有關聯的頻道 Always show yourself 總是顯示您自己 Configure recently active time (%1 seconds)... 設定最近活動時間 (%1 秒)… Columns Sort 排序 Alphabetically 按英文字母排序 Last state change 最後停留的頻道 Edit... 編輯… Reset Zoom 重設大小 Configure recently active time 重設最近活動時間 Amount of seconds users remain active after talking: 多少秒鐘內持續判定語音活動: OverlayConfig To move the users, drag the little red dot. 拖動小紅點以移動使用者列表。 To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. 在使用者列表上使用滑鼠滾輪縮放使用者列表。 For more options, right click a user. For more options, rightclick a user. 右鍵點擊使用者開啟更多選項。 Launcher Filter Overlay 浮動視窗 Choose executable 選擇執行檔 Choose application 選擇應用程式 Choose path Load Overlay Presets 載入浮動視窗樣板 Mumble overlay presets (*.mumblelay) Mumble 浮動視窗樣式 (*.mumblelay) Save Overlay Presets 儲存浮動視窗樣式 Options 選項 Enable overlay. 啟用浮動視窗 Enable Overlay 啟用浮動視窗 This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. 這裡設定開啟或關閉浮動視窗。這個設定只在啟動程式時檢查,因此要確定您啟動應用程式前 Mumble 及本選項是開啟的。<br />請注意如果您已經開啟 Mumble 與應用程式或者在應用程式執行期間關閉了浮動視窗,除了重新啟動應用程式之外,沒有辦法重新啟動浮動視窗。 Layout 浮動視窗 Blacklist 黑名單 Whitelist 白名單 Uninstall Overlay 移除浮動視窗 Overlay Installation 安裝浮動視窗 Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. Mumble 檢測到您尚未安裝 Mumble 浮動視窗。 點選下方按鍵安裝浮動視窗。 Install Mumble Overlay 安裝 Mumble 浮動視窗 Overlay Upgrade 浮動視窗升級 Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. Mumble 檢測到您安裝了舊版的浮動視窗檔。 點選下方按鈕,升級浮動視窗到最新版本。 Upgrade Mumble Overlay 升級 Mumble 浮動視窗 Display a frame counter in the overlay 在浮動視窗中顯示 FPS Show FPS counter 顯示 FPS Load an overlay preset from file 從檔案讀取浮動視窗設定 Load… 讀取… Save your overlay settings to file 儲存浮動視窗設定至檔案 Save… 儲存… Set the overlay font. 設定浮動視窗字型。 Set the overlay text color. 設定浮動視窗文字顏色。 Color 顏色 Remove 移除 Font 字型 FPS and Clock Display 顯示 FPS 與時間 Display a clock in the overlay showing the current local time (system time). 在浮動視窗中顯示現在時間 (系統時間)。 Show Clock 顯示時間 Overlay Exceptions Overlay Exception Mode Allowed launchers Add Allowed programs Allowed paths Blacklisted programs OverlayEditor State 狀態 User is not talking 使用者沒有說話 Passive 被動 User is talking in your channel or a linked channel 使用者正在您的頻道或與此頻道有關聯的頻道說話。 Talking 說話中 User is whispering to you privately 使用者正與您私下悄悄話中。 Private Whisper 私人悄悄話 User is shouting to your channel 使用者正在您的頻道中大喊 Channel Whisper 頻道悄悄話 Zoom 縮放 Zoom Factor 縮放因素 Enabled Elements 啟用元素 User avatar, chosen by each user 使用者頭像,由使用者自訂。 Avatar 頭像 User's name 使用者名稱 Username 使用者名稱 Name of user's channel, if outside your current channel 使用者的頻道名稱,如果不在您目前所在頻道 Channel 頻道 Muted or deafened 關閉麥克風或喇叭 Mute state 靜音狀態 Bounding box, automatically shrunk to minimum size to contain all visible elements 邊框,自動將所有可見元素以最小顯示。 Bounding box 邊框 Overlay Editor 無縫嵌入編輯器 OverlayEditorScene Layout preset 預設設計 Large square avatar 大型頭像 Avatar and Name 頭像與名稱 User Opacity 用戶列表透明度 %1% %1% Object Opacity 物件透明度 Alignment 對齊方式 Left 靠左對齊 Center 置中對齊 Right 靠右對齊 Top 靠上對齊 Bottom 靠下對齊 Color... 顏色... Font... 字型... Bounding box 邊框 Pen width 線條寬度 Padding 間距 Pen color 線條顏色 Fill color 填充顏色 Pick pen color 選擇線條顏色 Pick fill color 選擇填充顏色 Pick color 選擇顏色 Pick font 選擇字型 PluginConfig Plugins 插件 Plugin has no configure function. 插件沒有設定選項。 Plugin has no about function. 插件沒有額外資訊。 Options 選項 Enable plugins and transmit positional information 啟用插件並傳送位置訊息 This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. 啟用遊戲插件支援以使用定位音訊,讓其他使用者可以聽到您在遊戲中的大約位置。 Link to Game and Transmit Position 關聯到遊戲並傳送位置 Reloads all plugins 重新載入所有插件 This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. 重新掃描和重新載入外掛。當您新增或更改一個外掛時可使用此選項。 &Reload plugins &重新載入插件 Information about plugin 插件資訊 This shows a small information message about the plugin. 顯示插件相關訊息。 &About &關於 Show configuration page of plugin 顯示外掛設定 This shows the configuration page of the plugin, if any. 顯示插件配置頁面。 &Configure &設定 Name 名稱 Enabled 啟用 Plugins Skipping plugin update in debug mode. 在除錯模式中忽略外掛更新訊息。 Downloaded new or updated plugin to %1. 下載或更新 %1 外掛。 Failed to install new plugin to %1. 安裝 %1 外掛失敗。 %1 lost link. %1 失去關聯。 %1 linked. %1 已關聯。 PortAudioSystem Default Device 預設裝置 PulseAudioSystem Default Input 預設輸入 Default Output 預設輸出 QApplication Failed to restart mumble 重新啟動 mumble 失敗 Mumble failed to restart itself. Please restart it manually. Mumble 自我重新啟動失敗。請手動重新啟動。 RichTextEditor Failed to load image 讀取圖片失敗 Image file too large to embed in document. Please use images smaller than %1 kB. 嵌入文件的圖片過大,請使用小於 %1 kB 的圖片。 Message is too long. 訊息太長。 Display 顯示 Source Text 原始文字 &Bold &粗體 Ctrl+B Ctrl+B &Italic &斜體 Italic 斜體 Ctrl+I Ctrl+I Underline 底線 Ctrl+U CTRL+U Color 顏色 Insert Link 插入連結 Ctrl+L CTRL+L Insert Image 插入圖片 RichTextEditorLink Add Link 新增連結 URL 網址 Text 文字 ServerHandler Unable to resolve hostname Server is not responding to TCP pings UDP packets cannot be sent to or received from the server. Switching to TCP mode. UDP封包無法送發到伺服器或無法從伺服器接收。切換為 TCP 模式。 UDP packets cannot be sent to the server. Switching to TCP mode. UDP封包無法發送到伺服器。切換為 TCP 模式。 UDP packets cannot be received from the server. Switching to TCP mode. UDP封包無法從伺服器接收。切換為 TCP 模式。 UDP packets can be sent to and received from the server. Switching back to UDP mode. UDP封包可以傳送到伺服器並且可以從伺服器接收。切換到 UDP 模式。 Connection timed out 連線逾時 ServerView Favorite 我的最愛 LAN 區域網路 Public Internet 公開網路 Unknown Africa 非洲 Asia 亞洲 North America 北美洲 South America 南美洲 Europe 歐洲 Oceania 大洋洲 ShortcutActionWidget Unassigned 未分配 ShortcutDelegate On 開啟 Off 關閉 Toggle 切換 Unassigned 未分配 ShortcutKeyWidget Press Shortcut 輸入快捷鍵 ShortcutTargetDialog Root Parent 上層 Current 目前 Subchannel #%1 子頻道 #%1 ShortcutTargetWidget ... , Root Parent 上層 Current 目前 Subchannel #%1 子頻道 #%1 Invalid 無效 Empty <Empty> ShortcutToggleWidget Off 關閉 Toggle 切換 On 開啟 TextMessage Enter text 輸入文字 If checked the message is recursively sent to all subchannels 選擇後訊息會發送到子頻道。 Send recursively to subchannels 發送到子頻道。 Tokens Empty Token 沒有授權碼 Mumble - Access Tokens Mumble - 授權碼 List of access tokens on current server 列出目前伺服器所有授權碼 <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. <b>這是可編輯的伺服器授權碼列表。</b> <br /> 授權碼是頻道使用的簡單訪問管理系統並以文字方式儲存。Mumble 會記錄您曾經用過的授權碼及在您下次連線時使用,所以您不必使用授權碼登入。 Add a token 新增授權碼 &Add &新增 Remove a token 移除一個授權碼 &Remove &移除 UserEdit Registered Users 註冊使用者 Remove 移除 Rename 更名 Who are you looking for? 您在找誰? Days Weeks Months Years Inactive for 停止活動 Registered users: %n account(s) 已註冊使用者:%n 個 UserInformation User Information 用戶資訊 Connection Information 連線資訊 Version 版本 OS 操作系統 Certificate 憑證 IP Address IP位址 CELT Versions CELT版本 Details... 詳細資料... Ping Statistics Ping 統計 Pings received 接收 Ping Average ping 平均 ping TCP (Control) TCP (控制) UDP (Voice) UDP (語音) UDP Network statistics UDP 網路統計 Good 良好 Late 延遲 Lost 遺失 Resync 重新同步 From Client 從用戶端 To Client 到用戶端 Connection time 連線時間 %1w %1周 %1d %1日 %1h %1時 %1m %1分 %1s %1秒 , , %1 (%2) %1.%2.%3 (%4) %1 (%2) Supported 支援 Not Supported 不支援 Not Reported 不回報 %1 online (%2 idle) 在線 %1 (閒置 %2) %1 online 在線 %1 %1 kbit/s %1 kbit/s Bandwidth GroupBox 頻寬 Bandwidth Label 頻寬 Ping deviation Ping 誤差 UserListModel Nick 暱稱 Inactive days 離線天數 Last channel 最新頻道 Last seen: %1 最後上線時間: %1 Never 從不 Channel ID: %1 UserLocalVolumeDialog Local volume for other users <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. Adjusting local volume for %1 dB <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: 這是一位與伺服器連接的使用者。使用者左邊的圖示顯示他是否正在說話。 Talking to your channel. 正在對您的頻道說話。 Shouting directly to your channel. Whispering directly to your channel. 直接對您的頻道大喊。 Whispering directly to you. 直接對您發送悄悄話。 Not talking. 沒有說話。 This is a channel on the server. The icon indicates the state of the channel: 此為伺服器上的一個頻道。圖示顯示頻道狀態: Your current channel. 您目前的頻道。 A channel that is linked with your channel. Linked channels can talk to each other. 一個與您所在的頻道有關聯的頻道。有關聯的頻道可以互相對話。 A channel on the server that you are not linked to. 頻道在伺服器上沒有與其他頻道有任何關聯。 This shows the flags the user has on the server, if any: 如果有的話,顯示此伺服器上的使用者標示: On your friend list 在好友列表中 Authenticated user 已授權的使用者 Muted (manually muted by self) 關閉麥克風 (手動關閉) Muted (manually muted by admin) 關閉麥克風 (管理員手動關閉) Muted (not allowed to speak in current channel) 關閉麥克風 (不允許在目前頻道說話) Muted (muted by you, only on your machine) 關閉麥克風 (只會在您的機器上有效) Muted (push-to-mute) Deafened (by self) 關閉喇叭(自我設定) Deafened (by admin) 關閉喇叭(管理員設定) User has a new comment set (click to show) 使用者有新註解 (點擊顯示) User has a comment set, which you've already seen. (click to show) 使用者設有註解,您已經查看過了。 (點擊顯示) Ignoring Text Messages 忽略文字訊息 This shows the flags the channel has, if any: 如果有的話,顯示頻道標誌: Channel has a new comment set (click to show) 頻道有新註解 (點擊顯示) Channel has a comment set, which you've already seen. (click to show) 頻道設有註解,您已經查看過了。 (點擊顯示) Channel will be hidden when filtering is enabled 當啟用過濾時頻道會隱藏 Name 名稱 Flags 標誌 Are you sure you want to drag this user? Are you sure you want to drag this channel? 您確定要移動這個頻道? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. 無法自動調整位置,請重新修改編號順序。 VersionCheck Upgrade Mumble 更新 Mumble A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? 檢測到新版 Mumble 並已自動下載。建議您更新到此版本,或降版到最新穩定版。需要立即啟動安裝程式嗎? Failed to launch snapshot installer. 快照版安裝程式啟動失敗。 Corrupt download of new version detected. Automatically removed. 新版本下載失敗。已自動移除。 Downloading new snapshot from %1 to %2 從 %1 下載新快照版到 %2 Failed to write new version to disk. Failed to write new version to disc. 新版本寫入失敗。 Mumble failed to retrieve version information from the central server. Mumble 接收中央伺服器訊息失敗。 ViewCert Certificate Chain Details 憑證鏈結資料 Certificate chain 憑證鏈結 Certificate details 憑證資料 Common Name Organization Subunit Country Locality State Valid from: %1 生效日期: %1 Valid to: %1 有效日期至: %1 Serial: %1 序號: %1 Public Key: %1 bits %2 公開金鑰: %1 位元 %2 RSA RSA加密演算法 DSA 數位簽章演算法 Digest (SHA-1): %1 摘要 (SHA-1): %1 Digest (SHA-256): %1 Email: %1 電郵地址: %1 DNS: %1 DNS: %1 Issued by: 發佈者: Unit Name VoiceRecorder Recorder failed to create directory '%1' 錄音機新增目錄 '%1' 失敗 Recorder failed to open file '%1' 錄音機開啟 '%1' 失敗 .wav - Uncompressed .wav - 未經壓縮 .ogg (Vorbis) - Compressed .ogg - 有損壓縮 .au - Uncompressed .au - 未經壓縮 .flac - Lossless compressed .flac - 無損壓縮 VoiceRecorderDialog Recorder 錄音機 Control 控制 00:00:00 00:00:00 &Start &開始 S&top &停止 Mode 模式 Multichannel 多聲道 Output 輸出 Output format 輸出格式 Target directory 目標目錄 Filename 檔案名稱 &Browse... &瀏覽... Valid variables are: 有效的變量值: Inserts the user's name 輸入使用者名稱 Inserts the current date 輸入目前日期 Inserts the current time 輸入目前時間 Inserts the hostname 輸入主機名稱 Recorder still running 錄音中 Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? 不停止錄音而直接關閉會導致未寫入的音訊檔刪除。您確定要關閉錄音機? Unable to start recording. Not connected to a server. 無法使用錄音機。原因:尚未連接到伺服器。 The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. 目前連線的伺服器版本為 1.2.2 或更舊版。因私隱理由,在低於 1.2.3 版的伺服器上無法錄音。 請聯絡伺服器管理員獲得更多訊息。 There is already a recorder active for this server. 本伺服器已經有一個錄音機在使用。 Please select a recording format. 請選擇錄製格式。 Stopping 停止中 Select target directory 選擇目標目錄 Downmix 降混 WASAPIInput Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone. WASAPISystem Default Device 預設裝置 qwPTTButtonWidget Mumble PTT Mumble 按鍵說話 Push to talk 按鍵說話 mumble-1.3.4/src/mumble/PulseAudio.cpp0000664000175000017500000007151614010707273017501 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "PulseAudio.h" #include "MainWindow.h" #include "Timer.h" #include "User.h" // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" static const char *mumble_sink_input = "Mumble Speakers"; static const char *mumble_echo = "Mumble Speakers (Echo)"; static PulseAudioSystem *pasys = NULL; #define NBLOCKS 8 class PulseAudioInputRegistrar : public AudioInputRegistrar { public: PulseAudioInputRegistrar(); virtual AudioInput *create(); virtual const QList getDeviceChoices(); virtual void setDeviceChoice(const QVariant &, Settings &); virtual bool canEcho(const QString &) const; }; class PulseAudioOutputRegistrar : public AudioOutputRegistrar { public: PulseAudioOutputRegistrar(); virtual AudioOutput *create(); virtual const QList getDeviceChoices(); virtual void setDeviceChoice(const QVariant &, Settings &); bool canMuteOthers() const; }; class PulseAudioInit : public DeferInit { public: PulseAudioInputRegistrar *airPulseAudio; PulseAudioOutputRegistrar *aorPulseAudio; void initialize() { pasys = new PulseAudioSystem(); pasys->qmWait.lock(); pasys->qwcWait.wait(&pasys->qmWait, 1000); pasys->qmWait.unlock(); if (pasys->bPulseIsGood) { airPulseAudio = new PulseAudioInputRegistrar(); aorPulseAudio = new PulseAudioOutputRegistrar(); } else { airPulseAudio = NULL; aorPulseAudio = NULL; delete pasys; pasys = NULL; } }; void destroy() { delete airPulseAudio; delete aorPulseAudio; delete pasys; pasys = NULL; }; }; static PulseAudioInit pulseinit; PulseAudioSystem::PulseAudioSystem() { pasInput = pasOutput = pasSpeaker = NULL; bSourceDone=bSinkDone=bServerDone = false; iDelayCache = 0; bPositionalCache = false; bAttenuating = false; iRemainingOperations = 0; bPulseIsGood = false; iSinkId = -1; pam = pa_threaded_mainloop_new(); pa_mainloop_api *api = pa_threaded_mainloop_get_api(pam); pa_proplist *proplist; proplist = pa_proplist_new(); pa_proplist_sets(proplist, PA_PROP_APPLICATION_NAME, "Mumble"); pa_proplist_sets(proplist, PA_PROP_APPLICATION_ID, "net.sourceforge.mumble.mumble"); pa_proplist_sets(proplist, PA_PROP_APPLICATION_ICON_NAME, "mumble"); pa_proplist_sets(proplist, PA_PROP_MEDIA_ROLE, "game"); pacContext = pa_context_new_with_proplist(api, NULL, proplist); pa_proplist_free(proplist); pa_context_set_subscribe_callback(pacContext, subscribe_callback, this); pa_context_set_state_callback(pacContext, context_state_callback, this); pa_context_connect(pacContext, NULL, PA_CONTEXT_NOAUTOSPAWN, NULL); pade = api->defer_new(api, defer_event_callback, this); api->defer_enable(pade, false); pa_threaded_mainloop_start(pam); bRunning = true; } PulseAudioSystem::~PulseAudioSystem() { bRunning = false; if (bAttenuating) { qmWait.lock(); bAttenuating = false; setVolumes(); bool success = qwcWait.wait(&qmWait, 1000); if (! success) { qWarning("PulseAudio: Shutdown timeout when attempting to restore volumes."); } qmWait.unlock(); } pa_threaded_mainloop_stop(pam); pa_context_disconnect(pacContext); pa_context_unref(pacContext); pa_threaded_mainloop_free(pam); } QString PulseAudioSystem::outputDevice() const { QString odev = g.s.qsPulseAudioOutput; if (odev.isEmpty()) { odev = qsDefaultOutput; } if (!qhOutput.contains(odev)) { odev = qsDefaultOutput; } return odev; } QString PulseAudioSystem::inputDevice() const { QString idev = g.s.qsPulseAudioInput; if (idev.isEmpty()) { idev = qsDefaultInput; } if (!qhInput.contains(idev)) { idev = qsDefaultInput; } return idev; } void PulseAudioSystem::wakeup() { pa_mainloop_api *api = pa_threaded_mainloop_get_api(pam); api->defer_enable(pade, true); } void PulseAudioSystem::wakeup_lock() { pa_threaded_mainloop_lock(pam); pa_mainloop_api *api = pa_threaded_mainloop_get_api(pam); api->defer_enable(pade, true); pa_threaded_mainloop_unlock(pam); } void PulseAudioSystem::defer_event_callback(pa_mainloop_api *a, pa_defer_event *e, void *userdata) { PulseAudioSystem *pas = reinterpret_cast(userdata); pas->eventCallback(a, e); } void PulseAudioSystem::eventCallback(pa_mainloop_api *api, pa_defer_event *) { api->defer_enable(pade, false); if (! bSourceDone || ! bSinkDone || ! bServerDone) return; AudioInputPtr ai = g.ai; AudioOutputPtr ao = g.ao; AudioInput *raw_ai = ai.get(); AudioOutput *raw_ao = ao.get(); PulseAudioInput *pai = dynamic_cast(raw_ai); PulseAudioOutput *pao = dynamic_cast(raw_ao); if (raw_ao) { QString odev = outputDevice(); pa_stream_state ost = pasOutput ? pa_stream_get_state(pasOutput) : PA_STREAM_TERMINATED; bool do_stop = false; bool do_start = false; if (! pao && (ost == PA_STREAM_READY)) { do_stop = true; } else if (pao) { switch (ost) { case PA_STREAM_TERMINATED: { if (pasOutput) pa_stream_unref(pasOutput); pa_sample_spec pss = qhSpecMap.value(odev); pa_channel_map pcm = qhChanMap.value(odev); if ((pss.format != PA_SAMPLE_FLOAT32NE) && (pss.format != PA_SAMPLE_S16NE)) pss.format = PA_SAMPLE_FLOAT32NE; pss.rate = SAMPLE_RATE; if ((pss.channels == 0) || (! g.s.doPositionalAudio())) pss.channels = 1; pasOutput = pa_stream_new(pacContext, mumble_sink_input, &pss, (pss.channels == 1) ? NULL : &pcm); pa_stream_set_state_callback(pasOutput, stream_callback, this); pa_stream_set_write_callback(pasOutput, write_callback, this); // Fallthrough } case PA_STREAM_UNCONNECTED: do_start = true; break; case PA_STREAM_READY: { if (g.s.iOutputDelay != iDelayCache) { do_stop = true; } else if (g.s.doPositionalAudio() != bPositionalCache) { do_stop = true; } else if (odev != qsOutputCache) { do_stop = true; } break; } default: break; } } if (do_stop) { qWarning("PulseAudio: Stopping output"); pa_stream_disconnect(pasOutput); iSinkId = -1; } else if (do_start) { qWarning("PulseAudio: Starting output: %s", qPrintable(odev)); pa_buffer_attr buff; const pa_sample_spec *pss = pa_stream_get_sample_spec(pasOutput); const size_t sampleSize = (pss->format == PA_SAMPLE_FLOAT32NE) ? sizeof(float) : sizeof(short); const unsigned int iBlockLen = pao->iFrameSize * pss->channels * static_cast(sampleSize); buff.tlength = iBlockLen * (g.s.iOutputDelay+1); buff.minreq = iBlockLen; buff.maxlength = -1; buff.prebuf = -1; buff.fragsize = iBlockLen; iDelayCache = g.s.iOutputDelay; bPositionalCache = g.s.doPositionalAudio(); qsOutputCache = odev; pa_stream_connect_playback(pasOutput, qPrintable(odev), &buff, PA_STREAM_ADJUST_LATENCY, NULL, NULL); pa_context_get_sink_info_by_name(pacContext, qPrintable(odev), sink_info_callback, this); } } if (raw_ai) { QString idev = inputDevice(); pa_stream_state ist = pasInput ? pa_stream_get_state(pasInput) : PA_STREAM_TERMINATED; bool do_stop = false; bool do_start = false; if (! pai && (ist == PA_STREAM_READY)) { do_stop = true; } else if (pai) { switch (ist) { case PA_STREAM_TERMINATED: { if (pasInput) pa_stream_unref(pasInput); pa_sample_spec pss = qhSpecMap.value(idev); if ((pss.format != PA_SAMPLE_FLOAT32NE) && (pss.format != PA_SAMPLE_S16NE)) pss.format = PA_SAMPLE_FLOAT32NE; pss.rate = SAMPLE_RATE; pss.channels = 1; pasInput = pa_stream_new(pacContext, "Microphone", &pss, NULL); pa_stream_set_state_callback(pasInput, stream_callback, this); pa_stream_set_read_callback(pasInput, read_callback, this); // Fallthrough } case PA_STREAM_UNCONNECTED: do_start = true; break; case PA_STREAM_READY: { if (idev != qsInputCache) { do_stop = true; } break; } default: break; } } if (do_stop) { qWarning("PulseAudio: Stopping input"); pa_stream_disconnect(pasInput); } else if (do_start) { qWarning("PulseAudio: Starting input %s",qPrintable(idev)); pa_buffer_attr buff; const pa_sample_spec *pss = pa_stream_get_sample_spec(pasInput); const size_t sampleSize = (pss->format == PA_SAMPLE_FLOAT32NE) ? sizeof(float) : sizeof(short); const unsigned int iBlockLen = pai->iFrameSize * pss->channels * static_cast(sampleSize); buff.tlength = iBlockLen; buff.minreq = iBlockLen; buff.maxlength = -1; buff.prebuf = -1; buff.fragsize = iBlockLen; qsInputCache = idev; pa_stream_connect_record(pasInput, qPrintable(idev), &buff, PA_STREAM_ADJUST_LATENCY); } } if (raw_ai) { QString odev = outputDevice(); QString edev = qhEchoMap.value(odev); pa_stream_state est = pasSpeaker ? pa_stream_get_state(pasSpeaker) : PA_STREAM_TERMINATED; bool do_stop = false; bool do_start = false; if ((! pai || ! g.s.doEcho()) && (est == PA_STREAM_READY)) { do_stop = true; } else if (pai && g.s.doEcho()) { switch (est) { case PA_STREAM_TERMINATED: { if (pasSpeaker) pa_stream_unref(pasSpeaker); pa_sample_spec pss = qhSpecMap.value(edev); pa_channel_map pcm = qhChanMap.value(edev); if ((pss.format != PA_SAMPLE_FLOAT32NE) && (pss.format != PA_SAMPLE_S16NE)) pss.format = PA_SAMPLE_FLOAT32NE; pss.rate = SAMPLE_RATE; if ((pss.channels == 0) || (! g.s.bEchoMulti)) pss.channels = 1; pasSpeaker = pa_stream_new(pacContext, mumble_echo, &pss, (pss.channels == 1) ? NULL : &pcm); pa_stream_set_state_callback(pasSpeaker, stream_callback, this); pa_stream_set_read_callback(pasSpeaker, read_callback, this); // Fallthrough } case PA_STREAM_UNCONNECTED: do_start = true; break; case PA_STREAM_READY: { if (g.s.bEchoMulti != bEchoMultiCache) { do_stop = true; } else if (edev != qsEchoCache) { do_stop = true; } break; } default: break; } } if (do_stop) { qWarning("PulseAudio: Stopping echo"); pa_stream_disconnect(pasSpeaker); } else if (do_start) { qWarning("PulseAudio: Starting echo: %s", qPrintable(edev)); pa_buffer_attr buff; const pa_sample_spec *pss = pa_stream_get_sample_spec(pasSpeaker); const size_t sampleSize = (pss->format == PA_SAMPLE_FLOAT32NE) ? sizeof(float) : sizeof(short); const unsigned int iBlockLen = pai->iFrameSize * pss->channels * static_cast(sampleSize); buff.tlength = iBlockLen; buff.minreq = iBlockLen; buff.maxlength = -1; buff.prebuf = -1; buff.fragsize = iBlockLen; bEchoMultiCache = g.s.bEchoMulti; qsEchoCache = edev; pa_stream_connect_record(pasSpeaker, qPrintable(edev), &buff, PA_STREAM_ADJUST_LATENCY); } } } void PulseAudioSystem::context_state_callback(pa_context *c, void *userdata) { PulseAudioSystem *pas = reinterpret_cast(userdata); pas->contextCallback(c); } void PulseAudioSystem::subscribe_callback(pa_context *, pa_subscription_event_type evt, unsigned int, void *userdata) { switch (evt & PA_SUBSCRIPTION_EVENT_TYPE_MASK) { case PA_SUBSCRIPTION_EVENT_NEW: case PA_SUBSCRIPTION_EVENT_REMOVE: break; default: return; } switch (evt & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) { case PA_SUBSCRIPTION_EVENT_SINK: case PA_SUBSCRIPTION_EVENT_SOURCE: break; default: return; } PulseAudioSystem *pas = reinterpret_cast(userdata); qWarning("PulseAudio: Sinks or inputs changed (inserted or removed sound card)"); pas->query(); } void PulseAudioSystem::sink_callback(pa_context *, const pa_sink_info *i, int eol, void *userdata) { PulseAudioSystem *pas = reinterpret_cast(userdata); if (!i || eol) { pas->bSinkDone = true; pas->wakeup(); return; } const QString name = QString::fromUtf8(i->name); pas->qhSpecMap.insert(name, i->sample_spec); pas->qhChanMap.insert(name, i->channel_map); pas->qhOutput.insert(name, QString::fromUtf8(i->description)); pas->qhEchoMap.insert(name, QString::fromUtf8(i->monitor_source_name)); } void PulseAudioSystem::source_callback(pa_context *, const pa_source_info *i, int eol, void *userdata) { PulseAudioSystem *pas = reinterpret_cast(userdata); if (!i || eol) { pas->bSourceDone = true; pas->wakeup(); return; } const QString name = QString::fromUtf8(i->name); pas->qhSpecMap.insert(name, i->sample_spec); pas->qhChanMap.insert(name, i->channel_map); pas->qhInput.insert(QString::fromUtf8(i->name), QString::fromUtf8(i->description)); } void PulseAudioSystem::server_callback(pa_context *, const pa_server_info *i, void *userdata) { PulseAudioSystem *pas = reinterpret_cast(userdata); pas->qsDefaultInput = QString::fromUtf8(i->default_source_name); pas->qsDefaultOutput = QString::fromUtf8(i->default_sink_name); pas->bServerDone = true; pas->wakeup(); } void PulseAudioSystem::sink_info_callback(pa_context *, const pa_sink_info *i, int eol, void *userdata) { PulseAudioSystem *pas = reinterpret_cast(userdata); if (!i || eol) { return; } pas->iSinkId = i->index; } void PulseAudioSystem::stream_callback(pa_stream *s, void *userdata) { PulseAudioSystem *pas = reinterpret_cast(userdata); switch (pa_stream_get_state(s)) { case PA_STREAM_FAILED: qWarning("PulseAudio: Stream error: %s", pa_strerror(pa_context_errno(pa_stream_get_context(s)))); break; default: break; } pas->wakeup(); } void PulseAudioSystem::read_callback(pa_stream *s, size_t bytes, void *userdata) { PulseAudioSystem *pas = reinterpret_cast(userdata); size_t length = bytes; const void *data = NULL; pa_stream_peek(s, &data, &length); if (data == NULL && length > 0) { qWarning("PulseAudio: pa_stream_peek reports no data at current read index."); } else if (data == NULL && length == 0) { qWarning("PulseAudio: pa_stream_peek reports empty memblockq."); } else if (data == NULL || length == 0) { qWarning("PulseAudio: invalid pa_stream_peek state encountered."); return; } AudioInputPtr ai = g.ai; PulseAudioInput *pai = dynamic_cast(ai.get()); if (! pai) { if (length > 0) { pa_stream_drop(s); } pas->wakeup(); return; } const pa_sample_spec *pss = pa_stream_get_sample_spec(s); if (s == pas->pasInput) { if (!pa_sample_spec_equal(pss, &pai->pssMic)) { pai->pssMic = *pss; pai->iMicFreq = pss->rate; pai->iMicChannels = pss->channels; if (pss->format == PA_SAMPLE_FLOAT32NE) pai->eMicFormat = PulseAudioInput::SampleFloat; else pai->eMicFormat = PulseAudioInput::SampleShort; pai->initializeMixer(); } if (data != NULL) { pai->addMic(data, static_cast(length) / pai->iMicSampleSize); } } else if (s == pas->pasSpeaker) { if (!pa_sample_spec_equal(pss, &pai->pssEcho)) { pai->pssEcho = *pss; pai->iEchoFreq = pss->rate; pai->iEchoChannels = pss->channels; if (pss->format == PA_SAMPLE_FLOAT32NE) pai->eEchoFormat = PulseAudioInput::SampleFloat; else pai->eEchoFormat = PulseAudioInput::SampleShort; pai->initializeMixer(); } if (data != NULL) { pai->addEcho(data, static_cast(length) / pai->iEchoSampleSize); } } if (length > 0) { pa_stream_drop(s); } } void PulseAudioSystem::write_callback(pa_stream *s, size_t bytes, void *userdata) { PulseAudioSystem *pas = reinterpret_cast(userdata); Q_ASSERT(s == pas->pasOutput); AudioOutputPtr ao = g.ao; PulseAudioOutput *pao = dynamic_cast(ao.get()); if (! pao) { return; } const pa_sample_spec *pss = pa_stream_get_sample_spec(s); const pa_channel_map *pcm = pa_stream_get_channel_map(pas->pasOutput); if (!pa_sample_spec_equal(pss, &pao->pss) || !pa_channel_map_equal(pcm, &pao->pcm)) { pao->pss = *pss; pao->pcm = *pcm; if (pss->format == PA_SAMPLE_FLOAT32NE) pao->eSampleFormat = PulseAudioOutput::SampleFloat; else pao->eSampleFormat = PulseAudioOutput::SampleShort; pao->iMixerFreq = pss->rate; pao->iChannels = pss->channels; unsigned int chanmasks[pss->channels]; for (int i=0;ichannels;++i) { unsigned int cm = 0; switch (pcm->map[i]) { case PA_CHANNEL_POSITION_LEFT: cm = SPEAKER_FRONT_LEFT; break; case PA_CHANNEL_POSITION_RIGHT: cm = SPEAKER_FRONT_RIGHT; break; case PA_CHANNEL_POSITION_CENTER: cm = SPEAKER_FRONT_CENTER; break; case PA_CHANNEL_POSITION_REAR_LEFT: cm = SPEAKER_BACK_LEFT; break; case PA_CHANNEL_POSITION_REAR_RIGHT: cm = SPEAKER_BACK_RIGHT; break; case PA_CHANNEL_POSITION_REAR_CENTER: cm = SPEAKER_BACK_CENTER; break; case PA_CHANNEL_POSITION_LFE: cm = SPEAKER_LOW_FREQUENCY; break; case PA_CHANNEL_POSITION_SIDE_LEFT: cm = SPEAKER_SIDE_LEFT; break; case PA_CHANNEL_POSITION_SIDE_RIGHT: cm = SPEAKER_SIDE_RIGHT; break; case PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER: cm = SPEAKER_FRONT_LEFT_OF_CENTER; break; case PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER: cm = SPEAKER_FRONT_RIGHT_OF_CENTER; break; default: cm = 0; break; } chanmasks[i] = cm; } pao->initializeMixer(chanmasks); } const unsigned int iSampleSize = pao->iSampleSize; const unsigned int samples = static_cast(bytes) / iSampleSize; bool oldAttenuation = pas->bAttenuating; unsigned char buffer[bytes]; // do we have some mixed output? if (pao->mix(buffer, samples)) { // attenuate if instructed to or it's in settings pas->bAttenuating = (g.bAttenuateOthers || g.s.bAttenuateOthers); } else { memset(buffer, 0, bytes); // attenuate if intructed to (self-activated) pas->bAttenuating = g.bAttenuateOthers; } // if the attenuation state has changed if (oldAttenuation != pas->bAttenuating) { pas->setVolumes(); } pa_stream_write(s, buffer, iSampleSize * samples, NULL, 0, PA_SEEK_RELATIVE); } void PulseAudioSystem::volume_sink_input_list_callback(pa_context *c, const pa_sink_input_info *i, int eol, void *userdata) { PulseAudioSystem *pas = reinterpret_cast(userdata); if (eol == 0) { // If we're using the default of "enable attenuation on all ouputs" and output from an application is loopbacked, // both the loopback and the application will be attenuated leading to double attenuation. if (!g.s.bOnlyAttenuateSameOutput && pas->iSinkId > -1 && !strcmp(i->driver, "module-loopback.c")) { return; } // If we're not attenuating different sinks and the input is not on this sink, don't attenuate. Or, // if the input is a loopback module and connected to Mumble's sink, also ignore it (loopbacks are used to connect // sinks). An attenuated loopback means an indirect application attenuation. if (g.s.bOnlyAttenuateSameOutput && pas->iSinkId > -1) { if (int(i->sink) != pas->iSinkId || (int(i->sink) == pas->iSinkId && !strcmp(i->driver, "module-loopback.c") && !g.s.bAttenuateLoopbacks)) { return; } } // ensure we're not attenuating ourselves! if (strcmp(i->name, mumble_sink_input) != 0) { // create a new entry PulseAttenuation patt; patt.index = i->index; patt.name = QString::fromUtf8(i->name); patt.stream_restore_id = QString::fromUtf8(pa_proplist_gets(i->proplist, "module-stream-restore.id")); patt.normal_volume = i->volume; // calculate the attenuated volume pa_volume_t adj = static_cast(PA_VOLUME_NORM * g.s.fOtherVolume); pa_sw_cvolume_multiply_scalar(&patt.attenuated_volume, &i->volume, adj); // set it on the sink input pa_operation_unref(pa_context_set_sink_input_volume(c, i->index, &patt.attenuated_volume, NULL, NULL)); // store it pas->qhVolumes[i->index] = patt; } } else if (eol < 0) { qWarning("PulseAudio: Sink input introspection error."); } } void PulseAudioSystem::restore_sink_input_list_callback(pa_context *c, const pa_sink_input_info *i, int eol, void *userdata) { PulseAudioSystem *pas = reinterpret_cast(userdata); if (eol == 0) { // if we were tracking this specific sink previously if (pas->qhVolumes.contains(i->index)) { // and if it has the attenuated volume we applied to it if (pa_cvolume_equal(&i->volume, &pas->qhVolumes[i->index].attenuated_volume) != 0) { // mark it as matched pas->qlMatchedSinks.append(i->index); // reset the volume to normal pas->iRemainingOperations++; pa_operation_unref(pa_context_set_sink_input_volume(c, i->index, &pas->qhVolumes[i->index].normal_volume, restore_volume_success_callback, pas)); } // otherwise, save for matching at the end of iteration } else { QString restore_id = QString::fromUtf8(pa_proplist_gets(i->proplist, "module-stream-restore.id")); PulseAttenuation patt; patt.index = i->index; patt.normal_volume = i->volume; pas->qhUnmatchedSinks[restore_id] = patt; } } else if (eol < 0) { qWarning("PulseAudio: Sink input introspection error."); } else { // build a list of missing streams by iterating our active list QHash::const_iterator it; for (it = pas->qhVolumes.constBegin(); it != pas->qhVolumes.constEnd(); ++it) { // skip if previously matched if (pas->qlMatchedSinks.contains(it.key())) { continue; } // check if the restore id matches. the only case where this would // happen is if the application was reopened during attenuation. if (pas->qhUnmatchedSinks.contains(it.value().stream_restore_id)) { PulseAttenuation active_sink = pas->qhUnmatchedSinks[it.value().stream_restore_id]; // if the volume wasn't changed from our attenuation if (pa_cvolume_equal(&active_sink.normal_volume, &it.value().attenuated_volume) != 0) { // reset the volume to normal pas->iRemainingOperations++; pa_operation_unref(pa_context_set_sink_input_volume(c, active_sink.index, &it.value().normal_volume, restore_volume_success_callback, pas)); } continue; } // at this point, we don't know what happened to the sink. add // it to a list to check the stream restore database for. pas->qhMissingSinks[it.value().stream_restore_id] = it.value(); } // clean up pas->qlMatchedSinks.clear(); pas->qhUnmatchedSinks.clear(); pas->qhVolumes.clear(); // if we had missing sinks, check the stream restore database // to see if we can find and update them. if (pas->qhMissingSinks.count() > 0) { pas->iRemainingOperations++; pa_operation_unref(pa_ext_stream_restore_read(c, stream_restore_read_callback, pas)); } // trigger the volume completion callback; // necessary so that shutdown actions are called restore_volume_success_callback(c, 1, pas); } } void PulseAudioSystem::stream_restore_read_callback(pa_context *c, const pa_ext_stream_restore_info *i, int eol, void *userdata) { PulseAudioSystem *pas = reinterpret_cast(userdata); if (eol == 0) { QString name = QString::fromUtf8(i->name); // were we looking for this restoration? if (pas->qhMissingSinks.contains(name)) { // make sure it still has the volume we gave it if (pa_cvolume_equal(&pas->qhMissingSinks[name].attenuated_volume, &i->volume) != 0) { // update the stream restore record pa_ext_stream_restore_info restore = *i; restore.volume = pas->qhMissingSinks[name].normal_volume; pas->iRemainingOperations++; pa_operation_unref(pa_ext_stream_restore_write(c, PA_UPDATE_REPLACE, &restore, 1, 1, restore_volume_success_callback, pas)); } pas->qhMissingSinks.remove(name); } } else if (eol < 0) { qWarning("PulseAudio: Couldn't read stream restore database."); pas->qhMissingSinks.clear(); } else { // verify missing list is empty if (pas->qhMissingSinks.count() > 0) { qWarning("PulseAudio: Failed to match %d stream(s).", pas->qhMissingSinks.count()); pas->qhMissingSinks.clear(); } // trigger the volume completion callback; // necessary so that shutdown actions are called restore_volume_success_callback(c, 1, pas); } } void PulseAudioSystem::restore_volume_success_callback(pa_context *, int, void *userdata) { PulseAudioSystem *pas = reinterpret_cast(userdata); pas->iRemainingOperations--; // if there are no more pending volume adjustments and we're shutting down, // let the main thread know if (! pas->bRunning && pas->iRemainingOperations == 0) { pas->qwcWait.wakeAll(); } } void PulseAudioSystem::query() { bSourceDone=bSinkDone=bServerDone = false; qhInput.clear(); qhOutput.clear(); qhEchoMap.clear(); qhSpecMap.clear(); qhChanMap.clear(); qhInput.insert(QString(), tr("Default Input")); qhOutput.insert(QString(), tr("Default Output")); pa_operation_unref(pa_context_get_server_info(pacContext, server_callback, this)); pa_operation_unref(pa_context_get_sink_info_list(pacContext, sink_callback, this)); pa_operation_unref(pa_context_get_source_info_list(pacContext, source_callback, this)); wakeup(); } void PulseAudioSystem::setVolumes() { // set attenuation state and volumes if (bAttenuating) { // ensure the volume map is empty, otherwise it may be dangerous to change if (qhVolumes.empty()) { // set the new per-application volumes and store the old ones pa_operation_unref(pa_context_get_sink_input_info_list(pacContext, volume_sink_input_list_callback, this)); } // clear attenuation state and restore normal volumes } else { iRemainingOperations++; pa_operation_unref(pa_context_get_sink_input_info_list(pacContext, restore_sink_input_list_callback, this)); } } void PulseAudioSystem::contextCallback(pa_context *c) { Q_ASSERT(c == pacContext); switch (pa_context_get_state(c)) { case PA_CONTEXT_READY: bPulseIsGood = true; pa_operation_unref(pa_context_subscribe(pacContext, PA_SUBSCRIPTION_MASK_SOURCE, NULL, this)); pa_operation_unref(pa_context_subscribe(pacContext, PA_SUBSCRIPTION_MASK_SINK, NULL, this)); query(); break; case PA_CONTEXT_TERMINATED: qWarning("PulseAudio: Forcibly disconnected from PulseAudio"); break; case PA_CONTEXT_FAILED: qWarning("PulseAudio: Connection failure: %s", pa_strerror(pa_context_errno(c))); break; default: return; } qmWait.lock(); qwcWait.wakeAll(); qmWait.unlock(); } PulseAudioInputRegistrar::PulseAudioInputRegistrar() : AudioInputRegistrar(QLatin1String("PulseAudio"), 10) { } AudioInput *PulseAudioInputRegistrar::create() { return new PulseAudioInput(); } const QList PulseAudioInputRegistrar::getDeviceChoices() { QList qlReturn; QStringList qlInputDevs = pasys->qhInput.keys(); qSort(qlInputDevs); if (qlInputDevs.contains(g.s.qsPulseAudioInput)) { qlInputDevs.removeAll(g.s.qsPulseAudioInput); qlInputDevs.prepend(g.s.qsPulseAudioInput); } foreach(const QString &dev, qlInputDevs) { qlReturn << audioDevice(pasys->qhInput.value(dev), dev); } return qlReturn; } void PulseAudioInputRegistrar::setDeviceChoice(const QVariant &choice, Settings &s) { s.qsPulseAudioInput = choice.toString(); } bool PulseAudioInputRegistrar::canEcho(const QString &osys) const { return (osys == name); } PulseAudioOutputRegistrar::PulseAudioOutputRegistrar() : AudioOutputRegistrar(QLatin1String("PulseAudio"), 10) { } AudioOutput *PulseAudioOutputRegistrar::create() { return new PulseAudioOutput(); } const QList PulseAudioOutputRegistrar::getDeviceChoices() { QList qlReturn; QStringList qlOutputDevs = pasys->qhOutput.keys(); qSort(qlOutputDevs); if (qlOutputDevs.contains(g.s.qsPulseAudioOutput)) { qlOutputDevs.removeAll(g.s.qsPulseAudioOutput); qlOutputDevs.prepend(g.s.qsPulseAudioOutput); } foreach(const QString &dev, qlOutputDevs) { qlReturn << audioDevice(pasys->qhOutput.value(dev), dev); } return qlReturn; } void PulseAudioOutputRegistrar::setDeviceChoice(const QVariant &choice, Settings &s) { s.qsPulseAudioOutput = choice.toString(); } bool PulseAudioOutputRegistrar::canMuteOthers() const { return true; } PulseAudioInput::PulseAudioInput() { memset(&pssMic, 0, sizeof(pssMic)); memset(&pssEcho, 0, sizeof(pssEcho)); bRunning = true; if (pasys) pasys->wakeup_lock(); } PulseAudioInput::~PulseAudioInput() { bRunning = false; qmMutex.lock(); qwcWait.wakeAll(); qmMutex.unlock(); wait(); if (pasys) pasys->wakeup_lock(); } void PulseAudioInput::run() { qmMutex.lock(); while (bRunning) qwcWait.wait(&qmMutex); qmMutex.unlock(); } PulseAudioOutput::PulseAudioOutput() { memset(&pss, 0, sizeof(pss)); memset(&pcm, 0, sizeof(pcm)); bRunning = true; if (pasys) pasys->wakeup_lock(); } PulseAudioOutput::~PulseAudioOutput() { bRunning = false; qmMutex.lock(); qwcWait.wakeAll(); qmMutex.unlock(); wait(); if (pasys) pasys->wakeup_lock(); } void PulseAudioOutput::run() { qmMutex.lock(); while (bRunning) qwcWait.wait(&qmMutex); qmMutex.unlock(); } mumble-1.3.4/src/mumble/G15LCDEngine_unix.cpp0000664000175000017500000000360114010707273020465 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include static LCDEngine *G15LCDEngineNew() { return new G15LCDEngineUnix(); } static LCDEngineRegistrar registrar(G15LCDEngineNew); G15LCDEngineUnix::G15LCDEngineUnix() { sock = new_g15_screen(G15_PIXELBUF); if (sock < 0) { qWarning("G15LCDEngineUnix: Unable to connect to G15Daemon."); return; } qlDevices << new G15LCDDeviceUnix(this); } G15LCDEngineUnix::~G15LCDEngineUnix() { } QList G15LCDEngineUnix::devices() const { return qlDevices; } /* -- */ G15LCDDeviceUnix::G15LCDDeviceUnix(G15LCDEngineUnix *e) : LCDDevice() { bEnabled = false; engine = e; } G15LCDDeviceUnix::~G15LCDDeviceUnix() { } bool G15LCDDeviceUnix::enabled() { return bEnabled; } void G15LCDDeviceUnix::setEnabled(bool b) { bEnabled = b; } void G15LCDDeviceUnix::blitImage(QImage *img, bool) { Q_ASSERT(img != NULL); const unsigned int len = 6880; uchar buf[len]; uchar *tmp = img->bits(); for (unsigned int i = 0; i < len / 8; ++i) { unsigned int idx = i*8; buf[idx+7] = tmp[i] & 0x80 ? 1 : 0; buf[idx+6] = tmp[i] & 0x40 ? 1 : 0; buf[idx+5] = tmp[i] & 0x20 ? 1 : 0; buf[idx+4] = tmp[i] & 0x10 ? 1 : 0; buf[idx+3] = tmp[i] & 0x08 ? 1 : 0; buf[idx+2] = tmp[i] & 0x04 ? 1 : 0; buf[idx+1] = tmp[i] & 0x02 ? 1 : 0; buf[idx+0] = tmp[i] & 0x01 ? 1 : 0; } int ret = g15_send(engine->sock, reinterpret_cast(buf), len); if (ret < 0) qWarning("G15LCDDeviceUnix: Unable to g15_send()."); } QString G15LCDDeviceUnix::name() const { return QString::fromLatin1("Logitech Gamepanel (G15Daemon)"); } QSize G15LCDDeviceUnix::size() const { return QSize(G15_WIDTH, G15_HEIGHT); } mumble-1.3.4/src/mumble/ViewCert.h0000664000175000017500000000156714010707274016624 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_VIEWCERT_H_ #define MUMBLE_MUMBLE_VIEWCERT_H_ #include #include #include #if QT_VERSION >= 0x050000 # include #else # include #endif #include class QListWidget; class ViewCert : public QDialog { private: Q_OBJECT Q_DISABLE_COPY(ViewCert) protected: QList qlCerts; QListWidget *qlwChain, *qlwCert; protected slots: void on_Chain_currentRowChanged(int); public: ViewCert(QList c, QWidget *p); static QString prettifyDigest(QString); }; #endif mumble-1.3.4/src/mumble/LCD.ui0000664000175000017500000001233514010707273015656 0ustar builderbuilder LCDConfig 0 0 426 694 LCD 160 43 <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> Devices 0 0 false Name Size Enabled 0 0 Views Minimum Column Width <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> 40 200 Qt::Horizontal 30 0 Splitter Width This setting decides the width of column splitter. 0 5 Qt::Horizontal 30 0 Qt::Vertical QSizePolicy::Expanding 20 40 mumble-1.3.4/src/mumble/MainWindow.cpp0000664000175000017500000027632014010707273017503 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "MainWindow.h" #include "About.h" #include "ACL.h" #include "ACLEditor.h" #include "AudioInput.h" #include "AudioStats.h" #include "AudioWizard.h" #include "BanEditor.h" #include "CELTCodec.h" #include "OpusCodec.h" #include "Cert.h" #include "Channel.h" #include "Connection.h" #include "ConnectDialog.h" #include "Database.h" #include "DeveloperConsole.h" #include "GlobalShortcut.h" #include "Log.h" #include "Net.h" #include "NetworkConfig.h" #include "OverlayClient.h" #include "Plugins.h" #include "PTTButtonWidget.h" #include "RichTextEditor.h" #include "ServerHandler.h" #include "TextMessage.h" #include "Tokens.h" #include "User.h" #include "UserEdit.h" #include "UserInformation.h" #include "UserModel.h" #include "UserLocalVolumeDialog.h" #include "VersionCheck.h" #include "ViewCert.h" #include "VoiceRecorderDialog.h" #include "../SignalCurry.h" #include "Settings.h" #include "Themes.h" #include "SSLCipherInfo.h" #include "SvgIcon.h" #ifdef Q_OS_WIN #include "TaskList.h" #endif #ifdef Q_OS_MAC #include "AppNap.h" #endif // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" MessageBoxEvent::MessageBoxEvent(QString m) : QEvent(static_cast(MB_QEVENT)) { msg = m; } OpenURLEvent::OpenURLEvent(QUrl u) : QEvent(static_cast(OU_QEVENT)) { url = u; } MainWindow::MainWindow(QWidget *p) : QMainWindow(p) { SvgIcon::addSvgPixmapsToIcon(qiIconMuteSelf, QLatin1String("skin:muted_self.svg")); SvgIcon::addSvgPixmapsToIcon(qiIconMuteServer, QLatin1String("skin:muted_server.svg")); SvgIcon::addSvgPixmapsToIcon(qiIconMuteSuppressed, QLatin1String("skin:muted_suppressed.svg")); SvgIcon::addSvgPixmapsToIcon(qiIconMutePushToMute, QLatin1String("skin:muted_pushtomute.svg")); SvgIcon::addSvgPixmapsToIcon(qiIconDeafSelf, QLatin1String("skin:deafened_self.svg")); SvgIcon::addSvgPixmapsToIcon(qiIconDeafServer, QLatin1String("skin:deafened_server.svg")); SvgIcon::addSvgPixmapsToIcon(qiTalkingOff, QLatin1String("skin:talking_off.svg")); SvgIcon::addSvgPixmapsToIcon(qiTalkingOn, QLatin1String("skin:talking_on.svg")); SvgIcon::addSvgPixmapsToIcon(qiTalkingShout, QLatin1String("skin:talking_alt.svg")); SvgIcon::addSvgPixmapsToIcon(qiTalkingWhisper, QLatin1String("skin:talking_whisper.svg")); #ifdef Q_OS_MAC if (QFile::exists(QLatin1String("skin:mumble.icns"))) qiIcon.addFile(QLatin1String("skin:mumble.icns")); else SvgIcon::addSvgPixmapsToIcon(qiIcon, QLatin1String("skin:mumble.svg")); #else { SvgIcon::addSvgPixmapsToIcon(qiIcon, QLatin1String("skin:mumble.svg")); } // Set application icon except on MacOSX, where the window-icon // shown in the title-bar usually serves as a draggable version of the // current open document (i.e. you can copy the open document anywhere // simply by dragging this icon). qApp->setWindowIcon(qiIcon); // Set the icon on the MainWindow directly. This fixes the icon not // being set on the MainWindow in certain environments (Ex: GTK+). setWindowIcon(qiIcon); #endif #ifdef Q_OS_WIN uiNewHardware = 1; #endif bSuppressAskOnQuit = false; restartOnQuit = false; bAutoUnmute = false; Channel::add(0, tr("Root")); aclEdit = NULL; banEdit = NULL; userEdit = NULL; tokenEdit = NULL; voiceRecorderDialog = NULL; qwPTTButtonWidget = NULL; #if QT_VERSION < 0x050000 cuContextUser = QWeakPointer(); cContextChannel = QWeakPointer(); #endif qtReconnect = new QTimer(this); qtReconnect->setInterval(10000); qtReconnect->setSingleShot(true); qtReconnect->setObjectName(QLatin1String("Reconnect")); qmUser = new QMenu(tr("&User"), this); qmChannel = new QMenu(tr("&Channel"), this); qmDeveloper = new QMenu(tr("&Developer"), this); createActions(); setupUi(this); setupGui(); connect(qmUser, SIGNAL(aboutToShow()), this, SLOT(qmUser_aboutToShow())); connect(qmChannel, SIGNAL(aboutToShow()), this, SLOT(qmChannel_aboutToShow())); connect(qteChat, SIGNAL(entered(QString)), this, SLOT(sendChatbarMessage(QString))); // Tray connect(qstiIcon, SIGNAL(messageClicked()), this, SLOT(showRaiseWindow())); connect(qaShow, SIGNAL(triggered()), this, SLOT(showRaiseWindow())); // Explicitely add actions to mainwindow so their shortcuts are available // if only the main window is visible (e.g. minimal mode) addActions(findChildren()); on_qmServer_aboutToShow(); on_qmSelf_aboutToShow(); qmChannel_aboutToShow(); qmUser_aboutToShow(); on_qmConfig_aboutToShow(); qmDeveloper->addAction(qaDeveloperConsole); setOnTop(g.s.aotbAlwaysOnTop == Settings::OnTopAlways || (g.s.bMinimalView && g.s.aotbAlwaysOnTop == Settings::OnTopInMinimal) || (!g.s.bMinimalView && g.s.aotbAlwaysOnTop == Settings::OnTopInNormal)); #ifdef NO_UPDATE_CHECK delete qaHelpVersionCheck; #endif } void MainWindow::createActions() { int idx = 1; gsPushTalk=new GlobalShortcut(this, idx++, tr("Push-to-Talk", "Global Shortcut")); gsPushTalk->setObjectName(QLatin1String("PushToTalk")); gsPushTalk->qsToolTip = tr("Push and hold this button to send voice.", "Global Shortcut"); gsPushTalk->qsWhatsThis = tr("This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice.", "Global Shortcut"); gsResetAudio=new GlobalShortcut(this, idx++, tr("Reset Audio Processor", "Global Shortcut")); gsResetAudio->setObjectName(QLatin1String("ResetAudio")); gsMuteSelf=new GlobalShortcut(this, idx++, tr("Mute Self", "Global Shortcut"), 0); gsMuteSelf->setObjectName(QLatin1String("gsMuteSelf")); gsMuteSelf->qsToolTip = tr("Set self-mute status.", "Global Shortcut"); gsMuteSelf->qsWhatsThis = tr("This will set or toggle your muted status. If you turn this off, you will also disable self-deafen.", "Global Shortcut"); gsDeafSelf=new GlobalShortcut(this, idx++, tr("Deafen Self", "Global Shortcut"), 0); gsDeafSelf->setObjectName(QLatin1String("gsDeafSelf")); gsDeafSelf->qsToolTip = tr("Set self-deafen status.", "Global Shortcut"); gsDeafSelf->qsWhatsThis = tr("This will set or toggle your deafened status. If you turn this on, you will also enable self-mute.", "Global Shortcut"); gsUnlink=new GlobalShortcut(this, idx++, tr("Unlink Plugin", "Global Shortcut")); gsUnlink->setObjectName(QLatin1String("UnlinkPlugin")); gsPushMute=new GlobalShortcut(this, idx++, tr("Push-to-Mute", "Global Shortcut")); gsPushMute->setObjectName(QLatin1String("PushToMute")); gsJoinChannel=new GlobalShortcut(this, idx++, tr("Join Channel", "Global Shortcut")); gsJoinChannel->setObjectName(QLatin1String("MetaChannel")); gsJoinChannel->qsToolTip = tr("Use in conjunction with Whisper to.", "Global Shortcut"); gsToggleOverlay=new GlobalShortcut(this, idx++, tr("Toggle Overlay", "Global Shortcut")); gsToggleOverlay->setObjectName(QLatin1String("ToggleOverlay")); gsToggleOverlay->qsToolTip = tr("Toggle state of in-game overlay.", "Global Shortcut"); gsToggleOverlay->qsWhatsThis = tr("This will switch the states of the in-game overlay.", "Global Shortcut"); connect(gsToggleOverlay, SIGNAL(down(QVariant)), g.o, SLOT(toggleShow())); gsMinimal=new GlobalShortcut(this, idx++, tr("Toggle Minimal", "Global Shortcut")); gsMinimal->setObjectName(QLatin1String("ToggleMinimal")); gsVolumeUp=new GlobalShortcut(this, idx++, tr("Volume Up (+10%)", "Global Shortcut")); gsVolumeUp->setObjectName(QLatin1String("VolumeUp")); gsVolumeDown=new GlobalShortcut(this, idx++, tr("Volume Down (-10%)", "Global Shortcut")); gsVolumeDown->setObjectName(QLatin1String("VolumeDown")); qstiIcon = new QSystemTrayIcon(qiIcon, this); qstiIcon->setToolTip(tr("Mumble -- %1").arg(QLatin1String(MUMBLE_RELEASE))); qstiIcon->setObjectName(QLatin1String("Icon")); gsWhisper = new GlobalShortcut(this, idx++, tr("Whisper/Shout"), QVariant::fromValue(ShortcutTarget())); gsWhisper->setObjectName(QLatin1String("gsWhisper")); gsLinkChannel=new GlobalShortcut(this, idx++, tr("Link Channel", "Global Shortcut")); gsLinkChannel->setObjectName(QLatin1String("MetaLink")); gsLinkChannel->qsToolTip = tr("Use in conjunction with Whisper to.", "Global Shortcut"); gsCycleTransmitMode=new GlobalShortcut(this, idx++, tr("Cycle Transmit Mode", "Global Shortcut")); gsCycleTransmitMode->setObjectName(QLatin1String("gsCycleTransmitMode")); gsTransmitModePushToTalk=new GlobalShortcut(this, idx++, tr("Set Transmit Mode to Push-To-Talk", "Global Shortcut")); gsTransmitModePushToTalk->setObjectName(QLatin1String("gsTransmitModePushToTalk")); gsTransmitModeContinuous=new GlobalShortcut(this, idx++, tr("Set Transmit Mode to Continuous", "Global Shortcut")); gsTransmitModeContinuous->setObjectName(QLatin1String("gsTransmitModeContinuous")); gsTransmitModeVAD=new GlobalShortcut(this, idx++, tr("Set Transmit Mode to VAD", "Global Shortcut")); gsTransmitModeVAD->setObjectName(QLatin1String("gsTransmitModeVAD")); gsSendTextMessage=new GlobalShortcut(this, idx++, tr("Send Text Message", "Global Shortcut"), QVariant(QString())); gsSendTextMessage->setObjectName(QLatin1String("gsSendTextMessage")); gsSendClipboardTextMessage=new GlobalShortcut(this, idx++, tr("Send Clipboard Text Message", "Global Shortcut")); gsSendClipboardTextMessage->setObjectName(QLatin1String("gsSendClipboardTextMessage")); gsSendClipboardTextMessage->qsWhatsThis = tr("This will send your Clipboard content to the channel you are currently in.", "Global Shortcut"); #ifndef Q_OS_MAC qstiIcon->show(); #endif } void MainWindow::setupGui() { updateWindowTitle(); setCentralWidget(qtvUsers); setAcceptDrops(true); #ifdef Q_OS_MAC QMenu *qmWindow = new QMenu(tr("&Window"), this); menubar->insertMenu(qmHelp->menuAction(), qmWindow); qmWindow->addAction(tr("Minimize"), this, SLOT(showMinimized()), QKeySequence(tr("Ctrl+M"))); qtvUsers->setAttribute(Qt::WA_MacShowFocusRect, false); qteChat->setAttribute(Qt::WA_MacShowFocusRect, false); qteChat->setFrameShape(QFrame::NoFrame); qteLog->setFrameStyle(QFrame::NoFrame); #endif LogDocument *ld = new LogDocument(qteLog); qteLog->setDocument(ld); qteLog->document()->setMaximumBlockCount(g.s.iMaxLogBlocks); qteLog->document()->setDefaultStyleSheet(qApp->styleSheet()); pmModel = new UserModel(qtvUsers); qtvUsers->setModel(pmModel); qtvUsers->setRowHidden(0, QModelIndex(), true); qtvUsers->ensurePolished(); qaAudioMute->setChecked(g.s.bMute); qaAudioDeaf->setChecked(g.s.bDeaf); #ifdef USE_NO_TTS qaAudioTTS->setChecked(false); qaAudioTTS->setDisabled(true); #else qaAudioTTS->setChecked(g.s.bTTS); #endif qaFilterToggle->setChecked(g.s.bFilterActive); qaHelpWhatsThis->setShortcuts(QKeySequence::WhatsThis); qaConfigMinimal->setChecked(g.s.bMinimalView); qaConfigHideFrame->setChecked(g.s.bHideFrame); connect(gsResetAudio, SIGNAL(down(QVariant)), qaAudioReset, SLOT(trigger())); connect(gsUnlink, SIGNAL(down(QVariant)), qaAudioUnlink, SLOT(trigger())); connect(gsMinimal, SIGNAL(down(QVariant)), qaConfigMinimal, SLOT(trigger())); dtbLogDockTitle = new DockTitleBar(); qdwLog->setTitleBarWidget(dtbLogDockTitle); foreach(QWidget *w, qdwLog->findChildren()) { w->installEventFilter(dtbLogDockTitle); w->setMouseTracking(true); } dtbChatDockTitle = new DockTitleBar(); qdwChat->setTitleBarWidget(dtbChatDockTitle); qdwChat->installEventFilter(dtbChatDockTitle); qteChat->setDefaultText(tr("
Not connected
"), true); qteChat->setEnabled(false); setShowDockTitleBars((g.s.wlWindowLayout == Settings::LayoutCustom) && !g.s.bLockLayout); #ifdef Q_OS_MAC // Workaround for QTBUG-3116 -- using a unified toolbar on Mac OS X // and using restoreGeometry before the window has updated its frameStrut // causes the MainWindow to jump around on screen on launch. Workaround // is to call show() to update the frameStrut and set the windowOpacity to // 0 to hide any graphical glitches that occur when we add stuff to the // window. setWindowOpacity(0.0f); show(); #endif connect(qtvUsers->selectionModel(), SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)), SLOT(qtvUserCurrentChanged(const QModelIndex &, const QModelIndex &))); // QtCreator and uic.exe do not allow adding arbitrary widgets // such as a MUComboBox to a QToolbar, even though they are supported. qcbTransmitMode = new MUComboBox(qtIconToolbar); qcbTransmitMode->setObjectName(QLatin1String("qcbTransmitMode")); qcbTransmitMode->addItem(tr("Continuous")); qcbTransmitMode->addItem(tr("Voice Activity")); qcbTransmitMode->addItem(tr("Push-to-Talk")); qaTransmitModeSeparator = qtIconToolbar->insertSeparator(qaConfigDialog); qaTransmitMode = qtIconToolbar->insertWidget(qaTransmitModeSeparator, qcbTransmitMode); connect(qcbTransmitMode, SIGNAL(activated(int)), this, SLOT(qcbTransmitMode_activated(int))); updateTransmitModeComboBox(); // For Qt >= 5, enable this call (only) for Windows. // For Qt < 5, enable for anything but macOS. #if (QT_VERSION >= 0x050000 && defined(Q_OS_WIN)) || (QT_VERSION < 0x050000 && !defined(Q_OS_MAC)) setupView(false); #endif if (g.s.bMinimalView && ! g.s.qbaMinimalViewGeometry.isNull()) restoreGeometry(g.s.qbaMinimalViewGeometry); else if (! g.s.bMinimalView && ! g.s.qbaMainWindowGeometry.isNull()) restoreGeometry(g.s.qbaMainWindowGeometry); if (g.s.bMinimalView && ! g.s.qbaMinimalViewState.isNull()) restoreState(g.s.qbaMinimalViewState); else if (! g.s.bMinimalView && ! g.s.qbaMainWindowState.isNull()) restoreState(g.s.qbaMainWindowState); setupView(false); qmTray = new QMenu(this); connect(qmTray, SIGNAL(aboutToShow()), this, SLOT(trayAboutToShow())); trayAboutToShow(); qstiIcon->setContextMenu(qmTray); updateTrayIcon(); #ifdef Q_OS_MAC setWindowOpacity(1.0f); #if QT_VERSION < 0x040700 // Process pending events. This is done to force the unified // toolbar to show up as soon as possible (and not wait until // we are back into the Cocoa mainloop) qApp->processEvents(); #endif #endif } void MainWindow::updateWindowTitle() { QString title; if (g.s.bMinimalView) { title = tr("Mumble - Minimal View -- %1"); } else { title = tr("Mumble -- %1"); } setWindowTitle(title.arg(QLatin1String(MUMBLE_RELEASE))); } void MainWindow::updateToolbar() { bool layoutIsCustom = g.s.wlWindowLayout == Settings::LayoutCustom; qtIconToolbar->setMovable(layoutIsCustom && !g.s.bLockLayout); // Update the toolbar so the movable flag takes effect. if (layoutIsCustom) { // Update the toolbar, but keep it in place. addToolBar(toolBarArea(qtIconToolbar), qtIconToolbar); } else { // Update the toolbar, and ensure it is at the top of the window. addToolBar(Qt::TopToolBarArea, qtIconToolbar); } } // Sets whether or not to show the title bars on the MainWindow's // dock widgets. void MainWindow::setShowDockTitleBars(bool doShow) { dtbLogDockTitle->setEnabled(doShow); dtbChatDockTitle->setEnabled(doShow); } MainWindow::~MainWindow() { delete qwPTTButtonWidget; delete qdwLog->titleBarWidget(); delete pmModel; delete qtvUsers; delete Channel::get(0); } void MainWindow::msgBox(QString msg) { MessageBoxEvent *mbe=new MessageBoxEvent(msg); QApplication::postEvent(this, mbe); } #ifdef Q_OS_WIN #if QT_VERSION >= 0x050000 bool MainWindow::nativeEvent(const QByteArray &, void *message, long *) { MSG *msg = reinterpret_cast(message); #else bool MainWindow::winEvent(MSG *msg, long *) { #endif if (msg->message == WM_DEVICECHANGE && msg->wParam == DBT_DEVNODES_CHANGED) uiNewHardware++; return false; } #endif void MainWindow::closeEvent(QCloseEvent *e) { #ifndef Q_OS_MAC ServerHandlerPtr sh = g.sh; if (sh && sh->isRunning() && g.s.bAskOnQuit && !bSuppressAskOnQuit) { QMessageBox mb(QMessageBox::Warning, QLatin1String("Mumble"), tr("Mumble is currently connected to a server. Do you want to Close or Minimize it?"), QMessageBox::NoButton, this); QPushButton *qpbClose = mb.addButton(tr("Close"), QMessageBox::YesRole); QPushButton *qpbMinimize = mb.addButton(tr("Minimize"), QMessageBox::NoRole); QPushButton *qpbCancel = mb.addButton(tr("Cancel"), QMessageBox::RejectRole); mb.setDefaultButton(qpbClose); mb.setEscapeButton(qpbCancel); mb.exec(); if (mb.clickedButton() == qpbMinimize) { showMinimized(); e->ignore(); return; } else if (mb.clickedButton() == qpbCancel) { e->ignore(); return; } } sh.reset(); #endif g.uiSession = 0; g.pPermissions = ChanACL::None; if (g.s.bMinimalView) { g.s.qbaMinimalViewGeometry = saveGeometry(); g.s.qbaMinimalViewState = saveState(); } else { g.s.qbaMainWindowGeometry = saveGeometry(); g.s.qbaMainWindowState = saveState(); g.s.qbaHeaderState = qtvUsers->header()->saveState(); } if (qwPTTButtonWidget) { qwPTTButtonWidget->close(); qwPTTButtonWidget->deleteLater(); qwPTTButtonWidget = NULL; } g.bQuit = true; QMainWindow::closeEvent(e); qApp->exit(restartOnQuit ? MUMBLE_EXIT_CODE_RESTART : 0); } void MainWindow::hideEvent(QHideEvent *e) { if (g.ocIntercept) { QMetaObject::invokeMethod(g.ocIntercept, "hideGui", Qt::QueuedConnection); e->ignore(); return; } #ifndef Q_OS_MAC #ifdef Q_OS_UNIX if (! qApp->activeModalWidget() && ! qApp->activePopupWidget()) #endif if (g.s.bHideInTray && qstiIcon->isSystemTrayAvailable() && e->spontaneous()) QMetaObject::invokeMethod(this, "hide", Qt::QueuedConnection); QMainWindow::hideEvent(e); #endif } void MainWindow::showEvent(QShowEvent *e) { #ifndef Q_OS_MAC #ifdef Q_OS_UNIX if (! qApp->activeModalWidget() && ! qApp->activePopupWidget()) #endif if (g.s.bHideInTray && qstiIcon->isSystemTrayAvailable() && e->spontaneous()) QMetaObject::invokeMethod(this, "show", Qt::QueuedConnection); #endif QMainWindow::showEvent(e); } void MainWindow::changeEvent(QEvent *e) { QWidget::changeEvent(e); #ifdef Q_OS_MAC // On modern macOS/Qt combinations, the code below causes Mumble's // MainWindow to not be interactive after returning from being minimized. // (See issue mumble-voip/mumble#2171) // So, let's not do it on macOS. #else if (isMinimized() && qstiIcon->isSystemTrayAvailable() && g.s.bHideInTray) { // Workaround http://qt-project.org/forums/viewthread/4423/P15/#50676 QTimer::singleShot(0, this, SLOT(hide())); } #endif } void MainWindow::keyPressEvent(QKeyEvent *e) { // Pressing F6 switches between the main // window's main widgets, making it easier // to navigate Mumble's MainWindow with only // a keyboard. if (e->key() == Qt::Key_F6) { focusNextMainWidget(); } else { QMainWindow::keyPressEvent(e); } } /// focusNextMainWidget switches the focus to the next main /// widget of the MainWindow. /// /// This is used to implement behavior where pressing F6 /// switches between major elements of an application. /// This behavior is for example seen in Windows's (File) Explorer. /// /// The main widgets are qteLog (the log view), qteChat (chat input bar) /// and qtvUsers (users tree view). void MainWindow::focusNextMainWidget() { QWidget *mainFocusWidgets[] = { qteLog, qteChat, qtvUsers, }; const int numMainFocusWidgets = sizeof(mainFocusWidgets)/sizeof(mainFocusWidgets[0]); int currentMainFocusWidgetIndex = -1; QWidget *w = focusWidget(); for (int i = 0; i < numMainFocusWidgets; i++) { QWidget *mainFocusWidget = mainFocusWidgets[i]; if (w == mainFocusWidget || w->isAncestorOf(mainFocusWidget)) { currentMainFocusWidgetIndex = i; break; } } Q_ASSERT(currentMainFocusWidgetIndex != -1); int nextMainFocusWidgetIndex = (currentMainFocusWidgetIndex + 1) % numMainFocusWidgets; QWidget *nextMainFocusWidget = mainFocusWidgets[nextMainFocusWidgetIndex]; nextMainFocusWidget->setFocus(); } void MainWindow::updateTrayIcon() { ClientUser *p=ClientUser::get(g.uiSession); if (g.s.bDeaf) { qstiIcon->setIcon(qiIconDeafSelf); } else if (p && p->bDeaf) { qstiIcon->setIcon(qiIconDeafServer); } else if (g.s.bMute) { qstiIcon->setIcon(qiIconMuteSelf); } else if (p && p->bMute) { qstiIcon->setIcon(qiIconMuteServer); } else if (p && p->bSuppress) { qstiIcon->setIcon(qiIconMuteSuppressed); } else if (g.s.bStateInTray && g.bPushToMute) { qstiIcon->setIcon(qiIconMutePushToMute); } else if (p && g.s.bStateInTray) { switch (p->tsState) { case Settings::Talking: qstiIcon->setIcon(qiTalkingOn); break; case Settings::Whispering: qstiIcon->setIcon(qiTalkingWhisper); break; case Settings::Shouting: qstiIcon->setIcon(qiTalkingShout); break; case Settings::Passive: default: qstiIcon->setIcon(qiTalkingOff); break; } } else { qstiIcon->setIcon(qiIcon); } } void MainWindow::updateUserModel() { UserModel *um = static_cast(qtvUsers->model()); um->toggleChannelFiltered(NULL); // Force a UI refresh } void MainWindow::updateTransmitModeComboBox() { switch (g.s.atTransmit) { case Settings::Continuous: qcbTransmitMode->setCurrentIndex(0); return; case Settings::VAD: qcbTransmitMode->setCurrentIndex(1); return; case Settings::PushToTalk: qcbTransmitMode->setCurrentIndex(2); return; } } QMenu *MainWindow::createPopupMenu() { if ((g.s.wlWindowLayout == Settings::LayoutCustom) && !g.s.bLockLayout) { return QMainWindow::createPopupMenu(); } return NULL; } Channel *MainWindow::getContextMenuChannel() { if (cContextChannel) return cContextChannel.data(); return NULL; } ClientUser *MainWindow::getContextMenuUser() { if (cuContextUser) return cuContextUser.data(); return NULL; } bool MainWindow::handleSpecialContextMenu(const QUrl &url, const QPoint &pos_, bool focus) { if (url.scheme() == QString::fromLatin1("clientid")) { bool ok = false; QString maybeUserHash(url.host()); if (maybeUserHash.length() == 40) { ClientUser *cu = pmModel->getUser(maybeUserHash); if (cu) { cuContextUser = cu; ok = true; } } else { QByteArray qbaServerDigest = QByteArray::fromBase64(url.path().remove(0, 1).toLatin1()); cuContextUser = ClientUser::get(url.host().toInt(&ok, 10)); ServerHandlerPtr sh = g.sh; ok = ok && sh && (qbaServerDigest == sh->qbaDigest); } if (ok && cuContextUser) { if (focus) { qtvUsers->setCurrentIndex(pmModel->index(cuContextUser.data())); qteChat->setFocus(); } else { qpContextPosition = QPoint(); qmUser->exec(pos_, NULL); } } cuContextUser.clear(); } else if (url.scheme() == QString::fromLatin1("channelid")) { bool ok; QByteArray qbaServerDigest = QByteArray::fromBase64(url.path().remove(0, 1).toLatin1()); cContextChannel = Channel::get(url.host().toInt(&ok, 10)); ServerHandlerPtr sh = g.sh; ok = ok && sh && (qbaServerDigest == sh->qbaDigest); if (ok) { if (focus) { qtvUsers->setCurrentIndex(pmModel->index(cContextChannel.data())); qteChat->setFocus(); } else { qpContextPosition = QPoint(); qmChannel->exec(pos_, NULL); } } cContextChannel.clear(); } else { return false; } return true; } void MainWindow::on_qtvUsers_customContextMenuRequested(const QPoint &mpos) { QModelIndex idx = qtvUsers->indexAt(mpos); if (! idx.isValid()) idx = qtvUsers->currentIndex(); else qtvUsers->setCurrentIndex(idx); ClientUser *p = pmModel->getUser(idx); qpContextPosition = mpos; if (p) { cuContextUser.clear(); qmUser->exec(qtvUsers->mapToGlobal(mpos), qaUserMute); cuContextUser.clear(); } else { cContextChannel.clear(); qmChannel->exec(qtvUsers->mapToGlobal(mpos), NULL); cContextChannel.clear(); } qpContextPosition = QPoint(); } void MainWindow::on_qteLog_customContextMenuRequested(const QPoint &mpos) { QString link = qteLog->anchorAt(mpos); if (! link.isEmpty()) { QUrl l(link); if (handleSpecialContextMenu(l, qteLog->mapToGlobal(mpos))) return; } QPoint contentPosition = QPoint(QApplication::isRightToLeft() ? (qteLog->horizontalScrollBar()->maximum() - qteLog->horizontalScrollBar()->value()) : qteLog->horizontalScrollBar()->value(), qteLog->verticalScrollBar()->value()); QMenu *menu = qteLog->createStandardContextMenu(mpos + contentPosition); QTextCursor cursor = qteLog->cursorForPosition(mpos); QTextCharFormat fmt = cursor.charFormat(); // Work around imprecise cursor image identification // Apparently, the cursor is shifted half the characters width to the right on the image // element. This is in contrast to hyperlinks for example, which have correct edge detection. // For the image, we get the right half (plus the left half of the next character) for the // image, and have to move the cursor forward to also detect on the left half of the image // (plus the right half of the previous character). // It is unclear why we have to use NextCharacter instead of PreviousCharacter. if (fmt.objectType() == QTextFormat::NoObject) { cursor.movePosition(QTextCursor::NextCharacter); fmt = cursor.charFormat(); } if (cursor.charFormat().isImageFormat()) { menu->addSeparator(); menu->addAction(tr("Save Image As..."), this, SLOT(saveImageAs(void))); qtcSaveImageCursor = cursor; } menu->addSeparator(); menu->addAction(tr("Clear"), qteLog, SLOT(clear(void))); menu->exec(qteLog->mapToGlobal(mpos)); delete menu; } void MainWindow::saveImageAs() { QDateTime now = QDateTime::currentDateTime(); QString defaultFname = QString::fromLatin1("Mumble-%1.jpg").arg(now.toString(QString::fromLatin1("yyyy-MM-dd-HHmmss"))); QString fname = QFileDialog::getSaveFileName(this, tr("Save Image File"), getImagePath(defaultFname), tr("Images (*.png *.jpg *.jpeg)")); if (fname.isNull()) { return; } QString resName = qtcSaveImageCursor.charFormat().toImageFormat().name(); QVariant res = qteLog->document()->resource(QTextDocument::ImageResource, resName); QImage img = res.value(); bool ok = img.save(fname); if (!ok) { // In case fname did not contain a file extension, try saving with an // explicit format. ok = img.save(fname, "PNG"); } updateImagePath(fname); if (!ok) { g.l->log(Log::Warning, tr("Could not save image: %1").arg(Qt::escape(fname))); } } QString MainWindow::getImagePath(QString filename) const { if (g.s.qsImagePath.isEmpty() || ! QDir(g.s.qsImagePath).exists()) { #if QT_VERSION >= 0x050000 g.s.qsImagePath = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation); #else g.s.qsImagePath = QDesktopServices::storageLocation(QDesktopServices::PicturesLocation); #endif } if (filename.isEmpty()) { return g.s.qsImagePath; } return g.s.qsImagePath + QDir::separator() + filename; } void MainWindow::updateImagePath(QString filepath) const { QFileInfo fi(filepath); g.s.qsImagePath = fi.absolutePath(); } static void recreateServerHandler() { ServerHandlerPtr sh = g.sh; if (sh && sh->isRunning()) { g.mw->on_qaServerDisconnect_triggered(); sh->disconnect(); sh->wait(); QCoreApplication::instance()->processEvents(); } g.sh.reset(); while (sh && ! sh.unique()) QThread::yieldCurrentThread(); sh.reset(); sh = ServerHandlerPtr(new ServerHandler()); sh->moveToThread(sh.get()); g.sh = sh; g.mw->connect(sh.get(), SIGNAL(connected()), g.mw, SLOT(serverConnected())); g.mw->connect(sh.get(), SIGNAL(disconnected(QAbstractSocket::SocketError, QString)), g.mw, SLOT(serverDisconnected(QAbstractSocket::SocketError, QString))); g.mw->connect(sh.get(), SIGNAL(error(QAbstractSocket::SocketError, QString)), g.mw, SLOT(resolverError(QAbstractSocket::SocketError, QString))); } void MainWindow::openUrl(const QUrl &url) { g.l->log(Log::Information, tr("Opening URL %1").arg(Qt::escape(url.toString()))); if (url.scheme() == QLatin1String("file")) { QFile f(url.toLocalFile()); if (! f.exists() || ! f.open(QIODevice::ReadOnly)) { g.l->log(Log::Warning, tr("File does not exist")); return; } f.close(); QSettings *qs = new QSettings(f.fileName(), QSettings::IniFormat); qs->setIniCodec("UTF-8"); if (qs->status() != QSettings::NoError) { g.l->log(Log::Warning, tr("File is not a configuration file.")); } else { qSwap(qs, g.qs); g.s.load(); qSwap(qs, g.qs); g.l->log(Log::Warning, tr("Settings merged from file.")); } delete qs; return; } if (url.scheme() != QLatin1String("mumble")) { g.l->log(Log::Warning, tr("URL scheme is not 'mumble'")); return; } int major, minor, patch; int thismajor, thisminor, thispatch; MumbleVersion::get(&thismajor, &thisminor, &thispatch); // With no version parameter given assume the link refers to our version major = 1; minor = 2; patch = 0; #if QT_VERSION >= 0x050000 QUrlQuery query(url); QString version = query.queryItemValue(QLatin1String("version")); #else QString version = url.queryItemValue(QLatin1String("version")); #endif MumbleVersion::get(&major, &minor, &patch, version); if ((major < 1) || // No pre 1.2.0 (major == 1 && minor <= 1) || (major > thismajor) || // No future version (major == thismajor && minor > thisminor) || (major == thismajor && minor == thisminor && patch > thispatch)) { g.l->log(Log::Warning, tr("This version of Mumble can't handle URLs for Mumble version %1.%2.%3").arg(major).arg(minor).arg(patch)); return; } QString host = url.host(); unsigned short port = static_cast(url.port(DEFAULT_MUMBLE_PORT)); QString user = url.userName(); QString pw = url.password(); qsDesiredChannel = url.path(); QString name; #if QT_VERSION >= 0x050000 if (query.hasQueryItem(QLatin1String("title"))) name = query.queryItemValue(QLatin1String("title")); #else if (url.hasQueryItem(QLatin1String("title"))) name = url.queryItemValue(QLatin1String("title")); #endif if (g.sh && g.sh->isRunning()) { QString oHost, oUser, oPw; unsigned short oport; g.sh->getConnectionInfo(oHost, oport, oUser, oPw); ClientUser *p = ClientUser::get(g.uiSession); if ((user.isEmpty() || (p && p->iId >= 0) || (user == oUser)) && (host.isEmpty() || ((host == oHost) && (port == oport)))) { findDesiredChannel(); return; } } g.db->fuzzyMatch(name, user, pw, host, port); if (user.isEmpty()) { bool ok; user = QInputDialog::getText(this, tr("Connecting to %1").arg(url.toString()), tr("Enter username"), QLineEdit::Normal, g.s.qsUsername, &ok); if (! ok || user.isEmpty()) return; g.s.qsUsername = user; } if (name.isEmpty()) name = QString::fromLatin1("%1@%2").arg(user).arg(host); recreateServerHandler(); g.s.qsLastServer = name; rtLast = MumbleProto::Reject_RejectType_None; bRetryServer = true; qaServerDisconnect->setEnabled(true); g.l->log(Log::Information, tr("Connecting to server %1.").arg(Log::msgColor(Qt::escape(host), Log::Server))); g.sh->setConnectionInfo(host, port, user, pw); g.sh->start(QThread::TimeCriticalPriority); } /** * This function tries to join a desired channel on connect. It gets called * directly after server syncronization is completed. * @see void MainWindow::msgServerSync(const MumbleProto::ServerSync &msg) */ void MainWindow::findDesiredChannel() { bool found = false; QStringList qlChans = qsDesiredChannel.split(QLatin1String("/")); Channel *chan = Channel::get(0); QString str = QString(); while (chan && qlChans.count() > 0) { QString elem = qlChans.takeFirst().toLower(); if (elem.isEmpty()) continue; if (str.isNull()) str = elem; else str = str + QLatin1String("/") + elem; foreach(Channel *c, chan->qlChannels) { if (c->qsName.toLower() == str) { str = QString(); found = true; chan = c; break; } } } if (found) { if (chan != ClientUser::get(g.uiSession)->cChannel) { g.sh->joinChannel(g.uiSession, chan->iId); } qtvUsers->setCurrentIndex(pmModel->index(chan)); } else if (g.uiSession) { qtvUsers->setCurrentIndex(pmModel->index(ClientUser::get(g.uiSession)->cChannel)); } updateMenuPermissions(); } void MainWindow::setOnTop(bool top) { Qt::WindowFlags wf = windowFlags(); if (wf.testFlag(Qt::WindowStaysOnTopHint) != top) { if (top) wf |= Qt::WindowStaysOnTopHint; else wf &= ~Qt::WindowStaysOnTopHint; setWindowFlags(wf); show(); } } void MainWindow::setupView(bool toggle_minimize) { bool showit = ! g.s.bMinimalView; switch (g.s.wlWindowLayout) { case Settings::LayoutClassic: removeDockWidget(qdwLog); addDockWidget(Qt::LeftDockWidgetArea, qdwLog); qdwLog->show(); splitDockWidget(qdwLog, qdwChat, Qt::Vertical); qdwChat->show(); break; case Settings::LayoutStacked: removeDockWidget(qdwLog); addDockWidget(Qt::BottomDockWidgetArea, qdwLog); qdwLog->show(); splitDockWidget(qdwLog, qdwChat, Qt::Vertical); qdwChat->show(); break; case Settings::LayoutHybrid: removeDockWidget(qdwLog); removeDockWidget(qdwChat); addDockWidget(Qt::LeftDockWidgetArea, qdwLog); qdwLog->show(); addDockWidget(Qt::BottomDockWidgetArea, qdwChat); qdwChat->show(); break; default: break; } updateToolbar(); qteChat->updateGeometry(); QRect geom = frameGeometry(); if (toggle_minimize) { if (! showit) { g.s.qbaMainWindowGeometry = saveGeometry(); g.s.qbaMainWindowState = saveState(); g.s.qbaHeaderState = qtvUsers->header()->saveState(); } else { g.s.qbaMinimalViewGeometry = saveGeometry(); g.s.qbaMinimalViewState = saveState(); } } Qt::WindowFlags f = Qt::Window; if (!showit) { if (g.s.bHideFrame) { f |= Qt::FramelessWindowHint; } } if (g.s.aotbAlwaysOnTop == Settings::OnTopAlways || (g.s.bMinimalView && g.s.aotbAlwaysOnTop == Settings::OnTopInMinimal) || (!g.s.bMinimalView && g.s.aotbAlwaysOnTop == Settings::OnTopInNormal)) { f |= Qt::WindowStaysOnTopHint; } if (! graphicsProxyWidget()) setWindowFlags(f); if (g.s.bShowContextMenuInMenuBar) { bool found = false; foreach(QAction *a, menuBar()->actions()) { if (a == qmUser->menuAction()) { found = true; break; } } if (!found) { menuBar()->insertMenu(qmConfig->menuAction(), qmUser); menuBar()->insertMenu(qmConfig->menuAction(), qmChannel); } } else { menuBar()->removeAction(qmUser->menuAction()); menuBar()->removeAction(qmChannel->menuAction()); } if (g.s.bEnableDeveloperMenu) { bool found = false; foreach(QAction *a, menuBar()->actions()) { if (a == qmDeveloper->menuAction()) { found = true; break; } } if (!found) { menuBar()->insertMenu(qmHelp->menuAction(), qmDeveloper); } } else { menuBar()->removeAction(qmDeveloper->menuAction()); } if (! showit) { qdwLog->setVisible(showit); qdwChat->setVisible(showit); qtIconToolbar->setVisible(showit); } menuBar()->setVisible(showit); if (toggle_minimize) { if (! showit) { if (! g.s.qbaMinimalViewGeometry.isNull()) restoreGeometry(g.s.qbaMinimalViewGeometry); if (! g.s.qbaMinimalViewState.isNull()) restoreState(g.s.qbaMinimalViewState); } else { if (! g.s.qbaMainWindowGeometry.isNull()) restoreGeometry(g.s.qbaMainWindowGeometry); if (! g.s.qbaMainWindowState.isNull()) restoreState(g.s.qbaMainWindowState); } } else { QRect newgeom = frameGeometry(); resize(geometry().width()-newgeom.width()+geom.width(), geometry().height()-newgeom.height()+geom.height()); move(geom.x(), geom.y()); } // Display the Transmit Mode Dropdown, if configured to do so, otherwise // hide it. if (g.s.bShowTransmitModeComboBox) { qaTransmitMode->setVisible(true); qaTransmitModeSeparator->setVisible(true); } else { qaTransmitMode->setVisible(false); qaTransmitModeSeparator->setVisible(false); } show(); activateWindow(); // If activated show the PTT window if (g.s.bShowPTTButtonWindow && g.s.atTransmit == Settings::PushToTalk) { if (qwPTTButtonWidget) { qwPTTButtonWidget->show(); } else { qwPTTButtonWidget = new PTTButtonWidget(); qwPTTButtonWidget->show(); connect(qwPTTButtonWidget, SIGNAL(triggered(bool,QVariant)), SLOT(on_PushToTalk_triggered(bool,QVariant))); } } else { if (qwPTTButtonWidget) { qwPTTButtonWidget->deleteLater(); qwPTTButtonWidget = NULL; } } } void MainWindow::on_qaServerConnect_triggered(bool autoconnect) { ConnectDialog *cd = new ConnectDialog(this, autoconnect); int res = cd->exec(); if (cd->qsServer.isEmpty() || (cd->usPort==0) || cd->qsUsername.isEmpty()) res = QDialog::Rejected; if (res == QDialog::Accepted) { recreateServerHandler(); qsDesiredChannel = QString(); rtLast = MumbleProto::Reject_RejectType_None; bRetryServer = true; qaServerDisconnect->setEnabled(true); g.l->log(Log::Information, tr("Connecting to server %1.").arg(Log::msgColor(Qt::escape(cd->qsServer), Log::Server))); g.sh->setConnectionInfo(cd->qsServer, cd->usPort, cd->qsUsername, cd->qsPassword); g.sh->start(QThread::TimeCriticalPriority); } delete cd; } void MainWindow::on_Reconnect_timeout() { if (g.sh->isRunning()) return; g.l->log(Log::Information, tr("Reconnecting.")); g.sh->start(QThread::TimeCriticalPriority); } void MainWindow::on_qmSelf_aboutToShow() { ClientUser *user = ClientUser::get(g.uiSession); qaServerTexture->setEnabled(user != NULL); qaSelfComment->setEnabled(user != NULL); qaServerTextureRemove->setEnabled(user && ! user->qbaTextureHash.isEmpty()); qaSelfRegister->setEnabled(user && (user->iId < 0) && ! user->qsHash.isEmpty() && (g.pPermissions & (ChanACL::SelfRegister | ChanACL::Write))); if (g.sh && g.sh->uiVersion >= 0x010203) { qaSelfPrioritySpeaker->setEnabled(user && g.pPermissions & (ChanACL::Write | ChanACL::MuteDeafen)); qaSelfPrioritySpeaker->setChecked(user && user->bPrioritySpeaker); } else { qaSelfPrioritySpeaker->setEnabled(false); qaSelfPrioritySpeaker->setChecked(false); } } void MainWindow::on_qaSelfComment_triggered() { ClientUser *p = ClientUser::get(g.uiSession); if (!p) return; if (! p->qbaCommentHash.isEmpty() && p->qsComment.isEmpty()) { p->qsComment = QString::fromUtf8(g.db->blob(p->qbaCommentHash)); if (p->qsComment.isEmpty()) { pmModel->uiSessionComment = ~(p->uiSession); MumbleProto::RequestBlob mprb; mprb.add_session_comment(p->uiSession); g.sh->sendMessage(mprb); return; } } unsigned int session = p->uiSession; ::TextMessage *texm = new ::TextMessage(this, tr("Change your comment")); texm->rteMessage->setText(p->qsComment); int res = texm->exec(); p = ClientUser::get(session); if (p && (res == QDialog::Accepted)) { const QString &msg = texm->message(); MumbleProto::UserState mpus; mpus.set_session(session); mpus.set_comment(u8(msg)); g.sh->sendMessage(mpus); if (! msg.isEmpty()) g.db->setBlob(sha1(msg), msg.toUtf8()); } delete texm; } void MainWindow::on_qaSelfRegister_triggered() { ClientUser *p = ClientUser::get(g.uiSession); if (!p) return; QMessageBox::StandardButton result; result = QMessageBox::question(this, tr("Register yourself as %1").arg(p->qsName), tr("

You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.

Are you sure you want to register yourself?

").arg(Qt::escape(p->qsName)), QMessageBox::Yes|QMessageBox::No); if (result == QMessageBox::Yes) g.sh->registerUser(p->uiSession); } void MainWindow::qcbTransmitMode_activated(int index) { switch (index) { case 0: // Continuous g.s.atTransmit = Settings::Continuous; g.l->log(Log::Information, tr("Transmit Mode set to Continuous")); return; case 1: // Voice Activity g.s.atTransmit = Settings::VAD; g.l->log(Log::Information, tr("Transmit Mode set to Voice Activity")); return; case 2: // Push-to-Talk g.s.atTransmit = Settings::PushToTalk; g.l->log(Log::Information, tr("Transmit Mode set to Push-to-Talk")); return; } } void MainWindow::on_qmServer_aboutToShow() { qmServer->clear(); qmServer->addAction(qaServerConnect); qmServer->addSeparator(); qmServer->addAction(qaServerDisconnect); qmServer->addAction(qaServerInformation); qmServer->addAction(qaServerTokens); qmServer->addAction(qaServerUserList); qmServer->addAction(qaServerBanList); qmServer->addSeparator(); #if !defined(Q_OS_MAC) // Don't add qaHide on macOS. // There is no way to bring the window back (no 'tray' for Mumble on macOS), // and the system has built-in hide functionality via Cmd-H. if (qstiIcon->isSystemTrayAvailable()) qmServer->addAction(qaHide); #endif qmServer->addAction(qaQuit); qaServerBanList->setEnabled(g.pPermissions & (ChanACL::Ban | ChanACL::Write)); qaServerUserList->setEnabled(g.pPermissions & (ChanACL::Register | ChanACL::Write)); qaServerInformation->setEnabled(g.uiSession != 0); qaServerTokens->setEnabled(g.uiSession != 0); if (! qlServerActions.isEmpty()) { qmServer->addSeparator(); foreach(QAction *a, qlServerActions) qmServer->addAction(a); } } void MainWindow::on_qaServerDisconnect_triggered() { if (qtReconnect->isActive()) { qtReconnect->stop(); qaServerDisconnect->setEnabled(false); } if (g.sh && g.sh->isRunning()) g.sh->disconnect(); } void MainWindow::on_qaServerBanList_triggered() { g.sh->requestBanList(); if (banEdit) { banEdit->reject(); delete banEdit; banEdit = NULL; } } void MainWindow::on_qaServerUserList_triggered() { g.sh->requestUserList(); if (userEdit) { userEdit->reject(); delete userEdit; userEdit = NULL; } } static const QString currentCodec() { if (g.bOpus) return QLatin1String("Opus"); int v = g.bPreferAlpha ? g.iCodecAlpha : g.iCodecBeta; CELTCodec* cc = g.qmCodecs.value(v); if (cc) return QString::fromLatin1("CELT %1").arg(cc->version()); else return QString::fromLatin1("CELT %1").arg(QString::number(v, 16)); } void MainWindow::on_qaServerInformation_triggered() { ConnectionPtr c = g.sh->cConnection; if (! c) return; CryptState &cs = c->csCrypt; QSslCipher qsc = g.sh->qscCipher; QString qsVersion=tr("

Version

Protocol %1

").arg(MumbleVersion::toString(g.sh->uiVersion)); if (g.sh->qsRelease.isEmpty() || g.sh->qsOS.isEmpty() || g.sh->qsOSVersion.isEmpty()) { qsVersion.append(tr("

No build information or OS version available

")); } else { qsVersion.append(tr("

%1 (%2)
%3

") .arg(Qt::escape(g.sh->qsRelease), Qt::escape(g.sh->qsOS), Qt::escape(g.sh->qsOSVersion))); } QString host, uname, pw; unsigned short port; g.sh->getConnectionInfo(host,port,uname,pw); const SSLCipherInfo *ci = SSLCipherInfoLookupByOpenSSLName(qsc.name().toLatin1().constData()); QString cipherDescription; if (ci && ci->message_authentication && ci->encryption && ci->key_exchange_verbose && ci->rfc_name) { if (QString::fromLatin1(ci->message_authentication) == QLatin1String("AEAD")) { // Authenticated Encryption with Associated Data // See https://en.wikipedia.org/wiki/Authenticated_encryption cipherDescription = tr( "The connection is encrypted and authenticated " "using %1 and uses %2 as the key exchange mechanism (%3)").arg( QString::fromLatin1(ci->encryption), QString::fromLatin1(ci->key_exchange_verbose), QString::fromLatin1(ci->rfc_name)); } else { cipherDescription = tr( "The connection is encrypted using %1, with %2 " "for message authentication and %3 as the key " "exchange mechanism (%4)").arg( QString::fromLatin1(ci->encryption), QString::fromLatin1(ci->message_authentication), QString::fromLatin1(ci->key_exchange_verbose), QString::fromLatin1(ci->rfc_name)); } } if (cipherDescription.isEmpty()) { cipherDescription = tr("The connection is secured by the cipher suite that OpenSSL identifies as %1").arg(qsc.name()); } QString cipherPFSInfo; if (ci) { if (ci->forward_secret) { cipherPFSInfo = tr("

The connection provides perfect forward secrecy

"); } else { cipherPFSInfo = tr("

The connection does not provide perfect forward secrecy

"); } } QString qsControl = tr( "

Control channel

" "

The connection uses %1

" "%2" "%3" "

%4 ms average latency (%5 deviation)

" "

Remote host %6 (port %7)

").arg( Qt::escape(c->sessionProtocolString()), cipherDescription, cipherPFSInfo, QString::fromLatin1("%1").arg(boost::accumulators::mean(g.sh->accTCP), 0, 'f', 2), QString::fromLatin1("%1").arg(sqrt(boost::accumulators::variance(g.sh->accTCP)),0,'f',2), Qt::escape(host), QString::number(port)); if (g.uiMaxUsers) { qsControl += tr("

Connected users: %1/%2

").arg(ModelItem::c_qhUsers.count()).arg(g.uiMaxUsers); } QString qsVoice, qsCrypt, qsAudio; if (NetworkConfig::TcpModeEnabled()) { qsVoice = tr("Voice channel is sent over control channel"); } else { qsVoice = tr("

Voice channel

Encrypted with 128 bit OCB-AES128
%1 ms average latency (%4 deviation)

").arg(boost::accumulators::mean(g.sh->accUDP), 0, 'f', 2).arg(sqrt(boost::accumulators::variance(g.sh->accUDP)),0,'f',2); qsCrypt = QString::fromLatin1("

%1

" "" "" "" "" "
%2%3
%4%8%12
%5%9%13
%6%10%14
%7%11%15
") .arg(tr("UDP Statistics")).arg(tr("To Server")).arg(tr("From Server")).arg(tr("Good")).arg(tr("Late")).arg(tr("Lost")).arg(tr("Resync")) .arg(cs.uiRemoteGood).arg(cs.uiRemoteLate).arg(cs.uiRemoteLost).arg(cs.uiRemoteResync) .arg(cs.uiGood).arg(cs.uiLate).arg(cs.uiLost).arg(cs.uiResync); } qsAudio=tr("

Audio bandwidth

Maximum %1 kbit/s
Current %2 kbit/s
Codec: %3

").arg(g.iMaxBandwidth / 1000.0,0,'f',1).arg(g.iAudioBandwidth / 1000.0,0,'f',1).arg(currentCodec()); QMessageBox qmb(QMessageBox::Information, tr("Mumble Server Information"), qsVersion + qsControl + qsVoice + qsCrypt + qsAudio, QMessageBox::Ok, this); qmb.setDefaultButton(QMessageBox::Ok); qmb.setEscapeButton(QMessageBox::Ok); QPushButton *qp = qmb.addButton(tr("&View Certificate"), QMessageBox::ActionRole); int res = qmb.exec(); if ((res == 0) && (qmb.clickedButton() == qp)) { ViewCert vc(g.sh->qscCert, this); vc.exec(); } } void MainWindow::on_qaServerTexture_triggered() { QPair choice = openImageFile(); if (choice.first.isEmpty()) return; const QImage &img = choice.second; if ((img.height() <= 1024) && (img.width() <= 1024)) g.sh->setUserTexture(g.uiSession, choice.first); } void MainWindow::on_qaServerTextureRemove_triggered() { g.sh->setUserTexture(g.uiSession, QByteArray()); } void MainWindow::on_qaServerTokens_triggered() { if (tokenEdit) { tokenEdit->reject(); delete tokenEdit; tokenEdit = NULL; } tokenEdit = new Tokens(this); tokenEdit->show(); } void MainWindow::voiceRecorderDialog_finished(int) { voiceRecorderDialog->deleteLater(); voiceRecorderDialog = NULL; } void MainWindow::qmUser_aboutToShow() { ClientUser *p = NULL; if (g.uiSession != 0) { QModelIndex idx; if (! qpContextPosition.isNull()) idx = qtvUsers->indexAt(qpContextPosition); if (! idx.isValid()) idx = qtvUsers->currentIndex(); p = pmModel->getUser(idx); if (cuContextUser) p = cuContextUser.data(); } cuContextUser = p; qpContextPosition = QPoint(); bool self = p && (p->uiSession == g.uiSession); qmUser->clear(); if (g.pPermissions & (ChanACL::Kick | ChanACL::Ban | ChanACL::Write)) qmUser->addAction(qaUserKick); if (g.pPermissions & (ChanACL::Ban | ChanACL::Write)) qmUser->addAction(qaUserBan); qmUser->addAction(qaUserMute); qmUser->addAction(qaUserDeaf); if (g.sh && g.sh->uiVersion >= 0x010203) qmUser->addAction(qaUserPrioritySpeaker); qmUser->addAction(qaUserLocalMute); qmUser->addAction(qaUserLocalIgnore); qmUser->addAction(qaUserLocalVolume); if (self) qmUser->addAction(qaSelfComment); else { qmUser->addAction(qaUserCommentView); qmUser->addAction(qaUserCommentReset); qmUser->addAction(qaUserTextureReset); } qmUser->addAction(qaUserTextMessage); if (g.sh && g.sh->uiVersion >= 0x010202) qmUser->addAction(qaUserInformation); if (p && (p->iId < 0) && ! p->qsHash.isEmpty() && (g.pPermissions & ((self ? ChanACL::SelfRegister : ChanACL::Register) | ChanACL::Write))) { qmUser->addSeparator(); qmUser->addAction(qaUserRegister); } if (p && ! p->qsHash.isEmpty() && (!p->qsFriendName.isEmpty() || (p->uiSession != g.uiSession))) { qmUser->addSeparator(); if (p->qsFriendName.isEmpty()) qmUser->addAction(qaUserFriendAdd); else { if (p->qsFriendName != p->qsName) qmUser->addAction(qaUserFriendUpdate); qmUser->addAction(qaUserFriendRemove); } } if (self) { qmUser->addSeparator(); qmUser->addAction(qaAudioMute); qmUser->addAction(qaAudioDeaf); } #ifndef Q_OS_MAC if (g.s.bMinimalView) { qmUser->addSeparator(); qmUser->addMenu(qmServer); qmUser->addMenu(qmSelf); qmUser->addMenu(qmConfig); qmUser->addMenu(qmHelp); } #endif if (! qlUserActions.isEmpty()) { qmUser->addSeparator(); foreach(QAction *a, qlUserActions) qmUser->addAction(a); } if (! p) { qaUserKick->setEnabled(false); qaUserBan->setEnabled(false); qaUserTextMessage->setEnabled(false); qaUserLocalMute->setEnabled(false); qaUserLocalVolume->setEnabled(false); qaUserLocalIgnore->setEnabled(false); qaUserCommentReset->setEnabled(false); qaUserTextureReset->setEnabled(false); qaUserCommentView->setEnabled(false); } else { qaUserKick->setEnabled(! self); qaUserBan->setEnabled(! self); qaUserTextMessage->setEnabled(true); qaUserLocalMute->setEnabled(! self); qaUserLocalVolume->setEnabled(! self); qaUserLocalIgnore->setEnabled(! self); qaUserCommentReset->setEnabled(! p->qbaCommentHash.isEmpty() && (g.pPermissions & (ChanACL::Move | ChanACL::Write))); qaUserTextureReset->setEnabled(! p->qbaTextureHash.isEmpty() && (g.pPermissions & (ChanACL::Move | ChanACL::Write))); qaUserCommentView->setEnabled(! p->qbaCommentHash.isEmpty()); qaUserMute->setChecked(p->bMute || p->bSuppress); qaUserDeaf->setChecked(p->bDeaf); qaUserPrioritySpeaker->setChecked(p->bPrioritySpeaker); qaUserLocalMute->setChecked(p->bLocalMute); qaUserLocalIgnore->setChecked(p->bLocalIgnore); } updateMenuPermissions(); } void MainWindow::on_qaUserMute_triggered() { ClientUser *p = getContextMenuUser(); if (!p) return; MumbleProto::UserState mpus; mpus.set_session(p->uiSession); if (p->bMute || p->bSuppress) { if (p->bMute) mpus.set_mute(false); if (p->bSuppress) mpus.set_suppress(false); } else { mpus.set_mute(true); } g.sh->sendMessage(mpus); } void MainWindow::on_qaUserLocalMute_triggered() { ClientUser *p = getContextMenuUser(); if (!p) return; bool muted = qaUserLocalMute->isChecked(); p->setLocalMute(muted); if (! p->qsHash.isEmpty()) g.db->setLocalMuted(p->qsHash, muted); } void MainWindow::on_qaUserLocalIgnore_triggered() { ClientUser *p = getContextMenuUser(); if (!p) return; bool ignored = qaUserLocalIgnore->isChecked(); p->setLocalIgnore(ignored); if (! p->qsHash.isEmpty()) g.db->setLocalIgnored(p->qsHash, ignored); } void MainWindow::on_qaUserLocalVolume_triggered() { ClientUser *p = getContextMenuUser(); if (!p) { return; } openUserLocalVolumeDialog(p); } void MainWindow::openUserLocalVolumeDialog(ClientUser *p) { unsigned int session = p->uiSession; UserLocalVolumeDialog::present(session, &qmUserVolTracker); } void MainWindow::on_qaUserDeaf_triggered() { ClientUser *p = getContextMenuUser(); if (!p) return; MumbleProto::UserState mpus; mpus.set_session(p->uiSession); mpus.set_deaf(! p->bDeaf); g.sh->sendMessage(mpus); } void MainWindow::on_qaSelfPrioritySpeaker_triggered() { ClientUser *p = ClientUser::get(g.uiSession); if (!p) return; MumbleProto::UserState mpus; mpus.set_session(p->uiSession); mpus.set_priority_speaker(! p->bPrioritySpeaker); g.sh->sendMessage(mpus); } void MainWindow::on_qaUserPrioritySpeaker_triggered() { ClientUser *p = getContextMenuUser(); if (!p) return; MumbleProto::UserState mpus; mpus.set_session(p->uiSession); mpus.set_priority_speaker(! p->bPrioritySpeaker); g.sh->sendMessage(mpus); } void MainWindow::on_qaUserRegister_triggered() { ClientUser *p = getContextMenuUser(); if (!p) return; unsigned int session = p->uiSession; QMessageBox::StandardButton result; if (session == g.uiSession) result = QMessageBox::question(this, tr("Register yourself as %1").arg(p->qsName), tr("

You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.

Are you sure you want to register yourself?

").arg(Qt::escape(p->qsName)), QMessageBox::Yes|QMessageBox::No); else result = QMessageBox::question(this, tr("Register user %1").arg(p->qsName), tr("

You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.

From this point on, %1 will be authenticated with the certificate currently in use.

Are you sure you want to register %1?

").arg(Qt::escape(p->qsName)), QMessageBox::Yes|QMessageBox::No); if (result == QMessageBox::Yes) { p = ClientUser::get(session); if (! p) return; g.sh->registerUser(p->uiSession); } } void MainWindow::on_qaUserFriendAdd_triggered() { ClientUser *p = getContextMenuUser(); if (!p) return; g.db->addFriend(p->qsName, p->qsHash); pmModel->setFriendName(p, p->qsName); } void MainWindow::on_qaUserFriendUpdate_triggered() { on_qaUserFriendAdd_triggered(); } void MainWindow::on_qaUserFriendRemove_triggered() { ClientUser *p = getContextMenuUser(); if (!p) return; g.db->removeFriend(p->qsHash); pmModel->setFriendName(p, QString()); } void MainWindow::on_qaUserKick_triggered() { ClientUser *p = getContextMenuUser(); if (!p) return; unsigned int session = p->uiSession; bool ok; QString reason = QInputDialog::getText(this, tr("Kicking user %1").arg(p->qsName), tr("Enter reason"), QLineEdit::Normal, QString(), &ok); p = ClientUser::get(session); if (!p) return; if (ok) { g.sh->kickBanUser(p->uiSession, reason, false); } } void MainWindow::on_qaUserBan_triggered() { ClientUser *p = getContextMenuUser(); if (!p) return; unsigned int session = p->uiSession; bool ok; QString reason = QInputDialog::getText(this, tr("Banning user %1").arg(p->qsName), tr("Enter reason"), QLineEdit::Normal, QString(), &ok); p = ClientUser::get(session); if (!p) return; if (ok) { g.sh->kickBanUser(p->uiSession, reason, true); } } void MainWindow::on_qaUserTextMessage_triggered() { ClientUser *p = getContextMenuUser(); if (!p) return; openTextMessageDialog(p); } void MainWindow::openTextMessageDialog(ClientUser *p) { unsigned int session = p->uiSession; ::TextMessage *texm = new ::TextMessage(this, tr("Sending message to %1").arg(p->qsName)); int res = texm->exec(); // Try to get find the user using the session id. // This will return NULL if the user disconnected while typing the message. p = ClientUser::get(session); if (p && (res == QDialog::Accepted)) { QString msg = texm->message(); if (! msg.isEmpty()) { g.sh->sendUserTextMessage(p->uiSession, msg); g.l->log(Log::TextMessage, tr("To %1: %2").arg(Log::formatClientUser(p, Log::Target), texm->message()), tr("Message to %1").arg(p->qsName), true); } } delete texm; } void MainWindow::on_qaUserCommentView_triggered() { ClientUser *p = getContextMenuUser(); // This has to be done here because UserModel could've set it. cuContextUser.clear(); if (!p) return; if (! p->qbaCommentHash.isEmpty() && p->qsComment.isEmpty()) { p->qsComment = QString::fromUtf8(g.db->blob(p->qbaCommentHash)); if (p->qsComment.isEmpty()) { pmModel->uiSessionComment = ~(p->uiSession); MumbleProto::RequestBlob mprb; mprb.add_session_comment(p->uiSession); g.sh->sendMessage(mprb); return; } } pmModel->seenComment(pmModel->index(p)); ::TextMessage *texm = new ::TextMessage(this, tr("View comment on user %1").arg(p->qsName)); texm->rteMessage->setText(p->qsComment, true); texm->setAttribute(Qt::WA_DeleteOnClose, true); texm->show(); } void MainWindow::on_qaUserCommentReset_triggered() { ClientUser *p = getContextMenuUser(); if (!p) return; unsigned int session = p->uiSession; int ret = QMessageBox::question(this, QLatin1String("Mumble"), tr("Are you sure you want to reset the comment of user %1?").arg(Qt::escape(p->qsName)), QMessageBox::Yes, QMessageBox::No); if (ret == QMessageBox::Yes) { g.sh->setUserComment(session, QString()); } } void MainWindow::on_qaUserTextureReset_triggered() { ClientUser *p = getContextMenuUser(); if (!p) return; unsigned int session = p->uiSession; int ret = QMessageBox::question(this, QLatin1String("Mumble"), tr("Are you sure you want to reset the avatar of user %1?").arg(Qt::escape(p->qsName)), QMessageBox::Yes, QMessageBox::No); if (ret == QMessageBox::Yes) { g.sh->setUserTexture(session, QByteArray()); } } void MainWindow::on_qaUserInformation_triggered() { ClientUser *p = getContextMenuUser(); if (!p) return; g.sh->requestUserStats(p->uiSession, false); } void MainWindow::on_qaHide_triggered() { hide(); } void MainWindow::on_qaQuit_triggered() { bSuppressAskOnQuit = true; this->close(); } void MainWindow::sendChatbarMessage(QString qsText) { if (g.uiSession == 0) return; // Check if text & connection is available ClientUser *p = pmModel->getUser(qtvUsers->currentIndex()); Channel *c = pmModel->getChannel(qtvUsers->currentIndex()); #if QT_VERSION >= 0x050000 qsText = qsText.toHtmlEscaped(); #else qsText = Qt::escape(qsText); #endif qsText = TextMessage::autoFormat(qsText); if (!g.s.bChatBarUseSelection || p == NULL || p->uiSession == g.uiSession) { // Channel message if (!g.s.bChatBarUseSelection || c == NULL) // If no channel selected fallback to current one c = ClientUser::get(g.uiSession)->cChannel; g.sh->sendChannelTextMessage(c->iId, qsText, false); g.l->log(Log::TextMessage, tr("To %1: %2").arg(Log::formatChannel(c), qsText), tr("Message to channel %1").arg(c->qsName), true); } else { // User message g.sh->sendUserTextMessage(p->uiSession, qsText); g.l->log(Log::TextMessage, tr("To %1: %2").arg(Log::formatClientUser(p, Log::Target), qsText), tr("Message to %1").arg(p->qsName), true); } qteChat->clear(); } /** * Controlls tab username completion for the chatbar. * @see ChatbarLineEdit::completeAtCursor() */ void MainWindow::on_qteChat_tabPressed() { qteChat->completeAtCursor(); } /// Handles Backtab/Shift-Tab for qteChat, which allows /// users to move focus to the previous widget in /// MainWindow. void MainWindow::on_qteChat_backtabPressed() { focusPreviousChild(); } /** * Controlls ctrl space username completion and selection for the chatbar. * @see ChatbarLineEdit::completeAtCursor() */ void MainWindow::on_qteChat_ctrlSpacePressed() { unsigned int res = qteChat->completeAtCursor(); if (res == 0) return; qtvUsers->setCurrentIndex(pmModel->index(ClientUser::get(res))); } void MainWindow::on_qmConfig_aboutToShow() { // Don't remove the config, as that messes up OSX. foreach(QAction *a, qmConfig->actions()) if (a != qaConfigDialog) qmConfig->removeAction(a); qmConfig->addAction(qaAudioWizard); qmConfig->addAction(qaConfigCert); qmConfig->addSeparator(); qmConfig->addAction(qaAudioTTS); qmConfig->addSeparator(); qmConfig->addAction(qaConfigMinimal); if (g.s.bMinimalView) qmConfig->addAction(qaConfigHideFrame); } void MainWindow::qmChannel_aboutToShow() { qmChannel->clear(); Channel *c = NULL; if (g.uiSession != 0) { QModelIndex idx; if (! qpContextPosition.isNull()) idx = qtvUsers->indexAt(qpContextPosition); if (! idx.isValid()) idx = qtvUsers->currentIndex(); c = pmModel->getChannel(idx); if (cContextChannel) c = cContextChannel.data(); } cContextChannel = c; qpContextPosition = QPoint(); if (c && c->iId != ClientUser::get(g.uiSession)->cChannel->iId) { qmChannel->addAction(qaChannelJoin); qmChannel->addSeparator(); } qmChannel->addAction(qaChannelAdd); qmChannel->addAction(qaChannelACL); qmChannel->addAction(qaChannelRemove); qmChannel->addSeparator(); qmChannel->addAction(qaChannelLink); qmChannel->addAction(qaChannelUnlink); qmChannel->addAction(qaChannelUnlinkAll); qmChannel->addSeparator(); qmChannel->addAction(qaChannelCopyURL); qmChannel->addAction(qaChannelSendMessage); // hiding the root is nonsense if(c && c->cParent) { qmChannel->addSeparator(); qmChannel->addAction(qaChannelFilter); } #ifndef Q_OS_MAC if (g.s.bMinimalView) { qmChannel->addSeparator(); qmChannel->addMenu(qmServer); qmChannel->addMenu(qmSelf); qmChannel->addMenu(qmConfig); qmChannel->addMenu(qmHelp); } #endif if (! qlChannelActions.isEmpty()) { qmChannel->addSeparator(); foreach(QAction *a, qlChannelActions) qmChannel->addAction(a); } bool add, remove, acl, link, unlink, unlinkall, msg; add = remove = acl = link = unlink = unlinkall = msg = false; if (g.uiSession != 0) { add = true; acl = true; msg = true; Channel *home = ClientUser::get(g.uiSession)->cChannel; if (c && c->iId != 0) { remove = true; } if (! c) c = Channel::get(0); unlinkall = (home->qhLinks.count() > 0); if (home != c) { if (c->allLinks().contains(home)) unlink = true; else link = true; } } if(c) qaChannelFilter->setChecked(c->bFiltered); qaChannelAdd->setEnabled(add); qaChannelRemove->setEnabled(remove); qaChannelACL->setEnabled(acl); qaChannelLink->setEnabled(link); qaChannelUnlink->setEnabled(unlink); qaChannelUnlinkAll->setEnabled(unlinkall); qaChannelSendMessage->setEnabled(msg); updateMenuPermissions(); } void MainWindow::on_qaChannelJoin_triggered() { Channel *c = getContextMenuChannel(); if (c) { g.sh->joinChannel(g.uiSession, c->iId); } } void MainWindow::on_qaChannelFilter_triggered() { Channel *c = getContextMenuChannel(); if (c) { UserModel *um = static_cast(qtvUsers->model()); um->toggleChannelFiltered(c); } } void MainWindow::on_qaChannelAdd_triggered() { Channel *c = getContextMenuChannel(); if (aclEdit) { aclEdit->reject(); delete aclEdit; aclEdit = NULL; } aclEdit = new ACLEditor(c ? c->iId : 0, this); if (c && (c->uiPermissions & ChanACL::Cached) && !(c->uiPermissions & (ChanACL::Write | ChanACL::MakeChannel))) { aclEdit->qcbChannelTemporary->setEnabled(false); aclEdit->qcbChannelTemporary->setChecked(true); } aclEdit->show(); } void MainWindow::on_qaChannelRemove_triggered() { int ret; Channel *c = getContextMenuChannel(); if (! c) return; int id = c->iId; ret=QMessageBox::question(this, QLatin1String("Mumble"), tr("Are you sure you want to delete %1 and all its sub-channels?").arg(Qt::escape(c->qsName)), QMessageBox::Yes, QMessageBox::No); c = Channel::get(id); if (!c) return; if (ret == QMessageBox::Yes) { g.sh->removeChannel(c->iId); } } void MainWindow::on_qaChannelACL_triggered() { Channel *c = getContextMenuChannel(); if (! c) c = Channel::get(0); int id = c->iId; if (! c->qbaDescHash.isEmpty() && c->qsDesc.isEmpty()) { c->qsDesc = QString::fromUtf8(g.db->blob(c->qbaDescHash)); if (c->qsDesc.isEmpty()) { MumbleProto::RequestBlob mprb; mprb.add_channel_description(id); g.sh->sendMessage(mprb); } } g.sh->requestACL(id); if (aclEdit) { aclEdit->reject(); delete aclEdit; aclEdit = NULL; } } void MainWindow::on_qaChannelLink_triggered() { Channel *c = ClientUser::get(g.uiSession)->cChannel; Channel *l = getContextMenuChannel(); if (! l) l = Channel::get(0); g.sh->addChannelLink(c->iId, l->iId); } void MainWindow::on_qaChannelUnlink_triggered() { Channel *c = ClientUser::get(g.uiSession)->cChannel; Channel *l = getContextMenuChannel(); if (! l) l = Channel::get(0); g.sh->removeChannelLink(c->iId, l->iId); } void MainWindow::on_qaChannelUnlinkAll_triggered() { Channel *c = ClientUser::get(g.uiSession)->cChannel; MumbleProto::ChannelState mpcs; mpcs.set_channel_id(c->iId); foreach(Channel *l, c->qsPermLinks) mpcs.add_links_remove(l->iId); g.sh->sendMessage(mpcs); } void MainWindow::on_qaChannelSendMessage_triggered() { Channel *c = getContextMenuChannel(); if (!c) return; int id = c->iId; ::TextMessage *texm = new ::TextMessage(this, tr("Sending message to channel %1").arg(c->qsName), true); int res = texm->exec(); c = Channel::get(id); if (c && (res==QDialog::Accepted)) { g.sh->sendChannelTextMessage(id, texm->message(), texm->bTreeMessage); if (texm->bTreeMessage) g.l->log(Log::TextMessage, tr("To %1 (Tree): %2").arg(Log::formatChannel(c), texm->message()), tr("Message to tree %1").arg(c->qsName), true); else g.l->log(Log::TextMessage, tr("To %1: %2").arg(Log::formatChannel(c), texm->message()), tr("Message to channel %1").arg(c->qsName), true); } delete texm; } void MainWindow::on_qaChannelCopyURL_triggered() { Channel *c = getContextMenuChannel(); QString host, uname, pw, channel; unsigned short port; if (!c) return; g.sh->getConnectionInfo(host, port, uname, pw); // walk back up the channel list to build the URL. while (c->cParent != NULL) { channel.prepend(c->qsName); channel.prepend(QLatin1String("/")); c = c->cParent; } QApplication::clipboard()->setMimeData(ServerItem::toMimeData(c->qsName, host, port, channel), QClipboard::Clipboard); } /** * This function updates the UI according to the permission of the user in the current channel. * If possible the permissions are fetched from a cache. Otherwise they are requested by the server * via a PermissionQuery call (whose reply updates the cache and calls this function again). * @see MainWindow::msgPermissionQuery(const MumbleProto::PermissionQuery &msg) */ void MainWindow::updateMenuPermissions() { ClientUser *cu = NULL; Channel *c = NULL; if (g.uiSession) { cu = getContextMenuUser(); if (!cu) cu = pmModel->getUser(qtvUsers->currentIndex()); c = cu ? cu->cChannel : getContextMenuChannel(); if (!c) c = pmModel->getChannel(qtvUsers->currentIndex()); } ChanACL::Permissions p = c ? static_cast(c->uiPermissions) : ChanACL::None; if (c && ! p) { g.sh->requestChannelPermissions(c->iId); if (c->iId == 0) p = g.pPermissions; else p = ChanACL::All; c->uiPermissions = p; } Channel *cparent = c ? c->cParent : NULL; ChanACL::Permissions pparent = cparent ? static_cast(cparent->uiPermissions) : ChanACL::None; if (cparent && ! pparent) { g.sh->requestChannelPermissions(cparent->iId); if (cparent->iId == 0) pparent = g.pPermissions; else pparent = ChanACL::All; cparent->uiPermissions = pparent; } ClientUser *user = g.uiSession ? ClientUser::get(g.uiSession) : NULL; Channel *homec = user ? user->cChannel : NULL; ChanACL::Permissions homep = homec ? static_cast(homec->uiPermissions) : ChanACL::None; if (homec && ! homep) { g.sh->requestChannelPermissions(homec->iId); if (homec->iId == 0) homep = g.pPermissions; else homep = ChanACL::All; homec->uiPermissions = homep; } if (cu) { qaUserMute->setEnabled(p & (ChanACL::Write | ChanACL::MuteDeafen) && ((cu != user) || cu->bMute || cu->bSuppress)); qaUserDeaf->setEnabled(p & (ChanACL::Write | ChanACL::MuteDeafen) && ((cu != user) || cu->bDeaf)); qaUserPrioritySpeaker->setEnabled(p & (ChanACL::Write | ChanACL::MuteDeafen)); qaUserTextMessage->setEnabled(p & (ChanACL::Write | ChanACL::TextMessage)); qaUserInformation->setEnabled((g.pPermissions & (ChanACL::Write | ChanACL::Register)) || (p & (ChanACL::Write | ChanACL::Enter)) || (cu == user)); } else { qaUserMute->setEnabled(false); qaUserDeaf->setEnabled(false); qaUserPrioritySpeaker->setEnabled(false); qaUserTextMessage->setEnabled(false); qaUserInformation->setEnabled(false); } qaChannelJoin->setEnabled(p & (ChanACL::Write | ChanACL::Enter)); qaChannelAdd->setEnabled(p & (ChanACL::Write | ChanACL::MakeChannel | ChanACL::MakeTempChannel)); qaChannelRemove->setEnabled(p & ChanACL::Write); qaChannelACL->setEnabled((p & ChanACL::Write) || (pparent & ChanACL::Write)); qaChannelLink->setEnabled((p & (ChanACL::Write | ChanACL::LinkChannel)) && (homep & (ChanACL::Write | ChanACL::LinkChannel))); qaChannelUnlink->setEnabled((p & (ChanACL::Write | ChanACL::LinkChannel)) || (homep & (ChanACL::Write | ChanACL::LinkChannel))); qaChannelUnlinkAll->setEnabled(p & (ChanACL::Write | ChanACL::LinkChannel)); qaChannelCopyURL->setEnabled(c); qaChannelSendMessage->setEnabled(p & (ChanACL::Write | ChanACL::TextMessage)); qaChannelFilter->setEnabled(true); qteChat->setEnabled(p & (ChanACL::Write | ChanACL::TextMessage)); } void MainWindow::userStateChanged() { if (g.s.bStateInTray) { updateTrayIcon(); } ClientUser *user = ClientUser::get(g.uiSession); if (user == NULL) { g.bAttenuateOthers = false; g.prioritySpeakerActiveOverride = false; return; } switch (user->tsState) { case Settings::Talking: case Settings::Whispering: case Settings::Shouting: g.bAttenuateOthers = g.s.bAttenuateOthersOnTalk; g.prioritySpeakerActiveOverride = g.s.bAttenuateUsersOnPrioritySpeak && user->bPrioritySpeaker; break; case Settings::Passive: default: g.bAttenuateOthers = false; g.prioritySpeakerActiveOverride = false; break; } } void MainWindow::on_qaAudioReset_triggered() { AudioInputPtr ai = g.ai; if (ai) ai->bResetProcessor = true; } void MainWindow::on_qaFilterToggle_triggered() { g.s.bFilterActive = qaFilterToggle->isChecked(); updateUserModel(); } void MainWindow::on_qaAudioMute_triggered() { if (g.bInAudioWizard) { qaAudioMute->setChecked(!qaAudioMute->isChecked()); return; } AudioInputPtr ai = g.ai; if (ai) ai->tIdle.restart(); g.s.bMute = qaAudioMute->isChecked(); if (! g.s.bMute && g.s.bDeaf) { g.s.bDeaf = false; qaAudioDeaf->setChecked(false); g.l->log(Log::SelfUndeaf, tr("Unmuted and undeafened.")); } else if (! g.s.bMute) { g.l->log(Log::SelfUnmute, tr("Unmuted.")); } else { g.l->log(Log::SelfMute, tr("Muted.")); } if (g.sh) { g.sh->setSelfMuteDeafState(g.s.bMute, g.s.bDeaf); } updateTrayIcon(); } void MainWindow::on_qaAudioDeaf_triggered() { if (g.bInAudioWizard) { qaAudioDeaf->setChecked(!qaAudioDeaf->isChecked()); return; } if (! qaAudioDeaf->isChecked() && bAutoUnmute) { qaAudioDeaf->setChecked(true); qaAudioMute->setChecked(false); on_qaAudioMute_triggered(); return; } AudioInputPtr ai = g.ai; if (ai) ai->tIdle.restart(); g.s.bDeaf = qaAudioDeaf->isChecked(); if (g.s.bDeaf && ! g.s.bMute) { bAutoUnmute = true; g.s.bMute = true; qaAudioMute->setChecked(true); g.l->log(Log::SelfDeaf, tr("Muted and deafened.")); } else if (g.s.bDeaf) { g.l->log(Log::SelfDeaf, tr("Deafened.")); bAutoUnmute = false; } else { g.l->log(Log::SelfUndeaf, tr("Undeafened.")); } if (g.sh) { g.sh->setSelfMuteDeafState(g.s.bMute, g.s.bDeaf); } updateTrayIcon(); } void MainWindow::on_qaRecording_triggered() { if (voiceRecorderDialog) { voiceRecorderDialog->show(); voiceRecorderDialog->raise(); voiceRecorderDialog->activateWindow(); } else { voiceRecorderDialog = new VoiceRecorderDialog(this); connect(voiceRecorderDialog, SIGNAL(finished(int)), this, SLOT(voiceRecorderDialog_finished(int))); voiceRecorderDialog->show(); } } void MainWindow::on_qaAudioTTS_triggered() { g.s.bTTS = qaAudioTTS->isChecked(); } void MainWindow::on_qaAudioStats_triggered() { AudioStats *as=new AudioStats(this); as->show(); } void MainWindow::on_qaAudioUnlink_triggered() { g.p->bUnlink = true; } void MainWindow::on_qaConfigDialog_triggered() { QDialog *dlg = new ConfigDialog(this); if (dlg->exec() == QDialog::Accepted) { setupView(false); updateTransmitModeComboBox(); updateTrayIcon(); updateUserModel(); if (g.s.requireRestartToApply) { if (g.s.requireRestartToApply && QMessageBox::question( this, tr("Restart Mumble?"), tr("Some settings will only apply after a restart of Mumble. Restart Mumble now?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { bSuppressAskOnQuit = true; restartOnQuit = true; close(); } } } delete dlg; } void MainWindow::on_qaConfigMinimal_triggered() { g.s.bMinimalView = qaConfigMinimal->isChecked(); updateWindowTitle(); setupView(); } void MainWindow::on_qaConfigHideFrame_triggered() { g.s.bHideFrame = qaConfigHideFrame->isChecked(); setupView(false); } void MainWindow::on_qaConfigCert_triggered() { CertWizard *cw = new CertWizard(this); cw->exec(); delete cw; } void MainWindow::on_qaAudioWizard_triggered() { AudioWizard *aw = new AudioWizard(this); aw->exec(); delete aw; } void MainWindow::on_qaDeveloperConsole_triggered() { g.c->show(); } void MainWindow::on_qaHelpWhatsThis_triggered() { QWhatsThis::enterWhatsThisMode(); } void MainWindow::on_qaHelpAbout_triggered() { AboutDialog adAbout(this); adAbout.exec(); } void MainWindow::on_qaHelpAboutQt_triggered() { QMessageBox::aboutQt(this, tr("About Qt")); } void MainWindow::on_qaHelpVersionCheck_triggered() { new VersionCheck(false, this); } void MainWindow::on_gsMuteSelf_down(QVariant v) { int val = v.toInt(); if ( ((val > 0) && ! g.s.bMute) || ((val < 0) && g.s.bMute) || (val == 0) ) { qaAudioMute->setChecked(! qaAudioMute->isChecked()); on_qaAudioMute_triggered(); } } void MainWindow::on_gsDeafSelf_down(QVariant v) { int val = v.toInt(); if ( ((val > 0) && ! g.s.bDeaf) || ((val < 0) && g.s.bDeaf) || (val == 0) ) { qaAudioDeaf->setChecked(! qaAudioDeaf->isChecked()); on_qaAudioDeaf_triggered(); } } void MainWindow::on_PushToTalk_triggered(bool down, QVariant) { g.iPrevTarget = 0; if (down) { g.uiDoublePush = g.tDoublePush.restart(); g.iPushToTalk++; } else if (g.iPushToTalk > 0) { QTimer::singleShot(static_cast(g.s.pttHold), this, SLOT(pttReleased())); } } void MainWindow::pttReleased() { if (g.iPushToTalk > 0) { g.iPushToTalk--; } } void MainWindow::on_PushToMute_triggered(bool down, QVariant) { g.bPushToMute = down; updateTrayIcon(); updateUserModel(); } void MainWindow::on_VolumeUp_triggered(bool down, QVariant) { if (down) { float vol = g.s.fVolume + 0.1f; if (vol > 2.0f) { vol = 2.0f; } g.s.fVolume = vol; } } void MainWindow::on_VolumeDown_triggered(bool down, QVariant) { if (down) { float vol = g.s.fVolume - 0.1f; if (vol < 0.0f) { vol = 0.0f; } g.s.fVolume = vol; } } Channel *MainWindow::mapChannel(int idx) const { if (! g.uiSession) return NULL; Channel *c = NULL; if (idx < 0) { switch (idx) { case SHORTCUT_TARGET_ROOT: c = Channel::get(0); break; case SHORTCUT_TARGET_PARENT: case SHORTCUT_TARGET_CURRENT: c = ClientUser::get(g.uiSession)->cChannel; if (idx == SHORTCUT_TARGET_PARENT) c = c->cParent; break; default: if(idx <= SHORTCUT_TARGET_PARENT_SUBCHANNEL) c = pmModel->getSubChannel(ClientUser::get(g.uiSession)->cChannel->cParent, SHORTCUT_TARGET_PARENT_SUBCHANNEL - idx); else c = pmModel->getSubChannel(ClientUser::get(g.uiSession)->cChannel, SHORTCUT_TARGET_SUBCHANNEL - idx); break; } } else { c = Channel::get(idx); } return c; } void MainWindow::updateTarget() { g.iPrevTarget = g.iTarget; if (qmCurrentTargets.isEmpty()) { g.bCenterPosition = false; g.iTarget = 0; } else { bool center = false; QList ql; foreach(const ShortcutTarget &st, qmCurrentTargets.keys()) { ShortcutTarget nt; center = center || st.bForceCenter; nt.bUsers = st.bUsers; if (st.bUsers) { foreach(const QString &hash, st.qlUsers) { ClientUser *p = pmModel->getUser(hash); if (p) nt.qlSessions.append(p->uiSession); } if (! nt.qlSessions.isEmpty()) ql << nt; } else { Channel *c = mapChannel(st.iChannel); if (c) { nt.bLinks = st.bLinks; nt.bChildren = st.bChildren; nt.iChannel = c->iId; nt.qsGroup = st.qsGroup; ql << nt; } } } if (ql.isEmpty()) { g.iTarget = -1; } else { ++iTargetCounter; int idx = qmTargets.value(ql); if (idx == 0) { QMap qm; QMap::const_iterator i; for (i=qmTargetUse.constBegin(); i != qmTargetUse.constEnd(); ++i) { qm.insert(i.value(), i.key()); } i = qm.constBegin(); idx = i.value(); MumbleProto::VoiceTarget mpvt; mpvt.set_id(idx); foreach(const ShortcutTarget &st, ql) { MumbleProto::VoiceTarget_Target *t = mpvt.add_targets(); if (st.bUsers) { foreach(unsigned int uisession, st.qlSessions) t->add_session(uisession); } else { t->set_channel_id(st.iChannel); if (st.bChildren) t->set_children(true); if (st.bLinks) t->set_links(true); if (! st.qsGroup.isEmpty()) t->set_group(u8(st.qsGroup)); } } g.sh->sendMessage(mpvt); qmTargets.insert(ql, idx); ++i; ++i; int oldidx = i.value(); if (oldidx) { QHash, int>::iterator mi; for (mi = qmTargets.begin(); mi != qmTargets.end(); ++mi) { if (mi.value() == oldidx) { qmTargets.erase(mi); mpvt.Clear(); mpvt.set_id(oldidx); g.sh->sendMessage(mpvt); break; } } } } qmTargetUse.insert(idx, iTargetCounter); g.bCenterPosition = center; g.iTarget = idx; } } } void MainWindow::on_gsWhisper_triggered(bool down, QVariant scdata) { ShortcutTarget st = scdata.value(); if (down) { if (gsJoinChannel->active()) { if (! st.bUsers) { Channel *c = mapChannel(st.iChannel); if (c) { g.sh->joinChannel(g.uiSession, c->iId); } return; } } if (gsLinkChannel->active()) { if (! st.bUsers) { Channel *c = ClientUser::get(g.uiSession)->cChannel; Channel *l = mapChannel(st.iChannel); if (l) { if (c->qsPermLinks.contains(l)) { g.sh->removeChannelLink(c->iId, l->iId); } else { g.sh->addChannelLink(c->iId, l->iId); } } return; } } addTarget(&st); updateTarget(); g.iPushToTalk++; } else if (g.iPushToTalk > 0) { SignalCurry *fwd = new SignalCurry(scdata, true, this); connect(fwd, SIGNAL(called(QVariant)), SLOT(whisperReleased(QVariant))); QTimer::singleShot(static_cast(g.s.pttHold), fwd, SLOT(call())); } } /* Add and remove ShortcutTargets from the qmCurrentTargets Map, which counts * the number of push-to-talk events for a given ShortcutTarget. If this number * reaches 0, the ShortcutTarget is removed from qmCurrentTargets. */ void MainWindow::addTarget(ShortcutTarget *st) { if (qmCurrentTargets.contains(*st)) qmCurrentTargets[*st] += 1; else qmCurrentTargets[*st] = 1; } void MainWindow::removeTarget(ShortcutTarget *st) { if (!qmCurrentTargets.contains(*st)) return; if (qmCurrentTargets[*st] == 1) qmCurrentTargets.remove(*st); else qmCurrentTargets[*st] -= 1; } void MainWindow::on_gsCycleTransmitMode_triggered(bool down, QVariant) { if (down) { QString qsNewMode; switch (g.s.atTransmit) { case Settings::Continuous: g.s.atTransmit = Settings::VAD; g.l->log(Log::Information, tr("Transmit Mode set to Voice Activity")); break; case Settings::VAD: g.s.atTransmit = Settings::PushToTalk; g.l->log(Log::Information, tr("Transmit Mode set to Push-to-Talk")); break; case Settings::PushToTalk: g.s.atTransmit = Settings::Continuous; g.l->log(Log::Information, tr("Transmit Mode set to Continuous")); break; } } updateTransmitModeComboBox(); } void MainWindow::on_gsTransmitModePushToTalk_triggered(bool down, QVariant) { if (down) { g.s.atTransmit = Settings::PushToTalk; g.l->log(Log::Information, tr("Transmit Mode set to Push-to-Talk")); } updateTransmitModeComboBox(); } void MainWindow::on_gsTransmitModeContinuous_triggered(bool down, QVariant) { if (down) { g.s.atTransmit = Settings::Continuous; g.l->log(Log::Information, tr("Transmit Mode set to Continuous")); } updateTransmitModeComboBox(); } void MainWindow::on_gsTransmitModeVAD_triggered(bool down, QVariant) { if (down) { g.s.atTransmit = Settings::VAD; g.l->log(Log::Information, tr("Transmit Mode set to Voice Activity")); } updateTransmitModeComboBox(); } void MainWindow::on_gsSendTextMessage_triggered(bool down, QVariant scdata) { if (!down || !g.sh || !g.sh->isRunning() || g.uiSession == 0) { return; } QString qsText = scdata.toString(); if (qsText.isEmpty()) { return; } Channel *c = ClientUser::get(g.uiSession)->cChannel; g.sh->sendChannelTextMessage(c->iId, qsText, false); g.l->log(Log::TextMessage, tr("To %1: %2").arg(Log::formatChannel(c), qsText), tr("Message to channel %1").arg(c->qsName), true); } void MainWindow::on_gsSendClipboardTextMessage_triggered(bool down, QVariant) { if (!down || (QApplication::clipboard()->text().isEmpty())) { return; } // call sendChatbarMessage() instead of on_gsSendTextMessage_triggered() to handle // formatting of the content in the clipboard, i.e., href. sendChatbarMessage(QApplication::clipboard()->text()); } void MainWindow::whisperReleased(QVariant scdata) { if (g.iPushToTalk <= 0) return; ShortcutTarget st = scdata.value(); g.iPushToTalk--; removeTarget(&st); updateTarget(); } void MainWindow::onResetAudio() { qWarning("MainWindow: Start audio reset"); Audio::stop(); Audio::start(); qWarning("MainWindow: Audio reset complete"); } void MainWindow::viewCertificate(bool) { ViewCert vc(g.sh->qscCert, this); vc.exec(); } /** * This function prepares the UI for receiving server data. It gets called once the * connection to the server is established but before the server Sync is complete. */ void MainWindow::serverConnected() { g.uiSession = 0; g.pPermissions = ChanACL::None; g.iCodecAlpha = 0x8000000b; g.bPreferAlpha = true; #ifdef USE_OPUS g.bOpus = true; #else g.bOpus = false; #endif g.iCodecBeta = 0; #ifdef Q_OS_MAC // Suppress AppNap while we're connected to a server. MUSuppressAppNap(true); #endif g.l->clearIgnore(); g.l->setIgnore(Log::UserJoin); g.l->setIgnore(Log::OtherSelfMute); QString host, uname, pw; unsigned short port; g.sh->getConnectionInfo(host, port, uname, pw); g.l->log(Log::ServerConnected, tr("Connected.")); qaServerDisconnect->setEnabled(true); qaServerInformation->setEnabled(true); qaServerBanList->setEnabled(true); Channel *root = Channel::get(0); pmModel->renameChannel(root, tr("Root")); pmModel->setCommentHash(root, QByteArray()); root->uiPermissions = 0; qtvUsers->setRowHidden(0, QModelIndex(), false); g.bAllowHTML = true; g.uiMessageLength = 5000; g.uiImageLength = 131072; g.uiMaxUsers = 0; if (g.s.bMute || g.s.bDeaf) { g.sh->setSelfMuteDeafState(g.s.bMute, g.s.bDeaf); } // Update QActions and menues on_qmServer_aboutToShow(); on_qmSelf_aboutToShow(); qmChannel_aboutToShow(); qmUser_aboutToShow(); on_qmConfig_aboutToShow(); #ifdef Q_OS_WIN TaskList::addToRecentList(g.s.qsLastServer, uname, host, port); #endif } void MainWindow::serverDisconnected(QAbstractSocket::SocketError err, QString reason) { g.uiSession = 0; g.pPermissions = ChanACL::None; g.bAttenuateOthers = false; qaServerDisconnect->setEnabled(false); qaServerInformation->setEnabled(false); qaServerBanList->setEnabled(false); qtvUsers->setCurrentIndex(QModelIndex()); qteChat->setEnabled(false); updateTrayIcon(); #ifdef Q_OS_MAC // Remove App Nap suppression now that we're disconnected. MUSuppressAppNap(false); #endif QString uname, pw, host; unsigned short port; g.sh->getConnectionInfo(host, port, uname, pw); if (g.sh->hasSynchronized()) { // Only save server-specific shortcuts if the client and server have been synchronized before as only then // did the client actually load them from the DB. If we store them without having loaded them, we will effectively // clear the server-specific shortcuts for this server. if (g.db->setShortcuts(g.sh->qbaDigest, g.s.qlShortcuts)) { GlobalShortcutEngine::engine->bNeedRemap = true; } } if (aclEdit) { aclEdit->reject(); delete aclEdit; aclEdit = NULL; } if (banEdit) { banEdit->reject(); delete banEdit; banEdit = NULL; } if (userEdit) { userEdit->reject(); delete userEdit; userEdit = NULL; } if (tokenEdit) { tokenEdit->reject(); delete tokenEdit; tokenEdit = NULL; } QSet qs; qs += qlServerActions.toSet(); qs += qlChannelActions.toSet(); qs += qlUserActions.toSet(); foreach(QAction *a, qs) delete a; qlServerActions.clear(); qlChannelActions.clear(); qlUserActions.clear(); pmModel->removeAll(); qtvUsers->setRowHidden(0, QModelIndex(), true); // Update QActions and menues on_qmServer_aboutToShow(); on_qmSelf_aboutToShow(); qmChannel_aboutToShow(); qmUser_aboutToShow(); on_qmConfig_aboutToShow(); if (! g.sh->qlErrors.isEmpty()) { foreach(QSslError e, g.sh->qlErrors) g.l->log(Log::Warning, tr("SSL Verification failed: %1").arg(Qt::escape(e.errorString()))); if (! g.sh->qscCert.isEmpty()) { QSslCertificate c = g.sh->qscCert.at(0); QString basereason; QString actual_digest = QString::fromLatin1(c.digest(QCryptographicHash::Sha1).toHex()); QString digests_section = tr("
  • Server certificate digest (SHA-1):\t%1
  • ").arg(ViewCert::prettifyDigest(actual_digest)); QString expected_digest = g.db->getDigest(host, port); if (! expected_digest.isNull()) { basereason = tr("WARNING: The server presented a certificate that was different from the stored one."); digests_section.append(tr("
  • Expected certificate digest (SHA-1):\t%1
  • ").arg(ViewCert::prettifyDigest(expected_digest))); } else { basereason = tr("Server presented a certificate which failed verification."); } QStringList qsl; foreach(QSslError e, g.sh->qlErrors) qsl << QString::fromLatin1("
  • %1
  • ").arg(Qt::escape(e.errorString())); QMessageBox qmb(QMessageBox::Warning, QLatin1String("Mumble"), tr("

    %1

      %2

    The specific errors with this certificate are:

      %3
    " "

    Do you wish to accept this certificate anyway?
    (It will also be stored so you won't be asked this again.)

    " ).arg(basereason).arg(digests_section).arg(qsl.join(QString())), QMessageBox::Yes | QMessageBox::No, this); qmb.setDefaultButton(QMessageBox::No); qmb.setEscapeButton(QMessageBox::No); QPushButton *qp = qmb.addButton(tr("&View Certificate"), QMessageBox::ActionRole); forever { int res = qmb.exec(); if ((res == 0) && (qmb.clickedButton() == qp)) { ViewCert vc(g.sh->qscCert, this); vc.exec(); continue; } else if (res == QMessageBox::Yes) { g.db->setDigest(host, port, QString::fromLatin1(c.digest(QCryptographicHash::Sha1).toHex())); qaServerDisconnect->setEnabled(true); on_Reconnect_timeout(); } break; } } } else if (err == QAbstractSocket::SslHandshakeFailedError) { QMessageBox::warning(this, tr("SSL Version mismatch"), tr("This server is using an older encryption standard, and is no longer supported by modern versions of Mumble."), QMessageBox::Ok); } else { bool ok = false; if (! reason.isEmpty()) { g.l->log(Log::ServerDisconnected, tr("Server connection failed: %1.").arg(Qt::escape(reason))); } else { g.l->log(Log::ServerDisconnected, tr("Disconnected from server.")); } Qt::WindowFlags wf = 0; #ifdef Q_OS_MAC wf = Qt::Sheet; #endif bool matched = true; switch (rtLast) { case MumbleProto::Reject_RejectType_InvalidUsername: uname = QInputDialog::getText(this, tr("Invalid username"), tr("You connected with an invalid username, please try another one."), QLineEdit::Normal, uname, &ok, wf); break; case MumbleProto::Reject_RejectType_UsernameInUse: uname = QInputDialog::getText(this, tr("Username in use"), tr("That username is already in use, please try another username."), QLineEdit::Normal, uname, &ok, wf); break; case MumbleProto::Reject_RejectType_WrongUserPW: pw = QInputDialog::getText(this, tr("Wrong certificate or password"), tr("Wrong certificate or password for registered user. If you are\n" "certain this user is protected by a password please retry.\n" "Otherwise abort and check your certificate and username."), QLineEdit::Password, pw, &ok, wf); break; case MumbleProto::Reject_RejectType_WrongServerPW: pw = QInputDialog::getText(this, tr("Wrong password"), tr("Wrong server password for unregistered user account, please try again."), QLineEdit::Password, pw, &ok, wf); break; default: matched = false; break; } if (ok && matched) { if (! g.s.bSuppressIdentity) g.db->setPassword(host, port, uname, pw); qaServerDisconnect->setEnabled(true); g.sh->setConnectionInfo(host, port, uname, pw); on_Reconnect_timeout(); } else if (!matched && g.s.bReconnect && ! reason.isEmpty()) { qaServerDisconnect->setEnabled(true); if (bRetryServer) { qtReconnect->start(); } } } qstiIcon->setToolTip(tr("Mumble -- %1").arg(QLatin1String(MUMBLE_RELEASE))); AudioInput::setMaxBandwidth(-1); } void MainWindow::resolverError(QAbstractSocket::SocketError, QString reason) { if (! reason.isEmpty()) { g.l->log(Log::ServerDisconnected, tr("Server connection failed: %1.").arg(Qt::escape(reason))); } else { g.l->log(Log::ServerDisconnected, tr("Server connection failed.")); } if (g.s.bReconnect) { qaServerDisconnect->setEnabled(true); if (bRetryServer) { qtReconnect->start(); } } } void MainWindow::trayAboutToShow() { bool top = false; QPoint p = qstiIcon->geometry().center(); if (p.isNull()) { p = QCursor::pos(); } QDesktopWidget dw; if (dw.screenNumber(p) >= 0) { QRect qr = dw.screenGeometry(p); if (p.y() < (qr.height() / 2)) top = true; qmTray->clear(); if (top) { qmTray->addAction(qaQuit); qmTray->addAction(qaShow); qmTray->addSeparator(); qmTray->addAction(qaAudioDeaf); qmTray->addAction(qaAudioMute); } else { qmTray->addAction(qaAudioMute); qmTray->addAction(qaAudioDeaf); qmTray->addSeparator(); qmTray->addAction(qaShow); qmTray->addAction(qaQuit); } } } void MainWindow::showRaiseWindow() { if (isMinimized()) { setWindowState((windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); } show(); raise(); activateWindow(); } void MainWindow::on_Icon_activated(QSystemTrayIcon::ActivationReason reason) { switch (reason) { case QSystemTrayIcon::Trigger: case QSystemTrayIcon::DoubleClick: case QSystemTrayIcon::MiddleClick: if (isMinimized()) { showRaiseWindow(); } else { showMinimized(); } default: break; } } /** * This function updates the qteChat bar default text according to * the selected user/channel in the users treeview. */ void MainWindow::qtvUserCurrentChanged(const QModelIndex &, const QModelIndex &) { updateChatBar(); } void MainWindow::updateChatBar() { User *p = pmModel->getUser(qtvUsers->currentIndex()); Channel *c = pmModel->getChannel(qtvUsers->currentIndex()); if (g.uiSession == 0) { qteChat->setDefaultText(tr("
    Not connected
    "), true); } else if (!g.s.bChatBarUseSelection || p == NULL || p->uiSession == g.uiSession) { // Channel tree target if (!g.s.bChatBarUseSelection || c == NULL) // If no channel selected fallback to current one c = ClientUser::get(g.uiSession)->cChannel; qteChat->setDefaultText(tr("
    Type message to channel '%1' here
    ").arg(Qt::escape(c->qsName))); } else { // User target qteChat->setDefaultText(tr("
    Type message to user '%1' here
    ").arg(Qt::escape(p->qsName))); } updateMenuPermissions(); } void MainWindow::customEvent(QEvent *evt) { if (evt->type() == MB_QEVENT) { MessageBoxEvent *mbe=static_cast(evt); g.l->log(Log::Information, mbe->msg); return; } else if (evt->type() == OU_QEVENT) { OpenURLEvent *oue=static_cast(evt); openUrl(oue->url); return; } else if (evt->type() != SERVERSEND_EVENT) { return; } ServerHandlerMessageEvent *shme=static_cast(evt); #ifdef QT_NO_DEBUG #define MUMBLE_MH_MSG(x) case MessageHandler:: x : { \ MumbleProto:: x msg; \ if (msg.ParseFromArray(shme->qbaMsg.constData(), shme->qbaMsg.size())) \ msg##x(msg); \ break; \ } #else #define MUMBLE_MH_MSG(x) case MessageHandler:: x : { \ MumbleProto:: x msg; \ if (msg.ParseFromArray(shme->qbaMsg.constData(), shme->qbaMsg.size())) { \ printf("%s:\n", #x); \ msg.PrintDebugString(); \ msg##x(msg); \ } \ break; \ } #endif switch (shme->uiType) { MUMBLE_MH_ALL } #undef MUMBLE_MH_MSG } void MainWindow::on_qteLog_anchorClicked(const QUrl &url) { if (!handleSpecialContextMenu(url, QCursor::pos(), true)) { #ifdef Q_OS_MAC // Clicking a link can cause the user's default browser to pop up while // we're intercepting all events. This can be very confusing (because // the user can't click on anything before they dismiss the overlay // by hitting their toggle hotkey), so let's disallow clicking links // when embedded into the overlay for now. if (g.ocIntercept) return; #endif if (url.scheme() != QLatin1String("file") && url.scheme() != QLatin1String("qrc") && !url.isRelative()) QDesktopServices::openUrl(url); } } void MainWindow::on_qteLog_highlighted(const QUrl &url) { if (url.scheme() == QString::fromLatin1("clientid") || url.scheme() == QString::fromLatin1("channelid")) return; if (! url.isValid()) QToolTip::hideText(); else { if (isActiveWindow()) { QToolTip::showText(QCursor::pos(), url.toString(), qteLog, QRect()); } } } void MainWindow::context_triggered() { QAction *a = qobject_cast(sender()); Channel *c = pmModel->getChannel(qtvUsers->currentIndex()); ClientUser *p = pmModel->getUser(qtvUsers->currentIndex()); MumbleProto::ContextAction mpca; mpca.set_action(u8(a->data().toString())); if (p && p->uiSession) mpca.set_session(p->uiSession); if (c) mpca.set_channel_id(c->iId); g.sh->sendMessage(mpca); } /** * Presents a file open dialog, opens the selected picture and returns it. * @return Pair consisting of the raw file contents and the image. Unitialized on error or cancel. */ QPair MainWindow::openImageFile() { QPair retval; QString fname = QFileDialog::getOpenFileName(this, tr("Choose image file"), getImagePath(), tr("Images (*.png *.jpg *.jpeg)")); if (fname.isNull()) return retval; QFile f(fname); if (! f.open(QIODevice::ReadOnly)) { QMessageBox::warning(this, tr("Failed to load image"), tr("Could not open file for reading.")); return retval; } updateImagePath(fname); QByteArray qba = f.readAll(); f.close(); QBuffer qb(&qba); qb.open(QIODevice::ReadOnly); QImageReader qir; qir.setAutoDetectImageFormat(false); QByteArray fmt; if (!RichTextImage::isValidImage(qba, fmt)) { QMessageBox::warning(this, tr("Failed to load image"), tr("Image format not recognized.")); return retval; } qir.setFormat(fmt); qir.setDevice(&qb); QImage img = qir.read(); if (img.isNull()) { QMessageBox::warning(this, tr("Failed to load image"), tr("Image format not recognized.")); return retval; } retval.first = qba; retval.second = img; return retval; } void MainWindow::destroyUserInformation() { UserInformation *ui = static_cast(sender()); QMap::iterator i; for (i=qmUserInformations.begin(); i != qmUserInformations.end(); ++i) { if (i.value() == ui) { qmUserInformations.erase(i); return; } } } mumble-1.3.4/src/mumble/mumble_ro.ts0000664000175000017500000116021114010707274017245 0ustar builderbuilder ACLEditor Deny Refuza Allow Permite Allow %1 Permite %1 Deny %1 Refuza %1 Mumble - Add channel Mumble - Adaugă un canal Default server value Valoarea prestabilita a serverului Failed: Invalid channel Nereușit: canal invalid Mumble - Edit %1 Mumble - Editează %1 ID: %1 ID: %1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Acest lucru acordă privilegiul %1. În cazul în care privilegiul este permis si refuzat, este refuzat<br />%2 Channel must have a name Canalul trebuie să aibă un nume This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Acest lucru revocă privilegiul %1. În cazul în care privilegiul este permis si refuzat, este refuzat.<br />%2 Dialog Dialog Name Nume Enter the channel name here. Introduceți numele canalului aici. Description Descriere Password Parolă Enter the channel password here. introduceți parola canalului aici. Check to create a temporary channel. Bifează pentru a crea un canal temporar Temporary Temporar <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Poziția</b><br/> Valoarea această vă permite să schimbați modul in care Mumble aranjează canalele in arbore. Un canal cu <i>poziția</i> mai mare va fi mereu plasat sub una cu o <i>poziție</i> mai mică și invers. În cazul în care <i>poziția</i> celor doua canale este egala vor fi sortate in mod alfabetic. Position Poziție &Groups &Grupuri Group Grup List of groups Listă de grupuri Remove selected group Elimină grupul selectat Remove Elimină Inherit group members from parent Inherit Make group inheritable to sub-channels Inheritable Group was inherited from parent channel Inherited Members Membrii Add Adaugă Add member to group Adaugă membrii in grup Remove member from group Elimină membrul din grup &ACL &ACL Active ACLs ACL activi List of entries Listă de intrări Inherit ACL of parent? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. Inherit ACLs Move entry up Muta intrarea in sus This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. &Up &Sus Move entry down Muta intrare in jos This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. Acest lucru se mută de la intrarea mai jos în listă. După cum intrările sunt evaluate în ordine, aceasta poate schimba permisiunile ale utilizatorilor. &Down &Jos Add new entry Adaugă o intrare nouă This adds a new entry, initially set with no permissions and applying to all. Aceasta se adaugă o nouă intrare, stabilită inițial fără permisiuni și care se aplică tuturor. &Add &Adaugă Remove entry Elimină intrare This removes the currently selected entry. Elimină intrarea selectată în prezent &Remove &Elimină Context Context Entry should apply to this channel. Entry should apply to this channel Intrare ar trebui să se aplice pe acest canal. This makes the entry apply to this channel. Acest lucru face intrarea sa se aplice pe acest canal. Applies to this channel Se aplică la acest canal Entry should apply to sub-channels. Intrare ar trebui să se aplice pe sub-canale. Add new group Adaugă un grup nou <b>Add</b><br/> Add a new group. <b>Adaugă</b><br/> Adaugă un grup nou. Inherited members Contains the list of members added to the group by this channel. Conține lista membrilor adăugati la grupul de acest canal. Contains a list of members whose group membership will not be inherited from the parent channel. Contains the list of members inherited by other channels. Type in the name of a user you wish to add to the group and click Add. Scrie un nume de utilizator pe care vrei sa îl adaugi in grup si apasă Adaugă. Type in the name of a user you wish to remove from the group and click Add. Scrie un nume de utilizator pe care vrei sa il elimini din grup si apasa Adaugă. Exclude Exclude Excluded members Membrii excluși This makes the entry apply to sub-channels of this channel. Acest lucru face intrarea sa se aplice pe sub-canale ale acestui canal. Applies to sub-channels Se aplică pe sub-canale Permissions Permisiuni User/Group Utilizator/Grup Group this entry applies to User ID ID utilizator User this entry applies to This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. Acest lucru controlează cărui utilizator i se aplica intrarea. Trebuie doar să scrieți numele de utilizator și apăsați enter pentru a căuta. &Properties &Proprietati <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>Nume</b><br />Introduceți numele canalului în acest câmp. Numele trebuie să respecte restricțiile impuse de serverul la care sunteți conectat. <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>Temporar</b><br /> Când este bifat, canalul va fi marcat ca și temporar. Asta înseamnă când ultimul utilizator iese din canal, server-ul va sterge automat canalul. <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>Grup</b><br /> Aceastea sunt toate grupurile definite în prezent pentru canal. Pentru a crea un grup nou, doar scrieti numele si apasați enter. <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>Elimina</b><br />Acest lucru elimina grupul selectat in prezent. Daca grupul a fost succedat, nu o sa fie eliminat din lista, dar toate informatiile locale despre grup o sa fie curațate. <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. ID of the channel. ID-ul canalului Maximum Users Număr maxim de utilizatori Maximum number of users allowed in the channel Numarul maxim permis de utilizatori pentru acest canal. <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. This is the sort order for the channel. ALSAAudioInput Default ALSA Card Placa ALSA prestabilita Opening chosen ALSA Input failed: %1 ALSAAudioOutput Default ALSA Card Placa ALSA prestabilita Opening chosen ALSA Output failed: %1 ASIOConfig %1 (version %2) %1 (versiune %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz %1 -> %2 samples buffer, cu %3 sample resolution (%4 preferat) at %5 Hz ASIO Initialization failed: %1 ASIO a eșuat sa inițializeze: %1 Failed to instantiate ASIO driver Instanțiere eșuata a driver-ul ASIO ASIO ASIO Device selection Selectarea dispozitivului Device Dispozitiv Device to use for microphone Dispozitiv de utilizat ca microfon This chooses what device to query. You still need to actually query the device and select which channels to use. Query selected device This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Query Configure selected device Configurează dispozitivul selectat This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Configure &Configurați Capabilities Capabilitati Driver name Numele driver-ului Buffer size Marimea buffer-ului This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. Configure input channels Configurați canalele de intrare Channels Canale Microphone Microfon <- <- -> -> Unused Nefolosit Speakers Difuzoare ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. Trebuie să selectați cel puțin un microfon și o sursă de difuzor pentru a utiliza ASIO. Daca aveți nevoie de microfon pentru sampling, folosiți DirectSound. Opening selected ASIO device failed. No input will be done. Deschiderea dispozitivului ASIO selectat a eșuat. Intrarea nu o sa fie facută AboutDialog About Mumble Despre Mumble <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble &Despre Mumble &License &Licență A&uthors &Third-Party Licenses OK Ok AudioInput Interface Interfață System Sistem Input method for audio Metoda de intrare pentru audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Dispozitiv Input device for audio Dispozitiv pentru intrare audio <b>This is the input device to use for audio.</b> <b>Acesta este dispozitivul de intrare folosit pentru audio</b> Transmission Transmisie &Transmit &Transmite When to transmit your speech Cand se transmite discursul <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. DoublePush Time Timp de dublu apăsare If you press the PTT key twice in this time it will get locked. Dacă apeși pe tasta de PTT de două ori in acest timp, o sa fie blocata <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. Reset audio cue to default Resetează audio cue-ul la modul prestabilit <b>Reset</b><br/>Reset the paths for the files to their default. Browse for on audio file Caută un fișier audio pentru pornit Browse for off audio file Caută un fișier audio pentru oprit Off Oprit On Pornit Preview the audio cues Previzualizează audio cue-urile Use SNR based speech detection Folosește detectarea vorbirii bazată pe SNR Signal to Noise Semnal in sunet <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. Amplitude Amplitudine Voice &Hold &Asteptare voce How long to keep transmitting after silence Cât de mult să continue sa transmită dupa tăcere Silence Below Liniște sub <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. Speech Above Discurs peste Signal values above this count as voice Valorile de semnal mai mari decât asta se pun ca voce Compression Compresie &Quality &Calitate Quality of compression (peak bandwidth) Calitatea compresiei (vârful lățimii de bandă) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. Audio per packet Audio pe pachet How many audio frames to send per packet Câte frame-uri audio să se transmită pe packet <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). Audio Processing Procesare audio Noise Suppression Antifonare Noise suppression Antifonare <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. Maximum amplification of input sound Amplificare maximă a sunetul de intrare <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. Current speech detection chance Șansa de a detecta discursul Cancel echo from speakers Anulare ecou de la difuzoare Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. Disabled Dezactivat <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal values below this count as silence Maximum bandwidth used for sending audio Maximul marimii de banda pentru trimiterea audioului Use Amplitude based speech detection Folosește detectarea vorbirii bazată pe amplitudine <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). Exclusive mode Mod exclusiv <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive Exclusiv R&eset R&eset &Browse... &Răsfoiește... B&rowse... R&ăsfoiește... &Preview &Previzualizare <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. Displays an always on top window with a push to talk button in it Afișează un buton pe partea de sus a ferestrei cu push to talk in el Display push to talk window Afișează fereastra push to talk Misc Diverse Audible audio cue when starting or stopping to transmit <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. Audio cue Gets played when starting to transmit Gets played when stopping to transmit Hold Time Timp așteptare Time the microphone stays open after the PTT key is released Timpul in care microfonul stă pornit după ce butonul PTT nu mai este apasat Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) Limita server-ului de bandă de internet este doar %1 kbit/s. Calitatea audio a fost ajustată automat la %2 kbit/s (%3 ms) Max. Amplification Amplificare maximă Idle action Acțiune inactivitate minutes do minute sa faci nothing nimic deafen asurzește mute amuțește after după Echo Cancellation Anulare ecou Mixed echo cancellation Anulare ecou mixt Multichannel echo cancellation Anulare ecou cu canale multiple The idle action will be reversed upon any key or mouse button input Undo Idle action upon activity Apply RNNoise's noise suppression filter. <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. RNNoise Audio input AudioInputDialog Continuous Continuu Voice Activity Activitate voce Push To Talk Push To Talk Audio Input Intrare audio %1 ms %1 ms Off Oprit %1 s %1 s %1 kb/s %1 kb/s -%1 dB -%1 dB %1 kbit/s (Audio %2, Position %4, Overhead %3) %1 kbit/s (Audio %2, Position %4, Overhead %3) AudioOutput Interface Interfață System Sistem Output method for audio Metoda de ieșire pentru audio <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Dispozitiv Output device for audio Dispozitiv pentru ieșire audio <b>This is the output device to use for audio.</b> Positional Audio Audio pozitional Audio Output Ieșire audio Default &Jitter Buffer Safety margin for jitter buffer <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. Minimum distance to user before sound volume decreases This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. Volume Volum Volume of incoming speech Volum de intrare a vorbirii <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. Output Delay Întârziere de ieșire Amount of data to buffer Cantitatea de date pentru buffer The connected "speakers" are actually headphones The connected "speakers" are actually headphones. Factor for sound volume decrease Bloom Bloom Factor for sound volume increase How much should sound volume increase for sources that are really close? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Headphones Minimum Distance Maximum Distance Maximum distance, beyond which speech volume won't decrease Minimum Volume What should the volume be at the maximum distance? Loopback Test Delay Variance Variance in packet latency <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. Packet Loss Packet loss for loopback mode <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% &Loopback Desired loopback mode Attenuate applications by... Attenuation of other applications during speech <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. If checked Mumble lowers the volume of other applications while other users talk <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. while other users talk If checked Mumble lowers the volume of other applications while you talk <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. while you talk Exclusive mode, not recommended. <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive Priority Speaker If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. Attenuate other users while talking as Priority Speaker. Advanced Attenuation Options If checked, Mumble will only attenuate applications that are using the same output source as Mumble <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. Only attenuate applications using the same output device If checked, PulseAudio loopback modules will be attenuated <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. Attenuate PulseAudio loopback modules Audio output AudioOutputDialog None Local Server Audio Output %1 ms %1 % %1 m AudioOutputSample Choose sound file Invalid sound file The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. AudioStats >1000 ms >1000ms Audio Statistics Input Levels Peak microphone level Peak power in last frame This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. Peak speaker level This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. Peak clean level This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. Signal Analysis Microphone power How close the current input level is to ideal This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. Signal-To-Noise ratio Signal-To-Noise ratio from the microphone This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. Speech Probability Probability of speech This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). Configuration feedback Current audio bitrate Bitrate of last frame DoublePush interval Time between last two Push-To-Talk presses Speech Detection Current speech detection chance <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal and noise power spectrum Power spectrum of input signal and noise estimate This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. Echo Analysis Weights of the echo canceller This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. AudioWizard Audio Tuning Wizard Introduction Welcome to the Mumble Audio Wizard Finished Enjoy using Mumble Device selection Selecting the input and output device to use with Mumble. This is the device your microphone is connected to. System Input method for audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Input device to use <b>Selects which sound card to use for audio input.</b> Cancel echo from headset or speakers Use echo cancellation This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. This is the device your speakers or headphones are connected to. Output method for audio <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. Output device to use <b>Selects which sound card to use for audio Output.</b> Enable positional audio Allows positioning of sound Allows positioning of sound. <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> Input Device Output Device This allows Mumble to use positional audio to place voices. <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> Amount of data to buffer This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> Positional Audio Adjusting attenuation of positional audio. <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> Use headphones instead of speakers <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> Use headphones This ignores the OS speaker configuration and configures the positioning for headphones instead. Volume tuning Tuning microphone hardware volume to optimal settings. Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. Voice Activity Detection Letting Mumble figure out when you're talking and when you're silent. This will help Mumble figure out when you are talking. The first step is selecting which data value to use. Raw amplitude from input Signal-To-Noise ratio Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Device tuning Changing hardware output delays to their minimum value. Submit anonymous statistics to the Mumble project Push To Talk: Quality & Notifications Adjust quality and notification settings. Quality settings Low Balanced Notification settings Use Text-To-Speech to read notifications and messages to you. Disable Text-To-Speech and use sounds instead. %1 ms Enables attenuation of other applications while users talk to you Attenuate applications while other users talk High Custom You already set a customized quality configuration in Mumble. Select this setting to keep it. Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. Apply some high contrast optimizations for visually impaired users Use high contrast graphics Keep custom Text-To-Speech settings. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) BanEditor Mumble - Edit Bans &Address &Mask Reason Start End User Hash &Add &Update &Remove Ban List Search field This is the search field. Use it to find bans that have this username set in the username field. Who are you looking for? No nickname IP address No IP address Reason for the ban No reason Ban end date Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). Certificate hash No certificate hash Banned users This is a list with banned users. Use this button if you want to add a new ban. Use this button if you want to update ban information. Use this button if you want to remove user from the ban list. Clear all fields This button clears all fields. Use it if you want to add a new ban. Clear Ban List - %n Ban(s) CertView Name Email Issuer Expiry Date (none) Self-signed CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. There was an error generating your certificate.<br />Please try again. Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. The file could not be opened for writing. Please use another file. The file's permissions could not be set. No certificate and key has been written. Please use another file. The file could not be written successfully. Please use another file. The file could not be opened for reading. Please use another file. The file is empty or could not be read. Please use another file. The file did not contain a valid certificate and key. Please use another file. Select file to export certificate to Select file to import certificate from Unable to import. Missing password or incompatible file type. <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. Certificates Certificate Management Certificate Authentication Authenticating to servers without using passwords Current certificate This is the certificate Mumble currently uses. Current Certificate Create a new certificate This will create a new certificate. Import certificate from file This will import a certificate from file. Import a certificate Export Certificate This will export a certificate to file. Export current certificate Import Certificate PKCS #12 Certificate import <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> Import from Filename to import from This is the filename you wish to import a certificate from. Select file to import from This opens a file selection dialog to choose a file to import a certificate from. Open... Password Password for PKCS#12 file This is the password for the PKCS#12 file containing your certificate. Certificate to import This is the certificate you are importing. Certificate Details Replace Certificate Replace existing certificate with new certificate? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> This is the certificate Mumble currently uses. It will be replaced. New certificate This is the new certificate that will replace the old one. New Certificate Make a backup of your certificate Export to Filename to export to This is the filename you wish to export a certificate to. Save As... This is the certificate Mumble currently uses. It will be exported. Generate a new certificate for strong authentication <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> Name Email Your email address (e.g. johndoe@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. Your name (e.g. John Doe) This is your name, and will be filled out in the certificate. This field is entirely optional. Finish Certificate-based authentication is ready for use Enjoy using Mumble with strong authentication. Automatic certificate creation <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> ChanACL None Traverse Enter Speak Mute/Deafen Make channel Make temporary Link channel This represents no privileges. This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. This represents the permission to write text messages to other users in this channel. This represents the permission to forcibly remove users from the server. This represents the permission to permanently remove users from the server. This represents the permission to register and unregister users on the server. This represents the permission to register oneself on the server. Whisper Move Text message Kick Ban Register User Register Self Write ACL ChatbarTextEdit Paste and &Send Paste and send <center>Type chat message here</center> ClientUser Friend Authenticated Priority speaker Recording Muted (server) Deafened (server) Local Ignore (Text messages) Local Mute Muted (self) Deafened (self) ConfigDialog Accept changes This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. Reject changes This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. Apply changes This button will immediately apply all changes. Undo changes for current page This button will revert any changes done on the current page to the most recent applied settings. Restore defaults for current page This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. Mumble Configuration ConnectDialog Connecting to %1 Enter username Adding host %1 Servername Hostname Bonjour name Port Addresses Website Packet loss Ping (80%) %1 ms Ping (95%) Bandwidth %1 kbit/s &Connect &Filters Unknown Users Version Failed to fetch server list Mumble Server Connect Ping Remove from Favorites Add custom server Show all servers that respond to ping Show all servers with users Show all servers &Copy Copy favorite link to clipboard &Paste Paste favorite from clipboard &Edit... &Add New... Add to &Favorites Open &Webpage Show &Reachable Show &Populated Show &All ConnectDialogEdit Edit Server Name of the server A&ddress Internet address of the server. Internet address of the server. <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. &Port Port on which the server is listening <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. &Username Username to send to the server <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. Label Add Server You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 Password Password to send to the server <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. Show password <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. Local server label 127.0.0.1 64738 Your username Your password &Fill CoreAudioSystem Default Device CrashReporter Mumble Crash Report <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> Email address (optional) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash Send Report Don't send report Crash upload successful Thank you for helping make Mumble better! Crash upload failed We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 Uploading crash report Abort upload DXAudioInput Default DirectSound Voice Input Opening chosen DirectSound Input device failed. No microphone capture will be done. Opening chosen DirectSound Input failed. Default device will be used. Lost DirectSound input device. DXAudioOutput Default DirectSound Voice Output Opening chosen DirectSound Output failed. Default device will be used. Lost DirectSound output device. Opening chosen DirectSound Output failed. No audio will be heard. Database Mumble failed to initialize a database in any of the possible locations. The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. DeveloperConsole Developer Console DockTitleBar Drag here GlobalShortcut Shortcuts List of configured shortcuts Function Data Shortcut Suppress Add new shortcut This will add a new global shortcut &Add Remove selected shortcut This will permanently remove a selected shortcut. &Remove <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> Open Accessibility Preferences Skip Enable Global Shortcuts <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. Additional Shortcut Engines <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. Enable Windows hooks <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. Enable GKey <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. Enable XInput <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. Enable shortcuts in privileged applications GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> Shortcuts Shortcut button combination. <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. Suppress keys from other applications <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. GlobalShortcutTarget Whisper Target Whisper to list of Users Channel Target Restrict to Group If specified, only members of this group will receive the whisper. List of users Add Remove Modifiers Do not send positional audio information when using this whisper shortcut. Ignore positional audio Shout to Linked channels Shout to subchannels Shout to Channel The whisper will also be transmitted to linked channels. The whisper will also be sent to the subchannels of the channel target. GlobalShortcutX Mouse %1 JackAudioSystem Hardware Ports Mono Stereo LCD Not connected LCDConfig Enable this device LCD Devices Name <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> Size Enabled Views Minimum Column Width <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> This setting decides the width of column splitter. Splitter Width Log Debug Critical Warning Information Server Connected Server Disconnected Other self-muted/deafened Permission Denied Text Message User Joined Server User Left Server User recording state changed User kicked (you or by you) User kicked You self-muted User muted (you) User muted (by you) User muted (other) User Joined Channel User Left Channel You self-unmuted You self-deafened You self-undeafened User renamed You Joined Channel You Joined Channel (moved) User connected and entered channel User left channel and disconnected Private text message the server [[ Invalid size ]] [[ Text object too large to display ]] [Date changed to %1] link to %1 FTP link to %1 player link channel link %1 link LogConfig Toggle console for %1 events Toggle pop-up notifications for %1 events Toggle Text-To-Speech for %1 events Click here to toggle sound notification for %1 events Toggle window highlight (if not active) for %1 events Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. Messages Message Console Notification Text-To-Speech Soundfile Path Text To Speech Volume Volume of Text-To-Speech Engine <b>This is the volume used for the speech synthesis.</b> Length threshold Message length threshold for Text-To-Speech Engine <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. Characters Whisper If checked you will only hear whispers from users you added to your friend list. Only accept whispers from friends If enabled text messages you send will be read back to you with TTS Read back own messages Chat Log Maximum chat length Unlimited Lines Highlight LookConfig System default None Only with users All Ask Do Nothing Move <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory User Interface This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. List users above subchannels (requires restart). <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. Users above Channels <b>If set, will verify you want to quit if connected.</b> Show number of users in each channel Show channel user count Language Language to use (requires restart) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. Look and Feel Layout Classic Stacked Hybrid Custom This changes the behavior when moving channels. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. Expand When to automatically expand channels Channel Dragging Ask whether to close or minimize when quitting Mumble. Ask on quit while connected Always On Top <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> Hide in tray when minimized Hide the main Mumble window in the tray when it is minimized. This setting controls when the application will be always on top. Never Always In minimal view In normal view Displays talking status in system tray Show talking status in tray icon This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. Show context menu in menu bar Apply some high contrast optimizations for visually impaired users Optimize for high contrast Application Adds user and channel context menus into the menu bar Tray Icon Channel Tree Use selected item as the chat bar target Filter automatically hides empty channels Show transmit mode dropdown in toolbar Theme Theme to use to style the user interface <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. User Dragging This changes the behavior when moving users. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. Enable Developer menu When in custom layout mode, checking this disables rearranging. Lock layout MainWindow Root Push-to-Talk Global Shortcut Push and hold this button to send voice. Global Shortcut This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut Reset Audio Processor Global Shortcut Unlink Plugin Global Shortcut Push-to-Mute Global Shortcut Join Channel Global Shortcut Toggle Overlay Global Shortcut Toggle state of in-game overlay. Global Shortcut Toggle Minimal Global Shortcut Volume Up (+10%) Global Shortcut Volume Down (-10%) Global Shortcut Mumble Mumble -- %1 &Window Minimize Ctrl+M Close Mumble is currently connected to a server. Do you want to Close or Minimize it? Mute Self Global Shortcut Set self-mute status. Global Shortcut This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut Deafen Self Global Shortcut Set self-deafen status. Global Shortcut This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut Whisper/Shout Whisper <center>Not connected</center> Not connected Clear Opening URL %1 File does not exist File is not a configuration file. Settings merged from file. URL scheme is not 'mumble' This version of Mumble can't handle URLs for Mumble version %1.%2.%3 Connecting to %1 Enter username Connecting to server %1. Reconnecting. Transmit Mode set to Continuous <p>%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> Register yourself as %1 <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <h2>Version</h2><p>Protocol %1</p> <p>No build information or OS version available</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) The connection is secured by the cipher suite that OpenSSL identifies as %1 <p>The connection provides perfect forward secrecy</p> <p>The connection does not provide perfect forward secrecy</p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> Voice channel is sent over control channel Register user %1 <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> Kicking user %1 Banning user %1 View comment on user %1 Message to channel %1 Connected. <li>Expected certificate digest (SHA-1): %1</li> Server presented a certificate which failed verification. <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> SSL Version mismatch Server connection failed. <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>Type message to user '%1' here</center> Type message to user '%1' here Choose image file Failed to load image Could not open file for reading. Image format not recognized. &User &Channel Use in conjunction with Whisper to. Global Shortcut This will switch the states of the in-game overlay. Global Shortcut Link Channel Global Shortcut Cycle Transmit Mode Global Shortcut Set Transmit Mode to Push-To-Talk Global Shortcut Set Transmit Mode to Continuous Global Shortcut Set Transmit Mode to VAD Global Shortcut Send Text Message Global Shortcut Send Clipboard Text Message Global Shortcut This will send your Clipboard content to the channel you are currently in. Global Shortcut Continuous Voice Activity Push-to-Talk Mumble - Minimal View -- %1 Cancel Save Image As... Save Image File Could not save image: %1 Change your comment Transmit Mode set to Voice Activity Transmit Mode set to Push-to-Talk <p>Connected users: %1/%2</p> UDP Statistics To Server From Server Good Late Lost Resync <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> Mumble Server Information &View Certificate Enter reason Sending message to %1 To %1: %2 Message to %1 Are you sure you want to reset the comment of user %1? Are you sure you want to reset the avatar of user %1? Are you sure you want to delete %1 and all its sub-channels? Sending message to channel %1 Message to tree %1 To %1 (Tree): %2 (Tree) %1: %2 Unmuted and undeafened. Unmuted. Muted. Muted and deafened. Deafened. Undeafened. Restart Mumble? Some settings will only apply after a restart of Mumble. Restart Mumble now? About Qt SSL Verification failed: %1 <li>Server certificate digest (SHA-1): %1</li> <b>WARNING:</b> The server presented a certificate that was different from the stored one. This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. Server connection failed: %1. Disconnected from server. Invalid username You connected with an invalid username, please try another one. Username in use That username is already in use, please try another username. Wrong certificate or password Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. Wrong password Wrong server password for unregistered user account, please try again. Images (*.png *.jpg *.jpeg) C&onfigure &Help Log This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. &Quit Mumble Closes the program Exits the application. Ctrl+Q Open the server connection dialog &Disconnect Disconnect from server Disconnects you from the server. Show information about the server connection This will show extended information about the connection to the server. &Mute &Deafen &Local Mute Send a Text Message Sends a text message to another user. Add new channel This adds a new sub-channel to the currently selected channel. Remove channel This removes a channel and all sub-channels. Edit Groups and ACL for channel This opens the Group and ACL dialog for the channel, to control permissions. &Link Link your channel to another channel This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. Chatbar Shows a dialog of registered servers, and also allows quick-connect. Kick user (with reason) Kick selected user off server. You'll be asked to specify a reason. Mute user Mute or unmute user on server. Unmuting a deafened user will also undeafen them. Kick and ban user (with reason) Kick and ban selected user from server. You'll be asked to specify a reason. Deafen user Deafen or undeafen user on server. Deafening a user will also mute them. Mute user locally Mute or unmute user locally. Use this on other users in the same room. This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. &Unlink Channel Unlink your channel from another channel This unlinks your current channel from the selected channel. Unlinks your channel from all linked channels. This unlinks your current channel (not the selected one) from all linked channels. &Reset Reset audio preprocessor This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. &Mute Self Mute yourself Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. &Deafen Self Deafen yourself Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. &Text-To-Speech Toggle Text-To-Speech Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. Display audio statistics Pops up a small dialog with information about your current audio input. Forcibly unlink plugin This forces the current plugin to unlink, which is handy if it is reading completely wrong data. Configure Mumble Allows you to change most settings for Mumble. Start the audio configuration wizard This will guide you through the process of configuring your audio hardware. &What's This? Enter What's This? mode Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. Information about Mumble Shows a small dialog with information and license for Mumble. Information about Speex Shows a small dialog with information about Speex. Information about Qt Shows a small dialog with information about Qt. Check for &Updates Check for new version of Mumble Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. Sends a text message to all users in a channel. Configure certificates for strong authentication This starts the wizard for creating, importing and exporting certificates for authentication against servers. Register user on server This will permanently register the user on the server. Add &Friend Adds a user as your friend. This will add the user as a friend, so you can recognize him on this and other servers. &Remove Friend Removes a user from your friends. This will remove a user from your friends list. &Update Friend Update name of your friend. Your friend uses a different name than what is in your database. This will update the name. Edit registered users list This opens the editor for registered users, which allow you to change their name or unregister them. Add or remove text-based access tokens &Minimal View Toggle minimal window modes This will toggle minimal mode, where the log window and menu is hidden. You muted and deafened %1. You unmuted and undeafened %1. You undeafened %1. You suppressed %1. %1 muted and deafened by %2. %1 unmuted and undeafened by %2. %1 undeafened by %2. %1 suppressed by %2. %1 moved to %2. %1 moved to %2 by %3. %1 moved in from %2 by %3. %1 is now muted and deafened. Your account information can not be verified currently. Please try again later Welcome message: %1 Mumble: %1 You were denied %1 privileges in %2. %3 was denied %1 privileges in %2. Denied: Cannot modify SuperUser. Denied: Invalid channel name. Denied: Text message too long. Denied: Operation not permitted in temporary channel. You need a certificate to perform this operation. %1 does not have a certificate. Invalid username: %1. Invalid username. Channel is full. Channel nesting limit reached. Channel count limit reached. Need to delete channels before creating new ones. Permission denied. %1 connected and entered channel. %1 connected. %1 is now muted. %1 is now unmuted. Recording started Recording stopped %1 started recording. %1 stopped recording. You revoked your priority speaker status. You assumed priority speaker status. %1 revoked your priority speaker status. %1 gave you priority speaker status. You revoked priority speaker status for %1. You gave priority speaker status to %1. %1 revoked own priority speaker status. %1 assumed priority speaker status. %1 revoked priority speaker status for %2. %1 gave priority speaker status to %2. You were unmuted and undeafened by %1. You were muted by %1. You were undeafened by %1. You were suppressed. You were suppressed by %1. You were unsuppressed. You were unsuppressed by %1. You joined %1. You moved %1 to %2. %1 is recording %1 renamed to %2 by %3. %1 disconnected. Server message from (Tree) (Channel) (Private) %2%1: %3 Failed to load Opus, it will not be available for audio encoding/decoding. The server requests minimum client version %1 The server requests positional audio be enabled. The server requests positional audio be disabled. The server requests Push-to-Talk be enabled. The server requests Push-to-Talk be disabled. You were unmuted by %1. You muted %1. You unsuppressed %1. You unmuted %1. %1 muted by %2. %1 unsuppressed by %2. %1 unmuted by %2. Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. You were muted and deafened by %1. You were deafened by %1. You were kicked from the server by %1: %2. %3 was kicked from the server by %1: %2. You were kicked and banned from the server by %1: %2. %3 was kicked and banned from the server by %1: %2. You were moved to %1 by %2. %1 entered channel. Server connection rejected: %1. Denied: %1. %1 renamed to %2. %1 left channel and disconnected. Message from %1 You have User Dragging set to "Do Nothing" so the user wasn't moved. You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. Unknown Channel Drag mode in UserModel::dropMimeData. Remote controlling Mumble: Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) -jn, --jackname Set custom Jack client name. --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status Invocation Error: No RPC command specified RPC Welcome to Mumble. Skipping version check in debug mode. Hide Frame Toggle showing frame on minimal window This will toggle whether the minimal window should have a frame for moving and resizing. &Unlink All Reset the comment of the selected user. &Join Channel View comment in editor Query server for connection information for user S&erver &Self &Unlink Plugins Register yourself on the server Change your avatar image on this server &Remove Avatar Remove currently defined avatar image. Icon Toolbar Change your own comment Recording Priority Speaker &Copy URL Copies a link to this channel to the clipboard. Ignore Messages Locally ignore user's text chat messages. Silently drops all text messages from the user. Edit ban list on server This lets you edit the server-side IP ban list. &Filter on/off Toggle the channel filter (Ctrl+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. Ctrl+F &Hide Channel when Filtering Reset the avatar of the selected user. Locally adjust the user's speech volume. Opens a dialog with a volume slider. Use this on other users in the same room. &Developer &Hide Mumble Hides the main Mumble window. Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. Show the Developer Console Shows the Mumble Developer Console, where Mumble's log output can be inspected. &Connect... &Ban list... &Information... &Kick... &Ban... Local Volume Adjustment... Send &Message... &Add... &Remove... &Edit... Audio S&tatistics... &Settings... &Audio Wizard... Developer &Console... &About... About &Speex... About &Qt... &Certificate Wizard... &Register... Registered &Users... Change &Avatar... &Access Tokens... Reset &Comment... Reset &Avatar... View Comment... &Change Comment... R&egister... Show Shows the main Mumble window. Manual Manual Mumble Positional Audio Position X Y Z m Heading Azimuth Elevation ° Meta data Context Identity Set State Linked Activated Unhinge NetworkConfig Network Updates are mandatory when using snapshot releases. Connection Use TCP compatibility mode Use TCP compatability mode <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). Reconnect when disconnected <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. Reconnect automatically Proxy Type Type of proxy to connect through Direct connection HTTP(S) proxy SOCKS5 proxy Hostname Hostname of the proxy Force TCP mode Enable QoS to prioritize packets This will enable QoS, which will attempt to prioritize voice packets over other traffic. Use Quality of Service Don't send certificate to server and don't save passwords. (Not saved). <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> Suppress certificate and password storage <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. Port Port number of the proxy <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. Username Username for proxy authentication <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Password Password for proxy authentication <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Mumble services Check for new releases of Mumble automatically. This will check for new releases of Mumble every time you start the program, and notify you if one is available. Check for application updates on startup Check for new releases of plugins automatically. This will check for new releases of plugins every time you start the program, and download them automatically. <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. Submit anonymous statistics to the Mumble project Submit anonymous statistics Reconnect to last used server when starting Mumble Reconnect to last server on startup Download plugin and overlay updates on startup Privacy Prevent OS information being sent to Mumble servers and web servers <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. Do not send OS information to Mumble servers and web servers Overlay Silent Talking Whisper Shout Channel Failed to create communication with overlay at %2: %1. No overlay will be available. OverlayClient Filter Only talking Talking and recently active All in current channel All in linked channels Always show yourself Configure recently active time (%1 seconds)... Columns Sort Alphabetically Last state change Edit... Reset Zoom Configure recently active time Amount of seconds users remain active after talking: OverlayConfig To move the users, drag the little red dot. To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. For more options, right click a user. For more options, rightclick a user. Launcher Filter Overlay Choose executable Choose application Choose path Load Overlay Presets Mumble overlay presets (*.mumblelay) Save Overlay Presets Options Enable overlay. Enable Overlay This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. Layout Blacklist Whitelist Uninstall Overlay Overlay Installation Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. Install Mumble Overlay Overlay Upgrade Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. Upgrade Mumble Overlay Display a frame counter in the overlay Show FPS counter Load an overlay preset from file Load… Save your overlay settings to file Save… Set the overlay font. Set the overlay text color. Color Remove Font FPS and Clock Display Display a clock in the overlay showing the current local time (system time). Show Clock Overlay Exceptions Overlay Exception Mode Allowed launchers Add Allowed programs Allowed paths Blacklisted programs OverlayEditor State User is not talking Passive User is talking in your channel or a linked channel Talking User is whispering to you privately Private Whisper User is shouting to your channel Channel Whisper Zoom Zoom Factor Enabled Elements User avatar, chosen by each user Avatar User's name Username Name of user's channel, if outside your current channel Channel Muted or deafened Mute state Bounding box, automatically shrunk to minimum size to contain all visible elements Bounding box Overlay Editor OverlayEditorScene Layout preset Large square avatar Avatar and Name User Opacity %1% Object Opacity Alignment Left Center Right Top Bottom Color... Font... Bounding box Pen width Padding Pen color Fill color Pick pen color Pick fill color Pick color Pick font PluginConfig Plugins Plugin has no configure function. Plugin has no about function. Options Enable plugins and transmit positional information This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. Link to Game and Transmit Position Reloads all plugins This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. &Reload plugins Information about plugin This shows a small information message about the plugin. &About Show configuration page of plugin This shows the configuration page of the plugin, if any. &Configure Name Enabled Plugins Skipping plugin update in debug mode. Downloaded new or updated plugin to %1. Failed to install new plugin to %1. %1 lost link. %1 linked. PortAudioSystem Default Device PulseAudioSystem Default Input Default Output QApplication Failed to restart mumble Mumble failed to restart itself. Please restart it manually. RichTextEditor Failed to load image Image file too large to embed in document. Please use images smaller than %1 kB. Message is too long. Display Source Text &Bold Ctrl+B &Italic Italic Ctrl+I Underline Ctrl+U Color Insert Link Ctrl+L Insert Image RichTextEditorLink Add Link URL Text ServerHandler Unable to resolve hostname Server is not responding to TCP pings UDP packets cannot be sent to or received from the server. Switching to TCP mode. UDP packets cannot be sent to the server. Switching to TCP mode. UDP packets cannot be received from the server. Switching to TCP mode. UDP packets can be sent to and received from the server. Switching back to UDP mode. Connection timed out ServerView Favorite LAN Public Internet Unknown Africa Asia North America South America Europe Oceania ShortcutActionWidget Unassigned ShortcutDelegate On Off Toggle Unassigned ShortcutKeyWidget Press Shortcut ShortcutTargetDialog Root Parent Current Subchannel #%1 ShortcutTargetWidget ... , Root Parent Current Subchannel #%1 Invalid Empty <Empty> ShortcutToggleWidget Off Toggle On TextMessage Enter text If checked the message is recursively sent to all subchannels Send recursively to subchannels Tokens Empty Token Mumble - Access Tokens List of access tokens on current server <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. Add a token &Add Remove a token &Remove UserEdit Registered Users Remove Rename Who are you looking for? Days Weeks Months Years Inactive for Registered users: %n account(s) UserInformation User Information Connection Information Version OS Certificate IP Address CELT Versions Details... Ping Statistics Pings received Average ping TCP (Control) UDP (Voice) UDP Network statistics Good Late Lost Resync From Client To Client Connection time %1w %1d %1h %1m %1s , %1 (%2) %1.%2.%3 (%4) Supported Not Supported Not Reported %1 online (%2 idle) %1 online %1 kbit/s Bandwidth GroupBox Bandwidth Label Ping deviation UserListModel Nick Inactive days Last channel Last seen: %1 Never Channel ID: %1 UserLocalVolumeDialog Local volume for other users <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. Adjusting local volume for %1 dB <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: Talking to your channel. Shouting directly to your channel. Whispering directly to your channel. Whispering directly to you. Not talking. This is a channel on the server. The icon indicates the state of the channel: Your current channel. A channel that is linked with your channel. Linked channels can talk to each other. A channel on the server that you are not linked to. This shows the flags the user has on the server, if any: On your friend list Authenticated user Muted (manually muted by self) Muted (manually muted by admin) Muted (not allowed to speak in current channel) Muted (muted by you, only on your machine) Muted (push-to-mute) Deafened (by self) Deafened (by admin) User has a new comment set (click to show) User has a comment set, which you've already seen. (click to show) Ignoring Text Messages This shows the flags the channel has, if any: Channel has a new comment set (click to show) Channel has a comment set, which you've already seen. (click to show) Channel will be hidden when filtering is enabled Name Flags Are you sure you want to drag this user? Are you sure you want to drag this channel? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. VersionCheck Upgrade Mumble A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? Failed to launch snapshot installer. Corrupt download of new version detected. Automatically removed. Downloading new snapshot from %1 to %2 Failed to write new version to disk. Failed to write new version to disc. Mumble failed to retrieve version information from the central server. ViewCert Certificate Chain Details Certificate chain Certificate details Common Name Organization Subunit Country Locality State Valid from: %1 Valid to: %1 Serial: %1 Public Key: %1 bits %2 RSA DSA Digest (SHA-1): %1 Digest (SHA-256): %1 Email: %1 DNS: %1 Issued by: Unit Name VoiceRecorder Recorder failed to create directory '%1' Recorder failed to open file '%1' .wav - Uncompressed .ogg (Vorbis) - Compressed .au - Uncompressed .flac - Lossless compressed VoiceRecorderDialog Recorder Control 00:00:00 &Start S&top Mode Multichannel Output Output format Target directory Filename &Browse... Valid variables are: Inserts the user's name Inserts the current date Inserts the current time Inserts the hostname Recorder still running Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? Unable to start recording. Not connected to a server. The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. There is already a recorder active for this server. Please select a recording format. Stopping Select target directory Downmix WASAPIInput Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone. WASAPISystem Default Device qwPTTButtonWidget Mumble PTT Push to talk mumble-1.3.4/src/mumble/AudioOutputUser.cpp0000664000175000017500000000146114010707273020540 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "AudioOutputUser.h" AudioOutputUser::AudioOutputUser(const QString& name) : qsName(name) { iBufferSize = 0; pfBuffer = NULL; pfVolume = NULL; fPos[0]=fPos[1]=fPos[2]=0.0; } AudioOutputUser::~AudioOutputUser() { delete [] pfBuffer; delete [] pfVolume; } void AudioOutputUser::resizeBuffer(unsigned int newsize) { if (newsize > iBufferSize) { float *n = new float[newsize]; if (pfBuffer) { memcpy(n, pfBuffer, sizeof(float) * iBufferSize); delete [] pfBuffer; } pfBuffer = n; iBufferSize = newsize; } } mumble-1.3.4/src/mumble/UserEdit.cpp0000664000175000017500000001374114010707273017147 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "UserEdit.h" #include #include "Channel.h" #include "ServerHandler.h" #include "User.h" #include "UserListModel.h" // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" UserEdit::UserEdit(const MumbleProto::UserList &userList, QWidget *p) : QDialog(p) , m_model(new UserListModel(userList, this)) , m_filter(new UserListFilterProxyModel(this)) { setupUi(this); const int userCount = userList.users_size(); setWindowTitle(tr("Registered users: %n account(s)", "", userCount)); m_filter->setSourceModel(m_model); qtvUserList->setModel(m_filter); QItemSelectionModel *selectionModel = qtvUserList->selectionModel(); connect(selectionModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(onSelectionChanged(QItemSelection,QItemSelection))); connect(selectionModel, SIGNAL(currentRowChanged(QModelIndex,QModelIndex)), this, SLOT(onCurrentRowChanged(QModelIndex,QModelIndex))); qtvUserList->setFocus(); qtvUserList->setContextMenuPolicy(Qt::CustomContextMenu); #if QT_VERSION >= 0x050000 qtvUserList->header()->setSectionResizeMode(UserListModel::COL_NICK, QHeaderView::Stretch); if (!m_model->isLegacy()) { qtvUserList->header()->setSectionResizeMode(UserListModel::COL_INACTIVEDAYS, QHeaderView::ResizeToContents); qtvUserList->header()->setSectionResizeMode(UserListModel::COL_LASTCHANNEL, QHeaderView::Stretch); } #else qtvUserList->header()->setResizeMode(UserListModel::COL_NICK, QHeaderView::Stretch); if (!m_model->isLegacy()) { qtvUserList->header()->setResizeMode(UserListModel::COL_INACTIVEDAYS, QHeaderView::ResizeToContents); qtvUserList->header()->setResizeMode(UserListModel::COL_LASTCHANNEL, QHeaderView::Stretch); } #endif if (m_model->isLegacy()) { qlInactive->hide(); qsbInactive->hide(); qcbInactive->hide(); } qtvUserList->sortByColumn(UserListModel::COL_NICK, Qt::AscendingOrder); } void UserEdit::accept() { if (m_model->isUserListDirty()) { MumbleProto::UserList userList = m_model->getUserListUpdate(); g.sh->sendMessage(userList); } QDialog::accept(); } void UserEdit::on_qlSearch_textChanged(QString pattern) { m_filter->setFilterWildcard(pattern); } void UserEdit::on_qpbRename_clicked() { QModelIndex current = qtvUserList->selectionModel()->currentIndex(); if (!current.isValid()) return; QModelIndex nickIndex = current.sibling(current.row(), UserListModel::COL_NICK); qtvUserList->edit(nickIndex); } void UserEdit::on_qpbRemove_clicked() { m_filter->removeRowsInSelection(qtvUserList->selectionModel()->selection()); } void UserEdit::on_qtvUserList_customContextMenuRequested(const QPoint &point) { QMenu *menu = new QMenu(this); if (qtvUserList->selectionModel()->currentIndex().isValid()) { QAction *renameAction = menu->addAction(tr("Rename")); connect(renameAction, SIGNAL(triggered()), this, SLOT(on_qpbRename_clicked())); menu->addSeparator(); } QAction *removeMenuAction = menu->addAction(tr("Remove")); connect(removeMenuAction, SIGNAL(triggered()), this, SLOT(on_qpbRemove_clicked())); menu->exec(qtvUserList->mapToGlobal(point)); delete menu; } void UserEdit::onSelectionChanged(const QItemSelection& /*selected*/, const QItemSelection& /*deselected*/) { const bool somethingSelected = !(qtvUserList->selectionModel()->selection().empty()); qpbRemove->setEnabled(somethingSelected); } void UserEdit::onCurrentRowChanged(const QModelIndex ¤t, const QModelIndex &) { qpbRename->setEnabled(current.isValid()); } void UserEdit::on_qsbInactive_valueChanged(int) { updateInactiveDaysFilter(); } void UserEdit::on_qcbInactive_currentIndexChanged(int) { updateInactiveDaysFilter(); } void UserEdit::updateInactiveDaysFilter() { const int timespanUnit = qcbInactive->currentIndex(); const int timespanCount = qsbInactive->value(); int minimumInactiveDays = 0; switch (timespanUnit) { case TU_DAYS: minimumInactiveDays = timespanCount; break; case TU_WEEKS: minimumInactiveDays = timespanCount * 7; break; case TU_MONTHS: minimumInactiveDays = timespanCount * 30; break; case TU_YEARS: minimumInactiveDays = timespanCount * 365; break; default: break; } m_filter->setFilterMinimumInactiveDays(minimumInactiveDays); } UserListFilterProxyModel::UserListFilterProxyModel(QObject *parent_) : QSortFilterProxyModel(parent_) , m_minimumInactiveDays(0) { setFilterKeyColumn(UserListModel::COL_NICK); setFilterCaseSensitivity(Qt::CaseInsensitive); setSortLocaleAware(true); setDynamicSortFilter(true); } bool UserListFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const { if(!QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent)) { return false; } const QModelIndex inactiveDaysIdx = sourceModel()->index(source_row, UserListModel::COL_INACTIVEDAYS, source_parent); bool ok; const int inactiveDays = inactiveDaysIdx.data().toInt(&ok); // If inactiveDaysIdx doesn't store an int the account hasn't been seen yet and mustn't be filtered if (ok && inactiveDays < m_minimumInactiveDays) return false; return true; } void UserListFilterProxyModel::setFilterMinimumInactiveDays(int minimumInactiveDays) { m_minimumInactiveDays = minimumInactiveDays; invalidateFilter(); } void UserListFilterProxyModel::removeRowsInSelection(const QItemSelection &selection) { QItemSelection sourceSelection = mapSelectionToSource(selection); qobject_cast(sourceModel())->removeRowsInSelection(sourceSelection); } mumble-1.3.4/src/mumble/AudioOutput.ui0000664000175000017500000006254314010707273017544 0ustar builderbuilder AudioOutput 0 0 546 669 Audio output Interface System qcbSystem 0 0 Output method for audio <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. Qt::Horizontal QSizePolicy::Maximum 24 16 Device qcbDevice 1 0 Output device for audio <b>This is the output device to use for audio.</b> MUComboBox::AdjustToMinimumContentsLength 16 true 0 27 Exclusive mode, not recommended. <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive Positional Audio Audio Output Default &Jitter Buffer qsJitter Safety margin for jitter buffer <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. 1 5 2 Qt::Horizontal 40 0 jb Volume of incoming speech <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. 0 200 100 Qt::Horizontal Volume qsVolume vol Output Delay qsDelay Amount of data to buffer This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. 1 10 3 Qt::Horizontal Attenuation of other applications during speech <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. 0 100 0 Qt::Horizontal od at Attenuate applications by... Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop true qsOtherVolume If checked Mumble lowers the volume of other applications while other users talk <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. while other users talk If checked Mumble lowers the volume of other applications while you talk <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. while you talk Advanced Attenuation Options If checked, Mumble will only attenuate applications that are using the same output source as Mumble <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. Only attenuate applications using the same output device If checked, PulseAudio loopback modules will be attenuated <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. Attenuate PulseAudio loopback modules Priority Speaker If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. <b>Attenuate other users while talking as Priority Speaker</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. Attenuate other users while talking as Priority Speaker true Positional Audio The connected "speakers" are actually headphones Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. Headphones Minimum Distance qsMinDistance Minimum distance to user before sound volume decreases This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. 10 200 Qt::Horizontal 40 0 md Maximum Distance qsMaxDistance Maximum distance, beyond which speech volume won't decrease This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. 10 1000 Qt::Horizontal 40 0 md Minimum Volume qsMaxDistVolume Factor for sound volume decrease What should the volume be at the maximum distance? 100 Qt::Horizontal 40 0 mv Bloom qsMaxDistVolume 40 0 bl Factor for sound volume increase How much should sound volume increase for sources that are really close? 0 75 Qt::Horizontal Loopback Test Delay Variance qsPacketDelay Variance in packet latency <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. 100 Qt::Horizontal 40 0 dv Packet Loss qsPacketLoss Packet loss for loopback mode <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% 50 5 20 Qt::Horizontal 40 0 pl &Loopback qcbLoopback Desired loopback mode <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. Qt::Vertical 20 40 qcbSystem qcbDevice qcbPositional qsJitter qsVolume qsDelay qcbHeadphones qsMinDistance qsBloom qsMaxDistance qsMaxDistVolume qcbLoopback qsPacketDelay qsPacketLoss MUComboBox QComboBox
    widgets/MUComboBox.h
    mumble-1.3.4/src/mumble/PathListWidget.h0000664000175000017500000000233314010707273017757 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_PATHLISTWIDGET_H_ #define MUMBLE_MUMBLE_PATHLISTWIDGET_H_ #include class QGraphicsSceneDragDropEvent; class QDropEvent; /** * ListWidget that adds functionality for being able to drop files or folders to add them to the list. * * It makes use of OverlayAppInfo to display file/app information (e.g. the appropriate icon). */ class PathListWidget : public QListWidget { public: enum PathType { FILE_EXE, FOLDER }; PathListWidget(QWidget *parent=0); void setPathType(PathType type); virtual void dragEnterEvent(QDragEnterEvent *event) Q_DECL_OVERRIDE; virtual void dragMoveEvent(QDragMoveEvent *event) Q_DECL_OVERRIDE; virtual void dropEvent(QDropEvent *event) Q_DECL_OVERRIDE; private: Q_OBJECT Q_DISABLE_COPY(PathListWidget) PathType pathType; void addFilePath(const QString &path); void addFolderPath(const QString &path); void checkAcceptDragEvent(QDropEvent *event, bool store); }; #endif mumble-1.3.4/src/mumble/ALSAAudio.h0000664000175000017500000000157114010707273016570 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_ALSAAUDIO_H_ #define MUMBLE_MUMBLE_ALSAAUDIO_H_ #include "AudioInput.h" #include "AudioOutput.h" class ALSAAudioOutput; class ALSAAudioInput; class ALSAAudioInput : public AudioInput { private: Q_OBJECT Q_DISABLE_COPY(ALSAAudioInput) public: ALSAAudioInput(); ~ALSAAudioInput() Q_DECL_OVERRIDE; void run() Q_DECL_OVERRIDE; }; class ALSAAudioOutput : public AudioOutput { private: Q_OBJECT Q_DISABLE_COPY(ALSAAudioOutput) protected: public: ALSAAudioOutput(); ~ALSAAudioOutput() Q_DECL_OVERRIDE; void run() Q_DECL_OVERRIDE; }; #else class ALSAAudioInput; class ALSAAudioOutput; #endif mumble-1.3.4/src/mumble/mumble.qrc0000664000175000017500000000252214010707274016703 0ustar builderbuilder ../../icons/rec.svg ../../icons/mumble.svg ../../icons/mumble.icns ../../samples/wb_male.oga ../../samples/on.ogg ../../samples/off.ogg ../../samples/Critical.ogg ../../samples/PermissionDenied.ogg ../../samples/SelfMutedDeafened.ogg ../../samples/ServerConnected.ogg ../../samples/ServerDisconnected.ogg ../../samples/TextMessage.ogg ../../samples/UserJoinedChannel.ogg ../../samples/UserKickedYouOrByYou.ogg ../../samples/UserLeftChannel.ogg ../../samples/UserMutedYouOrByYou.ogg ../../samples/RecordingStateChanged.ogg mumble-1.3.4/src/mumble/CELTCodec.cpp0000664000175000017500000001221614010707273017104 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "CELTCodec.h" #include "Audio.h" #include "Version.h" #include "MumbleApplication.h" #ifdef Q_CC_GNU #define RESOLVE(var) { var = reinterpret_cast<__typeof__(var)>(qlCELT.resolve(#var)); bValid = bValid && (var != NULL); } #else #define RESOLVE(var) { * reinterpret_cast(&var) = static_cast(qlCELT.resolve(#var)); bValid = bValid && (var != NULL); } #endif #ifdef Q_OS_WIN extern "C" { void __cpuid(int a[4], int b); }; #endif CELTCodec::CELTCodec(const QString &celt_version) { bValid = false; cmMode = NULL; qsVersion = celt_version; iBitstreamVersion = INT_MIN; qlCELT.setLoadHints(QLibrary::ResolveAllSymbolsHint); QStringList alternatives; #if defined(Q_OS_MAC) alternatives << QString::fromLatin1("libcelt0.%1.dylib").arg(celt_version); alternatives << QString::fromLatin1("celt0.%1.dylib").arg(celt_version); alternatives << QString::fromLatin1("libcelt.%1.dylib").arg(celt_version); alternatives << QString::fromLatin1("celt.%1.dylib").arg(celt_version); #elif defined(Q_OS_UNIX) alternatives << QString::fromLatin1("libcelt0.so.%1").arg(celt_version); alternatives << QString::fromLatin1("libcelt.so.%1").arg(celt_version); alternatives << QString::fromLatin1("celt.so.%1").arg(celt_version); #else int cpuinfo[4]; __cpuid(cpuinfo, 1); if (cpuinfo[3] & 0x02000000) { if (cpuinfo[3] & 0x04000000) { if (cpuinfo[2] & 0x00000001) { alternatives << QString::fromLatin1("celt0.%1.sse3.dll").arg(celt_version); } alternatives << QString::fromLatin1("celt0.%1.sse2.dll").arg(celt_version); } alternatives << QString::fromLatin1("celt0.%1.sse.dll").arg(celt_version); } alternatives << QString::fromLatin1("celt0.%1.dll").arg(celt_version); #endif foreach(const QString &lib, alternatives) { qlCELT.setFileName(MumbleApplication::instance()->applicationVersionRootPath() + QLatin1String("/") + lib); if (qlCELT.load()) { bValid = true; break; } #ifdef Q_OS_MAC qlCELT.setFileName(QApplication::instance()->applicationDirPath() + QLatin1String("/../Codecs/") + lib); if (qlCELT.load()) { bValid = true; break; } #endif #ifdef PLUGIN_PATH qlCELT.setFileName(QLatin1String(MUMTEXT(PLUGIN_PATH) "/") + lib); if (qlCELT.load()) { bValid = true; break; } #endif qlCELT.setFileName(lib); if (qlCELT.load()) { bValid = true; break; } } RESOLVE(celt_mode_destroy); RESOLVE(celt_mode_info); RESOLVE(celt_encoder_destroy); RESOLVE(celt_encoder_ctl); RESOLVE(celt_decoder_destroy); RESOLVE(celt_decoder_ctl); } CELTCodec::~CELTCodec() { if (cmMode) celt_mode_destroy(const_cast(cmMode)); } bool CELTCodec::isValid() const { return bValid; } int CELTCodec::bitstreamVersion() const { if (cmMode && iBitstreamVersion == INT_MIN) celt_mode_info(cmMode, CELT_GET_BITSTREAM_VERSION, reinterpret_cast(&iBitstreamVersion)); return iBitstreamVersion; } QString CELTCodec::version() const { return qsVersion; } void CELTCodec::report() const { qWarning("CELT bitstream %08x from %s", bitstreamVersion(), qPrintable(qlCELT.fileName())); } CELTCodec070::CELTCodec070(const QString &celt_version) : CELTCodec(celt_version) { RESOLVE(celt_mode_create); RESOLVE(celt_encoder_create); RESOLVE(celt_decoder_create); RESOLVE(celt_encode_float); RESOLVE(celt_encode); RESOLVE(celt_decode_float); RESOLVE(celt_decode); RESOLVE(celt_strerror); if (bValid) { cmMode = celt_mode_create(SAMPLE_RATE, SAMPLE_RATE / 100, NULL); } } CELTEncoder *CELTCodec070::encoderCreate() { return celt_encoder_create(cmMode, 1, NULL); } CELTDecoder *CELTCodec070::decoderCreate() { return celt_decoder_create(cmMode, 1, NULL); } int CELTCodec070::encode(CELTEncoder *st, const celt_int16 *pcm, unsigned char *compressed, int nbCompressedBytes) { return celt_encode(st, pcm, NULL, compressed, nbCompressedBytes); } int CELTCodec070::decode_float(CELTDecoder *st, const unsigned char *data, int len, float *pcm) { return celt_decode_float(st, data, len, pcm); } CELTCodec011::CELTCodec011(const QString &celt_version) : CELTCodec(celt_version) { RESOLVE(celt_mode_create); RESOLVE(celt_encoder_create_custom); RESOLVE(celt_decoder_create_custom); RESOLVE(celt_encode_float); RESOLVE(celt_encode); RESOLVE(celt_decode_float); RESOLVE(celt_decode); RESOLVE(celt_strerror); if (bValid) { cmMode = celt_mode_create(SAMPLE_RATE, SAMPLE_RATE / 100, NULL); } } CELTEncoder *CELTCodec011::encoderCreate() { return celt_encoder_create_custom(cmMode, 1, NULL); } CELTDecoder *CELTCodec011::decoderCreate() { return celt_decoder_create_custom(cmMode, 1, NULL); } int CELTCodec011::encode(CELTEncoder *st, const celt_int16 *pcm, unsigned char *compressed, int nbCompressedBytes) { return celt_encode(st, pcm, SAMPLE_RATE / 100, compressed, nbCompressedBytes); } int CELTCodec011::decode_float(CELTDecoder *st, const unsigned char *data, int len, float *pcm) { return celt_decode_float(st, data, len, pcm, SAMPLE_RATE / 100); } mumble-1.3.4/src/mumble/ThemeInfo.h0000664000175000017500000000526214010707273016745 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_THEMEINFO_H_ #define MUMBLE_MUMBLE_THEMEINFO_H_ #include #include #include #include #ifndef Q_MOC_RUN #include #endif class QSettings; class QDir; class ThemeInfo; typedef QMap ThemeMap; /// Description of a Mumble theme with multiple styles class ThemeInfo { public: /// A specific style of a Mumble theme /// /// Multiple styles can for example be used to differentiate light/dark /// variants of a theme. /// /// A single style can refer to multiple run-time platform specific qss /// theme files. class StyleInfo { public: /// Name of the theme containing this style QString themeName; /// Name for the style QString name; /// @return Returns platform specific qss or defaultQss if none available QFileInfo getPlatformQss() const; /// Default QSS file for the style QFileInfo defaultQss; /// Platform specific QSS files available QMap qssFiles; }; typedef QMap StylesMap; /// Takes stock of all mumble themes in the given folders. /// /// If a theme with the same name is available in multiple directories /// only the last occurance will be returned. /// /// @param themesDirectories List of directories to search for theme directories. /// @return Map of theme name to Theme static ThemeMap scanDirectories(const QVector &themesDirectories); /// Takes stock of all mumble themes in the given folder /// /// Uses loadThemeInfoFromDirectory on each directory in the folder /// to find themes. Themes with the same names will override each other. /// /// @param themesDirectory Directory to scan for theme directories /// @return Map of theme name to Theme static ThemeMap scanDirectory(const QDir &themesDirectory); /// Loads the theme description from a given directory /// /// @param themeDirectory /// @return Theme if description was correctly loaded. boost::none if not. static boost::optional load(const QDir &themeDirectory); /// @return Style with given name or default StyleInfo getStyle(QString name_) const; /// Ideally unique theme name. A theme with identical name can override. QString name; /// Style name to style mapping. StylesMap styles; /// Default style QString defaultStyle; }; Q_DECLARE_METATYPE(ThemeInfo); Q_DECLARE_METATYPE(ThemeInfo::StyleInfo); #endif // MUMBLE_MUMBLE_THEMEINFO_H_ mumble-1.3.4/src/mumble/translations.pri0000664000175000017500000000120614010707274020146 0ustar builderbuilder# Do not change manually # Autogenerated by mumble transifex bot TRANSLATIONS = mumble_ar.ts mumble_be.ts mumble_bg.ts mumble_br.ts mumble_cs.ts mumble_cy.ts mumble_da.ts mumble_de.ts mumble_el.ts mumble_en.ts mumble_en_GB.ts mumble_eo.ts mumble_es.ts mumble_eu.ts mumble_fa_IR.ts mumble_fi.ts mumble_fr.ts mumble_gl.ts mumble_he.ts mumble_hi.ts mumble_hu.ts mumble_it.ts mumble_ja.ts mumble_ko.ts mumble_lt.ts mumble_nl.ts mumble_no.ts mumble_pl.ts mumble_pt_BR.ts mumble_pt_PT.ts mumble_ro.ts mumble_ru.ts mumble_sk.ts mumble_sv.ts mumble_te.ts mumble_th.ts mumble_tr.ts mumble_uk.ts mumble_vi.ts mumble_zh_CN.ts mumble_zh_HK.ts mumble_zh_TW.tsmumble-1.3.4/src/mumble/JackAudio.h0000664000175000017500000000413414010707273016716 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_JACKAUDIO_H_ #define MUMBLE_MUMBLE_JACKAUDIO_H_ #include "AudioInput.h" #include "AudioOutput.h" #include #include #define JACK_MAX_OUTPUT_PORTS 2 class JackAudioOutput; class JackAudioInput; class JackAudioSystem : public QObject { private: Q_OBJECT Q_DISABLE_COPY(JackAudioSystem) protected: bool bActive; jack_client_t *client; jack_port_t *in_port; jack_port_t *out_ports[JACK_MAX_OUTPUT_PORTS]; jack_default_audio_sample_t *output_buffer; jack_nframes_t iBufferSize; void allocOutputBuffer(jack_nframes_t frames); void auto_connect_ports(); void disconnect_ports(); static int process_callback(jack_nframes_t nframes, void *arg); static int srate_callback(jack_nframes_t frames, void *arg); static int buffer_size_callback(jack_nframes_t frames, void *arg); static void shutdown_callback(void *arg); public: QHash qhInput; QHash qhOutput; bool bJackIsGood; bool bInputIsGood; bool bOutputIsGood; int iSampleRate; unsigned int iOutPorts; QMutex qmWait; QWaitCondition qwcWait; void activate(); void initializeInput(); void destroyInput(); void initializeOutput(); void destroyOutput(); JackAudioSystem(); ~JackAudioSystem(); }; class JackAudioInput : public AudioInput { friend class JackAudioSystem; private: Q_OBJECT Q_DISABLE_COPY(JackAudioInput) protected: QMutex qmMutex; QWaitCondition qwcWait; public: JackAudioInput(); ~JackAudioInput() Q_DECL_OVERRIDE; void run() Q_DECL_OVERRIDE; }; class JackAudioOutput : public AudioOutput { friend class JackAudioSystem; private: Q_OBJECT Q_DISABLE_COPY(JackAudioOutput) protected: QMutex qmMutex; QWaitCondition qwcWait; public: JackAudioOutput(); ~JackAudioOutput() Q_DECL_OVERRIDE; void run() Q_DECL_OVERRIDE; }; #endif mumble-1.3.4/src/mumble/mumble_de.ts0000664000175000017500000143544714010707274017235 0ustar builderbuilder ACLEditor Deny Verweigern Allow Erlauben Allow %1 %1 erlauben Deny %1 %1 verweigern Mumble - Add channel Mumble - Kanal hinzufügen Default server value Standard Serverwert Failed: Invalid channel Fehlgeschlagen: Ungültiger Kanal Mumble - Edit %1 Mumble - Bearbeite %1 ID: %1 ID: %1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Dies gibt das %1-Recht. Wenn ein Recht sowohl erlaubt als auch verweigert wird, so wird es verweigert.<br />%2 Channel must have a name Der Kanal benötigt einen Namen This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Dies nimmt das %1-Recht. Wenn ein Recht sowohl erlaubt als auch verweigert wird, so wird es verweigert.<br />%2 Dialog Dialog Name Name Enter the channel name here. Geben Sie hier den Kanalnamen ein. Description Beschreibung Password Passwort Enter the channel password here. Geben Sie hier das Kanalpasswort ein. Check to create a temporary channel. Aktivieren Sie dieses Feld um einen temporären Kanal zu erstellen. Temporary Temporär <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br /> Dieser Wert erlaubt es Ihnen die Reihenfolge der Kanäle innerhalb des Baumes festzulegen. Ein Kanal mit einem höheren <i>Positionswert</i> wird immer unter einem Kanal mit einem niedrigeren <i>Positionswert</i> platziert und umgekehrt. Wenn der <i>Positionswert</i> zweier Kanäle gleich ist, dann werden diese ihrem Namen nach alphabetisch sortiert. Position Position &Groups &Gruppen Group Gruppe List of groups Liste von Gruppen Remove selected group Entferne ausgewählte Gruppe Remove Entfernen Inherit group members from parent Erbe Gruppenmitglieder von übergeordneten Kanälen Inherit Erben Make group inheritable to sub-channels Erlaubt, dass Unterkanäle die Gruppe erben können Inheritable Vererbbar Group was inherited from parent channel Gruppe wurde von einem übergeordneten Kanal geerbt Inherited Vererbt Members Mitglieder Add Hinzufügen Add member to group Mitglied zur Gruppe hinzufügen Remove member from group Entferne Mitglied aus der Gruppe &ACL &Berechtigungen Active ACLs Aktive Berechtigungen List of entries Liste von Einträgen Inherit ACL of parent? Berechtigungen von übergeordneten Kanälen erben? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. Dieses Feld legt fest ob die Berechtigung am Anfang von übergeordneten Kanälen geerbt werden. Nur Einträge bei denen die Option "Betrifft Unterkanäle" markiert ist, werden geerbt. Inherit ACLs Berechtigungen erben Move entry up Eintrag nach oben verschieben This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. Dies verschiebt den Eintrag in der Liste nach oben. Da Einträge der Reihenfolge nach ausgewertet werden, könnte dies die effektiven Rechte der Benutzer ändern. Man kann keinen Eintrag über einen geerbten Eintrag verschieben. Sollte dies jedoch notwendig sein, so muss der geerbte Eintrag dupliziert werden. &Up &Hoch Move entry down Eintrag nach unten verschieben This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. Dies verschiebt den Eintrag in der Liste nach unten. Da Einträge der Reihenfolge nach ausgewertet werden, könnte dies die effektiven Rechte der Benutzer ändern. &Down &Runter Add new entry Neuen Eintrag hinzufügen This adds a new entry, initially set with no permissions and applying to all. Dies fügt einen neuen Eintrag hinzu, der Anfangs alle Benutzer betrifft und keine Berechtigungen vergibt. &Add &Hinzufügen Remove entry Eintrag entfernen This removes the currently selected entry. Dies entfernt den aktuell ausgewählten Eintrag. &Remove &Entfernen Context Kontext Entry should apply to this channel. Entry should apply to this channel Eintrag soll für diesen Kanal gelten. This makes the entry apply to this channel. Dies lässt den Eintrag für diesen Kanal gelten. Applies to this channel Betrifft diesen Kanal Entry should apply to sub-channels. Eintrag soll für Unterkanäle gelten. Add new group Neue Gruppe hinzufügen <b>Add</b><br/> Add a new group. <b>Hinzufügen</b><br /> Fügt eine neue Gruppe hinzu. Inherited members Geerbte Mitglieder Contains the list of members added to the group by this channel. Enthält die Liste der zur Gruppe gehörenden Mitglieder in diesem Kanal. Contains a list of members whose group membership will not be inherited from the parent channel. Enthält eine Liste von Mitgliedern, deren Gruppenmitgliedschaft nicht vom übergeordneten Kanal geerbt wird. Contains the list of members inherited by other channels. Enthält die Liste der Mitglieder die von anderen Kanälen geerbt wurden. Type in the name of a user you wish to add to the group and click Add. Geben Sie den Namen des Benutzers ein, der zur Gruppe hinzugefügt werden soll und klicken Sie auf Hinzufügen. Type in the name of a user you wish to remove from the group and click Add. Geben Sie den Namen des Benutzers ein, der aus der Gruppe entfernt werden soll und klicken Sie auf Hinzufügen. Exclude Ausschließen Excluded members Ausgeschlossene Mitglieder This makes the entry apply to sub-channels of this channel. Dies lässt den Eintrag für Unterkanäle gelten. Applies to sub-channels Betrifft Unterkanäle Permissions Rechte User/Group Benutzer/Gruppe Group this entry applies to Gruppe, für die dieser Eintrag gilt User ID Benutzer ID User this entry applies to Benutzer, für den der Eintrag gilt This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. Dieses Feld steuert welchen Benutzer dieser Eintrag betrifft. Geben Sie einen Benutzernamen ein und drücken Sie Enter um die Existenz des Accounts auf dem Server zu überprüfen. &Properties &Eigenschaften <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>Name</b><br />Geben Sie den Kanalnamen in dieses Feld ein. Der Name darf keine vom Server unerlaubten Zeichen enthalten. <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>Temporär</b><br /> Dieses Feld markiert den Kanal als temporär. Das heißt, dass er automatisch gelöscht wird, sobald der letzte Benutzer den Kanal verlässt. <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>Gruppe</b><br /> Dies sind alle für diesen Kanal definierten Gruppen. Um eine neue Gruppe zu erstellen geben Sie einfach deren Namen ein und drücken Enter. <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>Entfernen</b><br />Dies löscht die aktuell ausgewählte Gruppe. Wenn die Gruppe von einem übergeordneten Kanal geerbt wurde, wird sie nicht aus der Liste gelöscht, aber alle lokalen Informationen für diese Gruppe werden entfernt. <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>Erben</b><br />Dies erbt alle Mitglieder der Gruppe von übergeordneten Kanälen, sofern die Gruppe in übergeordneten Kanälen als <i>vererbbar</i> markiert ist. <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>Vererbbar</b><br />Dies macht die Gruppe an Unterkanäle vererbbar. Wenn die Gruppe nicht vererbbar ist können die Unterkanäle trotzdem eine Gruppe mit dem gleichen Namen erstellen. <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>Vererbt</b><br />Dies gibt an, ob die Gruppe von einem übergeordneten Kanal geerbt wurde. Sie können diese Option hier nicht ändern, sie dient nur der Information. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>Mitglieder</b><br /> Diese Liste enthält alle Mitglieder welche der Gruppe in diesem Kanal hinzugefügt wurden. Beachten Sie, dass dies vererbte Mitglieder von höheren Kanälen nicht einschließt. Diese werden in der Liste <i>Vererbte Mitglieder</i> angezeigt. Um zu verhindern, dass diese Liste in Unterkanäle vererbt wird deaktivieren Sie die Option <i>Vererbbar</i> oder fügen Sie die Mitglieder manuell zur Liste <i>Mitglieder ausschließen</i> hinzu. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>Ausgeschlossene Mitglieder</b><br /> Enthält eine Liste von Mitgliedern, deren Gruppenmitgliedschaft nicht vom übergeordneten Kanal geerbt wird. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. <b>Geerbte Mitglieder</b><br /> Enthält die Liste von Mitgliedern, welche vom aktuellen Kanal geerbt wurden. Deaktivieren Sie die Option <i>Erben</i> um zu verhindern, dass von übergeordneten Kanälen geerbt wird. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. Dieses Feld legt fest, für welche Gruppe dieser Eintrag gilt.<br />Beachten Sie, dass diese Gruppe im Kontext des Kanals des Eintrags evaluiert wird. Zum Beispiel gibt die Standardberechtigung der admin-Gruppe im Wurzel-Kanal <i>Schreib</i>rechte. Dieser Eintrag, wenn von einem Kanal geerbt, gibt einem Benutzer Schreibrechte wenn er in diesem Kanal zur <i>admin</i>-Gruppe gehört, selbst wenn er nicht zur <i>admin</i>-Gruppe des Kanals, in welchem die Berechtigung ursprünglich definiert wurde, gehört.<br />Wenn ein Gruppenname mit '!' beginnt, werden seine Mitgliedschaften umgekehrt und wenn sie mit einem '~' beginnt werden die Mitgliedschaften im Kanal, in welchem die Berechtigung definiert wurde, geprüft statt in jenem, in dem die Berechtigung gerade aktiv ist.<br />Wenn ein Gruppenname mit einem '#'-Zeichen beginnt wird dieser als Zugriffscode interpretiert. Benutzer müssen das was hinter dem '#'-Zeichen stehen in ihre Zugriffscode-Liste eingegeben haben um die entsprechende Berechtigung zu erhalten. Dies kann für einen einfachen Passwortschutz, auch für nicht authentifizierte Benutzer, verwendet werden.<br />Wenn ein Gruppenname mit '$' beginnt gilt der Eintrag nur für Benutzer deren Zertifikat-Hash mit dem dem '$'-Zeichen folgenden übereinstimmt.<br />Einige spezielle, vordefinierte Gruppen sind:<br /><b>all</b>: Trifft auf jeden Benutzer zu.<br /><b>auth</b>: Trifft auf alle authentifizierten Benutzer.<br /><b>sub,a,b,c</b>: Benutzer in einem Unterkanal mit mindestens <i>a</i> gemeinsamen übgeordneten Kanälen und zwischen <i>b</i> und <i>c</i> Kanälen dazwischen (zwischen gemeinsamem übergeordneten Kanal und aktuellem Kanal). Auf der Webseite gibt es hierzu eine weiterführende Dokumentation.<br /><b>in</b>: Trifft auf Benutzer im aktuellen Kanal zu (Kurzform für '<i>sub,0,0,0</i>').<br /><b>out</b>: Trifft auf Benutzer die nicht im aktuellen Kanal sind zu (Kurzform für '<i>!sub,0,0,0</i>').<br />Beachten Sie, dass ein Eintrag entweder für einen bestimmten Benutzer oder eine Gruppe zutrifft, nicht für beide gleichzeitig. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. <b>Passwort</b><br />Dieses Feld ermöglicht das Setzen und Entfernen eines Passworts für einen Kanal. Es verwendet im Hintergrund die Zugriffscode-Funktion von Mumble. Verwenden Sie Berechtigungen (ACL) und Gruppen für eine feiner abgestufte und mächtige Zugriffsteuerung. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. Dieses Feld zeigt alle aktiven Einträge in diesem Kanal an. Von übergeordneten Kanälen geerbte Einträge werden kursiv angezeigt.<br />Berechtigungen werden von oben nach unten ausgewertet. Das bedeutet, dass sich die Priorität nach unten hin erhöht. ID of the channel. ID des Kanals. Maximum Users Maximale Nutzer Maximum number of users allowed in the channel Maximale Anzahl an erlaubten Nutzern in diesem Kanal <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. <b>Maximale Benutzer</b><br /> Dieser Wert erlaubt das Einstellen der maximal im Kanal erlaubten Benutzeranzahl. Wenn dieser Wert über Null liegt, wird nur dieser Anzahl an Benutzern das Betreten des Kanals erlaubt sein. Ist der Wert gleich Null, ist die Benutzeranzahl des Kanals durch die Standardbeschränkung des Servers vorgegeben. This is the sort order for the channel. Dies ist die Sortierreihenfolge für den Kanal. ALSAAudioInput Default ALSA Card Standard ALSA-Karte Opening chosen ALSA Input failed: %1 Öffnen des ALSA-Eingabegerätes fehlgeschlagen: %1 ALSAAudioOutput Default ALSA Card Standard ALSA-Karte Opening chosen ALSA Output failed: %1 Öffnen des ALSA-Ausgabegerätes fehlgeschlagen: %1 ASIOConfig %1 (version %2) %1 (Version %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz %1 -> %2 Samples-Puffer mit %3 Sample-Auflösung (%4 bevorzugt) bei %5 Hz ASIO Initialization failed: %1 ASIO-Initialisierung fehlgeschlagen: %1 Failed to instantiate ASIO driver Konnte ASIO-Treiber nicht instanziieren ASIO ASIO Device selection Geräteauswahl Device Gerät Device to use for microphone Mikrofongerät This chooses what device to query. You still need to actually query the device and select which channels to use. Dies wählt das abzufragende Gerät aus. Man muss trotzdem das Gerät abfragen und die zu nutzenden Kanäle auswählen. Query selected device Gewähltes Gerät abfragen This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. Dies fragt das ausgewählte Gerät nach Kanälen ab. Achtung: Viele ASIO-Treiber sind extrem fehlerbehaftet und sie abzufragen könnte die Anwendung oder das System zum Absturz bringen. &Query &Abfragen Configure selected device Ausgewähltes Gerät konfigurieren This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. Dies konfiguriert das ausgewählte Gerät. Achtung: Viele ASIO-Treiber sind extrem fehlerbehaftet und sie abzufragen könnte die Anwendung oder das System zum Absturz bringen. &Configure &Konfigurieren Capabilities Funktionalitäten Driver name Treibername Buffer size Puffergröße This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. Dies konfiguriert die Eingangskanäle für ASIO. Stellen Sie sicher, dass Sie mindestens einen Kanal für Mikrofon und Lautsprecher wählen. <i>Mikrofon</i> sollte jener sein, wo an dem Ihr Mikrofon hängt und <i>Lautsprecher</b> sollte ein Kanal sein, welcher ausgibt '<i>was Sie hören</i>'.<br /> Zum Beispiel wäre für die Audigy 2 ZS '<i>Mic L</i>' eine gute Wahl für Mikrofon und '<i>Mix L</i>' und '<i>Mix R</i>' für Lautsprecher. Configure input channels Eingabekanäle konfigurieren Channels Kanäle Microphone Mikrofon <- <- -> -> Unused Ungenutzt Speakers Lautsprecher ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. Es muss mindestens eine Mikrofon- und eine Lautsprecherquelle ausgewählt sein um ASIO zu nutzen. Wenn Sie lediglich den Mikrofoneingang nutzen wählen Sie DirectSound. Opening selected ASIO device failed. No input will be done. Öffnen des ausgewählten ASIO-Gerätes fehlgeschlagen. Es wird kein Eingang benutzt. AboutDialog About Mumble Über Mumble <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> <h3>Mumble (%1)</h3><p>%3</p><p><b>Ein Sprachchatprogramm für Spieler</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble Ü&ber Mumble &License &Lizenz A&uthors A&utoren &Third-Party Licenses &Drittanbieter-Lizenzen OK OK AudioInput Interface Schnittstelle System System Input method for audio Audio-Eingabemethode <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Dies ist die zu verwendende Audio-Eingabemethode. Device Gerät Input device for audio Audio-Eingabegerät <b>This is the input device to use for audio.</b> <b>Dies ist das zu verwendende Audio-Eingabegerät.</b> Transmission Übertragung &Transmit Über&tragen When to transmit your speech Wann Sprache übertragen werden soll <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. <b>Dies legt fest, wann Sprache übertragen werden soll.</b><br /><i>Kontinuierlich</i> - Die ganze Zeit<br /><i>Sprachaktivität</i> - Sobald man deutlich spricht.</br><i>Push-To-Talk</i> - Wenn die unter Tastenkürzel konfigurierte Taste gedrückt wird. DoublePush Time Doppeldruck-Zeit If you press the PTT key twice in this time it will get locked. Wenn Sie die PTT-Taste (Sprech-Taste) zweimal innerhalb dieser Zeit drücken, wird die Sprachübertragung dauerhaft aktiviert. <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. <b>Doppeldruck-Zeit</b><br />Wenn Sie die PTT-Taste zweimal innerhalb der Doppeldruck-Zeit drücken wird die Sprachübertragung dauerhaft aktiviert. Diese wird beendet wenn sie die Taste ein weiteres mal drücken. Reset audio cue to default Audio-Hinweis auf Standard zurücksetzen <b>Reset</b><br/>Reset the paths for the files to their default. <b>Zurücksetzen</b><br />Setzt die Pfade zu den Dateien auf die Standardwerte zurück. Browse for on audio file Nach einer Datei für den Beginn der Audioübertragung suchen Browse for off audio file Nach einer Datei für das Ende der Audioübertragung suchen Off Aus On An Preview the audio cues Die Audio-Hinweise probeweise abspielen Use SNR based speech detection Benutze SNR basierte Spracherkennung Signal to Noise Signal zu Rauschen <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. <b>Dies legt fest, dass Sprache durch die Amplitude erkannt wird.</b><br />In diesem Modus wird die Stärke des Eingangssignals genutzt um Sprache zu erkennen. Amplitude Amplitude Voice &Hold Stimme &halten How long to keep transmitting after silence Wie lange nach dem Einsetzen von Stille übertragen werden soll Silence Below Stille bis <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. <b>Dies setzt die Auslösewerte für die Spracherkennung.</b><br />Zusammen mit dem Audiostatistik Fenster können die Auslösewerte für die Spracherkennung manuell eingestellt werden. Eingabewerte unter "Stille bis" zählen immer als Stille, Werte über "Sprache über" immer als Sprache. Werte dazwischen zählen als Sprache wenn schon gesprochen wird, lösen aber keine Erkennung (und damit Übertragung) aus. Speech Above Sprache über Signal values above this count as voice Signalwerte darüber zählen als Sprache Compression Kompression &Quality &Qualität Quality of compression (peak bandwidth) Qualität der Kompression (Spitzenbandbreite) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. <b>Dies setzt die Qualität der Kompression.</b><br />Dies bestimmt wieviel Bandbreite Mumble für ausgehendes Audio nutzen darf. Audio per packet Audio pro Paket How many audio frames to send per packet Wieviele Audioframes pro Paket zu senden sind <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>Dies legt fest, wieviele Audioframes in ein Paket gepackt werden sollen.</b><br />Durch Erhöhung steigt die Latenz der Sprache, gleichzeitig sinkt aber der Bandbreitenbedarf. <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). <b>Dies zeigt die Spitze der ausgehenden Bandbreite an.</b><br />Dies zeigt die maximale Bandbreite an, die zum Senden verwendet wurde. Die Audio-Bitrate ist die maximale Bitrate, die für Audio-Daten genutzt wird (maximal da VBR verwendet wird). Position ist die Bitrate für Positionsinformationen. Overhead wird durch das verpacken der Audiodaten in Netzwerkpakete verursacht (75% dieses Overheads enstehen durch die IP- und UDP-Paketheader). Audio Processing Audioverarbeitung Noise Suppression Rauschunterdrückung Noise suppression Rauschunterdrückung <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. <b>Dies setzt die Stärke der Rauschunterdrückung die angewandt werden soll</b><br />Je höher der Wert, desto aggressiver wird Rauschen unterdrückt. Maximum amplification of input sound Maximale Verstärkung des Eingangssignals <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. <b>Maximale Verstärkung des Eingangssignals.</b><br />Mumble normalisiert die Eingangslautstärke vor der Kompression, wobei diese Option festlegt wie sehr verstärkt werden darf.<br />Der tatsächliche Level wird kontinuierlich, abhängig vom Sprachmuster, aktualisiert; allerdings nie höher als hier festgelegt.<br />Wenn die Mikrofonlautstärke in den Audiostatistiken um 100% liegt, sollte man dies auf 2.0 setzen. Für Leute die dies kaum erreichen, muss es deutlich höher angesetzt werden.<br />Idealerweise sollte es folgendermaßen gesetzt werden: <i>Mikrofon Lautstärke * Verstärkungsfaktor >= 100</i>, selbst wenn man wirklich leise spricht.<br />Es ist nicht schädlich dies auf das Maximum zu setzen, aber Mumble wird dadurch auch Umgebungsgeräusche aufnehmen. Current speech detection chance Aktuelle Spracherkennungswahrscheinlichkeit Cancel echo from speakers Unterdrücke das Echo der Lautsprecher Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. Bei Aktivieren dieser Option wird versucht das Echo der Lautsprecher zu unterdrücken. Gemischt hat geringe Auswirkung auf die CPU-Auslastung aber funktioniert nur wenn Ihre Lautsprecher gleich laut und vom Mikrofon gleich weit entfernt sind. Mehrkanal-Echo-Unterdrückung bietet weitaus bessere Echo-Unterdrückung, verbraucht aber mehr CPU-Zeit. Disabled Deaktiviert <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>Dies wählt als Spracherkennungsmechanismus das Signal-zu-Rausch-Verhältnis.</b><br />In diesem Modus werden die eingehenden Audiodaten auf ein klares Signal hin überprüft. Die Klarheit des Signals aktiviert dann die Spracherkennung. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>Dies zeigt die aktuellen Spracherkennungs-Einstellungen an.</b><br />Die Einstellung können im Einstellungsdialog oder dem Audio-Assistenten geändert werden. Signal values below this count as silence Signalwerte darunter zählen als Stille Maximum bandwidth used for sending audio Maximale Bandbreite, die zum Senden von Audiodaten verwendet wird Use Amplitude based speech detection Benutze amplitudenbasierte Spracherkennung <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). <b>Hiermit bestimmen Sie, wie lange nach Beenden des Gesprächs noch übertragen werden soll.</b><br />Höhere Werte sind hilfreich, wenn die Stimme plötzlich abbricht (erkennbar an einem flackerndem Voice-Icon neben dem Namen). Exclusive mode Exklusiv-Modus <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>Öffnet das Gerät im Exklusiv-Modus.</b><br />Keine andere Anwendung wird das Gerät verwenden können. Exclusive Exklusiv R&eset Zurücks&etzen &Browse... &Durchsuchen... B&rowse... D&urchsuchen... &Preview &Vorschau <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. <b>Vorschau</b><br />Spielt den aktuellen <i>An</i> Sound gefolgt vom aktuellen <i>Aus</i> Sound. Displays an always on top window with a push to talk button in it Zeigt ein dauerhaft im Vordergrund liegendes Fenster mit einem Push-To-Talk Button Display push to talk window Zeige Push-To-Talk Fenster Misc Verschiedenes Audible audio cue when starting or stopping to transmit Tonhinweise bei Beginn und Ende einer Übertragung <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. <b>Dies aktiviert Tonhinweise bei der Übertragung.</b><br />Man hört ein kurzes Piepen beim Beginn und Ende der Sprachübertragung. Audio cue Tonhinweise Gets played when starting to transmit Wird abgespielt, wenn die Sprachübertragung beginnt Gets played when stopping to transmit Wird abgespielt, wenn die Sprachübertragung endet Hold Time Haltezeit Time the microphone stays open after the PTT key is released Zeit, die das Mikrofon aktiv bleibt, nachdem die PTT-Taste losgelassen wurde Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) Maximale Netzwerkbandbreite des Servers beträgt nur %1 kbit/s. Audioqualität wurde automatisch auf %2 kbit/s (%3 ms) angepasst Max. Amplification Max. Verstärkung Idle action Aktion bei Untätigkeit minutes do Minuten führe aus nothing nichts deafen taub stellen mute stumm stellen after nach Echo Cancellation Echounterdrückung Mixed echo cancellation Gemischte Echounterdrückung Multichannel echo cancellation Mehrkanal Echounterdrückung The idle action will be reversed upon any key or mouse button input Die Leerlauf-Aktion wird rückgängig gemacht, die auf eine beliebige Taste oder Maus-Tasten Aktion Undo Idle action upon activity Leerlauf Aktion nach Tätigkeit rückgängig machen Apply RNNoise's noise suppression filter. Rauschunterdrückungsfilter von RNNoise anwenden. <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. <b>Dies wendet den Rauschunterdrückungsfilter von RNNoise an.</b><br />RNNoise basiert auf maschinellem Lernen und wird in WebRTC verwendet. RNNoise RNNoise Audio input AudioInputDialog Continuous Kontinuierlich Voice Activity Sprachaktivierung Push To Talk Push-To-Talk Audio Input Audioeingabe %1 ms %1 ms Off Aus %1 s %1 s %1 kb/s %1 kb/s -%1 dB -%1 dB %1 kbit/s (Audio %2, Position %4, Overhead %3) %1 kbit/s (Audio %2, Position %4, Overhead %3) AudioOutput Interface Schnittstelle System System Output method for audio Audio-Ausgabemethode <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Dies ist die Audio-Ausgabemethode die verwendet werden soll. Device Gerät Output device for audio Audio-Ausgabegerät <b>This is the output device to use for audio.</b> <b>Dies ist das Audio-Ausgabegerät.</b> Positional Audio Positionsabhängiges Audio Audio Output Audioausgabe Default &Jitter Buffer Standard &Jitter-Puffer Safety margin for jitter buffer Sicherheitsgrenze für den Jitter-Puffer <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. <b>Dies legt die minimale Sicherheitsgrenze für den Jitter-Puffer fest.</b><br />Eingehende Sprachdaten werden gepuffert und der Jitter-Puffer versucht den Puffer so klein wie möglich zu halten so dass die Latenz so gering wie möglich sein kann. Dies legt die minimale Puffergröße fest. Falls sich der Anfang eines Satzes unterbrochen anhört, erhöhen Sie diesen Wert. Minimum distance to user before sound volume decreases Minimale Distanz zu einem Benutzer bevor die Lautstärke abnimmt This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. Dies setzt die minimale Distanz für Klangberechnungen fest. Die Lautstärke anderer Benutzer wird nicht sinken, so lange Sie nicht mindestens so weit entfernt sind. This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. Dies setzt die maximale Distanz für Klangberechnungen fest. Die Lautstärke anderer Benutzer wird nicht mehr sinken, wenn sie weiter entfernt sind. <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. <b>Dies aktiviert einen der Rückkopplungs-Testmodi.</b><br /><i>Keine</i> - Rückkopplung deaktiviert<br /><i>Lokal</i> - Emuliere einen lokalen Server.<br/><i>Server</i> - Rückkopplung vom Server (Anfrage).<br/>Bitte beachten Sie, dass, so lange die Rückkopplung aktiv ist, Sie kein anderer Benutzer hören kann. Diese Einstellung wird beim Beenden des Programms nicht gespeichert. Volume Lautstärke Volume of incoming speech Lautstärke der ankommenden Sprache <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. <b>Dies legt die Lautstärke der eingehenden Sprache fest.</b><br />Beachten Sie, dass bei einem Wert über 100% die Geräusche verzerrt werden. Output Delay Ausgabeverzögerung Amount of data to buffer Datenmenge die gepuffert werden soll The connected "speakers" are actually headphones The connected "speakers" are actually headphones. Die angeschlossenen Audioausgabe-Geräte sind Kopfhörer Factor for sound volume decrease Faktor zur Lautstärkensenkung Bloom Bloom Factor for sound volume increase Faktor zur Lautstärkenerhöhung How much should sound volume increase for sources that are really close? Um wie viel soll die Lautstärke für Quellen erhöht werden, die sehr nah sind? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. Ist dies aktiviert bedeutet dies, dass keine Lautsprecher angeschlossen sind, sondern nur Kopfhörer. Dies ist wichtig, da Lautsprecher für gewöhnlich vor Ihnen sind, während Kopfhörer direkt links und rechts anliegen. This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Dies setzt die Menge an Daten, welche im Ausgabepuffer vorgepuffert wird. Experimentieren Sie mit verschiedenen Werten und nehmen Sie den niedrigsten, welcher kein schnelles Zittern im Ton produziert. Headphones Kopfhörer Minimum Distance Minimale Distanz Maximum Distance Maximale Distanz Maximum distance, beyond which speech volume won't decrease Maximale Distanz zum Benutzer, hinter der seine Lautstärke nicht mehr geringer wird Minimum Volume Minimale Lautstärke What should the volume be at the maximum distance? Wie hoch soll die Lautstärke bei maximaler Distanz sein? Loopback Test Rückkopplungs-Test Delay Variance Verzögerungsvarianz Variance in packet latency Varianz der Paketlatenz <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>Dies legt die Varianz der Paketlatenz für den Rückkopplungs-Test fest.</b><br/>Die meisten Audiopfade haben eine variable, sich ständig Ändernde Latenz. Hiermit können Sie die Varianz für den Rückkopplungs-Test festlegen. Falls Sie dies zum Beispiel auf 15ms setzen, wird ein Netzwerk mit 20-35ms oder eines mit 80-95ms Latenz immitiert. Die meisten Netzverbindungen haben eine Varianz von etwa 5ms. Packet Loss Paketverlust Packet loss for loopback mode Paketverlust für den Rückkopplungs-Modus <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% <b>Dies legt den Paketverlust für den Rückkopplungs-Modus fest.</b><br />Dies ist das Verhältnis an verlorenen Paketen. Solange Ihre Ausgangsbandbreite nicht an ihre Grenze stößt oder etwas mit Ihrer Netzwerkverbindung nicht stimmt, wird dieser 0% betragen &Loopback &Rückkopplung Desired loopback mode Gewünschter Rückkopplungs-Modus Attenuate applications by... Anwendungslautstärken herabsetzen um… Attenuation of other applications during speech Lautstärkedämpfung anderer Anwendungen während des Sprechens <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. <b>Lautstärke anderer Anwendungen dämpfen während gesprochen wird</b><br/> Mumble unterstützt das Herabsetzen der Lautstärke anderer Anwendungen während ein- und/oder ausgehendem Sprechen. Dieser Regler legt die Höhe der Herabsenkung der Lautstärke der anderen Anwendungen fest, wenn die Funktion aktiviert ist. If checked Mumble lowers the volume of other applications while other users talk Vermindert die Lautstärke anderer Anwendungen während andere sprechen <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. <b>Lautstärke anderer Anwendungen herabsetzen während andere Benutzer sprechen</b><br/> Mumble unterstützt das Herabsetzen der Lautstärke anderer Anwendungen während ein- und/oder ausgehendem Sprechen. Dies lässt Mumble diese Funktion für das Sprechen anderer Benutzer zu ihnen aktivieren. while other users talk Während andere Benutzer sprechen If checked Mumble lowers the volume of other applications while you talk Vermindert die Lautstärke anderer Anwendungen während Sie sprechen <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. <b>Lautstärke anderer Anwendungen herabsetzen während Sie sprechen</b><br/> Mumble unterstützt das Herabsetzen der Lautstärke anderer Anwendungen während ein- und/oder ausgehendem Sprechen. Dies aktiviert diese Funktion für wenn Sie sprechen. while you talk Während Sie sprechen Exclusive mode, not recommended. Exklusiv-Modus, nicht empfohlen. <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>Verwendet das Gerät im Exklusiv-Modus.</b><br />Keine andere Anwendung wird das Gerät verwenden können. Exclusive Exklusiv Priority Speaker Bevorzugter Sprecher If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. Wenn aktiviert wird die Lautstärke von anderen Benutzern herabgesetzt während man den "Bevorzugter Sprecher"-Status hat. <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. <b>Schwäche andere Benutzer ab, wärend mit dem Status bevorzugter Sprecher gesprochen wird.</b><br />Mumble unterstützt das Herabsetzen der Lautstärke anderer Benutzer während man selbst als <i>bevorzugter Sprecher</i> spricht, um nicht gestört zu werden. Ein hier gesetzter Haken aktiviert diese Funktion. Attenuate other users while talking as Priority Speaker. Andere Benutzer leiser werden lassen während man als Bevorzugter Sprecher spricht. Advanced Attenuation Options Erweiterte Dämpfungsoptionen If checked, Mumble will only attenuate applications that are using the same output source as Mumble Wenn ausgewählt, wird Mumble nur die Lautstärke von Anwendungen herabsetzen, die das gleiche Ausgabegerät wie Mumble benutzen. <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. <b>Nur Anwendungen mit demselben Ausgabegerät wie Mumble abschwächen</b><br />Wenn ausgewählt, werden Anwendungen mit einem anderen Ausgabegerät als Mumble nicht abgeschwächt. Only attenuate applications using the same output device Nur die Lautstärke von Anwendungen herabsetzen, die das gleiche Ausgabegerät wie Mumble benutzen If checked, PulseAudio loopback modules will be attenuated Wenn ausgewählt wird die Lautstärke von PulseAudio Rückkopplungsmodule herabgesetzt <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. <b>PulseAudio Loopback-Module abschwächen</b><br />Wenn Loopback-Module mit Mumbles Ausgabegerät verbunden sind, werden auch diese abgeschwächt. Attenuate PulseAudio loopback modules Lautstärke von PulseAudio Rückkopplungsgeräten herabsetzen Audio output AudioOutputDialog None Keine Local Lokal Server Server Audio Output Audioausgabe %1 ms %1 ms %1 % %1 % %1 m %1 m AudioOutputSample Choose sound file Wählen Sie eine Sounddatei Invalid sound file Ungültige Sounddatei The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. Die Datei '%1' kann nicht in Mumble verwendet werden. Bitte wählen Sie eine Datei mit kompatiblem Format und Kodierung. AudioStats >1000 ms >1000ms >1000 ms Audio Statistics Audiostatistiken Input Levels Eingangspegel Peak microphone level Spitzen Mikrofonpegel Peak power in last frame Spitzenpegel im letzten Paket This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. Dies zeigt den Spitzenpegel im letzten Paket (20ms) an und zeigt was üblicherweise auch "Eingangspegel" genannt wird. Bitte ignorieren Sie diesen Wert und sehen Sie sich stattdessen <b>Mikrofonpegel</b> an, was deutlich stabiler ist und Ausreißer verwirft. Peak speaker level Spitzen Lautsprecherpegel This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. Dies zeigt den Spitzenpegel des Lautsprechers im letzten Paket (20ms) an. Solange keine Multikanal-Sampling-Methode (wie ASIO) genutzt wird, wird dieser Wert 0 sein. Verwenden Sie jedoch eine solche Anordnung und der Wert ist beim abspielen von Audio in anderen Programmen trotzdem 0 so arbeitet die Einstellung nicht korrekt. Peak clean level Gesäuberter Spitzenpegel This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. Dies zeigt den Spitzenwert des letzten Frames (20 ms) nach der kompletten Verarbeitung. Idealerweise sollte dies -96 dB sein, wenn Sie nicht sprechen. In der Realität sollte ein Tonstudio -60 dB und Sie hoffentlich in etwa -20 dB sehen. Wenn Sie sprechen sollte dieser Wert auf ungefähr -5 bis -10 dB steigen.<br />Wenn Sie Echounterdrückung verwenden und der Wert auf über -15 dB steigt wenn Sie sind Einstellungen oder Hardware fehlerhaft und Sie werden andere Benutzer mit Echos stören. Signal Analysis Signalanalyse Microphone power Mikrofonpegel How close the current input level is to ideal Wie nah der aktuelle Eingangspegel am Idealwert ist This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. Dieser Wert zeigt wie nah die aktuelle Eingangslautstärke am Ideal ist. Um den Mikrofonpegel anzupassen, öffnen Sie ein Programm mit welchem sie ihre Aufnahmelautstärken verändern können und schauen Sie hier auf den Wert während Sie reden.<br /><b>Sprechen Sie so laut, als wären Sie über etwas verärgert.</b><br />Passen Sie die Lautstärke an, bis der Wert nahe der 100% ist, aber nicht darüber hinaus. Sollte der Wert darüber steigen werden vermutlich Teile ihrer Sprache abgeschnitten, was die Soundqualität stark beeinträchtigt. Signal-To-Noise ratio Signal-Rausch-Verhältnis Signal-To-Noise ratio from the microphone Signal-Rausch-Verhältnis des Mikrofons This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. Dies ist das Signal-Rausch-Verhältnis (SRV) des Mikrofons im letzten Paket (20ms). Es zeigt an, um wie viel stärker die Stimme im Vergleich zum Hintergrundrauschen ist.<br />Ist der Wert unter 1.0 gibt es mehr Geräusche als Stimme im Signal, weshalb die Qualität reduziert ist.<br />Es gibt keine Obergrenze, aber ein Wert über 40-50 kann ohne Tonstudio nicht erwartet werden. Speech Probability Sprachwahrscheinlichkeit Probability of speech Sprachwahrscheinlichkeit This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). Dies ist die Wahrscheinlichkeit, dass das letzte Paket (20ms) Sprache und kein Umgebungsgeräusch war.<br />Die Sprachaktivitätserkennung hängt von der Korrektheit dieses Wertes ab. Der Trick ist, dass die Mitte eines Satzes immer als Sprache erkannt wird; problematisch sind Pausen zwischen Wörtern und der Anfang des Satzes. Es ist schwierig ein Seufzen von einem mit 'h' beginnenden Wort zu unterscheiden.<br />Ist dieser Text fett geschrieben, bedeutet dies, dass Mumble gerade überträgt (falls Sie verbunden sind). Configuration feedback Konfigurations-Rückmeldung Current audio bitrate Aktuelle Audio Bitrate Bitrate of last frame Bitrate des letzten Paketes DoublePush interval DoppelDruck Intervall Time between last two Push-To-Talk presses Zeit zwischen den beiden letzten Push-To-Talk-Betätigungen Speech Detection Spracherkennung Current speech detection chance Aktuelle Spracherkennungswahrscheinlichkeit <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>Dies zeigt die aktuellen Spracherkennungs-Einstellungen an.</b><br />Diese Einstellungen können im Einstellungsdialog oder dem Audio-Assistenten geändert werden. Signal and noise power spectrum Signal- und Rauschleistungsspektrum Power spectrum of input signal and noise estimate Leistungsspektrum des Eingangssignals und Rauschabschätzung This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. Dieses Diagramm zeigt das Leistungsspektrum des Eingangssignals (rote Linie) und die aktuelle Rauschabschätzung (blau gefüllt) an.<br />Alle Amplituden werden mit 30 multipliziert um anzuzeigen wie viel mehr Signal als Rauschen im Frequenzband vorhanden ist.<br />Dies ist vermutlich nur von Interesse, wenn man die Rauschbedingungen des Mikrofones präzise einstellt. Unter guten Voraussetzungen sollte nur eine winzige blaue Stelle unten zu sehen sein. Ist mehr als die Hälfte des Graphen blau, hat man eine ungünstige Geräuschkulisse. Echo Analysis Echo Analyse Weights of the echo canceller Gewichte des Echounterdrückers This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. Dieses Diagramm zeigt die Gewichte des Echounterdrückers mit der Zeit nach unten und der Frequenz nach rechts wachsend.<br />Idealerweise sollte das Diagramm schwarz sein, also kein Echo existieren. Normalerweise hat man einen oder mehrere horizontale Streifen von blauer Farbe, die das zeitverzögerte Echo darstellen. Sie sollten sehen können, wie die Gewichte in Echtzeit aktualisiert werden.<br />Solange keine Echoquelle vorhanden ist werden Sie hier keine nützlichen Daten sehen. Spielen Sie deshalb z.B. Musik ab um das Diagramm zu stabilisieren.<br />Sie können zwischen Real- und Imaginäranteilen der Frequenzdomänen-Gewichte, oder alternativ dem berechneten Modulus und der Phase auswählen. Am nützlichsten ist hierbei Modulus, dieser ist die Amplitude des Echos und zeigt an wieviel vom ausgehenden Signal bei diesem Zeitschritt entfernt wird. Die anderen Ansichten sind nützlich für diejenigen die den Echoauslöschungs-Algorithmus feinjustieren wollen.<br />Achtung: Wenn das Gesamtbild im Modulus-Modus massiv fluktuiert, kann der Echoauslöscher keine Korrelation zwischen den beiden Eingangsquellen (Lautsprecher und Mikrofon) herstellen. Entweder Sie haben eine sehr lange Verzögerung des Echos oder eine der Eingangsquellen ist falsch konfiguriert. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. Dies ist die Audiobitrate des letzten komprimierten Paketes (20ms). Aus diesem Grund springt sie auf und ab während die VBR die Qualität anpasst. Die Spitzenbandbreite kann in den Einstellungen angepasst werden. AudioWizard Audio Tuning Wizard Audio Einstellungs-Assistent Introduction Einführung Welcome to the Mumble Audio Wizard Willkommen zum Mumble Audio-Assistenten Finished Fertig Enjoy using Mumble Viel Spaß mit Mumble Device selection Geräteauswahl Selecting the input and output device to use with Mumble. Wählen Sie das Eingabe- und Ausgabegerät aus, welches Mumble verwenden soll. This is the device your microphone is connected to. Dies ist das Gerät, mit dem ihr Mikrofon verbunden ist. System System Input method for audio Eingabemethode für Audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Dies ist die Eingabemethode für Audio.</b><br />Am wahrscheinlichsten sollte DirectSound ausgewählt werden. Device Gerät Input device to use Eingabegerät <b>Selects which sound card to use for audio input.</b> <b>Wählen Sie, welche Soundkarte für Audioeingaben verwendet werden soll.</b> Cancel echo from headset or speakers Unterdrücke das Echo des Headsets oder der Lautsprecher Use echo cancellation Benutze Echounterdrückung This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. Dies aktiviert die Echo-Unterdrückung für ausgehende Audio-Signale, was sowohl bei Lautsprechern wie auch Headsets hilft. This is the device your speakers or headphones are connected to. Dies ist das Gerät, an welches ihre Lautsprecher oder Kopfhörer angeschlossen sind. Output method for audio Ausgabemethode für Audio <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Dies ist die Ausgabemethode für Audio.</b><br />Am wahrscheinlichsten sollte DirectSound ausgewählt werden. Output device to use Ausgabegerät <b>Selects which sound card to use for audio Output.</b> <b>Wählen Sie, welche Soundkarte für Audioausgaben verwendet werden soll.</b> Enable positional audio Positionsabhängiges Audio aktivieren Allows positioning of sound Allows positioning of sound. Erlaubt die Positionierung der Audio-Signale <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> <p> Dies ist Mumbles Assistent zum konfigurieren Ihrer Audio-Einstellungen. Er wird Ihnen helfen die korrekte Eingangslautstärke Ihrer Soundkarte und die korrekten Parameter für die Tonverarbeitung in Mumble zu wählen. </p> <p> Bitte beachten Sie, dass, so lange dieser Assistent aktiv ist, der Ton lokal ausgegeben wird damit Sie ihn hören können und kein Ton an den Server gesendet wird. </p> Input Device Eingabegerät Output Device Ausgabegerät This allows Mumble to use positional audio to place voices. Die Option erlaubt Mumble positionsabhängiges Audio zu verwenden um Stimmen zu platzieren. <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> <p> Um die Latenz (Übertragungsverzögerung) auf einem absoluten Minimum zu halten ist es wichtig so wenig Ton wie möglich auf der Soundkarte zwischenzuspeichern (auch “puffern” genannt). Leider geben viele Soundkarten an mit geringeren Puffern zu funktionieren, als Sie tatsächlich unterstützen. Daher müssen Sie selbst den optimalen Wert durch ausprobieren finden. </p> <p> Sie sollten eine Beispielaufnahme hören. Ändern Sie den Schieberegler zum niedrigst möglichen Wert, welcher noch <b>keine</b> Unterbrechungen oder Tonstörungen verursacht. Bitte beachten Sie, dass die lokale Wiedergabe Ihrer Aufnahmegeräte für diesen Test deaktiviert ist. </p> Amount of data to buffer Menge an Daten die gepuffert werden sollen This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Dies setzt die Menge an Daten, welche im Ausgabepuffer vorgepuffert werden. Experimentieren Sie mit verschiedenen Werten und setzen Sie ihn auf den niedrigsten, bei dem keine Tonstörungen auftreten. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> <p> Öffnen Sie Ihre Ton-Einstellungen (des Betriebssystems oder Ihrer Soundkarte) und wechseln Sie zu den Aufnahme-Einstellungen. Stellen Sie sicher, dass das Mikrofon als aktives Aufnahmegerät gewählt ist und mit maximaler Lautstärke aufnimmt. Sofern es eine Option für “Mikrofon-Boost” gibt stellen Sie sicher, dass diese ebenfalls gewählt ist (Diese Option finden Sie ggf. unter den erweiterten Einstellungen). </p> <p> Sprechen Sie so laut als wären Sie wütend oder aufgeregt. Verringern Sie die Mikrofonlautstärke in Ihren Ton-Einstellungen so weit, dass der Balken unten so weit oben wie möglich im blauen und grünen, aber <b>nicht</b> im roten Bereich ist, so lange Sie sprechen. </p> Positional Audio Positionsabhängiges Audio Adjusting attenuation of positional audio. Einstellen der Lautstärkenverminderung positionsabhängiger Audio-Signale. <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> <p> Mumble unterstützt für manche Spiele positionsabhängigen Ton und kann die Stimmen der anderen Benutzer entsprechend Ihrer relativen Position zu Ihnen im Spiel positionieren. Je nach ihrer Position wird die Lautstärke und die Position der Stimmen angepasst um die Richtung und Distanz von ihnen zu simulieren. Eine solche Positionierung benötigt eine korrekte Lautsprechereinstellung in Ihrem Betriebssystem. Deshalb wird dies hier getestet. </p> <p> Die untenstehende Grafik zeigt die Position von <font color="red">Ihnen</font>, den <font color="yellow">Lautsprechern</font> und einer <font color="green">sich bewegenden Tonquelle</font> von oben betrachtet. Sie sollten den Ton sich zwischen den Kanälen bewegen hören. </p> Use headphones instead of speakers Benutze Kopfhörer anstatt Lautsprechern <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> <p> Herzlichen Glückwunsch. Sie sollten Mumble nun optimal benutzen können. </p> <p> Mumble wird ständig weiterentwickelt! Das Entwicklungsteam möchte sich auf Funktionen konzentrieren, welche den meisten Benutzern von Vorteil sind, deshalb kann Mumble anonyme Statistiken über Ihre Konfiguration an die Entwickler senden. Diese Statistiken sind grundlegend für die weitere Entwicklung und stellen sicher, dass jene Funktionen die Sie verwenden nicht wegfallen. </p> Use headphones Benutze Kopfhörer This ignores the OS speaker configuration and configures the positioning for headphones instead. Dies ignoriert die Betriebssystem Lautsprechereinstellungen und konfiguriert die Positionierung stattdessen für Kopfhörer. Volume tuning Lautstärken-Einstellung Tuning microphone hardware volume to optimal settings. Mikrofonhardware-Lautstärke auf optimalen Wert einstellen. Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. Sprechen Sie jetzt so laut, als würden Sie spät nachts sprechen und niemanden stören wollen. Bewegen Sie den Schieber so, dass der Balken im Grünen ist während Sie sprechen, aber im Blauen bleibt wenn Sie nichts sagen. Voice Activity Detection Sprachaktivitätserkennung Letting Mumble figure out when you're talking and when you're silent. Lassen Sie Mumble herausfinden wann Sie sprechen und wann nicht. This will help Mumble figure out when you are talking. The first step is selecting which data value to use. Dies wird Mumble helfen herauszufinden, wann Sie sprechen. Der erste Schritt ist den zu benutzenden Datenwert auszuwählen. Raw amplitude from input Rohamplitude der Eingabe Signal-To-Noise ratio Signal-Rausch-Verhältnis Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Als nächstes müssen Sie den folgenden Schieber anpassen. Die ersten paar Geräusche die Sie beim Sprechen machen sollten im grünen Bereich (definitv Sprache) landen. Während Sie sprechen sollten Sie im gelben Bereich (könnte Sprache sein) bleiben und wenn Sie nicht sprechen, sollte alles im roten Bereich (definitiv keine Sprache) bleiben. Device tuning Geräte-Einstellungen Changing hardware output delays to their minimum value. Setze Hardware Ausgabeverzögerungen auf ein Minimum. Submit anonymous statistics to the Mumble project Sende anonyme Statistiken an das Mumble Projekt Push To Talk: Push-To-Talk: Quality & Notifications Qualität & Hinweise Adjust quality and notification settings. Qualitätseinstellungen und Meldungen anpassen. Quality settings Qualitätseinstellungen Low Niedrig Balanced Ausgeglichen Notification settings Benachrichtigungen Use Text-To-Speech to read notifications and messages to you. Verwende Text-Zu-Sprache um Meldungen vorzulesen. Disable Text-To-Speech and use sounds instead. Text-zu-Sprache deaktivieren und Sounds benutzen. %1 ms %1 ms Enables attenuation of other applications while users talk to you Aktiviert die Abschwächung anderer Anwendungen während Sie sprechen Attenuate applications while other users talk Schwächt Anwendungen ab während andere Benutzer sprechen High Hoch Custom Benutzerdefiniert You already set a customized quality configuration in Mumble. Select this setting to keep it. Sie haben bereits angepasste Qualitätseinstellungen in Mumble. Mit dieser Einstellungen behalten Sie sie. Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. Aktiviert die Herabsetzung der Lautstärke anderer Anwendungen während andere Benutzer zu Ihnen sprechen. Das heißt sobald jemand in Mumble zu Ihnen spricht wird die Lautstärke aller anderen Programme (etwa einem Musik-/Mediaplayer) herabgesetzt, damit Sie die zu Ihnen sprechende Person besser verstehen können. Apply some high contrast optimizations for visually impaired users Auf hohen Kontrast optimierte Darstellung für sehbehinderte Benutzer verwenden Use high contrast graphics Anzeigen mit hohem Kontrast verwenden Keep custom Text-To-Speech settings. Derzeitige Text-Zu-Sprache-Einstellungen beibehalten. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode <p> Öffnen Sie Ihre Ton-Einstellungen (des Betriebssystems oder Ihrer Soundkarte) und wechseln Sie zu den Aufnahme-Einstellungen. Stellen Sie sicher, dass das Mikrofon als aktives Aufnahmegerät gewählt ist und mit maximaler Lautstärke aufnimmt. Sofern es eine Option für “Mikrofon-Boost” gibt stellen Sie sicher, dass diese ebenfalls gewählt ist (Diese Option finden Sie ggf. unter den erweiterten Einstellungen). </p> <p> Sprechen Sie so laut als wären Sie wütend oder aufgeregt. Verringern Sie die Mikrofonlautstärke in Ihren Ton-Einstellungen so weit, dass der Balken unten so weit oben wie möglich im gestreiften und leeren, aber <b>nicht</b> im karierten Bereich ist während Sie sprechen. </p> Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode Sprechen Sie jetzt so laut, als würden Sie spät nachts sprechen und niemanden stören wollen. Bewegen Sie den Schieber so, dass der Balken im leeren Bereich ist während Sie sprechen, aber im gestreiften Bereich bleibt wenn Sie nichts sagen. Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode Als nächstes müssen Sie den folgenden Schieber anpassen. Die ersten paar Geräusche die Sie beim Sprechen machen sollten im leeren Bereich (definitiv Sprache) landen. Während Sie sprechen sollten Sie im gestreiften Bereich (könnte Sprache sein) bleiben und wenn Sie nicht sprechen, sollte alles im karierten Bereich (definitiv keine Sprache) bleiben. In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) Mit dieser Einstellung verwendet Mumble eine <b>geringe Bandbreite</b>. Dies ergibt eine hohe Latenz und geringe Qualität. Verwenden sie diese Einstellung nur wenn ihre Verbindung mit anderen Einstellungen nicht klarkommt. (16kbit/s, 60ms pro Paket) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) Dies ist die <b>empfohlene</b> Standardeinstellung. Sie liefert eine gute Balance zwischen Qualität, Latenz und Bandbreitennutzung. (40 kbit/s, 20 ms pro Paket) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) Diese Einstellung wird nur empfohlen wenn genügend Bandbreite vorhanden ist, z.B. in einem LAN. Sie bietet die geringste Latenz die von Mumble unterstützt wird und <b>hohe Qualität</b>. (72kbit/s, 10ms pro Paket) BanEditor Mumble - Edit Bans Mumble - Bannliste bearbeiten &Address &Adresse &Mask &Maske Reason Begründung Start Start End Ende User Benutzer Hash Hash &Add &Hinzufügen &Update &Aktualisieren &Remove &Entfernen Ban List Ban Liste Search field Suchfeld This is the search field. Use it to find bans that have this username set in the username field. Dies ist das Suchfeld. Benutze es um nach Bans über Benutzernamen zu suchen. Who are you looking for? Wen suchen Sie? No nickname Kein Spitzname IP address IP Adresse No IP address Keine IP Adresse Reason for the ban Begründung für den Ban No reason Keine Begründung Ban end date Enddatum des Bans Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). Enddatum des Bans. Wenn Sie das selbe Datum für Start und Ende setzen, dann ist der Ban permanent gültig (läuft nicht ab). Certificate hash Zertifikatsprüfsumme No certificate hash Keine Zertifikatsprüfsumme Banned users Gebannte Benutzer This is a list with banned users. Dies ist eine Liste der gebannten Benutzer. Use this button if you want to add a new ban. Benutzen Sie diesen Knopf um einen neuen Bann hinzuzufügen. Use this button if you want to update ban information. Benutzen Sie diesen Knopf, um Banninformationen zu aktualisieren. Use this button if you want to remove user from the ban list. Benutzen Sie diesen Knopf, um den Benutzer von der Bannliste zu entfernen. Clear all fields Alle Felder leeren This button clears all fields. Use it if you want to add a new ban. Dieser Knopf leert alle Felder. Benutzen Sie ihn, um einen neuen Bann hinzuzufügen. Clear Leeren Ban List - %n Ban(s) Bannliste - %n BannBannliste - %n Bann(s) CertView Name Name Email E-Mail Issuer Aussteller Expiry Date Verfallsdatum (none) (keiner) Self-signed Selbst signiert CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. E-Mail-Adresse konnte nicht validiert werden.<br /> Geben Sie eine korrekte (oder leere) E-Mail-Adresse an um fortzufahren. There was an error generating your certificate.<br />Please try again. Beim generieren Ihres Zertifikats ist ein Fehler aufgetreten.<br />Bitte versuchen Sie es erneut. Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. Ihr Zertifikat und der Schlüssel konnten nicht in das Format PKCS#12 exportiert werden. Ihr Zertifikat könnte einen Fehler enthalten. The file could not be opened for writing. Please use another file. Die Datei konnte nicht zum Schreiben geöffnet werden. Bitte verwenden Sie eine andere Datei. The file's permissions could not be set. No certificate and key has been written. Please use another file. Dateiberechtigungen konnten nicht gesetzt werden. Zertifikat und Schlüssel wurden nicht geschrieben. Bitte verwenden Sie eine andere Datei. The file could not be written successfully. Please use another file. Die Datei konnte nicht beschrieben werden. Bitte verwenden Sie eine andere Datei. The file could not be opened for reading. Please use another file. Die Datei konnte nicht zum Lesen geöffnet werden. Bitte verwenden Sie eine andere Datei. The file is empty or could not be read. Please use another file. Die Datei ist leer oder konnte nicht gelesen werden. Bitte verwenden Sie eine andere Datei. The file did not contain a valid certificate and key. Please use another file. Die Datei enthielt kein gültiges Zertifikat und Schlüssel. Bitte verwenden Sie eine andere Datei. Select file to export certificate to Wählen Sie eine Datei, in welche das Zertifikat exportiert werden soll Select file to import certificate from Wählen Sie eine Datei, aus welcher ein Zertifikat importiert werden soll Unable to import. Missing password or incompatible file type. Fehler beim Import. Fehlendes Passwort oder inkompatibler Dateityp. <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. <b>Ablauf des Zertifikats:</b> Ihr Zertifikat wird bald ablaufen. Sie müssen es erneuern oder Sie werden nicht mehr in der Lage sein sich auf Server zu verbinden auf denen Sie registriert sind. Certificates Certificate Management Zertifikat-Management Certificate Authentication Zertifikat Authentifikation Authenticating to servers without using passwords Gegenüber Servern ohne Passwort authentifizieren Current certificate Aktuelles Zertifikat This is the certificate Mumble currently uses. Dies ist das Zertifikat, welches Mumble momentan verwendet. Current Certificate Aktuelles Zertifikat Create a new certificate Neues Zertifikat erstellen This will create a new certificate. Hiermit wird ein neues Zertifikat erstellt. Import certificate from file Zertifikat aus einer Datei importieren This will import a certificate from file. Hiermit wird ein Zertifikat aus einer Datei importiert. Import a certificate Zertifikat importieren Export Certificate Zertifikat exportieren This will export a certificate to file. Hiermit wird ein Zertifikat in eine Datei exportiert. Export current certificate Aktuelles Zertifikat exportieren Import Certificate Zertifikat importieren PKCS #12 Certificate import PKCS#12-Zertifikat Import <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p> Mumble kann Zertifikate, welche im PKCS#12-Format gespeichert sind, importieren. Dieses Format wird beim exportieren eines Schlüssels aus Mumble verwendet, genauso wie beim exportieren von Schlüsseln aus FireFox, dem Internet Explorer, Opera usw. </p> <p> Wenn die Datei passwortgeschützt ist benötigen Sie dieses, um das Zertifikat zu importieren. </p> Import from Importieren aus Filename to import from Datei aus welcher importiert werden soll This is the filename you wish to import a certificate from. Dies ist die Datei, aus welcher Sie ein Zertifikat importieren möchten. Select file to import from Wählen Sie die Datei, aus welcher importiert werden soll This opens a file selection dialog to choose a file to import a certificate from. Dies öffnet ein Dateiauswahlfenster zur Auswahl der Datei, aus welcher das Zertifikat importiert werden soll. Open... Öffnen... Password Passwort Password for PKCS#12 file Passwort für PKCS#12-Datei This is the password for the PKCS#12 file containing your certificate. Dies ist das Password für die PKCS#12-Datei, welche Ihr Zertifikat enthält. Certificate to import Zu importierendes Zertifikat This is the certificate you are importing. Dies ist das Zertifikat, welches Sie importieren. Certificate Details Zertifikat-Details Replace Certificate Zertifikat ersetzen Replace existing certificate with new certificate? Soll das vorhandene Zertifikat durch das Neue ersetzt werden? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> <p>Sie haben bereits ein Zertifikat in Mumble gespeichert und sind dabei dieses zu ersetzen.</p> <p>Wenn Sie ein vorhandenes, von einer vertrauenswürdigen Zertifizierungsstelle erzeugtes Zertifikat mit gleicher E-Mail Adresse nur aktualisieren ist dies sicher. Server werden automatisch Ihr vertrauenswürdiges Zertifikat für Ihre E-Mail Adresse erkennen.</p> <p> Sollte dies nicht der Fall sein werden Sie von keinem Server mehr erkannt, bei dem Sie sich bisher authentifiziert haben. Wenn Sie sich noch nirgends registriert haben müssen Sie sich darüber keine Gedanken machen. </p> <p> Sind Sie sicher, dass Sie Ihr Zertifikat ersetzen möchten? </p> This is the certificate Mumble currently uses. It will be replaced. Dies ist das aktuell von Mumble verwendete Zertifikat. Es wird ersetzt. New certificate Neues Zertifikat This is the new certificate that will replace the old one. Dies ist das neue Zertifikat, welches das Alte ersetzen wird. New Certificate Neues Zertifikat Make a backup of your certificate Erstelle eine Sicherheitskopie des Zertifikats Export to Exportieren nach Filename to export to Datei, in welche exportiert werden soll This is the filename you wish to export a certificate to. Dies ist die Datei, in welche das Zertifikat exportiert wird. Save As... Speichern unter... This is the certificate Mumble currently uses. It will be exported. Dies ist das Zertifikat, welches Mumble derzeit verwendet. Es wird exportiert. Generate a new certificate for strong authentication Generiere ein neues Zertifikat zur sicheren Authentifikation <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> <p>Mumble wird nun ein sicheres Zertifikat zur Authentifikation gegenüber Servern generieren.</p> <p> Wenn Sie möchten können Sie einige zusätzliche Informationen, welche im Zertifikat gespeichert werden, angeben. Diese werden beim Verbinden zum Server diesem ebenfalls übermittelt. Wenn Sie eine korrekte E-Mail-Adresse angeben können Sie zu einem, von einer Zertifizierungstelle erzeugten, Zertifikat gelangen, welches sichere Identifikation erlaubt. </p> Name Name Email E-Mail Your email address (e.g. johndoe@mumble.info) Ihre E-Mail-Adresse (z.B. johndoe@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. Dies ist Ihre E-Mail-Adresse. Es wird dringend empfohlen hier eine korrekte E-Mail-Adresse anzugeben, dieses erlaubt Ihnen später ohne Probleme zu einem vertrauenswürdigen Zertifikat zu gelangen. Your name (e.g. John Doe) Ihr Name (z.B. John Doe) This is your name, and will be filled out in the certificate. This field is entirely optional. Dies ist Ihr Name und wird in Ihrem Zertifikat gespeichert. Dieses Feld ist optional. Finish Fertigstellen Certificate-based authentication is ready for use Die Zertifikat-basierte Authentifikation ist zur Verwendung bereit Enjoy using Mumble with strong authentication. Viel Spaß bei der Verwendung von Mumble mit sicherer Authentifikation. Automatic certificate creation Zertifikat automatisch erstellen <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>Wenn Sie Ihr aktuelles Zertifikat verlieren, was etwa passiert wenn in ihrem Computer Hardware kaputt geht und Sie Ihr System neu installieren müssen, können Sie sich nicht mehr gegenüber Servern authentifizieren, auf welchen Sie sich registriert haben. Deshalb ist es <b>notwendig</b>, dass Sie eine Sicherung Ihres Zertifikats erstellen. Diese Sicherung sollte auf jeden Fall auf einem externen Datenträger, z.B. einem USB Stick, gespeichert werden.</p> <p>Beachten Sie, dass die Datei nicht verschlüsselt wird. Jeder der Zugriff auf diese Datei hat kann ihre Identität annehmen. Stellen Sie also sicher, dass nur Sie Zugriff auf diese Datei haben.</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> <p>Mumble kann Zertifikate verwenden um sich beim Server zu authentifizieren. Die Benutzung von Zertifikaten hat den Vorteil, dass man nicht mit Passwörtern hantieren muss. Ausserdem ermöglichen Zertifikate die einfache Registrierung von Benutzern.</p><p>Mumble funktioniert auch ohne Zertifikate, jedoch erwartet die Mehrheit der Server, dass Sie über ein Zertifikat verfügen.</p> <p> Es wird <b>sehr</b> empfohlen, dass Sie <a href="http://mumble.info/certificate.php">ihr eigenes Zertifikat erstellen</a>. </p> ChanACL None Keine Traverse Durchqueren Enter Betreten Speak Sprechen Mute/Deafen Stumm-/Taubstellen Make channel Kanal erstellen Make temporary Temporären Kanal erstellen Link channel Kanal verbinden This represents no privileges. Dies repräsentiert keine Rechte. This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. Dies repräsentiert vollen Zugriff auf den Kanal, einschließlich den Fähigkeiten Gruppen und Berechtigungen zu ändern. Dieses Recht impliziert alle anderen Rechte. This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. Dies repräsentiert das Recht den Kanal zu durchqueren. Wenn ein Benutzer dieses Privileg nicht hat, kann er nicht auf diesen Kanal oder einen der Unterkanäle zugreifen, egal welche Rechte er in den Unterkanälen hat. This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. Dies repräsentiert das Recht den Kanal zu betreten. Hat man eine hierarchische Kanalstruktur, sollte man jedem das Recht Durchqueren geben und dafür Betreten in der Wurzel der Hierarchie einschränken. This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. Dies repräsentiert das Recht in einem Kanal zu sprechen. Benutzer ohne dieses Recht werden vom Server unterdrückt (gekennzeichnet als stumm) und können in diesem Kanal erst sprechen, wenn sie von jemandem mit den entsprechenden Rechten ent-stummgestellt werden. This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. Dies repräsentiert das Recht von außerhalb in diesen Kanal zu flüstern. Dies funktioniert exakt wie das <i>Sprechen</i>-Recht gilt aber für Sprachpakete mit gedrückter Flüstern-Taste. Dies kann verwendet werden, um zu einer Hierarchie von Kanälen zu sprechen ohne diese zu verbinden. This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. Dies representiert das Recht andere Benutzer stumm und taub zu stellen. Wenn ein Benutzer stummgestellt wird bleibt er dies, bis ein anderer privilegierten Benutzer das stummstellen entfernt, oder der Benutzer neu zum Server verbindet. This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. Dies repräsentiert das Recht einen Benutzer in einen anderen Kanal zu verschieben oder ihn vom Server zu kicken. Um einen Benutzer auch wirklich zu verschieben muss der verschiebende Benutzer entweder Verschieben/Kick-Rechte im Zielkanal haben oder dem verschobenen Benutzer muss es erlaubt sein, den Zielkanal zu betreten. Benutzer mit diesem Recht können also (ausreichende Rechte im Zielkanal vorausgesetzt) andere Benutzer in Kanäle verschieben, die diese normalerweise nicht betreten dürfen. This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. Dies repräsentiert das Recht Unterkanäle zu erstellen. Der Benutzer, welcher den Unterkanal erstellt, wird automatisch zur admin-Gruppe des Kanals hinzugefügt. This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. Dies repräsentiert das Recht temporäre Unterkanäle zu erstellen. Der Benutzer, welcher den Unterkanal erstellt, wird automatisch zur admin-Gruppe des Unterkanals hinzugefügt. Temporäre Kanäle werden nicht gespeichert und verschwinden, sobald der letzte Benutzer den Kanal verlässt. This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. Dies repräsentiert das Recht Kanäle zu verbinden. Benutzer in verbundenen Kanälen können sich gegenseitig hören, so lange der sprechende Benutzer das <i>Sprechen</i>-Recht im Kanal des Hörers hat. Man benötigt Verbindungsrechte in beiden Kanälen um eine Verbindung aufzubauen, aber nur in einem der Beiden um sie aufzuheben. This represents the permission to write text messages to other users in this channel. Dies repräsentiert das Recht Textnachrichten an andere Benutzer dieses Kanals zu senden. This represents the permission to forcibly remove users from the server. Dies repräsentiert das Recht, andere Benutzer zwingend vom Server zu entfernen (zu “kicken”). This represents the permission to permanently remove users from the server. Dies repräsentiert das Recht Benutzer permanent vom Server zu entfernen (zu ”bannen”). This represents the permission to register and unregister users on the server. Dies repräsentiert das Recht andere Benutzer auf dem Server zu registrieren und diese auch wieder zu entfernen. This represents the permission to register oneself on the server. Dies repräsentiert das Recht sich selbst auf dem Server zu registrieren. Whisper Flüstern Move Bewegen Text message Textnachricht Kick Kicken Ban Bannen Register User Benutzer registrieren Register Self Selbst registrieren Write ACL Berechtigungen bearbeiten ChatbarTextEdit Paste and &Send Paste and send Einfügen und &senden <center>Type chat message here</center> <center>Textnachricht hier eingeben</center> ClientUser Friend Freund Authenticated Authentifiziert Priority speaker Bevorzugter Sprecher Recording Aufnahme Muted (server) Stumm (Server) Deafened (server) Taub (Server) Local Ignore (Text messages) Textnachrichten ignorieren (lokal) Local Mute Lokal Stumm Muted (self) Stumm (selbst) Deafened (self) Taub (selbst) ConfigDialog Accept changes Änderungen übernehmen This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. Dieser Knopf übernimmt die aktuellen Einstellungen und kehrt zur Anwendung zurück.<br />Die Einstellungen werden beim Beenden der Anwendung gespeichert. Reject changes Änderungen verwerfen This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. Der Knopf verwirft alle Änderungen und kehrt zur Anwendung zurück.<br />Die Einstellungen werden auf die vorherigen Werte zurückgesetzt. Apply changes Änderungen übernehmen This button will immediately apply all changes. Dieser Button übernimmt alle Änderungen sofort. Undo changes for current page Änderungen der aktuellen Seite rückgängig machen This button will revert any changes done on the current page to the most recent applied settings. Dieser Knopf setzt alle Änderunge auf der aktuellen Seite auf die zuletzt angewandten Einstellung zurück. Restore defaults for current page Standardeinstellungen für die aktuelle Seite wiederherstellen This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. Dieser Knopf setzt die Einstellungen der aktuellen Seite auf die Standardwerte zurück. Andere Seiten werden nicht geändert.<br />Um alle Einstellungen auf die Standardwerte zurückzusetzen müssen Sie diesen Knopf auf allen Seiten verwenden. Mumble Configuration Mumble-Konfiguration ConnectDialog Connecting to %1 Verbinde zu %1 Enter username Benutzername eingeben Adding host %1 Host %1 hinzufügen Servername Servername Hostname Hostname Bonjour name Bonjourname Port Port Addresses Adressen Website Webseite Packet loss Paketverlust Ping (80%) Ping (80%) %1 ms %1 ms Ping (95%) Ping (95%) Bandwidth Bandbreite %1 kbit/s %1 kbit/s &Connect &Verbinden &Filters &Filter Unknown Unbekannt Users Benutzer Version Version Failed to fetch server list Serverliste konnte nicht geladen werden Mumble Server Connect Mumble - Server Verbinden Ping Ping Remove from Favorites Aus den Favoriten entfernen Add custom server Benutzerdefinierten Server hinzufügen Show all servers that respond to ping Alle Server anzeigen die auf Pings antworten Show all servers with users Zeige alle Server auf denen sich Benutzern befinden Show all servers Alle Server anzeigen &Copy &Kopieren Copy favorite link to clipboard Kopiere Favoriten-Link in die Zwischenablage &Paste &Einfügen Paste favorite from clipboard Füge Favorit aus der Zwischenablage ein &Edit... &Bearbeiten... &Add New... &Server hinzufügen... Add to &Favorites Zu &Favoriten hinzufügen Open &Webpage &Webseite öffnen Show &Reachable Nur &erreichbare Server anzeigen Show &Populated Server mit &Benutzern anzeigen Show &All &Alle anzeigen ConnectDialogEdit Edit Server Server bearbeiten Name of the server Name des Servers A&ddress A&dresse Internet address of the server. Internet address of the server. Internet-Adresse des Servers. <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Adresse</b><br /> Internet-Adresse des Servers. Dies kann ein normaler Hostname, eine IPv4/IPv6 Adresse oder eine Bonjour-Service-Identifikation sein. Bonjour-Service-Identifikationen müssen mit einem '@' beginnen um von Mumble erkannt zu werden. &Port &Port Port on which the server is listening Port, auf welchem der Server hört <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. <b>Port</b><br /> Port auf welchem der Server hört. Wenn eine Bonjour-Service-Identifikation verwendet wird, wird dieses Feld ignoriert. &Username Ben&utzername Username to send to the server Benutzername, welcher an den Server gesendet wird <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. <b>Benutzername</b><br /> Benutzername, welcher an den Server gesendet wird. Beachten Sie, dass jeder Serveradminstrator eigenen Einschränkungen für Benutzernamen festlegen kann. Ihr Benutzername kann außerdem bereits von einem anderen Benutzer belegt sein. Label Bezeichnung Add Server Server hinzufügen You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 Du bist derzeit mit einem Server verbunden. Möchtest du den Dialog wirklich mit diesen Werten füllen? Host: %1 Port %2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 Du hast eine URL in deiner Zwischenablage. Möchtest du den Dialog wirklich mit diesen Daten füllen? Host: %1 Port: %2 Password Passwort Password to send to the server Das Passwort, welches an den Server gesendet wird <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. <b>Passwort</b><br /> Passwort, das an den Server gesendet wird. Dieses Passwort wird benötigt wenn man sich als <i>SuperUser</i> oder zu einem Server mit Passwort-Authentifizierung verbindet. Falls nicht angegeben so wird das Passwort beim Verbinden abgefragt. Show password Passwort anzeigen <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. <b>Bezeichnung</b><br /> Dies ist die Bezeichnung des Servers wie sie in den Favoriten erscheint und kann frei gewählt werden. Local server label Lokale Serverbezeichnung 127.0.0.1 127.0.0.1 64738 64738 Your username Eigener Nutzername Your password Eigenes Passwort &Fill &Ausfüllen CoreAudioSystem Default Device Standardgerät CrashReporter Mumble Crash Report Mumble - Absturzbericht <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> <p><b>Es tut uns sehr leid, aber es scheint so, als sei Mumble abgestürzt. Möchten Sie einen Absturz-Bericht an die Mumble-Entwickler senden?</b></p> <p> Der Absturz-Bericht enthält eine Teilkopie von Mumbles Speicher zum Zeitpunkt des Absturzes und wird den Entwicklern helfen, das Problem zu beheben. </p> Email address (optional) E-Mail-Adresse (optional) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash Bitte beschreiben Sie kurz, in Englischer Sprache, was Sie getan haben als Mumble abgestürzt ist Send Report Bericht senden Don't send report Bericht nicht senden Crash upload successful Hochladen des Absturz-Berichts erfolgreich Thank you for helping make Mumble better! Danke dass Sie dabei helfen, Mumble zu verbessern! Crash upload failed Hochladen des Berichts fehlgeschlagen We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. Das Hochladen des Berichts scheint mit der Fehlermeldung %1 %2 fehlgeschlagen zu sein. Bitte informieren Sie einen Entwickler. This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 Das ist wirklich nicht witzig, aber es scheint einen Bug im Absturz-Bericht-Melden-Code zu geben und das Hochladen des Berichts schlug fehl. Sie können einen Entwickler über den Fehler %1 informieren Uploading crash report Absturzbericht wird hochladen Abort upload Hochloaden abbrechen DXAudioInput Default DirectSound Voice Input Standard DirectSound Spracheingabe Opening chosen DirectSound Input device failed. No microphone capture will be done. Öffnen des DirectSound Eingangsgerätes fehlgeschlagen. Es wird kein Mikrofonsound aufgenommen. Opening chosen DirectSound Input failed. Default device will be used. Öffnen des DirectSound Eingangsgerätes fehlgeschlagen. Standardgerät wird benutzt. Lost DirectSound input device. DirectSound Eingangsgerät verloren. DXAudioOutput Default DirectSound Voice Output Standard DirectSound Sprachausgabe Opening chosen DirectSound Output failed. Default device will be used. Öffnen des DirectSound Ausgabegerätes fehlgeschlagen. Standardgerät wird benutzt. Lost DirectSound output device. DirectSound Ausgabegerät verloren. Opening chosen DirectSound Output failed. No audio will be heard. Öffnen des DirectSound Ausgabegerätes fehlgeschlagen. Es kann kein Ton gehört werden. Database Mumble failed to initialize a database in any of the possible locations. Mumble konnte keine Datenbank an einem der möglichen Orte initialisieren. The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. Auf die Datenbank '%1' kann nicht schreibend zugegriffen werden. Mumble kann keine Servereinstellungen (z.B. SSL-Zertifikate) speichern. DeveloperConsole Developer Console Entwicklerkonsole DockTitleBar Drag here Hier ziehen GlobalShortcut Shortcuts Tastenkürzel List of configured shortcuts Liste der konfigurierten Tastenkürzel Function Funktion Data Daten Shortcut Tastenkürzel Suppress Unterdrücken Add new shortcut Neues Tastenkürzel hinzufügen This will add a new global shortcut Dies fügt ein globales Tastenkürzel hinzu &Add &Hinzufügen Remove selected shortcut Gewähltes Tastenkürzel entfernen This will permanently remove a selected shortcut. Dies wird das gewählte Tastenkürzel permanent löschen. &Remove &Entfernen <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> <html><head/><body><p>Mumble kann zur Zeit nur Maus- und Zusatztasten (Alt, Strg, Befehlstaste usw.) für globale Tastenkürzel verwenden.</p><p>Für mehr Flexibilität kann <span style="font-style:italic;">Zugriff für Hilfsgeräte aktivieren</span> in den Bedienungshilfen Einstellungen des Systems aktiviert werden. Diese Änderung erlaubt es jedoch auch potentiell bösartigen Programmen Tastatureingaben zu lesen.</p></body></html> Open Accessibility Preferences Öffne Bedienungshilfen Einstellungen Skip Überspringen Enable Global Shortcuts Aktiviere globale Tastenkürzel <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. <b>Zusätzliche Verknüpfungen </b><br />In diesem Abschnitt können Sie Sie die Verwendung von zusätzlichen GlobalShortcut Verknüpfungen konfigurieren. Additional Shortcut Engines Zusätzliche Verknüpfungen <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. <b>Windows Hooks Verknüpfungen aktivieren</b>.<br />Dies aktiviert den Windows-hooks Verknüpfungen. Mit dieser Aktion unterdrückt Mumble zu Tastendrücke und Mausklicks. Enable Windows hooks Windows hooks aktivieren <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. <b>GKey aktivieren</b>.<br />Diese Einstellung ermöglicht die Unterstützung für GKey Verknüpfungen, die mit Logitech-Tastaturen bereitgestellt werden. Enable GKey GKey aktivieren <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. <b>XInput aktivieren</b><br />Diese Einstellung aktiviert die Unterstützung für XInput Verknüpfungen, für Xbox kompatible Controller. Enable XInput XInput aktivieren <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. Enable shortcuts in privileged applications Tastaturkürzel in privilegierten Anwendungen aktivieren GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> <html><head/><body><p>Mumble kann zurzeit nur Maustasten und Zusatztasten auf der Tastatur (Alt, Strg, Cmd, usw.) für systemweite Tastenkürzel verwenden.</p><p>Für eine größere Flexibilität können Sie Mumble als vertrautes Bedienhilfenprogramm im Privatsphärenreiter der Systemeinstellungen Ihres Mac's aktivieren.</p><p>Öffnen Sie dazu in Ihren Systemeinstellungen das Sicherheitsfenster und wechseln zum Privatsphärenreiter. Gehen Sie nun in der Navigation (links) auf den Punkt Bedienungshilfen und fügen Mumble in die erscheinende Liste der vertrauenswürdigen Programme hinzu.</body></html> Shortcuts Tastenkürzel Shortcut button combination. Tastenkombination des Tastenkürzels. <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. <b>Dies ist die globale Tastenkombination des Tastenkürzels.</b><br />Doppelklicken Sie dieses Feld und dann die gewünschte Tastenkombination um sie neu zu setzen. Suppress keys from other applications Unterdrücke Tasten vor anderen Anwendungen <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. <b>Dies unterdrückt Tastendrücke von anderen Anwendungen.</b><br />Durch Aktivierung wird der Tastendruck (oder die letzte Taste einer Mehrfachtasten-Kombination) vor anderen Anwendungen versteckt. Es können aber nicht alle Tasten unterdrückt werden. GlobalShortcutTarget Whisper Target Flüster-Ziel Whisper to list of Users An Liste von Benutzern flüstern Channel Target Zielkanal Restrict to Group Beschränke auf Gruppe If specified, only members of this group will receive the whisper. Wenn festgelegt empfangen nur Mitglieder dieser Gruppe das Flüstern. List of users Benutzerliste Add Hinzufügen Remove Entfernen Modifiers Optionen Do not send positional audio information when using this whisper shortcut. Sende keine Positionsinformationen beim Flüstern. Ignore positional audio Ignoriere positionsabhängiges Audio Shout to Linked channels An verknüpfte Kanäle rufen Shout to subchannels An Unterkanäle rufen Shout to Channel An den Kanal rufen The whisper will also be transmitted to linked channels. Das Flüstern wird auch an verknüpfte Kanäle gesendet. The whisper will also be sent to the subchannels of the channel target. Das Flüstern wird auch an die Unterkanäle des Zielkanals gesendet. GlobalShortcutX Mouse %1 Maus %1 JackAudioSystem Hardware Ports Hardware-Ports Mono Mono Stereo Stereo LCD Not connected Nicht verbunden LCDConfig Enable this device Dieses Gerät aktivieren LCD LCD Devices Geräte Name Name <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> <p>Dies ist die Liste der verfügbaren LCD-Geräte in Ihrem System. Sie listet die Geräte alphabetisch sortiert, enthält aber auch die Größe des Displays. Mumble kann Ausgaben zeitgleich an mehrere LCD Geräte ausgeben.</p> <h3>Größe:</h3> <p>Dieses Feld beschreibt die Größe eines LCD Gerätes. Die Größe ist entweder in Pixel (für grafische LCDs) oder in Zeichen (für Zeichen-LCDs) angegeben.</p> <h3>Aktiviert:</h3> <p>Dies legt fest, ob Mumble ein bestimmtes LCD Gerät verwenden soll.</p> Size Größe Enabled Aktiviert Views Ansichten Minimum Column Width Minimale Spaltenbreite <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> <p>Diese Option legt die minimale Spaltenbreite fest.</p> <p>Wenn zu viele Benutzer gleichzeitig reden wird die Benutzeransicht in mehrere Spalten geteilt. Sie können diese Option verwenden, um einen Kompromiss zwischen auf dem LCD angezeigten Benutzern oder der Breite der angezeigten Benutzernamen zu finden.</p> This setting decides the width of column splitter. Diese Einstellung legt die Spaltebreite fest. Splitter Width Splitterbreite Log Debug Debug Critical Kritisch Warning Warnung Information Information Server Connected Server verbunden Server Disconnected Serververbindung abgebrochen Other self-muted/deafened Anderer stumm/taub gestellt Permission Denied Erlaubnis verweigert Text Message Textnachricht User Joined Server Benutzer betrat den Server User Left Server Benutzer verließ den Server User recording state changed Benutzer Aufnahmestatus geändert User kicked (you or by you) Benutzer gekickt (du oder von dir) User kicked Benutzer gekickt You self-muted Selbst stumm gestellt. User muted (you) Benutzer stumm gestellt (du selbst) User muted (by you) Benutzer stumm gestellt (durch dich) User muted (other) Benutzer stummgestellt (jemand anderes) User Joined Channel Benutzer betrat Kanal User Left Channel Benutzer verließ den Kanal You self-unmuted Stummstellung aufgehoben. You self-deafened Selbst taub gestellt. You self-undeafened Taubstellung deaktiviert. User renamed Benutzer umbenannt You Joined Channel Kanal betreten You Joined Channel (moved) Kanal betreten (verschoben) User connected and entered channel Benutzer hat sich mit dem Server verbunden und betrat den Kanal User left channel and disconnected Benutzer verließ den Kanal und hat den Server verlassen Private text message Private Textnachricht the server den Server [[ Invalid size ]] [[ Ungültige Größe ]] [[ Text object too large to display ]] [[ Text zu groß um dargestellt zu werden ]] [Date changed to %1] [Datum geändert nach %1] link to %1 Link zu %1 FTP link to %1 FTP Link zu %1 player link Link auf Benutzer channel link Link auf Kanal %1 link %1 Link LogConfig Toggle console for %1 events Wechsle Einstellung für Konsole für %1 Ereignisse Toggle pop-up notifications for %1 events De-/Aktiviere Pop-up Benachrichtgungen für %1 Ereignisse Toggle Text-To-Speech for %1 events De-/Aktiviere Text-zu-Sprache für %1 Ereignisse Click here to toggle sound notification for %1 events Klicken Sie hier, um die Audio-Hinweise für %1 Ereignisse zu wechseln Toggle window highlight (if not active) for %1 events Fensterhervorhebung für %1-Ereignisse umschalten (falls nicht aktiv) Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change Pfad zur Sounddatei, die für die Audio-Benachrichtigung für %1 Ereignisse verwendet wird.<br />Einfacher Klick zum abspielen<br />Doppelklick zum ändern Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. Klicken Sie hier, um die Konsolenausgabe für %1 Ereignisse zu wechseln (zu aktivieren oder zu deaktivieren).<br />Wenn gewählt gibt Mumble alle %1 Ereignisse in seinem Nachrichten-Log aus. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. Klicken Sie hier, um die Pop-up Benachrichtigungen für %1 Ereignisse zu aktivieren oder zu deaktivieren.<br /> Wenn gewählt, wird für jedes %1 Ereignis ein Benachrichtigungs-Pop-up erzeugt. Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. Klicken Sie hier, um die Fensterhervorhebung für %1-Ereignisse umzuschalten.<br />Falls angekreuzt, wird das Fenster von Mumble für jedes %1-Ereignis hervorgehoben, wenn es nicht aktiv ist. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. Pfad zur Sounddatei zur Wiedergabe von Sound-Hinweisen im Falle von %1 Ereignissen.<br />Einfaches Klicken zum Abspielen<br />Doppelklicken zum Ändern<br />Stellen Sie sicher, dass die Sound-Hinweise für diesen Ereignistyp aktiviert sind, ansonsten hat diese Einstellung keinen Effekt. Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. Klicken Sie hier, um Text-zu-Sprache für %1 Ereignisse zu aktivieren oder zu deaktivieren.<br /> Wenn gewählt veranlasst Mumble, dass %1 Ereignisse vorgelesen werden. Text-zu-Sprache kann auch den Inhalt von Ereignissen vorlesen, was Sounddateien nicht können. Text-zu-Sprache und Sounddateien können nicht gleichzeitig verwendet werden. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. Klicken Sie hier, um Sound-Benachrichtigungen für %1 Ereignisse zu aktivieren oder zu deaktivieren.<br />Wenn gewählt, verwendet Mumble von ihnen gewählte Sounddateien um %1 Ereignisse zu kennzeichnen. Sounddateien und Text-zu-Sprache können nicht gleichzeitig verwendet werden. Messages Nachrichten Message Nachricht Console Konsole Notification Benachrichtigung Text-To-Speech Text-zu-Sprache Soundfile Sounddatei Path Pfad Text To Speech Text zu Sprache Volume Lautstärke Volume of Text-To-Speech Engine Lautstärke der Text-zu-Sprache-Engine <b>This is the volume used for the speech synthesis.</b> <b>Dies ist die Lautstärke für die Sprachsynthese.</b> Length threshold Längen-Schwellwert Message length threshold for Text-To-Speech Engine Nachrichtenlängen-Schwellwert für die Text-zu-Sprache-Engine <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. <b>Dieser Längen-Schwellwert wird von der Text-zu-Sprache-Engine genutzt.</b><br />Nachrichten die Länger als der Grenzwert sind, werden nicht in voller Länge laut vorgelesen. Characters Zeichen Whisper Flüstern If checked you will only hear whispers from users you added to your friend list. Wenn diese Option gewählt ist erhalten Sie Flüsternachrichten nur von Benutzern auf Ihrer Freundesliste. Only accept whispers from friends Flüstern nur von Freunden akzeptieren If enabled text messages you send will be read back to you with TTS Wenn aktiviert, werden auch eigene Nachrichten mittels Text-zu-Sprache vorgelesen Read back own messages Eigene Textnachrichten vorlesen Chat Log Nachrichtenverlauf Maximum chat length Maximale Länge des Nachrichtenverlaufs Unlimited Unbegrenzt Lines Zeilen Highlight Hervorheben LookConfig System default Systemstandard None Keine Only with users Nur mit Benutzern All Alle Ask Fragen Do Nothing Nichts tun Move Bewegen <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory <a href="%1">Durchsuchen</a> User Interface Benutzerinterface This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. Dies setzt welche Kanäle automatisch expandiert werden. <i>Keine</i> und <i>Alle</i> expandieren keine und alle Kanäle, während <i>Nur mit Benutzern</i> Kanäle expandiert und schließt wenn Benutzer diese betreten oder verlassen. List users above subchannels (requires restart). Zeige Benutzer über den Kanälen (benötigt einen Neustart). <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. <b>Wenn gesetzt, werden Benutzer über den Unterkanälen angezeigt.</b><br />Ein Neustart von Mumble ist notwendig damit die Änderung wirksam wird. Users above Channels Benutzer über Kanälen <b>If set, will verify you want to quit if connected.</b> <b>Wenn aktiviert, kommt beim Beenden eine Abfrage.</b> Show number of users in each channel Zeige die Anzahl der Benutzer in jedem Kanal Show channel user count Anzahl der Benutzer im Kanal anzeigen Language Sprache Language to use (requires restart) Sprachauswahl (benötigt Neustart) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. <b>Dies legt die Sprache fest, die Mumble verwenden soll.</b><br />Ein Neustart ist nötig um die neue Sprache zu nutzen. Look and Feel Aussehen Layout Anordnung Classic Klassisch Stacked Gestapelt Hybrid Hybrid Custom Benutzerdefiniert This changes the behavior when moving channels. Ändert das Verhalten beim Bewegen von Kanälen. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. Dies verändert das Verhalten beim Verschieben von Kanälen. Es kann verwendet werden, um versehentliches Verschieben von Kanälen zu verhindern. <i>Nichts tun</i> tut nichts und gibt eine Fehlermeldung aus. <i>Fragen</i> fragt in einem Nachrichtenfenster ob der Kanal wirklich verschoben werden soll. Expand Expandieren When to automatically expand channels Wann sollen Kanäle automatisch erweitert werden Channel Dragging Kanal ziehen Ask whether to close or minimize when quitting Mumble. Fragen, ob das Mumblefenster geschlossen oder minimiert werden soll, wenn Mumble beendet wird. Ask on quit while connected Frage beim Beenden mit aktiver Verbindung nach Always On Top Immer oben <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> <b>Wenn gesetzt, wird das Mumble-Hauptfenster in den Infobereich minimiert. Anderenfalls wird es wie üblich minimiert.</b> Hide in tray when minimized Verstecke im Tray, wenn minimiert Hide the main Mumble window in the tray when it is minimized. Verstecke das Mumble-Fenster im Tray, wenn es minimiert wird. This setting controls when the application will be always on top. Diese Einstellung legt fest, wann die Anwendung immer über anderen angezeigt wird (“always on top”). Never Niemals Always Immer In minimal view In der Minimalansicht In normal view In der Normalansicht Displays talking status in system tray Zeigt den Sprechstatus im System Tray Show talking status in tray icon Zeige Sprechstatus im Tray Icon This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. Diese Einstellung legt fest, in welchen Situationen das Mumble-Fenster immer über den anderen bleibt. Wenn Sie <i>Niemals</i> wählen bleibt das Fenster niemals oben auf. <i>Immer</i> zeigt das Fenster immer über den anderen. <i>In der Minimalansicht</i>/<i>In der Normalansicht</i> lässt das Fenster nur im jeweiligen Anzeigemodus über den anderen stehen. Show context menu in menu bar Zeige Kontextmenü in der Menüleiste Apply some high contrast optimizations for visually impaired users Auf hohen Kontrast optimierte Darstellung für sehbehinderte Benutzer verwenden Optimize for high contrast Optimiere für hohen Kontrast Application Anwendung Adds user and channel context menus into the menu bar Fügt Benutzer- und Kanalkontextmenüs zur Menüleiste hinzu Tray Icon Tray Icon Channel Tree Kanalbaum Use selected item as the chat bar target Verwende ausgewähltes Objekt als Ziel der Chatbar Filter automatically hides empty channels Filter versteckt automatisch leere Kanäle Show transmit mode dropdown in toolbar Übertragungsmodus-Aufklappliste in der Werkzeugliste anzeigen Theme Thema Theme to use to style the user interface Stil der Benutzeroberfläche <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. <b>Wählt den Stil aus, der auf die Benutzeroberfläche angewendet wird</b><br />Mumble sammelt Stile aus bestimmten Verzeichnissen zusammen und führt diese in dieser Liste auf. Der Stil, den Sie auswählen, wird dazu verwendet das Aussehen der Benutzeroberfläche anzupassen. Dies umfasst Farben, Icons und mehr. User Dragging User ziehen This changes the behavior when moving users. Dies ändert das Verhalten beim verschieben von Benutzern. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. Diese legt das Verhalten der Benutzer beim Verschieben von Kanälen. Es kann verwendet werden, um versehentliches Verschieben von Kanälen zu verhindern. <i>Nichts tun</i> tut nichts und gibt eine Fehlermeldung aus. <i>Fragen</i> fragt in einem Nachrichtenfenster ob der Kanal wirklich verschoben werden soll. <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. <b>Entwickler Modus aktivieren</b><br />Dies aktiviert den "Entwickler" Modus in Mumble. Dieser Modus wird für Entwickler-spezifische Funktionen, wie die Entwickler-Konsole, verwendet. Enable Developer menu Entwicklermenü aktivieren When in custom layout mode, checking this disables rearranging. Wenn der benutzerdefinierte Layout-Modus aktiviert ist , überprüfen Sie diese deaktivierte Neuordnung. Lock layout Sperren Layout MainWindow Root Hauptkanal Push-to-Talk Global Shortcut Push-To-Talk Push and hold this button to send voice. Global Shortcut Drücken und halten Sie diese Taste um Sprache zu senden. This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut Dies konfiguriert die Push-To-Talk-Taste. So lange Sie diese Taste gedrückt halten, übermitteln Sie Sprache. Reset Audio Processor Global Shortcut Audio-Prozessor zurücksetzen Unlink Plugin Global Shortcut Plugin trennen Push-to-Mute Global Shortcut Push-to-Mute Join Channel Global Shortcut Kanal betreten Toggle Overlay Global Shortcut Overlay-Modus umschalten Toggle state of in-game overlay. Global Shortcut Wechsle den Modus des in-game Overlays. Toggle Minimal Global Shortcut Minimalansichts-Modus umschalten Volume Up (+10%) Global Shortcut Lauter (+10%) Volume Down (-10%) Global Shortcut Leiser (-10%) Mumble Mumble Mumble -- %1 Mumble -- %1 &Window &Fenster Minimize Minimieren Ctrl+M Strg+M Close Schließen Mumble is currently connected to a server. Do you want to Close or Minimize it? Mumble ist gerade zu einem Server verbunden. Möchten Sie es schließen oder minimieren? Mute Self Global Shortcut Selbst stumm stellen Set self-mute status. Global Shortcut Selbst stumm stellen Status. This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut Dies setzt oder wechselt Ihren selbst-stummstellen Status. Wenn Sie dies deaktivieren werden Sie ebenfalls das selbst taubstellen deaktivieren. Deafen Self Global Shortcut Selbst taub stellen Set self-deafen status. Global Shortcut Setze selbst-taub stellen Status. This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut Dies setzt oder wechselt Ihren selbst-taub stellen Status. Wenn Sie dies aktivieren werden Sie ebenfalls selbst-stumm gestellt. Whisper/Shout Whisper Flüstern/Rufen <center>Not connected</center> Not connected <center>Nicht verbunden</center> Clear Löschen Opening URL %1 Öffne URL %1 File does not exist Datei existiert nicht File is not a configuration file. Die Datei ist keine Konfigurationsdatei. Settings merged from file. Einstellungen aus Datei eingelesen. URL scheme is not 'mumble' URL-Schema ist nicht 'mumble' This version of Mumble can't handle URLs for Mumble version %1.%2.%3 Diese Version von Mumble kann keine URLs von Mumble Version %1.%2.%3 verarbeiten Connecting to %1 Verbinde zu %1 Enter username Benutzernamen eingeben Connecting to server %1. Zu Server %1 verbinden. Reconnecting. Neuverbindung. Transmit Mode set to Continuous Übertragungsmodus auf Kontinuierlich festgelegt <p>%1 (%2)<br />%3</p> <p>%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> <h2>Sprachkanal</h2><p>Verschlüsselt mit 128 bit OCB-AES128<br />%1 ms Durchschnittslatenz (%4 Abweichung)</p> Register yourself as %1 Sich selbst als %1 registrieren <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <p>Sie sind dabei sich auf dem Server zu registrieren. Diese Aktion kann nicht rückgängig gemacht werden und Ihr Benutzername '%1' auf diesem Server kann von Ihnen selbst nicht mehr geändert werden.</p><p>Sind Sie sicher, dass Sie sich selbst registrieren möchten?</p> <h2>Version</h2><p>Protocol %1</p> <h2>Version</h2><p>Protokoll %1</p> <p>No build information or OS version available</p> <p>Keine Build- oder Betriebssystem-Informationen verfügbar.</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) Die Verbindung ist mit %1 verschlüsselt und authentifiziert und verwendet %2 zum Schlüsseltausch (%3) The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) Die Verbindung ist mit %1 verschlüsselt, mit %2 zur Nachrichtenauthentifizierung and %3 zum Schlüsseltausch (%4) The connection is secured by the cipher suite that OpenSSL identifies as %1 Die Verbindung wird von der Cipher-Suite , die OpenSSL als %1 identifiziert gesichert. <p>The connection provides perfect forward secrecy</p> <p>Die Verbindung unterstützt Perfect Forward Secrecy</p> <p>The connection does not provide perfect forward secrecy</p> <p>Die Verbindung unterstützt Perfect Forward Secrecy nicht</p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> <h2>Steuerkanal</h2><p>Die Verbindung nutzt %1</p>%2%3<p>%4 ms Durchschnittslatenz (%5 Abweichung)</p><p>Gegenstelle %6 (Port %7)</p> Voice channel is sent over control channel Sprachkanal wird über den Kontrollkanal gesendet. Register user %1 Benutzer %1 registrieren <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> <p>Sie sind dabei %1 auf dem Server zu registrieren. Diese Aktion kann nicht rückgängig gemacht werden und %1 wird sich, auch wenn Sie Ihr Serverpasswort ändern, weiterhin mit dem Server verbinden können.</p> <p>Von diesem Punkt an wird %1 mit dem Zertifikat welches er momentan verwendet, authentifiziert.</p> <p>Sind Sie sicher, dass Sie %1 registrieren möchten?</p> Kicking user %1 Benutzer %1 kicken Banning user %1 Benutzer %1 bannen View comment on user %1 Zeige den Kommentar des Benutzers %1 Message to channel %1 Nachricht an den Kanal %1 Connected. Verbunden. <li>Expected certificate digest (SHA-1): %1</li> <li>Erwartete Zertifikat Kurzfassung (SHA-1): %1</li> Server presented a certificate which failed verification. Der Server hat ein Zertifikat gesendet, dessen Überprüfung gescheitert ist. <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> <p>%1</p><ul>%2</ul><p>Die Fehler dieses Zertifikats sind: </p><ol>%3</ol><p>Wollen Sie dieses Zertifikat trotzdem akzeptieren?<br />(Es wird auch abgespeichert, weshalb Sie nicht wieder gefragt werden.)</p> SSL Version mismatch SSL Versions Diskrepanz Server connection failed. Serververbindung fehlgeschlagen. <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>Nachricht an den Kanal '%1' hier eingeben</center> <center>Type message to user '%1' here</center> Type message to user '%1' here <center>Nachricht an den Benutzer '%1' hier eingeben</center> Choose image file Bilddatei wählen Failed to load image Fehler beim Laden des Bildes Could not open file for reading. Konnte Datei nicht zum Lesen öffnen. Image format not recognized. Bildformat wurde nicht erkannt. &User &Benutzer &Channel &Kanal Use in conjunction with Whisper to. Global Shortcut In Verbindung mit Flüstern benutzen. This will switch the states of the in-game overlay. Global Shortcut Dies wechselt den Modus des Ingame-Overlays. Link Channel Global Shortcut Kanal verknüpfen Cycle Transmit Mode Global Shortcut Durchlaufe Übertragungsmodus Set Transmit Mode to Push-To-Talk Global Shortcut Set Transmit Mode to Continuous Global Shortcut Set Transmit Mode to VAD Global Shortcut Send Text Message Global Shortcut Textnachricht senden Send Clipboard Text Message Global Shortcut Sende Zwischenablage als Textnachricht This will send your Clipboard content to the channel you are currently in. Global Shortcut Dies sendet den Inhalt deiner Zwischenablage als Textnachricht an den Kanal in dem du dich gerade befindest. Continuous Kontinuierlich Voice Activity Sprachaktivität Push-to-Talk Push-To-Talk Mumble - Minimal View -- %1 Mumble - Minimalansicht -- %1 Cancel Abbrechen Save Image As... Speichere Bild unter... Save Image File Speichere Bilddatei Could not save image: %1 Konnte Bild nicht speichern: %1 Change your comment Ändere deinen Kommentar Transmit Mode set to Voice Activity Übertragungsmodus auf Sprachaktivität festgelegt Transmit Mode set to Push-to-Talk Übertragungsmodus auf Push-to-Talk festgelegt <p>Connected users: %1/%2</p> <p>Verbunde Nutzer: %1/%2</p> UDP Statistics UDP-Statistiken To Server Zum Server From Server Vom Server Good Gut Late Verspätet Lost Verloren Resync Neu synchronisieren <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> <h2>Audio Bandbreite</h2><p>Maximum %1 kbit/s<br />Aktuell %2 kbit/s<br />Codec: %3</p> Mumble Server Information Mumble - Server Informationen &View Certificate &Zertifikat zeigen Enter reason Grund eingeben Sending message to %1 Sende Nachricht an %1 To %1: %2 An %1: %2 Message to %1 Nachricht an %1 Are you sure you want to reset the comment of user %1? Wollen Sie wirklich den Kommentar des Benutzers %1 löschen? Are you sure you want to reset the avatar of user %1? Sind Sie sicher, dass Sie den Avatar des Benutzers %1 zurücksetzen möchten? Are you sure you want to delete %1 and all its sub-channels? Sind Sie sicher, dass Sie %1 und alle Unterkanäle löschen möchten? Sending message to channel %1 Sende Nachricht an den Kanal %1 Message to tree %1 Nachricht an Baum %1 To %1 (Tree): %2 (Tree) %1: %2 An %1 (Baum): %2 Unmuted and undeafened. Stumm- und Taubstellen deaktiviert. Unmuted. Stummstellen deaktiviert. Muted. Stumm. Muted and deafened. Stumm und taub gestellt. Deafened. Taub gestellt. Undeafened. Taubstellen deaktiviert. Restart Mumble? Mumble neu starten? Some settings will only apply after a restart of Mumble. Restart Mumble now? Einige Einstellungen werden erst nach dem Neustarten von Mumble wirksam. Mumble jetzt neu starten? About Qt Über Qt SSL Verification failed: %1 SSL-Überprüfung fehlgeschlagen: %1 <li>Server certificate digest (SHA-1): %1</li> <li>Server Zertifikat Kurzfassung (SHA-1): %1</li> <b>WARNING:</b> The server presented a certificate that was different from the stored one. <b>WARNUNG:</b> Der Server hat ein Zertifikat gesendet, das sich vom für diesen Server gespeicherten Zertifikat unterscheidet. This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. Dieser Server verwendet einen älteren Standard zur Verschlüsselung und wird von modernen Versionen von Mumble nicht mehr unterstützt. Server connection failed: %1. Serververbindung fehlgeschlagen: %1. Disconnected from server. Verbindung zum Server unterbrochen. Invalid username Ungültiger Benutzername You connected with an invalid username, please try another one. Sie verwenden einen ungültigen Benutzernamen. Bitte versuchen Sie einen anderen. Username in use Benutzername bereits in Verwendung That username is already in use, please try another username. Dieser Benutzername ist bereits vergeben. Bitte benutzen Sie einen anderen. Wrong certificate or password Falsches Zertifikat oder Passwort Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. Falsches Zertifikat oder Passwort für registrierten Benutzer. Wenn Sie sicher sind, dass dieser Benutzer mit einem Passwort geschützt ist, versuchen Sie es bitte erneut. Falls nicht, brechen Sie ab und überprüfen Sie Ihr Zertifikat und Ihren Benutzernamen. Wrong password Falsches Passwort Wrong server password for unregistered user account, please try again. Falsches Serverpasswort für unregistrierte Benutzer. Bitte versuchen Sie es noch einmal. Images (*.png *.jpg *.jpeg) Bilder (*.png *.jpg *.jpeg) C&onfigure K&onfiguration &Help &Hilfe Log Log This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. Dieser Bereich zeigt die letzten Aktivitäten an. Verbindungen zum Server, Fehler und Informationsnachrichten werden hier angezeigt.<br />Um genau festzulegen welche Nachrichten hier angezeigt werden verwenden Sie den <b>Einstellungen</b>-Menüeintrag und öffnen die Registerkarte <b>Nachrichten</b>. &Quit Mumble Mumble B&eenden Closes the program Schließt das Programm Exits the application. Beendet die Anwendung. Ctrl+Q Strg+Q Open the server connection dialog Öffne den Serververbindungs-Dialog &Disconnect Tre&nnen Disconnect from server Verbindung zum Server trennen Disconnects you from the server. Trennt Ihre Verbindung zum Server. Show information about the server connection Zeigt Informationen über die Serververbindung an This will show extended information about the connection to the server. Dies zeigt erweitertete Informationen über die Verbindung zum Server an. &Mute &Stumm stellen &Deafen &Taub stellen &Local Mute &Lokal stumm stellen Send a Text Message Sende eine Text-Nachricht Sends a text message to another user. Schickt eine Textnachricht an einen anderen Benutzer. Add new channel Neuen Kanal hinzufügen This adds a new sub-channel to the currently selected channel. Dies fügt dem aktuell gewählten Kanal einen Unterkanal hinzu. Remove channel Kanal entfernen This removes a channel and all sub-channels. Dies entfernt einen Kanal und all seine Unterkanäle. Edit Groups and ACL for channel Gruppen und Berechtigungen des Kanals bearbeiten This opens the Group and ACL dialog for the channel, to control permissions. Dies öffnet den Gruppen- und Berechtigungen-Dialog des Kanals um die Berechtigungen einzustellen. &Link &Verknüpfen Link your channel to another channel Verknüpft ihren aktuellen Kanal mit einem anderen This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. Dies ist die Chatbar<br /> Wenn Sie hier Text eingeben und Enter drücken wird der Text an den Benutzer oder Kanal gesendet, welcher ausgewählt ist. Sofern nichts selektiert ist wird die Nachricht an den aktuellen Kanal gesendet. Chatbar Chatbar Shows a dialog of registered servers, and also allows quick-connect. Zeigt ein Fenster mit registrierten Servern und erlaubt es Ihnen schnell zu diesen zu verbinden. Kick user (with reason) Benutzer kicken (mit Begründung) Kick selected user off server. You'll be asked to specify a reason. Den ausgewählten Benutzer vom Server kicken. Sie werden nach einer Begründung gefragt. Mute user Benutzer stumm stellen Mute or unmute user on server. Unmuting a deafened user will also undeafen them. Benutzer auf dem Server stummstellen oder das stummstellen aufheben. Das aufheben auf einem taubgestellten Benutzer wird das taubstellen ebenfalls entfernen. Kick and ban user (with reason) Benutzer kicken und bannen (mit Begründung) Kick and ban selected user from server. You'll be asked to specify a reason. Den gewählten Benutzer vom Server kicken und bannen. Sie werden nach einem Grund gefragt werden. Deafen user Benutzer taub stellen Deafen or undeafen user on server. Deafening a user will also mute them. Den Benutzer auf dem Server taubstellen oder das taubstellen aufheben. Beim Taubstellen eines Benutzers wird dieser automatisch auch stummgestellt. Mute user locally Benutzer lokal stumm stellen Mute or unmute user locally. Use this on other users in the same room. Benutzer lokal stummstellen oder lokales Stummstellen aufheben. Verwenden Sie dies auf andere Benutzer im selben Raum. This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. Dies verbindet den aktuellen Kanal mit dem Gewählten. Wenn Benutzer Spracherlaubnis auch im anderen Kanal haben, so können sie sich jetzt, mit jenen aus dem anderen Kanal, gegenseitig hören. Dies ist eine permanente Verbindung die so lange bestehen bleibt, bis die Verknüpfung manuell aufgehoben oder der Server neu gestartet wird. &Unlink Channel Verknü&pfung entfernen Unlink your channel from another channel Die Verknüpfung des aktuellen Kanals zu einem anderen Kanal trennen This unlinks your current channel from the selected channel. Dies trennt die Verknüpfung des aktuellen Kanals zum Ausgewählten. Unlinks your channel from all linked channels. Trennt alle verbundenen Kanäle. This unlinks your current channel (not the selected one) from all linked channels. Dies trennt die Verbindungen des aktuellen Kanals (nicht des ausgewählten) zu allen verknüpften Kanälen. &Reset &Zurücksetzen Reset audio preprocessor Setzt den Audio-Präprozessor zurück This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. Setzt den Audio-Präprozessor zurück: unter anderem Geräuschunterdrückung, automatische Gain und Sprachaktivitätserkennung. Wenn etwas plötzlich die Audioumgebung verschlechtert (z.B. das Fallen lassen des Mikrofons), so kann dies verwendet werden um nicht auf das Anpassen des Präprozessor warten zu müssen. &Mute Self Selbst &Stumm stellen Mute yourself Sich selbst stumm stellen Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. Stellen Sie sich selbst stumm oder deaktivieren es. Wenn Sie stummgestellt sind werden keine Daten von Ihnen an den Server gesendet. Deaktivieren Sie das Stummstellen während Sie taubgestellt sind, wird dieses auch deaktiviert. &Deafen Self Selbst &Taub stellen Deafen yourself Sich selbst taubstellen Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. Sich selbst Taubstellen an/aus. Wenn taubgestellt hört man nichts. Sich taub zu stellen stellt einen automatisch stumm. &Text-To-Speech &Text-Zu-Sprache Toggle Text-To-Speech Text-Zu-Sprache ein-/ausschalten Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. Text-Zu-Sprache-Engine ein- oder ausschalten. Nur Nachrichten die in den Einstellungen aktiviert sind werden auch tatsächlich gesprochen. Display audio statistics Zeigt Audiostatistiken an Pops up a small dialog with information about your current audio input. Zeigt einen kleinen Dialog mit Informationen über den aktuellen Audio-Eingang. Forcibly unlink plugin Trennen des Plugins erzwingen This forces the current plugin to unlink, which is handy if it is reading completely wrong data. Dies zwingt das aktuelle Plugin zur Trennung, was hilfreich sein kann, wenn es völlig falsche Daten einliest. Configure Mumble Mumble konfigurieren Allows you to change most settings for Mumble. Erlaubt Ihnen die meisten Einstellungen von Mumble zu ändern. Start the audio configuration wizard Startet den Audiokonfigurations-Assistenten This will guide you through the process of configuring your audio hardware. Dies leitet Sie durch den Hardware-Konfigurationsprozess. &What's This? &Was ist das? Enter What's This? mode Was ist das?-Modus betreten Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. Dies anklicken um den "Was ist das?"-Modus zu aktivieren. Der Cursor wird sich in ein Fragezeichen ändern. Klickt man damit auf irgendeinen Button, Menüeintrag oder ein Gebiet, wird eine kurze Beschreibung angezeigt. Information about Mumble Informationen über Mumble Shows a small dialog with information and license for Mumble. Zeigt einen kleinen Dialog mit Informationen über Mumble und zur Lizenzierung. Information about Speex Informationen über Speex Shows a small dialog with information about Speex. Zeigt einen kleinen Dialog mit Informationen über Speex. Information about Qt Informationen über Qt Shows a small dialog with information about Qt. Zeigt einen kleinen Dialog mit Informationen über Qt. Check for &Updates Auf &Updates prüfen Check for new version of Mumble Prüfen, ob eine neue Version von Mumble verfügbar ist Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. Verbindet sich mit der Mumble-Webseite um zu überprüfen ob eine neue Version verfügbar ist. Ist eine neue Version verfügbar wird mit einer passenden Download-URL darauf hingewiesen. Sends a text message to all users in a channel. Schickt eine Textnachricht an alle Benutzer im Kanal. Configure certificates for strong authentication Konfiguriert Zertifikate für die sichere Authentifikation This starts the wizard for creating, importing and exporting certificates for authentication against servers. Dies startet einen Assistenten zum Erstellen, Importieren und Exportieren von Zertifikaten welche zum authentifizieren gegenüber Servern verwendet werden. Register user on server Registriert den Benutzer auf dem Server This will permanently register the user on the server. Dies registriert den Benutzer permanent auf dem Server. Add &Friend &Freund hinzufügen Adds a user as your friend. Fügt einen Benutzer als Freund hinzu. This will add the user as a friend, so you can recognize him on this and other servers. Dies fügt den Benutzer als Freund hinzu, so dass Sie ihn sowohl auf diesem, wie auch auf anderen Servern wieder erkennen. &Remove Friend Freund entfe&rnen Removes a user from your friends. Entfernt einen Benutzer aus der Freundesliste. This will remove a user from your friends list. Entfernt einen Benutzer aus der Freundesliste. &Update Friend Fre&und aktualisieren Update name of your friend. Aktualisiere den Namen des Freundes. Your friend uses a different name than what is in your database. This will update the name. Ihr Freund verwendet einen anderen Namen als jenen, der in Ihrer Datenbank gespeichert ist. Dies aktualisiert den Namen. Edit registered users list Bearbeitet die Liste der registrierten Benutzer This opens the editor for registered users, which allow you to change their name or unregister them. Dies öffnet den Editor für registrierte Benutzer, welcher es Ihnen erlaubt deren Namen zu ändern und Sie zu löschen. Add or remove text-based access tokens Text-basierte Zugriffscodes (Passwörter) hinzufügen und entfernen &Minimal View &Minimalansicht Toggle minimal window modes Zwischen Minimalansichts-Modi umschalten This will toggle minimal mode, where the log window and menu is hidden. Dies schaltet in den Minimal-Modus um, in dem das Logfenster und das Menu versteckt sind. You muted and deafened %1. Sie haben %1 stumm und taub gestellt. You unmuted and undeafened %1. Sie haben Taub-/Stummstellen von %1 deaktiviert. You undeafened %1. Sie haben die Taubstellung von %1 deaktiviert. You suppressed %1. Sie haben die Sprachunterdrückung von %1 aktiviert. %1 muted and deafened by %2. %1 wurde stumm und taub gestellt durch %2. %1 unmuted and undeafened by %2. Taub-/Stummstellen von %1 wurden durch %2 deaktiviert. %1 undeafened by %2. Taubstellen von %1 wurde durch %2 deaktiviert. %1 suppressed by %2. Sprachunterdrückung von %1 aktiviert durch %2. %1 moved to %2. %1 wechselte zum Kanal %2. %1 moved to %2 by %3. %1 verschoben nach %2 durch %3. %1 moved in from %2 by %3. %1 hinein verschoben aus %2 durch %3. %1 is now muted and deafened. %1 hat sich stumm und taub gestellt. Your account information can not be verified currently. Please try again later Ihre Account Informationen können im Moment nicht verifiziert werden. Bitte versuchen Sie es später erneut Welcome message: %1 Willkommensnachricht: %1 Mumble: %1 Mumble: %1 You were denied %1 privileges in %2. Ihnen wurden die Rechte %1 in %2 verweigert. %3 was denied %1 privileges in %2. %3 wurden die Rechte %1 in %2 verweigert. Denied: Cannot modify SuperUser. Abgelehnt: SuperUser kann nicht geändert werden. Denied: Invalid channel name. Abgelehnt: Ungültiger Kanalname. Denied: Text message too long. Abgelehnt: Text-Nachricht zu lang. Denied: Operation not permitted in temporary channel. Abgelehnt: Operation in temporärem Kanal nicht erlaubt. You need a certificate to perform this operation. Sie benötigen ein Zertifikat um diese Operation auszuführen. %1 does not have a certificate. %1 hat kein Zertifikat. Invalid username: %1. Ungültiger Benutzername: %1. Invalid username. Ungültiger Benutzername. Channel is full. Der Kanal ist voll. Channel nesting limit reached. Maximale Verschachtelungstiefe erreicht. Channel count limit reached. Need to delete channels before creating new ones. Kanalzahlgrenze erreicht. Sie müssen Kanäle löschen, bevor Sie neue erstellen können. Permission denied. Zugriff verweigert. %1 connected and entered channel. %1 hat sich mit dem Server verbunden und betrat den Kanal. %1 connected. %1 beigetreten. %1 is now muted. %1 hat sich stumm gestellt. %1 is now unmuted. %1 ist jetzt nicht mehr stumm gestellt. Recording started Aufnahme gestartet Recording stopped Aufnahme beendet %1 started recording. %1 nimmt jetzt auf. %1 stopped recording. %1 nimmt nicht mehr auf. You revoked your priority speaker status. Bevorzugter-Sprecher-Status aufgegeben. You assumed priority speaker status. Bevorzugter-Sprecher-Status angenommen. %1 revoked your priority speaker status. %1 hat Ihren Bevorzugter-Sprecher-Status widerrufen. %1 gave you priority speaker status. %1 hat Sie zum bevorzugten Sprecher gemacht. You revoked priority speaker status for %1. Sie haben den Bevorzugter-Sprecher-Status von %1 widerrufen. You gave priority speaker status to %1. Sie haben %1 zum bevorzugten Sprecher gemacht. %1 revoked own priority speaker status. %1 hat seinen Bevorzugter-Sprecher-Status aufgegeben. %1 assumed priority speaker status. %1 ist nun bevorzugter Sprecher. %1 revoked priority speaker status for %2. %1 hat den Bevorzugter-Sprecher-Status von %2 widerrufen. %1 gave priority speaker status to %2. %1 hat %2 zum bevorzugten Sprecher gemacht. You were unmuted and undeafened by %1. Stumm-/Taubstellen wurde deaktiviert durch %1. You were muted by %1. Stummstellung wurde aktiviert durch %1. You were undeafened by %1. Taubstellen wurde deaktiviert durch %1. You were suppressed. You were suppressed by %1. Sprachunterdrückung wurde aktiviert. You were unsuppressed. Ihre Sprachunterdrückung wurde deaktiviert. You were unsuppressed by %1. Ihre Sprachunterdrückung wurde deaktiviert durch %1. You joined %1. Beigetreten in %1 You moved %1 to %2. Sie haben %1 nach %2 verschoben. %1 is recording %1 nimmt auf %1 renamed to %2 by %3. %1 umbenannt zu %2 durch %3. %1 disconnected. %1 hat den Server verlassen. Server message from Server (Tree) (Baum) (Channel) (Kanal) (Private) (Privat) %2%1: %3 %2%1: %3 Failed to load Opus, it will not be available for audio encoding/decoding. The server requests minimum client version %1 Der Server empfiehlt mindestens die Client-Version %1 The server requests positional audio be enabled. Der Server empfiehlt das Aktivieren des Positionsabhängigen Audios. The server requests positional audio be disabled. Der Server empfiehlt das Deaktivieren des Positionsabhängigen Audios. The server requests Push-to-Talk be enabled. Der Server empfiehlt das Aktivieren von Push-To-Talk. The server requests Push-to-Talk be disabled. Der Server empfiehlt das Deaktivieren von Push-To-Talk. You were unmuted by %1. Stummstellung wurde aufgehoben durch %1. You muted %1. Sie haben %1 stumm gestellt. You unsuppressed %1. Sprachunterdrückung von %1 deaktiviert. You unmuted %1. Stummstellung von %1 aufgehoben. %1 muted by %2. %1 durch %2 stumm gestellt. %1 unsuppressed by %2. Die Sprachunterdrückung von %1 wurde durch %2 deaktiviert. %1 unmuted by %2. Stummstellen von %1 wurde durch %2 deaktiviert. Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. Es wurde kein für alle Benutzer passender CELT-Codec gefunden. Sie werden nicht zu allen Benutzern sprechen können. You were muted and deafened by %1. You were deafened by %1. Sie wurden taub gestellt durch %1. You were kicked from the server by %1: %2. Sie wurden vom Server gekickt durch %1: %2. %3 was kicked from the server by %1: %2. %3 wurde vom Server gekickt durch %1: %2. You were kicked and banned from the server by %1: %2. Sie wurden vom Server gekickt und gebannt durch %1: %2. %3 was kicked and banned from the server by %1: %2. %3 wurde vom Server gekickt und gebannt durch %1: %2. You were moved to %1 by %2. Sie wurden nach %1 verschoben durch %2. %1 entered channel. %1 betrat den Kanal. Server connection rejected: %1. Serververbindung abgelehnt : %1. Denied: %1. Abgelehnt: %1. %1 renamed to %2. %1 umbenannt zu %2. %1 left channel and disconnected. %1 verließ den Kanal und hat den Server verlassen. Message from %1 Nachricht von %1 You have User Dragging set to "Do Nothing" so the user wasn't moved. Du hast den Benutzer Verschiebemodus auf "Nichts Tun" konfiguriert, daher wurde der Benutzer nicht verschoben. You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. Die Kanal-Ziehen-Aktion wurde auf "Nichts tun" gesetzt. Der Kanal wird also nicht bewegt. Unknown Channel Drag mode in UserModel::dropMimeData. Unbekannter Kanal-Verschiebe-Modus in UserModel::dropMimeData. Remote controlling Mumble: Mumble-Fernsteuerung: Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) -jn, --jackname Set custom Jack client name. --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status Aufruf: mumble rpc <Aktion> [Optionen] Es ist möglich, eine laufende Instanz von Mumble mit Hilfe des Befehls 'mumble rpc' fernzusteuern. Gültige Aktion sind: mute Stummschalten unmute Stummschalten aufheben deaf Dämpfen undeaf Dämpfen aufheben Invocation Aufruf Error: No RPC command specified Fehler: Kein RPC-Befehl angegeben RPC RPC Welcome to Mumble. Willkommen in Mumble. Skipping version check in debug mode. Überspringe Versionsüberprüfung im Debug-Modus. Hide Frame Fenster verstecken Toggle showing frame on minimal window Anzeige des Rahmens im Minimal-Modus wechseln This will toggle whether the minimal window should have a frame for moving and resizing. Dies wechselt ob das Minimal-Fenster einen Rahmen zum verschieben und vergrößern hat oder nicht. &Unlink All &Alle Verknüpfungen entfernen Reset the comment of the selected user. Setzt den Kommentar des ausgewählten Benutzers zurück. &Join Channel &Kanal betreten View comment in editor Zeige Kommentar im Editor Query server for connection information for user Zeige Informationen über den Benutzer an S&erver S&erver &Self &Selbst &Unlink Plugins Pl&ugins trennen Register yourself on the server Sich selbst auf dem Server registrieren Change your avatar image on this server Avatarbild auf diesem Server ändern &Remove Avatar Avatar entfe&rnen Remove currently defined avatar image. Aktuell verwendetes Avatarbild entfernen. Icon Toolbar Symbol-Werkzeugleiste Change your own comment Ändert Ihren eigenen Kommentar Recording Aufnahme Priority Speaker Bevorzugter Sprecher &Copy URL &URL kopieren Copies a link to this channel to the clipboard. Kopiert einen Link zu diesem Kanal in die Zwischenablage. Ignore Messages Textnachrichten ignorieren Locally ignore user's text chat messages. Textnachrichten des Benutzers werden lokal nicht angezeigt. Silently drops all text messages from the user. Verwirft alle Textnachrichten von diesem Benutzer. Edit ban list on server Bearbeite Bannliste des Servers This lets you edit the server-side IP ban list. Dies lässt Sie die Server-seitige IP-Bannliste bearbeiten. &Filter on/off &Filter an/aus Toggle the channel filter (Ctrl+F) Kanalfilter umschalten (Strg+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. Aktiviere oder deaktiviere die Filterung von ausgewählten Kanälen. Per Voreinstellung werden alle leeren Kanäle herausgefiltert. Sie können zusätzliche Kanäle zum Filtern über das Kontextmenü des Kanals auswählen. Ctrl+F Strg+F &Hide Channel when Filtering &verberge Kanal, während des Filterns Reset the avatar of the selected user. Setzt den Avatar des ausgewählten Benutzers zurück. Locally adjust the user's speech volume. Die Lautstärke des Benutzers lokal einstellen. Opens a dialog with a volume slider. Use this on other users in the same room. Öffnet einen Dialog mit einem Lautstärkeregler . Verwenden Sie dies auf andere Benutzer im selben Raum. &Developer &Entwickler &Hide Mumble Mumble &Verstecken Hides the main Mumble window. Versteckt das Mumble Hauptfenster Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. Versteckt das Mumble Hauptfenster. Um es wieder anzuzeigen klicke auf das Tray Icon oder starte Mumble erneut. Show the Developer Console Entwicklerkonsole anzeigen Shows the Mumble Developer Console, where Mumble's log output can be inspected. Zeigt die Mumble Entwicklerkonsole an, in welcher Mumble's Log Ausgaben angezeigt werden. &Connect... &Verbinden... &Ban list... &Bannliste... &Information... &Informationen... &Kick... &Kicken... &Ban... &Bannen... Local Volume Adjustment... Lokale Lautstärkenanpassung... Send &Message... &Nachricht senden... &Add... &Hinzufügen... &Remove... Entfe&rnen... &Edit... B&earbeiten... Audio S&tatistics... Audios&tatistiken... &Settings... &Einstellungen... &Audio Wizard... &Audio-Assistent... Developer &Console... Entwickler&konsole... &About... Ü&ber... About &Speex... Über &Speex... About &Qt... Über &Qt... &Certificate Wizard... &Zertifikats-Assistent... &Register... &Registrieren... Registered &Users... Registrierte Ben&utzer... Change &Avatar... &Avatar ändern... &Access Tokens... &Zugriffscodes Reset &Comment... &Kommentar zurücksetzen... Reset &Avatar... Avatar &zurücksetzen... View Comment... Kommentar ansehen... &Change Comment... K&ommentar ändern... R&egister... R&egistrieren... Show Anzeigen Shows the main Mumble window. Zeigt das Mumble-Hauptfenster an Manual Manual Mumble Positional Audio Manuelles Mumble Positionsabhängiges Audio Position Position X X Y Y Z Z m m Heading Richtung Azimuth Azimut Elevation Höhenwinkel ° ° Meta data Metadaten Context Kontext Identity Identität Set Festlegen State Status Linked Verlinkt Activated Aktiviert Unhinge Trennen NetworkConfig Network Netzwerk Updates are mandatory when using snapshot releases. Aktualisierungen sind verpflichtend wenn Sie Snapshots verwenden. Connection Verbindung Use TCP compatibility mode Use TCP compatability mode Benutze TCP-Kompatibilitätsmodus <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). <b>TCP-Kompatibilitätsmodus aktivieren</b>.<br />Dies lässt Mumble nur TCP zur Kommunikation mit dem Server nutzen. Dies wird den Overhead erhöhen und bei verlorenen Paketen hörbare Pausen produzieren. Sie sollten diese Einstellung also nur verwenden, wenn die Standardeinstellungen nicht funktionieren. Reconnect when disconnected Nach Verbindungsabbruch erneut verbinden <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. <b>Neuverbinden nach Verbindungsabbruch</b>.<br />Ist dieses Feld aktiviert führt Mumble beim Abbruch der Serververbindung eine automatische Neuverbindung nach 10 Sekunden durch. Reconnect automatically Automatisch Neuverbinden Proxy Proxy Type Typ Type of proxy to connect through Art des Proxys durch den verbunden werden soll Direct connection Direkte Verbindung HTTP(S) proxy HTTP(S) Proxy SOCKS5 proxy SOCKS5 Proxy Hostname Hostname Hostname of the proxy Hostname des Proxys Force TCP mode Erzwinge TCP-Modus Enable QoS to prioritize packets Aktiviere QoS um Pakete zu priorisieren This will enable QoS, which will attempt to prioritize voice packets over other traffic. Dies aktiviert QoS, welches versucht Audio-Pakete höher zu priorisieren als anderen Netzwerkverkehr. Use Quality of Service Verwende Quality of Service (QoS) Don't send certificate to server and don't save passwords. (Not saved). Schicke kein Zertifikat zum Server und speichere keine Passwörter (Wird nicht gespeichert). <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> <b>Dies verhindert das senden von Identitäts-Informationen vom Client.</b> <p>Der Client wird sich nicht mit einem Zertifikat identifizieren, selbst wenn der Zugriff dann verweigert wird, und wird keine Passwörter für Verbindungen zwischenspeichern. Dies ist hauptsächlich eine Test-Option und wird daher nicht gespeichert.</p> Suppress certificate and password storage Zertifikats- und Passwort-Speicherung unterdrücken <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>Proxytyp über den verbunden wird.</b><br />Dies lässt Mumble für alle ausgehenden Verbindungen über einen Proxy verbinden. Beachten Sie: Proxy tunneling zwingt Mumble in den TCP-Kompatibilitätsmodus was zur Folge hat, dass alle Sprach-Daten über den Kontrollkanal gesendet werden. <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. <b>Hostname des Proxys.</b><br/> Dieses Feld legt den Hostnamen des Proxys, durch welchen Sie die Netzwerk Daten versenden möchten, fest. Port Port Port number of the proxy Portnummer des Proxys <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. <b>Portnummer des Proxys.</b><br />Dieses Feld spezifiert die Portnummer auf der der Proxy eine Verbindung erwartet. Username Benutzername Username for proxy authentication Benutzername für Proxy-Authentisierung <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>Benutzername für Proxy-Authentisierung.</b><br />Dieses Feld spezifiert den Benutzernamen mit dem Sie sich beim Proxy authentisieren. Falls der Proxy keine Authentisierung verwendet, oder Sie sich anonym verbinden wollen, lassen Sie das Feld frei. Password Passwort Password for proxy authentication Passwort für Proxy-Authentisierung <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>Passwort für Proxy-Authentisierung.</b><br />Dieses Feld spezifiert das Passwort welches zur Authentisierung mit dem Proxy verwendet wird. Falls der Proxy keine Authentisierung verwendet oder Sie sich anonym verbinden wollen, lassen Sie das Feld frei. Mumble services Mumble Dienste Check for new releases of Mumble automatically. Überprüfe automatisch, ob eine neue Mumble Version verfügbar ist. This will check for new releases of Mumble every time you start the program, and notify you if one is available. Dies wird bei jedem Start des Programms auf neue Mumble Versionen prüfen und Sie, sofern es welche gibt, darüber informieren. Check for application updates on startup Überprüfe beim Start ob Updates verfügbar sind Check for new releases of plugins automatically. Überprüfe automatisch, ob aktualisierte Plugins verfügbar sind. This will check for new releases of plugins every time you start the program, and download them automatically. Dies veranlasst Mumble bei jedem Programmstart auf neue Plugin-Versionen zu prüfen und diese gegebenenfalls automatisch herunterzuladen. <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. <b>Anonyme Statistiken senden</b><br/> Mumble hat ein kleines Entwickler-Team. Deshalb muss die verfügbare Zeit auf die wichtigsten Dinge konzentriert werden. Indem Sie einige anonymisierte Daten senden, helfen Sie beim festlegen der Entwicklungsprioritäten. Submit anonymous statistics to the Mumble project Sende anonyme Statistiken an das Mumble Projekt Submit anonymous statistics Sende anonyme Statistiken Reconnect to last used server when starting Mumble Beim Start zum zuletzt benutzten Server verbinden Reconnect to last server on startup Beim Start zum zuletzt benutzten Server verbinden Download plugin and overlay updates on startup Plugin und Overlay Updates beim Starten herunterladen Privacy Datenschutz Prevent OS information being sent to Mumble servers and web servers Verhindern, dass OS Informationen zu Mumble-Servern und web-Servern übermittelt werden <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. Keine OS Informationen zu Servern übermitteln</b><br/> Verhindert, dass potenziell identifizierende Informationen über das Betriebssystem zu Mumble Servern und Web Servern übermittelt werden. Do not send OS information to Mumble servers and web servers Verhindern, dass OS Informationen zu Mumble-Servern und Web-Servern übermittelt werden Overlay Silent Still Talking Sprechen Whisper Flüstern Shout Rufen Channel Kanal Failed to create communication with overlay at %2: %1. No overlay will be available. Kommunikation mit dem Overlay auf %2: %1 fehlgeschlagen. Das Overlay wird nicht verfügbar sein. OverlayClient Filter Filter Only talking Nur Sprechende Talking and recently active Sprechend und kürzlich aktiv All in current channel Alle im aktuellen Kanal All in linked channels Alle in verknüpften Kanälen Always show yourself Sich selbst immer anzeigen Configure recently active time (%1 seconds)... Zeitspanne bearbeiten, in der Benutzer als aktiv gelten (%1 Sekunden)... Columns Spalten Sort Sortierung Alphabetically Alphabetisch Last state change Nach letzter Statusänderung Edit... Bearbeiten... Reset Zoom Zoom zurücksetzen Configure recently active time Zeitspanne bearbeiten, in der Benutzer als aktiv gelten Amount of seconds users remain active after talking: Dauer in Sekunden innerhalb der ein Benutzer nach dem Sprechen noch als aktiv gilt: OverlayConfig To move the users, drag the little red dot. Ziehen Sie den kleinen roten Punkt um die Benutzer zu verschieben. To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. Um die Größe der Benutzer zu ändern benutzen Sie die Scrollfunktion des Mausrads. For more options, right click a user. For more options, rightclick a user. Für mehr Optionen klicken Sie mit der rechten Maustaste auf einen Benutzer. Launcher Filter Startprogramm Filter Overlay Overlay Choose executable Anwendung auswählen Choose application Anwendung auswählen Choose path Pfad auswählen Load Overlay Presets Lade Overlay Vorlage Mumble overlay presets (*.mumblelay) Mumble Overlay Vorlage (*.mumblelay) Save Overlay Presets Overlay Vorlage abspeichern Options Optionen Enable overlay. Overlay aktivieren. Enable Overlay Overlay aktivieren This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. Dies legt fest ob das Overlay aktiv ist oder nicht. Diese Einstellung wird nur überprüft wenn Anwendungen gestartet werden, stellen Sie also sicher, dass Mumble läuft und die Option aktiviert ist, bevor Sie die andere Applikation, in welcher das Overlay erscheinen soll, starten.<br/> Bitte beachten Sie: Wenn Sie Mumble nach dem Applikationsstart starten oder das Overlay deaktivieren während die Applikation läuft gibt es keinen sicheren Weg das Overlay wieder zu starten ohne die Applikation neu zu starten. Layout Anordnung Blacklist Blacklist Whitelist Whitelist Uninstall Overlay Overlay deinstallieren Overlay Installation Overlay Installation Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. Mumble hat erkannt, dass Sie kein Mumble Overlay installiert haben. Klicken Sie den Button unten um das Overlay zu installieren. Install Mumble Overlay Mumble Overlay Installieren Overlay Upgrade Overlay Aktualisierung Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. Mumble hat erkannt, dass Sie eine alte Version der Overlay Unterstützungs-Dateien installiert sind. Um diese Dateien zu aktualisieren, klicken Sie unten den Button. Upgrade Mumble Overlay Mumble Overlay Aktualisieren Display a frame counter in the overlay Zeige die FPS im Overlay an Show FPS counter Zeige FPS Zähler Load an overlay preset from file Lädt eine Overlay Vorlage aus einer Datei Load… Laden... Save your overlay settings to file Sichert Ihre Overlay Einstellungen in eine Datei Save… Sichern... Set the overlay font. Setzt die Overlay Schrift. Set the overlay text color. Setzt die Overlay Textfarbe. Color Farbe Remove Entfernen Font Schrift FPS and Clock Display FPS- und Uhr-Anzeige Display a clock in the overlay showing the current local time (system time). Zeige eine Uhr im Overlay, die die aktuelle, lokale Zeit (Systemzeit) anzeigt. Show Clock Zeige Uhr Overlay Exceptions Ausnahmeliste Overlay Exception Mode Ausnahmeliste überlagern Allowed launchers Erlaubte Starter Add Hinzufügen Allowed programs Erlaubte Programme Allowed paths Erlaubte Pfade Blacklisted programs Programme in der Blacklist OverlayEditor State Status User is not talking Benutzer spricht nicht Passive Inaktiv User is talking in your channel or a linked channel Benutzer spricht in Ihrem oder einem verknüpften Kanal Talking Sprechen User is whispering to you privately Benutzer flüstert privat zu Ihnen Private Whisper Flüstern User is shouting to your channel Benutzer ruft zu den Benutzern in Ihrem Kanal Channel Whisper Rufen (Kanal) Zoom Zoom Zoom Factor Zoomfaktor Enabled Elements Aktivierte Elemente User avatar, chosen by each user Avatar, den jeder Benutzer selbst wählen kann Avatar Avatar User's name Benutzername Username Benutzername Name of user's channel, if outside your current channel Name des Kanals des Benutzers, sofern er sich nicht innerhalb ihres Kanals befindet Channel Kanal Muted or deafened Stumm oder taub gestellt Mute state Stumm Status Bounding box, automatically shrunk to minimum size to contain all visible elements Ein Rahmen, der automatisch alle sichtbaren Elemente einschliesst Bounding box Rahmen Overlay Editor Overlay Editor OverlayEditorScene Layout preset Layout Vorlage Large square avatar Großer quadratischer Avatar Avatar and Name Avatar und Name User Opacity Benutzer-Deckkraft %1% %1% Object Opacity Objekt-Deckkraft Alignment Ausrichtung Left Links Center Mitte Right Rechts Top Oben Bottom Unten Color... Farbe... Font... Schrift... Bounding box Rahmen Pen width Rahmenbreite Padding Rahmenabstand Pen color Rahmenfarbe Fill color Füllfarbe Pick pen color Pinsel-Farbe wählen Pick fill color Füll-Farbe wählen Pick color Farbe wählen Pick font Schriftart wählen PluginConfig Plugins Plugins Plugin has no configure function. Plugin hat keine Konfigurationsfunktion. Plugin has no about function. Plugin hat keine Über-Funktion. Options Optionen Enable plugins and transmit positional information Plugins aktivieren und Positionsinformationen übertragen This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. Dies erlaubt es Plugins Ihre Position im Spiel zu bestimmen und diese mit jedem Sprachpaket zu versenden. Dies erlaubt es anderen Benutzern Sie aus jener Richtung zu hören, in welcher Sie aus der Sicht der anderen Person stehen. Link to Game and Transmit Position Mit Spiel verbinden und Position übertragen Reloads all plugins Lädt alle Plugins neu This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. Dies liest alle Plugins neu ein. Benutzen Sie dies, falls Sie dem Pluginverzeichnis ein Plugin hinzugefügt, oder ein Plugin geändert haben. &Reload plugins Plugins &neu laden Information about plugin Informationen über das Plugin This shows a small information message about the plugin. Dies zeigt eine kleine Informationsnachricht über das Plugin an. &About Ü&ber Show configuration page of plugin Zeige Konfiguration des Plugins This shows the configuration page of the plugin, if any. Dies zeigt eine Konfigurationsseite des Plugins an, falls eine existiert. &Configure &Konfigurieren Name Name Enabled Aktiviert Plugins Skipping plugin update in debug mode. Überspringe Plugin-Aktualisierung im Debug-Modus. Downloaded new or updated plugin to %1. Neues oder aktualisiertes Plugin nach %1 heruntergeladen. Failed to install new plugin to %1. Installation eines neuen Plugins nach %1 fehlgeschlagen. %1 lost link. %1 hat Verbindung verloren. %1 linked. %1 verbunden. PortAudioSystem Default Device Standardgerät PulseAudioSystem Default Input Standardeingabe Default Output Standardausgabe QApplication Failed to restart mumble Konnte Mumble nicht neustarten Mumble failed to restart itself. Please restart it manually. Beim Neustarten von Mumble ist ein Fehler aufgetreten. Bitte starten Sie Mumble manuell neu. RichTextEditor Failed to load image Laden des Bildes fehlgeschlagen Image file too large to embed in document. Please use images smaller than %1 kB. Bilddatei zu groß um Sie im Dokument einzubetten. Bitte verwenden Sie Bilder kleiner als %1 kB. Message is too long. Nachricht ist zu lang. Display Anzeige Source Text Quelltext &Bold &Fett Ctrl+B Strg+B &Italic &Kursiv Italic Kursiv Ctrl+I Strg+I Underline Unterstrichen Ctrl+U STRG+U Color Farbe Insert Link Link einfügen Ctrl+L STRG+L Insert Image Bild einfügen RichTextEditorLink Add Link Link hinzufügen URL URL Text Text ServerHandler Unable to resolve hostname Auflösen des Hostnamens nicht möglich Server is not responding to TCP pings Server antwortet nicht auf TCP Pings UDP packets cannot be sent to or received from the server. Switching to TCP mode. UDP Pakete können nicht gesendet oder vom Server nicht empfangen werden. Wechsle zu TCP-Modus. UDP packets cannot be sent to the server. Switching to TCP mode. UDP Pakete können nicht zum Server gesendet werden. Wechsle in den TCP-Modus. UDP packets cannot be received from the server. Switching to TCP mode. UDP Pakete können vom Server nicht empfangen werden. Wechsle in den TCP-Modus. UDP packets can be sent to and received from the server. Switching back to UDP mode. UDP Pakete können zum Server gesendet und vom Server empfangen werden. Wechsle zurück in den UDP-Modus. Connection timed out Verbindung wegen Zeitüberschreitung unterbrochen ServerView Favorite Favoriten LAN LAN Public Internet Internet – Öffentlich Unknown Unbekannt Africa Afrika Asia Asien North America Nordamerika South America Südamerika Europe Europa Oceania Ozeanien ShortcutActionWidget Unassigned Nicht zugewiesen ShortcutDelegate On An Off Aus Toggle Wechseln Unassigned Nicht zugewiesen ShortcutKeyWidget Press Shortcut Tastenkürzel drücken ShortcutTargetDialog Root Hauptkanal Parent Elternkanal Current Aktueller Kanal Subchannel #%1 Unterkanal #%1 ShortcutTargetWidget ... , , Root Hauptkanal Parent Elternkanal Current Aktueller Kanal Subchannel #%1 Unterkanal #%1 Invalid Ungültig Empty <Empty> Leer ShortcutToggleWidget Off Aus Toggle Wechseln On An TextMessage Enter text Text eingeben If checked the message is recursively sent to all subchannels Wenn aktiviert wird die Nachricht rekursiv auch an alle Unterkanäle gesendet Send recursively to subchannels Sende rekursiv an Unterkanäle Tokens Empty Token Leerer Zugriffscode Mumble - Access Tokens Mumble - Zugriffscodes List of access tokens on current server Liste von Zugriffscodes auf dem aktuellen Server <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. <b>Dies ist eine editierbare Liste von Zugriffscodes auf dem verbundenen Server.</b> <br /> Ein Zugriffscode ist eine Zeichenfolge, die als Passwort für ein sehr einfaches Zugriffsmanagement für Kanäle verwendet werden kann. Mumble merkt sich die von Ihnen verwendeten Zugriffscodes und sendet diese das nächste Mal automatisch an den Server, damit Sie sie nicht jedes Mal eingeben müssen. Add a token Einen Zugriffscode hinzufügen &Add &Hinzufügen Remove a token Einen Zugriffscode entfernen &Remove &Entfernen UserEdit Registered Users Registrierte Benutzer Remove Entfernen Rename Umbenennen Who are you looking for? Nach wem suchen Sie? Days Tage Weeks Wochen Months Monate Years Jahre Inactive for Inaktiv seit Registered users: %n account(s) Registrierte Benutzer: %n KontoRegistrierte Benutzer: %n Konten UserInformation User Information Benutzerinformationen Connection Information Verbindungsinformationen Version Version OS Betriebssystem Certificate Zertifikat IP Address IP-Adresse CELT Versions CELT-Versionen Details... Details... Ping Statistics Pingstatistik Pings received Empfangen Average ping Durchschnitt TCP (Control) TCP (Steuerung) UDP (Voice) UDP (Stimme) UDP Network statistics UDP Netzwerkstatistik Good Gut Late Spät Lost Verloren Resync Resync From Client Vom Client To Client Zum Client Connection time Verbindungszeit %1w %1w %1d %1d %1h %1h %1m %1m %1s %1s , , %1 (%2) %1.%2.%3 (%4) %1 (%2) Supported Unterstützt Not Supported Nicht unterstützt Not Reported Nicht gemeldet %1 online (%2 idle) %1 online (%2 untätig) %1 online %1 online %1 kbit/s %1 kbit/s Bandwidth GroupBox Bandbreite Bandwidth Label Bandbreite Ping deviation Ping Abweichung UserListModel Nick Spitzname Inactive days Inaktive Tage Last channel Letzter Kanal Last seen: %1 Zuletzt gesehen: %1 Never Niemals Channel ID: %1 Kanal ID: %1 UserLocalVolumeDialog Local volume for other users Lokale Lautstärke für andere Benutzer <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. <b>Die Lautstärke der anderen Benutzer lokal einstellen</b><br />Mumble unterstützt das lokale Einstellen der Lautstärke für andere Nutzer. Adjusting local volume for %1 Lokale Lautstärke für %1 einstellen dB dB <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> <html><head/><body><p>Benutzen Sie den Schieberegler oder das Eingabefeld um die Lautstärke des Benutzers zu verändern. Je lauter Sie den Ton stellen, desto stärker ist ein Hintergrundrauschen zu hören.</p><p><span style="font-weight:600;">Vorsicht!</span></p><p>Zu laute Geräusche können Ihrem Gehör dauerhaften Schaden zufügen.</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: Dies ist ein zum Server verbundener Benutzer. Das Icon links vom Benutzer zeigt, ob der Benutzer spricht oder nicht: Talking to your channel. Spricht zu Ihrem Kanal. Shouting directly to your channel. Whispering directly to your channel. Direkt an Ihren Kanal rufen. Whispering directly to you. Flüstert direkt zu Ihnen. Not talking. Spricht nicht. This is a channel on the server. The icon indicates the state of the channel: Dies ist ein Kanal auf dem Server. Das Icon zeigt den Zustand des Kanals: Your current channel. Ihr aktueller Kanal. A channel that is linked with your channel. Linked channels can talk to each other. Ein Kanal welcher mit Ihrem Kanal verknüpft ist. Benutzer in verknüpften Kanälen können miteinander sprechen. A channel on the server that you are not linked to. Ein Kanal auf dem Server mit dem Sie nicht verknüpft sind. This shows the flags the user has on the server, if any: Dies zeigt die Attribute, welche der Benutzer auf dem Server hat (sofern er welche hat): On your friend list Auf deiner Freundesliste Authenticated user Authentifizierter Benutzer Muted (manually muted by self) Stumm gestellt (selbst) Muted (manually muted by admin) Stumm gestellt (von Admin) Muted (not allowed to speak in current channel) Stumm (darf im aktuellen Kanal nicht sprechen) Muted (muted by you, only on your machine) Stumm gestellt (von Ihnen, nur für Sie) Muted (push-to-mute) Stummgeschaltet (Push-to-Mute) Deafened (by self) Taub gestellt (selbst) Deafened (by admin) Taub gestellt (von Admin) User has a new comment set (click to show) Benutzer hat einen neuen Kommentar gesetzt (klicken um anzusehen) User has a comment set, which you've already seen. (click to show) Benutzer hat einen Kommentar gesetzt, welchen Sie schon gesehen haben. (klicken um anzusehen) Ignoring Text Messages Textnachrichten ignorieren This shows the flags the channel has, if any: Dies zeigt die Attribute, welche der Kanal hat (sofern vorhanden): Channel has a new comment set (click to show) Kanal hat einen neuen Kommentar (klicken um anzusehen) Channel has a comment set, which you've already seen. (click to show) Kanal hat einen Kommentar gesetzt, welchen Sie bereits gesehen haben. (klicken um anzusehen) Channel will be hidden when filtering is enabled Kanal wird versteckt wenn die Filterung aktiviert ist Name Name Flags Attribute Are you sure you want to drag this user? Sind Sie sicher dass sie diesen Benutzer verschieben möchten? Are you sure you want to drag this channel? Sind Sie sicher, dass Sie den Kanal verschieben möchten? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. Kann dieses Verschieben nicht automatisiert ausführen. Bitte setzen Sie die Kanalpositionswert zurück oder setzen Sie sie manuell. VersionCheck Upgrade Mumble Mumble aktualisieren A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? Eine neue Version von Mumble ist verfügbar und wurde automatisch heruntergeladen. Es wird empfohlen, dass Sie entweder diese neue Version oder die letzte stabile Version installieren. Möchten Sie die neue Version jetzt installieren? Failed to launch snapshot installer. Start des Snapshot-Installers fehlgeschlagen. Corrupt download of new version detected. Automatically removed. Der Download der neuen Mumble-Version war fehlerhaft und wurde gelöscht. Downloading new snapshot from %1 to %2 Neuer Snapshot wird heruntergeladen von %1 nach %2 Failed to write new version to disk. Failed to write new version to disc. Neue Version konnte nicht auf die Festplatte geschrieben werden. Mumble failed to retrieve version information from the central server. Mumble konnte keine Versions-Informationen vom Zentralserver abrufen. ViewCert Certificate Chain Details Zertifikatsketten-Details Certificate chain Zertifikatskette Certificate details Zertifikatdetails Common Name Bekannter Name Organization Organisation Subunit Untereinheit Country Land Locality Lokalität State Staat Valid from: %1 Gültig von : %1 Valid to: %1 Gültig bis: %1 Serial: %1 Serial: %1 Public Key: %1 bits %2 Öffentlicher Schlüssel: %1 bits %2 RSA RSA DSA DSA Digest (SHA-1): %1 Digest (SHA-1): %1 Digest (SHA-256): %1 Kurzfassung (SHA-256): %1 Email: %1 Email: %1 DNS: %1 DNS: %1 Issued by: Ausgegeben von: Unit Name Einheit Name VoiceRecorder Recorder failed to create directory '%1' Recorder konnte Verzeichnis '%1' nicht erstellen Recorder failed to open file '%1' Datei '%1' konnte für die Aufnahme nicht geöffnet werden .wav - Uncompressed .wav - Unkomprimiert .ogg (Vorbis) - Compressed .ogg (Vorbis) - Komprimiert .au - Uncompressed .au - Unkomprimiert .flac - Lossless compressed .flac - Verlustfrei komprimiert VoiceRecorderDialog Recorder Aufnahme Control Steuerung 00:00:00 00:00:00 &Start &Start S&top S&top Mode Modus Multichannel Mehrkanal Output Ausgabe Output format Ausgabeformat Target directory Zielverzeichnis Filename Dateiname &Browse... &Durchsuchen... Valid variables are: Gültige Variablen sind: Inserts the user's name Fügt den Namen des Benutzers ein Inserts the current date Fügt das aktuelle Datum ein Inserts the current time Fügt die aktuelle Uhrzeit ein Inserts the hostname Fügt den Hostnamen ein Recorder still running Aufnahme aktiv Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? Das schließen des Aufnahme-Fensters führt dazu, dass die die aufgezeichnete Audio-Sequenz nicht gespeichert wird. Möchtest du die Aufnahme wirklich beenden? Unable to start recording. Not connected to a server. Aufnahme kann nicht gestartet werden, da keine Verbindung zu einem Server besteht. The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. Der Server mit dem Sie aktuell verbunden sind hat die Version 1.2.2 oder älter. Aus Gründen der Privatsphäre sind Aufnahmen auf Servern älter als 1.2.3 nicht möglich. There is already a recorder active for this server. Es läuft bereits eine Aufnahme für diesen Server. Please select a recording format. Bitte wählen Sie ein Aufnahmeformat aus. Stopping beenden Select target directory Zielverzeichnis auswählen Downmix Gemischt WASAPIInput Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone. WASAPISystem Default Device Standardgerät qwPTTButtonWidget Mumble PTT Mumble PTT Push to talk Push-To-Talk mumble-1.3.4/src/mumble/BanEditor.ui0000664000175000017500000002345114010707273017124 0ustar builderbuilder BanEditor 0 0 454 470 Mumble - Edit Bans Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok Ban List false Search field This is the search field. Use it to find bans that have this username set in the username field. Qt::AlignCenter Who are you looking for? User false No nickname 0 0 &Address qleIP 0 0 false IP address No IP address 0 0 &Mask qsbMask 8 128 128 Reason Reason for the ban No reason Start false false false 0 0 End Ban end date Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). true Hash Certificate hash Qt::ImhLowercaseOnly|Qt::ImhNoAutoUppercase No certificate hash Banned users This is a list with banned users. true false false Use this button if you want to add a new ban. &Add false Use this button if you want to update ban information. &Update false Use this button if you want to remove user from the ban list. &Remove Clear all fields This button clears all fields. Use it if you want to add a new ban. Clear qbbButtons accepted() BanEditor accept() 227 617 157 274 qbbButtons rejected() BanEditor reject() 295 623 286 274 mumble-1.3.4/src/mumble/PathListWidget.cpp0000664000175000017500000000533514010707273020317 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "PathListWidget.h" #include #include #include #include #include #include "Overlay.h" PathListWidget::PathListWidget(QWidget *parent) : QListWidget(parent) , pathType(FILE_EXE) { setAcceptDrops(true); } void PathListWidget::setPathType(PathType type) { pathType = type; } void PathListWidget::addFilePath(const QString &path) { QString qsAppIdentifier = OverlayAppInfo::applicationIdentifierForPath(path); QStringList qslIdentifiers; for (int i = 0; i < count(); i++) { qslIdentifiers << item(i)->data(Qt::UserRole).toString(); } if (! qslIdentifiers.contains(qsAppIdentifier)) { OverlayAppInfo oai = OverlayAppInfo::applicationInfoForId(qsAppIdentifier); QListWidgetItem *qlwiApplication = new QListWidgetItem(oai.qiIcon, oai.qsDisplayName, this); qlwiApplication->setData(Qt::UserRole, QVariant(qsAppIdentifier)); setCurrentItem(qlwiApplication); } } void PathListWidget::addFolderPath(const QString &path) { QString dir = QDir::toNativeSeparators(path); QStringList qslIdentifiers; for (int i = 0; i < count(); i++) { qslIdentifiers << item(i)->data(Qt::UserRole).toString(); } if (! dir.isEmpty() && ! qslIdentifiers.contains(dir)) { QListWidgetItem *qlwiPath = new QListWidgetItem(QIcon(), QDir(dir).path(), this); qlwiPath->setData(Qt::UserRole, QVariant(dir)); setCurrentItem(qlwiPath); } } void PathListWidget::checkAcceptDragEvent(QDropEvent *event, bool store) { if (event->mimeData()->hasUrls()) { foreach (QUrl url, event->mimeData()->urls()) { if (url.isLocalFile()) { QFileInfo info(url.toLocalFile()); switch (pathType) { case FILE_EXE: if (info.isFile() && info.isExecutable()) { if (store) { addFilePath(info.filePath()); } event->setDropAction(Qt::LinkAction); event->accept(); } break; case FOLDER: if (info.isDir()) { if (store) { addFolderPath(url.toLocalFile()); } event->setDropAction(Qt::LinkAction); event->accept(); } break; } } } } } void PathListWidget::dragEnterEvent(QDragEnterEvent *event) { checkAcceptDragEvent(event, false); } void PathListWidget::dragMoveEvent(QDragMoveEvent *event) { checkAcceptDragEvent(event, false); } void PathListWidget::dropEvent(QDropEvent *event) { checkAcceptDragEvent(event, true); } mumble-1.3.4/src/mumble/TextToSpeech.cpp0000664000175000017500000000233714010707273020001 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "TextToSpeech.h" #include class TextToSpeechPrivate { public: QTextToSpeech *m_tts; QVector m_voices; TextToSpeechPrivate(); ~TextToSpeechPrivate(); void say(const QString &text); void setVolume(int v); }; TextToSpeechPrivate::TextToSpeechPrivate() { m_tts = new QTextToSpeech(); } TextToSpeechPrivate::~TextToSpeechPrivate() { delete m_tts; } void TextToSpeechPrivate::say(const QString &text) { m_tts->say(text); } void TextToSpeechPrivate::setVolume(int volume) { m_tts->setVolume(volume); } TextToSpeech::TextToSpeech(QObject *p) : QObject(p) { enabled = true; d = new TextToSpeechPrivate(); } TextToSpeech::~TextToSpeech() { delete d; } void TextToSpeech::say(const QString &text) { if (enabled) d->say(text); } void TextToSpeech::setEnabled(bool e) { enabled = e; } void TextToSpeech::setVolume(int volume) { d->setVolume(volume); } bool TextToSpeech::isEnabled() const { return enabled; } mumble-1.3.4/src/mumble/NetworkConfig.cpp0000664000175000017500000001235714010707273020204 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "NetworkConfig.h" #include "MainWindow.h" #include "OSInfo.h" // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" static ConfigWidget *NetworkConfigNew(Settings &st) { return new NetworkConfig(st); } static ConfigRegistrar registrar(1300, NetworkConfigNew); NetworkConfig::NetworkConfig(Settings &st) : ConfigWidget(st) { setupUi(this); #ifdef NO_UPDATE_CHECK qcbAutoUpdate->hide(); qcbPluginUpdate->hide(); #endif } QString NetworkConfig::title() const { return tr("Network"); } QIcon NetworkConfig::icon() const { return QIcon(QLatin1String("skin:config_network.png")); } void NetworkConfig::load(const Settings &r) { loadCheckBox(qcbTcpMode, s.bTCPCompat); loadCheckBox(qcbQoS, s.bQoS); loadCheckBox(qcbAutoReconnect, s.bReconnect); loadCheckBox(qcbAutoConnect, s.bAutoConnect); loadCheckBox(qcbSuppressIdentity, s.bSuppressIdentity); loadComboBox(qcbType, s.ptProxyType); qleHostname->setText(r.qsProxyHost); if (r.usProxyPort > 0) { QString port; port.setNum(r.usProxyPort); qlePort->setText(port); } else qlePort->setText(QString()); qleUsername->setText(r.qsProxyUsername); qlePassword->setText(r.qsProxyPassword); loadCheckBox(qcbHideOS, s.bHideOS); loadCheckBox(qcbAutoUpdate, r.bUpdateCheck); loadCheckBox(qcbPluginUpdate, r.bPluginCheck); loadCheckBox(qcbUsage, r.bUsage); #if defined(SNAPSHOT_BUILD) && defined(QT_NO_DEBUG) qcbAutoUpdate->setEnabled(false); qcbAutoUpdate->setToolTip(tr("Updates are mandatory when using snapshot releases.")); #endif } void NetworkConfig::save() const { s.bTCPCompat = qcbTcpMode->isChecked(); s.bQoS = qcbQoS->isChecked(); s.bReconnect = qcbAutoReconnect->isChecked(); s.bAutoConnect = qcbAutoConnect->isChecked(); s.bSuppressIdentity = qcbSuppressIdentity->isChecked(); s.bHideOS = qcbHideOS->isChecked(); s.ptProxyType = static_cast(qcbType->currentIndex()); s.qsProxyHost = qleHostname->text(); s.usProxyPort = qlePort->text().toUShort(); s.qsProxyUsername = qleUsername->text(); s.qsProxyPassword = qlePassword->text(); s.bUpdateCheck=qcbAutoUpdate->isChecked(); s.bPluginCheck=qcbPluginUpdate->isChecked(); s.bUsage=qcbUsage->isChecked(); } static QNetworkProxy::ProxyType local_to_qt_proxy(Settings::ProxyType pt) { switch (pt) { case Settings::NoProxy: return QNetworkProxy::NoProxy; case Settings::HttpProxy: return QNetworkProxy::HttpProxy; case Settings::Socks5Proxy: return QNetworkProxy::Socks5Proxy; } return QNetworkProxy::NoProxy; } void NetworkConfig::SetupProxy() { QNetworkProxy proxy; proxy.setType(local_to_qt_proxy(g.s.ptProxyType)); proxy.setHostName(g.s.qsProxyHost); proxy.setPort(g.s.usProxyPort); proxy.setUser(g.s.qsProxyUsername); proxy.setPassword(g.s.qsProxyPassword); QNetworkProxy::setApplicationProxy(proxy); } bool NetworkConfig::TcpModeEnabled() { /* * We force TCP mode for both HTTP and SOCKS5 proxies, even though SOCKS5 supports UDP. * * This is because Qt's automatic application-wide proxying fails when we're in UDP * mode since the datagram transmission code assumes that its socket is created in its * own thread. Due to the automatic proxying, this assumption is incorrect, because of * Qt's behind-the-scenes magic. * * However, TCP mode uses Qt events to make sure packets are sent off from the right * thread, and this is what we utilize here. * * This is probably not even something that should even be taken care of, as proxying * itself already is a potential latency killer. */ return g.s.ptProxyType != Settings::NoProxy || g.s.bTCPCompat; } void NetworkConfig::accept() const { NetworkConfig::SetupProxy(); } void NetworkConfig::on_qcbType_currentIndexChanged(int v) { Settings::ProxyType pt = static_cast(v); qleHostname->setEnabled(pt != Settings::NoProxy); qlePort->setEnabled(pt != Settings::NoProxy); qleUsername->setEnabled(pt != Settings::NoProxy); qlePassword->setEnabled(pt != Settings::NoProxy); qcbTcpMode->setEnabled(pt == Settings::NoProxy); s.ptProxyType = pt; } QNetworkReply *Network::get(const QUrl &url) { QNetworkRequest req(url); prepareRequest(req); return g.nam->get(req); } void Network::prepareRequest(QNetworkRequest &req) { req.setAttribute(QNetworkRequest::HttpPipeliningAllowedAttribute, true); // Do not send OS information if the corresponding privacy setting is enabled if (g.s.bHideOS) { req.setRawHeader(QString::fromLatin1("User-Agent").toUtf8(), QString::fromLatin1("Mozilla/5.0 Mumble/%1 %2").arg(QLatin1String(MUMTEXT(MUMBLE_VERSION_STRING)), QLatin1String(MUMBLE_RELEASE)).toUtf8()); } else { req.setRawHeader(QString::fromLatin1("User-Agent").toUtf8(), QString::fromLatin1("Mozilla/5.0 (%1; %2) Mumble/%3 %4").arg(OSInfo::getOS(), OSInfo::getOSVersion(), QLatin1String(MUMTEXT(MUMBLE_VERSION_STRING)), QLatin1String(MUMBLE_RELEASE)).toUtf8()); } } mumble-1.3.4/src/mumble/Usage.h0000664000175000017500000000113414010707273016125 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_USAGE_H_ #define MUMBLE_MUMBLE_USAGE_H_ #include #include #include class ClientUser; class Usage : public QObject { Q_OBJECT protected: QBuffer qbReport; QDataStream qdsReport; public: Usage(QObject *p = NULL); public slots: void registerUsage(); }; #endif mumble-1.3.4/src/mumble/PTTButtonWidget.ui0000664000175000017500000000172414010707273020263 0ustar builderbuilder qwPTTButtonWidget 0 0 100 100 Mumble PTT 0 0 0 Push to talk true mumble-1.3.4/src/mumble/Audio.h0000664000175000017500000000252414010707273016126 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_AUDIO_H_ #define MUMBLE_MUMBLE_AUDIO_H_ #include #include #include #include #include #include #include "ClientUser.h" #define SAMPLE_RATE 48000 typedef QPair audioDevice; class LoopUser : public ClientUser { private: Q_DISABLE_COPY(LoopUser) protected: QMutex qmLock; QTime qtTicker; QTime qtLastFetch; QMultiMap qmPackets; LoopUser(); public: static LoopUser lpLoopy; virtual void addFrame(const QByteArray &packet); void fetchFrames(); }; class RecordUser : public LoopUser { private: Q_OBJECT Q_DISABLE_COPY(RecordUser) public: RecordUser(); ~RecordUser() Q_DECL_OVERRIDE; void addFrame(const QByteArray &packet) Q_DECL_OVERRIDE; }; namespace Audio { void startInput(const QString &input = QString()); void stopInput(); void startOutput(const QString &output = QString()); void stopOutput(); void start(const QString &input = QString(), const QString &output = QString()); void stop(); } #endif mumble-1.3.4/src/mumble/mumble_te.ts0000664000175000017500000116530414010707274017245 0ustar builderbuilder ACLEditor Deny నిరాకరించు Allow అనుమతించు Allow %1 అనుమతించు %1 Deny %1 నిరాకరించు %1 Mumble - Add channel ముంబుల్- ఛానల్ ను జోడించు Default server value సడలించు సర్వర్ విలువ Failed: Invalid channel విఫలమైనది: నిరుపయోగ ఛానల్ Mumble - Edit %1 ముంబుల్- %1 ను సవరించు ID: %1 గుర్తింపు:%1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 ఇది% 1 హక్కును మంజూరు చేస్తుంది. ఒక విశేషణం అనుమతి మరియు తిరస్కరించబడినట్లయితే, అది ఖండించబడింది. <br />% 2 Channel must have a name ఛానల్ కు ఒక పేరు తప్పనిసరిగా ఉండాలి This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Dialog కబురు Name నామము Enter the channel name here. ఛానల్ పేరును ఇక్కడ నమోదు చెయ్యండి. Description కధనం Password సాంకేతిక పదం Enter the channel password here. ఛానల్ సాంకేతిక పదాన్ని ఇక్కడ నమోదు చెయ్యండి Check to create a temporary channel. తాత్కాలిక ఛానల్ ను రూపకల్పనచేయుటకు తనిఖీ. Temporary అనిత్యమైన <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. Position స్థితి &Groups &బృందాలు Group బృందం List of groups వర్గాల జాబితా Remove selected group ఎంచుకున్న సమూహాన్ని తొలగించు Remove తొలగించు Inherit group members from parent తల్లితండ్రి నుంచి వారసత్వ జాబితసంక్య Inherit వారసత్వంగా Make group inheritable to sub-channels Inheritable వారసత్వం Group was inherited from parent channel గ్రూప్ వజ్ ఇణెరిటెడ్ బై పెరెంట్ పెరెంట్ Inherited సంక్రమించిన Members సభ్యులు Add కలుపు Add member to group సమూహాంలో సభ్యులను చేర్చు Remove member from group సమూహాం నుంచి సభ్యులను తొలగించు &ACL &ఎసిఎల్ Active ACLs చురుకైన ఎసిఎల్స్ List of entries ప్రవేశాల జాబితా Inherit ACL of parent? తల్లిదండ్రుల ACL వారసత్వంగా ఉందా? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. ఈ వస్తువుకు ACL యొక్క మాతృ ఛానళ్ల గొలుసును వర్తింపజేయాలా లేదో అన్నది. పేరెంట్లో "ఉప-ఛానళ్లకు వర్తింపజేయడం" గా గుర్తించబడిన ఆ ఎంట్రీలు మాత్రమే వారసత్వంగా పొందుతాయి. Inherit ACLs Move entry up ప్రవేశాన్ని పైకి తరలించు This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. ఇది జాబితాలో ఎంట్రీని కదిలిస్తుంది. ఎంట్రీలు క్రమంలో మూల్యాంకనం చేయబడినప్పుడు, ఇది వినియోగదారుల యొక్క ప్రభావవంతమైన అనుమతులను మార్చవచ్చు. మీరు వారసత్వంగా ఎంట్రీని నకిలీ చేయవలసి ఉండాల్సిన అవసరం ఉంటే, మీరు ఒక వారసత్వ ప్రవేశం పైన ప్రవేశించలేరు. &Up &పైకి Move entry down ప్రవేశాన్ని క్రిందికి తరలించు This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. ఇది జాబితాలో ఎంట్రీని డౌన్కిస్తుంది. ఎంట్రీలు క్రమంలో మూల్యాంకనం చేయబడినప్పుడు, ఇది వినియోగదారుల యొక్క ప్రభావవంతమైన అనుమతులను మార్చవచ్చు. &Down &క్రిందికి Add new entry కొత్త ప్రవేశాన్ని జోడించండి This adds a new entry, initially set with no permissions and applying to all. ఇది క్రొత్త ఎంట్రీని జతచేస్తుంది, ప్రారంభంలో ఏ అనుమతి లేకుండా మరియు అన్నింటికి వర్తింపచేస్తుంది. &Add &జోడించు Remove entry ప్రవేశాన్ని తొలగించు This removes the currently selected entry. ఇది ప్రస్తుతం ఎంచుకున్న ప్రవేసాన్ని తొలగిస్తుంది &Remove &తొలగించు Context అన్వయము Entry should apply to this channel. Entry should apply to this channel ప్రవేశాన్ని ఈ ఛానల్ కు అనువర్తనం చేయాలి. This makes the entry apply to this channel. ఇది ప్రవేశాన్ని ఈ ఛానల్ కు అనువరిస్తుంది Applies to this channel ఈ ఛానల్ కు వర్తిస్తుంది Entry should apply to sub-channels. ప్రవేశాన్ని ఉప ఛానల్ కు దరఖాస్తు చేయాలి. Add new group కొత్త సమూహాన్ని జోడించండి <b>Add</b><br/> Add a new group. Inherited members వారసత్వ సభ్యులు Contains the list of members added to the group by this channel. ఈ ఛానెల్ ద్వారా సమూహానికి జోడించిన సభ్యుల జాబితాను కలిగి ఉంటుంది. Contains a list of members whose group membership will not be inherited from the parent channel. పేరెంట్ ఛానల్ నుండి వారసత్వంగా తీసుకోబడని సభ్యుల జాబితాను కలిగి ఉంటుంది. Contains the list of members inherited by other channels. ఇతర మార్గాల ద్వారా వారసత్వంగా పొందిన సభ్యుల జాబితాను కలిగి ఉంటుంది. Type in the name of a user you wish to add to the group and click Add. మీరు గుంపుకు జోడించదలచిన వినియోగదారు పేరును టైప్ చేసి, జోడించు క్లిక్ చేయండి. Type in the name of a user you wish to remove from the group and click Add. మీరు గుంపు నుండి తొలగించాలనుకుంటున్న వినియోగదారు పేరును టైప్ చేసి, జోడించు క్లిక్ చేయండి. Exclude తొలగించు Excluded members తొలగించిన సభ్యులు This makes the entry apply to sub-channels of this channel. ఇది ఈ ఛానెల్ యొక్క ఉప-చానళ్లకు ఎంట్రీ వర్తిస్తుంది. Applies to sub-channels ఉప ఛానల్స్ కు వర్తిస్తుంది Permissions ఉత్తరువులు User/Group వినియోగదారుడు/సమూహం Group this entry applies to సమూహం ఈ ప్రవేశానికి వర్తిస్తుంది User ID సభ్యుడి గుర్తింపు User this entry applies to సభ్యుడు ఈ ప్రవేశానికి వర్తిస్తాడు This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. ఈ ఎంట్రీ వర్తించే వినియోగదారుని ఇది నియంత్రిస్తుంది. వినియోగదారు పేరును టైప్ చేసి, మ్యాచ్ కోసం సర్వర్ను ప్రశ్నించడానికి ఎంటర్ నొక్కండి. &Properties &గుణములు <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. ID of the channel. ఛానల్ యొక్క గుర్తింపు Maximum Users అత్యున్నత వినియోగదారులు Maximum number of users allowed in the channel అత్యున్నత సంఖ్యలో వినియోగదారులు ఛానల్ లో అనుమతించబడతారు <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. This is the sort order for the channel. ALSAAudioInput Default ALSA Card Opening chosen ALSA Input failed: %1 ALSAAudioOutput Default ALSA Card Opening chosen ALSA Output failed: %1 ASIOConfig %1 (version %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz ASIO Initialization failed: %1 Failed to instantiate ASIO driver ASIO Device selection పరికర ఎంపిక Device సాధనం Device to use for microphone మైక్రోఫోన్ కోసం ఉపయోగించే సాధనం This chooses what device to query. You still need to actually query the device and select which channels to use. Query selected device సందేహ ఎంపిక పరికరం This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Query &సందేహం Configure selected device ఎంచుకున్న సాదనాన్ని అమర్చు This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. ఇది ఎంచుకున్న పరికరాన్ని ఆకృతీకరిస్తుంది. అనేక ASIO డ్రైవర్లు తీవ్రంగా బగ్గీగా ఉన్నాయని తెలుసుకోండి మరియు వాటిని విచారణ లేదా వ్యవస్థ యొక్క క్రాష్కు కారణం కావచ్చు. &Configure &అమర్చడం Capabilities సామర్ధ్యములు Driver name Buffer size This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. Configure input channels Channels Microphone <- -> Unused Speakers ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. Opening selected ASIO device failed. No input will be done. AboutDialog About Mumble <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble &License A&uthors &Third-Party Licenses OK AudioInput Interface System Input method for audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Input device for audio <b>This is the input device to use for audio.</b> Transmission &Transmit When to transmit your speech <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. DoublePush Time If you press the PTT key twice in this time it will get locked. <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. Reset audio cue to default <b>Reset</b><br/>Reset the paths for the files to their default. Browse for on audio file Browse for off audio file Off On Preview the audio cues Use SNR based speech detection Signal to Noise <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. Amplitude Voice &Hold How long to keep transmitting after silence Silence Below <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. Speech Above Signal values above this count as voice Compression &Quality &స్వచత Quality of compression (peak bandwidth) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. Audio per packet How many audio frames to send per packet <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). Audio Processing Noise Suppression Noise suppression <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. Maximum amplification of input sound <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. Current speech detection chance Cancel echo from speakers Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. Disabled <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal values below this count as silence Maximum bandwidth used for sending audio Use Amplitude based speech detection <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). Exclusive mode <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive R&eset &Browse... B&rowse... &Preview <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. Displays an always on top window with a push to talk button in it Display push to talk window Misc Audible audio cue when starting or stopping to transmit <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. Audio cue Gets played when starting to transmit Gets played when stopping to transmit Hold Time Time the microphone stays open after the PTT key is released Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) Max. Amplification Idle action minutes do nothing deafen mute after Echo Cancellation Mixed echo cancellation Multichannel echo cancellation The idle action will be reversed upon any key or mouse button input Undo Idle action upon activity Apply RNNoise's noise suppression filter. <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. RNNoise Audio input AudioInputDialog Continuous Voice Activity Push To Talk Audio Input %1 ms Off %1 s %1 kb/s -%1 dB %1 kbit/s (Audio %2, Position %4, Overhead %3) AudioOutput Interface System Output method for audio <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Output device for audio <b>This is the output device to use for audio.</b> Positional Audio Audio Output Default &Jitter Buffer Safety margin for jitter buffer <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. Minimum distance to user before sound volume decreases This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. Volume వినికిడి Volume of incoming speech <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. Output Delay Amount of data to buffer The connected "speakers" are actually headphones The connected "speakers" are actually headphones. Factor for sound volume decrease Bloom Factor for sound volume increase How much should sound volume increase for sources that are really close? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Headphones Minimum Distance కనిస దూరం Maximum Distance Maximum distance, beyond which speech volume won't decrease Minimum Volume What should the volume be at the maximum distance? Loopback Test Delay Variance Variance in packet latency <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. Packet Loss Packet loss for loopback mode <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% &Loopback Desired loopback mode Attenuate applications by... Attenuation of other applications during speech <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. If checked Mumble lowers the volume of other applications while other users talk <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. while other users talk If checked Mumble lowers the volume of other applications while you talk <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. while you talk Exclusive mode, not recommended. <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive Priority Speaker If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. Attenuate other users while talking as Priority Speaker. Advanced Attenuation Options If checked, Mumble will only attenuate applications that are using the same output source as Mumble <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. Only attenuate applications using the same output device If checked, PulseAudio loopback modules will be attenuated <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. Attenuate PulseAudio loopback modules Audio output AudioOutputDialog None Local Server Audio Output %1 ms %1 % %1 m AudioOutputSample Choose sound file Invalid sound file The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. AudioStats >1000 ms >1000ms Audio Statistics Input Levels Peak microphone level Peak power in last frame This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. Peak speaker level This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. Peak clean level This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. Signal Analysis Microphone power How close the current input level is to ideal This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. Signal-To-Noise ratio Signal-To-Noise ratio from the microphone This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. Speech Probability Probability of speech This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). Configuration feedback Current audio bitrate Bitrate of last frame DoublePush interval Time between last two Push-To-Talk presses Speech Detection Current speech detection chance <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal and noise power spectrum Power spectrum of input signal and noise estimate This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. Echo Analysis Weights of the echo canceller This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. AudioWizard Audio Tuning Wizard Introduction Welcome to the Mumble Audio Wizard Finished Enjoy using Mumble Device selection Selecting the input and output device to use with Mumble. This is the device your microphone is connected to. System Input method for audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Input device to use <b>Selects which sound card to use for audio input.</b> Cancel echo from headset or speakers Use echo cancellation This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. This is the device your speakers or headphones are connected to. Output method for audio <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. Output device to use <b>Selects which sound card to use for audio Output.</b> Enable positional audio Allows positioning of sound Allows positioning of sound. <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> Input Device Output Device This allows Mumble to use positional audio to place voices. <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> Amount of data to buffer This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> Positional Audio Adjusting attenuation of positional audio. <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> Use headphones instead of speakers <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> Use headphones This ignores the OS speaker configuration and configures the positioning for headphones instead. Volume tuning Tuning microphone hardware volume to optimal settings. Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. Voice Activity Detection Letting Mumble figure out when you're talking and when you're silent. This will help Mumble figure out when you are talking. The first step is selecting which data value to use. Raw amplitude from input Signal-To-Noise ratio Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Device tuning Changing hardware output delays to their minimum value. Submit anonymous statistics to the Mumble project Push To Talk: Quality & Notifications Adjust quality and notification settings. Quality settings Low Balanced Notification settings Use Text-To-Speech to read notifications and messages to you. Disable Text-To-Speech and use sounds instead. %1 ms Enables attenuation of other applications while users talk to you Attenuate applications while other users talk High Custom You already set a customized quality configuration in Mumble. Select this setting to keep it. Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. Apply some high contrast optimizations for visually impaired users Use high contrast graphics Keep custom Text-To-Speech settings. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) BanEditor Mumble - Edit Bans &Address &Mask Reason Start End User Hash &Add &Update &Remove Ban List Search field This is the search field. Use it to find bans that have this username set in the username field. Who are you looking for? No nickname IP address No IP address Reason for the ban No reason Ban end date Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). Certificate hash No certificate hash Banned users This is a list with banned users. Use this button if you want to add a new ban. Use this button if you want to update ban information. Use this button if you want to remove user from the ban list. Clear all fields This button clears all fields. Use it if you want to add a new ban. Clear Ban List - %n Ban(s) CertView Name Email Issuer Expiry Date (none) Self-signed CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. There was an error generating your certificate.<br />Please try again. Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. The file could not be opened for writing. Please use another file. The file's permissions could not be set. No certificate and key has been written. Please use another file. The file could not be written successfully. Please use another file. The file could not be opened for reading. Please use another file. The file is empty or could not be read. Please use another file. The file did not contain a valid certificate and key. Please use another file. Select file to export certificate to Select file to import certificate from Unable to import. Missing password or incompatible file type. <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. Certificates Certificate Management Certificate Authentication Authenticating to servers without using passwords Current certificate This is the certificate Mumble currently uses. Current Certificate Create a new certificate This will create a new certificate. Import certificate from file This will import a certificate from file. Import a certificate Export Certificate This will export a certificate to file. Export current certificate Import Certificate PKCS #12 Certificate import <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> Import from Filename to import from This is the filename you wish to import a certificate from. Select file to import from This opens a file selection dialog to choose a file to import a certificate from. Open... Password Password for PKCS#12 file This is the password for the PKCS#12 file containing your certificate. Certificate to import This is the certificate you are importing. Certificate Details Replace Certificate Replace existing certificate with new certificate? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> This is the certificate Mumble currently uses. It will be replaced. New certificate This is the new certificate that will replace the old one. New Certificate Make a backup of your certificate Export to Filename to export to This is the filename you wish to export a certificate to. Save As... This is the certificate Mumble currently uses. It will be exported. Generate a new certificate for strong authentication <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> Name Email Your email address (e.g. johndoe@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. Your name (e.g. John Doe) This is your name, and will be filled out in the certificate. This field is entirely optional. Finish Certificate-based authentication is ready for use Enjoy using Mumble with strong authentication. Automatic certificate creation <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> ChanACL None Traverse Enter Speak Mute/Deafen Make channel Make temporary Link channel This represents no privileges. This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. This represents the permission to write text messages to other users in this channel. This represents the permission to forcibly remove users from the server. This represents the permission to permanently remove users from the server. This represents the permission to register and unregister users on the server. This represents the permission to register oneself on the server. Whisper Move Text message Kick Ban Register User Register Self Write ACL ChatbarTextEdit Paste and &Send Paste and send <center>Type chat message here</center> ClientUser Friend Authenticated Priority speaker Recording Muted (server) Deafened (server) Local Ignore (Text messages) Local Mute Muted (self) Deafened (self) ConfigDialog Accept changes This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. Reject changes This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. Apply changes This button will immediately apply all changes. Undo changes for current page This button will revert any changes done on the current page to the most recent applied settings. Restore defaults for current page This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. Mumble Configuration ConnectDialog Connecting to %1 Enter username Adding host %1 Servername Hostname Bonjour name Port Addresses Website Packet loss Ping (80%) %1 ms Ping (95%) Bandwidth %1 kbit/s &Connect &Filters Unknown Users Version Failed to fetch server list Mumble Server Connect Ping Remove from Favorites Add custom server Show all servers that respond to ping Show all servers with users Show all servers &Copy Copy favorite link to clipboard &Paste Paste favorite from clipboard &Edit... &Add New... Add to &Favorites Open &Webpage Show &Reachable Show &Populated Show &All ConnectDialogEdit Edit Server Name of the server A&ddress Internet address of the server. Internet address of the server. <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. &Port Port on which the server is listening <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. &Username Username to send to the server <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. Label Add Server You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 Password Password to send to the server <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. Show password <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. Local server label 127.0.0.1 64738 Your username Your password &Fill CoreAudioSystem Default Device CrashReporter Mumble Crash Report <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> Email address (optional) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash Send Report Don't send report Crash upload successful Thank you for helping make Mumble better! Crash upload failed We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 Uploading crash report Abort upload DXAudioInput Default DirectSound Voice Input Opening chosen DirectSound Input device failed. No microphone capture will be done. Opening chosen DirectSound Input failed. Default device will be used. Lost DirectSound input device. DXAudioOutput Default DirectSound Voice Output Opening chosen DirectSound Output failed. Default device will be used. Lost DirectSound output device. Opening chosen DirectSound Output failed. No audio will be heard. Database Mumble failed to initialize a database in any of the possible locations. The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. DeveloperConsole Developer Console DockTitleBar Drag here GlobalShortcut Shortcuts List of configured shortcuts Function Data Shortcut Suppress Add new shortcut This will add a new global shortcut &Add Remove selected shortcut This will permanently remove a selected shortcut. &Remove <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> Open Accessibility Preferences Skip Enable Global Shortcuts <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. Additional Shortcut Engines <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. Enable Windows hooks <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. Enable GKey <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. Enable XInput <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. Enable shortcuts in privileged applications GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> Shortcuts Shortcut button combination. <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. Suppress keys from other applications <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. GlobalShortcutTarget Whisper Target Whisper to list of Users Channel Target Restrict to Group If specified, only members of this group will receive the whisper. List of users Add Remove Modifiers Do not send positional audio information when using this whisper shortcut. Ignore positional audio Shout to Linked channels Shout to subchannels Shout to Channel The whisper will also be transmitted to linked channels. The whisper will also be sent to the subchannels of the channel target. GlobalShortcutX Mouse %1 JackAudioSystem Hardware Ports Mono Stereo LCD Not connected LCDConfig Enable this device LCD Devices Name <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> Size Enabled Views Minimum Column Width <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> This setting decides the width of column splitter. Splitter Width Log Debug Critical Warning Information Server Connected Server Disconnected Other self-muted/deafened Permission Denied Text Message User Joined Server User Left Server User recording state changed User kicked (you or by you) User kicked You self-muted User muted (you) User muted (by you) User muted (other) User Joined Channel User Left Channel You self-unmuted You self-deafened You self-undeafened User renamed You Joined Channel You Joined Channel (moved) User connected and entered channel User left channel and disconnected Private text message the server [[ Invalid size ]] [[ Text object too large to display ]] [Date changed to %1] link to %1 FTP link to %1 player link channel link %1 link LogConfig Toggle console for %1 events Toggle pop-up notifications for %1 events Toggle Text-To-Speech for %1 events Click here to toggle sound notification for %1 events Toggle window highlight (if not active) for %1 events Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. Messages Message Console Notification Text-To-Speech Soundfile Path Text To Speech Volume Volume of Text-To-Speech Engine <b>This is the volume used for the speech synthesis.</b> Length threshold Message length threshold for Text-To-Speech Engine <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. Characters Whisper If checked you will only hear whispers from users you added to your friend list. Only accept whispers from friends If enabled text messages you send will be read back to you with TTS Read back own messages Chat Log Maximum chat length Unlimited Lines Highlight LookConfig System default None Only with users All Ask Do Nothing Move <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory User Interface This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. List users above subchannels (requires restart). <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. Users above Channels <b>If set, will verify you want to quit if connected.</b> Show number of users in each channel Show channel user count Language Language to use (requires restart) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. Look and Feel Layout Classic Stacked Hybrid Custom This changes the behavior when moving channels. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. Expand When to automatically expand channels Channel Dragging Ask whether to close or minimize when quitting Mumble. Ask on quit while connected Always On Top <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> Hide in tray when minimized Hide the main Mumble window in the tray when it is minimized. This setting controls when the application will be always on top. Never Always In minimal view In normal view Displays talking status in system tray Show talking status in tray icon This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. Show context menu in menu bar Apply some high contrast optimizations for visually impaired users Optimize for high contrast Application Adds user and channel context menus into the menu bar Tray Icon Channel Tree Use selected item as the chat bar target Filter automatically hides empty channels Show transmit mode dropdown in toolbar Theme Theme to use to style the user interface <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. User Dragging This changes the behavior when moving users. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. Enable Developer menu When in custom layout mode, checking this disables rearranging. Lock layout MainWindow Root Push-to-Talk Global Shortcut Push and hold this button to send voice. Global Shortcut This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut Reset Audio Processor Global Shortcut Unlink Plugin Global Shortcut Push-to-Mute Global Shortcut Join Channel Global Shortcut Toggle Overlay Global Shortcut Toggle state of in-game overlay. Global Shortcut Toggle Minimal Global Shortcut Volume Up (+10%) Global Shortcut Volume Down (-10%) Global Shortcut Mumble Mumble -- %1 &Window Minimize Ctrl+M Close Mumble is currently connected to a server. Do you want to Close or Minimize it? Mute Self Global Shortcut Set self-mute status. Global Shortcut This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut Deafen Self Global Shortcut Set self-deafen status. Global Shortcut This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut Whisper/Shout Whisper <center>Not connected</center> Not connected Clear Opening URL %1 File does not exist File is not a configuration file. Settings merged from file. URL scheme is not 'mumble' This version of Mumble can't handle URLs for Mumble version %1.%2.%3 Connecting to %1 Enter username Connecting to server %1. Reconnecting. Transmit Mode set to Continuous <p>%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> Register yourself as %1 <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <h2>Version</h2><p>Protocol %1</p> <p>No build information or OS version available</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) The connection is secured by the cipher suite that OpenSSL identifies as %1 <p>The connection provides perfect forward secrecy</p> <p>The connection does not provide perfect forward secrecy</p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> Voice channel is sent over control channel Register user %1 <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> Kicking user %1 Banning user %1 View comment on user %1 Message to channel %1 Connected. <li>Expected certificate digest (SHA-1): %1</li> Server presented a certificate which failed verification. <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> SSL Version mismatch Server connection failed. <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>Type message to user '%1' here</center> Type message to user '%1' here Choose image file Failed to load image Could not open file for reading. Image format not recognized. &User &Channel Use in conjunction with Whisper to. Global Shortcut This will switch the states of the in-game overlay. Global Shortcut Link Channel Global Shortcut Cycle Transmit Mode Global Shortcut Set Transmit Mode to Push-To-Talk Global Shortcut Set Transmit Mode to Continuous Global Shortcut Set Transmit Mode to VAD Global Shortcut Send Text Message Global Shortcut Send Clipboard Text Message Global Shortcut This will send your Clipboard content to the channel you are currently in. Global Shortcut Continuous Voice Activity Push-to-Talk Mumble - Minimal View -- %1 Cancel Save Image As... Save Image File Could not save image: %1 Change your comment Transmit Mode set to Voice Activity Transmit Mode set to Push-to-Talk <p>Connected users: %1/%2</p> UDP Statistics To Server From Server Good Late Lost Resync <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> Mumble Server Information &View Certificate Enter reason Sending message to %1 To %1: %2 Message to %1 Are you sure you want to reset the comment of user %1? Are you sure you want to reset the avatar of user %1? Are you sure you want to delete %1 and all its sub-channels? Sending message to channel %1 Message to tree %1 To %1 (Tree): %2 (Tree) %1: %2 Unmuted and undeafened. Unmuted. Muted. Muted and deafened. Deafened. Undeafened. Restart Mumble? Some settings will only apply after a restart of Mumble. Restart Mumble now? About Qt SSL Verification failed: %1 <li>Server certificate digest (SHA-1): %1</li> <b>WARNING:</b> The server presented a certificate that was different from the stored one. This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. Server connection failed: %1. Disconnected from server. Invalid username You connected with an invalid username, please try another one. Username in use That username is already in use, please try another username. Wrong certificate or password Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. Wrong password Wrong server password for unregistered user account, please try again. Images (*.png *.jpg *.jpeg) C&onfigure &Help Log This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. &Quit Mumble Closes the program Exits the application. Ctrl+Q Open the server connection dialog &Disconnect Disconnect from server Disconnects you from the server. Show information about the server connection This will show extended information about the connection to the server. &Mute &Deafen &Local Mute Send a Text Message Sends a text message to another user. Add new channel This adds a new sub-channel to the currently selected channel. Remove channel This removes a channel and all sub-channels. Edit Groups and ACL for channel This opens the Group and ACL dialog for the channel, to control permissions. &Link Link your channel to another channel This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. Chatbar Shows a dialog of registered servers, and also allows quick-connect. Kick user (with reason) Kick selected user off server. You'll be asked to specify a reason. Mute user Mute or unmute user on server. Unmuting a deafened user will also undeafen them. Kick and ban user (with reason) Kick and ban selected user from server. You'll be asked to specify a reason. Deafen user Deafen or undeafen user on server. Deafening a user will also mute them. Mute user locally Mute or unmute user locally. Use this on other users in the same room. This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. &Unlink Channel Unlink your channel from another channel This unlinks your current channel from the selected channel. Unlinks your channel from all linked channels. This unlinks your current channel (not the selected one) from all linked channels. &Reset Reset audio preprocessor This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. &Mute Self Mute yourself Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. &Deafen Self Deafen yourself Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. &Text-To-Speech Toggle Text-To-Speech Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. Display audio statistics Pops up a small dialog with information about your current audio input. Forcibly unlink plugin This forces the current plugin to unlink, which is handy if it is reading completely wrong data. Configure Mumble Allows you to change most settings for Mumble. Start the audio configuration wizard This will guide you through the process of configuring your audio hardware. &What's This? Enter What's This? mode Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. Information about Mumble Shows a small dialog with information and license for Mumble. Information about Speex Shows a small dialog with information about Speex. Information about Qt Shows a small dialog with information about Qt. Check for &Updates Check for new version of Mumble Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. Sends a text message to all users in a channel. Configure certificates for strong authentication This starts the wizard for creating, importing and exporting certificates for authentication against servers. Register user on server This will permanently register the user on the server. Add &Friend Adds a user as your friend. This will add the user as a friend, so you can recognize him on this and other servers. &Remove Friend Removes a user from your friends. This will remove a user from your friends list. &Update Friend Update name of your friend. Your friend uses a different name than what is in your database. This will update the name. Edit registered users list This opens the editor for registered users, which allow you to change their name or unregister them. Add or remove text-based access tokens &Minimal View Toggle minimal window modes This will toggle minimal mode, where the log window and menu is hidden. You muted and deafened %1. You unmuted and undeafened %1. You undeafened %1. You suppressed %1. %1 muted and deafened by %2. %1 unmuted and undeafened by %2. %1 undeafened by %2. %1 suppressed by %2. %1 moved to %2. %1 moved to %2 by %3. %1 moved in from %2 by %3. %1 is now muted and deafened. Your account information can not be verified currently. Please try again later Welcome message: %1 Mumble: %1 You were denied %1 privileges in %2. %3 was denied %1 privileges in %2. Denied: Cannot modify SuperUser. Denied: Invalid channel name. Denied: Text message too long. Denied: Operation not permitted in temporary channel. You need a certificate to perform this operation. %1 does not have a certificate. Invalid username: %1. Invalid username. Channel is full. Channel nesting limit reached. Channel count limit reached. Need to delete channels before creating new ones. Permission denied. %1 connected and entered channel. %1 connected. %1 is now muted. %1 is now unmuted. Recording started Recording stopped %1 started recording. %1 stopped recording. You revoked your priority speaker status. You assumed priority speaker status. %1 revoked your priority speaker status. %1 gave you priority speaker status. You revoked priority speaker status for %1. You gave priority speaker status to %1. %1 revoked own priority speaker status. %1 assumed priority speaker status. %1 revoked priority speaker status for %2. %1 gave priority speaker status to %2. You were unmuted and undeafened by %1. You were muted by %1. You were undeafened by %1. You were suppressed. You were suppressed by %1. You were unsuppressed. You were unsuppressed by %1. You joined %1. You moved %1 to %2. %1 is recording %1 renamed to %2 by %3. %1 disconnected. Server message from (Tree) (Channel) (Private) %2%1: %3 Failed to load Opus, it will not be available for audio encoding/decoding. The server requests minimum client version %1 The server requests positional audio be enabled. The server requests positional audio be disabled. The server requests Push-to-Talk be enabled. The server requests Push-to-Talk be disabled. You were unmuted by %1. You muted %1. You unsuppressed %1. You unmuted %1. %1 muted by %2. %1 unsuppressed by %2. %1 unmuted by %2. Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. You were muted and deafened by %1. You were deafened by %1. You were kicked from the server by %1: %2. %3 was kicked from the server by %1: %2. You were kicked and banned from the server by %1: %2. %3 was kicked and banned from the server by %1: %2. You were moved to %1 by %2. %1 entered channel. Server connection rejected: %1. Denied: %1. %1 renamed to %2. %1 left channel and disconnected. Message from %1 You have User Dragging set to "Do Nothing" so the user wasn't moved. You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. Unknown Channel Drag mode in UserModel::dropMimeData. Remote controlling Mumble: Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) -jn, --jackname Set custom Jack client name. --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status Invocation Error: No RPC command specified RPC Welcome to Mumble. Skipping version check in debug mode. Hide Frame Toggle showing frame on minimal window This will toggle whether the minimal window should have a frame for moving and resizing. &Unlink All Reset the comment of the selected user. &Join Channel View comment in editor Query server for connection information for user S&erver &Self &Unlink Plugins Register yourself on the server Change your avatar image on this server &Remove Avatar Remove currently defined avatar image. Icon Toolbar Change your own comment Recording Priority Speaker &Copy URL Copies a link to this channel to the clipboard. Ignore Messages Locally ignore user's text chat messages. Silently drops all text messages from the user. Edit ban list on server This lets you edit the server-side IP ban list. &Filter on/off Toggle the channel filter (Ctrl+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. Ctrl+F &Hide Channel when Filtering Reset the avatar of the selected user. Locally adjust the user's speech volume. Opens a dialog with a volume slider. Use this on other users in the same room. &Developer &Hide Mumble Hides the main Mumble window. Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. Show the Developer Console Shows the Mumble Developer Console, where Mumble's log output can be inspected. &Connect... &Ban list... &Information... &Kick... &Ban... Local Volume Adjustment... Send &Message... &Add... &Remove... &Edit... Audio S&tatistics... &Settings... &Audio Wizard... Developer &Console... &About... About &Speex... About &Qt... &Certificate Wizard... &Register... Registered &Users... Change &Avatar... &Access Tokens... Reset &Comment... Reset &Avatar... View Comment... &Change Comment... R&egister... Show Shows the main Mumble window. Manual Manual Mumble Positional Audio Position X Y Z m Heading Azimuth Elevation ° Meta data Context Identity Set State Linked Activated Unhinge NetworkConfig Network Updates are mandatory when using snapshot releases. Connection Use TCP compatibility mode Use TCP compatability mode <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). Reconnect when disconnected <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. Reconnect automatically Proxy Type Type of proxy to connect through Direct connection HTTP(S) proxy SOCKS5 proxy Hostname Hostname of the proxy Force TCP mode Enable QoS to prioritize packets This will enable QoS, which will attempt to prioritize voice packets over other traffic. Use Quality of Service Don't send certificate to server and don't save passwords. (Not saved). <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> Suppress certificate and password storage <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. Port Port number of the proxy <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. Username Username for proxy authentication <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Password Password for proxy authentication <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Mumble services Check for new releases of Mumble automatically. This will check for new releases of Mumble every time you start the program, and notify you if one is available. Check for application updates on startup Check for new releases of plugins automatically. This will check for new releases of plugins every time you start the program, and download them automatically. <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. Submit anonymous statistics to the Mumble project Submit anonymous statistics Reconnect to last used server when starting Mumble Reconnect to last server on startup Download plugin and overlay updates on startup Privacy Prevent OS information being sent to Mumble servers and web servers <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. Do not send OS information to Mumble servers and web servers Overlay Silent Talking Whisper Shout Channel Failed to create communication with overlay at %2: %1. No overlay will be available. OverlayClient Filter Only talking Talking and recently active All in current channel All in linked channels Always show yourself Configure recently active time (%1 seconds)... Columns Sort Alphabetically Last state change Edit... Reset Zoom Configure recently active time Amount of seconds users remain active after talking: OverlayConfig To move the users, drag the little red dot. To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. For more options, right click a user. For more options, rightclick a user. Launcher Filter Overlay Choose executable Choose application Choose path Load Overlay Presets Mumble overlay presets (*.mumblelay) Save Overlay Presets Options Enable overlay. Enable Overlay This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. Layout Blacklist Whitelist Uninstall Overlay Overlay Installation Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. Install Mumble Overlay Overlay Upgrade Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. Upgrade Mumble Overlay Display a frame counter in the overlay Show FPS counter Load an overlay preset from file Load… Save your overlay settings to file Save… Set the overlay font. Set the overlay text color. Color Remove Font FPS and Clock Display Display a clock in the overlay showing the current local time (system time). Show Clock Overlay Exceptions Overlay Exception Mode Allowed launchers Add Allowed programs Allowed paths Blacklisted programs OverlayEditor State User is not talking Passive User is talking in your channel or a linked channel Talking User is whispering to you privately Private Whisper User is shouting to your channel Channel Whisper Zoom Zoom Factor Enabled Elements User avatar, chosen by each user Avatar User's name Username Name of user's channel, if outside your current channel Channel Muted or deafened Mute state Bounding box, automatically shrunk to minimum size to contain all visible elements Bounding box Overlay Editor OverlayEditorScene Layout preset Large square avatar Avatar and Name User Opacity %1% Object Opacity Alignment Left Center Right Top Bottom Color... Font... Bounding box Pen width Padding Pen color Fill color Pick pen color Pick fill color Pick color Pick font PluginConfig Plugins Plugin has no configure function. Plugin has no about function. Options Enable plugins and transmit positional information This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. Link to Game and Transmit Position Reloads all plugins This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. &Reload plugins Information about plugin This shows a small information message about the plugin. &About Show configuration page of plugin This shows the configuration page of the plugin, if any. &Configure Name Enabled Plugins Skipping plugin update in debug mode. Downloaded new or updated plugin to %1. Failed to install new plugin to %1. %1 lost link. %1 linked. PortAudioSystem Default Device PulseAudioSystem Default Input Default Output QApplication Failed to restart mumble Mumble failed to restart itself. Please restart it manually. RichTextEditor Failed to load image Image file too large to embed in document. Please use images smaller than %1 kB. Message is too long. Display Source Text &Bold Ctrl+B &Italic Italic Ctrl+I Underline Ctrl+U Color Insert Link Ctrl+L Insert Image RichTextEditorLink Add Link URL Text ServerHandler Unable to resolve hostname Server is not responding to TCP pings UDP packets cannot be sent to or received from the server. Switching to TCP mode. UDP packets cannot be sent to the server. Switching to TCP mode. UDP packets cannot be received from the server. Switching to TCP mode. UDP packets can be sent to and received from the server. Switching back to UDP mode. Connection timed out ServerView Favorite LAN Public Internet Unknown Africa Asia North America South America Europe Oceania ShortcutActionWidget Unassigned ShortcutDelegate On Off Toggle Unassigned ShortcutKeyWidget Press Shortcut ShortcutTargetDialog Root Parent Current Subchannel #%1 ShortcutTargetWidget ... , Root Parent Current Subchannel #%1 Invalid Empty <Empty> ShortcutToggleWidget Off Toggle On TextMessage Enter text If checked the message is recursively sent to all subchannels Send recursively to subchannels Tokens Empty Token Mumble - Access Tokens List of access tokens on current server <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. Add a token &Add Remove a token &Remove UserEdit Registered Users Remove Rename Who are you looking for? Days Weeks Months Years Inactive for Registered users: %n account(s) UserInformation User Information Connection Information Version OS Certificate IP Address CELT Versions Details... Ping Statistics Pings received Average ping TCP (Control) UDP (Voice) UDP Network statistics Good Late Lost Resync From Client To Client Connection time %1w %1d %1h %1m %1s , %1 (%2) %1.%2.%3 (%4) Supported Not Supported Not Reported %1 online (%2 idle) %1 online %1 kbit/s Bandwidth GroupBox Bandwidth Label Ping deviation UserListModel Nick Inactive days Last channel Last seen: %1 Never Channel ID: %1 UserLocalVolumeDialog Local volume for other users <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. Adjusting local volume for %1 dB <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: Talking to your channel. Shouting directly to your channel. Whispering directly to your channel. Whispering directly to you. Not talking. This is a channel on the server. The icon indicates the state of the channel: Your current channel. A channel that is linked with your channel. Linked channels can talk to each other. A channel on the server that you are not linked to. This shows the flags the user has on the server, if any: On your friend list Authenticated user Muted (manually muted by self) Muted (manually muted by admin) Muted (not allowed to speak in current channel) Muted (muted by you, only on your machine) Muted (push-to-mute) Deafened (by self) Deafened (by admin) User has a new comment set (click to show) User has a comment set, which you've already seen. (click to show) Ignoring Text Messages This shows the flags the channel has, if any: Channel has a new comment set (click to show) Channel has a comment set, which you've already seen. (click to show) Channel will be hidden when filtering is enabled Name Flags Are you sure you want to drag this user? Are you sure you want to drag this channel? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. VersionCheck Upgrade Mumble A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? Failed to launch snapshot installer. Corrupt download of new version detected. Automatically removed. Downloading new snapshot from %1 to %2 Failed to write new version to disk. Failed to write new version to disc. Mumble failed to retrieve version information from the central server. ViewCert Certificate Chain Details Certificate chain Certificate details Common Name Organization Subunit Country Locality State Valid from: %1 Valid to: %1 Serial: %1 Public Key: %1 bits %2 RSA DSA Digest (SHA-1): %1 Digest (SHA-256): %1 Email: %1 DNS: %1 Issued by: Unit Name VoiceRecorder Recorder failed to create directory '%1' Recorder failed to open file '%1' .wav - Uncompressed .ogg (Vorbis) - Compressed .au - Uncompressed .flac - Lossless compressed VoiceRecorderDialog Recorder Control 00:00:00 &Start S&top Mode Multichannel Output Output format Target directory Filename &Browse... Valid variables are: Inserts the user's name Inserts the current date Inserts the current time Inserts the hostname Recorder still running Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? Unable to start recording. Not connected to a server. The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. There is already a recorder active for this server. Please select a recording format. Stopping Select target directory Downmix WASAPIInput Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone. WASAPISystem Default Device qwPTTButtonWidget Mumble PTT Push to talk mumble-1.3.4/src/mumble/TextMessage.h0000664000175000017500000000137114010707273017315 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_TEXTMESSAGE_H_ #define MUMBLE_MUMBLE_TEXTMESSAGE_H_ #include "ui_TextMessage.h" class TextMessage : public QDialog, public Ui::TextMessage { private: Q_OBJECT Q_DISABLE_COPY(TextMessage) protected: QString qsRep; public slots: void on_qcbTreeMessage_stateChanged(int); public: TextMessage(QWidget *parent = NULL, QString title = tr("Enter text"), bool bChannel = false); QString message(); static QString autoFormat(QString qsPlain); bool bTreeMessage; }; #endif mumble-1.3.4/src/mumble/BanEditor.cpp0000664000175000017500000001354714010707273017276 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "BanEditor.h" #include "Channel.h" #include "Ban.h" #include "ServerHandler.h" // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" BanEditor::BanEditor(const MumbleProto::BanList &msg, QWidget *p) : QDialog(p) , maskDefaultValue(32) { setupUi(this); qlwBans->setFocus(); qlBans.clear(); for (int i=0;i < msg.bans_size(); ++i) { const MumbleProto::BanList_BanEntry &be = msg.bans(i); Ban b; b.haAddress = be.address(); b.iMask = be.mask(); b.qsUsername = u8(be.name()); b.qsHash = u8(be.hash()); b.qsReason = u8(be.reason()); b.qdtStart = QDateTime::fromString(u8(be.start()), Qt::ISODate); b.qdtStart.setTimeSpec(Qt::UTC); if (! b.qdtStart.isValid()) b.qdtStart = QDateTime::currentDateTime(); b.iDuration = be.duration(); if (b.isValid()) qlBans << b; } refreshBanList(); } void BanEditor::accept() { MumbleProto::BanList msg; foreach(const Ban &b, qlBans) { MumbleProto::BanList_BanEntry *be = msg.add_bans(); be->set_address(b.haAddress.toStdString()); be->set_mask(b.iMask); be->set_name(u8(b.qsUsername)); be->set_hash(u8(b.qsHash)); be->set_reason(u8(b.qsReason)); be->set_start(u8(b.qdtStart.toString(Qt::ISODate))); be->set_duration(b.iDuration); } g.sh->sendMessage(msg); QDialog::accept(); } void BanEditor::on_qlwBans_currentRowChanged() { int idx = qlwBans->currentRow(); if (idx < 0) return; qpbAdd->setDisabled(true); qpbUpdate->setEnabled(false); qpbRemove->setEnabled(true); const Ban &ban = qlBans.at(idx); int maskbits = ban.iMask; const QHostAddress &addr = ban.haAddress.toAddress(); qleIP->setText(addr.toString()); if (! ban.haAddress.isV6()) maskbits -= 96; qsbMask->setValue(maskbits); qleUser->setText(ban.qsUsername); qleHash->setText(ban.qsHash); qleReason->setText(ban.qsReason); qdteStart->setDateTime(ban.qdtStart.toLocalTime()); qdteEnd->setDateTime(ban.qdtStart.toLocalTime().addSecs(ban.iDuration)); } Ban BanEditor::toBan(bool &ok) { Ban b; QHostAddress addr; ok = addr.setAddress(qleIP->text()); if (ok) { b.haAddress = addr; b.iMask = qsbMask->value(); if (! b.haAddress.isV6()) b.iMask += 96; b.qsUsername = qleUser->text(); b.qsHash = qleHash->text(); b.qsReason = qleReason->text(); b.qdtStart = qdteStart->dateTime().toUTC(); const QDateTime &qdte = qdteEnd->dateTime(); if (qdte <= b.qdtStart) b.iDuration = 0; else b.iDuration = static_cast(b.qdtStart.secsTo(qdte)); ok = b.isValid(); } return b; } void BanEditor::on_qpbAdd_clicked() { bool ok; qdteStart->setDateTime(QDateTime::currentDateTime()); Ban b = toBan(ok); if (ok) { qlBans << b; refreshBanList(); qlwBans->setCurrentRow(qlBans.indexOf(b)); } qlwBans->setCurrentRow(-1); qleSearch->clear(); } void BanEditor::on_qpbUpdate_clicked() { int idx = qlwBans->currentRow(); if (idx >= 0) { bool ok; Ban b = toBan(ok); if (ok) { qlBans.replace(idx, b); refreshBanList(); qlwBans->setCurrentRow(qlBans.indexOf(b)); } } } void BanEditor::on_qpbRemove_clicked() { int idx = qlwBans->currentRow(); if (idx >= 0) qlBans.removeAt(idx); refreshBanList(); qlwBans->setCurrentRow(-1); qleUser->clear(); qleIP->clear(); qleReason->clear(); qsbMask->setValue(maskDefaultValue); qleHash->clear(); qdteStart->setDateTime(QDateTime::currentDateTime()); qdteEnd->setDateTime(QDateTime::currentDateTime()); qpbRemove->setDisabled(true); qpbAdd->setDisabled(true); } void BanEditor::refreshBanList() { qlwBans->clear(); qSort(qlBans); foreach(const Ban &ban, qlBans) { const QHostAddress &addr=ban.haAddress.toAddress(); if (ban.qsUsername.isEmpty()) qlwBans->addItem(addr.toString()); else qlwBans->addItem(ban.qsUsername); } int n = qlBans.count(); setWindowTitle(tr("Ban List - %n Ban(s)", "", n)); } void BanEditor::on_qleSearch_textChanged(const QString & match) { qlwBans->clearSelection(); qpbAdd->setDisabled(true); qpbUpdate->setDisabled(true); qpbRemove->setDisabled(true); qleUser->clear(); qleIP->clear(); qleReason->clear(); qsbMask->setValue(maskDefaultValue); qleHash->clear(); qdteStart->setDateTime(QDateTime::currentDateTime()); qdteEnd->setDateTime(QDateTime::currentDateTime()); foreach(QListWidgetItem *item, qlwBans->findItems(QString(), Qt::MatchContains)) { if (!item->text().contains(match, Qt::CaseInsensitive)) item->setHidden(true); else item->setHidden(false); } } void BanEditor::on_qleIP_textChanged(QString ) { qpbAdd->setEnabled(qleIP->isModified()); if (qlwBans->currentRow() >= 0) qpbUpdate->setEnabled(qleIP->isModified()); } void BanEditor::on_qleReason_textChanged(QString ) { if (qlwBans->currentRow() >= 0) qpbUpdate->setEnabled(qleReason->isModified()); } void BanEditor::on_qdteEnd_editingFinished() { qpbUpdate->setEnabled(!qleIP->text().isEmpty()); qpbRemove->setDisabled(true); } void BanEditor::on_qleUser_textChanged(QString ) { if (qlwBans->currentRow() >= 0) qpbUpdate->setEnabled(qleUser->isModified()); } void BanEditor::on_qleHash_textChanged(QString ) { if (qlwBans->currentRow() >= 0) qpbUpdate->setEnabled(qleHash->isModified()); } void BanEditor::on_qpbClear_clicked() { qlwBans->setCurrentRow(-1); qleUser->clear(); qleIP->clear(); qleReason->clear(); qsbMask->setValue(maskDefaultValue); qleHash->clear(); qdteStart->setDateTime(QDateTime::currentDateTime()); qdteEnd->setDateTime(QDateTime::currentDateTime()); qpbAdd->setDisabled(true); qpbUpdate->setDisabled(true); qpbRemove->setDisabled(true); } mumble-1.3.4/src/mumble/MainWindow.ui0000664000175000017500000007161214010707273017333 0ustar builderbuilder MainWindow 0 0 671 435 Mumble QMainWindow::AllowNestedDocks|QMainWindow::AnimatedDocks true Qt::CustomContextMenu true true false true true false 0 0 671 22 C&onfigure &Help S&erver &Self 250 93 QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetMovable Log 1 Qt::CustomContextMenu This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. false 0 0 This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetMovable Chatbar 1 0 0 16777215 16777215 false Icon Toolbar TopToolBarArea false &Quit Mumble Closes the program Exits the application. Ctrl+Q &Hide Mumble Hides the main Mumble window. Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. skin:categories/applications-internet.svgskin:categories/applications-internet.svg &Connect... Open the server connection dialog Shows a dialog of registered servers, and also allows quick-connect. false false &Disconnect Disconnect from server Disconnects you from the server. false &Ban list... Edit ban list on server This lets you edit the server-side IP ban list. false skin:Information_icon.svgskin:Information_icon.svg &Information... Show information about the server connection This will show extended information about the connection to the server. false &Kick... Kick user (with reason) Kick selected user off server. You'll be asked to specify a reason. true &Mute Mute user Mute or unmute user on server. Unmuting a deafened user will also undeafen them. &Ban... Kick and ban user (with reason) Kick and ban selected user from server. You'll be asked to specify a reason. true &Deafen Deafen user Deafen or undeafen user on server. Deafening a user will also mute them. true Ignore Messages Locally ignore user's text chat messages. Silently drops all text messages from the user. Local Volume Adjustment... Locally adjust the user's speech volume. Opens a dialog with a volume slider. Use this on other users in the same room. true &Local Mute Mute user locally Mute or unmute user locally. Use this on other users in the same room. Send &Message... Send a Text Message Sends a text message to another user. &Add... Add new channel This adds a new sub-channel to the currently selected channel. &Remove... Remove channel This removes a channel and all sub-channels. &Edit... Edit Groups and ACL for channel This opens the Group and ACL dialog for the channel, to control permissions. &Link Link your channel to another channel This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. &Unlink Unlink your channel from another channel This unlinks your current channel from the selected channel. &Unlink All Unlinks your channel from all linked channels. This unlinks your current channel (not the selected one) from all linked channels. &Reset Reset audio preprocessor This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. true skin:actions/audio-input-microphone.svg skin:actions/audio-input-microphone-muted.svg skin:actions/audio-input-microphone-muted.svgskin:actions/audio-input-microphone.svg &Mute Self Mute yourself Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. false true skin:self_undeafened.svg skin:deafened_self.svg skin:deafened_self.svgskin:self_undeafened.svg &Deafen Self Deafen yourself Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. false true &Text-To-Speech Toggle Text-To-Speech Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. Audio S&tatistics... Display audio statistics Pops up a small dialog with information about your current audio input. &Unlink Plugins Forcibly unlink plugin This forces the current plugin to unlink, which is handy if it is reading completely wrong data. skin:config_basic.pngskin:config_basic.png &Settings... Configure Mumble Allows you to change most settings for Mumble. QAction::PreferencesRole false true skin:filter_off.svg skin:filter_on.svg skin:filter_on.svgskin:filter_off.svg &Filter on/off Toggle the channel filter (Ctrl+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. Ctrl+F false &Audio Wizard... Start the audio configuration wizard This will guide you through the process of configuring your audio hardware. Developer &Console... Show the Developer Console Shows the Mumble Developer Console, where Mumble's log output can be inspected. &What's This? Enter What's This? mode Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. &About... Information about Mumble Shows a small dialog with information and license for Mumble. QAction::AboutRole About &Speex... Information about Speex Shows a small dialog with information about Speex. QAction::ApplicationSpecificRole About &Qt... Information about Qt Shows a small dialog with information about Qt. QAction::AboutQtRole Check for &Updates Check for new version of Mumble Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. Send &Message... Send a Text Message Sends a text message to all users in a channel. &Copy URL Copies a link to this channel to the clipboard. Copies a link to this channel to the clipboard. true &Minimal View Toggle minimal window modes This will toggle minimal mode, where the log window and menu is hidden. true Hide Frame Toggle showing frame on minimal window This will toggle whether the minimal window should have a frame for moving and resizing. &Certificate Wizard... Configure certificates for strong authentication This starts the wizard for creating, importing and exporting certificates for authentication against servers. &Register... Register user on server This will permanently register the user on the server. Add &Friend Adds a user as your friend. This will add the user as a friend, so you can recognize him on this and other servers. &Remove Friend Removes a user from your friends. This will remove a user from your friends list. &Update Friend Update name of your friend. Your friend uses a different name than what is in your database. This will update the name. Registered &Users... Edit registered users list This opens the editor for registered users, which allow you to change their name or unregister them. Change &Avatar... Change your avatar image on this server &Access Tokens... Add or remove text-based access tokens &Remove Avatar Remove currently defined avatar image. Reset &Comment... Reset the comment of the selected user. Reset &Avatar... Reset the avatar of the selected user. &Join Channel true &Hide Channel when Filtering View Comment... View comment in editor &Information... Query server for connection information for user skin:self_comment.svgskin:self_comment.svg &Change Comment... Change your own comment false R&egister... Register yourself on the server true Priority Speaker true Priority Speaker skin:actions/media-record.svgskin:actions/media-record.svg Recording false Show Shows the main Mumble window. UserView QTreeView
    UserView.h
    ChatbarTextEdit QTextEdit
    CustomElements.h
    LogTextBrowser QTextBrowser
    CustomElements.h
    mumble-1.3.4/src/mumble/mumble_fi.ts0000664000175000017500000140423214010707274017227 0ustar builderbuilder ACLEditor Deny Kiellä %1 Allow Salli Allow %1 Salli %1 Deny %1 Kiellä %1 Mumble - Add channel Mumble - Lisää kanava Default server value Palvelimen oletusarvo Failed: Invalid channel Epäonnistui: Virheellinen kanava Mumble - Edit %1 Mumble - Muokkaa %1 ID: %1 ID: %1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Myöntää oikeuden toimintoon %1. Jos toiminto on yhtä aikaa sekä sallittu että kielletty, katsotaan se kiellettyksi.<br />%2 Channel must have a name Kanavalla tulee olla nimi This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Kumoaa oikeuden toimintoon %1. Jos toiminto on yhtä aikaa sekä sallittu että kielletty, katsotaan se kielletyksi.<br />%2 Dialog Ikkuna Name Nimi Enter the channel name here. Kirjoita kanavan nimi. Description Kuvaus Password Salasana Enter the channel password here. Kirjoita kanavan salasana. Check to create a temporary channel. Valitse luodaksesi tilapäisen kanavan. Temporary Tilapäinen <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Järjestysnumero</b><br/> Tämä numero määrittää kuinka Mumble järjestää kanavat puuhun. Suuremmalla <i>järjestysnumerolla</i> varustettu kanava sijoitetaan aina alemmaksi, kuin pienemmällä numerolla varustettu. Mikäli kahdella kanavalla on sama <i>järjestysnumero</i> järjestetään ne aakkosjärjestyksessä. Position Järjestys &Groups &Ryhmät Group Ryhmä List of groups Ryhmälistaus Remove selected group Poista valittu ryhmä Remove Poista Inherit group members from parent Sisällytä jäsenet yläkanavalta Inherit Sisällytä Make group inheritable to sub-channels Mahdollista ryhmän sisällytys alikanaville Inheritable Sisällytettävä Group was inherited from parent channel Ryhmä sisällytettiin yläkanavasta Inherited Sisällytetty Members Jäsenet Add Lisää Add member to group Lisää jäsen ryhmään Remove member from group Poista jäsen ryhmästä &ACL &ACL Active ACLs Aktiiviset ACL:t List of entries Listaus merkinnöistä Inherit ACL of parent? Sisällytä yläkanavan ACL? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. Tämä määrittää onko yläkanavaketjun ACL käytössä tässä objektissa. Ainoastaan lisäykset, jotka on merkattu yläkanavassa "Sisällytä alikanaviin" sisällytetään. Inherit ACLs Sisällytä ACL Move entry up Liikuta merkintää ylös This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. Tämä liikuttaa merkintää ylös listassa. Tämä voi vaikuttaa käyttäjien oikeuksiin, sillä merkinnät huomioidaan järjestyksessä. Et voi liikuttaa merkintää yli sisällytetyn merkinnän; jos sinun tarvitsee tehdä niin, tulee sinun kahdentaa sisällytetty merkintä. &Up &Ylös Move entry down Liikuta merkintää alas This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. Tämä liikuttaa merkintää alas listassa. Tämä voi vaikuttaa käyttäjien oikeuksiin, sillä merkinnät huomioidaan järjestyksessä. &Down &Alas Add new entry Lisää uusi merkintä This adds a new entry, initially set with no permissions and applying to all. Tämä lisää uuden merkinnän, jolla ei ole aluksi mitään oikeuksia ja joka koskee kaikkia. &Add &Lisää Remove entry Poista merkintä This removes the currently selected entry. Tämä poistaa valitun merkinnän. &Remove &Poista Context Konteksti Entry should apply to this channel. Entry should apply to this channel Merkintä koskee tätä kanavaa. This makes the entry apply to this channel. Asettaa merkinnän koskemaan tätä kanavaa. Applies to this channel Koskee tätä kanavaa Entry should apply to sub-channels. Merkintä koskee alikanavia. Add new group Lisää uusi ryhmä <b>Add</b><br/> Add a new group. <b>Lisää</b><br/> Lisää uusi ryhmä. Inherited members Sisällytetyt jäsenet Contains the list of members added to the group by this channel. Sisältää listan jäsenistä, jotka kanava on lisännyt tähän ryhmään. Contains a list of members whose group membership will not be inherited from the parent channel. Sisältää listan jäsenistä, joiden jäsenyyttä ei sisällytetä yläkanavalta. Contains the list of members inherited by other channels. Sisältää listan jäsenistä, jotka on sisällytetty muilta kanavilta. Type in the name of a user you wish to add to the group and click Add. Kirjoita käyttäjän nimi, jonka haluat lisätä ryhmään, ja klikkaa Lisää. Type in the name of a user you wish to remove from the group and click Add. Kirjoita käyttäjän nimi, jonka haluat poistaa ryhmästä. Exclude Poissulje Excluded members Poissuljetut jäsenet This makes the entry apply to sub-channels of this channel. Tämä laittaa merkinnän koskemaan kaikkia kanavan alikanavia. Applies to sub-channels Koskee alikanavia Permissions Oikeudet User/Group Käyttäjä/Ryhmä Group this entry applies to Ryhmä, jota tämä merkintä koskee User ID Käyttäjä ID User this entry applies to Käyttäjä, ketä tämä merkintä koskee This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. Valitsee ketä tämä merkintä koskee. Syötä käyttäjänimi ja paina enter-näppäintä, hakeaksesi sitä palvelimelta. &Properties &Ominaisuudet <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>Nimi</b><br />Syötä kanavan nimi tähän kenttään. Nimen täytyy sopia yhdistämäsi palvelimen ohjeisiin. <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>Tilapäinen</b><br /> Valittuna luotu kanava määritetään tilapäiseksi. Kun viimeinen käyttäjä poistuu tilapäiseltä kanavalta, palvelin poistaa kanavan automaattisesti. <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>Ryhmä</b><br /> Kanavalle määritetyt ryhmät. Luodaksesi uuden ryhmän kirjoita sen nimi ja paina Enter-näppäintä. <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>Poista</b><br />Poistaa valitun ryhmän. Jos ryhmä oli sisällytetty, sitä ei poisteta listalta, mutta kaikki paikallinen tieto pyyhitään pois. <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>Sisällytä</b><br />Tämä sisällyttää kaikki yläkanavan jäsenet, jos ryhmä on merkitty <i>Sisällytettävä</i> yläkanavalla. <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>Sisällytettävä</b><br />Tämä tekee tästä ryhmästä sisällytettävän alikanaville. Jos kanavaa ei sisällytetä, alikanavat voivat silti luoda uuden ryhmän samalla nimellä. <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>Sisällytetty</b><br />Näyttää, että ryhmä on sisällytetty yläkanavalta. Merkintä toimii vain tietona eikä sitä voi muokata. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>Jäsenet</b><br /> Tämä sisältää listan jäsenistä jotka ovat lisätty nykyiseen kanavaan. Ota huomioon, että tämä ei sisällä jäseniä jotka on sisällytetty kanavapuun ylemmiltä tasoilta. Nämä löytyvät <i>Sisällytetyt jäsenet</i> listalta. Estääksesi sisällytyksen alemmilta tasoilta jätä valitsematta <i>Sisällytettävä</i> tai lisää manuaalisesti <i>Poissuljetut jäsenet</i> listalle. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>Poissuljetut jäsenet</b><br /> Sisältää listan jäsenistä joiden jäsenyys ei periydy yläkanavilta. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. <b>Sisällytetyt jäsenet</b><br /> Sisältää listan jäsenistä jotka on sisällytetty nykyiselle kanavalle. Poista valinta <i>Sisällytä</i> estääksesi sisällytys ylemmiltä kanavilta. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. Määrittää mitä käyttäjäryhmää tämä merkintä koskee.<br/>Huomioi, että valittua ryhmää käytetään merkinnän kohteena. Esimerkiksi ACL:n oletus-juurikanavalla antaa <i>kirjoitusoikeiden</i> <i>ylläpitoryhmään</i> kuuluville käyttäjille. Jos merkintä peritään kanavalta, antaa se <i>ylläpitoryhmän</i> kirjoitusoikeidet uuden kanavan ylläpitöryhmän käyttäjille, vaikka he eivät kuuluisikaan alkuperäisen ACL kanavan <i>ylläpitoryhmään</i>.<br/>Jos ryhmän nimi alkaa '!'-merkillä, sen jäsenyys on kielletty, ja jos ryhmän nimi alkaa '~'-merkillä, se käyttää ACL-määrityksiä alkuperäisellä kanavalta, eikä aktiivisella kanavalta.<br/>Jos ryhmän nimi alkaa '#'-merkillä, tulkitaan se pääsyavaimena. Käyttäjien on täytynyt syöttää pääsyavainlistaansa '#'-merkin jälkeiset merkit. Tätä voidaan käyttää yksinkertaisina salasanoina kanaville.<br/>Jos ryhmän nimi alkaa '$'-merkillä, huomioidaan vain käyttäjät, joilla on vastaavat merkit hash-tunnuksessa.<br/>Muutamat erityiset esiasetetut ryhmät ovat:<br/><b>all</b> - Kaikki vastaavat.<br/><b>auth</b>Kaikki autentikoidut käyttäjät täsmäävät.<br /><b>sub,a,b,c</b> - Nykyinen käyttäjä alikanava minimi <i>a</i> yhteisillä vanhemmilla, ja <i>b</i>:n ja <i>c</i>:n välisillä kanavilla. Katso websivulta tarkempaa tietoa.<br /><b>in</b> Käyttäjät kanavan sisällä täsmäävät (soveltuvuus '<i>sub,0,0,0</i>').<br /><b>out</b> - Kanavan ulkopuoliset käyttäjät täsmäävät(soveltuvuus'<i>!sub,0,0,0</i>').<br />Huomioi, että toiminto koskee vain joko käyttäjää tai ryhmää. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. <b>Salasana</b><br />Voit asettaa ja vaihtaa kanavan salasanan tässä. Se käyttää Mumblen pääsyavainta taustalla. Käytä ACL:ää ja ryhmiä, jos tarvitset parempaa hallintaa. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. Näyttää aktiiviset merkinnät kanavalla. Toisilta kanavilta perityt merkinnät näkyvät kursivoituina.<br />ACL:t priorisoidaam ylhäältä alas, jolloin prioriteetti kasvaa siirtyessä alaspäin listassa. ID of the channel. Kanavan ID. Maximum Users Maksimi käyttäjämäärä Maximum number of users allowed in the channel Maksimi käyttäjämäärä kanavalla <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. <b>Maksimi käyttäjämäärä</b><br /> Tämän numeron ollessa suurempi kuin nolla kanava sallii maksimissaan numeron suuruisen määrän käyttäjiä yhtäaikaisesti. Numeron ollessa nolla käytetään palvelimen oletusarvoa. This is the sort order for the channel. ALSAAudioInput Default ALSA Card Oletus ALSA kortti Opening chosen ALSA Input failed: %1 Valitun ALSA sisääntulon avaaminen epäonnistui: %1 ALSAAudioOutput Default ALSA Card Oletus ALSA kortti Opening chosen ALSA Output failed: %1 Valitun ALSA ulostulon avaaminen epäonnistui: %1 ASIOConfig %1 (version %2) %1 (versio %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz %1 -> %2 näytepuskuri, näyteresoluutiolla %3 (4% suositeltu) 5% hZ ASIO Initialization failed: %1 ASIO käyttöönotto epäonnistui: %1 Failed to instantiate ASIO driver ASIO ajurin ilmentäminen epäonnistui ASIO ASIO Device selection Laitteen valinta Device Laite Device to use for microphone Laite jota käytetään mikrofonina This chooses what device to query. You still need to actually query the device and select which channels to use. Tämä valitsee laitteen jota tiedustellaan. Sinun pitää silti erikseen itse tiedustella laite ja valita mitä kanavia käytetään. Query selected device Tiedustele valittu laite This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. Tämä tiedustelee valitun laitteen kanavia. Monet ASIO-ajurit ovat kuitenkin todella bugisia ja niiden tiedustelu voi aiheuttaa sovelluksen tai järjestelmän kaatumisen. &Query &Tiedustelu Configure selected device Konfiguroi valittu laite This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. Tämä konfiguroi valitun laitteen. Ota huomioon, että useat ASIO-ajurit ovat todella bugisia, ja niiden konfiguroiminen saattaa kaataa joko ohjelman tai koko järjestelmän. &Configure &Konfiguroi Capabilities Ominaisuudet Driver name Ajurin nimi Buffer size Puskurin koko This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. Tämä määrittää sisääntulokanavan ASIO:lle. Valitse ainakin yksi kanava mikrofoniksi ja kaiuttimeksi. <i>Mikrofoni</i> tulisi olla siellä minne mikrofonisi on kytketty, ja <i>Kaiutin</i> tulisi olla kanava joka samplaa '<i>Mitä kuulet</i>'.<br />Esimerkiksi Audigy 2 ZS:ssa, hyvä asetus Mikrofonille olisi '<i>Mic L</i>' kun taas kaiuttimen tulisi olla '<i>Mix L</i>' and '<i>Mix R</i>'. Configure input channels Määritä sisääntulon kanavat Channels Kanavat Microphone Mikrofoni <- <- -> -> Unused Käyttämätön Speakers Kaiuttimet ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. Sinun tulee valita vähintään yksi mikrofoni- ja kaiutinlähde käyttääksesi ASIO:ta. Jos tarvitset vain mikrofonin sämpläystä, käytä DirectSoundia. Opening selected ASIO device failed. No input will be done. Valitun ASIO-laitteen avaus epäonnistui. Mitään syöttölaitetta ei oteta käyttöön. AboutDialog About Mumble Tietoa Mumblesta <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> <h3>Mumble (%1)</h3><p>%3</p><p><b>Puheohjelma pelaajille</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble &Tietoja Mumblesta &License &Lisenssi A&uthors &Tekijät &Third-Party Licenses OK OK AudioInput Interface Rajapinta System Järjestelmä Input method for audio Äänen sisääntulotapa <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Tätä tapaa käytetään audion sisääntuloon.</b><br />Luultavasti haluat käyttää DirectSoundia. Device Laite Input device for audio Audion sisääntulolaite <b>This is the input device to use for audio.</b> <b>Tätä laitetta käytetään audion sisääntuloon.</b> Transmission Lähetys &Transmit &Lähetä When to transmit your speech Milloin lähettää puhettasi <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. <b>Tämä määrittää milloin puhetta lähetetään.</b><br /><i>Jatkuva</i> - Lähetys pidetään auki kokoajan.<br /><i>Puheaktivointi</i> - Puhettasi lähetetään, kun se havaitaan selkeäksi.<br /><i>Puhepikanäppäin</i> - Puhettasi lähetetään, kun painat pikanäppäintä joka on määritetty <i>Pikanäppäinten</i> asetuksissa. DoublePush Time Tuplapainalluksen Aika If you press the PTT key twice in this time it will get locked. Jos painat puhepikanäppäintä kahdesti tässä ajassa se lukitaan päälle. <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. <b>Tuplapainalluksen Aika</b><br />Jos painat Puhepikanäppäintä kahdesti tässä määritellyssä ajassa, lukitaan se päälle. Mumble jatkaa puheen lähettämistä kunnes painat puhepikanäppäintä uudelleen. Reset audio cue to default Palauta oletusäänimerkit <b>Reset</b><br/>Reset the paths for the files to their default. <b>Palauta</b><br/>Palauttaa oletustiedostopolut. Browse for on audio file Hae lähetyksen aloittamisen äänitiedosto Browse for off audio file Hae lähetyksen lopettamisen äänitiedosto Off Lopetus On Aloitus Preview the audio cues Testaa äänimerkit Use SNR based speech detection Käytä SNR-pohjaista puheentunnistusta Signal to Noise Signal-to-Noise -suhde <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. <b>Tämä asettaa puheentunnistuksen käyttämään voimakuutta.</b><br />Tässä muodossa alkuperäisen sisääntulon signaalia käytetään puheen määrittämiseen. Amplitude Voimakkuus Voice &Hold Lähetyksen &Jatko How long to keep transmitting after silence Kuinka kauan lähettämistä jatketaan, kun ääni on siirtynyt hiljaiselle alueelle. Silence Below Hiljaisuuden raja-arvo <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. <b>Tämä määrittää arvot äänen lähetyksen.</b><br />Käytä tätä Äänistatistiikka-ikkunan kanssa säätääksesi manuaalisesti äänentunnistuksen kynnysarvot. "Hiljaisuuden raja-arvo" merkin alla oleva signaali tulkitaan hiljaisuudeksi. "Puheen raja-arvo" merkin yläpuolella oleva signaali tulkitaan puheeksi. Merkkien välillä oleva signaali lasketaan puheeksi, mutta se ei aloita uutta lähetystä. Speech Above Puheen raja-arvo Signal values above this count as voice Rajan ylittävät arvot tulkitaan puheeksi Compression Pakkaus &Quality &Laatu Quality of compression (peak bandwidth) Pakkauksen laatu (kaistan huippu) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. <b>Määrittää pakkauksen laadun.</b><br />Tämä määrittää kuinka paljon Mumble voi käyttää yhteyskaistaasi ulosmenevään audioon. Audio per packet Audiota per paketti How many audio frames to send per packet Yhden paketin sisältämän äänen osuus <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>Määrittää kuinka paljon ääntä sisällytetään yhteen pakettiin.</b><br />Kasvattamalla äänen määrää lisäät puheesi viivettä, mutta vähennät yhteytesi kaistankäyttöä. <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). <b>Näyttää uloslähtevän kaistanleveyden huipun.</b><br />Näyttää uloslähtevän kaistanleveyden maksimiarvon, joka lähetetään tietokoneestasi. Äänen bittivirta on maksimi bittivirta (käytämme VBR) vain äänitiedoille yksinään. Sijanti on bittivirta jota käytetään sijaintitiedoille. Pakettitiedot ovat paketin kehykselle ja IP-osoitetiedoille tarvittava bittivirta (IP ja UDP ovat 75% tästä lukuarvosta). Audio Processing Audion käsittely Noise Suppression Melun Vaimennus Noise suppression Melun vaimennus <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. <b>Tämä määrittää melunvaimennuksen määrän.</b><br />Mitä korkeampi arvo, sitä enemmän taustamelua vaimennetaan. Maximum amplification of input sound Sisääntulevan äänen maksimivahvistus <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. <b>Sisääntulon maksimivahvistus.</b><br />Mumble normalisoi sisääntulon voimakkuuden ennen pakkausta, ja tämä asettaa kuinka paljon vahvistusta voidaan käyttää.<br />Äänentasoa päivitetään jatkuvasti puhuessasi, mutta taso ei koskaan mene tämän määritellyn tason yli.<br />Jos <i>Mikrofonin voimakkuuden</i> äänentaso on 100% alueella, haluat luultavasti säätää tämän 2.0. Jos äänentasosi ei yllä 100%, aseta tämä korkeammalle kuin 2.0. <br />Mahdollistaaksesi parhaan tilanteen <i>Mikrofonin voimakkuus * Vahvistus >= 100</i>, jopa silloin kun puhut todella hiljaa.<br /><br />Huomioi ettei ole haitallista säätää arvoa maksimiin, mutta Mumble alkaa kaappaamaan muita keskusteluja, jos jätät auto-tunen tälle tasolle. Current speech detection chance Nykyisen äänentunnistuksen todennäköisyys Cancel echo from speakers Estä kaiuttimien kaiku Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. Valitsemalla tämän estät kaiuttimistasi tulevan kaiun. Alasmiksattu ei juuri vaikuta prosessoritehoon, mutta toimii hyvin vain jos kaiuttimesi ovat samalla äänenvoimakkuudella ja yhtä kaukana mikrofonistasi. Monikanavainen kaiunesto tarjoaa paremman kaiuneston, mutta vie enemmän prosessoritehoa. Disabled Ei käytössä <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>Tämä asettaa puheentunnistuksen käyttämään Signal-To-Noise -suhdetta.</b><br />Tässä tilassa sisääntulosta analysoidaan puhdas äänisignaali, ja tätä signaalia käytetään puheentunnistuksen aktivoimiseen. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>Näyttää nykyisen äänentunnistuksen asetukset.</b><br />Voit vaihtaa asetuksia ohjelman asetuksissa tai Audioapurissa. Signal values below this count as silence Rajan alittavat arvot tulkitaan hiljaisuudeksi Maximum bandwidth used for sending audio Maksimi kaistanleveys äänen lähettämiseen Use Amplitude based speech detection Käytä voimakkuuteen perustuvaa äänentunnistusta <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). <b>Asettaa kuinka kauan äänen lähetystä jatketaan puheen katkon jälkeen.</b><br />Aseta tämä korkeammalle jos äänesi rikkoutuu puhuessasi (ääni-ikoni vilkkuu nimesi vieressä). Exclusive mode Rajoitettu tila <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>Avaa laitteen rajoitettuun tilaan. </b><br />Muut sovellukset eivät voi käyttää laitetta. Exclusive Rajoitettu R&eset N&ollaus &Browse... &Selaa... B&rowse... S&elaa... &Preview &Testaa <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. <b>Testaa</b><br/>Toistaa nykyisen <i>aloitus</i>äänen sekä <i>lopetus</i>äänen. Displays an always on top window with a push to talk button in it Näyttää aina päällimmäisenä olevan ikkunan, jossa on puhepikanäppäin nappi. Display push to talk window Näytä Puhepikanäppäimen ikkuna Misc Muut Audible audio cue when starting or stopping to transmit Kuultavissa oleva äänimerkki aloitettaessa tai lopetettaessa lähetystä <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. <b>Ottaa käyttöön lähetyksen äänimerkit.</b><br />Valitsemalla tämän kuulet lyhyen piippauksen kun aloitat ja lopetat lähetyksen. Audio cue Äänimerkki Gets played when starting to transmit Soitetaan kun lähettäminen alkaa Gets played when stopping to transmit Soitetaan kun lähettäminen loppuu Hold Time Lähetyksen Jatko Time the microphone stays open after the PTT key is released Aika jonka mikrofoni pysyy auki kun puhepikanäppäin on vapautettu Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) Palvelimen verkon kaistanleveyden maksimi on vain %1 kbit/s. Äänenlaatu on automaattisesti säädetty %2 kbit/s (%3 ms) Max. Amplification Maksimivahvistus Idle action Toimettomana minutes do minuutin jälkeen nothing ei mitään deafen hiljennä mute mykistä after Echo Cancellation Kaiunpoisto Mixed echo cancellation Sekoitettu Kaiunpoisto Multichannel echo cancellation Monikanavainen kaiunpoisto The idle action will be reversed upon any key or mouse button input Undo Idle action upon activity Apply RNNoise's noise suppression filter. <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. RNNoise Audio input AudioInputDialog Continuous Jatkuva Voice Activity Puheaktivointi Push To Talk Puhepikanäppäin Audio Input Äänen sisääntulo %1 ms %1 ms Off Pois päältä %1 s %1 s %1 kb/s %1 kb/s -%1 dB -%1 dB %1 kbit/s (Audio %2, Position %4, Overhead %3) %1 kbit/s (Ääni %2, Sijainti %4, Pakettitiedot %3) AudioOutput Interface Käyttöliittymä System Järjestelmä Output method for audio Audion ulostulotapa <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Tätä tapaa käytetään audion ulostuloon.</b><br /> Luultavasti haluat käyttää DirectSoundia. Device Laite Output device for audio Audion ulostulolaite <b>This is the output device to use for audio.</b> <b>Tätä laitetta käytetään audion ulostuloon.</b> Positional Audio Sijainninmukainen audio Audio Output Audion ulostulo Default &Jitter Buffer Oletus &huojuntapuskuri Safety margin for jitter buffer Turvaraja huojuntapuskurille <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. <b>Asettaa minimiturvarajan huojuntapuskurille.</b><br />Viiveen vähentämiseksi huojuntapuskuri pyrkii säätämään puskettavan audion pienimpään kokoon, jonka verkkosi pystyy käsittelemään. Asetus säätää puskurin käytön minimikoon. Jos puheesi alkuosa huojuu, kasvata arvoa. Minimum distance to user before sound volume decreases Minimietäisyys käyttäjään ennen kuin äänenvoimakkuus laskee This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. Asettaa minimietäisyyden äänen laskennalle. Muiden käyttäjien puheen äänenvoimakkuus ei vähene ennen kuin he ovat vähintään tämän etäisyyden päässä sinusta. This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. Asettaa maksimietäisyyden äänen laskennalle. Muiden käyttäjien puheen äänenvoimakkuus ei vähene enempää, kun olet tämän etäisyyden päässä heistä. <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. <b>Sallii yhden takaisinkierrätyksen testaustiloista.</b><br /><i>Ei mikään</i> -Takaisinkierrätys ei käytössä <br /><i>Paikallinen</i> - Emuloi paikallinen palvelin.<br /><i>Palvelin</i> - Pyydä palvelimelta takaisinkierrätystä.<br />Huomioi, että takaisinkierrätystilassa muut käyttäjät eivät kuule sinua. Tätä asetusta ei tallenneta ohjelmasta poistuttaessa. Volume Äänenvoimakkuus Volume of incoming speech Tulevan puheen äänenvoimakkuus <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. <b>Määrittää sisääntulevan puheen voimakkuutta.</b><br />Huomio, että jos lisäät voimakkuutta yli 100%, ääni säröytyy. Output Delay Ulostulon viive Amount of data to buffer Puskuroitavan datan määrä The connected "speakers" are actually headphones The connected "speakers" are actually headphones. Yhdistetyt "kaiuttimet" ovat kuulokkeet Factor for sound volume decrease Prosentti jolla ääntä vähennetään Bloom Korostus Factor for sound volume increase Prosentti jolla ääntä lisätään How much should sound volume increase for sources that are really close? Kuinka paljon äänenvoimakkuutta lisätään äänenlähteille jotka ovat todella lähellä? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. Valinta määrittää että käytät kuulokkeita kaiuttimien sijaan. Valinta on tärkeä sijainninmukaiselle audiolle sillä kaiuttimet ovat yleensä edessäsi, kun taas kuulokkeet ovat suoraan sivuillasi. This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Asettaa datamäärän ulostulopuskurin esipuskurille. Kokeile eri arvoja ja aseta alhaisin, mikä ei aiheuta äänessä nopeaa huojuntaa. Headphones Kuulokkeet Minimum Distance Minimimatka Maximum Distance Maksimimatka Maximum distance, beyond which speech volume won't decrease Maksimietäisyys, jonka jälkeen äänenvoimakkuus ei enää laske. Minimum Volume Minimiäänenvoimakkuus What should the volume be at the maximum distance? Kuinka paljon äänenvoimakkuuden pitäisi olla maksimietäisyydellä? Loopback Test Takaisinkierrätyksen testaus Delay Variance Viiveen vaihtelu Variance in packet latency Pakettien vasteajan vaihtelu <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>Asettaa pakettivasteajan vaihtelun takaisinkierrätyksen testaukselle.</b><br />Useimmissa äänipoluissa on jonkun verran vaihtelevaa vasteaikaa. Asetus mahdollistaa vaihteluvälin asettamisen takaisinkierrätystilan testaukselle. Esimerkiksi, jos asetat 15ms, emuloidaan verkko jolla on 20-35ms tai 80-95ms vasteaika. Useimmilla kotimaisilla yhteyksillä vaihtelu on noin 5ms. Packet Loss Pakettihävikki Packet loss for loopback mode Takaisinkierrätystilan pakettihävikki <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% <b>Asettaa pakettihävikin takaisinkierrätystilalle.</b><br />Määrittää kuinka paljon hävikkiä tapahtuu. Jollei uloslähtevä kaistanleveytesi ole huipussa, tai yhteydessäsi häiriötä, hävikki on 0% &Loopback &Takaisinkierrätys Desired loopback mode Haluttu takaisinkierrätystila Attenuate applications by... Vaimenna sovelluksia... Attenuation of other applications during speech Muiden sovellusten vaimentaminen puheen aikana <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. <b>Äänenvoimakkuuden vaimennus muissa ohjelmissa puheen aikana</b><br />Mumble tukee muiden ohjelmien äänenvoimakkuuden vähentämistä sisääntulevan ja/tai uloslähtevän puheen aikana. Asettaa muiden ohjelmien vaimennuksen, jos ominaisuus on sallittu. If checked Mumble lowers the volume of other applications while other users talk Mikäli valittu, Mumble hiljentää muiden sovellusten äänenvoimakkuutta, kun muut käyttäjät puhuvat <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. <b>Vaimentaa ohjelmat kun muut käyttäjät puhuvat</b><br />Mumble tukee muiden ohjelmien äänenvoimakkuuden vähentämistä sisääntulevan ja/tai uloslähtevän puheen aikana. Mumble aktivoi ominaisuuden kun muut käyttäjät puhuvat sinulle. while other users talk muiden käyttäjien puhuessa If checked Mumble lowers the volume of other applications while you talk Mikäli valittu, Mumble hiljentää muiden sovellusten äänenvoimakkuutta sinun puhuessasi <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. <b>Vaimentaa ohjelmat kun puhut</b><br />Mumble tukee muiden ohjelmien äänenvoimakkuuden vähentämistä sisääntulevan ja/tai uloslähtevän puheen aikana. Mumble aktivoi ominaisuuden kun puhut. while you talk sinun puhuessasi Exclusive mode, not recommended. Rajoitettu tila, ei suositeltu. <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>Avaa laitteen rajoitettuun tilaan. </b><br />Muut ohjelmat eivät voi käyttää laitetta. Exclusive Rajoitettu Priority Speaker Etuoikeutettu puhuja If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. Mikäli valittu, Mumble alentaa muiden käyttäjien äänenvoimakkuutta puhuessasi, jos statuksesi on "etuoikeutettu puhuja". <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. <b>Vaimentaa muut käyttäjät puhuttaessa etuoikeutettuna puhujana.</b><br />Mumble tukee muiden käyttäjien äänenvoimakkuuden vaimentamista kun puhut <i>etuoikeutettuna puhujana</i> välttääksesi häiriöitä. Valitsemalla asetuksen otat toiminnon käyttöön. Attenuate other users while talking as Priority Speaker. Vaimentaa muut puhujat puhuttaessa etuoikeutettuna puhujana. Advanced Attenuation Options Vaimennusasetukset If checked, Mumble will only attenuate applications that are using the same output source as Mumble Jos valittuna, Mumble vaimentaa vain ne ohjelmat jotka käyttävät samaa ulostuloa kuin Mumble <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. <b>Vaimennus toimii vain Mumblen kanssa samalla ulostulolla toimivien ohjelmien kanssa</b><br />Jos valittuna, ohjelmat jotka käyttävät eri ulostuloa kuin Mumble jäävät vaimentamatta. Only attenuate applications using the same output device Vaimennetaan ohjelmat jotka käyttävät samaa laitetta ulostuloon If checked, PulseAudio loopback modules will be attenuated Jos valittu, PulseAudion loopback moduuli vaimennetaan <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. <b>Vaimenna PulseAudion loopback moduulit</b><br />Jos loopback moduulit ovat linkitettyinä Mumblen lähtevän äänen laitteeseen, ne vaimennettaan myös. Attenuate PulseAudio loopback modules Vaimenna PulseAudion loopback moduulit Audio output AudioOutputDialog None Ei mikään Local Paikallinen Server Palvelin Audio Output Audion ulostulo %1 ms %1 ms %1 % %1 % %1 m %1 m AudioOutputSample Choose sound file Valitse äänitiedosto Invalid sound file Virheellinen äänitiedosto The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. Tätä tiedostoa '%1' ei voida käyttää Mumblessa. Ole hyvä ja valitse tuetun formaatin ja enkoodauksen sisältävä tiedosto. AudioStats >1000 ms >1000ms >1000 ms Audio Statistics Äänistatistiikat Input Levels Sisääntulon Tasot Peak microphone level Mikrofonitason huippu Peak power in last frame Viimeisimmän paketin huipun voimakkuus This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. Näyttää viimeisimmän paketin (20ms) voimakkuuden huipun, ja on sama määrä mikä yleensä löytyy kohdasta "sisääntulon voimakkuus". Älä huomioi tätä, vaan katso <b>Mikrofonin voimakkuutta</b>, mikä on paljon vakaampi ja ei huomioi poikkeavia havaintoja. Peak speaker level Kaiutintason huippu This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. Näyttää kaiuttimien viimeisimmän paketin (20ms) voimakkuuspiikin. Jollet käytä monikanavaista näytteenottometodia (esim. ASIO) kaiutinkanavien konfiguraatiossa, tämä on 0. Jos arvo pysyy nollassa äänentoiston aikana ja käytät edellä mainuttua konfiguraatiota, asetuksesi eivät toimi. Peak clean level Puhtaantason huippu This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. Näyttää viimeisimmän paketin (20ms) voimakkiispiikin käsittelyiden jälkeen. Ideaalitilanteessa tämän pitäisi olla -96 dB ollessasi vaiti. Oikeasti äänistudiossa arvojen tulisi näkyä -60dB ja -20dB välillä. Puhuessasi tämän pitäisi nousta -5 ja -10 dB välille.<br />Mikäli käytät kaiunpoistoa ja arvo ylittää -15dB ollessasi vaiti, asetuksesti eivät toimi ja häiritset muita käyttäjiä kaiullasi. Signal Analysis Signaalianalyysi Microphone power Mikrofonin voimakkuus How close the current input level is to ideal Kuinka lähellä ideaalia nykyinen sisääntulon taso on. This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. Näyttää kuinka lähellä ideaalia nykyinen sisääntuleva äänenvoimakkuus on. Säätääksesi mikrofonin tasoa, avaa haluamasi äänitysohjelma ja tarkkaile äänenvoimakkuutta. <br /><b>Puhu voimakkaasti, aivan kuin haukkuisit jotain nuubia.</b><br/>Säädä mikrofonin äänenvoimakkuuden tasoa, kunnes tämä arvo on lähellä 100%, mutta varmista ettei se ylity. Arvon ylittyessä puheessasi ilmenee pätkimistä, mikä heikentää äänenlaatua. Signal-To-Noise ratio Signal-To-Noise -suhde Signal-To-Noise ratio from the microphone Mikrofonin Signal-To-Noise -suhde This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. Näyttää viimeisimmän paketin (20ms) mikrofonin Signal-To-Noise -suhteen (SNR). Arvosta näkee kuinka paljon selkeämpi ääni on verrattuna meluun.<br />Arvon ollessa alle 1.0, signaalissa on enemmän melua kuin ääntä, jolloin laatu on heikkoa.<br />Arvolle ei ole ylärajaa, mutta älä oleta liikoja yli 40-50 -arvoilla. Speech Probability Puheen todennäköisyys Probability of speech Puheen todennäköisyys This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). Todennäköisyys sille, että viimeisin paketti (20ms) oli puhetta eikä taustamelua.<br />Puheaktiviteetin lähetystapa riippuu siitä että tämä oikein. Lauseen keskiosa tunnistetaan aina puheeksi; ongelmat ovat lyhyet katkot sanojen keskellä ja puheen aloitus. Esimerkiksi huokaus on hankala erottaa h-kirjaimella alkavasta sanasta.<br />Jos arvon fontti on lihavoitu, Mumble lähettää ääntä paraikaa (jos olet yhteydessä). Configuration feedback Konfiguraation palaute Current audio bitrate Tämänhetkinen äänen bittivirta Bitrate of last frame Edellisen paketin bittivirta DoublePush interval Tuplapainalluksen väliaika Time between last two Push-To-Talk presses Viimeisimmän kahden puhepikanäppäimen painalluksen väliaika Speech Detection Puheentunnistus Current speech detection chance Tämänhetkisen puheentunnistuksen todennäköisyys <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>Näyttää nykyisen puheentunnistuksen asetuksen.</b><br />Voit vaihtaa asetusta Asetuksista tai Audioapurista. Signal and noise power spectrum Signaalin ja melun voimakkuuden jakauma Power spectrum of input signal and noise estimate Sisääntulevan signaalin ja melun arvion jakauma. This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. Näyttää voimakkuuden jakauman nykyisen sisääntulevan signaalista (punainen) ja nykyisen meluarvion (sininen).<br />Kaikki voimakkuudet ovat kerrottu 30:llä, jotta mielenkiintoiset osat näkyisivät (kuinka paljon enemmän ääntä kuin melua on jokaisessa ääniaallossa).<br />Tämä kiinnostanee sinua vain jos yrität hienosäätää mikrofonin meluolosuhteita. Hyvissä olosuhteissa tulisi ilmetä vain pieni määrä sinistä alareunassa. Jos sinistä on enemmän kuin graafin puoliväliin, ympäristösi on todella meluisa. Echo Analysis Kaiun Analysointi Weights of the echo canceller Kaiunpoiston painotukset This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. Näyttää kaiunpoiston painotukset, aika lisääntyy alaspäin ja taajuus kasvaa oikealle.<br />Ideaalitilanteessa tämän pitäisi olla musta, jolloin kaikua ei ole lainkaan. Useimmiten, kaikua on useamman vaakasuuntaisen viivan verran, jotka edustavat kaiun viivettä. Muutoksien tulisi näkyä reaaliajassa.<br />Huomioi, että kun kaikua ei ole, tästä ei erityisemmin ilmene mitään. Soita hieman musiikkia, niin tilanne tasaantuu.<br />Voit valita näytettäväksi joko oikean tai kuvitteelliset osat taajuuksien painotuksesta, tai vaihtoehtoisesti lasketun kertoimen tai näkymän. Näistä hyödyllisin lienee kerroin, joka on kaiun voimakkuus, ja näyttää paljonko uloslähtevästä signaalista leikataan. Muut näkymät ovat hyödyllisiä pääasiassa vain niille, jotka haluavat säätää kaiunpoiston algoritmeja.<br />Huomioi, jos koko kuva aaltoilee kerrointilassa, kaiunpoisto epäonnistuu löytäämään yhteyttä kahden sisääntulolähteen välillä (kaiuttimien ja mikrofonin). Joko sinulla on pitkäviiveinen kaiku, tai toinen sisääntulolähteistä on konfiguroitu väärin. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. Viimeisimmän paketin (20ms) audion bittivirta. Arvo heiluu ylös ja alas aina kun VBR säätää laatua. Huipun bittivirtaa voidaan säätää Asetuksista. AudioWizard Audio Tuning Wizard Audioapuri Introduction Tutustuminen Welcome to the Mumble Audio Wizard Tervetuloa Mumblen Audioapuriin Finished Valmis Enjoy using Mumble Tervetuloa käyttämään Mumblea Device selection Laitteen valinta Selecting the input and output device to use with Mumble. Valitse Mumblessa käytettävät ulos- ja sisääntulolaitteet. This is the device your microphone is connected to. Laite johon mikrofonisi on yhdistetty. System Järjestelmä Input method for audio Äänen sisääntulotapa. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Äänen sisääntulotapa.</b><br />Todennäköisimmin haluat käyttää DirectSoundia. Device Laite Input device to use Käytetty sisääntulolaite. <b>Selects which sound card to use for audio input.</b> Valitsee mitä äänikorttia käytetään audion sisääntuloon. Cancel echo from headset or speakers Poista kaiku kuulokkeista tai kaiuttimista. Use echo cancellation Käytä kaiunpoistoa This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. Ottaa käyttöön kaiunpoiston uloslähtevästä audiosta. Asetus auttaa sekä kaiuttimissa että kuulokkeissa. This is the device your speakers or headphones are connected to. Laite johon kaiuttimesi tai kuulokkeesi on yhdistetty. Output method for audio Äänen ulostulotapa. <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. Äänen ulostulotapa. Todennäköisimmin haluat käyttää DirectSoundia. Output device to use Käytettävä audion ulostulolaite <b>Selects which sound card to use for audio Output.</b> Valitsee mitä äänikorttia käytetään äänen ulostuloon. Enable positional audio Käytä sijainninmukaista audiota Allows positioning of sound Allows positioning of sound. Sallii audion sijainninmukaistamisen <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> <p> Tämä on Mumblen audioapuri. Apuri auttaa sinua asettamaan oikein äänikorttisi sisääntulon voimakkuustason ja oikeat parametrit äänenkäsittelylle Mumblessa. </p> <p> Huomioi, että niin kauan kuin audioapuri on aktiivinen, audio kierrätetään paikallisesti kuunteluasi varten eikä lähetetä palvelimelle.</p> Input Device Sisääntulolaite Output Device Ulostulolaite This allows Mumble to use positional audio to place voices. Ottaa käyttöön Mumblen sijainninmukaisen audion äänien sijoittelun. <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> <p> Jotta viive voidaan pitää mahdollisimman pienenä, on tärkeää puskuroida äänikortille mahdollisimman vähän ääntä. Useiden äänikorttien ilmoitetaan vaativan paljon pienempää puskurointia, kuin ne kykenevät työstämään, jolloin oikean arvon löytää vain koittamalla. </p> <p> Sinun tulisi kuulla ääninäyte. Liikuta alla olevaa säädintä alimpaan arvoon joka <b>ei</b> keskeytä tai aiheuta säröilyä äänessä. Ota huomioon että paikallinen kaiku on poistettu tässä testissä. </p> Amount of data to buffer Datapuskurin koko This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Asettaa datamäärän ulostulopuskurin esipuskurille. Kokeile eri arvoja ja aseta alhaisin, mikä ei aiheuta äänessä nopeaa huojuntaa. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> <p> Avaa tietokoneesi ääniasetukset ja mene nauhoitusasetuksiin. Varmista että mikrofoni on valittuna sisääntulona ja että sen nauhoitusvoimakkuus on maksimissa. Jos mikrofonin voimakkuuden tehostaminen on mahdollista, varmista että se on valittuna. </p> <p> Puhu yhtä äänekkäästi kuin olisit ärsyyntynyt tai innoissasi jostain. Vähennä voimakkuutta ääniasetuksista kunnes palkki pysyy puhuessasi niin korkealla kuin mahdollista sinisellä ja vihreällä mutta <b>ei</b> punaisella alueella. </p> Positional Audio Sijainninmukainen audio Adjusting attenuation of positional audio. Sijainninmukaisen audion vaimennuksen säätö. <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> <p> Mumble tukee sijainninmukaista audiota joillekin peleille. Ominaisuus suuntaa muiden puheen tulemaan heidän pelissä olevan sijainnin mukaan. Sijaintia simuloidaan sekä säätämällä äänenvoimakkuutta pelaajien etäisyyden suhteen että tulevan äänenlähteen liikuttamista heidän suuntaan. Sijainnin määrittäminen riippuu kaiuttimiesi asetuksista järjestelmässäsi, jotka voit tarkistaa tässä testissä. </p> <p> Äänen sijaintikartta ylhäältäpäin katsottuna: <font color="red">sinä</font>, <font color="yellow">kaiuttimet</font> ja <font color="green">liikkuva äänenlähde</font>. Sinun tulisi kuulla äänen liikkuvan kaiuttimissasi. </p> Use headphones instead of speakers Käytä kuulokkeita kaiuttimien sijaan <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> <p> Nyt voit nauttia Mumblen rikkaasta äänikokemuksesta. </p> <p> Mumblea kehitetään jatkuvasti, ja kehitystiimi haluaa keskittyä useampia käyttäjiä palveleviin asioihin. Tästä johtuen, Mumble voi lähettää kehittäjille anonyymia tietoa sinun asetuksistasi. Nämä tiedot ovat tärkeitä tulevaisuuden kehittämiselle, ja mahdollistaa sen että sinun käyttämäsi palvelut pysyvät myös jatkossa mukana. </p> Use headphones Käytä kuulokkeita This ignores the OS speaker configuration and configures the positioning for headphones instead. Tämä ohittaa käyttöjärjestelmän kaiutinasetuksen ja konfiguroi sijainninmukaisen äänen vain kuulokkeille. Volume tuning Äänenvoimakkuuden säätäminen Tuning microphone hardware volume to optimal settings. Mikrofonin laiteäänenvoimakkuuden asettaminen sopivaksi. Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. Nyt puhu hiljaisesti, kuin puhuisit myöhään illalla etkä haluaisi häiritä muita. Säädä liukusäädintä niin että palkki muuttuu vihreäksi kun puhut, mutta pysyy sinisellä kun olet hiljaa. Voice Activity Detection Ääniaktiviteetin tunnistaminen Letting Mumble figure out when you're talking and when you're silent. Puheen ja hiljaisuuden tunnistuksen määrittäminen Mumbleen. This will help Mumble figure out when you are talking. The first step is selecting which data value to use. Avustaa Mumblea päättämään milloin olet puheessa. Ensimmäinen askel on valita mitä menetelmää käytetään. Raw amplitude from input Alkuperäinen äänenvoimakkuus sisääntulosta Signal-To-Noise ratio Signal-To-Noise -suhde Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Seuraavaksi sinun täytyy säätää tämä liukusäädin. Aluksi puheesi tulisi päätyä vihreälle alueelle (varmasti puhetta). Kun jatkat puhumista, tulisi palkin pysyä keltaisella alueella (mahdollisesti puhetta). Ja kun et puhu, tulisi palkin olla punaisella alueella (ei puhetta). Device tuning Laitteiden säätäminen Changing hardware output delays to their minimum value. Laitteiston ulostulon viiveen asettaminen pienimpään mahdolliseen arvoon. Submit anonymous statistics to the Mumble project Lähetä anonyymejä tilastoja Mumble-projektille Push To Talk: Puhepikanäppäin: Quality & Notifications Laatu & Ilmoitukset Adjust quality and notification settings. Säädä laatu- ja ilmoitusasetuksia. Quality settings Laatuasetukset Low Matala Balanced Tasapainotettu Notification settings Ilmoitusasetukset Use Text-To-Speech to read notifications and messages to you. Käytä Teksti-puheeksi -toimintoa lukeaksesi ilmoitukset ja viestit. Disable Text-To-Speech and use sounds instead. Älä käytä Teksti-puheeksi -toimintoa vaan käytä äänimerkkejä. %1 ms %1 ms Enables attenuation of other applications while users talk to you Vaimentaa muut sovellukset kun muut puhuvat sinulle Attenuate applications while other users talk Vaimenna muut sovellukset puheen aikana High Korkea Custom Kustomoitu You already set a customized quality configuration in Mumble. Select this setting to keep it. Valitsit jo Mumblessa kustomoidun laatukonfiguraation. Valitse tämä säilyttääksesi valinnan. Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. Vaimentaa muut sovellukset muiden puheen aikana. Kun joku alkaa puhua sinulle Mumblessa, muut ohjelmat (kuten äänentoistimet) vaimennetaan, jolloin kuulet puheen selvemmin. Apply some high contrast optimizations for visually impaired users Lisää kontrastia näkörajoitteisille käyttäjille Use high contrast graphics Käytä korkean kontrastin grafiikoita. Keep custom Text-To-Speech settings. Pidä kustomoidut Teksti-puheeksi -asetukset. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode <p> Avaa tietokoneesi ääniasetukset ja mene nauhoitusasetuksiin. Varmista että mikrofoni on valittuna sisääntulona ja että sen nauhoitusvoimakkuus on maksimissa. Jos mikrofonin voimakkuuden tehostaminen on mahdollista, varmista että se on valittuna. </p> <p> Puhu kovalla äänellä, aivan kuin olisit ärsyyntynyt tai kiihtynyt. Vähennä ohjauspaneelissa äänenvoimakkuutta kunnes alapuolen palkki pysyy mahdollisimman korkealla raidallisella ja tyhjällä alueella mutta <b>ei</b> ristikollisella alueella kun puhut. </p> Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode Nyt puhu hiljaisesti kuten puhuisit myöhään illalla ja et haluaisi häiritä muita. Liikuta säädin siten että puhuessasi palkki menee tyhjään alueeseen, mutta pysyy raidallisella ollessasi hiljaa. Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode Seuraavaksi sinun täytyy siirtää seuraavaa liukusäädintä. Ensimmäisten sanomiesi lausahduksien tulisi päätyä tyhjälle alueelle (varmasti puhetta). Puhuessasi sinun tulisi pysyä viivoitetun alueen sisällä (mahdollisesti puhetta) ja ollessasi vaiti, kaiken tulisi olla ristikossa (varmasti ei puhetta). In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) Asetuksessa Mumble käyttää <b>pientä kaistanleveyttä</b>, mutta väistämättä aiheuttaa korkean viiveen ja huonon laadun. Käytä tätä vaihtoehtoa vain jos yhteytesi ei pysty käyttämään muita vaihtoehtoja. (16kbit/s, 60ms per paketti) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) <b>Suositeltu</b> oletusasetus. Tarjoaa hyvän tasapainon laadun, viiveen ja kaistanleveyden välillä.(40kbit/s, 20ms per paketti) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) Asetus on suositeltu vain tilanteissa joissa kaistanleveys ei ole ongelma, kuten LAN. Tarjoaa lyhimmän viiveajan johon Mumble kykenee, sekä <b>korkean laadun</b>.(72kbit/s, 10ms per paketti) BanEditor Mumble - Edit Bans Mumble - Muokkaa estoja &Address &Osoite &Mask &Mask Reason Syy Start Alkaen End Loppuen User Käyttäjä Hash Tarkistussumma &Add &Lisää &Update &Päivitä &Remove &Poista Ban List Estolista Search field Hakukenttä This is the search field. Use it to find bans that have this username set in the username field. Tämä on hakukenttä. Käytä tätä löytääksesi tietylle käyttäjälle asetetut estot. Who are you looking for? Ketä etsit? No nickname Ei käyttäjänimeä IP address IP-osoite No IP address Ei IP-osoitetta Reason for the ban Syy estolle No reason Ei syytä Ban end date Eston loppumispäivä Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). Eston päättymispäiväys. Mikäli aloitus- ja lopetuspäivä asetetaan samaksi, esto on loppumaton. Certificate hash Sertifikaatin tarkistussumma No certificate hash Ei sertifikaatin tarkistussummaa Banned users Estetyt käyttäjät This is a list with banned users. Tässä lista estetyistä käyttäjistä. Use this button if you want to add a new ban. Klikkaa tätä nappia lisääksesi uuden eston. Use this button if you want to update ban information. Klikkaa tätä nappia päivittääksesi eston tietoja. Use this button if you want to remove user from the ban list. Klikkaa tätä nappia poistaaksesi käyttäjän estetyistä. Clear all fields Tyhjennä kaikki kentät This button clears all fields. Use it if you want to add a new ban. Tyhjentää kaikki kentät. Käytä tätä jos haluat lisätä uuden eston. Clear Tyhjennä Ban List - %n Ban(s) Estolista - %n esto(a)Estolista - %n esto(a) CertView Name Nimi Email Sähköpostiosoite Issuer Myöntäjä Expiry Date Loppumispäivä (none) (ei mitään) Self-signed Itse allekirjoitettu CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. Sähköpostin varmentaminen epäonnistui. <br/>Syötä voimassaoleva (tai tyhjä) sähköpostiosoite jatkaaksesi. There was an error generating your certificate.<br />Please try again. Sertifikaatin luomisessa oli ongelmia.<br />Yritä uudelleen. Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. Sertifikaattiasi ja avaintasi ei saatu vietyä PKCS#12 formaattiin. Sertifikaatissasi saattaa olla virhe. The file could not be opened for writing. Please use another file. Tiedostoa ei saatu avattua kirjoitusta varten. Valitse toinen tiedosto The file's permissions could not be set. No certificate and key has been written. Please use another file. Tiedoston käyttöoikeuksia ei voitu asettaa. Sertifikaattia eikä avainta ei ole luotu. Valitse toinen tiedosto. The file could not be written successfully. Please use another file. Tiedostoa ei voitu luoda onnistuneesti. Valitse toinen tiedosto. The file could not be opened for reading. Please use another file. Tiedostoa ei voitu avata lukemista varten. Valitse toinen tiedosto. The file is empty or could not be read. Please use another file. Tiedosto on tyhjä tai sitä ei voitu avata. Valitse toinen tiedosto. The file did not contain a valid certificate and key. Please use another file. Tiedosto ei sisällä voimassaolevaa sertifikaatti-avain paria. Valitse toinen tiedosto. Select file to export certificate to Valitse tiedosto, johon sertifikaatti viedään Select file to import certificate from Valitse tiedosto, josta sertifikaatti tuodaan Unable to import. Missing password or incompatible file type. Tuonti epäonnistui. Salasana puuttuu tai tiedostomuoto ei ole tuettu. <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. <b>Sertifikaatti vanhenee:</b> Sertifikaattisi on vanhentumassa. Sinun tulee uusia sertifikaattisi tai et voi enään yhdistää rekisteröimiisi palvelimiin. Certificates Certificate Management Sertifikaattien hallinta Certificate Authentication Sertifikaatti tunnistautuminen Authenticating to servers without using passwords Tunnistautuminen palvelimille käyttämättä salasanoja. Current certificate Nykyinen sertifikaatti This is the certificate Mumble currently uses. Sertifikaatti jota Mumble käyttää tällä hetkellä. Current Certificate Nykyinen sertifikaatti Create a new certificate Luo uusi sertifikaatti This will create a new certificate. Tämä luo uuden sertifikaatin. Import certificate from file Tuo sertifikaatti tiedostosta This will import a certificate from file. Tuo sertifikaatin tiedostosta. Import a certificate Tuo sertifikaatti Export Certificate Vie sertifikaatti This will export a certificate to file. Vie sertifikaatin tiedostoon. Export current certificate Vie nykyinen sertifikaatti Import Certificate Tuo sertifikaatti PKCS #12 Certificate import PKCS #12 Sertifikaatin tuonti <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumbleen voi tuoda sertifikaatteja PKCS #12 -muodossa. Mumble vie tämänmuotoisia sertifikaatteja, kuten myös Firefox, Internet Explorer, Opera jne..</p><p>Jos tiedosto on salasanasuojattu, tarvitset salasanan tuodessasi sertifikaatin.</p> Import from Tuo kohteesta Filename to import from Tiedosto, josta sertifikaatti tuodaan This is the filename you wish to import a certificate from. Tämä on tiedostonnimi, josta haluat tuoda sertifikaatin. Select file to import from Valitse tuonti tiedosto This opens a file selection dialog to choose a file to import a certificate from. Avaa tiedostonvalintaikkunan, jossa voit valita mistä tuot sertifikaatin. Open... Avaa... Password Salasana Password for PKCS#12 file Salasana PKCS#12 tiedostoon. This is the password for the PKCS#12 file containing your certificate. Salasana PKCS#12-sertifikaattitiedostolle. Certificate to import Tuomisen sertifikaatti. This is the certificate you are importing. Tämä on sertifikaatti jota olet tuomassa. Certificate Details Sertifikaatin tiedot Replace Certificate Korvaa sertifikaatti Replace existing certificate with new certificate? Korvaa nykyinen sertifikaatti uudella? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> <p>Sinulla on jo sertifikaatti tallennettuna Mumbleen, ja olet aikeissa korvata sen.</p> <p>Jos olet päivittämässä luotettuun sertifikaattiin, ja sen sähköpostiosoite täsmää nykyisen sertifikaatin kanssa, on toimenpide turvallinen. Palvelimet joihin yhdistät automaattisesti tunnistavat vahvan sertifikaatin sähköpostiosoitteellasi. </p> <p>Mikäli näin ei ole, palvelimet, joihin olet aikaisemmin tunnistautunut, eivät enää tunnista sinua. Jos et ole vielä rekisteröitynyt yhdellekkään palvelimelle, tämä ei vaikuta sinuun. </p> <p> Haluatko varmasti korvata sertifikaatin? </p> This is the certificate Mumble currently uses. It will be replaced. Tämä on Mumblen nykyinen sertifikaatti, joka tullaan korvaamaan New certificate Uusi sertifikaatti This is the new certificate that will replace the old one. Tämä on uusi sertifikaatti, jolla vanha korvataan. New Certificate Uusi sertifikaatti Make a backup of your certificate Varmuuskopioi sertifikaattisi Export to Vie Filename to export to Vie nimellä This is the filename you wish to export a certificate to. Tämä on tiedostonimi, johon haluat viedä sertifikaatin. Save As... Tallenna nimellä... This is the certificate Mumble currently uses. It will be exported. Tämä on Mumblen nykyinen sertifikaatti, joka tullaan viemään tiedostoon. Generate a new certificate for strong authentication Luo uusi sertifikaatti vahvalle tunnistautumiselle. <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> <p>Mumble generoi vahvan sertifikaatin palvelimelle tunnistautumiseen.</p><p>Halutessasi voit antaa sertifikaattiin sisään lisätietoja, jotka esitetään palvelimelle kun yhdistät sinne. Jos sisällytät kelvollisen sähköpostiosoitteen, voit myöhemmin päivittää CA:n myöntämään sähköpostisertifikaatin, joka tuottaa vahvan tunnistautumisen.</p> Name Nimi Email Sähköpostiosoite Your email address (e.g. johndoe@mumble.info) Sähköpostiosoitteesi (esim. matti.meikalainen@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. Tämä on sähköpostiosoitteesi. On erittäin suositeltavaa käyttää kelvollista sähköpostiosoitetta, koska se sallii sinun päivittää vahvaan sertifikaattiin ilman tunnistautumisongelmia. Your name (e.g. John Doe) Nimesi (esim. Matti Meikäläinen) This is your name, and will be filled out in the certificate. This field is entirely optional. Tämä on nimesi, joka tulee sertifikaatiin. Kentän täyttäminen on täysin vapaaehtoista. Finish Valmis Certificate-based authentication is ready for use Sertifikaatteihin perustuva tunnistautuminen on käyttövalmis Enjoy using Mumble with strong authentication. Nauti Mumblen käytöstä vahvalla autentikoinnilla. Automatic certificate creation Automaattinen sertifikaation luominen. <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>Mikäli menetät sertifikaattisi, joka tapahtuu laitteistovian tai kun uudelleen asennat järjestelmäsi, et pysty enään autentikoimaan mihinkään palvelimeen johon olet rekisteröitynyt. Tämän takia on sinun <b>täytyy</b> tehdä varmuuskopio sertifikaatistasi. Suosittelememme pitämään varmuuskopiota erillisellä laitteella, kuten USB muistitikulla.</p> <p>Ota huomioon että varmuuskopio tiedosto ei ole salattu ja mikäli joku pääsee siihen käsiksi, he pystyvät esiintymään sinuna, joten pidä varmuuskopiosta hyvää huolta.</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> ChanACL None Ei mitään Traverse Läpikulku Enter Enter Speak Puhuminen Mute/Deafen Mykistä Make channel Luo kanava Make temporary Luo tilapäinen Link channel Liitä kanava This represents no privileges. Esittää ei etuoikeuksia. This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. Esittää täysiä oikeuksia kanavalle, sisältäen mahdollisuuden muuttaa ryhmän ja ACL tietoja. Tämä etuoikeus sisältää kaikki muut etuoikeudet. This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. Ilmaisee oikeuden kanavan läpikulkemiseen. Jos käyttäjältä estetään tämä oikeus, hän ei pääse tälle kanavalle tai millekkään sen alikanaville, riippumatta alikanavien oikeuksista. This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. Ilmaisee oikeuden liittyä kanavalle. Mikäli sinulla on hierarkinen kanava rakenne, luultavasti haluat antaa kaikille läpikulku oikeudet, mutta estää pääsyn hierarkiasi juureen. This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. Esittää lupaa puhua kanavalla. Käyttäjät joilla ei ole tätä etuoikeutta, vaimennetaan palvelimen puolesta (näkyy mykistettynä), ja eivät voi puhua ennenkuin heidän mykistyksensä purkaa joku jolla on tähän oikeudet. This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. Antaa luvan kuiskata tälle kanavalle sen ulkopuolelta. Tämä oikeus toimii samanlailla kuin <i>puhe</i> oikeus, mutta koskee vain puhetta, jonka aikana kuiskausnäppäintä painetaan. Kuiskaus pätee myös kanavan alikanaville ilman, että kanavia tarvitsee liittää. This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. Esittää lupaa mykistää ja hiljentää muita käyttäjiä. Kun käyttäjä mykistetään, mykistys pysyy niin kauan kunnes etuoikeutettu käyttäjä poistaa mykistyksen, tai käyttäjä yhdistää palvelimelle uudelleen. This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. Esittää lupaa siirtää käyttäjä toiselle kanavalle tai poistaa hänet palvelimelta. Käyttäjän siirtämiseen, joko siirtävällä käyttäjällä tulee olla Siirto -oikeudet kohdekanavassa, tai siirrettävän käyttäjän tulee olla sallittua liittyä kanavalle. Tämän oikeuden käyttäjät voivat siirtää käyttäjiä kanaville, joille käyttäjä ei normaalioloissa voisi liittyä. This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. Esittää lupaa tehdä alikanavia. Alikanavan luova käyttäjä lisätään alikanavan ylläpitoryhmään. This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. Esittää lupaa tehdä väliaikaisen alikanavan. Alikanavan luova käyttäjä lisätään alikanavan ylläpitoryhmään. Väliaikaisia kanavia ei tallenneta, ja ne katoavat kun viimeinen käyttäjä poistuu. This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. Ilmaisee oikeuden liittää kanavia toisiinsa. Käyttäjät liitetyillä kanavilla kuulevat toisensa, kunhan puhujalla on <i>puhe</i> oikeus kuulijoiden kanavilla. Kanavien liittämiseen tarvitaan liittämisoikeudet molemille kanaville, mutta sen purkamiseen riittää oikeudet vain toisella kanavista. This represents the permission to write text messages to other users in this channel. Esittää lupaa kirjoittaa viesti toisille käyttäjille samalla kanavalla. This represents the permission to forcibly remove users from the server. Esittää lupaa poistaa käyttäjiä palvelimelta. This represents the permission to permanently remove users from the server. Esittää lupaa pysyvästi estää käyttäjän pääsy palvelimelle. This represents the permission to register and unregister users on the server. Esittää lupaa rekisteröidä käyttäjiä että poistaa käyttäjien rekisteröinti palvelimella. This represents the permission to register oneself on the server. Esittää lupaa itsensä rekisteröintiin palvelimella. Whisper Kuiskaa Move Siirrä Text message Tekstiviesti Kick Potkaise Ban Estä Register User Rekisteröi käyttäjä Register Self Rekisteröi itsesi Write ACL Kirjoita ACL ChatbarTextEdit Paste and &Send Paste and send Liitä ja &lähetä <center>Type chat message here</center> Kirjoita viesti tähän ClientUser Friend Kaveri Authenticated Autentikoitu Priority speaker Etuoikeutettu puhuja Recording Nauhoitus Muted (server) Mykistetty (palvelin) Deafened (server) Hiljennetty (palvelin) Local Ignore (Text messages) Paikallinen viestien hylkääminen Local Mute Paikallinen mykistys Muted (self) Mykistetty (itse) Deafened (self) Hiljennetty (itse) ConfigDialog Accept changes Hyväksy muutokset This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. Tämä nappi hyväksyy tämänhetkiset asetukset ja palaa sovellukseen.<br />Asetukset tallennetaan levylle, kun poistut sovelluksesta. Reject changes Hylkää muutokset This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. Tämä nappi hylkää kaikki muutokset ja palaa sovellukseen.<br />Alkuperäiset asetukset palautetaan. Apply changes Ota muutokset käyttöön This button will immediately apply all changes. Ottaa kaikki muutokset suoraan käyttöön. Undo changes for current page Peruuta muutokset nykyiseltä sivulta This button will revert any changes done on the current page to the most recent applied settings. Peruuttaa kaikki muutokset aikaisempiin tiloihin nykyisellä sivulla. Restore defaults for current page Palauta nykyisen sivun oletusasetukset This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. Palauttaa nykyisen sivun asetukset oletusarvoiksi. Toiminto ei tee muutoksia muihin sivuihin.<br />Halutessasi palauttaa kaikki asetukset oletusarvoihin, tulee sinun käyttää tätä toimintoa jokaisella sivulla. Mumble Configuration Mumblen konfigurointi ConnectDialog Connecting to %1 Yhdistetään %1 Enter username Kirjoita käyttäjänimi Adding host %1 Lisää isäntä %1 Servername Palvelimen nimi Hostname Isäntänimi Bonjour name Bonjour nimi Port Portti Addresses Osoitteet Website Nettisivu Packet loss Pakettihävikki Ping (80%) Ping (80%) %1 ms %1 ms Ping (95%) Ping (95%) Bandwidth Kaistanleveys %1 kbit/s %1 kbit/s &Connect &Yhdistä &Filters &Filtterit Unknown Users Käyttäjät Version Versio Failed to fetch server list Epäonnistui noutamaan palvelinlistan Mumble Server Connect Mumble-palvelimeen yhdistäminen Ping Vasteaika Remove from Favorites Poista suosikeista Add custom server Lisää kustomoitu palvelin Show all servers that respond to ping Näytä kaikki palvelimet, jotka vastaavat kutsuun Show all servers with users Näytä kaikki palvelimet, joilla on käyttäjiä Show all servers Näytä kaikki palvelimet &Copy %Kopioi Copy favorite link to clipboard Kopioi suosikkilinkki leikepöydälle &Paste &Liitä Paste favorite from clipboard Liitä suosikkilinkki leikepöydältä &Edit... &Muokkaa... &Add New... &Lisää uusi... Add to &Favorites Lisää &suosikkeihin Open &Webpage Avaa &websivu Show &Reachable Näytä &Tavoitettavissa Show &Populated Näytä &Käytössä olevat Show &All Näytä &kaikki ConnectDialogEdit Edit Server Muokkaa palvelinta Name of the server Palvelimen nimi A&ddress &Osoite Internet address of the server. Internet address of the server. Palvelimen internet-osoite. <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Osoite</b><br/> Palvelimen internet osoite. Tämä voi olla joko tavallinen isäntänimi, IPv4/Ipv6 osoite tai Bonjour palvelun tunniste. Bonjour palvelun tunnisteessa tulee käyttää etuliitettä "@" jotta Mumble tunnistaa sen. &Port &Portti Port on which the server is listening Portti, jota palvelin kuuntelee <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. <b>Portti</b><br/> Portti jota palvelin kuuntelee. Jos palvelin tunnistetaan Bonjour palvelun tunnisteella, tämä kenttä jätetään huomiotta. &Username &Käyttäjänimi Username to send to the server Käyttäjänimi jota tulet käyttämään palvelimella <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. <b>Käyttäjänimi</b><br/> Käyttäjänimi jota tulet käyttämään palvelimella. Huomioi että palvelimet voivat asettaa rajoitteita käyttäjänimen suhteen tai sama käyttäjänimi voi olla jo käytössä, jolloin käyttäjänimi tulee vaihtaa. Label Nimike Add Server Lisää palvelin You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 Password Salasana Password to send to the server Palvelimelle lähetettävä salasana <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. <b>Salasana</b<br/> Salasana joka lähetetään palvelimelle. Salasanaa tarvitaan yhdistättäessä <i>Ylläpitäjänä</i> tai palvelimelle joka käyttää salasanatunnistautumista. Mikäli jätät kentän tyhjäksi, salasanaa kysytään myös palvelimelle yhdistämisen yhteydessä. Show password Näytä salasana <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. <b>Nimike</b><br/> Palvelimen nimike. Vapaasti valittava nimike, jolla palvelin tulee esiintymään palvelin listassasi. Local server label Paikallinen palvelimen nimike 127.0.0.1 127.0.0.1 64738 64738 Your username Käyttäjänimesi Your password Salasanasi &Fill CoreAudioSystem Default Device Oletuslaite CrashReporter Mumble Crash Report Mumblen kaatumisraportti <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> <p><b>Mumble näyttäisi kaatuneen, olemme pahoillamme. Haluatko lähettää kaatumisraportin Mumblen kehittäjille?</b></p><p> Kaatumisraportti sisältää osittaisen kopion Mumblen muistista kaatumishetkellä, ja auttaa kehittäjiä korjaamaan ongelman.</p> Email address (optional) Sähköpostiosoite (valinnainen) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash Kuvaile lyhyesti englanniksi mitä olit tekemässä kaatumishetkellä Send Report Lähetä raportti Don't send report Älä lähetä raporttia Crash upload successful Kaatumisraportin lähetys onnistui Thank you for helping make Mumble better! Kiitos, että autat parantamaan Mumblea! Crash upload failed Kaatumisraportin lähetys epäonnistui We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. Olemme pahoillamme, mutta kaatumisraportin lähettäminen epäonnistui virheellä %1 %2. Ole hyvä ja ota yhteyttä kehittäjään virheestä. This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 Tämä ei ole vitsi, mutta kaatumisraportin koodissa näyttäisi olevan bugi, ja me epäonnistuimme lataamaan raportin. Voit informoida kehittäjiä virheestä %1 Uploading crash report Lähetetään kaatumisraporttia Abort upload Keskeytä lähetys DXAudioInput Default DirectSound Voice Input Oletus DirectSound-äänen sisääntulolle Opening chosen DirectSound Input device failed. No microphone capture will be done. Valitun DirectSoundin syöttölaitteen avaaminen epäonnistui. Mikrofoni ei tule kaappaamaan ääntä. Opening chosen DirectSound Input failed. Default device will be used. Valitun DirectSoundin syöttölaitteen avaaminen epäonnistui. Oletuslaite otetaan käyttöön. Lost DirectSound input device. DirectSound sisääntulolaite katosi. DXAudioOutput Default DirectSound Voice Output Oletus DirectSound-äänen ulostulolle Opening chosen DirectSound Output failed. Default device will be used. Valitun DirectSoundin ulostulolaitteen avaaminen epäonnistui. Oletuslaite otetaan käyttöön. Lost DirectSound output device. DirectSound ulostulolaite katosi. Opening chosen DirectSound Output failed. No audio will be heard. Valitun DirectSoundin ulostulolaitteen avaaminen epäonnistui. Ääntä ei tulla toistamaan. Database Mumble failed to initialize a database in any of the possible locations. Mumble ei onnistunut muodostamaan tietokantaa missään sijainnissa. The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. Tietokantaan '%1' on vain lukuoikeus. Mumble ei voi tallentaa palvelinasetuksia (esim. SSL sertifikaatteja), kunnes korjaat tämän ongelman. DeveloperConsole Developer Console Kehittäjäkonsoli DockTitleBar Drag here Vedä tästä GlobalShortcut Shortcuts Pikanäppäimet List of configured shortcuts Lista määritetyistä pikanäppäimistä Function Toiminto Data Data Shortcut Pikanäppäin Suppress Piilota Add new shortcut Lisää uusi pikanäppäin This will add a new global shortcut Tämä lisää uuden yleisen pikanäppäimen &Add &Lisää Remove selected shortcut Poista valittu pikanäppäin This will permanently remove a selected shortcut. Tämä poistaa valitun pikanäppäimen pysyvästi. &Remove &Poista <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> <html><head/><body><p>Mumble voi tällä hetkellä käyttää hiiren näppäimiä ja näppäimistön apunäppäimiä(Alt, Ctrl, Cmd, etc.) yleisiin pikanäppäimiin.</p><p>Jos haluat laajemman valikoiman, voit sallia <span style=" font-style:italic;">Käyttöapulaitteet</span> järjestelmän Saatavuusasetuksissa. Ota kuitenkin huomioon että tämä muutos voi mahdollistaa haittaohjelmien lukea näppäimistöäsi..</p></body></html> Open Accessibility Preferences Avaa saatavuusasetukset Skip Ohita Enable Global Shortcuts Salli yleiset pikanäppäimet <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. Additional Shortcut Engines <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. Enable Windows hooks <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. Enable GKey <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. Enable XInput <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. Enable shortcuts in privileged applications GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> <html><head/><body><p>Mumblea voi tällä hetkellä käyttää vain hiiren painikkeilla ja näppäimistön muokkausnäppäimillä (Alt, Ctrl, Cmd, etc.) maailmanlaajuisen pikanäppäimet.</p><p>Jos haluat enemmän joustavuutta, voit lisätä Mumblen Macin järjestelmäasetuksissa turvallisuus ja yksityisyys osiossa, luottettujen ohjelmien joukkoon .</p><p>Turvallisuus ja yksityisyys asetuksissa valitse Tietosuoja-välilehti, Sen jälkeen Valitse Saavutettavuus (alhaalla) luettelossa vasemmalla. Lopuksi, lisää Mumble luetettujen ohjelmien listaan.</body></html> Shortcuts Pikanäppäimet Shortcut button combination. Pikanäppäinyhdistelmä. <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. <b>Tämä on yleinen pikanäppäinyhdistelmä. </b><br />Valitse kenttä ja anna haluamasi näppäinyhdistelmä. Tuplaklikkaa tyhjentääksesi. Suppress keys from other applications Peitä painallukset muilta ohjelmilta <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. <b>Peittää näppäinten painamiset muilta ohjelmilta.</b><br />Valittuna piilottaa näppäimen (tai viimeisen näppäimen usean näppäimen yhdistelmässä) muilta ohjelmilta. Ota huomioon että kaikkia näppäimiä ei voi peittää. GlobalShortcutTarget Whisper Target Kuiskauksen kohde Whisper to list of Users Kuiskaa usealle käyttäjälle Channel Target Kohde kanava Restrict to Group Rajoita ryhmään If specified, only members of this group will receive the whisper. Jos määritetty, vain tämän ryhmän jäsenet vastaanottavat kuiskauksen. List of users Käyttäjälista Add Lisää Remove Poista Modifiers Muuntimet Do not send positional audio information when using this whisper shortcut. Älä käytä sijainninmukaista audiota tämän kuiskauspikanäppäimen kanssa. Ignore positional audio Hylkää sijainninmukainen audio Shout to Linked channels Huuda liitetyille kanaville Shout to subchannels Huuda alikanaville Shout to Channel Huuda kanavalle The whisper will also be transmitted to linked channels. Kuiskaus välitetään myös liitetyille kanaville. The whisper will also be sent to the subchannels of the channel target. Kuiskaus näkyy myös kohdekanavan alikanavilla GlobalShortcutX Mouse %1 Hiiri %1 JackAudioSystem Hardware Ports Mono Stereo LCD Not connected Ei yhdistetty LCDConfig Enable this device Käytä tätä laitetta LCD LCD Devices Laitteet Name Nimi <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> <p> Lista järjestelmässäsi olevista LCD laitteista. Kertoo laitteen nimen sekä sen näytön koon. Mumble tukee usean LCD laitteen yhtäaikaiskäyttöä.</p> <h3>Size:</h3> <p> Kenttä kuvaa LCD laitteen koon. Koko annetaan joko pikseleinä (graafinen LCD) tai merkkeinä (merkkipohjainen LCD).</p> <h3>Käytössä:</h3> <p>Kenttä määrää tuleeko Mumble käyttämään kyseenomaisen LCD laitteen näyttöä.</p> Size Koko Enabled Käytössä Views Näkymät Minimum Column Width Minimi sarakkeen leveys <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> <p>Määrää pienimmän sarakeleveyden käyttäjänäkymässä.</p> <p>Jos useat käyttäjät puhuvat yhtäaikaa, käyttäjänäkymä jakaa itsensä sarakkeisiin. Tällä asetuksella voit valita kuinka paljon yksittäinen käyttäjänimi vie tilaa LCD-näytöllä.</p> This setting decides the width of column splitter. Asettaa sarakkeiden jakajan leveyden. Splitter Width Jakajan leveys Log Debug Debug Critical Kriittinen Warning Varoitus Information Tietoa Server Connected Yhdistetty palvelimeen Server Disconnected Palvelinyhteys katkaistu Other self-muted/deafened Toinen käyttäjä mykistyi/hiljeni Permission Denied Ei käyttöoikeutta toiminnolle Text Message Tekstiviesti User Joined Server Käyttäjä liittyi palvelimelle User Left Server Käyttäjä poistui palvelimelta User recording state changed Käyttäjän nauhoitustila muuttuu User kicked (you or by you) Käyttäjä poistettu (sinut tai sinä poistit) User kicked Käyttäjä poistetaan You self-muted Mykistit itsesi User muted (you) Käyttäjä mykistetty (sinä) User muted (by you) Käyttäjä mykistetty (sinä mykistit) User muted (other) Käyttäjä mykistettiin (muu) User Joined Channel Käyttäjä liittyi kanavalle User Left Channel Käyttäjä poistui kanavalta You self-unmuted Poistit mykistyksesi You self-deafened Hiljensit itsesi You self-undeafened Poistit hiljennyksesi User renamed Käyttäjä uudelleennimetty You Joined Channel You Joined Channel (moved) User connected and entered channel User left channel and disconnected Private text message the server palvelin [[ Invalid size ]] [[ Väärä koko ]] [[ Text object too large to display ]] [[ Teksti objekti on liian suuri näkyäkseen ]] [Date changed to %1] [Päivämääräksi vaihtui %1] link to %1 %1 menevä linkki FTP link to %1 player link pelaaja linkki channel link kanava linkki %1 link %1 linkki LogConfig Toggle console for %1 events Käytä ilmoitusviestiä tapahtumalle %1. Toggle pop-up notifications for %1 events Käytä pop-up ilmoitusta tapahtumalle %1 Toggle Text-To-Speech for %1 events Käytä Teksti-puheeksi -toimintoa %1 toiminnolle Click here to toggle sound notification for %1 events Valitse käyttääksesi äänimerkkiä tapahtumalle %1 Toggle window highlight (if not active) for %1 events Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change Polku äänitiedostoon, jota käytetään äänimerkkinä tapahtuman %1 yhteydessä<br />Klikkaa kerran toistaaksesi<br />Tuplaklikkaa vaihtaaksesi Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. Valitse saadaksesi ilmoitusviesti tapahtumalle %1.<br />Valittuna Mumble esittää viestin jokaiselle %1 tapahtumalle viestikentässä. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. Valitse käyttääksesi pop-up ilmoitusta tapahtumalle %1<br />Valittuna lähettää pop-up viestin jokaisen tapahtuman %1 yhteydessä. Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. Polku äänitiedostoon jota käytetään tapahtuman %1 yhteydessä.<br />Paina kerran toistaaksesi<br />Tuplaklikkaa vaihtaaksesi<br />Varmista että tämän tapahtuman äänimerkki on valittu, tai tällä kentällä ei ole vaikutusta. Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. Valitse käyttääksesi Teksti-puheeksi -toimintoa %1 tapahtumille.<br />Mumble käyttää Teksti-puheeksi -toimintoa lukeakseen ääneen %1 tapahtumat, jos tämä on valittuna. Teksti-puheeksi -toiminto voi myös lukea tapahtumat joihin ei käytetä äänimerkkiä. Teksti-puheeksi -toimintoa ja äänimerkkejä ei voida käyttää samaan aikaan. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. Valitse käyttääksesi äänimerkkiä tapahtumalle %1.<br />Valittuna Mumble käyttää määritettyä äänimerkkiä tapahtuman %1 yhteydessä. Äänimerkkejä ja Teksti-puheeksi -toimintoa ei voida käyttää samaan aikaan. Messages Viestit Message Viesti Console Konsoli Notification Ilmoitus Text-To-Speech Teksti-puheeksi Soundfile Äänitiedosto Path Äänitiedoston polku Text To Speech Teksti-puheeksi Volume Äänenvoimakkuus Volume of Text-To-Speech Engine Teksti-puheeksi -toiminnon äänenvoimakkuus <b>This is the volume used for the speech synthesis.</b> <b>Puhesynteesin äänenvoimakkuus</b> Length threshold Pituuden raja Message length threshold for Text-To-Speech Engine Teksti-puheeksi -toiminnon viestin pituuden raja. <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. <b>Teksti-puheeksi -toiminnon pituuden raja.</b><br />Viesteistä luetaan vain määritelty määrä merkkejä. Characters Merkkiä Whisper Kuiskaus If checked you will only hear whispers from users you added to your friend list. Jos tämä on valittuna, vain kaverilistasi käyttäjät voivat kuiskata sinulle. Only accept whispers from friends Ota vastaan kuiskauksia vain kavereilta If enabled text messages you send will be read back to you with TTS Valittuna lähettämäsi viestit luetaan takaisin sinulle teksti puheeksi -toiminnolla. Read back own messages Lue omat viestit takaisin Chat Log Keskusteluloki Maximum chat length Kentän maksimipituus Unlimited Rajoittamaton Lines Riviä Highlight LookConfig System default Järjestelmän oletus None Ei koskaan Only with users Kanavilla käyttäjiä All Aina Ask Kysy Do Nothing Älä tee mitään Move Siirrä <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory <a href="%1">Selaa</a> User Interface Käyttöliittymä This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. Asettaa mitkä kanavat laajennetaan automaattisesti. <i>Ei koskaan</i> ei aukaise kanavahierarkiaa koskaan ja <i>Aina</i> laajentaa kaikki kanavat aina. <i>Kanavilla käyttäjiä</i> laajentaa kanavat, joilla on käyttäjiä sekä aukaisee ja sulkee niitä käyttäjien liittyessä ja poistuessa. List users above subchannels (requires restart). Näytä käyttäjät, jotka ovat alikanavien yläpuolella (vaatii uudelleenkäynnistyksen). <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. <b>Käyttäjät näytetään alikanavien yläpuolella olevilla kanavilla kanavanäkymässä, jos tämä on valittuna.</b><br />Mumble tulee uudelleenkäynnistää, jotta muutos tulee voimaan. Users above Channels Käyttäjät yläkanavilla <b>If set, will verify you want to quit if connected.</b> <b>Valittuna vahvistaa haluatko sulkea ohjelman kun olet yhdistettynä palvelimeen.</b> Show number of users in each channel Näytä käyttäjien määrän jokaisella kanavalla Show channel user count Näytä kanavan käyttäjämäärä Language Kieli Language to use (requires restart) Käytettävä kieli (vaatii uudelleenkäynnistyksen) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. <b>Asettaa kielen jota Mumblen tulisi käyttää</b><br />Mumble pitää käynnistää uudelleen käyttääksesi uutta kieltä. Look and Feel Ulkoasu Layout Asettelu Classic Klassinen Stacked Pinottu Hybrid Hybridi Custom Muokattu This changes the behavior when moving channels. Muuttaa kanavien liikuttamisen tapahtumaa. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. Määrää kanavien vetämisen tapahtuman. Voidaan hyödyntää kanavien vahinkosiirtämisen välttämiseen. <i>Siirrä</i> siirtää kanavan välittömästi. <i>Älä tee mitään</i> ei tee mitään tapahtuman yhteydessä ja antaa virheilmoituksen. <i>Kysy</i> varmistaa tapahtuman yhteydessä halutaanko kanavaa siirtää. Expand Laajenna When to automatically expand channels Milloin laajentaa kanavia automaattisesti Channel Dragging Kanavien vetäminen Ask whether to close or minimize when quitting Mumble. Kysyy haluatko sulkea vai pienentää Mumblen sulkemisen yhteydessä. Ask on quit while connected Kysy lopettamisesta yhdistettynä Always On Top Aina päällimmäisenä <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> <b>Jos asetettu, pienennettäessä Mumblen pääikkuna piilotetaan ja on saatavilla ainoastaan ilmaisinalueelta. Muuten se pienennetään, kuten normaali ikkuna.</b> Hide in tray when minimized Piilota tehtäväpalkkiin pienennettäessä Hide the main Mumble window in the tray when it is minimized. Piilottaa Mumblen ikkunan kun se on pienennettynä tehtäväpalkkiin. This setting controls when the application will be always on top. Asetus säätää milloin Mumblen ikkuna on aina päällimmäisenä ikkunana. Never Ei koskaan Always Aina In minimal view Miniminäkymässä In normal view Perusnäkymässä Displays talking status in system tray Näyttää puhetilan tehtäväpalkin ilmaisualueella Show talking status in tray icon Näytä puhetila tehtäväpalkin ilmaisualueen kuvakkeessa This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. Asetus säätää milloin Mumblen ikkuna on aina päällimmäisenä ikkunana. <i>Ei koskaan</i> ikkuna ei ole koskaan päällimmäisenä. <i>Aina</i> ikkuna pysyy aina päällimmäisenä. <i>Miniminäkymässä</i> / <i>Perusnäkymässä</i> ikkuna on päällimmäisenä ollessa kyseisessä tilassa. Show context menu in menu bar Näytä kontekstivalikot valikkopalkissa Apply some high contrast optimizations for visually impaired users Käytä korkealle kontrastille optimoitua näkymää näkörajoitteisille käyttäjille. Optimize for high contrast Optimoi korkealle kontrastille Application Sovellus Adds user and channel context menus into the menu bar Lisää käyttäjän ja kanavan kontekstivalikot valikkopalkkiin Tray Icon Tehtäväpalkin ilmaisualueen kuvake Channel Tree Kanavapuu Use selected item as the chat bar target Käytä valintaa viestikentän kohteena Filter automatically hides empty channels Automaattinen suodatus piilottaa tyhjät kanavat Show transmit mode dropdown in toolbar Näytä lähetystilan pudotusvalikko työkalupalkissa Theme Teema Theme to use to style the user interface Käyttöliittymän tyyleihin käytetty teema <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. <b>Määrittää mitä tyylitelmää Mumblen käyttöliittymä käyttää</b><br />Mumble hakee teemoja määritetyistä hakemistoista ja näyttää ne tässä listassa. Valitsemaasi teemaa käytetään Mumblen tyylinä. Teema sisältää värejä, ikoneita sekä muuta. User Dragging Käyttäjän siirto This changes the behavior when moving users. Tämä muuttaa sitä, miten käyttäjien siirto käyttäytyy. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. Määrää käyttäjien vetämisen tapahtuman. Voidaan hyödyntää käyttäjien vahinkosiirtämisen välttämiseen. <i>Siirrä</i> siirtää käyttäjän välittömästi. <i>Älä tee mitään</i> ei tee mitään tapahtuman yhteydessä ja antaa virheilmoituksen. <i>Kysy</i> varmistaa tapahtuman yhteydessä halutaanko käyttäjä siirtää. <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. Enable Developer menu When in custom layout mode, checking this disables rearranging. Lock layout MainWindow Root Juuri Push-to-Talk Global Shortcut Puhepikanäppäin Push and hold this button to send voice. Global Shortcut Pidä tämä nappi pohjassa lähettääksesi ääntä. This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut Määrittää Puhepikanäppäimen painikkeen. Mumble tulee lähettämään ääntäsi, kun pidät tätä nappia pohjassa. Reset Audio Processor Global Shortcut Nollaa ääniprosessori Unlink Plugin Global Shortcut Erota liitännäinen Push-to-Mute Global Shortcut Mykistyspikanäppäin Join Channel Global Shortcut Liity kanavalle Toggle Overlay Global Shortcut Näytä Overlay Toggle state of in-game overlay. Global Shortcut Vaihtaa pelinaikaisen overlayn näkymää Toggle Minimal Global Shortcut Ota käyttöön Miniminäkymä Volume Up (+10%) Global Shortcut Lisää äänenvoimakkuutta (+10 %) Volume Down (-10%) Global Shortcut Laske äänenvoimakkuutta (-10 %) Mumble Mumble Mumble -- %1 Mumble -- %1 &Window &Ikkuna Minimize Pienennä Ctrl+M Ctrl+M Close Sulje Mumble is currently connected to a server. Do you want to Close or Minimize it? Mumble on yhdistetty palvelimeen. Haluatko sulkea vai pienentää sen? Mute Self Global Shortcut Mykistä itsesi Set self-mute status. Global Shortcut Asettaa itsesi mykistys tilaan. This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut Vaihtaa mykistyksesi tilaa. Kun poistat mykistyksesi, poistat myös hiljennyksesi. Deafen Self Global Shortcut Hiljennä itsesi Set self-deafen status. Global Shortcut Asettaa itsesi hiljennystilaan. This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut Vaihtaa hiljennyksesi tilaa. Kun laitat hiljennyksen päälle, mykistät myös itsesi. Whisper/Shout Whisper Kuiskaa/Huuda <center>Not connected</center> Not connected <center>Ei yhteyttä</center> Clear Tyhjennä Opening URL %1 Avataan URL %1 File does not exist Tiedostoa ei löydy File is not a configuration file. Tiedosto ei ole asetustiedosto. Settings merged from file. Asetukset määritetty tiedostosta. URL scheme is not 'mumble' URL-osoitteen asettelu ei ole Mumblen mukainen This version of Mumble can't handle URLs for Mumble version %1.%2.%3 Mumblen tämä versio ei pysty käsittelemään URL osoitteita Mumblen versiosta %1.%2.%3 Connecting to %1 Yhdistetään %1 Enter username Kirjoita käyttäjänimi Connecting to server %1. Yhdistetään palvelimeen %1. Reconnecting. Yhdistetään uudelleen. Transmit Mode set to Continuous Lähetystila vaihdettu jatkuvaksi <p>%1 (%2)<br />%3</p> <p>%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> <h2>Äänikanava</h2><p>Salattu 128 bit OCB-AES128:lla<br />%1 ms keskimääräinen viive (%4 poikkeama)</p> Register yourself as %1 Rekisteröidy käyttäjänimellä %1 <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <p>Olet rekisteröitymässä palvelimelle . Rekisteröintiä ei voi peruuttaa ja et voi muuttaa käyttäjänimeäsi tällä palvelimella sen jälkeen.</p><p>Haluatko rekisteröityä tälle palvelimelle nimellä '%1'?</p> <h2>Version</h2><p>Protocol %1</p> <h2>Versio</h2><p>Protokolla %1</p> <p>No build information or OS version available</p> <p>Versiotietoja ei ole saatavilla</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) Yhteys on salattu ja autentikoitu käyttäen %1:ta ja se käyttää %2:ta salausavaimien vaihtoon (%3) The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) Yhteys on salattu käyttäen %1:ta, %2:ta viestien autentikoimiseen ja %3:a salausavaimien vaihdossa. (%4) The connection is secured by the cipher suite that OpenSSL identifies as %1 Yhteys on suojattu käyttäen kryptayskirjastoa minkä OpenSSL tunnistaa %1:ksi. <p>The connection provides perfect forward secrecy</p> <p>Yhteys käyttää Perfect Forward Secrecy -tekniikkaa</p> <p>The connection does not provide perfect forward secrecy</p> <p>Yhteys ei käytä Perfect Forward Secrecy -tekniikkaa</p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> <h2>Hallintakanava</h2><p>Yhteys käyttää %1</p>%2%3<p>%4 ms keskimääräinen latenssi (%5 deviaatio)</p><p>Palvelin %6 (port %7)</p> Voice channel is sent over control channel Äänikanava lähetetään hallintakavan kautta Register user %1 Rekisteröi käyttäjä %1 <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> <p>Olet rekisteröimässä käyttäjän %1 palvelimelle. Rekisteröintiä ei voi peruuttaa ja hänen käyttäjänimeä ei voida muuttaa, ja käyttäjällä %1 on rekisteröitynä pääsy palvelimelle vaikka salasanaa vaihdettaisiin.</p><p>Tästä lähtien käyttäjänimi %1 tunnistetaan nykyisen sertifikaatin kanssa.</p><p>Haluatko varmasta rekisteröidä käyttäjän %1 tälle palvelimelle?</p> Kicking user %1 Poistamassa käyttäjä %1 Banning user %1 Estämässä käyttäjä %1 View comment on user %1 Käyttäjän %1 kommentti Message to channel %1 Viesti kanavalle %1 Connected. Yhdistetty. <li>Expected certificate digest (SHA-1): %1</li> Odotettava sertifikaatti digest (SHA-1): %11 Server presented a certificate which failed verification. Palvelimen esittämän sertifikaatin vahvistus epäonnistui. <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> %1 %2 Virheitä sertifikaatissa oli: %3 Haluatko hyväksyä sertifikaatin tästä huolimatta? (Sertifikaatti tullaan tallentamaan, jolloin sinulta ei kysytä tätä uudelleen). SSL Version mismatch SSL versio konflikti Server connection failed. <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>Kirjoita viesti kanavalle '%1' tähän</center> <center>Type message to user '%1' here</center> Type message to user '%1' here <center>Kirjoita viesti käyttäjälle '%1' tähän</center> Choose image file Valitse kuvatiedosto Failed to load image Kuvan lataus epäonnistui Could not open file for reading. Tiedostoa ei voida avata. Image format not recognized. Kuvan tiedostomuotoa ei tunneta. &User &Käyttäjä &Channel K&anava Use in conjunction with Whisper to. Global Shortcut Käytä kuiskaustoiminnon kanssa. This will switch the states of the in-game overlay. Global Shortcut Vaihtaa pelinaikaisen overlayn tilaa. Link Channel Global Shortcut Liitä kanava Cycle Transmit Mode Global Shortcut Vaihda lähetystilaa Set Transmit Mode to Push-To-Talk Global Shortcut Set Transmit Mode to Continuous Global Shortcut Set Transmit Mode to VAD Global Shortcut Send Text Message Global Shortcut Lähetä tekstiviesti Send Clipboard Text Message Global Shortcut Lähetä leikepöydän teksti viestinä This will send your Clipboard content to the channel you are currently in. Global Shortcut Tämä lähettää leikepöydän sisällön kanavalle, jolla olet tällä hetkellä. Continuous Jatkuva Voice Activity Puheaktivointi Push-to-Talk Puhepikanäppäin Mumble - Minimal View -- %1 Mumble - Minimalistinen tyyli -- %1 Cancel Peruuta Save Image As... Tallenna kuva nimellä... Save Image File Tallenna kuvatiedosto Could not save image: %1 Kuvaa ei voitu tallentaa: %1 Change your comment Muokkaa kommenttiasi Transmit Mode set to Voice Activity Lähetystila vaihdettu puheaktivoinniksi Transmit Mode set to Push-to-Talk Lähetystila vaihdettu puhepikanäppäimeksi <p>Connected users: %1/%2</p> <p>Yhdistetyt käyttäjät: %1/%2</p> UDP Statistics UDP statistiikat To Server Palvelimelle From Server Palvelimelta Good Hyvä Late Myöhässä Lost Hävikki Resync Uudelleensynkronisointi <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> <h2>Audio kaistanleveys</h2><p>Maksimi %1 kbit/s<br />Tämänhetkinen %2 kbit/s<br />Codec: %3</p> Mumble Server Information Tietoja Mumble palvelimesta &View Certificate &Näytä sertifikaatti Enter reason Kirjoita syy Sending message to %1 Viesti käyttäjälle %1 To %1: %2 -> %1: %2 Message to %1 Viesti käyttäjälle %1 Are you sure you want to reset the comment of user %1? Haluatko varmasti poistaa käyttäjän %1 kommentin? Are you sure you want to reset the avatar of user %1? Haluatko varmasti poistaa käyttäjän %1 kuvan? Are you sure you want to delete %1 and all its sub-channels? Haluatko varmasti poistaa %1 ja kaikki sen alikanavat? Sending message to channel %1 Viesti kanavalle %1 Message to tree %1 Viesti puuhun %1 To %1 (Tree): %2 (Tree) %1: %2 ->%1 (Puu): %2 Unmuted and undeafened. Mykistys ja hiljennys poistettu. Unmuted. Hiljennetty. Muted. Mykistetty. Muted and deafened. Mykistetty ja hiljennetty. Deafened. Hiljennetty. Undeafened. Hiljennys poistettu. Restart Mumble? Uudelleenkäynnistä Mumble? Some settings will only apply after a restart of Mumble. Restart Mumble now? Jotkin asetukset tulevat voimaan vasta uudelleenkäynnistyksen jälkeen. Uudelleenkäynnistä Mumble nyt? About Qt Tietoa Qt:sta SSL Verification failed: %1 SSL vahvistus epäonnistui: %1 <li>Server certificate digest (SHA-1): %1</li> Palvelimen sertifikaatti digest (SHA-1): %11 <b>WARNING:</b> The server presented a certificate that was different from the stored one. <b>VAROITUS:</b> Palvelin esitti sertifikaatin, joka on eri kuin tallennettu. This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. Mumblen nykyinen versio ei tue tätä palvelinta, koska palvelin käyttää vanhempaa salausmenetelmää. Server connection failed: %1. Palvelinyhteys epäonnistui: %1. Disconnected from server. Yhteys palvelimeen katkaistu. Invalid username Virheellinen käyttäjänimi You connected with an invalid username, please try another one. Olet yhdistämässä virheellisellä käyttäjänimellä. Anna uusi käyttäjänimi. Username in use Käyttäjänimi on jo käytössä That username is already in use, please try another username. Käyttäjänimi on jo käytössä, ole hyvä ja käytä toista käyttäjänimeä. Wrong certificate or password Väärä sertifikaatti tai salasana Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. Väärä sertifikaatti tai salasana rekisteröityneelle käyttäjälle. Jos olet varma, että käyttäjä on suojattu salasanalla, ole hyvä ja kokeile uudestaan. Muutoin keskeytä ja tarkista sertifikaattisi sekä käyttäjänimesi. Wrong password Väärä salasana Wrong server password for unregistered user account, please try again. Väärä palvelin salasana rekisteröimättömällä käyttäjätilillä, ole hyvä ja yritä uudelleen. Images (*.png *.jpg *.jpeg) Kuvat (*.png *.jpg *.jpeg) C&onfigure K&onfiguroi &Help Ap&ua Log Loki This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. Näyttää viimeisimmät tapahtumat. Palvelimelle yhdistäminen, virheilmoitukset ja informaatioviestit näkyvät tässä.<br />Muuttaaksesi mitkä viestit näkyvät tässä mene <b>asetukset</b> ja valitse <b>viestit</b> välilehti. &Quit Mumble &Sulje Mumble Closes the program Sulkee ohjelman Exits the application. Sulkee sovelluksen Ctrl+Q Ctrl+Q Open the server connection dialog Avaa palvelinyhteysikkuna &Disconnect &Katkaise yhteys Disconnect from server Katkaise palvelinyhteys Disconnects you from the server. Katkaisee yhteytesi palvelimeen. Show information about the server connection Näytä tietoa palvelinyhteydestä This will show extended information about the connection to the server. Näyttää lisätietoja palvelin yhteydestä. &Mute &Mykistä &Deafen &Hiljennä &Local Mute &Paikallinen mykistys Send a Text Message Lähetä tekstiviesti Sends a text message to another user. Lähettää tekstiviestin toiselle käyttäjälle. Add new channel Lisää uusi kanava This adds a new sub-channel to the currently selected channel. Lisää uuden alikanavan valitulle kanavalle. Remove channel Poista kanava This removes a channel and all sub-channels. Poistaa kanavan ja sen kaikki alikanavat. Edit Groups and ACL for channel Muokkaa kanavan ryhmiä ja ACL:ää This opens the Group and ACL dialog for the channel, to control permissions. Avaa kanavan ryhmä- ja ACL-muokkausikkuna hallitaksesi oikeuksia. &Link &Liitä Link your channel to another channel Liittää kanavasi toiseen kanavaan This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. Viestikenttä<br /> Kun olet kirjoittanut tähän ja painanut enter-näppäintä, kirjoitettu viesti lähetetään valitsemallesi käyttäjälle tai kanavalle. Ilman käyttäjän tai kanavan valintaa viesti lähetetään kanavalle jolla olet. Chatbar Viestikenttä Shows a dialog of registered servers, and also allows quick-connect. Näyttää ikkunan rekisteröidyistä palvelimista, ja mahdollistaa myös pikayhdistämisen. Kick user (with reason) Poista käyttäjä palvelimelta (Anna syy) Kick selected user off server. You'll be asked to specify a reason. Poistaa valitun käyttäjän palvelimelta. Sinun tulee myös antaa syy poistamiselle. Mute user Mykistä käyttäjä Mute or unmute user on server. Unmuting a deafened user will also undeafen them. Mykistä tai poista mykistys käyttäjältä palvelimella. Mykistyksen poistaminen hiljennetyltä käyttäjältä poistaa myös hiljennyksen. Kick and ban user (with reason) Estä käyttäjä palvelimelta (Anna syy) Kick and ban selected user from server. You'll be asked to specify a reason. Estää käyttäjän pääsyn palvelimelle. Sinun tulee myös antaa syy estämiselle. Deafen user Hiljennä käyttäjä Deafen or undeafen user on server. Deafening a user will also mute them. Hiljentää tai poistaa käyttäjän hiljennyksen palvelimella. Hiljennys myös mykistää. Mute user locally Mykistä käyttäjä paikallisesti Mute or unmute user locally. Use this on other users in the same room. Mykistää tai poistaa mykistyksen käyttäjältä. Käytä käyttäjiin, jotka ovat samassa huoneessa. This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. Liittää nykyisen kanavasi valittuun kanavaan. Jos kanavan käyttäjillä on puheoikeudet vastakkaisella kanavalla, pystyvät he kuulemaan toisensa kanavien läpi. Tämä on pysyvä liitos, joka kestää kunnes manuaalisesti poistettu tai palvelin käynnistetään uudelleen. Katso myös pikanäppäimistä liittämisen pikanäppäin. &Unlink Channel &Poista liitos Unlink your channel from another channel Poistaa kanavaliitoksen kanavalta. This unlinks your current channel from the selected channel. Poistaa kanavaliitoksen nykyisen ja valitun kanavan väliltä. Unlinks your channel from all linked channels. Poistaa nykyisen kanavan kaikki kanavaliitokset. This unlinks your current channel (not the selected one) from all linked channels. Poistaa nykyisen kanavan kaikki kanavaliitokset (ei koske valittua kanavaa). &Reset %Nollaa Reset audio preprocessor Nollaa äänen esiprosessori This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. Nollaa audion esiprosessorin, sisältäen melun vähennyksen, automaattisen vahvistuksen ja äänialueen havainnoinnin. Jos jokin väliaikaisesti huonontaa ääniympäristöä (kuten mikrofonin tiputtaminen), käytä tätä esiprosessorin uudelleen sopeutumisen ajan välttämiseen. &Mute Self &Mykistä itsesi Mute yourself Mykistä itsesi Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. Mykistää sinut tai poistaa mykistyksesi. Mykistettynä et lähetä dataa palvelimelle. Mykistyksen poisto poistaa myös hiljennyksen jos olet myös hiljennettynä. &Deafen Self &Hiljennä itsesi Deafen yourself Hiljennä itsesi Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. Hiljentää itsesi tai poistaa hiljennyksen. Hiljennettynä et kuule mitään. Hiljennys myös mykistää. &Text-To-Speech &Teksti-puheeksi Toggle Text-To-Speech Käytä Teksti-puheeksi -toimintoa Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. Ottaa käyttöön tai poistaa käytöstä teksti-puheeksi -toiminnon. Vain viestit jotka on valittu luettavaksi asetuksissa luetaan. Display audio statistics Näytä äänistatistiikat Pops up a small dialog with information about your current audio input. Avaa uuden ikkunan, joka sisältää tietoja tämänhetkisestä äänensyötöstä. Forcibly unlink plugin Pakota liitännäisen poistaminen This forces the current plugin to unlink, which is handy if it is reading completely wrong data. Pakottaa poistamaan nykyisen liitännäisen, mikä on hyödyllistä mikäli liitännäinen lukee täysin väärää dataa. Configure Mumble Konfiguroi Mumble Allows you to change most settings for Mumble. Sallii Mumblen asetusten muokkaamisen. Start the audio configuration wizard Avaa äänikonfiguroinnin avustaja This will guide you through the process of configuring your audio hardware. Avustaa äänilaitteittesi konfiguroinnissa. &What's This? &Selostus Enter What's This? mode Siirry Selostus-tilaan Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. Siirtää sinut Selostus-tilaan ja muuttaa kursorisi kysymysmerkiksi. Tässä tilassa painaessasi napista, valikkotoiminnosta tai ikkunan alueesta saat tarkemman määritelmän siitä. Information about Mumble Tietoa Mumblesta Shows a small dialog with information and license for Mumble. Näyttää tietoja Mumblesta ja sen lisensseistä. Information about Speex Tietoa Speexistä Shows a small dialog with information about Speex. Antaa tietoa Speexistä. Information about Qt Tietoa Qt:sta Shows a small dialog with information about Qt. Näyttää tietoa Qt:sta. Check for &Updates Tarkista &päivitykset Check for new version of Mumble Tarkista Mumblen päivitykset Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. Tarkistaa Mumblen kotisivuilta, onko uutta versiota saatavilla. Mikäli uusi versio löytyy, ilmoitetaan sen latausosoite. Sends a text message to all users in a channel. Lähettää viestin kaikille kanavan käyttäjille. Configure certificates for strong authentication Muokkaa vahvan tunnistaumisen sertifikaatteja. This starts the wizard for creating, importing and exporting certificates for authentication against servers. Aloittaa avustajan sertifikaattien luontiin, tuontiin ja vientiin. Sertifikaatteja käytetään tunnistautumiseen palvelimille. Register user on server Rekisteröi käyttäjä palvelimella This will permanently register the user on the server. Toiminto rekisteröi käyttäjän pysyvästi palvelimelle. Add &Friend Lisää &kaveriksi Adds a user as your friend. Lisää käyttäjän kaveriksi. This will add the user as a friend, so you can recognize him on this and other servers. Lisää käyttäjän kaveriksesi, jolloin voit tunnistaa hänet tällä ja muilla palvelimilla. &Remove Friend &Poista kavereista Removes a user from your friends. Poistaa käyttäjän kavereistasi. This will remove a user from your friends list. Poistaa käyttäjän kaverilistaltasi. &Update Friend &Päivitä kaveri Update name of your friend. Päivitä kaverisi nimi. Your friend uses a different name than what is in your database. This will update the name. Kaverisi käyttää eri nimeä kuin tietokannassasi on. Tämä päivittää hänen käyttäjänimensä. Edit registered users list Muokkaa rekisteröityneiden käyttäjien listaa This opens the editor for registered users, which allow you to change their name or unregister them. Avaa muokkaustyökalun rekisteröidyille käyttäjille, jossa pystyt muuttamaan heidän nimiään ja poistamaan heidän rekisteröitymisen. Add or remove text-based access tokens Lisää tai poista tekstipohjaisia pääsyavaimia &Minimal View &Miniminäkymä Toggle minimal window modes Kytke miniminäkymä päälle tai pois päältä This will toggle minimal mode, where the log window and menu is hidden. Muuttaa ikkunan miniminäkymään piilottaen loki-ikkunan ja valikon. You muted and deafened %1. Mykistit ja hiljensit käyttäjän %1. You unmuted and undeafened %1. Poistit käyttäjän %1 mykistyksen ja hiljennyksen. You undeafened %1. Poistit käyttäjän %1 hiljennyksen. You suppressed %1. Vaimensit käyttäjän %1. %1 muted and deafened by %2. %2 mykisti ja hiljensi käyttäjän %1. %1 unmuted and undeafened by %2. %2 poisti käyttäjän %1 mykistyksen ja hiljennyksen. %1 undeafened by %2. %2 poisti käyttäjän %1 hiljennyksen. %1 suppressed by %2. %2 vaimensi käyttäjän %1. %1 moved to %2. %1 siirtyi kanavalle %2. %1 moved to %2 by %3. %3 siirsi käyttäjän %1 kanavalle %2. %1 moved in from %2 by %3. %3 siirsi käyttäjän %1 kanavallesi kanavalta %2. %1 is now muted and deafened. %1 on nyt mykistetty ja hiljennetty. Your account information can not be verified currently. Please try again later Käyttäjätietojasi ei voida vahvistaa tällä hetkellä. Yritä myöhemmin uudelleen Welcome message: %1 Tervetuloviesti: %1 Mumble: %1 Mumble: %1 You were denied %1 privileges in %2. Sinulla ei ole %1 oikeutta kanavalle %2. %3 was denied %1 privileges in %2. Käyttäjän %3 %1 oikeus poistettiin kanavalta %2. Denied: Cannot modify SuperUser. Virhe: Ylläpitäjän oikeuksia ei voi muokata. Denied: Invalid channel name. Virhe: Virheellinen kanavan nimi. Denied: Text message too long. Virhe: Viesti on liian pitkä. Denied: Operation not permitted in temporary channel. Virhe: Komento ei ole sallitu tilapäiskanavalla. You need a certificate to perform this operation. Tarvitset sertifikaatin tähän toimintoon. %1 does not have a certificate. %1 ei omaa sertifikaattia. Invalid username: %1. Kelpaamaton käyttäjänimi: %1. Invalid username. Kelpaamaton käyttäjänimi. Channel is full. Kanava on täynnä. Channel nesting limit reached. Maksimimäärä alikanavien tasoja saavutettu. Channel count limit reached. Need to delete channels before creating new ones. Permission denied. Ei käyttöoikeutta toiminnolle. %1 connected and entered channel. %1 connected. %1 saapui. %1 is now muted. %1 on nyt mykistetty. %1 is now unmuted. %1 ei ole enää mykistetty. Recording started Nauhoitus aloitettu Recording stopped Nauhoitus lopetettu %1 started recording. %1 aloitti nauhoituksen. %1 stopped recording. %1 lopetti nauhoituksen. You revoked your priority speaker status. Luovuit Etuoikeutetun Puhujan statuksesta. You assumed priority speaker status. Otit käyttöön Etuoikeutetun Puhujan statuksen. %1 revoked your priority speaker status. %1 poisti Etuoikeutetun Puhujan statuksesi. %1 gave you priority speaker status. %1 antoi sinulle Etuoikeutetun Puhujan statuksen. You revoked priority speaker status for %1. Poistit käyttäjältä %1 Etuoikeutetun Puhujan statuksen. You gave priority speaker status to %1. Annoit Etuoikeutetun Puhujan statuksen käyttäjälle %1. %1 revoked own priority speaker status. %1 luopui Etuoikeutetun Puhujan statuksestaan. %1 assumed priority speaker status. %1 otti käyttöön Etuoikeutetun Puhujan statuksen. %1 revoked priority speaker status for %2. %1 poisti käyttäjältä %2 Etuoikeutetun Puhujan statuksen. %1 gave priority speaker status to %2. %1 antoi Etuoikeutetun Puhujan statuksen käyttäjälle %2. You were unmuted and undeafened by %1. %1 poisti sinun mykistyksen ja hiljennyksen. You were muted by %1. %1 mykisti sinut. You were undeafened by %1. %1 poisti sinun hiljennyksen. You were suppressed. You were suppressed by %1. Sinut vaimennettiin. You were unsuppressed. Vaimennuksesi poistettiin. You were unsuppressed by %1. %1 poisti vaimennuksesi. You joined %1. You moved %1 to %2. Siirsit %1 kanavalle %2. %1 is recording %1 nauhoittaa %1 renamed to %2 by %3. %1 uudelleennimetty %2 käyttäjän %3 toimesta. %1 disconnected. Käyttäjän %1 yhteys katkesi. Server message from Palvelin (Tree) (Puu) (Channel) (Kanava) (Private) (Yksityinen) %2%1: %3 %2%1: %3 Failed to load Opus, it will not be available for audio encoding/decoding. The server requests minimum client version %1 Palvelin vaatii ohjelmaversion olevan vähintään %1 The server requests positional audio be enabled. Palvelin pyytää kytkemään sijainninmukaisen audion päälle. The server requests positional audio be disabled. Palvelin ei salli sijainninmukaisen audion käyttöä. The server requests Push-to-Talk be enabled. Palvelin pyytää Puhepikanäppäimen käyttöä. The server requests Push-to-Talk be disabled. Palvelin ei salli Puhepikanäppäimen käyttöä. You were unmuted by %1. %1 poisti sinun mykistyksen. You muted %1. Mykistit käyttäjän %1. You unsuppressed %1. Poistit käyttäjän %1 vaimennuksen. You unmuted %1. Poistit käyttäjän %1 mykistyksen. %1 muted by %2. %2 mykisti käyttäjän %1. %1 unsuppressed by %2. %2 poisti käyttäjän %1 vaimennuksen. %1 unmuted by %2. %2 poisti käyttäjän %1 mykistyksen. Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. Vastaavia CELT koodekkeja ei löydy muilta käyttäjiltä. Et pysty puhumaan kaikille käyttäjille. You were muted and deafened by %1. You were deafened by %1. %1 mykisti ja hiljensi sinut. You were kicked from the server by %1: %2. %1 poisti sinut palvelimelta: %2. %3 was kicked from the server by %1: %2. %1 poisti käyttäjän %3 palvelimelta: %2. You were kicked and banned from the server by %1: %2. %1 esti pääsysi palvelimelle: %2. %3 was kicked and banned from the server by %1: %2. %1 esti käyttäjän %3 pääsyn palvelimelle: %2. You were moved to %1 by %2. %2 siirsi sinut kanavalle %1. %1 entered channel. %1 liittyi kanavalle. Server connection rejected: %1. Palvelinyhteys hylättiin: %1. Denied: %1. Estetty: %1 %1 renamed to %2. %1 vaihtoi nimensä %2. %1 left channel and disconnected. %1 lähti kanavalta ja katkaisi yhteyden. Message from %1 Viesti käyttäjältä %1 You have User Dragging set to "Do Nothing" so the user wasn't moved. Käyttäjän vetäminen -asetuksesi on asetettu muotoon "Älä tee mitään", joten käyttäjää ei liikutettu. You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. Kanavien vetäminen -asetuksesi on asetettu "Älä tee mitään", joten kanavaa ei liikutettu. Unknown Channel Drag mode in UserModel::dropMimeData. UserModel::dropMimeData sisältää lukemattoman kanavien vetämistilan. Remote controlling Mumble: Ohjataan Mumblea etänä: Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) -jn, --jackname Set custom Jack client name. --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status Invocation Kutsu Error: No RPC command specified Virhe: RPC-komentoa ei määritelty RPC RPC Welcome to Mumble. Tervetuloa Mumbleen. Skipping version check in debug mode. Version tarkistus ohitetaan debug-tilassa. Hide Frame Piilota kehys Toggle showing frame on minimal window Piilota kehys miniminäkymässä This will toggle whether the minimal window should have a frame for moving and resizing. Piilottaa ikkunan kehyksen minimitilassa. Tässä tilassa ikkunaa ei voi liikuttaa eikä sen kokoa voi muuttaa. &Unlink All &Poista kaikki liitokset Reset the comment of the selected user. Poistaa valitun käyttäjän kommentin. &Join Channel &Liity kanavalle View comment in editor Katso kommentti muokkaustyökalussa. Query server for connection information for user Tiedustele käyttäjän yhteystietoja palvelimelta S&erver &Palvelin &Self &Minä &Unlink Plugins &Erota liitännäinen Register yourself on the server Rekisteröidy palvelimelle Change your avatar image on this server Vaihda käyttäjäkuvasi tällä palvelimella &Remove Avatar &Poista käyttäjäkuva Remove currently defined avatar image. Poista tämänhetkinen käyttäjäkuva. Icon Toolbar Työkalukuvakkeet Change your own comment Vaihda oma kommenttisi Recording Nauhoitus Priority Speaker Etuoikeutettu puhuja &Copy URL &Kopioi URL-osoite Copies a link to this channel to the clipboard. Kopioi kanavan osoitteen leikepöydälle, Ignore Messages Estä viestit Locally ignore user's text chat messages. Estä käyttäjää lähettämästä viestejä sinulle. Silently drops all text messages from the user. Estää käyttäjää lähettämästä sinulle viestejä eikä ilmoita siitä vastapuolelle. Edit ban list on server Muokkaa palvelimen estettyjä käyttäjiä This lets you edit the server-side IP ban list. Muokkaa palvelimen estettyjen IP-osoitteiden listaa. &Filter on/off &Suodatin päällä/pois Toggle the channel filter (Ctrl+F) Ota kanavasuodatin käyttöön (Ctrl+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. Vaihtaa kanavasuodattimen tilaa. Oletusasetuksena kaikki tyhjät kanavat suodatetaan. Voit lisätä suodatukseen lisää kanavia kanavien alivalikosta. Ctrl+F Ctrl+F &Hide Channel when Filtering &Piilota kanava suodattaessa Reset the avatar of the selected user. Poistaa valitun käyttäjän käyttäjäkuva. Locally adjust the user's speech volume. Muokkaa käyttäjän äänenvoimakkuutta paikallisesti. Opens a dialog with a volume slider. Use this on other users in the same room. Avaa dialogin, mistä äänenvoimakkuutta voi muokata. Käytä tätä muihin samalla kanavalla oleviin käyttäjiin. &Developer &Kehittäjä &Hide Mumble &Piilota Mumble Hides the main Mumble window. Piilottaa Mumblen päänäkymän. Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. Piilottaa Mumblen ikkunan. Palauta se klikkaamalla iconia tehtäväpalkissasi tai käynnistämällä mumble uudelleen. Show the Developer Console Näytä kehittäjäkonsoli Shows the Mumble Developer Console, where Mumble's log output can be inspected. Näyttää Mumblen kehittäjäkonsolin, mistä lokitietoja voi selata. &Connect... &Ban list... &Information... &Kick... &Ban... Local Volume Adjustment... Send &Message... &Add... &Remove... &Edit... Audio S&tatistics... &Settings... &Audio Wizard... Developer &Console... &About... About &Speex... About &Qt... &Certificate Wizard... &Register... Registered &Users... Change &Avatar... &Access Tokens... Reset &Comment... Reset &Avatar... View Comment... &Change Comment... R&egister... Show Shows the main Mumble window. Manual Manual Mumble Positional Audio Manuaalinen sijainninmukainen audio Position Paikka X X Y Y Z Z m m Heading Suunta Azimuth Sivukulma Elevation Korkeus ° ° Meta data Metatieto Context Konteksti Identity Identiteetti Set Joukko State Tila Linked Linkitetyt Activated Aktivoidut Unhinge Vapauta NetworkConfig Network Verkko Updates are mandatory when using snapshot releases. Päivitykset ovat pakollisia käyttäessä testijulkaisuja. Connection Yhteys Use TCP compatibility mode Use TCP compatability mode Käytä TCP yhteensopivuus tilaa <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). <b>Siirry TCP yhteensopivuustilaan</b>.<br />Siirtää Mumblen käyttämään vain TCP-protokollaa tiedon välittämiseen palvelimelle. Protokolla kasvattaa pakettikokoa, jolloin pakettihävikki aiheuttaa huomattavia katkoja puheessa. Tilaa tulisi käyttää vain jos et voi käyttää oletusarvoja (jotka ovat UDP äänelle ja TCP hallinnalle). Reconnect when disconnected Yhdistää uudelleen yhteyden katketessa <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. <b>Yhdistää uudelleen yhteyden katketessa</b>.<br />Mikäli yhteys palvelimeen katkeaa, Mumble yrittää automaattisesti yhdistää palvelimeen 10 sekunnin jälkeen. Reconnect automatically Uudelleenyhdistä automaattisesti Proxy Välityspalvelin Type Tyyppi Type of proxy to connect through Käytetyn välityspalvelimen tyyppi Direct connection Suora yhteys HTTP(S) proxy HTTP(S) välityspalvelin SOCKS5 proxy SOCKS5 välityspalvelin Hostname Isäntänimi Hostname of the proxy Välityspalvelimen isäntänimi Force TCP mode Pakota TCP-tila Enable QoS to prioritize packets Ota QoS käyttöön pakettien priorisointiin This will enable QoS, which will attempt to prioritize voice packets over other traffic. Ottaa QoS -toiminnon käyttöön, joka pyrkii priorisoimaan äänipaketteja muun verkkoliikenteen yli. Use Quality of Service Käytä Quality of Service -toimintoa Don't send certificate to server and don't save passwords. (Not saved). Älä lähetä sertifikaattia palvelimelle, tai tallenna salasanoja. (Ei tallenneta). <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> <b>Piilottaa identiteettitiedot ohjelmalta.</b><p>Ohjelma ei tunnistaudu sertifikaatilla vaikka se olisi olemassa, eikä myöskään tallenna salasanoja yhteyksille. Tämä asetus on pääasiassa testikäyttöön ja valintaa ei tulla muistamaan ohjelman sulkemisen jälkeen. Suppress certificate and password storage Piilota sertifikaatti ja salasanojen säilö <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>Välityspalvelimen tyyppi. </b><br />Tämä kierrättää kaikki Mumblen ulkoyhteydet välityspalvelimen kautta. Huomio: välityspalvelimen tunnelointi pakottaa Mumblen käyttämään TCP-yhteystilaa, joka johtaa datan lähetykseen hallintakanavan kautta. <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. <b>Välityspalvelimen isäntänimi.</b><br />Tämä kenttä määrittää välityspalvelimen isäntänimen, jonka kautta haluat tunneloida verkkoliikenteen. Port Portti Port number of the proxy Välityspalvelimen porttinumero <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. <b>Välityspalvelimen porttinumero</b><br />Portti johon välityspalvelin odottaa yhteyttä. Username Käyttäjänimi Username for proxy authentication Käyttäjänimi välityspalvelimen tunnistautumiseen <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>Käyttäjänimi välityspalvelimen tunnistautumiseen.</b><br />Määrittää käyttäjänimen jolla tunnistaudut välityspalvelimelle. Mikäli välityspalvelin ei käytä tunnistautumista tai haluat yhdistää anonyyminä, jätä kenttä tyhjäksi. Password Salasana Password for proxy authentication Välityspalvelimen tunnistautumisen salasana <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>Välityspalvelimen tunnistautumisen salasana.</b><br />Salasana jolla tunnistaudut välityspalvelimelle. Jätä tyhjäksi, mikäli välityspalvelin ei käytä tunnistautumista tai haluat yhdistää anonyyminä. Mumble services Mumble palvelut Check for new releases of Mumble automatically. Tarkista automaattisesti Mumblen uudet julkaisut. This will check for new releases of Mumble every time you start the program, and notify you if one is available. Ilmoittaa Mumblen uusista versioista ohjelman käynnistyessä. Check for application updates on startup Tarkista ohjelman päivitykset käynnistymisen yhteydessä Check for new releases of plugins automatically. Tarkista liitännäisten uudet versiot automaattisesti. This will check for new releases of plugins every time you start the program, and download them automatically. Tarkistaa liitännäisten uudet versiot ohjelman käynnistyksen yhteydessä ja lataa ne automaattisesti. <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. <b>Lähetä nimettömiä tilastotietoja.</b><br />Mumblella on pieni kehitystiimi ja sellaisenaan sen tulee kohdistaa kehitys sinne, missä sitä tarvitaan eniten. Lähettämällä tilastoja autat projektia päättämään mihin kehitys kohdistetaan. Submit anonymous statistics to the Mumble project Lähetä nimettömiä tilastotietoja Mumble-projektille Submit anonymous statistics Lähetä nimettömiä tilastotietoja Reconnect to last used server when starting Mumble Yhdistä uudelleen viimeksi käytettyyn palvelimeen Mumblen käynnistyessä. Reconnect to last server on startup Yhdistä viimeisimpään palvelimeen käynnistymisen yhteydessä Download plugin and overlay updates on startup Lataa liitännäisten ja overlayn päivitykset ohjelman käynnistymisen yhteydessä Privacy Prevent OS information being sent to Mumble servers and web servers <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. Do not send OS information to Mumble servers and web servers Overlay Silent Hiljaa Talking Puhuminen Whisper Kuiskaus Shout Huuto Channel Kanava Failed to create communication with overlay at %2: %1. No overlay will be available. Overlayn luominen epäonnistui kohteessa %2: %1. Overlayta ei ole saatavissa. OverlayClient Filter Näytä Only talking Vain puhujat Talking and recently active Puhujat ja äskettäin puhuneet All in current channel Kaikki nykyisellä kanavalla All in linked channels Kaikki liitetyillä kanavilla Always show yourself Näytä aina itsesi Configure recently active time (%1 seconds)... Määritä kauanko käyttäjä näkyy aktiivisena puhumisen jälkeen (%1 sekunttia)... Columns Sarakkeet Sort Järjestä Alphabetically Aakkosittain Last state change Tilanmuutos Edit... Muokkaa... Reset Zoom Nollaa zoomaus Configure recently active time Äskettäin aktiivi ajan muuttaminen Amount of seconds users remain active after talking: Sekuntien määrä jonka käyttäjä pysyy aktiivisena puhumisen jälkeen: OverlayConfig To move the users, drag the little red dot. Liikuttaaksesi käyttäjiä vedä pienestä punaisesta pisteestä. To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. Käyttäjien koon muuttamiseen käytä hiiren rullaa käyttäjän päällä. For more options, right click a user. For more options, rightclick a user. Saadaksesi lisävalintoja, paina käyttäjää hiiren oikealla napilla. Launcher Filter Overlay Overlay Choose executable Valitse suoritettava Choose application Valitse ohjelma Choose path Load Overlay Presets Lataa Overlay asetelma Mumble overlay presets (*.mumblelay) Mumblen overlay asetelma (*.mumblelay) Save Overlay Presets Tallenna overlay:n asettelu Options Valinnat Enable overlay. Käytä Overlayta. Enable Overlay Käytä Overlayta This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. Valinta määrittää onko Overlay käytössä vai ei. Valinta vaikuttaa vain ohjelman käynnistyessä, joten varmista että Mumble on päällä ja tämä valinta valittu ennen ohjelman käynnistämistä.<br />Ota huomioon että jos käynnistät Mumblen ohjelman käynnistymisen jälkeen tai poistat overlayn käytöstä ohjelman ollessa käynnissä, ainoa tapa ottaa overlay käyttöön on käynnistää ohjelma uudelleen. Layout Asettelu Blacklist Musta lista Whitelist Valkoinen lista Uninstall Overlay Overlayn asennuksen poisto Overlay Installation Overlay:n asennus Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. Mumble on havainnut että Mumble Overlay ei ole asennettu. Paina alapuolen napista asentaaksesi Overlay. Install Mumble Overlay Asenna Mumble Overlay Overlay Upgrade Overlay päivitys Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. Mumble on havainnut Overlay:ta tukevien tiedostojen olevan vanhentuneita. Paina alapuolen napista päivittääksesi Overlay:n tiedostot viimeisimpään versioon. Upgrade Mumble Overlay Päivitä Mumble Overlay Display a frame counter in the overlay Näytä FPS-lukema Overlay:ssa Show FPS counter Näytä FPS Load an overlay preset from file Lataa Overlay asetelma tiedostosta Load… Lataa... Save your overlay settings to file Tallenna Overlay asetukset tiedostoon Save… Tallenna... Set the overlay font. Valitsee Overlay:n fontin. Set the overlay text color. Valitsee Overlay:n tekstin värin. Color Väri Remove Poista Font Fontti FPS and Clock Display FPS ja kellonäkymä Display a clock in the overlay showing the current local time (system time). Näytä paikallisen ajan kello Overlayssa (järjestelmän aika). Show Clock Näytä kello Overlay Exceptions Overlay Exception Mode Allowed launchers Add Allowed programs Allowed paths Blacklisted programs OverlayEditor State Tila User is not talking Käyttäjä ei puhu Passive Passiivinen User is talking in your channel or a linked channel Käyttäjä puhuu kanavallasi tai liitetyllä kanavalla Talking Puheessa User is whispering to you privately Käyttäjä kuiskaa sinulle yksityisesti Private Whisper Yksityinen kuiskaus User is shouting to your channel Käyttäjä huutaa kanavallesi Channel Whisper Kanavakuiskaus Zoom Zoomaus Zoom Factor Zoomauksen kerroin Enabled Elements Käyttöönotetut elementit User avatar, chosen by each user Käyttäjäkuva, jokaisen käyttäjän valitsema Avatar Käyttäjäkuva User's name Käyttäjän nimi Username Käyttäjänimi Name of user's channel, if outside your current channel Käyttäjän kanavan nimi, mikäli käyttäjä on eri kanavalla. Channel Kanava Muted or deafened Mykistetty tai hiljennetty Mute state Mykistetty tila Bounding box, automatically shrunk to minimum size to contain all visible elements Reunalaatikko, automaattisesti kutistettu pienimpään kokoon säilyttäen kaikki visuaaliset elementit Bounding box Reunalaatikko Overlay Editor Overlay muokkaaja OverlayEditorScene Layout preset Asetelman esiasetus Large square avatar Suuri neliö käyttäjäkuva Avatar and Name Käyttäjäkuva ja Nimi User Opacity Käyttäjän läpinäkyvyys %1% %1% Object Opacity Kohteen Läpinäkyvyys Alignment Sijoitus Left Vasen Center Keskellä Right Oikea Top Yläosa Bottom Alaosa Color... Väri... Font... Fontti... Bounding box Reunalaatikko Pen width Reunan leveys Padding Täyte Pen color Reunan väri Fill color Täyteväri Pick pen color Valitse reunan väri Pick fill color Valitse täyttöväri Pick color Valitse väri Pick font Valitse fontti PluginConfig Plugins Liitännäiset Plugin has no configure function. Liitännäisellä ei ole muokkausmahdollisuutta. Plugin has no about function. Liitännäisellä ei ole tieto funktiota. Options Valinnat Enable plugins and transmit positional information Ota käyttöön liitännäiset ja välitä sijantitietoa This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. Sallii liitännäisten hakea pelinsisäisen sijainnin tuetuissa peleissä ja lähettää sen äänipaketeissa. Tässä tilassa muut käyttäjät kuulevat sinut pelin sisällä suunnasta, jossa olet heihin suhteutettuna. Link to Game and Transmit Position Yhdistä peliin ja välitä sijainti Reloads all plugins Lataa kaikki liitännäiset uudelleen This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. Tämä skannaa ja lataa uudelleen kaikki liitännäiset. Käytä tätä jos lisäsit tai muutit jotain liitännäiskirjastossa. &Reload plugins &Lataa liitännäiset uudelleen Information about plugin Tietoa liitännäisestä This shows a small information message about the plugin. Tämä antaa tietoa liitännäisestä. &About &Tietoa Show configuration page of plugin Näytä liitännäisen muokkaussivu This shows the configuration page of the plugin, if any. Tämä näyttää liitännäisen muokkaussivun, jos sellainen on. &Configure &Konfiguroi Name Nimi Enabled Käytössä Plugins Skipping plugin update in debug mode. Liitännäispäivitys ohitetaan debug-tilassa. Downloaded new or updated plugin to %1. Ladattiin uusi tai päivitettiin liitännäinnen %1. Failed to install new plugin to %1. Uuden liitännäisen asennus epäonnistui %1. %1 lost link. %1 yhteys kadotettu. %1 linked. %1 yhdistetty. PortAudioSystem Default Device Oletuslaite PulseAudioSystem Default Input Oletus Sisääntulo Default Output Oletus Ulostulo QApplication Failed to restart mumble Uudelleenkäynnistys epäonnistui Mumble failed to restart itself. Please restart it manually. Mumblen uudelleenkäynnistys epäonnistui. Käynnistä Mumble uudestaan manuaalisesti. RichTextEditor Failed to load image Kuvan lataus epäonnistui Image file too large to embed in document. Please use images smaller than %1 kB. Kuvatiedosto liian suuri upotettavaksi dokumenttiin. Käytä pienempää tiedostokokoa kuin %1 kB. Message is too long. Viesti on liian pitkä. Display Näytä Source Text Lähdeteksti &Bold &Lihavoi Ctrl+B Ctrl+B &Italic &Kursivoi Italic Kursivoi Ctrl+I Ctrl+I Underline Alleviivaa Ctrl+U Ctrl+U Color Väri Insert Link Lisää Linkki Ctrl+L Ctrl+L Insert Image Lisää kuva RichTextEditorLink Add Link Lisää Linkki URL URL Text Teksti ServerHandler Unable to resolve hostname Server is not responding to TCP pings Palvelin ei vastaa TCP-pingeihin UDP packets cannot be sent to or received from the server. Switching to TCP mode. UDP paketteja ei voida lähettää tai vastaanottaa palvelimelta. Siirrytään TCP tilaan. UDP packets cannot be sent to the server. Switching to TCP mode. UDP paketteja ei voida lähettää palvelimelle. Siirrytään TCP tilaan. UDP packets cannot be received from the server. Switching to TCP mode. UDP paketteja ei voida vastaanottaa palvelimelta. Siirrytään TCP tilaan. UDP packets can be sent to and received from the server. Switching back to UDP mode. UDP paketteja voidaan lähettää ja vastaanottaa palvelimelta. Siirrytään takaisin UDP tilaan. Connection timed out Yhteys aikakatkaistiin ServerView Favorite Suosikki LAN LAN Public Internet Julkinen Internet Unknown Africa Afrikka Asia Aasia North America Pohjois-Amerikka South America Etelä-Amerikka Europe Eurooppa Oceania Oseania ShortcutActionWidget Unassigned Määrittämätön ShortcutDelegate On Päällä Off Pois päältä Toggle Valinta Unassigned Määrittämätön ShortcutKeyWidget Press Shortcut Paina Pikanäppäintä ShortcutTargetDialog Root Juuri Parent Yläkanava Current Nykyinen Subchannel #%1 Alikanava #%1 ShortcutTargetWidget ... ... , , Root Juuri Parent Yläkanava Current Nykyinen Subchannel #%1 Alikanava #%1 Invalid Virheellinen Empty <Empty> Tyhjä ShortcutToggleWidget Off Pois päältä Toggle Valinta On Päällä TextMessage Enter text Syötä teksti If checked the message is recursively sent to all subchannels Valittuna teksti lähetetään rekursiivisesti kaikille alakanaville Send recursively to subchannels Lähetä rekursiivisesti alakanaville Tokens Empty Token Tyhjä avain Mumble - Access Tokens Mumble - Pääsyavaimet List of access tokens on current server Lista kaikista pääsyavaimista nykyisellä palvelimella <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. <b>Tämä on nykyisen palvelimen pääsyavainlista, jota voi muokata .</b> <br /> Pääsyavain on merkkijonoketju, jota voidaan käyttää salasanana yksinkertaiseen pääsyoikeuden hallintaan kanaville. Mumble muistaa käyttämäsi pääsyavaimet ja lähettää ne palvelimelle automaattisesti, joten sinun ei tarvitse syöttää näitä uudelleen joka kerta. Add a token Lisää avain &Add &Lisää Remove a token Poista avain &Remove &Poista UserEdit Registered Users Rekisteröidyt käyttäjät Remove Poista Rename Nimeä uudelleen Who are you looking for? Ketä olet etsimässä? Days Päivää Weeks Viikkoa Months Kuukautta Years Vuotta Inactive for Toimettomana Registered users: %n account(s) Rekisteröityneet käyttäjät: %n käyttäjä(ä)Rekisteröityneet käyttäjät: %n käyttäjä(ä) UserInformation User Information Käyttäjätiedot Connection Information Yhteystiedot Version Versio OS Käyttöjärjestelmä Certificate Sertifikaatti IP Address IP-osoite CELT Versions CELT Versiot Details... Lisätietoja... Ping Statistics Vasteajan tilastot Pings received Vasteaikojen lukumäärä Average ping Keskimääräinen vasteaika TCP (Control) TCP (Hallinta) UDP (Voice) UDP (Puhe) UDP Network statistics UDP Verkkoyhteys tilastot Good Hyvä Late Myöhässä Lost Hävikki Resync Uudelleensynkronoi From Client Ohjelmalta To Client Ohjelmalle Connection time Yhteysaika %1w %1w %1d %1d %1h %1h %1m %1m %1s %1s , , %1 (%2) %1.%2.%3 (%4) %1 (%2) Supported Tuettu Not Supported Ei tuettu Not Reported Ei raportoitu %1 online (%2 idle) %1 paikalla (%2 toimeton) %1 online %1 paikalla %1 kbit/s %1 kbit/s Bandwidth GroupBox Kaistanleveys Bandwidth Label Kaistanleveys Ping deviation Vasteajan poikkeama UserListModel Nick Nimimerkki Inactive days Toimettomia päiviä Last channel Viimeisin kanava Last seen: %1 Nähty viimeksi: %1 Never Ei koskaan Channel ID: %1 UserLocalVolumeDialog Local volume for other users Paikallinen äänenvoimakkuus muille käyttäjille <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. <b>Muokkaa muiden käyttäjien äänenvoimakkuutta paikallisesti</b><br />Mumble tukee muiden käyttäjien äänenvoimakkuuden muokkaamista paikallisesti. Adjusting local volume for %1 Muokataan käyttäjän %1 äänenvoimakkuutta dB dB <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> <html><head/><body><p>Käytä liukusäädintä tai tekstikenttää muuttaaksesi käyttäjän äänenvoimakkuutta.</p><p><span style="font-weight:600;">Huomio!</span></p><p>Liian suuri äänenvoimakkuus voi vaurioittaa kuuloa pysyvästi. Se voi myös lisätä taustamelua.</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: Palvelimelle yhdistänyt käyttäjä. Kuvake käyttäjän vieressä ilmaisee onko käyttäjä puhumassa vai ei. Talking to your channel. Puhuu kanavallesi. Shouting directly to your channel. Whispering directly to your channel. Huutaa kanavallesi. Whispering directly to you. Kuiskaa sinulle. Not talking. Ei puheessa. This is a channel on the server. The icon indicates the state of the channel: Tämä on kanava palvelimella. Kuvake ilmaisee kanavan tilaa: Your current channel. Tämänhetkinen kanavasi. A channel that is linked with your channel. Linked channels can talk to each other. Kanava joka on liitetty kanavaasi. Liitettyjen kanavien välillä pystyy keskustelemaan. A channel on the server that you are not linked to. Palvelimen kanava johon et ole liitetty. This shows the flags the user has on the server, if any: Näyttää käyttäjän merkinnät palvelimella, mikäli niitä on: On your friend list Käyttäjä on kaverilistallasi Authenticated user Autentikoitu käyttäjä Muted (manually muted by self) Mykistetty(Itse mykistänyt itsensä) Muted (manually muted by admin) Mykistetty(Ylläpitäjän toimesta) Muted (not allowed to speak in current channel) Mykistetty(Kanava kohtainen mykistys) Muted (muted by you, only on your machine) Mykistetty(Olet henkilökohtaisesti mykistänyt) Muted (push-to-mute) Deafened (by self) Hiljennetty (itse) Deafened (by admin) Hiljennetty (ylläpitäjä) User has a new comment set (click to show) Käyttäjällä on uusi kommenti. (Paina nähdäksesi) User has a comment set, which you've already seen. (click to show) Käyttäjällä on kommentti, jonka olet jo nähnyt.(Paina nähdäksesi) Ignoring Text Messages Viestien hylkääminen This shows the flags the channel has, if any: Näyttää kanavan merkinnät, mikäli niitä on: Channel has a new comment set (click to show) Kanavalla on uusi kommentti (paina nähdäksesi) Channel has a comment set, which you've already seen. (click to show) Kanavalla on kommentti, jonka olet jo nähnyt (paina nähdäksesi) Channel will be hidden when filtering is enabled Kanava piilotetaan kun suodatin on käytössä. Name Nimi Flags Merkintä Are you sure you want to drag this user? Haluatko varmasti siirtää tämän käyttäjän? Are you sure you want to drag this channel? Oletko varma, että haluat siirtää tämän kanavan? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. Liikettä ei voi suorittaa automaattisesti. Palauta numeeriset lajitteluindikaattorit alkutilaan tai säädä manuaalisesti. VersionCheck Upgrade Mumble Päivitä Mumble A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? Mumblesta on löydetty uusi versio ja se on automaattisesti ladattu. On suositeltavaa, että päivität uusimpaan versioon tai vaihdat viimeisimpään vakaaseen versioon. Haluatko käynnistää asennuksen nyt? Failed to launch snapshot installer. Testijulkaisun asennuksen käynnistys epäonnistui. Corrupt download of new version detected. Automatically removed. Lataustiedosto havaittiin virheelliseksi. Tiedosto poistettiin automaattisesti. Downloading new snapshot from %1 to %2 Ladataan uutta testijulkaisua. Vanha versio %1 ja uusi versio %2 Failed to write new version to disk. Failed to write new version to disc. Uuden version kirjoittaminen levylle epäonnistui. Mumble failed to retrieve version information from the central server. Mumble epäonnistui tarkistamaan versiotietoja palvelimelta. ViewCert Certificate Chain Details Sertifikaattiketjun tiedot. Certificate chain Sertifikaattiketju Certificate details Sertifikaatin tiedot Common Name Yleisnimi Organization Organisaatio Subunit Yksikkö Country Maa Locality Sijainti State Osavaltio Valid from: %1 Voimassa: %1 Valid to: %1 Voimassa: %1 saakka Serial: %1 Sarjanumero: %1 Public Key: %1 bits %2 Julkinen Avain: %1 bittiä %2 RSA RSA DSA DSA Digest (SHA-1): %1 Digest (SHA-1): %1 Digest (SHA-256): %1 Digest (SHA-256): %1 Email: %1 Sähköposti: %1 DNS: %1 DNS: %1 Issued by: Myöntäjä: Unit Name Yksikön nimi VoiceRecorder Recorder failed to create directory '%1' Nauhuri epäonnistui luomaan kansion '%1' Recorder failed to open file '%1' Nauhuri epäonnistui avaamaan tiedoston '%1' .wav - Uncompressed .wav - Pakkaamaton .ogg (Vorbis) - Compressed .ogg (Vorbis) - Pakattu .au - Uncompressed .au - Pakkaamaton .flac - Lossless compressed .flac - Häviöttömästi pakattu VoiceRecorderDialog Recorder Nauhuri Control Hallinta 00:00:00 00:00:00 &Start &Aloita S&top &Lopeta Mode Tila Multichannel Monikanava Output Ulostulo Output format Ääniformaatti Target directory Kohdehakemisto Filename Tiedostonimi &Browse... &Selaa... Valid variables are: Sallitut muuttujat ovat: Inserts the user's name Sisällyttää käyttäjän nimen Inserts the current date Sisällyttää päivämäärän Inserts the current time Sisällyttää kellonajan Inserts the hostname Sisällyttää isäntänimen Recorder still running Nauhuri on yhä käynnissä Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? Nauhurin sulkeminen ilman pysäyttämistä ei tallenna tallennetta. Haluatko silti sulkea nauhurin? Unable to start recording. Not connected to a server. Äänityksen käynnistäminen epäonnistui. Et ole yhdistettynä palvelimeen. The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. Palvelin johon olet juuri nyt yhdistetty on versio 1.2.2 tai vanhempi. Palvelinversiota 1.2.3 vanhemilla palvelimilla ei voida äänittää yksityisyyssyistä. Ota yhteyttä palvelintarjoajaan jos haluat lisätietoja. There is already a recorder active for this server. Palvelimella on jo aktiivinen nauhoitus käynnissä. Please select a recording format. Valitse käytettävä tallennusformaatti. Stopping Lopetetaan Select target directory Valitse kohdehakemisto Downmix Alasmiksaus WASAPIInput Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone. WASAPISystem Default Device Oletuslaite qwPTTButtonWidget Mumble PTT Mumble PPN Push to talk Paina puhuaksesi mumble-1.3.4/src/mumble/mumble_ja.ts0000664000175000017500000143750514010707274017234 0ustar builderbuilder ACLEditor Deny 禁止 Allow 許可 Allow %1 %1を許可する Deny %1 %1を禁止する Mumble - Add channel Mumble - チャンネル追加 Default server value Failed: Invalid channel 失敗: 無効なチャンネル Mumble - Edit %1 Mumble - %1 の編集 ID: %1 ID: %1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 %1に特権を付与します。特権の許可と禁止の両方が設定されている場合、禁止になります。<br />%2 Channel must have a name チャンネルには必ず名前を設定してください This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 %1から特権を剥奪します。特権の許可と禁止の両方が設定されている場合、禁止になります。<br />%2 Dialog ダイアログ Name チャンネル名 Enter the channel name here. チャンネル名をここに入力してください。 Description 説明 Password パスワード Enter the channel password here. チャンネルに参加するためのパスワードをここに入力してください。 Check to create a temporary channel. 一時チャンネルを作る場合はチェックしてください。 Temporary 一時チャンネルとして設定する <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>ポジション</b><br /> この値を設定することで、このチャンネルがチャンネルツリー上で並ぶ順番を変更することができます。より高い<i>ポジション</i>値を持つチャンネルは常により低い値を持つチャンネルよりも下に表示されます。また、2つのチャンネルの<i>ポジション</i>値が等しいなら、それらのチャンネル名について辞書順で並べ替えられます。 Position ポジション &Groups グループ(&G) Group グループ List of groups グループリスト Remove selected group 選択されたグループを削除 Remove 削除 Inherit group members from parent 親からグループメンバーを継承する Inherit 継承 Make group inheritable to sub-channels サブチャンネルに対してグループを継承可能にする Inheritable 継承可 Group was inherited from parent channel 親チャンネルから継承したグループ Inherited 継承済み Members メンバー Add 追加 Add member to group グループにメンバーを追加 Remove member from group グループからメンバーを削除 &ACL &ACL Active ACLs ACLを有効にする List of entries 項目リスト Inherit ACL of parent? 親チャンネルのACLを継承しますか? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. これは親チャンネルのチェーンへのACLが適用されるか否かに関係なく設定されます。親の"サブチャンネルに適用する"にチェックされた項目だけが継承されます。 Inherit ACLs ACLを継承する Move entry up 項目を上に移動 This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. リスト内の項目を上に動かします。項目が適切に評価されると、ユーザに影響する権限が変更される場合があります。継承した項目より上に動かすことは出来ません。もし本当に必要なら継承された項目を複製する必要があります。 &Up 上へ(&U) Move entry down 項目を下に移動 This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. リスト内の項目を下に動かします。項目が適切に評価されると、ユーザに影響する権限が変更される場合があります。 &Down 下へ(&D) Add new entry 新しい項目を追加 This adds a new entry, initially set with no permissions and applying to all. 新たに項目を作成します。初期状態はパーミッションが無く、全てに適用されます。 &Add 追加(&A) Remove entry 項目を削除 This removes the currently selected entry. 選択されている項目を削除します。 &Remove 削除(&R) Context コンテキスト Entry should apply to this channel. Entry should apply to this channel 入力項目はこのチャンネルに適用されます。 This makes the entry apply to this channel. 項目をこのチャンネルに適用します。 Applies to this channel このチャンネルに適用する Entry should apply to sub-channels. 入力項目はサブチャンネルに適用されます。 Add new group 新しいグループを追加 <b>Add</b><br/> Add a new group. <b>追加</b><br /> 新しいグループを追加する。 Inherited members 継承済みメンバ Contains the list of members added to the group by this channel. このチャンネルのグループに追加されたメンバのリスト。 Contains a list of members whose group membership will not be inherited from the parent channel. 親チャンネルから継承されないグループのメンバーのリスト。 Contains the list of members inherited by other channels. 他のチャンネルから継承されたメンバのリストです。 Type in the name of a user you wish to add to the group and click Add. グループに追加したいユーザ名をタイプして追加をクリックしてください。 Type in the name of a user you wish to remove from the group and click Add. グループから削除したいユーザ名を入力して追加をクリックしてください。 Exclude 除外 Excluded members 除外メンバ This makes the entry apply to sub-channels of this channel. 項目をこのチャンネルのサブチャンネルに適用します。 Applies to sub-channels サブチャンネルに適用する Permissions 権限 User/Group ユーザ/グループ Group this entry applies to この項目を適用するグループ User ID ユーザID User this entry applies to この項目を適用するユーザ This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. この項目がどのユーザに適用されるかを制御します。検索するにはユーザ名を入力してEnterキーを押してください。 &Properties プロパティ(&P) <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>チャンネル名</b><br />このフィールドにチャンネル名を入力してください。チャンネル名は接続しているサーバの制限に従う必要があります。 <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>一時チャンネルとして設定する</b><br /> チェックしてチャンネルを作ると一時としてマークされます。最後に残っていたユーザがチャンネルから離れるとサーバによって自動的にそのチャンネルが削除されます。 <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>グループ</b><br /> このチャンネルで現在定義されている全てのグループです。新しいグループを作るには、グループ名を入力してEnterキーを押してください。 <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>削除</b><br />現在選択されているグループを削除します。もし、グループが継承されているなら、それはリストから削除されません。しかし、グループについての全ての局所情報はクリアされます。 <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>継承</b><br />そのグループが親チャンネルで<i>継承可能</i>と設定されているなら、そのグループの全てのメンバを継承します。 <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>継承可能</b><br />このグループがサブチャンネルに継承可能であることを意味します。グループが継承不可能であれば、サブチャンネルは同じ名前の新しいグループを自由に作ることが可能です。 <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>継承済み</b>これはグループが親チャンネルから継承されたことを意味します。このフラグはただの情報なので編集できません。 <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>メンバ</b><br /> このリストは現在のチャンネルのグループに追加された全てのメンバーを含みます。より高い階層のチャンネルツリーから継承されたメンバは含まないことに注意してください。それらのメンバは<i>継承済みメンバー</i>のリストで確認できます。より低い階層のチャンネルでこのリストを継承させたくない場合は<i>継承可能</i>のチェックを外すか、手動で<i>除外メンバ</i>のリストにメンバを追加してください。 <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>除外メンバ</b><br /> 親チャンネルに継承されないグループのメンバーのリストを含む。 <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. <b>継承済みメンバ</b><br /> 現在のチャンネルで継承済みのメンバのリストです。より高い階層のチャンネルからの継承を防ぐには<i>継承</i>のチェックを外してください。 This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. この項目がどのユーザのグループに適用されるかを制御します。グループはそのエントリが使用されるチャンネルのコンテキストそして評価されます。たとえば、Root チャンネル上のデフォルトのACL は <i>書き込み</i>権限を<i>admin</i>グループに与えています。このエントリは、もしチャンネルで継承済みでなければ、たとえそのACLに由来するチャンネルの<i>admin</i>グループに属していなくても<i>admin</i>グループがそのチャンネルに所属するならユーザに書き込み権限を与えます。グループの名前が ! で始まっていれば、そのメンバは否定されます。そして ~ で始まるなら そのチャンネルで有効なACLよりもそのチャンネルのACLが定義された方が優先されます。グループの名前が # で始まる場合は、それはアクセストークンとして解釈されます。ユーザはアクセストークンのリストの中に # の後に続く文字列を持っている必要があります。これはとても非認証ユーザにたいして非常に単純なシンプルなパスワードアクセスの方法として使えます。グループの名前が $ で始まる場合、それは $ に続く文字列がユーザの証明書のハッシュにマッチする場合です。特別な定義済みグループは次のとおりです。<br/><b>all</b> - すべてにマッチ。<br/><b>auth</b> - 認証済みのすべてのユーザにマッチ。<br /><b>sub,a,b,c</b> - サブチャンネル <i>a</i> <i>b</i><i>c</i>最小で<i>a</i>個の共通の両親を持ち、チェーンの下側へ<i>b</i>個から<i>c個</i>の間のサブチャンネルのユーザにマッチします。この項目についてのより多くのドキュメントを見るには公式サイトを確認してください。<b>in</b> - 現在のチャンネルにいるすべてのユーザにマッチ。(これは <i>sub,0,0,0</i>の簡易的な表記です。)<b>out</b> - 現在のチャンネルの外にいるすべてのユーザにマッチ。(これは <i>!sub,0,0,0</i>の簡易的な表記です。) エントリはユーザかグループのどちらかに適用され、両方には適用されません。 <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. <b>パスワード</b><br>このフィールドで簡単にチャンネルのパスワードを設定・変更できます。基礎としてMumbleのアクセストークンの機能を使っています。より細やかで協力なアクセス制御をするには、ACLとグループを使ってください。 This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. このチャンネルで有効な項目を全て表示します。親チャンネルから継承した項目はイタリック(斜字)体で表示されます。<br />ACLは上から順に評価されます。つまり、リストの順位を下げる事は優先度が上がる事を意味します。 ID of the channel. チャンネルの ID Maximum Users Maximum number of users allowed in the channel <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. This is the sort order for the channel. ALSAAudioInput Default ALSA Card デフォルトALSAカード Opening chosen ALSA Input failed: %1 選択されたALSA入力のオープンに失敗しました: %1 ALSAAudioOutput Default ALSA Card デフォルトALSAカード Opening chosen ALSA Output failed: %1 選択されたALSA出力のオープンに失敗しました: %1 ASIOConfig %1 (version %2) %1 (バージョン %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz ASIO Initialization failed: %1 ASIOの初期化に失敗しました: %1 Failed to instantiate ASIO driver ASIOドライバのインスタンス化に失敗 ASIO ASIO Device selection デバイス選択 Device デバイス Device to use for microphone マイクに使用するデバイス This chooses what device to query. You still need to actually query the device and select which channels to use. 問い合わせるデバイスを選択します。あなたはまだデバイスを実際に問い合わせ、使用するチャンネルを選ぶ必要があります。 Query selected device 選択されたデバイスの問い合わせを行います This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. チャンネルで選択されたデバイスを問い合わせます。多くのASIOドライバーが極端に不安定であることに注意してください。それらに問い合わせをすることはアプリケーションやシステムのクラッシュを引き起こすかもしれません。 &Query 問い合わせ(&Q) Configure selected device 選択されたデバイスの設定を行います This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. 選択されたデバイスの設定を行います。多くのASIOドライバーが極端に不安定であることに注意してください。それらに問い合わせをすることはアプリケーションやシステムのクラッシュを引き起こすかもしれません。 &Configure 設定(&C) Capabilities ケーパビリティ Driver name ドライバー名 Buffer size バッファサイズ This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. ASIOのための入力チャンネルを設定します。少なくとも1つのチャンネルをマイクとスピーカーとして選んでください。<i>マイク</i> はあなたのマイクが接続されているところで、<i>スピーカー</i>は"聞くもの"を試してみるチャンネルです。Sound Blaster Audigy 2 ZS の例ではスピーカーが"Mix L" and "Mix R"の時、マイクを"Mic L"にするのが良い選択のひとつです。 Configure input channels 入力チャネルを設定します Channels チャンネル Microphone マイク <- <- -> -> Unused 未使用 Speakers スピーカー ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. ASIOを使用するためには少なくとも1つのマイクと1つのスピーカーを選択しなければなりません。もしマイクサンプリングが必要なだけなら DirectSound を使用してください。 Opening selected ASIO device failed. No input will be done. 選択されたASIOドライバを開くのに失敗しました。入力は行われません。 AboutDialog About Mumble Mumbleについて <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble Mumbleについて(&A) &License ライセンス(&L) A&uthors &Third-Party Licenses OK OK AudioInput Interface インターフェース System システム Input method for audio 音声入力方法 <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>音声の入力方法です。</b><br />ほとんどの場合DirectSoundで問題ありません。 Device デバイス Input device for audio 音声入力方法 <b>This is the input device to use for audio.</b> <b>音声のための入力デバイスです。</b> Transmission 伝送方式 &Transmit 送信(&T) When to transmit your speech 発言を送信するタイミング <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. <b>発言を送信するタイミングを設定します。</b><br /><i>常に有効</i> - 常時音声入力を受け付けます<br /><i>声で有効化</i> - はっきりとしゃべっている時に受け付けます。<br /><i>プッシュ・トゥ・トーク</i> - <i>ショートカットキー</i>で設定したキーを押している間音声入力を受け付けます。 DoublePush Time 二重押し時間 If you press the PTT key twice in this time it will get locked. プッシュ・トゥ・トーク キーを2回押すとロックされます。 <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. <b>2度押し時間</b><br />もしあなたがプッシュ・トゥ・トークキーを2回、ここで設定した感覚の間に押したなら、キーはロックされます。Mumble は あなたがプッシュ・トゥ・トークをアンロックするために一回以上キーを押すまで転送状態のままです。 Reset audio cue to default オーディオキューをデフォルトにリセット <b>Reset</b><br/>Reset the paths for the files to their default. <b>リセット</b><br />デフォルトにファイルへのパスをリセットします。 Browse for on audio file オン時の音声ファイルを参照 Browse for off audio file オフ時の音声ファイルを参照 Off オフ On オン Preview the audio cues オーディオキューをプレビュー Use SNR based speech detection S/N比に基づく発言認識を使用 Signal to Noise S/N比 <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. <b>発言認識に信号の強さを使用するかを設定します。</b>このモードにすると、入力信号そのものの強さが発言の検出に使用されます。 Amplitude 信号の強さ Voice &Hold 送信継続時間(&H) How long to keep transmitting after silence 音声が無くなった後、どれくらい送信を続けるか Silence Below 非発言のしきい値 <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. <b>声を検出するための基準値を設定します。</b>手動で調整するためには音声統計ウインドウを一緒にご利用ください。"非発言しきい値"以下の値は常に発言していない状態と見なされ、"発言しきい値"より上の値は発言と見なされます。これらの間の値は既に話し中であれば発言と判断されますが、新たな発言であると判断する材料にはなりません。 Speech Above 発言しきい値 Signal values above this count as voice 発言と判定される信号値のしきい値 Compression 圧縮 &Quality 音質(&Q) Quality of compression (peak bandwidth) 圧縮品質(ピーク帯域幅) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. <b>圧縮品質を設定します。</b><br />送出される音声のためにどれくらいの帯域幅を使えるか決定します。 Audio per packet パケットあたりの音声長 How many audio frames to send per packet 1送信パケットあたりの音声フレームの長さ <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>送信1パケットに含む音声フレームの長さを選択します。</b><br />これを大きくするとあなたの音声の遅延が大きくなりますが、必要とするネットワーク帯域幅は下がります。 <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). <b>音声の送信に使用される帯域幅の最大値を示します。</b><br />これは、あなたのPCから送出される帯域の最も大きな値を表示しています。Audioビットレートは音声データ単体の最大ビットレート(VBR使用時)を表します。 Positionは位置情報のために使用されるビットレート表し、Overheadは独自のフレーミングとIPパケットヘッダ(IP と UDP はこのOverheadの90%)を表しています。 Audio Processing 音声処理 Noise Suppression ノイズ抑制 Noise suppression ノイズ抑制 <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. <b>この設定は多くのノイズを抑制します。</b><br />より大きい値を設定すると、より多くのノイズが抑制されます。 Maximum amplification of input sound 音声入力の最大増幅量 <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. <b>音声入力の最大増幅量です。</b><br />Mumbleは圧縮を行う前に入力量を正常化します。この設定は、どれくらい音量を増幅させるかを決定します。<br />実際の音量はその時の発言パターンによって変化しますが、ここで指定された音量を上回ることはありません。<br />音声統計で<i>マイクの音量</i>レベルが常に100%近くに達しているなら、この値を2.0くらいにしたくなるかも知れません。しかし、(大部分の人がそうだと思いますが)100%に届かないなら、この値をより高くしてください。<br />あなたが非常に穏やかに話している時に<i>マイク音量 * 増幅値 >= 100</i> となるのが理想的です。<br /><br />この値を最大にすることに実害はありませんが、だからといって適当に最大値に合わせてしまうと他の会話まで拾ってしまうので気をつけてください。 Current speech detection chance 現在の発言検出見込み Cancel echo from speakers スピーカからのエコーをキャンセルします Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. あなたのスピーカからのエコーをキャンセルすることができます。ミックスはCPU負荷が低いが、スピーカから一定の大きさの音を出していて、マイクから一定の距離を保っている場合にしかうまく働きません。マルチチャンネル エコーキャンセルはよりよいエコーキャンセルを提供するが、CPU負荷がミックスより高いです。 Disabled 無効 <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>S/N比を使用して発言認識を設定します。</b><br />このモードでは、入力は明らかな信号に似た何かに分析され、その信号の明快さは、音声検出ののために使用されます。 <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>現在の発言検出設定を表します。</b><br />設定ダイアログか音声ウィザードから設定を変更することができます。 Signal values below this count as silence 発言していないと判定される信号値のしきい値 Maximum bandwidth used for sending audio 音声を送信するために使う最大帯域 Use Amplitude based speech detection 振幅による発言検出を使う <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). <b>発言の転送をどれだけ継続するべきかを設定します。</b><br />あなたの声が発言中に破綻する(あなたの名前の次にある音声アイコンがすぐに点滅する場合)ならにこの値を高く設置してください。 Exclusive mode 排他モード <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>これによりデバイスを排他モードで開きます。</b><br />他のアプリケーションがデバイスを使えなくなります。 Exclusive 排他モード R&eset リセット(&R) &Browse... 参照(&B)... B&rowse... 参照(&R)... &Preview プレビュー(&P) <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. <b>プレビュー</b><br />現在のオンのときのサウンドを再生しそのあとにオフのときのサウンドを再生する。 Displays an always on top window with a push to talk button in it プッシュ・トゥ・トークボタンを表示するウィンドウを常に前面で表示します Display push to talk window プッシュ・トゥ・トークウィンドウ Misc その他 Audible audio cue when starting or stopping to transmit 転送を開始、終了するときに聞こえる音声キュー <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. この機能は転送時に音声キューを有効にします。</b><br />これを設定すると転送の開始時と、終了時に短いオーディオビープが聞こえるようになります。 Audio cue 音声キュー Gets played when starting to transmit 転送を開始するときに再生します Gets played when stopping to transmit 転送を停止するときに再生します Hold Time 待機時間 Time the microphone stays open after the PTT key is released PTTキーを話した後にマイクがオープである時間 Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) サーバの最大ネットワーク帯域は%1kbit/sしかありません。音声品質は自動的に%2kbit/s (%3 ms)に調整されます Max. Amplification 増幅の最大値 Idle action アイドル時の動作 minutes do 後に nothing 何もしない deafen 聴取禁止 mute 発言禁止 after Echo Cancellation Mixed echo cancellation Multichannel echo cancellation The idle action will be reversed upon any key or mouse button input Undo Idle action upon activity Apply RNNoise's noise suppression filter. <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. RNNoise Audio input AudioInputDialog Continuous 常に有効 Voice Activity 声で有効化 Push To Talk プッシュ・トゥ・トーク Audio Input 音声入力 %1 ms %1 ms Off オフ %1 s %1 s %1 kb/s %1 kb/s -%1 dB -%1 dB %1 kbit/s (Audio %2, Position %4, Overhead %3) %1kbit/s (音声 %2, 位置 %4, オーバヘッド %3) AudioOutput Interface インターフェース System システム Output method for audio 音声出力方法 <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>音声の出力方法です。</b><br />ほとんどの場合DirectSoundで問題ありません。 Device デバイス Output device for audio 音声のための出力デバイス <b>This is the output device to use for audio.</b> <b>これは音声を出力するために使うデバイスです。</b> Positional Audio 位置音響 Audio Output 音声出力 Default &Jitter Buffer ジッタバッファのデフォルト(&J) Safety margin for jitter buffer ジッタバッファの安全マージン <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. <b>ジッタバッファのための最小の安全マージンを設定します。</b><br />全ての受信音声は一時保存されます。ジッタバッファは、現在のネットワークの状態に合わせて一時保存の領域を小さくしようとし続けるので、レイテンシーは可能な限り小さくなります。この設定は、使用する最小のバッファサイズを決定します。聞こえてくる会話の出だしが不安定なら、この値を増やしてください。 Minimum distance to user before sound volume decreases 音が小さくなる前のユーザへの最小距離 This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. サウンドの計算に使う最小距離を設定します。少なくともこの距離だけ離れていれば、他のプレイヤーの音声は減衰しません。 This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. 音の計算のために最大距離の設定します。 これよりより遠くに離れているとき、他のプレーヤーのスピーチボリュームはこれ以上減少しないでしょう。 <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. <b>ループバックテストモードの一つが有効になります。</b><br /><i>なし</i> - ループバックしない<br /><i>ローカル</i> - ローカルなサーバをエミュレートします。<br /><i>サーバ</i> - サーバにループバックを要求します。<br />ループバックが有効になっている間、他のプレイヤーはあなたの声を聞くことが出来ないのでご注意ください。この設定はアプリケーション終了時に保存されません。 Volume 音量 Volume of incoming speech 受信音声の音量 <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. <b>受信する音声の音量を調整します。</b><br />ここでは、音量を下げる事のみが可能です。増やす事は出来ません。 Output Delay 出力猶予 Amount of data to buffer バッファデータ量 The connected "speakers" are actually headphones The connected "speakers" are actually headphones. 接続している "出力機器" はヘッドホンです Factor for sound volume decrease ボリューム減少の割合 Bloom ブルーム Factor for sound volume increase ボリューム増加の割合 How much should sound volume increase for sources that are really close? 入力ソースの近さによってどのくらいボリュームを上げるべきか? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. スピーカーを接続しておらず、ヘッドホンだけであることを確認してください。ヘッドホンはあなたからまっすぐ右と左に位置しているのに対し、スピーカーは一般的にあなたの正面に位置しているため、これは重要になります。 This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. 出力バッファにおけるプリバッファの量を設定します。いろいろな値で試してみて、急に不安定にならない一番小さな値に設定してください。 Headphones ヘッドホン Minimum Distance 最小距離 Maximum Distance 最大距離 Maximum distance, beyond which speech volume won't decrease 音声のボリュームが減少しない最大の距離 Minimum Volume 最小音量 What should the volume be at the maximum distance? ボリュームは最大距離がどのくらいであるべきか? Loopback Test ループバックテスト Delay Variance レイテンシー調整 Variance in packet latency パケットレイテンシーの変動値 <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>ループバックテストの為のパケットレイテンシーの値を調整します。</b><br />音声のネットワーク経路は、ほとんどの場合若干のレイテンシーを含んでいます。 この設定はループバックモードでのテスト時、レイテンシーの値を変更できるようにします。例えば、この値を15msにすると、20-35msのレイテンシーや80ms-95msのレイテンシーを持ったネットワークをエミュレートするでしょう。 国内のネット接続ではおよそ5msくらいのレイテンシーがあります。 Packet Loss パケットロス Packet loss for loopback mode ループバックモードでのパケットロス <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% <b>ループバックモードでのパケットロスを設定します。</b><br />これはパケットロスの割合です。送信方向の帯域幅のピークに達するか、ネットワーク接続に問題がない限り、これは0%のはずです &Loopback ループバック(&L) Desired loopback mode 使用したいループバックモード Attenuate applications by... 他のアプリの音量を減衰... Attenuation of other applications during speech 会話中の他のアプリケーションの減衰 <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. <b>会話中に他のアプリケーションの音量の減衰させます</b><br />Mumbleは、相手が発言しているときや、発言を相手に伝えている間に他のアプリケーションの音量を減らすことをサポートします。 この機能が有効になっているなら、アプリケーションが減衰されます。 If checked Mumble lowers the volume of other applications while other users talk チェックすると他のユーザが発言しているとき、Mumble は他のアプリケーションの音量を下げます <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. <b>他のユーザが発言しているときに他のアプリケーションの音量の減衰させます</b><br />Mumbleは、相手が発言しているときや、発言を相手に伝えている間に他のアプリケーションの音量を減らすことをサポートします。 この機能が有効になっているなら、他のユーザが発言しているときアプリケーションが減衰されます。 while other users talk 他のユーザの発言中 If checked Mumble lowers the volume of other applications while you talk チェックするとあなたが発言しているとき、Mumble は他のアプリケーションの音量を下げます <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. <b>あなたが発言しているときに他のアプリケーションの音量の減衰させます</b><br />Mumbleは、相手が発言しているときや、発言を相手に伝えている間に他のアプリケーションの音量を減らすことをサポートします。 この機能が有効になっているなら、あなたが発言しているときアプリケーションが減衰されます。 while you talk あなたの発言中 Exclusive mode, not recommended. 排他モード、推奨されません。 <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>これによりデバイスを排他モードで開きます。</b><br />他のアプリケーションがデバイスを使えなくなります。 Exclusive 排他モード Priority Speaker 優先スピーカー If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. チェックすると、優先スピーカーが話している時に Mumble は他のユーザーのボリュームを下げます。 <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. Attenuate other users while talking as Priority Speaker. Advanced Attenuation Options If checked, Mumble will only attenuate applications that are using the same output source as Mumble <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. Only attenuate applications using the same output device If checked, PulseAudio loopback modules will be attenuated <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. Attenuate PulseAudio loopback modules Audio output AudioOutputDialog None なし Local ローカル Server サーバ Audio Output 音声出力 %1 ms %1 ms %1 % %1 m AudioOutputSample Choose sound file サウンドファイルを選択してください Invalid sound file 無効なサウンドファイル The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. ファイル '%1' はMumble で使用できません。対応するフォーマットとエンコードのファイルを選択してください。 AudioStats >1000 ms >1000ms >1000ms Audio Statistics 音声統計 Input Levels 入力レベル Peak microphone level 最大マイクレベル Peak power in last frame 直近フレームでの最大の強さ This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. 直近のフレーム(20 ms)での最大の強さを表示します。そしてこれは、通常"入力の強さ"として表示されている測定値と同じものです。これは無視して<b>マイクの強さ</b>を見るようにしてください。こちらの方がより安定していて外部要素に影響されにくいです。 Peak speaker level 最大スピーカーレベル This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. 直近のフレーム(20 ms)におけるスピーカーの最大音量を表示します。スピーカの設定を変更して多重チャンネルサンプリング法(例えばASIO)を使用していない限り、これは0になります。セットアップでそのような構成をしているのに、ほかのプログラムが音声を再生している間も0を表示しているなら、セットアップは正しく動いていません。 Peak clean level 最大クリーンレベル This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. 直近のフレーム(20 ms)における全ての処理後の最大音量を表示します。あなたが話していないとき、これは -96 dBであるのが理想です。しかし実際には音楽スタジオでも -60 dB、あなたの環境では -20 dB くらい出れば良い方でしょう。あなたが話している時は、-5 から -10 dB のあたりまで上がります。<br />もしあなたがエコーキャンセルを使っていて、話してもいないのに -15 dB まで上がるようならセットアップは失敗しています。この場合、反響によってほかのプレイヤーを悩ますことになります。 Signal Analysis 信号分析 Microphone power マイクの強さ How close the current input level is to ideal 入力レベルの理想値までの差 This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. 現在の入力音量が理想の値からどれくらい離れているかを表します。マイクの音量を調整するためには、録音ボリュームを調整するプログラムを開いて、話している間この値を見てください。<br /><b>noob(訳注: 初心者の事)にやられて怒り狂っているときのように大声で叫んでください。</b><br />この値が100%近くになるまで音量を調整してください。しかし100%を超えないように注意しましょう。もし超えてしまうとあなたの音声の一部が省略されて、音質が低下するでしょう。 Signal-To-Noise ratio S/N比 Signal-To-Noise ratio from the microphone マイクからのS/N比 This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. 直近のフレーム(20 ms)におけるマイクの信号対雑音比(S/N比)です。これは、声がノイズと比較してどれくらいはっきりしているかを表しています。<br />もしこの値が1.0以下なら、信号の中に声よりもノイズのほうが多くなっており、音質は低下しているでしょう。<br />この値に上限はありませんが、音楽スタジオでもなければ40-50を大きく上回るとは思わないでください。 Speech Probability 発言確率 Probability of speech 発言確率 This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). 直近のフレーム(20 ms)が発言であったり、環境ノイズ以外の音であった確率です。<br />声で有効化する送信方式はこの値が正しい事に依存します。この事による優れた点は話の途中は常に発言と見なされることです。問題は、単語と発言開始の間にある休止です。ため息と'h'で始まる単語を見分けるのは難しい事です。<br />これが太字になっていたら、Mumbleが現在送信中である事を表しています(接続中の場合)。 Configuration feedback 設定フィードバック Current audio bitrate 現在の音声ビットレート Bitrate of last frame 直近フレームのビットレート DoublePush interval 二重押しの間隔 Time between last two Push-To-Talk presses 直近2回のプッシュ・トゥ・トークの間隔 Speech Detection 発言検出 Current speech detection chance 現在の発言検出見込み <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>現在の発言検出設定を表します。</b><br />設定ダイアログか音声ウィザードから設定を変更することができます。 Signal and noise power spectrum 信号とノイズのパワースペクトル Power spectrum of input signal and noise estimate 入力信号とノイズ予想のパワースペクトル This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. 現在の入力信号(赤線)とノイズ予想(青線)のパワースペクトルを表します。<br />すべての振幅は判りやすい結果(各周波帯でノイズよりどれくらい多くの信号が存在するか)を提供するために30倍されます。<br />マイクの雑音状況を改善しようと微調整しているならば、多分に興味深いものとなるでしょう。良好な状態では、一番下に小さく揺れている青線だけがあるべきです。もし青線がグラフの中ほどより上にあるなら、あなたは深刻にノイズの多い環境にあると言えます。 Echo Analysis 反響分析 Weights of the echo canceller エコーキャンセラの重み This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. 下に向かっている時間と右に向かっている周波数でエコーキャンセラの重みを表示します。<br />理想的には、これは反響が全くない事を示す黒でなくてはなりません。普通は、反響が遅れる時間を表す青っぽい色の横縞が一つ以上あるでしょう。あなたは、重みがリアルタイムに更新されるのを見る事ができます。<br />反響しないものがない限り、ここでは何も有用なデータが得られない事に注意してください。安定した状態で何曲かの音楽を再生してください。<br />あなたは周波数領域における重みの実数または虚数の部分、もしくは計算された係数と位相の表示を選んで見ることができます。これらで最も役に立つのはおそらく係数です。係数とは反響の大きさであり、送信方向の信号が一定時間毎にどのくらい取り除かれているかを表します。他の表示は主にエコーキャンセラアルゴリズムを調整したい人にとって役に立ちます。<br />注意: 係数モードの時に全ての表示が大幅に変動する場合、エコーキャンセラは2つの入力源(スピーカーとマイク)の間にどんな相関関係も見出せていません。反響に非常に長い遅れがあるか、入力源のうち1つが誤って設定されているかのどちらかでしょう。 This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. 直近の圧縮されたフレーム(20 ms)における音声ビットレートです。VBRが品質を調整するので値は上下します。ピークビットレートを調整するには、設定ダイアログで調整できます。 AudioWizard Audio Tuning Wizard 音声調整ウィザード Introduction イントロダクション Welcome to the Mumble Audio Wizard Mumble 音声ウィザードへようこそ Finished 完了 Enjoy using Mumble Mumbleをお楽しみください Device selection デバイス選択 Selecting the input and output device to use with Mumble. Mumbleで使用する入力および出力のデバイスを選択します。 This is the device your microphone is connected to. あなたが接続しているデバイスです。 System システム Input method for audio 音声入力方法 <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>音声の入力方法です。</b><br />ほとんどの場合DirectSoundで問題ありません。 Device デバイス Input device to use 入力に使用するデバイス <b>Selects which sound card to use for audio input.</b> <b>音声の入力にどのサウンドカードを使用するか選択してください。</b> Cancel echo from headset or speakers ヘッドセットやスピーカからのエコーをキャンセル Use echo cancellation エコーキャンセルを使う This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. 出力音声のエコーキャンセルを有効にします。スピーカーとヘッドセットの両方に対して有効です。 This is the device your speakers or headphones are connected to. あなたのスピーカ(もしくはヘッドホン)が接続しているデバイスです。 Output method for audio 音声の出力方法 <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>音声の出力方法です。</b><br />ほとんどの場合DirectSoundで問題ありません。 Output device to use 出力に使用するデバイス <b>Selects which sound card to use for audio Output.</b> <b>音声の出力にどのサウンドカードを使用するか選択してください。</b> Enable positional audio 位置音響を有効にする Allows positioning of sound Allows positioning of sound. 音声の位置 <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> <p> これはMumbleの音声を調整するためのウィザードです。サウンドカードの入力レベルとMumbleでの音声処理のパラメータを正しく設定するお手伝いをします。 </p> <p> ウィザードが動作中の間、音声はあなたが聞けるようPC上だけで完結し、サーバには送信されませんのでご注意ください。 </p> Input Device 入力デバイス Output Device 出力デバイス This allows Mumble to use positional audio to place voices. 声の位置を定めるために位置音響を使えるようにします。 <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> <p> 遅延を最小限に保つためには、サウンドカード上で音声のバッファを出来るだけ小さくすることが重要です。しかし、多くのサウンドカードが要求してくるバッファは、実際に動作可能な大きさよりかなり小さなものです。結局、この値を設定するにはいろいろ試してみるほかありません。 </p> <p> 周波数が変わる1つの音色が聞こえますでしょうか。音が途切れたり不安定に<b>ならない</b>一番小さな値まで下のスライダーを動かしてください。なお、音声経路の認識率を向上するため、このテストの間ローカルエコーは使えなくなっている事をお忘れなく。 </p> Amount of data to buffer バッファデータ量 This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. 出力バッファにおけるプリバッファの量を設定します。いろいろな値で試してみて、急に不安定にならない一番小さな値に設定してください。 <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> <p> ボリュームコントロールパネルを開き、録音設定画面に移動しましょう。そして、マイクが選択されていて、音量が最大になっている事を確認してください。もし"マイクブースト"を有効にするオプションがあるなら、それもチェックされているか確認してください。 </p> <p> イライラしていたり、興奮していたりする時のように大声で話してみてください。話している間、下にあるバーが青と緑の区域のなるべく赤に近い場所に留まるまでサウンドコントロールパネルの音量を下げてください。(赤い区域には<b>入らない</b>ようにしましょう) </p> Positional Audio 位置音響 Adjusting attenuation of positional audio. 位置音響の減衰効果を調整します。 <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> <p> Mumbleは、いくつかのゲームにおいてゲーム内での他プレイヤーの位置に対応した位置音響をサポートします。他プレイヤーの位置によって、方向と距離をシミュレートして音量が変化します。このシミュレーションはお使いのオペレーティング・システムでスピーカーが正しく設定されていることが前提となります。そのテストはここで行うことが出来ます。 </p> <p> このグラフはこれらの位置を表しています: <font color="red">あなた</font>, the <font color="yellow">スピーカー</font> and a <font color="green">移動する音の発生源</font> 上からに見えるようなら、チャンネルの間に移動して聞くのがよいでしょう。 </p> Use headphones instead of speakers スピーカーの代わりにヘッドホンを使います <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> <p> おめでとうございます!Mumbleでリッチなサウンド体験をする準備が整いました。 </p> <p> Mumbleは現在開発中であり、開発チームはより多くのユーザの利益となる機能に注力したいと考えています。そのため、匿名で設定に関する統計を送信する機能を追加しました。これらの統計情報は主に将来の開発のために使用されるか、特定の機能が使用されていないかどうかを確認するために使用されます。 </p> Use headphones ヘッドホンを使う This ignores the OS speaker configuration and configures the positioning for headphones instead. OSのスピーカー構成を無視して、代わりにヘッドホン用の位置設定を使用します。 Volume tuning 音量調整 Tuning microphone hardware volume to optimal settings. マイクの音量を最適な設定になるよう調整します。 Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. 次に、誰も起こさないようにしている夜中のようにそっと話してみましょう。話している間、バーが緑にかかり、静かにしている時は青に留まるように下のスライダーを調整してください。 Voice Activity Detection 発声の検出 Letting Mumble figure out when you're talking and when you're silent. 話している状態と静かにしている状態をMumbleに判別させます。 This will help Mumble figure out when you are talking. The first step is selecting which data value to use. あなたがいつ話しているのかをMumbleに判別させるお手伝いをします。まず最初に、どのデータの値を使うかの選択を行います。 Raw amplitude from input 音声信号の大きさ Signal-To-Noise ratio 信号対雑音比(S/N比) Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). 次に、以下の2つのスライダーを調節しましょう。最初の発声は緑(確実に発言と判定)になると良いでしょう。話している最中は黄色(発言だろうと判定)の中に収まり、話していない時はすべて赤(発言ではないと判定)に入っているようにしてください。 Device tuning デバイス調整 Changing hardware output delays to their minimum value. ハードウェアの出力遅延が最小値になるように変更します。 Submit anonymous statistics to the Mumble project Mumbleプロジェクトに匿名で統計を送信する Push To Talk: プッシュ・トゥ・トーク: Quality & Notifications 品質 & 通知 Adjust quality and notification settings. 音質と通知の設定を調整します。 Quality settings 品質の設定 Low Balanced バランス Notification settings 通知設定 Use Text-To-Speech to read notifications and messages to you. 通知を読み上げあなたに伝えます。 Disable Text-To-Speech and use sounds instead. テキスト読み上げを無効にして、代わりにサウンドファイルを再生します。 %1 ms %1ms Enables attenuation of other applications while users talk to you ユーザが会話しているときに他のアプリケーションの減衰を有効化 Attenuate applications while other users talk 他のユーザが話しているとき他のアプリケーションの音量を減らす High Custom カスタム You already set a customized quality configuration in Mumble. Select this setting to keep it. あなたはすでに音質設定をカスタマイズしています。設定を保持したい場合はこれを選んでください。 Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. ユーザが会話しているときに他のアプリケーションの減衰を有効にします。 Mumble で誰かがあなたに話し始めたらすぐに、他のすべてのアプリケーションの音量はあなたが他人の会話を良く理解出来るように減衰されます。 Apply some high contrast optimizations for visually impaired users 視覚障害者のためにハイコントラストへ最適化します Use high contrast graphics ハイコントラストの画像を使う Keep custom Text-To-Speech settings. カスタムのテキスト・トゥ・スピーク設定を保持します。 <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode <p> ボリュームコントロールパネルを開き、録音設定画面に移動しましょう。そして、マイクが選択されていて、音量が最大になっている事を確認してください。もし"マイクブースト"を有効にするオプションがあるなら、それもチェックされているか確認してください。 </p> <p> イライラしていたり、興奮していたりする時のように大声で話してみてください。話している間、下にあるバーが青と緑の区域のなるべく空の領域に近い場所に留まるまでサウンドコントロールパネルの音量を下げてください。(赤い区域には<b>入らない</b>ようにしましょう) </p> Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode 次に、誰も起こさないようにしている夜中のようにそっと話してみましょう。話している間、バーが空の領域にかかり、静かにしている時は青に留まるように下のスライダーを調整してください。 Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode 次に、以下の2つのスライダーを調節しましょう。最初の発声は空の領域(確実に発言と判定)になると良いでしょう。話している最中は黄色(発言だろうと判定)の中に収まり、話していない時はすべて赤(発言ではないと判定)に入っているようにしてください。 In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) この設定ではMumbleは<b>少ない量の帯域</b>を使うでしょう。必然的に高遅延及び、低品質になります。あなたの接続環境が他の設定を処理できない場合にのみ選択してください。(16kbit/s, 60ms per packet) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) これは<b>標準の</b>設定として<b>推奨されます。</b>音質と遅延、帯域の使用のバランスが良い設定です。(40kbit/s, 20ms per packet) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) この設定は帯域を問題としない場所、例えばLANのような場所でのみ使うことを推奨します。Mumbleがサポートする最も低い遅延と<b>高い音質</b>を提供します。(72kbit/s, 10ms per packet) BanEditor Mumble - Edit Bans Mumble - Ban編集 &Address アドレス(&A) &Mask ネットマスク(&M) Reason 理由 Start 開始 End 終了 User ユーザ Hash ハッシュ &Add 追加(&A) &Update 更新(&U) &Remove 削除(&R) Ban List Search field This is the search field. Use it to find bans that have this username set in the username field. Who are you looking for? No nickname IP address No IP address Reason for the ban No reason Ban end date Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). Certificate hash No certificate hash Banned users This is a list with banned users. Use this button if you want to add a new ban. Use this button if you want to update ban information. Use this button if you want to remove user from the ban list. Clear all fields This button clears all fields. Use it if you want to add a new ban. Clear Ban List - %n Ban(s) CertView Name 名前 Email Eメール Issuer 発行者 Expiry Date 有効期限 (none) (空欄) Self-signed 自己署名 CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. Eメールアドレス を認証できません。<br />継続するには有効なEメールアドレスを入力するか、空欄のままにしてください。 There was an error generating your certificate.<br />Please try again. 証明書の生成でエラーが発生しました。<br />もう一度、試してみてください。 Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. 証明書とキーはPKCS#12 フォーマットでエクスポートできません。証明書にエラーがある可能性があります。 The file could not be opened for writing. Please use another file. そのファイルを書き込みモードで開けませんでした。他のファイルを使用してください。 The file's permissions could not be set. No certificate and key has been written. Please use another file. The file could not be written successfully. Please use another file. そのファイルに正しく書き込めませんでした。他のファイルを使ってください。 The file could not be opened for reading. Please use another file. そのファイルを読み込みモードで開けませんでした。他のファイルを使用してください。 The file is empty or could not be read. Please use another file. そのファイルは空であるか読み込むことができません。他のファイルを使用してください。 The file did not contain a valid certificate and key. Please use another file. そのファイルは正しい証明書とキーを含んでいません。他のファイルを使用してください。 Select file to export certificate to 証明書をエクスポートするためのファイルを選択してください Select file to import certificate from 証明書をインポートするためのファイルを選択してください Unable to import. Missing password or incompatible file type. <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. <b>証明書の有効期限:</b>あなたの証明書の有効期限がもうすぐ切れます。証明書を更新する必要があります。さもないとあなたはユーザ登録したサーバに接続できなくなるでしょう。 Certificates Certificate Management 証明書 管理 Certificate Authentication 証明書による認証 Authenticating to servers without using passwords パスワードを使わないサーバへのユーザ認証 Current certificate 現在の証明書 This is the certificate Mumble currently uses. Mumble が現在使用している証明書です。 Current Certificate 現在の証明書 Create a new certificate 新しい証明書を作る This will create a new certificate. 新しい証明書を作ります。 Import certificate from file ファイルから証明書をインポートします This will import a certificate from file. ファイルから証明書をインポートします。 Import a certificate 証明書をインポートする Export Certificate 証明書をエクスポートする This will export a certificate to file. ファイルに証明書をエクスポートします。 Export current certificate 現在の証明書をエクスポートする Import Certificate 証明書のインポートする PKCS #12 Certificate import PKCS #12 証明書のインポート <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble は PKCS #12 形式で保存された証明書をインポートできます。 これは Mumble がキーをエクスポートする時に使われる形式です。これは FireFox や Internet Explorer 、 Opera などでも使われます。</p><p>そのファイルがパスワードで保護されていたら、証明書をインポートするためにパスワードが必要になります。</p> Import from インポート元 Filename to import from インポート元のファイル名 This is the filename you wish to import a certificate from. これは証明書をインポートするファイル名です。 Select file to import from インポート元となるファイルを選択 This opens a file selection dialog to choose a file to import a certificate from. 証明書のインポート元となるファイルを選択するためのダイアログを開きます。 Open... 開く.... Password パスワード Password for PKCS#12 file PKCS#12 ファイルのためのパスワード This is the password for the PKCS#12 file containing your certificate. 証明書を含むPKCS#12ファイルのためのパスワードです。 Certificate to import インポートする証明書 This is the certificate you are importing. これはあなたがインポートする証明書です。 Certificate Details 証明書の詳細 Replace Certificate 証明書の置き換え Replace existing certificate with new certificate? 存在する証明書を新しい証明書に置き換えますか? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> <p>あなたはすでに Mumbleに記憶された証明書を持っており、それを置き換えようとしています。</p> <p>信頼された認証局によって発行された証明書にアップグレードしようとしています。新しい証明書のEメールアドレスがあなたの現在の証明書のものと一致しているなら問題はありません。今までにユーザ登録をしたサーバは、あなたのEメールアドレスを元に強力な証明書を自動的に判別するでしょう。 </p> <p>そうでないなら、あなたはどのサーバでも以前に受けた認証を失います。あなたがまだ、どのサーバにもユーザ登録されていないなら、この心配は無用です。 </p> <p> 本当に証明書を置き換えますか? </p> This is the certificate Mumble currently uses. It will be replaced. Mumbleが現在使用している証明書です。これは新しい物に置き換えられます。 New certificate 新しい証明書 This is the new certificate that will replace the old one. これは古い証明書と置き換えられる新しい証明書です。 New Certificate 新しい証明書 Make a backup of your certificate 証明書のバックアップを作成 Export to エクスポート先 Filename to export to エクスポート先のファイル名 This is the filename you wish to export a certificate to. 証明書をエクスポートするファイル名です。 Save As... 名前をつけて保存... This is the certificate Mumble currently uses. It will be exported. Mumbleが現在使用している証明書です。エクスポートされます。 Generate a new certificate for strong authentication 強力な認証のための新しい証明書を生成しましょう <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> <p>Mumble はサーバに対する認証のために強力な証明書を生成します。</p><p>証明書に追加情報を記録できます。これらの情報はサーバに接続する時にそのサーバに送信されます。正しいEメールアドレスを提供したなら、後で認証局が発行したEメール証明書にアップグレードできます。</p> Name 名前 Email Eメール Your email address (e.g. johndoe@mumble.info) あなたのEメールアドレス(例えば jhondoe@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. あなたのEメールアドレスです。正しいEメールアドレスを提供することが推奨されます。認証の問題なく強力な証明書にアップグレードできるからです。 Your name (e.g. John Doe) あなたの名前です(例えば山田太郎) This is your name, and will be filled out in the certificate. This field is entirely optional. あなたの名前であり証明書に記入されれます。このフィールの入力は任意です。 Finish 終了 Certificate-based authentication is ready for use 証明書ベースの認証が使えるようになりました Enjoy using Mumble with strong authentication. 強力な認証とともに Mumble を楽しんでください。 Automatic certificate creation 証明書の自動発行 <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>現在の証明書をハードウェアの故障やマシンの再インストールなどで失ったなら、登録したサーバから認証を受けることが出来なくなります。そのため、証明書のバックアップを作成することは<b>必須</b>です。USBメモリのようなリムーバブルストレージに証明書のバックアップを保存することを強く推奨します。</p> <p>このファイルは暗号化されておらず、もし、誰かがアクセスしたら、あなたに成りすます可能性があります。十分に気をつけてください。</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> ChanACL None なし Traverse トラバース Enter チャンネルへの参加 Speak 発言 Mute/Deafen 発言禁止/聴取禁止 Make channel チャンネル作成 Make temporary 一時チャンネルの作成 Link channel チャンネルをリンク This represents no privileges. 権限がないことを表します。 This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. グループとACL情報の変更を含む、チャンネルへの完全なアクセスを表します。この権限は、必然的に他の全ての権限を含んでいます。 This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. チャンネル間を移動する権限を表します。あるユーザがこの権限を与えられない場合、サブチャンネルの権限に関わらず、どんな方法でもこのチャンネルおよびサブチャンネルにアクセス出来なくなります。 This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. チャンネルに参加する権限を表します。階層的なチャンネル構造がある場合、全ての人にチャンネルアクセスを与えたくなるかもしれませんが、階層の最下部で参加が制限されるかもしれません。 This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. このチャンネル内で発言する権限を表します。この権限がないユーザはサーバによって発言を抑制され(発言禁止にされているように見えます)、適切な権限を持つ誰かが発言禁止を解くまで話すことができません。 This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. このチャンネルの外側から中へささやきを行う権限です。この権限は<i>発言</i>の権限のように働きます。しかし、ささやきのキーが押されている発言パケットに適用されます。リンクしていないチャンネルの階層にブロードキャストするかもしれません。 This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. 他のユーザを発言禁止にしたり、聴取禁止にしたりする権限を表します。一度発言禁止になると、他に権限を持ったユーザが発言禁止を解くか、サーバに接続しなおすまで発言禁止のままになります。 This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. 他の人を別のチャンネルに移動させたり、サーバからキックしたりする権限を表します。実際にユーザを動かすには、実行する人が移動先のチャンネルの移動/キック権限を持っているか、ユーザが移動先チャンネルに参加する権限を持っていなければなりません。この権限を持っている人は、対象のユーザが通常参加を許可されていないチャンネルに移動させることができます。 This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. サブチャンネルを作成する権限を表します。サブチャンネルを作ったユーザは、そのチャンネルの管理者グループに追加されます。 This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. サブチャンネルとして一時チャンネルを作成する権限を表します。サブチャンネルを作ったユーザはそのチャンネルの admin グループに追加されます。一時チャンネルは、チャンネルからユーザがいなくなった場合に保持されずに消えます。 This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. チャンネルをリンクする権限を表します。話している人が聞き手のチャンネルに<i>発言</i>の権限を持っている限り、リンクされたチャンネルのユーザは互いに聞く事ができます。 This represents the permission to write text messages to other users in this channel. このチャンネルで他のユーザにテキストメッセージを送る権限を表します。 This represents the permission to forcibly remove users from the server. サーバからユーザを追い出す権限を表します。 This represents the permission to permanently remove users from the server. サーバからユーザを永久的に追放する権限を表します。 This represents the permission to register and unregister users on the server. サーバ上のユーザをユーザ登録したり登録を抹消する権利を表します。 This represents the permission to register oneself on the server. サーバ上でユーザ自身がユーザ登録を行う権限を表します。 Whisper ささやき Move ユーザの移動 Text message テキストメッセージ Kick ユーザのキック Ban ユーザのバン Register User 他ユーザを登録 Register Self 自分をユーザ登録 Write ACL ACLの上書き ChatbarTextEdit Paste and &Send Paste and send 貼り付けて送信(&S) <center>Type chat message here</center> <center>ここにメッセージを入力</center> ClientUser Friend フレンド Authenticated 認証済み Priority speaker 優先度スピーカ Recording 録音 Muted (server) 発言禁止 (server) Deafened (server) 聴取禁止 (サーバ) Local Ignore (Text messages) ローカルで無視(テキストメッセージ) Local Mute ローカルでの発言禁止 Muted (self) 発言禁止 (セルフ) Deafened (self) 聴取禁止 (セルフ) ConfigDialog Accept changes 変更を確定 This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. このボタンは現在の設定を適用してアプリケーションに戻ります。<br />この設定はアプリケーションを終了してもディスクに保存されます。 Reject changes 変更を破棄 This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. このボタンは変更を破棄してアプリケーションに戻ります。<br />設定は前の状態に戻ります。 Apply changes 変更を適用 This button will immediately apply all changes. 全ての変更を、すぐに適用します。 Undo changes for current page このページの変更を元に戻す This button will revert any changes done on the current page to the most recent applied settings. このボタンは、現在のページで最後に適用した変更を元に戻します。 Restore defaults for current page このページをデフォルト設定に戻す This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. このボタンは現在のページの設定をデフォルトに戻します。他のページは変更されません。<br />全ての設定をデフォルト戻すには、各ページでこのボタンを使わなければなりません。 Mumble Configuration Mumbleの設定 ConnectDialog Connecting to %1 %1に接続中 Enter username ユーザ名を入力してください Adding host %1 ホスト %1 を追加中 Servername サーバ名 Hostname ホスト名 Bonjour name Bonjour 名 Port ポート Addresses アドレス Website WEBサイト Packet loss パケット損失 Ping (80%) %1 ms Ping (95%) Bandwidth ネットワーク帯域 %1 kbit/s &Connect 接続(&C) &Filters フィルタ(&F) Unknown Users ユーザ Version バージョン Failed to fetch server list サーバリストを取得出来ませんでした Mumble Server Connect Mumbleサーバ接続 Ping Remove from Favorites お気に入りから削除する Add custom server カスタムサーバを追加 Show all servers that respond to ping ping に応答する全てのサーバを表示します Show all servers with users ユーザがいる全てのサーバを表示します Show all servers 全てのサーバを表示 &Copy コピー(&C) Copy favorite link to clipboard クリップボードにお気に入りのリンクをコピー &Paste ペースト(&P) Paste favorite from clipboard クリップボードからお気に入りへペースト &Edit... 編集(&E)... &Add New... 新しく追加(&A) ... Add to &Favorites お気に入りに追加(&F) Open &Webpage Webページを開く(&W) Show &Reachable 到達可能なものを表示(&R) Show &Populated ユーザのいるサーバを表示(&P) Show &All 全て表示(&A) ConnectDialogEdit Edit Server サーバを編集 Name of the server サーバの名前 A&ddress アドレス(&D) Internet address of the server. Internet address of the server. サーバのインターネットアドレス。 <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>アドレス</b><br/> サーバのインターネットアドレス。これは通常はホスト名・ip v4/6 アドレス、Bonjour サービス識別子です。Bonjourサービス識別子はMumbleに区別されるために '@' を接頭辞としてつける必要があります。 &Port ポート(&P) Port on which the server is listening サーバが待ち受けているポート <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. <b>ポート</b><br /> サーバが待ち受けるポート。サーバが Bonjour サービス識別子によって識別されるならこのフィールドは無視されます。 &Username ユーザ名(&U) Username to send to the server サーバに送信するユーザ名 <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. <b>ユーザ名</b><br /> サーバに送信するユーザ名。サーバのユーザ名に対する制約に気をつけてください。また、ユーザ名が既に他のユーザに使われているかもしれないことにも注意してください。 Label ラベル Add Server サーバの追加 You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 Password パスワード Password to send to the server サーバに送信するパスワード <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. <b>Password</b><br /> 接続したサーバに送信されるパスワードです。このパスワードはSuperUserとして接続するときやパスワード認証を使うサーバに接続するとき必要です。パスワードをここに入力しなければ接続時に要求されます。 Show password パスワードを表示する <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. <b>ラベル</b><br /> そのサーバのラベルです。あなたのサーバリスト上でどのようにそのサーバが名前をつけるもので 自由に選べます。 Local server label 127.0.0.1 64738 Your username Your password &Fill CoreAudioSystem Default Device デフォルトデバイス CrashReporter Mumble Crash Report <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> Email address (optional) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash Send Report Don't send report Crash upload successful Thank you for helping make Mumble better! Crash upload failed We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 Uploading crash report Abort upload DXAudioInput Default DirectSound Voice Input デフォルトのDirectSound音声入力 Opening chosen DirectSound Input device failed. No microphone capture will be done. DirectSound入力デバイスのオープンに失敗しました。 マイクの取得ができませんでした。 Opening chosen DirectSound Input failed. Default device will be used. 選択されたDirectSound Inputのオープンに失敗しました。デフォルトのデバイスが使用されます。 Lost DirectSound input device. DirectSound入力デバイスを失いました。 DXAudioOutput Default DirectSound Voice Output デフォルトのDirectSound音声出力 Opening chosen DirectSound Output failed. Default device will be used. 選択されたDirectSound出力のオープンに失敗しました。音声は出力されません。 Lost DirectSound output device. DirectSound出力デバイスを失いました。 Opening chosen DirectSound Output failed. No audio will be heard. 選択されたDirectSound出力のオープンに失敗しました。音声は出力されません。 Database Mumble failed to initialize a database in any of the possible locations. Mumble: データベースの初期化が可能な場所がなく、 操作に失敗しました。 The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. データベース "%1" は読み込み専用です。 この問題を修正するまで、Mumble はサーバの設定(例えばSSL証明書)を保存できません。 DeveloperConsole Developer Console DockTitleBar Drag here ここにドラッグ GlobalShortcut Shortcuts ショートカット List of configured shortcuts 設定されたショートカットのリスト Function 機能 Data データ Shortcut ショートカット Suppress 抑制 Add new shortcut 新しいショートカットを追加 This will add a new global shortcut これにより新しいグローバルショートカットを追加するだろう &Add 追加(&A) Remove selected shortcut 選択されたショートカットを削除します This will permanently remove a selected shortcut. これにより選択されたショートカットを永久に削除します。 &Remove 削除(&R) <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> <html><head/><body><p>Mumbleはマウスボタンとキーボードの修飾キー(Alt、Ctrl、Cmdなど)のみを使用できます。</p><p>より柔軟に設定したいなら、システム環境設定のアクセシビリティの<span style=" font-style:italic;">補助装置にアクセスできるようにする</span>を有効にできる。しかし、この変更は悪意のあるプログラムがあなたがキーボードでタイプした内容を読み取ることを許すことに注意してください。</p></body></html> Open Accessibility Preferences アクセシビリティ設定を開く Skip スキップ Enable Global Shortcuts グローバルショートカットを有効にする <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. Additional Shortcut Engines <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. Enable Windows hooks <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. Enable GKey <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. Enable XInput <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. Enable shortcuts in privileged applications GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> Shortcuts ショートカット Shortcut button combination. ショートカットボタンの組み合わせ。 <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. <b>これはグローバルショットカットキーの組み合わせです。</b><br />このフィールドをダブルクリックして、バインドしなおしたいキーかボタンのコンボをダブルクリックしてください。 Suppress keys from other applications 他のアプリケーションのキーを抑制します <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. <b>他のアプリケーションで押されたボタンを隠します.</b><br />この設定を有効にすると、他のアプリケーションで押されたボタン(または、複数ボタンの組み合わせの最後のもの)を隠します. 全てのボタンを抑制できるわけではないことにご注意ください。 GlobalShortcutTarget Whisper Target ささやきのターゲット Whisper to list of Users ユーザのリストにささやき Channel Target チャンネルターゲット Restrict to Group グループの制限 If specified, only members of this group will receive the whisper. 設定すると、このグループのメンバーのみがささやきを受けとります。 List of users ユーザのリスト Add 追加 Remove 削除 Modifiers 変更 Do not send positional audio information when using this whisper shortcut. このささやきのショートカットを使用して位置音響の情報を送信しません。 Ignore positional audio 位置音響を無効にする Shout to Linked channels リンクしているチャンネルへ叫ぶ Shout to subchannels サブチャンネルへ叫ぶ Shout to Channel チャンネルへ叫ぶ The whisper will also be transmitted to linked channels. ささやきはリンクしているチャンネルにも送信されます。 The whisper will also be sent to the subchannels of the channel target. ささやきは対象のチャンネルのサブチャンネルにも送信されます。 GlobalShortcutX Mouse %1 マウス %1 JackAudioSystem Hardware Ports Mono Stereo LCD Not connected 接続されていません LCDConfig Enable this device このデバイスを有効にする LCD LCD Devices デバイス Name 名前 <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> <p>これはあなたのシステム上にある利用可能なLCDデバイスのリストです。名前でデバイスを列挙しますが、ディスプレイのサイズも含んでいます。Mumbleは複数のLCDデバイスへ同時に出力することをサポートしています。</p> <h3>サイズ:</h3> <p> このフィールドはLCDデバイスのサイズを示します。そのサイズはピクセル(LCDの画像)か文字数(LCDの文字)で与えられます。</p> <h3>有効化:</h3> <p>これはMumbleが特定のLCDデバイスに描画するべきかを決定します。</p> Size サイズ Enabled 有効 Views ビュー Minimum Column Width 列の最少幅 <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> <p>このオプションはユーザビューの中で最小の幅の列を決めます。</p> <p>あまりにも多い人々が同時に喋ったとき、ユーザビューはそれを列に分けます。あなたはLCD上に表示されるユーザの数とユーザ名の幅の間の妥協案を得るためにこのオプションを使えます。</p> This setting decides the width of column splitter. この設定は列の分割の幅を決めます。 Splitter Width 分割線の幅 Log Debug デバッグ Critical 致命的 Warning 警告 Information 情報 Server Connected サーバに接続 Server Disconnected サーバから切断 Other self-muted/deafened 他の人が発言禁止/聴取禁止になった時 Permission Denied 権限がない場合 Text Message テキストメッセージ User Joined Server ユーザがサーバに参加 User Left Server ユーザがサーバから退出 User recording state changed ユーザの録音状態の変更 User kicked (you or by you) ユーザがキックされた時 (あなた自身、またはあなたによって) User kicked ユーザがキックされた時 You self-muted User muted (you) ユーザが発言禁止になった時 (あなたが) User muted (by you) ユーザが発言禁止になった時 (あなたによって) User muted (other) ユーザが発言禁止になった時 (その他) User Joined Channel ユーザがチャンネルに参加 User Left Channel ユーザがチャンネルから退出 You self-unmuted You self-deafened You self-undeafened User renamed You Joined Channel You Joined Channel (moved) User connected and entered channel User left channel and disconnected Private text message the server サーバ [[ Invalid size ]] [[ Text object too large to display ]] [[ テキストが表示するには大きすぎます ]] [Date changed to %1] [ 日付が %1 に変更されます ] link to %1 %1 へのリンク FTP link to %1 player link プレイヤリンク channel link チャンネルリンク %1 link %1 リンク LogConfig Toggle console for %1 events イベント「%1」 のためのコンソールを切り替える Toggle pop-up notifications for %1 events イベント「%1」のためのポップアップ通知を切り替える Toggle Text-To-Speech for %1 events イベント「%1」のためのテキスト読み上げを切り替える Click here to toggle sound notification for %1 events イベント「%1」の音声通知を切り替えるためにはここをクリック Toggle window highlight (if not active) for %1 events Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change イベント「%1」のときに音声通知のために使用するサウンドファイルのパス<br />シングルクリックで再生<br />ダブルクリックで変更 Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. イベント「%1」のコンソール出力を切り替えるためにはここをクリック。<br />チェックされた場合、メッセージログに全てのイベント「%1」を出力する。 Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. イベント「%1」のポップアップ通知を切り替えるためにはここをクリック。<br />チェックされた場合、イベント「%1」がおきるたびポップアップ通知が行われる。 Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. イベント「%1」のときに音声通知のために使用するサウンドファイルのパス<br />シングルクリックで再生<br />ダブルクリックで変更<br />これらのイベントのための音声通知が有効であるか、またはこのフィールドが無効であることを確認してください。 Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. イベント「%1」の音声通知を切り替えるためにはここをクリック。<br />チェックされた場合、あなたが用意したイベント「%1」を示す音声ファイルが使用さる。サウンドファイルと適すと読み上げは同時に使用することはできない。 Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. イベント「%1」のときに音声通知を切り替えるにはここをクリックしてください。<br /> もしチェックしたなら、Mumble はイベント「%1」に設定された音声ファイルを再生します。音声ファイルとTTSは同時に使えません。 Messages メッセージ Message メッセージ Console コンソール Notification 通知 Text-To-Speech テキスト読み上げ Soundfile サウンドファイル Path パス Text To Speech テキスト読み上げ Volume 音量 Volume of Text-To-Speech Engine テキスト読み上げエンジンの音量 <b>This is the volume used for the speech synthesis.</b> <b>この音量は合成音声に用いられます。</b> Length threshold 長さの上限 Message length threshold for Text-To-Speech Engine テキスト読み上げエンジンにおける長さの上限値 <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. <b>テキスト読み上げエンジンにおける長さの上限値です。</b><br />上限より長いものは、最後まで読み上げられません。 Characters 文字 Whisper ささやき If checked you will only hear whispers from users you added to your friend list. チェックするとフレンドリストに追加されたユーザからのみささやきのみを聞くようになります。 Only accept whispers from friends フレンドからのささやきのみ受け付ける If enabled text messages you send will be read back to you with TTS 有効にするとあなたが送信したテキストメッセージがTTSにより読まれます Read back own messages 自分が送信したメッセージを読み上げる Chat Log チャットログ Maximum chat length チャットバーの長さの最大値 Unlimited 無制限 Lines Highlight LookConfig System default システムのデフォルト None なし Only with users ユーザが居るチャンネルのみ All 全て Ask 確認する Do Nothing 何もしない Move 移動する <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory User Interface インターフェース This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. どのチャンネルを自動的に展開するかを決定します。 <i>なし</i> と <i>全て</i> は全てのチャンネルを展開する/しない設定にします。<i>人が居るチャンネルのみ</i> はユーザの入室状況に応じて展開と折りたたみが変わります。 List users above subchannels (requires restart). サブチャンネルの上にユーザを表示する(再起動が必要です)。 <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. <b>これを設定していると、チャンネル表示の時にサブチャンネルより上にユーザが表示されるようになります。</b><br />この設定を反映するにはMumbleの再起動が必要です。 Users above Channels チャンネルの上にユーザを表示する <b>If set, will verify you want to quit if connected.</b> <b>これがセットされている場合、接続中に終了するかを確認します。</b> Show number of users in each channel それぞれのチャンネルのユーザ数を表示 Show channel user count チャンネルにいるユーザ数を表示する Language 言語 Language to use (requires restart) 使用する言語(再起動が必要) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. <b>Mumbleが使用する言語を決定します。</b><br />新しい言語を使うためには再起動が必要です。 Look and Feel 外観と手触り Layout レイアウト Classic クラシック Stacked スタック Hybrid ハイブリッド Custom カスタム This changes the behavior when moving channels. チャンネルを移動したときの動作を変更します。 This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. チャンネルを動かすときの動作を変更します。これを設定すると誤ってチャンネルをドラッグしてしまうのを防ぐことができます。 <i>チャンネルを移動</i> 確認なしにチャンネルを動かします。 <i>何もしない</i> 何も行わず、エラーメッセージを表示します。 <i>確認する</i> 確認メッセージボックスを出してから動かします。 Expand 展開 When to automatically expand channels 自動的にチャンネルを展開する Channel Dragging チャンネルのドラッグ操作 Ask whether to close or minimize when quitting Mumble. 終了時に最小化するか閉じるかを確認します。 Ask on quit while connected 接続中の終了は確認する Always On Top 常に手前に表示 <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> <b>これがセットされていた場合、最小化されたMumbleのメインウインドウは非表示になり、タスクトレイからのみアクセスできるようになります。これがセットされていない場合、ウインドウは普通に最小化します。</b> Hide in tray when minimized 最小化時、タスクトレイに格納する Hide the main Mumble window in the tray when it is minimized. 最小化されている時にメインウインドウをタスクトレイに格納します。 This setting controls when the application will be always on top. この設定はどのような状況でアプリケーションを常に手前に表示するかを制御します。 Never 手前に表示しない Always 常に手前に表示する In minimal view 小さい表示でのみ常に手前で表示する In normal view 通常の表示でのみ常に手前で表示する Displays talking status in system tray システムトレイに発現状態を表示する Show talking status in tray icon 発言状態をトレイアイコンで表示する This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. この設定はどのような状況でアプリケーションを常に手前で表示するかを制御します。 Show context menu in menu bar メニューバーにコンテキストメニューを表示する Apply some high contrast optimizations for visually impaired users 視覚障害者のためにハイコントラストへの最適化を適用します Optimize for high contrast ハイコントラストに最適化する Application アプリケーション Adds user and channel context menus into the menu bar ユーザとチャンネルのコンテキストメニューをメニューバーに追加します Tray Icon トレイアイコン Channel Tree チャンネルツリー Use selected item as the chat bar target 選択した項目をチャットバーの対象にする Filter automatically hides empty channels Show transmit mode dropdown in toolbar Theme Theme to use to style the user interface <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. User Dragging This changes the behavior when moving users. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. Enable Developer menu When in custom layout mode, checking this disables rearranging. Lock layout MainWindow Root ルート Push-to-Talk Global Shortcut プッシュ・トゥ・トーク Push and hold this button to send voice. Global Shortcut 声を送るときに押し続けるボタンです。 This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut プッシュ・トゥ・トークのボタンを設定する。このボタンを押している間あなたの声は送信される。 Reset Audio Processor Global Shortcut 音声処理をリセット Unlink Plugin Global Shortcut プラグインを外す Push-to-Mute Global Shortcut 押してる間発言禁止 Join Channel Global Shortcut チャンネルへの参加 Toggle Overlay Global Shortcut オーバーレイ表示切替 Toggle state of in-game overlay. Global Shortcut ゲーム中でのオーバーレイの状態を切り替える。 Toggle Minimal Global Shortcut 小型切り替え Volume Up (+10%) Global Shortcut 音量を上げる(+10%) Volume Down (-10%) Global Shortcut 音量を下げる(-10%) Mumble Mumble Mumble -- %1 Mumble -- %1 &Window ウインドウ(&W) Minimize 最小化 Ctrl+M Ctrl+M Close 閉じる Mumble is currently connected to a server. Do you want to Close or Minimize it? Mumble は現在、サーバに接続しています。接続を閉じるか最小化しますか? Mute Self Global Shortcut 発言禁止状態 Set self-mute status. Global Shortcut 自分自身を発言禁止状態に設定。 This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut 発言禁止の状態を設定するか切り替えます。オフになると、聴取禁止も無効になります。 Deafen Self Global Shortcut 聴取禁止状態 Set self-deafen status. Global Shortcut 自分自身を聴取禁止状態に変更。 This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut あなたの聴取禁止状態を設定するか切り替えます。オンになれば、発言禁止も有効になります。 Whisper/Shout Whisper ささやき <center>Not connected</center> Not connected 接続されていません Clear クリア Opening URL %1 URL %1 を開きます File does not exist ファイルが存在しません File is not a configuration file. 設定ファイルが見つかりません。 Settings merged from file. 設定をファイルからマージする。 URL scheme is not 'mumble' URLスキームは 'mumble' ではありません This version of Mumble can't handle URLs for Mumble version %1.%2.%3 このバージョンのMumble は Mumble %1.%2.%3 のための URL を扱えません Connecting to %1 %1 に接続しています Enter username ユーザ名を入力してください Connecting to server %1. サーバ %1 に接続しています。 Reconnecting. 再接続中です。 Transmit Mode set to Continuous <p>%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> <h2>音声チャンネル</h2><p>128 bit OCB-AES128 で暗号化されています。<br />平均 %1 ms の遅延 (平方偏差 %4)</p> Register yourself as %1 %1 の名前で自分をユーザ登録します <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <p>サーバ上で自分自身をユーザ登録しようとしています。このアクションは取り消せません。このサーバでのあなたのユーザ名をこの操作の後に変更できなくなります。あなたはこのサーバ上で '%1' のユーザ名を使うことになります。</p><p>本当に自分自身を登録しますか?</p> <h2>Version</h2><p>Protocol %1</p> <p>No build information or OS version available</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) The connection is secured by the cipher suite that OpenSSL identifies as %1 <p>The connection provides perfect forward secrecy</p> <p>The connection does not provide perfect forward secrecy</p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> Voice channel is sent over control channel Register user %1 ユーザ %1 を登録 <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> <p>あなたはサーバ上で %1 をユーザ登録しようとしています。このアクションは取り消せませんし登録済みのユーザ名を変えることもできません。登録済みのユーザ '%1' は、サーバパスワードを変更したとしても、サーバにアクセスするでしょう。</p><p>この時点から、'%1' は 現在の証明書でユーザ認証されます。</p><p>本当に %1 を登録しますか?</p> Kicking user %1 ユーザをキック : %1 Banning user %1 ユーザ:%1 をバンする View comment on user %1 ユーザ %1 のコメントを見ます Message to channel %1 チャンネル %1 へのメッセージ Connected. サーバに接続しました。 <li>Expected certificate digest (SHA-1): %1</li> Server presented a certificate which failed verification. <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> SSL Version mismatch SSL のバージョンが一致しません Server connection failed. <center>Type message to channel '%1' here</center> Type message to channel '%1' here チャンネル '%1' へのメッセージをここに入力 <center>Type message to user '%1' here</center> Type message to user '%1' here ユーザ '%1' へのメッセージをここに入力 Choose image file イメージファイルを選択 Failed to load image 画像の読み込みに失敗 Could not open file for reading. 読み込みモードでファイルを開けません。 Image format not recognized. 画像の形式を認識できません。 &User ユーザ(&U) &Channel チャンネル(&C) Use in conjunction with Whisper to. Global Shortcut This will switch the states of the in-game overlay. Global Shortcut ゲームオーバレイの状態を切り替えます。 Link Channel Global Shortcut チャンネルのリンク Cycle Transmit Mode Global Shortcut Set Transmit Mode to Push-To-Talk Global Shortcut Set Transmit Mode to Continuous Global Shortcut Set Transmit Mode to VAD Global Shortcut Send Text Message Global Shortcut Send Clipboard Text Message Global Shortcut This will send your Clipboard content to the channel you are currently in. Global Shortcut Continuous Voice Activity Push-to-Talk Mumble - Minimal View -- %1 Cancel Save Image As... Save Image File Could not save image: %1 Change your comment コメントを変更します Transmit Mode set to Voice Activity Transmit Mode set to Push-to-Talk <p>Connected users: %1/%2</p> UDP Statistics UDP統計 To Server サーバ宛 From Server サーバから Good 良好 Late 遅延 Lost 消失 Resync 最同期 <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> <h2>音声帯域</h2><p>最大%1kbit/s<br />現在%2kbit/s<br />コーデック: %3</p> Mumble Server Information Mumble サーバの情報 &View Certificate 証明書を見る(&V) Enter reason 理由を入力してください Sending message to %1 %1 にメッセージを送信しています To %1: %2 %1 宛: %2 Message to %1 %1 へのメッセージ Are you sure you want to reset the comment of user %1? ユーザ %1 のコメントをリセットしますか? Are you sure you want to reset the avatar of user %1? Are you sure you want to delete %1 and all its sub-channels? %1 とそのサブチャンネルを全て削除します。よろしいですか? Sending message to channel %1 チャンネル %1 に送信するメッセージ Message to tree %1 tree %1 宛メッセージ To %1 (Tree): %2 (Tree) %1: %2 (ツリー) %1宛: %2 Unmuted and undeafened. 発言禁止と聴取禁止も解除しました。 Unmuted. 発言禁止を解除しました。 Muted. 発言を禁止しました。 Muted and deafened. 発言と聴取が禁止になりました。 Deafened. 聴取を禁止しました。 Undeafened. 聴取禁止を解除しました。 Restart Mumble? Some settings will only apply after a restart of Mumble. Restart Mumble now? About Qt Qtについて SSL Verification failed: %1 SSL検証エラー: %1 <li>Server certificate digest (SHA-1): %1</li> <b>WARNING:</b> The server presented a certificate that was different from the stored one. <b>警告:</b> 送信された証明書は保存されたものとは異なっています。 This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. このサーバはより古い暗号化規格を使用しており、Mumbleの最新のバージョンによってもはやサポートされていません。 Server connection failed: %1. サーバへの接続に失敗しました: %1. Disconnected from server. サーバから切断しました。 Invalid username 無効なユーザ名 You connected with an invalid username, please try another one. 無効なユーザ名で接続しました。他の名前を試してください。 Username in use 使用しているユーザ名 That username is already in use, please try another username. そのユーザ名は既に使われています。他の名前を試してください。 Wrong certificate or password 証明書かパスワードが間違っています Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. 登録ユーザに対する証明書かパスワードが間違っています。このユーザが本当にパスワードによって保護されているなら、もう一度入力してください。そうでなければ、中断して証明書とユーザ名を確認してください。 Wrong password 誤ったパスワード Wrong server password for unregistered user account, please try again. 未登録ユーザのパスワードが違います。再度試してください。 Images (*.png *.jpg *.jpeg) C&onfigure 設定(&O) &Help ヘルプ(&H) Log ログ This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. 最近の動作を全て表示します。サーバへの接続、エラーや情報メッセージは全てここに表示されます。<br />ここにどのメッセージを表示するかを指定するには、メニューから<b>設定</b>コマンドを選んでください。 &Quit Mumble 終了(&Q) Closes the program プログラムを終了 Exits the application. アプリケーションを終了します。 Ctrl+Q Ctrl+Q Open the server connection dialog サーバ接続ダイアログを開く &Disconnect 切断(&D) Disconnect from server サーバから切断 Disconnects you from the server. サーバから切断します。 Show information about the server connection サーバとの接続についての情報を表示 This will show extended information about the connection to the server. サーバとの接続についての詳細な情報を表示します。 &Mute 発言禁止(&M) &Deafen 聴取禁止(&D) &Local Mute ローカルで発言禁止(&L) Send a Text Message テキストメッセージを送信 Sends a text message to another user. 他のユーザにテキストメッセージを送信します。 Add new channel 新しいチャンネルを追加 This adds a new sub-channel to the currently selected channel. 現在選択されているチャンネルに新たなサブチャンネルを追加します。 Remove channel チャンネルを削除 This removes a channel and all sub-channels. チャンネルと全てのサブチャンネルを削除します。 Edit Groups and ACL for channel チャンネルのグループとACLを編集 This opens the Group and ACL dialog for the channel, to control permissions. 権限を管理するため、チャンネルのグループとACLダイアログを開きます。 &Link リンク(&L) Link your channel to another channel あなたのいるチャンネルを他のチャンネルとリンクします This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. これはチャットバーです。<br /> テキストをここに打ち込み ENTERキーを押せば、テキストは選択されたユーザかチャンネルに送られます。どこも選択しなければ、あなたが現在いるチャンネルに送信されます。 Chatbar チャットバー Shows a dialog of registered servers, and also allows quick-connect. 登録済みのサーバのダイアログを表示し、高速に接続することを許可する。 Kick user (with reason) (理由付で)ユーザをキック Kick selected user off server. You'll be asked to specify a reason. サーバから選択されたユーザを追放します。あなたは追放する理由を尋ねられます。 Mute user ユーザの発言を禁止しました Mute or unmute user on server. Unmuting a deafened user will also undeafen them. サーバにいるユーザを発言禁止にしたり、解除したりします。聴取禁止になっているユーザに対して発言禁止の解除を行うと、聴取禁止も解除されます。 Kick and ban user (with reason) (理由付きで)ユーザをキックした後にバン Kick and ban selected user from server. You'll be asked to specify a reason. サーバから選択されたユーザのキックとバン。あなたは理由を尋ねられます。 Deafen user 発言禁止のユーザ Deafen or undeafen user on server. Deafening a user will also mute them. サーバ上のユーザを聴取禁止にしたり解除したりします。聴取禁止のユーザは発言も禁止になります。 Mute user locally ローカルでユーザを発言禁止にしました Mute or unmute user locally. Use this on other users in the same room. ローカルでユーザを発言禁止にします。同じ部屋にいるユーザに使ってください。 This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. あなたのいるチャンネルを選択されたチャンネルとリンクします。他方のチャンネルで発言する権限を持っていたら、ユーザはお互いを聞くことができます。これは恒久的なリンクであり、手動でリンクを解除されるかサーバがリスタートするまで続きます。push-to-linkのショートカットを見てください。 &Unlink Channel リンク解除(&U) Unlink your channel from another channel 他のチャンネルとのリンクを解除します This unlinks your current channel from the selected channel. 選択されたチャンネルとあなたのいるチャンネルのリンクを解除します。 Unlinks your channel from all linked channels. 他のチャンネルとのリンクを全て解除します。 This unlinks your current channel (not the selected one) from all linked channels. 全てのリンクされたチャンネルとあなたのいるチャンネル(選択されたものではありません)のリンクを解除します。 &Reset リセット(&R) Reset audio preprocessor 音声プリプロセッサをリセット This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. ノイズキャンセルや音声増幅や音声有効化の検出といった音声の前処理をリセットします。何かが起こって一時的に音声の環境が悪化するとき(マイクを落とした時など)、プリプロセッサの対応を待つのを避けるため、これを使ってください。 &Mute Self 自分を発言禁止(&M) Mute yourself あなた自身を発言禁止にします Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. あなた自身を発言禁止にしたり、解除したりします。発言禁止のとき、サーバに何もデータを送りません。聴取禁止の時に発言禁止の解除を行うと、聴取禁止も解除されます。 &Deafen Self 自分を聴取禁止(&D) Deafen yourself あなた自身を聴取禁止にします Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. あなた自身を聴取禁止にしたり、解除したりします。あなたは何も聞くことができません。聴取禁止にすると発言も禁止にします。 &Text-To-Speech テキスト読み上げ(&T) Toggle Text-To-Speech テキスト読み上げの切り替え Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. テキスト読み上げエンジンを有効にするかどうか。設定ダイアログにてテキスト読み上げが有効になっているメッセージのみ読み上げられます。 Display audio statistics 音声統計を表示 Pops up a small dialog with information about your current audio input. 現在の音声入力の情報を表示する小さなダイアログがポップアップします。 Forcibly unlink plugin 強制的にプラグインを外す This forces the current plugin to unlink, which is handy if it is reading completely wrong data. 現在のプラグインを強制的に外します。完全におかしなデータを読み込んでいるときに便利でしょう。 Configure Mumble Mumbleを設定 Allows you to change most settings for Mumble. Mumbleのいろいろな設定をします。 Start the audio configuration wizard 音声設定の設定ウィザードを開始します This will guide you through the process of configuring your audio hardware. サウンドハードウェアの設定プロセスに案内します。 &What's This? &What's This? Enter What's This? mode What's This?モードに移行します Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. クリックして"What's This?"モードに入ります。マウスカーソルはクエスチョンマークになって、何かボタンを押すと、選択されたメニューやエリアが何をするかの説明を表示します。 Information about Mumble Mumbleについての情報 Shows a small dialog with information and license for Mumble. Mumbleの情報やライセンスについての小さなダイアログを表示します。 Information about Speex Speexに関する情報 Shows a small dialog with information about Speex. Speexに関する情報のための小さなダイアログを表示します。 Information about Qt Qtについての情報 Shows a small dialog with information about Qt. Qtに関する情報のための小さなダイアログを表示します。 Check for &Updates 更新を確認(&U) Check for new version of Mumble Mumbleの新しいバージョンがあるか確認します Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. Mumbleのウェブページに接続して新しいバージョンが出ているかを確認します。もし新しいのが出ていたら適切なダウンロードURLを通知します。 Sends a text message to all users in a channel. チャンネル内の全てのユーザにテキストメッセージを送信します。 Configure certificates for strong authentication 強固な認証のための証明書を設定する This starts the wizard for creating, importing and exporting certificates for authentication against servers. サーバに対する認証のための証明書を、作成・インポート・エクスポートするためのウィザードを開始します。 Register user on server サーバ上でユーザを登録 This will permanently register the user on the server. 永久的にサーバにユーザ登録します。 Add &Friend フレンドに追加(&F) Adds a user as your friend. あなたのフレンドにユーザを追加する。 This will add the user as a friend, so you can recognize him on this and other servers. ユーザをフレンドとして追加します。他のサーバ上でもそのユーザを区別することができます。 &Remove Friend フレンドを削除する(&R) Removes a user from your friends. フレンドからユーザを削除します。 This will remove a user from your friends list. フレンドリストからユーザを削除します。 &Update Friend フレンドを更新(&U) Update name of your friend. フレンドの名前を更新します。 Your friend uses a different name than what is in your database. This will update the name. あなたのフレンドがデータベースに登録されているものと違う名前を使用しています。名前が更新されます。 Edit registered users list 登録済みユーザのリストを編集 This opens the editor for registered users, which allow you to change their name or unregister them. 権限を管理するため、登録済みユーザの編集ダイアログを開きます。(ユーザの名前を変更したり、登録を削除したり出来ます)。 Add or remove text-based access tokens アクセストークンを追加または削除する &Minimal View 小さく表示(&M) Toggle minimal window modes 小型ウインドウモードの切り替え This will toggle minimal mode, where the log window and menu is hidden. ログウインドウとメニューを省いた小型ウインドウの切り替えをします。 You muted and deafened %1. %1 を発言・聴取禁止にしました。 You unmuted and undeafened %1. %1 の発言・聴取の禁止を解除しました。 You undeafened %1. %1 の聴取禁止を解除しました。 You suppressed %1. %1 の発言を禁止しました。 %1 muted and deafened by %2. %2が%1の発言・聴取を禁止しました。 %1 unmuted and undeafened by %2. %2が%1の発言・聴取の禁止を解除しました。 %1 undeafened by %2. %2が%1の聴取禁止を解除しました。 %1 suppressed by %2. %2が%1の発言を禁止しました。 %1 moved to %2. %1は%2に移動しました。 %1 moved to %2 by %3. %1は%3によって%2に移動させられました。 %1 moved in from %2 by %3. %1は%3によって%2から移動させられました。 %1 is now muted and deafened. %1が発言禁止/聴取禁止状態になりました。 Your account information can not be verified currently. Please try again later Welcome message: %1 ようこそメッセージ: %1 Mumble: %1 You were denied %1 privileges in %2. あなたは %2 で %1 の権限を拒否されました。 %3 was denied %1 privileges in %2. %3は%2で%1の権限がありません。 Denied: Cannot modify SuperUser. 拒否: SuperUserを参照できません。 Denied: Invalid channel name. 拒否: 無効なチャンネル名です。 Denied: Text message too long. 拒否: テキストメッセージが長すぎます。 Denied: Operation not permitted in temporary channel. 拒否: 一時チャンネル上では許可されない操作です。 You need a certificate to perform this operation. この操作を実行するには証明書が必要です。 %1 does not have a certificate. %1は証明書を持っていません。 Invalid username: %1. 無効なユーザ名: %1。 Invalid username. 無効なユーザ名です。 Channel is full. チャンネルが満員です。 Channel nesting limit reached. チャンネルのネスト制限に達しました。 Channel count limit reached. Need to delete channels before creating new ones. Permission denied. 権限がありません。 %1 connected and entered channel. %1 connected. %1が接続しました。 %1 is now muted. %1が発言禁止状態になりました。 %1 is now unmuted. %1の発言禁止状態が解除されました。 Recording started 録音開始 Recording stopped 録音停止 %1 started recording. %1が録音を開始しました。 %1 stopped recording. %1が録音を停止しました。 You revoked your priority speaker status. You assumed priority speaker status. %1 revoked your priority speaker status. %1 gave you priority speaker status. You revoked priority speaker status for %1. You gave priority speaker status to %1. %1 revoked own priority speaker status. %1 assumed priority speaker status. %1 revoked priority speaker status for %2. %1 gave priority speaker status to %2. You were unmuted and undeafened by %1. %1 があなたを発言・聴取を禁止しました。 You were muted by %1. %1 があなたの発言を禁止しました。 You were undeafened by %1. %1 があなたの聴取禁止を解除しました。 You were suppressed. You were suppressed by %1. あなたの発言が禁止されました。 You were unsuppressed. あなたの発言禁止が解除されました。 You were unsuppressed by %1. あなたは %1 によって発言禁止を解除されました。 You joined %1. You moved %1 to %2. %1 is recording %1は録音しています %1 renamed to %2 by %3. %1 disconnected. %1が切断しました。 Server message from サーバ (Tree) (ツリー) (Channel) (チャンネル) (Private) %2%1: %3 Failed to load Opus, it will not be available for audio encoding/decoding. The server requests minimum client version %1 サーバは最低でもバージョン%1のクライアントを要求しています The server requests positional audio be enabled. サーバは位置音響を有効にすることを要求しています。 The server requests positional audio be disabled. サーバは位置音響を無効にすることを要求しています。 The server requests Push-to-Talk be enabled. サーバはプッシュ・トゥ・トークを有効にすることを要求しています。 The server requests Push-to-Talk be disabled. サーバはプッシュ・トゥ・トークを無効にすることを要求しています。 You were unmuted by %1. あなたは %1 によって発言禁止を解除されました。 You muted %1. あなたは %1 を発言禁止にしました。 You unsuppressed %1. あなたは %1 の発言禁止を解除しました。 You unmuted %1. あなたは %1 の発言禁止を解除しました。 %1 muted by %2. %2が%1を発言禁止にしました。 %1 unsuppressed by %2. %1が%2によって発言禁止を解除されました。 %1 unmuted by %2. %1は%2によって発言禁止を解除されました。 Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. 他のクライアントとマッチするCELTコーデックが見つかりません。あなたは全てのユーザとは話せないでしょう。 You were muted and deafened by %1. You were deafened by %1. %1 があなたの聴取を禁止しました。 You were kicked from the server by %1: %2. あなたは %1 によってサーバからキックされました: %2. %3 was kicked from the server by %1: %2. %3は%1によってサーバからキックされました: %2. You were kicked and banned from the server by %1: %2. あなたは %1 によってキックされ、サーバからBANされました: %2. %3 was kicked and banned from the server by %1: %2. %3は%1によってキックされ、サーバからBANされました: %2. You were moved to %1 by %2. %2 があなたを %1 に移動させました。 %1 entered channel. %1がチャンネルに入りました。 Server connection rejected: %1. サーバへの接続は拒否されました: %1. Denied: %1. 拒否されました: %1. %1 renamed to %2. %1 left channel and disconnected. Message from %1 %1 からのメッセージ You have User Dragging set to "Do Nothing" so the user wasn't moved. You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. チャンネルをドラッグしたときに "何もしない" ようにします; チャンネルが移動しなくなります。 Unknown Channel Drag mode in UserModel::dropMimeData. UserModel::dropMimeData で不明なチャンネルドラッグモードです。 Remote controlling Mumble: Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) -jn, --jackname Set custom Jack client name. --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status Invocation 呼び出し Error: No RPC command specified RPC Welcome to Mumble. Mumbleへようこそ。 Skipping version check in debug mode. デバッグモードではバージョン確認をスキップする。 Hide Frame フレームを隠す Toggle showing frame on minimal window 小さく表示したときにフレームを見せるか見せないかを切り替えます This will toggle whether the minimal window should have a frame for moving and resizing. 小さく表示したとき移動やサイズ変更のためにフレームを表示するかを切り替えます。 &Unlink All 全てのリンクを解除(&U) Reset the comment of the selected user. 選択したユーザのコメントをリセットする。 &Join Channel チャンネルに参加(&J) View comment in editor エディタでコメントを見ます Query server for connection information for user ユーザの接続情報のためのクエリ S&erver サーバ(&E) &Self 状態(&S) &Unlink Plugins プラグインをアンリンク(&U) Register yourself on the server サーバにあなたを登録します Change your avatar image on this server このサーバでのアバターイメージを変更します &Remove Avatar アバターを削除(&R) Remove currently defined avatar image. 現在、設定されている画像を削除します。 Icon Toolbar アイコンツールバー Change your own comment 自分のコメントを変更 Recording 録音 Priority Speaker 優先度スピーカ &Copy URL URLをコピー(&C) Copies a link to this channel to the clipboard. クリップボードにこのチャンネルへのリンクをコピーします。 Ignore Messages メッセージを無視する Locally ignore user's text chat messages. ユーザのテキストチャットメッセージをローカルで無視します。 Silently drops all text messages from the user. ユーザからのすべてのテキストメッセージを通知なしに無視します。 Edit ban list on server This lets you edit the server-side IP ban list. &Filter on/off Toggle the channel filter (Ctrl+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. Ctrl+F &Hide Channel when Filtering Reset the avatar of the selected user. Locally adjust the user's speech volume. Opens a dialog with a volume slider. Use this on other users in the same room. &Developer &Hide Mumble Hides the main Mumble window. Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. Show the Developer Console Shows the Mumble Developer Console, where Mumble's log output can be inspected. &Connect... &Ban list... &Information... &Kick... &Ban... Local Volume Adjustment... Send &Message... &Add... &Remove... &Edit... Audio S&tatistics... &Settings... &Audio Wizard... Developer &Console... &About... About &Speex... About &Qt... &Certificate Wizard... &Register... Registered &Users... Change &Avatar... &Access Tokens... Reset &Comment... Reset &Avatar... View Comment... &Change Comment... R&egister... Show Shows the main Mumble window. Manual Manual Mumble Positional Audio Position X Y Z m Heading Azimuth Elevation ° Meta data Context Identity Set State Linked Activated Unhinge NetworkConfig Network ネットワーク Updates are mandatory when using snapshot releases. snapshot がリリースされたときはアップデートが必須です。 Connection 接続 Use TCP compatibility mode Use TCP compatability mode TCP 互換モードを使用する <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). <b>TCP互換モードを有効にします。</b>.<br />この設定をするとMumbleがサーバとの通信にTCPのみを使用するようになります。この設定は通信のオーバーヘッドを増大させ、通信時に音声が途切れる原因になるので、デフォルトの設定(音声:UDP 操作:TCP)が使用できない場合だけ使用するのが良いでしょう。 Reconnect when disconnected 切断時に再接続を試みます <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. <b>切断時に再接続を試みます。</b><br />この設定をすると、サーバへの接続が失敗した際、10秒後に再接続を行います。 Reconnect automatically 自動的に再接続する Proxy プロキシ Type タイプ Type of proxy to connect through プロキシの接続タイプ Direct connection 直接接続 HTTP(S) proxy HTTP(S) プロキシ SOCKS5 proxy SOCKS5 プロキシ Hostname ホスト名 Hostname of the proxy プロキシのホスト名 Force TCP mode 強制的にTCPモードを使用する Enable QoS to prioritize packets 優先度付パケットのためにQoSを有効化 This will enable QoS, which will attempt to prioritize voice packets over other traffic. QoSを有効にします。QoS 他の通信トラフィックより音声パケットの優先順位を上げようとするものです。 Use Quality of Service QoS を使用する Don't send certificate to server and don't save passwords. (Not saved). サーバに証明書を送らず、パスワードも保存しない。 <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> <b>これはクライアントから個人情報の送信を抑制します。</b><p>クライアントは証明書を使用しませんし、接続のためのパスワードを保存しません。これはテストオプションで設定は保存されません。</p> Suppress certificate and password storage 証明書とパスワードの保存を抑制する <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>プロキシの接続タイプ。</b><br />プロキシを通して外向きの接続を行うようにします。 注意: プロキシ接続をする場合、強制的にTCP互換モードに変更されます。 全ての音声データは管理チャンネルを通して送信されるようになります。 <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. <b>プロキシのホスト名</b><br />このフィールドにはネットワークトラフィックを通過させたいプロキシのホスト名を設定します。 Port ポート Port number of the proxy プロキシのポート番号 <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. <b>プロキシのポート番号</b><br />プロキシへの接続に使うポート番号を指定します。 Username ユーザ名 Username for proxy authentication プロキシ認証のユーザ名 <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>プロキシ認証のユーザ名</b><br />プロキシサーバの認証に使用するユーザ名を指定します。プロキシサーバが認証を行わなない場合や、匿名で接続する場合はこのフィールドを空にしてください。 Password パスワード Password for proxy authentication プロキシ認証のパスワード <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>プロキシ認証のパスワード</b><br />プロキシサーバの認証に使うパスワードを指定します。プロキシサーバが認証を行わない場合や、匿名で接続する場合はこのフィールドを空にしてください。 Mumble services Mumble サービス Check for new releases of Mumble automatically. Mumbleの新しいリリースを自動的に確認する。 This will check for new releases of Mumble every time you start the program, and notify you if one is available. プログラムを起動する度に Mumble の新しいバージョンを確認し、存在すれば通知します。 Check for application updates on startup 開始時に Mumble の更新をチェックする Check for new releases of plugins automatically. プラグインの新しいリリースを自動的に確認する。 This will check for new releases of plugins every time you start the program, and download them automatically. プログラムが開始する度に新しいプラグインを確認し、存在すれば自動的にダウンロードする。 <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. <b>匿名で統計情報の送信</b>Mumble の開発チームの規模は小さいので、必要なものに開発の焦点をしぼる必要があります。統計情報を送信することで、プロジェクトがユーザが頻繁に使う機能が何であるのかを知り、開発の焦点をどこに定めるかを決める手助けとなります。 Submit anonymous statistics to the Mumble project Mumbleプロジェクトに匿名で統計を送信 Submit anonymous statistics 匿名で利用状況の統計を送信する Reconnect to last used server when starting Mumble Mumbleを起動したときに最後に使っていたサーバに再接続します Reconnect to last server on startup 起動時に最後に接続したサーバに再接続する Download plugin and overlay updates on startup 開始時にプラグインとオーバレイの更新をダウンロードする Privacy Prevent OS information being sent to Mumble servers and web servers <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. Do not send OS information to Mumble servers and web servers Overlay Silent 発言していない Talking 発言中 Whisper ささやき Shout 発言している Channel チャンネル Failed to create communication with overlay at %2: %1. No overlay will be available. オーバレイ: %2: %1 との通信の作成に失敗しました。有効なオーバレイはありません。 OverlayClient Filter フィルタ Only talking 話している人だけ Talking and recently active 発言と最近の活動 All in current channel 同じチャンネルにいる人全て All in linked channels リンクしているチャンネルにいる人全て Always show yourself 自分自身を常に表示する Configure recently active time (%1 seconds)... 最近の活動時間(%1秒)を設定します... Columns Sort ソート Alphabetically アルファベット順 Last state change 最後の状態変更 Edit... 編集... Reset Zoom ズームをリセット Configure recently active time 最近の活動時間を設定します Amount of seconds users remain active after talking: 発言後にユーザを活動したままにする秒数: OverlayConfig To move the users, drag the little red dot. ユーザを動かすには、小さな赤い点をドラッグしてください。 To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. ユーザのアバターのサイズを変えるには、ユーザの上でマウスホィールを動かしてください。 For more options, right click a user. For more options, rightclick a user. 更なる設定をするには、ユーザを右クリックしてください。 Launcher Filter Overlay オーバーレイ Choose executable 実行ファイルを選択 Choose application アプリケーションを選んでください Choose path Load Overlay Presets オーバレイプリセットを読み込み Mumble overlay presets (*.mumblelay) Mumbleオーバレイプリセット (*.mumblelay) Save Overlay Presets オーバレイのプリセットを保存 Options オプション Enable overlay. オーバーレイを有効にします。 Enable Overlay オーバーレイを有効にする This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. これはオーバレイを有功にするかそうでないかを設定します。この設定はアプリケーションが開始したときにのみチェックされます。Mumble が動作中であることと、アプリケーションが開始する前にこのオプションが有効になっていることを確認してください。<br />Mumble が開始した後にアプリケーションを開始しても、起動中にオーバレイを無効にしても、アプリケーションを際スタートしないとオーバレイを再開する安全な方法ではありません。 Layout レイアウト Blacklist ブラックリスト Whitelist ホワイトリスト Uninstall Overlay オーバレイをアンインストール Overlay Installation オーバレイのインストール Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. Mumble は Mumble オーバレイをインストールされていないことを検知しました。 下のボタンをクリックしてオーバレイをインストールしてください。 Install Mumble Overlay Mumble オーバレイのインストール Overlay Upgrade オーバレイのアップグレード Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. Mumble は古いバージョンのオーバレイサポートファイルがインストールされていることを検知しました。 これらのファイルを最新バージョンにアップグレードするために次のボタンを押してください。 Upgrade Mumble Overlay Mumble オーバレイのアップグレード Display a frame counter in the overlay オーバレイ上にフレームカウンタを表示します Show FPS counter FPSカウンタを表示する Load an overlay preset from file ファイルからオーバレイのプリセットを読み込みます Load… 読込… Save your overlay settings to file ファイルにオーバレイの設定を保存します Save… 保存… Set the overlay font. オーバレイのフォントを設定します。 Set the overlay text color. オーバレイテキストの色を設定します。 Color Remove 削除 Font フォント FPS and Clock Display Display a clock in the overlay showing the current local time (system time). Show Clock Overlay Exceptions Overlay Exception Mode Allowed launchers Add Allowed programs Allowed paths Blacklisted programs OverlayEditor State 状態 User is not talking ユーザは話していない Passive 受身 User is talking in your channel or a linked channel ユーザはあなたのいるチャンネルかリンクしているチャンネルで話しています Talking 発言中 User is whispering to you privately ユーザはあなたに個人的にささやいています Private Whisper 個人的なささやき User is shouting to your channel ユーザはあなたのいるチャンネルに叫んでいます Channel Whisper チャンネルへのささやき Zoom ズーム Zoom Factor 拡大する要素 Enabled Elements 有効な要素 User avatar, chosen by each user ユーザのアバター、それぞれのユーザによって選択されたものです Avatar アバター User's name ユーザの名前 Username ユーザ名 Name of user's channel, if outside your current channel ユーザのチャンネルの名前、あなたのいるチャンネルの外にいる場合 Channel チャンネル Muted or deafened 発言禁止か聴取禁止 Mute state 発言禁止状態 Bounding box, automatically shrunk to minimum size to contain all visible elements バウンディグボックス、全ての可視要素を含む最小のサイズに自動的に縮みます Bounding box バウンディングボックス Overlay Editor オーバレイ エディタ OverlayEditorScene Layout preset レイアウトプリセット Large square avatar 大きな四角のアバター Avatar and Name アバターと名前 User Opacity ユーザの不透明度 %1% %1% Object Opacity オブジェクトの不透明度 Alignment 位置付け Left Center 中央 Right Top Bottom Color... 色... Font... フォント... Bounding box バウンディングボックス Pen width ペン幅 Padding パディング Pen color ペンの色 Fill color 塗りつぶしの色 Pick pen color ペンの色を取得 Pick fill color 塗りつぶしの色を取得 Pick color 色の選択 Pick font フォントの選択 PluginConfig Plugins プラグイン Plugin has no configure function. プラグインに設定機能がありません。 Plugin has no about function. プラグインの設定項目がありません。 Options オプション Enable plugins and transmit positional information プラグインを有効にすると位置情報を送信します This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. この設定は、サポートされたゲームのプラグインが位置情報を取得して、音声パケットと共に送信することを可能にします。他のユーザから見て、ゲーム内であなたのキャラクタがいる方向から声が聞こえるようにすることができます。 Link to Game and Transmit Position ゲームと送信位置をリンクさせる Reloads all plugins 全てのプラグインを再読み込みします This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. プラグインを再読み込みします。プラグインのディレクトリに追加したり、変更を行ったときに使用してください。 &Reload plugins プラグイン再読み込み(&R) Information about plugin プラグインについての情報 This shows a small information message about the plugin. プラグインについての簡単な情報を表示します。 &About 概要(&A) Show configuration page of plugin プラグインの設定項目を表示 This shows the configuration page of the plugin, if any. プラグインの設定ページがあれば表示します。 &Configure 設定(&C) Name 名前 Enabled 有効化 Plugins Skipping plugin update in debug mode. デバッグモードではプラグインのアップデートはスキップします。 Downloaded new or updated plugin to %1. 更新されたプラグインを %1 にダウンロードしました。 Failed to install new plugin to %1. %1 に新しいプラグインをインストールできません。 %1 lost link. %1 はリンクを失いました。 %1 linked. %1 はリンクされました。 PortAudioSystem Default Device デフォルトデバイス PulseAudioSystem Default Input デフォルト入力 Default Output デフォルト出力 QApplication Failed to restart mumble Mumble failed to restart itself. Please restart it manually. RichTextEditor Failed to load image 画像の読み込みに失敗 Image file too large to embed in document. Please use images smaller than %1 kB. ドキュメントに埋め込むには画像ファイルが大きすぎます。 %1 kB より小さい画像を使用してください。 Message is too long. メッセージが長すぎます。 Display 表示 Source Text ソーステキスト &Bold 太字体(&B) Ctrl+B &Italic イタリック体(&I) Italic イタリック体 Ctrl+I Underline 下線 Ctrl+U Color Insert Link リンクを挿入 Ctrl+L Insert Image 画像を挿入 RichTextEditorLink Add Link リンクを追加 URL Text テキスト ServerHandler Unable to resolve hostname Server is not responding to TCP pings UDP packets cannot be sent to or received from the server. Switching to TCP mode. UDP パケットをサーバに送ることができないか、サーバから受けとることができません。TCPモードに切り替えます。 UDP packets cannot be sent to the server. Switching to TCP mode. UDPパケットをサーバに送ることができません。TCPモードに切り替えます。 UDP packets cannot be received from the server. Switching to TCP mode. UDPパケットをサーバから受けとることができません。TCPモードに切り替えます。 UDP packets can be sent to and received from the server. Switching back to UDP mode. UDPパケットのサーバへの送受信ができるようになりました。UDPモードに切り替えます。 Connection timed out 接続がタイムアウトになりました ServerView Favorite お気に入り LAN ローカル Public Internet インターネット Unknown Africa アフリカ Asia アジア North America 北アメリカ South America 南アメリカ Europe ヨーロッパ Oceania オセアニア ShortcutActionWidget Unassigned 未割り当て ShortcutDelegate On オン Off オフ Toggle 切り替え Unassigned 未割り当て ShortcutKeyWidget Press Shortcut ショートカットを押下 ShortcutTargetDialog Root ルート Parent Current 現在 Subchannel #%1 サブチャンネル #%1 ShortcutTargetWidget ... , Root ルート Parent Current 現在 Subchannel #%1 サブチャンネル #%1 Invalid 無効 Empty <Empty> <空欄> ShortcutToggleWidget Off オフ Toggle 切り替え On オン TextMessage Enter text テキストを入力 If checked the message is recursively sent to all subchannels チェックすると全てのサブチャンネルに再帰的にメッセージが送信されます Send recursively to subchannels 再帰的にサブチャンネルに送る Tokens Empty Token 空のトークン Mumble - Access Tokens Mumble - アクセストークン List of access tokens on current server 現在のサーバのアクセストークンのリスト <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. <b>接続しているサーバのアクセストークンを編集することができます。</b> <br /> アクセストークンはチャンネルへのアクセスをとても単純に管理するパスワードとして使うことが可能な文字列です。 Mumble はあなたが使ったトークンを記録して、次にサーバに接続した際に送り直します。つまり、毎回入力する必要は無いのです。 Add a token トークンを追加 &Add 追加(&A) Remove a token トークンを削除 &Remove 削除(&R) UserEdit Registered Users 登録済みのユーザ Remove 削除 Rename 名前を変更 Who are you looking for? Days Weeks Months Years Inactive for Registered users: %n account(s) UserInformation User Information ユーザ情報 Connection Information 接続情報 Version バージョン OS Certificate 証明書 IP Address IPアドレス CELT Versions CELTバージョン Details... 詳細... Ping Statistics Ping 統計 Pings received 受け取ったPing Average ping 平均ping TCP (Control) TCP (制御) UDP (Voice) UDP (音声) UDP Network statistics UDP ネットワーク統計 Good 良好 Late 遅延 Lost 消失 Resync 再同期 From Client クライアントから To Client クライアント宛 Connection time 接続時間 %1w %1週間 %1d %1日 %1h %1時間 %1m %1分 %1s %1秒 , %1 (%2) %1.%2.%3 (%4) Supported サポートされています Not Supported サポートされません Not Reported 報告されません %1 online (%2 idle) オンライン時間 %1 (アイドル時間 %2) %1 online オンライン時間 %1 %1 kbit/s Bandwidth GroupBox ネットワーク帯域 Bandwidth Label ネットワーク帯域 Ping deviation Pingのばらつき UserListModel Nick Inactive days Last channel Last seen: %1 Never Channel ID: %1 UserLocalVolumeDialog Local volume for other users <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. Adjusting local volume for %1 dB <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: サーバに接続しているユーザです。ユーザの左側のアイコンは彼らが話しているかどうかを意味します: Talking to your channel. あなたのいるチャンネルに話しています。 Shouting directly to your channel. Whispering directly to your channel. チャンネルに直接ささやいています。 Whispering directly to you. あなたに直接ささやいています。 Not talking. 話していません。 This is a channel on the server. The icon indicates the state of the channel: サーバ上のチャンネルです。アイコンはチャンネルの状態を意味します : Your current channel. 現在のチャンネル。 A channel that is linked with your channel. Linked channels can talk to each other. あなたのチャンネルとリンクしているチャンネルです。リンクしているチャンネルは互いに話せます。 A channel on the server that you are not linked to. あなたがリンクしていないサーバ上のチャンネルです。 This shows the flags the user has on the server, if any: ユーザがサーバ上で持っているフラグを表示します: On your friend list 友人リスト上 Authenticated user 認証されたユーザ Muted (manually muted by self) 発言禁止(自身で発言を禁止に) Muted (manually muted by admin) 発言禁止(管理者によって発言禁止に) Muted (not allowed to speak in current channel) 発言禁止(このチャンネルで発言が許されていない) Muted (muted by you, only on your machine) 発言禁止(自分で発言禁止にし、またあなたのマシンのみ) Muted (push-to-mute) Deafened (by self) 聴取禁止(自身により) Deafened (by admin) 聴取禁止(管理者により) User has a new comment set (click to show) ユーザは新しいコメントを持っています(見るためにはクリックしてください) User has a comment set, which you've already seen. (click to show) ユーザはあなたが既に見たコメントを持っています。(見るにはクリックしてください) Ignoring Text Messages テキストメッセージを無視します This shows the flags the channel has, if any: チャンネルが持っているフラグを表示します: Channel has a new comment set (click to show) チャンネルは新しいコメントをもっています。(見るためにはクリックしてください) Channel has a comment set, which you've already seen. (click to show) チャンネルはあなたが既に見たコメントを持っています。(見るためにはクリックしてください) Channel will be hidden when filtering is enabled Name 名前 Flags フラグ Are you sure you want to drag this user? Are you sure you want to drag this channel? 本当にこのチャンネルをドラッグしますか ? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. 自動的にこの移動を実行できません。数値的な並び替えの指標をリセットするか手動で調整してください。 VersionCheck Upgrade Mumble Mumble のアップグレード A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? Mumble の新しいバージョンが見つかり、自動的にダウンロードされました。このバージョンにアップグレードするか、最新の安定リリースにダウングレードすることが推奨されます。このインストーラを起動しますか? Failed to launch snapshot installer. snapshot のインストーラの起動に失敗しました。 Corrupt download of new version detected. Automatically removed. 新しいバージョンの破損したダウンロードが検知されました。自動的に削除されました。 Downloading new snapshot from %1 to %2 %1 から %2 に新しい snapshot をダウンロード中です Failed to write new version to disk. Failed to write new version to disc. ディスクに新しいバージョンを書きこむことに失敗しました。 Mumble failed to retrieve version information from the central server. Mumble は中央サーバからのバージョン情報の取得に失敗しました。 ViewCert Certificate Chain Details 証明書階層の詳細 Certificate chain 証明書の階層 Certificate details 証明の内容 Common Name Organization Subunit Country Locality State Valid from: %1 発行者: %1 Valid to: %1 発行対象: %1 Serial: %1 シリアル番号: %1 Public Key: %1 bits %2 公開鍵: %1 ビット %2 RSA RSA DSA DSA Digest (SHA-1): %1 ダイジェスト(SHA-1): %1 Digest (SHA-256): %1 Email: %1 Eメール: %1 DNS: %1 Issued by: 発行者: Unit Name VoiceRecorder Recorder failed to create directory '%1' レコーダはディレクトリ'%1'の作成に失敗しました Recorder failed to open file '%1' .wav - Uncompressed .wav - 無圧縮 .ogg (Vorbis) - Compressed .ogg (Vorbis) - 圧縮 .au - Uncompressed .au - 無圧縮 .flac - Lossless compressed .flac - ロスレス圧縮 VoiceRecorderDialog Recorder レコーダ Control 制御 00:00:00 00:00:00 &Start 開始(&S) S&top 停止(&T) Mode モード Multichannel マルチチャンネル Output 出力 Output format 出力形式 Target directory 対象のディレクトリ Filename ファイル名 &Browse... 参照(&B)... Valid variables are: 有効な変数は: Inserts the user's name ユーザ名を挿入 Inserts the current date 現在の日付を挿入 Inserts the current time 現在の時間を挿入 Inserts the hostname ホスト名を挿入 Recorder still running Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? Unable to start recording. Not connected to a server. 録音を開始できません。サーバに接続していません。 The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. 現在接続しているサーバは1.2.2以前のバージョンです。プライバシーの問題で、1.2.3より古いバージョンのサーバ上では録音できません。 詳しくはサーバ管理者に連絡してください。 There is already a recorder active for this server. このサーバのレコーダがすでに有効です。 Please select a recording format. 録音形式を選択してください。 Stopping Select target directory 対象のディレクトリを選択 Downmix ダウンミックス WASAPIInput Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone. WASAPISystem Default Device デフォルトデバイス qwPTTButtonWidget Mumble PTT Push to talk プッシュ・トゥ・トーク mumble-1.3.4/src/mumble/ALSAAudio.cpp0000664000175000017500000004042514010707273017124 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include #include #include "ALSAAudio.h" #include "MainWindow.h" #include "Global.h" #include "User.h" #define NBLOCKS 8 class ALSAEnumerator { public: QHash qhInput; QHash qhOutput; static QString getHint(void *hint, const char *id); ALSAEnumerator(); }; static ALSAEnumerator *cards = NULL; class ALSAAudioInputRegistrar : public AudioInputRegistrar { public: ALSAAudioInputRegistrar(); virtual AudioInput *create(); virtual const QList getDeviceChoices(); virtual void setDeviceChoice(const QVariant &, Settings &); virtual bool canEcho(const QString &) const; }; class ALSAAudioOutputRegistrar : public AudioOutputRegistrar { public: ALSAAudioOutputRegistrar(); virtual AudioOutput *create(); virtual const QList getDeviceChoices(); virtual void setDeviceChoice(const QVariant &, Settings &); }; class ALSAInit : public DeferInit { protected: ALSAAudioInputRegistrar *pairALSA; ALSAAudioOutputRegistrar *paorALSA; public: void initialize(); void destroy(); }; static ALSAInit aiInit; QMutex qmALSA; void ALSAInit::initialize() { pairALSA = NULL; paorALSA = NULL; cards = NULL; int card = -1; snd_card_next(&card); if (card != -1) { pairALSA = new ALSAAudioInputRegistrar(); paorALSA = new ALSAAudioOutputRegistrar(); cards = new ALSAEnumerator(); } else { qWarning("ALSAInit: No cards found, not initializing"); } } void ALSAInit::destroy() { QMutexLocker qml(&qmALSA); delete pairALSA; delete paorALSA; delete cards; } ALSAAudioInputRegistrar::ALSAAudioInputRegistrar() : AudioInputRegistrar(QLatin1String("ALSA"),5) { } AudioInput *ALSAAudioInputRegistrar::create() { return new ALSAAudioInput(); } const QList ALSAAudioInputRegistrar::getDeviceChoices() { QList qlReturn; QStringList qlInputDevs = cards->qhInput.keys(); qSort(qlInputDevs); if (qlInputDevs.contains(g.s.qsALSAInput)) { qlInputDevs.removeAll(g.s.qsALSAInput); qlInputDevs.prepend(g.s.qsALSAInput); } foreach(const QString &dev, qlInputDevs) { QString t=QString::fromLatin1("[%1] %2").arg(dev, cards->qhInput.value(dev)); qlReturn << audioDevice(t, dev); } return qlReturn; } void ALSAAudioInputRegistrar::setDeviceChoice(const QVariant &choice, Settings &s) { s.qsALSAInput = choice.toString(); } bool ALSAAudioInputRegistrar::canEcho(const QString &) const { return false; } ALSAAudioOutputRegistrar::ALSAAudioOutputRegistrar() : AudioOutputRegistrar(QLatin1String("ALSA"), 5) { } AudioOutput *ALSAAudioOutputRegistrar::create() { return new ALSAAudioOutput(); } const QList ALSAAudioOutputRegistrar::getDeviceChoices() { QList qlReturn; QStringList qlOutputDevs = cards->qhOutput.keys(); qSort(qlOutputDevs); if (qlOutputDevs.contains(g.s.qsALSAOutput)) { qlOutputDevs.removeAll(g.s.qsALSAOutput); qlOutputDevs.prepend(g.s.qsALSAOutput); } foreach(const QString &dev, qlOutputDevs) { QString t=QString::fromLatin1("[%1] %2").arg(dev, cards->qhOutput.value(dev)); qlReturn << audioDevice(t, dev); } return qlReturn; } void ALSAAudioOutputRegistrar::setDeviceChoice(const QVariant &choice, Settings &s) { s.qsALSAOutput = choice.toString(); } ALSAEnumerator::ALSAEnumerator() { QMutexLocker qml(&qmALSA); qhInput.insert(QLatin1String("default"), ALSAAudioInput::tr("Default ALSA Card")); qhOutput.insert(QLatin1String("default"), ALSAAudioOutput::tr("Default ALSA Card")); #if SND_LIB_VERSION >= 0x01000e void **hints = NULL; void **hint; snd_config_t *basic = NULL; int r; snd_config_update(); r = snd_config_search(snd_config, "defaults.namehint.extended", &basic); if ((r==0) && basic) { if (snd_config_set_ascii(basic, "on")) qWarning("ALSAEnumerator: Failed to set namehint"); } else { qWarning("ALSAEnumerator: Namehint not found"); } r = snd_device_name_hint(-1, "pcm", &hints); if (r || ! hints) { qWarning("ALSAEnumerator: snd_device_name_hint: %d", r); } else { hint = hints; while (*hint) { const QString name = getHint(*hint, "NAME"); const QString ioid = getHint(*hint, "IOID"); QString desc = getHint(*hint, "DESC"); desc.replace(QLatin1Char('\n'), QLatin1Char(' ')); // ALSA, in it's infinite wisdom, claims "dmix" is an input/output device. // Since there seems to be no way to fetch the ctl interface for a matching device string // without actually opening it, we'll simply have to start guessing. bool caninput = (ioid.isNull() || (ioid.compare(QLatin1String("Input"), Qt::CaseInsensitive)==0)); bool canoutput = (ioid.isNull() || (ioid.compare(QLatin1String("Output"), Qt::CaseInsensitive)==0)); if (name.startsWith(QLatin1String("dmix:"))) caninput = false; else if (name.startsWith(QLatin1String("dsnoop:"))) canoutput = false; if (caninput) qhInput.insert(name, desc); if (canoutput) qhOutput.insert(name, desc); ++hint; } snd_device_name_free_hint(hints); } snd_config_update_free_global(); snd_config_update(); #else int card=-1; snd_card_next(&card); while (card != -1) { char *name; snd_ctl_t *ctl=NULL; snd_card_get_longname(card, &name); QByteArray dev=QString::fromLatin1("hw:%1").arg(card).toUtf8(); if (snd_ctl_open(&ctl, dev.data(), SND_CTL_READONLY) >= 0) { snd_pcm_info_t *info = NULL; snd_pcm_info_malloc(&info); char *cname = NULL; snd_card_get_name(card, &cname); int device = -1; snd_ctl_pcm_next_device(ctl, &device); bool play = false; bool cap = false; while (device != -1) { QString devname=QString::fromLatin1("hw:%1,%2").arg(card).arg(device); snd_pcm_info_set_device(info, device); snd_pcm_info_set_stream(info, SND_PCM_STREAM_CAPTURE); if (snd_ctl_pcm_info(ctl,info) == 0) { QString fname=QString::fromLatin1(snd_pcm_info_get_name(info)); qhInput.insert(devname,fname); cap = true; } snd_pcm_info_set_stream(info, SND_PCM_STREAM_PLAYBACK); if (snd_ctl_pcm_info(ctl,info) == 0) { QString fname=QString::fromLatin1(snd_pcm_info_get_name(info)); qhOutput.insert(devname,fname); play = true; } snd_ctl_pcm_next_device(ctl, &device); } if (play) { qhOutput.insert(QString::fromLatin1("dmix:CARD=%1").arg(card),QLatin1String(cname)); } if (cap) { qhInput.insert(QString::fromLatin1("dsnoop:CARD=%1").arg(card),QLatin1String(cname)); } snd_pcm_info_free(info); snd_ctl_close(ctl); } snd_card_next(&card); } #endif } QString ALSAEnumerator::getHint(void *hint, const char *id) { QString s; #if SND_LIB_VERSION >= 0x01000e char *value = snd_device_name_get_hint(hint, id); if (value) { s = QLatin1String(value); free(value); } #endif return s; } ALSAAudioInput::ALSAAudioInput() { bRunning = true; } ALSAAudioInput::~ALSAAudioInput() { // Signal input thread to end bRunning = false; wait(); } #define ALSA_ERRBAIL(x) if (!bOk) {} else if ((err=static_cast(x)) < 0) { bOk = false; qWarning("ALSAAudio: %s: %s", #x, snd_strerror(err));} #define ALSA_ERRCHECK(x) if (!bOk) {} else if ((err=static_cast(x)) < 0) {qWarning("ALSAAudio: Non-critical: %s: %s", #x, snd_strerror(err));} void ALSAAudioInput::run() { QMutexLocker qml(&qmALSA); snd_pcm_sframes_t readblapp; QByteArray device_name = g.s.qsALSAInput.toLatin1(); snd_pcm_hw_params_t *hw_params = NULL; snd_pcm_t *capture_handle = NULL; unsigned int rrate = SAMPLE_RATE; bool bOk = true; int err = 0; unsigned int iChannels = 1; qWarning("ALSAAudioInput: Initing audiocapture %s.",device_name.data()); snd_pcm_hw_params_alloca(&hw_params); ALSA_ERRBAIL(snd_pcm_open(&capture_handle, device_name.data(), SND_PCM_STREAM_CAPTURE, 0)); ALSA_ERRCHECK(snd_pcm_hw_params_any(capture_handle, hw_params)); ALSA_ERRBAIL(snd_pcm_hw_params_set_access(capture_handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED)); ALSA_ERRBAIL(snd_pcm_hw_params_set_format(capture_handle, hw_params, SND_PCM_FORMAT_S16)); ALSA_ERRBAIL(snd_pcm_hw_params_set_rate_near(capture_handle, hw_params, &rrate, NULL)); ALSA_ERRBAIL(snd_pcm_hw_params_set_channels_near(capture_handle, hw_params, &iChannels)); snd_pcm_uframes_t wantPeriod = (rrate * iFrameSize) / SAMPLE_RATE; snd_pcm_uframes_t wantBuff = wantPeriod * 8; ALSA_ERRBAIL(snd_pcm_hw_params_set_period_size_near(capture_handle, hw_params, &wantPeriod, NULL)); ALSA_ERRBAIL(snd_pcm_hw_params_set_buffer_size_near(capture_handle, hw_params, &wantBuff)); ALSA_ERRBAIL(snd_pcm_hw_params(capture_handle, hw_params)); qWarning("ALSAAudioInput: Actual buffer %d hz, %d channel %ld samples [%ld per period]",rrate,iChannels,wantBuff,wantPeriod); ALSA_ERRBAIL(snd_pcm_hw_params_current(capture_handle, hw_params)); ALSA_ERRBAIL(snd_pcm_hw_params_get_channels(hw_params, &iMicChannels)); ALSA_ERRBAIL(snd_pcm_hw_params_get_rate(hw_params, &iMicFreq, NULL)); #ifdef ALSA_VERBOSE snd_output_t *log; snd_output_stdio_attach(&log, stderr,0); if (capture_handle) snd_pcm_dump(capture_handle, log); #endif ALSA_ERRBAIL(snd_pcm_prepare(capture_handle)); ALSA_ERRBAIL(snd_pcm_start(capture_handle)); if (! bOk) { if (capture_handle) { snd_pcm_drain(capture_handle); snd_pcm_close(capture_handle); capture_handle = NULL; } g.mw->msgBox(tr("Opening chosen ALSA Input failed: %1").arg(Qt::escape(QLatin1String(snd_strerror(err))))); return; } eMicFormat = SampleShort; initializeMixer(); char inbuff[wantPeriod * iChannels * sizeof(short)]; qml.unlock(); while (bRunning) { #ifdef ALSA_VERBOSE snd_pcm_status_malloc(&status); snd_pcm_status(capture_handle, status); snd_pcm_status_dump(status, log); snd_pcm_status_free(status); #endif readblapp = snd_pcm_readi(capture_handle, inbuff, static_cast(wantPeriod)); if (readblapp == -ESTRPIPE) { qWarning("ALSAAudioInput: PCM suspended, trying to resume"); while (bRunning && snd_pcm_resume(capture_handle) == -EAGAIN) msleep(1000); if ((err = snd_pcm_prepare(capture_handle)) < 0) qWarning("ALSAAudioInput: %s: %s", snd_strerror(static_cast(readblapp)), snd_strerror(err)); } else if (readblapp == -EPIPE) { err = snd_pcm_prepare(capture_handle); qWarning("ALSAAudioInput: %s: %s", snd_strerror(static_cast(readblapp)), snd_strerror(err)); } else if (readblapp < 0) { err = snd_pcm_prepare(capture_handle); qWarning("ALSAAudioInput: %s: %s", snd_strerror(static_cast(readblapp)), snd_strerror(err)); } else if (wantPeriod == static_cast(readblapp)) { addMic(inbuff, static_cast(readblapp)); } } snd_pcm_drop(capture_handle); snd_pcm_close(capture_handle); qWarning("ALSAAudioInput: Releasing ALSA Mic."); } ALSAAudioOutput::ALSAAudioOutput() { qWarning("ALSAAudioOutput: Initialized"); bRunning = true; } ALSAAudioOutput::~ALSAAudioOutput() { bRunning = false; // Call destructor of all children wipe(); // Wait for terminate wait(); qWarning("ALSAAudioOutput: Destroyed"); } void ALSAAudioOutput::run() { QMutexLocker qml(&qmALSA); snd_pcm_t *pcm_handle = NULL; struct pollfd fds[16]; int count; bool stillRun = true; int err = 0; bool bOk = true; snd_pcm_hw_params_t *hw_params = NULL; snd_pcm_sw_params_t *sw_params = NULL; QByteArray device_name = g.s.qsALSAOutput.toLatin1(); snd_pcm_hw_params_alloca(&hw_params); snd_pcm_sw_params_alloca(&sw_params); ALSA_ERRBAIL(snd_pcm_open(&pcm_handle, device_name.data(), SND_PCM_STREAM_PLAYBACK, 0)); ALSA_ERRCHECK(snd_pcm_hw_params_any(pcm_handle, hw_params)); if (g.s.doPositionalAudio()) { iChannels = 1; ALSA_ERRBAIL(snd_pcm_hw_params_get_channels_max(hw_params, &iChannels)); if (iChannels > 9) { qWarning("ALSAAudioOutput: ALSA reports %d output channels. Clamping to 2.",iChannels); iChannels = 2; } } else { iChannels = 1; } ALSA_ERRBAIL(snd_pcm_hw_params_set_access(pcm_handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED)); ALSA_ERRBAIL(snd_pcm_hw_params_set_format(pcm_handle, hw_params, SND_PCM_FORMAT_S16)); ALSA_ERRBAIL(snd_pcm_hw_params_set_channels_near(pcm_handle, hw_params, &iChannels)); unsigned int rrate = SAMPLE_RATE; ALSA_ERRBAIL(snd_pcm_hw_params_set_rate_near(pcm_handle, hw_params, &rrate, NULL)); unsigned int iOutputSize = (iFrameSize * rrate) / SAMPLE_RATE; snd_pcm_uframes_t period_size = iOutputSize; snd_pcm_uframes_t buffer_size = iOutputSize * (g.s.iOutputDelay + 1); int dir = 1; ALSA_ERRBAIL(snd_pcm_hw_params_set_period_size_near(pcm_handle, hw_params, &period_size, &dir)); ALSA_ERRBAIL(snd_pcm_hw_params_set_buffer_size_near(pcm_handle, hw_params, &buffer_size)); ALSA_ERRBAIL(snd_pcm_hw_params(pcm_handle, hw_params)); ALSA_ERRBAIL(snd_pcm_hw_params_current(pcm_handle, hw_params)); ALSA_ERRBAIL(snd_pcm_hw_params_get_period_size(hw_params, &period_size, &dir)); ALSA_ERRBAIL(snd_pcm_hw_params_get_buffer_size(hw_params, &buffer_size)); qWarning("ALSAAudioOutput: Actual buffer %d hz, %d channel %ld samples [%ld per period]",rrate,iChannels,buffer_size,period_size); ALSA_ERRBAIL(snd_pcm_sw_params_current(pcm_handle, sw_params)); ALSA_ERRBAIL(snd_pcm_sw_params_set_avail_min(pcm_handle, sw_params, period_size)); ALSA_ERRBAIL(snd_pcm_sw_params_set_start_threshold(pcm_handle, sw_params, buffer_size - period_size)); ALSA_ERRBAIL(snd_pcm_sw_params_set_stop_threshold(pcm_handle, sw_params, buffer_size)); ALSA_ERRBAIL(snd_pcm_sw_params(pcm_handle, sw_params)); #ifdef ALSA_VERBOSE snd_output_t *log; snd_output_stdio_attach(&log, stderr,0); if (pcm_handle) snd_pcm_dump(pcm_handle, log); #endif ALSA_ERRBAIL(snd_pcm_prepare(pcm_handle)); const unsigned int buffsize = static_cast(period_size * iChannels); float zerobuff[buffsize]; float outbuff[buffsize]; for (unsigned int i=0;imsgBox(tr("Opening chosen ALSA Output failed: %1").arg(Qt::escape(QLatin1String(snd_strerror(err))))); if (pcm_handle) { snd_pcm_close(pcm_handle); pcm_handle = NULL; } return; } const unsigned int chanmasks[32] = { SPEAKER_FRONT_LEFT, SPEAKER_FRONT_RIGHT, SPEAKER_BACK_LEFT, SPEAKER_BACK_RIGHT, SPEAKER_FRONT_CENTER, SPEAKER_LOW_FREQUENCY, SPEAKER_SIDE_LEFT, SPEAKER_SIDE_RIGHT, SPEAKER_BACK_CENTER }; ALSA_ERRBAIL(snd_pcm_hw_params_current(pcm_handle, hw_params)); ALSA_ERRBAIL(snd_pcm_hw_params_get_channels(hw_params, &iChannels)); ALSA_ERRBAIL(snd_pcm_hw_params_get_rate(hw_params, &rrate, NULL)); iMixerFreq = rrate; eSampleFormat = SampleShort; qWarning("ALSAAudioOutput: Initializing %d channel, %d hz mixer", iChannels, iMixerFreq); initializeMixer(chanmasks); count = snd_pcm_poll_descriptors_count(pcm_handle); snd_pcm_poll_descriptors(pcm_handle, fds, count); qml.unlock(); while (bRunning && bOk) { poll(fds, count, 20); unsigned short revents; snd_pcm_poll_descriptors_revents(pcm_handle, fds, count, &revents); if (revents & POLLERR) { snd_pcm_prepare(pcm_handle); } else if (revents & POLLOUT) { snd_pcm_sframes_t avail{}; ALSA_ERRCHECK(avail = snd_pcm_avail_update(pcm_handle)); while (avail >= static_cast(period_size)) { stillRun = mix(outbuff, static_cast(period_size)); if (stillRun) { snd_pcm_sframes_t w = 0; ALSA_ERRCHECK(w=snd_pcm_writei(pcm_handle, outbuff, period_size)); if (w < 0) { avail = w; break; } } else break; ALSA_ERRCHECK(avail = snd_pcm_avail_update(pcm_handle)); } if (avail == -EPIPE) { snd_pcm_drain(pcm_handle); ALSA_ERRCHECK(snd_pcm_prepare(pcm_handle)); for (unsigned int i=0;i< buffer_size / period_size;++i) ALSA_ERRCHECK(snd_pcm_writei(pcm_handle, zerobuff, period_size)); } if (! stillRun) { snd_pcm_drain(pcm_handle); while (bRunning && !mix(outbuff, static_cast(period_size))) { this->msleep(10); } if (! bRunning) break; snd_pcm_prepare(pcm_handle); // Fill one frame for (unsigned int i = 0; i < (buffer_size / period_size) - 1 ; i++) snd_pcm_writei(pcm_handle, zerobuff, period_size); snd_pcm_writei(pcm_handle, outbuff, period_size); } } } snd_pcm_close(pcm_handle); } mumble-1.3.4/src/mumble/GlobalShortcut_macx.mm0000664000175000017500000003263214010707273021216 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #import #import #include "GlobalShortcut_macx.h" #include "OverlayClient.h" #define MOD_OFFSET 0x10000 #define MOUSE_OFFSET 0x20000 GlobalShortcutEngine *GlobalShortcutEngine::platformInit() { return new GlobalShortcutMac(); } CGEventRef GlobalShortcutMac::callback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *udata) { GlobalShortcutMac *gs = reinterpret_cast(udata); unsigned int keycode; bool suppress = false; bool forward = false; bool down = false; int64_t repeat = 0; Q_UNUSED(proxy); switch (type) { case kCGEventLeftMouseDown: case kCGEventRightMouseDown: case kCGEventOtherMouseDown: down = true; case kCGEventLeftMouseUp: case kCGEventRightMouseUp: case kCGEventOtherMouseUp: { keycode = static_cast(CGEventGetIntegerValueField(event, kCGMouseEventButtonNumber)); suppress = gs->handleButton(MOUSE_OFFSET+keycode, down); /* Suppressing "the" mouse button is probably not a good idea :-) */ if (keycode == 0) suppress = false; forward = !suppress; break; } case kCGEventMouseMoved: case kCGEventLeftMouseDragged: case kCGEventRightMouseDragged: case kCGEventOtherMouseDragged: { if (g.ocIntercept) { int64_t dx = CGEventGetIntegerValueField(event, kCGMouseEventDeltaX); int64_t dy = CGEventGetIntegerValueField(event, kCGMouseEventDeltaY); g.ocIntercept->iMouseX = qBound(0, g.ocIntercept->iMouseX + static_cast(dx), g.ocIntercept->uiWidth - 1); g.ocIntercept->iMouseY = qBound(0, g.ocIntercept->iMouseY + static_cast(dy), g.ocIntercept->uiHeight - 1); QMetaObject::invokeMethod(g.ocIntercept, "updateMouse", Qt::QueuedConnection); forward = true; } break; } case kCGEventScrollWheel: forward = true; break; case kCGEventKeyDown: down = true; case kCGEventKeyUp: repeat = CGEventGetIntegerValueField(event, kCGKeyboardEventAutorepeat); if (! repeat) { keycode = static_cast(CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode)); suppress = gs->handleButton(keycode, down); } forward = true; break; case kCGEventFlagsChanged: { CGEventFlags f = CGEventGetFlags(event); // Dump active event taps on Ctrl+Alt+Cmd. CGEventFlags ctrlAltCmd = static_cast(kCGEventFlagMaskControl|kCGEventFlagMaskAlternate|kCGEventFlagMaskCommand); if ((f & ctrlAltCmd) == ctrlAltCmd) gs->dumpEventTaps(); suppress = gs->handleModButton(f); forward = !suppress; break; } case kCGEventTapDisabledByTimeout: qWarning("GlobalShortcutMac: EventTap disabled by timeout. Re-enabling."); /* * On Snow Leopard, we get this event type quite often. It disables our event * tap completely. Possible Apple bug. * * For now, simply call CGEventTapEnable() to enable our event tap again. * * See: http://lists.apple.com/archives/quartz-dev/2009/Sep/msg00007.html */ CGEventTapEnable(gs->port, true); break; case kCGEventTapDisabledByUserInput: break; default: break; } if (forward && g.ocIntercept) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSEvent *evt = [[NSEvent eventWithCGEvent:event] retain]; QMetaObject::invokeMethod(gs, "forwardEvent", Qt::QueuedConnection, Q_ARG(void *, evt)); [pool release]; return NULL; } return suppress ? NULL : event; } GlobalShortcutMac::GlobalShortcutMac() : loop(Q_NULLPTR) , port(Q_NULLPTR) , modmask(static_cast(0)) { #ifndef QT_NO_DEBUG qWarning("GlobalShortcutMac: Debug build detected. Disabling shortcut engine."); return; #endif CGEventMask evmask = CGEventMaskBit(kCGEventLeftMouseDown) | CGEventMaskBit(kCGEventLeftMouseUp) | CGEventMaskBit(kCGEventRightMouseDown) | CGEventMaskBit(kCGEventRightMouseUp) | CGEventMaskBit(kCGEventOtherMouseDown) | CGEventMaskBit(kCGEventOtherMouseUp) | CGEventMaskBit(kCGEventKeyDown) | CGEventMaskBit(kCGEventKeyUp) | CGEventMaskBit(kCGEventFlagsChanged) | CGEventMaskBit(kCGEventMouseMoved) | CGEventMaskBit(kCGEventLeftMouseDragged) | CGEventMaskBit(kCGEventRightMouseDragged) | CGEventMaskBit(kCGEventOtherMouseDragged) | CGEventMaskBit(kCGEventScrollWheel); port = CGEventTapCreate(kCGSessionEventTap, kCGTailAppendEventTap, kCGEventTapOptionDefault, // active filter (not only a listener) evmask, GlobalShortcutMac::callback, this); if (! port) { qWarning("GlobalShortcutMac: Unable to create EventTap. Global Shortcuts will not be available."); return; } kbdLayout = NULL; #if MAC_OS_X_VERSION_MAX_ALLOWED >= 1050 # if MAC_OS_X_VERSION_MIN_REQUIRED < 1050 if (TISCopyCurrentKeyboardInputSource && TISGetInputSourceProperty) # endif { TISInputSourceRef inputSource = TISCopyCurrentKeyboardInputSource(); if (inputSource) { CFDataRef data = static_cast(TISGetInputSourceProperty(inputSource, kTISPropertyUnicodeKeyLayoutData)); if (data) kbdLayout = reinterpret_cast(const_cast(CFDataGetBytePtr(data))); } } #endif #ifndef __LP64__ if (! kbdLayout) { SInt16 currentKeyScript = GetScriptManagerVariable(smKeyScript); SInt16 lastKeyLayoutID = GetScriptVariable(currentKeyScript, smScriptKeys); Handle handle = GetResource('uchr', lastKeyLayoutID); if (handle) kbdLayout = reinterpret_cast(*handle); } #endif if (! kbdLayout) qWarning("GlobalShortcutMac: No keyboard layout mapping available. Unable to perform key translation."); start(QThread::TimeCriticalPriority); } GlobalShortcutMac::~GlobalShortcutMac() { #ifndef QT_NO_DEBUG return; #endif if (loop) { CFRunLoopStop(loop); loop = Q_NULLPTR; wait(); } } void GlobalShortcutMac::dumpEventTaps() { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; uint32_t ntaps = 0; CGEventTapInformation table[64]; if (CGGetEventTapList(20, table, &ntaps) == kCGErrorSuccess) { qWarning("--- Installed Event Taps ---"); for (uint32_t i = 0; i < ntaps; i++) { CGEventTapInformation *info = &table[i]; ProcessSerialNumber psn; NSString *processName = nil; OSStatus err = GetProcessForPID(info->tappingProcess, &psn); if (err == noErr) { CFStringRef str = NULL; CopyProcessName(&psn, &str); processName = (NSString *) str; [processName autorelease]; } qWarning("{"); qWarning(" eventTapID: %u", info->eventTapID); qWarning(" tapPoint: 0x%x", info->tapPoint); qWarning(" options = 0x%x", info->options); qWarning(" eventsOfInterest = 0x%llx", info->eventsOfInterest); qWarning(" tappingProcess = %i (%s)", info->tappingProcess, [processName UTF8String]); qWarning(" processBeingTapped = %i", info->processBeingTapped); qWarning(" enabled = %s", info->enabled ? "true":"false"); qWarning(" minUsecLatency = %.2f", info->minUsecLatency); qWarning(" avgUsecLatency = %.2f", info->avgUsecLatency); qWarning(" maxUsecLatency = %.2f", info->maxUsecLatency); qWarning("}"); } qWarning("--- End of Event Taps ---"); } [pool release]; } void GlobalShortcutMac::forwardEvent(void *evt) { NSEvent *event = (NSEvent *)evt; SEL sel = nil; if (! g.ocIntercept) return; QWidget *vp = g.ocIntercept->qgv.viewport(); NSView *view = (NSView *) vp->winId(); switch ([event type]) { case NSLeftMouseDown: sel = @selector(mouseDown:); break; case NSLeftMouseUp: sel = @selector(mouseUp:); break; case NSLeftMouseDragged: sel = @selector(mouseDragged:); break; case NSRightMouseDown: sel = @selector(rightMouseDown:); break; case NSRightMouseUp: sel = @selector(rightMouseUp:); break; case NSRightMouseDragged: sel = @selector(rightMouseDragged:); break; case NSOtherMouseDown: sel = @selector(otherMouseDown:); break; case NSOtherMouseUp: sel = @selector(otherMouseUp:); break; case NSOtherMouseDragged: sel = @selector(otherMouseDragged:); break; case NSMouseEntered: sel = @selector(mouseEntered:); break; case NSMouseExited: sel = @selector(mouseExited:); break; case NSMouseMoved: sel = @selector(mouseMoved:); break; default: // Ignore the rest. We only care about mouse events. break; } if (sel) { NSPoint p; p.x = (CGFloat) g.ocIntercept->iMouseX; p.y = (CGFloat) (g.ocIntercept->uiHeight - g.ocIntercept->iMouseY); NSEvent *mouseEvent = [NSEvent mouseEventWithType:[event type] location:p modifierFlags:[event modifierFlags] timestamp:[event timestamp] windowNumber:0 context:nil eventNumber:[event eventNumber] clickCount:[event clickCount] pressure:[event pressure]]; if ([view respondsToSelector:sel]) [view performSelector:sel withObject:mouseEvent]; [event release]; return; } switch ([event type]) { case NSKeyDown: sel = @selector(keyDown:); break; case NSKeyUp: sel = @selector(keyUp:); break; case NSFlagsChanged: sel = @selector(flagsChanged:); break; case NSScrollWheel: sel = @selector(scrollWheel:); break; default: break; } if (sel) { if ([view respondsToSelector:sel]) [view performSelector:sel withObject:event]; } [event release]; } void GlobalShortcutMac::run() { loop = CFRunLoopGetCurrent(); CFRunLoopSourceRef src = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, port, 0); CFRunLoopAddSource(loop, src, kCFRunLoopCommonModes); CFRunLoopRun(); } void GlobalShortcutMac::needRemap() { remap(); } bool GlobalShortcutMac::handleModButton(const CGEventFlags newmask) { bool down; bool suppress = false; #define MOD_CHANGED(mask, btn) do { \ if ((newmask & mask) != (modmask & mask)) { \ down = newmask & mask; \ suppress = handleButton(MOD_OFFSET+btn, down); \ modmask = newmask; \ return suppress; \ }} while (0) MOD_CHANGED(kCGEventFlagMaskAlphaShift, 0); MOD_CHANGED(kCGEventFlagMaskShift, 1); MOD_CHANGED(kCGEventFlagMaskControl, 2); MOD_CHANGED(kCGEventFlagMaskAlternate, 3); MOD_CHANGED(kCGEventFlagMaskCommand, 4); MOD_CHANGED(kCGEventFlagMaskHelp, 5); MOD_CHANGED(kCGEventFlagMaskSecondaryFn, 6); MOD_CHANGED(kCGEventFlagMaskNumericPad, 7); return false; } QString GlobalShortcutMac::translateMouseButton(const unsigned int keycode) const { return QString::fromLatin1("Mouse Button %1").arg(keycode-MOUSE_OFFSET+1); } QString GlobalShortcutMac::translateModifierKey(const unsigned int keycode) const { unsigned int key = keycode - MOD_OFFSET; switch (key) { case 0: return QLatin1String("Caps Lock"); case 1: return QLatin1String("Shift"); case 2: return QLatin1String("Control"); case 3: return QLatin1String("Alt/Option"); case 4: return QLatin1String("Command"); case 5: return QLatin1String("Help"); case 6: return QLatin1String("Fn"); case 7: return QLatin1String("Num Lock"); } return QString::fromLatin1("Modifier %1").arg(key); } QString GlobalShortcutMac::translateKeyName(const unsigned int keycode) const { UInt32 junk = 0; UniCharCount len = 64; UniChar unicodeString[len]; if (! kbdLayout) return QString(); OSStatus err = UCKeyTranslate(kbdLayout, static_cast(keycode), kUCKeyActionDisplay, 0, LMGetKbdType(), kUCKeyTranslateNoDeadKeysBit, &junk, len, &len, unicodeString); if (err != noErr) return QString(); if (len == 1) { switch (unicodeString[0]) { case '\t': return QLatin1String("Tab"); case '\r': return QLatin1String("Enter"); case '\b': return QLatin1String("Backspace"); case '\e': return QLatin1String("Escape"); case ' ': return QLatin1String("Space"); case 28: return QLatin1String("Left"); case 29: return QLatin1String("Right"); case 30: return QLatin1String("Up"); case 31: return QLatin1String("Down"); } if (unicodeString[0] < ' ') { qWarning("GlobalShortcutMac: Unknown translation for keycode %u: %u", keycode, unicodeString[0]); return QString(); } } return QString(reinterpret_cast(unicodeString), len).toUpper(); } QString GlobalShortcutMac::buttonName(const QVariant &v) { bool ok; unsigned int key = v.toUInt(&ok); if (!ok) return QString(); if (key >= MOUSE_OFFSET) return translateMouseButton(key); else if (key >= MOD_OFFSET) return translateModifierKey(key); else { QString str = translateKeyName(key); if (!str.isEmpty()) return str; } return QString::fromLatin1("Keycode %1").arg(key); } void GlobalShortcutMac::setEnabled(bool b) { // Since Mojave, passing NULL to CGEventTapEnable() segfaults. if (port) { CGEventTapEnable(port, b); } } bool GlobalShortcutMac::enabled() { if (!port) { return false; } return CGEventTapIsEnabled(port); } bool GlobalShortcutMac::canSuppress() { return true; } bool GlobalShortcutMac::canDisable() { return true; } mumble-1.3.4/src/mumble/mumble_pt_PT.ts0000664000175000017500000140573214010707274017665 0ustar builderbuilder ACLEditor Deny Negar Allow Permitir Allow %1 Permitir %1 Deny %1 Negar %1 Mumble - Add channel Mumble - Adicionar canal Default server value Valor do servidor por omissão Failed: Invalid channel Falhou: Canal inválido Mumble - Edit %1 Mumble - Editar %1 ID: %1 ID: %1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Isto concede o privilégio a %1. Se um privilégio é ambos permitido e negado, ele é negado.<br />%2 Channel must have a name O canal deve ter um nome This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Isto revoga o privilégio a %1. Se um privilégio é ambos permitido e negado, ele é negado.<br />%2 Dialog Diálogo Name Nome Enter the channel name here. Introduza o nome do canal aqui. Description Descrição Password Senha Enter the channel password here. Introduza a senha do canal. Check to create a temporary channel. Verifique para criar um canal temporário. Temporary Temporário <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Posição</b><br/> Este valor permite que altere a forma como o Mumble organiza os canais na árvore hierárquica. Um canal com uma maior <i>Posição</i> será sempre colocado abaixo de um com valor menor e vice-versa. Se o valor de <i>Posição</i> de dois canais é igual eles serão classificados em ordem alfabética do seu nome. Position Posição &Groups &Grupos Group Grupo List of groups Lista de grupos Remove selected group Remover grupo selecionado Remove Eliminar Inherit group members from parent Herdar membros do grupo-mãe Inherit Herdar Make group inheritable to sub-channels Tornar grupo herdável aos sub-canais Inheritable Herdado Group was inherited from parent channel Grupo foi herdado do canal-mãe Inherited Herdado Members Membros Add Adicionar Add member to group Adicionar membro ao grupo Remove member from group Remover membro do grupo &ACL &LCA Active ACLs LCAs ativos List of entries Lista de entradas Inherit ACL of parent? Herdar LCA do canal-mãe? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. Isto define se as LCA da cadeia de canais-mãe são aplicadas a este objeto. Apenas as entradas marcadas no canal ascendente com "Aplicar aos sub-canais" serão herdadas. Inherit ACLs Herdar LCAs Move entry up Mover entrada para cima This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. Isto move a entrada para cima na lista. Já que as entradas são avaliadas por ordem, isto pode mudar as permissões efetivas dos utilizadores. Não pode mover uma entrada para cima de uma entrada herdada. Se realmente precisa fazer isto, terá que duplicar a entrada herdada. &Up &Subir Move entry down Mover entrada para baixo This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. Isto move a entrada para baixo na lista. Já que as entradas são avaliadas por ordem, isto pode mudar as permissões efetivas dos utilizadores. &Down &Baixar Add new entry Adicionar nova entrada This adds a new entry, initially set with no permissions and applying to all. Isto adiciona uma nova entrada, inicialmente definido sem permissões e aplicáveis ​​a todos. &Add &Adicionar Remove entry Eliminar entrada This removes the currently selected entry. Isto elimina a entrada selecionada. &Remove &Eliminar Context Contexto Entry should apply to this channel. Entry should apply to this channel A entrada deve-se aplicar a este canal. This makes the entry apply to this channel. Isto faz com que a entrada se aplique a este canal. Applies to this channel Aplica-se a este canal Entry should apply to sub-channels. Entrada deve-se aplicar aos sub-canais. Add new group Adicionar novo grupo <b>Add</b><br/> Add a new group. <b>Adicionar</b><br/> Adicionar um novo grupo. Inherited members Membros herdados Contains the list of members added to the group by this channel. Contém a lista de membros adicionados ao grupo por este canal. Contains a list of members whose group membership will not be inherited from the parent channel. Contém uma lista de membros cuja adesão ao grupo não será herdada do canal pai. Contains the list of members inherited by other channels. Contém a lista de membros herdados doutros canais. Type in the name of a user you wish to add to the group and click Add. Introduza o nome de um utilizador que deseje adicionar ao grupo e clique em Adicionar. Type in the name of a user you wish to remove from the group and click Add. Introduza o nome de um utilizador que deseja remover do grupo e clique em Adicionar. Exclude Excluir Excluded members Membros excluídos This makes the entry apply to sub-channels of this channel. Isto faz com que a entrada se aplique aos sub-canais deste canal. Applies to sub-channels Aplica-se aos sub-canais Permissions Permissões User/Group Utilizador/Grupo Group this entry applies to Grupo a qual se aplica esta entrada User ID ID de Utilizador User this entry applies to Utilizador ao qual se aplica esta entrada This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. Isto controla o utilizador a qual esta entrada se aplica. Apenas introduza o nome de utilizador e pressione ENTER para procurar um resultado no servidor. &Properties &Propriedades <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>Nome</b><br />Especifique o nome do canal neste campo. O nome deve cumprir as restrições impostas pelo servidor ao qual está conectado. <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>Temporário</b><br /> Quando marcado o canal criado será marcado como temporário. Isto significa que quando a último utilizador sair do canal ele será automaticamente eliminado pelo servidor. <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>Grupo</b><br />Estes são todos grupos atualmente definidos para o canal. Para criar um novo grupo, apenas introduza o nome e pressione enter. <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>Eliminar</b><br />Isto elimina o grupo selecionado. Se o grupo foi herdado, não vai será eliminado da lista, mas toda a informação local sobre o grupo será apagado. <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>Herdar</b><br />Isto herda todos membros no grupo do pai, se o grupo está marcado como <i>Herdável</i> no canal pai. <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>Herdável</b><br />Isto torna o grupo herdável para subcanais. Se o grupo é não-herdável, subcanais ainda podem criar um novo grupo com o mesmo nome. <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>Herdado</b><br />Isto indica que o grupo foi herdado do canal pai. Não pode editar esta marcação, ela é somente informativa. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>Membros</b><br /> Esta lista contém todos os membros que foram adicionados ao grupo pelo canal atual. Lembre-se que isto não inclui membros herdados por níveis mais altos na árvore de canais. Estes podem ser encontrados na lista <i>Membros herdados</i>. Para evitar que esta lista seja herdada por canais de níveis mais baixos, desmarque a opção <i>Herdável</i> ou adiciona manualmente os membros para a lista <i>Membros exclusos</i>. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>Membros excluídos</b><br /> Contém uma lista de membros cuja adesão de grupo não será herdada do canal pai. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. <b>Membros herdados</b><br /> Contém a lista de membros herdados pelo canal atual. Desmarque <i>Herdar</i> para evitar a herança de canais de níveis mais altos. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. Isto controla a qual grupo de utilizadores esta entrada se aplica.<br />Note que o grupo é avaliado no contexto do canal na qual a entrada é usada. Por exemplo, a LCA padrão no canal Raiz fornece permissão de <i>Escrita</i> para o grupo <i>admin</i>. Esta entrada se herdada por um canal, fornecerá ao utilizador permissões de escrita se ele pertencer ao grupo <i>admin</i> naquele canal, mesmo se ele não pertencer ao grupo <i>admin</i> no canal onde a LCA foi originada.<br />Se um nome de grupo começa com '!', sua adesão é negada, e se ele inicia com '~', ele é avaliado no canal onde a LCA foi definida, e não no canal onde a LCA está ativa.<br />Se um nome de grupo começa com '#', ele é interpretado como uma credencial de acesso. Utilizadores devem ter entrado seja o que for que siga o '#' nas suas listas de chaves de acesso para coincidir com a entrada. Isto pode ser usado para acessos com senha muito simples para canais para utilizadores não autenticados.<br />Se um nome de grupo começa com '$', ele só vai coincidir utilizadores cujo hash de certificado coincidir o que está depois do '$'.<br />Alguns grupos predefinidos especiais são:<br /><b>all</b> - Todos vão coincidir.<br /><b>auth</b> - Todos utilizadores autenticados vão coincidir.<br /><b>sub,a,b,c</b> - Utilizador atualmente em um subcanal com um mínimo <i>a</i> de pais comuns, e entre <i>b</i> e <i>c</i> canais abaixo na cadeia. Veja o site para mais documentação sobre este último.<br /><b>in</b> - Utilizadores atualmente neste canal vão coincidir (conveniência para '<i>sub,0,0,0</i>').<br /><b>out</b> - Utilizadores fora deste canal coincidirão (conveniência para '<i>!sub,0,0,0</i>').<br />Note que uma entrada aplica para um utilizador ou grupo, não ambos. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. <b>Senha</b><br />Este campo permite que especifique e mude facilmente a senha de um canal. Ela usa o recurso de credenciais de acesso do Mumble em segundo plano. Use LCAs e grupos se precisar de um controle de acesso mais poderoso e refinado. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. Isto mostra todas entradas ativas neste canal, Entradas herdadas de canais pai será mostradas em itálico.<br />LCAs são avaliadas de cima para baixo, significando que a prioridade aumenta ao se ir para baixo na lista. ID of the channel. ID do canal. Maximum Users Nº de uitlizadores máximo Maximum number of users allowed in the channel Número máximo de utilizadores permitido no canal <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. <b>Nº Máximo de Utilizadores</b><br /> Este valor permite definir o número máximo de utilizadores permitido no canal. Se o valor é maior que zero, só esse número de utilizadores podem entrar no canal. Se o valor é zero, o número máximo de utilizadores no canal será dado pelo limite padrão do servidor. This is the sort order for the channel. ALSAAudioInput Default ALSA Card Placa ALSA padrão Opening chosen ALSA Input failed: %1 Abrir a Entrada ALSA escolhida falhou: %1 ALSAAudioOutput Default ALSA Card Placa ALSA padrão Opening chosen ALSA Output failed: %1 Abrir a Saída ALSA escolhida falhou: %1 ASIOConfig %1 (version %2) %1 (versão %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz Buffer de amostra %1 -> %2, com resolução de amostra de %3 (%4 preferido) em %5 Hz ASIO Initialization failed: %1 Falha na inicialização de ASIO: %1 Failed to instantiate ASIO driver Falha ao instanciar o controlador ASIO ASIO ASIO Device selection Escolha de dispositivo Device Dispositivo Device to use for microphone Dispositivo a usar como microfone This chooses what device to query. You still need to actually query the device and select which channels to use. Escolha qual dispositivo a consultar. Precisará realmente de consultar o dispositivo e selecionar quais canais usar. Query selected device Consultar o dispositivo selecionado This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. Consulta o dispositivo selecionado para procura de canais. Lembre-se que muitos controladores ASIO são extremamente defeituosos, e consultá-los pode bloquear a aplicação ou o sistema. &Query C&onsultar Configure selected device Configure o dispositivo selecionado This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. Configura o dispositivo selecionado. Lembre-se que muitos controladores ASIO são extremamente defeituosos, e consultá-los pode bloquear a aplicação ou o sistema. &Configure &Configurar Capabilities Capacidades Driver name Nome do controlador Buffer size Tamanho do buffer This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. Configura os canais de entrada para ASIO. Tenha certeza de selecionar pelo menos um canal como microfone e altifalante. <i>Microfone</i> deve ser onde o seu microfone está ligado, e <i>Altifalante</i> deve ser um canal que mostra '<i>O que ouve</i>'.<br />Por exemplo, na Audigy 2 ZS, uma boa seleção para Microfone seria '<i>Mic L</i>' enquanto Altifalante seria '<i>Mix L</i>' e '<i>Mix R</i>'. Configure input channels Configurar canais de entrada Channels Canais Microphone Microfone <- <- -> -> Unused Não usado Speakers Altifalantes ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. Deve selecionar pelo menos um microfone e um altifalante para usar ASIO. Se precisa de amostra de microfone, use DirectSound. Opening selected ASIO device failed. No input will be done. Falha ao abrir o dispositivo ASIO. Nenhuma entrada será feita. AboutDialog About Mumble Sobre o Mumble <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> <h3>Mumble (%1)</h3><p>%3</p><p><b>Um programa de chat por voz para jogadores</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble &Sobre o Mumble &License &Licença A&uthors &Third-Party Licenses OK OK AudioInput Interface Interface System Sistema Input method for audio Método de entrada para áudio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Este é o método de entrada para usar para o áudio.</b><br />Mais provavelmente é usar DirectSound. Device Dispositivo Input device for audio Dispositivo de entrada para áudio <b>This is the input device to use for audio.</b> <b>Este é o dispositivo de entrada a ser usado para áudio.</b> Transmission Transmissão &Transmit &Transmitir When to transmit your speech Quando transmitir a sua voz <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. <b>Define quando sua voz deve ser transmitida.</b><br /><i>Contínua</i> - Todo o tempo<br /><i>Atividade vocal</i> - Quando fala claramente.<br /><i>Pressionar Para Falar</i> - Quando pressionar a tecla de atalho escolhida em <i>Atalhos</i>. DoublePush Time Tempo para DuploClique If you press the PTT key twice in this time it will get locked. Se pressionar a tecla PPF duas vezes neste tempo ela ficará bloqueada. <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. <b>Tempo para DuploClique</b><br />Se pressionar a tecla para falar duas vezes durante o intervalo de tempo configurado ela ficará bloqueada. O Mumble continuará a transmitir até que pressione-a uma vez mais para desbloquear o PPF de novo. Reset audio cue to default Repor notificação de áudio para padrão <b>Reset</b><br/>Reset the paths for the files to their default. <b>Repor</b><br/>Repor os caminhos para os arquivos para o seu padrão. Browse for on audio file Procurar por um arquivo de áudio Browse for off audio file Procurar por um arquivo de áudio Off Desligado On Ligado Preview the audio cues Prever notificações sonoras Use SNR based speech detection Usar deteção de voz baseada em SNR Signal to Noise Sinal/Ruído <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. <b>Configura a deteção de fala para usar Amplitude.</b><br />Neste modo, a força bruta do sinal de entrada é usado para detectar fala. Amplitude Amplitude Voice &Hold &Persistência de voz How long to keep transmitting after silence Quanto tempo continuar a transmissão após silêncio Silence Below Silêncio Abaixo <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. <b>Estabelece os gatilhos para a detecção de voz.</b><br />Use isto junto com a janela de Estatísticas de Áudio para afinar manualmente os valores para o gatilho de deteção de voz. Valores de entrada baixo de "Silêncio abaixo" sempre contam como silêncio. Valores acima de "Falar acima" sempre contam como voz. Valores entre ambos contam como voz como se já estiver a falar, mas não levam a uma nova deteção. Speech Above Falar Acima Signal values above this count as voice Sinal acima disto conta como voz Compression Compressão &Quality &Qualidade Quality of compression (peak bandwidth) Qualidade da compressão (pico de banda) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. <b>Configura a qualidade da compressão.</b><br />Determina quanta banda o Mumble pode usar para transmissão de áudio. Audio per packet Áudio por pacote How many audio frames to send per packet Quantos frames de áudio a enviar por pacote <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>Seleciona quantas frames de áudio devem ser colocados em um pacote.</b><br />Aumentar isto também aumentará a latência para sua voz, reduzindo as exigências de banda. <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). <b>Mostra o pico da banda de transmissão usada.</b><br />Mostra o pico na quantidade de banda enviada da sua máquina. A taxa de áudio é a taxa máxima (já que usamos VBR) para os dados de áudio sozinhos. Posição é a taxa usada para informação posicional. Sobrecarga é o nosso enquadramento e os cabeçalhos de pacote IP (IP e UDP são 75% desta sobrecarga). Audio Processing Processamento de áudio Noise Suppression Supressão de Ruídos Noise suppression Supressão de ruídos <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. <b>Define a quantidade de supressão de ruído a aplicar.</b><br />Quão maior este valor, mais agressivamente o ruído estacionário será suprimido. Maximum amplification of input sound Amplificação máxima do som de entrada <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. <b>Amplificação máxima da entrada.</b><br />O Mumble normaliza o volume de entrada antes da compressão, e isto configura quanto ele pode amplificar.<br />O nível real é continuamente atualizado baseado no seu padrão atual de fala, mas nunca passará do especificado aqui.<br />Se o nivel do<i>Volume do microfone</i> das estatísticas de áudio ficam sobre os 100%, provavelmente quer configurar isto para 2.0 ou parecido, mas se , como a maioria das pessoas, é incapaz de chegar aos 100%, configure isto muito mais alto.<br />Ideal, configurá-lo para <i>Volume do microfone * Fator de Amplificação >= 100</i>, mesmo quando está a falar baixo.<br /><br />Note que não há dano em configurar isto no máximo, mas o Mumble começará a transmitir outras conversar se deixá-lo auto-afinado para este nível. Current speech detection chance Probabilidade atual de deteção da fala Cancel echo from speakers Anular eco dos altifalantes Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. Ativar isto vai anular o eco dos seus altifalantes. Misturado tem pouco impacto no CPU, mas só funciona bem se ambos altifalantes tiverem o mesmo volume e equidistantes do microfone. Anulação de eco multi-canal fornece cancelamento de eco muito melhor, mas com um maior custo de CPU. Disabled Desativado <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>Configura a deteção para usar a taxa Sinal para Ruído.</b><br />Neste modo a entrada é analisada por algo semelhante a um sinal limpo, e a clareza deste sinal é usada para ativar a deteção de fala. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>Mostra as configurações atuais de deteção de fala.</b><br />Pode mudar as configurações do diálogo de Configurações ou o Assistente de Áudio. Signal values below this count as silence Valores de sinal abaixo disto contam como silêncio Maximum bandwidth used for sending audio Largura de banda máxima utilizada para o envio de áudio Use Amplitude based speech detection Usar Amplitude baseada na deteção de fala <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). <b>Seleciona quanto tempo após uma perceptível paragem na fala a transmissão deve continuar.</b><br />Configure isto mais alto se sua voz quebra durante a sua fala (vendo pelo ícone de voz piscando ao lado do seu nome). Exclusive mode Modo exclusivo <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>Abre o dispositivo em modo exclusivo.</b><br />Nenhum outra aplicação será capaz de utilizá-lo. Exclusive Exclusivo R&eset R&epor &Browse... &Procurar... B&rowse... N&avegar... &Preview &Antever <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. <b>Antever </b><br/>Reproduz o som padrão <i>Ligado</i> seguido do som <i>Desligado</i> atual. Displays an always on top window with a push to talk button in it Mostra uma janela sempre no topo com um botão de pressionar para falar Display push to talk window Mostrar janela pressionar para falar Misc Diversos Audible audio cue when starting or stopping to transmit Aviso audível ao começar ou parar de transmitir <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. <b>Isto ativa faixas da transmissão de áudio.</b><br />Ativar isto vai lhe dar um breve sinal sonoro de áudio quando começar e terminar de transmitir. Audio cue Faixa de áudio Gets played when starting to transmit É usado no começo da transmissão Gets played when stopping to transmit É usado no final da transmissão Hold Time Tempo de Espera Time the microphone stays open after the PTT key is released Tempo que o microfone fica activo após a tecla PPF ser solta Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) Largura de banda máxima do servidor é apenas %1 kbit/s. Qualidade do áudio auto-ajustada para %2 kbit/s (%3 ms) Max. Amplification Amplificação Máx. Idle action Ação inactiva minutes do minutos fazer nothing nada deafen ensurdecer mute silenciar after após Echo Cancellation Cancelamento de Eco Mixed echo cancellation Cancelamento de eco misto Multichannel echo cancellation Cancelamento de eco multi-canal The idle action will be reversed upon any key or mouse button input Undo Idle action upon activity Apply RNNoise's noise suppression filter. <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. RNNoise Audio input AudioInputDialog Continuous Contínuo Voice Activity Atividade de voz Push To Talk Pressionar Para Falar Audio Input Entrada de Áudio %1 ms %1 ms Off Desligado %1 s %1 s %1 kb/s %1 kb/s -%1 dB -%1 dB %1 kbit/s (Audio %2, Position %4, Overhead %3) %1 kbit/s (Áudio %2, Posição %4, Sobrecarga %3) AudioOutput Interface Interface System Sistema Output method for audio Método para saída de Áudio <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Este é o método usado para a saída de áudio</b><br />Muito provavelmente querer usar o DirectSound. Device Dispositivo Output device for audio Dispositivo de saída de áudio <b>This is the output device to use for audio.</b> <b>Este é o dispositivo usado para a saída de áudio.</b> Positional Audio Áudio Posicional Audio Output Saída de Áudio Default &Jitter Buffer Buffer de &Jitter Padrão Safety margin for jitter buffer Margem de segurança para o buffer jitter <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. <b>Isto configura a margem mínima de segurança para o buffer jitter.</b><br />Todo áudio recebido é armazenado em buffer, e o bufer jitter tenta continuamente empurrar o buffer para o mínimo suportado pela sua rede, diminuindo a latência. Configure o tamanho mínimo do buffer. Se o começo das suas frases é muito irregular, aumente este valor. Minimum distance to user before sound volume decreases Distância mínima do utilizador antes que o volume do som diminuir This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. Isto configura a distância mínima para cálculos de som. O volume da fala dos utilizadores não irá diminuir ate que estejam no mínimo a esta distância de si. This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. Isto configura a distância máxima para cálculos de som. Quando além desta distância, o volume de fala de outros utilizadores não irá diminuir mais. <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. <b>Isto configura os métodos de teste de retorno.</b><br /><i>Nenhum</i> - Retorno desativado<br /><i>Local</i> - Emula um servidor local.<br /><i>Servidor</i> - Pede retorno do servidor.<br />Por favor note que quando o retorno está ativado, nenhum outro utilizador irá ouvir a sua voz. Esta configuração não é gravada a saída do programa. Volume Volume Volume of incoming speech Volume para voz recebida <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. <b>Isto configura o volume da voz recebida.</b><br />Note que se quiser aumentar isto além de 100%, o áudio será distorcido. Output Delay Atraso de Saída Amount of data to buffer Quantia de dados a armazenar em buffer The connected "speakers" are actually headphones The connected "speakers" are actually headphones. Os "altifalantes" conectados são na realidade auscultadores Factor for sound volume decrease Fator para redução do volume Bloom Bloom Factor for sound volume increase Factor para aumento do volume How much should sound volume increase for sources that are really close? Quanto o volume deve aumentar para fontes que estão realmente perto? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. Marcar isto indica que não tem altifalantes conectados, apenas auscultadores. Isto é importante, já que altifalantes geralmente ficam a sua frente, enquanto que auscultadores ficam diretamente ao seu lado. This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Configura a quantia de dados a pré-armazenar no buffer de saída. Experimente com valores diferentes e configure para o menor valor que não causa irregularidades no som. Headphones Auscultadores Minimum Distance Distância Mínima Maximum Distance Distância Máxima Maximum distance, beyond which speech volume won't decrease Distância máxima, depois da qual o volume da voz não diminuirá Minimum Volume Volume mínimo What should the volume be at the maximum distance? Qual deve ser o volume na distância máxima? Loopback Test Teste de Retorno Delay Variance Variação do Atraso Variance in packet latency Variação na latência do pacote <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>Configura a variação da latência no pacote para teste de retorno.</b><br />A maior parte dos caminhos de áudio contêm alguma latência variável. Isto permite que configure a latência para o modo de teste de retorno. Por exemplo, se escolher 15ms, isto vai emular uma rede com ping de 20-35ms ou uma com 80-95ms de latência. A maioria das redes domésticas têm uma variação de cerca de 5ms. Packet Loss Perda de pacotes Packet loss for loopback mode Perda de pacotes para o modo de retorno <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% <b>Configura a perda de pacotes para o modo de retorno</b><br />Esta vai ser a taxa de pacotes perdidos. A menos que a sua largura de banda de saída esteja sobrecarregada ou se há algo de errado com a sua conexão de rede, isto será 0% &Loopback &Retorno Desired loopback mode Modo de retorno desejado Attenuate applications by... Atenuar aplicações por... Attenuation of other applications during speech Atenuação de outras aplicações durante a fala <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. <b>Atenuar volume dos outras aplicações durante a fala</b><br />O Mumble suporta a diminuição do volume de outras aplicações durante a entrada/saída de fala. Configura a atenuação de outras aplicações quando ativo. If checked Mumble lowers the volume of other applications while other users talk Se marcado o Mumble diminui o volume de outras aplicações enquanto outros utilizadores falam <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. <b>Atenuar aplicações enquanto outros utilizadores falam</b><br />O Mumble suporta a diminuição do volume de outras aplicações durante a entrada e saída de voz. Isto faz com que o Mumble ative o recurso enquanto outros falam consigo. while other users talk enquanto outros falam If checked Mumble lowers the volume of other applications while you talk Se marcado o Mumble diminui o volume de outras aplicações enquanto fala <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. <b>Atenuar aplicações enquanto fala</b><br />Mumble suporta a diminuição do volume de outras aplicações durante o recebimento ou envio de voz. Isto faz com que o mumble ative o recurso enquanto fala. while you talk enquanto fala Exclusive mode, not recommended. Modo exclusivo, não recomendado. <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>Abre o dispositivo em modo exclusivo</b><br />Nenhum outra aplicação poderá usar o dispositivo. Exclusive Exclusivo Priority Speaker Falante prioritário If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. Se selecionado, o Mumble abaixa o volume dos outros utilizadores enquanto você fala se tiver estatuto de "Falante Prioritário". <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. <b>Atenuar outros utilizadores enquanto fala como Falante Prioritário.</b><br />O Mumble pode diminuir o volume dos outros utilizadores enquanto você fala como <i>Falante Prioritário</i> para evitar ser interrompido. Selecionar esta opção ativa esta funcionalidade. Attenuate other users while talking as Priority Speaker. Atenuar outros utilizadores enquanto fala como Falante Prioritário. Advanced Attenuation Options Opções Avançadas de Atenuação If checked, Mumble will only attenuate applications that are using the same output source as Mumble Se selecionado, Mumble apenas atenuará aplicações que usem o mesmo dispositivo de saída que o Mumble. <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. <b>Atenuar apenas as aplicações que usam o mesmo dispositivo de saída que o Mumble</b><br />Se selecionado, as aplicações que usam outro dispositivo de saída não serão atenuadas. Only attenuate applications using the same output device Atenuar apenas as aplicações que usam o mesmo dispositivo de saída If checked, PulseAudio loopback modules will be attenuated Se selecionado, módulos loopback do PulseAudio serão atenuados. <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. <b>Atenua módulos loopback do PulseAudio</b><br />Módulos loopback que estejam ligados ao dispositivo de saída/sink do Mumble também serão atenuados. Attenuate PulseAudio loopback modules Atenuar módulos loopback do PulseAudio Audio output AudioOutputDialog None Nenhum Local Local Server Servidor Audio Output Saída de Áudio %1 ms %1 ms %1 % %1 % %1 m %1 m AudioOutputSample Choose sound file Escolha o ficheiro de som Invalid sound file Ficheiro de som inválido The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. O ficheiro '%1' não pode ser usado pelo Mumble. Por favor escolha um ficheiro de formato e codificação compatível. AudioStats >1000 ms >1000ms >1000 ms Audio Statistics Estatísticas de Áudio Input Levels Níveis de Entrada Peak microphone level Nível máximo do microfone Peak power in last frame Potência máxima no último quadro This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. Mostra a potência máxima no último quadro (20 ms), e é a mesma medida que geralmente encontra como "potência de entrada". Por favor desconsidere isto e veja <b>Potência do microfone</b>, que é muito mais regular e desconsidera extremos. Peak speaker level Nível máximo de altifalante This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. Mostra o pico de potência dos altifalantes no último quadro (20ms). A menos que esteja usando um método de amostra multi-canal (como ASIO) com altifalantes configurados, isto será 0. Se possui tal instalação configurada, e isto ainda mostra 0 enquanto estiver a usar áudio de outros programas, a sua configuração não está a funcionar. Peak clean level Nível limpo máximo This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. Mostra a potência máxima no último quadro (20ms) depois de todo processamento. Idealmente, isto deve ser -96 dB quando não está a falar. Na realidade, um estúdio sonoro deve ver -60 dB, e com sorte deve ver algo ao redor de -20 dB. Quando está a falar, isto deve aumentar para algo em torno de -5 e -10 dB.<br />Se está a usar cancelamento de eco, e isto aumenta para mais de -15 dB quando não está a falar, a sua configuração não está a funcionar, e vai incomodar outros utilizadores com ecos. Signal Analysis Análise de sinal Microphone power Potência do microfone How close the current input level is to ideal Quão próximo o nível de entrada atual está do ideal This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. Mostra quão perto o seu volume de entrada atual está do ideal. Para ajustar o nível do seu microfone, abra o programa que usa para configurar o volume de gravação, e olhe para o valor enquanto fala.<br /><b>Fale alto, como faria quando está incomodado por ter sido morto por um novato.</b><br />Ajuste o volume até que este valor esteja próximo de 100%, mas certifique-se que ele não ultrapassa, é provável que tenha cliques em partes da sua fala que vão degradar a qualidade do som. Signal-To-Noise ratio Relação sinal/ruído Signal-To-Noise ratio from the microphone Taxa sinal/ruído do microfone This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. Esta é a relação sinal/ruído (SNR) do microfone no último quadro (20 ms). Ele mostra quão mais clara a voz é compara com o ruído.<br />Se este valor está abaixo de 1.0, há muito mais ruído do que voz no sinal, e então a qualidade é reduzida.<br />Não há um limite superior para este valor, mas não espere ver muito acima de 40-50 sem um estúdio de som. Speech Probability Probabilidade de fala Probability of speech Probabilidade de fala This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). Este é provavelmente o último quadro (20 ms) que era fala e não ruído ambiente.<br />Transmissão da atividade vocal depende disto estar certo. O truque com isto é que o meio da sentença é sempre detectado como fala; o problema são as pausas entre as palavras e o começo da fala. É difícil distinguir um suspiro de uma palavra começando com 'h'.<br />Se isto está em negrito, significa que o Mumble está a transmitir atualmente (se está conectado). Configuration feedback Configuração de feedback Current audio bitrate Taxa de audio atual Bitrate of last frame Taxa do último quadro DoublePush interval Intervalo de DuploClique Time between last two Push-To-Talk presses Tempo entra os dois últimos pressionamentos de Pressionar-para-Falar Speech Detection Deteção de fala Current speech detection chance Probabilidade atual de deteção de fala <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>Mostra as configurações atuais de deteção de fala</b><br />Pode mudar as configurações do diálogo das Configurações ou do Assistente de áudio. Signal and noise power spectrum Espectro de potência de sinal e ruído Power spectrum of input signal and noise estimate Espectro de potência do sinal de entrada e estimativa de ruído This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. Mostra o espectro da potência do sinal de entrada atual (linha vermelha) e a estimativa de ruído atual (azul preenchido).<br />Todas amplitudes são multiplicadas por 30 para mostrar as partes interessantes (quão mais sinal do que ruído está presente em cada banda de onda).<br />Provavelmente isto só é de interesse se está a tentar afinar condições de ruído no seu microfone. Sob boas condições, deve haver apenas uma pequena agitação de azul no fundo. Se o azul é mais do que metade do gráfico, tem um ambiente bem ruidoso. Echo Analysis Análise de eco Weights of the echo canceller Pesos do cancelamento de eco This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. Mostra os pesos do cancelador de eco, com o tempo aumentando para baixo e a frequência para a direita.<br />Idealmente, isto deve ser preto, indicando que nenhum eco existe. Mais comum, ver uma ou mais listras horizontais de tom azul representando eco com tempo atrasado. Deve ser capaz de ver os pesos atualizados em tempo real.<br />Por favor note que enquanto não tiver nada para ecoar, não verá muitos dados úteis aqui. Toque alguma música e as coisas devem estabilizar.<br />Pode escolher ver as partes reais ou imaginárias dos pesos no domínio da frequência, ou alternativamente a fase e o módulo calculados. Os mais úteis destes provavelmente serão o módulo, que é a amplitude do eco, e mostra quanto do sinal transmitido está sendo eliminado naquela etapa no tempo. Os outros modos de visão são mais úteis para pessoas que querem melhorar os algoritmos de anulação de echo.<br />Por favor note: Se a imagem inteira flutua massivamente no modo de módulo, o anulador de eco falha ao encontrar qualquer correlação entre as duas fontes de entrada (altifalantes e microfone). Ou possui um atraso muito longo no eco, ou as fontes de entrada estão configuradas errado. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. Esta é a taxa de áudio para o último quadro comprimido (20 ms), e como tal irá saltar para cima e para baixo conforma o VBD ajusta a qualidade. O pico da taxa pode ser ajustado no diálogo de Configuração. AudioWizard Audio Tuning Wizard Assistente para ajuste do áudio Introduction Introdução Welcome to the Mumble Audio Wizard Bem-vindo ao assistente para ajuste do áudio do Mumble Finished Terminado Enjoy using Mumble Desfrute a utilização do Mumble Device selection Escolha de dispositivo Selecting the input and output device to use with Mumble. Selecionar o dispositivo de entrada e saída para usar com o Mumble. This is the device your microphone is connected to. Este é o dispositivo ao qual o seu microfone está conectado. System Sistema Input method for audio Método de entrada para áudio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Este é o método de entrada a usar para o áudio.</b><br />Provavelmente quer usar DirectSound. Device Dispositivo Input device to use Dispositivo de entrada a usar <b>Selects which sound card to use for audio input.</b> <b>Seleciona qual placa de som a usar para entrada de áudio.</b> Cancel echo from headset or speakers Anular eco dos altifalantes ou auscultadores Use echo cancellation Usar cancelamento de eco This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. Isto ativa a anulação de eco para o áudio enviado, o que ajuda em ambos auscultadores e altifalantes. This is the device your speakers or headphones are connected to. Este é o dispositivo ao qual seus altifalantes ou auscultadores estão conectados. Output method for audio Método de saída para áudio <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Este é o método de saída a usar para o áudio.</b><br />Provavelmente quer usar DirectSound. Output device to use Dispositivo de saída a usar <b>Selects which sound card to use for audio Output.</b> <b>Seleciona qual placa de som a usar para saída de áudio.</b> Enable positional audio Ativar áudio posicional Allows positioning of sound Allows positioning of sound. Permitir posicionamento de som <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> <p> Este é o assistente para ajuste de áudio do Mumble. Ele vai ajudá-lo a configurar corretamente os níveis de entrada para sua placa de som, e também os parâmetros para processamento de som no Mumble. </p> <p> Por favor lembre-se que enquanto o assistente estiver ativo, o som será ouvido localmente para permitir que o escute, e nenhum áudio será enviado para o servidor. </p> Input Device Dispositivo de entrada Output Device Dispositivo de saída This allows Mumble to use positional audio to place voices. Isto permite que o Mumble use áudio posicional para posicionar vozes. <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> <p> Para manter a latência num mínimo absoluto, é importante que o buffer na placa de som tenha menor tamanho possível. No entanto, muitas placas de som anunciam precisar de um buffer muito menor do que elas realmente aceitam, então o único modo de configurar este valor é por tentativa e erro. </p> <p> Deve ouvir um exemplo de fala. Mude a barra deslizante abaixo para o menor valor que garanta <b>nenhuma</b> interrupção ou irregularidade no som. Por favor note que o eco local é desativado durante este teste. </p> Amount of data to buffer Quantia de dados a armazenar This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Configura a quantidade de dados a pré-armazenar no buffer de saída. Experimente com diferentes valores e use o menor que não cause irregularidades no som. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> <p> Abra o seu painel de controle de som e vá às configurações de gravação. Tenha certeza que o microfone está marcado como ativo e com o máximo de volume. Se houver uma opção para ativar o "Aumento de sensibilidade", certifique-se de marcá-la. </p> <p> Fale alto, como quando está incomodado ou animado. Diminua o volume no painel de controle até que a barra baixo fique o mais alto possível no azul e verde, mas <b>não</b> na zona vermelha enquanto fala. </p> Positional Audio Áudio posicional Adjusting attenuation of positional audio. Ajustar atenuação de áudio posicional. <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> <p> O Mumble suporta áudio posicional para alguns jogos, e vai posicionar a voz de outros utilizadores relativa à posição deles no jogo. Dependendo da posição deles, o volume da voz será alterada nos altifalantes para simular a direção e distância que o outro utilizador está. Tal posicionamento depende da configuração do seu altifalante estar correta no seu sistema operativo, então um teste é feito aqui. </p> <p> O gráfico abaixo mostra a posição de <font color="red">si</font>, os <font color="yellow">altifalantes</font> e uma <font color="green">fonte móvel de áudio</font> vista de cima. Deve ouvir o áudio mover entre os canais. </p> Use headphones instead of speakers Use auscultadores ao invés de altifalantes <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> <p> Parabéns. Deve estar pronto para aproveitar uma experiência de som mais rica com o Mumble. </p> <p> O Mumble está sob constante desenvolvimento, e a equipa de desenvolvimento quer se focar nos recursos que beneficiem a maioria dos utilizadores. Para este fim, o Mumble suporta o envio de estatísticas anónimas sobre a sua configuração para os desenvolvedores. Estas estatísticas são essenciais para o desenvolvimento futuro, e também asseguram que recursos que usar não serão depreciados. </p> Use headphones Usar auscultadores This ignores the OS speaker configuration and configures the positioning for headphones instead. Ignora a configuração de altifalantes do SO e configura o posicionalmente para auscultadores em seu lugar. Volume tuning Ajuste de volume Tuning microphone hardware volume to optimal settings. Ajustando o volume do hardware para níveis ideais. Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. Agora fale suavemente, como falaria à noite, quando não quer perturbar ninguém. Ajuste a barra deslizante abaixo de modo a que a barra se mova até ao verde quando você fala, mas permaneça no azul enquanto está em silêncio. Voice Activity Detection Deteção de atividade de voz Letting Mumble figure out when you're talking and when you're silent. Permitir que o Mumble suponha quando está a falar e quando está em silêncio. This will help Mumble figure out when you are talking. The first step is selecting which data value to use. Ajuda o Mumble a supor quando fala. O primeiro passo é selecionar que valor de dados a usar. Raw amplitude from input Amplitude bruta da entrada Signal-To-Noise ratio Relação sinal-ruído Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). A seguir precisa ajustar a seguinte barra deslizante. As primeiras palavras que falar devem chegar a área verde (definitivamente fala). Enquanto fala deve ficar dentro do amarelo (pode ser fala) e quando não estiver a falar tudo deve ficar no vermelho (definitivamente não é fala). Device tuning Ajuste de dispositivo Changing hardware output delays to their minimum value. Alterar os atrasos de saída de hardware para o seu valor mínimo. Submit anonymous statistics to the Mumble project Enviar estatísticas anônimas ao projeto Mumble Push To Talk: Pressionar Para Falar: Quality & Notifications Qualidade & Notificações Adjust quality and notification settings. Ajustar qualidade e configurações de notificações. Quality settings Configurações de qualidade Low Baixa Balanced Equilibrada Notification settings Configurações de notificação Use Text-To-Speech to read notifications and messages to you. Usar Texto-para-Voz para ler mensagens de notificação para si. Disable Text-To-Speech and use sounds instead. Desativar Texto-para-Voz e usar sons em seu lugar. %1 ms %1 ms Enables attenuation of other applications while users talk to you Ativar atenuação de outras aplicações enquanto utilizadores falam consigo Attenuate applications while other users talk Atenuar aplicações enquanto outros falam High Alta Custom Personalizada You already set a customized quality configuration in Mumble. Select this setting to keep it. Já escolheu uma configuração personalizada de qualidade no Mumble. Selecione esta opção para mantê-la. Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. Ativa a atenuação de outras aplicações enquanto utilizadores falam consigo. Isto significa que assim que alguém começa a falar consigo no Mumble, o som de todos outros programas (como leitores de áudio) será atenuado para que possa ouvi-los mais claramente. Apply some high contrast optimizations for visually impaired users Aplicar algumas otimizações de alto contraste para utilizadores com deficiência visual Use high contrast graphics Usar gráficos de alto contraste Keep custom Text-To-Speech settings. Manter configurações personalizadas de Texto-para-Voz. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode <p> Abra o seu painel de controle de som e vá para as configurações de gravação. Certifique-se que o Microfone está selecionado como a entrada ativa e está com o máximo de volume. Se há uma opção para ativar o "Aumento de sensibilidade" lembre-se de marcá-la. </p> <p> Fale alto, como quando está incomodado ou animado. Diminua o volume no painel de controle até que a barra abaixo fique o mais alto possível na listrada e vazia, mas <b>não</b> na zona xadrez enquanto fala. </p> Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode Agora fale suavemente, como falaria de noite, quando não quer perturbar ninguém. Ajuste a barra deslizante para baixo de modo que a barra se mova até a zona vazia quando fala, mas permaneça na listrada enquanto está em silêncio. Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode A seguir precisa ajustar a seguinte barra deslizante. As primeiras palavras que falar devem chegar a área vazia (definitivamente fala). Enquanto fala deve ficar dentro da listrada (pode ser fala) e quando não estiver a falar tudo deve ficar na área xadrez (definitivamente não é fala). In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) Nesta configuração, o Mumble usará <b>baixa quantidade de largura de banda</b>. Isso inevitavelmente resultará em alta latência e baixa qualidade. Escolha esta opção somente se a sua conexão não suporta outra configuração. (16kbit/s, 60ms por pacote) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) Esta é a configuração <b>padrão recomendada</b>. Ela fornece um bom equilíbrio entre qualidade, latência e uso de largura de banda. (40 bit/s, 20ms por pacote) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) Esta configuração é recomendado apenas em situações em que a largura de banda não é problema, como uma rede local. Ela fornece a menor latência suportada pelo Mumble e <b>alta qualidade</b>. (72kbit/s, 10ms por pacote) BanEditor Mumble - Edit Bans Mumble - Editar Banimentos &Address &Endereço &Mask &Máscara Reason Razão Start Início End Fim User Utilizador Hash Hash &Add &Adicionar &Update At&ualizar &Remove &Eliminar Ban List Lista de banidos Search field Campo de pesquisa This is the search field. Use it to find bans that have this username set in the username field. Este é o campo de procura. Utilize-o para encontrar banimentos que têm este nome de utilizador no campo nome de utilizador. Who are you looking for? Quem procura? No nickname Sem alcunha IP address Endereço IP No IP address Sem endereço IP Reason for the ban Razão para o banimento No reason Sem razão Ban end date Data de fim de banimento Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). Data de fim de banimento. Se definir a mesma data para início e fim, o banimento será permanente (não irá expirar). Certificate hash Hash do certificado No certificate hash Sem hash do certificado Banned users Utilizadores banidos This is a list with banned users. Isto é a lista de utilizadores banidos. Use this button if you want to add a new ban. Utilize este botão se quer banir alguém. Use this button if you want to update ban information. Utilize este botão se quer atualizar a informação do banimento. Use this button if you want to remove user from the ban list. Utilize este botão se quer remover o utilizador da lista de banidos. Clear all fields Limpar todos os campos This button clears all fields. Use it if you want to add a new ban. Este botão limpa todos os campos. Utilize-o se quer adicionar um novo banimento. Clear Limpar Ban List - %n Ban(s) Lista de banimentos - %n banimentoLista de banimentos - %n banimentos CertView Name Nome Email Email Issuer Emissor Expiry Date Data de Expiração (none) (nenhum) Self-signed Auto-assinado CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. Não foi possível validar email.<br />Especifique um email válido (ou em banco) para continuar. There was an error generating your certificate.<br />Please try again. Houve um erro a gerar o seu certificado.<br />Por favor tente novamente. Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. O seu certificado e chave não podem ser exportado para o formato PKCS#12. Pode haver um erro em seu certificado. The file could not be opened for writing. Please use another file. O ficheiro não pôde ser aberto para escrita. Por favor use outro. The file's permissions could not be set. No certificate and key has been written. Please use another file. As permissões do ficheiro não puderam ser definidas. Nenhum certificado e chave foram escritos. Por favor use outro ficheiro. The file could not be written successfully. Please use another file. O ficheiro não pôde ser escrito com sucesso. Por favor use outro. The file could not be opened for reading. Please use another file. O ficheiro não pôde ser aberto para leitura. Por favor use outro. The file is empty or could not be read. Please use another file. O ficheiro está vazio ou não pôde ser lido. Por favor use outro. The file did not contain a valid certificate and key. Please use another file. O ficheiro não continha um certificado e chave válidos. Por favor use outro. Select file to export certificate to Selecione o ficheiro para o qual exportar o certificado Select file to import certificate from Selecione o ficheiro do qual importar o certificado Unable to import. Missing password or incompatible file type. <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. <b>Expiração do certificado:</b> O seu certificado está prestes a expirar. Precisa renová-lo, ou não será mais capaz de se conectar aos servidores em que está registado. Certificates Certificate Management Gestão de certificados Certificate Authentication Autenticação de certificado Authenticating to servers without using passwords Autenticar em servidores sem usar senhas Current certificate Certificado atual This is the certificate Mumble currently uses. Este é o certificado que o Mumble usa atualmente. Current Certificate Certificado atual Create a new certificate Criar um novo certificado This will create a new certificate. Isto irá criar um novo certificado. Import certificate from file Importar certificado a partir de um ficheiro This will import a certificate from file. Isto irá importar um certificado a partir de um ficheiro. Import a certificate Importar um certificado Export Certificate Exportar certificado This will export a certificate to file. Isto irá exportará um certificado para um ficheiro. Export current certificate Exportar certificado atual Import Certificate Importar certificado PKCS #12 Certificate import Importar certificado PKCS #12 <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>O Mumble pode importar certificados gravados no formato PKCS #12. Este é o formato usado quando exportar uma chave de Mumble, e também quando exportar chaves do Firefox, Internet Explorer, Opera etc.</p><p>Se o ficheiro é protegido por senha, vai precisar da senha para importar o certificado. </ P> Import from Importar de Filename to import from Nome do ficheiro do qual importar This is the filename you wish to import a certificate from. Este é o nome do ficheiro do qual pretende importar um certificado. Select file to import from Selecione um ficheiro do qual importar This opens a file selection dialog to choose a file to import a certificate from. Abre um diálogo de seleção de ficheiro para escolher um ficheiro do qual importar certificado. Open... Abrir... Password Senha Password for PKCS#12 file Senha para ficheiro PKCS #12 This is the password for the PKCS#12 file containing your certificate. Esta é a senha para o arquivo PKCS #12 contendo o seu certificado. Certificate to import Certificado a importar This is the certificate you are importing. Este é o certificado que está a importar. Certificate Details Detalhes do certificado Replace Certificate Substituir certificado Replace existing certificate with new certificate? Substituir certificado atual com novo certificado? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> <p>Já possui um certificado gravado no Mumble, e esta prestes a substituí-lo.</p> <p>Se está a atualizar um certificado emitido pela sua AC confiável e o endereço de e-mail coincide com o seu certificado atual, isto é totalmente seguro, e servidores aos quais se conectar vão reconhecer automaticamente o certificado robusto para o seu endereço de email. </p> <p>Se este não é o caso, não será mais reconhecido em nenhum servidor onde se autenticou. Se ainda não se registou em nenhum servidor, isto também não é nada para se preocupar. </p> <p> Tem certeza de que quer substituir o seu certificado? </p> This is the certificate Mumble currently uses. It will be replaced. Este é o certificado que o Mumble usa atualmente. Ele será substituído. New certificate Novo certificado This is the new certificate that will replace the old one. Este é o novo certificado que substituirá o antigo. New Certificate Novo cerificado Make a backup of your certificate Fazer uma cópia de segurança do seu certificado Export to Exportar para Filename to export to Nome do ficheiro para o qual exportar This is the filename you wish to export a certificate to. Este é o nome do ficheiro para o qual quer exportar o certificado. Save As... Gravar como... This is the certificate Mumble currently uses. It will be exported. Este é o certificado que o Mumble usa atualmente. Será exportado. Generate a new certificate for strong authentication Gerar um novo certificado para autenticação robusta <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> <p>O Mumble irá gerar um certificado robusto para autenticação nos servidores.</p><p>Se quiser pode fornecer algumas informações adicionais que podem ser gravadas no certificado, que serão apresentadas aos servidores ao se conectar. Se fornecer um endereço de email válido, você pode atualizar para um certificado de email emitido por uma AC no futuro, o que fornece uma identificação robusta.</p> Name Nome Email Email Your email address (e.g. johndoe@mumble.info) O seu endereço de email (ex. joaoromao@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. Este é o seu endereço de email. Fortemente recomendado que forneça um endereço de e-mail válido, já que isto permitirá que atualize para um certificado robusto sem problemas de autenticação. Your name (e.g. John Doe) O seu nome (ex. João Romão) This is your name, and will be filled out in the certificate. This field is entirely optional. Este é o seu nome, e será preenchido no certificado. Este campo é inteiramente opcional. Finish Terminar Certificate-based authentication is ready for use Autenticação baseada em certificado pronta para uso Enjoy using Mumble with strong authentication. Aproveite o Mumble com autenticação robusta. Automatic certificate creation Criação automática de certificado <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>Se algum dia perder o seu certificado atual, o que aconteceria se o seu computador sofresse uma falha de hardware ou se reinstalar a sua máquina, não poderá mais se autenticar em nenhum servidor no qual você se registou. É portanto <b>mandatório</b> que faça uma cópia de segurança do seu certificado. Nos recomendamos fortemente que grave esta cópia de segurança em um dispositivo de armazenamento removível, como um pen-drive.</p> <p>Note que este ficheiro não será encriptado, e se alguém obtiver o acesso a ele, eles serão capazes de se passar por si, então cuide muito bem dele.</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> ChanACL None Nenhum Traverse Percorrer Enter Entrar Speak Falar Mute/Deafen Silenciar/Ensurdecer Make channel Criar canal Make temporary Criar temporário Link channel Ligar canal This represents no privileges. Isto representa ausência de privilégios. This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. Isto representa acesso total ao canal, incluindo a habilidade de mudar informações de grupo e LCA. Este privilégio implica todos os outros privilégios. This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. Isto representa a permissão de percorrer o canal. Se a um utilizador é-lhe negado este privilégio, ele não conseguirá aceder a este canal ou qualquer subcanal de modo algum, independente de outras permissões em subcanais. This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. Isto representa a permissão de entrar no canal. Se possui uma estrutura hierárquica de canais, pode querer dar Percorrer a todos, mas restringir Entrar na raiz da sua hierarquia. This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. Isto representa a permissão de falar em um canal. Utilizadores sem este privilégio irão ser suprimidos pelo servidor (visto como silenciado), e será incapaz de falar até ser removido de silenciado por alguém com os privilégios apropriados. This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. Isto representa a permissão de sussurrar para este canal a partir de fora. Isto funciona exatamente como o privilégio de <i>falar</i>, mas aplica-se a pacotes falados com a tecla de Sussurro pressionada. Isto pode ser usado para transmitir para uma hierarquia de canais sem ligação. This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. Isto representa a permissão de silenciar e ensurdecer outros utilizadores. Uma vez silenciado, um utilizador permanecerá assim até lhe ser removido silenciar por um utilizador com privilégios ou ao se ligar de novo ao servidor. This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. Isto representa a permissão de mover um utilizador para outro canal ou expulsá-lo do servidor. Para realmente mover o utilizador, o utilizador deve possuir o privilégio de Mover no canal destino, ou o utilizador deve ser normalmente permitido de entrar no canal. Utilizadores com este privilégio podem mover utilizadores para canais onde o utilizador normalmente não teria permissão para entrar. This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. Isto representa a permissão de criar subcanais. O utilizador que cria o subcanal será adicionado ao grupo admin do subcanal. This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. Isto representa a permissão de criar um subcanal temporário. O utilizador que criar o subcanal será adicionado ao grupo admin do subcanal. Canais temporários não são gravados, e desaparecem quando o último utilizador sair. This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. Isto representa a permissão de ligar canais. Utilizadores em canais ligados podem ouvir-se uns aos outros, desde que o utilizador a falar possua privilégio <i>falar</i> no canal do ouvinte. Precisa do privilégio ligar em ambos canais para ligá-los, mas apenas num deles para desfazer. This represents the permission to write text messages to other users in this channel. Isto representa a permissão de escrever mensagens de texto para outros utilizadores neste canal. This represents the permission to forcibly remove users from the server. isto representa a permissão de remover utilizadores do servidor a força. This represents the permission to permanently remove users from the server. Isto representa a permissão de remover utilizadores permanentemente do servidor. This represents the permission to register and unregister users on the server. Isto representa a permissão de registar e eliminar utilizadores do servidor. This represents the permission to register oneself on the server. Isto representa a permissão de se registar no servidor. Whisper Sussurrar Move Mover Text message Mensagem de texto Kick Expulsar Ban Banir Register User Registrar utilizador Register Self Registar-se Write ACL Escrever LCA ChatbarTextEdit Paste and &Send Paste and send Colar e &Enviar <center>Type chat message here</center> <center>Escreva a mensagem aqui</center> ClientUser Friend Amigo Authenticated Autenticado Priority speaker Falante prioritário Recording A Gravar Muted (server) Silenciado (servidor) Deafened (server) Surdo (servidor) Local Ignore (Text messages) Ignorado localmente (Mensagens de texto) Local Mute Silenciado Localmente Muted (self) Silenciado (próprio) Deafened (self) Surdo (próprio) ConfigDialog Accept changes Aceitar alterações This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. Este botão vai aceitar as configurações atuais e retornar a aplicação.<br />As configurações serão gravadas no disco quando sair da aplicação. Reject changes Rejeitar alterações This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. Este botão vai rejeitar todas alterações e voltar a aplicação.<br />As configurações serão repostas para as posições anteriores. Apply changes Aplicar alterações This button will immediately apply all changes. Este botão vai aplicar todas alterações imediatamente. Undo changes for current page Desfazer alterações para a página atual This button will revert any changes done on the current page to the most recent applied settings. Este botão vai reverter qualquer alteração feita na página atual para as configurações aplicadas mais recentemente. Restore defaults for current page Restaurar padrões para a página atual This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. Este botão vai gravar as configurações padrão para a página atual. Outras páginas não serão alteradas.<br />Para restaurar todas as configurações para seus padrões, terá que usar este botão em cada página. Mumble Configuration Configuração do Mumble ConnectDialog Connecting to %1 Conectando a %1 Enter username Especifique um nome de utilizador Adding host %1 A adicionar servidor %1 Servername Nome do servidor Hostname Nome do servidor Bonjour name Nome Bonjour Port Porta Addresses Endereços Website Página web Packet loss Perda de pacotes Ping (80%) Ping (80%) %1 ms %1 ms Ping (95%) Ping (95%) Bandwidth Largura de banda %1 kbit/s %1 kbit/s &Connect &Conectar &Filters &Filtros Unknown Users Utilizadores Version Versão Failed to fetch server list Falha ao obter lista de servidores Mumble Server Connect Conexão ao servidor Mumble Ping Ping Remove from Favorites Eliminar dos favoritos Add custom server Adicionar servidor personalizado Show all servers that respond to ping Mostrar todos servidores que respondem ao ping Show all servers with users Mostrar todos servidores com utilizadores Show all servers Mostrar todos servidores &Copy &Copiar Copy favorite link to clipboard Copiar ligação do favorito para área de transferência &Paste &Colar Paste favorite from clipboard Colar favorito da área de transferência &Edit... &Editar... &Add New... &Adicionar novo... Add to &Favorites Adicionar aos &Favoritos Open &Webpage Abrir página &web Show &Reachable Mostrar a&lcançáveis Show &Populated Mostrar &Povoados Show &All Mostrar &todos ConnectDialogEdit Edit Server Editar servidor Name of the server Nome do servidor A&ddress &Endereço Internet address of the server. Internet address of the server. Endereço de internet do servidor. <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Endereço</b><br/> Endereço de internet do servidor. Isto pode ser um nome de host normal, um endereço IPv4/6 ou um identificador de serviços Bonjour. Identificadores de serviço Bonjour devem ser prefixados com '@' para serem reconhecidos pelo Mumble. &Port &Porta Port on which the server is listening Porta que o servidor escuta <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. <b>Porta</b><br/> Porta que o servidor escuta. Se o servidor é identificado por um identificador Bonjour, este campo é ignorado. &Username Nome de &utilizador Username to send to the server Nome de utilizador enviado ao servidor <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. <b>Nome de utilizador</b><br/> Nome de utilizador para enviar ao servidor. Lembre-se que o servidor pode impor restrições em como um nome de utilizador pode parecer. Além disso seu nome já pode estar em uso. Label Etiqueta Add Server Adicionar servidor You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 Password Senha Password to send to the server Senha para enviar ao servidor <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. <b>Senha</b><br/> Senha para enviar ao servidor na conexão. Essa senha é necessária ao conectar-se como <i>SuperUser</i> ou para servidor com autenticação por senha. Se não especificada a senha é perguntada na conexão. Show password Mostrar senha <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. <b>Etiqueta</b><br/> Etiqueta do servidor. É como o servidor será exibido na lista de favoritos, e pode ser livremente escolhido. Local server label Etiqueta servidor local 127.0.0.1 127.0.0.1 64738 64738 Your username O seu nome de utilizador Your password A sua senha &Fill CoreAudioSystem Default Device Dispositivo padrão CrashReporter Mumble Crash Report Informe o Erro do Mumble <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> <p><b>Sentimos muitíssimo, mas parece que o Mumble encerrou inesperadamente. Quer enviar um relatório de erro para os programadores do Mumble?</b></p><p>O relatório contém uma cópia parcial da memória do Mumble durante a falha, e ajudará os programadores a resolver o problema.</p> Email address (optional) Endereço de email (opcional) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash Por favor, descreva brevemente, em Inglês, o que estava a fazer quando o Mumble encerrou inesperadamente Send Report Enviar relatório Don't send report Não enviar relatório Crash upload successful Relatório enviado com sucesso Thank you for helping make Mumble better! Obrigado por ajudar a melhorar o Mumble melhor! Crash upload failed Envio de relatório falhou We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. Nós sentimos muito, mas parece que o relatório do erro falhou com o erro: %1 %2. Por favor informe um programador. This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 Isto realmente não é nada divertido, mas aparentemente há uma falha no código para reportar falhas, e nós não pudemos enviar o relatório. Pode informar um programador sobre o erro %1 Uploading crash report A enviar relatório de erro Abort upload Abortar envio DXAudioInput Default DirectSound Voice Input Entrada de voz padrão do DirectSound Opening chosen DirectSound Input device failed. No microphone capture will be done. Abrir o dispositivo de entrada escolhido para o DirectSound falhou. Nenhuma captura de microfone será feita. Opening chosen DirectSound Input failed. Default device will be used. Abrir a entrada escolhida para o DirectSound falhou. O dispositivo padrão será usado. Lost DirectSound input device. Dispositivo de entrada do DirectSound perdido. DXAudioOutput Default DirectSound Voice Output Dispositivo de saída de voz padrão do DirectSound Opening chosen DirectSound Output failed. Default device will be used. Abrir o dispositivo de saída escolhido para o DirectSound falhou. O dispositivo padrão será usado. Lost DirectSound output device. Dispositivo de saída do DirectSound perdido. Opening chosen DirectSound Output failed. No audio will be heard. Abrir o dispositivo de saída escolhido para o DirectSound falhou. Nenhum áudio será ouvido. Database Mumble failed to initialize a database in any of the possible locations. Mumble falhou ao iniciar a base de dados em qualquer dos locais possíveis. The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. A base de dados '%1' é somente leitura. O Mumble não pode gravar as configurações do servidor (ex. certificados SSL) até resolver este problema. DeveloperConsole Developer Console DockTitleBar Drag here Arrastar aqui GlobalShortcut Shortcuts Atalhos List of configured shortcuts Lista dos atalhos configurados Function Função Data Dados Shortcut Atalho Suppress Suprimir Add new shortcut Adicionar novo atalho This will add a new global shortcut Isto vai adicionar um novo atalho global &Add &Adicionar Remove selected shortcut Eliminar o atalho selecionado This will permanently remove a selected shortcut. Eliminará permanentemente o atalho selecionado. &Remove &Eliminar <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> <html><head/><body><p>Atualmente o Mumble só pode usar botões do rato e as teclas modificadoras do teclado (Alt, Ctrl, Cmd, etc.) para atalhos globais.</p><p>Se quer mais flexibilidade pode ativar <span style=" font-style:italic;">Acesso para dispositivos de assistência</span> nas preferências de Acessibilidade do sistema. Por favor note no entanto, que essa mudança também permite potencialmente programas maliciosos de ver o que é escrito no seu teclado.</p></body></html> Open Accessibility Preferences Abrir Preferências de Acessibilidade Skip Saltar Enable Global Shortcuts Ativar Atalhos Globais <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. Additional Shortcut Engines <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. Enable Windows hooks <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. Enable GKey <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. Enable XInput <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. Enable shortcuts in privileged applications GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> <html><head/><body><p>Atualmente, o Mumble só pode usar botões do rato e teclas modificadoras do teclado (Alt, Ctrl, Cmd, etc.) como atalhos globais.</p><p>Se deseja mais flexibilidade, pode adicionar o Mumble como um programa de acessibilidade de confiança na secção de Segurança & Privacidade nas Preferências de Sistema do seu Mac.</p><p>No painel de preferências de Segurança & Privacidade, mude para o separador de Privacidade. Depois escolha Acessibilidade (perto do fundo) na lista à esquerda. Finalmente, adicione o Mumble à lista de programas de acessibilidade de confiança.</body></html> Shortcuts Atalhos Shortcut button combination. Combinação de teclas do atalho. <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. <b>Esta é a combinação de teclas global.</b><br />Clique neste campo e depois pressione a combinação desejada de teclas/botões para reassociá-las. Clique duas vezes para limpar. Suppress keys from other applications Suprimir teclas de outras aplicações <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. <b>Oculta o pressionamento de botões de outras aplicações.</b><br />Ativar isto ocultará o botão (ou pelo menos o último botão de uma combinação de vários botões) de outras aplicações. Note que nem todos botões podem ser suprimidos. GlobalShortcutTarget Whisper Target Alvo do sussurro Whisper to list of Users Sussurrar para lista de Utilizadores Channel Target Canal alvo Restrict to Group Restringir para Grupo If specified, only members of this group will receive the whisper. Se especificado, apenas membros deste grupo receberão o sussurro. List of users Lista de utilizadores Add Adicionar Remove Eliminar Modifiers Modificadores Do not send positional audio information when using this whisper shortcut. Não enviar informação de áudio posicional quando usar este atalho de sussuro. Ignore positional audio Ignorar áudio posicional Shout to Linked channels Gritar para canais vinculados Shout to subchannels Gritar para subcanais Shout to Channel Gritar para Canal The whisper will also be transmitted to linked channels. O sussurro também será transmitido para canais ligados. The whisper will also be sent to the subchannels of the channel target. O sussurro também será enviado para subcanais no canal alvo. GlobalShortcutX Mouse %1 Rato %1 JackAudioSystem Hardware Ports Mono Stereo LCD Not connected Não ligado LCDConfig Enable this device Ativar este dispositivo LCD LCD Devices Dispositivos Name Nome <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> <p>Esta é a lista de dispositivos LCD disponíveis no seu sistema. Ela lista dispositivos pelo nome, mas também inclui o tamanho do visor. O Mumble suporta saídas para vários dispositivos LCD ao mesmo tempo.</p> <h3>Tamanho:</h3> <p> Este campo descreve o tamanho de um dispositivo LCD. O tamanho é dado em pixels (para LCDs gráficos) ou em caracteres (para LCDs de caracteres).</p> <h3>Ativo:</h3> <p>Decide se o Mumble deve ou não mostrar-se em determinado dispositivo LCD.</p> Size Tamanho Enabled Ativo Views Visualizações Minimum Column Width Largura mínima da coluna <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> <p>Decide a largura mínima de uma coluna na Visualização de Utilizador.</p> <p>Se muitas pessoas estão a falar ao mesmo tempo, a Visualização de utilisador se dividirá em colunas. Pode usar esta opção para escolher uma concessão entre o número de utilizadores mostrados no LCD, e a largura dos nomes de utilizador.</p> This setting decides the width of column splitter. Esta configuração decide a largura da divisão da coluna. Splitter Width Largura do divisor Log Debug Depuração Critical Crítico Warning Aviso Information Informação Server Connected Servidor Ligado Server Disconnected Servidor Desligado Other self-muted/deafened Outro se silenciou/ensurdeceu a si mesmo Permission Denied Permissão negada Text Message Mensagem de texto User Joined Server Ustilizador entrou no servidor User Left Server Utilizador deixou o servidor User recording state changed Utilizador mudou o estado de gravação User kicked (you or by you) Utilizador expulso (a si ou por você) User kicked Utilizador expulso You self-muted Silenciou-se a si mesmo User muted (you) Utilizador silenciado (você) User muted (by you) Utilizador silenciado (por si) User muted (other) Utilizador silenciado (outro) User Joined Channel Utilizador entrou no canal User Left Channel Utilizador deixou o canal You self-unmuted Retirou silenciar de si mesmo You self-deafened Ensurdeceu-se a si mesmo You self-undeafened Retirou ensurdecer de si mesmo User renamed Utilizador renomeado You Joined Channel You Joined Channel (moved) User connected and entered channel User left channel and disconnected Private text message the server o servidor [[ Invalid size ]] [[ Text object too large to display ]] [[ Objeto de texto demasiado grande para ser mostrado ]] [Date changed to %1] [Data alterada para %1 link to %1 ligação para %1 FTP link to %1 player link ligação para jogador channel link ligação de canal %1 link %1 ligação LogConfig Toggle console for %1 events Alternar console para eventos %1 Toggle pop-up notifications for %1 events Alternar notificações de pop-up para eventos %1 Toggle Text-To-Speech for %1 events Alternar Texto-para-Voz para eventos %1 Click here to toggle sound notification for %1 events Clique aqui para alternar notificações de som para eventos %1 Toggle window highlight (if not active) for %1 events Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change Caminho para o ficheiro de som usado nas notificações de som para o caso de eventos %1<br />Clique uma vez para ouvir<br />Clique duas vezes para alterar Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. Clique aqui para alterar a saída da consola para eventos %1.<br />Se marcada, esta opção faz o Mumble escrever todos eventos %1 no seu registo de mensagens. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. Clique aqui para alternar as notificações de pop-up para eventos %1.<br />Se marcada, uma pop-up de notificação será criada pelo Mumble para cada evento %1. Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. Caminho para o ficheiro de som usado para notificações de som no caso de eventos %1<br />Clique uma vez para ouvir<br />Clique duas vezes para alterar<br />Certifique-se de que notificações sonoras para estes eventos estão ativas ou este campo não terá efeito. Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. Clique aqui para alternar Texto-para-Fala para eventos %1.<br />Se marcada, o Mumble usa Texto-para-Voz para ler eventos %1 para si. Texto-para-Voz também é capaz de ler conteúdos do evento o que não é verdade para ficheiros sonoros. Texto-para-Voz e ficheiros sonoros não podem ser usados ao mesmo tempo. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. Clique aqui para alternar notificações sonoras para eventos %1.<br />Se marcada, o Mumble usa um ficheiro de som predefinido por si para indicar eventos %1. Ficheiros de som e Texto-para-Voz não podem ser usados ao mesmo tempo. Messages Mensagens Message Mensagem Console Consola Notification Notificação Text-To-Speech Texto-para-Voz Soundfile Ficheiro sonoro Path Caminho Text To Speech Texto para Voz Volume Volume Volume of Text-To-Speech Engine Volume do motor de Texto-para-Voz <b>This is the volume used for the speech synthesis.</b> <b>Este é o volume usado para síntese da fala.</b> Length threshold Limite de duração Message length threshold for Text-To-Speech Engine Limite de tamanho de mensagem para o motor de Texto-para-Voz <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. <b>Este é o limite usado para o motor de Texto-para-Voz.</b><br />Mensagens maiores do que o limite não serão lidas até o fim. Characters Caracteres Whisper Sussurro If checked you will only hear whispers from users you added to your friend list. Se marcado só ouvirá sussurros de utilizadores na sua lista de amigos. Only accept whispers from friends Só aceitar sussurros de amigos If enabled text messages you send will be read back to you with TTS Se ativado mensagens de texto que enviar serão lidas pela TPF Read back own messages Ler próprias mensagens Chat Log Registo de conversa Maximum chat length Tamanho máximo da conversa Unlimited Ilimitado Lines Linhas Highlight LookConfig System default Padrão do sistema None Nenhum Only with users Apenas com utilizadores All Todos Ask Perguntar Do Nothing Não fazer nada Move Mover <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory <a href="%1">Navegar</a> User Interface Interface de utilizador This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. Isto especifica quais canais expandir automaticamente. <i>Nenhum</i> e <i>Todos</i> expandirá nenhum ou todos os canais, enquanto <i>Apenas com utilizadores</i> expandirá e compactará canais conforme utilizadores entram e saem. List users above subchannels (requires restart). Listar utilizadores acima dos subcanais (requer reiniciar). <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. <b>Se marcado, utilizadores serão mostrados acima dos subcanais na visão dos canais.</b><br />Um reinicio do Mumble é necessário para ver a alteração. Users above Channels Utilizadores acima dos canais <b>If set, will verify you want to quit if connected.</b> <b>Se marcado, verificará se quer sair se ligado</b> Show number of users in each channel Mostrar número de utilizadores em cada canal Show channel user count Mostrar contagem de utilizadores no canal Language Idioma Language to use (requires restart) Idioma a usar (requer reiniciar) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. <b>Escolhe qual idioma o Mumble deve usar.</b><br />Deve reiniciar o Mumble para usar o novo idioma. Look and Feel Aparência Layout Disposição Classic Clássica Stacked Empilhada Hybrid Híbrida Custom Personalizada This changes the behavior when moving channels. Isto altera o comportamento ao mover canais. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. Configura o comportamento do movimento de canais, pode ser usado para evitar movimentos acidentais. <i>Mover</i> move o canal sem perguntar. <i>Não fazer nada</i> não faz nada e mostra uma mensagem de erro. <i>Perguntar</i> usa uma caixa de mensagem para confirmar se realmente quer mover o canal. Expand Expandir When to automatically expand channels Quando expandir canais automaticamente Channel Dragging Movimento de Canais Ask whether to close or minimize when quitting Mumble. Perguntar fechar ou minimizar ao encerrar o Mumble. Ask on quit while connected Perguntar ao sair enquanto ligado Always On Top Sempre no topo <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> <b>Se marcado, minimizar a janela principal do Mumble fará com que ela seja escondida e acessível apenas através da bandeja de sistema. De outro modo, ela será minimizada como uma janela normalmente seria.</b> Hide in tray when minimized Esconder na bandeja de sistema quando minimizada Hide the main Mumble window in the tray when it is minimized. Esconder a janela principal do Mumble na bandeja de sistema quando minimizada. This setting controls when the application will be always on top. Esta opção controla quando é que a aplicação fica sempre visível. Never Nunca Always Sempre In minimal view Na visão mínima In normal view Na visão normal Displays talking status in system tray Mostrar estado de fala na bandeja de sistema Show talking status in tray icon Mostrar estado de fala no ícone da bandeja This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. Isto Controla em que situações a aplicação fica sempre visível. Se escolher <i>Nunca</i> a aplicação não ficará sempre visível. <i>Sempre</i> manterá a aplicação sempre visível. <i>Na visão mínima</i> / <i>Na visão normal</i> apenas manterá a aplicação sempre visível quando a visão mínima estiver ativa /desactivada. Show context menu in menu bar Mostra o menu de contexto na barra de menus Apply some high contrast optimizations for visually impaired users Aplica otimizações de alto contraste para utilizadores com deficiência visual Optimize for high contrast Otimizar para alto contraste Application Aplicação Adds user and channel context menus into the menu bar Adicionar menus de contexto de utilizador e canal na barra de menu Tray Icon Ícone da bandeja de sistema Channel Tree Árvore de canais Use selected item as the chat bar target Usar item selecionado como o alvo da barra de conversa Filter automatically hides empty channels Filtro esconde automaticamente todos os canais Show transmit mode dropdown in toolbar Mostrar menu de seleção do modo de transmissão na barra de ferramentas Theme Tema Theme to use to style the user interface Tema a utilizar na interface de utilizador <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. <b>Configura qual o tema que deve ser usado na interface de utilizador do Mumble</b><br />O Mumble recolhe temas de certos diretórios e mostra-os nesta lista. Aquele que selecionar será usado para personalizar a aparência visual do Mumble. Isto incluí cor, ícones, entre outros. User Dragging This changes the behavior when moving users. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. Enable Developer menu When in custom layout mode, checking this disables rearranging. Lock layout MainWindow Root Raiz Push-to-Talk Global Shortcut Pressionar-para-Falar Push and hold this button to send voice. Global Shortcut Pressione e mantenha este botão para enviar voz. This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut Isto configura o botão de pressionar-para-falar, e enquanto mantiver este botão pressionado, transmite voz. Reset Audio Processor Global Shortcut Repor processador de áudio Unlink Plugin Global Shortcut Desligar Plugin Push-to-Mute Global Shortcut Pressionar-para-Silenciar Join Channel Global Shortcut Entrar no canal Toggle Overlay Global Shortcut Alternar sobreposição Toggle state of in-game overlay. Global Shortcut Alternar estado da sobreposição em jogo. Toggle Minimal Global Shortcut Alternar mínimo Volume Up (+10%) Global Shortcut Aumentar volume (+10%) Volume Down (-10%) Global Shortcut Baixar volume (-10%) Mumble Mumble Mumble -- %1 Mumble -- %1 &Window &Janela Minimize Minimizar Ctrl+M Ctrl+M Close Fechar Mumble is currently connected to a server. Do you want to Close or Minimize it? O Mumble está ligado a um servidor atualmente. Gostaria de fechá-lo ou minimizá-lo? Mute Self Global Shortcut Silenciar-se Set self-mute status. Global Shortcut Configura seu estado de silenciar-se. This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut Isto configura ou altera o seu estado de silenciar. Se desativar isto, também desativará o ensurdecimento. Deafen Self Global Shortcut Ficar surdo Set self-deafen status. Global Shortcut Configura estado de ensurdecimento. This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut Isto configura ou altera o seu estado surdo. Se ativar isso, também ativar o silenciar-se. Whisper/Shout Whisper Sussurrar/Gritar <center>Not connected</center> Not connected <center>Não ligado</center> Clear Limpar Opening URL %1 A abrir URL %1 File does not exist Ficheiro não existe File is not a configuration file. Ficheiro não é de configuração. Settings merged from file. Configurações combinadas de ficheiro. URL scheme is not 'mumble' Forma de URL não é 'mumble' This version of Mumble can't handle URLs for Mumble version %1.%2.%3 Esta versão do Mumble não consegue lidar com URLs para o Mumble versão %1.%2.%3 Connecting to %1 A ligar a %1 Enter username Especifique o nome de utilizador Connecting to server %1. A ligar ao servidor %1. Reconnecting. A ligar de novo. Transmit Mode set to Continuous Modo de Transmissão definido para Contínuo <p>%1 (%2)<br />%3</p> <p>%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> <h2>Canal de voz</h2><p>Encriptado com 128 bit OCB-AES128<br />%1 ms de latência média (divergência %4)</p> Register yourself as %1 Registar-se como %1 <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <p>Está prestes a se registar neste servidor. Esta ação não pode ser desfeita, e o seu nome de utilizador não pode ser alterado uma vez que esta ação se complete. Será conhecido para sempre como '%1' neste servidor.</p><p>Tem certeza de que se quer registar?</p> <h2>Version</h2><p>Protocol %1</p> <h2>Versão</h2><p>Protocolo %1</p> <p>No build information or OS version available</p> <p>Sem informação de build ou versão de SO disponível</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) A ligação está encriptada e autenticada utilizando %1 e utiliza %2 como mecanismo de troca de chaves (%3) The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) A ligação está encriptada utilizando %1, com %2 utilizado para autenticação de mensagens e %3 como mecanismo de troca de chaves (%4) The connection is secured by the cipher suite that OpenSSL identifies as %1 A ligação é protegida pelo conjunto de cifra que o OpenSSL identifica como %1 <p>The connection provides perfect forward secrecy</p> <p>A ligação fornece <i>perfect forward secrecy</i></p> <p>The connection does not provide perfect forward secrecy</p> <p>A ligação não fornece <i>perfect forward secrecy</i></p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> <h2>Controlar canal</h2><p>A ligação utiliza %1</p>%2%3<p>%4 ms latência média (%5 desvio)</p><p>Host remoto %6 (porta %7)</p> Voice channel is sent over control channel Canal de voz é enviado sobre canal de controlo Register user %1 Registar utilizador %1 <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> <p>Está prestes a registar %1 no servidor. Esta ação não pode ser desfeita, o nome de utilizador não pode ser alterado e, como utilizador registado, %1 terá acesso ao servidor mesmo se alterar a senha do servidor.</p><p>Deste ponto em diante, %1 será autenticado com o certificado em uso atualmente.</p><p>Tem a certeza que quer registar %1?</p> Kicking user %1 A expulsar utilizador %1 Banning user %1 A banir utilizador %1 View comment on user %1 Ver comentário no utilizador %1 Message to channel %1 Mensagem para canal %1 Connected. Ligado. <li>Expected certificate digest (SHA-1): %1</li> Server presented a certificate which failed verification. Servidor apresentou um certificado que falhou a verificação. <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> SSL Version mismatch Versões SSL não coincidem Server connection failed. <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>Escreva a mensagem para o canal '%1' aqui</center> <center>Type message to user '%1' here</center> Type message to user '%1' here <center>escreva a mensagem para o utilizador '%1' aqui</center> Choose image file Escolher um ficheiro de imagem Failed to load image Falha ao carregar imagem Could not open file for reading. Não pode abrir o ficheiro para leitura. Image format not recognized. Formato de imagem não reconhecido. &User &Utilizador &Channel &Canal Use in conjunction with Whisper to. Global Shortcut Usar em conjunto com Sussuro. This will switch the states of the in-game overlay. Global Shortcut Isto alterna os estados da sobreposição em jogo. Link Channel Global Shortcut Ligar Canal Cycle Transmit Mode Global Shortcut Percorrer pelos modos de transmissão Set Transmit Mode to Push-To-Talk Global Shortcut Set Transmit Mode to Continuous Global Shortcut Set Transmit Mode to VAD Global Shortcut Send Text Message Global Shortcut Enviar Mensagem de Texto Send Clipboard Text Message Global Shortcut This will send your Clipboard content to the channel you are currently in. Global Shortcut Continuous Contínuo Voice Activity Atividade de voz Push-to-Talk Pressionar-para-Falar Mumble - Minimal View -- %1 Mumble - Vista Mínima -- %1 Cancel Cancelar Save Image As... Guardar Imagem Como... Save Image File Guardar Ficheiro de Imagem Could not save image: %1 Não foi possível guardar imagem: %1 Change your comment Alterar o seu comentário Transmit Mode set to Voice Activity Modo de Transmissão definido para Atividade de Voz Transmit Mode set to Push-to-Talk Modo de Transmissão definido para Pressionar-para-Falar <p>Connected users: %1/%2</p> <p>Utilizadores ligados: %1/%2</p> UDP Statistics Estatísticas UDP To Server Para servidor From Server Do servidor Good Bons Late Atrasados Lost Perdidos Resync Resincronização <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> <h2>Largura de banda do áudio</h2><p>Máxima %1 kbit/s<br />Atual %2 kbit/s<br />Codec: %3</p> Mumble Server Information Informação do servidor Mumble &View Certificate &Ver Certificado Enter reason Especifique a razão Sending message to %1 A enviar mensagem para %1 To %1: %2 Para %1: %2 Message to %1 Mensagem para %1 Are you sure you want to reset the comment of user %1? Tem certeza de que quer repor o comentário do utilizador %1? Are you sure you want to reset the avatar of user %1? Tem a certeza que quer repor o avatar do utilizador %1? Are you sure you want to delete %1 and all its sub-channels? Tem certeza de que quer eliminar %1 e todos os seus subcanais? Sending message to channel %1 A Enviar mensagem para o canal %1 Message to tree %1 Mensagem para árvore %1 To %1 (Tree): %2 (Tree) %1: %2 Para %1 (Árvore): %2 Unmuted and undeafened. Retirar silenciar e ensurdecer. Unmuted. Retirado silenciar. Muted. Silenciado. Muted and deafened. Silenciado e surdo. Deafened. Surdo. Undeafened. Retidado ensurdecer. Restart Mumble? Reiniciar Mumble? Some settings will only apply after a restart of Mumble. Restart Mumble now? Algumas configurações só terão efeito depois de reinicar o Mumble. Reiniciar o Mumble agora? About Qt Sobre Qt SSL Verification failed: %1 Verificação SSL falhou: %1 <li>Server certificate digest (SHA-1): %1</li> <b>WARNING:</b> The server presented a certificate that was different from the stored one. <b>ATENÇÃO:</b> O servidor apresentou um certificado diferente do armazenado. This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. Este servidor utiliza um padrão de encriptação antigo, e não é mais aceita por versões modernas do Mumble. Server connection failed: %1. Falhou a ligação com o servidor: %1. Disconnected from server. Desligado do servidor. Invalid username Nome de utilizador inválido You connected with an invalid username, please try another one. Ligou-se com um nome de utilizador inválido, por favor tente outro. Username in use Nome de utilizador em uso That username is already in use, please try another username. Este nome de utilizador já está em uso, por favor escolha outro nome de utilizador. Wrong certificate or password Certificado ou senha errados Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. Certificado ou senha errados para utilizador registado. Se tem certeza que este utilizador é protegido por senha por favor tente novamente. Caso contrário aborte e verifique o seu certificado e nome de utilizador. Wrong password Senha errada Wrong server password for unregistered user account, please try again. Senha de servidor errada para conta de utilizador não registado, por favor tente novamente. Images (*.png *.jpg *.jpeg) Imagens (*.png *.jpg *.jpeg) C&onfigure C&onfigurar &Help &Ajuda Log Registo This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. Mostra toda atividade recente. Ligações a servidores, erros e mensagens de informação serão mostradas aqui.<br />Para configurar exatamente quais mensagens aparecem aqui, use o comando <b>Configurações</b> do menu. &Quit Mumble Sa&ir do Mumble Closes the program Fecha o programa Exits the application. Sair do aplicação. Ctrl+Q Ctrl+Q Open the server connection dialog Abrir o diálogo de ligação com o servidor &Disconnect &Desligar Disconnect from server Desligar-se do servidor Disconnects you from the server. Desliga-se do servidor. Show information about the server connection Mostra informação sobre a ligação do servidor This will show extended information about the connection to the server. Mostra informação estendida sobre a ligação com o servidor. &Mute &Silenciar &Deafen Ensur&decer &Local Mute Silenciar &localmente Send a Text Message Enviar uma Mensagem de Texto Sends a text message to another user. Envia mensagem de texto para outro utilizador. Add new channel Adicionar novo canal This adds a new sub-channel to the currently selected channel. Adicionar um novo subcanal ao canal selecionado atualmente. Remove channel Eliminar canal This removes a channel and all sub-channels. Eliminar um canal e todos subcanais. Edit Groups and ACL for channel Editar grupos e LCAs para canal This opens the Group and ACL dialog for the channel, to control permissions. Abre o diálogo de grupos e LCA para o canal, para controlar permissões. &Link &Ligar Link your channel to another channel Ligar o seu canal para outro canal This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. Esta é a barra de conversa<br />Se escrever texto aqui e pressionar enter o texto é enviado para o utilizador ou canal que estava selecionado. Se nada está selecionado o texto é enviado ao seu canal atual. Chatbar Barra de conversa Shows a dialog of registered servers, and also allows quick-connect. Mostra um diálogo de servidores registados, e também permite a ligação rápida. Kick user (with reason) Expulsar utilizador (com motivo) Kick selected user off server. You'll be asked to specify a reason. Expulsar utilizador selecionado do servidor. Será perguntado uma razão específica. Mute user Silenciar utilizador Mute or unmute user on server. Unmuting a deafened user will also undeafen them. Silenciar ou retirar silenciar do utilizador no servidor. Retirar silenciar a um utilisador surdo também vai retirar ensurdecer. Kick and ban user (with reason) Expulsar e banir utilizador (com motivo) Kick and ban selected user from server. You'll be asked to specify a reason. Expulsar e banir o utilizador selecionado do servidor. Será perguntado uma razão específica. Deafen user Ensurdecer ustilizador Deafen or undeafen user on server. Deafening a user will also mute them. Ensurdecer ou retirar ensurdecer do utilizador no servidor. Ensurdecer um utilizador também irá silenciá-lo. Mute user locally Silenciar utilizador localmente Mute or unmute user locally. Use this on other users in the same room. Silenciar ou retirar silenciar a utilizador localmente. Use esta opção em outros utilizadores na mesma sala. This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. Isto liga o seu canal atual ao selecionado. Se utilizadores num canal possuem permissão para falar no outro canal, os utilizadores podem agora ouvir uns aos outros. Esta é uma ligação permanente, e durará até ser manualmente desfeita, ou se o servidor for reiniciado. Por favor veja os atalhos para pressionar-para-ligar. &Unlink Channel &Desligar Unlink your channel from another channel Desligar o seu canal de outro canal This unlinks your current channel from the selected channel. Isto desliga o seu canal do canal selecionado. Unlinks your channel from all linked channels. Desligar o seu canal de todos canais ligados. This unlinks your current channel (not the selected one) from all linked channels. Isto desliga o seu canal atual (não o selecionado atualmente) de todos canais ligados. &Reset &Repor Reset audio preprocessor Repor o preprocessador de áudio This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. Isto repõe o preprocessador de áudio, incluindo anulação de ruídos, ganho automático e deteção de atividade vocal. Se algo piorar subitamente o ambiente de áudio (como deixar cair o microfone) e se for temporário, use isto para evitar ter que esperar que o preprocessador se reajuste. &Mute Self &Silenciar-se Mute yourself Silenciar a si mesmo Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. Silenciar ou retiar silenciar. Quando silenciado, não enviará nenhum dado ao servidor. Retirar silenciar enquanto surdo também lhe vai retirar ensurdecer. &Deafen Self Ficar sur&do Deafen yourself Ensurdecer a si mesmo Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. Ensurdecer ou retirar ensurdecer. Quando surdo, não irá ouvir nada. Ficar surdo também o irá silenciar. &Text-To-Speech &Texto-para-Voz Toggle Text-To-Speech Alternar Texto-para-Voz Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. Ativar ou desativar o motor de texto-para-voz. Apenas mensagens ativadas para TPF no diálogo de configuração serão realmente faladas. Display audio statistics Mostrar estatísticas de áudio Pops up a small dialog with information about your current audio input. Pop-up um pequeno diálogo com informação sobre a sua entrada de áudio atual. Forcibly unlink plugin Desligar plugin a força This forces the current plugin to unlink, which is handy if it is reading completely wrong data. Isto força o plugin atual a desligar, o que é útil se está a ler dados completamente errados. Configure Mumble Configurar Mumble Allows you to change most settings for Mumble. Permite a alterar a maioria das configurações do Mumble. Start the audio configuration wizard Iniciar o assistente de ajuste de áudio This will guide you through the process of configuring your audio hardware. Isto o guiará através do processo de configurar seu hardware de áudio. &What's This? &O que é isto? Enter What's This? mode Entrar no modo "O que é isto?" Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. Clique aqui para entrar no modo "O que é isto?". O cursor vai mudar para um ponto de interrogação. Clique em qualquer botão, opção de menu ou área para mostrar uma descrição do que isto é. Information about Mumble Informação sobre Mumble Shows a small dialog with information and license for Mumble. Mostra um pequeno diálogo com informações e licença para o Mumble. Information about Speex Informação sobre Speex Shows a small dialog with information about Speex. Mostra um pequeno diálogo com informação sobre Speex. Information about Qt Informação sobre Qt Shows a small dialog with information about Qt. Mostra um pequeno diálogo com informações sobre Qt. Check for &Updates Proc&urar atualizações Check for new version of Mumble Procurar por uma nova versão do Mumble Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. Liga-se à página web do Mumble para verificar se uma nova versão está disponível, e notifica-o com uma URL para tranferir se for o caso. Sends a text message to all users in a channel. Envia uma mensagem de texto para todos utilizadores num canal. Configure certificates for strong authentication Configura os certificados para autenticação robusta This starts the wizard for creating, importing and exporting certificates for authentication against servers. Isto inicia o assistente para criar e exportar certificados para autenticar em servidores. Register user on server Registar utilizador no servidor This will permanently register the user on the server. Regista o utilizador permanentemente no servidor. Add &Friend Adicionar A&migo Adds a user as your friend. Adiciona um utilizador como seu amigo. This will add the user as a friend, so you can recognize him on this and other servers. Adicionará o utilizador como um amigo, para que possa reconhecê-lo neste e em outros servidores. &Remove Friend Elimina&r amigo Removes a user from your friends. Eliminar um utilizador dos seus amigos. This will remove a user from your friends list. Eliminar um utilizador da sua lista de amigos. &Update Friend At&ualizar amigo Update name of your friend. Atualizar o nome de seu amigo. Your friend uses a different name than what is in your database. This will update the name. O seu amigo usa um nome diferente do que está na sua base de dados. Isto vai atualizar o nome. Edit registered users list Editar lista de utilizadores registados This opens the editor for registered users, which allow you to change their name or unregister them. Abre o editor para utilizadores registados, que permite que altere os seus nomes ou elimine os seus registos. Add or remove text-based access tokens Adicionar ou eliminar credenciais de acesso baseadas em texto &Minimal View Visão &mínima Toggle minimal window modes Alternar modos mínimos de janela This will toggle minimal mode, where the log window and menu is hidden. Alterna o modo mínimo, em que a janela de registo e o menu são escondidos. You muted and deafened %1. Silenciou e ensurdeceu %1. You unmuted and undeafened %1. Retirou silenciar e ensurdecer de %1. You undeafened %1. Retirou ensurdecer %1. You suppressed %1. Suprimiu %1. %1 muted and deafened by %2. %1 silenciado e ensurdecido por %2. %1 unmuted and undeafened by %2. %1 retirado silenciar e ensurdecer por %2. %1 undeafened by %2. %1 retirado ensurdecer por %2. %1 suppressed by %2. %1 suprimido por %2. %1 moved to %2. %1 movido para %2. %1 moved to %2 by %3. %1 movido para %2 por %3. %1 moved in from %2 by %3. %1 foi trazido de %2 por %3. %1 is now muted and deafened. %1 agora está silenciado e surdo. Your account information can not be verified currently. Please try again later A informação da sua conta não pode ser verificada de momento. Por favor tente mais tarde Welcome message: %1 Mensagem de boas-vindas: %1 Mumble: %1 Mumble: %1 You were denied %1 privileges in %2. Foram-lhe negados privilégios de %1 em %2. %3 was denied %1 privileges in %2. %3 foi-lhe negado privilégios de %1 em %2. Denied: Cannot modify SuperUser. Negado: Não pode modificar o SuperUser. Denied: Invalid channel name. Negado: Nome de canal inválido. Denied: Text message too long. Negado: Mensagem de texto muito longa. Denied: Operation not permitted in temporary channel. Negado: Operação não permitida num canal temporário. You need a certificate to perform this operation. Precisa de um certificado para realizar esta ação. %1 does not have a certificate. %1 não possui um certificado. Invalid username: %1. Nome de utilizador inválido: %1. Invalid username. Nome de utilizador inválido. Channel is full. Canal está cheio. Channel nesting limit reached. Limite de canais aninhados atingido. Channel count limit reached. Need to delete channels before creating new ones. Permission denied. Premissão negada. %1 connected and entered channel. %1 connected. %1 ligou-se. %1 is now muted. %1 agora está em silêncio. %1 is now unmuted. %1 retirado silenciado agora. Recording started Gravação iniciada Recording stopped Gravação parou %1 started recording. %1 começou a gravar. %1 stopped recording. %1 parou de gravar. You revoked your priority speaker status. Retirou a sua prioridade em falar. You assumed priority speaker status. Tem agora prioridade em falar. %1 revoked your priority speaker status. %1 retirou-lhe prioridade em falar. %1 gave you priority speaker status. %1 deu-lhe prioridade em falar. You revoked priority speaker status for %1. Foi-lhe retirada prioridade em falar por %1. You gave priority speaker status to %1. Deu prioridade em falar a %1. %1 revoked own priority speaker status. %1 retirou própria prioridade em falar. %1 assumed priority speaker status. %1 tem agora prioridade em falar. %1 revoked priority speaker status for %2. %1 retirou prioridade em falar a %2. %1 gave priority speaker status to %2. %1 deu prioridade em falar a %2. You were unmuted and undeafened by %1. Foi-lhe retirado silenciar e ensurdecido por %1. You were muted by %1. Foi silenciado por %1. You were undeafened by %1. Foi-lhe retirado ensurdecido por %1. You were suppressed. You were suppressed by %1. Foi suprimido. You were unsuppressed. Foi-lhe retirado suprimido. You were unsuppressed by %1. Foi-lhe retirado suprimido por %1. You joined %1. You moved %1 to %2. Moveu %1 para %2. %1 is recording %1 está a gravar %1 renamed to %2 by %3. %1 renomeado para %2 por %3. %1 disconnected. %1 desligou-se. Server message from Servidor (Tree) (Árvore) (Channel) (Canal) (Private) %2%1: %3 %2%1: %3 Failed to load Opus, it will not be available for audio encoding/decoding. The server requests minimum client version %1 O servidor requer a versão %1 mínima de cliente The server requests positional audio be enabled. O servidor requer áudio posicional ativo. The server requests positional audio be disabled. O servidor requer áudio posicional desactivado. The server requests Push-to-Talk be enabled. O servidor requer Pressione-para-Falar ativo. The server requests Push-to-Talk be disabled. O servidor requer Pressione-para-Falar desativado. You were unmuted by %1. Foi-lhe retirado silenciar por %1. You muted %1. Silenciou %1. You unsuppressed %1. Suprimiu %1. You unmuted %1. Retirou silenciar a %1. %1 muted by %2. %1 silenciado por %2. %1 unsuppressed by %2. %1 retirado suprimir por %2. %1 unmuted by %2. %1 retirado silenciar por %2. Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. Não foi possível encontrar decodificadores CELT correspondentes com outros clientes. Não será capaz de falar com todos utilizadores. You were muted and deafened by %1. You were deafened by %1. Foi-lhe retirado silenciar e ensurder por %1. You were kicked from the server by %1: %2. Foi expulso do servidor por %1: %2. %3 was kicked from the server by %1: %2. %3 foi expulso do servidor por %1: %2. You were kicked and banned from the server by %1: %2. Foi expulso e banido do servidor por %1: %2. %3 was kicked and banned from the server by %1: %2. %3 foi expulso e banido do servidor por %1: %2. You were moved to %1 by %2. Foi movido para %1 por %2. %1 entered channel. %1 entrou no canal. Server connection rejected: %1. Ligação com o servidor rejeitada: %1. Denied: %1. Negado: %1. %1 renamed to %2. %1 renomeado para %2. %1 left channel and disconnected. %1 saiu do canal e desconectou-se. Message from %1 Mesangem de %1 You have User Dragging set to "Do Nothing" so the user wasn't moved. You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. Possui movimento de canais configurado em "Não fazer nada", então o canal não foi movido. Unknown Channel Drag mode in UserModel::dropMimeData. Modo de movimento de canal desconhecido em UserModel::dropMimeData. Remote controlling Mumble: Controlando remotamente Mumble: Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) -jn, --jackname Set custom Jack client name. --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status Invocation Invocação Error: No RPC command specified Erro: Nenhum comando RPC especificado RPC RPC Welcome to Mumble. Bem-vindo ao Mumble. Skipping version check in debug mode. Saltar verificação de versão no modo de depuração. Hide Frame Esconder quadro Toggle showing frame on minimal window Alternar mostrar quadro na janela mínima This will toggle whether the minimal window should have a frame for moving and resizing. Isto vai alternar se a janela mínima deve ter um quadro para mover e redimensioná-la. &Unlink All &Desligar tudo Reset the comment of the selected user. Repor o comentário do utilizador selecionado. &Join Channel &Entrar no canal View comment in editor Ver comentário no editor Query server for connection information for user Procurar no servidor informações da ligação do ustilizador S&erver S&ervidor &Self &Você mesmo &Unlink Plugins &Desligar Plugins Register yourself on the server Registar-se no servidor Change your avatar image on this server Alterar a sua imagem de avatar neste servidor &Remove Avatar Elimina&r avatar Remove currently defined avatar image. Eliminar a imagem definida como avatar atualmente. Icon Toolbar Barra de ícones Change your own comment Alterar o seu próprio comentário Recording A Gravar Priority Speaker Falante prioritário &Copy URL &Copiar URL Copies a link to this channel to the clipboard. Copia uma ligação a este canal para a área de transferência. Ignore Messages Ignorar Mensagens Locally ignore user's text chat messages. Ignora localmente as mensagens de texto do utilizador. Silently drops all text messages from the user. Silenciosamente cancela todas mensagens de texto do utilizador. Edit ban list on server Editar lista de banimentos This lets you edit the server-side IP ban list. Isto permite-o editar a lista de IP banidos do servidor. &Filter on/off &Filtro ligado/desligado Toggle the channel filter (Ctrl+F) Alternar entre filtros de canal (Ctrl+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. Ativa ou desativa o filtro do canal selecionado. Por omissão todos o canais vazios serão filtrados. Pode marcar canais adicionais para filtrar a partir do menu de contexto do canal. Ctrl+F Ctrl+F &Hide Channel when Filtering &Esconder canal quando filtrar Reset the avatar of the selected user. Repor o avatar do utilizador selecionado Locally adjust the user's speech volume. Ajustar localmente o volume de voz do utilizador. Opens a dialog with a volume slider. Use this on other users in the same room. Abre uma caixa de diálogo com um barra de volume. Utilize noutros utilizadores no mesmo canal. &Developer &Hide Mumble Hides the main Mumble window. Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. Show the Developer Console Shows the Mumble Developer Console, where Mumble's log output can be inspected. &Connect... &Ban list... &Information... &Kick... &Ban... Local Volume Adjustment... Send &Message... &Add... &Remove... &Edit... Audio S&tatistics... &Settings... &Audio Wizard... Developer &Console... &About... About &Speex... About &Qt... &Certificate Wizard... &Register... Registered &Users... Change &Avatar... &Access Tokens... Reset &Comment... Reset &Avatar... View Comment... &Change Comment... R&egister... Show Shows the main Mumble window. Manual Manual Mumble Positional Audio Position X Y Z m Heading Azimuth Elevation ° Meta data Context Identity Set State Linked Activated Unhinge NetworkConfig Network Rede Updates are mandatory when using snapshot releases. Atualizações são mandatórias ao utilizar versões de teste. Connection Ligação Use TCP compatibility mode Use TCP compatability mode Usar modo de compatibilidade TCP <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). <b>Ativar modo de compatibilidade TCP</b>.<br />Fará com que o Mumble use apenas TCP ao se comunicar com o servidor. Isto aumenta a sobrecarga e faz com que pacotes perdidos produzam pausas perceptíveis na comunicação, portanto só deve ser usado se é incapaz de usar o padrão (que é UDP para voz e TCP para controlo). Reconnect when disconnected Ligar novamente ao desligar <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. <b>Ligar novamente quando desligado</b>.<br />Fará com que o Mumble tente ligar novamente automaticamente após 10 segundos se a ligação com o servidor falhar. Reconnect automatically Ligar novamente automaticamente Proxy Proxy Type Tipo Type of proxy to connect through Tipo do proxy ao qual se ligar Direct connection Ligação direta HTTP(S) proxy Proxy HTTP(S) SOCKS5 proxy Proxy SOCKS5 Hostname Endereço do servidor Hostname of the proxy Endereço do servidor proxy Force TCP mode Forçar modo TCP Enable QoS to prioritize packets Ativar QoS para prioritizar pacotes This will enable QoS, which will attempt to prioritize voice packets over other traffic. Ativa o QoS, que vai tentar prioritizar pacotes de voz com relação a outro tráfego. Use Quality of Service Usar qualidade de serviços (QoS) Don't send certificate to server and don't save passwords. (Not saved). Não enviar certificado para o servidor e não gravadas senhas. (Não gravado). <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> <b>Suprime informação de identidade do cliente.</b><p>O cliente não vai se identificar com um certificado, mesmo se definido, e não vai gravar senhas para ligações. Isto é basicamente uma opção de teste e não é gravada.</p> Suppress certificate and password storage Suprimir armazenamento de certificados e senhas <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>Tipo de proxy ao qual se ligar</b><br />Isto faz o Mumble se ligue através de um proxy para todas ligações externas. Note que o tunelamento força o Mumble ao modo de compatibilidade TCP, causando todos dados de voz a serem enviadas pelo canal de controlo. <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. <b>Endereço do servidor proxy</b><br />Este campo especifica o nome do proxy através do qual deseja enviar o tráfego. Port Porta Port number of the proxy Número da porta do proxy <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. <b>Número da porta do proxy</b><br />Este campo especifica o número da porta em que o proxy está esperando ligações. Username Utilizador Username for proxy authentication Utilizador para autenticação no proxy <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>Utilizador para autenticação no proxy</b><br />Especifica o nome de utilizador para se autenticar com o proxy. Caso o proxy não exija autenticação, ou se quiser conectar anonimamente, simplesmente deixe este campo em branco. Password Senha Password for proxy authentication Senha para autenticação no proxy <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>Senha para autenticação de proxy</b><br />Especifica a senha que deve usar para se autenticar com o proxy. No caso do proxy não exigir autenticação, ou se quiser conectar anonimamente, simplesmente deixa este campo em branco. Mumble services Serviços do Mumble Check for new releases of Mumble automatically. Verifica por novos lançamentos do Mumble automaticamente. This will check for new releases of Mumble every time you start the program, and notify you if one is available. Isto verifica por novos lançamentos do Mumble sempre que iniciar o programa, e notifica-o se estiver disponível. Check for application updates on startup Verificar por atualizações da aplicação ao iniciar Check for new releases of plugins automatically. Verifica por novos lançamentos de plugins automaticamente. This will check for new releases of plugins every time you start the program, and download them automatically. Isto verifica por novos lançamentos de plugins toda vez que iniciar o programa, e os transfere automaticamente. <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. <b>Enviar estatísticas anônimas.</b><br />O Mumble possui uma equipe de programadores pequena, e por isso precisa focar seu desenvolvimento onde ele é mais necessário. Ao enviar um pouco de estatísticas ajuda o projeto a determinar onde focar este desenvolvimento. Submit anonymous statistics to the Mumble project Enviar estatísticas anônimas ao projeto Mumble Submit anonymous statistics Enviar estatísticas anônimas Reconnect to last used server when starting Mumble Ligar novamente ao último servidor utilizado ao iniciar o Mumble Reconnect to last server on startup Ligar novamente ao último servidor ao iniciar Download plugin and overlay updates on startup Tranferir atualizações de plugins e sobreposição ao iniciar Privacy Prevent OS information being sent to Mumble servers and web servers <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. Do not send OS information to Mumble servers and web servers Overlay Silent Silencioso Talking A falar Whisper Sussurro Shout Gritar Channel Canal Failed to create communication with overlay at %2: %1. No overlay will be available. Falha ao criar comunicação com sobreposição em %2: %1. Nenhuma sobreposição estará disponível. OverlayClient Filter Filtrar Only talking Apenas a falar Talking and recently active A falar e recentemente ativo All in current channel Todos no canal atual All in linked channels Todos em canais ligados Always show yourself Sempre mostrar a si mesmo Configure recently active time (%1 seconds)... Configurar o tempo recentemente ativo (%1 segundos)... Columns Colunas Sort Ordenar Alphabetically Alfabeticamente Last state change Última mudança de estado Edit... Editar... Reset Zoom Repor Zoom Configure recently active time Configurar tempo recentemente ativo Amount of seconds users remain active after talking: Quantos de segundos os utilizadores permanecem ativos após falar: OverlayConfig To move the users, drag the little red dot. Para mover utilizadores, arraste o pequeno ponto vermelho. To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. Para redimensionar os utilizadores, mova a roda do rato sobre eles. For more options, right click a user. For more options, rightclick a user. Para mais opções, clique com o botão direto em um utilizador. Launcher Filter Overlay Sobreposição Choose executable Escolher executável Choose application Escolhar aplicação Choose path Load Overlay Presets Carregar predefinições da sobreposição Mumble overlay presets (*.mumblelay) Predefinições de sobreposição do Mumble (*.mumblelay) Save Overlay Presets Gravar predefinições de sobreposição Options Opções Enable overlay. Ativar sobreposição. Enable Overlay Ativar Sobreposição This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. Configura se a sobreposição está ativa ou não. Esta configuração só é verificada quando aplicações são iniciados, portanto tenha certeza de que o Mumble está a funcionar e esta opção está marcada antes de iniciar a aplicação.<br />Por favor lembre-se que se iniciar o Mumble depois da aplicação, ou se desativar a sobreposição com a aplicação a funjcionar, não um modo seguro de reiniciar a sobreposição sem também reiniciar a aplicação. Layout Disposição Blacklist Lista negra Whitelist Lista de Excepções Uninstall Overlay Remover Sobreposição Overlay Installation Instalação de sobreposição Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. O Mumble detectou que não possui uma sobreposição instalada. Clique no botão abaixo para instalar a sobreposição. Install Mumble Overlay Instalar Sobreposição do Mumble Overlay Upgrade Atualizar sobreposição Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. O Mumble detectou uma versão antigo dos ficheiros de suporte da sobreposição instalados no computador. Para atualizar estes ficheiros para suas últimas versões, clique no botão abaixo. Upgrade Mumble Overlay Atualizar a Sobreposição do Mumble Display a frame counter in the overlay Mostrar um contador de quadros na sobreposição Show FPS counter Mostrar contagem de FPS Load an overlay preset from file Carregar uma predefinição de sobreposição de um ficheiro Load… Carregar... Save your overlay settings to file Gravas as suas configurações de sobreposição para um ficheiro Save… Gravar... Set the overlay font. Escolher a tipo de letra da sobreposição. Set the overlay text color. Escolher cor do texto de sobreposição. Color Cor Remove Eliminar Font Tipo de Letra FPS and Clock Display Mostrar FPS e relógio Display a clock in the overlay showing the current local time (system time). Mostrar um relógio na sobreposição com a hora local (hora do sistema). Show Clock Mostrar Relógio Overlay Exceptions Overlay Exception Mode Allowed launchers Add Allowed programs Allowed paths Blacklisted programs OverlayEditor State Estado User is not talking O utilizador não está a falar Passive Passivo User is talking in your channel or a linked channel Utilizador esta a falar para o seu canal ou algum ligado a ele Talking A falar User is whispering to you privately Utilizador está a sussurrar para si em privado Private Whisper Sussurro privado User is shouting to your channel Utilizador está a gritar para o seu canal Channel Whisper Sussurro ao canal Zoom Zoom Zoom Factor Fator de Zoom Enabled Elements Ativar elementos User avatar, chosen by each user Avatar do utilizador, escolhido por cada utilizador Avatar Avatar User's name Nome do utilizador Username Nome de utilizador Name of user's channel, if outside your current channel Nome do canal do utilizador, se fora do seu canal atual Channel Canal Muted or deafened Silenciado ou surdo Mute state Estado silenciado Bounding box, automatically shrunk to minimum size to contain all visible elements Caixas envolvente, encolhe automaticamente a um tamanho mínimo para conter todos elementos visíveis Bounding box Caixa Envolvente Overlay Editor Editor de sobreposição OverlayEditorScene Layout preset Disposição predefinida Large square avatar Grande quadrado de avatar Avatar and Name Avatar e nome User Opacity Opacidade de utilizador %1% %1% Object Opacity Opacidade do objeto Alignment Alinhamento Left Esquerda Center Centro Right Direita Top Superior Bottom Inferior Color... Cor... Font... Tipor de Letra... Bounding box Caixas envolvente Pen width Espessura da linha Padding Preenchimento Pen color Cor da linha Fill color Cor de preenchimento Pick pen color Escolher cor da linha Pick fill color Escolher cor de preenchimento Pick color Escolher cor Pick font Escolher tipo de letra PluginConfig Plugins Plugins Plugin has no configure function. Plugin não possui função de configuração. Plugin has no about function. Plugin não possui função sobre. Options Opções Enable plugins and transmit positional information Ativar plugins e transmitir informação posicional This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. Permite aos plugins de jogos suportados obter a sua posição no jogo e transmiti-la em cada pacote de voz. Isto habilita outros utilizadores a ouvir a sua voz no jogo na direção da sua personagem em relação à deles. Link to Game and Transmit Position Ligar ao Jogo e Transmitir Posição Reloads all plugins Recarregar todos os plugins This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. Isto procura novamente e recarrega plugins. Use isto se adicionou ou alterou um plugin no diretório de plugins. &Reload plugins &Recarregar plugins Information about plugin Informação sobre plugin This shows a small information message about the plugin. Isto mostra uma pequena mensagem de informação sobre o plugin. &About &Sobre Show configuration page of plugin Mostra a página de configuração do plugin This shows the configuration page of the plugin, if any. Isto mostra a página de configuração do plugin, se existir. &Configure &Configurar Name Nome Enabled Ativo Plugins Skipping plugin update in debug mode. Saltar atualização de plugin no modo de depuração. Downloaded new or updated plugin to %1. Transferido plugin novo ou atualizado para %1. Failed to install new plugin to %1. Falha ao instalar a novo plugin para %1. %1 lost link. %1 perdeu ligação. %1 linked. %1 ligado. PortAudioSystem Default Device Dispositivo padrão PulseAudioSystem Default Input Entrada padrão Default Output Saída padrão QApplication Failed to restart mumble Falha ao reiniciar mumble Mumble failed to restart itself. Please restart it manually. Mumble falhou a reiniciar. Por favor, reinicie manualmente. RichTextEditor Failed to load image Falha ao carregar imagem Image file too large to embed in document. Please use images smaller than %1 kB. Ficheiro de imagem grande demais para embutir no documento. Por favor utilize imagens com menos de %1 kB. Message is too long. Mensagem é demasiado longa. Display Visualização Source Text Texto fonte &Bold &Negrito Ctrl+B Ctrl+B &Italic &Itálico Italic Itálico Ctrl+I Ctrl+I Underline Sublinhado Ctrl+U Ctrl+U Color Cor Insert Link Inserir link Ctrl+L Ctrl+L Insert Image Inserir imagem RichTextEditorLink Add Link Adicionar link URL URL Text Texto ServerHandler Unable to resolve hostname Server is not responding to TCP pings UDP packets cannot be sent to or received from the server. Switching to TCP mode. Pacotes UDP não podem ser enviados ou recebidos do servidor. Alternando para modo TCP. UDP packets cannot be sent to the server. Switching to TCP mode. Pacotes UDP não podem ser enviados ao servidor. Alternando para o modo TCP. UDP packets cannot be received from the server. Switching to TCP mode. Pacotes UDP não podem ser recebidos do servidor. Alternando para modo TCP. UDP packets can be sent to and received from the server. Switching back to UDP mode. Pacotes UDP podem ser enviados e recebidos do servidor. Alternando de volta para o modo UDP. Connection timed out Tempo de ligação esgotado ServerView Favorite Favorito LAN LAN Public Internet Internet pública Unknown Africa África Asia Ásia North America América do norte South America América do sul Europe Europa Oceania Oceânia ShortcutActionWidget Unassigned Não-Atribuído ShortcutDelegate On Ativo Off Desativado Toggle Alternar Unassigned Não-Atribuído ShortcutKeyWidget Press Shortcut Pressione atalho ShortcutTargetDialog Root Raiz Parent Pai Current Atual Subchannel #%1 Subcanal #%1 ShortcutTargetWidget ... ... , , Root Raiz Parent Pai Current Atual Subchannel #%1 Subcanal #%1 Invalid Inválido Empty <Empty> Vazio ShortcutToggleWidget Off Desativado Toggle Alternar On Ativo TextMessage Enter text Especifique o texto If checked the message is recursively sent to all subchannels Se ativa, a mensagem é enviada recursivamente para todos subcanais Send recursively to subchannels Enviar recursivamente aos subcanais Tokens Empty Token Credencial vazia Mumble - Access Tokens Mumble - Credenciais de acesso List of access tokens on current server Lista de credenciais no servidor atual <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. <b>Esta é uma lista editável de credenciais de acesso no servidor ligado.</b> <br /> Uma credencial de acesso é uma sequência de texto, que pode ser usada como uma senha ou um gestão de acesso simples nos canais. O Mumble vai-se lembrar das credenciais que usou e vai reenviá-las para o servidor na próxima vez que-se ligar, para que não precise de as enviar sempre. Add a token Adicionar uma credencial &Add &Adicionar Remove a token Eliminar uma credencial &Remove &Eliminar UserEdit Registered Users Utilizadores registados Remove Eliminar Rename Mudar o nome Who are you looking for? De quem está à procura? Days Dias Weeks Semanas Months Meses Years Anos Inactive for Inativo durante Registered users: %n account(s) Utilizadores registados: %n contaUtilizadores registados: %n contas UserInformation User Information Informação de utilizador Connection Information Informação da ligação Version Versão OS SO Certificate Certificado IP Address Endereço IP CELT Versions Versões CELT Details... Detalhes... Ping Statistics Estatísticas de ping Pings received Pings recebidos Average ping Ping médio TCP (Control) TCP (controlo) UDP (Voice) UDP (voz) UDP Network statistics Estatísticas de UDP Good Bons Late Atrasados Lost Perdidos Resync Resincronização From Client Do cliente To Client Para cliente Connection time Tempo de ligação %1w %1sem %1d %1d %1h %1h %1m %1m %1s %1s , , %1 (%2) %1.%2.%3 (%4) %1 (%2) Supported Suportado Not Supported Não Suportado Not Reported Não Reportado %1 online (%2 idle) %1 ligado (%2 inativo) %1 online %1 ligado %1 kbit/s %1 kbit/s Bandwidth GroupBox Largura de Banda Bandwidth Label Largura de banda Ping deviation Variação de ping UserListModel Nick Alcunha Inactive days Dias inativo Last channel Último canal Last seen: %1 Última vez visto: %1 Never Nunca Channel ID: %1 UserLocalVolumeDialog Local volume for other users Volume local para outros utilizadores <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. <b>Ajuste o volume doutros utilizadores localmente</b><br />O Mumble suporta ajuste do volume doutros utilizadores localmente. Adjusting local volume for %1 A ajustar volume local de %1 dB dB <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> <html><head/><body><p>Utilize a barra deslizante ou a caixa de texto para alterar o volume do utilizador.</p><p><span style="font-weight:600;">Atenção!</span></p><p>Aumentar demasiado o volume de um utilizador pode danificar permanentemente a sua audição. Pode também levar ao aumento de ruído de fundo do utilizador.</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: Este é um utilizador ligado ao servidor. O ícone a esquerda do utilizador indica se ele está ou não a falar: Talking to your channel. A falar para o seu canal. Shouting directly to your channel. Whispering directly to your channel. A gritar diretamente para o seu canal. Whispering directly to you. A sussurrar diretamente para si. Not talking. Calado. This is a channel on the server. The icon indicates the state of the channel: Este é um canal no servidor. O ícone indica o estado do canal: Your current channel. O seu canal atual. A channel that is linked with your channel. Linked channels can talk to each other. Um canal que esta ligado ao seu canal. Canais ligados podem conversar entre si. A channel on the server that you are not linked to. Um canal no servidor ao qual não esta ligado. This shows the flags the user has on the server, if any: Isto mostra as marcações que o utilizador possui no servidor, se possuir: On your friend list Na sua lista de amigos Authenticated user Utilizador autenticado Muted (manually muted by self) Silenciado (manualmente por si) Muted (manually muted by admin) Silenciado (manualmente pelo admin) Muted (not allowed to speak in current channel) Silenciado (não permitido falar no canal atual) Muted (muted by you, only on your machine) Silenciado (por si, apenas na sua máquina) Muted (push-to-mute) Deafened (by self) Ensurdecido (por si) Deafened (by admin) Ensurdecido (por admin) User has a new comment set (click to show) O utilizador possui um novo comentário (clique para ver) User has a comment set, which you've already seen. (click to show) O utilizador possui um comentário, que já viu (clique para mostrar) Ignoring Text Messages A Ignorar Mensagens de Texto This shows the flags the channel has, if any: Mostra as marcações que o canal possui, se alguma: Channel has a new comment set (click to show) O canal possui um novo comentário (clique para ver) Channel has a comment set, which you've already seen. (click to show) O canal possui um comentário, que já viu. (clique para ver) Channel will be hidden when filtering is enabled Canal será escondido quando o filtro for ativado Name Nome Flags Marcações Are you sure you want to drag this user? Are you sure you want to drag this channel? Tem certeza que quer mover este canal? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. Impossível realizar este movimento automaticamente, por favor reponha os indicadores de ordenação numérica ou ajuste manualmente. VersionCheck Upgrade Mumble Atualizar o Mumble A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? Uma nova versão do Mumble foi detectada e tranferida automaticamente. É recomendado ou atualizar para essa versão, ou retornar para a última versão estável. Deseja executar o instalador agora? Failed to launch snapshot installer. Falha ao executar o instalador da versão. Corrupt download of new version detected. Automatically removed. Detectado download corrupto da nova versão. Automaticamente eliminado. Downloading new snapshot from %1 to %2 A transferir nova versão teste de %1 em %2 Failed to write new version to disk. Failed to write new version to disc. Falha ao escrever a nova versão no disco. Mumble failed to retrieve version information from the central server. O Mumble falhou ao obter a informação da versão do servidor central. ViewCert Certificate Chain Details Detalhes da cadeia de certificados Certificate chain Cadeia de certificado Certificate details Detalhes do certificado Common Name Organization Subunit Country Locality State Valid from: %1 Válido de: %1 Valid to: %1 Válido até: %1 Serial: %1 Número de série: %1 Public Key: %1 bits %2 Chave pública: %1 bits %2 RSA RSA DSA DSA Digest (SHA-1): %1 Código (SHA-1): %1 Digest (SHA-256): %1 Email: %1 Email: %1 DNS: %1 DNS: %1 Issued by: Emitido por: Unit Name VoiceRecorder Recorder failed to create directory '%1' Gravador falhou ao criar o diretório '%1' Recorder failed to open file '%1' Gravador falhou a abrir o ficheiro '%1' .wav - Uncompressed .wav - Não comprimido .ogg (Vorbis) - Compressed .ogg (Vorbis) - Comprimido .au - Uncompressed .au - Não comprimido .flac - Lossless compressed .flac - Comprimido sem perdas VoiceRecorderDialog Recorder Gravador Control Controlo 00:00:00 00:00:00 &Start &Início S&top &Parar Mode Modo Multichannel Multicanal Output Saída Output format Formato da saída Target directory Caminho destino Filename Nome do ficheiro &Browse... &Procurar... Valid variables are: Variáveis válidas são: Inserts the user's name Insere o nome do utilizador Inserts the current date Insere a data atual Inserts the current time Insere o hora atual Inserts the hostname Insere o nome do servidor Recorder still running Gravador continua a gravar Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? Fechar o gravador sem parar a gravação vai descartar áudio não escrito. Quer mesmo fechar o gravador? Unable to start recording. Not connected to a server. Impossível iniciar a gravação. Não ligado a um servidor. The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. O servidor ao qual está ligado é versão 1.2.2 ou anterior. Por motivos de privacidade, gravar em servidores anteriores à versão 1.2.3 não é possível. Por favor contate seu administrador de servidor para mais informações. There is already a recorder active for this server. Já há um gravador ativo para esse servidor. Please select a recording format. Por favor escolha um formato de gravação. Stopping A parar Select target directory Selecione o diretório Downmix Remistura WASAPIInput Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone. WASAPISystem Default Device Dispositivo padrão qwPTTButtonWidget Mumble PTT Mumble PPF Push to talk Pressionar para falar mumble-1.3.4/src/mumble/OverlayUserGroup.h0000664000175000017500000000227214010707273020362 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_OVERLAYUSERGROUP_H_ #define MUMBLE_MUMBLE_OVERLAYUSERGROUP_H_ #include "Overlay.h" class OverlayUser; class OverlayUserGroup : public QObject, public OverlayGroup { private: Q_OBJECT Q_DISABLE_COPY(OverlayUserGroup); public: enum { Type = UserType + 3 }; protected: OverlaySettings *os; QMap qmUsers; QList qlExampleUsers; QGraphicsEllipseItem *qgeiHandle; void contextMenuEvent(QGraphicsSceneContextMenuEvent *e) Q_DECL_OVERRIDE; void wheelEvent(QGraphicsSceneWheelEvent *e) Q_DECL_OVERRIDE; bool sceneEventFilter(QGraphicsItem *, QEvent *e) Q_DECL_OVERRIDE; protected slots: void userDestroyed(QObject *); void moveUsers(); public: bool bShowExamples; OverlayUserGroup(OverlaySettings *); ~OverlayUserGroup() Q_DECL_OVERRIDE; int type() const Q_DECL_OVERRIDE; public slots: void reset(); void updateUsers(); void updateLayout(); }; #endif mumble-1.3.4/src/mumble/XMLTools.cpp0000664000175000017500000001416414010707274017105 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "XMLTools.h" #include #include #include void XMLTools::recurseParse(QXmlStreamReader &reader, QXmlStreamWriter &writer, int ¶graphs, const QMap &opstyle, const int close, bool ignore) { while (! reader.atEnd()) { QXmlStreamReader::TokenType tt = reader.readNext(); QXmlStreamAttributes a = reader.attributes(); QMap style; QMap pstyle = opstyle; QStringRef styleref = a.value(QLatin1String("style")); if (!styleref.isNull()) { QString stylestring = styleref.toString(); QStringList styles = stylestring.split(QLatin1String(";"), QString::SkipEmptyParts); foreach(QString s, styles) { s = s.simplified(); int idx = s.indexOf(QLatin1Char(':')); QString key = (idx > 0) ? s.left(idx).simplified() : s; QString val = (idx > 0) ? s.mid(idx+1).simplified() : QString(); if (! pstyle.contains(key) || (pstyle.value(key) != val)) { style.insert(key,val); pstyle.insert(key,val); } } } switch (tt) { case QXmlStreamReader::StartElement: { QString name = reader.name().toString(); int rclose = 1; if (name == QLatin1String("body")) { rclose = 0; ignore = false; } else if (name == QLatin1String("span")) { // Substitute style with , and rclose = 0; if (style.value(QLatin1String("font-weight")) == QLatin1String("600")) { writer.writeStartElement(QLatin1String("b")); rclose++; style.remove(QLatin1String("font-weight")); } if (style.value(QLatin1String("font-style")) == QLatin1String("italic")) { writer.writeStartElement(QLatin1String("i")); rclose++; style.remove(QLatin1String("font-style")); } if (style.value(QLatin1String("text-decoration")) == QLatin1String("underline")) { writer.writeStartElement(QLatin1String("u")); rclose++; style.remove(QLatin1String("text-decoration")); } if (! style.isEmpty()) { rclose++; writer.writeStartElement(name); QStringList qsl; QMap::const_iterator i; for (i=style.constBegin(); i != style.constEnd(); ++i) { if (! i.value().isEmpty()) qsl << QString::fromLatin1("%1:%2").arg(i.key(), i.value()); else qsl << i.key(); } writer.writeAttribute(QLatin1String("style"), qsl.join(QLatin1String("; "))); } } else if (name == QLatin1String("p")) { paragraphs++; if (paragraphs == 1) { // Ignore first paragraph. If it is styled empty drop its contents (e.g.
    ) too. if (style.value(QLatin1String("-qt-paragraph-type")) == QLatin1String("empty")) { reader.skipCurrentElement(); continue; } rclose = 0; } else { rclose = 1; writer.writeStartElement(name); if (! style.isEmpty()) { QStringList qsl; QMap::const_iterator i; for (i=style.constBegin(); i != style.constEnd(); ++i) { if (! i.value().isEmpty()) qsl << QString::fromLatin1("%1:%2").arg(i.key(), i.value()); else qsl << i.key(); } writer.writeAttribute(QLatin1String("style"), qsl.join(QLatin1String("; "))); } } } else if (name == QLatin1String("a")) { // Set pstyle to include implicit blue underline. rclose = 1; writer.writeCurrentToken(reader); pstyle.insert(QLatin1String("text-decoration"), QLatin1String("underline")); pstyle.insert(QLatin1String("color"), QLatin1String("#0000ff")); } else if (! ignore) { rclose = 1; writer.writeCurrentToken(reader); } recurseParse(reader, writer, paragraphs, pstyle, rclose, ignore); break; } case QXmlStreamReader::EndElement: if (!ignore) for (int i=0;i qlNames; QList qlAttributes; while (! reader.atEnd()) { QXmlStreamReader::TokenType tt = reader.readNext(); QString name = reader.name().toString(); switch (tt) { case QXmlStreamReader::StartDocument: case QXmlStreamReader::EndDocument: break; case QXmlStreamReader::StartElement: { QXmlStreamAttributes a = reader.attributes(); if (name == QLatin1String("unduplicate")) break; if (needclose) { needclose = false; if ((a == qlAttributes.last()) && (name == qlNames.last()) && (qslConcat.contains(name))) { changed = true; break; } qlNames.takeLast(); qlAttributes.takeLast(); writer.writeEndElement(); } writer.writeCurrentToken(reader); qlNames.append(name); qlAttributes.append(a); } break; case QXmlStreamReader::EndElement: { if (name == QLatin1String("unduplicate")) break; if (needclose) { qlNames.takeLast(); qlAttributes.takeLast(); writer.writeCurrentToken(reader); } needclose = true; } break; default: if (needclose) { writer.writeEndElement(); needclose = false; } writer.writeCurrentToken(reader); } } if (needclose) writer.writeEndElement(); return changed; } mumble-1.3.4/src/mumble/OverlayConfig.h0000664000175000017500000000524114010707273017633 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_OVERLAYCONFIG_H_ #define MUMBLE_MUMBLE_OVERLAYCONFIG_H_ #include "OverlayText.h" #include "ConfigWidget.h" #include "ui_Overlay.h" class OverlayUserGroup; struct OverlayAppInfo; class OverlayPositionableItem; class OverlayConfig : public ConfigWidget, public Ui::OverlayConfig { private: Q_OBJECT Q_DISABLE_COPY(OverlayConfig) void initDisplay(); void initDisplayFps(); void initDisplayClock(); void refreshFpsDemo(); void refreshFpsLive(); void refreshTimeLive(); void addWhitelistPath(const QString & path); protected: QPixmap qpScreen; QGraphicsPixmapItem *qgpiScreen; QGraphicsScene qgs; QGraphicsScene qgsFpsPreview; BasepointPixmap bpFpsDemo; BasepointPixmap bpTimeDemo; QGraphicsPixmapItem *qgpiFpsDemo; OverlayPositionableItem *qgpiFpsLive; OverlayPositionableItem *qgpiTimeLive; OverlayUserGroup *oug; QGraphicsTextItem *qgtiInstructions; float fViewScale; bool eventFilter(QObject *, QEvent *) Q_DECL_OVERRIDE; bool supportsInstallableOverlay(); bool isInstalled(); bool needsUpgrade(); bool installFiles(); bool uninstallFiles(); bool supportsCertificates(); bool installerIsValid(); void showCertificates(); void updateOverlayExclusionModeState(); protected slots: void on_qpbInstall_clicked(); void on_qpbUninstall_clicked(); void on_qcbOverlayExclusionMode_currentIndexChanged(int); void on_qlwLaunchers_itemSelectionChanged(); void on_qpbLaunchersAdd_clicked(); void on_qpbLaunchersRemove_clicked(); void on_qlwWhitelist_itemSelectionChanged(); void on_qpbWhitelistAdd_clicked(); void on_qpbWhitelistRemove_clicked(); void on_qlwPaths_itemSelectionChanged(); void on_qpbPathsAdd_clicked(); void on_qpbPathsRemove_clicked(); void on_qlwBlacklist_itemSelectionChanged(); void on_qpbBlacklistAdd_clicked(); void on_qpbBlacklistRemove_clicked(); void on_qcbEnable_stateChanged(int); void on_qcbShowFps_stateChanged(int); void on_qcbShowTime_stateChanged(int); void on_qpbFpsFont_clicked(); void on_qpbFpsColor_clicked(); void on_qpbLoadPreset_clicked(); void on_qpbSavePreset_clicked(); void resizeScene(bool force=false); public: OverlayConfig(Settings &st); virtual QString title() const Q_DECL_OVERRIDE; virtual QIcon icon() const Q_DECL_OVERRIDE; public slots: void accept() const Q_DECL_OVERRIDE; void save() const Q_DECL_OVERRIDE; void load(const Settings &r) Q_DECL_OVERRIDE; }; #endif mumble-1.3.4/src/mumble/AudioOutput.h0000664000175000017500000000776114010707273017357 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_AUDIOOUTPUT_H_ #define MUMBLE_MUMBLE_AUDIOOUTPUT_H_ #include #include #include // AudioOutput depends on User being valid. This means it's important // to removeBuffer from here BEFORE MainWindow gets any UserLeft // messages. Any decendant user should feel free to remove unused // AudioOutputUser objects; it's better to recreate them than // having them use resources while unused. #ifndef SPEAKER_FRONT_LEFT #define SPEAKER_FRONT_LEFT 0x1 #define SPEAKER_FRONT_RIGHT 0x2 #define SPEAKER_FRONT_CENTER 0x4 #define SPEAKER_LOW_FREQUENCY 0x8 #define SPEAKER_BACK_LEFT 0x10 #define SPEAKER_BACK_RIGHT 0x20 #define SPEAKER_FRONT_LEFT_OF_CENTER 0x40 #define SPEAKER_FRONT_RIGHT_OF_CENTER 0x80 #define SPEAKER_BACK_CENTER 0x100 #define SPEAKER_SIDE_LEFT 0x200 #define SPEAKER_SIDE_RIGHT 0x400 #define SPEAKER_TOP_CENTER 0x800 #define SPEAKER_TOP_FRONT_LEFT 0x1000 #define SPEAKER_TOP_FRONT_CENTER 0x2000 #define SPEAKER_TOP_FRONT_RIGHT 0x4000 #define SPEAKER_TOP_BACK_LEFT 0x8000 #define SPEAKER_TOP_BACK_CENTER 0x10000 #define SPEAKER_TOP_BACK_RIGHT 0x20000 #endif #include "Audio.h" #include "Message.h" class AudioOutput; class ClientUser; class AudioOutputUser; class AudioOutputSample; typedef boost::shared_ptr AudioOutputPtr; class AudioOutputRegistrar { private: Q_DISABLE_COPY(AudioOutputRegistrar) public: static QMap *qmNew; static QString current; static AudioOutputPtr newFromChoice(QString choice = QString()); const QString name; int priority; AudioOutputRegistrar(const QString &n, int priority = 0); virtual ~AudioOutputRegistrar(); virtual AudioOutput *create() = 0; virtual const QList getDeviceChoices() = 0; virtual void setDeviceChoice(const QVariant &, Settings &) = 0; virtual bool canMuteOthers() const; virtual bool usesOutputDelay() const; virtual bool canExclusive() const; }; class AudioOutput : public QThread { private: Q_OBJECT Q_DISABLE_COPY(AudioOutput) private: float *fSpeakers; float *fSpeakerVolume; bool *bSpeakerPositional; protected: enum { SampleShort, SampleFloat } eSampleFormat; volatile bool bRunning; unsigned int iFrameSize; volatile unsigned int iMixerFreq; unsigned int iChannels; unsigned int iSampleSize; QReadWriteLock qrwlOutputs; QMultiHash qmOutputs; virtual void removeBuffer(AudioOutputUser *); void initializeMixer(const unsigned int *chanmasks, bool forceheadphone = false); bool mix(void *output, unsigned int nsamp); public: void wipe(); /// Construct an AudioOutput. /// /// This constructor is only ever called by Audio::startOutput(), and is guaranteed /// to be called on the application's main thread. AudioOutput(); /// Destroy an AudioOutput. /// /// This destructor is only ever called by Audio::stopOutput() and Audio::stop(), /// and is guaranteed to be called on the application's main thread. ~AudioOutput() Q_DECL_OVERRIDE; void addFrameToBuffer(ClientUser *, const QByteArray &, unsigned int iSeq, MessageHandler::UDPMessageType type); void removeBuffer(const ClientUser *); AudioOutputSample *playSample(const QString &filename, bool loop = false); void run() Q_DECL_OVERRIDE = 0; virtual bool isAlive() const; const float *getSpeakerPos(unsigned int &nspeakers); static float calcGain(float dotproduct, float distance); unsigned int getMixerFreq() const; }; #endif mumble-1.3.4/src/mumble/qttranslations/0000775000175000017500000000000014010707274020000 5ustar builderbuildermumble-1.3.4/src/mumble/qttranslations/qt_it.ts0000664000175000017500000052704214010707274021502 0ustar builderbuilder MAC_APPLICATION_MENU Services Servizi Hide %1 Nascondi %1 Hide Others Nascondi gli altri Show All Mostra tutto Preferences... Preferenze... Quit %1 Chiudi %1 About %1 Informazioni su %1 AudioOutput <html>The audio playback device <b>%1</b> does not work.<br/>Falling back to <b>%2</b>.</html> <html>Il dispositivo di riproduzione audio <b>%1</b> non funziona.<br/>Ripiego su <b>%2</b>.</html> <html>Switching to the audio playback device <b>%1</b><br/>which just became available and has higher preference.</html> <html>Commutazione del dispositivo di riproduzione audio <b>%1</b><br/>che è diventato disponibile e ha una preferenza maggiore.</html> Revert back to device '%1' Ripristino del dispositivo '%1' Phonon:: Notifications Notifiche Music Musica Video Video Communication Comunicazione Games Giochi Accessibility Accessibilità Phonon::Gstreamer::Backend Warning: You do not seem to have the package gstreamer0.10-plugins-good installed. Some video features have been disabled. Avviso: sembra che il pacchetto gstreamer0.10-plugins-good non sia installato. Alcune funzionalità video sono state disabilitate. Warning: You do not seem to have the base GStreamer plugins installed. All audio and video support has been disabled Avviso: sembra che il componente GStreamer di base non sia installato. Tutti i supporti audio e video sono stati disabilitati Phonon::Gstreamer::MediaObject Cannot start playback. Check your Gstreamer installation and make sure you have libgstreamer-plugins-base installed. Impossibile avviare la riproduzione. Controlla l'installazione di Gstreamer e assicurati che libgstreamer-plugins-base sia installato. A required codec is missing. You need to install the following codec(s) to play this content: %0 Manca un codificatore richiesto. Devi installare il seguente codificatore per riprodurre questo contenuto: %0 Manca un codificatore richiesto. Devi installare i seguenti codificatori per riprodurre questo contenuto: %0 Could not open media source. Impossibile aprire la sorgente multimediale. Invalid source type. Tipo di sorgente non valido. Could not locate media source. Impossibile individuare la sorgente multimediale. Could not open audio device. The device is already in use. Impossibile aprire il dispositivo audio. Il dispositivo è già in uso. Could not decode media source. Impossibile decodificare la sorgente multimediale. Phonon::VolumeSlider Volume: %1% Volume: %1% Use this slider to adjust the volume. The leftmost position is 0%, the rightmost is %1% Utilizza questo cursore per regolare il volume. La posizione all'estrema sinistra è 0%, a destra è %1% Q3Accel %1, %2 not defined %1, %2 non definito Ambiguous %1 not handled Ambiguità di %1 non gestita Q3DataTable True Vero False Falso Insert Inserisci Update Aggiorna Delete Elimina Q3FileDialog Copy or Move a File Copia o sposta un file Read: %1 Lettura: %1 Write: %1 Scrittura: %1 Cancel Annulla All Files (*) Tutti i file (*) Name Nome Size Dimensione Type Tipo Date Data Attributes Attributi &OK &OK Look &in: Cerca &in: File &name: &Nome file: File &type: &Tipo file: Back Indietro One directory up Livello superiore Create New Folder Crea una nuova cartella List View Vista a elenco Detail View Vista dettagliata Preview File Info Informazioni anteprima file Preview File Contents Anteprima del contenuto dei file Read-write Lettura-scrittura Read-only Sola lettura Write-only Sola scrittura Inaccessible Inaccessibile Symlink to File Collegamento simbolico a un file Symlink to Directory Collegamento simbolico a una cartella Symlink to Special Collegamento simbolico a speciale File Dir Cartella Special Speciale Open Apri Save As Salva come &Open &Apri &Save &Salva &Rename &Rinomina &Delete &Elimina R&eload Ri&carica Sort by &Name Ordina per &nome Sort by &Size Ordina per dimen&sione Sort by &Date Ordina per &data &Unsorted &Non ordinati Sort Ordina Show &hidden files Mos&tra file nascosti the file il file the directory la cartella the symlink il collegamento simbolico Delete %1 Elimina %1 <qt>Are you sure you wish to delete %1 "%2"?</qt> <qt>Sei sicuro di voler eliminare %1 "%2"?</qt> &Yes &Sì &No &No New Folder 1 Nuova cartella 1 New Folder Nuova cartella New Folder %1 Nuova cartella %1 Find Directory Trova cartella Directories Cartelle Directory: Cartella: Error Errore %1 File not found. Check path and filename. %1 File non trovato. Controlla il percorso e il nome del file. Q3LocalFs Could not read directory %1 Impossibile leggere la cartella %1 Could not create directory %1 Impossibile creare la cartella %1 Could not remove file or directory %1 Impossibile rimuovere il file o la cartella %1 Could not rename %1 to %2 Impossibile rinominare %1 in %2 Could not open %1 Impossibile aprire %1 Could not write %1 Impossibile scrivere %1 Q3MainWindow Line up Allinea in alto Customize... Personalizza... Q3NetworkProtocol Operation stopped by the user Operazione fermata dall'utente Q3ProgressDialog Cancel Annulla Q3TabDialog OK Apply Applica Help Aiuto Defaults Predefiniti Cancel Annulla Q3TextEdit &Undo A&nnulla &Redo &Rifai Cu&t &Taglia &Copy &Copia &Paste &Incolla Clear Pulisci Select All Seleziona tutto Q3TitleBar System Sistema Restore up Ripristina Minimize Minimizza Restore down Minimizza Maximize Massimizza Close Chiudi Contains commands to manipulate the window Contiene comandi per manipolare la finestra Puts a minimized back to normal Riporta una finestra minimizzata alla normalità Moves the window out of the way Sposta altrove una finestra Puts a maximized window back to normal Riporta una finestra massimizzata alla normalità Makes the window full screen Rende la finestra a schermo intero Closes the window Chiude la finestra Displays the name of the window and contains controls to manipulate it Visualizza il nome della finestra e contiene i controlli per manipolarla Q3ToolBar More... Altro... Q3UrlOperator The protocol `%1' is not supported Il protocollo «%1» non è supportato The protocol `%1' does not support listing directories Il protocollo «%1» non supporta l'elencazione delle cartelle The protocol `%1' does not support creating new directories Il protocollo «%1» non supporta la creazione di nuove cartelle The protocol `%1' does not support removing files or directories Il protocollo «%1» non supporta la rimozione di file o cartelle The protocol `%1' does not support renaming files or directories Il protocollo «%1» non supporta la rinomina di file o cartelle The protocol `%1' does not support getting files Il protocollo «%1» non supporta la ricezione di file The protocol `%1' does not support putting files Il protocollo «%1» non supporta l'invio di file The protocol `%1' does not support copying or moving files or directories Il protocollo «%1» non supporta la copia o lo spostamento di file o cartelle (unknown) (sconosciuto) Q3Wizard &Cancel A&nnulla < &Back < &Indietro &Next > &Avanti > &Finish &Fine &Help Ai&uto QAbstractSocket Host not found Host non trovato Connection refused Connessione rifiutata Socket operation timed out Operazione di socket scaduta Socket is not connected Il socket non è connesso QAbstractSpinBox &Step up A&umenta Step &down &Diminuisci &Select All &Seleziona tutto QApplication Activate Attiva Executable '%1' requires Qt %2, found Qt %3. L'eseguibile «%1» richiede Qt %2, trovate Qt %3. Incompatible Qt Library Error Errore di libreria Qt incompatibile QT_LAYOUT_DIRECTION Translate this string to the string 'LTR' in left-to-right languages or to 'RTL' in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout. LTR Activates the program's main window Attiva la finestra principale del programma QCheckBox Uncheck Deseleziona Check Seleziona Toggle Commuta QColorDialog Hu&e: T&on: &Sat: &Sat: &Val: &Val: &Red: &Rosso: &Green: &Verde: Bl&ue: Bl&u: A&lpha channel: Canale a&lpha: &Basic colors Colori di &base &Custom colors &Colori personalizzati &Add to Custom Colors &Aggiungi ai colori personalizzati Select color Seleziona colore QComboBox Open Apri False Falso True Vero Close Chiudi QCoreApplication %1: permission denied QSystemSemaphore %1: permesso negato %1: already exists QSystemSemaphore %1: esiste già %1: doesn't exists QSystemSemaphore %1: non esiste %1: out of resources QSystemSemaphore %1: risorse insufficienti %1: unknown error %2 QSystemSemaphore %1: errore sconosciuto %2 %1: key is empty QSystemSemaphore %1: la chiave è vuota %1: unable to make key QSystemSemaphore %1: impossibile creare la chiave %1: ftok failed QSystemSemaphore %1: ftok non riuscito QDB2Driver Unable to connect Impossibile connettersi Unable to commit transaction Impossibile applicare la transazione Unable to rollback transaction Impossibile effettuare il rollback della transazione Unable to set autocommit Impossibile impostare l'autocommit QDB2Result Unable to execute statement Impossibile eseguire l'istruzione Unable to prepare statement Impossibile preparare l'istruzione Unable to bind variable Impossibile associare la variabile Unable to fetch record %1 Impossibile ottenere il record %1 Unable to fetch next Impossibile recuperare il prossimo Unable to fetch first Impossibile recuperare il primo QDateTimeEdit AM am PM pm QDial QDial SpeedoMeter SpeedoMeter SliderHandle SliderHandle QDialog What's This? Cos'è? Done Completato QDialogButtonBox OK Save Salva Open Apri Cancel Annulla &Cancel Ann&ulla Close Chiudi Apply Applica Reset Ripristina Help Aiuto Don't Save Non salvare Discard Scarta &Yes &Sì Yes to &All Sì &a tutti &No &No N&o to All N&o a tutti Save All Salva tutto Abort Interrompi Retry Riprova Ignore Ignora Restore Defaults Ripristina valori predefiniti Close without Saving Chiudi senza salvare &OK &OK QDirModel Name Nome Size Dimensione Kind Match OS X Finder Specie Type All other platforms Tipo Date Modified Data di modifica QDockWidget Close Chiudi Dock Aggancia Float Mobile QDoubleSpinBox More Più Less Meno QErrorMessage Debug Message: Messaggio di debug: Warning: Avviso: Fatal Error: Errore grave: &Show this message again Mo&stra ancora questo messaggio &OK QFileDialog All Files (*) Tutti i file (*) Directories Cartelle &Open &Apri &Save &Salva Open Apri %1 already exists. Do you want to replace it? %1 già esiste. Vuoi sostituirlo? %1 File not found. Please verify the correct file name was given. %1 File non trovato. Verifica che sia stato fornito il nome file corretto. My Computer Risorse del computer &Rename &Rinomina &Delete &Elimina Show &hidden files Mos&tra file nascosti Back Indietro Parent Directory Cartella genitrice List View Vista a elenco Detail View Vista dettagliata Files of type: File di tipo: Directory: Cartella: %1 Directory not found. Please verify the correct directory name was given. %1 Cartella non trovata. Verifica che sia stato fornito il nome corretto della cartella. '%1' is write protected. Do you want to delete it anyway? «%1» è protetto da scrittura. Vuoi eliminarlo comunque? Are sure you want to delete '%1'? Sei sicuro di voler eliminare '%1'? Could not delete directory. Impossibile eliminare la cartella. Save As Salva come Drive Disco File Unknown Sconosciuto Find Directory Trova cartella Show Mostra Forward Avanti New Folder Nuova cartella &New Folder &Nuova cartella &Choose S&cegli Remove Rimuovi File &name: &Nome file: Look in: Cerca in: Create New Folder Crea nuova cartella QFileSystemModel Invalid filename Nome file non valido <b>The name "%1" can not be used.</b><p>Try using another name, with fewer characters or no punctuations marks. <b>Il nome "%1" non può essere utilizzato.</b><p>Prova a utilizzare un altro nome, con meno caratteri e nessun segno di punteggiatura. Name Nome Size Dimensione Kind Match OS X Finder Specie Type All other platforms Tipo Date Modified Data di modifica My Computer Risorse del computer Computer %1 TB %1 TB %1 GB %1 GB %1 MB %1 MB %1 KB %1 KB %1 bytes %1 byte QFontDatabase Normal Normale Bold Grassetto Demi Bold Demi grassetto Black Nero Demi Light Leggero Italic Corsivo Oblique Obliquo Any Qualunque Latin Latino Greek Greco Cyrillic Cirillico Armenian Armeno Hebrew Ebreo Arabic Arabo Syriac Siriano Thaana Devanagari Bengali Bengalese Gurmukhi Gujarati Oriya Tamil Telugu Kannada Malayalam Sinhala Thai Thai Lao Tibetan Tibetano Myanmar Georgian Georgiano Khmer Simplified Chinese Cinese semplificato Traditional Chinese Cinese tradizionale Japanese Giapponese Korean Coreano Vietnamese Vietnamita Symbol Simbolo Ogham Runic Runico QFontDialog &Font &Carattere Font st&yle S&tile del carattere &Size Dimen&sione Effects Effetti Stri&keout S&barrato &Underline S&ottolineato Sample Esempio Wr&iting System S&istema di scrittura Select Font Seleziona carattere QFtp Not connected Non connesso Host %1 not found Host %1 non trovato Connection refused to host %1 Connessione all'host %1 rifiutata Connected to host %1 Connessione all'host %1 Connection refused for data connection Connessione rifiutata per la connessione dati Unknown error Errore sconosciuto Connecting to host failed: %1 Connessione all'host non riuscita: %1 Login failed: %1 Accesso non riuscito: %1 Listing directory failed: %1 Elencazione della cartella non riuscita: %1 Changing directory failed: %1 Cambiamento cartella non riuscito: %1 Downloading file failed: %1 Scaricamento file non riuscito: %1 Uploading file failed: %1 Invio file non riuscito: %1 Removing file failed: %1 Rimozione file non riuscita: %1 Creating directory failed: %1 Creazione cartella non riuscita: %1 Removing directory failed: %1 Rimozione cartella non riuscita: %1 Connection closed Connessione chiusa Host %1 found Trovato l'host %1 Connection to %1 closed Connessione a %1 chiusa Host found Host trovato Connected to host Connessione all'host QHostInfo Unknown error Errore sconosciuto QHostInfoAgent Host not found Host non trovato Unknown address type Tipo di indirizzo sconosciuto Unknown error Errore sconosciuto QHttp Unknown error Errore sconosciuto Request aborted Richiesta interrotta No server set to connect to Nessun server impostato per la connessione Wrong content length Lunghezza del contenuto non corretta Server closed connection unexpectedly Il server ha terminato inaspettatamente la connessione Connection refused Connessione rifiutata Host %1 not found Host %1 non trovato HTTP request failed Richiesta HTTP non riuscita Invalid HTTP response header Intestazione della risposta HTTP non valida Invalid HTTP chunked body Contenuto HTTP spezzettato non valido Host %1 found Host %1 trovato Connected to host %1 Connessione all'host %1 Connection to %1 closed Connessione a %1 chiusa Host found Host trovato Connected to host Connessione all'host Connection closed Connessione chiusa Proxy authentication required Richiesta autenticazione proxy Authentication required Autenticazione richiesta HTTPS connection requested but SSL support not compiled in Richiesta una connessione HTTPS, ma il supporto SSL non è stato compilato Connection refused (or timed out) Connessione rifiutata (o tempo scaduto) Proxy requires authentication Il proxy richiede l'autenticazione Host requires authentication L'host richiede l'autenticazione Data corrupted Dati danneggiati Unknown protocol specified Protocollo specificato sconosciuto SSL handshake failed Negoziazione SSL non riuscita QHttpSocketEngine Authentication required Autenticazione richiesta QIBaseDriver Error opening database Errore di apertura del database Could not start transaction Impossibile avviare la transazione Unable to commit transaction Impossibile applicare la transazione Unable to rollback transaction Impossibile effettuare il rollback della transazione QIBaseResult Unable to create BLOB Impossibile creare BLOB Unable to write BLOB Impossibile scrivere BLOB Unable to open BLOB Impossibile aprire BLOB Unable to read BLOB Impossibile leggere BLOB Could not find array Impossibile trovare il vettore Could not get array data Impossibile ottenere il vettore di dati Could not get query info Impossibile ottenere informazioni sulla query Could not start transaction Impossibile iniziare la transazione Unable to commit transaction Impossibile applicare la transazione Could not allocate statement Impossibile allocare l'istruzione Could not prepare statement Impossibile preparare l'istruzione Could not describe input statement Impossibile descrivere l'istruzione in ingresso Could not describe statement Impossibile descrivere l'istruzione Unable to close statement Impossibile chiudere l'istruzione Unable to execute query Impossibile eseguire la query Could not fetch next item Impossibile recuperare il prossimo elemento Could not get statement info Impossibile ottenere informazioni sull'istruzione QIODevice Permission denied Permesso negato Too many open files Troppi file aperti No such file or directory Nessun file o cartella No space left on device Non è rimasto spazio sul dispositivo Unknown error Errore sconosciuto QInputContext XIM XIM input method Metodo di inserimento XIM Windows input method Metodo di inserimento Windows Mac OS X input method Metodo di inserimento Mac OS X QLibrary QLibrary::load_sys: Cannot load %1 (%2) QLibrary::load_sys: Impossibile caricare %1 (%2) QLibrary::unload_sys: Cannot unload %1 (%2) QLibrary::unload_sys: Impossibile rimuovere %1 (%2) QLibrary::resolve_sys: Symbol "%1" undefined in %2 (%3) QLibrary::resolve_sys: Simbolo "%1" non definito in %2 (%3) Could not mmap '%1': %2 Plugin verification data mismatch in '%1' Mancata corrispondenza dei dati di verifica dell'estensione in '%1' Could not unmap '%1': %2 The plugin '%1' uses incompatible Qt library. (%2.%3.%4) [%5] Il plugin '%1' utilizza librerie QT non compatibili. (%2.%3.%4) [%5] The plugin '%1' uses incompatible Qt library. Expected build key "%2", got "%3" Il plugin '%1' utilizza librerie QT non compatibili. Versione di compilazione attesa "%2", ottenuta "%3" Unknown error Errore sconosciuto The shared library was not found. La libreria condivisa non è stata trovata. The file '%1' is not a valid Qt plugin. Il file «%1» non è un'estensione Qt valida. The plugin '%1' uses incompatible Qt library. (Cannot mix debug and release libraries.) L'estensione «%1» utilizza una libreria Qt incompatibile. (Non è possibile mischiare librerie di debug e di rilascio.) QLineEdit &Undo A&nnulla &Redo &Rifai Cu&t &Taglia &Copy &Copia &Paste &Incolla Delete Elimina Select All Seleziona tutto QLocalServer %1: Name error %1: Errore nel nome %1: Permission denied %1: Permesso negato %1: Address in use %1: Indirizzo in uso %1: Unknown error %2 %1: Errore sconosciuto %2 QLocalSocket %1: Connection refused %1: Connessione rifiutata %1: Remote closed %1: terminazione remota %1: Invalid name %1: Nome non valido %1: Socket access error %1: Errore di accesso al socket %1: Socket resource error %1: errore risorsa socket %1: Socket operation timed out %1: operazione socket scaduta %1: Datagram too large %1: Datagramma troppo grande %1: Connection error %1: Errore di connessione %1: The socket operation is not supported %1: l'operazione di socket non è supportata %1: Unknown error %2 %1: Errore sconosciuto %2 QMYSQLDriver Unable to open database ' Impossibile aprire il database ' Unable to connect Impossibile connettersi Unable to begin transaction Impossibile iniziare la transazione Unable to commit transaction Impossibile effettuare il commit della transazione Unable to rollback transaction Impossibile effettuare il rollback della transazione QMYSQLResult Unable to fetch data Impossibile ottenere i dati Unable to execute query Impossibile eseguire la query Unable to store result Impossibile memorizzare i risultati Unable to prepare statement Impossibile preparare l'istruzione Unable to reset statement Impossibile ripristinare l'istruzione Unable to bind value Impossibile associare il valore Unable to execute statement Impossibile eseguire l'istruzione Unable to bind outvalues Impossibile associare i valori di uscita Unable to store statement results Impossibile memorizzare i risultati dell'istruzione Unable to execute next query Impossibile eseguire la query successiva Unable to store next result Impossibile memorizzare il risultato successivo QMdiArea (Untitled) (Senza titolo) QMdiSubWindow %1 - [%2] %1 - [%2] Close Chiudi Minimize Minimizza Restore Down Ripristina in basso &Restore &Ripristina &Move S&posta &Size Dimen&sione Mi&nimize Mi&nimizza Ma&ximize Massimi&zza Stay on &Top Sempre in &primo piano &Close &Chiudi - [%1] - [%1] Maximize Massimizza Unshade Srotola Shade Arrotola Restore Ripristina Help Aiuto Menu Menu QMenu Close Chiudi Open Apri Execute Esegui QMessageBox Help Aiuto OK About Qt Informazioni su Qt <p>This program uses Qt version %1.</p> <p>Questo programma utilizza la versione %1 di Qt.</p> Show Details... Mostra dettagli... Hide Details... Nascondi dettagli... <p>This program uses Qt Open Source Edition version %1.</p><p>Qt Open Source Edition is intended for the development of Open Source applications. You need a commercial Qt license for development of proprietary (closed source) applications.</p><p>Please see <a href="http://www.trolltech.com/company/model/">www.trolltech.com/company/model/</a> for an overview of Qt licensing.</p> <p>Questo programma utilizza la versione Qt Open Source Edition %1.</p><p>Qt Open Source Edition è destinata allo sviluppo di applicazioni Open Source. Per lo sviluppo di applicazioni proprietarie (sorgente chiuso) è necessario disporre di una licenza Qt commerciale.</p><p>Vedere <a href="http://www.trolltech.com/company/model/">www.trolltech.com/company/model/</a> per una panoramica del sistema di licenze Qt.</p> <h3>About Qt</h3>%1<p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.</p><p>Qt is a Nokia product. See <a href="http://www.trolltech.com/qt/">www.trolltech.com/qt/</a> for more information.</p> <h3>Informazioni su Qt</h3>%1<p>Qt è un toolkit C++ per lo sviluppo multipiattaforma di applicazioni.</p><p>Qt fornisce la portabilità degli stessi sorgenti tra MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux e tutte le varianti commerciali di Unix. Qt è disponibile anche per dispositivi integrati come Qt per Linux Embedded e Qt per Windows CE.</p><p>Qt è un prodotto Nokia. Vedi <a href="http://www.trolltech.com/qt/">www.trolltech.com/qt/</a> per ulteriori informazioni.</p> QMultiInputContext Select IM Seleziona IM QMultiInputContextPlugin Multiple input method switcher Commutatore di metodi di inserimento Multiple input method switcher that uses the context menu of the text widgets Commutatore di metodi di inserimento multipli che utilizza il menu contestuale per gli oggetti testuali QNativeSocketEngine The remote host closed the connection L'host remoto ha terminato la connessione Network operation timed out Operazione di rete fuori tempo massimo Out of resources Risorse insufficienti Unsupported socket operation Operazione su socket non supportata Protocol type not supported Tipo di protocollo non supportato Invalid socket descriptor Descrittore di socket non valido Network unreachable Rete non raggiungibile Permission denied Permesso negato Connection timed out Connessione fuori tempo massimo Connection refused Connessione rifiutata The bound address is already in use L'indirizzo associato è già utilizzato The address is not available L'indirizzo non è disponibile The address is protected L'indirizzo è protetto Unable to send a message Impossibile inviare un messaggio Unable to receive a message Impossibile ricevere un messaggio Unable to write Impossibile scrivere Network error Errore di rete Another socket is already listening on the same port Un altro socket è già in ascolto sulla stessa porta Unable to initialize non-blocking socket Impossibile inizializzare il socket asincrono Unable to initialize broadcast socket Impossibile inizializzare il socket di trasmissione Attempt to use IPv6 socket on a platform with no IPv6 support Tentativo di utilizzare un socket IPv6 su una piattaforma che non supporta IPv6 Host unreachable Host non raggiungibile Datagram was too large to send Datagramma troppo grande per l'invio Operation on non-socket Operazione su non-socket Unknown error Errore sconosciuto The proxy type is invalid for this operation Il tipo di proxy non è valido per questa operazione QNetworkAccessFileBackend Request for opening non-local file %1 Richiesta di apertura del file non locale %1 Error opening %1: %2 Errore in fase di apertura di %1: %2 Write error writing to %1: %2 Errore in fase di scrittura di %1: %2 Cannot open %1: Path is a directory Impossibile aprire %1: il percorso è una cartella Read error reading from %1: %2 Errore di lettura da %1: %2 QNetworkAccessFtpBackend Cannot open %1: is a directory Impossibile aprire %1: è una cartella Logging in to %1 failed: authentication required Accesso a %1 non riuscito: autenticazione richiesta Error while downloading %1: %2 Errore durante lo scaricamento di %1: %2 Error while uploading %1: %2 Errore durante l'invio di %1: %2 QNetworkReply Error downloading %1 - server replied: %2 Errore durante lo scaricamento di %1 - il server ha risposto: %2 Protocol "%1" is unknown Il protocollo "%1" è sconosciuto QNetworkReplyImpl Operation canceled Operazione annullata QOCIDriver Unable to logon Impossibile accedere Unable to initialize QOCIDriver Impossibile inizializzare Unable to begin transaction Impossibile iniziare la transazione Unable to commit transaction Impossibile effettuare il commit della transazione Unable to rollback transaction Impossibile effettuare il rollback della transazione QOCIResult Unable to bind column for batch execute Unable to execute batch statement Unable to goto next Unable to alloc statement Unable to prepare statement Impossibile preparare l'istruzione Unable to bind value Impossibile associare il valore Unable to execute select statement Impossibile eseguire l'istruzione di selezione Unable to execute statement Impossibile eseguire l'istruzione QODBCDriver Unable to connect Impossibile connettersi Unable to connect - Driver doesn't support all needed functionality Impossibile connettersi - Il driver non supporta tutte le funzionalità richieste Unable to disable autocommit Impossibile disabilitare l'autocommit Unable to commit transaction Impossibile effettuare il commit della transazione Unable to rollback transaction Impossibile effettuare il rollback della transazione Unable to enable autocommit Impossibile abilitare l'autocommit QODBCResult QODBCResult::reset: Unable to set 'SQL_CURSOR_STATIC' as statement attribute. Please check your ODBC driver configuration QODBCResult::reset: Impossibile impostare 'SQL_CURSOR_STATIC' come attributo dell'istruzione. Controlla la configurazione del driver ODBC Unable to execute statement Impossibile eseguire l'istruzione Unable to fetch next Impossibile recuperare il successivo Unable to prepare statement Impossibile preparare l'istruzione Unable to bind variable Impossibile associare la variabile Unable to fetch last Impossibile recuperare l'ultimo Unable to fetch Impossibile recuperare Unable to fetch first Impossibile recuperare il primo Unable to fetch previous Impossibile recuperare il precedente QObject Operation not supported on %1 Operazione non supportata su %1 Invalid URI: %1 URI non valido: %1 Write error writing to %1: %2 Errore di scrittura su %1: %2 Read error reading from %1: %2 Errore di lettura da %1: %2 Socket error on %1: %2 Errore socket su %1: %2 Remote host closed the connection prematurely on %1 L'host remoto ha terminato prematuramente la connessione su %1 Protocol error: packet of size 0 received Errore di protocollo: ricevuto un pacchetto di dimensione 0 QPPDOptionsModel Name Nome Value Valore QPSQLDriver Unable to connect Impossibile connettersi Could not begin transaction Impossibile iniziare la transazione Could not commit transaction Impossibile effettuare il commit dell'istruzione Could not rollback transaction Impossibile effettuare il rollback della transazione Unable to subscribe Impossibile registrarsi Unable to unsubscribe Impossibile cancellarsi QPSQLResult Unable to create query Impossibile creare query Unable to prepare statement Impossibile preparare l'istruzione QPageSetupWidget Centimeters (cm) Centimetri (cm) Millimeters (mm) Millimetri (mm) Inches (in) Pollici (in) Points (pt) Punti (pt) Form Modulo Paper Carta Page size: Dimensioni pagina: Width: Larghezza: Height: Altezza: Paper source: Alimentazione carta: Orientation Orientamento Portrait Verticale Landscape Orizzontale Reverse landscape Orizzontale inverso Reverse portrait Verticale inverso Margins Margini top margin margine superiore left margin margine sinistro right margin margine destro bottom margin margine inferiore QPluginLoader Unknown error Errore sconosciuto The plugin was not loaded. L'estensione non è stata caricata. QPrintDialog locally connected connessa localmente Aliases: %1 Alias: %1 unknown sconosciuto Print To File ... Stampa su file... File %1 is not writable. Please choose a different file name. Il file %1 non è scrivibile. Scegli un nome file diverso. %1 already exists. Do you want to overwrite it? %1 esiste già. Vuoi sovrascriverlo? %1 is a directory. Please choose a different file name. %1 è una cartella. Scegli un nome diverso. A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 B10 C5E DLE Executive Folio Ledger Legal Letter Lettera Tabloid US Common #10 Envelope Custom Personalizzato &Options >> &Opzioni >> &Print Stam&pa &Options << &Opzioni << Print to File (PDF) Stampa su file (PDF) Print to File (Postscript) Stampa su file (Postscript) Local file File locale Write %1 file Scrivi %1 file QPrintPreviewDialog Page Setup Impostazioni di pagina Print Preview Anteprima di stampa Next page Pagina successiva Previous page Pagina precedente First page Prima pagina Last page Ultima pagina Fit width Adatta alla larghezza Fit page Adatta alla pagina Zoom in Aumenta zoom Zoom out Riduci zoom Portrait Verticale Landscape Orizzontale Show single page Mostra pagina singola Show facing pages Mostra pagine affiancate Show overview of all pages Mostra l'anteprima di tutte le pagine Print Stampa Page setup Impostazioni pagina Close Chiudi QPrintPropertiesWidget Form Modulo Page Pagina Advanced Avanzate QPrintSettingsOutput Form Modulo Copies Copie Print range Intervallo di stampa Print all Stampa tutto Pages from Pagine da to a Selection Selezione Output Settings Impostazioni d'uscita Copies: Copie: Collate Fascicola Reverse Inversa Options Opzioni Color Mode Modalità colore Color Colore Grayscale Scala di grigio Duplex Printing Stampa fronte/retro None Nessuna Long side Lato lungo Short side Lato corto QPrintWidget Form Modulo Printer Stampante &Name: &Nome: P&roperties P&roprietà Location: Posizione: Preview Anteprima Type: Tipo: Output &file: &File di uscita: ... ... QProgressDialog Cancel Annulla QPushButton Open Apri QRadioButton Check Seleziona QRegExp no error occurred non si è verificato alcun errore disabled feature used utilizzata una funzionalità disabilitata bad char class syntax sintassi della classe di caratteri errata bad lookahead syntax sintassi di lookahead non valida bad repetition syntax sintassi di ripetizione non valida invalid octal value valore ottale non valido missing left delim delimitatore sinistro mancante unexpected end fine inattesa met internal limit raggiunto limite interno QSQLite2Driver Error to open database Errore in fase di apertura del database Unable to begin transaction Impossibile iniziare la transazione Unable to commit transaction Impossibile applicare l'istruzione Unable to rollback Transaction Impossibile effettuare il rollback della transazione QSQLite2Result Unable to fetch results Impossibile ottenere risultati Unable to execute statement Impossibile eseguire l'istruzione QSQLiteDriver Error opening database Errore in fase di apertura del database Error closing database Errore in fase di chiusura del database Unable to begin transaction Impossibile iniziare la transazione Unable to commit transaction Impossibile applicare l'istruzione Unable to rollback transaction Impossibile effettuare il rollback della transazione QSQLiteResult Unable to fetch row Impossibile ottenere la riga Unable to execute statement Impossibile eseguire l'istruzione Unable to reset statement Impossibile ripristinare l'istruzione Unable to bind parameters Impossibile associare i parametri Parameter count mismatch Il numero dei parametri non corrisponde No query Nessuna query QScrollBar Scroll here Scorri qui Left edge Bordo sinistro Top In alto Right edge Bordo destro Bottom In basso Page left Pagina sinistra Page up Pagina su Page right Pagina destra Page down Pagina giù Scroll left Scorrimento a sinistra Scroll up Scorrimento in alto Scroll right Scorrimento a destra Scroll down Scorrimento in basso Line up Allinea in alto Position Posizione Line down Allinea in basso QSharedMemory %1: unable to set key on lock %1: create size is less then 0 %1: unable to lock %1: impossibile bloccare %1: unable to unlock %1: impossibile sbloccare %1: permission denied %1: permesso negato %1: already exists %1: esiste già %1: doesn't exists %1: non esiste %1: out of resources %1: risorse insufficienti %1: unknown error %2 %1: errore sconosciuto %2 %1: key is empty %1: la chiave è vuota %1: unix key file doesn't exists %1: ftok failed %1: ftok non riuscito %1: unable to make key %1: system-imposed size restrictions %1: restrizione delle dimensioni imposte dal sistema %1: not attached %1: non collegato QShortcut Space Spazio Esc Tab Backtab Backspace Return Invio Enter Invio Ins Del Canc Pause Pausa Print Stamp SysReq R sist Home Home End Fine Left Sinistra Up Su Right Destra Down Giù PgUp PagSu PgDown PagGiù CapsLock BlocMaiusc NumLock BlocNum ScrollLock BlocScorr Menu Help Aiuto Back Indietro Forward Avanti Stop Ferma Refresh Aggiorna Volume Down Riduci volume Volume Mute Silenzia volume Volume Up Aumenta volume Bass Boost Bass Up Bass Down Treble Up Treble Down Media Play Media Stop Media Previous Media Next Media Record Favorites Preferiti Search Cerca Standby Open URL Apri URL Launch Mail Launch Media Launch (0) Avvia (0) Launch (1) Avvia (1) Launch (2) Avvia (2) Launch (3) Avvia (3) Launch (4) Avvia (4) Launch (5) Avvia (5) Launch (6) Avvia (6) Launch (7) Avvia (7) Launch (8) Avvia (8) Launch (9) Avvia (9) Launch (A) Avvia (A) Launch (B) Avvia (B) Launch (C) Avvia (C) Launch (D) Avvia (D) Launch (E) Avvia (E) Launch (F) Avvia (F) Print Screen Stampa schermo Page Up Pag Su Page Down Pag Giù Caps Lock Bloc Maiusc Num Lock Bllocc Num Number Lock Blocco tast numerico Scroll Lock Bloc Scorr Insert Ins Delete Canc Escape Esc System Request R sist Select Seleziona Yes No Context1 Contesto1 Context2 Contesto2 Context3 Contesto3 Context4 Contesto4 Call Chiama Hangup Riaggancia Flip Ribalta Ctrl Shift Maiusc Alt Meta + F%1 F%1 Home Page Pagina iniziale QSlider Page left Pagina sinistra Page up Pagina su Position Posizione Page right Pagina destra Page down Pagina giù QSocks5SocketEngine Socks5 timeout error connecting to socks server Connessione al server Socks5 fuori tempo massimo Network operation timed out Operazione di rete fuori tempo massimo QSpinBox More Più Less Meno QSql Delete Elimina Delete this record? Eliminare questa registrazione? Yes No Insert Inserisci Update Aggiorna Save edits? Salvare le modifiche? Cancel Annulla Confirm Conferma Cancel your edits? Annullare le modifiche? QSslSocket Unable to write data: %1 Impossibile scrivere i dati: %1 Error while reading: %1 Errore in fase di lettura: %1 Error during SSL handshake: %1 Errore durante l'handshake SSL: %1 Error creating SSL context (%1) Errore in fase di creazione del contesto SSL (%1) Invalid or empty cipher list (%1) Lista di cifratura non valida o vuota (%1) Error creating SSL session, %1 Errore durante la creazione della sessione SSL, %1 Error creating SSL session: %1 Errore durante la creazione della sessione SSL: %1 Cannot provide a certificate with no key, %1 Impossibile fornire un certificato senza chiave, %1 Error loading local certificate, %1 Errore di caricamento del certificato locale, %1 Error loading private key, %1 Errore di caricamento della chiave privata, %1 Private key does not certificate public key, %1 La chiave privata non certifica la chiave pubblica, %1 QTDSDriver Unable to open connection Impossibile aprire la connessione Unable to use database Impossibile utilizzare il database QTabBar Scroll Left Scorrimento a sinistra Scroll Right Scorrimento a destra QTextControl &Undo A&nnulla &Redo &Rifai Cu&t &Taglia &Copy &Copia Copy &Link Location Copia posizione del co&llegamento &Paste &Incolla Delete Elimina Select All Seleziona tutto QToolButton Press Premi Open Apri QUdpSocket This platform does not support IPv6 Questa piattaforma non supporta IPv6 QUndoGroup Undo Annulla Redo Rifai QUndoModel <empty> <vuoto> QUndoStack Undo Annulla Redo Rifai QUnicodeControlCharacterMenu LRM Left-to-right mark RLM Right-to-left mark ZWJ Zero width joiner ZWNJ Zero width non-joiner ZWSP Zero width space LRE Start of left-to-right embedding RLE Start of right-to-left embedding LRO Start of left-to-right override RLO Start of right-to-left override PDF Pop directional formatting Insert Unicode control character Inserisci carattere di controllo unicode QWebFrame Request cancelled Richiesta annullata Request blocked Richiesta bloccata Cannot show URL Impossibile visualizzare l'URL Frame load interruped by policy change Caricamento frame interrotto da un cambiamento di regole Cannot show mimetype Impossibile visualizzare il tipo mime File does not exist Il file non esiste QWebPage Bad HTTP request Richiesta HTTP non valida Submit default label for Submit buttons in forms on web pages Invia Submit Submit (input element) alt text for <input> elements with no alt, title, or value Invia Reset default label for Reset buttons in forms on web pages Ripristina This is a searchable index. Enter search keywords: text that appears at the start of nearly-obsolete web pages in the form of a 'searchable index' Questo è l'indice ricercabile. Digita la parola chiave di ricerca: Choose File title for file button used in HTML forms Scegli file No file selected text to display in file button used in HTML forms when no file is selected Nessun file selezionato Open in New Window Open in New Window context menu item Apri in una nuova finestra Save Link... Download Linked File context menu item Salva collegamento... Copy Link Copy Link context menu item Copia collegamento Open Image Open Image in New Window context menu item Apri immagine Save Image Download Image context menu item Salva immagine Copy Image Copy Link context menu item Copia immagine Open Frame Open Frame in New Window context menu item Apri riquadro Copy Copy context menu item Copia Go Back Back context menu item Indietro Go Forward Forward context menu item Avanti Stop Stop context menu item Ferma Reload Reload context menu item Ricarica Cut Cut context menu item Taglia Paste Paste context menu item Incolla No Guesses Found No Guesses Found context menu item Nessuna stima trovata Ignore Ignore Spelling context menu item Ignora Add To Dictionary Learn Spelling context menu item Aggiungi al dizionario Search The Web Search The Web context menu item Cerca nel Web Look Up In Dictionary Look Up in Dictionary context menu item Cerca nel dizionario Open Link Open Link context menu item Apri collegamento Ignore Ignore Grammar context menu item Ignora Spelling Spelling and Grammar context sub-menu item Ortografia Show Spelling and Grammar menu item title Mostra ortografia e grammatica Hide Spelling and Grammar menu item title Nascondi ortografia e grammatica Check Spelling Check spelling context menu item Controlla ortografia Check Spelling While Typing Check spelling while typing context menu item Controlla l'ortografia durante la digitazione Check Grammar With Spelling Check grammar with spelling context menu item Controlla grammatica durante il controllo ortografico Fonts Font context sub-menu item Caratteri Bold Bold context menu item Grassetto Italic Italic context menu item Corsivo Underline Underline context menu item Sottolineato Outline Outline context menu item Bordatura Direction Writing direction context sub-menu item Direzione Default Default writing direction context menu item Predefinita LTR Left to Right context menu item Da sinistra a destra RTL Right to Left context menu item Da destra a sinistra Inspect Inspect Element context menu item Ispeziona No recent searches Label for only item in menu that appears when clicking on the search field image, when no searches have been performed Nessuna ricerca recente Recent searches label for first item in the menu that appears when clicking on the search field image, used as embedded menu title Ricerche recenti Clear recent searches menu item in Recent Searches menu that empties menu's contents Cancella le ricerche recenti Unknown Unknown filesize FTP directory listing item Sconosciuta %1 (%2x%3 pixels) Title string for images %1 (%2x%3 pixel) Web Inspector - %2 Analizzatore web - %2 QWhatsThisAction What's This? Cos'è? QWidget * QWizard Go Back Indietro Continue Continua Commit Applica Done Completato Quit Esci Help Aiuto < &Back < &Indietro &Finish &Fine Cancel Annulla &Help Ai&uto &Next Ava&nti &Next > Ava&nti > QWorkspace &Restore &Ripristina &Move &Sposta &Size &Dimensioni Mi&nimize Mi&nimizza Ma&ximize Ma&ssimizza &Close &Chiudi Stay on &Top Sempre in &primo piano Sh&ade &Arrotola %1 - [%2] %1 - [%2] Minimize Minimizza Restore Down Ripristina in basso Close Chiudi &Unshade &Srotola QXml no error occurred non si è verificato alcun errore error triggered by consumer unexpected end of file fine file inattesa more than one document type definition più di una definizione del tipo di documento error occurred while parsing element riscontrato errore durante l'analisi dell'elemento tag mismatch tag non corrispondente error occurred while parsing content riscontrato errore durante l'analisi del contenuto unexpected character carattere inatteso invalid name for processing instruction nome dell'istruzione di elaborazione non valido version expected while reading the XML declaration wrong value for standalone declaration encoding declaration or standalone declaration expected while reading the XML declaration standalone declaration expected while reading the XML declaration error occurred while parsing document type definition riscontrato errore durante l'analisi della definizione del tipo di documento letter is expected error occurred while parsing comment riscontrato errore durante l'analisi del commento error occurred while parsing reference riscontrato errore durante l'analisi dei riferimenti internal general entity reference not allowed in DTD external parsed general entity reference not allowed in attribute value external parsed general entity reference not allowed in DTD unparsed entity reference in wrong context recursive entities entità ricorsive error in the text declaration of an external entity errore nella dichiarazione di testo di un'entità esterna QXmlStream Extra content at end of document. Contenuto aggiuntivo alla fine del documento. Invalid entity value. Valore dell'entità non valido. Invalid XML character. Carattere XML non valido. Sequence ']]>' not allowed in content. Sequenza ']]>' non consentita nel contenuto. Namespace prefix '%1' not declared Prefisso di spazio dei nomi '%1' non dichiarato Attribute redefined. Attributo ridefinito. Unexpected character '%1' in public id literal. Invalid XML version string. Stringa di versione XML non valida. Unsupported XML version. Versione XML non supportata. %1 is an invalid encoding name. %1 è un nome di codifica non valido. Encoding %1 is unsupported La codifica %1 non è supportata Standalone accepts only yes or no. Invalid attribute in XML declaration. Attributo non valido nella dichiarazione XML. Premature end of document. Fine imprevista del documento. Invalid document. Documento non valido. Expected Atteso , but got ' , ma ricevuto ' Unexpected ' Inatteso ' Expected character data. Recursive entity detected. Rilevata entità ricorsiva. Start tag expected. Atteso tag iniziale. XML declaration not at start of document. La dichiarazione XML non è all'inizio del documento. NDATA in parameter entity declaration. %1 is an invalid processing instruction name. Invalid processing instruction name. Illegal namespace declaration. Invalid XML name. Nome XML non valido. Opening and ending tag mismatch. Mancata corrispondenza tra tag di apertura e chiusura. Reference to unparsed entity '%1'. Entity '%1' not declared. Entità '%1' non dichiarata. Reference to external entity '%1' in attribute value. Invalid character reference. Encountered incorrectly encoded content. Riscontrato contenuto non codificato correttamente. The standalone pseudo attribute must appear after the encoding. %1 is an invalid PUBLIC identifier. %1 è un identificatore PUBLIC non valido. QtXmlPatterns An %1-attribute with value %2 has already been declared. An %1-attribute must have a valid %2 as value, which %3 isn't. Network timeout. Timeout di rete. Element %1 can't be serialized because it appears outside the document element. Attribute %1 can't be serialized because it appears at the top level. Year %1 is invalid because it begins with %2. Day %1 is outside the range %2..%3. Month %1 is outside the range %2..%3. Overflow: Can't represent date %1. Day %1 is invalid for month %2. Il giorno %1 non è valido per il mese %2. Time 24:%1:%2.%3 is invalid. Hour is 24, but minutes, seconds, and milliseconds are not all 0; Time %1:%2:%3.%4 is invalid. L'ora %1:%2:%3.%4 non è valida. Overflow: Date can't be represented. At least one component must be present. At least one time component must appear after the %1-delimiter. No operand in an integer division, %1, can be %2. The first operand in an integer division, %1, cannot be infinity (%2). The second operand in a division, %1, cannot be zero (%2). %1 is not a valid value of type %2. %1 non è un valore valido di tipo %2. When casting to %1 from %2, the source value cannot be %3. Integer division (%1) by zero (%2) is undefined. Division (%1) by zero (%2) is undefined. Modulus division (%1) by zero (%2) is undefined. Dividing a value of type %1 by %2 (not-a-number) is not allowed. Dividing a value of type %1 by %2 or %3 (plus or minus zero) is not allowed. Multiplication of a value of type %1 by %2 or %3 (plus or minus infinity) is not allowed. A value of type %1 cannot have an Effective Boolean Value. Effective Boolean Value cannot be calculated for a sequence containing two or more atomic values. Value %1 of type %2 exceeds maximum (%3). Value %1 of type %2 is below minimum (%3). A value of type %1 must contain an even number of digits. The value %2 does not. %1 is not valid as a value of type %2. Operator %1 cannot be used on type %2. Operator %1 cannot be used on atomic values of type %2 and %3. The namespace URI in the name for a computed attribute cannot be %1. The name for a computed attribute cannot have the namespace URI %1 with the local name %2. Type error in cast, expected %1, received %2. When casting to %1 or types derived from it, the source value must be of the same type, or it must be a string literal. Type %2 is not allowed. No casting is possible with %1 as the target type. It is not possible to cast from %1 to %2. Casting to %1 is not possible because it is an abstract type, and can therefore never be instantiated. It's not possible to cast the value %1 of type %2 to %3 Failure when casting from %1 to %2: %3 A comment cannot contain %1 Un commento non può contenere %1 A comment cannot end with a %1. Un commento non può terminare con un %1. No comparisons can be done involving the type %1. Operator %1 is not available between atomic values of type %2 and %3. An attribute node cannot be a child of a document node. Therefore, the attribute %1 is out of place. A library module cannot be evaluated directly. It must be imported from a main module. A value of type %1 cannot be a predicate. A predicate must have either a numeric type or an Effective Boolean Value type. A positional predicate must evaluate to a single numeric value. The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, is %2 invalid. %1 is not a valid target name in a processing instruction. It must be a %2 value, e.g. %3. The last step in a path must contain either nodes or atomic values. It cannot be a mixture between the two. The data of a processing instruction cannot contain the string %1 No namespace binding exists for the prefix %1 No namespace binding exists for the prefix %1 in %2 %1 is an invalid %2 %1 è un %2 non valido %1 takes at most %n argument(s). %2 is therefore invalid. %1 requires at least %n argument(s). %2 is therefore invalid. The first argument to %1 cannot be of type %2. It must be a numeric type, xs:yearMonthDuration or xs:dayTimeDuration. The first argument to %1 cannot be of type %2. It must be of type %3, %4, or %5. The second argument to %1 cannot be of type %2. It must be of type %3, %4, or %5. %1 is not a valid XML 1.0 character. %1 non è un carattere XML 1.0 valido. The first argument to %1 cannot be of type %2. If both values have zone offsets, they must have the same zone offset. %1 and %2 are not the same. %1 was called. %1 è stato invocato. %1 must be followed by %2 or %3, not at the end of the replacement string. In the replacement string, %1 must be followed by at least one digit when not escaped. In the replacement string, %1 can only be used to escape itself or %2, not %3 %1 matches newline characters %1 and %2 match the start and end of a line. Matches are case insensitive Le corrispondenze non tengono conto delle maiuscole Whitespace characters are removed, except when they appear in character classes %1 is an invalid regular expression pattern: %2 %1 is an invalid flag for regular expressions. Valid flags are: If the first argument is the empty sequence or a zero-length string (no namespace), a prefix cannot be specified. Prefix %1 was specified. It will not be possible to retrieve %1. The root node of the second argument to function %1 must be a document node. %2 is not a document node. The default collection is undefined %1 cannot be retrieved %1 non può essere recuperato The normalization form %1 is unsupported. The supported forms are %2, %3, %4, and %5, and none, i.e. the empty string (no normalization). A zone offset must be in the range %1..%2 inclusive. %3 is out of range. %1 is not a whole number of minutes. Required cardinality is %1; got cardinality %2. The item %1 did not match the required type %2. %1 is an unknown schema type. %1 è un tipo di schema sconosciuto. Only one %1 declaration can occur in the query prolog. The initialization of variable %1 depends on itself No variable by name %1 exists Non esiste alcuna variabile con il nome %1 The variable %1 is unused La variabile %1 è inutilizzata Version %1 is not supported. The supported XQuery version is 1.0. La versione %1 non è supportata. La versione di XQuery supportata è la 1.0. The encoding %1 is invalid. It must contain Latin characters only, must not contain whitespace, and must match the regular expression %2. No function with signature %1 is available A default namespace declaration must occur before function, variable, and option declarations. Namespace declarations must occur before function, variable, and option declarations. Module imports must occur before function, variable, and option declarations. It is not possible to redeclare prefix %1. Only the prefix %1 can be declared to bind the namespace %2. By default, it is already bound to the prefix %1. Prefix %1 is already declared in the prolog. The name of an option must have a prefix. There is no default namespace for options. The Schema Import feature is not supported, and therefore %1 declarations cannot occur. The target namespace of a %1 cannot be empty. The module import feature is not supported A variable by name %1 has already been declared in the prolog. No value is available for the external variable by name %1. The namespace for a user defined function cannot be empty (try the predefined prefix %1 which exists for cases like this) The namespace %1 is reserved; therefore user defined functions may not use it. Try the predefined prefix %2, which exists for these cases. The namespace of a user defined function in a library module must be equivalent to the module namespace. In other words, it should be %1 instead of %2 A function already exists with the signature %1. No external functions are supported. All supported functions can be used directly, without first declaring them as external An argument by name %1 has already been declared. Every argument name must be unique. The name of a variable bound in a for-expression must be different from the positional variable. Hence, the two variables named %1 collide. The Schema Validation Feature is not supported. Hence, %1-expressions may not be used. None of the pragma expressions are supported. Therefore, a fallback expression must be present The %1-axis is unsupported in XQuery %1 is not a valid numeric literal. No function by name %1 is available. Non è disponibile alcuna variabile con il nome %1. The namespace URI cannot be the empty string when binding to a prefix, %1. %1 is an invalid namespace URI. %1 è un URI di spazio dei nomi non valido. It is not possible to bind to the prefix %1 Impossibile associare al prefisso %1 Namespace %1 can only be bound to %2 (and it is, in either case, pre-declared). Prefix %1 can only be bound to %2 (and it is, in either case, pre-declared). Two namespace declaration attributes have the same name: %1. The namespace URI must be a constant and cannot use enclosed expressions. An attribute by name %1 has already appeared on this element. A direct element constructor is not well-formed. %1 is ended with %2. The name %1 does not refer to any schema type. Il nome %1 non si riferisce a nessun tipo di schema. %1 is an complex type. Casting to complex types is not possible. However, casting to atomic types such as %2 works. %1 is not an atomic type. Casting is only possible to atomic types. %1 is not a valid name for a processing-instruction. Therefore this name test will never match. %1 is not in the in-scope attribute declarations. Note that the schema import feature is not supported. The name of an extension expression must be in a namespace. Il nome di un'espressione di estensione deve essere in uno spazio dei nomi. empty vuoto zero or one zero o uno exactly one esattamente uno one or more uno o più zero or more zero o più Required type is %1, but %2 was found. Il tipo richiesto è «%1», ma è stato trovato %2. Promoting %1 to %2 may cause loss of precision. The focus is undefined. It's not possible to add attributes after any other kind of node. An attribute by name %1 has already been created. Only the Unicode Codepoint Collation is supported(%1). %2 is unsupported. VolumeSlider Muted Silenziato Volume: %1% Volume: %1% WebCore::PlatformScrollbar Scroll here Scorri qui Left edge Bordo sinistro Top In alto Right edge Bordo destro Bottom In basso Page left Pagina sinistra Page up Pagina su Page right Pagina destra Page down Pagina giù Scroll left Scorri a sinistra Scroll up Scorri in alto Scroll right Scorri a destra Scroll down Scorri in basso mumble-1.3.4/src/mumble/qttranslations/LICENSE0000664000175000017500000000303114010707274021002 0ustar builderbuilderMumble uses Qt translations created by the VirtualBox community under the MIT license. Files and copyright were obtained from: https://www.virtualbox.org/ticket/2018 Turkish Qt translation (serdar, BouRock): Copyright (c) 2007-2009 Serdar Soytetir Copyright (c) 2012 Burak Yavuz Italian Qt translation (smart2128): Copyright (c) 2009-2012 Vincenzo Reale Dutch Qt translation (geertseb, lxndr, nippur): Copyright (c) 2009-2011 Ebel Geertsema Copyright (c) 2007 Alexander L. de Goeij Copyright (c) 2012 Richard E van der Luit Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. mumble-1.3.4/src/mumble/qttranslations/qt_tr.ts0000664000175000017500000052563414010707274021520 0ustar builderbuilder MAC_APPLICATION_MENU Services Hizmetler Hide %1 %1 Gizle Hide Others Diğerlerini Gizle Show All Tümünü Göster Preferences... Tercihler... Quit %1 %1 Çıkış About %1 %1 Hakkında AudioOutput <html>The audio playback device <b>%1</b> does not work.<br/>Falling back to <b>%2</b>.</html> <html>Ses çalma aygıtı <b>%1</b> çalışmıyor.<br/><b>%2</b> aygıtına geri çekiliyor.</html> <html>Switching to the audio playback device <b>%1</b><br/>which just became available and has higher preference.</html> <html>Henüz kullanılabilir olan ve yüksek tercihe sahip<br/><b>%1</b> ses çalma aygıtına değiştiriliyor.</html> Revert back to device '%1' '%1' aygıtına geri döndür Phonon:: Notifications Bildirimler Music Müzik Video Görüntü Communication İletişim Games Oyunlar Accessibility Erişebilirlik Phonon::Gstreamer::Backend Warning: You do not seem to have the package gstreamer0.10-plugins-good installed. Some video features have been disabled. Uyarı: Yüklenmiş gstreamer0.10-plugins-good paketine sahip görünmüyorsunuz. Bazı görüntü özellikleri etkisizleştirildi. Warning: You do not seem to have the base GStreamer plugins installed. All audio and video support has been disabled Uyarı: Yüklenmiş ana GStreame eklentilerine sahip görünmüyorsunuz. Tüm ses ve görüntü desteği etkisizleştirildi Phonon::Gstreamer::MediaObject Cannot start playback. Check your Gstreamer installation and make sure you have libgstreamer-plugins-base installed. Çalma başlatılamıyor. Gstreamer kurulumunuzu kontrol edin ve yüklenmiş libgstreamer-plugins-base'e sahip olduğunuzdan emin olun. A required codec is missing. You need to install the following codec(s) to play this content: %0 Gereken bir kodek eksik. Bu içeriği çalmak için aşağıdaki kodek(ler)i yüklemeniz gerek: %0 Could not open media source. Ortam kaynağı açılamadı. Invalid source type. Geçersiz kaynak türü. Could not locate media source. Ortam kaynağının yeri bulunamadı. Could not open audio device. The device is already in use. Ses aygıtı açılamadı. Aygıt zaten kullanımda. Could not decode media source. Ortam kaynağı çözülemedi. Phonon::VolumeSlider Volume: %1% Ses: %1% Use this slider to adjust the volume. The leftmost position is 0%, the rightmost is %1% Sesi ayarlamak için bu kaydırma çuğunu kullanın. En sol konum % 0, en sağ konum %1% Q3Accel %1, %2 not defined %1, %2 tanımlanmamış Ambiguous %1 not handled Belirsiz %1 yürütülemedi Q3DataTable True Doğru False Yanlış Insert Ekle Update Güncelle Delete Sil Q3FileDialog Copy or Move a File Dosyayı Kopyala ya da Taşı Read: %1 Okuma: %1 Write: %1 Yazma: %1 Cancel İptal All Files (*) Tüm Dosyalar (*) Name Adı Size Boyut Type Türü Date Tarih Attributes Öznitelikleri &OK &TAMAM Look &in: Bakılan &yer: File &name: Dosya &adı: File &type: Dosya &türü: Back Geri One directory up Bir dizin yukarı Create New Folder Yeni Klasör Oluştur List View Liste Görünümü Detail View Ayrıntılı Görünüm Preview File Info Dosya Bilgisini Önizle Preview File Contents Dosya İçeriklerini Önizle Read-write Okuma-yazma Read-only Salt-okunur Write-only Sadece-yazma Inaccessible Erişilemez Symlink to File Dosyaya sembolik bağlantı Symlink to Directory Dizine sembolik bağlantı Symlink to Special Özel konuma sembolik bağlantı File Dosya Dir Dizin Special Özel Open Save As Farklı Kaydet &Open &Aç &Save &Kaydet &Rename &Yeniden Adlandır &Delete &Sil R&eload Y&eniden Yükle Sort by &Name İs&me göre Sırala Sort by &Size B&oyuta göre Sırala Sort by &Date Ta&rihe göre Sırala &Unsorted &Sıralanmamış Sort Sırala Show &hidden files Gizli &dosyaları göster the file dosya the directory dizin the symlink sembolik bağlantı Delete %1 %1 öğesini sil <qt>Are you sure you wish to delete %1 "%2"?</qt> <qt>%1 "%2" ögesini silmek istediğinizden emin misiniz?</qt> &Yes &Evet &No &Hayır New Folder 1 Yeni Klasör 1 New Folder Yeni Klasör New Folder %1 Yeni Klasör %1 Find Directory Dizin Bul Directories Dizinler Directory: Dizin: Error Hata %1 File not found. Check path and filename. %1 Dosya bulunamadı. Yolu ve dosya adını kontrol edin. Q3LocalFs Could not read directory %1 Okunamayan dizin %1 Could not create directory %1 Oluşturulamayan dizin %1 Could not remove file or directory %1 Kaldırılamayan dosya ya da dizin %1 Could not rename %1 to %2 Yeniden adlandırılamadı; %1 adından %2 adına Could not open %1 Açılamayan %1 Could not write %1 Yazılamayan %1 Q3MainWindow Line up Sıraya sok Customize... Özelleştir... Q3NetworkProtocol Operation stopped by the user İşlem kullanıcı tarafından durduruldu Q3ProgressDialog Cancel İptal Q3TabDialog OK TAMAM Apply Uygula Help Yardım Defaults Varsayılanlar Cancel İptal Q3TextEdit &Undo &Geri Al &Redo &Yinele Cu&t K&es &Copy &Kopyala &Paste &Yapıştır Clear Temizle Select All Tümünü Seç Q3TitleBar System Sistem Restore up Yukarı geri yükle Minimize Simge Durumuna Restore down Aşağı geri yükle Maximize Ekranı Kapla Close Kapat Contains commands to manipulate the window Pencereyi değiştiren komutları içerir Puts a minimized back to normal Küçültülmüş bir pencereyi normal haline getirir Moves the window out of the way Pencereyi uzağa taşır Puts a maximized window back to normal Büyütülmüş bir pencereyi normal haline getirir Makes the window full screen Pencereyi tam ekran yapar Closes the window Pencereyi kapatır Displays the name of the window and contains controls to manipulate it Pencerenin adını gösterir ve pencereyi değiştiren kontrolleri içerir Q3ToolBar More... Daha Fazlası... Q3UrlOperator The protocol `%1' is not supported `%1' protokolü desteklenmiyor The protocol `%1' does not support listing directories `%1' protokolü dizinleri listelemeyi desteklemiyor The protocol `%1' does not support creating new directories `%1' protokolü yeni dizinleri oluşturmayı desteklemiyor The protocol `%1' does not support removing files or directories `%1' protokolü dosya veya dizinleri kaldırmayı desteklemiyor The protocol `%1' does not support renaming files or directories `%1' protokolü dosya veya dizinleri yeniden adlandırmayı desteklemiyor The protocol `%1' does not support getting files `%1' protokolü dosyaları almayı desteklemiyor The protocol `%1' does not support putting files `%1' protokolü dosyaları koymayı desteklemiyor The protocol `%1' does not support copying or moving files or directories `%1' protokolü dosya veya dizinleri kopyalamyı veya taşımayı desteklemiyor (unknown) (bilinmiyor) Q3Wizard &Cancel &İptal < &Back < &Geri &Next > &İleri > &Finish &Bitti &Help &Yardım QAbstractSocket Host not found Anamakine bulunamadı Connection refused Bağlantı reddedildi Socket operation timed out Soket işlemi zamanı aştı Socket is not connected Soket bağlı değil QAbstractSpinBox &Step up Bir düzey &yukarı Step &down Bir düzey &aşağı &Select All &Tümünü Seç QApplication Activate Etkinleştir Executable '%1' requires Qt %2, found Qt %3. '%1' çalıştırılabilir dosyası Qt %2 gerektiriyor, sistemde Qt %3 bulundu. Incompatible Qt Library Error Uyumsuz Qt Kütüphanesi Hatası QT_LAYOUT_DIRECTION Translate this string to the string 'LTR' in left-to-right languages or to 'RTL' in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout. LTR Activates the program's main window Programın ana penceresini etkinleştirir QCheckBox Uncheck İşaretleme Check İşaretle Toggle Değiştir QColorDialog Hu&e: T&on: &Sat: &Doygunluk: &Val: &Değer: &Red: &Kırmızı: &Green: &Yeşil: Bl&ue: Ma&vi: A&lpha channel: A&lfa kanalı: &Basic colors &Temel renkler &Custom colors &Özel renkler &Add to Custom Colors Ö&zel Renkleri Ekle Select color Renk seç QComboBox Open False Yanlış True Doğru Close Kapat QCoreApplication %1: permission denied QSystemSemaphore %1: izin reddedildi %1: already exists QSystemSemaphore %1: zaten mevcut %1: doesn't exists QSystemSemaphore %1: mevcut değil %1: out of resources QSystemSemaphore %1: yetersiz kaynak %1: unknown error %2 QSystemSemaphore %1: bilinmeyen hata %2 %1: key is empty QSystemSemaphore %1: tuş boş %1: unable to make key QSystemSemaphore %1: tuş yapılamaz %1: ftok failed QSystemSemaphore %1: ftok başarısız oldu QDB2Driver Unable to connect Bağlanılamaz Unable to commit transaction İşlem yapılamaz Unable to rollback transaction İşlem geri alınamaz Unable to set autocommit Otomatik yapılma ayarlanamaz QDB2Result Unable to execute statement İfade çalıştırılamaz Unable to prepare statement İfade hazırlanamaz Unable to bind variable Değişken atanamaz Unable to fetch record %1 %1 kaydı getirilemez Unable to fetch next Sonraki getirilemez Unable to fetch first Birincisi getirilemez QDateTimeEdit AM ÖÖ am öö PM ÖS pm ös QDial QDial HAra SpeedoMeter Hız Ölçer SliderHandle Kaydırma Çubuğu Tutucu QDialog What's This? Bu Nedir? Done Bitti QDialogButtonBox OK TAMAM Save Kaydet Open Cancel İptal &Cancel &İptal Close Kapat Apply Uygula Reset Sıfırla Help Yardım Don't Save Kaydetme Discard Vazgeç &Yes &Evet Yes to &All &Tümüne Evet &No &Hayır N&o to All Tümüne &Hayır Save All Tümünü Kaydet Abort Durdur Retry Yeniden Dene Ignore Yoksay Restore Defaults Varsayılanları Geri Yükle Close without Saving Kaydetmeden Kapat &OK &TAMAM QDirModel Name Adı Size Boyut Kind Match OS X Finder Çeşit Type All other platforms Türü Date Modified Değiştirilme Tarihi QDockWidget Close Kapat Dock Yapışık Float Gezen QDoubleSpinBox More Daha Fazla Less Daha Az QErrorMessage Debug Message: Hata Ayıklama İletisi: Warning: Uyarı: Fatal Error: Önemli Hata: &Show this message again &Bu iletiyi tekrar göster &OK &TAMAM QFileDialog All Files (*) Tüm Dosyalar (*) Directories Dizinler &Open &Aç &Save &Kaydet Open %1 already exists. Do you want to replace it? %1 zaten mevcut. Değiştirmek istiyor musunuz? %1 File not found. Please verify the correct file name was given. %1 Dosya bulunamadı. Lütfen doğru dosya adının verildiğini doğrulayın. My Computer Bilgisayarım &Rename &Yeniden Adlandır &Delete &Sil Show &hidden files Gizli &dosyaları göster Back Geri Parent Directory Ana Dizin List View Liste Görünümü Detail View Ayrıntılı Görünüm Files of type: Dosya türü: Directory: Dizin: %1 Directory not found. Please verify the correct directory name was given. %1 Dizin bulunamadı. Lütfen doğru dizin adının verildiğini doğrulayın. '%1' is write protected. Do you want to delete it anyway? '%1' yazma korumalı. Yine de silmek istiyor musunuz? Are sure you want to delete '%1'? '%1' dizinini silmek istediğinize emin misiniz? Could not delete directory. Dizin silinemedi. Save As Farklı Kaydet Drive Sürücü File Dosya Unknown Bilinmiyor Find Directory Dizin Bul Show Göster Forward İleri New Folder Yeni Klasör &New Folder &Yeni Klasör &Choose Se&çin Remove Kaldır File &name: Dosya &adı: Look in: Bakılan yer: Create New Folder Yeni Klasör Oluştur QFileSystemModel Invalid filename Geçersiz dosya adı <b>The name "%1" can not be used.</b><p>Try using another name, with fewer characters or no punctuations marks. <b>"%1" adı kullanılamıyor.</b><p>Daha az karakter ile ya da noktalama işaretleri olmadan başka bir isim kullanmayı deneyin. Name Adı Size Boyut Kind Match OS X Finder Çeşit Type All other platforms Türü Date Modified Değiştirilme Tarihi My Computer Bilgisayarım Computer Bilgisayar %1 TB %1 TB %1 GB %1 GB %1 MB %1 MB %1 KB %1 KB %1 bytes %1 bayt QFontDatabase Normal Normal Bold Kalın Demi Bold Yarı Kalın Black Koyu Demi Yarı Koyu Light Açık Italic İtalik Oblique Eğik Any Herhangi Latin Latin Greek Yunanca Cyrillic Kiril Armenian Ermenice Hebrew İbranice Arabic Arapça Syriac Süryanice Thaana Maldivce Devanagari Devanagari Bengali Bendalce Gurmukhi Gurmukhi Gujarati Gujarati Oriya Oriya Tamil Tamilce Telugu Telugu Kannada Kanada Malayalam Malayalam Sinhala Sinhala Thai Tayca Lao Laoca Tibetan Tibetçe Myanmar Myanmar Georgian Gürcüce Khmer Kmer Simplified Chinese Basitleştirilmiş Çince Traditional Chinese Geleneksel Çince Japanese Japonca Korean Korece Vietnamese Vietnamca Symbol Sembol Ogham Ogham Runic Rünik QFontDialog &Font &Yazı Tipi Font st&yle Yazı Tipi B&içemi &Size &Boyut Effects Efektler Stri&keout &Üzeriçizili &Underline &Altıçizili Sample Örnek Wr&iting System Ya&zma Sistemi Select Font Yazı Tipi Seç QFtp Not connected Bağlı değil Host %1 not found %1 anamakinesi bulunamadı Connection refused to host %1 %1 anamakinesine bağlantı reddedildi Connected to host %1 %1 anamakinesine bağlanıldı Connection refused for data connection Veri bağlantısı için bağlantı reddedildi Unknown error Bilinmeyen hata Connecting to host failed: %1 Anamakineye bağlantı başarısız oldu: %1 Login failed: %1 Oturum açma başarısız oldu: %1 Listing directory failed: %1 Dizin listeleme başarısız oldu: %1 Changing directory failed: %1 Dizin değiştirme işlemi başarısız oldu: %1 Downloading file failed: %1 Dosya indirme başarısız oldu: %1 Uploading file failed: %1 Dosya gönderme başarısız oldu: %1 Removing file failed: %1 Dosya kaldırma başarısız oldu: %1 Creating directory failed: %1 Dizin oluşturma başarısız oldu: %1 Removing directory failed: %1 Dizin kaldırma başarısız oldu: %1 Connection closed Bağlantı kapatıldı Host %1 found %1 anamakinesi bulundu Connection to %1 closed %1 makinesine yapılan bağlantı kapatıldı Host found Anamakine bulundu Connected to host Anamakineye bağlanıldı QHostInfo Unknown error Bilinmeyen hata QHostInfoAgent Host not found Anamakine bulunamadı Unknown address type Bilinmeyen adres türü Unknown error Bilinmeyen hata QHttp Unknown error Bilinmeyen hata Request aborted İstek iptal edildi No server set to connect to Bağlanmaya ayarlanmış sunucu yok Wrong content length Yanlış içerik uzunluğu Server closed connection unexpectedly Sunucu bağlantıyı beklenmedik şekilde kapattı Connection refused Bağlantı reddedildi Host %1 not found %1 anamakinesi bulunamadı HTTP request failed HTTP isteği başarısız oldu Invalid HTTP response header Geçersiz HTTP yanıt başlığı Invalid HTTP chunked body Geçersiz HTTP yığın gövdesi Host %1 found %1 anamakinesi bulundu Connected to host %1 %1 anamakinesine bağlanıldı Connection to %1 closed %1 makinesine yapılan bağlantı kapatıldı Host found Anamakine bulundu Connected to host Anamakineye bağlanıldı Connection closed Bağlantı kapatıldı Proxy authentication required Proksi kimlik doğrulaması gerekli Authentication required Kimlik doğrulaması gerekli HTTPS connection requested but SSL support not compiled in HTTPS bağlantısı istendi ama SSL desteği ile derlenmiş değil Connection refused (or timed out) Bağlantı reddedildi (ya da zaman aşıldı) Proxy requires authentication Proksi kimlik doğrulaması gerektirir Host requires authentication Anamakine kimlik doğrulaması gerektirir Data corrupted Veri bozulmuş Unknown protocol specified Bilinmeyen protokol belirtilmiş SSL handshake failed SSL anlaşması başarısız oldu QHttpSocketEngine Authentication required Kimlik doğrulaması gerekli QIBaseDriver Error opening database Veritabanını açarken hata oldu Could not start transaction İşlem başlatılamadı Unable to commit transaction İşlem yapılamaz Unable to rollback transaction İşlem geri alınamaz QIBaseResult Unable to create BLOB BLOB oluşturulamaz Unable to write BLOB BLOB yazılamaz Unable to open BLOB BLOB açılamaz Unable to read BLOB BLOB okunamaz Could not find array Sıra bulunamadı Could not get array data Sıralı veri alınamadı Could not get query info Sorgu bilgisi alınamadı Could not start transaction İşlem başlatılamadı Unable to commit transaction İşlem yapılamaz Could not allocate statement İfade ayrılamadı Could not prepare statement İfade hazırlanamadı Could not describe input statement Girdi ifadesi tanımlanamadı Could not describe statement İfade tanımlanamadı Unable to close statement İfade kapatılamadı Unable to execute query Sorgu çalıştırılamaz Could not fetch next item Sonraki öge getirilemedi Could not get statement info İfade bilgisi alınamadı QIODevice Permission denied İzin reddedildi Too many open files Çok fazla açık dosya No such file or directory Böyle bir dosya ya da dizin yok No space left on device Aygıtta kalan boş alan yok Unknown error Bilinmeyen hata QInputContext XIM XIM XIM input method XIM girdi yöntemi Windows input method Windows girdi yöntemi Mac OS X input method Mac OS X girdi yöntemi QLibrary QLibrary::load_sys: Cannot load %1 (%2) QLibrary::load_sys: %1 (%2) yüklenemedi QLibrary::unload_sys: Cannot unload %1 (%2) QLibrary::unload_sys: %1 (%2) kaldırılamadı QLibrary::resolve_sys: Symbol "%1" undefined in %2 (%3) QLibrary::resolve_sys: Sembol "%1", %2 (%3) içerisinde tanımlanmamış Could not mmap '%1': %2 mmap '%1' yapılamadı: %2 Plugin verification data mismatch in '%1' '%1' içerisindeki eklenti doğrulama verisi uyuşmuyor Could not unmap '%1': %2 unmap '%1' yapılamadı: %2 The plugin '%1' uses incompatible Qt library. (%2.%3.%4) [%5] '%1' eklentisi uyumsuz Qt kütüphanesi kullanıyor. (%2.%3.%4) [%5] The plugin '%1' uses incompatible Qt library. Expected build key "%2", got "%3" '%1' eklentisi uyumsuz Qt kütüphanesi kullanıyor. Beklenen yapım anahtarı "%2", alınan "%3" Unknown error Bilinmeyen hata The shared library was not found. Paylaşılan kütüphane bulunamadı. The file '%1' is not a valid Qt plugin. '%1' dosyası geçerli bir Qt eklentisi değil. The plugin '%1' uses incompatible Qt library. (Cannot mix debug and release libraries.) '%1' eklentisi uyumsuz Qt kütüphanesi kullanıyor. (Hata ayıklama ve yayım kütüphaneleri karıştırılamaz.) QLineEdit &Undo &Geri Al &Redo &Yinele Cu&t K&es &Copy &Kopyala &Paste &Yapıştır Delete Sil Select All Tümünü Seç QLocalServer %1: Name error %1: İsim hatası %1: Permission denied %1: İzin reddedildi %1: Address in use %1: Adres kullanımda %1: Unknown error %2 %1: Bilinmeyen hata %2 QLocalSocket %1: Connection refused %1: Bağlantı reddedildi %1: Remote closed %1: Uzaktan kapatıldı %1: Invalid name %1: Geçersiz ad %1: Socket access error %1: Soket erişim hatası %1: Socket resource error %1: Soket kaynak hatası %1: Socket operation timed out %1: Soket işlem zamanı aşıldı %1: Datagram too large %1: Veri paketi çok büyük %1: Connection error %1: Bağlantı hatası %1: The socket operation is not supported %1: Soket işlemi desteklenmiyor %1: Unknown error %2 %1: Bilinmeyen hata %2 QMYSQLDriver Unable to open database ' Veritabanı açılamaz ' Unable to connect Bağlanılamaz Unable to begin transaction İşlem başlayamaz Unable to commit transaction İşlem yapılamaz Unable to rollback transaction İşlem geri alınamaz QMYSQLResult Unable to fetch data Veri getirilemez Unable to execute query Sorgu çalıştırılamaz Unable to store result Sonuç saklanamaz Unable to prepare statement İfade hazırlanamaz Unable to reset statement İfade sıfırlanamaz Unable to bind value Değer atanamaz Unable to execute statement İfade çalıştırılamaz Unable to bind outvalues Çıkan değerler atanamaz Unable to store statement results İfade sonuçları saklanamaz Unable to execute next query Sonraki sorgu çalıştırılamaz Unable to store next result Sonraki sorgu saklanamaz QMdiArea (Untitled) (Başlıksız) QMdiSubWindow %1 - [%2] %1 - [%2] Close Kapat Minimize Simge Durumuna Restore Down Aşağı Geri Yükle &Restore &Geri Yükle &Move &Taşı &Size &Boyut Mi&nimize Simge Durumu&na Ma&ximize Ekranı Ka&pla Stay on &Top &Her Zaman Üstte &Close &Kapat - [%1] - [%1] Maximize Ekranı Kapla Unshade Gölgeleme Shade Gölgele Restore Geri Yükle Help Yardım Menu Menü QMenu Close Kapat Open Execute Çalıştır QMessageBox Help Yardım OK TAMAM About Qt Qt Hakkında <p>This program uses Qt version %1.</p> <p>Bu program Qt %1 sürümünü kullanır.</p> Show Details... Ayrıntıları Göster... Hide Details... Ayrıntıları Gizle... <p>This program uses Qt Open Source Edition version %1.</p><p>Qt Open Source Edition is intended for the development of Open Source applications. You need a commercial Qt license for development of proprietary (closed source) applications.</p><p>Please see <a href="http://www.trolltech.com/company/model/">www.trolltech.com/company/model/</a> for an overview of Qt licensing.</p> <p>Bu program Qt Açık Kaynak Yayını %1 sürümünü kullanır.</p><p>Qt Açık Kaynak Yayını, Açık Kaynak uygulamaların geliştirilmesi için tasarlanır. Tescilli (kapalı kaynak) uygulamaların geliştirilmesi için ticari Qt lisansına ihtiyacınız var.</p><p>Lütfen Qt lisanslamasını gözden geçirmek için <a href="http://www.trolltech.com/company/model/">www.trolltech.com/company/model/</a> adresine bakın.</p> <h3>About Qt</h3>%1<p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.</p><p>Qt is a Nokia product. See <a href="http://www.trolltech.com/qt/">www.trolltech.com/qt/</a> for more information.</p> <h3>Qt Hakkında</h3>%1<p>Qt birden fazla platformda uygulama geliştirilmesi için bir C++ araç takımıdır.</p><p>Qt, MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, ve tüm ticari Unix çeşitleri arasında tek-kaynak taşınabilirliği sağlar. Qt ayrıca Gömülü Linux için Qt ve Windows CE için Qt gibi gömülü aygıtlar için mevcuttur.</p><p>Qt bir Nokia ürünüdür. Daha fazla bilgi için <a href="http://www.trolltech.com/qt/">www.trolltech.com/qt/</a> adresine bakın.</p> QMultiInputContext Select IM Çoklu Girdi Seç QMultiInputContextPlugin Multiple input method switcher Çoklu girdi yöntemi değiştirici Multiple input method switcher that uses the context menu of the text widgets Çoklu girdi yöntemi değiştirici metin parçacıklarının sağ tıklama menüsünü kullanır QNativeSocketEngine The remote host closed the connection Uzak anamakine bağlantıyı kapattı Network operation timed out Ağ işlemi zamanı aşıldı Out of resources Yetersiz kaynak Unsupported socket operation Desteklenmeyen soket işlemi Protocol type not supported Protokol türü desteklenmiyor Invalid socket descriptor Geçersiz soket tanımlayıcı Network unreachable Ağa erişilemez Permission denied İzin reddedildi Connection timed out Bağlantı zamanı aşıldı Connection refused Bağlantı reddedildi The bound address is already in use Sınır adresi zaten kullanımda The address is not available Adres kullanılabilirdeğil The address is protected Adres korunuyor Unable to send a message İileti gönderilemez Unable to receive a message İleti alınamaz Unable to write Yazılamaz Network error Ağ hatası Another socket is already listening on the same port Aynı bağlantı noktası üzerinde zaten başka bir soket dinleniyor Unable to initialize non-blocking socket Engellenmeyen soket başlatılamaz Unable to initialize broadcast socket Yayın soketi başlatılamaz Attempt to use IPv6 socket on a platform with no IPv6 support IPv6 desteği olmayan bir platformda IPv6 soketi kullanılmaya çalışıldı Host unreachable Anamakineye erişilemez Datagram was too large to send Veri paketi göndermek için çok büyük Operation on non-socket Soketsiz işlem Unknown error Bilinmeyen hata The proxy type is invalid for this operation Proksi türü bu işlem için geçersiz QNetworkAccessFileBackend Request for opening non-local file %1 Yerel olmayan %1 dosyasının açılması için istek Error opening %1: %2 %1 dosyasını açarken hata oldu: %2 Write error writing to %1: %2 %1 dosyasına yazarken yazma hatası oldu: %2 Cannot open %1: Path is a directory %1 açılamıyor: Yol bir dizindir Read error reading from %1: %2 %1 dosyasından okurken okuma hatası oldu: %2 QNetworkAccessFtpBackend Cannot open %1: is a directory %1 açılamıyor: bu bir dizin Logging in to %1 failed: authentication required %1 oturum açma başarısız oldu: kimlik doğrulaması gerekli Error while downloading %1: %2 %1 indiriliyorken hata oldu: %2 Error while uploading %1: %2 %1 gönderiliyorken hata oldu: %2 QNetworkReply Error downloading %1 - server replied: %2 %1 indiriliyorken hata oldu - sunucunun yanıtı: %2 Protocol "%1" is unknown "%1" protokolü bilinmiyor QNetworkReplyImpl Operation canceled İşlem iptal edildi QOCIDriver Unable to logon Oturum açılamaz Unable to initialize QOCIDriver Başlatılamaz Unable to begin transaction İşlem başlayamaz Unable to commit transaction İşlem yapılamaz Unable to rollback transaction İşlem geri alınamaz QOCIResult Unable to bind column for batch execute Toplu çalıştırma için sütun atanamaz Unable to execute batch statement Toplu ifade çalıştırılamaz Unable to goto next Sonrakine gidilemez Unable to alloc statement İfadeye ayrılamaz Unable to prepare statement İfade hazırlanamaz Unable to bind value Değer atanamaz Unable to execute select statement Select ifadesi çalıştırılamaz Unable to execute statement İfade çalıştırılamaz QODBCDriver Unable to connect Bağlanılamaz Unable to connect - Driver doesn't support all needed functionality Bağlanılamaz - Sürücü gereken tüm işlevleri desteklemiyor Unable to disable autocommit Otomatik yapılma etkinleştirilemez Unable to commit transaction İşlem yapılamaz Unable to rollback transaction İşlem geri alınamaz Unable to enable autocommit Otomatik yapılma etkinleştirilemez QODBCResult QODBCResult::reset: Unable to set 'SQL_CURSOR_STATIC' as statement attribute. Please check your ODBC driver configuration QODBCResult::reset: 'SQL_CURSOR_STATIC' öznitelik ifadesi olarak ayarlanamaz. Lütfen ODBC sürücü yapılandırmanızı kontrol edin Unable to execute statement İfade çalıştırılamaz Unable to fetch next Sonraki getirilemez Unable to prepare statement İfade hazırlanamaz Unable to bind variable Değişken atanamaz Unable to fetch last Sonuncu getirilemez Unable to fetch Getirilemez Unable to fetch first Birinci getirilemez Unable to fetch previous Önceki getirilemez QObject Operation not supported on %1 İşlem %1 üzerinde desteklenmedi Invalid URI: %1 Geçersiz URI: %1 Write error writing to %1: %2 %1 dosyasına yazarken yazma hatası oldu: %2 Read error reading from %1: %2 %1 dosyasından okurken okuma hatası oldu: %2 Socket error on %1: %2 %1 üzerinde soket hatası oldu: %2 Remote host closed the connection prematurely on %1 Uzak anamakine %1 üzerindeki bağlantıyı erken kapadı Protocol error: packet of size 0 received Protokol hatası: alınan paket boyutu 0 QPPDOptionsModel Name Adı Value Değer QPSQLDriver Unable to connect Bağlanılamaz Could not begin transaction İşlem başlayamaz Could not commit transaction İşlem yapılamaz Could not rollback transaction İşlem geri alınamaz Unable to subscribe Abone olunamaz Unable to unsubscribe Abonelik kaldırılamaz QPSQLResult Unable to create query Sorgu oluşturulamaz Unable to prepare statement İfade hazırlanamaz QPageSetupWidget Centimeters (cm) Santimetre (cm) Millimeters (mm) Milimetre (mm) Inches (in) İnç (in) Points (pt) Nokta (pt) Form Biçim Paper Kağıt Page size: Sayfa boyutu: Width: Genişlik: Height: Yükseklik: Paper source: Kağıt kaynağı: Orientation Yönlendirme Portrait Dikey Landscape Yatay Reverse landscape Döndürülmüş yatay Reverse portrait Döndürülmüş dikey Margins Kenar Boşlukları top margin üst kenar left margin sol kenar right margin sağ kenar bottom margin alt kenar QPluginLoader Unknown error Bilinmeyen hata The plugin was not loaded. Eklenti yüklenmedi. QPrintDialog locally connected yerel olarak bağlı Aliases: %1 Takma adlar: %1 unknown bilinmiyor Print To File ... Dosyaya Yazdır ... File %1 is not writable. Please choose a different file name. %1 dosyası yazılabilir değil. Lütfen farklı bir dosya adı seçin. %1 already exists. Do you want to overwrite it? %1 zaten mevcut. Üzerine yazmak istiyor musunuz? %1 is a directory. Please choose a different file name. %1 bir dizin. Lütfen farklı bir dosya adı seçin. A0 A0 A1 A1 A2 A2 A3 A3 A4 A4 A5 A5 A6 A6 A7 A7 A8 A8 A9 A9 B0 B0 B1 B1 B2 B3 B3 B4 B4 B5 B5 B6 B6 B7 B7 B8 B8 B9 B9 B10 B10 C5E C5E DLE DLE Executive Executive Folio Folio Ledger Ledger Legal Legal Letter Letter Tabloid Tabloid US Common #10 Envelope US Common #10 Zarf Custom Özel &Options >> &Seçenekler >> &Print &Yazdır &Options << &Seçenekler << Print to File (PDF) Dosyaya Yazdır (PDF) Print to File (Postscript) Dosyaya Yazdır (Postscript) Local file Yerel dosya Write %1 file %1 dosyasını yaz QPrintPreviewDialog Page Setup Sayfa Yapısı Print Preview Baskı Önizleme Next page Sonraki sayfa Previous page Önceki sayfa First page İlk sayfa Last page Son sayfa Fit width Genişliği sığdır Fit page Sayfayı sığdır Zoom in Yakınlaştır Zoom out Uzaklaştır Portrait Dikey Landscape Yatay Show single page Tek sayfa göster Show facing pages Karşılıklı sayfaları göster Show overview of all pages Tüm sayfaların genelini göster Print Yazdır Page setup Sayfa yapısı Close Kapat QPrintPropertiesWidget Form Biçim Page Sayfa Advanced Gelişmiş QPrintSettingsOutput Form Biçim Copies Kopya Print range Yazdırma aralığı Print all Tümünü yazdır Pages from Bu sayfadan to bu sayfaya Selection Seçim Output Settings Çıktı Ayarları Copies: Kopya: Collate Harmanla Reverse Tersten Options Seçenekler Color Mode Renk Kipi Color Renk Grayscale Gri Tonlama Duplex Printing Her İki Tarafa Yazdır None Hiçbiri Long side Uzun kenar Short side Kısa kenar QPrintWidget Form Biçim Printer Yazıcı &Name: &Adı: P&roperties Ö&zellikleri Location: Yeri: Preview Önizleme Type: Türü: Output &file: Çıktı &dosyası: ... ... QProgressDialog Cancel İptal QPushButton Open QRadioButton Check İşaretle QRegExp no error occurred hata meydana gelmedi disabled feature used etkisizleştirilmiş özellik kullanıldı bad char class syntax kötü karakter sınıfı söz dizimi bad lookahead syntax ileriye dönük kötü söz dizimi bad repetition syntax kötü tekrarlama söz dizimi invalid octal value geçersiz sekizlik değer missing left delim eksik sol sınırlayıcı unexpected end beklenmedik bitiş met internal limit dahili sınıra rastlandı QSQLite2Driver Error to open database Veritabanı açma hatası Unable to begin transaction İşlem başlayamaz Unable to commit transaction İşlem yapılamaz Unable to rollback Transaction İşlem geri alınamaz QSQLite2Result Unable to fetch results Sonuçlar getirilemez Unable to execute statement İfade çalıştırılamaz QSQLiteDriver Error opening database Veritabanı açılırken hata oldu Error closing database Veritabanı kapatılırken hata oldu Unable to begin transaction İşlem başlayamaz Unable to commit transaction İşlem yapılamaz Unable to rollback transaction İşlem geri alınamaz QSQLiteResult Unable to fetch row Satır getirilemez Unable to execute statement İfade çalıştırılamaz Unable to reset statement İfade sıfırlanamaz Unable to bind parameters Parametreler atanamaz Parameter count mismatch Parametre sayısı uyuşmuyor No query Sorgu yok QScrollBar Scroll here Buraya kaydır Left edge Sol kenara Top En Üste Right edge Sağ kenara Bottom En Alta Page left Sayfa sola Page up Sayfa yukarı Page right Sayfa sağa Page down Sayfa aşağı Scroll left Sola kaydır Scroll up Yukarı kaydır Scroll right Sağa kaydır Scroll down Aşağı kaydır Line up Satır yukarı Position Konum Line down Satır aşağı QSharedMemory %1: unable to set key on lock %1: kilitte anahtar ayarlanamaz %1: create size is less then 0 %1: oluşturulan boyut 0'dan az %1: unable to lock %1: kilitlenemez %1: unable to unlock %1: kilit açılamaz %1: permission denied %1: izin reddedildi %1: already exists %1: zaten mevcut %1: doesn't exists %1: mevcut değil %1: out of resources %1: yetersiz kaynak %1: unknown error %2 %1: bilinmeyen hata %2 %1: key is empty %1: anahtar boş %1: unix key file doesn't exists %1: unix anahtar dosyası mevcut değil %1: ftok failed %1: ftok başarısız oldu %1: unable to make key %1: anahtar yapılamaz %1: system-imposed size restrictions %1: sistem-maruz kalma boyutu kısıtlamaları %1: not attached %1: takılı değil QShortcut Space Space Esc Esc Tab Tab Backtab Backtab Backspace Backspace Return Return Enter Enter Ins Ins Del Del Pause Pause Print Print SysReq SysReq Home Home End End Left Sol Up Yukarı Right Sağ Down Aşağı PgUp PgUp PgDown PgDown CapsLock CapsLock NumLock NumLock ScrollLock ScrollLock Menu Menü Help Yardım Back Geri Forward İleri Stop Durdur Refresh Yenile Volume Down Sesi Azalt Volume Mute Sesi Kapat Volume Up Sesi Arttır Bass Boost Bası Güçlendir Bass Up Bası Arttır Bass Down Bası Azalt Treble Up Tizi Arttır Treble Down Tizi Azalt Media Play Ortam Çal Media Stop Ortam Durdur Media Previous Ortam Önceki Media Next Ortam Sonraki Media Record Ortam Kayıt Favorites Favoriler Search Ara Standby Beklemede Open URL URL'yi Aç Launch Mail Posta Uyg. Çalıştır Launch Media Ortam Çalıştır Launch (0) Çalıştır (0) Launch (1) Çalıştır (1) Launch (2) Çalıştır (2) Launch (3) Çalıştır (3) Launch (4) Çalıştır (4) Launch (5) Çalıştır (5) Launch (6) Çalıştır (6) Launch (7) Çalıştır (7) Launch (8) Çalıştır (8) Launch (9) Çalıştır (9) Launch (A) Çalıştır (A) Launch (B) Çalıştır (B) Launch (C) Çalıştır (C) Launch (D) Çalıştır (D) Launch (E) Çalıştır (E) Launch (F) Çalıştır (F) Print Screen Print Screen Page Up Page Up Page Down Page Down Caps Lock Caps Lock Num Lock Num Lock Number Lock Number Lock Scroll Lock Scroll Lock Insert Insert Delete Delete Escape Escape System Request Sistem İsteği Select Seç Yes Evet No Hayır Context1 Bağlam1 Context2 Bağlam2 Context3 Bağlam3 Context4 Bağlam4 Call Ara Hangup Flip Çevir Ctrl Ctrl Shift Shift Alt Alt Meta Üst + + F%1 F%1 Home Page Ana Sayfa QSlider Page left Sayfa sola Page up Sayfa yukarı Position Konum Page right Sayfa sağa Page down Sayfa aşağı QSocks5SocketEngine Socks5 timeout error connecting to socks server Socks sunucusuna bağlanırken Socks5 zaman aşımı hatası oldu Network operation timed out Ağ işlem zamanı aşıldı QSpinBox More Daha Fazla Less Daha Az QSql Delete Sil Delete this record? Bu kayıt silinsin mi? Yes Evet No Hayır Insert Ekle Update Güncelle Save edits? Düzenlemeler kaydedilsin mi? Cancel İptal Confirm Onayla Cancel your edits? Düzenlemeler iptal edilsin mi? QSslSocket Unable to write data: %1 Veri yazılamaz: %1 Error while reading: %1 Okunurken hata oldu: %1 Error during SSL handshake: %1 SSL anlaşması sırasında hata oldu: %1 Error creating SSL context (%1) SSL bağlamı oluşturma hatası (%1) Invalid or empty cipher list (%1) Geçersiz ya da boş şifreleme listesi (%1) Error creating SSL session, %1 SSL oturumu oluşturma hatası, %1 Error creating SSL session: %1 SSL oturumu oluşturma hatası: %1 Cannot provide a certificate with no key, %1 Anahtar olmadan bir sertifika sağlanamıyor, %1 Error loading local certificate, %1 Yerel sertifika yükleme hatası, %1 Error loading private key, %1 Yerel özel anahtar yükleme hatası, %1 Private key does not certificate public key, %1 Özel anahtar ortak anahtarı belgelemez, %1 QTDSDriver Unable to open connection Bağlantı açılamaz Unable to use database Veritabanı kullanılamaz QTabBar Scroll Left Sola Kaydır Scroll Right Sağa Kaydır QTextControl &Undo &Geri Al &Redo &Yinele Cu&t K&es &Copy &Kopyala Copy &Link Location Bağlantı Yerini Kopya&la &Paste &Yapıştır Delete Sil Select All Tümünü Seç QToolButton Press Bas Open QUdpSocket This platform does not support IPv6 Bu platform IPv6 desteklemiyor QUndoGroup Undo Geri Al Redo Yinele QUndoModel <empty> <boş> QUndoStack Undo Geri Al Redo Yinele QUnicodeControlCharacterMenu LRM Left-to-right mark LRM Soldan-sağa işaretle RLM Right-to-left mark RLM Sağdan-sola işaretle ZWJ Zero width joiner ZWJ Sıfır genişliğe birleştiren ZWNJ Zero width non-joiner ZWNJ Sıfır genişliğe birleştirmeyen ZWSP Zero width space ZWSP Sıfır genişlikte boşluk LRE Start of left-to-right embedding LRE Soldan-sağa gömme başlangıcı RLE Start of right-to-left embedding RLE Sağdan-sola gömme başlangıcı LRO Start of left-to-right override LRO Soldan-sağa geçersiz kılma başlangıcı RLO Start of right-to-left override RLO Sağdan-sola geçersiz kılma başlangıcı PDF Pop directional formatting PDF Açılır yönde biçimlendirme Insert Unicode control character Unicode denetim karakteri ekle QWebFrame Request cancelled İstek iptal edildi Request blocked İstek engellendi Cannot show URL URL gösterilemiyor Frame load interruped by policy change Politika değişimi yüzünden çerçeve yükleme kesildi Cannot show mimetype Mime türleri gösterilemiyor File does not exist Dosya mevcut değil QWebPage Bad HTTP request Kötü HTTP isteği Submit default label for Submit buttons in forms on web pages Gönder Submit Submit (input element) alt text for <input> elements with no alt, title, or value Gönder Reset default label for Reset buttons in forms on web pages Sıfırla This is a searchable index. Enter search keywords: text that appears at the start of nearly-obsolete web pages in the form of a 'searchable index' Bu aranabilir bir indekstir. Aranacak anahtar kelimeleri girin: Choose File title for file button used in HTML forms Dosya Seçin No file selected text to display in file button used in HTML forms when no file is selected Seçilen dosya yok Open in New Window Open in New Window context menu item Yeni Pencerede Aç Save Link... Download Linked File context menu item Bağlantıyı Kaydet... Copy Link Copy Link context menu item Bağlantıyı Kopyala Open Image Open Image in New Window context menu item Resimi Aç Save Image Download Image context menu item Resimi Kaydet Copy Image Copy Link context menu item Resimi Kopyala Open Frame Open Frame in New Window context menu item Çerçeve Aç Copy Copy context menu item Kopyala Go Back Back context menu item Geri Git Go Forward Forward context menu item İleri Git Stop Stop context menu item Durdur Reload Reload context menu item Yeniden Yükle Cut Cut context menu item Kes Paste Paste context menu item Yapıştır No Guesses Found No Guesses Found context menu item Bulunan Tahminler Yok Ignore Ignore Spelling context menu item Yoksay Add To Dictionary Learn Spelling context menu item Sözlüğe Ekle Search The Web Search The Web context menu item Web'i Ara Look Up In Dictionary Look Up in Dictionary context menu item Sözlükte Ara Open Link Open Link context menu item Bağlantıyı Aç Ignore Ignore Grammar context menu item Yoksay Spelling Spelling and Grammar context sub-menu item Yazım Show Spelling and Grammar menu item title Yazımı ve Dilbilgisini Göster Hide Spelling and Grammar menu item title Yazımı ve Dilbilgisini Gizle Check Spelling Check spelling context menu item Yazımı Kontrol Et Check Spelling While Typing Check spelling while typing context menu item Yazımı Yazarken Kontrol Et Check Grammar With Spelling Check grammar with spelling context menu item Dilbilgisini Yazımla Kontrol Et Fonts Font context sub-menu item Yazı Tipleri Bold Bold context menu item Kalın Italic Italic context menu item İtalik Underline Underline context menu item Altı Çizili Outline Outline context menu item Üstü Çizili Direction Writing direction context sub-menu item Yön Default Default writing direction context menu item Varsayılan LTR Left to Right context menu item LTR RTL Right to Left context menu item RTL Inspect Inspect Element context menu item Denetle No recent searches Label for only item in menu that appears when clicking on the search field image, when no searches have been performed Son aramalar yok Recent searches label for first item in the menu that appears when clicking on the search field image, used as embedded menu title Son aramalar Clear recent searches menu item in Recent Searches menu that empties menu's contents Son aramaları temizle Unknown Unknown filesize FTP directory listing item Bilinmiyor %1 (%2x%3 pixels) Title string for images %1 (%2x%3 piksel) Web Inspector - %2 Web Denetleyicisi - %2 QWhatsThisAction What's This? Bu Nedir? QWidget * * QWizard Go Back Geri Git Continue Devam Commit Gönder Done Bitti Quit Çık Help Yardım < &Back < &Geri &Finish &Bitir Cancel İptal &Help &Yardım &Next İ&leri &Next > İ&leri > QWorkspace &Restore &Geri Yükle &Move &Taşı &Size &Boyut Mi&nimize Simge Durumu&na Ma&ximize Ekranı Ka&pla &Close &Kapat Stay on &Top &Her Zaman Üstte Sh&ade G&ölgele %1 - [%2] %1 - [%2] Minimize Simge Durumuna Restore Down Aşağı Geri Yükle Close Kapat &Unshade Gölgele&me QXml no error occurred hata meydana gelmedi error triggered by consumer hata tüketici tarafından tetiklendi unexpected end of file beklenmedik dosya sonu more than one document type definition birden fazla belge türü tanımlaması error occurred while parsing element Öge ayrıştırılırken hata meydana geldi tag mismatch etiket uyuşmuyor error occurred while parsing content İçerik ayrıştırılırken hata meydana geldi unexpected character beklenmedik karakter invalid name for processing instruction işleme talimatı için geçersiz isim version expected while reading the XML declaration XML bildirimi okunurken sürüm beklenmekte wrong value for standalone declaration bağımsız bildirim için yanlış değer encoding declaration or standalone declaration expected while reading the XML declaration XML bildirimi okunurken kodlama bildirmi ya da bağımsız bildirim beklenmekte standalone declaration expected while reading the XML declaration XML bildirimi okunurken bağımsız bildirim beklenmekte error occurred while parsing document type definition Belge türü tanımlaması ayrıştırılırken hata meydana geldi letter is expected harf beklenmekte error occurred while parsing comment yorum ayrıştırılırken hata meydana geldi error occurred while parsing reference Referans ayrıştırılırken hata meydana geldi internal general entity reference not allowed in DTD DTD içerisinde dahili genel birim referansına izin verilmez external parsed general entity reference not allowed in attribute value Öznitelik değeri içerisinde harici ayrıştırılmış genel birim referansına izin verilmez external parsed general entity reference not allowed in DTD DTD içerisinde harici ayrıştırılmış genel birim referansına izin verilmez unparsed entity reference in wrong context yanlış bağlam içinde ayrıştırılmamış birim referansı recursive entities tekrarlanan birimler error in the text declaration of an external entity harici bir birimin metin bildiriminde hata QXmlStream Extra content at end of document. Belge sonunda fazladan içerik. Invalid entity value. Geçersiz birim değeri. Invalid XML character. Geçersiz XML karakteri. Sequence ']]>' not allowed in content. İçerikte ']]>' dizisine izin verilmez. Namespace prefix '%1' not declared Ad boşluğu öneki '%1' bildirilmedi Attribute redefined. Öznitelik yeniden tanımlandı. Unexpected character '%1' in public id literal. Ortak kimlik bilgisinde beklenmedik '%1' karakteri. Invalid XML version string. Geçersiz XML sürüm dizgisi. Unsupported XML version. Desteklenmeyen XML sürümü. %1 is an invalid encoding name. %1 geçersiz bir kodlama adıdır. Encoding %1 is unsupported %1 kodlaması desteklenmiyor Standalone accepts only yes or no. Bağımsız sadece evet ya da hayır kabul eder. Invalid attribute in XML declaration. XML bildiriminde geçersiz öznitelik. Premature end of document. Erken belge sonu. Invalid document. Geçersiz belge. Expected Beklenen , but got ' , alınan ' Unexpected ' Beklenmedik ' Expected character data. Beklenen karakter verisi. Recursive entity detected. Tekrarlanan birim saptandı. Start tag expected. Başlama etiketi beklenmekte. XML declaration not at start of document. XML bildirimi belgenin başlangıcında değil. NDATA in parameter entity declaration. Parametre birim bildirimindeki NDATA. %1 is an invalid processing instruction name. %1 geçersiz bir işleme talimatı adı. Invalid processing instruction name. Geçersiz işleme talimatı adı. Illegal namespace declaration. Geçersiz ad boşluğu bildirimi. Invalid XML name. Geçersiz XML adı. Opening and ending tag mismatch. Açma ve bitirme etiketi uyuşmuyor. Reference to unparsed entity '%1'. Ayrıştırılmamış '%1' birimine referans. Entity '%1' not declared. '%1' birimi bildirilmemiş. Reference to external entity '%1' in attribute value. Öznitelik değerindeki '%1' harici birimine referans. Invalid character reference. Geçersiz karakter referansı. Encountered incorrectly encoded content. Yanlış olarak kodlanmamış içerikle karşılaşıldı. The standalone pseudo attribute must appear after the encoding. Bağımsız sahte öznitelik kodlamadan sonra belirmelidir. %1 is an invalid PUBLIC identifier. %1 geçerisiz bir PUBLIC tanımlayıcı. QtXmlPatterns An %1-attribute with value %2 has already been declared. %2 değeriyle birlikte %1 özniteliği zaten bildirilmiş. An %1-attribute must have a valid %2 as value, which %3 isn't. %1 özniteliği değer olarak %3 olmayan geçerli bir %2 sahip olmalıdır. Network timeout. Ağ zaman aşımı. Element %1 can't be serialized because it appears outside the document element. Öğe %1 serileştirilemiyor çünkü belge öğesinin dışında görünüyor. Attribute %1 can't be serialized because it appears at the top level. Öznitelik %1 serileştirilemiyor çünkü en üst seviyede görünüyor. Year %1 is invalid because it begins with %2. Yıl %1 geçersiz çünkü %2 ile başlıyor. Day %1 is outside the range %2..%3. Gün %1, %2..%3 aralığı dışında. Month %1 is outside the range %2..%3. Ay %1, %2..%3 aralığı dışında. Overflow: Can't represent date %1. Dışa Taşma: %1 tarihini ifade edemiyor. Day %1 is invalid for month %2. Gün %1, %2 ayı için geçersiz. Time 24:%1:%2.%3 is invalid. Hour is 24, but minutes, seconds, and milliseconds are not all 0; 24'lük Zaman:%1:%2.%3 geçersiz. Saat 24'lük ama dakika, saniye ve milisaniyenin tümü 0 değildir; Time %1:%2:%3.%4 is invalid. Zaman:%1:%2:%3.%4 geçersiz. Overflow: Date can't be represented. Dışa Taşma: Tarih ifade edilemez. At least one component must be present. En az bir bileşen olmak zorundadır. At least one time component must appear after the %1-delimiter. En az bir defa bileşen %1-sınırlayıcısından sonra görünmek zorundadır. No operand in an integer division, %1, can be %2. Bir tam sayı bölmede matematik işlemci yok, %1, %2 olabilir. The first operand in an integer division, %1, cannot be infinity (%2). Bir tam sayı bölmede ilk matematik işlemci, %1, sonsuz olamaz (%2). The second operand in a division, %1, cannot be zero (%2). Bir bölmede ikinci matematik işlemci, %1, sıfır olamaz (%2). %1 is not a valid value of type %2. %1, %2 türünün geçerli bir değeri değildir. When casting to %1 from %2, the source value cannot be %3. Integer division (%1) by zero (%2) is undefined. Division (%1) by zero (%2) is undefined. Modulus division (%1) by zero (%2) is undefined. Dividing a value of type %1 by %2 (not-a-number) is not allowed. Dividing a value of type %1 by %2 or %3 (plus or minus zero) is not allowed. Multiplication of a value of type %1 by %2 or %3 (plus or minus infinity) is not allowed. A value of type %1 cannot have an Effective Boolean Value. Effective Boolean Value cannot be calculated for a sequence containing two or more atomic values. Value %1 of type %2 exceeds maximum (%3). Value %1 of type %2 is below minimum (%3). A value of type %1 must contain an even number of digits. The value %2 does not. %1 is not valid as a value of type %2. Operator %1 cannot be used on type %2. Operator %1 cannot be used on atomic values of type %2 and %3. The namespace URI in the name for a computed attribute cannot be %1. The name for a computed attribute cannot have the namespace URI %1 with the local name %2. Type error in cast, expected %1, received %2. When casting to %1 or types derived from it, the source value must be of the same type, or it must be a string literal. Type %2 is not allowed. No casting is possible with %1 as the target type. It is not possible to cast from %1 to %2. Casting to %1 is not possible because it is an abstract type, and can therefore never be instantiated. It's not possible to cast the value %1 of type %2 to %3 Failure when casting from %1 to %2: %3 A comment cannot contain %1 Yorum %1 içeremez A comment cannot end with a %1. Yorum %1 ile bitemez. No comparisons can be done involving the type %1. Operator %1 is not available between atomic values of type %2 and %3. An attribute node cannot be a child of a document node. Therefore, the attribute %1 is out of place. A library module cannot be evaluated directly. It must be imported from a main module. A value of type %1 cannot be a predicate. A predicate must have either a numeric type or an Effective Boolean Value type. A positional predicate must evaluate to a single numeric value. The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, is %2 invalid. %1 is not a valid target name in a processing instruction. It must be a %2 value, e.g. %3. The last step in a path must contain either nodes or atomic values. It cannot be a mixture between the two. The data of a processing instruction cannot contain the string %1 No namespace binding exists for the prefix %1 No namespace binding exists for the prefix %1 in %2 %1 is an invalid %2 %1 bir geçersiz %2 %1 takes at most %n argument(s). %2 is therefore invalid. %1 requires at least %n argument(s). %2 is therefore invalid. The first argument to %1 cannot be of type %2. It must be a numeric type, xs:yearMonthDuration or xs:dayTimeDuration. The first argument to %1 cannot be of type %2. It must be of type %3, %4, or %5. The second argument to %1 cannot be of type %2. It must be of type %3, %4, or %5. %1 is not a valid XML 1.0 character. The first argument to %1 cannot be of type %2. If both values have zone offsets, they must have the same zone offset. %1 and %2 are not the same. %1 was called. %1 iptal edildi. %1 must be followed by %2 or %3, not at the end of the replacement string. In the replacement string, %1 must be followed by at least one digit when not escaped. In the replacement string, %1 can only be used to escape itself or %2, not %3 %1 matches newline characters %1 satır başı karakterleriyle eşleşiyor %1 and %2 match the start and end of a line. Matches are case insensitive Eşleşenler büyük küçük harfe duyarlı Whitespace characters are removed, except when they appear in character classes Boşluk karakterleri kaldırıldı, karakter sınıflarında göründüklerinde hariç %1 is an invalid regular expression pattern: %2 %1 is an invalid flag for regular expressions. Valid flags are: If the first argument is the empty sequence or a zero-length string (no namespace), a prefix cannot be specified. Prefix %1 was specified. It will not be possible to retrieve %1. The root node of the second argument to function %1 must be a document node. %2 is not a document node. The default collection is undefined %1 cannot be retrieved %1 geri alınamaz The normalization form %1 is unsupported. The supported forms are %2, %3, %4, and %5, and none, i.e. the empty string (no normalization). A zone offset must be in the range %1..%2 inclusive. %3 is out of range. %1 is not a whole number of minutes. Required cardinality is %1; got cardinality %2. The item %1 did not match the required type %2. %1 is an unknown schema type. Only one %1 declaration can occur in the query prolog. The initialization of variable %1 depends on itself No variable by name %1 exists The variable %1 is unused %1 değişkeni kullanılmıyor Version %1 is not supported. The supported XQuery version is 1.0. Sürüm %1 desteklenmiyor. Desteklenen XQuery sürümü 1.0. The encoding %1 is invalid. It must contain Latin characters only, must not contain whitespace, and must match the regular expression %2. No function with signature %1 is available A default namespace declaration must occur before function, variable, and option declarations. Namespace declarations must occur before function, variable, and option declarations. Module imports must occur before function, variable, and option declarations. It is not possible to redeclare prefix %1. Only the prefix %1 can be declared to bind the namespace %2. By default, it is already bound to the prefix %1. Prefix %1 is already declared in the prolog. The name of an option must have a prefix. There is no default namespace for options. The Schema Import feature is not supported, and therefore %1 declarations cannot occur. The target namespace of a %1 cannot be empty. The module import feature is not supported A variable by name %1 has already been declared in the prolog. No value is available for the external variable by name %1. The namespace for a user defined function cannot be empty (try the predefined prefix %1 which exists for cases like this) The namespace %1 is reserved; therefore user defined functions may not use it. Try the predefined prefix %2, which exists for these cases. The namespace of a user defined function in a library module must be equivalent to the module namespace. In other words, it should be %1 instead of %2 A function already exists with the signature %1. No external functions are supported. All supported functions can be used directly, without first declaring them as external An argument by name %1 has already been declared. Every argument name must be unique. The name of a variable bound in a for-expression must be different from the positional variable. Hence, the two variables named %1 collide. The Schema Validation Feature is not supported. Hence, %1-expressions may not be used. None of the pragma expressions are supported. Therefore, a fallback expression must be present The %1-axis is unsupported in XQuery %1 is not a valid numeric literal. No function by name %1 is available. The namespace URI cannot be the empty string when binding to a prefix, %1. %1 is an invalid namespace URI. It is not possible to bind to the prefix %1 Namespace %1 can only be bound to %2 (and it is, in either case, pre-declared). Prefix %1 can only be bound to %2 (and it is, in either case, pre-declared). Two namespace declaration attributes have the same name: %1. The namespace URI must be a constant and cannot use enclosed expressions. An attribute by name %1 has already appeared on this element. A direct element constructor is not well-formed. %1 is ended with %2. The name %1 does not refer to any schema type. %1 is an complex type. Casting to complex types is not possible. However, casting to atomic types such as %2 works. %1 is not an atomic type. Casting is only possible to atomic types. %1 is not a valid name for a processing-instruction. Therefore this name test will never match. %1 is not in the in-scope attribute declarations. Note that the schema import feature is not supported. The name of an extension expression must be in a namespace. empty boş zero or one sıfır veya bir exactly one kesinlikle bir one or more bir veya daha fazlası zero or more sıfır veya daha fazlası Required type is %1, but %2 was found. Gereken tür %1 ama %2 bulundu. Promoting %1 to %2 may cause loss of precision. The focus is undefined. It's not possible to add attributes after any other kind of node. An attribute by name %1 has already been created. Only the Unicode Codepoint Collation is supported(%1). %2 is unsupported. VolumeSlider Muted Sessiz Volume: %1% Ses: %1% WebCore::PlatformScrollbar Scroll here Buraya kaydır Left edge Sol kenara Top En Üste Right edge Sağ kenera Bottom En Alta Page left Sayfa sola Page up Sayfa yukarı Page right Sayfa sağa Page down Sayfa aşağı Scroll left Sola kaydır Scroll up Yukarı kaydır Scroll right Sağa kaydır Scroll down Aşağı kaydır mumble-1.3.4/src/mumble/qttranslations/qt_nl.ts0000664000175000017500000056552214010707274021504 0ustar builderbuilder MAC_APPLICATION_MENU Services Services Hide %1 Verberg %1 Hide Others Overige verbergen Show All Alles weergeven Preferences... Voorkeuren... Quit %1 Stoppen %1 About %1 Over %1 AudioOutput <html>The audio playback device <b>%1</b> does not work.<br/>Falling back to <b>%2</b>.</html> <html>Het apparaat <b>%1</b> dat geluid zou moeten afspelen werkt niet.<br/>Teruggevallen wordt op <b>%2</b>.</html> <html>Switching to the audio playback device <b>%1</b><br/>which just became available and has higher preference.</html> <html>Switchen naar geluidafspeelapparaat <b>%1</b><br/> die net beschikbaar is gekomen en de voorkeur verdient.</html> Revert back to device '%1' Terugkeren naar apparaat '%1' Phonon:: Notifications Mededelingen Music Muziek Video Video Communication Communicatie Games Games Accessibility Toegankelijkheid Phonon::Gstreamer::Backend Warning: You do not seem to have the package gstreamer0.10-plugins-good installed. Some video features have been disabled. RL - gstreamer0.10 plugins-good zijn aanvullende codecs voor gstreamer Waarschuwing: Het pakket "gstreamer0.10 plugins-good" is niet geïnstalleerd. Sommige videomogelijkheden zijn gedeactiveerd. Warning: You do not seem to have the base GStreamer plugins installed. All audio and video support has been disabled RL - basis GStreamer plugins leveren de basis codecs om mediabestanden te kunnen afspelen Waarschuwing: De basis GStreamer plugins blijken niet geïnstalleerd. Alle audio en video ondersteuning is gedeactiveerd Phonon::Gstreamer::MediaObject Cannot start playback. Check your Gstreamer installation and make sure you have libgstreamer-plugins-base installed. Kan het afspelen niet starten. Controleer de installatie van Gstreamer en zorg ervoor dat libgstreamer-plugins-base is geïnstalleerd. A required codec is missing. You need to install the following codec(s) to play this content: %0 RL - kan nog niet goed vertaald worden omdat %n als single/plural place marker niet in source is opgenomen. Ticket #10400 aangemaakt bij virtualbox, afwachten tot bug hersteld is. RL - Ticket gesloten - is string van derde (Phonon) in Qt source, geen VirtualBox issue. Een noodzakelijke codec ontbreekt. U moet de volgende codec installeren om dit bestand af te kunnen spelen: %0 Noodzakelijke codecs ontbreken. U moet de volgende codecs installeren om dit bestand af te kunnen spelen: %0 Could not open media source. Kan de mediabron niet openen. Invalid source type. Bron type ongeldig. Could not locate media source. Kan mediabron niet vinden. Could not open audio device. The device is already in use. Kan het audio-apparaat niet openen. Het apparaat wordt al gebruikt. Could not decode media source. Kan de mediabron niet decoderen. Phonon::VolumeSlider Volume: %1% Volume: %1% Use this slider to adjust the volume. The leftmost position is 0%, the rightmost is %1% Gebruik deze schuif om het geluid aan te passen. De meest linkse positie is 0%, de meest rechtse positie is %1% Q3Accel %1, %2 not defined %1, %2 niet gedefinieerd Ambiguous %1 not handled Dubbelzinnig %1 niet uitgevoerd Q3DataTable True Waar False Onwaar Insert Invoegen Update Bijwerken Delete Verwijderen Q3FileDialog Copy or Move a File Bestand kopiëren of verplaatsen Read: %1 Lees: %1 Write: %1 Schrijven: %1 Cancel Annuleren All Files (*) Alle bestanden (*) Name Naam Size Formaat Type Soort Date Datum Attributes Attribuut &OK &OK Look &in: &Kijk bij: File &name: Bestands&naam: File &type: &Bestandstype: Back Terug One directory up Een map omhoog Create New Folder Maak een nieuwe map aan List View Lijst weergave Detail View Detail weergave Preview File Info Voorbeeldweergave bestandsinformatie Preview File Contents Voorbeeldweergave bestandsinhoud Read-write Lezen/schrijven Read-only Alleen-lezen Write-only Alleen-schrijven Inaccessible Niet toegankelijk Symlink to File Snelkoppeling naar bestand Symlink to Directory Snelkoppeling naar map Symlink to Special RL - naar de map 'Speciaal', als die map van naam verandert, deze string ook aanpassen Snelkoppeling naar Speciaal File Bestand Dir Map Special Speciaal Open Open Save As Opslaan als &Open &Openen &Save Op&slaan &Rename &Hernoemen &Delete &Verwijderen R&eload &Opnieuw laden Sort by &Name Op &Naam sorteren Sort by &Size EG - size kan ook zijn omvang RL - verschil? Op grootte &sorteren Sort by &Date Op &datum sorteren &Unsorted &Ongesorteerd Sort Sorteren Show &hidden files Verbo&rgen bestanden tonen the file RL - kleine 'h' bij 'het' (deze string is %1 bij andere string) het bestand the directory RL - kleine 'd' bij 'de' (deze string is %1 bij andere string) de map the symlink RL - kleine 'd' bij 'de' (deze string is %1 bij andere string) de snelkoppeling Delete %1 %1 verwijderen <qt>Are you sure you wish to delete %1 "%2"?</qt> <qt>Weet u zeker dat u %1 "%2" wilt verwijderen?</qt> &Yes &Ja &No &Nee New Folder 1 Nieuwe map 1 New Folder Nieuwe map New Folder %1 Nieuwe map %1 Find Directory Zoek een map Directories Mappen Directory: Map: Error Fout %1 File not found. Check path and filename. %1 Bestand niet gevonden. Controleer pad en bestandsnaam. Q3LocalFs Could not read directory %1 Kon deze map niet lezen %1 Could not create directory %1 Kan de map niet aanmaken %1 Could not remove file or directory %1 Kan het bestand of de map niet verwijderen %1 Could not rename %1 to %2 Kan: %1 niet hernoemen naar %2 Could not open %1 Kan niet openen: %1 Could not write %1 Kan niet schrijven: %1 Q3MainWindow Line up Rangschikken Customize... Aanpassen... Q3NetworkProtocol Operation stopped by the user Actie gestopt door gebruiker Q3ProgressDialog Cancel Annuleren Q3TabDialog OK OK Apply Toepassen Help RL - eng 'Help' wordt bij Moz/KDe/GNOME/Ubuntu/Fedora/Windows/Mac standaard vertaald in Nederlands als 'Hulp' Hulp Defaults Standaards Cancel Annuleren Q3TextEdit &Undo &Ongedaan maken &Redo Op&nieuw Cu&t K&nippen &Copy &Kopiëren &Paste &Plakken Clear Wissen Select All Alles selecteren Q3TitleBar System Systeem Restore up Omhoog terugzetten Minimize Minimaliseren Restore down Omlaag terugzetten Maximize Maximaliseren Close Sluiten Contains commands to manipulate the window Bevat opdrachten om het venster te bewerken Puts a minimized back to normal Zet geminimaliseerd terug naar normaal Moves the window out of the way Verplaatst het venster uit de weg Puts a maximized window back to normal Zet gemaximaliseerd terug naar normaal Makes the window full screen Maak het venster beeldvullend Closes the window Sluit het venster Displays the name of the window and contains controls to manipulate it Geeft de naam van venster weer en bevat knoppen om deze te bewerken Q3ToolBar More... Meer... Q3UrlOperator The protocol `%1' is not supported Het protocol `%1' wordt niet ondersteund The protocol `%1' does not support listing directories Het protocol `%1' ondersteunt geen opsomming van mappen The protocol `%1' does not support creating new directories Het protocol `%1' ondersteunt niet het aanmaken van nieuwe mappen The protocol `%1' does not support removing files or directories Het protocol `%1' ondersteunt niet het verwijderen van bestanden of mappen The protocol `%1' does not support renaming files or directories Het protocol `%1' ondersteunt niet het herbenoemen van bestanden of mappen The protocol `%1' does not support getting files Het protocol `%1' ondersteunt niet het ophalen van bestanden The protocol `%1' does not support putting files Het protocol `%1' ondersteunt niet het wegzetten van bestanden The protocol `%1' does not support copying or moving files or directories Het protocol `%1' ondersteunt niet het kopiëren van bestanden of mappen (unknown) (onbekend) Q3Wizard &Cancel &Annuleren < &Back < &Terug &Next > &Volgende > &Finish &Klaar &Help RL - eng 'Help' wordt bij Moz/KDe/GNOME/Ubuntu/Fedora/Windows/Mac standaard vertaald in Nederlands als 'Hulp' &Hulp QAbstractSocket Host not found Host niet gevonden Connection refused Verbinding geweigerd Socket operation timed out Tijdslimiet voor actie op socket verstreken Socket is not connected Socket is niet verbonden QAbstractSpinBox &Step up EG - nakijken RL - tja.... &Stap omhoog Step &down EG - Nakijken RL - tja.. &Stap omlaag &Select All Alles &selecteren QApplication Activate Activeren Executable '%1' requires Qt %2, found Qt %3. Programma '%1' vereist Qt %2; maar Qt %3 gevonden. Incompatible Qt Library Error Qt bibliotheek is niet compatibel QT_LAYOUT_DIRECTION Translate this string to the string 'LTR' in left-to-right languages or to 'RTL' in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout. LTR Activates the program's main window Activeert het hoofd venster van het programma QCheckBox Uncheck Uitgummen Check Afvinken Toggle Omschakelen QColorDialog Hu&e: &Tint: &Sat: &Verzadiging: &Val: &Helderheid: &Red: &Rood: &Green: &Groen: Bl&ue: Bla&uw: A&lpha channel: A&lpha kanaal: &Basic colors &Basiskleuren &Custom colors &Aangepaste kleuren &Add to Custom Colors &Toevoegen aan aangepaste kleuren Select color Selecteer een kleur QComboBox Open Openen False Onwaar True Waar Close Sluiten QCoreApplication %1: permission denied QSystemSemaphore %1: toestemming geweigerd %1: already exists QSystemSemaphore %1: bestaat al %1: doesn't exists QSystemSemaphore %1: bestaat niet %1: out of resources QSystemSemaphore %1: geen hulpbronnen meer %1: unknown error %2 QSystemSemaphore %1: onbekende fout %2 %1: key is empty QSystemSemaphore %1:Ongeldige sleutel (leeg) %1: unable to make key QSystemSemaphore %1: Kan geen sleutel aanmaken %1: ftok failed QSystemSemaphore %1: ftok vaalt QDB2Driver Unable to connect Kan geen verbinding maken Unable to commit transaction Kan de transactie niet toepassen Unable to rollback transaction Kan de transactie niet terugdraaien Unable to set autocommit RL - autocommit is techterm Kan automatisch toepassen (autocommit) niet instellen QDB2Result Unable to execute statement Kan de instructie niet uitvoeren Unable to prepare statement Kan de instructie niet voorbereiden Unable to bind variable Kan geen variabele binden Unable to fetch record %1 Kan record %1 niet ophalen Unable to fetch next Kan de volgende niet ophalen Unable to fetch first Kan de eerste niet ophalen QDateTimeEdit AM VM am vm PM NM pm nm QDial QDial QDial SpeedoMeter SpeedoMeter SliderHandle Schuifhandel QDialog What's This? Wat is dit? Done Klaar QDialogButtonBox OK OK Save Opslaan Open Openen Cancel Annuleren &Cancel Ann&uleren Close Sluiten Apply Toepassen Reset Terugzetten Help RL - eng 'Help' wordt bij Moz/KDe/GNOME/Ubuntu/Fedora/Windows/Mac standaard vertaald in Nederlands als 'Hulp' Hulp Don't Save Niet opslaan Discard Verwerpen &Yes &Ja Yes to &All Ja op &alles &No &Nee N&o to All Nee op &alles Save All Alles opslaan Abort Afbreken Retry Nogmaals Ignore Negeren Restore Defaults Standaards terugplaatsen Close without Saving Sluiten zonder op te slaan &OK &OK QDirModel Name Naam Size Grootte Kind Match OS X Finder Aard Type All other platforms Type Date Modified Datum gewijzigd QDockWidget Close Sluiten Dock Koppelen Float Drijven QDoubleSpinBox More Meer Less Minder QErrorMessage Debug Message: RL - debug als bekende term laten staan Debug bericht: Warning: Waarschuwing: Fatal Error: Fatale fout: &Show this message again &Geef dit bericht opnieuw weer &OK &OK QFileDialog All Files (*) Alle bestanden (*) Directories Mappen &Open &Openen &Save &Opslaan Open Openen %1 already exists. Do you want to replace it? %1 Bestaat al. Wilt u deze vervangen? %1 File not found. Please verify the correct file name was given. %1 Bestand niet gevonden. Controleer of de juiste bestandnaam is opgegeven. My Computer Mijn computer &Rename &Hernoemen &Delete &Verwijderen Show &hidden files &Geef verborgen bestanden weer Back Terug Parent Directory Bovenliggende map List View Lijst weergave Detail View Detail weergave Files of type: Bestanden van het type: Directory: Map: %1 Directory not found. Please verify the correct directory name was given. %1 Map niet gevonden. Controleer of de juiste naam van de map is opgegeven. '%1' is write protected. Do you want to delete it anyway? '%1' is beschermd tegen overschrijven. Wilt u het toch verwijderen? Are sure you want to delete '%1'? Weet u zeker dat u %1 wilt verwijderen? Could not delete directory. Kan de map niet verwijderen. Save As Opslaan als Drive Station File Bestand Unknown Onbekend Find Directory Zoek een map Show Toon Forward Vooruit New Folder Nieuwe map &New Folder &Nieuwe map &Choose &Kiezen Remove Verwijder File &name: Bestands&naam: Look in: Kijk bij: Create New Folder Maak een nieuwe map aan QFileSystemModel Invalid filename Ongeldige bestandsnaam <b>The name "%1" can not be used.</b><p>Try using another name, with fewer characters or no punctuations marks. <b>De naam "%1" kan niet worden gebruikt.</b><p>Geef een andere naam op met minder tekens of zonder leestekens. Name Naam Size Grootte Kind Match OS X Finder Aard Type All other platforms Type Date Modified Datum gewijzigd My Computer Mijn computer Computer Computer %1 TB %1 TB %1 GB %1 GB %1 MB %1 MB %1 KB %1 KB %1 bytes %1 bytes QFontDatabase Normal Normaal Bold Vet Demi Bold half vet Black Zwart Demi Half Light Licht Italic Cursief Oblique Schuin Any Alle Latin Latijn Greek Grieks Cyrillic Cyrillisch Armenian Armeens Hebrew Hebreews Arabic Arabisch Syriac Syrisch Thaana Thaana Devanagari Devanagari Bengali Bengaals Gurmukhi Gurmukhi Gujarati Gujarati Oriya Oriya Tamil Tamil Telugu Telugu Kannada Kannada Malayalam Malayalam Sinhala Sinhala Thai Thais Lao Lao Tibetan Tibetaans Myanmar Myanmar Georgian Georgisch Khmer Khmer Simplified Chinese Eenvoudig Chinees Traditional Chinese Traditioneel Chinees Japanese Japans Korean Koreaans Vietnamese Vietnamees Symbol Symbool Ogham Ogham Runic Runen QFontDialog &Font &Lettertype Font st&yle &Soort lettertype &Size &Grootte Effects Effecten Stri&keout Door&halen &Underline &Onderstrepen Sample Voorbeeld Wr&iting System &Schrijfsysteem Select Font Selecteer lettertype QFtp Not connected Geen verbinding Host %1 not found Host %1 niet gevonden Connection refused to host %1 Verbinding met host %1 geweigerd Connected to host %1 Verbonden met host %1 Connection refused for data connection Verbinding geweigerd voor dataconnectie Unknown error Onbekende fout Connecting to host failed: %1 Verbinding met host mislukt: %1 Login failed: %1 Aanmelding mislukt: %1 Listing directory failed: %1 Weergeven van de mappen is mislukt: %1 Changing directory failed: %1 Veranderen van map is misluktl: %1 Downloading file failed: %1 Downloaden van bestand is mislukt: %1 Uploading file failed: %1 Uploaden van bestand is mislukt: %1 Removing file failed: %1 Verwijderen van bestand is mislukt: %1 Creating directory failed: %1 Aanmaken van map is mislukt: %1 Removing directory failed: %1 Verwijderen van map is mislukt: %1 Connection closed Verbinding afgesloten Host %1 found Host %1 gevonden Connection to %1 closed Verbinding met %1 afgesloten Host found RL - 'host' als host vertalen, voorkomt 'gast' en 'gastheer' verwarring in VirtualBox (gebruikerswens) Host gevonden Connected to host Verbonden met host QHostInfo Unknown error Onbekende fout QHostInfoAgent Host not found Host niet gevonden Unknown address type Onbekend adrestype Unknown error Onbekende fout QHttp Unknown error Onbekende fout Request aborted Verzoek afgebroken No server set to connect to Geen server aangewezen om mee te verbinden Wrong content length Lengte van de inhoud is verkeerd Server closed connection unexpectedly Server heeft de verbinding onverwacht verbroken Connection refused Verbinding geweigerd Host %1 not found Host %1 niet gevonden HTTP request failed HTTP verzoek is mislukt Invalid HTTP response header Ongeldige HTTP antwoord (header) Invalid HTTP chunked body Ongeldige HTTP afgebroken body Host %1 found Host %1 gevonden Connected to host %1 Verbonden met host %1 Connection to %1 closed Verbinding met %1 afgesloten Host found Host gevonden Connected to host Verbonden met host Connection closed Verbinding afgesloten Proxy authentication required Proxy authentcatie vereist Authentication required Authenticatie vereist Connection refused (or timed out) Verbinding geweigerd (tijdslimiet verstreken) Proxy requires authentication De proxy vereist authenticatie Host requires authentication Host vereist authenticatie Data corrupted Data gecorrumpeerd Unknown protocol specified Onbekend protocol gespecificeerd SSL handshake failed SSL handdruk is mislukt HTTPS connection requested but SSL support not compiled in HTTPS verbinding vereist maar SSL ondersteuning niet meegecompileerd QHttpSocketEngine Authentication required Authenticatie vereist QIBaseDriver Error opening database Kan de database niet openen Could not start transaction Kan de transactie niet starten Unable to commit transaction Kan de transactie niet toepassen Unable to rollback transaction Kan de transactie niet terugdraaien QIBaseResult Unable to create BLOB Kan geen BLOB aanmaken Unable to write BLOB Kan geen BLOB wegschrijven Unable to open BLOB Kan geen BLOB openen Unable to read BLOB Kan geen BLOB lezen Could not find array Kan geen array vinden Could not get array data Kan geen array gegevens ophalen Could not get query info Kan geen array informatie ophalen Could not start transaction Kan de transactie niet starten Unable to commit transaction Kan de transactie niet toepassen Could not allocate statement Kan de instructie niet toewijzen Could not prepare statement Kan de instructie niet voorbereiden Could not describe input statement Kan de invoerinstructie niet beschrijven Could not describe statement Kan de instructie niet beschrijven Unable to close statement Kan de instructie niet afsluiten Unable to execute query Kan de zoekvraag niet uitvoeren Could not fetch next item Kan het volgende item niet ophalen Could not get statement info Kan geen informatie over de instructie krijgen QIODevice Permission denied Toestemming geweigerd Too many open files Te veel bestanden open No such file or directory Bestand of map bestaat niet No space left on device Geen ruimte meer op het apparaat Unknown error Onbekende fout QInputContext XIM XIM XIM input method XIM invoermethode Windows input method Windows invoermethode Mac OS X input method Mac OS X invoermethode QLibrary QLibrary::load_sys: Cannot load %1 (%2) QLibrary::load_sys: %1 kan niet worden geladen (%2) QLibrary::unload_sys: Cannot unload %1 (%2) QLibrary::unload_sys: %1 kan niet worden ontladen (%2) QLibrary::resolve_sys: Symbol "%1" undefined in %2 (%3) QLibrary::resolve_sys: Het symbool "%1" is niet in %2 gedefinieerd (%3) Could not mmap '%1': %2 EG - wat is mmap RL - mmap is (op unix en -----x familie) een system call dat bestanden of apparaten mapt naar het geheugen (map/unmap), dus gewoon vertalen als 'mmappen' Kan '%1': %2 niet mmappen Plugin verification data mismatch in '%1' Plugin controle-gegevens komen niet overeen in '%1 Could not unmap '%1': %2 EG - wat is unmap...RL - mmap is (op unix en -----x familie) een system call dat bestanden of apparaten mapt naar het geheugen (map/unmap), dus gewoon vertalen als 'unmappen' kan '%1': %2 niet unmappen The plugin '%1' uses incompatible Qt library. (%2.%3.%4) [%5] Plugin '%1' gebruikt een Qt bibliotheek, (%2.%3.%4) [%5], die niet compatibel is The plugin '%1' uses incompatible Qt library. Expected build key "%2", got "%3" RL - build key onvertaald laten Plugin '%1' gebruikt een Qt bibliotheek die niet compatibel is. Verwacht build key "%2" maar kreeg "%3" Unknown error Onbekende fout The shared library was not found. De dynamische bibliotheek is niet gevonden. The file '%1' is not a valid Qt plugin. Bestand '%1' is geen geldige Qt plugin. The plugin '%1' uses incompatible Qt library. (Cannot mix debug and release libraries.) Plugin '%1' gebruikt een Qt bibliotheek die niet compatibel is. (een test en productie bibliotheek kunnen niet door elkaar gebruikt worden.) QLineEdit &Undo &Ongedaan maken &Redo Op&nieuw Cu&t K&nippen &Copy &Kopiëren &Paste &Plakken Delete Verwijderen Select All Alles selecteren QLocalServer %1: Name error %1: Fout in de naam %1: Permission denied %1: Toestemming geweigerd %1: Address in use %1: Adres in gebruik %1: Unknown error %2 %1: Onbekende fout %2 QLocalSocket %1: Connection refused %1: Verbinding geweigerd %1: Remote closed %1: De verbinding vanuit andere kant afgesloten %1: Invalid name %1: Ongeldige naam %1: Socket access error %1:fout in de toegang naar de socket %1: Socket resource error %1:fout in de toegang naar de bron van de socket %1: Socket operation timed out %1: Tijdslimiet verstreken voor de socket actie %1: Datagram too large %1: Het datagram is te groot %1: Connection error %1: Verbindingsfout %1: The socket operation is not supported %1: Deze socket actie wordt niet ondersteund %1: Unknown error %2 %1: Onbekende fout %2 QMYSQLDriver Unable to open database ' Kan de database niet openen ' Unable to connect Kan geen verbinding maken Unable to begin transaction Kan niet beginnen met de transactie Unable to commit transaction Kan de transactie niet toepassen Unable to rollback transaction Kan de transactie niet terugdraaien QMYSQLResult Unable to fetch data Kan de gegevens niet ophalen Unable to execute query Kan de zoekvraag niet uitvoeren Unable to store result Kan het resultaat niet opslaan Unable to prepare statement Kan de opdracht niet voorbereiden Unable to reset statement Kan de opdracht niet terugzetten Unable to bind value Kan geen waarde binden Unable to execute statement Kan de opdracht niet uitvoeren Unable to bind outvalues RL - was vertaald 'overwaarde', maar betekent 'een hogere waarde hebbende dan' Wordt door bv Microsoft in Nederlands nooit vertaald Kan geen outvalues binden Unable to store statement results Kan het resultaat van de opdracht niet opslaan Unable to execute next query Kan de volgende zoekvraag niet uitvoeren Unable to store next result Kan het volgende resultaat niet opslaan QMdiArea (Untitled) RL - opmaak, niet vertalen Zie virtualbox.org wikki translating (Untitled) QMdiSubWindow %1 - [%2] %1 - [%2] Close Sluiten Minimize Minimaliseren Restore Down Omlaag terugzetten &Restore &Terugzetten &Move &Verplaatsen &Size &Omvang Mi&nimize Mi&nimaliseren Ma&ximize Ma&ximaliseren Stay on &Top Op &Voorgrond blijven &Close Sl&uiten - [%1] - [%1] Maximize Maximaliseren Unshade Arcering opheffen Shade Arceren Restore Terugzetten Help RL - eng 'Help' wordt bij Moz/KDe/GNOME/Ubuntu/Fedora/Windows/Mac standaard vertaald in Nederlands als 'Hulp' Hulp Menu Menu QMenu Close Sluiten Open Openen Execute Uitvoeren QMessageBox Help RL - eng 'Help' wordt bij Moz/KDe/GNOME/Ubuntu/Fedora/Windows/Mac standaard vertaald in Nederlands als 'Hulp' Hulp OK OK About Qt Info over Qt <p>This program uses Qt version %1.</p> <p>Dit programma gebruikt Qt versie %1.</p> Show Details... Details weergeven... Hide Details... Details verbergen... <p>This program uses Qt Open Source Edition version %1.</p><p>Qt Open Source Edition is intended for the development of Open Source applications. You need a commercial Qt license for development of proprietary (closed source) applications.</p><p>Please see <a href="http://www.trolltech.com/company/model/">www.trolltech.com/company/model/</a> for an overview of Qt licensing.</p> <p>Dit programma gebruikt Qt Open Source editie versie %1.</p><p>Qt Open Source editie is bedoeld voor het ontwikkelen van Open Source applicaties. U hebt een commerciële Qt license nodig voor het ontwikkelen van proprietary (closed source) applicaties.</p><p>Kijk bij <a href="http://www.trolltech.com/company/model/">www.trolltech.com/company/model/</a> voor een overzicht van Qt licenties.</p> <h3>About Qt</h3>%1<p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.</p><p>Qt is a Nokia product. See <a href="http://www.trolltech.com/qt/">www.trolltech.com/qt/</a> for more information.</p> <h3>Info over Qt</h3>%1<p>Qt is een C++ gereedschapskist voor applicatie-ontwikkeling over platformen heen.</p><p>Qt levert één enkele bron overdraagbaarheid met MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux en alle belangrijke commerciële Unix varianten. Qt is ook beschikbaar voor ingebouwde apparaten zoals Qt Embedded Linux en Qt voor Windows CE.</p><p>Qt is een Nokia product. Kijk bij <a href="http://www.trolltech.com/qt/">www.trolltech.com/qt/</a> voor meer informatie.</p> QMultiInputContext Select IM EG - wat is IM RL - Ik weet het ook niet zeker, maar het zou zomaar kunnen dat hier -gezien de context- 'Input Method' wordt afgekort Selecteer IM QMultiInputContextPlugin Multiple input method switcher Schakelaar tussen invoermethodes Multiple input method switcher that uses the context menu of the text widgets Schakelaar tussen invoermethodes die gebruik maakt van het context menu of de tekst-widgets QNativeSocketEngine The remote host closed the connection Host op afstand heeft de verbinding verbroken Network operation timed out Tijdslimiet van de netwerk operatie is verlopen Out of resources Geen hulpbronnen meer Unsupported socket operation Niet ondersteunde socket operatie Protocol type not supported Soort protocol niet ondersteund Invalid socket descriptor EG - Wat is een descriptor RL - Heel kort door de bocht: een beschrijver (zoals sockfd) hoe de socket moet worden benaderd. Techterm, onvertaald laten Ongeldige socket descriptor Network unreachable Netwerk onbereikbaar Permission denied Toestemming geweigerd Connection timed out Verbinding heeft de tijdslimiet overschreden Connection refused Verbinding geweigerd The bound address is already in use Het opgegeven adres is al in gebruik The address is not available Het adres is niet beschikbaar The address is protected Het adres is beschermd Unable to send a message Kan het bericht niet verzenden Unable to receive a message Kan het bericht niet ontvangen Unable to write Kan niet wegschrijven Network error Netwerk fout Another socket is already listening on the same port Eenn andere socket luistert al op dezelfde poort Unable to initialize non-blocking socket RL - non blocking socket: techterm, niet vertalen Kan non-blocking-socket niet initialiseren Unable to initialize broadcast socket RL - broadcast socket: techterm, niet vertalen Kan broadcast socket niet initialiseren Attempt to use IPv6 socket on a platform with no IPv6 support Poging IPv6 socket te gebruiken op een platform dat IPv6 niet ondersteund Host unreachable Host onbereikbaar Datagram was too large to send Datagram was te groot om te verzenden Operation on non-socket Operatie op een non-socket Unknown error Onbekende fout The proxy type is invalid for this operation Het proxytype is ongeldig voor deze operatie QNetworkAccessFileBackend Request for opening non-local file %1 Verzoek om niet lokaal bestand %1 te openen Error opening %1: %2 Fout bij openen van %1: %2 Write error writing to %1: %2 Schrijffout bij het schrijven naar %1: %2 Cannot open %1: Path is a directory Kan %1 niet openen: Het pad is een map Read error reading from %1: %2 Leesfout bij het lezen van %1: %2 QNetworkAccessFtpBackend Cannot open %1: is a directory Kan %1 niet openen: is een map Logging in to %1 failed: authentication required Logboek bij houden in %1 is mislukt: authenticatie is vereist Error while downloading %1: %2 Fout tijdens het downloaden %1: %2 Error while uploading %1: %2 Fout tijdens het uploaden %1: %2 QNetworkReply Error downloading %1 - server replied: %2 Fout tijdens het downloaden %1 - server antwoordde: %2 Protocol "%1" is unknown Protocol "%1" is onbekend QNetworkReplyImpl Operation canceled Operatie geanulleerd QOCIDriver Unable to logon Niet in staat in te loggen Unable to initialize QOCIDriver Kan niet initialiseren Unable to begin transaction Kan niet met transactie beginnen Unable to commit transaction Kan de transactie niet toepassen Unable to rollback transaction Kan de transactie niet terugdraaien QOCIResult Unable to bind column for batch execute Kan kolom niet binden voor een batch uitvoering Unable to execute batch statement Kan de batch instructie niet uitvoeren Unable to goto next Kan niet naar de volgende gaan Unable to alloc statement Kan de instructie niet toewijzen Unable to prepare statement Kan de instructie niet voorbereiden Unable to bind value Kan geen waarde binden Unable to execute select statement Kan de select-instructie niet uitvoeren Unable to execute statement Kan de instructie niet uitvoeren QODBCDriver Unable to connect Kan geen verbinding maken Unable to connect - Driver doesn't support all needed functionality Kan geen verbinding maken - Stuurprogramma ondersteunt niet alle benodigde functionaliteiten Unable to disable autocommit Kan automatisch toepassen (autocommit) niet deactiveren Unable to commit transaction Kan de transactie niet toepassen Unable to rollback transaction Kan de transactie niet terugdraaien Unable to enable autocommit Kan het automatisch toepassen (autocommit) niet activeren QODBCResult QODBCResult::reset: Unable to set 'SQL_CURSOR_STATIC' as statement attribute. Please check your ODBC driver configuration QODBCResult::terugzetten: kan 'SQL_CURSOR_STATIC' niet als instructie-attribuut meegeven. Controleer configuratie ODBC-stuurprogramma Unable to execute statement Kan de instructie niet uitvoeren Unable to fetch next Kan de volgende niet ophalen Unable to prepare statement Kan de instructie niet voorbereiden Unable to bind variable Kan de variabele niet binden Unable to fetch last Kan de laatste niet ophalen Unable to fetch Kan niet ophalen Unable to fetch first Kan de eerste niet ophalen Unable to fetch previous Kan de vorige niet ophalen QObject Operation not supported on %1 Operatie op %1 niet ondersteund Invalid URI: %1 Ongeldige URI: %1 Write error writing to %1: %2 Schrijffout bij het schrijven naar %1: %2 Read error reading from %1: %2 Leesfout bij het lezen van %1: %2 Socket error on %1: %2 Socket fout op %1: %2 Remote host closed the connection prematurely on %1 Host op afstand heeft de verbinding voortijdig verbroken op %1 Protocol error: packet of size 0 received Protocolfout:pakket met grootte van 0 ontvangen QPPDOptionsModel Name Naam Value Waarde QPSQLDriver Unable to connect Kan geen verbinding maken Could not begin transaction Kan de transactie niet starten Could not commit transaction Kan de transactie niet toepassen Could not rollback transaction Kan de transactie niet terugdraaien Unable to subscribe Inschrijven niet mogelijk Unable to unsubscribe Uitschrijven niet mogelijk QPSQLResult Unable to create query Kan geen zoekvraag aanmaken Unable to prepare statement Kan de instructie niet voorbereiden QPageSetupWidget Centimeters (cm) Centimeters (cm) Millimeters (mm) Millimeters (mm) Inches (in) Inches (in) Points (pt) Punten (pt) Form Formulier Paper Papier Page size: Papierformaat: Width: Breedte: Height: Hoogte: Paper source: Papierlade: Orientation Oriëntatie Portrait Staand Landscape Liggend Reverse landscape Liggend omgekeerd Reverse portrait Staand omgekeerd Margins Kantlijnen top margin bovenmarge left margin linkermarge right margin rechtermarge bottom margin ondermarge QPluginLoader Unknown error Onbekende fout The plugin was not loaded. De plugin was niet geladen. QPrintDialog locally connected Locaal verbonden Aliases: %1 Aliases: %1 unknown onbekend Print To File ... Afdrukken naar bestand ... File %1 is not writable. Please choose a different file name. Het bestand %1 kan niet worden beschreven. Kies een andere bestandsnaam. %1 already exists. Do you want to overwrite it? %1 bestaat al. Wilt u deze overschrijven? %1 is a directory. Please choose a different file name. %1 is een map. Kies een andere bestandsnaam. A0 A0 A1 A1 A2 A2 A3 A3 A4 A4 A5 A5 A6 A6 A7 A7 A8 A8 A9 A9 B0 B0 B1 B1 B2 B2 B3 B3 B4 B4 B5 B5 B6 B6 B7 B7 B8 B8 B9 B9 B10 B10 C5E C5E DLE DLE Executive Executive Folio Folio Ledger Ledger Legal Legal Letter Letter Tabloid Tabloid US Common #10 Envelope US Common #10 Envelope Custom Aangepast &Options >> &Opties >> &Print &Printen &Options << &Opties << Print to File (PDF) Afdrukken naar bestand (PDF) Print to File (Postscript) Afdrukken naar bestand (Postscript) Local file Locaal bestand Write %1 file Schrijf %1 bestand QPrintPreviewDialog Page Setup Pagina Instelling Print Preview Afdrukvoorbeeld Next page Volgende pagina Previous page Vorige pagina First page Eerste pagina Last page Laatste pagina Fit width Breedte passend Fit page Pagina passend Zoom in Inzoomen Zoom out Uitzoomen Portrait Staand Landscape Liggend Show single page Geeft een enkele pagina weer Show facing pages Geef tegenoverliggende pagina's weer Show overview of all pages Geef een overzicht met alle pagina's Print Afdrukken Page setup Pagina instelling Close Sluiten QPrintPropertiesWidget Form Formulier Page Pagina Advanced Geavanceerd QPrintSettingsOutput Form EG - Formulier of Vorm RL - Even gechecked, het moet 'Papierformaat' zijn, A4, Letter, Legal en zo... Papierformaat Copies Kopieën Print range Afdrukbereik Print all Alles printen Pages from Vanaf pagina to tot Selection Selectie Output Settings Uitvoerinstellingen Copies: Kopieën: Collate Sorteren Reverse Omgedraaid Options Opties Color Mode Kleur modus Color Kleur Grayscale Grijswaarden Duplex Printing Dubbelzijdig printen None Geen Long side Lange zijde Short side Korte zijde QPrintWidget Form Papierformaat Printer Printer &Name: &Naam: P&roperties &Eigenschappen Location: Locatie: Preview Voorbeeld Type: Type: Output &file: Uitvoer&bestand: ... ... QProgressDialog Cancel Annuleren QPushButton Open Openen QRadioButton Check Controleer QRegExp no error occurred Geen fout opgetreden disabled feature used Gedeactiveerde optie gebruikt bad char class syntax Verkeerd teken in zinsbouw klasse bad lookahead syntax Verkeerde zinsbouw voor vooruitkijken bad repetition syntax Verkeerde zinsbouw herhalingen invalid octal value Ongeldige octale waarde missing left delim Mist linker begrenzing unexpected end Onverwacht einde met internal limit Interne limiet bereikt QSQLite2Driver Error to open database Kan de database niet openen Unable to begin transaction Kan de transactie niet beginnen Unable to commit transaction Kan de transactie niet toepassen Unable to rollback Transaction Kan de transactie niet terugdraaien QSQLite2Result Unable to fetch results Kan het resultaat niet ophalen Unable to execute statement Kan de instructie niet uitvoeren QSQLiteDriver Error opening database Kan de database niet openen Error closing database Kan de database niet sluiten Unable to begin transaction Kan niet beginnen met de transactie Unable to commit transaction Kan de transactie niet toepassen Unable to rollback transaction Kan de transactie niet terugdraaien QSQLiteResult Unable to fetch row Kan de rij niet ophalen Unable to execute statement Kan de instructie niet uitvoeren Unable to reset statement Kan de opdracht niet terugzetten Unable to bind parameters Kan geen parameters binden Parameter count mismatch Het aantal parameters klopt niet No query Geen zoekopdracht QScrollBar Scroll here Hier scrollen Left edge Linker rand Top Bovenkant Right edge Rechter rand Bottom Onderkant Page left Een pagina naar links Page up Een pagina omhoog Page right Een pagina naar rechts Page down Een pagina naar beneden Scroll left Naar links scrollen Scroll up Naar boven scrollen Scroll right Naar rechts scrollen Scroll down Naar onder scrollen Line up Regel naar boven Position Positie Line down Regel naar beneden QSharedMemory %1: unable to set key on lock %1: kan geen sleutel op het slot zetten %1: create size is less then 0 %1: aanmaakgrote is kleiner dan 0 %1: unable to lock %1: kan niet vergrendelen %1: unable to unlock %1: kan niet ontgrendelen %1: permission denied %1: toestemming geweigerd %1: already exists %1: bestaat al %1: doesn't exists %1: bestaat niet %1: out of resources %1: geen hulpbronnen meer %1: unknown error %2 %1: onbekende fout %2 %1: key is empty %1: sleutel is leeg %1: unix key file doesn't exists %1: het unix sleutelbestand bestaat niet %1: ftok failed %1: ftok aanroep mislukt %1: unable to make key %1: kan geen sleutel aanmaken %1: system-imposed size restrictions %1: door systeem afgedwongen limiet op de omvang %1: not attached %1: niet gekoppeld QShortcut Space Spatie Esc Esc Tab Tab Backtab Tab terug Backspace Backspace Return Return Enter Enter Ins Ins Del Del Pause Pause Print Print SysReq SysReq Home Home End End Left Links Up Omhoog Right Rechts Down Naar beneden PgUp PgUp PgDown PgDown CapsLock CapsLock NumLock NumLock ScrollLock ScrollLock Menu Menu Help RL - eng 'Help' wordt bij Moz/KDe/GNOME/Ubuntu/Fedora/Windows/Mac standaard vertaald in Nederlands als 'Hulp' Hulp Back Terug Forward Vooruit Stop Stoppen Refresh Verversen Volume Down Volume <- Volume Mute Volume uit Volume Up Volume -> Bass Boost Bass boost Bass Up Bass -> Bass Down Bass <- Treble Up toon hoogte -> Treble Down toon hoogte <- Media Play Afspelen Media Stop Stoppen Media Previous Vorige Media Next Volgende Media Record Opnemen Favorites Favorieten Search Zoeken Standby Stand-by Open URL Open URL Launch Mail Start mail Launch Media Start media speler Launch (0) Start (0) Launch (1) Start (1) Launch (2) Start (2) Launch (3) Start (3) Launch (4) Start (4) Launch (5) Start (5) Launch (6) Start (6) Launch (7) Start (7) Launch (8) Start (8) Launch (9) Start (9) Launch (A) Start (A) Launch (B) Start (B) Launch (C) Start (C) Launch (D) Start (D) Launch (E) Start (E) Launch (F) Start (F) Print Screen Druk het scherm af Page Up Page Up Page Down Page Down Caps Lock Caps Lock Num Lock Num Lock Number Lock Number Lock Scroll Lock Scroll Lock Insert Insert Delete Delete Escape Escape System Request System Request Select Selecteren Yes Ja No Nee Context1 Context1 Context2 Context2 Context3 Context3 Context4 Kontext4 Call Bellen Hangup Ophangen Flip Omdraaien Ctrl Ctrl Shift Shift Alt Alt Meta Meta + + F%1 F%1 Home Page Startpagina QSlider Page left Een pagina naar links Page up Een pagina omhoog Position Positie Page right Een pagina naar rechts Page down Een pagina naar beneden QSocks5SocketEngine Socks5 timeout error connecting to socks server Socks5 tijdslimiet verlopen tijdens verbinding zoeken met de socks server Network operation timed out Tijdslimiet verlopen bij netwerk operatie QSpinBox More Meer Less Minder QSql Delete Verwijderen Delete this record? Dit record verwijderen? Yes Ja No Nee Insert Invoegen Update Bijwerken Save edits? Wijzigingen opslaan? Cancel Annuleren Confirm Bevestigen Cancel your edits? Wijzigingen annuleren? QSslSocket Unable to write data: %1 Kan de gegevens niet wegschrijven: %1 Error while reading: %1 Fout bij het lezen van: %1 Error during SSL handshake: %1 Fout tijdens de SSL uitwisseling: %1 Error creating SSL context (%1) Fout bij het aanmaken van de SSL context (%1) Invalid or empty cipher list (%1) Ongeldige of lege sleutellijst (%1) Error creating SSL session, %1 Fout bij het aanmaken van de SSL sessie, %1 Error creating SSL session: %1 Fout bij het aanmaken van de SSL sessie: %1 Cannot provide a certificate with no key, %1 Kan geen certificaat leveren zonder sleutel, %1 Error loading local certificate, %1 Fout bij het laden van lokaal certificaat, %1 Error loading private key, %1 Fout bij het laden van de prive sleutel, %1 Private key does not certificate public key, %1 Prive sleutel certificeert geen publieke sleutel, %1 QTDSDriver Unable to open connection Kan verbinding niet openen Unable to use database Kan de database niet gebruiken QTabBar Scroll Left Naar links scrollen Scroll Right Naar rechts scrollen QTextControl &Undo &Ongedaan maken &Redo Op&nieuw Cu&t &Knippen &Copy &Kopiëren Copy &Link Location Kopiëer &link en locatie &Paste &Plakken Delete Verwijderen Select All Selecteer Alles QToolButton Press Druk op Open Openen QUdpSocket This platform does not support IPv6 Dit platform ondersteunt geen IPv6 QUndoGroup Undo Ongedaan maken Redo Opnieuw doen QUndoModel <empty> <leeg> QUndoStack Undo Ongedaan maken Redo Opnieuw doen QUnicodeControlCharacterMenu LRM Left-to-right mark LRM Links-naar-rechts markering RLM Right-to-left mark RLM Rechts-naar-links markering ZWJ Zero width joiner EG nog vertalen RL - Techterm ZWJ Zero width joiner ZWNJ Zero width non-joiner EG nog vertalen RL - Techterm ZWNJ Zero width non-joiner ZWSP Zero width space EG nog vertalen RL - Techterm ZWSP Zero width space LRE Start of left-to-right embedding LRE Start van links-naar-rechts embedding RLE Start of right-to-left embedding RLE Start van rechts-naar-links embedding LRO Start of left-to-right override LRO Start van links-naar-rechts tenietdoen RLO Start of right-to-left override RLO Start van rechts-naar-links tenietdoen PDF Pop directional formatting EG nog vertalen RL - Techterm PDF Pop directional formatting Insert Unicode control character Voeg een Unicode controle teken toe QWebFrame Request cancelled Verzoek geannuleerd Request blocked Verzoek geblokkeerd Cannot show URL Kan URL niet tonen Frame load interruped by policy change Laden van het frame onderbroken door een policywijziging Cannot show mimetype Kan het mime-type niet weergeven File does not exist Bestand bestaat niet QWebPage Bad HTTP request Ongeldig HTTP verzoek Submit default label for Submit buttons in forms on web pages Indienen Submit Submit (input element) alt text for <input> elements with no alt, title, or value Indienen Reset default label for Reset buttons in forms on web pages Terugzetten This is a searchable index. Enter search keywords: text that appears at the start of nearly-obsolete web pages in the form of a 'searchable index' Deze index is te doorzoeken. Geef trefwoorden op: Choose File title for file button used in HTML forms Kies bestand No file selected text to display in file button used in HTML forms when no file is selected Geen bestand geselecteerd Open in New Window Open in New Window context menu item Openen in een nieuw venster Save Link... Download Linked File context menu item Link opslaan... Copy Link Copy Link context menu item Kopiëer link Open Image Open Image in New Window context menu item RL - Liever 'afbeelding' dan 'plaatje' Afbeelding openen Save Image Download Image context menu item Afbeelding opslaan Copy Image Copy Link context menu item Kopiëer afbeelding Open Frame Open Frame in New Window context menu item Frame openen Copy Copy context menu item Kopiëren Go Back Back context menu item Ga terug Go Forward Forward context menu item Ga vooruit Stop Stop context menu item Stop Reload Reload context menu item Opnieuw laden Cut Cut context menu item Knippen Paste Paste context menu item Plakken No Guesses Found No Guesses Found context menu item Geen schatting gevonden Ignore Ignore Spelling context menu item Negeren Add To Dictionary Learn Spelling context menu item Aan woordenboek toevoegen Search The Web Search The Web context menu item Doorzoek het Web Look Up In Dictionary Look Up in Dictionary context menu item In woordenboek opzoeken Open Link Open Link context menu item Link openen Ignore Ignore Grammar context menu item Negeren Spelling Spelling and Grammar context sub-menu item Spelling Show Spelling and Grammar menu item title Geef spelling en gramatica weer Hide Spelling and Grammar menu item title Verberg spelling en gramatica Check Spelling Check spelling context menu item Controleer spelling Check Spelling While Typing Check spelling while typing context menu item Controleer spelling tijdens het typen Check Grammar With Spelling Check grammar with spelling context menu item Controleer gramatica met de spelling Fonts Font context sub-menu item Lettertypen Bold Bold context menu item Vet Italic Italic context menu item Cursief Underline Underline context menu item Onderstrepen Outline Outline context menu item Outline Direction Writing direction context sub-menu item Richting Default Default writing direction context menu item Standaard LTR Left to Right context menu item Van links naar rechts RTL Right to Left context menu item Van rechts naar links Inspect Inspect Element context menu item Inspecteren No recent searches Label for only item in menu that appears when clicking on the search field image, when no searches have been performed Geen recente zoekvragen Recent searches label for first item in the menu that appears when clicking on the search field image, used as embedded menu title Recente zoekvragen Clear recent searches menu item in Recent Searches menu that empties menu's contents Recente zoekvragen opruimen Unknown Unknown filesize FTP directory listing item Onbekend %1 (%2x%3 pixels) Title string for images %1 (%2x%3 pixels) Web Inspector - %2 Web Inspector - %2 QWhatsThisAction What's This? Wat is dit? QWidget * * QWizard Go Back Vorige Continue Doorgaan Commit Toepassen Done Klaar Quit Stoppen Help RL - eng 'Help' wordt bij Moz/KDe/GNOME/Ubuntu/Fedora/Windows/Mac standaard vertaald in Nederlands als 'Hulp' Hulp < &Back < &Terug &Finish &Klaar Cancel Annuleren &Help RL - eng 'Help' wordt bij Moz/KDe/GNOME/Ubuntu/Fedora/Windows/Mac standaard vertaald in Nederlands als 'Hulp' &Hulp &Next &Volgende &Next > &Volgende > QWorkspace &Restore &Terugzetten &Move &Verplaatsen &Size &Grootte Mi&nimize Mi&nimaliseren Ma&ximize Ma&ximaliseren &Close &Sluiten Stay on &Top Op &voorgrond blijven Sh&ade Sh&ade %1 - [%2] %1 - [%2] Minimize Minimaliseren Restore Down Eg - nog vertalen RL - Dit is de actie verbonden aan het raam-icoontje rechtsboven op titelbalk van venster (middelste van de drie), bij aanklikken gaat venster naar maximaal, nog eens aanklikken naar oude grootte. Wordt in Fedora vertaald als 'venster herstellen'. Venster herstellen Close Sluiten &Unshade &Unshade QXml no error occurred Geen fout opgetreden error triggered by consumer Fout door de consument veroorzaakt unexpected end of file Onverwacht einde van het bestand more than one document type definition Meer dan één document type definitie error occurred while parsing element RL - parsen is nl werkwoord, betekent analyseren van info, Techterm Fout bij het parsen van element tag mismatch Verkeerde combinatie met labels error occurred while parsing content Fout opgetreden bij parsen van inhoud unexpected character Onverwacht teken invalid name for processing instruction Ongeldige naam voor procesinstructie version expected while reading the XML declaration Versie verwacht bij het lezen een XML declaratie wrong value for standalone declaration Verkeerde waarde voor een standalone declaratie encoding declaration or standalone declaration expected while reading the XML declaration Bij het lezen van de XML declaratie wordt een coderende declaratie of op zichzelf staande declaratie verwacht standalone declaration expected while reading the XML declaration op zichzelf staande declaratie verwacht bij het lezen een XML declaratie error occurred while parsing document type definition fout opgetreden bij het parsen van document type definitie letter is expected RL - letter als papierformaat, zoals A4 bv letter wordt verwacht error occurred while parsing comment Fout opgetreden bij parsen van commentaar error occurred while parsing reference Fout bij parsen van referentie internal general entity reference not allowed in DTD in een DTD is geen interne algemene entity referentie toegestaan external parsed general entity reference not allowed in attribute value in een attribuut waarde is geen externe entiteit referentie toegestaan external parsed general entity reference not allowed in DTD in een DTD is geen externe algemene entity referentie toegestaan unparsed entity reference in wrong context Niet ontlede entiteit referentie in de verkeerde context recursive entities recursive entiteit error in the text declaration of an external entity Fout in de tekst declaratie van een externe entiteit QXmlStream Extra content at end of document. Extra inhoud aan het einde van het document. Invalid entity value. Ongeldige waarde entiteit. Invalid XML character. Ongeldig XML teken. Sequence ']]>' not allowed in content. De volgorde ']]>' is niet toegestaan in inhoud. Namespace prefix '%1' not declared gewoon prefix Naamruimte prefix '%1' is niet declareerd Attribute redefined. Attribuut opnieuw gedefinieerd. Unexpected character '%1' in public id literal. Teken '%1' wordt niet verwacht in een publieke identificator literaal. Invalid XML version string. Ongeldige XML versie opgave. Unsupported XML version. Deze XML versie wordt niet ondersteund. %1 is an invalid encoding name. %1 is een ongeldige coderingsnaam. Encoding %1 is unsupported Coderen van %1 wordt niet ondersteund Standalone accepts only yes or no. Standalone accepteert alleen ja of nee. Invalid attribute in XML declaration. Ongeldig attribuut in de XML declaratie. Premature end of document. Voortijdig einde van het document. Invalid document. Ongeldig document. Expected Verwacht , but got ' , maar kreeg ' Unexpected ' Onverwacht ' Expected character data. Verwacht teken als data. Recursive entity detected. Een recursive entiteit ontdekt. Start tag expected. Start tag verwacht. XML declaration not at start of document. De XML declaratie staat niet aan het begin van het document. NDATA in parameter entity declaration. NDATA in parameter entiteit declaratie. %1 is an invalid processing instruction name. %1 is ongeldige naam voor een proces instructie. Invalid processing instruction name. Ongeldige naam voor een proces instructie. Illegal namespace declaration. Ongeldige naamruimte declaratie. Invalid XML name. Ongeldige XML naam. Opening and ending tag mismatch. Openings- en sluittag komen niet overeen. Reference to unparsed entity '%1'. Referentie naar ongeparste entiteit '%1'. Entity '%1' not declared. Entieit '%1' is niet gedeclareerd. Reference to external entity '%1' in attribute value. Verwijzing naar externe entiteit '%1' in de attribuutwaarde. Invalid character reference. Ongeldige verwijzing naar een teken. Encountered incorrectly encoded content. Niet correct gecodeerde inhoud tegengekomen. The standalone pseudo attribute must appear after the encoding. Standalone pseudo attribuut moet komen na de codering. %1 is an invalid PUBLIC identifier. %1 is een ongeldige PUBLIEKE identificator. QtXmlPatterns An %1-attribute with value %2 has already been declared. Een %1 attribuut met de waarde %2 is al gedeclareerd. An %1-attribute must have a valid %2 as value, which %3 isn't. Een %1 attribuut moet een geldige %2 als waarde hebben en dat heeft %3 niet. Network timeout. Netwerk timeout. Element %1 can't be serialized because it appears outside the document element. EG - xml serialization = geserialiseerd Element %1 kan niet geserialiseerd worden omdat buiten het document element voorkomt. Year %1 is invalid because it begins with %2. Jaar %1 is ongeldig omdat het begint met %2. Day %1 is outside the range %2..%3. Dag %1 valt buiten de reeks %2..%3. Month %1 is outside the range %2..%3. De maand %1 valt buiten de reeks %2..%3. Overflow: Can't represent date %1. RL - Foutmelding dus Overflow onvertaald vermelden ivm foutopsporing op internet Kan datum %1 niet weergeven (Overflow). Day %1 is invalid for month %2. Dag %1 is ongeldig voor maand %2. Time 24:%1:%2.%3 is invalid. Hour is 24, but minutes, seconds, and milliseconds are not all 0; 24 uurs tijd:%1:%2.%3 zijn ongeldig. Het uur is 24 maar de minuten, seconden en milliseconden zijn niet allemaal 0; Time %1:%2:%3.%4 is invalid. Tijd %1:%2:%3.%4 is ongeldig. Overflow: Date can't be represented. RL - Foutmelding dus Overflow onvertaald vermelden ivm foutopsporing op internet Kan de datum niet weergeven (Overflow). At least one component must be present. Tenminste één component moet aanwezig zijn. At least one time component must appear after the %1-delimiter. Tenminste één tijdscomponent moet voorkomen na de %1 begrenzer. No operand in an integer division, %1, can be %2. Geen operand bij deling %1, van gehele getallen, kan een %2 zijn. The first operand in an integer division, %1, cannot be infinity (%2). De eerste operand in een deling met gehele getallen, %1, kan niet oneindig zijn (%2). The second operand in a division, %1, cannot be zero (%2). De tweede operand in een deling, %1 kan niet nul zijn (%2). %1 is not a valid value of type %2. %1 is een ongeldige waarde van het soort %2. When casting to %1 from %2, the source value cannot be %3. Bij het omzetten naar %1 vanuit %2 kan %3 geen bron zijn. Integer division (%1) by zero (%2) is undefined. De deling met gehele getallen (%1) door nul (%2) is niet gedefinieerd. Division (%1) by zero (%2) is undefined. Deling (%1) door nul (%2) is niet gedefinieerd. Modulus division (%1) by zero (%2) is undefined. De modulus deling (%1) door nul (%2) is niet gedefinieerd. Dividing a value of type %1 by %2 (not-a-number) is not allowed. Delen van een waarde van het soort %1 door %2 (geen getal) is niet toegestaan. Dividing a value of type %1 by %2 or %3 (plus or minus zero) is not allowed. Delen van een waarde van het soort %1 door %2 of %3 (plus of min nul) is niet toegestaan. Multiplication of a value of type %1 by %2 or %3 (plus or minus infinity) is not allowed. Vermenigvuldigen van een waarde van het soort %1 met %2 of %3 (plus of min oneindig) is niet toegestaan. A value of type %1 cannot have an Effective Boolean Value. RL - EBV: Waarde van George Boole, wiskundige. Wordt in Nederland wisselend niet vertaald (Boolean) en wel (Booleaans) Een waarde van het soort %1 kan geen Effectieve Booleaanse Waarde hebben. Effective Boolean Value cannot be calculated for a sequence containing two or more atomic values. RL - EBV: Waarde van George Boole, wiskundige. Wordt in Nederland wisselend niet vertaald (Boolean) en wel (Booleaans) RL - een attribuut is atomair indien het maar één enkele waarde kan bevatten Een Effectieve Booleaanse Waarde kan niet worden berekend voor een serie die twee of meer atomaire waarden bevat. Value %1 of type %2 exceeds maximum (%3). Waarde %1 van het soort %2 overschrijdt het maximum (%3). Value %1 of type %2 is below minimum (%3). Waarde %1 van het soort %2 overschrijdt het minimum (%3). A value of type %1 must contain an even number of digits. The value %2 does not. Een waarde van het type %1 moet een even aantal getallen bevatten. De waarde %2 heeft dat niet. %1 is not valid as a value of type %2. %1 is niet geldig als een waarde van het type %2. Operator %1 cannot be used on type %2. Operator %1 kan niet worden gebruikt bij type %2. Operator %1 cannot be used on atomic values of type %2 and %3. RL - een attribuut is atomair indien het maar één enkele waarde kan bevatten Operator %1 kan niet gebruikt worden op atomaire waarden van type %2 en %3. The namespace URI in the name for a computed attribute cannot be %1. De naamruimte URI in de naam voor berekend attribuut kan geen %1 zijn. The name for a computed attribute cannot have the namespace URI %1 with the local name %2. De naam voor een berekend attribuut kan niet de naamruimte URI %1 hebben met de lokale naam %2. Type error in cast, expected %1, received %2. Typefout bij omzetten, verwachtte %1 maar %2 ontvangen. When casting to %1 or types derived from it, the source value must be of the same type, or it must be a string literal. Type %2 is not allowed. RL - literaal: constante die in een programmeertaal, als absolute rekengrootheid, vergelijkingswaarde of vast uitvoergegeven wordt weergegeven Bij omzetten van %1 of typen daarvan afgeleid moet de bronwaarde van hetzelfde type zijn of moet het een literale reeks zijn. Soort %2 is niet toegestaan. No casting is possible with %1 as the target type. Een omzetting is niet mogelijk met %1 als doeltype. It is not possible to cast from %1 to %2. RL - To cast hier is eigenlijk 'omgieten' bv van SQL-vorm naar Xml of andersom Het is niet mogelijk om %1 om te zetten %2. Casting to %1 is not possible because it is an abstract type, and can therefore never be instantiated. Omzetten naar %1 is niet mogelijk omdat dit een abstract type is en daarom nooit geconcretiseerd kan worden. It's not possible to cast the value %1 of type %2 to %3 Het is niet mogelijk om waarde %1 van soort %2 om te zetten in %3 Failure when casting from %1 to %2: %3 Omzetting van %1 naar %2 is mislukt: %3 A comment cannot contain %1 Een commentaar kan geen %1 bevatten A comment cannot end with a %1. Een commentaar kan niet op %1 eindigen. No comparisons can be done involving the type %1. Met type %1 zijn geen vergelijkingen uit te voeren. Operator %1 is not available between atomic values of type %2 and %3. RL - een attribuut is atomair indien het maar één enkele waarde kan bevatten Operator %1 is niet beschikbaar tussen atomaire waarden van type %2 en %3. An attribute node cannot be a child of a document node. Therefore, the attribute %1 is out of place. Een attribuutnode kan geen kind zijn van een documentnode. Daarom is het attribuut %1 niet op zijn plaats. A library module cannot be evaluated directly. It must be imported from a main module. Een bibliotheekmodule kan niet direct geëvalueerd worden. Deze moet via een hoofdmodule geïmporteerd worden. A value of type %1 cannot be a predicate. A predicate must have either a numeric type or an Effective Boolean Value type. RL - Waarde van George Boole, wiskundige. Wordt in Nederland wisselend niet vertaald (Boolean) en wel (Booleaans) Een waarde van het soort %1 kan geen predikaat zijn. Een predikaat moet of een numeriek type of een Effectieve Booleaanse Waarde type hebben. A positional predicate must evaluate to a single numeric value. Een positioneel predikaat moet evalueren naar een enkele numerieke waarde. The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, is %2 invalid. De doelnaam in een procesinstructie kan geen %1 zijn, in welke combinatie van hoofd- of kleine letters dan ook. Daarom is %2 ongeldig. %1 is not a valid target name in a processing instruction. It must be a %2 value, e.g. %3. %1 is geen geldige doelnaam in een procesinstructie. Deze moet een %2 waarde zijn, bijvoorbeeld %3. The last step in a path must contain either nodes or atomic values. It cannot be a mixture between the two. RL - een attribuut is atomair indien het maar één enkele waarde kan bevatten De laatste stap in een pad moet of nodes of atomaire waarden bevatten. Een combinatie van beide kan niet. The data of a processing instruction cannot contain the string %1 De gegevens van een procesinstructie kunnen niet de reeks %1 bevatten No namespace binding exists for the prefix %1 Een naamruimtebinding bestaat niet voor prefix %1 No namespace binding exists for the prefix %1 in %2 Een naamruimtebinding bestaat niet voor prefix %1 in %2 %1 is an invalid %2 %1 is een ongeldig %2 %1 takes at most %n argument(s). %2 is therefore invalid. enkel en meervoud string, nieuwe format %1 accepteert ten hoogste %n argument. %2 is daarom ongeldig. %1 accepteert ten hoogste %n argumenten. %2 is daarom ongeldig. %1 requires at least %n argument(s). %2 is therefore invalid. %1 vereist tenminste %n argument %2 is daarom ongeldig. %1 vereist tenminste %n argumenten %2 is daarom ongeldig. The first argument to %1 cannot be of type %2. It must be a numeric type, xs:yearMonthDuration or xs:dayTimeDuration. Het eerste argument van %1 kan niet van het type %2 zijn. Het moet numeriek, xs:jaarMaandDuur of xs:dagTijdDuur zijn. The first argument to %1 cannot be of type %2. It must be of type %3, %4, or %5. Het eerste argument van %1 kan niet van het type %2 zijn. Het moet van het type %3, %4 of %5 zijn. The second argument to %1 cannot be of type %2. It must be of type %3, %4, or %5. Het tweede argument van %1 kan niet van het type %2 zijn. Het moet van het type %3, %4 of %5 zijn. %1 is not a valid XML 1.0 character. %1 is een ongeldig XML 1.0 teken. The first argument to %1 cannot be of type %2. Het eerste argument van %1 kan niet van het type %2 zijn. If both values have zone offsets, they must have the same zone offset. %1 and %2 are not the same. Hebben beide waarden zone offsets, dan moeten ze dezelfde zone offset hebben. %1 en %2 zijn niet hetzelfde. %1 was called. %1 was aangeroepen. %1 must be followed by %2 or %3, not at the end of the replacement string. %1 moet gevolgd worden door %2 of %3; maar niet aan het einde van een vervangende reeks. In the replacement string, %1 must be followed by at least one digit when not escaped. In de vervangende reeks moet %1 gevolgd worden door tenminste één cijfer als deze niet door een escape teken wordt gedekt. In the replacement string, %1 can only be used to escape itself or %2, not %3 In de vervangende reeks kan %1 alleen worden gebruikt om zichzelf in te dekken of %2, maar niet %3 %1 matches newline characters %1 komt overeen met tekens voor een nieuwe tekstregel %1 and %2 match the start and end of a line. %1 en %2 betekenen allebei begin en het einde van een regel. Matches are case insensitive Overeenkomsten zijn niet hoofdletter gevoelig Whitespace characters are removed, except when they appear in character classes Witruimte-tekens worden verwijderd, behalve wanneer deze voorkomen in tekenklassen %1 is an invalid regular expression pattern: %2 %1 is een ongeldige reguliere expressie patroon: %2 %1 is an invalid flag for regular expressions. Valid flags are: %1 is een ongeldige vlag voor een reguliere expressie. Geldige vlaggen zijn: If the first argument is the empty sequence or a zero-length string (no namespace), a prefix cannot be specified. Prefix %1 was specified. Is het eerste argument een lege reeks (empty sequence) of een reeks met lengte nul (geen naamruimte), dan kan geen prefix worden meegegeven. Prefix %1 was meegegeven. It will not be possible to retrieve %1. Het is niet mogelijk om %1 terug te halen. The root node of the second argument to function %1 must be a document node. %2 is not a document node. RL - root node is Techterm De root node van het tweede argument voor functie %1 moet een document node zijn. %2 is geen document node. The default collection is undefined De standaardverzameling is niet gedefinieerd %1 cannot be retrieved %1 kan niet terug gehaald worden The normalization form %1 is unsupported. The supported forms are %2, %3, %4, and %5, and none, i.e. the empty string (no normalization). De normalisatie vorm %1 wordt niet ondersteund. De ondersteunde vormen zijn %2, %3, %4, %5 ,en "geen" d.w.z. de lege reeks (geen normalisatie). A zone offset must be in the range %1..%2 inclusive. %3 is out of range. Een zone offset moet binnen de reeks %1..%2 (inclusief) vallen. %3 valt buiten het bereik. %1 is not a whole number of minutes. %1 is geen geheel getal in minuten. Required cardinality is %1; got cardinality %2. Het vereiste hoofdtelwoord is %1 maar kreeg %2. The item %1 did not match the required type %2. Het item %1 komt niet overeen met het vereiste type %2. %1 is an unknown schema type. %1 is een onbekend schematype. Only one %1 declaration can occur in the query prolog. Maar één %1 declaratie kan voorkomen in de inleiding van een zoekopdracht. The initialization of variable %1 depends on itself De initialisering van variabele %1 hangt van zichzelf af No variable by name %1 exists Een variabele met naam %1 bestaat niet The variable %1 is unused De variabele %1 wordt niet gebruikt Version %1 is not supported. The supported XQuery version is 1.0. Versie %1 wordt niet ondersteund. De ondersteunde XQuery-versie is 1.0. The encoding %1 is invalid. It must contain Latin characters only, must not contain whitespace, and must match the regular expression %2. RL - Latin is karaktertype De codering %1 is ongeldig. Deze mag alleen Latin tekens bevatten, geen witruimte en moet overeenkomen met de reguliere expressie %2. No function with signature %1 is available Geen functie beschikbaar met handtekening %1 A default namespace declaration must occur before function, variable, and option declarations. Een standaard naamruimte declaratie moet aanwezig zijn vóór functie, variabele en optie-declaraties. Namespace declarations must occur before function, variable, and option declarations. Naamruimte declaraties moeten aanwezig zijn vóór functie, variabele en optie declaraties. Module imports must occur before function, variable, and option declarations. Module imports moeten aanwezig zijn vóór functie, variabele en optie declaraties. It is not possible to redeclare prefix %1. Het is niet mogelijk om prefix %1 opnieuw te declareren. Only the prefix %1 can be declared to bind the namespace %2. By default, it is already bound to the prefix %1. Alleen prefixl %1 kan gedeclareerd worden om te binden met naamruimte %2. Standaard is deze al gebonden met prefix %1. Prefix %1 is already declared in the prolog. Prefix %1 is al gedeclareerd in de inleiding. The name of an option must have a prefix. There is no default namespace for options. De naam van een optie moet een prefix hebben. Er bestaat geen standaardnaamruimte voor opties. The Schema Import feature is not supported, and therefore %1 declarations cannot occur. De faciliteit Schema Import wordt niet ondersteund en daarom kunnen declaraties %1 niet voorkomen. The target namespace of a %1 cannot be empty. De doelnaamruimte van een %1 kan niet leeg zijn. The module import feature is not supported De import-module faciliteit wordt niet ondersteund A variable by name %1 has already been declared in the prolog. Een variabele met de naam %1 is al gedeclareerd in de inleiding. No value is available for the external variable by name %1. Voor de externe variabele met de naam %1 is geen waarde beschikbaar. The namespace %1 is reserved; therefore user defined functions may not use it. Try the predefined prefix %2, which exists for these cases. De naamruimte %1 is gereserveerd. Daarom mogen eigen gedefineerde functies deze niet gebruiken. Probeer het voorgedefinieerde prefix %2, dat al bestaat voor dit soort gevallen. The namespace of a user defined function in a library module must be equivalent to the module namespace. In other words, it should be %1 instead of %2 De naamruimte van een zelf gedefinieerde functie in een bibliotheek module moet overeenkomen met de module naamruimte. Met andere woorden: het zou %1 moeten zijn in plaats van %2 A function already exists with the signature %1. Een functie met handtekening %1 bestaat al. No external functions are supported. All supported functions can be used directly, without first declaring them as external Externe functies worden niet ondersteund. Alle ondersteunde functies kunnen direct worden gebruikt zonder deze als extern te declareren An argument by name %1 has already been declared. Every argument name must be unique. Een argument met de naam %1 is al gedeclareerd. Elke naam van een argument moet uniek zijn. The name of a variable bound in a for-expression must be different from the positional variable. Hence, the two variables named %1 collide. De naam van de variabele gebonden in een "for" expressie moet verschillen van de positionele variabele. Daarom botsen de twee variabelen genaamd %1. The Schema Validation Feature is not supported. Hence, %1-expressions may not be used. Schema Validatie faciliteit wordt niet ondersteund. Daarom mogen %1 expressies niet worden gebruikt. None of the pragma expressions are supported. Therefore, a fallback expression must be present Geen van de pragmatische expressies wordt ondersteund. Daarom moet een terugval expressie aanwezig zijn The %1-axis is unsupported in XQuery De %1 as wordt niet ondersteund in een XQuery %1 is not a valid numeric literal. %1 is geen geldige numerieke literaal. No function by name %1 is available. Een functie met naam %1 is niet beschikbaar. The namespace URI cannot be the empty string when binding to a prefix, %1. De naamruimte URI kan niet een lege reeks zijn als deze gebonden wordt aan een prefix, %1. %1 is an invalid namespace URI. %1 is een ongeldige naamruimte URI. It is not possible to bind to the prefix %1 Het is niet mogelijk om prefix %1 opnieuw te binden Namespace %1 can only be bound to %2 (and it is, in either case, pre-declared). Naamruimte %1 kan alleen gebonden worden aan %2 (en is in elk geval voorgedeclareerd). Prefix %1 can only be bound to %2 (and it is, in either case, pre-declared). Prefix %1 kan alleen gebonden worden aan %2 (en is in elk geval voorgedeclareerd). Two namespace declaration attributes have the same name: %1. Twee attributen voor een naamruimtedeclaratie hebben dezelfde naam: %1. The namespace URI must be a constant and cannot use enclosed expressions. Een naamruimte URI moet een constante zijn en kan geen ingesloten expressie zijn. An attribute by name %1 has already appeared on this element. Een attribuut met de naam %1 is al voorgekomen op dit element. A direct element constructor is not well-formed. %1 is ended with %2. Een direct element constructor is niet goed opgezet. %1 eindigt met %2. The name %1 does not refer to any schema type. De naam %1 verwijst naar geen enkel schematype. %1 is an complex type. Casting to complex types is not possible. However, casting to atomic types such as %2 works. RL - een attribuut is atomair indien het maar één enkele waarde kan bevatten %1 is een complex type. Overgaan naar complexe typen is niet mogelijk. Echter, omzetten naar atomaire typen zoals %2 werkt. %1 is not an atomic type. Casting is only possible to atomic types. RL - een attribuut is atomair indien het maar één enkele waarde kan bevatten %1 is geen atomair type. Overgaan is alleen mogeijk naar atomaire typen. %1 is not a valid name for a processing-instruction. Therefore this name test will never match. %1 is geen geldige naam voor een procesinstructie. Daarom zal deze naamtest nooit werken. %1 is not in the in-scope attribute declarations. Note that the schema import feature is not supported. %1 valt niet in het bereik van de attribuutdeclaraties. Weet dat schema-import faciliteit niet wordt ondersteund. The name of an extension expression must be in a namespace. De naam van een aanvullende expressie moet in een naamruimte staan. empty leeg zero or one nul of één exactly one precies één one or more één of meer zero or more nul of meer Required type is %1, but %2 was found. Het vereiste type is %1 maar %2 is gevonden. Promoting %1 to %2 may cause loss of precision. Het opwaarderen van %1 maar %2 kan verlies van nauwkeurigheid tot gevolg hebben. The focus is undefined. De focus in niet gedefinieerd. It's not possible to add attributes after any other kind of node. Het is niet mogelijk om attributen toe te voegen na enig ander soort node. An attribute by name %1 has already been created. Een attribuut met de naam %1 is al aangemaakt. Only the Unicode Codepoint Collation is supported(%1). %2 is unsupported. RL - Unicode Codepoint Collation niet vertalen Alleen Unicode Codepoint Collation wordt ondersteund (%1). %2 wordt niet ondersteund. Attribute %1 can't be serialized because it appears at the top level. Attribuut %1 kan niet geserialiseerd worden omdat deze op het hoogste niveau optreedt. The namespace for a user defined function cannot be empty (try the predefined prefix %1 which exists for cases like this) De naamruimte for een eigen gedefinieerde functie kan niet leeg zijn (probeer een voorgedefinieerd prefix %1 dat voor dit soort gevallen bestaat) VolumeSlider Muted Gedempd Volume: %1% Volume: %1% WebCore::PlatformScrollbar Scroll here Hier scrollen Left edge Linker rand Top Boven Right edge Rechter rand Bottom Onder Page left Een pagina naar links Page up Een pagina omhoog Page right Een pagina naar rechts Page down Een pagina naar beneden Scroll left Naar links scrollen Scroll up Naar boven scrollen Scroll right Naar rechts scrollen Scroll down Naar onder scrollen mumble-1.3.4/src/mumble/ConfigDialog.cpp0000664000175000017500000001257114010707273017750 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "ConfigDialog.h" #include "AudioInput.h" #include "AudioOutput.h" #include "Global.h" #include "Overlay.h" ConfigDialog::ConfigDialog(QWidget *p) : QDialog(p) { setupUi(this); s = g.s; unsigned int idx = 0; ConfigWidgetNew cwn; foreach(cwn, *ConfigRegistrar::c_qmNew) { addPage(cwn(s), ++idx); } updateListView(); QPushButton *okButton = dialogButtonBox->button(QDialogButtonBox::Ok); okButton->setToolTip(tr("Accept changes")); okButton->setWhatsThis(tr("This button will accept current settings and return to the application.
    " "The settings will be stored to disk when you leave the application.")); QPushButton *cancelButton = dialogButtonBox->button(QDialogButtonBox::Cancel); cancelButton->setToolTip(tr("Reject changes")); cancelButton->setWhatsThis(tr("This button will reject all changes and return to the application.
    " "The settings will be reset to the previous positions.")); QPushButton *applyButton = dialogButtonBox->button(QDialogButtonBox::Apply); applyButton->setToolTip(tr("Apply changes")); applyButton->setWhatsThis(tr("This button will immediately apply all changes.")); QPushButton *resetButton = pageButtonBox->button(QDialogButtonBox::Reset); resetButton->setToolTip(tr("Undo changes for current page")); resetButton->setWhatsThis(tr("This button will revert any changes done on the current page to the most recent applied settings.")); QPushButton *restoreButton = pageButtonBox->button(QDialogButtonBox::RestoreDefaults); restoreButton->setToolTip(tr("Restore defaults for current page")); restoreButton->setWhatsThis(tr("This button will restore the defaults for the settings on the current page. Other pages will not be changed.
    " "To restore all settings to their defaults, you will have to use this button on every page." )); if (! g.s.qbaConfigGeometry.isEmpty()) { if (! g.ocIntercept) restoreGeometry(g.s.qbaConfigGeometry); } } void ConfigDialog::addPage(ConfigWidget *cw, unsigned int idx) { QDesktopWidget dw; int w = INT_MAX, h = INT_MAX; for (int i=0;iminimumSizeHint(); cw->resize(ms); cw->setMinimumSize(ms); ms.rwidth() += 128; ms.rheight() += 192; if ((ms.width() > w) || (ms.height() > h)) { QScrollArea *qsa=new QScrollArea(); qsa->setFrameShape(QFrame::NoFrame); qsa->setWidgetResizable(true); qsa->setWidget(cw); qhPages.insert(cw, qsa); qswPages->addWidget(qsa); } else { qhPages.insert(cw, cw); qswPages->addWidget(cw); } qmWidgets.insert(idx, cw); cw->load(g.s); } ConfigDialog::~ConfigDialog() { foreach(QWidget *qw, qhPages) delete qw; } void ConfigDialog::on_pageButtonBox_clicked(QAbstractButton *b) { ConfigWidget *conf = qobject_cast(qswPages->currentWidget()); if (! conf) { QScrollArea *qsa = qobject_cast(qswPages->currentWidget()); if (qsa) conf = qobject_cast(qsa->widget()); } if (! conf) return; switch (pageButtonBox->standardButton(b)) { case QDialogButtonBox::RestoreDefaults: { Settings def; conf->load(def); break; } case QDialogButtonBox::Reset: { conf->load(g.s); break; } default: break; } } void ConfigDialog::on_dialogButtonBox_clicked(QAbstractButton *b) { switch (dialogButtonBox->standardButton(b)) { case QDialogButtonBox::Apply: { apply(); break; } default: break; } } void ConfigDialog::on_qlwIcons_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous) { if (!current) current = previous; if (current) { QWidget *w = qhPages.value(qmIconWidgets.value(current)); if (w) qswPages->setCurrentWidget(w); } } void ConfigDialog::updateListView() { QWidget *ccw = qmIconWidgets.value(qlwIcons->currentItem()); QListWidgetItem *sel = NULL; qmIconWidgets.clear(); qlwIcons->clear(); QFontMetrics qfm(qlwIcons->font()); int configNavbarWidth = 0; foreach(ConfigWidget *cw, qmWidgets) { configNavbarWidth = qMax(configNavbarWidth, qfm.width(cw->title())); QListWidgetItem *i = new QListWidgetItem(qlwIcons); i->setIcon(cw->icon()); i->setText(cw->title()); i->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); qmIconWidgets.insert(i, cw); if (cw == ccw) sel = i; } // Add space for icon and some padding. configNavbarWidth += qlwIcons->iconSize().width() + 25; qlwIcons->setMinimumWidth(configNavbarWidth); qlwIcons->setMaximumWidth(configNavbarWidth); if (sel) qlwIcons->setCurrentItem(sel); else qlwIcons->setCurrentRow(0); } void ConfigDialog::apply() { Audio::stop(); foreach(ConfigWidget *cw, qmWidgets) cw->save(); g.s = s; foreach(ConfigWidget *cw, qmWidgets) cw->accept(); if (!g.s.bAttenuateOthersOnTalk) g.bAttenuateOthers = false; // They might have changed their keys. g.iPushToTalk = 0; Audio::start(); } void ConfigDialog::accept() { apply(); if (! g.ocIntercept) g.s.qbaConfigGeometry=saveGeometry(); QDialog::accept(); } mumble-1.3.4/src/mumble/SvgIcon.cpp0000664000175000017500000000225114010707273016765 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "SvgIcon.h" #include #include void SvgIcon::addSvgPixmapsToIcon(QIcon &icon, QString fn) { QSvgRenderer svg(fn); QList commonSizes; commonSizes << QSize(8, 8); commonSizes << QSize(16, 16); commonSizes << QSize(22, 22); // Plasma notification area size commonSizes << QSize(24, 24); commonSizes << QSize(32, 32); commonSizes << QSize(44, 44); // Plasma notification area size @x2 commonSizes << QSize(48, 48); commonSizes << QSize(64, 64); commonSizes << QSize(96, 96); commonSizes << QSize(128, 128); commonSizes << QSize(256, 256); foreach (QSize size, commonSizes) { QPixmap pm(size); pm.fill(Qt::transparent); QPainter p(&pm); p.setRenderHint(QPainter::Antialiasing); p.setRenderHint(QPainter::TextAntialiasing); p.setRenderHint(QPainter::SmoothPixmapTransform); p.setRenderHint(QPainter::HighQualityAntialiasing); svg.render(&p); icon.addPixmap(pm); } } mumble-1.3.4/src/mumble/Themes.h0000664000175000017500000000441514010707273016313 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_THEMES_H_ #define MUMBLE_MUMBLE_THEMES_H_ #include #include #ifndef Q_MOC_RUN #include #endif class Themes { public: /// Returns the style configured in the given settings structure static boost::optional getConfiguredStyle(const Settings& settings); /// Updates the given settings object to be configured to the given style /// /// @note Does not apply the theme @see apply /// /// @param settings Settings object to update /// @param style Style to set /// @param outChanged Will be set to true if the style in settings actually changed. Will not be changed otherwise. static void setConfiguredStyle(Settings& settings, boost::optional style, bool& outChanged); /// Applies the theme /// /// @note Can only apply a theme before MainWindow etc. is opened static bool apply(); /// Return a theme name to theme map static ThemeMap getThemes(); /// Returns the per user themes directory static QDir getUserThemesDirectory(); private: /// Applies the fallback stylesheet static void applyFallback(); /// Tries to apply the configured theme. /// @return True on success. False on failure. static bool applyConfigured(); // Sets the theme to a QSS theme static void setTheme(QString &themeQss, QStringList &skinPaths); /// Returns list of theme search directories ordered ascending by priorty (lowest first) static QVector getSearchDirectories(); /// Returns default style-sheet used for fall-backs static QString getDefaultStylesheet(); /// userStylesheetPath returns the absolute path to the /// user.qss file. static QString userStylesheetPath(); /// readStylesheet fills stylesheetContent with the content /// of the file at stylesheetFn, if available. /// If a the file is is available, the function returns true. /// If no file is available, it returns false. static bool readStylesheet(const QString &stylesheetFn, QString &stylesheetContent); }; #endif // MUMBLE_MUMBLE_THEMES_H_ mumble-1.3.4/src/mumble/UserLocalVolumeDialog.cpp0000664000175000017500000001030114010707273021611 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . /* Copyright (C) 2015, Fredrik Nordin All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Mumble Developers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "mumble_pch.hpp" #include "UserLocalVolumeDialog.h" #include "Global.h" #include "ClientUser.h" #include "Database.h" UserLocalVolumeDialog::UserLocalVolumeDialog(unsigned int sessionId, QMap *qmUserVolTracker) : QDialog(NULL) , m_clientSession(sessionId) , m_qmUserVolTracker(qmUserVolTracker) { setupUi(this); ClientUser *user = ClientUser::get(sessionId); if (user) { QString title = tr("Adjusting local volume for %1").arg(user->qsName); setWindowTitle(title); qsUserLocalVolume->setValue(qRound(log2(user->fLocalVolume) * 6.0)); m_originalVolumeAdjustmentDecibel = qsUserLocalVolume->value(); } } void UserLocalVolumeDialog::closeEvent(QCloseEvent *event) { m_qmUserVolTracker->remove(m_clientSession); event->accept(); } void UserLocalVolumeDialog::present(unsigned int sessionId, QMap *qmUserVolTracker) { if (qmUserVolTracker->contains(sessionId)) { qmUserVolTracker->value(sessionId)->raise(); } else { UserLocalVolumeDialog *uservol = new UserLocalVolumeDialog(sessionId, qmUserVolTracker); uservol->show(); qmUserVolTracker->insert(sessionId, uservol); } } void UserLocalVolumeDialog::on_qsUserLocalVolume_valueChanged(int value) { qsbUserLocalVolume->setValue(value); ClientUser *user = ClientUser::get(m_clientSession); if (user) { // Decibel formula: +6db = *2 user->fLocalVolume = static_cast(pow(2.0, qsUserLocalVolume->value() / 6.0)); } } void UserLocalVolumeDialog::on_qsbUserLocalVolume_valueChanged(int value) { qsUserLocalVolume->setValue(value); } void UserLocalVolumeDialog::on_qbbUserLocalVolume_clicked(QAbstractButton *button) { if (button == qbbUserLocalVolume->button(QDialogButtonBox::Reset)) { qsUserLocalVolume->setValue(0); } if (button == qbbUserLocalVolume->button(QDialogButtonBox::Ok)) { ClientUser *user = ClientUser::get(m_clientSession); if (user && !user->qsHash.isEmpty()) { g.db->setUserLocalVolume(user->qsHash, user->fLocalVolume); } UserLocalVolumeDialog::close(); } if (button == qbbUserLocalVolume->button(QDialogButtonBox::Cancel)) { qsUserLocalVolume->setValue(m_originalVolumeAdjustmentDecibel); UserLocalVolumeDialog::close(); } } void UserLocalVolumeDialog::reject() { m_qmUserVolTracker->remove(m_clientSession); UserLocalVolumeDialog::close(); } mumble-1.3.4/src/mumble/AudioWizard.h0000664000175000017500000000461714010707273017314 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_AUDIOWIZARD_H_ #define MUMBLE_MUMBLE_AUDIOWIZARD_H_ #include #if QT_VERSION >= 0x050000 # include # include #else # include # include #endif #include "AudioStats.h" #include "AudioOutput.h" #include "GlobalShortcut.h" #include "Settings.h" class CompletablePage : public QWizardPage { Q_OBJECT protected: bool bComplete; public: CompletablePage(QWizard *p = NULL); void setComplete(bool); bool isComplete() const Q_DECL_OVERRIDE; }; #include "ui_AudioWizard.h" class AudioWizard: public QWizard, public Ui::AudioWizard { private: Q_OBJECT Q_DISABLE_COPY(AudioWizard) protected: bool bTransmitChanged; QGraphicsScene *qgsScene; QGraphicsItem *qgiSource; AudioOutputSample *aosSource; float fAngle; float fX, fY; Settings sOldSettings; QTimer *ticker; bool bInit; bool bDelay; bool bLastActive; QPixmap qpTalkingOn, qpTalkingOff; int iMaxPeak; int iTicks; void restartAudio(); void playChord(); bool eventFilter(QObject *, QEvent *) Q_DECL_OVERRIDE; public slots: void on_qcbInput_activated(int); void on_qcbInputDevice_activated(int); void on_qcbOutput_activated(int); void on_qcbOutputDevice_activated(int); void on_qsOutputDelay_valueChanged(int); void on_qsMaxAmp_valueChanged(int); void on_Ticker_timeout(); void on_qsVAD_valueChanged(int); void on_qrAmplitude_clicked(bool); void on_qrSNR_clicked(bool); void on_qrPTT_clicked(bool); void on_qcbEcho_clicked(bool); void on_qcbHeadphone_clicked(bool); void on_qcbPositional_clicked(bool); void on_qcbAttenuateOthers_clicked(bool); void on_qcbHighContrast_clicked(bool); void on_skwPTT_keySet(bool, bool); void on_qrbQualityUltra_clicked(); void on_qrbQualityBalanced_clicked(); void on_qrbQualityLow_clicked(); void on_qrbQualityCustom_clicked(); void showPage(int); void updateTriggerWidgets(bool); public: AudioWizard(QWidget *parent); void reject() Q_DECL_OVERRIDE; void accept() Q_DECL_OVERRIDE; bool validateCurrentPage() Q_DECL_OVERRIDE; virtual int nextId() const Q_DECL_OVERRIDE; }; #endif mumble-1.3.4/src/mumble/CustomElements.cpp0000664000175000017500000002164714010707273020376 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "CustomElements.h" #include "ClientUser.h" #include "MainWindow.h" #include "Log.h" // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" LogTextBrowser::LogTextBrowser(QWidget *p) : QTextBrowser(p) {} void LogTextBrowser::resizeEvent(QResizeEvent *e) { scrollLogToBottom(); QTextBrowser::resizeEvent(e); } bool LogTextBrowser::event(QEvent *e) { if (e->type() == LogDocumentResourceAddedEvent::Type) { scrollLogToBottom(); } return QTextBrowser::event(e); } int LogTextBrowser::getLogScroll() { return verticalScrollBar()->value(); } int LogTextBrowser::getLogScrollMaximum() { return verticalScrollBar()->maximum(); } void LogTextBrowser::setLogScroll(int scroll_pos) { verticalScrollBar()->setValue(scroll_pos); } void LogTextBrowser::scrollLogToBottom() { verticalScrollBar()->setValue(verticalScrollBar()->maximum()); } void ChatbarTextEdit::focusInEvent(QFocusEvent *qfe) { inFocus(true); QTextEdit::focusInEvent(qfe); } void ChatbarTextEdit::focusOutEvent(QFocusEvent *qfe) { inFocus(false); QTextEdit::focusOutEvent(qfe); } void ChatbarTextEdit::inFocus(bool focus) { if (focus) { if (bDefaultVisible) { QFont f = font(); f.setItalic(false); setFont(f); setPlainText(QString()); bDefaultVisible = false; } } else { if (toPlainText().trimmed().isEmpty() || bDefaultVisible) { QFont f = font(); f.setItalic(true); setFont(f); setHtml(qsDefaultText); bDefaultVisible = true; } else { bDefaultVisible = false; } } } void ChatbarTextEdit::contextMenuEvent(QContextMenuEvent *qcme) { QMenu *menu = createStandardContextMenu(); QAction *action = new QAction(tr("Paste and &Send") + QLatin1Char('\t'), menu); action->setEnabled(!QApplication::clipboard()->text().isEmpty()); connect(action, SIGNAL(triggered()), this, SLOT(pasteAndSend_triggered())); if (menu->actions().count() > 6) menu->insertAction(menu->actions()[6], action); else menu->addAction(action); menu->exec(qcme->globalPos()); delete menu; } void ChatbarTextEdit::dropEvent(QDropEvent *evt) { inFocus(true); QTextEdit::dropEvent(evt); } ChatbarTextEdit::ChatbarTextEdit(QWidget *p) : QTextEdit(p), iHistoryIndex(-1) { setWordWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setMinimumHeight(0); connect(this, SIGNAL(textChanged()), SLOT(doResize())); bDefaultVisible = true; setDefaultText(tr("
    Type chat message here
    ")); } QSize ChatbarTextEdit::minimumSizeHint() const { return QSize(0, fontMetrics().height()); } QSize ChatbarTextEdit::sizeHint() const { QSize sh = QTextEdit::sizeHint(); const int minHeight = minimumSizeHint().height(); const int documentHeight = document()->documentLayout()->documentSize().height(); sh.setHeight(std::max(minHeight, documentHeight)); const_cast(this)->setMaximumHeight(sh.height()); return sh; } void ChatbarTextEdit::resizeEvent(QResizeEvent *e) { QTextEdit::resizeEvent(e); QTimer::singleShot(0, this, SLOT(doScrollbar())); } void ChatbarTextEdit::doResize() { updateGeometry(); QTimer::singleShot(0, this, SLOT(doScrollbar())); } void ChatbarTextEdit::doScrollbar() { setVerticalScrollBarPolicy(sizeHint().height() > height() ? Qt::ScrollBarAlwaysOn : Qt::ScrollBarAlwaysOff); ensureCursorVisible(); } void ChatbarTextEdit::setDefaultText(const QString &new_default, bool force) { qsDefaultText = new_default; if (bDefaultVisible || force) { QFont f = font(); f.setItalic(true); setFont(f); setHtml(qsDefaultText); bDefaultVisible = true; } } bool ChatbarTextEdit::event(QEvent *evt) { if (evt->type() == QEvent::ShortcutOverride) { return false; } if (evt->type() == QEvent::KeyPress) { QKeyEvent *kev = static_cast(evt); if ((kev->key() == Qt::Key_Enter || kev->key() == Qt::Key_Return) && !(kev->modifiers() & Qt::ShiftModifier)) { const QString msg = toPlainText(); if (!msg.isEmpty()) { addToHistory(msg); emit entered(msg); } return true; } if (kev->key() == Qt::Key_Tab) { emit tabPressed(); return true; } else if (kev->key() == Qt::Key_Backtab) { emit backtabPressed(); return true; } else if (kev->key() == Qt::Key_Space && kev->modifiers() == Qt::ControlModifier) { emit ctrlSpacePressed(); return true; } else if (kev->key() == Qt::Key_Up && kev->modifiers() == Qt::ControlModifier) { historyUp(); return true; } else if (kev->key() == Qt::Key_Down && kev->modifiers() == Qt::ControlModifier) { historyDown(); return true; } } return QTextEdit::event(evt); } /** * The bar will try to complete the username, if the nickname * is already complete it will try to find a longer match. If * there is none it will cycle the nicknames alphabetically. * Nothing is done on mismatch. */ unsigned int ChatbarTextEdit::completeAtCursor() { // Get an alphabetically sorted list of usernames unsigned int id = 0; QList qlsUsernames; if (ClientUser::c_qmUsers.empty()) return id; foreach(ClientUser *usr, ClientUser::c_qmUsers) { qlsUsernames.append(usr->qsName); } qSort(qlsUsernames); QString target = QString(); QTextCursor tc = textCursor(); if (toPlainText().isEmpty() || tc.position() == 0) { target = qlsUsernames.first(); tc.insertText(target); } else { bool bBaseIsName = false; int iend = tc.position(); int istart = toPlainText().lastIndexOf(QLatin1Char(' '), iend - 1) + 1; QString base = toPlainText().mid(istart, iend - istart); tc.setPosition(istart); tc.setPosition(iend, QTextCursor::KeepAnchor); if (qlsUsernames.last() == base) { bBaseIsName = true; target = qlsUsernames.first(); } else { if (qlsUsernames.contains(base)) { // Prevent to complete to what's already there while (qlsUsernames.takeFirst() != base) {} bBaseIsName = true; } foreach(QString name, qlsUsernames) { if (name.startsWith(base, Qt::CaseInsensitive)) { target = name; break; } } } if (bBaseIsName && target.isEmpty() && !qlsUsernames.empty()) { // If autocomplete failed and base was a name get the next one target = qlsUsernames.first(); } if (!target.isEmpty()) { tc.insertText(target); } } if (!target.isEmpty()) { setTextCursor(tc); foreach(ClientUser *usr, ClientUser::c_qmUsers) { if (usr->qsName == target) { id = usr->uiSession; break; } } } return id; } void ChatbarTextEdit::addToHistory(const QString &str) { iHistoryIndex = -1; qslHistory.push_front(str); if (qslHistory.length() > MAX_HISTORY) { qslHistory.pop_back(); } } void ChatbarTextEdit::historyUp() { if (qslHistory.length() == 0) return; if (iHistoryIndex == -1) { qsHistoryTemp = toPlainText(); } if (iHistoryIndex < qslHistory.length() - 1) { setPlainText(qslHistory[++iHistoryIndex]); moveCursor(QTextCursor::End); } } void ChatbarTextEdit::historyDown() { if (iHistoryIndex < 0) { return; } else if (iHistoryIndex == 0) { setPlainText(qsHistoryTemp); iHistoryIndex--; } else { setPlainText(qslHistory[--iHistoryIndex]); } moveCursor(QTextCursor::End); } void ChatbarTextEdit::pasteAndSend_triggered() { paste(); addToHistory(toPlainText()); emit entered(toPlainText()); } DockTitleBar::DockTitleBar() : QLabel(tr("Drag here")) { setAlignment(Qt::AlignCenter); setEnabled(false); qtTick = new QTimer(this); qtTick->setSingleShot(true); connect(qtTick, SIGNAL(timeout()), this, SLOT(tick())); size = newsize = 0; } QSize DockTitleBar::sizeHint() const { return minimumSizeHint(); } QSize DockTitleBar::minimumSizeHint() const { return QSize(size,size); } bool DockTitleBar::eventFilter(QObject *, QEvent *evt) { QDockWidget *qdw = qobject_cast(parentWidget()); if (! this->isEnabled()) return false; switch (evt->type()) { case QEvent::Leave: case QEvent::Enter: case QEvent::MouseMove: case QEvent::MouseButtonRelease: { newsize = 0; QPoint p = qdw->mapFromGlobal(QCursor::pos()); if ((p.x() >= iroundf(static_cast(qdw->width()) * 0.1f + 0.5f)) && (p.x() < iroundf(static_cast(qdw->width()) * 0.9f + 0.5f)) && (p.y() >= 0) && (p.y() < 15)) newsize = 15; if (newsize > 0 && !qtTick->isActive()) qtTick->start(500); else if ((newsize == size) && qtTick->isActive()) qtTick->stop(); else if (newsize == 0) tick(); } default: break; } return false; } void DockTitleBar::tick() { QDockWidget *qdw = qobject_cast(parentWidget()); if (newsize == size) return; size = newsize; qdw->setTitleBarWidget(this); } mumble-1.3.4/src/mumble/RichTextEditor.cpp0000664000175000017500000003015214010707273020317 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "RichTextEditor.h" #include "Log.h" #include "MainWindow.h" #include "XMLTools.h" // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" RichTextHtmlEdit::RichTextHtmlEdit(QWidget *p) : QTextEdit(p) { m_document = new LogDocument(this); m_document->setDefaultStyleSheet(qApp->styleSheet()); setDocument(m_document); } /* On nix, some programs send utf8, some send wchar_t. Some zeroterminate once, some twice, some not at all. */ static QString decodeMimeString(const QByteArray &src) { if (src.isEmpty()) return QString(); if ((src.length() >= 4) && ((src.length() % sizeof(ushort)) == 0)) { const ushort *ptr = reinterpret_cast(src.constData()); int len = static_cast(src.length() / sizeof(ushort)); if ((ptr[0] > 0) && (ptr[0] < 0x7f) && (ptr[1] > 0) && (ptr[1] < 0x7f)) { while (len && (ptr[len - 1] == 0)) --len; return QString::fromUtf16(ptr, len); } } if ((sizeof(wchar_t) != sizeof(ushort)) && (src.length() >= static_cast(sizeof(wchar_t))) && ((src.length() % sizeof(wchar_t)) == 0)) { const wchar_t *ptr = reinterpret_cast(src.constData()); int len = static_cast(src.length() / sizeof(wchar_t)); if (*ptr < 0x7f) { while (len && (ptr[len - 1] == 0)) --len; return QString::fromWCharArray(ptr, len); } } const char *ptr = src.constData(); int len = src.length(); while (len && (ptr[len - 1] == 0)) --len; return QString::fromUtf8(ptr, len); } /* Try really hard to properly decode Mime into something sane. */ void RichTextHtmlEdit::insertFromMimeData(const QMimeData *source) { QString uri; QString title; QRegExp newline(QLatin1String("[\\r\\n]")); #ifndef QT_NO_DEBUG qWarning() << "RichTextHtmlEdit::insertFromMimeData" << source->formats(); #endif if (source->hasImage()) { QImage img = qvariant_cast(source->imageData()); QString html = Log::imageToImg(img); if (! html.isEmpty()) insertHtml(html); return; } QString mozurl = decodeMimeString(source->data(QLatin1String("text/x-moz-url"))); if (! mozurl.isEmpty()) { QStringList lines = mozurl.split(newline); qWarning() << mozurl << lines; if (lines.count() >= 2) { uri = lines.at(0); title = lines.at(1); } } if (uri.isEmpty()) uri = decodeMimeString(source->data(QLatin1String("text/x-moz-url-data"))); if (title.isEmpty()) title = decodeMimeString(source->data(QLatin1String("text/x-moz-url-desc"))); if (uri.isEmpty()) { QStringList urls; #ifdef Q_OS_WIN urls = decodeMimeString(source->data(QLatin1String("application/x-qt-windows-mime;value=\"UniformResourceLocatorW\""))).split(newline); if (urls.isEmpty()) #endif urls = decodeMimeString(source->data(QLatin1String("text/uri-list"))).split(newline); if (! urls.isEmpty()) uri = urls.at(0).trimmed(); } if (uri.isEmpty()) { QUrl url(source->text(), QUrl::StrictMode); if (url.isValid() && ! url.isRelative()) { uri = url.toString(); } } #ifdef Q_OS_WIN if (title.isEmpty() && source->hasFormat(QLatin1String("application/x-qt-windows-mime;value=\"FileGroupDescriptorW\""))) { QByteArray qba = source->data(QLatin1String("application/x-qt-windows-mime;value=\"FileGroupDescriptorW\"")); if (qba.length() == sizeof(FILEGROUPDESCRIPTORW)) { const FILEGROUPDESCRIPTORW *ptr = reinterpret_cast(qba.constData()); title = QString::fromWCharArray(ptr->fgd[0].cFileName); if (title.endsWith(QLatin1String(".url"), Qt::CaseInsensitive)) title = title.left(title.length() - 4); } } #endif if (! uri.isEmpty()) { if (title.isEmpty()) title = uri; #if QT_VERSION >= 0x050000 uri = uri.toHtmlEscaped(); title = title.toHtmlEscaped(); #else uri = Qt::escape(uri); title = Qt::escape(title); #endif insertHtml(QString::fromLatin1("%2").arg(uri, title)); return; } QString html = decodeMimeString(source->data(QLatin1String("text/html"))); if (! html.isEmpty()) { insertHtml(html); return; } QTextEdit::insertFromMimeData(source); } RichTextEditorLink::RichTextEditorLink(const QString &txt, QWidget *p) : QDialog(p) { setupUi(this); if (! txt.isEmpty()) { qleText->setText(txt); } } QString RichTextEditorLink::text() const { QUrl url(qleUrl->text(), QUrl::StrictMode); QString txt = qleText->text(); #if QT_VERSION >= 0x050000 txt = txt.toHtmlEscaped(); #else txt = Qt::escape(txt); #endif if (url.isValid() && ! url.isRelative() && ! txt.isEmpty()) { return QString::fromLatin1("%2").arg(url.toString(), txt); } return QString(); } RichTextEditor::RichTextEditor(QWidget *p) : QTabWidget(p) { bChanged = false; bModified = false; bReadOnly = false; setupUi(this); qtbToolBar->addAction(qaBold); qtbToolBar->addAction(qaItalic); qtbToolBar->addAction(qaUnderline); qtbToolBar->addAction(qaColor); qtbToolBar->addSeparator(); qtbToolBar->addAction(qaLink); qtbToolBar->addAction(qaImage); connect(this, SIGNAL(currentChanged(int)), this, SLOT(onCurrentChanged(int))); updateActions(); qteRichText->setFocus(); qteRichText->installEventFilter(this); qptePlainText->installEventFilter(this); } bool RichTextEditor::isModified() const { return bModified; } void RichTextEditor::on_qaBold_triggered(bool on) { qteRichText->setFontWeight(on ? QFont::Bold : QFont::Normal); } void RichTextEditor::on_qaItalic_triggered(bool on) { qteRichText->setFontItalic(on); } void RichTextEditor::on_qaUnderline_triggered(bool on) { qteRichText->setFontUnderline(on); } void RichTextEditor::on_qaColor_triggered() { QColor c = QColorDialog::getColor(); if (c.isValid()) qteRichText->setTextColor(c); } void RichTextEditor::on_qaLink_triggered() { QTextCursor qtc = qteRichText->textCursor(); RichTextEditorLink *rtel = new RichTextEditorLink(qtc.selectedText(), this); if (rtel->exec() == QDialog::Accepted) { QString html = rtel->text(); if (! html.isEmpty()) qteRichText->insertHtml(html); } delete rtel; } void RichTextEditor::on_qaImage_triggered() { QPair choice = g.mw->openImageFile(); QByteArray &qba = choice.first; if (qba.isEmpty()) return; if ((g.uiImageLength > 0) && (static_cast(qba.length()) > g.uiImageLength)) { QMessageBox::warning(this, tr("Failed to load image"), tr("Image file too large to embed in document. Please use images smaller than %1 kB.").arg(g.uiImageLength /1024)); return; } QBuffer qb(&qba); qb.open(QIODevice::ReadOnly); QByteArray format = QImageReader::imageFormat(&qb); qb.close(); qteRichText->insertHtml(Log::imageToImg(format, qba)); } void RichTextEditor::onCurrentChanged(int index) { if (! bChanged) return; if (index == 1) richToPlain(); else qteRichText->setHtml(qptePlainText->toPlainText()); bChanged = false; } void RichTextEditor::on_qptePlainText_textChanged() { bModified = true; bChanged = true; } void RichTextEditor::on_qteRichText_textChanged() { bModified = true; bChanged = true; updateActions(); if (! g.uiMessageLength) return; richToPlain(); const QString &plainText = qptePlainText->toPlainText(); bool over = true; unsigned int imagelength = plainText.length(); if (g.uiMessageLength && imagelength <= g.uiMessageLength) { over = false; } else if (g.uiImageLength && imagelength > g.uiImageLength) { over = true; } else { QString qsOut; QXmlStreamReader qxsr(QString::fromLatin1("%1").arg(plainText)); QXmlStreamWriter qxsw(&qsOut); while (! qxsr.atEnd()) { switch (qxsr.readNext()) { case QXmlStreamReader::Invalid: return; case QXmlStreamReader::StartElement: { if (qxsr.name() == QLatin1String("img")) { QXmlStreamAttributes attr = qxsr.attributes(); qxsw.writeStartElement(qxsr.namespaceUri().toString(), qxsr.name().toString()); foreach(const QXmlStreamAttribute &a, qxsr.attributes()) if (a.name() != QLatin1String("src")) qxsw.writeAttribute(a); } else { qxsw.writeCurrentToken(qxsr); } } break; default: qxsw.writeCurrentToken(qxsr); break; } } over = (static_cast(qsOut.length()) > g.uiMessageLength); } QString tooltip = tr("Message is too long."); if (!over) { if (QToolTip::text() == tooltip) QToolTip::hideText(); } else { QPoint p = QCursor::pos(); const QRect &r = qteRichText->rect(); if (! r.contains(qteRichText->mapFromGlobal(p))) p = qteRichText->mapToGlobal(r.center()); QToolTip::showText(p, tooltip, qteRichText); } } void RichTextEditor::on_qteRichText_cursorPositionChanged() { updateActions(); } void RichTextEditor::on_qteRichText_currentCharFormatChanged() { updateActions(); } void RichTextEditor::updateColor(const QColor &col) { if (col == qcColor) return; qcColor = col; QRect r(0,0,24,24); QPixmap qpm(r.size()); QPainter qp(&qpm); qp.fillRect(r, col); qp.setPen(col.darker()); qp.drawRect(r.adjusted(0, 0, -1, -1)); qaColor->setIcon(qpm); } void RichTextEditor::updateActions() { qaBold->setChecked(qteRichText->fontWeight() == QFont::Bold); qaItalic->setChecked(qteRichText->fontItalic()); qaUnderline->setChecked(qteRichText->fontUnderline()); updateColor(qteRichText->textColor()); } void RichTextEditor::richToPlain() { QXmlStreamReader reader(qteRichText->toHtml()); QString qsOutput; QXmlStreamWriter writer(&qsOutput); int paragraphs = 0; QMap def; def.insert(QLatin1String("margin-top"), QLatin1String("0px")); def.insert(QLatin1String("margin-bottom"), QLatin1String("0px")); def.insert(QLatin1String("margin-left"), QLatin1String("0px")); def.insert(QLatin1String("margin-right"), QLatin1String("0px")); def.insert(QLatin1String("-qt-block-indent"), QLatin1String("0")); def.insert(QLatin1String("text-indent"), QLatin1String("0px")); XMLTools::recurseParse(reader, writer, paragraphs, def); qsOutput = qsOutput.trimmed(); bool changed; do { // Make sure the XML has a root element (would be invalid XML otherwise) // The "unduplicate" element will be dropped by XMLTools::unduplciateTags qsOutput = QString::fromLatin1("%1").arg(qsOutput); QXmlStreamReader r(qsOutput); qsOutput = QString(); QXmlStreamWriter w(&qsOutput); changed = XMLTools::unduplicateTags(r, w); qsOutput = qsOutput.trimmed(); } while (changed); qptePlainText->setPlainText(qsOutput); } void RichTextEditor::setText(const QString &txt, bool readonly) { qtbToolBar->setEnabled(! readonly && g.bAllowHTML); qtbToolBar->setVisible(! readonly && g.bAllowHTML); qptePlainText->setReadOnly(readonly || ! g.bAllowHTML); qteRichText->setReadOnly(readonly); qteRichText->setHtml(txt); qptePlainText->setPlainText(txt); bChanged = false; bModified = false; bReadOnly = readonly; } QString RichTextEditor::text() { if (bChanged) { if (currentIndex() == 0) richToPlain(); else qteRichText->setHtml(qptePlainText->toPlainText()); } bChanged = false; return qptePlainText->toPlainText(); } bool RichTextEditor::eventFilter(QObject *obj, QEvent *evt) { if (obj != qptePlainText && obj != qteRichText) return false; if (evt->type() == QEvent::KeyPress) { QKeyEvent *keyEvent = static_cast(evt); if (((keyEvent->key() == Qt::Key_Enter) || (keyEvent->key() == Qt::Key_Return)) && (keyEvent->modifiers() == Qt::ControlModifier)) { emit accept(); return true; } } return false; } bool RichTextImage::isValidImage(const QByteArray &ba, QByteArray &fmt) { QBuffer qb; qb.setData(ba); if (!qb.open(QIODevice::ReadOnly)) { return false; } QByteArray detectedFormat = QImageReader::imageFormat(&qb).toLower(); if (detectedFormat == QByteArray("png") || detectedFormat == QByteArray("jpg") || detectedFormat == QByteArray("jpeg") || detectedFormat == QByteArray("gif")) { fmt = detectedFormat; return true; } return false; } mumble-1.3.4/src/mumble/UserEdit.ui0000664000175000017500000001434514010707273017003 0ustar builderbuilder UserEdit 0 0 542 470 381 470 0 0 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok Registered Users false 0 0 Rename false Remove false true Qt::AlignCenter Who are you looking for? 0 0 Days Weeks Months Years Qt::Horizontal 40 20 0 0 48 16777215 true 9999 0 0 Inactive for true QAbstractItemView::ExtendedSelection false false true qbbButtons accepted() UserEdit accept() 248 254 157 274 qbbButtons rejected() UserEdit reject() 316 260 286 274 MUComboBox QComboBox
    widgets/MUComboBox.h
    mumble-1.3.4/src/mumble/ConnectDialog.cpp0000664000175000017500000014655614010707273020147 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "ConnectDialog.h" #ifdef USE_BONJOUR #include "BonjourClient.h" #include "BonjourServiceBrowser.h" #include "BonjourServiceResolver.h" #endif #include "Channel.h" #include "Database.h" #include "ServerHandler.h" #include "WebFetch.h" #include "ServerResolver.h" // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" QMap ServerItem::qmIcons; QList ConnectDialog::qlPublicServers; QString ConnectDialog::qsUserCountry, ConnectDialog::qsUserCountryCode, ConnectDialog::qsUserContinentCode; Timer ConnectDialog::tPublicServers; PingStats::PingStats() { init(); } PingStats::~PingStats() { delete asQuantile; } void PingStats::init() { boost::array probs = {{0.75, 0.80, 0.95 }}; asQuantile = new asQuantileType(boost::accumulators::tag::extended_p_square::probabilities = probs); dPing = 0.0; uiPing = 0; uiPingSort = 0; uiUsers = 0; uiMaxUsers = 0; uiBandwidth = 0; uiSent = 0; uiRecv = 0; uiVersion = 0; } void PingStats::reset() { delete asQuantile; init(); } ServerViewDelegate::ServerViewDelegate(QObject *p) : QStyledItemDelegate(p) { } ServerViewDelegate::~ServerViewDelegate() { } void ServerViewDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { // Allow a ServerItem's BackgroundRole to override the current theme's default color. QVariant bg = index.data(Qt::BackgroundRole); if (bg.isValid()) { painter->fillRect(option.rect, bg.value()); } QStyledItemDelegate::paint(painter, option, index); } ServerView::ServerView(QWidget *p) : QTreeWidget(p) { siFavorite = new ServerItem(tr("Favorite"), ServerItem::FavoriteType); addTopLevelItem(siFavorite); siFavorite->setExpanded(true); siFavorite->setHidden(true); #ifdef USE_BONJOUR siLAN = new ServerItem(tr("LAN"), ServerItem::LANType); addTopLevelItem(siLAN); siLAN->setExpanded(true); siLAN->setHidden(true); #else siLAN = NULL; #endif if (!g.s.disablePublicList) { siPublic = new ServerItem(tr("Public Internet"), ServerItem::PublicType); siPublic->setChildIndicatorPolicy(QTreeWidgetItem::ShowIndicator); addTopLevelItem(siPublic); siPublic->setExpanded(false); // The continent code is empty when the server's IP address is not in the GeoIP database qmContinentNames.insert(QLatin1String(""), tr("Unknown")); qmContinentNames.insert(QLatin1String("af"), tr("Africa")); qmContinentNames.insert(QLatin1String("as"), tr("Asia")); qmContinentNames.insert(QLatin1String("na"), tr("North America")); qmContinentNames.insert(QLatin1String("sa"), tr("South America")); qmContinentNames.insert(QLatin1String("eu"), tr("Europe")); qmContinentNames.insert(QLatin1String("oc"), tr("Oceania")); } else { qWarning()<< "Public list disabled"; siPublic = NULL; } } ServerView::~ServerView() { delete siFavorite; delete siLAN; delete siPublic; } QMimeData *ServerView::mimeData(const QList mimeitems) const { if (mimeitems.isEmpty()) return NULL; ServerItem *si = static_cast(mimeitems.first()); return si->toMimeData(); } QStringList ServerView::mimeTypes() const { QStringList qsl; qsl << QStringList(QLatin1String("text/uri-list")); qsl << QStringList(QLatin1String("text/plain")); return qsl; } Qt::DropActions ServerView::supportedDropActions() const { return Qt::CopyAction | Qt::LinkAction; } /* Extract and append (2), (3) etc to the end of a servers name if it is cloned. */ void ServerView::fixupName(ServerItem *si) { QString name = si->qsName; int tag = 1; QRegExp tmatch(QLatin1String("(.+)\\((\\d+)\\)")); tmatch.setMinimal(true); if (tmatch.exactMatch(name)) { name = tmatch.capturedTexts().at(1).trimmed(); tag = tmatch.capturedTexts().at(2).toInt(); } bool found; QString cmpname; do { found = false; if (tag > 1) cmpname = name + QString::fromLatin1(" (%1)").arg(tag); else cmpname = name; foreach(ServerItem *f, siFavorite->qlChildren) if (f->qsName == cmpname) found = true; ++tag; } while (found); si->qsName = cmpname; } bool ServerView::dropMimeData(QTreeWidgetItem *, int, const QMimeData *mime, Qt::DropAction) { ServerItem *si = ServerItem::fromMimeData(mime); if (! si) return false; fixupName(si); qobject_cast(parent())->qlItems << si; siFavorite->addServerItem(si); qobject_cast(parent())->startDns(si); setCurrentItem(si); return true; } ServerItem *ServerView::getParent(const QString &continentcode, const QString &countrycode, const QString &countryname, const QString &usercontinent, const QString &usercountry) { ServerItem *continent = qmContinent.value(continentcode); if (!continent) { QString name = qmContinentNames.value(continentcode); if (name.isEmpty()) name = continentcode; continent = new ServerItem(name, ServerItem::PublicType, continentcode); qmContinent.insert(continentcode, continent); siPublic->addServerItem(continent); if (!continentcode.isEmpty()) { if (continentcode == usercontinent) { continent->setExpanded(true); scrollToItem(continent, QAbstractItemView::PositionAtTop); } } else { continent->setChildIndicatorPolicy(QTreeWidgetItem::ShowIndicator); } } // If the continent code is empty, we put the server directly into the "Unknown" continent if (continentcode.isEmpty()) { return continent; } ServerItem *country = qmCountry.value(countrycode); if (!country) { country = new ServerItem(countryname, ServerItem::PublicType, continentcode, countrycode); qmCountry.insert(countrycode, country); country->setChildIndicatorPolicy(QTreeWidgetItem::ShowIndicator); continent->addServerItem(country); if (!countrycode.isEmpty() && countrycode == usercountry) { country->setExpanded(true); scrollToItem(country, QAbstractItemView::PositionAtTop); } } return country; } void ServerItem::init() { // Without this, columncount is wrong. setData(0, Qt::DisplayRole, QVariant()); setData(1, Qt::DisplayRole, QVariant()); setData(2, Qt::DisplayRole, QVariant()); emitDataChanged(); } ServerItem::ServerItem(const FavoriteServer &fs) : QTreeWidgetItem(QTreeWidgetItem::UserType) { siParent = NULL; bParent = false; itType = FavoriteType; qsName = fs.qsName; usPort = fs.usPort; qsUsername = fs.qsUsername; qsPassword = fs.qsPassword; qsUrl = fs.qsUrl; bCA = false; if (fs.qsHostname.startsWith(QLatin1Char('@'))) { qsBonjourHost = fs.qsHostname.mid(1); brRecord = BonjourRecord(qsBonjourHost, QLatin1String("_mumble._tcp."), QLatin1String("local.")); } else { qsHostname = fs.qsHostname; } init(); } ServerItem::ServerItem(const PublicInfo &pi) : QTreeWidgetItem(QTreeWidgetItem::UserType) { siParent = NULL; bParent = false; itType = PublicType; qsName = pi.qsName; qsHostname = pi.qsIp; usPort = pi.usPort; qsUrl = pi.quUrl.toString(); qsCountry = pi.qsCountry; qsCountryCode = pi.qsCountryCode; qsContinentCode = pi.qsContinentCode; bCA = pi.bCA; init(); } ServerItem::ServerItem(const QString &name, const QString &host, unsigned short port, const QString &username, const QString &password) : QTreeWidgetItem(QTreeWidgetItem::UserType) { siParent = NULL; bParent = false; itType = FavoriteType; qsName = name; usPort = port; qsUsername = username; qsPassword = password; bCA = false; if (host.startsWith(QLatin1Char('@'))) { qsBonjourHost = host.mid(1); brRecord = BonjourRecord(qsBonjourHost, QLatin1String("_mumble._tcp."), QLatin1String("local.")); } else { qsHostname = host; } init(); } ServerItem::ServerItem(const BonjourRecord &br) : QTreeWidgetItem(QTreeWidgetItem::UserType) { siParent = NULL; bParent = false; itType = LANType; qsName = br.serviceName; qsBonjourHost = qsName; brRecord = br; usPort = 0; bCA = false; init(); } ServerItem::ServerItem(const QString &name, ItemType itype, const QString &continent, const QString &country) { siParent = NULL; bParent = true; qsName = name; itType = itype; if (itType == PublicType) { qsCountryCode = country; qsContinentCode = continent; } setFlags(flags() & ~Qt::ItemIsDragEnabled); bCA = false; init(); } ServerItem::ServerItem(const ServerItem *si) { siParent = NULL; bParent = false; itType = FavoriteType; qsName = si->qsName; qsHostname = si->qsHostname; usPort = si->usPort; qsUsername = si->qsUsername; qsPassword = si->qsPassword; qsCountry = si->qsCountry; qsCountryCode = si->qsCountryCode; qsContinentCode = si->qsContinentCode; qsUrl = si->qsUrl; qsBonjourHost = si->qsBonjourHost; brRecord = si->brRecord; qlAddresses = si->qlAddresses; bCA = si->bCA; uiVersion = si->uiVersion; uiPing = si->uiPing; uiPingSort = si->uiPing; uiUsers = si->uiUsers; uiMaxUsers = si->uiMaxUsers; uiBandwidth = si->uiBandwidth; uiSent = si->uiSent; dPing = si->dPing; *asQuantile = * si->asQuantile; } ServerItem::~ServerItem() { if (siParent) { siParent->qlChildren.removeAll(this); if (siParent->bParent && siParent->qlChildren.isEmpty()) siParent->setHidden(true); } // This is just for cleanup when exiting the dialog, it won't stop pending DNS for the children. foreach(ServerItem *si, qlChildren) delete si; } ServerItem *ServerItem::fromMimeData(const QMimeData *mime, bool default_name, QWidget *p, bool convertHttpUrls) { if (mime->hasFormat(QLatin1String("OriginatedInMumble"))) return NULL; QUrl url; if (mime->hasUrls() && ! mime->urls().isEmpty()) url = mime->urls().at(0); else if (mime->hasText()) url = QUrl::fromEncoded(mime->text().toUtf8()); QString qsFile = url.toLocalFile(); if (! qsFile.isEmpty()) { QFile f(qsFile); // Make sure we don't accidently read something big the user // happened to have in his clipboard. We only want to look // at small link files. if (f.open(QIODevice::ReadOnly) && f.size() < 10240) { QByteArray qba = f.readAll(); f.close(); url = QUrl::fromEncoded(qba, QUrl::StrictMode); if (! url.isValid()) { // Windows internet shortcut files (.url) are an ini with an URL value QSettings qs(qsFile, QSettings::IniFormat); url = QUrl::fromEncoded(qs.value(QLatin1String("InternetShortcut/URL")).toByteArray(), QUrl::StrictMode); } } } if (default_name) { #if QT_VERSION >= 0x050000 QUrlQuery query(url); if (! query.hasQueryItem(QLatin1String("title"))) { query.addQueryItem(QLatin1String("title"), url.host()); } #else if (! url.hasQueryItem(QLatin1String("title"))) { url.addQueryItem(QLatin1String("title"), url.host()); } #endif } if (! url.isValid()) { return NULL; } // An URL from text without a scheme will have the hostname text // in the QUrl scheme and no hostname. We do not want to use that. if (url.host().isEmpty()) { return NULL; } // Some communication programs automatically create http links from domains. // When a user sends another user a domain to connect to, and http is added wrongly, // we do our best to remove it again. if (convertHttpUrls && ( url.scheme() == QLatin1String("http") || url.scheme() == QLatin1String("https"))) { url.setScheme(QLatin1String("mumble")); } return fromUrl(url, p); } ServerItem *ServerItem::fromUrl(QUrl url, QWidget *p) { if (! url.isValid() || (url.scheme() != QLatin1String("mumble"))) { return NULL; } #if QT_VERSION >= 0x050000 QUrlQuery query(url); #endif if (url.userName().isEmpty()) { if (g.s.qsUsername.isEmpty()) { bool ok; QString defUserName = QInputDialog::getText(p, ConnectDialog::tr("Adding host %1").arg(url.host()), ConnectDialog::tr("Enter username"), QLineEdit::Normal, g.s.qsUsername, &ok).trimmed(); if (! ok) return NULL; if (defUserName.isEmpty()) return NULL; g.s.qsUsername = defUserName; } url.setUserName(g.s.qsUsername); } #if QT_VERSION >= 0x050000 ServerItem *si = new ServerItem(query.queryItemValue(QLatin1String("title")), url.host(), static_cast(url.port(DEFAULT_MUMBLE_PORT)), url.userName(), url.password()); if (query.hasQueryItem(QLatin1String("url"))) si->qsUrl = query.queryItemValue(QLatin1String("url")); #else ServerItem *si = new ServerItem(url.queryItemValue(QLatin1String("title")), url.host(), static_cast(url.port(DEFAULT_MUMBLE_PORT)), url.userName(), url.password()); if (url.hasQueryItem(QLatin1String("url"))) si->qsUrl = url.queryItemValue(QLatin1String("url")); #endif return si; } QVariant ServerItem::data(int column, int role) const { if (bParent) { if (column == 0) { switch (role) { case Qt::DisplayRole: return qsName; case Qt::DecorationRole: if (itType == FavoriteType) return loadIcon(QLatin1String("skin:emblems/emblem-favorite.svg")); else if (itType == LANType) return loadIcon(QLatin1String("skin:places/network-workgroup.svg")); else if (! qsCountryCode.isEmpty()) { QString flag = QString::fromLatin1(":/flags/%1.svg").arg(qsCountryCode); if (!QFileInfo(flag).exists()) { flag = QLatin1String("skin:categories/applications-internet.svg"); } return loadIcon(flag); } else return loadIcon(QLatin1String("skin:categories/applications-internet.svg")); } } } else { if (role == Qt::DisplayRole) { switch (column) { case 0: return qsName; case 1: return (dPing > 0.0) ? QString::number(uiPing) : QVariant(); case 2: return uiUsers ? QString::fromLatin1("%1/%2 ").arg(uiUsers).arg(uiMaxUsers) : QVariant(); } } else if (role == Qt::ToolTipRole) { QStringList qsl; foreach(const ServerAddress &addr, qlAddresses) { qsl << Qt::escape(addr.host.toString() + QLatin1String(":") + QString::number(static_cast(addr.port))); } double ploss = 100.0; if (uiSent > 0) ploss = (uiSent - qMin(uiRecv, uiSent)) * 100. / uiSent; QString qs; qs += QLatin1String("") + QString::fromLatin1("").arg(ConnectDialog::tr("Servername"), Qt::escape(qsName)) + QString::fromLatin1("").arg(ConnectDialog::tr("Hostname"), Qt::escape(qsHostname)); if (! qsBonjourHost.isEmpty()) qs += QString::fromLatin1("").arg(ConnectDialog::tr("Bonjour name"), Qt::escape(qsBonjourHost)); qs += QString::fromLatin1("").arg(ConnectDialog::tr("Port")).arg(usPort) + QString::fromLatin1("").arg(ConnectDialog::tr("Addresses"), qsl.join(QLatin1String(", "))); if (! qsUrl.isEmpty()) qs += QString::fromLatin1("").arg(ConnectDialog::tr("Website"), Qt::escape(qsUrl)); if (uiSent > 0) { qs += QString::fromLatin1("").arg(ConnectDialog::tr("Packet loss"), QString::fromLatin1("%1% (%2/%3)").arg(ploss, 0, 'f', 1).arg(uiRecv).arg(uiSent)); if (uiRecv > 0) { qs += QString::fromLatin1("").arg(ConnectDialog::tr("Ping (80%)"), ConnectDialog::tr("%1 ms"). arg(boost::accumulators::extended_p_square(* asQuantile)[1] / 1000., 0, 'f', 2)) + QString::fromLatin1("").arg(ConnectDialog::tr("Ping (95%)"), ConnectDialog::tr("%1 ms"). arg(boost::accumulators::extended_p_square(* asQuantile)[2] / 1000., 0, 'f', 2)) + QString::fromLatin1("").arg(ConnectDialog::tr("Bandwidth"), ConnectDialog::tr("%1 kbit/s").arg(uiBandwidth / 1000)) + QString::fromLatin1("").arg(ConnectDialog::tr("Users"), QString::fromLatin1("%1/%2").arg(uiUsers).arg(uiMaxUsers)) + QString::fromLatin1("").arg(ConnectDialog::tr("Version")).arg(MumbleVersion::toString(uiVersion)); } } qs += QLatin1String("
    %1%2
    %1%2
    %1%2
    %1%2
    %1%2
    %1%2
    %1%2
    %1%2
    %1%2
    %1%2
    %1%2
    %1%2
    "); return qs; } else if (role == Qt::BackgroundRole) { if (bCA) { QColor qc(Qt::green); qc.setAlpha(32); return qc; } } } return QTreeWidgetItem::data(column, role); } void ServerItem::addServerItem(ServerItem *childitem) { Q_ASSERT(childitem->siParent == NULL); childitem->siParent = this; qlChildren.append(childitem); childitem->hideCheck(); if (bParent && (itType != PublicType) && isHidden()) setHidden(false); } // If all child items are hidden, there is no child indicator, regardless of policy, so we have to add/remove instead. void ServerItem::hideCheck() { bool hide = false; bool ishidden = (parent() == NULL); if (! bParent && (itType == PublicType)) { if (g.s.ssFilter == Settings::ShowReachable) hide = (dPing == 0.0); else if (g.s.ssFilter == Settings::ShowPopulated) hide = (uiUsers == 0); } if (hide != ishidden) { if (hide) siParent->removeChild(this); else siParent->addChild(this); } } void ServerItem::setDatas(double elapsed, quint32 users, quint32 maxusers) { if (elapsed == 0.0) { emitDataChanged(); return; } (*asQuantile)(static_cast(elapsed)); dPing = boost::accumulators::extended_p_square(*asQuantile)[0]; if (dPing == 0.0) dPing = elapsed; quint32 ping = static_cast(lround(dPing / 1000.)); uiRecv = static_cast(boost::accumulators::count(* asQuantile)); bool changed = (ping != uiPing) || (users != uiUsers) || (maxusers != uiMaxUsers); uiUsers = users; uiMaxUsers = maxusers; uiPing = ping; double grace = qMax(5000., 50. * uiPingSort); double diff = fabs(1000. * uiPingSort - dPing); if ((uiPingSort == 0) || ((uiSent >= 10) && (diff >= grace))) uiPingSort = ping; if (changed) emitDataChanged(); } FavoriteServer ServerItem::toFavoriteServer() const { FavoriteServer fs; fs.qsName = qsName; if (! qsBonjourHost.isEmpty()) fs.qsHostname = QLatin1Char('@') + qsBonjourHost; else fs.qsHostname = qsHostname; fs.usPort = usPort; fs.qsUsername = qsUsername; fs.qsPassword = qsPassword; fs.qsUrl = qsUrl; return fs; } /** * This function turns a ServerItem object into a QMimeData object holding a URL to the server. */ QMimeData *ServerItem::toMimeData() const { QMimeData *mime = ServerItem::toMimeData(qsName, qsHostname, usPort); if (itType == FavoriteType) mime->setData(QLatin1String("OriginatedInMumble"), QByteArray()); return mime; } /** * This function creates a QMimeData object containing a URL to the server at host and port. name is passed in the * query string as "title", which is used for adding a server to favorites. channel may be omitted, but if specified it * should be in the format of "/path/to/channel". */ QMimeData *ServerItem::toMimeData(const QString &name, const QString &host, unsigned short port, const QString &channel) { QUrl url; url.setScheme(QLatin1String("mumble")); url.setHost(host); if (port != DEFAULT_MUMBLE_PORT) url.setPort(port); url.setPath(channel); #if QT_VERSION >= 0x050000 QUrlQuery query; query.addQueryItem(QLatin1String("title"), name); query.addQueryItem(QLatin1String("version"), QLatin1String("1.2.0")); url.setQuery(query); #else url.addQueryItem(QLatin1String("title"), name); url.addQueryItem(QLatin1String("version"), QLatin1String("1.2.0")); #endif QString qs = QLatin1String(url.toEncoded()); QMimeData *mime = new QMimeData; #ifdef Q_OS_WIN QString contents = QString::fromLatin1("[InternetShortcut]\r\nURL=%1\r\n").arg(qs); QString urlname = QString::fromLatin1("%1.url").arg(name); FILEGROUPDESCRIPTORA fgda; ZeroMemory(&fgda, sizeof(fgda)); fgda.cItems = 1; fgda.fgd[0].dwFlags = FD_LINKUI | FD_FILESIZE; fgda.fgd[0].nFileSizeLow=contents.length(); strcpy_s(fgda.fgd[0].cFileName, MAX_PATH, urlname.toLocal8Bit().constData()); mime->setData(QLatin1String("FileGroupDescriptor"), QByteArray(reinterpret_cast(&fgda), sizeof(fgda))); FILEGROUPDESCRIPTORW fgdw; ZeroMemory(&fgdw, sizeof(fgdw)); fgdw.cItems = 1; fgdw.fgd[0].dwFlags = FD_LINKUI | FD_FILESIZE; fgdw.fgd[0].nFileSizeLow=contents.length(); wcscpy_s(fgdw.fgd[0].cFileName, MAX_PATH, urlname.toStdWString().c_str()); mime->setData(QLatin1String("FileGroupDescriptorW"), QByteArray(reinterpret_cast(&fgdw), sizeof(fgdw))); mime->setData(QString::fromWCharArray(CFSTR_FILECONTENTS), contents.toLocal8Bit()); DWORD context[4]; context[0] = 0; context[1] = 1; context[2] = 0; context[3] = 0; mime->setData(QLatin1String("DragContext"), QByteArray(reinterpret_cast(&context[0]), sizeof(context))); DWORD dropaction; dropaction = DROPEFFECT_LINK; mime->setData(QString::fromWCharArray(CFSTR_PREFERREDDROPEFFECT), QByteArray(reinterpret_cast(&dropaction), sizeof(dropaction))); #endif QList urls; urls << url; mime->setUrls(urls); mime->setText(qs); mime->setHtml(QString::fromLatin1("%2").arg(qs).arg(Qt::escape(name))); return mime; } bool ServerItem::operator <(const QTreeWidgetItem &o) const { const ServerItem &other = static_cast(o); const QTreeWidget *w = treeWidget(); const int column = w ? w->sortColumn() : 0; if (itType != other.itType) { const bool inverse = w ? (w->header()->sortIndicatorOrder() == Qt::DescendingOrder) : false; bool less; if (itType == FavoriteType) less = true; else if ((itType == LANType) && (other.itType == PublicType)) less = true; else less = false; return less ^ inverse; } if (bParent) { const bool inverse = w ? (w->header()->sortIndicatorOrder() == Qt::DescendingOrder) : false; return (qsName < other.qsName) ^ inverse; } if (column == 0) { QString a = qsName.toLower(); QString b = other.qsName.toLower(); QRegExp re(QLatin1String("[^0-9a-z]")); a.remove(re); b.remove(re); return a < b; } else if (column == 1) { quint32 a = uiPingSort ? uiPingSort : UINT_MAX; quint32 b = other.uiPingSort ? other.uiPingSort : UINT_MAX; return a < b; } else if (column == 2) { return uiUsers < other.uiUsers; } return false; } QIcon ServerItem::loadIcon(const QString &name) { if (! qmIcons.contains(name)) qmIcons.insert(name, QIcon(name)); return qmIcons.value(name); } ConnectDialogEdit::ConnectDialogEdit(QWidget *p, const QString &name, const QString &host, const QString &user, unsigned short port, const QString &password) : QDialog(p) { setupUi(this); init(); bCustomLabel = ! name.simplified().isEmpty(); qleName->setText(name); qleServer->setText(host); qleUsername->setText(user); qlePort->setText(QString::number(port)); qlePassword->setText(password); validate(); } ConnectDialogEdit::ConnectDialogEdit(QWidget *parent) : QDialog(parent) { setupUi(this); setWindowTitle(tr("Add Server")); init(); if (!updateFromClipboard()) { // If connected to a server assume the user wants to add it if (g.sh && g.sh->isRunning()) { QString host, name, user, pw; unsigned short port = DEFAULT_MUMBLE_PORT; g.sh->getConnectionInfo(host, port, user, pw); Channel *c = Channel::get(0); if (c && c->qsName != QLatin1String("Root")) { name = c->qsName; } showNotice(tr("You are currently connected to a server.\nDo you want to fill the dialog with the connection data of this server?\nHost: %1 Port: %2").arg(host).arg(port)); m_si = new ServerItem(name, host, port, user, pw); } } qleUsername->setText(g.s.qsUsername); } void ConnectDialogEdit::init() { m_si = NULL; usPort = 0; bOk = true; bCustomLabel = false; qwInlineNotice->hide(); qlePort->setValidator(new QIntValidator(1, 65535, qlePort)); qlePort->setText(QString::number(DEFAULT_MUMBLE_PORT)); qlePassword->setEchoMode(QLineEdit::Password); connect(qleName, SIGNAL(textChanged(const QString &)), this, SLOT(validate())); connect(qleServer, SIGNAL(textChanged(const QString &)), this, SLOT(validate())); connect(qlePort, SIGNAL(textChanged(const QString &)), this, SLOT(validate())); connect(qleUsername, SIGNAL(textChanged(const QString &)), this, SLOT(validate())); connect(qlePassword, SIGNAL(textChanged(const QString &)), this, SLOT(validate())); validate(); } ConnectDialogEdit::~ConnectDialogEdit() { delete m_si; } void ConnectDialogEdit::showNotice(const QString &text) { QLabel *label = qwInlineNotice->findChild(QLatin1String("qlPasteNotice")); Q_ASSERT(label); label->setText(text); qwInlineNotice->show(); adjustSize(); } bool ConnectDialogEdit::updateFromClipboard() { delete m_si; m_si = ServerItem::fromMimeData(QApplication::clipboard()->mimeData(), false, NULL, true); bool hasServerData = m_si != NULL; if (hasServerData) { showNotice(tr("You have an URL in your clipboard.\nDo you want to fill the dialog with this data?\nHost: %1 Port: %2").arg(m_si->qsHostname).arg(m_si->usPort)); return true; } else { qwInlineNotice->hide(); adjustSize(); return false; } } void ConnectDialogEdit::on_qbFill_clicked() { Q_ASSERT(m_si); qwInlineNotice->hide(); adjustSize(); qleName->setText(m_si->qsName); qleServer->setText(m_si->qsHostname); qleUsername->setText(m_si->qsUsername); qlePort->setText(QString::number(m_si->usPort)); qlePassword->setText(m_si->qsPassword); delete m_si; m_si = NULL; } void ConnectDialogEdit::on_qbDiscard_clicked() { qwInlineNotice->hide(); adjustSize(); } void ConnectDialogEdit::on_qleName_textEdited(const QString& name) { if (bCustomLabel) { // If empty, then reset to automatic label. // NOTE(nik@jnstw.us): You may be tempted to set qleName to qleServer, but that results in the odd // UI behavior that clearing the field doesn't clear it; it'll immediately equal qleServer. Instead, // leave it empty and let it update the next time qleServer updates. Code in accept will default it // to qleServer if it isn't updated beforehand. if (name.simplified().isEmpty()) { bCustomLabel = false; } } else { // If manually edited, set to Custom bCustomLabel = true; } } void ConnectDialogEdit::on_qleServer_textEdited(const QString& server) { // If using automatic label, update it if (!bCustomLabel) { qleName->setText(server); } } void ConnectDialogEdit::validate() { qsName = qleName->text().simplified(); qsHostname = qleServer->text().simplified(); usPort = qlePort->text().toUShort(); qsUsername = qleUsername->text().simplified(); qsPassword = qlePassword->text(); // For bonjour hosts disable the port field as it's auto-detected qlePort->setDisabled(!qsHostname.isEmpty() && qsHostname.startsWith(QLatin1Char('@'))); // For SuperUser show password edit if (qsUsername.toLower() == QLatin1String("superuser")) { qliPassword->setVisible(true); qlePassword->setVisible(true); qcbShowPassword->setVisible(true); adjustSize(); } else if (qsPassword.isEmpty()) { qliPassword->setVisible(false); qlePassword->setVisible(false); qcbShowPassword->setVisible(false); adjustSize(); } bOk = ! qsHostname.isEmpty() && ! qsUsername.isEmpty() && usPort; qdbbButtonBox->button(QDialogButtonBox::Ok)->setEnabled(bOk); } void ConnectDialogEdit::accept() { validate(); if (bOk) { QString server = qleServer->text().simplified(); // If the user accidentally added a schema or path part, drop it now. // We can't do so during editing as that is quite jarring. const int schemaPos = server.indexOf(QLatin1String("://")); if (schemaPos != -1) { server.remove(0, schemaPos + 3); } const int pathPos = server.indexOf(QLatin1Char('/')); if (pathPos != -1) { server.resize(pathPos); } qleServer->setText(server); if (qleName->text().simplified().isEmpty() || !bCustomLabel) { qleName->setText(server); } QDialog::accept(); } } void ConnectDialogEdit::on_qcbShowPassword_toggled(bool checked) { qlePassword->setEchoMode(checked ? QLineEdit::Normal : QLineEdit::Password); } ConnectDialog::ConnectDialog(QWidget *p, bool autoconnect) : QDialog(p), bAutoConnect(autoconnect) { setupUi(this); #ifdef Q_OS_MAC setWindowModality(Qt::WindowModal); #endif bPublicInit = false; siAutoConnect = NULL; bAllowPing = g.s.ptProxyType == Settings::NoProxy; bAllowHostLookup = g.s.ptProxyType == Settings::NoProxy; bAllowBonjour = g.s.ptProxyType == Settings::NoProxy; bAllowFilters = g.s.ptProxyType == Settings::NoProxy; if (tPublicServers.elapsed() >= 60 * 24 * 1000000ULL) { qlPublicServers.clear(); } qdbbButtonBox->button(QDialogButtonBox::Ok)->setEnabled(false); qdbbButtonBox->button(QDialogButtonBox::Ok)->setText(tr("&Connect")); QPushButton *qpbAdd = new QPushButton(tr("&Add New..."), this); qpbAdd->setDefault(false); qpbAdd->setAutoDefault(false); connect(qpbAdd, SIGNAL(clicked()), qaFavoriteAddNew, SIGNAL(triggered())); qdbbButtonBox->addButton(qpbAdd, QDialogButtonBox::ActionRole); qpbEdit = new QPushButton(tr("&Edit..."), this); qpbEdit->setEnabled(false); qpbEdit->setDefault(false); qpbEdit->setAutoDefault(false); connect(qpbEdit, SIGNAL(clicked()), qaFavoriteEdit, SIGNAL(triggered())); qdbbButtonBox->addButton(qpbEdit, QDialogButtonBox::ActionRole); qpbAdd->setHidden(g.s.disableConnectDialogEditing); qpbEdit->setHidden(g.s.disableConnectDialogEditing); qtwServers->setItemDelegate(new ServerViewDelegate()); // Hide ping and user count if we are not allowed to ping. if (!bAllowPing) { qtwServers->setColumnCount(1); } qtwServers->sortItems(1, Qt::AscendingOrder); #if QT_VERSION >= 0x050000 qtwServers->header()->setSectionResizeMode(0, QHeaderView::Stretch); if (qtwServers->columnCount() >= 2) { qtwServers->header()->setSectionResizeMode(1, QHeaderView::ResizeToContents); } if (qtwServers->columnCount() >= 3) { qtwServers->header()->setSectionResizeMode(2, QHeaderView::ResizeToContents); } #else qtwServers->header()->setResizeMode(0, QHeaderView::Stretch); if (qtwServers->columnCount() >= 2) { qtwServers->header()->setResizeMode(1, QHeaderView::ResizeToContents); } if (qtwServers->columnCount() >= 3) { qtwServers->header()->setResizeMode(2, QHeaderView::ResizeToContents); } #endif connect(qtwServers->header(), SIGNAL(sortIndicatorChanged(int, Qt::SortOrder)), this, SLOT(OnSortChanged(int, Qt::SortOrder))); qaShowAll->setChecked(false); qaShowReachable->setChecked(false); qaShowPopulated->setChecked(false); if (bAllowFilters) { switch (g.s.ssFilter) { case Settings::ShowPopulated: qaShowPopulated->setChecked(true); break; case Settings::ShowReachable: qaShowReachable->setChecked(true); break; default: qaShowAll->setChecked(true); break; } } else { qaShowAll->setChecked(true); } qagFilters = new QActionGroup(this); qagFilters->addAction(qaShowAll); qagFilters->addAction(qaShowReachable); qagFilters->addAction(qaShowPopulated); connect(qagFilters, SIGNAL(triggered(QAction *)), this, SLOT(onFiltersTriggered(QAction *))); qmPopup = new QMenu(this); qmFilters = new QMenu(tr("&Filters"), this); qmFilters->addAction(qaShowAll); qmFilters->addAction(qaShowReachable); qmFilters->addAction(qaShowPopulated); if (!bAllowFilters) { qmFilters->setEnabled(false); } QList ql; QList favorites = g.db->getFavorites(); foreach(const FavoriteServer &fs, favorites) { ServerItem *si = new ServerItem(fs); qlItems << si; startDns(si); qtwServers->siFavorite->addServerItem(si); } #ifdef USE_BONJOUR // Make sure the we got the objects we need, then wire them up if (bAllowBonjour && g.bc->bsbBrowser && g.bc->bsrResolver) { connect(g.bc->bsbBrowser, SIGNAL(error(DNSServiceErrorType)), this, SLOT(onLanBrowseError(DNSServiceErrorType))); connect(g.bc->bsbBrowser, SIGNAL(currentBonjourRecordsChanged(const QList &)), this, SLOT(onUpdateLanList(const QList &))); connect(g.bc->bsrResolver, SIGNAL(error(BonjourRecord, DNSServiceErrorType)), this, SLOT(onLanResolveError(BonjourRecord, DNSServiceErrorType))); connect(g.bc->bsrResolver, SIGNAL(bonjourRecordResolved(BonjourRecord, QString, int)), this, SLOT(onResolved(BonjourRecord, QString, int))); onUpdateLanList(g.bc->bsbBrowser->currentRecords()); } #endif qtPingTick = new QTimer(this); connect(qtPingTick, SIGNAL(timeout()), this, SLOT(timeTick())); qusSocket4 = new QUdpSocket(this); qusSocket6 = new QUdpSocket(this); bIPv4 = qusSocket4->bind(QHostAddress(QHostAddress::Any), 0); bIPv6 = qusSocket6->bind(QHostAddress(QHostAddress::AnyIPv6), 0); connect(qusSocket4, SIGNAL(readyRead()), this, SLOT(udpReply())); connect(qusSocket6, SIGNAL(readyRead()), this, SLOT(udpReply())); if (qtwServers->siFavorite->isHidden() && (!qtwServers->siLAN || qtwServers->siLAN->isHidden()) && qtwServers->siPublic != NULL) { qtwServers->siPublic->setExpanded(true); } iPingIndex = -1; qtPingTick->start(50); new QShortcut(QKeySequence(QKeySequence::Copy), this, SLOT(on_qaFavoriteCopy_triggered())); new QShortcut(QKeySequence(QKeySequence::Paste), this, SLOT(on_qaFavoritePaste_triggered())); qtwServers->setCurrentItem(NULL); bLastFound = false; qmPingCache = g.db->getPingCache(); if (! g.s.qbaConnectDialogGeometry.isEmpty()) restoreGeometry(g.s.qbaConnectDialogGeometry); if (! g.s.qbaConnectDialogHeader.isEmpty()) qtwServers->header()->restoreState(g.s.qbaConnectDialogHeader); } ConnectDialog::~ConnectDialog() { ServerItem::qmIcons.clear(); QList ql; qmPingCache.clear(); foreach(ServerItem *si, qlItems) { if (si->uiPing) qmPingCache.insert(UnresolvedServerAddress(si->qsHostname, si->usPort), si->uiPing); if (si->itType != ServerItem::FavoriteType) continue; ql << si->toFavoriteServer(); } g.db->setFavorites(ql); g.db->setPingCache(qmPingCache); g.s.qbaConnectDialogHeader = qtwServers->header()->saveState(); g.s.qbaConnectDialogGeometry = saveGeometry(); } void ConnectDialog::accept() { ServerItem *si = static_cast(qtwServers->currentItem()); if (! si || (bAllowHostLookup && si->qlAddresses.isEmpty()) || si->qsHostname.isEmpty()) { qWarning() << "Invalid server"; return; } qsPassword = si->qsPassword; qsServer = si->qsHostname; usPort = si->usPort; if (si->qsUsername.isEmpty()) { bool ok; QString defUserName = QInputDialog::getText(this, tr("Connecting to %1").arg(si->qsName), tr("Enter username"), QLineEdit::Normal, g.s.qsUsername, &ok).trimmed(); if (! ok) return; g.s.qsUsername = si->qsUsername = defUserName; } qsUsername = si->qsUsername; g.s.qsLastServer = si->qsName; QDialog::accept(); } void ConnectDialog::OnSortChanged(int logicalIndex, Qt::SortOrder) { if (logicalIndex != 2) { return; } foreach(ServerItem *si, qlItems) { if (si->uiPing && (si->uiPing != si->uiPingSort)) { si->uiPingSort = si->uiPing; si->setDatas(); } } } void ConnectDialog::on_qaFavoriteAdd_triggered() { ServerItem *si = static_cast(qtwServers->currentItem()); if (! si || (si->itType == ServerItem::FavoriteType)) return; si = new ServerItem(si); qtwServers->fixupName(si); qlItems << si; qtwServers->siFavorite->addServerItem(si); qtwServers->setCurrentItem(si); startDns(si); } void ConnectDialog::on_qaFavoriteAddNew_triggered() { ConnectDialogEdit *cde = new ConnectDialogEdit(this); if (cde->exec() == QDialog::Accepted) { ServerItem *si = new ServerItem(cde->qsName, cde->qsHostname, cde->usPort, cde->qsUsername, cde->qsPassword); qlItems << si; qtwServers->siFavorite->addServerItem(si); qtwServers->setCurrentItem(si); startDns(si); } delete cde; } void ConnectDialog::on_qaFavoriteEdit_triggered() { ServerItem *si = static_cast(qtwServers->currentItem()); if (! si || (si->itType != ServerItem::FavoriteType)) return; QString host; if (! si->qsBonjourHost.isEmpty()) host = QLatin1Char('@') + si->qsBonjourHost; else host = si->qsHostname; ConnectDialogEdit *cde = new ConnectDialogEdit(this, si->qsName, host, si->qsUsername, si->usPort, si->qsPassword); if (cde->exec() == QDialog::Accepted) { si->qsName = cde->qsName; si->qsUsername = cde->qsUsername; si->qsPassword = cde->qsPassword; if ((cde->qsHostname != host) || (cde->usPort != si->usPort)) { stopDns(si); si->qlAddresses.clear(); si->reset(); si->usPort = cde->usPort; if (cde->qsHostname.startsWith(QLatin1Char('@'))) { si->qsHostname = QString(); si->qsBonjourHost = cde->qsHostname.mid(1); si->brRecord = BonjourRecord(si->qsBonjourHost, QLatin1String("_mumble._tcp."), QLatin1String("local.")); } else { si->qsHostname = cde->qsHostname; si->qsBonjourHost = QString(); si->brRecord = BonjourRecord(); } startDns(si); } si->setDatas(); } delete cde; } void ConnectDialog::on_qaFavoriteRemove_triggered() { ServerItem *si = static_cast(qtwServers->currentItem()); if (! si || (si->itType != ServerItem::FavoriteType)) return; stopDns(si); qlItems.removeAll(si); delete si; } void ConnectDialog::on_qaFavoriteCopy_triggered() { ServerItem *si = static_cast(qtwServers->currentItem()); if (! si) return; QApplication::clipboard()->setMimeData(si->toMimeData()); } void ConnectDialog::on_qaFavoritePaste_triggered() { ServerItem *si = ServerItem::fromMimeData(QApplication::clipboard()->mimeData()); if (! si) return; qlItems << si; qtwServers->siFavorite->addServerItem(si); qtwServers->setCurrentItem(si); startDns(si); } void ConnectDialog::on_qaUrl_triggered() { auto *si = static_cast< const ServerItem * >(qtwServers->currentItem()); if (!si || si->qsUrl.isEmpty()) { return; } const QStringList allowedSchemes = { QLatin1String("http"), QLatin1String("https") }; const auto url = QUrl(si->qsUrl); if (allowedSchemes.contains(url.scheme())) { QDesktopServices::openUrl(url); } else { // Inform user that the requested URL has been blocked QMessageBox msgBox; msgBox.setText(QObject::tr("Blocked URL scheme \"%1\"").arg(url.scheme())); msgBox.setInformativeText(QObject::tr("The URL uses a scheme that has been blocked for security reasons.")); msgBox.setDetailedText(QObject::tr("Blocked URL: \"%1\"").arg(url.toString())); msgBox.setIcon(QMessageBox::Warning); msgBox.exec(); } } void ConnectDialog::onFiltersTriggered(QAction *act) { if (act == qaShowAll) g.s.ssFilter = Settings::ShowAll; else if (act == qaShowReachable) g.s.ssFilter = Settings::ShowReachable; else if (act == qaShowPopulated) g.s.ssFilter = Settings::ShowPopulated; foreach(ServerItem *si, qlItems) si->hideCheck(); } void ConnectDialog::on_qtwServers_customContextMenuRequested(const QPoint &mpos) { ServerItem *si = static_cast(qtwServers->itemAt(mpos)); qmPopup->clear(); if (si != NULL && si->bParent) { si = NULL; } if (si != NULL) { if (!g.s.disableConnectDialogEditing) { if (si->itType == ServerItem::FavoriteType) { qmPopup->addAction(qaFavoriteEdit); qmPopup->addAction(qaFavoriteRemove); } else { qmPopup->addAction(qaFavoriteAdd); } } if (!si->qsUrl.isEmpty()) { qmPopup->addAction(qaUrl); } } if (! qmPopup->isEmpty()) { qmPopup->addSeparator(); } qmPopup->addMenu(qmFilters); qmPopup->popup(qtwServers->viewport()->mapToGlobal(mpos), NULL); } void ConnectDialog::on_qtwServers_itemDoubleClicked(QTreeWidgetItem *item, int) { qtwServers->setCurrentItem(item); accept(); } void ConnectDialog::on_qtwServers_currentItemChanged(QTreeWidgetItem *item, QTreeWidgetItem *) { ServerItem *si = static_cast(item); if (si->siParent == qtwServers->siFavorite) { qpbEdit->setEnabled(true); } else { qpbEdit->setEnabled(false); } bool bOk = !si->qlAddresses.isEmpty(); if (!bAllowHostLookup) { bOk = true; } qdbbButtonBox->button(QDialogButtonBox::Ok)->setEnabled(bOk); bLastFound = true; } void ConnectDialog::on_qtwServers_itemExpanded(QTreeWidgetItem *item) { if (qtwServers->siPublic != NULL && item == qtwServers->siPublic) { initList(); fillList(); } ServerItem *p = static_cast(item); foreach(ServerItem *si, p->qlChildren) startDns(si); } void ConnectDialog::initList() { if (bPublicInit || (qlPublicServers.count() > 0)) return; bPublicInit = true; QUrl url; url.setPath(QLatin1String("/v1/list")); #if QT_VERSION >= 0x050000 QUrlQuery query; query.addQueryItem(QLatin1String("version"), QLatin1String(MUMTEXT(MUMBLE_VERSION_STRING))); url.setQuery(query); #else url.addQueryItem(QLatin1String("version"), QLatin1String(MUMTEXT(MUMBLE_VERSION_STRING))); #endif WebFetch::fetch(QLatin1String("publist"), url, this, SLOT(fetched(QByteArray,QUrl,QMap))); } #ifdef USE_BONJOUR void ConnectDialog::onResolved(BonjourRecord record, QString host, int port) { qlBonjourActive.removeAll(record); foreach(ServerItem *si, qlItems) { if (si->brRecord == record) { unsigned short usport = static_cast(port); if ((host != si->qsHostname) || (usport != si->usPort)) { stopDns(si); si->usPort = static_cast(port); si->qsHostname = host; startDns(si); } } } } void ConnectDialog::onUpdateLanList(const QList &list) { QSet items; QSet old = qtwServers->siLAN->qlChildren.toSet(); foreach(const BonjourRecord &record, list) { bool found = false; foreach(ServerItem *si, old) { if (si->brRecord == record) { items.insert(si); found = true; break; } } if (! found) { ServerItem *si = new ServerItem(record); qlItems << si; g.bc->bsrResolver->resolveBonjourRecord(record); startDns(si); qtwServers->siLAN->addServerItem(si); } } QSet remove = old.subtract(items); foreach(ServerItem *si, remove) { stopDns(si); qlItems.removeAll(si); delete si; } } void ConnectDialog::onLanBrowseError(DNSServiceErrorType err) { qWarning()<<"Bonjour reported browser error "<< err; } void ConnectDialog::onLanResolveError(BonjourRecord br, DNSServiceErrorType err) { qlBonjourActive.removeAll(br); qWarning()<<"Bonjour reported resolver error "<< err; } #endif void ConnectDialog::fillList() { QList ql; QList qlNew; foreach(const PublicInfo &pi, qlPublicServers) { bool found = false; foreach(ServerItem *si, qlItems) { if ((pi.qsIp == si->qsHostname) && (pi.usPort == si->usPort)) { si->qsCountry = pi.qsCountry; si->qsCountryCode = pi.qsCountryCode; si->qsContinentCode = pi.qsContinentCode; si->qsUrl = pi.quUrl.toString(); si->bCA = pi.bCA; si->setDatas(); if (si->itType == ServerItem::PublicType) found = true; } } if (! found) ql << new ServerItem(pi); } while (! ql.isEmpty()) { ServerItem *si = static_cast(ql.takeAt(qrand() % ql.count())); qlNew << si; qlItems << si; } foreach(QTreeWidgetItem *qtwi, qlNew) { ServerItem *si = static_cast(qtwi); ServerItem *p = qtwServers->getParent(si->qsContinentCode, si->qsCountryCode, si->qsCountry, qsUserContinentCode, qsUserCountryCode); p->addServerItem(si); if (p->isExpanded() && p->parent()->isExpanded()) startDns(si); } } void ConnectDialog::timeTick() { if (! bLastFound && ! g.s.qsLastServer.isEmpty()) { QList items = qtwServers->findItems(g.s.qsLastServer, Qt::MatchExactly | Qt::MatchRecursive); if (!items.isEmpty()) { bLastFound = true; qtwServers->setCurrentItem(items.at(0)); if (g.s.bAutoConnect && bAutoConnect) { siAutoConnect = static_cast(items.at(0)); if (! siAutoConnect->qlAddresses.isEmpty()) { accept(); return; } else if (!bAllowHostLookup) { accept(); return; } } } } if (bAllowHostLookup) { // Start DNS Lookup of first unknown hostname foreach(const UnresolvedServerAddress &unresolved, qlDNSLookup) { if (qsDNSActive.contains(unresolved)) { continue; } qlDNSLookup.removeAll(unresolved); qlDNSLookup.append(unresolved); qsDNSActive.insert(unresolved); ServerResolver *sr = new ServerResolver(); QObject::connect(sr, SIGNAL(resolved()), this, SLOT(lookedUp())); sr->resolve(unresolved.hostname, unresolved.port); break; } } ServerItem *current = static_cast(qtwServers->currentItem()); ServerItem *hover = static_cast(qtwServers->itemAt(qtwServers->viewport()->mapFromGlobal(QCursor::pos()))); ServerItem *si = NULL; if (tCurrent.elapsed() >= 1000000ULL) si = current; if (! si && (tHover.elapsed() >= 1000000ULL)) si = hover; if (si) { QString hostname = si->qsHostname.toLower(); unsigned short port = si->usPort; UnresolvedServerAddress unresolved(hostname, port); if (si->qlAddresses.isEmpty()) { if (! hostname.isEmpty()) { qlDNSLookup.removeAll(unresolved); qlDNSLookup.prepend(unresolved); } si = NULL; } } if (!si) { if (qlItems.isEmpty()) return; bool expanded; do { ++iPingIndex; if (iPingIndex >= qlItems.count()) { if (tRestart.isElapsed(1000000ULL)) iPingIndex = 0; else return; } si = qlItems.at(iPingIndex); ServerItem *p = si->siParent; expanded = true; while (p && expanded) { expanded = expanded && p->isExpanded(); p = p->siParent; } } while (si->qlAddresses.isEmpty() || ! expanded); } if (si == current) tCurrent.restart(); if (si == hover) tHover.restart(); foreach(const ServerAddress &addr, si->qlAddresses) { sendPing(addr.host.toAddress(), addr.port); } } void ConnectDialog::startDns(ServerItem *si) { if (!bAllowHostLookup) { return; } QString hostname = si->qsHostname.toLower(); unsigned short port = si->usPort; UnresolvedServerAddress unresolved(hostname, port); if (si->qlAddresses.isEmpty()) { // Determine if qsHostname is an IP address // or a hostname. If it is an IP address, we // can treat it as resolved as-is. QHostAddress qha(si->qsHostname); bool hostnameIsIPAddress = !qha.isNull(); if (hostnameIsIPAddress) { si->qlAddresses.append(ServerAddress(HostAddress(qha), port)); } else { si->qlAddresses = qhDNSCache.value(unresolved); } } if (qtwServers->currentItem() == si) qdbbButtonBox->button(QDialogButtonBox::Ok)->setEnabled(! si->qlAddresses.isEmpty()); if (! si->qlAddresses.isEmpty()) { foreach(const ServerAddress &addr, si->qlAddresses) { qhPings[addr].insert(si); } return; } #ifdef USE_BONJOUR if (bAllowBonjour && si->qsHostname.isEmpty() && ! si->brRecord.serviceName.isEmpty()) { if (! qlBonjourActive.contains(si->brRecord)) { g.bc->bsrResolver->resolveBonjourRecord(si->brRecord); qlBonjourActive.append(si->brRecord); } return; } #endif if (! qhDNSWait.contains(unresolved)) { if (si->itType == ServerItem::PublicType) qlDNSLookup.append(unresolved); else qlDNSLookup.prepend(unresolved); } qhDNSWait[unresolved].insert(si); } void ConnectDialog::stopDns(ServerItem *si) { if (!bAllowHostLookup) { return; } foreach(const ServerAddress &addr, si->qlAddresses) { if (qhPings.contains(addr)) { qhPings[addr].remove(si); if (qhPings[addr].isEmpty()) { qhPings.remove(addr); qhPingRand.remove(addr); } } } QString hostname = si->qsHostname.toLower(); unsigned short port = si->usPort; UnresolvedServerAddress unresolved(hostname, port); if (qhDNSWait.contains(unresolved)) { qhDNSWait[unresolved].remove(si); if (qhDNSWait[unresolved].isEmpty()) { qhDNSWait.remove(unresolved); qlDNSLookup.removeAll(unresolved); } } } void ConnectDialog::lookedUp() { ServerResolver *sr = qobject_cast(QObject::sender()); sr->deleteLater(); QString hostname = sr->hostname().toLower(); unsigned short port = sr->port(); UnresolvedServerAddress unresolved(hostname, port); qsDNSActive.remove(unresolved); // An error occurred, or no records were found. if (sr->records().size() == 0) { return; } QSet qs; foreach (ServerResolverRecord record, sr->records()) { foreach(const HostAddress &ha, record.addresses()) { qs.insert(ServerAddress(ha, record.port())); } } QSet waiting = qhDNSWait[unresolved]; foreach(ServerItem *si, waiting) { foreach (const ServerAddress &addr, qs) { qhPings[addr].insert(si); } si->qlAddresses = qs.toList(); } qlDNSLookup.removeAll(unresolved); qhDNSCache.insert(unresolved, qs.toList()); qhDNSWait.remove(unresolved); foreach(ServerItem *si, waiting) { if (si == qtwServers->currentItem()) { on_qtwServers_currentItemChanged(si, si); if (si == siAutoConnect) accept(); } } if (bAllowPing) { foreach(const ServerAddress &addr, qs) { sendPing(addr.host.toAddress(), addr.port); } } } void ConnectDialog::sendPing(const QHostAddress &host, unsigned short port) { char blob[16]; ServerAddress addr(HostAddress(host), port); quint64 uiRand; if (qhPingRand.contains(addr)) { uiRand = qhPingRand.value(addr); } else { uiRand = (static_cast(qrand()) << 32) | static_cast(qrand()); qhPingRand.insert(addr, uiRand); } memset(blob, 0, sizeof(blob)); * reinterpret_cast(blob+8) = tPing.elapsed() ^ uiRand; if (bIPv4 && host.protocol() == QAbstractSocket::IPv4Protocol) qusSocket4->writeDatagram(blob+4, 12, host, port); else if (bIPv6 && host.protocol() == QAbstractSocket::IPv6Protocol) qusSocket6->writeDatagram(blob+4, 12, host, port); else return; const QSet &qs = qhPings.value(addr); foreach(ServerItem *si, qs) ++ si->uiSent; } void ConnectDialog::udpReply() { QUdpSocket *sock = qobject_cast(sender()); while (sock->hasPendingDatagrams()) { char blob[64]; QHostAddress host; unsigned short port; qint64 len = sock->readDatagram(blob+4, 24, &host, &port); if (len == 24) { if (host.scopeId() == QLatin1String("0")) host.setScopeId(QLatin1String("")); ServerAddress address(HostAddress(host), port); if (qhPings.contains(address)) { quint32 *ping = reinterpret_cast(blob+4); quint64 *ts = reinterpret_cast(blob+8); quint64 elapsed = tPing.elapsed() - (*ts ^ qhPingRand.value(address)); foreach(ServerItem *si, qhPings.value(address)) { si->uiVersion = qFromBigEndian(ping[0]); quint32 users = qFromBigEndian(ping[3]); quint32 maxusers = qFromBigEndian(ping[4]); si->uiBandwidth = qFromBigEndian(ping[5]); if (! si->uiPingSort) si->uiPingSort = qmPingCache.value(UnresolvedServerAddress(si->qsHostname, si->usPort)); si->setDatas(static_cast(elapsed), users, maxusers); si->hideCheck(); } } } } } void ConnectDialog::fetched(QByteArray xmlData, QUrl, QMap headers) { if (xmlData.isNull()) { QMessageBox::warning(this, QLatin1String("Mumble"), tr("Failed to fetch server list"), QMessageBox::Ok); return; } QDomDocument doc; doc.setContent(xmlData); qlPublicServers.clear(); qsUserCountry = headers.value(QLatin1String("Geo-Country")); qsUserCountryCode = headers.value(QLatin1String("Geo-Country-Code")).toLower(); qsUserContinentCode = headers.value(QLatin1String("Geo-Continent-Code")).toLower(); QDomElement root=doc.documentElement(); QDomNode n = root.firstChild(); while (!n.isNull()) { QDomElement e = n.toElement(); if (!e.isNull()) { if (e.tagName() == QLatin1String("server")) { PublicInfo pi; pi.qsName = e.attribute(QLatin1String("name")); pi.quUrl = e.attribute(QLatin1String("url")); pi.qsIp = e.attribute(QLatin1String("ip")); pi.usPort = e.attribute(QLatin1String("port")).toUShort(); pi.qsCountry = e.attribute(QLatin1String("country"), tr("Unknown")); pi.qsCountryCode = e.attribute(QLatin1String("country_code")).toLower(); pi.qsContinentCode = e.attribute(QLatin1String("continent_code")).toLower(); pi.bCA = e.attribute(QLatin1String("ca")).toInt() ? true : false; qlPublicServers << pi; } } n = n.nextSibling(); } tPublicServers.restart(); fillList(); } mumble-1.3.4/src/mumble/PTTButtonWidget.h0000664000175000017500000000137414010707273020076 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_PTTBUTTONWIDGET_H_ #define MUMBLE_MUMBLE_PTTBUTTONWIDGET_H_ #include "ui_PTTButtonWidget.h" class PTTButtonWidget : public QWidget, public Ui::qwPTTButtonWidget { Q_OBJECT Q_DISABLE_COPY(PTTButtonWidget) protected: void closeEvent(QCloseEvent *e) Q_DECL_OVERRIDE; public: PTTButtonWidget(QWidget *p = 0); public slots: void on_qpbPushToTalk_pressed(); void on_qpbPushToTalk_released(); signals: void triggered(bool checked, QVariant); }; #endif // PTTBUTTONWIDGET_H_ mumble-1.3.4/src/mumble/CELTCodec.h0000664000175000017500000001062314010707273016551 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_CELTCODEC_H_ #define MUMBLE_MUMBLE_CELTCODEC_H_ #include #include #include #include #ifndef Q_OS_WIN #define __cdecl #endif class CELTCodec { private: Q_DISABLE_COPY(CELTCodec) protected: const CELTMode *cmMode; QString qsVersion; QLibrary qlCELT; bool bValid; mutable int iBitstreamVersion; void (*celt_mode_destroy)(CELTMode *mode); int (__cdecl *celt_mode_info)(const CELTMode *mode, int request, celt_int32 *value); public: void (__cdecl *celt_encoder_destroy)(CELTEncoder *st); int (__cdecl *celt_encoder_ctl)(CELTEncoder * st, int request, ...); void (__cdecl *celt_decoder_destroy)(CELTDecoder *st); int (__cdecl *celt_decoder_ctl)(CELTDecoder * st, int request, ...); CELTCodec(const QString &celt_version); virtual ~CELTCodec(); bool isValid() const; int bitstreamVersion() const; QString version() const; virtual void report() const; virtual CELTEncoder *encoderCreate() = 0; virtual CELTDecoder *decoderCreate() = 0; virtual int encode(CELTEncoder *st, const celt_int16 *pcm, unsigned char *compressed, int nbCompressedBytes) = 0; virtual int decode_float(CELTDecoder *st, const unsigned char *data, int len, float *pcm) = 0; }; class CELTCodec070 : public CELTCodec { protected: CELTMode *(*celt_mode_create)(celt_int32 Fs, int frame_size, int *error); CELTEncoder *(__cdecl *celt_encoder_create)(const CELTMode *mode, int channels, int *error); CELTDecoder *(__cdecl *celt_decoder_create)(const CELTMode *mode, int channels, int *error); int (__cdecl *celt_encode_float)(CELTEncoder *st, const float *pcm, float *optional_synthesis, unsigned char *compressed, int nbCompressedBytes); int (__cdecl *celt_encode)(CELTEncoder *st, const celt_int16 *pcm, celt_int16 *optional_synthesis, unsigned char *compressed, int nbCompressedBytes); int (__cdecl *celt_decode_float)(CELTDecoder *st, const unsigned char *data, int len, float *pcm); int (__cdecl *celt_decode)(CELTDecoder *st, const unsigned char *data, int len, celt_int16 *pcm); const char *(__cdecl *celt_strerror)(int error); public: CELTCodec070(const QString &celt_version); CELTEncoder *encoderCreate() Q_DECL_OVERRIDE; CELTDecoder *decoderCreate() Q_DECL_OVERRIDE; int encode(CELTEncoder *st, const celt_int16 *pcm, unsigned char *compressed, int nbCompressedBytes) Q_DECL_OVERRIDE; int decode_float(CELTDecoder *st, const unsigned char *data, int len, float *pcm) Q_DECL_OVERRIDE; }; class CELTCodec011 : public CELTCodec { protected: CELTMode *(*celt_mode_create)(celt_int32 Fs, int frame_size, int *error); CELTEncoder *(__cdecl *celt_encoder_create_custom)(const CELTMode *mode, int channels, int *error); CELTDecoder *(__cdecl *celt_decoder_create_custom)(const CELTMode *mode, int channels, int *error); int (__cdecl *celt_encode_float)(CELTEncoder *st, const float *pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes); int (__cdecl *celt_encode)(CELTEncoder *st, const celt_int16 *pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes); int (__cdecl *celt_decode_float)(CELTDecoder *st, const unsigned char *data, int len, float *pcm, int frame_size); int (__cdecl *celt_decode)(CELTDecoder *st, const unsigned char *data, int len, celt_int16 *pcm, int frame_size); const char *(__cdecl *celt_strerror)(int error); public: CELTCodec011(const QString &celt_version); CELTEncoder *encoderCreate() Q_DECL_OVERRIDE; CELTDecoder *decoderCreate() Q_DECL_OVERRIDE; int encode(CELTEncoder *st, const celt_int16 *pcm, unsigned char *compressed, int nbCompressedBytes) Q_DECL_OVERRIDE; int decode_float(CELTDecoder *st, const unsigned char *data, int len, float *pcm) Q_DECL_OVERRIDE; }; class CELTCodecSBCELT : public CELTCodec { protected: const CELTMode *cmSBCELTMode; public: CELTCodecSBCELT(); CELTEncoder *encoderCreate() Q_DECL_OVERRIDE; CELTDecoder *decoderCreate() Q_DECL_OVERRIDE; int encode(CELTEncoder *st, const celt_int16 *pcm, unsigned char *compressed, int nbCompressedBytes) Q_DECL_OVERRIDE; int decode_float(CELTDecoder *st, const unsigned char *data, int len, float *pcm) Q_DECL_OVERRIDE; }; #endif // CELTCODEC_H_ mumble-1.3.4/src/mumble/mumble_fr.ts0000664000175000017500000145305614010707274017250 0ustar builderbuilder ACLEditor Deny Refuser Allow Autoriser Allow %1 Autoriser %1 Deny %1 Refuser %1 Mumble - Add channel Mumble - Ajouter un salon Default server value Valeur du serveur par défaut Failed: Invalid channel Échec : Salon invalide Mumble - Edit %1 Mumble - Éditer %1 ID: %1 ID : %1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Accorde le privilège %1. Si un privilège est à la fois accordé et refusé, il sera refusé.<br />%2 Channel must have a name Le salon doit avoir un nom This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Retire le privilège %1. Si le privilège est à la fois accordé et refusé, il sera refusé.<br />%2 Dialog Dialogue Name Nom Enter the channel name here. Saisir le nom du salon ici. Description Description Password Mot de passe Enter the channel password here. Saisir le mot de passe du salon ici. Check to create a temporary channel. Cocher pour créer un salon temporaire. Temporary Temporaire <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> Cette valeur vous permet de définir comment Mumble arrange les salons dans l'arborescence. Un salon avec une valeur de <i>Position</i> plus grande sera toujours placé en dessous de ceux qui ont une valeur plus petite, et inversement. Si la valeur de <i>Position</i> est identique entre deux salons, ceux-ci seront triés par ordre alphabétique à partir de leurs noms. Position Position &Groups &Groupes Group Groupe List of groups Liste des groupes Remove selected group Supprimer le groupe sélectionné Remove Supprimer Inherit group members from parent Hériter les groupes du parent Inherit Hérite Make group inheritable to sub-channels Rendre le groupe héritable pour les sous-salons Inheritable Héritable Group was inherited from parent channel Le groupe a hérité du salon parent Inherited Hérité Members Membres Add Ajouter Add member to group Ajouter un membre au groupe Remove member from group Retirer le membre du groupe &ACL &LCA Active ACLs LCAs actifs List of entries Liste des entrées Inherit ACL of parent? Hériter la LCA du parent ? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. Définit si la LCA en haut de la chaîne des salons parents s'applique à cet objet ou non. Seules les entrées qui sont marquées dans les parents comme « Appliquer aux sous-salons » seront héritées. Inherit ACLs Hériter des LCAs Move entry up Déplacer l'entrée vers le haut This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. Déplace une entrée vers le haut dans la liste. Comme les entrées sont évaluées dans l'ordre, cela peut changer la permission effective des utilisateurs. Vous ne pouvez pas déplacer une entrée héritée, si vous en avez vraiment besoin, vous aurez à dupliquer l'entrée héritée. &Up &Haut Move entry down Déplacer une entrée vers le bas This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. Déplace une entrée vers le bas dans la liste. Comme les entrées sont évaluées dans l'ordre, ceci peut changer les permissions effectives des utilisateurs. &Down &Bas Add new entry Ajouter une nouvelle entrée This adds a new entry, initially set with no permissions and applying to all. Ajoute une nouvelle entrée, initialement définie avec aucune permission, et s'appliquant à tous. &Add &Ajouter Remove entry Supprimer une entrée This removes the currently selected entry. Supprime l'entrée actuellement sélectionnée. &Remove Supp&rimer Context Contexte Entry should apply to this channel. Entry should apply to this channel Les entrées devraient s'appliquer à ce salon. This makes the entry apply to this channel. Applique l'entrée à ce salon. Applies to this channel Appliquer à ce salon Entry should apply to sub-channels. L'entrée devrait s'appliquer aux sous-salons. Add new group Ajouter un nouveau groupe <b>Add</b><br/> Add a new group. <b>Ajouter</b><br/> Ajouter un nouveau groupe. Inherited members Membres hérités Contains the list of members added to the group by this channel. Contient la liste des membres ajoutés au groupe par ce salon. Contains a list of members whose group membership will not be inherited from the parent channel. Contient la liste des membres dont l'appartenance au groupe ne doit pas être héritée depuis le salon parent. Contains the list of members inherited by other channels. Contient une liste des membres hérités depuis d'autres salons. Type in the name of a user you wish to add to the group and click Add. Saisissez le nom de l'utilisateur que vous souhaitez ajouter au groupe et cliquez sur Ajouter. Type in the name of a user you wish to remove from the group and click Add. Saisissez le nom de l'utilisateur que vous souhaitez retirer du groupe et cliquez sur Ajouter. Exclude Exclure Excluded members Membres exclus This makes the entry apply to sub-channels of this channel. Applique l'entrée aux sous-salons de ce salon. Applies to sub-channels Appliquer aux sous-salons Permissions Permissions User/Group Utilisateur/Groupe Group this entry applies to Le groupe auquel cette entrée s'applique User ID ID Utilisateur User this entry applies to Utilisateur à qui cette entrée s'applique This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. Contrôle sur quel utilisateur cette entrée s'applique. Tapez simplement le nom de l'utilisateur et pressez entrée pour interroger le serveur. &Properties &Propriétés <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>Nom</b><br />Saisir le nom du salon dans ce champ. Le nom doit être conforme aux restrictions imposées par le serveur auquel vous êtes connecté. <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>Temporaire</b><br> Quand cette case est cochée, le salon ainsi créé sera marqué comme temporaire. En conséquence, le salon sera automatiquement supprimé dès que le dernier utilisateur l'aura quitté. <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>Groupe</b><br /> Ce sont tous les groupes actuellement définis pour ce salon. Pour créer un nouveau groupe, il suffit de saisir un nom et d'appuyer sur Entrée. <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>Supprimer</b><br />Efface le groupe actuellement sélectionné. Si le groupe était hérité, il ne sera pas retiré de la liste, mais toutes les modifications locales du groupe seront effacées. <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>Hérite</b><br />Permet à tous les membres du groupe d'être hérités du groupe parent, si le groupe est marqué comme étant <i>Héritable</i> dans le salon parent. <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>Héritable</b><br />Indique que ce groupe peut être hérité par les sous-salons. Si le groupe est non héritable, les sous-salons sont libres de créer un nouveau groupe avec le même nom. <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>Hérité</b><br />Indique que le groupe est hérité du salon parent. Vous ne pouvez pas modifier cette option, elle n'est qu'informative. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>Membres</b><br /> Cette liste contient tous les membres ajoutés au groupe dans le salon actuel. Notez que cela n'inclut pas les membres hérités par les salons de niveaux supérieurs. Ceux-ci peuvent être trouvés dans la liste des <i>Membres hérités</i>. Pour éviter que cette liste ne soit héritée par les sous-salons, décochez <i>Héritable</i> ou ajoutez manuellement les membres à la liste des <i>Membres exclus</i>. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>Membres exclus</b><br /> Contient une liste de membres dont l'appartenance au groupe ne doit pas être héritée du salon parent. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. <b>Membres hérités</b><br /> Contient la liste des membres hérités par le salon actuel. Décochez <i>Hérite</i> pour empêcher l'héritage depuis un salon de niveau supérieur. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. Contrôle à quel groupe d'utilisateurs cette entrée s'applique.<br />Notez que les groupes sont évalués dans le contexte du salon dans lequel l'entrée est utilisée. Par exemple, la LCA du salon racine par défaut donne la permission d'<i>écriture</i> au groupe <i>admin</i>. Cette entrée, si héritée par un salon, donnera à l'utilisateur le privilège d'écriture s'il appartient au groupe <i>admin</i> du salon, même s'il n'appartient pas au groupe <i>admin</i> dans le salon de la LCA originelle.<br />Si le nom d'un groupe commence par '!', son appartenance est négative, et s'il commence par un '~', il est évalué dans le salon dans lequel la LCA a été définie, plutôt que dans le salon dans lequel la LCA est active.<br />Si le nom d'un groupe commence par '#', son contenu sera interprété comme un jeton d'accès. Les utilisateurs doivent saisir ce qui suit le '#' dans leur liste de jetons d'accès pour être valide. Cette méthode peut être utilisée pour un accès simple par mots de passe pour les utilisateurs non authentifiés.<br />Si le nom d'un groupe commence par '$', seulement les utilisateurs dont le hachage du certificat, qui doit suivre le '$', seront valides.<br />Quelques groupes prédéfinis sont :<br /><b>all</b> - Tout le monde est concerné.<br /><b>auth</b> - Tous les utilisateurs authentifiés<br /><b>sub,a,b,c</b> - Utilisateurs actuellement dans un sous-salon avec au moins <i>a</i> parents communs, entre les salons <i>b</i> et <i>c</i>. Voir le site web pour une explication plus complète.<br /><b>in</b> - Utilisateurs dans le salon (raccourci pour <i>sub,0,0,0</i>)<br /><b>out</b> - Utilisateurs en dehors du salon (raccourci pour <i>!sub,0,0,0</i>).<br />Notez que ces entrées s'appliquent soit à un utilisateur, soit à un groupe, mais pas aux deux. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. <b>Mot de passe</b><br />Ce champ vous permet de définir ou de changer aisément le mot de passe d'un salon. Il utilise les jetons d'accès de Mumble. Utilisez les LCAs et les groupes si vous avez besoin de plus de finesse dans le contrôle des accès. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. Cela montre toutes les entrées actives sur ce salon. Le nombre de salons hérités est en italique. <br />Les LCAs sont évalués de haut en bas, ce qui signifie que la priorité augmente à mesure que vous déplacez vers le bas de la liste. ID of the channel. ID du salon. Maximum Users Nombre max. d'utilisateurs Maximum number of users allowed in the channel Nombre maximum d'utilisateurs autorisés dans ce canal <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. <b>Nombre max. d'utilisateurs</b><br /> Cette valeur vous permet de définir un nombre maximum d'utilisateurs autorisés dans ce canal. Si la valeur est supérieure à zéro, seul ce nombre d'utilisateurs seront autorisés à entrer dans le canal. Si la valeur est égale à zéro, le nombre maximum d'utilisateurs dans ce canal est la limite par défaut du serveur. This is the sort order for the channel. C'est l'ordre de tri pour le salon ALSAAudioInput Default ALSA Card Carte ALSA par défaut Opening chosen ALSA Input failed: %1 L'ouverture du périphérique d'entrée ALSA choisi a échoué : %1 ALSAAudioOutput Default ALSA Card Carte ALSA par défaut Opening chosen ALSA Output failed: %1 L'ouverture du périphérique de sortie ALSA choisi a échoué : %1 ASIOConfig %1 (version %2) %1 (version %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz %1 -> %2 échantillons tampons, avec %3 résolution exemple (%4 préféré) à %5 Hz ASIO Initialization failed: %1 L'initialisation d'ASIO a échoué : %1 Failed to instantiate ASIO driver Impossible d'instancier le pilote ASIO ASIO ASIO Device selection Sélection du périphérique Device Périphérique Device to use for microphone Périphérique à utiliser pour le microphone This chooses what device to query. You still need to actually query the device and select which channels to use. Choisis le périphérique à interroger. Vous devez toujours interroger le périphérique et sélectionner les canaux à utiliser. Query selected device Interroger le périphérique sélectionné This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. Interroge le périphérique sélectionné pour connaître ses canaux. Soyez conscient que beaucoup de pilotes ASIO sont bogués à l'extrême et les interroger peut causer un plantage de l'application ou du système. &Query &Interroger Configure selected device Configurer le périphérique sélectionné This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. Configure le périphérique sélectionné. Soyez conscient que les pilotes ASIO sont bogués à l'extrême, et les utiliser pourrait causer un plantage de l'application ou du système. &Configure &Configurer Capabilities Capacités Driver name Nom du pilote Buffer size Taille du tampon This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. Configurera les canaux d'entrée pour l'ASIO. Veuillez vous assurer que vous avez sélectionné au moins un canal comme micro et haut-parleurs. <i>Microphone</i> indique l'endroit où votre microphone est connecté, et <i>Haut-parleurs</i>indique le canal qui joue '<i>Ce que vous entendez</i>'.<br />Par exemple, sur Audigy 2 ZS, une bonne sélection pour le microphone est '<i>Mic L</l>' tandis que haut-parleur est '<i>Mix L</i>' et '<i>Lix R</i>'. Configure input channels Configurer les canaux d'entrée Channels Canaux Microphone Microphone <- <- -> -> Unused Non utilisé Speakers Haut-parleurs ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. Vous devez sélectionner au moins un microphone et un haut-parleur pour utiliser ASIO. Si vous avez seulement besoin du microphone, utilisez DirectSound. Opening selected ASIO device failed. No input will be done. L'ouverture du périphérique ASIO sélectionné a échouée. Il n'y aura pas d'entrée. AboutDialog About Mumble À propos de Mumble <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> <h3>Mumble (%1)</h3><p>%3</p><p><b>Un utilitaire de chat vocal pour les joueurs</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble &À propos de Mumble &License &Licence A&uthors A&uteurs &Third-Party Licenses &Licences tierces OK Valider AudioInput Interface Interface System Système Input method for audio Méthode d'entrée pour l'audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Il s'agit de la méthode d'entrée utilisée pour l'audio.</b><br />En général vous utilisez DirectSound. Device Périphérique Input device for audio Périphérique d'entrée pour l'audio <b>This is the input device to use for audio.</b> <b>C'est le périphérique d'entrée à utiliser pour l'audio.<.b> Transmission Transmission &Transmit &Transmission When to transmit your speech Quand transmettre votre voix <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. <b>Détermine quand transmettre votre voix.</b><br /><i>Continu</i> - En continu<br /><i>Activité Vocale</i> - Quand vous parlez clairement.<br /><i>Appuyez pour parler</i> - Quand vous pressez la touche choisie dans les <i>Raccourcis</i>. DoublePush Time Délai entre deux pressions If you press the PTT key twice in this time it will get locked. Si vous pressez la touche Appuyer-pour-parler (PTT, Push To Talk) deux fois dans cet intervalle de temps, cela la bloquera. <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. <b>Délai entre deux pressions</b><br />Si vous pressez la touche Appuyer-pour-parler deux fois durant l'intervalle de temps configuré, cela la verrouillera. Mumble continuera à transmettre tant que la touche ne sera pas enfoncée une nouvelle fois. Reset audio cue to default Remet les sons par défaut <b>Reset</b><br/>Reset the paths for the files to their default. <b>Remettre à zéro</b><br/>Réinitialise les chemins des fichiers sonores aux valeurs par défaut. Browse for on audio file Recherche un fichier audio quand activé Browse for off audio file Rechercher un fichier audio quand éteint Off Éteint On Allumé Preview the audio cues Écouter les bips sonores Use SNR based speech detection Utilise le rapport Signal/Bruit pour la détection de la voix Signal to Noise Signal/Bruit <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. <b>Définit l'amplitude comme méthode de détection de la voix.</b><br />Dans ce mode, la force du signal d'entrée sera utilisée pour détecter la voix. Amplitude Amplitude Voice &Hold Maintien de la &voix How long to keep transmitting after silence Combien de temps après un silence continuer à maintenir la transmission Silence Below Silence en deçà <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. <b>Définit la valeur pour la détection de la voix.</b><br />Utilisez ce réglage avec la fenêtre de Statistiques Audio pour régler manuellement la valeur de détection de la voix. Toute valeur d'entrée en dessous de « Silence en deçà » sera toujours considérée comme du silence. Les valeurs au-delà de « Voix au-delà » seront toujours considérées comme de la voix. Les valeurs intermédiaires seront considérées comme étant de la voix si vous êtes en train de parler, mais n'activeront pas une nouvelle détection. Speech Above Voix au-delà Signal values above this count as voice Les valeurs de signal au-delà comptent comme de la voix Compression Compression &Quality &Qualité Quality of compression (peak bandwidth) Qualité de la compression (influe sur la bande passante) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. <b>Définis la qualité de la compression.</b><br />Détermine combien de bande passante Mumble est autorisé à utiliser pour l'audio en sortie. Audio per packet Trames par paquet How many audio frames to send per packet Nombre de trames audio à envoyer par paquet <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>Sélectionne le nombre de trames audio qui devraient être envoyées dans un paquet.</b><br />Augmenter cette valeur augmentera votre latence, mais réduira aussi vos besoins en bande passante. <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). <b>Montre la bande passante maximale utilisée.</b><br />Montre la bande passante maximale utilisée par votre machine. Le débit binaire audio est le débit binaire maximum (puisqu'un débit binaire variable est utilisé) pour les données seules. La position est le débit binaire utilisé pour les informations de position. L'en-tête contient le système de trames et les en-têtes des paquets IP. (l'IP et l'UDP constituent 75 % de l'en-tête). Audio Processing Processeur audio Noise Suppression Suppression du bruit Noise suppression Suppression du bruit <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. <b>Définit la quantité de son à supprimer à appliquer.</b><br />Plus la valeur est élevée, plus les bruits seront supprimés. Maximum amplification of input sound Amplification maximale de l'entrée sonore <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. <b>Amplification de l'entrée maximale.</b><br />Mumble normalise le son de l'entrée avant de le compresser, et l'amplifie aussi fort qu'il l'est autorisé à le faire.<br />Le niveau actuel est continuellement mis à jour selon votre modèle de parole actuel, mais il ne dépassera jamais le niveau spécifié ici.<br />Si le <i>Volume du microphone</li> des statistiques audio tourne autour de 100 %, vous voudrez probablement le mettre à 2.0 ou à une valeur proche, mais si, comme la plupart des gens, vous n'arrivez pas à atteindre 100 %, définissez quelque chose de beaucoup plus haut.<br />Idéalement, définissez le de manière à ce que <i>Volume du microphone * Facteur d'amplification >= 100</i>, même si vous parlez vraiment doucement.<br /><br />Notez que mettre cette option au maximum ne causera aucun dégât, mais que Mumble risque d'entendre d'autres conversations, si vous le laissez à ce niveau. Current speech detection chance Détection de parole actuelle Cancel echo from speakers Suppression de l'écho des haut-parleurs Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. Activer cette option annulera l'écho de vos haut-parleurs. Mixé a le moins d'impact CPU, mais ne fonctionne que si vos enceintes sont au même volume et équidistants de votre microphone. Multicanal offre de meilleurs résultats, mais au prix d'une charge CPU plus importante. Disabled Désactivé <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>Définit la détection vocale sur l'utilisation du rapport Signal/Bruit.</b><br />Dans ce mode, l'entrée est analysée pour trouver ce qui ressemble à un signal clair, et la qualité de ce signal est utilisée comme base pour déterminer la détection vocale. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>Ceci affiche le niveau actuel des paramètres de détection de parole.</b><br />Vous pouvez changer ces paramètres depuis les paramètres ou l'assistant audio. Signal values below this count as silence Les valeurs de signal en deçà sont du silence Maximum bandwidth used for sending audio Bande passante maximale utilisée pour envoyer l'audio Use Amplitude based speech detection Utiliser l'amplitude pour la détection de la voix <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). <b>Détermine combien de temps la transmission devrait continuer après une pause.</b><br />Choisissez une valeur supérieure si votre voix est coupée lorsque vous parlez (l'icône située à côté de votre nom clignote alors très rapidement).<br />Cela n'a de sens que si vous utilisez la transmission selon l'Activité Vocale. Exclusive mode Mode exclusif <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>Ceci utilise le périphérique en mode exclusif.</b><br />Aucune autre application ne pourra l'utiliser. Exclusive Exclusif R&eset &Réinitialiser &Browse... &Parcourir... B&rowse... P&arcourir... &Preview Ap&erçu <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. <b>Prévisualisation</b><br/>Joue le son pour l'action <i>Allumé</i> suivi de celui pour <i>Éteint</i>. Displays an always on top window with a push to talk button in it Affiche une fenêtre toujours visible qui contient un bouton appuyer-pour-parler Display push to talk window Afficher la fenêtre appuyer-pour-parler Misc Divers Audible audio cue when starting or stopping to transmit Signal audio lors du début et de la fin des transmissions <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. <b>Cette option active des signaux audio de transmission. </b><br />Vous entendrez un bip lorsque vous démarrez et cessez la transmission. Audio cue Signal audio Gets played when starting to transmit Sera joué au début des transmissions Gets played when stopping to transmit Sera joué à la fin des transmissions Hold Time Durée de maintien Time the microphone stays open after the PTT key is released Délai pendant lequel le microphone restera ouvert après que la touche PTT ait été enfoncée Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) La bande passante maximale du serveur est seulement de %1 kbit/s. La qualité audio a été ajustée automatiquement à %2 kbit/s (%3 ms) Max. Amplification Amplification max Idle action Aucune action (idle) minutes do minutes effectuer l'action suivante nothing ne rien faire deafen rendre sourd mute rendre muet after après Echo Cancellation Annulation de l'Echo Mixed echo cancellation Annulation mélangé de l'écho Multichannel echo cancellation Annulation multi-canaux de l'écho The idle action will be reversed upon any key or mouse button input L'action d'absence va être annulée en cas d'entrée du clavier ou de la souris Undo Idle action upon activity Annuler l'activité d'absence Apply RNNoise's noise suppression filter. Appliquer le filtre de suppression de bruit de RNNoise. <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. <b>Ceci applique le filtre de suppression de bruit de RNNoise.</b><br />RNNoise est basé sur le machine learning et utilisé dans WebRTC. RNNoise RNNoise Audio input AudioInputDialog Continuous Continu Voice Activity Activité vocale Push To Talk Appuyer-pour-parler Audio Input Entrée audio %1 ms %1 ms Off Éteint %1 s %1 s %1 kb/s %1 kb/s -%1 dB -%1 dB %1 kbit/s (Audio %2, Position %4, Overhead %3) %1kbits/s (Audio %2, Position %4, En-têtes %3) AudioOutput Interface Interface System Système Output method for audio Méthode de sortie audio <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Méthode de sortie audio.</b><br />En général vous utilisez DirectSound. Device Périphérique Output device for audio Périphérique de sortie audio <b>This is the output device to use for audio.</b> <b>C'est le périphérique de sortie à utiliser pour l'audio.</b> Positional Audio Position Audio Audio Output Sortie audio Default &Jitter Buffer Tampon de &gigue par défaut Safety margin for jitter buffer Marge de sécurité pour le tampon de gigue <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. <b>C'est la valeur minimale de sécurité du tampon de gigue.</b><br />Tout le son qui arrive est temporisé, et le tampon de gigue essaie de maintenir le tampon à la valeur minimale soutenable par votre réseau, la latence est donc maintenue au niveau le plus bas possible. Ce paramètre définit la taille minimale du tampon à utiliser. Si le début des phrases que vous entendez est vraiment mauvais, augmentez cette valeur. Minimum distance to user before sound volume decreases Distance minimale de l'utilisateur avant que le volume sonore diminue This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. Spécifie la distance minimale pour le calcul du son. Le volume des autres utilisateurs ne sera pas diminué tant qu'ils ne seront pas plus éloignés de vous. This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. Spécifie la distance maximum pour le calcul du son. Passé cette distance, le volume des autres joueurs ne diminuera plus. <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. <b>Active l'un des tests de boucle locale.</b><br /><i>Aucun</i>- Test boucle locale désactivée.<br /><i>Local</i> - Émule un serveur local.<br /><i>Serveur</i> - Demande au serveur de retourner le son.<br />Veuillez noter que si vous activez le test de boucle locale, aucun autre utilisateur ne vous entendra. Ce paramètre n'est pas mémorisé en quittant. Volume Volume Volume of incoming speech Volume de parole entrant <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. <b>Ceci ajuste le volume entrant de parole.</b><br />Notez que si vous augmentez cette valeur au-delà de 100 %, le son sera déformé. Output Delay Délai de sortie Amount of data to buffer Quantité de données à mettre en tampon The connected "speakers" are actually headphones The connected "speakers" are actually headphones. Les « haut-parleurs » actuellement connectés sont un casque Factor for sound volume decrease Facteur de diminution du volume sonore Bloom Augmentation Factor for sound volume increase Facteur de diminution du volume sonore How much should sound volume increase for sources that are really close? À quel niveau le volume doit-il être augmenté pour les sources qui sont vraiment très proches ? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. Cocher ceci indique que vous n'avez pas de haut-parleurs connectés mais un casque. C'est important, car les haut-parleurs sont normalement en face de vous, alors que le casque est directement sur votre gauche/droite. This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Spécifie la quantité de données à mettre en cache dans le tampon de sortie. Essayez différentes valeurs et mettez la plus basse qui ne cause pas de rapides décalages du son. Headphones Casque audio Minimum Distance Distance minimale Maximum Distance Distance maximale Maximum distance, beyond which speech volume won't decrease Distance maximale, au-delà de laquelle le volume n'est pas diminué Minimum Volume Volume minimum What should the volume be at the maximum distance? Quel doit être le volume à la distance maximale ? Loopback Test Test de boucle locale Delay Variance Délai de variance Variance in packet latency Variance de la latence des paquets <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>Définit la variance de la latence des paquets pour le test de boucle locale.</b><br />Beaucoup de chemins audio contiennent une latence variable. Vous pouvez spécifier ici cette variance pour effectuer des tests de boucle locale. Par exemple, si vous la définissez à 15 ms, un réseau avec une latence de 20-35 ms de ping ou de 80-90 ms de latence sera émulé. La majorité des connexions domestiques ont une variance proche de 5 ms. Packet Loss Perte de paquets Packet loss for loopback mode Perte de paquets pour le mode de boucle locale <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% <b>Ceci définit la perte de paquets pour le mode de boucle locale.</b><br />Ce sera le taux de paquets perdus. À moins que votre bande passante sortante ne soit atteinte ou qu'il n'y ait un problème avec votre connexion réseau, ce sera 0 % &Loopback Boucle &locale Desired loopback mode Mode de boucle locale désirée Attenuate applications by... Atténuer les applications de... Attenuation of other applications during speech Atténuation des autres applications lors de l'écoute ou de la parole <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. <b>Atténuer le volume des autres applications durant l'écoute ou la parole</b><br />Mumble peut abaisser le volume des autres applications durant l'écoute ou la parole. Ceci règle l'atténuation des autres applications si cette fonction est activée. If checked Mumble lowers the volume of other applications while other users talk Si cochée, Mumble baisse le volume des autres applications lors de l'écoute <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. <b>Atténuer les applications lors de l'écoute</b><br />Mumble peut abaisser le volume des autres applications durant l'écoute ou la parole. Ceci active l'atténuation des autres applications si un utilisateur vous parle. while other users talk lors de l'écoute If checked Mumble lowers the volume of other applications while you talk Si cochée, Mumble baisse le volume des autres applications lors de la parole <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. <b>Atténuer les applications lors de la parole</b><br />Mumble peut abaisser le volume des autres applications durant l'écoute ou la parole. Ceci active l'atténuation des autres applications dès que vous parlez. while you talk lors de la parole Exclusive mode, not recommended. Mode exclusif, non recommandé. <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. <b>Ceci utilise le périphérique en mode exclusif.</b><br />Aucune autre application ne pourra l'utiliser. Exclusive Exclusif Priority Speaker Parole prioritaire If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. Si coché, Mumble diminue le volume des autres utilisateurs lorsque vous parlez avec le statut "Parole Prioritaire". <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. <b>Atténue le son des autres lorsque vous parlez avec le statut "Parole Prioritaire".</b><br />Mumble supporte la réduction de volume lorsque vous avez le statut <i>Parole Prioritaire</i> pour vous éviter d'être dérangé. Cocher cette case activera cette fonctionnalité. Attenuate other users while talking as Priority Speaker. Atténue le son des autres utilisateurs lorsque vous parlez avec le statut "Parole Prioritaire". Advanced Attenuation Options Options d'atténuation avancées If checked, Mumble will only attenuate applications that are using the same output source as Mumble Si sélectionné, Mumble atténuera uniquement les applications utilisant la même sortie audio que Mumble <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. <b>Atténue uniquement les applications utilisant la même sortie audio que Mumble</b><br />Si sélectionné, les applications utilisant une autre sortie audio que Mumble ne seront pas atténuées. Only attenuate applications using the same output device Atténue uniquement les applications utilisant la même sortie audio If checked, PulseAudio loopback modules will be attenuated Si sélectionné, les modules de bouclage PulseAudio seront atténués <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. <b>Atténuer les modules de bouclage PulseAudio</b><br />Si les modules de bouclage sont liés au périphérique de sortie de Mumble, ils seront également atténués. Attenuate PulseAudio loopback modules Atténuer les modules de bouclage PulseAudio Audio output AudioOutputDialog None Aucun Local Local Server Serveur Audio Output Sortie audio %1 ms %1 ms %1 % %1 % %1 m %1 m AudioOutputSample Choose sound file Choisissez le fichier son Invalid sound file Fichier son invalide The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. Le fichier « %1 » ne peut pas être utilisé par Mumble. Veuillez choisir un fichier avec un format et un encodage compatible. AudioStats >1000 ms >1000ms >1000ms Audio Statistics Statistiques audio Input Levels Niveaux d'entrée Peak microphone level Niveau maximal du microphone Peak power in last frame Puissance maximale dans la trame précédente This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. Montre la puissance maximale de la dernière trame (20 ms), c'est la même valeur que vous trouverez normalement en « puissance d'entrée ». Veuillez ignorer cette valeur et regarder plutôt la <b>puissance du micro</b>, qui est beaucoup plus stable et ne tient pas compte des valeurs aberrantes. Peak speaker level Niveau maximal du haut-parleur This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. Montre la puissance maximale de la dernière trame (20 ms) des haut-parleurs. Sauf si vous utilisez une méthode multisalon d'échantillonnage (telles que l'ASIO) des canaux des haut-parleurs configurés, cette valeur sera 0. Si vous avez une telle configuration, affichant toujours 0 pendant que vous entendez le son d'autres applications, c'est que votre configuration ne fonctionne pas. Peak clean level Niveau maximal nettoyé This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. Montre la puissance maximale de la dernière trame (20 ms) après tous les traitements. Idéalement, elle doit être de -96dB quand vous ne parlez pas. En réalité, un studio sonore atteindra -60 dB, et vous aurez joyeusement -20 dB ailleurs. Quand vous ne parlez pas, il devrait se trouver entre -5 et -10 dB.<br />Si vous utiliser la suppression de l'écho et que la valeur est de plus de -15 dB quand vous ne parlez pas, cela signifie que votre configuration ne fonctionne pas et vous dérangez les autres utilisateurs avec l'écho. Signal Analysis Analyse du signal Microphone power Puissance du micro How close the current input level is to ideal À quel point le niveau sonore en entrée est proche de l'idéal This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. Montre à quel point le niveau de volume d'entré courant est proche de l'idéal. Pour ajuster le niveau de votre microphone, ouvrez le programme que vous utilisez pour ajuster le volume d'enregistrement, et regardez la valeur ici pendant que vous parlez.<br /><b>Parlez fort, comme lorsque vous êtes énervé d'avoir été tué par un noob.</b><br />Réglez le volume jusqu'à ce que cette valeur soit proche de 100 %, mais assurez-vous qu'elle ne le dépasse pas. Si ça va au-delà, vous aurez probablement des coupures dans votre discussion, ce qui dégradera la qualité audio. Signal-To-Noise ratio Taux de signal/bruit Signal-To-Noise ratio from the microphone Rapport Signal/Bruit du microphone This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. C'est le rapport Signal/Bruit (SNR) de votre microphone de la dernière trame (20 ms). Il vous affiche comment votre voix est nettoyée des bruits.<br />Si cette valeur est supérieure à 1.0, Il y a davantage de bruits que de signal vocal, et la qualité est donc réduite.<br />Il n'y a pas de limite supérieure à cette valeur, mais n'espérez pas avoir de valeurs supérieures à 40-50 sans studio audio. Speech Probability Probabilité de parole Probability of speech Probabilité de parole This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). Il s'agit de la probabilité que la trame précédente (20 ms) soit de la parole et non du bruit.<br />La transmission de l'activité vocale dépend de cette valeur. L'astuce est que le milieu de la phrase est toujours détecté comme de la voix ; les problèmes sont les pauses entre les mots et le début des phrases. Il est difficile de distinguer un soupir d'un mot commençant par « h ».<br />Si c'est écrit en gras, cela signifie que Mumble est en train de transmettre des données (si vous êtes connecté). Configuration feedback Retour de configuration Current audio bitrate Débit binaire audio actuel Bitrate of last frame Débit binaire de la dernière trame DoublePush interval Intervalle double PTT Time between last two Push-To-Talk presses Délai entre les deux derniers appuis sur Appuyer-pour-Parler Speech Detection Détection de parole Current speech detection chance Détection de parole actuelle <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. <b>Ceci affiche le niveau actuel des paramètres de détection de parole.</b><br />Vous pouvez changer ces paramètres depuis les paramètres ou l'assistant audio. Signal and noise power spectrum Spectre de la puissance du signal d'entrée et du bruit Power spectrum of input signal and noise estimate Spectre de la puissance du signal d'entrée et du bruit estimé This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. Montre le spectre de puissance du signal d'entrée actuel (ligne rouge) et l'estimation du bruit actuel (en bleu).<br />Toutes les amplitudes sont multipliées par 30 pour montrer les parties intéressantes (quantité de signal par rapport au bruit dans chaque bande de fréquence).<br />Ce n'est intéressant que si vous voulez configurer finement les conditions de bruit de votre microphone. Dans de bonnes conditions, il devrait y avoir seulement un léger battement de bleu. Si le niveau de bleu dépasse la moitié sur la graphique, vous avez un environnement vraiment bruyant. Echo Analysis Analyse de l'écho Weights of the echo canceller Force de l'écho suppression This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. Montre le poids de la suppression de l'écho, avec le temps en ordonnée et la fréquence en abscisse.<br />Idéalement, celui-ci devrait être noir, indiquant qu'aucun écho n'existe. Plus communément, vous aurez une ou plusieurs bandes bleutées représentant le temps de retard de l'écho. Vous devriez être capable de visualiser les poids mis à jour en temps réel.<br />Notez que tant que vous n'avez aucun signal où enlever l'écho, vous ne verrez pas beaucoup de données utiles ici. Écoutez de la musique et les choses devraient se stabiliser.<br />Vous pouvez choisir de voir la partie réelle ou imaginaire dans le domaine fréquentiel, ou alternativement le module et la phase des poids. Le plus utile de ces outils serait probablement le module, qui est l'amplitude de l'écho, qui montre la quantité de signal sortant supprimée à chaque instant. Les autres modes de visualisation sont principalement utiles pour les gens qui veulent régler les algorithmes d'annulation de l'écho.<br />Remarque : si l'image entière fluctue massivement en mode module, cela signifie que l'algorithme de suppression de l'écho n'a pas réussi à trouver une corrélation entre les deux sources d'entrée (haut-parleurs et microphone). Soit vous avez un retard très long sur l'écho, soit une des sources d'entrée est mal configurée. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. Il s'agit du débit binaire de la dernière trame compressée (20 ms). Ceci va varier de haut en bas puisque nous utilisons un bitrate variable pour ajuster la qualité. Pour ajuster le bitrate maximal, ajustez <b>Complexité de la compression</b> dans les Préférences. AudioWizard Audio Tuning Wizard Assistant audio Introduction Introduction Welcome to the Mumble Audio Wizard Bienvenue dans l'assistant audio de Mumble Finished Terminé Enjoy using Mumble Profitez de l'utilisation de Mumble Device selection Sélection du périphérique Selecting the input and output device to use with Mumble. Sélectionnez le périphérique d'entrée et de sortie à utiliser dans Mumble. This is the device your microphone is connected to. Périphérique auquel votre microphone est connecté. System Système Input method for audio Méthode d'entrée pour l'audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Il s'agit de la méthode d'entrée utilisée pour l'audio.</b><br />En général vous utilisez DirectSound. Device Périphérique Input device to use Périphérique d'entrée à utiliser <b>Selects which sound card to use for audio input.</b> <b>Sélectionner la carte son à utiliser pour la sortie audio.</b> Cancel echo from headset or speakers Suppression de l'écho du casque ou des haut-parleurs Use echo cancellation Utiliser l'annulation de l'écho This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. Ceci active l'annulation d'écho de la sortie audio, ce qui aide à la fois la parole et les écouteurs. This is the device your speakers or headphones are connected to. Périphérique auquel vos haut-parleurs ou vos écouteurs sont connectés. Output method for audio Méthode de sortie audio <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>Méthode de sortie audio. </b><br />En général vous utilisez DirectSound. Output device to use Périphérique de sortie à utiliser <b>Selects which sound card to use for audio Output.</b> <b>Sélectionner quelle carte son utiliser pour la sortie sonore.</b> Enable positional audio Activer l'audio positionnel Allows positioning of sound Allows positioning of sound. Autoriser la position audio <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> <p> Ceci est l'assistant de configuration audio de Mumble. Il vous aidera à régler correctement les niveaux d'entrée de votre carte son, ainsi que les paramètres corrects pour le traitement du son sous Mumble. </p> <p> Notez que tant que cet assistant sera actif, le son sera joué localement pour vous permettre de l'écouter et qu'aucun son ne sera envoyé au serveur. </p> Input Device Périphérique d'entrée Output Device Périphérique de sortie This allows Mumble to use positional audio to place voices. Ceci autorise Mumble à utiliser l'audio positionnel pour positionner les voix. <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> <p> Pour maintenir une latence à la valeur minimale, il est important de spécifier un tampon aussi petit que possible sur votre carte son. Cependant, plusieurs cartes sons rapportent qu'elles nécessitent un tampon plus petit que nécessaire pour un fonctionnement correct, donc la seule façon de régler cette valeur est d'essayer diverses valeurs. </p> <p> Vous devez entendre un échantillon de voix. Déplacez le curseur sur la valeur la plus petite ne donnant <b>aucune</b> interruption ni décalage de son. Veuillez noter que la suppression de l'écho est désactivée durant ce test. </p> Amount of data to buffer Quantité de données à mettre en tampon This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Spécifie la quantité de données à mettre en cache dans le tampon de sortie. Essayez différentes valeurs et mettez la plus basse qui ne cause pas de rapides décalages du son. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> <p> Ouvrez votre panneau de configuration de la carte son, et allez aux paramètres d'enregistrement. Veuillez vous assurer que le microphone est sélectionné comme périphérique actif avec le volume réglé au maximum. S'il existe une option permettant de « Booster le microphone », assurez-vous qu'elle soit cochée. </p> <p> Parlez fort, comme lorsque vous êtes irrité ou excité. Diminuez le volume dans le panneau de contrôle sonore jusqu'à ce que la barre ci-dessous reste le plus haut possible dans le bleu et le vert mais <b>pas</b> dans la zone rouge quand vous parlez. </p> Positional Audio Position Audio Adjusting attenuation of positional audio. Ajuster l'atténuation de la position audio. <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> <p> Mumble supporte le positionnement audio dans certains jeux, et positionne la voix des autres utilisateurs par rapport à leur position dans le jeu. En fonction de leur position, le volume de la voix sera adapté entre les haut-parleurs pour simuler leur direction et leur éloignement. Un tel positionnement dépend d'une bonne configuration de vos haut-parleurs, elle est donc testée ici. </p> <p> Le dessin ci-dessous montre <font color="red">votre</font> position, celle de vos <font color="yellow">haut-parleurs</font> et une <fond color="green">source sonore en mouvement</font> comme si vous étiez vu de dessus. Vous deviez entendre le son se déplacer entre les canaux. </p> Use headphones instead of speakers Utiliser un casque à la place de haut-parleurs <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> <p> Félicitations. Vous êtes prêt à bénéficier d'une meilleure expérience sonore avec Mumble. </p> <p> Mumble est développé de façon continue, et l'équipe de développement veut se concentrer sur les options qui bénéficieront au plus grand nombre d'utilisateurs. Pour y parvenir, Mumble propose d'envoyer des statistiques anonymes à propos de votre configuration aux développeurs. Ces statistiques sont essentielles pour les développements futurs, mais aussi pour que les fonctions que vous utilisez ne soient pas abandonnées. </p> Use headphones Utiliser les écouteurs This ignores the OS speaker configuration and configures the positioning for headphones instead. Ceci ignore la configuration des haut-parleurs du système d'exploitation et configure la position pour les écouteurs à la place. Volume tuning Réglage du volume Tuning microphone hardware volume to optimal settings. Réglage du volume matériel du micro pour une meilleure configuration. Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. Maintenant, parlez doucement, comme vous le feriez lorsque l'on parle tard dans la nuit et que vous ne voulez pas déranger qui que ce soit. Ajustez le curseur ci-dessous pour que la barre se déplace dans le vert lorsque vous parlez, mais reste bleu quand vous êtes silencieux. Voice Activity Detection Détection de l'Activité Vocale Letting Mumble figure out when you're talking and when you're silent. Mumble détermine quand vous parlez, et lorsque vous faites le silence. This will help Mumble figure out when you are talking. The first step is selecting which data value to use. Cela permettra de Mumble savoir quand vous parlez. La première étape consiste à sélectionner les données de valeur à utiliser. Raw amplitude from input Amplitude d'entrée Signal-To-Noise ratio Taux de signal/bruit Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Ensuite, vous devez ajuster les deux curseurs. Les premières syllabes des phrases devraient se trouver dans la zone verte (voix confirmée). Tout en parlant, vous devriez rester à l'intérieur de la zone jaune (voix hypothétique), et lorsque vous ne parlez pas, tout devrait être dans le rouge (aucune voix). Device tuning Réglage périphérique Changing hardware output delays to their minimum value. Modifiez le délai de sortie matérielle à sa valeur minimale. Submit anonymous statistics to the Mumble project Soumettre des statistiques anonymes au projet Mumble Push To Talk: Appuyez pour parler : Quality & Notifications Qualité & Notifications Adjust quality and notification settings. Ajustez les paramètres de qualité et de notification. Quality settings Paramètres de qualité Low Bas Balanced Normal Notification settings Paramètres de notification Use Text-To-Speech to read notifications and messages to you. Utiliser la synthèse vocale pour lire vos notifications et messages. Disable Text-To-Speech and use sounds instead. Désactiver la synthèse vocale et utiliser des sons à la place. %1 ms %1ms Enables attenuation of other applications while users talk to you Activer l'atténuation des autres applications lors de l'écoute Attenuate applications while other users talk Atténue les applications lorsque d'autres utilisateurs parlent High Haut Custom Personnalisé You already set a customized quality configuration in Mumble. Select this setting to keep it. Vous avez déjà configuré une qualité personnalisée pour Mumble. Sélectionnez ceci pour garder cette configuration. Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. Active l'atténuation des applications lors de l'écoute. Cela signifie que dès que quelqu'un commence à vous parler via Mumble, le son de toutes les autres applications (comme un lecteur audio) sera réduit afin que vous puissiez mieux l'entendre. Apply some high contrast optimizations for visually impaired users Applique des optimisations de contraste pour les utilisateurs malvoyants Use high contrast graphics Utiliser des graphiques de contraste élevé Keep custom Text-To-Speech settings. Garder les paramètres personnalisés de synthèse vocale. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode <p> Ouvrez votre panneau de configuration de la carte son, et allez aux paramètres d'enregistrement. Veuillez vous assurer que le microphone est sélectionné comme périphérique actif avec le volume réglé au maximum. S'il y a une option permettant de « Booster le microphone », assurez-vous qu'elle soit cochée. </p> <p> Parlez fort, comme lorsque vous êtes irrité ou excité. Diminuez le volume dans le panneau de contrôle sonore jusqu'à ce que la barre ci-dessous reste le plus haut possible dans la zone hachurée avec des traits obliques et la zone vide mais <b>pas</b> dans la zone hachurée avec des traits croisés quand vous parlez. </p> Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode Maintenant, parlez doucement, comme vous le feriez lorsque l'on parle tard dans la nuit et que vous ne voulez pas déranger qui que ce soit. Ajustez le curseur ci-dessous pour que la barre se déplace dans la zone vide lorsque vous parlez, mais qu'elle reste dans la zone hachurée avec des traits obliques quand vous êtes silencieux. Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode Ensuite, vous devez ajuster les deux curseurs. Les premières syllabes des phrases devraient se trouver dans la zone vide (voix confirmée). Tout en parlant, vous devriez rester à l'intérieur de la zone hachurée avec des traits obliques (voix hypothétique), et lorsque vous ne parlez pas, tout devrait être dans la zone hachurée avec des traits croisés (aucune voix). In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) Dans cette configuration Mumble utilisera <b>une quantité réduite de bande passante</b>. Cela aura pour conséquence une latence plus importante et une qualité médiocre. Choisissez cette option seulement si votre connexion ne peut gérer les autres possibilités (16kbits/s, 60ms par paquet) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) C'est la configuration <b>par défaut recommandée</b>. Elle offre un bon équilibre entre la qualité, la latence et l'utilisation de la bande passante. (40kbits/s, 20ms par paquet) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) Cette configuration n'est recommandée que lorsque la bande passante n'est pas une contrainte, comme lors de l'utilisation d'un LAN. Elle offre la latence la plus faible supportée par Mumble ainsi qu'une <b>qualité élevée</b>. (72kbit/s, 10ms par paquet) BanEditor Mumble - Edit Bans Mumble - Éditer la liste des bannis &Address &Adresse &Mask &Masque Reason Raison Start Début End Fin User Utilisateur Hash Hachage &Add &Ajouter &Update Mettre à jo&ur &Remove Supp&rimer Ban List Liste des Bannis Search field Champs de recherche This is the search field. Use it to find bans that have this username set in the username field. Ceci est le champs de recherche. Utilisez-le pour trouver des utilisateurs bannis par leur nom d'utilisateur. Who are you looking for? Qui recherchez-vous ? No nickname Pas de pseudo IP address Adresse IP No IP address Pas d'adresse IP Reason for the ban Raison du bannissement No reason Pas de raison Ban end date Date de fin du bannissement Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). Date de fin du bannissement. Si vous spécifiez la même date pour le début et la fin, le bannissement sera permanent. Certificate hash Hash du certificat No certificate hash Pas de hash de certificat Banned users Utilisateurs bannis This is a list with banned users. Ceci est une liste des utilisateurs bannis. Use this button if you want to add a new ban. Utilisez ce bouton si vous voulez ajouter un nouveau bannissement. Use this button if you want to update ban information. Utilisez ce bouton si vous voulez mettre à jour un bannissement. Use this button if you want to remove user from the ban list. Utilisez ce bouton si vous voulez supprimer un bannissement. Clear all fields Vider tous les champs This button clears all fields. Use it if you want to add a new ban. Ce bouton vide tous les champs. Utilisez le si vous voulez ajouter un nouveau bannissement. Clear Effacer Ban List - %n Ban(s) Liste des Bannis - %n BanniListe des Bannis - %n Banni(s) CertView Name Nom Email Courriel Issuer Émetteur Expiry Date Date d'expiration (none) (aucun) Self-signed Auto-signé CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. Impossible de valider le courriel.<br />Saisissez une adresse de courriel valide (ou vide) pour continuer. There was an error generating your certificate.<br />Please try again. Une erreur est survenue durant la génération de votre certificat.<br />Veuillez réessayer. Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. Votre certificat et votre clé n'ont pas pu être exportés au format PKCS#12. Il doit y avoir une erreur dans votre certificat. The file could not be opened for writing. Please use another file. Le fichier n'a pas pu être ouvert en écriture. Veuillez utiliser un autre fichier. The file's permissions could not be set. No certificate and key has been written. Please use another file. Les permissions du fichier n'ont pas pu être définies. Le certificat et la clé n'ont pas été enregistrés. Utilisez un autre fichier svp. The file could not be written successfully. Please use another file. Le fichier n'a pas pu être enregistré correctement. Veuillez utiliser un autre fichier. The file could not be opened for reading. Please use another file. Le fichier n'a pas pu être lu. Veuillez utiliser un autre fichier. The file is empty or could not be read. Please use another file. Le fichier est vide ou n'a pu être lu. Veuillez utiliser un autre fichier. The file did not contain a valid certificate and key. Please use another file. Le fichier ne contient pas de clé et de certificat valide. Veuillez utiliser un autre fichier. Select file to export certificate to Sélectionnez le fichier dans lequel exporter le certificat Select file to import certificate from Sélectionnez le fichier à partir duquel importer le certificat Unable to import. Missing password or incompatible file type. Import impossible. Mot de passe manquant ou type de fichier invalide. <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. <b>Expiration du certificat :</b> Votre certificat va bientôt expirer. Vous devez le renouveler ou vous ne pourrez plus vous connecter aux serveurs sur lesquels vous êtes enregistré. Certificates Certificate Management Gestion du Certificat Certificate Authentication Authentification par certificat Authenticating to servers without using passwords Authentification aux serveurs sans utiliser de mots de passe Current certificate Certificat actuel This is the certificate Mumble currently uses. C'est le certificat que Mumble utilise actuellement. Current Certificate Certificat actuel Create a new certificate Créer un nouveau certificat This will create a new certificate. Créera un nouveau certificat. Import certificate from file Importer un certificat depuis un fichier This will import a certificate from file. Importera un certificat depuis un fichier. Import a certificate Importer un certificat Export Certificate Exporter un certificat This will export a certificate to file. Exportera le certificat vers un fichier. Export current certificate Exporter le certificat actuel Import Certificate Importer un certificat PKCS #12 Certificate import Importation de certificat PKCS #12 <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble peut importer des certificats stockés au format PKCS #12. C'est le format utilisé lors de l'exportation de la clé de Mumble, et aussi lors de l'export de clés depuis Firefox, Internet Explorer, Opera, etc.</p><p>Si le fichier est protégé par un mot de passe, vous avez besoin de celui-ci pour importer le certificat.</p> Import from Importer depuis Filename to import from Nom de fichier à importer This is the filename you wish to import a certificate from. C'est le fichier à partir duquel vous souhaitez importer le certificat. Select file to import from Sélectionnez le fichier à importer This opens a file selection dialog to choose a file to import a certificate from. Ouvre la boîte de dialogue pour sélectionner le fichier de certificat à importer. Open... Ouvrir... Password Mot de passe Password for PKCS#12 file Fichier pour le mot de passe au format PKCS #12 This is the password for the PKCS#12 file containing your certificate. C'est le mot de passe pour le fichier PKCS #12 contenant votre certificat. Certificate to import Certificat à importer This is the certificate you are importing. C'est le certificat que vous aller importer. Certificate Details Détails du certificat Replace Certificate Remplacer le certificat Replace existing certificate with new certificate? Remplacer le certificat existant par le nouveau ? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> <p>Vous avez déjà un certificat enregistré dans Mumble, et vous êtes sur le point de le remplacer.</p> <p>Si vous êtes en train de le mettre à jour avec un certificat certifié par une autorité de confiance et que les adresses de courriel correspondent, cette opération est sûre et les serveurs auxquels vous vous connectez reconnaîtront le certificat de votre adresse de courriel. </p> <p>Si ce n'est pas le cas, vous ne pourrez plus être reconnu par les serveurs auprès desquels vous vous êtes précédemment authentifiés. Si vous ne vous êtes enregistré sur aucun serveur, vous n'avez pas de soucis à vous faire. </p> <p> Êtes-vous sûr de vouloir remplacer votre certificat ? </p> This is the certificate Mumble currently uses. It will be replaced. C'est le certificat Mumble que vous utilisez actuellement. Il sera remplacé. New certificate Nouveau certificat This is the new certificate that will replace the old one. C'est le nouveau certificat qui va remplacer l'ancien. New Certificate Nouveau certificat Make a backup of your certificate Faire une sauvegarde de votre certificat Export to Exporter vers Filename to export to Nom du fichier exporté This is the filename you wish to export a certificate to. C'est le nom de fichier dans lequel vous souhaitez exporter votre certificat. Save As... Enregistrer sous... This is the certificate Mumble currently uses. It will be exported. C'est le certificat que Mumble utilise actuellement. Il sera exporté. Generate a new certificate for strong authentication Génère un nouveau certificat pour l'authentification forte <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> <p>Mumble va maintenant générer un certificat pour l'authentification forte avec les serveurs.</p><p>Si vous voulez, vous pouvez spécifier des informations additionnelles à enregistrer dans le certificat qui seront présentées aux serveurs lors de vos connexions. Si vous fournissez une adresse de courriel valide, vous pouvez demander à une autorité de certification de vous délivrer un certificat de courriel plus tard, qui permet une identification forte.</p> Name Nom Email Courriel Your email address (e.g. johndoe@mumble.info) Votre adresse de courriel (ex. jacquesdupond@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. C'est votre adresse de courriel. Il est fortement recommandé de fournir une adresse de courriel valide, car cela vous permettra de passer à un certificat d'authentification forte sans problèmes. Your name (e.g. John Doe) Votre nom (ex. Jacques Dupond) This is your name, and will be filled out in the certificate. This field is entirely optional. C'est votre nom, et celui-ci sera recopié dans le certificat. Ce champ est entièrement optionnel. Finish Terminer Certificate-based authentication is ready for use L'authentification par certificat est prête à être utilisée Enjoy using Mumble with strong authentication. Profitez de l'authentification forte avec Mumble. Automatic certificate creation Création automatique d'un certificat <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>Si vous perdez votre certificat, ce qui peut se produire si votre ordinateur est victime d'une panne matérielle ou si vous réinstallez votre machine, vous ne pourrez plus vous authentifier sur aucun des serveurs sur lesquels vous vous étiez enregistré. Il est donc <b>obligatoire</b> de faire une sauvegarde de votre certificat. Nous recommandons fortement de le sauvegarder sur un stockage amovible comme une clef USB.</p> <p>Notez que ce fichier ne sera pas chiffré et que toute personne qui mettra la main dessus pourra se faire passer pour vous, conservez-le donc précieusement.</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> <p>Mumble peut utiliser des certificats pour s'authentifier auprès de serveurs. Utiliser des certificats évite l'utilisation de mots de passe, ce que qui signifie que vous n'avez besoin de divulguer aucun mot de passe aux sites distants. Cela permet également un enregistrement très simple de l'utilisateur et une liste d'amis côté client indépendante des serveurs.</p><p>Tandis que Mumble peut fonctionner sans certificats, la majorité des serveurs s'attend à en avoir un.</p><p>Créer un nouveau certificat automatiquement est suffisant dans la plupart des cas. Mais Mumble prend également en charge les certificats représentant la confiance dans la propriété d'une adresse e-mail de la part de l'utilisateur. Ces certificats sont délivrés par des tiers. Pour plus d'informations, consultez notre <a href="http://mumble.info/certificate.php">documentation du certificat d'utilisateur</a>. </p> ChanACL None Aucun Traverse Traverser Enter Entrer Speak Parler Mute/Deafen Rend muet/sourd Make channel Créer un salon Make temporary Créer des temporaires Link channel Lier des salons This represents no privileges. Ne représente aucun privilège. This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. Représente l'accès total au salon, incluant la capacité de changer les informations des groupes et des LCA (Listes de Contrôle d'Accès, ACL en anglais). Ce privilège inclut tous les autres privilèges. This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. Représente la permission de traverser un salon. Si ce privilège est interdit à un utilisateur, il sera incapable d'accéder à ce salon ainsi qu'à ses sous-salons, peu importe les autres permissions des sous-salons. This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. Représente la permission de rejoindre un salon. Si vous avez une structure de salons hiérarchique, vous voudriez peut-être donner à tout le monde le droit de Traverser, mais restreindre le droit d'Entrer dans le salon racine de votre hiérarchie. This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. Représente la permission de parler dans un salon. Un utilisateur sans ce droit va être supprimé par le serveur (vu comme muet) et ne sera pas capable de parler à moins que quelqu'un ayant les droits nécessaires ne lui donne la parole. This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. Représente la permission de chuchoter vers ce salon depuis l'extérieur. Fonctionne exactement comme le droit de <i>parler</i>, mais s'applique aux paquets envoyés avec la touche Chuchoter enfoncée. Peut être utilisé pour envoyer un message à plusieurs salons sans avoir besoin de les lier. This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. Représente la permission de rendre muet et sourd d'autres utilisateurs. Une fois muet, un utilisateur le reste jusqu'à ce qu'un autre utilisateur ayant ce privilège lui rende la voix, ou qu'il se reconnecte au serveur. This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. Représente la permission de déplacer un utilisateur vers un autre salon ou de l'éjecter du serveur. Pour déplacer un utilisateur, celui-ci doit avoir le droit d'entrer dans le salon, ou l'utilisateur le déplaçant doit avoir le droit de déplacement/éjection sur le salon ciblé. Les utilisateurs ayant ce privilège peuvent déplacer des utilisateurs dans des salons dans lesquels l'utilisateur ciblé n'a normalement pas le droit d'entrer. This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. Représente la permission de créer des sous-salons. L'utilisateur créant le sous-salon sera ajouté au groupe administrateur de ce sous-salon. This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. Représente la permission de créer un sous-salon temporaire. L'utilisateur créant le sous-salon sera ajouté au groupe admin du sous-salon. Les salons temporaires ne sont pas mémorisés et disparaissent dès que le dernier utilisateur les quitte. This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. Représente la permission de lier des salons. Les utilisateurs présents dans des salons liés s'entendent mutuellement, aussi longtemps que l'utilisateur a le privilège de parler dans le salon de celui qui écoute. Vous avez besoin du privilège de lien dans les deux salons pour créer un lien, mais seulement dans l'un des deux pour le supprimer. This represents the permission to write text messages to other users in this channel. Représente la permission d'écrire des messages textuels à d'autres utilisateurs dans ce salon. This represents the permission to forcibly remove users from the server. Représente la permission d'expulser un utilisateur du serveur. This represents the permission to permanently remove users from the server. Représente la permission de bannir un utilisateur du serveur. This represents the permission to register and unregister users on the server. Représente la permission d'enregistrer ou désinscrire les utilisateurs du serveur. This represents the permission to register oneself on the server. Représente la permission de s'enregistrer soi-même sur le serveur. Whisper Chuchoter Move Déplacer Text message Message texte Kick Expulser Ban Bannir Register User Enregistrer l'utilisateur Register Self S'enregistrer Write ACL Écrire LCA ChatbarTextEdit Paste and &Send Paste and send Coller et env&oyer <center>Type chat message here</center> <center>Saisir un message ici</center> ClientUser Friend Ami Authenticated Authentifié Priority speaker Parole prioritaire Recording Enregistrement Muted (server) Muet (serveur) Deafened (server) Sourd (serveur) Local Ignore (Text messages) Ignore localement (les messages textuels) Local Mute Muet (local) Muted (self) Muet (soi-même) Deafened (self) Sourd (soi-même) ConfigDialog Accept changes Accepter les modifications This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. Ce bouton acceptera les préférences actuelles et retournera à l'application.<br />Les préférences seront sauvegardées sur votre disque dur quand vous quitterez l'application. Reject changes Annuler les modifications This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. Ce bouton annulera toutes les modifications et retournera à l'application.<br />Les paramètres seront restaurés à leurs états précédents. Apply changes Appliquer les modifications This button will immediately apply all changes. Ce bouton appliquera immédiatement toutes les modifications. Undo changes for current page Annuler les modifications apportées à la page courante This button will revert any changes done on the current page to the most recent applied settings. Ce bouton revient sur tous les changements effectués sur la page en cours depuis la dernière sauvegarde de paramètres. Restore defaults for current page Restaurer par défaut pour la page courante This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. Ce bouton restaure les paramètres par défaut de la page courante seulement. Les autres pages ne sont pas modifiées.<br />Pour restaurer tous les paramètres par défaut, vous devez utiliser ce bouton sur toutes les pages. Mumble Configuration Configuration de Mumble ConnectDialog Connecting to %1 Connexion à %1 Enter username Entrer le nom d'utilisateur Adding host %1 Ajout de l'hôte %1 Servername Nom du serveur Hostname Nom d'hôte Bonjour name Nom Bonjour Port Port Addresses Adresses Website Site internet Packet loss Paquets perdus Ping (80%) Ping (80 %) %1 ms %1 ms Ping (95%) Ping (95 %) Bandwidth Bande passante %1 kbit/s %1 kbits/s &Connect &Connexion &Filters &Filtres Unknown Users Utilisateurs Version Version Failed to fetch server list Impossible de récupérer la liste des serveurs Mumble Server Connect Connexion au serveur Mumble Ping Ping Remove from Favorites Supprimer des favoris Add custom server Ajouter un serveur personnalisé Show all servers that respond to ping Afficher tous les serveurs répondant au ping Show all servers with users Afficher tous les serveurs avec des utilisateurs Show all servers Afficher tous les serveurs &Copy &Copier Copy favorite link to clipboard Copier le lien favori dans le presse papier &Paste C&oller Paste favorite from clipboard Coller le favoris du presse papier &Edit... &Éditer... &Add New... &Ajouter nouveau... Add to &Favorites Ajouter aux &Favoris Open &Webpage Ouvrir la page &web Show &Reachable Affiche&r les joignables Show &Populated Afficher les &peuplés Show &All &Afficher tous ConnectDialogEdit Edit Server Éditer le serveur Name of the server Nom du serveur A&ddress A&dresse Internet address of the server. Internet address of the server. Adresse internet du serveur. <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Adresse</b><br/> Adresse internet du serveur. Ça peut être une nom d'hôte, une adresse IPv4/IPv6 ou un identifiant du service Bonjour. Les identifiants du service Bonjour doivent être préfixés avec un '@' pour être reconnus par Mumble. &Port &Port Port on which the server is listening Port d'écoute du serveur <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. <b>Port</b><br/> Port d'écoute du serveur. Si le serveur est identifié par le service Bonjour, ce champ est ignoré. &Username &Nom d'utilisateur Username to send to the server Nom d'utilisateur à envoyer au serveur <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. <b>Nom d'utilisateur</b><br/> Nom d'utilisateur envoyé au serveur. Notez que le serveur peut imposer des restrictions sur l'utilisation des noms. De plus, votre nom peut déjà avoir été choisi par un autre utilisateur. Label Nom Add Server Ajouter le serveur You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 Vous êtes actuellement connecté à un serveur. Souhaitez-vous renseigner les informations de connexion pour ce server ? Hôte : %1 Port : %2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 Vous avez une URL dans votre presse-papier. Souhaitez-vous remplir la fenêtre à partir de cette URL ? Hôte : %1 Port : %2 Password Mot de passe Password to send to the server Mot de passe à envoyer au serveur <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. <b>Mot de passe</b><br /> Mot de passe envoyé au serveur lors de la connexion. Ce mot de passe est nécessaire lors de la connexion en tant que <i>SuperUser</i> ou à un serveur utilisant l'authentification par mot de passe. S'il n'est pas renseigné ici, le mot de passe sera demandé lors de la connexion. Show password Voir le mot de passe <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. <b>Nom</b><br/> Nom du serveur. C'est le nom du serveur tel qu'il apparaîtra dans vos favoris et qui vous pemettra de le choisir plus facilement. Local server label Nom du serveur local 127.0.0.1 127.0.0.1 64738 64738 Your username Votre identifiant Your password Votre mot de passe &Fill CoreAudioSystem Default Device Périphérique par défaut CrashReporter Mumble Crash Report Rapport d'erreur de Mumble <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> <p><b>Nous sommes vraiment navrés, mais il semblerait que Mumble ait cessé de fonctionner. Voulez-vous envoyer un rapport de l'incident aux développeurs de Mumble ?</b></p><p>Ce rapport contient une copie partielle de la mémoire de Mumble au moment de son arrêt, et aidera les développeurs à résoudre le problème.</p> Email address (optional) Adresse de courriel (optionnel) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash Veuillez décrire brièvement et en anglais ce que vous faisiez au moment du plantage Send Report Envoyer le rapport Don't send report Ne pas envoyer de rapport Crash upload successful Envoi du rapport effectué Thank you for helping make Mumble better! Merci d'aider à améliorer Mumble ! Crash upload failed Erreur lors de l'envoi du rapport We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. Nous sommes navrés, mais l'envoi du rapport d'erreur a échoué avec l'erreur %1 %2. Veuillez en informer un développeur. This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 Ce n'est vraiment pas drôle, mais il semblerait qu'il y ait un bogue dans le code du rapport d'erreur, et donc, le rapport n'a pu être envoyé. Vous devriez informer un développeur à propos de l'erreur %1 Uploading crash report Envoi du rapport d'erreur Abort upload Annuler l'envoi DXAudioInput Default DirectSound Voice Input Entrée Voix par défaut Opening chosen DirectSound Input device failed. No microphone capture will be done. Ouverture de l'entrée son choisie impossible. Aucune capture son depuis le microphone ne sera faite. Opening chosen DirectSound Input failed. Default device will be used. Ouverture de l'entrée son choisie impossible. Le périphérique par défaut sera utilisé. Lost DirectSound input device. Périphérique d'entrée son perdu. DXAudioOutput Default DirectSound Voice Output Sortie Voix par défaut Opening chosen DirectSound Output failed. Default device will be used. Ouverture de la sortie son choisie impossible. Le périphérique par défaut sera utilisé. Lost DirectSound output device. Périphérique de sortie perdu. Opening chosen DirectSound Output failed. No audio will be heard. Ouverture de la sortie son choisie impossible. Vous n'entendrez aucun son. Database Mumble failed to initialize a database in any of the possible locations. Mumble n'a pas réussi à initialiser la base de données à aucun des emplacements possibles. The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. La base de données '%1' est en lecture seule. Mumble ne peut pas enregistrer les paramètres du serveur (ex. le certificat SSL) tant que vous n'aurez pas résolu le problème. DeveloperConsole Developer Console Console Développeur DockTitleBar Drag here Cliquer ici pour déplacer GlobalShortcut Shortcuts Raccourcis List of configured shortcuts Liste des raccourcis actuellement configurés Function Fonction Data Données Shortcut Raccourci Suppress Suspend Add new shortcut Ajouter un nouveau raccourci This will add a new global shortcut Ajoutera un nouveau raccourci global &Add &Ajouter Remove selected shortcut Supprime le raccourci sélectionné This will permanently remove a selected shortcut. Supprime définitivement le raccourci sélectionné. &Remove Supp&rimer <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> <html><head/><body><p>Actuellement Mumble ne peut utiliser que les boutons de la souris et les touches de combinaison du clavier (Alt, Ctrl, Cmd, etc.) pour les raccourcis globaux.</p><p>Si vous désirez davantage de flexibilité, vous pouvez activer <span style=" font-style:italic;">l'accès des périphériques d'aide</span> dans les préférences d'accessibilité du système. Toutefois, veuillez noter que cette modification permet aussi potentiellement aux applications malveillantes de lire ce qui est tapé sur votre clavier.</p></body></html> Open Accessibility Preferences Ouvrir les préférences d'accessibilité Skip Ignorer Enable Global Shortcuts Activer les raccourcis globaux <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. Additional Shortcut Engines Moteurs de raccourcis additionnels <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. <b>Activer les événements Windows</b>. <br />Ceci active le système de surveillance d'événements Windows. Utiliser ce système permet à Mumble d'étouffer les bruits de touches de claviers et de clics de souris. Enable Windows hooks <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. <b>Activer G-Key</b>.<br />Cela active le support du système de raccourcis G-Key, pour les touches "G" trouvées sur les claviers Logitech. Enable GKey Activer G-Key <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. <b>Activer XInput</b><br />Cela active le support du système de raccourcis XInput, pour les manettes Xbox compatibles. Enable XInput Activer XInput <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. <b>Activer les raccourcis dans les applications en mode privilégié</b>.<br />Également appelé "UIAccess ". Cela permet à Mumble de recevoir des événements de raccourci globaux des programmes exécutés à des niveaux de privilèges élevés, tels qu'une Invite de Commandes d'Administration ou d'anciens jeux qui s'exécutent avec des privilèges administrateur. <br /><br /> Sans cette option, l'utilisation des raccourcis globaux de Mumble dans les applications en mode privilégié ne fonctionnera pas. Cela peut sembler inconsistant : par exemple, si le bouton Push-to-Talk est pressé dans un programme non privilégié, mais relaché dans une application privilégiée, Mumble n'observera pas qu'il a été relaché et vous continuerez à parler jusqu'à ce que vous appuyiez sur le bouton Push-to-Talk à nouveau. Enable shortcuts in privileged applications Activer les raccourcis dans les applications en mode exclusif GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> <html><head/><body><p>Mumble peut seulement utiliser les boutons de la souris et les modificateurs de clavier (Alt, Ctrl, Cmd, etc.) pour les raccourcis globaux.</p><p>Si vous voulez plus de flexibilité, vous pouvez ajouter Mumble en tant que programme d'accessibilité de confiance dans la section Sécurité & Vie Privée des Paramètres Systèmes de votre Mac.</p><p>Dans le panneau Sécurité & Vie Privée, changez dans l'onglet Vie Privée. Après choississez Accessibilité (près du bas) dans la liste à la gauche. Finalement, ajoutez Mumble à la liste des programmes d'accessibilité de confiance.</body></html> Shortcuts Raccourcis Shortcut button combination. Combinaison de touches du raccourci. <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. <b>Combinaison de touches du raccourci global.</b><br />Effectuez un clic dans ce champ puis pressez la combinaison de touches/boutons désirée que vous souhaitez attribuer. Double-cliquez pour effacer. Suppress keys from other applications Supprimer les touches pour les autres applications <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. <b>Cache les touches pressées aux autres applications.</b><br />Activer cette option cachera la touche (ou la dernière touche pour une combinaison) aux autres applications. Notez que toutes les touches ne peuvent pas être supprimées. GlobalShortcutTarget Whisper Target Cible du chuchotement Whisper to list of Users Chuchoter à une liste d'utilisateurs Channel Target Salon cible Restrict to Group Restreindre au groupe If specified, only members of this group will receive the whisper. Si spécifié, seulement les membres de ce groupe recevront le chuchotement. List of users Liste des utilisateurs Add Ajouter Remove Supprimer Modifiers Modificateurs Do not send positional audio information when using this whisper shortcut. Ne pas envoyer les informations de positionnement audio en utilisant le chuchotement. Ignore positional audio Ignorer le positionnement audio Shout to Linked channels Crier aux salons liés Shout to subchannels Crier aux sous-salons Shout to Channel Crier au salon The whisper will also be transmitted to linked channels. Le chuchotement sera aussi transmis aux salons liés. The whisper will also be sent to the subchannels of the channel target. Le chuchotement sera aussi transmis aux sous-salons du salon cible. GlobalShortcutX Mouse %1 Souris %1 JackAudioSystem Hardware Ports Mono Mono Stereo Stéréo LCD Not connected Non connecté LCDConfig Enable this device Activer ce périphérique LCD LCD Devices Périphériques Name Nom <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> <p>C'est la liste des périphériques LCD disponibles sur votre système. Il liste leur nom, mais inclut aussi la taille de l'affichage. Mumble supporte l'affichage simultané sur plusieurs LCD.</p> <h3>Taille :</h3> <p>Ce champ décrit la taille d'un périphérique LCD. La taille est donnée en pixels (pour les LCD graphiques) ou en caractères (pour les LCD texte).</p> <h3>Activé :</h3> <p>Indique à Mumble s'il doit utiliser un périphérique LCD particulier.</p> Size Taille Enabled Activé Views Vues Minimum Column Width Taille minimale des colonnes <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> <p>Cette option définit la taille minimale de la colonne dans la vue de utilisateur.</p> <p>Si trop de personnes parlent en même temps, la vue utilisateur sera coupée en colonnes. Vous pouvez utiliser cette option pour spécifier un compromis entre le nombre d'utilisateurs affichés sur le LCD, et la longueur des noms d'utilisateurs.</p> This setting decides the width of column splitter. Ce paramètre détermine la largeur de la séparation entre les colonnes. Splitter Width Largeur de la séparation Log Debug Débogage Critical Critique Warning Avertissement Information Information Server Connected Connecté au serveur Server Disconnected Déconnecté du serveur Other self-muted/deafened Un autre s'est rendu sourd/muet Permission Denied Permission refusée Text Message Message texte User Joined Server Un utilisateur a rejoint le serveur User Left Server Un utilisateur a quitté le serveur User recording state changed Modif. des paramètres d'enregistrement d'un utilisateur User kicked (you or by you) Utilisateur expulsé (vous ou par vous) User kicked Utilisateur expulsé You self-muted Vous vous êtes rendu muet User muted (you) Un utilisateur rendu muet (vous) User muted (by you) Un utilisateur rendu muet (par vous) User muted (other) Un utilisateur rendu muet (autre) User Joined Channel Un utilisateur a rejoint le salon User Left Channel Un utilisateur a quitté le salon You self-unmuted Vous vous êtes rendu la voix You self-deafened Vous vous êtes rendu sourd You self-undeafened Vous vous êtes rendu l'ouïe User renamed Utilisateur renommé You Joined Channel Vous avez rejoint le salon You Joined Channel (moved) Vous avez rejoint le salon (déplacé) User connected and entered channel Un utilisateur s'est connecté et est entré dans le salon User left channel and disconnected Un utilisateur a quitté le salon et s'est déconnecté Private text message Message privé textuel the server le serveur [[ Invalid size ]] [[ Taille invalide ]] [[ Text object too large to display ]] [[ Texte trop long pour être affiché ]] [Date changed to %1] [Date changée en %1] link to %1 lien pour %1 FTP link to %1 Lien FTP pour %1 player link lien du joueur channel link lien du salon %1 link %1 lien LogConfig Toggle console for %1 events Active/désactive la console pour les événements %1 Toggle pop-up notifications for %1 events Active/désactive les notifications sous forme de bulle pour les événements %1 Toggle Text-To-Speech for %1 events Active/désactive la synthèse vocale pour les événements %1 Click here to toggle sound notification for %1 events Cliquez ici pour activer/désactiver les notifications sonores pour les événements %1 Toggle window highlight (if not active) for %1 events Active/désactive la surbrillance de fenêtre (si innactive) pour les événements %1 Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change Chemin d'accès au fichier son utilisé pour les notifications d'événements %1<br />Cliquez une fois pour écouter<br />Cliquez deux fois pour le modifier Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. Active/désactive les messages sur la console pour les événements %1.<br />Si l'option est activée, Mumble affichera tous les événements de %1 dans la fenêtre d'historique. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. Active/désactive les notifications sous forme de bulle pour les événements %1.<br />Si l'option est activée, Mumble affichera tous les événements de %1 dans une bulle de notification. Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. Chemin d'accès au fichier son utilisé pour les notifications d'événements %1<br />Cliquez une fois pour écouter<br />Cliquez deux fois pour le modifier<br />Veuillez vérifier que la notification sonore pour ces événements est activée, ou ce paramètre n'aura aucun effet. Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. Active/désactive la synthèse vocale pour les événements %1.<br />Si l'option est activée, Mumble utilisera la synthèse vocale pour vous lire tous les événements de %1. La synthèse vocale est aussi capable de lire le contenu des événements, ce qui n'est pas le cas des fichiers sonores. La synthèse vocale et les fichiers sonores ne peuvent pas être activés en même temps. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. Active/désactive les notifications sonores pour les événements %1.<br />Si l'option est activée, Mumble utilisera le fichier son que vous avez prédéfini pour vous indiquer tous les événements de %1. Les fichiers sonores et la synthèse vocale ne peuvent pas être activés en même temps. Messages Messages Message Message Console Console Notification Notification Text-To-Speech Synthèse vocale Soundfile Fichier son Path Chemin Text To Speech Synthèse vocale Volume Volume Volume of Text-To-Speech Engine Volume du moteur de synthèse vocale <b>This is the volume used for the speech synthesis.</b> <b>C'est le volume utilisé pour la synthèse vocale.</b> Length threshold Seuil de taille Message length threshold for Text-To-Speech Engine Seuil de taille pour les messages de la synthèse vocale <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. <b>Il s'agit du seuil de longueur utilisé pour la synthèse vocale.</b><br />Les messages plus longs que cette limite ne seront pas lus en entier. Characters Caractères Whisper Chuchotement If checked you will only hear whispers from users you added to your friend list. Si cochée, vous n'entendrez les chuchotements que des utilisateurs que vous avez ajoutés à votre liste d'amis. Only accept whispers from friends N'accepter les chuchotements que des amis If enabled text messages you send will be read back to you with TTS Si activée, les messages textuels que vous enverrez vous seront lus avec la synthèse vocale Read back own messages Lire ses propres messages Chat Log Journal des discussions Maximum chat length Longueur maximale des discussions Unlimited Illimitée Lines Lignes Highlight Surbrillance LookConfig System default Par défaut None Aucun Only with users Seulement quand il y a des utilisateurs All Tous Ask Demander Do Nothing Ne rien faire Move Déplacer <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory <a href="%1">Parcourir</a> User Interface Interface utilisateur This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. Définit quels sont les salons à étendre automatiquement. <i>Aucun</i> et <i>Tous</i> étendra aucun ou tous les salons, alors que <i>Seulement avec des utilisateurs</i> étendra et réduira les salons dès que les utilisateurs les joindront ou les quitteront. List users above subchannels (requires restart). Liste les utilisateurs au-dessus des sous-salons (redémarrage requis). <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. <b>Si cochée, les utilisateurs seront affichés au-dessus des sous-salons dans l'arborescence.</b><br />Mumble doit être redémarré pour activer les changements. Users above Channels Utilisateurs en haut des salons <b>If set, will verify you want to quit if connected.</b> <b>Si cochée, vérifie que vous voulez quitter si vous êtes connecté.</b> Show number of users in each channel Affiche le nombre d'utilisateurs dans chaque salon Show channel user count Afficher le nombre d'utilisateurs Language Langue Language to use (requires restart) Langue à utiliser (nécessite un redémarrage) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. <b>Définit quel langue Mumble devrait utiliser</b><br />Vous devez redémarrer Mumble pour utiliser une nouvelle langue. Look and Feel Apparence Layout Disposition Classic Classique Stacked Empilée Hybrid Hybride Custom Personnalisée This changes the behavior when moving channels. Change le comportement lors du déplacement des salons. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. Définit le comportement en cas de déplacement d'un salon ; peut être utilisé pour prévenir un déplacement accidentel. <i>Déplacer</i> déplace le salon sans rien demander. <i>Ne rien faire</i> n'effectue aucune opération et affiche un message d'erreur. <i>Demander</i> affiche une fenêtre de confirmation pour confirmer le déplacement du salon. Expand Élargir When to automatically expand channels Quand étendre automatiquement les salons Channel Dragging Faire glisser le salon Ask whether to close or minimize when quitting Mumble. Demande si on quitte ou réduit la fenêtre en fermant Mumble. Ask on quit while connected Confirmer l'arrêt si connecté Always On Top Toujours au-dessus <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> <b>Si cochée, réduire la fenêtre principale de Mumble la cachera et elle ne sera accessible que depuis la barre des tâches. Sinon, il sera réduit comme toute fenêtre normale.</b> Hide in tray when minimized Réduire dans la barre des tâches Hide the main Mumble window in the tray when it is minimized. Cache la fenêtre principale de Mumble dans la barre des tâches quand elle est réduite. This setting controls when the application will be always on top. Contrôle quand l'application sera toujours au-dessus. Never Jamais Always Toujours In minimal view En vue minimale In normal view En vue normale Displays talking status in system tray Affiche mon statut vocal dans la barre des tâches Show talking status in tray icon Afficher mon statut vocal dans la barre des tâches This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. Ce paramétrage détermine dans quelle situation l'application restera toujours au-dessus. Si vous sélectionnez <i>Jamais</i>, l'application ne restera jamais au-dessus. <i>Toujours</i> gardera toujours l'application au-dessus.<i>En vue minimale</i> ne gardera l'application au-dessus que lorsque la vue minimale est activée / désactivée. Show context menu in menu bar Menu contextuel dans la barre de menu Apply some high contrast optimizations for visually impaired users Applique quelques optimisations de contraste pour les utilisateurs malvoyants Optimize for high contrast Contraste élevé Application Application Adds user and channel context menus into the menu bar Ajoute les menus contextuels d'utilisateur et de salon dans la barre de menu Tray Icon Icône de la barre des tâches Channel Tree Arborescence des salons Use selected item as the chat bar target Utiliser l'élément sélectionné comme cible de la barre de discussion Filter automatically hides empty channels Le filtrage masque automatiquement les salons vides Show transmit mode dropdown in toolbar Afficher le sélecteur de mode de transmission dans la barre d'outils Theme Thème Theme to use to style the user interface Thème à utiliser pour l'interface utilisateur <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. <b>Sélectionne le thème à utiliser pour l'interface de Mumble<b><br />Mumble collecte les thèmes de certains dossiers et les affichent dans cette liste. Le thème sélectionné sera utilisé pour personnaliser l’apparence de Mumble. Cela inclut les couleurs, les icônes et plus encore. User Dragging Faire glisser l'utilisateur This changes the behavior when moving users. Change le comportement lors du déplacement des utilisateurs. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. Définit le comportement en cas de déplacement d'un utilisateur ; peut être utilisé pour prévenir un déplacement accidentel. <i>Déplacer</i> déplace l'utilisateur sans rien demander. <i>Ne rien faire</i> n'effectue aucune opération et affiche un message d'erreur. <i>Demander</i> affiche une fenêtre de confirmation pour confirmer le déplacement de l'utilisateur. <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. <b>Activer le menu Développeur</b><br />Ceci active menu "Développeur" dans Mumble. Ce menu est utilisé pour les fonctions spécifiques aux développeurs, comme la Console Développeur. Enable Developer menu Activer le menu de développeur When in custom layout mode, checking this disables rearranging. Dans le mode de disposition customisée, cocher cela désactive la réorganisation. Lock layout Bloquer la disposition MainWindow Root Racine Push-to-Talk Global Shortcut Appuyer-pour-parler Push and hold this button to send voice. Global Shortcut Pressez et maintenez ce bouton pour parler. This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut Configure le bouton Appuyer-pour-parler, et tant que vous presserez ce bouton, votre voix sera transmise. Reset Audio Processor Global Shortcut RàZ processeur audio Unlink Plugin Global Shortcut Désactiver le plugin Push-to-Mute Global Shortcut Appuyez-pour-Muet Join Channel Global Shortcut Rejoindre le salon Toggle Overlay Global Shortcut Activer/désactiver l'overlay Toggle state of in-game overlay. Global Shortcut Activer/Désactiver l'affichage de l'overlay. Toggle Minimal Global Shortcut Active/désactive l'interface minimale Volume Up (+10%) Global Shortcut Augmenter volume (+10 %) Volume Down (-10%) Global Shortcut Diminuer le volume (-10 %) Mumble Mumble Mumble -- %1 Mumble -- %1 &Window &Fenêtre Minimize Réduire Ctrl+M Ctrl+M Close Fermer Mumble is currently connected to a server. Do you want to Close or Minimize it? Mumble est actuellement connecté à un serveur. Voulez-vous le fermer ou le réduire dans la barre des tâches ? Mute Self Global Shortcut Se rendre muet Set self-mute status. Global Shortcut Activer le statut muet pour soi-même. This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut Activera ou désactivera votre statut muet. Si vous vous rendez la voix, vous entendrez aussi. Deafen Self Global Shortcut Se rendre sourd Set self-deafen status. Global Shortcut Activer le statut sourd pour soi-même. This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut Se rendre sourd ou non. Vous rendre sourd vous rendra aussi muet. Whisper/Shout Whisper Chuchoter/Crier <center>Not connected</center> Not connected <center>Non connecté</center> Clear Effacer Opening URL %1 Ouvrir l'URL %1 File does not exist Fichier inexistant File is not a configuration file. Le fichier n'est pas un fichier de configuration. Settings merged from file. Paramètres fusionnés à partir du fichier. URL scheme is not 'mumble' Le schéma d'URL n'est pas 'mumble' This version of Mumble can't handle URLs for Mumble version %1.%2.%3 Cette version de Mumble ne peut pas manipuler les URLs pour Mumble version %1.%2.%3 Connecting to %1 Connexion à %1 Enter username Entrer le nom d'utilisateur Connecting to server %1. Connexion au serveur %1. Reconnecting. Reconnexion. Transmit Mode set to Continuous Mode de transmission continu <p>%1 (%2)<br />%3</p> <p>%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> <h2>Salon vocal</h2><p>Chiffré en OCB-AES128 128 bits<br />%1 ms de latence moyenne (déviation de %4)</p> Register yourself as %1 S'enregistrer en tant que %1 <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <p>Vous êtes sur le point de vous enregistrer sur ce serveur. Cette action ne peut pas être annulée, et votre identifiant ne pourra plus être modifié une fois cette étape effectuée. Vous serez pour toujours connu comme '%1' sur ce serveur</p><p>Êtes-vous sûr de vouloir vous enregistrer ?</p> <h2>Version</h2><p>Protocol %1</p> <h2>Version</h2><p>Protocole %1</p> <p>No build information or OS version available</p> <p>Aucune information de version de système disponible</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) La connection est chiffrée et authentifiée avec %1 et utilise %2 comme méchanisme d'échange de clés (%3) The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) La connexion est chiffrée via %1, avec %2 en tant que message d'authentification et %3 comme mécanisme d'échange de clé (%4) The connection is secured by the cipher suite that OpenSSL identifies as %1 La connexion est sécurisée par la suite de codes secrets qu'OpenSSL identifie en tant que %1 <p>The connection provides perfect forward secrecy</p> <p>Cette connexion fournit une confidentialité parfaite en amont</p> <p>The connection does not provide perfect forward secrecy</p> <p>Cette connexion ne fournit pas une confidentialité parfaite en amont</p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> <h2>Canal de contrôle</h2><p>La connexion utilise %1</p>%2%3<p>%4 ms de latence en moyenne (%5 de déviation)</p><p>Hôte distant %6 (port %7)</p> Voice channel is sent over control channel Le canal vocal est transmis via le canal de contrôle Register user %1 Enregistrer l'utilisateur %1 <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> <p>Vous êtes sur le point d'enregistrer %1 sur le serveur. Cette action est irréversible, le nom d'utilisateur ne pourra pas être modifié, et %1 aura accès au serveur même si vous changez le mot de passe du serveur.</p><p>À partir de ce point, %1 sera authentifié avec le certificat actuellement utilisé.</p><p>Êtes-vous sûr de vouloir l'enregistrer %1 ?</p> Kicking user %1 Expulsion de l'utilisateur %1 Banning user %1 Bannissement de l'utilisateur %1 View comment on user %1 Voir le commentaire de l'utilisateur %1 Message to channel %1 Message pour le salon %1 Connected. Connecté. <li>Expected certificate digest (SHA-1): %1</li> <li>Un hash de certificat était attendu (SHA-1) : %1</li> Server presented a certificate which failed verification. Le serveur a présenté un certificat qui n'a pas pu être vérifié. <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> <p>%1.<br />Les erreurs de ce certificat sont les suivantes : </p><ol>%2</ol><p>Voulez-vous quand même accepter ce certificat ?<br />(Il sera également stocké et la question ne vous sera pas posée à nouveau.)<p> SSL Version mismatch Incompatibilité de version SSL Server connection failed. Échec de la connexion au serveur. <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>Saisir un message pour le salon '%1' ici</center> <center>Type message to user '%1' here</center> Type message to user '%1' here <center>Saisir un message pour l'utilisateur '%1' ici</center> Choose image file Choisir un fichier image Failed to load image Impossible de charger l'image Could not open file for reading. N'a pas pu ouvrir le fichier en lecture. Image format not recognized. Format d'image non reconnu. &User &Utilisateur &Channel &Salon Use in conjunction with Whisper to. Global Shortcut Utiliser en conjonction avec "Chuchoter à". This will switch the states of the in-game overlay. Global Shortcut Ceci changera l'état de l'overlay. Link Channel Global Shortcut Lier un salon Cycle Transmit Mode Global Shortcut Cycle Mode de Transmission Set Transmit Mode to Push-To-Talk Global Shortcut Set Transmit Mode to Continuous Global Shortcut Set Transmit Mode to VAD Global Shortcut Send Text Message Global Shortcut Envoyer un message textuel Send Clipboard Text Message Global Shortcut Envoyer le contenu du presse-papier This will send your Clipboard content to the channel you are currently in. Global Shortcut Ceci enverra le contenu de votre presse-papier au salon dans lequel vous vous trouvez actuellement. Continuous Continu Voice Activity Activité Vocale Push-to-Talk Appuyer pour Parler Mumble - Minimal View -- %1 Mumble - Vue Minimale -- %1 Cancel Annuler Save Image As... Enregistrer l'Image Sous... Save Image File Enregistrer le Fichier Image Could not save image: %1 Impossible d'enregistrer l'image : %1 Change your comment Changer votre commentaire Transmit Mode set to Voice Activity Mode de transmission réglé sur Activité Vocale Transmit Mode set to Push-to-Talk Mode de transmission réglé sur Appuyer pour Parler <p>Connected users: %1/%2</p> <p>Utilisateurs connectés: %1/%2</p> UDP Statistics Statistiques UDP To Server Au serveur From Server Du serveur Good Bon Late Tardif Lost Perdu Resync Resynchronisé <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> <h2>Bande passante audio</h2><p>Maximum %1 kbit/s<br />Actuelle %2 kbit/s<br />Codec : %3</p> Mumble Server Information Informations sur le serveur Mumble &View Certificate &Voir le certificat Enter reason Entrez la raison Sending message to %1 Envoi d'un message à %1 To %1: %2 À %1 : %2 Message to %1 Message à %1 Are you sure you want to reset the comment of user %1? Êtes-vous sûr de vouloir réinitialiser le commentaire de l'utilisateur %1 ? Are you sure you want to reset the avatar of user %1? Êtes-vous sûr de vouloir réinitialiser l'avatar de l'utilisateur %1 ? Are you sure you want to delete %1 and all its sub-channels? Êtes-vous sûr de vouloir supprimer %1 ainsi que tous ses sous-salons ? Sending message to channel %1 Envoyer un message au salon %1 Message to tree %1 Message à l'arborescence %1 To %1 (Tree): %2 (Tree) %1: %2 À l'arborescence %1 : %2 Unmuted and undeafened. N'est pas sourd et muet. Unmuted. N'est pas muet. Muted. Muet. Muted and deafened. Sourd et muet. Deafened. Sourd. Undeafened. N'est pas sourd. Restart Mumble? Redémarrer Mumble? Some settings will only apply after a restart of Mumble. Restart Mumble now? Certaines options ne seront appliquées qu'après un redémarrage de Mumble. Redémarrer Mumble maintenant? About Qt À propos de Qt SSL Verification failed: %1 Vérification SSL échoué : %1 <li>Server certificate digest (SHA-1): %1</li> <li>Hash du certificat du serveur (SHA-1) : %1</li> <b>WARNING:</b> The server presented a certificate that was different from the stored one. <b>ATTENTION :</b>Le serveur présente un certificat différent de celui mémorisé. This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. Ce serveur utilise un standard ancien du cryptage et n'est plus supporté par les versions modernes de Mumble. Server connection failed: %1. La connexion au serveur a échoué : %1. Disconnected from server. Déconnecté du serveur. Invalid username Nom d'utilisateur invalide You connected with an invalid username, please try another one. Vous vous êtes connecté avec un nom d'utilisateur invalide, veuillez en essayer un autre. Username in use Nom d'utilisateur en cours d'utilisation That username is already in use, please try another username. Ce nom d'utilisateur est déjà utilisé, veuillez essayer un autre nom d'utilisateur. Wrong certificate or password Mauvais certificat ou mot de passe Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. Mauvais certificat ou mot de passe pour utilisateur enregistré. Si vous êtes sûr que cet utilisateur est protégé par un mot de passe veuillez réessayer. Sinon annulez et vérifiez votre certificat et nom d'utilisateur. Wrong password Mauvais mot de passe Wrong server password for unregistered user account, please try again. Mauvais mot de passe de serveur pour un utilisateur non enregistré, veuillez essayer à nouveau. Images (*.png *.jpg *.jpeg) Images (*.png *.jpg *.jpeg) C&onfigure C&onfigurer &Help &Aide Log Historique This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. Affiche toute l'activité récente. Les connexions aux serveurs, les messages d'erreurs et d'informations sont affichés ici. &Quit Mumble &Quitter Mumble Closes the program Ferme le programme Exits the application. Quitte l'application. Ctrl+Q Ctrl+Q Open the server connection dialog Ouvrir la fenêtre de connexion du serveur &Disconnect &Déconnexion Disconnect from server Déconnexion du serveur Disconnects you from the server. Vous déconnecte du serveur. Show information about the server connection Afficher des informations sur la connexion avec le serveur This will show extended information about the connection to the server. Ceci affiche des informations supplémentaires sur la connexion avec le serveur. &Mute &Muet &Deafen Ren&dre sourd &Local Mute Ne plus &l'écouter Send a Text Message Envoyer un message textuel Sends a text message to another user. Envoyer un message textuel à un autre utilisateur. Add new channel Ajouter un nouveau salon This adds a new sub-channel to the currently selected channel. Ceci ajoute un nouveau sous-salon au salon actuellement choisi. Remove channel Supprimer le salon This removes a channel and all sub-channels. Ceci supprime un salon et tous ses sous-salons. Edit Groups and ACL for channel Éditer groupe et LCA pour le salon This opens the Group and ACL dialog for the channel, to control permissions. Ceci ouvre la fenêtre de groupe et LCA pour le salon, pour contrôler les permissions. &Link &Lier Link your channel to another channel Lier votre salon à un autre salon This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. C'est la barre de dialogue<br />Si vous saisissez du texte ici et pressez Entrée, le texte est envoyé à l'utilisateur ou au salon sélectionné. Si rien n'est sélectionné, le message est envoyé au salon actuel. Chatbar Barre de dialogue Shows a dialog of registered servers, and also allows quick-connect. Affiche une fenêtre des serveurs enregistrés, et permet aussi la connexion rapide. Kick user (with reason) Expulser l'utilisateur (avec raison) Kick selected user off server. You'll be asked to specify a reason. Expulse l'utilisateur sélectionné du serveur. Vous devrez saisir une raison. Mute user Rendre muet l'utilisateur Mute or unmute user on server. Unmuting a deafened user will also undeafen them. Rend muet ou rend la parole à l'utilisateur du serveur. Rendre la parole à un utilisateur sourd lui rend aussi l'ouïe. Kick and ban user (with reason) Expulser et bannir l'utilisateur (avec raison) Kick and ban selected user from server. You'll be asked to specify a reason. Expulse et bannit l'utilisateur sélectionné du serveur. Vous devrez saisir une raison. Deafen user Rendre sourd l'utilisateur Deafen or undeafen user on server. Deafening a user will also mute them. Rend sourd ou rend l'ouïe à un utilisateur du serveur. Rendre sourd un utilisateur le rend aussi muet. Mute user locally Rend un utilisateur muet localement Mute or unmute user locally. Use this on other users in the same room. Rend muet ou rend la parole à un utilisateur localement. Utiliser cette option pour les autres utilisateurs dans la même pièce. This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. Lie votre salon actuel au salon sélectionné. Si des utilisateurs dans un salon ont la permission de parler dans l'autre salon, les utilisateurs peuvent s'entendre. C'est une liaison permanente, et restera jusqu'à ce qu'elle soit manuellement déliée, ou que le serveur soit redémarré. Veuillez regarder le raccourcis pour Appuyer-pour-lier. &Unlink Channel &Délier Unlink your channel from another channel Délie votre salon d'un autre salon This unlinks your current channel from the selected channel. Délie votre salon actuel du salon sélectionné. Unlinks your channel from all linked channels. Délie votre salon de tous les autres salons liés. This unlinks your current channel (not the selected one) from all linked channels. Délie le salon actuel (pas celui qui est sélectionné) de tous les autres salons liés. &Reset &Remettre à zéro Reset audio preprocessor Remet à zéro le pré-processeur audio This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. Remet à zéro le pré-processeur audio, en incluant l'annulation du bruit, le volume automatique et la détection de l'activité vocale. Si quelque chose a soudainement perturbé l'environnement audio (si le microphone tombe par exemple) et que ce n'est que temporaire, utilisez cette fonctionnalité pour éviter d'avoir à attendre que le pré-processeur audio se ré-étalonne. &Mute Self Devenir &muet Mute yourself Se rendre muet Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. Se rendre muet ou non. Lorsque vous êtes muet, vous n'envoyez pas de données au serveur. Enlever le mode muet alors que vous êtes en mode sourd enlèvera également le mode sourd. &Deafen Self Devenir s&ourd Deafen yourself Se rendre sourd Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. Se rendre sourd ou non. Vous rendre sourd vous rendra aussi muet. &Text-To-Speech Syn&thèse vocale Toggle Text-To-Speech Activer/désactiver la synthèse vocale Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. Active ou désactive le moteur de voix de synthèse. Seulement les messages activés pour la synthèse vocale dans la fenêtre de configuration seront entendus. Display audio statistics Affiche les statistiques audio Pops up a small dialog with information about your current audio input. Affiche une petite fenêtre d'informations sur votre sortie audio actuelle. Forcibly unlink plugin Forcer la désactivation du plugin This forces the current plugin to unlink, which is handy if it is reading completely wrong data. Force le plugin actuel à se désactiver, ce qui est utile s'il lit des données erronées. Configure Mumble Configurer Mumble Allows you to change most settings for Mumble. Permet de change la plupart des paramètres de Mumble. Start the audio configuration wizard Démarre l'assistant de configuration audio This will guide you through the process of configuring your audio hardware. Ceci vous guidera dans la configuration de votre matériel audio. &What's This? &Qu'est-ce que c'est ? Enter What's This? mode Entrer dans le mode « Qu'est-ce que c'est ? » Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. Cliquez sur ce bouton pour entre dans le mode « Qu'est-ce que c'est ? ». Votre curseur se changera en point d'interrogation. Cliquez alors sur n'importe quel bouton, choix de menu ou zone pour voir apparaître une description de son utilité. Information about Mumble Informations sur Mumble Shows a small dialog with information and license for Mumble. Affiche une petite fenêtre d'informations et la licence de Mumble. Information about Speex Informations sur Speex Shows a small dialog with information about Speex. Affiche une petite fenêtre d'informations sur Speex. Information about Qt Informations sur Qt Shows a small dialog with information about Qt. Affiche une petite fenêtre d'informations sur Qt. Check for &Updates Vérifier les mises à jo&ur Check for new version of Mumble Vérifier les nouvelles versions de Mumble Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. Se connecte au site web de Mumble, vérifie si une nouvelle version est disponible, et vous propose un lien de téléchargement approprié le cas échéant. Sends a text message to all users in a channel. Envoyer un message texte à tous les utilisateurs dans le salon. Configure certificates for strong authentication Configure les certificats pour une authentification forte This starts the wizard for creating, importing and exporting certificates for authentication against servers. Lance l'assistant de création, importation et exportation de certificats pour s'authentifier auprès des serveurs. Register user on server Enregistrer l'utilisateur sur le serveur This will permanently register the user on the server. Enregistrera de manière définitive l'utilisateur sur le serveur. Add &Friend Ajouter un &ami Adds a user as your friend. Ajoute un utilisateur à vos amis. This will add the user as a friend, so you can recognize him on this and other servers. Ajoutera l'utilisateur à vos amis, vous pourrez donc le reconnaître sur ce serveur et sur les autres serveurs. &Remove Friend Supp&rimer un ami Removes a user from your friends. Retire un utilisateur de vos amis. This will remove a user from your friends list. Retirera un utilisateur de votre liste d'amis. &Update Friend Met à &jour votre ami Update name of your friend. Met à jour le nom de votre ami. Your friend uses a different name than what is in your database. This will update the name. Votre ami utilise un nom différent de celui que vous avez dans votre base de données. Ceci mettra à jour son nom. Edit registered users list Édite la liste des utilisateurs enregistrés This opens the editor for registered users, which allow you to change their name or unregister them. Ouvre l'éditeur des utilisateurs enregistrés, ce qui vous permettra de modifier leurs noms ou de supprimer leurs comptes. Add or remove text-based access tokens Ajoute ou retire des jetons d'accès &Minimal View Vue &minimale Toggle minimal window modes Basculer l'interface en mode minimal ou normal This will toggle minimal mode, where the log window and menu is hidden. Cela basculera en mode minimal, dans lequel la fenêtre de journal et le menu seront cachés. You muted and deafened %1. Vous avez rendu %1 sourd et muet. You unmuted and undeafened %1. Vous avez rendu la parole et l'ouïe à %1. You undeafened %1. Vous avez rendu l'ouïe à %1. You suppressed %1. Vous avez suspendu %1. %1 muted and deafened by %2. %2 a rendu %1 sourd et muet. %1 unmuted and undeafened by %2. %2 a rendu la parole et l'ouïe à %1. %1 undeafened by %2. %2 a rendu l'ouïe à %1. %1 suppressed by %2. %2 a suspendu %1. %1 moved to %2. %1 s'est déplacé dans le salon %2. %1 moved to %2 by %3. %1 a été déplacé dans le salon %2 par %3. %1 moved in from %2 by %3. %1 a été déplacé depuis le salon %2 par %3. %1 is now muted and deafened. %1 est maintenant sourd et muet. Your account information can not be verified currently. Please try again later Les informations de votre compte ne peuvent pas être vérifiées pour le moment. Veuillez réessayer plus tard Welcome message: %1 Message de bienvenue : %1 Mumble: %1 Mumble : %1 You were denied %1 privileges in %2. Le privilège %1 vous est refusé dans %2. %3 was denied %1 privileges in %2. %3 vous a refusé le privilège %1 dans %2. Denied: Cannot modify SuperUser. Refusé : Ne peut modifier SuperUser. Denied: Invalid channel name. Refusé : Nom de salon invalide. Denied: Text message too long. Refusé : Message texte trop long. Denied: Operation not permitted in temporary channel. Refusé : Opération non permise dans les salons temporaires. You need a certificate to perform this operation. Vous avez besoin d'un certificat pour effectuer cette action. %1 does not have a certificate. %1 n'a pas de certificat. Invalid username: %1. Nom d'utilisateur invalide : %1. Invalid username. Nom d'utilisateur invalide. Channel is full. Le salon est plein. Channel nesting limit reached. Limite d'imbrication des canaux atteinte. Channel count limit reached. Need to delete channels before creating new ones. Permission denied. Autorisation refusée. %1 connected and entered channel. %1 s'est connecté et a rejoint le salon %1 connected. %1 connecté(e). %1 is now muted. %1 est maintenant muet. %1 is now unmuted. %1 n'est plus muet. Recording started Début de l'enregistrement Recording stopped Fin de l'enregistrement %1 started recording. %1 a débuté l'enregistrement. %1 stopped recording. %1 a arrêté l'enregistrement. You revoked your priority speaker status. Vous révoquez votre statut de parole prioritaire. You assumed priority speaker status. Vous assumez votre statut de parole prioritaire. %1 revoked your priority speaker status. %1 a révoqué votre statut de parole prioritaire. %1 gave you priority speaker status. %1 vous a donné le statut de parole prioritaire. You revoked priority speaker status for %1. Vous avez révoqué le statut de parole prioritaire à %1. You gave priority speaker status to %1. Vous avez donné le statut de parole prioritaire à %1. %1 revoked own priority speaker status. %1 a révoqué son statut de parole prioritaire. %1 assumed priority speaker status. %1 a assumé son statut de parole prioritaire. %1 revoked priority speaker status for %2. %1 a révoqué le statut de parole prioritaire à %2. %1 gave priority speaker status to %2. %1 a donné le statut de parole prioritaire à %2. You were unmuted and undeafened by %1. %1 vous a rendu la parole et l'ouïe. You were muted by %1. %1 vous a rendu muet. You were undeafened by %1. %1 vous a rendu le droit à la parole et à l'écoute. You were suppressed. You were suppressed by %1. Vous avez été suspendu. You were unsuppressed. Vous avez été rétabli. You were unsuppressed by %1. Vous avez été rétabli par %1. You joined %1. Vous avez rejoint %1 You moved %1 to %2. Vous avez déplacé %1 vers %2. %1 is recording %1 enregistre %1 renamed to %2 by %3. %1 a été renommé en %2 par %3. %1 disconnected. %1 déconnecté(e). Server message from Serveur (Tree) (Arborescence) (Channel) (Salon) (Private) (Privé) %2%1: %3 %2%1 : %3 Failed to load Opus, it will not be available for audio encoding/decoding. The server requests minimum client version %1 Le serveur requière au minimum la version %1 du client The server requests positional audio be enabled. Le serveur requière que l'audio positionnel soit activé. The server requests positional audio be disabled. Le serveur requière que l'audio positionnel soit désactivé. The server requests Push-to-Talk be enabled. Le serveur requière l'activation d'appuyer-pour-parler. The server requests Push-to-Talk be disabled. Le serveur requière la désactivation d'appuyer-pour-parler. You were unmuted by %1. %1 vous a rendu le droit à la parole. You muted %1. Vous avez rendu muet %1. You unsuppressed %1. Vous avez rétabli %1. You unmuted %1. Vous avez rendu la voix à %1. %1 muted by %2. %2 a rendu %1 muet. %1 unsuppressed by %2. %1 a été rétabli par %2. %1 unmuted by %2. %2 a rendu la voix à %1. Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. Incapable de trouver des codecs CELT correspondant aux autres clients. Vous ne serez pas capable de parler aux autres utilisateurs. You were muted and deafened by %1. You were deafened by %1. %1 vous a rendu sourd et muet. You were kicked from the server by %1: %2. Vous avez été expulsé du serveur par %1 : %2. %3 was kicked from the server by %1: %2. %3 a été expulsé du serveur par %1 : %2. You were kicked and banned from the server by %1: %2. Vous avez été expulsé et banni du serveur par %1 : %2. %3 was kicked and banned from the server by %1: %2. %3 a été expulsé et banni du serveur par %1 : %2. You were moved to %1 by %2. Vous avez été déplacé dans le salon %1 par %2. %1 entered channel. %1 a rejoint le salon. Server connection rejected: %1. Connexion au serveur rejetée : %1. Denied: %1. Refusé : %1. %1 renamed to %2. %1 renommé %2. %1 left channel and disconnected. %1 a quitté le salon et s'est déconnecté. Message from %1 Message de la part de %1 You have User Dragging set to "Do Nothing" so the user wasn't moved. Votre option « Faire glisser l'utilisateur » est définie sur « Ne rien faire », l'utilisateur n'a donc pas été déplacé. You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. Votre option 'Faire glisser le salon' est définie sur « Ne rien faire », le salon n'a donc pas été déplacé. Unknown Channel Drag mode in UserModel::dropMimeData. Mode de déplacement du salon inconnu dans UserModel::dropMimeData. Remote controlling Mumble: Contrôle distant de Mumble : Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) -jn, --jackname Set custom Jack client name. --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. Utilisation : mumble [options] [<url>] <url> spécifie une URL à laquelle une connexion sera établie après le démarrage au lieu de l'affichage de la fenêtre de connexion sous la forme suivante : mumble://[<nomutilisateur>[:<motdepasse>]@]<host>[:<port>][/<salon>[/<sous-salon>...]][?version=<x.y.z>] Le paramètre de demande de version doit être réglé afin d'invoquer la version correcte du client. Actuellement, la valeur par défaut est 1.2.0. Les options valides sont : -h, --help Afficher ce message d'aide et quitter. -m, --multiple Autoriser le démarrage de plusieurs instances du client. -n, --noidentity Supprimer le chargement des fichiers d'identité (par exemple des certificats). -jn, --jackname   Définie un nom de client Jack personnalisé. --license Afficher la license de Mumble. --authors Afficher les auteurs de Mumble. --third-party-licenses Afficher les licenses des programmes tiers utilisés par Mumble. Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status Utilisation: mumble rpc <action> [options] Il est possible de prendre le contrôle à distance d'une instance de Mumble en utilisant la commande 'mumble rpc' Les actions valides sont : mute Couper la voix unmute Réactiver la voix togglemute Inverser son status vocal deaf Couper l'audio undeaf Réactiver l'audio toggledeaf Inverser son statut audio Invocation Invocation Error: No RPC command specified Erreur : Pas de commande RPC spécifiée RPC RPC Welcome to Mumble. Bienvenue sur Mumble. Skipping version check in debug mode. La vérification des nouvelles versions est omise en mode débogage. Hide Frame Cacher la bordure Toggle showing frame on minimal window Affiche/masque la bordure sur la fenêtre minimale This will toggle whether the minimal window should have a frame for moving and resizing. Permet de choisir si l'affichage minimal doit avoir une bordure pour déplacer ou redimensionner la fenêtre. &Unlink All Délier to&us Reset the comment of the selected user. Réinitialiser le commentaire de l'utilisateur sélectionné. &Join Channel Re&joindre le salon View comment in editor Voir le commentaire dans l'éditeur Query server for connection information for user Demander au serveur les informations de connexion pour l'utilisateur S&erver S&erveur &Self &Soi-même &Unlink Plugins Délier les pl&ugins Register yourself on the server S'enregistrer sur le serveur Change your avatar image on this server Change l'avatar sur ce serveur &Remove Avatar Supp&rimer l'avatar Remove currently defined avatar image. Supprime l'avatar défini actuellement. Icon Toolbar Icône de la barre d'outils Change your own comment Modifier votre commentaire Recording Enregistrement Priority Speaker Parole prioritaire &Copy URL &Copier l'URL Copies a link to this channel to the clipboard. Copier un lien vers ce salon dans le presse-papiers. Ignore Messages Ignorer les messages Locally ignore user's text chat messages. Ignorer localement les messages textuels de l'utilisateur. Silently drops all text messages from the user. Ignore simplement tous les messages textuels provenant de l'utilisateur. Edit ban list on server Liste des utilisateurs bannis This lets you edit the server-side IP ban list. Ceci permet d'éditer liste des utilisateurs bannis du serveur. &Filter on/off &Filtre on/off Toggle the channel filter (Ctrl+F) (Dé)active le filtrage de salon (Ctrl+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. Active ou désactive le filtrage des canaux sélectionnés. Par défaut tous les canaux vides seront filtrés. Vous pouvez marquer des canaux supplémentaires pour filtrage depuis le menu du canal. Ctrl+F Ctrl+F &Hide Channel when Filtering &Masquer le salon lors du filtrage Reset the avatar of the selected user. Réinitialiser l'avatar de l'utilisateur sélectionné. Locally adjust the user's speech volume. Ajuste localement le volume de l'utilisateur. Opens a dialog with a volume slider. Use this on other users in the same room. Ouvre une dialogue avec un curseur de défilement de volume. Utilisez cela sur les autres utilisateurs dans le même salon. &Developer &Développeur &Hide Mumble Cac&her Mumble Hides the main Mumble window. Cache la fenêtre principale de Mumble. Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. Cache la fenêtre principale de Mumble. Restaurez-la en cliquant sur l'icône dans la barre des tâches ou en relançant Mumble. Show the Developer Console Affiche la console développeur Shows the Mumble Developer Console, where Mumble's log output can be inspected. Shows the Mumble Developer Console, where Mumble's log output can be inspected. Affiche la console développeur Mumble où les logs peuvent être consultés. &Connect... &Se connecter... &Ban list... &Liste des bannis... &Information... &Information... &Kick... &Exclusion... &Ban... &Bannissement... Local Volume Adjustment... Réglage du volume local... Send &Message... Envoyer un &message &Add... &Ajouter... &Remove... &Supprimer... &Edit... &Modifier... Audio S&tatistics... S&tatistiques audio... &Settings... &Réglages... &Audio Wizard... Assistant &audio... Developer &Console... &Console Développeur... &About... &À propos... About &Speex... À propos de &Speex... About &Qt... À propos de &Qt... &Certificate Wizard... Assistant &Certificat... &Register... Registered &Users... &Utilisateurs Enregistrés... Change &Avatar... Changer l'&Avatar... &Access Tokens... &Jetons d'accès... Reset &Comment... Réinitialiser le &commentaire... Reset &Avatar... Réinitialiser l'&Avatar... View Comment... &Change Comment... Modifier le &commentaire... R&egister... Show Shows the main Mumble window. Afficher la fenêtre Mumble principale Manual Manual Mumble Positional Audio Positionnement audio manuel Position Position X X Y Y Z Z m m Heading Cap Azimuth Azimut Elevation Altitude ° ° Meta data Méta données Context Contexte Identity Identité Set Définir State État Linked Lié Activated Activé Unhinge Détacher NetworkConfig Network Réseau Updates are mandatory when using snapshot releases. Les mises à jour sont obligatoires lors de l'utilisation d'une version snapshot. Connection Connexion Use TCP compatibility mode Use TCP compatability mode Utiliser le mode de compatibilité TCP <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). <b>Activer le mode de compatibilité TCP</b>.<br />Cela permet d'utiliser Mumble uniquement avec le protocole TCP pour communiquer avec le serveur. Cette initiative augmente l'utilisation de la bande passante, et provoque la perte de paquets, produisant des pauses dans la communication. Elle ne devrait donc être choisie que si vous ne pouvez pas utiliser les paramètres par défaut (qui utilise pour la voix UDP et TCP pour le contrôle). Reconnect when disconnected Reconnexion quand vous êtes déconnecté <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. <b>Se reconnecter quand vous êtes déconnecté</b>.<br />Mumble essaiera automatiquement de se reconnecter après dix secondes si la connexion échoue. Reconnect automatically Reconnexion automatique Proxy Proxy Type Type Type of proxy to connect through Type de proxy à utiliser Direct connection Connexion directe HTTP(S) proxy Proxy HTTP(S) SOCKS5 proxy Proxy SOCKS5 Hostname Nom d'hôte Hostname of the proxy Nom d'hôte du proxy Force TCP mode Forcer le mode TCP Enable QoS to prioritize packets Activer la Qualité de Service pour la priorité des paquets This will enable QoS, which will attempt to prioritize voice packets over other traffic. Active la Qualité de Service, qui tend à augmenter la priorité des paquets vocaux par rapport à d'autres trafics. Use Quality of Service Utiliser la Qualité de Service Don't send certificate to server and don't save passwords. (Not saved). N'envoie pas de certificat au serveur et ne sauvegarde pas les mots de passe. (Option non enregistrée). <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> <b>Désactive les informations d'identification du client.</b><p>Le client ne va pas s'identifier à l'aide d'un certificat même si celui-ci existe, et il ne mémorisera pas les mots de passe de la connexion. Cette option est principalement utilisée à des fins de tests et n'est pas mémorisée.</p> Suppress certificate and password storage Désactiver le certificat et l'enregistrement des mots de passe <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>Type de connexion via le proxy.</b><br />Permet à Mumble de se connecter au travers d'un proxy pour toutes les connexions sortantes. Notez que l'usage du proxy force Mumble à utiliser le mode de compatibilité TCP, la voix est donc envoyée via le canal de contrôle. <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. <b>Nom d'hôte du proxy.</b><br />Ce champ identifie le nom d'hôte du proxy que vous souhaitez utiliser. Port Port Port number of the proxy Numéro de port du proxy <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. <b>Numéro du port du proxy.</b><br />Ce champ spécifie le numéro de port sur lequel le proxy écoute. Username Nom d'utilisateur Username for proxy authentication Nom d'utilisateur à utiliser pour l'authentification <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>Nom d'utilisateur à utiliser pour l'authentification sur le proxy.</b><br />Dans le cas où le proxy n'utilise pas d'authentification, ou si vous voulez vous connecter en tant qu'anonyme, laissez simplement le champ vide. Password Mot de passe Password for proxy authentication Mot de passe pour l'authentification sur le proxy <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. <b>Mot de passe à utiliser pour l'authentification sur le proxy.</b><br />Dans le cas où le proxy n'utilise pas d'authentification, ou si vous voulez vous connecter en tant qu'anonyme, laissez simplement le champ vide. Mumble services Services de Mumble Check for new releases of Mumble automatically. Vérifier les nouvelles versions de Mumble automatiquement. This will check for new releases of Mumble every time you start the program, and notify you if one is available. Vérifiera l'existence d'une nouvelle version de Mumble à chaque lancement de celui-ci, et vous notifiera si elle est disponible. Check for application updates on startup Vérifier les nouvelles versions au démarrage Check for new releases of plugins automatically. Vérifie automatiquement les nouvelles versions des plugins au démarrage. This will check for new releases of plugins every time you start the program, and download them automatically. Vérifiera l'existence de nouvelles versions des plugins à chaque lancement de l'application, et les téléchargera automatiquement. <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. <b>Envoyer des statistiques anonymes.</b><br />Mumble dispose d'une petite équipe de développement, et doit donc concentrer son développement là où celui-ci est le plus nécessaire. En envoyant quelques statistiques, vous aidez le projet à déterminer où le développement doit se focaliser. Submit anonymous statistics to the Mumble project Soumettre des statistiques anonymes au projet Mumble Submit anonymous statistics Envoyer des statistiques anonymes Reconnect to last used server when starting Mumble Se reconnecter au dernier serveur utilisé au lancement de Mumble Reconnect to last server on startup Se reconnecter au dernier serveur utilisé au démarrage Download plugin and overlay updates on startup Télécharger les mises à jour des plugins et de l'overlay au démarrage Privacy Prevent OS information being sent to Mumble servers and web servers Empêcher l'envoi d'informations du système d'exploitation aux serveurs Mumble et aux serveurs Web <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. <b>Ne pas envoyer d'informations du système d'exploitation aux serveurs</b><br/> Empêche le client d'envoyer des informations pouvant identifier le système d'exploitation au serveur Mumble et aux serveurs Web. Do not send OS information to Mumble servers and web servers Ne pas envoyer d'informations du système d'exploitation aux serveurs Mumble et aux serveurs web Overlay Silent Silencieux Talking Parle Whisper Chuchote Shout Crie Channel Salon Failed to create communication with overlay at %2: %1. No overlay will be available. Échec lors de la création de la communication avec l'overlay à %2 : %1. L'overlay ne sera pas disponible. OverlayClient Filter Filtre Only talking Parlant uniquement Talking and recently active En train de parler et actif récemment All in current channel Tous dans le salon courant All in linked channels Tous dans les salons liés Always show yourself Toujours s'afficher Configure recently active time (%1 seconds)... Déterminer le délai pour considérer comme actif récemment (%1 secondes)... Columns Colonnes Sort Classer Alphabetically Alphabétiquement Last state change Dernier changement d'état Edit... Éditer... Reset Zoom Réinitialiser le zoom Configure recently active time Configurer le délai 'actif récemment' Amount of seconds users remain active after talking: Nombre de secondes durant lesquels l'utilisateur reste actif après avoir parlé : OverlayConfig To move the users, drag the little red dot. Pour déplacer des utilisateurs, glissez-déplacez le petit point rouge. To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. Pour redimensionner les utilisateurs, utilisez la molette au-dessus de l'un d'eux. For more options, right click a user. For more options, rightclick a user. Pour plus d'options, faites un clic droit sur un utilisateur. Launcher Filter Overlay Overlay Choose executable Choisir le fichier exécutable Choose application Choisir l'application Choose path Load Overlay Presets Charger les préférences de l'overlay Mumble overlay presets (*.mumblelay) Préférences de l'overlay (*.mumblelay) Save Overlay Presets Sauvegarder les préférences de l'overlay Options Options Enable overlay. Activer l'overlay. Enable Overlay Activer l'overlay This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. Définit si l'overlay est actif ou pas. Cette option est vérifiée au lancement des applications, assurez-vous donc que Mumble fonctionne et que cette option soit activée avant de démarrer l'application.<br />Veuillez noter que si vous démarrez Mumble après le lancement de l'application, ou si vous désactivez l'overlay pendant que l'application fonctionne, il n'y a pas de manière sûre pour réactiver l'overlay sans redémarrer l'application. Layout Disposition Blacklist Liste noire Whitelist Liste blanche Uninstall Overlay Désinstaller l'overlay Overlay Installation Installation de l'overlay Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. Mumble a détecté que l'overlay n'était pas installé. Cliquez sur le bouton ci-dessous pour l'installer. Install Mumble Overlay Installer l'overlay Overlay Upgrade Mise à jour de l'overlay Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. Mumble a détecté une ancienne version de l'overlay sur votre ordinateur. Pour mettre à jour l'overlay, cliquez sur le bouton ci-dessous. Upgrade Mumble Overlay Mettre à jour l'overlay Display a frame counter in the overlay Afficher les FPS dans l'overlay Show FPS counter Afficher les FPS Load an overlay preset from file Importe les préférences de l'overlay depuis un fichier Load… Importer... Save your overlay settings to file Exporte vos préférences de l'overlay dans un fichier Save… Exporter... Set the overlay font. Règle la police de l'overlay. Set the overlay text color. Définir la couleur du texte de l'overlay. Color Couleur Remove Supprimer Font Police FPS and Clock Display FPS et Affichage de l'Horloge Display a clock in the overlay showing the current local time (system time). Affiche une horloge dans l'overlay contenant l'heure locale (heure système). Show Clock Afficher l'horloge Overlay Exceptions Exceptions pour l'overlay Overlay Exception Mode Allowed launchers Lanceurs autorisés Add Allowed programs Programmes autorisés Allowed paths Chemins autorisés Blacklisted programs Logiciels mis dans la liste noire OverlayEditor State État User is not talking L'utilisateur ne parle pas Passive Passif User is talking in your channel or a linked channel L'utilisateur parle dans votre salon ou dans un salon lié Talking Parle User is whispering to you privately L'utilisateur vous chuchote en privé Private Whisper Chuchotement privé User is shouting to your channel L'utilisateur crie dans votre salon Channel Whisper Crie au salon Zoom Zoom Zoom Factor Facteur de zoom Enabled Elements Éléments activés User avatar, chosen by each user Avatar d'utilisateur, choisi par chaque utilisateur Avatar Avatar User's name Nom d'utilisateur Username Nom d'utilisateur Name of user's channel, if outside your current channel Nom des salons de l'utilisateur, si en dehors de votre salon actuel Channel Salon Muted or deafened Sourd ou muet Mute state Muet Bounding box, automatically shrunk to minimum size to contain all visible elements Zone de délimitation, réduit automatiquement à la taille minimale pour contenir tout élément visible Bounding box Zone de délimitation Overlay Editor Éditeur de l'overlay OverlayEditorScene Layout preset Disposition prédéfinie Large square avatar Grand avatar carré Avatar and Name Avatar et nom User Opacity Opacité de l'utilisateur %1% %1 % Object Opacity Opacité de l'objet Alignment Alignement Left Gauche Center Centre Right Droite Top Haut Bottom Bas Color... Couleur... Font... Police... Bounding box Zone de délimitation Pen width Largeur du crayon Padding Remplissage Pen color Couleur du crayon Fill color Couleur de remplissage Pick pen color Choisir la couleur du crayon Pick fill color Choisir la couleur de remplissage Pick color Choisir la couleur Pick font Choisir la police PluginConfig Plugins Plugins Plugin has no configure function. Le plugin n'a pas de fonction « configure » (configurer). Plugin has no about function. Le plugin n'a pas de fonction « about » (à propos). Options Options Enable plugins and transmit positional information Activer les plugins et transmettre les informations de position This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. Permet aux plugins des jeux supportés récupérer votre position dans le jeu et de la transmettre. Permet aussi aux autres utilisateurs d'entendre votre voix dans le jeux en rapport avec votre position et sa propre position. Link to Game and Transmit Position Lier au jeu et transmettre la position Reloads all plugins Recharge tous les plugins This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. Rechercher et recharger les plugins. Utilisez cette fonction si vous venez d'ajouter ou de modifier un plugin dans le répertoire des plugins. &Reload plugins &Recharger les plugins Information about plugin Informations sur le plugin This shows a small information message about the plugin. Affiche une rapide introduction au fonctionnement du plugin. &About &À propos Show configuration page of plugin Afficher la page de configuration du plugin This shows the configuration page of the plugin, if any. Affiche la page de configuration du plugin si elle existe. &Configure &Configurer Name Nom Enabled Activé Plugins Skipping plugin update in debug mode. Passe la mise à jour des plugins en mode débogage. Downloaded new or updated plugin to %1. Téléchargé le nouveau plugin ou mis à jour vers %1. Failed to install new plugin to %1. Échec de l'installation du nouveau plugin dans %1. %1 lost link. %1 est désactivé. %1 linked. %1 est activé. PortAudioSystem Default Device Périphérique par défaut PulseAudioSystem Default Input Entrée par défaut Default Output Sortie par défaut QApplication Failed to restart mumble Impossible de redémarrer Mumble Mumble failed to restart itself. Please restart it manually. Mumble n'a pas pu redémarrer. Redémarrez le manuellement. RichTextEditor Failed to load image Impossible de charger l'image Image file too large to embed in document. Please use images smaller than %1 kB. L'image est trop grosse pour être intégrée au document. Veuillez utiliser des images plus petites que %1 Ko. Message is too long. Le message est trop long. Display Affichage Source Text Texte source &Bold &Gras Ctrl+B Ctrl+B &Italic &Italique Italic Italique Ctrl+I Ctrl+I Underline Souligne Ctrl+U Ctrl+U Color Couleur Insert Link Insérer un Lien Ctrl+L Ctrl+L Insert Image Insérer une Image RichTextEditorLink Add Link Ajouter un lien URL URL Text Texte ServerHandler Unable to resolve hostname Impossible de résoudre le nom d'hôte Server is not responding to TCP pings Le serveur ne répond pas aux pings UDP packets cannot be sent to or received from the server. Switching to TCP mode. Les paquets UDP ne peuvent pas être envoyés ni reçus du serveur. Passage en mode TCP. UDP packets cannot be sent to the server. Switching to TCP mode. Les paquets UDP ne peuvent pas être envoyés au serveur. Passage en mode TCP. UDP packets cannot be received from the server. Switching to TCP mode. Les paquets UDP ne peuvent pas être reçus du serveur. Passage en mode TCP. UDP packets can be sent to and received from the server. Switching back to UDP mode. Les paquets UDP peuvent être envoyés et reçus du serveur. Retour en mode UDP. Connection timed out Délai de connexion dépassé ServerView Favorite Favoris LAN Réseau local Public Internet Internet public Unknown Africa Afrique Asia Asie North America Amérique du Nord South America Amérique du Sud Europe Europe Oceania Océanie ShortcutActionWidget Unassigned Non assigné ShortcutDelegate On Activer Off Désactiver Toggle Commuter Unassigned Non assigné ShortcutKeyWidget Press Shortcut Appuyer sur un raccourci clavier ShortcutTargetDialog Root Racine Parent Parent Current Actuel Subchannel #%1 Sous-salon #%1 ShortcutTargetWidget ... ... , , Root Racine Parent Parent Current Actuel Subchannel #%1 Sous-salon #%1 Invalid Invalide Empty <Empty> Vide ShortcutToggleWidget Off Désactiver Toggle Commuter On Activer TextMessage Enter text Saisir le texte If checked the message is recursively sent to all subchannels Si cochée, le message sera envoyé récursivement à tous les sous-salons Send recursively to subchannels Envoyer récursivement aux sous-salons Tokens Empty Token Jeton vide Mumble - Access Tokens Mumble - Jetons d'accès List of access tokens on current server Liste des jetons d'accès du serveur actuel <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. <b>C'est une liste éditable des jetons d'accès du serveur actuel.</b> <br /> Un jeton d'accès est une chaîne de caractères qui peut être utilisée comme mot de passe pour une gestion simple des accès aux salons. Mumble mémorise les jetons que vous avez utilisé et les réutilisera la prochaine fois que vous vous reconnecterez, vous n'aurez donc pas à les ressaisir à chaque fois. Add a token Ajouter un jeton &Add &Ajouter Remove a token Supprimer un jeton &Remove Supp&rimer UserEdit Registered Users Utilisateurs enregistrés Remove Supprimer Rename Renommer Who are you looking for? Qui cherchez-vous ? Days Jours Weeks Semaines Months Mois Years Années Inactive for Inactif depuis Registered users: %n account(s) Utilisateurs enregistrés : %n compte(s)Utilisateurs enregistrés : %n compte(s) UserInformation User Information Informations d'utilisateur Connection Information Informations de connexion Version Version OS Système d'exploitation Certificate Certificat IP Address Adresse IP CELT Versions Versions CELT Details... Détails... Ping Statistics Statistiques du ping Pings received Pings reçus Average ping Moyenne du ping TCP (Control) TCP (Contrôle) UDP (Voice) UDP (Voix) UDP Network statistics Statistiques réseau UDP Good Bon Late Tardif Lost Perdu Resync Resynchronisé From Client Depuis le Client To Client Pour le Client Connection time Durée de connexion %1w %1sem %1d %1j %1h %1h %1m %1m %1s %1s , , %1 (%2) %1.%2.%3 (%4) %1 (%2) Supported Supporté Not Supported Non supporté Not Reported Non indiqué %1 online (%2 idle) %1 en ligne (%2 au repos) %1 online %1 en ligne %1 kbit/s %1 kbits/s Bandwidth GroupBox Bande passante Bandwidth Label Bande passante Ping deviation Déviation du ping UserListModel Nick Nom d'utilisateur Inactive days Jours d'inactivités Last channel Dernier salon Last seen: %1 Vu dernièrement : %1 Never Jamais Channel ID: %1 ID du salon : %1 UserLocalVolumeDialog Local volume for other users Volume local pour les autres utilisateurs <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. <b>Ajuste le volume local des autres utilisateurs</b><br />Mumble supporte l'ajustement du volume local pour les autres utilisateurs. Adjusting local volume for %1 Ajustement du volume local pour %1 dB dB <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> <html><head/><body><p>Utilisez le slider du champ de texte pour changer le volume de l'utilisateur.</p><p><span style="font-weight:600;">Attention !</span></p><p>Augmenter trop fort le volume d'un utilisateur peut endommager de manière permanente votre audition. Cela peut également augmenter le bruit de fond de l'utilisateur.</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: C'est un utilisateur connecté au serveur. L'icône à gauche de l'utilisateur indique s'il parle ou pas : Talking to your channel. Parle dans votre salon. Shouting directly to your channel. Whispering directly to your channel. Crie directement dans votre salon. Whispering directly to you. Vous chuchote directement. Not talking. Ne parle pas. This is a channel on the server. The icon indicates the state of the channel: C'est un salon dans le serveur. L'icône indique l'état du salon : Your current channel. Votre salon actuel. A channel that is linked with your channel. Linked channels can talk to each other. Un salon qui est lié au vôtre. Les salons liés peuvent se parler l'un à l'autre. A channel on the server that you are not linked to. Un salon du serveur qui n'est pas lié. This shows the flags the user has on the server, if any: Affiche les attributs de l'utilisateur sur le serveur, si disponible : On your friend list Dans votre liste d'amis Authenticated user Utilisateur authentifié Muted (manually muted by self) Muet (s'est rendu muet) Muted (manually muted by admin) Muet (manuellement par un admin) Muted (not allowed to speak in current channel) Muet (n'a pas la permission de parler dans le salon actuel) Muted (muted by you, only on your machine) Muet (vous l'avez rendu muet, seulement sur votre machine) Muted (push-to-mute) Deafened (by self) Sourd (s'est rendu sourd) Deafened (by admin) Sourd (par un admin) User has a new comment set (click to show) L'utilisateur a un nouveau commentaire (cliquer pour afficher) User has a comment set, which you've already seen. (click to show) L'utilisateur a un commentaire que vous avez déjà vu. (Cliquer pour afficher) Ignoring Text Messages Ignore les messages textuels This shows the flags the channel has, if any: Affiche l'attribut du salon, si disponible : Channel has a new comment set (click to show) Le salon a un nouveau commentaire (cliquer pour afficher) Channel has a comment set, which you've already seen. (click to show) Le salon a un commentaire que vous avez déjà lu. (Cliquer pour afficher) Channel will be hidden when filtering is enabled Le salon sera masqué lors du filtrage Name Nom Flags Attributs Are you sure you want to drag this user? Êtes-vous sûr de vouloir déplacer cet utilisateur ? Are you sure you want to drag this channel? Êtes-vous sûr de vouloir déplacer ce salon ? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. Ne peut pas effectuer ce déplacement automatiquement, veuillez réinitialiser les indicateurs de position, ou l'ajuster manuellement. VersionCheck Upgrade Mumble Mettre Mumble à jour A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? Une nouvelle version de Mumble a été détectée et automatiquement téléchargée. Il est recommandé de mettre à niveau à cette version ou de revenir à la dernière version stable. Voulez-vous lancer l'installateur maintenant ? Failed to launch snapshot installer. Échec dans le lancement de l'installateur du snapshot. Corrupt download of new version detected. Automatically removed. Détection d'un téléchargement corrompu d'une nouvelle version. Suppression automatique. Downloading new snapshot from %1 to %2 Téléchargement du nouveau snapshot de %1 à %2 Failed to write new version to disk. Failed to write new version to disc. Échec lors de l'écriture de la nouvelle version sur le disque. Mumble failed to retrieve version information from the central server. Mumble ne peut pas retrouver les informations de version depuis le serveur central. ViewCert Certificate Chain Details Détail de la chaîne de certificats Certificate chain Chaîne de certificat Certificate details Détails du certificat Common Name Nom courant Organization Organisation Subunit Nom d'unité Country Pays Locality Localité State État Valid from: %1 Valide depuis : %1 Valid to: %1 Valide jusqu'à : %1 Serial: %1 Numéro de série : %1 Public Key: %1 bits %2 Clé publique : %1 bits %2 RSA RSA DSA DSA Digest (SHA-1): %1 Digest (SHA-1) : %1 Digest (SHA-256): %1 Hash (SHA-256): %1 Email: %1 Courriel : %1 DNS: %1 DNS : %1 Issued by: Délivré par : Unit Name Nom d'unité VoiceRecorder Recorder failed to create directory '%1' L'enregistreur n'a pas pu créer le répertoire '%1' Recorder failed to open file '%1' L'enregistreur n'a pas réussi à ouvrir le fichier '%1' .wav - Uncompressed .wave - Non compressé .ogg (Vorbis) - Compressed .ogg (Vorbis) - Compressé .au - Uncompressed .au - Non compressé .flac - Lossless compressed .flac - Compressé sans perte VoiceRecorderDialog Recorder Enregistreur Control Commandes 00:00:00 00:00:00 &Start &Démarrer S&top &Arrêter Mode Mode Multichannel Multisalon Output Sortie Output format Format Target directory Répertoire Filename Nom du fichier &Browse... &Parcourir... Valid variables are: Les variables valides sont : Inserts the user's name Insère le nom de l'utilisateur Inserts the current date Insère la date actuelle Inserts the current time Insère l'heure actuelle Inserts the hostname Insère le nom d'hôte Recorder still running Enregistrement en cours Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? Fermer l'enregistreur sans l'arrêter peut corrompre le fichier audio. Voulez-vous vraiment fermer l'enregistreur ? Unable to start recording. Not connected to a server. Impossible de débuter l'enregistrement. Vous n'êtes connecté à aucun serveur. The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. Le serveur auquel vous êtes connecté est d'une version antérieure à la 1.2.3. Pour des raisons de protection de la vie privée, l'enregistrement sur ces serveurs n'est pas possible. Contactez l'administrateur de votre serveur pour de plus amples informations. There is already a recorder active for this server. Il y a déjà en enregistrement en cours pour ce serveur. Please select a recording format. Merci de choisir un format d'enregistrement. Stopping Arrêt Select target directory Sélectionnez le répertoire de destination Downmix Downmixage WASAPIInput Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone. L'accès au microphone a été refusé. Veuillez vérifier que les réglages du microphone de votre système d'exploitation permettent à Mumble d'utiliser le microphone. WASAPISystem Default Device Périphérique par défaut qwPTTButtonWidget Mumble PTT Mumble PTT Push to talk Appuyer pour parler mumble-1.3.4/src/mumble/mumble_ar.ts0000664000175000017500000114673714010707274017250 0ustar builderbuilder ACLEditor Deny Allow Allow %1 Deny %1 Mumble - Add channel Default server value Failed: Invalid channel Mumble - Edit %1 ID: %1 This grants the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Channel must have a name This revokes the %1 privilege. If a privilege is both allowed and denied, it is denied.<br />%2 Dialog Name Enter the channel name here. Description Password Enter the channel password here. Check to create a temporary channel. Temporary <b>Position</b><br/> This value enables you to change the way Mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. <b>Position</b><br/> This value enables you to change the way mumble arranges the channels in the tree. A channel with a higher <i>Position</i> value will always be placed below one with a lower value and the other way around. If the <i>Position</i> value of two channels is equal they will get sorted alphabetically by their name. Position &Groups Group List of groups Remove selected group Remove Inherit group members from parent Inherit Make group inheritable to sub-channels Inheritable Group was inherited from parent channel Inherited Members Add Add member to group Remove member from group &ACL Active ACLs List of entries Inherit ACL of parent? This sets whether or not the ACL up the chain of parent channels are applied to this object. Only those entries that are marked in the parent as "Apply to sub-channels" will be inherited. Inherit ACLs Move entry up This moves the entry up in the list. As entries are evaluated in order, this may change the effective permissions of users. You cannot move an entry above an inherited entry, if you really need that you'll have to duplicate the inherited entry. &Up Move entry down This moves the entry down in the list. As entries are evaluated in order, this may change the effective permissions of users. &Down Add new entry This adds a new entry, initially set with no permissions and applying to all. &Add Remove entry This removes the currently selected entry. &Remove Context Entry should apply to this channel. Entry should apply to this channel This makes the entry apply to this channel. Applies to this channel Entry should apply to sub-channels. Add new group <b>Add</b><br/> Add a new group. Inherited members Contains the list of members added to the group by this channel. Contains a list of members whose group membership will not be inherited from the parent channel. Contains the list of members inherited by other channels. Type in the name of a user you wish to add to the group and click Add. Type in the name of a user you wish to remove from the group and click Add. Exclude Excluded members This makes the entry apply to sub-channels of this channel. Applies to sub-channels Permissions User/Group Group this entry applies to User ID User this entry applies to This controls which user this entry applies to. Just type in the user name and hit enter to query the server for a match. &Properties <b>Name</b><br />Enter the channel name in this field. The name has to comply with the restriction imposed by the server you are connected to. <b>Temporary</b><br /> When checked the channel created will be marked as temporary. This means when the last player leaves it the channel will be automatically deleted by the server. <b>Group</b><br /> These are all the groups currently defined for the channel. To create a new group, just type in the name and press enter. <b>Remove</b><br />This removes the currently selected group. If the group was inherited, it will not be removed from the list, but all local information about the group will be cleared. <b>Inherit</b><br />This inherits all the members in the group from the parent, if the group is marked as <i>Inheritable</i> in the parent channel. <b>Inheritable</b><br />This makes this group inheritable to sub-channels. If the group is non-inheritable, sub-channels are still free to create a new group with the same name. <b>Inherited</b><br />This indicates that the group was inherited from the parent channel. You cannot edit this flag, it's just for information. <b>Members</b><br /> This list contains all members that were added to the group by the current channel. Be aware that this does not include members inherited by higher levels of the channel tree. These can be found in the <i>Inherited members</i> list. To prevent this list to be inherited by lower level channels uncheck <i>Inheritable</i> or manually add the members to the <i>Excluded members</i> list. <b>Excluded members</b><br /> Contains a list of members whose group membership will not be inherited from the parent channel. <b>Inherited members</b><br /> Contains the list of members inherited by the current channel. Uncheck <i>Inherit</i> to prevent inheritance from higher level channels. This controls which group of users this entry applies to.<br />Note that the group is evaluated in the context of the channel the entry is used in. For example, the default ACL on the Root channel gives <i>Write</i> permission to the <i>admin</i> group. This entry, if inherited by a channel, will give a user write privileges if he belongs to the <i>admin</i> group in that channel, even if he doesn't belong to the <i>admin</i> group in the channel where the ACL originated.<br />If a group name starts with '!', its membership is negated, and if it starts with '~', it is evaluated in the channel the ACL was defined in, rather than the channel the ACL is active in.<br />If a group name starts with '#', it is interpreted as an access token. Users must have entered whatever follows the '#' in their list of access tokens to match. This can be used for very simple password access to channels for non-authenticated users.<br />If a group name starts with '$', it will only match users whose certificate hash matches what follows the '$'.<br />A few special predefined groups are:<br /><b>all</b> - Everyone will match.<br /><b>auth</b> - All authenticated users will match.<br /><b>sub,a,b,c</b> - User currently in a sub-channel minimum <i>a</i> common parents, and between <i>b</i> and <i>c</i> channels down the chain. See the website for more extensive documentation on this one.<br /><b>in</b> - Users currently in the channel will match (convenience for '<i>sub,0,0,0</i>').<br /><b>out</b> - Users outside the channel will match (convenience for '<i>!sub,0,0,0</i>').<br />Note that an entry applies to either a user or a group, not both. <b>Password</b><br />This field allows you to easily set and change the password of a channel. It uses Mumble's access tokens feature in the background. Use ACLs and groups if you need more fine grained and powerful access control. This shows all the entries active on this channel. Entries inherited from parent channels will be shown in italics.<br />ACLs are evaluated top to bottom, meaning priority increases as you move down the list. ID of the channel. Maximum Users Maximum number of users allowed in the channel <b>Maximum Users</b><br /> This value allows you to set the maximum number of users allowed in the channel. If the value is above zero, only that number of users will be allowed to enter the channel. If the value is zero, the maximum number of users in the channel is given by the server's default limit. This is the sort order for the channel. ALSAAudioInput Default ALSA Card Opening chosen ALSA Input failed: %1 ALSAAudioOutput Default ALSA Card Opening chosen ALSA Output failed: %1 ASIOConfig %1 (version %2) %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5 Hz %1 -> %2 samples buffer, with %3 sample resolution (%4 preferred) at %5Hz ASIO Initialization failed: %1 Failed to instantiate ASIO driver ASIO Device selection Device Device to use for microphone This chooses what device to query. You still need to actually query the device and select which channels to use. Query selected device This queries the selected device for channels. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Query Configure selected device This configures the selected device. Be aware that many ASIO drivers are buggy to the extreme, and querying them might cause a crash of either the application or the system. &Configure Capabilities Driver name Buffer size This will configure the input channels for ASIO. Make sure you select at least one channel as microphone and speaker. <i>Microphone</i> should be where your microphone is attached, and <i>Speaker</i> should be a channel that samples '<i>What you hear</i>'.<br />For example, on the Audigy 2 ZS, a good selection for Microphone would be '<i>Mic L</i>' while Speaker should be '<i>Mix L</i>' and '<i>Mix R</i>'. Configure input channels Channels Microphone <- -> Unused Speakers ASIOInput You need to select at least one microphone and one speaker source to use ASIO. If you just need microphone sampling, use DirectSound. Opening selected ASIO device failed. No input will be done. AboutDialog About Mumble <h3>Mumble (%1)</h3><p>%3</p><p><b>A voice-chat utility for gamers</b></p><p><tt><a href="%2">%2</a></tt></p> &About Mumble &License A&uthors &Third-Party Licenses OK AudioInput Interface System Input method for audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Input device for audio <b>This is the input device to use for audio.</b> Transmission &Transmit When to transmit your speech <b>This sets when speech should be transmitted.</b><br /><i>Continuous</i> - All the time<br /><i>Voice Activity</i> - When you are speaking clearly.<br /><i>Push To Talk</i> - When you hold down the hotkey set under <i>Shortcuts</i>. DoublePush Time If you press the PTT key twice in this time it will get locked. <b>DoublePush Time</b><br />If you press the push-to-talk key twice during the configured interval of time it will be locked. Mumble will keep transmitting until you hit the key once more to unlock PTT again. Reset audio cue to default <b>Reset</b><br/>Reset the paths for the files to their default. Browse for on audio file Browse for off audio file Off On Preview the audio cues Use SNR based speech detection Signal to Noise <b>This sets speech detection to use Amplitude.</b><br />In this mode, the raw strength of the input signal is used to detect speech. Amplitude Voice &Hold How long to keep transmitting after silence Silence Below <b>This sets the trigger values for voice detection.</b><br />Use this together with the Audio Statistics window to manually tune the trigger values for detecting speech. Input values below "Silence Below" always count as silence. Values above "Speech Above" always count as voice. Values in between will count as voice if you're already talking, but will not trigger a new detection. Speech Above Signal values above this count as voice Compression &Quality Quality of compression (peak bandwidth) <b>This sets the quality of compression.</b><br />This determines how much bandwidth Mumble is allowed to use for outgoing audio. Audio per packet How many audio frames to send per packet <b>This selects how many audio frames should be put in one packet.</b><br />Increasing this will increase the latency of your voice, but will also reduce bandwidth requirements. <b>This shows peak outgoing bandwidth used.</b><br />This shows the peak amount of bandwidth sent out from your machine. Audio bitrate is the maximum bitrate (as we use VBR) for the audio data alone. Position is the bitrate used for positional information. Overhead is our framing and the IP packet headers (IP and UDP is 75% of this overhead). Audio Processing Noise Suppression Noise suppression <b>This sets the amount of noise suppression to apply.</b><br />The higher this value, the more aggressively stationary noise will be suppressed. Maximum amplification of input sound <b>Maximum amplification of input.</b><br />Mumble normalizes the input volume before compressing, and this sets how much it's allowed to amplify.<br />The actual level is continually updated based on your current speech pattern, but it will never go above the level specified here.<br />If the <i>Microphone loudness</i> level of the audio statistics hover around 100%, you probably want to set this to 2.0 or so, but if, like most people, you are unable to reach 100%, set this to something much higher.<br />Ideally, set it so <i>Microphone Loudness * Amplification Factor >= 100</i>, even when you're speaking really soft.<br /><br />Note that there is no harm in setting this to maximum, but Mumble will start picking up other conversations if you leave it to auto-tune to that level. Current speech detection chance Cancel echo from speakers Enabling this will cancel the echo from your speakers. Mixed has low CPU impact, but only works well if your speakers are equally loud and equidistant from the microphone. Multichannel echo cancellation provides much better echo cancellation, but at a higher CPU cost. Disabled <b>This sets speech detection to use Signal to Noise ratio.</b><br />In this mode, the input is analyzed for something resembling a clear signal, and the clarity of that signal is used to trigger speech detection. <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal values below this count as silence Maximum bandwidth used for sending audio Use Amplitude based speech detection <b>This selects how long after a perceived stop in speech transmission should continue.</b><br />Set this higher if your voice breaks up when you speak (seen by a rapidly blinking voice icon next to your name). Exclusive mode <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive R&eset &Browse... B&rowse... &Preview <b>Preview</b><br/>Plays the current <i>on</i> sound followed by the current <i>off</i> sound. Displays an always on top window with a push to talk button in it Display push to talk window Misc Audible audio cue when starting or stopping to transmit <b>This enables transmission audio cues.</b><br />Setting this will give you a short audio beep when you start and stop transmitting. Audio cue Gets played when starting to transmit Gets played when stopping to transmit Hold Time Time the microphone stays open after the PTT key is released Server maximum network bandwidth is only %1 kbit/s. Audio quality auto-adjusted to %2 kbit/s (%3 ms) Max. Amplification Idle action minutes do nothing deafen mute after Echo Cancellation Mixed echo cancellation Multichannel echo cancellation The idle action will be reversed upon any key or mouse button input Undo Idle action upon activity Apply RNNoise's noise suppression filter. <b>This applies RNNoise's noise suppression filter.</b><br />RNNoise is based on machine learning and used in WebRTC. RNNoise Audio input AudioInputDialog Continuous Voice Activity Push To Talk Audio Input %1 ms Off %1 s %1 kb/s -%1 dB %1 kbit/s (Audio %2, Position %4, Overhead %3) AudioOutput Interface System Output method for audio <b>This is the output method to use for audio.</b><br />Most likely you want to use DirectSound. <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Output device for audio <b>This is the output device to use for audio.</b> Positional Audio Audio Output Default &Jitter Buffer Safety margin for jitter buffer <b>This sets the minimum safety margin for the jitter buffer.</b><br />All incoming audio is buffered, and the jitter buffer continually tries to push the buffer to the minimum sustainable by your network, so latency can be as low as possible. This sets the minimum buffer size to use. If the start of sentences you hear is very jittery, increase this value. Minimum distance to user before sound volume decreases This sets the minimum distance for sound calculations. The volume of other users' speech will not decrease until they are at least this far away from you. This sets the maximum distance for sound calculations. When farther away than this, other users' speech volume will not decrease any further. <b>This enables one of the loopback test modes.</b><br /><i>None</i> - Loopback disabled<br /><i>Local</i> - Emulate a local server.<br /><i>Server</i> - Request loopback from server.<br />Please note than when loopback is enabled, no other users will hear your voice. This setting is not saved on application exit. Volume Volume of incoming speech <b>This adjusts the volume of incoming speech.</b><br />Note that if you increase this beyond 100%, audio will be distorted. Output Delay Amount of data to buffer The connected "speakers" are actually headphones The connected "speakers" are actually headphones. Factor for sound volume decrease Bloom Factor for sound volume increase How much should sound volume increase for sources that are really close? Checking this indicates that you don't have speakers connected, just headphones. This is important, as speakers are usually in front of you, while headphones are directly to your left/right. This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. Headphones Minimum Distance Maximum Distance Maximum distance, beyond which speech volume won't decrease Minimum Volume What should the volume be at the maximum distance? Loopback Test Delay Variance Variance in packet latency <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you to set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. <b>This sets the packet latency variance for loopback testing.</b><br />Most audio paths contain some variable latency. This allows you set that variance for loopback mode testing. For example, if you set this to 15ms, this will emulate a network with 20-35ms ping latency or one with 80-95ms latency. Most domestic net connections have a variance of about 5ms. Packet Loss Packet loss for loopback mode <b>This sets the packet loss for loopback mode.</b><br />This will be the ratio of packets lost. Unless your outgoing bandwidth is peaked or there's something wrong with your network connection, this will be 0% &Loopback Desired loopback mode Attenuate applications by... Attenuation of other applications during speech <b>Attenuate volume of other applications during speech</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This sets the attenuation of other applications if the feature is enabled. If checked Mumble lowers the volume of other applications while other users talk <b>Attenuate applications while other users talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while other users talk to you. while other users talk If checked Mumble lowers the volume of other applications while you talk <b>Attenuate applications while you talk</b><br />Mumble supports decreasing the volume of other applications during incoming and/or outgoing speech. This makes mumble activate the feature while you talk. while you talk Exclusive mode, not recommended. <b>This opens the device in exclusive mode.</b><br />No other application will be able to use the device. Exclusive Priority Speaker If checked Mumble lowers the volume of other users while you talk if you have the "Priority Speaker" status. <b>Attenuate other users while talking as Priority Speaker.</b><br />Mumble supports decreasing the volume of other users while you talk as the <i>Priority Speaker</i> to avoid getting disturbed. Checking this checkbox will enable this feature. Attenuate other users while talking as Priority Speaker. Advanced Attenuation Options If checked, Mumble will only attenuate applications that are using the same output source as Mumble <b>Attenuate only applications using the same output as Mumble</b><br />If checked, applications that use a different output than Mumble will not be attenuated. Only attenuate applications using the same output device If checked, PulseAudio loopback modules will be attenuated <b>Attenuate PulseAudio loopback modules</b><br />If loopback modules are linked to Mumble's output device/sink, they will also be attenuated. Attenuate PulseAudio loopback modules Audio output AudioOutputDialog None Local Server Audio Output %1 ms %1 % %1 m AudioOutputSample Choose sound file Invalid sound file The file '%1' cannot be used by Mumble. Please select a file with a compatible format and encoding. AudioStats >1000 ms >1000ms Audio Statistics Input Levels Peak microphone level Peak power in last frame This shows the peak power in the last frame (20 ms), and is the same measurement as you would usually find displayed as "input power". Please disregard this and look at <b>Microphone power</b> instead, which is much more steady and disregards outliers. Peak speaker level This shows the peak power of the speakers in the last frame (20 ms). Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. This shows the peak power in the last frame (20 ms) of the speakers. Unless you are using a multi-channel sampling method (such as ASIO) with speaker channels configured, this will be 0. If you have such a setup configured, and this still shows 0 while you're playing audio from other programs, your setup is not working. Peak clean level This shows the peak power in the last frame (20 ms) after all processing. Ideally, this should be -96 dB when you're not talking. In reality, a sound studio should see -60 dB, and you should hopefully see somewhere around -20 dB. When you are talking, this should rise to somewhere between -5 and -10 dB.<br />If you are using echo cancellation, and this rises to more than -15 dB when you're not talking, your setup is not working, and you'll annoy other users with echoes. Signal Analysis Microphone power How close the current input level is to ideal This shows how close your current input volume is to the ideal. To adjust your microphone level, open whatever program you use to adjust the recording volume, and look at the value here while talking.<br /><b>Talk loud, as you would when you're upset over getting fragged by a noob.</b><br />Adjust the volume until this value is close to 100%, but make sure it doesn't go above. If it does go above, you are likely to get clipping in parts of your speech, which will degrade sound quality. Signal-To-Noise ratio Signal-To-Noise ratio from the microphone This is the Signal-To-Noise Ratio (SNR) of the microphone in the last frame (20 ms). It shows how much clearer the voice is compared to the noise.<br />If this value is below 1.0, there's more noise than voice in the signal, and so quality is reduced.<br />There is no upper limit to this value, but don't expect to see much above 40-50 without a sound studio. Speech Probability Probability of speech This is the probability that the last frame (20 ms) was speech and not environment noise.<br />Voice activity transmission depends on this being right. The trick with this is that the middle of a sentence is always detected as speech; the problem is the pauses between words and the start of speech. It's hard to distinguish a sigh from a word starting with 'h'.<br />If this is in bold font, it means Mumble is currently transmitting (if you're connected). Configuration feedback Current audio bitrate Bitrate of last frame DoublePush interval Time between last two Push-To-Talk presses Speech Detection Current speech detection chance <b>This shows the current speech detection settings.</b><br />You can change the settings from the Settings dialog or from the Audio Wizard. Signal and noise power spectrum Power spectrum of input signal and noise estimate This shows the power spectrum of the current input signal (red line) and the current noise estimate (filled blue).<br />All amplitudes are multiplied by 30 to show the interesting parts (how much more signal than noise is present in each waveband).<br />This is probably only of interest if you're trying to fine-tune noise conditions on your microphone. Under good conditions, there should be just a tiny flutter of blue at the bottom. If the blue is more than halfway up on the graph, you have a seriously noisy environment. Echo Analysis Weights of the echo canceller This shows the weights of the echo canceller, with time increasing downwards and frequency increasing to the right.<br />Ideally, this should be black, indicating no echo exists at all. More commonly, you'll have one or more horizontal stripes of bluish color representing time delayed echo. You should be able to see the weights updated in real time.<br />Please note that as long as you have nothing to echo off, you won't see much useful data here. Play some music and things should stabilize. <br />You can choose to view the real or imaginary parts of the frequency-domain weights, or alternately the computed modulus and phase. The most useful of these will likely be modulus, which is the amplitude of the echo, and shows you how much of the outgoing signal is being removed at that time step. The other viewing modes are mostly useful to people who want to tune the echo cancellation algorithms.<br />Please note: If the entire image fluctuates massively while in modulus mode, the echo canceller fails to find any correlation whatsoever between the two input sources (speakers and microphone). Either you have a very long delay on the echo, or one of the input sources is configured wrong. This is the audio bitrate of the last compressed frame (20 ms), and as such will jump up and down as the VBR adjusts the quality. The peak bitrate can be adjusted in the Settings dialog. AudioWizard Audio Tuning Wizard Introduction Welcome to the Mumble Audio Wizard Finished Enjoy using Mumble Device selection Selecting the input and output device to use with Mumble. This is the device your microphone is connected to. System Input method for audio <b>This is the input method to use for audio.</b><br />Most likely you want to use DirectSound. Device Input device to use <b>Selects which sound card to use for audio input.</b> Cancel echo from headset or speakers Use echo cancellation This enables echo cancellation of outgoing audio, which helps both on speakers and on headsets. This is the device your speakers or headphones are connected to. Output method for audio <b>This is the Output method to use for audio.</b><br />Most likely you want to use DirectSound. Output device to use <b>Selects which sound card to use for audio Output.</b> Enable positional audio Allows positioning of sound Allows positioning of sound. <p> This is the audio tuning wizard for Mumble. This will help you correctly set the input levels of your sound card, and also set the correct parameters for sound processing in Mumble. </p> <p> Please be aware that as long as this wizard is active, audio will be looped locally to allow you to listen to it, and no audio will be sent to the server. </p> Input Device Output Device This allows Mumble to use positional audio to place voices. <p> To keep latency to an absolute minimum, it's important to buffer as little audio as possible on the soundcard. However, many soundcards report that they require a much smaller buffer than what they can actually work with, so the only way to set this value is to try and fail. </p> <p> You should hear a voice sample. Change the slider below to the lowest value which gives <b>no</b> interruptions or jitter in the sound. Please note that local echo is disabled during this test. </p> Amount of data to buffer This sets the amount of data to pre-buffer in the output buffer. Experiment with different values and set it to the lowest which doesn't cause rapid jitter in the sound. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the blue and green but <b>not</b> the red zone while you speak. </p> Positional Audio Adjusting attenuation of positional audio. <p> Mumble supports positional audio for some games, and will position the voice of other users relative to their position in game. Depending on their position, the volume of the voice will be changed between the speakers to simulate the direction and distance the other user is at. Such positioning depends on your speaker configuration being correct in your operating system, so a test is done here. </p> <p> The graph below shows the position of <font color="red">you</font>, the <font color="yellow">speakers</font> and a <font color="green">moving sound source</font> as if seen from above. You should hear the audio move between the channels. </p> Use headphones instead of speakers <p> Congratulations. You should now be ready to enjoy a richer sound experience with Mumble. </p> <p> Mumble is under continuous development, and the development team wants to focus on the features that benefit the most users. To this end, Mumble supports submitting anonymous statistics about your configuration to the developers. These statistics are essential for future development, and also make sure the features you use aren't deprecated. </p> Use headphones This ignores the OS speaker configuration and configures the positioning for headphones instead. Volume tuning Tuning microphone hardware volume to optimal settings. Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into green when you talk, but stays blue while you're silent. Voice Activity Detection Letting Mumble figure out when you're talking and when you're silent. This will help Mumble figure out when you are talking. The first step is selecting which data value to use. Raw amplitude from input Signal-To-Noise ratio Next you need to adjust the following slider. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Next you need to adjust the following two sliders. The first few utterances you say should end up in the green area (definitive speech). While talking, you should stay inside the yellow (might be speech) and when you're not talking, everything should be in the red (definitively not speech). Device tuning Changing hardware output delays to their minimum value. Submit anonymous statistics to the Mumble project Push To Talk: Quality & Notifications Adjust quality and notification settings. Quality settings Low Balanced Notification settings Use Text-To-Speech to read notifications and messages to you. Disable Text-To-Speech and use sounds instead. %1 ms Enables attenuation of other applications while users talk to you Attenuate applications while other users talk High Custom You already set a customized quality configuration in Mumble. Select this setting to keep it. Enables attenuation of other applications while users talk to you. This means that as soon someone starts to speak to you in Mumble, the sound of all other applications (like audio players) will get attenuated so you can hear them more clearly. Apply some high contrast optimizations for visually impaired users Use high contrast graphics Keep custom Text-To-Speech settings. <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the crisscrossed zone while you speak. </p> <p> Open your sound control panel and go to the recording settings. Make sure the microphone is selected as active input with maximum recording volume. If there's an option to enable a "Microphone boost" make sure it's checked. </p> <p> Speak loudly, as when you are annoyed or excited. Decrease the volume in the sound control panel until the bar below stays as high as possible in the striped and the empty but <b>not</b> the criss-crossed zone while you speak. </p> For high contrast mode Now talk softly, as you would when talking late at night and you don't want to disturb anyone. Adjust the slider below so that the bar moves into empty zone when you talk, but stays in the striped one while you're silent. For high contrast mode Next you need to adjust the following slider. The first few utterances you say should end up in the empty area (definitive speech). While talking, you should stay inside the striped (might be speech) and when you're not talking, everything should be in the crisscrossed (definitively not speech). For high contrast mode In this configuration Mumble will use a <b>low amount of bandwidth</b>. This will inevitably result in high latency and poor quality. Choose this only if your connection cannot handle the other settings. (16kbit/s, 60ms per packet) This is the <b>recommended default</b> configuration. It provides a good balance between quality, latency, and bandwidth usage. (40kbit/s, 20ms per packet) This configuration is only recommended for use in setups where bandwidth is not an issue, like a LAN. It provides the lowest latency supported by Mumble and <b>high quality</b>. (72kbit/s, 10ms per packet) BanEditor Mumble - Edit Bans &Address &Mask Reason Start End User Hash &Add &Update &Remove Ban List Search field This is the search field. Use it to find bans that have this username set in the username field. Who are you looking for? No nickname IP address No IP address Reason for the ban No reason Ban end date Ban end date. If you set the same date for start and end, the ban will be permanent (it will not expire). Certificate hash No certificate hash Banned users This is a list with banned users. Use this button if you want to add a new ban. Use this button if you want to update ban information. Use this button if you want to remove user from the ban list. Clear all fields This button clears all fields. Use it if you want to add a new ban. Clear Ban List - %n Ban(s) CertView Name Email Issuer Expiry Date (none) Self-signed CertWizard Unable to validate email.<br />Enter a valid (or blank) email to continue. There was an error generating your certificate.<br />Please try again. Your certificate and key could not be exported to PKCS#12 format. There might be an error in your certificate. The file could not be opened for writing. Please use another file. The file's permissions could not be set. No certificate and key has been written. Please use another file. The file could not be written successfully. Please use another file. The file could not be opened for reading. Please use another file. The file is empty or could not be read. Please use another file. The file did not contain a valid certificate and key. Please use another file. Select file to export certificate to Select file to import certificate from Unable to import. Missing password or incompatible file type. <b>Certificate Expiry:</b> Your certificate is about to expire. You need to renew it, or you will no longer be able to connect to servers you are registered on. Certificates Certificate Management Certificate Authentication Authenticating to servers without using passwords Current certificate This is the certificate Mumble currently uses. Current Certificate Create a new certificate This will create a new certificate. Import certificate from file This will import a certificate from file. Import a certificate Export Certificate This will export a certificate to file. Export current certificate Import Certificate PKCS #12 Certificate import <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from Firefox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> <p>Mumble can import certificates stored in PKCS #12 format. This is the format used when exporting a key from Mumble, and also when exporting keys from FireFox, Internet Explorer, Opera etc.</p><p>If the file is password protected, you will need the password to import the certificate.</p> Import from Filename to import from This is the filename you wish to import a certificate from. Select file to import from This opens a file selection dialog to choose a file to import a certificate from. Open... Password Password for PKCS#12 file This is the password for the PKCS#12 file containing your certificate. Certificate to import This is the certificate you are importing. Certificate Details Replace Certificate Replace existing certificate with new certificate? <p>You already have a certificate stored in Mumble, and you are about to replace it.</p> <p>If you are upgrading to a certificate issued to you by a trusted CA and the email addresses match your current certificate, this is completely safe, and servers you connect to will automatically recognize the strong certificate for your email address. </p> <p>If this is not the case, you will no longer be recognized by any server you previously have authenticated with. If you haven't been registered on any server yet, this is nothing to worry about. </p> <p> Are you sure you wish to replace your certificate? </p> This is the certificate Mumble currently uses. It will be replaced. New certificate This is the new certificate that will replace the old one. New Certificate Make a backup of your certificate Export to Filename to export to This is the filename you wish to export a certificate to. Save As... This is the certificate Mumble currently uses. It will be exported. Generate a new certificate for strong authentication <p>Mumble will now generate a strong certificate for authentication to servers.</p><p>If you wish, you may provide some additional information to be stored in the certificate, which will be presented to servers when you connect. If you provide a valid email address, you can upgrade to a CA issued email certificate later on, which provides strong identification.</p> Name Email Your email address (e.g. johndoe@mumble.info) This is your email address. It is strongly recommended to provide a valid email address, as this will allow you to upgrade to a strong certificate without authentication problems. Your name (e.g. John Doe) This is your name, and will be filled out in the certificate. This field is entirely optional. Finish Certificate-based authentication is ready for use Enjoy using Mumble with strong authentication. Automatic certificate creation <p>If you ever lose your current certificate, which will happen if your computer suffers a hardware failure or you reinstall your machine, you will no longer be able to authenticate to any server you are registered on. It is therefore <b>mandatory</b> that you make a backup of your certificate. We strongly recommend you store this backup on removable storage, such as a USB flash drive.</p> <p>Note that this file will not be encrypted, and if anyone gains access to it, they will be able to impersonate you, so take good care of it.</p> <p>Mumble can use certificates to authenticate with servers. Using certificates avoids passwords, meaning you don't need to disclose any password to the remote site. It also enables very easy user registration and a client side friends list independent of servers.</p><p>While Mumble can work without certificates, the majority of servers will expect you to have one.</p><p>Creating a new certificate automatically is sufficient for most use cases. But Mumble also supports certificates representing trust in the users ownership of an email address. These certificates are issued by third parties. For more information see our <a href="http://mumble.info/certificate.php">user certificate documentation</a>. </p> ChanACL None Traverse Enter Speak Mute/Deafen Make channel Make temporary Link channel This represents no privileges. This represents total access to the channel, including the ability to change group and ACL information. This privilege implies all other privileges. This represents the permission to traverse the channel. If a user is denied this privilege, he will be unable to access this channel and any sub-channels in any way, regardless of other permissions in the sub-channels. This represents the permission to join the channel. If you have a hierarchical channel structure, you might want to give everyone Traverse, but restrict Enter in the root of your hierarchy. This represents the permission to speak in a channel. Users without this privilege will be suppressed by the server (seen as muted), and will be unable to speak until they are unmuted by someone with the appropriate privileges. This represents the permission to whisper to this channel from the outside. This works exactly like the <i>speak</i> privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy of channels without linking. This represents the permission to mute and deafen other users. Once muted, a user will stay muted until he is unmuted by another privileged user or reconnects to the server. This represents the permission to move a user to another channel or kick him from the server. To actually move the user, either the moving user must have Move privileges in the destination channel, or the user must normally be allowed to enter the channel. Users with this privilege can move users into channels the target user normally wouldn't have permission to enter. This represents the permission to make sub-channels. The user making the sub-channel will be added to the admin group of the sub-channel. This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves. This represents the permission to link channels. Users in linked channels hear each other, as long as the speaking user has the <i>speak</i> privilege in the channel of the listener. You need the link privilege in both channels to create a link, but just in either channel to remove it. This represents the permission to write text messages to other users in this channel. This represents the permission to forcibly remove users from the server. This represents the permission to permanently remove users from the server. This represents the permission to register and unregister users on the server. This represents the permission to register oneself on the server. Whisper Move Text message Kick Ban Register User Register Self Write ACL ChatbarTextEdit Paste and &Send Paste and send <center>Type chat message here</center> ClientUser Friend Authenticated Priority speaker Recording Muted (server) Deafened (server) Local Ignore (Text messages) Local Mute Muted (self) Deafened (self) ConfigDialog Accept changes This button will accept current settings and return to the application.<br />The settings will be stored to disk when you leave the application. Reject changes This button will reject all changes and return to the application.<br />The settings will be reset to the previous positions. Apply changes This button will immediately apply all changes. Undo changes for current page This button will revert any changes done on the current page to the most recent applied settings. Restore defaults for current page This button will restore the defaults for the settings on the current page. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. This button will restore the settings for the current page only to their defaults. Other pages will not be changed.<br />To restore all settings to their defaults, you will have to use this button on every page. Mumble Configuration ConnectDialog Connecting to %1 Enter username Adding host %1 Servername Hostname Bonjour name Port Addresses Website Packet loss Ping (80%) %1 ms Ping (95%) Bandwidth %1 kbit/s &Connect &Filters Unknown Users Version Failed to fetch server list Mumble Server Connect Ping Remove from Favorites Add custom server Show all servers that respond to ping Show all servers with users Show all servers &Copy Copy favorite link to clipboard &Paste Paste favorite from clipboard &Edit... &Add New... Add to &Favorites Open &Webpage Show &Reachable Show &Populated Show &All ConnectDialogEdit Edit Server Name of the server A&ddress Internet address of the server. Internet address of the server. <b>Address</b><br/> Internet address of the server. This can be a normal hostname, an IPv4/IPv6 address or a Bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. <b>Address</b></br> Internet address of the server. This can be a normal hostname, an ipv4/6 address or a bonjour service identifier. Bonjour service identifiers have to be prefixed with a '@' to be recognized by Mumble. &Port Port on which the server is listening <b>Port</b><br/> Port on which the server is listening. If the server is identified by a Bonjour service identifier this field will be ignored. &Username Username to send to the server <b>Username</b><br/> Username to send to the server. Be aware that the server can impose restrictions on how a username might look like. Also your username could already be taken by another user. Label Add Server You are currently connected to a server. Do you want to fill the dialog with the connection data of this server? Host: %1 Port: %2 You have an URL in your clipboard. Do you want to fill the dialog with this data? Host: %1 Port: %2 Password Password to send to the server <b>Password</b><br/> Password to be sent to the server on connect. This password is needed when connecting as <i>SuperUser</i> or to a server using password authentication. If not entered here the password will be queried on connect. Show password <b>Label</b><br/> Label of the server. This is what the server will be named like in your server list and can be chosen freely. Local server label 127.0.0.1 64738 Your username Your password &Fill CoreAudioSystem Default Device CrashReporter Mumble Crash Report <p><b>We're terribly sorry, but it seems Mumble has crashed. Do you want to send a crash report to the Mumble developers?</b></p><p>The crash report contains a partial copy of Mumble's memory at the time it crashed, and will help the developers fix the problem.</p> Email address (optional) Please describe briefly, in English, what you were doing at the time of the crash Please briefly describe what you were doing at the time of the crash Send Report Don't send report Crash upload successful Thank you for helping make Mumble better! Crash upload failed We're really sorry, but it appears the crash upload has failed with error %1 %2. Please inform a developer. This really isn't funny, but apparently there's a bug in the crash reporting code, and we've failed to upload the report. You may inform a developer about error %1 Uploading crash report Abort upload DXAudioInput Default DirectSound Voice Input Opening chosen DirectSound Input device failed. No microphone capture will be done. Opening chosen DirectSound Input failed. Default device will be used. Lost DirectSound input device. DXAudioOutput Default DirectSound Voice Output Opening chosen DirectSound Output failed. Default device will be used. Lost DirectSound output device. Opening chosen DirectSound Output failed. No audio will be heard. Database Mumble failed to initialize a database in any of the possible locations. The database '%1' is read-only. Mumble cannot store server settings (i.e. SSL certificates) until you fix this problem. The database '%1' is read-only. Mumble can not store server settings (ie. SSL certificates) until you fix this problem. DeveloperConsole Developer Console DockTitleBar Drag here GlobalShortcut Shortcuts List of configured shortcuts Function Data Shortcut Suppress Add new shortcut This will add a new global shortcut &Add Remove selected shortcut This will permanently remove a selected shortcut. &Remove <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can enable <span style=" font-style:italic;">Access for assistive devices</span> in the system's Accessibility preferences. However, please note that this change also potentially allows malicious programs to read what is typed on your keyboard.</p></body></html> Open Accessibility Preferences Skip Enable Global Shortcuts <b>Additional Shortcut Engines</b><br />This section allows you to configure the use of additional GlobalShortcut engines. Additional Shortcut Engines <b>Enable Windows hooks</b>.<br />This enables the Windows hooks shortcut engine. Using this engine allows Mumble to suppress keypresses and mouse clicks. Enable Windows hooks <b>Enable GKey</b>.<br />This setting enables support for the GKey shortcut engine, for "G"-keys found on Logitech keyboards. Enable GKey <b>Enable XInput</b><br />This setting enables support for the XInput shortcut engine, for Xbox compatible controllers. Enable XInput <b>Enable shortcuts in privileged applications</b>.<br />Also known as "UIAccess". This allows Mumble to receive global shortcut events from programs running at high privilege levels, such as an Admin Command Prompt or older games that run with admin privileges. <br /><br /> Without this option enabled, using Mumble's global shortcuts in privileged applications will not work. This can seem inconsistent: for example, if the Push-to-Talk button is pressed in a non-privileged program, but released in a privileged application, Mumble will not observe that it has been released and you will continue to talk until you press the Push-to-Talk button again. Enable shortcuts in privileged applications GlobalShortcutConfig <html><head/><body><p>Mumble can currently only use mouse buttons and keyboard modifier keys (Alt, Ctrl, Cmd, etc.) for global shortcuts.</p><p>If you want more flexibility, you can add Mumble as a trusted accessibility program in the Security & Privacy section of your Mac's System Preferences.</p><p>In the Security & Privacy preference pane, change to the Privacy tab. Then choose Accessibility (near the bottom) in the list to the left. Finally, add Mumble to the list of trusted accessibility programs.</body></html> Shortcuts Shortcut button combination. <b>This is the global shortcut key combination.</b><br />Click this field and then press the desired key/button combo to rebind. Double-click to clear. <b>This is the global shortcut key combination.</b><br />Double-click this field and then the desired key/button combo to rebind. Suppress keys from other applications <b>This hides the button presses from other applications.</b><br />Enabling this will hide the button (or the last button of a multi-button combo) from other applications. Note that not all buttons can be suppressed. GlobalShortcutTarget Whisper Target Whisper to list of Users Channel Target Restrict to Group If specified, only members of this group will receive the whisper. List of users Add Remove Modifiers Do not send positional audio information when using this whisper shortcut. Ignore positional audio Shout to Linked channels Shout to subchannels Shout to Channel The whisper will also be transmitted to linked channels. The whisper will also be sent to the subchannels of the channel target. GlobalShortcutX Mouse %1 JackAudioSystem Hardware Ports Mono Stereo LCD Not connected LCDConfig Enable this device LCD Devices Name <p>This is the list of available LCD devices on your system. It lists devices by name, but also includes the size of the display. Mumble supports outputting to several LCD devices at a time.</p> <h3>Size:</h3> <p> This field describes the size of an LCD device. The size is given either in pixels (for Graphic LCDs) or in characters (for Character LCDs).</p> <h3>Enabled:</h3> <p>This decides whether Mumble should draw to a particular LCD device.</p> Size Enabled Views Minimum Column Width <p>This option decides the minimum width a column in the User View.</p> <p>If too many people are speaking at once, the User View will split itself into columns. You can use this option to pick a compromise between number of users shown on the LCD, and width of user names.</p> This setting decides the width of column splitter. Splitter Width Log Debug Critical Warning Information Server Connected Server Disconnected Other self-muted/deafened Permission Denied Text Message User Joined Server User Left Server User recording state changed User kicked (you or by you) User kicked You self-muted User muted (you) User muted (by you) User muted (other) User Joined Channel User Left Channel You self-unmuted You self-deafened You self-undeafened User renamed You Joined Channel You Joined Channel (moved) User connected and entered channel User left channel and disconnected Private text message the server [[ Invalid size ]] [[ Text object too large to display ]] [Date changed to %1] link to %1 FTP link to %1 player link channel link %1 link LogConfig Toggle console for %1 events Toggle pop-up notifications for %1 events Toggle Text-To-Speech for %1 events Click here to toggle sound notification for %1 events Toggle window highlight (if not active) for %1 events Path to sound file used for sound notifications in the case of %1 events<br />Single click to play<br />Double-click to change Click here to toggle console output for %1 events.<br />If checked, this option makes Mumble output all %1 events in its message log. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by Mumble for every %1 event. Click here to toggle pop-up notifications for %1 events.<br />If checked, a notification pop-up will be created by mumble for every %1 event. Click here to toggle window highlight for %1 events.<br />If checked, Mumble's window will be highlighted for every %1 event, if not active. Path to sound file used for sound notifications in the case of %1 events.<br />Single click to play<br />Double-click to change<br />Ensure that sound notifications for these events are enabled or this field will not have any effect. Click here to toggle Text-To-Speech for %1 events.<br />If checked, Mumble uses Text-To-Speech to read %1 events out loud to you. Text-To-Speech is also able to read the contents of the event which is not true for sound files. Text-To-Speech and sound files cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a soundfile predefined by you to indicate %1 events. Soundfiles and Text-To-Speech cannot be used at the same time. Click here to toggle sound notification for %1 events.<br />If checked, Mumble uses a sound file predefined by you to indicate %1 events. Sound files and Text-To-Speech cannot be used at the same time. Path to soundfile used for sound notifications in the case of %1 events.<br />Single click to play<br />Doubleclick to change<br />Be sure that sound notifications for these events are enabled or this field will not have any effect. Messages Message Console Notification Text-To-Speech Soundfile Path Text To Speech Volume Volume of Text-To-Speech Engine <b>This is the volume used for the speech synthesis.</b> Length threshold Message length threshold for Text-To-Speech Engine <b>This is the length threshold used for the Text-To-Speech Engine.</b><br />Messages longer than this limit will not be read aloud in their full length. Characters Whisper If checked you will only hear whispers from users you added to your friend list. Only accept whispers from friends If enabled text messages you send will be read back to you with TTS Read back own messages Chat Log Maximum chat length Unlimited Lines Highlight LookConfig System default None Only with users All Ask Do Nothing Move <a href="%1">Browse</a> This link is located next to the theme heading in the ui config and opens the user theme directory User Interface This sets which channels to automatically expand. <i>None</i> and <i>All</i> will expand no or all channels, while <i>Only with users</i> will expand and collapse channels as users join and leave them. List users above subchannels (requires restart). <b>If set, users will be shown above subchannels in the channel view.</b><br />A restart of Mumble is required to see the change. Users above Channels <b>If set, will verify you want to quit if connected.</b> Show number of users in each channel Show channel user count Language Language to use (requires restart) <b>This sets which language Mumble should use.</b><br />You have to restart Mumble to use the new language. Look and Feel Layout Classic Stacked Hybrid Custom This changes the behavior when moving channels. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. This sets the behavior of channel drags; it can be used to prevent accidental dragging. <i>Move Channel</i> moves the channel without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the channel. Expand When to automatically expand channels Channel Dragging Ask whether to close or minimize when quitting Mumble. Ask on quit while connected Always On Top <b>If set, minimizing the Mumble main window will cause it to be hidden and accessible only from the tray. Otherwise, it will be minimized as a window normally would.</b> Hide in tray when minimized Hide the main Mumble window in the tray when it is minimized. This setting controls when the application will be always on top. Never Always In minimal view In normal view Displays talking status in system tray Show talking status in tray icon This setting controls in which situations the application will stay always on top. If you select <i>Never</i> the application will not stay on top. <i>Always</i> will always keep the application on top. <i>In minimal view</i> / <i>In normal view</i> will only keep the application always on top when minimal view is activated / deactivated. Show context menu in menu bar Apply some high contrast optimizations for visually impaired users Optimize for high contrast Application Adds user and channel context menus into the menu bar Tray Icon Channel Tree Use selected item as the chat bar target Filter automatically hides empty channels Show transmit mode dropdown in toolbar Theme Theme to use to style the user interface <b>Configures which theme the Mumble user interface should be styled with</b><br />Mumble will pick up themes from certain directories and display them in this list. The one you select will be used to customize the visual appearance of Mumble. This includes colors, icons and more. User Dragging This changes the behavior when moving users. This sets the behavior of user drags; it can be used to prevent accidental dragging. <i>Move</i> moves the user without prompting. <i>Do Nothing</i> does nothing and prints an error message. <i>Ask</i> uses a message box to confirm if you really wanted to move the user. <b>Enable Developer menu</b><br />This enables the "Developer"-menu in Mumble. This menu is used for developer-specific features, such as the Developer Console. Enable Developer menu When in custom layout mode, checking this disables rearranging. Lock layout MainWindow Root Push-to-Talk Global Shortcut Push and hold this button to send voice. Global Shortcut This configures the push-to-talk button, and as long as you hold this button down, you will transmit voice. Global Shortcut Reset Audio Processor Global Shortcut Unlink Plugin Global Shortcut Push-to-Mute Global Shortcut Join Channel Global Shortcut Toggle Overlay Global Shortcut Toggle state of in-game overlay. Global Shortcut Toggle Minimal Global Shortcut Volume Up (+10%) Global Shortcut Volume Down (-10%) Global Shortcut Mumble Mumble -- %1 &Window Minimize Ctrl+M Close Mumble is currently connected to a server. Do you want to Close or Minimize it? Mute Self Global Shortcut Set self-mute status. Global Shortcut This will set or toggle your muted status. If you turn this off, you will also disable self-deafen. Global Shortcut Deafen Self Global Shortcut Set self-deafen status. Global Shortcut This will set or toggle your deafened status. If you turn this on, you will also enable self-mute. Global Shortcut Whisper/Shout Whisper <center>Not connected</center> Not connected Clear Opening URL %1 File does not exist File is not a configuration file. Settings merged from file. URL scheme is not 'mumble' This version of Mumble can't handle URLs for Mumble version %1.%2.%3 Connecting to %1 Enter username Connecting to server %1. Reconnecting. Transmit Mode set to Continuous <p>%1 (%2)<br />%3</p> <h2>Voice channel</h2><p>Encrypted with 128 bit OCB-AES128<br />%1 ms average latency (%4 deviation)</p> Register yourself as %1 <p>You are about to register yourself on this server. This action cannot be undone, and your username cannot be changed once this is done. You will forever be known as '%1' on this server.</p><p>Are you sure you want to register yourself?</p> <h2>Version</h2><p>Protocol %1</p> <p>No build information or OS version available</p> The connection is encrypted and authenticated using %1 and uses %2 as the key exchange mechanism (%3) The connection is encrypted using %1, with %2 for message authentication and %3 as the key exchange mechanism (%4) The connection is secured by the cipher suite that OpenSSL identifies as %1 <p>The connection provides perfect forward secrecy</p> <p>The connection does not provide perfect forward secrecy</p> <h2>Control channel</h2><p>The connection uses %1</p>%2%3<p>%4 ms average latency (%5 deviation)</p><p>Remote host %6 (port %7)</p> Voice channel is sent over control channel Register user %1 <p>You are about to register %1 on the server. This action cannot be undone, the username cannot be changed, and as a registered user, %1 will have access to the server even if you change the server password.</p><p>From this point on, %1 will be authenticated with the certificate currently in use.</p><p>Are you sure you want to register %1?</p> Kicking user %1 Banning user %1 View comment on user %1 Message to channel %1 Connected. <li>Expected certificate digest (SHA-1): %1</li> Server presented a certificate which failed verification. <p>%1</p><ul>%2</ul><p>The specific errors with this certificate are:</p><ol>%3</ol><p>Do you wish to accept this certificate anyway?<br />(It will also be stored so you won't be asked this again.)</p> SSL Version mismatch Server connection failed. <center>Type message to channel '%1' here</center> Type message to channel '%1' here <center>Type message to user '%1' here</center> Type message to user '%1' here Choose image file Failed to load image Could not open file for reading. Image format not recognized. &User &Channel Use in conjunction with Whisper to. Global Shortcut This will switch the states of the in-game overlay. Global Shortcut Link Channel Global Shortcut Cycle Transmit Mode Global Shortcut Set Transmit Mode to Push-To-Talk Global Shortcut Set Transmit Mode to Continuous Global Shortcut Set Transmit Mode to VAD Global Shortcut Send Text Message Global Shortcut Send Clipboard Text Message Global Shortcut This will send your Clipboard content to the channel you are currently in. Global Shortcut Continuous Voice Activity Push-to-Talk Mumble - Minimal View -- %1 Cancel Save Image As... Save Image File Could not save image: %1 Change your comment Transmit Mode set to Voice Activity Transmit Mode set to Push-to-Talk <p>Connected users: %1/%2</p> UDP Statistics To Server From Server Good Late Lost Resync <h2>Audio bandwidth</h2><p>Maximum %1 kbit/s<br />Current %2 kbit/s<br />Codec: %3</p> Mumble Server Information &View Certificate Enter reason Sending message to %1 To %1: %2 Message to %1 Are you sure you want to reset the comment of user %1? Are you sure you want to reset the avatar of user %1? Are you sure you want to delete %1 and all its sub-channels? Sending message to channel %1 Message to tree %1 To %1 (Tree): %2 (Tree) %1: %2 Unmuted and undeafened. Unmuted. Muted. Muted and deafened. Deafened. Undeafened. Restart Mumble? Some settings will only apply after a restart of Mumble. Restart Mumble now? About Qt SSL Verification failed: %1 <li>Server certificate digest (SHA-1): %1</li> <b>WARNING:</b> The server presented a certificate that was different from the stored one. This server is using an older encryption standard, and is no longer supported by modern versions of Mumble. Server connection failed: %1. Disconnected from server. Invalid username You connected with an invalid username, please try another one. Username in use That username is already in use, please try another username. Wrong certificate or password Wrong certificate or password for registered user. If you are certain this user is protected by a password please retry. Otherwise abort and check your certificate and username. Wrong password Wrong server password for unregistered user account, please try again. Images (*.png *.jpg *.jpeg) C&onfigure &Help Log This shows all recent activity. Connecting to servers, errors and information messages all show up here.<br />To configure exactly which messages show up here, use the <b>Settings</b> command from the menu. &Quit Mumble Closes the program Exits the application. Ctrl+Q Open the server connection dialog &Disconnect Disconnect from server Disconnects you from the server. Show information about the server connection This will show extended information about the connection to the server. &Mute &Deafen &Local Mute Send a Text Message Sends a text message to another user. Add new channel This adds a new sub-channel to the currently selected channel. Remove channel This removes a channel and all sub-channels. Edit Groups and ACL for channel This opens the Group and ACL dialog for the channel, to control permissions. &Link Link your channel to another channel This is the chatbar<br />If you enter text here and then press enter the text is sent to the user or channel that was selected. If nothing is selected the message is sent to your current channel. Chatbar Shows a dialog of registered servers, and also allows quick-connect. Kick user (with reason) Kick selected user off server. You'll be asked to specify a reason. Mute user Mute or unmute user on server. Unmuting a deafened user will also undeafen them. Kick and ban user (with reason) Kick and ban selected user from server. You'll be asked to specify a reason. Deafen user Deafen or undeafen user on server. Deafening a user will also mute them. Mute user locally Mute or unmute user locally. Use this on other users in the same room. This links your current channel to the selected channel. If users in a channel have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. This links your current channel to the selected channel. If they have permission to speak in the other channel, users can now hear each other. This is a permanent link, and will last until manually unlinked or the server is restarted. Please see the shortcuts for push-to-link. &Unlink Channel Unlink your channel from another channel This unlinks your current channel from the selected channel. Unlinks your channel from all linked channels. This unlinks your current channel (not the selected one) from all linked channels. &Reset Reset audio preprocessor This will reset the audio preprocessor, including noise cancellation, automatic gain and voice activity detection. If something suddenly worsens the audio environment (like dropping the microphone) and it was temporary, use this to avoid having to wait for the preprocessor to readjust. &Mute Self Mute yourself Mute or unmute yourself. When muted, you will not send any data to the server. Unmuting while deafened will also undeafen. &Deafen Self Deafen yourself Deafen or undeafen yourself. When deafened, you will not hear anything. Deafening yourself will also mute. &Text-To-Speech Toggle Text-To-Speech Enable or disable the text-to-speech engine. Only messages enabled for TTS in the Configuration dialog will actually be spoken. Display audio statistics Pops up a small dialog with information about your current audio input. Forcibly unlink plugin This forces the current plugin to unlink, which is handy if it is reading completely wrong data. Configure Mumble Allows you to change most settings for Mumble. Start the audio configuration wizard This will guide you through the process of configuring your audio hardware. &What's This? Enter What's This? mode Click this to enter "What's This?" mode. Your cursor will turn into a question mark. Click on any button, menu choice or area to show a description of what it is. Information about Mumble Shows a small dialog with information and license for Mumble. Information about Speex Shows a small dialog with information about Speex. Information about Qt Shows a small dialog with information about Qt. Check for &Updates Check for new version of Mumble Connects to the Mumble webpage to check if a new version is available, and notifies you with an appropriate download URL if this is the case. Sends a text message to all users in a channel. Configure certificates for strong authentication This starts the wizard for creating, importing and exporting certificates for authentication against servers. Register user on server This will permanently register the user on the server. Add &Friend Adds a user as your friend. This will add the user as a friend, so you can recognize him on this and other servers. &Remove Friend Removes a user from your friends. This will remove a user from your friends list. &Update Friend Update name of your friend. Your friend uses a different name than what is in your database. This will update the name. Edit registered users list This opens the editor for registered users, which allow you to change their name or unregister them. Add or remove text-based access tokens &Minimal View Toggle minimal window modes This will toggle minimal mode, where the log window and menu is hidden. You muted and deafened %1. You unmuted and undeafened %1. You undeafened %1. You suppressed %1. %1 muted and deafened by %2. %1 unmuted and undeafened by %2. %1 undeafened by %2. %1 suppressed by %2. %1 moved to %2. %1 moved to %2 by %3. %1 moved in from %2 by %3. %1 is now muted and deafened. Your account information can not be verified currently. Please try again later Welcome message: %1 Mumble: %1 You were denied %1 privileges in %2. %3 was denied %1 privileges in %2. Denied: Cannot modify SuperUser. Denied: Invalid channel name. Denied: Text message too long. Denied: Operation not permitted in temporary channel. You need a certificate to perform this operation. %1 does not have a certificate. Invalid username: %1. Invalid username. Channel is full. Channel nesting limit reached. Channel count limit reached. Need to delete channels before creating new ones. Permission denied. %1 connected and entered channel. %1 connected. %1 is now muted. %1 is now unmuted. Recording started Recording stopped %1 started recording. %1 stopped recording. You revoked your priority speaker status. You assumed priority speaker status. %1 revoked your priority speaker status. %1 gave you priority speaker status. You revoked priority speaker status for %1. You gave priority speaker status to %1. %1 revoked own priority speaker status. %1 assumed priority speaker status. %1 revoked priority speaker status for %2. %1 gave priority speaker status to %2. You were unmuted and undeafened by %1. You were muted by %1. You were undeafened by %1. You were suppressed. You were suppressed by %1. You were unsuppressed. You were unsuppressed by %1. You joined %1. You moved %1 to %2. %1 is recording %1 renamed to %2 by %3. %1 disconnected. Server message from (Tree) (Channel) (Private) %2%1: %3 Failed to load Opus, it will not be available for audio encoding/decoding. The server requests minimum client version %1 The server requests positional audio be enabled. The server requests positional audio be disabled. The server requests Push-to-Talk be enabled. The server requests Push-to-Talk be disabled. You were unmuted by %1. You muted %1. You unsuppressed %1. You unmuted %1. %1 muted by %2. %1 unsuppressed by %2. %1 unmuted by %2. Unable to find matching CELT codecs with other clients. You will not be able to talk to all users. You were muted and deafened by %1. You were deafened by %1. You were kicked from the server by %1: %2. %3 was kicked from the server by %1: %2. You were kicked and banned from the server by %1: %2. %3 was kicked and banned from the server by %1: %2. You were moved to %1 by %2. %1 entered channel. Server connection rejected: %1. Denied: %1. %1 renamed to %2. %1 left channel and disconnected. Message from %1 You have User Dragging set to "Do Nothing" so the user wasn't moved. You have Channel Dragging set to "Do Nothing" so the channel wasn't moved. Unknown Channel Drag mode in UserModel::dropMimeData. Remote controlling Mumble: Usage: mumble [options] [<url>] <url> specifies a URL to connect to after startup instead of showing the connection window, and has the following form: mumble://[<username>[:<password>]@]<host>[:<port>][/<channel>[/<subchannel>...]][?version=<x.y.z>] The version query parameter has to be set in order to invoke the correct client version. It currently defaults to 1.2.0. Valid options are: -h, --help Show this help text and exit. -m, --multiple Allow multiple instances of the client to be started. -n, --noidentity Suppress loading of identity files (i.e., certificates.) -jn, --jackname Set custom Jack client name. --license Show the Mumble license. --authors Show the Mumble authors. --third-party-licenses Show licenses for third-party software used by Mumble. Usage: mumble rpc <action> [options] It is possible to remote control a running instance of Mumble by using the 'mumble rpc' command. Valid actions are: mute Mute self unmute Unmute self togglemute Toggle self-mute status deaf Deafen self undeaf Undeafen self toggledeaf Toggle self-deafen status Invocation Error: No RPC command specified RPC Welcome to Mumble. Skipping version check in debug mode. Hide Frame Toggle showing frame on minimal window This will toggle whether the minimal window should have a frame for moving and resizing. &Unlink All Reset the comment of the selected user. &Join Channel View comment in editor Query server for connection information for user S&erver &Self &Unlink Plugins Register yourself on the server Change your avatar image on this server &Remove Avatar Remove currently defined avatar image. Icon Toolbar Change your own comment Recording Priority Speaker &Copy URL Copies a link to this channel to the clipboard. Ignore Messages Locally ignore user's text chat messages. Silently drops all text messages from the user. Edit ban list on server This lets you edit the server-side IP ban list. &Filter on/off Toggle the channel filter (Ctrl+F) Enable or disable the filtering of select channels. By default all empty channels will be filtered. You can mark additional channels for filtering from the channel's context menu. Ctrl+F &Hide Channel when Filtering Reset the avatar of the selected user. Locally adjust the user's speech volume. Opens a dialog with a volume slider. Use this on other users in the same room. &Developer &Hide Mumble Hides the main Mumble window. Hides the main Mumble window. Restore by clicking on the tray icon or starting Mumble again. Show the Developer Console Shows the Mumble Developer Console, where Mumble's log output can be inspected. &Connect... &Ban list... &Information... &Kick... &Ban... Local Volume Adjustment... Send &Message... &Add... &Remove... &Edit... Audio S&tatistics... &Settings... &Audio Wizard... Developer &Console... &About... About &Speex... About &Qt... &Certificate Wizard... &Register... Registered &Users... Change &Avatar... &Access Tokens... Reset &Comment... Reset &Avatar... View Comment... &Change Comment... R&egister... Show Shows the main Mumble window. Manual Manual Mumble Positional Audio Position X Y Z m Heading Azimuth Elevation ° Meta data Context Identity Set State Linked Activated Unhinge NetworkConfig Network Updates are mandatory when using snapshot releases. Connection Use TCP compatibility mode Use TCP compatability mode <b>Enable TCP compatibility mode</b>.<br />This will make Mumble use only TCP when communicating with the server. This will increase overhead and cause lost packets to produce noticeable pauses in communication, so this should only be used if you are unable to use the default (which uses UDP for voice and TCP for control). Reconnect when disconnected <b>Reconnect when disconnected</b>.<br />This will make Mumble try to automatically reconnect after 10 seconds if your server connection fails. Reconnect automatically Proxy Type Type of proxy to connect through Direct connection HTTP(S) proxy SOCKS5 proxy Hostname Hostname of the proxy Force TCP mode Enable QoS to prioritize packets This will enable QoS, which will attempt to prioritize voice packets over other traffic. Use Quality of Service Don't send certificate to server and don't save passwords. (Not saved). <b>This will suppress identity information from the client.</b><p>The client will not identify itself with a certificate, even if defined, and will not cache passwords for connections. This is primarily a test-option and is not saved.</p> Suppress certificate and password storage <b>Type of proxy to connect through.</b><br />This makes Mumble connect through a proxy for all outgoing connections. Note: Proxy tunneling forces Mumble into TCP compatibility mode, causing all voice data to be sent via the control channel. <b>Hostname of the proxy.</b><br />This field specifies the hostname of the proxy you wish to tunnel network traffic through. Port Port number of the proxy <b>Port number of the proxy.</b><br />This field specifies the port number that the proxy expects connections on. Username Username for proxy authentication <b>Username for proxy authentication.</b><br />This specifies the username you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Password Password for proxy authentication <b>Password for proxy authentication.</b><br />This specifies the password you use for authenticating yourself with the proxy. In case the proxy does not use authentication, or you want to connect anonymously, simply leave this field blank. Mumble services Check for new releases of Mumble automatically. This will check for new releases of Mumble every time you start the program, and notify you if one is available. Check for application updates on startup Check for new releases of plugins automatically. This will check for new releases of plugins every time you start the program, and download them automatically. <b>Submit anonymous statistics.</b><br />Mumble has a small development team, and as such needs to focus its development where it is needed most. By submitting a bit of statistics you help the project determine where to focus development. Submit anonymous statistics to the Mumble project Submit anonymous statistics Reconnect to last used server when starting Mumble Reconnect to last server on startup Download plugin and overlay updates on startup Privacy Prevent OS information being sent to Mumble servers and web servers <b>Don't send OS information to servers</b><br/> Prevents the client from sending potentially identifying information about the operating system to the Mumble server and web servers. Do not send OS information to Mumble servers and web servers Overlay Silent Talking Whisper Shout Channel Failed to create communication with overlay at %2: %1. No overlay will be available. OverlayClient Filter Only talking Talking and recently active All in current channel All in linked channels Always show yourself Configure recently active time (%1 seconds)... Columns Sort Alphabetically Last state change Edit... Reset Zoom Configure recently active time Amount of seconds users remain active after talking: OverlayConfig To move the users, drag the little red dot. To resize the users, mouse wheel over a user. To resize the users, mousewheel over a user. For more options, right click a user. For more options, rightclick a user. Launcher Filter Overlay Choose executable Choose application Choose path Load Overlay Presets Mumble overlay presets (*.mumblelay) Save Overlay Presets Options Enable overlay. Enable Overlay This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start Mumble after starting the application, or if you disable the overlay while the application is running, there is no safe way to restart the overlay without also restarting the application. This sets whether the overlay is enabled or not. This setting is only checked when applications are started, so make sure Mumble is running and this option is on before you start the application.<br />Please note that if you start the application after starting Mumble, or if you disable the overlay while running, there is no safe way to restart the overlay without also restarting the application. Layout Blacklist Whitelist Uninstall Overlay Overlay Installation Mumble has detected that you do not have the Mumble Overlay installed. Click the button below to install the overlay. Install Mumble Overlay Overlay Upgrade Mumble has detected an old version of the overlay support files installed on your computer. To upgrade these files to their latest versions, click the button below. Upgrade Mumble Overlay Display a frame counter in the overlay Show FPS counter Load an overlay preset from file Load… Save your overlay settings to file Save… Set the overlay font. Set the overlay text color. Color Remove Font FPS and Clock Display Display a clock in the overlay showing the current local time (system time). Show Clock Overlay Exceptions Overlay Exception Mode Allowed launchers Add Allowed programs Allowed paths Blacklisted programs OverlayEditor State User is not talking Passive User is talking in your channel or a linked channel Talking User is whispering to you privately Private Whisper User is shouting to your channel Channel Whisper Zoom Zoom Factor Enabled Elements User avatar, chosen by each user Avatar User's name Username Name of user's channel, if outside your current channel Channel Muted or deafened Mute state Bounding box, automatically shrunk to minimum size to contain all visible elements Bounding box Overlay Editor OverlayEditorScene Layout preset Large square avatar Avatar and Name User Opacity %1% Object Opacity Alignment Left Center Right Top Bottom Color... Font... Bounding box Pen width Padding Pen color Fill color Pick pen color Pick fill color Pick color Pick font PluginConfig Plugins Plugin has no configure function. Plugin has no about function. Options Enable plugins and transmit positional information This allows plugins for supported games to fetch your in-game position and transmit it with each voice packet. This enables other users to hear your voice in-game from the direction your character is in relation to their own. Link to Game and Transmit Position Reloads all plugins This rescans and reloads plugins. Use this if you just added or changed a plugin to the plugins directory. &Reload plugins Information about plugin This shows a small information message about the plugin. &About Show configuration page of plugin This shows the configuration page of the plugin, if any. &Configure Name Enabled Plugins Skipping plugin update in debug mode. Downloaded new or updated plugin to %1. Failed to install new plugin to %1. %1 lost link. %1 linked. PortAudioSystem Default Device PulseAudioSystem Default Input Default Output QApplication Failed to restart mumble Mumble failed to restart itself. Please restart it manually. RichTextEditor Failed to load image Image file too large to embed in document. Please use images smaller than %1 kB. Message is too long. Display Source Text &Bold Ctrl+B &Italic Italic Ctrl+I Underline Ctrl+U Color Insert Link Ctrl+L Insert Image RichTextEditorLink Add Link URL Text ServerHandler Unable to resolve hostname Server is not responding to TCP pings UDP packets cannot be sent to or received from the server. Switching to TCP mode. UDP packets cannot be sent to the server. Switching to TCP mode. UDP packets cannot be received from the server. Switching to TCP mode. UDP packets can be sent to and received from the server. Switching back to UDP mode. Connection timed out ServerView Favorite LAN Public Internet Unknown Africa Asia North America South America Europe Oceania ShortcutActionWidget Unassigned ShortcutDelegate On Off Toggle Unassigned ShortcutKeyWidget Press Shortcut ShortcutTargetDialog Root Parent Current Subchannel #%1 ShortcutTargetWidget ... , Root Parent Current Subchannel #%1 Invalid Empty <Empty> ShortcutToggleWidget Off Toggle On TextMessage Enter text If checked the message is recursively sent to all subchannels Send recursively to subchannels Tokens Empty Token Mumble - Access Tokens List of access tokens on current server <b>This is an editable list of access tokens on the connected server.</b> <br /> An access token is a text string, which can be used as a password for very simple access management on channels. Mumble will remember the tokens you've used and resend them to the server next time you reconnect, so you don't have to enter these every time. Add a token &Add Remove a token &Remove UserEdit Registered Users Remove Rename Who are you looking for? Days Weeks Months Years Inactive for Registered users: %n account(s) UserInformation User Information Connection Information Version OS Certificate IP Address CELT Versions Details... Ping Statistics Pings received Average ping TCP (Control) UDP (Voice) UDP Network statistics Good Late Lost Resync From Client To Client Connection time %1w %1d %1h %1m %1s , %1 (%2) %1.%2.%3 (%4) Supported Not Supported Not Reported %1 online (%2 idle) %1 online %1 kbit/s Bandwidth GroupBox Bandwidth Label Ping deviation UserListModel Nick Inactive days Last channel Last seen: %1 Never Channel ID: %1 UserLocalVolumeDialog Local volume for other users <b>Adjust the volume of other users locally</b><br />Mumble supports adjusting the volume of other users locally. Adjusting local volume for %1 dB <html><head/><body><p>Use the slider or the text box to change the volume of the user.</p><p><span style="font-weight:600;">Attention!</span></p><p>Increasing the volume of a user too much can permanently damage your hearing. It may also increase the background noise of the user.</p></body></html> UserModel This is a user connected to the server. The icon to the left of the user indicates whether or not they are talking: Talking to your channel. Shouting directly to your channel. Whispering directly to your channel. Whispering directly to you. Not talking. This is a channel on the server. The icon indicates the state of the channel: Your current channel. A channel that is linked with your channel. Linked channels can talk to each other. A channel on the server that you are not linked to. This shows the flags the user has on the server, if any: On your friend list Authenticated user Muted (manually muted by self) Muted (manually muted by admin) Muted (not allowed to speak in current channel) Muted (muted by you, only on your machine) Muted (push-to-mute) Deafened (by self) Deafened (by admin) User has a new comment set (click to show) User has a comment set, which you've already seen. (click to show) Ignoring Text Messages This shows the flags the channel has, if any: Channel has a new comment set (click to show) Channel has a comment set, which you've already seen. (click to show) Channel will be hidden when filtering is enabled Name Flags Are you sure you want to drag this user? Are you sure you want to drag this channel? Cannot perform this movement automatically, please reset the numeric sorting indicators or adjust it manually. VersionCheck Upgrade Mumble A new version of Mumble has been detected and automatically downloaded. It is recommended that you either upgrade to this version, or downgrade to the latest stable release. Do you want to launch the installer now? Failed to launch snapshot installer. Corrupt download of new version detected. Automatically removed. Downloading new snapshot from %1 to %2 Failed to write new version to disk. Failed to write new version to disc. Mumble failed to retrieve version information from the central server. ViewCert Certificate Chain Details Certificate chain Certificate details Common Name Organization Subunit Country Locality State Valid from: %1 Valid to: %1 Serial: %1 Public Key: %1 bits %2 RSA DSA Digest (SHA-1): %1 Digest (SHA-256): %1 Email: %1 DNS: %1 Issued by: Unit Name VoiceRecorder Recorder failed to create directory '%1' Recorder failed to open file '%1' .wav - Uncompressed .ogg (Vorbis) - Compressed .au - Uncompressed .flac - Lossless compressed VoiceRecorderDialog Recorder Control 00:00:00 &Start S&top Mode Multichannel Output Output format Target directory Filename &Browse... Valid variables are: Inserts the user's name Inserts the current date Inserts the current time Inserts the hostname Recorder still running Closing the recorder without stopping it will discard unwritten audio. Do you really want to close the recorder? Unable to start recording. Not connected to a server. The server you are currently connected to is version 1.2.2 or older. For privacy reasons, recording on servers of versions older than 1.2.3 is not possible. Please contact your server administrator for further information. There is already a recorder active for this server. Please select a recording format. Stopping Select target directory Downmix WASAPIInput Access to the microphone was denied. Please check that your operating system's microphone settings allow Mumble to use the microphone. WASAPISystem Default Device qwPTTButtonWidget Mumble PTT Push to talk mumble-1.3.4/src/mumble/BanEditor.h0000664000175000017500000000222414010707273016731 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_BANEDITOR_H_ #define MUMBLE_MUMBLE_BANEDITOR_H_ #include "Ban.h" #include "ui_BanEditor.h" namespace MumbleProto { class BanList; } class BanEditor : public QDialog, public Ui::BanEditor { private: Q_OBJECT Q_DISABLE_COPY(BanEditor) protected: QList qlBans; int maskDefaultValue; Ban toBan(bool &); public: BanEditor(const MumbleProto::BanList &msbl, QWidget *p = NULL); public slots: void accept(); void on_qlwBans_currentRowChanged(); void on_qpbAdd_clicked(); void on_qpbUpdate_clicked(); void on_qpbRemove_clicked(); void refreshBanList(); void on_qdteEnd_editingFinished(); void on_qpbClear_clicked(); private slots: void on_qleHash_textChanged(QString ); void on_qleSearch_textChanged(const QString & match); void on_qleReason_textChanged(QString ); void on_qleIP_textChanged(QString ); void on_qleUser_textChanged(QString ); }; #endif mumble-1.3.4/src/mumble/ManualPlugin.cpp0000664000175000017500000001742214010707273020017 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #define _USE_MATH_DEFINES #include #include #if QT_VERSION >= 0x050000 # include #else # include #endif #include #include "ManualPlugin.h" #include "ui_ManualPlugin.h" #include #include "../../plugins/mumble_plugin.h" static QPointer mDlg = NULL; static bool bLinkable = false; static bool bActive = true; static int iAzimuth = 180; static int iElevation = 0; static const QString defaultContext = QString::fromLatin1("Mumble"); static const QString defaultIdentity = QString::fromLatin1("Agent47"); static struct { float avatar_pos[3]; float avatar_front[3]; float avatar_top[3]; float camera_pos[3]; float camera_front[3]; float camera_top[3]; std::string context; std::wstring identity; } my = {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, std::string(), std::wstring() }; Manual::Manual(QWidget *p) : QDialog(p) { setupUi(this); qgvPosition->viewport()->installEventFilter(this); qgvPosition->scale(1.0f, 1.0f); qgsScene = new QGraphicsScene(QRectF(-5.0f, -5.0f, 10.0f, 10.0f), this); const float indicatorDiameter = 4.0f; QPainterPath indicator; // The center of the indicator's circle will represent the current position indicator.addEllipse(QRectF(-indicatorDiameter / 2, -indicatorDiameter / 2, indicatorDiameter, indicatorDiameter)); // A line will indicate the indicator's orientation (azimuth) indicator.moveTo(0, indicatorDiameter / 2); indicator.lineTo(0, indicatorDiameter); qgiPosition = qgsScene->addPath(indicator); qgvPosition->setScene(qgsScene); qgvPosition->fitInView(-5.0f, -5.0f, 10.0f, 10.0f, Qt::KeepAspectRatio); qdsbX->setRange(-FLT_MAX, FLT_MAX); qdsbY->setRange(-FLT_MAX, FLT_MAX); qdsbZ->setRange(-FLT_MAX, FLT_MAX); qdsbX->setValue(my.avatar_pos[0]); qdsbY->setValue(my.avatar_pos[1]); qdsbZ->setValue(my.avatar_pos[2]); qpbActivated->setChecked(bActive); qpbLinked->setChecked(bLinkable); qsbAzimuth->setValue(iAzimuth); qsbElevation->setValue(iElevation); updateTopAndFront(iAzimuth, iElevation); // Set context and identity to default values in order to // a) make positional audio work out of the box (needs a context) // b) make the user aware of what each field might contain qleContext->setText(defaultContext); qleIdentity->setText(defaultIdentity); my.context = defaultContext.toStdString(); my.identity = defaultIdentity.toStdWString(); } bool Manual::eventFilter(QObject *obj, QEvent *evt) { if ((evt->type() == QEvent::MouseButtonPress) || (evt->type() == QEvent::MouseMove)) { QMouseEvent *qme = dynamic_cast(evt); if (qme) { if (qme->buttons() & Qt::LeftButton) { QPointF qpf = qgvPosition->mapToScene(qme->pos()); qdsbX->setValue(qpf.x()); qdsbZ->setValue(-qpf.y()); qgiPosition->setPos(qpf); } } } return QDialog::eventFilter(obj, evt); } void Manual::changeEvent(QEvent *e) { QDialog::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: retranslateUi(this); break; default: break; } } void Manual::on_qpbUnhinge_pressed() { qpbUnhinge->setEnabled(false); mDlg->setParent(NULL); mDlg->show(); } void Manual::on_qpbLinked_clicked(bool b) { bLinkable = b; } void Manual::on_qpbActivated_clicked(bool b) { bActive = b; } void Manual::on_qdsbX_valueChanged(double d) { my.avatar_pos[0] = my.camera_pos[0] = static_cast(d); qgiPosition->setPos(my.avatar_pos[0], -my.avatar_pos[2]); } void Manual::on_qdsbY_valueChanged(double d) { my.avatar_pos[1] = my.camera_pos[1] = static_cast(d); } void Manual::on_qdsbZ_valueChanged(double d) { my.avatar_pos[2] = my.camera_pos[2] = static_cast(d); qgiPosition->setPos(my.avatar_pos[0], -my.avatar_pos[2]); } void Manual::on_qsbAzimuth_valueChanged(int i) { if (i > 360) qdAzimuth->setValue(i % 360); else qdAzimuth->setValue(i); updateTopAndFront(i, qsbElevation->value()); } void Manual::on_qsbElevation_valueChanged(int i) { qdElevation->setValue(90 - i); updateTopAndFront(qsbAzimuth->value(), i); } void Manual::on_qdAzimuth_valueChanged(int i) { if (i < 0) qsbAzimuth->setValue(360 + i); else qsbAzimuth->setValue(i); } void Manual::on_qdElevation_valueChanged(int i) { if (i < -90) qdElevation->setValue(180); else if (i < 0) qdElevation->setValue(0); else qsbElevation->setValue(90 - i); } void Manual::on_qleContext_editingFinished() { my.context = qleContext->text().toStdString(); } void Manual::on_qleIdentity_editingFinished() { my.identity = qleIdentity->text().toStdWString(); } void Manual::on_buttonBox_clicked(QAbstractButton *button) { if (buttonBox->buttonRole(button) == buttonBox->ResetRole) { qpbLinked->setChecked(false); qpbActivated->setChecked(true); bLinkable = false; bActive = true; qdsbX->setValue(0); qdsbY->setValue(0); qdsbZ->setValue(0); qleContext->clear(); qleIdentity->clear(); qsbElevation->setValue(0); qsbAzimuth->setValue(0); } } void Manual::updateTopAndFront(int azimuth, int elevation) { iAzimuth = azimuth; iElevation = elevation; qgiPosition->setRotation(azimuth); double azim = azimuth * M_PI / 180.; double elev = elevation * M_PI / 180.; my.avatar_front[0] = static_cast(cos(elev) * sin(azim)); my.avatar_front[1] = static_cast(sin(elev)); my.avatar_front[2] = static_cast(cos(elev) * cos(azim)); my.avatar_top[0] = static_cast(-sin(elev) * sin(azim)); my.avatar_top[1] = static_cast(cos(elev)); my.avatar_top[2] = static_cast(-sin(elev) * cos(azim)); memcpy(my.camera_top, my.avatar_top, sizeof(float) * 3); memcpy(my.camera_front, my.avatar_front, sizeof(float) * 3); } static int trylock() { return bLinkable; } static void unlock() { if (mDlg) { mDlg->qpbLinked->setChecked(false); } bLinkable = false; } static void config(void *ptr) { QWidget *w = reinterpret_cast(ptr); if (mDlg) { mDlg->setParent(w, Qt::Dialog); mDlg->qpbUnhinge->setEnabled(true); } else { mDlg = new Manual(w); } mDlg->show(); } static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &context, std::wstring &identity) { if (!bLinkable) return false; if (!bActive) { memset(avatar_pos, 0, sizeof(float)*3); memset(camera_pos, 0, sizeof(float)*3); return true; } memcpy(avatar_pos, my.avatar_pos, sizeof(float)*3); memcpy(avatar_front, my.avatar_front, sizeof(float)*3); memcpy(avatar_top, my.avatar_top, sizeof(float)*3); memcpy(camera_pos, my.camera_pos, sizeof(float)*3); memcpy(camera_front, my.camera_front, sizeof(float)*3); memcpy(camera_top, my.camera_top, sizeof(float)*3); context.assign(my.context); identity.assign(my.identity); return true; } static const std::wstring longdesc() { return std::wstring(L"This is the manual placement plugin. It allows you to place yourself manually."); } static std::wstring description(L"Manual placement plugin"); static std::wstring shortname(L"Manual placement"); static void about(void *ptr) { QWidget *w = reinterpret_cast(ptr); QMessageBox::about( w, QString::fromStdWString(description), QString::fromStdWString(longdesc()) ); } static MumblePlugin manual = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, // About is handled by MumblePluginQt NULL, // Config is handled by MumblePluginQt trylock, unlock, longdesc, fetch }; static MumblePluginQt manualqt = { MUMBLE_PLUGIN_MAGIC_QT, about, config }; MumblePlugin *ManualPlugin_getMumblePlugin() { return &manual; } MumblePluginQt *ManualPlugin_getMumblePluginQt() { return &manualqt; } mumble-1.3.4/src/mumble/OverlayEditor.cpp0000664000175000017500000001011114010707273020177 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_pch.hpp" #include "OverlayEditor.h" #include "OverlayClient.h" #include "OverlayText.h" #include "User.h" #include "Channel.h" #include "Message.h" #include "Database.h" #include "NetworkConfig.h" #include "ServerHandler.h" #include "MainWindow.h" #include "GlobalShortcut.h" // We define a global macro called 'g'. This can lead to issues when included code uses 'g' as a type or parameter name (like protobuf 3.7 does). As such, for now, we have to make this our last include. #include "Global.h" OverlayEditor::OverlayEditor(QWidget *p, QGraphicsItem *qgi, OverlaySettings *osptr) : QDialog(p), qgiPromote(qgi), oes(g.s.os) { setupUi(this); os = osptr ? osptr : &g.s.os; connect(qdbbBox->button(QDialogButtonBox::Apply), SIGNAL(clicked()), this, SLOT(apply())); connect(qdbbBox->button(QDialogButtonBox::Reset), SIGNAL(clicked()), this, SLOT(reset())); QGraphicsProxyWidget *qgpw = graphicsProxyWidget(); if (qgpw) { qgpw->setFlag(QGraphicsItem::ItemIgnoresParentOpacity); if (g.ocIntercept) { qgpw->setPos(iroundf(static_cast(g.ocIntercept->uiWidth) / 16.0f + 0.5f), iroundf(static_cast(g.ocIntercept->uiHeight) / 16.0f + 0.5f)); qgpw->resize(iroundf(static_cast(g.ocIntercept->uiWidth) * 14.0f / 16.0f + 0.5f), iroundf(static_cast(g.ocIntercept->uiHeight) * 14.0f / 16.0f + 0.5f)); } } qgvView->setScene(&oes); reset(); } OverlayEditor::~OverlayEditor() { QGraphicsProxyWidget *qgpw = g.mw->graphicsProxyWidget(); if (qgpw) qgpw->setOpacity(0.9f); if (qgiPromote) qgiPromote->setZValue(-1.0f); } void OverlayEditor::enterEvent(QEvent *e) { QGraphicsProxyWidget *qgpw = g.mw->graphicsProxyWidget(); if (qgpw) qgpw->setOpacity(0.9f); qgpw = graphicsProxyWidget(); if (qgpw) qgpw->setOpacity(1.0f); if (qgiPromote) qgiPromote->setZValue(-1.0f); QDialog::enterEvent(e); } void OverlayEditor::leaveEvent(QEvent *e) { QGraphicsProxyWidget *qgpw = g.mw->graphicsProxyWidget(); if (qgpw) qgpw->setOpacity(0.3f); qgpw = graphicsProxyWidget(); if (qgpw) qgpw->setOpacity(0.3f); if (qgiPromote) qgiPromote->setZValue(1.0f); QDialog::leaveEvent(e); } void OverlayEditor::reset() { oes.os = *os; oes.resync(); qcbAvatar->setChecked(oes.os.bAvatar); qcbUser->setChecked(oes.os.bUserName); qcbChannel->setChecked(oes.os.bChannel); qcbMutedDeafened->setChecked(oes.os.bMutedDeafened); qcbBox->setChecked(oes.os.bBox); } void OverlayEditor::apply() { *os = oes.os; emit applySettings(); } void OverlayEditor::accept() { apply(); QDialog::accept(); } void OverlayEditor::on_qrbPassive_clicked() { oes.tsColor = Settings::Passive; oes.resync(); } void OverlayEditor::on_qrbTalking_clicked() { oes.tsColor = Settings::Talking; oes.resync(); } void OverlayEditor::on_qrbWhisper_clicked() { oes.tsColor = Settings::Whispering; oes.resync(); } void OverlayEditor::on_qrbShout_clicked() { oes.tsColor = Settings::Shouting; oes.resync(); } void OverlayEditor::on_qcbAvatar_clicked() { oes.os.bAvatar = qcbAvatar->isChecked(); if (! oes.os.bAvatar && ! oes.os.bUserName) { qcbUser->setChecked(true); oes.os.bUserName = true; oes.updateUserName(); } oes.updateAvatar(); } void OverlayEditor::on_qcbUser_clicked() { oes.os.bUserName = qcbUser->isChecked(); if (! oes.os.bAvatar && ! oes.os.bUserName) { qcbAvatar->setChecked(true); oes.os.bAvatar = true; oes.updateAvatar(); } oes.updateUserName(); } void OverlayEditor::on_qcbChannel_clicked() { oes.os.bChannel = qcbChannel->isChecked(); oes.updateChannel(); } void OverlayEditor::on_qcbMutedDeafened_clicked() { oes.os.bMutedDeafened = qcbMutedDeafened->isChecked(); oes.updateMuted(); } void OverlayEditor::on_qcbBox_clicked() { oes.os.bBox = qcbBox->isChecked(); oes.moveBox(); } void OverlayEditor::on_qsZoom_valueChanged(int zoom) { oes.uiZoom = zoom; oes.resync(); } mumble-1.3.4/src/licenses.h0000664000175000017500000113717614010707273015426 0ustar builderbuilder/* * This file was auto-generated by scripts/mklic.pl * DO NOT EDIT IT MANUALLY */ #ifndef MUMBLE_LICENSES_H_ #define MUMBLE_LICENSES_H_ #include struct ThirdPartyLicense { const char* name; const char* url; const char* license; ThirdPartyLicense() : name(0), url(0), license(0) {} ThirdPartyLicense(const char* name_, const char* url_, const char* license_) : name(name_), url(url_), license(license_) {} bool isEmpty() const { return (name == 0 && url == 0 && license == 0); } }; static const char *licenseMumble = "Copyright (C) 2005-2019 The Mumble Developers\n" "\n" "A list of The Mumble Developers can be found in the\n" "AUTHORS file at the root of the Mumble source tree\n" "or at .\n" "\n" "All rights reserved.\n" "\n" "Redistribution and use in source and binary forms, with or without\n" "modification, are permitted provided that the following conditions\n" "are met:\n" "\n" "- Redistributions of source code must retain the above copyright notice,\n" " this list of conditions and the following disclaimer.\n" "- Redistributions in binary form must reproduce the above copyright notice,\n" " this list of conditions and the following disclaimer in the documentation\n" " and/or other materials provided with the distribution.\n" "- Neither the name of The Mumble Developers nor the names of its\n" " contributors may be used to endorse or promote products derived from this\n" " software without specific prior written permission.\n" "\n" "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n" "`AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n" "LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n" "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR\n" "CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n" "EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n" "PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n" "PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n" "LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n" "NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n" "SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" "\n" "For questions and inquiries about Mumble's license,\n" "please contact ."; static const char *authorsMumble = "// This is the official list of people who have contributed\n" "// to, and/or hold the copyright to Mumble.\n" "//\n" "// The use of Mumble source code is governed by a BSD-style\n" "// license that can be found in the LICENSE file at the root\n" "// of the Mumble source tree or at .\n" "//\n" "// Contributions made on behalf of another entity, such as a\n" "// company are indicated with the following suffix:\n" "//\n" "// John Doe (on behalf of $COMPANY)\n" "//\n" "// It is possible to mix individual contributions with company\n" "// contributions. For example, if a contributor, over time,\n" "// has contributed code copyrighted by the contributor, as well\n" "// as various companies:\n" "//\n" "// John Doe (individually, on behalf of\n" "// $COMPANY1, on behalf of\n" "// $COMPANY2, [...]).\n" "//\n" "// Mumble's code is developed in a Git repository. A log of\n" "// every contribution ever made to Mumble is available in the\n" "// Git repository. The Git repository can be queried to get\n" "// detailed authorship information for copyright and attribution\n" "// purposes for each file that makes up the software. A detailed\n" "// analysis of contributions made to Mumble is available via GitHub's\n" "// contribution statistics:\n" "//\n" "// \n" "\n" "Abex \n" "Alex Krishnan \n" "Alex Maclean \n" "Allan Nordhøy \n" "Álvaro Manuel Recio Pérez \n" "Andreas Bibok \n" "Andreas Messer \n" "Andreas Sinz \n" "Andrew Johnson \n" "anonym \n" "Anthony Alves \n" "Antoine Bertin \n" "Anton Romanov \n" "Antonio Larrosa \n" "Arie \n" "Arne Fenske \n" "arrai \n" "Arseniy Lartsev \n" "Artem Vorotnikov \n" "Arthur Moore \n" "asmolero \n" "Asura Lee \n" "B0nuse \n" "Balazs Nagy \n" "Bartek \"stranded\" Sumowski \n" "Bas Wijnen \n" "BAYSSE Laurent \n" "bendem \n" "Benjamin Jemlich \n" "Benjamin Neff \n" "Bernhard M. Wiedemann \n" "bogie \n" "Bojan \n" "brooss \n" "BuddyButterfly \n" "Cesare Tirabassi \n" "Charles Ricketts \n" "Chosi \n" "Christian Krause \n" "Christoph Hofmann \n" "Christopher Knadle \n" "concatime \n" "Cristian Gattamelati \n" "d-rez \n" "Davide Beatrici \n" "Davide Beatrici \n" "davidebeatrici \n" "dc6jgk \n" "dennisschagt \n" "derandi \n" "Derrick Dymock \n" "DK \n" "DNW \n" "doggone \n" "DWM|G \n" "EarlOfWenc \n" "Eli Tallman \n" "Entitaet \n" "Erik Bouvin Pedersen \n" "Evan Purkhiser \n" "Ferdinand Thiessen \n" "Filip Hedman \n" "Finessi Manuel \n" "Flumble \n" "Frank Engler \n" "Frank Mueller \n" "Fredrik Nordin \n" "Friedrich Uz-Valentin \n" "Generator \n" "GoD-Tony \n" "Harry Gabriel \n" "haru_arc \n" "He Tal \n" "Hengqing Hu \n" "Henry Fallon \n" "Iain Georgeson \n" "Ilmar Kruis \n" "Imre Botos \n" "Jacob Peddicord \n" "Jakob Dettner \n" "James Fraser \n" "Jan Braun \n" "Jan Klass \n" "javitonino \n" "Jeff Rogers \n" "Jérôme \"buggerone\" \n" "Jerome Vidal \n" "jgeboski \n" "Joel Kees \n" "Joël Troch \n" "John Marion \n" "John P \n" "Jonathan E. Hansen \n" "Jordan Cristiano \n" "Jordan Klassen \n" "Joshua Kocinski \n" "Julien Pardons \n" "Justin M \n" "Justin McGrath \n" "Karl Dietz \n" "karokatona \n" "Kevin Rohland \n" "Kevin Strasser \n" "Kjetil Jørgensen \n" "Kyle Smith \n" "Kyle Wickens \n" "Lari Tikkanen \n" "Lartza \n" "Lekensteyn \n" "Leszek Godlewski \n" "lewisca04 \n" "Ludwig Nussel \n" "Lukas Orsvärn \n" "Luke A Pitt \n" "main() \n" "Marc Deslauriers \n" "Marius Grannæs \n" "Mark Felder \n" "Mark Schreiber \n" "Mark-Willem Jansen \n" "Markus S \n" "Martijn Stolk \n" "Martin Skilnand \n" "Martin von Gagern \n" "Matt Hamilton \n" "Matt Lewandowsky \n" "Matt M. \n" "Matthias Mailänder \n" "Matthias Salzeder \n" "Matthias Vogelgesang \n" "Max Weber \n" "Maxwell Cody \n" "meanracoon \n" "Mew \n" "Micah Caldwell \n" "Michael Pavlyshko \n" "Michael Ziegler \n" "Michał \"Zuko\" Żukowski \n" "Mike \n" "Mikkel Krautz \n" "Mikko Rantanen \n" "mray \n" "mystic_sam \n" "Natenom \n" "Nick Heindl \n" "Nicos Gollan \n" "Nik Johnson \n" "Nikita Puzyryov \n" "Nikolaj Dombrow \n" "nomad \n" "Opalium \n" "Otto Allmendinger \n" "ozon \n" "Patrick Matthäi \n" "Peter Vágner \n" "Phil \n" "Philip Cass \n" "Phrag \n" "Piratonym \n" "Prosper_Spurius \n" "QuirB \n" "qwestduck \n" "Rafael Correia \n" "Rafael Lopez \n" "rdb \n" "Roman Priesol \n" "ronoc \n" "Ryan Austin \n" "Sami Laine \n" "Samuel D. Leslie \n" "scapula \n" "Sebastian Schlingmann \n" "Semion Tsinman \n" "Sergey Ivanov \n" "Shen-Ta Hsieh \n" "Spaccaossi \n" "spede \n" "Stefan Gehn \n" "Stefan Hacker \n" "Steve Hill \n" "Steven Noonan \n" "Sven-Hendrik Haase \n" "Svenne33 \n" "Svyatoslav \n" "synapse84 \n" "Thibault Capdevielled \n" "Thibaut Girka\n" "Thorvald Natvig \n" "Tim Burke \n" "Tim Cooper \n" "Tim Visée \n" "Timo Gurr \n" "Timo K \n" "tkmorris \n" "Tristan Matthews \n" "Tsbook \n" "Wesley W. Terpstra \n" "Will Tange \n" "withgod \n" "x89 \n" "zapman\n" "zeroX-tj \n" "Zorg \n" "\n" "// Special thanks to:\n" "//\n" "// Thorvald Natvig, for founding the Mumble project\n" "// and maintaining it during its formative years."; static const char *licenseCELT = "Copyright 2001-2009 Jean-Marc Valin, Timothy B. Terriberry,\n" " CSIRO, and other contributors\n" "\n" "Redistribution and use in source and binary forms, with or without\n" "modification, are permitted provided that the following conditions\n" "are met:\n" "\n" "- Redistributions of source code must retain the above copyright\n" "notice, this list of conditions and the following disclaimer.\n" "\n" "- Redistributions in binary form must reproduce the above copyright\n" "notice, this list of conditions and the following disclaimer in the\n" "documentation and/or other materials provided with the distribution.\n" "\n" "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n" "``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n" "LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n" "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR\n" "CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n" "EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n" "PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n" "PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n" "LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n" "NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n" "SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."; static const char *licenseOpus = "Copyright 2001-2011 Xiph.Org, Skype Limited, Octasic,\n" " Jean-Marc Valin, Timothy B. Terriberry,\n" " CSIRO, Gregory Maxwell, Mark Borgerding,\n" " Erik de Castro Lopo\n" "\n" "Redistribution and use in source and binary forms, with or without\n" "modification, are permitted provided that the following conditions\n" "are met:\n" "\n" "- Redistributions of source code must retain the above copyright\n" "notice, this list of conditions and the following disclaimer.\n" "\n" "- Redistributions in binary form must reproduce the above copyright\n" "notice, this list of conditions and the following disclaimer in the\n" "documentation and/or other materials provided with the distribution.\n" "\n" "- Neither the name of Internet Society, IETF or IETF Trust, nor the\n" "names of specific contributors, may be used to endorse or promote\n" "products derived from this software without specific prior written\n" "permission.\n" "\n" "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n" "``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n" "LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n" "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER\n" "OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n" "EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n" "PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n" "PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n" "LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n" "NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n" "SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" "\n" "Opus is subject to the royalty-free patent licenses which are\n" "specified at:\n" "\n" "Xiph.Org Foundation:\n" "https://datatracker.ietf.org/ipr/1524/\n" "\n" "Microsoft Corporation:\n" "https://datatracker.ietf.org/ipr/1914/\n" "\n" "Broadcom Corporation:\n" "https://datatracker.ietf.org/ipr/1526/"; static const char *licenseSPEEX = "Copyright 2002-2008 Xiph.org Foundation\n" "Copyright 2002-2008 Jean-Marc Valin\n" "Copyright 2005-2007 Analog Devices Inc.\n" "Copyright 2005-2008 Commonwealth Scientific and Industrial Research \n" " Organisation (CSIRO)\n" "Copyright 1993, 2002, 2006 David Rowe\n" "Copyright 2003 EpicGames\n" "Copyright 1992-1994 Jutta Degener, Carsten Bormann\n" "\n" "Redistribution and use in source and binary forms, with or without\n" "modification, are permitted provided that the following conditions\n" "are met:\n" "\n" "- Redistributions of source code must retain the above copyright\n" "notice, this list of conditions and the following disclaimer.\n" "\n" "- Redistributions in binary form must reproduce the above copyright\n" "notice, this list of conditions and the following disclaimer in the\n" "documentation and/or other materials provided with the distribution.\n" "\n" "- Neither the name of the Xiph.org Foundation nor the names of its\n" "contributors may be used to endorse or promote products derived from\n" "this software without specific prior written permission.\n" "\n" "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n" "``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n" "LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n" "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR\n" "CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n" "EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n" "PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n" "PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n" "LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n" "NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n" "SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."; static const char *licenseOpenSSL = "====================================================================\n" "Copyright (c) 1998-2016 The OpenSSL Project. All rights reserved.\n" "\n" "Redistribution and use in source and binary forms, with or without\n" "modification, are permitted provided that the following conditions\n" "are met:\n" "\n" "1. Redistributions of source code must retain the above copyright\n" " notice, this list of conditions and the following disclaimer. \n" "\n" "2. Redistributions in binary form must reproduce the above copyright\n" " notice, this list of conditions and the following disclaimer in\n" " the documentation and/or other materials provided with the\n" " distribution.\n" "\n" "3. All advertising materials mentioning features or use of this\n" " software must display the following acknowledgment:\n" " \"This product includes software developed by the OpenSSL Project\n" " for use in the OpenSSL Toolkit. (http://www.openssl.org/)\"\n" "\n" "4. The names \"OpenSSL Toolkit\" and \"OpenSSL Project\" must not be used to\n" " endorse or promote products derived from this software without\n" " prior written permission. For written permission, please contact\n" " openssl-core@openssl.org.\n" "\n" "5. Products derived from this software may not be called \"OpenSSL\"\n" " nor may \"OpenSSL\" appear in their names without prior written\n" " permission of the OpenSSL Project.\n" "\n" "6. Redistributions of any form whatsoever must retain the following\n" " acknowledgment:\n" " \"This product includes software developed by the OpenSSL Project\n" " for use in the OpenSSL Toolkit (http://www.openssl.org/)\"\n" "\n" "THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY\n" "EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n" "IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n" "PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR\n" "ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n" "SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n" "NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n" "LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n" "HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\n" "STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n" "ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n" "OF THE POSSIBILITY OF SUCH DAMAGE.\n" "====================================================================\n" "\n" "This product includes cryptographic software written by Eric Young\n" "(eay@cryptsoft.com). This product includes software written by Tim\n" "Hudson (tjh@cryptsoft.com).\n" "\n" "Original SSLeay License\n" "-----------------------\n" "\n" "Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)\n" "All rights reserved.\n" "\n" "This package is an SSL implementation written\n" "by Eric Young (eay@cryptsoft.com).\n" "The implementation was written so as to conform with Netscapes SSL.\n" "\n" "This library is free for commercial and non-commercial use as long as\n" "the following conditions are aheared to. The following conditions\n" "apply to all code found in this distribution, be it the RC4, RSA,\n" "lhash, DES, etc., code; not just the SSL code. The SSL documentation\n" "included with this distribution is covered by the same copyright terms\n" "except that the holder is Tim Hudson (tjh@cryptsoft.com).\n" "\n" "Copyright remains Eric Young's, and as such any Copyright notices in\n" "the code are not to be removed.\n" "If this package is used in a product, Eric Young should be given attribution\n" "as the author of the parts of the library used.\n" "This can be in the form of a textual message at program startup or\n" "in documentation (online or textual) provided with the package.\n" "\n" "Redistribution and use in source and binary forms, with or without\n" "modification, are permitted provided that the following conditions\n" "are met:\n" "1. Redistributions of source code must retain the copyright\n" " notice, this list of conditions and the following disclaimer.\n" "2. Redistributions in binary form must reproduce the above copyright\n" " notice, this list of conditions and the following disclaimer in the\n" " documentation and/or other materials provided with the distribution.\n" "3. All advertising materials mentioning features or use of this software\n" " must display the following acknowledgement:\n" " \"This product includes cryptographic software written by\n" " Eric Young (eay@cryptsoft.com)\"\n" " The word 'cryptographic' can be left out if the rouines from the library\n" " being used are not cryptographic related :-).\n" "4. If you include any Windows specific code (or a derivative thereof) from \n" " the apps directory (application code) you must include an acknowledgement:\n" " \"This product includes software written by Tim Hudson (tjh@cryptsoft.com)\"\n" "\n" "THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND\n" "ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n" "IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n" "ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n" "FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n" "DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n" "OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n" "HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n" "LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n" "OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n" "SUCH DAMAGE.\n" "\n" "The licence and distribution terms for any publically available version or\n" "derivative of this code cannot be changed. i.e. this code cannot simply be\n" "copied and put under another distribution licence\n" "[including the GNU Public Licence.]"; static const char *licenseLibsndfile = "Copyright (C) 1999-2011 Erik de Castro Lopo \n" "\n" "This program is free software; you can redistribute it and/or modify\n" "it under the terms of the GNU Lesser General Public License as published by\n" "the Free Software Foundation; either version 2.1 of the License, or\n" "(at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" "GNU Lesser General Public License for more details.\n" "\n" "You should have received a copy of the GNU Lesser General Public License\n" "along with this program; if not, write to the Free Software\n" "Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA."; static const char *licenseOgg = "Copyright (c) 2002, Xiph.org Foundation\n" "\n" "Redistribution and use in source and binary forms, with or without\n" "modification, are permitted provided that the following conditions\n" "are met:\n" "\n" "- Redistributions of source code must retain the above copyright\n" "notice, this list of conditions and the following disclaimer.\n" "\n" "- Redistributions in binary form must reproduce the above copyright\n" "notice, this list of conditions and the following disclaimer in the\n" "documentation and/or other materials provided with the distribution.\n" "\n" "- Neither the name of the Xiph.org Foundation nor the names of its\n" "contributors may be used to endorse or promote products derived from\n" "this software without specific prior written permission.\n" "\n" "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n" "``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n" "LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n" "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION\n" "OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n" "SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n" "LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n" "DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n" "THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n" "(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n" "OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."; static const char *licenseVorbis = "Copyright (c) 2002-2008 Xiph.org Foundation\n" "\n" "Redistribution and use in source and binary forms, with or without\n" "modification, are permitted provided that the following conditions\n" "are met:\n" "\n" "- Redistributions of source code must retain the above copyright\n" "notice, this list of conditions and the following disclaimer.\n" "\n" "- Redistributions in binary form must reproduce the above copyright\n" "notice, this list of conditions and the following disclaimer in the\n" "documentation and/or other materials provided with the distribution.\n" "\n" "- Neither the name of the Xiph.org Foundation nor the names of its\n" "contributors may be used to endorse or promote products derived from\n" "this software without specific prior written permission.\n" "\n" "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n" "``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n" "LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n" "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION\n" "OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n" "SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n" "LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n" "DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n" "THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n" "(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n" "OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."; static const char *licenseFLAC = "Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson\n" "\n" "Redistribution and use in source and binary forms, with or without\n" "modification, are permitted provided that the following conditions\n" "are met:\n" "\n" "- Redistributions of source code must retain the above copyright\n" "notice, this list of conditions and the following disclaimer.\n" "\n" "- Redistributions in binary form must reproduce the above copyright\n" "notice, this list of conditions and the following disclaimer in the\n" "documentation and/or other materials provided with the distribution.\n" "\n" "- Neither the name of the Xiph.org Foundation nor the names of its\n" "contributors may be used to endorse or promote products derived from\n" "this software without specific prior written permission.\n" "\n" "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n" "``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n" "LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n" "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR\n" "CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n" "EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n" "PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n" "PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n" "LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n" "NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n" "SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."; #ifdef Q_OS_MAC static const char *licenseMachOverride = "Copyright (c) 2003-2009 Jonathan 'Wolf' Rentzsch \n" "\n" "Permission is hereby granted, free of charge, to any person obtaining\n" "a copy of this software and associated documentation files (the \"Software\"),\n" "to deal in the Software without restriction, including without limitation\n" "the rights to use, copy, modify, merge, publish, distribute, sublicense,\n" "and/or sell copies of the Software, and to permit persons to whom the\n" "Software is furnished to do so, subject to the following conditions:\n" "\n" "The above copyright notice and this permission notice shall be\n" "included in all copies or substantial portions of the Software.\n" "\n" "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n" "OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n" "FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\n" "THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n" "LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n" "OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n" "THE SOFTWARE."; #endif #ifdef Q_OS_WIN64 static const char *licenseMinHook = "MinHook - The Minimalistic API Hooking Library for x64/x86\n" "Copyright (C) 2009-2017 Tsuda Kageyu.\n" "All rights reserved.\n" "\n" "Redistribution and use in source and binary forms, with or without\n" "modification, are permitted provided that the following conditions\n" "are met:\n" "\n" " 1. Redistributions of source code must retain the above copyright\n" " notice, this list of conditions and the following disclaimer.\n" " 2. Redistributions in binary form must reproduce the above copyright\n" " notice, this list of conditions and the following disclaimer in the\n" " documentation and/or other materials provided with the distribution.\n" "\n" "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n" "\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\n" "TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\n" "PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER\n" "OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n" "EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n" "PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n" "PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n" "LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n" "NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n" "SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" "\n" "================================================================================\n" "Portions of this software are Copyright (c) 2008-2009, Vyacheslav Patkov.\n" "================================================================================\n" "Hacker Disassembler Engine 32 C\n" "Copyright (c) 2008-2009, Vyacheslav Patkov.\n" "All rights reserved.\n" "\n" "Redistribution and use in source and binary forms, with or without\n" "modification, are permitted provided that the following conditions\n" "are met:\n" "\n" " 1. Redistributions of source code must retain the above copyright\n" " notice, this list of conditions and the following disclaimer.\n" " 2. Redistributions in binary form must reproduce the above copyright\n" " notice, this list of conditions and the following disclaimer in the\n" " documentation and/or other materials provided with the distribution.\n" "\n" "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n" "\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\n" "TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\n" "PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR\n" "CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n" "EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n" "PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n" "PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n" "LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n" "NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n" "SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" "\n" "-------------------------------------------------------------------------------\n" "Hacker Disassembler Engine 64 C\n" "Copyright (c) 2008-2009, Vyacheslav Patkov.\n" "All rights reserved.\n" "\n" "Redistribution and use in source and binary forms, with or without\n" "modification, are permitted provided that the following conditions\n" "are met:\n" "\n" " 1. Redistributions of source code must retain the above copyright\n" " notice, this list of conditions and the following disclaimer.\n" " 2. Redistributions in binary form must reproduce the above copyright\n" " notice, this list of conditions and the following disclaimer in the\n" " documentation and/or other materials provided with the distribution.\n" "\n" "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n" "\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\n" "TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\n" "PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR\n" "CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n" "EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n" "PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n" "PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n" "LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n" "NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n" "SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."; #endif #ifdef USING_BUNDLED_QT_TRANSLATIONS static const char *licenseQtTranslations = "Mumble uses Qt translations created by the VirtualBox community\n" "under the MIT license. Files and copyright were obtained from:\n" "https://www.virtualbox.org/ticket/2018\n" "\n" "Turkish Qt translation (serdar, BouRock):\n" " Copyright (c) 2007-2009 Serdar Soytetir\n" " Copyright (c) 2012 Burak Yavuz\n" "Italian Qt translation (smart2128):\n" " Copyright (c) 2009-2012 Vincenzo Reale\n" "Dutch Qt translation (geertseb, lxndr, nippur):\n" " Copyright (c) 2009-2011 Ebel Geertsema\n" " Copyright (c) 2007 Alexander L. de Goeij\n" " Copyright (c) 2012 Richard E van der Luit\n" "\n" "Permission is hereby granted, free of charge, to any person obtaining a copy\n" "of this software and associated documentation files (the \"Software\"), to deal\n" "in the Software without restriction, including without limitation the rights\n" "to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n" "copies of the Software, and to permit persons to whom the Software is furnished\n" "to do so, subject to the following conditions:\n" "\n" "The above copyright notice and this permission notice shall be included in all\n" "copies or substantial portions of the Software.\n" "\n" "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n" "IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n" "FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n" "AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n" "LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n" "OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n" "SOFTWARE."; #endif static const char *licenseEmojiOne = "Creative Commons Attribution-ShareAlike 4.0 International Public\n" "License\n" "\n" "By exercising the Licensed Rights (defined below), You accept and agree\n" "to be bound by the terms and conditions of this Creative Commons\n" "Attribution-ShareAlike 4.0 International Public License (\"Public\n" "License\"). To the extent this Public License may be interpreted as a\n" "contract, You are granted the Licensed Rights in consideration of Your\n" "acceptance of these terms and conditions, and the Licensor grants You\n" "such rights in consideration of benefits the Licensor receives from\n" "making the Licensed Material available under these terms and\n" "conditions.\n" "\n" "\n" "Section 1 -- Definitions.\n" "\n" " a. Adapted Material means material subject to Copyright and Similar\n" " Rights that is derived from or based upon the Licensed Material\n" " and in which the Licensed Material is translated, altered,\n" " arranged, transformed, or otherwise modified in a manner requiring\n" " permission under the Copyright and Similar Rights held by the\n" " Licensor. For purposes of this Public License, where the Licensed\n" " Material is a musical work, performance, or sound recording,\n" " Adapted Material is always produced where the Licensed Material is\n" " synched in timed relation with a moving image.\n" "\n" " b. Adapter's License means the license You apply to Your Copyright\n" " and Similar Rights in Your contributions to Adapted Material in\n" " accordance with the terms and conditions of this Public License.\n" "\n" " c. BY-SA Compatible License means a license listed at\n" " creativecommons.org/compatiblelicenses, approved by Creative\n" " Commons as essentially the equivalent of this Public License.\n" "\n" " d. Copyright and Similar Rights means copyright and/or similar rights\n" " closely related to copyright including, without limitation,\n" " performance, broadcast, sound recording, and Sui Generis Database\n" " Rights, without regard to how the rights are labeled or\n" " categorized. For purposes of this Public License, the rights\n" " specified in Section 2(b)(1)-(2) are not Copyright and Similar\n" " Rights.\n" "\n" " e. Effective Technological Measures means those measures that, in the\n" " absence of proper authority, may not be circumvented under laws\n" " fulfilling obligations under Article 11 of the WIPO Copyright\n" " Treaty adopted on December 20, 1996, and/or similar international\n" " agreements.\n" "\n" " f. Exceptions and Limitations means fair use, fair dealing, and/or\n" " any other exception or limitation to Copyright and Similar Rights\n" " that applies to Your use of the Licensed Material.\n" "\n" " g. License Elements means the license attributes listed in the name\n" " of a Creative Commons Public License. The License Elements of this\n" " Public License are Attribution and ShareAlike.\n" "\n" " h. Licensed Material means the artistic or literary work, database,\n" " or other material to which the Licensor applied this Public\n" " License.\n" "\n" " i. Licensed Rights means the rights granted to You subject to the\n" " terms and conditions of this Public License, which are limited to\n" " all Copyright and Similar Rights that apply to Your use of the\n" " Licensed Material and that the Licensor has authority to license.\n" "\n" " j. Licensor means the individual(s) or entity(ies) granting rights\n" " under this Public License.\n" "\n" " k. Share means to provide material to the public by any means or\n" " process that requires permission under the Licensed Rights, such\n" " as reproduction, public display, public performance, distribution,\n" " dissemination, communication, or importation, and to make material\n" " available to the public including in ways that members of the\n" " public may access the material from a place and at a time\n" " individually chosen by them.\n" "\n" " l. Sui Generis Database Rights means rights other than copyright\n" " resulting from Directive 96/9/EC of the European Parliament and of\n" " the Council of 11 March 1996 on the legal protection of databases,\n" " as amended and/or succeeded, as well as other essentially\n" " equivalent rights anywhere in the world.\n" "\n" " m. You means the individual or entity exercising the Licensed Rights\n" " under this Public License. Your has a corresponding meaning.\n" "\n" "\n" "Section 2 -- Scope.\n" "\n" " a. License grant.\n" "\n" " 1. Subject to the terms and conditions of this Public License,\n" " the Licensor hereby grants You a worldwide, royalty-free,\n" " non-sublicensable, non-exclusive, irrevocable license to\n" " exercise the Licensed Rights in the Licensed Material to:\n" "\n" " a. reproduce and Share the Licensed Material, in whole or\n" " in part; and\n" "\n" " b. produce, reproduce, and Share Adapted Material.\n" "\n" " 2. Exceptions and Limitations. For the avoidance of doubt, where\n" " Exceptions and Limitations apply to Your use, this Public\n" " License does not apply, and You do not need to comply with\n" " its terms and conditions.\n" "\n" " 3. Term. The term of this Public License is specified in Section\n" " 6(a).\n" "\n" " 4. Media and formats; technical modifications allowed. The\n" " Licensor authorizes You to exercise the Licensed Rights in\n" " all media and formats whether now known or hereafter created,\n" " and to make technical modifications necessary to do so. The\n" " Licensor waives and/or agrees not to assert any right or\n" " authority to forbid You from making technical modifications\n" " necessary to exercise the Licensed Rights, including\n" " technical modifications necessary to circumvent Effective\n" " Technological Measures. For purposes of this Public License,\n" " simply making modifications authorized by this Section 2(a)\n" " (4) never produces Adapted Material.\n" "\n" " 5. Downstream recipients.\n" "\n" " a. Offer from the Licensor -- Licensed Material. Every\n" " recipient of the Licensed Material automatically\n" " receives an offer from the Licensor to exercise the\n" " Licensed Rights under the terms and conditions of this\n" " Public License.\n" "\n" " b. Additional offer from the Licensor -- Adapted Material.\n" " Every recipient of Adapted Material from You\n" " automatically receives an offer from the Licensor to\n" " exercise the Licensed Rights in the Adapted Material\n" " under the conditions of the Adapter's License You apply.\n" "\n" " c. No downstream restrictions. You may not offer or impose\n" " any additional or different terms or conditions on, or\n" " apply any Effective Technological Measures to, the\n" " Licensed Material if doing so restricts exercise of the\n" " Licensed Rights by any recipient of the Licensed\n" " Material.\n" "\n" " 6. No endorsement. Nothing in this Public License constitutes or\n" " may be construed as permission to assert or imply that You\n" " are, or that Your use of the Licensed Material is, connected\n" " with, or sponsored, endorsed, or granted official status by,\n" " the Licensor or others designated to receive attribution as\n" " provided in Section 3(a)(1)(A)(i).\n" "\n" " b. Other rights.\n" "\n" " 1. Moral rights, such as the right of integrity, are not\n" " licensed under this Public License, nor are publicity,\n" " privacy, and/or other similar personality rights; however, to\n" " the extent possible, the Licensor waives and/or agrees not to\n" " assert any such rights held by the Licensor to the limited\n" " extent necessary to allow You to exercise the Licensed\n" " Rights, but not otherwise.\n" "\n" " 2. Patent and trademark rights are not licensed under this\n" " Public License.\n" "\n" " 3. To the extent possible, the Licensor waives any right to\n" " collect royalties from You for the exercise of the Licensed\n" " Rights, whether directly or through a collecting society\n" " under any voluntary or waivable statutory or compulsory\n" " licensing scheme. In all other cases the Licensor expressly\n" " reserves any right to collect such royalties.\n" "\n" "\n" "Section 3 -- License Conditions.\n" "\n" "Your exercise of the Licensed Rights is expressly made subject to the\n" "following conditions.\n" "\n" " a. Attribution.\n" "\n" " 1. If You Share the Licensed Material (including in modified\n" " form), You must:\n" "\n" " a. retain the following if it is supplied by the Licensor\n" " with the Licensed Material:\n" "\n" " i. identification of the creator(s) of the Licensed\n" " Material and any others designated to receive\n" " attribution, in any reasonable manner requested by\n" " the Licensor (including by pseudonym if\n" " designated);\n" "\n" " ii. a copyright notice;\n" "\n" " iii. a notice that refers to this Public License;\n" "\n" " iv. a notice that refers to the disclaimer of\n" " warranties;\n" "\n" " v. a URI or hyperlink to the Licensed Material to the\n" " extent reasonably practicable;\n" "\n" " b. indicate if You modified the Licensed Material and\n" " retain an indication of any previous modifications; and\n" "\n" " c. indicate the Licensed Material is licensed under this\n" " Public License, and include the text of, or the URI or\n" " hyperlink to, this Public License.\n" "\n" " 2. You may satisfy the conditions in Section 3(a)(1) in any\n" " reasonable manner based on the medium, means, and context in\n" " which You Share the Licensed Material. For example, it may be\n" " reasonable to satisfy the conditions by providing a URI or\n" " hyperlink to a resource that includes the required\n" " information.\n" "\n" " 3. If requested by the Licensor, You must remove any of the\n" " information required by Section 3(a)(1)(A) to the extent\n" " reasonably practicable.\n" "\n" " b. ShareAlike.\n" "\n" " In addition to the conditions in Section 3(a), if You Share\n" " Adapted Material You produce, the following conditions also apply.\n" "\n" " 1. The Adapter's License You apply must be a Creative Commons\n" " license with the same License Elements, this version or\n" " later, or a BY-SA Compatible License.\n" "\n" " 2. You must include the text of, or the URI or hyperlink to, the\n" " Adapter's License You apply. You may satisfy this condition\n" " in any reasonable manner based on the medium, means, and\n" " context in which You Share Adapted Material.\n" "\n" " 3. You may not offer or impose any additional or different terms\n" " or conditions on, or apply any Effective Technological\n" " Measures to, Adapted Material that restrict exercise of the\n" " rights granted under the Adapter's License You apply.\n" "\n" "\n" "Section 4 -- Sui Generis Database Rights.\n" "\n" "Where the Licensed Rights include Sui Generis Database Rights that\n" "apply to Your use of the Licensed Material:\n" "\n" " a. for the avoidance of doubt, Section 2(a)(1) grants You the right\n" " to extract, reuse, reproduce, and Share all or a substantial\n" " portion of the contents of the database;\n" "\n" " b. if You include all or a substantial portion of the database\n" " contents in a database in which You have Sui Generis Database\n" " Rights, then the database in which You have Sui Generis Database\n" " Rights (but not its individual contents) is Adapted Material,\n" "\n" " including for purposes of Section 3(b); and\n" " c. You must comply with the conditions in Section 3(a) if You Share\n" " all or a substantial portion of the contents of the database.\n" "\n" "For the avoidance of doubt, this Section 4 supplements and does not\n" "replace Your obligations under this Public License where the Licensed\n" "Rights include other Copyright and Similar Rights.\n" "\n" "\n" "Section 5 -- Disclaimer of Warranties and Limitation of Liability.\n" "\n" " a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE\n" " EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS\n" " AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF\n" " ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,\n" " IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,\n" " WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR\n" " PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,\n" " ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT\n" " KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT\n" " ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.\n" "\n" " b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE\n" " TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,\n" " NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,\n" " INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,\n" " COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR\n" " USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN\n" " ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR\n" " DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR\n" " IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.\n" "\n" " c. The disclaimer of warranties and limitation of liability provided\n" " above shall be interpreted in a manner that, to the extent\n" " possible, most closely approximates an absolute disclaimer and\n" " waiver of all liability.\n" "\n" "\n" "Section 6 -- Term and Termination.\n" "\n" " a. This Public License applies for the term of the Copyright and\n" " Similar Rights licensed here. However, if You fail to comply with\n" " this Public License, then Your rights under this Public License\n" " terminate automatically.\n" "\n" " b. Where Your right to use the Licensed Material has terminated under\n" " Section 6(a), it reinstates:\n" "\n" " 1. automatically as of the date the violation is cured, provided\n" " it is cured within 30 days of Your discovery of the\n" " violation; or\n" "\n" " 2. upon express reinstatement by the Licensor.\n" "\n" " For the avoidance of doubt, this Section 6(b) does not affect any\n" " right the Licensor may have to seek remedies for Your violations\n" " of this Public License.\n" "\n" " c. For the avoidance of doubt, the Licensor may also offer the\n" " Licensed Material under separate terms or conditions or stop\n" " distributing the Licensed Material at any time; however, doing so\n" " will not terminate this Public License.\n" "\n" " d. Sections 1, 5, 6, 7, and 8 survive termination of this Public\n" " License.\n" "\n" "\n" "Section 7 -- Other Terms and Conditions.\n" "\n" " a. The Licensor shall not be bound by any additional or different\n" " terms or conditions communicated by You unless expressly agreed.\n" "\n" " b. Any arrangements, understandings, or agreements regarding the\n" " Licensed Material not stated herein are separate from and\n" " independent of the terms and conditions of this Public License.\n" "\n" "\n" "Section 8 -- Interpretation.\n" "\n" " a. For the avoidance of doubt, this Public License does not, and\n" " shall not be interpreted to, reduce, limit, restrict, or impose\n" " conditions on any use of the Licensed Material that could lawfully\n" " be made without permission under this Public License.\n" "\n" " b. To the extent possible, if any provision of this Public License is\n" " deemed unenforceable, it shall be automatically reformed to the\n" " minimum extent necessary to make it enforceable. If the provision\n" " cannot be reformed, it shall be severed from this Public License\n" " without affecting the enforceability of the remaining terms and\n" " conditions.\n" "\n" " c. No term or condition of this Public License will be waived and no\n" " failure to comply consented to unless expressly agreed to by the\n" " Licensor.\n" "\n" " d. Nothing in this Public License constitutes or may be interpreted\n" " as a limitation upon, or waiver of, any privileges and immunities\n" " that apply to the Licensor or You, including from the legal\n" " processes of any jurisdiction or authority."; static const char *licenseXInputCheck = "Simple DirectMedia Layer\n" "Copyright (C) 1997-2016 Sam Lantinga \n" " \n" "This software is provided 'as-is', without any express or implied\n" "warranty. In no event will the authors be held liable for any damages\n" "arising from the use of this software.\n" "\n" "Permission is granted to anyone to use this software for any purpose,\n" "including commercial applications, and to alter it and redistribute it\n" "freely, subject to the following restrictions:\n" " \n" "1. The origin of this software must not be misrepresented; you must not\n" " claim that you wrote the original software. If you use this software\n" " in a product, an acknowledgment in the product documentation would be\n" " appreciated but is not required. \n" "2. Altered source versions must be plainly marked as such, and must not be\n" " misrepresented as being the original software.\n" "3. This notice may not be removed or altered from any source distribution."; static const char *licenseQQBonjour = "Copyright (c) 2007, Trenton Schulz\n" "\n" "Redistribution and use in source and binary forms, with or without\n" "modification, are permitted provided that the following conditions are met:\n" "\n" " 1. Redistributions of source code must retain the above copyright notice,\n" " this list of conditions and the following disclaimer.\n" "\n" " 2. Redistributions in binary form must reproduce the above copyright notice,\n" " this list of conditions and the following disclaimer in the documentation\n" " and/or other materials provided with the distribution.\n" "\n" " 3. The name of the author may not be used to endorse or promote products\n" " derived from this software without specific prior written permission.\n" "\n" "THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n" "WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n" "MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO\n" "EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n" "SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n" "PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n" "OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n" "WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n" "OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n" "ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."; static const char *licenseSmallFT = "Copyright (c) 2002-2007 Xiph.org Foundation\n" "\n" "Redistribution and use in source and binary forms, with or without\n" "modification, are permitted provided that the following conditions\n" "are met:\n" "\n" "- Redistributions of source code must retain the above copyright\n" "notice, this list of conditions and the following disclaimer.\n" "\n" "- Redistributions in binary form must reproduce the above copyright\n" "notice, this list of conditions and the following disclaimer in the\n" "documentation and/or other materials provided with the distribution.\n" "\n" "- Neither the name of the Xiph.org Foundation nor the names of its\n" "contributors may be used to endorse or promote products derived from\n" "this software without specific prior written permission.\n" "\n" "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n" "`AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n" "LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n" "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION\n" "OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n" "SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n" "LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n" "DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n" "THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n" "(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n" "OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."; static const char *licenseOldStyleLicenseHeaders = "Mumble's AudioConfigDialog\n" "\n" " src/mumble/AudioConfigDialog.cpp\n" "\n" " Copyright (C) 2005-2011, Thorvald Natvig \n" " Copyright (C) 2008, Andreas Messer \n" "\n" "Mumble's PortAudio support\n" "\n" " src/mumble/PAAudio.cpp, src/mumble/PAAudio.h\n" "\n" " Copyright (C) 2005-2011, Thorvald Natvig \n" " Copyright (C) 2007, Stefan Gehn \n" "\n" "Mumble's Text-to-Speech support on OS X\n" "\n" " src/mumble/TextToSpeech_macx.mm\n" "\n" " Copyright (C) 2005-2011, Thorvald Natvig \n" " Copyright (C) 2007, Sebastian Schlingmann \n" " Copyright (C) 2008-2011, Mikkel Krautz \n" " Copyright (C) 2014, Mayur Pawashe \n" "\n" "Mumble's UserLocalVolumeDialog\n" "\n" " src/mumble/UserLocalVolumeDialog.cpp\n" " src/mumble/UserLocalVolumeDialog.h\n" "\n" " Copyright (C) 2015, Fredrik Nordin \n" "\n" "Murmur's PBKDF2 support\n" "\n" " src/murmur/PBKDF2.cpp\n" " src/murmur/PBKDF2.h\n" "\n" " Copyright (C) 2013, Morris Moraes \n" " Copyright (C) 2014, Stefan Hacker \n" "\n" "D11StateBlock in Mumble's Windows Overlay\n" "\n" " overlay/D11StateBlock.cpp\n" " overlay/D11StateBlock.h\n" "\n" " Copyright (C) 2011-2013, Nye Liu \n" " Copyright (C) 2011-2013, Kissaki \n" "\n" "D3D11 HLSL shaders for Mumble's Windows Overlay\n" "\n" " overlay/overlay11-common.hlsl\n" " overlay/overlay11.ps\n" " overlay/overlay11.vs\n" "\n" " Copyright (C) 2011-2013, Nye Liu \n" "\n" "D3D11 support for Mumble's Windows Overlay\n" "\n" " overlay/d3d11.cpp\n" "\n" " Copyright (C) 2010-2013, Benjamin Jemlich \n" " Copyright (C) 2011-2013, Nye Liu \n" " Copyright (C) 2011-2013, Kissaki \n" "\n" "DXGI support for Mumble's Windows Overlay\n" "\n" " overlay/dxgi.cpp\n" "\n" " Copyright (C) 2005-2010, Thorvald Natvig \n" " Copyright (C) 2011, Kissaki \n" " Copyright (C) 2011, Nye Liu \n" "\n" "Mumble's \"Battlefield 3\" Plugin\n" "\n" " plugins/bf3/bf3.cpp\n" "\n" " Copyright (C) 2010-2011, Snares \n" " Copyright (C) 2005-2011, Thorvald Natvig \n" " Copyright (C) 2011, Ryan Austin \n" " Copyright (C) 2012, Bojan Hartmann \n" "\n" "Mumble's \"Blacklight\" Plugin\n" "\n" " plugins/blacklight/blacklight.cpp\n" "\n" " Copyright (C) 2012, dark_skeleton (d-rez) \n" " Copyright (C) 2005-2012, Thorvald Natvig \n" "\n" "Mumble's \"Borderlands\" Plugin\n" "\n" " plugins/borderlands/borderlands.cpp\n" "\n" " Copyright (C) 2010, Mark-Willem Jansen \n" " Copyright (C) 2005-2012, Thorvald Natvig \n" "\n" "Mumble's \"Borderlands 2\" Plugin\n" "\n" " plugins/borderlands2/borderlands2.cpp\n" "\n" " Copyright (C) 2013, Steve Hill \n" " Copyright (C) 2013, Gabriel Risterucci \n" " Copyright (C) 2005-2010, Thorvald Natvig \n" "\n" "Mumble's \"Breach\" Plugin\n" "\n" " plugins/breach/breach.cpp\n" "\n" " Copyright (C) 2011, Mark-Willem Jansen \n" " Copyright (C) 2005-2012, Thorvald Natvig \n" "\n" "Mumble's \"Counter-Strike\" Plugin\n" "\n" " plugins/cs/cs.cpp\n" "\n" " Copyright (C) 2009-2010, Imre Botos \n" " Copyright (C) 2009-2012, Snares \n" " Copyright (C) 2005-2012, Thorvald Natvig \n" "\n" "Mumble's \"Grand Theft Auto IV\" Plugin\n" "\n" " plugins/gtaiv/gtaiv.cpp\n" "\n" " Copyright (C) 2011, Mike \n" " Copyright (C) 2005-2012, Thorvald Natvig \n" "\n" "Mumble's \"Just Cause 2\" Plugin\n" "\n" " plugins/jc2/jc2.cpp\n" "\n" " Copyright (C) 2012, Mike \n" " Copyright (C) 2005-2012, Thorvald Natvig \n" "\n" "Mumble's \"Left 4 Dead 2\" Plugin\n" "\n" " plugins/l4d2/l4d2.cpp\n" "\n" " Copyright (C) 2005-2012, Thorvald Natvig \n" " Copyright (C) 2012, dark_skeleton (d-rez) \n" "\n" "Mumble's \"League of Legends\" Plugin\n" "\n" " plugins/lol/lol.cpp\n" "\n" " Copyright (C) 2012, dark_skeleton (d-rez) \n" " Copyright (C) 2005-2012, Thorvald Natvig \n" "\n" "Mumble's \"The Lord of The Rings Online\" Plugin\n" "\n" " plugins/lotro/lotro.cpp\n" "\n" " Copyright (c) 2009-2011 Ilmar 'Ingaras' Kruis (seaeagle1@users.sourceforge.net)\n" "\n" "Mumble's \"Sub Rosa\" Plugin\n" "\n" " plugins/sr/sr.cpp\n" "\n" " Copyright (C) 2012, Lukas Orsvärn \n" " Copyright (C) 2005-2010, Thorvald Natvig \n" "\n" "Mumble's \"Unreal Tournament\" Plugin\n" "\n" " plugins/ut99/ut99.cpp\n" "\n" " Copyright (C) 2005-2010, Thorvald Natvig \n" " Copyright (C) 2012, Moritz Schneeweiss\n" "\n" "All rights reserved.\n" "\n" "Redistribution and use in source and binary forms, with or without\n" "modification, are permitted provided that the following conditions\n" "are met:\n" "\n" "- Redistributions of source code must retain the above copyright notice,\n" " this list of conditions and the following disclaimer.\n" "- Redistributions in binary form must reproduce the above copyright notice,\n" " this list of conditions and the following disclaimer in the documentation\n" " and/or other materials provided with the distribution.\n" "- Neither the name of the Mumble Developers nor the names of its\n" " contributors may be used to endorse or promote products derived from this\n" " software without specific prior written permission.\n" "\n" "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n" "``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n" "LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n" "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR\n" "CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n" "EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n" "PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n" "PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n" "LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n" "NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n" "SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."; static const char *licenseArc4RandomUniform = "Copyright (c) 2008, Damien Miller \n" "\n" "Permission to use, copy, modify, and distribute this software for any\n" "purpose with or without fee is hereby granted, provided that the above\n" "copyright notice and this permission notice appear in all copies.\n" "\n" "THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n" "WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n" "MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n" "ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n" "WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n" "ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n" "OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE."; #ifdef USE_BUILDENV static const char *licenseMariaDBCConnector = "This library is free software; you can redistribute it and/or\n" "modify it under the terms of the GNU Lesser General Public\n" "License as published by the Free Software Foundation; either\n" "version 2.1 of the License, or (at your option) any later version.\n" "\n" "This library is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n" "Lesser General Public License for more details.\n" "\n" "You should have received a copy of the GNU Lesser General Public\n" "License along with this library; if not, write to the Free Software\n" "Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\n" "02110-1301 USA"; #endif #ifdef USE_BUILDENV static const char *licenseZlib = "(C) 1995-2017 Jean-loup Gailly and Mark Adler\n" "\n" "This software is provided 'as-is', without any express or implied\n" "warranty. In no event will the authors be held liable for any damages\n" "arising from the use of this software.\n" "\n" "Permission is granted to anyone to use this software for any purpose,\n" "including commercial applications, and to alter it and redistribute it\n" "freely, subject to the following restrictions:\n" "\n" "1. The origin of this software must not be misrepresented; you must not\n" " claim that you wrote the original software. If you use this software\n" " in a product, an acknowledgment in the product documentation would be\n" " appreciated but is not required.\n" "2. Altered source versions must be plainly marked as such, and must not be\n" " misrepresented as being the original software.\n" "3. This notice may not be removed or altered from any source distribution.\n" "\n" "Jean-loup Gailly Mark Adler\n" "jloup@gzip.org madler@alumni.caltech.edu"; #endif #ifdef USE_BUILDENV static const char *licenseProtobuf = "This license applies to all parts of Protocol Buffers except the following:\n" "\n" " - Atomicops support for generic gcc, located in\n" " src/google/protobuf/stubs/atomicops_internals_generic_gcc.h.\n" " This file is copyrighted by Red Hat Inc.\n" "\n" " - Atomicops support for AIX/POWER, located in\n" " src/google/protobuf/stubs/atomicops_internals_power.h.\n" " This file is copyrighted by Bloomberg Finance LP.\n" "\n" "Copyright 2014, Google Inc. All rights reserved.\n" "\n" "Redistribution and use in source and binary forms, with or without\n" "modification, are permitted provided that the following conditions are\n" "met:\n" "\n" " * Redistributions of source code must retain the above copyright\n" "notice, this list of conditions and the following disclaimer.\n" " * Redistributions in binary form must reproduce the above\n" "copyright notice, this list of conditions and the following disclaimer\n" "in the documentation and/or other materials provided with the\n" "distribution.\n" " * Neither the name of Google Inc. nor the names of its\n" "contributors may be used to endorse or promote products derived from\n" "this software without specific prior written permission.\n" "\n" "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n" "\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n" "LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n" "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n" "OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n" "SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n" "LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n" "DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n" "THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n" "(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n" "OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" "\n" "Code generated by the Protocol Buffer compiler is owned by the owner\n" "of the input file used when generating it. This code is not\n" "standalone and requires a support library to be linked with it. This\n" "support library is itself covered by the above license."; #endif #ifdef USE_BUILDENV static const char *licenseExpat = "Copyright (c) 1998-2000 Thai Open Source Software Center Ltd and Clark Cooper\n" "Copyright (c) 2001-2016 Expat maintainers\n" "\n" "Permission is hereby granted, free of charge, to any person obtaining\n" "a copy of this software and associated documentation files (the\n" "\"Software\"), to deal in the Software without restriction, including\n" "without limitation the rights to use, copy, modify, merge, publish,\n" "distribute, sublicense, and/or sell copies of the Software, and to\n" "permit persons to whom the Software is furnished to do so, subject to\n" "the following conditions:\n" "\n" "The above copyright notice and this permission notice shall be included\n" "in all copies or substantial portions of the Software.\n" "\n" "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n" "EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n" "MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n" "IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n" "CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n" "TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n" "SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."; #endif #ifdef USE_BUILDENV static const char *licenseBoost = "Boost Software License - Version 1.0 - August 17th, 2003\n" "\n" "Permission is hereby granted, free of charge, to any person or organization\n" "obtaining a copy of the software and accompanying documentation covered by\n" "this license (the \"Software\") to use, reproduce, display, distribute,\n" "execute, and transmit the Software, and to prepare derivative works of the\n" "Software, and to permit third-parties to whom the Software is furnished to\n" "do so, all subject to the following:\n" "\n" "The copyright notices in the Software and this entire statement, including\n" "the above license grant, this restriction and the following disclaimer,\n" "must be included in all copies of the Software, in whole or in part, and\n" "all derivative works of the Software, unless such copies or derivative\n" "works are solely in the form of machine-executable object code generated by\n" "a source language processor.\n" "\n" "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n" "IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n" "FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT\n" "SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE\n" "FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,\n" "ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n" "DEALINGS IN THE SOFTWARE."; #endif #ifdef USE_BUILDENV static const char *licenseBzip2 = "This program, \"bzip2\", the associated library \"libbzip2\", and all\n" "documentation, are copyright (C) 1996-2010 Julian R Seward. All\n" "rights reserved.\n" "\n" "Redistribution and use in source and binary forms, with or without\n" "modification, are permitted provided that the following conditions\n" "are met:\n" "\n" "1. Redistributions of source code must retain the above copyright\n" " notice, this list of conditions and the following disclaimer.\n" "\n" "2. The origin of this software must not be misrepresented; you must \n" " not claim that you wrote the original software. If you use this \n" " software in a product, an acknowledgment in the product \n" " documentation would be appreciated but is not required.\n" "\n" "3. Altered source versions must be plainly marked as such, and must\n" " not be misrepresented as being the original software.\n" "\n" "4. The name of the author may not be used to endorse or promote \n" " products derived from this software without specific prior written \n" " permission.\n" "\n" "THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS\n" "OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n" "WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n" "ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY\n" "DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n" "DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\n" "GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n" "INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n" "WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n" "NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n" "SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" "\n" "Julian Seward, jseward@bzip.org\n" "bzip2/libbzip2 version 1.0.6 of 6 September 2010"; #endif #ifdef USE_BUILDENV static const char *licenseBerkeleyDB = "/*\n" " * Copyright (c) 1990, 2013 Oracle and/or its affiliates. All rights reserved.\n" " *\n" " * Redistribution and use in source and binary forms, with or without\n" " * modification, are permitted provided that the following conditions\n" " * are met:\n" " * 1. Redistributions of source code must retain the above copyright\n" " * notice, this list of conditions and the following disclaimer.\n" " * 2. Redistributions in binary form must reproduce the above copyright\n" " * notice, this list of conditions and the following disclaimer in the\n" " * documentation and/or other materials provided with the distribution.\n" " * 3. Redistributions in any form must be accompanied by information on\n" " * how to obtain complete source code for the DB software and any\n" " * accompanying software that uses the DB software. The source code\n" " * must either be included in the distribution or be available for no\n" " * more than the cost of distribution plus a nominal fee, and must be\n" " * freely redistributable under reasonable conditions. For an\n" " * executable file, complete source code means the source code for all\n" " * modules it contains. It does not include source code for modules or\n" " * files that typically accompany the major components of the operating\n" " * system on which the executable file runs.\n" " *\n" " * THIS SOFTWARE IS PROVIDED BY ORACLE ``AS IS'' AND ANY EXPRESS OR\n" " * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n" " * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR\n" " * NON-INFRINGEMENT, ARE DISCLAIMED. IN NO EVENT SHALL ORACLE BE LIABLE\n" " * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n" " * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n" " * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n" " * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n" " * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\n" " * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN\n" " * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" " */\n" "/*\n" " * Copyright (c) 1990, 1993, 1994, 1995\n" " * The Regents of the University of California. All rights reserved.\n" " *\n" " * Redistribution and use in source and binary forms, with or without\n" " * modification, are permitted provided that the following conditions\n" " * are met:\n" " * 1. Redistributions of source code must retain the above copyright\n" " * notice, this list of conditions and the following disclaimer.\n" " * 2. Redistributions in binary form must reproduce the above copyright\n" " * notice, this list of conditions and the following disclaimer in the\n" " * documentation and/or other materials provided with the distribution.\n" " * 3. Neither the name of the University nor the names of its contributors\n" " * may be used to endorse or promote products derived from this software\n" " * without specific prior written permission.\n" " *\n" " * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND\n" " * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n" " * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n" " * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE\n" " * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n" " * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n" " * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n" " * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n" " * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n" " * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n" " * SUCH DAMAGE.\n" " */\n" "/*\n" " * Copyright (c) 1995, 1996\n" " * The President and Fellows of Harvard University. All rights reserved.\n" " *\n" " * Redistribution and use in source and binary forms, with or without\n" " * modification, are permitted provided that the following conditions\n" " * are met:\n" " * 1. Redistributions of source code must retain the above copyright\n" " * notice, this list of conditions and the following disclaimer.\n" " * 2. Redistributions in binary form must reproduce the above copyright\n" " * notice, this list of conditions and the following disclaimer in the\n" " * documentation and/or other materials provided with the distribution.\n" " * 3. Neither the name of the University nor the names of its contributors\n" " * may be used to endorse or promote products derived from this software\n" " * without specific prior written permission.\n" " *\n" " * THIS SOFTWARE IS PROVIDED BY HARVARD AND ITS CONTRIBUTORS ``AS IS'' AND\n" " * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n" " * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n" " * ARE DISCLAIMED. IN NO EVENT SHALL HARVARD OR ITS CONTRIBUTORS BE LIABLE\n" " * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n" " * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n" " * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n" " * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n" " * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n" " * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n" " * SUCH DAMAGE.\n" " */\n" "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n" "/***\n" " * ASM: a very small and fast Java bytecode manipulation framework\n" " * Copyright (c) 2000-2005 INRIA, France Telecom\n" " * All rights reserved.\n" " *\n" " * Redistribution and use in source and binary forms, with or without\n" " * modification, are permitted provided that the following conditions\n" " * are met:\n" " * 1. Redistributions of source code must retain the above copyright\n" " * notice, this list of conditions and the following disclaimer.\n" " * 2. Redistributions in binary form must reproduce the above copyright\n" " * notice, this list of conditions and the following disclaimer in the\n" " * documentation and/or other materials provided with the distribution.\n" " * 3. Neither the name of the copyright holders nor the names of its\n" " * contributors may be used to endorse or promote products derived from\n" " * this software without specific prior written permission.\n" " *\n" " * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n" " * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n" " * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n" " * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n" " * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n" " * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n" " * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n" " * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n" " * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n" " * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\n" " * THE POSSIBILITY OF SUCH DAMAGE.\n" " */"; #endif #ifdef USE_BUILDENV static const char *licenseFreetype = " The FreeType Project LICENSE\n" " ----------------------------\n" "\n" " 2006-Jan-27\n" "\n" " Copyright 1996-2002, 2006 by\n" " David Turner, Robert Wilhelm, and Werner Lemberg\n" "\n" "\n" "\n" "Introduction\n" "============\n" "\n" " The FreeType Project is distributed in several archive packages;\n" " some of them may contain, in addition to the FreeType font engine,\n" " various tools and contributions which rely on, or relate to, the\n" " FreeType Project.\n" "\n" " This license applies to all files found in such packages, and\n" " which do not fall under their own explicit license. The license\n" " affects thus the FreeType font engine, the test programs,\n" " documentation and makefiles, at the very least.\n" "\n" " This license was inspired by the BSD, Artistic, and IJG\n" " (Independent JPEG Group) licenses, which all encourage inclusion\n" " and use of free software in commercial and freeware products\n" " alike. As a consequence, its main points are that:\n" "\n" " o We don't promise that this software works. However, we will be\n" " interested in any kind of bug reports. (`as is' distribution)\n" "\n" " o You can use this software for whatever you want, in parts or\n" " full form, without having to pay us. (`royalty-free' usage)\n" "\n" " o You may not pretend that you wrote this software. If you use\n" " it, or only parts of it, in a program, you must acknowledge\n" " somewhere in your documentation that you have used the\n" " FreeType code. (`credits')\n" "\n" " We specifically permit and encourage the inclusion of this\n" " software, with or without modifications, in commercial products.\n" " We disclaim all warranties covering The FreeType Project and\n" " assume no liability related to The FreeType Project.\n" "\n" "\n" " Finally, many people asked us for a preferred form for a\n" " credit/disclaimer to use in compliance with this license. We thus\n" " encourage you to use the following text:\n" "\n" " \"\"\"\n" " Portions of this software are copyright © The FreeType\n" " Project (www.freetype.org). All rights reserved.\n" " \"\"\"\n" "\n" " Please replace with the value from the FreeType version you\n" " actually use.\n" "\n" "\n" "Legal Terms\n" "===========\n" "\n" "0. Definitions\n" "--------------\n" "\n" " Throughout this license, the terms `package', `FreeType Project',\n" " and `FreeType archive' refer to the set of files originally\n" " distributed by the authors (David Turner, Robert Wilhelm, and\n" " Werner Lemberg) as the `FreeType Project', be they named as alpha,\n" " beta or final release.\n" "\n" " `You' refers to the licensee, or person using the project, where\n" " `using' is a generic term including compiling the project's source\n" " code as well as linking it to form a `program' or `executable'.\n" " This program is referred to as `a program using the FreeType\n" " engine'.\n" "\n" " This license applies to all files distributed in the original\n" " FreeType Project, including all source code, binaries and\n" " documentation, unless otherwise stated in the file in its\n" " original, unmodified form as distributed in the original archive.\n" " If you are unsure whether or not a particular file is covered by\n" " this license, you must contact us to verify this.\n" "\n" " The FreeType Project is copyright (C) 1996-2000 by David Turner,\n" " Robert Wilhelm, and Werner Lemberg. All rights reserved except as\n" " specified below.\n" "\n" "1. No Warranty\n" "--------------\n" "\n" " THE FREETYPE PROJECT IS PROVIDED `AS IS' WITHOUT WARRANTY OF ANY\n" " KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\n" " WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n" " PURPOSE. IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS\n" " BE LIABLE FOR ANY DAMAGES CAUSED BY THE USE OR THE INABILITY TO\n" " USE, OF THE FREETYPE PROJECT.\n" "\n" "2. Redistribution\n" "-----------------\n" "\n" " This license grants a worldwide, royalty-free, perpetual and\n" " irrevocable right and license to use, execute, perform, compile,\n" " display, copy, create derivative works of, distribute and\n" " sublicense the FreeType Project (in both source and object code\n" " forms) and derivative works thereof for any purpose; and to\n" " authorize others to exercise some or all of the rights granted\n" " herein, subject to the following conditions:\n" "\n" " o Redistribution of source code must retain this license file\n" " (`FTL.TXT') unaltered; any additions, deletions or changes to\n" " the original files must be clearly indicated in accompanying\n" " documentation. The copyright notices of the unaltered,\n" " original files must be preserved in all copies of source\n" " files.\n" "\n" " o Redistribution in binary form must provide a disclaimer that\n" " states that the software is based in part of the work of the\n" " FreeType Team, in the distribution documentation. We also\n" " encourage you to put an URL to the FreeType web page in your\n" " documentation, though this isn't mandatory.\n" "\n" " These conditions apply to any software derived from or based on\n" " the FreeType Project, not just the unmodified files. If you use\n" " our work, you must acknowledge us. However, no fee need be paid\n" " to us.\n" "\n" "3. Advertising\n" "--------------\n" "\n" " Neither the FreeType authors and contributors nor you shall use\n" " the name of the other for commercial, advertising, or promotional\n" " purposes without specific prior written permission.\n" "\n" " We suggest, but do not require, that you use one or more of the\n" " following phrases to refer to this software in your documentation\n" " or advertising materials: `FreeType Project', `FreeType Engine',\n" " `FreeType library', or `FreeType Distribution'.\n" "\n" " As you have not signed this license, you are not required to\n" " accept it. However, as the FreeType Project is copyrighted\n" " material, only this license, or another one contracted with the\n" " authors, grants you the right to use, distribute, and modify it.\n" " Therefore, by using, distributing, or modifying the FreeType\n" " Project, you indicate that you understand and accept all the terms\n" " of this license.\n" "\n" "4. Contacts\n" "-----------\n" "\n" " There are two mailing lists related to FreeType:\n" "\n" " o freetype@nongnu.org\n" "\n" " Discusses general use and applications of FreeType, as well as\n" " future and wanted additions to the library and distribution.\n" " If you are looking for support, start in this list if you\n" " haven't found anything to help you in the documentation.\n" "\n" " o freetype-devel@nongnu.org\n" "\n" " Discusses bugs, as well as engine internals, design issues,\n" " specific licenses, porting, etc.\n" "\n" " Our home page can be found at\n" "\n" " http://www.freetype.org\n" "\n" "\n" "--- end of FTL.TXT ---"; #endif #ifdef USE_BUILDENV static const char *licenseHarfBuzzNG = "HarfBuzz is licensed under the so-called \"Old MIT\" license. Details follow.\n" "For parts of HarfBuzz that are licensed under different licenses see individual\n" "files names COPYING in subdirectories where applicable.\n" "\n" "Copyright © 2010,2011,2012 Google, Inc.\n" "Copyright © 2012 Mozilla Foundation\n" "Copyright © 2011 Codethink Limited\n" "Copyright © 2008,2010 Nokia Corporation and/or its subsidiary(-ies)\n" "Copyright © 2009 Keith Stribley\n" "Copyright © 2009 Martin Hosken and SIL International\n" "Copyright © 2007 Chris Wilson\n" "Copyright © 2006 Behdad Esfahbod\n" "Copyright © 2005 David Turner\n" "Copyright © 2004,2007,2008,2009,2010 Red Hat, Inc.\n" "Copyright © 1998-2004 David Turner and Werner Lemberg\n" "\n" "For full copyright notices consult the individual files in the package.\n" "\n" "\n" "Permission is hereby granted, without written agreement and without\n" "license or royalty fees, to use, copy, modify, and distribute this\n" "software and its documentation for any purpose, provided that the\n" "above copyright notice and the following two paragraphs appear in\n" "all copies of this software.\n" "\n" "IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR\n" "DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES\n" "ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN\n" "IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH\n" "DAMAGE.\n" "\n" "THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,\n" "BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND\n" "FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS\n" "ON AN \"AS IS\" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO\n" "PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS."; #endif #ifdef USE_BUILDENV static const char *licenseLibPNG = "\n" "This copy of the libpng notices is provided for your convenience. In case of\n" "any discrepancy between this copy and the notices in the file png.h that is\n" "included in the libpng distribution, the latter shall prevail.\n" "\n" "COPYRIGHT NOTICE, DISCLAIMER, and LICENSE:\n" "\n" "If you modify libpng you may insert additional notices immediately following\n" "this sentence.\n" "\n" "This code is released under the libpng license.\n" "\n" "libpng versions 1.0.7, July 1, 2000 through 1.6.28, January 5, 2017 are\n" "Copyright (c) 2000-2002, 2004, 2006-2017 Glenn Randers-Pehrson, are\n" "derived from libpng-1.0.6, and are distributed according to the same\n" "disclaimer and license as libpng-1.0.6 with the following individuals\n" "added to the list of Contributing Authors:\n" "\n" " Simon-Pierre Cadieux\n" " Eric S. Raymond\n" " Mans Rullgard\n" " Cosmin Truta\n" " Gilles Vollant\n" " James Yu\n" " Mandar Sahastrabuddhe\n" "\n" "and with the following additions to the disclaimer:\n" "\n" " There is no warranty against interference with your enjoyment of the\n" " library or against infringement. There is no warranty that our\n" " efforts or the library will fulfill any of your particular purposes\n" " or needs. This library is provided with all faults, and the entire\n" " risk of satisfactory quality, performance, accuracy, and effort is with\n" " the user.\n" "\n" "Some files in the \"contrib\" directory and some configure-generated\n" "files that are distributed with libpng have other copyright owners and\n" "are released under other open source licenses.\n" "\n" "libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are\n" "Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from\n" "libpng-0.96, and are distributed according to the same disclaimer and\n" "license as libpng-0.96, with the following individuals added to the list\n" "of Contributing Authors:\n" "\n" " Tom Lane\n" " Glenn Randers-Pehrson\n" " Willem van Schaik\n" "\n" "libpng versions 0.89, June 1996, through 0.96, May 1997, are\n" "Copyright (c) 1996-1997 Andreas Dilger, are derived from libpng-0.88,\n" "and are distributed according to the same disclaimer and license as\n" "libpng-0.88, with the following individuals added to the list of\n" "Contributing Authors:\n" "\n" " John Bowler\n" " Kevin Bracey\n" " Sam Bushell\n" " Magnus Holmgren\n" " Greg Roelofs\n" " Tom Tanner\n" "\n" "Some files in the \"scripts\" directory have other copyright owners\n" "but are released under this license.\n" "\n" "libpng versions 0.5, May 1995, through 0.88, January 1996, are\n" "Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.\n" "\n" "For the purposes of this copyright and license, \"Contributing Authors\"\n" "is defined as the following set of individuals:\n" "\n" " Andreas Dilger\n" " Dave Martindale\n" " Guy Eric Schalnat\n" " Paul Schmidt\n" " Tim Wegner\n" "\n" "The PNG Reference Library is supplied \"AS IS\". The Contributing Authors\n" "and Group 42, Inc. disclaim all warranties, expressed or implied,\n" "including, without limitation, the warranties of merchantability and of\n" "fitness for any purpose. The Contributing Authors and Group 42, Inc.\n" "assume no liability for direct, indirect, incidental, special, exemplary,\n" "or consequential damages, which may result from the use of the PNG\n" "Reference Library, even if advised of the possibility of such damage.\n" "\n" "Permission is hereby granted to use, copy, modify, and distribute this\n" "source code, or portions hereof, for any purpose, without fee, subject\n" "to the following restrictions:\n" "\n" " 1. The origin of this source code must not be misrepresented.\n" "\n" " 2. Altered versions must be plainly marked as such and must not\n" " be misrepresented as being the original source.\n" "\n" " 3. This Copyright notice may not be removed or altered from any\n" " source or altered source distribution.\n" "\n" "The Contributing Authors and Group 42, Inc. specifically permit, without\n" "fee, and encourage the use of this source code as a component to\n" "supporting the PNG file format in commercial products. If you use this\n" "source code in a product, acknowledgment is not required but would be\n" "appreciated.\n" "\n" "END OF COPYRIGHT NOTICE, DISCLAIMER, and LICENSE.\n" "\n" "TRADEMARK:\n" "\n" "The name \"libpng\" has not been registered by the Copyright owner\n" "as a trademark in any jurisdiction. However, because libpng has\n" "been distributed and maintained world-wide, continually since 1995,\n" "the Copyright owner claims \"common-law trademark protection\" in any\n" "jurisdiction where common-law trademark is recognized.\n" "\n" "OSI CERTIFICATION:\n" "\n" "Libpng is OSI Certified Open Source Software. OSI Certified Open Source is\n" "a certification mark of the Open Source Initiative. OSI has not addressed\n" "the additional disclaimers inserted at version 1.0.7.\n" "\n" "EXPORT CONTROL:\n" "\n" "The Copyright owner believes that the Export Control Classification\n" "Number (ECCN) for libpng is EAR99, which means not subject to export\n" "controls or International Traffic in Arms Regulations (ITAR) because\n" "it is open source, publicly available software, that does not contain\n" "any encryption software. See the EAR, paragraphs 734.3(b)(3) and\n" "734.7(b).\n" "\n" "Glenn Randers-Pehrson\n" "glennrp at users.sourceforge.net\n" "January 5, 2017"; #endif #ifdef USE_BUILDENV static const char *licenseLibjpegTurbo = "libjpeg-turbo is covered by three compatible BSD-style open source licenses:\n" "\n" "1. The IJG (Independent JPEG Group) License.\n" " This license applies to the libjpeg API library and associated programs\n" " (any code inherited from libjpeg, and any modifications to that code.)\n" "\n" "2. The Modified (3-clause) BSD License\n" " This license covers the TurboJPEG API library and associated programs.\n" "\n" "3. The zlib License\n" " This license is a subset of the other two, and it covers the libjpeg-turbo\n" " SIMD extensions.\n" "\n" "-----BEGIN IJG LICENSE-----\n" "libjpeg-turbo note: This file has been modified by The libjpeg-turbo Project\n" "to include only information relevant to libjpeg-turbo, to wordsmith certain\n" "sections, and to remove impolitic language that existed in the libjpeg v8\n" "README. It is included only for reference. Please see README.md for\n" "information specific to libjpeg-turbo.\n" "\n" "\n" "The Independent JPEG Group's JPEG software\n" "==========================================\n" "\n" "This distribution contains a release of the Independent JPEG Group's free JPEG\n" "software. You are welcome to redistribute this software and to use it for any\n" "purpose, subject to the conditions under LEGAL ISSUES, below.\n" "\n" "This software is the work of Tom Lane, Guido Vollbeding, Philip Gladstone,\n" "Bill Allombert, Jim Boucher, Lee Crocker, Bob Friesenhahn, Ben Jackson,\n" "Julian Minguillon, Luis Ortiz, George Phillips, Davide Rossi, Ge' Weijers,\n" "and other members of the Independent JPEG Group.\n" "\n" "IJG is not affiliated with the ISO/IEC JTC1/SC29/WG1 standards committee\n" "(also known as JPEG, together with ITU-T SG16).\n" "\n" "\n" "DOCUMENTATION ROADMAP\n" "=====================\n" "\n" "This file contains the following sections:\n" "\n" "OVERVIEW General description of JPEG and the IJG software.\n" "LEGAL ISSUES Copyright, lack of warranty, terms of distribution.\n" "REFERENCES Where to learn more about JPEG.\n" "ARCHIVE LOCATIONS Where to find newer versions of this software.\n" "FILE FORMAT WARS Software *not* to get.\n" "TO DO Plans for future IJG releases.\n" "\n" "Other documentation files in the distribution are:\n" "\n" "User documentation:\n" " usage.txt Usage instructions for cjpeg, djpeg, jpegtran,\n" " rdjpgcom, and wrjpgcom.\n" " *.1 Unix-style man pages for programs (same info as usage.txt).\n" " wizard.txt Advanced usage instructions for JPEG wizards only.\n" " change.log Version-to-version change highlights.\n" "Programmer and internal documentation:\n" " libjpeg.txt How to use the JPEG library in your own programs.\n" " example.c Sample code for calling the JPEG library.\n" " structure.txt Overview of the JPEG library's internal structure.\n" " coderules.txt Coding style rules --- please read if you contribute code.\n" "\n" "Please read at least usage.txt. Some information can also be found in the JPEG\n" "FAQ (Frequently Asked Questions) article. See ARCHIVE LOCATIONS below to find\n" "out where to obtain the FAQ article.\n" "\n" "If you want to understand how the JPEG code works, we suggest reading one or\n" "more of the REFERENCES, then looking at the documentation files (in roughly\n" "the order listed) before diving into the code.\n" "\n" "\n" "OVERVIEW\n" "========\n" "\n" "This package contains C software to implement JPEG image encoding, decoding,\n" "and transcoding. JPEG (pronounced \"jay-peg\") is a standardized compression\n" "method for full-color and grayscale images. JPEG's strong suit is compressing\n" "photographic images or other types of images that have smooth color and\n" "brightness transitions between neighboring pixels. Images with sharp lines or\n" "other abrupt features may not compress well with JPEG, and a higher JPEG\n" "quality may have to be used to avoid visible compression artifacts with such\n" "images.\n" "\n" "JPEG is lossy, meaning that the output pixels are not necessarily identical to\n" "the input pixels. However, on photographic content and other \"smooth\" images,\n" "very good compression ratios can be obtained with no visible compression\n" "artifacts, and extremely high compression ratios are possible if you are\n" "willing to sacrifice image quality (by reducing the \"quality\" setting in the\n" "compressor.)\n" "\n" "This software implements JPEG baseline, extended-sequential, and progressive\n" "compression processes. Provision is made for supporting all variants of these\n" "processes, although some uncommon parameter settings aren't implemented yet.\n" "We have made no provision for supporting the hierarchical or lossless\n" "processes defined in the standard.\n" "\n" "We provide a set of library routines for reading and writing JPEG image files,\n" "plus two sample applications \"cjpeg\" and \"djpeg\", which use the library to\n" "perform conversion between JPEG and some other popular image file formats.\n" "The library is intended to be reused in other applications.\n" "\n" "In order to support file conversion and viewing software, we have included\n" "considerable functionality beyond the bare JPEG coding/decoding capability;\n" "for example, the color quantization modules are not strictly part of JPEG\n" "decoding, but they are essential for output to colormapped file formats or\n" "colormapped displays. These extra functions can be compiled out of the\n" "library if not required for a particular application.\n" "\n" "We have also included \"jpegtran\", a utility for lossless transcoding between\n" "different JPEG processes, and \"rdjpgcom\" and \"wrjpgcom\", two simple\n" "applications for inserting and extracting textual comments in JFIF files.\n" "\n" "The emphasis in designing this software has been on achieving portability and\n" "flexibility, while also making it fast enough to be useful. In particular,\n" "the software is not intended to be read as a tutorial on JPEG. (See the\n" "REFERENCES section for introductory material.) Rather, it is intended to\n" "be reliable, portable, industrial-strength code. We do not claim to have\n" "achieved that goal in every aspect of the software, but we strive for it.\n" "\n" "We welcome the use of this software as a component of commercial products.\n" "No royalty is required, but we do ask for an acknowledgement in product\n" "documentation, as described under LEGAL ISSUES.\n" "\n" "\n" "LEGAL ISSUES\n" "============\n" "\n" "In plain English:\n" "\n" "1. We don't promise that this software works. (But if you find any bugs,\n" " please let us know!)\n" "2. You can use this software for whatever you want. You don't have to pay us.\n" "3. You may not pretend that you wrote this software. If you use it in a\n" " program, you must acknowledge somewhere in your documentation that\n" " you've used the IJG code.\n" "\n" "In legalese:\n" "\n" "The authors make NO WARRANTY or representation, either express or implied,\n" "with respect to this software, its quality, accuracy, merchantability, or\n" "fitness for a particular purpose. This software is provided \"AS IS\", and you,\n" "its user, assume the entire risk as to its quality and accuracy.\n" "\n" "This software is copyright (C) 1991-2016, Thomas G. Lane, Guido Vollbeding.\n" "All Rights Reserved except as specified below.\n" "\n" "Permission is hereby granted to use, copy, modify, and distribute this\n" "software (or portions thereof) for any purpose, without fee, subject to these\n" "conditions:\n" "(1) If any part of the source code for this software is distributed, then this\n" "README file must be included, with this copyright and no-warranty notice\n" "unaltered; and any additions, deletions, or changes to the original files\n" "must be clearly indicated in accompanying documentation.\n" "(2) If only executable code is distributed, then the accompanying\n" "documentation must state that \"this software is based in part on the work of\n" "the Independent JPEG Group\".\n" "(3) Permission for use of this software is granted only if the user accepts\n" "full responsibility for any undesirable consequences; the authors accept\n" "NO LIABILITY for damages of any kind.\n" "\n" "These conditions apply to any software derived from or based on the IJG code,\n" "not just to the unmodified library. If you use our work, you ought to\n" "acknowledge us.\n" "\n" "Permission is NOT granted for the use of any IJG author's name or company name\n" "in advertising or publicity relating to this software or products derived from\n" "it. This software may be referred to only as \"the Independent JPEG Group's\n" "software\".\n" "\n" "We specifically permit and encourage the use of this software as the basis of\n" "commercial products, provided that all warranty or liability claims are\n" "assumed by the product vendor.\n" "\n" "\n" "The Unix configuration script \"configure\" was produced with GNU Autoconf.\n" "It is copyright by the Free Software Foundation but is freely distributable.\n" "The same holds for its supporting scripts (config.guess, config.sub,\n" "ltmain.sh). Another support script, install-sh, is copyright by X Consortium\n" "but is also freely distributable.\n" "\n" "The IJG distribution formerly included code to read and write GIF files.\n" "To avoid entanglement with the Unisys LZW patent (now expired), GIF reading\n" "support has been removed altogether, and the GIF writer has been simplified\n" "to produce \"uncompressed GIFs\". This technique does not use the LZW\n" "algorithm; the resulting GIF files are larger than usual, but are readable\n" "by all standard GIF decoders.\n" "\n" "We are required to state that\n" " \"The Graphics Interchange Format(c) is the Copyright property of\n" " CompuServe Incorporated. GIF(sm) is a Service Mark property of\n" " CompuServe Incorporated.\"\n" "\n" "\n" "REFERENCES\n" "==========\n" "\n" "We recommend reading one or more of these references before trying to\n" "understand the innards of the JPEG software.\n" "\n" "The best short technical introduction to the JPEG compression algorithm is\n" " Wallace, Gregory K. \"The JPEG Still Picture Compression Standard\",\n" " Communications of the ACM, April 1991 (vol. 34 no. 4), pp. 30-44.\n" "(Adjacent articles in that issue discuss MPEG motion picture compression,\n" "applications of JPEG, and related topics.) If you don't have the CACM issue\n" "handy, a PDF file containing a revised version of Wallace's article is\n" "available at http://www.ijg.org/files/Wallace.JPEG.pdf. The file (actually\n" "a preprint for an article that appeared in IEEE Trans. Consumer Electronics)\n" "omits the sample images that appeared in CACM, but it includes corrections\n" "and some added material. Note: the Wallace article is copyright ACM and IEEE,\n" "and it may not be used for commercial purposes.\n" "\n" "A somewhat less technical, more leisurely introduction to JPEG can be found in\n" "\"The Data Compression Book\" by Mark Nelson and Jean-loup Gailly, published by\n" "M&T Books (New York), 2nd ed. 1996, ISBN 1-55851-434-1. This book provides\n" "good explanations and example C code for a multitude of compression methods\n" "including JPEG. It is an excellent source if you are comfortable reading C\n" "code but don't know much about data compression in general. The book's JPEG\n" "sample code is far from industrial-strength, but when you are ready to look\n" "at a full implementation, you've got one here...\n" "\n" "The best currently available description of JPEG is the textbook \"JPEG Still\n" "Image Data Compression Standard\" by William B. Pennebaker and Joan L.\n" "Mitchell, published by Van Nostrand Reinhold, 1993, ISBN 0-442-01272-1.\n" "Price US$59.95, 638 pp. The book includes the complete text of the ISO JPEG\n" "standards (DIS 10918-1 and draft DIS 10918-2).\n" "\n" "The original JPEG standard is divided into two parts, Part 1 being the actual\n" "specification, while Part 2 covers compliance testing methods. Part 1 is\n" "titled \"Digital Compression and Coding of Continuous-tone Still Images,\n" "Part 1: Requirements and guidelines\" and has document numbers ISO/IEC IS\n" "10918-1, ITU-T T.81. Part 2 is titled \"Digital Compression and Coding of\n" "Continuous-tone Still Images, Part 2: Compliance testing\" and has document\n" "numbers ISO/IEC IS 10918-2, ITU-T T.83.\n" "\n" "The JPEG standard does not specify all details of an interchangeable file\n" "format. For the omitted details we follow the \"JFIF\" conventions, revision\n" "1.02. JFIF 1.02 has been adopted as an Ecma International Technical Report\n" "and thus received a formal publication status. It is available as a free\n" "download in PDF format from\n" "http://www.ecma-international.org/publications/techreports/E-TR-098.htm.\n" "A PostScript version of the JFIF document is available at\n" "http://www.ijg.org/files/jfif.ps.gz. There is also a plain text version at\n" "http://www.ijg.org/files/jfif.txt.gz, but it is missing the figures.\n" "\n" "The TIFF 6.0 file format specification can be obtained by FTP from\n" "ftp://ftp.sgi.com/graphics/tiff/TIFF6.ps.gz. The JPEG incorporation scheme\n" "found in the TIFF 6.0 spec of 3-June-92 has a number of serious problems.\n" "IJG does not recommend use of the TIFF 6.0 design (TIFF Compression tag 6).\n" "Instead, we recommend the JPEG design proposed by TIFF Technical Note #2\n" "(Compression tag 7). Copies of this Note can be obtained from\n" "http://www.ijg.org/files/. It is expected that the next revision\n" "of the TIFF spec will replace the 6.0 JPEG design with the Note's design.\n" "Although IJG's own code does not support TIFF/JPEG, the free libtiff library\n" "uses our library to implement TIFF/JPEG per the Note.\n" "\n" "\n" "ARCHIVE LOCATIONS\n" "=================\n" "\n" "The \"official\" archive site for this software is www.ijg.org.\n" "The most recent released version can always be found there in\n" "directory \"files\".\n" "\n" "The JPEG FAQ (Frequently Asked Questions) article is a source of some\n" "general information about JPEG.\n" "It is available on the World Wide Web at http://www.faqs.org/faqs/jpeg-faq/\n" "and other news.answers archive sites, including the official news.answers\n" "archive at rtfm.mit.edu: ftp://rtfm.mit.edu/pub/usenet/news.answers/jpeg-faq/.\n" "If you don't have Web or FTP access, send e-mail to mail-server@rtfm.mit.edu\n" "with body\n" " send usenet/news.answers/jpeg-faq/part1\n" " send usenet/news.answers/jpeg-faq/part2\n" "\n" "\n" "FILE FORMAT WARS\n" "================\n" "\n" "The ISO/IEC JTC1/SC29/WG1 standards committee (also known as JPEG, together\n" "with ITU-T SG16) currently promotes different formats containing the name\n" "\"JPEG\" which are incompatible with original DCT-based JPEG. IJG therefore does\n" "not support these formats (see REFERENCES). Indeed, one of the original\n" "reasons for developing this free software was to help force convergence on\n" "common, interoperable format standards for JPEG files.\n" "Don't use an incompatible file format!\n" "(In any case, our decoder will remain capable of reading existing JPEG\n" "image files indefinitely.)\n" "\n" "\n" "TO DO\n" "=====\n" "\n" "Please send bug reports, offers of help, etc. to jpeg-info@jpegclub.org.\n" "-----END IJG LICENSE-----\n" "\n" "-----BEGIN TURBOJPEG LICENSE-----\n" "/*\n" " * Copyright (C)2009-2016 D. R. Commander. All Rights Reserved.\n" " *\n" " * Redistribution and use in source and binary forms, with or without\n" " * modification, are permitted provided that the following conditions are met:\n" " *\n" " * - Redistributions of source code must retain the above copyright notice,\n" " * this list of conditions and the following disclaimer.\n" " * - Redistributions in binary form must reproduce the above copyright notice,\n" " * this list of conditions and the following disclaimer in the documentation\n" " * and/or other materials provided with the distribution.\n" " * - Neither the name of the libjpeg-turbo Project nor the names of its\n" " * contributors may be used to endorse or promote products derived from this\n" " * software without specific prior written permission.\n" " *\n" " * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\",\n" " * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n" " * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n" " * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE\n" " * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n" " * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n" " * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n" " * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n" " * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n" " * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n" " * POSSIBILITY OF SUCH DAMAGE.\n" " */\n" "-----END TURBOJPEG LICENSE-----\n" "\n" "\n" "-----BEGIN ZLIB LICENSE-----\n" "; Copyright 2009 Pierre Ossman for Cendio AB\n" "; Copyright (C) 2010, D. R. Commander.\n" ";\n" "; Based on the x86 SIMD extension for IJG JPEG library - version 1.02\n" ";\n" "; Copyright (C) 1999-2006, MIYASAKA Masaru.\n" ";\n" "; This software is provided 'as-is', without any express or implied\n" "; warranty. In no event will the authors be held liable for any damages\n" "; arising from the use of this software.\n" ";\n" "; Permission is granted to anyone to use this software for any purpose,\n" "; including commercial applications, and to alter it and redistribute it\n" "; freely, subject to the following restrictions:\n" ";\n" "; 1. The origin of this software must not be misrepresented; you must not\n" "; claim that you wrote the original software. If you use this software\n" "; in a product, an acknowledgment in the product documentation would be\n" "; appreciated but is not required.\n" "; 2. Altered source versions must be plainly marked as such, and must not be\n" "; misrepresented as being the original software.\n" "; 3. This notice may not be removed or altered from any source distribution.\n" "-----END ZLIB LICENSE-----"; #endif #ifdef USE_BUILDENV static const char *licenseZeroCIce = "Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.\n" "\n" "This copy of Ice is free software; you can redistribute it and/or modify\n" "it under the terms of the GNU General Public License version 2 as\n" "published by the Free Software Foundation.\n" "\n" "Ice is distributed in the hope that it will be useful, but WITHOUT ANY\n" "WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n" "FOR A PARTICULAR PURPOSE. See the GNU General Public License for more\n" "details.\n" "\n" "You should have received a copy of the GNU General Public License version\n" "2 along with this program; if not, see http://www.gnu.org/licenses.\n" "\n" "Linking Ice statically or dynamically with other software (such as a \n" "library, module or application) is making a combined work based on Ice. \n" "Thus, the terms and conditions of the GNU General Public License version\n" "2 cover this combined work.\n" "\n" "If such software can only be used together with Ice, then not only the \n" "combined work but the software itself is a work derived from Ice and as\n" "such shall be licensed under the terms of the GNU General Public License \n" "version 2. This includes the situation where Ice is only being used \n" "through an abstraction layer.\n" "\n" "As a special exception to the above, ZeroC grants to the copyright \n" "holders and contributors of the Mumble project (http://www.mumble.info) \n" "the permission to license the Ice-based software they contribute to \n" "Mumble under the terms of the BSD license. This exception does not extend\n" "to the parts of Ice used by Mumble, or to any other derived work: as a \n" "whole, any work based on Ice shall be licensed under the terms and \n" "conditions of the GNU General Public License version 2.\n" "\n" "You may also combine Ice with any software not derived from Ice, provided\n" "the license of such software is compatible with the GNU General Public \n" "License version 2. In addition, as a special exception, ZeroC grants you\n" "permission to combine Ice with:\n" " \n" " - the OpenSSL library, or with a modified version of the OpenSSL library\n" " that uses the same license as OpenSSL\n" "\n" " - any library not derived from Ice and licensed under the terms of\n" " the Apache License, version 2.0 \n" " (http://www.apache.org/licenses/LICENSE-2.0.html) \n" "\n" "If you modify this copy of Ice, you may extend any of the exceptions \n" "provided above to your version of Ice, but you are not obligated to \n" "do so."; #endif #ifdef USE_BUILDENV static const char *licenseMcpp = "/*-\n" " * Copyright (c) 1998, 2002-2008 Kiyoshi Matsui \n" " * All rights reserved.\n" " *\n" " * This software including the files in this directory is provided under\n" " * the following license.\n" " *\n" " * Redistribution and use in source and binary forms, with or without\n" " * modification, are permitted provided that the following conditions\n" " * are met:\n" " * 1. Redistributions of source code must retain the above copyright\n" " * notice, this list of conditions and the following disclaimer.\n" " * 2. Redistributions in binary form must reproduce the above copyright\n" " * notice, this list of conditions and the following disclaimer in the\n" " * documentation and/or other materials provided with the distribution.\n" " *\n" " * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND\n" " * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n" " * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n" " * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE\n" " * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n" " * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n" " * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n" " * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n" " * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n" " * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n" " * SUCH DAMAGE.\n" " */"; #endif #ifdef USE_BUILDENV static const char *licenseMDNSResponder = "The majority of the source code in the mDNSResponder project is licensed\n" "under the terms of the Apache License, Version 2.0, available from:\n" " \n" "\n" "To accommodate license compatibility with the widest possible range\n" "of client code licenses, the shared library code, which is linked\n" "at runtime into the same address space as the client using it, is\n" "licensed under the terms of the \"Three-Clause BSD License\".\n" "\n" "The Linux Name Service Switch code, contributed by National ICT\n" "Australia Ltd (NICTA) is licensed under the terms of the NICTA Public\n" "Software Licence (which is substantially similar to the \"Three-Clause\n" "BSD License\", with some additional language pertaining to Australian law)."; #endif #ifdef USE_BUILDENV static const char *licensePCRE = "PCRE LICENCE\n" "------------\n" "\n" "PCRE is a library of functions to support regular expressions whose syntax\n" "and semantics are as close as possible to those of the Perl 5 language.\n" "\n" "Release 8 of PCRE is distributed under the terms of the \"BSD\" licence, as\n" "specified below. The documentation for PCRE, supplied in the \"doc\"\n" "directory, is distributed under the same terms as the software itself. The data\n" "in the testdata directory is not copyrighted and is in the public domain.\n" "\n" "The basic library functions are written in C and are freestanding. Also\n" "included in the distribution is a set of C++ wrapper functions, and a\n" "just-in-time compiler that can be used to optimize pattern matching. These\n" "are both optional features that can be omitted when the library is built.\n" "\n" "\n" "THE BASIC LIBRARY FUNCTIONS\n" "---------------------------\n" "\n" "Written by: Philip Hazel\n" "Email local part: ph10\n" "Email domain: cam.ac.uk\n" "\n" "University of Cambridge Computing Service,\n" "Cambridge, England.\n" "\n" "Copyright (c) 1997-2017 University of Cambridge\n" "All rights reserved.\n" "\n" "\n" "PCRE JUST-IN-TIME COMPILATION SUPPORT\n" "-------------------------------------\n" "\n" "Written by: Zoltan Herczeg\n" "Email local part: hzmester\n" "Emain domain: freemail.hu\n" "\n" "Copyright(c) 2010-2017 Zoltan Herczeg\n" "All rights reserved.\n" "\n" "\n" "STACK-LESS JUST-IN-TIME COMPILER\n" "--------------------------------\n" "\n" "Written by: Zoltan Herczeg\n" "Email local part: hzmester\n" "Emain domain: freemail.hu\n" "\n" "Copyright(c) 2009-2017 Zoltan Herczeg\n" "All rights reserved.\n" "\n" "\n" "THE C++ WRAPPER FUNCTIONS\n" "-------------------------\n" "\n" "Contributed by: Google Inc.\n" "\n" "Copyright (c) 2007-2012, Google Inc.\n" "All rights reserved.\n" "\n" "\n" "THE \"BSD\" LICENCE\n" "-----------------\n" "\n" "Redistribution and use in source and binary forms, with or without\n" "modification, are permitted provided that the following conditions are met:\n" "\n" " * Redistributions of source code must retain the above copyright notice,\n" " this list of conditions and the following disclaimer.\n" "\n" " * Redistributions in binary form must reproduce the above copyright\n" " notice, this list of conditions and the following disclaimer in the\n" " documentation and/or other materials provided with the distribution.\n" "\n" " * Neither the name of the University of Cambridge nor the name of Google\n" " Inc. nor the names of their contributors may be used to endorse or\n" " promote products derived from this software without specific prior\n" " written permission.\n" "\n" "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n" "AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n" "IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n" "ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n" "LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n" "CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n" "SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n" "INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n" "CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n" "ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n" "POSSIBILITY OF SUCH DAMAGE.\n" "\n" "End"; #endif #ifdef USE_BUILDENV static const char *licenseQt = " GNU LESSER GENERAL PUBLIC LICENSE\n" "\n" " The Qt Toolkit is Copyright (C) 2015 The Qt Company Ltd.\n" " Contact: http://www.qt.io/licensing/\n" "\n" " You may use, distribute and copy the Qt Toolkit under the terms of\n" " GNU Lesser General Public License version 2.1, which is displayed below.\n" "\n" "-------------------------------------------------------------------------\n" "\n" " GNU LESSER GENERAL PUBLIC LICENSE\n" " Version 2.1, February 1999\n" "\n" " Copyright (C) 1991, 1999 Free Software Foundation, Inc.\n" " 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n" " Everyone is permitted to copy and distribute verbatim copies\n" " of this license document, but changing it is not allowed.\n" "\n" "[This is the first released version of the Lesser GPL. It also counts\n" " as the successor of the GNU Library Public License, version 2, hence\n" " the version number 2.1.]\n" "\n" " Preamble\n" "\n" " The licenses for most software are designed to take away your\n" "freedom to share and change it. By contrast, the GNU General Public\n" "Licenses are intended to guarantee your freedom to share and change\n" "free software--to make sure the software is free for all its users.\n" "\n" " This license, the Lesser General Public License, applies to some\n" "specially designated software packages--typically libraries--of the\n" "Free Software Foundation and other authors who decide to use it. You\n" "can use it too, but we suggest you first think carefully about whether\n" "this license or the ordinary General Public License is the better\n" "strategy to use in any particular case, based on the explanations below.\n" "\n" " When we speak of free software, we are referring to freedom of use,\n" "not price. Our General Public Licenses are designed to make sure that\n" "you have the freedom to distribute copies of free software (and charge\n" "for this service if you wish); that you receive source code or can get\n" "it if you want it; that you can change the software and use pieces of\n" "it in new free programs; and that you are informed that you can do\n" "these things.\n" "\n" " To protect your rights, we need to make restrictions that forbid\n" "distributors to deny you these rights or to ask you to surrender these\n" "rights. These restrictions translate to certain responsibilities for\n" "you if you distribute copies of the library or if you modify it.\n" "\n" " For example, if you distribute copies of the library, whether gratis\n" "or for a fee, you must give the recipients all the rights that we gave\n" "you. You must make sure that they, too, receive or can get the source\n" "code. If you link other code with the library, you must provide\n" "complete object files to the recipients, so that they can relink them\n" "with the library after making changes to the library and recompiling\n" "it. And you must show them these terms so they know their rights.\n" "\n" " We protect your rights with a two-step method: (1) we copyright the\n" "library, and (2) we offer you this license, which gives you legal\n" "permission to copy, distribute and/or modify the library.\n" "\n" " To protect each distributor, we want to make it very clear that\n" "there is no warranty for the free library. Also, if the library is\n" "modified by someone else and passed on, the recipients should know\n" "that what they have is not the original version, so that the original\n" "author's reputation will not be affected by problems that might be\n" "introduced by others.\n" "\n" " Finally, software patents pose a constant threat to the existence of\n" "any free program. We wish to make sure that a company cannot\n" "effectively restrict the users of a free program by obtaining a\n" "restrictive license from a patent holder. Therefore, we insist that\n" "any patent license obtained for a version of the library must be\n" "consistent with the full freedom of use specified in this license.\n" "\n" " Most GNU software, including some libraries, is covered by the\n" "ordinary GNU General Public License. This license, the GNU Lesser\n" "General Public License, applies to certain designated libraries, and\n" "is quite different from the ordinary General Public License. We use\n" "this license for certain libraries in order to permit linking those\n" "libraries into non-free programs.\n" "\n" " When a program is linked with a library, whether statically or using\n" "a shared library, the combination of the two is legally speaking a\n" "combined work, a derivative of the original library. The ordinary\n" "General Public License therefore permits such linking only if the\n" "entire combination fits its criteria of freedom. The Lesser General\n" "Public License permits more lax criteria for linking other code with\n" "the library.\n" "\n" " We call this license the \"Lesser\" General Public License because it\n" "does Less to protect the user's freedom than the ordinary General\n" "Public License. It also provides other free software developers Less\n" "of an advantage over competing non-free programs. These disadvantages\n" "are the reason we use the ordinary General Public License for many\n" "libraries. However, the Lesser license provides advantages in certain\n" "special circumstances.\n" "\n" " For example, on rare occasions, there may be a special need to\n" "encourage the widest possible use of a certain library, so that it becomes\n" "a de-facto standard. To achieve this, non-free programs must be\n" "allowed to use the library. A more frequent case is that a free\n" "library does the same job as widely used non-free libraries. In this\n" "case, there is little to gain by limiting the free library to free\n" "software only, so we use the Lesser General Public License.\n" "\n" " In other cases, permission to use a particular library in non-free\n" "programs enables a greater number of people to use a large body of\n" "free software. For example, permission to use the GNU C Library in\n" "non-free programs enables many more people to use the whole GNU\n" "operating system, as well as its variant, the GNU/Linux operating\n" "system.\n" "\n" " Although the Lesser General Public License is Less protective of the\n" "users' freedom, it does ensure that the user of a program that is\n" "linked with the Library has the freedom and the wherewithal to run\n" "that program using a modified version of the Library.\n" "\n" " The precise terms and conditions for copying, distribution and\n" "modification follow. Pay close attention to the difference between a\n" "\"work based on the library\" and a \"work that uses the library\". The\n" "former contains code derived from the library, whereas the latter must\n" "be combined with the library in order to run.\n" "\n" " GNU LESSER GENERAL PUBLIC LICENSE\n" " TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n" "\n" " 0. This License Agreement applies to any software library or other\n" "program which contains a notice placed by the copyright holder or\n" "other authorized party saying it may be distributed under the terms of\n" "this Lesser General Public License (also called \"this License\").\n" "Each licensee is addressed as \"you\".\n" "\n" " A \"library\" means a collection of software functions and/or data\n" "prepared so as to be conveniently linked with application programs\n" "(which use some of those functions and data) to form executables.\n" "\n" " The \"Library\", below, refers to any such software library or work\n" "which has been distributed under these terms. A \"work based on the\n" "Library\" means either the Library or any derivative work under\n" "copyright law: that is to say, a work containing the Library or a\n" "portion of it, either verbatim or with modifications and/or translated\n" "straightforwardly into another language. (Hereinafter, translation is\n" "included without limitation in the term \"modification\".)\n" "\n" " \"Source code\" for a work means the preferred form of the work for\n" "making modifications to it. For a library, complete source code means\n" "all the source code for all modules it contains, plus any associated\n" "interface definition files, plus the scripts used to control compilation\n" "and installation of the library.\n" "\n" " Activities other than copying, distribution and modification are not\n" "covered by this License; they are outside its scope. The act of\n" "running a program using the Library is not restricted, and output from\n" "such a program is covered only if its contents constitute a work based\n" "on the Library (independent of the use of the Library in a tool for\n" "writing it). Whether that is true depends on what the Library does\n" "and what the program that uses the Library does.\n" "\n" " 1. You may copy and distribute verbatim copies of the Library's\n" "complete source code as you receive it, in any medium, provided that\n" "you conspicuously and appropriately publish on each copy an\n" "appropriate copyright notice and disclaimer of warranty; keep intact\n" "all the notices that refer to this License and to the absence of any\n" "warranty; and distribute a copy of this License along with the\n" "Library.\n" "\n" " You may charge a fee for the physical act of transferring a copy,\n" "and you may at your option offer warranty protection in exchange for a\n" "fee.\n" "\n" " 2. You may modify your copy or copies of the Library or any portion\n" "of it, thus forming a work based on the Library, and copy and\n" "distribute such modifications or work under the terms of Section 1\n" "above, provided that you also meet all of these conditions:\n" "\n" " a) The modified work must itself be a software library.\n" "\n" " b) You must cause the files modified to carry prominent notices\n" " stating that you changed the files and the date of any change.\n" "\n" " c) You must cause the whole of the work to be licensed at no\n" " charge to all third parties under the terms of this License.\n" "\n" " d) If a facility in the modified Library refers to a function or a\n" " table of data to be supplied by an application program that uses\n" " the facility, other than as an argument passed when the facility\n" " is invoked, then you must make a good faith effort to ensure that,\n" " in the event an application does not supply such function or\n" " table, the facility still operates, and performs whatever part of\n" " its purpose remains meaningful.\n" "\n" " (For example, a function in a library to compute square roots has\n" " a purpose that is entirely well-defined independent of the\n" " application. Therefore, Subsection 2d requires that any\n" " application-supplied function or table used by this function must\n" " be optional: if the application does not supply it, the square\n" " root function must still compute square roots.)\n" "\n" "These requirements apply to the modified work as a whole. If\n" "identifiable sections of that work are not derived from the Library,\n" "and can be reasonably considered independent and separate works in\n" "themselves, then this License, and its terms, do not apply to those\n" "sections when you distribute them as separate works. But when you\n" "distribute the same sections as part of a whole which is a work based\n" "on the Library, the distribution of the whole must be on the terms of\n" "this License, whose permissions for other licensees extend to the\n" "entire whole, and thus to each and every part regardless of who wrote\n" "it.\n" "\n" "Thus, it is not the intent of this section to claim rights or contest\n" "your rights to work written entirely by you; rather, the intent is to\n" "exercise the right to control the distribution of derivative or\n" "collective works based on the Library.\n" "\n" "In addition, mere aggregation of another work not based on the Library\n" "with the Library (or with a work based on the Library) on a volume of\n" "a storage or distribution medium does not bring the other work under\n" "the scope of this License.\n" "\n" " 3. You may opt to apply the terms of the ordinary GNU General Public\n" "License instead of this License to a given copy of the Library. To do\n" "this, you must alter all the notices that refer to this License, so\n" "that they refer to the ordinary GNU General Public License, version 2,\n" "instead of to this License. (If a newer version than version 2 of the\n" "ordinary GNU General Public License has appeared, then you can specify\n" "that version instead if you wish.) Do not make any other change in\n" "these notices.\n" "\n" " Once this change is made in a given copy, it is irreversible for\n" "that copy, so the ordinary GNU General Public License applies to all\n" "subsequent copies and derivative works made from that copy.\n" "\n" " This option is useful when you wish to copy part of the code of\n" "the Library into a program that is not a library.\n" "\n" " 4. You may copy and distribute the Library (or a portion or\n" "derivative of it, under Section 2) in object code or executable form\n" "under the terms of Sections 1 and 2 above provided that you accompany\n" "it with the complete corresponding machine-readable source code, which\n" "must be distributed under the terms of Sections 1 and 2 above on a\n" "medium customarily used for software interchange.\n" "\n" " If distribution of object code is made by offering access to copy\n" "from a designated place, then offering equivalent access to copy the\n" "source code from the same place satisfies the requirement to\n" "distribute the source code, even though third parties are not\n" "compelled to copy the source along with the object code.\n" "\n" " 5. A program that contains no derivative of any portion of the\n" "Library, but is designed to work with the Library by being compiled or\n" "linked with it, is called a \"work that uses the Library\". Such a\n" "work, in isolation, is not a derivative work of the Library, and\n" "therefore falls outside the scope of this License.\n" "\n" " However, linking a \"work that uses the Library\" with the Library\n" "creates an executable that is a derivative of the Library (because it\n" "contains portions of the Library), rather than a \"work that uses the\n" "library\". The executable is therefore covered by this License.\n" "Section 6 states terms for distribution of such executables.\n" "\n" " When a \"work that uses the Library\" uses material from a header file\n" "that is part of the Library, the object code for the work may be a\n" "derivative work of the Library even though the source code is not.\n" "Whether this is true is especially significant if the work can be\n" "linked without the Library, or if the work is itself a library. The\n" "threshold for this to be true is not precisely defined by law.\n" "\n" " If such an object file uses only numerical parameters, data\n" "structure layouts and accessors, and small macros and small inline\n" "functions (ten lines or less in length), then the use of the object\n" "file is unrestricted, regardless of whether it is legally a derivative\n" "work. (Executables containing this object code plus portions of the\n" "Library will still fall under Section 6.)\n" "\n" " Otherwise, if the work is a derivative of the Library, you may\n" "distribute the object code for the work under the terms of Section 6.\n" "Any executables containing that work also fall under Section 6,\n" "whether or not they are linked directly with the Library itself.\n" "\n" " 6. As an exception to the Sections above, you may also combine or\n" "link a \"work that uses the Library\" with the Library to produce a\n" "work containing portions of the Library, and distribute that work\n" "under terms of your choice, provided that the terms permit\n" "modification of the work for the customer's own use and reverse\n" "engineering for debugging such modifications.\n" "\n" " You must give prominent notice with each copy of the work that the\n" "Library is used in it and that the Library and its use are covered by\n" "this License. You must supply a copy of this License. If the work\n" "during execution displays copyright notices, you must include the\n" "copyright notice for the Library among them, as well as a reference\n" "directing the user to the copy of this License. Also, you must do one\n" "of these things:\n" "\n" " a) Accompany the work with the complete corresponding\n" " machine-readable source code for the Library including whatever\n" " changes were used in the work (which must be distributed under\n" " Sections 1 and 2 above); and, if the work is an executable linked\n" " with the Library, with the complete machine-readable \"work that\n" " uses the Library\", as object code and/or source code, so that the\n" " user can modify the Library and then relink to produce a modified\n" " executable containing the modified Library. (It is understood\n" " that the user who changes the contents of definitions files in the\n" " Library will not necessarily be able to recompile the application\n" " to use the modified definitions.)\n" "\n" " b) Use a suitable shared library mechanism for linking with the\n" " Library. A suitable mechanism is one that (1) uses at run time a\n" " copy of the library already present on the user's computer system,\n" " rather than copying library functions into the executable, and (2)\n" " will operate properly with a modified version of the library, if\n" " the user installs one, as long as the modified version is\n" " interface-compatible with the version that the work was made with.\n" "\n" " c) Accompany the work with a written offer, valid for at\n" " least three years, to give the same user the materials\n" " specified in Subsection 6a, above, for a charge no more\n" " than the cost of performing this distribution.\n" "\n" " d) If distribution of the work is made by offering access to copy\n" " from a designated place, offer equivalent access to copy the above\n" " specified materials from the same place.\n" "\n" " e) Verify that the user has already received a copy of these\n" " materials or that you have already sent this user a copy.\n" "\n" " For an executable, the required form of the \"work that uses the\n" "Library\" must include any data and utility programs needed for\n" "reproducing the executable from it. However, as a special exception,\n" "the materials to be distributed need not include anything that is\n" "normally distributed (in either source or binary form) with the major\n" "components (compiler, kernel, and so on) of the operating system on\n" "which the executable runs, unless that component itself accompanies\n" "the executable.\n" "\n" " It may happen that this requirement contradicts the license\n" "restrictions of other proprietary libraries that do not normally\n" "accompany the operating system. Such a contradiction means you cannot\n" "use both them and the Library together in an executable that you\n" "distribute.\n" "\n" " 7. You may place library facilities that are a work based on the\n" "Library side-by-side in a single library together with other library\n" "facilities not covered by this License, and distribute such a combined\n" "library, provided that the separate distribution of the work based on\n" "the Library and of the other library facilities is otherwise\n" "permitted, and provided that you do these two things:\n" "\n" " a) Accompany the combined library with a copy of the same work\n" " based on the Library, uncombined with any other library\n" " facilities. This must be distributed under the terms of the\n" " Sections above.\n" "\n" " b) Give prominent notice with the combined library of the fact\n" " that part of it is a work based on the Library, and explaining\n" " where to find the accompanying uncombined form of the same work.\n" "\n" " 8. You may not copy, modify, sublicense, link with, or distribute\n" "the Library except as expressly provided under this License. Any\n" "attempt otherwise to copy, modify, sublicense, link with, or\n" "distribute the Library is void, and will automatically terminate your\n" "rights under this License. However, parties who have received copies,\n" "or rights, from you under this License will not have their licenses\n" "terminated so long as such parties remain in full compliance.\n" "\n" " 9. You are not required to accept this License, since you have not\n" "signed it. However, nothing else grants you permission to modify or\n" "distribute the Library or its derivative works. These actions are\n" "prohibited by law if you do not accept this License. Therefore, by\n" "modifying or distributing the Library (or any work based on the\n" "Library), you indicate your acceptance of this License to do so, and\n" "all its terms and conditions for copying, distributing or modifying\n" "the Library or works based on it.\n" "\n" " 10. Each time you redistribute the Library (or any work based on the\n" "Library), the recipient automatically receives a license from the\n" "original licensor to copy, distribute, link with or modify the Library\n" "subject to these terms and conditions. You may not impose any further\n" "restrictions on the recipients' exercise of the rights granted herein.\n" "You are not responsible for enforcing compliance by third parties with\n" "this License.\n" "\n" " 11. If, as a consequence of a court judgment or allegation of patent\n" "infringement or for any other reason (not limited to patent issues),\n" "conditions are imposed on you (whether by court order, agreement or\n" "otherwise) that contradict the conditions of this License, they do not\n" "excuse you from the conditions of this License. If you cannot\n" "distribute so as to satisfy simultaneously your obligations under this\n" "License and any other pertinent obligations, then as a consequence you\n" "may not distribute the Library at all. For example, if a patent\n" "license would not permit royalty-free redistribution of the Library by\n" "all those who receive copies directly or indirectly through you, then\n" "the only way you could satisfy both it and this License would be to\n" "refrain entirely from distribution of the Library.\n" "\n" "If any portion of this section is held invalid or unenforceable under any\n" "particular circumstance, the balance of the section is intended to apply,\n" "and the section as a whole is intended to apply in other circumstances.\n" "\n" "It is not the purpose of this section to induce you to infringe any\n" "patents or other property right claims or to contest validity of any\n" "such claims; this section has the sole purpose of protecting the\n" "integrity of the free software distribution system which is\n" "implemented by public license practices. Many people have made\n" "generous contributions to the wide range of software distributed\n" "through that system in reliance on consistent application of that\n" "system; it is up to the author/donor to decide if he or she is willing\n" "to distribute software through any other system and a licensee cannot\n" "impose that choice.\n" "\n" "This section is intended to make thoroughly clear what is believed to\n" "be a consequence of the rest of this License.\n" "\n" " 12. If the distribution and/or use of the Library is restricted in\n" "certain countries either by patents or by copyrighted interfaces, the\n" "original copyright holder who places the Library under this License may add\n" "an explicit geographical distribution limitation excluding those countries,\n" "so that distribution is permitted only in or among countries not thus\n" "excluded. In such case, this License incorporates the limitation as if\n" "written in the body of this License.\n" "\n" " 13. The Free Software Foundation may publish revised and/or new\n" "versions of the Lesser General Public License from time to time.\n" "Such new versions will be similar in spirit to the present version,\n" "but may differ in detail to address new problems or concerns.\n" "\n" "Each version is given a distinguishing version number. If the Library\n" "specifies a version number of this License which applies to it and\n" "\"any later version\", you have the option of following the terms and\n" "conditions either of that version or of any later version published by\n" "the Free Software Foundation. If the Library does not specify a\n" "license version number, you may choose any version ever published by\n" "the Free Software Foundation.\n" "\n" " 14. If you wish to incorporate parts of the Library into other free\n" "programs whose distribution conditions are incompatible with these,\n" "write to the author to ask for permission. For software which is\n" "copyrighted by the Free Software Foundation, write to the Free\n" "Software Foundation; we sometimes make exceptions for this. Our\n" "decision will be guided by the two goals of preserving the free status\n" "of all derivatives of our free software and of promoting the sharing\n" "and reuse of software generally.\n" "\n" " NO WARRANTY\n" "\n" " 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO\n" "WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.\n" "EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR\n" "OTHER PARTIES PROVIDE THE LIBRARY \"AS IS\" WITHOUT WARRANTY OF ANY\n" "KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE\n" "IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n" "PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE\n" "LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME\n" "THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n" "\n" " 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN\n" "WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY\n" "AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU\n" "FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR\n" "CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE\n" "LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING\n" "RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A\n" "FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF\n" "SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH\n" "DAMAGES.\n" "\n" " END OF TERMS AND CONDITIONS\n" "\n" " How to Apply These Terms to Your New Libraries\n" "\n" " If you develop a new library, and you want it to be of the greatest\n" "possible use to the public, we recommend making it free software that\n" "everyone can redistribute and change. You can do so by permitting\n" "redistribution under these terms (or, alternatively, under the terms of the\n" "ordinary General Public License).\n" "\n" " To apply these terms, attach the following notices to the library. It is\n" "safest to attach them to the start of each source file to most effectively\n" "convey the exclusion of warranty; and each file should have at least the\n" "\"copyright\" line and a pointer to where the full notice is found.\n" "\n" " \n" " Copyright (C) \n" "\n" " This library is free software; you can redistribute it and/or\n" " modify it under the terms of the GNU Lesser General Public\n" " License as published by the Free Software Foundation; either\n" " version 2.1 of the License, or (at your option) any later version.\n" "\n" " This library is distributed in the hope that it will be useful,\n" " but WITHOUT ANY WARRANTY; without even the implied warranty of\n" " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n" " Lesser General Public License for more details.\n" "\n" " You should have received a copy of the GNU Lesser General Public\n" " License along with this library; if not, write to the Free Software\n" " Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n" "\n" "Also add information on how to contact you by electronic and paper mail.\n" "\n" "You should also get your employer (if you work as a programmer) or your\n" "school, if any, to sign a \"copyright disclaimer\" for the library, if\n" "necessary. Here is a sample; alter the names:\n" "\n" " Yoyodyne, Inc., hereby disclaims all copyright interest in the\n" " library `Frob' (a library for tweaking knobs) written by James Random Hacker.\n" "\n" " , 1 April 1990\n" " Ty Coon, President of Vice\n" "\n" "That's all there is to it!"; #endif #ifdef USE_BUILDENV static const char *licenseSQLite3 = "The author disclaims copyright to this source code. In place of\n" "a legal notice, here is a blessing:\n" "\n" " May you do good and not evil.\n" " May you find forgiveness for yourself and forgive others.\n" " May you share freely, never taking more than you give."; #endif #ifdef USE_BUILDENV static const char *licenseXar = "/*\n" " * Copyright (c) 2005-2007 Rob Braun\n" " * All rights reserved.\n" " *\n" " * Redistribution and use in source and binary forms, with or without\n" " * modification, are permitted provided that the following conditions\n" " * are met:\n" " * 1. Redistributions of source code must retain the above copyright\n" " * notice, this list of conditions and the following disclaimer.\n" " * 2. Redistributions in binary form must reproduce the above copyright\n" " * notice, this list of conditions and the following disclaimer in the\n" " * documentation and/or other materials provided with the distribution.\n" " * 3. Neither the name of Rob Braun nor the names of his contributors\n" " * may be used to endorse or promote products derived from this software\n" " * without specific prior written permission.\n" " *\n" " * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n" " * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n" " * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n" " * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n" " * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n" " * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n" " * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n" " * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n" " * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n" " * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n" " * POSSIBILITY OF SUCH DAMAGE.\n" " */\n" "/*\n" " * 03-Apr-2005\n" " * DRI: Rob Braun \n" " */"; #endif #ifdef USE_BUILDENV static const char *licenseAvahi = "Copyright 2004-2015 by the Avahi developers.\n" "\n" "avahi is free software; you can redistribute it and/or modify it\n" "under the terms of the GNU Lesser General Public License as\n" "published by the Free Software Foundation; either version 2.1 of the\n" "License, or (at your option) any later version.\n" "\n" "avahi is distributed in the hope that it will be useful, but WITHOUT\n" "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n" "or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General\n" "Public License for more details.\n" "\n" "You should have received a copy of the GNU Lesser General Public\n" "License along with avahi; if not, write to the Free Software\n" "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307\n" "USA."; #endif #ifdef USE_BUILDENV static const char *licenseDBus = "D-Bus is licensed to you under your choice of the Academic Free\n" "License version 2.1, or the GNU General Public License version 2\n" "(or, at your option any later version).\n" "\n" "Both licenses are included here. Some of the standalone binaries are\n" "under the GPL only; in particular, but not limited to,\n" "tools/dbus-cleanup-sockets.c and test/decode-gcov.c. Each source code\n" "file is marked with the proper copyright information - if you find a\n" "file that isn't marked please bring it to our attention.\n" "\n" "The Academic Free License\n" "v. 2.1\n" "\n" "This Academic Free License (the \"License\") applies to any original work of authorship (the \"Original Work\") whose owner (the \"Licensor\") has placed the following notice immediately following the copyright notice for the Original Work:\n" "\n" "Licensed under the Academic Free License version 2.1\n" "\n" "1) Grant of Copyright License. Licensor hereby grants You a\n" "world-wide, royalty-free, non-exclusive, perpetual, sublicenseable\n" "license to do the following:\n" "\n" "a) to reproduce the Original Work in copies;\n" "\n" "b) to prepare derivative works (\"Derivative Works\") based upon the Original Work;\n" "\n" "c) to distribute copies of the Original Work and Derivative Works to the public;\n" "\n" "d) to perform the Original Work publicly; and\n" "\n" "e) to display the Original Work publicly.\n" "\n" "2) Grant of Patent License. Licensor hereby grants You a world-wide,\n" "royalty-free, non-exclusive, perpetual, sublicenseable license, under\n" "patent claims owned or controlled by the Licensor that are embodied in\n" "the Original Work as furnished by the Licensor, to make, use, sell and\n" "offer for sale the Original Work and Derivative Works.\n" "\n" "3) Grant of Source Code License. The term \"Source Code\" means the\n" "preferred form of the Original Work for making modifications to it and\n" "all available documentation describing how to modify the Original\n" "Work. Licensor hereby agrees to provide a machine-readable copy of the\n" "Source Code of the Original Work along with each copy of the Original\n" "Work that Licensor distributes. Licensor reserves the right to satisfy\n" "this obligation by placing a machine-readable copy of the Source Code\n" "in an information repository reasonably calculated to permit\n" "inexpensive and convenient access by You for as long as Licensor\n" "continues to distribute the Original Work, and by publishing the\n" "address of that information repository in a notice immediately\n" "following the copyright notice that applies to the Original Work.\n" "\n" "4) Exclusions From License Grant. Neither the names of Licensor, nor\n" "the names of any contributors to the Original Work, nor any of their\n" "trademarks or service marks, may be used to endorse or promote\n" "products derived from this Original Work without express prior written\n" "permission of the Licensor. Nothing in this License shall be deemed to\n" "grant any rights to trademarks, copyrights, patents, trade secrets or\n" "any other intellectual property of Licensor except as expressly stated\n" "herein. No patent license is granted to make, use, sell or offer to\n" "sell embodiments of any patent claims other than the licensed claims\n" "defined in Section 2. No right is granted to the trademarks of\n" "Licensor even if such marks are included in the Original Work. Nothing\n" "in this License shall be interpreted to prohibit Licensor from\n" "licensing under different terms from this License any Original Work\n" "that Licensor otherwise would have a right to license.\n" "\n" "5) This section intentionally omitted.\n" "\n" "6) Attribution Rights. You must retain, in the Source Code of any\n" "Derivative Works that You create, all copyright, patent or trademark\n" "notices from the Source Code of the Original Work, as well as any\n" "notices of licensing and any descriptive text identified therein as an\n" "\"Attribution Notice.\" You must cause the Source Code for any\n" "Derivative Works that You create to carry a prominent Attribution\n" "Notice reasonably calculated to inform recipients that You have\n" "modified the Original Work.\n" "\n" "7) Warranty of Provenance and Disclaimer of Warranty. Licensor\n" "warrants that the copyright in and to the Original Work and the patent\n" "rights granted herein by Licensor are owned by the Licensor or are\n" "sublicensed to You under the terms of this License with the permission\n" "of the contributor(s) of those copyrights and patent rights. Except as\n" "expressly stated in the immediately proceeding sentence, the Original\n" "Work is provided under this License on an \"AS IS\" BASIS and WITHOUT\n" "WARRANTY, either express or implied, including, without limitation,\n" "the warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A\n" "PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL\n" "WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential\n" "part of this License. No license to Original Work is granted hereunder\n" "except under this disclaimer.\n" "\n" "8) Limitation of Liability. Under no circumstances and under no legal\n" "theory, whether in tort (including negligence), contract, or\n" "otherwise, shall the Licensor be liable to any person for any direct,\n" "indirect, special, incidental, or consequential damages of any\n" "character arising as a result of this License or the use of the\n" "Original Work including, without limitation, damages for loss of\n" "goodwill, work stoppage, computer failure or malfunction, or any and\n" "all other commercial damages or losses. This limitation of liability\n" "shall not apply to liability for death or personal injury resulting\n" "from Licensor's negligence to the extent applicable law prohibits such\n" "limitation. Some jurisdictions do not allow the exclusion or\n" "limitation of incidental or consequential damages, so this exclusion\n" "and limitation may not apply to You.\n" "\n" "9) Acceptance and Termination. If You distribute copies of the\n" "Original Work or a Derivative Work, You must make a reasonable effort\n" "under the circumstances to obtain the express assent of recipients to\n" "the terms of this License. Nothing else but this License (or another\n" "written agreement between Licensor and You) grants You permission to\n" "create Derivative Works based upon the Original Work or to exercise\n" "any of the rights granted in Section 1 herein, and any attempt to do\n" "so except under the terms of this License (or another written\n" "agreement between Licensor and You) is expressly prohibited by\n" "U.S. copyright law, the equivalent laws of other countries, and by\n" "international treaty. Therefore, by exercising any of the rights\n" "granted to You in Section 1 herein, You indicate Your acceptance of\n" "this License and all of its terms and conditions.\n" "\n" "10) Termination for Patent Action. This License shall terminate\n" "automatically and You may no longer exercise any of the rights granted\n" "to You by this License as of the date You commence an action,\n" "including a cross-claim or counterclaim, against Licensor or any\n" "licensee alleging that the Original Work infringes a patent. This\n" "termination provision shall not apply for an action alleging patent\n" "infringement by combinations of the Original Work with other software\n" "or hardware.\n" "\n" "11) Jurisdiction, Venue and Governing Law. Any action or suit relating\n" "to this License may be brought only in the courts of a jurisdiction\n" "wherein the Licensor resides or in which Licensor conducts its primary\n" "business, and under the laws of that jurisdiction excluding its\n" "conflict-of-law provisions. The application of the United Nations\n" "Convention on Contracts for the International Sale of Goods is\n" "expressly excluded. Any use of the Original Work outside the scope of\n" "this License or after its termination shall be subject to the\n" "requirements and penalties of the U.S. Copyright Act, 17 U.S.C. § 101\n" "et seq., the equivalent laws of other countries, and international\n" "treaty. This section shall survive the termination of this License.\n" "\n" "12) Attorneys Fees. In any action to enforce the terms of this License\n" "or seeking damages relating thereto, the prevailing party shall be\n" "entitled to recover its costs and expenses, including, without\n" "limitation, reasonable attorneys' fees and costs incurred in\n" "connection with such action, including any appeal of such action. This\n" "section shall survive the termination of this License.\n" "\n" "13) Miscellaneous. This License represents the complete agreement\n" "concerning the subject matter hereof. If any provision of this License\n" "is held to be unenforceable, such provision shall be reformed only to\n" "the extent necessary to make it enforceable.\n" "\n" "14) Definition of \"You\" in This License. \"You\" throughout this\n" "License, whether in upper or lower case, means an individual or a\n" "legal entity exercising rights under, and complying with all of the\n" "terms of, this License. For legal entities, \"You\" includes any entity\n" "that controls, is controlled by, or is under common control with\n" "you. For purposes of this definition, \"control\" means (i) the power,\n" "direct or indirect, to cause the direction or management of such\n" "entity, whether by contract or otherwise, or (ii) ownership of fifty\n" "percent (50%) or more of the outstanding shares, or (iii) beneficial\n" "ownership of such entity.\n" "\n" "15) Right to Use. You may use the Original Work in all ways not\n" "otherwise restricted or conditioned by this License or by law, and\n" "Licensor promises not to interfere with or be responsible for such\n" "uses by You.\n" "\n" "This license is Copyright (C) 2003-2004 Lawrence E. Rosen. All rights\n" "reserved. Permission is hereby granted to copy and distribute this\n" "license without modification. This license may not be modified without\n" "the express written permission of its copyright owner.\n" "\n" "\n" "-- \n" "END OF ACADEMIC FREE LICENSE. The following is intended to describe the essential \n" "differences between the Academic Free License (AFL) version 1.0 and other \n" "open source licenses:\n" "\n" "The Academic Free License is similar to the BSD, MIT, UoI/NCSA and Apache \n" "licenses in many respects but it is intended to solve a few problems with \n" "those licenses.\n" " \n" "* The AFL is written so as to make it clear what software is being \n" "licensed (by the inclusion of a statement following the copyright notice \n" "in the software). This way, the license functions better than a template \n" "license. The BSD, MIT and UoI/NCSA licenses apply to unidentified software.\n" " \n" "* The AFL contains a complete copyright grant to the software. The BSD \n" "and Apache licenses are vague and incomplete in that respect.\n" " \n" "* The AFL contains a complete patent grant to the software. The BSD, MIT, \n" "UoI/NCSA and Apache licenses rely on an implied patent license and contain \n" "no explicit patent grant.\n" " \n" "* The AFL makes it clear that no trademark rights are granted to the \n" "licensor's trademarks. The Apache license contains such a provision, but the \n" "BSD, MIT and UoI/NCSA licenses do not.\n" " \n" "* The AFL includes the warranty by the licensor that it either owns the \n" "copyright or that it is distributing the software under a license. None of \n" "the other licenses contain that warranty. All other warranties are disclaimed, \n" "as is the case for the other licenses.\n" "\n" "* The AFL is itself copyrighted (with the right granted to copy and distribute \n" "without modification). This ensures that the owner of the copyright to the \n" "license will control changes. The Apache license contains a copyright notice, \n" "but the BSD, MIT and UoI/NCSA licenses do not. \n" "--\n" "START OF GNU GENERAL PUBLIC LICENSE\n" "--\n" "\n" " GNU GENERAL PUBLIC LICENSE\n" " Version 2, June 1991\n" "\n" " Copyright (C) 1989, 1991 Free Software Foundation, Inc.\n" " 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n" "\n" " Everyone is permitted to copy and distribute verbatim copies\n" " of this license document, but changing it is not allowed.\n" "\n" " Preamble\n" "\n" " The licenses for most software are designed to take away your\n" "freedom to share and change it. By contrast, the GNU General Public\n" "License is intended to guarantee your freedom to share and change free\n" "software--to make sure the software is free for all its users. This\n" "General Public License applies to most of the Free Software\n" "Foundation's software and to any other program whose authors commit to\n" "using it. (Some other Free Software Foundation software is covered by\n" "the GNU Library General Public License instead.) You can apply it to\n" "your programs, too.\n" "\n" " When we speak of free software, we are referring to freedom, not\n" "price. Our General Public Licenses are designed to make sure that you\n" "have the freedom to distribute copies of free software (and charge for\n" "this service if you wish), that you receive source code or can get it\n" "if you want it, that you can change the software or use pieces of it\n" "in new free programs; and that you know you can do these things.\n" "\n" " To protect your rights, we need to make restrictions that forbid\n" "anyone to deny you these rights or to ask you to surrender the rights.\n" "These restrictions translate to certain responsibilities for you if you\n" "distribute copies of the software, or if you modify it.\n" "\n" " For example, if you distribute copies of such a program, whether\n" "gratis or for a fee, you must give the recipients all the rights that\n" "you have. You must make sure that they, too, receive or can get the\n" "source code. And you must show them these terms so they know their\n" "rights.\n" "\n" " We protect your rights with two steps: (1) copyright the software, and\n" "(2) offer you this license which gives you legal permission to copy,\n" "distribute and/or modify the software.\n" "\n" " Also, for each author's protection and ours, we want to make certain\n" "that everyone understands that there is no warranty for this free\n" "software. If the software is modified by someone else and passed on, we\n" "want its recipients to know that what they have is not the original, so\n" "that any problems introduced by others will not reflect on the original\n" "authors' reputations.\n" "\n" " Finally, any free program is threatened constantly by software\n" "patents. We wish to avoid the danger that redistributors of a free\n" "program will individually obtain patent licenses, in effect making the\n" "program proprietary. To prevent this, we have made it clear that any\n" "patent must be licensed for everyone's free use or not licensed at all.\n" "\n" " The precise terms and conditions for copying, distribution and\n" "modification follow.\n" "\n" " GNU GENERAL PUBLIC LICENSE\n" " TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n" "\n" " 0. This License applies to any program or other work which contains\n" "a notice placed by the copyright holder saying it may be distributed\n" "under the terms of this General Public License. The \"Program\", below,\n" "refers to any such program or work, and a \"work based on the Program\"\n" "means either the Program or any derivative work under copyright law:\n" "that is to say, a work containing the Program or a portion of it,\n" "either verbatim or with modifications and/or translated into another\n" "language. (Hereinafter, translation is included without limitation in\n" "the term \"modification\".) Each licensee is addressed as \"you\".\n" "\n" "Activities other than copying, distribution and modification are not\n" "covered by this License; they are outside its scope. The act of\n" "running the Program is not restricted, and the output from the Program\n" "is covered only if its contents constitute a work based on the\n" "Program (independent of having been made by running the Program).\n" "Whether that is true depends on what the Program does.\n" "\n" " 1. You may copy and distribute verbatim copies of the Program's\n" "source code as you receive it, in any medium, provided that you\n" "conspicuously and appropriately publish on each copy an appropriate\n" "copyright notice and disclaimer of warranty; keep intact all the\n" "notices that refer to this License and to the absence of any warranty;\n" "and give any other recipients of the Program a copy of this License\n" "along with the Program.\n" "\n" "You may charge a fee for the physical act of transferring a copy, and\n" "you may at your option offer warranty protection in exchange for a fee.\n" "\n" " 2. You may modify your copy or copies of the Program or any portion\n" "of it, thus forming a work based on the Program, and copy and\n" "distribute such modifications or work under the terms of Section 1\n" "above, provided that you also meet all of these conditions:\n" "\n" " a) You must cause the modified files to carry prominent notices\n" " stating that you changed the files and the date of any change.\n" "\n" " b) You must cause any work that you distribute or publish, that in\n" " whole or in part contains or is derived from the Program or any\n" " part thereof, to be licensed as a whole at no charge to all third\n" " parties under the terms of this License.\n" "\n" " c) If the modified program normally reads commands interactively\n" " when run, you must cause it, when started running for such\n" " interactive use in the most ordinary way, to print or display an\n" " announcement including an appropriate copyright notice and a\n" " notice that there is no warranty (or else, saying that you provide\n" " a warranty) and that users may redistribute the program under\n" " these conditions, and telling the user how to view a copy of this\n" " License. (Exception: if the Program itself is interactive but\n" " does not normally print such an announcement, your work based on\n" " the Program is not required to print an announcement.)\n" "\n" "These requirements apply to the modified work as a whole. If\n" "identifiable sections of that work are not derived from the Program,\n" "and can be reasonably considered independent and separate works in\n" "themselves, then this License, and its terms, do not apply to those\n" "sections when you distribute them as separate works. But when you\n" "distribute the same sections as part of a whole which is a work based\n" "on the Program, the distribution of the whole must be on the terms of\n" "this License, whose permissions for other licensees extend to the\n" "entire whole, and thus to each and every part regardless of who wrote it.\n" "\n" "Thus, it is not the intent of this section to claim rights or contest\n" "your rights to work written entirely by you; rather, the intent is to\n" "exercise the right to control the distribution of derivative or\n" "collective works based on the Program.\n" "\n" "In addition, mere aggregation of another work not based on the Program\n" "with the Program (or with a work based on the Program) on a volume of\n" "a storage or distribution medium does not bring the other work under\n" "the scope of this License.\n" "\n" " 3. You may copy and distribute the Program (or a work based on it,\n" "under Section 2) in object code or executable form under the terms of\n" "Sections 1 and 2 above provided that you also do one of the following:\n" "\n" " a) Accompany it with the complete corresponding machine-readable\n" " source code, which must be distributed under the terms of Sections\n" " 1 and 2 above on a medium customarily used for software interchange; or,\n" "\n" " b) Accompany it with a written offer, valid for at least three\n" " years, to give any third party, for a charge no more than your\n" " cost of physically performing source distribution, a complete\n" " machine-readable copy of the corresponding source code, to be\n" " distributed under the terms of Sections 1 and 2 above on a medium\n" " customarily used for software interchange; or,\n" "\n" " c) Accompany it with the information you received as to the offer\n" " to distribute corresponding source code. (This alternative is\n" " allowed only for noncommercial distribution and only if you\n" " received the program in object code or executable form with such\n" " an offer, in accord with Subsection b above.)\n" "\n" "The source code for a work means the preferred form of the work for\n" "making modifications to it. For an executable work, complete source\n" "code means all the source code for all modules it contains, plus any\n" "associated interface definition files, plus the scripts used to\n" "control compilation and installation of the executable. However, as a\n" "special exception, the source code distributed need not include\n" "anything that is normally distributed (in either source or binary\n" "form) with the major components (compiler, kernel, and so on) of the\n" "operating system on which the executable runs, unless that component\n" "itself accompanies the executable.\n" "\n" "If distribution of executable or object code is made by offering\n" "access to copy from a designated place, then offering equivalent\n" "access to copy the source code from the same place counts as\n" "distribution of the source code, even though third parties are not\n" "compelled to copy the source along with the object code.\n" "\n" " 4. You may not copy, modify, sublicense, or distribute the Program\n" "except as expressly provided under this License. Any attempt\n" "otherwise to copy, modify, sublicense or distribute the Program is\n" "void, and will automatically terminate your rights under this License.\n" "However, parties who have received copies, or rights, from you under\n" "this License will not have their licenses terminated so long as such\n" "parties remain in full compliance.\n" "\n" " 5. You are not required to accept this License, since you have not\n" "signed it. However, nothing else grants you permission to modify or\n" "distribute the Program or its derivative works. These actions are\n" "prohibited by law if you do not accept this License. Therefore, by\n" "modifying or distributing the Program (or any work based on the\n" "Program), you indicate your acceptance of this License to do so, and\n" "all its terms and conditions for copying, distributing or modifying\n" "the Program or works based on it.\n" "\n" " 6. Each time you redistribute the Program (or any work based on the\n" "Program), the recipient automatically receives a license from the\n" "original licensor to copy, distribute or modify the Program subject to\n" "these terms and conditions. You may not impose any further\n" "restrictions on the recipients' exercise of the rights granted herein.\n" "You are not responsible for enforcing compliance by third parties to\n" "this License.\n" "\n" " 7. If, as a consequence of a court judgment or allegation of patent\n" "infringement or for any other reason (not limited to patent issues),\n" "conditions are imposed on you (whether by court order, agreement or\n" "otherwise) that contradict the conditions of this License, they do not\n" "excuse you from the conditions of this License. If you cannot\n" "distribute so as to satisfy simultaneously your obligations under this\n" "License and any other pertinent obligations, then as a consequence you\n" "may not distribute the Program at all. For example, if a patent\n" "license would not permit royalty-free redistribution of the Program by\n" "all those who receive copies directly or indirectly through you, then\n" "the only way you could satisfy both it and this License would be to\n" "refrain entirely from distribution of the Program.\n" "\n" "If any portion of this section is held invalid or unenforceable under\n" "any particular circumstance, the balance of the section is intended to\n" "apply and the section as a whole is intended to apply in other\n" "circumstances.\n" "\n" "It is not the purpose of this section to induce you to infringe any\n" "patents or other property right claims or to contest validity of any\n" "such claims; this section has the sole purpose of protecting the\n" "integrity of the free software distribution system, which is\n" "implemented by public license practices. Many people have made\n" "generous contributions to the wide range of software distributed\n" "through that system in reliance on consistent application of that\n" "system; it is up to the author/donor to decide if he or she is willing\n" "to distribute software through any other system and a licensee cannot\n" "impose that choice.\n" "\n" "This section is intended to make thoroughly clear what is believed to\n" "be a consequence of the rest of this License.\n" "\n" " 8. If the distribution and/or use of the Program is restricted in\n" "certain countries either by patents or by copyrighted interfaces, the\n" "original copyright holder who places the Program under this License\n" "may add an explicit geographical distribution limitation excluding\n" "those countries, so that distribution is permitted only in or among\n" "countries not thus excluded. In such case, this License incorporates\n" "the limitation as if written in the body of this License.\n" "\n" " 9. The Free Software Foundation may publish revised and/or new versions\n" "of the General Public License from time to time. Such new versions will\n" "be similar in spirit to the present version, but may differ in detail to\n" "address new problems or concerns.\n" "\n" "Each version is given a distinguishing version number. If the Program\n" "specifies a version number of this License which applies to it and \"any\n" "later version\", you have the option of following the terms and conditions\n" "either of that version or of any later version published by the Free\n" "Software Foundation. If the Program does not specify a version number of\n" "this License, you may choose any version ever published by the Free Software\n" "Foundation.\n" "\n" " 10. If you wish to incorporate parts of the Program into other free\n" "programs whose distribution conditions are different, write to the author\n" "to ask for permission. For software which is copyrighted by the Free\n" "Software Foundation, write to the Free Software Foundation; we sometimes\n" "make exceptions for this. Our decision will be guided by the two goals\n" "of preserving the free status of all derivatives of our free software and\n" "of promoting the sharing and reuse of software generally.\n" "\n" " NO WARRANTY\n" "\n" " 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\n" "FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN\n" "OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\n" "PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\n" "OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n" "MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS\n" "TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE\n" "PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\n" "REPAIR OR CORRECTION.\n" "\n" " 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\n" "WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\n" "REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\n" "INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\n" "OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\n" "TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\n" "YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\n" "PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\n" "POSSIBILITY OF SUCH DAMAGES.\n" "\n" " END OF TERMS AND CONDITIONS\n" "\n" " How to Apply These Terms to Your New Programs\n" "\n" " If you develop a new program, and you want it to be of the greatest\n" "possible use to the public, the best way to achieve this is to make it\n" "free software which everyone can redistribute and change under these terms.\n" "\n" " To do so, attach the following notices to the program. It is safest\n" "to attach them to the start of each source file to most effectively\n" "convey the exclusion of warranty; and each file should have at least\n" "the \"copyright\" line and a pointer to where the full notice is found.\n" "\n" " \n" " Copyright (C) \n" "\n" " This program is free software; you can redistribute it and/or modify\n" " it under the terms of the GNU General Public License as published by\n" " the Free Software Foundation; either version 2 of the License, or\n" " (at your option) any later version.\n" "\n" " This program is distributed in the hope that it will be useful,\n" " but WITHOUT ANY WARRANTY; without even the implied warranty of\n" " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" " GNU General Public License for more details.\n" "\n" " You should have received a copy of the GNU General Public License\n" " along with this program; if not, write to the Free Software\n" " Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n" "\n" "\n" "Also add information on how to contact you by electronic and paper mail.\n" "\n" "If the program is interactive, make it output a short notice like this\n" "when it starts in an interactive mode:\n" "\n" " Gnomovision version 69, Copyright (C) year name of author\n" " Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n" " This is free software, and you are welcome to redistribute it\n" " under certain conditions; type `show c' for details.\n" "\n" "The hypothetical commands `show w' and `show c' should show the appropriate\n" "parts of the General Public License. Of course, the commands you use may\n" "be called something other than `show w' and `show c'; they could even be\n" "mouse-clicks or menu items--whatever suits your program.\n" "\n" "You should also get your employer (if you work as a programmer) or your\n" "school, if any, to sign a \"copyright disclaimer\" for the program, if\n" "necessary. Here is a sample; alter the names:\n" "\n" " Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n" " `Gnomovision' (which makes passes at compilers) written by James Hacker.\n" "\n" " , 1 April 1989\n" " Ty Coon, President of Vice\n" "\n" "This General Public License does not permit incorporating your program into\n" "proprietary programs. If your program is a subroutine library, you may\n" "consider it more useful to permit linking proprietary applications with the\n" "library. If this is what you want to do, use the GNU Library General\n" "Public License instead of this License."; #endif #ifdef USE_BUILDENV static const char *licenseAppImageRuntime = "Copyright (c) 2004-17 Simon Peter\n" "Portions Copyright (c) 2007 Alexander Larsson\n" "\n" "All Rights Reserved.\n" "\n" "Permission is hereby granted, free of charge, to any person obtaining a copy\n" "of this software and associated documentation files (the \"Software\"), to deal\n" "in the Software without restriction, including without limitation the rights\n" "to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n" "copies of the Software, and to permit persons to whom the Software is\n" "furnished to do so, subject to the following conditions:\n" "\n" "The above copyright notice and this permission notice shall be included in\n" "all copies or substantial portions of the Software.\n" "\n" "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n" "IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n" "FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n" "AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n" "LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n" "OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n" "THE SOFTWARE."; #endif #ifdef USE_BUILDENV static const char *licenseSquashfuse = "The squashfuse distribution as a whole is copyright Dave\n" "Vasilevsky and is subject to the copyright notice reproduced at\n" "the bottom of this file.\n" "\n" "The file squashfs_fs.h is copyright Phillip Lougher and, with his permission,\n" "subject to the same license.\n" "\n" "\n" "Copyright (c) 2012 Dave Vasilevsky \n" " Phillip Lougher \n" "All rights reserved.\n" "\n" "Redistribution and use in source and binary forms, with or without\n" "modification, are permitted provided that the following conditions\n" "are met:\n" "1. Redistributions of source code must retain the above copyright\n" " notice, this list of conditions and the following disclaimer.\n" "2. Redistributions in binary form must reproduce the above copyright\n" " notice, this list of conditions and the following disclaimer in the\n" " documentation and/or other materials provided with the distribution.\n" "\n" "THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR\n" "IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n" "OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n" "IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,\n" "INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n" "NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n" "DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n" "THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n" "(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n" "THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."; #endif #ifdef USE_BUILDENV static const char *licenseLibfuse = "FUSE: Filesystem in Userspace\n" "Copyright (C) 2001-2007 Miklos Szeredi \n" "\n" "This program can be distributed under the terms of the GNU LGPLv2.\n" "\n" " GNU LESSER GENERAL PUBLIC LICENSE\n" " Version 2.1, February 1999\n" "\n" " Copyright (C) 1991, 1999 Free Software Foundation, Inc.\n" " 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n" " Everyone is permitted to copy and distribute verbatim copies\n" " of this license document, but changing it is not allowed.\n" "\n" "[This is the first released version of the Lesser GPL. It also counts\n" " as the successor of the GNU Library Public License, version 2, hence\n" " the version number 2.1.]\n" "\n" " Preamble\n" "\n" " The licenses for most software are designed to take away your\n" "freedom to share and change it. By contrast, the GNU General Public\n" "Licenses are intended to guarantee your freedom to share and change\n" "free software--to make sure the software is free for all its users.\n" "\n" " This license, the Lesser General Public License, applies to some\n" "specially designated software packages--typically libraries--of the\n" "Free Software Foundation and other authors who decide to use it. You\n" "can use it too, but we suggest you first think carefully about whether\n" "this license or the ordinary General Public License is the better\n" "strategy to use in any particular case, based on the explanations below.\n" "\n" " When we speak of free software, we are referring to freedom of use,\n" "not price. Our General Public Licenses are designed to make sure that\n" "you have the freedom to distribute copies of free software (and charge\n" "for this service if you wish); that you receive source code or can get\n" "it if you want it; that you can change the software and use pieces of\n" "it in new free programs; and that you are informed that you can do\n" "these things.\n" "\n" " To protect your rights, we need to make restrictions that forbid\n" "distributors to deny you these rights or to ask you to surrender these\n" "rights. These restrictions translate to certain responsibilities for\n" "you if you distribute copies of the library or if you modify it.\n" "\n" " For example, if you distribute copies of the library, whether gratis\n" "or for a fee, you must give the recipients all the rights that we gave\n" "you. You must make sure that they, too, receive or can get the source\n" "code. If you link other code with the library, you must provide\n" "complete object files to the recipients, so that they can relink them\n" "with the library after making changes to the library and recompiling\n" "it. And you must show them these terms so they know their rights.\n" "\n" " We protect your rights with a two-step method: (1) we copyright the\n" "library, and (2) we offer you this license, which gives you legal\n" "permission to copy, distribute and/or modify the library.\n" "\n" " To protect each distributor, we want to make it very clear that\n" "there is no warranty for the free library. Also, if the library is\n" "modified by someone else and passed on, the recipients should know\n" "that what they have is not the original version, so that the original\n" "author's reputation will not be affected by problems that might be\n" "introduced by others.\n" "\n" " Finally, software patents pose a constant threat to the existence of\n" "any free program. We wish to make sure that a company cannot\n" "effectively restrict the users of a free program by obtaining a\n" "restrictive license from a patent holder. Therefore, we insist that\n" "any patent license obtained for a version of the library must be\n" "consistent with the full freedom of use specified in this license.\n" "\n" " Most GNU software, including some libraries, is covered by the\n" "ordinary GNU General Public License. This license, the GNU Lesser\n" "General Public License, applies to certain designated libraries, and\n" "is quite different from the ordinary General Public License. We use\n" "this license for certain libraries in order to permit linking those\n" "libraries into non-free programs.\n" "\n" " When a program is linked with a library, whether statically or using\n" "a shared library, the combination of the two is legally speaking a\n" "combined work, a derivative of the original library. The ordinary\n" "General Public License therefore permits such linking only if the\n" "entire combination fits its criteria of freedom. The Lesser General\n" "Public License permits more lax criteria for linking other code with\n" "the library.\n" "\n" " We call this license the \"Lesser\" General Public License because it\n" "does Less to protect the user's freedom than the ordinary General\n" "Public License. It also provides other free software developers Less\n" "of an advantage over competing non-free programs. These disadvantages\n" "are the reason we use the ordinary General Public License for many\n" "libraries. However, the Lesser license provides advantages in certain\n" "special circumstances.\n" "\n" " For example, on rare occasions, there may be a special need to\n" "encourage the widest possible use of a certain library, so that it becomes\n" "a de-facto standard. To achieve this, non-free programs must be\n" "allowed to use the library. A more frequent case is that a free\n" "library does the same job as widely used non-free libraries. In this\n" "case, there is little to gain by limiting the free library to free\n" "software only, so we use the Lesser General Public License.\n" "\n" " In other cases, permission to use a particular library in non-free\n" "programs enables a greater number of people to use a large body of\n" "free software. For example, permission to use the GNU C Library in\n" "non-free programs enables many more people to use the whole GNU\n" "operating system, as well as its variant, the GNU/Linux operating\n" "system.\n" "\n" " Although the Lesser General Public License is Less protective of the\n" "users' freedom, it does ensure that the user of a program that is\n" "linked with the Library has the freedom and the wherewithal to run\n" "that program using a modified version of the Library.\n" "\n" " The precise terms and conditions for copying, distribution and\n" "modification follow. Pay close attention to the difference between a\n" "\"work based on the library\" and a \"work that uses the library\". The\n" "former contains code derived from the library, whereas the latter must\n" "be combined with the library in order to run.\n" "\n" " GNU LESSER GENERAL PUBLIC LICENSE\n" " TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n" "\n" " 0. This License Agreement applies to any software library or other\n" "program which contains a notice placed by the copyright holder or\n" "other authorized party saying it may be distributed under the terms of\n" "this Lesser General Public License (also called \"this License\").\n" "Each licensee is addressed as \"you\".\n" "\n" " A \"library\" means a collection of software functions and/or data\n" "prepared so as to be conveniently linked with application programs\n" "(which use some of those functions and data) to form executables.\n" "\n" " The \"Library\", below, refers to any such software library or work\n" "which has been distributed under these terms. A \"work based on the\n" "Library\" means either the Library or any derivative work under\n" "copyright law: that is to say, a work containing the Library or a\n" "portion of it, either verbatim or with modifications and/or translated\n" "straightforwardly into another language. (Hereinafter, translation is\n" "included without limitation in the term \"modification\".)\n" "\n" " \"Source code\" for a work means the preferred form of the work for\n" "making modifications to it. For a library, complete source code means\n" "all the source code for all modules it contains, plus any associated\n" "interface definition files, plus the scripts used to control compilation\n" "and installation of the library.\n" "\n" " Activities other than copying, distribution and modification are not\n" "covered by this License; they are outside its scope. The act of\n" "running a program using the Library is not restricted, and output from\n" "such a program is covered only if its contents constitute a work based\n" "on the Library (independent of the use of the Library in a tool for\n" "writing it). Whether that is true depends on what the Library does\n" "and what the program that uses the Library does.\n" "\n" " 1. You may copy and distribute verbatim copies of the Library's\n" "complete source code as you receive it, in any medium, provided that\n" "you conspicuously and appropriately publish on each copy an\n" "appropriate copyright notice and disclaimer of warranty; keep intact\n" "all the notices that refer to this License and to the absence of any\n" "warranty; and distribute a copy of this License along with the\n" "Library.\n" "\n" " You may charge a fee for the physical act of transferring a copy,\n" "and you may at your option offer warranty protection in exchange for a\n" "fee.\n" "\n" " 2. You may modify your copy or copies of the Library or any portion\n" "of it, thus forming a work based on the Library, and copy and\n" "distribute such modifications or work under the terms of Section 1\n" "above, provided that you also meet all of these conditions:\n" "\n" " a) The modified work must itself be a software library.\n" "\n" " b) You must cause the files modified to carry prominent notices\n" " stating that you changed the files and the date of any change.\n" "\n" " c) You must cause the whole of the work to be licensed at no\n" " charge to all third parties under the terms of this License.\n" "\n" " d) If a facility in the modified Library refers to a function or a\n" " table of data to be supplied by an application program that uses\n" " the facility, other than as an argument passed when the facility\n" " is invoked, then you must make a good faith effort to ensure that,\n" " in the event an application does not supply such function or\n" " table, the facility still operates, and performs whatever part of\n" " its purpose remains meaningful.\n" "\n" " (For example, a function in a library to compute square roots has\n" " a purpose that is entirely well-defined independent of the\n" " application. Therefore, Subsection 2d requires that any\n" " application-supplied function or table used by this function must\n" " be optional: if the application does not supply it, the square\n" " root function must still compute square roots.)\n" "\n" "These requirements apply to the modified work as a whole. If\n" "identifiable sections of that work are not derived from the Library,\n" "and can be reasonably considered independent and separate works in\n" "themselves, then this License, and its terms, do not apply to those\n" "sections when you distribute them as separate works. But when you\n" "distribute the same sections as part of a whole which is a work based\n" "on the Library, the distribution of the whole must be on the terms of\n" "this License, whose permissions for other licensees extend to the\n" "entire whole, and thus to each and every part regardless of who wrote\n" "it.\n" "\n" "Thus, it is not the intent of this section to claim rights or contest\n" "your rights to work written entirely by you; rather, the intent is to\n" "exercise the right to control the distribution of derivative or\n" "collective works based on the Library.\n" "\n" "In addition, mere aggregation of another work not based on the Library\n" "with the Library (or with a work based on the Library) on a volume of\n" "a storage or distribution medium does not bring the other work under\n" "the scope of this License.\n" "\n" " 3. You may opt to apply the terms of the ordinary GNU General Public\n" "License instead of this License to a given copy of the Library. To do\n" "this, you must alter all the notices that refer to this License, so\n" "that they refer to the ordinary GNU General Public License, version 2,\n" "instead of to this License. (If a newer version than version 2 of the\n" "ordinary GNU General Public License has appeared, then you can specify\n" "that version instead if you wish.) Do not make any other change in\n" "these notices.\n" "\n" " Once this change is made in a given copy, it is irreversible for\n" "that copy, so the ordinary GNU General Public License applies to all\n" "subsequent copies and derivative works made from that copy.\n" "\n" " This option is useful when you wish to copy part of the code of\n" "the Library into a program that is not a library.\n" "\n" " 4. You may copy and distribute the Library (or a portion or\n" "derivative of it, under Section 2) in object code or executable form\n" "under the terms of Sections 1 and 2 above provided that you accompany\n" "it with the complete corresponding machine-readable source code, which\n" "must be distributed under the terms of Sections 1 and 2 above on a\n" "medium customarily used for software interchange.\n" "\n" " If distribution of object code is made by offering access to copy\n" "from a designated place, then offering equivalent access to copy the\n" "source code from the same place satisfies the requirement to\n" "distribute the source code, even though third parties are not\n" "compelled to copy the source along with the object code.\n" "\n" " 5. A program that contains no derivative of any portion of the\n" "Library, but is designed to work with the Library by being compiled or\n" "linked with it, is called a \"work that uses the Library\". Such a\n" "work, in isolation, is not a derivative work of the Library, and\n" "therefore falls outside the scope of this License.\n" "\n" " However, linking a \"work that uses the Library\" with the Library\n" "creates an executable that is a derivative of the Library (because it\n" "contains portions of the Library), rather than a \"work that uses the\n" "library\". The executable is therefore covered by this License.\n" "Section 6 states terms for distribution of such executables.\n" "\n" " When a \"work that uses the Library\" uses material from a header file\n" "that is part of the Library, the object code for the work may be a\n" "derivative work of the Library even though the source code is not.\n" "Whether this is true is especially significant if the work can be\n" "linked without the Library, or if the work is itself a library. The\n" "threshold for this to be true is not precisely defined by law.\n" "\n" " If such an object file uses only numerical parameters, data\n" "structure layouts and accessors, and small macros and small inline\n" "functions (ten lines or less in length), then the use of the object\n" "file is unrestricted, regardless of whether it is legally a derivative\n" "work. (Executables containing this object code plus portions of the\n" "Library will still fall under Section 6.)\n" "\n" " Otherwise, if the work is a derivative of the Library, you may\n" "distribute the object code for the work under the terms of Section 6.\n" "Any executables containing that work also fall under Section 6,\n" "whether or not they are linked directly with the Library itself.\n" "\n" " 6. As an exception to the Sections above, you may also combine or\n" "link a \"work that uses the Library\" with the Library to produce a\n" "work containing portions of the Library, and distribute that work\n" "under terms of your choice, provided that the terms permit\n" "modification of the work for the customer's own use and reverse\n" "engineering for debugging such modifications.\n" "\n" " You must give prominent notice with each copy of the work that the\n" "Library is used in it and that the Library and its use are covered by\n" "this License. You must supply a copy of this License. If the work\n" "during execution displays copyright notices, you must include the\n" "copyright notice for the Library among them, as well as a reference\n" "directing the user to the copy of this License. Also, you must do one\n" "of these things:\n" "\n" " a) Accompany the work with the complete corresponding\n" " machine-readable source code for the Library including whatever\n" " changes were used in the work (which must be distributed under\n" " Sections 1 and 2 above); and, if the work is an executable linked\n" " with the Library, with the complete machine-readable \"work that\n" " uses the Library\", as object code and/or source code, so that the\n" " user can modify the Library and then relink to produce a modified\n" " executable containing the modified Library. (It is understood\n" " that the user who changes the contents of definitions files in the\n" " Library will not necessarily be able to recompile the application\n" " to use the modified definitions.)\n" "\n" " b) Use a suitable shared library mechanism for linking with the\n" " Library. A suitable mechanism is one that (1) uses at run time a\n" " copy of the library already present on the user's computer system,\n" " rather than copying library functions into the executable, and (2)\n" " will operate properly with a modified version of the library, if\n" " the user installs one, as long as the modified version is\n" " interface-compatible with the version that the work was made with.\n" "\n" " c) Accompany the work with a written offer, valid for at\n" " least three years, to give the same user the materials\n" " specified in Subsection 6a, above, for a charge no more\n" " than the cost of performing this distribution.\n" "\n" " d) If distribution of the work is made by offering access to copy\n" " from a designated place, offer equivalent access to copy the above\n" " specified materials from the same place.\n" "\n" " e) Verify that the user has already received a copy of these\n" " materials or that you have already sent this user a copy.\n" "\n" " For an executable, the required form of the \"work that uses the\n" "Library\" must include any data and utility programs needed for\n" "reproducing the executable from it. However, as a special exception,\n" "the materials to be distributed need not include anything that is\n" "normally distributed (in either source or binary form) with the major\n" "components (compiler, kernel, and so on) of the operating system on\n" "which the executable runs, unless that component itself accompanies\n" "the executable.\n" "\n" " It may happen that this requirement contradicts the license\n" "restrictions of other proprietary libraries that do not normally\n" "accompany the operating system. Such a contradiction means you cannot\n" "use both them and the Library together in an executable that you\n" "distribute.\n" "\n" " 7. You may place library facilities that are a work based on the\n" "Library side-by-side in a single library together with other library\n" "facilities not covered by this License, and distribute such a combined\n" "library, provided that the separate distribution of the work based on\n" "the Library and of the other library facilities is otherwise\n" "permitted, and provided that you do these two things:\n" "\n" " a) Accompany the combined library with a copy of the same work\n" " based on the Library, uncombined with any other library\n" " facilities. This must be distributed under the terms of the\n" " Sections above.\n" "\n" " b) Give prominent notice with the combined library of the fact\n" " that part of it is a work based on the Library, and explaining\n" " where to find the accompanying uncombined form of the same work.\n" "\n" " 8. You may not copy, modify, sublicense, link with, or distribute\n" "the Library except as expressly provided under this License. Any\n" "attempt otherwise to copy, modify, sublicense, link with, or\n" "distribute the Library is void, and will automatically terminate your\n" "rights under this License. However, parties who have received copies,\n" "or rights, from you under this License will not have their licenses\n" "terminated so long as such parties remain in full compliance.\n" "\n" " 9. You are not required to accept this License, since you have not\n" "signed it. However, nothing else grants you permission to modify or\n" "distribute the Library or its derivative works. These actions are\n" "prohibited by law if you do not accept this License. Therefore, by\n" "modifying or distributing the Library (or any work based on the\n" "Library), you indicate your acceptance of this License to do so, and\n" "all its terms and conditions for copying, distributing or modifying\n" "the Library or works based on it.\n" "\n" " 10. Each time you redistribute the Library (or any work based on the\n" "Library), the recipient automatically receives a license from the\n" "original licensor to copy, distribute, link with or modify the Library\n" "subject to these terms and conditions. You may not impose any further\n" "restrictions on the recipients' exercise of the rights granted herein.\n" "You are not responsible for enforcing compliance by third parties with\n" "this License.\n" "\n" " 11. If, as a consequence of a court judgment or allegation of patent\n" "infringement or for any other reason (not limited to patent issues),\n" "conditions are imposed on you (whether by court order, agreement or\n" "otherwise) that contradict the conditions of this License, they do not\n" "excuse you from the conditions of this License. If you cannot\n" "distribute so as to satisfy simultaneously your obligations under this\n" "License and any other pertinent obligations, then as a consequence you\n" "may not distribute the Library at all. For example, if a patent\n" "license would not permit royalty-free redistribution of the Library by\n" "all those who receive copies directly or indirectly through you, then\n" "the only way you could satisfy both it and this License would be to\n" "refrain entirely from distribution of the Library.\n" "\n" "If any portion of this section is held invalid or unenforceable under any\n" "particular circumstance, the balance of the section is intended to apply,\n" "and the section as a whole is intended to apply in other circumstances.\n" "\n" "It is not the purpose of this section to induce you to infringe any\n" "patents or other property right claims or to contest validity of any\n" "such claims; this section has the sole purpose of protecting the\n" "integrity of the free software distribution system which is\n" "implemented by public license practices. Many people have made\n" "generous contributions to the wide range of software distributed\n" "through that system in reliance on consistent application of that\n" "system; it is up to the author/donor to decide if he or she is willing\n" "to distribute software through any other system and a licensee cannot\n" "impose that choice.\n" "\n" "This section is intended to make thoroughly clear what is believed to\n" "be a consequence of the rest of this License.\n" "\n" " 12. If the distribution and/or use of the Library is restricted in\n" "certain countries either by patents or by copyrighted interfaces, the\n" "original copyright holder who places the Library under this License may add\n" "an explicit geographical distribution limitation excluding those countries,\n" "so that distribution is permitted only in or among countries not thus\n" "excluded. In such case, this License incorporates the limitation as if\n" "written in the body of this License.\n" "\n" " 13. The Free Software Foundation may publish revised and/or new\n" "versions of the Lesser General Public License from time to time.\n" "Such new versions will be similar in spirit to the present version,\n" "but may differ in detail to address new problems or concerns.\n" "\n" "Each version is given a distinguishing version number. If the Library\n" "specifies a version number of this License which applies to it and\n" "\"any later version\", you have the option of following the terms and\n" "conditions either of that version or of any later version published by\n" "the Free Software Foundation. If the Library does not specify a\n" "license version number, you may choose any version ever published by\n" "the Free Software Foundation.\n" "\n" " 14. If you wish to incorporate parts of the Library into other free\n" "programs whose distribution conditions are incompatible with these,\n" "write to the author to ask for permission. For software which is\n" "copyrighted by the Free Software Foundation, write to the Free\n" "Software Foundation; we sometimes make exceptions for this. Our\n" "decision will be guided by the two goals of preserving the free status\n" "of all derivatives of our free software and of promoting the sharing\n" "and reuse of software generally.\n" "\n" " NO WARRANTY\n" "\n" " 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO\n" "WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.\n" "EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR\n" "OTHER PARTIES PROVIDE THE LIBRARY \"AS IS\" WITHOUT WARRANTY OF ANY\n" "KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE\n" "IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n" "PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE\n" "LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME\n" "THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n" "\n" " 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN\n" "WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY\n" "AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU\n" "FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR\n" "CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE\n" "LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING\n" "RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A\n" "FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF\n" "SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH\n" "DAMAGES.\n" "\n" " END OF TERMS AND CONDITIONS\n" "\n" " How to Apply These Terms to Your New Libraries\n" "\n" " If you develop a new library, and you want it to be of the greatest\n" "possible use to the public, we recommend making it free software that\n" "everyone can redistribute and change. You can do so by permitting\n" "redistribution under these terms (or, alternatively, under the terms of the\n" "ordinary General Public License).\n" "\n" " To apply these terms, attach the following notices to the library. It is\n" "safest to attach them to the start of each source file to most effectively\n" "convey the exclusion of warranty; and each file should have at least the\n" "\"copyright\" line and a pointer to where the full notice is found.\n" "\n" " \n" " Copyright (C) \n" "\n" " This library is free software; you can redistribute it and/or\n" " modify it under the terms of the GNU Lesser General Public\n" " License as published by the Free Software Foundation; either\n" " version 2.1 of the License, or (at your option) any later version.\n" "\n" " This library is distributed in the hope that it will be useful,\n" " but WITHOUT ANY WARRANTY; without even the implied warranty of\n" " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n" " Lesser General Public License for more details.\n" "\n" " You should have received a copy of the GNU Lesser General Public\n" " License along with this library; if not, write to the Free Software\n" " Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n" "\n" "Also add information on how to contact you by electronic and paper mail.\n" "\n" "You should also get your employer (if you work as a programmer) or your\n" "school, if any, to sign a \"copyright disclaimer\" for the library, if\n" "necessary. Here is a sample; alter the names:\n" "\n" " Yoyodyne, Inc., hereby disclaims all copyright interest in the\n" " library `Frob' (a library for tweaking knobs) written by James Random Hacker.\n" "\n" " , 1 April 1990\n" " Ty Coon, President of Vice\n" "\n" "That's all there is to it!"; #endif #ifdef USE_BUILDENV static const char *licenseGlib = " GNU LIBRARY GENERAL PUBLIC LICENSE\n" " Version 2, June 1991\n" "\n" " Copyright (C) 1991 Free Software Foundation, Inc.\n" " 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n" " Everyone is permitted to copy and distribute verbatim copies\n" " of this license document, but changing it is not allowed.\n" "\n" "[This is the first released version of the library GPL. It is\n" " numbered 2 because it goes with version 2 of the ordinary GPL.]\n" "\n" " Preamble\n" "\n" " The licenses for most software are designed to take away your\n" "freedom to share and change it. By contrast, the GNU General Public\n" "Licenses are intended to guarantee your freedom to share and change\n" "free software--to make sure the software is free for all its users.\n" "\n" " This license, the Library General Public License, applies to some\n" "specially designated Free Software Foundation software, and to any\n" "other libraries whose authors decide to use it. You can use it for\n" "your libraries, too.\n" "\n" " When we speak of free software, we are referring to freedom, not\n" "price. Our General Public Licenses are designed to make sure that you\n" "have the freedom to distribute copies of free software (and charge for\n" "this service if you wish), that you receive source code or can get it\n" "if you want it, that you can change the software or use pieces of it\n" "in new free programs; and that you know you can do these things.\n" "\n" " To protect your rights, we need to make restrictions that forbid\n" "anyone to deny you these rights or to ask you to surrender the rights.\n" "These restrictions translate to certain responsibilities for you if\n" "you distribute copies of the library, or if you modify it.\n" "\n" " For example, if you distribute copies of the library, whether gratis\n" "or for a fee, you must give the recipients all the rights that we gave\n" "you. You must make sure that they, too, receive or can get the source\n" "code. If you link a program with the library, you must provide\n" "complete object files to the recipients so that they can relink them\n" "with the library, after making changes to the library and recompiling\n" "it. And you must show them these terms so they know their rights.\n" "\n" " Our method of protecting your rights has two steps: (1) copyright\n" "the library, and (2) offer you this license which gives you legal\n" "permission to copy, distribute and/or modify the library.\n" "\n" " Also, for each distributor's protection, we want to make certain\n" "that everyone understands that there is no warranty for this free\n" "library. If the library is modified by someone else and passed on, we\n" "want its recipients to know that what they have is not the original\n" "version, so that any problems introduced by others will not reflect on\n" "the original authors' reputations.\n" "\n" " Finally, any free program is threatened constantly by software\n" "patents. We wish to avoid the danger that companies distributing free\n" "software will individually obtain patent licenses, thus in effect\n" "transforming the program into proprietary software. To prevent this,\n" "we have made it clear that any patent must be licensed for everyone's\n" "free use or not licensed at all.\n" "\n" " Most GNU software, including some libraries, is covered by the ordinary\n" "GNU General Public License, which was designed for utility programs. This\n" "license, the GNU Library General Public License, applies to certain\n" "designated libraries. This license is quite different from the ordinary\n" "one; be sure to read it in full, and don't assume that anything in it is\n" "the same as in the ordinary license.\n" "\n" " The reason we have a separate public license for some libraries is that\n" "they blur the distinction we usually make between modifying or adding to a\n" "program and simply using it. Linking a program with a library, without\n" "changing the library, is in some sense simply using the library, and is\n" "analogous to running a utility program or application program. However, in\n" "a textual and legal sense, the linked executable is a combined work, a\n" "derivative of the original library, and the ordinary General Public License\n" "treats it as such.\n" "\n" " Because of this blurred distinction, using the ordinary General\n" "Public License for libraries did not effectively promote software\n" "sharing, because most developers did not use the libraries. We\n" "concluded that weaker conditions might promote sharing better.\n" "\n" " However, unrestricted linking of non-free programs would deprive the\n" "users of those programs of all benefit from the free status of the\n" "libraries themselves. This Library General Public License is intended to\n" "permit developers of non-free programs to use free libraries, while\n" "preserving your freedom as a user of such programs to change the free\n" "libraries that are incorporated in them. (We have not seen how to achieve\n" "this as regards changes in header files, but we have achieved it as regards\n" "changes in the actual functions of the Library.) The hope is that this\n" "will lead to faster development of free libraries.\n" "\n" " The precise terms and conditions for copying, distribution and\n" "modification follow. Pay close attention to the difference between a\n" "\"work based on the library\" and a \"work that uses the library\". The\n" "former contains code derived from the library, while the latter only\n" "works together with the library.\n" "\n" " Note that it is possible for a library to be covered by the ordinary\n" "General Public License rather than by this special one.\n" "\n" " GNU LIBRARY GENERAL PUBLIC LICENSE\n" " TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n" "\n" " 0. This License Agreement applies to any software library which\n" "contains a notice placed by the copyright holder or other authorized\n" "party saying it may be distributed under the terms of this Library\n" "General Public License (also called \"this License\"). Each licensee is\n" "addressed as \"you\".\n" "\n" " A \"library\" means a collection of software functions and/or data\n" "prepared so as to be conveniently linked with application programs\n" "(which use some of those functions and data) to form executables.\n" "\n" " The \"Library\", below, refers to any such software library or work\n" "which has been distributed under these terms. A \"work based on the\n" "Library\" means either the Library or any derivative work under\n" "copyright law: that is to say, a work containing the Library or a\n" "portion of it, either verbatim or with modifications and/or translated\n" "straightforwardly into another language. (Hereinafter, translation is\n" "included without limitation in the term \"modification\".)\n" "\n" " \"Source code\" for a work means the preferred form of the work for\n" "making modifications to it. For a library, complete source code means\n" "all the source code for all modules it contains, plus any associated\n" "interface definition files, plus the scripts used to control compilation\n" "and installation of the library.\n" "\n" " Activities other than copying, distribution and modification are not\n" "covered by this License; they are outside its scope. The act of\n" "running a program using the Library is not restricted, and output from\n" "such a program is covered only if its contents constitute a work based\n" "on the Library (independent of the use of the Library in a tool for\n" "writing it). Whether that is true depends on what the Library does\n" "and what the program that uses the Library does.\n" " \n" " 1. You may copy and distribute verbatim copies of the Library's\n" "complete source code as you receive it, in any medium, provided that\n" "you conspicuously and appropriately publish on each copy an\n" "appropriate copyright notice and disclaimer of warranty; keep intact\n" "all the notices that refer to this License and to the absence of any\n" "warranty; and distribute a copy of this License along with the\n" "Library.\n" "\n" " You may charge a fee for the physical act of transferring a copy,\n" "and you may at your option offer warranty protection in exchange for a\n" "fee.\n" "\n" " 2. You may modify your copy or copies of the Library or any portion\n" "of it, thus forming a work based on the Library, and copy and\n" "distribute such modifications or work under the terms of Section 1\n" "above, provided that you also meet all of these conditions:\n" "\n" " a) The modified work must itself be a software library.\n" "\n" " b) You must cause the files modified to carry prominent notices\n" " stating that you changed the files and the date of any change.\n" "\n" " c) You must cause the whole of the work to be licensed at no\n" " charge to all third parties under the terms of this License.\n" "\n" " d) If a facility in the modified Library refers to a function or a\n" " table of data to be supplied by an application program that uses\n" " the facility, other than as an argument passed when the facility\n" " is invoked, then you must make a good faith effort to ensure that,\n" " in the event an application does not supply such function or\n" " table, the facility still operates, and performs whatever part of\n" " its purpose remains meaningful.\n" "\n" " (For example, a function in a library to compute square roots has\n" " a purpose that is entirely well-defined independent of the\n" " application. Therefore, Subsection 2d requires that any\n" " application-supplied function or table used by this function must\n" " be optional: if the application does not supply it, the square\n" " root function must still compute square roots.)\n" "\n" "These requirements apply to the modified work as a whole. If\n" "identifiable sections of that work are not derived from the Library,\n" "and can be reasonably considered independent and separate works in\n" "themselves, then this License, and its terms, do not apply to those\n" "sections when you distribute them as separate works. But when you\n" "distribute the same sections as part of a whole which is a work based\n" "on the Library, the distribution of the whole must be on the terms of\n" "this License, whose permissions for other licensees extend to the\n" "entire whole, and thus to each and every part regardless of who wrote\n" "it.\n" "\n" "Thus, it is not the intent of this section to claim rights or contest\n" "your rights to work written entirely by you; rather, the intent is to\n" "exercise the right to control the distribution of derivative or\n" "collective works based on the Library.\n" "\n" "In addition, mere aggregation of another work not based on the Library\n" "with the Library (or with a work based on the Library) on a volume of\n" "a storage or distribution medium does not bring the other work under\n" "the scope of this License.\n" "\n" " 3. You may opt to apply the terms of the ordinary GNU General Public\n" "License instead of this License to a given copy of the Library. To do\n" "this, you must alter all the notices that refer to this License, so\n" "that they refer to the ordinary GNU General Public License, version 2,\n" "instead of to this License. (If a newer version than version 2 of the\n" "ordinary GNU General Public License has appeared, then you can specify\n" "that version instead if you wish.) Do not make any other change in\n" "these notices.\n" "\n" " Once this change is made in a given copy, it is irreversible for\n" "that copy, so the ordinary GNU General Public License applies to all\n" "subsequent copies and derivative works made from that copy.\n" "\n" " This option is useful when you wish to copy part of the code of\n" "the Library into a program that is not a library.\n" "\n" " 4. You may copy and distribute the Library (or a portion or\n" "derivative of it, under Section 2) in object code or executable form\n" "under the terms of Sections 1 and 2 above provided that you accompany\n" "it with the complete corresponding machine-readable source code, which\n" "must be distributed under the terms of Sections 1 and 2 above on a\n" "medium customarily used for software interchange.\n" "\n" " If distribution of object code is made by offering access to copy\n" "from a designated place, then offering equivalent access to copy the\n" "source code from the same place satisfies the requirement to\n" "distribute the source code, even though third parties are not\n" "compelled to copy the source along with the object code.\n" "\n" " 5. A program that contains no derivative of any portion of the\n" "Library, but is designed to work with the Library by being compiled or\n" "linked with it, is called a \"work that uses the Library\". Such a\n" "work, in isolation, is not a derivative work of the Library, and\n" "therefore falls outside the scope of this License.\n" "\n" " However, linking a \"work that uses the Library\" with the Library\n" "creates an executable that is a derivative of the Library (because it\n" "contains portions of the Library), rather than a \"work that uses the\n" "library\". The executable is therefore covered by this License.\n" "Section 6 states terms for distribution of such executables.\n" "\n" " When a \"work that uses the Library\" uses material from a header file\n" "that is part of the Library, the object code for the work may be a\n" "derivative work of the Library even though the source code is not.\n" "Whether this is true is especially significant if the work can be\n" "linked without the Library, or if the work is itself a library. The\n" "threshold for this to be true is not precisely defined by law.\n" "\n" " If such an object file uses only numerical parameters, data\n" "structure layouts and accessors, and small macros and small inline\n" "functions (ten lines or less in length), then the use of the object\n" "file is unrestricted, regardless of whether it is legally a derivative\n" "work. (Executables containing this object code plus portions of the\n" "Library will still fall under Section 6.)\n" "\n" " Otherwise, if the work is a derivative of the Library, you may\n" "distribute the object code for the work under the terms of Section 6.\n" "Any executables containing that work also fall under Section 6,\n" "whether or not they are linked directly with the Library itself.\n" "\n" " 6. As an exception to the Sections above, you may also compile or\n" "link a \"work that uses the Library\" with the Library to produce a\n" "work containing portions of the Library, and distribute that work\n" "under terms of your choice, provided that the terms permit\n" "modification of the work for the customer's own use and reverse\n" "engineering for debugging such modifications.\n" "\n" " You must give prominent notice with each copy of the work that the\n" "Library is used in it and that the Library and its use are covered by\n" "this License. You must supply a copy of this License. If the work\n" "during execution displays copyright notices, you must include the\n" "copyright notice for the Library among them, as well as a reference\n" "directing the user to the copy of this License. Also, you must do one\n" "of these things:\n" "\n" " a) Accompany the work with the complete corresponding\n" " machine-readable source code for the Library including whatever\n" " changes were used in the work (which must be distributed under\n" " Sections 1 and 2 above); and, if the work is an executable linked\n" " with the Library, with the complete machine-readable \"work that\n" " uses the Library\", as object code and/or source code, so that the\n" " user can modify the Library and then relink to produce a modified\n" " executable containing the modified Library. (It is understood\n" " that the user who changes the contents of definitions files in the\n" " Library will not necessarily be able to recompile the application\n" " to use the modified definitions.)\n" "\n" " b) Accompany the work with a written offer, valid for at\n" " least three years, to give the same user the materials\n" " specified in Subsection 6a, above, for a charge no more\n" " than the cost of performing this distribution.\n" "\n" " c) If distribution of the work is made by offering access to copy\n" " from a designated place, offer equivalent access to copy the above\n" " specified materials from the same place.\n" "\n" " d) Verify that the user has already received a copy of these\n" " materials or that you have already sent this user a copy.\n" "\n" " For an executable, the required form of the \"work that uses the\n" "Library\" must include any data and utility programs needed for\n" "reproducing the executable from it. However, as a special exception,\n" "the source code distributed need not include anything that is normally\n" "distributed (in either source or binary form) with the major\n" "components (compiler, kernel, and so on) of the operating system on\n" "which the executable runs, unless that component itself accompanies\n" "the executable.\n" "\n" " It may happen that this requirement contradicts the license\n" "restrictions of other proprietary libraries that do not normally\n" "accompany the operating system. Such a contradiction means you cannot\n" "use both them and the Library together in an executable that you\n" "distribute.\n" "\n" " 7. You may place library facilities that are a work based on the\n" "Library side-by-side in a single library together with other library\n" "facilities not covered by this License, and distribute such a combined\n" "library, provided that the separate distribution of the work based on\n" "the Library and of the other library facilities is otherwise\n" "permitted, and provided that you do these two things:\n" "\n" " a) Accompany the combined library with a copy of the same work\n" " based on the Library, uncombined with any other library\n" " facilities. This must be distributed under the terms of the\n" " Sections above.\n" "\n" " b) Give prominent notice with the combined library of the fact\n" " that part of it is a work based on the Library, and explaining\n" " where to find the accompanying uncombined form of the same work.\n" "\n" " 8. You may not copy, modify, sublicense, link with, or distribute\n" "the Library except as expressly provided under this License. Any\n" "attempt otherwise to copy, modify, sublicense, link with, or\n" "distribute the Library is void, and will automatically terminate your\n" "rights under this License. However, parties who have received copies,\n" "or rights, from you under this License will not have their licenses\n" "terminated so long as such parties remain in full compliance.\n" "\n" " 9. You are not required to accept this License, since you have not\n" "signed it. However, nothing else grants you permission to modify or\n" "distribute the Library or its derivative works. These actions are\n" "prohibited by law if you do not accept this License. Therefore, by\n" "modifying or distributing the Library (or any work based on the\n" "Library), you indicate your acceptance of this License to do so, and\n" "all its terms and conditions for copying, distributing or modifying\n" "the Library or works based on it.\n" "\n" " 10. Each time you redistribute the Library (or any work based on the\n" "Library), the recipient automatically receives a license from the\n" "original licensor to copy, distribute, link with or modify the Library\n" "subject to these terms and conditions. You may not impose any further\n" "restrictions on the recipients' exercise of the rights granted herein.\n" "You are not responsible for enforcing compliance by third parties to\n" "this License.\n" "\n" " 11. If, as a consequence of a court judgment or allegation of patent\n" "infringement or for any other reason (not limited to patent issues),\n" "conditions are imposed on you (whether by court order, agreement or\n" "otherwise) that contradict the conditions of this License, they do not\n" "excuse you from the conditions of this License. If you cannot\n" "distribute so as to satisfy simultaneously your obligations under this\n" "License and any other pertinent obligations, then as a consequence you\n" "may not distribute the Library at all. For example, if a patent\n" "license would not permit royalty-free redistribution of the Library by\n" "all those who receive copies directly or indirectly through you, then\n" "the only way you could satisfy both it and this License would be to\n" "refrain entirely from distribution of the Library.\n" "\n" "If any portion of this section is held invalid or unenforceable under any\n" "particular circumstance, the balance of the section is intended to apply,\n" "and the section as a whole is intended to apply in other circumstances.\n" "\n" "It is not the purpose of this section to induce you to infringe any\n" "patents or other property right claims or to contest validity of any\n" "such claims; this section has the sole purpose of protecting the\n" "integrity of the free software distribution system which is\n" "implemented by public license practices. Many people have made\n" "generous contributions to the wide range of software distributed\n" "through that system in reliance on consistent application of that\n" "system; it is up to the author/donor to decide if he or she is willing\n" "to distribute software through any other system and a licensee cannot\n" "impose that choice.\n" "\n" "This section is intended to make thoroughly clear what is believed to\n" "be a consequence of the rest of this License.\n" "\n" " 12. If the distribution and/or use of the Library is restricted in\n" "certain countries either by patents or by copyrighted interfaces, the\n" "original copyright holder who places the Library under this License may add\n" "an explicit geographical distribution limitation excluding those countries,\n" "so that distribution is permitted only in or among countries not thus\n" "excluded. In such case, this License incorporates the limitation as if\n" "written in the body of this License.\n" "\n" " 13. The Free Software Foundation may publish revised and/or new\n" "versions of the Library General Public License from time to time.\n" "Such new versions will be similar in spirit to the present version,\n" "but may differ in detail to address new problems or concerns.\n" "\n" "Each version is given a distinguishing version number. If the Library\n" "specifies a version number of this License which applies to it and\n" "\"any later version\", you have the option of following the terms and\n" "conditions either of that version or of any later version published by\n" "the Free Software Foundation. If the Library does not specify a\n" "license version number, you may choose any version ever published by\n" "the Free Software Foundation.\n" "\n" " 14. If you wish to incorporate parts of the Library into other free\n" "programs whose distribution conditions are incompatible with these,\n" "write to the author to ask for permission. For software which is\n" "copyrighted by the Free Software Foundation, write to the Free\n" "Software Foundation; we sometimes make exceptions for this. Our\n" "decision will be guided by the two goals of preserving the free status\n" "of all derivatives of our free software and of promoting the sharing\n" "and reuse of software generally.\n" "\n" " NO WARRANTY\n" "\n" " 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO\n" "WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.\n" "EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR\n" "OTHER PARTIES PROVIDE THE LIBRARY \"AS IS\" WITHOUT WARRANTY OF ANY\n" "KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE\n" "IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n" "PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE\n" "LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME\n" "THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n" "\n" " 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN\n" "WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY\n" "AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU\n" "FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR\n" "CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE\n" "LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING\n" "RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A\n" "FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF\n" "SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH\n" "DAMAGES.\n" "\n" " END OF TERMS AND CONDITIONS\n" "\n" " How to Apply These Terms to Your New Libraries\n" "\n" " If you develop a new library, and you want it to be of the greatest\n" "possible use to the public, we recommend making it free software that\n" "everyone can redistribute and change. You can do so by permitting\n" "redistribution under these terms (or, alternatively, under the terms of the\n" "ordinary General Public License).\n" "\n" " To apply these terms, attach the following notices to the library. It is\n" "safest to attach them to the start of each source file to most effectively\n" "convey the exclusion of warranty; and each file should have at least the\n" "\"copyright\" line and a pointer to where the full notice is found.\n" "\n" " \n" " Copyright (C) \n" "\n" " This library is free software; you can redistribute it and/or\n" " modify it under the terms of the GNU Library General Public\n" " License as published by the Free Software Foundation; either\n" " version 2 of the License, or (at your option) any later version.\n" "\n" " This library is distributed in the hope that it will be useful,\n" " but WITHOUT ANY WARRANTY; without even the implied warranty of\n" " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n" " Library General Public License for more details.\n" "\n" " You should have received a copy of the GNU Library General Public\n" " License along with this library; if not, write to the \n" " Free Software Foundation, Inc., 59 Temple Place - Suite 330, \n" " Boston, MA 02111-1307 USA.\n" "\n" "Also add information on how to contact you by electronic and paper mail.\n" "\n" "You should also get your employer (if you work as a programmer) or your\n" "school, if any, to sign a \"copyright disclaimer\" for the library, if\n" "necessary. Here is a sample; alter the names:\n" "\n" " Yoyodyne, Inc., hereby disclaims all copyright interest in the\n" " library `Frob' (a library for tweaking knobs) written by James Random Hacker.\n" "\n" " , 1 April 1990\n" " Ty Coon, President of Vice\n" "\n" "That's all there is to it!"; #endif #ifdef USE_BUILDENV static const char *licenseLibcap2 = "Unless otherwise *explicitly* stated, the following text describes the\n" "licensed conditions under which the contents of this libcap release\n" "may be used and distributed:\n" "\n" "-------------------------------------------------------------------------\n" "Redistribution and use in source and binary forms of libcap, with\n" "or without modification, are permitted provided that the following\n" "conditions are met:\n" "\n" "1. Redistributions of source code must retain any existing copyright\n" " notice, and this entire permission notice in its entirety,\n" " including the disclaimer of warranties.\n" "\n" "2. Redistributions in binary form must reproduce all prior and current\n" " copyright notices, this list of conditions, and the following\n" " disclaimer in the documentation and/or other materials provided\n" " with the distribution.\n" "\n" "3. The name of any author may not be used to endorse or promote\n" " products derived from this software without their specific prior\n" " written permission.\n" "\n" "ALTERNATIVELY, this product may be distributed under the terms of the\n" "GNU General Public License (v2.0 - see below), in which case the\n" "provisions of the GNU GPL are required INSTEAD OF the above\n" "restrictions. (This clause is necessary due to a potential conflict\n" "between the GNU GPL and the restrictions contained in a BSD-style\n" "copyright.)\n" "\n" "THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED\n" "WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n" "MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n" "IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,\n" "INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n" "BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS\n" "OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n" "ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR\n" "TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n" "USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH\n" "DAMAGE.\n" "-------------------------------------------------------------------------\n" "\n" "-------------------------\n" "Full text of gpl-2.0.txt:\n" "-------------------------\n" "\n" " GNU GENERAL PUBLIC LICENSE\n" " Version 2, June 1991\n" "\n" " Copyright (C) 1989, 1991 Free Software Foundation, Inc.,\n" " 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n" " Everyone is permitted to copy and distribute verbatim copies\n" " of this license document, but changing it is not allowed.\n" "\n" " Preamble\n" "\n" " The licenses for most software are designed to take away your\n" "freedom to share and change it. By contrast, the GNU General Public\n" "License is intended to guarantee your freedom to share and change free\n" "software--to make sure the software is free for all its users. This\n" "General Public License applies to most of the Free Software\n" "Foundation's software and to any other program whose authors commit to\n" "using it. (Some other Free Software Foundation software is covered by\n" "the GNU Lesser General Public License instead.) You can apply it to\n" "your programs, too.\n" "\n" " When we speak of free software, we are referring to freedom, not\n" "price. Our General Public Licenses are designed to make sure that you\n" "have the freedom to distribute copies of free software (and charge for\n" "this service if you wish), that you receive source code or can get it\n" "if you want it, that you can change the software or use pieces of it\n" "in new free programs; and that you know you can do these things.\n" "\n" " To protect your rights, we need to make restrictions that forbid\n" "anyone to deny you these rights or to ask you to surrender the rights.\n" "These restrictions translate to certain responsibilities for you if you\n" "distribute copies of the software, or if you modify it.\n" "\n" " For example, if you distribute copies of such a program, whether\n" "gratis or for a fee, you must give the recipients all the rights that\n" "you have. You must make sure that they, too, receive or can get the\n" "source code. And you must show them these terms so they know their\n" "rights.\n" "\n" " We protect your rights with two steps: (1) copyright the software, and\n" "(2) offer you this license which gives you legal permission to copy,\n" "distribute and/or modify the software.\n" "\n" " Also, for each author's protection and ours, we want to make certain\n" "that everyone understands that there is no warranty for this free\n" "software. If the software is modified by someone else and passed on, we\n" "want its recipients to know that what they have is not the original, so\n" "that any problems introduced by others will not reflect on the original\n" "authors' reputations.\n" "\n" " Finally, any free program is threatened constantly by software\n" "patents. We wish to avoid the danger that redistributors of a free\n" "program will individually obtain patent licenses, in effect making the\n" "program proprietary. To prevent this, we have made it clear that any\n" "patent must be licensed for everyone's free use or not licensed at all.\n" "\n" " The precise terms and conditions for copying, distribution and\n" "modification follow.\n" "\n" " GNU GENERAL PUBLIC LICENSE\n" " TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n" "\n" " 0. This License applies to any program or other work which contains\n" "a notice placed by the copyright holder saying it may be distributed\n" "under the terms of this General Public License. The \"Program\", below,\n" "refers to any such program or work, and a \"work based on the Program\"\n" "means either the Program or any derivative work under copyright law:\n" "that is to say, a work containing the Program or a portion of it,\n" "either verbatim or with modifications and/or translated into another\n" "language. (Hereinafter, translation is included without limitation in\n" "the term \"modification\".) Each licensee is addressed as \"you\".\n" "\n" "Activities other than copying, distribution and modification are not\n" "covered by this License; they are outside its scope. The act of\n" "running the Program is not restricted, and the output from the Program\n" "is covered only if its contents constitute a work based on the\n" "Program (independent of having been made by running the Program).\n" "Whether that is true depends on what the Program does.\n" "\n" " 1. You may copy and distribute verbatim copies of the Program's\n" "source code as you receive it, in any medium, provided that you\n" "conspicuously and appropriately publish on each copy an appropriate\n" "copyright notice and disclaimer of warranty; keep intact all the\n" "notices that refer to this License and to the absence of any warranty;\n" "and give any other recipients of the Program a copy of this License\n" "along with the Program.\n" "\n" "You may charge a fee for the physical act of transferring a copy, and\n" "you may at your option offer warranty protection in exchange for a fee.\n" "\n" " 2. You may modify your copy or copies of the Program or any portion\n" "of it, thus forming a work based on the Program, and copy and\n" "distribute such modifications or work under the terms of Section 1\n" "above, provided that you also meet all of these conditions:\n" "\n" " a) You must cause the modified files to carry prominent notices\n" " stating that you changed the files and the date of any change.\n" "\n" " b) You must cause any work that you distribute or publish, that in\n" " whole or in part contains or is derived from the Program or any\n" " part thereof, to be licensed as a whole at no charge to all third\n" " parties under the terms of this License.\n" "\n" " c) If the modified program normally reads commands interactively\n" " when run, you must cause it, when started running for such\n" " interactive use in the most ordinary way, to print or display an\n" " announcement including an appropriate copyright notice and a\n" " notice that there is no warranty (or else, saying that you provide\n" " a warranty) and that users may redistribute the program under\n" " these conditions, and telling the user how to view a copy of this\n" " License. (Exception: if the Program itself is interactive but\n" " does not normally print such an announcement, your work based on\n" " the Program is not required to print an announcement.)\n" "\n" "These requirements apply to the modified work as a whole. If\n" "identifiable sections of that work are not derived from the Program,\n" "and can be reasonably considered independent and separate works in\n" "themselves, then this License, and its terms, do not apply to those\n" "sections when you distribute them as separate works. But when you\n" "distribute the same sections as part of a whole which is a work based\n" "on the Program, the distribution of the whole must be on the terms of\n" "this License, whose permissions for other licensees extend to the\n" "entire whole, and thus to each and every part regardless of who wrote it.\n" "\n" "Thus, it is not the intent of this section to claim rights or contest\n" "your rights to work written entirely by you; rather, the intent is to\n" "exercise the right to control the distribution of derivative or\n" "collective works based on the Program.\n" "\n" "In addition, mere aggregation of another work not based on the Program\n" "with the Program (or with a work based on the Program) on a volume of\n" "a storage or distribution medium does not bring the other work under\n" "the scope of this License.\n" "\n" " 3. You may copy and distribute the Program (or a work based on it,\n" "under Section 2) in object code or executable form under the terms of\n" "Sections 1 and 2 above provided that you also do one of the following:\n" "\n" " a) Accompany it with the complete corresponding machine-readable\n" " source code, which must be distributed under the terms of Sections\n" " 1 and 2 above on a medium customarily used for software interchange; or,\n" "\n" " b) Accompany it with a written offer, valid for at least three\n" " years, to give any third party, for a charge no more than your\n" " cost of physically performing source distribution, a complete\n" " machine-readable copy of the corresponding source code, to be\n" " distributed under the terms of Sections 1 and 2 above on a medium\n" " customarily used for software interchange; or,\n" "\n" " c) Accompany it with the information you received as to the offer\n" " to distribute corresponding source code. (This alternative is\n" " allowed only for noncommercial distribution and only if you\n" " received the program in object code or executable form with such\n" " an offer, in accord with Subsection b above.)\n" "\n" "The source code for a work means the preferred form of the work for\n" "making modifications to it. For an executable work, complete source\n" "code means all the source code for all modules it contains, plus any\n" "associated interface definition files, plus the scripts used to\n" "control compilation and installation of the executable. However, as a\n" "special exception, the source code distributed need not include\n" "anything that is normally distributed (in either source or binary\n" "form) with the major components (compiler, kernel, and so on) of the\n" "operating system on which the executable runs, unless that component\n" "itself accompanies the executable.\n" "\n" "If distribution of executable or object code is made by offering\n" "access to copy from a designated place, then offering equivalent\n" "access to copy the source code from the same place counts as\n" "distribution of the source code, even though third parties are not\n" "compelled to copy the source along with the object code.\n" "\n" " 4. You may not copy, modify, sublicense, or distribute the Program\n" "except as expressly provided under this License. Any attempt\n" "otherwise to copy, modify, sublicense or distribute the Program is\n" "void, and will automatically terminate your rights under this License.\n" "However, parties who have received copies, or rights, from you under\n" "this License will not have their licenses terminated so long as such\n" "parties remain in full compliance.\n" "\n" " 5. You are not required to accept this License, since you have not\n" "signed it. However, nothing else grants you permission to modify or\n" "distribute the Program or its derivative works. These actions are\n" "prohibited by law if you do not accept this License. Therefore, by\n" "modifying or distributing the Program (or any work based on the\n" "Program), you indicate your acceptance of this License to do so, and\n" "all its terms and conditions for copying, distributing or modifying\n" "the Program or works based on it.\n" "\n" " 6. Each time you redistribute the Program (or any work based on the\n" "Program), the recipient automatically receives a license from the\n" "original licensor to copy, distribute or modify the Program subject to\n" "these terms and conditions. You may not impose any further\n" "restrictions on the recipients' exercise of the rights granted herein.\n" "You are not responsible for enforcing compliance by third parties to\n" "this License.\n" "\n" " 7. If, as a consequence of a court judgment or allegation of patent\n" "infringement or for any other reason (not limited to patent issues),\n" "conditions are imposed on you (whether by court order, agreement or\n" "otherwise) that contradict the conditions of this License, they do not\n" "excuse you from the conditions of this License. If you cannot\n" "distribute so as to satisfy simultaneously your obligations under this\n" "License and any other pertinent obligations, then as a consequence you\n" "may not distribute the Program at all. For example, if a patent\n" "license would not permit royalty-free redistribution of the Program by\n" "all those who receive copies directly or indirectly through you, then\n" "the only way you could satisfy both it and this License would be to\n" "refrain entirely from distribution of the Program.\n" "\n" "If any portion of this section is held invalid or unenforceable under\n" "any particular circumstance, the balance of the section is intended to\n" "apply and the section as a whole is intended to apply in other\n" "circumstances.\n" "\n" "It is not the purpose of this section to induce you to infringe any\n" "patents or other property right claims or to contest validity of any\n" "such claims; this section has the sole purpose of protecting the\n" "integrity of the free software distribution system, which is\n" "implemented by public license practices. Many people have made\n" "generous contributions to the wide range of software distributed\n" "through that system in reliance on consistent application of that\n" "system; it is up to the author/donor to decide if he or she is willing\n" "to distribute software through any other system and a licensee cannot\n" "impose that choice.\n" "\n" "This section is intended to make thoroughly clear what is believed to\n" "be a consequence of the rest of this License.\n" "\n" " 8. If the distribution and/or use of the Program is restricted in\n" "certain countries either by patents or by copyrighted interfaces, the\n" "original copyright holder who places the Program under this License\n" "may add an explicit geographical distribution limitation excluding\n" "those countries, so that distribution is permitted only in or among\n" "countries not thus excluded. In such case, this License incorporates\n" "the limitation as if written in the body of this License.\n" "\n" " 9. The Free Software Foundation may publish revised and/or new versions\n" "of the General Public License from time to time. Such new versions will\n" "be similar in spirit to the present version, but may differ in detail to\n" "address new problems or concerns.\n" "\n" "Each version is given a distinguishing version number. If the Program\n" "specifies a version number of this License which applies to it and \"any\n" "later version\", you have the option of following the terms and conditions\n" "either of that version or of any later version published by the Free\n" "Software Foundation. If the Program does not specify a version number of\n" "this License, you may choose any version ever published by the Free Software\n" "Foundation.\n" "\n" " 10. If you wish to incorporate parts of the Program into other free\n" "programs whose distribution conditions are different, write to the author\n" "to ask for permission. For software which is copyrighted by the Free\n" "Software Foundation, write to the Free Software Foundation; we sometimes\n" "make exceptions for this. Our decision will be guided by the two goals\n" "of preserving the free status of all derivatives of our free software and\n" "of promoting the sharing and reuse of software generally.\n" "\n" " NO WARRANTY\n" "\n" " 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\n" "FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN\n" "OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\n" "PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\n" "OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n" "MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS\n" "TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE\n" "PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\n" "REPAIR OR CORRECTION.\n" "\n" " 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\n" "WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\n" "REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\n" "INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\n" "OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\n" "TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\n" "YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\n" "PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\n" "POSSIBILITY OF SUCH DAMAGES.\n" "\n" " END OF TERMS AND CONDITIONS\n" "\n" " How to Apply These Terms to Your New Programs\n" "\n" " If you develop a new program, and you want it to be of the greatest\n" "possible use to the public, the best way to achieve this is to make it\n" "free software which everyone can redistribute and change under these terms.\n" "\n" " To do so, attach the following notices to the program. It is safest\n" "to attach them to the start of each source file to most effectively\n" "convey the exclusion of warranty; and each file should have at least\n" "the \"copyright\" line and a pointer to where the full notice is found.\n" "\n" " \n" " Copyright (C) \n" "\n" " This program is free software; you can redistribute it and/or modify\n" " it under the terms of the GNU General Public License as published by\n" " the Free Software Foundation; either version 2 of the License, or\n" " (at your option) any later version.\n" "\n" " This program is distributed in the hope that it will be useful,\n" " but WITHOUT ANY WARRANTY; without even the implied warranty of\n" " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" " GNU General Public License for more details.\n" "\n" " You should have received a copy of the GNU General Public License along\n" " with this program; if not, write to the Free Software Foundation, Inc.,\n" " 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n" "\n" "Also add information on how to contact you by electronic and paper mail.\n" "\n" "If the program is interactive, make it output a short notice like this\n" "when it starts in an interactive mode:\n" "\n" " Gnomovision version 69, Copyright (C) year name of author\n" " Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n" " This is free software, and you are welcome to redistribute it\n" " under certain conditions; type `show c' for details.\n" "\n" "The hypothetical commands `show w' and `show c' should show the appropriate\n" "parts of the General Public License. Of course, the commands you use may\n" "be called something other than `show w' and `show c'; they could even be\n" "mouse-clicks or menu items--whatever suits your program.\n" "\n" "You should also get your employer (if you work as a programmer) or your\n" "school, if any, to sign a \"copyright disclaimer\" for the program, if\n" "necessary. Here is a sample; alter the names:\n" "\n" " Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n" " `Gnomovision' (which makes passes at compilers) written by James Hacker.\n" "\n" " , 1 April 1989\n" " Ty Coon, President of Vice\n" "\n" "This General Public License does not permit incorporating your program into\n" "proprietary programs. If your program is a subroutine library, you may\n" "consider it more useful to permit linking proprietary applications with the\n" "library. If this is what you want to do, use the GNU Lesser General\n" "Public License instead of this License."; #endif #ifdef USE_BUILDENV static const char *licenseLibdaemon = "Copyright 2003-2009 Lennart Poettering \n" "\n" "This program is free software; you can redistribute it and/or modify it\n" "under the terms of the GNU Lesser General Public License as published\n" "by the Free Software Foundation, either version 2.1 of the License, or\n" "(at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful, but\n" "WITHOUT ANY WARRANTY; without even the implied warranty of\n" "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser\n" "General Public License for more details.\n" "\n" "\n" " GNU LESSER GENERAL PUBLIC LICENSE\n" " Version 2.1, February 1999\n" "\n" " Copyright (C) 1991, 1999 Free Software Foundation, Inc.\n" " 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n" " Everyone is permitted to copy and distribute verbatim copies\n" " of this license document, but changing it is not allowed.\n" "\n" "[This is the first released version of the Lesser GPL. It also counts\n" " as the successor of the GNU Library Public License, version 2, hence\n" " the version number 2.1.]\n" "\n" " Preamble\n" "\n" " The licenses for most software are designed to take away your\n" "freedom to share and change it. By contrast, the GNU General Public\n" "Licenses are intended to guarantee your freedom to share and change\n" "free software--to make sure the software is free for all its users.\n" "\n" " This license, the Lesser General Public License, applies to some\n" "specially designated software packages--typically libraries--of the\n" "Free Software Foundation and other authors who decide to use it. You\n" "can use it too, but we suggest you first think carefully about whether\n" "this license or the ordinary General Public License is the better\n" "strategy to use in any particular case, based on the explanations\n" "below.\n" "\n" " When we speak of free software, we are referring to freedom of use,\n" "not price. Our General Public Licenses are designed to make sure that\n" "you have the freedom to distribute copies of free software (and charge\n" "for this service if you wish); that you receive source code or can get\n" "it if you want it; that you can change the software and use pieces of\n" "it in new free programs; and that you are informed that you can do\n" "these things.\n" "\n" " To protect your rights, we need to make restrictions that forbid\n" "distributors to deny you these rights or to ask you to surrender these\n" "rights. These restrictions translate to certain responsibilities for\n" "you if you distribute copies of the library or if you modify it.\n" "\n" " For example, if you distribute copies of the library, whether gratis\n" "or for a fee, you must give the recipients all the rights that we gave\n" "you. You must make sure that they, too, receive or can get the source\n" "code. If you link other code with the library, you must provide\n" "complete object files to the recipients, so that they can relink them\n" "with the library after making changes to the library and recompiling\n" "it. And you must show them these terms so they know their rights.\n" "\n" " We protect your rights with a two-step method: (1) we copyright the\n" "library, and (2) we offer you this license, which gives you legal\n" "permission to copy, distribute and/or modify the library.\n" "\n" " To protect each distributor, we want to make it very clear that\n" "there is no warranty for the free library. Also, if the library is\n" "modified by someone else and passed on, the recipients should know\n" "that what they have is not the original version, so that the original\n" "author's reputation will not be affected by problems that might be\n" "introduced by others.\n" "\n" " Finally, software patents pose a constant threat to the existence of\n" "any free program. We wish to make sure that a company cannot\n" "effectively restrict the users of a free program by obtaining a\n" "restrictive license from a patent holder. Therefore, we insist that\n" "any patent license obtained for a version of the library must be\n" "consistent with the full freedom of use specified in this license.\n" "\n" " Most GNU software, including some libraries, is covered by the\n" "ordinary GNU General Public License. This license, the GNU Lesser\n" "General Public License, applies to certain designated libraries, and\n" "is quite different from the ordinary General Public License. We use\n" "this license for certain libraries in order to permit linking those\n" "libraries into non-free programs.\n" "\n" " When a program is linked with a library, whether statically or using\n" "a shared library, the combination of the two is legally speaking a\n" "combined work, a derivative of the original library. The ordinary\n" "General Public License therefore permits such linking only if the\n" "entire combination fits its criteria of freedom. The Lesser General\n" "Public License permits more lax criteria for linking other code with\n" "the library.\n" "\n" " We call this license the \"Lesser\" General Public License because it\n" "does Less to protect the user's freedom than the ordinary General\n" "Public License. It also provides other free software developers Less\n" "of an advantage over competing non-free programs. These disadvantages\n" "are the reason we use the ordinary General Public License for many\n" "libraries. However, the Lesser license provides advantages in certain\n" "special circumstances.\n" "\n" " For example, on rare occasions, there may be a special need to\n" "encourage the widest possible use of a certain library, so that it\n" "becomes a de-facto standard. To achieve this, non-free programs must\n" "be allowed to use the library. A more frequent case is that a free\n" "library does the same job as widely used non-free libraries. In this\n" "case, there is little to gain by limiting the free library to free\n" "software only, so we use the Lesser General Public License.\n" "\n" " In other cases, permission to use a particular library in non-free\n" "programs enables a greater number of people to use a large body of\n" "free software. For example, permission to use the GNU C Library in\n" "non-free programs enables many more people to use the whole GNU\n" "operating system, as well as its variant, the GNU/Linux operating\n" "system.\n" "\n" " Although the Lesser General Public License is Less protective of the\n" "users' freedom, it does ensure that the user of a program that is\n" "linked with the Library has the freedom and the wherewithal to run\n" "that program using a modified version of the Library.\n" "\n" " The precise terms and conditions for copying, distribution and\n" "modification follow. Pay close attention to the difference between a\n" "\"work based on the library\" and a \"work that uses the library\". The\n" "former contains code derived from the library, whereas the latter must\n" "be combined with the library in order to run.\n" "\n" " GNU LESSER GENERAL PUBLIC LICENSE\n" " TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n" "\n" " 0. This License Agreement applies to any software library or other\n" "program which contains a notice placed by the copyright holder or\n" "other authorized party saying it may be distributed under the terms of\n" "this Lesser General Public License (also called \"this License\").\n" "Each licensee is addressed as \"you\".\n" "\n" " A \"library\" means a collection of software functions and/or data\n" "prepared so as to be conveniently linked with application programs\n" "(which use some of those functions and data) to form executables.\n" "\n" " The \"Library\", below, refers to any such software library or work\n" "which has been distributed under these terms. A \"work based on the\n" "Library\" means either the Library or any derivative work under\n" "copyright law: that is to say, a work containing the Library or a\n" "portion of it, either verbatim or with modifications and/or translated\n" "straightforwardly into another language. (Hereinafter, translation is\n" "included without limitation in the term \"modification\".)\n" "\n" " \"Source code\" for a work means the preferred form of the work for\n" "making modifications to it. For a library, complete source code means\n" "all the source code for all modules it contains, plus any associated\n" "interface definition files, plus the scripts used to control\n" "compilation and installation of the library.\n" "\n" " Activities other than copying, distribution and modification are not\n" "covered by this License; they are outside its scope. The act of\n" "running a program using the Library is not restricted, and output from\n" "such a program is covered only if its contents constitute a work based\n" "on the Library (independent of the use of the Library in a tool for\n" "writing it). Whether that is true depends on what the Library does\n" "and what the program that uses the Library does.\n" "\n" " 1. You may copy and distribute verbatim copies of the Library's\n" "complete source code as you receive it, in any medium, provided that\n" "you conspicuously and appropriately publish on each copy an\n" "appropriate copyright notice and disclaimer of warranty; keep intact\n" "all the notices that refer to this License and to the absence of any\n" "warranty; and distribute a copy of this License along with the\n" "Library.\n" "\n" " You may charge a fee for the physical act of transferring a copy,\n" "and you may at your option offer warranty protection in exchange for a\n" "fee.\n" "\n" " 2. You may modify your copy or copies of the Library or any portion\n" "of it, thus forming a work based on the Library, and copy and\n" "distribute such modifications or work under the terms of Section 1\n" "above, provided that you also meet all of these conditions:\n" "\n" " a) The modified work must itself be a software library.\n" "\n" " b) You must cause the files modified to carry prominent notices\n" " stating that you changed the files and the date of any change.\n" "\n" " c) You must cause the whole of the work to be licensed at no\n" " charge to all third parties under the terms of this License.\n" "\n" " d) If a facility in the modified Library refers to a function or a\n" " table of data to be supplied by an application program that uses\n" " the facility, other than as an argument passed when the facility\n" " is invoked, then you must make a good faith effort to ensure that,\n" " in the event an application does not supply such function or\n" " table, the facility still operates, and performs whatever part of\n" " its purpose remains meaningful.\n" "\n" " (For example, a function in a library to compute square roots has\n" " a purpose that is entirely well-defined independent of the\n" " application. Therefore, Subsection 2d requires that any\n" " application-supplied function or table used by this function must\n" " be optional: if the application does not supply it, the square\n" " root function must still compute square roots.)\n" "\n" "These requirements apply to the modified work as a whole. If\n" "identifiable sections of that work are not derived from the Library,\n" "and can be reasonably considered independent and separate works in\n" "themselves, then this License, and its terms, do not apply to those\n" "sections when you distribute them as separate works. But when you\n" "distribute the same sections as part of a whole which is a work based\n" "on the Library, the distribution of the whole must be on the terms of\n" "this License, whose permissions for other licensees extend to the\n" "entire whole, and thus to each and every part regardless of who wrote\n" "it.\n" "\n" "Thus, it is not the intent of this section to claim rights or contest\n" "your rights to work written entirely by you; rather, the intent is to\n" "exercise the right to control the distribution of derivative or\n" "collective works based on the Library.\n" "\n" "In addition, mere aggregation of another work not based on the Library\n" "with the Library (or with a work based on the Library) on a volume of\n" "a storage or distribution medium does not bring the other work under\n" "the scope of this License.\n" "\n" " 3. You may opt to apply the terms of the ordinary GNU General Public\n" "License instead of this License to a given copy of the Library. To do\n" "this, you must alter all the notices that refer to this License, so\n" "that they refer to the ordinary GNU General Public License, version 2,\n" "instead of to this License. (If a newer version than version 2 of the\n" "ordinary GNU General Public License has appeared, then you can specify\n" "that version instead if you wish.) Do not make any other change in\n" "these notices.\n" "\n" " Once this change is made in a given copy, it is irreversible for\n" "that copy, so the ordinary GNU General Public License applies to all\n" "subsequent copies and derivative works made from that copy.\n" "\n" " This option is useful when you wish to copy part of the code of\n" "the Library into a program that is not a library.\n" "\n" " 4. You may copy and distribute the Library (or a portion or\n" "derivative of it, under Section 2) in object code or executable form\n" "under the terms of Sections 1 and 2 above provided that you accompany\n" "it with the complete corresponding machine-readable source code, which\n" "must be distributed under the terms of Sections 1 and 2 above on a\n" "medium customarily used for software interchange.\n" "\n" " If distribution of object code is made by offering access to copy\n" "from a designated place, then offering equivalent access to copy the\n" "source code from the same place satisfies the requirement to\n" "distribute the source code, even though third parties are not\n" "compelled to copy the source along with the object code.\n" "\n" " 5. A program that contains no derivative of any portion of the\n" "Library, but is designed to work with the Library by being compiled or\n" "linked with it, is called a \"work that uses the Library\". Such a\n" "work, in isolation, is not a derivative work of the Library, and\n" "therefore falls outside the scope of this License.\n" "\n" " However, linking a \"work that uses the Library\" with the Library\n" "creates an executable that is a derivative of the Library (because it\n" "contains portions of the Library), rather than a \"work that uses the\n" "library\". The executable is therefore covered by this License.\n" "Section 6 states terms for distribution of such executables.\n" "\n" " When a \"work that uses the Library\" uses material from a header file\n" "that is part of the Library, the object code for the work may be a\n" "derivative work of the Library even though the source code is not.\n" "Whether this is true is especially significant if the work can be\n" "linked without the Library, or if the work is itself a library. The\n" "threshold for this to be true is not precisely defined by law.\n" "\n" " If such an object file uses only numerical parameters, data\n" "structure layouts and accessors, and small macros and small inline\n" "functions (ten lines or less in length), then the use of the object\n" "file is unrestricted, regardless of whether it is legally a derivative\n" "work. (Executables containing this object code plus portions of the\n" "Library will still fall under Section 6.)\n" "\n" " Otherwise, if the work is a derivative of the Library, you may\n" "distribute the object code for the work under the terms of Section 6.\n" "Any executables containing that work also fall under Section 6,\n" "whether or not they are linked directly with the Library itself.\n" "\n" " 6. As an exception to the Sections above, you may also combine or\n" "link a \"work that uses the Library\" with the Library to produce a\n" "work containing portions of the Library, and distribute that work\n" "under terms of your choice, provided that the terms permit\n" "modification of the work for the customer's own use and reverse\n" "engineering for debugging such modifications.\n" "\n" " You must give prominent notice with each copy of the work that the\n" "Library is used in it and that the Library and its use are covered by\n" "this License. You must supply a copy of this License. If the work\n" "during execution displays copyright notices, you must include the\n" "copyright notice for the Library among them, as well as a reference\n" "directing the user to the copy of this License. Also, you must do one\n" "of these things:\n" "\n" " a) Accompany the work with the complete corresponding\n" " machine-readable source code for the Library including whatever\n" " changes were used in the work (which must be distributed under\n" " Sections 1 and 2 above); and, if the work is an executable linked\n" " with the Library, with the complete machine-readable \"work that\n" " uses the Library\", as object code and/or source code, so that the\n" " user can modify the Library and then relink to produce a modified\n" " executable containing the modified Library. (It is understood\n" " that the user who changes the contents of definitions files in the\n" " Library will not necessarily be able to recompile the application\n" " to use the modified definitions.)\n" "\n" " b) Use a suitable shared library mechanism for linking with the\n" " Library. A suitable mechanism is one that (1) uses at run time a\n" " copy of the library already present on the user's computer system,\n" " rather than copying library functions into the executable, and (2)\n" " will operate properly with a modified version of the library, if\n" " the user installs one, as long as the modified version is\n" " interface-compatible with the version that the work was made with.\n" "\n" " c) Accompany the work with a written offer, valid for at least\n" " three years, to give the same user the materials specified in\n" " Subsection 6a, above, for a charge no more than the cost of\n" " performing this distribution.\n" "\n" " d) If distribution of the work is made by offering access to copy\n" " from a designated place, offer equivalent access to copy the above\n" " specified materials from the same place.\n" "\n" " e) Verify that the user has already received a copy of these\n" " materials or that you have already sent this user a copy.\n" "\n" " For an executable, the required form of the \"work that uses the\n" "Library\" must include any data and utility programs needed for\n" "reproducing the executable from it. However, as a special exception,\n" "the materials to be distributed need not include anything that is\n" "normally distributed (in either source or binary form) with the major\n" "components (compiler, kernel, and so on) of the operating system on\n" "which the executable runs, unless that component itself accompanies\n" "the executable.\n" "\n" " It may happen that this requirement contradicts the license\n" "restrictions of other proprietary libraries that do not normally\n" "accompany the operating system. Such a contradiction means you cannot\n" "use both them and the Library together in an executable that you\n" "distribute.\n" "\n" " 7. You may place library facilities that are a work based on the\n" "Library side-by-side in a single library together with other library\n" "facilities not covered by this License, and distribute such a combined\n" "library, provided that the separate distribution of the work based on\n" "the Library and of the other library facilities is otherwise\n" "permitted, and provided that you do these two things:\n" "\n" " a) Accompany the combined library with a copy of the same work\n" " based on the Library, uncombined with any other library\n" " facilities. This must be distributed under the terms of the\n" " Sections above.\n" "\n" " b) Give prominent notice with the combined library of the fact\n" " that part of it is a work based on the Library, and explaining\n" " where to find the accompanying uncombined form of the same work.\n" "\n" " 8. You may not copy, modify, sublicense, link with, or distribute\n" "the Library except as expressly provided under this License. Any\n" "attempt otherwise to copy, modify, sublicense, link with, or\n" "distribute the Library is void, and will automatically terminate your\n" "rights under this License. However, parties who have received copies,\n" "or rights, from you under this License will not have their licenses\n" "terminated so long as such parties remain in full compliance.\n" "\n" " 9. You are not required to accept this License, since you have not\n" "signed it. However, nothing else grants you permission to modify or\n" "distribute the Library or its derivative works. These actions are\n" "prohibited by law if you do not accept this License. Therefore, by\n" "modifying or distributing the Library (or any work based on the\n" "Library), you indicate your acceptance of this License to do so, and\n" "all its terms and conditions for copying, distributing or modifying\n" "the Library or works based on it.\n" "\n" " 10. Each time you redistribute the Library (or any work based on the\n" "Library), the recipient automatically receives a license from the\n" "original licensor to copy, distribute, link with or modify the Library\n" "subject to these terms and conditions. You may not impose any further\n" "restrictions on the recipients' exercise of the rights granted herein.\n" "You are not responsible for enforcing compliance by third parties with\n" "this License.\n" "\n" " 11. If, as a consequence of a court judgment or allegation of patent\n" "infringement or for any other reason (not limited to patent issues),\n" "conditions are imposed on you (whether by court order, agreement or\n" "otherwise) that contradict the conditions of this License, they do not\n" "excuse you from the conditions of this License. If you cannot\n" "distribute so as to satisfy simultaneously your obligations under this\n" "License and any other pertinent obligations, then as a consequence you\n" "may not distribute the Library at all. For example, if a patent\n" "license would not permit royalty-free redistribution of the Library by\n" "all those who receive copies directly or indirectly through you, then\n" "the only way you could satisfy both it and this License would be to\n" "refrain entirely from distribution of the Library.\n" "\n" "If any portion of this section is held invalid or unenforceable under\n" "any particular circumstance, the balance of the section is intended to\n" "apply, and the section as a whole is intended to apply in other\n" "circumstances.\n" "\n" "It is not the purpose of this section to induce you to infringe any\n" "patents or other property right claims or to contest validity of any\n" "such claims; this section has the sole purpose of protecting the\n" "integrity of the free software distribution system which is\n" "implemented by public license practices. Many people have made\n" "generous contributions to the wide range of software distributed\n" "through that system in reliance on consistent application of that\n" "system; it is up to the author/donor to decide if he or she is willing\n" "to distribute software through any other system and a licensee cannot\n" "impose that choice.\n" "\n" "This section is intended to make thoroughly clear what is believed to\n" "be a consequence of the rest of this License.\n" "\n" " 12. If the distribution and/or use of the Library is restricted in\n" "certain countries either by patents or by copyrighted interfaces, the\n" "original copyright holder who places the Library under this License\n" "may add an explicit geographical distribution limitation excluding those\n" "countries, so that distribution is permitted only in or among\n" "countries not thus excluded. In such case, this License incorporates\n" "the limitation as if written in the body of this License.\n" "\n" " 13. The Free Software Foundation may publish revised and/or new\n" "versions of the Lesser General Public License from time to time.\n" "Such new versions will be similar in spirit to the present version,\n" "but may differ in detail to address new problems or concerns.\n" "\n" "Each version is given a distinguishing version number. If the Library\n" "specifies a version number of this License which applies to it and\n" "\"any later version\", you have the option of following the terms and\n" "conditions either of that version or of any later version published by\n" "the Free Software Foundation. If the Library does not specify a\n" "license version number, you may choose any version ever published by\n" "the Free Software Foundation.\n" "\n" " 14. If you wish to incorporate parts of the Library into other free\n" "programs whose distribution conditions are incompatible with these,\n" "write to the author to ask for permission. For software which is\n" "copyrighted by the Free Software Foundation, write to the Free\n" "Software Foundation; we sometimes make exceptions for this. Our\n" "decision will be guided by the two goals of preserving the free status\n" "of all derivatives of our free software and of promoting the sharing\n" "and reuse of software generally.\n" "\n" " NO WARRANTY\n" "\n" " 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO\n" "WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.\n" "EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR\n" "OTHER PARTIES PROVIDE THE LIBRARY \"AS IS\" WITHOUT WARRANTY OF ANY\n" "KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE\n" "IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n" "PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE\n" "LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME\n" "THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n" "\n" " 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN\n" "WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY\n" "AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU\n" "FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR\n" "CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE\n" "LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING\n" "RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A\n" "FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF\n" "SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH\n" "DAMAGES.\n" "\n" " END OF TERMS AND CONDITIONS\n" "\n" " How to Apply These Terms to Your New Libraries\n" "\n" " If you develop a new library, and you want it to be of the greatest\n" "possible use to the public, we recommend making it free software that\n" "everyone can redistribute and change. You can do so by permitting\n" "redistribution under these terms (or, alternatively, under the terms\n" "of the ordinary General Public License).\n" "\n" " To apply these terms, attach the following notices to the library.\n" "It is safest to attach them to the start of each source file to most\n" "effectively convey the exclusion of warranty; and each file should\n" "have at least the \"copyright\" line and a pointer to where the full\n" "notice is found.\n" "\n" "\n" " \n" " Copyright (C) \n" "\n" " This library is free software; you can redistribute it and/or\n" " modify it under the terms of the GNU Lesser General Public\n" " License as published by the Free Software Foundation; either\n" " version 2.1 of the License, or (at your option) any later version.\n" "\n" " This library is distributed in the hope that it will be useful,\n" " but WITHOUT ANY WARRANTY; without even the implied warranty of\n" " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n" " Lesser General Public License for more details.\n" "\n" " You should have received a copy of the GNU Lesser General Public\n" " License along with this library; if not, write to the Free Software\n" " Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n" "\n" "Also add information on how to contact you by electronic and paper mail.\n" "\n" "You should also get your employer (if you work as a programmer) or\n" "your school, if any, to sign a \"copyright disclaimer\" for the library,\n" "if necessary. Here is a sample; alter the names:\n" "\n" " Yoyodyne, Inc., hereby disclaims all copyright interest in the\n" " library `Frob' (a library for tweaking knobs) written by James\n" " Random Hacker.\n" "\n" " , 1 April 1990\n" " Ty Coon, President of Vice\n" "\n" "That's all there is to it!"; #endif #ifdef USE_BUILDENV static const char *licenseLibffi = "libffi - Copyright (c) 1996-2014 Anthony Green, Red Hat, Inc and others.\n" "See source files for details.\n" "\n" "Permission is hereby granted, free of charge, to any person obtaining\n" "a copy of this software and associated documentation files (the\n" "``Software''), to deal in the Software without restriction, including\n" "without limitation the rights to use, copy, modify, merge, publish,\n" "distribute, sublicense, and/or sell copies of the Software, and to\n" "permit persons to whom the Software is furnished to do so, subject to\n" "the following conditions:\n" "\n" "The above copyright notice and this permission notice shall be\n" "included in all copies or substantial portions of the Software.\n" "\n" "THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,\n" "EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n" "MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n" "IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n" "CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n" "TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n" "SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."; #endif static const ThirdPartyLicense licenses3rdParties[] = { ThirdPartyLicense("CELT", "http://www.celt-codec.org/", licenseCELT), ThirdPartyLicense("Opus", "http://www.opus-codec.org/", licenseOpus), ThirdPartyLicense("Speex", "http://www.speex.org/", licenseSPEEX), ThirdPartyLicense("OpenSSL", "http://www.openssl.org/", licenseOpenSSL), ThirdPartyLicense("libsndfile", "http://www.mega-nerd.com/libsndfile/", licenseLibsndfile), ThirdPartyLicense("libogg", "http://www.xiph.org/", licenseOgg), ThirdPartyLicense("libvorbis", "http://www.xiph.org/", licenseVorbis), ThirdPartyLicense("libFLAC", "http://flac.sourceforge.net/", licenseFLAC), #ifdef Q_OS_MAC ThirdPartyLicense("mach_override", "https://github.com/rentzsch/mach_star", licenseMachOverride), #endif #ifdef Q_OS_WIN64 ThirdPartyLicense("MinHook", "https://github.com/TsudaKageyu/minhook", licenseMinHook), #endif #ifdef USING_BUNDLED_QT_TRANSLATIONS ThirdPartyLicense("Additional Qt translations", "https://www.virtualbox.org/ticket/2018", licenseQtTranslations), #endif ThirdPartyLicense("Emoji One artwork", "http://emojione.com/", licenseEmojiOne), ThirdPartyLicense("XInputCheck (SDL_IsXInput function)", "https://www.libsdl.org/", licenseXInputCheck), ThirdPartyLicense("QQBonjour", "https://doc.qt.io/archives/qq/qq23-bonjour.html", licenseQQBonjour), ThirdPartyLicense("smallft", "https://www.xiph.org", licenseSmallFT), ThirdPartyLicense("Old-style Mumble license headers", "https://www.mumble.info", licenseOldStyleLicenseHeaders), ThirdPartyLicense("arc4random_uniform", "https://www.openbsd.org", licenseArc4RandomUniform), #ifdef USE_BUILDENV ThirdPartyLicense("MariaDB Connector/C", "https://www.mariadb.org", licenseMariaDBCConnector), #endif #ifdef USE_BUILDENV ThirdPartyLicense("ZLIB", "https://www.zlib.net", licenseZlib), #endif #ifdef USE_BUILDENV ThirdPartyLicense("Protobuf", "https://developers.google.com/protocol-buffers", licenseProtobuf), #endif #ifdef USE_BUILDENV ThirdPartyLicense("Expat", "http://libexpat.org", licenseExpat), #endif #ifdef USE_BUILDENV ThirdPartyLicense("Boost C++ Libraries", "https://www.boost.org/", licenseBoost), #endif #ifdef USE_BUILDENV ThirdPartyLicense("bzip2", "http://www.bzip.org", licenseBzip2), #endif #ifdef USE_BUILDENV ThirdPartyLicense("BerkeleyDB", "https://www.oracle.com/database/berkeley-db", licenseBerkeleyDB), #endif #ifdef USE_BUILDENV ThirdPartyLicense("Freetype", "https://www.freetype.org/", licenseFreetype), #endif #ifdef USE_BUILDENV ThirdPartyLicense("HarfBuzz", "https://www.freedesktop.org/wiki/Software/HarfBuzz", licenseHarfBuzzNG), #endif #ifdef USE_BUILDENV ThirdPartyLicense("LibPNG", "http://www.libpng.org/pub/png/libpng.html", licenseLibPNG), #endif #ifdef USE_BUILDENV ThirdPartyLicense("libjpeg-turbo", "http://www.libjpeg-turbo.org", licenseLibjpegTurbo), #endif #ifdef USE_BUILDENV ThirdPartyLicense("ZeroC Ice", "https://zeroc.com/", licenseZeroCIce), #endif #ifdef USE_BUILDENV ThirdPartyLicense("mcpp", "http://mcpp.sourceforge.net/", licenseMcpp), #endif #ifdef USE_BUILDENV ThirdPartyLicense("mDNSResponder", "https://opensource.apple.com/tarballs/mDNSResponder/", licenseMDNSResponder), #endif #ifdef USE_BUILDENV ThirdPartyLicense("PCRE", "http://www.pcre.org/", licensePCRE), #endif #ifdef USE_BUILDENV ThirdPartyLicense("Qt", "https://www.qt.io/", licenseQt), #endif #ifdef USE_BUILDENV ThirdPartyLicense("SQLite3", "http://sqlite.org", licenseSQLite3), #endif #ifdef USE_BUILDENV ThirdPartyLicense("XAR", "https://opensource.apple.com/source/xar/", licenseXar), #endif #ifdef USE_BUILDENV ThirdPartyLicense("Avahi", "https://www.avahi.org/", licenseAvahi), #endif #ifdef USE_BUILDENV ThirdPartyLicense("D-Bus", "https://www.freedesktop.org/wiki/Software/dbus", licenseDBus), #endif #ifdef USE_BUILDENV ThirdPartyLicense("AppImage Runtime", "http://www.appimage.org", licenseAppImageRuntime), #endif #ifdef USE_BUILDENV ThirdPartyLicense("squashfuse", "https://github.com/vasi/squashfuse", licenseSquashfuse), #endif #ifdef USE_BUILDENV ThirdPartyLicense("libfuse", "https://github.com/libfuse/libfuse/", licenseLibfuse), #endif #ifdef USE_BUILDENV ThirdPartyLicense("glib", "https://developer.gnome.org/glib/", licenseGlib), #endif #ifdef USE_BUILDENV ThirdPartyLicense("libcap2", "https://sites.google.com/site/fullycapable/", licenseLibcap2), #endif #ifdef USE_BUILDENV ThirdPartyLicense("libdaemon", "http://0pointer.de/lennart/projects/libdaemon/", licenseLibdaemon), #endif #ifdef USE_BUILDENV ThirdPartyLicense("libffi", "https://sourceware.org/libffi/", licenseLibffi), #endif ThirdPartyLicense(), }; #endif mumble-1.3.4/src/PlatformCheck.cpp0000664000175000017500000000125614010707273016662 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifdef MUMBLE #include "mumble_pch.hpp" #else #include "murmur_pch.h" #endif #include #include "PlatformCheck.h" bool PlatformCheck::IsWine() { #ifdef Q_OS_WIN // Detect if we're running under Wine. // For more info, see https://wiki.winehq.org/Developer_FAQ#How_can_I_detect_Wine.3F if (QLibrary::resolve(QLatin1String("ntdll.dll"), "wine_get_version") != NULL) { return true; } #endif return false; } mumble-1.3.4/src/mumble_proto/0000775000175000017500000000000014010707274016135 5ustar builderbuildermumble-1.3.4/src/mumble_proto/mumble_proto.pro0000664000175000017500000000223114010707274021361 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../../qmake/compiler.pri) include(../../qmake/protoc.pri) PROTOBUF *= ../Mumble.proto pbh.output = ${QMAKE_FILE_BASE}.pb.h pbh.depends = ${QMAKE_FILE_BASE}.pb.cc pbh.commands = $$escape_expand(\\n) pbh.input = PROTOBUF pbh.CONFIG *= no_link explicit_dependencies target_predeps pbh.variable_out = HEADERS pb.output = ${QMAKE_FILE_BASE}.pb.cc pb.commands = $${PROTOC} --cpp_out=. -I. -I.. -I${QMAKE_FILE_IN_PATH} ${QMAKE_FILE_NAME} pb.input = PROTOBUF pb.CONFIG *= no_link explicit_dependencies pb.variable_out = SOURCES TEMPLATE = lib CONFIG -= qt CONFIG += debug_and_release CONFIG += staticlib # Add protobuf dependency include(../../qmake/protobuf.pri) QMAKE_EXTRA_COMPILERS *= pb pbh !CONFIG(third-party-warnings) { # We ignore warnings in third party builds. We won't actually look # at them and they clutter out our warnings. CONFIG -= warn_on CONFIG += warn_off } include(../../qmake/symbols.pri) mumble-1.3.4/src/User.h0000664000175000017500000000215514010707273014522 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_USER_H_ #define MUMBLE_USER_H_ #ifndef Q_MOC_RUN # include #endif #include #include #include class Channel; class User { private: Q_DISABLE_COPY(User) public: unsigned int uiSession; int iId; QString qsName; QString qsComment; QByteArray qbaCommentHash; QString qsHash; bool bMute, bDeaf, bSuppress; bool bSelfMute, bSelfDeaf; bool bPrioritySpeaker; bool bRecording; Channel *cChannel; QByteArray qbaTexture; QByteArray qbaTextureHash; User(); virtual ~User() {}; static bool lessThan(const User *, const User *); }; // for last seen struct UserInfo { int user_id; QString name; boost::optional last_channel; QDateTime last_active; UserInfo() : user_id(-1) {} UserInfo(int id, QString uname) : user_id(id), name(uname) {} }; #endif mumble-1.3.4/src/SignalCurry.h0000664000175000017500000000236614010707273016052 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_SIGNAL_CURRY_H_ #define MUMBLE_SIGNAL_CURRY_H_ #include #include /** * \brief Small class for binding a QVariant parameter to a parameterless signal. * Static usage: * SignalCurry::curry(sender, SIGNAL(emitted()), receiver, SLOT(called(QVariant)), curryParameter); */ class SignalCurry : public QObject { Q_OBJECT Q_DISABLE_COPY(SignalCurry) private: bool bDeleteAfterFirstUse; QVariant qvData; public: SignalCurry(QVariant data, bool deleteAfterFirstUse = false, QObject *p = 0) : QObject(p) , bDeleteAfterFirstUse(deleteAfterFirstUse) , qvData(data) {} static void curry(QObject *sender, const char *signal, QObject *receiver, const char *slot, QVariant data) { SignalCurry *c = new SignalCurry(data); connect(receiver, slot, c, SIGNAL(called(QVariant))); connect(sender, signal, c, SLOT(call)); } signals: void called(QVariant data); public slots: void call() { emit called(qvData); if (bDeleteAfterFirstUse) deleteLater(); } }; #endif mumble-1.3.4/src/Channel.cpp0000664000175000017500000001042214010707273015503 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifdef MUMBLE #include "mumble_pch.hpp" #else #include "murmur_pch.h" #endif #include "Channel.h" #include "User.h" #include "Group.h" #include "ACL.h" #ifdef MUMBLE QHash Channel::c_qhChannels; QReadWriteLock Channel::c_qrwlChannels; #endif Channel::Channel(int id, const QString &name, QObject *p) : QObject(p) { iId = id; iPosition = 0; qsName = name; bInheritACL = true; uiMaxUsers = 0; bTemporary = false; cParent = qobject_cast(p); if (cParent) cParent->addChannel(this); #ifdef MUMBLE uiPermissions = 0; bFiltered = false; #endif } Channel::~Channel() { if (cParent) cParent->removeChannel(this); foreach(Channel *c, qlChannels) delete c; foreach(ChanACL *acl, qlACL) delete acl; foreach(Group *g, qhGroups) delete g; foreach(Channel *l, qhLinks.keys()) unlink(l); Q_ASSERT(qlChannels.count() == 0); Q_ASSERT(children().count() == 0); } #ifdef MUMBLE Channel *Channel::get(int id) { QReadLocker lock(&c_qrwlChannels); return c_qhChannels.value(id); } Channel *Channel::add(int id, const QString &name) { QWriteLocker lock(&c_qrwlChannels); if (c_qhChannels.contains(id)) return NULL; Channel *c = new Channel(id, name, NULL); c_qhChannels.insert(id, c); return c; } void Channel::remove(Channel *c) { QWriteLocker lock(&c_qrwlChannels); c_qhChannels.remove(c->iId); } #endif bool Channel::lessThan(const Channel *first, const Channel *second) { if ((first->iPosition != second->iPosition) && (first->cParent == second->cParent)) return first->iPosition < second->iPosition; else return QString::localeAwareCompare(first->qsName, second->qsName) < 0; } bool Channel::isLinked(Channel *l) const { return ((l == this) || qhLinks.contains(l)); } void Channel::link(Channel *l) { if (qsPermLinks.contains(l)) return; qsPermLinks.insert(l); qhLinks[l]++; l->qsPermLinks.insert(this); l->qhLinks[this]++; } void Channel::unlink(Channel *l) { if (l) { qsPermLinks.remove(l); qhLinks.remove(l); l->qsPermLinks.remove(this); l->qhLinks.remove(this); } else { foreach(Channel *c, qhLinks.keys()) unlink(c); } } QSet Channel::allLinks() { QSet seen; seen.insert(this); if (qhLinks.isEmpty()) return seen; QStack stack; stack.push(this); while (! stack.isEmpty()) { Channel *lnk = stack.pop(); foreach(Channel *l, lnk->qhLinks.keys()) { if (! seen.contains(l)) { seen.insert(l); stack.push(l); } } } return seen; } QSet Channel::allChildren() { QSet seen; if (! qlChannels.isEmpty()) { QStack stack; stack.push(this); while (! stack.isEmpty()) { Channel *c = stack.pop(); foreach(Channel *chld, c->qlChannels) { seen.insert(chld); if (! chld->qlChannels.isEmpty()) stack.append(chld); } } } return seen; } void Channel::addChannel(Channel *c) { c->cParent = this; c->setParent(this); qlChannels << c; } void Channel::removeChannel(Channel *c) { c->cParent = NULL; c->setParent(NULL); qlChannels.removeAll(c); } void Channel::addUser(User *p) { if (p->cChannel) p->cChannel->removeUser(p); p->cChannel = this; qlUsers << p; } void Channel::removeUser(User *p) { qlUsers.removeAll(p); } Channel::operator QString() const { return QString::fromLatin1("%1[%2:%3%4]").arg(qsName, QString::number(iId), QString::number(cParent ? cParent->iId : -1), bTemporary ? QLatin1String("*") : QLatin1String("")); } size_t Channel::getLevel() const { size_t i = 0; const Channel *c = this; while (c->cParent) { c = c->cParent; ++i; } return i; } size_t Channel::getDepth() const { if(qlChannels.empty()) { return 0; } size_t result = 0; foreach(Channel *child, qlChannels) { result = qMax(result, child->getDepth() + 1); } return result; } QString Channel::getPath() const { QString out; const Channel *tmp = this; while (tmp->cParent) { // Skip the root channel. if (tmp->iId == 0) { break; } out.prepend(QString::fromLatin1("/")); out.prepend(tmp->qsName); tmp = tmp->cParent; } return out; } mumble-1.3.4/src/HostAddress.h0000664000175000017500000000234014010707273016023 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_HOSTADDRESS_H_ #define MUMBLE_HOSTADDRESS_H_ #include #include #include #include #include struct HostAddress { union { Q_IPV6ADDR qip6; quint16 shorts[8]; quint32 hash[4]; quint64 addr[2]; }; HostAddress(); HostAddress(const Q_IPV6ADDR &); HostAddress(const std::string &); HostAddress(const QHostAddress &); HostAddress(const QByteArray &); HostAddress(const struct sockaddr_storage &); bool isV6() const; bool isValid() const; bool operator < (const HostAddress &) const; bool operator == (const HostAddress &) const; bool match(const HostAddress &, int bits) const; QString toString() const; std::string toStdString() const; QHostAddress toAddress() const; QByteArray toByteArray() const; void toSockaddr(struct sockaddr_storage *dst) const; }; Q_DECLARE_TYPEINFO(HostAddress, Q_MOVABLE_TYPE); quint32 qHash(const HostAddress &); #endif mumble-1.3.4/src/EnvUtils.h0000664000175000017500000000146214010707273015355 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_ENVUTILS_H_ #define MUMBLE_MUMBLE_ENVUTILS_H_ #include class EnvUtils { public: // getenv is a wrapper around _wgetenv_s (on Windows) // and getenv (on everything else). // // On Windows, it expects a Unicode environment -- so variables // are expected to be UTF16. // // On everything else, it expects environment variables to use the // locale-defined encoding. (From a Qt-perspective, we use toLocal8Bit/fromLocal8Bit.) static QString getenv(QString name); static bool setenv(QString name, QString value); }; #endif mumble-1.3.4/src/PacketDataStream.h0000664000175000017500000002075714010707273016771 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_PACKETDATASTREAM_H_ #define MUMBLE_PACKETDATASTREAM_H_ /* * GCC doesn't yet do inter-object-file inlining, so unfortunately, this all has to be defined here. */ class PacketDataStream { private: Q_DISABLE_COPY(PacketDataStream) private: unsigned char *data; quint32 maxsize; quint32 offset; quint32 overshoot; bool ok; public: quint32 size() const { return offset; } quint32 capacity() const { return maxsize; } bool isValid() const { return ok; } quint32 left() const { return maxsize - offset; } quint32 undersize() const { return overshoot; } void append(const quint64 v) { #ifndef QT_NO_DEBUG Q_ASSERT(v <= 0xff); #endif if (offset < maxsize) data[offset++] = static_cast(v); else { ok = false; overshoot++; } }; void append(const char *d, quint32 len) { if (left() >= len) { memcpy(& data[offset], d, len); offset += len; } else { int l = left(); memset(& data[offset], 0, l); offset += l; overshoot += len - l; ok = false; } } void skip(quint32 len) { if (left() >= len) offset += len; else ok = false; } quint64 next() { if (offset < maxsize) return data[offset++]; else { ok = false; return 0; } }; quint8 next8() { if (offset < maxsize) return data[offset++]; else { ok = false; return 0; } } void rewind() { offset = 0; } void truncate() { maxsize = offset; } const unsigned char *dataPtr() const { return reinterpret_cast(& data[offset]); } const char *charPtr() const { return reinterpret_cast(& data[offset]); } QByteArray dataBlock(quint32 len) { if (len <= left()) { QByteArray a(charPtr(), len); offset +=len; return a; } else { ok = false; return QByteArray(); } } protected: void setup(unsigned char *d, int msize) { data = d; offset = 0; overshoot = 0; maxsize = msize; ok = true; } public: PacketDataStream(const char *d, int msize) { setup(const_cast(reinterpret_cast(d)), msize); }; PacketDataStream(char *d, int msize) { setup(reinterpret_cast(d), msize); }; PacketDataStream(unsigned char *d, int msize) { setup(d, msize); }; PacketDataStream(const QByteArray &qba) { setup(const_cast(reinterpret_cast(qba.constData())), qba.size()); } PacketDataStream(QByteArray &qba) { unsigned char *ptr=reinterpret_cast(qba.data()); setup(ptr, qba.capacity()); } PacketDataStream &operator <<(const quint64 value) { quint64 i = value; if ((i & 0x8000000000000000LL) && (~i < 0x100000000LL)) { // Signed number. i = ~i; if (i <= 0x3) { // Shortcase for -1 to -4 append(0xFC | i); return *this; } else { append(0xF8); } } if (i < 0x80) { // Need top bit clear append(i); } else if (i < 0x4000) { // Need top two bits clear append((i >> 8) | 0x80); append(i & 0xFF); } else if (i < 0x200000) { // Need top three bits clear append((i >> 16) | 0xC0); append((i >> 8) & 0xFF); append(i & 0xFF); } else if (i < 0x10000000) { // Need top four bits clear append((i >> 24) | 0xE0); append((i >> 16) & 0xFF); append((i >> 8) & 0xFF); append(i & 0xFF); } else if (i < 0x100000000LL) { // It's a full 32-bit integer. append(0xF0); append((i >> 24) & 0xFF); append((i >> 16) & 0xFF); append((i >> 8) & 0xFF); append(i & 0xFF); } else { // It's a 64-bit value. append(0xF4); append((i >> 56) & 0xFF); append((i >> 48) & 0xFF); append((i >> 40) & 0xFF); append((i >> 32) & 0xFF); append((i >> 24) & 0xFF); append((i >> 16) & 0xFF); append((i >> 8) & 0xFF); append(i & 0xFF); } return *this; } PacketDataStream &operator >>(quint64 &i) { quint64 v = next(); if ((v & 0x80) == 0x00) { i=(v & 0x7F); } else if ((v & 0xC0) == 0x80) { i=(v & 0x3F) << 8 | next(); } else if ((v & 0xF0) == 0xF0) { switch (v & 0xFC) { case 0xF0: i=next() << 24 | next() << 16 | next() << 8 | next(); break; case 0xF4: i=next() << 56 | next() << 48 | next() << 40 | next() << 32 | next() << 24 | next() << 16 | next() << 8 | next(); break; case 0xF8: *this >> i; i = ~i; break; case 0xFC: i=v & 0x03; i = ~i; break; default: ok = false; i = 0; break; } } else if ((v & 0xF0) == 0xE0) { i=(v & 0x0F) << 24 | next() << 16 | next() << 8 | next(); } else if ((v & 0xE0) == 0xC0) { i=(v & 0x1F) << 16 | next() << 8 | next(); } return *this; } PacketDataStream &operator <<(const QByteArray &a) { *this << a.size(); append(a.constData(), a.size()); return *this; } PacketDataStream &operator >>(QByteArray &a) { quint32 len; *this >> len; if (len > left()) { len = left(); ok = false; } a = QByteArray(reinterpret_cast(& data[offset]), len); offset+=len; return *this; } PacketDataStream &operator <<(const QString &s) { return *this << s.toUtf8(); } // Using the data directly instead of through qbuff avoids a copy. PacketDataStream &operator >>(QString &s) { quint32 len; *this >> len; if (len > left()) { len = left(); ok = false; } s = QString::fromUtf8(reinterpret_cast(& data[offset]), len); offset+=len; return *this; } PacketDataStream &operator <<(const bool b) { quint32 v = b ? 1 : 0; return *this << v; } PacketDataStream &operator >>(bool &b) { quint32 v; *this >> v; b = v ? true : false; return *this; } #define INTMAPOPERATOR(type) \ PacketDataStream &operator <<(const type v) { \ return *this << static_cast(v); \ } \ PacketDataStream &operator >>(type &v) { \ quint64 vv; \ *this >> vv; \ v = static_cast(vv); \ return *this; \ } INTMAPOPERATOR(int); INTMAPOPERATOR(unsigned int); INTMAPOPERATOR(short); INTMAPOPERATOR(unsigned short); INTMAPOPERATOR(char); INTMAPOPERATOR(unsigned char); union double64u { quint64 ui; double d; }; PacketDataStream &operator <<(const double v) { double64u u; u.d = v; return *this << u.ui; } PacketDataStream &operator >>(double &v) { double64u u; *this >> u.ui; v = u.d; return *this; } union float32u { quint8 ui[4]; float f; }; PacketDataStream &operator <<(const float v) { float32u u; u.f = v; append(u.ui[0]); append(u.ui[1]); append(u.ui[2]); append(u.ui[3]); return *this; } PacketDataStream &operator >>(float &v) { float32u u; if (left() < 4) { ok = false; v = 0; } u.ui[0] = next8(); u.ui[1] = next8(); u.ui[2] = next8(); u.ui[3] = next8(); v = u.f; return *this; } template PacketDataStream &operator <<(const QList &l) { *this << l.size(); for (int i=0;i < l.size();i++) *this << l.at(i); return *this; } template PacketDataStream &operator >>(QList &l) { l.clear(); quint32 len; *this >> len; if (len > left()) { len = left(); ok = false; } for (quint32 i=0;i> t; l.append(t); } return *this; } template PacketDataStream &operator <<(const QSet &s) { *this << s.size(); for (typename QSet::const_iterator i=s.constBegin();i!=s.constEnd();++i) *this << *i; return *this; } template PacketDataStream &operator >>(QSet &s) { s.clear(); quint32 len; *this >> len; if (len > left()) { len = left(); ok = false; } for (quint32 i=0;i> t; s.insert(t); } return *this; } template PacketDataStream &operator <<(const QPair &p) { return *this << p.first << p.second; } template PacketDataStream &operator >>(QPair &p) { return *this >> p.first >> p.second; } }; #endif mumble-1.3.4/src/License.cpp0000664000175000017500000000273714010707273015527 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifdef MUMBLE #include "mumble_pch.hpp" #else #include "murmur_pch.h" #endif #include "License.h" #include "licenses.h" QString License::license() { return QString::fromUtf8(licenseMumble); } QString License::authors() { return QString::fromUtf8(authorsMumble); } QList License::thirdPartyLicenses() { QList licenses; for (int i = 0; !licenses3rdParties[i].isEmpty(); i++) { const ThirdPartyLicense *tpl = &licenses3rdParties[i]; LicenseInfo li; li.name = QString::fromUtf8(tpl->name); li.url = QString::fromUtf8(tpl->url); li.license = QString::fromUtf8(tpl->license); licenses << li; } return licenses; } QString License::printableThirdPartyLicenseInfo() { QString output; QList thirdPartyLicenses = License::thirdPartyLicenses(); foreach (LicenseInfo li, thirdPartyLicenses) { QString header = QString::fromLatin1("%1 (%2)\n").arg(li.name).arg(li.url); QString headerHorizLine = QString::fromLatin1("-").repeated(header.size()) + QLatin1String("\n"); output.append(headerHorizLine); output.append(header); output.append(headerHorizLine); output.append(QLatin1String("\n")); output.append(li.license); output.append(QLatin1String("\n\n")); } return output; } mumble-1.3.4/src/ACL.h0000664000175000017500000000307014010707273014200 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_ACL_H_ #define MUMBLE_ACL_H_ #include #include class Channel; class User; class ServerUser; class ChanACL : public QObject { private: Q_OBJECT Q_DISABLE_COPY(ChanACL) public: enum Perm { None = 0x0, Write = 0x1, Traverse = 0x2, Enter = 0x4, Speak = 0x8, MuteDeafen = 0x10, Move = 0x20, MakeChannel = 0x40, LinkChannel = 0x80, Whisper = 0x100, TextMessage = 0x200, MakeTempChannel = 0x400, // Root channel only Kick = 0x10000, Ban = 0x20000, Register = 0x40000, SelfRegister = 0x80000, Cached = 0x8000000, All = 0xf07ff }; Q_DECLARE_FLAGS(Permissions, Perm) typedef QHash ChanCache; typedef QHash ACLCache; Channel *c; bool bApplyHere; bool bApplySubs; bool bInherited; int iUserId; QString qsGroup; Permissions pAllow; Permissions pDeny; ChanACL(Channel *c); #ifdef MURMUR static bool hasPermission(ServerUser *p, Channel *c, QFlags perm, ACLCache *cache); static QFlags effectivePermissions(ServerUser *p, Channel *c, ACLCache *cache); #else static QString whatsThis(Perm p); #endif static QString permName(QFlags p); static QString permName(Perm p); }; Q_DECLARE_OPERATORS_FOR_FLAGS(ChanACL::Permissions) #endif mumble-1.3.4/src/LogEmitter.cpp0000664000175000017500000000075214010707273016213 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifdef MUMBLE #include "mumble_pch.hpp" #else #include "murmur_pch.h" #endif #include "LogEmitter.h" LogEmitter::LogEmitter(QObject *p) : QObject(p) { }; void LogEmitter::addLogEntry(const QString &msg) { emit newLogEntry(msg); }; mumble-1.3.4/src/CryptographicHash.h0000664000175000017500000000465214010707273017232 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_CRYPTOGRAPHICHASH_H_ #define MUMBLE_CRYPTOGRAPHICHASH_H_ #include class CryptographicHashPrivate; /// CryptographicHash is used for computing cryptographic hashes. class CryptographicHash { public: /// Algorithm specifies an algorithm for use with CryptographicHash. enum Algorithm { /// The SHA-1 hashing algorithm. Sha1, /// The SHA-256 hashing algorithm. Sha256 }; /// Compute the cryptographic hash of |buf| using algorithm |algo| /// and return the result. /// On failure, the returned QByteArray will be empty. static QByteArray hash(const QByteArray &buf, Algorithm algo); /// Return the human readable name of |algo|. /// /// Examples: /// CryptographicHash::Sha1 -> "SHA-1" /// CryptographicHash::Sha256 -> "SHA-256" static QString humanReadableAlgorithmName(CryptographicHash::Algorithm algo); /// Return a machine-readable short name of |algo|. /// This variant is a short, lower-case name for the algorithm, suitable /// for prefixing when serializing a cryptographic hash. /// /// Examples: /// CryptographicHash::Sha1 -> "sha1" /// CryptographicHash::Sha256 -> "sha256" static QString shortAlgorithmName(CryptographicHash::Algorithm algo); /// Consruct a CryptographicHash object that can be used /// to incrementally compute a cryptographic hash using the /// hash function specified in |algo|. CryptographicHash(Algorithm algo); /// addData adds the content of |buf| to the hash computation. /// /// Attempting to add data to the CryptographicHash after result() /// has been called is an error, and will cause the CryptographicHash /// object to transition to an error state. Subsequent calls to result() /// will return an empty QByteArray. void addData(const QByteArray &buf); /// result() finalizes the CryptographicHash object, /// and returns the computed hash. /// After calling this method, it is no longer possible /// to add more data to the CryptographicHash object. /// If an error occurred during the computation, the /// returned QByteArray will be empty. QByteArray result() const; private: CryptographicHash(); CryptographicHashPrivate *d; }; #endif mumble-1.3.4/src/SSLCipherInfo.cpp0000664000175000017500000000147614010707273016554 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifdef MUMBLE #include "mumble_pch.hpp" #else #include "murmur_pch.h" #endif #include "SSLCipherInfo.h" // Include SSLCipherInfoTable generated by 'cipherinfo.py'. #include "SSLCipherInfoTable.h" const SSLCipherInfo *SSLCipherInfoLookupByOpenSSLName(const char *openSslCipherName) { int len = sizeof(cipher_info_lookup_table) / sizeof(*cipher_info_lookup_table); for (int i = 0; i < len; i++) { const SSLCipherInfo *ci = &cipher_info_lookup_table[i]; if (!strcmp(ci->openssl_name, openSslCipherName)) { return ci; } } return NULL; } mumble-1.3.4/src/FFDHETable.h0000664000175000017500000001211014010707273015360 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . // Automatically generated by "generate-ffdhe.py". DO NOT EDIT BY HAND. static const char ffdhe2048_pem[] = \ "-----BEGIN DH PARAMETERS-----\n" "MIIBCAKCAQEA//////////+t+FRYortKmq/cViAnPTzx2LnFg84tNpWp4TZBFGQz\n" "+8yTnc4kmz75fS/jY2MMddj2gbICrsRhetPfHtXV/WVhJDP1H18GbtCFY2VVPe0a\n" "87VXE15/V8k1mE8McODmi3fipona8+/och3xWKE2rec1MKzKT0g6eXq8CrGCsyT7\n" "YdEIqUuyyOP7uWrat2DX9GgdT0Kj3jlN9K5W7edjcrsZCwenyO4KbXCeAvzhzffi\n" "7MA0BM0oNC9hkXL+nOmFg/+OTxIy7vKBg8P+OxtMb61zO7X8vC7CIAXFjvGDfRaD\n" "ssbzSibBsu/6iGtCOGEoXJf//////////wIBAg==\n" "-----END DH PARAMETERS-----\n"; static const char ffdhe3072_pem[] = \ "-----BEGIN DH PARAMETERS-----\n" "MIIBiAKCAYEA//////////+t+FRYortKmq/cViAnPTzx2LnFg84tNpWp4TZBFGQz\n" "+8yTnc4kmz75fS/jY2MMddj2gbICrsRhetPfHtXV/WVhJDP1H18GbtCFY2VVPe0a\n" "87VXE15/V8k1mE8McODmi3fipona8+/och3xWKE2rec1MKzKT0g6eXq8CrGCsyT7\n" "YdEIqUuyyOP7uWrat2DX9GgdT0Kj3jlN9K5W7edjcrsZCwenyO4KbXCeAvzhzffi\n" "7MA0BM0oNC9hkXL+nOmFg/+OTxIy7vKBg8P+OxtMb61zO7X8vC7CIAXFjvGDfRaD\n" "ssbzSibBsu/6iGtCOGEfz9zeNVs7ZRkDW7w09N75nAI4YbRvydbmyQd62R0mkff3\n" "7lmMsPrBhtkcrv4TCYUTknC0EwyTvEN5RPT9RFLi103TZPLiHnH1S/9croKrnJ32\n" "nuhtK8UiNjoNq8Uhl5sN6todv5pC1cRITgq80Gv6U93vPBsg7j/VnXwl5B0rZsYu\n" "N///////////AgEC\n" "-----END DH PARAMETERS-----\n"; static const char ffdhe4096_pem[] = \ "-----BEGIN DH PARAMETERS-----\n" "MIICCAKCAgEA//////////+t+FRYortKmq/cViAnPTzx2LnFg84tNpWp4TZBFGQz\n" "+8yTnc4kmz75fS/jY2MMddj2gbICrsRhetPfHtXV/WVhJDP1H18GbtCFY2VVPe0a\n" "87VXE15/V8k1mE8McODmi3fipona8+/och3xWKE2rec1MKzKT0g6eXq8CrGCsyT7\n" "YdEIqUuyyOP7uWrat2DX9GgdT0Kj3jlN9K5W7edjcrsZCwenyO4KbXCeAvzhzffi\n" "7MA0BM0oNC9hkXL+nOmFg/+OTxIy7vKBg8P+OxtMb61zO7X8vC7CIAXFjvGDfRaD\n" "ssbzSibBsu/6iGtCOGEfz9zeNVs7ZRkDW7w09N75nAI4YbRvydbmyQd62R0mkff3\n" "7lmMsPrBhtkcrv4TCYUTknC0EwyTvEN5RPT9RFLi103TZPLiHnH1S/9croKrnJ32\n" "nuhtK8UiNjoNq8Uhl5sN6todv5pC1cRITgq80Gv6U93vPBsg7j/VnXwl5B0rZp4e\n" "8W5vUsMWTfT7eTDp5OWIV7asfV9C1p9tGHdjzx1VA0AEh/VbpX4xzHpxNciG77Qx\n" "iu1qHgEtnmgyqQdgCpGBMMRtx3j5ca0AOAkpmaMzy4t6Gh25PXFAADwqTs6p+Y0K\n" "zAqCkc3OyX3Pjsm1Wn+IpGtNtahR9EGC4caKAH5eZV9q//////////8CAQI=\n" "-----END DH PARAMETERS-----\n"; static const char ffdhe6144_pem[] = \ "-----BEGIN DH PARAMETERS-----\n" "MIIDCAKCAwEA//////////+t+FRYortKmq/cViAnPTzx2LnFg84tNpWp4TZBFGQz\n" "+8yTnc4kmz75fS/jY2MMddj2gbICrsRhetPfHtXV/WVhJDP1H18GbtCFY2VVPe0a\n" "87VXE15/V8k1mE8McODmi3fipona8+/och3xWKE2rec1MKzKT0g6eXq8CrGCsyT7\n" "YdEIqUuyyOP7uWrat2DX9GgdT0Kj3jlN9K5W7edjcrsZCwenyO4KbXCeAvzhzffi\n" "7MA0BM0oNC9hkXL+nOmFg/+OTxIy7vKBg8P+OxtMb61zO7X8vC7CIAXFjvGDfRaD\n" "ssbzSibBsu/6iGtCOGEfz9zeNVs7ZRkDW7w09N75nAI4YbRvydbmyQd62R0mkff3\n" "7lmMsPrBhtkcrv4TCYUTknC0EwyTvEN5RPT9RFLi103TZPLiHnH1S/9croKrnJ32\n" "nuhtK8UiNjoNq8Uhl5sN6todv5pC1cRITgq80Gv6U93vPBsg7j/VnXwl5B0rZp4e\n" "8W5vUsMWTfT7eTDp5OWIV7asfV9C1p9tGHdjzx1VA0AEh/VbpX4xzHpxNciG77Qx\n" "iu1qHgEtnmgyqQdgCpGBMMRtx3j5ca0AOAkpmaMzy4t6Gh25PXFAADwqTs6p+Y0K\n" "zAqCkc3OyX3Pjsm1Wn+IpGtNtahR9EGC4caKAH5eDdkCC/1ktkUDbHpOZ30sOFMq\n" "OiO6RELK9T6mO7RUMpt2JMiRe91kscD9TLOOjDNMcBw6za0GV/zP7HGbH1w+TkYE\n" "HziBR/tM/bR3pSRx96mpaRC4VTIu22NA2KAO8JI1BRHjCr7B//njom5/sp+MGDAj\n" "w1h+ONoAd9m0dj5OS5Syu8GUxmUed8r5ku6qwCMqKBv2s6c5wSJhFoIK6NtYR6Z8\n" "vvnJCRtGLVOM1ysDdGrnf15iKSwxFWKoRlBdyC24VDOK5J9SNclbkReMzy3Vys70\n" "A+ydGBDGJysEWztx+dxrgNY/3UqOmtseaWKmlSbUMWHBpB1XDXk42tSkDjKc0OQO\n" "Zf//////////AgEC\n" "-----END DH PARAMETERS-----\n"; static const char ffdhe8192_pem[] = \ "-----BEGIN DH PARAMETERS-----\n" "MIIECAKCBAEA//////////+t+FRYortKmq/cViAnPTzx2LnFg84tNpWp4TZBFGQz\n" "+8yTnc4kmz75fS/jY2MMddj2gbICrsRhetPfHtXV/WVhJDP1H18GbtCFY2VVPe0a\n" "87VXE15/V8k1mE8McODmi3fipona8+/och3xWKE2rec1MKzKT0g6eXq8CrGCsyT7\n" "YdEIqUuyyOP7uWrat2DX9GgdT0Kj3jlN9K5W7edjcrsZCwenyO4KbXCeAvzhzffi\n" "7MA0BM0oNC9hkXL+nOmFg/+OTxIy7vKBg8P+OxtMb61zO7X8vC7CIAXFjvGDfRaD\n" "ssbzSibBsu/6iGtCOGEfz9zeNVs7ZRkDW7w09N75nAI4YbRvydbmyQd62R0mkff3\n" "7lmMsPrBhtkcrv4TCYUTknC0EwyTvEN5RPT9RFLi103TZPLiHnH1S/9croKrnJ32\n" "nuhtK8UiNjoNq8Uhl5sN6todv5pC1cRITgq80Gv6U93vPBsg7j/VnXwl5B0rZp4e\n" "8W5vUsMWTfT7eTDp5OWIV7asfV9C1p9tGHdjzx1VA0AEh/VbpX4xzHpxNciG77Qx\n" "iu1qHgEtnmgyqQdgCpGBMMRtx3j5ca0AOAkpmaMzy4t6Gh25PXFAADwqTs6p+Y0K\n" "zAqCkc3OyX3Pjsm1Wn+IpGtNtahR9EGC4caKAH5eDdkCC/1ktkUDbHpOZ30sOFMq\n" "OiO6RELK9T6mO7RUMpt2JMiRe91kscD9TLOOjDNMcBw6za0GV/zP7HGbH1w+TkYE\n" "HziBR/tM/bR3pSRx96mpaRC4VTIu22NA2KAO8JI1BRHjCr7B//njom5/sp+MGDAj\n" "w1h+ONoAd9m0dj5OS5Syu8GUxmUed8r5ku6qwCMqKBv2s6c5wSJhFoIK6NtYR6Z8\n" "vvnJCRtGLVOM1ysDdGrnf15iKSwxFWKoRlBdyC24VDOK5J9SNclbkReMzy3Vys70\n" "A+ydGBDGJysEWztx+dxrgNY/3UqOmtseaWKmlSbUMWHBpB1XDXk42tSkDjKcz/Rq\n" "qjatAEz2AMg4HkJaMdlRrmT9sj/OyVCdQ2h/62nt0cxeC4zDvfZLEO+GtjFCo6uI\n" "KVVbL3R8kyZlyywPHMAb1wIpOIg50q8F5FRQSseLdYKCKEbAujXDX1xZFgzARv2C\n" "UVQfxoychrAiu3CZh2pGDnRRqKkxCXA/7hwhfmw4JuUsUappHg5CPPyZ6eMWUMEh\n" "e2JIFs2tmpX51bgBlIjZwKCh/jB1pXfiMYP4HUo/L6RXHvyM4LqKT+i2hV3+crCm\n" "bt7S+6v75Yow+vq+HF1xqH4vdB74wf6G/qa7/eUwZ38Nl9EdSfeoRD0IIuUGqfRh\n" "TgEeKpSDj/iM1oyLt8XGQkz//////////wIBAg==\n" "-----END DH PARAMETERS-----\n"; mumble-1.3.4/src/SSLLocks.cpp0000664000175000017500000000517114010707273015575 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifdef MUMBLE #include "mumble_pch.hpp" #else #include "murmur_pch.h" #endif #include "SSLLocks.h" static QMutex **locks = NULL; void locking_callback(int mode, int type, const char *, int) { if (mode & CRYPTO_LOCK) { locks[type]->lock(); } else { locks[type]->unlock(); } } unsigned long id_callback() { // OpenSSL's thread ID callback must return an unsigned long. // It's therefore important that we make sure the value from // Qt's QThread::currentThreadId actually makes sense to return // in this case. // // On Windows, the return type is a DWORD. This is excellent, // because on an LLP64 like 64-bit Windows, unsigned long is // only 32-bits wide, just like DWORD. // // On macOS and embedded Linux, it's void *. And when Qt targets // X11, it's unsigned long. // // So, in all cases, it's safe to use unsigned long. // // The trouble is, since the return type of QThread::currentThreadId() // differs between platforms, we have to be clever about how we convert // that type to an unsigned long. The way we do it here is to first convert // it to an uintptr_t, since both pointer types and integer types will // convert to that without the compiler complaining. Then, we convert // *that* to an unsigned long. (Note that for LLP64 platforms, such as // 64-bit Windows, this conversion is from a 64-bit type to a 32-bit type) uintptr_t val = reinterpret_cast(QThread::currentThreadId()); return static_cast(val); } void SSLLocks::initialize() { int nlocks = CRYPTO_num_locks(); locks = reinterpret_cast(calloc(nlocks, sizeof(QMutex *))); if (locks == NULL) { qFatal("SSLLocks: unable to allocate locks array"); // This initializer is called early during program // execution, and the message handler that causes // qFatal to terminate execution might not be registered // yet. So, do exit(1) just in case. exit(1); } for (int i = 0; i < nlocks; i++) { locks[i] = new QMutex; } CRYPTO_set_locking_callback(locking_callback); CRYPTO_set_id_callback(id_callback); } void SSLLocks::destroy() { // If SSLLocks was never initialized, or has been destroyed already, // don't try to do it again. if (locks == NULL) { return; } CRYPTO_set_locking_callback(NULL); CRYPTO_set_id_callback(NULL); int nlocks = CRYPTO_num_locks(); for (int i = 0; i < nlocks; i++) { delete locks[i]; } free(locks); locks = NULL; } mumble-1.3.4/src/Connection.cpp0000664000175000017500000001617314010707273016243 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifdef MUMBLE #include "mumble_pch.hpp" #else #include "murmur_pch.h" #endif #ifdef Q_OS_UNIX #include #include #include #include #endif #include "Connection.h" #include "Message.h" #include "SSL.h" #include "Mumble.pb.h" #ifdef Q_OS_WIN HANDLE Connection::hQoS = NULL; #endif Connection::Connection(QObject *p, QSslSocket *qtsSock) : QObject(p) { qtsSocket = qtsSock; qtsSocket->setParent(this); iPacketLength = -1; bDisconnectedEmitted = false; static bool bDeclared = false; if (! bDeclared) { bDeclared = true; qRegisterMetaType("QAbstractSocket::SocketError"); } connect(qtsSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(socketError(QAbstractSocket::SocketError))); connect(qtsSocket, SIGNAL(encrypted()), this, SIGNAL(encrypted())); connect(qtsSocket, SIGNAL(readyRead()), this, SLOT(socketRead())); connect(qtsSocket, SIGNAL(disconnected()), this, SLOT(socketDisconnected())); connect(qtsSocket, SIGNAL(sslErrors(const QList &)), this, SLOT(socketSslErrors(const QList &))); qtLastPacket.restart(); #ifdef Q_OS_WIN dwFlow = 0; #endif } Connection::~Connection() { #ifdef Q_OS_WIN if (dwFlow && hQoS) { if (! QOSRemoveSocketFromFlow(hQoS, 0, dwFlow, 0)) qWarning("Connection: Failed to remove flow from QoS"); } #endif } void Connection::setToS() { #if defined(Q_OS_WIN) if (dwFlow || ! hQoS) return; dwFlow = 0; if (! QOSAddSocketToFlow(hQoS, qtsSocket->socketDescriptor(), NULL, QOSTrafficTypeAudioVideo, QOS_NON_ADAPTIVE_FLOW, reinterpret_cast(&dwFlow))) qWarning("Connection: Failed to add flow to QOS"); #elif defined(Q_OS_UNIX) int val = 0xa0; if (setsockopt(static_cast(qtsSocket->socketDescriptor()), IPPROTO_IP, IP_TOS, &val, sizeof(val))) { val = 0x60; if (setsockopt(static_cast(qtsSocket->socketDescriptor()), IPPROTO_IP, IP_TOS, &val, sizeof(val))) qWarning("Connection: Failed to set TOS for TCP Socket"); } #if defined(SO_PRIORITY) socklen_t optlen = sizeof(val); if (getsockopt(static_cast(qtsSocket->socketDescriptor()), SOL_SOCKET, SO_PRIORITY, &val, &optlen) == 0) { if (val == 0) { val = 6; setsockopt(static_cast(qtsSocket->socketDescriptor()), SOL_SOCKET, SO_PRIORITY, &val, sizeof(val)); } } #endif #endif } qint64 Connection::activityTime() const { return qtLastPacket.elapsed(); } void Connection::resetActivityTime() { qtLastPacket.restart(); } /** * This function waits until a complete package is received and then emits it as a message. * It gets called everytime new data is available and interprets the message prefix header * to figure out the type and length. It then waits until the complete message is buffered * and emits it as a message so it can be handled by the corresponding message handler * routine. * * @see QSslSocket::readyRead() * @see void ServerHandler::message(unsigned int msgType, const QByteArray &qbaMsg) * @see void Server::message(unsigned int uiType, const QByteArray &qbaMsg, ServerUser *u) */ void Connection::socketRead() { while (true) { qint64 iAvailable = qtsSocket->bytesAvailable(); if (iPacketLength == -1) { if (iAvailable < 6) return; unsigned char a_ucBuffer[6]; qtsSocket->read(reinterpret_cast(a_ucBuffer), 6); uiType = qFromBigEndian(&a_ucBuffer[0]); iPacketLength = qFromBigEndian(&a_ucBuffer[2]); iAvailable -= 6; } if ((iPacketLength == -1) || (iAvailable < iPacketLength)) return; if (iPacketLength > 0x7fffff) { qWarning() << "Host tried to send huge packet"; disconnectSocket(true); return; } QByteArray qbaBuffer = qtsSocket->read(iPacketLength); iPacketLength = -1; iAvailable -= iPacketLength; emit message(uiType, qbaBuffer); } } void Connection::socketError(QAbstractSocket::SocketError err) { emit connectionClosed(err, qtsSocket->errorString()); } void Connection::socketSslErrors(const QList &qlErr) { emit handleSslErrors(qlErr); } void Connection::proceedAnyway() { qtsSocket->ignoreSslErrors(); } void Connection::socketDisconnected() { emit connectionClosed(QAbstractSocket::UnknownSocketError, QString()); } void Connection::messageToNetwork(const ::google::protobuf::Message &msg, unsigned int msgType, QByteArray &cache) { int len = msg.ByteSize(); if (len > 0x7fffff) return; cache.resize(len + 6); unsigned char *uc = reinterpret_cast(cache.data()); qToBigEndian(static_cast(msgType), & uc[0]); qToBigEndian(len, & uc[2]); msg.SerializeToArray(uc + 6, len); } void Connection::sendMessage(const ::google::protobuf::Message &msg, unsigned int msgType, QByteArray &cache) { if (cache.isEmpty()) { messageToNetwork(msg, msgType, cache); } sendMessage(cache); } void Connection::sendMessage(const QByteArray &qbaMsg) { if (! qbaMsg.isEmpty()) qtsSocket->write(qbaMsg); } void Connection::forceFlush() { if (qtsSocket->state() != QAbstractSocket::ConnectedState) return; if (! qtsSocket->isEncrypted()) return; int nodelay; qtsSocket->flush(); nodelay = 1; setsockopt(static_cast(qtsSocket->socketDescriptor()), IPPROTO_TCP, TCP_NODELAY, reinterpret_cast(&nodelay), static_cast(sizeof(nodelay))); nodelay = 0; setsockopt(static_cast(qtsSocket->socketDescriptor()), IPPROTO_TCP, TCP_NODELAY, reinterpret_cast(&nodelay), static_cast(sizeof(nodelay))); } void Connection::disconnectSocket(bool force) { if (qtsSocket->state() == QAbstractSocket::UnconnectedState) { emit connectionClosed(QAbstractSocket::UnknownSocketError, QString()); return; } if (force) qtsSocket->abort(); else qtsSocket->disconnectFromHost(); } QHostAddress Connection::peerAddress() const { return qtsSocket->peerAddress(); } quint16 Connection::peerPort() const { return qtsSocket->peerPort(); } QHostAddress Connection::localAddress() const { return qtsSocket->localAddress(); } quint16 Connection::localPort() const { return qtsSocket->localPort(); } QList Connection::peerCertificateChain() const { const QSslCertificate cert = qtsSocket->peerCertificate(); if (cert.isNull()) return QList(); else return qtsSocket->peerCertificateChain() << cert; } QSslCipher Connection::sessionCipher() const { return qtsSocket->sessionCipher(); } QSsl::SslProtocol Connection::sessionProtocol() const { #if QT_VERSION >= 0x050400 return qtsSocket->sessionProtocol(); #else return QSsl::UnknownProtocol; // Cannot determine session cipher. We only know it's some TLS variant #endif } QString Connection::sessionProtocolString() const { #if QT_VERSION >= 0x050400 return MumbleSSL::protocolToString(sessionProtocol()); #else return QLatin1String("TLS"); // Cannot determine session cipher. We only know it's some TLS variant #endif } #ifdef Q_OS_WIN void Connection::setQoS(HANDLE hParentQoS) { hQoS = hParentQoS; } #endif mumble-1.3.4/src/murmur/0000775000175000017500000000000014010707274014760 5ustar builderbuildermumble-1.3.4/src/murmur/murmur.rc0000664000175000017500000000252714010707274016643 0ustar builderbuilder// Copyright 2005-2021 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include IDI_ICON1 ICON DISCARDABLE "../../icons/murmur.ico" #ifndef DEBUG #define VER_DEBUG 0L #else #define VER_DEBUG VS_FF_DEBUG #endif #ifdef SNAPSHOT_BUILD #define VER_RELEASE VS_FF_SPECIALBUILD|VS_FF_PRERELEASE #else #define VER_RELEASE 0L #endif VS_VERSION_INFO VERSIONINFO FILEVERSION 1,3,4,0 PRODUCTVERSION 1,3,4,0 FILEFLAGSMASK VS_FFI_FILEFLAGSMASK FILEFLAGS (VER_DEBUG|VER_RELEASE) FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_APP FILESUBTYPE 0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904E4" BEGIN VALUE "CompanyName", "The Mumble Developers" VALUE "FileDescription", "Murmur - Low-latency VoIP server" VALUE "FileVersion", "1.3.4" VALUE "ProductVersion", "1.3.4" VALUE "LegalCopyright", "Copyright (c) 2005-2021 The Mumble Developers" VALUE "OriginalFilename", "murmur.exe" VALUE "ProductName", "Mumble" #ifdef SNAPSHOT_BUILD VALUE "SpecialBuild", "Snapshot development release" #endif END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1252 END END mumble-1.3.4/src/murmur/murmur_ice/0000775000175000017500000000000014010707274017127 5ustar builderbuildermumble-1.3.4/src/murmur/murmur_ice/murmur_ice.pro0000664000175000017500000000420414010707274022020 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../../../qmake/compiler.pri) SLICEFILES = ../Murmur.ice slice.output = ${QMAKE_FILE_BASE}.cpp win32 { slice.commands = slice2cpp --checksum -I\"$$ICE_PATH/slice\" ${QMAKE_FILE_NAME} } else { ICE_VERSION = $$system(slice2cpp --version 2>&1) EXTRA_SLICEFLAGS = !isEmpty(ICE_VERSION) { EXTRA_SLICEFLAGS = -I/usr/share/Ice-$$ICE_VERSION/slice/ } slice.commands = slice2cpp --checksum -I/usr/local/share/Ice -I/usr/share/Ice/slice -I/usr/share/ice/slice -I/usr/share/slice $$EXTRA_SLICEFLAGS ${QMAKE_FILE_NAME} } slice.input = SLICEFILES slice.CONFIG *= no_link explicit_dependencies slice.variable_out = SOURCES sliceh.output = ${QMAKE_FILE_BASE}.h sliceh.depends = ${QMAKE_FILE_BASE}.cpp sliceh.commands = $$escape_expand(\\n) sliceh.input = SLICEFILES sliceh.CONFIG *= no_link explicit_dependencies target_predeps TEMPLATE = lib CONFIG -= qt CONFIG += debug_and_release CONFIG += staticlib QMAKE_EXTRA_COMPILERS *= slice sliceh win32 { INCLUDEPATH *= "$$ICE_PATH/include" CONFIG(static) { DEFINES *= ICE_STATIC_LIBS } } macx { MUMBLE_ICE_PREFIX = $$(MUMBLE_ICE_PREFIX) isEmpty(MUMBLE_ICE_PREFIX) { MUMBLE_ICE_PREFIX = $$(MUMBLE_PREFIX)/Ice-3.4.2 } INCLUDEPATH *= $$MUMBLE_ICE_PREFIX/include/ slice.commands = $$MUMBLE_ICE_PREFIX/bin/slice2cpp --checksum -I$$MUMBLE_ICE_PREFIX/slice/ -I$$MUMBLE_ICE_PREFIX/share/slice/ -I$$MUMBLE_ICE_PREFIX/share/ice/slice ../Murmur.ice } unix:!macx:CONFIG(buildenv) { INCLUDEPATH *= $$(MUMBLE_ICE_PREFIX)/include/ slice.commands = $$(MUMBLE_ICE_PREFIX)/bin/slice2cpp --checksum -I$$(MUMBLE_ICE_PREFIX)/slice/ ../Murmur.ice } macx:CONFIG(static) { LIBS *= -lbz2 -liconv QMAKE_CXXFLAGS *= -fPIC } !CONFIG(third-party-warnings) { # We ignore warnings in third party builds. We won't actually look # at them and they clutter out our warnings. CONFIG -= warn_on CONFIG += warn_off } include(../../../qmake/symbols.pri) mumble-1.3.4/src/murmur/Meta.h0000664000175000017500000001100314010707274016012 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MURMUR_META_H_ #define MUMBLE_MURMUR_META_H_ #include #include #include #include #include #include #include #include #ifdef Q_OS_WIN #include #endif #include "Timer.h" class Server; class QSettings; class MetaParams { public: QDir qdBasePath; QList qlBind; unsigned short usPort; int iTimeout; int iMaxBandwidth; int iMaxUsers; int iMaxUsersPerChannel; int iDefaultChan; bool bRememberChan; int iMaxTextMessageLength; int iMaxImageMessageLength; int iOpusThreshold; int iChannelNestingLimit; int iChannelCountLimit; /// If true the old SHA1 password hashing is used instead of PBKDF2 bool legacyPasswordHash; /// Contains the default number of PBKDF2 iterations to use /// when hashing passwords. If the value loaded from config /// is <= 0 the value is loaded from the database and if not /// available there yet found by a benchmark. int kdfIterations; bool bAllowHTML; QString qsPassword; QString qsWelcomeText; bool bCertRequired; bool bForceExternalAuth; int iBanTries; int iBanTimeframe; int iBanTime; QString qsDatabase; int iSQLiteWAL; QString qsDBDriver; QString qsDBUserName; QString qsDBPassword; QString qsDBHostName; QString qsDBPrefix; QString qsDBOpts; int iDBPort; int iLogDays; int iObfuscate; bool bSendVersion; bool bAllowPing; QString qsDBus; QString qsDBusService; QString qsLogfile; QString qsPid; QString qsIceEndpoint; QString qsIceSecretRead, qsIceSecretWrite; QString qsGRPCAddress; QString qsGRPCCert; QString qsGRPCKey; QString qsRegName; QString qsRegPassword; QString qsRegHost; QString qsRegLocation; QUrl qurlRegWeb; bool bBonjour; QRegExp qrUserName; QRegExp qrChannelName; unsigned int iMessageLimit; unsigned int iMessageBurst; QSslCertificate qscCert; QSslKey qskKey; /// qlIntermediates contains the certificates /// from PEM bundle pointed to by murmur.ini's /// sslCert option that do not match the key /// pointed to by murmur.ini's sslKey option. /// /// Simply put: it contains any certificates /// that aren't the main certificate, or "leaf" /// certificate. QList qlIntermediates; /// qlCA contains all certificates read from /// the PEM bundle pointed to by murmur.ini's /// sslCA option. QList qlCA; /// qlCiphers contains the list of supported /// cipher suites. QList qlCiphers; QByteArray qbaDHParams; QByteArray qbaPassPhrase; QString qsCiphers; QMap qmConfig; #ifdef Q_OS_UNIX unsigned int uiUid, uiGid; QString qsHome; QString qsName; #endif QVariant qvSuggestVersion; QVariant qvSuggestPositional; QVariant qvSuggestPushToTalk; /// qsAbsSettingsFilePath is the absolute path to /// the murmur.ini used by this Meta instance. QString qsAbsSettingsFilePath; QSettings *qsSettings; MetaParams(); ~MetaParams(); void read(QString fname = QString("murmur.ini")); /// Attempt to load SSL settings from murmur.ini. /// Returns true if successful. Returns false if /// the operation failed. On failure, the MetaParams /// object is left 100% intact. bool loadSSLSettings(); private: template T typeCheckedFromSettings(const QString &name, const T &variable, QSettings *settings = NULL); }; class Meta : public QObject { private: Q_OBJECT; Q_DISABLE_COPY(Meta); public: static MetaParams mp; QHash qhServers; QHash > qhAttempts; QHash qhBans; QString qsOS, qsOSVersion; Timer tUptime; #ifdef Q_OS_WIN static HANDLE hQoS; #endif Meta(); ~Meta(); /// reloadSSLSettings reloads Murmur's MetaParams's /// SSL settings, and updates the certificate and /// private key for all virtual servers that use the /// Meta server's certificate and private key. bool reloadSSLSettings(); void bootAll(); bool boot(int); bool banCheck(const QHostAddress &); void kill(int); void killAll(); void getOSInfo(); void connectListener(QObject *); static void getVersion(int &major, int &minor, int &patch, QString &string); signals: void started(Server *); void stopped(Server *); }; extern Meta *meta; #endif mumble-1.3.4/src/murmur/murmur.pro0000664000175000017500000001204314010707274017031 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../mumble.pri) include(../../qmake/protoc.pri) DEFINES *= MURMUR TEMPLATE =app CONFIG *= network CONFIG -= gui QT *= network sql xml QT -= gui TARGET = murmur DBFILE = murmur.db LANGUAGE = C++ FORMS = HEADERS *= Server.h ServerUser.h Meta.h PBKDF2.h SOURCES *= main.cpp Server.cpp ServerUser.cpp ServerDB.cpp Register.cpp Cert.cpp Messages.cpp Meta.cpp RPC.cpp PBKDF2.cpp PRECOMPILED_HEADER = murmur_pch.h !CONFIG(no-ice) { CONFIG *= ice } !CONFIG(no-dbus):!win32:!macx { CONFIG *= dbus } !CONFIG(no-bonjour) { CONFIG *= bonjour } win32 { RC_FILE = murmur.rc CONFIG *= gui QT *= gui isEqual(QT_MAJOR_VERSION, 5) { QT *= widgets } RESOURCES *= murmur.qrc SOURCES *= Tray.cpp About.cpp HEADERS *= Tray.h About.h LIBS *= -luser32 -ladvapi32 win32-msvc* { QMAKE_POST_LINK = $$QMAKE_POST_LINK$$escape_expand(\\n\\t)$$quote(mt.exe -nologo -updateresource:$(DESTDIR_TARGET);1 -manifest ../mumble/mumble.appcompat.manifest) } } unix { contains(UNAME, Linux) { LIBS *= -lcap } CONFIG(static):!macx { QMAKE_LFLAGS *= -static } !macx:CONFIG(buildenv) { QMAKE_LFLAGS *= -Wl,-rpath,$$(MUMBLE_PREFIX)/lib:$$(MUMBLE_ICE_PREFIX)/lib } HEADERS *= UnixMurmur.h SOURCES *= UnixMurmur.cpp TARGET = murmurd } macx { CONFIG -= app_bundle LIBS *= -framework Security QMAKE_LFLAGS += -sectcreate __TEXT __info_plist murmur.plist } dbus { DEFINES *= USE_DBUS QT *= dbus HEADERS *= DBus.h SOURCES *= DBus.cpp } ice { SOURCES *= MurmurIce.cpp HEADERS *= MurmurIce.h win32:CONFIG(debug, debug|release) { LIBS *= -lIceD -lIceUtilD } else { # check Ice version, 3.7 merged IceUtil into Ice ICE_VERSION = $$system(slice2cpp --version 2>&1) ICE_MAJOR_VERSION = $$section(ICE_VERSION, ., 0, 0) ICE_MINOR_VERSION = $$section(ICE_VERSION, ., 1, 1) !equals(ICE_MAJOR_VERSION, 3) { error("Unsupported Ice version") } lessThan(ICE_MINOR_VERSION, 7) { # Ice < 3.7 LIBS *= -lIce -lIceUtil } else { # Ice 3.7+ LIBS *= -lIce } } DEFINES *= USE_ICE win32 { INCLUDEPATH *= "$$ICE_PATH/include" !CONFIG(static) { QMAKE_LIBDIR *= "$$ICE_PATH/lib/vc100" } else { DEFINES *= ICE_STATIC_LIBS QMAKE_LIBDIR *= $$BZIP2_PATH/lib equals(MUMBLE_ARCH, x86) { QMAKE_LIBDIR *= $$ICE_PATH/lib } equals(MUMBLE_ARCH, x86_64) { QMAKE_LIBDIR *= $$ICE_PATH/lib/x64 } CONFIG(release, debug|release): LIBS *= -llibbz2 CONFIG(debug, debug|release): LIBS *= -llibbz2d LIBS *= -ldbghelp -liphlpapi -lrpcrt4 } } macx { INCLUDEPATH *= $$(MUMBLE_PREFIX)/Ice-3.4.2/include/ QMAKE_LIBDIR *= $$(MUMBLE_PREFIX)/Ice-3.4.2/lib/ } unix:!macx:CONFIG(buildenv) { INCLUDEPATH *= $$(MUMBLE_ICE_PREFIX)/include/ QMAKE_LIBDIR *= $$(MUMBLE_ICE_PREFIX)/lib/ } unix:!macx:CONFIG(static) { LIBS *= -lbz2 QMAKE_CXXFLAGS *= -fPIC } macx:CONFIG(static) { LIBS *= -lbz2 -liconv QMAKE_CXXFLAGS *= -fPIC } LIBS *= -lmurmur_ice INCLUDEPATH *= murmur_ice unix { QMAKE_CFLAGS *= "-isystem murmur_ice" QMAKE_CXXFLAGS *= "-isystem murmur_ice" } } grpc { isEqual(QT_MAJOR_VERSION, 4) { error("Murmur's gRPC support requires Qt 5") } DEFINES *= USE_GRPC INCLUDEPATH *= murmur_grpc LIBS *= -lmurmur_grpc HEADERS *= MurmurGRPCImpl.h SOURCES *= MurmurGRPCImpl.cpp GRPC_WRAPPER = MurmurRPC.proto grpc_wrapper.output = MurmurRPC.proto.Wrapper.cpp grpc_wrapper.commands = $${PROTOC} --plugin=${DESTDIR}protoc-gen-murmur-grpcwrapper -I. --murmur-grpcwrapper_out=. MurmurRPC.proto grpc_wrapper.input = GRPC_WRAPPER grpc_wrapper.variable_out = QMAKE_EXTRA_COMPILERS += grpc_wrapper unix { QMAKE_CXXFLAGS *= -std=c++11 must_pkgconfig(grpc) must_pkgconfig(grpc++) } } bonjour { DEFINES *= USE_BONJOUR HEADERS *= \ ../../3rdparty/qqbonjour-src/BonjourRecord.h \ ../../3rdparty/qqbonjour-src/BonjourServiceRegister.h \ BonjourServer.h SOURCES *= \ ../../3rdparty/qqbonjour-src/BonjourServiceRegister.cpp \ BonjourServer.cpp INCLUDEPATH *= ../../3rdparty/qqbonjour-src win32 { INCLUDEPATH *= "$$BONJOUR_PATH/include" QMAKE_LIBDIR *= "$$BONJOUR_PATH/lib/win32" LIBS *= -lDNSSD } unix:!macx { system($$PKG_CONFIG --exists avahi-compat-libdns_sd avahi-client) { must_pkgconfig(avahi-compat-libdns_sd) must_pkgconfig(avahi-client) } else { LIBS *= -ldns_sd } } } # Check for QSslDiffieHellmanParameters availability, and define # USE_QSSLDIFFIEHELLMANPARAMETERS preprocessor if available. # # Can be disabled with no-qssldiffiehellmanparameters. !CONFIG(no-qssldiffiehellmanparameters):exists($$[QT_INSTALL_HEADERS]/QtNetwork/QSslDiffieHellmanParameters) { DEFINES += USE_QSSLDIFFIEHELLMANPARAMETERS } include(../../qmake/symbols.pri) mumble-1.3.4/src/murmur/About.h0000664000175000017500000000156714010707274016214 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MURMUR_ABOUT_H_ #define MUMBLE_MURMUR_ABOUT_H_ #include #include #if QT_VERSION >= 0x050000 # include #else # include #endif enum AboutDialogOptions { AboutDialogOptionsShowAbout, AboutDialogOptionsShowLicense, AboutDialogOptionsShowAuthors, AboutDialogOptionsShowThirdPartyLicenses, AboutDialogOptionsDefault = AboutDialogOptionsShowAbout }; class AboutDialog : public QDialog { private: Q_OBJECT Q_DISABLE_COPY(AboutDialog) public: AboutDialog(QWidget *parent, AboutDialogOptions options = AboutDialogOptionsDefault); }; #endif mumble-1.3.4/src/murmur/Cert.cpp0000664000175000017500000001472214010707274016367 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "murmur_pch.h" #include "Meta.h" #include "Server.h" #include "SelfSignedCertificate.h" bool Server::isKeyForCert(const QSslKey &key, const QSslCertificate &cert) { if (key.isNull() || cert.isNull() || (key.type() != QSsl::PrivateKey)) return false; QByteArray qbaKey = key.toDer(); QByteArray qbaCert = cert.toDer(); X509 *x509 = NULL; EVP_PKEY *pkey = NULL; BIO *mem = NULL; mem = BIO_new_mem_buf(qbaKey.data(), qbaKey.size()); Q_UNUSED(BIO_set_close(mem, BIO_NOCLOSE)); pkey = d2i_PrivateKey_bio(mem, NULL); BIO_free(mem); mem = BIO_new_mem_buf(qbaCert.data(), qbaCert.size()); Q_UNUSED(BIO_set_close(mem, BIO_NOCLOSE)); x509 = d2i_X509_bio(mem, NULL); BIO_free(mem); mem = NULL; if (x509 && pkey && X509_check_private_key(x509, pkey)) { EVP_PKEY_free(pkey); X509_free(x509); return true; } if (pkey) EVP_PKEY_free(pkey); if (x509) X509_free(x509); return false; } QSslKey Server::privateKeyFromPEM(const QByteArray &buf, const QByteArray &pass) { QSslKey key; key = QSslKey(buf, QSsl::Rsa, QSsl::Pem, QSsl::PrivateKey, pass); if (key.isNull()) key = QSslKey(buf, QSsl::Dsa, QSsl::Pem, QSsl::PrivateKey, pass); #if QT_VERSION >= 0x050500 if (key.isNull()) key = QSslKey(buf, QSsl::Ec, QSsl::Pem, QSsl::PrivateKey, pass); #endif return key; } void Server::initializeCert() { QByteArray crt, key, pass, dhparams; // Clear all exising SSL settings // for this server. qscCert.clear(); qlIntermediates.clear(); qskKey.clear(); #if defined(USE_QSSLDIFFIEHELLMANPARAMETERS) qsdhpDHParams = QSslDiffieHellmanParameters(); #endif crt = getConf("certificate", QString()).toByteArray(); key = getConf("key", QString()).toByteArray(); pass = getConf("passphrase", QByteArray()).toByteArray(); dhparams = getConf("sslDHParams", Meta::mp.qbaDHParams).toByteArray(); QList ql; // Attempt to load the private key. if (! key.isEmpty()) { qskKey = Server::privateKeyFromPEM(key, pass); } // If we still can't load the key, try loading any keys from the certificate if (qskKey.isNull() && ! crt.isEmpty()) { qskKey = Server::privateKeyFromPEM(crt); } // If have a key, walk the list of certs, find the one for our key, // remove any certs for our key from the list, what's left is part of // the CA certificate chain. if (! qskKey.isNull()) { ql << QSslCertificate::fromData(crt); ql << QSslCertificate::fromData(key); for (int i=0;i= 0x050000 QStringList issuerNames = qscCert.issuerInfo(QSslCertificate::CommonName); if (! issuerNames.isEmpty()) { issuer = issuerNames.first(); } #else issuer = qscCert.issuerInfo(QSslCertificate::CommonName); #endif // Really old certs/keys are no good, throw them away so we can // generate a new one below. if (issuer == QString::fromUtf8("Murmur Autogenerated Certificate")) { log("Old autogenerated certificate is unusable for registration, invalidating it"); qscCert = QSslCertificate(); qskKey = QSslKey(); } // If we have a cert, and it's a self-signed one, but we're binding to // all the same addresses as the Meta server is, use it's cert instead. // This allows a self-signed certificate generated by Murmur to be // replaced by a CA-signed certificate in the .ini file. if (!qscCert.isNull() && issuer.startsWith(QString::fromUtf8("Murmur Autogenerated Certificate")) && ! Meta::mp.qscCert.isNull() && ! Meta::mp.qskKey.isNull() && (Meta::mp.qlBind == qlBind)) { qscCert = Meta::mp.qscCert; qskKey = Meta::mp.qskKey; qlIntermediates = Meta::mp.qlIntermediates; if (!qscCert.isNull() && !qskKey.isNull()) { bUsingMetaCert = true; } } // If we still don't have a certificate by now, try to load the one from Meta if (qscCert.isNull() || qskKey.isNull()) { if (! key.isEmpty() || ! crt.isEmpty()) { log("Certificate specified, but failed to load."); } qskKey = Meta::mp.qskKey; qscCert = Meta::mp.qscCert; qlIntermediates = Meta::mp.qlIntermediates; if (!qscCert.isNull() && !qskKey.isNull()) { bUsingMetaCert = true; } // If loading from Meta doesn't work, build+sign a new one if (qscCert.isNull() || qskKey.isNull()) { log("Generating new server certificate."); if (!SelfSignedCertificate::generateMurmurV2Certificate(qscCert, qskKey)) { log("Certificate or key generation failed"); } setConf("certificate", qscCert.toPem()); setConf("key", qskKey.toPem()); } } // Drain OpenSSL's per-thread error queue // to ensure that errors from the operations // we've done in here do not leak out into // Qt's SSL module. // // If an error leaks, it can break all connections // to the server because each invocation of Qt's SSL // read callback checks OpenSSL's per-thread error // queue (albeit indirectly, via SSL_get_error()). // Qt expects any errors returned from SSL_get_error() // to be related to the QSslSocket it is currently // processing -- which is the obvious thing to expect: // SSL_get_error() takes a pointer to an SSL object // and the return code of the failed operation. // However, it is also documented as: // // "In addition to ssl and ret, SSL_get_error() // inspects the current thread's OpenSSL error // queue." // // So, if any OpenSSL operation on the main thread // forgets to clear the error queue, those errors // *will* leak into other things that *do* error // checking. In our case, into Qt's SSL read callback, // resulting in all clients being disconnected. ERR_clear_error(); } const QString Server::getDigest() const { return QString::fromLatin1(qscCert.digest(QCryptographicHash::Sha1).toHex()); } mumble-1.3.4/src/murmur/DBus.h0000664000175000017500000002042614010707274015772 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifdef USE_DBUS #ifndef MUMBLE_MURMUR_DBUS_H_ #define MUMBLE_MURMUR_DBUS_H_ #include #include #include "ACL.h" #include "Channel.h" #include "Group.h" #include "Meta.h" #include "Server.h" #include "ServerDB.h" #include "User.h" struct Ban; class QDBusObjectPath; class QDBusMessage; struct PlayerInfo { unsigned int session; bool mute, deaf, suppressed; bool selfMute, selfDeaf; int channel; PlayerInfo() : session(0), mute(false), deaf(false), suppressed(false), selfMute(false), selfDeaf(false), channel(-1) { }; PlayerInfo(const User *); }; Q_DECLARE_METATYPE(PlayerInfo); struct PlayerInfoExtended : public PlayerInfo { int id; QString name; int onlinesecs; int bytespersec; PlayerInfoExtended() : id(-1), onlinesecs(-1), bytespersec(-1) {}; PlayerInfoExtended(const User *); }; Q_DECLARE_METATYPE(PlayerInfoExtended); Q_DECLARE_METATYPE(QList); struct ChannelInfo { int id; QString name; int parent; QList links; ChannelInfo() : id(-1), parent(-1) { }; ChannelInfo(const Channel *c); }; Q_DECLARE_METATYPE(ChannelInfo); Q_DECLARE_METATYPE(QList); struct GroupInfo { QString name; bool inherited, inherit, inheritable; QList add, remove, members; GroupInfo() : inherited(false), inherit(false), inheritable(false) { }; GroupInfo(const Group *g); }; Q_DECLARE_METATYPE(GroupInfo); Q_DECLARE_METATYPE(QList); struct ACLInfo { bool applyHere, applySubs, inherited; int playerid; QString group; unsigned int allow, deny; ACLInfo() : applyHere(false), applySubs(false), inherited(false), playerid(-1), allow(0), deny(0) { }; ACLInfo(const ChanACL *acl); }; Q_DECLARE_METATYPE(ACLInfo); Q_DECLARE_METATYPE(QList); struct BanInfo { unsigned int address; int bits; BanInfo() : address(0), bits(0) { }; BanInfo(const Ban &); }; Q_DECLARE_METATYPE(BanInfo); Q_DECLARE_METATYPE(QList); struct RegisteredPlayer { int id; QString name; QString email; QString pw; RegisteredPlayer(); }; Q_DECLARE_METATYPE(RegisteredPlayer); Q_DECLARE_METATYPE(QList); struct LogEntry { unsigned int timestamp; QString txt; LogEntry(); LogEntry(const ServerDB::LogRecord &); }; Q_DECLARE_METATYPE(LogEntry); Q_DECLARE_METATYPE(QList); class MurmurDBus : public QDBusAbstractAdaptor { private: Q_OBJECT Q_CLASSINFO("D-Bus Interface", "net.sourceforge.mumble.Murmur") Q_DISABLE_COPY(MurmurDBus) protected: Server *server; bool bReentrant; QString qsAuthService; QString qsAuthPath; void removeAuthenticator(); public: static QDBusConnection *qdbc; MurmurDBus(Server *srv); static void registerTypes(); public slots: // These have the result ref as the first parameter, so won't be converted to DBus void authenticateSlot(int &res, QString &uname, int sessionId, const QList &certs, const QString &certhash, bool strong, const QString &pw); void registerUserSlot(int &res, const QMap &); void unregisterUserSlot(int &res, int id); void getRegisteredUsersSlot(const QString &filter, QMap &res); void getRegistrationSlot(int &, int, QMap &); void setInfoSlot(int &, int, const QMap &); void setTextureSlot(int &res, int id, const QByteArray &texture); void nameToIdSlot(int &res, const QString &name); void idToNameSlot(QString &res, int id); void idToTextureSlot(QByteArray &res, int id); // These use private types, so won't be converted to DBus void userStateChanged(const User *p); void userTextMessage(const User *, const TextMessage &); void userConnected(const User *p); void userDisconnected(const User *p); void channelStateChanged(const Channel *c); void channelCreated(const Channel *c); void channelRemoved(const Channel *c); public slots: // Order of paremeters is IMPORTANT, or Qt will barf. // Needs to be: // First all input parameters (non-ref or const-ref) // Then const QDbusMessage ref // Then output paremeters (ref) // Unfortunately, this makes things look chaotic, but luckily it looks sane again when introspected. // make SURE arguments have sane names, the argument-name will be exported in introspection xml. void getPlayers(QList &player_list); void getChannels(QList &channel_list); void getACL(int channel, const QDBusMessage &, QList &acls,QList &groups, bool &inherit); void setACL(int channel, const QList &acls, const QList &groups, bool inherit, const QDBusMessage &); void getBans(QList &bans); void setBans(const QList &bans, const QDBusMessage &); void kickPlayer(unsigned int session, const QString &reason, const QDBusMessage &); void getPlayerState(unsigned int session, const QDBusMessage &, PlayerInfo &state); void setPlayerState(const PlayerInfo &state, const QDBusMessage &); void sendMessage(unsigned int session, const QString &text, const QDBusMessage &); void getChannelState(int id, const QDBusMessage &, ChannelInfo &state); void setChannelState(const ChannelInfo &state, const QDBusMessage &); void removeChannel(int id, const QDBusMessage &); void addChannel(const QString &name, int parent, const QDBusMessage &, int &newid); void sendMessageChannel(int id, bool tree, const QString &text, const QDBusMessage &); void getPlayerNames(const QList &ids, const QDBusMessage &, QStringList &names); void getPlayerIds(const QStringList &names, const QDBusMessage &, QList &ids); void setAuthenticator(const QDBusObjectPath &path, bool reentrant, const QDBusMessage &); void setTemporaryGroups(int channel, int playerid, const QStringList &groups, const QDBusMessage &); void registerPlayer(const QString &name, const QDBusMessage &, int &id); void unregisterPlayer(int id, const QDBusMessage &); void updateRegistration(const RegisteredPlayer &player, const QDBusMessage &); void setRegistration(int id, const QString &name, const QString &email, const QString &pw, const QDBusMessage &); void getRegistration(int id, const QDBusMessage &, RegisteredPlayer &player); void getRegisteredPlayers(const QString &filter, QList &players); void verifyPassword(int id, const QString &pw, const QDBusMessage &, bool &ok); void getTexture(int id, const QDBusMessage &, QByteArray &texture); void setTexture(int id, const QByteArray &, const QDBusMessage &); signals: void playerStateChanged(const PlayerInfo &state); void playerConnected(const PlayerInfo &state); void playerDisconnected(const PlayerInfo &state); void channelStateChanged(const ChannelInfo &state); void channelCreated(const ChannelInfo &state); void channelRemoved(const ChannelInfo &state); }; typedef QMap ConfigMap; Q_DECLARE_METATYPE(ConfigMap); class MetaDBus : public QDBusAbstractAdaptor { private: Q_OBJECT Q_CLASSINFO("D-Bus Interface", "net.sourceforge.mumble.Meta") Q_DISABLE_COPY(MetaDBus) protected: Meta *meta; public: MetaDBus(Meta *m); public slots: void started(Server *s); void stopped(Server *s); public slots: void start(int server_id, const QDBusMessage &); void stop(int server_id, const QDBusMessage &); void newServer(int &server_id); void deleteServer(int server_id, const QDBusMessage &); void getBootedServers(QList &server_list); void getAllServers(QList &server_list); void isBooted(int server_id, bool &booted); void getConf(int server_id, const QString &key, const QDBusMessage &, QString &value); void getAllConf(int server_id, const QDBusMessage &, ConfigMap &values); void getDefaultConf(ConfigMap &values); void setConf(int server_id, const QString &key, const QString &value, const QDBusMessage &); void setSuperUserPassword(int server_id, const QString &pw, const QDBusMessage &); void getLog(int server_id, int min_offset, int max_offset, const QDBusMessage &, QList &entries); void getVersion(int &major, int &minor, int &patch, QString &string); void quit(); signals: void started(int server_id); void stopped(int server_id); }; #endif #endif mumble-1.3.4/src/murmur/murmur_grpc/0000775000175000017500000000000014010707274017322 5ustar builderbuildermumble-1.3.4/src/murmur/murmur_grpc/murmur_grpc.pro0000664000175000017500000000326614010707274022415 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../../../qmake/compiler.pri) include(../../../qmake/protoc.pri) GRPC *= ../MurmurRPC.proto grpc_pbh.output = ${QMAKE_FILE_BASE}.pb.h grpc_pbh.depends = ${QMAKE_FILE_BASE}.pb.cc grpc_pbh.commands = $$escape_expand(\\n) grpc_pbh.input = GRPC grpc_pbh.CONFIG *= no_link explicit_dependencies target_predeps grpc_pbh.variable_out = HEADERS grpc_pb.output = ${QMAKE_FILE_BASE}.pb.cc grpc_pb.commands = $${PROTOC} --cpp_out=. -I. -I.. ${QMAKE_FILE_NAME} grpc_pb.input = GRPC grpc_pb.CONFIG *= no_link explicit_dependencies grpc_pb.variable_out = SOURCES grpch.output = ${QMAKE_FILE_BASE}.grpc.pb.h grpch.depends = ${QMAKE_FILE_BASE}.grpc.pb.cc grpch.commands = $$escape_expand(\\n) grpch.input = GRPC grpch.CONFIG *= no_link explicit_dependencies target_predeps grpc.output = ${QMAKE_FILE_BASE}.grpc.pb.cc grpc.depends = ${QMAKE_FILE_BASE}.pb.h grpc.commands = $${PROTOC} --grpc_out=. --plugin=protoc-gen-grpc=$$system(which grpc_cpp_plugin) -I. -I.. ${QMAKE_FILE_NAME} grpc.input = GRPC grpc.CONFIG *= no_link explicit_dependencies grpc.variable_out = SOURCES TEMPLATE = lib CONFIG -= qt CONFIG += debug_and_release CONFIG += staticlib QMAKE_EXTRA_COMPILERS *= grpc_pb grpc_pbh grpc grpch !CONFIG(third-party-warnings) { # We ignore warnings in third party builds. We won't actually look # at them and they clutter out our warnings. CONFIG -= warn_on CONFIG += warn_off } unix { QMAKE_CXXFLAGS *= -std=c++11 } include(../../../qmake/symbols.pri) mumble-1.3.4/src/murmur/DBus.cpp0000664000175000017500000006441714010707274016335 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "murmur_pch.h" #include "DBus.h" #include "Connection.h" #include "Message.h" #include "Server.h" #include "ServerUser.h" #include "ServerDB.h" QDBusArgument &operator<<(QDBusArgument &a, const PlayerInfo &s) { a.beginStructure(); a << s.session << s.mute << s.deaf << s.suppressed << s.selfMute << s.selfDeaf << s.channel; a.endStructure(); return a; } const QDBusArgument & operator >>(const QDBusArgument &a, PlayerInfo &s) { a.beginStructure(); a >> s.session >> s.mute >> s.deaf >> s.suppressed >> s.selfMute >> s.selfDeaf >> s.channel; a.endStructure(); return a; } QDBusArgument &operator<<(QDBusArgument &a, const PlayerInfoExtended &s) { a.beginStructure(); a << s.session << s.mute << s.deaf << s.suppressed << s.selfMute << s.selfDeaf << s.channel << s.id << s.name << s.onlinesecs << s.bytespersec; a.endStructure(); return a; } const QDBusArgument & operator >>(const QDBusArgument &a, PlayerInfoExtended &s) { a.beginStructure(); a >> s.session >> s.mute >> s.deaf >> s.suppressed >> s.selfMute >> s.selfDeaf >> s.channel >> s.id >> s.name >> s.onlinesecs >> s.bytespersec; a.endStructure(); return a; } QDBusArgument &operator<<(QDBusArgument &a, const ChannelInfo &s) { a.beginStructure(); a << s.id << s.name << s.parent << s.links; a.endStructure(); return a; } const QDBusArgument & operator >>(const QDBusArgument &a, ChannelInfo &s) { a.beginStructure(); a >> s.id >> s.name >> s.parent >> s.links; a.endStructure(); return a; } QDBusArgument &operator<<(QDBusArgument &a, const GroupInfo &s) { a.beginStructure(); a << s.name << s.inherited << s.inherit << s.inheritable; a << s.add << s.remove << s.members; a.endStructure(); return a; } const QDBusArgument & operator >>(const QDBusArgument &a, GroupInfo &s) { a.beginStructure(); a >> s.name >> s.inherited >> s.inherit >> s.inheritable; a >> s.add >> s.remove >> s.members; a.endStructure(); return a; } QDBusArgument &operator<<(QDBusArgument &a, const ACLInfo &s) { a.beginStructure(); a << s.applyHere << s.applySubs << s.inherited; a << s.playerid << s.group; a << s.allow << s.deny; a.endStructure(); return a; } const QDBusArgument & operator >>(const QDBusArgument &a, ACLInfo &s) { a.beginStructure(); a >> s.applyHere >> s.applySubs >> s.inherited; a >> s.playerid >> s.group; a >> s.allow >> s.deny; a.endStructure(); return a; } QDBusArgument &operator<<(QDBusArgument &a, const BanInfo &s) { a.beginStructure(); a << s.address << s.bits; a.endStructure(); return a; } const QDBusArgument & operator >>(const QDBusArgument &a, BanInfo &s) { a.beginStructure(); a >> s.address >> s.bits; a.endStructure(); return a; } QDBusArgument &operator<<(QDBusArgument &a, const RegisteredPlayer &s) { a.beginStructure(); a << s.id << s.name << s.email << s.pw; a.endStructure(); return a; } const QDBusArgument & operator >>(const QDBusArgument &a, RegisteredPlayer &s) { a.beginStructure(); a >> s.id >> s.name >> s.email >> s.pw; a.endStructure(); return a; } QDBusArgument &operator<<(QDBusArgument &a, const LogEntry &s) { a.beginStructure(); a << s.timestamp << s.txt; a.endStructure(); return a; } const QDBusArgument & operator >>(const QDBusArgument &a, LogEntry &s) { a.beginStructure(); a >> s.timestamp >> s.txt; a.endStructure(); return a; } void MurmurDBus::registerTypes() { qDBusRegisterMetaType(); qDBusRegisterMetaType(); qDBusRegisterMetaType >(); qDBusRegisterMetaType(); qDBusRegisterMetaType >(); qDBusRegisterMetaType(); qDBusRegisterMetaType >(); qDBusRegisterMetaType(); qDBusRegisterMetaType >(); qDBusRegisterMetaType(); qDBusRegisterMetaType >(); qDBusRegisterMetaType(); qDBusRegisterMetaType >(); qDBusRegisterMetaType(); qDBusRegisterMetaType(); qDBusRegisterMetaType >(); } QDBusConnection *MurmurDBus::qdbc = NULL; MurmurDBus::MurmurDBus(Server *srv) : QDBusAbstractAdaptor(srv) { server = srv; srv->connectListener(this); } void MurmurDBus::removeAuthenticator() { server->disconnectAuthenticator(this); qsAuthPath = QString(); qsAuthService = QString(); } void MurmurDBus::idToNameSlot(QString &name, int id) { QDBusInterface remoteApp(qsAuthService,qsAuthPath,QString(),*qdbc); QDBusReply reply = remoteApp.call(bReentrant ? QDBus::BlockWithGui : QDBus::Block, "getUserName",id); if (reply.isValid()) name = reply.value(); else { server->log(QString("DBus Authenticator failed getUserName for %1: %2").arg(QString::number(id), QString(reply.error().message()))); removeAuthenticator(); } } void MurmurDBus::idToTextureSlot(QByteArray &qba, int id) { QDBusInterface remoteApp(qsAuthService,qsAuthPath,QString(),*qdbc); QDBusReply reply = remoteApp.call(bReentrant ? QDBus::BlockWithGui : QDBus::Block, "getUserTexture",id); if (reply.isValid()) { qba = reply.value(); } } void MurmurDBus::nameToIdSlot(int &id, const QString &name) { QDBusInterface remoteApp(qsAuthService,qsAuthPath,QString(),*qdbc); QDBusReply reply = remoteApp.call(bReentrant ? QDBus::BlockWithGui : QDBus::Block, "getUserId",name); if (reply.isValid()) id = reply.value(); else { server->log(QString("DBus Authenticator failed getUserId for %1: %2").arg(name).arg(reply.error().message())); removeAuthenticator(); } } void MurmurDBus::registerUserSlot(int &res, const QMap &info) { QDBusInterface remoteApp(qsAuthService,qsAuthPath,QString(),*qdbc); QDBusReply reply = remoteApp.call(bReentrant ? QDBus::BlockWithGui : QDBus::Block, "registerPlayer", info.value(ServerDB::User_Name)); if (reply.isValid()) { res = reply.value(); if ((info.count() > 1) && (res > 0)) setInfoSlot(res, res, info); } } void MurmurDBus::unregisterUserSlot(int &res, int id) { QDBusInterface remoteApp(qsAuthService,qsAuthPath,QString(),*qdbc); QDBusReply reply = remoteApp.call(bReentrant ? QDBus::BlockWithGui : QDBus::Block, "unregisterPlayer", id); if (reply.isValid()) res = reply.value(); } void MurmurDBus::getRegistrationSlot(int &res, int id, QMap &info) { QDBusInterface remoteApp(qsAuthService,qsAuthPath,QString(),*qdbc); QDBusReply reply = remoteApp.call(bReentrant ? QDBus::BlockWithGui : QDBus::Block, "getRegistration", id); if (reply.isValid()) { const RegisteredPlayer &r = reply.value(); info.insert(ServerDB::User_Name, r.name); if (! r.email.isEmpty()) info.insert(ServerDB::User_Email, r.email); res = 1; } } void MurmurDBus::getRegisteredUsersSlot(const QString &filter, QMap &m) { QDBusInterface remoteApp(qsAuthService,qsAuthPath,QString(),*qdbc); QDBusReply > reply = remoteApp.call(bReentrant ? QDBus::BlockWithGui : QDBus::Block, "getRegisteredPlayers", filter); if (reply.isValid()) { const QList &r = reply.value(); foreach(const RegisteredPlayer &p, r) { m.insert(p.id, p.name); } } } void MurmurDBus::setInfoSlot(int &res, int id, const QMap &info) { if (info.contains(ServerDB::User_Name)) { QDBusInterface remoteApp(qsAuthService,qsAuthPath,QString(),*qdbc); QDBusReply reply = remoteApp.call(bReentrant ? QDBus::BlockWithGui : QDBus::Block, "setName",id, info.value(ServerDB::User_Name)); if (reply.isValid()) res = reply.value(); } if (info.contains(ServerDB::User_Password)) { QDBusInterface remoteApp(qsAuthService,qsAuthPath,QString(),*qdbc); QDBusReply reply = remoteApp.call(bReentrant ? QDBus::BlockWithGui : QDBus::Block, "setPW",id, info.value(ServerDB::User_Password)); if (reply.isValid()) res = reply.value(); } if (info.contains(ServerDB::User_Email)) { QDBusInterface remoteApp(qsAuthService,qsAuthPath,QString(),*qdbc); QDBusReply reply = remoteApp.call(bReentrant ? QDBus::BlockWithGui : QDBus::Block, "setEmail",id, info.value(ServerDB::User_Email)); if (reply.isValid()) res = reply.value(); } } void MurmurDBus::setTextureSlot(int &res, int id, const QByteArray &texture) { QDBusInterface remoteApp(qsAuthService,qsAuthPath,QString(),*qdbc); QDBusReply reply = remoteApp.call(bReentrant ? QDBus::BlockWithGui : QDBus::Block, "setTexture",id, texture); if (reply.isValid()) res = reply.value(); } void MurmurDBus::authenticateSlot(int &res, QString &uname, int sessionId, const QList &, const QString &, bool, const QString &pw) { QDBusInterface remoteApp(qsAuthService,qsAuthPath,QString(),*qdbc); QDBusMessage msg = remoteApp.call(bReentrant ? QDBus::BlockWithGui : QDBus::Block, "authenticate",uname,pw); QDBusError err = msg; if (! err.isValid()) { QString newname; int uid = -2; bool ok = true; if (msg.arguments().count() >= 1) { uid = msg.arguments().at(0).toInt(&ok); } if (ok && (msg.arguments().count() >= 2)) { newname = msg.arguments().at(1).toString(); if (! newname.isEmpty()) { uname = newname; } } if (ok && (msg.arguments().count() >= 3)) { server->setTempGroups(uid, sessionId, NULL, msg.arguments().at(2).toStringList()); } if (ok) { server->log(QString("DBus Authenticate success for %1: %2").arg(uname).arg(uid)); res = uid; } else { server->log(QString("DBus Autenticator failed authenticate for %1: Invalid return type").arg(uname)); } } else { server->log(QString("DBus Authenticator failed authenticate for %1: %2").arg(uname).arg(err.message())); removeAuthenticator(); } } #define PLAYER_SETUP_VAR(var) \ ServerUser *pUser = server->qhUsers.value(var); \ if (! pUser) { \ qdbc->send(msg.createErrorReply("net.sourceforge.mumble.Error.session", "Invalid session id")); \ return; \ } #define PLAYER_SETUP PLAYER_SETUP_VAR(session) #define CHANNEL_SETUP_VAR2(dst,var) \ Channel *dst = server->qhChannels.value(var); \ if (! dst) { \ qdbc->send(msg.createErrorReply("net.sourceforge.mumble.Error.channel", "Invalid channel id")); \ return; \ } #define CHANNEL_SETUP_VAR(var) CHANNEL_SETUP_VAR2(cChannel,var) void MurmurDBus::getPlayers(QList &a) { a.clear(); foreach(ServerUser *p, server->qhUsers) { if (static_cast(p)->sState == ServerUser::Authenticated) a << PlayerInfoExtended(p); } } void MurmurDBus::getChannels(QList &a) { a.clear(); QQueue q; q << server->qhChannels.value(0); while (! q.isEmpty()) { Channel *c = q.dequeue(); a << ChannelInfo(c); foreach(c, c->qlChannels) q.enqueue(c); } } void MurmurDBus::kickPlayer(unsigned int session, const QString &reason, const QDBusMessage &msg) { PLAYER_SETUP; Connection *c = server->qhUsers.value(session); if (!c) return; MumbleProto::UserRemove mpur; mpur.set_session(session); mpur.set_reason(u8(reason)); server->sendAll(mpur); c->disconnectSocket(); } void MurmurDBus::getPlayerState(unsigned int session, const QDBusMessage &msg, PlayerInfo &pi) { PLAYER_SETUP; pi = PlayerInfo(pUser); } void MurmurDBus::setPlayerState(const PlayerInfo &npi, const QDBusMessage &msg) { PLAYER_SETUP_VAR(npi.session); CHANNEL_SETUP_VAR(npi.channel); PlayerInfo pi(pUser); server->setUserState(pUser, cChannel, npi.mute, npi.deaf, pUser->bPrioritySpeaker, npi.suppressed); } void MurmurDBus::sendMessage(unsigned int session, const QString &text, const QDBusMessage &msg) { PLAYER_SETUP; server->sendTextMessage(NULL, pUser, false, text); } void MurmurDBus::sendMessageChannel(int id, bool tree, const QString &text, const QDBusMessage &msg) { CHANNEL_SETUP_VAR(id); server->sendTextMessage(cChannel, NULL, tree, text); } void MurmurDBus::addChannel(const QString &name, int chanparent, const QDBusMessage &msg, int &newid) { CHANNEL_SETUP_VAR(chanparent); Channel *nc; { QWriteLocker wl(&server->qrwlVoiceThread); nc = server->addChannel(cChannel, name); } server->updateChannel(nc); newid = nc->iId; MumbleProto::ChannelState mpcs; mpcs.set_channel_id(nc->iId); mpcs.set_parent(cChannel->iId); mpcs.set_name(u8(name)); server->sendAll(mpcs); } void MurmurDBus::removeChannel(int id, const QDBusMessage &msg) { CHANNEL_SETUP_VAR(id); if (!cChannel->cParent) { qdbc->send(msg.createErrorReply("net.sourceforge.mumble.Error.channel", "Invalid channel id")); return; } QWriteLocker wl(&server->qrwlVoiceThread); server->removeChannel(cChannel); } void MurmurDBus::getChannelState(int id, const QDBusMessage &msg, ChannelInfo &state) { CHANNEL_SETUP_VAR(id); state = ChannelInfo(cChannel); } void MurmurDBus::setChannelState(const ChannelInfo &nci, const QDBusMessage &msg) { CHANNEL_SETUP_VAR(nci.id); CHANNEL_SETUP_VAR2(cParent, nci.parent); QSet newset; foreach(int id, nci.links) { CHANNEL_SETUP_VAR2(cLink, id); newset << cLink; } if (! server->setChannelState(cChannel, cParent, nci.name, newset)) { qdbc->send(msg.createErrorReply("net.sourceforge.mumble.Error.channel", "Moving channel to subchannel")); return; } } void MurmurDBus::getACL(int id, const QDBusMessage &msg, QList &acls, QList &groups, bool &inherit) { CHANNEL_SETUP_VAR(id); QStack chans; Channel *p; ChanACL *acl; p = cChannel; while (p) { chans.push(p); if ((p == cChannel) || (p->bInheritACL)) p = p->cParent; else p =NULL; } inherit = cChannel->bInheritACL; while (! chans.isEmpty()) { p = chans.pop(); foreach(acl, p->qlACL) { if ((p==cChannel) || (acl->bApplySubs)) { ACLInfo ai(acl); if (p != cChannel) ai.inherited = true; acls << ai; } } } p = cChannel->cParent; QSet allnames = Group::groupNames(cChannel); QString name; foreach(name, allnames) { Group *g = cChannel->qhGroups.value(name); Group *pg = p ? Group::getGroup(p, name) : NULL; if (!g && ! pg) continue; GroupInfo gi(g ? g : pg); QSet members; if (pg) members = pg->members(); if (g) { gi.add = g->qsAdd.toList(); gi.remove = g->qsRemove.toList(); gi.inherited = false; members+=g->qsAdd; members-=g->qsRemove; } else { gi.inherited = true; } gi.members = members.toList(); groups << gi; } } void MurmurDBus::setACL(int id, const QList &acls, const QList &groups, bool inherit, const QDBusMessage &msg) { CHANNEL_SETUP_VAR(id); Group *g; ChanACL *a; ACLInfo ai; GroupInfo gi; QHash > hOldTemp; foreach(g, cChannel->qhGroups) { hOldTemp.insert(g->qsName, g->qsTemporary); delete g; } foreach(a, cChannel->qlACL) delete a; cChannel->qhGroups.clear(); cChannel->qlACL.clear(); cChannel->bInheritACL = inherit; foreach(gi, groups) { g = new Group(cChannel, gi.name); g->bInherit=gi.inherit; g->bInheritable=gi.inheritable; g->qsAdd = gi.add.toSet(); g->qsRemove = gi.remove.toSet(); g->qsTemporary = hOldTemp.value(gi.name); } foreach(ai, acls) { a = new ChanACL(cChannel); a->bApplyHere = ai.applyHere; a->bApplySubs = ai.applySubs; a->iUserId = ai.playerid; a->qsGroup = ai.group; a->pDeny = static_cast(ai.deny) & ChanACL::All; a->pAllow = static_cast(ai.allow) & ChanACL::All; } server->clearACLCache(); server->updateChannel(cChannel); } void MurmurDBus::getBans(QList &bi) { bi.clear(); foreach(const Ban &b, server->qlBans) { if (! b.haAddress.isV6()) bi << BanInfo(b); } } void MurmurDBus::setBans(const QList &, const QDBusMessage &) { } void MurmurDBus::getPlayerNames(const QList &ids, const QDBusMessage &, QStringList &names) { names.clear(); foreach(int id, ids) { names << server->getUserName(id); } } void MurmurDBus::getPlayerIds(const QStringList &names, const QDBusMessage &, QList &ids) { ids.clear(); foreach(QString name, names) { ids << server->getUserID(name); } } void MurmurDBus::registerPlayer(const QString &name, const QDBusMessage &msg, int &id) { QMap info; info.insert(ServerDB::User_Name, name); id = server->registerUser(info); if (id < 0) { qdbc->send(msg.createErrorReply("net.sourceforge.mumble.Error.playername", "Illegal player name")); return; } } void MurmurDBus::unregisterPlayer(int id, const QDBusMessage &msg) { if (! server->unregisterUser(id)) { qdbc->send(msg.createErrorReply("net.sourceforge.mumble.Error.playerid", "Invalid player id")); return; } } void MurmurDBus::getRegistration(int id, const QDBusMessage &msg, RegisteredPlayer &user) { QMap info = server->getRegistration(id); if (info.isEmpty()) { qdbc->send(msg.createErrorReply("net.sourceforge.mumble.Error.playerid", "Invalid player id")); return; } user.id = id; user.name = info.value(ServerDB::User_Name); user.email = info.value(ServerDB::User_Email); } void MurmurDBus::setRegistration(int id, const QString &name, const QString &email, const QString &pw, const QDBusMessage &msg) { RegisteredPlayer user; user.id = id; user.name = name; user.email = email; user.pw = pw; updateRegistration(user, msg); } void MurmurDBus::updateRegistration(const RegisteredPlayer &user, const QDBusMessage &msg) { QMap info; if (! user.name.isEmpty()) info.insert(ServerDB::User_Name, user.name); if (! user.email.isEmpty()) info.insert(ServerDB::User_Email, user.email); if (! user.pw.isEmpty()) info.insert(ServerDB::User_Password, user.pw); if (info.isEmpty() || !server->setInfo(user.id, info)) { qdbc->send(msg.createErrorReply("net.sourceforge.mumble.Error.playerid", "Invalid player id")); return; } } void MurmurDBus::getTexture(int id, const QDBusMessage &msg, QByteArray &texture) { if (! server->isUserId(id)) { qdbc->send(msg.createErrorReply("net.sourceforge.mumble.Error.playerid", "Invalid player id")); return; } texture = server->getUserTexture(id); } void MurmurDBus::setTexture(int id, const QByteArray &texture, const QDBusMessage &msg) { if (! server->isUserId(id)) { qdbc->send(msg.createErrorReply("net.sourceforge.mumble.Error.playerid", "Invalid player id")); return; } if (! server->setTexture(id, texture)) { qdbc->send(msg.createErrorReply("net.sourceforge.mumble.Error.texture", "Invalid texture")); return; } } void MurmurDBus::getRegisteredPlayers(const QString &filter, QList &users) { users.clear(); QMap l = server->getRegisteredUsers(filter); QMap::const_iterator i; for (i = l.constBegin(); i != l.constEnd(); ++i) { RegisteredPlayer r; r.id = i.key(); r.name = i.value(); users << r; } } void MurmurDBus::verifyPassword(int id, const QString &pw, const QDBusMessage &msg, bool &ok) { QList ids; ids << id; QStringList names; getPlayerNames(ids, msg, names); if ((names.count() != 1) || (names.at(0).isEmpty())) { qdbc->send(msg.createErrorReply("net.sourceforge.mumble.Error.playerid", "Invalid player id")); return; } QString name = names.at(0); int nid = server->authenticate(name, pw); if (nid == id) ok = true; else ok = false; } #ifdef Q_OS_WIN #undef interface #endif void MurmurDBus::setAuthenticator(const QDBusObjectPath &path, bool reentrant, const QDBusMessage &msg) { if (! qsAuthPath.isNull() || ! qsAuthService.isNull()) removeAuthenticator(); server->connectAuthenticator(this); qsAuthPath = path.path(); qsAuthService = msg.service(); QDBusConnectionInterface *interface = qdbc->interface(); QDBusReply names = interface->registeredServiceNames(); if (names.isValid()) { foreach(const QString &name, names.value()) { QDBusReply owner = interface->serviceOwner(name); if (owner.isValid() && (owner.value() != name) && (owner.value() == qsAuthService)) { qsAuthService = name; break; } } } bReentrant = reentrant; server->log(QString("DBus Authenticator set to %1 %2 (%3)").arg(qsAuthService, qsAuthPath, QString::number(reentrant))); } void MurmurDBus::setTemporaryGroups(int channel, int userid, const QStringList &groups, const QDBusMessage &msg) { CHANNEL_SETUP_VAR(channel); server->setTempGroups(userid, 0, cChannel, groups); } PlayerInfo::PlayerInfo(const User *p) { session = p->uiSession; mute = p->bMute; deaf = p->bDeaf; suppressed = p->bSuppress; selfMute = p->bSelfMute; selfDeaf = p->bSelfDeaf; channel = p->cChannel->iId; } PlayerInfoExtended::PlayerInfoExtended(const User *p) : PlayerInfo(p) { id = p->iId; name = p->qsName; const ServerUser *u = static_cast(p); onlinesecs = u->bwr.onlineSeconds(); bytespersec = u->bwr.bandwidth(); } ChannelInfo::ChannelInfo(const Channel *c) { id = c->iId; name = c->qsName; parent = c->cParent ? c->cParent->iId : -1; foreach(Channel *chn, c->qsPermLinks) links << chn->iId; } ACLInfo::ACLInfo(const ChanACL *acl) { applyHere = acl->bApplyHere; applySubs = acl->bApplySubs; inherited = false; playerid = acl->iUserId; group = acl->qsGroup; allow = acl->pAllow; deny = acl->pDeny; } GroupInfo::GroupInfo(const Group *g) : inherited(false) { name = g->qsName; inherit = g->bInherit; inheritable = g->bInheritable; members.clear(); } BanInfo::BanInfo(const Ban &b) { address = ntohl(b.haAddress.hash[3]); bits = b.iMask; } RegisteredPlayer::RegisteredPlayer() { id = -1; } LogEntry::LogEntry() { timestamp = 0; } LogEntry::LogEntry(const ServerDB::LogRecord &r) { timestamp = r.first; txt = r.second; } void MurmurDBus::userStateChanged(const User *p) { emit playerStateChanged(PlayerInfo(p)); } void MurmurDBus::userTextMessage(const User *, const TextMessage &) { // Not implemented for DBus. } void MurmurDBus::userConnected(const User *p) { emit playerConnected(PlayerInfo(p)); } void MurmurDBus::userDisconnected(const User *p) { emit playerDisconnected(PlayerInfo(p)); } void MurmurDBus::channelStateChanged(const Channel *c) { emit channelStateChanged(ChannelInfo(c)); } void MurmurDBus::channelCreated(const Channel *c) { emit channelCreated(ChannelInfo(c)); } void MurmurDBus::channelRemoved(const Channel *c) { emit channelRemoved(ChannelInfo(c)); } MetaDBus::MetaDBus(Meta *m) : QDBusAbstractAdaptor(m) { meta = m; m->connectListener(this); } void MetaDBus::started(Server *s) { new MurmurDBus(s); if (MurmurDBus::qdbc->isConnected()) MurmurDBus::qdbc->registerObject(QString::fromLatin1("/%1").arg(s->iServerNum), s); emit started(s->iServerNum); } void MetaDBus::stopped(Server *s) { emit stopped(s->iServerNum); } void MetaDBus::start(int server_id, const QDBusMessage &msg) { if (meta->qhServers.contains(server_id)) { MurmurDBus::qdbc->send(msg.createErrorReply("net.sourceforge.mumble.Error.booted", "Server already booted")); } else if (! ServerDB::serverExists(server_id)) { MurmurDBus::qdbc->send(msg.createErrorReply("net.sourceforge.mumble.Error.server", "Invalid server id")); } else if (! meta->boot(server_id)) { MurmurDBus::qdbc->send(msg.createErrorReply("net.sourceforge.mumble.Error.bootfail", "Booting server failed")); } } void MetaDBus::stop(int server_id, const QDBusMessage &msg) { if (! meta->qhServers.contains(server_id)) { MurmurDBus::qdbc->send(msg.createErrorReply("net.sourceforge.mumble.Error.booted", "Server not booted")); } else { meta->kill(server_id); } } void MetaDBus::newServer(int &server_id) { server_id = ServerDB::addServer(); } void MetaDBus::deleteServer(int server_id, const QDBusMessage &msg) { if (meta->qhServers.contains(server_id)) { MurmurDBus::qdbc->send(msg.createErrorReply("net.sourceforge.mumble.Error.booted", "Server is running")); } else if (! ServerDB::serverExists(server_id)) { MurmurDBus::qdbc->send(msg.createErrorReply("net.sourceforge.mumble.Error.server", "Invalid server id")); } else { ServerDB::deleteServer(server_id); } } void MetaDBus::getBootedServers(QList &server_list) { server_list = meta->qhServers.keys(); } void MetaDBus::getAllServers(QList &server_list) { server_list = ServerDB::getAllServers(); } void MetaDBus::isBooted(int server_id, bool &booted) { booted = meta->qhServers.contains(server_id); } void MetaDBus::getConf(int server_id, const QString &key, const QDBusMessage &msg, QString &value) { if (! ServerDB::serverExists(server_id)) { MurmurDBus::qdbc->send(msg.createErrorReply("net.sourceforge.mumble.Error.server", "Invalid server id")); } else { if (key == "key" || key == "passphrase") MurmurDBus::qdbc->send(msg.createErrorReply("net.sourceforge.mumble.Error.writeonly", "Requested read of write-only field.")); else value = ServerDB::getConf(server_id, key).toString(); } } void MetaDBus::setConf(int server_id, const QString &key, const QString &value, const QDBusMessage &msg) { if (! ServerDB::serverExists(server_id)) { MurmurDBus::qdbc->send(msg.createErrorReply("net.sourceforge.mumble.Error.server", "Invalid server id")); } else { ServerDB::setConf(server_id, key, value); Server *s = meta->qhServers.value(server_id); if (s) s->setLiveConf(key, value); } } void MetaDBus::getAllConf(int server_id, const QDBusMessage &msg, ConfigMap &values) { if (! ServerDB::serverExists(server_id)) { MurmurDBus::qdbc->send(msg.createErrorReply("net.sourceforge.mumble.Error.server", "Invalid server id")); } else { values = ServerDB::getAllConf(server_id); values.remove("key"); values.remove("passphrase"); } } void MetaDBus::getLog(int server_id, int min_offset, int max_offset, const QDBusMessage &msg, QList &entries) { if (! ServerDB::serverExists(server_id)) { MurmurDBus::qdbc->send(msg.createErrorReply("net.sourceforge.mumble.Error.server", "Invalid server id")); } else { entries.clear(); QList dblog = ServerDB::getLog(server_id, min_offset, max_offset); foreach(const ServerDB::LogRecord &e, dblog) { entries << LogEntry(e); } } } void MetaDBus::getDefaultConf(ConfigMap &values) { values = Meta::mp.qmConfig; values.remove("key"); values.remove("passphrase"); } void MetaDBus::setSuperUserPassword(int server_id, const QString &pw, const QDBusMessage &msg) { if (! ServerDB::serverExists(server_id)) { MurmurDBus::qdbc->send(msg.createErrorReply("net.sourceforge.mumble.Error.server", "Invalid server id")); } else { ServerDB::setSUPW(server_id, pw); } } void MetaDBus::quit() { qCritical("Quit requested from D-Bus"); QCoreApplication::instance()->quit(); } void MetaDBus::getVersion(int &major, int &minor, int &patch, QString &text) { Meta::getVersion(major, minor, patch, text); } mumble-1.3.4/src/murmur/ServerDB.h0000664000175000017500000000523414010707274016611 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MURMUR_DATABASE_H_ #define MUMBLE_MURMUR_DATABASE_H_ #include #include "Timer.h" class Channel; class User; class Connection; class QSqlDatabase; class QSqlQuery; class ServerDB { public: /// A version number that allows us to keep track of changes we make to the DB architecture /// in order to provide backwards compatibility and perform automatic updates of older DBs. /// Whenever you change the DB structure (add a new table, added a new column in a table, etc.) /// you have to increase this version number by one and add the respective "backwards compatibility /// code" into the ServerDB code. static const int DB_STRUCTURE_VERSION = 7; enum ChannelInfo { Channel_Description, Channel_Position, Channel_Max_Users }; enum UserInfo { User_Name, User_Email, User_Comment, User_Hash, User_Password, User_LastActive, User_KDFIterations }; ServerDB(); ~ServerDB(); typedef QPair LogRecord; static Timer tLogClean; static QSqlDatabase *db; static QString qsUpgradeSuffix; static void setSUPW(int iServNum, const QString &pw); static void disableSU(int srvnum); static QList getBootServers(); static QList getAllServers(); static int addServer(); static void deleteServer(int server_id); static bool serverExists(int num); static QMap getAllConf(int server_id); static QVariant getConf(int server_id, const QString &key, QVariant def = QVariant()); static void setConf(int server_id, const QString &key, const QVariant &value = QVariant()); static QList getLog(int server_id, unsigned int offs_min, unsigned int offs_max); static QString getLegacySHA1Hash(const QString &password); static int getLogLen(int server_id); static void wipeLogs(); static bool prepare(QSqlQuery &, const QString &, bool fatal = true, bool warn = true); static bool query(QSqlQuery &, const QString &, bool fatal = true, bool warn = true); static bool exec(QSqlQuery &, const QString &str = QString(), bool fatal= true, bool warn = true); static bool execBatch(QSqlQuery &, const QString &str = QString(), bool fatal= true); // No copy; private declaration without implementation ServerDB(const ServerDB &); private: static void loadOrSetupMetaPBKDF2IterationCount(QSqlQuery &query); static void writeSUPW(int srvnum, const QString &pwHash, const QString &saltHash, const QVariant &kdfIterations); }; #endif mumble-1.3.4/src/murmur/MurmurGRPCImpl.cpp0000664000175000017500000017066614010707274020271 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef Q_MOC_RUN # include #endif #include "murmur_pch.h" #include "Mumble.pb.h" #include "../Message.h" #include "../Group.h" #include "MurmurGRPCImpl.h" #include "ServerDB.h" #include "ServerUser.h" #include "Server.h" #include "Channel.h" #include "Utils.h" #include #include #include "MurmurRPC.proto.Wrapper.cpp" // GRPC system overview // ==================== // // Definitions: // // - Completion queue: a mechanism used for handling asynchronous grpc // requests. Whenever you want to do something with grpc (e.g. accept a // remote call, read/write a message), the completion queue manages that // request for you. // // When you wish to perform an asynchronous action, you provide the // completion queue with a unique "tag". This tag used to identify the // request after it has finished. // // To check the status of asynchronous actions that have been added to the // completion queue, you call its "Next" method. Next returns when there is // a finished action in the completion queue. Next provides two output // variables: the completed action's tag, and a boolean, which indicates if // the action was successful. All tags in this project are are // heap-allocated pointers to "boost::function"s that accept a boolean. // After Next returns, the tag pointer is dereferenced, executed with the // success variable, and then freed. // // - Wrapper class: each RPC method that is defined in the .proto has had a // class generated for it (the generator program is located in scripts/). // Each class provides storage for the incoming and outgoing protocol buffer // message, as well as helper methods for registering events with the // completion queue. Each wrapper class also has an "impl(bool)" method; // each one is implemented in this file. This impl method gets executed when // the particular RPC method gets invoked by an RPC client. // // Each wrapper class extends RPCCall. Among other things, RPCCall provides // reference counting for the object. This is needed for memory management, // as the wrapper objects can be used and stored in several locations (this // is only really true for streaming grpc calls). // // The flow of the grpc system is as follows: // // - GRPCStart() is called from murmur's main(). // - If an address for the grpc has been set in murmur.ini, the grpc service // begins listening on that address for grpc client connections. // - A new thread is created which handles the grpc completion queue (defined // above). This thread continuously calls the completion queue's Next method // to process the next completed event. // - The wrapper classes' "create" methods are executed, which makes them // invokable by grpc clients. // - With the completion queue now running in the background, murmur // continues starting up. // // - When a grpc client invokes an RPC method, the previously mentioned thread // is notified of this and executes the "tag" (recall, tags are pointers to // functions). The wrapper method "impl(bool)" for the corresponding RPC // method ends up being called. It is important to note that this impl // method gets executed in the main thread. This prevents data corruption // of murmur's data structures without the need of locks. // // Additionally, the execution of tags are wrapped with a try-catch. This // try-catch catches any grpc::Status that is thrown. If one is caught, the // status is automatically sent to the grpc client and the invocation of the // current method is stopped. static MurmurRPCImpl *service; void GRPCStart() { const auto &address = meta->mp.qsGRPCAddress; if (address.isEmpty()) { return; } const auto &cert = meta->mp.qsGRPCCert; const auto &key = meta->mp.qsGRPCKey; std::shared_ptr<::grpc::ServerCredentials> credentials; if (cert.isEmpty() || key.isEmpty()) { credentials = ::grpc::InsecureServerCredentials(); } else { ::grpc::SslServerCredentialsOptions options; ::grpc::SslServerCredentialsOptions::PemKeyCertPair pair; { QFile file(cert); if (!file.open(QIODevice::ReadOnly)) { qFatal("could not open gRPC certificate file: %s", cert.toStdString().c_str()); return; } QTextStream stream(&file); auto contents = stream.readAll(); pair.cert_chain = contents.toStdString(); } { QFile file(key); if (!file.open(QIODevice::ReadOnly)) { qFatal("could not open gRPC key file: %s", key.toStdString().c_str()); return; } QTextStream stream(&file); auto contents = stream.readAll(); pair.private_key = contents.toStdString(); } options.pem_key_cert_pairs.push_back(pair); credentials = ::grpc::SslServerCredentials(options); } service = new MurmurRPCImpl(address, credentials); qWarning("GRPC: listening on '%s'", qPrintable(address)); } void GRPCStop() { if (service) { delete service; } } MurmurRPCImpl::MurmurRPCImpl(const QString &address, std::shared_ptr<::grpc::ServerCredentials> credentials) { ::grpc::ServerBuilder builder; builder.AddListeningPort(u8(address), credentials); builder.RegisterService(&m_V1Service); m_completionQueue = builder.AddCompletionQueue(); m_server = builder.BuildAndStart(); meta->connectListener(this); m_isRunning = true; start(); } MurmurRPCImpl::~MurmurRPCImpl() { void *ignored_tag; bool ignored_ok; m_isRunning = false; m_server->Shutdown(std::chrono::system_clock::now()); m_completionQueue->Shutdown(); while (m_completionQueue->Next(&ignored_tag, &ignored_ok)) { if (ignored_tag) { auto op = static_cast *>(ignored_tag); delete op; } } } // ToRPC/FromRPC methods convert data to/from grpc protocol buffer messages. void ToRPC(const ::Server *srv, const ::Channel *c, ::MurmurRPC::Channel *rc) { rc->mutable_server()->set_id(srv->iServerNum); rc->set_id(c->iId); rc->set_name(u8(c->qsName)); if (c->cParent) { rc->mutable_parent()->mutable_server()->set_id(srv->iServerNum); rc->mutable_parent()->set_id(c->cParent->iId); } rc->set_description(u8(c->qsDesc)); rc->set_position(c->iPosition); foreach(::Channel *chn, c->qsPermLinks) { ::MurmurRPC::Channel *linked = rc->add_links(); linked->mutable_server()->set_id(srv->iServerNum); linked->set_id(chn->iId); } rc->set_temporary(c->bTemporary); } void ToRPC(const ::Server *srv, const ::User *u, ::MurmurRPC::User *ru) { ru->mutable_server()->set_id(srv->iServerNum); ru->set_session(u->uiSession); if (u->iId >= 0) { ru->set_id(u->iId); } ru->set_name(u8(u->qsName)); ru->set_mute(u->bMute); ru->set_deaf(u->bDeaf); ru->set_suppress(u->bSuppress); ru->set_recording(u->bRecording); ru->set_priority_speaker(u->bPrioritySpeaker); ru->set_self_mute(u->bSelfMute); ru->set_self_deaf(u->bSelfDeaf); ru->mutable_channel()->mutable_server()->set_id(srv->iServerNum); ru->mutable_channel()->set_id(u->cChannel->iId); ru->set_comment(u8(u->qsComment)); const auto su = static_cast(u); ru->set_online_secs(su->bwr.onlineSeconds()); ru->set_bytes_per_sec(su->bwr.bandwidth()); ru->mutable_version()->set_version(su->uiVersion); ru->mutable_version()->set_release(u8(su->qsRelease)); ru->mutable_version()->set_os(u8(su->qsOS)); ru->mutable_version()->set_os_version(u8(su->qsOSVersion)); ru->set_plugin_identity(u8(su->qsIdentity)); ru->set_plugin_context(su->ssContext); ru->set_idle_secs(su->bwr.idleSeconds()); ru->set_udp_ping_msecs(su->dUDPPingAvg); ru->set_tcp_ping_msecs(su->dTCPPingAvg); ru->set_tcp_only(QAtomicIntLoad(su->aiUdpFlag) == 0); ru->set_address(su->haAddress.toStdString()); } void ToRPC(const ::Server *srv, const QMap &info, const QByteArray &texture, ::MurmurRPC::DatabaseUser *du) { du->mutable_server()->set_id(srv->iServerNum); if (info.contains(::ServerDB::User_Name)) { du->set_name(u8(info[::ServerDB::User_Name])); } if (info.contains(::ServerDB::User_Email)) { du->set_email(u8(info[::ServerDB::User_Email])); } if (info.contains(::ServerDB::User_Comment)) { du->set_comment(u8(info[::ServerDB::User_Comment])); } if (info.contains(::ServerDB::User_Hash)) { du->set_hash(u8(info[::ServerDB::User_Hash])); } if (info.contains(::ServerDB::User_Password)) { du->set_password(u8(info[::ServerDB::User_Password])); } if (info.contains(::ServerDB::User_LastActive)) { du->set_last_active(u8(info[::ServerDB::User_LastActive])); } if (!texture.isNull()) { du->set_texture(texture.constData(), texture.size()); } } void FromRPC(const ::MurmurRPC::DatabaseUser &du, QMap &info) { if (du.has_name()) { info.insert(::ServerDB::User_Name, u8(du.name())); } if (du.has_email()) { info.insert(::ServerDB::User_Email, u8(du.email())); } if (du.has_comment()) { info.insert(::ServerDB::User_Comment, u8(du.comment())); } if (du.has_hash()) { info.insert(::ServerDB::User_Hash, u8(du.hash())); } if (du.has_password()) { info.insert(::ServerDB::User_Password, u8(du.password())); } if (du.has_last_active()) { info.insert(::ServerDB::User_LastActive, u8(du.last_active())); } } void ToRPC(const ::Server *srv, const ::ChanACL *acl, ::MurmurRPC::ACL *ra) { ra->set_apply_here(acl->bApplyHere); ra->set_apply_subs(acl->bApplySubs); ra->set_inherited(false); if (acl->iUserId >= 0) { ra->mutable_user()->mutable_server()->set_id(srv->iServerNum); ra->mutable_user()->set_id(acl->iUserId); } if (!acl->qsGroup.isEmpty()) { ra->mutable_group()->set_name(u8(acl->qsGroup)); } ra->set_allow(MurmurRPC::ACL_Permission(int(acl->pAllow))); ra->set_deny(MurmurRPC::ACL_Permission(int(acl->pDeny))); } void ToRPC(const ::Server *, const ::Group *g, ::MurmurRPC::ACL_Group *rg) { rg->set_name(u8(g->qsName)); rg->set_inherit(g->bInherit); rg->set_inheritable(g->bInheritable); } void ToRPC(const ::Server *srv, const ::Ban &ban, ::MurmurRPC::Ban *rb) { rb->mutable_server()->set_id(srv->iServerNum); rb->set_address(ban.haAddress.toStdString()); rb->set_bits(ban.iMask); rb->set_name(u8(ban.qsUsername)); rb->set_hash(u8(ban.qsHash)); rb->set_reason(u8(ban.qsReason)); rb->set_start(ban.qdtStart.toLocalTime().toTime_t()); rb->set_duration_secs(ban.iDuration); } void FromRPC(const ::Server *, const ::MurmurRPC::Ban &rb, ::Ban &ban) { ban.haAddress = HostAddress(rb.address()); ban.iMask = rb.bits(); ban.qsUsername = u8(rb.name()); ban.qsHash = u8(rb.hash()); ban.qsReason = u8(rb.reason()); ban.qdtStart = QDateTime::fromTime_t(static_cast(rb.start())).toUTC(); ban.iDuration = rb.duration_secs(); } void ToRPC(int serverID, const ::ServerDB::LogRecord &log, ::MurmurRPC::Log *rl) { rl->mutable_server()->set_id(serverID); rl->set_timestamp(log.first); rl->set_text(u8(log.second)); } void ToRPC(const ::Server *srv, const ::User *user, const ::TextMessage &message, ::MurmurRPC::TextMessage *rtm) { rtm->mutable_server()->set_id(srv->iServerNum); rtm->mutable_actor()->mutable_server()->set_id(srv->iServerNum); rtm->mutable_actor()->set_session(user->uiSession); foreach(auto session, message.qlSessions) { auto target = rtm->add_users(); target->mutable_server()->set_id(srv->iServerNum); target->set_session(session); } foreach(auto id, message.qlChannels) { auto target = rtm->add_channels(); target->mutable_server()->set_id(srv->iServerNum); target->set_id(id); } foreach(auto id, message.qlTrees) { auto target = rtm->add_trees(); target->mutable_server()->set_id(srv->iServerNum); target->set_id(id); } rtm->set_text(u8(message.qsText)); } // Sends a meta event to any subscribed listeners. void MurmurRPCImpl::sendMetaEvent(const ::MurmurRPC::Event &e) { auto listeners = m_metaServiceListeners; for (auto i = listeners.constBegin(); i != listeners.constEnd(); ++i) { auto listener = *i; listener->ref(); auto cb = [this, listener] (::MurmurRPC::Wrapper::V1_Events *, bool ok) { if (!ok && m_metaServiceListeners.remove(listener)) { listener->deref(); } listener->deref(); }; listener->write(e, listener->callback(cb)); } } // Called when a server starts. void MurmurRPCImpl::started(::Server *server) { server->connectListener(this); server->connectAuthenticator(this); connect(server, SIGNAL(contextAction(const User *, const QString &, unsigned int, int)), this, SLOT(contextAction(const User *, const QString &, unsigned int, int))); connect(server, SIGNAL(textMessageFilterSig(int &, const User *, MumbleProto::TextMessage &)), this, SLOT(textMessageFilter(int &, const User *, MumbleProto::TextMessage &))); ::MurmurRPC::Event rpcEvent; rpcEvent.set_type(::MurmurRPC::Event_Type_ServerStarted); rpcEvent.mutable_server()->set_id(server->iServerNum); sendMetaEvent(rpcEvent); } // Called when a server stops. void MurmurRPCImpl::stopped(::Server *server) { removeActiveContextActions(server); ::MurmurRPC::Event rpcEvent; rpcEvent.set_type(::MurmurRPC::Event_Type_ServerStopped); rpcEvent.mutable_server()->set_id(server->iServerNum); sendMetaEvent(rpcEvent); } // Removes a connected text message filter. void MurmurRPCImpl::removeTextMessageFilter(const ::Server *s) { auto filter = m_textMessageFilters.value(s->iServerNum); if (!filter) { return; } filter->error(::grpc::Status(::grpc::CANCELLED, "filter detached")); m_textMessageFilters.remove(s->iServerNum); } // Removes a connected authenticator. void MurmurRPCImpl::removeAuthenticator(const ::Server *s) { auto authenticator = m_authenticators.value(s->iServerNum); if (!authenticator) { return; } authenticator->error(::grpc::Status(::grpc::CANCELLED, "authenticator detached")); m_authenticators.remove(s->iServerNum); } // Called when a connecting user needs to be authenticated. void MurmurRPCImpl::authenticateSlot(int &res, QString &uname, int sessionId, const QList &certlist, const QString &certhash, bool certstrong, const QString &pw) { ::Server *s = qobject_cast< ::Server *> (sender()); auto authenticator = RPCCall::Ref<::MurmurRPC::Wrapper::V1_AuthenticatorStream>(m_authenticators.value(s->iServerNum)); if (!authenticator) { return; } auto &request = authenticator->response; request.Clear(); request.mutable_authenticate()->set_name(u8(uname)); if (!pw.isEmpty()) { request.mutable_authenticate()->set_password(u8(pw)); } foreach(const auto &cert, certlist) { auto data = cert.toDer(); request.mutable_authenticate()->add_certificates(data.constData(), data.size()); } if (!certhash.isEmpty()) { request.mutable_authenticate()->set_certificate_hash(u8(certhash)); request.mutable_authenticate()->set_strong_certificate(certstrong); } { QMutexLocker l(&qmAuthenticatorsLock); if (!authenticator->writeRead()) { removeAuthenticator(s); res = -1; return; } } auto &response = authenticator->request; switch (response.authenticate().status()) { case ::MurmurRPC::Authenticator_Response_Status_Success: if (!response.authenticate().has_id()) { res = -3; break; } res = response.authenticate().id(); if (response.authenticate().has_name()) { uname = u8(response.authenticate().name()); } { QStringList qsl; for (int i = 0; i < response.authenticate().groups_size(); i++) { auto &group = response.authenticate().groups(i); if (group.has_name()) { qsl << u8(group.name()); } } if (!qsl.isEmpty()) { s->setTempGroups(res, sessionId, NULL, qsl); } } break; case ::MurmurRPC::Authenticator_Response_Status_TemporaryFailure: res = -3; break; case ::MurmurRPC::Authenticator_Response_Status_Failure: res = -1; break; default: break; } } // Called when a user is being registered on the server. void MurmurRPCImpl::registerUserSlot(int &res, const QMap &info) { ::Server *s = qobject_cast< ::Server *> (sender()); auto authenticator = RPCCall::Ref<::MurmurRPC::Wrapper::V1_AuthenticatorStream>(m_authenticators.value(s->iServerNum)); if (!authenticator) { return; } auto &request = authenticator->response; request.Clear(); ToRPC(s, info, QByteArray(), request.mutable_register_()->mutable_user()); { QMutexLocker l(&qmAuthenticatorsLock); if (!authenticator->writeRead()) { removeAuthenticator(s); return; } } auto &response = authenticator->request; switch (response.register_().status()) { case ::MurmurRPC::Authenticator_Response_Status_Success: if (!response.register_().has_user() || !response.register_().user().has_id()) { res = -1; break; } res = response.register_().user().id(); break; case ::MurmurRPC::Authenticator_Response_Status_Fallthrough: break; default: res = -1; break; } } // Called when a user is being deregistered on the server. void MurmurRPCImpl::unregisterUserSlot(int &res, int id) { ::Server *s = qobject_cast< ::Server *> (sender()); auto authenticator = RPCCall::Ref<::MurmurRPC::Wrapper::V1_AuthenticatorStream>(m_authenticators.value(s->iServerNum)); if (!authenticator) { return; } auto &request = authenticator->response; request.Clear(); request.mutable_deregister()->mutable_user()->mutable_server()->set_id(s->iServerNum); request.mutable_deregister()->mutable_user()->set_id(id); { QMutexLocker l(&qmAuthenticatorsLock); if (!authenticator->writeRead()) { removeAuthenticator(s); return; } } auto &response = authenticator->request; if (response.deregister().status() != ::MurmurRPC::Authenticator_Response_Status_Fallthrough) { res = 0; } } // Called when a list of registered users is requested. void MurmurRPCImpl::getRegisteredUsersSlot(const QString &filter, QMap &res) { ::Server *s = qobject_cast< ::Server *> (sender()); auto authenticator = RPCCall::Ref<::MurmurRPC::Wrapper::V1_AuthenticatorStream>(m_authenticators.value(s->iServerNum)); if (!authenticator) { return; } auto &request = authenticator->response; request.Clear(); if (!filter.isEmpty()) { request.mutable_query()->set_filter(u8(filter)); } { QMutexLocker l(&qmAuthenticatorsLock); if (!authenticator->writeRead()) { removeAuthenticator(s); return; } } auto &response = authenticator->request; for (int i = 0; i < response.query().users_size(); i++) { const auto &user = response.query().users(i); if (!user.has_id() || !user.has_name()) { continue; } res.insert(user.id(), u8(user.name())); } } // Called when information about a registered user is requested. void MurmurRPCImpl::getRegistrationSlot(int &res, int id, QMap &info) { ::Server *s = qobject_cast< ::Server *> (sender()); auto authenticator = RPCCall::Ref<::MurmurRPC::Wrapper::V1_AuthenticatorStream>(m_authenticators.value(s->iServerNum)); if (!authenticator) { return; } auto &request = authenticator->response; request.Clear(); request.mutable_find()->set_id(id); res = -1; { QMutexLocker l(&qmAuthenticatorsLock); if (!authenticator->writeRead()) { removeAuthenticator(s); return; } } auto &response = authenticator->request; if (response.find().has_user()) { FromRPC(response.find().user(), info); res = 1; } } // Called when information about a registered user is being updated. void MurmurRPCImpl::setInfoSlot(int &res, int id, const QMap &info) { ::Server *s = qobject_cast< ::Server *> (sender()); auto authenticator = RPCCall::Ref<::MurmurRPC::Wrapper::V1_AuthenticatorStream>(m_authenticators.value(s->iServerNum)); if (!authenticator) { return; } auto &request = authenticator->response; request.Clear(); request.mutable_update()->mutable_user()->set_id(id); ToRPC(s, info, QByteArray(), request.mutable_update()->mutable_user()); res = 0; { QMutexLocker l(&qmAuthenticatorsLock); if (!authenticator->writeRead()) { removeAuthenticator(s); return; } } auto &response = authenticator->request; switch (response.update().status()) { case ::MurmurRPC::Authenticator_Response_Status_Success: res = 1; break; case ::MurmurRPC::Authenticator_Response_Status_Fallthrough: res = -1; break; default: break; } } // Called when a texture for a registered user is being updated. void MurmurRPCImpl::setTextureSlot(int &res, int id, const QByteArray &texture) { ::Server *s = qobject_cast< ::Server *> (sender()); auto authenticator = RPCCall::Ref<::MurmurRPC::Wrapper::V1_AuthenticatorStream>(m_authenticators.value(s->iServerNum)); if (!authenticator) { return; } auto &request = authenticator->response; request.Clear(); request.mutable_update()->mutable_user()->set_id(id); request.mutable_update()->mutable_user()->set_texture(texture.constData(), texture.size()); { QMutexLocker l(&qmAuthenticatorsLock); if (!authenticator->writeRead()) { removeAuthenticator(s); return; } } auto &response = authenticator->request; if (response.update().status() == ::MurmurRPC::Authenticator_Response_Status_Success) { res = 1; } } // Called when a user name needs to be converted to a user ID. void MurmurRPCImpl::nameToIdSlot(int &res, const QString &name) { ::Server *s = qobject_cast< ::Server *> (sender()); auto authenticator = RPCCall::Ref<::MurmurRPC::Wrapper::V1_AuthenticatorStream>(m_authenticators.value(s->iServerNum)); if (!authenticator) { return; } auto &request = authenticator->response; request.Clear(); request.mutable_find()->set_name(u8(name)); { QMutexLocker l(&qmAuthenticatorsLock); if (!authenticator->writeRead()) { removeAuthenticator(s); return; } } auto &response = authenticator->request; if (response.find().has_user() && response.find().user().has_id()) { res = response.find().user().id(); } } // Called when a user ID needs to be converted to a user name. void MurmurRPCImpl::idToNameSlot(QString &res, int id) { ::Server *s = qobject_cast< ::Server *> (sender()); auto authenticator = RPCCall::Ref<::MurmurRPC::Wrapper::V1_AuthenticatorStream>(m_authenticators.value(s->iServerNum)); if (!authenticator) { return; } auto &request = authenticator->response; request.Clear(); request.mutable_find()->set_id(id); { QMutexLocker l(&qmAuthenticatorsLock); if (!authenticator->writeRead()) { removeAuthenticator(s); return; } } auto &response = authenticator->request; if (response.find().has_user() && response.find().user().has_name()) { res = u8(response.find().user().name()); } } // Called when a texture for a given registered user is requested. void MurmurRPCImpl::idToTextureSlot(QByteArray &res, int id) { ::Server *s = qobject_cast< ::Server *> (sender()); auto authenticator = RPCCall::Ref<::MurmurRPC::Wrapper::V1_AuthenticatorStream>(m_authenticators.value(s->iServerNum)); if (!authenticator) { return; } auto &request = authenticator->response; request.Clear(); request.mutable_find()->set_id(id); { QMutexLocker l(&qmAuthenticatorsLock); if (!authenticator->writeRead()) { removeAuthenticator(s); return; } } auto &response = authenticator->request; if (response.find().has_user() && response.find().user().has_texture()) { const auto &texture = response.find().user().texture(); res = QByteArray(texture.data(), texture.size()); } } // Sends a server event to subscribed listeners. void MurmurRPCImpl::sendServerEvent(const ::Server *s, const ::MurmurRPC::Server_Event &e) { auto listeners = m_serverServiceListeners; auto serverID = s->iServerNum; auto i = listeners.find(serverID); for ( ; i != listeners.end() && i.key() == serverID; ++i) { auto listener = i.value(); listener->ref(); auto cb = [this, listener, serverID] (::MurmurRPC::Wrapper::V1_ServerEvents *, bool ok) { if (!ok && m_serverServiceListeners.remove(serverID, listener) > 0) { listener->deref(); } listener->deref(); }; listener->write(e, listener->callback(cb)); } } // Called when a user's state changes. void MurmurRPCImpl::userStateChanged(const ::User *user) { ::Server *s = qobject_cast< ::Server *> (sender()); ::MurmurRPC::Server_Event event; event.mutable_server()->set_id(s->iServerNum); event.set_type(::MurmurRPC::Server_Event_Type_UserStateChanged); ToRPC(s, user, event.mutable_user()); sendServerEvent(s, event); } // Called when a user sends a text message. void MurmurRPCImpl::userTextMessage(const ::User *user, const ::TextMessage &message) { ::Server *s = qobject_cast< ::Server *> (sender()); ::MurmurRPC::Server_Event event; event.mutable_server()->set_id(s->iServerNum); event.set_type(::MurmurRPC::Server_Event_Type_UserTextMessage); ToRPC(s, user, event.mutable_user()); ToRPC(s, user, message, event.mutable_message()); sendServerEvent(s, event); } // Called when a user successfully connects to a server. void MurmurRPCImpl::userConnected(const ::User *user) { ::Server *s = qobject_cast< ::Server *> (sender()); ::MurmurRPC::Server_Event event; event.mutable_server()->set_id(s->iServerNum); event.set_type(::MurmurRPC::Server_Event_Type_UserConnected); ToRPC(s, user, event.mutable_user()); sendServerEvent(s, event); } // Called when a user disconnects from a server. void MurmurRPCImpl::userDisconnected(const ::User *user) { ::Server *s = qobject_cast< ::Server *> (sender()); removeUserActiveContextActions(s, user); ::MurmurRPC::Server_Event event; event.mutable_server()->set_id(s->iServerNum); event.set_type(::MurmurRPC::Server_Event_Type_UserDisconnected); ToRPC(s, user, event.mutable_user()); sendServerEvent(s, event); } // Called when a channel's state changes. void MurmurRPCImpl::channelStateChanged(const ::Channel *channel) { ::Server *s = qobject_cast< ::Server *> (sender()); ::MurmurRPC::Server_Event event; event.mutable_server()->set_id(s->iServerNum); event.set_type(::MurmurRPC::Server_Event_Type_ChannelStateChanged); ToRPC(s, channel, event.mutable_channel()); sendServerEvent(s, event); } // Called when a channel is created. void MurmurRPCImpl::channelCreated(const ::Channel *channel) { ::Server *s = qobject_cast< ::Server *> (sender()); ::MurmurRPC::Server_Event event; event.mutable_server()->set_id(s->iServerNum); event.set_type(::MurmurRPC::Server_Event_Type_ChannelCreated); ToRPC(s, channel, event.mutable_channel()); sendServerEvent(s, event); } // Called when a channel is removed. void MurmurRPCImpl::channelRemoved(const ::Channel *channel) { ::Server *s = qobject_cast< ::Server *> (sender()); ::MurmurRPC::Server_Event event; event.mutable_server()->set_id(s->iServerNum); event.set_type(::MurmurRPC::Server_Event_Type_ChannelRemoved); ToRPC(s, channel, event.mutable_channel()); sendServerEvent(s, event); } // Called when a user sends a text message. void MurmurRPCImpl::textMessageFilter(int &res, const User *user, MumbleProto::TextMessage &message) { ::Server *s = qobject_cast< ::Server *> (sender()); auto filter = RPCCall::Ref<::MurmurRPC::Wrapper::V1_TextMessageFilter>(m_textMessageFilters.value(s->iServerNum)); if (!filter) { return; } auto &request = filter->response; request.Clear(); request.mutable_server()->set_id(s->iServerNum); auto m = request.mutable_message(); m->mutable_server()->set_id(s->iServerNum); m->mutable_actor()->mutable_server()->set_id(s->iServerNum); m->mutable_actor()->set_session(user->uiSession); for (int i = 0; i < message.session_size(); i++) { auto u = m->add_users(); u->mutable_server()->set_id(s->iServerNum); u->set_session(message.session(i)); } for (int i = 0; i < message.channel_id_size(); i++) { auto c = m->add_channels(); c->mutable_server()->set_id(s->iServerNum); c->set_id(message.channel_id(i)); } for (int i = 0; i < message.tree_id_size(); i++) { auto c = m->add_trees(); c->mutable_server()->set_id(s->iServerNum); c->set_id(message.tree_id(i)); } m->set_text(message.message()); { QMutexLocker l(&qmTextMessageFilterLock); if (!filter->writeRead()) { removeTextMessageFilter(s); return; } } auto &response = filter->request; res = response.action(); switch (response.action()) { case ::MurmurRPC::TextMessage_Filter_Action_Accept: if (response.has_message() && response.message().has_text()) { message.set_message(response.message().text()); } break; default: break; } } // Has the user been sent the given context action? bool MurmurRPCImpl::hasActiveContextAction(const ::Server *s, const ::User *u, const QString &action) { const auto &m = m_activeContextActions; if (!m.contains(s->iServerNum)) { return false; } const auto &n = m.value(s->iServerNum); if (!n.contains(u->uiSession)) { return false; } const auto &o = n.value(u->uiSession); if (!o.contains(action)) { return false; } return true; } // Add the context action to the user's active context actions. void MurmurRPCImpl::addActiveContextAction(const ::Server *s, const ::User *u, const QString &action) { m_activeContextActions[s->iServerNum][u->uiSession].insert(action); } // Remove the context action to the user's active context actions. void MurmurRPCImpl::removeActiveContextAction(const ::Server *s, const ::User *u, const QString &action) { auto &m = m_activeContextActions; if (!m.contains(s->iServerNum)) { return; } auto &n = m[s->iServerNum]; if (!n.contains(u->uiSession)) { return; } auto &o = n[u->uiSession]; o.remove(action); } // Remove all of the user's active context actions. void MurmurRPCImpl::removeUserActiveContextActions(const ::Server *s, const ::User *u) { auto &m = m_activeContextActions; if (m.contains(s->iServerNum)) { m[s->iServerNum].remove(u->uiSession); } } // Remove all of the server's active context actions. void MurmurRPCImpl::removeActiveContextActions(const ::Server *s) { auto &m = m_activeContextActions; if (m.contains(s->iServerNum)) { m.remove(s->iServerNum); } } // Called when a context action event is triggered. void MurmurRPCImpl::contextAction(const ::User *user, const QString &action, unsigned int session, int channel) { ::Server *s = qobject_cast< ::Server *> (sender()); if (!hasActiveContextAction(s, user, action)) { return; } ::MurmurRPC::ContextAction ca; ca.mutable_server()->set_id(s->iServerNum); ca.mutable_actor()->mutable_server()->set_id(s->iServerNum); ca.mutable_actor()->set_session(user->uiSession); ca.set_action(u8(action)); if (session > 0) { ca.mutable_user()->mutable_server()->set_id(s->iServerNum); ca.mutable_user()->set_session(session); } if (channel >= 0) { ca.mutable_channel()->mutable_server()->set_id(s->iServerNum); ca.mutable_channel()->set_id(channel); } auto serverID = s->iServerNum; auto listeners = this->m_contextActionListeners.value(serverID); auto i = listeners.find(action); for ( ; i != listeners.end() && i.key() == action; ++i) { auto listener = i.value(); listener->ref(); auto cb = [this, listener, serverID, action] (::MurmurRPC::Wrapper::V1_ContextActionEvents *, bool ok) { if (!ok && m_contextActionListeners[serverID].remove(action, listener) > 0) { listener->deref(); } listener->deref(); }; listener->write(ca, listener->callback(cb)); } } // *Must* functions return the requested value, or throw a ::grpc::Status // exception. ::ServerUser *MustUser(const Server *server, unsigned int session) { auto user = server->qhUsers.value(session); if (!user || user->sState != ServerUser::Authenticated) { throw ::grpc::Status(::grpc::NOT_FOUND, "invalid user"); } return user; } template ::ServerUser *MustUser(const ::Server *server, const T &msg) { if (!msg.has_user()) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "missing user"); } return MustUser(server, msg.user().session()); } template <> ::ServerUser *MustUser(const Server *server, const ::MurmurRPC::User &msg) { if (!msg.has_session()) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "missing user session"); } return MustUser(server, msg.session()); } ::Server *MustServer(unsigned int id) { auto server = meta->qhServers.value(id); if (!server) { throw ::grpc::Status(::grpc::NOT_FOUND, "invalid server"); } return server; } ::Server *MustServer(int id) { auto server = meta->qhServers.value(id); if (!server) { throw ::grpc::Status(::grpc::NOT_FOUND, "invalid server"); } return server; } template ::Server *MustServer(const T &msg) { if (!msg.has_server()) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "missing server"); } if (!msg.server().has_id()) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "missing server id"); } return MustServer(msg.server().id()); } template <> ::Server *MustServer(const ::MurmurRPC::Server &msg) { if (!msg.has_id()) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "missing server id"); } return MustServer(msg.id()); } template int MustServerID(const T &msg) { if (!msg.has_server()) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "missing server"); } if (!msg.server().has_id()) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "missing server id"); } auto id = msg.server().id(); if (!ServerDB::serverExists(id)) { throw ::grpc::Status(::grpc::NOT_FOUND, "invalid server id"); } return id; } int MustServerID(const ::MurmurRPC::Server &msg) { if (!msg.has_id()) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "missing server id"); } auto id = msg.id(); if (!ServerDB::serverExists(id)) { throw ::grpc::Status(::grpc::NOT_FOUND, "invalid server id"); } return id; } ::Channel *MustChannel(const Server *server, int channel_id) { auto channel = server->qhChannels.value(channel_id); if (!channel) { throw ::grpc::Status(::grpc::NOT_FOUND, "invalid channel"); } return channel; } ::Channel *MustChannel(const Server *server, unsigned int channel_id) { auto channel = server->qhChannels.value(channel_id); if (!channel) { throw ::grpc::Status(::grpc::NOT_FOUND, "invalid channel"); } return channel; } template ::Channel *MustChannel(const Server *server, const T &msg) { if (!msg.has_channel()) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "missing channel"); } return MustChannel(server, msg.channel()); } template <> ::Channel *MustChannel(const Server *server, const ::MurmurRPC::Channel &msg) { if (!msg.has_id()) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "missing channel id"); } return MustChannel(server, msg.id()); } // Qt event listener for RPCExecEvents. void MurmurRPCImpl::customEvent(QEvent *evt) { if (evt->type() == EXEC_QEVENT) { auto event = static_cast(evt); try { event->execute(); } catch (::grpc::Status &ex) { event->call->error(ex); } } } // QThread::run() implementation that runs the grpc event loop and executes // tags as callback functions. void MurmurRPCImpl::run() { MurmurRPC::Wrapper::V1_Init(this, &m_V1Service); while (m_isRunning) { void *tag; bool ok; if (!m_completionQueue->Next(&tag, &ok)) { break; } if (tag != nullptr) { auto op = static_cast *>(tag); (*op)(ok); delete op; } } // TODO(grpc): cleanup allocated memory? not super important, because murmur // should be exiting now. } // The Wrapper implementation methods are below. Implementation methods are // executed in the main thread when its corresponding grpc method is invoked. // // Since the grpc asynchronous API is used, the implementation methods below // do not have to complete the call during the lifetime of the method (although // this is only used for streaming calls). namespace MurmurRPC { namespace Wrapper { void V1_ServerCreate::impl(bool) { auto id = ServerDB::addServer(); ::MurmurRPC::Server rpcServer; rpcServer.set_id(id); end(rpcServer); } void V1_ServerQuery::impl(bool) { ::MurmurRPC::Server_List list; foreach(int id, ServerDB::getAllServers()) { auto rpcServer = list.add_servers(); rpcServer->set_id(id); try { auto server = MustServer(id); rpcServer->set_running(true); rpcServer->mutable_uptime()->set_secs(server->tUptime.elapsed()/1000000LL); } catch (::grpc::Status &ex) { } } end(list); } void V1_ServerGet::impl(bool) { auto serverID = MustServerID(request); ::MurmurRPC::Server rpcServer; rpcServer.set_id(serverID); rpcServer.set_running(false); try { auto server = MustServer(serverID); rpcServer.set_running(true); rpcServer.mutable_uptime()->set_secs(server->tUptime.elapsed()/1000000LL); } catch (::grpc::Status &ex) { } end(rpcServer); } void V1_ServerStart::impl(bool) { auto serverID = MustServerID(request); if (!meta->boot(serverID)) { throw ::grpc::Status(::grpc::UNKNOWN, "server could not be started, or is already started"); } end(); } void V1_ServerStop::impl(bool) { auto server = MustServer(request); meta->kill(server->iServerNum); end(); } void V1_ServerRemove::impl(bool) { auto serverID = MustServerID(request); if (meta->qhServers.value(serverID)) { throw ::grpc::Status(::grpc::FAILED_PRECONDITION, "cannot remove started server"); } ServerDB::deleteServer(serverID); end(); } void V1_ServerEvents::impl(bool) { auto server = MustServer(request); rpc->m_serverServiceListeners.insert(server->iServerNum, this); } void V1_ServerEvents::done(bool) { auto &ssls = rpc->m_serverServiceListeners; auto i = std::find(ssls.begin(), ssls.end(), this); if (i != ssls.end()) { ssls.erase(i); } deref(); } void V1_GetUptime::impl(bool) { ::MurmurRPC::Uptime uptime; uptime.set_secs(meta->tUptime.elapsed()/1000000LL); end(uptime); } void V1_GetVersion::impl(bool) { ::MurmurRPC::Version version; int major, minor, patch; QString release; Meta::getVersion(major, minor, patch, release); version.set_version(major << 16 | minor << 8 | patch); version.set_release(u8(release)); end(version); } void V1_Events::impl(bool) { rpc->m_metaServiceListeners.insert(this); } void V1_Events::done(bool) { auto &msls = rpc->m_metaServiceListeners; auto i = std::find(msls.begin(), msls.end(), this); if (i != msls.end()) { msls.erase(i); } deref(); } void V1_ContextActionAdd::impl(bool) { auto server = MustServer(request); auto user = MustUser(server, request); if (!request.has_action()) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "missing action"); } if (!request.has_text()) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "missing text"); } if (!request.has_context()) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "missing context"); } rpc->addActiveContextAction(server, user, u8(request.action())); ::MumbleProto::ContextActionModify mpcam; mpcam.set_action(request.action()); mpcam.set_text(request.text()); mpcam.set_context(request.context()); mpcam.set_operation(::MumbleProto::ContextActionModify_Operation_Add); server->sendMessage(user, mpcam); end(); } void V1_ContextActionRemove::impl(bool) { auto server = MustServer(request); if (!request.has_action()) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "missing action"); } auto action = u8(request.action()); ::MumbleProto::ContextActionModify mpcam; mpcam.set_action(request.action()); mpcam.set_operation(::MumbleProto::ContextActionModify_Operation_Remove); if (request.has_user()) { // Remove context action from specific user auto user = MustUser(server, request); rpc->removeActiveContextAction(server, user, action); server->sendMessage(user, mpcam); } else { // Remove context action from all users foreach(::ServerUser *user, server->qhUsers) { if (user->sState != ServerUser::Authenticated) { continue; } rpc->removeActiveContextAction(server, user, action); server->sendMessage(user, mpcam); } } end(); } void V1_ContextActionEvents::impl(bool) { auto server = MustServer(request); if (!request.has_action()) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "missing action"); } rpc->m_contextActionListeners[server->iServerNum].insert(u8(request.action()), this); } void V1_ContextActionEvents::done(bool) { auto server = MustServer(request); auto &cals = rpc->m_contextActionListeners; auto &scals = cals[server->iServerNum]; auto i = std::find(scals.begin(), scals.end(), this); if (i != scals.end()) { scals.erase(i); } deref(); if (scals.isEmpty()) { auto i = std::find(cals.begin(), cals.end(), scals); if (i != cals.end()) { cals.erase(i); } } } void V1_TextMessageSend::impl(bool) { auto server = MustServer(request); ::MumbleProto::TextMessage tm; tm.set_message(request.text()); if (request.has_actor() && request.actor().has_session()) { tm.set_actor(request.actor().session()); } for (int i = 0; i < request.users_size(); i++) { if (request.users(i).has_session()) { tm.add_session(request.users(i).session()); } } for (int i = 0; i < request.channels_size(); i++) { if (request.channels(i).has_id()) { tm.add_channel_id(request.channels(i).id()); } } for (int i = 0; i < request.trees_size(); i++) { if (request.trees(i).has_id()) { tm.add_tree_id(request.trees(i).id()); } } server->sendTextMessageGRPC(tm); end(); } void V1_TextMessageFilter::impl(bool) { auto onInitialize = [this] (V1_TextMessageFilter *, bool ok) { if (!ok) { finish(ok); return; } auto server = MustServer(request); QMutexLocker l(&rpc->qmTextMessageFilterLock); rpc->removeTextMessageFilter(server); rpc->m_textMessageFilters.insert(server->iServerNum, this); }; stream.Read(&request, callback(onInitialize)); } void V1_TextMessageFilter::done(bool) { auto server = MustServer(request); auto filter = rpc->m_textMessageFilters.value(server->iServerNum); if (filter == this) { rpc->m_textMessageFilters.remove(server->iServerNum); } deref(); } void V1_LogQuery::impl(bool) { auto serverID = MustServerID(request); int total = ::ServerDB::getLogLen(serverID); if (total < 0) { throw ::grpc::Status(::grpc::StatusCode::UNAVAILABLE, "could not access database"); } ::MurmurRPC::Log_List list; list.mutable_server()->set_id(serverID); list.set_total(total); if (!request.has_min() || !request.has_max()) { end(list); return; } list.set_min(request.min()); list.set_max(request.max()); auto dblog = ::ServerDB::getLog(serverID, request.min(), request.max()); foreach(const ::ServerDB::LogRecord &record, dblog) { auto rpcLog = list.add_entries(); ToRPC(serverID, record, rpcLog); } end(list); } void V1_ConfigGet::impl(bool) { auto serverID = MustServerID(request); auto config = ServerDB::getAllConf(serverID); ::MurmurRPC::Config rpcConfig; rpcConfig.mutable_server()->set_id(serverID); auto &fields = *rpcConfig.mutable_fields(); for (auto i = config.constBegin(); i != config.constEnd(); ++i) { fields[u8(i.key())] = u8(i.value()); } end(rpcConfig); } void V1_ConfigGetField::impl(bool) { auto serverID = MustServerID(request); if (!request.has_key()) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "missing key"); } ::MurmurRPC::Config_Field rpcField; rpcField.mutable_server()->set_id(serverID); rpcField.set_key(request.key()); rpcField.set_value(u8(ServerDB::getConf(serverID, u8(request.key()), QVariant()).toString())); end(rpcField); } void V1_ConfigSetField::impl(bool) { auto serverID = MustServerID(request); if (!request.has_key()) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "missing key"); } QString key = u8(request.key()); QString value; if (request.has_value()) { value = u8(request.value()); } ServerDB::setConf(serverID, key, value); try { auto server = MustServer(serverID); server->setLiveConf(key, value); } catch (::grpc::Status &ex) { } end(); } void V1_ConfigGetDefault::impl(bool) { ::MurmurRPC::Config rpcConfig; auto &fields = *rpcConfig.mutable_fields(); for (auto i = meta->mp.qmConfig.constBegin(); i != meta->mp.qmConfig.constEnd(); ++i) { fields[u8(i.key())] = u8(i.value()); } end(rpcConfig); } void V1_ChannelQuery::impl(bool) { auto server = MustServer(request); ::MurmurRPC::Channel_List list; list.mutable_server()->set_id(server->iServerNum); foreach(const ::Channel *channel, server->qhChannels) { auto rpcChannel = list.add_channels(); ToRPC(server, channel, rpcChannel); } end(list); } void V1_ChannelGet::impl(bool) { auto server = MustServer(request); auto channel = MustChannel(server, request); ::MurmurRPC::Channel rpcChannel; ToRPC(server, channel, &rpcChannel); end(rpcChannel); } void V1_ChannelAdd::impl(bool) { auto server = MustServer(request); if (!request.has_parent() || !request.has_name()) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "parent channel and name required"); } ::Channel *parent; try { parent = MustChannel(server, request.parent()); } catch (::grpc::Status &ex) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "invalid parent channel"); } if (!server->canNest(parent)) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "cannot nest channel in given parent"); } QString qsName = u8(request.name()); ::Channel *nc; { QWriteLocker wl(&server->qrwlVoiceThread); nc = server->addChannel(parent, qsName, request.temporary(), request.position()); } nc->qsDesc = u8(request.description()); server->updateChannel(nc); int newid = nc->iId; ::MumbleProto::ChannelState mpcs; mpcs.set_channel_id(newid); mpcs.set_parent(parent->iId); mpcs.set_name(request.name()); mpcs.set_temporary(request.temporary()); mpcs.set_position(request.position()); mpcs.set_description(request.description()); server->sendAll(mpcs); ::MurmurRPC::Channel resChannel; ToRPC(server, nc, &resChannel); end(resChannel); } void V1_ChannelRemove::impl(bool) { auto server = MustServer(request); auto channel = MustChannel(server, request); if (!channel->cParent) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "cannot remove the root channel"); } server->removeChannel(channel); end(); } void V1_ChannelUpdate::impl(bool) { auto server = MustServer(request); auto channel = MustChannel(server, request); ::MumbleProto::ChannelState mpcs; mpcs.set_channel_id(channel->iId); for (int i = 0; i < request.links_size(); i++) { if (!request.links(i).has_id()) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "invalid channel link"); } mpcs.add_links(request.links(i).id()); } if (request.has_parent()) { if (!request.parent().has_id()) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "invalid channel parent"); } mpcs.set_parent(request.parent().id()); } if (request.has_name()) { mpcs.set_name(request.name()); } if (request.has_position()) { mpcs.set_position(request.position()); } if (request.has_description()) { mpcs.set_description(request.description()); } QString err; if (!server->setChannelStateGRPC(mpcs, err)) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, u8(err)); } ::MurmurRPC::Channel rpcChannel; ToRPC(server, channel, &rpcChannel); end(rpcChannel); } void V1_UserQuery::impl(bool) { auto server = MustServer(request); ::MurmurRPC::User_List list; list.mutable_server()->set_id(server->iServerNum); foreach(const ::ServerUser *user, server->qhUsers) { if (user->sState != ServerUser::Authenticated) { continue; } auto rpcUser = list.add_users(); ToRPC(server, user, rpcUser); } end(list); } void V1_UserGet::impl(bool) { auto server = MustServer(request); ::MurmurRPC::User rpcUser; if (request.has_session()) { // Lookup user by session auto user = MustUser(server, request); ToRPC(server, user, &rpcUser); end(rpcUser); return; } else if (request.has_name()) { // Lookup user by name QString qsName = u8(request.name()); foreach(const ::ServerUser *user, server->qhUsers) { if (user->sState != ServerUser::Authenticated) { continue; } if (user->qsName == qsName) { ToRPC(server, user, &rpcUser); end(rpcUser); return; } } throw ::grpc::Status(::grpc::NOT_FOUND, "invalid user"); } throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "session or name required"); } void V1_UserUpdate::impl(bool) { auto server = MustServer(request); auto user = MustUser(server, request); auto channel = user->cChannel; if (request.has_channel()) { channel = MustChannel(server, request.channel()); } auto mute = user->bMute; if (request.has_mute()) { mute = request.mute(); } auto deaf = user->bDeaf; if (request.has_deaf()) { deaf = request.deaf(); } auto suppress = user->bSuppress; if (request.has_suppress()) { suppress = request.suppress(); } auto prioritySpeaker = user->bPrioritySpeaker; if (request.has_priority_speaker()) { prioritySpeaker = request.priority_speaker(); } auto name = user->qsName; if (request.has_name()) { name = u8(request.name()); } auto comment = user->qsComment; if (request.has_comment()) { comment = u8(request.comment()); } server->setUserState(user, channel, mute, deaf, suppress, prioritySpeaker, name, comment); ::MurmurRPC::User rpcUser; ToRPC(server, user, &rpcUser); end(rpcUser); } void V1_UserKick::impl(bool) { auto server = MustServer(request); auto user = MustUser(server, request); ::MumbleProto::UserRemove mpur; mpur.set_session(user->uiSession); if (request.has_reason()) { mpur.set_reason(request.reason()); } if (request.has_actor() && request.actor().has_session()) { mpur.set_actor(request.actor().session()); } server->sendAll(mpur); user->disconnectSocket(); end(); } void V1_TreeQuery::impl(bool) { auto server = MustServer(request); auto channel = MustChannel(server, 0); ::MurmurRPC::Tree root; QQueue< QPair > qQueue; qQueue.enqueue(qMakePair(channel, &root)); while (!qQueue.isEmpty()) { auto current = qQueue.dequeue(); auto currentChannel = current.first; auto currentTree = current.second; ToRPC(server, currentChannel, currentTree->mutable_channel()); QList< ::User *> users = currentChannel->qlUsers; qSort(users.begin(), users.end(), [] (const ::User *a, const ::User *b) -> bool { return ::User::lessThan(a, b); }); foreach(const ::User *u, users) { auto rpcUser = currentTree->add_users(); ToRPC(server, u, rpcUser); } QList< ::Channel *> channels = currentChannel->qlChannels; qSort(channels.begin(), channels.end(), [] (const ::Channel *a, const ::Channel *b) -> bool { return ::Channel::lessThan(a, b); }); foreach(const ::Channel *subChannel, channels) { auto subTree = currentTree->add_children(); qQueue.enqueue(qMakePair(subChannel, subTree)); } } end(root); } void V1_BansGet::impl(bool) { auto server = MustServer(request); ::MurmurRPC::Ban_List list; list.mutable_server()->set_id(server->iServerNum); foreach(const ::Ban &ban, server->qlBans) { auto rpcBan = list.add_bans(); ToRPC(server, ban, rpcBan); } end(list); } void V1_BansSet::impl(bool) { auto server = MustServer(request); server->qlBans.clear(); for (int i = 0; i < request.bans_size(); i++) { const auto &rpcBan = request.bans(i); ::Ban ban; FromRPC(server, rpcBan, ban); server->qlBans << ban; } server->saveBans(); end(); } void V1_ACLGet::impl(bool) { auto server = MustServer(request); auto channel = MustChannel(server, request); ::MurmurRPC::ACL_List list; list.set_inherit(channel->bInheritACL); QStack< ::Channel *> chans; ChanACL *acl; ::Channel *p = channel; while (p) { chans.push(p); if ((p == channel) || p->bInheritACL) { p = p->cParent; } else { p = NULL; } } while (!chans.isEmpty()) { p = chans.pop(); foreach(acl, p->qlACL) { if (p == channel || acl->bApplySubs) { auto rpcACL = list.add_acls(); ToRPC(server, acl, rpcACL); if (p != channel) { rpcACL->set_inherited(true); } } } } p = channel->cParent; const QSet allnames = ::Group::groupNames(channel); foreach(const QString &name, allnames) { ::Group *g = channel->qhGroups.value(name); ::Group *pg = p ? ::Group::getGroup(p, name) : NULL; if (!g && ! pg) { continue; } auto aclGroup = list.add_groups(); ToRPC(server, g ? g : pg, aclGroup); QSet members; if (pg) { members = pg->members(); } if (g) { foreach(auto id, g->qsAdd) { auto rpcUser = aclGroup->add_users_add(); rpcUser->mutable_server()->set_id(server->iServerNum); rpcUser->set_id(id); } foreach(auto id, g->qsRemove) { auto rpcUser = aclGroup->add_users_remove(); rpcUser->mutable_server()->set_id(server->iServerNum); rpcUser->set_id(id); } aclGroup->set_inherited(false); members += g->qsAdd; members -= g->qsRemove; } else { aclGroup->set_inherited(true); } foreach(auto id, members) { auto rpcUser = aclGroup->add_users(); rpcUser->mutable_server()->set_id(server->iServerNum); rpcUser->set_id(id); } } end(list); } void V1_ACLSet::impl(bool) { auto server = MustServer(request); auto channel = MustChannel(server, request); ::Group *g; ::ChanACL *acl; { QWriteLocker wl(&server->qrwlVoiceThread); QHash > hOldTemp; foreach(g, channel->qhGroups) { hOldTemp.insert(g->qsName, g->qsTemporary); delete g; } foreach(acl, channel->qlACL) { delete acl; } channel->qhGroups.clear(); channel->qlACL.clear(); channel->bInheritACL = request.inherit(); for (int i = 0; i < request.groups_size(); i++) { auto &rpcGroup = request.groups(i); auto name = u8(rpcGroup.name()); g = new ::Group(channel, name); g->bInherit = rpcGroup.inherit(); g->bInheritable = rpcGroup.inheritable(); for (int j = 0; j < rpcGroup.users_add_size(); j++) { g->qsAdd.insert(rpcGroup.users_add(j).id()); } for (int j = 0; j < rpcGroup.users_remove_size(); j++) { g->qsRemove.insert(rpcGroup.users_remove(j).id()); } g->qsTemporary = hOldTemp.value(name); } for (int i = 0; i < request.acls_size(); i++) { auto &rpcACL = request.acls(i); acl = new ChanACL(channel); acl->bApplyHere = rpcACL.apply_here(); acl->bApplySubs = rpcACL.apply_subs(); if (rpcACL.has_user()) { acl->iUserId = rpcACL.user().id(); } if (rpcACL.has_group() && rpcACL.group().has_name()) { acl->qsGroup = u8(rpcACL.group().name()); } acl->pDeny = static_cast(rpcACL.deny()) & ChanACL::All; acl->pAllow = static_cast(rpcACL.allow()) & ChanACL::All; } } server->clearACLCache(); server->updateChannel(channel); end(); } void V1_ACLGetEffectivePermissions::impl(bool) { auto server = MustServer(request); auto user = MustUser(server, request); auto channel = MustChannel(server, request); auto flags = int(server->effectivePermissions(user, channel)); ::MurmurRPC::ACL rpcACL; rpcACL.set_allow(::MurmurRPC::ACL_Permission(flags)); end(rpcACL); } void V1_ACLAddTemporaryGroup::impl(bool) { auto server = MustServer(request); auto user = MustUser(server, request); auto channel = MustChannel(server, request); if (!request.has_name()) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "missing name"); } QString qsgroup = u8(request.name()); if (qsgroup.isEmpty()) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "empty name"); } { QWriteLocker wl(&server->qrwlVoiceThread); ::Group *g = channel->qhGroups.value(qsgroup); if (!g) { g = new ::Group(channel, qsgroup); } g->qsTemporary.insert(-user->uiSession); } server->clearACLCache(user); end(); } void V1_ACLRemoveTemporaryGroup::impl(bool) { auto server = MustServer(request); auto user = MustUser(server, request); auto channel = MustChannel(server, request); if (!request.has_name()) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "missing name"); } QString qsgroup = u8(request.name()); if (qsgroup.isEmpty()) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "empty name"); } { QWriteLocker wl(&server->qrwlVoiceThread); ::Group *g = channel->qhGroups.value(qsgroup); if (!g) { g = new ::Group(channel, qsgroup); } g->qsTemporary.remove(-user->uiSession); } server->clearACLCache(user); end(); } void V1_AuthenticatorStream::impl(bool) { auto onInitialize = [this] (V1_AuthenticatorStream *, bool ok) { if (!ok) { finish(ok); return; } if (!request.has_initialize()) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "missing initialize"); } auto server = MustServer(request.initialize()); QMutexLocker l(&rpc->qmAuthenticatorsLock); rpc->removeAuthenticator(server); rpc->m_authenticators.insert(server->iServerNum, this); }; stream.Read(&request, callback(onInitialize)); } void V1_AuthenticatorStream::done(bool) { auto i = std::find(rpc->m_authenticators.begin(), rpc->m_authenticators.end(), this); if (i != rpc->m_authenticators.end()) { rpc->m_authenticators.erase(i); } deref(); } void V1_DatabaseUserQuery::impl(bool) { auto server = MustServer(request); QString filter; if (request.has_filter()) { filter = u8(request.filter()); } auto users = server->getRegisteredUsers(filter); ::MurmurRPC::DatabaseUser_List list; list.mutable_server()->set_id(server->iServerNum); for (auto itr = users.constBegin(); itr != users.constEnd(); ++itr) { auto user = list.add_users(); user->mutable_server()->set_id(server->iServerNum); user->set_id(itr.key()); user->set_name(u8(itr.value())); } end(list); } void V1_DatabaseUserGet::impl(bool) { auto server = MustServer(request); if (!request.has_id()) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "missing id"); } auto info = server->getRegistration(request.id()); if (info.isEmpty()) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "invalid user"); } auto texture = server->getUserTexture(request.id()); ::MurmurRPC::DatabaseUser rpcDatabaseUser; ToRPC(server, info, texture, &rpcDatabaseUser); end(rpcDatabaseUser); } void V1_DatabaseUserUpdate::impl(bool) { auto server = MustServer(request); if (!request.has_id()) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "missing id"); } if (!server->isUserId(request.id())) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "invalid user"); } QMap info; FromRPC(request, info); if (!server->setInfo(request.id(), info)) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "invalid user"); } if (request.has_texture()) { server->setTexture(request.id(), QByteArray(request.texture().c_str(), request.texture().size())); } if (info.contains(ServerDB::User_Name) || info.contains(ServerDB::User_Comment)) { foreach(::ServerUser *u, server->qhUsers) { if (static_cast(u->iId) == request.id()) { QString name = u->qsName; QString comment = u->qsComment; if (info.contains(ServerDB::User_Name)) { name = info.value(ServerDB::User_Name); } if (info.contains(ServerDB::User_Comment)) { comment = info.value(ServerDB::User_Comment); } server->setUserState(u, u->cChannel, u->bMute, u->bDeaf, u->bSuppress, u->bPrioritySpeaker, name, comment); break; } } } end(); } void V1_DatabaseUserRegister::impl(bool) { auto server = MustServer(request); QMap info; FromRPC(request, info); auto userid = server->registerUser(info); if (userid < 0) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "invalid user"); } QByteArray texture; if (request.has_texture()) { texture = QByteArray(request.texture().c_str(), request.texture().size()); server->setTexture(request.id(), texture); } ::MurmurRPC::DatabaseUser rpcDatabaseUser; rpcDatabaseUser.set_id(userid); ToRPC(server, info, texture, &rpcDatabaseUser); end(rpcDatabaseUser); } void V1_DatabaseUserDeregister::impl(bool) { auto server = MustServer(request); if (!request.has_id()) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "missing id"); } if (!server->unregisterUser(request.id())) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "invalid user"); } end(); } void V1_DatabaseUserVerify::impl(bool) { auto server = MustServer(request); if (!request.has_name()) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "missing name"); } if (!request.has_password()) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "missing password"); } auto name = u8(request.name()); auto password = u8(request.password()); auto ret = server->authenticate(name, password); switch (ret) { case -1: throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "invalid username and/or password"); case -2: throw ::grpc::Status(::grpc::NOT_FOUND, "unknown user"); case -3: throw ::grpc::Status(::grpc::UNAVAILABLE, "authenticator temporarily unavailable"); } ::MurmurRPC::DatabaseUser rpcDatabaseUser; rpcDatabaseUser.mutable_server()->set_id(server->iServerNum); rpcDatabaseUser.set_id(ret); end(rpcDatabaseUser); } void V1_RedirectWhisperGroupAdd::impl(bool) { auto server = MustServer(request); auto user = MustUser(server, request); if (!request.source().has_name()) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "missing source name"); } if (!request.target().has_name()) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "missing target name"); } QString qssource = u8(request.source().name()); QString qstarget = u8(request.target().name()); { QWriteLocker wl(&server->qrwlVoiceThread); user->qmWhisperRedirect.insert(qssource, qstarget); } server->clearACLCache(user); end(); } void V1_RedirectWhisperGroupRemove::impl(bool) { auto server = MustServer(request); auto user = MustUser(server, request); if (!request.source().has_name()) { throw ::grpc::Status(::grpc::INVALID_ARGUMENT, "missing source name"); } QString qssource = u8(request.source().name()); { QWriteLocker wl(&server->qrwlVoiceThread); user->qmWhisperRedirect.remove(qssource); } server->clearACLCache(user); end(); } } } mumble-1.3.4/src/murmur/MurmurIce.h0000664000175000017500000000744514010707274017053 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifdef USE_ICE #ifndef MUMBLE_MURMUR_MURMURICE_H_ #define MUMBLE_MURMUR_MURMURICE_H_ #include #include #include #include #include #include #include "MurmurI.h" class Channel; class Server; class User; struct TextMessage; class MurmurIce : public QObject { friend class MurmurLocker; Q_OBJECT; protected: int count; QMutex qmEvent; QWaitCondition qwcEvent; void customEvent(QEvent *evt); void badMetaProxy(const ::Murmur::MetaCallbackPrx &prx); void badServerProxy(const ::Murmur::ServerCallbackPrx &prx, const ::Server* server); void badAuthenticator(::Server *); QList< ::Murmur::MetaCallbackPrx> qlMetaCallbacks; QMap > qmServerCallbacks; QMap > > qmServerContextCallbacks; QMap qmServerAuthenticator; QMap qmServerUpdatingAuthenticator; public: Ice::CommunicatorPtr communicator; Ice::ObjectAdapterPtr adapter; MurmurIce(); ~MurmurIce(); void addMetaCallback(const ::Murmur::MetaCallbackPrx& prx); void removeMetaCallback(const ::Murmur::MetaCallbackPrx& prx); void addServerCallback(const ::Server* server, const ::Murmur::ServerCallbackPrx& prx); void removeServerCallback(const ::Server* server, const ::Murmur::ServerCallbackPrx& prx); void removeServerCallbacks(const ::Server* server); void addServerContextCallback(const ::Server* server, int session_id, const QString& action, const ::Murmur::ServerContextCallbackPrx& prx); const QMap< int, QMap > getServerContextCallbacks(const ::Server* server) const; void removeServerContextCallback(const ::Server* server, int session_id, const QString& action); void setServerAuthenticator(const ::Server* server, const ::Murmur::ServerAuthenticatorPrx& prx); const ::Murmur::ServerAuthenticatorPrx getServerAuthenticator(const ::Server* server) const; void removeServerAuthenticator(const ::Server* server); void setServerUpdatingAuthenticator(const ::Server* server, const ::Murmur::ServerUpdatingAuthenticatorPrx& prx); const ::Murmur::ServerUpdatingAuthenticatorPrx getServerUpdatingAuthenticator(const ::Server* server) const; void removeServerUpdatingAuthenticator(const ::Server* server); public slots: void started(Server *); void stopped(Server *); void authenticateSlot(int &res, QString &uname, int sessionId, const QList &certlist, const QString &certhash, bool certstrong, const QString &pw); void registerUserSlot(int &res, const QMap &); void unregisterUserSlot(int &res, int id); void getRegisteredUsersSlot(const QString &filter, QMap &res); void getRegistrationSlot(int &, int, QMap &); void setInfoSlot(int &, int, const QMap &); void setTextureSlot(int &res, int id, const QByteArray &texture); void nameToIdSlot(int &res, const QString &name); void idToNameSlot(QString &res, int id); void idToTextureSlot(QByteArray &res, int id); void userStateChanged(const User *p); void userTextMessage(const User *p, const TextMessage &); void userConnected(const User *p); void userDisconnected(const User *p); void channelStateChanged(const Channel *c); void channelCreated(const Channel *c); void channelRemoved(const Channel *c); void contextAction(const User *, const QString &, unsigned int, int); }; #endif #endif mumble-1.3.4/src/murmur/MurmurIceWrapper.cpp0000664000175000017500000024303014010707274020737 0ustar builderbuilder // Auto-generated by scripts/mkwrapper.pl . Do not edit manually. void ::Murmur::ServerI::isRunning_async(const ::Murmur::AMD_Server_isRunningPtr &cb, const ::Ice::Current ¤t) { // qWarning() << "isRunning" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_isRunning_ALL #ifdef ACCESS_Server_isRunning_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_isRunning_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_isRunning, cb, QString::fromStdString(current.id.name).toInt())); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::start_async(const ::Murmur::AMD_Server_startPtr &cb, const ::Ice::Current ¤t) { // qWarning() << "start" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_start_ALL #ifdef ACCESS_Server_start_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_start_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_start, cb, QString::fromStdString(current.id.name).toInt())); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::stop_async(const ::Murmur::AMD_Server_stopPtr &cb, const ::Ice::Current ¤t) { // qWarning() << "stop" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_stop_ALL #ifdef ACCESS_Server_stop_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_stop_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_stop, cb, QString::fromStdString(current.id.name).toInt())); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::delete_async(const ::Murmur::AMD_Server_deletePtr &cb, const ::Ice::Current ¤t) { // qWarning() << "delete" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_delete_ALL #ifdef ACCESS_Server_delete_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_delete_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_delete, cb, QString::fromStdString(current.id.name).toInt())); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::id_async(const ::Murmur::AMD_Server_idPtr &cb, const ::Ice::Current ¤t) { // qWarning() << "id" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_id_ALL #ifdef ACCESS_Server_id_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_id_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_id, cb, QString::fromStdString(current.id.name).toInt())); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::addCallback_async(const ::Murmur::AMD_Server_addCallbackPtr &cb, const ::Murmur::ServerCallbackPrx& p1, const ::Ice::Current ¤t) { // qWarning() << "addCallback" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_addCallback_ALL #ifdef ACCESS_Server_addCallback_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_addCallback_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_addCallback, cb, QString::fromStdString(current.id.name).toInt(), p1)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::removeCallback_async(const ::Murmur::AMD_Server_removeCallbackPtr &cb, const ::Murmur::ServerCallbackPrx& p1, const ::Ice::Current ¤t) { // qWarning() << "removeCallback" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_removeCallback_ALL #ifdef ACCESS_Server_removeCallback_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_removeCallback_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_removeCallback, cb, QString::fromStdString(current.id.name).toInt(), p1)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::setAuthenticator_async(const ::Murmur::AMD_Server_setAuthenticatorPtr &cb, const ::Murmur::ServerAuthenticatorPrx& p1, const ::Ice::Current ¤t) { // qWarning() << "setAuthenticator" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_setAuthenticator_ALL #ifdef ACCESS_Server_setAuthenticator_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_setAuthenticator_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_setAuthenticator, cb, QString::fromStdString(current.id.name).toInt(), p1)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::getConf_async(const ::Murmur::AMD_Server_getConfPtr &cb, const ::std::string& p1, const ::Ice::Current ¤t) { // qWarning() << "getConf" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_getConf_ALL #ifdef ACCESS_Server_getConf_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_getConf_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_getConf, cb, QString::fromStdString(current.id.name).toInt(), p1)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::getAllConf_async(const ::Murmur::AMD_Server_getAllConfPtr &cb, const ::Ice::Current ¤t) { // qWarning() << "getAllConf" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_getAllConf_ALL #ifdef ACCESS_Server_getAllConf_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_getAllConf_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_getAllConf, cb, QString::fromStdString(current.id.name).toInt())); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::setConf_async(const ::Murmur::AMD_Server_setConfPtr &cb, const ::std::string& p1, const ::std::string& p2, const ::Ice::Current ¤t) { // qWarning() << "setConf" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_setConf_ALL #ifdef ACCESS_Server_setConf_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_setConf_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_setConf, cb, QString::fromStdString(current.id.name).toInt(), p1, p2)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::setSuperuserPassword_async(const ::Murmur::AMD_Server_setSuperuserPasswordPtr &cb, const ::std::string& p1, const ::Ice::Current ¤t) { // qWarning() << "setSuperuserPassword" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_setSuperuserPassword_ALL #ifdef ACCESS_Server_setSuperuserPassword_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_setSuperuserPassword_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_setSuperuserPassword, cb, QString::fromStdString(current.id.name).toInt(), p1)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::getLog_async(const ::Murmur::AMD_Server_getLogPtr &cb, ::Ice::Int p1, ::Ice::Int p2, const ::Ice::Current ¤t) { // qWarning() << "getLog" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_getLog_ALL #ifdef ACCESS_Server_getLog_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_getLog_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_getLog, cb, QString::fromStdString(current.id.name).toInt(), p1, p2)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::getLogLen_async(const ::Murmur::AMD_Server_getLogLenPtr &cb, const ::Ice::Current ¤t) { // qWarning() << "getLogLen" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_getLogLen_ALL #ifdef ACCESS_Server_getLogLen_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_getLogLen_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_getLogLen, cb, QString::fromStdString(current.id.name).toInt())); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::getUsers_async(const ::Murmur::AMD_Server_getUsersPtr &cb, const ::Ice::Current ¤t) { // qWarning() << "getUsers" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_getUsers_ALL #ifdef ACCESS_Server_getUsers_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_getUsers_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_getUsers, cb, QString::fromStdString(current.id.name).toInt())); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::getChannels_async(const ::Murmur::AMD_Server_getChannelsPtr &cb, const ::Ice::Current ¤t) { // qWarning() << "getChannels" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_getChannels_ALL #ifdef ACCESS_Server_getChannels_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_getChannels_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_getChannels, cb, QString::fromStdString(current.id.name).toInt())); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::getCertificateList_async(const ::Murmur::AMD_Server_getCertificateListPtr &cb, ::Ice::Int p1, const ::Ice::Current ¤t) { // qWarning() << "getCertificateList" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_getCertificateList_ALL #ifdef ACCESS_Server_getCertificateList_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_getCertificateList_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_getCertificateList, cb, QString::fromStdString(current.id.name).toInt(), p1)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::getTree_async(const ::Murmur::AMD_Server_getTreePtr &cb, const ::Ice::Current ¤t) { // qWarning() << "getTree" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_getTree_ALL #ifdef ACCESS_Server_getTree_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_getTree_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_getTree, cb, QString::fromStdString(current.id.name).toInt())); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::getBans_async(const ::Murmur::AMD_Server_getBansPtr &cb, const ::Ice::Current ¤t) { // qWarning() << "getBans" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_getBans_ALL #ifdef ACCESS_Server_getBans_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_getBans_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_getBans, cb, QString::fromStdString(current.id.name).toInt())); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::setBans_async(const ::Murmur::AMD_Server_setBansPtr &cb, const ::Murmur::BanList& p1, const ::Ice::Current ¤t) { // qWarning() << "setBans" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_setBans_ALL #ifdef ACCESS_Server_setBans_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_setBans_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_setBans, cb, QString::fromStdString(current.id.name).toInt(), p1)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::kickUser_async(const ::Murmur::AMD_Server_kickUserPtr &cb, ::Ice::Int p1, const ::std::string& p2, const ::Ice::Current ¤t) { // qWarning() << "kickUser" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_kickUser_ALL #ifdef ACCESS_Server_kickUser_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_kickUser_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_kickUser, cb, QString::fromStdString(current.id.name).toInt(), p1, p2)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::getState_async(const ::Murmur::AMD_Server_getStatePtr &cb, ::Ice::Int p1, const ::Ice::Current ¤t) { // qWarning() << "getState" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_getState_ALL #ifdef ACCESS_Server_getState_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_getState_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_getState, cb, QString::fromStdString(current.id.name).toInt(), p1)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::setState_async(const ::Murmur::AMD_Server_setStatePtr &cb, const ::Murmur::User& p1, const ::Ice::Current ¤t) { // qWarning() << "setState" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_setState_ALL #ifdef ACCESS_Server_setState_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_setState_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_setState, cb, QString::fromStdString(current.id.name).toInt(), p1)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::sendMessage_async(const ::Murmur::AMD_Server_sendMessagePtr &cb, ::Ice::Int p1, const ::std::string& p2, const ::Ice::Current ¤t) { // qWarning() << "sendMessage" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_sendMessage_ALL #ifdef ACCESS_Server_sendMessage_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_sendMessage_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_sendMessage, cb, QString::fromStdString(current.id.name).toInt(), p1, p2)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::hasPermission_async(const ::Murmur::AMD_Server_hasPermissionPtr &cb, ::Ice::Int p1, ::Ice::Int p2, ::Ice::Int p3, const ::Ice::Current ¤t) { // qWarning() << "hasPermission" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_hasPermission_ALL #ifdef ACCESS_Server_hasPermission_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_hasPermission_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_hasPermission, cb, QString::fromStdString(current.id.name).toInt(), p1, p2, p3)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::effectivePermissions_async(const ::Murmur::AMD_Server_effectivePermissionsPtr &cb, ::Ice::Int p1, ::Ice::Int p2, const ::Ice::Current ¤t) { // qWarning() << "effectivePermissions" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_effectivePermissions_ALL #ifdef ACCESS_Server_effectivePermissions_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_effectivePermissions_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_effectivePermissions, cb, QString::fromStdString(current.id.name).toInt(), p1, p2)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::addContextCallback_async(const ::Murmur::AMD_Server_addContextCallbackPtr &cb, ::Ice::Int p1, const ::std::string& p2, const ::std::string& p3, const ::Murmur::ServerContextCallbackPrx& p4, ::Ice::Int p5, const ::Ice::Current ¤t) { // qWarning() << "addContextCallback" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_addContextCallback_ALL #ifdef ACCESS_Server_addContextCallback_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_addContextCallback_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_addContextCallback, cb, QString::fromStdString(current.id.name).toInt(), p1, p2, p3, p4, p5)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::removeContextCallback_async(const ::Murmur::AMD_Server_removeContextCallbackPtr &cb, const ::Murmur::ServerContextCallbackPrx& p1, const ::Ice::Current ¤t) { // qWarning() << "removeContextCallback" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_removeContextCallback_ALL #ifdef ACCESS_Server_removeContextCallback_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_removeContextCallback_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_removeContextCallback, cb, QString::fromStdString(current.id.name).toInt(), p1)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::getChannelState_async(const ::Murmur::AMD_Server_getChannelStatePtr &cb, ::Ice::Int p1, const ::Ice::Current ¤t) { // qWarning() << "getChannelState" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_getChannelState_ALL #ifdef ACCESS_Server_getChannelState_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_getChannelState_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_getChannelState, cb, QString::fromStdString(current.id.name).toInt(), p1)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::setChannelState_async(const ::Murmur::AMD_Server_setChannelStatePtr &cb, const ::Murmur::Channel& p1, const ::Ice::Current ¤t) { // qWarning() << "setChannelState" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_setChannelState_ALL #ifdef ACCESS_Server_setChannelState_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_setChannelState_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_setChannelState, cb, QString::fromStdString(current.id.name).toInt(), p1)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::removeChannel_async(const ::Murmur::AMD_Server_removeChannelPtr &cb, ::Ice::Int p1, const ::Ice::Current ¤t) { // qWarning() << "removeChannel" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_removeChannel_ALL #ifdef ACCESS_Server_removeChannel_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_removeChannel_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_removeChannel, cb, QString::fromStdString(current.id.name).toInt(), p1)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::addChannel_async(const ::Murmur::AMD_Server_addChannelPtr &cb, const ::std::string& p1, ::Ice::Int p2, const ::Ice::Current ¤t) { // qWarning() << "addChannel" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_addChannel_ALL #ifdef ACCESS_Server_addChannel_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_addChannel_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_addChannel, cb, QString::fromStdString(current.id.name).toInt(), p1, p2)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::sendMessageChannel_async(const ::Murmur::AMD_Server_sendMessageChannelPtr &cb, ::Ice::Int p1, bool p2, const ::std::string& p3, const ::Ice::Current ¤t) { // qWarning() << "sendMessageChannel" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_sendMessageChannel_ALL #ifdef ACCESS_Server_sendMessageChannel_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_sendMessageChannel_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_sendMessageChannel, cb, QString::fromStdString(current.id.name).toInt(), p1, p2, p3)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::getACL_async(const ::Murmur::AMD_Server_getACLPtr &cb, ::Ice::Int p1, const ::Ice::Current ¤t) { // qWarning() << "getACL" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_getACL_ALL #ifdef ACCESS_Server_getACL_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_getACL_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_getACL, cb, QString::fromStdString(current.id.name).toInt(), p1)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::setACL_async(const ::Murmur::AMD_Server_setACLPtr &cb, ::Ice::Int p1, const ::Murmur::ACLList& p2, const ::Murmur::GroupList& p3, bool p4, const ::Ice::Current ¤t) { // qWarning() << "setACL" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_setACL_ALL #ifdef ACCESS_Server_setACL_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_setACL_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_setACL, cb, QString::fromStdString(current.id.name).toInt(), p1, p2, p3, p4)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::addUserToGroup_async(const ::Murmur::AMD_Server_addUserToGroupPtr &cb, ::Ice::Int p1, ::Ice::Int p2, const ::std::string& p3, const ::Ice::Current ¤t) { // qWarning() << "addUserToGroup" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_addUserToGroup_ALL #ifdef ACCESS_Server_addUserToGroup_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_addUserToGroup_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_addUserToGroup, cb, QString::fromStdString(current.id.name).toInt(), p1, p2, p3)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::removeUserFromGroup_async(const ::Murmur::AMD_Server_removeUserFromGroupPtr &cb, ::Ice::Int p1, ::Ice::Int p2, const ::std::string& p3, const ::Ice::Current ¤t) { // qWarning() << "removeUserFromGroup" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_removeUserFromGroup_ALL #ifdef ACCESS_Server_removeUserFromGroup_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_removeUserFromGroup_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_removeUserFromGroup, cb, QString::fromStdString(current.id.name).toInt(), p1, p2, p3)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::redirectWhisperGroup_async(const ::Murmur::AMD_Server_redirectWhisperGroupPtr &cb, ::Ice::Int p1, const ::std::string& p2, const ::std::string& p3, const ::Ice::Current ¤t) { // qWarning() << "redirectWhisperGroup" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_redirectWhisperGroup_ALL #ifdef ACCESS_Server_redirectWhisperGroup_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_redirectWhisperGroup_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_redirectWhisperGroup, cb, QString::fromStdString(current.id.name).toInt(), p1, p2, p3)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::getUserNames_async(const ::Murmur::AMD_Server_getUserNamesPtr &cb, const ::Murmur::IdList& p1, const ::Ice::Current ¤t) { // qWarning() << "getUserNames" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_getUserNames_ALL #ifdef ACCESS_Server_getUserNames_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_getUserNames_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_getUserNames, cb, QString::fromStdString(current.id.name).toInt(), p1)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::getUserIds_async(const ::Murmur::AMD_Server_getUserIdsPtr &cb, const ::Murmur::NameList& p1, const ::Ice::Current ¤t) { // qWarning() << "getUserIds" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_getUserIds_ALL #ifdef ACCESS_Server_getUserIds_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_getUserIds_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_getUserIds, cb, QString::fromStdString(current.id.name).toInt(), p1)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::registerUser_async(const ::Murmur::AMD_Server_registerUserPtr &cb, const ::Murmur::UserInfoMap& p1, const ::Ice::Current ¤t) { // qWarning() << "registerUser" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_registerUser_ALL #ifdef ACCESS_Server_registerUser_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_registerUser_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_registerUser, cb, QString::fromStdString(current.id.name).toInt(), p1)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::unregisterUser_async(const ::Murmur::AMD_Server_unregisterUserPtr &cb, ::Ice::Int p1, const ::Ice::Current ¤t) { // qWarning() << "unregisterUser" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_unregisterUser_ALL #ifdef ACCESS_Server_unregisterUser_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_unregisterUser_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_unregisterUser, cb, QString::fromStdString(current.id.name).toInt(), p1)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::updateRegistration_async(const ::Murmur::AMD_Server_updateRegistrationPtr &cb, ::Ice::Int p1, const ::Murmur::UserInfoMap& p2, const ::Ice::Current ¤t) { // qWarning() << "updateRegistration" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_updateRegistration_ALL #ifdef ACCESS_Server_updateRegistration_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_updateRegistration_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_updateRegistration, cb, QString::fromStdString(current.id.name).toInt(), p1, p2)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::getRegistration_async(const ::Murmur::AMD_Server_getRegistrationPtr &cb, ::Ice::Int p1, const ::Ice::Current ¤t) { // qWarning() << "getRegistration" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_getRegistration_ALL #ifdef ACCESS_Server_getRegistration_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_getRegistration_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_getRegistration, cb, QString::fromStdString(current.id.name).toInt(), p1)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::getRegisteredUsers_async(const ::Murmur::AMD_Server_getRegisteredUsersPtr &cb, const ::std::string& p1, const ::Ice::Current ¤t) { // qWarning() << "getRegisteredUsers" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_getRegisteredUsers_ALL #ifdef ACCESS_Server_getRegisteredUsers_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_getRegisteredUsers_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_getRegisteredUsers, cb, QString::fromStdString(current.id.name).toInt(), p1)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::verifyPassword_async(const ::Murmur::AMD_Server_verifyPasswordPtr &cb, const ::std::string& p1, const ::std::string& p2, const ::Ice::Current ¤t) { // qWarning() << "verifyPassword" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_verifyPassword_ALL #ifdef ACCESS_Server_verifyPassword_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_verifyPassword_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_verifyPassword, cb, QString::fromStdString(current.id.name).toInt(), p1, p2)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::getTexture_async(const ::Murmur::AMD_Server_getTexturePtr &cb, ::Ice::Int p1, const ::Ice::Current ¤t) { // qWarning() << "getTexture" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_getTexture_ALL #ifdef ACCESS_Server_getTexture_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_getTexture_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_getTexture, cb, QString::fromStdString(current.id.name).toInt(), p1)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::setTexture_async(const ::Murmur::AMD_Server_setTexturePtr &cb, ::Ice::Int p1, const ::Murmur::Texture& p2, const ::Ice::Current ¤t) { // qWarning() << "setTexture" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_setTexture_ALL #ifdef ACCESS_Server_setTexture_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_setTexture_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_setTexture, cb, QString::fromStdString(current.id.name).toInt(), p1, p2)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::getUptime_async(const ::Murmur::AMD_Server_getUptimePtr &cb, const ::Ice::Current ¤t) { // qWarning() << "getUptime" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_getUptime_ALL #ifdef ACCESS_Server_getUptime_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_getUptime_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_getUptime, cb, QString::fromStdString(current.id.name).toInt())); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::ServerI::updateCertificate_async(const ::Murmur::AMD_Server_updateCertificatePtr &cb, const ::std::string& p1, const ::std::string& p2, const ::std::string& p3, const ::Ice::Current ¤t) { // qWarning() << "updateCertificate" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Server_updateCertificate_ALL #ifdef ACCESS_Server_updateCertificate_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Server_updateCertificate_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Server_updateCertificate, cb, QString::fromStdString(current.id.name).toInt(), p1, p2, p3)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::MetaI::getServer_async(const ::Murmur::AMD_Meta_getServerPtr &cb, ::Ice::Int p1, const ::Ice::Current ¤t) { // qWarning() << "getServer" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Meta_getServer_ALL #ifdef ACCESS_Meta_getServer_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Meta_getServer_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Meta_getServer, cb, current.adapter, p1)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::MetaI::newServer_async(const ::Murmur::AMD_Meta_newServerPtr &cb, const ::Ice::Current ¤t) { // qWarning() << "newServer" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Meta_newServer_ALL #ifdef ACCESS_Meta_newServer_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Meta_newServer_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Meta_newServer, cb, current.adapter)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::MetaI::getBootedServers_async(const ::Murmur::AMD_Meta_getBootedServersPtr &cb, const ::Ice::Current ¤t) { // qWarning() << "getBootedServers" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Meta_getBootedServers_ALL #ifdef ACCESS_Meta_getBootedServers_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Meta_getBootedServers_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Meta_getBootedServers, cb, current.adapter)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::MetaI::getAllServers_async(const ::Murmur::AMD_Meta_getAllServersPtr &cb, const ::Ice::Current ¤t) { // qWarning() << "getAllServers" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Meta_getAllServers_ALL #ifdef ACCESS_Meta_getAllServers_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Meta_getAllServers_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Meta_getAllServers, cb, current.adapter)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::MetaI::getDefaultConf_async(const ::Murmur::AMD_Meta_getDefaultConfPtr &cb, const ::Ice::Current ¤t) { // qWarning() << "getDefaultConf" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Meta_getDefaultConf_ALL #ifdef ACCESS_Meta_getDefaultConf_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Meta_getDefaultConf_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Meta_getDefaultConf, cb, current.adapter)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::MetaI::getVersion_async(const ::Murmur::AMD_Meta_getVersionPtr &cb, const ::Ice::Current ¤t) { // qWarning() << "getVersion" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Meta_getVersion_ALL #ifdef ACCESS_Meta_getVersion_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Meta_getVersion_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Meta_getVersion, cb, current.adapter)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::MetaI::addCallback_async(const ::Murmur::AMD_Meta_addCallbackPtr &cb, const ::Murmur::MetaCallbackPrx& p1, const ::Ice::Current ¤t) { // qWarning() << "addCallback" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Meta_addCallback_ALL #ifdef ACCESS_Meta_addCallback_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Meta_addCallback_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Meta_addCallback, cb, current.adapter, p1)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::MetaI::removeCallback_async(const ::Murmur::AMD_Meta_removeCallbackPtr &cb, const ::Murmur::MetaCallbackPrx& p1, const ::Ice::Current ¤t) { // qWarning() << "removeCallback" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Meta_removeCallback_ALL #ifdef ACCESS_Meta_removeCallback_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Meta_removeCallback_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Meta_removeCallback, cb, current.adapter, p1)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::MetaI::getUptime_async(const ::Murmur::AMD_Meta_getUptimePtr &cb, const ::Ice::Current ¤t) { // qWarning() << "getUptime" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Meta_getUptime_ALL #ifdef ACCESS_Meta_getUptime_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Meta_getUptime_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Meta_getUptime, cb, current.adapter)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::MetaI::getSliceChecksums_async(const ::Murmur::AMD_Meta_getSliceChecksumsPtr &cb, const ::Ice::Current ¤t) { // qWarning() << "getSliceChecksums" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_Meta_getSliceChecksums_ALL #ifdef ACCESS_Meta_getSliceChecksums_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_Meta_getSliceChecksums_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_Meta_getSliceChecksums, cb, current.adapter)); QCoreApplication::instance()->postEvent(mi, ie); } void ::Murmur::MetaI::getSlice_async(const ::Murmur::AMD_Meta_getSlicePtr& cb, const Ice::Current&) { cb->ice_response(std::string("// Copyright 2005-2019 The Mumble Developers. All rights reserved.\n// Use of this source code is governed by a BSD-style license\n// that can be found in the LICENSE file at the root of the\n// Mumble source tree or at .\n#include \nmodule Murmur\n{\n[\"python:seq:tuple\"] sequence NetAddress;\nstruct User {\nint session;\nint userid;\nbool mute;\nbool deaf;\nbool suppress;\nbool prioritySpeaker;\nbool selfMute;\nbool selfDeaf;\nbool recording;\nint channel;\nstring name;\nint onlinesecs;\nint bytespersec;\nint version;\nstring release;\nstring os;\nstring osversion;\nstring identity;\nstring context;\nstring comment;\nNetAddress address;\nbool tcponly;\nint idlesecs;\nfloat udpPing;\nfloat tcpPing;\n};\nsequence IntList;\nstruct TextMessage {\nIntList sessions;\nIntList channels;\nIntList trees;\nstring text;\n};\nstruct Channel {\nint id;\nstring name;\nint parent;\nIntList links;\nstring description;\nbool temporary;\nint position;\n};\nstruct Group {\nstring name;\nbool inherited;\nbool inherit;\nbool inheritable;\nIntList add;\nIntList remove;\nIntList members;\n};\nconst int PermissionWrite = 0x01;\nconst int PermissionTraverse = 0x02;\nconst int PermissionEnter = 0x04;\nconst int PermissionSpeak = 0x08;\nconst int PermissionWhisper = 0x100;\nconst int PermissionMuteDeafen = 0x10;\nconst int PermissionMove = 0x20;\nconst int PermissionMakeChannel = 0x40;\nconst int PermissionMakeTempChannel = 0x400;\nconst int PermissionLinkChannel = 0x80;\nconst int PermissionTextMessage = 0x200;\nconst int PermissionKick = 0x10000;\nconst int PermissionBan = 0x20000;\nconst int PermissionRegister = 0x40000;\nconst int PermissionRegisterSelf = 0x80000;\nstruct ACL {\nbool applyHere;\nbool applySubs;\nbool inherited;\nint userid;\nstring group;\nint allow;\nint deny;\n};\nstruct Ban {\nNetAddress address;\nint bits;\nstring name;\nstring hash;\nstring reason;\nint start;\nint duration;\n};\nstruct LogEntry {\nint timestamp;\nstring txt;\n};\nclass Tree;\nsequence TreeList;\nenum ChannelInfo { ChannelDescription, ChannelPosition };\nenum UserInfo { UserName, UserEmail, UserComment, UserHash, UserPassword, UserLastActive };\ndictionary UserMap;\ndictionary ChannelMap;\nsequence ChannelList;\nsequence UserList;\nsequence GroupList;\nsequence ACLList;\nsequence LogList;\nsequence BanList;\nsequence IdList;\nsequence NameList;\ndictionary NameMap;\ndictionary IdMap;\nsequence Texture;\ndictionary ConfigMap;\nsequence GroupNameList;\nsequence CertificateDer;\nsequence CertificateList;\ndictionary UserInfoMap;\nclass Tree {\nChannel c;\nTreeList children;\nUserList users;\n};\nexception MurmurException {};\nexception InvalidSessionException extends MurmurException {};\nexception InvalidChannelException extends MurmurException {};\nexception InvalidServerException extends MurmurException {};\nexception ServerBootedException extends MurmurException {};\nexception ServerFailureException extends MurmurException {};\nexception InvalidUserException extends MurmurException {};\nexception InvalidTextureException extends MurmurException {};\nexception InvalidCallbackException extends MurmurException {};\nexception InvalidSecretException extends MurmurException {};\nexception NestingLimitException extends MurmurException {};\nexception WriteOnlyException extends MurmurException {};\nexception InvalidInputDataException extends MurmurException {};\ninterface ServerCallback {\nidempotent void userConnected(User state);\nidempotent void userDisconnected(User state);\nidempotent void userStateChanged(User state);\nidempotent void userTextMessage(User state, TextMessage message);\nidempotent void channelCreated(Channel state);\nidempotent void channelRemoved(Channel state);\nidempotent void channelStateChanged(Channel state);\n};\nconst int ContextServer = 0x01;\nconst int ContextChannel = 0x02;\nconst int ContextUser = 0x04;\ninterface ServerContextCallback {\nidempotent void contextAction(string action, User usr, int session, int channelid);\n};\ninterface ServerAuthenticator {\nidempotent int authenticate(string name, string pw, CertificateList certificates, string certhash, bool certstrong, out string newname, out GroupNameList groups);\nidempotent bool getInfo(int id, out UserInfoMap info);\nidempotent int nameToId(string name);\nidempotent string idToName(int id);\nidempotent Texture idToTexture(int id);\n};\ninterface ServerUpdatingAuthenticator extends ServerAuthenticator {\nint registerUser(UserInfoMap info);\nint unregisterUser(int id);\nidempotent NameMap getRegisteredUsers(string filter);\nidempotent int setInfo(int id, UserInfoMap info);\nidempotent int setTexture(int id, Texture tex);\n};\n[\"amd\"] interface Server {\nidempotent bool isRunning() throws InvalidSecretException;\nvoid start() throws ServerBootedException, ServerFailureException, InvalidSecretException;\nvoid stop() throws ServerBootedException, InvalidSecretException;\nvoid delete() throws ServerBootedException, InvalidSecretException;\nidempotent int id() throws InvalidSecretException;\nvoid addCallback(ServerCallback *cb) throws ServerBootedException, InvalidCallbackException, InvalidSecretException;\nvoid removeCallback(ServerCallback *cb) throws ServerBootedException, InvalidCallbackException, InvalidSecretException;\nvoid setAuthenticator(ServerAuthenticator *auth) throws ServerBootedException, InvalidCallbackException, InvalidSecretException;\nidempotent string getConf(string key) throws InvalidSecretException, WriteOnlyException;\nidempotent ConfigMap getAllConf() throws InvalidSecretException;\nidempotent void setConf(string key, string value) throws InvalidSecretException;\nidempotent void setSuperuserPassword(string pw) throws InvalidSecretException;\nidempotent LogList getLog(int first, int last) throws InvalidSecretException;\nidempotent int getLogLen() throws InvalidSecretException;\nidempotent UserMap getUsers() throws ServerBootedException, InvalidSecretException;\nidempotent ChannelMap getChannels() throws ServerBootedException, InvalidSecretException;\nidempotent CertificateList getCertificateList(int session) throws ServerBootedException, InvalidSessionException, InvalidSecretException;\nidempotent Tree getTree() throws ServerBootedException, InvalidSecretException;\nidempotent BanList getBans() throws ServerBootedException, InvalidSecretException;\nidempotent void setBans(BanList bans) throws ServerBootedException, InvalidSecretException;\nvoid kickUser(int session, string reason) throws ServerBootedException, InvalidSessionException, InvalidSecretException;\nidempotent User getState(int session) throws ServerBootedException, InvalidSessionException, InvalidSecretException;\nidempotent void setState(User state) throws ServerBootedException, InvalidSessionException, InvalidChannelException, InvalidSecretException;\nvoid sendMessage(int session, string text) throws ServerBootedException, InvalidSessionException, InvalidSecretException;\nbool hasPermission(int session, int channelid, int perm) throws ServerBootedException, InvalidSessionException, InvalidChannelException, InvalidSecretException;\nidempotent int effectivePermissions(int session, int channelid) throws ServerBootedException, InvalidSessionException, InvalidChannelException, InvalidSecretException;\nvoid addContextCallback(int session, string action, string text, ServerContextCallback *cb, int ctx) throws ServerBootedException, InvalidCallbackException, InvalidSecretException;\nvoid removeContextCallback(ServerContextCallback *cb) throws ServerBootedException, InvalidCallbackException, InvalidSecretException;\nidempotent Channel getChannelState(int channelid) throws ServerBootedException, InvalidChannelException, InvalidSecretException;\nidempotent void setChannelState(Channel state) throws ServerBootedException, InvalidChannelException, InvalidSecretException, NestingLimitException;\nvoid removeChannel(int channelid) throws ServerBootedException, InvalidChannelException, InvalidSecretException;\nint addChannel(string name, int parent) throws ServerBootedException, InvalidChannelException, InvalidSecretException, NestingLimitException;\nvoid sendMessageChannel(int channelid, bool tree, string text) throws ServerBootedException, InvalidChannelException, InvalidSecretException;\nidempotent void getACL(int channelid, out ACLList acls, out GroupList groups, out bool inherit) throws ServerBootedException, InvalidChannelException, InvalidSecretException;\nidempotent void setACL(int channelid, ACLList acls, GroupList groups, bool inherit) throws ServerBootedException, InvalidChannelException, InvalidSecretException;\nidempotent void addUserToGroup(int channelid, int session, string group) throws ServerBootedException, InvalidChannelException, InvalidSessionException, InvalidSecretException;\nidempotent void removeUserFromGroup(int channelid, int session, string group) throws ServerBootedException, InvalidChannelException, InvalidSessionException, InvalidSecretException;\nidempotent void redirectWhisperGroup(int session, string source, string target) throws ServerBootedException, InvalidSessionException, InvalidSecretException;\nidempotent NameMap getUserNames(IdList ids) throws ServerBootedException, InvalidSecretException;\nidempotent IdMap getUserIds(NameList names) throws ServerBootedException, InvalidSecretException;\nint registerUser(UserInfoMap info) throws ServerBootedException, InvalidUserException, InvalidSecretException;\nvoid unregisterUser(int userid) throws ServerBootedException, InvalidUserException, InvalidSecretException;\nidempotent void updateRegistration(int userid, UserInfoMap info) throws ServerBootedException, InvalidUserException, InvalidSecretException;\nidempotent UserInfoMap getRegistration(int userid) throws ServerBootedException, InvalidUserException, InvalidSecretException;\nidempotent NameMap getRegisteredUsers(string filter) throws ServerBootedException, InvalidSecretException;\nidempotent int verifyPassword(string name, string pw) throws ServerBootedException, InvalidSecretException;\nidempotent Texture getTexture(int userid) throws ServerBootedException, InvalidUserException, InvalidSecretException;\nidempotent void setTexture(int userid, Texture tex) throws ServerBootedException, InvalidUserException, InvalidTextureException, InvalidSecretException;\nidempotent int getUptime() throws ServerBootedException, InvalidSecretException;\n idempotent void updateCertificate(string certificate, string privateKey, string passphrase) throws ServerBootedException, InvalidSecretException, InvalidInputDataException;\n};\ninterface MetaCallback {\nvoid started(Server *srv);\nvoid stopped(Server *srv);\n};\nsequence ServerList;\n[\"amd\"] interface Meta {\nidempotent Server *getServer(int id) throws InvalidSecretException;\nServer *newServer() throws InvalidSecretException;\nidempotent ServerList getBootedServers() throws InvalidSecretException;\nidempotent ServerList getAllServers() throws InvalidSecretException;\nidempotent ConfigMap getDefaultConf() throws InvalidSecretException;\nidempotent void getVersion(out int major, out int minor, out int patch, out string text);\nvoid addCallback(MetaCallback *cb) throws InvalidCallbackException, InvalidSecretException;\nvoid removeCallback(MetaCallback *cb) throws InvalidCallbackException, InvalidSecretException;\nidempotent int getUptime();\nidempotent string getSlice();\nidempotent Ice::SliceChecksumDict getSliceChecksums();\n};\n};\n")); } mumble-1.3.4/src/murmur/Tray.cpp0000664000175000017500000000470614010707274016412 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "murmur_pch.h" #include "Tray.h" #include "About.h" #include "Meta.h" #include "Server.h" #include "Version.h" #include "LogEmitter.h" Tray::Tray(QObject *p, LogEmitter *logger) : QObject(p) { le = logger; qsti = new QSystemTrayIcon(qApp->windowIcon(), this); qsti->setObjectName(QLatin1String("Tray")); qsti->setToolTip(tr("Murmur")); qaQuit = new QAction(tr("&Quit Murmur"), this); qaQuit->setShortcut(tr("Ctrl+Q", "Quit")); qaQuit->setObjectName(QLatin1String("Quit")); qaAbout = new QAction(tr("&About Murmur"), this); qaAbout->setObjectName(QLatin1String("About")); qaShowLog = new QAction(tr("&Show Log"), this); qaShowLog->setShortcut(tr("Ctrl+L", "Quit")); qaShowLog->setObjectName(QLatin1String("ShowLog")); // Can't construct a QMenu which decends from QObject, and qsti is a QObject. // Qt bug? qm = new QMenu(tr("Murmur"), NULL); qm->addAction(qaShowLog); qm->addSeparator(); qm->addAction(qaAbout); qm->addAction(qaQuit); qsti->setContextMenu(qm); qsti->show(); connect(le, SIGNAL(newLogEntry(const QString &)), this, SLOT(addLogMessage(const QString &))); QMetaObject::connectSlotsByName(this); } void Tray::on_Tray_activated(QSystemTrayIcon::ActivationReason r) { if (r == QSystemTrayIcon::Trigger) { qsti->showMessage(tr("Murmur"), tr("%1 server running.").arg(meta->qhServers.count()), QSystemTrayIcon::Information, 5000); } } void Tray::on_Quit_triggered() { if (QMessageBox::question(NULL, tr("Murmur"), tr("Are you sure you want to quit Murmur?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::Yes) { qApp->quit(); } } void Tray::on_About_triggered() { AboutDialog ad(NULL); ad.exec(); } void Tray::on_ShowLog_triggered() { QMainWindow *mw = new QMainWindow(); mw->setAttribute(Qt::WA_DeleteOnClose); QTextBrowser *tb = new QTextBrowser(); mw->resize(675, 300); mw->setCentralWidget(tb); mw->setWindowTitle(QString::fromLatin1("Murmur -- %1").arg(MUMBLE_RELEASE)); connect(le, SIGNAL(newLogEntry(const QString &)), tb, SLOT(append(const QString &))); foreach(const QString &m, qlLog) tb->append(m); mw->show(); } void Tray::addLogMessage(const QString &msg) { if (qlLog.count() >= 1000) qlLog.removeFirst(); qlLog.append(msg); } mumble-1.3.4/src/murmur/murmur_pch.h0000664000175000017500000000450114010707274017312 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef Q_MOC_RUN #ifndef MUMBLE_MURMUR_MURMUR_PCH_H_ #define MUMBLE_MURMUR_MURMUR_PCH_H_ #define WIN32_LEAN_AND_MEAN #define _USE_MATH_DEFINES #ifdef __APPLE__ #include #include #undef check #undef TYPE_BOOL #endif #ifdef __MINGW32__ #define _WIN32_WINNT 0x0600 #include #include #endif #include #include #include #include #ifdef USE_DBUS #include #endif #include "QAtomicIntCompat.h" #ifdef Q_OS_WIN #include #if QT_VERSION >= 0x050000 # include "Qt4Compat.h" # include #endif #include "../qos2_mingw.h" #include #include #include #include #include extern "C" { void __cpuid(int a[4], int b); }; #endif #ifdef Q_OS_UNIX #include #include #include #include #include #include #include #include #include #include #include #ifdef Q_OS_LINUX #include // needed to work around evil magic stuff in capability.h #include #include #endif #include #include #if defined __FreeBSD__ || defined __OpenBSD__ #include #endif #include #include #include #include #include #ifdef Q_OS_DARWIN #include #endif #endif #include #include #include #include #include #include "Utils.h" #ifdef USE_BONJOUR #include #endif #include #include #include #include #include #include #include #include #include /* OpenSSL defines set_key. This breaks our protobuf-generated setters. */ #undef set_key #endif #endif mumble-1.3.4/src/murmur/MurmurIce.cpp0000664000175000017500000014657714010707274017420 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "murmur_pch.h" #include "MurmurIce.h" #include #include #include #include #include "Channel.h" #include "Group.h" #include "Meta.h" #include "MurmurI.h" #include "Server.h" #include "ServerUser.h" #include "ServerDB.h" #include "User.h" #include "Ban.h" using namespace std; using namespace Murmur; static MurmurIce *mi = NULL; static Ice::ObjectPtr iopServer; static Ice::PropertiesPtr ippProperties; void IceParse(int &argc, char *argv[]) { ippProperties = Ice::createProperties(argc, argv); } void IceStart() { mi = new MurmurIce(); } void IceStop() { delete mi; mi = NULL; } /// Remove all NUL bytes from |s|. static std::string iceRemoveNul(std::string s) { std::vector newstr; for (size_t i = 0; i < s.size(); i++) { char c = s.at(i); if (c == 0) { continue; } newstr.push_back(s.at(i)); } return std::string(newstr.begin(), newstr.end()); } /// Marshall the QString |s| to be safe for use on /// the wire in Ice messages, parameters /// and return values. /// /// What happens under the hood is that the string /// is converted to UTF-8, and all NUL bytes are /// removed. static std::string iceString(const QString &s) { return iceRemoveNul(u8(s)); } /// Convert the bytes in std::string to base64 using the /// base64 alphabet from RFC 2045. /// /// The size of the string may not exceed sizeof(int). /// If the function is passed a string bigger than that, /// it will return an empty string. static std::string iceBase64(const std::string &s) { if (s.size() > static_cast(std::numeric_limits::max())) { return std::string(); } QByteArray ba(s.data(), static_cast(s.size())); QByteArray ba64 = ba.toBase64(); return std::string(ba64.data(), static_cast(ba.size())); } static void logToLog(const ServerDB::LogRecord &r, Murmur::LogEntry &le) { le.timestamp = r.first; le.txt = iceString(r.second); } static void userToUser(const ::User *p, Murmur::User &mp) { mp.session = p->uiSession; mp.userid = p->iId; mp.name = iceString(p->qsName); mp.mute = p->bMute; mp.deaf = p->bDeaf; mp.suppress = p->bSuppress; mp.recording = p->bRecording; mp.prioritySpeaker = p->bPrioritySpeaker; mp.selfMute = p->bSelfMute; mp.selfDeaf = p->bSelfDeaf; mp.channel = p->cChannel->iId; mp.comment = iceString(p->qsComment); const ServerUser *u=static_cast(p); mp.onlinesecs = u->bwr.onlineSeconds(); mp.bytespersec = u->bwr.bandwidth(); mp.version = u->uiVersion; mp.release = iceString(u->qsRelease); mp.os = iceString(u->qsOS); mp.osversion = iceString(u->qsOSVersion); mp.identity = iceString(u->qsIdentity); mp.context = iceBase64(u->ssContext); mp.idlesecs = u->bwr.idleSeconds(); mp.udpPing = u->dUDPPingAvg; mp.tcpPing = u->dTCPPingAvg; mp.tcponly = QAtomicIntLoad(u->aiUdpFlag) == 0; ::Murmur::NetAddress addr(16, 0); const Q_IPV6ADDR &a = u->haAddress.qip6; for (int i=0;i<16;++i) addr[i] = a[i]; mp.address = addr; } static void channelToChannel(const ::Channel *c, Murmur::Channel &mc) { mc.id = c->iId; mc.name = iceString(c->qsName); mc.parent = c->cParent ? c->cParent->iId : -1; mc.description = iceString(c->qsDesc); mc.position = c->iPosition; mc.links.clear(); foreach(::Channel *chn, c->qsPermLinks) mc.links.push_back(chn->iId); mc.temporary = c->bTemporary; } static void ACLtoACL(const ::ChanACL *acl, Murmur::ACL &ma) { ma.applyHere = acl->bApplyHere; ma.applySubs = acl->bApplySubs; ma.inherited = false; ma.userid = acl->iUserId; ma.group = iceString(acl->qsGroup); ma.allow = acl->pAllow; ma.deny = acl->pDeny; } static void groupToGroup(const ::Group *g, Murmur::Group &mg) { mg.name = iceString(g->qsName); mg.inherit = g->bInherit; mg.inheritable = g->bInheritable; mg.add.clear(); mg.remove.clear(); mg.members.clear(); } static void banToBan(const ::Ban &b, Murmur::Ban &mb) { ::Murmur::NetAddress addr(16, 0); const Q_IPV6ADDR &a = b.haAddress.qip6; for (int i=0;i<16;++i) addr[i] = a[i]; mb.address = addr; mb.bits = b.iMask; mb.name = iceString(b.qsUsername); mb.hash = iceString(b.qsHash); mb.reason = iceString(b.qsReason); mb.start = b.qdtStart.toLocalTime().toTime_t(); mb.duration = b.iDuration; } static void banToBan(const ::Murmur::Ban &mb, ::Ban &b) { if (mb.address.size() != 16) for (int i=0;i<16;++i) b.haAddress.qip6[i] = 0; else for (int i=0;i<16;++i) b.haAddress.qip6[i] = mb.address[i]; b.iMask = mb.bits; b.qsUsername = u8(mb.name); b.qsHash = u8(mb.hash); b.qsReason = u8(mb.reason); b.qdtStart = QDateTime::fromTime_t(static_cast(mb.start)).toUTC(); b.iDuration = mb.duration; } static void infoToInfo(const QMap &info, Murmur::UserInfoMap &im) { QMap::const_iterator i; for (i = info.constBegin(); i != info.constEnd(); ++i) im[static_cast(i.key())] = iceString(i.value()); } static void infoToInfo(const Murmur::UserInfoMap &im, QMap &info) { Murmur::UserInfoMap::const_iterator i; for (i = im.begin(); i != im.end(); ++i) info.insert((*i).first, u8((*i).second)); } static void textmessageToTextmessage(const ::TextMessage &tm, Murmur::TextMessage &tmdst) { tmdst.text = iceString(tm.qsText); foreach(unsigned int i, tm.qlSessions) tmdst.sessions.push_back(i); foreach(unsigned int i, tm.qlChannels) tmdst.channels.push_back(i); foreach(unsigned int i, tm.qlTrees) tmdst.trees.push_back(i); } class ServerLocator : public virtual Ice::ServantLocator { public: virtual Ice::ObjectPtr locate(const Ice::Current &, Ice::LocalObjectPtr &); virtual void finished(const Ice::Current &, const Ice::ObjectPtr &, const Ice::LocalObjectPtr &) {}; virtual void deactivate(const std::string &) {}; }; MurmurIce::MurmurIce() { count = 0; if (meta->mp.qsIceEndpoint.isEmpty()) return; Ice::PropertiesPtr ipp = Ice::createProperties(); ::Meta::mp.qsSettings->beginGroup("Ice"); foreach(const QString &v, ::Meta::mp.qsSettings->childKeys()) { ipp->setProperty(iceString(v), iceString(::Meta::mp.qsSettings->value(v).toString())); } ::Meta::mp.qsSettings->endGroup(); Ice::PropertyDict props = ippProperties->getPropertiesForPrefix(""); Ice::PropertyDict::iterator i; for (i=props.begin(); i != props.end(); ++i) { ipp->setProperty((*i).first, (*i).second); } ipp->setProperty("Ice.ImplicitContext", "Shared"); Ice::InitializationData idd; idd.properties = ipp; try { communicator = Ice::initialize(idd); if (! meta->mp.qsIceSecretWrite.isEmpty()) { ::Ice::ImplicitContextPtr impl = communicator->getImplicitContext(); if (impl) impl->put("secret", iceString(meta->mp.qsIceSecretWrite)); } adapter = communicator->createObjectAdapterWithEndpoints("Murmur", qPrintable(meta->mp.qsIceEndpoint)); MetaPtr m = new MetaI; #if ICE_INT_VERSION >= 30700 MetaPrx mprx = MetaPrx::uncheckedCast(adapter->add(m, Ice::stringToIdentity("Meta"))); #else MetaPrx mprx = MetaPrx::uncheckedCast(adapter->add(m, communicator->stringToIdentity("Meta"))); #endif adapter->addServantLocator(new ServerLocator(), "s"); iopServer = new ServerI; adapter->activate(); foreach(const Ice::EndpointPtr ep, mprx->ice_getEndpoints()) { qWarning("MurmurIce: Endpoint \"%s\" running", qPrintable(u8(ep->toString()))); } meta->connectListener(this); } catch (Ice::Exception &e) { #if ICE_INT_VERSION >= 30700 qCritical("MurmurIce: Initialization failed: %s", qPrintable(u8(e.ice_id()))); #else qCritical("MurmurIce: Initialization failed: %s", qPrintable(u8(e.ice_name()))); #endif } } MurmurIce::~MurmurIce() { if (communicator) { communicator->shutdown(); communicator->waitForShutdown(); communicator->destroy(); communicator=NULL; qWarning("MurmurIce: Shutdown complete"); } iopServer = NULL; } void MurmurIce::customEvent(QEvent *evt) { if (evt->type() == EXEC_QEVENT) static_cast(evt)->execute(); } void MurmurIce::badMetaProxy(const ::Murmur::MetaCallbackPrx &prx) { qCritical("Ice MetaCallback %s failed", qPrintable(QString::fromStdString(communicator->proxyToString(prx)))); removeMetaCallback(prx); } void MurmurIce::badServerProxy(const ::Murmur::ServerCallbackPrx &prx, const ::Server* server) { server->log(QString("Ice ServerCallback %1 failed").arg(QString::fromStdString(communicator->proxyToString(prx)))); removeServerCallback(server, prx); } void MurmurIce::badAuthenticator(::Server *server) { server->disconnectAuthenticator(this); const ::Murmur::ServerAuthenticatorPrx &prx = qmServerAuthenticator.value(server->iServerNum); server->log(QString("Ice Authenticator %1 failed").arg(QString::fromStdString(communicator->proxyToString(prx)))); removeServerAuthenticator(server); removeServerUpdatingAuthenticator(server); } void MurmurIce::addMetaCallback(const ::Murmur::MetaCallbackPrx& prx) { if (!qlMetaCallbacks.contains(prx)) { qWarning("Added Ice MetaCallback %s", qPrintable(QString::fromStdString(communicator->proxyToString(prx)))); qlMetaCallbacks.append(prx); } } void MurmurIce::removeMetaCallback(const ::Murmur::MetaCallbackPrx& prx) { if (qlMetaCallbacks.removeAll(prx)) { qWarning("Removed Ice MetaCallback %s", qPrintable(QString::fromStdString(communicator->proxyToString(prx)))); } } void MurmurIce::addServerCallback(const ::Server* server, const ::Murmur::ServerCallbackPrx& prx) { QList< ::Murmur::ServerCallbackPrx >& cbList = qmServerCallbacks[server->iServerNum]; if (!cbList.contains(prx)) { server->log(QString("Added Ice ServerCallback %1").arg(QString::fromStdString(communicator->proxyToString(prx)))); cbList.append(prx); } } void MurmurIce::removeServerCallback(const ::Server* server, const ::Murmur::ServerCallbackPrx& prx) { if (qmServerCallbacks[server->iServerNum].removeAll(prx)) { server->log(QString("Removed Ice ServerCallback %1").arg(QString::fromStdString(communicator->proxyToString(prx)))); } } void MurmurIce::removeServerCallbacks(const ::Server* server) { if (qmServerCallbacks.contains(server->iServerNum)) { server->log(QString("Removed all Ice ServerCallbacks")); qmServerCallbacks.remove(server->iServerNum); } } void MurmurIce::addServerContextCallback(const ::Server* server, int session_id, const QString& action, const ::Murmur::ServerContextCallbackPrx& prx) { QMap& callbacks = qmServerContextCallbacks[server->iServerNum][session_id]; if (!callbacks.contains(action) || callbacks[action] != prx) { server->log(QString("Added Ice ServerContextCallback %1 for session %2, action %3").arg(QString::fromStdString(communicator->proxyToString(prx))).arg(session_id).arg(action)); callbacks.insert(action, prx); } } const QMap< int, QMap > MurmurIce::getServerContextCallbacks(const ::Server* server) const { return qmServerContextCallbacks[server->iServerNum]; } void MurmurIce::removeServerContextCallback(const ::Server* server, int session_id, const QString& action) { if (qmServerContextCallbacks[server->iServerNum][session_id].remove(action)) { server->log(QString("Removed Ice ServerContextCallback for session %1, action %2").arg(session_id).arg(action)); } } void MurmurIce::setServerAuthenticator(const ::Server* server, const ::Murmur::ServerAuthenticatorPrx& prx) { if (prx != qmServerAuthenticator[server->iServerNum]) { server->log(QString("Set Ice Authenticator to %1").arg(QString::fromStdString(communicator->proxyToString(prx)))); qmServerAuthenticator[server->iServerNum] = prx; } } const ::Murmur::ServerAuthenticatorPrx MurmurIce::getServerAuthenticator(const ::Server* server) const { return qmServerAuthenticator[server->iServerNum]; } void MurmurIce::removeServerAuthenticator(const ::Server* server) { if (qmServerAuthenticator.remove(server->iServerNum)) { server->log(QString("Removed Ice Authenticator %1").arg(QString::fromStdString(communicator->proxyToString(getServerAuthenticator(server))))); } } void MurmurIce::setServerUpdatingAuthenticator(const ::Server* server, const ::Murmur::ServerUpdatingAuthenticatorPrx& prx) { if (prx != qmServerUpdatingAuthenticator[server->iServerNum]) { server->log(QString("Set Ice UpdatingAuthenticator to %1").arg(QString::fromStdString(communicator->proxyToString(prx)))); qmServerUpdatingAuthenticator[server->iServerNum] = prx; } } const ::Murmur::ServerUpdatingAuthenticatorPrx MurmurIce::getServerUpdatingAuthenticator(const ::Server* server) const { return qmServerUpdatingAuthenticator[server->iServerNum]; } void MurmurIce::removeServerUpdatingAuthenticator(const ::Server* server) { if (qmServerUpdatingAuthenticator.contains(server->iServerNum)) { server->log(QString("Removed Ice UpdatingAuthenticator %1").arg(QString::fromStdString(communicator->proxyToString(getServerUpdatingAuthenticator(server))))); qmServerUpdatingAuthenticator.remove(server->iServerNum); } } static ServerPrx idToProxy(int id, const Ice::ObjectAdapterPtr &adapter) { Ice::Identity ident; ident.category = "s"; ident.name = iceString(QString::number(id)); return ServerPrx::uncheckedCast(adapter->createProxy(ident)); } void MurmurIce::started(::Server *s) { s->connectListener(mi); connect(s, SIGNAL(contextAction(const User *, const QString &, unsigned int, int)), this, SLOT(contextAction(const User *, const QString &, unsigned int, int))); const QList< ::Murmur::MetaCallbackPrx> &qlList = qlMetaCallbacks; if (qlList.isEmpty()) return; foreach(const ::Murmur::MetaCallbackPrx &prx, qlList) { try { prx->started(idToProxy(s->iServerNum, adapter)); } catch (...) { badMetaProxy(prx); } } } void MurmurIce::stopped(::Server *s) { removeServerCallbacks(s); removeServerAuthenticator(s); removeServerUpdatingAuthenticator(s); const QList< ::Murmur::MetaCallbackPrx> &qmList = qlMetaCallbacks; if (qmList.isEmpty()) return; foreach(const ::Murmur::MetaCallbackPrx &prx, qmList) { try { prx->stopped(idToProxy(s->iServerNum, adapter)); } catch (...) { badMetaProxy(prx); } } } void MurmurIce::userConnected(const ::User *p) { ::Server *s = qobject_cast< ::Server *> (sender()); const QList< ::Murmur::ServerCallbackPrx> &qmList = qmServerCallbacks[s->iServerNum]; if (qmList.isEmpty()) return; ::Murmur::User mp; userToUser(p, mp); foreach(const ::Murmur::ServerCallbackPrx &prx, qmList) { try { prx->userConnected(mp); } catch (...) { badServerProxy(prx, s); } } } void MurmurIce::userDisconnected(const ::User *p) { ::Server *s = qobject_cast< ::Server *> (sender()); qmServerContextCallbacks[s->iServerNum].remove(p->uiSession); const QList< ::Murmur::ServerCallbackPrx> &qmList = qmServerCallbacks[s->iServerNum]; if (qmList.isEmpty()) return; ::Murmur::User mp; userToUser(p, mp); foreach(const ::Murmur::ServerCallbackPrx &prx, qmList) { try { prx->userDisconnected(mp); } catch (...) { badServerProxy(prx, s); } } } void MurmurIce::userStateChanged(const ::User *p) { ::Server *s = qobject_cast< ::Server *> (sender()); const QList< ::Murmur::ServerCallbackPrx> &qmList = qmServerCallbacks[s->iServerNum]; if (qmList.isEmpty()) return; ::Murmur::User mp; userToUser(p, mp); foreach(const ::Murmur::ServerCallbackPrx &prx, qmList) { try { prx->userStateChanged(mp); } catch (...) { badServerProxy(prx, s); } } } void MurmurIce::userTextMessage(const ::User *p, const ::TextMessage &message) { ::Server *s = qobject_cast< ::Server *> (sender()); const QList< ::Murmur::ServerCallbackPrx> &qmList = qmServerCallbacks[s->iServerNum]; if (qmList.isEmpty()) return; ::Murmur::User mp; userToUser(p, mp); ::Murmur::TextMessage textMessage; textmessageToTextmessage(message, textMessage); foreach(const ::Murmur::ServerCallbackPrx &prx, qmList) { try { prx->userTextMessage(mp, textMessage); } catch (...) { badServerProxy(prx, s); } } } void MurmurIce::channelCreated(const ::Channel *c) { ::Server *s = qobject_cast< ::Server *> (sender()); const QList< ::Murmur::ServerCallbackPrx> &qmList = qmServerCallbacks[s->iServerNum]; if (qmList.isEmpty()) return; ::Murmur::Channel mc; channelToChannel(c, mc); foreach(const ::Murmur::ServerCallbackPrx &prx, qmList) { try { prx->channelCreated(mc); } catch (...) { badServerProxy(prx, s); } } } void MurmurIce::channelRemoved(const ::Channel *c) { ::Server *s = qobject_cast< ::Server *> (sender()); const QList< ::Murmur::ServerCallbackPrx> &qmList = qmServerCallbacks[s->iServerNum]; if (qmList.isEmpty()) return; ::Murmur::Channel mc; channelToChannel(c, mc); foreach(const ::Murmur::ServerCallbackPrx &prx, qmList) { try { prx->channelRemoved(mc); } catch (...) { badServerProxy(prx, s); } } } void MurmurIce::channelStateChanged(const ::Channel *c) { ::Server *s = qobject_cast< ::Server *> (sender()); const QList< ::Murmur::ServerCallbackPrx> &qmList = qmServerCallbacks[s->iServerNum]; if (qmList.isEmpty()) return; ::Murmur::Channel mc; channelToChannel(c, mc); foreach(const ::Murmur::ServerCallbackPrx &prx, qmList) { try { prx->channelStateChanged(mc); } catch (...) { badServerProxy(prx, s); } } } void MurmurIce::contextAction(const ::User *pSrc, const QString &action, unsigned int session, int iChannel) { ::Server *s = qobject_cast< ::Server *> (sender()); QMap > > &qmAll = qmServerContextCallbacks; if (! qmAll.contains(s->iServerNum)) return; QMap > &qmServer = qmAll[s->iServerNum]; if (! qmServer.contains(pSrc->uiSession)) return; QMap &qmUser = qmServer[pSrc->uiSession]; if (! qmUser.contains(action)) return; const ::Murmur::ServerContextCallbackPrx &prx = qmUser[action]; ::Murmur::User mp; userToUser(pSrc, mp); try { prx->contextAction(iceString(action), mp, session, iChannel); } catch (...) { s->log(QString("Ice ServerContextCallback %1 for session %2, action %3 failed").arg(QString::fromStdString(communicator->proxyToString(prx))).arg(pSrc->uiSession).arg(action)); removeServerContextCallback(s, pSrc->uiSession, action); // Remove clientside entry MumbleProto::ContextActionModify mpcam; mpcam.set_action(iceString(action)); mpcam.set_operation(MumbleProto::ContextActionModify_Operation_Remove); ServerUser *su = s->qhUsers.value(session); if (su) s->sendMessage(su, mpcam); } } void MurmurIce::idToNameSlot(QString &name, int id) { ::Server *server = qobject_cast< ::Server *> (sender()); const ServerAuthenticatorPrx prx = getServerAuthenticator(server); try { name = u8(prx->idToName(id)); } catch (...) { badAuthenticator(server); } } void MurmurIce::idToTextureSlot(QByteArray &qba, int id) { ::Server *server = qobject_cast< ::Server *> (sender()); const ServerAuthenticatorPrx prx = getServerAuthenticator(server); try { const ::Murmur::Texture &tex = prx->idToTexture(id); qba.resize(static_cast(tex.size())); char *ptr = qba.data(); for (unsigned int i=0;i (sender()); const ServerAuthenticatorPrx prx = getServerAuthenticator(server); try { id = prx->nameToId(iceString(name)); } catch (...) { badAuthenticator(server); } } void MurmurIce::authenticateSlot(int &res, QString &uname, int sessionId, const QList &certlist, const QString &certhash, bool certstrong, const QString &pw) { ::Server *server = qobject_cast< ::Server *> (sender()); const ServerAuthenticatorPrx prx = getServerAuthenticator(server); ::std::string newname; ::Murmur::GroupNameList groups; ::Murmur::CertificateList certs; certs.resize(certlist.size()); for (int i=0;iauthenticate(iceString(uname), iceString(pw), certs, iceString(certhash), certstrong, newname, groups); } catch (...) { badAuthenticator(server); } if (res >= 0) { if (newname.length() > 0) uname = u8(newname); QStringList qsl; foreach(const ::std::string &str, groups) { qsl << u8(str); } if (! qsl.isEmpty()) server->setTempGroups(res, sessionId, NULL, qsl); } } void MurmurIce::registerUserSlot(int &res, const QMap &info) { ::Server *server = qobject_cast< ::Server *> (sender()); const ServerUpdatingAuthenticatorPrx prx = getServerUpdatingAuthenticator(server); if (! prx) return; ::Murmur::UserInfoMap im; infoToInfo(info, im); try { res = prx->registerUser(im); } catch (...) { badAuthenticator(server); } } void MurmurIce::unregisterUserSlot(int &res, int id) { ::Server *server = qobject_cast< ::Server *> (sender()); const ServerUpdatingAuthenticatorPrx prx = getServerUpdatingAuthenticator(server); if (! prx) return; try { res = prx->unregisterUser(id); } catch (...) { badAuthenticator(server); } } void MurmurIce::getRegistrationSlot(int &res, int id, QMap &info) { ::Server *server = qobject_cast< ::Server *> (sender()); const ServerUpdatingAuthenticatorPrx prx = getServerUpdatingAuthenticator(server); if (! prx) return; Murmur::UserInfoMap im; try { if (prx->getInfo(id, im)) { res = 1; infoToInfo(im, info); } } catch (...) { badAuthenticator(server); return; } } void MurmurIce::getRegisteredUsersSlot(const QString &filter, QMap &m) { ::Server *server = qobject_cast< ::Server *> (sender()); const ServerUpdatingAuthenticatorPrx prx = getServerUpdatingAuthenticator(server); if (! prx) return; ::Murmur::NameMap lst; try { lst = prx->getRegisteredUsers(iceString(filter)); } catch (...) { badAuthenticator(server); return; } ::Murmur::NameMap::const_iterator i; for (i=lst.begin(); i != lst.end(); ++i) m.insert((*i).first, u8((*i).second)); } void MurmurIce::setInfoSlot(int &res, int id, const QMap &info) { ::Server *server = qobject_cast< ::Server *> (sender()); const ServerUpdatingAuthenticatorPrx prx = getServerUpdatingAuthenticator(server); if (! prx) return; Murmur::UserInfoMap im; infoToInfo(info, im); try { res = prx->setInfo(id, im); } catch (...) { badAuthenticator(server); } } void MurmurIce::setTextureSlot(int &res, int id, const QByteArray &texture) { ::Server *server = qobject_cast< ::Server *> (sender()); const ServerUpdatingAuthenticatorPrx prx = getServerUpdatingAuthenticator(server); if (! prx) return; ::Murmur::Texture tex; tex.resize(texture.size()); const char *ptr = texture.constData(); for (int i=0;isetTexture(id, tex); } catch (...) { badAuthenticator(server); } } Ice::ObjectPtr ServerLocator::locate(const Ice::Current &, Ice::LocalObjectPtr &) { return iopServer; } #define FIND_SERVER \ ::Server *server = meta->qhServers.value(server_id); #define NEED_SERVER_EXISTS \ FIND_SERVER \ if (!server && ! ServerDB::serverExists(server_id)) { \ cb->ice_exception(::Ice::ObjectNotExistException(__FILE__,__LINE__)); \ return; \ } #define NEED_SERVER \ NEED_SERVER_EXISTS \ if (! server) { \ cb->ice_exception(ServerBootedException()); \ return; \ } #define NEED_PLAYER \ ServerUser *user = server->qhUsers.value(session); \ if (!user) { \ cb->ice_exception(::Murmur::InvalidSessionException()); \ return; \ } #define NEED_CHANNEL_VAR(x,y) \ x = server->qhChannels.value(y); \ if (!x) { \ cb->ice_exception(::Murmur::InvalidChannelException()); \ return; \ } #define NEED_CHANNEL \ ::Channel *channel; \ NEED_CHANNEL_VAR(channel, channelid); void ServerI::ice_ping(const Ice::Current ¤t) const { // This is executed in the ice thread. int server_id = u8(current.id.name).toInt(); if (! ServerDB::serverExists(server_id)) throw ::Ice::ObjectNotExistException(__FILE__, __LINE__); } #define ACCESS_Server_isRunning_READ static void impl_Server_isRunning(const ::Murmur::AMD_Server_isRunningPtr cb, int server_id) { NEED_SERVER_EXISTS; cb->ice_response(server != NULL); } static void impl_Server_start(const ::Murmur::AMD_Server_startPtr cb, int server_id) { NEED_SERVER_EXISTS; if (server) cb->ice_exception(ServerBootedException()); else if (! meta->boot(server_id)) cb->ice_exception(ServerFailureException()); else cb->ice_response(); } static void impl_Server_stop(const ::Murmur::AMD_Server_stopPtr cb, int server_id) { NEED_SERVER; meta->kill(server_id); cb->ice_response(); } static void impl_Server_delete(const ::Murmur::AMD_Server_deletePtr cb, int server_id) { NEED_SERVER_EXISTS; if (server) { cb->ice_exception(ServerBootedException()); return; } ServerDB::deleteServer(server_id); cb->ice_response(); } static void impl_Server_addCallback(const Murmur::AMD_Server_addCallbackPtr cb, int server_id, const Murmur::ServerCallbackPrx& cbptr) { NEED_SERVER; try { const Murmur::ServerCallbackPrx &oneway = Murmur::ServerCallbackPrx::checkedCast(cbptr->ice_oneway()->ice_connectionCached(false)); mi->addServerCallback(server, oneway); cb->ice_response(); } catch (...) { cb->ice_exception(InvalidCallbackException()); } } static void impl_Server_removeCallback(const Murmur::AMD_Server_removeCallbackPtr cb, int server_id, const Murmur::ServerCallbackPrx& cbptr) { NEED_SERVER; try { const Murmur::ServerCallbackPrx &oneway = Murmur::ServerCallbackPrx::uncheckedCast(cbptr->ice_oneway()->ice_connectionCached(false)); mi->removeServerCallback(server, oneway); cb->ice_response(); } catch (...) { cb->ice_exception(InvalidCallbackException()); } } static void impl_Server_setAuthenticator(const ::Murmur::AMD_Server_setAuthenticatorPtr& cb, int server_id, const ::Murmur::ServerAuthenticatorPrx &aptr) { NEED_SERVER; if (mi->getServerAuthenticator(server)) server->disconnectAuthenticator(mi); ::Murmur::ServerAuthenticatorPrx prx; try { prx = ::Murmur::ServerAuthenticatorPrx::checkedCast(aptr->ice_connectionCached(false)->ice_timeout(5000)); const ::Murmur::ServerUpdatingAuthenticatorPrx uprx = ::Murmur::ServerUpdatingAuthenticatorPrx::checkedCast(prx); mi->setServerAuthenticator(server, prx); if (uprx) mi->setServerUpdatingAuthenticator(server, uprx); } catch (...) { cb->ice_exception(InvalidCallbackException()); return; } if (prx) server->connectAuthenticator(mi); cb->ice_response(); } #define ACCESS_Server_id_READ static void impl_Server_id(const ::Murmur::AMD_Server_idPtr cb, int server_id) { NEED_SERVER_EXISTS; cb->ice_response(server_id); } #define ACCESS_Server_getConf_READ static void impl_Server_getConf(const ::Murmur::AMD_Server_getConfPtr cb, int server_id, const ::std::string& key) { NEED_SERVER_EXISTS; if (key == "key" || key == "passphrase") cb->ice_exception(WriteOnlyException()); else cb->ice_response(iceString(ServerDB::getConf(server_id, u8(key)).toString())); } #define ACCESS_Server_getAllConf_READ static void impl_Server_getAllConf(const ::Murmur::AMD_Server_getAllConfPtr cb, int server_id) { NEED_SERVER_EXISTS; ::Murmur::ConfigMap cm; QMap values = ServerDB::getAllConf(server_id); QMap::const_iterator i; for (i=values.constBegin();i != values.constEnd(); ++i) { if (i.key() == "key" || i.key() == "passphrase") continue; cm[iceString(i.key())] = iceString(i.value()); } cb->ice_response(cm); } static void impl_Server_setConf(const ::Murmur::AMD_Server_setConfPtr cb, int server_id, const ::std::string& key, const ::std::string& value) { NEED_SERVER_EXISTS; QString k=u8(key); QString v=u8(value); ServerDB::setConf(server_id, k, v); if (server) server->setLiveConf(k, v); cb->ice_response(); } static void impl_Server_setSuperuserPassword(const ::Murmur::AMD_Server_setSuperuserPasswordPtr cb, int server_id, const ::std::string& pw) { NEED_SERVER_EXISTS; ServerDB::setSUPW(server_id, u8(pw)); cb->ice_response(); } #define ACCESS_Server_getLog_READ static void impl_Server_getLog(const ::Murmur::AMD_Server_getLogPtr cb, int server_id, ::Ice::Int min, ::Ice::Int max) { NEED_SERVER_EXISTS; ::Murmur::LogList ll; QList dblog = ServerDB::getLog(server_id, min, max); foreach(const ServerDB::LogRecord &e, dblog) { ::Murmur::LogEntry le; logToLog(e, le); ll.push_back(le); } cb->ice_response(ll); } #define ACCESS_Server_getLogLen_READ static void impl_Server_getLogLen(const ::Murmur::AMD_Server_getLogLenPtr cb, int server_id) { NEED_SERVER_EXISTS; int len = ServerDB::getLogLen(server_id); cb->ice_response(len); } #define ACCESS_Server_getUsers_READ static void impl_Server_getUsers(const ::Murmur::AMD_Server_getUsersPtr cb, int server_id) { NEED_SERVER; ::Murmur::UserMap pm; foreach(const ::User *p, server->qhUsers) { ::Murmur::User mp; if (static_cast(p)->sState == ::ServerUser::Authenticated) { userToUser(p, mp); pm[p->uiSession] = mp; } } cb->ice_response(pm); } #define ACCESS_Server_getChannels_READ static void impl_Server_getChannels(const ::Murmur::AMD_Server_getChannelsPtr cb, int server_id) { NEED_SERVER; ::Murmur::ChannelMap cm; foreach(const ::Channel *c, server->qhChannels) { ::Murmur::Channel mc; channelToChannel(c, mc); cm[c->iId] = mc; } cb->ice_response(cm); } static bool userSort(const ::User *a, const ::User *b) { return ::User::lessThan(a, b); } static bool channelSort(const ::Channel *a, const ::Channel *b) { return ::Channel::lessThan(a, b); } TreePtr recurseTree(const ::Channel *c) { TreePtr t = new Tree(); channelToChannel(c, t->c); QList< ::User *> users = c->qlUsers; qSort(users.begin(), users.end(), userSort); foreach(const ::User *p, users) { ::Murmur::User mp; userToUser(p, mp); t->users.push_back(mp); } QList< ::Channel *> channels = c->qlChannels; qSort(channels.begin(), channels.end(), channelSort); foreach(const ::Channel *chn, channels) { t->children.push_back(recurseTree(chn)); } return t; } #define ACCESS_Server_getTree_READ static void impl_Server_getTree(const ::Murmur::AMD_Server_getTreePtr cb, int server_id) { NEED_SERVER; cb->ice_response(recurseTree(server->qhChannels.value(0))); } #define ACCESS_Server_getCertificateList_READ static void impl_Server_getCertificateList(const ::Murmur::AMD_Server_getCertificateListPtr cb, int server_id, ::Ice::Int session) { NEED_SERVER; NEED_PLAYER; ::Murmur::CertificateList certs; const QList &certlist = user->peerCertificateChain(); certs.resize(certlist.size()); for (int i=0;iice_response(certs); } #define ACCESS_Server_getBans_READ static void impl_Server_getBans(const ::Murmur::AMD_Server_getBansPtr cb, int server_id) { NEED_SERVER; ::Murmur::BanList bl; foreach(const ::Ban &ban, server->qlBans) { ::Murmur::Ban mb; banToBan(ban, mb); bl.push_back(mb); } cb->ice_response(bl); } static void impl_Server_setBans(const ::Murmur::AMD_Server_setBansPtr cb, int server_id, const ::Murmur::BanList& bans) { NEED_SERVER; server->qlBans.clear(); foreach(const ::Murmur::Ban &mb, bans) { ::Ban ban; banToBan(mb, ban); server->qlBans << ban; } server->saveBans(); cb->ice_response(); } static void impl_Server_kickUser(const ::Murmur::AMD_Server_kickUserPtr cb, int server_id, ::Ice::Int session, const ::std::string& reason) { NEED_SERVER; NEED_PLAYER; MumbleProto::UserRemove mpur; mpur.set_session(session); mpur.set_reason(reason); server->sendAll(mpur); user->disconnectSocket(); cb->ice_response(); } static void impl_Server_sendMessage(const ::Murmur::AMD_Server_sendMessagePtr cb, int server_id, ::Ice::Int session, const ::std::string &text) { NEED_SERVER; NEED_PLAYER; server->sendTextMessage(NULL, user, false, u8(text)); cb->ice_response(); } #define ACCESS_Server_hasPermission_READ static void impl_Server_hasPermission(const ::Murmur::AMD_Server_hasPermissionPtr cb, int server_id, ::Ice::Int session, ::Ice::Int channelid, ::Ice::Int perm) { NEED_SERVER; NEED_PLAYER; NEED_CHANNEL; cb->ice_response(server->hasPermission(user, channel, static_cast(perm))); } #define ACCESS_Server_effectivePermissions_READ static void impl_Server_effectivePermissions(const ::Murmur::AMD_Server_effectivePermissionsPtr cb, int server_id, ::Ice::Int session, ::Ice::Int channelid) { NEED_SERVER; NEED_PLAYER; NEED_CHANNEL; cb->ice_response(server->effectivePermissions(user, channel)); } static void impl_Server_addContextCallback(const Murmur::AMD_Server_addContextCallbackPtr cb, int server_id, ::Ice::Int session, const ::std::string& action, const ::std::string& text, const ::Murmur::ServerContextCallbackPrx& cbptr, int ctx) { NEED_SERVER; NEED_PLAYER; const QMap& qmPrx = mi->getServerContextCallbacks(server)[session]; if (!(ctx & (MumbleProto::ContextActionModify_Context_Server | MumbleProto::ContextActionModify_Context_Channel | MumbleProto::ContextActionModify_Context_User))) { cb->ice_exception(InvalidCallbackException()); return; } try { const Murmur::ServerContextCallbackPrx &oneway = Murmur::ServerContextCallbackPrx::checkedCast(cbptr->ice_oneway()->ice_connectionCached(false)->ice_timeout(5000)); if (qmPrx.contains(u8(action))) { // Since the server has no notion of the ctx part of the context action // make sure we remove them all clientside when overriding an old callback MumbleProto::ContextActionModify mpcam; mpcam.set_action(action); mpcam.set_operation(MumbleProto::ContextActionModify_Operation_Remove); server->sendMessage(user, mpcam); } mi->addServerContextCallback(server, session, u8(action), oneway); cb->ice_response(); } catch (...) { cb->ice_exception(InvalidCallbackException()); return; } MumbleProto::ContextActionModify mpcam; mpcam.set_action(action); mpcam.set_text(text); mpcam.set_context(ctx); mpcam.set_operation(MumbleProto::ContextActionModify_Operation_Add); server->sendMessage(user, mpcam); } static void impl_Server_removeContextCallback(const Murmur::AMD_Server_removeContextCallbackPtr cb, int server_id, const Murmur::ServerContextCallbackPrx& cbptr) { NEED_SERVER; const QMap< int, QMap >& qmPrx = mi->getServerContextCallbacks(server); try { const Murmur::ServerContextCallbackPrx &oneway = Murmur::ServerContextCallbackPrx::uncheckedCast(cbptr->ice_oneway()->ice_connectionCached(false)->ice_timeout(5000)); foreach(int session, qmPrx.keys()) { ServerUser *user = server->qhUsers.value(session); const QMap &qm = qmPrx[session]; foreach(const QString &act, qm.keys(oneway)) { mi->removeServerContextCallback(server, session, act); // Ask clients to remove the clientside callbacks if (user) { MumbleProto::ContextActionModify mpcam; mpcam.set_action(iceString(act)); mpcam.set_operation(MumbleProto::ContextActionModify_Operation_Remove); server->sendMessage(user, mpcam); } } } cb->ice_response(); } catch (...) { cb->ice_exception(InvalidCallbackException()); } } #define ACCESS_Server_getState_READ static void impl_Server_getState(const ::Murmur::AMD_Server_getStatePtr cb, int server_id, ::Ice::Int session) { NEED_SERVER; NEED_PLAYER; ::Murmur::User mp; userToUser(user, mp); cb->ice_response(mp); } static void impl_Server_setState(const ::Murmur::AMD_Server_setStatePtr cb, int server_id, const ::Murmur::User& state) { int session = state.session; ::Channel *channel; NEED_SERVER; NEED_PLAYER; NEED_CHANNEL_VAR(channel, state.channel); server->setUserState(user, channel, state.mute, state.deaf, state.suppress, state.prioritySpeaker, u8(state.name), u8(state.comment)); cb->ice_response(); } static void impl_Server_sendMessageChannel(const ::Murmur::AMD_Server_sendMessageChannelPtr cb, int server_id, ::Ice::Int channelid, bool tree, const ::std::string &text) { NEED_SERVER; NEED_CHANNEL; server->sendTextMessage(channel, NULL, tree, u8(text)); cb->ice_response(); } #define ACCESS_Server_getChannelState_READ static void impl_Server_getChannelState(const ::Murmur::AMD_Server_getChannelStatePtr cb, int server_id, ::Ice::Int channelid) { NEED_SERVER; NEED_CHANNEL; ::Murmur::Channel mc; channelToChannel(channel, mc); cb->ice_response(mc); } static void impl_Server_setChannelState(const ::Murmur::AMD_Server_setChannelStatePtr cb, int server_id, const ::Murmur::Channel& state) { int channelid = state.id; NEED_SERVER; NEED_CHANNEL; ::Channel *np = NULL; if (channel->iId != 0) { NEED_CHANNEL_VAR(np, state.parent); } QString qsName = u8(state.name); QSet< ::Channel *> newset; foreach(int linkid, state.links) { ::Channel *cLink; NEED_CHANNEL_VAR(cLink, linkid); newset << cLink; } if (!server->canNest(np, channel)) { cb->ice_exception(::Murmur::NestingLimitException()); return; } if (! server->setChannelState(channel, np, qsName, newset, u8(state.description), state.position)) cb->ice_exception(::Murmur::InvalidChannelException()); else cb->ice_response(); } static void impl_Server_removeChannel(const ::Murmur::AMD_Server_removeChannelPtr cb, int server_id, ::Ice::Int channelid) { NEED_SERVER; NEED_CHANNEL; if (!channel->cParent) { cb->ice_exception(::Murmur::InvalidChannelException()); } else { server->removeChannel(channel); cb->ice_response(); } } static void impl_Server_addChannel(const ::Murmur::AMD_Server_addChannelPtr cb, int server_id, const ::std::string& name, ::Ice::Int parent) { NEED_SERVER; ::Channel *p, *nc; NEED_CHANNEL_VAR(p, parent); if (!server->canNest(p)) { cb->ice_exception(::Murmur::NestingLimitException()); return; } QString qsName = u8(name); nc = server->addChannel(p, qsName); server->updateChannel(nc); int newid = nc->iId; MumbleProto::ChannelState mpcs; mpcs.set_channel_id(newid); mpcs.set_parent(parent); mpcs.set_name(name); server->sendAll(mpcs); cb->ice_response(newid); } #define ACCESS_Server_getACL_READ static void impl_Server_getACL(const ::Murmur::AMD_Server_getACLPtr cb, int server_id, ::Ice::Int channelid) { NEED_SERVER; NEED_CHANNEL; ::Murmur::ACLList acls; ::Murmur::GroupList groups; QStack< ::Channel *> chans; ::Channel *p; ChanACL *acl; p = channel; while (p) { chans.push(p); if ((p == channel) || (p->bInheritACL)) p = p->cParent; else p = NULL; } bool inherit = channel->bInheritACL; while (! chans.isEmpty()) { p = chans.pop(); foreach(acl, p->qlACL) { if ((p==channel) || (acl->bApplySubs)) { ::Murmur::ACL ma; ACLtoACL(acl, ma); if (p != channel) ma.inherited = true; acls.push_back(ma); } } } p = channel->cParent; const QSet allnames = ::Group::groupNames(channel); foreach(const QString &name, allnames) { ::Group *g = channel->qhGroups.value(name); ::Group *pg = p ? ::Group::getGroup(p, name) : NULL; if (!g && ! pg) continue; ::Murmur::Group mg; groupToGroup(g ? g : pg, mg); QSet members; if (pg) members = pg->members(); if (g) { mg.add = g->qsAdd.toList().toVector().toStdVector(); mg.remove = g->qsRemove.toList().toVector().toStdVector(); mg.inherited = false; members += g->qsAdd; members -= g->qsRemove; } else { mg.inherited = true; } mg.members = members.toList().toVector().toStdVector(); groups.push_back(mg); } cb->ice_response(acls, groups, inherit); } static void impl_Server_setACL(const ::Murmur::AMD_Server_setACLPtr cb, int server_id, ::Ice::Int channelid, const ::Murmur::ACLList& acls, const ::Murmur::GroupList& groups, bool inherit) { NEED_SERVER; NEED_CHANNEL; ::Group *g; ChanACL *acl; QHash > hOldTemp; foreach(g, channel->qhGroups) { hOldTemp.insert(g->qsName, g->qsTemporary); delete g; } foreach(acl, channel->qlACL) delete acl; channel->qhGroups.clear(); channel->qlACL.clear(); channel->bInheritACL = inherit; foreach(const ::Murmur::Group &gi, groups) { QString name = u8(gi.name); g = new ::Group(channel, name); g->bInherit = gi.inherit; g->bInheritable = gi.inheritable; g->qsAdd = QVector::fromStdVector(gi.add).toList().toSet(); g->qsRemove = QVector::fromStdVector(gi.remove).toList().toSet(); g->qsTemporary = hOldTemp.value(name); } foreach(const ::Murmur::ACL &ai, acls) { acl = new ChanACL(channel); acl->bApplyHere = ai.applyHere; acl->bApplySubs = ai.applySubs; acl->iUserId = ai.userid; acl->qsGroup = u8(ai.group); acl->pDeny = static_cast(ai.deny) & ChanACL::All; acl->pAllow = static_cast(ai.allow) & ChanACL::All; } server->clearACLCache(); server->updateChannel(channel); cb->ice_response(); } #define ACCESS_Server_getUserNames_READ static void impl_Server_getUserNames(const ::Murmur::AMD_Server_getUserNamesPtr cb, int server_id, const ::Murmur::IdList& ids) { NEED_SERVER; ::Murmur::NameMap nm; foreach(int userid, ids) { nm[userid] = iceString(server->getUserName(userid)); } cb->ice_response(nm); } #define ACCESS_Server_getUserIds_READ static void impl_Server_getUserIds(const ::Murmur::AMD_Server_getUserIdsPtr cb, int server_id, const ::Murmur::NameList& names) { NEED_SERVER; ::Murmur::IdMap im; foreach(const string &n, names) { QString name = u8(n); im[n] = server->getUserID(name); } cb->ice_response(im); } static void impl_Server_registerUser(const ::Murmur::AMD_Server_registerUserPtr cb, int server_id, const ::Murmur::UserInfoMap &im) { NEED_SERVER; QMap info; infoToInfo(im, info); int userid = server->registerUser(info); if (userid < 0) cb->ice_exception(InvalidUserException()); else cb->ice_response(userid); } static void impl_Server_unregisterUser(const ::Murmur::AMD_Server_unregisterUserPtr cb, int server_id, ::Ice::Int userid) { NEED_SERVER; if (! server->unregisterUser(userid)) cb->ice_exception(InvalidUserException()); else cb->ice_response(); } static void impl_Server_updateRegistration(const ::Murmur::AMD_Server_updateRegistrationPtr cb, int server_id, int id, const ::Murmur::UserInfoMap &im) { NEED_SERVER; if (! server->isUserId(id)) { cb->ice_exception(InvalidUserException()); return; } QMap info; infoToInfo(im, info); if (! server->setInfo(id, info)) { cb->ice_exception(InvalidUserException()); return; } if (info.contains(ServerDB::User_Comment)) { foreach(ServerUser *u, server->qhUsers) { if (u->iId == id) server->setUserState(u, u->cChannel, u->bMute, u->bDeaf, u->bSuppress, u->bPrioritySpeaker, u->qsName, info.value(ServerDB::User_Comment)); } } cb->ice_response(); } #define ACCESS_Server_getRegistration_READ static void impl_Server_getRegistration(const ::Murmur::AMD_Server_getRegistrationPtr cb, int server_id, ::Ice::Int userid) { NEED_SERVER; QMap info = server->getRegistration(userid); if (info.isEmpty()) { cb->ice_exception(InvalidUserException()); return; } Murmur::UserInfoMap im; infoToInfo(info, im); cb->ice_response(im); } #define ACCESS_Server_getRegisteredUsers_READ static void impl_Server_getRegisteredUsers(const ::Murmur::AMD_Server_getRegisteredUsersPtr cb, int server_id, const ::std::string& filter) { NEED_SERVER; Murmur::NameMap rpl; const QMap l = server->getRegisteredUsers(u8(filter)); QMap::const_iterator i; for (i = l.constBegin(); i != l.constEnd(); ++i) { rpl[i.key()] = u8(i.value()); } cb->ice_response(rpl); } #define ACCESS_Server_verifyPassword_READ static void impl_Server_verifyPassword(const ::Murmur::AMD_Server_verifyPasswordPtr cb, int server_id, const ::std::string& name, const ::std::string& pw) { NEED_SERVER; QString uname = u8(name); cb->ice_response(server->authenticate(uname, u8(pw))); } #define ACCESS_Server_getTexture_READ static void impl_Server_getTexture(const ::Murmur::AMD_Server_getTexturePtr cb, int server_id, ::Ice::Int userid) { NEED_SERVER; if (! server->isUserId(userid)) { cb->ice_exception(InvalidUserException()); return; } const QByteArray &qba = server->getUserTexture(userid); ::Murmur::Texture tex; tex.resize(qba.size()); const char *ptr = qba.constData(); for (int i=0;iice_response(tex); } static void impl_Server_setTexture(const ::Murmur::AMD_Server_setTexturePtr cb, int server_id, ::Ice::Int userid, const ::Murmur::Texture& tex) { NEED_SERVER; if (! server->isUserId(userid)) { cb->ice_exception(InvalidUserException()); return; } QByteArray qba(static_cast(tex.size()), 0); char *ptr = qba.data(); for (unsigned int i=0;isetTexture(userid, qba)) { cb->ice_exception(InvalidTextureException()); } else { ServerUser *user = server->qhUsers.value(userid); if (user) { MumbleProto::UserState mpus; mpus.set_session(user->uiSession); mpus.set_texture(blob(user->qbaTexture)); server->sendAll(mpus, ~0x010202); if (! user->qbaTextureHash.isEmpty()) { mpus.clear_texture(); mpus.set_texture_hash(blob(user->qbaTextureHash)); } server->sendAll(mpus, 0x010202); } cb->ice_response(); } } #define ACCESS_Server_getUptime_READ static void impl_Server_getUptime(const ::Murmur::AMD_Server_getUptimePtr cb, int server_id) { NEED_SERVER; cb->ice_response(static_cast(server->tUptime.elapsed()/1000000LL)); } static void impl_Server_updateCertificate(const ::Murmur::AMD_Server_updateCertificatePtr cb, int server_id, const ::std::string& certificate, const ::std::string& privateKey, const ::std::string& passphrase) { NEED_SERVER; QByteArray certPem(certificate.c_str()); QByteArray privateKeyPem(privateKey.c_str()); QByteArray passphraseBytes(passphrase.c_str()); // Verify that we can load the certificate. QSslCertificate cert(certPem); if (cert.isNull()) { ERR_clear_error(); cb->ice_exception(InvalidInputDataException()); return; } // Verify that we can load the private key. QSslKey privKey = ::Server::privateKeyFromPEM(privateKeyPem, passphraseBytes); if (privKey.isNull()) { ERR_clear_error(); cb->ice_exception(InvalidInputDataException()); return; } // Ensure that the private key is usable with the given // certificate. if (!::Server::isKeyForCert(privKey, cert)) { ERR_clear_error(); cb->ice_exception(InvalidInputDataException()); return; } // All our sanity checks passed. // The certificate and private key are usable, so // update the server to use them. server->setConf("certificate", u8(certificate)); server->setConf("key", u8(privateKey)); server->setConf("passphrase", u8(passphrase)); server->initializeCert(); cb->ice_response(); } static void impl_Server_addUserToGroup(const ::Murmur::AMD_Server_addUserToGroupPtr cb, int server_id, ::Ice::Int channelid, ::Ice::Int session, const ::std::string& group) { NEED_SERVER; NEED_PLAYER; NEED_CHANNEL; QString qsgroup = u8(group); if (qsgroup.isEmpty()) { cb->ice_exception(InvalidChannelException()); return; } { QWriteLocker wl(&server->qrwlVoiceThread); ::Group *g = channel->qhGroups.value(qsgroup); if (! g) g = new ::Group(channel, qsgroup); g->qsTemporary.insert(- session); } server->clearACLCache(user); cb->ice_response(); } static void impl_Server_removeUserFromGroup(const ::Murmur::AMD_Server_removeUserFromGroupPtr cb, int server_id, ::Ice::Int channelid, ::Ice::Int session, const ::std::string& group) { NEED_SERVER; NEED_PLAYER; NEED_CHANNEL; QString qsgroup = u8(group); if (qsgroup.isEmpty()) { cb->ice_exception(InvalidChannelException()); return; } { QWriteLocker qrwl(&server->qrwlVoiceThread); ::Group *g = channel->qhGroups.value(qsgroup); if (!g) g = new ::Group(channel, qsgroup); g->qsTemporary.remove(-session); } server->clearACLCache(user); cb->ice_response(); } static void impl_Server_redirectWhisperGroup(const ::Murmur::AMD_Server_redirectWhisperGroupPtr cb, int server_id, ::Ice::Int session, const ::std::string& source, const ::std::string& target) { NEED_SERVER; NEED_PLAYER; QString qssource = u8(source); QString qstarget = u8(target); { QWriteLocker wl(&server->qrwlVoiceThread); if (qstarget.isEmpty()) user->qmWhisperRedirect.remove(qssource); else user->qmWhisperRedirect.insert(qssource, qstarget); } server->clearACLCache(user); cb->ice_response(); } #define ACCESS_Meta_getSliceChecksums_ALL static void impl_Meta_getSliceChecksums(const ::Murmur::AMD_Meta_getSliceChecksumsPtr cb, const Ice::ObjectAdapterPtr) { cb->ice_response(::Ice::sliceChecksums()); } #define ACCESS_Meta_getServer_READ static void impl_Meta_getServer(const ::Murmur::AMD_Meta_getServerPtr cb, const Ice::ObjectAdapterPtr adapter, ::Ice::Int id) { QList server_list = ServerDB::getAllServers(); if (! server_list.contains(id)) cb->ice_response(NULL); else cb->ice_response(idToProxy(id, adapter)); } static void impl_Meta_newServer(const ::Murmur::AMD_Meta_newServerPtr cb, const Ice::ObjectAdapterPtr adapter) { cb->ice_response(idToProxy(ServerDB::addServer(), adapter)); } #define ACCESS_Meta_getAllServers_READ static void impl_Meta_getAllServers(const ::Murmur::AMD_Meta_getAllServersPtr cb, const Ice::ObjectAdapterPtr adapter) { ::Murmur::ServerList sl; foreach(int id, ServerDB::getAllServers()) sl.push_back(idToProxy(id, adapter)); cb->ice_response(sl); } #define ACCESS_Meta_getDefaultConf_READ static void impl_Meta_getDefaultConf(const ::Murmur::AMD_Meta_getDefaultConfPtr cb, const Ice::ObjectAdapterPtr) { ::Murmur::ConfigMap cm; QMap::const_iterator i; for (i=meta->mp.qmConfig.constBegin();i != meta->mp.qmConfig.constEnd(); ++i) { if (i.key() == "key" || i.key() == "passphrase") continue; cm[iceString(i.key())] = iceString(i.value()); } cb->ice_response(cm); } #define ACCESS_Meta_getBootedServers_READ static void impl_Meta_getBootedServers(const ::Murmur::AMD_Meta_getBootedServersPtr cb, const Ice::ObjectAdapterPtr adapter) { ::Murmur::ServerList sl; foreach(int id, meta->qhServers.keys()) sl.push_back(idToProxy(id, adapter)); cb->ice_response(sl); } #define ACCESS_Meta_getVersion_ALL static void impl_Meta_getVersion(const ::Murmur::AMD_Meta_getVersionPtr cb, const Ice::ObjectAdapterPtr) { int major, minor, patch; QString txt; ::Meta::getVersion(major, minor, patch, txt); cb->ice_response(major, minor, patch, iceString(txt)); } static void impl_Meta_addCallback(const Murmur::AMD_Meta_addCallbackPtr cb, const Ice::ObjectAdapterPtr, const Murmur::MetaCallbackPrx& cbptr) { try { const Murmur::MetaCallbackPrx &oneway = Murmur::MetaCallbackPrx::checkedCast(cbptr->ice_oneway()->ice_connectionCached(false)->ice_timeout(5000)); mi->addMetaCallback(oneway); cb->ice_response(); } catch (...) { cb->ice_exception(InvalidCallbackException()); } } static void impl_Meta_removeCallback(const Murmur::AMD_Meta_removeCallbackPtr cb, const Ice::ObjectAdapterPtr, const Murmur::MetaCallbackPrx& cbptr) { try { const Murmur::MetaCallbackPrx &oneway = Murmur::MetaCallbackPrx::uncheckedCast(cbptr->ice_oneway()->ice_connectionCached(false)->ice_timeout(5000)); mi->removeMetaCallback(oneway); cb->ice_response(); } catch (...) { cb->ice_exception(InvalidCallbackException()); } } #define ACCESS_Meta_getUptime_ALL static void impl_Meta_getUptime(const ::Murmur::AMD_Meta_getUptimePtr cb, const Ice::ObjectAdapterPtr) { cb->ice_response(static_cast(meta->tUptime.elapsed()/1000000LL)); } #include "MurmurIceWrapper.cpp" mumble-1.3.4/src/murmur/ServerUser.cpp0000664000175000017500000001317014010707274017573 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "murmur_pch.h" #include "Server.h" #include "ServerUser.h" #include "Meta.h" ServerUser::ServerUser(Server *p, QSslSocket *socket) : Connection(p, socket), User(), s(NULL), leakyBucket(p->iMessageLimit, p->iMessageBurst) { sState = ServerUser::Connected; sUdpSocket = INVALID_SOCKET; memset(&saiUdpAddress, 0, sizeof(saiUdpAddress)); memset(&saiTcpLocalAddress, 0, sizeof(saiTcpLocalAddress)); dUDPPingAvg = dUDPPingVar = 0.0f; dTCPPingAvg = dTCPPingVar = 0.0f; uiUDPPackets = uiTCPPackets = 0; aiUdpFlag = 1; uiVersion = 0; bVerified = true; iLastPermissionCheck = -1; bOpus = false; } ServerUser::operator QString() const { return QString::fromLatin1("%1:%2(%3)").arg(qsName).arg(uiSession).arg(iId); } BandwidthRecord::BandwidthRecord() { iRecNum = 0; iSum = 0; for (int i=0;i((nsum * 1000000LL) / elapsed); if (bw > maxpersec) return false; a_iBW[iRecNum] = static_cast(size); a_qtWhen[iRecNum].restart(); iSum = nsum; iRecNum++; if (iRecNum == N_BANDWIDTH_SLOTS) iRecNum = 0; return true; } int BandwidthRecord::onlineSeconds() const { QMutexLocker ml(&qmMutex); return static_cast(tFirst.elapsed() / 1000000LL); } int BandwidthRecord::idleSeconds() const { QMutexLocker ml(&qmMutex); quint64 iIdle = a_qtWhen[(iRecNum + N_BANDWIDTH_SLOTS - 1) % N_BANDWIDTH_SLOTS].elapsed(); if (tIdleControl.elapsed() < iIdle) iIdle = tIdleControl.elapsed(); return static_cast(iIdle / 1000000LL); } void BandwidthRecord::resetIdleSeconds() { QMutexLocker ml(&qmMutex); tIdleControl.restart(); } int BandwidthRecord::bandwidth() const { QMutexLocker ml(&qmMutex); int sum = 0; int records = 0; quint64 elapsed = 0ULL; for (int i=1;i 1000000ULL) { break; } else { ++records; sum += a_iBW[idx]; elapsed = e; } } if (elapsed < 250000ULL) return 0; return static_cast((sum * 1000000ULL) / elapsed); } LeakyBucket::LeakyBucket(unsigned int tokensPerSec, unsigned int maxTokens) : m_tokensPerSec(tokensPerSec), m_maxTokens(maxTokens), m_currentTokens(0), m_timer() { m_timer.start(); if (!QElapsedTimer::isMonotonic()) { qFatal("Non-monotonic clocks are not reliable enough and lead to issues as " "https://github.com/mumble-voip/mumble/issues/3985. " "This is a serious issue and should be reported!"); } } bool LeakyBucket::ratelimit(int tokens) { // First remove tokens we leaked over time const qint64 elapsedMillis = m_timer.elapsed(); if (elapsedMillis < 0) { if (m_timer.isValid()) { // By definition of a monotinic clock, this shouldn't be possible to happen. // Thus if it does happen there's somthing going very wrong which is why we // emit the qFatal which at the state this line here was added, will crash // the server. But at least that guarantees to give us a report on the crash // instead of obscure reports about the rate limiter causing all sorts of // weird issues. qFatal("ServerUser.cpp: Monotonic timer returned negative elapsed time!"); // In case the implementation changes and qFatal no longer crashes the server, // we'll restart the timer but limit the message. m_timer.restart(); return true; } else { // For some reason the timer is in an invalid state. This shouldn't happen // as we start it in the constructor, but in case it does, we log the error // and reset the timer and the tokens as a fail-safe. We also won't limit // in this case as a potential limit is based on an invalid timer. That's // not what we want. qCritical("ServerUser.cpp: Monotonic timer is invalid!"); m_timer.restart(); m_currentTokens = 0; return false; } } const qint64 drainTokens = (elapsedMillis * m_tokensPerSec) / 1000; // Only restart the timer if enough time has elapsed so whe drain at least // a single token. If we were to restart the timer every time, even if the // interval between the calls to this function is so small that we don't // drain a token, we can end up in a situation in which we will never drain // a token even if let's say by the time this function is called the second // time we would have to drain a single token (over the course of both function // calls, but each function call individually wouldn't drain a token). if (drainTokens > 0) { m_timer.restart(); } // Make sure that m_currentTokens never gets less than 0 by draining if (static_cast(m_currentTokens) < drainTokens) { m_currentTokens = 0; } else { m_currentTokens -= drainTokens; } // Now that the tokens have been updated to reflect the constant drain caused by // the imaginary leaking bucket, we can check whether the given amount of tokens // still fit in this imaginary bucket (and thus the corresponding message may pass) // or if it doesn't (and thus the message will be limited (rejected)) bool limit = m_currentTokens > ((static_cast(m_maxTokens)) - tokens); // If the bucket is not overflowed, allow message and add tokens if (!limit) { m_currentTokens += tokens; } return limit; } mumble-1.3.4/src/murmur/Messages.cpp0000664000175000017500000014165714010707274017251 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "murmur_pch.h" #include "User.h" #include "Channel.h" #include "ACL.h" #include "Group.h" #include "Message.h" #include "ServerDB.h" #include "Connection.h" #include "Server.h" #include "ServerUser.h" #include "Version.h" #include "CryptState.h" #define RATELIMIT(user) \ if (user->leakyBucket.ratelimit(1)) { \ return; \ } #define MSG_SETUP(st) \ if (uSource->sState != st) { \ return; \ } \ uSource->bwr.resetIdleSeconds() #define MSG_SETUP_NO_UNIDLE(st) \ if (uSource->sState != st) \ return #define VICTIM_SETUP \ ServerUser *pDstServerUser = uSource; \ if (msg.has_session()) \ pDstServerUser = qhUsers.value(msg.session()); \ if (! pDstServerUser) \ return; \ Q_UNUSED(pDstServerUser) #define PERM_DENIED(who, where, what) \ { \ MumbleProto::PermissionDenied mppd; \ mppd.set_permission(static_cast(what)); \ mppd.set_channel_id(where->iId); \ mppd.set_session(who->uiSession); \ mppd.set_type(MumbleProto::PermissionDenied_DenyType_Permission); \ sendMessage(uSource, mppd); \ log(uSource, QString("%1 not allowed to %2 in %3").arg(who->qsName).arg(ChanACL::permName(what)).arg(where->qsName)); \ } #define PERM_DENIED_TYPE(type) \ { \ MumbleProto::PermissionDenied mppd; \ mppd.set_type(MumbleProto::PermissionDenied_DenyType_##type); \ sendMessage(uSource, mppd); \ } #define PERM_DENIED_FALLBACK(type,version,text) \ { \ MumbleProto::PermissionDenied mppd; \ mppd.set_type(MumbleProto::PermissionDenied_DenyType_##type); \ if (uSource->uiVersion < version) \ mppd.set_reason(u8(text)); \ sendMessage(uSource, mppd); \ } #define PERM_DENIED_HASH(user) \ { \ MumbleProto::PermissionDenied mppd; \ mppd.set_type(MumbleProto::PermissionDenied_DenyType_MissingCertificate); \ if (user) \ mppd.set_session(user->uiSession); \ sendMessage(uSource, mppd); \ } void Server::msgAuthenticate(ServerUser *uSource, MumbleProto::Authenticate &msg) { if ((msg.tokens_size() > 0) || (uSource->sState == ServerUser::Authenticated)) { QStringList qsl; for (int i=0;iqslAccessTokens = qsl; } clearACLCache(uSource); } MSG_SETUP(ServerUser::Connected); Channel *root = qhChannels.value(0); Channel *c; uSource->qsName = u8(msg.username()); bool ok = false; bool nameok = validateUserName(uSource->qsName); QString pw = u8(msg.password()); // Fetch ID and stored username. // Since this may call DBus, which may recall our dbus messages, this function needs // to support re-entrancy, and also to support the fact that sessions may go away. int id = authenticate(uSource->qsName, pw, uSource->uiSession, uSource->qslEmail, uSource->qsHash, uSource->bVerified, uSource->peerCertificateChain()); uSource->iId = id >= 0 ? id : -1; QString reason; MumbleProto::Reject_RejectType rtType = MumbleProto::Reject_RejectType_None; if (id==-2 && ! nameok) { reason = "Invalid username"; rtType = MumbleProto::Reject_RejectType_InvalidUsername; } else if (id==-1) { reason = "Wrong certificate or password for existing user"; rtType = MumbleProto::Reject_RejectType_WrongUserPW; } else if (id==-2 && ! qsPassword.isEmpty() && qsPassword != pw) { reason = "Invalid server password"; rtType = MumbleProto::Reject_RejectType_WrongServerPW; } else if (id==-3) { reason = "Your account information can not be verified currently. Please try again later"; rtType = MumbleProto::Reject_RejectType_AuthenticatorFail; } else { ok = true; } ServerUser *uOld = NULL; foreach(ServerUser *u, qhUsers) { if (u == uSource) continue; if (((u->iId>=0) && (u->iId == uSource->iId)) || (u->qsName.toLower() == uSource->qsName.toLower())) { uOld = u; break; } } // Allow reuse of name from same IP if (ok && uOld && (uSource->iId == -1)) { if ((uOld->peerAddress() != uSource->peerAddress()) && (uSource->qsHash.isEmpty() || (uSource->qsHash != uOld->qsHash))) { reason = "Username already in use"; rtType = MumbleProto::Reject_RejectType_UsernameInUse; ok = false; } } if ((id != 0) && (qhUsers.count() > iMaxUsers)) { reason = QString::fromLatin1("Server is full (max %1 users)").arg(iMaxUsers); rtType = MumbleProto::Reject_RejectType_ServerFull; ok = false; } if ((id != 0) && (uSource->qsHash.isEmpty() && bCertRequired)) { reason = QString::fromLatin1("A certificate is required to connect to this server"); rtType = MumbleProto::Reject_RejectType_NoCertificate; ok = false; } Channel *lc; if (bRememberChan) { lc = qhChannels.value(readLastChannel(uSource->iId)); } else { lc = qhChannels.value(iDefaultChan); } if (! lc || ! hasPermission(uSource, lc, ChanACL::Enter) || isChannelFull(lc, uSource)) { lc = qhChannels.value(iDefaultChan); if (! lc || ! hasPermission(uSource, lc, ChanACL::Enter) || isChannelFull(lc, uSource)) { lc = root; if (isChannelFull(lc, uSource)) { reason = QString::fromLatin1("Server channels are full"); rtType = MumbleProto::Reject_RejectType_ServerFull; ok = false; } } } if (! ok) { log(uSource, QString("Rejected connection from %1: %2") .arg(addressToString(uSource->peerAddress(), uSource->peerPort()), reason)); MumbleProto::Reject mpr; mpr.set_reason(u8(reason)); mpr.set_type(rtType); sendMessage(uSource, mpr); uSource->disconnectSocket(); return; } startThread(); // Kick ghost if (uOld) { log(uSource, "Disconnecting ghost"); MumbleProto::UserRemove mpur; mpur.set_session(uOld->uiSession); mpur.set_reason("You connected to the server from another device"); sendMessage(uOld, mpur); uOld->forceFlush(); uOld->disconnectSocket(true); } // Setup UDP encryption { QMutexLocker l(&uSource->qmCrypt); uSource->csCrypt.genKey(); MumbleProto::CryptSetup mpcrypt; mpcrypt.set_key(std::string(reinterpret_cast(uSource->csCrypt.raw_key), AES_KEY_SIZE_BYTES)); mpcrypt.set_server_nonce(std::string(reinterpret_cast(uSource->csCrypt.encrypt_iv), AES_BLOCK_SIZE)); mpcrypt.set_client_nonce(std::string(reinterpret_cast(uSource->csCrypt.decrypt_iv), AES_BLOCK_SIZE)); sendMessage(uSource, mpcrypt); } bool fake_celt_support = false; if (msg.celt_versions_size() > 0) { for (int i=0;i < msg.celt_versions_size(); ++i) uSource->qlCodecs.append(msg.celt_versions(i)); } else { uSource->qlCodecs.append(static_cast(0x8000000b)); fake_celt_support = true; } uSource->bOpus = msg.opus(); recheckCodecVersions(uSource); MumbleProto::CodecVersion mpcv; mpcv.set_alpha(iCodecAlpha); mpcv.set_beta(iCodecBeta); mpcv.set_prefer_alpha(bPreferAlpha); mpcv.set_opus(bOpus); sendMessage(uSource, mpcv); if (!bOpus && uSource->bOpus && fake_celt_support) { sendTextMessage(NULL, uSource, false, QLatin1String("WARNING: Your client doesn't support the CELT codec, you won't be able to talk to or hear most clients. Please make sure your client was built with CELT support.")); } // Transmit channel tree QQueue q; QSet chans; q << root; MumbleProto::ChannelState mpcs; while (! q.isEmpty()) { c = q.dequeue(); chans.insert(c); mpcs.Clear(); mpcs.set_channel_id(c->iId); if (c->cParent) mpcs.set_parent(c->cParent->iId); if (c->iId == 0) mpcs.set_name(u8(qsRegName.isEmpty() ? QLatin1String("Root") : qsRegName)); else mpcs.set_name(u8(c->qsName)); mpcs.set_position(c->iPosition); if ((uSource->uiVersion >= 0x010202) && ! c->qbaDescHash.isEmpty()) mpcs.set_description_hash(blob(c->qbaDescHash)); else if (! c->qsDesc.isEmpty()) mpcs.set_description(u8(c->qsDesc)); mpcs.set_max_users(c->uiMaxUsers); sendMessage(uSource, mpcs); foreach(c, c->qlChannels) q.enqueue(c); } // Transmit links foreach(c, chans) { if (c->qhLinks.count() > 0) { mpcs.Clear(); mpcs.set_channel_id(c->iId); foreach(Channel *l, c->qhLinks.keys()) mpcs.add_links(l->iId); sendMessage(uSource, mpcs); } } // Transmit user profile MumbleProto::UserState mpus; userEnterChannel(uSource, lc, mpus); { QWriteLocker wl(&qrwlVoiceThread); uSource->sState = ServerUser::Authenticated; } mpus.set_session(uSource->uiSession); mpus.set_name(u8(uSource->qsName)); if (uSource->iId >= 0) { mpus.set_user_id(uSource->iId); hashAssign(uSource->qbaTexture, uSource->qbaTextureHash, getUserTexture(uSource->iId)); if (! uSource->qbaTextureHash.isEmpty()) mpus.set_texture_hash(blob(uSource->qbaTextureHash)); else if (! uSource->qbaTexture.isEmpty()) mpus.set_texture(blob(uSource->qbaTexture)); const QMap &info = getRegistration(uSource->iId); if (info.contains(ServerDB::User_Comment)) { hashAssign(uSource->qsComment, uSource->qbaCommentHash, info.value(ServerDB::User_Comment)); if (! uSource->qbaCommentHash.isEmpty()) mpus.set_comment_hash(blob(uSource->qbaCommentHash)); else if (! uSource->qsComment.isEmpty()) mpus.set_comment(u8(uSource->qsComment)); } } if (! uSource->qsHash.isEmpty()) mpus.set_hash(u8(uSource->qsHash)); if (uSource->cChannel->iId != 0) mpus.set_channel_id(uSource->cChannel->iId); sendAll(mpus, 0x010202); if ((uSource->qbaTexture.length() >= 4) && (qFromBigEndian(reinterpret_cast(uSource->qbaTexture.constData())) == 600 * 60 * 4)) mpus.set_texture(blob(uSource->qbaTexture)); if (! uSource->qsComment.isEmpty()) mpus.set_comment(u8(uSource->qsComment)); sendAll(mpus, ~ 0x010202); // Transmit other users profiles foreach(ServerUser *u, qhUsers) { if (u->sState != ServerUser::Authenticated) continue; if (u == uSource) continue; mpus.Clear(); mpus.set_session(u->uiSession); mpus.set_name(u8(u->qsName)); if (u->iId >= 0) mpus.set_user_id(u->iId); if (uSource->uiVersion >= 0x010202) { if (! u->qbaTextureHash.isEmpty()) mpus.set_texture_hash(blob(u->qbaTextureHash)); else if (! u->qbaTexture.isEmpty()) mpus.set_texture(blob(u->qbaTexture)); } else if ((uSource->qbaTexture.length() >= 4) && (qFromBigEndian(reinterpret_cast(uSource->qbaTexture.constData())) == 600 * 60 * 4)) { mpus.set_texture(blob(u->qbaTexture)); } if (u->cChannel->iId != 0) mpus.set_channel_id(u->cChannel->iId); if (u->bDeaf) mpus.set_deaf(true); else if (u->bMute) mpus.set_mute(true); if (u->bSuppress) mpus.set_suppress(true); if (u->bPrioritySpeaker) mpus.set_priority_speaker(true); if (u->bRecording) mpus.set_recording(true); if (u->bSelfDeaf) mpus.set_self_deaf(true); else if (u->bSelfMute) mpus.set_self_mute(true); if ((uSource->uiVersion >= 0x010202) && ! u->qbaCommentHash.isEmpty()) mpus.set_comment_hash(blob(u->qbaCommentHash)); else if (! u->qsComment.isEmpty()) mpus.set_comment(u8(u->qsComment)); if (! u->qsHash.isEmpty()) mpus.set_hash(u8(u->qsHash)); sendMessage(uSource, mpus); } // Send syncronisation packet MumbleProto::ServerSync mpss; mpss.set_session(uSource->uiSession); if (! qsWelcomeText.isEmpty()) mpss.set_welcome_text(u8(qsWelcomeText)); mpss.set_max_bandwidth(iMaxBandwidth); if (uSource->iId == 0) { mpss.set_permissions(ChanACL::All); } else { QMutexLocker qml(&qmCache); ChanACL::hasPermission(uSource, root, ChanACL::Enter, &acCache); mpss.set_permissions(acCache.value(uSource)->value(root)); } sendMessage(uSource, mpss); MumbleProto::ServerConfig mpsc; mpsc.set_allow_html(bAllowHTML); mpsc.set_message_length(iMaxTextMessageLength); mpsc.set_image_message_length(iMaxImageMessageLength); mpsc.set_max_users(iMaxUsers); sendMessage(uSource, mpsc); MumbleProto::SuggestConfig mpsug; if (! qvSuggestVersion.isNull()) mpsug.set_version(qvSuggestVersion.toUInt()); if (! qvSuggestPositional.isNull()) mpsug.set_positional(qvSuggestPositional.toBool()); if (! qvSuggestPushToTalk.isNull()) mpsug.set_push_to_talk(qvSuggestPushToTalk.toBool()); if (mpsug.ByteSize() > 0) { sendMessage(uSource, mpsug); } log(uSource, "Authenticated"); emit userConnected(uSource); } void Server::msgBanList(ServerUser *uSource, MumbleProto::BanList &msg) { MSG_SETUP(ServerUser::Authenticated); QSet previousBans, newBans; if (! hasPermission(uSource, qhChannels.value(0), ChanACL::Ban)) { PERM_DENIED(uSource, qhChannels.value(0), ChanACL::Ban); return; } if (msg.query()) { msg.clear_query(); msg.clear_bans(); foreach(const Ban &b, qlBans) { MumbleProto::BanList_BanEntry *be = msg.add_bans(); be->set_address(b.haAddress.toStdString()); be->set_mask(b.iMask); be->set_name(u8(b.qsUsername)); be->set_hash(u8(b.qsHash)); be->set_reason(u8(b.qsReason)); be->set_start(u8(b.qdtStart.toString(Qt::ISODate))); be->set_duration(b.iDuration); } sendMessage(uSource, msg); } else { previousBans = qlBans.toSet(); qlBans.clear(); for (int i=0;i < msg.bans_size(); ++i) { const MumbleProto::BanList_BanEntry &be = msg.bans(i); Ban b; b.haAddress = be.address(); b.iMask = be.mask(); b.qsUsername = u8(be.name()); b.qsHash = u8(be.hash()); b.qsReason = u8(be.reason()); if (be.has_start()) { b.qdtStart = QDateTime::fromString(u8(be.start()), Qt::ISODate); b.qdtStart.setTimeSpec(Qt::UTC); } else { b.qdtStart = QDateTime::currentDateTime().toUTC(); } b.iDuration = be.duration(); if (b.isValid()) { qlBans << b; } } newBans = qlBans.toSet(); QSet removed = previousBans - newBans; QSet added = newBans - previousBans; foreach(const Ban &b, removed) { log(uSource, QString("Removed ban: %1").arg(b.toString())); } foreach(const Ban &b, added) { log(uSource, QString("New ban: %1").arg(b.toString())); } saveBans(); log(uSource, "Updated banlist"); } } void Server::msgReject(ServerUser *, MumbleProto::Reject &) { } void Server::msgServerSync(ServerUser *, MumbleProto::ServerSync &) { } void Server::msgPermissionDenied(ServerUser *, MumbleProto::PermissionDenied &) { } void Server::msgUDPTunnel(ServerUser *uSource, MumbleProto::UDPTunnel &msg) { MSG_SETUP_NO_UNIDLE(ServerUser::Authenticated); const std::string &str = msg.packet(); int len = static_cast(str.length()); if (len < 1) return; QReadLocker rl(&qrwlVoiceThread); processMsg(uSource, str.data(), len); } void Server::msgUserState(ServerUser *uSource, MumbleProto::UserState &msg) { MSG_SETUP(ServerUser::Authenticated); VICTIM_SETUP; Channel *root = qhChannels.value(0); /* First check all permissions involved */ if ((pDstServerUser->iId == 0) && (uSource->iId != 0)) { PERM_DENIED_TYPE(SuperUser); return; } msg.set_session(pDstServerUser->uiSession); msg.set_actor(uSource->uiSession); if (msg.has_name()) { PERM_DENIED_TYPE(UserName); return; } if (uSource == pDstServerUser) { RATELIMIT(uSource); } if (msg.has_channel_id()) { Channel *c = qhChannels.value(msg.channel_id()); if (!c || (c == pDstServerUser->cChannel)) return; if ((uSource != pDstServerUser) && (! hasPermission(uSource, pDstServerUser->cChannel, ChanACL::Move))) { PERM_DENIED(uSource, pDstServerUser->cChannel, ChanACL::Move); return; } if (! hasPermission(uSource, c, ChanACL::Move) && ! hasPermission(pDstServerUser, c, ChanACL::Enter)) { PERM_DENIED(pDstServerUser, c, ChanACL::Enter); return; } if (isChannelFull(c, uSource)) { PERM_DENIED_FALLBACK(ChannelFull, 0x010201, QLatin1String("Channel is full")); return; } } if (msg.has_mute() || msg.has_deaf() || msg.has_suppress() || msg.has_priority_speaker()) { if (pDstServerUser->iId == 0) { PERM_DENIED_TYPE(SuperUser); return; } if (uSource->cChannel->bTemporary) { PERM_DENIED_TYPE(TemporaryChannel); return; } if (! hasPermission(uSource, pDstServerUser->cChannel, ChanACL::MuteDeafen) || msg.suppress()) { PERM_DENIED(uSource, pDstServerUser->cChannel, ChanACL::MuteDeafen); return; } } QString comment; if (msg.has_comment()) { bool changed = false; comment = u8(msg.comment()); if (uSource != pDstServerUser) { if (! hasPermission(uSource, root, ChanACL::Move)) { PERM_DENIED(uSource, root, ChanACL::Move); return; } if (comment.length() > 0) { PERM_DENIED_TYPE(TextTooLong); return; } } if (! isTextAllowed(comment, changed)) { PERM_DENIED_TYPE(TextTooLong); return; } if (changed) msg.set_comment(u8(comment)); } if (msg.has_texture()) { if (iMaxImageMessageLength > 0 && (msg.texture().length() > static_cast(iMaxImageMessageLength))) { PERM_DENIED_TYPE(TextTooLong); return; } if (uSource != pDstServerUser) { if (! hasPermission(uSource, root, ChanACL::Move)) { PERM_DENIED(uSource, root, ChanACL::Move); return; } if (msg.texture().length() > 0) { PERM_DENIED_TYPE(TextTooLong); return; } } } if (msg.has_user_id()) { ChanACL::Perm p = (uSource == pDstServerUser) ? ChanACL::SelfRegister : ChanACL::Register; if ((pDstServerUser->iId >= 0) || ! hasPermission(uSource, root, p)) { PERM_DENIED(uSource, root, p); return; } if (pDstServerUser->qsHash.isEmpty()) { PERM_DENIED_HASH(pDstServerUser); return; } } // Prevent self-targeting state changes from being applied to others if ((pDstServerUser != uSource) && (msg.has_self_deaf() || msg.has_self_mute() || msg.has_plugin_context() || msg.has_plugin_identity() || msg.has_recording())) { return; } /* -------------------- Permission checks done. Now act -------------------- */ bool bBroadcast = false; if (msg.has_texture()) { QByteArray qba = blob(msg.texture()); if (pDstServerUser->iId > 0) { // For registered users store the texture we just received in the database if (! setTexture(pDstServerUser->iId, qba)) { return; } } else { // For unregistered users or SuperUser only get the hash hashAssign(pDstServerUser->qbaTexture, pDstServerUser->qbaTextureHash, qba); } // The texture will be sent out later in this function bBroadcast = true; } // Writing to bSelfMute, bSelfDeaf and ssContext // requires holding a write lock on qrwlVoiceThread. { QWriteLocker wl(&qrwlVoiceThread); if (msg.has_self_deaf()) { uSource->bSelfDeaf = msg.self_deaf(); if (uSource->bSelfDeaf) msg.set_self_mute(true); bBroadcast = true; } if (msg.has_self_mute()) { uSource->bSelfMute = msg.self_mute(); if (! uSource->bSelfMute) { msg.set_self_deaf(false); uSource->bSelfDeaf = false; } bBroadcast = true; } if (msg.has_plugin_context()) { uSource->ssContext = msg.plugin_context(); // Make sure to clear this from the packet so we don't broadcast it msg.clear_plugin_context(); } } if (msg.has_plugin_identity()) { uSource->qsIdentity = u8(msg.plugin_identity()); // Make sure to clear this from the packet so we don't broadcast it msg.clear_plugin_identity(); } if (! comment.isNull()) { hashAssign(pDstServerUser->qsComment, pDstServerUser->qbaCommentHash, comment); if (pDstServerUser->iId >= 0) { QMap info; info.insert(ServerDB::User_Comment, pDstServerUser->qsComment); setInfo(pDstServerUser->iId, info); } bBroadcast = true; } if (msg.has_mute() || msg.has_deaf() || msg.has_suppress() || msg.has_priority_speaker()) { // Writing to bDeaf, bMute and bSuppress requires // holding a write lock on qrwlVoiceThread. QWriteLocker wl(&qrwlVoiceThread); if (msg.has_deaf()) { pDstServerUser->bDeaf = msg.deaf(); if (pDstServerUser->bDeaf) msg.set_mute(true); } if (msg.has_mute()) { pDstServerUser->bMute = msg.mute(); if (! pDstServerUser->bMute) { msg.set_deaf(false); pDstServerUser->bDeaf = false; } } if (msg.has_suppress()) pDstServerUser->bSuppress = msg.suppress(); if (msg.has_priority_speaker()) pDstServerUser->bPrioritySpeaker = msg.priority_speaker(); log(uSource, QString("Changed speak-state of %1 (%2 %3 %4 %5)").arg(QString(*pDstServerUser), QString::number(pDstServerUser->bMute), QString::number(pDstServerUser->bDeaf), QString::number(pDstServerUser->bSuppress), QString::number(pDstServerUser->bPrioritySpeaker))); bBroadcast = true; } if (msg.has_recording() && (pDstServerUser->bRecording != msg.recording())) { pDstServerUser->bRecording = msg.recording(); MumbleProto::TextMessage mptm; mptm.add_tree_id(0); if (pDstServerUser->bRecording) mptm.set_message(u8(QString(QLatin1String("User '%1' started recording")).arg(pDstServerUser->qsName))); else mptm.set_message(u8(QString(QLatin1String("User '%1' stopped recording")).arg(pDstServerUser->qsName))); sendAll(mptm, ~ 0x010203); bBroadcast = true; } if (msg.has_channel_id()) { Channel *c = qhChannels.value(msg.channel_id()); userEnterChannel(pDstServerUser, c, msg); log(uSource, QString("Moved %1 to %2").arg(QString(*pDstServerUser), QString(*c))); bBroadcast = true; } bool bDstAclChanged = false; if (msg.has_user_id()) { // Handle user (Self-)Registration QMap info; info.insert(ServerDB::User_Name, pDstServerUser->qsName); info.insert(ServerDB::User_Hash, pDstServerUser->qsHash); if (! pDstServerUser->qslEmail.isEmpty()) info.insert(ServerDB::User_Email, pDstServerUser->qslEmail.first()); int id = registerUser(info); if (id > 0) { pDstServerUser->iId = id; setLastChannel(pDstServerUser); msg.set_user_id(id); bDstAclChanged = true; } else { // Registration failed msg.clear_user_id(); } bBroadcast = true; } if (bBroadcast) { // Texture handling for clients < 1.2.2. // Send the texture data in the message. if (msg.has_texture() && (pDstServerUser->qbaTexture.length() >= 4) && (qFromBigEndian(reinterpret_cast(pDstServerUser->qbaTexture.constData())) != 600 * 60 * 4)) { // This is a new style texture, don't send it because the client doesn't handle it correctly / crashes. msg.clear_texture(); sendAll(msg, ~ 0x010202); msg.set_texture(blob(pDstServerUser->qbaTexture)); } else { // This is an old style texture, empty texture or there was no texture in this packet, // send the message unchanged. sendAll(msg, ~ 0x010202); } // Texture / comment handling for clients >= 1.2.2. // Send only a hash of the texture / comment text. The client will request the actual data if necessary. if (msg.has_texture() && ! pDstServerUser->qbaTextureHash.isEmpty()) { msg.clear_texture(); msg.set_texture_hash(blob(pDstServerUser->qbaTextureHash)); } if (msg.has_comment() && ! pDstServerUser->qbaCommentHash.isEmpty()) { msg.clear_comment(); msg.set_comment_hash(blob(pDstServerUser->qbaCommentHash)); } sendAll(msg, 0x010202); if (bDstAclChanged) clearACLCache(pDstServerUser); } emit userStateChanged(pDstServerUser); } void Server::msgUserRemove(ServerUser *uSource, MumbleProto::UserRemove &msg) { MSG_SETUP(ServerUser::Authenticated); VICTIM_SETUP; msg.set_actor(uSource->uiSession); bool ban = msg.has_ban() && msg.ban(); Channel *c = qhChannels.value(0); QFlags perm = ban ? ChanACL::Ban : (ChanACL::Ban|ChanACL::Kick); if ((pDstServerUser->iId ==0) || ! hasPermission(uSource, c, perm)) { PERM_DENIED(uSource, c, perm); return; } if (ban) { Ban b; b.haAddress = pDstServerUser->haAddress; b.iMask = 128; b.qsReason = u8(msg.reason()); b.qsUsername = pDstServerUser->qsName; b.qsHash = pDstServerUser->qsHash; b.qdtStart = QDateTime::currentDateTime().toUTC(); b.iDuration = 0; qlBans << b; saveBans(); } sendAll(msg); if (ban) log(uSource, QString("Kickbanned %1 (%2)").arg(QString(*pDstServerUser), u8(msg.reason()))); else log(uSource, QString("Kicked %1 (%2)").arg(QString(*pDstServerUser), u8(msg.reason()))); pDstServerUser->disconnectSocket(); } void Server::msgChannelState(ServerUser *uSource, MumbleProto::ChannelState &msg) { MSG_SETUP(ServerUser::Authenticated); Channel *c = NULL; Channel *p = NULL; // If this message relates to an existing channel check if the id is really valid if (msg.has_channel_id()) { c = qhChannels.value(msg.channel_id()); if (! c) return; } else { RATELIMIT(uSource); } // Check if the parent exists if (msg.has_parent()) { p = qhChannels.value(msg.parent()); if (! p) return; } msg.clear_links(); QString qsName; QString qsDesc; if (msg.has_description()) { qsDesc = u8(msg.description()); bool changed = false; if (! isTextAllowed(qsDesc, changed)) { PERM_DENIED_TYPE(TextTooLong); return; } if (changed) msg.set_description(u8(qsDesc)); } if (msg.has_name()) { // If we are sent a channel name this means we want to create this channel so // check if the name is valid and not already in use. qsName = u8(msg.name()); if (! validateChannelName(qsName)) { PERM_DENIED_TYPE(ChannelName); return; } if (qsName.length() == 0) { PERM_DENIED_TYPE(ChannelName); return; } if (p || (c && c->iId != 0)) { Channel *cp = p ? p : c->cParent; foreach(Channel *sibling, cp->qlChannels) { if (sibling->qsName == qsName) { PERM_DENIED_TYPE(ChannelName); return; } } } } if(p) { // Having a parent channel given means we either want to create // a channel in or move a channel into this parent. if (!canNest(p, c)) { PERM_DENIED_FALLBACK(NestingLimit, 0x010204, QLatin1String("Channel nesting limit reached")); return; } } if (! c) { // If we don't have a channel handle up to now we want to create a new channel // so check if the user has enough rights and we got everything we need. if (! p || qsName.isNull()) return; if (iChannelCountLimit != 0 && qhChannels.count() >= iChannelCountLimit) { PERM_DENIED_FALLBACK(ChannelCountLimit, 0x010300, QLatin1String("Channel count limit reached")); return; } ChanACL::Perm perm = msg.temporary() ? ChanACL::MakeTempChannel : ChanACL::MakeChannel; if (! hasPermission(uSource, p, perm)) { PERM_DENIED(uSource, p, perm); return; } if ((uSource->iId < 0) && uSource->qsHash.isEmpty()) { PERM_DENIED_HASH(uSource); return; } if (p->bTemporary) { PERM_DENIED_TYPE(TemporaryChannel); return; } c = addChannel(p, qsName, msg.temporary(), msg.position(), msg.max_users()); hashAssign(c->qsDesc, c->qbaDescHash, qsDesc); if (uSource->iId >= 0) { Group *g = new Group(c, "admin"); g->qsAdd << uSource->iId; } if (! hasPermission(uSource, c, ChanACL::Write)) { ChanACL *a = new ChanACL(c); a->bApplyHere=true; a->bApplySubs=false; if (uSource->iId >= 0) a->iUserId=uSource->iId; else a->qsGroup=QLatin1Char('$') + uSource->qsHash; a->pDeny=ChanACL::None; a->pAllow=ChanACL::Write | ChanACL::Traverse; clearACLCache(); } updateChannel(c); msg.set_channel_id(c->iId); log(uSource, QString("Added channel %1 under %2").arg(QString(*c), QString(*p))); emit channelCreated(c); sendAll(msg, ~ 0x010202); if (! c->qbaDescHash.isEmpty()) { msg.clear_description(); msg.set_description_hash(blob(c->qbaDescHash)); } sendAll(msg, 0x010202); if (c->bTemporary) { // If a temporary channel has been created move the creator right in there MumbleProto::UserState mpus; mpus.set_session(uSource->uiSession); mpus.set_channel_id(c->iId); userEnterChannel(uSource, c, mpus); sendAll(mpus); emit userStateChanged(uSource); } } else { // The message is related to an existing channel c so check if the user is allowed to modify it // and perform the modifications if (! qsName.isNull()) { if (! hasPermission(uSource, c, ChanACL::Write) || (c->iId == 0)) { PERM_DENIED(uSource, c, ChanACL::Write); return; } } if (! qsDesc.isNull()) { if (! hasPermission(uSource, c, ChanACL::Write)) { PERM_DENIED(uSource, c, ChanACL::Write); return; } } if (msg.has_position()) { if (! hasPermission(uSource, c, ChanACL::Write)) { PERM_DENIED(uSource, c, ChanACL::Write); return; } } if (p) { // If we received a parent channel check if it differs from the old one and is not // Temporary. If that is the case check if the user has enough rights and if the // channel name is not used in the target location. Abort otherwise. if (p == c->cParent) return; Channel *ip = p; while (ip) { if (ip == c) return; ip = ip->cParent; } if (p->bTemporary) { PERM_DENIED_TYPE(TemporaryChannel); return; } if (! hasPermission(uSource, c, ChanACL::Write)) { PERM_DENIED(uSource, c, ChanACL::Write); return; } if (! hasPermission(uSource, p, ChanACL::MakeChannel)) { PERM_DENIED(uSource, p, ChanACL::MakeChannel); return; } QString name = qsName.isNull() ? c->qsName : qsName; foreach(Channel *sibling, p->qlChannels) { if (sibling->qsName == name) { PERM_DENIED_TYPE(ChannelName); return; } } } QList qlAdd; QList qlRemove; if (msg.links_add_size() || msg.links_remove_size()) { if (! hasPermission(uSource, c, ChanACL::LinkChannel)) { PERM_DENIED(uSource, c, ChanACL::LinkChannel); return; } if (msg.links_remove_size()) { for (int i=0;i < msg.links_remove_size(); ++i) { unsigned int link = msg.links_remove(i); Channel *l = qhChannels.value(link); if (! l) return; qlRemove << l; } } if (msg.links_add_size()) { for (int i=0;i < msg.links_add_size(); ++i) { unsigned int link = msg.links_add(i); Channel *l = qhChannels.value(link); if (! l) return; if (! hasPermission(uSource, l, ChanACL::LinkChannel)) { PERM_DENIED(uSource, l, ChanACL::LinkChannel); return; } qlAdd << l; } } } if (msg.has_max_users()) { if (! hasPermission(uSource, c, ChanACL::Write)) { PERM_DENIED(uSource, c, ChanACL::Write); return; } } // All permission checks done -- the update is good. if (p) { log(uSource, QString("Moved channel %1 from %2 to %3").arg(QString(*c), QString(* c->cParent), QString(*p))); { QWriteLocker wl(&qrwlVoiceThread); c->cParent->removeChannel(c); p->addChannel(c); } } if (! qsName.isNull()) { log(uSource, QString("Renamed channel %1 to %2").arg(QString(*c), QString(qsName))); c->qsName = qsName; } if (! qsDesc.isNull()) hashAssign(c->qsDesc, c->qbaDescHash, qsDesc); if (msg.has_position()) c->iPosition = msg.position(); foreach(Channel *l, qlAdd) { addLink(c, l); } foreach(Channel *l, qlRemove) { removeLink(c, l); } if (msg.has_max_users()) c->uiMaxUsers = msg.max_users(); updateChannel(c); emit channelStateChanged(c); sendAll(msg, ~ 0x010202); if (msg.has_description() && ! c->qbaDescHash.isEmpty()) { msg.clear_description(); msg.set_description_hash(blob(c->qbaDescHash)); } sendAll(msg, 0x010202); } } void Server::msgChannelRemove(ServerUser *uSource, MumbleProto::ChannelRemove &msg) { MSG_SETUP(ServerUser::Authenticated); Channel *c = qhChannels.value(msg.channel_id()); if (!c) return; if (! hasPermission(uSource, c, ChanACL::Write) || (c->iId == 0)) { PERM_DENIED(uSource, c, ChanACL::Write); return; } log(uSource, QString("Removed channel %1").arg(*c)); removeChannel(c); } void Server::msgTextMessage(ServerUser *uSource, MumbleProto::TextMessage &msg) { MSG_SETUP(ServerUser::Authenticated); QMutexLocker qml(&qmCache); TextMessage tm; // for signal userTextMessage QSet users; QQueue q; RATELIMIT(uSource); int res = 0; emit textMessageFilterSig(res, uSource, msg); switch (res) { // Accept case 0: // No-op. break; // Reject case 1: PERM_DENIED(uSource, uSource->cChannel, ChanACL::TextMessage); return; // Drop case 2: return; } QString text = u8(msg.message()); bool changed = false; if (! isTextAllowed(text, changed)) { PERM_DENIED_TYPE(TextTooLong); return; } if (text.isEmpty()) return; if (changed) msg.set_message(u8(text)); tm.qsText = text; { // Happy easter char m[29] = {0117, 0160, 0145, 0156, 040, 0164, 0150, 0145, 040, 0160, 0157, 0144, 040, 0142, 0141, 0171, 040, 0144, 0157, 0157, 0162, 0163, 054, 040, 0110, 0101, 0114, 056, 0}; if (msg.channel_id_size() == 1 && msg.channel_id(0) == 0 && msg.message() == m) { PERM_DENIED_TYPE(H9K); return; } } msg.set_actor(uSource->uiSession); for (int i=0;iqlUsers) users.insert(static_cast(p)); tm.qlChannels.append(id); } for (int i=0;iqlChannels) q.enqueue(sub); foreach(User *p, c->qlUsers) users.insert(static_cast(p)); } } for (int i=0;i < msg.session_size(); ++i) { unsigned int session = msg.session(i); ServerUser *u = qhUsers.value(session); if (u) { if (! ChanACL::hasPermission(uSource, u->cChannel, ChanACL::TextMessage, &acCache)) { PERM_DENIED(uSource, u->cChannel, ChanACL::TextMessage); return; } users.insert(u); } tm.qlSessions.append(session); } users.remove(uSource); foreach(ServerUser *u, users) sendMessage(u, msg); emit userTextMessage(uSource, tm); } void Server::msgACL(ServerUser *uSource, MumbleProto::ACL &msg) { MSG_SETUP(ServerUser::Authenticated); Channel *c = qhChannels.value(msg.channel_id()); if (!c) return; if (! hasPermission(uSource, c, ChanACL::Write) && !(c->cParent && hasPermission(uSource, c->cParent, ChanACL::Write))) { PERM_DENIED(uSource, c, ChanACL::Write); return; } RATELIMIT(uSource); if (msg.has_query() && msg.query()) { QStack chans; Channel *p; ChanACL *acl; QSet qsId; msg.clear_groups(); msg.clear_acls(); msg.clear_query(); msg.set_inherit_acls(c->bInheritACL); p = c; while (p) { chans.push(p); if ((p==c) || p->bInheritACL) p = p->cParent; else p = NULL; } while (! chans.isEmpty()) { p = chans.pop(); foreach(acl, p->qlACL) { if ((p == c) || (acl->bApplySubs)) { MumbleProto::ACL_ChanACL *mpacl = msg.add_acls(); mpacl->set_inherited(p != c); mpacl->set_apply_here(acl->bApplyHere); mpacl->set_apply_subs(acl->bApplySubs); if (acl->iUserId >= 0) { mpacl->set_user_id(acl->iUserId); qsId.insert(acl->iUserId); } else mpacl->set_group(u8(acl->qsGroup)); mpacl->set_grant(acl->pAllow); mpacl->set_deny(acl->pDeny); } } } p = c->cParent; QSet allnames=Group::groupNames(c); foreach(const QString &name, allnames) { Group *g = c->qhGroups.value(name); Group *pg = p ? Group::getGroup(p, name) : NULL; MumbleProto::ACL_ChanGroup *group = msg.add_groups(); group->set_name(u8(name)); group->set_inherit(g ? g->bInherit : true); group->set_inheritable(g ? g->bInheritable : true); group->set_inherited((pg != NULL) && pg->bInheritable); if (g) { foreach(int id, g->qsAdd) { qsId.insert(id); group->add_add(id); } foreach(int id, g->qsRemove) { qsId.insert(id); group->add_remove(id); } } if (pg) { foreach(int id, pg->members()) { qsId.insert(id); group->add_inherited_members(id); } } } sendMessage(uSource, msg); MumbleProto::QueryUsers mpqu; foreach(int id, qsId) { QString uname=getUserName(id); if (! uname.isEmpty()) { mpqu.add_ids(id); mpqu.add_names(u8(uname)); } } if (mpqu.ids_size()) sendMessage(uSource, mpqu); } else { Group *g; ChanACL *a; { QWriteLocker wl(&qrwlVoiceThread); QHash > hOldTemp; foreach(g, c->qhGroups) { hOldTemp.insert(g->qsName, g->qsTemporary); delete g; } foreach(a, c->qlACL) delete a; c->qhGroups.clear(); c->qlACL.clear(); c->bInheritACL = msg.inherit_acls(); for (int i = 0; i < msg.groups_size(); ++i) { const MumbleProto::ACL_ChanGroup &group = msg.groups(i); g = new Group(c, u8(group.name())); g->bInherit = group.inherit(); g->bInheritable = group.inheritable(); for (int j = 0; j < group.add_size(); ++j) if (!getUserName(group.add(j)).isEmpty()) g->qsAdd << group.add(j); for (int j = 0; j < group.remove_size(); ++j) if (!getUserName(group.remove(j)).isEmpty()) g->qsRemove << group.remove(j); g->qsTemporary = hOldTemp.value(g->qsName); } for (int i = 0; i < msg.acls_size(); ++i) { const MumbleProto::ACL_ChanACL &mpacl = msg.acls(i); if (mpacl.has_user_id() && getUserName(mpacl.user_id()).isEmpty()) continue; a = new ChanACL(c); a->bApplyHere = mpacl.apply_here(); a->bApplySubs = mpacl.apply_subs(); if (mpacl.has_user_id()) a->iUserId = mpacl.user_id(); else a->qsGroup = u8(mpacl.group()); a->pDeny = static_cast(mpacl.deny()) & ChanACL::All; a->pAllow = static_cast(mpacl.grant()) & ChanACL::All; } } clearACLCache(); if (! hasPermission(uSource, c, ChanACL::Write) && ((uSource->iId >= 0) || !uSource->qsHash.isEmpty())) { { QWriteLocker wl(&qrwlVoiceThread); a = new ChanACL(c); a->bApplyHere = true; a->bApplySubs = false; if (uSource->iId >= 0) a->iUserId = uSource->iId; else a->qsGroup = QLatin1Char('$') + uSource->qsHash; a->iUserId = uSource->iId; a->pDeny = ChanACL::None; a->pAllow = ChanACL::Write | ChanACL::Traverse; } clearACLCache(); } updateChannel(c); log(uSource, QString("Updated ACL in channel %1").arg(*c)); } } void Server::msgQueryUsers(ServerUser *uSource, MumbleProto::QueryUsers &msg) { MSG_SETUP(ServerUser::Authenticated); MumbleProto::QueryUsers reply; for (int i=0;i= 0) { const QString &name = getUserName(id); if (! name.isEmpty()) { reply.add_ids(id); reply.add_names(u8(name)); } } } for (int i=0;i= 0) { name = getUserName(id); reply.add_ids(id); reply.add_names(u8(name)); } } sendMessage(uSource, reply); } void Server::msgPing(ServerUser *uSource, MumbleProto::Ping &msg) { MSG_SETUP_NO_UNIDLE(ServerUser::Authenticated); QMutexLocker l(&uSource->qmCrypt); CryptState &cs=uSource->csCrypt; cs.uiRemoteGood = msg.good(); cs.uiRemoteLate = msg.late(); cs.uiRemoteLost = msg.lost(); cs.uiRemoteResync = msg.resync(); uSource->dUDPPingAvg = msg.udp_ping_avg(); uSource->dUDPPingVar = msg.udp_ping_var(); uSource->uiUDPPackets = msg.udp_packets(); uSource->dTCPPingAvg = msg.tcp_ping_avg(); uSource->dTCPPingVar = msg.tcp_ping_var(); uSource->uiTCPPackets = msg.tcp_packets(); quint64 ts = msg.timestamp(); msg.Clear(); msg.set_timestamp(ts); msg.set_good(cs.uiGood); msg.set_late(cs.uiLate); msg.set_lost(cs.uiLost); msg.set_resync(cs.uiResync); sendMessage(uSource, msg); } void Server::msgCryptSetup(ServerUser *uSource, MumbleProto::CryptSetup &msg) { MSG_SETUP_NO_UNIDLE(ServerUser::Authenticated); QMutexLocker l(&uSource->qmCrypt); if (! msg.has_client_nonce()) { log(uSource, "Requested crypt-nonce resync"); msg.set_server_nonce(std::string(reinterpret_cast(uSource->csCrypt.encrypt_iv), AES_BLOCK_SIZE)); sendMessage(uSource, msg); } else { const std::string &str = msg.client_nonce(); if (str.size() == AES_BLOCK_SIZE) { uSource->csCrypt.uiResync++; memcpy(uSource->csCrypt.decrypt_iv, str.data(), AES_BLOCK_SIZE); } } } void Server::msgContextActionModify(ServerUser *, MumbleProto::ContextActionModify &) { } void Server::msgContextAction(ServerUser *uSource, MumbleProto::ContextAction &msg) { MSG_SETUP(ServerUser::Authenticated); unsigned int session = msg.has_session() ? msg.session() : 0; int id = msg.has_channel_id() ? static_cast(msg.channel_id()) : -1; if (session && ! qhUsers.contains(session)) return; if ((id >= 0) && ! qhChannels.contains(id)) return; emit contextAction(uSource, u8(msg.action()), session, id); } /// @param str The std::string to convert /// @param maxSize The maximum allowed size for this string /// @returns The given std::string converted to a QString, if its size is less /// than or equal to the given maxSize. If it is bigger, "[[Invalid]]" /// is returned. QString convertWithSizeRestriction(const std::string &str, size_t maxSize) { if (str.size() > maxSize) { return QLatin1String("[[Invalid]]"); } return QString::fromStdString(str); } void Server::msgVersion(ServerUser *uSource, MumbleProto::Version &msg) { RATELIMIT(uSource); if (msg.has_version()) { uSource->uiVersion=msg.version(); } if (msg.has_release()) { uSource->qsRelease = convertWithSizeRestriction(msg.release(), 100); } if (msg.has_os()) { uSource->qsOS = convertWithSizeRestriction(msg.os(), 40); if (msg.has_os_version()) { uSource->qsOSVersion = convertWithSizeRestriction(msg.os_version(), 60); } } log(uSource, QString("Client version %1 (%2: %3)").arg(MumbleVersion::toString(uSource->uiVersion)).arg(uSource->qsOS).arg(uSource->qsRelease)); } void Server::msgUserList(ServerUser *uSource, MumbleProto::UserList &msg) { MSG_SETUP(ServerUser::Authenticated); // The register permission is required on the root channel to be allowed to // view the registered users. if (! hasPermission(uSource, qhChannels.value(0), ChanACL::Register)) { PERM_DENIED(uSource, qhChannels.value(0), ChanACL::Register); return; } if (msg.users_size() == 0) { // Query mode. QList users = getRegisteredUsersEx(); QList::const_iterator it = users.constBegin(); for (; it != users.constEnd(); ++it) { // Skip the SuperUser if (it->user_id > 0) { ::MumbleProto::UserList_User *user = msg.add_users(); user->set_user_id(it->user_id); user->set_name(u8(it->name)); if (it->last_channel) { user->set_last_channel(*it->last_channel); } user->set_last_seen(u8(it->last_active.toString(Qt::ISODate))); } } sendMessage(uSource, msg); } else { // Update mode for (int i=0; i < msg.users_size(); ++i) { const MumbleProto::UserList_User &user = msg.users(i); int id = user.user_id(); if (id == 0) continue; if (! user.has_name()) { log(uSource, QString::fromLatin1("Unregistered user %1").arg(id)); unregisterUser(id); } else { const QString &name = u8(user.name()); if (validateUserName(name)) { log(uSource, QString::fromLatin1("Renamed user %1 to '%2'").arg(QString::number(id), name)); QMap info; info.insert(ServerDB::User_Name, name); setInfo(id, info); MumbleProto::UserState mpus; foreach(ServerUser *serverUser, qhUsers) { if (serverUser->iId == id) { serverUser->qsName = name; mpus.set_session(serverUser->uiSession); break; } } if (mpus.has_session()) { mpus.set_actor(uSource->uiSession); mpus.set_name(u8(name)); sendAll(mpus); } } else { MumbleProto::PermissionDenied mppd; mppd.set_type(MumbleProto::PermissionDenied_DenyType_UserName); if (uSource->uiVersion < 0x010201) mppd.set_reason(u8(QString::fromLatin1("%1 is not a valid username").arg(name))); else mppd.set_name(u8(name)); sendMessage(uSource, mppd); } } } } } void Server::msgVoiceTarget(ServerUser *uSource, MumbleProto::VoiceTarget &msg) { MSG_SETUP_NO_UNIDLE(ServerUser::Authenticated); int target = msg.id(); if ((target < 1) || (target >= 0x1f)) return; QWriteLocker lock(&qrwlVoiceThread); uSource->qmTargetCache.remove(target); int count = msg.targets_size(); if (count == 0) { uSource->qmTargets.remove(target); } else { WhisperTarget wt; for (int i=0;iqmTargets.remove(target); else uSource->qmTargets.insert(target, wt); } } void Server::msgPermissionQuery(ServerUser *uSource, MumbleProto::PermissionQuery &msg) { MSG_SETUP_NO_UNIDLE(ServerUser::Authenticated); Channel *c = qhChannels.value(msg.channel_id()); if (!c) return; sendClientPermission(uSource, c, true); } void Server::msgCodecVersion(ServerUser *, MumbleProto::CodecVersion &) { } void Server::msgUserStats(ServerUser*uSource, MumbleProto::UserStats &msg) { MSG_SETUP_NO_UNIDLE(ServerUser::Authenticated); VICTIM_SETUP; const BandwidthRecord &bwr = pDstServerUser->bwr; const QList &certs = pDstServerUser->peerCertificateChain(); bool extend = (uSource == pDstServerUser) || hasPermission(uSource, qhChannels.value(0), ChanACL::Register); if (! extend && ! hasPermission(uSource, pDstServerUser->cChannel, ChanACL::Enter)) { PERM_DENIED(uSource, pDstServerUser->cChannel, ChanACL::Enter); return; } bool details = extend; bool local = extend || (pDstServerUser->cChannel == uSource->cChannel); if (msg.stats_only()) details = false; msg.Clear(); msg.set_session(pDstServerUser->uiSession); if (details) { foreach(const QSslCertificate &cert, certs) { const QByteArray &der = cert.toDer(); msg.add_certificates(blob(der)); } msg.set_strong_certificate(pDstServerUser->bVerified); } if (local) { MumbleProto::UserStats_Stats *mpusss; QMutexLocker l(&pDstServerUser->qmCrypt); const CryptState &cs = pDstServerUser->csCrypt; mpusss = msg.mutable_from_client(); mpusss->set_good(cs.uiGood); mpusss->set_late(cs.uiLate); mpusss->set_lost(cs.uiLost); mpusss->set_resync(cs.uiResync); mpusss = msg.mutable_from_server(); mpusss->set_good(cs.uiRemoteGood); mpusss->set_late(cs.uiRemoteLate); mpusss->set_lost(cs.uiRemoteLost); mpusss->set_resync(cs.uiRemoteResync); } msg.set_udp_packets(pDstServerUser->uiUDPPackets); msg.set_tcp_packets(pDstServerUser->uiTCPPackets); msg.set_udp_ping_avg(pDstServerUser->dUDPPingAvg); msg.set_udp_ping_var(pDstServerUser->dUDPPingVar); msg.set_tcp_ping_avg(pDstServerUser->dTCPPingAvg); msg.set_tcp_ping_var(pDstServerUser->dTCPPingVar); if (details) { MumbleProto::Version *mpv; mpv = msg.mutable_version(); if (pDstServerUser->uiVersion) mpv->set_version(pDstServerUser->uiVersion); if (! pDstServerUser->qsRelease.isEmpty()) mpv->set_release(u8(pDstServerUser->qsRelease)); if (! pDstServerUser->qsOS.isEmpty()) { mpv->set_os(u8(pDstServerUser->qsOS)); if (! pDstServerUser->qsOSVersion.isEmpty()) mpv->set_os_version(u8(pDstServerUser->qsOSVersion)); } foreach(int v, pDstServerUser->qlCodecs) msg.add_celt_versions(v); msg.set_opus(pDstServerUser->bOpus); msg.set_address(pDstServerUser->haAddress.toStdString()); } if (local) msg.set_bandwidth(bwr.bandwidth()); msg.set_onlinesecs(bwr.onlineSeconds()); if (local) msg.set_idlesecs(bwr.idleSeconds()); sendMessage(uSource, msg); } void Server::msgRequestBlob(ServerUser *uSource, MumbleProto::RequestBlob &msg) { MSG_SETUP_NO_UNIDLE(ServerUser::Authenticated); int ntextures = msg.session_texture_size(); int ncomments = msg.session_comment_size(); int ndescriptions = msg.channel_description_size(); if (ndescriptions) { MumbleProto::ChannelState mpcs; for (int i=0;iqsDesc.isEmpty()) { mpcs.set_channel_id(id); mpcs.set_description(u8(c->qsDesc)); sendMessage(uSource, mpcs); } } } if (ntextures || ncomments) { MumbleProto::UserState mpus; for (int i=0;iqbaTexture.isEmpty()) { mpus.set_session(session); mpus.set_texture(blob(su->qbaTexture)); sendMessage(uSource, mpus); } } if (ntextures) mpus.clear_texture(); for (int i=0;iqsComment.isEmpty()) { mpus.set_session(session); mpus.set_comment(u8(su->qsComment)); sendMessage(uSource, mpus); } } } } void Server::msgServerConfig(ServerUser *, MumbleProto::ServerConfig &) { } void Server::msgSuggestConfig(ServerUser *, MumbleProto::SuggestConfig &) { } mumble-1.3.4/src/murmur/About.cpp0000664000175000017500000000546514010707274016550 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "murmur_pch.h" #if QT_VERSION >= 0x050000 # include #else # include #endif #include "About.h" #include "Version.h" #include "License.h" AboutDialog::AboutDialog(QWidget *p, AboutDialogOptions options) : QDialog(p) { setWindowTitle(tr("About Murmur")); setMinimumSize(QSize(400, 300)); QTabWidget *qtwTab = new QTabWidget(this); QVBoxLayout *vblMain = new QVBoxLayout(this); QTextEdit *qteLicense = new QTextEdit(qtwTab); qteLicense->setReadOnly(true); qteLicense->setPlainText(License::license()); QTextEdit *qteAuthors = new QTextEdit(qtwTab); qteAuthors->setReadOnly(true); qteAuthors->setPlainText(License::authors()); QTextBrowser *qtb3rdPartyLicense = new QTextBrowser(qtwTab); qtb3rdPartyLicense->setReadOnly(true); qtb3rdPartyLicense->setOpenExternalLinks(true); QList thirdPartyLicenses = License::thirdPartyLicenses(); foreach(LicenseInfo li, thirdPartyLicenses) { qtb3rdPartyLicense->append(QString::fromLatin1("

    %1 (%2)

    %3
    ") .arg(Qt::escape(li.name)) .arg(Qt::escape(li.url)) .arg(Qt::escape(li.license))); } qtb3rdPartyLicense->moveCursor(QTextCursor::Start); QWidget *about = new QWidget(qtwTab); QLabel *icon = new QLabel(about); QIcon windowIcon = QApplication::windowIcon(); icon->setPixmap(windowIcon.pixmap(windowIcon.actualSize(QSize(128, 128)))); QLabel *text = new QLabel(about); text->setOpenExternalLinks(true); text->setText(tr( "

    Murmur (%1)

    " "

    %3

    " "

    %2

    " ).arg(QLatin1String(MUMBLE_RELEASE)) .arg(QLatin1String("http://www.mumble.info/")) .arg(QLatin1String("Copyright 2005-2019 The Mumble Developers"))); QHBoxLayout *qhbl = new QHBoxLayout(about); qhbl->addWidget(icon); qhbl->addWidget(text); qtwTab->addTab(about, tr("&About Murmur")); qtwTab->addTab(qteLicense, tr("&License")); qtwTab->addTab(qteAuthors, tr("A&uthors")); qtwTab->addTab(qtb3rdPartyLicense, tr("&Third-Party Licenses")); if (options == AboutDialogOptionsShowAbout) { qtwTab->setCurrentWidget(about); } else if (options == AboutDialogOptionsShowLicense) { qtwTab->setCurrentWidget(qteLicense); } else if (options == AboutDialogOptionsShowAuthors) { qtwTab->setCurrentWidget(qteAuthors); } else if (options == AboutDialogOptionsShowThirdPartyLicenses) { qtwTab->setCurrentWidget(qtb3rdPartyLicense); } QPushButton *okButton = new QPushButton(tr("OK"), this); connect(okButton, SIGNAL(clicked()), this, SLOT(accept())); vblMain->addWidget(qtwTab); vblMain->addWidget(okButton); } mumble-1.3.4/src/murmur/Murmur.ice0000664000175000017500000011600314010707274016732 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . /** * * Information and control of the murmur server. Each server has * one {@link Meta} interface that controls global information, and * each virtual server has a {@link Server} interface. * **/ #include module Murmur { /** A network address in IPv6 format. **/ ["python:seq:tuple"] sequence NetAddress; /** A connected user. **/ struct User { /** Session ID. This identifies the connection to the server. */ int session; /** User ID. -1 if the user is anonymous. */ int userid; /** Is user muted by the server? */ bool mute; /** Is user deafened by the server? If true, this implies mute. */ bool deaf; /** Is the user suppressed by the server? This means the user is not muted, but does not have speech privileges in the current channel. */ bool suppress; /** Is the user a priority speaker? */ bool prioritySpeaker; /** Is the user self-muted? */ bool selfMute; /** Is the user self-deafened? If true, this implies mute. */ bool selfDeaf; /** Is the User recording? (This flag is read-only and cannot be changed using setState().) **/ bool recording; /** Channel ID the user is in. Matches {@link Channel.id}. */ int channel; /** The name of the user. */ string name; /** Seconds user has been online. */ int onlinesecs; /** Average transmission rate in bytes per second over the last few seconds. */ int bytespersec; /** Client version. Major version in upper 16 bits, followed by 8 bits of minor version and 8 bits of patchlevel. Version 1.2.3 = 0x010203. */ int version; /** Client release. For official releases, this equals the version. For snapshots and git compiles, this will be something else. */ string release; /** Client OS. */ string os; /** Client OS Version. */ string osversion; /** Plugin Identity. This will be the user's unique ID inside the current game. */ string identity; /** Base64-encoded Plugin context. This is a binary blob identifying the game and team the user is on. The used Base64 alphabet is the one specified in RFC 2045. Before Mumble 1.3.0, this string was not Base64-encoded. This could cause problems for some Ice implementations, such as the .NET implementation. If you need the exact string that is used by Mumble, you can get it by Base64-decoding this string. If you simply need to detect whether two users are in the same game world, string comparisons will continue to work as before. */ string context; /** User comment. Shown as tooltip for this user. */ string comment; /** Client address. */ NetAddress address; /** TCP only. True until UDP connectivity is established. */ bool tcponly; /** Idle time. This is how many seconds it is since the user last spoke. Other activity is not counted. */ int idlesecs; /** UDP Ping Average. This is the average ping for the user via UDP over the duration of the connection. */ float udpPing; /** TCP Ping Average. This is the average ping for the user via TCP over the duration of the connection. */ float tcpPing; }; sequence IntList; /** A text message between users. **/ struct TextMessage { /** Sessions (connected users) who were sent this message. */ IntList sessions; /** Channels who were sent this message. */ IntList channels; /** Trees of channels who were sent this message. */ IntList trees; /** The contents of the message. */ string text; }; /** A channel. **/ struct Channel { /** Channel ID. This is unique per channel, and the root channel is always id 0. */ int id; /** Name of the channel. There can not be two channels with the same parent that has the same name. */ string name; /** ID of parent channel, or -1 if this is the root channel. */ int parent; /** List of id of linked channels. */ IntList links; /** Description of channel. Shown as tooltip for this channel. */ string description; /** Channel is temporary, and will be removed when the last user leaves it. */ bool temporary; /** Position of the channel which is used in Client for sorting. */ int position; }; /** A group. Groups are defined per channel, and can inherit members from parent channels. **/ struct Group { /** Group name */ string name; /** Is this group inherited from a parent channel? Read-only. */ bool inherited; /** Does this group inherit members from parent channels? */ bool inherit; /** Can subchannels inherit members from this group? */ bool inheritable; /** List of users to add to the group. */ IntList add; /** List of inherited users to remove from the group. */ IntList remove; /** Current members of the group, including inherited members. Read-only. */ IntList members; }; /** Write access to channel control. Implies all other permissions (except Speak). */ const int PermissionWrite = 0x01; /** Traverse channel. Without this, a client cannot reach subchannels, no matter which privileges he has there. */ const int PermissionTraverse = 0x02; /** Enter channel. */ const int PermissionEnter = 0x04; /** Speak in channel. */ const int PermissionSpeak = 0x08; /** Whisper to channel. This is different from Speak, so you can set up different permissions. */ const int PermissionWhisper = 0x100; /** Mute and deafen other users in this channel. */ const int PermissionMuteDeafen = 0x10; /** Move users from channel. You need this permission in both the source and destination channel to move another user. */ const int PermissionMove = 0x20; /** Make new channel as a subchannel of this channel. */ const int PermissionMakeChannel = 0x40; /** Make new temporary channel as a subchannel of this channel. */ const int PermissionMakeTempChannel = 0x400; /** Link this channel. You need this permission in both the source and destination channel to link channels, or in either channel to unlink them. */ const int PermissionLinkChannel = 0x80; /** Send text message to channel. */ const int PermissionTextMessage = 0x200; /** Kick user from server. Only valid on root channel. */ const int PermissionKick = 0x10000; /** Ban user from server. Only valid on root channel. */ const int PermissionBan = 0x20000; /** Register and unregister users. Only valid on root channel. */ const int PermissionRegister = 0x40000; /** Register and unregister users. Only valid on root channel. */ const int PermissionRegisterSelf = 0x80000; /** Access Control List for a channel. ACLs are defined per channel, and can be inherited from parent channels. **/ struct ACL { /** Does the ACL apply to this channel? */ bool applyHere; /** Does the ACL apply to subchannels? */ bool applySubs; /** Is this ACL inherited from a parent channel? Read-only. */ bool inherited; /** ID of user this ACL applies to. -1 if using a group name. */ int userid; /** Group this ACL applies to. Blank if using userid. */ string group; /** Binary mask of privileges to allow. */ int allow; /** Binary mask of privileges to deny. */ int deny; }; /** A single ip mask for a ban. **/ struct Ban { /** Address to ban. */ NetAddress address; /** Number of bits in ban to apply. */ int bits; /** Username associated with ban. */ string name; /** Hash of banned user. */ string hash; /** Reason for ban. */ string reason; /** Date ban was applied in unix time format. */ int start; /** Duration of ban. */ int duration; }; /** A entry in the log. **/ struct LogEntry { /** Timestamp in UNIX time_t */ int timestamp; /** The log message. */ string txt; }; class Tree; sequence TreeList; enum ChannelInfo { ChannelDescription, ChannelPosition }; enum UserInfo { UserName, UserEmail, UserComment, UserHash, UserPassword, UserLastActive, UserKDFIterations }; dictionary UserMap; dictionary ChannelMap; sequence ChannelList; sequence UserList; sequence GroupList; sequence ACLList; sequence LogList; sequence BanList; sequence IdList; sequence NameList; dictionary NameMap; dictionary IdMap; sequence Texture; dictionary ConfigMap; sequence GroupNameList; sequence CertificateDer; sequence CertificateList; /** User information map. * Older versions of ice-php can't handle enums as keys. If you are using one of these, replace 'UserInfo' with 'byte'. */ dictionary UserInfoMap; /** User and subchannel state. Read-only. **/ class Tree { /** Channel definition of current channel. */ Channel c; /** List of subchannels. */ TreeList children; /** Users in this channel. */ UserList users; }; exception MurmurException {}; /** This is thrown when you specify an invalid session. This may happen if the user has disconnected since your last call to {@link Server.getUsers}. See {@link User.session} */ exception InvalidSessionException extends MurmurException {}; /** This is thrown when you specify an invalid channel id. This may happen if the channel was removed by another provess. It can also be thrown if you try to add an invalid channel. */ exception InvalidChannelException extends MurmurException {}; /** This is thrown when you try to do an operation on a server that does not exist. This may happen if someone has removed the server. */ exception InvalidServerException extends MurmurException {}; /** This happens if you try to fetch user or channel state on a stopped server, if you try to stop an already stopped server or start an already started server. */ exception ServerBootedException extends MurmurException {}; /** This is thrown if {@link Server.start} fails, and should generally be the cause for some concern. */ exception ServerFailureException extends MurmurException {}; /** This is thrown when you specify an invalid userid. */ exception InvalidUserException extends MurmurException {}; /** This is thrown when you try to set an invalid texture. */ exception InvalidTextureException extends MurmurException {}; /** This is thrown when you supply an invalid callback. */ exception InvalidCallbackException extends MurmurException {}; /** This is thrown when you supply the wrong secret in the calling context. */ exception InvalidSecretException extends MurmurException {}; /** This is thrown when the channel operation would excede the channel nesting limit */ exception NestingLimitException extends MurmurException {}; /** This is thrown when you ask the server to disclose something that should be secret. */ exception WriteOnlyException extends MurmurException {}; /** This is thrown when invalid input data was specified. */ exception InvalidInputDataException extends MurmurException {}; /** Callback interface for servers. You can supply an implementation of this to receive notification * messages from the server. * If an added callback ever throws an exception or goes away, it will be automatically removed. * Please note that all callbacks are done asynchronously; murmur does not wait for the callback to * complete before continuing processing. * Note that callbacks are removed when a server is stopped, so you should have a callback for * {@link MetaCallback.started} which calls {@link Server.addCallback}. * @see MetaCallback * @see Server.addCallback */ interface ServerCallback { /** Called when a user connects to the server. * @param state State of connected user. */ idempotent void userConnected(User state); /** Called when a user disconnects from the server. The user has already been removed, so you can no longer use methods like {@link Server.getState} * to retrieve the user's state. * @param state State of disconnected user. */ idempotent void userDisconnected(User state); /** Called when a user state changes. This is called if the user moves, is renamed, is muted, deafened etc. * @param state New state of user. */ idempotent void userStateChanged(User state); /** Called when user writes a text message * @param state the User sending the message * @param message the TextMessage the user has sent */ idempotent void userTextMessage(User state, TextMessage message); /** Called when a new channel is created. * @param state State of new channel. */ idempotent void channelCreated(Channel state); /** Called when a channel is removed. The channel has already been removed, you can no longer use methods like {@link Server.getChannelState} * @param state State of removed channel. */ idempotent void channelRemoved(Channel state); /** Called when a new channel state changes. This is called if the channel is moved, renamed or if new links are added. * @param state New state of channel. */ idempotent void channelStateChanged(Channel state); }; /** Context for actions in the Server menu. */ const int ContextServer = 0x01; /** Context for actions in the Channel menu. */ const int ContextChannel = 0x02; /** Context for actions in the User menu. */ const int ContextUser = 0x04; /** Callback interface for context actions. You need to supply one of these for {@link Server.addContext}. * If an added callback ever throws an exception or goes away, it will be automatically removed. * Please note that all callbacks are done asynchronously; murmur does not wait for the callback to * complete before continuing processing. */ interface ServerContextCallback { /** Called when a context action is performed. * @param action Action to be performed. * @param usr User which initiated the action. * @param session If nonzero, session of target user. * @param channelid If not -1, id of target channel. */ idempotent void contextAction(string action, User usr, int session, int channelid); }; /** Callback interface for server authentication. You need to supply one of these for {@link Server.setAuthenticator}. * If an added callback ever throws an exception or goes away, it will be automatically removed. * Please note that unlike {@link ServerCallback} and {@link ServerContextCallback}, these methods are called * synchronously. If the response lags, the entire murmur server will lag. * Also note that, as the method calls are synchronous, making a call to {@link Server} or {@link Meta} will * deadlock the server. */ interface ServerAuthenticator { /** Called to authenticate a user. If you do not know the username in question, always return -2 from this * method to fall through to normal database authentication. * Note that if authentication succeeds, murmur will create a record of the user in it's database, reserving * the username and id so it cannot be used for normal database authentication. * The data in the certificate (name, email addresses etc), as well as the list of signing certificates, * should only be trusted if certstrong is true. * * Internally, Murmur treats usernames as case-insensitive. It is recommended * that authenticators do the same. Murmur checks if a username is in use when * a user connects. If the connecting user is registered, the other username is * kicked. If the connecting user is not registered, the connecting user is not * allowed to join the server. * * @param name Username to authenticate. * @param pw Password to authenticate with. * @param certificates List of der encoded certificates the user connected with. * @param certhash Hash of user certificate, as used by murmur internally when matching. * @param certstrong True if certificate was valid and signed by a trusted CA. * @param newname Set this to change the username from the supplied one. * @param groups List of groups on the root channel that the user will be added to for the duration of the connection. * @return UserID of authenticated user, -1 for authentication failures, -2 for unknown user (fallthrough), * -3 for authentication failures where the data could (temporarily) not be verified. */ idempotent int authenticate(string name, string pw, CertificateList certificates, string certhash, bool certstrong, out string newname, out GroupNameList groups); /** Fetch information about a user. This is used to retrieve information like email address, keyhash etc. If you * want murmur to take care of this information itself, simply return false to fall through. * @param id User id. * @param info Information about user. This needs to include at least "name". * @return true if information is present, false to fall through. */ idempotent bool getInfo(int id, out UserInfoMap info); /** Map a name to a user id. * @param name Username to map. * @return User id or -2 for unknown name. */ idempotent int nameToId(string name); /** Map a user id to a username. * @param id User id to map. * @return Name of user or empty string for unknown id. */ idempotent string idToName(int id); /** Map a user to a custom Texture. * @param id User id to map. * @return User texture or an empty texture for unknwon users or users without textures. */ idempotent Texture idToTexture(int id); }; /** Callback interface for server authentication and registration. This allows you to support both authentication * and account updating. * You do not need to implement this if all you want is authentication, you only need this if other scripts * connected to the same server calls e.g. {@link Server.setTexture}. * Almost all of these methods support fall through, meaning murmur should continue the operation against its * own database. */ interface ServerUpdatingAuthenticator extends ServerAuthenticator { /** Register a new user. * @param info Information about user to register. * @return User id of new user, -1 for registration failure, or -2 to fall through. */ int registerUser(UserInfoMap info); /** Unregister a user. * @param id Userid to unregister. * @return 1 for successfull unregistration, 0 for unsuccessfull unregistration, -1 to fall through. */ int unregisterUser(int id); /** Get a list of registered users matching filter. * @param filter Substring usernames must contain. If empty, return all registered users. * @return List of matching registered users. */ idempotent NameMap getRegisteredUsers(string filter); /** Set additional information for user registration. * @param id Userid of registered user. * @param info Information to set about user. This should be merged with existing information. * @return 1 for successfull update, 0 for unsuccessfull update, -1 to fall through. */ idempotent int setInfo(int id, UserInfoMap info); /** Set texture (now called avatar) of user registration. * @param id registrationId of registered user. * @param tex New texture. * @return 1 for successfull update, 0 for unsuccessfull update, -1 to fall through. */ idempotent int setTexture(int id, Texture tex); }; /** Per-server interface. This includes all methods for configuring and altering * the state of a single virtual server. You can retrieve a pointer to this interface * from one of the methods in {@link Meta}. **/ ["amd"] interface Server { /** Shows if the server currently running (accepting users). * * @return Run-state of server. */ idempotent bool isRunning() throws InvalidSecretException; /** Start server. */ void start() throws ServerBootedException, ServerFailureException, InvalidSecretException; /** Stop server. * Note: Server will be restarted on Murmur restart unless explicitly disabled * with setConf("boot", false) */ void stop() throws ServerBootedException, InvalidSecretException; /** Delete server and all it's configuration. */ void delete() throws ServerBootedException, InvalidSecretException; /** Fetch the server id. * * @return Unique server id. */ idempotent int id() throws InvalidSecretException; /** Add a callback. The callback will receive notifications about changes to users and channels. * * @param cb Callback interface which will receive notifications. * @see removeCallback */ void addCallback(ServerCallback *cb) throws ServerBootedException, InvalidCallbackException, InvalidSecretException; /** Remove a callback. * * @param cb Callback interface to be removed. * @see addCallback */ void removeCallback(ServerCallback *cb) throws ServerBootedException, InvalidCallbackException, InvalidSecretException; /** Set external authenticator. If set, all authentications from clients are forwarded to this * proxy. * * @param auth Authenticator object to perform subsequent authentications. */ void setAuthenticator(ServerAuthenticator *auth) throws ServerBootedException, InvalidCallbackException, InvalidSecretException; /** Retrieve configuration item. * @param key Configuration key. * @return Configuration value. If this is empty, see {@link Meta.getDefaultConf} */ idempotent string getConf(string key) throws InvalidSecretException, WriteOnlyException; /** Retrieve all configuration items. * @return All configured values. If a value isn't set here, the value from {@link Meta.getDefaultConf} is used. */ idempotent ConfigMap getAllConf() throws InvalidSecretException; /** Set a configuration item. * @param key Configuration key. * @param value Configuration value. */ idempotent void setConf(string key, string value) throws InvalidSecretException; /** Set superuser password. This is just a convenience for using {@link updateRegistration} on user id 0. * @param pw Password. */ idempotent void setSuperuserPassword(string pw) throws InvalidSecretException; /** Fetch log entries. * @param first Lowest numbered entry to fetch. 0 is the most recent item. * @param last Last entry to fetch. * @return List of log entries. */ idempotent LogList getLog(int first, int last) throws InvalidSecretException; /** Fetch length of log * @return Number of entries in log */ idempotent int getLogLen() throws InvalidSecretException; /** Fetch all users. This returns all currently connected users on the server. * @return List of connected users. * @see getState */ idempotent UserMap getUsers() throws ServerBootedException, InvalidSecretException; /** Fetch all channels. This returns all defined channels on the server. The root channel is always channel 0. * @return List of defined channels. * @see getChannelState */ idempotent ChannelMap getChannels() throws ServerBootedException, InvalidSecretException; /** Fetch certificate of user. This returns the complete certificate chain of a user. * @param session Connection ID of user. See {@link User.session}. * @return Certificate list of user. */ idempotent CertificateList getCertificateList(int session) throws ServerBootedException, InvalidSessionException, InvalidSecretException; /** Fetch all channels and connected users as a tree. This retrieves an easy-to-use representation of the server * as a tree. This is primarily used for viewing the state of the server on a webpage. * @return Recursive tree of all channels and connected users. */ idempotent Tree getTree() throws ServerBootedException, InvalidSecretException; /** Fetch all current IP bans on the server. * @return List of bans. */ idempotent BanList getBans() throws ServerBootedException, InvalidSecretException; /** Set all current IP bans on the server. This will replace any bans already present, so if you want to add a ban, be sure to call {@link getBans} and then * append to the returned list before calling this method. * @param bans List of bans. */ idempotent void setBans(BanList bans) throws ServerBootedException, InvalidSecretException; /** Kick a user. The user is not banned, and is free to rejoin the server. * @param session Connection ID of user. See {@link User.session}. * @param reason Text message to show when user is kicked. */ void kickUser(int session, string reason) throws ServerBootedException, InvalidSessionException, InvalidSecretException; /** Get state of a single connected user. * @param session Connection ID of user. See {@link User.session}. * @return State of connected user. * @see setState * @see getUsers */ idempotent User getState(int session) throws ServerBootedException, InvalidSessionException, InvalidSecretException; /** Set user state. You can use this to move, mute and deafen users. * @param state User state to set. * @see getState */ idempotent void setState(User state) throws ServerBootedException, InvalidSessionException, InvalidChannelException, InvalidSecretException; /** Send text message to a single user. * @param session Connection ID of user. See {@link User.session}. * @param text Message to send. * @see sendMessageChannel */ void sendMessage(int session, string text) throws ServerBootedException, InvalidSessionException, InvalidSecretException; /** Check if user is permitted to perform action. * @param session Connection ID of user. See {@link User.session}. * @param channelid ID of Channel. See {@link Channel.id}. * @param perm Permission bits to check. * @return true if any of the permissions in perm were set for the user. */ bool hasPermission(int session, int channelid, int perm) throws ServerBootedException, InvalidSessionException, InvalidChannelException, InvalidSecretException; /** Return users effective permissions * @param session Connection ID of user. See {@link User.session}. * @param channelid ID of Channel. See {@link Channel.id}. * @return bitfield of allowed actions */ idempotent int effectivePermissions(int session, int channelid) throws ServerBootedException, InvalidSessionException, InvalidChannelException, InvalidSecretException; /** Add a context callback. This is done per user, and will add a context menu action for the user. * * @param session Session of user which should receive context entry. * @param action Action string, a unique name to associate with the action. * @param text Name of action shown to user. * @param cb Callback interface which will receive notifications. * @param ctx Context this should be used in. Needs to be one or a combination of {@link ContextServer}, {@link ContextChannel} and {@link ContextUser}. * @see removeContextCallback */ void addContextCallback(int session, string action, string text, ServerContextCallback *cb, int ctx) throws ServerBootedException, InvalidCallbackException, InvalidSecretException; /** Remove a callback. * * @param cb Callback interface to be removed. This callback will be removed from all from all users. * @see addContextCallback */ void removeContextCallback(ServerContextCallback *cb) throws ServerBootedException, InvalidCallbackException, InvalidSecretException; /** Get state of single channel. * @param channelid ID of Channel. See {@link Channel.id}. * @return State of channel. * @see setChannelState * @see getChannels */ idempotent Channel getChannelState(int channelid) throws ServerBootedException, InvalidChannelException, InvalidSecretException; /** Set state of a single channel. You can use this to move or relink channels. * @param state Channel state to set. * @see getChannelState */ idempotent void setChannelState(Channel state) throws ServerBootedException, InvalidChannelException, InvalidSecretException, NestingLimitException; /** Remove a channel and all its subchannels. * @param channelid ID of Channel. See {@link Channel.id}. */ void removeChannel(int channelid) throws ServerBootedException, InvalidChannelException, InvalidSecretException; /** Add a new channel. * @param name Name of new channel. * @param parent Channel ID of parent channel. See {@link Channel.id}. * @return ID of newly created channel. */ int addChannel(string name, int parent) throws ServerBootedException, InvalidChannelException, InvalidSecretException, NestingLimitException; /** Send text message to channel or a tree of channels. * @param channelid Channel ID of channel to send to. See {@link Channel.id}. * @param tree If true, the message will be sent to the channel and all its subchannels. * @param text Message to send. * @see sendMessage */ void sendMessageChannel(int channelid, bool tree, string text) throws ServerBootedException, InvalidChannelException, InvalidSecretException; /** Retrieve ACLs and Groups on a channel. * @param channelid Channel ID of channel to fetch from. See {@link Channel.id}. * @param acls List of ACLs on the channel. This will include inherited ACLs. * @param groups List of groups on the channel. This will include inherited groups. * @param inherit Does this channel inherit ACLs from the parent channel? */ idempotent void getACL(int channelid, out ACLList acls, out GroupList groups, out bool inherit) throws ServerBootedException, InvalidChannelException, InvalidSecretException; /** Set ACLs and Groups on a channel. Note that this will replace all existing ACLs and groups on the channel. * @param channelid Channel ID of channel to fetch from. See {@link Channel.id}. * @param acls List of ACLs on the channel. * @param groups List of groups on the channel. * @param inherit Should this channel inherit ACLs from the parent channel? */ idempotent void setACL(int channelid, ACLList acls, GroupList groups, bool inherit) throws ServerBootedException, InvalidChannelException, InvalidSecretException; /** Temporarily add a user to a group on a channel. This state is not saved, and is intended for temporary memberships. * @param channelid Channel ID of channel to add to. See {@link Channel.id}. * @param session Connection ID of user. See {@link User.session}. * @param group Group name to add to. */ idempotent void addUserToGroup(int channelid, int session, string group) throws ServerBootedException, InvalidChannelException, InvalidSessionException, InvalidSecretException; /** Remove a user from a temporary group membership on a channel. This state is not saved, and is intended for temporary memberships. * @param channelid Channel ID of channel to add to. See {@link Channel.id}. * @param session Connection ID of user. See {@link User.session}. * @param group Group name to remove from. */ idempotent void removeUserFromGroup(int channelid, int session, string group) throws ServerBootedException, InvalidChannelException, InvalidSessionException, InvalidSecretException; /** Redirect whisper targets for user. If set, whenever a user tries to whisper to group "source", the whisper will be redirected to group "target". * To remove a redirect pass an empty target string. This is intended for context groups. * @param session Connection ID of user. See {@link User.session}. * @param source Group name to redirect from. * @param target Group name to redirect to. */ idempotent void redirectWhisperGroup(int session, string source, string target) throws ServerBootedException, InvalidSessionException, InvalidSecretException; /** Map a list of {@link User.userid} to a matching name. * @param List of ids. * @return Matching list of names, with an empty string representing invalid or unknown ids. */ idempotent NameMap getUserNames(IdList ids) throws ServerBootedException, InvalidSecretException; /** Map a list of user names to a matching id. * @param List of names. * @reuturn List of matching ids, with -1 representing invalid or unknown user names. */ idempotent IdMap getUserIds(NameList names) throws ServerBootedException, InvalidSecretException; /** Register a new user. * @param info Information about new user. Must include at least "name". * @return The ID of the user. See {@link RegisteredUser.userid}. */ int registerUser(UserInfoMap info) throws ServerBootedException, InvalidUserException, InvalidSecretException; /** Remove a user registration. * @param userid ID of registered user. See {@link RegisteredUser.userid}. */ void unregisterUser(int userid) throws ServerBootedException, InvalidUserException, InvalidSecretException; /** Update the registration for a user. You can use this to set the email or password of a user, * and can also use it to change the user's name. * @param registration Updated registration record. */ idempotent void updateRegistration(int userid, UserInfoMap info) throws ServerBootedException, InvalidUserException, InvalidSecretException; /** Fetch registration for a single user. * @param userid ID of registered user. See {@link RegisteredUser.userid}. * @return Registration record. */ idempotent UserInfoMap getRegistration(int userid) throws ServerBootedException, InvalidUserException, InvalidSecretException; /** Fetch a group of registered users. * @param filter Substring of user name. If blank, will retrieve all registered users. * @return List of registration records. */ idempotent NameMap getRegisteredUsers(string filter) throws ServerBootedException, InvalidSecretException; /** Verify the password of a user. You can use this to verify a user's credentials. * @param name User name. See {@link RegisteredUser.name}. * @param pw User password. * @return User ID of registered user (See {@link RegisteredUser.userid}), -1 for failed authentication or -2 for unknown usernames. */ idempotent int verifyPassword(string name, string pw) throws ServerBootedException, InvalidSecretException; /** Fetch user texture. Textures are stored as zlib compress()ed 600x60 32-bit BGRA data. * @param userid ID of registered user. See {@link RegisteredUser.userid}. * @return Custom texture associated with user or an empty texture. */ idempotent Texture getTexture(int userid) throws ServerBootedException, InvalidUserException, InvalidSecretException; /** Set a user texture (now called avatar). * @param userid ID of registered user. See {@link RegisteredUser.userid}. * @param tex Texture (as a Byte-Array) to set for the user, or an empty texture to remove the existing texture. */ idempotent void setTexture(int userid, Texture tex) throws ServerBootedException, InvalidUserException, InvalidTextureException, InvalidSecretException; /** Get virtual server uptime. * @return Uptime of the virtual server in seconds */ idempotent int getUptime() throws ServerBootedException, InvalidSecretException; /** * Update the server's certificate information. * * Reconfigure the running server's TLS socket with the given * certificate and private key. * * The certificate and and private key must be PEM formatted. * * New clients will see the new certificate. * Existing clients will continue to see the certificate the server * was using when they connected to it. * * This method throws InvalidInputDataException if any of the * following errors happen: * - Unable to decode the PEM certificate and/or private key. * - Unable to decrypt the private key with the given passphrase. * - The certificate and/or private key do not contain RSA keys. * - The certificate is not usable with the given private key. */ idempotent void updateCertificate(string certificate, string privateKey, string passphrase) throws ServerBootedException, InvalidSecretException, InvalidInputDataException; }; /** Callback interface for Meta. You can supply an implementation of this to receive notifications * when servers are stopped or started. * If an added callback ever throws an exception or goes away, it will be automatically removed. * Please note that all callbacks are done asynchronously; murmur does not wait for the callback to * complete before continuing processing. * @see ServerCallback * @see Meta.addCallback */ interface MetaCallback { /** Called when a server is started. The server is up and running when this event is sent, so all methods that * need a running server will work. * @param srv Interface for started server. */ void started(Server *srv); /** Called when a server is stopped. The server is already stopped when this event is sent, so no methods that * need a running server will work. * @param srv Interface for started server. */ void stopped(Server *srv); }; sequence ServerList; /** This is the meta interface. It is primarily used for retrieving the {@link Server} interfaces for each individual server. **/ ["amd"] interface Meta { /** Fetch interface to specific server. * @param id Server ID. See {@link Server.getId}. * @return Interface for specified server, or a null proxy if id is invalid. */ idempotent Server *getServer(int id) throws InvalidSecretException; /** Create a new server. Call {@link Server.getId} on the returned interface to find it's ID. * @return Interface for new server. */ Server *newServer() throws InvalidSecretException; /** Fetch list of all currently running servers. * @return List of interfaces for running servers. */ idempotent ServerList getBootedServers() throws InvalidSecretException; /** Fetch list of all defined servers. * @return List of interfaces for all servers. */ idempotent ServerList getAllServers() throws InvalidSecretException; /** Fetch default configuraion. This returns the configuration items that were set in the configuration file, or * the built-in default. The individual servers will use these values unless they have been overridden in the * server specific configuration. The only special case is the port, which defaults to the value defined here + * the servers ID - 1 (so that virtual server #1 uses the defined port, server #2 uses port+1 etc). * @return Default configuration of the servers. */ idempotent ConfigMap getDefaultConf() throws InvalidSecretException; /** Fetch version of Murmur. * @param major Major version. * @param minor Minor version. * @param patch Patchlevel. * @param text Textual representation of version. Note that this may not match the {@link major}, {@link minor} and {@link patch} levels, as it * may be simply the compile date or the SVN revision. This is usually the text you want to present to users. */ idempotent void getVersion(out int major, out int minor, out int patch, out string text); /** Add a callback. The callback will receive notifications when servers are started or stopped. * * @param cb Callback interface which will receive notifications. */ void addCallback(MetaCallback *cb) throws InvalidCallbackException, InvalidSecretException; /** Remove a callback. * * @param cb Callback interface to be removed. */ void removeCallback(MetaCallback *cb) throws InvalidCallbackException, InvalidSecretException; /** Get murmur uptime. * @return Uptime of murmur in seconds */ idempotent int getUptime(); /** Get slice file. * @return Contents of the slice file server compiled with. */ idempotent string getSlice(); /** Returns a checksum dict for the slice file. * @return Checksum dict */ idempotent Ice::SliceChecksumDict getSliceChecksums(); }; }; mumble-1.3.4/src/murmur/MurmurI.h0000664000175000017500000002604114010707274016534 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MURMUR_MURMURI_H_ #define MUMBLE_MURMUR_MURMURI_H_ #include namespace Murmur { class ServerI : virtual public Server { public: virtual void isRunning_async(const ::Murmur::AMD_Server_isRunningPtr&, const Ice::Current&); virtual void start_async(const ::Murmur::AMD_Server_startPtr&, const Ice::Current&); virtual void stop_async(const ::Murmur::AMD_Server_stopPtr&, const Ice::Current&); virtual void delete_async(const ::Murmur::AMD_Server_deletePtr&, const Ice::Current&); virtual void addCallback_async(const ::Murmur::AMD_Server_addCallbackPtr&, const ::Murmur::ServerCallbackPrx&, const ::Ice::Current&); virtual void removeCallback_async(const ::Murmur::AMD_Server_removeCallbackPtr&, const ::Murmur::ServerCallbackPrx&, const ::Ice::Current&); virtual void setAuthenticator_async(const ::Murmur::AMD_Server_setAuthenticatorPtr&, const ::Murmur::ServerAuthenticatorPrx&, const ::Ice::Current&); virtual void id_async(const ::Murmur::AMD_Server_idPtr&, const Ice::Current&); virtual void getConf_async(const ::Murmur::AMD_Server_getConfPtr&, const ::std::string&, const Ice::Current&); virtual void getAllConf_async(const ::Murmur::AMD_Server_getAllConfPtr&, const Ice::Current&); virtual void setConf_async(const ::Murmur::AMD_Server_setConfPtr&, const ::std::string&, const ::std::string&, const Ice::Current&); virtual void setSuperuserPassword_async(const ::Murmur::AMD_Server_setSuperuserPasswordPtr&, const ::std::string&, const Ice::Current&); virtual void getLog_async(const ::Murmur::AMD_Server_getLogPtr&, ::Ice::Int, ::Ice::Int, const Ice::Current&); virtual void getLogLen_async(const ::Murmur::AMD_Server_getLogLenPtr&, const Ice::Current&); virtual void getUsers_async(const ::Murmur::AMD_Server_getUsersPtr&, const Ice::Current&); virtual void getChannels_async(const ::Murmur::AMD_Server_getChannelsPtr&, const Ice::Current&); virtual void getTree_async(const ::Murmur::AMD_Server_getTreePtr&, const Ice::Current&); virtual void getCertificateList_async(const ::Murmur::AMD_Server_getCertificateListPtr&, ::Ice::Int, const ::Ice::Current&); virtual void getBans_async(const ::Murmur::AMD_Server_getBansPtr&, const Ice::Current&); virtual void setBans_async(const ::Murmur::AMD_Server_setBansPtr&, const ::Murmur::BanList&, const Ice::Current&); virtual void kickUser_async(const ::Murmur::AMD_Server_kickUserPtr&, ::Ice::Int, const ::std::string&, const Ice::Current&); virtual void sendMessage_async(const ::Murmur::AMD_Server_sendMessagePtr&, ::Ice::Int, const ::std::string&, const Ice::Current&); virtual void hasPermission_async(const ::Murmur::AMD_Server_hasPermissionPtr&, ::Ice::Int, ::Ice::Int, ::Ice::Int, const ::Ice::Current&); virtual void effectivePermissions_async(const ::Murmur::AMD_Server_effectivePermissionsPtr&, ::Ice::Int, ::Ice::Int, const ::Ice::Current&); virtual void addContextCallback_async(const ::Murmur::AMD_Server_addContextCallbackPtr&, ::Ice::Int, const ::std::string&, const ::std::string&, const ::Murmur::ServerContextCallbackPrx&, int, const ::Ice::Current&); virtual void removeContextCallback_async(const ::Murmur::AMD_Server_removeContextCallbackPtr&, const ::Murmur::ServerContextCallbackPrx&, const ::Ice::Current&); virtual void getState_async(const ::Murmur::AMD_Server_getStatePtr&, ::Ice::Int, const Ice::Current&); virtual void setState_async(const ::Murmur::AMD_Server_setStatePtr&, const ::Murmur::User&, const Ice::Current&); virtual void getChannelState_async(const ::Murmur::AMD_Server_getChannelStatePtr&, ::Ice::Int, const Ice::Current&); virtual void setChannelState_async(const ::Murmur::AMD_Server_setChannelStatePtr&, const ::Murmur::Channel&, const Ice::Current&); virtual void removeChannel_async(const ::Murmur::AMD_Server_removeChannelPtr&, ::Ice::Int, const Ice::Current&); virtual void addChannel_async(const ::Murmur::AMD_Server_addChannelPtr&, const ::std::string&, ::Ice::Int, const Ice::Current&); virtual void sendMessageChannel_async(const ::Murmur::AMD_Server_sendMessageChannelPtr&, ::Ice::Int, bool, const ::std::string&, const Ice::Current&); virtual void getACL_async(const ::Murmur::AMD_Server_getACLPtr&, ::Ice::Int, const Ice::Current&); virtual void setACL_async(const ::Murmur::AMD_Server_setACLPtr&, ::Ice::Int, const ::Murmur::ACLList&, const ::Murmur::GroupList&, bool, const Ice::Current&); virtual void removeUserFromGroup_async(const ::Murmur::AMD_Server_removeUserFromGroupPtr&, ::Ice::Int, ::Ice::Int, const ::std::string&, const ::Ice::Current&); virtual void addUserToGroup_async(const ::Murmur::AMD_Server_addUserToGroupPtr&, ::Ice::Int, ::Ice::Int, const ::std::string&, const ::Ice::Current&); virtual void redirectWhisperGroup_async(const ::Murmur::AMD_Server_redirectWhisperGroupPtr&, ::Ice::Int, const ::std::string&, const ::std::string&, const ::Ice::Current&); virtual void getUserNames_async(const ::Murmur::AMD_Server_getUserNamesPtr&, const ::Murmur::IdList&, const Ice::Current&); virtual void getUserIds_async(const ::Murmur::AMD_Server_getUserIdsPtr&, const ::Murmur::NameList&, const Ice::Current&); virtual void registerUser_async(const ::Murmur::AMD_Server_registerUserPtr&, const Murmur::UserInfoMap&, const Ice::Current&); virtual void unregisterUser_async(const ::Murmur::AMD_Server_unregisterUserPtr&, ::Ice::Int, const Ice::Current&); virtual void updateRegistration_async(const ::Murmur::AMD_Server_updateRegistrationPtr&, Ice::Int, const Murmur::UserInfoMap&, const Ice::Current&); virtual void getRegistration_async(const ::Murmur::AMD_Server_getRegistrationPtr&, ::Ice::Int, const Ice::Current&); virtual void getRegisteredUsers_async(const ::Murmur::AMD_Server_getRegisteredUsersPtr&, const ::std::string&, const Ice::Current&); virtual void verifyPassword_async(const ::Murmur::AMD_Server_verifyPasswordPtr&, const ::std::string&, const ::std::string&, const Ice::Current&); virtual void getTexture_async(const ::Murmur::AMD_Server_getTexturePtr&, ::Ice::Int, const Ice::Current&); virtual void setTexture_async(const ::Murmur::AMD_Server_setTexturePtr&, ::Ice::Int, const ::Murmur::Texture&, const Ice::Current&); virtual void getUptime_async(const ::Murmur::AMD_Server_getUptimePtr&, const Ice::Current&); virtual void updateCertificate_async(const ::Murmur::AMD_Server_updateCertificatePtr&, const std::string&, const std::string&, const std::string&, const Ice::Current&); virtual void ice_ping(const Ice::Current&) const; }; class MetaI : virtual public Meta { public: virtual void getSliceChecksums_async(const ::Murmur::AMD_Meta_getSliceChecksumsPtr&, const ::Ice::Current&); virtual void getServer_async(const ::Murmur::AMD_Meta_getServerPtr&, ::Ice::Int, const Ice::Current&); virtual void newServer_async(const ::Murmur::AMD_Meta_newServerPtr&, const Ice::Current&); virtual void getBootedServers_async(const ::Murmur::AMD_Meta_getBootedServersPtr&, const Ice::Current&); virtual void getAllServers_async(const ::Murmur::AMD_Meta_getAllServersPtr&, const Ice::Current&); virtual void getDefaultConf_async(const ::Murmur::AMD_Meta_getDefaultConfPtr&, const Ice::Current&); virtual void getVersion_async(const ::Murmur::AMD_Meta_getVersionPtr&, const Ice::Current&); virtual void addCallback_async(const ::Murmur::AMD_Meta_addCallbackPtr&, const ::Murmur::MetaCallbackPrx&, const ::Ice::Current& = ::Ice::Current()); virtual void removeCallback_async(const ::Murmur::AMD_Meta_removeCallbackPtr&, const ::Murmur::MetaCallbackPrx&, const ::Ice::Current& = ::Ice::Current()); virtual void getUptime_async(const ::Murmur::AMD_Meta_getUptimePtr&, const Ice::Current&); virtual void getSlice_async(const ::Murmur::AMD_Meta_getSlicePtr&, const Ice::Current&); }; } #endif mumble-1.3.4/src/murmur/main.cpp0000664000175000017500000003675214010707274016425 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "murmur_pch.h" #ifdef Q_OS_WIN #include "Tray.h" #include "About.h" #endif #include "Server.h" #include "ServerDB.h" #include "DBus.h" #include "Meta.h" #include "Version.h" #include "SSL.h" #include "License.h" #include "LogEmitter.h" #include "EnvUtils.h" #ifdef Q_OS_UNIX #include "UnixMurmur.h" #endif QFile *qfLog = NULL; static bool bVerbose = false; #ifdef QT_NO_DEBUG static bool detach = true; #else static bool detach = false; #endif #ifdef Q_OS_UNIX static UnixMurmur *unixMurmur = NULL; #endif Meta *meta = NULL; static LogEmitter le; static QStringList qlErrors; static void murmurMessageOutputQString(QtMsgType type, const QString &msg) { #ifdef Q_OS_UNIX if (unixMurmur->logToSyslog) { int level; switch (type) { case QtDebugMsg: level = LOG_DEBUG; break; case QtWarningMsg: level = LOG_WARNING; break; case QtCriticalMsg: level = LOG_CRIT; break; case QtFatalMsg: default: level = LOG_ALERT; break; } syslog(level, "%s", qPrintable(msg)); if (type == QtFatalMsg) { exit(1); } return; } #endif char c; switch (type) { case QtDebugMsg: if (! bVerbose) return; c='D'; break; case QtWarningMsg: c='W'; break; case QtCriticalMsg: c='C'; break; case QtFatalMsg: c='F'; break; default: c='X'; } QString m= QString::fromLatin1("<%1>%2 %3").arg(QChar::fromLatin1(c)).arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz")).arg(msg); if (! qfLog || ! qfLog->isOpen()) { #ifdef Q_OS_UNIX if (! detach) fprintf(stderr, "%s\n", qPrintable(m)); else qlErrors << m; #else qlErrors << m; #ifndef QT_NO_DEBUG fprintf(stderr, "%s\n", qPrintable(m)); #endif #endif } else { if (! qlErrors.isEmpty()) { foreach(const QString &e, qlErrors) { qfLog->write(e.toUtf8()); qfLog->write("\n"); } qlErrors.clear(); } qfLog->write(m.toUtf8()); qfLog->write("\n"); qfLog->flush(); } le.addLogEntry(m); if (type == QtFatalMsg) { #ifdef Q_OS_UNIX if (detach) { if (qlErrors.isEmpty()) qlErrors << msg; qlErrors << QString(); m = qlErrors.join(QLatin1String("\n")); fprintf(stderr, "%s", qPrintable(m)); } #else ::MessageBoxA(NULL, qPrintable(m), "Murmur", MB_OK | MB_ICONWARNING); #endif exit(1); } } #if QT_VERSION >= 0x050000 static void murmurMessageOutputWithContext(QtMsgType type, const QMessageLogContext &ctx, const QString &msg) { Q_UNUSED(ctx); murmurMessageOutputQString(type, msg); } #else static void murmurMessageOutput(QtMsgType type, const char *msg) { murmurMessageOutputQString(type, QString::fromUtf8(msg)); } #endif #ifdef USE_ICE void IceParse(int &argc, char *argv[]); void IceStart(); void IceStop(); #endif #ifdef USE_GRPC // From MurmurGRPCImpl.cpp. void GRPCStart(); void GRPCStop(); #endif int main(int argc, char **argv) { // Check for SSE and MMX, but only in the windows binaries #ifdef Q_OS_WIN int cpuinfo[4]; __cpuid(cpuinfo, 1); #define MMXSSE 0x02800000 if ((cpuinfo[3] & MMXSSE) != MMXSSE) { ::MessageBoxA(NULL, "Mumble requires a SSE capable processor (Pentium 3 / Ahtlon-XP)", "Mumble", MB_OK | MB_ICONERROR); exit(0); } SetDllDirectory(L""); #endif int res; #ifdef USE_ICE IceParse(argc, argv); #endif #ifdef Q_OS_WIN QApplication a(argc, argv); a.setQuitOnLastWindowClosed(false); QIcon icon; icon.addFile(QLatin1String(":/murmur.16x16.png")); icon.addFile(QLatin1String(":/murmur.32x32.png")); icon.addFile(QLatin1String(":/murmur.64x64.png")); a.setWindowIcon(icon); #else #ifndef Q_OS_MAC EnvUtils::setenv(QLatin1String("AVAHI_COMPAT_NOWARN"), QLatin1String("1")); #endif QCoreApplication a(argc, argv); UnixMurmur unixhandler; unixMurmur = &unixhandler; unixhandler.initialcap(); #endif a.setApplicationName("Murmur"); a.setOrganizationName("Mumble"); a.setOrganizationDomain("mumble.sourceforge.net"); MumbleSSL::initialize(); QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); #if QT_VERSION < 0x050000 QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); #endif #ifdef Q_OS_WIN // By default, windbus expects the path to dbus-daemon to be in PATH, and the path // should contain bin\\, and the path to the config is hardcoded as ..\etc { QString path = EnvUtils::getenv(QLatin1String("PATH")); if (path.isEmpty()) { qWarning() << "Failed to get PATH. Not adding application directory to PATH. DBus bindings may not work."; } else { QString newPath = QString::fromLatin1("%1;%2").arg(QDir::toNativeSeparators(a.applicationDirPath())).arg(path); if (!EnvUtils::setenv(QLatin1String("PATH"), newPath)) { qWarning() << "Failed to set PATH. DBus bindings may not work."; } } } #endif QString inifile; QString supw; bool disableSu = false; bool wipeSsl = false; bool wipeLogs = false; int sunum = 1; #ifdef Q_OS_UNIX bool readPw = false; #endif qsrand(QDateTime::currentDateTime().toTime_t()); #if QT_VERSION >= 0x050000 qInstallMessageHandler(murmurMessageOutputWithContext); #else qInstallMsgHandler(murmurMessageOutput); #endif #ifdef Q_OS_WIN Tray tray(NULL, &le); #endif QStringList args = a.arguments(); for (int i = 1; i < args.size(); i++) { bool bLast = false; QString arg = args.at(i).toLower(); if ((arg == "-supw")) { detach = false; if (i+1 < args.size()) { i++; supw = args.at(i); if (i+1 < args.size()) { i++; sunum = args.at(i).toInt(); } bLast = true; } else { #ifdef Q_OS_UNIX qFatal("-supw expects the password on the command line - maybe you meant -readsupw?"); #else qFatal("-supw expects the password on the command line"); #endif } #ifdef Q_OS_UNIX } else if ((arg == "-readsupw")) { detach = false; readPw = true; if (i+1 < args.size()) { i++; sunum = args.at(i).toInt(); } bLast = true; #endif } else if ((arg == "-disablesu")) { detach = false; disableSu = true; if (i+1 < args.size()) { i++; sunum = args.at(i).toInt(); } bLast = true; } else if ((arg == "-ini") && (i+1 < args.size())) { i++; inifile = args.at(i); } else if ((arg == "-wipessl")) { wipeSsl = true; } else if ((arg == "-wipelogs")) { wipeLogs = true; } else if ((arg == "-fg")) { detach = false; } else if ((arg == "-v")) { bVerbose = true; } else if ((arg == "-version") || (arg == "--version")) { detach = false; qInfo("%s -- %s", qPrintable(args.at(0)), MUMBLE_RELEASE); return 0; } else if (args.at(i) == QLatin1String("-license") || args.at(i) == QLatin1String("--license")) { #ifdef Q_OS_WIN AboutDialog ad(NULL, AboutDialogOptionsShowLicense); ad.exec(); return 0; #else qInfo("%s\n", qPrintable(License::license())); return 0; #endif } else if (args.at(i) == QLatin1String("-authors") || args.at(i) == QLatin1String("--authors")) { #ifdef Q_OS_WIN AboutDialog ad(NULL, AboutDialogOptionsShowAuthors); ad.exec(); return 0; #else qInfo("%s\n", qPrintable(License::authors())); return 0; #endif } else if (args.at(i) == QLatin1String("-third-party-licenses") || args.at(i) == QLatin1String("--third-party-licenses")) { #ifdef Q_OS_WIN AboutDialog ad(NULL, AboutDialogOptionsShowThirdPartyLicenses); ad.exec(); return 0; #else qInfo("%s", qPrintable(License::printableThirdPartyLicenseInfo())); return 0; #endif } else if ((arg == "-h") || (arg == "-help") || (arg == "--help")) { detach = false; qInfo("Usage: %s [-ini ] [-supw ]\n" " -ini Specify ini file to use.\n" " -supw [srv] Set password for 'SuperUser' account on server srv.\n" #ifdef Q_OS_UNIX " -readsupw [srv] Reads password for server srv from standard input.\n" #endif " -disablesu [srv] Disable password for 'SuperUser' account on server srv.\n" #ifdef Q_OS_UNIX " -limits Tests and shows how many file descriptors and threads can be created.\n" " The purpose of this option is to test how many clients Murmur can handle.\n" " Murmur will exit after this test.\n" #endif " -v Add verbose output.\n" #ifdef Q_OS_UNIX " -fg Don't detach from console.\n" #else " -fg Don't write to the log file.\n" #endif " -wipessl Remove SSL certificates from database.\n" " -wipelogs Remove all log entries from database.\n" " -version Show version information.\n" "\n" " -license Show Murmur's license.\n" " -authors Show Murmur's authors.\n" " -third-party-licenses Show licenses for third-party software used by Murmur.\n" "\n" "If no inifile is provided, murmur will search for one in \n" "default locations.", qPrintable(args.at(0))); return 0; #ifdef Q_OS_UNIX } else if (arg == "-limits") { detach = false; Meta::mp.read(inifile); unixhandler.setuid(); unixhandler.finalcap(); LimitTest::testLimits(a); #endif } else { detach = false; qFatal("Unknown argument %s", qPrintable(args.at(i))); } if (bLast && (i+1 != args.size())) { detach = false; qFatal("Password arguments must be last."); } } if (QSslSocket::supportsSsl()) { qInfo("SSL: OpenSSL version is '%s'", SSLeay_version(SSLEAY_VERSION)); } else { qFatal("SSL: this version of Murmur is built against Qt without SSL Support. Aborting."); } #ifdef Q_OS_UNIX inifile = unixhandler.trySystemIniFiles(inifile); #endif Meta::mp.read(inifile); // need to open log file early so log dir can be root owned: // http://article.gmane.org/gmane.comp.security.oss.general/4404 #ifdef Q_OS_UNIX unixhandler.logToSyslog = Meta::mp.qsLogfile == QLatin1String("syslog"); if (detach && ! Meta::mp.qsLogfile.isEmpty() && !unixhandler.logToSyslog) { #else if (detach && ! Meta::mp.qsLogfile.isEmpty()) { #endif qfLog = new QFile(Meta::mp.qsLogfile); if (! qfLog->open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text)) { delete qfLog; qfLog = NULL; #ifdef Q_OS_UNIX fprintf(stderr, "murmurd: failed to open logfile %s: no logging will be done\n", qPrintable(Meta::mp.qsLogfile)); #else qWarning("Failed to open logfile %s. No logging will be performed.", qPrintable(Meta::mp.qsLogfile)); #endif } else { qfLog->setTextModeEnabled(true); QFileInfo qfi(*qfLog); Meta::mp.qsLogfile = qfi.absoluteFilePath(); #ifdef Q_OS_UNIX if (Meta::mp.uiUid != 0 && fchown(qfLog->handle(), Meta::mp.uiUid, Meta::mp.uiGid) == -1) { qFatal("can't change log file owner to %d %d:%d - %s", qfLog->handle(), Meta::mp.uiUid, Meta::mp.uiGid, strerror(errno)); } #endif } #ifdef Q_OS_UNIX } else if (detach && unixhandler.logToSyslog) { openlog("murmurd", LOG_PID, LOG_DAEMON); syslog(LOG_DEBUG, "murmurd syslog adapter up and running"); #endif } else { detach = false; } #ifdef Q_OS_UNIX unixhandler.setuid(); #endif MumbleSSL::addSystemCA(); ServerDB db; meta = new Meta(); #ifdef Q_OS_UNIX if (readPw) { char password[256]; char *p; printf("Password: "); fflush(NULL); if (fgets(password, 255, stdin) != password) qFatal("No password provided"); p = strchr(password, '\r'); if (p) *p = 0; p = strchr(password, '\n'); if (p) *p = 0; supw = QLatin1String(password); } #endif if (!supw.isNull()) { if (supw.isEmpty()) { qFatal("Superuser password can not be empty"); } ServerDB::setSUPW(sunum, supw); qInfo("Superuser password set on server %d", sunum); return 0; } if (disableSu) { ServerDB::disableSU(sunum); qInfo("SuperUser password disabled on server %d", sunum); return 0; } if (wipeSsl) { qWarning("Removing all per-server SSL certificates from the database."); foreach(int sid, ServerDB::getAllServers()) { ServerDB::setConf(sid, "key"); ServerDB::setConf(sid, "certificate"); ServerDB::setConf(sid, "passphrase"); ServerDB::setConf(sid, "sslDHParams"); } } if (wipeLogs) { qWarning("Removing all log entries from the database."); ServerDB::wipeLogs(); } #ifdef Q_OS_UNIX if (detach) { if (fork() != 0) { _exit(0); } setsid(); if (fork() != 0) { _exit(0); } if (! Meta::mp.qsPid.isEmpty()) { QFile pid(Meta::mp.qsPid); if (pid.open(QIODevice::WriteOnly)) { QFileInfo fi(pid); Meta::mp.qsPid = fi.absoluteFilePath(); QTextStream out(&pid); out << getpid(); pid.close(); } } if (chdir("/") != 0) fprintf(stderr, "Failed to chdir to /"); int fd; fd = open("/dev/null", O_RDONLY); dup2(fd, 0); close(fd); fd = open("/dev/null", O_WRONLY); dup2(fd, 1); close(fd); fd = open("/dev/null", O_WRONLY); dup2(fd, 2); close(fd); } unixhandler.finalcap(); #endif #ifdef USE_DBUS MurmurDBus::registerTypes(); if (! Meta::mp.qsDBus.isEmpty()) { if (Meta::mp.qsDBus == "session") MurmurDBus::qdbc = new QDBusConnection(QDBusConnection::sessionBus()); else if (Meta::mp.qsDBus == "system") MurmurDBus::qdbc = new QDBusConnection(QDBusConnection::systemBus()); else { // QtDBus is not quite finished yet. qWarning("Warning: Peer-to-peer session support is currently nonworking."); MurmurDBus::qdbc = new QDBusConnection(QDBusConnection::connectToBus(Meta::mp.qsDBus, "mainbus")); if (! MurmurDBus::qdbc->isConnected()) { QDBusServer *qdbs = new QDBusServer(Meta::mp.qsDBus, &a); qWarning("%s",qPrintable(qdbs->lastError().name())); qWarning("%d",qdbs->isConnected()); qWarning("%s",qPrintable(qdbs->address())); MurmurDBus::qdbc = new QDBusConnection(QDBusConnection::connectToBus(Meta::mp.qsDBus, "mainbus")); } } if (! MurmurDBus::qdbc->isConnected()) { qWarning("Failed to connect to D-Bus %s",qPrintable(Meta::mp.qsDBus)); } else { new MetaDBus(meta); if (MurmurDBus::qdbc->isConnected()) { if (! MurmurDBus::qdbc->registerObject("/", meta) || ! MurmurDBus::qdbc->registerService(Meta::mp.qsDBusService)) { QDBusError e=MurmurDBus::qdbc->lastError(); qWarning("Failed to register on DBus: %s %s", qPrintable(e.name()), qPrintable(e.message())); } else { qWarning("DBus registration succeeded"); } } } } #endif #ifdef USE_ICE IceStart(); #endif #ifdef USE_GRPC GRPCStart(); #else if (!meta->mp.qsGRPCAddress.isEmpty() || !meta->mp.qsGRPCCert.isEmpty() || !meta->mp.qsGRPCKey.isEmpty()) { qWarning("This version of Murmur was built without gRPC support. Ignoring 'grpc' option from configuration file."); } #endif meta->getOSInfo(); int major, minor, patch; QString strver; meta->getVersion(major, minor, patch, strver); qWarning("Murmur %d.%d.%d (%s) running on %s: %s: Booting servers", major, minor, patch, qPrintable(strver), qPrintable(meta->qsOS), qPrintable(meta->qsOSVersion)); meta->bootAll(); res=a.exec(); qWarning("Killing running servers"); meta->killAll(); qWarning("Shutting down"); #ifdef USE_DBUS delete MurmurDBus::qdbc; MurmurDBus::qdbc = NULL; #endif #ifdef USE_ICE IceStop(); #endif #ifdef USE_GRPC GRPCStop(); #endif delete qfLog; qfLog = NULL; delete meta; #if QT_VERSION >= 0x050000 qInstallMessageHandler(NULL); #else qInstallMsgHandler(NULL); #endif #ifdef Q_OS_UNIX if (! Meta::mp.qsPid.isEmpty()) { QFile pid(Meta::mp.qsPid); pid.remove(); } #endif return res; } mumble-1.3.4/src/murmur/BonjourServer.cpp0000664000175000017500000000140614010707274020272 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "murmur_pch.h" #include "BonjourServer.h" #include "BonjourServiceRegister.h" BonjourServer::BonjourServer() { bsrRegister = NULL; #ifdef Q_OS_WIN static bool bDelayLoadFailed = false; if (bDelayLoadFailed) return; HMODULE hLib = LoadLibrary(L"DNSSD.DLL"); if (hLib == NULL) { bDelayLoadFailed = true; qWarning("Bonjour: Failed to load dnssd.dll"); return; } FreeLibrary(hLib); #endif bsrRegister = new BonjourServiceRegister(this); } BonjourServer::~BonjourServer() { delete bsrRegister; } mumble-1.3.4/src/murmur/RPC.cpp0000664000175000017500000003622614010707274016121 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "murmur_pch.h" #include "Channel.h" #include "Group.h" #include "Meta.h" #include "Server.h" #include "ServerDB.h" #include "ServerUser.h" #include "Version.h" void Server::setUserState(User *pUser, Channel *cChannel, bool mute, bool deaf, bool suppressed, bool prioritySpeaker, const QString& name, const QString &comment) { bool changed = false; if (deaf) mute = true; if (! mute) deaf = false; MumbleProto::UserState mpus; mpus.set_session(pUser->uiSession); if (mute != pUser->bMute) { changed = true; mpus.set_mute(mute); } if (deaf != pUser->bDeaf) { changed = true; mpus.set_deaf(deaf); } if (suppressed != pUser->bSuppress) { changed = true; mpus.set_suppress(suppressed); } if (prioritySpeaker != pUser->bPrioritySpeaker) { changed = true; mpus.set_priority_speaker(prioritySpeaker); } if (comment != pUser->qsComment) { changed = true; mpus.set_comment(u8(comment)); if (pUser->iId >= 0) { QMap info; info.insert(ServerDB::User_Comment, comment); setInfo(pUser->iId, info); } } if (name != pUser->qsName) { changed = true; mpus.set_name(u8(name)); } { QWriteLocker wl(&qrwlVoiceThread); pUser->bDeaf = deaf; pUser->bMute = mute; pUser->bSuppress = suppressed; } pUser->bPrioritySpeaker = prioritySpeaker; pUser->qsName = name; hashAssign(pUser->qsComment, pUser->qbaCommentHash, comment); if (cChannel != pUser->cChannel) { changed = true; mpus.set_channel_id(cChannel->iId); userEnterChannel(pUser, cChannel, mpus); } if (changed) { sendAll(mpus, ~ 0x010202); if (mpus.has_comment() && ! pUser->qbaCommentHash.isEmpty()) { mpus.clear_comment(); mpus.set_comment_hash(blob(pUser->qbaCommentHash)); } sendAll(mpus, 0x010202); emit userStateChanged(pUser); } } // Sets err to error message on failure. bool Server::setChannelStateGRPC(const MumbleProto::ChannelState &cs, QString &err) { ::MumbleProto::ChannelState mpcs; bool changed = false; bool updated = false; if (!cs.has_channel_id()) { err = QLatin1String("missing channel ID"); return false; } Channel *channel = qhChannels.value(cs.channel_id()); if (!channel) { err = QLatin1String("invalid channel"); return false; } mpcs.set_channel_id(cs.channel_id()); // Links and parent channel are processed first, because they can return // errors. Without doing this, the server state can be changed without // notifying users. QSet< ::Channel *> newLinksSet; for (int i = 0; i < cs.links_size(); i++) { Channel *link = qhChannels.value(cs.links(i)); if (!link) { err = QLatin1String("invalid channel link"); return false; } newLinksSet.insert(link); } if (cs.has_parent()) { Channel *parent = qhChannels.value(cs.parent()); if (!parent) { err = QLatin1String("invalid parent channel"); return false; } if (parent != channel->cParent) { Channel *p = parent; while (p) { if (p == channel) { err = QLatin1String("parent channel cannot be a descendant of channel"); return false; } p = p->cParent; } if (!canNest(parent, channel)) { err = QLatin1String("channel cannot be nested in the given parent"); return false; } { QWriteLocker wl(&qrwlVoiceThread); channel->cParent->removeChannel(channel); parent->addChannel(channel); } mpcs.set_parent(parent->iId); changed = true; updated = true; } } if (cs.has_name()) { QString qsName = u8(cs.name()); if (channel->qsName != qsName) { channel->qsName = qsName; mpcs.set_name(cs.name()); changed = true; updated = true; } } const QSet &oldLinksSet = channel->qsPermLinks; if (newLinksSet != oldLinksSet) { // Remove foreach(Channel *l, oldLinksSet) { if (!newLinksSet.contains(l)) { removeLink(channel, l); mpcs.add_links_remove(l->iId); } } // Add foreach(Channel *l, newLinksSet) { if (! oldLinksSet.contains(l)) { addLink(channel, l); mpcs.add_links_add(l->iId); } } changed = true; } if (cs.has_position() && cs.position() != channel->iPosition) { channel->iPosition = cs.position(); mpcs.set_position(cs.position()); changed = true; updated = true; } if (cs.has_description()) { QString qsDescription = u8(cs.description()); if (qsDescription != channel->qsDesc) { hashAssign(channel->qsDesc, channel->qbaDescHash, qsDescription); mpcs.set_description(cs.description()); changed = true; updated = true; } } if (updated) { updateChannel(channel); } if (changed) { sendAll(mpcs, ~ 0x010202); if (mpcs.has_description() && !channel->qbaDescHash.isEmpty()) { mpcs.clear_description(); mpcs.set_description_hash(blob(channel->qbaDescHash)); } sendAll(mpcs, 0x010202); emit channelStateChanged(channel); } return true; } bool Server::setChannelState(Channel *cChannel, Channel *cParent, const QString &qsName, const QSet &links, const QString &desc, const int position) { bool changed = false; bool updated = false; MumbleProto::ChannelState mpcs; mpcs.set_channel_id(cChannel->iId); if (cChannel->qsName != qsName) { cChannel->qsName = qsName; mpcs.set_name(u8(qsName)); updated = true; changed = true; } if ((cParent != cChannel) && (cParent != cChannel->cParent)) { Channel *p = cParent; while (p) { if (p == cChannel) return false; p = p->cParent; } if (!canNest(cParent, cChannel)) { return false; } { QWriteLocker wl(&qrwlVoiceThread); cChannel->cParent->removeChannel(cChannel); cParent->addChannel(cChannel); } mpcs.set_parent(cParent->iId); updated = true; changed = true; } const QSet &oldset = cChannel->qsPermLinks; if (links != oldset) { // Remove foreach(Channel *l, oldset) { if (! links.contains(l)) { removeLink(cChannel, l); mpcs.add_links_remove(l->iId); } } // Add foreach(Channel *l, links) { if (! oldset.contains(l)) { addLink(cChannel, l); mpcs.add_links_add(l->iId); } } changed = true; } if (position != cChannel->iPosition) { changed = true; updated = true; cChannel->iPosition = position; mpcs.set_position(position); } if (! desc.isNull() && desc != cChannel->qsDesc) { updated = true; changed = true; hashAssign(cChannel->qsDesc, cChannel->qbaDescHash, desc); mpcs.set_description(u8(desc)); } if (updated) updateChannel(cChannel); if (changed) { sendAll(mpcs, ~ 0x010202); if (mpcs.has_description() && ! cChannel->qbaDescHash.isEmpty()) { mpcs.clear_description(); mpcs.set_description_hash(blob(cChannel->qbaDescHash)); } sendAll(mpcs, 0x010202); emit channelStateChanged(cChannel); } return true; } void Server::sendTextMessageGRPC(const ::MumbleProto::TextMessage &tm) { MumbleProto::TextMessage mptm; mptm.set_message(tm.message()); if (tm.has_actor()) { mptm.set_actor(tm.actor()); } // Broadcast if (!tm.session_size() && !tm.channel_id_size() && !tm.tree_id_size()) { sendAll(mptm); return; } // Single targets for (int i = 0; i < tm.session_size(); i++) { ServerUser *user = qhUsers.value(tm.session(i)); if (!user) { continue; } mptm.add_session(user->uiSession); sendMessage(user, mptm); mptm.clear_session(); } // Channel targets QSet chans; for (int i = 0; i < tm.channel_id_size(); i++) { Channel *channel = qhChannels.value(tm.channel_id(i)); if (!channel) { continue; } chans.insert(channel); mptm.add_channel_id(channel->iId); } QQueue chansQ; for (int i = 0; i < tm.tree_id_size(); i++) { Channel *channel = qhChannels.value(tm.tree_id(i)); if (!channel) { continue; } chansQ.enqueue(channel); mptm.add_tree_id(channel->iId); } while (!chansQ.isEmpty()) { Channel *c = chansQ.dequeue(); chans.insert(c); foreach(c, c->qlChannels) { chansQ.enqueue(c); } } foreach(Channel *c, chans) { foreach(::User *p, c->qlUsers) { sendMessage(static_cast< ::ServerUser *>(p), mptm); } } } void Server::sendTextMessage(Channel *cChannel, ServerUser *pUser, bool tree, const QString &text) { MumbleProto::TextMessage mptm; mptm.set_message(u8(text)); if (pUser) { mptm.add_session(pUser->uiSession); sendMessage(pUser, mptm); } else { if (tree) mptm.add_tree_id(cChannel->iId); else mptm.add_channel_id(cChannel->iId); QSet chans; QQueue q; q << cChannel; chans.insert(cChannel); Channel *c; if (tree) { while (! q.isEmpty()) { c = q.dequeue(); chans.insert(c); foreach(c, c->qlChannels) q.enqueue(c); } } foreach(c, chans) { foreach(User *p, c->qlUsers) sendMessage(static_cast(p), mptm); } } } /** * Sets the list of temporary groups the given userid is a member of. If no channel is given root will * be targeted. * * If userid is negative the absolute value is a session id. If it is positive it is a registration id. */ void Server::setTempGroups(int userid, int sessionId, Channel *cChannel, const QStringList &groups) { if (! cChannel) cChannel = qhChannels.value(0); { QWriteLocker wl(&qrwlVoiceThread); Group *g; foreach(g, cChannel->qhGroups) { g->qsTemporary.remove(userid); if (sessionId != 0) g->qsTemporary.remove(- sessionId); } QString gname; foreach(gname, groups) { g = cChannel->qhGroups.value(gname); if (! g) { g = new Group(cChannel, gname); } g->qsTemporary.insert(userid); if (sessionId != 0) g->qsTemporary.insert(- sessionId); } } User *p = qhUsers.value(userid); if (p) clearACLCache(p); } /** * Clears temporary group memberships for the given User. If no channel is given root will be targeted. * If recursion is activated all temporary memberships in related channels will also be cleared. */ void Server::clearTempGroups(User *user, Channel *cChannel, bool recurse) { QList qlChans; if (! cChannel) cChannel = qhChannels.value(0); qlChans.append(cChannel); { QWriteLocker wl(&qrwlVoiceThread); while (!qlChans.isEmpty()) { Channel *chan = qlChans.takeLast(); Group *g; foreach(g, chan->qhGroups) { g->qsTemporary.remove(user->iId); g->qsTemporary.remove(-static_cast(user->uiSession)); } if (recurse) qlChans << chan->qlChannels; } } clearACLCache(user); } void Server::connectAuthenticator(QObject *obj) { connect(this, SIGNAL(registerUserSig(int &, const QMap &)), obj, SLOT(registerUserSlot(int &, const QMap &))); connect(this, SIGNAL(unregisterUserSig(int &, int)), obj, SLOT(unregisterUserSlot(int &, int))); connect(this, SIGNAL(getRegisteredUsersSig(const QString &, QMap &)), obj, SLOT(getRegisteredUsersSlot(const QString &, QMap &))); connect(this, SIGNAL(getRegistrationSig(int &, int, QMap &)), obj, SLOT(getRegistrationSlot(int &, int, QMap &))); connect(this, SIGNAL(authenticateSig(int &, QString &, int, const QList &, const QString &, bool, const QString &)), obj, SLOT(authenticateSlot(int &, QString &, int, const QList &, const QString &, bool, const QString &))); connect(this, SIGNAL(setInfoSig(int &, int, const QMap &)), obj, SLOT(setInfoSlot(int &, int, const QMap &))); connect(this, SIGNAL(setTextureSig(int &, int, const QByteArray &)), obj, SLOT(setTextureSlot(int &, int, const QByteArray &))); connect(this, SIGNAL(idToNameSig(QString &, int)), obj, SLOT(idToNameSlot(QString &, int))); connect(this, SIGNAL(nameToIdSig(int &, const QString &)), obj, SLOT(nameToIdSlot(int &, const QString &))); connect(this, SIGNAL(idToTextureSig(QByteArray &, int)), obj, SLOT(idToTextureSlot(QByteArray &, int))); } void Server::disconnectAuthenticator(QObject *obj) { disconnect(this, SIGNAL(registerUserSig(int &, const QMap &)), obj, SLOT(registerUserSlot(int &, const QMap &))); disconnect(this, SIGNAL(unregisterUserSig(int &, int)), obj, SLOT(unregisterUserSlot(int &, int))); disconnect(this, SIGNAL(getRegisteredUsersSig(const QString &, QMap &)), obj, SLOT(getRegisteredUsersSlot(const QString &, QMap &))); disconnect(this, SIGNAL(getRegistrationSig(int &, int, QMap &)), obj, SLOT(getRegistrationSlot(int &, int, QMap &))); disconnect(this, SIGNAL(authenticateSig(int &, QString &, int, const QList &, const QString &, bool, const QString &)), obj, SLOT(authenticateSlot(int &, QString &, int, const QList &, const QString &, bool, const QString &))); disconnect(this, SIGNAL(setInfoSig(int &, int, const QMap &)), obj, SLOT(setInfoSlot(int &, int, const QMap &))); disconnect(this, SIGNAL(setTextureSig(int &, int, const QByteArray &)), obj, SLOT(setTextureSlot(int &, int, const QByteArray &))); disconnect(this, SIGNAL(idToNameSig(QString &, int)), obj, SLOT(idToNameSlot(QString &, int))); disconnect(this, SIGNAL(nameToIdSig(int &, const QString &)), obj, SLOT(nameToIdSlot(int &, const QString &))); disconnect(this, SIGNAL(idToTextureSig(QByteArray &, int)), obj, SLOT(idToTextureSlot(QByteArray &, int))); } void Server::connectListener(QObject *obj) { connect(this, SIGNAL(userStateChanged(const User *)), obj, SLOT(userStateChanged(const User *))); connect(this, SIGNAL(userTextMessage(const User *, const TextMessage &)), obj, SLOT(userTextMessage(const User *, const TextMessage &))); connect(this, SIGNAL(userConnected(const User *)), obj, SLOT(userConnected(const User *))); connect(this, SIGNAL(userDisconnected(const User *)), obj, SLOT(userDisconnected(const User *))); connect(this, SIGNAL(channelStateChanged(const Channel *)), obj, SLOT(channelStateChanged(const Channel *))); connect(this, SIGNAL(channelCreated(const Channel *)), obj, SLOT(channelCreated(const Channel *))); connect(this, SIGNAL(channelRemoved(const Channel *)), obj, SLOT(channelRemoved(const Channel *))); } void Server::disconnectListener(QObject *obj) { disconnect(this, SIGNAL(userStateChanged(const User *)), obj, SLOT(userStateChanged(const User *))); disconnect(this, SIGNAL(userTextMessage(const User *, const TextMessage &)), obj, SLOT(userTextMessage(const User *, const TextMessage &))); disconnect(this, SIGNAL(userConnected(const User *)), obj, SLOT(userConnected(const User *))); disconnect(this, SIGNAL(userDisconnected(const User *)), obj, SLOT(userDisconnected(const User *))); disconnect(this, SIGNAL(channelStateChanged(const Channel *)), obj, SLOT(channelStateChanged(const Channel *))); disconnect(this, SIGNAL(channelCreated(const Channel *)), obj, SLOT(channelCreated(const Channel *))); disconnect(this, SIGNAL(channelRemoved(const Channel *)), obj, SLOT(channelRemoved(const Channel *))); } void Meta::connectListener(QObject *obj) { connect(this, SIGNAL(started(Server *)), obj, SLOT(started(Server *))); connect(this, SIGNAL(stopped(Server *)), obj, SLOT(stopped(Server *))); } void Meta::getVersion(int &major, int &minor, int &patch, QString &string) { string = QLatin1String(MUMBLE_RELEASE); major = minor = patch = 0; MumbleVersion::get(&major, &minor, &patch); } mumble-1.3.4/src/murmur/UnixMurmur.h0000664000175000017500000000241614010707274017267 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MURMUR_UNIXMURMUR_H_ #define MUMBLE_MURMUR_UNIXMURMUR_H_ #include #include class QCoreApplication; class QMutex; class QSocketNotifier; class QWaitCondition; class LimitTest : public QThread { Q_OBJECT Q_DISABLE_COPY(LimitTest) protected: static QMutex *qm; static QWaitCondition *qw, *qstartw; LimitTest(); public: int tid; void run(); static void testLimits(QCoreApplication &); }; class UnixMurmur : public QObject { Q_OBJECT Q_DISABLE_COPY(UnixMurmur) protected: bool bRoot; static int iHupFd[2], iTermFd[2], iUsr1Fd[2]; QSocketNotifier *qsnHup, *qsnTerm, *qsnUsr1; static void hupSignalHandler(int); static void termSignalHandler(int); static void usr1SignalHandler(int); public slots: void handleSigHup(); void handleSigTerm(); void handleSigUsr1(); public: bool logToSyslog; void setuid(); void initialcap(); void finalcap(); const QString trySystemIniFiles(const QString& fname); UnixMurmur(); ~UnixMurmur(); }; #endif mumble-1.3.4/src/murmur/Meta.cpp0000664000175000017500000006171114010707274016360 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "murmur_pch.h" #include "Meta.h" #include "Connection.h" #include "Net.h" #include "ServerDB.h" #include "Server.h" #include "OSInfo.h" #include "Version.h" #include "SSL.h" #include "EnvUtils.h" #include "FFDHE.h" #if defined(USE_QSSLDIFFIEHELLMANPARAMETERS) # include #endif MetaParams Meta::mp; #ifdef Q_OS_WIN HANDLE Meta::hQoS = NULL; #endif MetaParams::MetaParams() { qsPassword = QString(); usPort = DEFAULT_MUMBLE_PORT; iTimeout = 30; iMaxBandwidth = 72000; iMaxUsers = 1000; iMaxUsersPerChannel = 0; iMaxTextMessageLength = 5000; iMaxImageMessageLength = 131072; legacyPasswordHash = false; kdfIterations = -1; bAllowHTML = true; iDefaultChan = 0; bRememberChan = true; qsWelcomeText = QString(); qsDatabase = QString(); iSQLiteWAL = 0; iDBPort = 0; qsDBusService = "net.sourceforge.mumble.murmur"; qsDBDriver = "QSQLITE"; qsLogfile = "murmur.log"; iLogDays = 31; iObfuscate = 0; bSendVersion = true; bBonjour = true; bAllowPing = true; bCertRequired = false; bForceExternalAuth = false; iBanTries = 10; iBanTimeframe = 120; iBanTime = 300; #ifdef Q_OS_UNIX uiUid = uiGid = 0; #endif iOpusThreshold = 100; iChannelNestingLimit = 10; iChannelCountLimit = 1000; qrUserName = QRegExp(QLatin1String("[-=\\w\\[\\]\\{\\}\\(\\)\\@\\|\\.]+")); qrChannelName = QRegExp(QLatin1String("[ \\-=\\w\\#\\[\\]\\{\\}\\(\\)\\@\\|]+")); iMessageLimit = 1; iMessageBurst = 5; qsCiphers = MumbleSSL::defaultOpenSSLCipherString(); qsSettings = NULL; } MetaParams::~MetaParams() { delete qsSettings; } /** * Checks whether a qsSettings config variable named 'name' was set to a valid value for the type * we want to convert it to. Otherwise a error message is logged and 'defaultValue' is returned. * * E.g. checkedFromSettings("blub", bla) would output an error message and leave bla unchanged * if the user had set the ini parameter to "blub = has, commas, in, it" which QSettings will interpret * not as a String but as a list of strings. * * @param T Conversion target type (type of 'defaultValue', auto inducable) * @param name qsSettings variable name * @param defaultValue Default value for 'name' * @param settings The QSettings object to read from. If null, the Meta's qsSettings will be used. * @return Setting if valid, default if not or setting not set. */ template T MetaParams::typeCheckedFromSettings(const QString &name, const T &defaultValue, QSettings *settings) { // Use qsSettings unless a specific QSettings instance // is requested. if (settings == NULL) { settings = qsSettings; } QVariant cfgVariable = settings->value(name, defaultValue); if (!cfgVariable.convert(QVariant(defaultValue).type())) { // Bit convoluted as canConvert() only does a static check without considering whether say a string like "blub" is actually a valid double (which convert does). qCritical() << "Configuration variable" << name << "is of invalid format. Set to default value of" << defaultValue << "."; return defaultValue; } return cfgVariable.value(); } void MetaParams::read(QString fname) { qmConfig.clear(); if (fname.isEmpty()) { QStringList datapaths; #if defined(Q_OS_WIN) #if QT_VERSION >= 0x050000 datapaths << QStandardPaths::writableLocation(QStandardPaths::DataLocation); #else datapaths << QDesktopServices::storageLocation(QDesktopServices::DataLocation); #endif QDir appdir = QDir(QDir::fromNativeSeparators(EnvUtils::getenv(QLatin1String("APPDATA")))); datapaths << appdir.absolutePath() + QLatin1String("/Mumble"); #else datapaths << QDir::homePath() + QLatin1String("/.murmurd"); datapaths << QDir::homePath() + QLatin1String("/.config/Mumble"); #endif #if defined(Q_OS_MAC) /* Old Mac data path. */ datapaths << QDir::homePath() + QLatin1String("/Library/Preferences/Mumble/"); #endif datapaths << QDir::homePath(); datapaths << QDir::currentPath(); datapaths << QCoreApplication::instance()->applicationDirPath(); foreach(const QString &p, datapaths) { if (! p.isEmpty()) { QFileInfo fi(p, "murmur.ini"); if (fi.exists() && fi.isReadable()) { qdBasePath = QDir(p); qsAbsSettingsFilePath = fi.absoluteFilePath(); break; } } } if (qsAbsSettingsFilePath.isEmpty()) { QDir::root().mkpath(qdBasePath.absolutePath()); qdBasePath = QDir(datapaths.at(0)); qsAbsSettingsFilePath = qdBasePath.absolutePath() + QLatin1String("/murmur.ini"); } } else { QFile f(fname); if (! f.open(QIODevice::ReadOnly)) { qFatal("Specified ini file %s could not be opened", qPrintable(fname)); } qdBasePath = QFileInfo(f).absoluteDir(); qsAbsSettingsFilePath = QFileInfo(f).absoluteFilePath(); f.close(); } QDir::setCurrent(qdBasePath.absolutePath()); qsSettings = new QSettings(qsAbsSettingsFilePath, QSettings::IniFormat); #if QT_VERSION >= 0x040500 qsSettings->setIniCodec("UTF-8"); #endif qWarning("Initializing settings from %s (basepath %s)", qPrintable(qsSettings->fileName()), qPrintable(qdBasePath.absolutePath())); QString qsHost = qsSettings->value("host", QString()).toString(); if (! qsHost.isEmpty()) { foreach(const QString &host, qsHost.split(QRegExp(QLatin1String("\\s+")), QString::SkipEmptyParts)) { QHostAddress qhaddr; if (qhaddr.setAddress(host)) { qlBind << qhaddr; } else { bool found = false; QHostInfo hi = QHostInfo::fromName(host); foreach(QHostAddress qha, hi.addresses()) { if ((qha.protocol() == QAbstractSocket::IPv4Protocol) || (qha.protocol() == QAbstractSocket::IPv6Protocol)) { qlBind << qha; found = true; } } if (! found) { qFatal("Lookup of bind hostname %s failed", qPrintable(host)); } } } foreach(const QHostAddress &qha, qlBind) qWarning("Binding to address %s", qPrintable(qha.toString())); } if (qlBind.isEmpty()) { bool hasipv6 = false; bool hasipv4 = false; int nif = 0; QList interfaces = QNetworkInterface::allInterfaces(); if (interfaces.isEmpty()) { qWarning("Meta: Unable to acquire list of network interfaces."); } else { foreach(const QNetworkInterface &qni, interfaces) { if (!(qni.flags() & QNetworkInterface::IsUp)) continue; if (!(qni.flags() & QNetworkInterface::IsRunning)) continue; if (qni.flags() & QNetworkInterface::IsLoopBack) continue; foreach(const QNetworkAddressEntry &qna, qni.addressEntries()) { const QHostAddress &qha = qna.ip(); switch (qha.protocol()) { case QAbstractSocket::IPv4Protocol: hasipv4 = true; break; case QAbstractSocket::IPv6Protocol: hasipv6 = true; break; default: break; } } ++nif; } } if (nif == 0) { qWarning("Meta: Could not determine IPv4/IPv6 support via network interfaces, assuming support for both."); hasipv6 = true; hasipv4 = true; } #if QT_VERSION >= 0x050000 if (hasipv6) { if (SslServer::hasDualStackSupport() && hasipv4) { qlBind << QHostAddress(QHostAddress::Any); hasipv4 = false; // No need to add a separate ipv4 socket } else { qlBind << QHostAddress(QHostAddress::AnyIPv6); } } if (hasipv4) { qlBind << QHostAddress(QHostAddress::AnyIPv4); } #else // QT_VERSION < 0x050000 // For Qt 4 AnyIPv6 resulted in a dual stack socket on dual stack // capable systems while Any resulted in an IPv4 only socket. For // Qt 5 this has been reworked so that AnyIPv6/v4 are now exclusive // IPv6/4 sockets while Any is the dual stack socket. if (hasipv6) { qlBind << QHostAddress(QHostAddress::AnyIPv6); if (SslServer::hasDualStackSupport() && hasipv4) { hasipv4 = false; // No need to add a separate ipv4 socket } } if (hasipv4) { qlBind << QHostAddress(QHostAddress::Any); } #endif } qsPassword = typeCheckedFromSettings("serverpassword", qsPassword); usPort = static_cast(typeCheckedFromSettings("port", static_cast(usPort))); iTimeout = typeCheckedFromSettings("timeout", iTimeout); iMaxTextMessageLength = typeCheckedFromSettings("textmessagelength", iMaxTextMessageLength); iMaxImageMessageLength = typeCheckedFromSettings("imagemessagelength", iMaxImageMessageLength); legacyPasswordHash = typeCheckedFromSettings("legacypasswordhash", legacyPasswordHash); kdfIterations = typeCheckedFromSettings("kdfiterations", -1); bAllowHTML = typeCheckedFromSettings("allowhtml", bAllowHTML); iMaxBandwidth = typeCheckedFromSettings("bandwidth", iMaxBandwidth); iDefaultChan = typeCheckedFromSettings("defaultchannel", iDefaultChan); bRememberChan = typeCheckedFromSettings("rememberchannel", bRememberChan); iMaxUsers = typeCheckedFromSettings("users", iMaxUsers); iMaxUsersPerChannel = typeCheckedFromSettings("usersperchannel", iMaxUsersPerChannel); qsWelcomeText = typeCheckedFromSettings("welcometext", qsWelcomeText); bCertRequired = typeCheckedFromSettings("certrequired", bCertRequired); bForceExternalAuth = typeCheckedFromSettings("forceExternalAuth", bForceExternalAuth); qsDatabase = typeCheckedFromSettings("database", qsDatabase); iSQLiteWAL = typeCheckedFromSettings("sqlite_wal", iSQLiteWAL); qsDBDriver = typeCheckedFromSettings("dbDriver", qsDBDriver); qsDBUserName = typeCheckedFromSettings("dbUsername", qsDBUserName); qsDBPassword = typeCheckedFromSettings("dbPassword", qsDBPassword); qsDBHostName = typeCheckedFromSettings("dbHost", qsDBHostName); qsDBPrefix = typeCheckedFromSettings("dbPrefix", qsDBPrefix); qsDBOpts = typeCheckedFromSettings("dbOpts", qsDBOpts); iDBPort = typeCheckedFromSettings("dbPort", iDBPort); qsIceEndpoint = typeCheckedFromSettings("ice", qsIceEndpoint); qsIceSecretRead = typeCheckedFromSettings("icesecret", qsIceSecretRead); qsIceSecretRead = typeCheckedFromSettings("icesecretread", qsIceSecretRead); qsIceSecretWrite = typeCheckedFromSettings("icesecretwrite", qsIceSecretRead); qsGRPCAddress = typeCheckedFromSettings("grpc", qsGRPCAddress); qsGRPCCert = typeCheckedFromSettings("grpccert", qsGRPCCert); qsGRPCKey = typeCheckedFromSettings("grpckey", qsGRPCKey); iLogDays = typeCheckedFromSettings("logdays", iLogDays); qsDBus = typeCheckedFromSettings("dbus", qsDBus); qsDBusService = typeCheckedFromSettings("dbusservice", qsDBusService); qsLogfile = typeCheckedFromSettings("logfile", qsLogfile); qsPid = typeCheckedFromSettings("pidfile", qsPid); qsRegName = typeCheckedFromSettings("registerName", qsRegName); qsRegPassword = typeCheckedFromSettings("registerPassword", qsRegPassword); qsRegHost = typeCheckedFromSettings("registerHostname", qsRegHost); qsRegLocation = typeCheckedFromSettings("registerLocation", qsRegLocation); qurlRegWeb = QUrl(typeCheckedFromSettings("registerUrl", qurlRegWeb).toString()); bBonjour = typeCheckedFromSettings("bonjour", bBonjour); iBanTries = typeCheckedFromSettings("autobanAttempts", iBanTries); iBanTimeframe = typeCheckedFromSettings("autobanTimeframe", iBanTimeframe); iBanTime = typeCheckedFromSettings("autobanTime", iBanTime); qvSuggestVersion = MumbleVersion::getRaw(qsSettings->value("suggestVersion").toString()); if (qvSuggestVersion.toUInt() == 0) qvSuggestVersion = QVariant(); qvSuggestPositional = qsSettings->value("suggestPositional"); if (qvSuggestPositional.toString().trimmed().isEmpty()) qvSuggestPositional = QVariant(); qvSuggestPushToTalk = qsSettings->value("suggestPushToTalk"); if (qvSuggestPushToTalk.toString().trimmed().isEmpty()) qvSuggestPushToTalk = QVariant(); iOpusThreshold = typeCheckedFromSettings("opusthreshold", iOpusThreshold); iChannelNestingLimit = typeCheckedFromSettings("channelnestinglimit", iChannelNestingLimit); iChannelCountLimit = typeCheckedFromSettings("channelcountlimit", iChannelCountLimit); #ifdef Q_OS_UNIX qsName = qsSettings->value("uname").toString(); if (geteuid() == 0) { // TODO: remove this silent fallback to enforce running as non-root bool requested = true; if (qsName.isEmpty()) { // default server user name qsName = "mumble-server"; requested = false; } struct passwd *pw = getpwnam(qPrintable(qsName)); if (pw) { uiUid = pw->pw_uid; uiGid = pw->pw_gid; qsHome = pw->pw_dir; } else if (requested) { qFatal("Cannot find username %s", qPrintable(qsName)); } endpwent(); } #endif qrUserName = QRegExp(typeCheckedFromSettings("username", qrUserName.pattern())); qrChannelName = QRegExp(typeCheckedFromSettings("channelname", qrChannelName.pattern())); iMessageLimit = typeCheckedFromSettings("messagelimit", 1); iMessageBurst = typeCheckedFromSettings("messageburst", 5); bool bObfuscate = typeCheckedFromSettings("obfuscate", false); if (bObfuscate) { qWarning("IP address obfuscation enabled."); iObfuscate = qrand(); } bSendVersion = typeCheckedFromSettings("sendversion", bSendVersion); bAllowPing = typeCheckedFromSettings("allowping", bAllowPing); if (!loadSSLSettings()) { qFatal("MetaParams: Failed to load SSL settings. See previous errors."); } QStringList hosts; foreach(const QHostAddress &qha, qlBind) { hosts << qha.toString(); } qmConfig.insert(QLatin1String("host"),hosts.join(" ")); qmConfig.insert(QLatin1String("password"),qsPassword); qmConfig.insert(QLatin1String("port"),QString::number(usPort)); qmConfig.insert(QLatin1String("timeout"),QString::number(iTimeout)); qmConfig.insert(QLatin1String("textmessagelength"), QString::number(iMaxTextMessageLength)); qmConfig.insert(QLatin1String("legacypasswordhash"), legacyPasswordHash ? QLatin1String("true") : QLatin1String("false")); qmConfig.insert(QLatin1String("kdfiterations"), QString::number(kdfIterations)); qmConfig.insert(QLatin1String("allowhtml"), bAllowHTML ? QLatin1String("true") : QLatin1String("false")); qmConfig.insert(QLatin1String("bandwidth"),QString::number(iMaxBandwidth)); qmConfig.insert(QLatin1String("users"),QString::number(iMaxUsers)); qmConfig.insert(QLatin1String("defaultchannel"),QString::number(iDefaultChan)); qmConfig.insert(QLatin1String("rememberchannel"),bRememberChan ? QLatin1String("true") : QLatin1String("false")); qmConfig.insert(QLatin1String("welcometext"),qsWelcomeText); qmConfig.insert(QLatin1String("registername"),qsRegName); qmConfig.insert(QLatin1String("registerpassword"),qsRegPassword); qmConfig.insert(QLatin1String("registerhostname"),qsRegHost); qmConfig.insert(QLatin1String("registerlocation"), qsRegLocation); qmConfig.insert(QLatin1String("registerurl"),qurlRegWeb.toString()); qmConfig.insert(QLatin1String("bonjour"), bBonjour ? QLatin1String("true") : QLatin1String("false")); qmConfig.insert(QLatin1String("certificate"),qscCert.toPem()); qmConfig.insert(QLatin1String("key"),qskKey.toPem()); qmConfig.insert(QLatin1String("obfuscate"),bObfuscate ? QLatin1String("true") : QLatin1String("false")); qmConfig.insert(QLatin1String("username"),qrUserName.pattern()); qmConfig.insert(QLatin1String("channelname"),qrChannelName.pattern()); qmConfig.insert(QLatin1String("certrequired"), bCertRequired ? QLatin1String("true") : QLatin1String("false")); qmConfig.insert(QLatin1String("forceExternalAuth"), bForceExternalAuth ? QLatin1String("true") : QLatin1String("false")); qmConfig.insert(QLatin1String("suggestversion"), qvSuggestVersion.isNull() ? QString() : qvSuggestVersion.toString()); qmConfig.insert(QLatin1String("suggestpositional"), qvSuggestPositional.isNull() ? QString() : qvSuggestPositional.toString()); qmConfig.insert(QLatin1String("suggestpushtotalk"), qvSuggestPushToTalk.isNull() ? QString() : qvSuggestPushToTalk.toString()); qmConfig.insert(QLatin1String("opusthreshold"), QString::number(iOpusThreshold)); qmConfig.insert(QLatin1String("channelnestinglimit"), QString::number(iChannelNestingLimit)); qmConfig.insert(QLatin1String("channelcountlimit"), QString::number(iChannelCountLimit)); qmConfig.insert(QLatin1String("sslCiphers"), qsCiphers); qmConfig.insert(QLatin1String("sslDHParams"), QString::fromLatin1(qbaDHParams.constData())); } bool MetaParams::loadSSLSettings() { QSettings updatedSettings(qsAbsSettingsFilePath, QSettings::IniFormat); #if QT_VERSION >= 0x040500 updatedSettings.setIniCodec("UTF-8"); #endif QString tmpCiphersStr = typeCheckedFromSettings("sslCiphers", qsCiphers); QString qsSSLCert = qsSettings->value("sslCert").toString(); QString qsSSLKey = qsSettings->value("sslKey").toString(); QString qsSSLCA = qsSettings->value("sslCA").toString(); QString qsSSLDHParams = typeCheckedFromSettings(QLatin1String("sslDHParams"), QString(QLatin1String("@ffdhe2048"))); qbaPassPhrase = qsSettings->value("sslPassPhrase").toByteArray(); QSslCertificate tmpCert; QList tmpCA; QList tmpIntermediates; QSslKey tmpKey; QByteArray tmpDHParams; QList tmpCiphers; if (! qsSSLCA.isEmpty()) { QFile pem(qsSSLCA); if (pem.open(QIODevice::ReadOnly)) { QByteArray qba = pem.readAll(); pem.close(); QList ql = QSslCertificate::fromData(qba); if (ql.isEmpty()) { qCritical("MetaParams: Failed to parse any CA certificates from %s", qPrintable(qsSSLCA)); return false; } else { tmpCA = ql; } } else { qCritical("MetaParams: Failed to read %s", qPrintable(qsSSLCA)); return false; } } QByteArray crt, key; if (! qsSSLCert.isEmpty()) { QFile pem(qsSSLCert); if (pem.open(QIODevice::ReadOnly)) { crt = pem.readAll(); pem.close(); } else { qCritical("MetaParams: Failed to read %s", qPrintable(qsSSLCert)); return false; } } if (! qsSSLKey.isEmpty()) { QFile pem(qsSSLKey); if (pem.open(QIODevice::ReadOnly)) { key = pem.readAll(); pem.close(); } else { qCritical("MetaParams: Failed to read %s", qPrintable(qsSSLKey)); return false; } } if (! key.isEmpty() || ! crt.isEmpty()) { if (! key.isEmpty()) { tmpKey = Server::privateKeyFromPEM(key, qbaPassPhrase); } if (tmpKey.isNull() && ! crt.isEmpty()) { tmpKey = Server::privateKeyFromPEM(crt, qbaPassPhrase); if (! tmpKey.isNull()) qCritical("MetaParams: Using private key found in certificate file."); } if (tmpKey.isNull()) { qCritical("MetaParams: No private key found in certificate or key file."); return false; } QList ql = QSslCertificate::fromData(crt); ql << QSslCertificate::fromData(key); for (int i=0;i 0) { tmpIntermediates = ql; qCritical("MetaParams: Adding %d intermediate certificates from certificate file.", ql.size()); } } QByteArray dhparams; #if defined(USE_QSSLDIFFIEHELLMANPARAMETERS) if (! qsSSLDHParams.isEmpty()) { if (qsSSLDHParams.startsWith(QLatin1String("@"))) { QString group = qsSSLDHParams.mid(1).trimmed(); QByteArray pem = FFDHE::PEMForNamedGroup(group); if (pem.isEmpty()) { QStringList names = FFDHE::NamedGroups(); QStringList atNames; foreach (QString name, names) { atNames << QLatin1String("@") + name; } QString supported = atNames.join(QLatin1String(", ")); qFatal("MetaParms: Diffie-Hellman parameters with name '%s' is not available. (Supported: %s)", qPrintable(qsSSLDHParams), qPrintable(supported)); } dhparams = pem; } else { QFile pem(qsSSLDHParams); if (pem.open(QIODevice::ReadOnly)) { dhparams = pem.readAll(); pem.close(); } else { qFatal("MetaParams: Failed to read %s", qPrintable(qsSSLDHParams)); } } } if (! dhparams.isEmpty()) { QSslDiffieHellmanParameters qdhp = QSslDiffieHellmanParameters::fromEncoded(dhparams); if (qdhp.isValid()) { tmpDHParams = dhparams; } else { qFatal("MetaParams: Unable to use specified Diffie-Hellman parameters: %s", qPrintable(qdhp.errorString())); return false; } } #else QString qsSSLDHParamsIniValue = qsSettings->value(QLatin1String("sslDHParams")).toString(); if (! qsSSLDHParamsIniValue.isEmpty()) { qFatal("MetaParams: This version of Murmur does not support Diffie-Hellman parameters (sslDHParams). Murmur will not start unless you remove the option from your murmur.ini file."); return false; } #endif { QList ciphers = MumbleSSL::ciphersFromOpenSSLCipherString(tmpCiphersStr); if (ciphers.isEmpty()) { qCritical("MetaParams: Invalid sslCiphers option. Either the cipher string is invalid or none of the ciphers are available: \"%s\"", qPrintable(qsCiphers)); return false; } #if !defined(USE_QSSLDIFFIEHELLMANPARAMETERS) // If the version of Qt we're building against doesn't support // QSslDiffieHellmanParameters, then we must filter out Diffie- // Hellman cipher suites in order to guarantee that we do not // use Qt's default Diffie-Hellman parameters. { QList filtered; foreach (QSslCipher c, ciphers) { if (c.keyExchangeMethod() == QLatin1String("DH")) { continue; } filtered << c; } if (ciphers.size() != filtered.size()) { qWarning("MetaParams: Warning: all cipher suites in sslCiphers using Diffie-Hellman key exchange " "have been removed. Qt %s does not support custom Diffie-Hellman parameters.", qVersion()); } tmpCiphers = filtered; } #else tmpCiphers = ciphers; #endif QStringList pref; foreach (QSslCipher c, tmpCiphers) { pref << c.name(); } qWarning("MetaParams: TLS cipher preference is \"%s\"", qPrintable(pref.join(QLatin1String(":")))); } qscCert = tmpCert; qlCA = tmpCA; qlIntermediates = tmpIntermediates; qskKey = tmpKey; qbaDHParams = tmpDHParams; qsCiphers = tmpCiphersStr; qlCiphers = tmpCiphers; qmConfig.insert(QLatin1String("certificate"), qscCert.toPem()); qmConfig.insert(QLatin1String("key"), qskKey.toPem()); qmConfig.insert(QLatin1String("sslCiphers"), qsCiphers); qmConfig.insert(QLatin1String("sslDHParams"), QString::fromLatin1(qbaDHParams.constData())); return true; } Meta::Meta() { #ifdef Q_OS_WIN QOS_VERSION qvVer; qvVer.MajorVersion = 1; qvVer.MinorVersion = 0; hQoS = NULL; HMODULE hLib = LoadLibrary(L"qWave.dll"); if (hLib == NULL) { qWarning("Meta: Failed to load qWave.dll, no QoS available"); } else { FreeLibrary(hLib); if (! QOSCreateHandle(&qvVer, &hQoS)) qWarning("Meta: Failed to create QOS2 handle"); else Connection::setQoS(hQoS); } #endif } Meta::~Meta() { #ifdef Q_OS_WIN if (hQoS) { QOSCloseHandle(hQoS); Connection::setQoS(NULL); } #endif } bool Meta::reloadSSLSettings() { // Reload SSL settings. if (!Meta::mp.loadSSLSettings()) { return false; } // Re-initialize certificates for all // virtual servers using the Meta server's // certificate and private key. foreach (Server *s, qhServers) { if (s->bUsingMetaCert) { s->log("Reloading certificates..."); s->initializeCert(); } else { s->log("Not reloading certificates; server does not use Meta certificate"); } } return true; } void Meta::getOSInfo() { qsOS = OSInfo::getOS(); qsOSVersion = OSInfo::getOSDisplayableVersion(); } void Meta::bootAll() { QList ql = ServerDB::getBootServers(); foreach(int snum, ql) boot(snum); } bool Meta::boot(int srvnum) { if (qhServers.contains(srvnum)) return false; if (! ServerDB::serverExists(srvnum)) return false; Server *s = new Server(srvnum, this); if (! s->bValid) { delete s; return false; } qhServers.insert(srvnum, s); emit started(s); #ifdef Q_OS_UNIX unsigned int sockets = 19; // Base foreach(s, qhServers) { sockets += 11; // Listen sockets, signal pipes etc. sockets += s->iMaxUsers; // One per user } struct rlimit r; if (getrlimit(RLIMIT_NOFILE, &r) == 0) { if (r.rlim_cur < sockets) { r.rlim_cur = sockets; if (r.rlim_max < sockets) r.rlim_max = sockets; if (setrlimit(RLIMIT_NOFILE, &r) != 0) { getrlimit(RLIMIT_NOFILE, &r); if (r.rlim_cur < r.rlim_max) { r.rlim_cur = r.rlim_max; setrlimit(RLIMIT_NOFILE, &r); getrlimit(RLIMIT_NOFILE, &r); } } } if (r.rlim_cur < sockets) qCritical("Current booted servers require minimum %d file descriptors when all slots are full, but only %lu file descriptors are allowed for this process. Your server will crash and burn; read the FAQ for details.", sockets, static_cast(r.rlim_cur)); } #endif return true; } void Meta::kill(int srvnum) { Server *s = qhServers.take(srvnum); if (!s) return; emit stopped(s); delete s; } void Meta::killAll() { foreach(Server *s, qhServers) { emit stopped(s); delete s; } qhServers.clear(); } bool Meta::banCheck(const QHostAddress &addr) { if ((mp.iBanTries == 0) || (mp.iBanTimeframe == 0)) return false; if (qhBans.contains(addr)) { Timer t = qhBans.value(addr); if (t.elapsed() < (1000000ULL * mp.iBanTime)) return true; qhBans.remove(addr); } QList &ql = qhAttempts[addr]; ql.append(Timer()); while (! ql.isEmpty() && (ql.at(0).elapsed() > (1000000ULL * mp.iBanTimeframe))) ql.removeFirst(); if (ql.count() > mp.iBanTries) { qhBans.insert(addr, Timer()); return true; } return false; } mumble-1.3.4/src/murmur/murmur.qrc0000664000175000017500000000052214010707274017015 0ustar builderbuilder ../../icons/murmur.16x16.png ../../icons/murmur.32x32.png ../../icons/murmur.48x48.png ../../icons/murmur.64x64.png mumble-1.3.4/src/murmur/murmur.plist0000664000175000017500000000135514010707274017370 0ustar builderbuilder CFBundleExecutable murmurd CFBundleGetInfoString An open source, low-latency, high quality voice chat software primarily intended for use while gaming. CFBundleIdentifier net.sourceforge.mumble.Murmur CFBundlePackageType APPL CFBundleSignature MMUR CFBundleVersion 1.3.4 NSHumanReadableCopyright Copyright (c) 2005-2021 The Mumble Developers mumble-1.3.4/src/murmur/Register.cpp0000664000175000017500000000774314010707274017263 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "murmur_pch.h" #include "Server.h" #include "Meta.h" #include "Version.h" #include "OSInfo.h" void Server::initRegister() { connect(&qtTick, SIGNAL(timeout()), this, SLOT(update())); if (! qsRegName.isEmpty()) { if (!qsRegName.isEmpty() && !qsRegPassword.isEmpty() && qurlRegWeb.isValid() && qsPassword.isEmpty() && bAllowPing) qtTick.start((60 + (qrand() % 120))* 1000); else log("Registration needs nonempty 'registername', 'registerpassword' and 'registerurl', must have an empty 'password' and allowed pings."); } else { log("Not registering server as public"); } } void Server::update() { if (qsRegName.isEmpty() || qsRegPassword.isEmpty() || !qurlRegWeb.isValid() || !qsPassword.isEmpty() || !bAllowPing) return; // When QNAM distinguishes connections by client cert, move this to Meta if (! qnamNetwork) qnamNetwork = new QNetworkAccessManager(this); qtTick.start(1000 * (60 * 60 + (qrand() % 300))); QDomDocument doc; QDomElement root=doc.createElement(QLatin1String("server")); doc.appendChild(root); OSInfo::fillXml(doc, root, meta->qsOS, meta->qsOSVersion, qlBind); QDomElement tag; QDomText t; tag=doc.createElement(QLatin1String("name")); root.appendChild(tag); t=doc.createTextNode(qsRegName); tag.appendChild(t); tag=doc.createElement(QLatin1String("host")); root.appendChild(tag); t=doc.createTextNode(qsRegHost); tag.appendChild(t); tag=doc.createElement(QLatin1String("password")); root.appendChild(tag); t=doc.createTextNode(qsRegPassword); tag.appendChild(t); tag=doc.createElement(QLatin1String("port")); root.appendChild(tag); t=doc.createTextNode(QString::number(usPort)); tag.appendChild(t); tag=doc.createElement(QLatin1String("url")); root.appendChild(tag); t=doc.createTextNode(qurlRegWeb.toString()); tag.appendChild(t); tag=doc.createElement(QLatin1String("digest")); root.appendChild(tag); t=doc.createTextNode(getDigest()); tag.appendChild(t); tag=doc.createElement(QLatin1String("users")); root.appendChild(tag); t=doc.createTextNode(QString::number(qhUsers.count())); tag.appendChild(t); tag=doc.createElement(QLatin1String("channels")); root.appendChild(tag); t=doc.createTextNode(QString::number(qhChannels.count())); tag.appendChild(t); if (!qsRegLocation.isEmpty()) { tag=doc.createElement(QLatin1String("location")); root.appendChild(tag); t=doc.createTextNode(qsRegLocation); tag.appendChild(t); } QNetworkRequest qnr(QUrl(QLatin1String("https://publist-registration.mumble.info/v1/register"))); qnr.setHeader(QNetworkRequest::ContentTypeHeader, QLatin1String("text/xml")); QSslConfiguration ssl = qnr.sslConfiguration(); ssl.setLocalCertificate(qscCert); ssl.setPrivateKey(qskKey); /* Work around bug in QSslConfiguration */ QList calist = ssl.caCertificates(); calist << QSslSocket::defaultCaCertificates(); calist << Meta::mp.qlCA; calist << Meta::mp.qlIntermediates; calist << qscCert; ssl.setCaCertificates(calist); ssl.setCiphers(Meta::mp.qlCiphers); qnr.setSslConfiguration(ssl); QNetworkReply *rep = qnamNetwork->post(qnr, doc.toString().toUtf8()); connect(rep, SIGNAL(finished()), this, SLOT(finished())); connect(rep, SIGNAL(sslErrors(const QList &)), this, SLOT(regSslError(const QList &))); } void Server::finished() { QNetworkReply *rep = qobject_cast(sender()); if (rep->error() != QNetworkReply::NoError) { log(QString("Registration failed: %1").arg(rep->errorString())); } else { QByteArray qba = rep->readAll(); log(QString("Registration: %1").arg(QLatin1String(qba))); } rep->deleteLater(); } void Server::regSslError(const QList &errs) { foreach(const QSslError &e, errs) log(QString("Registration: SSL Handshake error: %1").arg(e.errorString())); } mumble-1.3.4/src/murmur/Server.cpp0000664000175000017500000017176014010707274016746 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "murmur_pch.h" #include "Server.h" #include "ACL.h" #include "Connection.h" #include "Group.h" #include "User.h" #include "Channel.h" #include "Message.h" #include "Meta.h" #include "PacketDataStream.h" #include "ServerDB.h" #include "ServerUser.h" #include "Version.h" #include "HTMLFilter.h" #include "HostAddress.h" #include "EnvUtils.h" #ifdef USE_BONJOUR #include "BonjourServer.h" #include "BonjourServiceRegister.h" #endif #ifndef MAX #define MAX(a,b) ((a)>(b) ? (a):(b)) #endif #define UDP_PACKET_SIZE 1024 ExecEvent::ExecEvent(boost::function f) : QEvent(static_cast(EXEC_QEVENT)) { func = f; } void ExecEvent::execute() { func(); } SslServer::SslServer(QObject *p) : QTcpServer(p) { } bool SslServer::hasDualStackSupport() { // Create a AF_INET6 socket and try to switch off IPV6_V6ONLY. This // should only fail if the system does not support dual-stack mode // for this socket type. bool result = false; #ifdef Q_OS_UNIX int s = ::socket(AF_INET6, SOCK_STREAM, 0); if (s != -1) { const int ipv6only = 0; if (setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, reinterpret_cast(&ipv6only), sizeof(ipv6only)) == 0) { result = true; } ::close(s); } #else WSADATA wsaData; WORD wVersionRequested = MAKEWORD(2, 2); if (WSAStartup(wVersionRequested, &wsaData) != 0) { // Seems like we won't be doing any network stuff anyways return false; } SOCKET s = ::WSASocket(AF_INET6, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED); if (s != INVALID_SOCKET) { const int ipv6only = 0; if (setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, reinterpret_cast(&ipv6only), sizeof(ipv6only)) == 0) { result = true; } closesocket(s); } WSACleanup(); #endif return result; } #if QT_VERSION >= 0x050000 void SslServer::incomingConnection(qintptr v) { #else void SslServer::incomingConnection(int v) { #endif QSslSocket *s = new QSslSocket(this); s->setSocketDescriptor(v); qlSockets.append(s); } QSslSocket *SslServer::nextPendingSSLConnection() { if (qlSockets.isEmpty()) return NULL; return qlSockets.takeFirst(); } Server::Server(int snum, QObject *p) : QThread(p) { bValid = true; iServerNum = snum; #ifdef USE_BONJOUR bsRegistration = NULL; #endif bUsingMetaCert = false; #ifdef Q_OS_UNIX aiNotify[0] = aiNotify[1] = -1; #else hNotify = NULL; #endif qtTimeout = new QTimer(this); iCodecAlpha = iCodecBeta = 0; bPreferAlpha = false; bOpus = true; qnamNetwork = NULL; readParams(); initialize(); foreach(const QHostAddress &qha, qlBind) { SslServer *ss = new SslServer(this); connect(ss, SIGNAL(newConnection()), this, SLOT(newClient()), Qt::QueuedConnection); if (! ss->listen(qha, usPort)) { log(QString("Server: TCP Listen on %1 failed: %2").arg(addressToString(qha,usPort), ss->errorString())); bValid = false; } else { log(QString("Server listening on %1").arg(addressToString(qha,usPort))); } qlServer << ss; } if (! bValid) return; foreach(SslServer *ss, qlServer) { sockaddr_storage addr; #ifdef Q_OS_UNIX int tcpsock = static_cast(ss->socketDescriptor()); socklen_t len = sizeof(addr); #else SOCKET tcpsock = ss->socketDescriptor(); int len = sizeof(addr); #endif memset(&addr, 0, sizeof(addr)); getsockname(tcpsock, reinterpret_cast(&addr), &len); #ifdef Q_OS_UNIX int sock = ::socket(addr.ss_family, SOCK_DGRAM, 0); #ifdef Q_OS_LINUX int sockopt = 1; if (setsockopt(sock, IPPROTO_IP, IP_PKTINFO, &sockopt, sizeof(sockopt))) log(QString("Failed to set IP_PKTINFO for %1").arg(addressToString(ss->serverAddress(), usPort))); sockopt = 1; if (setsockopt(sock, IPPROTO_IPV6, IPV6_RECVPKTINFO, &sockopt, sizeof(sockopt))) log(QString("Failed to set IPV6_RECVPKTINFO for %1").arg(addressToString(ss->serverAddress(), usPort))); #endif #else #ifndef SIO_UDP_CONNRESET #define SIO_UDP_CONNRESET _WSAIOW(IOC_VENDOR,12) #endif SOCKET sock = ::WSASocket(addr.ss_family, SOCK_DGRAM, IPPROTO_UDP, NULL, 0, WSA_FLAG_OVERLAPPED); DWORD dwBytesReturned = 0; BOOL bNewBehaviour = FALSE; if (WSAIoctl(sock, SIO_UDP_CONNRESET, &bNewBehaviour, sizeof(bNewBehaviour), NULL, 0, &dwBytesReturned, NULL, NULL) == SOCKET_ERROR) { log(QString("Failed to set SIO_UDP_CONNRESET: %1").arg(WSAGetLastError())); } #endif if (sock == INVALID_SOCKET) { log("Failed to create UDP Socket"); bValid = false; return; } else { if (addr.ss_family == AF_INET6) { // Copy IPV6_V6ONLY attribute from tcp socket, it defaults to nonzero on Windows // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms738574%28v=vs.85%29.aspx // This will fail for WindowsXP which is ok. Our TCP code will have split that up // into two sockets. int ipv6only = 0; socklen_t optlen = sizeof(ipv6only); if (::getsockopt(tcpsock, IPPROTO_IPV6, IPV6_V6ONLY, reinterpret_cast(&ipv6only), &optlen) == 0) { if (::setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, reinterpret_cast(&ipv6only), optlen) == SOCKET_ERROR) { log(QString("Failed to copy IPV6_V6ONLY socket attribute from tcp to udp socket")); } } } if (::bind(sock, reinterpret_cast(&addr), len) == SOCKET_ERROR) { log(QString("Failed to bind UDP Socket to %1").arg(addressToString(ss->serverAddress(), usPort))); } else { #ifdef Q_OS_UNIX int val = 0xe0; if (setsockopt(sock, IPPROTO_IP, IP_TOS, &val, sizeof(val))) { val = 0x80; if (setsockopt(sock, IPPROTO_IP, IP_TOS, &val, sizeof(val))) log("Server: Failed to set TOS for UDP Socket"); } #if defined(SO_PRIORITY) socklen_t optlen = sizeof(val); if (getsockopt(sock, SOL_SOCKET, SO_PRIORITY, &val, &optlen) == 0) { if (val == 0) { val = 6; setsockopt(sock, SOL_SOCKET, SO_PRIORITY, &val, sizeof(val)); } } #endif #endif } QSocketNotifier *qsn = new QSocketNotifier(sock, QSocketNotifier::Read, this); connect(qsn, SIGNAL(activated(int)), this, SLOT(udpActivated(int))); qlUdpSocket << sock; qlUdpNotifier << qsn; } } bValid = bValid && (qlServer.count() == qlBind.count()) && (qlUdpSocket.count() == qlBind.count()); if (! bValid) return; #ifdef Q_OS_UNIX if (socketpair(AF_UNIX, SOCK_STREAM, 0, aiNotify) != 0) { log("Failed to create notify socket"); bValid = false; return; } #else hNotify = CreateEvent(NULL, FALSE, FALSE, NULL); #endif connect(this, SIGNAL(tcpTransmit(QByteArray, unsigned int)), this, SLOT(tcpTransmitData(QByteArray, unsigned int)), Qt::QueuedConnection); connect(this, SIGNAL(reqSync(unsigned int)), this, SLOT(doSync(unsigned int))); for (int i=1;i((major<<16) | (minor << 8) | patch)); if (bValid) { #ifdef USE_BONJOUR if (bBonjour) initBonjour(); #endif initRegister(); } } void Server::startThread() { if (! isRunning()) { log("Starting voice thread"); bRunning = true; foreach(QSocketNotifier *qsn, qlUdpNotifier) qsn->setEnabled(false); start(QThread::HighestPriority); #ifdef Q_OS_LINUX // QThread::HighestPriority == Same as everything else... int policy; struct sched_param param; if (pthread_getschedparam(pthread_self(), &policy, ¶m) == 0) { if (policy == SCHED_OTHER) { policy = SCHED_FIFO; param.sched_priority = 1; pthread_setschedparam(pthread_self(), policy, ¶m); } } #endif } if (! qtTimeout->isActive()) qtTimeout->start(15500); } void Server::stopThread() { bRunning = false; if (isRunning()) { log("Ending voice thread"); #ifdef Q_OS_UNIX unsigned char val = 0; if (::write(aiNotify[1], &val, 1) != 1) log("Failed to signal voice thread"); #else SetEvent(hNotify); #endif wait(); foreach(QSocketNotifier *qsn, qlUdpNotifier) qsn->setEnabled(true); } qtTimeout->stop(); } Server::~Server() { #ifdef USE_BONJOUR removeBonjour(); #endif stopThread(); foreach(QSocketNotifier *qsn, qlUdpNotifier) delete qsn; #ifdef Q_OS_UNIX foreach(int s, qlUdpSocket) close(s); if (aiNotify[0] >= 0) close(aiNotify[0]); if (aiNotify[1] >= 0) close(aiNotify[1]); #else foreach(SOCKET s, qlUdpSocket) closesocket(s); if (hNotify) CloseHandle(hNotify); #endif clearACLCache(); log("Stopped"); } /// normalizeSuggestVersion normalizes a 'suggestversion' config value. /// The config value may be a version string, or a bitmasked /// integer representing the version. /// This function converts the 'suggestversion' config value to /// always be a bitmasked integer representation. /// /// On error, the function returns an empty QVariant. static QVariant normalizeSuggestVersion(QVariant suggestVersion) { uint integerValue = suggestVersion.toUInt(); // If the integer value is 0, it can mean two things: // // Either the suggestversion is set to 0. // Or, the suggestversion is a version string such as "1.3.0", // and cannot be converted to an integer value. // // We handle both cases the same: by pretending the // suggestversion is a version string in both cases. // // If it is a version string, the call to MumbleVersion::getRaw() // will return the bitmasked representation. // // If it is not a version string, the call to MumbleVersion::getRaw() // will return 0, so it is effectively a no-op. if (integerValue == 0) { integerValue = MumbleVersion::getRaw(suggestVersion.toString()); } if (integerValue != 0) { return integerValue; } return QVariant(); } void Server::readParams() { qsPassword = Meta::mp.qsPassword; usPort = static_cast(Meta::mp.usPort + iServerNum - 1); iTimeout = Meta::mp.iTimeout; iMaxBandwidth = Meta::mp.iMaxBandwidth; iMaxUsers = Meta::mp.iMaxUsers; iMaxUsersPerChannel = Meta::mp.iMaxUsersPerChannel; iMaxTextMessageLength = Meta::mp.iMaxTextMessageLength; iMaxImageMessageLength = Meta::mp.iMaxImageMessageLength; bAllowHTML = Meta::mp.bAllowHTML; iDefaultChan = Meta::mp.iDefaultChan; bRememberChan = Meta::mp.bRememberChan; qsWelcomeText = Meta::mp.qsWelcomeText; qlBind = Meta::mp.qlBind; qsRegName = Meta::mp.qsRegName; qsRegPassword = Meta::mp.qsRegPassword; qsRegHost = Meta::mp.qsRegHost; qsRegLocation = Meta::mp.qsRegLocation; qurlRegWeb = Meta::mp.qurlRegWeb; bBonjour = Meta::mp.bBonjour; bAllowPing = Meta::mp.bAllowPing; bCertRequired = Meta::mp.bCertRequired; bForceExternalAuth = Meta::mp.bForceExternalAuth; qrUserName = Meta::mp.qrUserName; qrChannelName = Meta::mp.qrChannelName; iMessageLimit = Meta::mp.iMessageLimit; iMessageBurst = Meta::mp.iMessageBurst; qvSuggestVersion = Meta::mp.qvSuggestVersion; qvSuggestPositional = Meta::mp.qvSuggestPositional; qvSuggestPushToTalk = Meta::mp.qvSuggestPushToTalk; iOpusThreshold = Meta::mp.iOpusThreshold; iChannelNestingLimit = Meta::mp.iChannelNestingLimit; iChannelCountLimit = Meta::mp.iChannelCountLimit; QString qsHost = getConf("host", QString()).toString(); if (! qsHost.isEmpty()) { qlBind.clear(); foreach(const QString &host, qsHost.split(QRegExp(QLatin1String("\\s+")), QString::SkipEmptyParts)) { QHostAddress qhaddr; if (qhaddr.setAddress(qsHost)) { qlBind << qhaddr; } else { bool found = false; QHostInfo hi = QHostInfo::fromName(host); foreach(QHostAddress qha, hi.addresses()) { if ((qha.protocol() == QAbstractSocket::IPv4Protocol) || (qha.protocol() == QAbstractSocket::IPv6Protocol)) { qlBind << qha; found = true; } } if (! found) { log(QString("Lookup of bind hostname %1 failed").arg(host)); } } } foreach(const QHostAddress &qha, qlBind) log(QString("Binding to address %1").arg(qha.toString())); if (qlBind.isEmpty()) qlBind = Meta::mp.qlBind; } qsPassword = getConf("password", qsPassword).toString(); usPort = static_cast(getConf("port", usPort).toUInt()); iTimeout = getConf("timeout", iTimeout).toInt(); iMaxBandwidth = getConf("bandwidth", iMaxBandwidth).toInt(); iMaxUsers = getConf("users", iMaxUsers).toInt(); iMaxUsersPerChannel = getConf("usersperchannel", iMaxUsersPerChannel).toInt(); iMaxTextMessageLength = getConf("textmessagelength", iMaxTextMessageLength).toInt(); iMaxImageMessageLength = getConf("imagemessagelength", iMaxImageMessageLength).toInt(); bAllowHTML = getConf("allowhtml", bAllowHTML).toBool(); iDefaultChan = getConf("defaultchannel", iDefaultChan).toInt(); bRememberChan = getConf("rememberchannel", bRememberChan).toBool(); qsWelcomeText = getConf("welcometext", qsWelcomeText).toString(); qsRegName = getConf("registername", qsRegName).toString(); qsRegPassword = getConf("registerpassword", qsRegPassword).toString(); qsRegHost = getConf("registerhostname", qsRegHost).toString(); qsRegLocation = getConf("registerlocation", qsRegLocation).toString(); qurlRegWeb = QUrl(getConf("registerurl", qurlRegWeb.toString()).toString()); bBonjour = getConf("bonjour", bBonjour).toBool(); bAllowPing = getConf("allowping", bAllowPing).toBool(); bCertRequired = getConf("certrequired", bCertRequired).toBool(); bForceExternalAuth = getConf("forceExternalAuth", bForceExternalAuth).toBool(); qvSuggestVersion = normalizeSuggestVersion(getConf("suggestversion", qvSuggestVersion)); if (qvSuggestVersion.toUInt() == 0) qvSuggestVersion = QVariant(); qvSuggestPositional = getConf("suggestpositional", qvSuggestPositional); if (qvSuggestPositional.toString().trimmed().isEmpty()) qvSuggestPositional = QVariant(); qvSuggestPushToTalk = getConf("suggestpushtotalk", qvSuggestPushToTalk); if (qvSuggestPushToTalk.toString().trimmed().isEmpty()) qvSuggestPushToTalk = QVariant(); iOpusThreshold = getConf("opusthreshold", iOpusThreshold).toInt(); iChannelNestingLimit = getConf("channelnestinglimit", iChannelNestingLimit).toInt(); iChannelCountLimit = getConf("channelcountlimit", iChannelCountLimit).toInt(); qrUserName=QRegExp(getConf("username", qrUserName.pattern()).toString()); qrChannelName=QRegExp(getConf("channelname", qrChannelName.pattern()).toString()); iMessageLimit=getConf("messagelimit", iMessageLimit).toUInt(); if (iMessageLimit < 1) { // Prevent disabling messages entirely iMessageLimit = 1; } iMessageBurst=getConf("messageburst", iMessageBurst).toUInt(); if (iMessageBurst < 1) { // Prevent disabling messages entirely iMessageBurst = 1; } } void Server::setLiveConf(const QString &key, const QString &value) { QString v = value.trimmed().isEmpty() ? QString() : value; int i = v.toInt(); if ((key == "password") || (key == "serverpassword")) qsPassword = !v.isNull() ? v : Meta::mp.qsPassword; else if (key == "timeout") iTimeout = i ? i : Meta::mp.iTimeout; else if (key == "bandwidth") { int length = i ? i : Meta::mp.iMaxBandwidth; if (length != iMaxBandwidth) { iMaxBandwidth = length; MumbleProto::ServerConfig mpsc; mpsc.set_max_bandwidth(length); sendAll(mpsc); } } else if (key == "users") { int newmax = i ? i : Meta::mp.iMaxUsers; if (iMaxUsers == newmax) return; iMaxUsers = newmax; qqIds.clear(); for (int id = 1; id < iMaxUsers * 2; ++id) if (!qhUsers.contains(id)) qqIds.enqueue(id); MumbleProto::ServerConfig mpsc; mpsc.set_max_users(iMaxUsers); sendAll(mpsc); } else if (key == "usersperchannel") iMaxUsersPerChannel = i ? i : Meta::mp.iMaxUsersPerChannel; else if (key == "textmessagelength") { int length = i ? i : Meta::mp.iMaxTextMessageLength; if (length != iMaxTextMessageLength) { iMaxTextMessageLength = length; MumbleProto::ServerConfig mpsc; mpsc.set_message_length(length); sendAll(mpsc); } } else if (key == "imagemessagelength") { int length = i ? i : Meta::mp.iMaxImageMessageLength; if (length != iMaxImageMessageLength) { iMaxImageMessageLength = length; MumbleProto::ServerConfig mpsc; mpsc.set_image_message_length(length); sendAll(mpsc); } } else if (key == "allowhtml") { bool allow = !v.isNull() ? QVariant(v).toBool() : Meta::mp.bAllowHTML; if (allow != bAllowHTML) { bAllowHTML = allow; MumbleProto::ServerConfig mpsc; mpsc.set_allow_html(bAllowHTML); sendAll(mpsc); } } else if (key == "defaultchannel") iDefaultChan = i ? i : Meta::mp.iDefaultChan; else if (key == "rememberchannel") bRememberChan = !v.isNull() ? QVariant(v).toBool() : Meta::mp.bRememberChan; else if (key == "welcometext") { QString text = !v.isNull() ? v : Meta::mp.qsWelcomeText; if (text != qsWelcomeText) { qsWelcomeText = text; MumbleProto::ServerConfig mpsc; mpsc.set_welcome_text(u8(qsWelcomeText)); sendAll(mpsc); } } else if (key == "registername") { QString text = !v.isNull() ? v : Meta::mp.qsRegName; if (text != qsRegName) { qsRegName = text; if (! qsRegName.isEmpty()) { MumbleProto::ChannelState mpcs; mpcs.set_channel_id(0); mpcs.set_name(u8(qsRegName)); sendAll(mpcs); } } } else if (key == "registerpassword") qsRegPassword = !v.isNull() ? v : Meta::mp.qsRegPassword; else if (key == "registerhostname") qsRegHost = !v.isNull() ? v : Meta::mp.qsRegHost; else if (key == "registerlocation") qsRegLocation = !v.isNull() ? v : Meta::mp.qsRegLocation; else if (key == "registerurl") qurlRegWeb = !v.isNull() ? v : Meta::mp.qurlRegWeb; else if (key == "certrequired") bCertRequired = !v.isNull() ? QVariant(v).toBool() : Meta::mp.bCertRequired; else if (key == "forceExternalAuth") bForceExternalAuth = !v.isNull() ? QVariant(v).toBool() : Meta::mp.bForceExternalAuth; else if (key == "bonjour") { bBonjour = !v.isNull() ? QVariant(v).toBool() : Meta::mp.bBonjour; #ifdef USE_BONJOUR if (bBonjour && !bsRegistration) initBonjour(); else if (!bBonjour && bsRegistration) removeBonjour(); #endif } else if (key == "allowping") bAllowPing = !v.isNull() ? QVariant(v).toBool() : Meta::mp.bAllowPing; else if (key == "username") qrUserName=!v.isNull() ? QRegExp(v) : Meta::mp.qrUserName; else if (key == "channelname") qrChannelName=!v.isNull() ? QRegExp(v) : Meta::mp.qrChannelName; else if (key == "suggestversion") qvSuggestVersion = ! v.isNull() ? (v.isEmpty() ? QVariant() : normalizeSuggestVersion(v)) : Meta::mp.qvSuggestVersion; else if (key == "suggestpositional") qvSuggestPositional = ! v.isNull() ? (v.isEmpty() ? QVariant() : v) : Meta::mp.qvSuggestPositional; else if (key == "suggestpushtotalk") qvSuggestPushToTalk = ! v.isNull() ? (v.isEmpty() ? QVariant() : v) : Meta::mp.qvSuggestPushToTalk; else if (key == "opusthreshold") iOpusThreshold = (i >= 0 && !v.isNull()) ? qBound(0, i, 100) : Meta::mp.iOpusThreshold; else if (key == "channelnestinglimit") iChannelNestingLimit = (i >= 0 && !v.isNull()) ? i : Meta::mp.iChannelNestingLimit; else if (key == "channelcountlimit") iChannelCountLimit = (i >= 0 && !v.isNull()) ? i : Meta::mp.iChannelCountLimit; else if (key == "messagelimit") { iMessageLimit = (!v.isNull()) ? v.toUInt() : Meta::mp.iMessageLimit; if (iMessageLimit < 1) { iMessageLimit = 1; } } else if (key == "messageburst") { iMessageBurst = (!v.isNull()) ? v.toUInt() : Meta::mp.iMessageBurst; if (iMessageBurst < 1) { iMessageBurst = 1; } } } #ifdef USE_BONJOUR void Server::initBonjour() { bsRegistration = new BonjourServer(); if (bsRegistration->bsrRegister) { log("Announcing server via bonjour"); bsRegistration->bsrRegister->registerService(BonjourRecord(qsRegName, "_mumble._tcp", ""), usPort); } } void Server::removeBonjour() { if (bsRegistration) { delete bsRegistration; bsRegistration = NULL; log("Stopped announcing server via bonjour"); } } #endif void Server::customEvent(QEvent *evt) { if (evt->type() == EXEC_QEVENT) static_cast(evt)->execute(); } void Server::udpActivated(int socket) { qint32 len; char encrypt[UDP_PACKET_SIZE]; sockaddr_storage from; #ifdef Q_OS_UNIX #ifdef Q_OS_LINUX struct msghdr msg; struct iovec iov[1]; iov[0].iov_base = encrypt; iov[0].iov_len = UDP_PACKET_SIZE; u_char controldata[CMSG_SPACE(MAX(sizeof(struct in6_pktinfo),sizeof(struct in_pktinfo)))]; memset(&msg, 0, sizeof(msg)); msg.msg_name = reinterpret_cast(&from); msg.msg_namelen = sizeof(from); msg.msg_iov = iov; msg.msg_iovlen = 1; msg.msg_control = controldata; msg.msg_controllen = sizeof(controldata); int &sock = socket; len=static_cast(::recvmsg(sock, &msg, MSG_TRUNC)); #else socklen_t fromlen = sizeof(from); int &sock = socket; len=static_cast(::recvfrom(sock, encrypt, UDP_PACKET_SIZE, MSG_TRUNC, reinterpret_cast(&from), &fromlen)); #endif #else int fromlen = sizeof(from); SOCKET sock = static_cast(socket); len=::recvfrom(sock, encrypt, UDP_PACKET_SIZE, 0, reinterpret_cast(&from), &fromlen); #endif // Cloned from ::run(), as it's the only UDP data we care about until the thread is started. quint32 *ping = reinterpret_cast(encrypt); if ((len == 12) && (*ping == 0) && bAllowPing) { ping[0] = uiVersionBlob; ping[3] = qToBigEndian(static_cast(qhUsers.count())); ping[4] = qToBigEndian(static_cast(iMaxUsers)); ping[5] = qToBigEndian(static_cast(iMaxBandwidth)); #ifdef Q_OS_LINUX // There will be space for only one header, and the only data we have asked for is the incoming // address. So we can reuse most of the same msg and control data. iov[0].iov_len = 6 * sizeof(quint32); ::sendmsg(sock, &msg, 0); #else ::sendto(sock, encrypt, 6 * sizeof(quint32), 0, reinterpret_cast(&from), fromlen); #endif } } void Server::run() { qint32 len; #if defined(__LP64__) char encbuff[UDP_PACKET_SIZE+8]; char *encrypt = encbuff + 4; #else char encrypt[UDP_PACKET_SIZE]; #endif char buffer[UDP_PACKET_SIZE]; sockaddr_storage from; int nfds = qlUdpSocket.count(); #ifdef Q_OS_UNIX socklen_t fromlen; STACKVAR(struct pollfd, fds, nfds+1); for (int i=0;i(&from), &fromlen); #else #ifdef Q_OS_LINUX struct msghdr msg; struct iovec iov[1]; iov[0].iov_base = encrypt; iov[0].iov_len = UDP_PACKET_SIZE; u_char controldata[CMSG_SPACE(MAX(sizeof(struct in6_pktinfo),sizeof(struct in_pktinfo)))]; memset(&msg, 0, sizeof(msg)); msg.msg_name = reinterpret_cast(&from); msg.msg_namelen = sizeof(from); msg.msg_iov = iov; msg.msg_iovlen = 1; msg.msg_control = controldata; msg.msg_controllen = sizeof(controldata); len=static_cast(::recvmsg(sock, &msg, MSG_TRUNC)); Q_UNUSED(fromlen); #else len=static_cast(::recvfrom(sock, encrypt, UDP_PACKET_SIZE, MSG_TRUNC, reinterpret_cast(&from), &fromlen)); #endif #endif if (len == 0) { break; } else if (len == SOCKET_ERROR) { break; } else if (len < 5) { // 4 bytes crypt header + type + session continue; } else if (len > UDP_PACKET_SIZE) { continue; } QReadLocker rl(&qrwlVoiceThread); quint32 *ping = reinterpret_cast(encrypt); if ((len == 12) && (*ping == 0) && bAllowPing) { ping[0] = uiVersionBlob; // 1 and 2 will be the timestamp, which we return unmodified. ping[3] = qToBigEndian(static_cast(qhUsers.count())); ping[4] = qToBigEndian(static_cast(iMaxUsers)); ping[5] = qToBigEndian(static_cast(iMaxBandwidth)); #ifdef Q_OS_LINUX iov[0].iov_len = 6 * sizeof(quint32); ::sendmsg(sock, &msg, 0); #else ::sendto(sock, encrypt, 6 * sizeof(quint32), 0, reinterpret_cast(&from), fromlen); #endif continue; } quint16 port = (from.ss_family == AF_INET6) ? (reinterpret_cast(&from)->sin6_port) : (reinterpret_cast(&from)->sin_port); const HostAddress &ha = HostAddress(from); const QPair &key = QPair(ha, port); ServerUser *u = qhPeerUsers.value(key); if (u) { if (! checkDecrypt(u, encrypt, buffer, len)) { continue; } } else { // Unknown peer foreach(ServerUser *usr, qhHostUsers.value(ha)) { if (checkDecrypt(usr, encrypt, buffer, len)) { // checkDecrypt takes the User's qrwlCrypt lock. // Every time we relock, reverify users' existance. // The main thread might delete the user while the lock isn't held. unsigned int uiSession = usr->uiSession; rl.unlock(); qrwlVoiceThread.lockForWrite(); if (qhUsers.contains(uiSession)) { u = usr; u->sUdpSocket = sock; memcpy(& u->saiUdpAddress, &from, sizeof(from)); qhHostUsers[from].remove(u); qhPeerUsers.insert(key, u); } qrwlVoiceThread.unlock(); rl.relock(); if (u != NULL && !qhUsers.contains(uiSession)) u = NULL; break; } } if (! u) { continue; } } len -= 4; MessageHandler::UDPMessageType msgType = static_cast((buffer[0] >> 5) & 0x7); if (msgType == MessageHandler::UDPVoiceSpeex || msgType == MessageHandler::UDPVoiceCELTAlpha || msgType == MessageHandler::UDPVoiceCELTBeta || msgType == MessageHandler::UDPVoiceOpus) { // Allow all voice packets through by default. bool ok = true; // ...Unless we're in Opus mode. In Opus mode, only Opus packets are allowed. if (bOpus && msgType != MessageHandler::UDPVoiceOpus) { ok = false; } if (ok) { u->aiUdpFlag = 1; processMsg(u, buffer, len); } } else if (msgType == MessageHandler::UDPPing) { QByteArray qba; sendMessage(u, buffer, len, qba, true); } #ifdef Q_OS_UNIX fds[i].revents = 0; #endif } } } #ifdef Q_OS_WIN for (int i=0;iqmCrypt); if (u->csCrypt.isValid() && u->csCrypt.decrypt(reinterpret_cast(encrypt), reinterpret_cast(plain), len)) return true; if (u->csCrypt.tLastGood.elapsed() > 5000000ULL) { if (u->csCrypt.tLastRequest.elapsed() > 5000000ULL) { u->csCrypt.tLastRequest.restart(); emit reqSync(u->uiSession); } } return false; } void Server::sendMessage(ServerUser *u, const char *data, int len, QByteArray &cache, bool force) { if ((QAtomicIntLoad(u->aiUdpFlag) == 1 || force) && (u->sUdpSocket != INVALID_SOCKET)) { #if defined(__LP64__) STACKVAR(char, ebuffer, len+4+16); char *buffer = reinterpret_cast(((reinterpret_cast(ebuffer) + 8) & ~7) + 4); #else STACKVAR(char, buffer, len+4); #endif { QMutexLocker wl(&u->qmCrypt); if (!u->csCrypt.isValid()) { return; } if (!u->csCrypt.encrypt(reinterpret_cast(data), reinterpret_cast(buffer), len)) { return; } } #ifdef Q_OS_WIN DWORD dwFlow = 0; if (Meta::hQoS) QOSAddSocketToFlow(Meta::hQoS, u->sUdpSocket, reinterpret_cast(& u->saiUdpAddress), QOSTrafficTypeVoice, QOS_NON_ADAPTIVE_FLOW, reinterpret_cast(&dwFlow)); #endif #ifdef Q_OS_LINUX struct msghdr msg; struct iovec iov[1]; iov[0].iov_base = buffer; iov[0].iov_len = len+4; u_char controldata[CMSG_SPACE(MAX(sizeof(struct in6_pktinfo),sizeof(struct in_pktinfo)))]; memset(controldata, 0, sizeof(controldata)); memset(&msg, 0, sizeof(msg)); msg.msg_name = reinterpret_cast(& u->saiUdpAddress); msg.msg_namelen = static_cast((u->saiUdpAddress.ss_family == AF_INET6) ? sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in)); msg.msg_iov = iov; msg.msg_iovlen = 1; msg.msg_control = controldata; msg.msg_controllen = CMSG_SPACE((u->saiUdpAddress.ss_family == AF_INET6) ? sizeof(struct in6_pktinfo) : sizeof(struct in_pktinfo)); struct cmsghdr *cmsg = CMSG_FIRSTHDR(&msg); HostAddress tcpha(u->saiTcpLocalAddress); if (u->saiUdpAddress.ss_family == AF_INET6) { cmsg->cmsg_level = IPPROTO_IPV6; cmsg->cmsg_type = IPV6_PKTINFO; cmsg->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo)); struct in6_pktinfo *pktinfo = reinterpret_cast(CMSG_DATA(cmsg)); memset(pktinfo, 0, sizeof(*pktinfo)); memcpy(&pktinfo->ipi6_addr.s6_addr[0], &tcpha.qip6.c[0], sizeof(pktinfo->ipi6_addr.s6_addr)); } else { cmsg->cmsg_level = IPPROTO_IP; cmsg->cmsg_type = IP_PKTINFO; cmsg->cmsg_len = CMSG_LEN(sizeof(struct in_pktinfo)); struct in_pktinfo *pktinfo = reinterpret_cast(CMSG_DATA(cmsg)); memset(pktinfo, 0, sizeof(*pktinfo)); if (tcpha.isV6()) return; pktinfo->ipi_spec_dst.s_addr = tcpha.hash[3]; } ::sendmsg(u->sUdpSocket, &msg, 0); #else ::sendto(u->sUdpSocket, buffer, len+4, 0, reinterpret_cast(& u->saiUdpAddress), (u->saiUdpAddress.ss_family == AF_INET6) ? sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in)); #endif #ifdef Q_OS_WIN if (Meta::hQoS && dwFlow) QOSRemoveSocketFromFlow(Meta::hQoS, 0, dwFlow, 0); #else #endif } else { if (cache.isEmpty()) cache = QByteArray(data, len); emit tcpTransmit(cache,u->uiSession); } } #define SENDTO \ if ((!pDst->bDeaf) && (!pDst->bSelfDeaf) && (pDst != u)) { \ if ((poslen > 0) && (pDst->ssContext == u->ssContext)) \ sendMessage(pDst, buffer, len, qba); \ else \ sendMessage(pDst, buffer, len - poslen, qba_npos); \ } void Server::processMsg(ServerUser *u, const char *data, int len) { if (u->sState != ServerUser::Authenticated || u->bMute || u->bSuppress || u->bSelfMute) return; QByteArray qba, qba_npos; unsigned int counter; char buffer[UDP_PACKET_SIZE]; PacketDataStream pdi(data + 1, len - 1); PacketDataStream pds(buffer+1, UDP_PACKET_SIZE-1); unsigned int type = data[0] & 0xe0; unsigned int target = data[0] & 0x1f; unsigned int poslen; // Check the voice data rate limit. { BandwidthRecord *bw = &u->bwr; // IP + UDP + Crypt + Data const int packetsize = 20 + 8 + 4 + len; if (! bw->addFrame(packetsize, iMaxBandwidth / 8)) { // Suppress packet. return; } } // Read the sequence number. pdi >> counter; // Skip to the end of the voice data. if ((type >> 5) != MessageHandler::UDPVoiceOpus) { do { counter = pdi.next8(); pdi.skip(counter & 0x7f); } while ((counter & 0x80) && pdi.isValid()); } else { int size; pdi >> size; pdi.skip(size & 0x1fff); } // Save location of the positional audio data. poslen = pdi.left(); // Append session id to the new output stream. pds << u->uiSession; // Copy all voice and positional audio data to the output stream. pds.append(data + 1, len - 1); len = pds.size() + 1; if (poslen > static_cast(len)) { // poslen must never ever be bigger than len as this could lead to negative buffer sizes (len - poslen) being // used when further processing the packet. // Usually this shouldn't happen in the first place but can happen with malformed/malicious packets in certain // cases. poslen = 0; } if (target == 0x1f) { // Server loopback buffer[0] = static_cast(type | 0); sendMessage(u, buffer, len, qba); return; } else if (target == 0) { // Normal speech Channel *c = u->cChannel; buffer[0] = static_cast(type | 0); foreach(User *p, c->qlUsers) { ServerUser *pDst = static_cast(p); SENDTO; } if (! c->qhLinks.isEmpty()) { QSet chans = c->allLinks(); chans.remove(c); QMutexLocker qml(&qmCache); foreach(Channel *l, chans) { if (ChanACL::hasPermission(u, l, ChanACL::Speak, &acCache)) { foreach(User *p, l->qlUsers) { ServerUser *pDst = static_cast(p); SENDTO; } } } } } else if (u->qmTargets.contains(target)) { // Whisper QSet channel; QSet direct; if (u->qmTargetCache.contains(target)) { const ServerUser::TargetCache &cache = u->qmTargetCache.value(target); channel = cache.first; direct = cache.second; } else { const WhisperTarget &wt = u->qmTargets.value(target); if (! wt.qlChannels.isEmpty()) { QMutexLocker qml(&qmCache); foreach(const WhisperTarget::Channel &wtc, wt.qlChannels) { Channel *wc = qhChannels.value(wtc.iId); if (wc) { bool link = wtc.bLinks && ! wc->qhLinks.isEmpty(); bool dochildren = wtc.bChildren && ! wc->qlChannels.isEmpty(); bool group = ! wtc.qsGroup.isEmpty(); if (!link && !dochildren && ! group) { // Common case if (ChanACL::hasPermission(u, wc, ChanACL::Whisper, &acCache)) { foreach(User *p, wc->qlUsers) { channel.insert(static_cast(p)); } } } else { QSet channels; if (link) channels = wc->allLinks(); else channels.insert(wc); if (dochildren) channels.unite(wc->allChildren()); const QString &redirect = u->qmWhisperRedirect.value(wtc.qsGroup); const QString &qsg = redirect.isEmpty() ? wtc.qsGroup : redirect; foreach(Channel *tc, channels) { if (ChanACL::hasPermission(u, tc, ChanACL::Whisper, &acCache)) { foreach(User *p, tc->qlUsers) { ServerUser *su = static_cast(p); if (! group || Group::isMember(tc, tc, qsg, su)) { channel.insert(su); } } } } } } } } { QMutexLocker qml(&qmCache); foreach(unsigned int id, wt.qlSessions) { ServerUser *pDst = qhUsers.value(id); if (pDst && ChanACL::hasPermission(u, pDst->cChannel, ChanACL::Whisper, &acCache) && !channel.contains(pDst)) direct.insert(pDst); } } int uiSession = u->uiSession; qrwlVoiceThread.unlock(); qrwlVoiceThread.lockForWrite(); if (qhUsers.contains(uiSession)) u->qmTargetCache.insert(target, ServerUser::TargetCache(channel, direct)); qrwlVoiceThread.unlock(); qrwlVoiceThread.lockForRead(); if (! qhUsers.contains(uiSession)) return; } if (! channel.isEmpty()) { buffer[0] = static_cast(type | 1); foreach(ServerUser *pDst, channel) { SENDTO; } if (! direct.isEmpty()) { qba.clear(); qba_npos.clear(); } } if (! direct.isEmpty()) { buffer[0] = static_cast(type | 2); foreach(ServerUser *pDst, direct) { SENDTO; } } } } void Server::log(ServerUser *u, const QString &str) const { QString msg = QString("<%1:%2(%3)> %4").arg(QString::number(u->uiSession), u->qsName, QString::number(u->iId), str); log(msg); } void Server::log(const QString &msg) const { dblog(msg); qWarning("%d => %s", iServerNum, msg.toUtf8().constData()); } void Server::newClient() { SslServer *ss = qobject_cast(sender()); if (! ss) return; forever { QSslSocket *sock = ss->nextPendingSSLConnection(); if (! sock) return; QHostAddress adr = sock->peerAddress(); if (meta->banCheck(adr)) { log(QString("Ignoring connection: %1 (Global ban)").arg(addressToString(sock->peerAddress(), sock->peerPort()))); sock->disconnectFromHost(); sock->deleteLater(); return; } HostAddress ha(adr); QList tmpBans = qlBans; foreach(const Ban &ban, qlBans) { if (ban.isExpired()) tmpBans.removeOne(ban); } if (qlBans.count() != tmpBans.count()) { qlBans = tmpBans; saveBans(); } foreach(const Ban &ban, qlBans) { if (ban.haAddress.match(ha, ban.iMask)) { log(QString("Ignoring connection: %1, Reason: %2, Username: %3, Hash: %4 (Server ban)").arg(addressToString(sock->peerAddress(), sock->peerPort()), ban.qsReason, ban.qsUsername, ban.qsHash)); sock->disconnectFromHost(); sock->deleteLater(); return; } } #ifdef Q_OS_MAC // One unexpected behavior of Qt's SSL backend is: it will add the key pair // it uses in a connection into the default keychain, and when access the private // key afterwards, a pop up will show up asking for user's permission. // In some case (OS X 10.15.5), this pop up will be suppressed somehow and no private // key is returned. // This env variable will avoid Qt directly adding the key pair into the default keychain, // using a temporary keychain instead. // See #4298 and https://codereview.qt-project.org/c/qt/qtbase/+/184243 EnvUtils::setenv("QT_SSL_USE_TEMPORARY_KEYCHAIN", "1"); #endif sock->setPrivateKey(qskKey); sock->setLocalCertificate(qscCert); // Treat the leaf certificate as a root. // This shouldn't strictly be necessary, // and is a left-over from early on. // Perhaps it is necessary for self-signed // certs? sock->addCaCertificate(qscCert); // Add CA certificates specified via // murmur.ini's sslCA option. sock->addCaCertificates(Meta::mp.qlCA); // Add intermediate CAs found in the PEM // bundle used for this server's certificate. sock->addCaCertificates(qlIntermediates); sock->setCiphers(Meta::mp.qlCiphers); #if defined(USE_QSSLDIFFIEHELLMANPARAMETERS) QSslConfiguration cfg = sock->sslConfiguration(); cfg.setDiffieHellmanParameters(qsdhpDHParams); sock->setSslConfiguration(cfg); #endif if (qqIds.isEmpty()) { log(QString("Session ID pool (%1) empty, rejecting connection").arg(iMaxUsers)); sock->disconnectFromHost(); sock->deleteLater(); return; } ServerUser *u = new ServerUser(this, sock); u->uiSession = qqIds.dequeue(); u->haAddress = ha; HostAddress(sock->localAddress()).toSockaddr(& u->saiTcpLocalAddress); { QWriteLocker wl(&qrwlVoiceThread); qhUsers.insert(u->uiSession, u); qhHostUsers[ha].insert(u); } connect(u, SIGNAL(connectionClosed(QAbstractSocket::SocketError, const QString &)), this, SLOT(connectionClosed(QAbstractSocket::SocketError, const QString &))); connect(u, SIGNAL(message(unsigned int, const QByteArray &)), this, SLOT(message(unsigned int, const QByteArray &))); connect(u, SIGNAL(handleSslErrors(const QList &)), this, SLOT(sslError(const QList &))); connect(u, SIGNAL(encrypted()), this, SLOT(encrypted())); log(u, QString("New connection: %1").arg(addressToString(sock->peerAddress(), sock->peerPort()))); u->setToS(); #if QT_VERSION >= 0x050500 sock->setProtocol(QSsl::TlsV1_0OrLater); #elif QT_VERSION >= 0x050400 // In Qt 5.4, QSsl::SecureProtocols is equivalent // to "TLSv1.0 or later", which we require. sock->setProtocol(QSsl::SecureProtocols); #elif QT_VERSION >= 0x050000 sock->setProtocol(QSsl::TlsV1_0); #else sock->setProtocol(QSsl::TlsV1); #endif sock->startServerEncryption(); } } void Server::encrypted() { ServerUser *uSource = qobject_cast(sender()); int major, minor, patch; QString release; Meta::getVersion(major, minor, patch, release); MumbleProto::Version mpv; mpv.set_version((major << 16) | (minor << 8) | patch); if (Meta::mp.bSendVersion) { mpv.set_release(u8(release)); mpv.set_os(u8(meta->qsOS)); mpv.set_os_version(u8(meta->qsOSVersion)); } sendMessage(uSource, mpv); QList certs = uSource->peerCertificateChain(); if (!certs.isEmpty()) { const QSslCertificate &cert = certs.last(); #if QT_VERSION >= 0x050000 uSource->qslEmail = cert.subjectAlternativeNames().values(QSsl::EmailEntry); #else uSource->qslEmail = cert.alternateSubjectNames().values(QSsl::EmailEntry); #endif uSource->qsHash = cert.digest(QCryptographicHash::Sha1).toHex(); if (! uSource->qslEmail.isEmpty() && uSource->bVerified) { #if QT_VERSION >= 0x050000 QString subject; QString issuer; QStringList subjectList = cert.subjectInfo(QSslCertificate::CommonName); if (! subjectList.isEmpty()) { subject = subjectList.first(); } QStringList issuerList = certs.first().issuerInfo(QSslCertificate::CommonName); if (! issuerList.isEmpty()) { issuer = issuerList.first(); } #else QString subject = cert.subjectInfo(QSslCertificate::CommonName); QString issuer = certs.first().issuerInfo(QSslCertificate::CommonName); #endif log(uSource, QString::fromUtf8("Strong certificate for %1 <%2> (signed by %3)").arg(subject).arg(uSource->qslEmail.join(", ")).arg(issuer)); } foreach(const Ban &ban, qlBans) { if (ban.qsHash == uSource->qsHash) { log(uSource, QString("Certificate hash is banned: %1, Username: %2, Reason: %3.").arg(ban.qsHash, ban.qsUsername, ban.qsReason)); uSource->disconnectSocket(); } } } } void Server::sslError(const QList &errors) { ServerUser *u = qobject_cast(sender()); if (!u) return; bool ok = true; foreach(QSslError e, errors) { switch (e.error()) { case QSslError::InvalidPurpose: // Allow email certificates. break; case QSslError::NoPeerCertificate: case QSslError::SelfSignedCertificate: case QSslError::SelfSignedCertificateInChain: case QSslError::UnableToGetLocalIssuerCertificate: case QSslError::HostNameMismatch: case QSslError::CertificateNotYetValid: case QSslError::CertificateExpired: u->bVerified = false; break; default: log(u, QString("SSL Error: %1").arg(e.errorString())); ok = false; } } if (ok) { u->proceedAnyway(); } else { // Due to a regression in Qt 5 (QTBUG-53906), // we can't 'force' disconnect (which calls // QAbstractSocket->abort()) when built against Qt 5. // // The bug is that Qt doesn't update the // QSslSocket's socket state when QSslSocket->abort() // is called. // // Our call to abort() happens when QSslSocket is inside // startHandshake(). That is, a handshake is in progress. // // After emitting the peerVerifyError/sslErrors signals, // startHandshake() checks whether the connection is still // in QAbstractSocket::ConectedState. // // Unfortunately, because abort() doesn't update the socket's // state to signal that it is no longer connected, startHandshake() // still thinks the socket is connected and will continue to // attempt to finish the handshake. // // Because abort() tears down a lot of internal state // of the QSslSocket, inlcuding the 'SSL *' object // associated with the socket, this is fatal and leads // to crashes, such as attempting to derefernce a NULL // 'SSL *' object. // // To avoid this, we use a non-forceful disconnect // until this is fixed upstream. // // See // https://bugreports.qt.io/browse/QTBUG-53906 // https://github.com/mumble-voip/mumble/issues/2334 #if QT_VERSION >= 0x050000 u->disconnectSocket(); #else u->disconnectSocket(true); #endif } } void Server::connectionClosed(QAbstractSocket::SocketError err, const QString &reason) { if (reason.contains(QLatin1String("140E0197"))) { // A severe bug was introduced in qt/qtbase@93a803a6de27d9eb57931c431b5f3d074914f693. // q_SSL_shutdown() causes Qt to emit "error()" from unrelated QSslSocket(s), in addition to the correct one. // The issue causes this function to disconnect random authenticated clients. // // The workaround consists in ignoring a specific OpenSSL error: // "Error while reading: error:140E0197:SSL routines:SSL_shutdown:shutdown while in init [20]" // // Definitely not ideal, but it fixes a critical vulnerability. qWarning("Ignored OpenSSL error 140E0197 for %p", sender()); return; } Connection *c = qobject_cast(sender()); if (! c) return; if (c->bDisconnectedEmitted) return; c->bDisconnectedEmitted = true; ServerUser *u = static_cast(c); log(u, QString("Connection closed: %1 [%2]").arg(reason).arg(err)); if (u->sState == ServerUser::Authenticated) { MumbleProto::UserRemove mpur; mpur.set_session(u->uiSession); sendExcept(u, mpur); emit userDisconnected(u); } Channel *old = u->cChannel; { QWriteLocker wl(&qrwlVoiceThread); qhUsers.remove(u->uiSession); qhHostUsers[u->haAddress].remove(u); quint16 port = (u->saiUdpAddress.ss_family == AF_INET6) ? (reinterpret_cast(&u->saiUdpAddress)->sin6_port) : (reinterpret_cast(&u->saiUdpAddress)->sin_port); const QPair &key = QPair(u->haAddress, port); qhPeerUsers.remove(key); if (old) old->removeUser(u); } if (old && old->bTemporary && old->qlUsers.isEmpty()) QCoreApplication::instance()->postEvent(this, new ExecEvent(boost::bind(&Server::removeChannel, this, old->iId))); if (static_cast(u->uiSession) < iMaxUsers * 2) qqIds.enqueue(u->uiSession); // Reinsert session id into pool if (u->sState == ServerUser::Authenticated) { clearTempGroups(u); // Also clears ACL cache recheckCodecVersions(); // Maybe can choose a better codec now } u->deleteLater(); if (qhUsers.isEmpty()) stopThread(); } void Server::message(unsigned int uiType, const QByteArray &qbaMsg, ServerUser *u) { if (u == NULL) { u = static_cast(sender()); } if (u->sState == ServerUser::Authenticated) { u->resetActivityTime(); } if (uiType == MessageHandler::UDPTunnel) { int len = qbaMsg.size(); if (len < 2 || len > UDP_PACKET_SIZE) { // Drop messages that are too small to be senseful or that are bigger than allowed return; } QReadLocker rl(&qrwlVoiceThread); u->aiUdpFlag = 0; const char *buffer = qbaMsg.constData(); MessageHandler::UDPMessageType msgType = static_cast((buffer[0] >> 5) & 0x7); if (msgType == MessageHandler::UDPVoiceSpeex || msgType == MessageHandler::UDPVoiceCELTAlpha || msgType == MessageHandler::UDPVoiceCELTBeta || msgType == MessageHandler::UDPVoiceOpus) { // Allow all voice packets through by default. bool ok = true; // ...Unless we're in Opus mode. In Opus mode, only Opus packets are allowed. if (bOpus && msgType != MessageHandler::UDPVoiceOpus) { ok = false; } if (ok) { processMsg(u, buffer, len); } } return; } #ifdef QT_NO_DEBUG #define MUMBLE_MH_MSG(x) case MessageHandler:: x : { \ MumbleProto:: x msg; \ if (msg.ParseFromArray(qbaMsg.constData(), qbaMsg.size())) { \ msg.DiscardUnknownFields(); \ msg##x(u, msg); \ } \ break; \ } #else #define MUMBLE_MH_MSG(x) case MessageHandler:: x : { \ MumbleProto:: x msg; \ if (msg.ParseFromArray(qbaMsg.constData(), qbaMsg.size())) { \ if (uiType != MessageHandler::Ping) { \ printf("== %s:\n", #x); \ msg.PrintDebugString(); \ } \ msg.DiscardUnknownFields(); \ msg##x(u, msg); \ } \ break; \ } #endif switch (uiType) { MUMBLE_MH_ALL } } void Server::checkTimeout() { QList qlClose; qrwlVoiceThread.lockForRead(); foreach(ServerUser *u, qhUsers) { if (u->activityTime() > (iTimeout * 1000)) { log(u, "Timeout"); qlClose.append(u); } } qrwlVoiceThread.unlock(); foreach(ServerUser *u, qlClose) u->disconnectSocket(true); } void Server::tcpTransmitData(QByteArray a, unsigned int id) { Connection *c = qhUsers.value(id); if (c) { QByteArray qba; int len = a.size(); qba.resize(len + 6); unsigned char *uc = reinterpret_cast(qba.data()); * reinterpret_cast(& uc[0]) = qToBigEndian(static_cast(MessageHandler::UDPTunnel)); * reinterpret_cast(& uc[2]) = qToBigEndian(static_cast(len)); memcpy(uc + 6, a.constData(), len); c->sendMessage(qba); c->forceFlush(); } } void Server::doSync(unsigned int id) { ServerUser *u = qhUsers.value(id); if (u) { log(u, "Requesting crypt-nonce resync"); MumbleProto::CryptSetup mpcs; sendMessage(u, mpcs); } } void Server::sendProtoMessage(ServerUser *u, const ::google::protobuf::Message &msg, unsigned int msgType) { QByteArray cache; u->sendMessage(msg, msgType, cache); } void Server::sendProtoAll(const ::google::protobuf::Message &msg, unsigned int msgType, unsigned int version) { sendProtoExcept(NULL, msg, msgType, version); } void Server::sendProtoExcept(ServerUser *u, const ::google::protobuf::Message &msg, unsigned int msgType, unsigned int version) { QByteArray cache; foreach(ServerUser *usr, qhUsers) if ((usr != u) && (usr->sState == ServerUser::Authenticated)) if ((version == 0) || (usr->uiVersion >= version) || ((version & 0x80000000) && (usr->uiVersion < (~version)))) usr->sendMessage(msg, msgType, cache); } void Server::removeChannel(int id) { Channel *c = qhChannels.value(id); if (c) removeChannel(c); } void Server::removeChannel(Channel *chan, Channel *dest) { Channel *c; User *p; if (dest == NULL) dest = chan->cParent; { QWriteLocker wl(&qrwlVoiceThread); chan->unlink(NULL); } foreach(c, chan->qlChannels) { removeChannel(c, dest); } foreach(p, chan->qlUsers) { { QWriteLocker wl(&qrwlVoiceThread); chan->removeUser(p); } Channel *target = dest; while (target->cParent && (! hasPermission(static_cast(p), target, ChanACL::Enter) || isChannelFull(target, static_cast(p)))) target = target->cParent; MumbleProto::UserState mpus; mpus.set_session(p->uiSession); mpus.set_channel_id(target->iId); userEnterChannel(p, target, mpus); sendAll(mpus); emit userStateChanged(p); } MumbleProto::ChannelRemove mpcr; mpcr.set_channel_id(chan->iId); sendAll(mpcr); removeChannelDB(chan); emit channelRemoved(chan); if (chan->cParent) { QWriteLocker wl(&qrwlVoiceThread); chan->cParent->removeChannel(chan); } delete chan; } bool Server::unregisterUser(int id) { if (! unregisterUserDB(id)) return false; { QMutexLocker lock(&qmCache); foreach(Channel *c, qhChannels) { bool write = false; QList ql = c->qlACL; foreach(ChanACL *acl, ql) { if (acl->iUserId == id) { c->qlACL.removeAll(acl); write = true; } } foreach(Group *g, c->qhGroups) { bool addrem = g->qsAdd.remove(id); bool remrem = g->qsRemove.remove(id); write = write || addrem || remrem; } if (write) updateChannel(c); } } foreach(ServerUser *u, qhUsers) { if (u->iId == id) { clearACLCache(u); MumbleProto::UserState mpus; mpus.set_session(u->uiSession); mpus.set_user_id(-1); sendAll(mpus); u->iId = -1; break; } } return true; } void Server::userEnterChannel(User *p, Channel *c, MumbleProto::UserState &mpus) { if (p->cChannel == c) return; Channel *old = p->cChannel; { QWriteLocker wl(&qrwlVoiceThread); c->addUser(p); bool mayspeak = ChanACL::hasPermission(static_cast(p), c, ChanACL::Speak, NULL); bool sup = p->bSuppress; if (mayspeak == sup) { // Ok, he can speak and was suppressed, or vice versa p->bSuppress = ! mayspeak; mpus.set_suppress(p->bSuppress); } } clearACLCache(p); setLastChannel(p); if (old && old->bTemporary && old->qlUsers.isEmpty()) { QCoreApplication::instance()->postEvent(this, new ExecEvent(boost::bind(&Server::removeChannel, this, old->iId))); } sendClientPermission(static_cast(p), c); if (c->cParent) sendClientPermission(static_cast(p), c->cParent); } bool Server::hasPermission(ServerUser *p, Channel *c, QFlags perm) { QMutexLocker qml(&qmCache); return ChanACL::hasPermission(p, c, perm, &acCache); } QFlags Server::effectivePermissions(ServerUser *p, Channel *c) { QMutexLocker qml(&qmCache); return ChanACL::effectivePermissions(p, c, &acCache); } void Server::sendClientPermission(ServerUser *u, Channel *c, bool forceupdate) { unsigned int perm; if (u->iId == 0) return; { QMutexLocker qml(&qmCache); ChanACL::hasPermission(u, c, ChanACL::Enter, &acCache); perm = acCache.value(u)->value(c); } if (forceupdate) u->iLastPermissionCheck = c->iId; if (u->qmPermissionSent.value(c->iId) != perm) { u->qmPermissionSent.insert(c->iId, perm); MumbleProto::PermissionQuery mppq; mppq.set_channel_id(c->iId); mppq.set_permissions(perm); sendMessage(u, mppq); } } /* This function is a helper for clearACLCache and assumes qmCache is held. * First, check if anything actually changed, or if the list is getting awfully large, * because this function is potentially quite expensive. * If all the items are still valid; great. If they aren't, send off the last channel * the client expliticly asked for -- this may not be what it wants, but it's our best * guess. */ void Server::flushClientPermissionCache(ServerUser *u, MumbleProto::PermissionQuery &mppq) { QMap::const_iterator i; bool match = (u->qmPermissionSent.count() < 20); for (i = u->qmPermissionSent.constBegin(); (match && (i != u->qmPermissionSent.constEnd())); ++i) { Channel *c = qhChannels.value(i.key()); if (! c) { match = false; } else { ChanACL::hasPermission(u, c, ChanACL::Enter, &acCache); unsigned int perm = acCache.value(u)->value(c); if (perm != i.value()) match = false; } } if (match) return; u->qmPermissionSent.clear(); Channel *c = qhChannels.value(u->iLastPermissionCheck); if (! c) { c = u->cChannel; u->iLastPermissionCheck = c->iId; } ChanACL::hasPermission(u, c, ChanACL::Enter, &acCache); unsigned int perm = acCache.value(u)->value(c); u->qmPermissionSent.insert(c->iId, perm); mppq.Clear(); mppq.set_channel_id(c->iId); mppq.set_permissions(perm); mppq.set_flush(true); sendMessage(u, mppq); } void Server::clearACLCache(User *p) { MumbleProto::PermissionQuery mppq; { QMutexLocker qml(&qmCache); if (p) { ChanACL::ChanCache *h = acCache.take(p); delete h; flushClientPermissionCache(static_cast(p), mppq); } else { foreach(ChanACL::ChanCache *h, acCache) delete h; acCache.clear(); foreach(ServerUser *u, qhUsers) if (u->sState == ServerUser::Authenticated) flushClientPermissionCache(u, mppq); } } { QWriteLocker lock(&qrwlVoiceThread); foreach(ServerUser *u, qhUsers) u->qmTargetCache.clear(); } } QString Server::addressToString(const QHostAddress &adr, unsigned short port) { HostAddress ha(adr); if ((Meta::mp.iObfuscate != 0)) { QCryptographicHash h(QCryptographicHash::Sha1); h.addData(reinterpret_cast(&Meta::mp.iObfuscate), sizeof(Meta::mp.iObfuscate)); if (adr.protocol() == QAbstractSocket::IPv4Protocol) { quint32 num = adr.toIPv4Address(); h.addData(reinterpret_cast(&num), sizeof(num)); } else if (adr.protocol() == QAbstractSocket::IPv6Protocol) { Q_IPV6ADDR num = adr.toIPv6Address(); h.addData(reinterpret_cast(num.c), sizeof(num.c)); } return QString("<<%1:%2>>").arg(QString(h.result().toHex()), QString::number(port)); } return QString("%1:%2").arg(ha.toString(), QString::number(port)); } bool Server::validateUserName(const QString &name) { return (qrUserName.exactMatch(name) && (name.length() <= 512)); } bool Server::validateChannelName(const QString &name) { return (qrChannelName.exactMatch(name) && (name.length() <= 512)); } void Server::recheckCodecVersions(ServerUser *connectingUser) { QMap qmCodecUsercount; QMap::const_iterator i; int users = 0; int opus = 0; // Count how many users use which codec foreach(ServerUser *u, qhUsers) { if (u->qlCodecs.isEmpty() && ! u->bOpus) continue; ++users; if (u->bOpus) ++opus; foreach(int version, u->qlCodecs) ++qmCodecUsercount[version]; } if (! users) return; // Enable Opus if the number of users with Opus is higher than the threshold bool enableOpus = ((opus * 100 / users) >= iOpusThreshold); // Find the best possible codec most users support int version = 0; int maximum_users = 0; i = qmCodecUsercount.constEnd(); do { --i; if (i.value() > maximum_users) { version = i.key(); maximum_users = i.value(); } } while (i != qmCodecUsercount.constBegin()); int current_version = bPreferAlpha ? iCodecAlpha : iCodecBeta; // If we don't already use the compat bitstream version set // it as alpha and announce it. If another codec now got the // majority set it as the opposite of the currently valid bPreferAlpha // and announce it. if (current_version != version) { if (version == static_cast(0x8000000b)) bPreferAlpha = true; else bPreferAlpha = ! bPreferAlpha; if (bPreferAlpha) iCodecAlpha = version; else iCodecBeta = version; } else if (bOpus == enableOpus) { if (bOpus && connectingUser && !connectingUser->bOpus) { sendTextMessage(NULL, connectingUser, false, QLatin1String("WARNING: Your client doesn't support the Opus codec the server is using, you won't be able to talk or hear anyone. Please upgrade to a client with Opus support.")); } return; } bOpus = enableOpus; MumbleProto::CodecVersion mpcv; mpcv.set_alpha(iCodecAlpha); mpcv.set_beta(iCodecBeta); mpcv.set_prefer_alpha(bPreferAlpha); mpcv.set_opus(bOpus); sendAll(mpcv); if (bOpus) { foreach(ServerUser *u, qhUsers) { // Prevent connected users that could not yet declare their opus capability during msgAuthenticate from being spammed. // Only authenticated users and the currently connecting user (if recheck is called in that context) have a reliable u->bOpus. if((u->sState == ServerUser::Authenticated || u == connectingUser) && !u->bOpus) { sendTextMessage(NULL, u, false, QLatin1String("WARNING: Your client doesn't support the Opus codec the server is switching to, you won't be able to talk or hear anyone. Please upgrade to a client with Opus support.")); } } } log(QString::fromLatin1("CELT codec switch %1 %2 (prefer %3) (Opus %4)").arg(iCodecAlpha,0,16).arg(iCodecBeta,0,16).arg(bPreferAlpha ? iCodecAlpha : iCodecBeta,0,16).arg(bOpus)); } void Server::hashAssign(QString &dest, QByteArray &hash, const QString &src) { dest = src; if (src.length() >= 128) hash = sha1(src); else hash = QByteArray(); } void Server::hashAssign(QByteArray &dest, QByteArray &hash, const QByteArray &src) { dest = src; if (src.length() >= 128) hash = sha1(src); else hash = QByteArray(); } bool Server::isTextAllowed(QString &text, bool &changed) { changed = false; if (! bAllowHTML) { QString out; if (HTMLFilter::filter(text, out)) { changed = true; text = out; } return ((iMaxTextMessageLength == 0) || (text.length() <= iMaxTextMessageLength)); } else { int length = text.length(); // No limits if ((iMaxTextMessageLength == 0) && (iMaxImageMessageLength == 0)) return true; // Over Image limit? (If so, always fail) if ((iMaxImageMessageLength != 0) && (length > iMaxImageMessageLength)) return false; // Under textlength? if ((iMaxTextMessageLength == 0) || (length <= iMaxTextMessageLength)) return true; // Over textlength, under imagelength. If no XML, this is a fail. if (! text.contains(QLatin1Char('<'))) return false; // Strip value from s src attributes to check text-length only - // we already ensured the img-length requirement is met QString qsOut; QXmlStreamReader qxsr(QString::fromLatin1("%1").arg(text)); QXmlStreamWriter qxsw(&qsOut); while (! qxsr.atEnd()) { switch (qxsr.readNext()) { case QXmlStreamReader::Invalid: return false; case QXmlStreamReader::StartElement: { if (qxsr.name() == QLatin1String("img")) { qxsw.writeStartElement(qxsr.namespaceUri().toString(), qxsr.name().toString()); foreach(const QXmlStreamAttribute &a, qxsr.attributes()) if (a.name() != QLatin1String("src")) qxsw.writeAttribute(a); } else { qxsw.writeCurrentToken(qxsr); } } break; default: qxsw.writeCurrentToken(qxsr); break; } } length = qsOut.length(); return (length <= iMaxTextMessageLength); } } bool Server::isChannelFull(Channel *c, ServerUser *u) { if (u && hasPermission(u, c, ChanACL::Write)) { return false; } if (c->uiMaxUsers) { return static_cast(c->qlUsers.count()) >= c->uiMaxUsers; } if (iMaxUsersPerChannel) { return c->qlUsers.count() >= iMaxUsersPerChannel; } return false; } bool Server::canNest(Channel *newParent, Channel *channel) const { const int parentLevel = newParent ? static_cast(newParent->getLevel()) : -1; const int channelDepth = channel ? static_cast(channel->getDepth()) : 0; return (parentLevel + channelDepth) < iChannelNestingLimit; } mumble-1.3.4/src/murmur/UnixMurmur.cpp0000664000175000017500000002271214010707274017623 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "murmur_pch.h" #include "UnixMurmur.h" #include "Meta.h" #include "EnvUtils.h" QMutex *LimitTest::qm; QWaitCondition *LimitTest::qw; QWaitCondition *LimitTest::qstartw; LimitTest::LimitTest() : QThread(), tid(-1) { } void LimitTest::run() { qm->lock(); qstartw->wakeAll(); qw->wait(qm); qm->unlock(); } void LimitTest::testLimits(QCoreApplication &a) { QAbstractEventDispatcher *ed = QAbstractEventDispatcher::instance(); if (QLatin1String(ed->metaObject()->className()) != QLatin1String("QEventDispatcherGlib")) qWarning("Not running with glib. While you may be able to open more descriptors, sockets above %d will not work", FD_SETSIZE); qWarning("Running descriptor test."); int count; QList ql; for (count=0;count < 524288; ++count) { QFile *qf = new QFile(a.applicationFilePath()); if (qf->open(QIODevice::ReadOnly)) ql.prepend(qf); else break; if ((count & 1023) == 0) qWarning("%d descriptors...", count); } foreach(QFile *qf, ql) delete qf; ql.clear(); qCritical("Managed to open %d descriptors", count); qm = new QMutex(); qw = new QWaitCondition(); qstartw = new QWaitCondition(); int fdcount = count / 8; if (sizeof(void *) < 8) if (fdcount > 1024) fdcount = 1024; QList qtl; for (count=0;count < fdcount; ++count) { LimitTest *t = new LimitTest(); t->tid = count; qtl << t; qm->lock(); t->start(); qstartw->wait(qm); qm->unlock(); if (! t->isRunning()) break; if ((count & 511) == 0) qWarning("%d threads...", count); } qm->lock(); qw->wakeAll(); qm->unlock(); foreach(LimitTest *qt, qtl) { if (! qt->wait(1000)) { qWarning("Thread %d failed to terminate...", qt->tid); qt->terminate(); } } qFatal("Managed to spawn %d threads", count); } extern QFile *qfLog; int UnixMurmur::iHupFd[2]; int UnixMurmur::iTermFd[2]; int UnixMurmur::iUsr1Fd[2]; UnixMurmur::UnixMurmur() { bRoot = true; logToSyslog = false; if (geteuid() != 0 && getuid() != 0) { bRoot = false; } if (::socketpair(AF_UNIX, SOCK_STREAM, 0, iHupFd)) qFatal("Couldn't create HUP socketpair"); if (::socketpair(AF_UNIX, SOCK_STREAM, 0, iTermFd)) qFatal("Couldn't create TERM socketpair"); if (::socketpair(AF_UNIX, SOCK_STREAM, 0, iUsr1Fd)) qFatal("Couldn't create USR1 socketpair"); qsnHup = new QSocketNotifier(iHupFd[1], QSocketNotifier::Read, this); qsnTerm = new QSocketNotifier(iTermFd[1], QSocketNotifier::Read, this); qsnUsr1 = new QSocketNotifier(iUsr1Fd[1], QSocketNotifier::Read, this); connect(qsnHup, SIGNAL(activated(int)), this, SLOT(handleSigHup())); connect(qsnTerm, SIGNAL(activated(int)), this, SLOT(handleSigTerm())); connect(qsnUsr1, SIGNAL(activated(int)), this, SLOT(handleSigUsr1())); struct sigaction hup, term, usr1; hup.sa_handler = hupSignalHandler; sigemptyset(&hup.sa_mask); hup.sa_flags = SA_RESTART; if (sigaction(SIGHUP, &hup, NULL)) qFatal("Failed to install SIGHUP handler"); term.sa_handler = termSignalHandler; sigemptyset(&term.sa_mask); term.sa_flags = SA_RESTART; if (sigaction(SIGTERM, &term, NULL)) qFatal("Failed to install SIGTERM handler"); usr1.sa_handler = usr1SignalHandler; sigemptyset(&usr1.sa_mask); usr1.sa_flags = SA_RESTART; if (sigaction(SIGUSR1, &usr1, NULL)) qFatal("Failed to install SIGUSR1 handler"); umask(S_IRWXO); } UnixMurmur::~UnixMurmur() { delete qsnHup; delete qsnTerm; delete qsnUsr1; qsnHup = NULL; qsnTerm = NULL; qsnUsr1 = NULL; close(iHupFd[0]); close(iHupFd[1]); close(iTermFd[0]); close(iTermFd[1]); close(iUsr1Fd[0]); close(iUsr1Fd[1]); } void UnixMurmur::hupSignalHandler(int) { char a = 1; ssize_t len = ::write(iHupFd[0], &a, sizeof(a)); Q_UNUSED(len); } void UnixMurmur::termSignalHandler(int) { char a = 1; ssize_t len = ::write(iTermFd[0], &a, sizeof(a)); Q_UNUSED(len); } void UnixMurmur::usr1SignalHandler(int) { char a = 1; ssize_t len = ::write(iUsr1Fd[0], &a, sizeof(a)); Q_UNUSED(len); } // Keep these two synchronized with matching actions in DBus.cpp void UnixMurmur::handleSigHup() { qsnHup->setEnabled(false); char tmp; ssize_t len = ::read(iHupFd[1], &tmp, sizeof(tmp)); Q_UNUSED(len); if (logToSyslog) { qWarning("Caught SIGHUP, but logging to syslog"); } else if (! qfLog) { qWarning("Caught SIGHUP, but logfile not in use"); } else if (! qfLog->isOpen()) { qWarning("Caught SIGHUP, but logfile not in use -- interpreting as hint to quit"); QCoreApplication::instance()->quit(); } else { qWarning("Caught SIGHUP, will reopen %s", qPrintable(Meta::mp.qsLogfile)); QFile *newlog = new QFile(Meta::mp.qsLogfile); bool result = newlog->open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text); if (! result) { delete newlog; qCritical("Failed to reopen logfile for writing, keeping old log"); } else { QFile *oldlog = qfLog; newlog->setTextModeEnabled(true); qfLog = newlog; oldlog->close(); delete oldlog; qWarning("Log rotated successfully"); } } qsnHup->setEnabled(true); } void UnixMurmur::handleSigTerm() { qsnTerm->setEnabled(false); char tmp; ssize_t len = ::read(iTermFd[1], &tmp, sizeof(tmp)); Q_UNUSED(len); qCritical("Caught SIGTERM, exiting"); QCoreApplication::instance()->quit(); qsnTerm->setEnabled(true); } void UnixMurmur::handleSigUsr1() { qsnUsr1->setEnabled(false); char tmp; ssize_t len = ::read(iUsr1Fd[1], &tmp, sizeof(tmp)); Q_UNUSED(len); if (meta) { qWarning("UnixMurmur: Trying to reload SSL settings..."); bool ok = meta->reloadSSLSettings(); if (ok) { qWarning("UnixMurmur: Done reloading SSL settings."); } else { qWarning("UnixMurmur: Failed to reload SSL settings. Server state is intact and fully operational. No configuration changes were made."); } } qsnUsr1->setEnabled(true); } void UnixMurmur::setuid() { if (Meta::mp.uiUid != 0) { #ifdef Q_OS_DARWIN qCritical("WARNING: You are launching murmurd as root on Mac OS X or Darwin. Murmur does not need " "special privileges to set itself up on these systems, so this behavior is highly discouraged."); if (::setgid(Meta::mp.uiGid) != 0) qFatal("Failed to switch to gid %d", Meta::mp.uiGid); if (::setuid(Meta::mp.uiUid) != 0) qFatal("Failed to switch to uid %d", Meta::mp.uiUid); uid_t uid = getuid(), euid = geteuid(); gid_t gid = getgid(), egid = getegid(); if (uid == Meta::mp.uiUid && euid == Meta::mp.uiUid && gid == Meta::mp.uiGid && egid == Meta::mp.uiGid) { qCritical("Successfully switched to uid %d", Meta::mp.uiUid); } else qFatal("Couldn't switch uid/gid."); #else if (::initgroups(qPrintable(Meta::mp.qsName), Meta::mp.uiGid) != 0) qCritical("Can't initialize supplementary groups"); if (::setgid(Meta::mp.uiGid) != 0) qCritical("Failed to switch to gid %d", Meta::mp.uiGid); if (::setuid(Meta::mp.uiUid) != 0) { qFatal("Failed to become uid %d", Meta::mp.uiUid); } else { qCritical("Successfully switched to uid %d", Meta::mp.uiUid); initialcap(); } if (!Meta::mp.qsHome.isEmpty()) { // QDir::homePath is broken. It only looks at $HOME // instead of getpwuid() so we have to set our home // ourselves EnvUtils::setenv(QLatin1String("HOME"), qPrintable(Meta::mp.qsHome)); } #endif } else if (bRoot) { qCritical("WARNING: You are running murmurd as root, without setting a uname in the ini file. This might be a security risk."); } } void UnixMurmur::initialcap() { #ifdef Q_OS_LINUX cap_value_t caps[] = {CAP_NET_ADMIN, CAP_SETUID, CAP_SETGID, CAP_CHOWN, CAP_SYS_RESOURCE, CAP_DAC_OVERRIDE }; if (! bRoot) return; int ncap = sizeof(caps)/sizeof(cap_value_t); if (geteuid() != 0) ncap--; cap_t c = cap_init(); cap_clear(c); cap_set_flag(c, CAP_EFFECTIVE, ncap, caps, CAP_SET); cap_set_flag(c, CAP_INHERITABLE, ncap, caps, CAP_SET); cap_set_flag(c, CAP_PERMITTED, ncap, caps, CAP_SET); if (cap_set_proc(c) != 0) { qCritical("Failed to set initial capabilities"); } else { prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0); } cap_free(c); #endif } void UnixMurmur::finalcap() { #ifdef Q_OS_LINUX cap_value_t caps[] = {CAP_SYS_RESOURCE}; struct rlimit r; if (! bRoot) return; if (getrlimit(RLIMIT_RTPRIO, &r) != 0) { qCritical("Failed to get priority limits."); } else { qWarning("Resource limits were %ld %ld", r.rlim_cur, r.rlim_max); r.rlim_cur = r.rlim_max = 1; if (setrlimit(RLIMIT_RTPRIO, &r) != 0) { qCritical("Failed to set priority limits."); } } int ncap = sizeof(caps)/sizeof(cap_value_t); cap_t c = cap_init(); cap_clear(c); cap_set_flag(c, CAP_EFFECTIVE, ncap, caps, CAP_SET); cap_set_flag(c, CAP_PERMITTED, ncap, caps, CAP_SET); if (cap_set_proc(c) != 0) { qCritical("Failed to set final capabilities"); } else { qWarning("Successfully dropped capabilities"); } cap_free(c); #endif } const QString UnixMurmur::trySystemIniFiles(const QString& fname) { QString file = fname; if (!file.isEmpty()) return file; #if defined(Q_OS_LINUX) if (!bRoot) return file; QStringList inipaths; inipaths << QLatin1String("/usr/local/etc/mumble-server.ini"); inipaths << QLatin1String("/usr/local/etc/murmur.ini"); inipaths << QLatin1String("/etc/mumble-server.ini"); inipaths << QLatin1String("/etc/murmur.ini"); foreach(const QString &f, inipaths) { QFileInfo fi(f); if (fi.exists() && fi.isReadable()) { file = fi.absoluteFilePath(); break; } } #endif return file; } mumble-1.3.4/src/murmur/Server.h0000664000175000017500000003503614010707274016406 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MURMUR_SERVER_H_ #define MUMBLE_MURMUR_SERVER_H_ #ifndef Q_MOC_RUN # include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #if defined(USE_QSSLDIFFIEHELLMANPARAMETERS) # include #endif #ifdef Q_OS_WIN #include #endif #include "ACL.h" #include "Message.h" #include "Mumble.pb.h" #include "User.h" #include "Timer.h" #include "HostAddress.h" #include "Ban.h" class BonjourServer; class Channel; class PacketDataStream; class ServerUser; class User; class QNetworkAccessManager; struct TextMessage { QList qlSessions; QList qlChannels; QList qlTrees; QString qsText; }; class SslServer : public QTcpServer { private: Q_OBJECT; Q_DISABLE_COPY(SslServer) protected: QList qlSockets; #if QT_VERSION >= 0x050000 void incomingConnection(qintptr) Q_DECL_OVERRIDE; #else void incomingConnection(int) Q_DECL_OVERRIDE; #endif public: QSslSocket *nextPendingSSLConnection(); SslServer(QObject *parent = NULL); /// Checks whether the AF_INET6 socket on this system has dual-stack support. static bool hasDualStackSupport(); }; #define EXEC_QEVENT (QEvent::User + 959) class ExecEvent : public QEvent { Q_DISABLE_COPY(ExecEvent); protected: boost::function func; public: ExecEvent(boost::function); void execute(); }; class Server : public QThread { private: Q_OBJECT; Q_DISABLE_COPY(Server); protected: bool bRunning; QNetworkAccessManager *qnamNetwork; #ifdef USE_BONJOUR BonjourServer *bsRegistration; #endif void startThread(); void stopThread(); void customEvent(QEvent *evt); // Former ServerParams public: QList qlBind; unsigned short usPort; int iTimeout; int iMaxBandwidth; int iMaxUsers; int iMaxUsersPerChannel; int iDefaultChan; bool bRememberChan; int iMaxTextMessageLength; int iMaxImageMessageLength; int iOpusThreshold; bool bAllowHTML; QString qsPassword; QString qsWelcomeText; bool bCertRequired; bool bForceExternalAuth; QString qsRegName; QString qsRegPassword; QString qsRegHost; QString qsRegLocation; QUrl qurlRegWeb; bool bBonjour; bool bAllowPing; QRegExp qrUserName; QRegExp qrChannelName; unsigned int iMessageLimit; unsigned int iMessageBurst; QVariant qvSuggestVersion; QVariant qvSuggestPositional; QVariant qvSuggestPushToTalk; bool bUsingMetaCert; QSslCertificate qscCert; QSslKey qskKey; /// qlIntermediates contains the certificates /// from this virtual server's certificate PEM // bundle that do not match the virtual server's // private key. /// /// Simply put: it contains any certificates /// that aren't the main certificate, or "leaf" /// certificate. QList qlIntermediates; #if defined(USE_QSSLDIFFIEHELLMANPARAMETERS) QSslDiffieHellmanParameters qsdhpDHParams; #endif Timer tUptime; bool bValid; void readParams(); int iCodecAlpha; int iCodecBeta; bool bPreferAlpha; bool bOpus; void recheckCodecVersions(ServerUser *connectingUser = 0); #ifdef USE_BONJOUR void initBonjour(); void removeBonjour(); #endif // Registration, implementation in Register.cpp QTimer qtTick; void initRegister(); private: int iChannelNestingLimit; int iChannelCountLimit; public slots: void regSslError(const QList &); void finished(); void update(); // Certificate stuff, implemented partially in Cert.cpp public: static bool isKeyForCert(const QSslKey &key, const QSslCertificate &cert); /// Attempt to load a private key in PEM format from |buf|. /// If |passphrase| is non-empty, it will be used for decrypting the private key in |buf|. /// If a valid RSA, DSA or EC key is found, it is returned. /// If no valid private key is found, a null QSslKey is returned. static QSslKey privateKeyFromPEM(const QByteArray &buf, const QByteArray &pass = QByteArray()); void initializeCert(); const QString getDigest() const; public slots: void newClient(); void connectionClosed(QAbstractSocket::SocketError, const QString &); void sslError(const QList &); void message(unsigned int, const QByteArray &, ServerUser *cCon = NULL); void checkTimeout(); void tcpTransmitData(QByteArray, unsigned int); void doSync(unsigned int); void encrypted(); void udpActivated(int); signals: void reqSync(unsigned int); void tcpTransmit(QByteArray, unsigned int id); public: int iServerNum; QQueue qqIds; QList qlServer; QTimer *qtTimeout; #ifdef Q_OS_UNIX int aiNotify[2]; QList qlUdpSocket; #else HANDLE hNotify; QList qlUdpSocket; #endif quint32 uiVersionBlob; QList qlUdpNotifier; /// This lock provides synchronization between the /// main thread (where control channel messages and /// RPC happens), and the Server's voice thread. /// /// These are the only two threads in Murmur that /// access a Server's data. /// /// The easiest way to understand the locking strategy /// and synchronization between the main thread and the /// Server's voice thread is by using the concept of /// ownership. /// /// A thread owning an object means that it is the only /// thread that is allowed to write to that object. To /// make changes to it. /// /// Most data in the Server class is owned by the main /// thread. That means that the main thread is the only /// thread that writes/updates those structures. /// /// When processing incoming voice data (and re- /// broadcasting) that voice data), the Server's voice /// thread needs to access various parts of Server's data, /// such as qhUsers, qhChannels, User->cChannel, etc. /// However, these are owned by the main thread. /// /// To ensure correct synchronization between the two /// threads, the contract for using qrwlVoiceThread is /// as follows: /// /// - When the Server's voice thread needs to read data /// owned by the main thread, it must hold a read lock /// on qrwlVoiceThread. /// /// - The Server's voice thread does not write to any data /// that is owned by the main thread. /// /// - When the main thread needs to write to data owned by /// itself that is accessed by the voice thread, it must /// hold a write lock on qrwlVoiceThread. /// /// - When the main thread needs to read data that is owned /// by itself, it DOES NOT hold a lock on qrwlVoiceThread. /// That is because ownership of data guarantees that no /// other thread can write to that data. QReadWriteLock qrwlVoiceThread; QHash qhUsers; QHash, ServerUser *> qhPeerUsers; QHash > qhHostUsers; QHash qhChannels; QMutex qmCache; ChanACL::ACLCache acCache; QHash qhUserNameCache; QHash qhUserIDCache; QList qlBans; void processMsg(ServerUser *u, const char *data, int len); void sendMessage(ServerUser *u, const char *data, int len, QByteArray &cache, bool force = false); void run(); bool validateChannelName(const QString &name); bool validateUserName(const QString &name); bool checkDecrypt(ServerUser *u, const char *encrypted, char *plain, unsigned int cryptlen); bool hasPermission(ServerUser *p, Channel *c, QFlags perm); QFlags effectivePermissions(ServerUser *p, Channel *c); void sendClientPermission(ServerUser *u, Channel *c, bool updatelast = false); void flushClientPermissionCache(ServerUser *u, MumbleProto::PermissionQuery &mpqq); void clearACLCache(User *p = NULL); void sendProtoAll(const ::google::protobuf::Message &msg, unsigned int msgType, unsigned int minversion); void sendProtoExcept(ServerUser *, const ::google::protobuf::Message &msg, unsigned int msgType, unsigned int minversion); void sendProtoMessage(ServerUser *, const ::google::protobuf::Message &msg, unsigned int msgType); // sendAll sends a protobuf message to all users on the server whose version is either bigger than v or // lower than ~v. If v == 0 the message is sent to everyone. #define MUMBLE_MH_MSG(x) \ void sendAll(const MumbleProto:: x &msg, unsigned int v = 0) { sendProtoAll(msg, MessageHandler:: x, v); } \ void sendExcept(ServerUser *u, const MumbleProto:: x &msg, unsigned int v = 0) { sendProtoExcept(u, msg, MessageHandler:: x, v); } \ void sendMessage(ServerUser *u, const MumbleProto:: x &msg) { sendProtoMessage(u, msg, MessageHandler:: x); } MUMBLE_MH_ALL #undef MUMBLE_MH_MSG static void hashAssign(QString &destination, QByteArray &hash, const QString &str); static void hashAssign(QByteArray &destination, QByteArray &hash, const QByteArray &source); bool isTextAllowed(QString &str, bool &changed); void setLiveConf(const QString &key, const QString &value); QString addressToString(const QHostAddress &, unsigned short port); void log(const QString &) const; void log(ServerUser *u, const QString &) const; void removeChannel(int id); void removeChannel(Channel *c, Channel *dest = NULL); void userEnterChannel(User *u, Channel *c, MumbleProto::UserState &mpus); bool unregisterUser(int id); Server(int snum, QObject *parent = NULL); ~Server(); bool canNest(Channel *newParent, Channel *channel = NULL) const; // RPC functions. Implementation in RPC.cpp void connectAuthenticator(QObject *p); void disconnectAuthenticator(QObject *p); void connectListener(QObject *p); void disconnectListener(QObject *p); void setTempGroups(int userid, int sessionId, Channel *cChannel, const QStringList &groups); void clearTempGroups(User *user, Channel *cChannel = NULL, bool recurse = true); signals: void registerUserSig(int &, const QMap &); void unregisterUserSig(int &, int); void getRegisteredUsersSig(const QString &, QMap &); void getRegistrationSig(int &, int, QMap &); void authenticateSig(int &, QString &, int, const QList &, const QString &, bool, const QString &); void setInfoSig(int &, int, const QMap &); void setTextureSig(int &, int, const QByteArray &); void idToNameSig(QString &, int); void nameToIdSig(int &, const QString &); void idToTextureSig(QByteArray &, int); void userStateChanged(const User *); void userTextMessage(const User *, const TextMessage &); void userConnected(const User *); void userDisconnected(const User *); void channelStateChanged(const Channel *); void channelCreated(const Channel *); void channelRemoved(const Channel *); void textMessageFilterSig(int &, const User *, MumbleProto::TextMessage &); void contextAction(const User *, const QString &, unsigned int, int); public: void setUserState(User *p, Channel *parent, bool mute, bool deaf, bool suppressed, bool prioritySpeaker, const QString& name = QString(), const QString &comment = QString()); /// Update a channel's state using the ChannelState protobuf message and /// broadcast the changes appropriately to the server. On return, if /// err is non-empty, the operation failed, and err contains a description /// of the error. /// /// This method is equivalent to the logic that happens in /// Server::msgChannelState when a ChannelState message is recieved from /// a user. However, this method doesn't do permissions checking. /// /// This method is used by the gRPC implementation to perform channel /// state changes. bool setChannelStateGRPC(const MumbleProto::ChannelState &cs, QString &err); bool setChannelState(Channel *c, Channel *parent, const QString &qsName, const QSet &links, const QString &desc = QString(), const int position = 0); /// Send a text message using the TextMessage protobuf message /// as a template. /// This is equivalent to the logic that happens in Server::msgTextMessage /// when sending a receieved TextMessage, with the exception that this /// method does not perform any permission checks. /// It is used by our gRPC implementation to send text messages. void sendTextMessageGRPC(const ::MumbleProto::TextMessage &tm); void sendTextMessage(Channel *cChannel, ServerUser *pUser, bool tree, const QString &text); /// Returns true if a channel is full. If a user is provided, false will always /// be returned if the user has write permission in the channel. bool isChannelFull(Channel *c, ServerUser *u = 0); // Database / DBus functions. Implementation in ServerDB.cpp void initialize(); int authenticate(QString &name, const QString &pw, int sessionId = 0, const QStringList &emails = QStringList(), const QString &certhash = QString(), bool bStrongCert = false, const QList & = QList()); Channel *addChannel(Channel *c, const QString &name, bool temporary = false, int position = 0, unsigned int maxUsers = 0); void removeChannelDB(const Channel *c); void readChannels(Channel *p = NULL); void readLinks(); void updateChannel(const Channel *c); void readChannelPrivs(Channel *c); void setLastChannel(const User *u); int readLastChannel(int id); void dumpChannel(const Channel *c); int getUserID(const QString &name); QString getUserName(int id); QByteArray getUserTexture(int id); QMap getRegistration(int id); int registerUser(const QMap &info); bool unregisterUserDB(int id); QList getRegisteredUsersEx(); QMap getRegisteredUsers(const QString &filter = QString()); bool setInfo(int id, const QMap &info); bool setTexture(int id, const QByteArray &texture); bool isUserId(int id); void addLink(Channel *c, Channel *l); void removeLink(Channel *c, Channel *l); void getBans(); void saveBans(); QVariant getConf(const QString &key, QVariant def); void setConf(const QString &key, const QVariant &value); void dblog(const QString &str) const; // From msgHandler. Implementation in Messages.cpp #define MUMBLE_MH_MSG(x) void msg##x(ServerUser *, MumbleProto:: x &); MUMBLE_MH_ALL #undef MUMBLE_MH_MSG }; #endif mumble-1.3.4/src/murmur/ServerDB.cpp0000664000175000017500000025022514010707274017146 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "murmur_pch.h" #include "ServerDB.h" #include "ACL.h" #include "Channel.h" #include "Connection.h" #include "DBus.h" #include "Group.h" #include "Meta.h" #include "Server.h" #include "ServerUser.h" #include "User.h" #include "PBKDF2.h" #include "PasswordGenerator.h" #define SQLQUERY(x) ServerDB::query(query, QLatin1String(x), true) #define SQLDO(x) ServerDB::exec(query, QLatin1String(x), true) #define SQLDO_NO_CONVERSION(x) ServerDB::exec(query, x, true) #define SQLMAY(x) ServerDB::exec(query, QLatin1String(x), false, false) #define SQLPREP(x) ServerDB::prepare(query, QLatin1String(x)) #define SQLEXEC() ServerDB::exec(query) #define SQLEXECBATCH() ServerDB::execBatch(query) #define SOFTEXEC() ServerDB::exec(query, QString(), false) class TransactionHolder { public: QSqlQuery *qsqQuery; TransactionHolder() { ServerDB::db->transaction(); qsqQuery = new QSqlQuery(); } ~TransactionHolder() { qsqQuery->clear(); delete qsqQuery; ServerDB::db->commit(); } TransactionHolder(const TransactionHolder & other) { ServerDB::db->transaction(); qsqQuery = other.qsqQuery ? new QSqlQuery(*other.qsqQuery) : 0; } }; QSqlDatabase *ServerDB::db = NULL; Timer ServerDB::tLogClean; QString ServerDB::qsUpgradeSuffix; void ServerDB::loadOrSetupMetaPBKDF2IterationCount(QSqlQuery &query) { if (!Meta::mp.legacyPasswordHash) { if (Meta::mp.kdfIterations <= 0) { // Configuration doesn't specify an override, load from db SQLDO("SELECT `value` FROM `%1meta` WHERE `keystring` = 'pbkdf2_iterations'"); if (query.next()) { Meta::mp.kdfIterations = query.value(0).toInt(); } if (Meta::mp.kdfIterations <= 0) { // Didn't get a valid iteration count from DB, overwrite Meta::mp.kdfIterations = PBKDF2::benchmark(); qWarning() << "Performed initial PBKDF2 benchmark. Will use" << Meta::mp.kdfIterations << "iterations as default"; SQLPREP("INSERT INTO `%1meta` (`keystring`, `value`) VALUES('pbkdf2_iterations',?)"); query.addBindValue(Meta::mp.kdfIterations); SQLEXEC(); } } if (Meta::mp.kdfIterations < PBKDF2::BENCHMARK_MINIMUM_ITERATION_COUNT) { qWarning() << "Configured default PBKDF2 iteration count of" << Meta::mp.kdfIterations << "is below minimum recommended value of" << PBKDF2::BENCHMARK_MINIMUM_ITERATION_COUNT << "and could be insecure."; } } } ServerDB::ServerDB() { if (Meta::mp.qsDBDriver != QLatin1String("QMYSQL") && Meta::mp.qsDBDriver != QLatin1String("QSQLITE") && Meta::mp.qsDBDriver != QLatin1String("QPSQL")) { qFatal("ServerDB: invalid DB driver specified: '%s'. Murmur only supports QSQLITE, QMYSQL, and QPSQL.", qPrintable(Meta::mp.qsDBDriver)); } if (! QSqlDatabase::isDriverAvailable(Meta::mp.qsDBDriver)) { qFatal("ServerDB: Database driver %s not available", qPrintable(Meta::mp.qsDBDriver)); } if (db) { // Don't hide away our previous instance. Fail hard. qFatal("ServerDB has already been instantiated!"); } db = new QSqlDatabase(QSqlDatabase::addDatabase(Meta::mp.qsDBDriver)); qsUpgradeSuffix = QString::fromLatin1("_old_%1").arg(QDateTime::currentDateTime().toTime_t()); bool found = false; if (Meta::mp.qsDBDriver == "QSQLITE") { if (! Meta::mp.qsDatabase.isEmpty()) { db->setDatabaseName(Meta::mp.qsDatabase); found = db->open(); } else { QStringList datapaths; int i; datapaths << Meta::mp.qdBasePath.absolutePath(); datapaths << QDir::currentPath(); datapaths << QCoreApplication::instance()->applicationDirPath(); datapaths << QDir::homePath(); for (i = 0; (i < datapaths.size()) && ! found; i++) { if (!datapaths[i].isEmpty()) { QFile f(datapaths[i] + "/murmur.sqlite"); if (f.exists()) { db->setDatabaseName(f.fileName()); found = db->open(); } } } if (! found) { for (i = 0; (i < datapaths.size()) && ! found; i++) { if (!datapaths[i].isEmpty()) { QFile f(datapaths[i] + "/murmur.sqlite"); db->setDatabaseName(f.fileName()); found = db->open(); } } } } if (found) { QFileInfo fi(db->databaseName()); qWarning("ServerDB: Opened SQLite database %s", qPrintable(fi.absoluteFilePath())); if (! fi.isWritable()) qFatal("ServerDB: Database is not writable"); } } else { db->setDatabaseName(Meta::mp.qsDatabase); db->setHostName(Meta::mp.qsDBHostName); db->setPort(Meta::mp.iDBPort); db->setUserName(Meta::mp.qsDBUserName); db->setPassword(Meta::mp.qsDBPassword); db->setConnectOptions(Meta::mp.qsDBOpts); found = db->open(); } if (! found) { QSqlError e = db->lastError(); qFatal("ServerDB: Failed initialization: %s",qPrintable(e.text())); } // Use SQLite in WAL mode if possible. if (Meta::mp.qsDBDriver == "QSQLITE") { if (Meta::mp.iSQLiteWAL == 0) { qWarning("ServerDB: Using SQLite's default rollback journal."); } else if (Meta::mp.iSQLiteWAL > 0 && Meta::mp.iSQLiteWAL <= 2) { QSqlQuery query; bool hasversion = false; bool okversion = false; QString version; SQLDO("SELECT sqlite_version();"); if (query.next()) { version = query.value(0).toString(); } QStringList splitVersion = version.split(QLatin1String(".")); int major = 0, minor = 0; if (splitVersion.count() >= 3) { major = splitVersion.at(0).toInt(); minor = splitVersion.at(1).toInt(); hasversion = true; } if (major > 3 || (major == 3 && minor >= 7)) { okversion = true; } if (okversion) { SQLDO("PRAGMA journal_mode=WAL;"); if (Meta::mp.iSQLiteWAL == 1) { SQLDO("PRAGMA synchronous=NORMAL;"); qWarning("ServerDB: Configured SQLite for journal_mode=WAL, synchronous=NORMAL"); } else if (Meta::mp.iSQLiteWAL == 2) { SQLDO("PRAGMA synchronous=FULL;"); qWarning("ServerDB: Configured SQLite for journal_mode=WAL, synchronous=FULL"); } } else if (hasversion) { qWarning("ServerDB: Unable to use SQLite in WAL mode due to incompatible SQLite version %i.%i", major, minor); } else { qWarning("ServerDB: Unable to use SQLite in WAL mode because the SQLite version could not be determined."); } } else { qFatal("ServerDB: Invalid value '%i' for sqlite_wal. Please use 0 (no wal), 1 (wal), 2 (wal with synchronous=full)", Meta::mp.iSQLiteWAL); } } TransactionHolder th; QSqlQuery &query = *th.qsqQuery; // Ensure that a proper encoding is used for the DB if (Meta::mp.qsDBDriver == "QMYSQL") { query.exec(QString::fromLatin1("SELECT default_character_set_name FROM information_schema.SCHEMATA WHERE schema_name = '%1'").arg(Meta::mp.qsDatabase)); if (query.next()) { QString encoding = query.value(0).toString(); // Because MySQL's utf8 implementation is not actually utf8, we have to use a different name to access the actual // utf8 implementation. (See https://mathiasbynens.be/notes/mysql-utf8mb4) if (encoding.toLower() != QLatin1String("utf8mb4")) { // Change the database's encoding qWarning("Changing database encoding to utf8mb4..."); if (!query.exec(QString::fromLatin1("ALTER DATABASE `%1` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci").arg(Meta::mp.qsDatabase))) { qFatal("ServerDB: Failed to set default encoding & collation to UTF-8: %s", qPrintable(query.lastError().text())); } } } else { qFatal("Failed to get character encoding: %s", qPrintable(query.lastError().text())); } } else if (Meta::mp.qsDBDriver == "QSQLITE") { // Verify that the SQLite database has been initialized with UTF-8 or UTF-16 SQLQUERY("PRAGMA ENCODING;"); if (query.next()) { QStringList validEncodings; validEncodings << QLatin1String("utf-8"); validEncodings << QLatin1String("utf-16"); validEncodings << QLatin1String("utf-16le"); validEncodings << QLatin1String("utf-16be"); QString encoding = query.value(0).toString(); if (!validEncodings.contains(encoding, Qt::CaseInsensitive)) { qFatal("Invalid character encoding %s for database", qPrintable(encoding)); } } else { qFatal("Failed to get character encoding: %s", qPrintable(query.lastError().text())); } } else { // PostgreSQL SQLQUERY("SHOW SERVER_ENCODING"); if (query.next()) { QString encoding = query.value(0).toString(); if (encoding.toLower() != QLatin1String("utf8")) { qFatal("Found \"%s\" encoding but we only support UTF8 for PostgreSQL!", qPrintable(encoding)); } } else { qFatal("Failed to get character encoding: %s", qPrintable(query.lastError().text())); } } int version = 0; // Make sure a table called "meta" is present // We use the meta table to keep track of various meta information such as the // database structure version this database conforms to. if (Meta::mp.qsDBDriver == "QSQLITE") SQLDO("CREATE TABLE IF NOT EXISTS `%1meta` (`keystring` TEXT PRIMARY KEY, `value` TEXT)"); else if (Meta::mp.qsDBDriver == "QPSQL") SQLQUERY("CREATE TABLE IF NOT EXISTS `%1meta` (`keystring` varchar(255) PRIMARY KEY, `value` varchar(255))"); else // MySQL SQLDO("CREATE TABLE IF NOT EXISTS `%1meta`(`keystring` varchar(255) PRIMARY KEY, `value` varchar(255)) ENGINE=InnoDB"); // Query the database structure version the existing database conforms to SQLDO("SELECT `value` FROM `%1meta` WHERE `keystring` = 'version'"); if (query.next()) version = query.value(0).toInt(); loadOrSetupMetaPBKDF2IterationCount(query); // Check if the database structure conforms to what this version of the code expects yb comparing to // DB_STRUCTURE_VERSION. If the queried version is less than that, we might have to perform compatibility // changes or create the tables in the first place. if (version < DB_STRUCTURE_VERSION) { if (version > 0) { // A version > 0 means that there are tables in the DB already but they don't conform to the // most recent structure. That means that we have to update them. // Before doing that though we create backups of the existing tables in case something goes wrong. qWarning("Renaming old tables..."); // %s is the table prefix we are using and %2 is the upgrade suffix we defined above. // See ServerDB::query for mor info on the %-notation. SQLQUERY("ALTER TABLE `%1servers` RENAME TO `%1servers%2`"); if (version < 2) SQLMAY("ALTER TABLE `%1log` RENAME TO `%1slog`"); SQLQUERY("ALTER TABLE `%1slog` RENAME TO `%1slog%2`"); SQLQUERY("ALTER TABLE `%1config` RENAME TO `%1config%2`"); SQLQUERY("ALTER TABLE `%1channels` RENAME TO `%1channels%2`"); if (version < 4) SQLQUERY("ALTER TABLE `%1players` RENAME TO `%1players%2`"); else SQLQUERY("ALTER TABLE `%1users` RENAME TO `%1users%2`"); SQLQUERY("ALTER TABLE `%1groups` RENAME TO `%1groups%2`"); SQLQUERY("ALTER TABLE `%1group_members` RENAME TO `%1group_members%2`"); SQLQUERY("ALTER TABLE `%1acl` RENAME TO `%1acl%2`"); SQLQUERY("ALTER TABLE `%1channel_links` RENAME TO `%1channel_links%2`"); SQLQUERY("ALTER TABLE `%1bans` RENAME TO `%1bans%2`"); if (version >= 4) { SQLQUERY("ALTER TABLE `%1user_info` RENAME TO `%1user_info%2`"); SQLQUERY("ALTER TABLE `%1channel_info` RENAME TO `%1channel_info%2`"); } } // Now we generate new tables that conform to the state-of-the-art structure qWarning("Generating new tables..."); if (Meta::mp.qsDBDriver == "QSQLITE") { if (version > 0) { SQLDO("DROP TRIGGER IF EXISTS `%1log_timestamp`"); SQLDO("DROP TRIGGER IF EXISTS `%1log_server_del`"); SQLDO("DROP TRIGGER IF EXISTS `%1slog_timestamp`"); SQLDO("DROP TRIGGER IF EXISTS `%1slog_server_del`"); SQLDO("DROP TRIGGER IF EXISTS `%1config_server_del`"); SQLDO("DROP TRIGGER IF EXISTS `%1channels_parent_del`"); SQLDO("DROP TRIGGER IF EXISTS `%1channels_server_del`"); SQLDO("DROP TRIGGER IF EXISTS `%1channel_info_del_channel`"); SQLDO("DROP TRIGGER IF EXISTS `%1players_server_del`"); SQLDO("DROP TRIGGER IF EXISTS `%1players_update_timestamp`"); SQLDO("DROP TRIGGER IF EXISTS `%1users_server_del`"); SQLDO("DROP TRIGGER IF EXISTS `%1users_update_timestamp`"); SQLDO("DROP TRIGGER IF EXISTS `%1user_info_del_user`"); SQLDO("DROP TRIGGER IF EXISTS `%1groups_del_channel`"); SQLDO("DROP TRIGGER IF EXISTS `%1groups_members_del_group`"); SQLDO("DROP TRIGGER IF EXISTS `%1groups_members_del_player`"); SQLDO("DROP TRIGGER IF EXISTS `%1groups_members_del_user`"); SQLDO("DROP TRIGGER IF EXISTS `%1acl_del_channel`"); SQLDO("DROP TRIGGER IF EXISTS `%1acl_del_player`"); SQLDO("DROP TRIGGER IF EXISTS `%1acl_del_user`"); SQLDO("DROP TRIGGER IF EXISTS `%1channel_links_del_channel`"); SQLDO("DROP TRIGGER IF EXISTS `%1bans_del_server`"); SQLDO("DROP INDEX IF EXISTS `%1log_time`"); SQLDO("DROP INDEX IF EXISTS `%1slog_time`"); SQLDO("DROP INDEX IF EXISTS `%1config_key`"); SQLDO("DROP INDEX IF EXISTS `%1channel_id`"); SQLDO("DROP INDEX IF EXISTS `%1channel_info_id`"); SQLDO("DROP INDEX IF EXISTS `%1players_name`"); SQLDO("DROP INDEX IF EXISTS `%1players_id`"); SQLDO("DROP INDEX IF EXISTS `%1users_name`"); SQLDO("DROP INDEX IF EXISTS `%1users_id`"); SQLDO("DROP INDEX IF EXISTS `%1user_info_id`"); SQLDO("DROP INDEX IF EXISTS `%1groups_name_channels`"); SQLDO("DROP INDEX IF EXISTS `%1acl_channel_pri`"); } SQLDO("CREATE TABLE `%1servers` (`server_id` INTEGER PRIMARY KEY AUTOINCREMENT)"); SQLDO("CREATE TABLE `%1slog`(`server_id` INTEGER NOT NULL, `msg` TEXT, `msgtime` DATE)"); SQLDO("CREATE INDEX `%1slog_time` ON `%1slog`(`msgtime`)"); SQLDO("CREATE TRIGGER `%1slog_timestamp` AFTER INSERT ON `%1slog` FOR EACH ROW BEGIN UPDATE `%1slog` SET `msgtime` = datetime('now') WHERE rowid = new.rowid; END;"); SQLDO("CREATE TRIGGER `%1slog_server_del` AFTER DELETE ON `%1servers` FOR EACH ROW BEGIN DELETE FROM `%1slog` WHERE `server_id` = old.`server_id`; END;"); SQLDO("CREATE TABLE `%1config` (`server_id` INTEGER NOT NULL, `key` TEXT, `value` TEXT)"); SQLDO("CREATE UNIQUE INDEX `%1config_key` ON `%1config`(`server_id`, `key`)"); SQLDO("CREATE TRIGGER `%1config_server_del` AFTER DELETE ON `%1servers` FOR EACH ROW BEGIN DELETE FROM `%1config` WHERE `server_id` = old.`server_id`; END;"); SQLDO("CREATE TABLE `%1channels` (`server_id` INTEGER NOT NULL, `channel_id` INTEGER NOT NULL, `parent_id` INTEGER, `name` TEXT, `inheritacl` INTEGER)"); SQLDO("CREATE UNIQUE INDEX `%1channel_id` ON `%1channels`(`server_id`, `channel_id`)"); SQLDO("CREATE TRIGGER `%1channels_parent_del` AFTER DELETE ON `%1channels` FOR EACH ROW BEGIN DELETE FROM `%1channels` WHERE `parent_id` = old.`channel_id` AND `server_id` = old.`server_id`; UPDATE `%1users` SET `lastchannel`=0 WHERE `lastchannel` = old.`channel_id` AND `server_id` = old.`server_id`; END;"); SQLDO("CREATE TRIGGER `%1channels_server_del` AFTER DELETE ON `%1servers` FOR EACH ROW BEGIN DELETE FROM `%1channels` WHERE `server_id` = old.`server_id`; END;"); SQLDO("CREATE TABLE `%1channel_info` (`server_id` INTEGER NOT NULL, `channel_id` INTEGER NOT NULL, `key` INTEGER, `value` TEXT)"); SQLDO("CREATE UNIQUE INDEX `%1channel_info_id` ON `%1channel_info`(`server_id`, `channel_id`, `key`)"); SQLDO("CREATE TRIGGER `%1channel_info_del_channel` AFTER DELETE on `%1channels` FOR EACH ROW BEGIN DELETE FROM `%1channel_info` WHERE `channel_id` = old.`channel_id` AND `server_id` = old.`server_id`; END;"); SQLDO("CREATE TABLE `%1users` (`server_id` INTEGER NOT NULL, `user_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `pw` TEXT, `salt` TEXT, `kdfiterations` INTEGER, `lastchannel` INTEGER, `texture` BLOB, `last_active` DATE)"); SQLDO("CREATE UNIQUE INDEX `%1users_name` ON `%1users` (`server_id`,`name`)"); SQLDO("CREATE UNIQUE INDEX `%1users_id` ON `%1users` (`server_id`, `user_id`)"); SQLDO("CREATE TRIGGER `%1users_server_del` AFTER DELETE ON `%1servers` FOR EACH ROW BEGIN DELETE FROM `%1users` WHERE `server_id` = old.`server_id`; END;"); SQLDO("CREATE TRIGGER `%1users_update_timestamp` AFTER UPDATE OF `lastchannel` ON `%1users` FOR EACH ROW BEGIN UPDATE `%1users` SET `last_active` = datetime('now') WHERE `user_id` = old.`user_id` AND `server_id` = old.`server_id`; END;"); SQLDO("CREATE TABLE `%1user_info` (`server_id` INTEGER NOT NULL, `user_id` INTEGER NOT NULL, `key` INTEGER, `value` TEXT)"); SQLDO("CREATE UNIQUE INDEX `%1user_info_id` ON `%1user_info`(`server_id`, `user_id`, `key`)"); SQLDO("CREATE TRIGGER `%1user_info_del_user` AFTER DELETE on `%1users` FOR EACH ROW BEGIN DELETE FROM `%1user_info` WHERE `user_id` = old.`user_id` AND `server_id` = old.`server_id`; END;"); SQLDO("CREATE TABLE `%1groups` (`group_id` INTEGER PRIMARY KEY AUTOINCREMENT, `server_id` INTEGER NOT NULL, `name` TEXT, `channel_id` INTEGER NOT NULL, `inherit` INTEGER, `inheritable` INTEGER)"); SQLDO("CREATE UNIQUE INDEX `%1groups_name_channels` ON `%1groups`(`server_id`, `channel_id`, `name`)"); SQLDO("CREATE TRIGGER `%1groups_del_channel` AFTER DELETE ON `%1channels` FOR EACH ROW BEGIN DELETE FROM `%1groups` WHERE `channel_id` = old.`channel_id` AND `server_id` = old.`server_id`; END;"); SQLDO("CREATE TABLE `%1group_members` (`group_id` INTEGER NOT NULL, `server_id` INTEGER NOT NULL, `user_id` INTEGER NOT NULL, `addit` INTEGER)"); SQLDO("CREATE TRIGGER `%1groups_members_del_group` AFTER DELETE ON `%1groups` FOR EACH ROW BEGIN DELETE FROM `%1group_members` WHERE `group_id` = old.`group_id`; END;"); SQLDO("CREATE TRIGGER `%1groups_members_del_user` AFTER DELETE on `%1users` FOR EACH ROW BEGIN DELETE FROM `%1group_members` WHERE `user_id` = old.`user_id` AND `server_id` = old.`server_id`; END;"); SQLDO("CREATE TABLE `%1acl` (`server_id` INTEGER NOT NULL, `channel_id` INTEGER NOT NULL, `priority` INTEGER, `user_id` INTEGER, `group_name` TEXT, `apply_here` INTEGER, `apply_sub` INTEGER, `grantpriv` INTEGER, `revokepriv` INTEGER)"); SQLDO("CREATE UNIQUE INDEX `%1acl_channel_pri` ON `%1acl`(`server_id`, `channel_id`, `priority`)"); SQLDO("CREATE TRIGGER `%1acl_del_channel` AFTER DELETE ON `%1channels` FOR EACH ROW BEGIN DELETE FROM `%1acl` WHERE `channel_id` = old.`channel_id` AND `server_id` = old.`server_id`; END;"); SQLDO("CREATE TRIGGER `%1acl_del_user` AFTER DELETE ON `%1users` FOR EACH ROW BEGIN DELETE FROM `%1acl` WHERE `user_id` = old.`user_id` AND `server_id` = old.`server_id`; END;"); SQLDO("CREATE TABLE `%1channel_links` (`server_id` INTEGER NOT NULL, `channel_id` INTEGER NOT NULL, `link_id` INTEGER NOT NULL)"); SQLDO("CREATE TRIGGER `%1channel_links_del_channel` AFTER DELETE ON `%1channels` FOR EACH ROW BEGIN DELETE FROM `%1channel_links` WHERE `server_id` = old.`server_id` AND (`channel_id` = old.`channel_id` OR `link_id` = old.`channel_id`); END;"); SQLDO("DELETE FROM `%1channel_links`"); SQLDO("CREATE TABLE `%1bans` (`server_id` INTEGER NOT NULL, `base` BLOB, `mask` INTEGER, `name` TEXT, `hash` TEXT, `reason` TEXT, `start` DATE, `duration` INTEGER)"); SQLDO("CREATE TRIGGER `%1bans_del_server` AFTER DELETE ON `%1servers` FOR EACH ROW BEGIN DELETE FROM `%1bans` WHERE `server_id` = old.`server_id`; END;"); } else if (Meta::mp.qsDBDriver == "QPSQL") { if (version > 0) { typedef QPair qsp; QList qlForeignKeys; QList qlIndexes; SQLPREP("SELECT TABLE_NAME, CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA=? AND CONSTRAINT_TYPE='FOREIGN KEY'"); query.addBindValue(Meta::mp.qsDatabase); SQLEXEC(); while (query.next()) qlForeignKeys << qsp(query.value(0).toString(), query.value(1).toString()); foreach(const qsp &key, qlForeignKeys) { if (key.first.startsWith(Meta::mp.qsDBPrefix)) ServerDB::exec(query, QString::fromLatin1("ALTER TABLE `%1` DROP CONSTRAINT FOREIGN KEY `%2`").arg(key.first).arg(key.second), true); } SQLPREP("SELECT TABLE_NAME, CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA=? AND CONSTRAINT_TYPE='PRIMARY KEY'"); query.addBindValue(Meta::mp.qsDatabase); SQLEXEC(); while (query.next()) qlIndexes << qsp(query.value(0).toString(), query.value(1).toString()); foreach(const qsp &key, qlIndexes) { if (key.first.startsWith(Meta::mp.qsDBPrefix)) ServerDB::exec(query, QString::fromLatin1("ALTER TABLE `%1` DROP CONSTRAINT PRIMARY KEY `%2`").arg(key.first).arg(key.second), true); } SQLQUERY("DROP INDEX IF EXISTS `%1slog_time` CASCADE"); SQLQUERY("DROP INDEX IF EXISTS `%1config_key` CASCADE"); SQLQUERY("DROP INDEX IF EXISTS `%1channel_id` CASCADE"); SQLQUERY("DROP INDEX IF EXISTS `%1channel_info_id` CASCADE"); SQLQUERY("DROP INDEX IF EXISTS `%1players_name` CASCADE"); SQLQUERY("DROP INDEX IF EXISTS `%1players_id` CASCADE"); SQLQUERY("DROP INDEX IF EXISTS `%1users_channel` CASCADE"); SQLQUERY("DROP INDEX IF EXISTS `%1users_name` CASCADE"); SQLQUERY("DROP INDEX IF EXISTS `%1users_id` CASCADE"); SQLQUERY("DROP INDEX IF EXISTS `%1user_info_id` CASCADE"); SQLQUERY("DROP INDEX IF EXISTS `%1groups_name_channels` CASCADE"); SQLQUERY("DROP INDEX IF EXISTS `%1group_members_users` CASCADE"); SQLQUERY("DROP INDEX IF EXISTS `%1acl_channel_pri` CASCADE"); SQLQUERY("DROP INDEX IF EXISTS `%1acl_user` CASCADE"); } SQLQUERY("CREATE TABLE `%1servers`(`server_id` SERIAL PRIMARY KEY)"); SQLQUERY("CREATE TABLE `%1slog`(`server_id` INTEGER NOT NULL, `msg` TEXT, `msgtime` TIMESTAMP DEFAULT now())"); SQLQUERY("CREATE INDEX `%1slog_time` ON `%1slog`(`msgtime`)"); SQLQUERY("ALTER TABLE `%1slog` ADD CONSTRAINT `%1slog_server_del` FOREIGN KEY (`server_id`) REFERENCES `%1servers`(`server_id`) ON DELETE CASCADE"); SQLQUERY("CREATE TABLE `%1config` (`server_id` INTEGER NOT NULL, `key` varchar(255), `value` TEXT)"); SQLQUERY("CREATE UNIQUE INDEX `%1config_key` ON `%1config`(`server_id`, `key`)"); SQLQUERY("ALTER TABLE `%1config` ADD CONSTRAINT `%1config_server_del` FOREIGN KEY (`server_id`) REFERENCES `%1servers`(`server_id`) ON DELETE CASCADE"); SQLQUERY("CREATE TABLE `%1channels` (`server_id` INTEGER NOT NULL, `channel_id` INTEGER NOT NULL, `parent_id` INTEGER, `name` varchar(255), `inheritacl` INTEGER)"); SQLQUERY("CREATE UNIQUE INDEX `%1channel_id` ON `%1channels`(`server_id`, `channel_id`)"); SQLQUERY("ALTER TABLE `%1channels` ADD CONSTRAINT `%1channels_parent_del` FOREIGN KEY (`server_id`, `parent_id`) REFERENCES `%1channels`(`server_id`,`channel_id`) ON DELETE CASCADE"); SQLQUERY("ALTER TABLE `%1channels` ADD CONSTRAINT `%1channels_server_del` FOREIGN KEY (`server_id`) REFERENCES `%1servers`(`server_id`) ON DELETE CASCADE"); SQLQUERY("CREATE TABLE `%1channel_info` (`server_id` INTEGER NOT NULL, `channel_id` INTEGER NOT NULL, `key` INTEGER, `value` TEXT)"); SQLQUERY("CREATE UNIQUE INDEX `%1channel_info_id` ON `%1channel_info`(`server_id`, `channel_id`, `key`)"); SQLQUERY("ALTER TABLE `%1channel_info` ADD CONSTRAINT `%1channel_info_del_channel` FOREIGN KEY (`server_id`, `channel_id`) REFERENCES `%1channels`(`server_id`,`channel_id`) ON DELETE CASCADE"); SQLQUERY("CREATE TABLE `%1users` (`server_id` INTEGER NOT NULL, `user_id` INTEGER NOT NULL, `name` varchar(255), `pw` varchar(128), `salt` varchar(128), `kdfiterations` INTEGER, `lastchannel` INTEGER, `texture` BYTEA, `last_active` TIMESTAMP)"); SQLQUERY("CREATE INDEX `%1users_channel` ON `%1users`(`server_id`, `lastchannel`)"); SQLQUERY("CREATE UNIQUE INDEX `%1users_name` ON `%1users` (`server_id`,`name`)"); SQLQUERY("CREATE UNIQUE INDEX `%1users_id` ON `%1users` (`server_id`, `user_id`)"); SQLQUERY("ALTER TABLE `%1users` ADD CONSTRAINT `%1users_server_del` FOREIGN KEY (`server_id`) REFERENCES `%1servers`(`server_id`) ON DELETE CASCADE"); SQLQUERY("CREATE TABLE `%1user_info` (`server_id` INTEGER NOT NULL, `user_id` INTEGER NOT NULL, `key` INTEGER, `value` TEXT)"); SQLQUERY("CREATE UNIQUE INDEX `%1user_info_id` ON `%1user_info`(`server_id`, `user_id`, `key`)"); SQLQUERY("ALTER TABLE `%1user_info` ADD CONSTRAINT `%1user_info_del_user` FOREIGN KEY (`server_id`, `user_id`) REFERENCES `%1users`(`server_id`,`user_id`) ON DELETE CASCADE"); SQLQUERY("CREATE TABLE `%1groups` (`group_id` SERIAL PRIMARY KEY, `server_id` INTEGER NOT NULL, `name` varchar(255), `channel_id` INTEGER NOT NULL, `inherit` INTEGER, `inheritable` INTEGER)"); SQLQUERY("CREATE UNIQUE INDEX `%1groups_name_channels` ON `%1groups`(`server_id`, `channel_id`, `name`)"); SQLQUERY("ALTER TABLE `%1groups` ADD CONSTRAINT `%1groups_del_channel` FOREIGN KEY (`server_id`, `channel_id`) REFERENCES `%1channels`(`server_id`, `channel_id`) ON DELETE CASCADE"); SQLQUERY("CREATE TABLE `%1group_members` (`group_id` INTEGER NOT NULL, `server_id` INTEGER NOT NULL, `user_id` INTEGER NOT NULL, `addit` INTEGER)"); SQLQUERY("CREATE INDEX `%1group_members_users` ON `%1group_members`(`server_id`, `user_id`)"); SQLQUERY("ALTER TABLE `%1group_members` ADD CONSTRAINT `%1group_members_del_group` FOREIGN KEY (`group_id`) REFERENCES `%1groups`(`group_id`) ON DELETE CASCADE"); SQLQUERY("ALTER TABLE `%1group_members` ADD CONSTRAINT `%1group_members_del_user` FOREIGN KEY (`server_id`, `user_id`) REFERENCES `%1users`(`server_id`,`user_id`) ON DELETE CASCADE"); SQLQUERY("CREATE TABLE `%1acl` (`server_id` INTEGER NOT NULL, `channel_id` INTEGER NOT NULL, `priority` INTEGER, `user_id` INTEGER, `group_name` varchar(255), `apply_here` INTEGER, `apply_sub` INTEGER, `grantpriv` INTEGER, `revokepriv` INTEGER)"); SQLQUERY("CREATE UNIQUE INDEX `%1acl_channel_pri` ON `%1acl`(`server_id`, `channel_id`, `priority`)"); SQLQUERY("CREATE INDEX `%1acl_user` ON `%1acl`(`server_id`, `user_id`)"); SQLQUERY("ALTER TABLE `%1acl` ADD CONSTRAINT `%1acl_del_channel` FOREIGN KEY (`server_id`, `channel_id`) REFERENCES `%1channels`(`server_id`, `channel_id`) ON DELETE CASCADE"); SQLQUERY("ALTER TABLE `%1acl` ADD CONSTRAINT `%1acl_del_user` FOREIGN KEY (`server_id`, `user_id`) REFERENCES `%1users`(`server_id`, `user_id`) ON DELETE CASCADE"); SQLQUERY("CREATE TABLE `%1channel_links` (`server_id` INTEGER NOT NULL, `channel_id` INTEGER NOT NULL, `link_id` INTEGER NOT NULL)"); SQLQUERY("ALTER TABLE `%1channel_links` ADD CONSTRAINT `%1channel_links_del_channel` FOREIGN KEY(`server_id`, `channel_id`) REFERENCES `%1channels`(`server_id`, `channel_id`) ON DELETE CASCADE"); SQLQUERY("DELETE FROM `%1channel_links`"); SQLQUERY("CREATE TABLE `%1bans` (`server_id` INTEGER NOT NULL, `base` BYTEA, `mask` INTEGER, `name` varchar(255), `hash` CHAR(40), `reason` TEXT, `start` TIMESTAMP, `duration` INTEGER)"); SQLQUERY("ALTER TABLE `%1bans` ADD CONSTRAINT `%1bans_del_server` FOREIGN KEY(`server_id`) REFERENCES `%1servers`(`server_id`) ON DELETE CASCADE"); } else { // MySQL if (version > 0) { typedef QPair qsp; QList qlForeignKeys; QList qlIndexes; SQLPREP("SELECT TABLE_NAME, CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA=? AND CONSTRAINT_TYPE='FOREIGN KEY'"); query.addBindValue(Meta::mp.qsDatabase); SQLEXEC(); while (query.next()) qlForeignKeys << qsp(query.value(0).toString(), query.value(1).toString()); foreach(const qsp &key, qlForeignKeys) { if (key.first.startsWith(Meta::mp.qsDBPrefix)) ServerDB::exec(query, QString::fromLatin1("ALTER TABLE `%1` DROP FOREIGN KEY `%2`").arg(key.first).arg(key.second), true); } } SQLDO("CREATE TABLE `%1servers`(`server_id` INTEGER PRIMARY KEY AUTO_INCREMENT) ENGINE=InnoDB"); SQLDO("CREATE TABLE `%1slog`(`server_id` INTEGER NOT NULL, `msg` TEXT, `msgtime` TIMESTAMP) ENGINE=InnoDB"); SQLDO("CREATE INDEX `%1slog_time` ON `%1slog`(`msgtime`)"); SQLDO("ALTER TABLE `%1slog` ADD CONSTRAINT `%1slog_server_del` FOREIGN KEY (`server_id`) REFERENCES `%1servers`(`server_id`) ON DELETE CASCADE"); SQLDO("CREATE TABLE `%1config` (`server_id` INTEGER NOT NULL, `key` varchar(255), `value` TEXT) ENGINE=InnoDB"); SQLDO("CREATE UNIQUE INDEX `%1config_key` ON `%1config`(`server_id`, `key`)"); SQLDO("ALTER TABLE `%1config` ADD CONSTRAINT `%1config_server_del` FOREIGN KEY (`server_id`) REFERENCES `%1servers`(`server_id`) ON DELETE CASCADE"); SQLDO("CREATE TABLE `%1channels` (`server_id` INTEGER NOT NULL, `channel_id` INTEGER NOT NULL, `parent_id` INTEGER, `name` varchar(255), `inheritacl` INTEGER) ENGINE=InnoDB"); SQLDO("CREATE UNIQUE INDEX `%1channel_id` ON `%1channels`(`server_id`, `channel_id`)"); SQLDO("ALTER TABLE `%1channels` ADD CONSTRAINT `%1channels_parent_del` FOREIGN KEY (`server_id`, `parent_id`) REFERENCES `%1channels`(`server_id`,`channel_id`) ON DELETE CASCADE"); SQLDO("ALTER TABLE `%1channels` ADD CONSTRAINT `%1channels_server_del` FOREIGN KEY (`server_id`) REFERENCES `%1servers`(`server_id`) ON DELETE CASCADE"); SQLDO("CREATE TABLE `%1channel_info` (`server_id` INTEGER NOT NULL, `channel_id` INTEGER NOT NULL, `key` INTEGER, `value` LONGTEXT) ENGINE=InnoDB"); SQLDO("CREATE UNIQUE INDEX `%1channel_info_id` ON `%1channel_info`(`server_id`, `channel_id`, `key`)"); SQLDO("ALTER TABLE `%1channel_info` ADD CONSTRAINT `%1channel_info_del_channel` FOREIGN KEY (`server_id`, `channel_id`) REFERENCES `%1channels`(`server_id`,`channel_id`) ON DELETE CASCADE"); SQLDO("CREATE TABLE `%1users` (`server_id` INTEGER NOT NULL, `user_id` INTEGER NOT NULL, `name` varchar(255), `pw` varchar(128), `salt` varchar(128), `kdfiterations` INTEGER, `lastchannel` INTEGER, `texture` LONGBLOB, `last_active` TIMESTAMP) ENGINE=InnoDB"); SQLDO("CREATE INDEX `%1users_channel` ON `%1users`(`server_id`, `lastchannel`)"); SQLDO("CREATE UNIQUE INDEX `%1users_name` ON `%1users` (`server_id`,`name`)"); SQLDO("CREATE UNIQUE INDEX `%1users_id` ON `%1users` (`server_id`, `user_id`)"); SQLDO("ALTER TABLE `%1users` ADD CONSTRAINT `%1users_server_del` FOREIGN KEY (`server_id`) REFERENCES `%1servers`(`server_id`) ON DELETE CASCADE"); SQLDO("CREATE TABLE `%1user_info` (`server_id` INTEGER NOT NULL, `user_id` INTEGER NOT NULL, `key` INTEGER, `value` LONGTEXT) ENGINE=InnoDB"); SQLDO("CREATE UNIQUE INDEX `%1user_info_id` ON `%1user_info`(`server_id`, `user_id`, `key`)"); SQLDO("ALTER TABLE `%1user_info` ADD CONSTRAINT `%1user_info_del_user` FOREIGN KEY (`server_id`, `user_id`) REFERENCES `%1users`(`server_id`,`user_id`) ON DELETE CASCADE"); SQLDO("CREATE TABLE `%1groups` (`group_id` INTEGER PRIMARY KEY AUTO_INCREMENT, `server_id` INTEGER NOT NULL, `name` varchar(255), `channel_id` INTEGER NOT NULL, `inherit` INTEGER, `inheritable` INTEGER) ENGINE=InnoDB"); SQLDO("CREATE UNIQUE INDEX `%1groups_name_channels` ON `%1groups`(`server_id`, `channel_id`, `name`)"); SQLDO("ALTER TABLE `%1groups` ADD CONSTRAINT `%1groups_del_channel` FOREIGN KEY (`server_id`, `channel_id`) REFERENCES `%1channels`(`server_id`, `channel_id`) ON DELETE CASCADE"); SQLDO("CREATE TABLE `%1group_members` (`group_id` INTEGER NOT NULL, `server_id` INTEGER NOT NULL, `user_id` INTEGER NOT NULL, `addit` INTEGER) ENGINE=InnoDB"); SQLDO("CREATE INDEX `%1group_members_users` ON `%1group_members`(`server_id`, `user_id`)"); SQLDO("ALTER TABLE `%1group_members` ADD CONSTRAINT `%1group_members_del_group` FOREIGN KEY (`group_id`) REFERENCES `%1groups`(`group_id`) ON DELETE CASCADE"); SQLDO("ALTER TABLE `%1group_members` ADD CONSTRAINT `%1group_members_del_user` FOREIGN KEY (`server_id`, `user_id`) REFERENCES `%1users`(`server_id`,`user_id`) ON DELETE CASCADE"); SQLDO("CREATE TABLE `%1acl` (`server_id` INTEGER NOT NULL, `channel_id` INTEGER NOT NULL, `priority` INTEGER, `user_id` INTEGER, `group_name` varchar(255), `apply_here` INTEGER, `apply_sub` INTEGER, `grantpriv` INTEGER, `revokepriv` INTEGER) ENGINE=InnoDB"); SQLDO("CREATE UNIQUE INDEX `%1acl_channel_pri` ON `%1acl`(`server_id`, `channel_id`, `priority`)"); SQLDO("CREATE INDEX `%1acl_user` ON `%1acl`(`server_id`, `user_id`)"); SQLDO("ALTER TABLE `%1acl` ADD CONSTRAINT `%1acl_del_channel` FOREIGN KEY (`server_id`, `channel_id`) REFERENCES `%1channels`(`server_id`, `channel_id`) ON DELETE CASCADE"); SQLDO("ALTER TABLE `%1acl` ADD CONSTRAINT `%1acl_del_user` FOREIGN KEY (`server_id`, `user_id`) REFERENCES `%1users`(`server_id`, `user_id`) ON DELETE CASCADE"); SQLDO("CREATE TABLE `%1channel_links` (`server_id` INTEGER NOT NULL, `channel_id` INTEGER NOT NULL, `link_id` INTEGER NOT NULL) ENGINE=InnoDB"); SQLDO("ALTER TABLE `%1channel_links` ADD CONSTRAINT `%1channel_links_del_channel` FOREIGN KEY(`server_id`, `channel_id`) REFERENCES `%1channels`(`server_id`, `channel_id`) ON DELETE CASCADE"); SQLDO("DELETE FROM `%1channel_links`"); SQLDO("CREATE TABLE `%1bans` (`server_id` INTEGER NOT NULL, `base` BINARY(16), `mask` INTEGER, `name` varchar(255), `hash` CHAR(40), `reason` TEXT, `start` DATETIME, `duration` INTEGER) ENGINE=InnoDB"); SQLDO("ALTER TABLE `%1bans` ADD CONSTRAINT `%1bans_del_server` FOREIGN KEY(`server_id`) REFERENCES `%1servers`(`server_id`) ON DELETE CASCADE"); } if (version == 0) { // The database was empty until we started populating it so the first (and so far only) // entries in it will be the server ID (we know it must be 1 as there has been no previous // server) as well as the version info about the database structure version. SQLDO("INSERT INTO `%1servers` (`server_id`) VALUES(1)"); // Calling this function is the same as using the SQLDO macro SQLDO_NO_CONVERSION(QLatin1String("INSERT INTO `%1meta` (`keystring`, `value`) ") + QString::fromLatin1("VALUES('version','%1')").arg(QString::number(DB_STRUCTURE_VERSION))); } else { qWarning("Importing old data..."); if (Meta::mp.qsDBDriver == "QMYSQL") SQLDO("SET FOREIGN_KEY_CHECKS = 0;"); SQLDO("INSERT INTO `%1servers` (`server_id`) SELECT `server_id` FROM `%1servers%2`"); SQLDO("INSERT INTO `%1slog` (`server_id`, `msg`, `msgtime`) SELECT `server_id`, `msg`, `msgtime` FROM `%1slog%2`"); if (version < 4) SQLDO("INSERT INTO `%1config` (`server_id`, `key`, `value`) SELECT `server_id`, `keystring`, `value` FROM `%1config%2`"); else SQLDO("INSERT INTO `%1config` (`server_id`, `key`, `value`) SELECT `server_id`, `key`, `value` FROM `%1config%2`"); SQLDO("INSERT INTO `%1channels` (`server_id`, `channel_id`, `parent_id`, `name`, `inheritacl`) SELECT `server_id`, `channel_id`, `parent_id`, `name`, `inheritacl` FROM `%1channels%2` ORDER BY `parent_id`, `channel_id`"); if (version < 4) SQLDO("INSERT INTO `%1users` (`server_id`, `user_id`, `name`, `pw`, `lastchannel`, `texture`, `last_active`) SELECT `server_id`, `player_id`, `name`, `pw`, `lastchannel`, `texture`, `last_active` FROM `%1players%2`"); else SQLDO("INSERT INTO `%1users` (`server_id`, `user_id`, `name`, `pw`, `lastchannel`, `texture`, `last_active`) SELECT `server_id`, `user_id`, `name`, `pw`, `lastchannel`, `texture`, `last_active` FROM `%1users%2`"); SQLDO("INSERT INTO `%1groups` (`group_id`, `server_id`, `name`, `channel_id`, `inherit`, `inheritable`) SELECT `group_id`, `server_id`, `name`, `channel_id`, `inherit`, `inheritable` FROM `%1groups%2`"); if (version < 4) SQLDO("INSERT INTO `%1group_members` (`group_id`, `server_id`, `user_id`, `addit`) SELECT `group_id`, `server_id`, `player_id`, `addit` FROM `%1group_members%2`"); else SQLDO("INSERT INTO `%1group_members` (`group_id`, `server_id`, `user_id`, `addit`) SELECT `group_id`, `server_id`, `user_id`, `addit` FROM `%1group_members%2`"); if (version < 4) SQLDO("INSERT INTO `%1acl` (`server_id`, `channel_id`, `priority`, `user_id`, `group_name`, `apply_here`, `apply_sub`, `grantpriv`, `revokepriv`) SELECT `server_id`, `channel_id`, `priority`, `player_id`, `group_name`, `apply_here`, `apply_sub`, `grantpriv`, `revokepriv` FROM `%1acl%2`"); else SQLDO("INSERT INTO `%1acl` (`server_id`, `channel_id`, `priority`, `user_id`, `group_name`, `apply_here`, `apply_sub`, `grantpriv`, `revokepriv`) SELECT `server_id`, `channel_id`, `priority`, `user_id`, `group_name`, `apply_here`, `apply_sub`, `grantpriv`, `revokepriv` FROM `%1acl%2`"); SQLDO("INSERT INTO `%1channel_links` (`server_id`, `channel_id`, `link_id`) SELECT `server_id`, `channel_id`, `link_id` FROM `%1channel_links%2`"); if (version < 4) { QList > ql; SQLPREP("SELECT `server_id`, `base`, `mask` FROM `%1bans%2`"); SQLEXEC(); while (query.next()) { QList l; l << query.value(0); l << query.value(1); l << query.value(2); ql << l; } SQLPREP("INSERT INTO `%1bans` (`server_id`, `base`, `mask`) VALUES (?, ?, ?)"); foreach(const QList &l, ql) { quint32 addr = htonl(l.at(1).toUInt()); const char *ptr = reinterpret_cast(&addr); QByteArray qba(16, 0); qba[10] = static_cast(-1); qba[11] = static_cast(-1); qba[12] = ptr[0]; qba[13] = ptr[1]; qba[14] = ptr[2]; qba[15] = ptr[3]; query.addBindValue(l.at(0)); query.addBindValue(qba); query.addBindValue(l.at(2).toInt() + 96); SQLEXEC(); } } else { SQLDO("INSERT INTO `%1bans` (`server_id`, `base`, `mask`) SELECT `server_id`, `base`, `mask` FROM `%1bans%2`"); } if (version < 4) SQLDO("INSERT INTO `%1user_info` SELECT `server_id`,`player_id`,1,`email` FROM `%1players%2` WHERE `email` IS NOT NULL"); if (version == 3) { SQLDO("INSERT INTO `%1channel_info` SELECT `server_id`,`channel_id`,0,`description` FROM `%1channels%2` WHERE `description` IS NOT NULL"); } if (version >= 4) { SQLDO("INSERT INTO `%1user_info` SELECT * FROM `%1user_info%2`"); SQLDO("INSERT INTO `%1channel_info` SELECT * FROM `%1channel_info%2`"); } if (Meta::mp.qsDBDriver == "QMYSQL") SQLDO("SET FOREIGN_KEY_CHECKS = 1;"); qWarning("Removing old tables..."); SQLQUERY("DROP TABLE IF EXISTS `%1slog%2`"); SQLQUERY("DROP TABLE IF EXISTS `%1config%2`"); SQLQUERY("DROP TABLE IF EXISTS `%1channel_info%2`"); SQLQUERY("DROP TABLE IF EXISTS `%1user_info%2`"); SQLQUERY("DROP TABLE IF EXISTS `%1players%2`"); SQLQUERY("DROP TABLE IF EXISTS `%1group_members%2`"); SQLQUERY("DROP TABLE IF EXISTS `%1groups%2`"); SQLQUERY("DROP TABLE IF EXISTS `%1acl%2`"); SQLQUERY("DROP TABLE IF EXISTS `%1users%2`"); SQLQUERY("DROP TABLE IF EXISTS `%1channel_links%2`"); SQLQUERY("DROP TABLE IF EXISTS `%1channels%2`"); SQLQUERY("DROP TABLE IF EXISTS `%1bans%2`"); SQLQUERY("DROP TABLE IF EXISTS `%1servers%2`"); SQLDO_NO_CONVERSION(QLatin1String("UPDATE `%1meta` SET `value` = ") + QString::fromLatin1("'%1' WHERE `keystring` = 'version'").arg(DB_STRUCTURE_VERSION)); } } query.clear(); } ServerDB::~ServerDB() { db->close(); delete db; db = NULL; } bool ServerDB::prepare(QSqlQuery &query, const QString &str, bool fatal, bool warn) { if (! db->isValid()) { qWarning("SQL [%s] rejected: Database is gone", qPrintable(str)); return false; } QString q; if (str.contains(QLatin1String("%1"))) { if (str.contains(QLatin1String("%2"))) q = str.arg(Meta::mp.qsDBPrefix, qsUpgradeSuffix); else q = str.arg(Meta::mp.qsDBPrefix); } else { q = str; } if (Meta::mp.qsDBDriver == "QPSQL") { q.replace("`", "\""); } if (query.prepare(q)) { return true; } else { db->close(); if (! db->open()) { qFatal("Lost connection to SQL Database: Reconnect: %s", qPrintable(db->lastError().text())); } query = QSqlQuery(); if (query.prepare(q)) { qWarning("SQL Connection lost, reconnection OK"); return true; } if (fatal) { *db = QSqlDatabase(); qFatal("SQL Prepare Error [%s]: %s", qPrintable(q), qPrintable(query.lastError().text())); } else if (warn) { qDebug("SQL Prepare Error [%s]: %s", qPrintable(q), qPrintable(query.lastError().text())); } return false; } } bool ServerDB::query(QSqlQuery &query, const QString &str, bool fatal, bool warn) { if (! str.isEmpty()) { if (! db->isValid()) { qWarning("SQL [%s] rejected: Database is gone", qPrintable(str)); return false; } QString q; if (str.contains(QLatin1String("%1"))) { if (str.contains(QLatin1String("%2"))) q = str.arg(Meta::mp.qsDBPrefix, qsUpgradeSuffix); else q = str.arg(Meta::mp.qsDBPrefix); } else { q = str; } if (Meta::mp.qsDBDriver == "QPSQL") { q.replace("`", "\""); } if (query.exec(q)) { return true; } else { if (fatal) { *db = QSqlDatabase(); qFatal("SQL Error [%s]: %s", qPrintable(query.lastQuery()), qPrintable(query.lastError().text())); } else if (warn) { qDebug("SQL Error [%s]: %s", qPrintable(query.lastQuery()), qPrintable(query.lastError().text())); } return false; } } else { return false; } } bool ServerDB::exec(QSqlQuery &query, const QString &str, bool fatal, bool warn) { if (! str.isEmpty()) prepare(query, str, fatal, warn); if (query.exec()) { return true; } else { if (fatal) { *db = QSqlDatabase(); qFatal("SQL Error [%s]: %s", qPrintable(query.lastQuery()), qPrintable(query.lastError().text())); } else if (warn) { qDebug("SQL Error [%s]: %s", qPrintable(query.lastQuery()), qPrintable(query.lastError().text())); } return false; } } bool ServerDB::execBatch(QSqlQuery &query, const QString &str, bool fatal) { if (! str.isEmpty()) prepare(query, str, fatal); if (query.execBatch()) { return true; } else { if (fatal) { *db = QSqlDatabase(); qFatal("SQL Error [%s]: %s", qPrintable(query.lastQuery()), qPrintable(query.lastError().text())); } else qDebug("SQL Error [%s]: %s", qPrintable(query.lastQuery()), qPrintable(query.lastError().text())); return false; } } void Server::initialize() { TransactionHolder th; QSqlQuery &query = *th.qsqQuery; SQLPREP("SELECT `channel_id` FROM `%1channels` WHERE `server_id` = ? AND `channel_id` = 0"); query.addBindValue(iServerNum); SQLEXEC(); if (! query.next()) { SQLPREP("INSERT INTO `%1channels` (`server_id`, `channel_id`, `parent_id`, `name`) VALUES (?, ?, ?, ?)"); query.addBindValue(iServerNum); query.addBindValue(0); query.addBindValue(QVariant()); query.addBindValue(QLatin1String("Root")); SQLEXEC(); SQLPREP("UPDATE `%1channels` SET `channel_id` = 0 WHERE `server_id` = ? AND `name` = ? AND `parent_id` IS NULL"); query.addBindValue(iServerNum); query.addBindValue(QLatin1String("Root")); SQLEXEC(); } SQLPREP("SELECT `user_id` FROM `%1users` WHERE `server_id` = ? AND `user_id` = 0"); query.addBindValue(iServerNum); SQLEXEC(); if (! query.next()) { SQLPREP("INSERT INTO `%1users` (`server_id`, `user_id`, `name`) VALUES (?, ?, ?)"); query.addBindValue(iServerNum); query.addBindValue(0); query.addBindValue(QLatin1String("SuperUser")); SQLEXEC(); SQLPREP("UPDATE `%1users` SET `user_id` = 0 WHERE `server_id` = ? AND `name` = ?"); query.addBindValue(iServerNum); query.addBindValue(QLatin1String("SuperUser")); SQLEXEC(); const int passwordLength = 12; QString pw = PasswordGenerator::generatePassword(passwordLength); ServerDB::setSUPW(iServerNum, pw); log(QString("Password for 'SuperUser' set to '%2'").arg(pw)); } SQLPREP("SELECT COUNT(*) FROM `%1acl` WHERE `server_id`=?"); query.addBindValue(iServerNum); SQLEXEC(); if (query.next()) { int c = query.value(0).toInt(); if (c == 0) { SQLPREP("INSERT INTO `%1acl` (`server_id`, `channel_id`, `priority`, `group_name`, `apply_here`, `apply_sub`, `grantpriv`) VALUES (?,?,?,?,?,?,?)"); query.addBindValue(iServerNum); query.addBindValue(0); query.addBindValue(1); query.addBindValue(QLatin1String("admin")); query.addBindValue(1); query.addBindValue(1); query.addBindValue(static_cast(ChanACL::Write)); SQLEXEC(); query.addBindValue(iServerNum); query.addBindValue(0); query.addBindValue(2); query.addBindValue(QLatin1String("auth")); query.addBindValue(1); query.addBindValue(1); query.addBindValue(static_cast(ChanACL::MakeTempChannel)); SQLEXEC(); query.addBindValue(iServerNum); query.addBindValue(0); query.addBindValue(3); query.addBindValue(QLatin1String("all")); query.addBindValue(1); query.addBindValue(0); query.addBindValue(static_cast(ChanACL::SelfRegister)); SQLEXEC(); } } SQLPREP("SELECT COUNT(*) FROM `%1groups` WHERE `server_id`=? AND `channel_id`=?"); query.addBindValue(iServerNum); query.addBindValue(0); SQLEXEC(); if (query.next()) { int c = query.value(0).toInt(); if (c == 0) { SQLPREP("INSERT INTO `%1groups`(`server_id`, `channel_id`, `name`, `inherit`, `inheritable`) VALUES (?,?,?,?,?)"); query.addBindValue(iServerNum); query.addBindValue(0); query.addBindValue(QLatin1String("admin")); query.addBindValue(1); query.addBindValue(1); SQLEXEC(); } } query.clear(); } int Server::registerUser(const QMap &info) { const QString &name = info.value(ServerDB::User_Name); if (name.isEmpty()) return -1; if (! validateUserName(name)) return -1; if (getUserID(name) >= 0) return -1; qhUserIDCache.remove(name); int res = -2; emit registerUserSig(res, info); if (res != -2) { qhUserIDCache.remove(name); } if (res == -1) return res; int id = 0; { TransactionHolder th; QSqlQuery &query = *th.qsqQuery; if (res < 0) { SQLPREP("SELECT MAX(`user_id`)+1 AS id FROM `%1users` WHERE `server_id`=? AND `user_id` < 1000000000"); query.addBindValue(iServerNum); SQLEXEC(); if (query.next()) id = query.value(0).toInt(); } else { id = res; } if (Meta::mp.qsDBDriver == "QPSQL") { SQLPREP("INSERT INTO `%1users` (`server_id`, `user_id`, `name`) VALUES (:server_id,:user_id,:name) ON CONFLICT (`server_id`, `name`) DO UPDATE SET `user_id` = :u_user_id WHERE `%1users`.`server_id` = :u_server_id AND `%1users`.`name` = :u_name"); query.bindValue(":server_id", iServerNum); query.bindValue(":user_id", id); query.bindValue(":name", name); query.bindValue(":u_server_id", iServerNum); query.bindValue(":u_user_id", id); query.bindValue(":u_name", name); SQLEXEC(); } else { SQLPREP("REPLACE INTO `%1users` (`server_id`, `user_id`, `name`) VALUES (?,?,?)"); query.addBindValue(iServerNum); query.addBindValue(id); query.addBindValue(name); SQLEXEC(); } } qhUserNameCache.remove(id); setInfo(id, info); return id; } bool Server::unregisterUserDB(int id) { if (id <= 0) return false; QMap info = getRegistration(id); if (info.isEmpty()) return false; qhUserIDCache.remove(info.value(ServerDB::User_Name)); qhUserNameCache.remove(id); int res = -2; emit unregisterUserSig(res, id); if (res == 0) { return false; } TransactionHolder th; QSqlQuery &query = *th.qsqQuery; SQLPREP("DELETE FROM `%1users` WHERE `server_id` = ? AND `user_id` = ?"); query.addBindValue(iServerNum); query.addBindValue(id); SQLEXEC(); SQLPREP("DELETE FROM `%1user_info` WHERE `server_id` = ? AND `user_id` = ?"); query.addBindValue(iServerNum); query.addBindValue(id); SQLEXEC(); return true; } QList Server::getRegisteredUsersEx() { QMap rpcUsers; emit getRegisteredUsersSig(QString(), rpcUsers); QList users; QMap::iterator it = rpcUsers.begin(); for (; it != rpcUsers.end(); ++it) { users.insert(it.key(), UserInfo(it.key(), it.value())); } TransactionHolder th; QSqlQuery &query = *th.qsqQuery; SQLPREP("SELECT `user_id`, `name`, `lastchannel`, `last_active` FROM `%1users` WHERE `server_id` = ?"); query.addBindValue(iServerNum); SQLEXEC(); while (query.next()) { UserInfo userinfo; userinfo.user_id = query.value(0).toInt(); userinfo.name = query.value(1).toString(); userinfo.last_channel = query.value(2).toInt(); userinfo.last_active = QDateTime::fromString(query.value(3).toString(), Qt::ISODate); userinfo.last_active.setTimeSpec(Qt::UTC); users << userinfo; } return users; } QMap Server::getRegisteredUsers(const QString &filter) { QMap m; emit getRegisteredUsersSig(filter, m); TransactionHolder th; QSqlQuery &query = *th.qsqQuery; if (filter.isEmpty()) { SQLPREP("SELECT `user_id`, `name` FROM `%1users` WHERE `server_id` = ?"); query.addBindValue(iServerNum); } else { SQLPREP("SELECT `user_id`, `name` FROM `%1users` WHERE `server_id` = ? AND `name` LIKE ?"); query.addBindValue(iServerNum); query.addBindValue(filter); } SQLEXEC(); while (query.next()) { int id = query.value(0).toInt(); QString name = query.value(1).toString(); m.insert(id, name); } return m; } bool Server::isUserId(int id) { QMap info; int res = -2; emit getRegistrationSig(res, id, info); if (res >= 0) return (res > 0); TransactionHolder th; QSqlQuery &query = *th.qsqQuery; SQLPREP("SELECT `user_id` FROM `%1users` WHERE `server_id` = ? AND `user_id` = ?"); query.addBindValue(iServerNum); query.addBindValue(id); SQLEXEC(); if (query.next()) { return true; } return false; } QMap Server::getRegistration(int id) { QMap info; int res = -2; emit getRegistrationSig(res, id, info); if (res >= 0) return info; TransactionHolder th; QSqlQuery &query = *th.qsqQuery; SQLPREP("SELECT `name`, `last_active` FROM `%1users` WHERE `server_id` = ? AND `user_id` = ?"); query.addBindValue(iServerNum); query.addBindValue(id); SQLEXEC(); if (query.next()) { info.insert(ServerDB::User_Name, query.value(0).toString()); info.insert(ServerDB::User_LastActive, query.value(1).toString()); SQLPREP("SELECT `key`, `value` FROM `%1user_info` WHERE `server_id` = ? AND `user_id` = ?"); query.addBindValue(iServerNum); query.addBindValue(id); SQLEXEC(); while (query.next()) { const int key = query.value(0).toInt(); if (!info.contains(key)) info.insert(key, query.value(1).toString()); } } return info; } /// @return UserID of authenticated user, -1 for authentication failures, -2 for unknown user (fallthrough), /// -3 for authentication failures where the data could (temporarily) not be verified. int Server::authenticate(QString &name, const QString &password, int sessionId, const QStringList &emails, const QString &certhash, bool bStrongCert, const QList &certs) { int res = bForceExternalAuth ? -3 : -2; emit authenticateSig(res, name, sessionId, certs, certhash, bStrongCert, password); if (res != -2) { // External authentication handled it. Ignore certificate completely. if (res != -1) { TransactionHolder th; QSqlQuery &query = *th.qsqQuery; int lchan=readLastChannel(res); if (lchan < 0) lchan = 0; if (Meta::mp.qsDBDriver == "QPSQL") { SQLPREP("INSERT INTO `%1users` (`server_id`, `user_id`, `name`, `lastchannel`) VALUES (:server_id,:user_id,:name,:lastchannel) ON CONFLICT (`server_id`, `user_id`) DO UPDATE SET `name` = :u_name, `lastchannel` = :u_lastchannel WHERE `%1users`.`server_id` = :u_server_id AND `%1users`.`user_id` = :u_user_id"); query.bindValue(":server_id", iServerNum); query.bindValue(":user_id", res); query.bindValue(":name", name); query.bindValue(":lastchannel", lchan); query.bindValue(":u_server_id", iServerNum); query.bindValue(":u_user_id", res); query.bindValue(":u_name", name); query.bindValue(":u_lastchannel", lchan); SQLEXEC(); } else { SQLPREP("REPLACE INTO `%1users` (`server_id`, `user_id`, `name`, `lastchannel`) VALUES (?,?,?,?)"); query.addBindValue(iServerNum); query.addBindValue(res); query.addBindValue(name); query.addBindValue(lchan); SQLEXEC(); } } if (res >= 0) { qhUserNameCache.remove(res); qhUserIDCache.remove(name); } return res; } TransactionHolder th; QSqlQuery &query = *th.qsqQuery; SQLPREP("SELECT `user_id`,`name`,`pw`, `salt`, `kdfiterations` FROM `%1users` WHERE `server_id` = ? AND LOWER(`name`) = LOWER(?)"); query.addBindValue(iServerNum); query.addBindValue(name); SQLEXEC(); if (query.next()) { const int userId = query.value(0).toInt(); const QString storedPasswordHash = query.value(2).toString(); const QString storedSalt = query.value(3).toString(); const int storedKdfIterations = query.value(4).toInt(); res = -1; if (!storedPasswordHash.isEmpty()) { // A user has password authentication enabled if there is a password hash. if (storedKdfIterations <= 0) { // If storedKdfIterations is <=0 this means this is an old-style SHA1 hash // that hasn't been converted yet. Or we are operating in legacy mode. if (ServerDB::getLegacySHA1Hash(password) == storedPasswordHash) { name = query.value(1).toString(); res = query.value(0).toInt(); if (! Meta::mp.legacyPasswordHash) { // Unless disabled upgrade the user password hash QMap info; info.insert(ServerDB::User_Password, password); info.insert(ServerDB::User_KDFIterations, QString::number(Meta::mp.kdfIterations)); if (!setInfo(userId, info)) { qWarning("ServerDB: Failed to upgrade user account to PBKDF2 hash, rejecting login."); return -1; } } } } else { if (PBKDF2::getHash(storedSalt, password, storedKdfIterations) == storedPasswordHash) { name = query.value(1).toString(); res = query.value(0).toInt(); if (Meta::mp.legacyPasswordHash) { // Downgrade the password to the legacy hash QMap info; info.insert(ServerDB::User_Password, password); if (!setInfo(userId, info)) { qWarning("ServerDB: Failed to downgrade user account to legacy hash, rejecting login."); return -1; } } else if (storedKdfIterations != Meta::mp.kdfIterations) { // User kdfiterations not equal to the global one. Update it. QMap info; info.insert(ServerDB::User_Password, password); info.insert(ServerDB::User_KDFIterations, QString::number(Meta::mp.kdfIterations)); if (!setInfo(userId, info)) { qWarning() << "ServerDB: Failed to update user PBKDF2 to new iteration count" << Meta::mp.kdfIterations << ", rejecting login."; return -1; } } } } } if (userId == 0 && res < 0) { // For SuperUser only password based authentication is allowed. // If we couldn't verify the password don't proceed to cert auth // and instead reject the login attempt. return -1; } } // No password match. Try cert or email match, but only for non-SuperUser. if (!certhash.isEmpty() && (res < 0)) { SQLPREP("SELECT `user_id` FROM `%1user_info` WHERE `server_id` = ? AND `key` = ? AND `value` = ?"); query.addBindValue(iServerNum); query.addBindValue(ServerDB::User_Hash); query.addBindValue(certhash); SQLEXEC(); if (query.next()) { res = query.value(0).toInt(); } else if (bStrongCert) { foreach(const QString &email, emails) { if (! email.isEmpty()) { query.addBindValue(iServerNum); query.addBindValue(ServerDB::User_Email); query.addBindValue(email); SQLEXEC(); if (query.next()) { res = query.value(0).toInt(); break; } } } } if (res > 0) { SQLPREP("SELECT `name` FROM `%1users` WHERE `server_id` = ? AND `user_id` = ?"); query.addBindValue(iServerNum); query.addBindValue(res); SQLEXEC(); if (! query.next()) { res = -1; } else { name = query.value(0).toString(); } } } if (! certhash.isEmpty() && (res > 0)) { if (Meta::mp.qsDBDriver == "QPSQL") { SQLPREP("INSERT INTO `%1user_info` (`server_id`, `user_id`, `key`, `value`) VALUES (:server_id, :user_id, :key, :value) ON CONFLICT (`server_id`, `user_id`, `key`) DO UPDATE SET `value` = :u_value WHERE `%1user_info`.`server_id` = :u_server_id AND `%1user_info`.`user_id` = :u_user_id AND `%1user_info`.`key` = :u_key"); query.bindValue(":server_id", iServerNum); query.bindValue(":user_id", res); query.bindValue(":key", ServerDB::User_Hash); query.bindValue(":value", certhash); query.bindValue(":u_server_id", iServerNum); query.bindValue(":u_user_id", res); query.bindValue(":u_key", ServerDB::User_Hash); query.bindValue(":u_value", certhash); SQLEXEC(); } else { SQLPREP("REPLACE INTO `%1user_info` (`server_id`, `user_id`, `key`, `value`) VALUES (?, ?, ?, ?)"); query.addBindValue(iServerNum); query.addBindValue(res); query.addBindValue(ServerDB::User_Hash); query.addBindValue(certhash); SQLEXEC(); } if (! emails.isEmpty()) { if (Meta::mp.qsDBDriver == "QPSQL") { query.bindValue(":server_id", iServerNum); query.bindValue(":user_id", res); query.bindValue(":key", ServerDB::User_Email); query.bindValue(":value", emails.at(0)); query.bindValue(":u_server_id", iServerNum); query.bindValue(":u_user_id", res); query.bindValue(":u_key", ServerDB::User_Email); query.bindValue(":u_value", emails.at(0)); SQLEXEC(); } else { query.addBindValue(iServerNum); query.addBindValue(res); query.addBindValue(ServerDB::User_Email); query.addBindValue(emails.at(0)); SQLEXEC(); } } } if (res >= 0) { qhUserNameCache.remove(res); qhUserIDCache.remove(name); } return res; } bool Server::setInfo(int id, const QMap &setinfo) { int res = -2; QMap info = setinfo; if (info.contains(ServerDB::User_Name)) { const QString &uname = info.value(ServerDB::User_Name); if (uname.isEmpty()) return false; int idmatch = getUserID(uname); if ((idmatch >= 0) && (idmatch != id)) return false; qhUserIDCache.remove(qhUserNameCache.value(id)); qhUserNameCache.remove(id); qhUserIDCache.remove(info.value(ServerDB::User_Name)); } emit setInfoSig(res, id, info); if (res >= 0) return (res > 0); TransactionHolder th; QSqlQuery &query = *th.qsqQuery; if (info.contains(ServerDB::User_LastActive)) { info.remove(ServerDB::User_LastActive); } if (info.contains(ServerDB::User_Password)) { const QString password = info.value(ServerDB::User_Password); QString passwordHash, salt; int kdfIterations = -1; if (Meta::mp.legacyPasswordHash) { passwordHash = ServerDB::getLegacySHA1Hash(password); } else { kdfIterations = Meta::mp.kdfIterations; if (info.contains(ServerDB::User_KDFIterations)) { const int targetIterations = info.value(ServerDB::User_KDFIterations).toInt(); if (targetIterations > 0) { kdfIterations = targetIterations; } } salt = PBKDF2::getSalt(); passwordHash = PBKDF2::getHash(salt, password, kdfIterations); } SQLPREP("UPDATE `%1users` SET `pw`=?, `salt`=?, `kdfiterations`=? WHERE `server_id` = ? AND `user_id`=?"); query.addBindValue(passwordHash); query.addBindValue(salt); query.addBindValue(kdfIterations); query.addBindValue(iServerNum); query.addBindValue(id); SQLEXEC(); info.remove(ServerDB::User_Password); } if (info.contains(ServerDB::User_Name)) { const QString &name = info.value(ServerDB::User_Name); SQLPREP("UPDATE `%1users` SET `name`=? WHERE `server_id` = ? AND `user_id`=?"); query.addBindValue(name); query.addBindValue(iServerNum); query.addBindValue(id); SQLEXEC(); info.remove(ServerDB::User_Name); } if (! info.isEmpty()) { QMap::const_iterator i; QVariantList serverids, userids, keys, values; for (i = info.constBegin(); i != info.constEnd(); ++i) { serverids << iServerNum; userids << id; keys << i.key(); values << i.value(); } if (Meta::mp.qsDBDriver == "QPSQL") { SQLPREP("INSERT INTO `%1user_info` (`server_id`, `user_id`, `key`, `value`) VALUES (:server_id, :user_id, :key, :value) ON CONFLICT (`server_id`, `user_id`, `key`) DO UPDATE SET `value` = :u_value WHERE `%1user_info`.`server_id` = :u_server_id AND `%1user_info`.`user_id` = :u_user_id AND `%1user_info`.`key` = :u_key"); query.bindValue(":server_id", serverids); query.bindValue(":user_id", userids); query.bindValue(":key", keys); query.bindValue(":value", values); query.bindValue(":u_server_id", serverids); query.bindValue(":u_user_id", userids); query.bindValue(":u_key", keys); query.bindValue(":u_value", values); SQLEXECBATCH(); } else { SQLPREP("REPLACE INTO `%1user_info` (`server_id`, `user_id`, `key`, `value`) VALUES (?,?,?,?)"); query.addBindValue(serverids); query.addBindValue(userids); query.addBindValue(keys); query.addBindValue(values); SQLEXECBATCH(); } } return true; } bool Server::setTexture(int id, const QByteArray &texture) { if (id <= 0) return false; QByteArray tex; if (texture.size() == 600 * 60 * 4) tex = qCompress(texture); else tex = texture; foreach(ServerUser *u, qhUsers) { if (u->iId == id) hashAssign(u->qbaTexture, u->qbaTextureHash, tex); } int res = -2; emit setTextureSig(res, id, tex); if (res >= 0) return (res > 0); TransactionHolder th; QSqlQuery &query = *th.qsqQuery; SQLPREP("UPDATE `%1users` SET `texture`=? WHERE `server_id` = ? AND `user_id`=?"); query.addBindValue(tex, QSql::Binary | QSql::In); query.addBindValue(iServerNum); query.addBindValue(id); SQLEXEC(); return true; } void ServerDB::writeSUPW(int srvnum, const QString &pwHash, const QString &saltHash, const QVariant &kdfIterations) { TransactionHolder th; QSqlQuery &query = *th.qsqQuery; SQLPREP("SELECT `user_id` FROM `%1users` WHERE `server_id` = ? AND `user_id` = ?"); query.addBindValue(srvnum); query.addBindValue(0); SQLEXEC(); if (! query.next()) { SQLPREP("INSERT INTO `%1users` (`server_id`, `user_id`, `name`) VALUES (?, ?, ?)"); query.addBindValue(srvnum); query.addBindValue(0); query.addBindValue(QLatin1String("SuperUser")); SQLEXEC(); } SQLPREP("UPDATE `%1users` SET `pw`=?, `salt`=?, `kdfiterations`=? WHERE `server_id` = ? AND `user_id`=?"); query.addBindValue(pwHash); query.addBindValue(saltHash); query.addBindValue(kdfIterations); query.addBindValue(srvnum); query.addBindValue(0); SQLEXEC(); } void ServerDB::setSUPW(int srvnum, const QString &pw) { QString pwHash, saltHash; if (!Meta::mp.legacyPasswordHash) { saltHash = PBKDF2::getSalt(); pwHash = PBKDF2::getHash(saltHash, pw, Meta::mp.kdfIterations); } else { pwHash = getLegacySHA1Hash(pw); } writeSUPW(srvnum, pwHash, saltHash, Meta::mp.kdfIterations); } void ServerDB::disableSU(int srvnum) { writeSUPW(srvnum, QString(), QString(), QVariant()); // NULL, NULL, NULL } QString ServerDB::getLegacySHA1Hash(const QString &password) { QByteArray hash = QCryptographicHash::hash(password.toUtf8(), QCryptographicHash::Sha1); return QString::fromLatin1(hash.toHex()); } QString Server::getUserName(int id) { if (qhUserNameCache.contains(id)) return qhUserNameCache.value(id); QString name; emit idToNameSig(name, id); if (! name.isEmpty()) { qhUserIDCache.insert(name, id); qhUserNameCache.insert(id, name); return name; } TransactionHolder th; QSqlQuery &query = *th.qsqQuery; SQLPREP("SELECT `name` FROM `%1users` WHERE `server_id` = ? AND `user_id` = ?"); query.addBindValue(iServerNum); query.addBindValue(id); SQLEXEC(); if (query.next()) { name = query.value(0).toString(); qhUserIDCache.insert(name, id); qhUserNameCache.insert(id, name); } return name; } int Server::getUserID(const QString &name) { if (qhUserIDCache.contains(name)) return qhUserIDCache.value(name); int id = -2; emit nameToIdSig(id, name); if (id != -2) { qhUserIDCache.insert(name, id); qhUserNameCache.insert(id, name); return id; } if (!validateUserName(name)) { return id; } TransactionHolder th; QSqlQuery &query = *th.qsqQuery; SQLPREP("SELECT `user_id` FROM `%1users` WHERE `server_id` = ? AND LOWER(`name`) = LOWER(?)"); query.addBindValue(iServerNum); query.addBindValue(name); SQLEXEC(); if (query.next()) { id = query.value(0).toInt(); qhUserIDCache.insert(name, id); qhUserNameCache.insert(id, name); } return id; } QByteArray Server::getUserTexture(int id) { QByteArray qba; emit idToTextureSig(qba, id); if (! qba.isNull()) { return qba; } TransactionHolder th; QSqlQuery &query = *th.qsqQuery; SQLPREP("SELECT `texture` FROM `%1users` WHERE `server_id` = ? AND `user_id` = ?"); query.addBindValue(iServerNum); query.addBindValue(id); SQLEXEC(); if (query.next()) { qba = query.value(0).toByteArray(); if (! qba.isEmpty()) if (qba.size() == 600 * 60 * 4) qba = qCompress(qba); } return qba; } void Server::addLink(Channel *c, Channel *l) { { QWriteLocker wl(&qrwlVoiceThread); c->link(l); } if (c->bTemporary || l->bTemporary) return; TransactionHolder th; QSqlQuery &query = *th.qsqQuery; SQLPREP("INSERT INTO `%1channel_links` (`server_id`, `channel_id`, `link_id`) VALUES (?,?,?)"); query.addBindValue(iServerNum); query.addBindValue(c->iId); query.addBindValue(l->iId); SQLEXEC(); query.addBindValue(iServerNum); query.addBindValue(l->iId); query.addBindValue(c->iId); SQLEXEC(); } void Server::removeLink(Channel *c, Channel *l) { { QWriteLocker wl(&qrwlVoiceThread); c->unlink(l); } if (c->bTemporary || l->bTemporary) return; TransactionHolder th; QSqlQuery &query = *th.qsqQuery; SQLPREP("DELETE FROM `%1channel_links` WHERE `server_id` = ? AND `channel_id` = ? AND `link_id` = ?"); query.addBindValue(iServerNum); query.addBindValue(c->iId); query.addBindValue(l->iId); SQLEXEC(); query.addBindValue(iServerNum); query.addBindValue(l->iId); query.addBindValue(c->iId); SQLEXEC(); } Channel *Server::addChannel(Channel *p, const QString &name, bool temporary, int position, unsigned int maxUsers) { TransactionHolder th; QSqlQuery &query = *th.qsqQuery; SQLPREP("SELECT MAX(`channel_id`)+1 AS id FROM `%1channels` WHERE `server_id`=?"); query.addBindValue(iServerNum); SQLEXEC(); int id = 0; if (query.next()) id = query.value(0).toInt(); // Temporary channels might "complicate" this somewhat. while (qhChannels.contains(id)) ++id; if (! temporary) { SQLPREP("INSERT INTO `%1channels` (`server_id`, `parent_id`, `channel_id`, `name`) VALUES (?,?,?,?)"); query.addBindValue(iServerNum); query.addBindValue(p->iId); query.addBindValue(id); query.addBindValue(name); SQLEXEC(); // Delete old channel_info rows SQLPREP("DELETE FROM `%1channel_info` WHERE `server_id` = ? AND `channel_id` = ?"); query.addBindValue(iServerNum); query.addBindValue(id); SQLEXEC(); // Add channel sorting information SQLPREP("INSERT INTO `%1channel_info` ( `server_id`, `channel_id`, `key`, `value`) VALUES(?,?,?,?)"); query.addBindValue(iServerNum); query.addBindValue(id); query.addBindValue(ServerDB::Channel_Position); query.addBindValue(QVariant(position).toString()); SQLEXEC(); // Update channel maximum users query.addBindValue(iServerNum); query.addBindValue(id); query.addBindValue(ServerDB::Channel_Max_Users); query.addBindValue(QVariant(maxUsers).toString()); SQLEXEC(); } Channel *c = new Channel(id, name, p); c->bTemporary = temporary; c->iPosition = position; c->uiMaxUsers = maxUsers; qhChannels.insert(id, c); return c; } void Server::removeChannelDB(const Channel *c) { if (! c->bTemporary) { TransactionHolder th; QSqlQuery &query = *th.qsqQuery; SQLPREP("DELETE FROM `%1channels` WHERE `server_id` = ? AND `channel_id` = ?"); query.addBindValue(iServerNum); query.addBindValue(c->iId); SQLEXEC(); } qhChannels.remove(c->iId); } void Server::updateChannel(const Channel *c) { if (c->bTemporary) return; TransactionHolder th; Group *g; ChanACL *acl; QSqlQuery &query = *th.qsqQuery; SQLPREP("UPDATE `%1channels` SET `name` = ?, `parent_id` = ?, `inheritacl` = ? WHERE `server_id` = ? AND `channel_id` = ?"); query.addBindValue(c->qsName); query.addBindValue(c->cParent ? c->cParent->iId : QVariant()); query.addBindValue(c->bInheritACL ? 1 : 0); query.addBindValue(iServerNum); query.addBindValue(c->iId); SQLEXEC(); // Update channel description information if (Meta::mp.qsDBDriver == "QPSQL") { SQLPREP("INSERT INTO `%1channel_info` (`server_id`, `channel_id`, `key`, `value`) VALUES (:server_id, :channel_id, :key, :value) ON CONFLICT (`server_id`, `channel_id`, `key`) DO UPDATE SET `value` = :u_value WHERE `%1channel_info`.`server_id` = :u_server_id AND `%1channel_info`.`channel_id` = :u_channel_id AND `%1channel_info`.`key` = :u_key"); query.bindValue(":server_id", iServerNum); query.bindValue(":channel_id", c->iId); query.bindValue(":key", ServerDB::Channel_Description); query.bindValue(":value", c->qsDesc); query.bindValue(":u_server_id", iServerNum); query.bindValue(":u_channel_id", c->iId); query.bindValue(":u_key", ServerDB::Channel_Description); query.bindValue(":u_value", c->qsDesc); SQLEXEC(); } else { SQLPREP("REPLACE INTO `%1channel_info` (`server_id`, `channel_id`, `key`, `value`) VALUES (?, ?, ?, ?)"); query.addBindValue(iServerNum); query.addBindValue(c->iId); query.addBindValue(ServerDB::Channel_Description); query.addBindValue(c->qsDesc); SQLEXEC(); } // Update channel position information if (Meta::mp.qsDBDriver == "QPSQL") { query.bindValue(":server_id", iServerNum); query.bindValue(":channel_id", c->iId); query.bindValue(":key", ServerDB::Channel_Position); query.bindValue(":value", QVariant(c->iPosition).toString()); query.bindValue(":u_server_id", iServerNum); query.bindValue(":u_channel_id", c->iId); query.bindValue(":u_key", ServerDB::Channel_Position); query.bindValue(":u_value", QVariant(c->iPosition).toString()); SQLEXEC(); } else { query.addBindValue(iServerNum); query.addBindValue(c->iId); query.addBindValue(ServerDB::Channel_Position); query.addBindValue(QVariant(c->iPosition).toString()); SQLEXEC(); } // Update channel maximum channels if (Meta::mp.qsDBDriver == "QPSQL") { query.bindValue(":server_id", iServerNum); query.bindValue(":channel_id", c->iId); query.bindValue(":key", ServerDB::Channel_Max_Users); query.bindValue(":value", QVariant(c->uiMaxUsers).toString()); query.bindValue(":u_server_id", iServerNum); query.bindValue(":u_channel_id", c->iId); query.bindValue(":u_key", ServerDB::Channel_Max_Users); query.bindValue(":u_value", QVariant(c->uiMaxUsers).toString()); SQLEXEC(); } else { query.addBindValue(iServerNum); query.addBindValue(c->iId); query.addBindValue(ServerDB::Channel_Max_Users); query.addBindValue(QVariant(c->uiMaxUsers).toString()); SQLEXEC(); } SQLPREP("DELETE FROM `%1groups` WHERE `server_id` = ? AND `channel_id` = ?"); query.addBindValue(iServerNum); query.addBindValue(c->iId); SQLEXEC(); SQLPREP("DELETE FROM `%1acl` WHERE `server_id` = ? AND `channel_id` = ?"); query.addBindValue(iServerNum); query.addBindValue(c->iId); SQLEXEC(); foreach(g, c->qhGroups) { int id = 0; int pid; if (Meta::mp.qsDBDriver == "QPSQL") { SQLPREP("INSERT INTO `%1groups` (`server_id`, `channel_id`, `name`, `inherit`, `inheritable`) VALUES (?,?,?,?,?) RETURNING group_id"); query.addBindValue(iServerNum); query.addBindValue(g->c->iId); query.addBindValue(g->qsName); query.addBindValue(g->bInherit ? 1 : 0); query.addBindValue(g->bInheritable ? 1 : 0); SQLEXEC(); if (query.next()) { id = query.value(0).toInt(); } else { qFatal("ServerDB: internal query failure: PostgreSQL query did not return the inserted group's group_id"); } } else { SQLPREP("REPLACE INTO `%1groups` (`server_id`, `channel_id`, `name`, `inherit`, `inheritable`) VALUES (?,?,?,?,?)"); query.addBindValue(iServerNum); query.addBindValue(g->c->iId); query.addBindValue(g->qsName); query.addBindValue(g->bInherit ? 1 : 0); query.addBindValue(g->bInheritable ? 1 : 0); SQLEXEC(); id = query.lastInsertId().toInt(); } foreach(pid, g->qsAdd) { SQLPREP("INSERT INTO `%1group_members` (`group_id`, `server_id`, `user_id`, `addit`) VALUES (?, ?, ?, ?)"); query.addBindValue(id); query.addBindValue(iServerNum); query.addBindValue(pid); query.addBindValue(1); SQLEXEC(); } foreach(pid, g->qsRemove) { SQLPREP("INSERT INTO `%1group_members` (`group_id`, `server_id`, `user_id`, `addit`) VALUES (?, ?, ?, ?)"); query.addBindValue(id); query.addBindValue(iServerNum); query.addBindValue(pid); query.addBindValue(0); SQLEXEC(); } } int pri = 5; foreach(acl, c->qlACL) { SQLPREP("INSERT INTO `%1acl` (`server_id`, `channel_id`, `priority`, `user_id`, `group_name`, `apply_here`, `apply_sub`, `grantpriv`, `revokepriv`) VALUES (?,?,?,?,?,?,?,?,?)"); query.addBindValue(iServerNum); query.addBindValue(acl->c->iId); query.addBindValue(pri++); query.addBindValue((acl->iUserId == -1) ? QVariant() : acl->iUserId); query.addBindValue((acl->qsGroup.isEmpty()) ? QVariant() : acl->qsGroup); query.addBindValue(acl->bApplyHere ? 1 : 0); query.addBindValue(acl->bApplySubs ? 1 : 0); query.addBindValue(static_cast(acl->pAllow)); query.addBindValue(static_cast(acl->pDeny)); SQLEXEC(); } } /** Reads the channel privileges (group and acl) as well as the channel information key/value pairs from the database. * @param c Channel to fetch information for */ void Server::readChannelPrivs(Channel *c) { TransactionHolder th; int cid = c->iId; QSqlQuery &query = *th.qsqQuery; SQLPREP("SELECT `key`, `value` FROM `%1channel_info` WHERE `server_id` = ? AND `channel_id` = ?"); query.addBindValue(iServerNum); query.addBindValue(cid); SQLEXEC(); while (query.next()) { int key = query.value(0).toInt(); const QString &value = query.value(1).toString(); if (key == ServerDB::Channel_Description) { hashAssign(c->qsDesc, c->qbaDescHash, value); } else if (key == ServerDB::Channel_Position) { c->iPosition = QVariant(value).toInt(); // If the conversion fails it'll return the default value 0 } else if (key == ServerDB::Channel_Max_Users) { c->uiMaxUsers = QVariant(value).toUInt(); // If the conversion fails it'll return the default value 0 } } SQLPREP("SELECT `group_id`, `name`, `inherit`, `inheritable` FROM `%1groups` WHERE `server_id` = ? AND `channel_id` = ?"); query.addBindValue(iServerNum); query.addBindValue(cid); SQLEXEC(); while (query.next()) { int gid = query.value(0).toInt(); QString name = query.value(1).toString(); Group *g = new Group(c, name); g->bInherit = query.value(2).toBool(); g->bInheritable = query.value(3).toBool(); QSqlQuery mem; mem.prepare(QString::fromLatin1("SELECT user_id, addit FROM %1group_members WHERE group_id = ?").arg(Meta::mp.qsDBPrefix)); mem.addBindValue(gid); mem.exec(); while (mem.next()) { int uid = mem.value(0).toInt(); if (mem.value(1).toBool()) g->qsAdd << uid; else g->qsRemove << uid; } } SQLPREP("SELECT `user_id`, `group_name`, `apply_here`, `apply_sub`, `grantpriv`, `revokepriv` FROM `%1acl` WHERE `server_id` = ? AND `channel_id` = ? ORDER BY `priority`"); query.addBindValue(iServerNum); query.addBindValue(cid); SQLEXEC(); while (query.next()) { ChanACL *acl = new ChanACL(c); acl->iUserId = query.value(0).isNull() ? -1 : query.value(0).toInt(); acl->qsGroup = query.value(1).toString(); acl->bApplyHere = query.value(2).toBool(); acl->bApplySubs = query.value(3).toBool(); acl->pAllow = static_cast(query.value(4).toInt()); acl->pDeny = static_cast(query.value(5).toInt()); } } void Server::readChannels(Channel *p) { QList kids; Channel *c; QSqlQuery query; int parentid = -1; if (p) { parentid = p->iId; readChannelPrivs(qhChannels.value(parentid)); } { TransactionHolder th; if (parentid == -1) { SQLPREP("SELECT `channel_id`, `name`, `inheritacl` FROM `%1channels` WHERE `server_id` = ? AND `parent_id` IS NULL ORDER BY `name`"); query.addBindValue(iServerNum); } else { SQLPREP("SELECT `channel_id`, `name`, `inheritacl` FROM `%1channels` WHERE `server_id` = ? AND `parent_id`=? ORDER BY `name`"); query.addBindValue(iServerNum); query.addBindValue(parentid); } SQLEXEC(); while (query.next()) { c = new Channel(query.value(0).toInt(), query.value(1).toString(), p); if (! p) c->setParent(this); qhChannels.insert(c->iId, c); c->bInheritACL = query.value(2).toBool(); kids << c; } } query.clear(); foreach(c, kids) readChannels(c); } void Server::readLinks() { TransactionHolder th; QSqlQuery &query = *th.qsqQuery; SQLPREP("SELECT `channel_id`, `link_id` FROM `%1channel_links` WHERE `server_id` = ?"); query.addBindValue(iServerNum); SQLEXEC(); while (query.next()) { int cid = query.value(0).toInt(); int lid = query.value(1).toInt(); Channel *c = qhChannels.value(cid); Channel *l = qhChannels.value(lid); if (c && l) { QWriteLocker wl(&qrwlVoiceThread); c->link(l); } } } void Server::setLastChannel(const User *p) { if (p->iId < 0) return; if (p->cChannel->bTemporary) return; TransactionHolder th; QSqlQuery &query = *th.qsqQuery; if (Meta::mp.qsDBDriver == "QSQLITE") { SQLPREP("UPDATE `%1users` SET `lastchannel`=? WHERE `server_id` = ? AND `user_id` = ?"); } else { SQLPREP("UPDATE `%1users` SET `lastchannel`=?, `last_active` = now() WHERE `server_id` = ? AND `user_id` = ?"); } query.addBindValue(p->cChannel->iId); query.addBindValue(iServerNum); query.addBindValue(p->iId); SQLEXEC(); } int Server::readLastChannel(int id) { if (id < 0) return -1; TransactionHolder th; QSqlQuery &query = *th.qsqQuery; SQLPREP("SELECT `lastchannel` FROM `%1users` WHERE `server_id` = ? AND `user_id` = ?"); query.addBindValue(iServerNum); query.addBindValue(id); SQLEXEC(); if (query.next()) { int cid = query.value(0).toInt(); if (qhChannels.contains(cid)) return cid; } return -1; } void Server::dumpChannel(const Channel *c) { Group *g; ChanACL *acl; int pid; if (c == NULL) { c = qhChannels.value(0); } qWarning("Channel %s (ACLInherit %d)", qPrintable(c->qsName), c->bInheritACL); qWarning("Description: %s", qPrintable(c->qsDesc)); foreach(g, c->qhGroups) { qWarning("Group %s (Inh %d Able %d)", qPrintable(g->qsName), g->bInherit, g->bInheritable); foreach(pid, g->qsAdd) qWarning("Add %d", pid); foreach(pid, g->qsRemove) qWarning("Remove %d", pid); } foreach(acl, c->qlACL) { int allow = static_cast(acl->pAllow); int deny = static_cast(acl->pDeny); qWarning("ChanACL Here %d Sub %d Allow %04x Deny %04x ID %d Group %s", acl->bApplyHere, acl->bApplySubs, allow, deny, acl->iUserId, qPrintable(acl->qsGroup)); } qWarning(" "); foreach(c, c->qlChannels) { dumpChannel(c); } } void Server::getBans() { TransactionHolder th; qlBans.clear(); QSqlQuery &query = *th.qsqQuery; SQLPREP("SELECT `base`,`mask`,`name`,`hash`,`reason`,`start`,`duration` FROM `%1bans` WHERE `server_id` = ?"); query.addBindValue(iServerNum); SQLEXEC(); while (query.next()) { Ban ban; ban.haAddress = query.value(0).toByteArray(); ban.iMask = query.value(1).toInt(); ban.qsUsername = query.value(2).toString(); ban.qsHash = query.value(3).toString(); ban.qsReason = query.value(4).toString(); ban.qdtStart = query.value(5).toDateTime(); ban.qdtStart.setTimeSpec(Qt::UTC); ban.iDuration = query.value(6).toInt(); if (ban.isValid()) qlBans << ban; } } void Server::saveBans() { TransactionHolder th; QSqlQuery &query = *th.qsqQuery; SQLPREP("DELETE FROM `%1bans` WHERE `server_id` = ? "); query.addBindValue(iServerNum); SQLEXEC(); SQLPREP("INSERT INTO `%1bans` (`server_id`, `base`,`mask`,`name`,`hash`,`reason`,`start`,`duration`) VALUES (?,?,?,?,?,?,?,?)"); foreach(const Ban &ban, qlBans) { query.addBindValue(iServerNum); query.addBindValue(ban.haAddress.toByteArray()); query.addBindValue(ban.iMask); query.addBindValue(ban.qsUsername); query.addBindValue(ban.qsHash); query.addBindValue(ban.qsReason); query.addBindValue(ban.qdtStart); query.addBindValue(ban.iDuration); SQLEXEC(); } } QVariant Server::getConf(const QString &key, QVariant def) { return ServerDB::getConf(iServerNum, key, def); } QVariant ServerDB::getConf(int server_id, const QString &key, QVariant def) { TransactionHolder th; QSqlQuery &query = *th.qsqQuery; SQLPREP("SELECT `value` FROM `%1config` WHERE `server_id` = ? AND `key` = ?"); query.addBindValue(server_id); query.addBindValue(key); SQLEXEC(); if (query.next()) { return query.value(0); } return def; } QMap ServerDB::getAllConf(int server_id) { TransactionHolder th; QMap map; QSqlQuery &query = *th.qsqQuery; SQLPREP("SELECT `key`, `value` FROM `%1config` WHERE `server_id` = ?"); query.addBindValue(server_id); SQLEXEC(); while (query.next()) { map.insert(query.value(0).toString(), query.value(1).toString()); } return map; } void Server::setConf(const QString &key, const QVariant &value) { ServerDB::setConf(iServerNum, key, value); } void Server::dblog(const QString &str) const { TransactionHolder th; QSqlQuery &query = *th.qsqQuery; // Is logging disabled? if (Meta::mp.iLogDays < 0) return; // Once per hour if (Meta::mp.iLogDays > 0) { if (ServerDB::tLogClean.isElapsed(3600ULL * 1000000ULL)) { QString qstr; if (Meta::mp.qsDBDriver == "QSQLITE") { qstr = QString::fromLatin1("msgtime < datetime('now','-%1 days')").arg(Meta::mp.iLogDays); } else if (Meta::mp.qsDBDriver == "QPSQL") { qstr = QString::fromLatin1("msgtime < now() - INTERVAL '%1 day'").arg(Meta::mp.iLogDays); } else { qstr = QString::fromLatin1("msgtime < now() - INTERVAL %1 day").arg(Meta::mp.iLogDays); } ServerDB::prepare(query, QString::fromLatin1("DELETE FROM %1slog WHERE ") + qstr); SQLEXEC(); } } SQLPREP("INSERT INTO `%1slog` (`server_id`, `msg`) VALUES(?,?)"); query.addBindValue(iServerNum); query.addBindValue(str); SQLEXEC(); } void ServerDB::wipeLogs() { TransactionHolder th; QSqlQuery &query = *th.qsqQuery; SQLDO("DELETE FROM %1slog"); } QList > ServerDB::getLog(int server_id, unsigned int offs_min, unsigned int offs_max) { TransactionHolder th; QSqlQuery &query = *th.qsqQuery; if (Meta::mp.qsDBDriver == "QPSQL") { SQLPREP("SELECT `msgtime`, `msg` FROM `%1slog` WHERE `server_id` = ? ORDER BY `msgtime` DESC LIMIT ? OFFSET ?"); query.addBindValue(server_id); query.addBindValue(offs_max); query.addBindValue(offs_min); SQLEXEC(); } else { SQLPREP("SELECT `msgtime`, `msg` FROM `%1slog` WHERE `server_id` = ? ORDER BY `msgtime` DESC LIMIT ?, ?"); query.addBindValue(server_id); query.addBindValue(offs_min); query.addBindValue(offs_max); SQLEXEC(); } QList > ql; while (query.next()) { QDateTime qdt = query.value(0).toDateTime(); QString msg = query.value(1).toString(); ql << QPair(qdt.toLocalTime().toTime_t(), msg); } return ql; } int ServerDB::getLogLen(int server_id) { TransactionHolder th; QSqlQuery &query = *th.qsqQuery; SQLPREP("SELECT COUNT(`msgtime`) FROM `%1slog` WHERE `server_id` = ?"); query.addBindValue(server_id); SQLEXEC(); while (query.next()) { return query.value(0).toInt(); } return -1; } void ServerDB::setConf(int server_id, const QString &k, const QVariant &value) { TransactionHolder th; const QString &key = (k == "serverpassword") ? "password" : k; QSqlQuery &query = *th.qsqQuery; if (value.isNull() || value.toString().trimmed().isEmpty()) { SQLPREP("DELETE FROM `%1config` WHERE `server_id` = ? AND `key` = ?"); query.addBindValue(server_id); query.addBindValue(key); } else { if (Meta::mp.qsDBDriver == "QPSQL") { SQLPREP("INSERT INTO `%1config` (`server_id`, `key`, `value`) VALUES (:server_id, :key, :value) ON CONFLICT (`server_id`, `key`) DO UPDATE SET `value` = :u_value WHERE `%1config`.`server_id` = :u_server_id AND `%1config`.`key` = :u_key"); query.bindValue(":server_id", server_id); query.bindValue(":key", key); query.bindValue(":value", value.toString()); query.bindValue(":u_server_id", server_id); query.bindValue(":u_key", key); query.bindValue(":u_value", value.toString()); } else { SQLPREP("REPLACE INTO `%1config` (`server_id`, `key`, `value`) VALUES (?,?,?)"); query.addBindValue(server_id); query.addBindValue(key); query.addBindValue(value.toString()); } } SQLEXEC(); } QList ServerDB::getAllServers() { TransactionHolder th; QSqlQuery &query = *th.qsqQuery; SQLPREP("SELECT `server_id` FROM `%1servers`"); SQLEXEC(); QList ql; while (query.next()) ql << query.value(0).toInt(); return ql; } QList ServerDB::getBootServers() { QList ql = getAllServers(); TransactionHolder th; QSqlQuery &query = *th.qsqQuery; QList bootlist; foreach(int i, ql) { SQLPREP("SELECT `value` FROM `%1config` WHERE `server_id` = ? AND `key` = ?"); query.addBindValue(i); query.addBindValue(QLatin1String("boot")); SQLEXEC(); if (! query.next() || query.value(0).toBool()) bootlist << i; } return bootlist; } bool ServerDB::serverExists(int num) { TransactionHolder th; QSqlQuery &query = *th.qsqQuery; SQLPREP("SELECT `server_id` FROM `%1servers` WHERE `server_id` = ?"); query.addBindValue(num); SQLEXEC(); if (query.next()) return true; return false; } int ServerDB::addServer() { TransactionHolder th; QSqlQuery &query = *th.qsqQuery; SQLPREP("SELECT MAX(`server_id`)+1 AS id FROM `%1servers`"); SQLEXEC(); int id = 0; if (query.next()) id = qMax(1, query.value(0).toInt()); SQLPREP("INSERT INTO `%1servers` (`server_id`) VALUES (?)"); query.addBindValue(id); SQLEXEC(); return id; } void ServerDB::deleteServer(int server_id) { TransactionHolder th; QSqlQuery &query = *th.qsqQuery; SQLPREP("DELETE FROM `%1servers` WHERE `server_id` = ?"); query.addBindValue(server_id); SQLEXEC(); } mumble-1.3.4/src/murmur/MurmurRPC.proto0000664000175000017500000005637514010707274017721 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . syntax = "proto2"; package MurmurRPC; // Note about embedded messages: // // To help save bandwidth, the protocol does not always send complete embedded // messages (i.e. an embeddded message with all of the fields filled in). These // incomplete messages only contain enough identifying information to get more // information from the message's corresponding "Get" method. For example: // // User.server only ever contains the server ID. Calling ServerGet(User.server) // will return a Server message with the server's status and uptime. message Void { } message Version { // 2-byte Major, 1-byte Minor and 1-byte Patch version number. optional uint32 version = 1; // Client release name. optional string release = 2; // Client OS name. optional string os = 3; // Client OS version. optional string os_version = 4; } message Uptime { // The number of seconds from the starting time. optional uint64 secs = 1; } message Server { // The unique server ID. required uint32 id = 1; // Is the server currently running? optional bool running = 2; // The update of the server. optional Uptime uptime = 3; message Event { enum Type { UserConnected = 0; UserDisconnected = 1; UserStateChanged = 2; UserTextMessage = 3; ChannelCreated = 4; ChannelRemoved = 5; ChannelStateChanged = 6; }; // The server on which the event happened. optional Server server = 1; // The type of event that happened. optional Type type = 2; // The user tied to the event (if applicable). optional User user = 3; // The text message tied to the event (if applicable). optional TextMessage message = 4; // The channel tied to the event (if applicable). optional Channel channel = 5; } message Query { } message List { // The servers. repeated Server servers = 1; } } message Event { enum Type { ServerStopped = 0; ServerStarted = 1; }; // The server for which the event happened. optional Server server = 1; // The type of event that happened. optional Type type = 2; } message ContextAction { enum Context { Server = 0x01; Channel = 0x02; User = 0x04; }; // The server on which the action is. optional Server server = 1; // The context in which the action is. optional uint32 context = 2; // The action name. optional string action = 3; // The user-visible descriptive name of the action. optional string text = 4; // The user that triggered the ContextAction. optional User actor = 5; // The user on which the ContextAction was triggered. optional User user = 6; // The channel on which the ContextAction was triggered. optional Channel channel = 7; } message TextMessage { // The server on which the TextMessage originates. optional Server server = 1; // The user who sent the message. optional User actor = 2; // The users to whom the message is sent. repeated User users = 3; // The channels to which the message is sent. repeated Channel channels = 4; // The channels to which the message is sent, including the channels' // ancestors. repeated Channel trees = 5; // The message body that is sent. optional string text = 6; message Filter { enum Action { // Accept the message. Accept = 0; // Reject the message with a permission error. Reject = 1; // Silently drop the message. Drop = 2; } // The server on which the message originated. optional Server server = 1; // The action to perform for the message. optional Action action = 2; // The text message. optional TextMessage message = 3; } } message Log { // The server on which the log message was generated. optional Server server = 1; // The unix timestamp of when the message was generated. optional int64 timestamp = 2; // The log message. optional string text = 3; message Query { // The server whose logs will be queried. optional Server server = 1; // The minimum log index to receive. optional uint32 min = 2; // The maximum log index to receive. optional uint32 max = 3; } message List { // The server where the log entries are from. optional Server server = 1; // The total number of logs entries on the server. optional uint32 total = 2; // The minimum log index that was sent. optional uint32 min = 3; // The maximum log index that was sent. optional uint32 max = 4; // The log entries. repeated Log entries = 5; } } message Config { // The server for which the configuration is for. optional Server server = 1; // The configuration keys and values. map fields = 2; message Field { // The server for which the configuration field is for. optional Server server = 1; // The field key. optional string key = 2; // The field value. optional string value = 3; } } message Channel { // The server on which the channel exists. optional Server server = 1; // The unique channel identifier. optional uint32 id = 2; // The channel name. optional string name = 3; // The channel's parent. optional Channel parent = 4; // Linked channels. repeated Channel links = 5; // The channel's description. optional string description = 6; // Is the channel temporary? optional bool temporary = 7; // The position in which the channel should appear in a sorted list. optional int32 position = 8; message Query { // The server on which the channels are. optional Server server = 1; } message List { // The server on which the channels are. optional Server server = 1; // The channels. repeated Channel channels = 2; } } message User { // The server to which the user is connected. optional Server server = 1; // The user's session ID. optional uint32 session = 2; // The user's registered ID. optional uint32 id = 3; // The user's name. optional string name = 4; // Is the user muted? optional bool mute = 5; // Is the user deafened? optional bool deaf = 6; // Is the user suppressed? optional bool suppress = 7; // Is the user a priority speaker? optional bool priority_speaker = 8; // Has the user muted him/herself? optional bool self_mute = 9; // Has the user muted him/herself? optional bool self_deaf = 10; // Is the user recording? optional bool recording = 11; // The channel the user is in. optional Channel channel = 12; // How long the user has been connected to the server. optional uint32 online_secs = 13; // How long the user has been idle on the server. optional uint32 idle_secs = 14; // How many bytes per second is the user transmitting to the server. optional uint32 bytes_per_sec = 15; // The user's client version. optional Version version = 16; // The user's plugin context. optional bytes plugin_context = 17; // The user's plugin identity. optional string plugin_identity = 18; // The user's comment. optional string comment = 19; // The user's texture. optional bytes texture = 20; // The user's IP address. optional bytes address = 21; // Is the user in TCP-only mode? optional bool tcp_only = 22; // The user's UDP ping in milliseconds. optional float udp_ping_msecs = 23; // The user's TCP ping in milliseconds. optional float tcp_ping_msecs = 24; message Query { // The server whose users will be queried. optional Server server = 1; } message List { // The server to which the users are connected. optional Server server = 1; // The users. repeated User users = 2; } message Kick { // The server to which the user is connected. optional Server server = 1; // The user to kick. optional User user = 2; // The user who performed the kick. optional User actor = 3; // The reason for why the user is being kicked. optional string reason = 4; } } message Tree { // The server which the tree represents. optional Server server = 1; // The current channel. optional Channel channel = 2; // Channels below the current channel. repeated Tree children = 3; // The users in the current channel. repeated User users = 4; message Query { // The server to query. optional Server server = 1; } } message Ban { // The server on which the ban is applied. optional Server server = 1; // The banned IP address. optional bytes address = 2; // The number of leading bits in the address to which the ban applies. optional uint32 bits = 3; // The name of the banned user. optional string name = 4; // The certificate hash of the banned user. optional string hash = 5; // The reason for the ban. optional string reason = 6; // The ban start time (in epoch form). optional int64 start = 7; // The ban duration. optional int64 duration_secs = 8; message Query { // The server whose bans to query. optional Server server = 1; } message List { // The server for which the bans apply. optional Server server = 1; // The bans. repeated Ban bans = 2; } } message ACL { enum Permission { None = 0x00; Write = 0x01; Traverse = 0x02; Enter = 0x04; Speak = 0x08; Whisper = 0x100; MuteDeafen = 0x10; Move = 0x20; MakeChannel = 0x40; MakeTemporaryChannel = 0x400; LinkChannel = 0x80; TextMessage = 0x200; Kick = 0x10000; Ban = 0x20000; Register = 0x40000; RegisterSelf = 0x80000; } message Group { // The ACL group name. optional string name = 1; // Is the group inherited? optional bool inherited = 2; // Does the group inherit members? optional bool inherit = 3; // Can this group be inherited by its children? optional bool inheritable = 4; // The users explicitly added by this group. repeated DatabaseUser users_add = 5; // The users explicitly removed by this group. repeated DatabaseUser users_remove = 6; // All of the users who are part of this group. repeated DatabaseUser users = 7; } // Does the ACL apply to the current channel? optional bool apply_here = 3; // Does the ACL apply to the current channel's sub-channels? optional bool apply_subs = 4; // Was the ACL inherited? optional bool inherited = 5; // The user to whom the ACL applies. optional DatabaseUser user = 6; // The group to whom the ACL applies. optional ACL.Group group = 7; // The permissions granted by the ACL (bitmask of ACL.Permission). optional uint32 allow = 8; // The permissions denied by the ACL (bitmask of ACL.Permission). optional uint32 deny = 9; message Query { // The server where the user and channel exist. optional Server server = 1; // The user to query. optional User user = 2; // The channel to query. optional Channel channel = 3; } message List { // The server on which the ACLs exist. optional Server server = 1; // The channel to which the ACL refers. optional Channel channel = 2; // The ACLs part of the given channel. repeated ACL acls = 3; // The groups part of the given channel. repeated ACL.Group groups = 4; // Should ACLs be inherited from the parent channel. optional bool inherit = 5; } message TemporaryGroup { // The server where the temporary group exists. optional Server server = 1; // The channel to which the temporary user group is added. optional Channel channel = 2; // The user who is added to the group. optional User user = 3; // The name of the temporary group. optional string name = 4; } } message Authenticator { message Request { // An authentication request for a connecting user. message Authenticate { // The user's name. optional string name = 1; // The user's password. optional string password = 2; // The user's certificate chain in DER format. repeated bytes certificates = 3; // The hexadecimal hash of the user's certificate. optional string certificate_hash = 4; // If the user is connecting with a strong certificate. optional bool strong_certificate = 5; } // A request for information about a user, given by either the user's ID // or name. message Find { // The user's ID used for lookup. optional uint32 id = 1; // The user's name used for lookup. optional string name = 2; } // A query of all the registered users, optionally filtered by the given // filter string. message Query { // A user name filter (% is often used as a wildcard) optional string filter = 1; } // A request for a new user registration. message Register { // The database user to register. optional DatabaseUser user = 1; } // A request for deregistering a registered user. message Deregister { // The database user to deregister. optional DatabaseUser user = 1; } // A request to update a registered user's information. The information // provided should be merged with existing data. message Update { // The database user to update. optional DatabaseUser user = 1; } optional Authenticate authenticate = 1; optional Find find = 2; optional Query query = 3; optional Register register = 4; optional Deregister deregister = 5; optional Update update = 6; } message Response { // The initialization for the authenticator stream. This message must be // sent before authentication requests will start streaming. message Initialize { optional Server server = 1; } enum Status { // The request should fallthrough to murmur's default action. Fallthrough = 0; // The request was successful. Success = 1; // The request failed; there was some error. Failure = 2; // A temporary failure prevented the request from succeeding (e.g. a // database was unavailable). TemporaryFailure = 3; } message Authenticate { // The status of the request. optional Status status = 1; // The user's registered ID. optional uint32 id = 2; // The corrected user's name; optional string name = 3; // Additional ACL groups that the user belongs too. repeated ACL.Group groups = 4; } message Find { // The database user (if found). optional DatabaseUser user = 1; } message Query { // The matched database users. repeated DatabaseUser users = 1; } message Register { // The status of the request. optional Status status = 1; // The registered database user (must contain the registered user's ID). optional DatabaseUser user = 2; } message Deregister { // The status of the request. optional Status status = 1; } message Update { // The status of the request. optional Status status = 1; } optional Initialize initialize = 1; optional Authenticate authenticate = 2; optional Find find = 3; optional Query query = 4; optional Register register = 5; optional Deregister deregister = 6; optional Update update = 7; } } message DatabaseUser { // The server on which the user is registered. optional Server server = 1; // The unique user ID. optional uint32 id = 2; // The user's name. optional string name = 3; // The user's email address. optional string email = 4; // The user's comment. optional string comment = 5; // The user's certificate hash. optional string hash = 6; // The user's password (never sent; used only when updating). optional string password = 7; // When the user was last on the server. optional string last_active = 8; // The user's texture. optional bytes texture = 9; message Query { // The server whose users will be queried. optional Server server = 1; // A string to filter the users by. optional string filter = 2; } message List { // The server on which the users are registered. optional Server server = 1; // The users. repeated DatabaseUser users = 2; } message Verify { // The server on which the user-password pair will be authenticated. optional Server server = 1; // The user's name. optional string name = 2; // The user's password. optional string password = 3; } } message RedirectWhisperGroup { // The server on which the whisper redirection will take place. optional Server server = 1; // The user to whom the redirection will be applied. optional User user = 2; // The source group. optional ACL.Group source = 3; // The target group. optional ACL.Group target = 4; } service V1 { // // Meta // // GetUptime returns murmur's uptime. rpc GetUptime(Void) returns(Uptime); // GetVersion returns murmur's version. rpc GetVersion(Void) returns(Version); // Events returns a stream of murmur events. rpc Events(Void) returns(stream Event); // // Servers // // ServerCreate creates a new virtual server. The returned server object // contains the newly created server's ID. rpc ServerCreate(Void) returns(Server); // ServerQuery returns a list of servers that match the given query. rpc ServerQuery(Server.Query) returns(Server.List); // ServerGet returns information about the given server. rpc ServerGet(Server) returns(Server); // ServerStart starts the given stopped server. rpc ServerStart(Server) returns(Void); // ServerStop stops the given virtual server. rpc ServerStop(Server) returns(Void); // ServerRemove removes the given virtual server and its configuration. rpc ServerRemove(Server) returns(Void); // ServerEvents returns a stream of events that happen on the given server. rpc ServerEvents(Server) returns(stream Server.Event); // // ContextActions // // ContextActionAdd adds a context action to the given user's client. The // following ContextAction fields must be set: // context, action, text, and user. // // Added context actions are valid until: // - The context action is removed with ContextActionRemove, or // - The user disconnects from the server, or // - The server stops. rpc ContextActionAdd(ContextAction) returns(Void); // ContextActionRemove removes a context action from the given user's client. // The following ContextAction must be set: // action // If no user is given, the context action is removed from all users. rpc ContextActionRemove(ContextAction) returns(Void); // ContextActionEvents returns a stream of context action events that are // triggered by users. rpc ContextActionEvents(ContextAction) returns(stream ContextAction); // // TextMessage // // TextMessageSend sends the given TextMessage to the server. // // If no users, channels, or trees are added to the TextMessage, the message // will be broadcast the entire server. Otherwise, the message will be // targeted to the specified users, channels, and trees. rpc TextMessageSend(TextMessage) returns(Void); // TextMessageFilter filters text messages on a given server. // TextMessageFilter filters text messages for a given server. // // When a filter stream is active, text messages sent from users to the // server are sent over the stream. The RPC client then sends a message back // on the same stream, containing an action: whether the message should be // accepted, rejected, or dropped. // // To activate the filter stream, an initial TextMessage.Filter message must // be sent that contains the server on which the filter will be active. rpc TextMessageFilter(stream TextMessage.Filter) returns(stream TextMessage.Filter); // // Logs // // LogQuery returns a list of log entries from the given server. // // To get the total number of log entries, omit min and/or max from the // query. rpc LogQuery(Log.Query) returns(Log.List); // // Config // // ConfigGet returns the explicitly set configuration for the given server. rpc ConfigGet(Server) returns(Config); // ConfigGetField returns the configuration value for the given key. rpc ConfigGetField(Config.Field) returns(Config.Field); // ConfigSetField sets the configuration value to the given value. rpc ConfigSetField(Config.Field) returns(Void); // ConfigGetDefault returns the default server configuration. rpc ConfigGetDefault(Void) returns(Config); // // Channels // // ChannelQuery returns a list of channels that match the given query. rpc ChannelQuery(Channel.Query) returns(Channel.List); // ChannelGet returns the channel with the given ID. rpc ChannelGet(Channel) returns(Channel); // ChannelAdd adds the channel to the given server. The parent and name of // the channel must be set. rpc ChannelAdd(Channel) returns(Channel); // ChannelRemove removes the given channel from the server. rpc ChannelRemove(Channel) returns(Void); // ChannelUpdate updates the given channel's attributes. Only the fields that // are set will be updated. rpc ChannelUpdate(Channel) returns(Channel); // // Users // // UserQuery returns a list of connected users who match the given query. rpc UserQuery(User.Query) returns(User.List); // UserGet returns information on the connected user, given by the user's // session or name. rpc UserGet(User) returns(User); // UserUpdate changes the given user's state. Only the following fields can // be changed: // name, mute, deaf, suppress, priority_speaker, channel, comment. rpc UserUpdate(User) returns(User); // UserKick kicks the user from the server. rpc UserKick(User.Kick) returns(Void); // // Tree // // TreeQuery returns a representation of the given server's channel/user // tree. rpc TreeQuery(Tree.Query) returns(Tree); // // Bans // // BansGet returns a list of bans for the given server. rpc BansGet(Ban.Query) returns(Ban.List); // BansSet replaces the server's ban list with the given list. rpc BansSet(Ban.List) returns(Void); // // ACL // // ACLGet returns the ACL for the given channel. rpc ACLGet(Channel) returns(ACL.List); // ACLSet overrides the ACL of the given channel to what is provided. rpc ACLSet(ACL.List) returns(Void); // ACLGetEffectivePermissions returns the effective permissions for the given // user in the given channel. rpc ACLGetEffectivePermissions(ACL.Query) returns(ACL); // ACLAddTemporaryGroup adds a user to a temporary group. rpc ACLAddTemporaryGroup(ACL.TemporaryGroup) returns(Void); // ACLRemoveTemporaryGroup removes a user from a temporary group. rpc ACLRemoveTemporaryGroup(ACL.TemporaryGroup) returns(Void); // // Authenticator // // AuthenticatorStream opens an authentication stream to the server. // // There can only be one RPC client with an open Stream. If a new // authenticator connects, the open connected will be closed. rpc AuthenticatorStream(stream Authenticator.Response) returns(stream Authenticator.Request); // // Database // // DatabaseUserQuery returns a list of registered users who match given // query. rpc DatabaseUserQuery(DatabaseUser.Query) returns(DatabaseUser.List); // DatabaseUserGet returns the database user with the given ID. rpc DatabaseUserGet(DatabaseUser) returns(DatabaseUser); // DatabaseUserUpdate updates the given database user. rpc DatabaseUserUpdate(DatabaseUser) returns(Void); // DatabaseUserRegister registers a user with the given information on the // server. The returned DatabaseUser will contain the newly registered user's // ID. rpc DatabaseUserRegister(DatabaseUser) returns(DatabaseUser); // DatabaseUserDeregister deregisters the given user. rpc DatabaseUserDeregister(DatabaseUser) returns(Void); // DatabaseUserVerify verifies the that the given user-password pair is // correct. rpc DatabaseUserVerify(DatabaseUser.Verify) returns(DatabaseUser); // // Audio // // AddRedirectWhisperGroup add a whisper targets redirection for the given // user. Whenever a user whispers to group "source", the whisper will be // redirected to group "target". rpc RedirectWhisperGroupAdd(RedirectWhisperGroup) returns(Void); // RemoveRedirectWhisperGroup removes a whisper target redirection for // the the given user. rpc RedirectWhisperGroupRemove(RedirectWhisperGroup) returns(Void); } mumble-1.3.4/src/murmur/PBKDF2.h0000664000175000017500000000722714010707274016051 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . /* Copyright (C) 2013, Morris Moraes Copyright (C) 2014, Stefan Hacker All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Mumble Developers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef MUMBLE_MURMUR_PBKDF2_H_ #define MUMBLE_MURMUR_PBKDF2_H_ #include class QString; /// /// Fully static wrapper class for PBKF2 password hashing functionality used in Murmur. /// /// @note Using int all over the place because OpenSSL uses them in its C interface /// and we want to make sure not to parameterize it in unexpected ways. /// @warning Operations in this class that experience internal failure will abort /// program execution using qFatal. /// class PBKDF2 { public: /// /// @return Upper bound on iterations possible in /// BENCHMARK_DURATION_TARGET_IN_MS on this machine. /// static int benchmark(); /// Performs a PBKDF2 hash operation using EVP_sha384. /// /// @param hexSalt Hex encoded salt to use in operation. /// @param password Password to hash. /// @param iterationCount Number of PBKDF2 iterations to apply. /// @return Hex encoded password hash of DERIVED_KEY_LENGTH octets. /// static QString getHash(const QString &hexSalt, const QString &password, int iterationCount); /// /// @return SALT_LENGTH octets of hex encoded random salt. /// static QString getSalt(); /// Length of hash in octets static const int DERIVED_KEY_LENGTH = 48; /// Length salt in octests static const int SALT_LENGTH = 8; /// Duration for hash operation the benchmark function should target static const int BENCHMARK_DURATION_TARGET_IN_MS = 10; /// Benchmark returns highest iteration number of N benchmark attemps static const size_t BENCHMARK_N = 40; /// Lower bound of iteration count returned by benchmark /// regardless of duration (should be divisible by 2) static const int BENCHMARK_MINIMUM_ITERATION_COUNT = 1000; }; #endif // MUMBLE_MURMUR_PBKDF2_H_ mumble-1.3.4/src/murmur/MurmurGRPCImpl.h0000664000175000017500000001601314010707274017717 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifdef USE_GRPC #ifndef MUMBLE_MURMUR_MURMURRPC_H_ #define MUMBLE_MURMUR_MURMURRPC_H_ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-parameter" #include "MurmurRPC.grpc.pb.h" #pragma GCC diagnostic pop #include "Server.h" #include "Meta.h" #include #include #include class RPCCall; namespace MurmurRPC { namespace Wrapper { class V1_ContextActionEvents; class V1_Events; class V1_ServerEvents; class V1_AuthenticatorStream; class V1_TextMessageFilter; } } class MurmurRPCImpl : public QThread { Q_OBJECT; std::unique_ptr m_server; volatile bool m_isRunning; protected: void customEvent(QEvent *evt); public: MurmurRPCImpl(const QString &address, std::shared_ptr<::grpc::ServerCredentials> credentials); ~MurmurRPCImpl(); void run(); std::unique_ptr m_completionQueue; // Services MurmurRPC::V1::AsyncService m_V1Service; // Listeners QHash > m_contextActionListeners; QSet<::MurmurRPC::Wrapper::V1_Events *> m_metaServiceListeners; QMultiHash m_serverServiceListeners; QMutex qmAuthenticatorsLock; QHash m_authenticators; QMutex qmTextMessageFilterLock; QHash m_textMessageFilters; // Maps server id -> session -> context action QMap > > m_activeContextActions; bool hasActiveContextAction(const ::Server *s, const ::User *u, const QString &action); void addActiveContextAction(const ::Server *s, const ::User *u, const QString &action); void removeActiveContextAction(const ::Server *s, const ::User *u, const QString &action); void removeUserActiveContextActions(const ::Server *s, const ::User *u); void removeActiveContextActions(const ::Server *s); void removeTextMessageFilter(const ::Server *s); void removeAuthenticator(const ::Server *s); void sendMetaEvent(const ::MurmurRPC::Event &e); void sendServerEvent(const ::Server *s, const ::MurmurRPC::Server_Event &e); public slots: void started(Server *server); void stopped(Server *server); void authenticateSlot(int &res, QString &uname, int sessionId, const QList &certlist, const QString &certhash, bool certstrong, const QString &pw); void registerUserSlot(int &res, const QMap &); void unregisterUserSlot(int &res, int id); void getRegisteredUsersSlot(const QString &filter, QMap &res); void getRegistrationSlot(int &, int, QMap &); void setInfoSlot(int &, int, const QMap &); void setTextureSlot(int &res, int id, const QByteArray &texture); void nameToIdSlot(int &res, const QString &name); void idToNameSlot(QString &res, int id); void idToTextureSlot(QByteArray &res, int id); void userStateChanged(const User *user); void userTextMessage(const User *user, const TextMessage &message); void userConnected(const User *user); void userDisconnected(const User *user); void channelStateChanged(const Channel *channel); void channelCreated(const Channel *channel); void channelRemoved(const Channel *channel); void textMessageFilter(int &res, const User *user, MumbleProto::TextMessage &message); void contextAction(const User *user, const QString &action, unsigned int session, int channel); }; class RPCExecEvent : public ExecEvent { Q_DISABLE_COPY(RPCExecEvent); public: RPCCall *call; RPCExecEvent(::boost::function fn, RPCCall *rpc_call) : ExecEvent(fn), call(rpc_call) { } }; class RPCCall { ::std::atomic_int m_refs; public: MurmurRPCImpl *rpc; ::grpc::ServerContext context; RPCCall(MurmurRPCImpl *rpcImpl) : m_refs(0), rpc(rpcImpl) { ref(); } virtual ~RPCCall() { } virtual ::boost::function *done() { auto done_fn = ::boost::bind(&RPCCall::finish, this, _1); return new ::boost::function(done_fn); } virtual void error(const ::grpc::Status&) = 0; virtual void finish(bool) { deref(); } virtual void deref() { Q_ASSERT(m_refs > 0); if (--m_refs == 0) { delete this; } } virtual void ref() { m_refs++; } template class Ref { T *m_object; public: Ref(T *object) : m_object(object) { if (object) { object->ref(); } } ~Ref() { if (m_object) { m_object->deref(); } } operator bool() const { return m_object != nullptr && !m_object->context.IsCancelled(); } T *operator->() { return m_object; } }; }; template class RPCSingleSingleCall : public RPCCall { public: InType request; ::grpc::ServerAsyncResponseWriter < OutType > stream; RPCSingleSingleCall(MurmurRPCImpl *rpcImpl) : RPCCall(rpcImpl), stream(&context) { } virtual void error(const ::grpc::Status &err) { stream.FinishWithError(err, done()); } virtual void end(const OutType &msg = OutType()) { stream.Finish(msg, ::grpc::Status::OK, done()); } }; /// Base for "single-stream" RPC methods. /// /// The helper method "write" automatically queues writes to the stream. Without /// write queuing, the grpc crashes if a stream.Write is called before a /// previous stream.Write completes. template class RPCSingleStreamCall : public RPCCall { QMutex m_writeLock; QQueue< QPair > m_writeQueue; public: InType request; ::grpc::ServerAsyncWriter < OutType > stream; RPCSingleStreamCall(MurmurRPCImpl *rpcImpl) : RPCCall(rpcImpl), stream(&context) { } virtual void error(const ::grpc::Status &err) { stream.Finish(err, done()); } void write(const OutType &msg, void *tag) { QMutexLocker l(&m_writeLock); if (m_writeQueue.size() > 0) { m_writeQueue.enqueue(qMakePair(msg, tag)); } else { m_writeQueue.enqueue(qMakePair(OutType(), tag)); stream.Write(msg, writeCB()); } } private: void *writeCB() { auto callback = ::boost::bind(&RPCSingleStreamCall::writeCallback, this, _1); return new ::boost::function(callback); } void writeCallback(bool ok) { QMutexLocker l(&m_writeLock); auto processed = m_writeQueue.dequeue(); if (processed.second) { auto cb = static_cast< ::boost::function *>(processed.second); (*cb)(ok); delete cb; } if (m_writeQueue.size() > 0) { stream.Write(m_writeQueue.head().first, writeCB()); } } }; template class RPCStreamStreamCall : public RPCCall { public: InType request; OutType response; ::grpc::ServerAsyncReaderWriter< OutType, InType > stream; RPCStreamStreamCall(MurmurRPCImpl *rpcImpl) : RPCCall(rpcImpl), stream(&context) { } virtual void error(const ::grpc::Status &err) { stream.Finish(err, done()); } }; #endif #endif mumble-1.3.4/src/murmur/BonjourServer.h0000664000175000017500000000110514010707274017733 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MURMUR_BONJOURSERVER_H_ #define MUMBLE_MURMUR_BONJOURSERVER_H_ #include class BonjourServiceRegister; class BonjourServer : public QObject { private: Q_OBJECT Q_DISABLE_COPY(BonjourServer) public: BonjourServer(); ~BonjourServer(); BonjourServiceRegister *bsrRegister; }; #endif mumble-1.3.4/src/murmur/Tray.h0000664000175000017500000000175714010707274016062 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MURMUR_TRAY_H_ #define MUMBLE_MURMUR_TRAY_H_ #include #include #if QT_VERSION >= 0x050000 # include #else # include #endif class LogEmitter; class QAction; class Tray : public QObject { private: Q_OBJECT Q_DISABLE_COPY(Tray); protected: QSystemTrayIcon *qsti; QMenu *qm; QAction *qaQuit; QAction *qaAbout; QAction *qaShowLog; QStringList qlLog; LogEmitter *le; public slots: void on_Tray_activated(QSystemTrayIcon::ActivationReason); void on_About_triggered(); void on_Quit_triggered(); void on_ShowLog_triggered(); void addLogMessage(const QString &); public: Tray(QObject *parent, LogEmitter *le); }; #endif mumble-1.3.4/src/murmur/PBKDF2.cpp0000664000175000017500000000753214010707274016403 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . /* Copyright (C) 2013, Morris Moraes Copyright (C) 2014, Stefan Hacker All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Mumble Developers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "murmur_pch.h" #include "PBKDF2.h" int PBKDF2::benchmark() { const QString pseudopass(QLatin1String("aboutAvg")); const QString hexSalt = getSalt(); // Could tolerate not getting a salt here, will likely only make it harder. int maxIterations = -1; QElapsedTimer timer; timer.start(); for (size_t i = 0; i < BENCHMARK_N; ++i) { int iterations = BENCHMARK_MINIMUM_ITERATION_COUNT / 2; timer.restart(); do { iterations *= 2; // Store return value in a volatile to prevent optimizer // from ever removing these side-effect-free calls. I don't // think the compiler can prove they have no side-effects but // better safe than sorry. volatile QString result = getHash(hexSalt, pseudopass, iterations); Q_UNUSED(result); } while (timer.restart() < BENCHMARK_DURATION_TARGET_IN_MS && (iterations / 2) < std::numeric_limits::max()); if (iterations > maxIterations) { maxIterations = iterations; } } return maxIterations; } QString PBKDF2::getHash(const QString &hexSalt, const QString &password, int iterationCount) { QByteArray hash(DERIVED_KEY_LENGTH, 0); const QByteArray utf8Password = password.toUtf8(); const QByteArray salt = QByteArray::fromHex(hexSalt.toLatin1()); if (PKCS5_PBKDF2_HMAC(utf8Password.constData(), utf8Password.size(), reinterpret_cast(salt.constData()), salt.size(), iterationCount, EVP_sha384(), DERIVED_KEY_LENGTH, reinterpret_cast(hash.data())) == 0) { qFatal("PBKDF2: PKCS5_PBKDF2_HMAC failed: %s", ERR_error_string(ERR_get_error(), NULL)); return QString(); } return hash.toHex(); } QString PBKDF2::getSalt() { QByteArray salt(SALT_LENGTH, 0); if (RAND_bytes(reinterpret_cast(salt.data()), salt.size()) != 1) { qFatal("PBKDF2: RAND_bytes for salt failed: %s", ERR_error_string(ERR_get_error(), NULL)); return QString(); } return salt.toHex(); } mumble-1.3.4/src/murmur/ServerUser.h0000664000175000017500000000721314010707274017241 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MURMUR_SERVERUSER_H_ #define MUMBLE_MURMUR_SERVERUSER_H_ #include #include #ifdef Q_OS_UNIX #include #else #include #endif #include "Connection.h" #include "Timer.h" #include "User.h" #include "HostAddress.h" // Unfortunately, this needs to be "large enough" to hold // enough frames to account for both short-term and // long-term "maladjustments". #define N_BANDWIDTH_SLOTS 360 struct BandwidthRecord { int iRecNum; int iSum; Timer tFirst; Timer tIdleControl; unsigned short a_iBW[N_BANDWIDTH_SLOTS]; Timer a_qtWhen[N_BANDWIDTH_SLOTS]; mutable QMutex qmMutex; BandwidthRecord(); bool addFrame(int size, int maxpersec); int onlineSeconds() const; int idleSeconds() const; void resetIdleSeconds(); int bandwidth() const; }; struct WhisperTarget { struct Channel { int iId; bool bChildren; bool bLinks; QString qsGroup; }; QList qlSessions; QList qlChannels; }; class Server; /// A simple implementation for rate-limiting. /// See https://en.wikipedia.org/wiki/Leaky_bucket class LeakyBucket { private: /// The amount of tokens that are drained per second. /// (The sze of the whole in the bucket) unsigned int m_tokensPerSec; /// The maximum amount of tokens that may be encountered. /// (The capacity of the bucket) unsigned int m_maxTokens; /// The amount of tokens currently stored /// (The amount of whater currently in the bucket) long m_currentTokens; /// A timer that is used to measure time intervals. It is essential /// that this timer uses a monotonic clock (which is why QElapsedTimer is /// used instead of QTime or QDateTime). QElapsedTimer m_timer; public: /// @param tokens The amount of tokens that should be added. /// @returns Whether adding this amount of tokens triggers rate /// limiting (true means the corresponding packet has to be /// discared and false means the packet may be processed) bool ratelimit(int tokens); LeakyBucket(unsigned int tokensPerSec, unsigned int maxTokens); }; class ServerUser : public Connection, public User { private: Q_OBJECT Q_DISABLE_COPY(ServerUser) protected: Server *s; public: enum State { Connected, Authenticated }; State sState; operator QString() const; float dUDPPingAvg, dUDPPingVar; float dTCPPingAvg, dTCPPingVar; quint32 uiUDPPackets, uiTCPPackets; unsigned int uiVersion; QString qsRelease; QString qsOS; QString qsOSVersion; std::string ssContext; QString qsIdentity; bool bVerified; QStringList qslEmail; HostAddress haAddress; /// Holds whether the user is using TCP /// or UDP for voice packets. /// /// If the flag is 0, the user is using /// TCP. /// /// If the flag is 1, the user is using /// UDP. QAtomicInt aiUdpFlag; QList qlCodecs; bool bOpus; QStringList qslAccessTokens; QMap qmTargets; typedef QPair, QSet > TargetCache; QMap qmTargetCache; QMap qmWhisperRedirect; LeakyBucket leakyBucket; int iLastPermissionCheck; QMap qmPermissionSent; #ifdef Q_OS_UNIX int sUdpSocket; #else SOCKET sUdpSocket; #endif BandwidthRecord bwr; struct sockaddr_storage saiUdpAddress; struct sockaddr_storage saiTcpLocalAddress; ServerUser(Server *parent, QSslSocket *socket); }; #endif mumble-1.3.4/src/FFDHE.h0000664000175000017500000000152114010707273014414 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_FFDHE_H_ #define MUMBLE_FFDHE_H_ /// FFDHE provides access to the Diffie-Hellman parameters from RFC 7919. class FFDHE { public: /// NamedGroups returns a list of the supported named /// groups for PEMForNamedGroup. static QStringList NamedGroups(); /// PEMForNamedGroup returns the PEM-encoded /// Diffie-Hellman parameters for the RFC 7919 /// group with the given name, such as "ffdhe2048", /// "ffdhe4096", etc. /// /// Returns an empty byte array if the request /// could not be fulfilled. static QByteArray PEMForNamedGroup(QString name); }; #endif mumble-1.3.4/src/CryptState.h0000664000175000017500000000326614010707273015712 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_CRYPTSTATE_H_ #define MUMBLE_CRYPTSTATE_H_ #include #define AES_KEY_SIZE_BITS 128 #define AES_KEY_SIZE_BYTES (AES_KEY_SIZE_BITS/8) #include "Timer.h" class CryptState { private: Q_DISABLE_COPY(CryptState) public: unsigned char raw_key[AES_KEY_SIZE_BYTES]; unsigned char encrypt_iv[AES_BLOCK_SIZE]; unsigned char decrypt_iv[AES_BLOCK_SIZE]; unsigned char decrypt_history[0x100]; unsigned int uiGood; unsigned int uiLate; unsigned int uiLost; unsigned int uiResync; unsigned int uiRemoteGood; unsigned int uiRemoteLate; unsigned int uiRemoteLost; unsigned int uiRemoteResync; AES_KEY encrypt_key; AES_KEY decrypt_key; Timer tLastGood; Timer tLastRequest; bool bInit; CryptState(); bool isValid() const; void genKey(); void setKey(const unsigned char *rkey, const unsigned char *eiv, const unsigned char *div); void setDecryptIV(const unsigned char *iv); bool ocb_encrypt(const unsigned char *plain, unsigned char *encrypted, unsigned int len, const unsigned char *nonce, unsigned char *tag, bool modifyPlainOnXEXStarAttack = true); bool ocb_decrypt(const unsigned char *encrypted, unsigned char *plain, unsigned int len, const unsigned char *nonce, unsigned char *tag); bool decrypt(const unsigned char *source, unsigned char *dst, unsigned int crypted_length); bool encrypt(const unsigned char *source, unsigned char *dst, unsigned int plain_length); }; #endif mumble-1.3.4/src/tests/0000775000175000017500000000000014010707274014573 5ustar builderbuildermumble-1.3.4/src/tests/OverlayTest.pro0000664000175000017500000000074514010707274017604 0ustar builderbuilderinclude(../../qmake/compiler.pri) TEMPLATE = app CONFIG += qt thread warn_on debug console CONFIG -= app_bundle QT += network gui LANGUAGE = C++ TARGET = OverlayTest HEADERS = ../mumble/SharedMemory.h SOURCES = OverlayTest.cpp ../mumble/SharedMemory.cpp win32 { SOURCES += ../mumble/SharedMemory_win.cpp } else { SOURCES += ../mumble/SharedMemory_unix.cpp } VPATH += .. INCLUDEPATH += .. ../murmur ../mumble ../../3rdparty/celt-0.7.0-src/libcelt ../../3rdparty/speex-src/include mumble-1.3.4/src/tests/Emit.cpp0000664000175000017500000000376114010707274016204 0ustar builderbuilder#include #include #include #include "Timer.h" class Slotter : public QObject { Q_OBJECT; public: Slotter(QObject *p = NULL) : QObject(p) {}; public Q_SLOTS: virtual void slottest(int &res) { res+= 1; }; }; class Emitter : public QObject { Q_OBJECT; public: Slotter *s; Emitter(Slotter *s) : QObject(s) { this->s = s; }; boost::signal< void(int &) > bsig; Q_SIGNALS: void sig(int &); public Q_SLOTS: void emittest(int &val) { Q_EMIT sig(val); }; void directtest(int &val) { s->slottest(val); }; void boosttest(int &val) { bsig(val); } }; int main(int argc, char **argv) { QCoreApplication a(argc, argv); Timer t; Slotter *s = new Slotter(); Slotter *s2 = new Slotter(); Emitter *e = new Emitter(s); int v; v = 0; t.restart(); for (int i=0;i<1000000;++i) s->slottest(v); printf("Raw : %8lld %d\n", t.elapsed(), v); v = 0; t.restart(); for (int i=0;i<1000000;++i) e->directtest(v); printf("Direct: %8lld %d\n", t.elapsed(), v); v = 0; t.restart(); for (int i=0;i<1000000;++i) e->emittest(v); printf("NoSig : %8lld %d\n", t.elapsed(), v); QObject::connect(e, SIGNAL(sig(int &)), s, SLOT(slottest(int &))); v = 0; t.restart(); for (int i=0;i<1000000;++i) e->emittest(v); printf("Signal: %8lld %d\n", t.elapsed(), v); QObject::connect(e, SIGNAL(sig(int &)), s2, SLOT(slottest(int &))); v = 0; t.restart(); for (int i=0;i<1000000;++i) e->emittest(v); printf("2Slots: %8lld %d\n", t.elapsed(), v); v = 0; t.restart(); for (int i=0;i<1000000;++i) e->boosttest(v); printf("BNoSig: %8lld %d\n", t.elapsed(), v); e->bsig.connect(boost::bind(&Slotter::slottest, s, _1)); v = 0; t.restart(); for (int i=0;i<1000000;++i) e->boosttest(v); printf("Boost: %8lld %d\n", t.elapsed(), v); e->bsig.connect(boost::bind(&Slotter::slottest, s2, _1)); v = 0; t.restart(); for (int i=0;i<1000000;++i) e->boosttest(v); printf("2Boost: %8lld %d\n", t.elapsed(), v); } #include "Emit.moc" mumble-1.3.4/src/tests/TestLink.pro0000664000175000017500000000024314010707274017051 0ustar builderbuilderTEMPLATE =app CONFIG += qt thread warn_on debug console CONFIG -= app_bundle LANGUAGE = C++ TARGET = TestLink SOURCES = TestLink.cpp INCLUDEPATH += ../../plugins mumble-1.3.4/src/tests/tests.pro0000664000175000017500000000110714010707274016456 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . TEMPLATE = subdirs SUBDIRS += \ TestCrypt \ TestCryptographicHash \ TestCryptographicRandom \ TestPacketDataStream \ TestPasswordGenerator \ TestTimer \ TestXMLTools \ TestUnresolvedServerAddress \ TestServerAddress \ TestServerResolver \ TestSelfSignedCertificate \ TestSSLLocks \ TestFFDHE \ TestStdAbs mumble-1.3.4/src/tests/ProtoBuf.cpp0000664000175000017500000001275314010707274017047 0ustar builderbuilder/** * Protobuf binding benchmarks (serialisation, deserialization, ...). */ #include #include #include "Timer.h" #include "Message.h" #include "PacketDataStream.h" #include "ProtoBuf.pb.h" using namespace std; int main(int argc, char **argv) { QCoreApplication a(argc, argv); Timer t; unsigned char buff[1024]; Authenticate apb; QString n = QLatin1String("My Name"); QString p = QLatin1String("My Password"); int v; t.restart(); for (int i=0;i<1000000;++i) { MessageServerAuthenticate ma; Message *m = &ma; ma.uiSession = 1; ma.iVersion = -1; ma.qsUsername = n; ma.qsPassword = p; PacketDataStream out(buff, 256); m->messageToNetwork(out); PacketDataStream in(buff, out.size()); delete m->networkToMessage(in); v = out.size(); } printf("MsgBased : %8lld %d\n", t.elapsed(), v); t.restart(); for (int i=0;i<1000000;++i) { Authenticate apb; apb.set_version(-1); apb.set_session(1); apb.set_name(n.toStdString()); apb.set_pw(p.toStdString()); std::string str; Universal u; * (u.mutable_authenticate()) = apb; u.SerializeToString(&str); u.ParseFromString(str); const Authenticate &a = u.authenticate(); QString qn = QString::fromStdString(a.name()); QString qp = QString::fromStdString(a.pw()); v = str.length(); } printf("ProtoBuf : %8lld %d\n", t.elapsed(), v); t.restart(); for (int i=0;i<1000000;++i) { Universal u; Authenticate *apb = u.mutable_authenticate(); apb->set_version(-1); apb->set_session(1); apb->set_name(n.toStdString()); apb->set_pw(p.toStdString()); std::string str; u.SerializeToString(&str); u.ParseFromString(str); const Authenticate &a = u.authenticate(); QString qn = QString::fromStdString(a.name()); QString qp = QString::fromStdString(a.pw()); v = str.length(); } printf("PBDirect : %8lld %d\n", t.elapsed(), v); std::string sn = n.toStdString(); std::string sp = p.toStdString(); t.restart(); for (int i=0;i<1000000;++i) { Universal u; Authenticate *apb = u.mutable_authenticate(); apb->set_version(-1); apb->set_session(1); apb->set_name(sn); apb->set_pw(sp); std::string str; u.SerializeToString(&str); u.ParseFromString(str); const Authenticate &a = u.authenticate(); std::string nn = a.name(); std::string np = a.pw(); v = str.length(); } printf("PBStdStr : %8lld %d\n", t.elapsed(), v); t.restart(); for (int i=0;i<1000000;++i) { Universal u; Authenticate *apb = u.mutable_authenticate(); apb->set_version(-1); apb->set_session(1); apb->set_name(n.toStdString()); apb->set_pw(p.toStdString()); std::string str; v = u.ByteSize(); u.SerializeToArray(buff, v); u.ParseFromArray(buff, v); const Authenticate &a = u.authenticate(); QString qn = QString::fromStdString(a.name()); QString qp = QString::fromStdString(a.pw()); } printf("PBArray : %8lld %d\n", t.elapsed(), v); t.restart(); for (int i=0;i<1000000;++i) { Universal u; Authenticate *apb = u.MutableExtension(extauth); apb->set_version(-1); apb->set_session(1); apb->set_name(n.toStdString()); apb->set_pw(p.toStdString()); std::string str; v = u.ByteSize(); u.SerializeToArray(buff, v); u.ParseFromArray(buff, v); const Authenticate &a = u.GetExtension(extauth); QString qn = QString::fromStdString(a.name()); QString qp = QString::fromStdString(a.pw()); } printf("PBExt : %8lld %d\n", t.elapsed(), v); t.restart(); for (int i=0;i<1000000;++i) { Authenticate apb; apb.set_version(-1); apb.set_session(1); apb.set_name(n.toStdString()); apb.set_pw(p.toStdString()); v = apb.ByteSize(); apb.SerializeToArray(buff, v); apb.ParseFromArray(buff, v); apb.DiscardUnknownFields(); QString qn = QString::fromStdString(apb.name()); QString qp = QString::fromStdString(apb.pw()); } printf("PBNoWrap : %8lld %d\n", t.elapsed(), v); t.restart(); for (int i=0;i<1000000;++i) { LongUniversal u; Authenticate *apb = u.mutable_z(); apb->set_version(-1); apb->set_session(1); apb->set_name(n.toStdString()); apb->set_pw(p.toStdString()); std::string str; v = u.ByteSize(); u.SerializeToArray(buff, v); u.ParseFromArray(buff, v); const Authenticate &a = u.z(); QString qn = QString::fromStdString(a.name()); QString qp = QString::fromStdString(a.pw()); } printf("PBLong : %8lld %d\n", t.elapsed(), v); LongUniversal u; const LongUniversal::Reflection *r = u.GetReflection(); t.restart(); for (int i=0;i<1000000;++i) { u.Clear(); Authenticate *apb = u.mutable_z(); apb->set_version(-1); apb->set_session(1); apb->set_name(n.toStdString()); apb->set_pw(p.toStdString()); // std::string str; v = u.ByteSize(); u.SerializeToArray(buff, v); u.Clear(); u.ParseFromArray(buff, v); // u.DiscardUnknownFields(); // vector v; // r->ListFields(u, &v); // printf("%d\n", v.size()); if (u.has_a() || u.has_b() || u.has_c() || u.has_d() || u.has_e() || u.has_f() || u.has_g() || u.has_h() || u.has_i() || u.has_j() || u.has_k() || u.has_l() || u.has_m() || u.has_n() || u.has_o() || u.has_p() || u.has_q()) continue; Authenticate *a = u.mutable_z(); a->DiscardUnknownFields(); QString qn = QString::fromStdString(a->name()); QString qp = QString::fromStdString(a->pw()); } printf("PBCache : %8lld %d\n", t.elapsed(), v); t.restart(); for (int i=0;i<1000000;++i) { QString nn = QString::fromStdString(n.toStdString()); QString np = QString::fromStdString(p.toStdString()); } printf("QString : %8lld %d\n", t.elapsed(), v); } mumble-1.3.4/src/tests/Hash.pro0000664000175000017500000000026714010707274016205 0ustar builderbuilderTEMPLATE =app CONFIG += qt thread warn_on qtestlib debug LANGUAGE = C++ TARGET = Hash SOURCES = Hash.cpp Timer.cpp HEADERS = Timer.h VPATH += .. INCLUDEPATH += .. ../murmur ../mumble mumble-1.3.4/src/tests/TestPacketDataStream/0000775000175000017500000000000014010707274020610 5ustar builderbuildermumble-1.3.4/src/tests/TestPacketDataStream/TestPacketDataStream.cpp0000664000175000017500000000611114010707274025330 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include #include #include #include #include "PacketDataStream.h" #include "Message.h" class TestPacketDataStream : public QObject { Q_OBJECT private slots: void integer(); void integer_data(); void string(); void string_data(); void space(); void floating(); void floating_data(); void undersize(); }; void TestPacketDataStream::floating_data() { QTest::addColumn("value"); for (int i=1;i<256;i++) { double v = 1.0L / (1.0L * i); QTest::newRow("Positive") << v; QTest::newRow("Negative") << -v; } } void TestPacketDataStream::floating() { QFETCH(double, value); char buff[256]; double d; PacketDataStream out(buff, 256); out << value; PacketDataStream in(buff, out.size()); in >> d; QCOMPARE(value, d); QVERIFY(in.isValid()); QVERIFY(in.left() == 0); } void TestPacketDataStream::undersize() { QByteArray qba(32, 'Z'); char buff[256]; for (unsigned int i=0;i<32;i++) { PacketDataStream out(buff, i); out << qba; QCOMPARE(33-i, out.undersize()); QVERIFY(! out.isValid()); QVERIFY(out.left() == 0); } PacketDataStream out(buff, 33); out << qba; QCOMPARE(out.undersize(), 0U); QVERIFY(out.isValid()); QVERIFY(out.left() == 0); } void TestPacketDataStream::integer_data() { QTest::addColumn("value"); for (int i=0;i<64;i++) { quint64 v = 1ULL << i; QTest::newRow("Integer") << v; QTest::newRow("~Integer") << ~v; } } void TestPacketDataStream::integer() { QFETCH(quint64, value); char buff[256]; quint64 v; PacketDataStream out(buff, 256); out << value; PacketDataStream in(buff, out.size()); in >> v; QCOMPARE(value, v); QVERIFY(in.isValid()); QVERIFY(in.left() == 0); } void TestPacketDataStream::string_data() { QTest::addColumn("string"); QTest::newRow("Empty") << QString(""); QTest::newRow("Null") << QString(); QTest::newRow("Bærtur") << QString("Bærtur"); } void TestPacketDataStream::string() { QFETCH(QString, string); char buff[256]; QString v; PacketDataStream out(buff, 256); out << string; PacketDataStream in(buff, out.size()); in >> v; QCOMPARE(string, v); QVERIFY(in.isValid()); QVERIFY(in.left() == 0); } void TestPacketDataStream::space() { char buff[256]; for (int i=0;i<256;i++) buff[i]= 0x55; PacketDataStream out(buff, 1); char val = -2; out << val; QVERIFY(out.isValid()); QVERIFY(out.size() == 1); QVERIFY(out.left() == 0); QVERIFY(buff[1] == 0x55); out << val; QVERIFY(! out.isValid()); QVERIFY(out.size() == 1); QVERIFY(out.left() == 0); QVERIFY(buff[1] == 0x55); PacketDataStream in(buff, 1); char v; in >> v; QCOMPARE(v, val); QVERIFY(in.isValid()); QVERIFY(in.size() == 1); QVERIFY(in.left() == 0); in >> v; QVERIFY(! in.isValid()); QVERIFY(in.size() == 1); QVERIFY(in.left() == 0); } QTEST_MAIN(TestPacketDataStream) #include "TestPacketDataStream.moc" mumble-1.3.4/src/tests/TestPacketDataStream/TestPacketDataStream.pro0000664000175000017500000000054014010707274025346 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../test.pri) QT *= network TARGET = TestPacketDataStream SOURCES *= TestPacketDataStream.cpp mumble-1.3.4/src/tests/Benchmark.pro0000664000175000017500000000050514010707274017207 0ustar builderbuilderinclude(../mumble.pri) TEMPLATE = app CONFIG *= qt thread warn_on network qtestlib debug CONFIG -= app_bundle QT *= network xml LANGUAGE = C++ TARGET = Benchmark SOURCES *= Benchmark.cpp Timer.cpp CryptState.cpp HEADERS *= Timer.h CryptState.h VPATH *= .. INCLUDEPATH *= .. ../murmur ../mumble !win32 { LIBS *= -lcrypto } mumble-1.3.4/src/tests/TestUnresolvedServerAddress/0000775000175000017500000000000014010707274022256 5ustar builderbuildermumble-1.3.4/src/tests/TestUnresolvedServerAddress/TestUnresolvedServerAddress.cpp0000664000175000017500000000726114010707274030453 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include #include #include "UnresolvedServerAddress.h" class TestUnresolvedServerAddress : public QObject { Q_OBJECT private slots: void defaultCtor(); void isValid(); void ctor(); void caseInsensitive(); void equals(); void lessThan(); void qhash(); }; void TestUnresolvedServerAddress::defaultCtor() { UnresolvedServerAddress unresolved; QVERIFY(unresolved.hostname.isEmpty()); QVERIFY(unresolved.port == 0); QVERIFY(!unresolved.isValid()); } void TestUnresolvedServerAddress::isValid() { UnresolvedServerAddress invalid1; QVERIFY(!invalid1.isValid()); UnresolvedServerAddress invalid2(QString(), 0); QVERIFY(!invalid2.isValid()); UnresolvedServerAddress invalid3(QString(), 64738); QVERIFY(!invalid3.isValid()); UnresolvedServerAddress invalid4(QLatin1String("mumble.info"), 0); QVERIFY(!invalid4.isValid()); UnresolvedServerAddress valid(QLatin1String("mumble.info"), 443); QVERIFY(valid.isValid()); } void TestUnresolvedServerAddress::ctor() { UnresolvedServerAddress usa(QLatin1String("mumble.info"), 443); QCOMPARE(usa.hostname, QString::fromLatin1("mumble.info")); QCOMPARE(usa.port, static_cast(443)); } void TestUnresolvedServerAddress::caseInsensitive() { UnresolvedServerAddress a(QLatin1String("mumble.info"), 443); UnresolvedServerAddress b(QLatin1String("MUMBLE.INFO"), 443); UnresolvedServerAddress c(QLatin1String("MuMbLe.iNFo"), 443); QVERIFY(a == b); QVERIFY(a == c); } void TestUnresolvedServerAddress::equals() { UnresolvedServerAddress a1(QLatin1String("mumble.info"), 443); UnresolvedServerAddress a2(QLatin1String("mumble.info"), 443); UnresolvedServerAddress b(QLatin1String("mumble.info"), 64738); UnresolvedServerAddress c(QLatin1String("mumble.hive.no"), 80); QVERIFY(a1 == a2); QVERIFY(a1 != b); QVERIFY(a1 != c); QVERIFY(b != c); } void TestUnresolvedServerAddress::lessThan() { QList testdata; testdata << UnresolvedServerAddress(); testdata << UnresolvedServerAddress(QString(), 1); testdata << UnresolvedServerAddress(QString(), 999); testdata << UnresolvedServerAddress(QLatin1String("aaaaa"), 0); testdata << UnresolvedServerAddress(QLatin1String("baaaa"), 0); testdata << UnresolvedServerAddress(QLatin1String("baaaa"), 1); testdata << UnresolvedServerAddress(QLatin1String("maaaa"), 0); testdata << UnresolvedServerAddress(QLatin1String("maaaa"), 100); testdata << UnresolvedServerAddress(QLatin1String("maaaa"), 64738); testdata << UnresolvedServerAddress(QLatin1String("naaaa"), 64738); testdata << UnresolvedServerAddress(QLatin1String("zaaaa"), 0); testdata << UnresolvedServerAddress(QLatin1String("zaaaa"), 65535); QList sorted(testdata); std::sort(sorted.begin(), sorted.end()); int i = 0; foreach(const UnresolvedServerAddress &unresolved, sorted) { qWarning("%i -> %s:%i", i, qPrintable(unresolved.hostname), unresolved.port); i += 1; } QVERIFY(testdata == sorted); } void TestUnresolvedServerAddress::qhash() { UnresolvedServerAddress a1(QLatin1String("mumble.info"), 443); UnresolvedServerAddress a2(QLatin1String("mumble.info"), 443); UnresolvedServerAddress b(QLatin1String("mumble.info"), 64738); UnresolvedServerAddress c(QLatin1String("mumble.hive.no"), 80); QVERIFY(qHash(a1) == qHash(a2)); QVERIFY(qHash(a1) != qHash(b)); QVERIFY(qHash(a1) != qHash(c)); QVERIFY(qHash(b) != qHash(c)); } QTEST_MAIN(TestUnresolvedServerAddress) #include "TestUnresolvedServerAddress.moc" mumble-1.3.4/src/tests/TestUnresolvedServerAddress/TestUnresolvedServerAddress.pro0000664000175000017500000000064014010707274030463 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../test.pri) TARGET = TestUnresolvedServerAddress SOURCES *= TestUnresolvedServerAddress.cpp UnresolvedServerAddress.cpp HEADERS *= UnresolvedServerAddress.h mumble-1.3.4/src/tests/Emit.pro0000664000175000017500000000040014010707274016205 0ustar builderbuilderTEMPLATE = app CONFIG += qt thread warn_on release no_keywords CONFIG -= app_bundle LANGUAGE = C++ TARGET = Emit HEADERS = Timer.h SOURCES = Emit.cpp Timer.cpp VPATH += .. INCLUDEPATH += .. ../murmur ../mumble LIBS += -lboost_signals QMAKE_CXXFLAGS *= -O3 mumble-1.3.4/src/tests/TestSSLLocks/0000775000175000017500000000000014010707274017070 5ustar builderbuildermumble-1.3.4/src/tests/TestSSLLocks/TestSSLLocks.cpp0000664000175000017500000000550414010707274022075 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include #include #include "SSL.h" #include "QAtomicIntCompat.h" #include /// SSLRacer is a thread that runs operations on OpenSSL's /// RAND infrastructure, in an attempt to crash/segfault /// the test process. /// /// The thread can either query OpenSSL for random bytes, or /// seed the RAND system. This is controlled by the |seed| /// parameter to the constructor. class SSLRacer : public QThread { public: bool m_seed; QAtomicInt *m_running; SSLRacer(QAtomicInt *running, bool seed) : m_seed(seed) , m_running(running) { } void run() { unsigned char buf[64]; while (QAtomicIntLoad(*m_running) == 1) { for (int i = 0; i < 1024; i++) { if (m_seed) { RAND_seed(buf, sizeof(buf)); } else { RAND_bytes(buf, sizeof(buf)); } } } } }; class TestSSLLocks : public QObject { Q_OBJECT private slots: void initTestCase(); void cleanupTestCase(); void stress(); }; void TestSSLLocks::initTestCase() { // For OpenSSL < 1.1, if you comment out this line, // you'll be running OpenSSL without locking callbacks // enabled. That'll make this test fail by crashing/segfaulting. MumbleSSL::initialize(); } void TestSSLLocks::cleanupTestCase() { MumbleSSL::destroy(); } /// Stress test that our locking callbacks for OpenSSL are set up and /// working correctly. /// /// We do this by spawning a bunch of SSLStresser threads. Some of the /// threads will try to read random bytes in a tight loop. Other threads /// will, at the same time, try to add/seed random bytes to the OpenSSL /// RAND system. /// /// The idea is that without proper locking, the data races we're causing /// should quite quickly cause the process to crash. void TestSSLLocks::stress() { std::vector racers; QAtomicInt running(1); // Spawn 24 threads in total. 12 readers, and 12 writers. // Don't be too careful about cleaning up the threads. We'll either // pass or crash, so the threads will be cleaned up either way. int nthreads = 24; for (int i = 0; i < nthreads; i++) { bool seeder = i % 2; SSLRacer *racer = new SSLRacer(&running, seeder); racers.push_back(racer); racer->start(); } // Wait 2 seconds for a crash/segfault. // If we don't crash within 2 seconds, we expect // that our locking implementation works. QTest::qSleep(2000); // Signal to the racers that they should stop. running.fetchAndStoreOrdered(0); // Wait for all racers to complete. for (size_t i = 0; i < racers.size(); i++) { SSLRacer *racer = racers.at(i); racer->wait(); delete racer; } } QTEST_MAIN(TestSSLLocks) #include "TestSSLLocks.moc" mumble-1.3.4/src/tests/TestSSLLocks/TestSSLLocks.pro0000664000175000017500000000060114010707274022104 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../test.pri) QT += network TARGET = TestSSLLocks SOURCES *= SSL.cpp SSLLocks.cpp TestSSLLocks.cpp HEADERS *= SSL.h SSLLocks.h mumble-1.3.4/src/tests/Lock.cpp0000664000175000017500000000325714010707274016176 0ustar builderbuilder/** * Benchmark of different locking mechanisms; QMutex, PosixMutex, Silly * (int-flag). */ #include #include #include "Timer.h" // It's important this is high enough the process doesn't complete in // one timeslice. #define ITER 100000000 typedef QPair tr; class SillyLock { public: int counter; SillyLock(); void lock(); void unlock(); }; SillyLock::SillyLock() { counter = 0; } void SillyLock::lock() { if (counter == 0) counter = 1; else qFatal("Recursive lock"); } void SillyLock::unlock() { if (counter == 1) counter = 0; else qFatal("Nonlock-unlock"); } class PosixLock { public: pthread_mutex_t m; PosixLock(); void lock(); void unlock(); }; PosixLock::PosixLock() { pthread_mutex_init(&m, NULL); } void PosixLock::lock() { pthread_mutex_lock(&m); } void PosixLock::unlock() { pthread_mutex_unlock(&m); } template class SpeedTest { public: T &lock; SpeedTest(T &l) : lock(l) { } quint64 test() { Timer t; t.restart(); for (int i=0;i stqm(qm); SpeedTest stqmr(qmr); SpeedTest stsl(sl); SpeedTest stpl(pl); quint64 elapsed; elapsed = stsl.test(); qWarning("SillyLock: %8lld", elapsed); elapsed = stqm.test(); qWarning("QMutex : %8lld", elapsed); elapsed = stqmr.test(); qWarning("QMutexR : %8lld", elapsed); elapsed = stpl.test(); qWarning("PosixLock: %8lld", elapsed); } // #include "Lock.moc" mumble-1.3.4/src/tests/Collections.cpp0000664000175000017500000000417614010707274017565 0ustar builderbuilder/** * Benchmark of storage mechanisms; array, vector, Qt collections. */ #include #include #include "Timer.h" using namespace std; #define SL 10000 #define NE 300 template class QListSet { public: QList l; void insert(const T &i) { if (! l.contains(i)) l.append(i); } void remove(const T &i) { l.removeAll(i); } }; int main(int argc, char **argv) { Timer t; quint64 usins, usiter; int sum; { t.restart(); QSet s; s.reserve(NE); for (int i=0;i s; for (int i=0;i s; s.reserve(NE); for (int i=0;i s; for (int i=0;i s; for (int i=0;i. include(../test.pri) QT += network TARGET = TestCryptographicHash SOURCES *= SSL.cpp SSLLocks.cpp TestCryptographicHash.cpp CryptographicHash.cpp HEADERS *= SSL.h SSLLocks.h CryptographicHash.h mumble-1.3.4/src/tests/TestCryptographicHash/TestCryptographicHash.cpp0000664000175000017500000001266614010707274026056 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include #include #include #include "SSL.h" #include "CryptographicHash.h" class TestCryptographicHash : public QObject { Q_OBJECT private slots: void initTestCase(); void cleanupTestCase(); void sha1_data(); void sha1(); void sha256_data(); void sha256(); void staticHashVsObject(); void multipleResultCalls(); void addDataAfterResult(); }; void TestCryptographicHash::initTestCase() { MumbleSSL::initialize(); } void TestCryptographicHash::cleanupTestCase() { MumbleSSL::destroy(); } /// normalizeHash removes all whitespace from the hex-encoded hash string. static QString normalizeHash(QString str) { str.replace(QLatin1String(" "), QLatin1String("")); str.replace(QLatin1String("\t"), QLatin1String("")); str.replace(QLatin1String("\r"), QLatin1String("")); str.replace(QLatin1String("\n"), QLatin1String("")); return str; } /// normalizeHash removes all whitespace from the hex-encoded hash byte array. static QByteArray normalizeHash(QByteArray buf) { buf.replace(" ", ""); buf.replace("\t", ""); buf.replace("\r", ""); buf.replace("\n", ""); return buf; } void TestCryptographicHash::sha1_data() { QTest::addColumn("input"); QTest::addColumn("expectedOutput"); // First 4 SHA1 test vectors from http://www.di-mgt.com.au/sha_testvectors.html // ...The rest are a bit too excessive to put in a table-based test. QTest::newRow("1") << QString(QLatin1String("abc")) << normalizeHash(QLatin1String("a9993e36 4706816a ba3e2571 7850c26c 9cd0d89d")); QTest::newRow("2") << QString(QLatin1String("")) << normalizeHash(QLatin1String("da39a3ee 5e6b4b0d 3255bfef 95601890 afd80709")); QTest::newRow("3") << QString(QLatin1String("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq")) << normalizeHash(QLatin1String("84983e44 1c3bd26e baae4aa1 f95129e5 e54670f1")); QTest::newRow("4") << QString(QLatin1String("abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu")) << normalizeHash(QLatin1String("a49b2446 a02c645b f419f995 b6709125 3a04a259")); } void TestCryptographicHash::sha1() { QFETCH(QString, input); QFETCH(QString, expectedOutput); QByteArray outBuf = CryptographicHash::hash(input.toLatin1(), CryptographicHash::Sha1); QByteArray hexBuf = outBuf.toHex(); QString output = QString::fromLatin1(hexBuf); QCOMPARE(output, expectedOutput); } void TestCryptographicHash::sha256_data() { QTest::addColumn("input"); QTest::addColumn("expectedOutput"); // First 4 SHA256 test vectors from http://www.di-mgt.com.au/sha_testvectors.html // ...The rest are a bit too excessive to put in a table-based test. QTest::newRow("1") << QString(QLatin1String("abc")) << normalizeHash(QLatin1String("ba7816bf 8f01cfea 414140de 5dae2223 b00361a3 96177a9c b410ff61 f20015ad")); QTest::newRow("2") << QString(QLatin1String("")) << normalizeHash(QLatin1String("e3b0c442 98fc1c14 9afbf4c8 996fb924 27ae41e4 649b934c a495991b 7852b855")); QTest::newRow("3") << QString(QLatin1String("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq")) << normalizeHash(QLatin1String("248d6a61 d20638b8 e5c02693 0c3e6039 a33ce459 64ff2167 f6ecedd4 19db06c1")); QTest::newRow("4") << QString(QLatin1String("abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu")) << normalizeHash(QLatin1String("cf5b16a7 78af8380 036ce59e 7b049237 0b249b11 e8f07a51 afac4503 7afee9d1")); } void TestCryptographicHash::sha256() { QFETCH(QString, input); QFETCH(QString, expectedOutput); QByteArray outBuf = CryptographicHash::hash(input.toLatin1(), CryptographicHash::Sha256); QVERIFY(!outBuf.isEmpty()); QByteArray hexBuf = outBuf.toHex(); QString output = QString::fromLatin1(hexBuf); QCOMPARE(output, expectedOutput); } void TestCryptographicHash::staticHashVsObject() { CryptographicHash h(CryptographicHash::Sha256); h.addData(QByteArray("abc")); QByteArray objectResult = h.result(); QByteArray staticResult = CryptographicHash::hash(QByteArray("abc"), CryptographicHash::Sha256); QVERIFY(!objectResult.isEmpty()); QVERIFY(!staticResult.isEmpty()); QCOMPARE(objectResult, staticResult); } void TestCryptographicHash::multipleResultCalls() { CryptographicHash h(CryptographicHash::Sha256); h.addData(QByteArray("abc")); QByteArray result1 = h.result(); QByteArray result2 = h.result(); QByteArray result3 = h.result(); QVERIFY(!result1.isEmpty()); QVERIFY(!result2.isEmpty()); QVERIFY(!result3.isEmpty()); QCOMPARE(result1.toHex(), normalizeHash(QByteArray("ba7816bf 8f01cfea 414140de 5dae2223 b00361a3 96177a9c b410ff61 f20015ad"))); QCOMPARE(result1, result2); QCOMPARE(result1, result3); } void TestCryptographicHash::addDataAfterResult() { CryptographicHash h(CryptographicHash::Sha256); h.addData(QByteArray("abc")); QByteArray result1 = h.result(); QCOMPARE(result1.toHex(), normalizeHash(QByteArray("ba7816bf 8f01cfea 414140de 5dae2223 b00361a3 96177a9c b410ff61 f20015ad"))); // Adding data after getting the result of a // CryptographicHash is an error. h.addData(QByteArray("abc")); QByteArray result2 = h.result(); QVERIFY(result2.isEmpty()); } QTEST_MAIN(TestCryptographicHash) #include "TestCryptographicHash.moc" mumble-1.3.4/src/tests/Collections.pro0000664000175000017500000000030314010707274017567 0ustar builderbuilderTEMPLATE = app CONFIG += qt thread warn_on release CONFIG -= app_bundle LANGUAGE = C++ TARGET = Collections SOURCES = Collections.cpp Timer.cpp VPATH += .. INCLUDEPATH += .. ../murmur ../mumble mumble-1.3.4/src/tests/TestXMLTools/0000775000175000017500000000000014010707274017114 5ustar builderbuildermumble-1.3.4/src/tests/TestXMLTools/TestXMLTools.cpp0000664000175000017500000003021314010707274022140 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include #include #include #include #include #include "XMLTools.h" class TestXMLTools : public QObject { Q_OBJECT public: TestXMLTools(QObject *parent=0); private slots: void testParseExtractBody(); void testParseConvertStyleBold(); void testParseConvertStyleUnderline(); void testParseConvertStyleItalic(); void testParseKeepTags(); void testParseDropEmptyFirstParagraphs(); void testUndupNoopB(); void testUndupNoopU(); void testUndupNoopI(); void testUndupNoopA(); void testUndupSimpleB(); void testUndupSimpleU(); void testUndupSimpleI(); void testUndupSimpleA(); void testUndupMixedBU(); void testUndupMixedBUIA(); void testUndupWithSpace(); void testUndupAnchor(); void testUndupLinkSameHref(); void testUndupLinkDifferingHref(); void testUndupNoRootUndupTag(); void testUndupUndupTagsRemoval(); void testUndupStandard(); // void testUndupInvalidXml1(); private: QString doParse(QString input); QString doUnduplicate(QString input); }; TestXMLTools::TestXMLTools(QObject *parent) : QObject(parent) { } QString TestXMLTools::doParse(QString input) { QXmlStreamReader reader(input); QBuffer outBuf; QXmlStreamWriter writerOut(&outBuf); outBuf.open(QIODevice::WriteOnly); int paragraphs = 0; QMap pstyle; XMLTools::recurseParse(reader, writerOut, paragraphs, pstyle); outBuf.close(); return QString(outBuf.data()); } void TestXMLTools::testParseExtractBody() { QCOMPARE(doParse(QLatin1String("one")), QLatin1String("one")); QCOMPARE(doParse(QLatin1String("one")), QLatin1String("one")); QCOMPARE(doParse(QLatin1String("tttone")), QLatin1String("one")); QCOMPARE(doParse(QLatin1String("one")), QLatin1String("one")); } void TestXMLTools::testParseConvertStyleBold() { // The numeric values for font-weight provide a more granular option to specify boldness. // On fonts with two boldness levels (normal and bold) this is fine (100-500, 600-900). // For fonts wiht more boldness levels, the conversion we do here from a weight value to a tag is problematic. // http://doc.qt.io/qt-4.8/stylesheet-reference.html#list-of-property-types // https://developer.mozilla.org/en-US/docs/Web/CSS/font-weight QCOMPARE(doParse(QLatin1String("one")), QLatin1String("one")); QCOMPARE(doParse(QLatin1String("one")), QLatin1String("one")); QCOMPARE(doParse(QLatin1String("one")), QLatin1String("one")); QCOMPARE(doParse(QLatin1String("one")), QLatin1String("one")); QCOMPARE(doParse(QLatin1String("one")), QLatin1String("one")); QCOMPARE(doParse(QLatin1String("one")), QLatin1String("one")); QCOMPARE(doParse(QLatin1String("one")), QLatin1String("one")); QCOMPARE(doParse(QLatin1String("one")), QLatin1String("one")); QCOMPARE(doParse(QLatin1String("one")), QLatin1String("one")); QCOMPARE(doParse(QLatin1String("one")), QLatin1String("one")); // These currently fail // QCOMPARE(doParse(QLatin1String("one")), QLatin1String("one")); // QCOMPARE(doParse(QLatin1String("one")), QLatin1String("one")); // QCOMPARE(doParse(QLatin1String("one")), QLatin1String("one")); // QCOMPARE(doParse(QLatin1String("one")), QLatin1String("one")); } void TestXMLTools::testParseConvertStyleUnderline() { QCOMPARE(doParse(QLatin1String("one")), QLatin1String("one")); // We only convert spans, so this will not create a u tag QCOMPARE(doParse(QLatin1String("one")), QLatin1String("one")); } void TestXMLTools::testParseConvertStyleItalic() { QCOMPARE(doParse(QLatin1String("one")), QLatin1String("one")); } void TestXMLTools::testParseKeepTags() { QCOMPARE(doParse(QLatin1String("onetwothree")), QLatin1String("onetwothree")); QCOMPARE(doParse(QLatin1String("one")), QLatin1String("one")); } void TestXMLTools::testParseDropEmptyFirstParagraphs() { QCOMPARE(doParse(QLatin1String("

    one

    ")), QLatin1String("

    one

    ")); QCOMPARE(doParse(QLatin1String("

    one

    ")), QLatin1String("

    one

    ")); QCOMPARE(doParse(QLatin1String("

    one

    ")), QLatin1String("

    one

    ")); QCOMPARE(doParse(QLatin1String("

    one
    ")), QLatin1String("
    one
    ")); //
    would be invalid XML. It is not dropped "correctly". // QCOMPARE(doParse(QLatin1String("


    one

    ")), QLatin1String("

    one

    ")); // This is different from what is expected from a comment in the method being tested. It says // contents of empty paragraph would be dropped as well, but the br/space persists. QCOMPARE(doParse(QLatin1String("


    one

    ")), QLatin1String("

    one

    ")); QCOMPARE(doParse(QLatin1String("


    one

    ")), QLatin1String("

    one

    ")); QCOMPARE(doParse(QLatin1String("

    one

    ")), QLatin1String("

    one

    ")); } QString TestXMLTools::doUnduplicate(QString input) { QXmlStreamReader reader(input); QBuffer outBuf; QXmlStreamWriter writerOut(&outBuf); outBuf.open(QIODevice::WriteOnly); XMLTools::unduplicateTags(reader, writerOut); outBuf.close(); return QString(outBuf.data()); } void TestXMLTools::testUndupNoopB() { QCOMPARE(doUnduplicate(QLatin1String("test")), QLatin1String("test")); } void TestXMLTools::testUndupNoopU() { QCOMPARE(doUnduplicate(QLatin1String("test")), QLatin1String("test")); } void TestXMLTools::testUndupNoopI() { QCOMPARE(doUnduplicate(QLatin1String("test")), QLatin1String("test")); } void TestXMLTools::testUndupNoopA() { QCOMPARE(doUnduplicate(QLatin1String("test")), QLatin1String("test")); } void TestXMLTools::testUndupSimpleB() { QCOMPARE(doUnduplicate(QLatin1String("onetwo")), QLatin1String("onetwo")); } void TestXMLTools::testUndupSimpleU() { QCOMPARE(doUnduplicate(QLatin1String("onetwo")), QLatin1String("onetwo")); } void TestXMLTools::testUndupSimpleI() { QCOMPARE(doUnduplicate(QLatin1String("onetwo")), QLatin1String("onetwo")); } void TestXMLTools::testUndupSimpleA() { QCOMPARE(doUnduplicate(QLatin1String("onetwo")), QLatin1String("onetwo")); } void TestXMLTools::testUndupWithSpace() { QCOMPARE(doUnduplicate(QLatin1String("one two")), QLatin1String("one two")); } void TestXMLTools::testUndupMixedBU() { QCOMPARE(doUnduplicate(QLatin1String("onetwo")), QLatin1String("onetwo")); } void TestXMLTools::testUndupMixedBUIA() { QCOMPARE(doUnduplicate(QLatin1String("onetwo")), QLatin1String("onetwo")); } void TestXMLTools::testUndupAnchor() { QCOMPARE(doUnduplicate(QLatin1String("onetwo")), QLatin1String("onetwo")); } void TestXMLTools::testUndupLinkSameHref() { QCOMPARE(doUnduplicate(QLatin1String("onetwo")), QLatin1String("onetwo")); QCOMPARE(doUnduplicate(QLatin1String("onetwo")), QLatin1String("onetwo")); } void TestXMLTools::testUndupLinkDifferingHref() { QCOMPARE(doUnduplicate(QLatin1String("onetwo")), QLatin1String("onetwo")); QCOMPARE(doUnduplicate(QLatin1String("onetwo")), QLatin1String("onetwo")); QCOMPARE(doUnduplicate(QLatin1String("onetwo")), QLatin1String("onetwo")); QCOMPARE(doUnduplicate(QLatin1String("onetwo")), QLatin1String("onetwo")); } void TestXMLTools::testUndupNoRootUndupTag() { QCOMPARE(doUnduplicate(QLatin1String("onetwo")), QLatin1String("onetwo")); QCOMPARE(doUnduplicate(QLatin1String("onetwo")), QLatin1String("onetwo")); } void TestXMLTools::testUndupUndupTagsRemoval() { QCOMPARE(doUnduplicate(QLatin1String("onetwo")), QLatin1String("onetwo")); } void TestXMLTools::testUndupStandard() { QCOMPARE(doUnduplicate(QLatin1String("bold with italic")), QLatin1String("bold with italic")); QCOMPARE(doUnduplicate(QLatin1String("bold with italic")), QLatin1String("bold with italic")); QCOMPARE(doUnduplicate(QLatin1String("test")), QLatin1String("test")); QCOMPARE(doUnduplicate(QLatin1String("bold with italic")), QLatin1String("bold with italic")); } // Will warn and fail. //void TestXMLTools::testUndupInvalidXml1() { // QCOMPARE(doUnduplicate(QLatin1String("bold with italic")), QLatin1String("bold with italic")); //} QTEST_MAIN(TestXMLTools) #include "TestXMLTools.moc" mumble-1.3.4/src/tests/TestXMLTools/TestXMLTools.pro0000664000175000017500000000054414010707274022162 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../test.pri) TARGET = TestXMLTools HEADERS *= XMLTools.h SOURCES *= TestXMLTools.cpp XMLTools.cpp mumble-1.3.4/src/tests/ProtoBuf.proto0000664000175000017500000000251614010707274017424 0ustar builderbuilderoption optimize_for = SPEED; message Authenticate { optional uint32 session = 1; required sint32 version = 2; required string name = 3; optional string pw = 4; } message SomethingElse { required sint32 thingy = 1; } message Universal { extensions 5 to max; optional Authenticate authenticate = 2; optional SomethingElse somethingelse = 3; } extend Universal { optional Authenticate extauth = 5; optional SomethingElse extelse = 6; } message LongUniversal { optional Authenticate authenticate = 2; optional SomethingElse somethingelse = 3; optional Authenticate a = 4; optional Authenticate b = 5; optional Authenticate c = 6; optional Authenticate d = 7; optional Authenticate e = 8; optional Authenticate f = 9; optional Authenticate g = 10; optional Authenticate h = 11; optional Authenticate i = 12; optional Authenticate j = 13; optional Authenticate k = 14; optional Authenticate l = 15; optional Authenticate m = 16; optional Authenticate n = 17; optional Authenticate o = 18; optional Authenticate p = 19; optional Authenticate q = 20; optional Authenticate r = 21; optional Authenticate s = 22; optional Authenticate t = 23; optional Authenticate u = 24; optional Authenticate v = 25; optional Authenticate w = 26; optional Authenticate x = 27; optional Authenticate y = 28; optional Authenticate z = 29; } mumble-1.3.4/src/tests/Resample.pro0000664000175000017500000000203414010707274017064 0ustar builderbuilderinclude(../../qmake/compiler.pri) TEMPLATE = app CONFIG += qt thread warn_on release qtestlib no_keywords console CONFIG -= app_bundle LANGUAGE = C++ TARGET = Resample SOURCES = Resample.cpp Timer.cpp HEADERS = Timer.h VPATH += .. INCLUDEPATH *= .. ../../3rdparty/speex-src/include ../../3rdparty/speex-src/libspeex ../../3rdparty/speex-build LIBS *= -lspeex win32 { CONFIG(intelcpp) { LIBS *= -l"\Program Files (x86)\Intel/Compiler\11.0\075\cpp\ipp\ia32\lib\ippsemerged" LIBS *= -l"\Program Files (x86)\Intel/Compiler\11.0\075\cpp\ipp\ia32\lib\ippsmerged" LIBS *= -l"\Program Files (x86)\Intel/Compiler\11.0\075\cpp\ipp\ia32\lib\ippsremerged" LIBS *= -l"\Program Files (x86)\Intel/Compiler\11.0\075\cpp\ipp\ia32\lib\ippsrmerged" LIBS *= -l"\Program Files (x86)\Intel/Compiler\11.0\075\cpp\ipp\ia32\lib\ippcorel" } } CONFIG(debug, debug|release) { QMAKE_LIBDIR = ../../debug $$QMAKE_LIBDIR DESTDIR = ../../debug } CONFIG(release, debug|release) { QMAKE_LIBDIR = ../../release $$QMAKE_LIBDIR DESTDIR = ../../release } mumble-1.3.4/src/tests/TestSelfSignedCertificate/0000775000175000017500000000000014010707274021621 5ustar builderbuildermumble-1.3.4/src/tests/TestSelfSignedCertificate/TestSelfSignedCertificate.cpp0000664000175000017500000000414314010707274027355 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include #include #include "SSL.h" #include "SelfSignedCertificate.h" class TestSelfSignedCertificate : public QObject { Q_OBJECT private slots: void initTestCase(); void cleanupTestCase(); void exerciseClientCert(); void exerciseServerCert(); }; void TestSelfSignedCertificate::initTestCase() { MumbleSSL::initialize(); } void TestSelfSignedCertificate::cleanupTestCase() { MumbleSSL::destroy(); } void TestSelfSignedCertificate::exerciseClientCert() { QSslCertificate cert; QSslKey key; bool ok = SelfSignedCertificate::generateMumbleCertificate(QLatin1String("Test"), QLatin1String("test@test.test"), cert, key); QCOMPARE(ok, true); QCOMPARE(cert.isNull(), false); QCOMPARE(key.isNull(), false); // Test that certificates are auto-generated correctly ok = SelfSignedCertificate::generateMumbleCertificate(QString(), QString(), cert, key); QCOMPARE(ok, true); QCOMPARE(cert.isNull(), false); QCOMPARE(key.isNull(), false); // Test that users can create certificates without an email // address set. ok = SelfSignedCertificate::generateMumbleCertificate(QLatin1String("John Doe"), QString(), cert, key); QCOMPARE(ok, true); QCOMPARE(cert.isNull(), false); QCOMPARE(key.isNull(), false); // Test that it's possible to create a client certificate with // both a name and an email. ok = SelfSignedCertificate::generateMumbleCertificate(QLatin1String("John Doe"), QLatin1String("john@doe.family"), cert, key); QCOMPARE(ok, true); QCOMPARE(cert.isNull(), false); QCOMPARE(key.isNull(), false); } void TestSelfSignedCertificate::exerciseServerCert() { QSslCertificate cert; QSslKey key; bool ok = SelfSignedCertificate::generateMurmurV2Certificate(cert, key); QCOMPARE(ok, true); QCOMPARE(cert.isNull(), false); QCOMPARE(key.isNull(), false); } QTEST_MAIN(TestSelfSignedCertificate) #include "TestSelfSignedCertificate.moc" mumble-1.3.4/src/tests/TestSelfSignedCertificate/TestSelfSignedCertificate.pro0000664000175000017500000000075414010707274027377 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../test.pri) include(../../../qmake/qt.pri) QT *= network TARGET = TestSelfSignedCertificate SOURCES *= SSL.cpp SSLLocks.cpp TestSelfSignedCertificate.cpp SelfSignedCertificate.cpp HEADERS *= SSL.h SSLLocks.h SelfSignedCertificate.h mumble-1.3.4/src/tests/TestFFDHE/0000775000175000017500000000000014010707274016247 5ustar builderbuildermumble-1.3.4/src/tests/TestFFDHE/TestFFDHE.pro0000664000175000017500000000136014010707274020445 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../test.pri) QT += network # Check for QSslDiffieHellmanParameters availability, and define # USE_QSSLDIFFIEHELLMANPARAMETERS preprocessor if available. # # Can be disabled with no-qssldiffiehellmanparameters. !CONFIG(no-qssldiffiehellmanparameters):exists($$[QT_INSTALL_HEADERS]/QtNetwork/QSslDiffieHellmanParameters) { DEFINES += USE_QSSLDIFFIEHELLMANPARAMETERS } TARGET = TestFFDHE SOURCES *= SSL.cpp SSLLocks.cpp FFDHE.cpp TestFFDHE.cpp HEADERS *= SSL.h SSLLocks.h FFDHE.h FFDHETable.h mumble-1.3.4/src/tests/TestFFDHE/TestFFDHE.cpp0000664000175000017500000000463414010707274020436 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include #include #if defined(USE_QSSLDIFFIEHELLMANPARAMETERS) # include #endif #include "SSL.h" #include "FFDHE.h" class TestFFDHE : public QObject { Q_OBJECT private slots: void initTestCase(); void cleanupTestCase(); #if defined(USE_QSSLDIFFIEHELLMANPARAMETERS) void exercise_data(); void exercise(); void namedGroupsMethod(); #endif }; void TestFFDHE::initTestCase() { MumbleSSL::initialize(); } void TestFFDHE::cleanupTestCase() { MumbleSSL::destroy(); } #if defined(USE_QSSLDIFFIEHELLMANPARAMETERS) void TestFFDHE::exercise_data() { QTest::addColumn("name"); QTest::addColumn("expectedToWork"); QTest::newRow("ffdhe2048") << QString(QLatin1String("ffdhe2048")) << true; QTest::newRow("ffdhe3072") << QString(QLatin1String("ffdhe3072")) << true; QTest::newRow("ffdhe4096") << QString(QLatin1String("ffdhe4096")) << true; QTest::newRow("ffdhe6144") << QString(QLatin1String("ffdhe6144")) << true; QTest::newRow("ffdhe8192") << QString(QLatin1String("ffdhe8192")) << true; QTest::newRow("ffdhe2048_upper") << QString(QLatin1String("FFDHE2048")) << true; QTest::newRow("ffdhe2048_random") << QString(QLatin1String("fFdHe2048")) << true; QTest::newRow("noname") << QString(QLatin1String("")) << false; QTest::newRow("typo") << QString(QLatin1String("ffdhe2047")) << false; QTest::newRow("trailingspace") << QString(QLatin1String("ffdhe2048 ")) << false; } static bool tryFFDHELookupByName(QString name) { bool ok = true; QByteArray pem = FFDHE::PEMForNamedGroup(name); if (pem.isEmpty() || pem.isNull()) { ok = false; } if (ok) { QSslDiffieHellmanParameters dh = QSslDiffieHellmanParameters::fromEncoded(pem, QSsl::Pem); ok = dh.isValid(); if (!ok) { qWarning("QSslDiffieHellman error: %s", qPrintable(dh.errorString())); } } return ok; } void TestFFDHE::exercise() { QFETCH(QString, name); QFETCH(bool, expectedToWork); QCOMPARE(tryFFDHELookupByName(name), expectedToWork); } void TestFFDHE::namedGroupsMethod() { foreach (QString name, FFDHE::NamedGroups()) { QCOMPARE(tryFFDHELookupByName(name), true); } } #endif QTEST_MAIN(TestFFDHE) #include "TestFFDHE.moc" mumble-1.3.4/src/tests/TestCryptographicRandom/0000775000175000017500000000000014010707274021412 5ustar builderbuildermumble-1.3.4/src/tests/TestCryptographicRandom/TestCryptographicRandom.cpp0000664000175000017500000000442614010707274026743 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include #include #include "SSL.h" #include "CryptographicRandom.h" #include #include #include class TestCryptographicRandom : public QObject { Q_OBJECT private slots: void initTestCase(); void cleanupTestCase(); void fillBuffer(); void uint32(); void uniform(); }; void TestCryptographicRandom::initTestCase() { MumbleSSL::initialize(); } void TestCryptographicRandom::cleanupTestCase() { MumbleSSL::destroy(); } // Verify the entropy of the data returned by the random source // by zlib compressing it and ensuring the compressed size is at // least 99% of the size of the input data. // // The inspiration for this check is from the rand_test.go file // for Go standard library's crypt/rand package: // https://golang.org/src/crypto/rand/rand_test.go bool verifyEntropy(unsigned char *buf, int len) { QByteArray flated = qCompress(buf, len); return (flated.size() >= ((len * 99) / 100)); } void TestCryptographicRandom::fillBuffer() { const int buflen = 1000000; for (int i = 0; i < 10; i++) { unsigned char *buf = reinterpret_cast(calloc(buflen, 1)); CryptographicRandom::fillBuffer(buf, buflen); QVERIFY(verifyEntropy(buf, buflen)); free(buf); } } void TestCryptographicRandom::uint32() { const int buflen = 1000000; for (int i = 0; i < 10; i++) { unsigned char *buf = reinterpret_cast(calloc(buflen, 1)); int niter = buflen / sizeof(uint32_t); for (int j = 0; j < niter; j++) { int off = j * sizeof(uint32_t); uint32_t val = CryptographicRandom::uint32(); buf[off] = val & 0xff; buf[off+1] = (val >> 8) & 0xff; buf[off+2] = (val >> 16) & 0xff; buf[off+3] = (val >> 24) & 0xff; } QVERIFY(verifyEntropy(buf, buflen)); free(buf); } } void TestCryptographicRandom::uniform() { for (uint32_t upperBound = 0; upperBound < 10000; upperBound++) { uint32_t val = CryptographicRandom::uniform(upperBound); QVERIFY(val <= upperBound); } } QTEST_MAIN(TestCryptographicRandom) #include "TestCryptographicRandom.moc" mumble-1.3.4/src/tests/TestCryptographicRandom/TestCryptographicRandom.pro0000664000175000017500000000106514010707274026755 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../test.pri) QT += network TARGET = TestCryptographicRandom SOURCES *= SSL.cpp SSLLocks.cpp TestCryptographicRandom.cpp CryptographicRandom.cpp arc4random_uniform.cpp HEADERS *= SSL.h SSLLocks.h CryptographicHash.h VPATH *= ../../../3rdparty/arc4random-src INCLUDEPATH *= ../../../3rdparty/arc4random-src mumble-1.3.4/src/tests/TestLink.cpp0000664000175000017500000000632714010707274017044 0ustar builderbuilder/** * Test-/Exampleprogram which links against the Mumble link plugin to send * positional data. */ // Allow use of wcsncpy without warnings #define _CRT_SECURE_NO_WARNINGS #include #ifdef WIN32 #include #else #include #include #endif struct LinkedMem { #ifdef WIN32 UINT32 uiVersion; DWORD uiTick; #else uint32_t uiVersion; uint32_t uiTick; #endif float fAvatarPosition[3]; float fAvatarFront[3]; float fAvatarTop[3]; wchar_t name[256]; float fCameraPosition[3]; float fCameraFront[3]; float fCameraTop[3]; wchar_t identity[256]; #ifdef WIN32 UINT32 context_len; #else uint32_t context_len; #endif unsigned char context[256]; wchar_t description[2048]; }; LinkedMem *lm = NULL; void initMumble() { #ifdef WIN32 HANDLE hMapObject = OpenFileMappingW(FILE_MAP_ALL_ACCESS, FALSE, L"MumbleLink"); if (hMapObject == NULL) return; lm = (LinkedMem *) MapViewOfFile(hMapObject, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(LinkedMem)); if (lm == NULL) { CloseHandle(hMapObject); hMapObject = NULL; return; } #else char memname[256]; snprintf(memname, 256, "/MumbleLink.%d", getuid()); int shmfd = shm_open(memname, O_RDWR, S_IRUSR | S_IWUSR); if (shmfd < 0) { return; } lm = (LinkedMem *)(mmap(NULL, sizeof(struct LinkedMem), PROT_READ | PROT_WRITE, MAP_SHARED, shmfd,0)); if (lm == (void *)(-1)) { lm = NULL; return; } #endif } void updateMumble() { if (! lm) return; if (lm->uiVersion != 2) { wcsncpy(lm->name, L"TestLink", 256); wcsncpy(lm->description, L"TestLink is a test of the Link plugin.", 2048); lm->uiVersion = 2; } lm->uiTick++; // Left handed coordinate system. // X positive towards "right". // Y positive towards "up". // Z positive towards "into screen". // // 1 unit = 1 meter // Unit vector pointing out of the avatars eyes (here Front looks into scene). lm->fAvatarFront[0] = 0.0f; lm->fAvatarFront[1] = 0.0f; lm->fAvatarFront[2] = 1.0f; // Unit vector pointing out of the top of the avatars head (here Top looks straight up). lm->fAvatarTop[0] = 0.0f; lm->fAvatarTop[1] = 1.0f; lm->fAvatarTop[2] = 0.0f; // Position of the avatar (here standing slightly off the origin) lm->fAvatarPosition[0] += 0.001f; lm->fAvatarPosition[1] = 0.0f; lm->fAvatarPosition[2] = 0.5f; // Same as avatar but for the camera. lm->fCameraPosition[0] = 0.0f; lm->fCameraPosition[1] = 0.0f; lm->fCameraPosition[2] = 0.0f; lm->fCameraFront[0] = 0.0f; lm->fCameraFront[1] = 0.0f; lm->fCameraFront[2] = 1.0f; lm->fCameraTop[0] = 0.0f; lm->fCameraTop[1] = 1.0f; lm->fCameraTop[2] = 0.0f; // Identifier which uniquely identifies a certain player in a context (e.g. the ingame Name). wcsncpy(lm->identity, L"Unique ID", 256); // Context should be equal for players which should be able to hear each other positional and // differ for those who shouldn't (e.g. it could contain the server+port and team) memcpy(lm->context, "ContextBlob\x00\x01\x02\x03\x04", 16); lm->context_len = 16; } int main(int argc, char **argv) { QCoreApplication a(argc, argv); initMumble(); if (lm == NULL) qFatal("No Link!"); lm->fAvatarPosition[0]; while (true) { qWarning("Tick!"); updateMumble(); #ifdef WIN32 Sleep(100); #else usleep(100*1000); #endif } } mumble-1.3.4/src/tests/TestStdAbs/0000775000175000017500000000000014010707274016613 5ustar builderbuildermumble-1.3.4/src/tests/TestStdAbs/TestStdAbs.cpp0000664000175000017500000000152714010707274021344 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include #include #include /// Test the std::abs works with floats. /// In fixing mumble-voip/mumble#3281, I /// stumbled upon http://eigen.tuxfamily.org/bz/show_bug.cgi?id=619. /// It seems that, on some platforms, std::abs /// might not call through to the correct libc /// function. /// Test that it works for us. class TestStdAbs : public QObject { Q_OBJECT private slots: void floatWorks(); }; void TestStdAbs::floatWorks() { const float in = -1.5; float out = std::abs(in); QVERIFY(out > 1.2 && out < 1.8); } QTEST_MAIN(TestStdAbs) #include "TestStdAbs.moc" mumble-1.3.4/src/tests/TestStdAbs/TestStdAbs.pro0000664000175000017500000000047514010707274021363 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../test.pri) TARGET = TestStdAbs SOURCES *= TestStdAbs.cpp mumble-1.3.4/src/tests/TestServerAddress/0000775000175000017500000000000014010707274020207 5ustar builderbuildermumble-1.3.4/src/tests/TestServerAddress/TestServerAddress.cpp0000664000175000017500000000614414010707274024334 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include #include #include #include "HostAddress.h" #include "ServerAddress.h" class TestServerAddress : public QObject { Q_OBJECT private slots: void defaultCtor(); void isValid(); void ctor(); void equals(); void lessThan(); void qhash(); }; void TestServerAddress::defaultCtor() { ServerAddress sa; QVERIFY(sa.host == HostAddress()); QVERIFY(sa.port == 0); QVERIFY(!sa.isValid()); } void TestServerAddress::isValid() { ServerAddress invalid1; QVERIFY(!invalid1.isValid()); ServerAddress invalid2(HostAddress(), 0); QVERIFY(!invalid2.isValid()); ServerAddress invalid3(HostAddress(), 64738); QVERIFY(!invalid3.isValid()); ServerAddress invalid4(HostAddress(QHostAddress("127.0.0.1")), 0); QVERIFY(!invalid4.isValid()); ServerAddress valid(HostAddress(QHostAddress("127.0.0.1")), 443); QVERIFY(valid.isValid()); } void TestServerAddress::ctor() { ServerAddress sa(HostAddress(QHostAddress("127.0.0.1")), 443); QCOMPARE(sa.host, HostAddress(QHostAddress("127.0.0.1"))); QCOMPARE(sa.port, static_cast(443)); } void TestServerAddress::equals() { ServerAddress a1(HostAddress(QHostAddress("127.0.0.1")), 443); ServerAddress a2(HostAddress(QHostAddress("127.0.0.1")), 443); ServerAddress b(HostAddress(QHostAddress("127.0.0.1")), 64738); ServerAddress c(HostAddress(QHostAddress("10.0.0.1")), 80); QVERIFY(a1 == a2); QVERIFY(a1 != b); QVERIFY(a1 != c); QVERIFY(b != c); } void TestServerAddress::lessThan() { QList testdata; testdata << ServerAddress(); testdata << ServerAddress(HostAddress(), 1); testdata << ServerAddress(HostAddress(), 999); testdata << ServerAddress(HostAddress(QHostAddress("0.0.0.1")), 0); testdata << ServerAddress(HostAddress(QHostAddress("0.0.0.2")), 0); testdata << ServerAddress(HostAddress(QHostAddress("0.0.0.2")), 1); testdata << ServerAddress(HostAddress(QHostAddress("80.0.0.1")), 0); testdata << ServerAddress(HostAddress(QHostAddress("80.0.0.1")), 100); testdata << ServerAddress(HostAddress(QHostAddress("80.0.0.1")), 64738); testdata << ServerAddress(HostAddress(QHostAddress("80.0.0.2")), 64738); testdata << ServerAddress(HostAddress(QHostAddress("255.255.255.255")), 0); testdata << ServerAddress(HostAddress(QHostAddress("255.255.255.255")), 65535); QList sorted(testdata); std::sort(sorted.begin(), sorted.end()); QVERIFY(testdata == sorted); } void TestServerAddress::qhash() { ServerAddress a1(HostAddress(QHostAddress("127.0.0.1")), 443); ServerAddress a2(HostAddress(QHostAddress("127.0.0.1")), 443); ServerAddress b(HostAddress(QHostAddress("127.0.0.1")), 64738); ServerAddress c(HostAddress(QHostAddress("10.0.0.1")), 80); QVERIFY(qHash(a1) == qHash(a2)); QVERIFY(qHash(a1) != qHash(b)); QVERIFY(qHash(a1) != qHash(c)); QVERIFY(qHash(b) != qHash(c)); } QTEST_MAIN(TestServerAddress) #include "TestServerAddress.moc" mumble-1.3.4/src/tests/TestServerAddress/TestServerAddress.pro0000664000175000017500000000064514010707274024352 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../test.pri) QT += network TARGET = TestServerAddress SOURCES *= TestServerAddress.cpp ServerAddress.cpp HostAddress.cpp HEADERS *= ServerAddress.h HostAddress.h mumble-1.3.4/src/tests/OverlayTest.cpp0000664000175000017500000001576414010707274017575 0ustar builderbuilder/** * Overlay drawing test application. */ #include #include #include #include "SharedMemory.h" #include "../../overlay/overlay.h" #include "Timer.h" #include #ifdef Q_OS_WIN #include #endif class OverlayWidget : public QWidget { Q_OBJECT protected: QImage img; OverlayMsg om; QLocalSocket *qlsSocket; SharedMemory2 *smMem; QTimer *qtTimer; QRect qrActive; QTime qtWall; unsigned int iFrameCount; int iLastFpsUpdate; unsigned int uiWidth, uiHeight; void resizeEvent(QResizeEvent *); void paintEvent(QPaintEvent *); void init(const QSize &); void detach(); void keyPressEvent(QKeyEvent *); protected slots: void connected(); void disconnected(); void readyRead(); void error(QLocalSocket::LocalSocketError); void update(); public: OverlayWidget(QWidget *p = NULL); }; OverlayWidget::OverlayWidget(QWidget *p) : QWidget(p) { qlsSocket = NULL; smMem = NULL; uiWidth = uiHeight = 0; setFocusPolicy(Qt::StrongFocus); setFocus(); qtTimer = new QTimer(this); connect(qtTimer, SIGNAL(timeout()), this, SLOT(update())); qtTimer->start(100); } void OverlayWidget::keyPressEvent(QKeyEvent *evt) { evt->accept(); qWarning("Keypress"); detach(); } void OverlayWidget::resizeEvent(QResizeEvent *evt) { QWidget::resizeEvent(evt); if (! img.isNull()) img = img.scaled(evt->size().width(), evt->size().height()); init(evt->size()); } void OverlayWidget::paintEvent(QPaintEvent *) { if (! qlsSocket || qlsSocket->state() == QLocalSocket::UnconnectedState) { detach(); qlsSocket = new QLocalSocket(this); connect(qlsSocket, SIGNAL(connected()), this, SLOT(connected())); connect(qlsSocket, SIGNAL(disconnected()), this, SLOT(disconnected())); connect(qlsSocket, SIGNAL(readyRead()), this, SLOT(readyRead())); connect(qlsSocket, SIGNAL(error(QLocalSocket::LocalSocketError)), this, SLOT(error(QLocalSocket::LocalSocketError))); #ifdef Q_OS_WIN qlsSocket->connectToServer(QLatin1String("MumbleOverlayPipe")); #else qlsSocket->connectToServer(QDir::home().absoluteFilePath(QLatin1String(".MumbleOverlayPipe"))); #endif } QPainter painter(this); painter.fillRect(0, 0, width(), height(), QColor(128,0,128)); painter.setClipRect(qrActive); painter.drawImage(0, 0, img); } void OverlayWidget::init(const QSize &sz) { qWarning() << "Init" << sz.width() << sz.height(); qtWall.start(); iFrameCount = 0; iLastFpsUpdate = 0; OverlayMsg m; m.omh.uiMagic = OVERLAY_MAGIC_NUMBER; m.omh.uiType = OVERLAY_MSGTYPE_INIT; m.omh.iLength = sizeof(OverlayMsgInit); m.omi.uiWidth = sz.width(); m.omi.uiHeight = sz.height(); if (qlsSocket && qlsSocket->state() == QLocalSocket::ConnectedState) qlsSocket->write(m.headerbuffer, sizeof(OverlayMsgHeader) + sizeof(OverlayMsgInit)); img = QImage(sz.width(), sz.height(), QImage::Format_ARGB32_Premultiplied); } void OverlayWidget::detach() { if (qlsSocket) { qlsSocket->abort(); qlsSocket->deleteLater(); qlsSocket = NULL; } if (smMem) { smMem = NULL; } } void OverlayWidget::connected() { qWarning() << "connected"; OverlayMsg m; m.omh.uiMagic = OVERLAY_MAGIC_NUMBER; m.omh.uiType = OVERLAY_MSGTYPE_PID; m.omh.iLength = sizeof(OverlayMsgPid); #ifdef Q_OS_WIN m.omp.pid = GetCurrentProcessId(); #else m.omp.pid = getpid(); #endif qlsSocket->write(m.headerbuffer, sizeof(OverlayMsgHeader) + sizeof(OverlayMsgPid)); om.omh.iLength = -1; init(size()); } void OverlayWidget::disconnected() { qWarning() << "disconnected"; QLocalSocket *qls = qobject_cast(sender()); if (qls == qlsSocket) { detach(); } } void OverlayWidget::error(QLocalSocket::LocalSocketError) { qWarning() << "error"; disconnected(); } void OverlayWidget::update() { ++iFrameCount; clock_t t = clock(); float elapsed = static_cast(qtWall.elapsed() - iLastFpsUpdate) / 1000.0f; if (elapsed > OVERLAY_FPS_INTERVAL) { struct OverlayMsg om; om.omh.uiMagic = OVERLAY_MAGIC_NUMBER; om.omh.uiType = OVERLAY_MSGTYPE_FPS; om.omh.iLength = sizeof(struct OverlayMsgFps); om.omf.fps = static_cast(static_cast(iFrameCount) / elapsed); if (qlsSocket && qlsSocket->state() == QLocalSocket::ConnectedState) { qlsSocket->write(reinterpret_cast(&om), sizeof(OverlayMsgHeader) + om.omh.iLength); } iFrameCount = 0; iLastFpsUpdate = 0; qtWall.start(); } QWidget::update(); } void OverlayWidget::readyRead() { QLocalSocket *qls = qobject_cast(sender()); if (qls != qlsSocket) return; while (true) { int ready = qlsSocket->bytesAvailable(); if (om.omh.iLength == -1) { if (ready < sizeof(OverlayMsgHeader)) break; else { qlsSocket->read(reinterpret_cast(om.headerbuffer), sizeof(OverlayMsgHeader)); if ((om.omh.uiMagic != OVERLAY_MAGIC_NUMBER) || (om.omh.iLength < 0) || (om.omh.iLength > sizeof(OverlayMsgShmem))) { detach(); return; } ready -= sizeof(OverlayMsgHeader); } } if (ready >= om.omh.iLength) { int length = qlsSocket->read(om.msgbuffer, om.omh.iLength); qWarning() << length << om.omh.uiType; if (length != om.omh.iLength) { detach(); return; } switch (om.omh.uiType) { case OVERLAY_MSGTYPE_SHMEM: { OverlayMsgShmem *oms = & om.oms; QString key = QString::fromUtf8(oms->a_cName, length); qWarning() << "SHMAT" << key; if (smMem) delete smMem; smMem = new SharedMemory2(this, width() * height() * 4, key); if (! smMem->data()) { qWarning() << "SHMEM FAIL"; delete smMem; smMem = NULL; } else { qWarning() << "SHMEM" << smMem->size(); } } break; case OVERLAY_MSGTYPE_BLIT: { OverlayMsgBlit *omb = & om.omb; length -= sizeof(OverlayMsgBlit); qWarning() << "BLIT" << omb->x << omb->y << omb->w << omb->h; if (! smMem) break; if (((omb->x + omb->w) > img.width()) || ((omb->y + omb->h) > img.height())) break; for (int y = 0; y < omb->h; ++y) { unsigned char *src = reinterpret_cast(smMem->data()) + 4 * (width() * (y + omb->y) + omb->x); unsigned char *dst = img.scanLine(y + omb->y) + omb->x * 4; memcpy(dst, src, omb->w * 4); } update(); } break; case OVERLAY_MSGTYPE_ACTIVE: { OverlayMsgActive *oma = & om.oma; qWarning() << "ACTIVE" << oma->x << oma->y << oma->w << oma->h; qrActive = QRect(oma->x, oma->y, oma->w, oma->h); update(); }; break; default: break; } om.omh.iLength = -1; ready -= length; } else { break; } } } class TestWin : public QObject { Q_OBJECT protected: QWidget *qw; public: TestWin(); }; TestWin::TestWin() { QMainWindow *qmw = new QMainWindow(); qmw->setObjectName(QLatin1String("main")); OverlayWidget *ow = new OverlayWidget(); qmw->setCentralWidget(ow); qmw->show(); qmw->resize(1280, 720); QMetaObject::connectSlotsByName(this); } int main(int argc, char **argv) { QApplication a(argc, argv); TestWin t; return a.exec(); } #include "OverlayTest.moc" mumble-1.3.4/src/tests/Benchmark.cpp0000664000175000017500000002321614010707274017175 0ustar builderbuilder/** * Provided a target address spawns a specified number of senders/speakers, * UDP-listeners and TCP-listeners. */ #include #include #ifndef Q_OS_WIN #include #endif #include #include #include #include #ifndef Q_OS_WIN #include #include #include #include #endif #include #include "PacketDataStream.h" #include "Timer.h" #include "Message.h" #include "CryptState.h" #include "Mumble.pb.h" class Client : public QThread { Q_OBJECT public: bool udp; bool sender; struct sockaddr_in srv; unsigned int uiSession; CryptState crypt; int rcvd; int socket; int seq; void run(); void ping(); void sendVoice(); int numbytes; int ptype; QSslSocket *ssl; Client(QObject *parent, QHostAddress srvaddr, unsigned short prt, bool send, bool tcponly); void doUdp(const unsigned char *buffer, int size); void sendMessage(const ::google::protobuf::Message &msg, unsigned int msgType); ~Client(); public slots: void readyRead(); void disconnected(); }; Client::Client(QObject *p, QHostAddress qha, unsigned short prt, bool send, bool tcponly) : QThread(p) { srv.sin_family = AF_INET; srv.sin_addr.s_addr = htonl(qha.toIPv4Address()); srv.sin_port = htons(prt); udp = ! tcponly; sender = send; ssl = new QSslSocket(this); connect(ssl, SIGNAL(readyRead()), this, SLOT(readyRead())); connect(ssl, SIGNAL(disconnected()), this, SLOT(disconnected())); ssl->setProtocol(QSsl::TlsV1); ssl->connectToHostEncrypted(qha.toString(), prt); ssl->ignoreSslErrors(); if (! ssl->waitForEncrypted()) qFatal("Connection failure"); static int ctr = 1; #ifdef Q_OS_WIN DWORD pid = GetCurrentProcessId(); wchar_t buf[64]; DWORD bufsize = 64; GetComputerName(buf, &bufsize); QString name = QString("%1.%2").arg(QString::fromWCharArray(buf)).arg(pid * 1000 + ctr); #else struct utsname uts; uname(&uts); QString name = QString("%1.%2").arg(uts.nodename).arg(getpid() * 1000 + ctr); #endif ctr++; MumbleProto::Version mpv; mpv.set_release(u8(QLatin1String("1.2.1 Benchmark"))); mpv.set_version(0x010203); sendMessage(mpv, MessageHandler::Version); MumbleProto::Authenticate mpa; mpa.set_username(u8(name)); sendMessage(mpa, MessageHandler::Authenticate); if (udp) socket = ::socket(PF_INET, SOCK_DGRAM, 0); seq = 0; rcvd = 0; numbytes = -1; } Client::~Client() { terminate(); wait(); } void Client::sendMessage(const ::google::protobuf::Message &msg, unsigned int msgType) { unsigned char uc[4096]; int len = msg.ByteSize(); Q_ASSERT(len < 4090); * reinterpret_cast(& uc[0]) = qToBigEndian(static_cast(msgType)); * reinterpret_cast(& uc[2]) = qToBigEndian(static_cast(len)); msg.SerializeToArray(uc + 6, len); ssl->write(reinterpret_cast(uc), len + 6); } void Client::ping() { unsigned char buffer[256]; buffer[0] = MessageHandler::UDPPing << 5; PacketDataStream pds(buffer + 1, 255); pds << 123; doUdp(buffer, pds.size() + 1); MumbleProto::Ping mpp; mpp.set_timestamp(123); sendMessage(mpp, MessageHandler::Ping); } void Client::sendVoice() { unsigned char buffer[1024]; int len = 32 + (qrand() & 0x3f); // Regular voice, nothing special buffer[0] = 0; PacketDataStream ods(buffer + 1, 1024); ods << 1; ods.append(len); ods.skip(len); doUdp(buffer, ods.size() + 1); } void Client::doUdp(const unsigned char *buffer, int size) { if (! udp || ! crypt.isValid()) return; unsigned char crypted[2048]; crypt.encrypt(reinterpret_cast(buffer), crypted, size); ::sendto(socket, reinterpret_cast(crypted), size+4, 0, reinterpret_cast(&srv), sizeof(srv)); } void Client::run() { unsigned char buffer[1024]; struct sockaddr_in addr; socklen_t sz; int len; if (! udp) return; forever { sz = sizeof(addr); len = ::recvfrom(socket, reinterpret_cast(buffer), 1024, 0, reinterpret_cast(&addr), &sz); if (len <= 0) break; if (len >= 32) rcvd++; } } void Client::readyRead() { forever { int avail = ssl->bytesAvailable(); if (numbytes == -1) { if (avail < 6) break; unsigned char b[6]; ssl->read(reinterpret_cast(b), 6); ptype = qFromBigEndian(* reinterpret_cast(& b[0])); numbytes = qFromBigEndian(* reinterpret_cast(& b[2])); avail = ssl->bytesAvailable(); } if ((numbytes >= 0) && (avail >= numbytes)) { int want = numbytes; numbytes = -1; unsigned char buff[65536]; Q_ASSERT(want < 65536); ssl->read(reinterpret_cast(buff), want); avail = ssl->bytesAvailable(); switch (ptype) { case MessageHandler::CryptSetup: { MumbleProto::CryptSetup msg; if (! msg.ParseFromArray(buff, want)) qFatal("Failed parse crypt"); if (msg.has_key() && msg.has_client_nonce() && msg.has_server_nonce()) { const std::string &key = msg.key(); const std::string &client_nonce = msg.client_nonce(); const std::string &server_nonce = msg.server_nonce(); if (key.size() == AES_BLOCK_SIZE && client_nonce.size() == AES_BLOCK_SIZE && server_nonce.size() == AES_BLOCK_SIZE) crypt.setKey(reinterpret_cast(key.data()), reinterpret_cast(client_nonce.data()), reinterpret_cast(server_nonce.data())); } else if (msg.has_server_nonce()) { const std::string &server_nonce = msg.server_nonce(); if (server_nonce.size() == AES_BLOCK_SIZE) { crypt.uiResync++; memcpy(crypt.decrypt_iv, server_nonce.data(), AES_BLOCK_SIZE); } } else { MumbleProto::CryptSetup mpcs; mpcs.set_client_nonce(std::string(reinterpret_cast(crypt.encrypt_iv), AES_BLOCK_SIZE)); sendMessage(mpcs, MessageHandler::CryptSetup); } break; } case MessageHandler::ServerSync: { MumbleProto::ServerSync msg; if (! msg.ParseFromArray(buff, want)) qFatal("Failed parse sync"); uiSession = msg.session(); break; } case MessageHandler::UDPTunnel: { unsigned int msgUDPType = (buff[0] >> 5) & 0x7; if (msgUDPType == MessageHandler::UDPVoiceCELTAlpha) rcvd++; break; } } } else { break; } } } void Client::disconnected() { qWarning("SSL Socket disconnected"); QCoreApplication::instance()->quit(); } class Container : public QObject { Q_OBJECT public: int sent; int numsender, numudplistener, numtcplistener; int isender, iudplistener, itcplistener; bool live, forceping; QHostAddress qha; unsigned short port; QTimer qtTick; Timer tickPing, tickVoice, tickGo, tickSpawn; QList speakers; QList clients; Container(QHostAddress srvaddr, unsigned short port, int nsend, int nudp, int ntcp); public slots: void tick(); void go(); }; Container::Container(QHostAddress qha, unsigned short port, int numsend, int numudp, int numtcp) { isender = iudplistener = itcplistener = 0; live = false; forceping = false; sent = 0; Timer t; qWarning("Spawning %d speakers and %d listeners (%d UDP, %d TCP)", numsend, numudp+numtcp, numudp, numtcp); this->qha = qha; this->port = port; numsender = numsend; numudplistener = numudp; numtcplistener = numtcp; connect(&qtTick, SIGNAL(timeout()), this, SLOT(tick())); qtTick.start(0); tickSpawn.restart(); } void Container::tick() { if (forceping || tickPing.isElapsed(5000000ULL)) { forceping = false; foreach(Client *c, clients) c->ping(); if (live) { int lost = 0; quint64 totrcv = 0; int nrcv = 0; foreach(Client *c, clients) { if (! c->sender) { totrcv += c->rcvd; lost += sent - c->rcvd; nrcv++; } } qWarning("Sent: %8d Rcvd: %8lld Lost: %8d BW: %6.1fMbit/s", sent, totrcv / nrcv, (lost + nrcv - 1) / nrcv, (totrcv * 8.0 * 123.0) / (tickGo.elapsed() * 1.0)); } else { qWarning("Spawned %3d/%3d", isender + iudplistener + itcplistener, numsender + numudplistener + numtcplistener); } } if (live && tickVoice.isElapsed(10000ULL)) { foreach(Client *c, speakers) { sent++; c->sendVoice(); } } if (! live) { if (isender < numsender) { // Spawn a sender Client *c = new Client(this, qha, port, true, false); speakers << c; c->start(); clients << c; isender++; } else if (iudplistener < numudplistener) { // Spawn a listener which uses UDP Client *c = new Client(this, qha, port, false, false); c->start(); clients << c; iudplistener++; } else if (itcplistener < numtcplistener) { // Spawn a listener which uses TCP-only Client *c = new Client(this, qha, port, false, true); c->start(); clients << c; itcplistener++; } else { live = true; quint64 elapsed = tickSpawn.elapsed(); qWarning("Spawning took %lld ms (%lld us per client)", elapsed / 1000ULL, elapsed / (numsender+numudplistener+numtcplistener)); foreach(Client *c, clients) c->rcvd = 0; sent = 0; forceping = true; qtTick.start(10); } } } void Container::go() { foreach(Client *c, clients) c->start(); qtTick.start(10); tickGo.restart(); } int main(int argc, char **argv) { QCoreApplication a(argc, argv); qWarning("Maximum # sockets is %d", FD_SETSIZE); if (argc != 6) qFatal("Invalid number of arguments. These need to be passed: "); QHostAddress qha = QHostAddress(argv[1]); int port = atoi(argv[2]); int numsender = atoi(argv[3]); int numudplistener = atoi(argv[4]); int numtcplistener = atoi(argv[5]); Container c(qha, port, numsender, numudplistener, numtcplistener); c.go(); a.exec(); } #include "Benchmark.moc" mumble-1.3.4/src/tests/Resample.cpp0000664000175000017500000000502214010707274017046 0ustar builderbuilder/** * Speex resampling test / information. */ #define _USE_MATH_DEFINES #include #include #include #include #include "Timer.h" #define ITER 1000 #include int main(int argc, char **argv) { ippStaticInit(); ippSetNumThreads(1); #ifdef Q_OS_WIN if (!SetPriorityClass(GetCurrentProcess(),HIGH_PRIORITY_CLASS)) qWarning("Application: Failed to set priority!"); #endif QCoreApplication a(argc, argv); SpeexResamplerState *srs; int iMicFreq = 44100; int iSampleRate = 48000; int iFrameSize = iSampleRate / 100; int err = 0; srs = speex_resampler_init(1, iMicFreq, iSampleRate, 3, &err); int iMicLength = (iFrameSize * iMicFreq) / iSampleRate; qWarning() << iMicFreq << iSampleRate << iFrameSize << iMicLength; float *pfInput = new float[iMicLength]; float *pfOutput = new float[iFrameSize]; for (int i=0;i. # Common include file for tests. include(../../qmake/compiler.pri) TEMPLATE = app QT = core testlib CONFIG += testcase CONFIG += thread warn_on CONFIG -= app_bundle # We build this test without 'gui' in QT, # but we include the QtGui headers from # murmur_pch.h. This causes an error when Qt # tries to find the OpenGL headers to use, since # we're missing the include paths from QtGui's # .pri files. Define QT_NO_OPENGL to avoid these # build errors. DEFINES += QT_NO_OPENGL LANGUAGE = C++ VPATH *= ../.. ../../murmur ../../mumble INCLUDEPATH *= ../.. ../../murmur ../../mumble SOURCES += PlatformCheck.cpp HEADERS += PlatformCheck.h # We have to depend on OpenSSL in all tests # for no-pch builds to work. Our PCH headers # include OpenSSL, and if the headers aren't # in the include path, the build will break. include(../../qmake/openssl.pri) DESTDIR = $$DESTDIR/tests mumble-1.3.4/src/tests/Hash.cpp0000664000175000017500000000245114010707274016164 0ustar builderbuilder#include #include "Timer.h" #define ITER 100000 typedef QPair tr; template class SpeedTest { public: QList list; SpeedTest() { } void add(T v) { list << v; } tr testres(T v) { int val = 0; Timer t; t.restart(); for (int i=0;i set; SpeedTest stv; SpeedTest sti; SpeedTest > stl; SpeedTest stvl; for (int i=0;i<300;i++) { set.insert(i); QVariant v = i; QList ql; ql << v; QVariant vl = QVariant(ql); stv.add(v); sti.add(i); stl.add(ql); stvl.add(vl); } int i = 397; QVariant v = i; QList ql; ql << v; QVariant vl = QVariant(ql); Timer tt; tr t; int val = 0; tt.restart(); for (int i=0;i. // Include murmur_pch.h for STACKVAR #include "murmur_pch.h" #include #include #include "SSL.h" #include "Timer.h" #include "CryptState.h" class TestCrypt : public QObject { Q_OBJECT private slots: void initTestCase(); void cleanupTestCase(); void testvectors(); void authcrypt(); void xexstarAttack(); void ivrecovery(); void reverserecovery(); void tamper(); }; void TestCrypt::initTestCase() { MumbleSSL::initialize(); } void TestCrypt::cleanupTestCase() { MumbleSSL::destroy(); } void TestCrypt::reverserecovery() { CryptState enc, dec; enc.genKey(); // For our testcase, we're going to FORCE iv memset(enc.encrypt_iv, 0x55, AES_BLOCK_SIZE); dec.setKey(enc.raw_key, enc.decrypt_iv, enc.encrypt_iv); unsigned char secret[10] = "abcdefghi"; unsigned char crypted[512][14]; unsigned char decr[10]; memset(crypted, 0, sizeof(crypted)); // OOO recovery (within 15 packets) /* for(int i=0;i<128;i++) { for(int i=0;i<15;i++) enc.encrypt(secret, crypted[i], 10); dec.stat_lost = dec.stat_late = 0; for(unsigned int i=14;i<=15;i--) { QVERIFY(dec.decrypt(crypted[i], decr, 14)); QCOMPARE(dec.stat_lost, i); QCOMPARE(dec.stat_late, 14-i); } for(int i=0;i<15;i++) QVERIFY(!dec.decrypt(crypted[i], decr, 14)); } */ // OOO recovery up to 30 packets, but NOT beyond int i; for (i=0;i<128;i++) enc.encrypt(secret, crypted[i], 10); for (i=0;i<30;i++) QVERIFY(dec.decrypt(crypted[127-i], decr, 14)); for (;i<128;i++) QVERIFY(!dec.decrypt(crypted[127-i], decr, 14)); for (i=0;i<30;i++) QVERIFY(!dec.decrypt(crypted[127-i], decr, 14)); // Extensive replay attack test for (i=0;i<512;i++) enc.encrypt(secret, crypted[i], 10); for (i=0;i<512;i++) QVERIFY(dec.decrypt(crypted[i], decr, 14)); for (i=0;i<512;i++) QVERIFY(!dec.decrypt(crypted[i], decr, 14)); } void TestCrypt::ivrecovery() { CryptState enc, dec; enc.genKey(); // For our testcase, we're going to FORCE iv memset(enc.encrypt_iv, 0x55, AES_BLOCK_SIZE); dec.setKey(enc.raw_key, enc.decrypt_iv, enc.encrypt_iv); unsigned char secret[10] = "abcdefghi"; unsigned char crypted[14]; unsigned char decr[10]; enc.encrypt(secret, crypted, 10); // Can decrypt. QVERIFY(dec.decrypt(crypted, decr, 14)); // .. correctly. QVERIFY(memcmp(secret, decr, 10)==0); // But will refuse to reuse same IV. QVERIFY(! dec.decrypt(crypted, decr, 14)); // Recover from lost packet. for (int i=0;i<16;i++) enc.encrypt(secret, crypted, 10); QVERIFY(dec.decrypt(crypted, decr, 14)); // Wraparound. for (int i=0;i<128;i++) { dec.uiLost = 0; for (int j=0;j<15;j++) enc.encrypt(secret, crypted, 10); QVERIFY(dec.decrypt(crypted, decr, 14)); QCOMPARE(dec.uiLost, 14U); } QVERIFY(memcmp(enc.encrypt_iv, dec.decrypt_iv, AES_BLOCK_SIZE)==0); // Wrap too far for (int i=0;i<257;i++) enc.encrypt(secret, crypted, 10); QVERIFY(! dec.decrypt(crypted, decr, 14)); // Sync it dec.setDecryptIV(enc.encrypt_iv); enc.encrypt(secret, crypted, 10); QVERIFY(dec.decrypt(crypted, decr, 14)); } void TestCrypt::testvectors() { // Test vectors are from draft-krovetz-ocb-00.txt const unsigned char rawkey[AES_BLOCK_SIZE] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f}; CryptState cs; cs.setKey(rawkey, rawkey, rawkey); unsigned char tag[16]; QVERIFY(cs.ocb_encrypt(NULL, NULL, 0, rawkey, tag)); const unsigned char blanktag[AES_BLOCK_SIZE] = {0xBF,0x31,0x08,0x13,0x07,0x73,0xAD,0x5E,0xC7,0x0E,0xC6,0x9E,0x78,0x75,0xA7,0xB0}; for (int i=0;i(0)); QCOMPARE(decrypted[0], static_cast(1)); } void TestCrypt::tamper() { const unsigned char rawkey[AES_BLOCK_SIZE] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f}; const unsigned char nonce[AES_BLOCK_SIZE] = {0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00}; CryptState cs; cs.setKey(rawkey, nonce, nonce); const unsigned char msg[] = "It was a funky funky town!"; int len = sizeof(msg); STACKVAR(unsigned char, encrypted, len+4); STACKVAR(unsigned char, decrypted, len); cs.encrypt(msg, encrypted, len); for (int i=0;i. include(../test.pri) QT *= network TARGET = TestCrypt HEADERS *= SSL.h SSLLocks.h Timer.h CryptState.h SOURCES *= SSL.cpp SSLLocks.cpp TestCrypt.cpp CryptState.cpp Timer.cpp mumble-1.3.4/src/tests/TestTimer/0000775000175000017500000000000014010707274016513 5ustar builderbuildermumble-1.3.4/src/tests/TestTimer/TestTimer.pro0000664000175000017500000000053014010707274021153 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../test.pri) TARGET = TestTimer SOURCES *= TestTimer.cpp Timer.cpp HEADERS *= Timer.h mumble-1.3.4/src/tests/TestTimer/TestTimer.cpp0000664000175000017500000000312514010707274021140 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include #include #include "Timer.h" class TestTimer : public QObject { Q_OBJECT private slots: void resolution(); void order(); }; // This tests that the timer implemented by the Timer // class is a high resolution timer. In this case, we // check that the output of the elapsed() method changes // at least every 100 microseconds. void TestTimer::resolution() { Timer t; t.restart(); quint64 nchanges = 0; quint64 lastElapsed = 0; quint64 curElapsed = 0; do { curElapsed = t.elapsed(); if (curElapsed != lastElapsed) { nchanges++; } lastElapsed = curElapsed; } while (curElapsed < 150000); // 150 ms quint64 totalElapsed = t.elapsed(); double usecsPerChange = static_cast(totalElapsed) / static_cast(nchanges); qWarning("Total elapsed time: %llu microseconds", static_cast(totalElapsed)); qWarning("Number of elapsed changes: %llu", static_cast(nchanges)); qWarning("Resolution: %.2f microseconds", usecsPerChange); if (usecsPerChange >= 100.0f) { QFAIL("Insufficient timer resolution. Got >= 100 usec, expected < 100 usec resolution..."); } } void TestTimer::order() { Timer a; while (a.elapsed() == 0) {}; Timer b; QVERIFY(a > b); QVERIFY(!(b > a)); QVERIFY(!(a < b)); QVERIFY(b < a); } QTEST_MAIN(TestTimer) #include "TestTimer.moc" mumble-1.3.4/src/tests/TestPasswordGenerator/0000775000175000017500000000000014010707274021104 5ustar builderbuildermumble-1.3.4/src/tests/TestPasswordGenerator/TestPasswordGenerator.pro0000664000175000017500000000113414010707274026136 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../test.pri) QT += network TARGET = TestPasswordGenerator SOURCES *= SSL.cpp SSLLocks.cpp TestPasswordGenerator.cpp PasswordGenerator.cpp CryptographicRandom.cpp arc4random_uniform.cpp HEADERS *= SSL.h SSLLocks.h PasswordGenerator.h CryptographicHash.h VPATH *= ../../../3rdparty/arc4random-src INCLUDEPATH *= ../../../3rdparty/arc4random-src mumble-1.3.4/src/tests/TestPasswordGenerator/TestPasswordGenerator.cpp0000664000175000017500000000215314010707274026122 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include #include #include "SSL.h" #include "PasswordGenerator.h" // Get the password alphabet from PasswordGenerator. extern QVector mumble_password_generator_alphabet(); class TestPasswordGenerator : public QObject { Q_OBJECT private slots: void initTestCase(); void cleanupTestCase(); void random(); }; void TestPasswordGenerator::initTestCase() { MumbleSSL::initialize(); } void TestPasswordGenerator::cleanupTestCase() { MumbleSSL::destroy(); } void TestPasswordGenerator::random() { QVector alphabet = mumble_password_generator_alphabet(); for (int i = 0; i < 100; i++) { QString out = PasswordGenerator::generatePassword(i); QVERIFY(out.size() == i); for (int j = 0; j < out.size(); j++) { QVERIFY(alphabet.contains(out.at(j))); } } } QTEST_MAIN(TestPasswordGenerator) #include "TestPasswordGenerator.moc" mumble-1.3.4/src/tests/ProtoBuf.pro0000664000175000017500000000112014010707274017047 0ustar builderbuilderTEMPLATE = app CONFIG += qt thread warn_on release qtestlib no_keywords CONFIG -= app_bundle LANGUAGE = C++ TARGET = ProtoBuf HEADERS = Message.h Timer.h PROTOS = ProtoBuf.proto SOURCES = ProtoBuf.cpp Timer.cpp Message.cpp ProtoBuf.pb.cc VPATH += .. proto INCLUDEPATH += .. ../murmur ../mumble proto LIBS += -lboost_signals -lprotobuf QMAKE_CXXFLAGS *= -O3 DEFINES *= NDEBUG protoc.output = ${QMAKE_FILE_BASE}.pb.cc ${QMAKE_FILE_BASE}.pb.h protoc.commands = protoc ${QMAKE_FILE_NAME} --cpp_out=. protoc.input = PROTOS protoc.CONFIG *= no_link target_predeps QMAKE_EXTRA_COMPILERS *= protoc mumble-1.3.4/src/tests/TestServerResolver/0000775000175000017500000000000014010707274020423 5ustar builderbuildermumble-1.3.4/src/tests/TestServerResolver/TestServerResolver.cpp0000664000175000017500000001507014010707274024762 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include #include #include #include "ServerResolver.h" #include "PlatformCheck.h" void signalSpyWait(QSignalSpy &spy) { // We increase the timeout from 5s to 8s because travis builds could fail otherwise (slow network response). const int signalTimeoutS = 8; #if QT_VERSION >= 0x050000 spy.wait(signalTimeoutS * 1000); #else // Equivalent to QSignalSpy::wait() in Qt 5, except we do not return early on a spied on signal result. QTestEventLoop loop; loop.enterLoop(signalTimeoutS); #endif } class TestServerResolver : public QObject { Q_OBJECT private slots: void simpleSrv(); void srvCustomPort(); void simpleA(); void simpleAAAA(); void simpleCNAME(); }; void TestServerResolver::simpleSrv() { #ifdef USE_NO_SRV return; #endif // Qt 5's SRV resolver does not work in Wine. // For more info, see https://bugs.winehq.org/show_bug.cgi?id=44296 if (PlatformCheck::IsWine()) { return; } ServerResolver r; QSignalSpy spy(&r, SIGNAL(resolved())); QString hostname = QString::fromLatin1("simple.serverresolver.mumble.info"); quint16 port = 64738; r.resolve(hostname, port); signalSpyWait(spy); QCOMPARE(spy.count(), 1); QList records = r.records(); QCOMPARE(records.size(), 1); ServerResolverRecord record = records.at(0); QCOMPARE(record.hostname(), hostname); QCOMPARE(record.port(), port); // Allow 1 or 2 results. The answer depends on whether // the system supports IPv4, IPv6, or both. QVERIFY(record.addresses().size() == 1 || record.addresses().size() == 2); QCOMPARE(record.priority(), 65545); // priority=1, weight=10 -> 1 * 65535 + 10 bool hasipv4 = false; bool hasipv6 = false; HostAddress v4(QHostAddress(QLatin1String("127.0.0.1"))); HostAddress v6(QHostAddress(QLatin1String("::1"))); foreach (HostAddress ha, record.addresses()) { if (ha == v4) { hasipv4 = true; } if (ha == v6) { hasipv6 = true; } } // Require either an IPv4 match, or an IPv6 match. QVERIFY(hasipv4 || hasipv6); } void TestServerResolver::srvCustomPort() { #ifdef USE_NO_SRV return; #endif // Qt 5's SRV resolver does not work in Wine. // For more info, see https://bugs.winehq.org/show_bug.cgi?id=44296 if (PlatformCheck::IsWine()) { return; } ServerResolver r; QSignalSpy spy(&r, SIGNAL(resolved())); QString hostname = QString::fromLatin1("customport.serverresolver.mumble.info"); quint16 customPort = 36001; r.resolve(hostname, 64738); signalSpyWait(spy); QCOMPARE(spy.count(), 1); QList records = r.records(); QCOMPARE(records.size(), 1); ServerResolverRecord record = records.at(0); QCOMPARE(record.hostname(), hostname); QCOMPARE(record.port(), customPort); // Allow 1 or 2 results. The answer depends on whether // the system supports IPv4, IPv6, or both. QVERIFY(record.addresses().size() == 1 || record.addresses().size() == 2); QCOMPARE(record.priority(), 65545); // priority=1, weight=10 -> 1 * 65535 + 10 bool hasipv4 = false; bool hasipv6 = false; HostAddress v4(QHostAddress(QLatin1String("127.0.0.1"))); HostAddress v6(QHostAddress(QLatin1String("::1"))); foreach (HostAddress ha, record.addresses()) { if (ha == v4) { hasipv4 = true; } if (ha == v6) { hasipv6 = true; } } // Require either an IPv4 match, or an IPv6 match. QVERIFY(hasipv4 || hasipv6); } void TestServerResolver::simpleCNAME() { ServerResolver r; QSignalSpy spy(&r, SIGNAL(resolved())); QString hostname = QString::fromLatin1("cname.serverresolver.mumble.info"); quint16 port = 64738; r.resolve(hostname, port); signalSpyWait(spy); QCOMPARE(spy.count(), 1); QList records = r.records(); QCOMPARE(records.size(), 1); ServerResolverRecord record = records.at(0); QCOMPARE(record.hostname(), hostname); QCOMPARE(record.port(), port); // Allow 1 or 2 results. The answer depends on whether // the system supports IPv4, IPv6, or both. QVERIFY(record.addresses().size() == 1 || record.addresses().size() == 2); bool hasipv4 = false; bool hasipv6 = false; HostAddress v4(QHostAddress(QLatin1String("127.0.0.1"))); HostAddress v6(QHostAddress(QLatin1String("::1"))); foreach (HostAddress ha, record.addresses()) { if (ha == v4) { hasipv4 = true; } if (ha == v6) { hasipv6 = true; } } // Require either an IPv4 match, or an IPv6 match. QVERIFY(hasipv4 || hasipv6); } void TestServerResolver::simpleA() { ServerResolver r; QSignalSpy spy(&r, SIGNAL(resolved())); QString hostname = QString::fromLatin1("simplea.serverresolver.mumble.info"); quint16 port = 64738; r.resolve(hostname, port); signalSpyWait(spy); QCOMPARE(spy.count(), 1); QList records = r.records(); // Since not all systems have IPv4 support, we have to // skip this test if we get no matches. Not ideal, but // at least we get some test coverage on IPv4 systems. if (records.size() == 0) { qWarning("Skipping test: No results returned. Assuming non-IPv4 system."); return; } QCOMPARE(records.size(), 1); ServerResolverRecord record = records.at(0); QCOMPARE(record.hostname(), hostname); QCOMPARE(record.port(), port); QCOMPARE(record.addresses().size(), 1); QCOMPARE(record.priority(), static_cast(0)); HostAddress want(QHostAddress(QLatin1String("127.0.0.1"))); HostAddress got = record.addresses().at(0); QCOMPARE(want, got); } void TestServerResolver::simpleAAAA() { ServerResolver r; QSignalSpy spy(&r, SIGNAL(resolved())); QString hostname = QString::fromLatin1("simpleaaaa.serverresolver.mumble.info"); quint16 port = 64738; r.resolve(hostname, port); signalSpyWait(spy); QCOMPARE(spy.count(), 1); QList records = r.records(); // Since not all systems have IPv6 support, we have to // skip this test if we get no matches. Not ideal, but // at least we get some test coverage on IPv6 systems. if (records.size() == 0) { qWarning("Skipping test: No results returned. Assuming non-IPv6 system."); return; } QCOMPARE(records.size(), 1); ServerResolverRecord record = records.at(0); QCOMPARE(record.hostname(), hostname); QCOMPARE(record.port(), port); QCOMPARE(record.addresses().size(), 1); QCOMPARE(record.priority(), static_cast(0)); HostAddress want(QHostAddress(QLatin1String("::1"))); HostAddress got = record.addresses().at(0); QCOMPARE(want, got); } QTEST_MAIN(TestServerResolver) #include "TestServerResolver.moc" mumble-1.3.4/src/tests/TestServerResolver/TestServerResolver.pro0000664000175000017500000000124714010707274025001 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../test.pri) include(../../../qmake/qt.pri) QT *= network TARGET = TestServerResolver SOURCES *= TestServerResolver.cpp HostAddress.cpp ServerResolver_qt5.cpp ServerResolverRecord.cpp HEADERS *= HostAddress.h ServerResolver.h ServerResolverRecord.h isEqual(QT_MAJOR_VERSION, 4) { CONFIG *= no-srv } CONFIG(no-srv) { DEFINES += USE_NO_SRV SOURCES -= ServerResolver_qt5.cpp SOURCES *= ServerResolver_nosrv.cpp } mumble-1.3.4/src/License.h0000664000175000017500000000233714010707273015170 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_LICENSE_H_ #define MUMBLE_LICENSE_H_ #include #include /// LicenseInfo represents license information /// for a third-party library used by Mumble. struct LicenseInfo { /// The name of the third-party library. QString name; /// A URL for the website of the third-party library. QString url; /// The license text for the third-party library. QString license; }; /// The License class contains static helpers for /// getting Mumble license/author information. class License { public: /// Get the Mumble license text (the LICENSE file) static QString license(); /// Get the Mumble authors list (the AUTHORS file) static QString authors(); /// Get a list of license information for Mumble's /// third-party libraries. static QList thirdPartyLicenses(); /// Get a human-readable, ready-to-print combination /// of all of Mumble's third-party license information. static QString printableThirdPartyLicenseInfo(); }; #endif mumble-1.3.4/src/Ban.cpp0000664000175000017500000000347514010707273014645 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifdef MUMBLE #include "mumble_pch.hpp" #else #include "murmur_pch.h" #endif #include "Ban.h" bool Ban::isExpired() const { return (iDuration > 0) && static_cast(iDuration - qdtStart.secsTo(QDateTime::currentDateTime().toUTC())) < 0; } bool Ban::operator <(const Ban &other) const { // Compare username primarily and address secondarily const int unameDifference = qsUsername.localeAwareCompare(other.qsUsername); if (unameDifference == 0) return haAddress < other.haAddress; else return unameDifference < 0; } bool Ban::operator ==(const Ban &other) const { return (haAddress == other.haAddress) && (iMask == other.iMask) && (qsUsername == other.qsUsername) && (qsHash == other.qsHash) && (qsReason == other.qsReason) && (qdtStart == other.qdtStart) && (iDuration == other.iDuration); } bool Ban::isValid() const { return haAddress.isValid() && (iMask >= 8) && (iMask <= 128); } QString Ban::toString() const { return QString(QLatin1String("Hash: \"%1\", Host: \"%2\", Mask: \"%3\", Username: \"%4\", Reason: \"%5\", BanStart: \"%6\", BanEnd: \"%7\" %8")).arg( qsHash, haAddress.toString(), haAddress.isV6() ? QString::number(iMask) : QString::number(iMask-96), qsUsername, qsReason, qdtStart.toLocalTime().toString(QLatin1String("yyyy-MM-dd hh:mm:ss")), qdtStart.toLocalTime().addSecs(iDuration).toString(QLatin1String("yyyy-MM-dd hh:mm:ss")), iDuration == 0 ? QLatin1String("(permanent)") : QLatin1String("(temporary)") ); } quint32 qHash(const Ban &b) { return qHash(b.qsHash) ^ qHash(b.haAddress) ^ qHash(b.qsUsername) ^ qHash(b.iMask); } mumble-1.3.4/src/ServerResolver_nosrv.cpp0000664000175000017500000000435714010707273020364 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifdef MUMBLE #include "mumble_pch.hpp" #else #include "murmur_pch.h" #endif #include "ServerResolver.h" #include class ServerResolverPrivate : public QObject { private: Q_OBJECT Q_DISABLE_COPY(ServerResolverPrivate) public: ServerResolverPrivate(QObject *parent); void resolve(QString hostname, quint16 port); QList records(); QString m_origHostname; quint16 m_origPort; QList m_resolved; signals: void resolved(); public slots: void hostResolved(QHostInfo hostInfo); }; ServerResolverPrivate::ServerResolverPrivate(QObject *parent) : QObject(parent) , m_origPort(0) { } void ServerResolverPrivate::resolve(QString hostname, quint16 port) { m_origHostname = hostname; m_origPort = port; QHostInfo::lookupHost(hostname, this, SLOT(hostResolved(QHostInfo))); } QList ServerResolverPrivate::records() { return m_resolved; } void ServerResolverPrivate::hostResolved(QHostInfo hostInfo) { if (hostInfo.error() == QHostInfo::NoError) { QList resolvedAddresses = hostInfo.addresses(); // Convert QHostAddress -> HostAddress. QList addresses; foreach (QHostAddress ha, resolvedAddresses) { addresses << HostAddress(ha); } m_resolved << ServerResolverRecord(m_origHostname, m_origPort, 0, addresses); } emit resolved(); } ServerResolver::ServerResolver(QObject *parent) : QObject(parent) { d = new ServerResolverPrivate(this); } QString ServerResolver::hostname() { if (d) { return d->m_origHostname; } return QString(); } quint16 ServerResolver::port() { if (d) { return d->m_origPort; } return 0; } void ServerResolver::resolve(QString hostname, quint16 port) { if (d) { connect(d, SIGNAL(resolved()), this, SIGNAL(resolved())); d->resolve(hostname, port); } } QList ServerResolver::records() { if (d) { return d->records(); } return QList(); } #include "ServerResolver_nosrv.moc" mumble-1.3.4/src/PasswordGenerator.h0000664000175000017500000000066714010707273017263 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_PASSWORDGENERATOR_H_ #define MUMBLE_PASSWORDGENERATOR_H_ #include class PasswordGenerator { public: static QString generatePassword(int length); }; #endif mumble-1.3.4/src/Qt4Compat.h0000664000175000017500000000064014010707273015415 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_QT4COMPAT_H_ #define MUMBLE_QT4COMPAT_H_ namespace Qt { inline QString escape(const QString &plain) { return plain.toHtmlEscaped(); } } #endif mumble-1.3.4/src/ServerResolver.h0000664000175000017500000000167314010707273016600 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_SERVERRESOLVER_H_ #define MUMBLE_MUMBLE_SERVERRESOLVER_H_ #include #include #include #include "Net.h" // for HostAddress #include "ServerResolverRecord.h" class ServerResolverPrivate; class ServerResolver : public QObject { private: Q_OBJECT Q_DISABLE_COPY(ServerResolver) public: ServerResolver(QObject *parent = NULL); QString hostname(); quint16 port(); void resolve(QString hostname, quint16 port); QList records(); signals: /// Resolved is fired once the ServerResolver /// has resolved the server address. void resolved(); private: ServerResolverPrivate *d; }; #endif mumble-1.3.4/src/CryptographicRandom.h0000664000175000017500000000357314010707273017570 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_CRYPTOGRAPHICRANDOM_H_ #define MUMBLE_CRYPTOGRAPHICRANDOM_H_ #include /// CryptographicRandom provides useful utilities for acquiring /// pseudo-random data for use in cryptography. class CryptographicRandom { public: /// Fill the buffer at |buf| with |numBytes| bytes of pseudo-random data. /// The value of |numBytes| must be >= 0. Otherwise, program execution is aborted. /// /// This function is equivalent to the arc4random_buf() function from OpenBSD. /// /// This function should not ever fail. It is considered a catastrophic failure if /// it does. The program is aborted if the function fails, because it is generally /// impossible to recover from such a scenario. static void fillBuffer(void *buf, int numBytes); /// Return a pseudo-random number in the range of 0 to (2**32)-1. /// /// This function is equivalent to the arc4random() function from OpenBSD. /// /// This function should not ever fail. It is considered a catastrophic failure if /// it does. The program is aborted if the function fails, because it is generally /// impossible to recover from such a scenario. static uint32_t uint32(); /// Calculate a uniformly distributed random number less than |upperBound| /// avoiding "modulo bias". /// /// This function is equivalent to the arc4random_uniform() function from OpenBSD. /// /// This function should not ever fail. It is considered a catastrophic failure if /// it does. The program is aborted if the function fails, because it is generally /// impossible to recover from such a scenario. static uint32_t uniform(uint32_t upperBound); }; #endif mumble-1.3.4/src/SSLCipherInfo.h0000664000175000017500000000117214010707273016212 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_SSLCIPHERINFO_H_ #define MUMBLE_SSLCIPHERINFO_H_ struct SSLCipherInfo { const char *openssl_name; const char *rfc_name; const char *encryption; const char *key_exchange_verbose; const bool forward_secret; const char *message_authentication; }; const SSLCipherInfo *SSLCipherInfoLookupByOpenSSLName(const char *openSslCipherName); #endif mumble-1.3.4/src/Group.cpp0000664000175000017500000001113114010707273015225 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifdef MUMBLE #include "mumble_pch.hpp" #else #include "murmur_pch.h" #endif #include "Group.h" #include "Channel.h" #include "User.h" #ifdef MURMUR #include "ServerUser.h" #endif Group::Group(Channel *assoc, const QString &name) { c = assoc; bInherit = true; bInheritable = true; qsName = name; if (c) c->qhGroups[name] = this; } #ifdef MURMUR QSet Group::members() { QStack s; QSet m; Channel *p; Group *g; int i; p = c; while (p) { g = p->qhGroups.value(qsName); if (g) { if ((p != c) && ! g->bInheritable) break; s.push(g); if (! g->bInherit) break; } p = p->cParent; } while (! s.isEmpty()) { g = s.pop(); foreach(i, g->qsAdd) m.insert(i); foreach(i, g->qsRemove) m.remove(i); } return m; } Group *Group::getGroup(Channel *chan, QString name) { Channel *p = chan; while (p) { Group *g = p->qhGroups.value(name); if (g) { if (chan == p) return g; else if (g->bInheritable) return g; else return NULL; } p = p->cParent; } return NULL; } QSet Group::groupNames(Channel *chan) { QStack s; QSet m; Channel *c = chan; Group *g; while (c) { s.push(c); c = c->cParent; } while (! s.isEmpty()) { c = s.pop(); foreach(g, c->qhGroups) { if ((chan != c) && (! g->bInheritable)) m.remove(g->qsName); else m.insert(g->qsName); } } return m; } #define RET_FALSE (invert ? true : false) #define RET_TRUE (invert ? false : true) bool Group::isMember(Channel *curChan, Channel *aclChan, QString name, ServerUser *pl) { Channel *p; Channel *c; Group *g; bool m = false; bool invert = false; bool token = false; bool hash = false; c = curChan; while (true) { if (name.isEmpty()) return false; if (name.startsWith(QChar::fromLatin1('!'))) { invert = true; name = name.remove(0,1); continue; } if (name.startsWith(QChar::fromLatin1('~'))) { c = aclChan; name = name.remove(0,1); continue; } if (name.startsWith(QChar::fromLatin1('#'))) { token = true; name = name.remove(0,1); continue; } if (name.startsWith(QChar::fromLatin1('$'))) { hash = true; name = name.remove(0,1); continue; } break; } if (token) m = pl->qslAccessTokens.contains(name, Qt::CaseInsensitive); else if (hash) m = pl->qsHash == name; else if (name == QLatin1String("none")) m = false; else if (name == QLatin1String("all")) m = true; else if (name == QLatin1String("auth")) m = (pl->iId >= 0); else if (name == QLatin1String("strong")) m = pl->bVerified; else if (name == QLatin1String("in")) m = (pl->cChannel == c); else if (name == QLatin1String("out")) m = !(pl->cChannel == c); else if (name == QLatin1String("sub") || name.startsWith(QLatin1String("sub,"))) { name = name.remove(0,4); int mindesc = 1; int maxdesc = 1000; int minpath = 0; QStringList args = name.split(QLatin1String(",")); if (args.count() >= 3) { maxdesc = args[2].isEmpty() ? maxdesc : args[2].toInt(); } if (args.count() >= 2) { mindesc = args[1].isEmpty() ? mindesc : args[1].toInt(); } if (args.count() >= 1) { minpath = args[0].isEmpty() ? minpath : args[0].toInt(); } Channel *home = pl->cChannel; QList playerChain; QList groupChain; p = home; while (p) { playerChain.prepend(p); p = p->cParent; } p = curChan; while (p) { groupChain.prepend(p); p = p->cParent; } int cofs = groupChain.indexOf(c); Q_ASSERT(cofs != -1); cofs += minpath; if (cofs >= groupChain.count()) { return RET_FALSE; } else if (cofs < 0) { cofs = 0; } Channel *needed = groupChain[cofs]; if (playerChain.indexOf(needed) == -1) { return RET_FALSE; } int mindepth = cofs + mindesc; int maxdepth = cofs + maxdesc; int pdepth = playerChain.count() - 1; m = (pdepth >= mindepth) && (pdepth <= maxdepth); } else { QStack s; p = c; while (p) { g = p->qhGroups.value(name); if (g) { if ((p != c) && ! g->bInheritable) break; s.push(g); if (! g->bInherit) break; } p = p->cParent; } while (! s.isEmpty()) { g = s.pop(); if (g->qsAdd.contains(pl->iId) || g->qsTemporary.contains(pl->iId) || g->qsTemporary.contains(- static_cast(pl->uiSession))) m = true; if (g->qsRemove.contains(pl->iId)) m = false; } } return invert ? !m : m; } #endif mumble-1.3.4/src/Utils.h0000664000175000017500000000212014010707273014674 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . // This header file defines common utility macros and values that are generally valid or used across multiple areas giving them generic scope (rather than localized or functionality-specific scope). #ifndef MUMBLE_UTILS_H_ #define MUMBLE_UTILS_H_ #include "QAtomicIntCompat.h" #if QT_VERSION >= 0x050000 #include "Qt4Compat.h" #endif #include #define iroundf(x) ( static_cast(x) ) #ifdef Q_OS_WIN # define STACKVAR(type, varname, count) type *varname=reinterpret_cast(_alloca(sizeof(type) * (count))) #else # ifdef WId typedef WId HWND; # endif # define __cdecl # define INVALID_SOCKET -1 # define SOCKET_ERROR -1 # define STACKVAR(type, varname, count) type varname[count] # define CopyMemory(dst,ptr,len) memcpy(dst,ptr,len) # define ZeroMemory(ptr,len) memset(ptr, 0, len) #endif #endif // MUMBLE_UTILS_H_ mumble-1.3.4/src/ServerAddress.cpp0000664000175000017500000000214114010707273016706 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifdef MUMBLE #include "mumble_pch.hpp" #else #include "murmur_pch.h" #endif #include "ServerAddress.h" ServerAddress::ServerAddress() : port(0) {} ServerAddress::ServerAddress(HostAddress host_, unsigned short port_) : host(host_) , port(port_) {} bool ServerAddress::isValid() const { return host.isValid() && port != 0; } bool operator==(const ServerAddress &lhs, const ServerAddress &rhs) { return lhs.host == rhs.host && lhs.port == rhs.port; } bool operator!=(const ServerAddress &lhs, const ServerAddress &rhs) { return !operator==(lhs, rhs); } bool operator<(const ServerAddress &lhs, const ServerAddress &rhs) { if (lhs.host < rhs.host) { return true; } else if (lhs.host == rhs.host) { if (lhs.port < rhs.port) { return true; } } return false; } uint qHash(const ServerAddress &key) { return qHash(key.host) ^ uint(key.port); } mumble-1.3.4/src/ServerResolverRecord.h0000664000175000017500000000146414010707273017735 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_SERVERRESOLVERRECORD_H_ #define MUMBLE_MUMBLE_SERVERRESOLVERRECORD_H_ #include #include #include "Net.h" // for HostAddress class ServerResolverRecord { public: ServerResolverRecord(); ServerResolverRecord(QString hostname_, quint16 port_, qint64 priority_, QList addresses_); QString hostname(); quint16 port(); qint64 priority(); QList addresses(); protected: QString m_hostname; quint16 m_port; qint64 m_priority; QList m_addresses; }; #endif mumble-1.3.4/src/Message.h0000664000175000017500000000534614010707273015175 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MESSAGE_H_ #define MUMBLE_MESSAGE_H_ #include #include #include /** Protobuf packet type enumeration for message handler generation. Warning: Only append to the end. */ #define MUMBLE_MH_ALL \ MUMBLE_MH_MSG(Version) \ MUMBLE_MH_MSG(UDPTunnel) \ MUMBLE_MH_MSG(Authenticate) \ MUMBLE_MH_MSG(Ping) \ MUMBLE_MH_MSG(Reject) \ MUMBLE_MH_MSG(ServerSync) \ MUMBLE_MH_MSG(ChannelRemove) \ MUMBLE_MH_MSG(ChannelState) \ MUMBLE_MH_MSG(UserRemove) \ MUMBLE_MH_MSG(UserState) \ MUMBLE_MH_MSG(BanList) \ MUMBLE_MH_MSG(TextMessage) \ MUMBLE_MH_MSG(PermissionDenied) \ MUMBLE_MH_MSG(ACL) \ MUMBLE_MH_MSG(QueryUsers) \ MUMBLE_MH_MSG(CryptSetup) \ MUMBLE_MH_MSG(ContextActionModify) \ MUMBLE_MH_MSG(ContextAction) \ MUMBLE_MH_MSG(UserList) \ MUMBLE_MH_MSG(VoiceTarget) \ MUMBLE_MH_MSG(PermissionQuery) \ MUMBLE_MH_MSG(CodecVersion) \ MUMBLE_MH_MSG(UserStats) \ MUMBLE_MH_MSG(RequestBlob) \ MUMBLE_MH_MSG(ServerConfig) \ MUMBLE_MH_MSG(SuggestConfig) class MessageHandler { public: enum UDPMessageType { UDPVoiceCELTAlpha, UDPPing, UDPVoiceSpeex, UDPVoiceCELTBeta, UDPVoiceOpus }; #define MUMBLE_MH_MSG(x) x, enum MessageType { MUMBLE_MH_ALL }; #undef MUMBLE_MH_MSG }; /// UDPMessageTypeIsValidVoicePacket checks whether the given /// UDPMessageType is a valid voice packet. inline bool UDPMessageTypeIsValidVoicePacket(MessageHandler::UDPMessageType umt) { switch (umt) { case MessageHandler::UDPVoiceCELTAlpha: case MessageHandler::UDPVoiceSpeex: case MessageHandler::UDPVoiceCELTBeta: case MessageHandler::UDPVoiceOpus: return true; case MessageHandler::UDPPing: return false; } return false; } inline QString u8(const ::std::string &str) { return QString::fromUtf8(str.data(), static_cast(str.length())); } inline QString u8(const ::std::wstring &str) { return QString::fromStdWString(str); } inline ::std::string u8(const QString &str) { const QByteArray &qba = str.toUtf8(); return ::std::string(qba.constData(), qba.length()); } inline QByteArray blob(const ::std::string &str) { return QByteArray(str.data(), static_cast(str.length())); } inline ::std::string blob(const QByteArray &str) { return ::std::string(str.constData(), str.length()); } inline QByteArray sha1(const QByteArray &blob) { return QCryptographicHash::hash(blob, QCryptographicHash::Sha1); } inline QByteArray sha1(const QString &str) { return QCryptographicHash::hash(str.toUtf8(), QCryptographicHash::Sha1); } #endif mumble-1.3.4/src/Net.h0000664000175000017500000000075014010707273014331 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_NET_H_ #define MUMBLE_NET_H_ #include #include #include #include "HostAddress.h" #ifndef DEFAULT_MUMBLE_PORT #define DEFAULT_MUMBLE_PORT 64738 #endif #endif mumble-1.3.4/src/SSLCipherInfoTable.h0000664000175000017500000007442514010707273017175 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . // Automatically generated by "generate-cipherinfo.py". DO NOT EDIT BY HAND. static const SSLCipherInfo cipher_info_lookup_table[] = { { // openssl_name "RC4-MD5", // rfc_name "TLS_RSA_WITH_RC4_128_MD5", // encryption "RC4_128", // key_exchange_verbose. kx = RSA, au = RSA "RSA", // forward secret false, // message authentication "HMAC-MD5", }, { // openssl_name "RC4-SHA", // rfc_name "TLS_RSA_WITH_RC4_128_SHA", // encryption "RC4_128", // key_exchange_verbose. kx = RSA, au = RSA "RSA", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "IDEA-CBC-SHA", // rfc_name "TLS_RSA_WITH_IDEA_CBC_SHA", // encryption "IDEA_128_CBC", // key_exchange_verbose. kx = RSA, au = RSA "RSA", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "DES-CBC3-SHA", // rfc_name "TLS_RSA_WITH_3DES_EDE_CBC_SHA", // encryption "3DES_168_EDE_CBC", // key_exchange_verbose. kx = RSA, au = RSA "RSA", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "DH-DSS-DES-CBC3-SHA", // rfc_name "TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA", // encryption "3DES_168_EDE_CBC", // key_exchange_verbose. kx = DH_DSS, au = DH "DH_DSS", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "DH-RSA-DES-CBC3-SHA", // rfc_name "TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA", // encryption "3DES_168_EDE_CBC", // key_exchange_verbose. kx = DH_RSA, au = DH "DH_RSA", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "EDH-DSS-DES-CBC3-SHA", // rfc_name "TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA", // encryption "3DES_168_EDE_CBC", // key_exchange_verbose. kx = DHE, au = DSS "DHE_DSS", // forward secret true, // message authentication "HMAC-SHA1", }, { // openssl_name "EDH-RSA-DES-CBC3-SHA", // rfc_name "TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA", // encryption "3DES_168_EDE_CBC", // key_exchange_verbose. kx = DHE, au = RSA "DHE_RSA", // forward secret true, // message authentication "HMAC-SHA1", }, { // openssl_name "ADH-RC4-MD5", // rfc_name "TLS_DH_anon_WITH_RC4_128_MD5", // encryption "RC4_128", // key_exchange_verbose. kx = DH, au = Anonymous "DH_anon", // forward secret false, // message authentication "HMAC-MD5", }, { // openssl_name "ADH-DES-CBC3-SHA", // rfc_name "TLS_DH_anon_WITH_3DES_EDE_CBC_SHA", // encryption "3DES_168_EDE_CBC", // key_exchange_verbose. kx = DH, au = Anonymous "DH_anon", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "AES128-SHA", // rfc_name "TLS_RSA_WITH_AES_128_CBC_SHA", // encryption "AES_128_CBC", // key_exchange_verbose. kx = RSA, au = RSA "RSA", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "DH-DSS-AES128-SHA", // rfc_name "TLS_DH_DSS_WITH_AES_128_CBC_SHA", // encryption "AES_128_CBC", // key_exchange_verbose. kx = DH_DSS, au = DH "DH_DSS", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "DH-RSA-AES128-SHA", // rfc_name "TLS_DH_RSA_WITH_AES_128_CBC_SHA", // encryption "AES_128_CBC", // key_exchange_verbose. kx = DH_RSA, au = DH "DH_RSA", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "DHE-DSS-AES128-SHA", // rfc_name "TLS_DHE_DSS_WITH_AES_128_CBC_SHA", // encryption "AES_128_CBC", // key_exchange_verbose. kx = DHE, au = DSS "DHE_DSS", // forward secret true, // message authentication "HMAC-SHA1", }, { // openssl_name "DHE-RSA-AES128-SHA", // rfc_name "TLS_DHE_RSA_WITH_AES_128_CBC_SHA", // encryption "AES_128_CBC", // key_exchange_verbose. kx = DHE, au = RSA "DHE_RSA", // forward secret true, // message authentication "HMAC-SHA1", }, { // openssl_name "ADH-AES128-SHA", // rfc_name "TLS_DH_anon_WITH_AES_128_CBC_SHA", // encryption "AES_128_CBC", // key_exchange_verbose. kx = DH, au = Anonymous "DH_anon", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "AES256-SHA", // rfc_name "TLS_RSA_WITH_AES_256_CBC_SHA", // encryption "AES_256_CBC", // key_exchange_verbose. kx = RSA, au = RSA "RSA", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "DH-DSS-AES256-SHA", // rfc_name "TLS_DH_DSS_WITH_AES_256_CBC_SHA", // encryption "AES_256_CBC", // key_exchange_verbose. kx = DH_DSS, au = DH "DH_DSS", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "DH-RSA-AES256-SHA", // rfc_name "TLS_DH_RSA_WITH_AES_256_CBC_SHA", // encryption "AES_256_CBC", // key_exchange_verbose. kx = DH_RSA, au = DH "DH_RSA", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "DHE-DSS-AES256-SHA", // rfc_name "TLS_DHE_DSS_WITH_AES_256_CBC_SHA", // encryption "AES_256_CBC", // key_exchange_verbose. kx = DHE, au = DSS "DHE_DSS", // forward secret true, // message authentication "HMAC-SHA1", }, { // openssl_name "DHE-RSA-AES256-SHA", // rfc_name "TLS_DHE_RSA_WITH_AES_256_CBC_SHA", // encryption "AES_256_CBC", // key_exchange_verbose. kx = DHE, au = RSA "DHE_RSA", // forward secret true, // message authentication "HMAC-SHA1", }, { // openssl_name "ADH-AES256-SHA", // rfc_name "TLS_DH_anon_WITH_AES_256_CBC_SHA", // encryption "AES_256_CBC", // key_exchange_verbose. kx = DH, au = Anonymous "DH_anon", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "AES128-SHA256", // rfc_name "TLS_RSA_WITH_AES_128_CBC_SHA256", // encryption "AES_128_CBC", // key_exchange_verbose. kx = RSA, au = RSA "RSA", // forward secret false, // message authentication "HMAC-SHA256", }, { // openssl_name "AES256-SHA256", // rfc_name "TLS_RSA_WITH_AES_256_CBC_SHA256", // encryption "AES_256_CBC", // key_exchange_verbose. kx = RSA, au = RSA "RSA", // forward secret false, // message authentication "HMAC-SHA256", }, { // openssl_name "DH-DSS-AES128-SHA256", // rfc_name "TLS_DH_DSS_WITH_AES_128_CBC_SHA256", // encryption "AES_128_CBC", // key_exchange_verbose. kx = DH_DSS, au = DH "DH_DSS", // forward secret false, // message authentication "HMAC-SHA256", }, { // openssl_name "DH-RSA-AES128-SHA256", // rfc_name "TLS_DH_RSA_WITH_AES_128_CBC_SHA256", // encryption "AES_128_CBC", // key_exchange_verbose. kx = DH_RSA, au = DH "DH_RSA", // forward secret false, // message authentication "HMAC-SHA256", }, { // openssl_name "DHE-DSS-AES128-SHA256", // rfc_name "TLS_DHE_DSS_WITH_AES_128_CBC_SHA256", // encryption "AES_128_CBC", // key_exchange_verbose. kx = DHE, au = DSS "DHE_DSS", // forward secret true, // message authentication "HMAC-SHA256", }, { // openssl_name "CAMELLIA128-SHA", // rfc_name "TLS_RSA_WITH_CAMELLIA_128_CBC_SHA", // encryption "CAMELLIA_128_CBC", // key_exchange_verbose. kx = RSA, au = RSA "RSA", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "DH-DSS-CAMELLIA128-SHA", // rfc_name "TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA", // encryption "CAMELLIA_128_CBC", // key_exchange_verbose. kx = DH_DSS, au = DH "DH_DSS", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "DH-RSA-CAMELLIA128-SHA", // rfc_name "TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA", // encryption "CAMELLIA_128_CBC", // key_exchange_verbose. kx = DH_RSA, au = DH "DH_RSA", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "DHE-DSS-CAMELLIA128-SHA", // rfc_name "TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA", // encryption "CAMELLIA_128_CBC", // key_exchange_verbose. kx = DHE, au = DSS "DHE_DSS", // forward secret true, // message authentication "HMAC-SHA1", }, { // openssl_name "DHE-RSA-CAMELLIA128-SHA", // rfc_name "TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA", // encryption "CAMELLIA_128_CBC", // key_exchange_verbose. kx = DHE, au = RSA "DHE_RSA", // forward secret true, // message authentication "HMAC-SHA1", }, { // openssl_name "ADH-CAMELLIA128-SHA", // rfc_name "TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA", // encryption "CAMELLIA_128_CBC", // key_exchange_verbose. kx = DH, au = Anonymous "DH_anon", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "DHE-RSA-AES128-SHA256", // rfc_name "TLS_DHE_RSA_WITH_AES_128_CBC_SHA256", // encryption "AES_128_CBC", // key_exchange_verbose. kx = DHE, au = RSA "DHE_RSA", // forward secret true, // message authentication "HMAC-SHA256", }, { // openssl_name "DH-DSS-AES256-SHA256", // rfc_name "TLS_DH_DSS_WITH_AES_256_CBC_SHA256", // encryption "AES_256_CBC", // key_exchange_verbose. kx = DH_DSS, au = DH "DH_DSS", // forward secret false, // message authentication "HMAC-SHA256", }, { // openssl_name "DH-RSA-AES256-SHA256", // rfc_name "TLS_DH_RSA_WITH_AES_256_CBC_SHA256", // encryption "AES_256_CBC", // key_exchange_verbose. kx = DH_RSA, au = DH "DH_RSA", // forward secret false, // message authentication "HMAC-SHA256", }, { // openssl_name "DHE-DSS-AES256-SHA256", // rfc_name "TLS_DHE_DSS_WITH_AES_256_CBC_SHA256", // encryption "AES_256_CBC", // key_exchange_verbose. kx = DHE, au = DSS "DHE_DSS", // forward secret true, // message authentication "HMAC-SHA256", }, { // openssl_name "DHE-RSA-AES256-SHA256", // rfc_name "TLS_DHE_RSA_WITH_AES_256_CBC_SHA256", // encryption "AES_256_CBC", // key_exchange_verbose. kx = DHE, au = RSA "DHE_RSA", // forward secret true, // message authentication "HMAC-SHA256", }, { // openssl_name "ADH-AES128-SHA256", // rfc_name "TLS_DH_anon_WITH_AES_128_CBC_SHA256", // encryption "AES_128_CBC", // key_exchange_verbose. kx = DH, au = Anonymous "DH_anon", // forward secret false, // message authentication "HMAC-SHA256", }, { // openssl_name "ADH-AES256-SHA256", // rfc_name "TLS_DH_anon_WITH_AES_256_CBC_SHA256", // encryption "AES_256_CBC", // key_exchange_verbose. kx = DH, au = Anonymous "DH_anon", // forward secret false, // message authentication "HMAC-SHA256", }, { // openssl_name "CAMELLIA256-SHA", // rfc_name "TLS_RSA_WITH_CAMELLIA_256_CBC_SHA", // encryption "CAMELLIA_256_CBC", // key_exchange_verbose. kx = RSA, au = RSA "RSA", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "DH-DSS-CAMELLIA256-SHA", // rfc_name "TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA", // encryption "CAMELLIA_256_CBC", // key_exchange_verbose. kx = DH_DSS, au = DH "DH_DSS", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "DH-RSA-CAMELLIA256-SHA", // rfc_name "TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA", // encryption "CAMELLIA_256_CBC", // key_exchange_verbose. kx = DH_RSA, au = DH "DH_RSA", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "DHE-DSS-CAMELLIA256-SHA", // rfc_name "TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA", // encryption "CAMELLIA_256_CBC", // key_exchange_verbose. kx = DHE, au = DSS "DHE_DSS", // forward secret true, // message authentication "HMAC-SHA1", }, { // openssl_name "DHE-RSA-CAMELLIA256-SHA", // rfc_name "TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA", // encryption "CAMELLIA_256_CBC", // key_exchange_verbose. kx = DHE, au = RSA "DHE_RSA", // forward secret true, // message authentication "HMAC-SHA1", }, { // openssl_name "ADH-CAMELLIA256-SHA", // rfc_name "TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA", // encryption "CAMELLIA_256_CBC", // key_exchange_verbose. kx = DH, au = Anonymous "DH_anon", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "PSK-RC4-SHA", // rfc_name "TLS_PSK_WITH_RC4_128_SHA", // encryption "RC4_128", // key_exchange_verbose. kx = PSK, au = PSK "PSK", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "PSK-3DES-EDE-CBC-SHA", // rfc_name "TLS_PSK_WITH_3DES_EDE_CBC_SHA", // encryption "3DES_168_EDE_CBC", // key_exchange_verbose. kx = PSK, au = PSK "PSK", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "PSK-AES128-CBC-SHA", // rfc_name "TLS_PSK_WITH_AES_128_CBC_SHA", // encryption "AES_128_CBC", // key_exchange_verbose. kx = PSK, au = PSK "PSK", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "PSK-AES256-CBC-SHA", // rfc_name "TLS_PSK_WITH_AES_256_CBC_SHA", // encryption "AES_256_CBC", // key_exchange_verbose. kx = PSK, au = PSK "PSK", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "SEED-SHA", // rfc_name "TLS_RSA_WITH_SEED_CBC_SHA", // encryption "SEED_128_CBC", // key_exchange_verbose. kx = RSA, au = RSA "RSA", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "DH-DSS-SEED-SHA", // rfc_name "TLS_DH_DSS_WITH_SEED_CBC_SHA", // encryption "SEED_128_CBC", // key_exchange_verbose. kx = DH_DSS, au = DH "DH_DSS", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "DH-RSA-SEED-SHA", // rfc_name "TLS_DH_RSA_WITH_SEED_CBC_SHA", // encryption "SEED_128_CBC", // key_exchange_verbose. kx = DH_RSA, au = DH "DH_RSA", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "DHE-DSS-SEED-SHA", // rfc_name "TLS_DHE_DSS_WITH_SEED_CBC_SHA", // encryption "SEED_128_CBC", // key_exchange_verbose. kx = DHE, au = DSS "DHE_DSS", // forward secret true, // message authentication "HMAC-SHA1", }, { // openssl_name "DHE-RSA-SEED-SHA", // rfc_name "TLS_DHE_RSA_WITH_SEED_CBC_SHA", // encryption "SEED_128_CBC", // key_exchange_verbose. kx = DHE, au = RSA "DHE_RSA", // forward secret true, // message authentication "HMAC-SHA1", }, { // openssl_name "ADH-SEED-SHA", // rfc_name "TLS_DH_anon_WITH_SEED_CBC_SHA", // encryption "SEED_128_CBC", // key_exchange_verbose. kx = DH, au = Anonymous "DH_anon", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "AES128-GCM-SHA256", // rfc_name "TLS_RSA_WITH_AES_128_GCM_SHA256", // encryption "AES_128_GCM", // key_exchange_verbose. kx = RSA, au = RSA "RSA", // forward secret false, // message authentication "AEAD", }, { // openssl_name "AES256-GCM-SHA384", // rfc_name "TLS_RSA_WITH_AES_256_GCM_SHA384", // encryption "AES_256_GCM", // key_exchange_verbose. kx = RSA, au = RSA "RSA", // forward secret false, // message authentication "AEAD", }, { // openssl_name "DHE-RSA-AES128-GCM-SHA256", // rfc_name "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256", // encryption "AES_128_GCM", // key_exchange_verbose. kx = DHE, au = RSA "DHE_RSA", // forward secret true, // message authentication "AEAD", }, { // openssl_name "DHE-RSA-AES256-GCM-SHA384", // rfc_name "TLS_DHE_RSA_WITH_AES_256_GCM_SHA384", // encryption "AES_256_GCM", // key_exchange_verbose. kx = DHE, au = RSA "DHE_RSA", // forward secret true, // message authentication "AEAD", }, { // openssl_name "DH-RSA-AES128-GCM-SHA256", // rfc_name "TLS_DH_RSA_WITH_AES_128_GCM_SHA256", // encryption "AES_128_GCM", // key_exchange_verbose. kx = DH_RSA, au = DH "DH_RSA", // forward secret false, // message authentication "AEAD", }, { // openssl_name "DH-RSA-AES256-GCM-SHA384", // rfc_name "TLS_DH_RSA_WITH_AES_256_GCM_SHA384", // encryption "AES_256_GCM", // key_exchange_verbose. kx = DH_RSA, au = DH "DH_RSA", // forward secret false, // message authentication "AEAD", }, { // openssl_name "DHE-DSS-AES128-GCM-SHA256", // rfc_name "TLS_DHE_DSS_WITH_AES_128_GCM_SHA256", // encryption "AES_128_GCM", // key_exchange_verbose. kx = DHE, au = DSS "DHE_DSS", // forward secret true, // message authentication "AEAD", }, { // openssl_name "DHE-DSS-AES256-GCM-SHA384", // rfc_name "TLS_DHE_DSS_WITH_AES_256_GCM_SHA384", // encryption "AES_256_GCM", // key_exchange_verbose. kx = DHE, au = DSS "DHE_DSS", // forward secret true, // message authentication "AEAD", }, { // openssl_name "DH-DSS-AES128-GCM-SHA256", // rfc_name "TLS_DH_DSS_WITH_AES_128_GCM_SHA256", // encryption "AES_128_GCM", // key_exchange_verbose. kx = DH_DSS, au = DH "DH_DSS", // forward secret false, // message authentication "AEAD", }, { // openssl_name "DH-DSS-AES256-GCM-SHA384", // rfc_name "TLS_DH_DSS_WITH_AES_256_GCM_SHA384", // encryption "AES_256_GCM", // key_exchange_verbose. kx = DH_DSS, au = DH "DH_DSS", // forward secret false, // message authentication "AEAD", }, { // openssl_name "ADH-AES128-GCM-SHA256", // rfc_name "TLS_DH_anon_WITH_AES_128_GCM_SHA256", // encryption "AES_128_GCM", // key_exchange_verbose. kx = DH, au = Anonymous "DH_anon", // forward secret false, // message authentication "AEAD", }, { // openssl_name "ADH-AES256-GCM-SHA384", // rfc_name "TLS_DH_anon_WITH_AES_256_GCM_SHA384", // encryption "AES_256_GCM", // key_exchange_verbose. kx = DH, au = Anonymous "DH_anon", // forward secret false, // message authentication "AEAD", }, { // openssl_name "ECDH-ECDSA-RC4-SHA", // rfc_name "TLS_ECDH_ECDSA_WITH_RC4_128_SHA", // encryption "RC4_128", // key_exchange_verbose. kx = ECDH_ECDSA, au = ECDH "ECDH_ECDSA", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "ECDH-ECDSA-DES-CBC3-SHA", // rfc_name "TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA", // encryption "3DES_168_EDE_CBC", // key_exchange_verbose. kx = ECDH_ECDSA, au = ECDH "ECDH_ECDSA", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "ECDH-ECDSA-AES128-SHA", // rfc_name "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA", // encryption "AES_128_CBC", // key_exchange_verbose. kx = ECDH_ECDSA, au = ECDH "ECDH_ECDSA", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "ECDH-ECDSA-AES256-SHA", // rfc_name "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA", // encryption "AES_256_CBC", // key_exchange_verbose. kx = ECDH_ECDSA, au = ECDH "ECDH_ECDSA", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "ECDHE-ECDSA-RC4-SHA", // rfc_name "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA", // encryption "RC4_128", // key_exchange_verbose. kx = ECDHE, au = ECDSA "ECDHE_ECDSA", // forward secret true, // message authentication "HMAC-SHA1", }, { // openssl_name "ECDHE-ECDSA-DES-CBC3-SHA", // rfc_name "TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA", // encryption "3DES_168_EDE_CBC", // key_exchange_verbose. kx = ECDHE, au = ECDSA "ECDHE_ECDSA", // forward secret true, // message authentication "HMAC-SHA1", }, { // openssl_name "ECDHE-ECDSA-AES128-SHA", // rfc_name "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA", // encryption "AES_128_CBC", // key_exchange_verbose. kx = ECDHE, au = ECDSA "ECDHE_ECDSA", // forward secret true, // message authentication "HMAC-SHA1", }, { // openssl_name "ECDHE-ECDSA-AES256-SHA", // rfc_name "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA", // encryption "AES_256_CBC", // key_exchange_verbose. kx = ECDHE, au = ECDSA "ECDHE_ECDSA", // forward secret true, // message authentication "HMAC-SHA1", }, { // openssl_name "ECDH-RSA-RC4-SHA", // rfc_name "TLS_ECDH_RSA_WITH_RC4_128_SHA", // encryption "RC4_128", // key_exchange_verbose. kx = ECDH_RSA, au = ECDH "ECDH_RSA", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "ECDH-RSA-DES-CBC3-SHA", // rfc_name "TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA", // encryption "3DES_168_EDE_CBC", // key_exchange_verbose. kx = ECDH_RSA, au = ECDH "ECDH_RSA", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "ECDH-RSA-AES128-SHA", // rfc_name "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA", // encryption "AES_128_CBC", // key_exchange_verbose. kx = ECDH_RSA, au = ECDH "ECDH_RSA", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "ECDH-RSA-AES256-SHA", // rfc_name "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA", // encryption "AES_256_CBC", // key_exchange_verbose. kx = ECDH_RSA, au = ECDH "ECDH_RSA", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "ECDHE-RSA-RC4-SHA", // rfc_name "TLS_ECDHE_RSA_WITH_RC4_128_SHA", // encryption "RC4_128", // key_exchange_verbose. kx = ECDHE, au = RSA "ECDHE_RSA", // forward secret true, // message authentication "HMAC-SHA1", }, { // openssl_name "ECDHE-RSA-DES-CBC3-SHA", // rfc_name "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA", // encryption "3DES_168_EDE_CBC", // key_exchange_verbose. kx = ECDHE, au = RSA "ECDHE_RSA", // forward secret true, // message authentication "HMAC-SHA1", }, { // openssl_name "ECDHE-RSA-AES128-SHA", // rfc_name "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", // encryption "AES_128_CBC", // key_exchange_verbose. kx = ECDHE, au = RSA "ECDHE_RSA", // forward secret true, // message authentication "HMAC-SHA1", }, { // openssl_name "ECDHE-RSA-AES256-SHA", // rfc_name "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA", // encryption "AES_256_CBC", // key_exchange_verbose. kx = ECDHE, au = RSA "ECDHE_RSA", // forward secret true, // message authentication "HMAC-SHA1", }, { // openssl_name "AECDH-RC4-SHA", // rfc_name "TLS_ECDH_anon_WITH_RC4_128_SHA", // encryption "RC4_128", // key_exchange_verbose. kx = ECDH, au = Anonymous "ECDH_anon", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "AECDH-DES-CBC3-SHA", // rfc_name "TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA", // encryption "3DES_168_EDE_CBC", // key_exchange_verbose. kx = ECDH, au = Anonymous "ECDH_anon", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "AECDH-AES128-SHA", // rfc_name "TLS_ECDH_anon_WITH_AES_128_CBC_SHA", // encryption "AES_128_CBC", // key_exchange_verbose. kx = ECDH, au = Anonymous "ECDH_anon", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "AECDH-AES256-SHA", // rfc_name "TLS_ECDH_anon_WITH_AES_256_CBC_SHA", // encryption "AES_256_CBC", // key_exchange_verbose. kx = ECDH, au = Anonymous "ECDH_anon", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "SRP-3DES-EDE-CBC-SHA", // rfc_name "TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA", // encryption "3DES_168_EDE_CBC", // key_exchange_verbose. kx = SRP, au = SRP "SRP_SHA", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "SRP-RSA-3DES-EDE-CBC-SHA", // rfc_name "TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA", // encryption "3DES_168_EDE_CBC", // key_exchange_verbose. kx = SRP, au = RSA "SRP_SHA_RSA", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "SRP-DSS-3DES-EDE-CBC-SHA", // rfc_name "TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA", // encryption "3DES_168_EDE_CBC", // key_exchange_verbose. kx = SRP, au = DSS "SRP_SHA_DSS", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "SRP-AES-128-CBC-SHA", // rfc_name "TLS_SRP_SHA_WITH_AES_128_CBC_SHA", // encryption "AES_128_CBC", // key_exchange_verbose. kx = SRP, au = SRP "SRP_SHA", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "SRP-RSA-AES-128-CBC-SHA", // rfc_name "TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA", // encryption "AES_128_CBC", // key_exchange_verbose. kx = SRP, au = RSA "SRP_SHA_RSA", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "SRP-DSS-AES-128-CBC-SHA", // rfc_name "TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA", // encryption "AES_128_CBC", // key_exchange_verbose. kx = SRP, au = DSS "SRP_SHA_DSS", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "SRP-AES-256-CBC-SHA", // rfc_name "TLS_SRP_SHA_WITH_AES_256_CBC_SHA", // encryption "AES_256_CBC", // key_exchange_verbose. kx = SRP, au = SRP "SRP_SHA", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "SRP-RSA-AES-256-CBC-SHA", // rfc_name "TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA", // encryption "AES_256_CBC", // key_exchange_verbose. kx = SRP, au = RSA "SRP_SHA_RSA", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "SRP-DSS-AES-256-CBC-SHA", // rfc_name "TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA", // encryption "AES_256_CBC", // key_exchange_verbose. kx = SRP, au = DSS "SRP_SHA_DSS", // forward secret false, // message authentication "HMAC-SHA1", }, { // openssl_name "ECDHE-ECDSA-AES128-SHA256", // rfc_name "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256", // encryption "AES_128_CBC", // key_exchange_verbose. kx = ECDHE, au = ECDSA "ECDHE_ECDSA", // forward secret true, // message authentication "HMAC-SHA256", }, { // openssl_name "ECDHE-ECDSA-AES256-SHA384", // rfc_name "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384", // encryption "AES_256_CBC", // key_exchange_verbose. kx = ECDHE, au = ECDSA "ECDHE_ECDSA", // forward secret true, // message authentication "HMAC-SHA384", }, { // openssl_name "ECDH-ECDSA-AES128-SHA256", // rfc_name "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256", // encryption "AES_128_CBC", // key_exchange_verbose. kx = ECDH_ECDSA, au = ECDH "ECDH_ECDSA", // forward secret false, // message authentication "HMAC-SHA256", }, { // openssl_name "ECDH-ECDSA-AES256-SHA384", // rfc_name "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384", // encryption "AES_256_CBC", // key_exchange_verbose. kx = ECDH_ECDSA, au = ECDH "ECDH_ECDSA", // forward secret false, // message authentication "HMAC-SHA384", }, { // openssl_name "ECDHE-RSA-AES128-SHA256", // rfc_name "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256", // encryption "AES_128_CBC", // key_exchange_verbose. kx = ECDHE, au = RSA "ECDHE_RSA", // forward secret true, // message authentication "HMAC-SHA256", }, { // openssl_name "ECDHE-RSA-AES256-SHA384", // rfc_name "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384", // encryption "AES_256_CBC", // key_exchange_verbose. kx = ECDHE, au = RSA "ECDHE_RSA", // forward secret true, // message authentication "HMAC-SHA384", }, { // openssl_name "ECDH-RSA-AES128-SHA256", // rfc_name "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256", // encryption "AES_128_CBC", // key_exchange_verbose. kx = ECDH_RSA, au = ECDH "ECDH_RSA", // forward secret false, // message authentication "HMAC-SHA256", }, { // openssl_name "ECDH-RSA-AES256-SHA384", // rfc_name "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384", // encryption "AES_256_CBC", // key_exchange_verbose. kx = ECDH_RSA, au = ECDH "ECDH_RSA", // forward secret false, // message authentication "HMAC-SHA384", }, { // openssl_name "ECDHE-ECDSA-AES128-GCM-SHA256", // rfc_name "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", // encryption "AES_128_GCM", // key_exchange_verbose. kx = ECDHE, au = ECDSA "ECDHE_ECDSA", // forward secret true, // message authentication "AEAD", }, { // openssl_name "ECDHE-ECDSA-AES256-GCM-SHA384", // rfc_name "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", // encryption "AES_256_GCM", // key_exchange_verbose. kx = ECDHE, au = ECDSA "ECDHE_ECDSA", // forward secret true, // message authentication "AEAD", }, { // openssl_name "ECDH-ECDSA-AES128-GCM-SHA256", // rfc_name "TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256", // encryption "AES_128_GCM", // key_exchange_verbose. kx = ECDH_ECDSA, au = ECDH "ECDH_ECDSA", // forward secret false, // message authentication "AEAD", }, { // openssl_name "ECDH-ECDSA-AES256-GCM-SHA384", // rfc_name "TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384", // encryption "AES_256_GCM", // key_exchange_verbose. kx = ECDH_ECDSA, au = ECDH "ECDH_ECDSA", // forward secret false, // message authentication "AEAD", }, { // openssl_name "ECDHE-RSA-AES128-GCM-SHA256", // rfc_name "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", // encryption "AES_128_GCM", // key_exchange_verbose. kx = ECDHE, au = RSA "ECDHE_RSA", // forward secret true, // message authentication "AEAD", }, { // openssl_name "ECDHE-RSA-AES256-GCM-SHA384", // rfc_name "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384", // encryption "AES_256_GCM", // key_exchange_verbose. kx = ECDHE, au = RSA "ECDHE_RSA", // forward secret true, // message authentication "AEAD", }, { // openssl_name "ECDH-RSA-AES128-GCM-SHA256", // rfc_name "TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256", // encryption "AES_128_GCM", // key_exchange_verbose. kx = ECDH_RSA, au = ECDH "ECDH_RSA", // forward secret false, // message authentication "AEAD", }, { // openssl_name "ECDH-RSA-AES256-GCM-SHA384", // rfc_name "TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384", // encryption "AES_256_GCM", // key_exchange_verbose. kx = ECDH_RSA, au = ECDH "ECDH_RSA", // forward secret false, // message authentication "AEAD", }, }; mumble-1.3.4/src/SSL.cpp0000664000175000017500000002017214010707273014577 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifdef MUMBLE #include "mumble_pch.hpp" #else #include "murmur_pch.h" #endif #include "SSL.h" #include "SSLLocks.h" #include "Version.h" void MumbleSSL::initialize() { // Let Qt initialize its copy of OpenSSL, if it's different than // Mumble's. (Initialization is a side-effect of calling // QSslSocket::supportsSsl()). QSslSocket::supportsSsl(); // Initialize our copy of OpenSSL. SSL_library_init(); // Safe to discard return value, per OpenSSL man pages. SSL_load_error_strings(); // Determine if a locking callback has not been set. // This should be the case if there are multiple copies // of OpensSSL in the address space. This is mostly due // to Qt dynamically loading OpenSSL when it is not // configured with -openssl-linked. // // If we detect that no locking callback is configured, we // have to set it up ourselves to allow multi-threaded use // of OpenSSL. if (CRYPTO_get_locking_callback() == NULL) { SSLLocks::initialize(); } } void MumbleSSL::destroy() { SSLLocks::destroy(); } QString MumbleSSL::defaultOpenSSLCipherString() { return QLatin1String("EECDH+AESGCM:EDH+aRSA+AESGCM:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:AES256-SHA:AES128-SHA"); } QList MumbleSSL::ciphersFromOpenSSLCipherString(QString cipherString) { QList chosenCiphers; SSL_CTX *ctx = NULL; SSL *ssl = NULL; const SSL_METHOD *meth = NULL; int i = 0; QByteArray csbuf = cipherString.toLatin1(); const char *ciphers = csbuf.constData(); meth = SSLv23_server_method(); if (meth == NULL) { qWarning("MumbleSSL: unable to get SSL method"); goto out; } // We use const_cast to be compatible with OpenSSL 0.9.8. ctx = SSL_CTX_new(const_cast(meth)); if (ctx == NULL) { qWarning("MumbleSSL: unable to allocate SSL_CTX"); goto out; } if (!SSL_CTX_set_cipher_list(ctx, ciphers)) { qWarning("MumbleSSL: error parsing OpenSSL cipher string in ciphersFromOpenSSLCipherString"); goto out; } ssl = SSL_new(ctx); if (ssl == NULL) { qWarning("MumbleSSL: unable to create SSL object in ciphersFromOpenSSLCipherString"); goto out; } while (1) { const char *name = SSL_get_cipher_list(ssl, i); if (name == NULL) { break; } #if QT_VERSION >= 0x050300 QSslCipher c = QSslCipher(QString::fromLatin1(name)); if (!c.isNull()) { chosenCiphers << c; } #else foreach (const QSslCipher &c, QSslSocket::supportedCiphers()) { if (c.name() == QString::fromLatin1(name)) { chosenCiphers << c; } } #endif ++i; } out: SSL_CTX_free(ctx); SSL_free(ssl); return chosenCiphers; } void MumbleSSL::addSystemCA() { #if QT_VERSION < 0x040700 && !defined(NO_SYSTEM_CA_OVERRIDE) #if defined(Q_OS_WIN) QStringList qsl; qsl << QLatin1String("Ca"); qsl << QLatin1String("Root"); qsl << QLatin1String("AuthRoot"); foreach(const QString &store, qsl) { HCERTSTORE hCertStore; PCCERT_CONTEXT pCertContext = NULL; bool found = false; hCertStore = CertOpenSystemStore(NULL, store.utf16()); if (! hCertStore) { qWarning("SSL: Failed to open CA store %s", qPrintable(store)); continue; } while (pCertContext = CertEnumCertificatesInStore(hCertStore, pCertContext)) { QByteArray qba(reinterpret_cast(pCertContext->pbCertEncoded), pCertContext->cbCertEncoded); QList ql = QSslCertificate::fromData(qba, QSsl::Pem); ql += QSslCertificate::fromData(qba, QSsl::Der); if (! ql.isEmpty()) { found = true; QSslSocket::addDefaultCaCertificates(ql); } } if (found) qWarning("SSL: Added CA certificates from system store '%s'", qPrintable(store)); CertCloseStore(hCertStore, 0); } #elif defined(Q_OS_MAC) CFArrayRef certs = NULL; bool found = false; if (SecTrustCopyAnchorCertificates(&certs) == noErr) { int ncerts = CFArrayGetCount(certs); for (int i = 0; i < ncerts; i++) { CFDataRef data = NULL; SecCertificateRef cert = reinterpret_cast(const_cast(CFArrayGetValueAtIndex(certs, i))); if (! cert) continue; if (SecKeychainItemExport(cert, kSecFormatX509Cert, kSecItemPemArmour, NULL, &data) == noErr) { const char *ptr = reinterpret_cast(CFDataGetBytePtr(data)); int len = CFDataGetLength(data); QByteArray qba(ptr, len); QList ql = QSslCertificate::fromData(qba, QSsl::Pem); if (! ql.isEmpty()) { found = true; QSslSocket::addDefaultCaCertificates(ql); } } } CFRelease(certs); if (found) qWarning("SSL: Added CA certificates from 'System Roots' store."); } #elif defined(Q_OS_UNIX) QStringList qsl; #ifdef SYSTEM_CA_DIR QSslSocket::addDefaultCaCertificates(QLatin1String(MUMTEXT(SYSTEM_CA_DIR))); #else #ifdef SYSTEM_CA_BUNDLE qsl << QLatin1String(MUMTEXT(SYSTEM_CA_BUNDLE)); #else #ifdef __FreeBSD__ qsl << QLatin1String("/usr/local/share/certs/ca-root-nss.crt"); #else qsl << QLatin1String("/etc/pki/tls/certs/ca-bundle.crt"); qsl << QLatin1String("/etc/ssl/certs/ca-certificates.crt"); #endif #endif foreach(const QString &filename, qsl) { QFile f(filename); if (f.exists() && f.open(QIODevice::ReadOnly)) { QList ql = QSslCertificate::fromDevice(&f, QSsl::Pem); ql += QSslCertificate::fromDevice(&f, QSsl::Der); if (! ql.isEmpty()) { qWarning("SSL: Added CA certificates from '%s'", qPrintable(filename)); QSslSocket::addDefaultCaCertificates(ql); } } } #endif // SYSTEM_CA_DIR #endif // Q_OS_UNIX QSet digests; QList ql; foreach(const QSslCertificate &crt, QSslSocket::defaultCaCertificates()) { QByteArray digest = crt.digest(QCryptographicHash::Sha1); if (! digests.contains(digest) && crt.isValid()) { ql << crt; digests.insert(digest); } } QSslSocket::setDefaultCaCertificates(ql); #endif // NO_SYSTEM_CA_OVERRIDE // Don't perform on-demand loading of root certificates #if QT_VERSION >= 0x050500 QSslSocket::addDefaultCaCertificates(QSslConfiguration::systemCaCertificates()); #elif QT_VERSION >= 0x040800 QSslSocket::addDefaultCaCertificates(QSslSocket::systemCaCertificates()); #endif #ifdef Q_OS_WIN // Work around issue #1271. // Skype's click-to-call feature creates an enormous // amount of certificates in the Root CA store. { QSslConfiguration sslCfg = QSslConfiguration::defaultConfiguration(); QList caList = sslCfg.caCertificates(); QList filteredCaList; foreach (QSslCertificate cert, caList) { #if QT_VERSION >= 0x050000 QStringList orgs = cert.subjectInfo(QSslCertificate::Organization); bool skip = false; foreach (QString ou, orgs) { if (ou.contains(QLatin1String("Skype"), Qt::CaseInsensitive)) { skip = true; break; } } if (skip) { continue; } #else QString ou = cert.subjectInfo(QSslCertificate::Organization); if (ou.contains(QLatin1String("Skype"), Qt::CaseInsensitive)) { continue; } #endif filteredCaList.append(cert); } sslCfg.setCaCertificates(filteredCaList); QSslConfiguration::setDefaultConfiguration(sslCfg); qWarning("SSL: CA certificate filter applied. Filtered size: %i, original size: %i", filteredCaList.size(), caList.size()); } #endif } QString MumbleSSL::protocolToString(QSsl::SslProtocol protocol) { switch(protocol) { case QSsl::SslV3: return QLatin1String("SSL 3"); case QSsl::SslV2: return QLatin1String("SSL 2"); #if QT_VERSION >= 0x050000 case QSsl::TlsV1_0: return QLatin1String("TLS 1.0"); case QSsl::TlsV1_1: return QLatin1String("TLS 1.1"); case QSsl::TlsV1_2: return QLatin1String("TLS 1.2"); #if QT_VERSION >= 0x050C00 case QSsl::TlsV1_3: return QLatin1String("TLS 1.3"); #endif #else case QSsl::TlsV1: return QLatin1String("TLS 1.0"); #endif case QSsl::AnyProtocol: return QLatin1String("AnyProtocol"); #if QT_VERSION >= 0x040800 case QSsl::TlsV1SslV3: return QLatin1String("TlsV1SslV3"); case QSsl::SecureProtocols: return QLatin1String("SecureProtocols"); #endif default: case QSsl::UnknownProtocol: return QLatin1String("UnknownProtocol"); } } mumble-1.3.4/src/OSInfo.cpp0000664000175000017500000004202214010707273015271 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifdef MUMBLE #include "mumble_pch.hpp" #else #include "murmur_pch.h" #endif #if defined(Q_OS_WIN) #include #endif #if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) #include #endif #if defined(Q_OS_MAC) #include #include #include // Ignore deprecation warnings for Gestalt. // See mumble-voip/mumble#3290 for more information. #pragma GCC diagnostic ignored "-Wdeprecated-declarations" #endif #include "OSInfo.h" #include "Version.h" #if defined(Q_OS_WIN) // regString converts a wchar_t string of size to a // QString. If the string contains a NUL value, that // NUL value will terminate the string. static QString regString(wchar_t *string, int size) { if (size <= 0) { return QString(); } // If string contains a NUL, adjust the size such // that the NUL is not included in the returned // string. const size_t adjustedSize = wcsnlen(string, static_cast(size)); // The return value of wcsnlen is <= size which is // an int, so casting adjustedSize to int is safe. return QString::fromWCharArray(string, static_cast(adjustedSize)); } /// Query for a Windows 10-style displayable version. /// /// This returns a string of the kind: /// /// Windows 10 Pro x86 1607 14390.0 /// /// which is: /// /// $ProductName $Arch $Version $Build.$Ubr /// /// Of note, $Version is formatted as YYMM. /// So, 1607 is a Windows 10 update released in July 2016. /// /// This function can be called on non-Windows 10 OSes. /// On those, this functions fails to query some of the /// registry keys used for building the version string /// to be returned. Because of that, it is safe to call /// this function, and if it returns an empty/null string, /// a legacy version string can be displayed. static QString win10DisplayableVersion() { HKEY key = 0; LONG err = 0; DWORD len = 0; wchar_t buf[64]; DWORD dw = 0; QString productName; QString releaseId; QString currentBuild; QString ubr; QString arch; err = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", 0, KEY_READ, &key); if (err != ERROR_SUCCESS) { RegCloseKey(key); return QString(); } len = sizeof(buf); err = RegQueryValueEx(key, L"ProductName", NULL, NULL, reinterpret_cast(&buf[0]), &len); if (err != ERROR_SUCCESS) { RegCloseKey(key); return QString(); } productName = regString(buf, static_cast(len / sizeof(buf[0]))); len = sizeof(buf); err = RegQueryValueEx(key, L"ReleaseId", NULL, NULL, reinterpret_cast(&buf[0]), &len); if (err != ERROR_SUCCESS) { RegCloseKey(key); return QString(); } releaseId = regString(buf, static_cast(len / sizeof(buf[0]))); len = sizeof(buf); err = RegQueryValueEx(key, L"CurrentBuild", NULL, NULL, reinterpret_cast(&buf[0]), &len); if (err != ERROR_SUCCESS) { RegCloseKey(key); return QString(); } currentBuild = regString(buf, static_cast(len / sizeof(buf[0]))); len = sizeof(dw); err = RegQueryValueEx(key, L"UBR", NULL, NULL, reinterpret_cast(&dw), &len); if (err != ERROR_SUCCESS) { RegCloseKey(key); return QString(); } ubr = QString::number(static_cast(dw), 10); RegCloseKey(key); _SYSTEM_INFO si; GetNativeSystemInfo(&si); if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) { arch = QLatin1String("x64"); } else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL) { arch = QLatin1String("x86"); } else { arch = QLatin1String("(unknown arch)"); } return QString::fromLatin1("%1 %2 %3 %4.%5").arg(productName, arch, releaseId, currentBuild, ubr); } #endif QString OSInfo::getMacHash(const QList &qlBind) { QString first, second, third; foreach(const QNetworkInterface &qni, QNetworkInterface::allInterfaces()) { if (! qni.isValid()) continue; if (qni.flags() & QNetworkInterface::IsLoopBack) continue; if (qni.hardwareAddress().isEmpty()) continue; QString hash = QString::fromUtf8(QCryptographicHash::hash(qni.hardwareAddress().toUtf8(), QCryptographicHash::Sha1).toHex()); if (third.isEmpty() || third > hash) third = hash; if (!(qni.flags() & (QNetworkInterface::IsUp | QNetworkInterface::IsRunning))) continue; if (second.isEmpty() || second > hash) second = hash; foreach(const QNetworkAddressEntry &qnae, qni.addressEntries()) { const QHostAddress &qha = qnae.ip(); if (qlBind.isEmpty() || qlBind.contains(qha)) { if (first.isEmpty() || first > hash) first = hash; } } } if (! first.isEmpty()) return first; if (! second.isEmpty()) return second; if (! third.isEmpty()) return third; return QString(); } QString OSInfo::getOS() { #if defined(Q_OS_WIN) # if defined(Q_OS_WIN64) return QLatin1String("WinX64"); # else return QLatin1String("Win"); # endif #elif defined(Q_OS_MAC) return QLatin1String("OSX"); #else return QLatin1String("X11"); #endif } QString OSInfo::getOSVersion() { static QString qsCached; if (! qsCached.isNull()) return qsCached.isEmpty() ? QString() : qsCached; QString os; #if defined(Q_OS_WIN) OSVERSIONINFOEXW ovi; memset(&ovi, 0, sizeof(ovi)); ovi.dwOSVersionInfoSize=sizeof(ovi); if (!GetVersionEx(reinterpret_cast(&ovi))) { return QString(); } os.sprintf("%lu.%lu.%lu.%lu", static_cast(ovi.dwMajorVersion), static_cast(ovi.dwMinorVersion), static_cast(ovi.dwBuildNumber), (ovi.wProductType == VER_NT_WORKSTATION) ? 1UL : 0UL); #elif defined(Q_OS_MAC) SInt32 major, minor, bugfix; OSErr err = Gestalt(gestaltSystemVersionMajor, &major); if (err == noErr) err = Gestalt(gestaltSystemVersionMinor, &minor); if (err == noErr) err = Gestalt(gestaltSystemVersionBugFix, &bugfix); if (err != noErr) return QString::number(QSysInfo::MacintoshVersion, 16); char *buildno = NULL; char buildno_buf[32]; size_t sz_buildno_buf = sizeof(buildno); int ret = sysctlbyname("kern.osversion", buildno_buf, &sz_buildno_buf, NULL, 0); if (ret == 0) { buildno = &buildno_buf[0]; } os.sprintf("%lu.%lu.%lu %s", static_cast(major), static_cast(minor), static_cast(bugfix), buildno ? buildno : "unknown"); #else #ifdef Q_OS_LINUX QProcess qp; QStringList args; args << QLatin1String("-s"); args << QLatin1String("-d"); qp.start(QLatin1String("lsb_release"), args); if (qp.waitForFinished(5000)) { os = QString::fromUtf8(qp.readAll()).simplified(); if (os.startsWith(QLatin1Char('"')) && os.endsWith(QLatin1Char('"'))) os = os.mid(1, os.length() - 2).trimmed(); } if (os.isEmpty()) qWarning("OSInfo: Failed to execute lsb_release"); qp.terminate(); if (! qp.waitForFinished(1000)) qp.kill(); #endif if (os.isEmpty()) { struct utsname un; #ifdef Q_OS_SOLARIS // Solaris's uname() returns a non-negative number on success. if (uname(&un) >= 0) { #else // other UNIX-like systems return a 0 on success. if (uname(&un) == 0) { #endif os.sprintf("%s %s", un.sysname, un.release); } } #endif if (! os.isNull()) qsCached = os; else qsCached = QLatin1String(""); return qsCached; } QString OSInfo::getOSDisplayableVersion() { #if defined(Q_OS_WIN) QString osdispver; // Try to query for a Windows 10-style // displayable version. If this call // returns a non-empty string, we're // on Windows 10 or greater and should // show that string. osdispver = win10DisplayableVersion(); if (!osdispver.isEmpty()) { return osdispver; } OSVERSIONINFOEXW ovi; memset(&ovi, 0, sizeof(ovi)); ovi.dwOSVersionInfoSize = sizeof(ovi); if (!GetVersionEx(reinterpret_cast(&ovi))) { return QString(); } _SYSTEM_INFO si; GetNativeSystemInfo(&si); if (ovi.dwMajorVersion >= 6) { if (ovi.dwMajorVersion == 10) { if (ovi.wProductType == VER_NT_WORKSTATION) { osdispver = QLatin1String("Windows 10"); } else { osdispver = QLatin1String("Windows 10 Server"); } } else if (ovi.dwMajorVersion == 6) { if (ovi.dwMinorVersion == 0) { if (ovi.wProductType == VER_NT_WORKSTATION) { osdispver = QLatin1String("Windows Vista"); } else { osdispver = QLatin1String("Windows Server 2008"); } } else if (ovi.dwMinorVersion == 1) { if (ovi.wProductType == VER_NT_WORKSTATION) { osdispver = QLatin1String("Windows 7"); } else { osdispver = QLatin1String("Windows Server 2008 R2"); } } else if (ovi.dwMinorVersion == 2) { if (ovi.wProductType == VER_NT_WORKSTATION) { osdispver = QLatin1String("Windows 8"); } else { osdispver = QLatin1String("Windows Server 2012"); } } else if (ovi.dwMinorVersion == 3) { if (ovi.wProductType == VER_NT_WORKSTATION) { osdispver = QLatin1String("Windows 8.1"); } else { osdispver = QLatin1String("Windows Server 2012 R2"); } } else if (ovi.dwMinorVersion == 4) { if (ovi.wProductType == VER_NT_WORKSTATION) { osdispver = QLatin1String("Windows 10"); } else { osdispver = QLatin1String("Windows 10 Server"); } } } typedef BOOL (WINAPI *PGPI)(DWORD, DWORD, DWORD, DWORD, PDWORD); PGPI pGetProductInfo = (PGPI) GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetProductInfo"); if (pGetProductInfo == NULL) { return QString(); } DWORD dwType = 0; if (!pGetProductInfo(ovi.dwMajorVersion, ovi.dwMinorVersion, 0, 0, &dwType)) { return QString(); } switch(dwType) { case PRODUCT_ULTIMATE: osdispver.append(QLatin1String(" Ultimate Edition")); break; case PRODUCT_PROFESSIONAL: osdispver.append(QLatin1String(" Professional")); break; case PRODUCT_HOME_PREMIUM: osdispver.append(QLatin1String(" Home Premium Edition")); break; case PRODUCT_HOME_BASIC: osdispver.append(QLatin1String(" Home Basic Edition")); break; case PRODUCT_ENTERPRISE: osdispver.append(QLatin1String(" Enterprise Edition")); break; case PRODUCT_BUSINESS: osdispver.append(QLatin1String(" Business Edition")); break; case PRODUCT_STARTER: osdispver.append(QLatin1String(" Starter Edition")); break; case PRODUCT_CLUSTER_SERVER: osdispver.append(QLatin1String(" Cluster Server Edition")); break; case PRODUCT_DATACENTER_SERVER: osdispver.append(QLatin1String(" Datacenter Edition")); break; case PRODUCT_DATACENTER_SERVER_CORE: osdispver.append(QLatin1String(" Datacenter Edition (core installation)")); break; case PRODUCT_ENTERPRISE_SERVER: osdispver.append(QLatin1String(" Enterprise Edition")); break; case PRODUCT_ENTERPRISE_SERVER_CORE: osdispver.append(QLatin1String(" Enterprise Edition (core installation)")); break; case PRODUCT_ENTERPRISE_SERVER_IA64: osdispver.append(QLatin1String(" Enterprise Edition for Itanium-based Systems")); break; case PRODUCT_SMALLBUSINESS_SERVER: osdispver.append(QLatin1String(" Small Business Server")); break; case PRODUCT_SMALLBUSINESS_SERVER_PREMIUM: osdispver.append(QLatin1String(" Small Business Server Premium Edition")); break; case PRODUCT_STANDARD_SERVER: osdispver.append(QLatin1String(" Standard Edition")); break; case PRODUCT_STANDARD_SERVER_CORE: osdispver.append(QLatin1String(" Standard Edition (core installation)")); break; case PRODUCT_WEB_SERVER: osdispver.append(QLatin1String(" Web Server Edition")); break; } } else if (ovi.dwMajorVersion == 5 && ovi.dwMinorVersion == 0) { osdispver = QLatin1String("Windows 2000"); if (ovi.wProductType == VER_NT_WORKSTATION) { osdispver.append(QLatin1String(" Professional")); } else { if (ovi.wSuiteMask & VER_SUITE_DATACENTER) { osdispver.append(QLatin1String(" Datacenter Server")); } else if (ovi.wSuiteMask & VER_SUITE_ENTERPRISE) { osdispver.append(QLatin1String(" Advanced Server")); } else { osdispver.append(QLatin1String(" Server")); } } } else if (ovi.dwMajorVersion == 5 && ovi.dwMinorVersion == 1) { osdispver = QLatin1String("Windows XP"); if (ovi.wSuiteMask & VER_SUITE_PERSONAL) { osdispver.append(QLatin1String(" Home Edition")); } else { osdispver.append(QLatin1String(" Professional")); } } else if (ovi.dwMajorVersion == 5 && ovi.dwMinorVersion == 2) { if (GetSystemMetrics(SM_SERVERR2)) { osdispver = QLatin1String("Windows Server 2003 R2"); } else if (ovi.wSuiteMask & VER_SUITE_STORAGE_SERVER) { osdispver = QLatin1String("Windows Storage Server 2003"); } else if (ovi.wSuiteMask & VER_SUITE_WH_SERVER) { osdispver = QLatin1String("Windows Home Server"); } else if (ovi.wProductType == VER_NT_WORKSTATION && si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) { osdispver = QLatin1String("Windows XP Professional x64 Edition"); } else { osdispver = QLatin1String("Windows Server 2003"); } if (ovi.wProductType != VER_NT_WORKSTATION) { if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) { if (ovi.wSuiteMask & VER_SUITE_DATACENTER) { osdispver.append(QLatin1String(" Datacenter x64 Edition")); } else if (ovi.wSuiteMask & VER_SUITE_ENTERPRISE) { osdispver.append(QLatin1String(" Enterprise x64 Edition")); } else { osdispver.append(QLatin1String(" Standard x64 Edition")); } } else { if (ovi.wSuiteMask & VER_SUITE_COMPUTE_SERVER) { osdispver.append(QLatin1String(" Compute Cluster Edition")); } else if (ovi.wSuiteMask & VER_SUITE_DATACENTER) { osdispver.append(QLatin1String(" Datacenter Edition")); } else if (ovi.wSuiteMask & VER_SUITE_ENTERPRISE) { osdispver.append(QLatin1String(" Enterprise Edition")); } else if (ovi.wSuiteMask & VER_SUITE_BLADE) { osdispver.append(QLatin1String(" Web Edition")); } else { osdispver.append(QLatin1String(" Standard Edition")); } } } } // Service Packs (may be empty) static_assert(sizeof(TCHAR) == sizeof(wchar_t), "Expected Unicode TCHAR."); QString sp = QString::fromWCharArray(ovi.szCSDVersion); if (!sp.isEmpty()) { osdispver.append(QLatin1String(" ")); osdispver.append(sp); } // Architecture if (ovi.dwMajorVersion >= 6) { if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) { osdispver.append(QLatin1String(" x64")); } else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL) { osdispver.append(QLatin1String(" x86")); } } QString osv; osv.sprintf(" - %lu.%lu.%lu", static_cast(ovi.dwMajorVersion), static_cast(ovi.dwMinorVersion), static_cast(ovi.dwBuildNumber)); osdispver.append(osv); return osdispver; #else return OSInfo::getOSVersion(); #endif } void OSInfo::fillXml(QDomDocument &doc, QDomElement &root, const QString &os, const QString &osver, const QList &qlBind) { QDomElement tag; QDomText t; bool bIs64; bool bSSE2 = false; QString cpu_id, cpu_extid; tag=doc.createElement(QLatin1String("machash")); root.appendChild(tag); t=doc.createTextNode(OSInfo::getMacHash(qlBind)); tag.appendChild(t); tag=doc.createElement(QLatin1String("version")); root.appendChild(tag); t=doc.createTextNode(QLatin1String(MUMTEXT(MUMBLE_VERSION_STRING))); tag.appendChild(t); tag=doc.createElement(QLatin1String("release")); root.appendChild(tag); t=doc.createTextNode(QLatin1String(MUMBLE_RELEASE)); tag.appendChild(t); tag=doc.createElement(QLatin1String("os")); root.appendChild(tag); t=doc.createTextNode(os); tag.appendChild(t); tag=doc.createElement(QLatin1String("osver")); root.appendChild(tag); t=doc.createTextNode(osver); tag.appendChild(t); tag=doc.createElement(QLatin1String("qt")); root.appendChild(tag); t=doc.createTextNode(QString::fromLatin1(qVersion())); tag.appendChild(t); #if defined(Q_OS_WIN) BOOL bIsWow64 = FALSE; IsWow64Process(GetCurrentProcess(), &bIsWow64); bIs64 = bIsWow64; #else bIs64 = (QSysInfo::WordSize == 64); #endif tag=doc.createElement(QLatin1String("is64bit")); root.appendChild(tag); t=doc.createTextNode(QString::number(bIs64 ? 1 : 0)); tag.appendChild(t); #if defined(Q_OS_WIN) #define regstr(x) QString::fromLatin1(reinterpret_cast(& x), 4) int chop; int cpuinfo[4]; __cpuid(cpuinfo, 1); bSSE2 = (cpuinfo[3] & 0x04000000); __cpuid(cpuinfo, 0); cpu_id = regstr(cpuinfo[1]) + regstr(cpuinfo[3]) + regstr(cpuinfo[2]); for (unsigned int j=2; j<=4;++j) { __cpuid(cpuinfo, 0x80000000 + j); cpu_extid += regstr(cpuinfo[0]) + regstr(cpuinfo[1]) + regstr(cpuinfo[2]) + regstr(cpuinfo[3]); } cpu_id = cpu_id.trimmed(); chop = cpu_id.indexOf(QLatin1Char('\0')); if (chop != -1) cpu_id.truncate(chop); cpu_extid = cpu_extid.trimmed(); chop = cpu_extid.indexOf(QLatin1Char('\0')); if (chop != -1) cpu_extid.truncate(chop); #endif tag=doc.createElement(QLatin1String("cpu_id")); root.appendChild(tag); t=doc.createTextNode(cpu_id); tag.appendChild(t); tag=doc.createElement(QLatin1String("cpu_extid")); root.appendChild(tag); t=doc.createTextNode(cpu_extid); tag.appendChild(t); tag=doc.createElement(QLatin1String("cpu_sse2")); root.appendChild(tag); t=doc.createTextNode(QString::number(bSSE2 ? 1 : 0)); tag.appendChild(t); } mumble-1.3.4/src/SSL.h0000664000175000017500000000123414010707273014242 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_SSL_H_ #define MUMBLE_SSL_H_ #include #include #include class MumbleSSL { public: static void initialize(); static void destroy(); static QString defaultOpenSSLCipherString(); static QList ciphersFromOpenSSLCipherString(QString cipherString); static void addSystemCA(); static QString protocolToString(QSsl::SslProtocol protocol); }; #endif mumble-1.3.4/src/Ban.h0000664000175000017500000000146014010707273014302 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_BAN_H_ #define MUMBLE_BAN_H_ #include "HostAddress.h" #include #include #include #include #include struct Ban { HostAddress haAddress; int iMask; QString qsUsername; QString qsHash; QString qsReason; QDateTime qdtStart; unsigned int iDuration; bool isExpired() const; bool isValid() const; bool operator < (const Ban &) const; bool operator == (const Ban &) const; QString toString() const; }; quint32 qHash(const Ban &); #endif mumble-1.3.4/src/Version.cpp0000664000175000017500000000254614010707273015570 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifdef MUMBLE #include "mumble_pch.hpp" #else #include "murmur_pch.h" #endif #include "Version.h" unsigned int MumbleVersion::getRaw(const QString &version) { int major, minor, patch; if (get(&major, &minor, &patch, version)) return toRaw(major, minor, patch); return 0; } QString MumbleVersion::toString(unsigned int v) { int major, minor, patch; fromRaw(v, &major, &minor, &patch); return QString::fromLatin1("%1.%2.%3").arg(major).arg(minor).arg(patch); } bool MumbleVersion::get(int *major, int *minor, int *patch, const QString &version) { QRegExp rx(QLatin1String("(\\d+)\\.(\\d+)\\.(\\d+)")); if (rx.exactMatch(version)) { if (major) *major = rx.cap(1).toInt(); if (minor) *minor = rx.cap(2).toInt(); if (patch) *patch = rx.cap(3).toInt(); return true; } return false; } unsigned int MumbleVersion::toRaw(int major, int minor, int patch) { return (major << 16) | (minor << 8) | patch; } void MumbleVersion::fromRaw(unsigned int version, int *major, int *minor, int *patch) { *major = (version & 0xFFFF0000) >> 16; *minor = (version & 0xFF00) >> 8; *patch = (version & 0xFF); } mumble-1.3.4/src/ServerResolver_qt5.cpp0000664000175000017500000001010614010707273017713 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifdef MUMBLE #include "mumble_pch.hpp" #else #include "murmur_pch.h" #endif #include "ServerResolver.h" #include #include static qint64 normalizeSrvPriority(quint16 priority, quint16 weight) { return static_cast((65535U * priority) + weight); } class ServerResolverPrivate : public QObject { private: Q_OBJECT Q_DISABLE_COPY(ServerResolverPrivate) public: ServerResolverPrivate(QObject *parent); void resolve(QString hostname, quint16 port); QList records(); QString m_origHostname; quint16 m_origPort; QList m_srvQueue; QMap m_hostInfoIdToIndexMap; int m_srvQueueRemain; QList m_resolved; signals: void resolved(); public slots: void srvResolved(); void hostResolved(QHostInfo hostInfo); void hostFallbackResolved(QHostInfo hostInfo); }; ServerResolverPrivate::ServerResolverPrivate(QObject *parent) : QObject(parent) , m_origPort(0) , m_srvQueueRemain(0) { } void ServerResolverPrivate::resolve(QString hostname, quint16 port) { m_origHostname = hostname; m_origPort = port; QDnsLookup *resolver = new QDnsLookup(this); connect(resolver, SIGNAL(finished()), this, SLOT(srvResolved())); resolver->setType(QDnsLookup::SRV); resolver->setName(QLatin1String("_mumble._tcp.") + hostname); resolver->lookup(); } QList ServerResolverPrivate::records() { return m_resolved; } void ServerResolverPrivate::srvResolved() { QDnsLookup *resolver = qobject_cast(sender()); m_srvQueue = resolver->serviceRecords(); m_srvQueueRemain = m_srvQueue.count(); if (resolver->error() == QDnsLookup::NoError && m_srvQueueRemain > 0) { for (int i = 0; i < m_srvQueue.count(); i++) { QDnsServiceRecord record = m_srvQueue.at(i); int hostInfoId = QHostInfo::lookupHost(record.target(), this, SLOT(hostResolved(QHostInfo))); m_hostInfoIdToIndexMap[hostInfoId] = i; } } else { QHostInfo::lookupHost(m_origHostname, this, SLOT(hostFallbackResolved(QHostInfo))); } delete resolver; } void ServerResolverPrivate::hostResolved(QHostInfo hostInfo) { int lookupId = hostInfo.lookupId(); int idx = m_hostInfoIdToIndexMap[lookupId]; QDnsServiceRecord record = m_srvQueue.at(idx); if (hostInfo.error() == QHostInfo::NoError) { QList resolvedAddresses = hostInfo.addresses(); // Convert QHostAddress -> HostAddress. QList addresses; foreach (QHostAddress ha, resolvedAddresses) { addresses << HostAddress(ha); } qint64 priority = normalizeSrvPriority(record.priority(), record.weight()); m_resolved << ServerResolverRecord(m_origHostname, record.port(), priority, addresses); } m_srvQueueRemain -= 1; if (m_srvQueueRemain == 0) { emit resolved(); } } void ServerResolverPrivate::hostFallbackResolved(QHostInfo hostInfo) { if (hostInfo.error() == QHostInfo::NoError) { QList resolvedAddresses = hostInfo.addresses(); // Convert QHostAddress -> HostAddress. QList addresses; foreach (QHostAddress ha, resolvedAddresses) { addresses << HostAddress(ha); } m_resolved << ServerResolverRecord(m_origHostname, m_origPort, 0, addresses); } emit resolved(); } ServerResolver::ServerResolver(QObject *parent) : QObject(parent) { d = new ServerResolverPrivate(this); } QString ServerResolver::hostname() { if (d) { return d->m_origHostname; } return QString(); } quint16 ServerResolver::port() { if (d) { return d->m_origPort; } return 0; } void ServerResolver::resolve(QString hostname, quint16 port) { if (d) { connect(d, SIGNAL(resolved()), this, SIGNAL(resolved())); d->resolve(hostname, port); } } QList ServerResolver::records() { if (d) { return d->records(); } return QList(); } #include "ServerResolver_qt5.moc" mumble-1.3.4/src/Timer.h0000664000175000017500000000145614010707273014667 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_TIMER_H_ #define MUMBLE_TIMER_H_ #include // All timer resolutions are in microseconds. class Timer { protected: quint64 uiStart; static quint64 now(); public: Timer(bool start = true); bool isElapsed(quint64 us); quint64 elapsed() const; quint64 restart(); bool isStarted() const; /** * Compares the elapsed time, not the start time */ bool operator<(const Timer &other) const; /** * Compares the elapsed time, not the start time */ bool operator>(const Timer &other) const; }; #endif mumble-1.3.4/src/EnvUtils.cpp0000664000175000017500000000315514010707273015711 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "EnvUtils.h" #include QString EnvUtils::getenv(QString name) { #ifdef Q_OS_WIN QByteArray buf; size_t requiredSize = 0; static_assert(sizeof(wchar_t) == sizeof(ushort), "expected 2-byte wchar_t"); const wchar_t *wname = reinterpret_cast(name.utf16()); // Query the required buffer size (in elements). if (_wgetenv_s(&requiredSize, 0, 0, wname) != 0) { return QString(); } if (requiredSize == 0) { return QString(); } // Resize buf to fit the value and put it there. buf.resize(static_cast(requiredSize * sizeof(wchar_t))); if (_wgetenv_s(&requiredSize, reinterpret_cast(buf.data()), requiredSize, wname) != 0) { return QString(); } // Convert the value to QString and return it. const wchar_t *wbuf = reinterpret_cast(buf.constData()); return QString::fromWCharArray(wbuf); #else QByteArray name8bit = name.toLocal8Bit(); char *val = ::getenv(name8bit.constData()); if (val == NULL) { return QString(); } return QString::fromLocal8Bit(val); #endif } bool EnvUtils::setenv(QString name, QString value) { #ifdef Q_OS_WIN return _wputenv_s(reinterpret_cast(name.utf16()), reinterpret_cast(value.utf16())) == 0; #else const int OVERWRITE = 1; return ::setenv(name.toLocal8Bit().constData(), value.toLocal8Bit().constData(), OVERWRITE) == 0; #endif } mumble-1.3.4/src/HTMLFilter.h0000664000175000017500000000224314010707273015514 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_HTMLFILTER_H_ #define MUMBLE_HTMLFILTER_H_ #include /// HTMLFilter provides utilitites for /// creating a plain text representaton /// of a HTML document. /// /// It is used for converting Mumble /// text messages, comments, and more /// to plain text when a server is /// configured to disallow HTML. class HTMLFilter { /// escapeTags returns the in HTML document /// with all occurrences of > and < /// replaced by < and >. static QString escapeTags(const QString &in); public: /// filter does a best-effort conversion of the /// in HTML document to a plain-text representation. /// /// If the filtering process succeeded, the function /// writes the filtered document as plain text to /// out, and returns true. /// /// If the filtering failed, the function returns false /// and out is left unchanged. static bool filter(const QString &in, QString &out); }; #endif mumble-1.3.4/src/Net.cpp0000664000175000017500000000352614010707273014670 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifdef MUMBLE #include "mumble_pch.hpp" #else #include "murmur_pch.h" #endif #include "Net.h" #include "HostAddress.h" bool Ban::isExpired() const { return (iDuration > 0) && static_cast(iDuration - qdtStart.secsTo(QDateTime::currentDateTime().toUTC())) < 0; } bool Ban::operator <(const Ban &other) const { // Compare username primarily and address secondarily const int unameDifference = qsUsername.localeAwareCompare(other.qsUsername); if (unameDifference == 0) return haAddress < other.haAddress; else return unameDifference < 0; } bool Ban::operator ==(const Ban &other) const { return (haAddress == other.haAddress) && (iMask == other.iMask) && (qsUsername == other.qsUsername) && (qsHash == other.qsHash) && (qsReason == other.qsReason) && (qdtStart == other.qdtStart) && (iDuration == other.iDuration); } bool Ban::isValid() const { return haAddress.isValid() && (iMask >= 8) && (iMask <= 128); } QString Ban::toString() const { return QString(QLatin1String("Hash: \"%1\", Host: \"%2\", Mask: \"%3\", Username: \"%4\", Reason: \"%5\", BanStart: \"%6\", BanEnd: \"%7\" %8")).arg( qsHash, haAddress.toString(), haAddress.isV6() ? QString::number(iMask) : QString::number(iMask-96), qsUsername, qsReason, qdtStart.toLocalTime().toString(QLatin1String("yyyy-MM-dd hh:mm:ss")), qdtStart.toLocalTime().addSecs(iDuration).toString(QLatin1String("yyyy-MM-dd hh:mm:ss")), iDuration == 0 ? QLatin1String("(permanent)") : QLatin1String("(temporary)") ); } quint32 qHash(const Ban &b) { return qHash(b.qsHash) ^ qHash(b.haAddress) ^ qHash(b.qsUsername) ^ qHash(b.iMask); } mumble-1.3.4/src/ServerResolverRecord.cpp0000664000175000017500000000147614010707273020273 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "ServerResolverRecord.h" ServerResolverRecord::ServerResolverRecord() { } ServerResolverRecord::ServerResolverRecord(QString hostname_, quint16 port_, qint64 priority_, QList addresses_) : m_hostname(hostname_) , m_port(port_) , m_priority(priority_) , m_addresses(addresses_) { } qint64 ServerResolverRecord::priority() { return m_priority; } QString ServerResolverRecord::hostname() { return m_hostname; } quint16 ServerResolverRecord::port() { return m_port; } QList ServerResolverRecord::addresses() { return m_addresses; } mumble-1.3.4/src/ACL.cpp0000664000175000017500000001702114010707273014534 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifdef MUMBLE #include "mumble_pch.hpp" #else #include "murmur_pch.h" #endif #include "ACL.h" #include "Channel.h" #include "Group.h" #include "User.h" #ifdef MURMUR #include "ServerUser.h" #endif ChanACL::ChanACL(Channel *chan) : QObject(chan) { bApplyHere = true; bApplySubs = true; bInherited = false; iUserId = -1; c = chan; if (c) c->qlACL << this; } // Check permissions. // This will always return true for the superuser, // and will return false if a user isn't allowed to // traverse to the channel. (Need "read" in all preceeding channels) #ifdef MURMUR bool ChanACL::hasPermission(ServerUser *p, Channel *chan, QFlags perm, ACLCache *cache) { Permissions granted = effectivePermissions(p, chan, cache); return ((granted & perm) != None); } // Return effective permissions. QFlags ChanACL::effectivePermissions(ServerUser *p, Channel *chan, ACLCache *cache) { // Superuser if (p->iId == 0) { return static_cast(All &~ (Speak|Whisper)); } Permissions granted = 0; if (cache) { QHash *h = cache->value(p); if (h) granted = h->value(chan); } if (granted & Cached) { return granted; } QStack chanstack; Channel *ch = chan; while (ch) { chanstack.push(ch); ch = ch->cParent; } // Default permissions Permissions def = Traverse | Enter | Speak | Whisper | TextMessage; granted = def; bool traverse = true; bool write = false; ChanACL *acl; while (! chanstack.isEmpty()) { ch = chanstack.pop(); if (! ch->bInheritACL) granted = def; foreach(acl, ch->qlACL) { bool matchUser = (acl->iUserId != -1) && (acl->iUserId == p->iId); bool matchGroup = Group::isMember(chan, ch, acl->qsGroup, p); if (matchUser || matchGroup) { if (acl->pAllow & Traverse) traverse = true; if (acl->pDeny & Traverse) traverse = false; if (acl->pAllow & Write) write = true; if (acl->pDeny & Write) write = false; if (ch->iId == 0 && chan == ch && acl->bApplyHere) { if (acl->pAllow & Kick) granted |= Kick; if (acl->pAllow & Ban) granted |= Ban; if (acl->pAllow & Register) granted |= Register; if (acl->pAllow & SelfRegister) granted |= SelfRegister; } if ((ch==chan && acl->bApplyHere) || (ch!=chan && acl->bApplySubs)) { granted |= (acl->pAllow & ~(Kick|Ban|Register|SelfRegister|Cached)); granted &= ~acl->pDeny; } } } if (! traverse && ! write) { granted = None; break; } } if (granted & Write) { granted |= Traverse|Enter|MuteDeafen|Move|MakeChannel|LinkChannel|TextMessage|MakeTempChannel; if (chan->iId == 0) granted |= Kick|Ban|Register|SelfRegister; } if (cache) { if (! cache->contains(p)) cache->insert(p, new QHash); cache->value(p)->insert(chan, granted | Cached); } return granted; } #else QString ChanACL::whatsThis(Perm p) { switch (p) { case None: return tr("This represents no privileges."); case Write: return tr("This represents total access to the channel, including the ability to change group and ACL information. " "This privilege implies all other privileges."); case Traverse: return tr("This represents the permission to traverse the channel. If a user is denied this privilege, he will be " "unable to access this channel and any sub-channels in any way, regardless of other permissions in the " "sub-channels."); case Enter: return tr("This represents the permission to join the channel. If you have a hierarchical channel structure, you " "might want to give everyone Traverse, but restrict Enter in the root of your hierarchy."); case Speak: return tr("This represents the permission to speak in a channel. Users without this privilege will be suppressed by " "the server (seen as muted), and will be unable to speak until they are unmuted by someone with the " "appropriate privileges."); case Whisper: return tr("This represents the permission to whisper to this channel from the outside. This works exactly like the speak " "privilege, but applies to packets spoken with the Whisper key held down. This may be used to broadcast to a hierarchy " "of channels without linking."); case MuteDeafen: return tr("This represents the permission to mute and deafen other users. Once muted, a user will stay muted " "until he is unmuted by another privileged user or reconnects to the server."); case Move: return tr("This represents the permission to move a user to another channel or kick him from the server. To actually " "move the user, either the moving user must have Move privileges in the destination channel, or " "the user must normally be allowed to enter the channel. Users with this privilege can move users " "into channels the target user normally wouldn't have permission to enter."); case MakeChannel: return tr("This represents the permission to make sub-channels. The user making the sub-channel will be added to the " "admin group of the sub-channel."); case MakeTempChannel: return tr("This represents the permission to make a temporary subchannel. The user making the sub-channel will be added to the " "admin group of the sub-channel. Temporary channels are not stored and disappear when the last user leaves."); case LinkChannel: return tr("This represents the permission to link channels. Users in linked channels hear each other, as long as " "the speaking user has the speak privilege in the channel of the listener. You need the link " "privilege in both channels to create a link, but just in either channel to remove it."); case TextMessage: return tr("This represents the permission to write text messages to other users in this channel."); case Kick: return tr("This represents the permission to forcibly remove users from the server."); case Ban: return tr("This represents the permission to permanently remove users from the server."); case Register: return tr("This represents the permission to register and unregister users on the server."); case SelfRegister: return tr("This represents the permission to register oneself on the server."); default: break; } return QString(); } #endif QString ChanACL::permName(QFlags p) { QStringList qsl; for (int i=0;i<=31;++i) { if (p & (1<(1<. #ifdef MUMBLE #include "mumble_pch.hpp" #else #include "murmur_pch.h" #endif #include "CryptographicRandom.h" #include "PasswordGenerator.h" // This is a password alphabet that tries to be human-friendly. // Most cases of ambiguitiy have been removed. // // Removed characters: // "0" (zero) // "1" (one) // "5" (five) // "O" (uppercase O) // "o" (lowercase O) // "l" (lowercase L) // "I" (uppercase i) static char password_alphabet[] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'm', 'n', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '2', '3', '4', '6', '7', '8', '9' }; // Getter function for TestPasswordGenerator to get the // alphabet we're using. QVector mumble_password_generator_alphabet() { QVector v; size_t numAlphabetEntries = sizeof(password_alphabet); for (size_t i = 0; i < numAlphabetEntries; i++) { v << QChar(QLatin1Char(password_alphabet[i])); } return v; } QString PasswordGenerator::generatePassword(int length) { QByteArray buf(length, '\0'); uint32_t numAlphabetEntries = sizeof(password_alphabet); for (int i = 0; i < length; i++) { uint32_t index = CryptographicRandom::uniform(numAlphabetEntries-1); buf[i] = password_alphabet[index]; } return QString::fromLatin1(buf.constData(), buf.size()); } mumble-1.3.4/src/UnresolvedServerAddress.cpp0000664000175000017500000000242214010707273020757 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifdef MUMBLE #include "mumble_pch.hpp" #else #include "murmur_pch.h" #endif #include "UnresolvedServerAddress.h" UnresolvedServerAddress::UnresolvedServerAddress() : port(0) {} UnresolvedServerAddress::UnresolvedServerAddress(QString hostname_, unsigned short port_) : hostname(hostname_.toLower()) , port(port_) {} bool UnresolvedServerAddress::isValid() const { return !hostname.isEmpty() && port != 0; } bool operator==(const UnresolvedServerAddress &lhs, const UnresolvedServerAddress &rhs) { return lhs.hostname == rhs.hostname && lhs.port == rhs.port; } bool operator!=(const UnresolvedServerAddress &lhs, const UnresolvedServerAddress &rhs) { return !operator==(lhs, rhs); } bool operator<(const UnresolvedServerAddress &lhs, const UnresolvedServerAddress &rhs) { if (lhs.hostname < rhs.hostname) { return true; } if (lhs.hostname == rhs.hostname) { if (lhs.port < rhs.port) { return true; } } return false; } uint qHash(const UnresolvedServerAddress &key) { return qHash(key.hostname) ^ uint(key.port); } mumble-1.3.4/plugins/0000775000175000017500000000000014010707273014322 5ustar builderbuildermumble-1.3.4/plugins/wow/0000775000175000017500000000000014010707273015136 5ustar builderbuildermumble-1.3.4/plugins/wow/wow.cpp0000664000175000017500000001534514010707273016466 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "../mumble_plugin_win32.h" // Include standard plugin header. #include "../mumble_plugin_utils.h" // Include plugin header for special functions, like "escape". static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &context, std::wstring &identity) { for (int i=0;i<3;i++) { avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; } // To update visit http://www.ownedcore.com/forums/world-of-warcraft/world-of-warcraft-bots-programs/wow-memory-editing // and look for a thread called "[WoW] [Version] Release Info Dump Thread". // http://www.ownedcore.com/forums/world-of-warcraft/world-of-warcraft-bots-programs/wow-memory-editing/585582-wow-7-0-3-22624-release-info-dump-thread.html#post3615091 // Avatar pointer procptr_t avatar_offset = peekProcPtr(pModule + 0xDE565C); // "LocalPlayer" in the thread. if (!avatar_offset) return false; // Camera pointer procptr_t camera_base = peekProcPtr(pModule + 0xEBA11C); // "CameraStruct" in the thread. if (!camera_base) return false; procptr_t camera_offset = peekProcPtr(camera_base + 0x3264); // "CameraOffset" in the thread. if (!camera_offset) return false; // Realm pointer procptr_t realm_offset = peekProcPtr(pModule + 0xF3AF7C); // Not available in the thread. if (!realm_offset) return false; // Memory addresses procptr_t state_address = 0xE5BD19; // "GameState" in the thread. procptr_t avatar_pos_address = 0xAF8; // "UnitOrigin" in the thread. procptr_t camera_pos_address = 0x08; // "CameraOrigin" in the thread. procptr_t camera_front_address = 0x14; // "CameraMatrix" in the thread. procptr_t camera_top_address = 0x2C; // "CameraMatrix" + 0x18. procptr_t avatar_heading_address = 0xB08; // "UnitAngle" in the thread. procptr_t realm_address = 0x384; // Not available in the thread. procptr_t player_address = 0xF3B288; // Not available in the thread. // Boolean value to check if game addresses retrieval is successful bool ok; // Create containers to stuff our raw data into, so we can convert it to Mumble's coordinate system float avatar_pos_corrector[3], camera_pos_corrector[3], avatar_heading, camera_front_corrector[3], camera_top_corrector[3]; // Char values for extra features char state, player[50], realm[50]; // Peekproc and assign game addresses to our containers, so we can retrieve positional data ok = peekProc(pModule + state_address, &state, 1) && // Magical state value: 1 when in-game, 0 when not. peekProc(avatar_offset + avatar_pos_address, avatar_pos_corrector, 12) && // Avatar Position values (Z, -X and Y). peekProc(camera_offset + camera_pos_address, camera_pos_corrector, 12) && // Camera Position values (Z, -X and Y). peekProc(avatar_offset + avatar_heading_address, avatar_heading) && // Avatar heading. peekProc(camera_offset + camera_front_address, camera_front_corrector, 12) && // Camera Front Vector values (Z, -X and Y). peekProc(camera_offset + camera_top_address, camera_top_corrector, 12) && // Camera Top Vector values (Z, -X and Y). peekProc(realm_offset + realm_address, realm) && // Realm name. peekProc(pModule + player_address, player); // Player nickname. // This prevents the plugin from linking to the game in case something goes wrong during values retrieval from memory addresses. if (! ok) return false; // State if (state != 1) { // If not in-game context.clear(); // Clear context identity.clear(); // Clear identity // Set vectors values to 0. for (int i=0;i<3;i++) avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; return true; // This tells Mumble to ignore all vectors. } // Begin context std::ostringstream ocontext; // Realm escape(realm, sizeof(realm)); if (strcmp(realm, "") != 0) { // Set Realm string only if not empty ocontext << " {\"Realm\": \"" << realm << "\"}"; // Set context with Realm's name } context = ocontext.str(); // End context // Begin identity std::wostringstream oidentity; oidentity << "{"; // Player escape(player, sizeof(player)); if (strcmp(player, "") != 0) { oidentity << std::endl; oidentity << "\"Player\": \"" << player << "\""; // Set player nickname in identity. } else { oidentity << std::endl << "\"Player\": null"; } oidentity << std::endl << "}"; identity = oidentity.str(); // End identity /* Mumble | Game X | Z Y | -X Z | Y */ avatar_pos[0] = -avatar_pos_corrector[1]; avatar_pos[1] = avatar_pos_corrector[2]; avatar_pos[2] = avatar_pos_corrector[0]; camera_pos[0] = -camera_pos_corrector[1]; camera_pos[1] = camera_pos_corrector[2]; camera_pos[2] = camera_pos_corrector[0]; avatar_front[0] = -sin(avatar_heading); avatar_front[1] = 0.0f; avatar_front[2] = cos(avatar_heading); avatar_top[2] = -1; // Dummy top vector, you can't tilt your head sideways in WoW. camera_front[0] = -camera_front_corrector[1]; camera_front[1] = camera_front_corrector[2]; camera_front[2] = camera_front_corrector[0]; camera_top[0] = -camera_top_corrector[1]; camera_top[1] = camera_top_corrector[2]; camera_top[2] = camera_top_corrector[0]; return true; } static int trylock(const std::multimap &pids) { if (! initialize(pids, L"Wow.exe")) { // Retrieve game executable's memory address return false; } // Check if we can get meaningful data from it float apos[3], afront[3], atop[3], cpos[3], cfront[3], ctop[3]; std::wstring sidentity; std::string scontext; if (fetch(apos, afront, atop, cpos, cfront, ctop, scontext, sidentity)) { return true; } else { generic_unlock(); return false; } } static const std::wstring longdesc() { return std::wstring(L"Supports World of Warcraft (x86) with context and identity support."); // Plugin long description } static std::wstring description(L"World of Warcraft (x86) version 7.0.3.22810"); // Plugin short description static std::wstring shortname(L"World of Warcraft"); // Plugin short name static int trylock1() { return trylock(std::multimap()); } static MumblePlugin wowplug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 wowplug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &wowplug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &wowplug2; } mumble-1.3.4/plugins/wow/wow.pro0000664000175000017500000000050214010707273016471 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = wow SOURCES = wow.cpp LIBS += -luser32 mumble-1.3.4/plugins/ut99/0000775000175000017500000000000014010707273015134 5ustar builderbuildermumble-1.3.4/plugins/ut99/ut99.cpp0000664000175000017500000001460214010707273016455 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . /* Copyright (C) 2005-2010, Thorvald Natvig Copyright (C) 2012, Moritz Schneeweiss All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Mumble Developers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "../mumble_plugin_win32.h" procptr_t posptr; procptr_t frtptr; procptr_t topptr; static void wcsToMultibyteStdString(wchar_t *wcs, std::string &str) { const int size = WideCharToMultiByte(CP_UTF8, 0, wcs, -1, NULL, 0, NULL, NULL); if (size == 0) return; str.resize(size); WideCharToMultiByte(CP_UTF8, 0, wcs, -1, &str[0], size, NULL, NULL); } static bool cross(float *a, float *b, float *c) { if (a == 0 || b == 0 || c == 0) return false; c[0] = a[1] * b[2] - a[2] * b[1]; c[1] = a[2] * b[0] - a[0] * b[2]; c[2] = a[0] * b[1] - a[1] * b[0]; return true; } static void norm(float *a) { float length = sqrt(a[0]*a[0] + a[1]*a[1] + a[2]*a[2]); if (length != 0.0f) { a[0] /= length; a[1] /= length; a[2] /= length; } } static bool correctFront(float *front, float *top) { float n [3]; if (top[1] < 0) { front[0] *= -1; front[1] *= -1; front[2] *= -1; } cross(front, top, n); norm(n); if (n[0] == 0 && n[1] == 0 && n[2] == 0) { front[0] = 0; front[1] = -1; front[2] = 0; } else { cross(top, n, front); norm(front); } return true; } static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &context, std::wstring &/*identity*/) { for (int i=0;i<3;i++) avatar_pos[i]=avatar_front[i]=avatar_top[i]=0.0f; char state; bool ok; ok = peekProc(pModule + 0x290557, state); // Magical state value if (! ok) return false; if (state != 8) { context.clear(); return true; // This results in all vectors beeing zero which tells Mumble to ignore them. } // Create containers to stuff our raw data into, so we can convert it to Mumble's coordinate system float pos_corrector[3]; float front_corrector[3]; float top_corrector[3]; // Peekproc and assign game addresses to our containers, so we can retrieve positional data ok = peekProc(posptr, pos_corrector) && peekProc(frtptr, front_corrector) && peekProc(topptr, top_corrector); if (! ok) return false; // Convert to left-handed coordinate system avatar_pos[0] = -pos_corrector[0]; avatar_pos[1] = pos_corrector[2]; avatar_pos[2] = pos_corrector[1]; for (int i=0;i<3;i++) avatar_pos[i] /= 64.0f; // Scale to meters avatar_front[0] = -front_corrector[1]; avatar_front[1] = front_corrector[2]; avatar_front[2] = -front_corrector[0]; avatar_top[0] = top_corrector[0]; avatar_top[1] = -top_corrector[2]; avatar_top[2] = -top_corrector[1]; correctFront(avatar_front, avatar_top); for (int i=0;i<3;i++) { camera_pos[i] = avatar_pos[i]; camera_front[i] = avatar_front[i]; camera_top[i] = avatar_top[i]; } // Read server name procptr_t cbase = peekProcPtr(pModule + 0x00290550); procptr_t cptr0 = peekProcPtr(cbase + 0x30); procptr_t cptr1 = peekProcPtr(cptr0 + 0x73C); procptr_t cptr2 = peekProcPtr(cptr1 + 0x244); wchar_t wservername[60]; ok = peekProc((procptr_t) cptr2, wservername); if (! ok) return false; wservername[sizeof(wservername)/sizeof(wservername[0]) - 1] = '\0'; std::string servername; wcsToMultibyteStdString(wservername, servername); std::ostringstream contextss; contextss << "{" << "\"servername\":\"" << servername << "\"" << "}"; context = contextss.str(); return true; } static int trylock(const std::multimap &pids) { if (! initialize(pids, L"UnrealTournament.exe", L"Engine.dll")) return false; procptr_t base = pModule + 0x290584; posptr = base; frtptr = base + 0x0C; topptr = base + 0x18; // Check if we can get meaningful data from it float apos[3], afront[3], atop[3]; float cpos[3], cfront[3], ctop[3]; std::wstring sidentity; std::string scontext; if (fetch(apos, afront, atop, cpos, cfront, ctop, scontext, sidentity)) { return true; } else { generic_unlock(); return false; } } static const std::wstring longdesc() { return std::wstring(L"Supports Unreal Tournament (v436). No identity support yet."); } static std::wstring description(L"Unreal Tournament (v436)"); static std::wstring shortname(L"Unreal Tournament"); static int trylock1() { return trylock(std::multimap()); } static MumblePlugin ut99plug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 ut99plug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &ut99plug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &ut99plug2; } mumble-1.3.4/plugins/ut99/ut99.pro0000664000175000017500000000050414010707273016467 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = ut99 SOURCES = ut99.cpp LIBS += -luser32 mumble-1.3.4/plugins/jc2/0000775000175000017500000000000014010707273015000 5ustar builderbuildermumble-1.3.4/plugins/jc2/jc2.cpp0000775000175000017500000001270614010707273016173 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . /* Copyright (C) 2012, Mike Copyright (C) 2005-2012, Thorvald Natvig All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Mumble Developers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "../mumble_plugin_win32.h" const unsigned int off_character_manager = 0xD8FB24; const unsigned int off_local_player = 0x3570; const unsigned int off_character = 0x48; const unsigned int off_char_matrix = 0x15C; const unsigned int off_camera_manager = 0xD919F4; const unsigned int off_cam_matrix = 0x2FC; static procptr_t char_matrix_ptr = 0; static procptr_t cam_matrix_ptr = 0; typedef struct { float x; float y; float z; float w; } Vector4; typedef struct { Vector4 left; Vector4 top; Vector4 front; Vector4 pos; } Matrix4; static int setuppointers() { procptr_t character_manager, local_player, character, camera_manager; if (!peekProc(pModule + off_character_manager, &character_manager, 4) || !character_manager) return false; if (!peekProc(character_manager + off_local_player, &local_player, 4) || !local_player) return false; if (!peekProc(local_player + off_character, &character, 4) || !character) return false; char_matrix_ptr = character + off_char_matrix; if (!peekProc(pModule + off_camera_manager, &camera_manager, 4) || !camera_manager) return false; cam_matrix_ptr = camera_manager + off_cam_matrix; return true; } static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &, std::wstring &) { for (int i=0;i<3;i++) avatar_pos[i]=avatar_front[i]=avatar_top[i]=0.0f; if ((!char_matrix_ptr || !cam_matrix_ptr) && !setuppointers()) { return false; } bool ok; Matrix4 char_matrix; Matrix4 cam_matrix; ok = peekProc(char_matrix_ptr, &char_matrix, sizeof(char_matrix)) && peekProc(cam_matrix_ptr, &cam_matrix, sizeof(cam_matrix)); if (!ok) return false; avatar_pos[0] = char_matrix.pos.x; avatar_pos[1] = char_matrix.pos.y; avatar_pos[2] = -char_matrix.pos.z; avatar_front[0] = char_matrix.front.x; avatar_front[1] = char_matrix.front.y; avatar_front[2] = char_matrix.front.z; avatar_top[0] = char_matrix.top.x; avatar_top[1] = char_matrix.top.y; avatar_top[2] = char_matrix.top.z; camera_pos[0] = avatar_pos[0] + (cam_matrix.pos.x / 10000); camera_pos[1] = avatar_pos[1] + (cam_matrix.pos.y / 10000); camera_pos[2] = avatar_pos[2] - (cam_matrix.pos.z / 10000); camera_front[0] = cam_matrix.front.x; camera_front[1] = cam_matrix.front.y; camera_front[2] = cam_matrix.front.z; camera_top[0] = cam_matrix.top.x; camera_top[1] = cam_matrix.top.y; camera_top[2] = cam_matrix.top.z; return true; } static int trylock(const std::multimap &pids) { if (!initialize(pids, L"JustCause2.exe")) return false; float apos[3], afront[3], atop[3]; float cpos[3], cfront[3], ctop[3]; std::wstring sidentity; std::string scontext; if (setuppointers() && fetch(apos, afront, atop, cpos, cfront, ctop, scontext, sidentity)) { return true; } else { generic_unlock(); return false; } } static const std::wstring longdesc() { return std::wstring(L"Supports Just Cause 2 (v1.0.0.2). No identity support."); } static std::wstring description(L"Just Cause 2 (v1.0.0.2)"); static std::wstring shortname(L"Just Cause 2"); static int trylock1() { return trylock(std::multimap()); } static MumblePlugin jc2plug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 jc2plug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &jc2plug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &jc2plug2; } mumble-1.3.4/plugins/jc2/jc2.pro0000775000175000017500000000050214010707273016200 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = jc2 SOURCES = jc2.cpp LIBS += -luser32 mumble-1.3.4/plugins/bfheroes/0000775000175000017500000000000014010707273016117 5ustar builderbuildermumble-1.3.4/plugins/bfheroes/bfheroes.pro0000664000175000017500000000051414010707273020436 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = bfheroes SOURCES = bfheroes.cpp LIBS += -luser32 mumble-1.3.4/plugins/bfheroes/bfheroes.cpp0000664000175000017500000000541714010707273020427 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "../mumble_plugin_win32.h" procptr_t posptr, faceptr, topptr, stateptr; static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &, std::wstring &) { for (int i=0;i<3;i++) avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; char state; char logincheck; bool ok; ok = peekProc(0x00A24D6C, &logincheck, 1); if (! ok) return false; if (logincheck == 0) return false; ok = peekProc(posptr, avatar_pos, 12) && peekProc(faceptr, avatar_front, 12) && peekProc(topptr, avatar_top, 12) && peekProc(stateptr, &state, 1); if (! ok) return false; /* This state value just uses the first memory position. If the memory position is "0," then it means that you are not ingame. */ if (state == 0) return true; // This results in all vectors beeing zero which tells Mumble to ignore them. for (int i=0;i<3;i++) { camera_pos[i] = avatar_pos[i]; camera_front[i] = avatar_front[i]; camera_top[i] = avatar_top[i]; } return true; } static int trylock(const std::multimap &pids) { posptr = faceptr = topptr = 0; if (! initialize(pids, L"BFHeroes.exe", L"BFAudio.dll")) return false; procptr_t cacheaddr = pModule + 0x4745c; procptr_t cache = peekProcPtr(cacheaddr); posptr = peekProcPtr(cache + 0xc0); faceptr = peekProcPtr(cache + 0xc4); topptr = peekProcPtr(cache + 0xc8); stateptr = peekProcPtr(cache + 0xc0); float apos[3], afront[3], atop[3], cpos[3], cfront[3], ctop[3]; std::string context; std::wstring identity; if (fetch(apos, afront, atop, cpos, cfront, ctop, context, identity)) { return true; } else { generic_unlock(); return false; } } static const std::wstring longdesc() { return std::wstring(L"Supports Battlefield Heroes. No identity support yet."); } static std::wstring description(L"Battlefield Heroes"); static std::wstring shortname(L"Battlefield Heroes"); static int trylock1() { return trylock(std::multimap()); } static MumblePlugin bfheroesplug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 bfheroesplug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &bfheroesplug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &bfheroesplug2; } mumble-1.3.4/plugins/bf4/0000775000175000017500000000000014010707273014775 5ustar builderbuildermumble-1.3.4/plugins/bf4/bf4.cpp0000664000175000017500000002237314010707273016163 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "../mumble_plugin_win32.h" // Include standard plugin header. #include "../mumble_plugin_utils.h" // Include plugin header for special functions, like "escape". static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &context, std::wstring &identity) { for (int i=0;i<3;i++) { avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; } bool ok, state; char serverid[37], host[22], team[3]; BYTE squad, squad_leader, squad_state; // Server ID pointers procptr_t serverid_base = peekProcPtr(pModule + 0x23D5368); if (!serverid_base) return false; procptr_t serverid_offset_0 = peekProcPtr(serverid_base + 0x18); if (!serverid_offset_0) return false; procptr_t serverid_offset_1 = peekProcPtr(serverid_offset_0 + 0x28); if (!serverid_offset_1) return false; procptr_t serverid_offset = peekProcPtr(serverid_offset_1 + 0x350); if (!serverid_offset) return false; // Squad pointers procptr_t squad_base = peekProcPtr(pModule + 0x23D5458); if (!squad_base) return false; procptr_t squad_offset_0 = peekProcPtr(squad_base + 0xD8); if (!squad_offset_0) return false; procptr_t squad_offset_1 = peekProcPtr(squad_offset_0 + 0x100); if (!squad_offset_1) return false; procptr_t squad_offset_2 = peekProcPtr(squad_offset_1 + 0x58); if (!squad_offset_2) return false; // Peekproc and assign game addresses to our containers, so we can retrieve positional data ok = peekProc(pModule + 0x23B2D70, &state, 1) && // Magical state value: 0 when in-game and 1 when in menu/dead. peekProc(pModule + 0x23862C0, avatar_pos, 12) && // Avatar Position values (X, Y and Z). peekProc(pModule + 0x23B2F60, camera_pos, 12) && // Camera Position values (X, Y and Z). peekProc(pModule + 0x23B2F40, avatar_top, 12) && // Avatar Top Vector values (X, Y and Z). peekProc(pModule + 0x23B2F50, avatar_front, 12) && // Avatar Front Vector values (X, Y and Z). peekProc(serverid_offset, serverid) && // Server ID (36 characters). peekProc(pModule + 0x2378B60, host) && // Host value: "IP:Port" when in a server, "bot" when loading and empty when it's hidden. peekProc(pModule + 0x2674B35, team) && // Team value: US (United States); RU (Russia); CH (China). peekProc(squad_offset_2 + 0x230, squad) && // Squad value: 0 (not in a squad); 1 (Alpha); 2 (Bravo); 3 (Charlie)... 26 (Zulu). peekProc(squad_offset_2 + 0x234, squad_leader) && // Squad leader value: 0 (False); 1 (True). peekProc(squad_offset_2 + 0x235, squad_state); // Squad state value: 0 (Public); 1 (Private). // This prevents the plugin from linking to the game in case something goes wrong during values retrieval from memory addresses. if (! ok) { return false; } if (state) { // If not in-game context.clear(); // Clear context identity.clear(); // Clear identity // Set vectors values to 0. for (int i=0;i<3;i++) { avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; } return true; // This tells Mumble to ignore all vectors. } escape(serverid, sizeof(serverid)); std::ostringstream ocontext; ocontext << " {\"Server ID\": \"" << serverid << "\"}"; // Set context with server ID context = ocontext.str(); std::wostringstream oidentity; oidentity << "{"; escape(host, sizeof(host)); // Only include host (IP:port) if it is not empty and does not include the string "bot" (which means it's a local server). if (strcmp(host, "") != 0 && strstr(host, "bot") == NULL) { oidentity << std::endl << "\"Host\": \"" << host << "\","; } std::string Team(team); if (!Team.empty()) { oidentity << std::endl; if (Team == "US") oidentity << "\"Team\": \"United States\","; // If team value is US, set "United States" as team in identity. else if (Team == "CH") oidentity << "\"Team\": \"China\","; // If team value is CH, set "China" as team in identity. else if (Team == "RU") oidentity << "\"Team\": \"Russia\","; // If team value is RU, set "Russia" as team in identity. } // If squad value is in a value between 1 and 26, set squad name in identity using NATO Phonetic alphabet. if (squad > 0 && squad < 27) { if (squad == 1) oidentity << std::endl << "\"Squad\": \"Alpha\","; else if (squad == 2) oidentity << std::endl << "\"Squad\": \"Bravo\","; else if (squad == 3) oidentity << std::endl << "\"Squad\": \"Charlie\","; else if (squad == 4) oidentity << std::endl << "\"Squad\": \"Delta\","; else if (squad == 5) oidentity << std::endl << "\"Squad\": \"Echo\","; else if (squad == 6) oidentity << std::endl << "\"Squad\": \"Foxtrot\","; else if (squad == 7) oidentity << std::endl << "\"Squad\": \"Golf\","; else if (squad == 8) oidentity << std::endl << "\"Squad\": \"Hotel\","; else if (squad == 9) oidentity << std::endl << "\"Squad\": \"India\","; else if (squad == 10) oidentity << std::endl << "\"Squad\": \"Juliet\","; else if (squad == 11) oidentity << std::endl << "\"Squad\": \"Kilo\","; else if (squad == 12) oidentity << std::endl << "\"Squad\": \"Lima\","; else if (squad == 13) oidentity << std::endl << "\"Squad\": \"Mike\","; else if (squad == 14) oidentity << std::endl << "\"Squad\": \"November\","; else if (squad == 15) oidentity << std::endl << "\"Squad\": \"Oscar\","; else if (squad == 16) oidentity << std::endl << "\"Squad\": \"Papa\","; else if (squad == 17) oidentity << std::endl << "\"Squad\": \"Quebec\","; else if (squad == 18) oidentity << std::endl << "\"Squad\": \"Romeo\","; else if (squad == 19) oidentity << std::endl << "\"Squad\": \"Sierra\","; else if (squad == 20) oidentity << std::endl << "\"Squad\": \"Tango\","; else if (squad == 21) oidentity << std::endl << "\"Squad\": \"Uniform\","; else if (squad == 22) oidentity << std::endl << "\"Squad\": \"Victor\","; else if (squad == 23) oidentity << std::endl << "\"Squad\": \"Whiskey\","; else if (squad == 24) oidentity << std::endl << "\"Squad\": \"X-ray\","; else if (squad == 25) oidentity << std::endl << "\"Squad\": \"Yankee\","; else if (squad == 26) oidentity << std::endl << "\"Squad\": \"Zulu\","; // Squad leader if (squad_leader == 1) oidentity << std::endl << "\"Squad leader\": true,"; // If squad leader value is true, set squad leader state to "True" in identity. else oidentity << std::endl << "\"Squad leader\": false,"; // If squad leader value is false, set squad leader state to "False" in identity. // Squad state if (squad_state == 1) oidentity << std::endl << "\"Squad state\": \"Private\""; // If squad state value is true, set squad state to "Private" in identity. else oidentity << std::endl << "\"Squad state\": \"Public\""; // If squad state value is false, set squad state to "Public" in identity. // When not in a squad } else { oidentity << std::endl << "\"Squad\": null,"; // If squad value isn't between 1 and 26, set squad to "null" in identity. oidentity << std::endl << "\"Squad leader\": null,"; // If not in a squad, set squad leader state to "null" in identity. oidentity << std::endl << "\"Squad state\": null"; // If not in a squad, set squad state to "null" in identity. } oidentity << std::endl << "}"; identity = oidentity.str(); // Flip the front vector for (int i=0;i<3;i++) { avatar_front[i] = -avatar_front[i]; } // Convert from right to left handed avatar_pos[0] = -avatar_pos[0]; camera_pos[0] = -camera_pos[0]; avatar_front[0] = -avatar_front[0]; avatar_top[0] = -avatar_top[0]; // Sync camera front and top vectors with avatar ones for (int i=0;i<3;i++) { camera_front[i] = avatar_front[i]; camera_top[i] = avatar_top[i]; } return true; } static int trylock(const std::multimap &pids) { if (! initialize(pids, L"bf4.exe")) { // Link the game executable return false; } // Check if we can get meaningful data from it float apos[3], afront[3], atop[3], cpos[3], cfront[3], ctop[3]; std::wstring sidentity; std::string scontext; if (fetch(apos, afront, atop, cpos, cfront, ctop, scontext, sidentity)) { return true; } else { generic_unlock(); return false; } } static const std::wstring longdesc() { return std::wstring(L"Supports Battlefield 4 with context and identity support."); // Plugin long description } static std::wstring description(L"Battlefield 4 (x64) version 1.8.2.48475"); // Plugin short description static std::wstring shortname(L"Battlefield 4"); // Plugin short name static int trylock1() { return trylock(std::multimap()); } static MumblePlugin bf4plug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 bf4plug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &bf4plug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &bf4plug2; } mumble-1.3.4/plugins/bf4/bf4.pro0000664000175000017500000000011114010707273016163 0ustar builderbuilderinclude(../plugins.pri) TARGET = bf4 SOURCES = bf4.cpp LIBS += -luser32 mumble-1.3.4/plugins/aoc/0000775000175000017500000000000014010707273015064 5ustar builderbuildermumble-1.3.4/plugins/aoc/aoc.cpp0000664000175000017500000001075514010707273016342 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "../mumble_plugin_win32.h" using namespace std; procptr_t posptr, rotptr, stateptr, hostptr; static bool calcout(float *pos, float *rot, float *opos, float *front, float *top) { float h = rot[0]; float v = rot[1]; if ((v < -360.0f) || (v > 360.0f) || (h < -360.0f) || (h > 360.0f)) return false; h *= static_cast(M_PI / 180.0f); v *= static_cast(M_PI / 180.0f); // Seems AOC is in inches. INCHES?!? opos[0] = pos[0] / 39.37f; opos[1] = pos[2] / 39.37f; opos[2] = pos[1] / 39.37f; front[0] = cos(v) * cos(h); front[1] = -sin(h); front[2] = sin(v) * cos(h); h -= static_cast(M_PI / 2.0f); top[0] = cos(v) * cos(h); top[1] = -sin(h); top[2] = sin(v) * cos(h); return true; } static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, string &context, wstring &) { for (int i=0;i<3;i++) avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; float ipos[3], rot[3]; bool ok; char state; char chHostStr[40]; string sHost; wostringstream new_identity; ostringstream new_context; ok = peekProc(posptr, ipos, 12) && peekProc(rotptr, rot, 12) && peekProc(stateptr, &state, 1) && peekProc(hostptr, chHostStr, 40); if (!ok) return false; chHostStr[39] = 0; sHost.assign(chHostStr); if (sHost.find(':')==string::npos) sHost.append(":27015"); new_context << "" << "aoc" << "" << sHost << "" << ""; context = new_context.str(); /* TODO new_identity << "" << "" << "SAS" << "" << ""; identity = new_identity.str(); */ // Check to see if you are spawned if (state == 0 || state == 1 || state == 2) return true; // Deactivate plugin ok = calcout(ipos, rot, avatar_pos, avatar_front, avatar_top); if (ok) { for (int i=0;i<3;++i) { camera_pos[i] = avatar_pos[i]; camera_front[i] = avatar_front[i]; camera_top[i] = avatar_top[i]; } return true; } return false; } static int trylock(const std::multimap &pids) { posptr = rotptr = 0; if (! initialize(pids, L"hl2.exe", L"client.dll")) return false; procptr_t mod_engine=getModuleAddr(L"engine.dll"); if (!mod_engine) return false; // Check if we really have AOC running /* position tuple: client.dll+0x748e14 (x,y,z, float) orientation tuple: client.dll+0x73dc9c (v,h float) ID string: client.dll+0x7071e8 = "ageofchivalry" (13 characters, text) spawn state: client.dll+0x6d4334 (0 when at main menu, 1 when at team selection, 2 when not spawned, between 6 and 7 when spawned) context offsets: engine.dll + 0x3bf69f = (ip:port) server.dll + 0x71a0a4 = (team info, 3 Mason, 1 Agathia) */ // Remember addresses for later posptr = pModule + 0x748e14; rotptr = pModule + 0x73dc9c; stateptr = pModule + 0x6d4334; hostptr = mod_engine + 0x3C2A84; //Gamecheck char sMagic[13]; if (!peekProc(pModule + 0x7071e8, sMagic, 13) || strncmp("ageofchivalry", sMagic, 13)!=0) return false; // Check if we can get meaningful data from it float apos[3], afront[3], atop[3]; float cpos[3], cfront[3], ctop[3]; wstring sidentity; string scontext; if (fetch(apos, afront, atop, cpos, cfront, ctop, scontext, sidentity)) { return true; } else { generic_unlock(); return false; } } static const std::wstring longdesc() { return std::wstring(L"Supports AOC Build 4104. No identity support yet."); } static std::wstring description(L"Age of Chivalry (Build 4104)"); static std::wstring shortname(L"Age of Chivalry"); static int trylock1() { return trylock(std::multimap()); } static MumblePlugin aocplug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 aocplug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &aocplug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &aocplug2; } mumble-1.3.4/plugins/aoc/aoc.pro0000664000175000017500000000050414010707273016347 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = aoc SOURCES = aoc.cpp LIBS += -luser32 mumble-1.3.4/plugins/bf2142/0000775000175000017500000000000014010707273015222 5ustar builderbuildermumble-1.3.4/plugins/bf2142/bf2142.pro0000664000175000017500000000051014010707273016640 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = bf2142 SOURCES = bf2142.cpp LIBS += -luser32 mumble-1.3.4/plugins/bf2142/bf2142.cpp0000664000175000017500000001443414010707273016634 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "../mumble_plugin_win32.h" // Include standard plugin header. #include "../mumble_plugin_utils.h" // Include plugin header for special functions, like "escape". // Variable to contain module's addresses procptr_t RendDX9 = 0; static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &context, std::wstring &identity) { bool ok; char server_name[100], soldier_name[100]; BYTE team_id, squad_id, is_commander, is_squad_leader, target_squad_id, on_voip, on_voip_com; for (int i=0;i<3;i++) avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; // Server name pointers // Doubles as an in-server state variable (NULL if not in a game) procptr_t server_offset_0 = peekProcPtr(pModule + 0x61B5D8); if (!server_offset_0) { context.clear(); // Clear context identity.clear(); // Clear identity return true; // This tells Mumble to ignore all vectors. } procptr_t server_offset_1 = peekProcPtr(server_offset_0 + 0x108); if (!server_offset_1) return false; // Team ID pointers procptr_t team_offset_0 = peekProcPtr(pModule + 0x624430); if (!team_offset_0) return false; procptr_t team_offset_1 = peekProcPtr(team_offset_0 + 0x1B4); if (!team_offset_1) return false; // Commander, SquadLeader, SquadID base pointers procptr_t role_offset_0 = peekProcPtr(pModule + 0x685228); if (!role_offset_0) return false; procptr_t role_offset_1 = peekProcPtr(role_offset_0 + 0x6C); if (!role_offset_1) return false; // Tactical pointers procptr_t tactical_offset_0 = peekProcPtr(pModule + 0x72D148); if (!tactical_offset_0) return false; procptr_t tactical_offset_1 = peekProcPtr(tactical_offset_0 + 0xE4); if (!tactical_offset_1) return false; // VoiP pointers procptr_t voip_offset_0 = peekProcPtr(pModule + 0x620D30); if (!voip_offset_0) return false; // Peekproc and assign game addresses to our containers, so we can retrieve positional data ok = peekProc(pModule + 0x6697C8 , avatar_pos, 12) && // Avatar position values (X, Y and Z). peekProc(RendDX9 + 0x20E9F4 , camera_pos, 12) && // Camera position values (X, Y and Z). peekProc(RendDX9 + 0x2139D4 , camera_front, 12) && // Avatar front vector values (X, Y and Z). peekProc(RendDX9 + 0x2139C4 , camera_top, 12) && // Avatar top vector values (X, Y and Z). peekProc(server_offset_1 , server_name) && // Server name. peekProc(pModule + 0x6228B9 , soldier_name) && // Soldier name. peekProc(team_offset_1 + 0xA0 , team_id) && // Team ID (0 for PAC, 1 for EU). peekProc(role_offset_1 + 0x108 , squad_id); // Squad ID (0 for none, 1-9 for squads). peekProc(role_offset_1 + 0x10C , is_commander) && // Whether Commander. peekProc(role_offset_1 + 0x10D , is_squad_leader) && // Whether Squad Leader. peekProc(tactical_offset_1 + 0xCC, target_squad_id) && // Commander's selected squad. peekProc(voip_offset_0 + 0xA1 , on_voip) && // Whether VoiP is active. peekProc(voip_offset_0 + 0xA0 , on_voip_com); // Whether VoiP to/from commander is active. // This prevents the plugin from linking to the game in case something goes wrong during values retrieval from memory addresses. if (!ok) return false; // Begin context std::ostringstream ocontext; // Server name escape(server_name, sizeof(server_name)); if (strcmp(server_name, "") != 0) ocontext << " {\"ipport\": \"" << server_name << "\"}"; context = ocontext.str(); // End context // Begin identity std::wostringstream oidentity; // Soldier name escape(soldier_name, sizeof(soldier_name)); oidentity << "{" << "\"ipport\": \"" << server_name << "\", " << "\"team_id\": " << team_id << ", " << "\"squad_id\": " << squad_id << ", " << "\"is_commander\": " << (is_commander ? "true" : "false") << ", " << "\"is_squad_leader\": " << (is_squad_leader ? "true" : "false") << ", " << "\"target_squad_id\": " << target_squad_id << ", " << "\"on_voip\": " << (on_voip ? "true" : "false") << ", " << "\"on_voip_com\": " << (on_voip_com ? "true" : "false") << ", " << "\"name\": \"" << soldier_name << "\"" << "}"; identity = oidentity.str(); // End identity // Copy camera direction vectors to avatar for (int i=0; i<3; i++) { avatar_front[i] = camera_front[i]; avatar_top[i] = camera_top[i]; } return true; } static int trylock(const std::multimap &pids) { if (!initialize(pids, L"BF2142.exe")) // Retrieve game executable's memory address return false; RendDX9 = getModuleAddr(L"RendDX9.dll"); // Retrieve "RendDX9.dll" module's memory address // This prevents the plugin from linking to the game in case something goes wrong during module's memory address retrieval. if (!RendDX9) return false; // Check if we can get meaningful data from it float apos[3], afront[3], atop[3], cpos[3], cfront[3], ctop[3]; std::wstring sidentity; std::string scontext; if (fetch(apos, afront, atop, cpos, cfront, ctop, scontext, sidentity)) { return true; } else { generic_unlock(); return false; } } static const std::wstring longdesc() { return std::wstring(L"Supports Battlefield 2142 version 1.51."); // Plugin long description } static std::wstring description(L"Battlefield 2142 1.51"); // Plugin short description static std::wstring shortname(L"Battlefield 2142"); // Plugin short name static int trylock1() { return trylock(std::multimap()); } static MumblePlugin bf2142plug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 bf2142plug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &bf2142plug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &bf2142plug2; } mumble-1.3.4/plugins/cod4/0000775000175000017500000000000014010707273015153 5ustar builderbuildermumble-1.3.4/plugins/cod4/cod4.pro0000664000175000017500000000050414010707273016525 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = cod4 SOURCES = cod4.cpp LIBS += -luser32 mumble-1.3.4/plugins/cod4/cod4.cpp0000664000175000017500000001032414010707273016510 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "../mumble_plugin_win32.h" using namespace std; static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &context, std::wstring &) { float viewHor, viewVer; char state; char ccontext[128]; for (int i=0;i<3;i++) avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; bool ok; /* This plugin uses the following Variables: Address Type Description =================================== 0x0072AFD0 float Z-Coordinate 0x0072AFE0 float X-Coordinate 0x0072AFF0 float Y-Coordinate 0x0072AF3C float Horizontal view (degrees) 0x0072AF38 float Vertical view (degrees) 0x0074E380 byte Magical state value */ ok = peekProc(0x0074E380, &state, 1); // Magical state value if (! ok) return false; /* state value is: 0 while not in game 4 while playing 8 while spectating This value is used for disabling pa for spectators or people not on a server. */ if (state != 4) return true; // This results in all vectors beeing zero which tells mumble to ignore them. ok = peekProc(0x0072AFD0, avatar_pos+2, 4) && //Z peekProc(0x0072AFE0, avatar_pos, 4) && //X peekProc(0x0072AFF0, avatar_pos+1, 4) && //Y peekProc(0x0072AF3C, &viewHor, 4) && //Hor peekProc(0x0072AF38, &viewVer, 4) && //Ver peekProc(0x00956D88, ccontext, 128); if (! ok) return false; /* Get context string; in this plugin this will be an ip:port (char 256 bytes) string */ ccontext[127] = 0; context = std::string(ccontext); if (context.find(':')==string::npos) context.append(":28960"); // Scale Coordinates /* Z-Value is increasing when heading north decreasing when heading south X-Value is increasing when heading west decreasing when heading east Y-Value is increasing when going up decreasing when going down 40 units = 1 meter (not confirmed) */ for (int i=0;i<3;i++) avatar_pos[i]/=40.0f; // Scale to meters avatar_pos[0]*=(-1.0f); // Convert right to left handed avatar_top[2] = -1; // Head movement is in front vector // Calculate view unit vector /* Vertical view 0° when centered 85° when looking down 275° when looking up Decreasing when looking up. Horizontal is 0° when facing North 90° when facing West 180° when facing South 270° when facing East Increasing when turning left. */ viewVer *= static_cast(M_PI / 180.0f); viewHor *= static_cast(M_PI / 180.0f); avatar_front[0] = -sin(viewHor) * cos(viewVer); avatar_front[1] = -sin(viewVer); avatar_front[2] = cos(viewHor) * cos(viewVer); for (int i=0;i<3;i++) { camera_pos[i] = avatar_pos[i]; camera_front[i] = avatar_front[i]; camera_top[i] = avatar_top[i]; } return true; } static int trylock(const std::multimap &pids) { if (! initialize(pids, L"iw3mp.exe")) return false; float apos[3], afront[3], atop[3], cpos[3], cfront[3], ctop[3]; std::string context; std::wstring identity; if (fetch(apos, afront, atop, cpos, cfront, ctop, context, identity)) { return true; } else { generic_unlock(); return false; } } static const std::wstring longdesc() { return std::wstring(L"Supports Call of Duty 4 v1.7.568 only. No identity support yet."); } static std::wstring description(L"Call of Duty 4 v1.7.568"); static std::wstring shortname(L"Call of Duty 4"); static int trylock1() { return trylock(std::multimap()); } static MumblePlugin cod4plug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 cod4plug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &cod4plug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &cod4plug2; } mumble-1.3.4/plugins/ut2004/0000775000175000017500000000000014010707273015260 5ustar builderbuildermumble-1.3.4/plugins/ut2004/ut2004.cpp0000664000175000017500000000652214010707273016727 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "../mumble_plugin_win32.h" using namespace std; procptr_t pos0ptr, pos1ptr, pos2ptr, faceptr, topptr; static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &, std::wstring &) { //char ccontext[128]; float face_corrector[3]; float top_corrector[3]; for (int i=0;i<3;i++) avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; bool ok; /* Z-Value is increasing when heading north decreasing when heading south X-Value is increasing when heading east decreasing when heading west Y-Value is increasing when going up decreasing when going down */ ok = peekProc(pos2ptr, avatar_pos, 4) && //X peekProc(pos1ptr, avatar_pos+1, 4) && //Y peekProc(pos0ptr, avatar_pos+2, 4) && //Z peekProc(faceptr, &face_corrector, 12) && peekProc(topptr, &top_corrector, 12); //peekProc((BYTE *) 0x0122E0B8, ccontext, 128); if (! ok) return false; //Convert to left-handed coordinate system avatar_front[0] = face_corrector[2]; avatar_front[1] = face_corrector[1]; avatar_front[2] = face_corrector[0]; avatar_top[0] = top_corrector[2]; avatar_top[1] = top_corrector[1]; avatar_top[2] = top_corrector[0]; //ccontext[127] = 0; //context = std::string(ccontext); //if (context.find(':')==string::npos) // context.append(":UT3PORT"); for (int i=0;i<3;i++) { camera_pos[i] = avatar_pos[i]; camera_front[i] = avatar_front[i]; camera_top[i] = avatar_top[i]; } return true; } static int trylock(const std::multimap &pids) { pos0ptr = pos1ptr = pos2ptr = faceptr = topptr = 0; if (! initialize(pids, L"UT2004.exe", L"Engine.dll")) return false; procptr_t ptraddress = pModule + 0x4A44FC; procptr_t ptr2 = peekProcPtr(ptraddress); procptr_t ptr3 = peekProcPtr(ptr2 + 0xCC); procptr_t baseptr = ptr3 + 0x1C8; pos0ptr = baseptr; pos1ptr = baseptr + 0x4; pos2ptr = baseptr + 0x8; faceptr = baseptr + 0x18; topptr = baseptr + 0x24; float apos[3], afront[3], atop[3], cpos[3], cfront[3], ctop[3]; std::string context; std::wstring identity; if (fetch(apos, afront, atop, cpos, cfront, ctop, context, identity)) { return true; } else { generic_unlock(); return false; } } static const std::wstring longdesc() { return std::wstring(L"Supports Unreal Tournament 2004 (v3369). No context or identity support yet."); } static std::wstring description(L"Unreal Tournament 2004 (v3369)"); static std::wstring shortname(L"Unreal Tournament 2004"); static int trylock1() { return trylock(std::multimap()); } static MumblePlugin ut2004plug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 ut2004plug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &ut2004plug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &ut2004plug2; } mumble-1.3.4/plugins/ut2004/ut2004.pro0000664000175000017500000000051014010707273016734 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = ut2004 SOURCES = ut2004.cpp LIBS += -luser32 mumble-1.3.4/plugins/mumble_plugin.h0000664000175000017500000001573714010707273017347 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_PLUGIN_H_ #define MUMBLE_MUMBLE_PLUGIN_H_ typedef unsigned long long procptr_t; #define LENGTH_OF(array) (sizeof(array) / sizeof((array)[0])) #include #include #if defined(_MSC_VER) # define MUMBLE_PLUGIN_CALLING_CONVENTION __cdecl #elif defined(__MINGW32__) # define MUMBLE_PLUGIN_CALLING_CONVENTION __attribute__((cdecl)) #else # define MUMBLE_PLUGIN_CALLING_CONVENTION #endif #if defined(__GNUC__) && !defined(__MINGW32__) // GCC on Unix-like systems # define MUMBLE_PLUGIN_EXPORT __attribute__((visibility("default"))) #elif defined(_MSC_VER) # define MUMBLE_PLUGIN_EXPORT __declspec(dllexport) #elif defined(__MINGW32__) # define MUMBLE_PLUGIN_EXPORT __attribute__((dllexport)) #else # error No MUMBLE_PLUGIN_EXPORT definition available #endif // Visual Studio 2008 x86 #if _MSC_VER == 1500 && defined(_M_IX86) # define MUMBLE_PLUGIN_MAGIC 0xd63ab7ef # define MUMBLE_PLUGIN_MAGIC_2 0xd63ab7fe # define MUMBLE_PLUGIN_MAGIC_QT 0xd63ab7ee // Visual Studio 2010 x86 #elif _MSC_VER == 1600 && defined(_M_IX86) # define MUMBLE_PLUGIN_MAGIC 0xd63ab7f0 # define MUMBLE_PLUGIN_MAGIC_2 0xd63ab7ff # define MUMBLE_PLUGIN_MAGIC_QT 0xd63ab70f // Visual Studio 2013 x86 #elif _MSC_VER == 1800 && defined(_M_IX86) # define MUMBLE_PLUGIN_MAGIC 0xd63ab7c0 # define MUMBLE_PLUGIN_MAGIC_2 0xd63ab7cf # define MUMBLE_PLUGIN_MAGIC_QT 0xd63ab7ca // Visual Studio 2013 x64 #elif _MSC_VER == 1800 && defined(_M_X64) # define MUMBLE_PLUGIN_MAGIC 0x9f3ed4c0 # define MUMBLE_PLUGIN_MAGIC_2 0x9f3ed4cf # define MUMBLE_PLUGIN_MAGIC_QT 0x9f3ed4ca // Visual Studio 2015 x86 #elif _MSC_VER == 1900 && defined(_M_IX86) # define MUMBLE_PLUGIN_MAGIC 0xa9b8c7c0 # define MUMBLE_PLUGIN_MAGIC_2 0xa9b8c7cf # define MUMBLE_PLUGIN_MAGIC_QT 0xa9b8c7ca // Visual Studio 2015 x64 #elif _MSC_VER == 1900 && defined(_M_X64) # define MUMBLE_PLUGIN_MAGIC 0x1f2e3dc0 # define MUMBLE_PLUGIN_MAGIC_2 0x1f2e3dcf # define MUMBLE_PLUGIN_MAGIC_QT 0x1f2e3dca // Generic plugin magic values for platforms // where we do not officially plugins other // than "link". #else # define MUMBLE_PLUGIN_MAGIC 0xf4573570 # define MUMBLE_PLUGIN_MAGIC_2 0xf457357f # define MUMBLE_PLUGIN_MAGIC_QT 0xf457357a #endif #define MUMBLE_PLUGIN_VERSION 2 typedef struct _MumblePlugin { unsigned int magic; const std::wstring &description; const std::wstring &shortname; void (MUMBLE_PLUGIN_CALLING_CONVENTION *about)(void *); void (MUMBLE_PLUGIN_CALLING_CONVENTION *config)(void *); int (MUMBLE_PLUGIN_CALLING_CONVENTION *trylock)(); void (MUMBLE_PLUGIN_CALLING_CONVENTION *unlock)(); const std::wstring(MUMBLE_PLUGIN_CALLING_CONVENTION *longdesc)(); int (MUMBLE_PLUGIN_CALLING_CONVENTION *fetch)(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &context, std::wstring &identity); } MumblePlugin; typedef struct _MumblePlugin2 { unsigned int magic; unsigned int version; int (MUMBLE_PLUGIN_CALLING_CONVENTION *trylock)(const std::multimap &); } MumblePlugin2; /// MumblePluginQt provides an extra set of functions that will /// provide a plugin with a pointer to a QWidget that should be /// used as the parent for any dialogs Qt widgets shown by the /// plugin. /// /// This interface should only be used if a plugin intends to /// present Qt-based dialogs to the user. /// /// This interface is most useful for plugins that are internal /// to Mumble. This is because plugins can't integrate with Mumble's /// QWidgets unless they're built into Mumble itself. typedef struct _MumblePluginQt { unsigned int magic; /// about is called when Mumble requests the plugin /// to show an about dialog. /// /// The ptr argument is a pointer to a QWidget that /// should be used as the parent for a Qt-based /// about dialog. void (MUMBLE_PLUGIN_CALLING_CONVENTION *about)(void *ptr); /// config is called when Mumble requests the plugin /// to show its configuration dialog. /// /// The ptr argument is a pointer to a QWidget that /// should be used as the parent for a Qt-based /// configuration dialog. void (MUMBLE_PLUGIN_CALLING_CONVENTION *config)(void *ptr); } MumblePluginQt; typedef MumblePlugin *(MUMBLE_PLUGIN_CALLING_CONVENTION *mumblePluginFunc)(); typedef MumblePlugin2 *(MUMBLE_PLUGIN_CALLING_CONVENTION *mumblePlugin2Func)(); typedef MumblePluginQt *(MUMBLE_PLUGIN_CALLING_CONVENTION *mumblePluginQtFunc)(); /* * All plugins must implement one function called getMumblePlugin(), which * follows the mumblePluginFunc type and returns a MumblePlugin struct. * * magic should be initialized to MUMBLE_PLUGIN_MAGIC. description is the * name of the plugin shown in the GUI, while shortname is used for TTS. * * The individual functions are: * about(void *parent) - Player clicked the about button over plugin * config(void *parent) - Player clicked the config button * trylock() - Search system for likely process and try to lock on. * The parameter is a set of process names and associated PIDs. * Return 1 if succeeded, else 0. Note that once a plugin is locked on, * no other plugins will be queried. * unlock() - Unlock from process. Either from user intervention or * because fetch failed. * fetch(...) - Fetch data from locked process. avatar_pos is position in * world coordinates (1 meter per unit). avatar_front and avatar_top * specify the heading of the player, as in where he is looking. * You need at minimum to figure out pos and front, otherwise * sounds cannot be placed. If you do not fetch top, make it the * same as front but rotated 90 degrees "upwards". * * camera_x is the same, but for the camera. Make this identical to the * avatar position if you don't know (or if it's a 1st person * perspective). * * It is important that you set all fields to 0.0 if you can't * fetch meaningfull values, like between rounds and such. * * context and identity are transmitted to the server. Only players * with identical context will hear positional audio from each other. * Mumble will automatically prepend the shortname of the plugin to * the context, so make this a representation of the game server and * team the player is on. * * identity is retained by the server and is pollable over Ice/DBus, * to be used by external scripts. This should uniquiely identify the * player inside the game. * * ctx_len and id_len are initialized to the bufferspace available. Set these * to -1 to keep the previous value (as parsing and optimizing can be CPU * intensive) * * The function should return 1 if it is still "locked on", * otherwise it should return 0. Mumble will call unlock() * if it return 0, and go back to polling with trylock() * once in a while. */ #endif mumble-1.3.4/plugins/hl2dm/0000775000175000017500000000000014010707273015330 5ustar builderbuildermumble-1.3.4/plugins/hl2dm/hl2dm.pro0000664000175000017500000000064714010707273017067 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) DEFINES += "NULL_DESC=\"L\\\"Half Life 2 Death Match (Retracted, now using link)\\\"\"" TARGET = hl2dm SOURCES = ../null_plugin.cpp LIBS += -luser32 mumble-1.3.4/plugins/sr/0000775000175000017500000000000014010707273014746 5ustar builderbuildermumble-1.3.4/plugins/sr/sr.cpp0000664000175000017500000001120414010707273016074 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . /* Copyright (C) 2012, Lukas Orsvärn Copyright (C) 2005-2010, Thorvald Natvig All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Mumble Developers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "../mumble_plugin_win32.h" static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &/*context*/, std::wstring &/*identity*/) { for (int i=0;i<3;i++) avatar_pos[i]=avatar_front[i]=avatar_top[i]=0.0f; char state; bool ok; // Create containers to stuff our raw data into, so we can convert it to Mumble's coordinate system float pos_corrector[3]; float front_corrector[3]; float top_corrector[3]; /* value is < > */ ok = peekProc(0xB378564, &state, 1); // Magical state value if (! ok) return false; if (state == 1) return true; // This results in all vectors beeing zero which tells Mumble to ignore them. // Peekproc and assign game addresses to our containers, so we can retrieve positional data ok = peekProc(0x1243BE84, &pos_corrector, 12) && peekProc(0x1243BEA8, &front_corrector, 12) && peekProc(0x1243BE9C, &top_corrector, 12); if (! ok) return false; // Convert to left-handed coordinate system avatar_pos[0] = pos_corrector[0]; avatar_pos[1] = pos_corrector[1]; avatar_pos[2] = -pos_corrector[2]; for (int i=0;i<3;i++) avatar_pos[i] /= 15; // Scale to meters avatar_front[0] = -front_corrector[0]; avatar_front[1] = -front_corrector[1]; avatar_front[2] = front_corrector[2]; avatar_top[0] = top_corrector[0]; avatar_top[1] = top_corrector[1]; avatar_top[2] = -top_corrector[2]; for (int i=0;i<3;i++) { camera_pos[i] = avatar_pos[i]; camera_front[i] = avatar_front[i]; camera_top[i] = avatar_top[i]; } return true; } static int trylock(const std::multimap &pids) { if (! initialize(pids, L"subrosa.exe")) return false; // Check if we can get meaningful data from it float apos[3], afront[3], atop[3]; float cpos[3], cfront[3], ctop[3]; std::wstring sidentity; std::string scontext; if (fetch(apos, afront, atop, cpos, cfront, ctop, scontext, sidentity)) { return true; } else { generic_unlock(); return false; } } static const std::wstring longdesc() { return std::wstring(L"Supports Sub Rosa. No identity or context support yet."); } static std::wstring description(L"Sub Rosa v0.07b"); static std::wstring shortname(L"Sub Rosa"); static int trylock1() { return trylock(std::multimap()); } static MumblePlugin subrosaplug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 subrosaplug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &subrosaplug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &subrosaplug2; } mumble-1.3.4/plugins/sr/sr.pro0000664000175000017500000000050014010707273016107 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = sr SOURCES = sr.cpp LIBS += -luser32 mumble-1.3.4/plugins/gmod/0000775000175000017500000000000014010707273015250 5ustar builderbuildermumble-1.3.4/plugins/gmod/gmod.pro0000664000175000017500000000050414010707273016717 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = gmod SOURCES = gmod.cpp LIBS += -luser32 mumble-1.3.4/plugins/gmod/gmod.cpp0000664000175000017500000001051014010707273016677 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "../mumble_plugin_win32.h" using namespace std; procptr_t posptr, rotptr, stateptr, hostptr; static bool calcout(float *pos, float *rot, float *opos, float *front, float *top) { float v = rot[0]; float h = rot[1]; if ((v < -360.0f) || (v > 360.0f) || (h < -360.0f) || (h > 360.0f)) return false; v *= static_cast(M_PI / 180.0f); h *= static_cast(M_PI / 180.0f); // Seems Gmod is in inches. INCHES?!? opos[0] = pos[0] / 39.37f; opos[1] = pos[2] / 39.37f; opos[2] = pos[1] / 39.37f; front[0] = cos(h) * cos(v); front[1] = -sin(v); front[2] = sin(h) * cos(v); v -= static_cast(M_PI / 2.0f); top[0] = cos(h) * cos(v); top[1] = -sin(v); top[2] = sin(h) * cos(v); return true; } static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &context, std::wstring &) { for (int i=0;i<3;i++) avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; float ipos[3], rot[3]; bool ok; //char state; char chHostStr[40]; string sHost; ostringstream new_context; ok = peekProc(posptr, ipos, 12) && peekProc(rotptr, rot, 12) //&& peekProc(stateptr, &state, 1) && peekProc(hostptr, chHostStr, 40) ; if (!ok) return false; chHostStr[39] = 0; sHost.assign(chHostStr); if (sHost.find(':')==string::npos) sHost.append(":27015"); new_context << "" << "gmod" << "" << sHost << "" << ""; context = new_context.str(); /* // Check to see if you are spawned if (state != 18) return true; // Deactivate plugin */ ok = calcout(ipos, rot, avatar_pos, avatar_front, avatar_top); if (ok) { for (int i=0;i<3;++i) { camera_pos[i] = avatar_pos[i]; camera_front[i] = avatar_front[i]; camera_top[i] = avatar_top[i]; } return true; } return false; } static int trylock(const std::multimap &pids) { posptr = rotptr = 0; if (! initialize(pids, L"hl2.exe", L"client.dll")) return false; procptr_t mod_engine=getModuleAddr(L"engine.dll"); if (!mod_engine) return false; // Remember addresses for later // position tuple: x,y,z, float // client.dll+0x6856B8 posptr = pModule + 0x6856B8; // orientation tuple: v,h,? float // v: up = -90°, down = 90°; h (rotation): -180 - 180° // client.dll+0x5B5914 rotptr = pModule + 0x5B5914; // spawn state: client.dll+0x?????? - 0 when at main menu, 2 when not spawned, 15 to 14 when spawned, byte // This could not be verified/found by Kissaki stateptr = mod_engine + 0x375565; // ID string; Game name "garrysmod" // engine.dll+0x6622DC procptr_t idptr = mod_engine + 0x6622DC; // host string: String in form "ip:port". // engine.dll+0x49176C hostptr = mod_engine + 0x49176C; // Gamecheck const char ID[] = "garrysmod"; char sMagic[18]; if (!peekProc(idptr, sMagic, sizeof(ID)) || strncmp(ID, sMagic, sizeof(ID))!=0) return false; // Check if we can get meaningful data from it float apos[3], afront[3], atop[3]; float cpos[3], cfront[3], ctop[3]; wstring sidentity; string scontext; if (fetch(apos, afront, atop, cpos, cfront, ctop, scontext, sidentity)) { return true; } else { generic_unlock(); return false; } } static const std::wstring longdesc() { // Exe build: 20:55:48 Jun 17 2014 (5692) (4000) return std::wstring(L"Supports Gmod 11 build 4426. No identity support yet."); } static std::wstring description(L"Garry's Mod 11 (Build 5692)"); static std::wstring shortname(L"Garry's Mod 11"); static int trylock1() { return trylock(std::multimap()); } static MumblePlugin gmodplug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 gmodplug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &gmodplug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &gmodplug2; } mumble-1.3.4/plugins/ut3/0000775000175000017500000000000014010707273015035 5ustar builderbuildermumble-1.3.4/plugins/ut3/ut3.pro0000664000175000017500000000050214010707273016267 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = ut3 SOURCES = ut3.cpp LIBS += -luser32 mumble-1.3.4/plugins/ut3/ut3.cpp0000664000175000017500000000731414010707273016261 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "../mumble_plugin_win32.h" using namespace std; procptr_t pos0ptr, pos1ptr, pos2ptr, faceptr, topptr; //BYTE *stateptr; static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &, std::wstring &) { char state; //char ccontext[128]; bool ok; float face_corrector[3]; float top_corrector[3]; for (int i=0;i<3;i++) avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; ok = peekProc(0x01DEAFD9, &state, 1); if (! ok) return false; if (state == 1) return true; /* Z-Value is increasing when heading north decreasing when heading south X-Value is increasing when heading east decreasing when heading west Y-Value is increasing when going up decreasing when going down */ //Convert to left-handed coordinate system ok = peekProc(pos2ptr, avatar_pos, 4) && //X peekProc(pos1ptr, avatar_pos+1, 4) && //Y peekProc(pos0ptr, avatar_pos+2, 4) && //Z peekProc(faceptr, &face_corrector, 12) && peekProc(topptr, &top_corrector, 12); //peekProc((BYTE *) 0x0122E0B8, ccontext, 128); if (! ok) return false; if (face_corrector[1] <= -0.98) { top_corrector[1] = -top_corrector[1]; } if (face_corrector[1] >= 0.98) { top_corrector[1] = -top_corrector[1]; } //Find north by playing on a Warfare game type - center view on the up arrow on the mini map avatar_front[0] = face_corrector[2]; avatar_front[1] = face_corrector[1]; avatar_front[2] = face_corrector[0]; avatar_top[0] = top_corrector[2]; avatar_top[1] = top_corrector[1]; avatar_top[2] = top_corrector[0]; //avatar_top[0] = top_corrector[2]; //avatar_top[1] = top_corrector[1]; //ccontext[127] = 0; //context = std::string(ccontext); //if (context.find(':')==string::npos) // context.append(":UT3PORT"); for (int i=0;i<3;i++) { camera_pos[i] = avatar_pos[i]; camera_front[i] = avatar_front[i]; camera_top[i] = avatar_top[i]; } return true; } static int trylock(const std::multimap &pids) { pos0ptr = pos1ptr = pos2ptr = faceptr = 0; if (! initialize(pids, L"UT3.exe", L"wrap_oal.dll")) return false; procptr_t ptraddress = pModule + 0x8A740; procptr_t baseptr = peekProcPtr(ptraddress); pos0ptr = baseptr; pos1ptr = baseptr + 0x4; pos2ptr = baseptr + 0x8; faceptr = baseptr + 0x18; topptr = baseptr + 0x24; //stateptr = pModule + 0xC4; float apos[3], afront[3], atop[3], cpos[3], cfront[3], ctop[3]; std::string context; std::wstring identity; if (fetch(apos, afront, atop, cpos, cfront, ctop, context, identity)) { return true; } else { generic_unlock(); return false; } } static const std::wstring longdesc() { return std::wstring(L"Supports Unreal Tournament 3 (v2.1). No context or identity support yet."); } static std::wstring description(L"Unreal Tournament 3 (v2.1)"); static std::wstring shortname(L"Unreal Tournament 3"); static int trylock1() { return trylock(std::multimap()); } static MumblePlugin ut3plug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 ut3plug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &ut3plug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &ut3plug2; } mumble-1.3.4/plugins/mumble_plugin_win32.h0000664000175000017500000001026514010707273020360 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_PLUGIN_WIN32_H_ #define MUMBLE_MUMBLE_PLUGIN_WIN32_H_ #define _USE_MATH_DEFINES #include #include // Define "NOMINMAX" only if it isn't already. // MinGW defines it by default, which results in a redefinition warning. #ifndef NOMINMAX # define NOMINMAX #endif #include #include #include #include #include #include #include "mumble_plugin.h" DWORD dwPid; int is64Bit; static HANDLE hProcess; static procptr_t pModule; static inline DWORD getProcess(const wchar_t *exename) { PROCESSENTRY32 pe; DWORD pid = 0; pe.dwSize = sizeof(pe); HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnap != INVALID_HANDLE_VALUE) { BOOL ok = Process32First(hSnap, &pe); while (ok) { if (wcscmp(pe.szExeFile, exename)==0) { pid = pe.th32ProcessID; break; } ok = Process32Next(hSnap, &pe); } CloseHandle(hSnap); } return pid; } static inline int checkProcessIs64Bit(const DWORD pid) { // This function returns 0 if the process is 32-bit and 1 if it's 64-bit. // In case of failure, it returns -1. HANDLE handle = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, false, pid); if (!handle) { return -1; } // IsWow64Process() returns true if the process is 32-bit, running on a 64-bit system. // It returns false in case the process is 64-bit, running on a 64-bit system. // It also returns false if the process is 32-bit, running on a 32-bit system. BOOL isWow64Process; if (!IsWow64Process(handle, &isWow64Process)) { CloseHandle(handle); return -1; } CloseHandle(handle); bool is32 = isWow64Process || sizeof(void*) == 4; return !is32; } static inline procptr_t getModuleAddr(DWORD pid, const wchar_t *modname) { MODULEENTRY32 me; procptr_t ret = 0; me.dwSize = sizeof(me); HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE|TH32CS_SNAPMODULE32, pid); if (hSnap != INVALID_HANDLE_VALUE) { BOOL ok = Module32First(hSnap, &me); while (ok) { if (wcscmp(me.szModule, modname)==0) { uintptr_t addr = reinterpret_cast(me.modBaseAddr); ret = static_cast(addr); break; } ok = Module32Next(hSnap, &me); } CloseHandle(hSnap); } return ret; } static inline procptr_t getModuleAddr(const wchar_t *modname) { return getModuleAddr(dwPid, modname); } static inline bool peekProc(procptr_t base, VOID *dest, SIZE_T len) { SIZE_T r; uintptr_t addr = static_cast(base); BOOL ok=ReadProcessMemory(hProcess, reinterpret_cast(addr), dest, len, &r); return (ok && (r == len)); } template bool peekProc(procptr_t base, T &dest) { SIZE_T r; uintptr_t addr = static_cast(base); BOOL ok=ReadProcessMemory(hProcess, reinterpret_cast(addr), reinterpret_cast(& dest), sizeof(T), &r); return (ok && (r == sizeof(T))); } static inline procptr_t peekProcPtr(procptr_t base) { procptr_t v = 0; if (!peekProc(base, &v, is64Bit ? 8 : 4)) { return 0; } return v; } static bool inline initialize(const std::multimap &pids, const wchar_t *procname, const wchar_t *modname = NULL) { hProcess = NULL; pModule = 0; if (! pids.empty()) { std::multimap::const_iterator iter = pids.find(std::wstring(procname)); if (iter != pids.end()) dwPid = static_cast(iter->second); else dwPid = 0; } else { dwPid=getProcess(procname); } if (!dwPid) return false; int result = checkProcessIs64Bit(dwPid); if (result == -1) { dwPid = 0; return false; } is64Bit = result; pModule=getModuleAddr(modname ? modname : procname); if (!pModule) { dwPid = 0; return false; } hProcess=OpenProcess(PROCESS_VM_READ, false, dwPid); if (!hProcess) { dwPid = 0; pModule = 0; return false; } return true; } static void generic_unlock() { if (hProcess) { CloseHandle(hProcess); hProcess = NULL; pModule = 0; dwPid = 0; } } #endif mumble-1.3.4/plugins/arma2/0000775000175000017500000000000014010707273015324 5ustar builderbuildermumble-1.3.4/plugins/arma2/arma2.cpp0000664000175000017500000000667714010707273017052 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "../mumble_plugin_win32.h" procptr_t posptr, frontptr, topptr; static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &, std::wstring &) { for (int i=0;i<3;i++) avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; // char state; bool ok; /* float front_corrector1; float front_corrector2; float front_corrector3; float top_corrector1; float top_corrector2; float top_corrector3; */ /* value is 0 when one is not in a game, 4 when one is ok = peekProc((BYTE *) 0x, &state, 1); // Magical state value if (! ok) return false; if (state == 0) return true; // This results in all vectors beeing zero which tells Mumble to ignore them. */ ok = peekProc(posptr, avatar_pos, 12) && peekProc(frontptr, avatar_front, 12) && peekProc(topptr, avatar_top, 12); if (avatar_pos[1] > 999000000.0) return false; /* peekProc(frontptr, &front_corrector1, 4) && peekProc(frontptr + 0xC, &front_corrector2, 4) && peekProc(frontptr + 0x18, &front_corrector3, 4) && peekProc(topptr, &top_corrector1, 4) && peekProc(topptr + 0xC, &top_corrector2, 4) && peekProc(topptr + 0x18, &top_corrector3, 4); */ if (! ok) return false; /* avatar_front[0] = front_corrector1; avatar_front[1] = front_corrector2; avatar_front[2] = front_corrector3; avatar_top[0] = top_corrector1; avatar_top[1] = top_corrector2; avatar_top[2] = top_corrector3; */ for (int i=0;i<3;i++) { camera_pos[i] = avatar_pos[i]; camera_front[i] = avatar_front[i]; camera_top[i] = avatar_top[i]; } return true; } static int trylock(const std::multimap &pids) { posptr = 0; if (! initialize(pids, L"arma2.exe")) return false; /* BYTE bState; peekProc((BYTE *) 0x00BF64D0, &bState, 1); if (bState == 0) return false; */ /* Comment out code we don't need BYTE *pModule=getModuleAddr(L".dll"); if (!pModule) */ procptr_t ptr1 = peekProcPtr(0x00C500FC); procptr_t ptr2 = peekProcPtr(ptr1 + 0x88); procptr_t base = ptr2 + 0x10; posptr = base + 0x18; frontptr = base; topptr = base + 0xC; float apos[3], afront[3], atop[3], cpos[3], cfront[3], ctop[3]; std::string context; std::wstring identity; if (fetch(apos, afront, atop, cpos, cfront, ctop, context, identity)) { return true; } else { generic_unlock(); return false; } } static const std::wstring longdesc() { return std::wstring(L"Supports Armed Assault 2 v1.08. No identity or context support yet."); } static std::wstring description(L"ArmA 2 v1.08"); static std::wstring shortname(L"ArmA 2"); static int trylock1() { return trylock(std::multimap()); } static MumblePlugin arma2plug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 arma2plug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &arma2plug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &arma2plug2; } mumble-1.3.4/plugins/arma2/arma2.pro0000664000175000017500000000050614010707273017051 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = arma2 SOURCES = arma2.cpp LIBS += -luser32 mumble-1.3.4/plugins/bf1942/0000775000175000017500000000000014010707273015231 5ustar builderbuildermumble-1.3.4/plugins/bf1942/bf1942.cpp0000664000175000017500000000520714010707273016650 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "../mumble_plugin_win32.h" procptr_t faceptr, topptr; //BYTE *stateptr; //BYTE *contextptr; static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &, std::wstring &) { for (int i=0;i<3;i++) avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; //char ccontext[128]; //char state; //char spawn; bool ok; //ok = peekProc(stateptr, &state, 1); // Magical state value //if (! ok) // return false; //if (state == 0) // return false; //peekProc(contextptr, ccontext, 128); ok = peekProc(0x00976274, avatar_pos, 12) && peekProc(faceptr, avatar_front, 12) && peekProc(topptr, avatar_top, 12); if (! ok) return false; /* Get context string; in this plugin this will be an ip:port (char 256 bytes) string */ //ccontext[127] = 0; //context = std::string(ccontext); for (int i=0;i<3;i++) { camera_pos[i] = avatar_pos[i]; camera_front[i] = avatar_front[i]; camera_top[i] = avatar_top[i]; } return true; } static int trylock(const std::multimap &pids) { faceptr = topptr = 0; if (! initialize(pids, L"BF1942.exe")) return false; procptr_t ptr1 = peekProcPtr(0x009A9468); procptr_t ptr2 = peekProcPtr(ptr1 + 0x98); faceptr = ptr2 + 0x5C; topptr = ptr2 + 0x4C; float apos[3], afront[3], atop[3], cpos[3], cfront[3], ctop[3]; std::string context; std::wstring identity; if (fetch(apos, afront, atop, cpos, cfront, ctop, context, identity)) { return true; } else { generic_unlock(); return false; } } static const std::wstring longdesc() { return std::wstring(L"Supports Battlefield 1942 v1.61b. No identity or context support yet."); } static std::wstring description(L"Battlefield 1942 v1.61b"); static std::wstring shortname(L"Battlefield 1942"); static int trylock1() { return trylock(std::multimap()); } static MumblePlugin bf1942plug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 bf1942plug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &bf1942plug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &bf1942plug2; } mumble-1.3.4/plugins/bf1942/bf1942.pro0000664000175000017500000000051214010707273016660 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = bf1942 SOURCES = bf1942.cpp LIBS += -luser32 mumble-1.3.4/plugins/insurgency/0000775000175000017500000000000014010707273016510 5ustar builderbuildermumble-1.3.4/plugins/insurgency/insurgency.pro0000664000175000017500000000052014010707273021415 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = insurgency SOURCES = insurgency.cpp LIBS += -luser32 mumble-1.3.4/plugins/insurgency/insurgency.cpp0000664000175000017500000001067514010707273021413 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "../mumble_plugin_win32.h" using namespace std; procptr_t posptr, rotptr, stateptr, hostptr; static bool calcout(float *pos, float *rot, float *opos, float *front, float *top) { float h = rot[0]; float v = rot[1]; if ((v < -360.0f) || (v > 360.0f) || (h < -360.0f) || (h > 360.0f)) return false; h *= static_cast(M_PI / 180.0f); v *= static_cast(M_PI / 180.0f); // Seems Insurgency is in inches. INCHES?!? opos[0] = pos[0] / 39.37f; opos[1] = pos[2] / 39.37f; opos[2] = pos[1] / 39.37f; front[0] = cos(v) * cos(h); front[1] = -sin(h); front[2] = sin(v) * cos(h); h -= static_cast(M_PI / 2.0f); top[0] = cos(v) * cos(h); top[1] = -sin(h); top[2] = sin(v) * cos(h); return true; } static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, string &context, wstring &) { for (int i=0;i<3;i++) avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; float ipos[3], rot[3]; bool ok; char state; char chHostStr[40]; string sHost; wostringstream new_identity; ostringstream new_context; ok = peekProc(posptr, ipos, 12) && peekProc(rotptr, rot, 12) && peekProc(stateptr, &state, 1) && peekProc(hostptr, chHostStr, 40); if (!ok) return false; chHostStr[39] = 0; sHost.assign(chHostStr); if (sHost.find(':')==string::npos) sHost.append(":27015"); new_context << "" << "insurgency" << "" << sHost << "" << ""; context = new_context.str(); /* TODO new_identity << "" << "" << "SAS" << "" << ""; identity = new_identity.str(); */ // Check to see if you are spawned if (state == 0 || state == 1) return true; // Deactivate plugin ok = calcout(ipos, rot, avatar_pos, avatar_front, avatar_top); if (ok) { for (int i=0;i<3;++i) { camera_pos[i] = avatar_pos[i]; camera_front[i] = avatar_front[i]; camera_top[i] = avatar_top[i]; } return true; } return false; } static int trylock(const std::multimap &pids) { posptr = rotptr = 0; if (! initialize(pids, L"hl2.exe", L"client.dll")) return false; procptr_t mod_engine=getModuleAddr(L"engine.dll"); if (!mod_engine) return false; // Check if we really have Insurgency running /* position tuple: client.dll+0x47171c (x,y,z, float) orientation tuple: client.dll+0x4f1458 (v,h float) ID string: client.dll+0x31a80a = "CombatWeapon@@" (14 characters, text) spawn state: client.dll+0x4aee58 (0 when at main menu, 1 when not spawned, 4 to 5 when spawned) host string: engine.dll+0x3909c4 (ip:port zero-terminated string) */ // Remember addresses for later posptr = pModule + 0x4F1EE0; rotptr = pModule + 0x4F247C; stateptr = pModule + 0x4AFEB8; hostptr = mod_engine + 0x3909A4; //Gamecheck char sMagic[14]; if (!peekProc(pModule + 0x46B512, sMagic, 14) || strncmp("CombatWeapon@@", sMagic, 14)!=0) return false; // Check if we can get meaningful data from it float apos[3], afront[3], atop[3]; float cpos[3], cfront[3], ctop[3]; wstring sidentity; string scontext; if (fetch(apos, afront, atop, cpos, cfront, ctop, scontext, sidentity)) { return true; } else { generic_unlock(); return false; } } static const std::wstring longdesc() { return std::wstring(L"Supports Insurgency: Modern Infantry Combat build 4044. No identity support yet."); } static std::wstring description(L"Insurgency: Modern Infantry Combat (Build 4044)"); static std::wstring shortname(L"Insurgency: Modern Infantry Combat"); static int trylock1() { return trylock(std::multimap()); } static MumblePlugin insurgencyplug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 insurgencyplug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &insurgencyplug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &insurgencyplug2; } mumble-1.3.4/plugins/gtav/0000775000175000017500000000000014010707273015263 5ustar builderbuildermumble-1.3.4/plugins/gtav/gtav.cpp0000664000175000017500000002040614010707273016732 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "../mumble_plugin_win32.h" // Include standard plugin header. #include "../mumble_plugin_utils.h" // Include plugin header for special functions, like "escape". #include // Include algorithm header for the game version detector static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &context, std::wstring &identity) { for (int i=0;i<3;i++) { avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; } // Memory addresses char game_name[20]; procptr_t state_address, in_game_address, avatar_pos_address, camera_pos_address, avatar_base_address, camera_front_address, camera_top_address, player_address, vehicle_address, location_address, street_address; #define VERSION_EQ(buf, strlit) \ memcmp(buf, strlit, std::min(sizeof(buf), sizeof(strlit)-1)) == 0 // Steam version if (peekProc(pModule + 0x18107F8, game_name) && VERSION_EQ(game_name, "Grand Theft Auto V")) { state_address = pModule + 0x27377E0; in_game_address = pModule + 0x245F430; avatar_pos_address = pModule + 0x1F82C30; camera_pos_address = pModule + 0x1C5C560; avatar_base_address = pModule + 0x1B99760; camera_front_address = pModule + 0x1F81E20; camera_top_address = pModule + 0x1F81E10; player_address = pModule + 0x2741F7C; vehicle_address = pModule + 0x2335A00; location_address = pModule + 0x23353CB; street_address = pModule + 0x2332110; // Retail version } else if (peekProc(pModule + 0x180D4D8, game_name) && VERSION_EQ(game_name, "Grand Theft Auto V")) { state_address = pModule + 0x2733490; in_game_address = pModule + 0x1BC6687; avatar_pos_address = pModule + 0x1F7EAA0; camera_pos_address = pModule + 0x1C58630; avatar_base_address = pModule + 0x1B956C0; camera_front_address = pModule + 0x1C5A0F0; camera_top_address = pModule + 0x1F7D9F0; player_address = pModule + 0x273DBAC; vehicle_address = pModule + 0x2331890; location_address = pModule + 0x233125B; street_address = pModule + 0x232DFA0; // Unknown version } else { generic_unlock(); return false; } // Avatar pointer procptr_t avatar_base = peekProcPtr(avatar_base_address); if (!avatar_base) return false; // Boolean value to check if game addresses retrieval is successful bool ok; // Create containers to stuff our raw data into, so we can convert it to Mumble's coordinate system float avatar_pos_corrector[3], camera_pos_corrector[3], avatar_front_corrector[3], avatar_top_corrector[3], camera_front_corrector[3], camera_top_corrector[3]; // Char values for extra features char state, in_game, player[50], vehicle[50], location[50], street[50]; // Peekproc and assign game addresses to our containers, so we can retrieve positional data ok = peekProc(state_address, &state, 1) && // Magical state value: 0 when in single player, 2 when online and 3 when in a lobby. peekProc(in_game_address, &in_game, 1) && // 0 when loading or not in-game, 1 when in-game. peekProc(avatar_pos_address, avatar_pos_corrector, 12) && // Avatar Position values (X, Z and Y). peekProc(camera_pos_address, camera_pos_corrector, 12) && // Camera Position values (X, Z and Y). peekProc(avatar_base + 0x70, avatar_front_corrector, 12) && // Avatar Front Vector values (X, Z and Y). peekProc(avatar_base + 0x80, avatar_top_corrector, 12) && // Avatar Top Vector values (X, Z and Y). peekProc(camera_front_address, camera_front_corrector, 12) && // Camera Front Vector values (X, Z and Y). peekProc(camera_top_address, camera_top_corrector, 12) && // Camera Top Vector values (X, Z and Y). peekProc(player_address, player) && // Player nickname. peekProc(vehicle_address, vehicle) && // Vehicle name if in a vehicle, empty if not. peekProc(location_address, location) && // Location name. peekProc(street_address, street); // Street name if on a street, empty if not. // This prevents the plugin from linking to the game in case something goes wrong during values retrieval from memory addresses. if (! ok) return false; // State if (state != 2 || in_game == 0) { // If not in-game context.clear(); // Clear context identity.clear(); // Clear identity // Set vectors values to 0. for (int i=0;i<3;i++) avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; return true; // This tells Mumble to ignore all vectors. } /* // Begin context std::ostringstream ocontext; // Host escape(host); if (strcmp(host, "") != 0 && strstr(host, "127.0.0.1") == NULL) { // Set host string as empty if "127.0.0.1" is found in it. ocontext << " {\"Host\": \"" << host << "\"}"; // Set context with IP address and port } context = ocontext.str(); // End context */ // Begin identity std::wostringstream oidentity; oidentity << "{"; // Player escape(player, sizeof(player)); if (strcmp(player, "") != 0) { oidentity << std::endl; oidentity << "\"Player\": \"" << player << "\","; // Set player nickname in identity. } else { oidentity << std::endl << "\"Player\": null,"; } // Vehicle escape(vehicle, sizeof(vehicle)); if (strcmp(vehicle, "") != 0) { oidentity << std::endl; oidentity << "\"Vehicle\": \"" << vehicle << "\","; // Set vehicle name in identity. } else { oidentity << std::endl << "\"Vehicle\": null,"; } // Location escape(location, sizeof(location)); if (strcmp(location, "") != 0) { oidentity << std::endl; oidentity << "\"Location\": \"" << location << "\","; // Set location name in identity. } else { oidentity << std::endl << "\"Location\": null,"; } // Street escape(street, sizeof(street)); if (strcmp(street, "") != 0) { oidentity << std::endl; oidentity << "\"Street\": \"" << street << "\""; // Set street name in identity. } else { oidentity << std::endl << "\"Street\": null"; } oidentity << std::endl << "}"; identity = oidentity.str(); // End identity /* Mumble | Game X | X Y | Z Z | Y */ avatar_pos[0] = avatar_pos_corrector[0]; avatar_pos[1] = avatar_pos_corrector[2]; avatar_pos[2] = avatar_pos_corrector[1]; camera_pos[0] = camera_pos_corrector[0]; camera_pos[1] = camera_pos_corrector[2]; camera_pos[2] = camera_pos_corrector[1]; avatar_front[0] = avatar_front_corrector[0]; avatar_front[1] = avatar_front_corrector[2]; avatar_front[2] = avatar_front_corrector[1]; avatar_top[0] = avatar_top_corrector[0]; avatar_top[1] = avatar_top_corrector[2]; avatar_top[2] = avatar_top_corrector[1]; camera_front[0] = camera_front_corrector[0]; camera_front[1] = camera_front_corrector[2]; camera_front[2] = camera_front_corrector[1]; camera_top[0] = camera_top_corrector[0]; camera_top[1] = camera_top_corrector[2]; camera_top[2] = camera_top_corrector[1]; return true; } static int trylock(const std::multimap &pids) { if (! initialize(pids, L"GTA5.exe")) { // Retrieve game executable's memory address return false; } // Check if we can get meaningful data from it float apos[3], afront[3], atop[3], cpos[3], cfront[3], ctop[3]; std::wstring sidentity; std::string scontext; if (fetch(apos, afront, atop, cpos, cfront, ctop, scontext, sidentity)) { return true; } else { generic_unlock(); return false; } } static const std::wstring longdesc() { return std::wstring(L"Supports Grand Theft Auto V version 1.38 with identity support."); // Plugin long description } static std::wstring description(L"Grand Theft Auto V (v1.38)"); // Plugin short description static std::wstring shortname(L"Grand Theft Auto V"); // Plugin short name static int trylock1() { return trylock(std::multimap()); } static MumblePlugin gtavplug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 gtavplug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return >avplug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return >avplug2; } mumble-1.3.4/plugins/gtav/gtav.pro0000664000175000017500000000050414010707273016745 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = gtav SOURCES = gtav.cpp LIBS += -luser32 mumble-1.3.4/plugins/bf2/0000775000175000017500000000000014010707273014773 5ustar builderbuildermumble-1.3.4/plugins/bf2/bf2.pro0000664000175000017500000000050214010707273016163 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = bf2 SOURCES = bf2.cpp LIBS += -luser32 mumble-1.3.4/plugins/bf2/bf2.cpp0000664000175000017500000001776514010707273016170 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "../mumble_plugin_win32.h" using namespace std; bool ptr_chain_valid = false; // Modules procptr_t pmodule_bf2, pmodule_renddx9; // Magic ptrs procptr_t const login_ptr = 0x30058642; procptr_t const state_ptr = 0x00A1D0A8; // Vector ptrs procptr_t pos_ptr, face_ptr, top_ptr; // Context ptrs procptr_t const ipport_ptr = 0x009A80B8; // Identity ptrs procptr_t commander_ptr, squad_leader_ptr, squad_state_ptr, team_state_ptr, voip_ptr, voip_com_ptr, target_squad_ptr; inline bool resolve_ptrs() { pos_ptr = face_ptr = top_ptr = commander_ptr = squad_leader_ptr = squad_state_ptr = team_state_ptr = voip_ptr = voip_com_ptr = target_squad_ptr = 0; // // Resolve all pointer chains to the values we want to fetch // procptr_t base_bf2audio = pModule + 0x4645c; procptr_t base_bf2audio_2 = peekProcPtr(base_bf2audio); if (!base_bf2audio_2) return false; pos_ptr = peekProcPtr(base_bf2audio_2 + 0xb4); face_ptr = peekProcPtr(base_bf2audio_2 + 0xb8); top_ptr = peekProcPtr(base_bf2audio_2 + 0xbc); if (!pos_ptr || !face_ptr || !top_ptr) return false; /* Magic: Logincheck: 0x30058642 BYTE 0 means not logged in state: 0x00A1D0A8 BYTE 0 while not in game usually 1, never 0 if you create your own server ingame; this value will switch to 1 the instant you click "Join Game" usually 3, never 0 if you load into a server; this value will switch to 3 the instant you click "Join Game" Context: IP:Port of server: 0x009A80B8 char[128] ip:port of the server Identity: Commander: RendDX9.dll+00244AE0 -> 60 -> 110 BYTE 0 means not commander Squad leader state: RendDX9.dll+00244AE0 -> 60 -> 111 BYTE 0 is not squad leader Squad state: RendDX9.dll+00244AE0 -> 60 -> 10C BYTE 0 is not in squad; 1 is in Alpha squad, 2 Bravo, ... , 9 India Team state: BF2.exe+0058734C -> 239 BYTE 0 is blufor (US team, for example), 1 is opfor (Insurgents) VoiP state: BF2.exe+005A4DA0 -> 61 BYTE 1 is VoiP active (held down) Com. VoiP state: BF2.exe+005A4DA0 -> 4E BYTE 1 is VoiP on commander channel active (held down) Target squad state: RendDX9.dll+00266D84 -> C0 -> C0 -> 40 -> AC BYTE 1 is Alpha squad, 2 Bravo... selected on commander screen */ procptr_t base_renddx9 = peekProcPtr(pmodule_renddx9 + 0x00244AE0); if (!base_renddx9) return false; procptr_t base_renddx9_2 = peekProcPtr(base_renddx9 + 0x60); if (!base_renddx9_2) return false; commander_ptr = base_renddx9_2 + 0x110; squad_leader_ptr = base_renddx9_2 + 0x111; squad_state_ptr = base_renddx9_2 + 0x10C; procptr_t base_bf2 = peekProcPtr(pmodule_bf2 + 0x0058734C); if (!base_bf2) return false; team_state_ptr = base_bf2 + 0x239; procptr_t base_voip = peekProcPtr(pmodule_bf2 + 0x005A4DA0); if (!base_voip) return false; voip_ptr = base_voip + 0x61; voip_com_ptr = base_voip + 0x4E; procptr_t base_target_squad = peekProcPtr(pmodule_renddx9 + 0x00266D84); if (!base_target_squad) return false; procptr_t base_target_squad_2 = peekProcPtr(base_target_squad + 0xC0); if (!base_target_squad_2) return false; procptr_t base_target_squad_3 = peekProcPtr(base_target_squad_2 + 0xC0); if (!base_target_squad_3) return false; procptr_t base_target_squad_4 = peekProcPtr(base_target_squad_3 + 0x40); if (!base_target_squad_4) return false; target_squad_ptr = base_target_squad_4 + 0xAC; return true; } static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &context, std::wstring &identity) { for (int i=0;i<3;i++) avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; bool ok; BYTE logincheck; ok = peekProc(login_ptr, &logincheck, 1); if (! ok) return false; if (logincheck == 0) return false; BYTE state; ok = peekProc(state_ptr , &state, 1); // Magical state value if (! ok) return false; if (state == 0) { ptr_chain_valid = false; context.clear(); identity.clear(); return true; // This results in all vectors beeing zero which tells Mumble to ignore them. } else if (!ptr_chain_valid) { if (!resolve_ptrs()) return false; ptr_chain_valid = true; } char ccontext[128]; BYTE is_commander; BYTE is_squad_leader; BYTE is_in_squad; BYTE is_opfor; BYTE on_voip; BYTE on_voip_com; BYTE target_squad_id; ok = peekProc(pos_ptr, avatar_pos, 12) && peekProc(face_ptr, avatar_front, 12) && peekProc(top_ptr, avatar_top, 12) && peekProc(ipport_ptr, ccontext, 128) && peekProc(commander_ptr, is_commander) && peekProc(squad_leader_ptr, is_squad_leader) && peekProc(squad_state_ptr, is_in_squad) && peekProc(team_state_ptr, is_opfor) && peekProc(voip_ptr, on_voip) && peekProc(voip_com_ptr, on_voip_com) && peekProc(target_squad_ptr, target_squad_id); if (! ok) return false; /* Get context string; in this plugin this will be an ip:port (char 128 bytes) string */ ccontext[127] = 0; if (ccontext[0] != '0') { // With the current plugin ipport can switch to "0" sometimes. // As this is only transitory and switches back quickly just // keep on reporting the previous state as long as this happens. ostringstream ocontext; ocontext << "{ \"ipport\": \"" << ccontext << "\"}"; context = ocontext.str(); /* Get identity string. */ wostringstream oidentity; oidentity << "{" << "\"ipport\": \"" << ccontext << "\", " << "\"commander\":" << (is_commander ? "true" : "false") << ", " << "\"squad_leader\":" << (is_squad_leader ? "true" : "false") << ", " << "\"squad\":" << static_cast(is_in_squad) << ", " << "\"team\":\"" << (is_opfor ? "opfor" : "blufor") << "\", " << "\"on_voip\":" << (on_voip ? "true" : "false") << ", " << "\"on_voip_com\":" << (on_voip_com ? "true" : "false") << ", " << "\"target_squad_id\":" << static_cast(target_squad_id) << "}"; identity = oidentity.str(); } for (int i=0;i<3;i++) { camera_pos[i] = avatar_pos[i]; camera_front[i] = avatar_front[i]; camera_top[i] = avatar_top[i]; } return ok; } static int trylock(const std::multimap &pids) { if (! initialize(pids, L"BF2.exe", L"BF2Audio.dll")) return false; pmodule_bf2 = getModuleAddr(L"BF2.exe"); if (!pmodule_bf2) return false; pmodule_renddx9 = getModuleAddr(L"RendDX9.dll"); if (!pmodule_renddx9) return false; float apos[3], afront[3], atop[3], cpos[3], cfront[3], ctop[3]; std::string context; std::wstring identity; if (fetch(apos, afront, atop, cpos, cfront, ctop, context, identity)) { return true; } else { generic_unlock(); return false; } } static const std::wstring longdesc() { return std::wstring(L"Supports Battlefield 2 v1.50"); } static std::wstring description(L"Battlefield 2 v1.50"); static std::wstring shortname(L"Battlefield 2"); static int trylock1() { return trylock(std::multimap()); } static MumblePlugin bf2plug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 bf2plug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &bf2plug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &bf2plug2; } mumble-1.3.4/plugins/bf3/0000775000175000017500000000000014010707273014774 5ustar builderbuildermumble-1.3.4/plugins/bf3/bf3.pro0000664000175000017500000000050214010707273016165 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = bf3 SOURCES = bf3.cpp LIBS += -luser32 mumble-1.3.4/plugins/bf3/bf3.cpp0000664000175000017500000002034314010707273016154 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . /* Copyright (C) 2010-2011, Snares Copyright (C) 2005-2011, Thorvald Natvig Copyright (C) 2011, Ryan Austin Copyright (C) 2012, Bojan Hartmann All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Mumble Developers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "../mumble_plugin_win32.h" static bool ptr_chain_valid = false; // Magic ptrs static procptr_t const state_ptr = 0x238ABDC; // Vector ptrs static procptr_t const avatar_pos_ptr = 0x0238AB70; static procptr_t const avatar_front_ptr = 0x0238ABA0; static procptr_t const avatar_top_ptr = 0x0238AB90; // Context ptrs static procptr_t const ipport_ptr = 0x0235DB90; // Identity ptrs static procptr_t team_state_ptr, squad_state_ptr, squad_lead_state_ptr; // Offsets static const int base_offset = 0x01EF25C4; static const int identity_offset1 = 0x1C; static const int identity_offset2 = 0xBC; static const int identity_offset3 = 0x36C; static const int identity_offset4 = 0x8; static const int squad_state_offset = 0x104; static const int squad_lead_state_offset = 0x108; static const int team_state_offset = 0x31C; enum state_values { STATE_UNKN = 0, STATE_LOADING = 1, STATE_IN_GAME = 2, STATE_IN_MENU = 3 }; inline bool resolve_ptrs() { team_state_ptr = squad_state_ptr = squad_lead_state_ptr = 0; /* Analysis for future patches: - state_ptr is always 0x6C after avatar_pos_ptr - avatar_front_ptr is always 0x30 after avatar_pos_ptr - avatar_top_ptr is always 0x20 after avatar_pos_ptr - you can find avatar_pos_ptr easily by jumping in a jet/heli and look at the altitude indicator - for squad/team/squad lead pointers, search for your name - name address - 0x20 = squad lead(1=yes/0=no) - squad lead - 0x4 = squad number(1=alpha etc) - squad number - 0x150 = team number(1=US,2=RU) */ /* Magic: state : 0x238ABDC BYTE 1 when playing 2 while in menu/dead Context: IP:Port of server: 0x0235DB90 char[128] ip:port of the server Identity: Squad state: BF3.exe+0x01EF25C4 + 0x1C + 0xBC + 0x36C + 0x8 + 0x104 BYTE 0 is not in squad; 1 is in Alpha squad, 2 Bravo, ... , 9 India SLead state: BF3.exe+0x01EF25C4 + 0x1C + 0xBC + 0x36C + 0x8 + 0x108 BYTE 0 is not lead; 1 is lead Team state: BF3.exe+0x01EF25C4 + 0x1C + 0xBC + 0x31C BYTE 1 is blufor (US team, for example), 2 is opfor (RU), 0 is probably upcoming spec mode */ procptr_t base_bf3 = peekProcPtr(pModule + base_offset); if (!base_bf3) return false; procptr_t offset_ptr1 = peekProcPtr(base_bf3 + identity_offset1); if (!offset_ptr1) return false; procptr_t offset_ptr2 = peekProcPtr(offset_ptr1 + identity_offset2); if (!offset_ptr2) return false; procptr_t offset_ptr3 = peekProcPtr(offset_ptr2 + identity_offset3); if (!offset_ptr3) return false; procptr_t offset_ptr4 = peekProcPtr(offset_ptr3 + identity_offset4); if (!offset_ptr4) return false; squad_state_ptr = offset_ptr4 + squad_state_offset; squad_lead_state_ptr = offset_ptr4 + squad_lead_state_offset; team_state_ptr = offset_ptr2 + team_state_offset; return true; } static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &context, std::wstring &identity) { for (int i=0;i<3;i++) avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; char ccontext[128]; char state; BYTE squad_state; BYTE is_squadleader; BYTE team_state; bool ok; ok = peekProc(state_ptr, &state, 1); // State value if (! ok) return false; if (state != STATE_IN_GAME && state != STATE_IN_MENU) { ptr_chain_valid = false; context.clear(); identity.clear(); return true; } else if (!ptr_chain_valid) { if (!resolve_ptrs()) return false; ptr_chain_valid = true; } ok = peekProc(avatar_pos_ptr, avatar_pos, 12) && peekProc(avatar_front_ptr, avatar_front, 12) && peekProc(avatar_top_ptr, avatar_top, 12) && peekProc(squad_state_ptr,&squad_state,1) && peekProc(squad_lead_state_ptr, &is_squadleader,1) && peekProc(team_state_ptr,&team_state,1) && peekProc(ipport_ptr,ccontext,128); if (! ok) return false; ccontext[sizeof(ccontext) - 1] = 0; if (ccontext[0] != '0') { std::ostringstream ocontext; ocontext << "{ \"ipport\": \"" << ccontext << "\" }"; context = ocontext.str(); /* Get identity string. */ std::wostringstream oidentity; oidentity << "{" << "\"squad\":" << static_cast(squad_state) << "," << "\"squad_leader\":" << (is_squadleader ? "true" : "false") << ","; if (team_state == 0) oidentity << "\"team\": \"SPEC\""; else if (team_state == 1) oidentity << "\"team\": \"US\""; else if (team_state == 2) oidentity << "\"team\": \"RU\""; oidentity << "}"; identity = oidentity.str(); } // Flip our front vector for (int i=0;i<3;i++) { avatar_front[i] = -avatar_front[i]; } // Convert from right to left handed avatar_pos[0] = -avatar_pos[0]; avatar_front[0] = -avatar_front[0]; avatar_top[0] = -avatar_top[0]; for (int i=0;i<3;i++) { camera_pos[i] = avatar_pos[i]; camera_front[i] = avatar_front[i]; camera_top[i] = avatar_top[i]; } return ok; } static int trylock(const std::multimap &pids) { if (! initialize(pids, L"bf3.exe")) return false; float apos[3], afront[3], atop[3], cpos[3], cfront[3], ctop[3]; std::string context; std::wstring identity; if (!fetch(apos, afront, atop, cpos, cfront, ctop, context, identity)) { generic_unlock(); return false; } return true; } static const std::wstring longdesc() { return std::wstring(L"Supports Battlefield 3 with context and identity support."); } static std::wstring description(L"Battlefield 3 v1147186 - Endgame"); static std::wstring shortname(L"Battlefield 3"); static int trylock1() { return trylock(std::multimap()); } static MumblePlugin bf3plug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 bf3plug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &bf3plug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &bf3plug2; } mumble-1.3.4/plugins/css/0000775000175000017500000000000014010707273015112 5ustar builderbuildermumble-1.3.4/plugins/css/css.pro0000664000175000017500000000064414010707273016430 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) DEFINES += "NULL_DESC=\"L\\\"CounterStrike : Source (Retracted, now using link)\\\"\"" TARGET = css SOURCES = ../null_plugin.cpp LIBS += -luser32 mumble-1.3.4/plugins/codmw2so/0000775000175000017500000000000014010707273016057 5ustar builderbuildermumble-1.3.4/plugins/codmw2so/codmw2so.cpp0000664000175000017500000001372714010707273020332 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . /* Copyright (C) 2009-2012, Snares Copyright (C) 2009-2012, Stefan Hacker Copyright (C) 2005-2012, Thorvald Natvig All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Mumble Developers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "../mumble_plugin_win32.h" static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &, std::wstring &) { float viewHor, viewVer; char state; char specops; for (int i=0;i<3;i++) avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; bool ok; /* This plugin uses the following Variables: Address Type Description =================================== 0x00783A64 float Z-Coordinate 0x00783A68 float X-Coordinate 0x00783A6C float Y-Coordinate 0x00783A34 float Horizontal view (degrees) 0x00783A30 float Vertical view (degrees) 0x019713F0 byte SO game identifier 0x009270F0 byte Magical state value */ ok = peekProc(0x019713F0, &specops, 1); // Magical state value if (! ok) return false; if (specops != 2) return false; // 2 value indicates you are playing Special Ops, 1 indicates SP, 0 indicates at three-way selection menu ok = peekProc(0x009270F0, &state, 1); // Magical state value if (! ok) return false; // /* // state value is: // 0 while not in game // 4 while playing // This value is used for disabling pa for spectators // or people not on a server. // */ if (state == 0) return true; // This results in all vectors beeing zero which tells mumble to ignore them. ok = peekProc(0x00783A64, avatar_pos+2, 4) && //Z peekProc(0x00783A68, avatar_pos, 4) && //X peekProc(0x00783A6C, avatar_pos+1, 4) && //Y peekProc(0x00783A34, &viewHor, 4) && //Hor peekProc(0x00783A30, &viewVer, 4); //Ver if (! ok) return false; // Scale Coordinates /* Z-Value is increasing when heading north decreasing when heading south X-Value is increasing when heading west decreasing when heading east Y-Value is increasing when going up decreasing when going down 40 units = 1 meter (not confirmed) */ for (int i=0;i<3;i++) avatar_pos[i]/=40.0f; // Scale to meters avatar_pos[0]*=(-1.0f); // Convert right to left handed avatar_top[2] = -1; // Head movement is in front vector // Calculate view unit vector /* Vertical view 0° when centered 85° when looking down 275° when looking up Decreasing when looking up. Horizontal is 0° when facing North 90° when facing West 180° when facing South 270° when facing East Increasing when turning left. */ viewVer *= static_cast(M_PI / 180.0f); viewHor *= static_cast(M_PI / 180.0f); avatar_front[0] = -sin(viewHor) * cos(viewVer); avatar_front[1] = -sin(viewVer); avatar_front[2] = cos(viewHor) * cos(viewVer); for (int i=0;i<3;i++) { camera_pos[i] = avatar_pos[i]; camera_front[i] = avatar_front[i]; camera_top[i] = avatar_top[i]; } return true; } static int trylock(const std::multimap &pids) { if (! initialize(pids, L"iw4sp.exe")) return false; float apos[3], afront[3], atop[3], cpos[3], cfront[3], ctop[3]; std::string context; std::wstring identity; if (fetch(apos, afront, atop, cpos, cfront, ctop, context, identity)) { return true; } else { generic_unlock(); return false; } } static const std::wstring longdesc() { return std::wstring(L"Supports Call of Duty: Modern Warfare 2 Special Ops v1.1 only. No context or identity support."); } static std::wstring description(L"Call of Duty: Modern Warfare 2 Special Ops v1.1"); static std::wstring shortname(L"Call of Duty: Modern Warfare 2 Special Ops"); static int trylock1() { return trylock(std::multimap()); } static MumblePlugin codmw2soplug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 codmw2soplug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &codmw2soplug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &codmw2soplug2; } mumble-1.3.4/plugins/codmw2so/codmw2so.pro0000664000175000017500000000051414010707273020336 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = codmw2so SOURCES = codmw2so.cpp LIBS += -luser32 mumble-1.3.4/plugins/wolfet/0000775000175000017500000000000014010707273015622 5ustar builderbuildermumble-1.3.4/plugins/wolfet/wolfet.cpp0000664000175000017500000001135414010707273017632 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . /* This plugin scans the following address locations: Address Type Description =================================== 0x013E8CF4 float X-Coordinate 0x013E8CF8 float Y-Coordinate 0x013E8CFC float Z-Coordinate // The XYZ coordinates repeat at 0x013F79C8, 0x013F79CC, 0x013F79D0 // and seem to always hold the same values. It is not the camera vs // character, as with third person they still hold the same values. 0x013F9E20 float Horizontal view in degree 0x013F9E1C float Vertical view in degree 0x013E8DFC byte Team; 0: not in-game (in menu etc), 1: allies, 2: axis, 3: spectator 0x009FFD30 char[40] last connected to host IP 0x010B4908 char[32] map shortname only As reference, as help for future manual mem scanning: 0x010B48C8 char[32] map fullpath (relative to gamedir) 0x03A54C9C char[16] last download host IP (wwwdownload) There seem to be a ton of memory addresses valid for the team value. For position coordinates: X-Value is increasing when heading east decreasing when heading west Y-Value is increasing when heading north decreasing when heading south Z-Value is increasing when going up decreasing when going down 1 unit = 1 meter (not confirmed) For the view angle values: Vertical view 0 when centered -90 when looking up +90 when looking down Increasing when looking down. Horizontal is 90 when facing north 0 when facing east -90 when facing south +/-180 when facing west Increasing when turning left. */ #include "../mumble_plugin_win32.h" static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &context, std::wstring &) { float viewHor, viewVer; char team; for (int i=0;i<3;i++) avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; bool ok; ok = peekProc(0x013E8DFC, &team, 1); if (!ok) return false; // We dont use pos-audio in menus if (team == 0 || team == 3) return true; ok = peekProc(0x013E8CF4, avatar_pos, 12) && // X, Y, Z peekProc(0x013F9E20, &viewHor, 4) && // Hor-Angle peekProc(0x013F9E1C, &viewVer, 4); // Ver-Angle if (!ok) return false; avatar_top[2] = -1; // Head movement is in front vector // Calculate view unit vector viewVer *= static_cast(M_PI / 180.0f); viewHor *= static_cast(M_PI / 180.0f); avatar_front[0] = cos(viewVer) * cos(viewHor); avatar_front[1] = -sin(viewVer); avatar_front[2] = cos(viewVer) * sin(viewHor); for (int i=0;i<3;i++) { camera_pos[i] = avatar_pos[i]; camera_front[i] = avatar_front[i]; camera_top[i] = avatar_top[i]; } // Context - concatenated server-ip, mapname and team value char hostip[32]; char mapname[40]; ok = peekProc(0x009FFD30, hostip, sizeof(hostip)) && peekProc(0x010B4908, mapname, sizeof(hostip)); hostip[sizeof(hostip)-1] = '\0'; mapname[sizeof(mapname)-1] = '\0'; // Context in JSON format, {} with fields ipport (server hostname), map, and team (: int) context = "{\"ipport\":\"" + std::string(hostip) + "\",\"map\":\"" + mapname + "\",\"team\":" + (char)(team + 0x30) + "}"; return true; } static int trylock(const std::multimap &pids) { if (! initialize(pids, L"ET.exe")) return false; float apos[3], afront[3], atop[3], cpos[3], cfront[3], ctop[3]; std::string context; std::wstring identity; if (fetch(apos, afront, atop, cpos, cfront, ctop, context, identity)) { return true; } else { generic_unlock(); return false; } } static const std::wstring longdesc() { return std::wstring(L"Supports Wolfenstien: Enemy Territory v2.60b. No context or identity support yet."); } static std::wstring description(L"Wolfenstein: Enemy Territory v2.60b"); static std::wstring shortname(L"Wolfenstein: Enemy Territory"); static int trylock1() { return trylock(std::multimap()); } static MumblePlugin wolfetplug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 wolfetplug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &wolfetplug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &wolfetplug2; } mumble-1.3.4/plugins/wolfet/wolfet.pro0000664000175000017500000000051014010707273017640 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = wolfet SOURCES = wolfet.cpp LIBS += -luser32 mumble-1.3.4/plugins/bfbc2/0000775000175000017500000000000014010707273015300 5ustar builderbuildermumble-1.3.4/plugins/bfbc2/bfbc2.cpp0000664000175000017500000000566114010707273016772 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "../mumble_plugin_win32.h" bool is_steam = false; static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &, std::wstring &) { for (int i=0;i<3;i++) avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; //char ccontext[128]; //char state; bool ok; /* ok = peekProc((BYTE *) 0x0, &state, 1); // Magical state value if (! ok) return false; */ // Find out whether this is the steam version char sMagic[6]; if (!peekProc(0x015715b4, sMagic, 6)) { generic_unlock(); return false; } is_steam = (strncmp("Score:", sMagic, 6) == 0); if (is_steam) { ok = peekProc(0x01571E90, avatar_pos, 12) && peekProc(0x01571E80, avatar_front, 12) && peekProc(0x01571E70, avatar_top, 12); } else { ok = peekProc(0x01579600, avatar_pos, 12) && peekProc(0x015795F0, avatar_front, 12) && peekProc(0x015795E0, avatar_top, 12); } if (! ok) return false; // Disable when not in game if (avatar_pos[1] == 9999) return true; /* Get context string; in this plugin this will be an ip:port (char 256 bytes) string ccontext[127] = 0; context = std::string(ccontext); */ /* if (state == 0) return true; // This results in all vectors beeing zero which tells Mumble to ignore them. */ for (int i=0;i<3;i++) { camera_pos[i] = avatar_pos[i]; camera_front[i] = avatar_front[i]; camera_top[i] = avatar_top[i]; } return ok; } static int trylock(const std::multimap &pids) { if (! initialize(pids, L"BFBC2Game.exe")) return false; float apos[3], afront[3], atop[3], cpos[3], cfront[3], ctop[3]; std::string context; std::wstring identity; if (!fetch(apos, afront, atop, cpos, cfront, ctop, context, identity)) { generic_unlock(); return false; } return true; } static const std::wstring longdesc() { return std::wstring(L"Supports Battlefield Bad Company 2 build 795745. No identity or context support."); } static std::wstring description(L"Battlefield Bad Company 2 build 795745"); static std::wstring shortname(L"Battlefield Bad Company 2"); static int trylock1() { return trylock(std::multimap()); } static MumblePlugin bfbc2plug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 bfbc2plug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &bfbc2plug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &bfbc2plug2; } mumble-1.3.4/plugins/bfbc2/bfbc2.pro0000664000175000017500000000050614010707273017001 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = bfbc2 SOURCES = bfbc2.cpp LIBS += -luser32 mumble-1.3.4/plugins/cod5/0000775000175000017500000000000014010707273015154 5ustar builderbuildermumble-1.3.4/plugins/cod5/cod5.pro0000664000175000017500000000050414010707273016527 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = cod5 SOURCES = cod5.cpp LIBS += -luser32 mumble-1.3.4/plugins/cod5/cod5.cpp0000664000175000017500000000765614010707273016530 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "../mumble_plugin_win32.h" static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &, std::wstring &) { float viewHor, viewVer; char state; for (int i=0;i<3;i++) avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; bool ok; /* This plugin uses the following Variables: Address Type Description =================================== 0x008DE23C float Z-Coordinate 0x008DE234 float X-Coordinate 0x008DE238 float Y-Coordinate 0x008DE244 float Horizontal view (degrees) 0x008DE240 float Vertical view (degrees) 0x0098FD2C byte Magical state value */ ok = peekProc(0x0098FD2C, &state, 1); // Magical state value if (! ok) return false; /* state value is: 0 while not in game 4 while playing 8 while spectating This value is used for disabling pa for spectators or people not on a server. */ if (state != 4) return true; // This results in all vectors beeing zero which tells mumble to ignore them. ok = peekProc(0x008DE23C, avatar_pos+2, 4) && //Z peekProc(0x008DE234, avatar_pos, 4) && //X peekProc(0x008DE238, avatar_pos+1, 4) && //Y peekProc(0x008DE244, &viewHor, 4) && //Hor peekProc(0x008DE240, &viewVer, 4); //Ver if (! ok) return false; // Scale Coordinates /* Z-Value is increasing when heading north decreasing when heading south X-Value is increasing when heading west decreasing when heading east Y-Value is increasing when going up decreasing when going down 40 units = 1 meter (not confirmed) */ for (int i=0;i<3;i++) avatar_pos[i]/=40.0f; // Scale to meters avatar_pos[0]*=(-1.0f); // Convert right to left handed avatar_top[2] = -1; // Head movement is in front vector // Calculate view unit vector /* Vertical view 0° when centered 85° when looking down 275° when looking up Decreasing when looking up. Horizontal is 0° when facing North 90° when facing West 180° when facing South 270° when facing East Increasing when turning left. */ viewVer *= static_cast(M_PI / 180.0f); viewHor *= static_cast(M_PI / 180.0f); avatar_front[0] = -sin(viewHor) * cos(viewVer); avatar_front[1] = -sin(viewVer); avatar_front[2] = cos(viewHor) * cos(viewVer); for (int i=0;i<3;i++) { camera_pos[i] = avatar_pos[i]; camera_front[i] = avatar_front[i]; camera_top[i] = avatar_top[i]; } return true; } static int trylock(const std::multimap &pids) { if (! initialize(pids, L"CoDWaWmp.exe")) return false; float apos[3], afront[3], atop[3], cpos[3], cfront[3], ctop[3]; std::string context; std::wstring identity; if (fetch(apos, afront, atop, cpos, cfront, ctop, context, identity)) { return true; } else { generic_unlock(); return false; } } static const std::wstring longdesc() { return std::wstring(L"Supports Call of Duty 5 MP v1.7.1263 only. No context or identity support yet."); } static std::wstring description(L"Call of Duty 5 MP v1.7.1263"); static std::wstring shortname(L"Call of Duty 5 MP"); static int trylock1() { return trylock(std::multimap()); } static MumblePlugin cod5plug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 cod5plug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &cod5plug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &cod5plug2; } mumble-1.3.4/plugins/cs/0000775000175000017500000000000014010707273014727 5ustar builderbuildermumble-1.3.4/plugins/cs/cs.cpp0000664000175000017500000001476214010707273016052 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . /* Copyright (C) 2009-2010, Imre Botos Copyright (C) 2009-2012, Snares Copyright (C) 2005-2012, Thorvald Natvig All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Mumble Developers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "../mumble_plugin_win32.h" using namespace std; procptr_t pEngine; /* DESCRIPTION ADDRESS TYPE VALUE * Client based addresses Connected to server: client.dll+0xFC228 byte (0 - not; 1 - connected) Position tuple: client.dll+0x11D470 float (x, y, z in inches) Orientation tuple: client.dll+0x11D47C float (v, h in degrees) Check string: client.dll+0xE46F5 char ("CSSpectatorGUI@@" | 16 bytes) Player state: client.dll+0xFBC2C byte (0 - died; 1 - stand; 2 - duck; 3 - walk; 4 - run; 5 - crouchmove; 6 - fall) Team state: client.dll+0xFC94C byte (0 - Spectator; 1 - Terrorist; 2 - Counter-Terrorist) ALT+TAB: client.dll+0xFD05C byte (0 - tabbed; 1 - ingame) Map string: client.dll+0x11DCE4 str ("maps/de_nuke.bsp") * Engine based addresses IP:Port string hw.dll+0x697E60 str (ip:port) ALT+TAB: hw.dll+0x7486B4 byte (0 - tabbed; 1 - ingame) */ static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, string &context, wstring &) { for (int i=0;i<3;i++) avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; bool ok; bool bConnected; char cPlayerState; char cHostAddr[40]; float fViewHor, fViewVer; /* Dust2 INC DEC | Ver Hor X - long B | 0 center 0/360 long Y - CT spawn T spawn | -89 lookup 90 CT spawn Z - up down | 89 lookdown 180 B | 270 T spawn */ ok = peekProc(pModule + 0x11D470, avatar_pos, 12) && peekProc(pModule + 0x11D47C, &fViewHor, 4) && peekProc(pModule + 0x11D480, &fViewVer, 4) && peekProc(pModule + 0xFC228, &bConnected, 1) && peekProc(pModule + 0xFBC2C, &cPlayerState, 1) && peekProc(pEngine + 0x697E60, cHostAddr, 40); if (!ok) return false; if (!bConnected) return true; /* // FOR TEST ONLY - constant position (d2 CT middle, looking T spawn through doorgap) avatar_pos[0] = -380.359375f; avatar_pos[1] = 2188.1328125f; avatar_pos[2] = -91.96875f; fViewHor = 269,703369140625; fViewVer = -4,45587635040283; */ cHostAddr[39] = '\0'; context = cHostAddr; if (!cPlayerState) return true; if ((fViewVer < -720.0f) || (fViewVer > 720.0f) || (fViewHor < -720.0f) || (fViewHor > 720.0f)) return false; fViewHor *= static_cast(M_PI / 180.0f); fViewVer *= static_cast(M_PI / 180.0f); avatar_pos[0] = avatar_pos[0] / 39.37f; avatar_pos[1] = avatar_pos[2] / 39.37f; avatar_pos[2] = avatar_pos[1] / 39.37f; avatar_front[0] = cos(fViewVer) * cos(fViewHor); avatar_front[1] = -sin(fViewHor); avatar_front[2] = sin(fViewVer) * cos(fViewHor); fViewHor -= static_cast(M_PI / 2.0f); avatar_top[0] = cos(fViewVer) * cos(fViewHor); avatar_top[1] = -sin(fViewHor); avatar_top[2] = sin(fViewVer) * cos(fViewHor); for (int i=0;i<3;++i) { camera_pos[i] = avatar_pos[i]; camera_front[i] = avatar_front[i]; camera_top[i] = avatar_top[i]; } return true; } static int trylock(const std::multimap &pids) { if (! initialize(pids, L"hl.exe", L"client.dll")) return false; pEngine = getModuleAddr(L"hw.dll"); if (!pEngine) return false; // Gamecheck char sMagic[16]; if (!peekProc(pModule + 0xE46F5, sMagic, 16) || strncmp("CSSpectatorGUI@@", sMagic, 16)!=0) return false; float apos[3], afront[3], atop[3], cpos[3], cfront[3], ctop[3]; std::string context; std::wstring identity; if (fetch(apos, afront, atop, cpos, cfront, ctop, context, identity)) return true; generic_unlock(); return false; } static const std::wstring longdesc() { return std::wstring(L"Supports Counter-Strike 1.6 (Steam). Context support based on server address. No identity support."); } static std::wstring description(L"Counter-Strike 1.6"); static std::wstring shortname(L"Counter-Strike"); static int trylock1() { return trylock(std::multimap()); } static MumblePlugin csplug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 csplug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &csplug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &csplug2; } mumble-1.3.4/plugins/cs/cs.pro0000664000175000017500000000050014010707273016051 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = cs SOURCES = cs.cpp LIBS += -luser32 mumble-1.3.4/plugins/lotro/0000775000175000017500000000000014010707273015461 5ustar builderbuildermumble-1.3.4/plugins/lotro/lotro.cpp0000664000175000017500000001210214010707273017320 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . /* Copyright (c) 2009-2011 Ilmar 'Ingaras' Kruis (seaeagle1@users.sourceforge.net) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Mumble Developers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "../mumble_plugin_win32.h" static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &context, std::wstring &) { for (int i=0;i<3;i++) avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; bool ok; byte l[2]; byte r,i; float o[3]; procptr_t hPtr; float h; /* Position as represented by /loc command lx, ly = 8 * (byte)l; ox, oy, oz = (float)o; 0 < ox < 160 x = west->east y = south->north z = altitude r = region i = instance nr nPtr = pointer to character name (unique on a server) */ ok = peekProc(0x01272D34, o, 12) && peekProc(0x01272D2C, l, 2) && peekProc(0x01272D28, &r, 1) && peekProc(0x01272D20, &i, 1) && peekProc(pModule + 0x00A138A4, &hPtr, 4); if (! ok) return false; ok = peekProc((procptr_t)(hPtr + 0x0000046F), &h, 4); if (! ok) return false; // Set identity //if(nPtr3 > 0) // identity.assign(nPtr3); // Use region as context since each region has its own coordinate system if (r == 1) context = "Eriador"; else if (r == 2) context = "Rhovannion"; else return true; // If we're in an instance, append the instance id if (i != 0) context += i; // Heading should be between 0 and 360 if (h < 0 || h > 360) return true; // Limit coordinates to byte-values, otherwise we probably have a read error if (l[0] == 255 && l[1] == 255) return true; avatar_pos[0] = (float)l[0] * 160.0f + o[0]; avatar_pos[1] = o[2]; avatar_pos[2] = (float)l[1] * 160.0f + o[1]; avatar_front[0] = sinf(h * static_cast(M_PI) / 180.0f); avatar_front[1] = 0.0f; avatar_front[2] = cosf(h * static_cast(M_PI) / 180.0f); avatar_top[0] = 0.0; avatar_top[1] = 1.0; avatar_top[2] = 0.0; // TODO: 3rd person camera support for (int i=0;i<3;i++) { camera_pos[i] = avatar_pos[i]; camera_front[i] = avatar_front[i]; camera_top[i] = avatar_top[i]; } return true; } static int trylock(const std::multimap &pids) { if (! initialize(pids, L"lotroclient.exe")) return false; float apos[3], afront[3], atop[3], cpos[3], cfront[3], ctop[3]; std::string context; std::wstring identity; if (fetch(apos, afront, atop, cpos, cfront, ctop, context, identity)) { return true; } else { generic_unlock(); return false; } } static const std::wstring longdesc() { return std::wstring(L"Supports Lord of the Rings Online (Rise of Isengard, Update 6, v3.6.0.8025). Context support based on region and instance. No Identity support."); } static std::wstring description(L"Lord of the Rings Online - Rise of Isengard - Update 6"); static std::wstring shortname(L"Lord of the Rings Online"); static int trylock1() { return trylock(std::multimap()); } static MumblePlugin lotroplug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 lotroplug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &lotroplug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &lotroplug2; } mumble-1.3.4/plugins/lotro/lotro.pro0000664000175000017500000000052314010707273017342 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = lotro SOURCES = lotro.cpp LIBS += -luser32 CONFIG += qt mumble-1.3.4/plugins/null_plugin.cpp0000664000175000017500000000175114010707273017362 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "mumble_plugin.h" #ifndef NULL_DESC #define NULL_DESC L"Retracted plugin" #endif // NULL_DESC static int fetch(float *, float *, float *, float *, float *, float *, std::string &, std::wstring &) { // Empty return false; } static int trylock() { // Empty return false; } static const std::wstring longdesc() { return std::wstring(L"NULL plugin for retracted plugin. This should not be visible in Mumble >= 1.2.4"); } static std::wstring description(NULL_DESC); static std::wstring shortname(L"Retracted"); static MumblePlugin nullplug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock, NULL, longdesc, fetch }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &nullplug; } mumble-1.3.4/plugins/mumble_plugin_utils.h0000664000175000017500000000274014010707273020555 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_MUMBLE_PLUGIN_UTILS_H_ #define MUMBLE_MUMBLE_PLUGIN_UTILS_H_ // escape lossily converts the given // string to ASCII, replacing any // character not within the printable // ASCII region (32-126) with an ASCII // space character. // // escape also replaces any double quote // characters with an ASCII space. This // allows the string to be safely used // when constructing JSON documents via // string concatenation. // // Finally, escape ensures that the given // string is NUL-terminated by always // setting the last byte of the input // string to the value 0. static void escape(char *str, size_t size) { // Ensure the input string is properly NUL-terminated. str[size-1] = 0; char *c = str; while (*c != '\0') { // For JSON compatibility, the string // can't contain double quotes. // If a double quote is found, replace // it with an ASCII space. if (*c == '"') { *c = ' '; } // Ensure the string is within printable // ASCII. If not, replace the offending // byte with an ASCII space. if (*c < 32) { *c = ' '; } else if (*c > 126) { *c = ' '; } c += 1; } } #endif mumble-1.3.4/plugins/gw/0000775000175000017500000000000014010707273014737 5ustar builderbuildermumble-1.3.4/plugins/gw/gw.pro0000664000175000017500000000050014010707273016071 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = gw SOURCES = gw.cpp LIBS += -luser32 mumble-1.3.4/plugins/gw/gw.cpp0000664000175000017500000002045214010707273016063 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . /* Copyright (C) 2012, dark_skeleton (d-rez) Copyright (C) 2005-2012, Thorvald Natvig All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Mumble Developers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "../mumble_plugin_win32.h" /* Arrays of bytes to find addresses accessed by respective functions so we don't have to blindly search for addresses after every update Remember to disable scanning only the writable memory in CE! We're searching for functions here, not values! Camera and avatar position function: 89 10 8B 57 04 89 50 04 8B 57 08 89 50 08 DF E0 F6 C4 01 1) Camera position 2) Camera position (?) 3) Avatar position Camera front vector function: 46 BF 00 89 15 (disassemble, then go up a few times in disassembly) Unit front vector function: 89 1E 8B 5F 04 89 5E 04 8B 7F 08 89 7E 08 8B 7D 10 8D 71 28 To find the right front vector pointer, you'll need to make a pointer scan for the address that gets updated only when >you< move, using different characters in different locations. It should leave you with only two possible pointers after just 2 scans. Location function: 8D 14 DB 8D 34 90 8D 4E 14 (target instruction is the one above the one you find) Area function: A3 58 11 A3 00 E8 B8 02 00 00 BA 37 00 00 00 8B CE Valid addresses from build b36001 Camera position vector address: 0xa30274 Avatar position vector address: 0xa302a4 Camera front vector address: 0xbf46b8 Avatar front vector address: 0xd55610 -> +0x8 --> +0x0 -> +0x1c Location: 0xa3fa08 Area: 0xa31158 No need to care about top vector since the game doesn't use it anyway Context is defined based on location + area combo. This is not enough to be unique in most cases (it doesn't let us distinguish between districts and servers), but it's better than nothing Location Pointer: 25 or 26: Explorable Area / Mission 26 or 27: Town 0 when logged in / in character select / in loading screen 1 when not logged in (in login screen) Area Pointer: This is a 4-byte decimal stating which area we are in. Note however, that some missions have the same area assigned as cities, therefore we need our Location Pointer to distinguish where we are exactly to specify context properly. */ static procptr_t camptr = 0xa30274; static procptr_t posptr = 0xa302a4; static procptr_t camfrontptr = 0xbf46b8; static procptr_t frontptr_ = 0xd55610; static procptr_t frontptr; static procptr_t locationptr = 0xa3fa08; static procptr_t areaptr = 0xa31158; static char prev_location; static int prev_areaid; static bool calcout(float *pos, float *front, float *cam, float *camfront, float *opos, float *ofront, float *ocam, float *ocamfront) { // Seems Guild Wars is in... inches, yeah :) ---> same as in GW2, proof here: http://www.guildwars2guru.com/topic/21519-reddit-ama-all-questions-answers (question #31) // coordinate Y is swapped with Z // Y is negative (looks like somewhere underground is 0.00 and land is for example -120. When we climb up a hill, it decreases (e.g. -130), and when we descent, it goes higher (e.g. -100) opos[0] = pos[0] / 39.37f; opos[1] = -pos[2] / 39.37f; opos[2] = pos[1] / 39.37f; ocam[0] = cam[0] / 39.37f; ocam[1] = -cam[2] / 39.37f; ocam[2] = cam[1] / 39.37f; ofront[0] = front[0]; ofront[1] = -front[2]; ofront[2] = front[1]; ocamfront[0] = camfront[0]; ocamfront[1] = -camfront[2]; ocamfront[2] = camfront[1]; return true; } static bool refreshPointers(void) { frontptr = 0; frontptr = peekProcPtr(frontptr_); if (!frontptr) return false; frontptr = peekProcPtr(frontptr + 0x8); if (!frontptr) return false; frontptr = peekProcPtr(frontptr); if (!frontptr) return false; frontptr = frontptr + 0x1c; return true; } static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &context, std::wstring &/*identity*/) { for (int i=0; i<3; i++) avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; bool ok; float cam[3], pos[3], front[3], camfront[3]; char location; int areaid; ok = peekProc(camptr, cam) && peekProc(posptr, pos) && peekProc(camfrontptr, camfront) && peekProc(locationptr, &location, 1) && peekProc(areaptr, &areaid, 4); if (!ok) // First we check, if the game is even running or if we should unlink because it's not / it's broken return false; ok = refreshPointers(); // yes, we need to do this pretty often since the pointer gets wiped and changed evey time you leave a world instance (that means on loading screens etc) if (!ok) { // Next we check, if we're inside the game or in menus/in a loading screen context.clear(); return true; // don't report positional data but stay linked to avoid unnecessary unlinking on loading screens } else { // If we're inside the game, try to peekProc the last value we need or unlink (again, in case something went wrong) if (!peekProc(frontptr, front)) return false; } calcout(pos, front, cam, camfront, avatar_pos, avatar_front, camera_pos, camera_front); if (areaid != prev_areaid || location != prev_location) { context.clear(); prev_areaid = areaid; prev_location = location; char buffer[50]; sprintf_s(buffer, sizeof(buffer), "{\"instance\": \"%d:%d\"}", areaid, static_cast(location)); context.assign(buffer); } return true; } static int trylock(const std::multimap &pids) { if (! initialize(pids, L"Gw.exe")) return false; float cam[3], pos[3], front[3],camfront[3], top[3], camtop[3]; std::string context; std::wstring identity; prev_areaid = 0; prev_location = 0; if (fetch(pos, front, top, cam, camfront, camtop, context, identity)) { prev_areaid = 0; prev_location = 0; // we need to do this again since fetch() above overwrites this (which results in empty context until next change) return true; } else { generic_unlock(); return false; } } static const std::wstring longdesc() { return std::wstring(L"Supports Guild Wars build 36,001 with partial context support."); } static std::wstring description(L"Guild Wars b36001"); static std::wstring shortname(L"Guild Wars"); static int trylock1() { return trylock(std::multimap()); } static MumblePlugin gwplug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 gwplug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &gwplug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &gwplug2; } mumble-1.3.4/plugins/wow_x64/0000775000175000017500000000000014010707273015637 5ustar builderbuildermumble-1.3.4/plugins/wow_x64/wow_x64.cpp0000664000175000017500000001535714010707273017673 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "../mumble_plugin_win32.h" // Include standard plugin header. #include "../mumble_plugin_utils.h" // Include plugin header for special functions, like "escape". static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &context, std::wstring &identity) { for (int i=0;i<3;i++) { avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; } // To update visit http://www.ownedcore.com/forums/world-of-warcraft/world-of-warcraft-bots-programs/wow-memory-editing // and look for a thread called "[WoW] [Version] Release Info Dump Thread". // http://www.ownedcore.com/forums/world-of-warcraft/world-of-warcraft-bots-programs/wow-memory-editing/585582-wow-7-0-3-22624-release-info-dump-thread.html#post3615091 // Avatar pointer procptr_t avatar_offset = peekProcPtr(pModule + 0x169DF10); // "LocalPlayer" in the thread. if (!avatar_offset) return false; // Camera pointer procptr_t camera_base = peekProcPtr(pModule + 0x179C778); // "CameraStruct" in the thread. if (!camera_base) return false; procptr_t camera_offset = peekProcPtr(camera_base + 0x3338); // "CameraOffset" in the thread. if (!camera_offset) return false; // Realm pointer procptr_t realm_offset = peekProcPtr(pModule + 0x1827EC8); // Not available in the thread. if (!realm_offset) return false; // Memory addresses procptr_t state_address = 0x173E8CE; // "GameState" in the thread. procptr_t avatar_pos_address = 0x15A8; // "UnitOrigin" in the thread. procptr_t camera_pos_address = 0x10; // "CameraOrigin" in the thread. procptr_t camera_front_address = 0x1C; // "CameraMatrix" in the thread. procptr_t camera_top_address = 0x34; // "CameraMatrix" + 0x18. procptr_t avatar_heading_address = 0x15B8; // "UnitAngle" in the thread. procptr_t realm_address = 0x430; // Not available in the thread. procptr_t player_address = 0x1828220; // Not available in the thread. // Boolean value to check if game addresses retrieval is successful bool ok; // Create containers to stuff our raw data into, so we can convert it to Mumble's coordinate system float avatar_pos_corrector[3], camera_pos_corrector[3], avatar_heading, camera_front_corrector[3], camera_top_corrector[3]; // Char values for extra features char state, player[50], realm[50]; // Peekproc and assign game addresses to our containers, so we can retrieve positional data ok = peekProc(pModule + state_address, &state, 1) && // Magical state value: 1 when in-game, 0 when not. peekProc(avatar_offset + avatar_pos_address, avatar_pos_corrector, 12) && // Avatar Position values (Z, -X and Y). peekProc(camera_offset + camera_pos_address, camera_pos_corrector, 12) && // Camera Position values (Z, -X and Y). peekProc(avatar_offset + avatar_heading_address, avatar_heading) && // Avatar heading. peekProc(camera_offset + camera_front_address, camera_front_corrector, 12) && // Camera Front Vector values (Z, -X and Y). peekProc(camera_offset + camera_top_address, camera_top_corrector, 12) && // Camera Top Vector values (Z, -X and Y). peekProc(realm_offset + realm_address, realm) && // Realm name. peekProc(pModule + player_address, player); // Player nickname. // This prevents the plugin from linking to the game in case something goes wrong during values retrieval from memory addresses. if (! ok) return false; // State if (state != 1) { // If not in-game context.clear(); // Clear context identity.clear(); // Clear identity // Set vectors values to 0. for (int i=0;i<3;i++) avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; return true; // This tells Mumble to ignore all vectors. } // Begin context std::ostringstream ocontext; // Realm escape(realm, sizeof(realm)); if (strcmp(realm, "") != 0) { // Set Realm string only if not empty ocontext << " {\"Realm\": \"" << realm << "\"}"; // Set context with Realm's name } context = ocontext.str(); // End context // Begin identity std::wostringstream oidentity; oidentity << "{"; // Player escape(player, sizeof(player)); if (strcmp(player, "") != 0) { oidentity << std::endl; oidentity << "\"Player\": \"" << player << "\""; // Set player nickname in identity. } else { oidentity << std::endl << "\"Player\": null"; } oidentity << std::endl << "}"; identity = oidentity.str(); // End identity /* Mumble | Game X | Z Y | -X Z | Y */ avatar_pos[0] = -avatar_pos_corrector[1]; avatar_pos[1] = avatar_pos_corrector[2]; avatar_pos[2] = avatar_pos_corrector[0]; camera_pos[0] = -camera_pos_corrector[1]; camera_pos[1] = camera_pos_corrector[2]; camera_pos[2] = camera_pos_corrector[0]; avatar_front[0] = -sin(avatar_heading); avatar_front[1] = 0.0f; avatar_front[2] = cos(avatar_heading); avatar_top[2] = -1; // Dummy top vector, you can't tilt your head sideways in WoW. camera_front[0] = -camera_front_corrector[1]; camera_front[1] = camera_front_corrector[2]; camera_front[2] = camera_front_corrector[0]; camera_top[0] = -camera_top_corrector[1]; camera_top[1] = camera_top_corrector[2]; camera_top[2] = camera_top_corrector[0]; return true; } static int trylock(const std::multimap &pids) { if (! initialize(pids, L"Wow-64.exe")) { // Retrieve game executable's memory address return false; } // Check if we can get meaningful data from it float apos[3], afront[3], atop[3], cpos[3], cfront[3], ctop[3]; std::wstring sidentity; std::string scontext; if (fetch(apos, afront, atop, cpos, cfront, ctop, scontext, sidentity)) { return true; } else { generic_unlock(); return false; } } static const std::wstring longdesc() { return std::wstring(L"Supports World of Warcraft (x64) with context and identity support."); // Plugin long description } static std::wstring description(L"World of Warcraft (x64) version 7.0.3.22810"); // Plugin short description static std::wstring shortname(L"World of Warcraft"); // Plugin short name static int trylock1() { return trylock(std::multimap()); } static MumblePlugin wowplug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 wowplug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &wowplug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &wowplug2; } mumble-1.3.4/plugins/wow_x64/wow_x64.pro0000664000175000017500000000051214010707273017674 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = wow_x64 SOURCES = wow_x64.cpp LIBS += -luser32 mumble-1.3.4/plugins/plugins.pro0000664000175000017500000000134114010707273016524 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../qmake/compiler.pri) TEMPLATE = subdirs CONFIG += debug_and_release SUBDIRS = link win32 { SUBDIRS += aoc arma2 bf1942 bf2 bf3 bf2142 bfbc2 bfheroes bf4_x86 blacklight borderlands borderlands2 breach cod2 cod4 cod5 codmw2 codmw2so cs css dods dys etqw ffxiv tf2 gmod gtaiv gw hl2dm insurgency jc2 l4d l4d2 lol lotro ql rl sr sto ut2004 ut3 ut99 wolfet wow equals(MUMBLE_ARCH, x86_64) { SUBDIRS += bf1 bf4 ffxiv_x64 gtav wow_x64 } } linux { SUBDIRS += l4d2 rl } mumble-1.3.4/plugins/ffxiv/0000775000175000017500000000000014010707273015444 5ustar builderbuildermumble-1.3.4/plugins/ffxiv/ffxiv.pro0000775000175000017500000000051514010707273017314 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = ffxiv SOURCES = ffxiv.cpp win32:LIBS += -luser32 mumble-1.3.4/plugins/ffxiv/ffxiv.cpp0000775000175000017500000002026714010707273017304 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "../mumble_plugin_win32.h" // Include standard plugin header. #include "../mumble_plugin_utils.h" // Include plugin header for special functions, like "escape". #include // Offset values can be obtained from: // http://xivapp.com/api/structures?patchVersion=latest&platform=x86 // http://xivapp.com/api/structures?patchVersion=latest&platform=x64 // Y is North/South, South is increasing values // X is East/West, West is increasing values // Heading is in radians, 0 faces south #ifdef FFXIV_USE_x64 // Memory offsets const procptr_t camera_ptr = 0x1673350; const procptr_t avatar_ptr = 0x1674950; const procptr_t state_offset = 0x1641990; const procptr_t map_id_offset = 0x16409E8; // Avatar struct offsets const procptr_t identity_offset = 48; // Name const procptr_t avatar_pos_offset = 176; // X, Z, Y const procptr_t avatar_azimuth_offset = 192; // Heading (-pi to pi) // Camera struct offsets const procptr_t camera_is_free_offset = 272; // 0: First person mode; 1: 3rd person const procptr_t camera_pos_offset = 80; // X, Z, Y const procptr_t camera_azimuth_offset = 304; // (-pi to pi) const procptr_t camera_elevation_offset = 308; // (-pi to pi) // Module names const wchar_t *exe_name = L"ffxiv_dx11.exe"; // Plugin long description static const std::wstring longdesc() {return std::wstring(L"Supports Final Fantasy XIV X64 version 2016.11.11.0000.0000 with context and identity support.");} // Plugin short description static std::wstring description(L"Final Fantasy XIV X64 (2016.11.11.0000.0000)"); #else // Memory offsets const procptr_t camera_ptr = 0x1045C40; const procptr_t avatar_ptr = 0x10468EC; const procptr_t state_offset = 0x1048C60; const procptr_t map_id_offset = 0x10210B0; // Avatar struct offsets const procptr_t identity_offset = 48; // Name const procptr_t avatar_pos_offset = 160; // X, Z, Y const procptr_t avatar_azimuth_offset = 176; // Heading (-pi to pi) // Camera struct offsets const procptr_t camera_is_free_offset = 256; // 0: First person mode; 1: 3rd person const procptr_t camera_pos_offset = 64; // X, Z, Y const procptr_t camera_azimuth_offset = 288; // (-pi to pi) const procptr_t camera_elevation_offset = 292; // (-pi to pi) // Module names const wchar_t *exe_name = L"ffxiv.exe"; // Plugin long description static const std::wstring longdesc() {return std::wstring(L"Supports Final Fantasy XIV version 2016.11.11.0000.0000 with context and identity support.");} // Plugin short description static std::wstring description(L"Final Fantasy XIV (2016.11.11.0000.0000)"); #endif // Plugin short name static std::wstring shortname(L"Final Fantasy XIV"); static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &context, std::wstring &identity) { for (int i=0;i<3;i++) { avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; } // Boolean value to check if game addresses retrieval is successful bool ok; // Create containers to stuff our raw data into, so we can convert it to Mumble's coordinate system float avatar_pos_corrector[3], camera_pos_corrector[3], avatar_azimuth, camera_azimuth, camera_elevation; // Values for extra features char player[64]; unsigned int map_id; // State unsigned char state, camera_is_free; // Retrieve Avatar and Camera addresses #ifdef FFXIV_USE_x64 procptr_t avatar_address = peekProcPtr(pModule + avatar_ptr); procptr_t camera_address = peekProcPtr(pModule + camera_ptr); #else procptr_t avatar_address = peekProcPtr(pModule + avatar_ptr); procptr_t camera_address = peekProcPtr(pModule + camera_ptr); #endif if (!avatar_address || !camera_address) return false; // Peekproc and assign game addresses to our containers, so we can retrieve positional data ok = peekProc(pModule + state_offset, &state, 1) && // Magical state value: 0 or 255 when in main menu and 1 when in-game. peekProc(camera_address + camera_pos_offset, &camera_pos_corrector, 12) && // Camera Position values (X, Z and Y). peekProc(camera_address + camera_azimuth_offset, &camera_azimuth, 4) && // Camera azimuth float. peekProc(camera_address + camera_elevation_offset, &camera_elevation, 4) && // Camera elevation float. peekProc(camera_address + camera_is_free_offset, &camera_is_free, 1) && // Camera is in first person mode peekProc(avatar_address + avatar_pos_offset, &avatar_pos_corrector, 12) && // Avatar Position values (X, Z and Y). peekProc(avatar_address + avatar_azimuth_offset, &avatar_azimuth, 4) && // Avatar azimuth float. peekProc(pModule + map_id_offset, &map_id, 4) && // Map id. peekProc(avatar_address + identity_offset, player); // Player name. // This prevents the plugin from linking to the game in case something goes wrong during values retrieval from memory addresses. if (! ok) return false; // State if (state != 1) { // If not in-game context.clear(); // Clear context identity.clear(); // Clear identity // Set vectors values to 0. for (int i=0;i<3;i++) { avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; } return true; // This tells Mumble to ignore all vectors. } // Begin context std::ostringstream ocontext; ocontext << "{"; // Map id ocontext << "Map: " << map_id << ""; // Set map id in identity. ocontext << "}"; context = ocontext.str(); // End context // Begin identity std::wostringstream oidentity; oidentity << "{"; // Map id oidentity << "Map: " << map_id << ", "; // Set map id in identity. // Player name escape(player, sizeof(player)); if (strcmp(player, "") != 0) { oidentity << "Player: \"" << player << "\""; // Set player name in identity. } else { oidentity << "Player: null"; } oidentity << "}"; identity = oidentity.str(); // End identity /* Mumble | Game (in L hand coordinate system) X | -X Y | Y Z | Z */ avatar_pos[0] = -avatar_pos_corrector[0]; avatar_pos[1] = avatar_pos_corrector[1]; avatar_pos[2] = avatar_pos_corrector[2]; camera_pos[0] = -camera_pos_corrector[0]; camera_pos[1] = camera_pos_corrector[1]; camera_pos[2] = camera_pos_corrector[2]; avatar_front[0] = static_cast(std::sin(-avatar_azimuth)); avatar_front[1] = 0.0f; avatar_front[2] = static_cast(std::cos(-avatar_azimuth)); camera_front[0] = static_cast(std::cos(camera_elevation) * std::sin(-camera_azimuth)); camera_front[1] = static_cast(std::sin(camera_elevation)); camera_front[2] = static_cast(std::cos(camera_elevation) * std::cos(-camera_azimuth)); if (camera_is_free) { camera_front[0] *= -1; camera_front[2] *= -1; } // Convert from yards (yalms) to meters for (int i=0;i<3;i++) { avatar_pos[i]*=0.9144f; camera_pos[i]*=0.9144f; } return true; } static int trylock(const std::multimap &pids) { if (! initialize(pids, exe_name)) { // Retrieve "exe_name" module's memory address return false; } // Check if we can get meaningful data from it float apos[3], afront[3], atop[3], cpos[3], cfront[3], ctop[3]; std::wstring sidentity; std::string scontext; if (fetch(apos, afront, atop, cpos, cfront, ctop, scontext, sidentity)) { return true; } else { generic_unlock(); return false; } } static int trylock1() { return trylock(std::multimap()); } static MumblePlugin ffxivplug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 ffxivplug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &ffxivplug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &ffxivplug2; } mumble-1.3.4/plugins/sto/0000775000175000017500000000000014010707273015127 5ustar builderbuildermumble-1.3.4/plugins/sto/sto.pro0000664000175000017500000000065114010707273016460 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) DEFINES += "NULL_DESC=\"L\\\"Star Trek Online (Retracted due to lack of maintenance)\\\"\"" TARGET = sto SOURCES = ../null_plugin.cpp LIBS += -luser32 mumble-1.3.4/plugins/gtaiv/0000775000175000017500000000000014010707273015434 5ustar builderbuildermumble-1.3.4/plugins/gtaiv/gtaiv.cpp0000664000175000017500000001313114010707273017251 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . /* Copyright (C) 2011, Mike Copyright (C) 2005-2012, Thorvald Natvig All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Mumble Developers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "../mumble_plugin_win32.h" static unsigned int playerid; static procptr_t base_address; static procptr_t cvecptr; static procptr_t displayptr; static int setuppointers() { procptr_t playerptr, charptr; // Player stuff if (!peekProc(base_address + 0xF1CC68, playerid)) return false; if (!peekProc(base_address + 0x11A7008 + (playerid * 4), &playerptr, 4) || !playerptr) return false; if (!peekProc(playerptr + 0x58C, &charptr, 4) || !charptr) return false; if (!peekProc(charptr + 0x20, &cvecptr, 4) || !cvecptr) return false; return true; } static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &, std::wstring &) { unsigned int playerid_check; if (!peekProc(base_address + 0xF1CC68, playerid_check)) return false; if (playerid_check != playerid) { if (!setuppointers()) return false; } for (int i=0;i<3;i++) avatar_pos[i]=avatar_front[i]=avatar_top[i]=0.0f; bool ok; float pos_corrector[3]; float front_corrector[3]; float top_corrector[3]; float campos_corrector[3]; float camfront_corrector[3]; float camtop_corrector[3]; // Peekproc and assign game addresses to our containers, so we can retrieve positional data ok = peekProc(cvecptr + 0x30, &pos_corrector, 12) && peekProc(cvecptr + 0x20, &top_corrector, 12) && peekProc(cvecptr + 0x10, &front_corrector, 12) && peekProc(displayptr + 0x30, &campos_corrector, 12) && peekProc(displayptr + 0x10, &camtop_corrector, 12) && peekProc(displayptr + 0x20, &camfront_corrector, 12); if (!ok) return false; // Convert to left-handed coordinate system avatar_pos[0] = pos_corrector[0]; avatar_pos[1] = pos_corrector[2]; avatar_pos[2] = pos_corrector[1]; avatar_front[0] = front_corrector[0]; avatar_front[1] = front_corrector[2]; avatar_front[2] = front_corrector[1]; avatar_top[0] = top_corrector[0]; avatar_top[1] = top_corrector[2]; avatar_top[2] = top_corrector[1]; camera_pos[0] = campos_corrector[0]; camera_pos[1] = campos_corrector[2]; camera_pos[2] = campos_corrector[1]; camera_front[0] = -camfront_corrector[0]; camera_front[1] = -camfront_corrector[2]; camera_front[2] = -camfront_corrector[1]; camera_top[0] = camtop_corrector[0]; camera_top[1] = camtop_corrector[2]; camera_top[2] = camtop_corrector[1]; return true; } static int trylock(const std::multimap &pids) { if (!initialize(pids, L"GTAIV.exe")) return false; // Check if we can get meaningful data from it float apos[3], afront[3], atop[3]; float cpos[3], cfront[3], ctop[3]; std::wstring sidentity; std::string scontext; procptr_t viewportptr; base_address = pModule - 0x400000; if (!peekProc(base_address + 0x10F47F0, &viewportptr, 4) || !viewportptr) return false; displayptr = viewportptr + 0x50; if (setuppointers() && fetch(apos, afront, atop, cpos, cfront, ctop, scontext, sidentity)) { return true; } else { generic_unlock(); return false; } } static const std::wstring longdesc() { return std::wstring(L"Supports Grand Theft Auto IV (v1.0.7.0). No identity support."); } static std::wstring description(L"Grand Theft Auto IV v1.0.7.0"); static std::wstring shortname(L"GTA IV"); static int trylock1() { return trylock(std::multimap()); } static MumblePlugin gtaivplug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 gtaivplug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return >aivplug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return >aivplug2; } mumble-1.3.4/plugins/gtaiv/gtaiv.pro0000664000175000017500000000050614010707273017271 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = gtaiv SOURCES = gtaiv.cpp LIBS += -luser32 mumble-1.3.4/plugins/rl/0000775000175000017500000000000014010707273014737 5ustar builderbuildermumble-1.3.4/plugins/rl/rl.pro0000664000175000017500000000050714010707273016100 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = rl SOURCES = rl.cpp win32:LIBS += -luser32 mumble-1.3.4/plugins/rl/rl.cpp0000664000175000017500000001122214010707273016056 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifdef WIN32 #include "../mumble_plugin_win32.h" #else #include "../mumble_plugin_linux.h" #endif #ifdef WIN32 // Memory offsets const procptr_t camera_pos_offset = 0x1A2A338; const procptr_t camera_front_offset = 0x1A2A320; const procptr_t camera_top_offset = 0x1A2A32C; const procptr_t avatar_offset_base = 0x18E1448; const procptr_t avatar_offset_0 = 0x40; const procptr_t avatar_offset_1 = 0x6B4; const procptr_t avatar_offset_2 = 0x18; const procptr_t avatar_offset_3 = 0x1C; const procptr_t avatar_pos_offset = 0x18; const procptr_t avatar_front_offset = 0x0; const procptr_t avatar_top_offset = 0xC; // Executable name const wchar_t *exe_name = L"RocketLeague.exe"; #else // Memory offsets const procptr_t camera_pos_offset = 0x30DE018; const procptr_t camera_front_offset = 0x30DE000; const procptr_t camera_top_offset = 0x30DE00C; const procptr_t avatar_offset_base = 0x30DD6A0; const procptr_t avatar_offset_0 = 0x408; const procptr_t avatar_offset_1 = 0x648; const procptr_t avatar_offset_2 = 0x40; const procptr_t avatar_offset_3 = 0x80; const procptr_t avatar_pos_offset = 0x24; const procptr_t avatar_front_offset = 0xC; const procptr_t avatar_top_offset = 0x18; // Executable name const wchar_t *exe_name = L"RocketLeague"; #endif static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &, std::wstring &) { for (int i=0;i<3;i++) avatar_pos[i]=avatar_front[i]=avatar_top[i]=camera_pos[i]=camera_front[i]=camera_top[i]=0.0f; // Boolean value to check if game addresses retrieval is successful bool ok; // Avatar pointers procptr_t avatar_ptr_base = peekProcPtr(pModule + avatar_offset_base); if (!avatar_ptr_base) return false; procptr_t avatar_ptr_0 = peekProcPtr(avatar_ptr_base + avatar_offset_0); if (!avatar_ptr_0) return false; procptr_t avatar_ptr_1 = peekProcPtr(avatar_ptr_0 + avatar_offset_1); if (!avatar_ptr_1) return false; procptr_t avatar_ptr_2 = peekProcPtr(avatar_ptr_1 + avatar_offset_2); if (!avatar_ptr_2) return false; procptr_t avatar_ptr_3 = peekProcPtr(avatar_ptr_2 + avatar_offset_3); if (!avatar_ptr_3) return false; // Peekproc and assign game addresses to our containers, so we can retrieve positional data ok = peekProc(avatar_ptr_3 + avatar_pos_offset, avatar_pos, 12) && // Avatar Position values (X, Y and Z). peekProc(pModule + camera_pos_offset, camera_pos, 12) && // Camera Position values (X, Y and Z). peekProc(avatar_ptr_3 + avatar_front_offset, avatar_front, 12) && // Avatar Front values (X, Y and Z). peekProc(avatar_ptr_3 + avatar_top_offset, avatar_top, 12) && // Avatar Top values (X, Y and Z). peekProc(pModule + camera_front_offset, camera_front, 12) && // Camera Front Vector values (X, Y and Z). peekProc(pModule + camera_top_offset, camera_top, 12); // Camera Top Vector values (X, Y and Z). // This prevents the plugin from linking to the game in case something goes wrong during values retrieval from memory addresses. if (! ok) return false; // Scale from centimeters to meters for (int i=0;i<3;i++) { avatar_pos[i]/=100.0f; camera_pos[i]/=100.0f; } return true; } static int trylock(const std::multimap &pids) { if (! initialize(pids, exe_name)) // Link the game executable return false; // Check if we can get meaningful data from it float apos[3], afront[3], atop[3], cpos[3], cfront[3], ctop[3]; std::wstring sidentity; std::string scontext; if (fetch(apos, afront, atop, cpos, cfront, ctop, scontext, sidentity)) { return true; } else { generic_unlock(); return false; } } static const std::wstring longdesc() { return std::wstring(L"Supports Rocket League version 1.42 without context or identity support yet."); // Plugin long description } static std::wstring description(L"Rocket League (v1.42)"); // Plugin short description static std::wstring shortname(L"Rocket League"); // Plugin short name static int trylock1() { return trylock(std::multimap()); } static MumblePlugin rlplug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 rlplug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &rlplug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &rlplug2; } mumble-1.3.4/plugins/cod2/0000775000175000017500000000000014010707273015151 5ustar builderbuildermumble-1.3.4/plugins/cod2/cod2.pro0000664000175000017500000000050414010707273016521 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = cod2 SOURCES = cod2.cpp LIBS += -luser32 mumble-1.3.4/plugins/cod2/cod2.cpp0000664000175000017500000000724214010707273016511 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "../mumble_plugin_win32.h" static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &, std::wstring &) { float viewHor, viewVer; char state; for (int i=0;i<3;i++) avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; bool ok; /* This plugin uses the following Variables: Address Type Description =================================== 0x01516608 float Z-Coordinate (=0 out-of-game) 0x0151660C float X-Coordinate (=0 out-of-game) 0x01516610 float Y-Coordinate (=0 out-of-game) 0x0151A114 float Horizontal view (degrees) (=0 out-of-game) 0x0151A110 float Vertical view (degrees) (=0 out-of-game) 0x0096B688 byte Magic value (0=ingame/out-of-game, 4=spectator) */ ok = peekProc(0x0096B688, &state, 1); if (! ok) return false; if (state == 4) return true; // If this magic value is 4 we are spectating, so switch of PA ok = peekProc(0x01516608, avatar_pos+2, 4) && //Z peekProc(0x0151660C, avatar_pos, 4) && //X peekProc(0x01516610, avatar_pos+1, 4) && //Y peekProc(0x0151A114, &viewHor, 4) && //Hor peekProc(0x0151A110, &viewVer, 4); //Ver if (! ok) return false; // Scale Coordinates /* Z-Value is increasing when heading north decreasing when heading south X-Value is increasing when heading west decreasing when heading east Y-Value is increasing when going up decreasing when going down 40 units = 1 meter (not confirmed) */ for (int i=0;i<3;i++) avatar_pos[i]/=40.0f; // Scale to meters avatar_pos[0]*=(-1.0f); // Convert right to left handed avatar_top[2] = -1; // Head movement is in front vector // Calculate view unit vector /* Vertical view 0 when centered 85 when looking down 275 when looking up Decreasing when looking up. Horizontal is 0 when facing North 90 when facing West 180 when facing South 270 when facing East Increasing when turning left. */ viewVer *= static_cast(M_PI / 180.0f); viewHor *= static_cast(M_PI / 180.0f); avatar_front[0] = -sin(viewHor) * cos(viewVer); avatar_front[1] = -sin(viewVer); avatar_front[2] = cos(viewHor) * cos(viewVer); return true; } static int trylock(const std::multimap &pids) { if (! initialize(pids, L"CoD2MP_s.exe")) return false; float apos[3], afront[3], atop[3], cpos[3], cfront[3], ctop[3]; std::string context; std::wstring identity; if (fetch(apos, afront, atop, cpos, cfront, ctop, context, identity)) { return true; } else { generic_unlock(); return false; } } static const std::wstring longdesc() { return std::wstring(L"Supports Call of Duty 2 v1.3. No context or identity support yet."); } static std::wstring description(L"Call of Duty 2 v1.3"); static std::wstring shortname(L"Call of Duty 2"); static int trylock1() { return trylock(std::multimap()); } static MumblePlugin cod2plug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 cod2plug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &cod2plug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &cod2plug2; } mumble-1.3.4/plugins/blacklight/0000775000175000017500000000000014010707273016426 5ustar builderbuildermumble-1.3.4/plugins/blacklight/blacklight.cpp0000664000175000017500000001452414010707273021244 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . /* Copyright (C) 2012, dark_skeleton (d-rez) Copyright (C) 2005-2012, Thorvald Natvig All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Mumble Developers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "../mumble_plugin_win32.h" /* Arrays of bytes to find addresses accessed by respective functions so we don't have to blindly search for addresses after every update Remember to disable scanning only the writable memory in CE! We're searching for functions here, not values! This is not the final version and it doesn't distinguish camera and avatar positions. No identity support yet. Camera front vector function: 89 16 8B 54 24 20 89 46 04 8B 44 24 24 Host IP:PORT changes to 'bot' when not ingame Valid addresses from v0.9.8.0 Camera front vector address: 0x141bc20 Camera top vector address: +0xC (offset, not pointer) Camera position vector address: +0x18 (offset, not pointer) Host IP:PORT address: pbcl.dll + 0xB8C57 TODO: Find Avatar position, front, top vectors, protect against version change (find a random pointer to check), distinguish spectator and normal mode */ static procptr_t camfrontptr = 0x141bc20; static procptr_t camtopptr = camfrontptr + 0xC; static procptr_t camptr = camfrontptr + 0x18; static procptr_t hostipportptr; static char prev_hostipport[22]; static char state = 0; // 1 if connected to a server, 0 if not static bool calcout(float *cam, float *camfront, float *camtop, float *ocam, float *ocamfront, float *ocamtop) { // Seems Blacklight is in centimeters? ;o Well it's not inches for sure :) for (int i = 0; i < 3; i++) { ocam[i] = cam[i] / 100.00f; ocamfront[i] = camfront[i]; ocamtop[i] = camtop[i]; } return true; } static bool refreshPointers(void) { hostipportptr = 0; hostipportptr = pModule + 0xB8C57; return true; } static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &context, std::wstring &/*identity*/) { for (int i = 0; i < 3; i++) avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; float cam[3], camtop[3], camfront[3]; bool ok; char hostipport[sizeof(prev_hostipport)]; ok = peekProc(camfrontptr, camfront, 12) && peekProc(camtopptr, camtop, 12) && peekProc(hostipportptr, hostipport) && peekProc(camptr, cam); if (!ok) return false; hostipport[sizeof(hostipport) - 1] = '\0'; if (strcmp(hostipport, prev_hostipport) != 0) { context.clear(); state = 0; strcpy_s(prev_hostipport, sizeof(prev_hostipport), hostipport); if (strcmp(hostipport, "") != 0 && strcmp(hostipport, "bot") != 0) { char buffer[50]; sprintf_s(buffer, sizeof(buffer), "{\"ipport\": \"%s\"}", hostipport); context.assign(buffer); state = 1; } } if (!state) // report positional data only when on a server! return true; calcout(cam, camfront, camtop, camera_pos, camera_front, camera_top); //calculate proper position values for (int i=0;i<3;i++) { avatar_front[i] = camera_front[i]; avatar_pos[i] = camera_pos[i]; avatar_top[i] = camera_top[i]; // copy values since we don't know avatar's vectors } return true; } static int trylock(const std::multimap &pids) { if (! initialize(pids, L"BLR.exe", L"pbcl.dll")) return false; if (refreshPointers()) { // unlink plugin if this fails *prev_hostipport = '\0'; float avatar_pos[3], avatar_front[3], avatar_top[3]; float camera_pos[3], camera_front[3], camera_top[3]; std::string context; std::wstring identity; if (fetch(avatar_pos, avatar_front, avatar_top, camera_pos, camera_front, camera_top, context, identity)) { *prev_hostipport = '\0'; // we need to do this again since fetch() above overwrites this (which results in empty context until next change) return true; } } generic_unlock(); return false; } static const std::wstring longdesc() { return std::wstring(L"Supports Blacklight: Retribution v0.9.8.0. No identity or avatar vectors support yet."); } static std::wstring description(L"Blacklight: Retribution (v0.9.8.0)"); static std::wstring shortname(L"Blacklight: Retribution"); static int trylock1() { return trylock(std::multimap()); } static MumblePlugin blacklightplug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 blacklightplug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &blacklightplug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &blacklightplug2; } mumble-1.3.4/plugins/blacklight/blacklight.pro0000664000175000017500000000052014010707273021251 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = blacklight SOURCES = blacklight.cpp LIBS += -luser32 mumble-1.3.4/plugins/plugins.pri0000664000175000017500000000101414010707273016513 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../qmake/compiler.pri) TEMPLATE = lib CONFIG += plugin debug_and_release warn_on CONFIG -= qt DIST *= mumble_plugin.h CONFIG(static) { CONFIG -= static CONFIG += shared CONFIG += qt_dynamic_lookup } DESTDIR = $$DESTDIR/plugins include(../qmake/symbols.pri) mumble-1.3.4/plugins/mumble_plugin_linux.h0000664000175000017500000001266514010707273020563 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_PLUGIN_LINUX_H_ #define MUMBLE_PLUGIN_LINUX_H_ #include #include #include #include #include #include #include #include #include #include "mumble_plugin.h" pid_t pPid; int is64Bit; static procptr_t pModule; static inline std::string readAll(std::string fn) { std::ifstream ifs; ifs.open(fn.c_str(), std::ifstream::binary); std::string content; char buf[256]; while (ifs.good()) { ifs.read(&buf[0], sizeof(buf)); size_t nread = ifs.gcount(); if (nread > 0) { content.append(&buf[0], nread); } } return content; } // This function returns 0 if the process is 32-bit and 1 if it's 64-bit. // In case of failure, it returns -1. static inline int checkProcessIs64Bit(const pid_t pid) { // We can know the process architecture by looking at its ELF header. char elf[5]; std::stringstream ss; ss << "/proc/"; ss << static_cast(pid); ss << "/exe"; std::ifstream ifs; ifs.open(ss.str(), std::ifstream::binary); if (!ifs.is_open()) { return -1; } ifs.read(elf, LENGTH_OF(elf)); ifs.close(); if (ifs.gcount() != LENGTH_OF(elf)) { return -1; } // The first 4 bytes constitute the magical number in ASCII: 0x7F 45 4c 46. if (!(elf[0] == 0x7f && elf[1] == 'E' && elf[2] == 'L' && elf[3] == 'F')) { return -1; } // The fifth byte is 1 in case the process is 32-bit or 2 in case it's 64-bit. return elf[4] != 1; } static inline procptr_t getModuleAddr(pid_t pid, const wchar_t *modname) { std::wstring modnameWide(modname); std::string modnameNonWide(modnameWide.begin(), modnameWide.end()); std::stringstream ss; ss << std::string("/proc/"); ss << static_cast(pid); ss << std::string("/maps"); std::string mapsFn = ss.str(); std::string maps = readAll(mapsFn); if (maps.size() == 0) { return 0; } std::stringstream ssPath(maps); while (ssPath.good()) { std::string baseaddr; int ch; while (1) { ch = ssPath.get(); if (ch == '-') { break; } else if (ch == EOF) { return 0; } baseaddr.push_back(static_cast(ch)); } // seek to perms do { ch = ssPath.get(); if (ch == EOF) { return 0; } } while (ch != ' '); // seek to offset do { ch = ssPath.get(); if (ch == EOF) { return 0; } } while (ch != ' '); // seek to dev do { ch = ssPath.get(); if (ch == EOF) { return 0; } } while (ch != ' '); // seek to inode do { ch = ssPath.get(); if (ch == EOF) { return 0; } } while (ch != ' '); // seek to pathname do { ch = ssPath.get(); if (ch == EOF) { return 0; } } while (ch != ' '); // eat spaces until we're at the beginning of pathname. while (ch == ' ') { if (ch == EOF) { return 0; } ch = ssPath.get(); } ssPath.unget(); std::string pathname; while (1) { ch = ssPath.get(); if (ch == '\n') { break; } else if (ch == EOF) { return 0; } pathname.push_back(static_cast(ch)); }; // OK, we found 'em! // Only treat path as a real path if it starts with /. if (pathname.size() > 0 && pathname.at(0) == '/') { // Find the basename. size_t lastSlash = pathname.find_last_of('/'); if (pathname.size() > lastSlash + 1) { std::string basename = pathname.substr(lastSlash + 1); if (basename == modnameNonWide) { unsigned long addr = strtoul(baseaddr.c_str(), NULL, 16); return addr; } } } } return 0; } static inline procptr_t getModuleAddr(const wchar_t *modname) { return getModuleAddr(pPid, modname); } static inline bool peekProc(procptr_t base, void *dest, size_t len) { struct iovec in; in.iov_base = reinterpret_cast(base); // Address from target process in.iov_len = len; // Length struct iovec out; out.iov_base = dest; out.iov_len = len; ssize_t nread = process_vm_readv(pPid, &out, 1, &in, 1, 0); return (nread != -1 && static_cast(nread) == in.iov_len); } template bool peekProc(procptr_t base, T &dest) { struct iovec in; in.iov_base = reinterpret_cast(base); // Address from target process in.iov_len = sizeof(T); // Length struct iovec out; out.iov_base = &dest; out.iov_len = sizeof(T); ssize_t nread = process_vm_readv(pPid, &out, 1, &in, 1, 0); return (nread != -1 && static_cast(nread) == in.iov_len); } static inline procptr_t peekProcPtr(procptr_t base) { procptr_t v = 0; if (!peekProc(base, &v, is64Bit ? 8 : 4)) { return 0; } return v; } static bool inline initialize(const std::multimap &pids, const wchar_t *procname, const wchar_t *modname = NULL) { pModule = 0; if (! pids.empty()) { std::multimap::const_iterator iter = pids.find(std::wstring(procname)); if (iter != pids.end()) pPid = static_cast(iter->second); else pPid = 0; } else { pPid = 0; } if (pPid == 0) return false; int result = checkProcessIs64Bit(pPid); if (result == -1) { return false; } is64Bit = result; pModule = getModuleAddr(modname ? modname : procname); if (pModule == 0) { pPid = 0; return false; } return true; } static void generic_unlock() { pModule = 0; pPid = 0; } #endif mumble-1.3.4/plugins/dys/0000775000175000017500000000000014010707273015121 5ustar builderbuildermumble-1.3.4/plugins/dys/dys.pro0000664000175000017500000000050214010707273016437 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = dys SOURCES = dys.cpp LIBS += -luser32 mumble-1.3.4/plugins/dys/dys.cpp0000664000175000017500000001051014010707273016421 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "../mumble_plugin_win32.h" using namespace std; procptr_t posptr, rotptr, stateptr, hostptr; static bool calcout(float *pos, float *rot, float *opos, float *front, float *top) { float h = rot[0]; float v = rot[1]; if ((v < -360.0f) || (v > 360.0f) || (h < -360.0f) || (h > 360.0f)) return false; h *= static_cast(M_PI / 180.0f); v *= static_cast(M_PI / 180.0f); // Seems Dystopia is in inches. INCHES?!? opos[0] = pos[0] / 39.37f; opos[1] = pos[2] / 39.37f; opos[2] = pos[1] / 39.37f; front[0] = cos(v) * cos(h); front[1] = -sin(h); front[2] = sin(v) * cos(h); h -= static_cast(M_PI / 2.0f); top[0] = cos(v) * cos(h); top[1] = -sin(h); top[2] = sin(v) * cos(h); return true; } static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, string &context, wstring &) { for (int i=0;i<3;i++) avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; float ipos[3], rot[3]; bool ok; char state; char chHostStr[40]; string sHost; wostringstream new_identity; ostringstream new_context; ok = peekProc(posptr, ipos, 12) && peekProc(rotptr, rot, 12) && peekProc(stateptr, &state, 1) && peekProc(hostptr, chHostStr, 40); if (!ok) return false; chHostStr[39] = 0; sHost.assign(chHostStr); if (sHost.find(':')==string::npos) sHost.append(":27015"); new_context << "" << "dys" << "" << sHost << "" << ""; context = new_context.str(); /* TODO new_identity << "" << "" << "SAS" << "" << ""; identity = new_identity.str(); */ // Check to see if you are spawned if (state == 0 || state == 2) return true; // Deactivate plugin ok = calcout(ipos, rot, avatar_pos, avatar_front, avatar_top); if (ok) { for (int i=0;i<3;++i) { camera_pos[i] = avatar_pos[i]; camera_front[i] = avatar_front[i]; camera_top[i] = avatar_top[i]; } return true; } return false; } static int trylock(const std::multimap &pids) { posptr = rotptr = 0; if (! initialize(pids, L"hl2.exe", L"client.dll")) return false; procptr_t mod_engine=getModuleAddr(L"engine.dll"); if (!mod_engine) return false; // Check if we really have Dystopia running /* position tuple: client.dll+0x423990 (x,y,z, float) orientation tuple: client.dll+0x423924 (v,h float) ID string: client.dll+0x3c948e = "DysObjective@@" (14 characters, text) spawn state: client.dll+0x3c6270 (0 when at main menu, 2 when not spawned, 6 when spawned, byte) host string: engine.dll+0x3909c4 (ip:port zero-terminated string) */ // Remember addresses for later posptr = pModule + 0x4A3330; rotptr = pModule + 0x454E04; stateptr = pModule + 0x4518A0; hostptr = mod_engine + 0x3C2A84; //Gamecheck char sMagic[14]; if (!peekProc(pModule + 0x463726, sMagic, 14) || strncmp("DysObjective@@", sMagic, 14)!=0) return false; // Check if we can get meaningful data from it float apos[3], afront[3], atop[3]; float cpos[3], cfront[3], ctop[3]; wstring sidentity; string scontext; if (fetch(apos, afront, atop, cpos, cfront, ctop, scontext, sidentity)) { return true; } else { generic_unlock(); return false; } } static const std::wstring longdesc() { return std::wstring(L"Supports Dystopia build 4104. No identity support yet."); } static std::wstring description(L"Dystopia (Build 4104)"); static std::wstring shortname(L"Dystopia"); static int trylock1() { return trylock(std::multimap()); } static MumblePlugin dysplug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 dysplug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &dysplug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &dysplug2; } mumble-1.3.4/plugins/etqw/0000775000175000017500000000000014010707273015302 5ustar builderbuildermumble-1.3.4/plugins/etqw/etqw.cpp0000664000175000017500000000776614010707273017006 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "../mumble_plugin_win32.h" using namespace std; procptr_t pos1ptr, pos2ptr, pos3ptr, rot1ptr, rot2ptr; static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &context, std::wstring &) { char menustate; char ccontext[128]; float viewHor, viewVer; for (int i=0;i<3;i++) avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; bool ok; /* This plugin uses the following Variables: Address Type Description =================================== 0x013F79CC float Y-Coordinate 0x013E8CF4 float X-Coordinate 0x013E8CF8 float Z-Coordinate 0x013F9E20 float Horizontal view 0x013F9E1C float Vertical view 0x013E8D18 byte Magic value (32 ingame / 0 spectating) */ ok = peekProc(0x00801BA4, &menustate, 1); if (! ok) return false; if (menustate == 0) return true; ok = peekProc(pos1ptr, avatar_pos+1, 4) && //Y peekProc(pos2ptr, avatar_pos, 4) && //X peekProc(pos3ptr, avatar_pos+2, 4) && //Z peekProc(rot1ptr, &viewHor, 4) && //Hor peekProc(rot2ptr, &viewVer, 4) && //Ver peekProc(0x0122E0B8, ccontext, 128); if (! ok) return false; avatar_top[2] = -1; // Head movement is in front vector ccontext[127] = 0; context = std::string(ccontext); if (context.find(':')==string::npos) context.append(":27733"); /* Z-Value is increasing when heading north decreasing when heading south X-Value is increasing when heading east decreasing when heading west Y-Value is increasing when going up decreasing when going down 1 unit = 1 meter (not confirmed) */ // Calculate view unit vector /* Vertical view 0 when centered ~+271 when looking up ~+88 when looking down Increasing when looking down. Horizontal is +90 when facing north 0 when facing east +270 when facing south +180 when facing west Increasing when turning left. */ viewVer *= static_cast(M_PI / 180.0f); viewHor *= static_cast(M_PI / 180.0f); avatar_front[0] = -sin(viewHor) * cos(viewVer); avatar_front[1] = -sin(viewVer); avatar_front[2] = cos(viewHor) * cos(viewVer); for (int i=0;i<3;i++) { camera_pos[i] = avatar_pos[i]; camera_front[i] = avatar_front[i]; camera_top[i] = avatar_top[i]; } return true; } static int trylock(const std::multimap &pids) { pos1ptr = pos2ptr = pos3ptr = rot1ptr = rot2ptr = 0; if (! initialize(pids, L"etqw.exe", L"gamex86.dll")) return false; pos1ptr = pModule + 0x74EABC; pos2ptr = pModule + 0x74EAB4; pos3ptr = pModule + 0x74EAB8; rot1ptr = pModule + 0x75D2B4; rot2ptr = pModule + 0x75D30C; float apos[3], afront[3], atop[3], cpos[3], cfront[3], ctop[3]; std::string context; std::wstring identity; if (fetch(apos, afront, atop, cpos, cfront, ctop, context, identity)) { return true; } else { generic_unlock(); return false; } } static const std::wstring longdesc() { return std::wstring(L"Supports Enemy Territory: Quake Wars v1.50. No identity support yet."); } static std::wstring description(L"Enemy Territory: Quake Wars v1.50"); static std::wstring shortname(L"Enemy Territory: Quake Wars"); static int trylock1() { return trylock(std::multimap()); } static MumblePlugin etqwplug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 etqwplug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &etqwplug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &etqwplug2; } mumble-1.3.4/plugins/etqw/etqw.pro0000664000175000017500000000050414010707273017003 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = etqw SOURCES = etqw.cpp LIBS += -luser32 mumble-1.3.4/plugins/l4d2/0000775000175000017500000000000014010707273015067 5ustar builderbuildermumble-1.3.4/plugins/l4d2/l4d2.cpp0000664000175000017500000002253314010707273016345 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifdef WIN32 #include "../mumble_plugin_win32.h" // Include standard plugin header. #else #include "../mumble_plugin_linux.h" // Include standard plugin header. #endif #include "../mumble_plugin_utils.h" // Include plugin header for special functions, like "escape". // Variables to contain modules addresses procptr_t steamclient = 0; procptr_t server = 0; procptr_t engine = 0; #ifdef WIN32 // Memory offsets const procptr_t state_offset = 0x6ACBD5; const procptr_t avatar_pos_offset = 0x6B9E1C; const procptr_t camera_pos_offset = 0x774B98; const procptr_t avatar_front_offset = 0x774BF8; const procptr_t avatar_top_offset = 0x774C28; const procptr_t host_offset = 0x772B24; const procptr_t servername_offset = 0x772D2C; const procptr_t map_offset = 0x772C28; const procptr_t serverid_steamclient_offset = 0x95E56D; const procptr_t player_server_offset = 0x7F87BC; const procptr_t playerid_engine_offset = 0x4EBF88; // Module names const wchar_t *exe_name = L"left4dead2.exe"; const wchar_t *client_name = L"client.dll"; const wchar_t *steamclient_name = L"steamclient.dll"; const wchar_t *server_name = L"server.dll"; const wchar_t *engine_name = L"engine.dll"; #else // Memory offsets const procptr_t state_offset = 0xE0A24C; const procptr_t avatar_pos_offset = 0xE773FC; const procptr_t camera_pos_offset = 0xED8700; const procptr_t avatar_front_offset = 0xE3C138; const procptr_t avatar_top_offset = 0xE3C150; const procptr_t host_offset = 0xE356D0; const procptr_t servername_offset = 0xE358D8; const procptr_t map_offset = 0xE09E9D; const procptr_t serverid_steamclient_offset = 0x1216CA5; const procptr_t player_server_offset = 0xF340E4; const procptr_t playerid_engine_offset = 0xA62C60; // Module names const wchar_t *exe_name = L"hl2_linux"; const wchar_t *client_name = L"client.so"; const wchar_t *steamclient_name = L"steamclient.so"; const wchar_t *server_name = L"server.so"; const wchar_t *engine_name = L"engine.so"; #endif static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &context, std::wstring &identity) { for (int i=0;i<3;i++) { avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; } // Boolean value to check if game addresses retrieval is successful bool ok; // Create containers to stuff our raw data into, so we can convert it to Mumble's coordinate system float avatar_pos_corrector[3], camera_pos_corrector[3], avatar_front_corrector[3], avatar_top_corrector[3]; // Char values for extra features char serverid[22], host[22], servername[50], map[30], player[33], playerid[22]; // State unsigned char state; // Peekproc and assign game addresses to our containers, so we can retrieve positional data ok = peekProc(pModule + state_offset, &state, 1) && // Magical state value: 0 or 255 when in main menu and 1 when in-game. peekProc(pModule + avatar_pos_offset, avatar_pos_corrector, 12) && // Avatar Position values (X, Z and Y). peekProc(pModule + camera_pos_offset, camera_pos_corrector, 12) && // Camera Position values (X, Z and Y). peekProc(pModule + avatar_front_offset, avatar_front_corrector, 12) && // Front vector values (X, Z and Y). peekProc(pModule + avatar_top_offset, avatar_top_corrector, 12) && // Top vector values (Z, X and Y). peekProc(steamclient + serverid_steamclient_offset, serverid) && // Unique server Steam ID. peekProc(pModule + host_offset, host) && // Server value: "IP:Port" (xxx.xxx.xxx.xxx:yyyyy) when in a remote server, "loopback:0" when on a local server and empty when not playing. peekProc(pModule + servername_offset, servername) && // Server name. peekProc(pModule + map_offset, map) && // Map name. peekProc(server + player_server_offset, player) && // Player nickname. peekProc(engine + playerid_engine_offset, playerid); // Unique player Steam ID. // This prevents the plugin from linking to the game in case something goes wrong during values retrieval from memory addresses. if (! ok) return false; // State if (state != 1) { // If not in-game context.clear(); // Clear context identity.clear(); // Clear identity // Set vectors values to 0. for (int i=0;i<3;i++) { avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; } return true; // This tells Mumble to ignore all vectors. } // Begin context escape(serverid, sizeof(serverid)); std::ostringstream ocontext; if (strcmp(serverid, "") != 0) { ocontext << " {\"Server ID\": \"" << serverid << "\"}"; // Set context with IP address and port } context = ocontext.str(); // End context // Begin identity std::wostringstream oidentity; oidentity << "{"; // Host escape(host, sizeof(host)); if (strcmp(host, "") != 0 && strstr(host, "loopback") == NULL) { // Only include host (IP:Port) if it is not empty and does not include the string "loopback" (which means it's a local server). oidentity << std::endl << "\"Host\": \"" << host << "\","; // Set host address in identity. } else { oidentity << std::endl << "\"Host\": null,"; } // Server name escape(servername, sizeof(servername)); if (strcmp(servername, "") != 0) { oidentity << std::endl << "\"Server name\": \"" << servername << "\","; // Set server name in identity. } else { oidentity << std::endl << "\"Server name\": null,"; } // Map escape(map, sizeof(map)); if (strcmp(map, "") != 0) { oidentity << std::endl << "\"Map\": \"" << map << "\","; // Set map name in identity. } else { oidentity << std::endl << "\"Map\": null,"; } // Player nickname escape(player, sizeof(player)); if (strcmp(player, "") != 0) { oidentity << std::endl << "\"Player\": \"" << player << "\","; // Set player nickname in identity. } else { oidentity << std::endl << "\"Player\": null,"; } // Player ID escape(playerid, sizeof(playerid)); if (strcmp(playerid, "") != 0) { oidentity << std::endl << "\"Player ID\": \"" << playerid << "\""; // Set player ID in identity. } else { oidentity << std::endl << "\"Player ID\": null"; } oidentity << std::endl << "}"; identity = oidentity.str(); // End identity /* Mumble | Game X | X Y | Z Z | Y */ avatar_pos[0] = avatar_pos_corrector[0]; avatar_pos[1] = avatar_pos_corrector[2]; avatar_pos[2] = avatar_pos_corrector[1]; camera_pos[0] = camera_pos_corrector[0]; camera_pos[1] = camera_pos_corrector[2]; camera_pos[2] = camera_pos_corrector[1]; avatar_front[0] = avatar_front_corrector[0]; avatar_front[1] = avatar_front_corrector[2]; avatar_front[2] = avatar_front_corrector[1]; avatar_top[0] = avatar_top_corrector[0]; avatar_top[1] = avatar_top_corrector[2]; avatar_top[2] = avatar_top_corrector[1]; // Convert from inches to meters and sync camera vectors with avatar ones for (int i=0;i<3;i++) { avatar_pos[i]/=39.37f; camera_pos[i]/=39.37f; camera_front[i] = avatar_front[i]; camera_top[i] = avatar_top[i]; } return true; } static int trylock(const std::multimap &pids) { if (! initialize(pids, exe_name, client_name)) { // Retrieve "client_name" module's memory address return false; } // Server ID steamclient = getModuleAddr(steamclient_name); // Retrieve "steamclient_name" module's memory address // This prevents the plugin from linking to the game in case something goes wrong during module's memory address retrieval. if (!steamclient) return false; // Player name server = getModuleAddr(server_name); // Retrieve "server_name" module's memory address // This prevents the plugin from linking to the game in case something goes wrong during module's memory address retrieval. if (!server) return false; // Player ID engine = getModuleAddr(engine_name); // Retrieve "engine_name" module's memory address // This prevents the plugin from linking to the game in case something goes wrong during module's memory address retrieval. if (!engine) return false; // Check if we can get meaningful data from it float apos[3], afront[3], atop[3], cpos[3], cfront[3], ctop[3]; std::wstring sidentity; std::string scontext; if (fetch(apos, afront, atop, cpos, cfront, ctop, scontext, sidentity)) { return true; } else { generic_unlock(); return false; } } static const std::wstring longdesc() { return std::wstring(L"Supports Left 4 Dead 2 version 2.1.4.6 with context and identity support."); // Plugin long description } static std::wstring description(L"Left 4 Dead 2 (v2.1.4.6)"); // Plugin short description static std::wstring shortname(L"Left 4 Dead 2"); // Plugin short name static int trylock1() { return trylock(std::multimap()); } static MumblePlugin l4d2plug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 l4d2plug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &l4d2plug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &l4d2plug2; } mumble-1.3.4/plugins/l4d2/l4d2.pro0000664000175000017500000000051314010707273016355 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = l4d2 SOURCES = l4d2.cpp win32:LIBS += -luser32 mumble-1.3.4/plugins/borderlands2/0000775000175000017500000000000014010707273016703 5ustar builderbuildermumble-1.3.4/plugins/borderlands2/borderlands2.cpp0000664000175000017500000001663514010707273022003 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . /* Copyright (C) 2013, Steve Hill Copyright (C) 2013, Gabriel Risterucci Copyright (C) 2005-2010, Thorvald Natvig All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Mumble Developers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "../mumble_plugin_win32.h" #include procptr_t vects_ptr; procptr_t state_ptr; procptr_t character_name_ptr_loc; static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &, std::wstring &identity) { // Zero out the structures for (int i=0;i<3;i++) avatar_pos[i]=avatar_front[i]=avatar_top[i]=camera_pos[i]=camera_front[i]=camera_top[i]=0.0f; bool ok; char state; // State 1 == in-game, 0 == in-menu ok = peekProc(state_ptr, state); if (!ok) return false; if (state == 0) return true; // This results in all vectors beeing zero which tells Mumble to ignore them. struct { float front[3]; float top[3]; float position[3]; } game_vects; ok = peekProc(vects_ptr, game_vects); if (!ok) return false; // Copy game vectors into return values for (int i=0;i<3;i++) { camera_pos[i] = avatar_pos[i] = game_vects.position[i] / 100.0f; // Scale to meters camera_front[i] = avatar_front[i] = game_vects.front[i]; camera_top[i] = avatar_top[i] = game_vects.top[i]; } // Extract the character name procptr_t ptr1 = peekProcPtr(character_name_ptr_loc); procptr_t ptr2 = peekProcPtr(ptr1 + 0xC); procptr_t character_name_ptr = ptr2 + 0x80; char character_name[16]; // The game limits us to 15 char names ok = peekProc(character_name_ptr, character_name); if (ok) { // character_name is zero terminated, but using strnlen for double-plus safety identity.assign(character_name, character_name + strnlen(character_name, sizeof(character_name))); } return true; } static int trylock(const std::multimap &pids) { if (!initialize(pids, L"Borderlands2.exe")) { return false; } unsigned char detected_version[32]; // Note for further versions: // The "version" string above change. However, it looks like it will always start // with "WILLOW2-". Everything after this can change between versions. // Position vectors are read as triplet (X,Y,Z). The tree triplet are in this order: // front, top, position. // When entering the game, in Sanctuary (after liftoff), with the character Zero, // the reading are the following (rounded): // front.X = 0 // front.Y = 0 // front.Z = 1 // top.X = 0 // top.Y = 1 // top.Z = 0 // pos.X = -8109 // pos.Y = 3794 // pos.Z = 2930 // The "state" ptr is just a value that reliably alternate between 0 (in main menu) // and 1 (not in main menu). There is a lot of value that keep reliably changing even // across restart, change of characters... // Note that I couldn't find an address that would do this reliably with the game "pause" // menu, only the main menu (when you initially start the game, or completely exit your // current game) // VERSION_EQ safely checks whether the content of `buf' // (a buffer in the form of a C-style array of unsigned char) // contains the byte-level content of the string literal `strlit'. // // The NUL terminator of the string literal is not considered in // this equality check. #define VERSION_EQ(buf, strlit) \ memcmp(buf, strlit, std::min(sizeof(buf), sizeof(strlit)-1)) == 0 // 1.3.1 if (peekProc(pModule + 0x1E6D048, detected_version) && VERSION_EQ(detected_version, "WILLOW2-PCSAGE-28-CL697606")) { vects_ptr = pModule + 0x1E792B0; state_ptr = pModule + 0x1E79BC8; character_name_ptr_loc = pModule + 0x1E7302C; } // 1.4.0 else if (peekProc(pModule + 0x1E8D1D8, detected_version) && VERSION_EQ(detected_version, "WILLOW2-PCSAGE-77-CL711033")) { vects_ptr = pModule + 0x1E993F0; state_ptr = pModule + 0x1E99D08; character_name_ptr_loc = pModule + 0x1E93194; } // 1.5.0 else if (peekProc(pModule + 0x01E9F338, detected_version) && VERSION_EQ(detected_version, "WILLOW2-PCLILAC-60-CL721220")) { vects_ptr = pModule + 0x1EAB650; state_ptr = pModule + 0x1EABF68; character_name_ptr_loc = pModule + 0x01EA5384; } // 1.7.0 else if (peekProc(pModule + 0x01ED53A8, detected_version) && VERSION_EQ(detected_version, "WILLOW2-PCALLIUM-55-CL770068")) { vects_ptr = pModule + 0x1EE18E0; state_ptr = pModule + 0x1EE21F8; character_name_ptr_loc = pModule + 0x01EDB5B4; } // 1.8.3 else if (peekProc(pModule + 0x1EE63C8, detected_version) && VERSION_EQ(detected_version, "WILLOW2-PCCHINA-29-CL827556")) { vects_ptr = pModule + 0x1EF2930; state_ptr = pModule + 0x1EF3248; character_name_ptr_loc = pModule + 0x01EEC5D4; } else { generic_unlock(); return false; } // Check if we can get meaningful data from it float apos[3], afront[3], atop[3]; float cpos[3], cfront[3], ctop[3]; std::wstring sidentity; std::string scontext; if (fetch(apos, afront, atop, cpos, cfront, ctop, scontext, sidentity)) { return true; } else { generic_unlock(); return false; } } static const std::wstring longdesc() { return std::wstring(L"Supports Borderlands 2. No context support yet."); } static std::wstring description(L"Borderlands 2 (v1.8.3)"); static std::wstring shortname(L"Borderlands 2"); static int trylock1() { return trylock(std::multimap()); } static MumblePlugin bl2plug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 bl2plug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &bl2plug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &bl2plug2; } mumble-1.3.4/plugins/borderlands2/borderlands2.pro0000664000175000017500000000052414010707273022007 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = borderlands2 SOURCES = borderlands2.cpp LIBS += -luser32 mumble-1.3.4/plugins/borderlands/0000775000175000017500000000000014010707273016621 5ustar builderbuildermumble-1.3.4/plugins/borderlands/borderlands.cpp0000664000175000017500000001540514010707273021631 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . /* Copyright (C) 2010, Mark-Willem Jansen Copyright (C) 2005-2012, Thorvald Natvig All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Mumble Developers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "../mumble_plugin_win32.h" procptr_t posptr, frontptr, topptr, contextptraddress, stateaddress, loginaddress; static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &context, std::wstring &) { static bool loggedin = false; static procptr_t contextptr; bool ok; // Zeroing the floats for (int i=0;i<3;i++) avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; // When you log in the context pointer needs to be set. char login; ok = peekProc(loginaddress, &login, sizeof(login)); if (! ok) return false; if (login == 0) { loggedin = false; } else if (!loggedin) { procptr_t ptr1 = peekProcPtr(contextptraddress); procptr_t ptr2 = peekProcPtr(ptr1 + 0x28c); procptr_t ptr3 = peekProcPtr(ptr2 + 0x210); if (ptr3 != 0) loggedin = true; //pointer set contextptr = ptr3 + 0x2c; } // Magic State value char state; ok = peekProc(stateaddress, &state, sizeof(state)); if (! ok) return false; // State is 0 when you are in the main menu and 1 when your are not. if (state == 0) return true; // This results in all vectors beeing zero which tells Mumble to ignore them. float pos_corrector[3]; float front_corrector[3]; float top_corrector[3]; ok = peekProc(posptr, &pos_corrector, 12) && peekProc(frontptr, &front_corrector, 12) && peekProc(topptr, &top_corrector, 12); if (! ok) return false; // coordinate systems: // "ENU" "Mumble" "In game" // East x+ [0] z+ [2] // North z+ [2] x+ [0] // Up y+ [1] y+ [1] avatar_pos[0] = pos_corrector[2]; avatar_pos[1] = pos_corrector[1]; avatar_pos[2] = pos_corrector[0]; for (int i=0;i<3;i++) avatar_pos[i]/=100.0f; // Unreal Unit is set to centimeters avatar_front[0] = front_corrector[2]; avatar_front[1] = front_corrector[1]; avatar_front[2] = front_corrector[0]; avatar_top[0] = top_corrector[2]; avatar_top[1] = top_corrector[1]; avatar_top[2] = top_corrector[0]; for (int i=0;i<3;i++) { camera_pos[i] = avatar_pos[i]; camera_front[i] = avatar_front[i]; camera_top[i] = avatar_top[i]; } if (loggedin) { char ccontext[64]; ok = peekProc(contextptr, &ccontext, sizeof(ccontext)); if (! ok) return false; std::string new_context; new_context.assign(ccontext, sizeof(ccontext)); if (new_context.find("bderlandspc") != std::string::npos) new_context.erase(0, new_context.find("bderlandspc")); if (new_context.find(":7777") != std::string::npos) new_context.erase(new_context.find(":7777") + 5); context = new_context; } return ok; } static int trylock(const std::multimap &pids) { posptr = frontptr = topptr = contextptraddress = stateaddress = loginaddress = 0; if (!initialize(pids, L"Borderlands.exe")) return false; // Trying to assess which version of Borderlands is running. char version[6]; if (!peekProc(0x01f16ce8, &version, sizeof(version))) { generic_unlock(); return false; } procptr_t ptraddress; if (strncmp("the cl", version, sizeof(version)) == 0) { // retail version ptraddress = 0x01f73744; stateaddress = 0x01f9bb18; contextptraddress = 0x01fd7398; loginaddress = 0x01fd83a8; } else if (strncmp("Tir-ku", version, sizeof(version)) == 0) { // steam version ptraddress = 0x01f705c4; stateaddress = 0x01f98998; contextptraddress = 0x01fd4218; loginaddress = 0x01fd5220; } else if (strncmp("german", version, sizeof(version)) == 0) { // german version ptraddress = 0x01f72744; stateaddress = 0x01f9ab18; contextptraddress = 0x01fd6398; loginaddress = 0x01fd73a8; } else { // unknown version generic_unlock(); return false; } procptr_t ptr1 = peekProcPtr(ptraddress); if (ptr1 == 0) { generic_unlock(); return false; } posptr = ptr1 + 0x9200; frontptr = ptr1 + 0x9248; topptr = ptr1 + 0x9230; float apos[3], afront[3], atop[3], cpos[3], cfront[3], ctop[3]; std::string context; std::wstring identity; if (fetch(apos, afront, atop, cpos, cfront, ctop, context, identity)) { return true; } else { generic_unlock(); return false; } } static const std::wstring longdesc() { return std::wstring(L"Supports Borderlands v1.40, including german and steam version. Context string is used with online games."); } static std::wstring description(L"Borderlands v1.40"); static std::wstring shortname(L"Borderlands"); static int trylock1() { return trylock(std::multimap()); } static MumblePlugin borderlandsplug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 borderlandsplug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &borderlandsplug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &borderlandsplug2; } mumble-1.3.4/plugins/borderlands/borderlands.pro0000664000175000017500000000052214010707273021641 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = borderlands SOURCES = borderlands.cpp LIBS += -luser32 mumble-1.3.4/plugins/tf2/0000775000175000017500000000000014010707273015015 5ustar builderbuildermumble-1.3.4/plugins/tf2/tf2.pro0000664000175000017500000000063514010707273016236 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) DEFINES += "NULL_DESC=\"L\\\"Team Fortress 2 (Retracted, now using link)\\\"\"" TARGET = tf2 SOURCES = ../null_plugin.cpp LIBS += -luser32 mumble-1.3.4/plugins/lol/0000775000175000017500000000000014010707273015110 5ustar builderbuildermumble-1.3.4/plugins/lol/lol.cpp0000664000175000017500000001526214010707273016410 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . /* Copyright (C) 2012, dark_skeleton (d-rez) Copyright (C) 2005-2012, Thorvald Natvig All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Mumble Developers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "../mumble_plugin_win32.h" /* Arrays of bytes to find addresses accessed by respective functions so we don't have to blindly search for addresses after every update Remember to disable scanning writable memory only in CE! We're searching for functions here, not values! Current addresses as of version 1.0.0.145 Camera position vector address: F3 0F 11 03 F3 0F 10 44 24 14 D9 5C 24 28 :00B738E8 Camera front vector address: campos+0x14 (offset, not pointer!) D9 5F 40 D9 46 04 D9 5F 44 D9 46 08 D9 5F 48 59 C3 CC (non-static! NEEDS POINTER) :00E22E90 Avatar front vector address: +0x2acc [offset can change] D9 9E E0 01 00 00 D9 40 70 :02F5E5F8 Avatar position vector address: +0x1e0 (pointer offset) [offset can change] IP is kept as text @ hostipptr PORT is kept as a 4-byte decimal value @ hostportptr Look for a non-unicode string that will contain server's IP. 28 bytes further from IP, there should be server's port :0AF69D18 PORT: +0x1C (offset, not pointer!) */ static procptr_t posptr, afrontptr, tmpptr; static procptr_t posptr_ = 0x2F5E5F8; static procptr_t camptr = 0xB738E8; static procptr_t camfrontptr = 0x14; static procptr_t gameptr = 0xE22E90; static procptr_t hostipptr = 0xAF69D18; static procptr_t hostportptr = hostipptr + 0x1C; static char prev_hostip[16]; // These should never change while the game is running, but just in case... static int prev_hostport; static bool calcout(float *pos, float *cam, float *opos, float *ocam) { // Seems League of Legends is in centimeters? ;o Well it's not inches for sure :) for (int i = 0; i < 3; i++) { opos[i] = pos[i] / 100.00f; ocam[i] = cam[i] / 100.00f; } return true; } static bool refreshPointers(void) { posptr = afrontptr = tmpptr = 0; // Avatar front vector pointer tmpptr = peekProcPtr(gameptr); if (!tmpptr) return false; // Something went wrong, unlink afrontptr = tmpptr + 0x2acc; // Avatar position vector tmpptr = peekProcPtr(posptr_); if (!tmpptr) return false; // Something went wrong, unlink posptr = tmpptr + 0x1e0; return true; } static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &context, std::wstring &/*identity*/) { for (int i = 0; i < 3; i++) avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; float ipos[3], cam[3]; int hostport; char hostip[16]; bool ok; // Player not in game (or something broke), unlink if (!peekProcPtr(gameptr)) return false; ok = peekProc(camfrontptr, camera_front, 12) && peekProc(camptr, cam, 12) && peekProc(posptr, ipos, 12) && peekProc(afrontptr, avatar_front, 12) && peekProc(hostipptr, hostip) && peekProc(hostportptr, &hostport, 4); if (!ok) return false; // Ensure strings are zero terminated hostip[sizeof(hostip) - 1] = '\0'; calcout(ipos, cam, avatar_pos, camera_pos); //calculate proper position values if (strcmp(hostip, prev_hostip) != 0 || hostport != prev_hostport) { context.clear(); strcpy_s(prev_hostip, sizeof(prev_hostip), hostip); prev_hostport = hostport; if (strcmp(hostip, "") != 0) { char buffer[50]; sprintf_s(buffer, sizeof(buffer), "{\"ipport\": \"%s:%d\"}", hostip, hostport); context.assign(buffer); } } return true; } static int trylock(const std::multimap &pids) { if (! initialize(pids, L"League of Legends.exe")) return false; if (refreshPointers()) { // unlink plugin if this fails *prev_hostip = '\0'; prev_hostport = 0; float avatar_pos[3], avatar_front[3], avatar_top[3]; float camera_pos[3], camera_front[3], camera_top[3]; std::string context; std::wstring identity; if (fetch(avatar_pos, avatar_front, avatar_top, camera_pos, camera_front, camera_top, context, identity)) { *prev_hostip = '\0'; // we need to do this again since fetch() above overwrites this (which results in empty context until next change) prev_hostport = 0; return true; } } generic_unlock(); return false; } static const std::wstring longdesc() { return std::wstring(L"Supports League of Legends v1.0.0.145 with context. No identity support."); } static std::wstring description(L"League of Legends (v1.0.0.145)"); static std::wstring shortname(L"League of Legends"); static int trylock1() { return trylock(std::multimap()); } static MumblePlugin lolplug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 lolplug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &lolplug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &lolplug2; } mumble-1.3.4/plugins/lol/lol.pro0000664000175000017500000000050214010707273016415 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = lol SOURCES = lol.cpp LIBS += -luser32 mumble-1.3.4/plugins/breach/0000775000175000017500000000000014010707273015546 5ustar builderbuildermumble-1.3.4/plugins/breach/breach.pro0000664000175000017500000000051114010707273017511 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = breach SOURCES = breach.cpp LIBS += -luser32 mumble-1.3.4/plugins/breach/breach.cpp0000664000175000017500000001130614010707273017477 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . /* Copyright (C) 2011, Mark-Willem Jansen Copyright (C) 2005-2012, Thorvald Natvig All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Mumble Developers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "../mumble_plugin_win32.h" procptr_t posptr, frontptr, topptr; static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &, std::wstring &) { bool ok; for (int i=0;i<3;i++) avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; // State value is working most of the time unsigned char state; ok = peekProc(0x11146bb, &state, sizeof(state)); if (! ok) return false; // State is 255 when you are in a menu if (state == 255) return true; // This results in all vectors beeing zero which tells Mumble to ignore them // coordinate systems is already left handed so no change needed ok = peekProc(posptr, avatar_pos, 12) && peekProc(frontptr, avatar_front, 12) && peekProc(topptr, avatar_top, 12); if (! ok) return false; // The ingame units are inches for (int i=0;i<3;i++) avatar_pos[i] /= 39.37f; // As it is a First Person Shooter the avatar and camera are the same for (int i=0;i<3;i++) { camera_pos[i] = avatar_pos[i]; camera_front[i] = avatar_front[i]; camera_top[i] = avatar_top[i]; } return true; } static int trylock(const std::multimap &pids) { posptr = frontptr = topptr = 0; if (! initialize(pids, L"Breach.exe", L"fmodex.dll")) return false; // Checking the version of Breach char version[12]; if ((! peekProc(0x1118f98, &version, sizeof(version))) || (strncmp("breach 1.1.0", version, sizeof(version)) != 0)) { generic_unlock(); return false; } // Setting the pointers for the avatar information procptr_t ptr1 = peekProcPtr(pModule + 0x177980); if (ptr1 == 0) { generic_unlock(); return false; } posptr = ptr1 + 0x9200; frontptr = ptr1 + 0x9248; topptr = ptr1 + 0x9230; // Final check by calling fetch. float apos[3], afront[3], atop[3], cpos[3], cfront[3], ctop[3]; std::string context; std::wstring identity; if (! fetch(apos, afront, atop, cpos, cfront, ctop, context, identity)) { generic_unlock(); return false; } return true; } static const std::wstring longdesc() { return std::wstring(L"Supports Breach v1.1.0, steam version. Context and Identity on supported."); } static std::wstring description(L"Breach v1.1.0"); static std::wstring shortname(L"Breach"); static int trylock1() { return trylock(std::multimap()); } static MumblePlugin breachplug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 breachplug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &breachplug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &breachplug2; } mumble-1.3.4/plugins/dods/0000775000175000017500000000000014010707273015253 5ustar builderbuildermumble-1.3.4/plugins/dods/dods.pro0000664000175000017500000000064514010707273016733 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) DEFINES += "NULL_DESC=\"L\\\"Day of Defeat : Source (Retracted, now using link)\\\"\"" TARGET = dods SOURCES = ../null_plugin.cpp LIBS += -luser32 mumble-1.3.4/plugins/bf4_x86/0000775000175000017500000000000014010707273015502 5ustar builderbuildermumble-1.3.4/plugins/bf4_x86/bf4_x86.pro0000664000175000017500000000012114010707273017376 0ustar builderbuilderinclude(../plugins.pri) TARGET = bf4_x86 SOURCES = bf4_x86.cpp LIBS += -luser32 mumble-1.3.4/plugins/bf4_x86/bf4_x86.cpp0000664000175000017500000002223214010707273017367 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "../mumble_plugin_win32.h" // Include standard plugin header. #include "../mumble_plugin_utils.h" // Include plugin header for special functions, like "escape". static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &context, std::wstring &identity) { for (int i=0;i<3;i++) { avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; } bool ok, state; char serverid[37], host[22], team[3]; BYTE squad, squad_leader, squad_state; // Server ID pointers procptr_t serverid_base = peekProcPtr(pModule + 0x1D39C64); if (!serverid_base) return false; procptr_t serverid_offset_0 = peekProcPtr(serverid_base + 0xC); if (!serverid_offset_0) return false; procptr_t serverid_offset_1 = peekProcPtr(serverid_offset_0 + 0x14); if (!serverid_offset_1) return false; procptr_t serverid_offset = peekProcPtr(serverid_offset_1 + 0x1D0); if (!serverid_offset) return false; // Squad pointers procptr_t squad_base = peekProcPtr(pModule + 0x1D39D0C); if (!squad_base) return false; procptr_t squad_offset_0 = peekProcPtr(squad_base + 0x7C); if (!squad_offset_0) return false; procptr_t squad_offset_1 = peekProcPtr(squad_offset_0 + 0x728); if (!squad_offset_1) return false; // Peekproc and assign game addresses to our containers, so we can retrieve positional data ok = peekProc(pModule + 0x1D23B0E, &state, 1) && // Magical state value: 0 when in-game and 1 when in menu/dead. peekProc(pModule + 0x1CFD3C0, avatar_pos, 12) && // Avatar Position values (X, Y and Z). peekProc(pModule + 0x1D23CB0, camera_pos, 12) && // Camera Position values (X, Y and Z). peekProc(pModule + 0x1D23C90, avatar_top, 12) && // Avatar Top Vector values (X, Y and Z). peekProc(pModule + 0x1D23CA0, avatar_front, 12) && // Avatar Front Vector values (X, Y and Z). peekProc(serverid_offset, serverid) && // Server ID (36 characters). peekProc(pModule + 0x1CF3A68, host) && // Host value: "IP:Port" when in a server, "bot" when loading and empty when it's hidden. peekProc(pModule + 0x1DCF695, team) && // Team value: US (United States); RU (Russia); CH (China). peekProc(squad_offset_1 + 0x15C, squad) && // Squad value: 0 (not in a squad); 1 (Alpha); 2 (Bravo); 3 (Charlie)... 26 (Zulu). peekProc(squad_offset_1 + 0x160, squad_leader) && // Squad leader value: 0 (False); 1 (True). peekProc(squad_offset_1 + 0x161, squad_state); // Squad state value: 0 (Public); 1 (Private). // This prevents the plugin from linking to the game in case something goes wrong during values retrieval from memory addresses. if (! ok) { return false; } if (state) { // If not in-game context.clear(); // Clear context identity.clear(); // Clear identity // Set vectors values to 0. for (int i=0;i<3;i++) { avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; } return true; // This tells Mumble to ignore all vectors. } escape(serverid, sizeof(serverid)); std::ostringstream ocontext; ocontext << " {\"Server ID\": \"" << serverid << "\"}"; // Set context with server ID context = ocontext.str(); std::wostringstream oidentity; oidentity << "{"; escape(host, sizeof(host)); // Only include host (IP:port) if it is not empty and does not include the string "bot" (which means it's a local server). if (strcmp(host, "") != 0 && strstr(host, "bot") == NULL) { oidentity << std::endl << "\"Host\": \"" << host << "\","; } std::string Team(team); if (!Team.empty()) { oidentity << std::endl; if (Team == "US") oidentity << "\"Team\": \"United States\","; // If team value is US, set "United States" as team in identity. else if (Team == "CH") oidentity << "\"Team\": \"China\","; // If team value is CH, set "China" as team in identity. else if (Team == "RU") oidentity << "\"Team\": \"Russia\","; // If team value is RU, set "Russia" as team in identity. } // If squad value is in a value between 1 and 26, set squad name in identity using NATO Phonetic alphabet. if (squad > 0 && squad < 27) { if (squad == 1) oidentity << std::endl << "\"Squad\": \"Alpha\","; else if (squad == 2) oidentity << std::endl << "\"Squad\": \"Bravo\","; else if (squad == 3) oidentity << std::endl << "\"Squad\": \"Charlie\","; else if (squad == 4) oidentity << std::endl << "\"Squad\": \"Delta\","; else if (squad == 5) oidentity << std::endl << "\"Squad\": \"Echo\","; else if (squad == 6) oidentity << std::endl << "\"Squad\": \"Foxtrot\","; else if (squad == 7) oidentity << std::endl << "\"Squad\": \"Golf\","; else if (squad == 8) oidentity << std::endl << "\"Squad\": \"Hotel\","; else if (squad == 9) oidentity << std::endl << "\"Squad\": \"India\","; else if (squad == 10) oidentity << std::endl << "\"Squad\": \"Juliet\","; else if (squad == 11) oidentity << std::endl << "\"Squad\": \"Kilo\","; else if (squad == 12) oidentity << std::endl << "\"Squad\": \"Lima\","; else if (squad == 13) oidentity << std::endl << "\"Squad\": \"Mike\","; else if (squad == 14) oidentity << std::endl << "\"Squad\": \"November\","; else if (squad == 15) oidentity << std::endl << "\"Squad\": \"Oscar\","; else if (squad == 16) oidentity << std::endl << "\"Squad\": \"Papa\","; else if (squad == 17) oidentity << std::endl << "\"Squad\": \"Quebec\","; else if (squad == 18) oidentity << std::endl << "\"Squad\": \"Romeo\","; else if (squad == 19) oidentity << std::endl << "\"Squad\": \"Sierra\","; else if (squad == 20) oidentity << std::endl << "\"Squad\": \"Tango\","; else if (squad == 21) oidentity << std::endl << "\"Squad\": \"Uniform\","; else if (squad == 22) oidentity << std::endl << "\"Squad\": \"Victor\","; else if (squad == 23) oidentity << std::endl << "\"Squad\": \"Whiskey\","; else if (squad == 24) oidentity << std::endl << "\"Squad\": \"X-ray\","; else if (squad == 25) oidentity << std::endl << "\"Squad\": \"Yankee\","; else if (squad == 26) oidentity << std::endl << "\"Squad\": \"Zulu\","; // Squad leader if (squad_leader == 1) oidentity << std::endl << "\"Squad leader\": true,"; // If squad leader value is true, set squad leader state to "True" in identity. else oidentity << std::endl << "\"Squad leader\": false,"; // If squad leader value is false, set squad leader state to "False" in identity. // Squad state if (squad_state == 1) oidentity << std::endl << "\"Squad state\": \"Private\""; // If squad state value is true, set squad state to "Private" in identity. else oidentity << std::endl << "\"Squad state\": \"Public\""; // If squad state value is false, set squad state to "Public" in identity. // When not in a squad } else { oidentity << std::endl << "\"Squad\": null,"; // If squad value isn't between 1 and 26, set squad to "null" in identity. oidentity << std::endl << "\"Squad leader\": null,"; // If not in a squad, set squad leader state to "null" in identity. oidentity << std::endl << "\"Squad state\": null"; // If not in a squad, set squad state to "null" in identity. } oidentity << std::endl << "}"; identity = oidentity.str(); // Flip the front vector for (int i=0;i<3;i++) { avatar_front[i] = -avatar_front[i]; } // Convert from right to left handed avatar_pos[0] = -avatar_pos[0]; camera_pos[0] = -camera_pos[0]; avatar_front[0] = -avatar_front[0]; avatar_top[0] = -avatar_top[0]; // Sync camera front and top vectors with avatar ones for (int i=0;i<3;i++) { camera_front[i] = avatar_front[i]; camera_top[i] = avatar_top[i]; } return true; } static int trylock(const std::multimap &pids) { if (! initialize(pids, L"bf4_x86.exe")) { // Link the game executable return false; } // Check if we can get meaningful data from it float apos[3], afront[3], atop[3], cpos[3], cfront[3], ctop[3]; std::wstring sidentity; std::string scontext; if (fetch(apos, afront, atop, cpos, cfront, ctop, scontext, sidentity)) { return true; } else { generic_unlock(); return false; } } static const std::wstring longdesc() { return std::wstring(L"Supports Battlefield 4 with context and identity support."); // Plugin long description } static std::wstring description(L"Battlefield 4 (x86) version 1.8.2.48475"); // Plugin short description static std::wstring shortname(L"Battlefield 4"); // Plugin short name static int trylock1() { return trylock(std::multimap()); } static MumblePlugin bf4plug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 bf4plug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &bf4plug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &bf4plug2; } mumble-1.3.4/plugins/codmw2/0000775000175000017500000000000014010707273015515 5ustar builderbuildermumble-1.3.4/plugins/codmw2/codmw2.cpp0000664000175000017500000000774114010707273017425 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "../mumble_plugin_win32.h" static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &, std::wstring &) { float viewHor, viewVer; char state; for (int i=0;i<3;i++) avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; bool ok; /* This plugin uses the following Variables: Address Type Description =================================== 0x008F0F78 float Z-Coordinate 0x008F0F7C float X-Coordinate 0x008F0F80 float Y-Coordinate 0x008F0F88 float Horizontal view (degrees) 0x008F0F84 float Vertical view (degrees) 0x007F7A34 byte Magical state value */ ok = peekProc(0x007F8AB4, &state, 1); // Magical state value if (! ok) return false; /* state value is: 0 while not in game 1 while playing 5 while spectating This value is used for disabling PA for spectators or people not on a server. */ if (state != 1) return true; // This results in all vectors beeing zero which tells mumble to ignore them. ok = peekProc(0x008F1FF8, avatar_pos+2, 4) && //Z peekProc(0x008F1FFC, avatar_pos, 4) && //X peekProc(0x008F2000, avatar_pos+1, 4) && //Y peekProc(0x008F2008, &viewHor, 4) && //Hor peekProc(0x008F2004, &viewVer, 4); //Ver if (! ok) return false; // Scale Coordinates /* Z-Value is increasing when heading north decreasing when heading south X-Value is increasing when heading west decreasing when heading east Y-Value is increasing when going up decreasing when going down 40 units = 1 meter (not confirmed) */ for (int i=0;i<3;i++) avatar_pos[i]/=40.0f; // Scale to meters avatar_pos[0]*=(-1.0f); // Convert right to left handed avatar_top[2] = -1; // Head movement is in front vector // Calculate view unit vector /* Vertical view 0° when centered 85° when looking down 275° when looking up Decreasing when looking up. Horizontal is 0° when facing North 90° when facing West 180° when facing South 270° when facing East Increasing when turning left. */ viewVer *= static_cast(M_PI / 180.0f); viewHor *= static_cast(M_PI / 180.0f); avatar_front[0] = -sin(viewHor) * cos(viewVer); avatar_front[1] = -sin(viewVer); avatar_front[2] = cos(viewHor) * cos(viewVer); for (int i=0;i<3;i++) { camera_pos[i] = avatar_pos[i]; camera_front[i] = avatar_front[i]; camera_top[i] = avatar_top[i]; } return true; } static int trylock(const std::multimap &pids) { if (! initialize(pids, L"iw4mp.exe")) return false; float apos[3], afront[3], atop[3], cpos[3], cfront[3], ctop[3]; std::string context; std::wstring identity; if (fetch(apos, afront, atop, cpos, cfront, ctop, context, identity)) { return true; } else { generic_unlock(); return false; } } static const std::wstring longdesc() { return std::wstring(L"Supports Call of Duty: Modern Warfare 2 MP v1.2.208 only. No context or identity support yet."); } static std::wstring description(L"Call of Duty: Modern Warfare 2 MP v1.2.208"); static std::wstring shortname(L"Call of Duty: Modern Warfare 2 MP"); static int trylock1() { return trylock(std::multimap()); } static MumblePlugin codmw2plug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 codmw2plug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &codmw2plug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &codmw2plug2; } mumble-1.3.4/plugins/codmw2/codmw2.pro0000664000175000017500000000051214010707273017430 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = codmw2 SOURCES = codmw2.cpp LIBS += -luser32 mumble-1.3.4/plugins/l4d/0000775000175000017500000000000014010707273015005 5ustar builderbuildermumble-1.3.4/plugins/l4d/l4d.cpp0000664000175000017500000001546414010707273016206 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "../mumble_plugin_win32.h" // Include standard plugin header. #include "../mumble_plugin_utils.h" // Include plugin header for special functions, like "escape". static procptr_t steamclient, engine; // Variables to contain modules addresses static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &context, std::wstring &identity) { for (int i=0;i<3;i++) { avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; } // Boolean value to check if game addresses retrieval is successful bool ok; // Create containers to stuff our raw data into, so we can convert it to Mumble's coordinate system float avatar_pos_corrector[3], camera_pos_corrector[3], camera_front_corrector[3], camera_top_corrector[3]; // Char values for extra features char serverid[22], host[22], map[30], playerid[22]; // State bool state; // State pointers procptr_t state_base = peekProcPtr(pModule + 0x5A7354); if (state_base == 0) return false; procptr_t state_offset = peekProcPtr(state_base + 0x5C); if (state_offset == 0) return false; // Peekproc and assign game addresses to our containers, so we can retrieve positional data ok = peekProc(state_offset + 0x8, state) && // Magical state value: 0 when not playing and 1 when in-game. peekProc(pModule + 0x512264, avatar_pos_corrector) && // Avatar position values (X, Z and Y). peekProc(pModule + 0x5943B0, camera_pos_corrector) && // Camera position values (X, Z and Y). peekProc(pModule + 0x594410, camera_front_corrector) && // Front vector values (X, Z and Y). peekProc(pModule + 0x594440, camera_top_corrector) && // Top vector values (X, Z and Y). peekProc(steamclient + 0x95E56D, serverid) && // Unique server Steam ID. peekProc(engine + 0x61F5D8, host) && // Server value: "IP:Port" (xxx.xxx.xxx.xxx:yyyyy) when in a remote server and "loopback" when on a local server. peekProc(pModule + 0x5A7A29, map) && // Map name. peekProc(engine + 0x40CF00, playerid); // Unique player Steam ID. // This prevents the plugin from linking to the game in case something goes wrong during values retrieval from memory addresses. if (! ok) return false; // State if (!state) { // If not in-game context.clear(); // Clear context identity.clear(); // Clear identity // Set vectors values to 0. for (int i=0;i<3;i++) { avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; } return true; // This tells Mumble to ignore all vectors. } // Begin context escape(serverid, sizeof(serverid)); escape(host, sizeof(host)); std::ostringstream ocontext; if (strcmp(serverid, "") != 0) { ocontext << " {\"Server ID\": \"" << serverid << "\"}"; // Set context with server ID } else { ocontext << " {\"Host\": \"" << host << "\"}"; // Set context with IP address and port } context = ocontext.str(); // End context // Begin identity std::wostringstream oidentity; oidentity << "{"; // Host if (strcmp(host, "") != 0 && strstr(host, "loopback") == NULL) { // Only include host (IP:Port) if it is not empty and does not include the string "loopback" (which means it's a local server). oidentity << std::endl << "\"Host\": \"" << host << "\","; // Set host address in identity. } else { oidentity << std::endl << "\"Host\": null,"; } // Map escape(map, sizeof(map)); if (strcmp(map, "") != 0) { oidentity << std::endl << "\"Map\": \"" << map << "\","; // Set map name in identity. } else { oidentity << std::endl << "\"Map\": null,"; } // Player ID escape(playerid, sizeof(playerid)); if (strcmp(playerid, "") != 0) { oidentity << std::endl << "\"Player ID\": \"" << playerid << "\""; // Set player ID in identity. } else { oidentity << std::endl << "\"Player ID\": null"; } oidentity << std::endl << "}"; identity = oidentity.str(); // End identity /* Mumble | Game X | X Y | Z Z | Y */ avatar_pos[0] = avatar_pos_corrector[0]; avatar_pos[1] = avatar_pos_corrector[2]; avatar_pos[2] = avatar_pos_corrector[1]; camera_pos[0] = camera_pos_corrector[0]; camera_pos[1] = camera_pos_corrector[2]; camera_pos[2] = camera_pos_corrector[1]; camera_front[0] = camera_front_corrector[0]; camera_front[1] = camera_front_corrector[2]; camera_front[2] = camera_front_corrector[1]; camera_top[0] = camera_top_corrector[0]; camera_top[1] = camera_top_corrector[2]; camera_top[2] = camera_top_corrector[1]; // Convert from inches to meters and sync avatar vectors with camera ones for (int i=0;i<3;i++) { avatar_pos[i]/=39.37f; camera_pos[i]/=39.37f; avatar_front[i] = camera_front[i]; avatar_top[i] = camera_top[i]; } return true; } static int trylock(const std::multimap &pids) { if (! initialize(pids, L"left4dead.exe", L"client.dll")) { // Retrieve "client.dll" module's memory address return false; } // Server ID steamclient = getModuleAddr(L"steamclient.dll"); // Retrieve "steamclient.dll" module's memory address // This prevents the plugin from linking to the game in case something goes wrong during module's memory address retrieval. if (steamclient == 0) return false; // Host & Player ID engine = getModuleAddr(L"engine.dll"); // Retrieve "engine.dll" module's memory address // This prevents the plugin from linking to the game in case something goes wrong during module's memory address retrieval. if (engine == 0) return false; // Check if we can get meaningful data from it float apos[3], afront[3], atop[3], cpos[3], cfront[3], ctop[3]; std::wstring sidentity; std::string scontext; if (fetch(apos, afront, atop, cpos, cfront, ctop, scontext, sidentity)) { return true; } else { generic_unlock(); return false; } } static const std::wstring longdesc() { return std::wstring(L"Supports Left 4 Dead version 1.0.3.1 with context and identity support."); // Plugin long description } static std::wstring description(L"Left 4 Dead (v1.0.3.1)"); // Plugin short description static std::wstring shortname(L"Left 4 Dead"); // Plugin short name static int trylock1() { return trylock(std::multimap()); } static MumblePlugin l4dplug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 l4dplug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &l4dplug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &l4dplug2; } mumble-1.3.4/plugins/l4d/l4d.pro0000664000175000017500000000050214010707273016207 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = l4d SOURCES = l4d.cpp LIBS += -luser32 mumble-1.3.4/plugins/ffxiv_x64/0000775000175000017500000000000014010707273016145 5ustar builderbuildermumble-1.3.4/plugins/ffxiv_x64/ffxiv_x64.pro0000775000175000017500000000056314010707273020521 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = ffxiv_x64 SOURCES = ../ffxiv/ffxiv.cpp DEFINES *= FFXIV_USE_x64 win32:LIBS += -luser32 mumble-1.3.4/plugins/bf1/0000775000175000017500000000000014010707273014772 5ustar builderbuildermumble-1.3.4/plugins/bf1/bf1.pro0000664000175000017500000000011114010707273016155 0ustar builderbuilderinclude(../plugins.pri) TARGET = bf1 SOURCES = bf1.cpp LIBS += -luser32 mumble-1.3.4/plugins/bf1/bf1.cpp0000664000175000017500000002235314010707273016153 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "../mumble_plugin_win32.h" // Include standard plugin header. #include "../mumble_plugin_utils.h" // Include plugin header for special functions, like "escape". static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &context, std::wstring &identity) { for (int i=0;i<3;i++) { avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; } bool ok, state; char server_name[100], team[4]; BYTE squad, squad_leader; // State pointers procptr_t state_base = peekProcPtr(pModule + 0x33DBD08); if (!state_base) return false; procptr_t state_offset_0 = peekProcPtr(state_base + 0x5F0); if (!state_offset_0) return false; procptr_t state_offset_1 = peekProcPtr(state_offset_0 + 0x488); if (!state_offset_1) return false; procptr_t state_offset_2 = peekProcPtr(state_offset_1 + 0x8); if (!state_offset_2) return false; procptr_t state_offset_3 = peekProcPtr(state_offset_2 + 0x8); if (!state_offset_3) return false; // Camera pointer procptr_t camera_base = peekProcPtr(pModule + 0x368E828); if (!camera_base) return false; // Server name pointers procptr_t server_name_base = peekProcPtr(pModule + 0x3103A38); if (!server_name_base) return false; procptr_t server_name_offset_0 = peekProcPtr(server_name_base + 0x738); if (!server_name_offset_0) return false; procptr_t server_name_offset_1 = peekProcPtr(server_name_offset_0 + 0x370); if (!server_name_offset_1) return false; procptr_t server_name_offset_2 = peekProcPtr(server_name_offset_1 + 0x10); if (!server_name_offset_2) return false; // Team pointers procptr_t team_base = peekProcPtr(pModule + 0x36CC128); if (!team_base) return false; procptr_t team_offset_0 = peekProcPtr(team_base + 0x20); if (!team_offset_0) return false; procptr_t team_offset_1 = peekProcPtr(team_offset_0 + 0x648); if (!team_offset_1) return false; procptr_t team_offset_2 = peekProcPtr(team_offset_1 + 0xF8); if (!team_offset_2) return false; // Squad pointers procptr_t squad_base = peekProcPtr(pModule + 0x31C3E40); if (!squad_base) return false; procptr_t squad_offset_0 = peekProcPtr(squad_base + 0x30); if (!squad_offset_0) return false; procptr_t squad_offset_1 = peekProcPtr(squad_offset_0 + 0x578); if (!squad_offset_1) return false; procptr_t squad_offset_2 = peekProcPtr(squad_offset_1 + 0xC0); if (!squad_offset_2) return false; procptr_t squad_offset_3 = peekProcPtr(squad_offset_2 + 0x58); if (!squad_offset_3) return false; // Peekproc and assign game addresses to our containers, so we can retrieve positional data ok = peekProc(state_offset_3 + 0x50, &state, 1) && // Magical state value: 1 when in-game and 0 when not spawned or playing. peekProc(pModule + 0x36B1500, avatar_pos, 12) && // Avatar position values (X, Y and Z). peekProc(camera_base + 0x2B0, camera_pos, 12) && // Camera position values (X, Y and Z). peekProc(camera_base + 0x260, camera_front, 12) && // Avatar front vector values (X, Y and Z). peekProc(camera_base + 0x250, camera_top, 12) && // Avatar top vector values (X, Y and Z). peekProc(server_name_offset_2, server_name) && // Server name. peekProc(team_offset_2 + 0x13, team) && // Team name. peekProc(squad_offset_3 + 0x240, squad) && // Squad value: 0 (not in a squad), 1 (Apples), 2 (Butter), 3 (Charlie)... 26 (Zebra). peekProc(squad_offset_3 + 0x244, squad_leader); // Squad leader value: 0 (False), 1 (True). // This prevents the plugin from linking to the game in case something goes wrong during values retrieval from memory addresses. if (!ok) { return false; } if (!state) { // If not in-game context.clear(); // Clear context identity.clear(); // Clear identity // Set vectors values to 0. for (int i=0;i<3;i++) { avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; } return true; // This tells Mumble to ignore all vectors. } // Begin context std::ostringstream ocontext; // Server name escape(server_name, sizeof(server_name)); if (strcmp(server_name, "") != 0) { ocontext << " {\"Server name\": \"" << server_name << "\"}"; // Set context with server name. } context = ocontext.str(); // End context // Begin identity std::wostringstream oidentity; oidentity << "{"; // Team escape(team, sizeof(server_name)); if (strcmp(team, "") != 0) { oidentity << std::endl << "\"Team\": \"" << team << "\","; // Set team name in identity. } // Squad if (squad > 0 && squad < 27) { // If squad value is between 1 and 26, set squad name in identity using RAF (1917) Phonetic alphabet. // Squad name if (squad == 1) oidentity << std::endl << "\"Squad\": \"Apples\","; else if (squad == 2) oidentity << std::endl << "\"Squad\": \"Butter\","; else if (squad == 3) oidentity << std::endl << "\"Squad\": \"Charlie\","; else if (squad == 4) oidentity << std::endl << "\"Squad\": \"Duff\","; else if (squad == 5) oidentity << std::endl << "\"Squad\": \"Edward\","; else if (squad == 6) oidentity << std::endl << "\"Squad\": \"Freddy\","; else if (squad == 7) oidentity << std::endl << "\"Squad\": \"George\","; else if (squad == 8) oidentity << std::endl << "\"Squad\": \"Harry\","; else if (squad == 9) oidentity << std::endl << "\"Squad\": \"Ink\","; else if (squad == 10) oidentity << std::endl << "\"Squad\": \"Johnnie\","; else if (squad == 11) oidentity << std::endl << "\"Squad\": \"King\","; else if (squad == 12) oidentity << std::endl << "\"Squad\": \"London\","; else if (squad == 13) oidentity << std::endl << "\"Squad\": \"Monkey\","; else if (squad == 14) oidentity << std::endl << "\"Squad\": \"Nuts\","; else if (squad == 15) oidentity << std::endl << "\"Squad\": \"Orange\","; else if (squad == 16) oidentity << std::endl << "\"Squad\": \"Pudding\","; else if (squad == 17) oidentity << std::endl << "\"Squad\": \"Queenie\","; else if (squad == 18) oidentity << std::endl << "\"Squad\": \"Robert\","; else if (squad == 19) oidentity << std::endl << "\"Squad\": \"Sugar\","; else if (squad == 20) oidentity << std::endl << "\"Squad\": \"Tommy\","; else if (squad == 21) oidentity << std::endl << "\"Squad\": \"Uncle\","; else if (squad == 22) oidentity << std::endl << "\"Squad\": \"Vinegar\","; else if (squad == 23) oidentity << std::endl << "\"Squad\": \"Willie\","; else if (squad == 24) oidentity << std::endl << "\"Squad\": \"Xerxes\","; else if (squad == 25) oidentity << std::endl << "\"Squad\": \"Yellow\","; else if (squad == 26) oidentity << std::endl << "\"Squad\": \"Zebra\","; // Squad leader if (squad_leader == 1) oidentity << std::endl << "\"Squad leader\": true"; // If squad leader value is true, set squad leader state to "True" in identity. else oidentity << std::endl << "\"Squad leader\": false"; // If squad leader value is false, set squad leader state to "False" in identity. // When not in a squad } else { oidentity << std::endl << "\"Squad\": null,"; // If squad value isn't between 1 and 26, set squad to "null" in identity. oidentity << std::endl << "\"Squad leader\": null"; // If not in a squad, set squad leader state to "null" in identity. } oidentity << std::endl << "}"; identity = oidentity.str(); // End identity // Flip the front vector for (int i=0;i<3;i++) { camera_front[i] = -camera_front[i]; } // Convert from right to left handed avatar_pos[0] = -avatar_pos[0]; camera_pos[0] = -camera_pos[0]; camera_front[0] = -camera_front[0]; camera_top[0] = -camera_top[0]; // Sync avatar front and top vectors with camera ones for (int i=0;i<3;i++) { avatar_front[i] = camera_front[i]; avatar_top[i] = camera_top[i]; } return true; } static int trylock(const std::multimap &pids) { if (! initialize(pids, L"bf1.exe")) { // Retrieve game executable's memory address return false; } // Check if we can get meaningful data from it float apos[3], afront[3], atop[3], cpos[3], cfront[3], ctop[3]; std::wstring sidentity; std::string scontext; if (fetch(apos, afront, atop, cpos, cfront, ctop, scontext, sidentity)) { return true; } else { generic_unlock(); return false; } } static const std::wstring longdesc() { return std::wstring(L"Supports Battlefield 1 with context and identity support."); // Plugin long description } static std::wstring description(L"Battlefield 1 version 1.0.49.52296"); // Plugin short description static std::wstring shortname(L"Battlefield 1"); // Plugin short name static int trylock1() { return trylock(std::multimap()); } static MumblePlugin bf1plug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 bf1plug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &bf1plug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &bf1plug2; } mumble-1.3.4/plugins/ql/0000775000175000017500000000000014010707273014736 5ustar builderbuildermumble-1.3.4/plugins/ql/ql.cpp0000664000175000017500000001465014010707273016064 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "../mumble_plugin_win32.h" // Include standard plugin header. #include "../mumble_plugin_utils.h" // Include plugin header for special functions, like "escape". static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &context, std::wstring &identity) { for (int i=0;i<3;i++) { avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; } // Boolean values to check if game addresses retrieval is successful and if player is in-game bool ok, state, spec; // Create containers to stuff our raw data into, so we can convert it to Mumble's coordinate system float avatar_pos_corrector[3], camera_pos_corrector[3], avatar_front_corrector[3], avatar_top_corrector[3]; // Char values for extra features char host[22], servername[50], map[30]; // Team BYTE team; // Peekproc and assign game addresses to our containers, so we can retrieve positional data ok = peekProc(pModule + 0x0188248, &state, 1) && // Magical state value: 1 when in-game and 0 when in main menu. peekProc(pModule + 0x1041CAC, &spec, 1) && // Spectator state value: 1 when spectating and 0 when playing. peekProc(pModule + 0x0EB8950, avatar_pos_corrector, 12) && // Avatar Position values (X, Z and Y, respectively). peekProc(pModule + 0x0E6093C, camera_pos_corrector, 12) && // Camera Position values (X, Z and Y, respectively). peekProc(pModule + 0x0EC5B50, avatar_front_corrector, 12) && // Avatar front values (X, Z and Y, respectively). peekProc(pModule + 0x0EC5B68, avatar_top_corrector, 12) && // Avatar top values (X, Z and Y, respectively). peekProc(pModule + 0x0E4A638, host) && // Server value: "IP:Port" when in a remote server, "loopback" when on a local server. peekProc(pModule + 0x106E24B, servername) && // Server name. peekProc(pModule + 0x12DE8D8, map) && // Map name. peekProc(pModule + 0x106CE6C, team); // Team value: 0 when in a FFA game (no team); 1 when in Red team; 2 when in Blue team; 3 when in Spectators. if (! ok) { return false; } if (! state) { // If not in-game context.clear(); // Clear context identity.clear(); // Clear identity return true; // This results in all vectors beeing zero which tells Mumble to ignore them. } if (state && spec) { // If in-game as spectator // Set to 0 avatar and camera values. for (int i=0;i<3;i++) { avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f; } // Set team to SPEC. std::wostringstream oidentity; oidentity << "{\"team\": \"SPEC\"}"; identity = oidentity.str(); return true; // This results in all vectors beeing zero which tells Mumble to ignore them. } // Begin context escape(host, sizeof(host)); std::ostringstream ocontext; ocontext << " {"; if (strcmp(host, "") != 0 && strstr(host, "loopback") == NULL) { // Only include host (IP:Port) if it is not empty and does not include the string "loopback" (which means it's a local server). ocontext << "\"Host\": \"" << host << "\""; // Set host address in identity. } else { ocontext << "\"Host\": null"; } ocontext << "}"; context = ocontext.str(); // End context // Begin identity std::wostringstream oidentity; oidentity << "{"; // Map escape(map, sizeof(map)); if (strcmp(map, "") != 0) { oidentity << std::endl; oidentity << "\"Map\": \"" << map << "\","; // Set map name in identity. } else { oidentity << std::endl << "\"Map\": null,"; } // Team if (team <= 3) { if (team == 0) oidentity << std::endl << "\"Team\": \"FFA\""; // If team value is 0, set "FFA" as team in identity. if (team == 1) oidentity << std::endl << "\"Team\": \"Red\""; // If team value is 1, set "Red" as team in identity. if (team == 2) oidentity << std::endl << "\"Team\": \"Blue\""; // If team value is 2, set "Blue" as team in identity. if (team == 3) oidentity << std::endl << "\"Team\": \"Spectators\""; // If team value is 3, set "Spectators" as team in identity. } else { oidentity << std::endl << "\"Team\": null"; } oidentity << std::endl << "}"; identity = oidentity.str(); // End identity /* Mumble | Game X | X Y | Z Z | Y */ avatar_pos[0] = avatar_pos_corrector[0]; avatar_pos[1] = avatar_pos_corrector[2]; avatar_pos[2] = avatar_pos_corrector[1]; camera_pos[0] = camera_pos_corrector[0]; camera_pos[1] = camera_pos_corrector[2]; camera_pos[2] = camera_pos_corrector[1]; avatar_front[0] = avatar_front_corrector[0]; avatar_front[1] = avatar_front_corrector[2]; avatar_front[2] = avatar_front_corrector[1]; avatar_top[0] = avatar_top_corrector[0]; avatar_top[1] = avatar_top_corrector[2]; avatar_top[2] = avatar_top_corrector[1]; // Scale to meters for (int i=0;i<3;i++) { camera_front[i] = avatar_front[i]; camera_top[i] = avatar_top[i]; avatar_pos[i]/=70.0f; camera_pos[i]/=70.0f; } return true; } static int trylock(const std::multimap &pids) { if (! initialize(pids, L"quakelive_steam.exe")) { // Retrieve game executable's memory address return false; } // Check if we can get meaningful data from it float apos[3], afront[3], atop[3], cpos[3], cfront[3], ctop[3]; std::wstring sidentity; std::string scontext; if (fetch(apos, afront, atop, cpos, cfront, ctop, scontext, sidentity)) { return true; } else { generic_unlock(); return false; } } static const std::wstring longdesc() { return std::wstring(L"Supports Quake Live version 1069 with context and identity support."); // Plugin long description } static std::wstring description(L"Quake Live (v1069)"); // Plugin short description static std::wstring shortname(L"Quake Live"); // Plugin short name static int trylock1() { return trylock(std::multimap()); } static MumblePlugin qlplug = { MUMBLE_PLUGIN_MAGIC, description, shortname, NULL, NULL, trylock1, generic_unlock, longdesc, fetch }; static MumblePlugin2 qlplug2 = { MUMBLE_PLUGIN_MAGIC_2, MUMBLE_PLUGIN_VERSION, trylock }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &qlplug; } extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() { return &qlplug2; } mumble-1.3.4/plugins/ql/ql.pro0000664000175000017500000000050014010707273016067 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = ql SOURCES = ql.cpp LIBS += -luser32 mumble-1.3.4/plugins/link/0000775000175000017500000000000014010707273015257 5ustar builderbuildermumble-1.3.4/plugins/link/link.cpp0000664000175000017500000001016214010707273016720 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef QT_NO_DEBUG #include #include #endif #include #include #include "../mumble_plugin.h" static std::wstring wsPluginName; static std::wstring wsDescription; struct LinkedMem { UINT32 uiVersion; DWORD dwcount; float fAvatarPosition[3]; float fAvatarFront[3]; float fAvatarTop[3]; wchar_t name[256]; float fCameraPosition[3]; float fCameraFront[3]; float fCameraTop[3]; wchar_t identity[256]; UINT32 context_len; unsigned char context[256]; wchar_t description[2048]; }; static void about(void *h) { ::MessageBox(reinterpret_cast(h), L"Reads audio position information from linked game", L"Mumble Link Plugin", MB_OK); } static HANDLE hMapObject = NULL; static LinkedMem *lm = NULL; static DWORD last_count = 0; static DWORD last_tick = 0; static void unlock() { lm->dwcount = last_count = 0; lm->uiVersion = 0; lm->name[0] = 0; wsPluginName.assign(L"Link"); wsDescription.clear(); } static int trylock() { if ((lm->uiVersion == 1) || (lm->uiVersion == 2)) { if (lm->dwcount != last_count) { last_count = lm->dwcount; last_tick = GetTickCount(); errno_t err = 0; wchar_t buff[2048]; if (lm->name[0]) { err = wcscpy_s(buff, 256, lm->name); if (! err) wsPluginName.assign(buff); } if (!err && lm->description[0]) { err = wcscpy_s(buff, 2048, lm->description); if (! err) wsDescription.assign(buff); } if (err) { wsPluginName.assign(L"Link"); wsDescription.clear(); return false; } return true; } } return false; } static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &context, std::wstring &identity) { if (lm->dwcount != last_count) { last_count = lm->dwcount; last_tick = GetTickCount(); } else if ((GetTickCount() - last_tick) > 5000) return false; if ((lm->uiVersion != 1) && (lm->uiVersion != 2)) return false; for (int i=0;i<3;++i) { avatar_pos[i]=lm->fAvatarPosition[i]; avatar_front[i]=lm->fAvatarFront[i]; avatar_top[i]=lm->fAvatarTop[i]; } if (lm->uiVersion == 2) { for (int i=0;i<3;++i) { camera_pos[i]=lm->fCameraPosition[i]; camera_front[i]=lm->fCameraFront[i]; camera_top[i]=lm->fCameraTop[i]; } if (lm->context_len > 255) lm->context_len = 255; lm->identity[255] = 0; context.assign(reinterpret_cast(lm->context), lm->context_len); identity.assign(lm->identity); } else { for (int i=0;i<3;++i) { camera_pos[i]=lm->fAvatarPosition[i]; camera_front[i]=lm->fAvatarFront[i]; camera_top[i]=lm->fAvatarTop[i]; } context.clear(); identity.clear(); } return true; } static const std::wstring getdesc() { return wsDescription; } BOOL WINAPI DllMain(HINSTANCE, DWORD fdwReason, LPVOID) { bool bCreated = false; switch (fdwReason) { case DLL_PROCESS_ATTACH: wsPluginName.assign(L"Link"); hMapObject = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, L"MumbleLink"); if (hMapObject == NULL) { hMapObject = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(LinkedMem), L"MumbleLink"); bCreated = true; if (hMapObject == NULL) return false; } lm = static_cast(MapViewOfFile(hMapObject, FILE_MAP_ALL_ACCESS, 0, 0, 0)); if (lm == NULL) { CloseHandle(hMapObject); hMapObject = NULL; return false; } if (bCreated) memset(lm, 0, sizeof(LinkedMem)); break; case DLL_PROCESS_DETACH: if (lm) { UnmapViewOfFile(lm); lm = NULL; } if (hMapObject) { CloseHandle(hMapObject); hMapObject = NULL; } break; } return true; } static std::wstring description(L"Link v1.2.0"); static MumblePlugin linkplug = { MUMBLE_PLUGIN_MAGIC, description, wsPluginName, about, NULL, trylock, unlock, getdesc, fetch }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &linkplug; } mumble-1.3.4/plugins/link/link-posix.cpp0000664000175000017500000001062614010707273020065 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include "../mumble_plugin.h" #include #include #include #include #include #include #include #include #include #include #include static std::wstring wsPluginName(L"Link"); static std::wstring wsDescription; static char memname[256]; struct LinkedMem { uint32_t uiVersion; uint32_t ui32count; float fAvatarPosition[3]; float fAvatarFront[3]; float fAvatarTop[3]; wchar_t name[256]; float fCameraPosition[3]; float fCameraFront[3]; float fCameraTop[3]; wchar_t identity[256]; uint32_t context_len; unsigned char context[256]; wchar_t description[2048]; }; /// Non-monotonic tick count in ms resolution static int64_t GetTickCount() { struct timeval tv; gettimeofday(&tv,NULL); return tv.tv_usec / 1000 + tv.tv_sec * 1000; } #define lm_invalid reinterpret_cast(-1) static struct LinkedMem *lm = lm_invalid; static int shmfd = -1; static int64_t last_tick = 0; static uint32_t last_count = 0; static void unlock() { lm->ui32count = last_count = 0; lm->uiVersion = 0; lm->name[0] = 0; wsPluginName.assign(L"Link"); wsDescription.clear(); } static int trylock() { if (lm == lm_invalid) return false; if ((lm->uiVersion == 1) || (lm->uiVersion == 2)) { if (lm->ui32count != last_count) { last_tick = GetTickCount(); last_count = lm->ui32count; wchar_t buff[2048]; if (lm->name[0]) { wcsncpy(buff, lm->name, 256); buff[255] = 0; wsPluginName.assign(buff); } if (lm->description[0]) { wcsncpy(buff, lm->description, 2048); buff[2047] = 0; wsDescription.assign(buff); } return true; } } return false; } static const std::wstring longdesc() { return wsDescription; } static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &context, std::wstring &identity) { if (lm->ui32count != last_count) { last_tick = GetTickCount(); last_count = lm->ui32count; } else if ((GetTickCount() - last_tick) > 5000) return false; if ((lm->uiVersion != 1) && (lm->uiVersion != 2)) return false; for (int i=0;i<3;++i) { avatar_pos[i]=lm->fAvatarPosition[i]; avatar_front[i]=lm->fAvatarFront[i]; avatar_top[i]=lm->fAvatarTop[i]; } if (lm->uiVersion == 2) { for (int i=0;i<3;++i) { camera_pos[i]=lm->fCameraPosition[i]; camera_front[i]=lm->fCameraFront[i]; camera_top[i]=lm->fCameraTop[i]; } if (lm->context_len > 255) lm->context_len = 255; lm->identity[255] = 0; context.assign(reinterpret_cast(lm->context), lm->context_len); identity.assign(lm->identity); } else { for (int i=0;i<3;++i) { camera_pos[i]=lm->fAvatarPosition[i]; camera_front[i]=lm->fAvatarFront[i]; camera_top[i]=lm->fAvatarTop[i]; } context.clear(); identity.clear(); } return true; } __attribute__((constructor)) static void load_plugin() { bool bCreated = false; snprintf(memname, 256, "/MumbleLink.%d", getuid()); shmfd = shm_open(memname, O_RDWR, S_IRUSR | S_IWUSR); if (shmfd < 0) { bCreated = true; shmfd = shm_open(memname, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR); } if (shmfd < 0) { fprintf(stderr,"Mumble Link plugin: error creating shared memory\n"); return; } if (bCreated) { if (ftruncate(shmfd, sizeof(struct LinkedMem)) != 0) { fprintf(stderr, "Mumble Link plugin: failed to resize shared memory\n"); close(shmfd); shmfd = -1; return; } } lm = static_cast( mmap(NULL, sizeof(struct LinkedMem), PROT_READ | PROT_WRITE, MAP_SHARED, shmfd,0)); if ((lm != lm_invalid) && bCreated) memset(lm, 0, sizeof(struct LinkedMem)); } __attribute__((destructor)) static void unload_plugin() { if (lm != lm_invalid) munmap(lm, sizeof(struct LinkedMem)); if (shmfd > -1) close(shmfd); shm_unlink(memname); } static std::wstring description(L"Link v1.2.0"); static MumblePlugin linkplug = { MUMBLE_PLUGIN_MAGIC, description, wsPluginName, NULL, NULL, trylock, unlock, longdesc, fetch }; extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() { return &linkplug; } mumble-1.3.4/plugins/link/link.pro0000664000175000017500000000064214010707273016740 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(../plugins.pri) TARGET = link win32 { SOURCES = link.cpp LIBS += -luser32 } unix { SOURCES = link-posix.cpp linux* { LIBS += -lrt } } mumble-1.3.4/overlay_gl/0000775000175000017500000000000014010707273015004 5ustar builderbuildermumble-1.3.4/overlay_gl/avail_mac.pl0000775000175000017500000000114214010707273017256 0ustar builderbuilder#!/usr/bin/perl # perl avail_mac.pl < overlay.c init_mac.c > avail_mac.h %funcs = (); while () { foreach (split(/([ \t])/, $_)) { @glfunc = ($_ =~ /(gl[A-VY-Z0-9][a-zA-Z0-9]+)/); foreach $func(@glfunc) { $funcs{$func} = 1; } } } print "#ifndef MUMBLE_OVERLAY_AVAIL_MAC_H__\n"; print "#define MUMBLE_OVERLAY_AVAIL_MAC_H__\n"; print "\n"; print "// This file was auto-generated by 'avail_mac.pl'. Do not touch by hand.\n"; print "\n"; print "#define AVAIL_ALL_GLSYM ( \\\n"; foreach my $key (sort keys %funcs) { print "\tAVAIL($key) && \\\n"; } print "\t1)\n"; print "\n"; print "#endif\n"; mumble-1.3.4/overlay_gl/init_unix.c0000664000175000017500000001422114010707273017156 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . // This file is included by overlay.c for // Unix/X11/GLX-specific overlay initialization. static void initializeLibrary(); #define RESOLVE(x) if (! o##x) o##x = (__typeof__(&x)) odlsym(RTLD_NEXT, #x) static void resolveOpenGL() { RESOLVE(glXSwapBuffers); if (! oglXSwapBuffers) { void *lib = dlopen("libGL.so.1", RTLD_GLOBAL | RTLD_NOLOAD); if (! lib) return; RESOLVE(glXSwapBuffers); if (! oglXSwapBuffers) { dlclose(lib); } } RESOLVE(glXGetProcAddressARB); RESOLVE(glXGetProcAddress); } __attribute__((visibility("default"))) void glXSwapBuffers(Display * dpy, GLXDrawable draw) { if (!oglXSwapBuffers) { resolveOpenGL(); } GLXContext ctx = glXGetCurrentContext(); Context *c = contexts; while (c) { if ((c->dpy == dpy) && (c->draw == draw)) break; c = c->next; } if (!c) { ods("Current context is: %p", ctx); c = (Context *) malloc(sizeof(Context)); if (!c) { ods("malloc failure"); return; } memset(c, 0, sizeof(Context)); c->next = contexts; c->dpy = dpy; c->draw = draw; c->bMesa = false; c->bValid = false; int major, minor; if (glXQueryVersion(dpy, &major, &minor)) { ods("GLX version %d.%d", major, minor); c->bValid = true; } const char *version = (const char *) glGetString(GL_VERSION); if (version) { ods("GL version string: %s", version); if (strstr(version, "Mesa") != NULL) { c->bMesa = true; } } contexts = c; newContext(c); } if (c->bValid) { int width, height; if (c->bMesa) { GLint viewport[4]; glGetIntegerv(GL_VIEWPORT, viewport); width = viewport[2]; height = viewport[3]; } else { glXQueryDrawable(dpy, draw, GLX_WIDTH, (GLuint*)&width); glXQueryDrawable(dpy, draw, GLX_HEIGHT, (GLuint*)&height); } drawContext(c, width, height); } oglXSwapBuffers(dpy, draw); } #define FGRAB(x) if (strcmp((const char *)(func), #x)==0) return (__GLXextFuncPtr)(x); __attribute__((visibility("default"))) void (*glXGetProcAddress(const GLubyte * func))(void) { FGRAB(glXSwapBuffers); FGRAB(glXGetProcAddressARB); FGRAB(glXGetProcAddress); if (!oglXGetProcAddressARB && !oglXGetProcAddress) { resolveOpenGL(); } if (oglXGetProcAddress) return oglXGetProcAddress(func); else if (oglXGetProcAddressARB) return oglXGetProcAddressARB(func); else return (__GLXextFuncPtr)(odlsym(RTLD_NEXT, (const char *)(func))); } __attribute__((visibility("default"))) __GLXextFuncPtr glXGetProcAddressARB(const GLubyte * func) { return (void (*)(void)) glXGetProcAddress(func); } #define OGRAB(name) if (handle == RTLD_DEFAULT) handle = RTLD_NEXT; symbol = odlsym(handle, #name); if (symbol) { o##name = (__typeof__(&name)) symbol; symbol = (void *) name;} __attribute__((visibility("default"))) void *dlsym(void *handle, const char *name) { if (!odlsym) { initializeLibrary(); } void *symbol; ods("Request for symbol %s (%p:%p)", name, handle, odlsym); if (strcmp(name, "glXSwapBuffers") == 0) { OGRAB(glXSwapBuffers); } else if (strcmp(name, "glXGetProcAddress") == 0) { OGRAB(glXGetProcAddress); } else if (strcmp(name, "glXGetProcAddressARB") == 0) { OGRAB(glXGetProcAddressARB); } else if (strcmp(name, "dlsym") == 0) { return (void *) dlsym; } else { symbol = odlsym(handle, name); } return symbol; } static int find_odlsym() { #if defined(__linux__) void *dl = dlopen("libdl.so.2", RTLD_LAZY); if (!dl) { ods("Failed to open libdl.so.2"); } else { int i = 0; struct link_map *lm = (struct link_map *) dl; int nchains = 0; ElfW(Sym) *symtab = NULL; const char *strtab = NULL; #if defined(__GLIBC__) const ElfW(Addr) base = 0; #else const ElfW(Addr) base = lm->l_addr; #endif ElfW(Dyn) *dyn = lm->l_ld; while (dyn->d_tag) { switch (dyn->d_tag) { case DT_HASH: nchains = *(int *)(base + dyn->d_un.d_ptr + 4); break; case DT_STRTAB: strtab = (const char *)(base + dyn->d_un.d_ptr); break; case DT_SYMTAB: symtab = (ElfW(Sym) *)(base + dyn->d_un.d_ptr); break; } dyn ++; } ods("Iterating dlsym table %p %p %d", symtab, strtab, nchains); for (i = 0; i < nchains; i++) { // ELF32_ST_TYPE and ELF64_ST_TYPE are the same if (ELF32_ST_TYPE(symtab[i].st_info) != STT_FUNC) { continue; } if (strcmp(strtab+symtab[i].st_name, "dlsym") == 0) { odlsym = (void*)lm->l_addr + symtab[i].st_value; } } if (odlsym == NULL) { goto err; } ods("Original dlsym at %p", odlsym); } return 0; #elif defined(__FreeBSD__) int i = 0; struct link_map *lm = NULL; int nchains = 0; Elf_Sym * symtab = NULL; const char *strtab = NULL; if (dlinfo(RTLD_SELF, RTLD_DI_LINKMAP, &lm) == -1) { ods("Unable to acquire link_map: %s", dlerror()); goto err; } while (lm != NULL) { if (!strcmp(lm->l_name, "/libexec/ld-elf.so.1")) { break; } lm = lm->l_next; } if (lm == NULL) { goto err; } Elf_Dyn *dyn = (Elf_Dyn *) lm->l_ld; while (dyn->d_tag) { switch (dyn->d_tag) { case DT_HASH: nchains = *(int *)((uintptr_t)lm->l_addr + (uintptr_t)dyn->d_un.d_ptr + 4); break; case DT_STRTAB: strtab = (const char *)((uintptr_t)lm->l_addr + (uintptr_t)dyn->d_un.d_ptr); break; case DT_SYMTAB: symtab = (Elf_Sym *)((uintptr_t)lm->l_addr + (uintptr_t)dyn->d_un.d_ptr); break; } dyn++; } ods("Iterating dsym table %p %p %d", symtab, strtab, nchains); for (i = 0; i < nchains; i++) { if (ELF_ST_TYPE(symtab[i].st_info) != STT_FUNC) { continue; } if (strcmp(strtab + symtab[i].st_name, "dlsym") == 0) { odlsym = (void *) lm->l_addr + symtab[i].st_value; } } if (odlsym == NULL) { goto err; } ods("Original dlsym at %p", odlsym); return 0; #endif err: return -1; } __attribute__((constructor)) static void initializeLibrary() { if (odlsym) return; if (getenv("MUMBLE_OVERLAY_DEBUG")) { bDebug = true; } else { bDebug = false; } bCursorAvail = false; ods("Mumble overlay library loaded"); if (find_odlsym() == -1) { ods("Failed to find original address of dlsym()."); } } mumble-1.3.4/overlay_gl/avail_mac.h0000664000175000017500000000346614010707273017102 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_OVERLAY_AVAIL_MAC_H__ #define MUMBLE_OVERLAY_AVAIL_MAC_H__ // This file was auto-generated by 'avail_mac.pl'. Do not touch by hand. #define AVAIL_ALL_GLSYM ( \ AVAIL(glActiveTexture) && \ AVAIL(glAttachShader) && \ AVAIL(glBindBuffer) && \ AVAIL(glBindTexture) && \ AVAIL(glBlendFunc) && \ AVAIL(glColorMaterial) && \ AVAIL(glCompileShader) && \ AVAIL(glCreateProgram) && \ AVAIL(glCreateShader) && \ AVAIL(glDeleteTextures) && \ AVAIL(glDisable) && \ AVAIL(glDisableClientState) && \ AVAIL(glDisableVertexAttribArray) && \ AVAIL(glDrawArrays) && \ AVAIL(glEnable) && \ AVAIL(glEnableClientState) && \ AVAIL(glEnableVertexAttribArray) && \ AVAIL(glGenTextures) && \ AVAIL(glGetBooleanv) && \ AVAIL(glGetError) && \ AVAIL(glGetIntegerv) && \ AVAIL(glGetShaderInfoLog) && \ AVAIL(glGetString) && \ AVAIL(glGetTexParameterfv) && \ AVAIL(glGetUniformLocation) && \ AVAIL(glGetVertexAttribiv) && \ AVAIL(glIsTexture) && \ AVAIL(glLinkProgram) && \ AVAIL(glLoadIdentity) && \ AVAIL(glMatrixMode) && \ AVAIL(glOrtho) && \ AVAIL(glPixelStorei) && \ AVAIL(glPopAttrib) && \ AVAIL(glPopClientAttrib) && \ AVAIL(glPopMatrix) && \ AVAIL(glPushAttrib) && \ AVAIL(glPushClientAttrib) && \ AVAIL(glPushMatrix) && \ AVAIL(glRenderMode) && \ AVAIL(glShaderSource) && \ AVAIL(glTexCoordPointer) && \ AVAIL(glTexEnvi) && \ AVAIL(glTexImage2D) && \ AVAIL(glTexParameterfv) && \ AVAIL(glTexParameteri) && \ AVAIL(glTexSubImage2D) && \ AVAIL(glUniform1i) && \ AVAIL(glUseProgram) && \ AVAIL(glVertexPointer) && \ AVAIL(glViewport) && \ 1) #endif mumble-1.3.4/overlay_gl/overlay_gl.pro0000664000175000017500000000257714010707273017704 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . # Overlay payload for Unix-like systems and OS X. include(../qmake/compiler.pri) TEMPLATE = lib CONFIG -= qt gui CONFIG *= debug_and_release VERSION = 1.3.3 SOURCES = overlay.c CONFIG(static) { CONFIG -= static } unix:!macx { TARGET = mumble$(TARGET_ADD) DEFINES += TARGET_UNIX linux* { LIBS *= -lrt -ldl } QMAKE_CFLAGS *= -fvisibility=hidden $(CFLAGS_ADD) QMAKE_LFLAGS -= -Wl,--no-undefined QMAKE_LFLAGS -= -Wl,-z,now QMAKE_LFLAGS += -Wl,-z,lazy QMAKE_LFLAGS *= $(LFLAGS_ADD) equals(QMAKE_LINK,g++) { QMAKE_LINK = gcc QMAKE_LINK_SHLIB = gcc } } macx { CONFIG *= x86_64 x86 plugin CONFIG(universal) { CONFIG *= ppc } TARGET = mumbleoverlay$(TARGET_ADD) DEFINES += TARGET_MAC QMAKE_CFLAGS *= -x objective-c QMAKE_CFLAGS *= $(CFLAGS_ADD) QMAKE_LFLAGS_PLUGIN *= -undefined dynamic_lookup -dynamic QMAKE_LFLAGS += -framework CoreFoundation QMAKE_LFLAGS += $(LFLAGS_ADD) QMAKE_INFO_PLIST = overlay_gl.plist INCLUDEPATH *= ../3rdparty/mach-override-src LIBS *= -lmach-override } DESTDIR = $$DESTDIR$(DESTDIR_ADD) QMAKE_LIBDIR = $$DESTDIR $$QMAKE_LIBDIR include(../qmake/symbols.pri) mumble-1.3.4/overlay_gl/overlay.c0000664000175000017500000004447114010707273016643 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #define GLX_GLXEXT_LEGACY #define GL_GLEXT_PROTOTYPES #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if defined(TARGET_UNIX) # define GLX_GLXEXT_LEGACY # define GL_GLEXT_PROTOTYPES # define _GNU_SOURCE # include # include # include #include typedef unsigned char bool; # define true 1 # define false 0 #elif defined(TARGET_MAC) # include # include # include # include # # include # # include "mach_override.h" # # include "avail_mac.h" #endif #include "../overlay/overlay.h" static bool bDebug = false; static bool bCursorAvail = false; typedef struct _Context { struct _Context *next; #if defined(TARGET_UNIX) Display *dpy; GLXDrawable draw; #elif defined(TARGET_MAC) CGLContextObj cglctx; NSOpenGLContext *nsctx; #endif unsigned int uiWidth, uiHeight; unsigned int uiLeft, uiRight, uiTop, uiBottom; struct sockaddr_un saName; int iSocket; // overlay message, temporary variable for processing from socket struct OverlayMsg omMsg; // opengl overlay texture GLuint texture; // overlay texture in shared memory unsigned char *a_ucTexture; unsigned int uiMappedLength; bool bValid; bool bMesa; GLuint uiProgram; clock_t timeT; unsigned int frameCount; GLint maxVertexAttribs; GLboolean* vertexAttribStates; } Context; static const char vshader[] = "" "void main() {" "gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;" "gl_TexCoord[0] = gl_MultiTexCoord0;" "}"; static const char fshader[] = "" "uniform sampler2D tex;" "void main() {" "gl_FragColor = texture2D(tex, gl_TexCoord[0].st);" "}"; const GLfloat fBorder[] = {0.125f, 0.250f, 0.5f, 0.75f}; static Context *contexts = NULL; #define AVAIL(name) dlsym(RTLD_DEFAULT,#name) #define FDEF(name) static __typeof__(&name) o##name = NULL #if defined(TARGET_UNIX) FDEF(dlsym); FDEF(glXSwapBuffers); FDEF(glXGetProcAddressARB); FDEF(glXGetProcAddress); #elif defined(TARGET_MAC) FDEF(CGLFlushDrawable); FDEF(CGDisplayHideCursor); FDEF(CGDisplayShowCursor); #endif __attribute__((format(printf, 1, 2))) static void ods(const char *format, ...) { if (! bDebug) { return; } fprintf(stderr, "MumbleOverlay: "); va_list args; va_start(args, format); vfprintf(stderr, format, args); va_end(args); fprintf(stderr, "\n"); fflush(stderr); } static void newContext(Context * ctx) { ctx->iSocket = -1; ctx->omMsg.omh.iLength = -1; ctx->texture = ~0U; ctx->timeT = clock(); ctx->frameCount = 0; char *home = getenv("HOME"); if (home == NULL) { struct passwd *pwent= getpwuid(getuid()); if (pwent && pwent->pw_dir && pwent->pw_dir[0]) { home = pwent->pw_dir; } } char *xdgRuntimeDir = getenv("XDG_RUNTIME_DIR"); if (xdgRuntimeDir != NULL) { ctx->saName.sun_family = PF_UNIX; strcpy(ctx->saName.sun_path, xdgRuntimeDir); strcat(ctx->saName.sun_path, "/MumbleOverlayPipe"); } else if (home) { ctx->saName.sun_family = PF_UNIX; strcpy(ctx->saName.sun_path, home); strcat(ctx->saName.sun_path, "/.MumbleOverlayPipe"); } ods("OpenGL Version %s, Vendor %s, Renderer %s, Shader %s", glGetString(GL_VERSION), glGetString(GL_VENDOR), glGetString(GL_RENDERER), glGetString(GL_SHADING_LANGUAGE_VERSION)); const char *vsource = vshader; const char *fsource = fshader; char buffer[8192]; GLint l; GLuint vs = glCreateShader(GL_VERTEX_SHADER); GLuint fs = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(vs, 1, &vsource, NULL); glShaderSource(fs, 1, &fsource, NULL); glCompileShader(vs); glCompileShader(fs); glGetShaderInfoLog(vs, 8192, &l, buffer); ods("VERTEX: %s", buffer); glGetShaderInfoLog(fs, 8192, &l, buffer); ods("FRAGMENT: %s", buffer); ctx->uiProgram = glCreateProgram(); glAttachShader(ctx->uiProgram, vs); glAttachShader(ctx->uiProgram, fs); glLinkProgram(ctx->uiProgram); glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &ctx->maxVertexAttribs); ctx->vertexAttribStates = calloc((size_t) ctx->maxVertexAttribs, sizeof(GLboolean)); } static void releaseMem(Context *ctx) { if (ctx->a_ucTexture) { munmap(ctx->a_ucTexture, ctx->uiMappedLength); ctx->a_ucTexture = NULL; ctx->uiMappedLength = 0; } if (ctx->texture != ~0U) { glDeleteTextures(1, &ctx->texture); ctx->texture = ~0U; } ctx->uiLeft = ctx->uiTop = ctx->uiRight = ctx->uiBottom = 0; } static void disconnect(Context *ctx) { releaseMem(ctx); ctx->uiWidth = ctx->uiHeight = 0; if (ctx->iSocket != -1) { close(ctx->iSocket); ctx->iSocket = -1; } ods("Disconnected"); } static bool sendMessage(Context *ctx, struct OverlayMsg *om) { if (ctx->iSocket != -1) { size_t wantsend = sizeof(struct OverlayMsgHeader) + (size_t)om->omh.iLength; ssize_t sent = send(ctx->iSocket, om, wantsend, MSG_DONTWAIT); if (sent != -1 && wantsend == (size_t)sent) { return true; } ods("Short write. Disconnecting pipe."); } disconnect(ctx); return false; } static void regenTexture(Context *ctx) { if (ctx->texture != ~0U) { glDeleteTextures(1, & ctx->texture); } glGenTextures(1, &ctx->texture); glBindTexture(GL_TEXTURE_2D, ctx->texture); glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, fBorder); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)ctx->uiWidth, (GLsizei)ctx->uiHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, ctx->a_ucTexture); } static void drawOverlay(Context *ctx, unsigned int width, unsigned int height) { // if no socket is active, initialize and connect to socket if (ctx->iSocket == -1) { releaseMem(ctx); if (! ctx->saName.sun_path[0]) return; ctx->iSocket = socket(AF_UNIX, SOCK_STREAM, 0); if (ctx->iSocket == -1) { ods("socket() failure"); return; } fcntl(ctx->iSocket, F_SETFL, O_NONBLOCK, 1); if (connect(ctx->iSocket, (struct sockaddr *)(& ctx->saName), sizeof(ctx->saName)) != 0) { close(ctx->iSocket); ctx->iSocket = -1; ods("connect() failure %s", ctx->saName.sun_path); return; } ods("Socket connected"); struct OverlayMsg om; om.omh.uiMagic = OVERLAY_MAGIC_NUMBER; om.omh.uiType = OVERLAY_MSGTYPE_PID; om.omh.iLength = sizeof(struct OverlayMsgPid); om.omp.pid = (unsigned int)getpid(); // getpid can't fail if (!sendMessage(ctx, &om)) return; ods("SentPid"); } // if overlay size (width or height) is not up-to-date create and send an overlay initialization message if ((ctx->uiWidth != width) || (ctx->uiHeight != height)) { ods("Sending init overlay msg with w h %i %i", width, height); releaseMem(ctx); ctx->uiWidth = width; ctx->uiHeight = height; struct OverlayMsg om; om.omh.uiMagic = OVERLAY_MAGIC_NUMBER; om.omh.uiType = OVERLAY_MSGTYPE_INIT; om.omh.iLength = sizeof(struct OverlayMsgInit); om.omi.uiWidth = ctx->uiWidth; om.omi.uiHeight = ctx->uiHeight; if (! sendMessage(ctx, &om)) return; } // receive and process overlay messages while (1) { if (ctx->omMsg.omh.iLength < 0) { // receive the overlay message header ssize_t length = recv(ctx->iSocket, ctx->omMsg.headerbuffer, sizeof(struct OverlayMsgHeader), 0); if (length < 0) { if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) break; disconnect(ctx); return; } else if (length != sizeof(struct OverlayMsgHeader)) { ods("Short header read on overlay message"); disconnect(ctx); return; } } else { // receive the overlay message body ssize_t length = recv(ctx->iSocket, ctx->omMsg.msgbuffer, (size_t)ctx->omMsg.omh.iLength, 0); if (length < 0) { if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) break; disconnect(ctx); return; } else if (length != ctx->omMsg.omh.iLength) { ods("Short overlay message read %x %zd/%d", ctx->omMsg.omh.uiType, length, ctx->omMsg.omh.iLength); disconnect(ctx); return; } // set len to -1 again for a clean state on next receive ctx->omMsg.omh.iLength = -1; switch (ctx->omMsg.omh.uiType) { // shared memory overlay message: case OVERLAY_MSGTYPE_SHMEM: { struct OverlayMsgShmem *oms = (struct OverlayMsgShmem *) & ctx->omMsg.omi; ods("SHMEM %s", oms->a_cName); releaseMem(ctx); int fd = shm_open(oms->a_cName, O_RDONLY, 0600); if (fd != -1) { struct stat buf; if (fstat(fd, &buf) != -1) { unsigned int buflen = buf.st_size; if (buflen >= ctx->uiWidth * ctx->uiHeight * 4 && buflen < 512 * 1024 * 1024) { ctx->uiMappedLength = buflen; ctx->a_ucTexture = mmap(NULL, (size_t)buflen, PROT_READ, MAP_SHARED, fd, 0); if (ctx->a_ucTexture != MAP_FAILED) { // mmap successfull; send a new bodyless sharedmemory overlay message and regenerate the overlay texture struct OverlayMsg om; om.omh.uiMagic = OVERLAY_MAGIC_NUMBER; om.omh.uiType = OVERLAY_MSGTYPE_SHMEM; om.omh.iLength = 0; if (! sendMessage(ctx, &om)) return; regenTexture(ctx); continue; } ctx->a_ucTexture = NULL; } ctx->uiMappedLength = 0; } else { ods("Failed to fstat memory map"); } close(fd); } ods("Failed to map memory"); } break; // blit overlay message: blit overlay texture from shared memory to gl-texture var case OVERLAY_MSGTYPE_BLIT: { struct OverlayMsgBlit *omb = & ctx->omMsg.omb; ods("BLIT %d %d %d %d", omb->x, omb->y, omb->w, omb->h); if ((ctx->a_ucTexture != NULL) && (ctx->texture != ~0U)) { glBindTexture(GL_TEXTURE_2D, ctx->texture); if ((omb->x == 0) && (omb->y == 0) && (omb->w == ctx->uiWidth) && (omb->h == ctx->uiHeight)) { ods("Optimzied fullscreen blit"); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)ctx->uiWidth, (GLsizei)ctx->uiHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, ctx->a_ucTexture); } else { // allocate temporary memory unsigned int x = omb->x; unsigned int y = omb->y; unsigned int w = omb->w; unsigned int h = omb->h; unsigned char *ptr = (unsigned char *) malloc(w*h*4); unsigned int row; memset(ptr, 0, w * h * 4); // copy overlay texture to temporary memory to adapt to full opengl ui size (overlay at correct place) for (row = 0; row < h; ++row) { const unsigned char *sptr = ctx->a_ucTexture + 4 * ((y+row) * ctx->uiWidth + x); unsigned char *dptr = ptr + 4 * w * row; memcpy(dptr, sptr, w * 4); } // copy temporary texture to opengl glTexSubImage2D(GL_TEXTURE_2D, 0, (GLint)x, (GLint)y, (GLint)w, (GLint)h, GL_BGRA, GL_UNSIGNED_BYTE, ptr); free(ptr); } } } break; case OVERLAY_MSGTYPE_ACTIVE: { struct OverlayMsgActive *oma = & ctx->omMsg.oma; ods("ACTIVE %d %d %d %d", oma->x, oma->y, oma->w, oma->h); ctx->uiLeft = oma->x; ctx->uiTop = oma->y; ctx->uiRight = oma->x + oma->w; ctx->uiBottom = oma->y + oma->h; } break; case OVERLAY_MSGTYPE_INTERACTIVE: { #if defined(TARGET_MAC) struct OverlayMsgInteractive *omin = & ctx->omMsg.omin; ods("Interactive %d", omin->state); if (bCursorAvail) { if (omin->state) { oCGDisplayHideCursor(kCGNullDirectDisplay); } else { oCGDisplayShowCursor(kCGNullDirectDisplay); } } #endif } break; default: break; } } } if ((ctx->a_ucTexture == NULL) || (ctx->texture == ~0U)) return; // texture checks, that our gltexture is still valid and sane if (! glIsTexture(ctx->texture)) { ctx->texture = ~0U; ods("Lost texture"); regenTexture(ctx); } else { glBindTexture(GL_TEXTURE_2D, ctx->texture); GLfloat bordercolor[4]; glGetTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, bordercolor); if (bordercolor[0] != fBorder[0] || bordercolor[1] != fBorder[1] || bordercolor[2] != fBorder[2] || bordercolor[3] != fBorder[3]) { ods("Texture was hijacked! Texture will be regenerated."); regenTexture(ctx); } } glBindTexture(GL_TEXTURE_2D, ctx->texture); glPushMatrix(); float w = (float)(ctx->uiWidth); float h = (float)(ctx->uiHeight); float left = (float)(ctx->uiLeft); float top = (float)(ctx->uiTop); float right = (float)(ctx->uiRight); float bottom = (float)(ctx->uiBottom); float xm = left / w; float ym = top / h; float xmx = right / w; float ymx = bottom / h; GLfloat vertex[] = { left, bottom, left, top, right, top, left, bottom, right, top, right, bottom }; glVertexPointer(2, GL_FLOAT, 0, vertex); GLfloat tex[] = { xm, ymx, xm, ym, xmx, ym, xm, ymx, xmx, ym, xmx, ymx }; glTexCoordPointer(2, GL_FLOAT, 0, tex); glDrawArrays(GL_TRIANGLES, 0, 6); glPopMatrix(); } static void drawContext(Context * ctx, int width, int height) { // calculate FPS and send it as an overlay message clock_t t = clock(); float elapsed = (float)(t - ctx->timeT) / CLOCKS_PER_SEC; ++(ctx->frameCount); if (elapsed > OVERLAY_FPS_INTERVAL) { struct OverlayMsg om; om.omh.uiMagic = OVERLAY_MAGIC_NUMBER; om.omh.uiType = OVERLAY_MSGTYPE_FPS; om.omh.iLength = sizeof(struct OverlayMsgFps); om.omf.fps = (float)ctx->frameCount / elapsed; sendMessage(ctx, &om); ctx->frameCount = 0; ctx->timeT = t; } GLuint program; GLint viewport[4]; int i; glPushAttrib(GL_ALL_ATTRIB_BITS); glPushClientAttrib(GL_ALL_ATTRIB_BITS); glGetIntegerv(GL_VIEWPORT, viewport); glGetIntegerv(GL_CURRENT_PROGRAM, (GLint *)&program); glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glOrtho(0, width, height, 0, -100.0, 100.0); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glMatrixMode(GL_TEXTURE); glPushMatrix(); glLoadIdentity(); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glDisable(GL_ALPHA_TEST); glDisable(GL_AUTO_NORMAL); // Skip clip planes, there are thousands of them. glDisable(GL_COLOR_LOGIC_OP); glDisable(GL_COLOR_TABLE); glDisable(GL_CONVOLUTION_1D); glDisable(GL_CONVOLUTION_2D); glDisable(GL_CULL_FACE); glDisable(GL_DEPTH_TEST); glDisable(GL_DITHER); glDisable(GL_FOG); glDisable(GL_HISTOGRAM); glDisable(GL_INDEX_LOGIC_OP); glDisable(GL_LIGHTING); glDisable(GL_NORMALIZE); // Skip line smmooth // Skip map glDisable(GL_MINMAX); // Skip polygon offset glDisable(GL_SEPARABLE_2D); glDisable(GL_SCISSOR_TEST); glDisable(GL_STENCIL_TEST); GLboolean b = 0; glGetBooleanv(GL_TEXTURE_GEN_Q, &b); if (b) glDisable(GL_TEXTURE_GEN_Q); glGetBooleanv(GL_TEXTURE_GEN_R, &b); if (b) glDisable(GL_TEXTURE_GEN_R); glGetBooleanv(GL_TEXTURE_GEN_S, &b); if (b) glDisable(GL_TEXTURE_GEN_S); glGetBooleanv(GL_TEXTURE_GEN_T, &b); if (b) glDisable(GL_TEXTURE_GEN_T); glRenderMode(GL_RENDER); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_NORMAL_ARRAY); glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_INDEX_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_EDGE_FLAG_ARRAY); glPixelStorei(GL_UNPACK_SWAP_BYTES, 0); glPixelStorei(GL_UNPACK_LSB_FIRST, 0); glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); glPixelStorei(GL_UNPACK_SKIP_ROWS, 0); glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); GLint texunits = 1; glGetIntegerv(GL_MAX_TEXTURE_UNITS, &texunits); for (i=texunits-1;i>=0;--i) { glActiveTexture(GL_TEXTURE0 + (GLenum)i); glDisable(GL_TEXTURE_1D); glDisable(GL_TEXTURE_2D); glDisable(GL_TEXTURE_3D); } glDisable(GL_TEXTURE_CUBE_MAP); glDisable(GL_VERTEX_PROGRAM_ARB); glDisable(GL_FRAGMENT_PROGRAM_ARB); GLint enabled; for (i=0;imaxVertexAttribs;++i) { enabled = GL_FALSE; glGetVertexAttribiv((GLuint)i, GL_VERTEX_ATTRIB_ARRAY_ENABLED, &enabled); if (enabled == GL_TRUE) { glDisableVertexAttribArray((GLuint)i); ctx->vertexAttribStates[i] = GL_TRUE; } } glUseProgram(ctx->uiProgram); glEnable(GL_COLOR_MATERIAL); glEnable(GL_TEXTURE_2D); glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glMatrixMode(GL_MODELVIEW); GLint uni = glGetUniformLocation(ctx->uiProgram, "tex"); glUniform1i(uni, 0); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); GLuint bound = 0, vbobound = 0; glGetIntegerv(GL_PIXEL_UNPACK_BUFFER_BINDING, (GLint *)&bound); glGetIntegerv(GL_ARRAY_BUFFER_BINDING, (GLint *)&vbobound); if (bound != 0) { glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, 0); } if (vbobound != 0) { glBindBuffer(GL_ARRAY_BUFFER, 0); } drawOverlay(ctx, (unsigned int)width, (unsigned int)height); if (bound != 0) { glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, bound); } if (vbobound != 0) { glBindBuffer(GL_ARRAY_BUFFER, vbobound); } for (i=0;imaxVertexAttribs;++i) { if (ctx->vertexAttribStates[i] == GL_TRUE) { glEnableVertexAttribArray((GLuint)i); ctx->vertexAttribStates[i] = GL_FALSE; } } glMatrixMode(GL_TEXTURE); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glPopMatrix(); glMatrixMode(GL_PROJECTION); glPopMatrix(); glPopClientAttrib(); glPopAttrib(); glViewport(viewport[0], viewport[1], viewport[2], viewport[3]); glUseProgram(program); // drain opengl error queue while (glGetError() != GL_NO_ERROR); } #if defined(TARGET_UNIX) # include "init_unix.c" #elif defined(TARGET_MAC) # include "init_mac.c" #endif mumble-1.3.4/overlay_gl/init_mac.c0000664000175000017500000001227514010707273016742 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . // This file is included by overlay.c for // Mac-specific overlay initialization. @implementation NSOpenGLContext (MumbleOverlay) - (void) overlayFlushBuffer { ods("[NSOpenGLContext flushBuffer] %p %p", self, [self CGLContextObj]); Context *c = contexts; while (c) { if (c->nsctx == self && c->cglctx == [self CGLContextObj]) break; c = c->next; } if (!c) { ods("Current context is: %p", self); c = malloc(sizeof(Context)); if (!c) { ods("malloc failure"); return; } c->next = contexts; c->nsctx = (NSOpenGLContext *)self; c->cglctx = (CGLContextObj)[self CGLContextObj]; contexts = c; newContext(c); } NSView *v = [c->nsctx view]; int width = 0, height = 0; if (v) { NSRect r = [v bounds]; width = (int)r.size.width; height = (int)r.size.height; } else { if (AVAIL(CGMainDisplayID)) { CGDirectDisplayID md = CGMainDisplayID(); if (CGDisplayIsCaptured(md)) { width = CGDisplayPixelsWide(md); height = CGDisplayPixelsHigh(md); } } if (!width && !height) { GLint viewport[4]; glGetIntegerv(GL_VIEWPORT, viewport); width = viewport[2]; height = viewport[3]; } } drawContext(c, width, height); [self overlayFlushBuffer]; } @end void CGLFlushDrawableOverride(CGLContextObj ctx) { ods("CGLFlushDrawableOverride %p", ctx); Context *c = contexts; /* Sometimes, we can get a FlushDrawable where the current context is NULL. * Also, check that the context CGLFlushDrawable was called on is the active context. * If it isn't, who knows what context we're drawing on? * * Maybe we should even use CGLSetCurrentContext() to switch to the context that's being * flushed? */ CGLContextObj current = CGLGetCurrentContext(); if (current == NULL || ctx != current) goto skip; while (c) { if (c->cglctx == ctx) { /* There is no NSOpenGLContext for this CGLContext, so we should draw. */ if (c->nsctx == NULL) break; /* This context is coupled with a NSOpenGLContext, so skip. */ else goto skip; } c = c->next; } if (!c) { ods("Current context is: %p", ctx); c = malloc(sizeof(Context)); if (!c) { ods("malloc failure"); return; } memset(c, 0, sizeof(Context)); c->next = contexts; c->cglctx = ctx; c->nsctx = NULL; contexts = c; newContext(c); } int width = 0, height = 0; if (AVAIL(CGMainDisplayID)) { CGDirectDisplayID md = CGMainDisplayID(); if (CGDisplayIsCaptured(md)) { width = CGDisplayPixelsWide(md); height = CGDisplayPixelsHigh(md); } } if (!width && !height) { GLint viewport[4]; glGetIntegerv(GL_VIEWPORT, viewport); width = viewport[2]; height = viewport[3]; /* Are the viewport values crazy? Skip them in that case. */ if (height < 0 || width < 0 || height > 5000 || width > 5000) goto skip; } drawContext(c, width, height); skip: oCGLFlushDrawable(ctx); } CGError CGDisplayShowCursorOverride(CGDirectDisplayID display) { ods("CGDisplayShowCursor()"); return oCGDisplayShowCursor(display); } CGError CGDisplayHideCursorOverride(CGDirectDisplayID display) { ods("CGDisplayHideCursor()"); return oCGDisplayHideCursor(display); } __attribute__((constructor)) static void initializeLibrary() { struct stat buf; bDebug = (stat("/Library/Application Support/.mumble_overlay_debug", &buf) == 0); ods("!"); void *nsgl = NULL, *cgl = NULL; nsgl = dlsym(RTLD_DEFAULT, "NSClassFromString"); cgl = dlsym(RTLD_DEFAULT, "CGLFlushDrawable"); /* Check for GL symbol availability */ if (!(AVAIL_ALL_GLSYM)) { ods("Missing GL symbols. Disabling overlay."); return; } /* NSOpenGL */ if (nsgl) { ods("Attempting to hook NSOpenGL"); Class c = NSClassFromString(@"NSOpenGLContext"); if (c) { Method orig = class_getInstanceMethod(c, @selector(flushBuffer)); Method new = class_getInstanceMethod(c, @selector(overlayFlushBuffer)); if (class_addMethod(c, @selector(flushBuffer), method_getImplementation(new), method_getTypeEncoding(new))) class_replaceMethod(c, @selector(overlayFlushBuffer), method_getImplementation(orig), method_getTypeEncoding(orig)); else method_exchangeImplementations(orig, new); } } /* CGL */ if (AVAIL(CGLFlushDrawable)) { ods("Attempting to hook CGL"); if (mach_override_ptr(dlsym(RTLD_DEFAULT, "CGLFlushDrawable"), CGLFlushDrawableOverride, (void **) &oCGLFlushDrawable) != 0) { ods("CGLFlushDrawable override failed."); } else ods("Up running."); } else { ods("Required entry points not available in process. Not hooking up overlay."); } if (AVAIL(CGDisplayHideCursor) && AVAIL(CGDisplayShowCursor)) { if (mach_override_ptr(dlsym(RTLD_DEFAULT, "CGDisplayHideCursor"), CGDisplayHideCursorOverride, (void **) &oCGDisplayHideCursor) != 0) { ods("CGDisplayHideCursor override failed"); } if (mach_override_ptr(dlsym(RTLD_DEFAULT, "CGDisplayShowCursor"), CGDisplayShowCursorOverride, (void **) &oCGDisplayShowCursor) != 0) { ods("CGDisplayShowCursor override failed"); } ods("Hooked CGDisplayShowCursor and CGDisplayHideCursor"); bCursorAvail = true; } } mumble-1.3.4/overlay_gl/overlay_gl.plist0000664000175000017500000000054314010707273020226 0ustar builderbuilder CFBundlePackageType FMWK CFBundleSignature OLAY CFBundleExecutable MumbleOverlay mumble-1.3.4/README.md0000664000175000017500000000507714010707273014131 0ustar builderbuilderMumble - A voice chat utility for gamers ======================================= [![Build Status](https://dev.azure.com/Mumble-VoIP/Mumble/_apis/build/status/Mumble-CI?branchName=master)](https://dev.azure.com/Mumble-VoIP/Mumble/_build/latest?definitionId=1?branchName=master) > *http://mumble.info/* > *#mumble on freenode* Mumble is a voicechat program for gamers written on top of Qt and Opus. There are two modules in Mumble; the client (mumble) and the server (murmur). The client works on Win32/64, Linux and Mac OS X, while the server should work on anything Qt can be installed on. Note that when we say Win32, we mean Windows XP or newer. ## Running Mumble On Windows, after installation, you should have a new Mumble folder in your Start Menu, from which you can start Mumble. On Mac OS X, to install Mumble, drag the application from the downloaded disk image into your `/Applications` folder. Once Mumble is launched, you need a server to connect to. Either create your own or join a friend's. ## Running Murmur on Unix-like systems Murmur should be run from the command line, so start a shell (command prompt) and go to wherever you installed Mumble. Run murmur as ``` murmurd [-supw ] [-ini ] [-fg] [v] -supw Set a new password for the user SuperUser, which is hardcoded to bypass ACLs. Keep this password safe. Until you set a password, the SuperUser is disabled. If you use this option, murmur will set the password in the database and then exit. -ini Use an inifile other than murmur.ini, use this to run several instances of murmur from the same directory. Make sure each instance is using a separate database. -fg Run in the foreground, logging to standard output. -v More verbose logging. ``` ## Running Murmur on Mac OS X Murmur is distributed separately from the Mumble client on Mac OS X. It is called Static OS X Server and can be downloaded from the main webpage. Once downloaded it can be run in the same way as on any other Unix-like system. For more information please see the 'Running Murmur on Unix-like systems' above. ## Running Murmur on Win32 Doubleclick the Murmur icon to start murmur. There will be a small icon on your taskbar from which you can view the log. To set the superuser password, run murmur with the parameters `-supw `. ## Bandwidth usage Mumble will use 10-40 kbit/s outgoing, and the same incoming for each user. So if there are 10 other users on the server with you, your incoming bandwidth requirement will be 100-400 kbit/s if they all talk at the same time. mumble-1.3.4/overlay_winx64/0000775000175000017500000000000014010707273015541 5ustar builderbuildermumble-1.3.4/overlay_winx64/mumble_ol.rc0000664000175000017500000000242414010707273020044 0ustar builderbuilder// Copyright 2005-2021 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include #ifndef DEBUG #define VER_DEBUG 0L #else #define VER_DEBUG VS_FF_DEBUG #endif #ifdef SNAPSHOT_BUILD #define VER_RELEASE VS_FF_SPECIALBUILD|VS_FF_PRERELEASE #else #define VER_RELEASE 0L #endif VS_VERSION_INFO VERSIONINFO FILEVERSION 1,3,4,0 PRODUCTVERSION 1,3,4,0 FILEFLAGSMASK VS_FFI_FILEFLAGSMASK FILEFLAGS (VER_DEBUG|VER_RELEASE) FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_DLL FILESUBTYPE 0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904E4" BEGIN VALUE "CompanyName", "The Mumble Developers" VALUE "FileDescription", "Mumble - Low-latency VoIP client" VALUE "FileVersion", "1.3.4" VALUE "ProductVersion", "1.3.4" VALUE "LegalCopyright", "Copyright (c) 2005-2021 The Mumble Developers" VALUE "OriginalFilename", "mumble_ol_x64.dll" VALUE "ProductName", "Mumble" #ifdef SNAPSHOT_BUILD VALUE "SpecialBuild", "Snapshot development release" #endif END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1252 END END mumble-1.3.4/overlay_winx64/overlay_winx64.pro0000664000175000017500000000055414010707273021167 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . CONFIG += force-x86_64-toolchain VPATH = ../overlay TARGET = mumble_ol_x64 include(../overlay/overlay-shared.pro) mumble-1.3.4/overlay_winx64/overlay_exe_winx64/0000775000175000017500000000000014010707273021302 5ustar builderbuildermumble-1.3.4/overlay_winx64/overlay_exe_winx64/overlay_exe.rc0000664000175000017500000000243314010707273024154 0ustar builderbuilder// Copyright 2005-2021 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include #ifndef DEBUG #define VER_DEBUG 0L #else #define VER_DEBUG VS_FF_DEBUG #endif #ifdef SNAPSHOT_BUILD #define VER_RELEASE VS_FF_SPECIALBUILD|VS_FF_PRERELEASE #else #define VER_RELEASE 0L #endif VS_VERSION_INFO VERSIONINFO FILEVERSION 1,3,4,0 PRODUCTVERSION 1,3,4,0 FILEFLAGSMASK VS_FFI_FILEFLAGSMASK FILEFLAGS (VER_DEBUG|VER_RELEASE) FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_APP FILESUBTYPE 0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904E4" BEGIN VALUE "CompanyName", "The Mumble Developers" VALUE "FileDescription", "Mumble - Low-latency VoIP client" VALUE "FileVersion", "1.3.4" VALUE "ProductVersion", "1.3.4" VALUE "LegalCopyright", "Copyright (c) 2005-2021 The Mumble Developers" VALUE "OriginalFilename", "mumble_ol_helper_x64.exe" VALUE "ProductName", "Mumble" #ifdef SNAPSHOT_BUILD VALUE "SpecialBuild", "Snapshot development release" #endif END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1252 END END mumble-1.3.4/overlay_winx64/overlay_exe_winx64/overlay_exe_winx64.pro0000664000175000017500000000062514010707273025570 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . CONFIG += force-x86_64-toolchain VPATH = ../../overlay/overlay_exe TARGET = mumble_ol_helper_x64 include(../../overlay/overlay_exe/overlay_exe-shared.pro) mumble-1.3.4/icons/0000775000175000017500000000000014010707273013754 5ustar builderbuildermumble-1.3.4/icons/mumble.icns0000664000175000017500000114357514010707273016133 0ustar builderbuildericns}TOC hic10}ic09ԗic14ԗic08Yiic13Yiic07'>ic12il32 ;ic11is32cl8mks8mkic10}PNG  IHDR+IDATx ]ӽE41S^5 %<CD[-]jPE5]Bј B* uc+kkٟ9~szCB!B!G@!B!@!B!4B!BH@!B!4B!BH@!B!4B!BH@!B!4B!BH@!B!4B!BH@!B!4B!BH@!B!4B!BH@!B!4B!BH@!B!4B!BH@!B!4B!BH@!B!4B!BH@!B!4B!BH@!B!4B!BH@!B!4B!BH@!B!4B!BH@!B!4B!BH@!B!4B!BH@!B!4B!BH@!B!4B!BH@!B!4B!BH@!B!4B!BH@!B!4B!BH@!B!4B!BH@!B!4B!BH@!B!4B!BH@!B!4B!BH@!B!4B!BH@!B!4B!BH@!B!4B!BH@!B!4B!BH@!B!4B!BH@!B!4B!BH@!B!4B!BH@!B!4B!BH@!B!4B!BH@!B!4B!BH@!B!4B!BH@!B!4BHYa}ֲW |u;]{3Z˧ӌ[B!TBH~,-]ek>[Wc`nZ__Zu0/[?[?YkeWm-ﶖwr>vB! Bf׻[ZJeֲhxD;O^2c2|Zmaky]#/ !*CB5CeֲAkZmaO0 wю&xZhB! D(,ю& DPB!E@BH uD;a%1 Abk,hB94!TZVm-ۈv!>0RyP`RkZn-+)BHe@! 3[˶=bF$E GF B4! nﶖeIA[+SB!&4!_/Z(??<;=s?_}zn-ϵQ)4B!ABH{v!o}Pk-+A_ufa@=@ ahG E BH3@!$ T?^e%Q}]Cc1ż?L43g,0{DAOC! 5|}VE$w^\UgX`9խ.z4̀/c hcBH*hBΏ>(2 |q,䒽Em\p^5mg(@mg>eʔ)~8cyS3 6BH@!$RCCc1*rK,!ou1-D^e)[Uc]Y b!Ă!=ZVeSQp~%!1a=||CBJ+uoD@[@j7;lwnA`! 4!nў_ȃQB"bۜI~Wf@;x/^PbPGr`!ABߦq>1Kq_7;!C 1S@E8hGPBɟ$!$Y~}o5o+\E>+^!UEyOv́qƉ~;ghBG!R_ W!W&q>D>~ "}L"gz吏z)_~9P@E!?b  5˿{k rW /5D U5p}%UEnVdE 򬄼tD `z4Pf@ɢf?vFBH(BH؏ENWAPUB_ZKڏ$=<]V"6Y}HPiT=eA.$SBI B"\~PfrAȇdM:B?uY^s?Omx0` $I!Pff͚%oKE!TgA!ͦ[$]AE>?nW^yey:ymcJj@QAmY )4JDi4!B -rGo~*Ї|J*]ż#% EQyq4 P)6.0P`pڴiE CBʅӟW-0T_aH3UݿOM}|* bbqHj J N0 Z4!tA!'sџ4_o~3$mn|Ob9._y>_Yا1@3@u%p[PAR"? zWKTn}Fg}?i(F$1}Wnj#\g'@3B BɏLE9U!ӷIRvߧO2_اLQ'e@1cFhBH lY m-瞻3֞O$w>~Va>M)`c:7C`ʔ)NAt @@Lo-k- y9!4 8!$E[Zc~TwJY~$?Nk:,a |@Ϗ|0Qt̀r]kBHBf,-iVbg[/YN.@PDk1BoL!u# B~Zi- q\я|W6;jnSJMY0ݡ LGmf=CtULЅ0.M !pDB!j-E;y_;+15I}QbyC@ȣ`HoC ItR\jdZ=y)!ԅ(!$?lۭetkSf}3[%h e6)%,fAQzSB:9BH eߢ.*E?_T$@|/i!| W @T̀y!!T<!f~/t?RBPQ !deZh!9K,g]~1 Pȯ&i!b i|:u׿'uN!4oA!_?*<_~"!ѲoM7-5˟Y hY4.IM̀S`0=h7 h O]g!1ˏeV gV?w.-|<;47 S !6G6z)qwnHH/c !p4BiS~?f1պf)AB_T˾<}<}ϴ}_ߦEm| ~'|R/rv9F Y!"!$9ݢ=ߝf' ,:ۯrfil2,ZqKQJ"(YgZ!g6q}ᇝD0\Ze&R8!wOߏh2?`Cx6nu{d-}OS6I60fY/ >LL6- T!uhJ8[W]gU Uրig޿0b~Q9DtBH?b ?tD~EY$TCNo_F_ϼt1(Z8QQh'VGvz,߄B!tl"G,䏂~{?(̢|Y~»*D$EߦO|3w@DxCˡV BjAsFZ.)!^ziѧOmT>/䒙䒧 %$}}Y+| YGy[j'S@ 817 R5EJ07?#-S !} yP{_^@f@).sj%H#R93 ԝnA/b_X?r7{YEGw,WgnWWm02|GSQ!tv+;@n?Z,?aY`J3۟c?>Jl貝_?(3 ?P#G 0+BH)TEIwᏊah᧊)G%"e%ʐZ Fm H"#=`uhBJ G-Rߏ0 G~E"8O7}; c i <̀$)JP'`h#9!$!,t[$/_|ťAf~?K@[g*wJd79LI_ ` YHMEP:4! BHYmXkY$gKY wmN~?COrq^SV_دz$@)P_d]?jYD8Lh-gȄRP#lI&?Nѳy,s:Ye?ζYi6Q> ԑ.!e%GK/(m obϻ;sity]j> s}l! (** ~;pI&eBkX G#XTe&ߏ"04Yg-*XDB=_3 V@Ok7N @@D ԁ&!UA _U#_02y]^!w|^6 }QUm1 \| *ԀQYBB\ZUA?*"]#|?n Xm|EIuN@F6&dsB)ȁR[˅ %],P'?J(ZgU+$X~>WD1@:f􀼍`FFE>BB?4 ub& 9۟[W_LWX~Q6EyGPb#`h#|\3 dI<eYoue7 Rm3xA2aDɪ ]^IkP3#!n ?>mDOt X ̕8Wu^PD ,e /fӾ.l[d6CLN}O^4p5\G}YTT@Tz@F.N0B>!$%B-+o~:L"s6LGgt{u *%J\(UFEoVy^&L.a^}U5 )0uB_sD i9Rc 1k,)p}`H>c}j 7PBnXylY,w␗lVPQsxG`2iҤ^k]cs1}e6/Xt#n `w }z;n q2|&G*@Exf4DL>|찁h!XG0E<O` <9?Q?u*_x K/əiӦ8ԘxP(ѯ}Q6odr!@qH+)V::/KG􍹽jf"l PLWnc@zΩJ xn,^}1D=zL @z >7L G)1oCcM6>fK*9A'NO<&s1^~?l=m!ź+ ">^1jH!Vz ń į~+qWFaQ.)H(]fغXsF  >Tt~ TIՌo]\}PFx!pC1 E߀ ,빦 5ˏ&"a/Brk vD8@TؿKοnq/[lyL7G/}IIb+C{ eD1¢lz$RFH'}p'N@Fg}&MS0- !DY=^Z|[?B1o EQ?,_V[&=LfqN2gmqCr ӄ#FA 6@7Ro\_Y .@vifT_)AP$ 5i>`uTeu >0m60;%Tz!ȟsuYa&mۨc߯;vRƀ~L;hq1jfr05_<$)2,?RPnS\̀(-5 *L03L#@}F[N" @-V)P=}lIs1 ۿΓO>)#l:Dxhþ%4i6(wQ>TǢD{".{L_Wm/xgy汚A>mT$R"B}sQGz I9c9F+^'nwF@~*!R@v 0?Y>]U% $ "EY/r<3?(O#mۺ?1}%)њ3f̰Ͳ+w7#s1B]}Uvۉ?2X?$A^_|bXQc- &K}jĵփ²09v$Du JQƀ.]iEҠvw5pBY\k<G(a}mLSBH@HsO#3(?nsaەE~*0D1cJΪU7oDƭo3 uZ/l?l?0 zz:O?]̓4(R 0hGA0 (@=-?]pBd H18묳 cZ[0h E~*3JX* [gVJC|Epnzzzī*>PX} MUwOR/Nο*i5j};&Bhwꩧv>[Jp)nmQPX +4\PTp={vF#G3gΜ e ! !&vk?5[??Z_|9T{ĉKBX6ݟ- &?_P$։@#<"6h^K.'pBчԫ.@w+ HonOL\oYHCj|^|I;$1nFi@ z- 94'ZaK"(wGX?zֿяE TqN0Œ{'n긊6e5?*ܮ,&L:bqa}Hl &05SLqmkj.B :R[#{փK:g}.HsVf<@q 7w D|dYIcEE$5lAXGu]W^`^!55L&[PWZuƤI| dmBj B ?`"Z?6O7 @a /y1mڴ95{f)PBq2dېoC ~N[=b , K-8T7oy%]M7TַAZ=}H;# ".3BH tv.1ַ%g=MaF$/[71 BQcNJɓ';r [?oڬ 1\ԬG}$ī*-MDa)qQK:"b zɈad1 "(liKH Aj !o@Cc 6# r!E׵?fxI:դ@al!C}=\q'}8 E~A`F "Z1 1@X$@PDZn;N': 1.m}AKhxꩧx.3BH :jZ)T?G7<AӨYm q[E~n3寽XuUz>F#E 7 Nwa5tmKZۋe]~z@=um\ D4̙3xsmB* BPўw*6Z1_p u"8/G>dT_᩶oa71/))hJ`w}bw,ppe]"vi'JFU}Ԁ6@P@D;% )94)7wj믊!Y]D?nLbpɣF8OLXjG DAwAq#y?, γ:7tz?' cч4\ z ?IP0lZk%v}w-V$P$FkE:,k ϵh-|rpW1X3g?p1`yYE҄(4fE;UPTiĿ) %uadMׁo: fꫯ}HV$P#˵ɖ`v)d첋Q5dum\\GoQO&;@ !%!C1Xb}%@yapj Pɵ-UP@Uc6 7gM l)bOw}zS>3iXc +}H|fTKHzAXQש0c&WE4{-VYeuV&M|7 $ \t0ro]\TqDY4Ę8G?Iif]G+b4a_o쳏\,ZLX[(3 (%g=uXk-" *%3=vN 206R&NKhGL3BHzhRԬ`fAYf}fU?bt(g,U@7jDT`7Qr-rfOۑfd@wp1̴u`T@oM\f]fW6c  wg0 ۧΓO>).9:s"`> %`BAj- BAPAf1-9/ƍK' 7=8] U?Y^nqx- !@ %;AmXͺ,q("8?L˙xnt} KQ/f!/Wm?n?0C1F],2IW$"lMs뭷=ܳ#A#z_. %C@ .au`   fw4lawqRf͚G-6oW_}{n BE ?B1|2=2}06o0G6&D\ >n{,:#.bAiآm|[q$]Y[e(:oF ,hc63`3Rtk1m3A 0Ydqmݶ_hE7XhsjxFkcGwh/vWԆz{?%BESϼv̪!byquמQ?H;sg:hV7_=nuf]w]K/}HB$^V0IgA'}=h=nq.Whܮ"h[@)} B1hA ~fs-@?f&l.yqf@="Wb=LGf?v;EY뭷x>Rb8@T= #@KJH% (k 6zj'5O'8l . zH' u^H#BH44oƘ?>z? p ~UGv?ʬ@*|T;e* 1L1upހYGX6 .&o[|I'$~i5qMѣGvH 0O:\cG`h-lC1dP zC@ |A;?eضq/v\(۔U L;"!~qnTVEsWF_]I&J3cD?pm.pvAh†n({a]8mԵg4ZntЯA$vzEH%K[~6 h0%G"B e%@  JhwiӦyqYjzο[Y/hVo/i4 a6>lчTil& 8jfZW] * 6 [m83:/d@o=m|hebK kP<#*o ݭ6-B!(:?YuC?jf)J{ۨٞϰ\4}%b_=s,hdu_$`@k6KnĮK.[7 $%if7D9KtH&* $Zap"aY 므Wa(v83kٕAKΧ-Ef}_lvr@'6xc1vآViz[hk8`5MayzubVmmz:@{FSH @@˽*&;" $9Z3# }?NԾl]gG>;O* ymVhow]zDf"F~k$t XyCMuy>MJy?n4w1kL"U !)@H2珐 !pqGȿ?OŒK.6|$!fչQvss6;Vw54g 'ehj(g= 3DF*mXT/fW]uUga&t1_cBl`?qByWS0P'Ifqu[@O:dlA͉mF|7 ;3Ɖ3mac}r饗v=k,E4@)AQ`ĉ>Z@ iwDH@H<돜PRqEQ}8'/@9b؎U8aM۪|x衇[ L7 wdM6cƌ)Cwz\@'*,蚢a~cbo!2\>m}j) %8 B܁0j#/|rw$@W_}U|rw?3a3L-d3nο)J @r@C6t9q5H 0'TCv=I' `vPIYy*|숐Ch0?8jCC?"z?Z!]Y!?OĤI]|\435au?,G4 pV #,y}A;Aur8"4lǮyҘH 83G}5ܞZ0EiwBHݡ@H8Ε8{ &O,N;&<!ڭ ! $Jz?9BjO ' /Ige\ffj 2̙ j裏-Bh-:0 da5⤙[1bVL6MvA`qfmc{ߨ OTJ/oQ9rנ8 v]Bq]]]2_(ϢПmX!2SO9a3u}s'b l&F=?@ 7\h4M 0k1]wQBڣ֑w]wK0{lY=o}_Y 2e\R@9A?C+#yz?C/RY|'C:!|/rq5Dggd>Cqf.\M3 j¿$bA7L]A3"FEg 0ׯx5+轃uYQH ;b!qjm ;C^?(*_y21Nfc ĝy w @!o, "  veH_c5my^ z{FS~ H_`g>V.a6 *V"Zo,t@=R-j63%dq~  0?\އmioжe PP/b<' !Ui:]-6 k)- /sYZg֣mly_]0ԿNY;[mA^LK ЯI6ר2\gxU0 |Qu`"| ">䓴*=Há@Le*9À.o"C+u\  +g Ͱ j3f~Wh4GP4.5jQb<,^G+Gx* `{o|HRuYI TE[;?f 1g<h_tI'>yJ3Cm``~L8GD !UiN ϵǂןC ٮȥNAo ~UkZk%VXaB ɨ Ya4g}3ߛG]fm?\!=ru[[},(5\u\ & tJi fTV[cXTWԶEsw@$;! M° 0?Pm'_ݏ[w T˿bvc.s ~KXUo..qbw/#s='_}뀔]=Pч 0Н%.xw / &>EĄ0[FkzL%@_W ', = hAmLqƉۣKԩSKZF !eiD{??P XnaR"-UA:ɨcS*rUmv,MJ ^z4۴ 13I L3@-UE0 Fp5ԛcУkvq=n5믯+_|QGIC*4ڼKbצ@ߨN=Cʅ8@Qf.R`xh6_Wc$H ?BUX<1X|.ζ)Q) 8 `vP{jxhGR;h:$QEtp G?[PG'__Wxr,踣LGT.n~@ſ-O/؟8W_,RX]6ᯋ:j(~[Z?w(Kѧ0 N{-#BY y |e4?_q΁0c_~|n_| @HpB?@.O7sq:J0"Wif.z؅n\se=yC믿.VYe wPخVs9EZ!¶sω__#솓u]&0JfLm`BR*E6 _pBۇ:'PT\zbС0 7u.4ڠB ~}0o;,瞢1h("&r:ujчV)gq7ug]?ILN8a̙3ӜfDx!NjHpG5fq*G:f‰+$ͩ &kJ@T.P0@~ ?PSLzEȃG)޹_A6 6oD@~tki&S(;h @oW6o>5oM3 h@TCWWXtvY%1;(cTO\LoQw]\hc6<\ףILk- R6'P| }ՠ̉Y*1zEENaL4I,rB@5 z{k>Rs7v"$(z]ve1m!6}4G %)H4K/-Yf\lzHQ$v .ܯ4`GTU߽KvmEN. p5ׄNSO=%1yZz&л, o3gLs{MR"h2a?OOo:H 9A.~n& 6mUB$ǘEnu2nviHo|I&ȿ@ s}OLB|AHBtz.%QoEU'@?GX:ߤ7뭷Eӧ_4 6RK*I:hTD7h^3dqeu= ae&&!@rzK*1B?83İa # _ʃg5`a>˜ȷ pXkf$) ' f\sMo=H(_FzYA%n;1zhAf=U!ELhnuB 2~]EA@$yĺ+4hA+s\`@۷\ߖ~QTcч M0kl7fIV[MrXj#l@&@P }& fāɓ.e-W&h _G.H=nemo~rN_ z/\ERxe[[v Jl=Wv@7 ?ksLk-[ $'hzA zUW8/|jXkU>|S?Pgϖ皳$mw^J+uסO>#"ÁnɅ@OhR /st|A7HcLHiIw@+4H`d}mk#hSiY0o޷\J5lǥI.L 2Dq<MeڴibEuho":Jhoɓe1aD!/z)n(j@\`ܸqE-&Q`!. y?8yG(ꩧZ*pY0 z^f^{ B;ܯ?O? /\"sBMT{%tfoI{6(6 `_ Zof?Ih4H k-=W^Y,B>?®?|K:+;, pO7XQmO "߿AoɅ @Q c}HK/ _w6 kĉY.j-'!a Y2TY" ? K[\k2cGl5MgpQGJ- , "v;4Я,[{;a:Ag /X<}dZF!6h,@TK,D?Ñ/BB9qꫯ dPAf]M7HA$>{p믿Ʌ$u?~,Hl\!^M:K3׶H@J@ PWht @wGqDa߶\j K/u]W4@0aC<}0i0k,1|=8C'~WOSq9}H3l0qrMu/JWڏ@&E#: 0!1@|6@-SycוpWt5TF 쿋7mWeToNҡz_@Q2,FՂu0l Z@J&",ULm`ZC!jG/83ekѿſ/UEڤ VQk /}U?_~;SįPP F(8acU4} $~:t4zzO $..pA!c.f˻(o7H8WE!>l d$kn̞=T; l?A" 2uTb&_Q-)FhCVU/{pa#F}8(wIwq+, c2AзqMqt}[9Zˉiv@ HVߩ*Zk܋+O{E'wwMz^7.o &C 2k wM0L /oG4ZFi64H[m"~(ֿſU@ |h2C (OoEi4=@+kɅ< E[ࠃ7pCчTK-z$f5.bi\#3HI\htE;eY_v0 z^'vMy睢xA_gih2{n4>\(P;zJlENb饗v6f;bƌI\; ͅID?f60?*Nr7Yb裏-Bi?Ko< ASlh?_~=#B] \aB\O~3Y@ޒ2Ť I@Р'rcywk i? MF}C^_6|scCKh6{pGÇ}8PVQ*{OC!Sٳzb&my>ꏣǦL"( qq1a{m`ӧ8Zk%]O z{q%k]яI&G@'ZR"f1w}NGSlcW]uUч e6y~mDK}+/,\sMژ oΧ =w1O?4y Eŏ@I,չ#u],Bzϰu_?V-BQ@EiAB@POx⢋R=rHqƲU pYg<"0k֬D^( q<#QRVbso{]Ŀ˾g!2G{9Do2 ^٦h6{pNJEN.TPqdS JAs&HCg2"I)߈TE@yU_ 9#N9ſ~\4h4=8ĕW^YB X\^Y%PI]P /7^5"P[]#/BqI'1 O>:U3 7xcQyڴiIO=:ŤTcJfXk .[?Sſ~n`<^[% 1>0"c.R f0/'`(|2P .£>*b +J.J e3@EG=ԓTI^ +QE*]o߾o\s8* 뮎Dh4=/.첢'd uzq"bd&@YTXI4_V~UgD2,uUa„ bV:_E7 M@}}|},Ф֐:hxuurf(QGk[E BPQ+~60a|yզK<ԹI@xV[muUwq Nn}8A٨~ɅI]+.>?NnYʹ..yto $EђQ磏>@BPH`ůnIéދٞKd\O:A{q衇z}ŨQzAMſhh2{P\zEN.HԵr̘1bM6):#^|EUܸ&@;- JdT, #Ié`hk0I!<z<*WIs'|r&QfN;4$ k7? 0G fCI>o z+#΂ .(f̘!׳2Ծmce1|tI!5HH$[gyvءSD d_*%:w?矟[nEr=P'4p K.)prI@Ϩ_ jmn3 ˢjӎTzfI\B͢`喓3U/DpAn!*#*Mo9M@Ќ'xBlfrw!@*yGGECTzj+Yy*g{.MEPvn{lvbљ_Xxŧ~*ugC]=ln`͆@]?2_SN9Ν믿^ 4HgmM,;dQVp?Nz{4lIyf?wq,yu? b$6|scuW_|4h4hgVc '>6 xF9E`sLHȉ墤/&եޣ[DWky^#z!"ve6eRſ`Lu]'ף3uDګ) ͆m?5aHks+z^Ȼ(z, k@wB BjҌQ.сGѿnۓ_h:mᆽ*z.ue .s5Wn[y9LSĿYih2{_\veEN.ϯ]DMaws\Ϻo,|#ҕLyl̙3@BPI_LIsFD1K/-Yf};S6↓yyŲ.{ /P .ya3$|뭷v#4F}?xq}8@7s%`$kfAzOۺ~?m|4S>q[=DuX`By y#f-BZf)O~RH:s=e@QT  6~߱>;I< @"K0MPc7/  XRc>n߾};<&!\By}Uu5M?d(VҵW_}U_o $@@GE*@m\xmU @x>eQ@\D;E4$dB!| 0׻wovizȿ4ܟ !㭷ޚ 6rmA;3qYNfPmca7tS֧ $!E]&NN^Ip}D3<44 &_ Rt=O'U_8@@ $Tͫm/排gYhh@"H"ML3ڪ!y;c~{Ty/Æ c=X֧*;vd~i}:-61{l6rȬO'3H6wpnO'H0CK/F`#(`Ѐ3f/7ߌ34 t}3/gqІ{٨QK6UC5ȩ_[`vcsTC*ڮzuy O"JET?1) F ڈAH% 6Zvg}:S4@Z0< #F(8\6mDx4iR4bYM7ݔB@ $T;o*@m̜97.I" D=' ﳕ+W^fD,q}3-Ű^SjdY?$!i* o9[t)n+ Fo `h7p;vl֧:E@ܢy;3` ./#wqI24 Q@cainݺgA)HTQ@Gn+$@@!ڼ 6n&v1d}:S <\K=,G@FpcjS"XV ! GD8Ue /c޿UQr-[o穳 -PmCabH*@m4771cd}:Sd؈q C믿a;j$&xFXx(C0M?ޛW7U{Ͽ[ox >OVHhj#~#GdgtR3D~T(T i)"Q'RC,^xB7xcvE5 OjȿO?穳ۊhzYUH6w*wyg֧ $QBe@^w*'|S^p}3>Ŵf (CG>yDC۲ =Uz^{5>OVHhj#~#F`wuW֧ $Qgd|p9n=4 4y?wHWע&j媍0á6dY>h T]۷/[hn+U H6$PW!"CWHSV^r0<="ңMhM/0E.]fmV_B?Su_~_mH6wpᇳ;ImjIi(r*>CKLVM6|{`o~;6FῼW9_u(_mE >CB@;s=YN*`hw;C>)PTKhaDB-j`~qo!#?lcWc<*OSgZ ڈެO'H0C9s氃:(I2 ಯL '[_dz˗7C=TT13 F9r0Jr^BiȿT]8p ?穳 -PmH6B|x1?xQyI$4 `…3hXGGԦ]L$O9rssm-)\6 * w*_|S\sjHrY9lcNXSSS}!G @mS/*[wޙ=|:T}+ F\*@m<|hQ <\14`uiqSiD,qCDR)ǰf1cưCRȡU* _穳 -Pm`<׻ m3Dk>) `zl~=bZ; 8 R>Kh u֍u޽ &v\> w)gz_t.駟mH6AaEy f?_QĭT8 0vX*O| G9نp?}l-H_Vq fO<n+$ jDP޲ڲAm/U*p1ҋ o"3 ,aT0w).YK?ma믿~}P6_f_|* C Wn+Mu]lĈYNfUEQ=@UL,`hO>$c=>ԩi Yx?pLS#z ܔeP]veSNe۷OFd;Su'? m]?UkBTXՙ.ӳ3D@ Nt="\nG1@ t`z:B9BV?1ߥ🯐|全U+@φDTQt0xTմ$3 6PDdFPT$ N>= .a@3k r@-/\oCudUOtM=UP9KPE@FQ 8 Q :6E3D0MjTYϋSB@+WQWvx1"|P LMe…ɓY>}MPBT](ۊhw}7;ó>T9bŊz Co? "?KH0C FE*i;ٳ0MM+Ca䟦Skjjb:u/#O\Q QT]w}?穳JUA&b"QDk.%R&(Q-+((ҥ lD@\K? t"X3Dxـ>ԩ| b붧c6CR^V0cg rׯ_CA;+u(?.zmE{vaY{vGP=Bi fpB>R  Q5, j@H:pP>@?km Ǐiy,G~w穳J^'.]ZBQrUa6@! 6-ZĶnO'uHh!T(-^aa ",մf8B>l[X3Y7QBPuf`(@V&Du/n򳢊=l05+@mk_V5Hh%Te1gM̘1σ TԦ~ari ;#D m^ Q<.9~|:Ip1[oPE /BQ)EH0C_'IZ"Wt2 TҎMqarm` V[mU_dMxuY'UZ\E!]߮%Xlea3z9lB/ œ&[/.QUhn6>OV 1+{"!СCy.Կ,$A aLH a,7TD806&P/'} lĉm::4 Q$ w?DŽ^о}{znT qa-D"ÖH0$ T@>P\0, @-%qarE/T/@" .&j}?GPgb $!ƿ/f}:CF~Y5 `|`$6zD P/']PlCC9$UU9U~[oSg&>)}xl;z+D 0L]m֐` $=Q$;|ǶVZrY) %Jx?p%;o[/ԁodU0Gy~$TqsOoZyuƾy3H @EY ʊʾϟϋ b @mZRfmƺtR_·#7 ly)G@" &DKϏ!O~^4" fBPjLJ'潦# @vlȢb 86Fm^N:M76뭷kٚk{ C:r-|:MH?ϟhx3Z CgҥƅL <$A Qޓ(TU+V(^NhMMMSNex*gzqdI*/,XD((# ljژ" HW*@QƉ/C: HQ CRLM6ȼW]ut$*Ͽ 嗪 H5kn+Mhq{WGc!O0wbn m!0*S <=dIu0!ס&(U k)YG&ưCᄅyufg~!ET{[JxꩧXHw0d{7 @$`B]ļ( @￈pi?D[bJ)il*6dÑU. e $(3_3h5H> OЁiC$`J]ŸGQՄ,^۰V[ 6hTf?˞ Fb|:6Ys* OVDxذaò>6f7¯sѣ?. Cc+יFl" H%(gcA; GѰYO|lРA!u6?  $mE`_gql-mcǎuAwH!1 ?UV^NlЭ$dA6 g}6۷oQF:yd6O<3]RL}"jIAժMuۜ4E W|xUx=|E|7uYP~  `~:y@ƿ;$ CgynYŸmFml$T ;}ٗ_~ocDd1, f@@lT(Ex(41G?ԩSyi?' h.}omEg}.YTtG̙:tB=c+J6" 3DXd ٳzuHGӈ=TGo>ԮQP'kنN:2:'pB)| $mblvt=qj_|As z*ߥ `H0⢋Pm/sh𼵄 bFTCՄ)?La9կo^*矪 s CmE 80sIoseڵA@]wݕ}̐  ?t҆\U q % `l-dM^LQO>"Tsuߗd6K/gz>hZP=EQŐ5T"EdYTM_iz vd!|mI@^{7spw5k/vuP=իƸ̈`A$!;Gn$Q `UH16,W^'1uߕ0T6;sp wߏ? &(eěLE$4 WhBKi@RexG Of 7yy UƎfΜҊho&)wHI+­D4)g`R/b$A@[ W 5%:.&/^̶rLo+>Z(LveAl* 3D6|O'uHOգ-[du1MÓWe+wMeߥKs6lذHOw_-Hh9Y{lm* :t`~; &lD2U^|Zi$A\-! @l2 bFMKݝj@֕YІ5XW+wkᕦ(}6yˁ]UQ8u]Ҋh..>vYb `~ 7dfͪP=`]v.F{TpH0ZGDS(D?'F4daeuƺw^_5jkr#]@h|As+cۄۮetMs"z5\SkԛO+ 3I@[O)ci2+WrCZ!Q `Tr² AKxie $mbk׮wm@L01BH z[޷ᯊ f@@RBUFu(wQ}?DA@Ux"0%Ԧ)Ry!+˞)ilC?"/>$7n穳ҊhM;ݶ؟z€q"~?яx^(6 H0h jQbC4!@_CBQ?e,;_}}{uӧO^5?  $mwmQM2T$Wٳ$@!@(HQA֖9YK6?ĉ,?N'?^3H#ڷoqm&BKIx NbD\gu|$|=~{K/yz&!(j@Xt@>r^L 86͑m@gƾW^ /jב$A&Ԯ]ԎikЛ"`m9JTK/:Z|7<=Ր`/K@Qm KMÓS,.3MeXN˿oYS;qmb@@,8An/& ءCށ$TOrd|陨F \0UtSg0 (iS*f0kڀY !BG/C_0v҅sQ 8*0}٫:bspDz˗'9駟^Ja$Q KӦM%"0ԱcG'}<߆~9@TS,дOj=_*dm1@}|FMp~" ?  H7"hϚ&x!5=GQ(4D-(PY`r͜9gY^g#2^$ C]6%u,_9>kl쬳Ϊg;U%lixHxyz&!H* @ ;jHJ +Lq; ]Tt$ă5]sNnNJ[g还0}zK\ M}6rHb3_tޚ|jH'*3 7?(Y1@G^F*(09,۠*WyU?j!~uH @hx˗?*eFoGxTF_s55D ?oCm]tE<,`KN6k,~Evm7SOyz&!q-xIou K--'7 ^M֑$5]llʼnwNN=TgyZQ~DKy)[c?) J{Ν陨*;QqSlDYb8$  @X#V~7x(6χ_w,BkE 2D@Dӛo*y䑼 GY"D?kVc 3Q $([?mӥȎZGFa:_hH jD@H3<*lܸq$Pb{Ԧ'KŁ,VA 7d%M=Ԉv誫JXyp yYoxQ^Dۿ;nw1mrU[xY~<=Ր@@^p-([Wb"fF9d26Mm)'օ)J񿸡OR׊d7IXQz6} y'p8p o#X:FI&oo2]z&! Y -#iS1AVY VD7,$ ${M>T(,ylN :ڵ =:s [lU~Zϰ7߼>'=@@p-ޏZZkCa>`ހ 5]` JX:&F0/F:vP(ݣE]d홏G ! 2M2^MQ1jAY Ts?ۓu"]|Ǽ]rkܛ/<) ܈vy%OJ8u]yFfz<żʕ+yM6K*_ ,3SNeV2.ۧ 7կ~U/pGFo:VDz5wQÆ cr[gy5mCM>ק1(oV,!DT{?+i\'HP!;'yܤ(`5ڵkWv 6([DxDwxznП| / P $$*3 c1@ `.XuLYknnU?+'$$ zD5j[=N&BAXh@l E֑;z>ְ~ib:z! = cQi@Qu4G!\oĈ<,y&zYG $m#7.cs#6E$`tT(>/Xw2}kQSw}?Y $d[R}`1@ ^-t1[h0m@py籭ޚϻ K?!@h-bm]Dz 72WҥKছnm"bb4 C"eĉ|ѐqIl?mD cD@X?-*Pe Mk}G\qTH:@`;D|p$:qR{͆ϙʁh߹#ߦ`\ASOvۍӳ0H+:#]j.b&Q\"R~f jZy(Zk@FHH㠃bs̉i5]B] 0 rE(.}#O}Yg^ 'ga4,[F@*2i~i V2 Vq%\R H 5i_'H!wzje/|C Ii߾=ܹsַpNӦM3x*?"= ͛~%zYkM@L<+:.o1(m\E|D:Ǿ=9h Y`ZikӘdRfG=ܓ'ޞD?Y\#Hl0pԱ|ǩ`"*l̘1 aB%'C{/{r}(Ff1Fu|viՂJTR36I $_.$! ;wnQy}V 4hꫯs= &q v_/`|= In[4{u )HJ0֚U?@!d6^5~6'kD Q6̽IGgۆD WTG*N:[/[Fh?$!t<-謎~%`a?RFYkvַ ~yoi2]jĝZp!n<=!"7T_w*ҥq5\6ܰ=dUOvn)?Y^#H0A z]w%zq#=  Q;#?#l}/FAeh_q||6uq[ `?|}@@QR 04*Gmz2ٻfYbիr}車&M! H0GxL=Db؛ Qb'zſ3uFEs:(i@0~W s4i$d/d}7 @wW8) Ylj ]tyuqDBN׈LSDDahMp/ `8@іڵkLJ $o DKFv_{T 3 `kl4:igy&OqPUڌg͚Uk/C5@!'kD o1 ]@x,:-kV% }˃BMS| @ UWXql oS֐7_^w%:1kv% 4U?YyML]GCtܹ~{Hȗ+z_i6Mi!IT:6 w#Oק 'J>OsD`^p-( 1%7)Rs=l޼y ~BiQqU(yyzC E$~J(NQ{ O<]HE(:w0lq0ᄐhb![oog)uFx'TyآEm|A sjlws y;S;￟qB !P@4 8<۔)P8rW_6o#Py>$h7oJ8Q6}_!u0 ݛ`G^O?t؟o_((c߷gy@ϻxO 7HVTi}YݹkHe$Ütl t뭷ֽ6.E 7(ߍ]HpEѣG4aNjowӟ`gif:t ! \Coxx饗[ϴ]@_#GoLϻx@@QI* v[i4|Y(u ۏWִixN!0)S9!WDYp!~=n?0~SE 4tA<,D@:4D kxܹsyph 7IH/\dg]|H = 8 N#ЖY)~l< 9¤O%ׇ\ O?M:5F}ۈÇ:3ԤرckS#wkZcۆ/5\9+D^dP{>/;y )u@\F6K.ѣ8LbkC qc[o5/q|..a:q@,u]op7JQO ?Ua:T wI_t)|<=@ E&4=4}} 7zzCPvLP^L.eC>- I!rb?t3~Q2&@qD-y>$цP4Џ[k6ܰ @ԺS&йC^?r4+?}Y(`j> ڄ~^gĉم^-@i&}u"uCv;^iԦ) ߦLȧv}wvZK2_WG4kC q CrmRIӟ`* `y睹н{H kf$W10͛7?FMk @߇0繄h_<$n@@IӨm* @ V\Y23iVcdz+"޻QL$% (,$[/1zNp{dEo&Q8/!č"L:Cw7H 1 pg\pA}1 Z> }W ylLoOޯ $B%m{Ď#7DL;w` -XVgD&uwm~![d /^\tl|8aB+p\l-H^WH(EJP=ˎ+U `A)̷G}4s=[/Axm@ڐ@OD{B8 6!Qn! $;&B @A ~Y b8:G^,G :W+V௘`N&>F % y"ٽ$@@1"_- GD(BpE4oMMMSNiӦY;/ E6$`?3ȓ8w`jSTۄnbˢL^E@p~8t 1@L9 y(&4<.iIlܹmH(eI0tg@ z4~%,pZ0[o~14u6GyT:/anyR}7"\HM'L8ix]Eu~_ɖ<+eݫT`#{4EX߾} rYQ4i4`#ZoܸqJW1 ~>"\HHѮ^{5&uס i,"@{UsASF&Q6^:ƿ/.2vI'IH( */IhnNv9 Z)LΜHOR, RkC Il7t;c;ezqeU~(73Su&?0I P mF 01]<ƌgBB\On[܈/4n)prtɎعxuR}7\HHoc_}bDZܛmFi@p}e*?l".6?yMW ,XPw,K%< M^F=PpjaS|{m" 麐@@:{.㸈ityղl^C':w&bɤljW^{mno{B$XYH(*/Ihn.BEl;@z1!IhK $$hczE.]ql&"rcD: .>Nvt:Zqrx >GW *B ~En6vGj '\S/{mLޣz'>3<-\l8֋]r%G@yPtGyd^$@MdM $$M0o<.Z* qz~1@>qΪyS@7?|?d.<=WhSTq(ĉ٤gXz@@aԻ+Չϓ}< (8֋~.U6BMtQRe׿5+{G" $P6|m.i4?e1o}eGuT!ߪu&#.Fڐ@@Z]w/~qL xadq ٺr]]/8o Λ WǦj- ڷo7H(PM ߆&L@&C,=ߖ[nz4 6:oۡӝC@%M]HHsaSLI8!*)Wu8Y1rצ'd#FEʖX@4RR$%aHȖoSO"lRq\ĀS|mT֭ajic˶>^>&}0q/kӟĽ̺kO@@$Az*=cA6mZ}gaCpH(/LmQNq6cƌuNM<RL[$CVzKzRts'{l=P9E.y~/ <,bQ)Ui׮[s5%@ݪNK{V)B~ȯȞgw\bDZ2Aw\ٶ:rȲ,[]/jihh `pPi&N;qM7^c"];1b n/\ߗ$_h`˒2E?$q ͏f#G`*G=ukʹGF*{ETcNxM!(uɋtr`ѭi={ uAм>nH8.FIo&7.:Qx޴33ˮ"lU/0۷o/D6_PvG)xF5$Fl}l! ~UP\keSSԩS}F~]Cs#Q(qrKh" :  :I/SúsμsCGo߾_3/~Ql;0 ׍7M8K# J0% @e_D4R|9Z_~ ڋ͜9oV !eoU@ϰ x}&EQCߺV@-9 ѣGF BST0M pLE)5#_{o̚4h ;rƾ bD"kpC(Jj8]DuMMPud˦#/[g3M Pye9 L"9*ox le|z֙xu|&iqn *QL.Vilq&m*#2\(ը C6x`n~!h /X'B *i_|(=-+{€^yD2ԣFн_%7ҵ߀Λxmw*@\CgϞ܀D$A0  B*%'ʏ/C=N%~:g\pA}=ꫯCjQ ~j#l WQٕ@T!Y*e&2^ێw'߫W/n>}s4U<#I ߣ'.(ct%qudzxd\m{}z'L~߱u]Wy͈|Rf 2/_΅q NC#uP頂uMӹK~)rx0khTNzlFjXn"zxLA]>h,D|!C[o ~ ߥ`B}g m ,HX JtM`g +QBI4Pyey )SQ׍'Udo3xL?)ll|J0(2 q 7-(l!"l n8]PR"' |a?#5eP@ȑ#I ߯;X&~o7o#D I*/Բ#ib|վ:?γQǍD>xmܓFocԫ 2@vpuz֦%$6aKpAѯxXvyQD͇w^O'lٲe<%/wcxU Gרu&ݳ@i o7˶H}cxan"#+QW gb+M({ 33-I@4@3 (d"צ&ن~Pw_A?BQIx7 ~g.@Xd =" 9H?@1szMp/I({[o3:IK71MMٺe+.Q96a 00 FQ}xK_lԩ\~'pKѥI0zm"ȟ.jT@Q3m\<Ł ڤy]+W@Q{k ;kb٤ ^9|.HѮ a!M48/ܢsCׇrH[$eĀi 7lŴs7QIcƌa'x"/4umvx'a `@8ꨣDsTEPsLFb?B`+U,(d:ubMMMe"%n0*o/;.%_S"h\я_Fy.{i5?]^.=M&o&VM"lRTq@4 D^x`G0*E|nYQ: U~駶puV [F0 s&z_3m{}UpM yU_paL H=E]fv7yr uݳ\u LE(t:]EIpGC7tkB ?>8ybŊz8CYPV6d'NLmt 7\]BJx$Y"ǯ:P'w~,_רu˶DE倚0l0ncB-N y9{1>XqsMD`w3v`#NН7ޘ?f+7e!.K>K#>~I뾪:Ǐu@coʊ" zlV6k@FD+y&: /f?5b^-l`18j^}u%?D0I05Mѣ7ѿ;X}7 ~o;oMVpgS(\,:{Ԧ'I(bXY{6l2 ?ZV7El &eSy&A>&O  Qys#+ K5nA(1@l=mM+8om׉ ^E&p޽'K"{HH|!1f$8^|PuT熚YĨTuR ` ˨n:^gKuNqd}MW i6ehѢv_6e DQj1@،l|W$PabM <(СC}BQ_sM1I7W!ߚ/d_}w@mM@zW6BYD`4?m>h%?z[&߿48^6˘yW1^V' &O~~x;gB[l T F!,M=SI(ZX9@xPيxɌ}]ΧKS :We7tt?U(T iCQq! > s: Q43=7U(G= f!BP 5 :45 qRFҾ&xA￟}}ïI"6$eڑCNd 2u vi've@ϛFl ^Zi?A "$S͵ilCIxx:e 4 G?RV^{5:%6iAAQHpG+W I]Hh/~5#`z03gMYpР^U&3gNuyb^fp4  ( $ FC˯n @@[`K!+WߞԦ)iܣ+sjK+VpFM+S?2?v* ADQ >Lw?묳ؘ1c @"@#E+}%;wg-[y$"X  `zwbXzi;&3F :u*{AyeaRICAQH^o8-6/Ÿ}>}kуw6> THe.X0B6` < r;蠃>D+I]1߬YBtbR^M4SH   vJ&8l~:/ gQ o mc˖/_=`dAz6`V[՗O96p@|zA5C'Xx |(4H    }_+.A br "/C@[/J!@- MOqP`x<8CD0)({l=q U9j/o*H d,_' |Ґ@A̯JEڤƆ tݻwgW\q@"@#U*8{l> ]! H=`e@x :b!/i)ؤ &99 8ok"Fг>7ΐef ADQ  Uz:CdN;_}$ f)F(k!aݯTmׯpopn1*X^_CI&> OOfOU08X'ؐ!Cx:m6$%k եg.\=г6-I69Q0OmOQ A RQuԩX#Z)?T^?b⋹21(x }1y t*TLHO (60lj$:rM64>jDuHh$_ߥOW!@He,Xji\L|{ \ZO?td[^?8S;N? $A& $(TENu]GjIq@ɺIMBA(T4)B.mXguX>}˨Q6BAv0xWة>cSV I  ( $ Qp&)(Ii$D@MD  \  "HjӋ(KeC'"da߀F(!-XRռ<K\'3|@A%leb, l-ij :>\Ftf̘˗烣rRmMr=`!n$Lu(?(?v̚5&mc&. W H$  ( $LD eo5 &xxGEU?F.rٽVE։yPs=@zuƺw^_!IE' Jr >}zC[UW稇]X]qh7yqda?> P𫯾# @*7Ɂf@@4^j]˓Ǹ'=?}6lQp[jrU*.)J|_-SǙ(2$ {U@0U JAlR}(~.GX#qxO皦~ `ٲelرA?̂\^~-߱vi !_̫ :E3)@%f䩣?pbc=YFuu*d#v("FQڀ~СC٨QR| '?J^UEeO4TeJ* |06l*_OA"YPE5 4pD| GBg\&}N8~ "=/^em&щs nxyȑ<rԬĄtl:S_>afW3Eȝ$^?o2)[;5gH_?@7,`T gpĉٰaôT!F!xqK9>Fb@֜{Ԧ'ӺO6佅?ZPPp'v pb4@Iyr8p4iQ"z`jAAQIb7H_PTiQob428O",TȎ 0_r%-ZpRm=%{Nm:PK.l6/ㇻ[ :lQ-tWfi16YX֡DU迮_/ 풄"/ &a,_'~Qımj(F C>0As$( ؇^a h믿tԦ))"kP:uT_ꪫFm,ؤ /^(;QOAofW_}uß3 ׅژ!| #~D~z{$$ȯIERL(:QdItȜ):_^ Pg0후71Q y6 O&YV4wa]˓ǸC(G4 SBl "jWUן Aq I-3d21T7eԼj! !xE1@]wU //PHTI j Z TR@_%oF]m' PY1bD71`/$Ֆ@SNL~:7n =tAnU(^ VMt'ӧOU^p*;ׯON?zhAq\8ƿ%@T QU\sÑ2m0!8 G?`U5 涘k?S7x#7KUؙD1sOδܸq8caS˸4UT ivig֮ ƿ޽'DH B /O%$U_5FUEҔ"P|ݺu sftU'b`dGC=~x/ܕs u3?̚5kN.Z2!e{A_?[=ɟ%@TZ+FDeK2 ЖSVf F `Ћ_V~\>phNgZR9 Q̽_w#l%gԨQ^zizs@ xpKȝzheuUū]{FS3GO@\gJ L Z.@w_ɕ@PKjTxj~N 7 T40. Zzu:)[=|rV&^Q) YPZlYZ*Pf @3aR7,N8!yWXukW* M>%n**(c-@˒k< ![+V{y*K\\+p|]/^Y2nQ,;W`tdU爫{'}̘1zB\el%'9ʐQ/I$@T؏nle] O@QᖡrKM>mW@SN#?+U:3qkoδpҤI>8cY < 份 ֩2<\#rIFMk TJpqi{l$|U?Lo-\0g}m/HTx+"jnj_;.pPBrq=CѕDz3]dwx(q1uj3ARne, ppAFΟLi)W4K]#nR< !@Q K˔\]Ƥ/ vmpS#|wٳg'{::3?C)@L$7n\=\4=L~cκ|.=\ƿ Who ]r'` p>By^JE]}/ϵN;I m!:WsY˳\׷_O֭[ݜ`a?b3aY7Q@f};ھՎ7 p6Hs4r$5.4;@#l$EmeL_%,CDm\CqJ(2)˻(3җ `z\ABrKhK}Nyuo'}}ݗΛ@ ԍȪG^>4o޼ӟtpyp@H @P _Qa<ꨣz?@7]:>eDa'n ea./*/ K+!`V59$'OJڨK>xz IC>!`zY j_D`ߖ @sqa\/P]@s`z? vu״m*s]=vIqBib%'X{0$6lX2jԨ+"} (Mz矟|ثα+샒1󹞙!* _?5/@$KH (DR}%N",+P ,GA_f$p Pm~Oh餤1;NKb'6}@%K$Çp"Q~껮Wqx@/]44h;@%񹠙e?w %IfI(D( Ti*kP^ǏO/^|e'm},;H %c2s0wUy|K=aN\4 j$m{e¤{,5$T? psjo9@_E @HMk J}\(?  j)q @M**|-bHPwIƍC]T6gC$D"@'{zN2ah3}uC@:80Z$G}tj+qQncf(] ji8@K7)oP)OLd*T& ȑ#}Զ \qanv@K7x# (q@7_*Dl Pp ;6.8)od#lqz9=xg7}eg(KBDm\/͖Gh ~} T/@Q}2H pekni@l3U#!m3{`Æ ̙3zUѪΓO1^'0a„=:w 22OY< ~G¿38# 1]gyljw携˿/  Er4_D> esxe|f(+':o|ސL\tE> kUp诶iӺ. @ IshЙVu|G33]C}̟wyHd/#7@?ț--m_O6CY4˿!c#! 6HH %Rz%f;4,̤\?9DU~]Ҁx&ԩSːx׫0udgP:bīIDATI&u/'3f ml$ACi|<\\#o/#CWP.N%" | Ff<3m}4W5oֶP`sΫ<_8 ~%@LK:O>x.L>@JSLI3 i>c2k֬ȿjL͇ J63J9%>`{Oe7G 5]rODoKȁd.i'7=@&2ڳc﷨sik'}~_,&|Aa>@·quva)i*m]Oވh@m1gz/۬>OpMq]EqF]U',F)"JܢFmƿCj pV3koz4=J`o[ϟ[./,LP_w#l ?(!{Nb[p}@H@&w` 1'^{m2h 'e5g)q]]e2zPZU@%;mzO֍D"Q~ṿܲD\꣹r46O"C4:dܹcԫ}qw} ̪ L3*:E^xsM>@ <4cmq>dB[y(7Pײ2[ Pzk!Db},?Qo pK]R|Y4] ii\`ɮ5Z`;R) X"ܼysaC#:G>h"آ 9dĉp! {/@V+p z\0ߖ`62QPv?$@H$) bJ4EjrjOjvqǴ*P45@怛my3I)(uHaÆ%FGFx BN?hW^6l/3m0`q7]ײmR.:-D"H Oj'jviEj*jBLߕON<^Mgϲ{BWN'%/dz3G%1"9rd}͟?M80a8#C3,T1k;?PƖL&9UKH$*RꕙrMf?5skT@ ֘^dBN3e7*@,} sPˆ? >Vyr)6/K,Ix=C2'uNmYr(r)3|[@ VU<_~D"Q[%^qrrPޛY<6~:ܐMXdvi4!MQ@}#;Kvlܸ1EcE!0_ `L @a zR3]vY/E=XBf+ u)FyFD"QP~'@MT<6Jyjf8G}t?Ҥo:x%(KYL>NNJQj L`KqM2%yꩧR1$ߕL&d_׏ˍo" iUCD"QP\y~wq(2F9h8B8]՛TLP x"֯_J&0=љVVu\Bt1cƤe 曓3gy8ƿAcP|S1_= l1ݝoKXU?$@H$)˕ ԋǙ?wsq% ~ @'?I+oŞi {PwkcfCCV󝘅mD㇇9FQS ER}.lS[6yXSƿm^* @$8dsw85C9ssK.ؽwM>C' v?a%+\k@m*ƏGD2$2T=YvtQq.` 2 P @$8d|W* *'S=㩾.W('g0 p뮍|Szٳ s:ӒΓKY;vlZB} T?do0r)9{p oK^7f>E.HH$*R␊W7C%tMχztC~,TlْNJYi1ajX\dԲؤ_~ɲe˺e d2&ܱ3%% 3_p JD"QlTi@ ޟ D:_4Mr: /L/}J (M`Æ in2% ƍlvf}ĉyfmXUk+醿zpJROIH$*R+,  ի թ/t msumFbT/02iAugVlt>O$]v ~}=GCt!j>BT쿾&*g׫T  DEJ@<ī/4+vm@G(1ij349sg''O?_$0k e6mZw LZ8 7?0?E91V @9ńJr @$xTTW"@p;$ dՇy馛IZM6;Ts܊B\0:=n*mkV@wۄYf%rK:32%!Aaʖ$)=C/nHH$*RU 4@HB@j$; + $P9br8P-94 {,9Ӭxȩ2Ⳍ1=(WzܿFNX*k-៞ yT!%@$TMrxl;Y;}<0ta \ A@2eJwG\W`KC[%s=>, @$]}}}uoB+yt*Z`xly<zyy8@IӧO6@/T.{k:tCɜ9sz@@S뮻d:oD1jʌ%\| pcpuG$ތTĂW?!G#*Vpm-Y A ꫯNvy(+ 8{/7ЍȪΑKqY0iҤ|z 2ثD@<PdS' 62l*yl>xNqQz4 ޻ezCGPSO=4D@=Rk֬I?#2}aEUlBT?$8s\^xt BxrKf3=S$ Ȧ&l}?@}%*S>_jOf.z>|뭷 s@(z&*~q#FC= >$-&!fy*>L j`y!9P9 PP1yCndݺu[= p V@EQEmr$ ,|9|}y|ޞzOYĠy|vr!!oUn 8S7x#PH\w`sRaWOQa%3/+l胀*h{W5b'. .KTy*F@ o#TԨζ0[go3mIu/ק@ ϗe ޲1x"x7dk;"?:$g!T}wqG `HVX7"5ozekUW]dfu@iVWm (H@65@Dy\9vd?OOY? ,Hg X[EsT8Pa6>U-/<`nСC!C8$0Eyn9 YFvJdv&7}[QdS_q%~~`~E~$>dQy"( v7T8Pݒigo}[a6>U)4^~ɢECQB(0d~W"_Pu'S J!4NKsFp Qcem#dmU;/*3O+/~VZ1[n/[{0$oضOUJōALxps"Jl(z\^LUgJԡy%˖-sBu֥:0C>{SKr$ =ߗ5:=38}@4K_RlSI֥^*itEȩi!:E@3KWyf@}2+FCܿBW9)s%9sՊ ׄ=߯{SKr$ TEB^f.JxW'#GBԋ6 + (NlO~2 D ?n}75"Q`ʒO/# Jԩ;Wj-iU{ <:>[l{SKr$ l@y *p&N_ J OxAc* 4K(nh\G}tS@SviӦÆx3,ꂱ7|^28s e,P }h&\c-Ȟ֯_}+@"t\/T5n(;$ pM:PǨN/^hy{0a„nQF%W\qE+YS"x`M2%y衇vKX/y !Wز|*m>kLdTRkfVAMʑljP PyF}}͐tJsI&O- @@=mڴ2鏝iq%m]:/ ^Fwadded+ +/|FF!b{U?Bw߭{SKr$ * 7@m!!["+B?Pcs*dn|f'*6ફ` `֬Y~4_._'չՏ~|I_Bؒ) iB@ԫ{ok>>& (G-d\ !_XWhhIh wu SGI^6lHfΜ]fIX:P@*(mw&+eoK?%@@l:$T筪P.KTГIʑlj Pf2@G ez>(oH !Ud2G;Sb5 ;62dH:_T~ɰa҇kC{Mw%:`.WW Zs F@^'x&^ )@"ْB*C)CyLW~ J ãmwW z2\x;o޼9 tMgN}\s5,CZ&X07x#qjCS^T?d(k{K鿐kK|v׫{*& C' (GMn&tQ0 շzJ }_Np@j?RgΞ=L@yj mSJjժOO 4(?7WH5 -gsGm kKXkp͚58^GzM-Eʑlj( @`ma03dD8R3PrQ`̘1i<9G?QO۲K%C{'?UXn7D/.<zIb0BK\}1C*ɛ ~CO`cc$ Ȧ=?KI@[1K (/[(5PZ @?sC=4T r-PPwu T;3(qj:UjM/[?uΔ(j3]],cYx/[y+C16QdSD >fߐ+^YTBU`/x}PP5CMW\qEZ/[y5x=E4=_̣1KyFnʸbp@O:b8qc$ Ȧ6WI@yTfzLBE9oma꘨ U;2o[lek0Xtd%'ȣFHs# uCoݲJYzru 5fCeW H5k*Z1(F (Ga&, rj["P}GW`{0믿>xSIpw$K..3|he"*/>.L]@[8xNiQzm\_\Pė8+!*% \!\X>lH/IP?QP(D6Kmf7xds26PG*, uxPHt95 1"9rd:_܄ l1p7FA]w5u%sQ%u1Cbm?KY'w==Wf^1>`Æ uoj)PdS@:Kh3CG]Ѭܾ PPET'FY$8MLP';etA;2OuxS\ԫj {ωmh?$@@St'˗/wEz9駟k(׽H@9MmP^/Nhn(@eσ=jիW'/oT2sY@[bEw lْN@hz!\Bߢ ~_@ߌw5D.YkR[Ա52mB<4 7TT^{SKr$ zG}F[BPRݦAPYf%sL: W

    J8>a„t'c=Ý@SeG?dd?\ ^|1[5q29ƿ-񟾌p%Zy!wy'u] /qv7nܘuoj)P{챴*Z! җM%ee|,ޤzrmMx"u֥ p]δA;q;93?ܙfl Bh f6 -pݵLA28u|ofɿ&C4M{Gz W P/RݛZ#x}D_d>)[Ur ('m٧DQRPV@3?> r)QNC${gwҤIyϛ7Ý|Sͺk˚ ϸ`i#)[\ [\Ysj*Mӌ3kS0H:uj38;/bݛZ#K@p4rp8T2@g*@!'pBjGA"Ջ P:]+YહpB!<`skPVgC)aĴvۥ!Eu.|JTDpFm5r7&C4MW^ye}4{-l 6 `w/tvIo -͛W;ajޗȰR_BiLnnUmkay L7z22*6}gz˵¸qR1bDYPP pAE+rӲZ}?v UF 'x23  y[^xM-E6*$}xpT 0@3}PhW\M߯ a/}fozp@JgQ%u+ Z`A5L'6׿ sսH@9s=T(B+" + q=M) 2qx.}Of<:2nȺ\`!;#YtiwiӦC͆h3}Fw=gD9>C8]tQ2~ip#o~!hTRU?֪98$-z%8wh?$@@_"3gg5&p1to[ݛZ#}sz@!rPS55E ̴e˖e@g!q6ǶիIɌǀ(r41 (H1ŝ,C83&~i%x`δ~Q][Z,Wd/@@)Sz6Oy4=.};)AP>2PM}k~FWb m. A%!yf~| }}N}s;)*rTvmRd''( aJpןڤ @,LQ#J.p4G9@@f{4&0Ј1EbCݱ8ϡY<l%cJW䵢K@{ΊDGյ0N<=1V=W2ׇ *&0mڴ/,@$d#-cJ@r@ IXF)2MtI 6 ;{-WA$TڸqNo;ӑ~LLP>a„t'=)@(-8W_̚5+=1fr_[?,Ɔ$s._fV[%%=`ҤIl#xkI ؄$'ׇCQʑJhr'!`) xT._ɓPi$Tۜ7eH߲}{vS x 7}ɻrVv~7Hp# >əgٿ3-u \zA9Bve!!X6rrmzT%?mdG%&a2u%`l (,,@6*$ ׽,1ސj@m)S$2pcGBŢd>#>F0@Uϖo˖-%iN_bw?VHNy>!mY@_ ?yPa%r`x mMJeeA,RQ 'Q}衇~x#ϗ.GbK/%O?tݛZb06C[A WzGTB@*TcRCB"b\5*)xFO3OLO<3GMM'pB^x!Fp zMyJRg rD\ׅ6N l]s];ʣ֌sB` LnjA|_'>bⰨ+-?k.WRI\^68z޾[H/?.L*6s9Gp (W(^1\ = '@<PT.R? n馴 Ȫ"@m\׶Oj~i/H3/ݙ| Vņw>D2aÆmJ%^5DY0ڌ[ks qSUPϛSJ ş}T^ t{de /\8mTLY)`ޔA@s 6|f9s$|zM7 mc_NhT!Y\d ?ve39\+{7+'=ܓPQ{Rh21wL1*FN:$'hyJ@*$6b_(*gPUW_bxn('VP^.^[bEwܴiSjc4ܙJ}7Q@Q2eJ9\eVlx a^uy.0}AW.Jb[fmwW/|`Qq<{Fz@[{xݺuuoj) |= bлrpd KնDy*eąJNQG{;T1tW/~7ŅأqK`čr%o?5*$0pղJHfKcNS?^jO*J@oV dP*KH-w\g)Im{N^:ԧ>#u](C ?G{~͛Cݣib.Yŝ,Cܴ*F'fĉɼyw3:l[ ˨!F|@u׬YlUjl9VHhqU5+5U=U|[Ur]wݕxYg:Xk_L8>MuV:PP\a6m1\ }Pj2P`f Ky}Og~Y bwWbN6b :Eƍ:I!*3U ȿ+*K>7IX}@o`}#H@{\(Uт .uk_ OhXOL@26*&pꩧ,J y?srl>*<=U ~\[P2JhP@mG7v#vɊљ=# jժ*FCXrIμGÊz! K8+sV5UqY~ڵks_ !VgjFqmwڨ,J @($4>+^p RڞSK,If ,;_ ٳgw}iHmG+;ӌ]bw?V;vlZBcw\mYH_C`ksYqA/Mh8V\f_?ξ V(`66`lT U hd۶{UŐpK/pl23u?׳ +"%QzN* S}TxŠw 0#ʘs~[yWH?]hIgtKV`5*6lX:˓ÇTe{a}470%\ gi\}TnU@/+ h8m9o^%$=aـSpr< Arpi N[WDBuߖ׿0 RW d-]'VyB85ץʬ诽K@{HOe9Y}U^ۗOYbp;7YG{SKQ, b  6heP+r@eVXhQ/9U qFxTvSj 2cV`CgF}1cƤhQiʔ);U2>߷Yqy`VqmT*a0X-[_tALh7nYQꫯ&z>We*&C׽(&0k,/h+JȔ/?UW\ Uɡ*P`駟޽0A6!7PA%݊K?a„tJ6!eS `.~?c:* Fs_U0Yۿj\.U}q5:6*.Uuf>Ks_|K_"svmkIO^>3f{F)/P9w6\m=\ ĭ@yR&ԥیZ W W= ayPl1dݺu{|mmڴ)ݙR,LQ&UM4i@)~׼,ؾg[nN ј"֨}_B=*esc% }w]Bf|g*&Qgࡇ{SKQL3pcm=\ QP+gt1賆X^fY@  FU"@,7l/@Y7x#}B,0I?J1Ybܨ8 p%'YmYȺ^VZ7puXח.d6TcTKSCcռ@o(T#i6*1& =eH@{L෿m\xqrYgղ7|srE-[B `ԙ|7BVuU[5Kjdz^*;:&IH@<ϧM]w}=,CebP7.Y81WZտS56P^ UjlR QkBL)*^QO.~_- qrTm_ lRJpy{/?buMԽ(;6+ +">TyS>C6RWxi?9lmjWs9&P}?_={vw3&- BK4hP)@_N%)Z^y ~2{f?r2out \9ƿ?!L h8CX[o5 .ⴳm\p4ksx}駓￿M-E1o~+C[A WD>R`뻚 3뻪>*dKXJ\sM!@\~+/X~}z+a|?~NPoNP-vV +2=?̂s>p`^m `=O^]+"/”+>Oܩ|ƿb0!/ `NBSRS^xgP0*YfÕGTPPJT emV_*^a(pyc+V. |L+CPhԇz)@/\0?~|5P \: p|]6g;Neҥw]VP @*@DfNO<15Z {pAs]X,:}}})QSW.=ueT5ݩlA^cI=UI@{WV\P:44I&x20j/2<޺7̙ӳ +"H꿺rW<8Wk `׿{,mumjn7Ncˑ@ 2׍7n=U! @ѕBo3ԇf)>:ݜ\80T@K[7vJCť!l9ǫj h'pd+\7}[JoKa23*F@|I% [qxש3]Za„ ;'-1<dP~RI.tR˨_re5S7+nrR:$=_*2:y.dׯC+WL\pt0eQLnp=Խ(&pgڶv?q w%T hPP@%<"~Sq`?$ ̜9 2a41 U)>aC;vl2dȐt7,J;`.?~@Sqz 쟫Ѥ cLY:;uI@{a@tM??;Y!zh9buVEy$J[ٲ^1\ e(`Ǜ5 dT_Jo\cIW%S/le[ʤ @tb(;{f)@>|x1\oBG9Ru}MtZא lmU6ßKK'HR%86mZ+8 K/MGS0:9Uaڨm'h3J(||Z`\67Ҋ}!SGp04' U)NCmߙ~CƉp=sګre곢 M nH_&6s〨)Լ@R1JO?7@Lŋ+g}6uT~0*6a;:X0{ +<jkԢy8Z(ϳc%;cw[}d/#4?P m7/g02 U)NaZH# ׿T e˰5տω7?2 xUSTr5)&sQ;Up h:u*5l}UWUrUWYFU_~ ֭['d)VfÕQ^xR[T>,[+՟5\xE/?Qtays] xtdg7"R>s̠hDU@Y 'f`V?s%Q F1&HH@{+q0 ,H+ zBc(&s䮻{SKQ,m J oB[[m`>ӭն,،|gqyGb^g<e(e @(n_vϺV+'?IYnylkJR]Q8oW ~}O߾4YYcX$=+5o_-[$'pBgs7 \ k?8s ; ̝;w@]h+J(V_[0d]UBs\]xɩps{O~ =z eGau\+3&-lT4hPj[%l2T>2JGqݤ\ݔq%JqH_\/~0 Ee~V: y `/*\ᚂnz *RyR]!\6* 7vfYK}Ɓ Tn?9%a@T_e`{݊߂;78bĈdȑ<E%Gf*KrUU:}[!W?i}1RfC_yV rG87nܘpbu:`ڵuoj) N0G%Q!$ P5<\aG?r Yg xZۙBjLP^F=餓Қ溶Ws9p(H`n.*F< \/[@GQ!TT[.% dk ~e:b<7o3e'}5QgT`(Q1q7 /D+ |EuwN:,V@'lз |LD&XRz"@zhr'`Íwy!*lmeR|(j 2[pQGYÙd00py[`1$okm. ؒ }/Qo}[)0;y@9FW\{D.'*J<;p'MV -s@y8_>uqĉ@U }YKfϞ}oyx_*PS o%QF%Æ V6w0ߺmmq[lV% 6. cj h׾Qh&T9P_8d`Րz.Bp~B7&cYl7_QY%@Tl]n+5 uf)@WU x~G>kkM`㹶t*5 U*t|gZZ> K.IƏv |e:ۋ ˝'#KB*s}ujhCCnB?dV~}9"w׽H@1R2Մv/**{WTW.W[+JfJDfcgp_%|3M *USw C IƎ.70sNN|r-8O- AB= n|.@3IHPd PzoN>=_'Ln 2MP9(#9ׁ<;J ]z^%1\;EW{$C7 @++@M*+ 4児; aj}W?_E>45Q9r_7P -[-J63믿^E)&p!jn{SKbE7C% NU'J3}sMΝ^kjԇ4D\`agZvU&YΡ &,]F?nv|@upx'p5~yc<7: hP] `t_M0N<.[hɧׯl*6`z?S:+//UH.}BUV81on?!3gvBm5ɺik1cƤMAX\ F*yv\Cm(4qi@(@%U Yv3뿚GB?6ꫯz~7 (F ƿ-ɴ>YS @5`V,c Jup;Gȩ}j\Gy[[$ (^D2#7zE"J \p} [6@xo["HᯖElJ(e 6@+U2h.\Oj!1Y*t@Tde%jyo,@sbϲs}7P.'?embC&A[Y<@h.BK*Nx,"a!`>ay۾پ[t@| t9!_CM4δktYfҤI+9y8C uu\`ۋ˝wޙLL@wСCv}Wo.G4mڴ{0! Bj3w0nܸ4Uݕ$v"Q48Nssry4]ʕСG7=^zE]z(_j r w//͕9VfIl*m3ĉY""%l0q PӬUx FJ ֭pWﹱ6!yeMNe˒;/ q]S6 WJ9Y!pwPTQ 0vb7v6B7t7` LAYP,\+ >W5b56㢿)8nNE:Em4!b:8/F  ,XU9c"@ Pn hBbe0YBcq]~k*CG;Đ/ԥYs4w/ Jϲ(9}M8A-ĮІk__b6/@DK}=)[|,B " aǜ[oNheҟ z5V&L^h0vyB /bwx~>QrmRH:k6}m8e)f` @lP9^鹲|a>q=|ꪫ? BFmv@Bf?yIZjk4ܡ}(bOerK'vK{orm|?^~ke@=  @P pK@ 0)Y\kFHv'>-:ߞ,]epdg1 u6r@%<3S_{"t -<^YEǖP{eaJ|"*V#:ׄ2:-0l 1/+-\8f/B+?$@@1DZBB?yO8 ,\՗@[DTiӦypƴY{nH}V{*L~JR-V"c&C vbIhm;yrۯrFdC)'L֭[vRp7׽H@1@[DUCMVZEgYK ނ~O%jݙ>ZaĈȑ#K.$ԧ>ՈD"`v|u׌H WNO?]YTl!"(`&Q ESU^(VVqΊPS-?v}\+lɘ1c<$OH"< nd͚5]_/ t{_.u[b:}'@e]'L'Q2Nq]_D@)L}NUof衄JNZjU23]ZL^{I.H/ϒ ,ocJP ERD0^|Rb_|3@#0 KJ@BB8N!'̙+ʒ g@#je0nܸdK=ڴDylʀ)x {^znl+: 8檳Pbf5{Pt!Y@KJ} _HvT%ԋ!_M\?'|IBMNq0jԨdذaF}*PF"@+gϦ?$@@Bҟ~i&xGByd*ߵSEnJVX}_`BMPޙ\+yxtIaV Ȓ,:vȟ{9J~ `קz[7Lg t#Zm7nzL7VsƊQp<ֵByaB[UC .Ҵ t @R1TQz? (FDUj„ ɝw޹;`SN|EGb sVlߙVV…>\< TH2,{p`XJ 83ӺPO*T-[)@v՜dk};_b"PZ4EO>drzF֯_x$ (FDUʎ?A=oj\?t~;V:thOu *2@_]Hhn4A/< Gb$ U) >c[%1?dWԸVLS\+y:3`sy0sBr~O㟖M\v\ZaĈȑ#6xpY@Mb$@@S5cƌW_PЖ 믿17!OQU=YrNZzft+淝` z=37o^#>9Kh0b`_95 \|)ĠDN)cUg$@Tp}>imWmSP OYaj%33][ ^@}& LbI&k֬Y_oU~W~;6Bt"L@n U!e@s%gG?z-cBkY. l℣a>|xAhq:$ L4Y>lrꩧ:y < W[oM-Ea B`-OV^}/j53\+lɘ1cN:)9j`2`lv5X xg? Wb h U!zjo]5_E?uu3ͩX2L}<T@@7%@@u=_I@ˆ .\cUzEK0\KlWdժU{Tkj?\QW*ݴiSaRK4ݷرc!Ct;h* )yZW&1$@@o|#yӶlْlܸ1=ߜ|%@T8 o?gUs Vzz߼ysaDbQ[;*JCM҆tAGc FDKp H/^5] ^7+` r$-Su7ö['VrJR[,V"@:j(xy(< K  !o {r1t)F<n喺7 (F pKl0\/_&t<Ϫz-jeRgJrU*-1Injڰab ,`y(WpMUPԳی5r弧>ӄ*>bxd(_\gYqev.k?LFCmnPXJhѢdѭy5c Zb)qvڶ zHm_ )](O5WTu<w ZCZʠD2A >*4Dl[Ao XȊ)Զe[k k gסs=|̜9sfx;wfܙ{gG ų{s\?E}~] c#O>7 }r"Fwi3*8z;@wAuy>bpGM f0O. 1=DŽ*:'/x4hGLC{ltGTl5clx (B*e?! 8͞=[` ϲk)a߾}{BA,NZ@ ,i ) 6C/# O0𗯱իf̘QwF>X@V:O3PB ƦZ@@@I)P |r1&K14y3K[Hj4uTm1i+4CYM]{ZJ<:ZM1@* z*4 Q0dsJ@& .@\cEXY<JK/?`Pq,&N i4@S׾ܟ c{ܹ|8蓟dl:)Ia oBCPg"?я(P ĉ,@QRM?}9WF@-Z4'S;@9Xsm >z T!lٲ4@sJB^3z0+&`P4y"$s@yx{l@Hv׭[y晱@!R/`<|J֏u;@c/0EYf;| Q*:4ˁ@sLM ˿xlT/}bj$|IP5gh@GD{UjP $;q<viL_y nwcgsT&MI':?v)jߙlY_h5 ~vy-_e;@}{rR@DU72_>)E@ j6o, 6iCTJHg>~EM@S  J@H6$]/;M" `4Ams?) >ƶS',+>A38#/_㺊߻4Ó@ڵ+Q)?J@H6# |:ϞZFV 0i,@@+ p=SBÿz(4KH3e @o y.iQC:! c#zCP1<@@,!vU\mܸ1ZlY5T )vP' n.Ϟ=T4Á@3z 4HpS!( (|O?hqBtcSdshƞ[(bO(pxj)9|-X s}?>n.0̒zI&#qQPB5d;*AZk534E OLM6.*~BC!| _ױzT3$iMJ@is]0_T?zQC&[RV4CF+W, Pʬ NJb B9ZBYfccGF OOt* x_/UTU@A#,SQ~L iB7Bn~?b5 M@@ bh8_ !m\pu߸ۺAInmY,+ vr۷oO=4ԉ #}o?K,Ν[ɱRH3U@'$k ܣlx& 16Ctlo֭<̮ [f?]"VgWhgP *Vv@UHǖ-[R,bۓ,Cå"_CBnҪB mtBϟSTۡɆg(R+M=P $דc9F`]t3l MD Tj!`BjKAY@_ P'z=C"u rΜ9pdKuAI`Y4#F,4 7n0B$Ay4 D{몸+{7WSB! XTł |+V5L=C>OuM5=A&9 sTBN  &` ڵ/_7$iO '6 񧶪[OB?:< k4m^L-T4}^4lpA^PVqߏ ;jx]K.FSܹsN ϐ1j;FyxGJ@Hhx-%?{ѡ.if?L﹤@ E7@w$@3(ES . QHwlxV[ q50?my!"-{O w-/ifpGFzh7,aƍY&4uݸelp!7,i7#N ߧ%K_7Ŕ OL4$pW'F'?nZV Bzb=t562 ':i>Mbՙ^׿}H7i7#{wÆ Smv! ! H}ѪwR(KVF--eoL7>?!F-S." [o }4}yӣ0|C -\Z>Q *#]J, e[\"| _B?M@$qɆgH1Zb~` B^!q4k?D v3ߝ6Zki^zQ)# kA.7? D@sw9j w)77xcrJ $m&-gHĘ ;5y?i1?y] BVE~j_ܬ\#Rݻx`@HkA[-54 4  `Hi]L `ЊZ DB9"ru{-t<(FO>$̞=կD@\z _=P .ppdN:Ud}[!?ٸc?O93VK: )0d '4+ @_^>"'ϡ~PhwZ_̘1#ZjU%BBD(v(  DTۡ gH"kyя~TV B"@yz?8*66[jVi~`J0^ l&Nm߾R @ss9'*?(t"|U Nuf͚%~m5"W 繆)ёedxShf)Upw,j>/-B';XB]@(4G@iӦBo}8zؿI>MhpW ?xջZ)qd@8Li齤esMK?tnY`9xͦ`4T(`P HP #uYFĔp}/!|71k@i闿ec ϐ Г6~UB6˗/.b!zU u"@ĭ LZB@NiDž ` ~AU!#F$'/&3F5P mUXn*_\迏(\.[guvtfaZQ(Rv|) t-wͅK>l%P6@ Ib)4 I@4F\t Ŏ;{l@ڌ0Cȴfg)g㺐&k2:;lDnd0㚿fоq'?nh<  .v]OW?0tjjNۅbQbՏ{4bj!@s@;o{b8Ux衇~>ra?hÆ $K.9q?~ꩧBItp=iyi#yc9F<}F展*{L1 UUbYb/ozŸ͇G"@mo{[ x(Pr%ozӛyU, $`ƌ=~Nnx$@I*ƈOWB<,q=d=,Zd,؆b {Rh%P F ,yo DC{|#]tN|׮]5<+RxSt|nKHR;M6/"@{o}_/BmPLdg$&Xo0̐ܖPsuŰB GR m!͛'jykxZ?$IZo(CĉA߿ݢZ۷o2,Zbf"+a 9_gw)øCg? 3c] ^?(iyLYfʜ>(4G@H MIµyj> 1? (ǻn!C6P }؜ (62eQc2Rq6?N@g"͐Sf&S1("D ׬Y͞=A|(4C v8sQo{n(ui|W/_M>_Yle˖E6mmX|x5 6 >>$}WR(Ph ~oG?Px; 駟K(3A4_Cw6oWUO@XδAmT C?>;3gx^bqU9}\(Ph(f6ao@qs9"6P(oy[ 2GM/_ /tAxT?O ,Z^ ۅOcO=Twr6Z]d*/9j-+WGrK@}ޠAğsݺu€ EA@ٲeK4ecf F-&i">"@3}Vq%yQ4oa[ 9Rt|DZK@{q>_^ ؐB@ݙ5kL^&8묳͛7[/O(A}41._?D1l*_5vaSKl3/+ @m8qDQ7 uf߾}"|P( a#Nj i b '럝u]}!;֖=v 2dHW^)AQiQ4\Pϟ_͑@@άX"7o A  I?=bu^|߲eˢM6Yy]İt0hmsTgzva1 b&!@_&ߴ,ELPPgƏ/$@ZP MYMq ͝;[@Qg? hieםۅa c.iBB: ,`w%aÆhڴiFGN3ܠ|{eSk׊I.!Q qixzt[@K+w;lExܠ:u}{{嗣.__xq6ZYי.|'@]@l@yׯ⿏ A (A61xQ鳪iz ww ؆B++;:rۅsw_7! .0!t|H}@R5hP€o Ã^U?̙3{p"ꂺ\_pLB ˍ; ۅ(k6;vx^TnրiM†g. S?( So?P€OuDnTm<6t?<>B(z3@ ˍ*ۅ9hȑÆ V\)W`[?2(ԍ2@qP nPh6Ecƌ-D⾥Ϋ_pa6ZWnҙfYNLy4s(0 fE@PP'VX͛7p?P€M[㞥VUnMD'i'%Vgz0<(4:_D@Yiqߕ jqp@8(7(4"?jr!X5C'UR%iu!вr's+.+2 2 @.L>]x)H?P€KE?De˖E6m6y33:ϼbe;xۅa0s1ȣ.Pf͚-Q  u@:1hP€IQ5Ƶ{ؙn(6ZU83=eQFEs#֯_/"P?(P?^ ^w_`4 @qP nPhEGq~#zU۷\"J;Ӆ܆Ck:,+% #E]$&_Q&O~QQHkErj"@}@ Dl"B10 EӡP€C)SDwqÃ)?;O=ThL ; ?^LlFO"^2waЊ,YV0EtMÃP p:蠃ğ4LPP@Pp@3(RPo'9Qg}v4gΜE0{6@ `O:/#_B8(7(ԟ"#Wߡ*^O\Xъ"LD/H`@j6l Z\@YP( a@ h g9 *y(uY3 U 0p@*BI2(3_@qP nP7E{QG[YO첽 zrsM=+'zk4by '.Pe@ \(P/^8Z~}⠦ A (A-$7qhٲe ?F@BF6G{S1L˳0l01IƎ+辢qƿ(% n׮][&( ǵSf A (A-[.0aO6D, e/3E{€,X@0j&Dk. (  eeaC@Pp@=)?~`'{؋3M<5k8ҼxDE., ZMő9 7#8+W,5 -:7-a e@ <(P(xq}i0cԨ-@qP nP'ESn6߳gOtUWH><&^/ק311eY=%W^yet9 9 `LΤ:(P(ǤdSP( a@ hc!mkz.\mݺcGK"-bљVeYmGQ7r %ieLΤ(P#_5A נ*A8(7(ԋ2-j?xѥݵ|a'M&'s?"D(%(% rʊHޤ|(PF J_6 B]*@Pp@(>qԓO>)-Ȑ{>em {qdžT I{n뤪r}p\@( ZJ9 `ĈaI'$mLPxu(l "]eL)i@Pp@=(KpF?RiQwSOY??s̮1o:Yݙ.) ZItPwq* @]_6 $2mR>ӤP !P0eQcdOpÅ Yf -C!֭W=Z<_H<{&Ͼtu)B*Qc7E]M6͸lQ:X`A4f̘~ˆ _8P|D@D.QP !'HU!`^ߵ|_fMO.IS3PA&*) `С=aÆ 8Ml =bm6h (BO(*(h"cx#2GTB12 @1GR0a}gu%D@ ̙3'@ʦ,cx@" }ǥKF6mF-S1ڿ/|}zKQ5ՙɺ@ʢ,ccl /<@RKmͥh҅VP<ݙސe;D4d̙o*G=F4 !'H+D,UzPܺuk5uK@|RG?[a~e)5sy؟c ?X/hɝiz֕`ly=L>l 2dPQQ E]oYB݇vXaI%S$)C&K2}Ckv_#!秉 _@ I9RO `T,.BEyEZ[ .:0rs_Pp.s;Ӓ+!h"%@2yhΜ9- lTG\P `˖-eOABH]6nj#ׅW0}g)'pVAp<יFd] yE~xϼ JD2uQO@!.Phe !„ bQVmaBm Ʃ- nFaÆV:eTKM (b c!ò BvPsh"@BA;vmՐOkm@HX'J=$g}gu%S*BgΜٳ\(T\hp8qW@!.Ph>ew<^CRyW€ܰaCe'ƣ! ͡ʪc jW?~;; tG 0$늨H>;0T?B (v BfP?e [QUM-PO L:fg)Zddst jGwe] %t8C{Z˜F{@_} EC t(B OƿlWZSm湄Z!jc3PU?<ǵmƍe˖u_cAqCzux#uYWqqChDo 3gk@fHY%m72)B §0a?{.=e۳gOtUW6 X 19~I!pL&utY7P}nH<f֮͊][ 9m!@ l2?uT1voD7+ }xՖvl-08n.ΩqpIHj 69D+8c&(B ¥*bb܀}gzI-7 ͏;ө.+"n@@*ѣkߩ> +"z"@P R(IU/boڧq6 ,LW~IplP`ˊn*S`LK s n|p)bY%m3:)B £*޼y4hzcT?!8?љΊ88n>Lw0zEP}WEHP! Qsh" ci|'3gNw~ -@ #v.+5AģZUP+".HP5m1>Cpsl˹  `g-gz&_]ҥK{I~H)prD4 9vX`aƤDo .% n=y3P.f֮͊][YHMhy!6vͧP U5jU^XEl5-#PqA@:K Q"@q4A4BHS(E/ z=E) 9"&zNx6q<ϟ5V(L9Eǿ~esc˿Q+LD8TM0 u>KMwQ___"ԉ'B3l޼yǸ5qP"DygGDeUgbRQ@D@Uێsp8pXf0ٳg{6A]hx!S(2=p O.yUC*g2K,.LK;$H8R%:6@׵tdaêqF@RsE!uk7b(_|y4e1.uSEѿ9sD?|=iۻwow#TrYL"ɓŅ.E !l߾]w.|Xiv!$tnSO?M?j(qTi'GJ,[(9:Py1rjt@pBB* V0iG#@Iʶ :3B 2RяsieDžܢAXޑ鴈? 8ۙrY7+Gk@Tpc;vlaE".0b7lPYI96A7B QUㅱo⿺eˢ7vg5=sIFIEQ E ꤓNMg9n.PlXc@p!$ʾFSCYMDZQ-iVC?/-l:(I(= RP裏YGQ@ߝ7P9[ B7&)#L ?e;G_RiB@֊&?K?#E(Icf 0'-@`ʕ- 3@vLj4C P!Md (ɐSUUǸѮj,?YtVļb#Obä@{@'dQ@͸XKc=ZFSgQ͙uC!Ic q0>}p(މcyR{"YE`O %u[fDjdFimA:@:eq@Y`ŊbP# :L2Ρ'Ǩl(#H!K EKDG!1B%4#ާoS?RZnڝuJ +8$YUPMR0o{Зw:% B8Яe6-[mܸ;#߶V,0* E.|p Wŗ=`~f%o2F-[:'Ǣ (I!.ZK 20L#=,lr[9*D4&+s;וUTw%h G}t:!LS!B|G6^dc<p8?mzH$Wg7Ϋ;+;n.C(:- @P L ya; ܓdnV}=Xbs?rY䂣BUi9 T#41Aƿ.c`Ηan '^,v2) 4^̄${ʕ+Ž ,Y06\~j~?/5U~ ZgB{;]+@6j+@G0q"%~"/Y#@ ,k@^#@3@H35//ܫA>ãg{K~&_O-4c<=?)5Hҥ֭[*2/ͳB Lr]Y S)&POB7k܀dd@Tn.|q@U_EEr~(C h[WP>"8%wg!XW0XGnl"E ƭ?/Z-(yU@T3 gϞi[> g7 P |xpgrĈ#~X7q8 z=NmgqF7_~g/ Iƻ\݌̇Oϊp8Z#U<:a#`y@ P|;vD ,OHL8"((1lRP#T1@F&t# xlh0xB?:I zj@HvhW GԚ,'}YʟtI|`Oā.HCY{MF1J0ȳBIQ "?w[R}@zTAFLH:v&sYAH?G5C1xx y_[BgpT MMO7\N7M`9/`9syjN\*,W?Oy<vy6B `K"@1m "|>L. + rYЇ>>{޼y""d1$Äi;6zoQ@Vv_ڵ˸*6.x|P(?B6q!d_ҙγB\ላδ$t? 4g `ᅉ K@u{q"dײFJ`è4lʻW=+ Sp ?B*e#_(6Qp6i۶!E҆ߚc c_ji=x yxIR5M<7 jc>{#€4^ޛ꼸4#a~xO<"eZxh ?7Bj?W\qE!Bի /PTB.gzOOGJ3W\};&&f?i*[Bkf hɭU" :>bw^1{/x׿F?:nGDn }S Ӏ\7Mѝu;訣€CO(:_WرcUVE'xx-;쨄\^.!mEHP?"@RO̙3 .  ?VۆJvYn{CCxU/?}E& d }5?7]BrM6B|D}#GF{l4j(;Aŵ>?ɂAJu]W~|#ƿ@]WA?4:OHp1!$LlyMĉțC0 "E,@NM|(O?ׯ+`ǎZ#>k>:pM!<A*R$Nܳn:yD[ޜĭ˔fL .ѲyG^?zUsyßcM^HSdGmowv#D]E!E Rg/Zw1׶ƿoiEo.H|?!)I"/In%UC$Goml#~OB_øG?Nܹ3;EQ$OZ!4ϿMȿB'K-1sjljx;}Cぴ P,?͡k"qYbH7 W_OL uk֬g#*_'mRW  A$L:eqչ.>RJT&Bѣ<4zaK-h2m.q/;(}_N8;^]!Ykp|g8蜢w=HZ0ёR38&u0>ӧO7?`Ս$_ˍ~Y"@Ȳ.HSVxQO !/D_5n~ȴE=?.+?sm%K+?k?\/`%R38&uNj>EܪDI+*Koԏcv~mm=iQFiq8? I ga{n7 Ew9s/}K??B,-yӖjljcϞ=?UpE~V_‘5irvH}`, I8?~EmQ,K4*xWZ}{y&?Ol<.""e gI 44_}~'G^{m׾VDyAe@"﷛7oƿnxZ\2z{ӝ'? M׌JbOU&EqΝۯ8`Dx0u"eqgY6˾dyMjc0OGW\qEs%zm ƿJJnP4"Q@LR*H@q@u@?n;!Ͳ  a>âRmrӪ6_?Oo+N&6U@/" TEx~j W"@17n? n9ae?1E{\_]Hº9A?λ!BBftnLZFPPPMZE.\C@D,)/ ac4M=!IiJ1)@>7ym@Gu]#݋A_>#e˖J 9_7w,K@ ߝwCG̤ y*zu q#Ait PɒC0m3n?>#lAH^ ?mL?Z!ӿsIDZF:?)_c>o jdF _yu#א;NŘϺ|\?JX.5hFÑ2i pWލWZO\xq, @>mxa_lF!>}{_w^]j#no޳}zO_՛m#떕ey@|!C2ڵkM3]BY<>RY#zeD`[z!5I>'*9Ӆo}kw eKZ>mY|:K%K[l#O,4IHo" }L@$.1cDJ*0K4@(dom"QC7l dܧUOT{'5$"}~y\ "@0 zLOJmܹ1hG/OJYсBZG:pj usY/@?L1OJ1Ո1易v!/0ݛo-[￾) nyyGy{[od\$@Z>R\y'׽u" tH9g?+܍~rq 'D_;;R?^{L.GO<9:OZG0rwCq ~ `3g "yE!d]i$+01SK\$@{YCF}t%I ۄOJkրb?)WZEW^yB?~!Kz/Ud>2?XڙnhQ/!y7!@Pvm?4`u۶mљgYgϳa?7헎Q5@ en?.j~{//g W_{%w?JlGGsTt8`8i.ʋJ H^"@H%vHPb{22=7]kW@1@\"yk_2,*o޼Y!Xce'm-=?!du?dc][b>яFsNw^q"},_VZ@'O 1'6a6Q=Iry"D|?O_rE裏b<2_ ^y<w>z\?EiD1 IQ XibQтYt*FH LI[ Ͷi]MUEynN枙9s̼ 9s漷7}ʿf?^)?!I?:4 ڭe[ڡF{ Gr/2m`JogC>)C{$؃ԆO=׾ּG.82?g?UzHfL@I?n0;g0OH'|%ğRFJUȕ`N 9|gWX  =r$|S2?߾= #ИP~h?y G?x]U2ژz-?!sOqY0!RBϵ{ٳg͝wYzK糋X7V# iz;v9G/}6hOIu}5 IȿяbJ!O'|b%$v ȃ] 0gJpsh? N΅b>B=F D(V~VHn/~q{"C^򏈨';c.]%Y韐JH0rS+^W{?w E`B")!n  0hp֔^w/]}!@C| ?׿^zK0B]Ē- I{NW;Fc?^W{^ ZeO谾u<J+8/ula)CG):Qu .H}?m޳@ݻڭ|k,eu}5ZUkƄ+c?BF'QBP-pv;y)hJ]`LJN--cнc#e[ۭ6g&6@ByS kRyey>/ YJ.uw._WC+/"`h92 ]C|F5Ou^2}PPxϞ=,Y3`hTg>!0H(믿^zK0A.?x{x@CP#xۭR ur{۟ m|~_h,F0okvm!)Ss|О4B5v,gs n(v me'?Ik* Z2BijC}ͭV2 I D>tu v]5\1i>{H=FC@ݰi12v~;s=&nv+څߜ1~*fϐB%!yPk]`[D"wէhUh{ )UZ@Cud<4 "hvC㏗Rs7];ޫ!BXٱ?^!?*ܹ+W'$!|$$oi-6T nn@-2x|s!d:uw}D*@R`6)m_W'>Ε>ץ Kӧpv~ A?~Z>IV)j>| 1`hV}cLv(b_ "VWW~w@CwN#ܿoO{??S nEc -⏐L @pPkA`Cj#pȑ ]뺧N{gkqPdF;h _\gϖ,Wo| _0v3 bW!>c1:px}Y /$o#V,N!dOCU LW P:V(ԇv4@ߚϩ\(¾(W_}HA7ٿ3%e57t,U}{k>"@#\t12(z⏐bemxFsvp=Ȣ6@Ե >s}ص a ˃>0 CM1>cyCs׿ ?co7 [>!RV`@́kqf޽}hsw"~t|/=ݵkW3ѵBBcֱϷ=CA߽grO7c҈haSsQB0Bu * iO1?6ko" .[$*⏐i@M4DMx\_h"!}kܧkϜRs;m<ؼ'hR$=GBr?d=.?(fX#B R |$>Q!.W$-0S$+@H`{ M;>&*eEe=yG0.#s4]\pj#<^ hG?!>BEK)(P$ЅO@h{wݮ{쯔!@c$+@7"9))0&Zgo ւAR!|#nVE!bB#R+i;+i F~(͏~" >gN<]?w=v|Nl#KkKlll/k.JH X\PZy]Q0;v7-'=>n߽KqmNب5LH?UX ۟裏/XGpD^!Tr?2-?} B8Rtw;CCxi Уm@M޳0A? ?#r.u(߿/__ C!OqLH P+_{^WZj82=޷Ͻηϥ0_{<\hgm(MYkԢ?t<oӧO{ιxQM5:8a!R9F|xxxH{Q{h2 H [wWNr a$ h?9zh N0)Du5D݃VeOP?h^~BұOkhny} 9]BD2wxH<N)#J?-[=^ob^jW? AkV !!˃z@2p>Çڮ}i{A?s4 q|E4 J6<Ԇ4N.`4@}^ Ljw^S۟.\h<Ν۱:'jP,y#@K cu!@ߟ3fw CSJooٿS_TڢTm(~S<Y/Ak?fן 3'.B " !is׾k2/Y UpVx8{lc_z{Kō7޸-%¿j/5~[W#駟 ~xޏ0',B(#¾-P}C5^KX#;": fݒؿvZQ&IDAT 믗⬁ޯ3?;9=6p\y ak?p°!b:OTDߖF2 3vX{> 1` &v }ϛcǎKoO"1s=,+b|N%{pz ?ABƂ0i/,7-F=gm;/4?zMF>@qGccI2V">!:Y4Ђ 9u>-BRussBY1kNhaCwQ'F߾}?a_#?:Z!{YOLXݟ^BYNP$7&A4 n{\\}0Į5Fk4^0`Iz?OMF@K? lo4xk`o[O6̢f !A!M"!@͆X+E7V08lc&*sn'(^~x!ODxi >ܢ?t R "ℐze `K%5 ws[; WTZ{Ҽv^cZm C׿N~㰽vQEʴM#E :W5?%/]x5IN#di"$!;l!P`{99 ?v}i3{RzD @HkmF[#})'~;_^KǬ3=jwk'lGrZ BO9GBep d`?ѼC;j^|#1;_P~4ľFM>ֲ y,GنB5e j1 3>&= ^c9[jȵ~H_>À8}{ o[i"=sDr,9ž-w͏5 _pW#J2Nh U1H?O"?Ce@O fO$b mkchu]"GT@uc=ԼFڒk@*) `M:-oG1CLlV'D0' BH.T&띇Ԁ{׼=i> 1Ub ?t1ץZ']{% HXs/2 _~%`}2!L !CLPC@X{gmq}|0;h׺6S"!g$@.@ =oZǏ? !*,!$כ`-MjzZ;\lT@̵b^b)ݷ)Y@^rzU_~??$r B,G~!N cB]ܳ&{6( #cYwE@C9sƜ;wX~#yeAI͚Yt XIy:o"$*@;=ڷ\B% ͽFMKȀ]4s{ x|FyKr1.>? !IS!d$ģk>u""!@^4\jrZj hrEh}j} ̓O>xg?!$9|!$K}a@Ch%xȑ bס􀮱{hA fͱ< uT@HXD?!Ŀk])$mb˭c3!R`@Tcƀ={8Qcι\w\uk%UD@JA+ |CCHUO^``?!A p=k%vckدCc} =u>A ~ZS9KvZ臮 `-Go?}J/p}S` &W@Z)}MƂ00ӧ]~x <#O!uC-[z.b vk [cbB9k͂輯!.!9kh8f1UA\PfAIџ}}†'T4&! "3 Zue7ͩ k0UKX7}>{"?bPB&0!s%!a0M}KI5Of!e Z QBa`PB&^!S&!htY1fRFhChE0@(9~~a( !O&9C) Ak 5'r[;0*9]SU !g96!saX}Q. xСC!ȑ#q@1wq}v-s4{(j W^y9 |ͪE x!u6S)BY1 Czkl#_c {6 >ƀs]s]О3&} )1BΝݳ[lj !d2w`1`%&"@;* b+T!B%s+@S4h;?0G /;CІFn} _u>ȿZQ9_H|}!/^hΟ?roX?Ķԗ{ !NlE~R>BȢNc%7CDzJc!`.R{S,1"=G> ~^$_R_o/ !KruBN6 Cj2 :÷{nsmt]cc#\rݻT]ׄx/b!v ECٵ~}xY؏B.C!tbVJo&1 ">B n kp}B aM?) ڑ>8'5>!K{Ael#'|!?`,(@.cB1 "$BnhFĤ SOp32@^^}9x!%o_֤ J]5\ }"<`A?7A{ }}0~9jCD??%BYT󧷟Bד!60+ǀ{06J@ÀD 8J#&|i| !/-0ٗ]GMm}nz !d|2!]VoJʗ$m:(i19!e5D́T1^}ۯ  T~O!#YΧ B` 8Xz#m6b>$Zcc뮻ycϞ=ۯ6cqDex𒋀Ƶ h'tR ia'5h Cz鍸%: :@mD@p` mcm@qٓ蓐ڽ]_ VȦYO!BRU@bp4\)1Cŋk |n7Eo#j(`a4BHRtA!Ӡzc@ Z}c{dG;WO0`ou #" G¸VľJ~/Em\@ˏMCO!٘S!̟@` /'bp~s(*c@" wo}#r=c(nwkυWyA#%%OrnQ T' Bc ƀTyCm!Bl"cHQ0fY~;ᨰ=_R4BHL J"|i@͆)!bV^!pE˘x(]?5_} /~B !d:1 A"6m!FmDsDD퍇sY"&$nX-~B4B4Y34^ 0ŴrȘ`\55q[t }cv8?{m&߆B& 2}ַ[p9l/& W_) !db@!Ffpf )0(IkV|"%a@ûY42ih rRDpm- yҁ`NxEOԫF*?g'A!,tқD HԀ'$d 3 !BY^̕חL lQ"ءxŁ~3X% 7~D@!+VKo&b+`~ z󻠗BH B\ *kf> @:^~B!;B+fis%R`a)H^dgا ' BbmAQ@ b( -e-e!DA! VMH `@psKc@o0' BRYF  !$B!`!;:BI BJjqHSȜ4WgB!$ 4B D E!aгO!04B+f!ӗ_WJo,=o+B!LD m`ŰIoؗP~z !L! @pgV #0G ! !,fa$`p q|B!B! b׏+Ɓқ#PB!=@!bV.}g{l%lY[c9 |B!$IP;M>IENDB`ic09ԗPNG  IHDRxVIDATx%E Qd  $ "CP2%'0HQ 9 i@9G !"^o֡N{ywD$}H""""""DDDDDD!"CDч """"" @DDDDDD">D$}H""""""DDDDDD!"CDч """"" @DDDDDD">D$}H""""""DDDDDD!"CDч """"" @DDDDDD">D$}H""""""DDDDDD!"CDч """"" @DD`j)?3>Ո "ݘ1[g3t7;crm;Kg|>>}ѶIg|~Ng&ΦO\DDDD4]/tƬ1o2O|&Ȼ:x37;c|gLjz""DDT X3EEd`=A3&6cH""~X3댥:c|;֥rg<vIDDH""m~d@cRU__>|/|A&/~}sDz 'eg{׿zk|VF2`1x3%Z DDvg$% {qB]ǖu^SL1Őqi'$|ɐ(, `ċ:$f3DD"@#Wf|!!ҀeDc[;wIDD C$ -M<hh&C_U'C}vyYfzSǡ4뷅5-H?A Dt5ڳzDD@>:c#䧞zaf}4L3(,̠O_UNY~`M!W,Yk}B @X2ug-DGDdD$M`T2O-~m}、m馕_<,*I?$W_}`wDE U81 @D]'}Kު:$]/o~o2z{y3gB^s~X!.WAS `FM$ @DHG۟jivз?zRL!B#z= F4A2?k@/:*h2`WGDx @DU@c:cr34/[ۯRE!?E\YziB@!0Om,U@3d&DTYM"S>_>B_A }sCgE:%l](3F a 0!iV He{, J"([A"A@wTA~Q_/,2~FCE^K#?AV_|ŃR !za "(D11>3.ge ۨS2@V=1N8:D ڿD1ɀ ~(#xInV{_/h,$dg,VzKH"D;Wc8-q~zLO>sϝ?VUT3߷}/C}ϗ>[f_Z {$N෿DIDDdđ/gN>ϫ?DۯJMWE .l^?sPOsTD ؚvE"D`D2Pw{ )mB?GJ'b^u,@)EB?W ~NB"ЅPYp׈ V|%uYg? "?`o*8q-?O;"oCU PV9ߐxW D~<;\S5ǀ-};A*[ֵ?i)́Hd! D;,_p 5 gd饗NF Bl(Rk U3=G~_425}`3\=c{: ,]}0شedh:}{| $`8zpK `@'b0.s\_,T?*[瀾z [g D$QqzģS1bӄoJn)y'SSSm4? +RrmEK|i Ѕ[t [}T sP2s̑7|b[zHKe0" f >D$ ۦ3B o>֟F=gᕠ/\65mѵ?oYL>p$3p=Əl&ic 0: 9iZta-( ;o2rH|^Oe=A믿2 8yQ"JZ?~~@~RlǦ~y:`~_X߫J|I>CsoF{va1 0# 3M%t$@OtwINI!$F-$EUYt n vI<@?3~oc=zP?ڊOULUm`4i~hfWxGE]\_=J~?%$BN͠@̸=+-/|+7_ kf|@h@``8"]X#MAs?HMsVVx@Qf^iW"CB?geZkL0]\WV族ct[nT-ɚkbpH)p 6K &&ր!Ę83HN?I,#7|skX^/(s96~U6-_@_|[N^1l.K+(0inCuYG=Hs AXVIl7sם" )I(mfɪ B~W_>Ň\~.k !~]~=\2\s-:.O6k@hL>-V7tUj%+ Jknm6?I?^}U#X7 @`TbmNV*vih6_nQQ͜s`wխsx%n m͒.ǬV-K@2i,ŽJ|-$ k@`!taM_?~E4mݶ6_c" 3THij6kM+f-MWK` e6:i؀6H5CAWAWI4k-ܒx1րI&1@ @wAb5QPƗ ?]!?Dw뮻?_-*@?S[?mӂ(m4MGSS<  3.`Kg? k 03ViEB$݋Q&B )/@^\|Z?`ape.6oB 7I@yyAzL(? iH"Az _LJ qӽ%|%Lw_o44"b 3 dgHC&%Y%Ѕ;k2`gAOK #;cX%?[9_S3ʫK_&W37lzWk!=΁!$s{* րк%Ѕ`GӖ}S͏BGOO c@tI*Uǖ:҂Bs] Tg#K# Eff]}\Ń~{U!'u.|6 k;""-H#ʁ6N!{`j @o7X%6fG5kG$톤mH?DA @e{o~g>tӖe._h^S&HMAi3'YfcQ9KgAꌱM_7"h/)~rAZ^@?WY_kVY+ blXLg0묳*"-b2!.1XoTgIz Wl@^3@WR01E$Ĉd o0y_ JŅr w yy|+ǂ\B| 矖믛7~&Z\!U.F\$Ud HCa P @@1 )~De]Ta?oA;_iϡ~t/Џ!Z`H }hZ\ֲC9D 샫O.Hޫ^^@J$ h"hFuƵ'~ (Ᏸ*m9׷,0UZf].oMVF6G/K0g+4+!50|A)p=~*.EA<~V5lJ\HĦS"hA{ͽkKeC~G?[lٺ.S%9O?}OS0_ZhyR]%<袋T`.ںHzZ I3qM_Hk?!Q,~B+/֯=o{o*{QHK%-\\e]q m9i$@Ϟj0(%][_᠐ip!D,E~[dyMfy_r?p'w 4f+^C$KcLs, ;-\ry ti߱}uH^/ d%"hVq3-¹6j7SdMC} .L(eup,1z``ҹxG}I dl+"h:cAymOQt*ߟ>H@(&`N?2TSM\+,)زW^ye@ǻロL;}M]X'o{U.sX:З&B6KX|5v_r%XNBhP`@LlԏɀLHnRwhPWk6lH4?WUT|{KF,b )5h @瞳|$8Xo]u|j2=Ja <0Nܯo]J$DP/#o>u#!6d o]B-+Hto)[5*zUu87XYdÏ~#)5>@Y& 1 !6mDտ9眣~JI}|iLjc=VYtWl!$@2x KWJIIP+"Äqm*di}|X;&Dh~.U>|wN\rI?oPm) A@x$ 8Ò+}B/$@'$\?4q{"K op W@J',ԀHD+fsvJ `P?փpֿT)pi+jAL$iOTCm喑4n!:^u'l?u2V%\pW_".;@ L֑ԄHǨĨG?OT֛iĀgĉ~~*AcR%Y̲ KAy5K _xdL! I|̓UI$=hћ "/ǼY-]!+'w_V(J  '7`%u mE:>Λ/u @4ob9csϭ8|~j)AY}Ζ`#: "C&zBuEVڷ 3f s K }~[a:@ ֘1cJ6~׏L >[Er}٪MwqW^@[`yBp  X # TQ~F?UK^B -Y6A?+!d*,"Âͭgڊ${#B$܈ tB?k_hTPWWDҾY@t Bz6MX 5uݽlEI/:`U$?ʢ F6}.Å<>rJEx#EҺMOW!$@N4AT1 0H@H01 ȀHc8^E _A/f\sͥ$,/Qi`>u3iЌJzQd5%YP`ڭM  *1a}Sⷨ?LM㮻R:?H L]6kA'a0 ot|+2 ~0K^W؇&үtKKҼhQ馛F 8v?NW'""ýD9d1M |58"d-'cf13QV[)t2Of&j%7|snBdMT @oAޘ8@¤ITlSHZdU$@@-Un UO_k1cƤ鯵UafuN6UH̚Wyp준RNTE@P}j W_}uk!CF@H dI1gc'Uǎ!5gyfKA4}5χ}?xnKVY7|SV.UHǾKuJ ;o?2r!ɮ:X0个&6W-(@ $Wp}ѥEg/ 3o X)jJ@F<8vjZ }'9cj=7XZ"eeP:A 823:cBb)T| vM6({TscՂ1Rrzb%&n 䱴&Ġ$0"т . я~b?<^7~kW\qJ-uHNM_\y@pa}lN;m{e*C?k~.$?AпgRE?[ni^Z߼L/I/pr~:ŰNaBB"LioDS=tO>}&hf>( epϸ\1(0 `_*'%?`.}v@$ͣ,6}_$ʛʘ PeP sT X5%}\$Ww'ho"c ,L?ΫZh[n&`$ͣ_b\s$7Gqdy/K@ كUgHK_Jc" ]e~C3YX~哻kmRElԯpO/K]l?&D$$"h Ÿqm٦&3zEzsTPF<@JIUgLg#OOſ_^kϫ>|wU<@c @{`s1q tD}CAh<_RwmD()L^sO/"7dyi"MME`1h+}z=sr5F_$ >^ynL(5V?sϭ:!ȉbhU M̭z:A%Eh4}. B&P&!Ax~?Qj`?:CR?Gߡ ?UkH>E$*tK<@~})v k PΈx3n#T)&IJ(4M?pՆ f@1 9pXZhUPٿ+@Rq@<=fj>ӿ<5gMkﯣipGy /`s؛F~i&x"*W5Q|MNJz8+WuM6l6 QG\m Doe]>D :e4:*>J X836rA*F:#_E׿VMM>Z|ou@ȆKۇH&KYd'JHQ[`: lˈ0SC]>[BzЫΐ?bѵU4. ;3fLr7(#T|'k߶g}V),M. Hi4)AW@/:*ybQ!L~M;.iZCz䢋.jl"LzZMtk$xk=+9/wxS.SN9%/?RM5I?dwlA .hl"LY~m%ӼM@egV -PWNN503'D'7Um׏Ip '$;CkvmC$hQWS@U w _w{ݞ*K`DKo;/W 7a%g?Yr6&A[ :D[ (J@ۦ HkLFq?2/<zLp/8C(韺:fo_?& 'bڰB~{U p-q1#$MC m%/R2ě5E@U, & mG{eű۶ZmM1hKPnHv׮KYPWOzjuSSV_NSmMO?=OڊO>Q!XV* # YM=][+m%@[lr$T$X,S؞z?$6vӿ~M38#O~Ҋ@c"HI0ɥNXM.MBW. 2V.׍6P_V@ J_]#=Y`TgLy"-2fC& &6,kN?to#&MR+M/MA_5 h+}hB@^W@ K@>GmOM f0J|_8iy?e4 vm}G&V4`q0[La1ͳBQּ`8Fd[ 甫B74}yiCHAo:묓[/3𯍦|4IfmZ𒂷~aCs俳G MK@$X3@w!V7tSW݇~ծڿ8ɑGԁeu_?& M6,@N:[]ŸA/MF|K'.ӿ9ʨV+fheiX,EHv)?Q嫬J-ڿ-ȯ:&sjۆ_B o= H@[ fn+m!iX@J~4]Hpb?f9[I5I(V[b%PX?#jo|-؄ l+xwE <.A@./VuCuv]qvIt '{eɤgMK Kl48-ܲ /L=R~ dǐ?SM5 "[.T/h\xᅪKc^!2HBwqr@<M,sM7]# @eV2Ł N 5ֆ?7[k`M6٤ /y(]%?Czkh+ RՍPU6@+VJπ_UƐ?MiiimE+H6`V,#8"9 ]elof`e"m@^E|V+@[ fvF[lS"xΤVJ03Α'Miݜg_S+L_V,"DtoE@c ࣏>J2@@[lRɁqI˭To߶z>4MƏXxI=#@0|]Y &$O>y`fF8m%C`kBIiy1QF&Ղ[R987LߏڿcꫯNF݊3HtA/.|Bڏ'm&RJs6|}Z`hu]vK+? $ByQCJvCڟ~d$6Mڰ@P 8Ywpu3%ԔSNܘh qobhmJ$Y3'#*7ʿ۴6I~+qJyӄ?dE3IBI@`H$mGG@YYz 0seC%օ,O6S\Zw0IK^{V,,"onFw+ϴ 9ɼhFd0HW_}WVJ@*FkLcS=q0i@ZkՊŖV /J Ϳ)YJJ5b#mȶo>+@XP+q@+mZc;@H.$vi?M <ݪ& 7ܐ暭XT '|rg+F\oJkB^On_|PȠ'sʶi[U$h2*Qjjg;@Ǣ5|y[oLXcV,(w}3wijsi>Qm:*k/D7f^7 yS) phJG%Sf-~]4wV,(,XgL߳ {Jom*ip.WZi!'us/@0m~ P}k>v}+ $B'@bI_E@wM'm\otLSNIv}L3 eQ`~ Еx~N|oZdHA桎жsfW^@'T@m`#:P3 Z?p (pn'O#gzkUjYgmt40d t\@@$/b.Hj< @1did!-%PzJXhMJ`$DK[xU Y&c?EmC~E_ ` @Cp~s'Lc`򹐒o0utm;o~izJob,4}@k1 $T1cx2SzA4I{^+駟.W&X~哟'*R^xarNp1B>0ut m;w~C OJ`+"Ŭh{3C|^s|v.hg^`iU> k0>AehI}W~8v{z`@8ROl~ Жo pBCdoOV^yL %#8B 'm)O@ @x`0wm]/3yM Z IF#o-P\ھ<.3/$ۅ|6@NHfm7񍾊DʽY7k`( הu!rPvJ`/AMe!̚_f뽶!>E0BBaf_|dwV~<?~|j߬Y!}QFjn#mPߧ2  4 i6,L?W_yچH#'wR/\?`Lhc  @y502`fu#EpQG%>{~ ˳O BcmU3M^{dS{50nKN8L ~ 6ZfeTAH@eєOh4-&Z-?n:G[NjE+o[t`$ /+Rn `/ kLkF@ شD` l2g^g}OJ"V^ ]Mg!yj\}ժO0t+m}*2`HM dNp17@RmH?{ ?' ,@?9;TN5;Vi] {ァ/<7P6hҦ#rQ_`γm[M&᝱/X[lRsh>k_ PC'l$Wy^ qqNA/ kFt Ά6A7ЦZߧ<+n&%0V[mru%On$Iւ@iqi.k gqƦOO) kV%C"]‡x@)SN9eӧĊHGZ w$ЁFMI6k_"1{aǕ%&ݟHe9L&M47@`;{AIf`ay'#|?@HQc ]eSs5@'?Iɇ P Mf@ h+"U- 5 l۽FMH7J>h2'yy饗#Fd^`iz,uc!O?"<&T~PmC):[mum7@j?3ն7GP=fdܸq|\iF1tөE@M?LyXPi6|76d/nDPr`Y 67@ҭyr>&DP-87ܨ.hL6+HB -mb'າtMW\iڿK2^zVvWU zlW Wk4'78?W|(tHIlWYed 6Pw lK ?\veR|n`k @uu^ @su%a] R'?8?1S4 i;to#fZ/j5"ЄkE :>'g4j֔%*iUx Lmiз%%kAv*a7_~+?f{* =(p}S`WLo|"Xz< 21kw}=ܣ* )]|nj"`5/7J|gqVfGZuK:cIU;" h"uY'?h62X)cL/^x &Y &".Љ+}?\l`И<y[veBж{H66lnZ)冤QIvg(7@Q?H/il{w|>-Ϧ sq0>b6 tm,hyL,^xaW3TE| @&X$nƂ~NI7)]2_ߋ ~7y 0i~4F 6! -7H7Fbp5vC^$M{Sn=>PDtE7#%_xe4CB쟾ش89뮻릭|t$5?<;d-ܢ:Œ yෑ]g5˾ L/[b|.%\W[#dE$l7@t@`XPK:`]ҎGN:n2W/ѻ;EBa 4".?-p-!!A>}ɮ:ЍUtgub:`]nX߆n*!A;ܼw 42B?c|1iinWiB?oZ_7@Ÿt[Ŀ O?2:(ng];r#!qXrJCM>#Gr@Ld+1 yR`hqۦ SN9E M7->"`YSڈbǜZЪh'r`Zir[p4XC20OvءR6 K,;<#6{9mBL!f:4ӟ'U"L/V(_ - - 450M_r%|2`H&& ѣGVЬU n 8-'aR6iQ|ݍ6(8P7߇7Ds?T=Alun#8B-[na *p-|IO`:s<̡̣x@PE4~R%|s]8nH 7ܠD-{ ӿ>+@V OcEBkE蓁B0Tv+eܻ@@ˀ|kg`AeUJ;:cH _rJ@&f$&S?R_"2LZ7ޘ<c=%!4+XK6wgRK?׿! ׸@^ ],](_xcR@[od7hC+|-Ȼ/L$*9蠃sbMC$Հk ^i(xV[Mw҈蝹og1VD{䕋gK[Myo?B9[Z 9w]i (+ OA b]p04J  B.ShaLG}TuX$ϕVՇHsaɂG`2oE`˵t~@~Ӗҧ[.EMSb^h;pŢQWMy- Bd_B4~`y r ч8 UXv|؀}Wn^* 8X?."vl{`~scSHL1اnzEQ>HD҃=͆UT2=h{iր6Pf `+V!i<{챇%E+v[ A!|pr;o<2ۄ+@$壍@2=.Y}_MN70!IHB~@ve?O^|EE"`pH7n2Ukh]vʞ0n0OS0"hm#@WtԽx_$@#`RgYV!K2p{V{Yy4 ~ F/3z?#KJ`$m@ w$gy2h~  s}.$@?V^,= )8X )m~ L(5&-O, @DDhoJ J駟>p`xJcTֱV!.@z Oh]j™~:ρiE1'lZ E$6~/"e@k֧ 5\PߖϷY~iRdP . Pea}L+vlՅGi+">1۲8*FXpM+/ JBA?w4ǚ@ ` J([ 剤.r-9t^_d]wU9<7-O>[|tmZ{m"1:ЭfC(++6AHZS9HCQf&@P\UbTgQc*~&3+X)hTnԍkc>FdDn=۲`w;FD$ -#f\}}~s=W;i cbLg#Oՠ e,mcb#>|/1M[N`$ݏt$&c#6+`h't<쳕E I l 4))13mpEՒ-4}K/ ceRS7};ц,$ ?Ha)A>+%㶐~glD G9#|ug'K,D2s)@HE٦>3t'.D"m#e)*tZ(9'T,,z-\X()PgxX |tJ:Ouk 4C=dt~.slڿN| qD]hI@6uh*+ .rCBT@IOh-OShYJ^gL˃}kɼΫnᆹjF!ݑT!|H  tp),TeW26i (#ЬH Rؑug+>jlkX 6;d„ Z+їf/"M_I@L`!f,VgX `x+%A:ŀV] UfH@M;o~FU ?2CS\Y Hڅ^HmuInefsH,@Zy&llJ> x m`@@g19k uر 7ܐZQ,tK3  "@@$m{S'ZfW`_!8z\sͥUŀVrdF R<q|pi $4IO{_&V!ڿd% j/DFXb\̦+ hnB+ /TW*ޚx≃<W錉Ef `~6 ?umwv Y2@j~"IU\s͠϶?.`e4e h6-bfn*1_+ Ɵ>k:mA)+!\W_}uiUt1$\r Tq|9fyyٗC=Q@\#76"U]F#=F\)y>FK2NKc_U!O5@W@H9'x"ڌreJAI"[o=!/(@Ÿ zwBG+%4]]l28{td @$݂n'vq 0 ϭȪ$`Sr 4 uآWD/!뮻ڴE%YI^g綾^\A3i__/#?pt;@Xb ʵ6L뮪@PUB C:zV*%묳*kC@Gn@ݼI|}5-P&䯭NAYDt HI`= `k l2gw}/*\X,(@% dcJ,"Me]+ W Gc>? "" NMW@]^D` +P_И*4!PYgkH+`j1B_\[18ujih'@n $6٧C/*q6gӌo.n+_#9F) @K BRd;"eu vhڿH#y 0kMёYB olVJ +3 `b2P *%cƌIXc%j8 & j?odBb?}ɿA M`@ Kം@N'MfmRM*BFu 3̠.Ď; W: gUEdm72Atl_$} ""@i6Du2WW^Y2!%~ϥWK`};z@EQ`v @fm|/E9@`Ť /bD Y^ RdsyV̹- )@Y @%|F@B,hX3'B+R&=ܣ~z 2cduߌiY|yHpAU I21R8(sdҤIP*[r azo tY=]1O.J+@yRRΘ-e`gNfedJ_|@eȍJm-3CKe.`[e,[( A'M_F@BeA$&@< `=@`tnO 4K1qdy0+v E di7Sw2O DPV\qGr"X  t  VW U8E 5E@d !Hܪ|Vnv7fꟍ0L"hIomu+ZO&&"(."_("-X!oFm!!ybEW  V mS+@@IIJRB6pC/'w'Իaa4y^!h1r,: ^eRuBR,u!"khM,nVD 6 s׫`,J0 @TXZkG?ry՟MI4uJek6?\0~uEZj!}.@]Y:lWNVYe\n Ut~6tK/!퀉wy{PK/U72 Y[aA/>ߖP;O~),_VXfey>Pڸ.D}@O tD e4M0[?AneuM^x?Z |7.M(kQle}_翢ڿ~]l|\r%;0X"-{Z34Sj޿J}ܦUH7:s̬v"B?s$IL+@ZB5m { Ⱦf}YЃ]kEe1q!,7LV'L6g, mr衇uf]-͉md"_'y?C!V:\e>=쳵{$I 4`Z8@(n_u̳6zwWg=9#%D3<3/F|M WO]Hzîe\uB̩~c{ k^fЛBIW`2p-$'x@n!SwƐwȑ*gjg6 ku6X7O= qZ[׫Z5l?j!'j@ fW,ꪫ&oe=䓵{7\|gRZ鳔j,F*y5\Θcveu r:,KTI8GuTrI')7 .f ~W5 @5'pִ\Y`VSd1f.彮yM`=H; >k hEE(sXP7@k P; uօ]EyB @e? )-d ײyE\\VkXWԽ DXBl( -cg5M>.)Y* ` Kkj?5+<˓fM҈'YGY @.2X[䴚?奩IӯGADN)wuP3ΰj06EYgA /M Yiao$@tf@&HXve=+ }0XH7NEWXG<ʄ"IpOu\ڿ-UfV_^˓''$O⧝vrlB?8c7sYXwu  Y P;;IJWt#Y'u멯]zlV[: ?AgZ `hp_\: #w 3̠m0\\ ȄGЊV #CO?}H"6G (q%cǎVlCY"Dw]wCQ@ÿ+yj; V>@Ur&| E@_f;)`e-z$Bw'e6LlK ,s*1N^7y] .|h_o~! 뮻aΌ3&Jn*RP@hqwyg EW^9x Ni$p,z͔8%k a[u@ܧw !Zs>`0[תCgZ(1/pȢg!-Rb|_M%f_J1]e'@?3)L.zJk>;ҀJ#n0pPAHe J W .]!uT 7- kտ4l$i:ÿL^g Rx%P. "@`$ϗgjYt5?'e?UIX lD,+MC`\e4BQ ~ꫯ<bS R"' $ٴNRXrئLרL03&ѢT]X-29y#]637A( XI<@^ aV%tM NJ X](10G|:@\; TY\TZHF>`dB*`eX@kT?iV`N8?k/W/Oh_sV'4H Y/yq&rȰVI6|sEXiDr7PA~_]9?M Jh@H- S4y+H@ 5FR<}YP |gP1l]jv)BZ: (4 9_spM7yG! m(PMC! n( kvӍaC$`NuQM[S͵ (, dSVXaengI#eUL`V P˒?;K4@J,l&J}Wiyz ۾ؠXM @)6  %O/ZC@@"P5 !K8GZօ2]]w9KsTH>tOMuܪjr m[o9ol(EHy}@ΘUP ƴb@L Qj 3kBۄQ/_?L0ࠃJ!<4@ZI¿2M@PU`pUݴJR(sϩ`<x 4ud\P Xm\ @˦jDaes֖ee+yJn=EX):M"TEn}Y (1RTlR aV I@ۄ?\5 0M(oCL K/ ,=蒪<]9'(dFPpA!M@Pr "2pP"r1F!rc`fD pK :M*"?N[ouZݫo{OUWݽvݻ q RD>[l  |uV,==\(Y\`RymjcT /0lZ I5#-9˂S|e)oOLi7pÜ 1ǯf?ESϦLছn}P/JUi*ϹZf _5{<'/T5\^ `@ K݃+u im T2 }H3L2[U"TJO9 ZyfJc)*xǦ֤!LJPmG h#Biq >;YYy)E\'j` mcRM[m0׿{JXH*{mTNp3QE[ʛ: V @47x (Pd0 [?yH%-[fFRT"Q4T.po}X 2RkW(KoA ౣT׾ 0dMlrZ`iDguT(W_JOMittvRPDu& 0[ R ::!Ou]WH!H|ꩧƮsp c@.>`'z93U33 9~7p/1O\bo NT.좋.o?_?H晣?bTMm/.VHN? ? aA*` !iuQ8,ˡ "͛nvowI|ӛ4)3$ (x#='5g@,\F˜2bL Zk6pèT@ L.#f"_Tha C!0 o*)2_㏛`wG)"gib &ΠB Uݲl:ÆDh;@ Nhwp^* 믿1T(u&F&럋(CuTFS/p7)[ĂeU%/|!{G)׵J|ӟ6)p}Ik C]@ םl`A`N2(Sn[%@&j+\oG|1hv&}l_; ^OS969 y{lѢED>T/&(@R SO=ul`Q - E૵U4 Y0r үm7oqEymf "dAS0Z7=1RәgC?3g*w]B,)Mj4@m Ć-0#4Bf~L%ȵ (.@u] 8|?6@I [̙H20Gm20d.4X!R?M7A@@Z`~iC,!H% B㷵!|3 !ml6BR?>.k@J6A@$@I3̵m͙?j^IPRy/;BD/PPs~" ˜J@R ꫯnz Qpܻ<H {  gpTN,@fHMX 7[r)TTz pM}?PP.rCzv?A@)o[CUW]5XT ߠ66t9{SqK_AlV +z&o"|&>6@@Q0dhmm?PP <Q??cJ +2WW,Ut/Ay.3(I:E{ etul1FH{JR}H T 8#SEE* {!1F!>ۤrUyY}@|S' $~&}9'`|/3ew{OA  !9JL̈6tE@@uPyE0+:|,* u]+ җd栱 2&G˙r..bS@@/C]?PPAvϗwJq.A)! @ HkN6 ˿Kߗ&Ydx…>yBc+ʾ8:>ʞD@}FT$rW') S _ve] *׍شj}v>_i&? X(  &g}] i}͘y1 TTw`.l .]GqᖪZCR.AӬh@GKo .:?PwnV,,H *BS{饗vC5;@dя~A[0rn4̩N輙fs D@@zG=_~y .bC@\*B䂑'h8AMneA Չ-$|VN:^>,}P {9C:țP@{P0;ҷV>L wz{wuWDA ib@G*E$"of@u 2^#}nf<3 | `mˣey#  @"R So} @$>9'h4 =hXW(H A sh{khfHGqXG*8ٮF>+ i ҥKpwy76Xf̀ &DVTq(K.Y}*dϼ\&@--\UL\"]AO#m0̼!d0-jq<H@@|;ߙc|N%p9d۳=s,BGU//(Ԩ2:_ /]ق m.>&> ?P<yh[dyۜJlJa[H!|I+J_:; c~9;x3@@!˶vy*'`kF˱M^f&s&" 0S1Fm%(<>AGO*Y3k7y-j+c>0gI ̂v0 l +67hLiXwPo &׮/?OyBЕ6I/Z´lٲJ `/ܔ;SNi6,EE ST~H. ZpR ͠`.r~7xlU$0?}%f;$Q?huPz뭝 ?['_s=פ7b[XsO%8 #,d̵c¶J,_+W^Q Duy.iWx<OgCY`r g 2FD^!`Z-Ckր`r-&m .J*p駏WZH!\~90%T cu֙WVߗUM2{~pM-e>-^a?E'}>E"wy^: WJviFbHf ,l* !&SNcA 14mТgH: * !Ji7 !bʾodsLw_q_H%8@XPkG 3/,X ~&VX1ϗ:n31D;D, F@;!ocZ!d!֧oTŅ^hL3L%\ sf ] ۆTnsA@?aT0<1:Aj^: X 1|dfDҷ1  Y  K@UPB Pjd"8W@)c%Tn?N_Fʭ*u 'y dFվ\ '*`S[l_E.]bR ʬ9` K\@C9gM9^.n^: az$c~XKn93 ӎࡍ)׭ @ @ q1@t). W|n|P?{AhO9j7ڝ 'zio M*bdb kL;t@4@`T߳^{XP ~ƕ*=@LGfcZAW|ͳZu7뮻UŴZ߶ j#1T@ȹh3.:w}s3*v OPp xSYk~0Zeo701?%7"cdBWP8)?y@:TE@BP  `._pzQyW53+V+f+tH&4Xi!S+F_@R-bNK{c 1WPF u6_V> % @>ދ`it )IbBȒZh(6)iVtw9? }s y7jKf{=aqthG.YL`4ƀ@Rt9/) ?>vhBPJ—{( A%Ty5\H$ 5?3>;Zmtj$H[oukk@[nޟuYŴRe4ɹXr*hؾTc5Kpw>n(R.rŪ3odSfynJ3E0?͘9LWĚN L )zEأT9\T"V :Z:.R%Հ0㊒fynH|m5:b##`o w;|^&}ӌiX %6&$B{T裏6i4W^y{PKy/ >sKA׌Ϋ8[84&)ϺQnE@ " 1fB;dO>dD<̱/蜄}`ynFo۳=أ0'J:vm'?ɿ`S.A@<ǨH褄ҡGaF̜6)]9k.Tt 胊Fyۅmׁ cLۙV?7@[m8% pcb!#\E^*C(d"/ug!5nT LmS.̘^eĝܫmE@&j1b cT@:3>٢3a^0`NM:( ӆiB&"~"}oK/y `64:(9_@K/5u8})%Tt" %9 +ꮮQ_ףI ` / &*eO#E =GJ?w3'.vq9R "\ \j|B0R3i]B@w(" C\U3QYliש/LvhYn, [W 仸yUzTL P6{'xgvm@R >،Xl d[H!/Ŷ9;7?lY3࿒?hbޒZ~ޘW04p`@!a0-2KZiш?Au,Q~xKJ%pwPTƿ'9V!=SO4$@@7(" kժU\:ky?bj?A z))iG9!y&T4/ DŽ88w[0$pg\rI=]eǚ,CGy^}UcvS'{ym+_H0R:Kay~"&6|sc.u1$pi1C=mk>G7pYԿ?b݊;GW`]gue˖e{J{Y` NP,|?g I \ۏݍlbMozSVIB!^D`>Mp JY&wfW}H,9T`ɛW^_`++s(HiZke|C4-"@@`BQ@@8SLWT(yK^|X.Կ ZyHHG M s`Nt@7L2T4N >Y 5x㍆CRW2{>ּ@w10>X+n$RBodh2g_'P>T f )2 cϔIsvz7}fFݍtlIV8 `A@3` jRBG@@P/{1SIVj)7}SFE< \:+?^0P0Pv1n7L*T#8"jTAPp`?LcOm}g G˼'Hb.\hfmKUHnn+hE` =.BSwC@*g}c:g_&ϊ;Zzw{XXB&sQUGl" *ڇ ~ ?Xڪ/Y:%Y S;Zu7Vۿ]sBخ ;"@@:`u]9QL}0cg蟜)9W2UC`)\4i:P7,TO'}mɿ*ڇ #}{_?U ;dOGά0zdn' ( ăo> O~c }1%W\9gNy8Ca\+Ф"cM7* 3&:!ӿ@@P-b}̱k?~*^aH @[ouVSձb 1CxBT ;Đ=_H!` JDS~'@,s?oyD x0gji])h*C3s##fOuٞO3d߿`hhh[Ξ\^d @,@S?Τ 0W{Ūmh*AolUF|p"G`h̔k`_D|Rɜ\ f 1c1)"@aPg3XQ C@ %k3'fƿUV~8CdFˁ[m!&P:sU9 P5%c4A(Fl'C@}vlwS&o{^WHF\pA!I!R`3f8Pj+IwZCC4;K"io24wkNXU9$P(  Uȟ?چC|iRϞAP]U }- d_д@x~{vGV*T(&*PEp}O?^ZMW  bX쓏@[laK\eV\H@ Džved8$@ pT!gL=/$g`H5J?i.`3t |WW |l?xq␛Hz+ 6 NZPPǴ r:7$ 6E'-2Z^ۮpe=W}*FPM7eMWVAIߠ\m!7 dA U,sN8g@HiU.Rs|X/'opLSgД+TXdL+@B*!9s`МŴ_Po"li٬Z W Nmi` PP4 "r4d4XT1bjzhvwV>> EzLJֿ/dWC&--˷S=3"_w$)T(1 *YuabWmg/vi-oXm5T(1*_r*1c=`__q7 3٬blYÒO-oy ?T7W &guRT(`> *?H??k afa"J% ț+n~LX1 UU(1y8 Cv?Y$WNsDO_VihY׷%@Rwy5(P`9LPPǤ :W_}9DďydA?M_=%Y+ }x/sĦgS@HIuB>?]w)&/&r q\Cf tNK@HIufSӇs-0ۿ\&/6r D; d@"6@HIUɟ)~yY1K7uX&84 YN z?G{=ޗ"}Gyd" ZtP(*ú뮻-"]oC>IôCHuR=䉫I-:I]B@^'AI?!X5|_9~0q0ͽC٬ڛX=袋*Dٔ\!$7 lWO?flAzziq SYgbN@jH RC>I(]%ˡ _6|;1Al#= V)ۘvIV?DMPm ml@`p" (mGCuȟRg];≮؏//?)>h/[yo5))yAuH!0jm 6IhED9TPgT#z}PY_jR|u?-+ 1A@]vYmB4ʈr wx㍦Oul+ "`a&?g 5 !A2k`QPdOO< y)M $&jȟ-# #矠?Ln WgS=,  `̀xZZUYv)+ g Me<B|^)eM^_~啃Sd@S( c:ߋ/x|E:$oժU7S@{N?g%A?fwS)0THpO<y䑕\H 9*K> s/]`?{[? P! *bΓ(tM!+ꫯL?>~oРhOY u]ى E5|"x'T RB"5 (Bϕ9眓}Ѧ/??LțJ*.S!h5o'nRYm3C3bET}@U(@S/9_>fܒ!_lv@{r-[5 EA5|ۉ O>i1d\(Ꭓbz4 $Bs?n喆ʛ̧Oߏ _J=b`GNI?*HEHi71A8dPӇ_Pv?9;s#T__^H[iRhOF˓y;!bDUq ІYǦ $*筘MT i g>Nf!z٪/Ǒ6CD$O{=?h%YAfbD[(Hڄ~sW3]H9P2$P_J02K(=?wX3?ꨣ- y @ЏMy{Fo9ЈhcF7v րE5P@ N@פo\׿C뮻*ⓑ;9 /`Cˮ +i%'-Zm!N>ȕ@^׭JkY׈HhoV-5XJE` Z{N~<D:~3BtVX Et@?gmѸ~@@w: 'Rӟ4[go%?kB=1#?/H(ׄZiPZ-PDED172 JG%1>HG07N2,mttRca-u<5,fĝ5&C㾐weyhw(RL})7"?vo.d:y $2`IO<:X 1б6;)sAe?_ kD!V&1oCLs=џe]L6W^14=DCK3ڷ67OYpqǙHܦE@ѾyPTC׏$4tŶ0ٰfe1kb ` L-P_yp}0Xtqp?%)wgsgHّ$@{d0 ;ty]$ +:F>E=Խ2+ )LJ>F.b\D BmlpBSHf-04.g}t \Cy#2/ڗ3%^$ *"+oعܵkKGUVeO<K͇<җvv>1`a[XX &oQX>`&rsG"^`Av5{>MQm;1C>i}wsM鈉G_K#*{ypO7ʿY{Nޝ@oL!&嶄x{kLx;˱~z)f}_:_`%=wXLb 0:mj0ֆn+bUG> fA}S@3M.Ụ/]Rlא>l7uI\pDCU@ߍ:ARןD,R#k > A{Qj $  lLѦuڨK0糯&ZGE#~u#_D`m@Ӧ WEg3@nP\|٩j|vZnQ}Q<됝Ͼ!g? "`yV`@P&μ͸[A7lfKÜZ/3N F6ʄOr!$I+ >q~,Q>scMy6y_T/Wg8n"yk`)  $@䉀I4nH~s:A_LI_}{g H-#LWO; 83Z\2 3 K*6R|ǩi\\с8Sv!1>γ>kcI๶}e:\ y (/ u6짓 G-YI FH :9孫 s\zu6v" P$*Z_){7~m\>(|"Zex+r1G?߯~z] K_: q СӚUP'b]cŴv1^"fd~ώ<ȉK i?}<8ʿ1k04C,ր{g\UvEڅuL ?x# +V2RLɿt2(-n tl4\mAp.Yxq?S@H7t0'o<9E2weQ/"-2E]j@#E'X\H&)K".fK;@Ӥ5ML!ߏ"p@a&`g%~t!A~U 3vr?f/ i_1sMاB`M )+s-<_ [Fo!PmK55}d`y=“k?0iY`=4. @=p knm6ML[o*4,Fn 0D&> x1-nA 䏯K]_wE8S*KAѿt3 @"HPb|fXkϿ8e}d?O9e4KvAvmʆ $_L/sW(2}  FVR/؅N>`k@Ql=^^ۼU@>㡇21͠=CJ:߯BEmܶnLeE}d_Ƃe@S uXֱm/k{H,%f{(2ŻcEǎ pM뮻Θ%mnmh4ogOTA_ 7$D@<:}g^\S:۴`M7͖/_nbjEm3m_dgM eR/dDۯ)~:v lP%Hݟ-(}mNuwr"DB CJⷷ}&e/*ca&n(Ez=EJL- m $[ n@^{|w_1(84FLw̵a/#׾}!Ke]sY As5'tT8 `ͮn |n@KJ|@vmC޷ :qG'6&? |~LT/$rJCPs_ L(TL>)l!8#nwͷ?(z_#ж Y+_1%yl_C>ݶϻ|ѼCd?@ 1٬(; $>^0(:k">YW2"`OLC?,%,M~Yo?i}!vo@s*F|(/HPb$> /m04[nk>u?xEM !~\`ǂ$~Wm %ǫK"?H1Pa?i9ߩ 1l[n QM!H! ľhBpLFr\n-ꪫ+V$`$!2wߧ&}u>WD'NzD5?) 8&!j!B(Pnk}]ثߓ׾h{,hя~d})#Gi2Iğ6*}y]F2JDMl6_GSӍLs !و MPGg%>=2>D뮻ECW /_QzPױFD䧣) ]P@%A-܌TB.z]uF)1,̤ ^+A* iٟe-2#*" nT:&~WP\EC1B`6iJon@waH{"G f.!{.d^07c!&)cd -b"cDL6k׼) 9ysl} n;{]:]QzXPm`3€q^̙gC{bJuM,B>/|BLL>(Guԯ Do WH:Bn}]>&?-d_ǂcVү/MUkA. 0⧐A1#~[)@QnP$H8蠃 k p">%bB7B]#Of~ A>gO39P1BC?P$$~ VZbWه~}i~X6 >ď~_6~i5_Q >#*>  1 HaP&ybu U$mIzĿ/"Jw"_` 7Q De6̼/rm>_/E:S7E`پPmKZ!~3otET(B@ "UgmyC5 qn_4Y~]w}!~5 }L PJB`@)ey! s,{(6@gS'P.d_=kRAt>Lį&cI6+f h' @*!ˬ>ym#D l m&W=FSV K!|>CG!f2%~EPƒl6F 8u@ lAMl"/e(B[Vb٤O$+26WC19f2%~EBP4,ű,+~X@پm!]*R3O3}dJПC1@PC ")1`o3)UkǶI]8ϼi 3`3lTL+ePh KFDz`AAUj fZ)A'mn;M:/SpGމ'_ժUHH_Gơ@6*e $M*D B`%#"!bTXF9*5>/CUI|Pq9_] E,9 * "W0w_"XR ,XPYԉz`AryoI׳  }>WcVgk_ (ZE{4`(7/Lu`…* 7lO%uYܧ)1#|ǟo5KQ ւ L_!ף(& R`dGEX \`!B/RX%{rRQ>=—v2'YI _+Pe3b%`qBkjڞ!|ȞK1 ħ!zſ}E/DX.D`aWlFzR&Rdl3{{DZL>AʘedV'8L}@@1D, 0Kv@ bq@\.q@E u /Br.3@2D,S (_ )|u T(wq )3@(b X"_ d;Z^H\H{>:lg-L#B,'5l6OGAb\ & @E BDB l1 dBGG> (PL*je Q @^eA;!/73IS[@vۦ= ub(+&*e ]@߄`!Cߐ?)+&*\d5Ev@L|ы)`L6T|) ŴQX $L8I^bڌx3l6ru|BBXyc "ft[H\]0_͎!}%|CBl2{ sAy/ P&/^^ہ=gB@BqNL1ćt&}"*zX \SH} d?+HP(\3Tmq6K3+ɠ@hYKE\ֲWW( ?X ,H^mYJ*IENDB`ic14ԗPNG  IHDRxVIDATx%E Qd  $ "CP2%'0HQ 9 i@9G !"^o֡N{ywD$}H""""""DDDDDD!"CDч """"" @DDDDDD">D$}H""""""DDDDDD!"CDч """"" @DDDDDD">D$}H""""""DDDDDD!"CDч """"" @DDDDDD">D$}H""""""DDDDDD!"CDч """"" @DD`j)?3>Ո "ݘ1[g3t7;crm;Kg|>>}ѶIg|~Ng&ΦO\DDDD4]/tƬ1o2O|&Ȼ:x37;c|gLjz""DDT X3EEd`=A3&6cH""~X3댥:c|;֥rg<vIDDH""m~d@cRU__>|/|A&/~}sDz 'eg{׿zk|VF2`1x3%Z DDvg$% {qB]ǖu^SL1Őqi'$|ɐ(, `ċ:$f3DD"@#Wf|!!ҀeDc[;wIDD C$ -M<hh&C_U'C}vyYfzSǡ4뷅5-H?A Dt5ڳzDD@>:c#䧞zaf}4L3(,̠O_UNY~`M!W,Yk}B @X2ug-DGDdD$M`T2O-~m}、m馕_<,*I?$W_}`wDE U81 @D]'}Kު:$]/o~o2z{y3gB^s~X!.WAS `FM$ @DHG۟jivз?zRL!B#z= F4A2?k@/:*h2`WGDx @DU@c:cr34/[ۯRE!?E\YziB@!0Om,U@3d&DTYM"S>_>B_A }sCgE:%l](3F a 0!iV He{, J"([A"A@wTA~Q_/,2~FCE^K#?AV_|ŃR !za "(D11>3.ge ۨS2@V=1N8:D ڿD1ɀ ~(#xInV{_/h,$dg,VzKH"D;Wc8-q~zLO>sϝ?VUT3߷}/C}ϗ>[f_Z {$N෿DIDDdđ/gN>ϫ?DۯJMWE .l^?sPOsTD ؚvE"D`D2Pw{ )mB?GJ'b^u,@)EB?W ~NB"ЅPYp׈ V|%uYg? "?`o*8q-?O;"oCU PV9ߐxW D~<;\S5ǀ-};A*[ֵ?i)́Hd! D;,_p 5 gd饗NF Bl(Rk U3=G~_425}`3\=c{: ,]}0شedh:}{| $`8zpK `@'b0.s\_,T?*[瀾z [g D$QqzģS1bӄoJn)y'SSSm4? +RrmEK|i Ѕ[t [}T sP2s̑7|b[zHKe0" f >D$ ۦ3B o>֟F=gᕠ/\65mѵ?oYL>p$3p=Əl&ic 0: 9iZta-( ;o2rH|^Oe=A믿2 8yQ"JZ?~~@~RlǦ~y:`~_X߫J|I>CsoF{va1 0# 3M%t$@OtwINI!$F-$EUYt n vI<@?3~oc=zP?ڊOULUm`4i~hfWxGE]\_=J~?%$BN͠@̸=+-/|+7_ kf|@h@``8"]X#MAs?HMsVVx@Qf^iW"CB?geZkL0]\WV族ct[nT-ɚkbpH)p 6K &&ր!Ę83HN?I,#7|skX^/(s96~U6-_@_|[N^1l.K+(0inCuYG=Hs AXVIl7sם" )I(mfɪ B~W_>Ň\~.k !~]~=\2\s-:.O6k@hL>-V7tUj%+ Jknm6?I?^}U#X7 @`TbmNV*vih6_nQQ͜s`wխsx%n m͒.ǬV-K@2i,ŽJ|-$ k@`!taM_?~E4mݶ6_c" 3THij6kM+f-MWK` e6:i؀6H5CAWAWI4k-ܒx1րI&1@ @wAb5QPƗ ?]!?Dw뮻?_-*@?S[?mӂ(m4MGSS<  3.`Kg? k 03ViEB$݋Q&B )/@^\|Z?`ape.6oB 7I@yyAzL(? iH"Az _LJ qӽ%|%Lw_o44"b 3 dgHC&%Y%Ѕ;k2`gAOK #;cX%?[9_S3ʫK_&W37lzWk!=΁!$s{* րк%Ѕ`GӖ}S͏BGOO c@tI*Uǖ:҂Bs] Tg#K# Eff]}\Ń~{U!'u.|6 k;""-H#ʁ6N!{`j @o7X%6fG5kG$톤mH?DA @e{o~g>tӖe._h^S&HMAi3'YfcQ9KgAꌱM_7"h/)~rAZ^@?WY_kVY+ blXLg0묳*"-b2!.1XoTgIz Wl@^3@WR01E$Ĉd o0y_ JŅr w yy|+ǂ\B| 矖믛7~&Z\!U.F\$Ud HCa P @@1 )~De]Ta?oA;_iϡ~t/Џ!Z`H }hZ\ֲC9D 샫O.Hޫ^^@J$ h"hFuƵ'~ (Ᏸ*m9׷,0UZf].oMVF6G/K0g+4+!50|A)p=~*.EA<~V5lJ\HĦS"hA{ͽkKeC~G?[lٺ.S%9O?}OS0_ZhyR]%<袋T`.ںHzZ I3qM_Hk?!Q,~B+/֯=o{o*{QHK%-\\e]q m9i$@Ϟj0(%][_᠐ip!D,E~[dyMfy_r?p'w 4f+^C$KcLs, ;-\ry ti߱}uH^/ d%"hVq3-¹6j7SdMC} .L(eup,1z``ҹxG}I dl+"h:cAymOQt*ߟ>H@(&`N?2TSM\+,)زW^ye@ǻロL;}M]X'o{U.sX:З&B6KX|5v_r%XNBhP`@LlԏɀLHnRwhPWk6lH4?WUT|{KF,b )5h @瞳|$8Xo]u|j2=Ja <0Nܯo]J$DP/#o>u#!6d o]B-+Hto)[5*zUu87XYdÏ~#)5>@Y& 1 !6mDտ9眣~JI}|iLjc=VYtWl!$@2x KWJIIP+"Äqm*di}|X;&Dh~.U>|wN\rI?oPm) A@x$ 8Ò+}B/$@'$\?4q{"K op W@J',ԀHD+fsvJ `P?փpֿT)pi+jAL$iOTCm喑4n!:^u'l?u2V%\pW_".;@ L֑ԄHǨĨG?OT֛iĀgĉ~~*AcR%Y̲ KAy5K _xdL! I|̓UI$=hћ "/ǼY-]!+'w_V(J  '7`%u mE:>Λ/u @4ob9csϭ8|~j)AY}Ζ`#: "C&zBuEVڷ 3f s K }~[a:@ ֘1cJ6~׏L >[Er}٪MwqW^@[`yBp  X # TQ~F?UK^B -Y6A?+!d*,"Âͭgڊ${#B$܈ tB?k_hTPWWDҾY@t Bz6MX 5uݽlEI/:`U$?ʢ F6}.Å<>rJEx#EҺMOW!$@N4AT1 0H@H01 ȀHc8^E _A/f\sͥ$,/Qi`>u3iЌJzQd5%YP`ڭM  *1a}Sⷨ?LM㮻R:?H L]6kA'a0 ot|+2 ~0K^W؇&үtKKҼhQ馛F 8v?NW'""ýD9d1M |58"d-'cf13QV[)t2Of&j%7|snBdMT @oAޘ8@¤ITlSHZdU$@@-Un UO_k1cƤ鯵UafuN6UH̚Wyp준RNTE@P}j W_}uk!CF@H dI1gc'Uǎ!5gyfKA4}5χ}?xnKVY7|SV.UHǾKuJ ;o?2r!ɮ:X0个&6W-(@ $Wp}ѥEg/ 3o X)jJ@F<8vjZ }'9cj=7XZ"eeP:A 823:cBb)T| vM6({TscՂ1Rrzb%&n 䱴&Ġ$0"т . я~b?<^7~kW\qJ-uHNM_\y@pa}lN;m{e*C?k~.$?AпgRE?[ni^Z߼L/I/pr~:ŰNaBB"LioDS=tO>}&hf>( epϸ\1(0 `_*'%?`.}v@$ͣ,6}_$ʛʘ PeP sT X5%}\$Ww'ho"c ,L?ΫZh[n&`$ͣ_b\s$7Gqdy/K@ كUgHK_Jc" ]e~C3YX~哻kmRElԯpO/K]l?&D$$"h Ÿqm٦&3zEzsTPF<@JIUgLg#OOſ_^kϫ>|wU<@c @{`s1q tD}CAh<_RwmD()L^sO/"7dyi"MME`1h+}z=sr5F_$ >^ynL(5V?sϭ:!ȉbhU M̭z:A%Eh4}. B&P&!Ax~?Qj`?:CR?Gߡ ?UkH>E$*tK<@~})v k PΈx3n#T)&IJ(4M?pՆ f@1 9pXZhUPٿ+@Rq@<=fj>ӿ<5gMkﯣipGy /`s؛F~i&x"*W5Q|MNJz8+WuM6l6 QG\m Doe]>D :e4:*>J X836rA*F:#_E׿VMM>Z|ou@ȆKۇH&KYd'JHQ[`: lˈ0SC]>[BzЫΐ?bѵU4. ;3fLr7(#T|'k߶g}V),M. Hi4)AW@/:*ybQ!L~M;.iZCz䢋.jl"LzZMtk$xk=+9/wxS.SN9%/?RM5I?dwlA .hl"LY~m%ӼM@egV -PWNN503'D'7Um׏Ip '$;CkvmC$hQWS@U w _w{ݞ*K`DKo;/W 7a%g?Yr6&A[ :D[ (J@ۦ HkLFq?2/<zLp/8C(韺:fo_?& 'bڰB~{U p-q1#$MC m%/R2ě5E@U, & mG{eű۶ZmM1hKPnHv׮KYPWOzjuSSV_NSmMO?=OڊO>Q!XV* # YM=][+m%@[lr$T$X,S؞z?$6vӿ~M38#O~Ҋ@c"HI0ɥNXM.MBW. 2V.׍6P_V@ J_]#=Y`TgLy"-2fC& &6,kN?to#&MR+M/MA_5 h+}hB@^W@ K@>GmOM f0J|_8iy?e4 vm}G&V4`q0[La1ͳBQּ`8Fd[ 甫B74}yiCHAo:묓[/3𯍦|4IfmZ𒂷~aCs俳G MK@$X3@w!V7tSW݇~ծڿ8ɑGԁeu_?& M6,@N:[]ŸA/MF|K'.ӿ9ʨV+fheiX,EHv)?Q嫬J-ڿ-ȯ:&sjۆ_B o= H@[ fn+m!iX@J~4]Hpb?f9[I5I(V[b%PX?#jo|-؄ l+xwE <.A@./VuCuv]qvIt '{eɤgMK Kl48-ܲ /L=R~ dǐ?SM5 "[.T/h\xᅪKc^!2HBwqr@<M,sM7]# @eV2Ł N 5ֆ?7[k`M6٤ /y(]%?Czkh+ RՍPU6@+VJπ_UƐ?MiiimE+H6`V,#8"9 ]elof`e"m@^E|V+@[ fvF[lS"xΤVJ03Α'Miݜg_S+L_V,"DtoE@c ࣏>J2@@[lRɁqI˭To߶z>4MƏXxI=#@0|]Y &$O>y`fF8m%C`kBIiy1QF&Ղ[R987LߏڿcꫯNF݊3HtA/.|Bڏ'm&RJs6|}Z`hu]vK+? $ByQCJvCڟ~d$6Mڰ@P 8Ywpu3%ԔSNܘh qobhmJ$Y3'#*7ʿ۴6I~+qJyӄ?dE3IBI@`H$mGG@YYz 0seC%օ,O6S\Zw0IK^{V,,"onFw+ϴ 9ɼhFd0HW_}WVJ@*FkLcS=q0i@ZkՊŖV /J Ϳ)YJJ5b#mȶo>+@XP+q@+mZc;@H.$vi?M <ݪ& 7ܐ暭XT '|rg+F\oJkB^On_|PȠ'sʶi[U$h2*Qjjg;@Ǣ5|y[oLXcV,(w}3wijsi>Qm:*k/D7f^7 yS) phJG%Sf-~]4wV,(,XgL߳ {Jom*ip.WZi!'us/@0m~ P}k>v}+ $B'@bI_E@wM'm\otLSNIv}L3 eQ`~ Еx~N|oZdHA桎жsfW^@'T@m`#:P3 Z?p (pn'O#gzkUjYgmt40d t\@@$/b.Hj< @1did!-%PzJXhMJ`$DK[xU Y&c?EmC~E_ ` @Cp~s'Lc`򹐒o0utm;o~izJob,4}@k1 $T1cx2SzA4I{^+駟.W&X~哟'*R^xarNp1B>0ut m;w~C OJ`+"Ŭh{3C|^s|v.hg^`iU> k0>AehI}W~8v{z`@8ROl~ Жo pBCdoOV^yL %#8B 'm)O@ @x`0wm]/3yM Z IF#o-P\ھ<.3/$ۅ|6@NHfm7񍾊DʽY7k`( הu!rPvJ`/AMe!̚_f뽶!>E0BBaf_|dwV~<?~|j߬Y!}QFjn#mPߧ2  4 i6,L?W_yچH#'wR/\?`Lhc  @y502`fu#EpQG%>{~ ˳O BcmU3M^{dS{50nKN8L ~ 6ZfeTAH@eєOh4-&Z-?n:G[NjE+o[t`$ /+Rn `/ kLkF@ شD` l2g^g}OJ"V^ ]Mg!yj\}ժO0t+m}*2`HM dNp17@RmH?{ ?' ,@?9;TN5;Vi] {ァ/<7P6hҦ#rQ_`γm[M&᝱/X[lRsh>k_ PC'l$Wy^ qqNA/ kFt Ά6A7ЦZߧ<+n&%0V[mru%On$Iւ@iqi.k gqƦOO) kV%C"]‡x@)SN9eӧĊHGZ w$ЁFMI6k_"1{aǕ%&ݟHe9L&M47@`;{AIf`ay'#|?@HQc ]eSs5@'?Iɇ P Mf@ h+"U- 5 l۽FMH7J>h2'yy饗#Fd^`iz,uc!O?"<&T~PmC):[mum7@j?3ն7GP=fdܸq|\iF1tөE@M?LyXPi6|76d/nDPr`Y 67@ҭyr>&DP-87ܨ.hL6+HB -mb'າtMW\iڿK2^zVvWU zlW Wk4'78?W|(tHIlWYed 6Pw lK ?\veR|n`k @uu^ @su%a] R'?8?1S4 i;to#fZ/j5"ЄkE :>'g4j֔%*iUx Lmiз%%kAv*a7_~+?f{* =(p}S`WLo|"Xz< 21kw}=ܣ* )]|nj"`5/7J|gqVfGZuK:cIU;" h"uY'?h62X)cL/^x &Y &".Љ+}?\l`И<y[veBж{H66lnZ)冤QIvg(7@Q?H/il{w|>-Ϧ sq0>b6 tm,hyL,^xaW3TE| @&X$nƂ~NI7)]2_ߋ ~7y 0i~4F 6! -7H7Fbp5vC^$M{Sn=>PDtE7#%_xe4CB쟾ش89뮻릭|t$5?<;d-ܢ:Œ yෑ]g5˾ L/[b|.%\W[#dE$l7@t@`XPK:`]ҎGN:n2W/ѻ;EBa 4".?-p-!!A>}ɮ:ЍUtgub:`]nX߆n*!A;ܼw 42B?c|1iinWiB?oZ_7@Ÿt[Ŀ O?2:(ng];r#!qXrJCM>#Gr@Ld+1 yR`hqۦ SN9E M7->"`YSڈbǜZЪh'r`Zir[p4XC20OvءR6 K,;<#6{9mBL!f:4ӟ'U"L/V(_ - - 450M_r%|2`H&& ѣGVЬU n 8-'aR6iQ|ݍ6(8P7߇7Ds?T=Alun#8B-[na *p-|IO`:s<̡̣x@PE4~R%|s]8nH 7ܠD-{ ӿ>+@V OcEBkE蓁B0Tv+eܻ@@ˀ|kg`AeUJ;:cH _rJ@&f$&S?R_"2LZ7ޘ<c=%!4+XK6wgRK?׿! ׸@^ ],](_xcR@[od7hC+|-Ȼ/L$*9蠃sbMC$Հk ^i(xV[Mw҈蝹og1VD{䕋gK[Myo?B9[Z 9w]i (+ OA b]p04J  B.ShaLG}TuX$ϕVՇHsaɂG`2oE`˵t~@~Ӗҧ[.EMSb^h;pŢQWMy- Bd_B4~`y r ч8 UXv|؀}Wn^* 8X?."vl{`~scSHL1اnzEQ>HD҃=͆UT2=h{iր6Pf `+V!i<{챇%E+v[ A!|pr;o<2ۄ+@$壍@2=.Y}_MN70!IHB~@ve?O^|EE"`pH7n2Ukh]vʞ0n0OS0"hm#@WtԽx_$@#`RgYV!K2p{V{Yy4 ~ F/3z?#KJ`$m@ w$gy2h~  s}.$@?V^,= )8X )m~ L(5&-O, @DDhoJ J駟>p`xJcTֱV!.@z Oh]j™~:ρiE1'lZ E$6~/"e@k֧ 5\PߖϷY~iRdP . Pea}L+vlՅGi+">1۲8*FXpM+/ JBA?w4ǚ@ ` J([ 剤.r-9t^_d]wU9<7-O>[|tmZ{m"1:ЭfC(++6AHZS9HCQf&@P\UbTgQc*~&3+X)hTnԍkc>FdDn=۲`w;FD$ -#f\}}~s=W;i cbLg#Oՠ e,mcb#>|/1M[N`$ݏt$&c#6+`h't<쳕E I l 4))13mpEՒ-4}K/ ceRS7};ц,$ ?Ha)A>+%㶐~glD G9#|ug'K,D2s)@HE٦>3t'.D"m#e)*tZ(9'T,,z-\X()PgxX |tJ:Ouk 4C=dt~.slڿN| qD]hI@6uh*+ .rCBT@IOh-OShYJ^gL˃}kɼΫnᆹjF!ݑT!|H  tp),TeW26i (#ЬH Rؑug+>jlkX 6;d„ Z+їf/"M_I@L`!f,VgX `x+%A:ŀV] UfH@M;o~FU ?2CS\Y Hڅ^HmuInefsH,@Zy&llJ> x m`@@g19k uر 7ܐZQ,tK3  "@@$m{S'ZfW`_!8z\sͥUŀVrdF R<q|pi $4IO{_&V!ڿd% j/DFXb\̦+ hnB+ /TW*ޚx≃<W錉Ef `~6 ?umwv Y2@j~"IU\s͠϶?.`e4e h6-bfn*1_+ Ɵ>k:mA)+!\W_}uiUt1$\r Tq|9fyyٗC=Q@\#76"U]F#=F\)y>FK2NKc_U!O5@W@H9'x"ڌreJAI"[o=!/(@Ÿ zwBG+%4]]l28{td @$݂n'vq 0 ϭȪ$`Sr 4 uآWD/!뮻ڴE%YI^g綾^\A3i__/#?pt;@Xb ʵ6L뮪@PUB C:zV*%묳*kC@Gn@ݼI|}5-P&䯭NAYDt HI`= `k l2gw}/*\X,(@% dcJ,"Me]+ W Gc>? "" NMW@]^D` +P_И*4!PYgkH+`j1B_\[18ujih'@n $6٧C/*q6gӌo.n+_#9F) @K BRd;"eu vhڿH#y 0kMёYB olVJ +3 `b2P *%cƌIXc%j8 & j?odBb?}ɿA M`@ Kം@N'MfmRM*BFu 3̠.Ď; W: gUEdm72Atl_$} ""@i6Du2WW^Y2!%~ϥWK`};z@EQ`v @fm|/E9@`Ť /bD Y^ RdsyV̹- )@Y @%|F@B,hX3'B+R&=ܣ~z 2cduߌiY|yHpAU I21R8(sdҤIP*[r azo tY=]1O.J+@yRRΘ-e`gNfedJ_|@eȍJm-3CKe.`[e,[( A'M_F@BeA$&@< `=@`tnO 4K1qdy0+v E di7Sw2O DPV\qGr"X  t  VW U8E 5E@d !Hܪ|Vnv7fꟍ0L"hIomu+ZO&&"(."_("-X!oFm!!ybEW  V mS+@@IIJRB6pC/'w'Իaa4y^!h1r,: ^eRuBR,u!"khM,nVD 6 s׫`,J0 @TXZkG?ry՟MI4uJek6?\0~uEZj!}.@]Y:lWNVYe\n Ut~6tK/!퀉wy{PK/U72 Y[aA/>ߖP;O~),_VXfey>Pڸ.D}@O tD e4M0[?AneuM^x?Z |7.M(kQle}_翢ڿ~]l|\r%;0X"-{Z34Sj޿J}ܦUH7:s̬v"B?s$IL+@ZB5m { Ⱦf}YЃ]kEe1q!,7LV'L6g, mr衇uf]-͉md"_'y?C!V:\e>=쳵{$I 4`Z8@(n_u̳6zwWg=9#%D3<3/F|M WO]Hzîe\uB̩~c{ k^fЛBIW`2p-$'x@n!SwƐwȑ*gjg6 ku6X7O= qZ[׫Z5l?j!'j@ fW,ꪫ&oe=䓵{7\|gRZ鳔j,F*y5\Θcveu r:,KTI8GuTrI')7 .f ~W5 @5'pִ\Y`VSd1f.彮yM`=H; >k hEE(sXP7@k P; uօ]EyB @e? )-d ײyE\\VkXWԽ DXBl( -cg5M>.)Y* ` Kkj?5+<˓fM҈'YGY @.2X[䴚?奩IӯGADN)wuP3ΰj06EYgA /M Yiao$@tf@&HXve=+ }0XH7NEWXG<ʄ"IpOu\ڿ-UfV_^˓''$O⧝vrlB?8c7sYXwu  Y P;;IJWt#Y'u멯]zlV[: ?AgZ `hp_\: #w 3̠m0\\ ȄGЊV #CO?}H"6G (q%cǎVlCY"Dw]wCQ@ÿ+yj; V>@Ur&| E@_f;)`e-z$Bw'e6LlK ,s*1N^7y] .|h_o~! 뮻aΌ3&Jn*RP@hqwyg EW^9x Ni$p,z͔8%k a[u@ܧw !Zs>`0[תCgZ(1/pȢg!-Rb|_M%f_J1]e'@?3)L.zJk>;ҀJ#n0pPAHe J W .]!uT 7- kտ4l$i:ÿL^g Rx%P. "@`$ϗgjYt5?'e?UIX lD,+MC`\e4BQ ~ꫯ<bS R"' $ٴNRXrئLרL03&ѢT]X-29y#]637A( XI<@^ aV%tM NJ X](10G|:@\; TY\TZHF>`dB*`eX@kT?iV`N8?k/W/Oh_sV'4H Y/yq&rȰVI6|sEXiDr7PA~_]9?M Jh@H- S4y+H@ 5FR<}YP |gP1l]jv)BZ: (4 9_spM7yG! m(PMC! n( kvӍaC$`NuQM[S͵ (, dSVXaengI#eUL`V P˒?;K4@J,l&J}Wiyz ۾ؠXM @)6  %O/ZC@@"P5 !K8GZօ2]]w9KsTH>tOMuܪjr m[o9ol(EHy}@ΘUP ƴb@L Qj 3kBۄQ/_?L0ࠃJ!<4@ZI¿2M@PU`pUݴJR(sϩ`<x 4ud\P Xm\ @˦jDaes֖ee+yJn=EX):M"TEn}Y (1RTlR aV I@ۄ?\5 0M(oCL K/ ,=蒪<]9'(dFPpA!M@Pr "2pP"r1F!rc`fD pK :M*"?N[ouZݫo{OUWݽvݻ q RD>[l  |uV,==\(Y\`RymjcT /0lZ I5#-9˂S|e)oOLi7pÜ 1ǯf?ESϦLছn}P/JUi*ϹZf _5{<'/T5\^ `@ K݃+u im T2 }H3L2[U"TJO9 ZyfJc)*xǦ֤!LJPmG h#Biq >;YYy)E\'j` mcRM[m0׿{JXH*{mTNp3QE[ʛ: V @47x (Pd0 [?yH%-[fFRT"Q4T.po}X 2RkW(KoA ౣT׾ 0dMlrZ`iDguT(W_JOMittvRPDu& 0[ R ::!Ou]WH!H|ꩧƮsp c@.>`'z93U33 9~7p/1O\bo NT.좋.o?_?H晣?bTMm/.VHN? ? aA*` !iuQ8,ˡ "͛nvowI|ӛ4)3$ (x#='5g@,\F˜2bL Zk6pèT@ L.#f"_Tha C!0 o*)2_㏛`wG)"gib &ΠB Uݲl:ÆDh;@ Nhwp^* 믿1T(u&F&럋(CuTFS/p7)[ĂeU%/|!{G)׵J|ӟ6)p}Ik C]@ םl`A`N2(Sn[%@&j+\oG|1hv&}l_; ^OS969 y{lѢED>T/&(@R SO=ul`Q - E૵U4 Y0r үm7oqEymf "dAS0Z7=1RәgC?3g*w]B,)Mj4@m Ć-0#4Bf~L%ȵ (.@u] 8|?6@I [̙H20Gm20d.4X!R?M7A@@Z`~iC,!H% B㷵!|3 !ml6BR?>.k@J6A@$@I3̵m͙?j^IPRy/;BD/PPs~" ˜J@R ꫯnz Qpܻ<H {  gpTN,@fHMX 7[r)TTz pM}?PP.rCzv?A@)o[CUW]5XT ߠ66t9{SqK_AlV +z&o"|&>6@@Q0dhmm?PP <Q??cJ +2WW,Ut/Ay.3(I:E{ etul1FH{JR}H T 8#SEE* {!1F!>ۤrUyY}@|S' $~&}9'`|/3ew{OA  !9JL̈6tE@@uPyE0+:|,* u]+ җd栱 2&G˙r..bS@@/C]?PPAvϗwJq.A)! @ HkN6 ˿Kߗ&Ydx…>yBc+ʾ8:>ʞD@}FT$rW') S _ve] *׍شj}v>_i&? X(  &g}] i}͘y1 TTw`.l .]GqᖪZCR.AӬh@GKo .:?PwnV,,H *BS{饗vC5;@dя~A[0rn4̩N輙fs D@@zG=_~y .bC@\*B䂑'h8AMneA Չ-$|VN:^>,}P {9C:țP@{P0;ҷV>L wz{wuWDA ib@G*E$"of@u 2^#}nf<3 | `mˣey#  @"R So} @$>9'h4 =hXW(H A sh{khfHGqXG*8ٮF>+ i ҥKpwy76Xf̀ &DVTq(K.Y}*dϼ\&@--\UL\"]AO#m0̼!d0-jq<H@@|;ߙc|N%p9d۳=s,BGU//(Ԩ2:_ /]ق m.>&> ?P<yh[dyۜJlJa[H!|I+J_:; c~9;x3@@!˶vy*'`kF˱M^f&s&" 0S1Fm%(<>AGO*Y3k7y-j+c>0gI ̂v0 l +67hLiXwPo &׮/?OyBЕ6I/Z´lٲJ `/ܔ;SNi6,EE ST~H. ZpR ͠`.r~7xlU$0?}%f;$Q?huPz뭝 ?['_s=פ7b[XsO%8 #,d̵c¶J,_+W^Q Duy.iWx<OgCY`r g 2FD^!`Z-Ckր`r-&m .J*p駏WZH!\~90%T cu֙WVߗUM2{~pM-e>-^a?E'}>E"wy^: WJviFbHf ,l* !&SNcA 14mТgH: * !Ji7 !bʾodsLw_q_H%8@XPkG 3/,X ~&VX1ϗ:n31D;D, F@;!ocZ!d!֧oTŅ^hL3L%\ sf ] ۆTnsA@?aT0<1:Aj^: X 1|dfDҷ1  Y  K@UPB Pjd"8W@)c%Tn?N_Fʭ*u 'y dFվ\ '*`S[l_E.]bR ʬ9` K\@C9gM9^.n^: az$c~XKn93 ӎࡍ)׭ @ @ q1@t). W|n|P?{AhO9j7ڝ 'zio M*bdb kL;t@4@`T߳^{XP ~ƕ*=@LGfcZAW|ͳZu7뮻UŴZ߶ j#1T@ȹh3.:w}s3*v OPp xSYk~0Zeo701?%7"cdBWP8)?y@:TE@BP  `._pzQyW53+V+f+tH&4Xi!S+F_@R-bNK{c 1WPF u6_V> % @>ދ`it )IbBȒZh(6)iVtw9? }s y7jKf{=aqthG.YL`4ƀ@Rt9/) ?>vhBPJ—{( A%Ty5\H$ 5?3>;Zmtj$H[oukk@[nޟuYŴRe4ɹXr*hؾTc5Kpw>n(R.rŪ3odSfynJ3E0?͘9LWĚN L )zEأT9\T"V :Z:.R%Հ0㊒fynH|m5:b##`o w;|^&}ӌiX %6&$B{T裏6i4W^y{PKy/ >sKA׌Ϋ8[84&)ϺQnE@ " 1fB;dO>dD<̱/蜄}`ynFo۳=أ0'J:vm'?ɿ`S.A@<ǨH褄ҡGaF̜6)]9k.Tt 胊Fyۅmׁ cLۙV?7@[m8% pcb!#\E^*C(d"/ug!5nT LmS.̘^eĝܫmE@&j1b cT@:3>٢3a^0`NM:( ӆiB&"~"}oK/y `64:(9_@K/5u8})%Tt" %9 +ꮮQ_ףI ` / &*eO#E =GJ?w3'.vq9R "\ \j|B0R3i]B@w(" C\U3QYliש/LvhYn, [W 仸yUzTL P6{'xgvm@R >،Xl d[H!/Ŷ9;7?lY3࿒?hbޒZ~ޘW04p`@!a0-2KZiш?Au,Q~xKJ%pwPTƿ'9V!=SO4$@@7(" kժU\:ky?bj?A z))iG9!y&T4/ DŽ88w[0$pg\rI=]eǚ,CGy^}UcvS'{ym+_H0R:Kay~"&6|sc.u1$pi1C=mk>G7pYԿ?b݊;GW`]gue˖e{J{Y` NP,|?g I \ۏݍlbMozSVIB!^D`>Mp JY&wfW}H,9T`ɛW^_`++s(HiZke|C4-"@@`BQ@@8SLWT(yK^|X.Կ ZyHHG M s`Nt@7L2T4N >Y 5x㍆CRW2{>ּ@w10>X+n$RBodh2g_'P>T f )2 cϔIsvz7}fFݍtlIV8 `A@3` jRBG@@P/{1SIVj)7}SFE< \:+?^0P0Pv1n7L*T#8"jTAPp`?LcOm}g G˼'Hb.\hfmKUHnn+hE` =.BSwC@*g}c:g_&ϊ;Zzw{XXB&sQUGl" *ڇ ~ ?Xڪ/Y:%Y S;Zu7Vۿ]sBخ ;"@@:`u]9QL}0cg蟜)9W2UC`)\4i:P7,TO'}mɿ*ڇ #}{_?U ;dOGά0zdn' ( ăo> O~c }1%W\9gNy8Ca\+Ф"cM7* 3&:!ӿ@@P-b}̱k?~*^aH @[ouVSձb 1CxBT ;Đ=_H!` JDS~'@,s?oyD x0gji])h*C3s##fOuٞO3d߿`hhh[Ξ\^d @,@S?Τ 0W{Ūmh*AolUF|p"G`h̔k`_D|Rɜ\ f 1c1)"@aPg3XQ C@ %k3'fƿUV~8CdFˁ[m!&P:sU9 P5%c4A(Fl'C@}vlwS&o{^WHF\pA!I!R`3f8Pj+IwZCC4;K"io24wkNXU9$P(  Uȟ?چC|iRϞAP]U }- d_д@x~{vGV*T(&*PEp}O?^ZMW  bX쓏@[laK\eV\H@ Džved8$@ pT!gL=/$g`H5J?i.`3t |WW |l?xq␛Hz+ 6 NZPPǴ r:7$ 6E'-2Z^ۮpe=W}*FPM7eMWVAIߠ\m!7 dA U,sN8g@HiU.Rs|X/'opLSgД+TXdL+@B*!9s`МŴ_Po"li٬Z W Nmi` PP4 "r4d4XT1bjzhvwV>> EzLJֿ/dWC&--˷S=3"_w$)T(1 *YuabWmg/vi-oXm5T(1*_r*1c=`__q7 3٬blYÒO-oy ?T7W &guRT(`> *?H??k afa"J% ț+n~LX1 UU(1y8 Cv?Y$WNsDO_VihY׷%@Rwy5(P`9LPPǤ :W_}9DďydA?M_=%Y+ }x/sĦgS@HIuB>?]w)&/&r q\Cf tNK@HIufSӇs-0ۿ\&/6r D; d@"6@HIUɟ)~yY1K7uX&84 YN z?G{=ޗ"}Gyd" ZtP(*ú뮻-"]oC>IôCHuR=䉫I-:I]B@^'AI?!X5|_9~0q0ͽC٬ڛX=袋*Dٔ\!$7 lWO?flAzziq SYgbN@jH RC>I(]%ˡ _6|;1Al#= V)ۘvIV?DMPm ml@`p" (mGCuȟRg];≮؏//?)>h/[yo5))yAuH!0jm 6IhED9TPgT#z}PY_jR|u?-+ 1A@]vYmB4ʈr wx㍦Oul+ "`a&?g 5 !A2k`QPdOO< y)M $&jȟ-# #矠?Ln WgS=,  `̀xZZUYv)+ g Me<B|^)eM^_~啃Sd@S( c:ߋ/x|E:$oժU7S@{N?g%A?fwS)0THpO<y䑕\H 9*K> s/]`?{[? P! *bΓ(tM!+ꫯL?>~oРhOY u]ى E5|"x'T RB"5 (Bϕ9眓}Ѧ/??LțJ*.S!h5o'nRYm3C3bET}@U(@S/9_>fܒ!_lv@{r-[5 EA5|ۉ O>i1d\(Ꭓbz4 $Bs?n喆ʛ̧Oߏ _J=b`GNI?*HEHi71A8dPӇ_Pv?9;s#T__^H[iRhOF˓y;!bDUq ІYǦ $*筘MT i g>Nf!z٪/Ǒ6CD$O{=?h%YAfbD[(Hڄ~sW3]H9P2$P_J02K(=?wX3?ꨣ- y @ЏMy{Fo9ЈhcF7v րE5P@ N@פo\׿C뮻*ⓑ;9 /`Cˮ +i%'-Zm!N>ȕ@^׭JkY׈HhoV-5XJE` Z{N~<D:~3BtVX Et@?gmѸ~@@w: 'Rӟ4[go%?kB=1#?/H(ׄZiPZ-PDED172 JG%1>HG07N2,mttRca-u<5,fĝ5&C㾐weyhw(RL})7"?vo.d:y $2`IO<:X 1б6;)sAe?_ kD!V&1oCLs=џe]L6W^14=DCK3ڷ67OYpqǙHܦE@ѾyPTC׏$4tŶ0ٰfe1kb ` L-P_yp}0Xtqp?%)wgsgHّ$@{d0 ;ty]$ +:F>E=Խ2+ )LJ>F.b\D BmlpBSHf-04.g}t \Cy#2/ڗ3%^$ *"+oعܵkKGUVeO<K͇<җvv>1`a[XX &oQX>`&rsG"^`Av5{>MQm;1C>i}wsM鈉G_K#*{ypO7ʿY{Nޝ@oL!&嶄x{kLx;˱~z)f}_:_`%=wXLb 0:mj0ֆn+bUG> fA}S@3M.Ụ/]Rlא>l7uI\pDCU@ߍ:ARןD,R#k > A{Qj $  lLѦuڨK0糯&ZGE#~u#_D`m@Ӧ WEg3@nP\|٩j|vZnQ}Q<됝Ͼ!g? "`yV`@P&μ͸[A7lfKÜZ/3N F6ʄOr!$I+ >q~,Q>scMy6y_T/Wg8n"yk`)  $@䉀I4nH~s:A_LI_}{g H-#LWO; 83Z\2 3 K*6R|ǩi\\с8Sv!1>γ>kcI๶}e:\ y (/ u6짓 G-YI FH :9孫 s\zu6v" P$*Z_){7~m\>(|"Zex+r1G?߯~z] K_: q СӚUP'b]cŴv1^"fd~ώ<ȉK i?}<8ʿ1k04C,ր{g\UvEڅuL ?x# +V2RLɿt2(-n tl4\mAp.Yxq?S@H7t0'o<9E2weQ/"-2E]j@#E'X\H&)K".fK;@Ӥ5ML!ߏ"p@a&`g%~t!A~U 3vr?f/ i_1sMاB`M )+s-<_ [Fo!PmK55}d`y=“k?0iY`=4. @=p knm6ML[o*4,Fn 0D&> x1-nA 䏯K]_wE8S*KAѿt3 @"HPb|fXkϿ8e}d?O9e4KvAvmʆ $_L/sW(2}  FVR/؅N>`k@Ql=^^ۼU@>㡇21͠=CJ:߯BEmܶnLeE}d_Ƃe@S uXֱm/k{H,%f{(2ŻcEǎ pM뮻Θ%mnmh4ogOTA_ 7$D@<:}g^\S:۴`M7͖/_nbjEm3m_dgM eR/dDۯ)~:v lP%Hݟ-(}mNuwr"DB CJⷷ}&e/*ca&n(Ez=EJL- m $[ n@^{|w_1(84FLw̵a/#׾}!Ke]sY As5'tT8 `ͮn |n@KJ|@vmC޷ :qG'6&? |~LT/$rJCPs_ L(TL>)l!8#nwͷ?(z_#ж Y+_1%yl_C>ݶϻ|ѼCd?@ 1٬(; $>^0(:k">YW2"`OLC?,%,M~Yo?i}!vo@s*F|(/HPb$> /m04[nk>u?xEM !~\`ǂ$~Wm %ǫK"?H1Pa?i9ߩ 1l[n QM!H! ľhBpLFr\n-ꪫ+V$`$!2wߧ&}u>WD'NzD5?) 8&!j!B(Pnk}]ثߓ׾h{,hя~d})#Gi2Iğ6*}y]F2JDMl6_GSӍLs !و MPGg%>=2>D뮻ECW /_QzPױFD䧣) ]P@%A-܌TB.z]uF)1,̤ ^+A* iٟe-2#*" nT:&~WP\EC1B`6iJon@waH{"G f.!{.d^07c!&)cd -b"cDL6k׼) 9ysl} n;{]:]QzXPm`3€q^̙gC{bJuM,B>/|BLL>(Guԯ Do WH:Bn}]>&?-d_ǂcVү/MUkA. 0⧐A1#~[)@QnP$H8蠃 k p">%bB7B]#Of~ A>gO39P1BC?P$$~ VZbWه~}i~X6 >ď~_6~i5_Q >#*>  1 HaP&ybu U$mIzĿ/"Jw"_` 7Q De6̼/rm>_/E:S7E`پPmKZ!~3otET(B@ "UgmyC5 qn_4Y~]w}!~5 }L PJB`@)ey! s,{(6@gS'P.d_=kRAt>Lį&cI6+f h' @*!ˬ>ym#D l m&W=FSV K!|>CG!f2%~EPƒl6F 8u@ lAMl"/e(B[Vb٤O$+26WC19f2%~EBP4,ű,+~X@پm!]*R3O3}dJПC1@PC ")1`o3)UkǶI]8ϼi 3`3lTL+ePh KFDz`AAUj fZ)A'mn;M:/SpGމ'_ժUHH_Gơ@6*e $M*D B`%#"!bTXF9*5>/CUI|Pq9_] E,9 * "W0w_"XR ,XPYԉz`AryoI׳  }>WcVgk_ (ZE{4`(7/Lu`…* 7lO%uYܧ)1#|ǟo5KQ ւ L_!ף(& R`dGEX \`!B/RX%{rRQ>=—v2'YI _+Pe3b%`qBkjڞ!|ȞK1 ħ!zſ}E/DX.D`aWlFzR&Rdl3{{DZL>AʘedV'8L}@@1D, 0Kv@ bq@\.q@E u /Br.3@2D,S (_ )|u T(wq )3@(b X"_ d;Z^H\H{>:lg-L#B,'5l6OGAb\ & @E BDB l1 dBGG> (PL*je Q @^eA;!/73IS[@vۦ= ub(+&*e ]@߄`!Cߐ?)+&*\d5Ev@L|ы)`L6T|) ŴQX $L8I^bڌx3l6ru|BBXyc "ft[H\]0_͎!}%|CBl2{ sAy/ P&/^^ہ=gB@BqNL1ćt&}"*zX \SH} d?+HP(\3Tmq6K3+ɠ@hYKE\ֲWW( ?X ,H^mYJ*IENDB`ic08YiPNG  IHDR\rfY(IDATxEǗPB  MEQ@ HcH HAD0F)(MWζ{sWy#jѢb@-CK-Z 0Zhb@Z`Т%--h1h EFK-Z 0Zhb@Z`Т%--h1h EFK-Z 0ZOrX8ÏKcx"k{<? B<ފKmբ|Л@׈xOׯ=ѐ*!"9p ,-+K,-:ɷ?̙37믿w3AhBAo@;1j V] hHqulv[:¿2D.OEpۂ&.synb5kV_*ӟd~QN2)~q~-5&H {x@@?%;c)yU~Wo>coFm NՂϲ >?IAWmOx:}>"s[ <}g瞋5IPBh ?EC;~G7n_tr];|3(A^}N 9TXY_ГÐ ^`\gu/ZG|ni !kE/:ovdȇ@yd08L3fyAdI8Z!@ AC~fsoڗњh 9EꫛO}S,s_}YX G !Ers-d'N/Fl O>do|#ꪫF x4 Hٲ;-l„ (@]>x|^tE&R2 [ l6cX;t~I6|v?&a駟6THBl ~!-B??᠃/&`ƌёG}Ο3I(>?hdV[m5޻H/lj͂10bvmm;>jħE  DD;?|+& bG}tt7. }!v}~"X{Msk4h͂1h@MX4e Qbdw!Ǟ,Xi% G~o17pI7wL"T(#D КM38F6 Y ŜǗ17Bqolu|$(xYx,jY@ Uq볨?*ɳ{Z`;t斡I@4+"5pl_HG ,8餓w$ѥiZ-e _-c뚎;|g/?]g?YVS "/; GaouN*1NA[I@/ 8 !uCI/~aW^j. S 6z׻l}j>j>YH,^~עd_~C }P7m @ ~ ?GB"Ҥm`w zI}Zƀ 0-W!gӵLn`TX0Ɵh-42ԾO>9zMgqn-\1Dߊ;x9ʯyEPmMe_T~Q?@?9$ NA!Ѽ\$ 6|s?BHoGw]&PBPmݢ|#*|?g8;Qub履~z_ $`kaBƛniO|˜.&h!9D ,($7&A?MBb13]ߵ3tMokFkCy*3Ȁ a¯6 cB`H_K׋DiӦE?;Mj ]N:҉B$ӑmw|q҈m@` `YQ$0ξϽzZ}_E^(ˢ+rDCo7_pQGEvZ@9`6τ0 ;8ӂݮ2'p1 ,@ :ЉsE9l/l k;wqGtǏ[`8h" vEc3M:Z'AzW\aJn`4Th {7%G;ꒄ?6NT,v_Pvm182wź=)LhEDECE +8nر$c /~s5@L2ń%~,>?/! HoBDdcyM&2N3fˁv_烇~ήOm Q  %+H5aIPɮ6pӟ.O،ϛgy"~Nܕ$$sOݕ Es:u!LDnp /7Ai@_t@4^K,Hh"8'𝴣.H6YOcNL?|-wyg!8cSN9A @+~s7-6I#LV5>E=4p ?C# s?/^;Fg3'-1&1eD{sZJ"3// }s#>7I}NAmjԗ}_..ndGpJ='])1_ᵷ@"-$;SģӲ2%@]iD?YIJo @"B]4 *NI?ߣD6+*?nܸQ}{M6V?9!\ fII3 ){E5[5"Oυ^h h|M<}vZ_ǿCN!Z(NƁl5 -ܒZC`qTu@lLX1qCXlVFRBK|ʾ΄!fM .m1 TP-:kԪ:YГL4??ۅǿC i$)Auve]h`=s1@?}Z} uᴨ& xassx!?v(]xAiI @K!4ɼE]Y*u~ OHU)my,x/!4q@ ?aĖ@($D0,[xBM+=sڨϫ Ӆ7(.%!PtCCF LPЛ$!wp͌z c8Ej턟$տ? 6E ̉QJBhDf#$H2Di@aY'&"bmmFs^Ɓi;H vmg((PL9s/y JI&7@1эUY<;v\wvOu RF{jڑKsV0W: B**u\&ȃ`IKb=YC-''X5/Ƌs>!s&7ejm/w. ESx) і-XVHYHB|l~!b ҄unZrb,\xrP5{+<N?j}82T΅00O˜QG7Zޫ& ɉɒ (Շ/E d1\AKhj**\%}0E紜2U΅$~-v<QB<ѥI$"afrpI ȠfTPI`aa2#. R T$LJ y}݂u{M~ \Z@@cM U@Q-͎NEjJMBN;'_oą$]v٥#9ЂTZo ??!ֺ4ˑW~m@piT q:"@^ g&;5לO&o. @-@Q\duZs;"P60V,UH$-N~+&ܪ|i'^ݻ@7뮻v.w( Hw-Pr"c"q]y'L\اy-2r߫-vHYu @+l_^fu >ЯYT(hDTE T 3d*-h53 fַ曯ѻ?(B2k $?{`=9 @2xZ} ꫃VLCYF -,ɢSǏ7?駝MAs9ɥ3 X lL"pq:FlȢ5TR)R%]Hd|ѥ^s!u* C MvGGK,Di>lsfhG @(I& -  GU)8=NBQ(C/Ih9sS[}iߗW@xxidV^yes@)'TS];P ԩHi^\QtP8= 3?BW;+'MAVVTKW!?A"u`Q^~^?T`*I~m 4-4FL- ,C8yCWUqU߹ІބPl$x&)~xI/k* FU* pQP=~HTP_w)A8[?hp IS!QՉŗaKg _/- ܗ|Snh!@zPr 2$P (*eIuI$YIP&Lfgg_%sBE],BΝLb|.aOK7n:e l-^]< iQ*`bL4 ivv&/.W_}ʳO/xJd!_dر|* I!u>33 Ȟ,+'ubbu;M!E D>^uL1LHEa&E|W!lѲK t";"FCӗ]꿎&4"i .d3U l3+P6 w}5\c_k暆VYeҾ["@@Jc}@SL˯?|P[^"ζǀ~n@6 mk50+[wc!Cv %ݟhN2D2yrdWڌ"4?4C06`wtP±e2 Y4,#y 4s[H@P+ k:wFÈ2SJH>9cIQnig!\݆}=&z7Ja S?kҁhv J +qME M[•W^igۭ}%<ڎX=粰G.@J t\E Wm-TȜG:?=cĮPHu{W?5law |hT}"s ?> U@Jl` u@( |k?uhEjx|_IiῺB"loZp57gVU Bv+-]Bo ً|%@ dĉ $0Ba JmݖuHiQF?@5P;L/P×_~y{D>BL^@~]ٮ9$K[4;54΄$1ʆ% 3Op '9SN5, sUKq"~?@? t!܅׿nZ$O~s"m7\tE񣝃ƕE4QG4]\Bx #v[@ba&ЙCQEAV^?@V3?ի?9،O>OJ3?}d-E4!9y=lfEXiڣ@sD@+ﵞ?rZ -.JdJ *yοK 5kL<`TFvh(h+[oi OsgZ4 E=A=wVzS=|fmL">%)sUIi F|D88Ƅ~vV[,3Ȯ_Ti/tVנ.&N Bh4hУI1dnx =?d5Ȏ? 42( .1eZ䫧W ; *b|Iv7uDV̲U6zl%ΜP3e#^{&;|J8 g%w |$G N@HV~O,`?1l=P{]B-u?<unUDIf,kP&&fFU~6a.G * *E)u<@X/E,8txԩK*^~^@,IZЀ&Ye8#uqfqCOM A?`@N^Y:-?/ÅzeJiٓ" srN@)Ϧ9I0*! fJfRK-UxI)q>1 @,@!9vMrY\ xY31pTa,! ߋ/88Ѝ @<\p驧[4{GGq1\zeI h3@֪qհY( (lQ] A?cV RT3s9"7R`?a7 d*ɮ esCC4^eMb M8(BI)iqi"&c&i8yRˎPM&j&7L_C.G`?@yn:AGG.){WF'ERٔiǃ"+cxF'lGYO*@vg%a?!ƒNeEYLeO“%1;'PdC"DpLZ/㤴 ]( K7 N?~4,h* MIZ̫2#>soae r6MQFBD '`>2%C;ؿ3ȟg~AI,Oak +O9H~ASH,`#idDKBE1 q ^Rn9֑bg'갟?To[g"(mL@!1\ш0u&gI?P1&Q̵@@`qnPz\@f$G3}clfֶQU1G.-S2k~:@ 0\فךl6|޾ki EZC"^ T ѓODXiuI'ͦozמ~*n |TMI_H&afF )á=K6Ӂ1d?c᚛BP#_83lm RSK1EAB \0;q[ȓғxfhv긿]mQSw4ZhA%@H@֜tԉu,t(&dͧތ53P0p[outg$LJ"É6:HvmCO-4 &Ov) NgSDsϧ@ 7`|jc# ! E աɀ/'?Q!$*+9 /GOƝIDŽ@B+ hs? \ Ig"Rqn/%y @ TF&M2LBrˑc\3dW0tD`-C~d|V;h-NFQuB ǫ %0paej@EOjdweHa-)bQfAo?xϮ8{#ޫkPWbu fJhʚU@i@ocQ5P9@ZLvwVKO3 nߓN$a(|N`1+*r-qutMsMv믿)r8Ȟ{i'"ʁ_2o); %,A}󟏞z)>M&WW%eIhPMWG ؚnJlyO"ǼR_'zx\ą @=}6  Oda$\c'$tbr(׮Bs +B5"yE}"Ut '9$Ю|az4Y< ϴ& ءYv3 v/!-FR#˂^8}@pQ~v,@9Ǭ!4FH ?GtcAS0_g6,lAy Xk}6:$aV:$$Е D?+v&m'eu.:Y ggQg̘LY>wq&oeB2R-@V^mdE v ;|Lj;l~Ǐ7dw$ JN-Y @Lk D_jl6A2]R !%llVC}Î̊ Uo h5k%#04h'vaX$4`~9P ^gwѱmfRH$D7hF U~>-̅<q ByȢ48+B $ HA  \.B> ;?& &,0=8-#ӊο>;ۙD&P4fYN#6*Cq4C}gf'r@-,+H&!k8Jh!Aya`r$+a YYQ@d!q4J'EB;݆y>Z`npvv@vt1|O2꟝:B$Af Ȋ*0"t&@}f/@157g0GC&@*Hq?D3-]i̓<L a. ,~bP(+ dz^ڏ%PJ?$?H :.P;f&S"n{eqypZ5ס!@ U[=G!໑ȕHR J);j?@QG +Qe`f!W$xeEKw# @!Z6Md*%̲169T#"ܕHjDQ@'@7A(H'ΊU@8 )(`T #)GEἢXY(CA E@ AZ/U`Y2|0qfM9&Jiд@Mi " S5d@B|IK֩Z[?#-aB.-ەe,F1h,P N6td>4{MGGb:4 y%*y/~m`b n@(zplHR  +5cW[o MdMC tA;&,%̳"T!yя|!Xu J3x : jH*0ND *BD s 0.Q_M$>JU#QdDZ>/*+T):9sAuJXA%D1!Bp(AU~ƞ'cQ7:Ɋ~"Y 3+I[us}V"JRJ+`nhGl  _ /4Ei@B8̩nuHh`,?9C܋ "e,tyP?CÁHaɍ馐'wM3\=ڃ71+'"B@U Am`ZgA^#Zk-o{Ik}e('if'a!`UDnBJ<!n &Hk `ɹ!Ѝ`6{ Z^.;X⬬ߥùW\1:#:рp&^DM Z!@e!@A49EV9,[Sмua-2 P4)W3&-vΗ@ ! _wi}`q`Zei }@̊ dE*=TYѐ/W_LChX ` BnA!@K;hI"Tf>OFUPh%d9{Bܱv ʖ*Tx"Aj>- ])-G0'h \GԩS[.q'E3!@+W(FR9?E 'q?'- I@ݬ_O2JA5B _@`#e[3]%0:uqa׳1&1^V޿ UHT>:QC:1/%h:!Wj 9- )@ZIsT-yB^>Y _{x?!S- iWz;T$i:VX!Q `<*|F= b):&N?- 8ݟ_%q?R\6O}A3KHNcp \~LZByQ>O? (^PIe5yJ7McKj*h;@vv .g=H-~6@?{AK5 'j]xL <ϳ>{D0 ^%w+?\V_e?yyxRJȐJAX_P <4|O&6=?<ŷ#bW/FLxtS(q$ty!L- JI :.<G*?Z7r}Vf͛X'jlfydW`"x8(4/}ldu@c3'?rBB-tN81!l-?TCPL%C Ǯtv>PvZDƴ(Qy [=O)X&(!x衇LBQŔH-"Ro5$Džn1/Yd~x;TT^{x[LAI憩‘_>՟*;u 6uDBL&d&^PI$@$4pes#l >0 sz4p+" D[E@-B?;?nw HVTӨFd2QLhm SUuA%_XAh wMHQT'Z&E2|J11\pAaEH%Q"N,H~v}:s:eϘ1JUw󷞈ǺIX{ӽm2'q~x:)s66*br v# eEY>~T6$qRNU"Zhk4ie;&_Qދ2 x$gIWlL]_7D#DM7hڊeW]uUsP$إ Ë/hHwӄ AGe?E;P^+-];?YQvFW ֥|iOd@ tZ,p^| VI!?5 p}6:hrO'_ &ov& nlڳ*rCiuϿ M_eKXرcMhYH@q_l@aFF̕eT^&2շrKC lƬ$L.a"j ^&DCܼ@趲v$ ؇~RzSGEĎQ ӐmO3g,pv@ZA7/hõA`ׇS$R& {AR®j-f!@X9t@Vg^@D 4M.ͮB'N4a0u ٙwK.1ԝ"t_q@xe'DεMvp? ,Hv(r" TTԇTV;VlYrQ!yk =s6X/T.$"y#Ώ!< Ӣw$Nkኚ$D҄33Q \>ꫦW=cv|^B}:=Ps!Bx9xS4_=KZ:"g!Y~ĉ>q"= jYocxX &L00-&@D ςEz= ;. @xD#q'2@; ܤ}&˅]w5:㍦~v_O=Ԉ8?=bC2`gb@SL1ZAR@ W&_x 7`vl{Ǘj.&^B$ˑGi|2u\~#lpGad&.ᗒ^ |O6 PF<v gٞ~{чko)V!A K}}NK#7zܭ6ZEb8\@a8/T~3v|'r0.Gn?h߇f OxtV?$& EDi$PM D@Z ㋳O>uEv; &_|^DdV'NͩSFtb]cE1ʮ/a>77J$X<&,vBXa,2ewI $ u?[’n*ҵ0Xks@velGJL5\@ͧ/?y!o!&$)?SNƦfA?`D MpaujA#:LC4H{5 Q>ڏM;@ح}^G%&gɓgΏџEdE];齍*Ƀ~"xt$ňcAZ/=Q ͅYn폽o| A9 y@ NH=-ؾkw}|?O:Fx !}BBpI`&+%DXtb]⃸+eYın4_r/dˏ i 2uUd~$)P@UZx㎮O{^SA}}Vha]nU,%a: t!PB7GC6b2@7=0 2x7N;Aɀ8QC$Jk[QO@ `קG Z1H 5B?zhcja@CY`&1 JY M7G Y| *LV)ux  }Ț 1 &ك vhAV=> OY@A'oxfaGm =%&K}IzyGf o:m>TZI~=("c"7 Bϊ|*\[GKo#,tYzn?sBBm?xM,O}  BKn8( gob}.Y(Yv`(!dA:M 4u۝p]~I3-;i'!*-$0 !A@7:@IZ( uAR /@&oCǹ'=2_W]h G&V@c lkok2Ȓ*\d/+8$<INH5ՇGg㼨T ^"[s<Ӵ(C+ e6 @"!Z~kzw_Ǯ=uT;tq|'l+V@>L u @p ѥ<7I܅RHk&ڦhި;'No"<;Y4ܣ̴Lh p58 v@/'MdblI6W 5k-Zxcg_vzχ1=纸-`H%A!&~g!묳N뚣d(R^\&kaGxo8;O^t}xz; qPd% ]c璐n\ħsX)\pANS#嶔"b ;x8=zwh}j~Ih Z@7闄N9L?<E:p-?'\}4=!Vhk鈫#UO Cgێ;Z]M/}h {"K"h 7NHya#:]<3(q;x#fEo_1Z`)H&DCW', 3!Q+FK͢!R&DՑz0`V=UdȎ.KуIENDB`ic13YiPNG  IHDR\rfY(IDATxEǗPB  MEQ@ HcH HAD0F)(MWζ{sWy#jѢb@-CK-Z 0Zhb@Z`Т%--h1h EFK-Z 0Zhb@Z`Т%--h1h EFK-Z 0ZOrX8ÏKcx"k{<? B<ފKmբ|Л@׈xOׯ=ѐ*!"9p ,-+K,-:ɷ?̙37믿w3AhBAo@;1j V] hHqulv[:¿2D.OEpۂ&.synb5kV_*ӟd~QN2)~q~-5&H {x@@?%;c)yU~Wo>coFm NՂϲ >?IAWmOx:}>"s[ <}g瞋5IPBh ?EC;~G7n_tr];|3(A^}N 9TXY_ГÐ ^`\gu/ZG|ni !kE/:ovdȇ@yd08L3fyAdI8Z!@ AC~fsoڗњh 9EꫛO}S,s_}YX G !Ers-d'N/Fl O>do|#ꪫF x4 Hٲ;-l„ (@]>x|^tE&R2 [ l6cX;t~I6|v?&a駟6THBl ~!-B??᠃/&`ƌёG}Ο3I(>?hdV[m5޻H/lj͂10bvmm;>jħE  DD;?|+& bG}tt7. }!v}~"X{Msk4h͂1h@MX4e Qbdw!Ǟ,Xi% G~o17pI7wL"T(#D КM38F6 Y ŜǗ17Bqolu|$(xYx,jY@ Uq볨?*ɳ{Z`;t斡I@4+"5pl_HG ,8餓w$ѥiZ-e _-c뚎;|g/?]g?YVS "/; GaouN*1NA[I@/ 8 !uCI/~aW^j. S 6z׻l}j>j>YH,^~עd_~C }P7m @ ~ ?GB"Ҥm`w zI}Zƀ 0-W!gӵLn`TX0Ɵh-42ԾO>9zMgqn-\1Dߊ;x9ʯyEPmMe_T~Q?@?9$ NA!Ѽ\$ 6|s?BHoGw]&PBPmݢ|#*|?g8;Qub履~z_ $`kaBƛniO|˜.&h!9D ,($7&A?MBb13]ߵ3tMokFkCy*3Ȁ a¯6 cB`H_K׋DiӦE?;Mj ]N:҉B$ӑmw|q҈m@` `YQ$0ξϽzZ}_E^(ˢ+rDCo7_pQGEvZ@9`6τ0 ;8ӂݮ2'p1 ,@ :ЉsE9l/l k;wqGtǏ[`8h" vEc3M:Z'AzW\aJn`4Th {7%G;ꒄ?6NT,v_Pvm182wź=)LhEDECE +8nر$c /~s5@L2ń%~,>?/! HoBDdcyM&2N3fˁv_烇~ήOm Q  %+H5aIPɮ6pӟ.O،ϛgy"~Nܕ$$sOݕ Es:u!LDnp /7Ai@_t@4^K,Hh"8'𝴣.H6YOcNL?|-wyg!8cSN9A @+~s7-6I#LV5>E=4p ?C# s?/^;Fg3'-1&1eD{sZJ"3// }s#>7I}NAmjԗ}_..ndGpJ='])1_ᵷ@"-$;SģӲ2%@]iD?YIJo @"B]4 *NI?ߣD6+*?nܸQ}{M6V?9!\ fII3 ){E5[5"Oυ^h h|M<}vZ_ǿCN!Z(NƁl5 -ܒZC`qTu@lLX1qCXlVFRBK|ʾ΄!fM .m1 TP-:kԪ:YГL4??ۅǿC i$)Auve]h`=s1@?}Z} uᴨ& xassx!?v(]xAiI @K!4ɼE]Y*u~ OHU)my,x/!4q@ ?aĖ@($D0,[xBM+=sڨϫ Ӆ7(.%!PtCCF LPЛ$!wp͌z c8Ej턟$տ? 6E ̉QJBhDf#$H2Di@aY'&"bmmFs^Ɓi;H vmg((PL9s/y JI&7@1эUY<;v\wvOu RF{jڑKsV0W: B**u\&ȃ`IKb=YC-''X5/Ƌs>!s&7ejm/w. ESx) і-XVHYHB|l~!b ҄unZrb,\xrP5{+<N?j}82T΅00O˜QG7Zޫ& ɉɒ (Շ/E d1\AKhj**\%}0E紜2U΅$~-v<QB<ѥI$"afrpI ȠfTPI`aa2#. R T$LJ y}݂u{M~ \Z@@cM U@Q-͎NEjJMBN;'_oą$]v٥#9ЂTZo ??!ֺ4ˑW~m@piT q:"@^ g&;5לO&o. @-@Q\duZs;"P60V,UH$-N~+&ܪ|i'^ݻ@7뮻v.w( Hw-Pr"c"q]y'L\اy-2r߫-vHYu @+l_^fu >ЯYT(hDTE T 3d*-h53 fַ曯ѻ?(B2k $?{`=9 @2xZ} ꫃VLCYF -,ɢSǏ7?駝MAs9ɥ3 X lL"pq:FlȢ5TR)R%]Hd|ѥ^s!u* C MvGGK,Di>lsfhG @(I& -  GU)8=NBQ(C/Ih9sS[}iߗW@xxidV^yes@)'TS];P ԩHi^\QtP8= 3?BW;+'MAVVTKW!?A"u`Q^~^?T`*I~m 4-4FL- ,C8yCWUqU߹ІބPl$x&)~xI/k* FU* pQP=~HTP_w)A8[?hp IS!QՉŗaKg _/- ܗ|Snh!@zPr 2$P (*eIuI$YIP&Lfgg_%sBE],BΝLb|.aOK7n:e l-^]< iQ*`bL4 ivv&/.W_}ʳO/xJd!_dر|* I!u>33 Ȟ,+'ubbu;M!E D>^uL1LHEa&E|W!lѲK t";"FCӗ]꿎&4"i .d3U l3+P6 w}5\c_k暆VYeҾ["@@Jc}@SL˯?|P[^"ζǀ~n@6 mk50+[wc!Cv %ݟhN2D2yrdWڌ"4?4C06`wtP±e2 Y4,#y 4s[H@P+ k:wFÈ2SJH>9cIQnig!\݆}=&z7Ja S?kҁhv J +qME M[•W^igۭ}%<ڎX=粰G.@J t\E Wm-TȜG:?=cĮPHu{W?5law |hT}"s ?> U@Jl` u@( |k?uhEjx|_IiῺB"loZp57gVU Bv+-]Bo ً|%@ dĉ $0Ba JmݖuHiQF?@5P;L/P×_~y{D>BL^@~]ٮ9$K[4;54΄$1ʆ% 3Op '9SN5, sUKq"~?@? t!܅׿nZ$O~s"m7\tE񣝃ƕE4QG4]\Bx #v[@ba&ЙCQEAV^?@V3?ի?9،O>OJ3?}d-E4!9y=lfEXiڣ@sD@+ﵞ?rZ -.JdJ *yοK 5kL<`TFvh(h+[oi OsgZ4 E=A=wVzS=|fmL">%)sUIi F|D88Ƅ~vV[,3Ȯ_Ti/tVנ.&N Bh4hУI1dnx =?d5Ȏ? 42( .1eZ䫧W ; *b|Iv7uDV̲U6zl%ΜP3e#^{&;|J8 g%w |$G N@HV~O,`?1l=P{]B-u?<unUDIf,kP&&fFU~6a.G * *E)u<@X/E,8txԩK*^~^@,IZЀ&Ye8#uqfqCOM A?`@N^Y:-?/ÅzeJiٓ" srN@)Ϧ9I0*! fJfRK-UxI)q>1 @,@!9vMrY\ xY31pTa,! ߋ/88Ѝ @<\p驧[4{GGq1\zeI h3@֪qհY( (lQ] A?cV RT3s9"7R`?a7 d*ɮ esCC4^eMb M8(BI)iqi"&c&i8yRˎPM&j&7L_C.G`?@yn:AGG.){WF'ERٔiǃ"+cxF'lGYO*@vg%a?!ƒNeEYLeO“%1;'PdC"DpLZ/㤴 ]( K7 N?~4,h* MIZ̫2#>soae r6MQFBD '`>2%C;ؿ3ȟg~AI,Oak +O9H~ASH,`#idDKBE1 q ^Rn9֑bg'갟?To[g"(mL@!1\ш0u&gI?P1&Q̵@@`qnPz\@f$G3}clfֶQU1G.-S2k~:@ 0\فךl6|޾ki EZC"^ T ѓODXiuI'ͦozמ~*n |TMI_H&afF )á=K6Ӂ1d?c᚛BP#_83lm RSK1EAB \0;q[ȓғxfhv긿]mQSw4ZhA%@H@֜tԉu,t(&dͧތ53P0p[outg$LJ"É6:HvmCO-4 &Ov) NgSDsϧ@ 7`|jc# ! E աɀ/'?Q!$*+9 /GOƝIDŽ@B+ hs? \ Ig"Rqn/%y @ TF&M2LBrˑc\3dW0tD`-C~d|V;h-NFQuB ǫ %0paej@EOjdweHa-)bQfAo?xϮ8{#ޫkPWbu fJhʚU@i@ocQ5P9@ZLvwVKO3 nߓN$a(|N`1+*r-qutMsMv믿)r8Ȟ{i'"ʁ_2o); %,A}󟏞z)>M&WW%eIhPMWG ؚnJlyO"ǼR_'zx\ą @=}6  Oda$\c'$tbr(׮Bs +B5"yE}"Ut '9$Ю|az4Y< ϴ& ءYv3 v/!-FR#˂^8}@pQ~v,@9Ǭ!4FH ?GtcAS0_g6,lAy Xk}6:$aV:$$Е D?+v&m'eu.:Y ggQg̘LY>wq&oeB2R-@V^mdE v ;|Lj;l~Ǐ7dw$ JN-Y @Lk D_jl6A2]R !%llVC}Î̊ Uo h5k%#04h'vaX$4`~9P ^gwѱmfRH$D7hF U~>-̅<q ByȢ48+B $ HA  \.B> ;?& &,0=8-#ӊο>;ۙD&P4fYN#6*Cq4C}gf'r@-,+H&!k8Jh!Aya`r$+a YYQ@d!q4J'EB;݆y>Z`npvv@vt1|O2꟝:B$Af Ȋ*0"t&@}f/@157g0GC&@*Hq?D3-]i̓<L a. ,~bP(+ dz^ڏ%PJ?$?H :.P;f&S"n{eqypZ5ס!@ U[=G!໑ȕHR J);j?@QG +Qe`f!W$xeEKw# @!Z6Md*%̲169T#"ܕHjDQ@'@7A(H'ΊU@8 )(`T #)GEἢXY(CA E@ AZ/U`Y2|0qfM9&Jiд@Mi " S5d@B|IK֩Z[?#-aB.-ەe,F1h,P N6td>4{MGGb:4 y%*y/~m`b n@(zplHR  +5cW[o MdMC tA;&,%̳"T!yя|!Xu J3x : jH*0ND *BD s 0.Q_M$>JU#QdDZ>/*+T):9sAuJXA%D1!Bp(AU~ƞ'cQ7:Ɋ~"Y 3+I[us}V"JRJ+`nhGl  _ /4Ei@B8̩nuHh`,?9C܋ "e,tyP?CÁHaɍ馐'wM3\=ڃ71+'"B@U Am`ZgA^#Zk-o{Ik}e('if'a!`UDnBJ<!n &Hk `ɹ!Ѝ`6{ Z^.;X⬬ߥùW\1:#:рp&^DM Z!@e!@A49EV9,[Sмua-2 P4)W3&-vΗ@ ! _wi}`q`Zei }@̊ dE*=TYѐ/W_LChX ` BnA!@K;hI"Tf>OFUPh%d9{Bܱv ʖ*Tx"Aj>- ])-G0'h \GԩS[.q'E3!@+W(FR9?E 'q?'- I@ݬ_O2JA5B _@`#e[3]%0:uqa׳1&1^V޿ UHT>:QC:1/%h:!Wj 9- )@ZIsT-yB^>Y _{x?!S- iWz;T$i:VX!Q `<*|F= b):&N?- 8ݟ_%q?R\6O}A3KHNcp \~LZByQ>O? (^PIe5yJ7McKj*h;@vv .g=H-~6@?{AK5 'j]xL <ϳ>{D0 ^%w+?\V_e?yyxRJȐJAX_P <4|O&6=?<ŷ#bW/FLxtS(q$ty!L- JI :.<G*?Z7r}Vf͛X'jlfydW`"x8(4/}ldu@c3'?rBB-tN81!l-?TCPL%C Ǯtv>PvZDƴ(Qy [=O)X&(!x衇LBQŔH-"Ro5$Džn1/Yd~x;TT^{x[LAI憩‘_>՟*;u 6uDBL&d&^PI$@$4pes#l >0 sz4p+" D[E@-B?;?nw HVTӨFd2QLhm SUuA%_XAh wMHQT'Z&E2|J11\pAaEH%Q"N,H~v}:s:eϘ1JUw󷞈ǺIX{ӽm2'q~x:)s66*br v# eEY>~T6$qRNU"Zhk4ie;&_Qދ2 x$gIWlL]_7D#DM7hڊeW]uUsP$إ Ë/hHwӄ AGe?E;P^+-];?YQvFW ֥|iOd@ tZ,p^| VI!?5 p}6:hrO'_ &ov& nlڳ*rCiuϿ M_eKXرcMhYH@q_l@aFF̕eT^&2շrKC lƬ$L.a"j ^&DCܼ@趲v$ ؇~RzSGEĎQ ӐmO3g,pv@ZA7/hõA`ׇS$R& {AR®j-f!@X9t@Vg^@D 4M.ͮB'N4a0u ٙwK.1ԝ"t_q@xe'DεMvp? ,Hv(r" TTԇTV;VlYrQ!yk =s6X/T.$"y#Ώ!< Ӣw$Nkኚ$D҄33Q \>ꫦW=cv|^B}:=Ps!Bx9xS4_=KZ:"g!Y~ĉ>q"= jYocxX &L00-&@D ςEz= ;. @xD#q'2@; ܤ}&˅]w5:㍦~v_O=Ԉ8?=bC2`gb@SL1ZAR@ W&_x 7`vl{Ǘj.&^B$ˑGi|2u\~#lpGad&.ᗒ^ |O6 PF<v gٞ~{чko)V!A K}}NK#7zܭ6ZEb8\@a8/T~3v|'r0.Gn?h߇f OxtV?$& EDi$PM D@Z ㋳O>uEv; &_|^DdV'NͩSFtb]cE1ʮ/a>77J$X<&,vBXa,2ewI $ u?[’n*ҵ0Xks@velGJL5\@ͧ/?y!o!&$)?SNƦfA?`D MpaujA#:LC4H{5 Q>ڏM;@ح}^G%&gɓgΏџEdE];齍*Ƀ~"xt$ňcAZ/=Q ͅYn폽o| A9 y@ NH=-ؾkw}|?O:Fx !}BBpI`&+%DXtb]⃸+eYın4_r/dˏ i 2uUd~$)P@UZx㎮O{^SA}}Vha]nU,%a: t!PB7GC6b2@7=0 2x7N;Aɀ8QC$Jk[QO@ `קG Z1H 5B?zhcja@CY`&1 JY M7G Y| *LV)ux  }Ț 1 &ك vhAV=> OY@A'oxfaGm =%&K}IzyGf o:m>TZI~=("c"7 Bϊ|*\[GKo#,tYzn?sBBm?xM,O}  BKn8( gob}.Y(Yv`(!dA:M 4u۝p]~I3-;i'!*-$0 !A@7:@IZ( uAR /@&oCǹ'=2_W]h G&V@c lkok2Ȓ*\d/+8$<INH5ՇGg㼨T ^"[s<Ӵ(C+ e6 @"!Z~kzw_Ǯ=uT;tq|'l+V@>L u @p ѥ<7I܅RHk&ڦhި;'No"<;Y4ܣ̴Lh p58 v@/'MdblI6W 5k-Zxcg_vzχ1=纸-`H%A!&~g!묳N뚣d(R^\&kaGxo8;O^t}xz; qPd% ]c璐n\ħsX)\pANS#嶔"b ;x8=zwh}j~Ih Z@7闄N9L?<E:p-?'\}4=!Vhk鈫#UO Cgێ;Z]M/}h {"K"h 7NHya#:]<3(q;x#fEo_1Z`)H&DCW', 3!Q+FK͢!R&DՑz0`V=UdȎ.KуIENDB`ic07'>PNG  IHDR>a&IDATx UQ@E% EA@@0bp@B2E2灰HP  Ԓ0D5œr }yo Zg=ՙ ^S]/`U6`= Xis6`= XisZ^2Y26We,j_d% 02I261 nUWWgZhaZlڵkͺuL}}{d!#2PoÇȘ$c0FmԾ]vSNslj6tS֭[-lfm۶?4|Ooi_7yzC32.`'j*(G ;cwNGszMǎ-Y: ;Cpo3̻kx SO>H%2NdV2 wnsOӯ_?n5b6":߼^_U=/_n?^{ͬ\^l2W{P~0ap1cٳnԨQ[nNWVW+:Pvy<`4T}2$QKIw}Ç?cq3= ( IƋ/h~_"̲en[2VU{b}5 qgveM:C=N;(Igo)J]q7ZW4CL VR?W^m<c&:q-1N+ `M7d.sr؏e!՜jqlwVӧOń~ f%+qՖH(x8~PO<ъsV65t|5n@,8/ZqOl `^z%7jM61~f}[Lg}`_ 'H q#G,BYSLŧ[ 9p:1`;`{O-/2swZ8KƹfD_$fVַfpV=&?Oy5s1.U͗/?A:Eׇb 4![XŸqIƂ ŋm!t1dH%0T}C߾}~4#Fh$ոC/ZȬX"/0V8w,x 87'N,|;#Ԍ$ 邀%ӦMk^z%1B`J0Cŭk#բFRc]y6IrOL>$C,YbƎ[W:kiz嗣r3X&bڤIZյcիb޼yoϻYL ?1AJo|-PqHcDW@.\hVZa`O.'s R2sV"7g͚e:+|^]wպZ{޿/~Q6l϶/oW%$BJG?2?欳R`iȃk>S[y#ڕGm䙏:PKlo/AWUkHxᇭ=sV\tEMԙ; xZC4 web\X&3<ӈ/݉ENץ4җT fx(h;w9W@"x<#oU,OtX>?= clȐ!MW(w}ͯ% %a,tdVpq׮]g̞=} <_"]:V n!b?D +̋"x=cƌ#$U (aXJ\ܡC^xFGwž2ALB(v\'UD|.?ߜr){umݫs]=ẆDI愨o߾tT.po8?IJ@e6RzE<[Sྪ*{/cxHBa^)bԨQ}k ~Z #saEx\ïE()X9Dd eֺ&pA &ѳ z} 'έ &XJ%Num#";cƌZCq ,[PucǤL$Y"?~>}42\p̼;~ps^D:3$' Pƻ`r0iӦm/HSC\<_}\p N]U{V$(+hBP,m"P~`* g@IxRn1.m۶Μ97n]!*"9 W$XdBř ߨCEb%`R5ONXdAL˧s,z _VLرkٳg|)o'~rP2?Oc$"as7 ()z'p:aԕ |QVÎ~Q7\ZSEe15tyY(*H BMiE@JRcf*_L޽ ,hI}$…IC 0y~&^ID0_1ȘR?un3g4q_m4{s9E A:|" \VP-TbPE .]\!VK YP)أRIW?5y$bl@@ `6"B5\/*Nr"R - `rH %,f@,{^O.IK%E|PB-akfvyWk^{ݻq ` FVzmDSUR9#`Х\+6aQ ҭ[awWߞN)g.ȉ;OQJJubr.q( I"k7 j c6ˆ -L˟)Æ Ӵ6 S *r(Pbr1H$~&O$*T >3g LLHH:w6"\284;{9׿umk8 ?+x ]/ ˇ]0b # e@D`#*)v4cq(Ck7ˈd[A |5zߟ'|5rCIV̘1cN8\$Q0s^YmvZzmH3 mu'R@0ԩSS_D8.Þ@zP DNZ`P( e*FD[*ZU3Q_!Qkx*&J w7ۼwe  e4t=7([ q ÊMm6nbQq\RG}Z0T{ˍxH:JLR`X$;ΤŹbN fal74pK0Пfhݪ+[&tvct1q!ݍ)J> lYT${Fq#8boi4qs. p0-(Mit,#<҂/[A+MóQ^8餓 *>XD0>a}Y_!H"F EnJ!j eJ mRP0/S)TC8d 2؄4^^ 4;qjK7Q:uZĮb<nw &#޴q"7gXWBda;RZhY,Pbz#ΐ'BcqaS<ЬX2(P@_A59ꕕOwtP-ҪB*a έHh& P ߓ'Oִ92n47k{XP]@_DOD1V?tt?9vZ$HG03-K$ ɤJەC$W0FxMThf0`1B1W\@,}ʓc&44?w{&U2jy{6RuQp[nϛ Jb@w\1/V~h [>iT ]Rm@j }ƠEi\@KbRtX.ٳ版 }VT-0(}?ƌDhtEsPg(v L b@g pۍ 0u; 3['ߛ'hBp?ƏE ,h9vp&lw·}"!aI['FF0FNEŃ*O"QqI@*drW1I!{ UBc.D?GVy){B 1J59ᩏmq0IlA*{JMk4)*,:vN,2[9d ?@&Wъ?73pC]B\% (%~ s ]~C̱>R|>@ev >؊&"o|_/BBX-$K&#! 3r=/Є&tadȜ_@`6TVQYDoVJ™6`.k)_L`I-jU xC &咛*]5Uè$vJ sIepdIرcw0Ð8t]F{:^; t QD0gs ĜWCQCOHvV{&8̤X {w=2=@w*k@DuN $ff@q@ .&W޷K <ի+ VT+&i@i;kqa}L2 Q(xAk !Z>z0xQʵS҅ TЃ'.NPQH 1 O>PH\{&.'|wPKHܽq]pڔrCI*e;B^3jrQ+63A>}DaG5CFH[U(paI%vԁ B( Ƨ|a©bC98L,$<p0D((; WP\na xY¤IrOHǢ,+ע=H!{].F\'NX; H{J@;^]{/P )%qjXQ={"oBwj`@݃5t!F1* $ u0Y{A-bd2bIur j^j PBJ@QP0{d@א'u$Y50a{!5OݻV-P$'+J.n.ɠ8{#֏S]M3 6qЇ=zhC U*7iֱ=` (E:Ͼ89@btid9~AN3$2(v(V~,"bY$@bXϗv3qְE%j*4Dt[QڂRa>M"]3H~ KZQ_p˪)]U~+JvJ%{x$x7vp?T.y wC\R`bL*4u Gu. #ک eBu"(sc唕#G~hGx%UEDj>BNk3s?9KYHn2-s+)\BJSW*ŬR5bKsѨed)kN PFf|>EQ!kɾDW{D~NKt s:8Z3M?8)`8"<-|>ٔ~=y ׮]OU\of˜Ci=I/_nO.N oMQ$" 豠u~X}}:gz2 hK8ԅ=y  Zh3u 'nRl3Ebs@s\ f` -__߂fujbp'э+|2^L`>>jM)/ϔq:D9[B{q%Y2 (&O5ўY}T, VlH"!V.+9E/v59_9.="L ţV=,g`EQBhDL2ҀӽC'/AB< e2}@PeaH$%'%ÜʪCT`{F!A~Y 7C7Kf 9Q97`]eP~|l UqO0@G 9we:THTm@H;et0Ihđ\-Br;0 Mbv`l8a*aC;9ߞ w9LÆVV=M+a8%yů4wQTKPF"oX\1M$MQs#LZvu7ӨB"]Ӌ S%qZ@@D~<8=h^?V >ׁۆF'~d+4(haaܱ?}U'էZt :p.GAMP< %gx.\7vsb tqV;' wC}jd Ep p ݒGK+ Y#香a"= )"C(?SA|Bs~yO*S:>\b12Fh F4D 6b?]݇/Յ0uik.5WD@=#5af~B >#e,6dG|4Q2.q`s2isWfppIENDB`ic12PNG  IHDR@@iqIDATx eǟ12!aLe0KQ${!eFD2/["B" fJ{\y9gF̜}yO-F/Fˍ Bv"r>44+]PwN9 ,N:$UNDY BҥJ@PӦM;wرr @ldd丸=P0/VǏW{U?駟T߾}ՠAWƏB ZiGIK.Xbj͚5jԨQ䉹9*BWnݺfsɓG[S;wT:rV^;ТE _+W.UjU |7/_^o*!!Y7\o"d!+č+4kL[Ž;wq{a{ʕ? B 닅uH?J*=onjCO* jر;庨̓8WΝsQzLCvO?u#9kj3Ub^.h@(W$$g "66vWbbb>>%qE28X !Kt`UV|@E.U|$%o& GXxG|$ϫf,ThqMO?v}m͙3#x z…o @Nԇ~3sAL_ꫯj[}@^0/J#37S|:ro0 / !RڷoD/ ݺu[ l/>Oַwpi&yĉZ:~z kBQ _uwx#·K,-`bn}%v{a"Etqm۶U^xA/cP*A)n!#믿z5vmj܋Σ>8EC@)7$v@6J*s*+lmvag*$]I^;Uzu Y;^{\(d5ՀAF%ip ,I!%7F\w Ǝ;zkz~P wXb VI4X߸? (@$oP)>o39r 6mڸ&@V6oެC?@ OMBYsLx7D҇Zo-ObAC3`Ŋׯf0E̙3cb 2ȚR@aщCccc]1`elNl1Ge=%C{ LLB`m:L} \ΝV a=z!'[ĂiA֪|fcDC^Iz& }s dA}J?8D4m4Y\$1df-[ԭ]|*ϝwީ x?k,@h2%9|ZZZ;9e\XkMu*߉N2x@ \*c(dSlی34^mӞXtݺu >AhN[Xވ9$15[3\#r6U\!eD_3K$Rrq{[D9,PZZ8 ^p>WyF+I gd!X  ~ZV |F| ڕ?` EC<*%r rx3" 5?3 BBUiZ PQQQ.oسg`kSa'$28d_?sJ;Ew DlUY9v8p*O]d +Y,aLY@[(]z0e6/\í̚!Olxxg HDɒ%C"h,޼X^9:ĩd}Q$ ׌f6Qt0A7}뭷pBoLzyLW**G cy!XVOX߯]gjjzrsQd,lY'B<Ja&sO\ ?)>/ʭ椁X+7"<A>oܙ0S{ SFL1cf)7-1J"֞(Y7a @a+1LbIШlrXCr[$𦤤$& ȘY)KC"0`@0; 1fLN7֛/!'(",[LAww!KU uCQnx@>!J!C:H8GS&[7s1 g^ym.<)[?Ql(RJ!< Wo<sL{6ZSx90l=`(7SzbRB )$8ÄGXpqim#G\VQ|^|ċEJ9{+WW䜓r7 奉.U zIENDB`il32 ;6CC, ?yÄ$@Ğ.-ُl(3`l 2#߀* +a )* *    * Jn j+߀ . i9 %+ހ < i a+(΀ Li@+=.3i婢(1!>*GQ51X3SqFЀ@V=4\]*GQ51X3SqFЀ@V=4\]*GQ51X3SqFЀ@V=4\]lR-jpԉH bEWP$"Ѣ$ب*%hTHğOM'y}߹:G]t ̔zѣG?%Ӈ 5k^vHWWW666ҋ/\RǏ'؏1"Y7//ʊxLck(33Suڕ={V{ @߾}N9sLsѓ'O(55m۶TXXHMLn"kkk?~<988… iÆ >}6FtԉݻRy~156m*7fӻwdC C| ˗/ܜ&L@/^{͛7(GΝ;{BfEWFFFr={R)''G`7ۿƢE(66V27c sY _@=v:T$קbt!n%,S6mZ' s)f𲡡l N n>|XNĉ)++rsskd˶=N hŴ|rSE7nܐ1@||,}h`\ vܙLLL69r3F6mt7n$OOO#tjhh>/cǎo---ؘttt޽{ĖJߗږhȑ#r,2wݲQCޚ5kRJU͛7{1 Flm6[Ο"1zhBFa+")޲eV89$ b.=G64 e$p?ݩS(&&RRRd}A޽{˜O PPen2ldɒPT)$իWI}Na6&Wv̄,!:04|A\RyԒ9ӧ*;E-C' Z`CHШa1,&7mMr>]]]h[1>> 333999 LLL]]]#@ 444bbb)))BBB>>>999 DDDcp*** 444bbbyyy&&&===mmm777999 000gggEEEIIIYYY 444bbbuuu777222VVV999999 AAAaaaWWW\\\}}}LLL 444bbb&&&DDD999 """ssslll"""XXXooohhh444bbb888>>>&&&LLL!!!BBBNNNMMMLLL999 @@@yyy$$$LLLxxxWWW!!!444bbb999 AAA^^^&&&d}}}444bbb999 BBB/(((ttt666...222"""&&&,,,CCCLooo===vvv***;;;aaa VVVooo&&&bbb ;;;!!!"oooeee;;;8ZZZnnnPPP;;;+++lllKKK<<>>YYYWWW---MMM RRR +++>>>///[[[fR???ZZZJJJ III <<>> III 666666...'''JJJ 222LLLLLLLLL...MMM RRR NNN{{{wwwxxx^zzzcccmmmIIIIII RRR TTTmmm[[[F```TTTCCCIII RRR HHHNNNyyyt#ccc---III RRR 000\\\Pggg444JJJXXXNNNWWWVVVTTTYYYMMM TTT555 EEESSS!!!!!!MMM...;;;>>>777'''###///---qPPPzzz===fff---:::PPP +++RRRXXXFFFFPPP ///"""LPPP&&&}}}sOOOPPP  APPPtttnnne111PPPqqq [[[[[[qqq---!2}}}RRRqqqMMMK Nppp;;;QQQ```i UNNN ooo;;; \\\oDlllTTTBBB((( nnn555>>>EEEZ$CCC˹oooUUU###rrr>>>eeeqqq###2|rrrRRR(((@@@777mmmVVV """sss^^^(MMMچzzz999"+o!!!FFFYYYfffooonnndddSSS<<<u2  ???(@ @ 1Rl~r\< R  hK ???fff]]]444 ji &&&iiiXXX ZMMM777 $ SSSttt888 '''OOO:::Nc666 III### wwwNNN 444 vvvSSS!###)))000...$$$&&&$$$5888NNNUUUaaa]]]LLLdddqqq"""=CCC}}}ccc:::(((6AAA*** HHH 999 ddd|||&&&"222OOO HHH 999 jjj $$$ S888 HHH 999 jjj KKK HHH 999 jjj nnn Qfff HHH 999 jjj +++999@""" HHH fff999 jjj ɕ{{{ HHH ddd{{{eeefff999 jjj bbbI555!!! HHH ###fff999 jjj  HHH ###fff999 jjj EEEhhh&)))}}} HHH --- XXXXXX:::hhhZZZZZZ fff999 jjj n}}}OOO HHH  BBB pppfff999 jjj JJJ ... HHH  ???yyyfff999 jjj !#::: HHH 999666fff999 jjj jevvv HHH ~~~ fff999 jjj ~~~BBB HHH fff999 jjj ttt ***!!! HHH ---~~~fff999 jjj ''')))OOO...>>>888 HHH  [[[uuufff999 jjj """===CCC222 9DDD~~~999SSSVVVAAA HHH nnnkkkfff999 jjj FFFZZZWWW<<<X)ZZZ:::^^^mmm___;;; HHH ______fff999 jjj ???cccpppaaaRRR###m:iii<<<___zzzwwwXXX((( HHH (((SSS###fff999 jjj ***[[[zzz}}}aaa222z>ooo~~~UUU{{{nnnBBB HHH GGG###fff999 jjj DDDooo{{{UUU888>>""""""$$$!!! nnn666ggg---gggxxxA"""+++ ,,,999AAADDD@@@777)))555+++wwwDDDzHHH222YYYCCC---ddd~~~www2<<<***^^^???&&& ~~~wwwO222...~~~wwwNNN===333///~~~~~~www !z,,,)))~~~wwwpppJJJ~~~www3z ~~~wwwlll888|||www !Iyyy{{{www>>>wuuuzzz||| ,,,222RRR%EEE]]]]]] C=VVVhhh&&&_IWWW|||vvv)))kDKKK%%%"""LLLmmmAAArrr%%% 666!!!c0333⹹IIIIII888 ###===FFFJJJIkkklll[[[999FFFaaahhhuuuddd%pHHHyyyTTT&&&BBB 999ccc%%%!gggFFF0:___DDDK/777|||hhh!!!=P###OOOxxxnnnBBBZ Lv zQ"?????(` ';ELNHA0 L}d-E  f= '''DDDaaa{{{qqqWWW666!!! jl555iiiTTT%%% 1 @@@iii))):t)))pppPPP ,J444fff ...CCC ---dddMHyyyfff 555KKK  LLL VVVfffXXXXXXXXXXXXXXXXXXWWW[[[)))(ggg 222PPP L!666 ###'''(((%%% WWWiiiQQQm) TTTbbb,,,999BBBHHHIIIEEE<<<000"""888666)))+ lll```QQQ___hhhiiibbbUUUUUU~~~zzz666'}}}(((222@@@ ggg ((( ;;;YYY"""^^^DDDn RRR ### &&&||| )))>>>Nqqq ### &&&}}} FFF444+qYYYyyy ### &&&}}} """&&& 2777xxx ### &&&}}}  ### &&&}}} vvvR ### &&&}}} ;;;FFF -SSS::: ### &&&}}} !!! ### &&&}}} 2L%%% ###  &&&}}} ```::: 222 ###mmm {{{QQQ444 &&&}}} @Q>>> ###xxx |||SSS555 &&&}}} zzzLLL 999 ###xxxqqq |||SSS555 &&&}}} (((79 ###xxx |||SSS666 &&&}}} HHH***QQQ ###xxxNNN>>>))) AAASSS &&&}}} ||| ###xxx+++QQQ SSSTTT &&&}}} PPP000o[ ###xxx333eee SSS^^^ &&&}}} &&&yyy III ###xxx999hhhSSSggg &&&}}}  ###xxx>>>YYY SSSnnn &&&}}} @@@iG ###xxxpppKKK888###SSS%%%###!!! &&&}}} yyy ;;; ###xxx $$$SSS &&&}}} ppp ###xxxWWW $$$SSS &&&}}} &&&/򝝝 ###xxx ###SSS &&&}}}  NNNc*  ###xxx;;; !!!SSS &&&}}} ###vvvU""""""...111*** ###xxx;;;ZZZ SSS]]][[[[[[JJJ &&&}}} )))444666... yEEE,,,===DDD@@@444 ###xxx555 SSSaaa &&&}}} ...@@@HHHFFF:::777```333222HHHSSSSSSJJJ666 ###xxx... SSSXXX &&&}}} ...FFFUUUYYYRRRAAA^^^ yyyfff555NNN^^^ccc]]]LLL333 ###xxx''' SSSXXX &&&}}} '''EEEZZZffffffZZZDDD'''Ċ222PPPeeeooonnn```HHH))) ###xxx |||SSS444 &&&}}} ===YYYllltttooo^^^DDD888)֘...MMMfffwww{{{qqq[[[>>> ###xxxOOO sss SSS555 &&&}}} ///PPPjjj{{{~~~rrr\\\LLLGGG7۟cccFFFcccyyy~~~jjjOOO--- ###xxx kkkSSS555 &&&}}} AAA```xxxpppVVVOOO=ޣ:::[[[uuuwww]]]>>> ###xxx??? bbbSSS555 &&&}}} ---PPPlllhhhKKKTTTAܤTTTNNNjjj~~~gggJJJ''' ###333llllllllllllhhhPPP666111 &&&}}} :::ZZZtttuuu\\\lllUUU<֠>>>\\\ttt~~~mmmSSS222 ### &&&}}} CCC```uuuzzzgggNNNPPP5ǜmmmKKKdddtttwwwlllWWW::: ###QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ &&&}}} (((HHHaaaqqquuukkkVVV}}}III&HHHQQQdddlllgggWWW>>> ### &&&}}} ,,,III]]]hhhfffYYYTTT:::AAAQQQ\\\\\\QQQ=== ### &&&}}} ---EEEUUUZZZTTTGGG)))}ggg>>>JJJNNNHHH888 ### &&&}}} )))===HHHIIIAAA[MMM;;;<<<;;;... ### &&&}}} !!!1118889991---HHH)))""" ### &&&}}} """777  ### &&&}}} fff}}}\̨;;; CCC"""nnnjjjUUU&}}} 222TTT<<<333bbb333 !!!)))///222444333///***"""555[[[>>>((('''RKKK WWW""")))333<<>>]PPP(((777YYYTTT:::+++ ...>>>HHHg\\\QQQBBB 111JJJGGG444###>>>QQQ%%%666:::)))uuu>>>_QQQ&&&888===+++III???888 F>>>QQQ%%%777<<<***<<>>țOOO CCC===GGG!;---NNNCCC<<<nnnMMMCCC:::"""১KKKCCC888YYY:A***BBBCCC000PPP CCCvvvCCC ,,, ֏qqqCCC]]]111BBB4"朜dddCCCvvvRRRM1뢢000CCC!!!ZZZ^6BBB111CCC###VVVVVVd0玎$$$ ^^^222QQQ"""III['ttt666:::777--- ***333555000444INNNJJJRRRPPPFFF555444DDDLLLLLLEEE/'''bbbggghhh^^^MMM444555LLL\\\dddbbb]]]oooL lllzzz}}}tttaaaHHH*** ---IIIaaarrryyyuuu666p)))sssXXX:::===[[[tttjjj -JEEEpppJJJUUURRRTTTjjjir NNN&&&z===qqqcaaaAAA x2RRRuuu999D3|???dddxxxUUU///B7f  oA "+-#??????????(   #Puh?O s84  d. $$$;;;TTTmmm~~~uuu```GGG--- f d )))TTTiii;;; = ###PPPjjj333Y###YYYxxx666 bAAAccc###Wk[[[00043fff|||SSS<<<444;;;RRRyyy444  ``` {{{... I-III+++ '''www!!! j****** $$$NNN ) [[[ iii222'''U ''' gggAAAKKK/CCC  ###$$$###  ''' {{{ ?fffSSS !!!***222888;;;===<<<888333+++"""JJJ 777*** Jmmm'''333>>>GGGOOOTTTVVVTTTOOOHHH>>>444(((ggg@@@;;;N###uuuRRRYYYdddkkknnnllleeeZZZRRRrrrqqqMMME(((###CCCYYY9---ggg///::: RRRMMMSSS\\\~~~UUUaaa%***{{{ 777 zzzjjj oooNNN SSS```&&& 777 zzziii RRR ???[[[ @@@ 777 zzziii RRR tttMMM Y 777 zzziii RRR <<<===.K ||| 777 zzziii RRR &&&*** XXX 777 zzziii RRR """555 777 zzziii RRR ---}}} P`777 777 zzziii RRR NNNMMM~~~uuu 777 zzziii RRR )))AAA 777 zzziii RRR  :8@@@ 777 zzziii RRR OOOQQQrrr 777 zzziii RRR !!! `S(((::: 777 zzz777777777777777777666"""wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww%%% rrrrrrrrrrrrrrrrrrssssssrrrrrrrrriii RRR CCCvvv 777 zzzKKKkkkPPPFFFiii RRR 000kX666___ 777 zzzKKKPPPFFFiii RRR bbb 777 zzzKKKOOOPPPFFFiii RRR 555aC888 777 zzzKKKPPPFFFiii RRR bbb 777 {{{KKK999QQQHHHiii RRR ^^^... D***### 777 {{{KKKdddLLLXXX888333iii RRR ~~~~zzz 777 {{{KKK888444+++iii RRR  777 {{{KKK@@@;;;111iii RRR \\\l3RRR 777 {{{KKKGGGsss BBB666iii RRR uuuaaa 777 {{{KKKNNNpppGGG;;;iii RRR QQQ... FFF 777 {{{KKKTTTMMM@@@iii RRR 444lllh#WWW111 777 {{{KKKYYYRRRDDDiii RRR k### 777 {{{KKKiiifff}}}VVVfff......---,,,!!!iii RRR ((( 777 {{{KKKAAA XXX***iii RRR [[[ 9888 777 {{{KKK+++YYY+++iii RRR u%hhh 777 {{{KKK999XXX***iii RRR W*** 777 {{{KKKhhhVVV)))iii RRR  ***===  777 {{{KKKFFFRRR'''iii RRR !!!QQQ UUU &&&***)))### 777 {{{KKKTTT000QQQNNNiii RRR )))//////*** ;;;ttt >AAAuuu$$$000777999555+++ 777 {{{KKKOOO###HHH<<<iii RRR """000:::>>><<<555(((\\\baaa+++:::CCCFFFDDD===000 777 {{{KKKHHH|||%%%BBB777iii RRR """444AAAIIIKKKGGG===...{{{///@@@LLLRRRRRRLLLAAA000 777 {{{KKKAAAzzz <<<222iii RRR 555FFFQQQWWWVVVPPPCCC2229111DDDSSS[[[^^^[[[QQQBBB... 777 {{{KKK999555,,,iii RRR 222FFFUUU___ccc```VVVGGG333&&&H QQQ000FFFWWWccchhhggg___QQQ???((( 777 {{{KKK111 ///...uuu[[[[[[[[[[[[[[[iii RRR +++CCCVVVccckkklllfffZZZHHHBBB999_...FFFYYYhhhppprrrlll```NNN888 777 {{{KKK '''HHHiii RRR """<<>>SSSdddoootttqqqgggWWWHHH[[[G;;;KKK\\\hhhmmmkkkcccTTTAAA*** 777 {{{iii RRR (((@@@RRRaaaiiijjjeeeYYYHHHLLL6 ;;;MMMZZZbbbccc]]]RRRAAA,,, 777 {{{iii RRR )))???OOO[[[```___WWWJJJnnn===<<>>CCCHHHKKKLLLLLLIIIFFFAAA;;;333+++"""  iii,,,(((222;;;DDDOOOpppXXXHHH@@@777...######111mmm,,,***&&&111<<>>111 ;.SSS111"""}]uuuJJJ000======!!!000000iiiZZZ000///ppp% ???###...222 :EEEyyyEEE...www>>> NIII```--- V$BBBmmmFFF,,,fff777 [:::... nnn+++ vvv P))),,,000111...&&& *** (((++++++&&&\\\D ;;;BBBDDDAAA:::/// ))) )))444<<293扞lZ]n߀@&P{;! =ޢmKUY'o+$ ?Su֘ 5q56Rh5*:Eb@۽ϴv wi4?#"'"3ræE"|!DƈQm*Kd$hQ:}7O93. ^5b()**(QtxkML ѣ;nSL 4*@or@|sdGg{:5_QÆC 7$Tfi7f"Btj.^Ůzk0( S[0 7o)Sh/XvT)0b@A(Q#\=]u  5AVyyN՘;e__Z=oe0qtj  &'%_AResF|gmbemj%[{ws\d1dcN ʃFeP~[OT xMT%Z^e#AnCɞRI8:WT!rvُCށ!bGy~gDQ_AB`l%BЭGlڵ %P6*IN0*ց n}s]+nx;۾^v?̄jw_τǾ`zMүQe0Ĕ`fZ&ʪBq+ց0ݜjAr$W*l{tO1.s$̏}=2BWU7X[CN3LT?7Ǹ k+XT!cgAðWcζ>)] D|V To$}U5ӻL3Q%Âqɠn u`g LJpt[aw?+M}MU JhL5QÚ) cT{")$;XbPĩNwŭzҵS"bߏ͠OB r?f! lbhlq Xqx (^^fKn&哽uהp^C``1/p]`*1*T[ "W:M 3 eWZ枭]]INO懱v?s Rm<ߦ (H" ])ډ;dTyvWojt:XcsWJ±OABL2ws[0I,2*|W ]|^izV‡^U^f({:Ě'9vw{|)m'S7"Y7YNAc =@*5w{Dc%_pLmRDm]]-OhLI\fމƼ7-Q#g*(&B1-2B ^ ٮqҖ ]9A#7} ?\Qٍ&/Rh8ٻ 6%YL9LyDQ+WmuTYeGU.*ZwlYݘi),$F$9DVK.]N@(/~bq.ʺO8TB GmO"7h˻Caw;si0w:JȎ޺Y!mn핒zO$OrkXNZzף~+_zxo1f_TF~=1%`M#wQǸ#.|O// + 5 Ir;P |K{n;^ao[Ou,|[҇K^#\ʝ|І^jnNTsڟNt[K8<[/M@_FnWpkHp>{OZv[9E 7Wz8\yzc1kmj)qմ[M5LZ⨭zZqӾ>Q8ߎg lvN'ZgJn+>L~[\V/uJn2:1tS7n>v|ֿ~~/Ndn}eQ]Uf[>yit7Q 'L[.6N4~LV1<]lׂfd0qot)T~~gP\Nٮc+p"osu_S>ͭÌq1`nB FY7qtp 7tJqG=x`s:Rm krew8sjGv^KJ ̭-YjnMJ5`ڪ^^|j`1?&ׅ24g,&qU06gzmtYgKMݿ|ůVkLovvvBJEu#;DͲbABgjAZ?6|B_Jws{nZ^ibL}[(Ld ]KE 7ECůWJ 8W8f$ih&ZYwZ9ˁQmr,j _ eL\o%@KvU%ǝHa K~ZTw1}6s(9HV mptU t>2jX ܶ)YǼ?SW_jJJ#{  eMnrZj#_<sML-X_mH-p{9'F`^]ӟ+ v] ,ׂڭ5D %pxڮܳhЗt}#p|UYF:'e!ùxhlix૮xd!*|(7  { Y$ro5\s8&rs~ 3{EO"amp=`tl (?K ːD7]_w+` WI6fPZa]%br]¤&G5/W?:P\WZB@7,%X*F' (r6loPx=o Ly Je*e,,Fo{pNSK v%ގ4۱ZE|~~W#|@tY s?`ˀ+[ %$$ @jBg1G+zkxO(χJD 0,`{pEV9&JN3|-8B]pưl3=g_O$){mwo+[*;8Q4+ *gM8Ψw2 E㚘5a^m>3{﻾G~{>>w7r*{'0ْT!|;*crk5X28ɿ31ok*ֲ?GTTюTt+I~iXvբc5С^.DG7N1b٘63Q9AJ4mJP rv+f~\EϬ~f6:C8U*4l@>xF;`ѧ\=SA1?xc{S " 4[_3ܻzj/i&h 8:r -$ 5^oכ]ឩ ?zX"O4 qpOڢ_vYr&n[,,RD%?ʸ *P ;B>  @p/":imiFJC֊F Ɨ^ǯvgDO˶M 8J[82'mdSnV;ʏ ҿ*m0D^@3`WxfT^n^0/  \s# `9237 ;T\фx:-j7{GOֆFД;[D,m&?poy|z'/p. Rqjap:~to&j뵳h WpeU<}7M[<<džhu^FS6,Hx)-mS*[m%;0mԘZBW#IR1aVtuS?w$G8Iܕ|;J5)og=jɌEB 1`_%-|].Ct֊d'owni8]qk˘Q͂KPf{5<7+C xImpc`Vi! Ow}}1YV3G:wQv,9'2n3`縷FwAKZKHr/ч)Kvz;8Q%(`xوt@ B*0j܈x=U*8k=|˜Ѭ7/JKqo(z+ī *-Prd$@!naܸ(jaDm54LǙ PV6 pp@es67!zXb~*@ 9ÞaWM=jCybPP֌7Vv׀ƘqcƼk{!PބI5z#5%nn]Ec1϶_Px9Nש SM .յ_eU8hsNJZP[V2*-O3_KdMn\Հ8#h1Ҝ-W&,?/mFى_%p"ziQͭJR@ףӘvc~]3kaF#ƌy/A:+|r}h^T*t1?Ə ?Z> S:&1KGFz kjTMW>g3:U#HUWf xir v<.#FJ6̔#'}ԀـIU`9ޏgIwfeDدqNXM 5 ^lZj &= rʊtu jy/=\#T6_}׍jܟVv 7YWA*3@"Z~)`txebQEo?9X94V{<>zS'C @بN$ ԢT '(̏ >O5=ϕ7U.oD%Z Zsw> kwJ2gFPM}Ҷr h\Nj,ǩleinCaz^:O-9?m> ժ@;m_ cOEeZv;>X L@wDԀ*Uה ˛܏jI͡7]tӱѡj ݲ$G%hR)hEU4ӽ*@yt.8f?33D{t->ڪ}h9kߡ3Tڑi6bط[3˖j{5}X"V'hB4@mZvA%ѯ:jT\l?>B){S+]RlNQ18 𷻒LPi2333M03&ٲΝ7[I䵢5={{ι+Iw˄1k -Zd P^R}{DE_T @eEH:YVv(]7<4I t}G!;nǖnj@J0sTh-@aZH Hb 8j Gw]U:[ѽL泻hOd VXNj@6p;N~ޞc7/rJg^"rQu:VA%d@nUQ.eu -/1`-QIhY;U՞@]3V,Е@R䂀+$2Rg Ҵ6xZ _qgJ p*u\P* )tl= Q 2$(L,> H,RQN,V @ pH_4vUʻj̳̃yUU/ٸ6O8ݰ 8I\`kP3 J: 4er@X/J**[W~:I+#wZ.?ܮXX}iBy 2!b|u̎RڂO~bN(M#r%0bP-Uw+ E \&7.zrCzK}؈|F8ow:^6OLz5F_w'5yT(o-)4 s }@5jz}}["?u2 wD֒Xp4*p/֋|Gdf6l)o2q_u1ؑܖxtL҂W8ES0;"q3ĪTL~=ѽ*REr1FAfYL'zDoXДA|>wx(p5Aw>NpRe{Miuxi F߸;d@(ey]}و?FC};.@ql? >k&V"kd Gíh\ؓq rXa#\GL|TF @<,B0tkZRIjԜ<.kXg e d0DSEQj2 /@V.Y6}BT}|j'x!J;ڿ5jDА@L}]w.-U[ ̸_ܯ 冁xLÿ\3ت|zL.apƗ|x:[m]T ɨ@ V>}N"ܟpO5~)--'3I'޾21Kbg15+Z8X,' !m8𑚃,+t{Na9LU eN ȵ|Ƌc ~Ҏ?:A]Є]6NWy'֋e l:d6Q*>_*{d_9GZb@r1flpX+I r=}C,cW'yv'ؕ~lP `W~F0nQDQox#,eo:S"qo[+ kAnwW2p7Isk@ twe<ϙޡ% 1aTPWi[GV84skY@.uNTG?ٱcRA_uig~ 68ˏq@5`Gfi (Tr].Dj8ۄ+q( tJ+iyUI͉uM9T{T&?C 6{&[[k C6:$c đuS"g&p˝rc| WJBS-Cae;pd @Ë] :4Ee>8Wǻ< !:LbqQx{U; 1'65$M^^zݝT,}5TUUJ-#H̕k<SKj؈Q 5 Zr=jCN5=kh =,wPb /(!B|r\ 7 ԐK݃=vLD$[lVk(8^9َT,C}2QP)2Ǻ԰9 קOygiI4P(L.GZ"/qwoQ8[^pzQ8; g<~}js@{Ls?T:h2`w4+TT?V̠oOzU٩>j塟Rѷ_ ~5}j%<×\l+=C_T l#vuu,끰|+ځe*_);=cW G8<%{ʉAvﳦ@*#F[=J^ kzJT|Mn5-"[$&-1Q{A"o=e߿hP`pmI~P؀%^UT t$ABB;T.ȃtceSDf/OQ&pr$^cۚA?UEZa>b7}ǟ1q r;HQQdZxg|NE {&qA$6ɁW¶)/a^J, %HmӔOĀ+*@ ۮ<ؿ<\ȓ|*zEJ{&A9񳃯zk\)I].7Lg_͎b[:Xdv爫?Ё(g'z/ WAC2|v=3A胹Y^bK8_Wxhl,1edR+Fu3Gv;ˡf~sl5^i 1jW1>* (>?t u?3$}0`x#0|U w͔PkLGrb1Lˑa8Ǜ]L엶8ou?xtt P.4~+꓾H1Y\<ʰ6Kw|M~gW<-Uy`lB*ʏ}cST^ Xs@.saX Q#é0}c1T,4WoD Z[zzŋPQ{np\fDKKV}CKIjO0+Ęi'D1@}-w_[0Vfuw`X%C$ =WAnf<;=߯J/^2;-؜1W mnw-L ԒȐC$d1+@ image/svg+xml mumble-1.3.4/icons/flags/0000775000175000017500000000000014010707273015050 5ustar builderbuildermumble-1.3.4/icons/flags/je.svg0000664000175000017500000001036414010707273016173 0ustar builderbuildermumble-1.3.4/icons/flags/nc.svg0000664000175000017500000000277214010707273016201 0ustar builderbuildermumble-1.3.4/icons/flags/eg.svg0000664000175000017500000000507214010707273016170 0ustar builderbuildermumble-1.3.4/icons/flags/hu.svg0000664000175000017500000000060314010707273016204 0ustar builderbuildermumble-1.3.4/icons/flags/ua.svg0000664000175000017500000000037514010707273016203 0ustar builderbuildermumble-1.3.4/icons/flags/kh.svg0000664000175000017500000001026514010707273016177 0ustar builderbuildermumble-1.3.4/icons/flags/md.svg0000664000175000017500000000761214010707273016177 0ustar builderbuildermumble-1.3.4/icons/flags/bg.svg0000664000175000017500000000060314010707273016160 0ustar builderbuildermumble-1.3.4/icons/flags/iq.svg0000664000175000017500000000334614010707273016210 0ustar builderbuildermumble-1.3.4/icons/flags/dz.svg0000664000175000017500000000105714010707273016211 0ustar builderbuildermumble-1.3.4/icons/flags/ru.svg0000664000175000017500000000063114010707273016217 0ustar builderbuildermumble-1.3.4/icons/flags/fj.svg0000664000175000017500000000737514010707273016204 0ustar builderbuildermumble-1.3.4/icons/flags/bm.svg0000664000175000017500000000574714010707273016204 0ustar builderbuildermumble-1.3.4/icons/flags/bq.svg0000664000175000017500000000146214010707273016176 0ustar builderbuildermumble-1.3.4/icons/flags/gy.svg0000664000175000017500000000142514010707273016212 0ustar builderbuildermumble-1.3.4/icons/flags/si.svg0000664000175000017500000000300314010707273016200 0ustar builderbuildermumble-1.3.4/icons/flags/ky.svg0000664000175000017500000000710514010707273016217 0ustar builderbuildermumble-1.3.4/icons/flags/ye.svg0000664000175000017500000000060314010707273016205 0ustar builderbuildermumble-1.3.4/icons/flags/tm.svg0000664000175000017500000000356714010707273016224 0ustar builderbuildermumble-1.3.4/icons/flags/ws.svg0000664000175000017500000000120014010707273016213 0ustar builderbuildermumble-1.3.4/icons/flags/sd.svg0000664000175000017500000000102714010707273016177 0ustar builderbuildermumble-1.3.4/icons/flags/um.svg0000664000175000017500000000462214010707273016216 0ustar builderbuildermumble-1.3.4/icons/flags/mw.svg0000664000175000017500000000664214010707273016224 0ustar builderbuildermumble-1.3.4/icons/flags/fk.svg0000664000175000017500000000613614010707273016177 0ustar builderbuildermumble-1.3.4/icons/flags/bi.svg0000664000175000017500000000226714010707273016172 0ustar builderbuildermumble-1.3.4/icons/flags/sz.svg0000664000175000017500000000455214010707273016233 0ustar builderbuildermumble-1.3.4/icons/flags/gh.svg0000664000175000017500000000075214010707273016173 0ustar builderbuildermumble-1.3.4/icons/flags/gm.svg0000664000175000017500000000111414010707273016171 0ustar builderbuildermumble-1.3.4/icons/flags/tk.svg0000664000175000017500000000155514010707273016215 0ustar builderbuildermumble-1.3.4/icons/flags/lv.svg0000664000175000017500000000072114010707273016212 0ustar builderbuildermumble-1.3.4/icons/flags/br.svg0000664000175000017500000000215114010707273016173 0ustar builderbuildermumble-1.3.4/icons/flags/rs.svg0000664000175000017500000000662514010707273016226 0ustar builderbuildermumble-1.3.4/icons/flags/sm.svg0000664000175000017500000000750414010707273016216 0ustar builderbuildermumble-1.3.4/icons/flags/xk.svg0000664000175000017500000000210514010707273016211 0ustar builderbuildermumble-1.3.4/icons/flags/tn.svg0000664000175000017500000000060514010707273016213 0ustar builderbuildermumble-1.3.4/icons/flags/ug.svg0000664000175000017500000000242314010707273016205 0ustar builderbuildermumble-1.3.4/icons/flags/sb.svg0000664000175000017500000000164414010707273016202 0ustar builderbuildermumble-1.3.4/icons/flags/al.svg0000664000175000017500000000431614010707273016171 0ustar builderbuildermumble-1.3.4/icons/flags/vn.svg0000664000175000017500000000037414010707273016220 0ustar builderbuildermumble-1.3.4/icons/flags/lt.svg0000664000175000017500000000060314010707273016207 0ustar builderbuildermumble-1.3.4/icons/flags/mf.svg0000664000175000017500000000060514010707273016174 0ustar builderbuildermumble-1.3.4/icons/flags/README.txt0000664000175000017500000000043214010707273016545 0ustar builderbuilderThese flag icons were extracted from the Emoji One Git repository, found at https://github.com/Ranks/emojione at commit 0aad7f9f7969f0187e4f50d12fdc113541a34ac3 (tag 2.2.7) using the script found in the Mumble source tree found at scripts/extract-emojione-flags.py mumble-1.3.4/icons/flags/tt.svg0000664000175000017500000000124414010707273016221 0ustar builderbuildermumble-1.3.4/icons/flags/be.svg0000664000175000017500000000060414010707273016157 0ustar builderbuildermumble-1.3.4/icons/flags/dj.svg0000664000175000017500000000073014010707273016166 0ustar builderbuildermumble-1.3.4/icons/flags/pk.svg0000664000175000017500000000102314010707273016177 0ustar builderbuildermumble-1.3.4/icons/flags/pe.svg0000664000175000017500000000057414010707273016203 0ustar builderbuildermumble-1.3.4/icons/flags/ba.svg0000664000175000017500000000146114010707273016155 0ustar builderbuildermumble-1.3.4/icons/flags/ae.svg0000664000175000017500000000067314010707273016164 0ustar builderbuildermumble-1.3.4/icons/flags/mh.svg0000664000175000017500000000157314010707273016203 0ustar builderbuildermumble-1.3.4/icons/flags/hr.svg0000664000175000017500000000655114010707273016211 0ustar builderbuildermumble-1.3.4/icons/flags/la.svg0000664000175000017500000000066214010707273016171 0ustar builderbuildermumble-1.3.4/icons/flags/do.svg0000664000175000017500000001123214010707273016172 0ustar builderbuildermumble-1.3.4/icons/flags/gl.svg0000664000175000017500000000062314010707273016174 0ustar builderbuildermumble-1.3.4/icons/flags/ci.svg0000664000175000017500000000060514010707273016165 0ustar builderbuildermumble-1.3.4/icons/flags/cw.svg0000664000175000017500000000106114010707273016200 0ustar builderbuildermumble-1.3.4/icons/flags/sa.svg0000664000175000017500000001074014010707273016176 0ustar builderbuildermumble-1.3.4/icons/flags/ar.svg0000664000175000017500000001207514010707273016200 0ustar builderbuildermumble-1.3.4/icons/flags/ni.svg0000664000175000017500000000311514010707273016177 0ustar builderbuildermumble-1.3.4/icons/flags/ve.svg0000664000175000017500000000203414010707273016202 0ustar builderbuildermumble-1.3.4/icons/flags/mv.svg0000664000175000017500000000100214010707273016204 0ustar builderbuildermumble-1.3.4/icons/flags/ly.svg0000664000175000017500000000123314010707273016214 0ustar builderbuildermumble-1.3.4/icons/flags/nl.svg0000664000175000017500000000060014010707273016176 0ustar builderbuildermumble-1.3.4/icons/flags/ag.svg0000664000175000017500000000115414010707273016161 0ustar builderbuildermumble-1.3.4/icons/flags/zm.svg0000664000175000017500000000561014010707273016221 0ustar builderbuildermumble-1.3.4/icons/flags/mu.svg0000664000175000017500000000067314010707273016220 0ustar builderbuildermumble-1.3.4/icons/flags/gq.svg0000664000175000017500000000416214010707273016203 0ustar builderbuildermumble-1.3.4/icons/flags/in.svg0000664000175000017500000000521714010707273016204 0ustar builderbuildermumble-1.3.4/icons/flags/cm.svg0000664000175000017500000000074314010707273016174 0ustar builderbuildermumble-1.3.4/icons/flags/gf.svg0000664000175000017500000000065114010707273016167 0ustar builderbuildermumble-1.3.4/icons/flags/zw.svg0000664000175000017500000000444014010707273016233 0ustar builderbuildermumble-1.3.4/icons/flags/co.svg0000664000175000017500000000051314010707273016171 0ustar builderbuildermumble-1.3.4/icons/flags/gn.svg0000664000175000017500000000060514010707273016176 0ustar builderbuildermumble-1.3.4/icons/flags/yt.svg0000664000175000017500000001510514010707273016227 0ustar builderbuildermumble-1.3.4/icons/flags/me.svg0000664000175000017500000000723714010707273016203 0ustar builderbuildermumble-1.3.4/icons/flags/lb.svg0000664000175000017500000000225214010707273016167 0ustar builderbuildermumble-1.3.4/icons/flags/mq.svg0000664000175000017500000000673114010707273016215 0ustar builderbuildermumble-1.3.4/icons/flags/ke.svg0000664000175000017500000000313514010707273016172 0ustar builderbuildermumble-1.3.4/icons/flags/qa.svg0000664000175000017500000000103714010707273016173 0ustar builderbuildermumble-1.3.4/icons/flags/by.svg0000664000175000017500000001220314010707273016201 0ustar builderbuildermumble-1.3.4/icons/flags/gs.svg0000664000175000017500000001476014010707273016212 0ustar builderbuildermumble-1.3.4/icons/flags/bh.svg0000664000175000017500000000062214010707273016162 0ustar builderbuildermumble-1.3.4/icons/flags/tw.svg0000664000175000017500000000101514010707273016220 0ustar builderbuildermumble-1.3.4/icons/flags/gt.svg0000664000175000017500000000765214010707273016215 0ustar builderbuildermumble-1.3.4/icons/flags/ee.svg0000664000175000017500000000060414010707273016162 0ustar builderbuildermumble-1.3.4/icons/flags/hm.svg0000664000175000017500000000224214010707273016175 0ustar builderbuildermumble-1.3.4/icons/flags/se.svg0000664000175000017500000000102314010707273016174 0ustar builderbuildermumble-1.3.4/icons/flags/sy.svg0000664000175000017500000000111214010707273016217 0ustar builderbuildermumble-1.3.4/icons/flags/ro.svg0000664000175000017500000000060514010707273016212 0ustar builderbuildermumble-1.3.4/icons/flags/gi.svg0000664000175000017500000000264414010707273016176 0ustar builderbuildermumble-1.3.4/icons/flags/vg.svg0000664000175000017500000002004414010707273016205 0ustar builderbuildermumble-1.3.4/icons/flags/my.svg0000664000175000017500000000235614010707273016224 0ustar builderbuildermumble-1.3.4/icons/flags/rw.svg0000664000175000017500000000167714010707273016234 0ustar builderbuildermumble-1.3.4/icons/flags/vc.svg0000664000175000017500000000102514010707273016177 0ustar builderbuildermumble-1.3.4/icons/flags/eh.svg0000664000175000017500000000135114010707273016165 0ustar builderbuildermumble-1.3.4/icons/flags/ec.svg0000664000175000017500000000700414010707273016161 0ustar builderbuildermumble-1.3.4/icons/flags/uy.svg0000664000175000017500000000546414010707273016237 0ustar builderbuildermumble-1.3.4/icons/flags/cz.svg0000664000175000017500000000057214010707273016211 0ustar builderbuildermumble-1.3.4/icons/flags/sv.svg0000664000175000017500000000713014010707273016222 0ustar builderbuildermumble-1.3.4/icons/flags/tg.svg0000664000175000017500000000120414010707273016200 0ustar builderbuildermumble-1.3.4/icons/flags/pg.svg0000664000175000017500000000375214010707273016206 0ustar builderbuildermumble-1.3.4/icons/flags/sl.svg0000664000175000017500000000060314010707273016206 0ustar builderbuildermumble-1.3.4/icons/flags/ic.svg0000664000175000017500000001207714010707273016173 0ustar builderbuildermumble-1.3.4/icons/flags/gr.svg0000664000175000017500000000174314010707273016206 0ustar builderbuildermumble-1.3.4/icons/flags/st.svg0000664000175000017500000000127314010707273016222 0ustar builderbuildermumble-1.3.4/icons/flags/kp.svg0000664000175000017500000000122314010707273016201 0ustar builderbuildermumble-1.3.4/icons/flags/wf.svg0000664000175000017500000000060514010707273016206 0ustar builderbuildermumble-1.3.4/icons/flags/tj.svg0000664000175000017500000000351114010707273016206 0ustar builderbuildermumble-1.3.4/icons/flags/gd.svg0000664000175000017500000000300314010707273016157 0ustar builderbuildermumble-1.3.4/icons/flags/cg.svg0000664000175000017500000000071514010707273016165 0ustar builderbuildermumble-1.3.4/icons/flags/ss.svg0000664000175000017500000000143114010707273016215 0ustar builderbuildermumble-1.3.4/icons/flags/bz.svg0000664000175000017500000001235114010707273016206 0ustar builderbuildermumble-1.3.4/icons/flags/ma.svg0000664000175000017500000000066614010707273016176 0ustar builderbuildermumble-1.3.4/icons/flags/sn.svg0000664000175000017500000000075714010707273016222 0ustar builderbuildermumble-1.3.4/icons/flags/pa.svg0000664000175000017500000000102714010707273016171 0ustar builderbuildermumble-1.3.4/icons/flags/af.svg0000664000175000017500000001036214010707273016161 0ustar builderbuildermumble-1.3.4/icons/flags/tf.svg0000664000175000017500000000225414010707273016205 0ustar builderbuildermumble-1.3.4/icons/flags/ki.svg0000664000175000017500000000476514010707273016210 0ustar builderbuildermumble-1.3.4/icons/flags/so.svg0000664000175000017500000000037514010707273016217 0ustar builderbuildermumble-1.3.4/icons/flags/ax.svg0000664000175000017500000000144214010707273016202 0ustar builderbuildermumble-1.3.4/icons/flags/sx.svg0000664000175000017500000000507214010707273016227 0ustar builderbuildermumble-1.3.4/icons/flags/bn.svg0000664000175000017500000000233714010707273016175 0ustar builderbuildermumble-1.3.4/icons/flags/lc.svg0000664000175000017500000000042414010707273016167 0ustar builderbuildermumble-1.3.4/icons/flags/au.svg0000664000175000017500000000165214010707273016202 0ustar builderbuildermumble-1.3.4/icons/flags/km.svg0000664000175000017500000000170614010707273016204 0ustar builderbuildermumble-1.3.4/icons/flags/gp.svg0000664000175000017500000001237314010707273016205 0ustar builderbuildermumble-1.3.4/icons/flags/jp.svg0000664000175000017500000000030214010707273016175 0ustar builderbuildermumble-1.3.4/icons/flags/gw.svg0000664000175000017500000000070114010707273016204 0ustar builderbuildermumble-1.3.4/icons/flags/bv.svg0000664000175000017500000000143214010707273016200 0ustar builderbuildermumble-1.3.4/icons/flags/kw.svg0000664000175000017500000000104014010707273016205 0ustar builderbuildermumble-1.3.4/icons/flags/bd.svg0000664000175000017500000000036314010707273016160 0ustar builderbuildermumble-1.3.4/icons/flags/mn.svg0000664000175000017500000000277114010707273016212 0ustar builderbuildermumble-1.3.4/icons/flags/bt.svg0000664000175000017500000000771114010707273016204 0ustar builderbuildermumble-1.3.4/icons/flags/fi.svg0000664000175000017500000000101514010707273016164 0ustar builderbuildermumble-1.3.4/icons/flags/cf.svg0000664000175000017500000000123714010707273016164 0ustar builderbuildermumble-1.3.4/icons/flags/sh.svg0000664000175000017500000000436514010707273016213 0ustar builderbuildermumble-1.3.4/icons/flags/ie.svg0000664000175000017500000000061514010707273016170 0ustar builderbuildermumble-1.3.4/icons/flags/ne.svg0000664000175000017500000000066114010707273016176 0ustar builderbuildermumble-1.3.4/icons/flags/ai.svg0000664000175000017500000000215614010707273016166 0ustar builderbuildermumble-1.3.4/icons/flags/ga.svg0000664000175000017500000000061714010707273016164 0ustar builderbuildermumble-1.3.4/icons/flags/as.svg0000664000175000017500000001047514010707273016203 0ustar builderbuildermumble-1.3.4/icons/flags/mx.svg0000664000175000017500000000742014010707273016220 0ustar builderbuildermumble-1.3.4/icons/flags/ao.svg0000664000175000017500000000250214010707273016167 0ustar builderbuildermumble-1.3.4/icons/flags/vi.svg0000664000175000017500000001220114010707273016203 0ustar builderbuildermumble-1.3.4/icons/flags/bj.svg0000664000175000017500000000054114010707273016164 0ustar builderbuildermumble-1.3.4/icons/flags/vu.svg0000664000175000017500000000240214010707273016221 0ustar builderbuildermumble-1.3.4/icons/flags/ta.svg0000664000175000017500000001470614010707273016205 0ustar builderbuildermumble-1.3.4/icons/flags/am.svg0000664000175000017500000000060314010707273016165 0ustar builderbuildermumble-1.3.4/icons/flags/ch.svg0000664000175000017500000000033014010707273016157 0ustar builderbuildermumble-1.3.4/icons/flags/io.svg0000664000175000017500000001177014010707273016206 0ustar builderbuildermumble-1.3.4/icons/flags/kg.svg0000664000175000017500000000713014010707273016173 0ustar builderbuildermumble-1.3.4/icons/flags/hk.svg0000664000175000017500000000254214010707273016176 0ustar builderbuildermumble-1.3.4/icons/flags/ht.svg0000664000175000017500000000655214010707273016214 0ustar builderbuildermumble-1.3.4/icons/flags/mr.svg0000664000175000017500000000060714010707273016212 0ustar builderbuildermumble-1.3.4/icons/flags/mm.svg0000664000175000017500000000075514010707273016211 0ustar builderbuildermumble-1.3.4/icons/flags/fm.svg0000664000175000017500000000073314010707273016176 0ustar builderbuildermumble-1.3.4/icons/flags/de.svg0000664000175000017500000000061314010707273016161 0ustar builderbuildermumble-1.3.4/icons/flags/pr.svg0000664000175000017500000000123014010707273016206 0ustar builderbuildermumble-1.3.4/icons/flags/gu.svg0000664000175000017500000000202414010707273016202 0ustar builderbuildermumble-1.3.4/icons/flags/ms.svg0000664000175000017500000000357614010707273016223 0ustar builderbuildermumble-1.3.4/icons/flags/bs.svg0000664000175000017500000000101714010707273016174 0ustar builderbuildermumble-1.3.4/icons/flags/td.svg0000664000175000017500000000060514010707273016201 0ustar builderbuildermumble-1.3.4/icons/flags/cy.svg0000664000175000017500000000667714010707273016224 0ustar builderbuildermumble-1.3.4/icons/flags/fo.svg0000664000175000017500000000143514010707273016200 0ustar builderbuildermumble-1.3.4/icons/flags/mg.svg0000664000175000017500000000053214010707273016174 0ustar builderbuildermumble-1.3.4/icons/flags/mo.svg0000664000175000017500000000220514010707273016203 0ustar builderbuildermumble-1.3.4/icons/flags/lk.svg0000664000175000017500000000447614010707273016212 0ustar builderbuildermumble-1.3.4/icons/flags/ps.svg0000664000175000017500000000102714010707273016213 0ustar builderbuildermumble-1.3.4/icons/flags/sk.svg0000664000175000017500000000157714010707273016220 0ustar builderbuildermumble-1.3.4/icons/flags/es.svg0000664000175000017500000001136314010707273016204 0ustar builderbuildermumble-1.3.4/icons/flags/tz.svg0000664000175000017500000000124714010707273016232 0ustar builderbuildermumble-1.3.4/icons/flags/cx.svg0000664000175000017500000000372114010707273016206 0ustar builderbuildermumble-1.3.4/icons/flags/aq.svg0000664000175000017500000000131214010707273016167 0ustar builderbuildermumble-1.3.4/icons/flags/mt.svg0000664000175000017500000000616014010707273016214 0ustar builderbuildermumble-1.3.4/icons/flags/gg.svg0000664000175000017500000000113214010707273016163 0ustar builderbuildermumble-1.3.4/icons/flags/ge.svg0000664000175000017500000000140514010707273016164 0ustar builderbuildermumble-1.3.4/icons/flags/cd.svg0000664000175000017500000000137714010707273016167 0ustar builderbuildermumble-1.3.4/icons/flags/ad.svg0000664000175000017500000001002414010707273016152 0ustar builderbuildermumble-1.3.4/icons/flags/za.svg0000664000175000017500000000171714010707273016211 0ustar builderbuildermumble-1.3.4/icons/flags/ac.svg0000664000175000017500000001352214010707273016157 0ustar builderbuildermumble-1.3.4/icons/flags/kn.svg0000664000175000017500000000150214010707273016177 0ustar builderbuildermumble-1.3.4/icons/flags/bw.svg0000664000175000017500000000077514010707273016212 0ustar builderbuildermumble-1.3.4/icons/flags/kz.svg0000664000175000017500000000767014010707273016227 0ustar builderbuildermumble-1.3.4/icons/flags/us.svg0000664000175000017500000000462514010707273016227 0ustar builderbuildermumble-1.3.4/icons/flags/py.svg0000664000175000017500000000643114010707273016225 0ustar builderbuildermumble-1.3.4/icons/flags/it.svg0000664000175000017500000000061514010707273016207 0ustar builderbuildermumble-1.3.4/icons/flags/ir.svg0000664000175000017500000001011614010707273016202 0ustar builderbuildermumble-1.3.4/icons/flags/hn.svg0000664000175000017500000000146614010707273016205 0ustar builderbuildermumble-1.3.4/icons/flags/et.svg0000664000175000017500000000171414010707273016204 0ustar builderbuildermumble-1.3.4/icons/flags/LICENSE.md0000664000175000017500000000104314010707273016452 0ustar builderbuilder#### Emoji One Artwork * Applies to all PNG and SVG files as well as any adaptations made. * License: Creative Commons Attribution-ShareAlike 4.0 International * Human Readable License: http://creativecommons.org/licenses/by-sa/4.0/ * Complete Legal Terms: http://creativecommons.org/licenses/by-sa/4.0/legalcode #### Emoji One Non-Artwork * Applies to the Javascript, JSON, PHP, CSS, HTML files, and everything else not covered under the artwork license above. * License: MIT * Complete Legal Terms: http://opensource.org/licenses/MIT mumble-1.3.4/icons/flags/eu.svg0000664000175000017500000000222514010707273016203 0ustar builderbuildermumble-1.3.4/icons/flags/mc.svg0000664000175000017500000000037514010707273016175 0ustar builderbuildermumble-1.3.4/icons/flags/ca.svg0000664000175000017500000000143114010707273016153 0ustar builderbuildermumble-1.3.4/icons/flags/jo.svg0000664000175000017500000000106614010707273016204 0ustar builderbuildermumble-1.3.4/icons/flags/at.svg0000664000175000017500000000057014010707273016177 0ustar builderbuildermumble-1.3.4/icons/flags/om.svg0000664000175000017500000000202314010707273016201 0ustar builderbuildermumble-1.3.4/icons/flags/dk.svg0000664000175000017500000000101214010707273016161 0ustar builderbuildermumble-1.3.4/icons/flags/lu.svg0000664000175000017500000000060414010707273016211 0ustar builderbuildermumble-1.3.4/icons/flags/dg.svg0000664000175000017500000001177014010707273016171 0ustar builderbuildermumble-1.3.4/icons/flags/pn.svg0000664000175000017500000001174714010707273016220 0ustar builderbuildermumble-1.3.4/icons/flags/mk.svg0000664000175000017500000000206314010707273016201 0ustar builderbuildermumble-1.3.4/icons/flags/tr.svg0000664000175000017500000000070214010707273016215 0ustar builderbuildermumble-1.3.4/icons/flags/ls.svg0000664000175000017500000000130114010707273016202 0ustar builderbuildermumble-1.3.4/icons/flags/nu.svg0000664000175000017500000000435414010707273016221 0ustar builderbuildermumble-1.3.4/icons/flags/mz.svg0000664000175000017500000000371314010707273016223 0ustar builderbuildermumble-1.3.4/icons/flags/ea.svg0000664000175000017500000001133714010707273016163 0ustar builderbuildermumble-1.3.4/icons/flags/bo.svg0000664000175000017500000001207314010707273016174 0ustar builderbuildermumble-1.3.4/icons/flags/ph.svg0000664000175000017500000000251414010707273016202 0ustar builderbuildermumble-1.3.4/icons/flags/im.svg0000664000175000017500000000274514010707273016206 0ustar builderbuildermumble-1.3.4/icons/flags/ck.svg0000664000175000017500000000344414010707273016173 0ustar builderbuildermumble-1.3.4/icons/flags/lr.svg0000664000175000017500000000166314010707273016214 0ustar builderbuildermumble-1.3.4/icons/flags/to.svg0000664000175000017500000000050214010707273016210 0ustar builderbuildermumble-1.3.4/icons/flags/bb.svg0000664000175000017500000000127314010707273016157 0ustar builderbuildermumble-1.3.4/icons/flags/il.svg0000664000175000017500000000143714010707273016202 0ustar builderbuildermumble-1.3.4/icons/flags/pl.svg0000664000175000017500000000037614010707273016212 0ustar builderbuildermumble-1.3.4/icons/flags/cv.svg0000664000175000017500000000241114010707273016177 0ustar builderbuildermumble-1.3.4/icons/flags/li.svg0000664000175000017500000000566414010707273016210 0ustar builderbuildermumble-1.3.4/icons/flags/np.svg0000664000175000017500000000147214010707273016212 0ustar builderbuildermumble-1.3.4/icons/flags/ng.svg0000664000175000017500000000057514010707273016204 0ustar builderbuildermumble-1.3.4/icons/flags/gb.svg0000664000175000017500000000365014010707273016165 0ustar builderbuildermumble-1.3.4/icons/flags/tl.svg0000664000175000017500000000100714010707273016206 0ustar builderbuildermumble-1.3.4/icons/flags/id.svg0000664000175000017500000000040514010707273016164 0ustar builderbuildermumble-1.3.4/icons/flags/aw.svg0000664000175000017500000000121714010707273016201 0ustar builderbuildermumble-1.3.4/icons/flags/ml.svg0000664000175000017500000000060514010707273016202 0ustar builderbuildermumble-1.3.4/icons/flags/dm.svg0000664000175000017500000000426114010707273016174 0ustar builderbuildermumble-1.3.4/icons/flags/az.svg0000664000175000017500000000132214010707273016201 0ustar builderbuildermumble-1.3.4/icons/flags/bf.svg0000664000175000017500000000054414010707273016163 0ustar builderbuildermumble-1.3.4/icons/flags/sj.svg0000664000175000017500000000143214010707273016205 0ustar builderbuildermumble-1.3.4/icons/flags/cl.svg0000664000175000017500000000060514010707273016170 0ustar builderbuildermumble-1.3.4/icons/flags/mp.svg0000664000175000017500000001353614010707273016215 0ustar builderbuildermumble-1.3.4/icons/flags/nf.svg0000664000175000017500000001206214010707273016175 0ustar builderbuildermumble-1.3.4/icons/flags/bl.svg0000664000175000017500000001705014010707273016171 0ustar builderbuildermumble-1.3.4/icons/flags/uz.svg0000664000175000017500000000321214010707273016225 0ustar builderbuildermumble-1.3.4/icons/flags/cc.svg0000664000175000017500000000463314010707273016164 0ustar builderbuildermumble-1.3.4/icons/flags/kr.svg0000664000175000017500000000312014010707273016201 0ustar builderbuildermumble-1.3.4/icons/flags/no.svg0000664000175000017500000000143714010707273016212 0ustar builderbuildermumble-1.3.4/icons/flags/sr.svg0000664000175000017500000000120314010707273016211 0ustar builderbuildermumble-1.3.4/icons/flags/jm.svg0000664000175000017500000000110514010707273016174 0ustar builderbuildermumble-1.3.4/icons/flags/re.svg0000664000175000017500000000124714010707273016203 0ustar builderbuildermumble-1.3.4/icons/flags/nr.svg0000664000175000017500000000116614010707273016214 0ustar builderbuildermumble-1.3.4/icons/flags/fr.svg0000664000175000017500000000061514010707273016202 0ustar builderbuildermumble-1.3.4/icons/flags/tc.svg0000664000175000017500000000645614010707273016212 0ustar builderbuildermumble-1.3.4/icons/flags/is.svg0000664000175000017500000000143714010707273016211 0ustar builderbuildermumble-1.3.4/icons/flags/th.svg0000664000175000017500000000101614010707273016202 0ustar builderbuildermumble-1.3.4/icons/flags/cn.svg0000664000175000017500000000107714010707273016176 0ustar builderbuildermumble-1.3.4/icons/flags/cu.svg0000664000175000017500000000123114010707273016175 0ustar builderbuildermumble-1.3.4/icons/flags/pf.svg0000664000175000017500000000654614010707273016211 0ustar builderbuildermumble-1.3.4/icons/flags/va.svg0000664000175000017500000000707614010707273016211 0ustar builderbuildermumble-1.3.4/icons/flags/sc.svg0000664000175000017500000000116614010707273016202 0ustar builderbuildermumble-1.3.4/icons/flags/na.svg0000664000175000017500000000204414010707273016167 0ustar builderbuildermumble-1.3.4/icons/flags/pt.svg0000664000175000017500000001376314010707273016226 0ustar builderbuildermumble-1.3.4/icons/flags/nz.svg0000664000175000017500000000245714010707273016230 0ustar builderbuildermumble-1.3.4/icons/flags/cp.svg0000664000175000017500000000060514010707273016174 0ustar builderbuildermumble-1.3.4/icons/flags/er.svg0000664000175000017500000000475014010707273016205 0ustar builderbuildermumble-1.3.4/icons/flags/pm.svg0000664000175000017500000002023214010707273016204 0ustar builderbuildermumble-1.3.4/icons/flags/sg.svg0000664000175000017500000000150014010707273016176 0ustar builderbuildermumble-1.3.4/icons/flags/pw.svg0000664000175000017500000000030214010707273016212 0ustar builderbuildermumble-1.3.4/icons/flags/tv.svg0000664000175000017500000000234114010707273016222 0ustar builderbuildermumble-1.3.4/icons/flags/cr.svg0000664000175000017500000000103214010707273016171 0ustar builderbuildermumble-1.3.4/icons/mumble.osx.installer.png0000664000175000017500000015512714010707273020562 0ustar builderbuilderPNG  IHDR \IDATxzFs%)37_LMo{lgV 7vI8=KN-ا|'>w8gj.mkxξglqvo1 MOk3.cϞyNj^L*%ǞZPwVRCSomUЛt⎻n*aBcK\lyqV́֔YM[v 1eɪEv\ah!O;.;璡L[;L0uRB_1 H(nx>Z鱕O󇦅BT 67I3lOI;6i'+UJV6adžuRmhhdh hL= a޲ SJj#cPIalӛLoZyO}}C/t iؖ-;s:mJU*e˞kfz#v<06ch6t])dv đ0QZ5VՑ4Ɔ!Pq/f5Bxh$?K-!)u]֎Sfe]3 $4f匾RGWG_sX" d@îzvնmrɃֺGM: NdQklV( +>'˲+Nn$bV(74.;>NXnjY}aǺ-κf::򺞪@dY^yT۱m׮kr:B,$ aɢ ]S: Юa@(xWF"ˀJ?%RϔzЃjâ{t̙5kdu*gFc֫y]3(` \׍m۲ssqɃ1BqUā0qB@O%lkBH mOȴo#Z `,Ino轝7QZr{0whh Ywպlݖtu u-z' '#a/0mN5*g&J`#V$pt,IܼwG s70e9&潛7b`μ)3,wYguLQ؟ cIB!$[6^WɶydTӦ`zslX3{=B.^ݬ9 L뢵8y$9IC}t[0+<;Ou׼He#}YR]e.2BqkJ%KPL)1'd5F *]Sݫ@x,f]̛y)fgU&y#ІaΜ>l4B P~JಌJo5feYj_E{|ώ뒃 PU3z{EuWJ%+*e,ywuYs:fiV$ﬞD?͔:VςE70liu ~WQ8FkoUI3$ ѱZ $F! w> LI\FiVWgeDYu,6ocʽt1@L?G`%V00i݆1J׼^2+w [!(6X%!FB2;0*'e׍e]Iӷ`m{A$xS`ͣP'=ͽYy99$0yknؒ% I}_qFppY_X%U !I$tpV1 w@J{tpÆ)NʯMK!dOܼz))ss 3=-50d>TWpppwe GBp 59; !*]`ӦZR۵^`Fﵽ̯y7V%a?^_B6)^b T:Y5˖Z9\1ەҶc5-} #گ!*a9/wUEg]G C+BQ )Lu{ Pi;Bv)yV,MV -UZ2o@mÚZ ^Q8KҬ`!$tņ1䲡h YW ]eYR }3BֲpPYk<ن_dodB _Wid $s^1];jq!p I7Nc Lt{׌ JRz~ ,_ {=o͵CWiOsJZtbjxյbZ pݧ*A5H~AǜZ@(e Z5C  w\Y^!P )HrrҢ?b1{Bi!aUpQ d Ó4{ai ' uIcǷC^ZKrj4ijW]KIp)E !c ]ը22F~$T PY^{4d?Iv{nF%OV8o y<ɯH[{]T(!g22I8;1PN%zNZcu׭6p[7|54H R @{+ ıG d?!@Vy/'>3lZȎF,;|3$y.5.OV  %ۮn !O{#I8Z5jP )бvtdGB {òYFFBA-+OL(:vLyu;hrx[ong2Z7 E;Jrܐܺ@ ڙe1, I8ZY> RHίؖHۜҔʔݭ:a1IK*:mռm@*9BBH, Z!"׆!d V|5QKJ>~eS8toQ$ /Y)VSxukdTx`Q#9x~7sHh56$ф 2ꀋ~,\mK d=Hy漤q{!i@ z OpZYbNjXrV5{ m@iͫijA.@a(%$u/ ,;v@o, @  Y/ JdnZ(Oަnơ4IV@I1I9Y;nwI{UkZɆ'g5 (@G[af),dB_7Zᰆ64=I~COT+ZV&i8g]\ڳb(ZCH׿A95tF2]1{mK2.;ޒՈ#l2B'A/~D(UJC?и${]oR$ `q,;V{g#.XiL+ M!1D9!! YgۃlyecHl?VoA @ 1X_뚾FR2W@-Ց,߬֊IIV{<Ɋ+ljY{?kdPY9Ȳmc c;g2{7!''ȴ6UB7|40*]Ҳ/l9=iMp<%:ZSd\bW\ l.Q_(#kg*W\4dZaC{m96#lDǗ,財އ iYՓ Yx?nT9^N*'i8 d^OvM/6hpݷ#Adj@!Eh4klKfCt ;2d&َZA_Wt$TJ8=_7L;: g%AȺNLpY@̹Ǔ=QmdYpx F{kk ڶ{:QmdpuCZ; B 5Go&UJNJz:k2Z-o,$!k<ƶiea[*RP[JN(w*0pEEӈIҪqS=ےB]+##+lzaY}>[OJ!gE[y5#@+c삇hC-4kȀo!J% W|kucs}pV3 VuI]p=^׬ۑ8'%%3u%Y!oy Y]W#lxкKBVv5@a,d=V[Ʀ,ǾyvYZOV$3FR*,WtB8X0Xtl z~5 ~ga  S6\0H ݐ~*S' @/aa_c@+!kkt0O@(ld$d]+mW+CɒpX!yBeYAr!;S,W_Jؒ}ӜU*tqB,*zx71y^5#dnQH}Ioy#!Xi9C C582@dY ;-]}Zo]Eľq=XG)k^kEg;iEOHNz44|\+ SHKP#>-JwWRq P\0 wyio^?U:dԡFvS"0u ,KEhRHE֥CžnrLTybG2Z?~Ш\Rҽh d?zڶ2 EdmJTfI+h\0tF nj8g_RQ%or(U?ߩt]N8|q i^4.j g߸=ףrVS*Jeͮk8Y{B)swHD[&$) s B{ې,XƨL$Bq/ι{BZ}^j<yξi/X9M{u:C NW`lN m:KDGEE5QHm~tނt_~SQ0lF^ /Emyi]Rھ`HB .p̂ב $K2jt8LMg*|ZFczϓ&زv/^L< |*{m۷0v<d?miuKW韰gq@߮,K Ptby8QyhS/^m=Z8~J`h5.eX3 MܪN8IQ ĺTaUYKlx {$sE+NNr ]:N VKEtT[dcq+-KH U>l,4FBވt_k$TB u#uK'5Ԟ%*s?ڀLm۾7#̾m:5sW 7mK ٕ}.P :E9Y"ݲ]Ϲ L ?;qS>77Ra> ty/.| v),rBaxRK7K)P,n@:V(Zp]7c }V J#]N*py[{|W0Qxgذ,fORu-ArEY-fd.):ip7k:R)Ⱦ/[:R%m^T cc7I09ST*K ĖK>Wcy֞21~kj)@`d xM]ZL{o,&%~qRڷ[&ݒty;S"@7QK fG%7yZH[.v?OZ܏z:R~h?@6\/׹a@b. T"Nڳocˢpp#$X*dNQnk?۩XI߮4F}7;^H#\*q^4<c[~ƞrŁ9R|NR4u*@ <1\5`}wBJ/mfLR`':)m)VBE\q:cu_7Po?gL*\w5a@q] KEׯ ]cpX b+A2uVR*۰-JjVHX7 Pde$E2p' w,A"|_,NC-쀗k4L3Ϻ:tRQnaׁ4R3MR'Uu>Z:嚹tR !7Ѩ1? v5j9-^4ΫWx}S`?teW41tsff@?tu:iX =;׎Zb 6gY(Z뀴4uRtnIaQipJ+\t*v4֥M[^ϚZHԘjYPYcc?~fE18LԞ}vٵcR~0V;:'[[ZXhݦ}ݢ Á :Z<9e-XEHJG΁jR#8yߴPDHk^ś@# TF Z1cm8gӰg_JR]|W S3sff:횩[R' ZR**x*j.ZÝiq!md٠f}oR4N/s:AjKa 礻.1W;gbyMD8[561yPh,uήT%E,tfN@g3tsUqN%pWHƶoq5ң?uN'8gm!hF.lO❾́ pTo+M]GeYa.ZiӪ'*~3:) Bj9x:! 3XJEktboXM]wV# *x'BUq)R8J _[P+*4m(NW9XѾv݁O$gD ! ⪩JMV c6Oι ZJ~1Z3SVkԼoC,tܒ@ ss]3UھP X!a*t~ $')*o ʖzU3s:jK+5klZo!Nkaޯ́?w`܊2:* Z]1RHV 4y^ҳ۩U&ު[ЉR*v 'Ka A_· P 4gUY177kΩظRZ MMXcdjXZHEJlxR@'>uneǿ_7y+nW[f<]sK:E"қ<+*Lt#>Bi&֬kCf:>GC~Ԯ=K$炥uϭ bisS @qrGmlߌZV*|!JjE (ѡ t7aH!U&HPtCO. V7_*6<`R}7ِhuuoF|>B]K༃{p-jnP gԩH7d?!p^?X@S0\c URH r0j,+CM]51Ѩ@*\5ZS֦]SA+4:!<$U>ǤM%}]aݺ{lּs`)Kӿ4Nqٖ;Fw~J PB B J'Vq%RH0453s`^vs`fo&6[Q{>ΖP3r,L:^gU%ʦ܋-5@t?f boA8IB ;uk;%*F[OQE:6S`IEat**FY~ܫfQt4HB&#RjJB`:^4c5OJ?Z-2!S{oH%ꦅmTs A R8MBA*R+,%ǪoRVzs u )ӡ;oFqW[*mߋMRSP#'ha 6>:Tڪm oō55ݎ YyP`h)κI)P}<&"Zsh]B0߃hiWbS Â*6|5@ V8^?zH 1na͐س+aP/t(@T:#,AׯDiTA@y4ݼfd#qh銾 Ӎc9i غ GP0s<7{t̓~j' u-2=BqݐqС7P8T^C T11GJZ8B Z!Nހ$MKۼBen3&'zWրUkkzOضHtZx!HcmQ}DR: D@B$*!Z3+*̩LlYU$(B-^ HMNJMUZH Z%q/V [}O5?in)oD8^)Y7GpwRA{RcwߵN'Қ@vƄMRQHt8 U N7VZzVB~QjrKj !EЦR=kjRQ|ǜV$ ʶT{Ⱦ#D'up[qha(ʪJjMm L.X:j#J*a<ܴM#Q\wT~Kxu!A9תL ܋ƚmS-(K؂L U TRXks\?|6qS;L Ú@Ha[g8j#X#E#Q(R%@8|C *-/DHޯ^*EE5# l܋1Ot?^=L2&:Ú gvϰnPH~ Tc2|Ө]qvbl*%BW P<-U u>2F'4TҦot7^430 uJt|T9^@-f6?T3MAr ס<ĂJ[(v,ECm䒇DE%pdvp~3|>:GjߎS 'f tV} (?ۊ*5r/ۉT)`U$Ujٷ0]wS[J28/ bylKBebj`,ECeMݰTZml,PVAA8EJ *5'@s ?UKlj6Eêy x7v{Y"Ͱi KK7]KCǗD698b` 4&qn_# kFpL8`0R,@0U@Q Ʒ 'h9p/6 蓬~ 2R+*|TgՎ.jkww-_.)RCHña4KFL4P;F"lxTFjFU"N (GpXT}pWy\pKa'|vRJH+~Ŋ&.vlBp7-ˑGbHr>C !46ka 8VXwޓ*r]j##VCs K/]4@=G|L! j|W'֖TV+\Q}BgddժZRK n %>+0^86sj5 !06q.Rcz)GCb XIos\?)?*!@`n/(kC9i: H#Vþ{cjVl&Ǝb˃vO7V(*Ê4 DYZ($^HFC0-S|ª h`ՖWyכjN ڪ9LY^ݢX(ذtʠ?OMx́4>Ά *wުZ:؆'ma6өZbd5*!1UI`ᅵsbx,sE'm G*SĊ 눗n4M =a|S}A E'UaT!LP}/%'R?`)5R ){X 9;)Nuἇ14_o.蒂1>>Xza- ( uSRҦ>U k*~ҾaW NRT{*Ds--zuZ}rВ\5Ȗsi=6} ;i]^u`jbŪNg,!1 Ƃ2xUU mW6D-$\ڶMad]̵)NzOaՁSK`~\4tR?Egxn@ xG4..aͺukW 1<+'XSڎS TH:B{:7TSnaU X'ۖ*|NB0ĸp`4APsr̖"đWnH\!rcHNruStݎq csH%X`8+bB3wNpn`1S9ϰ۸_Ѱb xГCӁ9׳B \Vŵ4uDT~"T1E?*jjަ ZiSYmXWՃ`H/ãHbat):Z`V(&~u;fjh4! u^=Y PۓX5Оy;FW?E82@RyNJ7˽ҚU^h#9Ⱥ5\oaŦMV,,U $(HP`  S, kp60XҌA.u }exkP)X`ݺ}K-8b;P*:΢C1thCQlK齞i7RyagZ};͍[iS7|-i_:}lSZ{ӮP# h}sc6-Ae *^0QI mjiҩۻH~;#bX7N&B%ʦ-YJSo4Y8.ҋ+ ! KÛH.9E>ʧ$68c9gXk {[voQ}2Lo:wFbfD$ I*|V*+V4ؚyg gN+E:,,ߏ#@ PhWSE8RrM@LV\mGH^?O)H#cT6m{FYaˊ}a"@Ze`OsZӣ1[)A㚷sˌf _ZИ.7/߶s <BQ)ܴx7`biMaf8-RN UbPtSEMnZOtkw~o*ܿzn7 ab!ei`flHZ談=8ZB-\6qEzΗxp@{~*_*jb,-5lXs9aG4|LP(OXL-Y[% Gmޯǻ$Ua4^jѰKht|_oOe TN{6S$ؕΊ]lߍ?eH)0]j\ֹ.unq+Ye(mz%۵1*~YU ! 8 /y+3r;N2V }$RYh-|N"Uj6yU u$N} TjZk}|DHZbU5CwN_/X_;e@7j9?\@v.U#{̊t.0S a}lZC\uaan. e/Z*vj7%B$&^d66P[q^Z@Hc^B* &:,uXdǦj\ R`K&c~x=ᑥ *&lA5ðamXX(XDc"TBjHE7 ͵{;ofiFGr -:*KU& J !_:UX ذ)Si˦RrИB`8KfNԟQ)yQI@尐  #=Y[S|/vyځcFcL\]p5--t:2鼋V:f, ?clK!Y#Wiy)Q,LXOּJT6adBp͎%E-4q_׾?|R XXtjKs Y0u^~P Zlͳ=?m>{KGJTx+} >uӞ}sKK]iPP`[CۉLCfNQ$ %褢x왚X3=VcV &V^:m1 jy g~RAؿnYh\:{nt%Û/*))@uB솫ҚFW{W{ց5A,xaaJغ [hwɆ]#c5Ɯ} b?5/˅l8AҀP+`Yü,7gL>'X_SY# ҈Fcjdѿ @{Y;~?塚`j>ȾM'Ji t*BP 7,S4}'n&:Wi:g˓.I +--)4&6lhafר2P ې*: ax-uj'(Z ҾZQty|YjLT5߭zsg$Fc҈ĊA߰V$B]^Ԩ}~4ZtÆpb@%0FRRBq&A׸u=a}{mSPPkjFcdȚk>dϮ`44&V[71PuSjs c0TO uOG۵&u*Pl!Xx E#$/h#HmM3-m[ _U9,~?RBZU, ̵Φ][R8A1B-QI4R W‡]jfpLQ?6Rkd[V*jÊbn&D5d7M鑹9wԆBHC * 4AN@"lJcWtj!! ҈cRK>DÍtvJ{VVt @ 3Yuӆ)R T4 jf6»|أKKyB MWh[fBgTvͭ ! HYp` cn#S lZ3kryE FF*Zîضa`hc7>w3$*'G}cF @`ڳT-a.TB"p pɪmWmYAz Uϸaj&:hTªFbźZ m*!1NMŵ(if).(B 4u$=kF0ziPR7RJ|tj'~?*AXϲ6S )zb Q*P2k̚> C]m3s@}1h4BAk):眱ʪ@2nԁMKwBspMJ+*_37v{ƜH?P[0;P9Yf_l lfy)ux&Qt*!B#B"@%bdnώ5cEm馛m9QnWPjB۴iCscJHa>?¾%37š8pt6|)NQaPc2!yK)ͅO*4p/ln݈-D(Gf`ܾ[8u7Ć42)nP)#JKfLemp)l*0rЄl;\&}!͝USXMEHk>ݟBZ"WzY/y$Y wӳ6^۶m۶|m۶m۶i1vUݛo"#F<=݃_FXU{2ܩPL,~4 pTo 7zK|}-jN*sׂq:P 2eBgfөc'NLM! hEHEh1)LmٱTۊĨ!: Q01رR8p裐8U0Hl`mԁM3~nӠP}f =ǀAuZ X;評mbb@TU1RGDHiieau0S$ZŦV&M#nnQtꖏRoƃoϮBP :ű_jn -{3Lpk `i!XZJsU6XV@[ nT.@EPHU(X - VJ @( 4l0Em07;%) 6zZ;N}t3UXbBx+z;~Җ#ՏbbMAG )6L*}؉c-T[9Ti `h1i\czӗϘHjyҀ騺ݡst.xz}bᖏ֩0&m_w`][v LPt"[GH|`T/յn}[TuﲸcdžsZIՆ\;>UꐪX˝"ĜQ#WR j3 ZJm$Qru4oZ_`H|NCZHk!ft STkyWRMthg}moG}ZijnN-\^ΩW1ͤN:! B`P@XoxZTx-*80Zګ֞F[lR2v۱Ҡsaiae;_:%<]SL?&R0Vʠpן-MPu:Umuo,Za VBu*]FGnyιU'QKG4Pո$*$ED qP QkP3$ȵC0c M– KUi- iX7ط_ WKX([I{cؑV]p}"#!Bl>ptnKkJv4^ HEQtvϥLc F=a-;#zmX靶X86ޗ>zR/tK}MU.C&&$j70G ձ`eeՂ>a0$e XIj*ML:* RH3( a"@b@Ըc:?:1)tZJm:5V-pbߡ&\YC抪Ji]/snW}K۟n#] KﻐrbayoV-pdzj0 AZGwNXJm 㳶:`l#'p莧Cĩ#N{>ikt>^0RmW{}+7p{/??wGuExji݉}$ׯ۫D~hR gmW;$ǶlHXxOzZ…U!q؁}'qu[[:ֵ+P&ʼn7|;8o~Y8կ8Ph+6Z,5@Hm +0>[hc3G36[VXhXK/4UNwׁ#Ɓ}w#vCD\ˢC0ӡ>gXQA˷rMX[XIoEXa,]z=\& bPPb: !*cުe=KU+έ޵!nzީT­{td2VՍP)ӟIK1mQ0H!Z4L]PL &&RQbP"P Oi@UHH$]9^lzp$Gx()v}?,m-t&zwkΰj D);e϶ȡ[ XJB񪉋jY jL!tI/ @B @q?)GE1J bgaDe, ])]_n:1iޖWuW/SQWyܿ98KBy@ WA8ׄ k fTojPL)ڨ"-2@A^ =t\ SX nW'H[q?5'0ipב7Rj$ty5ːr` ,Eťt%$+=lN[ire57 {XiTu2`|DoTmhmpDZ']f>x߲-t{>}?tH@.CZތy$tԻBu^pe4ѣ EEiCU$98j!oqzmdۿY_w~GuT3YpS>;2H >v@:W io^wngn /ЙNAsסG*(z@2:bPS=` 4w_F3RQx'N@Q#!U4,,{sM+.sv4o.pzE$zD9:WBA\Eeժ_S]I fkH|L!p]Bހ$!@AgbîF\Պ{T xˋf"Z460 MXbJ6H[pMҠuB "h[yyL[{NHƕQ< 񆯶u%‰{L ( VshI0(0VA20P,]߳9b!u-L)ZJ   DK \2xWH¶ L1NA't6lى=|O Y/x<Ģ_~t+6^% `\w[Cض"u"[fNM :(BQLtf:SsUh3t7"([ CHax5Uq~E|;s17К $;vL}}ǮNAͯT HոGtzceнfo7'RA1b ܆Nb%"(:&S>g!]7 ¶g=;qHXhS szc~ᖅLx+!PFXIrǍ2J/lm 3ѵ%♙MsLW:ŀ-!HyxήM-օM7+gd"6CK~ z7S|et4_z16Eim45 $BxWkfk{DA)W6R^-^4\k֢! 0:~IQ]5+_g'FRi}˗|pHEMBg<ڰmӎ`@2->ijQЛzhp*^+N8rݳm!:)D"L!+L9&Rx/nG'PzI0|҃r:vlȋً;Đ#Ϲ׻b{oߡ B"NhbnۦQQR[ٱp~^g ) ؚ-MpYr2j6U}%6]@KO,Q&^'%׿˷3뉕{Z֨bjfmٴ܆{-v/[>N|H&m8KG0I/xSSUo\}N3+K ^M;?|]wiMI%ۢ:)hTLLt`ӎS_`f"ЛDpPLv|NM!/ix۝ܵ3Oz/.Ǜ?CNZ"kiU>P-ۭ<[_ʟ R5E>}O\y}.O Kŗ}L0:opǾ={>zա[$g?:n)RK EE' xXI@-bnضcǶtқ¡I~_tsݓ{;NH}E}\S:S;nc\Q~_f:4B1131D016Om g M?Nb:Y,'nr ׯQތO=WvmpձN2zm,fzL:+wVI+ ai0 1XHE[!3xm|ZgsU1˾!&idc( UBoũ/.ivedfI#LOThwi,UՃTGml$',ށ kOB(AGـWm_tskVCʧ%yTfmP-^80պmM~G/$9oUT6.jeI!aj3'&0T&*,.ϞΖ4}w :힞]YlGUD?-=E[hCQk]tY6b`#i+NnJ A*}wEtq,M[KRru@zOX^h،wʁGpݟpQx-T @ HSZRիc3bhn=fm/Ni)FG!fvXڴa˶]<o Wt箘?Q n{.^v^Rң i!RuiPTE j $@.K@ Su1g|KeabibjjȾnnu1~* /qBڰo]5hw]*h0Uc7h˛daU%(0QN<:QxQo )ƺVsVӠ`HN5BP}M3@>O{W 03 5&B1^ظ㎗| o+468 z'\@EH,%,/yNL-:v[f&!=eMSU0vkc벟knF֚74|݃1kvNe|LP|R5W&'0xȰɪIO.Hޙ4 ]JF1Wv I)|i7K!VC &1Xuj^fz@4).ӤU;)+fs WnNE#|qHC>@nOq}j^XS. s^vvors ~ ?bVHy>oӥ@ qӤgn|ԳTxc'{[o1o+ #jgt kzer֤*6 wB|À/\jk7ں9~?>i /<JLwjz:;CK4)=WćGb&\zxi+~jdGH@ ʽH8xŲ0bqI3Rڷ )^{+v]ޚݜf<@rqνBx`;!h}[}&=iH@H. E/5ioغokx%  @ M4 w9BZKzڄ*=RTnB1FoqʥtS󛣸O! <+gB$;Ņ ^Ry$H@CHas3fϽm*.U7'5ܩ=zt﬌F`e2 T $4]t7/ iyפ&Ocb#=9D/p-_3w) h47%NxymR$ܲ4[z Mox&=nBʓ:b*Fv}_į<| BJCVV#%)%k`5vS[?0wۺ֕~otm@+¤ μ¹@u*3ڞ%O!OEx]BHMi{Z]s;~/Z|.ai((3ά A8u$Z^ 0tx"sk_j'W.mܜ\ĻWF`՟=`emm%0sձrVT {^C E>!4|iO.m47'YkI; k(6J'4H򞇲 nKU|JS{Hq9_ =v p=SU\i!Jpmrʙ3k.pY HMC> /ʅs+ly } _?4^; +^ziTPхQbr*ape>ϓI.ݜgv.l܆_Ņ*ࣇTvfm FاIM.O$ې_^JO0EhIo1p_ϋpW- 9w`=) ̈㵰O"QUE桽׮g NvHmqs> V^NQ]wk;!`ѐ̳ ݎez15  as ;s='xpŹrDDS s|"VtinNHU)^u[~1?K 8wCJÙ3L8vf-$h핗^:QĢ]#UᙆEp"nJbrY [_A>xXix%3C?׽ xauJ4۽Uyߞjw R{J8B񹝦mhfo K*-/;AJ1([ Un}5JѾ=X\X-! F/7fg7L߶y (^=4Y?\1p !1K^XZCit w;jgw܌AU\z6Td9B p)s[\'ǥa! [t: g~gRxi?l*#I; gnBJg>0tV 7%L>a po hH\hN4@!O]ivHyCS  T?lub0Z0y7D=R(F (m0ÅW> Q`9rMJ袀34w# !Kkg^H!0nXN1x#Mݰs ~u Arpf^ 7:Dڹ>2*Js:+knyj"@$;Uis[v4@ #k'$FV.4/zvvnCH?F#pយ͢NHW>򉏽0"ѤSkeAv@ K-+TyNPTqI"fL QY*=řo1?Il{(B=Or%  CHO$9_! q+W1 vWvKi8aFƶ<ip7:'~B. |o!e g/;>/8NJEshef[;^Iq~\LŽE>;!_';#+kv8ܓߡy|4?tSp Š!U,b獺HEnC]'.+g> _KiN#1ZpIM-}wTһta>%.q U3zkPLn7(wh.78; Mڅ}^5Q\ށd74ue?9W@ !ҩD 7 P\,U;9aƯkP=άd+/}蛾C$.[Y:bu`T HjKEC wePAAK+..v'?>!Y~)}SRЇ?u/8V iInՐMOB <$p:E[G "0[V}lgwO++H#p3gg!=S``Ӑ+ hgkHEӒ)qg/x4(Xkf@VH]Lfn=d 9@qʥY gHэ0y{R RR̻]vnCH`aR:m̀fR ޚ֥aنlp}, J!z}"b+Ec_\ \(W͓BJmBuIE4fv: qd@v7ROkx$0ska_Du i/܆/F+Y7PBuCb'h&wMR{^C>g _@u{pyC9&6dk.u՚ Rndg?[f*~ a2'&U3 S>p>Ji3]G(v.5 XB"BJT >njߙ !B~wofk¤aPR F7 J.q4b2`ml &M˗iRHX?T 8!)A5xk2 u:ap%(50+OLR[m~mLةت,ɒFhpe-P q*5UcV)܎_ș:^Uv& l+(j/ߎWٹ' e\WBuu8w徙!4 k_X+VfFj~ɘ% luZ_s"?*"8l^)~B6.Tig0(F Ikj:F|+t!ˇchXPT;KwkK~HhM;qZUWk[kg& ƬU9܆G~Te6]C3 ]#/}}o\ ^# J&5,RsܞOXRywվ%&fj5Tvs?#\K6p4Dqѽp!Tm^IAqE'MJPUA'PL =$i3K!đ^b4l6lEjvBkc0i\pat8FO;@QdO[_% =X$n)%,F*^x|ONsFܨ3%Xif+0h&Ҫ+<, Qֶp\-KmOkhaI]8[\HBH)Fsh"o"|u@b.4Q*XL hfW^hvPRBsq]װ"%&E,EŠ=_xcrf@]N崂WF̀,<8{IM3 r.jP]vw!1i8q"!6/bjw(BVz08se $d{S Q|) x|p( >|[O >0;f# f@0UH3F+;t`2AF TM=ig7}`4JqLiФ0޳StUL}LiRBZZ{\D BR"݅o9}ll@! _/( ba3zRP]04~k۾70jVzj@Qʐ"4/v?j@H]"MvD]8ZKR",!d)?<H!/C0{I>7FXA\Օj-eOCѷ'>tf(ӥa $FiҠf[ElcgBLBX-/ܽFq.$(Kà<<gp7m^6TbřA1HEh.H}[s{^)Vny[t&iRQa[}ljrbIBʞp?M>0,'q @ՐJ1ZY;3#AʙFWf@1٠Ig D58ci2Zۺf(IV QUjsSX5= !B s|UIi0Y9~/KB d2J2 M5[;!5]f'$jΒf+w]&fT܅#q& bϓWP7Y;S έ;DRDO^=e,HMjŅ~B63wFbG244@쎔hAX?r7W62޸ƷDJ@3 sah&#CPM@J%t 44HuQQHTՠi6k`V ҹY.|KDSONC9) Fai RfsElLBqWUWiXB7. H*^_QJ!Hp3g$LGUm3kU=8pPXB",.,w9wٙYuUP܅P},4h'Uۊ^Jz VhXI窪1RB>)UU=+i q8 4((i0 *]bv3{@ 쟫xtmt$@z4b*fZS@H[I5!DE 'JCD M@g΅S̠uuYUR3 E}D\S-4?++,R4( 1ZgΰBVLJhܞkg@R15viEA[ BʩYE(ǝY"Q%P &RHٍ\HFzn~3`"=q4ԣ٬0 ΅Ԅ_ B M.ߖ}D( 3O(%4$W4!J. 6f ¬t*sb$Մ'}Яw*_; 4r tU+VJ;;kRB'4}!:P"UE:МFxE & V2@k4,;4 Mz f+!A(2 {$YJ fFN4;haVMQNP(P `*})t r`n4)J-!--$ AS_Cӧ* $FB>3H0c1J҃7^t{^(HY\K9wв(%$pBʠI'ѓFg'ZOBV殌Hb*h z)> ɒ#uEH)L}bm* \é{_aJV@Z`ߪIbU.ϤD8Lm1E5+F!0&װORJVB j= R.0ۑҮ7JrI@"4M>ʖl) BhQJ) &3+ZA"L*hRNc*H08jdb9Qf m3[vEf]hWBA*g5!=~B(`6bB:sCBҩ %eoC@ZaNBĢqfHL`Ik$$h=Fh$hfؘm{(nHFH'6Jߘn0!k7mФSEtShIDsڕ!W? Y%hOQtMh"A52Zi/d*)Q8bQHH!0:H7C`recjB1㽯 "\Sq&DG?/KǫbDR3ة Ф8:$p@A(($̚@Xx4! H>!1'<:q?9| "Ф?M "A ^K+'ZMS UPk Bښ)L4H[wa_'^gDܿ_orBGQxN4L4[ڕ`2kR*P=eR SE5UAbj2'6%soyWv˒FDP> }/C""-OzP#LR1YkRS v`Dؗ)7RTؓP (#=ޤ\@h{)=1:+ރg€P]I (lF|>!$PM`ߋ g݌@cS"UmW#;`4!p<" ihy͏y\cVC4hV^ܰx?iEl0K+q} RIy$  Ti'C0aIH]hBB@ hfФ&qf?_ ޫ4!<k3`̪lPl1 ;g Rپޕ2O~IoF i8q]bI5z\ӇR"4!uӴGݓ7D~+T*3AS .9STUU3K4! R^CEUфIP&1i箤IzT$H@{{~.k;!yrbEfgˀ"?fqZ)fS4@ EjQvUbR"@Q=C]z1r&o8 /l( )Žl'ta(ʼn;#^5;WTTa(Bޫ44l'ICJ!U$i4=ғ4XMv`tHT#f$֊Aj!T5M) VƎf0HιdePAS |B EJNRXif`3{@HIz^"(1`Ҥ!1"a'S=~A3s!_:f "4گMPp [ iIZ'JRS))0@J)䃦fM=rO5O3AiV*)zR`zړT'4ǙxekҬfN<6P@ejAE3!ѰB3{ڽ)OP&=mÒA uڥ}Ј.\x啗Νo޺5٘l̪ͮfih !VR1(K(Pyc>ɓ)iFj0h]!C4Є PH%ݫ䓉vkA~3w!T+oddonmPìTEJ/4pk6cY?, Ԋ*.AQUf a4|Csi=x EEm`/ħ> 8` fz@fkmIX)t{'qzPiJ$4ieR>$"#,^$<-3k[?o"ܝm/A䉫bvfmVj~ U!ƗyG1דLI4KS} )GHOP3K)+g4>iTǘ M*=b%aIl UP m ^?٧m={\">  $6Ehh+€4YƽccvOC(ќP$jɌ*%(Rw)bP1(˃ FC{*f`~H CF8,@Є8S5Vh?JnC W}pr"KT@H,fTPʃ+rՒ\W@zZ1DoĤI0hVnq (qUXib$.$B1=om-/gNr@_S!dR@<}yvQڵNhҒAyҋNAG=tiK)0j VoAWPM>WA rrƕ} U_3qв 8f R?Ӆv@K|.'OѠ)н o|)|B1"3V ά| &i>Q4ʀPz''iOcѤ` .2 ޵ t*M~{'ٯj}/JA"?>6'U֕o톩ʕbhF4(mܗX24 e֤@$=5}p󁮶y0Ünl[~'I4Ejv\P {~Oo)a+_?5HRpn¨aeЅhk(ҐfER !DwiQGZv$̩$A`t7>${lRSO>tiā\RArD:1ӿ^a&kuzeSS!'bF3 4)2 +I˭Qz+.E]AE ̪(V̚tNMB:l|o:VUjA8L?`"T IiȭbBA(1B P* <ձ?x>% x[HOD7{̶0'dfVQ1HbRJhę U0F)O*BU)Qhfͤy(RS=.rIkHF=0FO釶p;K;_I'J QST+4izOmg1ZU8ʏ =J ahN7 <_z*ĻH=%;kMf[;Rmll]yƕD:btj&ŬjH)5''Hi0O)^ڏ*@'3HF+KCJ:&^C- ݓ +.]ڙnBլzR\H3zo0Szᐍg]gRГ& TUH;Ь4@(&54 |MI^Dj8ir[܊oM8&9rqkOS;Lm18}xRAtg'@ى,ԵOiqpxJһ$B\yXy4So~nJ0 }pKiH+?m0vk[[qq}=>vR"2py8a &|G7fɮ7UM4)ݔNZG`ѠrUGsxUH%UjBIһck2R\(M w=5;F&4ocBѤPvScJ1k1w>ndRB/W|sK!U)@HM܄fP̋\bu"ml=ǜٞmoX٣9CE]jvml%"U"!@>#1Z RWз; >D  B aee2@&Şؘi#GN5 ; R.r6猻L4ՒX$ ~ǞLjbiO:ZRb6 \۬hRAaO8`Z޸$p%5/=z1`h HGMUkh5dH ,NӐa EQ] ^Ї~̯W$tI)AjI|l-~b8/T=̶se\!o545#R.ZN. )j-%Dh"oq>JF=D?PAX{C0[/W ",5g=XL4ٶx{>CMamAPnhmMnS77b+p54XtP_>Jw؎W~əя!do1@LHaJMeߞ_XE_MI@>Iȵ(RvoMZ'.]y#͚5£gf߄[Wlnv6&)dXdCETU[ $.Or)WŞݎ0PPzO07 V0if{An߭K. l]#(֞Vxb&T$!UQ'v4uahfĭߣB0s(ꝏWJ,F"KxF +(FkT)ml槾p0=vQ$Z! i>c/KEKAǤKDHq+P44H`y|,owqi >6ǰ2T)Uyti虆+9 0ظ[6?|Ae&6vvMbIKşD9/Qx 0|ByAE &0VWf񺲱z+ku#FpS ( Ҁ,'C ڑ5= yJzΆĄ[!=Np5!5|C(Ģ:WYT;Ad[}BTVV*d  TT[*IkzPѺ_w | >>yB"S~<¥ĴML˶ەp\5I1B{&KS)AC/cn1ۻxЄgPTEA ©4  3kgF &8vzMΧ~Z6'ypƥ+=W/d{̮ >nDȽ^{ <Ю<א:Lta0vyf%J=Ћ?L%_9iHLz֦AO蓖6W>Iד@B[F w R(z4wkgzib Ͷ(n[w7no ʠX^\N zT)njj@3!AsW%ֺ8 𹭐zRճ ݺlk!'ךSƓ \eCOta} Mr$ eӤDJK4ORK_qowiHgc~0/z%T݂v'ߤ^&[ڵ. R"u4O\gX)V<?ޗŮ߰ObRуomo/ `^61ui%Mz䄾 ,Ҳ*G:Ij'i< V=8eR}bDҭ("=rfu=.]O{w7t]_BZ懪]w\gwS@8 x? ^+s>\y{4Cx7QXn\}% )HI) Ll8__Tl>9sae gz]¦;c_>ZH9'JSaL{^dWVU;S,U4HXѦƥ>#F"%>E )3Pɣga.f] L'UEbI(w&"#b撲q FgΝЊ᭹a]tv4= $vh[UkP6  ssI.ʉRV~ڠw4Ww;=l\/S!i5.fk]! @q`IW"̳83Uyᢧ!3eo.e#gۢߪiiXJchU:ѭny4Xz ҿ:-ϝ{_DDir " 79=sMǠ3bpQA(˺B R!}&]lGLz*L`ҤfeHyd' ȽC@ӢP ](Rusy^T3UϤe@W _KݥG̙B1\l^Z,@U! פ{)=nRz}q5,2 ^e˞\#7F~AmyߵL!@5/nGڛ>D@!48x7™GkamԛB*_s Xhr[ 8[>s7Wk,bZj/{kn:ֹf5]1h,GP K00glb 2cCJ)W(3C5i/@&E11Tu*#q\$YIpPt $l%H^B ÁSR)тmQF65V9p*H\֜;[r/Zա\WYj %Bȍe6Q-dBRn%Yc3UKaJ?#Wn; ȱiuN ΐ4;L0Cb~ #IVfB;^C)rҁzgcdlI[>W}]23Ph :s+5Jj CKJ+"Zjn8w[}t@ܫF27}"'hy/9o-[L4D+aC7%<ѪC- -A9S\j 7;j B#(BB4q`d}oCRɵZSk(-M *uJ{εr6{&J҆` Z8ʟWgVN|.jxQ35UݾΉFҾsN9劇 MV$JL@k$itHZs3<@gHZ+*1O2xlOc=aS\V12ԸPj(Ut6J{kRi &62#ኁB-;έ,,n鎹΅#c441 elj"wWep;Λd6^pYѺ.{/Sk27#A*I2 \uK  5jcbpϺIE(3j D+3V8UT(rHnc(8LdhȔZY.}}WpfaanR^k.P,$]Q۳gj(VV#嶉m'ݵ2>=А9Ѻ})չtjlb2j](jLi~mMTZhxd]';W\Wif2S\r`aas:VeVa W)l$cFed- B>3Щ 6:Ypu ĹqxdL&d>˽72my 9>АpQ`wVBؘآr\%Da WCM)׀hێy{`oq׻}o/3Biz#VNjnȀW?Hq]IrR(Ï2&2Jm0 $}ęJ2ߟZ8@׈S2XDvő Q)X]eFiD2|I(5~[?ތ^rשe #Y @劁dfmۻM, :n錭dgS.ؓ[`)Ӛܖ 7RZ)edneݙkTٷ̑C;oGםV۟i 5S8ª*W2ROǁwHP'*D_2tw=k4IX~Rc_dc7-|P\< vҙ Ȭq'wUSl,枲rll.4jI:Z.w䖁Ε!275W9tRmhLicnrvA.SLrzJijj#3/۝wunE^{4s\{)#h* ("&:IpZ2vՁk9{ƎA>{/$ۿ<@ysxBe ;snܙ-Tn.[E!n?Ƿ$Cr$^tӱ5{+[X[IxdıDP-iEHq}C\}Ire*wͰ0P-z#w@HkܡR&ZS@\ia wd2%w4rs ~㮗q+o!}R55Eؿw>t?6nt-k ɜzEQ2.+`(z6ujr2DVҡˎ\g|2EO'ht Gn)zgr~tr_gz>L{ڹ Z~hWjL.StcОK {+:2u4ERȓckVee!S*eN ,lT*< 1i 0UXm+UnJr9ȼ;5־"$pq`ȼw3D*0H_D?uܖ%[`{YPEr׹<NDXeHlNF&4eSm¹K"J` CkurLR4H*sɛ}'Oۋ첁 |S'1>t5˗KrJx"ہ ,GK=?f3ԙ1ciX;Y,%VjDչV)5ȵ*KέU:{s(tZc;/7 `xەvYWxʃM#E"xD'컢#\GAR(z<"@ huOJZ&~#l$@ihg=Ȟ=3&7XW6wnime rJcxOG<M:w_?\R+]10VFhb@Kf278lQoXh 9h V $r[Za?_ufeMݙF3Lirɞt6ۻUhtف J]J'r)k;lA He=B @*^E&!C 4mzF.,/6njͅ:[@䣎 ?sI.36#,wSɭn- pjDg!72ԩV\e(ӨG s#ܩVkdci;}Qu:[֒w:l:{[=Tu}1:o3@l$@ʕ64e8S0fW*"Ro Z}<7W&/*hu>Dlna D\GJ+;dzt2 LV|_ZɟuY{"m>=}r%6Fj )ZrWiٽL4N+gXY,5Kdub\RYyw}ȫnG2JXzOĔ́7*طoQ *49J"\2#E_Vfc @K1 L%f tbca7z*-= Т H2OT j,ZZ$~D 6Cqk[^z$m]~?њ)Tr )]ް*ZhNILfm_1,5*\+@Vֆ2T# c=_[|' IY}7]:pbĞW5 3{NPx2hĿ+Gx2>CP($AFˆj{b,Hr5g?ww䑸l4aN=O\*;b|U" jN_OZ׃mՠؾkr]\5JK6  lw !腌F409}}gu?%G2C8033r 71SXYeZc#7- LLa*k 'CsPܡSL厙Ѝ萹P[*d:kgN枬n~|άl+&Mt䤸/kHqC;~.wÇ%>2N!Z&=Nˎd|KPed`8dD۫Jr_}?չԞJ!iBnпjG+sN+'5uh$YϬV-ȴ" I:C(4r}m.ٙ`6Z,dXi?I Px973ҘFr{3GY*.q.Lܲ[DBט56 Kd߾c+ʉ]E6rgkƝ[OᵃNZXڨu7!^eŐ}S1?DZwV Zd堲m, q8u^۽S级\7H3'ĹSnt;ivlυw؋# <PerAI0mA`{n|&\[B҈ H NB%߫r\x#LejhL]vd\a5ѩdZP6*Cw4'nw&'^b#KΕ5!;lTm$Br8ʿq;sգFigq4( 5gȾ._E$7 gTjd̸A(dzC"08CT#~sٍx :y̱c{ (6=H8Bs!!UF$PFiAn; ^+c)A?@HɫERH @];[G(=9OjVCnڳKԒm+K cwZcߙ0IrMHCCsKs NeseɵW4 !CE@r02~F94seo q5574 U򞹺 R3E8S&~5P]S8vswqhb :I@ 62[g|F96ОaTe2!jl⳵ S{HcZ[F~zMz0+ f}GN^kfpݑRE+Fx؄w1תvT%2w$sCh.rVr8vCJ -(ܖldM YYG#jb\)!&vj1ԥ+uJg ?/^J/g gVd7ԯQf0MqH#8u[ o h(l\>D?q$]a  e|5E*;ILu1p&Nt`|e5l46Vc ]3i}_25S 劍; ]gT6z.D+G0TFRMDLayMY |ׇy}`7Kuo܍4{Df4$UL*a JDW/IXd,,-#{GXhUm`o{Iq+PЇNH; ö.m okD-粱G*ȉ6 aV97GgZIV iUؘߡ¶m.ԇZUFѯ9unZ9:fToY>ǷŻn?z^x#y|m}W!;(*7jr>ZZZ4wY[ZUH4z ]߭;w.ouصn"v#vӡ~M~ġZu'JWL mT.3Wj=/:Vtnh8tT"$QYZS̜)LtjD'YGvGփwcNt 1x@f7sgV:xCCO+=Ƀ-Y$HK,qWG&۶X$Bh5^kbmD.n[v*X!ci wOYmJ~iLM8mȑ8fmQ:mCsrkCSj3J%iM$+9r蒑d*XiI/Fy٩(|U}J.Qey:qɾIJ2 dc7Dꉛvɂ9tB@E$6}uqc!tZ WN9) $Y*_@kŞsPr*|CC=m'Nujg(Cs CnCg0s(=7Ѩ5Έ&R6W#?%cCs>/XBIi뀏`dY|,c,wDq4W@!w2$^b{'Wbu=!Pl3<=x؂Th)y ȜJvw@vd HZ&33LW9r:6ΜybffZ4N𪫤ҨV3}sILZBRcwsi1ݘ,+B;B!9W4LdZi1oxռPU˲*S*)h2QPyŧ|2 )"DcYζ ̮dnCr C2wWO2YҬrW?z% K"W(5᮰0l*0oQ:14d갣'^IgfL!a%ƙ^o?iΤ*٭ Ŗ*ݒ%^f:YʢbD]1f<>:y*Y;adā4*,y,"h` 4D,7ֵz#JuLέP-IaeJVL(XHc AK]D^FS8#&FV`Ba|:X5}ph]\/5Hq9+!ͮC<;f̙;Iyd YLWH><ف!2<733M:^[, A2c#kQkd)k-Xiu2NbcRId (gQ>%7d G#)d$Pc[A<6;*|Q X"@ H Adq/LRj%'aǶRɶ'Xd@)؃FU*-`2dP[i,be4IBb( Vv1^$tr x9>"+^e83ܐu@ɘ\1G'&ZT$Xom3Z@mBg0FͱVL1LӤ?Jód򁷞v>ܗzm/cJ$nL (cn>gkqS2ؙTNԲSB©U9Ce8Y$"'zx^iNuFp)9U؇t29Cvi!‘O mFmDC؆QpiRaeV'jDCa%Ҭ vNeFq*t9 A/hGiRYi^Qxd\Gv@N%?Bl]j;Ba&Z&BALQv. TZ{9*)Ar=m]Jggl㎽.4Vi}bPXظTY*m!:kܔ5Z\tB-T硓p VZ lFt}= 4<ʎ|(iͥ6)|F;ɥIw" ZgzmܲhMSe+Y 5d@lYw=17MDYᐌIȒ#ψ$w]jQkR#@" ݁6<*Xޫ-ud]Z*kFi HbQY{Bܥvu^rs~\n$n){l1rr驼;߼g]w=4U[Tbr)I2Fm6e3EL>v SХVX謌ZKDQkd K.Uek'͕G|sNkZ[*+K7- YNpw$G>VJWqCZҹ& 7niuVzNVjIaeXcc)k&nkV ׅZ37%e~-}Z]7&!Q]=u' oj_"3"=AAI4tR%*ܮcb/$יS?L,n"uH 80>I&׍,-wVn"_S6"F '&'h,$gFѨSF!:Y0]ke! O{2zS8۷qyI7BLO? xz[?1eo?7w];~*L(0)L@#4ETR6r.B +%2!!_b=-J0Kٓy?p /[q$VHar.Z҈SbfdPipOIҟg)y*}_saL&V҃ 8*<mors毽?L  kl%4}-kZ&?![ <+ A/A z-\YOxEIENDB`mumble-1.3.4/icons/mumble_small.svg0000664000175000017500000006506614010707273017163 0ustar builderbuilder Mumble logo image/svg+xml Mumble logo 2009.08.17 Martin Skilnand Martin Skilnand Mumble team mumble.svg https://github.com/mumble-voip/mumble/ Logo for voice chat program mumble mumble-1.3.4/icons/murmur.ico0000664000175000017500000002215614010707273016005 0ustar builderbuilder@@(6 ^h(@$GGGwwwLrLLQcv1Qq,/KPhp1Qq/!P7pLcyϏ1Qq/Pp",6@J[1qQq/Pp  =1[Qyq/"P0p=LYgx1Qq&/@PZpt1Qq/&PAp[tϩ1Qq/P"p0>M[iy1Qqұ/Pp  >1\Qzq/Pp!+6@IZ1pQq/ P6pLbx1Qq,/KPip1Qq/-P?pRcv1Qqϑܱ/Pp!&,>X1qQq                                                    ( @$GGGwwwLrLLQcv1Qq,/KPhp1Qq/!P7pLcyϏ1Qq/Pp",6@J[1qQq/Pp  =1[Qyq/"P0p=LYgx1Qq&/@PZpt1Qq/&PAp[tϩ1Qq/P"p0>M[iy1Qqұ/Pp  >1\Qzq/Pp!+6@IZ1pQq/ P6pLbx1Qq,/KPip1Qq/-P?pRcv1Qqϑܱ/Pp!&,>X1qQq                          ??( '''777GGGWWWgggwwwLLLL&1JLr L6Lb{L1LQrLALmLLGvLL6[LL&?YrLL$3A[LL )LY L :fLL-?QkL+LHeL>:??7?:;::??a::a??::??::mumble-1.3.4/icons/mumble.svg0000664000175000017500000006770314010707273015773 0ustar builderbuilder Mumble logo image/svg+xml Mumble logo 2009.08.17 Martin Skilnand Martin Skilnand Mumble team mumble.svg https://github.com/mumble-voip/mumble/ Logo for voice chat program mumble mumble-1.3.4/icons/murmur.64x64.png0000664000175000017500000000054314010707273016605 0ustar builderbuilderPNG  IHDR@@?PLTEӲ$LLLwwwGGG㲲rtRNS@fIDATx5%0 l?VБlIYmk!(Z"Q& }v!В,0*!pG;; fB1&(֑T;Ŷ(ȁG+L4*NVXIPaMuV Lr`XJ`İV #s 6m   ~>[IENDB`mumble-1.3.4/icons/murmur.16x16.png0000664000175000017500000000041314010707273016573 0ustar builderbuilderPNG  IHDR(-SHPLTE㲲rwwwGGG$LLLӲJT~IDATxUȅaDQDQ]nw!)Gmo3U#0^{pUd"O*3an g6UE8IXMSH CeLGA^ t}Fj#ߩ;`O(^IENDB`mumble-1.3.4/icons/murmur.48x48.png0000664000175000017500000000060214010707273016605 0ustar builderbuilderPNG  IHDR00` ZPLTE㲲rwwwGGG$LLLӲ===%*IDATx͒rP 4ߜ9y̾$V)&Hٷ-iA~ټ.rf A A$20B]Eﺮ <Lim{K0VUdY&b%@*p d{Ym꺮Ҹre Hi` ` lU+|1D` u. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of The Mumble Developers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. For questions and inquiries about Mumble's license, please contact . mumble-1.3.4/Doxyfile0000664000175000017500000021630214010707273014353 0ustar builderbuilder# Doxyfile 1.7.3 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = Mumble # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer # a quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = # With the PROJECT_LOGO tag one can specify an logo or icon that is # included in the documentation. The maximum height of the logo should not # exceed 55 pixels and the maximum width should not exceed 200 pixels. # Doxygen will copy the logo to the output directory. PROJECT_LOGO = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = doxygen/ # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, # Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English # messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, # Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful if your file system # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = NO # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given extension. # Doxygen has a built-in mapping, but you can override or extend it using this # tag. The format is ext=language, where ext is a file extension, and language # is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, # C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make # doxygen treat .inc files as Fortran files (default is PHP), and .f files as C # (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions # you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. EXTENSION_MAPPING = # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also makes the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) # will make doxygen replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO # The SYMBOL_CACHE_SIZE determines the size of the internal cache use to # determine which symbols to keep in memory and which to flush to disk. # When the cache is full, less often used symbols will be written to disk. # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time # causing a significant performance penalty. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on # a logarithmic scale so increasing the size by one will roughly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols SYMBOL_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespaces are hidden. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = NO # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen # will list include files with double quotes in the documentation # rather than with sharp brackets. FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen # will sort the (brief and detailed) documentation of class members so that # constructors and destructors are listed first. If set to NO (the default) # the constructors will appear in the respective orders defined by # SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. # This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO # and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to # do proper type resolution of all parameters of a function it will reject a # match between the prototype and the implementation of a member function even # if there is only one candidate or it is obvious which candidate to choose # by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen # will still accept a match between prototype and implementation in such cases. STRICT_PROTO_MATCHING = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or macro consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and macros in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = NO # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the # Namespaces page. This will remove the Namespaces entry from the Quick Index # and from the Folder Tree View (if specified). The default is YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. The create the layout file # that represents doxygen's defaults, run doxygen with the -l option. # You can optionally specify a file name after the option, if omitted # DoxygenLayout.xml will be used as the name of the layout file. LAYOUT_FILE = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # The WARN_NO_PARAMDOC option can be enabled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = src # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh # *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py # *.f90 *.f *.for *.vhd *.vhdl FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.d \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.dox \ *.py \ *.f90 \ *.f \ *.for \ *.vhd \ *.vhdl # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded # from the input. EXCLUDE_SYMLINKS = YES # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = ui_* \ moc_* \ qrc_* \ Mumble.pb.* \ Murmur.* # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = * # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty or if # non of the patterns match the file name, INPUT_FILTER is applied. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file # pattern. A pattern will override the setting for FILTER_PATTERN (if any) # and it is also possible to disable source filtering for a specific pattern # using *.ext= (so without naming a filter). This option only has effect when # FILTER_SOURCE_FILES is enabled. FILTER_SOURCE_PATTERNS = #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. Otherwise they will link to the documentation. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. # Doxygen will adjust the colors in the stylesheet and background images # according to this color. Hue is specified as an angle on a colorwheel, # see http://en.wikipedia.org/wiki/Hue for more information. # For instance the value 0 represents red, 60 is yellow, 120 is green, # 180 is cyan, 240 is blue, 300 purple, and 360 is red again. # The allowed range is 0 to 359. HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of # the colors in the HTML output. For a value of 0 the output will use # grayscales only. A value of 255 will produce the most vivid colors. HTML_COLORSTYLE_SAT = 100 # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to # the luminance component of the colors in the HTML output. Values below # 100 gradually make the output lighter, whereas values above 100 make # the output darker. The value divided by 100 is the actual gamma applied, # so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, # and 100 does not change the gamma. HTML_COLORSTYLE_GAMMA = 80 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting # this to NO can help when comparing the output of multiple runs. HTML_TIMESTAMP = YES # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = NO # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. # See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html # for more information. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify # the documentation publisher. This should be a reverse domain-name style # string, e.g. com.mycompany.MyDocSet.documentation. DOCSET_PUBLISHER_ID = org.doxygen.Publisher # The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated # that can be used as input for Qt's qhelpgenerator to generate a # Qt Compressed Help (.qch) of the generated HTML documentation. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can # be used to specify the file name of the resulting .qch file. # The path specified is relative to the HTML output folder. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = doc # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to # add. For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see # # Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's # filter section matches. # # Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can # be used to specify the location of Qt's qhelpgenerator. # If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files # will be generated, which together with the HTML files, form an Eclipse help # plugin. To install this plugin and make it available under the help contents # menu in Eclipse, the contents of the directory containing the HTML and XML # files needs to be copied into the plugins directory of eclipse. The name of # the directory within the plugins directory should be the same as # the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before # the help appears. GENERATE_ECLIPSEHELP = NO # A unique identifier for the eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have # this name. ECLIPSE_DOC_ID = org.doxygen.Project # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [0,1..20]) # that doxygen will group on one line in the generated HTML documentation. # Note that a value of 0 will completely suppress the enum values from # appearing in the overview section. ENUM_VALUES_PER_LINE = 4 # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. # If the tag value is set to YES, a side panel will be generated # containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). # Windows users are probably better off using the HTML help feature. GENERATE_TREEVIEW = YES # By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, # and Class Hierarchy pages using a tree view instead of an ordered list. USE_INLINE_TREES = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 # When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open # links to external symbols imported via tag files in a separate window. EXT_LINKS_IN_WINDOW = NO # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need # to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 # Use the FORMULA_TRANPARENT tag to determine whether or not the images # generated for formulas are transparent PNGs. Transparent PNGs are # not supported properly for IE 6.0, but are supported on all modern browsers. # Note that when changing this option you need to delete any form_*.png files # in the HTML output before the changes have effect. FORMULA_TRANSPARENT = YES # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax # (see http://www.mathjax.org) which uses client side Javascript for the # rendering instead of using prerendered bitmaps. Use this if you do not # have LaTeX installed or if you want to formulas look prettier in the HTML # output. When enabled you also need to install MathJax separately and # configure the path to it using the MATHJAX_RELPATH option. USE_MATHJAX = NO # When MathJax is enabled you need to specify the location relative to the # HTML output directory using the MATHJAX_RELPATH option. The destination # directory should contain the MathJax.js script. For instance, if the mathjax # directory is located at the same level as the HTML output directory, then # MATHJAX_RELPATH should be ../mathjax. The default value points to the # mathjax.org site, so you can quickly see the result without installing # MathJax, but it is strongly recommended to install a local copy of MathJax # before deployment. MATHJAX_RELPATH = http://www.mathjax.org/mathjax # When the SEARCHENGINE tag is enabled doxygen will generate a search box # for the HTML output. The underlying search engine uses javascript # and DHTML and should work on any modern browser. Note that when using # HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets # (GENERATE_DOCSET) there is already a search function so this one should # typically be disabled. For large projects the javascript based search engine # can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. SEARCHENGINE = YES # When the SERVER_BASED_SEARCH tag is enabled the search engine will be # implemented using a PHP enabled web server instead of at the web client # using Javascript. Doxygen will generate the search PHP script and index # file to put on the web server. The advantage of the server # based approach is that it scales better to large projects and allows # full text search. The disadvantages are that it is more difficult to setup # and does not have live searching capabilities. SERVER_BASED_SEARCH = NO #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. # Note that when enabling USE_PDFLATEX this option is only used for # generating bitmaps for formulas in the HTML output, but not in the # Makefile that is written to the output directory. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4 # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO # If LATEX_SOURCE_CODE is set to YES then doxygen will include # source code with syntax highlighting in the LaTeX output. # Note that which sources are shown also depends on other settings # such as SOURCE_BROWSER. LATEX_SOURCE_CODE = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition that # overrules the definition found in the source code. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all references to function-like macros # that are alone on a line, have an all uppercase name, and do not end with a # semicolon, because these will confuse the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option also works with HAVE_DOT disabled, but it is recommended to # install and use dot, since it yields more powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # The DOT_NUM_THREADS specifies the number of dot invocations doxygen is # allowed to run in parallel. When set to 0 (the default) doxygen will # base this on the number of processors available in the system. You can set it # explicitly to a value larger than 0 to get control over the balance # between CPU load and processing speed. DOT_NUM_THREADS = 0 # By default doxygen will write a font called Helvetica to the output # directory and reference it in all dot files that doxygen generates. # When you want a differently looking font you can specify the font name # using DOT_FONTNAME. You need to make sure dot is able to find the font, # which can be done by putting it in a standard location or by setting the # DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory # containing the font. DOT_FONTNAME = Helvetica # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the output directory to look for the # FreeSans.ttf font (which doxygen will put there itself). If you specify a # different font using DOT_FONTNAME you can set the path where dot # can find it using this tag. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will generate a graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, svg, gif or svg. # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MSCFILE_DIRS tag can be used to specify one or more directories that # contain msc files that are included in the documentation (see the # \mscfile command). MSCFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES mumble-1.3.4/docs/0000775000175000017500000000000014010707273013571 5ustar builderbuildermumble-1.3.4/docs/MurmurLocking.md0000664000175000017500000001615214010707273016716 0ustar builderbuilder# Locking in Murmur ## Murmur's threads Murmur makes use of multiple operating system threads. Most logic in Murmur happens on the main thread. Each virtual server in Murmur is represented by the `Server` class. Most of the `Server` class runs on the main thread, such as all control channel traffic (TLS). Murmur's RPC systems usually run on a separate thread -- but all RPC methods are run on the main thread via `ExecEvent` (see `Server.cpp`/`Server.h`). The `Server` class is a subclass of `QThread`. The thread that `Server` runs, is the *voice thread*. This thread handles incoming UDP packets (ping and voice), and rebroadcasts them as necessary. The methods that run on the voice thread are: - `void Server::run()` - `void Server::processMsg(ServerUser *u, const char *data, int len)` - `void Server::sendMessage(ServerUser *u, const char *data, int len, QByteArray &cache, bool force)` - `bool Server::checkDecrypt(ServerUser *u, const char *encrypt, char *plain, unsigned int len)` but these methods may call other methods (such as `ChanACL::hasPermission()`) in order to do their job. In general, when speaking about the *voice thread*, it refers to any code running in the `Server` methods listed above. The voice thread methods access various data in the `Server` class to do their job. Besides being accessed by the voice thread, this data is also read and written to by the main thread. To properly synchronize the access to the data shared between the two threads, the `Server` class contains a non-recursive reader-writer lock, `Server->qrwlVoiceThread`. This lock provides synchronization between the main thread and the voice thread. These are the only two threads that access a `Server`'s data. The easiest way to understand the locking strategy and synchronization between the main thread and the `Server`'s voice thread is by using the concept of ownership. ## Understanding data ownership in Murmur A thread owning an object means that it is the only thread that is allowed to write to that object. To make changes to it. Most data in the `Server` class is owned by the main thread. That means that the main thread is the only thread that writes/updates those structures. When processing incoming voice data (and re- broadcasting that voice data), the `Server`'s voice thread needs to access various parts of `Server`'s data. To ensure correct synchronization between the two threads it is important that the rules for accessing data in `Server` are clearly documented. Most of these ownership rules relate to the use of `Server->qrwlVoiceThread` mentioned earlier. It is the main reader/writer lock between the voice thread and the main thread. It is important to know *how* exactly Murmur uses this lock, because it is not immediately obvious. Since the data protected by `Server->qrwlVoiceThread` is only ever accessed by two threads, Murmur is clever in the way that it uses the lock. It uses the ownership rule defined above ("a thread owning an object means that it is the only thread allowed to write to that object") to avoid taking locks in some situations. This is to avoid littering the code with locks, but also to avoid deadlocks and/or misuse of the non-recursive reader/write locker. When reading data in the main thread that Murmur knows is only ever written to by the main thread (that is, the data is *owned* by the main thread), Murmur will avoid taking a read lock on `Server->qrwlVoiceThread`. However, not all data in `Server` is owned by the main thread. When data is owned by the voice thread, the same kind of rule applies. The voice thread will not take a read lock when reading data that it knows only *it* will write to. This behavior is not immediately obvious, but it is important to know for understanding how the `Server->qrwlVoiceThread` lock is used throughout the code base. Another important detail to keep in mind is that while the main thread can avoid locking `Server->qrwlVoiceThread` during most of its operation, the opposite it true for the voice thread. Most of the time, when processing incoming packets, and especially in the `void Server::processMsg(ServerUser *u, const char *data, int len)` method, the voice thread holds a read lock `Server->qrwlVoiceThread`. This is to ensure that the main thread is properly excluded when the voice thread is reading data, and the voice thread is excluded when the main thread is writing data. ## Ownership of shared data between multiple threads This section documents the owners of data in Murmur that is accessed by multiple threads at once. It documents how one should synchronize access to that data to avoid introducing data races in Murmur. ### Data owned by the voice thread These are never accessed by the main thread, except in `ServerUser`'s constructor. There is no synchronization on these. - `ServerUser->sUdpSocket` - `ServerUser->saiUdpAddress` ### Data owned by the main thread The rules for accessing these objects are: - To read from the main thread: No lock is required. A read lock is implied because the main thread is the owner. - To read from the voice thread: The voice thread must hold read lock on qrwlVoiceThread. - To write from the main thread: The main thread must hold write lock on qrwlVoiceThread. - To write from the voice thread: Illegal. Disallowed. The objects are: - `Server->qhUsers` - `Server->qhChannels` - `ServerUser->uiSession` - `ServerUser->sState` - `ServerUser->bMute` - `ServerUser->bSuppress` - `ServerUser->bSelfMute` - `ServerUser->bDeaf` - `ServerUser->bSelfDeaf` - `ServerUser->ssContext` - `ServerUser->cChannel` - `ServerUser->qmTargets` - `ServerUser->qmWhisperRedirect` - `Channel->qlUsers` - `Channel->qhLinks` - `Channel->qhPermLinks` - `Channel->qlChannels` - `Channel->qhGroups` - `Channel->qlACL` - `WhisperTarget->qlChannels` - `WhisperTarget->bLinks` - `WhisperTarget->bChildren` - `WhisperTarget->qlSessions` ### Data with shared ownership (main thread and voice thread) The rules for accessing these objects are: - To read from the main thread: The main thread must hold a read lock on qrwlVoiceThread. - To read from the voice thread: The voice thread must hold a read lock on qrwlVoiceThread. - To write from the main thread: The main thread must hold a write lock on qrwlVoiceThread. - To write from the voice thread: The voice thread must hold a write lock on qrwlVoiceThread. The objects with shared ownership are: - `Server->qhHostUsers` - `Server->qhPeerUsers` - `ServerUser->qmTargetCache` ### Data with no ownership (synchronized via atomic types) These objects are explicitly synchronized by using atomic types and need no extra synchronization when read or written to. The objects are: - `ServerUser->aiUdpFlag` ### Data with no ownership (synchronized via mutexes) These objects use their own locking schemes. This is can be an internal mutex that is automatically taken when the object's methods are called. It can also be an external mutex that must be held before accessing the object itself. - `ServerUser->csCrypt` (Locked via `User->qmCrypt` mutex.) - `ServerUser->bwr` (Internal locking inside `BandwidthRecord`. All methods can be called without extra synchronization.) - `Server->acCache` (Locked via `Server->qmCache` mutex.) mumble-1.3.4/man/0000775000175000017500000000000014010707273013414 5ustar builderbuildermumble-1.3.4/man/mumble-overlay.10000664000175000017500000000163614010707273016444 0ustar builderbuilder.TH mumble\-overlay 1 "2015 December 27" .SH NAME mumble\-overlay \- load OpenGL overlay for Mumble. .SH SYNOPSIS .B mumble\-overlay .RI "executable" .SH DESCRIPTION This wrapper will load the OpenGL overlay for Mumble into the application of your choice. This allows you to easily see who is talking even in fullscreen games and applications. .PP Nothing will be shown unless you have Mumble running and it is currently connected to a server. .SH ENVIRONMENT VARIABLES .TP .B MUMBLE_OVERLAY_DEBUG If this environment variable is set, extended debugging will be output to standard output. Only useful for debugging. .SH EXAMPLE To run glxgears with the mumble\-overlay active: .IP mumble\-overlay glxgears .SH NOTES This will only work with OpenGL drivers which support the full OpenGL and GLX specifications. .SH SEE ALSO .BR mumble (1), .BR murmurd (1). .SH AUTHORS mumble and murmurd were written by The Mumble Developers. mumble-1.3.4/man/mumble.10000664000175000017500000000210414010707273014754 0ustar builderbuilder.TH MUMBLE 1 "2016 May 9" .SH NAME mumble - a low-latency, high quality voice chat program .SH SYNOPSIS .B mumble [\fB\-m\fR|\fB\-\-multiple\fR] [\fB\-n\fR|\fB\-\-noidentity\fR] [\fBURL\fR] .br .B mumble \fB\-h\fR|\fB\-\-help .SH DESCRIPTION Mumble is an open source, low-latency, high quality voice chat software primarily intended for use while gaming. .SH OPTIONS .TP .B \-h, \-\-help Display help and exit. .TP .B \-m, \-\-multiple Allow multiple instances of the client to be started. .TP .B \-n, \-\-noidentity Suppress loading of identity files (i.e., certificates.) .P .B URL specifies a URL to connect to after startup instead of showing the connection window. .SH RPC CONTROL .P It is possible to remote control a running instance of Mumble using the following command: .P .B mumble rpc [\fBACTION\fR] .P Where \fBACTION\fR is one of the following: .RS .TP .B mute Mute self .TP .B unmute Unmute self .TP .B deaf Deafen self .TP .B undeaf Undeafen self .RE .SH SEE ALSO .BR mumble\-overlay (1), .BR murmurd (1). .SH AUTHORS mumble and murmurd were written by The Mumble Developers. mumble-1.3.4/man/murmurd.10000664000175000017500000000536414010707273015201 0ustar builderbuilder.TH murmurd 1 "2016 May 9" .SH NAME murmurd - VoIP server. .SH SYNOPSIS .B murmurd [\fB-ini \fIinifile\fR] [\fB-fg\fR] [\fB-v\fR] .br .B murmurd \-supw\fR \fIpassword\fR [\fIserverid\fR] .br .B murmurd \-readsupw\fR [\fIserverid\fR] .br .B murmurd \-disablesu\fR [\fIserverid\fR] .br .B murmurd \-limits .br .B murmurd \-wipessl .br .B murmurd \-wipelogs .br .B murmurd \-version\fR|\fB\-\-version .br .B murmurd \-h\fR|\fB\-help\fR|\fB\-\-help .SH DESCRIPTION Murmur is the server component of Mumble, a low-latency, high quality VoIP application. .SH OPTIONS .TP .B \-h, \-help, \-\-help Show a summary of the options. .TP .B \-ini \fIinifile Specify which ini file to use. Without this option, murmur will search for a murmur.ini file and will fall back to builtin defaults if one isn't found. .TP .B \-fg Run in the foreground (do not fork). .TP .B \-v Verbose mode, slightly more information is logged. .TP .B \-supw \fIpassword\fR [\fIserverid\fR] This sets the SuperUser password for a server. SuperUser is a special account (similar to root) which bypasses all access controls. This command may be used while the server is running. Optionally takes a \fIserverid\fR representing the virtual server to set the password for. .TP .B \-readsupw\fR\ [\fIserverid\fR] Reads SuperUser password from stdin. Optionally takes a \fIserverid\fR representing the virtual server to set the password for. .TP .B \-disablesu\fR\ [\fIserverid\fR] Disables the SuperUser account. Optionally takes a \fIserverid\fR representing the virtual server to disable the SuperUser account on. Disabling the SuperUser account makes it impossible to log in as SuperUser until a new password is set. You can set a new SuperUser password with the \-supw parameter. .TP .B \-limits Tests and shows how many file descriptors and threads can be created. The purpose of this option is to test how many clients Murmur can handle. Murmur will exit after this test. .TP .B \-wipessl Remove SSL certificates from database. .TP .B \-wipelogs Remove all log entries from database. .TP .B \-version, \-\-version Show version information. .SH SIGNALS .TP .BR SIGHUP Perform a log rotation. This causes murmurd to re-open its log file. .TP .BR SIGUSR1 Gracefully reload the TLS settings specified in murmur.ini without interrupting service. When this signal is received, Murmur will apply the new TLS settings (certificate, private key, and Diffie-Hellman parameters) to all virtual servers that use the TLS settings from murmur.ini. Virtual servers that have overridden the settings from murmur.ini will not be affected by this signal. Those servers can be updated using the updateCertificate RPC call. .SH SEE ALSO .BR mumble (1), .BR murmur\-user\-wrapper (1). .br .SH AUTHORS mumble and murmurd were written by The Mumble Developers. mumble-1.3.4/man/murmur-user-wrapper.10000664000175000017500000000270014010707273017456 0ustar builderbuilder.TH murmur\-user\-wrapper 1 "2015 December 27" .SH NAME murmur\-user\-wrapper \- User wrapper for murmurd. .SH SYNOPSIS .B murmur\-user\-wrapper .RI [ options ] .SH DESCRIPTION Murmur is the server component of Mumble, a low\-latency, high quality VoIP application. Murmur\-wrapper is a wrapper script to make it easier for normal users to set up their own, private murmur server. .SH OPTIONS .TP .BI \-d \ "directory" Set directory to use. By default, the wrapper script uses $HOME/murmur .TP .B \-s Check if murmur process is running. .TP .B \-k Terminate running murmur process. .TP .B \-i Initialize only, do not start the server. .TP .BI \-p \ "password" Specify password for the SuperUser account and exit. SuperUser is the mumble equivalent of root, a special user which bypasses all access restrictions. .SH NOTES To create your own private server, you first want to run .IP murmur\-user\-wrapper \-i .LP Then edit ~/murmur/murmur.ini to set the various configuration settings. The most important is probably the port; unless you're the only murmur process running on this server, you'll need to change it. When you're happy with your settings, you need to set the password for SuperUser, which is your administrator account. .IP murmur\-user\-wrapper \-p .I "" .LP Once this is done, simply run .IP murmur\-user\-wrapper .LP to start the server. .SH SEE ALSO .BR murmurd (1). .br .SH AUTHORS mumble and murmurd were written by The Mumble Developers. mumble-1.3.4/3rdPartyLicenses/0000775000175000017500000000000014010707273016037 5ustar builderbuildermumble-1.3.4/3rdPartyLicenses/cc_by_sa_40_legalcode.txt0000664000175000017500000003717514010707273022661 0ustar builderbuilderCreative Commons Attribution-ShareAlike 4.0 International Public License By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-ShareAlike 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. Section 1 -- Definitions. a. Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. b. Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. c. BY-SA Compatible License means a license listed at creativecommons.org/compatiblelicenses, approved by Creative Commons as essentially the equivalent of this Public License. d. Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. e. Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. f. Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. g. License Elements means the license attributes listed in the name of a Creative Commons Public License. The License Elements of this Public License are Attribution and ShareAlike. h. Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License. i. Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. j. Licensor means the individual(s) or entity(ies) granting rights under this Public License. k. Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. l. Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. m. You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning. Section 2 -- Scope. a. License grant. 1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: a. reproduce and Share the Licensed Material, in whole or in part; and b. produce, reproduce, and Share Adapted Material. 2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. 3. Term. The term of this Public License is specified in Section 6(a). 4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a) (4) never produces Adapted Material. 5. Downstream recipients. a. Offer from the Licensor -- Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. b. Additional offer from the Licensor -- Adapted Material. Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapter's License You apply. c. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. 6. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). b. Other rights. 1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. 2. Patent and trademark rights are not licensed under this Public License. 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties. Section 3 -- License Conditions. Your exercise of the Licensed Rights is expressly made subject to the following conditions. a. Attribution. 1. If You Share the Licensed Material (including in modified form), You must: a. retain the following if it is supplied by the Licensor with the Licensed Material: i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); ii. a copyright notice; iii. a notice that refers to this Public License; iv. a notice that refers to the disclaimer of warranties; v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; b. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and c. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. 2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. 3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. b. ShareAlike. In addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply. 1. The Adapter's License You apply must be a Creative Commons license with the same License Elements, this version or later, or a BY-SA Compatible License. 2. You must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material. 3. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply. Section 4 -- Sui Generis Database Rights. Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database; b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, including for purposes of Section 3(b); and c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. Section 5 -- Disclaimer of Warranties and Limitation of Liability. a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. Section 6 -- Term and Termination. a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: 1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or 2. upon express reinstatement by the Licensor. For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. c. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. d. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. Section 7 -- Other Terms and Conditions. a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. Section 8 -- Interpretation. a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. mumble-1.3.4/3rdPartyLicenses/libvorbis_license.txt0000664000175000017500000000267614010707273022310 0ustar builderbuilderCopyright (c) 2002-2008 Xiph.org Foundation Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. mumble-1.3.4/3rdPartyLicenses/harfbuzzng_license.txt0000664000175000017500000000323214010707273022462 0ustar builderbuilderHarfBuzz is licensed under the so-called "Old MIT" license. Details follow. For parts of HarfBuzz that are licensed under different licenses see individual files names COPYING in subdirectories where applicable. Copyright © 2010,2011,2012 Google, Inc. Copyright © 2012 Mozilla Foundation Copyright © 2011 Codethink Limited Copyright © 2008,2010 Nokia Corporation and/or its subsidiary(-ies) Copyright © 2009 Keith Stribley Copyright © 2009 Martin Hosken and SIL International Copyright © 2007 Chris Wilson Copyright © 2006 Behdad Esfahbod Copyright © 2005 David Turner Copyright © 2004,2007,2008,2009,2010 Red Hat, Inc. Copyright © 1998-2004 David Turner and Werner Lemberg For full copyright notices consult the individual files in the package. Permission is hereby granted, without written agreement and without license or royalty fees, to use, copy, modify, and distribute this software and its documentation for any purpose, provided that the above copyright notice and the following two paragraphs appear in all copies of this software. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. mumble-1.3.4/3rdPartyLicenses/mariadb_c_connector_license.txt0000664000175000017500000000131114010707273024251 0ustar builderbuilderThis library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA mumble-1.3.4/3rdPartyLicenses/xar_license.txt0000664000175000017500000000313414010707273021075 0ustar builderbuilder/* * Copyright (c) 2005-2007 Rob Braun * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of Rob Braun nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * 03-Apr-2005 * DRI: Rob Braun */ mumble-1.3.4/3rdPartyLicenses/protobuf_license.txt0000664000175000017500000000412514010707273022144 0ustar builderbuilderThis license applies to all parts of Protocol Buffers except the following: - Atomicops support for generic gcc, located in src/google/protobuf/stubs/atomicops_internals_generic_gcc.h. This file is copyrighted by Red Hat Inc. - Atomicops support for AIX/POWER, located in src/google/protobuf/stubs/atomicops_internals_power.h. This file is copyrighted by Bloomberg Finance LP. Copyright 2014, Google Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Code generated by the Protocol Buffer compiler is owned by the owner of the input file used when generating it. This code is not standalone and requires a support library to be linked with it. This support library is itself covered by the above license. mumble-1.3.4/3rdPartyLicenses/libfuse_license.txt0000664000175000017500000006410114010707273021735 0ustar builderbuilderFUSE: Filesystem in Userspace Copyright (C) 2001-2007 Miklos Szeredi This program can be distributed under the terms of the GNU LGPLv2. GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! mumble-1.3.4/3rdPartyLicenses/glib_license.txt0000664000175000017500000006131414010707273021224 0ustar builderbuilder GNU LIBRARY GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the library GPL. It is numbered 2 because it goes with version 2 of the ordinary GPL.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Library General Public License, applies to some specially designated Free Software Foundation software, and to any other libraries whose authors decide to use it. You can use it for your libraries, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library, or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link a program with the library, you must provide complete object files to the recipients so that they can relink them with the library, after making changes to the library and recompiling it. And you must show them these terms so they know their rights. Our method of protecting your rights has two steps: (1) copyright the library, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the library. Also, for each distributor's protection, we want to make certain that everyone understands that there is no warranty for this free library. If the library is modified by someone else and passed on, we want its recipients to know that what they have is not the original version, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that companies distributing free software will individually obtain patent licenses, thus in effect transforming the program into proprietary software. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License, which was designed for utility programs. This license, the GNU Library General Public License, applies to certain designated libraries. This license is quite different from the ordinary one; be sure to read it in full, and don't assume that anything in it is the same as in the ordinary license. The reason we have a separate public license for some libraries is that they blur the distinction we usually make between modifying or adding to a program and simply using it. Linking a program with a library, without changing the library, is in some sense simply using the library, and is analogous to running a utility program or application program. However, in a textual and legal sense, the linked executable is a combined work, a derivative of the original library, and the ordinary General Public License treats it as such. Because of this blurred distinction, using the ordinary General Public License for libraries did not effectively promote software sharing, because most developers did not use the libraries. We concluded that weaker conditions might promote sharing better. However, unrestricted linking of non-free programs would deprive the users of those programs of all benefit from the free status of the libraries themselves. This Library General Public License is intended to permit developers of non-free programs to use free libraries, while preserving your freedom as a user of such programs to change the free libraries that are incorporated in them. (We have not seen how to achieve this as regards changes in header files, but we have achieved it as regards changes in the actual functions of the Library.) The hope is that this will lead to faster development of free libraries. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, while the latter only works together with the library. Note that it is possible for a library to be covered by the ordinary General Public License rather than by this special one. GNU LIBRARY GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Library General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also compile or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. c) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. d) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Library General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307 USA. Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! mumble-1.3.4/3rdPartyLicenses/libflac_license.txt0000664000175000017500000000272614010707273021705 0ustar builderbuilderCopyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. mumble-1.3.4/3rdPartyLicenses/libdaemon_license.txt0000664000175000017500000006573214010707273022251 0ustar builderbuilderCopyright 2003-2009 Lennart Poettering This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 2.1 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! mumble-1.3.4/3rdPartyLicenses/mach_override_license.txt0000664000175000017500000000210714010707273023111 0ustar builderbuilderCopyright (c) 2003-2009 Jonathan 'Wolf' Rentzsch Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. mumble-1.3.4/3rdPartyLicenses/mdnsresponder_license.txt0000664000175000017500000000133214010707273023164 0ustar builderbuilderThe majority of the source code in the mDNSResponder project is licensed under the terms of the Apache License, Version 2.0, available from: To accommodate license compatibility with the widest possible range of client code licenses, the shared library code, which is linked at runtime into the same address space as the client using it, is licensed under the terms of the "Three-Clause BSD License". The Linux Name Service Switch code, contributed by National ICT Australia Ltd (NICTA) is licensed under the terms of the NICTA Public Software Licence (which is substantially similar to the "Three-Clause BSD License", with some additional language pertaining to Australian law). mumble-1.3.4/3rdPartyLicenses/libffi_license.txt0000664000175000017500000000215414010707273021537 0ustar builderbuilderlibffi - Copyright (c) 1996-2014 Anthony Green, Red Hat, Inc and others. See source files for details. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. mumble-1.3.4/3rdPartyLicenses/bzip2_license.txt0000664000175000017500000000332414010707273021332 0ustar builderbuilderThis program, "bzip2", the associated library "libbzip2", and all documentation, are copyright (C) 1996-2010 Julian R Seward. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 3. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Julian Seward, jseward@bzip.org bzip2/libbzip2 version 1.0.6 of 6 September 2010 mumble-1.3.4/3rdPartyLicenses/libsndfile_license.txt0000664000175000017500000000137714010707273022425 0ustar builderbuilderCopyright (C) 1999-2011 Erik de Castro Lopo This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. mumble-1.3.4/3rdPartyLicenses/appimage_runtime_license.txt0000664000175000017500000000214614010707273023633 0ustar builderbuilderCopyright (c) 2004-17 Simon Peter Portions Copyright (c) 2007 Alexander Larsson All Rights Reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. mumble-1.3.4/3rdPartyLicenses/pcre_license.txt0000664000175000017500000000615614010707273021243 0ustar builderbuilderPCRE LICENCE ------------ PCRE is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. Release 8 of PCRE is distributed under the terms of the "BSD" licence, as specified below. The documentation for PCRE, supplied in the "doc" directory, is distributed under the same terms as the software itself. The data in the testdata directory is not copyrighted and is in the public domain. The basic library functions are written in C and are freestanding. Also included in the distribution is a set of C++ wrapper functions, and a just-in-time compiler that can be used to optimize pattern matching. These are both optional features that can be omitted when the library is built. THE BASIC LIBRARY FUNCTIONS --------------------------- Written by: Philip Hazel Email local part: ph10 Email domain: cam.ac.uk University of Cambridge Computing Service, Cambridge, England. Copyright (c) 1997-2017 University of Cambridge All rights reserved. PCRE JUST-IN-TIME COMPILATION SUPPORT ------------------------------------- Written by: Zoltan Herczeg Email local part: hzmester Emain domain: freemail.hu Copyright(c) 2010-2017 Zoltan Herczeg All rights reserved. STACK-LESS JUST-IN-TIME COMPILER -------------------------------- Written by: Zoltan Herczeg Email local part: hzmester Emain domain: freemail.hu Copyright(c) 2009-2017 Zoltan Herczeg All rights reserved. THE C++ WRAPPER FUNCTIONS ------------------------- Contributed by: Google Inc. Copyright (c) 2007-2012, Google Inc. All rights reserved. THE "BSD" LICENCE ----------------- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the University of Cambridge nor the name of Google Inc. nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. End mumble-1.3.4/3rdPartyLicenses/libjpeg_turbo_license.txt0000664000175000017500000004171414010707273023140 0ustar builderbuilderlibjpeg-turbo is covered by three compatible BSD-style open source licenses: 1. The IJG (Independent JPEG Group) License. This license applies to the libjpeg API library and associated programs (any code inherited from libjpeg, and any modifications to that code.) 2. The Modified (3-clause) BSD License This license covers the TurboJPEG API library and associated programs. 3. The zlib License This license is a subset of the other two, and it covers the libjpeg-turbo SIMD extensions. -----BEGIN IJG LICENSE----- libjpeg-turbo note: This file has been modified by The libjpeg-turbo Project to include only information relevant to libjpeg-turbo, to wordsmith certain sections, and to remove impolitic language that existed in the libjpeg v8 README. It is included only for reference. Please see README.md for information specific to libjpeg-turbo. The Independent JPEG Group's JPEG software ========================================== This distribution contains a release of the Independent JPEG Group's free JPEG software. You are welcome to redistribute this software and to use it for any purpose, subject to the conditions under LEGAL ISSUES, below. This software is the work of Tom Lane, Guido Vollbeding, Philip Gladstone, Bill Allombert, Jim Boucher, Lee Crocker, Bob Friesenhahn, Ben Jackson, Julian Minguillon, Luis Ortiz, George Phillips, Davide Rossi, Ge' Weijers, and other members of the Independent JPEG Group. IJG is not affiliated with the ISO/IEC JTC1/SC29/WG1 standards committee (also known as JPEG, together with ITU-T SG16). DOCUMENTATION ROADMAP ===================== This file contains the following sections: OVERVIEW General description of JPEG and the IJG software. LEGAL ISSUES Copyright, lack of warranty, terms of distribution. REFERENCES Where to learn more about JPEG. ARCHIVE LOCATIONS Where to find newer versions of this software. FILE FORMAT WARS Software *not* to get. TO DO Plans for future IJG releases. Other documentation files in the distribution are: User documentation: usage.txt Usage instructions for cjpeg, djpeg, jpegtran, rdjpgcom, and wrjpgcom. *.1 Unix-style man pages for programs (same info as usage.txt). wizard.txt Advanced usage instructions for JPEG wizards only. change.log Version-to-version change highlights. Programmer and internal documentation: libjpeg.txt How to use the JPEG library in your own programs. example.c Sample code for calling the JPEG library. structure.txt Overview of the JPEG library's internal structure. coderules.txt Coding style rules --- please read if you contribute code. Please read at least usage.txt. Some information can also be found in the JPEG FAQ (Frequently Asked Questions) article. See ARCHIVE LOCATIONS below to find out where to obtain the FAQ article. If you want to understand how the JPEG code works, we suggest reading one or more of the REFERENCES, then looking at the documentation files (in roughly the order listed) before diving into the code. OVERVIEW ======== This package contains C software to implement JPEG image encoding, decoding, and transcoding. JPEG (pronounced "jay-peg") is a standardized compression method for full-color and grayscale images. JPEG's strong suit is compressing photographic images or other types of images that have smooth color and brightness transitions between neighboring pixels. Images with sharp lines or other abrupt features may not compress well with JPEG, and a higher JPEG quality may have to be used to avoid visible compression artifacts with such images. JPEG is lossy, meaning that the output pixels are not necessarily identical to the input pixels. However, on photographic content and other "smooth" images, very good compression ratios can be obtained with no visible compression artifacts, and extremely high compression ratios are possible if you are willing to sacrifice image quality (by reducing the "quality" setting in the compressor.) This software implements JPEG baseline, extended-sequential, and progressive compression processes. Provision is made for supporting all variants of these processes, although some uncommon parameter settings aren't implemented yet. We have made no provision for supporting the hierarchical or lossless processes defined in the standard. We provide a set of library routines for reading and writing JPEG image files, plus two sample applications "cjpeg" and "djpeg", which use the library to perform conversion between JPEG and some other popular image file formats. The library is intended to be reused in other applications. In order to support file conversion and viewing software, we have included considerable functionality beyond the bare JPEG coding/decoding capability; for example, the color quantization modules are not strictly part of JPEG decoding, but they are essential for output to colormapped file formats or colormapped displays. These extra functions can be compiled out of the library if not required for a particular application. We have also included "jpegtran", a utility for lossless transcoding between different JPEG processes, and "rdjpgcom" and "wrjpgcom", two simple applications for inserting and extracting textual comments in JFIF files. The emphasis in designing this software has been on achieving portability and flexibility, while also making it fast enough to be useful. In particular, the software is not intended to be read as a tutorial on JPEG. (See the REFERENCES section for introductory material.) Rather, it is intended to be reliable, portable, industrial-strength code. We do not claim to have achieved that goal in every aspect of the software, but we strive for it. We welcome the use of this software as a component of commercial products. No royalty is required, but we do ask for an acknowledgement in product documentation, as described under LEGAL ISSUES. LEGAL ISSUES ============ In plain English: 1. We don't promise that this software works. (But if you find any bugs, please let us know!) 2. You can use this software for whatever you want. You don't have to pay us. 3. You may not pretend that you wrote this software. If you use it in a program, you must acknowledge somewhere in your documentation that you've used the IJG code. In legalese: The authors make NO WARRANTY or representation, either express or implied, with respect to this software, its quality, accuracy, merchantability, or fitness for a particular purpose. This software is provided "AS IS", and you, its user, assume the entire risk as to its quality and accuracy. This software is copyright (C) 1991-2016, Thomas G. Lane, Guido Vollbeding. All Rights Reserved except as specified below. Permission is hereby granted to use, copy, modify, and distribute this software (or portions thereof) for any purpose, without fee, subject to these conditions: (1) If any part of the source code for this software is distributed, then this README file must be included, with this copyright and no-warranty notice unaltered; and any additions, deletions, or changes to the original files must be clearly indicated in accompanying documentation. (2) If only executable code is distributed, then the accompanying documentation must state that "this software is based in part on the work of the Independent JPEG Group". (3) Permission for use of this software is granted only if the user accepts full responsibility for any undesirable consequences; the authors accept NO LIABILITY for damages of any kind. These conditions apply to any software derived from or based on the IJG code, not just to the unmodified library. If you use our work, you ought to acknowledge us. Permission is NOT granted for the use of any IJG author's name or company name in advertising or publicity relating to this software or products derived from it. This software may be referred to only as "the Independent JPEG Group's software". We specifically permit and encourage the use of this software as the basis of commercial products, provided that all warranty or liability claims are assumed by the product vendor. The Unix configuration script "configure" was produced with GNU Autoconf. It is copyright by the Free Software Foundation but is freely distributable. The same holds for its supporting scripts (config.guess, config.sub, ltmain.sh). Another support script, install-sh, is copyright by X Consortium but is also freely distributable. The IJG distribution formerly included code to read and write GIF files. To avoid entanglement with the Unisys LZW patent (now expired), GIF reading support has been removed altogether, and the GIF writer has been simplified to produce "uncompressed GIFs". This technique does not use the LZW algorithm; the resulting GIF files are larger than usual, but are readable by all standard GIF decoders. We are required to state that "The Graphics Interchange Format(c) is the Copyright property of CompuServe Incorporated. GIF(sm) is a Service Mark property of CompuServe Incorporated." REFERENCES ========== We recommend reading one or more of these references before trying to understand the innards of the JPEG software. The best short technical introduction to the JPEG compression algorithm is Wallace, Gregory K. "The JPEG Still Picture Compression Standard", Communications of the ACM, April 1991 (vol. 34 no. 4), pp. 30-44. (Adjacent articles in that issue discuss MPEG motion picture compression, applications of JPEG, and related topics.) If you don't have the CACM issue handy, a PDF file containing a revised version of Wallace's article is available at http://www.ijg.org/files/Wallace.JPEG.pdf. The file (actually a preprint for an article that appeared in IEEE Trans. Consumer Electronics) omits the sample images that appeared in CACM, but it includes corrections and some added material. Note: the Wallace article is copyright ACM and IEEE, and it may not be used for commercial purposes. A somewhat less technical, more leisurely introduction to JPEG can be found in "The Data Compression Book" by Mark Nelson and Jean-loup Gailly, published by M&T Books (New York), 2nd ed. 1996, ISBN 1-55851-434-1. This book provides good explanations and example C code for a multitude of compression methods including JPEG. It is an excellent source if you are comfortable reading C code but don't know much about data compression in general. The book's JPEG sample code is far from industrial-strength, but when you are ready to look at a full implementation, you've got one here... The best currently available description of JPEG is the textbook "JPEG Still Image Data Compression Standard" by William B. Pennebaker and Joan L. Mitchell, published by Van Nostrand Reinhold, 1993, ISBN 0-442-01272-1. Price US$59.95, 638 pp. The book includes the complete text of the ISO JPEG standards (DIS 10918-1 and draft DIS 10918-2). The original JPEG standard is divided into two parts, Part 1 being the actual specification, while Part 2 covers compliance testing methods. Part 1 is titled "Digital Compression and Coding of Continuous-tone Still Images, Part 1: Requirements and guidelines" and has document numbers ISO/IEC IS 10918-1, ITU-T T.81. Part 2 is titled "Digital Compression and Coding of Continuous-tone Still Images, Part 2: Compliance testing" and has document numbers ISO/IEC IS 10918-2, ITU-T T.83. The JPEG standard does not specify all details of an interchangeable file format. For the omitted details we follow the "JFIF" conventions, revision 1.02. JFIF 1.02 has been adopted as an Ecma International Technical Report and thus received a formal publication status. It is available as a free download in PDF format from http://www.ecma-international.org/publications/techreports/E-TR-098.htm. A PostScript version of the JFIF document is available at http://www.ijg.org/files/jfif.ps.gz. There is also a plain text version at http://www.ijg.org/files/jfif.txt.gz, but it is missing the figures. The TIFF 6.0 file format specification can be obtained by FTP from ftp://ftp.sgi.com/graphics/tiff/TIFF6.ps.gz. The JPEG incorporation scheme found in the TIFF 6.0 spec of 3-June-92 has a number of serious problems. IJG does not recommend use of the TIFF 6.0 design (TIFF Compression tag 6). Instead, we recommend the JPEG design proposed by TIFF Technical Note #2 (Compression tag 7). Copies of this Note can be obtained from http://www.ijg.org/files/. It is expected that the next revision of the TIFF spec will replace the 6.0 JPEG design with the Note's design. Although IJG's own code does not support TIFF/JPEG, the free libtiff library uses our library to implement TIFF/JPEG per the Note. ARCHIVE LOCATIONS ================= The "official" archive site for this software is www.ijg.org. The most recent released version can always be found there in directory "files". The JPEG FAQ (Frequently Asked Questions) article is a source of some general information about JPEG. It is available on the World Wide Web at http://www.faqs.org/faqs/jpeg-faq/ and other news.answers archive sites, including the official news.answers archive at rtfm.mit.edu: ftp://rtfm.mit.edu/pub/usenet/news.answers/jpeg-faq/. If you don't have Web or FTP access, send e-mail to mail-server@rtfm.mit.edu with body send usenet/news.answers/jpeg-faq/part1 send usenet/news.answers/jpeg-faq/part2 FILE FORMAT WARS ================ The ISO/IEC JTC1/SC29/WG1 standards committee (also known as JPEG, together with ITU-T SG16) currently promotes different formats containing the name "JPEG" which are incompatible with original DCT-based JPEG. IJG therefore does not support these formats (see REFERENCES). Indeed, one of the original reasons for developing this free software was to help force convergence on common, interoperable format standards for JPEG files. Don't use an incompatible file format! (In any case, our decoder will remain capable of reading existing JPEG image files indefinitely.) TO DO ===== Please send bug reports, offers of help, etc. to jpeg-info@jpegclub.org. -----END IJG LICENSE----- -----BEGIN TURBOJPEG LICENSE----- /* * Copyright (C)2009-2016 D. R. Commander. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither the name of the libjpeg-turbo Project nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS", * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ -----END TURBOJPEG LICENSE----- -----BEGIN ZLIB LICENSE----- ; Copyright 2009 Pierre Ossman for Cendio AB ; Copyright (C) 2010, D. R. Commander. ; ; Based on the x86 SIMD extension for IJG JPEG library - version 1.02 ; ; Copyright (C) 1999-2006, MIYASAKA Masaru. ; ; This software is provided 'as-is', without any express or implied ; warranty. In no event will the authors be held liable for any damages ; arising from the use of this software. ; ; Permission is granted to anyone to use this software for any purpose, ; including commercial applications, and to alter it and redistribute it ; freely, subject to the following restrictions: ; ; 1. The origin of this software must not be misrepresented; you must not ; claim that you wrote the original software. If you use this software ; in a product, an acknowledgment in the product documentation would be ; appreciated but is not required. ; 2. Altered source versions must be plainly marked as such, and must not be ; misrepresented as being the original software. ; 3. This notice may not be removed or altered from any source distribution. -----END ZLIB LICENSE----- mumble-1.3.4/3rdPartyLicenses/avahi_license.txt0000664000175000017500000000132214010707273021370 0ustar builderbuilderCopyright 2004-2015 by the Avahi developers. avahi is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. avahi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with avahi; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. mumble-1.3.4/3rdPartyLicenses/freetype_license.txt0000664000175000017500000001512614010707273022132 0ustar builderbuilder The FreeType Project LICENSE ---------------------------- 2006-Jan-27 Copyright 1996-2002, 2006 by David Turner, Robert Wilhelm, and Werner Lemberg Introduction ============ The FreeType Project is distributed in several archive packages; some of them may contain, in addition to the FreeType font engine, various tools and contributions which rely on, or relate to, the FreeType Project. This license applies to all files found in such packages, and which do not fall under their own explicit license. The license affects thus the FreeType font engine, the test programs, documentation and makefiles, at the very least. This license was inspired by the BSD, Artistic, and IJG (Independent JPEG Group) licenses, which all encourage inclusion and use of free software in commercial and freeware products alike. As a consequence, its main points are that: o We don't promise that this software works. However, we will be interested in any kind of bug reports. (`as is' distribution) o You can use this software for whatever you want, in parts or full form, without having to pay us. (`royalty-free' usage) o You may not pretend that you wrote this software. If you use it, or only parts of it, in a program, you must acknowledge somewhere in your documentation that you have used the FreeType code. (`credits') We specifically permit and encourage the inclusion of this software, with or without modifications, in commercial products. We disclaim all warranties covering The FreeType Project and assume no liability related to The FreeType Project. Finally, many people asked us for a preferred form for a credit/disclaimer to use in compliance with this license. We thus encourage you to use the following text: """ Portions of this software are copyright © The FreeType Project (www.freetype.org). All rights reserved. """ Please replace with the value from the FreeType version you actually use. Legal Terms =========== 0. Definitions -------------- Throughout this license, the terms `package', `FreeType Project', and `FreeType archive' refer to the set of files originally distributed by the authors (David Turner, Robert Wilhelm, and Werner Lemberg) as the `FreeType Project', be they named as alpha, beta or final release. `You' refers to the licensee, or person using the project, where `using' is a generic term including compiling the project's source code as well as linking it to form a `program' or `executable'. This program is referred to as `a program using the FreeType engine'. This license applies to all files distributed in the original FreeType Project, including all source code, binaries and documentation, unless otherwise stated in the file in its original, unmodified form as distributed in the original archive. If you are unsure whether or not a particular file is covered by this license, you must contact us to verify this. The FreeType Project is copyright (C) 1996-2000 by David Turner, Robert Wilhelm, and Werner Lemberg. All rights reserved except as specified below. 1. No Warranty -------------- THE FREETYPE PROJECT IS PROVIDED `AS IS' WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY DAMAGES CAUSED BY THE USE OR THE INABILITY TO USE, OF THE FREETYPE PROJECT. 2. Redistribution ----------------- This license grants a worldwide, royalty-free, perpetual and irrevocable right and license to use, execute, perform, compile, display, copy, create derivative works of, distribute and sublicense the FreeType Project (in both source and object code forms) and derivative works thereof for any purpose; and to authorize others to exercise some or all of the rights granted herein, subject to the following conditions: o Redistribution of source code must retain this license file (`FTL.TXT') unaltered; any additions, deletions or changes to the original files must be clearly indicated in accompanying documentation. The copyright notices of the unaltered, original files must be preserved in all copies of source files. o Redistribution in binary form must provide a disclaimer that states that the software is based in part of the work of the FreeType Team, in the distribution documentation. We also encourage you to put an URL to the FreeType web page in your documentation, though this isn't mandatory. These conditions apply to any software derived from or based on the FreeType Project, not just the unmodified files. If you use our work, you must acknowledge us. However, no fee need be paid to us. 3. Advertising -------------- Neither the FreeType authors and contributors nor you shall use the name of the other for commercial, advertising, or promotional purposes without specific prior written permission. We suggest, but do not require, that you use one or more of the following phrases to refer to this software in your documentation or advertising materials: `FreeType Project', `FreeType Engine', `FreeType library', or `FreeType Distribution'. As you have not signed this license, you are not required to accept it. However, as the FreeType Project is copyrighted material, only this license, or another one contracted with the authors, grants you the right to use, distribute, and modify it. Therefore, by using, distributing, or modifying the FreeType Project, you indicate that you understand and accept all the terms of this license. 4. Contacts ----------- There are two mailing lists related to FreeType: o freetype@nongnu.org Discusses general use and applications of FreeType, as well as future and wanted additions to the library and distribution. If you are looking for support, start in this list if you haven't found anything to help you in the documentation. o freetype-devel@nongnu.org Discusses bugs, as well as engine internals, design issues, specific licenses, porting, etc. Our home page can be found at http://www.freetype.org --- end of FTL.TXT --- mumble-1.3.4/3rdPartyLicenses/qt_license.txt0000664000175000017500000006431414010707273020736 0ustar builderbuilder GNU LESSER GENERAL PUBLIC LICENSE The Qt Toolkit is Copyright (C) 2015 The Qt Company Ltd. Contact: http://www.qt.io/licensing/ You may use, distribute and copy the Qt Toolkit under the terms of GNU Lesser General Public License version 2.1, which is displayed below. ------------------------------------------------------------------------- GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! mumble-1.3.4/3rdPartyLicenses/zlib_license.txt0000664000175000017500000000171214010707273021243 0ustar builderbuilder(C) 1995-2017 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Jean-loup Gailly Mark Adler jloup@gzip.org madler@alumni.caltech.edumumble-1.3.4/3rdPartyLicenses/libpng_license.txt0000664000175000017500000001153614010707273021563 0ustar builderbuilder This copy of the libpng notices is provided for your convenience. In case of any discrepancy between this copy and the notices in the file png.h that is included in the libpng distribution, the latter shall prevail. COPYRIGHT NOTICE, DISCLAIMER, and LICENSE: If you modify libpng you may insert additional notices immediately following this sentence. This code is released under the libpng license. libpng versions 1.0.7, July 1, 2000 through 1.6.28, January 5, 2017 are Copyright (c) 2000-2002, 2004, 2006-2017 Glenn Randers-Pehrson, are derived from libpng-1.0.6, and are distributed according to the same disclaimer and license as libpng-1.0.6 with the following individuals added to the list of Contributing Authors: Simon-Pierre Cadieux Eric S. Raymond Mans Rullgard Cosmin Truta Gilles Vollant James Yu Mandar Sahastrabuddhe and with the following additions to the disclaimer: There is no warranty against interference with your enjoyment of the library or against infringement. There is no warranty that our efforts or the library will fulfill any of your particular purposes or needs. This library is provided with all faults, and the entire risk of satisfactory quality, performance, accuracy, and effort is with the user. Some files in the "contrib" directory and some configure-generated files that are distributed with libpng have other copyright owners and are released under other open source licenses. libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from libpng-0.96, and are distributed according to the same disclaimer and license as libpng-0.96, with the following individuals added to the list of Contributing Authors: Tom Lane Glenn Randers-Pehrson Willem van Schaik libpng versions 0.89, June 1996, through 0.96, May 1997, are Copyright (c) 1996-1997 Andreas Dilger, are derived from libpng-0.88, and are distributed according to the same disclaimer and license as libpng-0.88, with the following individuals added to the list of Contributing Authors: John Bowler Kevin Bracey Sam Bushell Magnus Holmgren Greg Roelofs Tom Tanner Some files in the "scripts" directory have other copyright owners but are released under this license. libpng versions 0.5, May 1995, through 0.88, January 1996, are Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. For the purposes of this copyright and license, "Contributing Authors" is defined as the following set of individuals: Andreas Dilger Dave Martindale Guy Eric Schalnat Paul Schmidt Tim Wegner The PNG Reference Library is supplied "AS IS". The Contributing Authors and Group 42, Inc. disclaim all warranties, expressed or implied, including, without limitation, the warranties of merchantability and of fitness for any purpose. The Contributing Authors and Group 42, Inc. assume no liability for direct, indirect, incidental, special, exemplary, or consequential damages, which may result from the use of the PNG Reference Library, even if advised of the possibility of such damage. Permission is hereby granted to use, copy, modify, and distribute this source code, or portions hereof, for any purpose, without fee, subject to the following restrictions: 1. The origin of this source code must not be misrepresented. 2. Altered versions must be plainly marked as such and must not be misrepresented as being the original source. 3. This Copyright notice may not be removed or altered from any source or altered source distribution. The Contributing Authors and Group 42, Inc. specifically permit, without fee, and encourage the use of this source code as a component to supporting the PNG file format in commercial products. If you use this source code in a product, acknowledgment is not required but would be appreciated. END OF COPYRIGHT NOTICE, DISCLAIMER, and LICENSE. TRADEMARK: The name "libpng" has not been registered by the Copyright owner as a trademark in any jurisdiction. However, because libpng has been distributed and maintained world-wide, continually since 1995, the Copyright owner claims "common-law trademark protection" in any jurisdiction where common-law trademark is recognized. OSI CERTIFICATION: Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a certification mark of the Open Source Initiative. OSI has not addressed the additional disclaimers inserted at version 1.0.7. EXPORT CONTROL: The Copyright owner believes that the Export Control Classification Number (ECCN) for libpng is EAR99, which means not subject to export controls or International Traffic in Arms Regulations (ITAR) because it is open source, publicly available software, that does not contain any encryption software. See the EAR, paragraphs 734.3(b)(3) and 734.7(b). Glenn Randers-Pehrson glennrp at users.sourceforge.net January 5, 2017 mumble-1.3.4/3rdPartyLicenses/mcpp_license.txt0000664000175000017500000000266414010707273021251 0ustar builderbuilder/*- * Copyright (c) 1998, 2002-2008 Kiyoshi Matsui * All rights reserved. * * This software including the files in this directory is provided under * the following license. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ mumble-1.3.4/3rdPartyLicenses/expat_license.txt0000664000175000017500000000217014010707273021423 0ustar builderbuilderCopyright (c) 1998-2000 Thai Open Source Software Center Ltd and Clark Cooper Copyright (c) 2001-2016 Expat maintainers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. mumble-1.3.4/3rdPartyLicenses/zeroc_ice_license.txt0000664000175000017500000000442714010707273022253 0ustar builderbuilderCopyright (c) 2003-2016 ZeroC, Inc. All rights reserved. This copy of Ice is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. Ice is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License version 2 along with this program; if not, see http://www.gnu.org/licenses. Linking Ice statically or dynamically with other software (such as a library, module or application) is making a combined work based on Ice. Thus, the terms and conditions of the GNU General Public License version 2 cover this combined work. If such software can only be used together with Ice, then not only the combined work but the software itself is a work derived from Ice and as such shall be licensed under the terms of the GNU General Public License version 2. This includes the situation where Ice is only being used through an abstraction layer. As a special exception to the above, ZeroC grants to the copyright holders and contributors of the Mumble project (http://www.mumble.info) the permission to license the Ice-based software they contribute to Mumble under the terms of the BSD license. This exception does not extend to the parts of Ice used by Mumble, or to any other derived work: as a whole, any work based on Ice shall be licensed under the terms and conditions of the GNU General Public License version 2. You may also combine Ice with any software not derived from Ice, provided the license of such software is compatible with the GNU General Public License version 2. In addition, as a special exception, ZeroC grants you permission to combine Ice with: - the OpenSSL library, or with a modified version of the OpenSSL library that uses the same license as OpenSSL - any library not derived from Ice and licensed under the terms of the Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.html) If you modify this copy of Ice, you may extend any of the exceptions provided above to your version of Ice, but you are not obligated to do so. mumble-1.3.4/3rdPartyLicenses/libogg_license.txt0000664000175000017500000000267214010707273021554 0ustar builderbuilderCopyright (c) 2002, Xiph.org Foundation Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. mumble-1.3.4/3rdPartyLicenses/sqlite3_license.txt0000664000175000017500000000040414010707273021664 0ustar builderbuilderThe author disclaims copyright to this source code. In place of a legal notice, here is a blessing: May you do good and not evil. May you find forgiveness for yourself and forgive others. May you share freely, never taking more than you give. mumble-1.3.4/3rdPartyLicenses/qt_translations.txt0000664000175000017500000000007314010707273022025 0ustar builderbuilderNot taken from here, see src/mumble/qttranslations/LICENSE mumble-1.3.4/3rdPartyLicenses/openssl_license.txt0000664000175000017500000001263514010707273021774 0ustar builderbuilder==================================================================== Copyright (c) 1998-2016 The OpenSSL Project. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. All advertising materials mentioning features or use of this software must display the following acknowledgment: "This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit. (http://www.openssl.org/)" 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact openssl-core@openssl.org. 5. Products derived from this software may not be called "OpenSSL" nor may "OpenSSL" appear in their names without prior written permission of the OpenSSL Project. 6. Redistributions of any form whatsoever must retain the following acknowledgment: "This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/)" THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ==================================================================== This product includes cryptographic software written by Eric Young (eay@cryptsoft.com). This product includes software written by Tim Hudson (tjh@cryptsoft.com). Original SSLeay License ----------------------- Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) All rights reserved. This package is an SSL implementation written by Eric Young (eay@cryptsoft.com). The implementation was written so as to conform with Netscapes SSL. This library is free for commercial and non-commercial use as long as the following conditions are aheared to. The following conditions apply to all code found in this distribution, be it the RC4, RSA, lhash, DES, etc., code; not just the SSL code. The SSL documentation included with this distribution is covered by the same copyright terms except that the holder is Tim Hudson (tjh@cryptsoft.com). Copyright remains Eric Young's, and as such any Copyright notices in the code are not to be removed. If this package is used in a product, Eric Young should be given attribution as the author of the parts of the library used. This can be in the form of a textual message at program startup or in documentation (online or textual) provided with the package. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. All advertising materials mentioning features or use of this software must display the following acknowledgement: "This product includes cryptographic software written by Eric Young (eay@cryptsoft.com)" The word 'cryptographic' can be left out if the rouines from the library being used are not cryptographic related :-). 4. If you include any Windows specific code (or a derivative thereof) from the apps directory (application code) you must include an acknowledgement: "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. The licence and distribution terms for any publically available version or derivative of this code cannot be changed. i.e. this code cannot simply be copied and put under another distribution licence [including the GNU Public Licence.] mumble-1.3.4/3rdPartyLicenses/dbus_license.txt0000664000175000017500000007077014010707273021252 0ustar builderbuilderD-Bus is licensed to you under your choice of the Academic Free License version 2.1, or the GNU General Public License version 2 (or, at your option any later version). Both licenses are included here. Some of the standalone binaries are under the GPL only; in particular, but not limited to, tools/dbus-cleanup-sockets.c and test/decode-gcov.c. Each source code file is marked with the proper copyright information - if you find a file that isn't marked please bring it to our attention. The Academic Free License v. 2.1 This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following notice immediately following the copyright notice for the Original Work: Licensed under the Academic Free License version 2.1 1) Grant of Copyright License. Licensor hereby grants You a world-wide, royalty-free, non-exclusive, perpetual, sublicenseable license to do the following: a) to reproduce the Original Work in copies; b) to prepare derivative works ("Derivative Works") based upon the Original Work; c) to distribute copies of the Original Work and Derivative Works to the public; d) to perform the Original Work publicly; and e) to display the Original Work publicly. 2) Grant of Patent License. Licensor hereby grants You a world-wide, royalty-free, non-exclusive, perpetual, sublicenseable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, to make, use, sell and offer for sale the Original Work and Derivative Works. 3) Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor hereby agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work, and by publishing the address of that information repository in a notice immediately following the copyright notice that applies to the Original Work. 4) Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior written permission of the Licensor. Nothing in this License shall be deemed to grant any rights to trademarks, copyrights, patents, trade secrets or any other intellectual property of Licensor except as expressly stated herein. No patent license is granted to make, use, sell or offer to sell embodiments of any patent claims other than the licensed claims defined in Section 2. No right is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under different terms from this License any Original Work that Licensor otherwise would have a right to license. 5) This section intentionally omitted. 6) Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work. 7) Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately proceeding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to Original Work is granted hereunder except under this disclaimer. 8) Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to any person for any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to liability for death or personal injury resulting from Licensor's negligence to the extent applicable law prohibits such limitation. Some jurisdictions do not allow the exclusion or limitation of incidental or consequential damages, so this exclusion and limitation may not apply to You. 9) Acceptance and Termination. If You distribute copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. Nothing else but this License (or another written agreement between Licensor and You) grants You permission to create Derivative Works based upon the Original Work or to exercise any of the rights granted in Section 1 herein, and any attempt to do so except under the terms of this License (or another written agreement between Licensor and You) is expressly prohibited by U.S. copyright law, the equivalent laws of other countries, and by international treaty. Therefore, by exercising any of the rights granted to You in Section 1 herein, You indicate Your acceptance of this License and all of its terms and conditions. 10) Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware. 11) Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of the U.S. Copyright Act, 17 U.S.C. § 101 et seq., the equivalent laws of other countries, and international treaty. This section shall survive the termination of this License. 12) Attorneys Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License. 13) Miscellaneous. This License represents the complete agreement concerning the subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. 14) Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. 15) Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You. This license is Copyright (C) 2003-2004 Lawrence E. Rosen. All rights reserved. Permission is hereby granted to copy and distribute this license without modification. This license may not be modified without the express written permission of its copyright owner. -- END OF ACADEMIC FREE LICENSE. The following is intended to describe the essential differences between the Academic Free License (AFL) version 1.0 and other open source licenses: The Academic Free License is similar to the BSD, MIT, UoI/NCSA and Apache licenses in many respects but it is intended to solve a few problems with those licenses. * The AFL is written so as to make it clear what software is being licensed (by the inclusion of a statement following the copyright notice in the software). This way, the license functions better than a template license. The BSD, MIT and UoI/NCSA licenses apply to unidentified software. * The AFL contains a complete copyright grant to the software. The BSD and Apache licenses are vague and incomplete in that respect. * The AFL contains a complete patent grant to the software. The BSD, MIT, UoI/NCSA and Apache licenses rely on an implied patent license and contain no explicit patent grant. * The AFL makes it clear that no trademark rights are granted to the licensor's trademarks. The Apache license contains such a provision, but the BSD, MIT and UoI/NCSA licenses do not. * The AFL includes the warranty by the licensor that it either owns the copyright or that it is distributing the software under a license. None of the other licenses contain that warranty. All other warranties are disclaimed, as is the case for the other licenses. * The AFL is itself copyrighted (with the right granted to copy and distribute without modification). This ensures that the owner of the copyright to the license will control changes. The Apache license contains a copyright notice, but the BSD, MIT and UoI/NCSA licenses do not. -- START OF GNU GENERAL PUBLIC LICENSE -- GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. mumble-1.3.4/3rdPartyLicenses/libcap2_license.txt0000664000175000017500000004742014010707273021625 0ustar builderbuilderUnless otherwise *explicitly* stated, the following text describes the licensed conditions under which the contents of this libcap release may be used and distributed: ------------------------------------------------------------------------- Redistribution and use in source and binary forms of libcap, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain any existing copyright notice, and this entire permission notice in its entirety, including the disclaimer of warranties. 2. Redistributions in binary form must reproduce all prior and current copyright notices, this list of conditions, and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of any author may not be used to endorse or promote products derived from this software without their specific prior written permission. ALTERNATIVELY, this product may be distributed under the terms of the GNU General Public License (v2.0 - see below), in which case the provisions of the GNU GPL are required INSTEAD OF the above restrictions. (This clause is necessary due to a potential conflict between the GNU GPL and the restrictions contained in a BSD-style copyright.) THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------- ------------------------- Full text of gpl-2.0.txt: ------------------------- GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. mumble-1.3.4/3rdPartyLicenses/berkeleydb_license.txt0000664000175000017500000001546314010707273022423 0ustar builderbuilder/* * Copyright (c) 1990, 2013 Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Redistributions in any form must be accompanied by information on * how to obtain complete source code for the DB software and any * accompanying software that uses the DB software. The source code * must either be included in the distribution or be available for no * more than the cost of distribution plus a nominal fee, and must be * freely redistributable under reasonable conditions. For an * executable file, complete source code means the source code for all * modules it contains. It does not include source code for modules or * files that typically accompany the major components of the operating * system on which the executable file runs. * * THIS SOFTWARE IS PROVIDED BY ORACLE ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR * NON-INFRINGEMENT, ARE DISCLAIMED. IN NO EVENT SHALL ORACLE BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 1990, 1993, 1994, 1995 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * Copyright (c) 1995, 1996 * The President and Fellows of Harvard University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY HARVARD AND ITS CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL HARVARD OR ITS CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= /*** * ASM: a very small and fast Java bytecode manipulation framework * Copyright (c) 2000-2005 INRIA, France Telecom * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. */ mumble-1.3.4/3rdPartyLicenses/mumble-old-license-headers/0000775000175000017500000000000014010707273023125 5ustar builderbuildermumble-1.3.4/3rdPartyLicenses/mumble-old-license-headers/LICENSE.txt0000664000175000017500000001353014010707273024752 0ustar builderbuilderMumble's AudioConfigDialog src/mumble/AudioConfigDialog.cpp Copyright (C) 2005-2011, Thorvald Natvig Copyright (C) 2008, Andreas Messer Mumble's PortAudio support src/mumble/PAAudio.cpp, src/mumble/PAAudio.h Copyright (C) 2005-2011, Thorvald Natvig Copyright (C) 2007, Stefan Gehn Mumble's Text-to-Speech support on OS X src/mumble/TextToSpeech_macx.mm Copyright (C) 2005-2011, Thorvald Natvig Copyright (C) 2007, Sebastian Schlingmann Copyright (C) 2008-2011, Mikkel Krautz Copyright (C) 2014, Mayur Pawashe Mumble's UserLocalVolumeDialog src/mumble/UserLocalVolumeDialog.cpp src/mumble/UserLocalVolumeDialog.h Copyright (C) 2015, Fredrik Nordin Murmur's PBKDF2 support src/murmur/PBKDF2.cpp src/murmur/PBKDF2.h Copyright (C) 2013, Morris Moraes Copyright (C) 2014, Stefan Hacker D11StateBlock in Mumble's Windows Overlay overlay/D11StateBlock.cpp overlay/D11StateBlock.h Copyright (C) 2011-2013, Nye Liu Copyright (C) 2011-2013, Kissaki D3D11 HLSL shaders for Mumble's Windows Overlay overlay/overlay11-common.hlsl overlay/overlay11.ps overlay/overlay11.vs Copyright (C) 2011-2013, Nye Liu D3D11 support for Mumble's Windows Overlay overlay/d3d11.cpp Copyright (C) 2010-2013, Benjamin Jemlich Copyright (C) 2011-2013, Nye Liu Copyright (C) 2011-2013, Kissaki DXGI support for Mumble's Windows Overlay overlay/dxgi.cpp Copyright (C) 2005-2010, Thorvald Natvig Copyright (C) 2011, Kissaki Copyright (C) 2011, Nye Liu Mumble's "Battlefield 3" Plugin plugins/bf3/bf3.cpp Copyright (C) 2010-2011, Snares Copyright (C) 2005-2011, Thorvald Natvig Copyright (C) 2011, Ryan Austin Copyright (C) 2012, Bojan Hartmann Mumble's "Blacklight" Plugin plugins/blacklight/blacklight.cpp Copyright (C) 2012, dark_skeleton (d-rez) Copyright (C) 2005-2012, Thorvald Natvig Mumble's "Borderlands" Plugin plugins/borderlands/borderlands.cpp Copyright (C) 2010, Mark-Willem Jansen Copyright (C) 2005-2012, Thorvald Natvig Mumble's "Borderlands 2" Plugin plugins/borderlands2/borderlands2.cpp Copyright (C) 2013, Steve Hill Copyright (C) 2013, Gabriel Risterucci Copyright (C) 2005-2010, Thorvald Natvig Mumble's "Breach" Plugin plugins/breach/breach.cpp Copyright (C) 2011, Mark-Willem Jansen Copyright (C) 2005-2012, Thorvald Natvig Mumble's "Counter-Strike" Plugin plugins/cs/cs.cpp Copyright (C) 2009-2010, Imre Botos Copyright (C) 2009-2012, Snares Copyright (C) 2005-2012, Thorvald Natvig Mumble's "Grand Theft Auto IV" Plugin plugins/gtaiv/gtaiv.cpp Copyright (C) 2011, Mike Copyright (C) 2005-2012, Thorvald Natvig Mumble's "Just Cause 2" Plugin plugins/jc2/jc2.cpp Copyright (C) 2012, Mike Copyright (C) 2005-2012, Thorvald Natvig Mumble's "Left 4 Dead 2" Plugin plugins/l4d2/l4d2.cpp Copyright (C) 2005-2012, Thorvald Natvig Copyright (C) 2012, dark_skeleton (d-rez) Mumble's "League of Legends" Plugin plugins/lol/lol.cpp Copyright (C) 2012, dark_skeleton (d-rez) Copyright (C) 2005-2012, Thorvald Natvig Mumble's "The Lord of The Rings Online" Plugin plugins/lotro/lotro.cpp Copyright (c) 2009-2011 Ilmar 'Ingaras' Kruis (seaeagle1@users.sourceforge.net) Mumble's "Sub Rosa" Plugin plugins/sr/sr.cpp Copyright (C) 2012, Lukas Orsvärn Copyright (C) 2005-2010, Thorvald Natvig Mumble's "Unreal Tournament" Plugin plugins/ut99/ut99.cpp Copyright (C) 2005-2010, Thorvald Natvig Copyright (C) 2012, Moritz Schneeweiss All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Mumble Developers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. mumble-1.3.4/3rdPartyLicenses/mumble-old-license-headers/README.txt0000664000175000017500000000101414010707273024617 0ustar builderbuilderMumble used to use a full BSD-style license in each file. We now use a shorter, generic license header (see LICENSE.header in the root of the source tree.) However, some files still have the full license text. This is because we haven't gotten permission from all authors in those files to only use the shorter license header. The license text in LICENSE.txt is a license to be shown in Mumble's third party licenses screen to live up to the BSD license requirement of reproducing the copyright notices from those files. mumble-1.3.4/3rdPartyLicenses/boost_license.txt0000664000175000017500000000252114010707273021430 0ustar builderbuilderBoost Software License - Version 1.0 - August 17th, 2003 Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the "Software") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following: The copyright notices in the Software and this entire statement, including the above license grant, this restriction and the following disclaimer, must be included in all copies of the Software, in whole or in part, and all derivative works of the Software, unless such copies or derivative works are solely in the form of machine-executable object code generated by a source language processor. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. mumble-1.3.4/3rdPartyLicenses/squashfuse_license.txt0000664000175000017500000000307014010707273022471 0ustar builderbuilderThe squashfuse distribution as a whole is copyright Dave Vasilevsky and is subject to the copyright notice reproduced at the bottom of this file. The file squashfs_fs.h is copyright Phillip Lougher and, with his permission, subject to the same license. Copyright (c) 2012 Dave Vasilevsky Phillip Lougher All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. mumble-1.3.4/README.static.osx0000664000175000017500000001001114010707273015610 0ustar builderbuilder M U M B L E A voicechat utility for gamers http://mumble.info/ #mumble on freenode What is Murmur? =============== Murmur is the server component of Mumble, an open-source voice chat utility. This package is a statically compiled version of Murmur for OS X. Running Murmur ============== In this build of Murmur, the binary is called 'murmurd'. To get Murmur up and running, simply execute the following command at your shell: $ ./murmurd -fg -ini murmur.ini This will spawn a foregrounded (Murmur will, by default, run in daemon mode, which means it will launch itself as a background process on your system). The First Run ============= When Murmur runs for the first time, it performs a few special initialization steps, such as setting up its database, as well as generating a certificate for its initial server and a password for the SuperUser user. This password is important for setting up the Murmur server, so make a note of it. It is output by the Murmur server the first time it runs, and will look something like this: HH:MM:DD 1 => Password for 'SuperUser' set to '' Initial User Setup ================== Murmur has the concept of a 'SuperUser', which is the initial administrative user used to configure your server. Typically, this user will only be used for initial setup, and in recovery situations. A regular user, with some administrative privileges is usually set up as a first step. To do this, follow the steps below: 1. In your Mumble client, ensure that you have a certificate for your user. (A certificate is generated by Mumble by default, but you can create a new one if you wish -- or use an existing S/MIME email certificate if you wish.) 2. Connect to your server with the user that you wish to grant administrative privileges to. (Your username will be stored on the server when you register yourself, so pick something you'd like to keep!) 3. Once connected, right click your user name in the server view and choose 'Register'. This will register your user to the server (this makes the server remember you as a user -- but you still will not have administrative privileges). 4. Once registered, you can disconnect from the server. Now it is time to connect using the SuperUser account that the server created for you when you launched it the first time. Simply specify SuperUser as your username, and the password that Murmur gave you as the password. 5. After connecting as the SuperUser, right click the 'Root'-channel and choose Edit. In the Edit dialog, click the Groups tab. In the Groups dropdown, choose the admin group. Then, under Members three lists should appear, showing Members, Excluded Members and Inherited Members. We're only interested in Members. Expand the drop down below the member list and find the username of the user you registered in step 3. Click Add to add the user to the admin group. 6. Your user is now an administrator. For more advanced setup and usage of Murmur, please visit the Mumble Wiki, at http://mumble.info/. Some pages of interest are available at: http://wiki.mumble.info/wiki/Running_Murmur http://wiki.mumble.info/wiki/ACL_and_Groups http://wiki.mumble.info/wiki/Murmurguide Additional Murmur Options ========================= The above instructions use a very bare-bones approach to running Murmur. Several other command line options are available. These are listed below: murmurd [-supw ] [-ini ] [-fg] [v] -supw Set new password for the user SuperUser, which is hardcoded to bypass ACLs. Keep this password safe. If you use this option, Murmur will set the password in the database and then exit. -ini Use an ini file other than murmur.ini, use this to run several instances of Murmur from the same directory. Make sure each instance is using a separate database. (Specified in the ini file.) -fg Run in the foreground, logging to standard output. -v More verbose logging. mumble-1.3.4/scripts/0000775000175000017500000000000014010707354014330 5ustar builderbuildermumble-1.3.4/scripts/murmur.ini0000664000175000017500000003664014010707273016371 0ustar builderbuilder; Murmur configuration file. ; ; General notes: ; * Settings in this file are default settings and many of them can be overridden ; with virtual server specific configuration via the Ice or DBus interface. ; * Due to the way this configuration file is read some rules have to be ; followed when specifying variable values (as in variable = value): ; * Make sure to quote the value when using commas in strings or passwords. ; NOT variable = super,secret BUT variable = "super,secret" ; * Make sure to escape special characters like '\' or '"' correctly ; NOT variable = """ BUT variable = "\"" ; NOT regex = \w* BUT regex = \\w* ; Path to database. If blank, will search for ; murmur.sqlite in default locations or create it if not found. database= ; Murmur defaults to using SQLite with its default rollback journal. ; In some situations, using SQLite's write-ahead log (WAL) can be ; advantageous. ; If you encounter slowdowns when moving between channels and similar ; operations, enabling the SQLite write-ahead log might help. ; ; To use SQLite's write-ahead log, set sqlite_wal to one of the following ; values: ; ; 0 - Use SQLite's default rollback journal. ; 1 - Use write-ahead log with synchronous=NORMAL. ; If Murmur crashes, the database will be in a consistent state, but ; the most recent changes might be lost if the operating system did ; not write them to disk yet. This option can improve Murmur's ; interactivity on busy servers, or servers with slow storage. ; 2 - Use write-ahead log with synchronous=FULL. ; All database writes are synchronized to disk when they are made. ; If Murmur crashes, the database will be include all completed writes. ;sqlite_wal=0 ; If you wish to use something other than SQLite, you'll need to set the name ; of the database above, and also uncomment the below. ; Sticking with SQLite is strongly recommended, as it's the most well tested ; and by far the fastest solution. ; ;dbDriver=QMYSQL ;dbUsername= ;dbPassword= ;dbHost= ;dbPort= ;dbPrefix=murmur_ ;dbOpts= ; Murmur defaults to not using D-Bus. If you wish to use dbus, which is one of the ; RPC methods available in Murmur, please specify so here. ; ;dbus=session ; Alternate D-Bus service name. Only use if you are running distinct ; murmurd processes connected to the same D-Bus daemon. ;dbusservice=net.sourceforge.mumble.murmur ; If you want to use ZeroC Ice to communicate with Murmur, you need ; to specify the endpoint to use. Since there is no authentication ; with ICE, you should only use it if you trust all the users who have ; shell access to your machine. ; Please see the ICE documentation on how to specify endpoints. ice="tcp -h 127.0.0.1 -p 6502" ; Ice primarily uses local sockets. This means anyone who has a ; user account on your machine can connect to the Ice services. ; You can set a plaintext "secret" on the Ice connection, and ; any script attempting to access must then have this secret ; (as context with name "secret"). ; Access is split in read (look only) and write (modify) ; operations. Write access always includes read access, ; unless read is explicitly denied (see note below). ; ; Note that if this is uncommented and with empty content, ; access will be denied. ;icesecretread= icesecretwrite= ; If you want to expose Murmur's experimental gRPC API, you ; need to specify an address to bind on. ; Note: not all builds of Murmur support gRPC. If gRPC is not ; available, Murmur will warn you in its log output. ;grpc="127.0.0.1:50051" ; Specifying both a certificate and key file below will cause gRPC to use ; secured, TLS connections. ;grpccert="" ;grpckey="" ; Specifies the file Murmur should log to. By default, Murmur ; logs to the file 'murmur.log'. If you leave this field blank ; on Unix-like systems, Murmur will force itself into foreground ; mode which logs to the console. ;logfile=murmur.log ; If set, Murmur will write its process ID to this file ; when running in daemon mode (when the -fg flag is not ; specified on the command line). Only available on ; Unix-like systems. ;pidfile= ; The below will be used as defaults for new configured servers. ; If you're just running one server (the default), it's easier to ; configure it here than through D-Bus or Ice. ; ; Welcome message sent to clients when they connect. ; If the welcome message is set to an empty string, ; no welcome message will be sent to clients. welcometext="
    Welcome to this server running Murmur.
    Enjoy your stay!
    " ; Port to bind TCP and UDP sockets to. port=64738 ; Specific IP or hostname to bind to. ; If this is left blank (default), Murmur will bind to all available addresses. ;host= ; Password to join server. serverpassword= ; Maximum bandwidth (in bits per second) clients are allowed ; to send speech at. bandwidth=72000 ; Murmur and Mumble are usually pretty good about cleaning up hung clients, but ; occasionally one will get stuck on the server. The timeout setting will cause ; a periodic check of all clients who haven't communicated with the server in ; this many seconds - causing zombie clients to be disconnected. ; ; Note that this has no effect on idle clients or people who are AFK. It will ; only affect people who are already disconnected, and just haven't told the ; server. ;timeout=30 ; Maximum number of concurrent clients allowed. users=100 ; Where users sets a blanket limit on the number of clients per virtual server, ; usersperchannel sets a limit on the number per channel. The default is 0, for ; no limit. ;usersperchannel=0 ; Per-user rate limiting ; ; These two settings allow to configure the per-user rate limiter for some ; command messages sent from the client to the server. The messageburst setting ; specifies an amount of messages which are allowed in short bursts. The ; messagelimit setting specifies the number of messages per second allowed over ; a longer period. If a user hits the rate limit, his packages are then ignored ; for some time. Both of these settings have a minimum of 1 as setting either to ; 0 could render the server unusable. messageburst=5 messagelimit=1 ; Respond to UDP ping packets. ; ; Setting to true exposes the current user count, the maximum user count, and ; the server's maximum bandwidth per client to unauthenticated users. In the ; Mumble client, this information is shown in the Connect dialog. allowping=true ; Amount of users with Opus support needed to force Opus usage, in percent. ; 0 = Always enable Opus, 100 = enable Opus if it's supported by all clients. ;opusthreshold=100 ; Maximum depth of channel nesting. Note that some databases like MySQL using ; InnoDB will fail when operating on deeply nested channels. ;channelnestinglimit=10 ; Maximum number of channels per server. 0 for unlimited. Note that an ; excessive number of channels will impact server performance ;channelcountlimit=1000 ; Regular expression used to validate channel names. ; (Note that you have to escape backslashes with \ ) ;channelname=[ \\-=\\w\\#\\[\\]\\{\\}\\(\\)\\@\\|]+ ; Regular expression used to validate user names. ; (Note that you have to escape backslashes with \ ) ;username=[-=\\w\\[\\]\\{\\}\\(\\)\\@\\|\\.]+ ; If a user has no stored channel (they've never been connected to the server ; before, or rememberchannel is set to false) and the client hasn't been given ; a URL that includes a channel path, the default behavior is that they will ; end up in the root channel. ; ; You can set this setting to a channel ID, and the user will automatically be ; moved into that channel instead. Note that this is the numeric ID of the ; channel, which can be a little tricky to get (you'll either need to use an ; RPC mechanism, watch the console of a debug client, or root around through ; the Murmur Database to get it). ; ;defaultchannel=0 ; When a user connects to a server they've already been on, by default the ; server will remember the last channel they were in and move them to it ; automatically. Toggling this setting to false will disable that feature. ; ;rememberchannel=true ; Maximum length of text messages in characters. 0 for no limit. ;textmessagelength=5000 ; Maximum length of text messages in characters, with image data. 0 for no limit. ;imagemessagelength=131072 ; Allow clients to use HTML in messages, user comments and channel descriptions? ;allowhtml=true ; Murmur retains the per-server log entries in an internal database which ; allows it to be accessed over D-Bus/ICE. ; How many days should such entries be kept? ; Set to 0 to keep forever, or -1 to disable logging to the DB. ;logdays=31 ; To enable public server registration, the serverpassword must be blank, and ; this must all be filled out. ; The password here is used to create a registry for the server name; subsequent ; updates will need the same password. Don't lose your password. ; The URL is your own website, and only set the registerHostname for static IP ; addresses. ; Location is typically the country of typical users of the server, in ; two-letter TLD style (ISO 3166-1 alpha-2 country code) ; ; If you only wish to give your "Root" channel a custom name, then only ; uncomment the 'registerName' parameter. ; ;registerName=Mumble Server ;registerPassword=secret ;registerUrl=http://www.mumble.info/ ;registerHostname= ;registerLocation= ; If this option is enabled, the server will announce its presence via the ; bonjour service discovery protocol. To change the name announced by bonjour ; adjust the registerName variable. ; See http://developer.apple.com/networking/bonjour/index.html for more information ; about bonjour. ;bonjour=True ; If you have a proper SSL certificate, you can provide the filenames here. ; Otherwise, Murmur will create its own certificate automatically. ;sslCert= ;sslKey= ; If the keyfile specified above is encrypted with a passphrase, you can enter ; it in this setting. It must be plaintext, so you may wish to adjust the ; permissions on your murmur.ini file accordingly. ;sslPassPhrase= ; If your certificate is signed by an authority that uses a sub-signed or ; "intermediate" certificate, you probably need to bundle it with your ; certificate in order to get Murmur to accept it. You can either concatenate ; the two certificates into one file, or you can put it in a file by itself and ; put the path to that PEM-file in sslCA. ;sslCA= ; The sslDHParams option allows you to specify a PEM-encoded file with ; Diffie-Hellman parameters, which will be used as the default Diffie- ; Hellman parameters for all virtual servers. ; ; Instead of pointing sslDHParams to a file, you can also use the option ; to specify a named set of Diffie-Hellman parameters for Murmur to use. ; Murmur comes bundled with the Diffie-Hellman parameters from RFC 7919. ; These parameters are available by using the following names: ; ; @ffdhe2048, @ffdhe3072, @ffdhe4096, @ffdhe6144, @ffdhe8192 ; ; By default, Murmur uses @ffdhe2048. ;sslDHParams=@ffdhe2048 ; The sslCiphers option chooses the cipher suites to make available for use ; in SSL/TLS. This option is server-wide, and cannot be set on a ; per-virtual-server basis. ; ; This option is specified using OpenSSL cipher list notation (see ; https://www.openssl.org/docs/apps/ciphers.html#CIPHER-LIST-FORMAT). ; ; It is recommended that you try your cipher string using 'openssl ciphers ' ; before setting it here, to get a feel for which cipher suites you will get. ; ; After setting this option, it is recommend that you inspect your Murmur log ; to ensure that Murmur is using the cipher suites that you expected it to. ; ; Note: Changing this option may impact the backwards compatibility of your ; Murmur server, and can remove the ability for older Mumble clients to be able ; to connect to it. ;sslCiphers=EECDH+AESGCM:EDH+aRSA+AESGCM:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:AES256-SHA:AES128-SHA ; If Murmur is started as root, which user should it switch to? ; This option is ignored if Murmur isn't started with root privileges. ;uname= ; By default, in log files and in the user status window for privileged users, ; Mumble will show IP addresses - in some situations you may find this unwanted ; behavior. If obfuscate is set to true, Murmur will randomize the IP addresses ; of connecting users. ; ; The obfuscate function only affects the log file and DOES NOT effect the user ; information section in the client window. ;obfuscate=false ; If this options is enabled, only clients which have a certificate are allowed ; to connect. ;certrequired=False ; If enabled, clients are sent information about the servers version and operating ; system. ;sendversion=True ; You can set a recommended minimum version for your server, and clients will ; be notified in their log when they connect if their client does not meet the ; minimum requirements. suggestVersion expects the version in the format X.X.X. ; ; Note that the suggest* options appeared after 1.2.3 and will have no effect ; on client versions 1.2.3 and earlier. ; ;suggestVersion= ; Setting this to "true" will alert any user who does not have positional audio ; enabled that the server administrators recommend enabling it. Setting it to ; "false" will have the opposite effect - if you do not care whether the user ; enables positional audio or not, set it to blank. The message will appear in ; the log window upon connection, but only if the user's settings do not match ; what the server requests. ; ; Note that the suggest* options appeared after 1.2.3 and will have no effect ; on client versions 1.2.3 and earlier. ; ;suggestPositional= ; Setting this to "true" will alert any user who does not have Push-To-Talk ; enabled that the server administrators recommend enabling it. Setting it to ; "false" will have the opposite effect - if you do not care whether the user ; enables PTT or not, set it to blank. The message will appear in the log ; window upon connection, but only if the user's settings do not match what the ; server requests. ; ; Note that the suggest* options appeared after 1.2.3 and will have no effect ; on client versions 1.2.3 and earlier. ; ;suggestPushToTalk= ; This sets password hash storage to legacy mode (1.2.4 and before) ; (Note that setting this to true is insecure and should not be used unless absolutely necessary) ;legacyPasswordHash=false ; By default a strong amount of PBKDF2 iterations are chosen automatically. If >0 this setting ; overrides the automatic benchmark and forces a specific number of iterations. ; (Note that you should only change this value if you know what you are doing) ;kdfIterations=-1 ; In order to prevent misconfigured, impolite or malicious clients from ; affecting the low-latency of other users, Murmur has a rudimentary global-ban ; system. It's configured using the autobanAttempts, autobanTimeframe and ; autobanTime settings. ; ; If a client attempts autobanAttempts connections in autobanTimeframe seconds, ; they will be banned for autobanTime seconds. This is a global ban, from all ; virtual servers on the Murmur process. It will not show up in any of the ; ban-lists on the server, and they can't be removed without restarting the ; Murmur process - just let them expire. A single, properly functioning client ; should not trip these bans. ; ; To disable, set autobanAttempts or autobanTimeframe to 0. Commenting these ; settings out will cause Murmur to use the defaults: ; ;autobanAttempts=10 ;autobanTimeframe=120 ;autobanTime=300 ; You can configure any of the configuration options for Ice here. We recommend ; leave the defaults as they are. ; Please note that this section has to be last in the configuration file. ; [Ice] Ice.Warn.UnknownProperties=1 Ice.MessageSizeMax=65536 mumble-1.3.4/scripts/azure-pipelines/0000775000175000017500000000000014010707273017444 5ustar builderbuildermumble-1.3.4/scripts/azure-pipelines/install-environment_macos.bash0000775000175000017500000000055514010707273025505 0ustar builderbuilder#!/bin/bash -ex # # Copyright 2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . brew update && brew install pkg-config qt5 boost libogg libvorbis flac libsndfile protobuf openssl ice mumble-1.3.4/scripts/azure-pipelines/build.ps10000664000175000017500000000557614010707273021205 0ustar builderbuilder# Builds Mumble using the specified build script. # The path to the script is relative to the build environment's root. # The configuration we build with is adjusted to be close to # our release builds. # # Below is a list of configuration variables used from environment. # # Predefined variables: # # AGENT_BUILDDIRECTORY - The local path on the agent where all folders # for a given build pipeline are created # (e.g. "c:\agent_work\1"). # BUILD_SOURCESDIRECTORY - The local path on the agent where the # repository is downloaded. # (e.g. "c:\agent_work\1\s"). # AGENT_TOOLSDIRECTORY - The directory used by tasks such as # Node Tool Installer and Use Python Version # to switch between multiple versions of a tool. # We store our build environment there, in the # folder specified by MUMBLE_ENVIRONMENT_DIR. # # Defined in the visual designer on Azure Pipelines: # # MUMBLE_ENVIRONMENT_DIR - Folder where the build environment will be stored # (e.g. "MumbleBuild"). # MUMBLE_ENVIRONMENT_VERSION - Full build environment version # (e.g. win64-static-no-ltcg-1.3.x-2017-02-02-ec94ddb-790). # Must match .7z and extracted folder name. # MUMBLE_BUILDSCRIPT - Path to required build script cmd file. Relative to build # environment's "mumble-releng\buildscripts" path. # (e.g. "1.3.x/buildenv-win64-static.cmd"). # # Defined in the YAML configuration: # # MUMBLE_NO_PCH - Indicates whether the build should not use PCH. # $MUMBLE_BUILD_DIR = $env:AGENT_BUILDDIRECTORY $MUMBLE_SOURCE_DIR = $env:BUILD_SOURCESDIRECTORY $MUMBLE_BUILDENV_DIR = Join-Path (Join-Path $env:AGENT_TOOLSDIRECTORY $env:MUMBLE_ENVIRONMENT_DIR) $env:MUMBLE_ENVIRONMENT_VERSION $MUMBLE_BUILDSCRIPT = Join-Path $MUMBLE_BUILDENV_DIR "mumble-releng\buildscripts\$env:MUMBLE_BUILDSCRIPT" $env:MUMBLE_EXTRA_QMAKE_CONFIG_FLAGS = "" # We do not sign the Azure Pipelines CI builds, so we must disable # uiaccess elevation. Also no intermediary signing is wanted. $env:MUMBLE_EXTRA_QMAKE_CONFIG_FLAGS = $env:MUMBLE_EXTRA_QMAKE_CONFIG_FLAGS + " no-elevation" # If "MUMBLE_NO_PCH" is enabled, pass "no-pch". if ($env:MUMBLE_NO_PCH -eq 1) { $env:MUMBLE_EXTRA_QMAKE_CONFIG_FLAGS = $env:MUMBLE_EXTRA_QMAKE_CONFIG_FLAGS + " no-pch" } # Use jom to take advantage of the multiple cores we get on the builder. $env:MUMBLE_NMAKE = "jom" $env:MUMBLE_SKIP_COLLECT_SYMBOLS = "1" $env:MUMBLE_SKIP_INTERNAL_SIGNING = "1" $env:MUMBLE_BUILDENV_DIR = $MUMBLE_BUILDENV_DIR Get-ChildItem -Path $MUMBLE_BUILD_DIR & $MUMBLE_BUILDSCRIPT exit $lastexitcode mumble-1.3.4/scripts/azure-pipelines/install-environment.ps10000664000175000017500000000541114010707273024102 0ustar builderbuilder# Ensures we have downloaded and extracted a build environment # into our Azure Pipelines VM before we attempt to build. If the # environment archive is already present, this script will just extract it. # # Below is a list of configuration variables used from environment. # # Predefined variables: # # AGENT_TOOLSDIRECTORY - The directory used by tasks such as # Node Tool Installer and Use Python Version # to switch between multiple versions of a tool. # We store our build environment there, in the # folder specified by MUMBLE_ENVIRONMENT_DIR. # # Defined in the visual designer on Azure Pipelines: # # MUMBLE_ENVIRONMENT_DIR - Folder where the build environment will be stored # (e.g. "MumbleBuild"). # MUMBLE_ENVIRONMENT_SOURCE - Build environment web source folder URL # (e.g. https://somehost/folder). # MUMBLE_ENVIRONMENT_VERSION - Full build environment version # (e.g. win64-static-no-ltcg-1.3.x-2017-02-02-ec94ddb-790). # Must match .7z and extracted folder name. # $MUMBLE_ENVIRONMENT_VERSION = $env:MUMBLE_ENVIRONMENT_VERSION $MUMBLE_ENVIRONMENT_SOURCE = $env:MUMBLE_ENVIRONMENT_SOURCE $MUMBLE_ENVIRONMENT_PATH = Join-Path $env:AGENT_TOOLSDIRECTORY $env:MUMBLE_ENVIRONMENT_DIR $MUMBLE_ENVIRONMENT_STORE = Join-Path $MUMBLE_ENVIRONMENT_PATH "cache" if (-Not (Test-Path $MUMBLE_ENVIRONMENT_STORE)) { New-Item $MUMBLE_ENVIRONMENT_STORE -ItemType Directory | Out-Null } $env_7z = Join-Path $MUMBLE_ENVIRONMENT_STORE "$MUMBLE_ENVIRONMENT_VERSION.7z"; if (-Not (Test-Path $env_7z)) { Write-Host "Environment not cached. Downloading..." $env_url = "$MUMBLE_ENVIRONMENT_SOURCE/$MUMBLE_ENVIRONMENT_VERSION.7z" try { # According to https://github.com/PowerShell/PowerShell/issues/2138 disabling the # progressbar can significantly increase the speed of Invoke-Web-Request. $ProgressPreference = 'SilentlyContinue' Invoke-WebRequest -Uri $env_url -OutFile $env_7z # Reset progressbar $ProgressPreference = 'Continue' } catch { Write-Host "Failed at downloading build-environment: $PSItem" exit 1 } } if (-Not (Test-Path (Join-Path $MUMBLE_ENVIRONMENT_PATH $MUMBLE_ENVIRONMENT_VERSION))) { Write-Host "Extracting build environment to $MUMBLE_ENVIRONMENT_PATH..." & C:\ProgramData\chocolatey\bin\7z.exe x $env_7z -o"$MUMBLE_ENVIRONMENT_PATH" } Get-ChildItem -Path $MUMBLE_ENVIRONMENT_PATH # We have to create a symlink because unfortunately C:\MumbleBuild is hardcoded # in our environment (e.g. qmake's configuration files' path). New-Item -Path C:\MumbleBuild -ItemType SymbolicLink -Value $MUMBLE_ENVIRONMENT_PATH mumble-1.3.4/scripts/azure-pipelines/build_macos.bash0000775000175000017500000000117514010707273022573 0ustar builderbuilder#!/bin/bash -ex # # Copyright 2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/opt/openssl/lib/pkgconfig export PATH=$PATH:/usr/local/opt/qt5/bin:/usr/local/bin export MUMBLE_PREFIX=/usr/local export MUMBLE_ICE_PREFIX=/usr/local/opt/ice qmake -recursive CONFIG+="release tests warnings-as-errors" make -j $(sysctl -n hw.ncpu) make check mumble-1.3.4/scripts/updatetranslations.sh0000775000175000017500000000533414010707273020620 0ustar builderbuilder#!/usr/bin/env bash # # Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . # Updates mumble_en.ts from source and adds a commit. # # The main actions this script performs: # * lupdate to update translation strings # * Duplicate single 'numerusform' entries in mumble_en.ts to work around #1195 # * Commit the resulting translation file # # Requires qt5 ; sudo apt-get install libqt5-dev # As the QT project files are parsed, additional qt dependencies apply; # sudo apt-get install libqt5svg5-dev set -u set -e file="mumble_en.ts" dir="`dirname $0`/../src/mumble" # Make sure we are using export QT_SELECT=5 tmpfile="commitmessage.tmp" function requireCommand { local c=$1 command -v $c >/dev/null 2>&1 || { printError "The required command $c is not available." >&2; exit 1; } } function checkRequirements { requireCommand lupdate requireCommand qmake requireCommand perl requireCommand git } function printError { echo -e "\e[1;31mERROR\e[0m: $1" } function fatal { local msg="${1:-"Exiting because a command returned the error code $code"}" printError "$msg" exit 1 } function main { checkRequirements if ! [[ -f "$dir/$file" ]]; then printError "Could not find file '${file}'." exit 1 fi pushd "$dir" >/dev/null trap 'code=$? ; popd >/dev/null; exit $code' INT TERM EXIT if [[ -n $(git status --porcelain $file) ]] ; then printError "The file $file has local changes." exit 1 fi echo "Translation update" > $tmpfile echo "" >> $tmpfile lupdate -no-ui-lines -disable-heuristic similartext -locations relative -no-obsolete mumble.pro -ts $file | tee -a $tmpfile || fatal "lupdate failed" echo # Duplicate single numerusform entries in mumble_en.ts to work around #1195 perl -pi -e 's!(^\s*)()$!\1\2\2!' $file || (rm $tmpfile ; fatal "Workardound for #1195 failed - in-place replacement via perl.") if ! [[ -n $(git status --porcelain $file) ]] ; then echo "No translation changes. Nothing to commit." rm $tmpfile exit 0 fi echo "Committing changes ..." git commit -F $tmpfile $file || (rm $tmpfile ; fatal "Failed to commit the changes") rm $tmpfile || printError "Failed to remove temporary file '$tmpfile'" echo "Probably done." echo echo "Before pushing, _manually_ check the output above as well as the commits changes." echo "An lupdate warning about overriding TRANSLATIONS is expected, as well as \"removal of plural forms\". Any project errors (missing qt modules) however are not, and the resulting changes must not be pushed." popd >/dev/null trap - INT TERM EXIT } main mumble-1.3.4/scripts/murmur.conf0000664000175000017500000000065314010707273016532 0ustar builderbuilder mumble-1.3.4/scripts/murmur.init0000775000175000017500000000635514010707273016560 0ustar builderbuilder#! /bin/sh # ### BEGIN INIT INFO # Provides: mumble-server # Required-Start: $network $local_fs $remote_fs dbus # Required-Stop: $network $local_fs $remote_fs dbus # Should-Start: $mysql # Should-Stop: $mysql # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Mumble VoIP Server # Description: Init script for the Mumble VoIP Server murmurd. ### END INIT INFO PATH=/sbin:/bin:/usr/sbin:/usr/bin NAME=mumble-server DESC="Mumble VoIP Server" PIDDIR=/var/run/$NAME PIDFILE=$PIDDIR/$NAME.pid DAEMON=/usr/sbin/murmurd USER=mumble-server GROUP=mumble-server test -x $DAEMON || exit 0 INIFILE=/etc/mumble-server.ini DAEMON_OPTS="-ini $INIFILE" MURMUR_DAEMON_START=0 MURMUR_USE_CAPABILITIES=0 MURMUR_LIMIT_NOFILE=0 # Include murmur defaults if available if [ -f /etc/default/$NAME ] ; then . /etc/default/$NAME fi . /lib/init/vars.sh . /lib/lsb/init-functions if [ "$MURMUR_LIMIT_NOFILE" -gt 0 ] ; then ulimit -n $MURMUR_LIMIT_NOFILE fi case "$1" in start) if [ "$MURMUR_DAEMON_START" != "1" ] ; then log_warning_msg "Not starting $DESC $NAME, disabled via /etc/default/$NAME" exit 0 fi [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME" [ -d $PIDDIR ] || install -o $USER -d $PIDDIR if [ "$MURMUR_USE_CAPABILITIES" != "1" ] ; then start-stop-daemon --start --quiet \ --pidfile $PIDFILE \ --chuid $USER:$GROUP \ --exec $DAEMON \ -- $DAEMON_OPTS else start-stop-daemon --start --quiet \ --pidfile $PIDFILE \ --exec $DAEMON \ -- $DAEMON_OPTS fi case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; stop) [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" start-stop-daemon --stop --quiet \ --retry=TERM/30/KILL/5 \ --pidfile $PIDFILE \ --user $USER \ --exec $DAEMON case "$?" in 0|1) rm -f $PIDFILE [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; status) if start-stop-daemon --test --stop --quiet \ --pidfile $PIDFILE \ --user $USER \ --exec $DAEMON then [ "$VERBOSE" != no ] && echo "$DESC is running." exit 0 else [ "$VERBOSE" != no ] && echo "$DESC is not running" exit 3 fi ;; force-reload) start-stop-daemon --stop --test --quiet \ --pidfile $PIDFILE \ --user $USER \ --exec $DAEMON \ && $0 restart || exit 0 ;; restart) [ "$VERBOSE" != no ] && log_daemon_msg "Restarting $DESC" "$NAME" start-stop-daemon --stop --quiet \ --retry=TERM/30/KILL/5 \ --pidfile $PIDFILE \ --user $USER \ --exec $DAEMON case "$?" in 0|1) [ -d $PIDDIR ] || install -o $USER -d $PIDDIR rm -f $PIDFILE if [ "$MURMUR_USE_CAPABILITIES" != "1" ] ; then start-stop-daemon --start --quiet \ --pidfile $PIDFILE \ --chuid $USER:$GROUP \ --exec $DAEMON \ -- $DAEMON_OPTS else start-stop-daemon --start --quiet \ --pidfile $PIDFILE \ --exec $DAEMON \ -- $DAEMON_OPTS fi case "$?" in 0) [ "$VERBOSE" != no ] && log_end_msg 0 ;; *) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; *) [ "$VERBOSE" != no ] && log_end_msg 0 ;; esac ;; *) N=/etc/init.d/$NAME echo "Usage: $N {start|stop|restart|force-reload}" >&2 exit 3 ;; esac exit 0 mumble-1.3.4/scripts/mumble.appdata.xml0000664000175000017500000000121314010707273017741 0ustar builderbuilder mumble.desktop CC0-1.0 BSD-3-Clause Mumble

    Voice Chat Software

    Mumble is an open source, low-latency, high quality voice chat software primarily intended for use while gaming.

    https://wiki.mumble.info https://screenshots.debian.net/screenshots/000/001/906/large.png mumble-1.3.4/scripts/mkini-win32.bat0000775000175000017500000000114414010707273017072 0ustar builderbuilder:: Copyright 2005-2019 The Mumble Developers. All rights reserved. :: Use of this source code is governed by a BSD-style license :: that can be found in the LICENSE file at the root of the :: Mumble source tree or at . :: Copy murmur.ini to murmur.ini.win32, and convert :: LF -> CRLF so Windows users can edit murmur.ini in :: Notepad. :: :: Note that the 'more' command also expands tabs :: to spaces. This isn't a problem right now, since :: we don't use tabs in murmur.ini -- and even if :: we did, they wouldn't be significant. type murmur.ini | more /p > murmur.ini.win32 mumble-1.3.4/scripts/murmur.ini.win320000664000175000017500000003743414010707354017334 0ustar builderbuilder; Murmur configuration file. ; ; General notes: ; * Settings in this file are default settings and many of them can be overridden ; with virtual server specific configuration via the Ice or DBus interface. ; * Due to the way this configuration file is read some rules have to be ; followed when specifying variable values (as in variable = value): ; * Make sure to quote the value when using commas in strings or passwords. ; NOT variable = super,secret BUT variable = "super,secret" ; * Make sure to escape special characters like '\' or '"' correctly ; NOT variable = """ BUT variable = "\"" ; NOT regex = \w* BUT regex = \\w* ; Path to database. If blank, will search for ; murmur.sqlite in default locations or create it if not found. database= ; Murmur defaults to using SQLite with its default rollback journal. ; In some situations, using SQLite's write-ahead log (WAL) can be ; advantageous. ; If you encounter slowdowns when moving between channels and similar ; operations, enabling the SQLite write-ahead log might help. ; ; To use SQLite's write-ahead log, set sqlite_wal to one of the following ; values: ; ; 0 - Use SQLite's default rollback journal. ; 1 - Use write-ahead log with synchronous=NORMAL. ; If Murmur crashes, the database will be in a consistent state, but ; the most recent changes might be lost if the operating system did ; not write them to disk yet. This option can improve Murmur's ; interactivity on busy servers, or servers with slow storage. ; 2 - Use write-ahead log with synchronous=FULL. ; All database writes are synchronized to disk when they are made. ; If Murmur crashes, the database will be include all completed writes. ;sqlite_wal=0 ; If you wish to use something other than SQLite, you'll need to set the name ; of the database above, and also uncomment the below. ; Sticking with SQLite is strongly recommended, as it's the most well tested ; and by far the fastest solution. ; ;dbDriver=QMYSQL ;dbUsername= ;dbPassword= ;dbHost= ;dbPort= ;dbPrefix=murmur_ ;dbOpts= ; Murmur defaults to not using D-Bus. If you wish to use dbus, which is one of the ; RPC methods available in Murmur, please specify so here. ; ;dbus=session ; Alternate D-Bus service name. Only use if you are running distinct ; murmurd processes connected to the same D-Bus daemon. ;dbusservice=net.sourceforge.mumble.murmur ; If you want to use ZeroC Ice to communicate with Murmur, you need ; to specify the endpoint to use. Since there is no authentication ; with ICE, you should only use it if you trust all the users who have ; shell access to your machine. ; Please see the ICE documentation on how to specify endpoints. ice="tcp -h 127.0.0.1 -p 6502" ; Ice primarily uses local sockets. This means anyone who has a ; user account on your machine can connect to the Ice services. ; You can set a plaintext "secret" on the Ice connection, and ; any script attempting to access must then have this secret ; (as context with name "secret"). ; Access is split in read (look only) and write (modify) ; operations. Write access always includes read access, ; unless read is explicitly denied (see note below). ; ; Note that if this is uncommented and with empty content, ; access will be denied. ;icesecretread= icesecretwrite= ; If you want to expose Murmur's experimental gRPC API, you ; need to specify an address to bind on. ; Note: not all builds of Murmur support gRPC. If gRPC is not ; available, Murmur will warn you in its log output. ;grpc="127.0.0.1:50051" ; Specifying both a certificate and key file below will cause gRPC to use ; secured, TLS connections. ;grpccert="" ;grpckey="" ; Specifies the file Murmur should log to. By default, Murmur ; logs to the file 'murmur.log'. If you leave this field blank ; on Unix-like systems, Murmur will force itself into foreground ; mode which logs to the console. ;logfile=murmur.log ; If set, Murmur will write its process ID to this file ; when running in daemon mode (when the -fg flag is not ; specified on the command line). Only available on ; Unix-like systems. ;pidfile= ; The below will be used as defaults for new configured servers. ; If you're just running one server (the default), it's easier to ; configure it here than through D-Bus or Ice. ; ; Welcome message sent to clients when they connect. ; If the welcome message is set to an empty string, ; no welcome message will be sent to clients. welcometext="
    Welcome to this server running Murmur.
    Enjoy your stay!
    " ; Port to bind TCP and UDP sockets to. port=64738 ; Specific IP or hostname to bind to. ; If this is left blank (default), Murmur will bind to all available addresses. ;host= ; Password to join server. serverpassword= ; Maximum bandwidth (in bits per second) clients are allowed ; to send speech at. bandwidth=72000 ; Murmur and Mumble are usually pretty good about cleaning up hung clients, but ; occasionally one will get stuck on the server. The timeout setting will cause ; a periodic check of all clients who haven't communicated with the server in ; this many seconds - causing zombie clients to be disconnected. ; ; Note that this has no effect on idle clients or people who are AFK. It will ; only affect people who are already disconnected, and just haven't told the ; server. ;timeout=30 ; Maximum number of concurrent clients allowed. users=100 ; Where users sets a blanket limit on the number of clients per virtual server, ; usersperchannel sets a limit on the number per channel. The default is 0, for ; no limit. ;usersperchannel=0 ; Per-user rate limiting ; ; These two settings allow to configure the per-user rate limiter for some ; command messages sent from the client to the server. The messageburst setting ; specifies an amount of messages which are allowed in short bursts. The ; messagelimit setting specifies the number of messages per second allowed over ; a longer period. If a user hits the rate limit, his packages are then ignored ; for some time. Both of these settings have a minimum of 1 as setting either to ; 0 could render the server unusable. messageburst=5 messagelimit=1 ; Respond to UDP ping packets. ; ; Setting to true exposes the current user count, the maximum user count, and ; the server's maximum bandwidth per client to unauthenticated users. In the ; Mumble client, this information is shown in the Connect dialog. allowping=true ; Amount of users with Opus support needed to force Opus usage, in percent. ; 0 = Always enable Opus, 100 = enable Opus if it's supported by all clients. ;opusthreshold=100 ; Maximum depth of channel nesting. Note that some databases like MySQL using ; InnoDB will fail when operating on deeply nested channels. ;channelnestinglimit=10 ; Maximum number of channels per server. 0 for unlimited. Note that an ; excessive number of channels will impact server performance ;channelcountlimit=1000 ; Regular expression used to validate channel names. ; (Note that you have to escape backslashes with \ ) ;channelname=[ \\-=\\w\\#\\[\\]\\{\\}\\(\\)\\@\\|]+ ; Regular expression used to validate user names. ; (Note that you have to escape backslashes with \ ) ;username=[-=\\w\\[\\]\\{\\}\\(\\)\\@\\|\\.]+ ; If a user has no stored channel (they've never been connected to the server ; before, or rememberchannel is set to false) and the client hasn't been given ; a URL that includes a channel path, the default behavior is that they will ; end up in the root channel. ; ; You can set this setting to a channel ID, and the user will automatically be ; moved into that channel instead. Note that this is the numeric ID of the ; channel, which can be a little tricky to get (you'll either need to use an ; RPC mechanism, watch the console of a debug client, or root around through ; the Murmur Database to get it). ; ;defaultchannel=0 ; When a user connects to a server they've already been on, by default the ; server will remember the last channel they were in and move them to it ; automatically. Toggling this setting to false will disable that feature. ; ;rememberchannel=true ; Maximum length of text messages in characters. 0 for no limit. ;textmessagelength=5000 ; Maximum length of text messages in characters, with image data. 0 for no limit. ;imagemessagelength=131072 ; Allow clients to use HTML in messages, user comments and channel descriptions? ;allowhtml=true ; Murmur retains the per-server log entries in an internal database which ; allows it to be accessed over D-Bus/ICE. ; How many days should such entries be kept? ; Set to 0 to keep forever, or -1 to disable logging to the DB. ;logdays=31 ; To enable public server registration, the serverpassword must be blank, and ; this must all be filled out. ; The password here is used to create a registry for the server name; subsequent ; updates will need the same password. Don't lose your password. ; The URL is your own website, and only set the registerHostname for static IP ; addresses. ; Location is typically the country of typical users of the server, in ; two-letter TLD style (ISO 3166-1 alpha-2 country code) ; ; If you only wish to give your "Root" channel a custom name, then only ; uncomment the 'registerName' parameter. ; ;registerName=Mumble Server ;registerPassword=secret ;registerUrl=http://www.mumble.info/ ;registerHostname= ;registerLocation= ; If this option is enabled, the server will announce its presence via the ; bonjour service discovery protocol. To change the name announced by bonjour ; adjust the registerName variable. ; See http://developer.apple.com/networking/bonjour/index.html for more information ; about bonjour. ;bonjour=True ; If you have a proper SSL certificate, you can provide the filenames here. ; Otherwise, Murmur will create its own certificate automatically. ;sslCert= ;sslKey= ; If the keyfile specified above is encrypted with a passphrase, you can enter ; it in this setting. It must be plaintext, so you may wish to adjust the ; permissions on your murmur.ini file accordingly. ;sslPassPhrase= ; If your certificate is signed by an authority that uses a sub-signed or ; "intermediate" certificate, you probably need to bundle it with your ; certificate in order to get Murmur to accept it. You can either concatenate ; the two certificates into one file, or you can put it in a file by itself and ; put the path to that PEM-file in sslCA. ;sslCA= ; The sslDHParams option allows you to specify a PEM-encoded file with ; Diffie-Hellman parameters, which will be used as the default Diffie- ; Hellman parameters for all virtual servers. ; ; Instead of pointing sslDHParams to a file, you can also use the option ; to specify a named set of Diffie-Hellman parameters for Murmur to use. ; Murmur comes bundled with the Diffie-Hellman parameters from RFC 7919. ; These parameters are available by using the following names: ; ; @ffdhe2048, @ffdhe3072, @ffdhe4096, @ffdhe6144, @ffdhe8192 ; ; By default, Murmur uses @ffdhe2048. ;sslDHParams=@ffdhe2048 ; The sslCiphers option chooses the cipher suites to make available for use ; in SSL/TLS. This option is server-wide, and cannot be set on a ; per-virtual-server basis. ; ; This option is specified using OpenSSL cipher list notation (see ; https://www.openssl.org/docs/apps/ciphers.html#CIPHER-LIST-FORMAT). ; ; It is recommended that you try your cipher string using 'openssl ciphers ' ; before setting it here, to get a feel for which cipher suites you will get. ; ; After setting this option, it is recommend that you inspect your Murmur log ; to ensure that Murmur is using the cipher suites that you expected it to. ; ; Note: Changing this option may impact the backwards compatibility of your ; Murmur server, and can remove the ability for older Mumble clients to be able ; to connect to it. ;sslCiphers=EECDH+AESGCM:EDH+aRSA+AESGCM:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:AES256-SHA:AES128-SHA ; If Murmur is started as root, which user should it switch to? ; This option is ignored if Murmur isn't started with root privileges. ;uname= ; By default, in log files and in the user status window for privileged users, ; Mumble will show IP addresses - in some situations you may find this unwanted ; behavior. If obfuscate is set to true, Murmur will randomize the IP addresses ; of connecting users. ; ; The obfuscate function only affects the log file and DOES NOT effect the user ; information section in the client window. ;obfuscate=false ; If this options is enabled, only clients which have a certificate are allowed ; to connect. ;certrequired=False ; If enabled, clients are sent information about the servers version and operating ; system. ;sendversion=True ; You can set a recommended minimum version for your server, and clients will ; be notified in their log when they connect if their client does not meet the ; minimum requirements. suggestVersion expects the version in the format X.X.X. ; ; Note that the suggest* options appeared after 1.2.3 and will have no effect ; on client versions 1.2.3 and earlier. ; ;suggestVersion= ; Setting this to "true" will alert any user who does not have positional audio ; enabled that the server administrators recommend enabling it. Setting it to ; "false" will have the opposite effect - if you do not care whether the user ; enables positional audio or not, set it to blank. The message will appear in ; the log window upon connection, but only if the user's settings do not match ; what the server requests. ; ; Note that the suggest* options appeared after 1.2.3 and will have no effect ; on client versions 1.2.3 and earlier. ; ;suggestPositional= ; Setting this to "true" will alert any user who does not have Push-To-Talk ; enabled that the server administrators recommend enabling it. Setting it to ; "false" will have the opposite effect - if you do not care whether the user ; enables PTT or not, set it to blank. The message will appear in the log ; window upon connection, but only if the user's settings do not match what the ; server requests. ; ; Note that the suggest* options appeared after 1.2.3 and will have no effect ; on client versions 1.2.3 and earlier. ; ;suggestPushToTalk= ; This sets password hash storage to legacy mode (1.2.4 and before) ; (Note that setting this to true is insecure and should not be used unless absolutely necessary) ;legacyPasswordHash=false ; By default a strong amount of PBKDF2 iterations are chosen automatically. If >0 this setting ; overrides the automatic benchmark and forces a specific number of iterations. ; (Note that you should only change this value if you know what you are doing) ;kdfIterations=-1 ; In order to prevent misconfigured, impolite or malicious clients from ; affecting the low-latency of other users, Murmur has a rudimentary global-ban ; system. It's configured using the autobanAttempts, autobanTimeframe and ; autobanTime settings. ; ; If a client attempts autobanAttempts connections in autobanTimeframe seconds, ; they will be banned for autobanTime seconds. This is a global ban, from all ; virtual servers on the Murmur process. It will not show up in any of the ; ban-lists on the server, and they can't be removed without restarting the ; Murmur process - just let them expire. A single, properly functioning client ; should not trip these bans. ; ; To disable, set autobanAttempts or autobanTimeframe to 0. Commenting these ; settings out will cause Murmur to use the defaults: ; ;autobanAttempts=10 ;autobanTimeframe=120 ;autobanTime=300 ; You can configure any of the configuration options for Ice here. We recommend ; leave the defaults as they are. ; Please note that this section has to be last in the configuration file. ; [Ice] Ice.Warn.UnknownProperties=1 Ice.MessageSizeMax=65536 mumble-1.3.4/scripts/server/0000775000175000017500000000000014010707273015636 5ustar builderbuildermumble-1.3.4/scripts/server/dbus/0000775000175000017500000000000014010707273016573 5ustar builderbuildermumble-1.3.4/scripts/server/dbus/dbusauth.pl0000775000175000017500000001711714010707273020761 0ustar builderbuilder#! /usr/bin/perl # This is a small example script of how to set up murmur to authenticate through # phpBB3. To use it, you'll have to have started murmur with DBus, and use the # same session for this script. # use warnings; use strict; # Replace these with whatever is correct for you our $dbname="phpbb3"; our $dbuser="phpbb3"; our $dbpass="uhduqw1237a"; our $dbprefix="phpbb_"; our $dbhost="localhost"; # Assign user id as phpbb3 user_id plus this, to avoid clashing # with local murmur users. If you're going to use ONLY external # authentication, you can set this to 1, but there's no real point. # Note that Mumble ignores values above 1000000000 when allocating # player IDs on its own, so you probably want to leave this alone. our $id_offset = 1000000000; # Path to phpBB user avatars. If you want to disable avatar support, set # this blank. This can be either a directory path or a full URL. our $avatar_path = "http://xeno.stud.hive.no/phpBB3/download.php?avatar="; # # No user servicable parts below this point. # use DBI; use Net::DBus; use Data::Dumper; use Net::DBus::Reactor; use LWP::UserAgent; use Carp; our %texturecache; our @dbhparams=("dbi:mysql:dbname=${dbname};host=${dbhost}", $dbuser, $dbpass); our $agent=new LWP::UserAgent; $agent->timeout(5); our ($bus, $service); our $r = Net::DBus::Reactor->main; eval { $bus = Net::DBus->system(); $service = $bus->get_service("net.sourceforge.mumble.murmur"); }; if (! $service) { eval { $bus = Net::DBus->session(); $service = $bus->get_service("net.sourceforge.mumble.murmur"); }; } die "Murmur service not found" if (! $service); my $dbh=DBI->connect_cached(@dbhparams); if (! $dbh) { die $DBI::errstr; } our $object = $service->get_object("/1"); our $rservice = $bus->export_service("net.sourceforge.mumble.phpbb"); our $robject = Mumble::Auth->new($rservice); package Mumble::Auth; use Data::Dumper; use Image::Magick; use Digest::MD5 qw(md5); use Net::DBus::Exporter qw(net.sourceforge.mumble.auther); use base qw(Net::DBus::Object); dbus_method("authenticate", ["string","string"], ["int32","string",["array","string"]]); dbus_method("getUserName", ["int32"], ["string"]); dbus_method("getUserId", ["string"], ["int32"]); dbus_method("getUserTexture", ["int32"], [["array", "byte"]]); sub new { my $class = shift; my $service = shift; my $self = $class->SUPER::new($service, "/authority"); bless $self, $class; return $self; } sub hash { my $self = shift; my $pw = shift; my $hash = shift; my $itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; my @itoa64 = split(//,$itoa64); my $count_log2 = index($itoa64, substr($hash,3,1)); my $count = 1 << $count_log2; my $salt = substr($hash, 4, 8); my $nhash = $salt; do { $nhash = md5($nhash . $pw); } while ($count--); my $output = substr($hash, 0, 12); my $i = 0; my @input = split(//,$nhash); while ($i < 16) { my $value; $value = ord($input[$i++]); $output .= $itoa64[$value & 0x3f]; if ($i < 16) { $value |= ord($input[$i]) << 8; } $output .= $itoa64[($value >> 6) & 0x3f]; last if ($i++ >= 16); if ($i < 16) { $value |= ord($input[$i]) << 16; } $output .= $itoa64[($value >> 12) & 0x3f]; last if ($i++ >= 16); $output .= $itoa64[($value >> 18) & 0x3f]; }; return $output; } # Possible responses are: # >0 ID of user # 0 SuperUser # -1 Wrong password # -2 Unknown user -- fall back to builtin database sub authenticate { my $self = shift; my $uname = shift; my $pw = shift; my $dbh=DBI->connect_cached(@dbhparams); if (! $dbh) { carp $DBI::errstr; return -2,'',undef; } $dbh->do("SET names utf8"); my $sth=$dbh->prepare("SELECT user_id, user_password, user_type, username FROM ${dbprefix}users WHERE LOWER(username) = LOWER(?)"); $sth->execute($uname); if ((my $r=$sth->fetchrow_hashref())) { if ($$r{'user_password'} ne $self->hash($pw,$$r{'user_password'})) { print "Wrong password for $uname\n"; return -1,'',undef; } if (($$r{'user_type'} != 0) && ($$r{'user_type'} != 3)) { return -1,'',undef; } my $id = $$r{'user_id'} + $id_offset; my $name = $$r{'username'}; $sth->finish(); my @groups; $sth=$dbh->prepare("SELECT group_name FROM ${dbprefix}user_group LEFT JOIN ${dbprefix}groups USING (group_id) WHERE user_id = ?"); $sth->execute($$r{'user_id'}); while ((my $g=$sth->fetchrow_hashref())) { push @groups, lc $$g{'group_name'}; } #my $response = $object->setTemporaryGroups(0, $id, \@groups); #Dumper($response); print "Authenticated $uname as ID $id with groups ".join(" ",@groups)."\n"; return $id,$name,\@groups; } else { print "Unknown user $uname\n"; return -2,'',undef; } } # Possible responses are: # string Name of user # empty Unknown user # undef Fall back to builting database sub getUserName { my $self = shift; my $id = shift; my $dbh=DBI->connect_cached(@dbhparams); if (! $dbh) { carp $DBI::errstr; return undef; } $dbh->do("SET names utf8"); my $sth=$dbh->prepare("SELECT username FROM ${dbprefix}users WHERE user_id = ?"); $sth->execute($id - $id_offset); if ((my $r=$sth->fetchrow_hashref())) { print "UID $id :: " .$$r{'username'}."\n"; return $$r{'username'}; } print "No match for id $id\n"; return undef; } # Same response as authenticate sub getUserId { my $self = shift; my $name = shift; my $dbh=DBI->connect_cached(@dbhparams); if (! $dbh) { carp $DBI::errstr; return -2; } $dbh->do("SET names utf8"); my $sth=$dbh->prepare("SELECT user_id FROM ${dbprefix}users WHERE username = ?"); $sth->execute($name); if ((my $r=$sth->fetchrow_hashref())) { return $$r{'user_id'} + $id_offset; } return -2; } # Grab a user texture. sub getUserTexture { my $self = shift; my $uid = shift; my @a; my $dbh=DBI->connect_cached(@dbhparams); if (! $dbh) { carp $DBI::errstr; return undef; } $dbh->do("SET names utf8"); my $sth=$dbh->prepare("SELECT user_avatar, user_avatar_type FROM ${dbprefix}users WHERE user_id = ?"); $sth->execute($uid - $id_offset); if ((my $r=$sth->fetchrow_hashref())) { my $file = $$r{'user_avatar'}; my $type = $$r{'user_avatar_type'}; if (($type != 1) && ($type != 2)) { print "Request for texture $uid :: not uploaded texture ($type)\n"; return \@a; } if (exists $texturecache{$file}) { return $texturecache{$file}; } my $url = (($type == 1) ? $avatar_path : '') . $file; my $response = $agent->get($url); if (! $response->is_success) { print "Request for texture $uid :: Fetch $url failed: ". $response->status_line . "\n"; } else { my $image = new Image::Magick(); my $r = $image->BlobToImage($response->content); if ($r) { print "Request for texture $uid :: Image $url load failed: $r\n"; } else { $image->Extent(x => 0, y => 0, width => 600, height => 60); my $out=$image->ImageToBlob(magick => 'rgba', depth => 8); if (length($out) != (600*60*4)) { print "Request for texture $uid :: Failed resize\n"; } else { @a = unpack("C*", $out); for(my $i=0;$i<600*60;$i++) { my $red=$a[$i*4]; my $blue=$a[$i*4+2]; $a[$i*4]=$blue; $a[$i*4+2]=$red; } print "Request for texture $uid :: $url :: Success\n"; } } } $texturecache{$file} = \@a; return $texturecache{$file}; } return undef; } package main; my $response = $object->setAuthenticator("/authority", 0); print "Entering main DBus loop...\n"; $r->run(); mumble-1.3.4/scripts/server/dbus/ListUsers.cs0000664000175000017500000000370014010707273021057 0ustar builderbuilder/* This shows how to list connected users in C#. This depends on the NDesk-DBus package, which can be found at http://www.ndesk.org/DBusSharp Note that DBusSharp requires you to define the interface of the object you are connecting to at compile time. As such, you loose the advantages of DBus Introspection, but it's a bit faster (and type safe). This example only includes a very small subset of the interface definition. To compile this with Mono, type: gmcs -pkg:ndesk-dbus-1.0 ListUsers.cs To compile this with the Microsoft compiler, type: csc -r:NDesk.DBus.dll ListUsers.cs */ using System; using NDesk.DBus; using org.freedesktop.DBus; public class ListUsers { public static void Main (string[] args) { Connection bus; if (args.Length == 0) { bus = Bus.Session; } else { if (args[0] == "--session") bus = Bus.Session; else if (args[0] == "--system") bus = Bus.System; else bus = Connection.Open (args[0]); } Meta m = bus.GetObject("net.sourceforge.mumble.murmur", new ObjectPath("/")); int [] servers = m.getBootedServers(); foreach(int id in servers) { string path="/"+id; Console.WriteLine("Users on server #{0}, path {1}",id,path); Server s = bus.GetObject("net.sourceforge.mumble.murmur", new ObjectPath(path)); PlayerInfoExtended [] players = s.getPlayers(); foreach(PlayerInfoExtended pi in players) { Console.WriteLine(" {0} ({1})",pi.name,pi.session); } } } } [Interface ("net.sourceforge.mumble.Meta")] public interface Meta : Introspectable { int [] getBootedServers(); } [Interface ("net.sourceforge.mumble.Murmur")] public interface Server : Introspectable { PlayerInfoExtended [] getPlayers(); } public struct PlayerInfoExtended { public uint session; public bool mute; public bool deaf; public bool suppressed; public bool selfMute; public bool selfDeaf; public int channel; public int id; public string name; public int onlinesecs; public int bytespersec; } mumble-1.3.4/scripts/server/dbus/murmur.pl0000775000175000017500000001771214010707273020472 0ustar builderbuilder#! /usr/bin/perl # # For now, this is a CGI using Perl. # use warnings; use strict; ## User configurable settings: # What's the name of this server? our $servername = "Mumble & Murmur Test Server"; # Who should outgoing authentication emails be from? our $emailfrom = ""; # And what server should be used? our $emailserver = "localhost"; # Which server to add to? Unless you have multiple virtual servers, # this is always 1 our $serverid = 1; ## End of user configurable data ## ## Really. You shouldn't touch anything below this point. # If we're being run as a CGI in suexec, $HOME doesn't exist. Fake it. my $home = (getpwuid($<))[7]; # This needs to be done before "use Net::DBus" if (open(F, "$home/murmur/.dbus.sh")) { while() { chomp(); if ($_ =~ /^(.+?)\='(.+)';$/) { $ENV{$1}=$2; } } close(F); } use CGI; use CGI::Carp 'fatalsToBrowser'; use CGI::Session; use Net::SMTP; use Net::DNS; use Net::DBus; use Image::Magick; use Compress::Zlib; use Config::Simple; sub randomCode($) { my ($length) = @_; my $ret; my $chars="0123456789abcdefghjiklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; for(my $i=0;$i<$length;$i++) { $ret .= substr($chars, rand(int(length($chars))), 1); } return $ret; } my $showit = 1; CGI::Session->find( sub { } ); my $q = new CGI(); my $s = new CGI::Session(); $s->expire('+1d'); print $s->header(); print $q->start_html(-title=>"Registration"); my $bus; my $service; # First try the system bus eval { $bus=Net::DBus->system(); $service = $bus->get_service("net.sourceforge.mumble.murmur"); my $cfg = new Config::Simple(filename => '/etc/mumble-server.ini', syntax => 'simple'); $servername = $cfg->param("registerName") || $servername; $emailfrom = $cfg->param("emailfrom") || $emailfrom; }; # If that failed, the session bus if (! $service) { eval { $bus = Net::DBus->session(); $service = $bus->get_service("net.sourceforge.mumble.murmur"); } } die "Murmur service not found" if (! $service); if (! defined($emailfrom) || ($emailfrom eq "")) { croak(qq{Missing configuration. Please edit either /etc/mumble-server.ini for systemwide installations, or murmur.pl for a personal one. }); } # Fetch handle to remote object my $object = $service->get_object("/$serverid"); my $res; my $auth = $q->param('auth'); my $name = $q->param('name'); my $pw = $q->param('pw'); my $email = $q->param('email'); my $image = $q->upload('image'); if (defined($s->param('auth')) && ($auth eq $s->param('auth'))) { $res = $object->getRegisteredPlayers($s->param('name')); if ($#{$res} == 0) { my $aref = $$res[0]; if ($email ne $$aref[2]) { $$aref[3] = $s->param('pw'); $object->updateRegistration($aref); print "

    Updated password

    Your password has been reset.

    "; $showit = 0; } else { print "

    Apologies

    Someone has already registered that name in the meantime.

    "; } } else { $res = $object->registerPlayer($s->param('name')); if (($res != 0) && ($res != "0")) { my @array = ($res, $s->param('name'), $s->param('email'), $s->param('pw')); $object->updateRegistration(\@array); print "

    Succeeded

    Thank you for registering.

    "; $showit = 0; } else { print "

    Failed

    Username rejected by server.

    "; } } $s->clear(); } elsif (defined($name) && defined($pw) && defined($image)) { my $id = $object->getPlayerIds( [ $name ] ); $res = $object->verifyPassword($$id[0], $pw); if (! $res) { print "

    Tsk tsk

    Now, that's not a valid user and password, is it?

    "; } else { my $blob; sysread($image,$blob,1000000); my $image=Image::Magick->new(); my $r=$image->BlobToImage($blob); if (! $r) { $image->Extent(x => 0, y => 0, width => 600, height => 60, background => "transparent"); my $out=$image->ImageToBlob(magick => 'rgba', depth => 8); if (length($out) == (600*60*4)) { # We need BGRA, AKA ARGB inverse my @a=unpack("C*", $out); for(my $i=0;$i<600*60;$i++) { my $red=$a[$i*4]; my $blue=$a[$i*4+2]; $a[$i*4]=$blue; $a[$i*4+2]=$red; } @a=unpack("C*", pack("N", $#a + 1) . compress(pack("C*",@a))); $res = $object->setTexture($$id[0], \@a); } else { $r=1; } } if ($r) { print "

    Image failure

    Failed to convert that to a proper image.

    "; } else { print "

    Succeeded

    Reconnect to use the new image.

    "; $showit = 0; } } } elsif (defined($name) && defined($pw) && defined($email)) { my @errors; if (length($name) < 4) { push @errors, "Username is too short."; } if (length($pw) < 8) { push @errors, "Password is too short."; } if ($name !~ /^[0-9a-zA-Z\(\)\[\]\-\_]+$/) { push @errors, "Username contains illegal characters."; } if ($email !~ /^[0-9a-zA-Z\.\-\_]+\@(.+)$/) { push @errors, "That doesn't even look like an email adddress."; } else { my @mx = mx($1); if ($#mx == -1) { push @errors, "And how am I supposed to send email there?"; } } $res=$object->getRegisteredPlayers($name); if ( $#{$res} == 0 ) { my $aref = $$res[0]; if ($email ne $$aref[2]) { push @errors, "Name is already taken"; } } if ($#errors == -1) { my $code = randomCode(10); $s->param('name', $name); $s->param('pw', $pw); $s->param('email', $email); $s->param('auth', $code); my $smtp = new Net::SMTP($emailserver); if (! $smtp) { croak(qq{Failed to connect to SMTP server "$emailserver". This is most likely a configuration problem.\n}); } $smtp->mail($emailfrom); $smtp->to($email); $smtp->data(); $smtp->datasend("From: $emailfrom\n"); $smtp->datasend("To: $email\n"); $smtp->datasend("Subject: Murmur registration\n"); $smtp->datasend("\n"); $smtp->datasend("A user from $ENV{'REMOTE_ADDR'} registered the username $name\n"); $smtp->datasend("on \"${servername}\".\n\n"); $smtp->datasend("If this was you, please visit the following url to activate your account:\n"); $q->delete_all(); $q->param('auth', $code); $smtp->datasend($q->url(-query=>1)); $smtp->datasend("\n\n"); $smtp->datasend("If you have no idea what this is about, just disregard this message."); $smtp->dataend(); print '

    Registration complete

    Thank you for registering. An email has been sent to you with '; print 'an activation code.

    '; $showit = 0; } else { print '
      '; foreach my $error (@errors) { print "
    • $error
    • "; } print '
    '; } } if ($showit) { print '

    Registration form

    '; print '

    Fill out your desired username, password and your current email address. A mail will be sent to you '; print 'with an authentication code.

    '; print '

    If you\'ve forgotten your password, just reregister with the same name and email address. A new '; print 'confirmation email will be sent.

    '; print '

    '; print $q->start_form(-method=>'POST'); print "Username "; print $q->textfield(-name=>'name', -size=>'10'); print "
    \n"; print "Email "; print $q->textfield(-name=>'email', -size=>'30'); print "
    \n"; print "Password "; print $q->password_field(-name=>'pw', -size=>'10'); print "
    \n"; print $q->submit(-value=>'Register'); print $q->end_form(); print '

    '; print '

    Upload custom texture?

    '; print '

    '; print 'Remember that the image must be 600 by 60 pixels, and must have an alpha channel.
    '; print "\n"; print $q->start_form(-method=>'POST'); print "Username "; print $q->textfield(-name=>'name', -size=>'10'); print "
    \n"; print "Password "; print $q->password_field(-name=>'pw', -size=>'10'); print "
    \n"; print "Image "; print $q->filefield(-name=>'image', -size=>'30'); print "
    \n"; print $q->submit(-value=>'Upload Image'); print $q->end_form(); print '

    '; } print $q->end_html(); mumble-1.3.4/scripts/server/dbus/weblist.pl0000775000175000017500000000636514010707273020616 0ustar builderbuilder#! /usr/bin/perl use warnings; use strict; # If we're being run as a CGI in suexec, $HOME doesn't exist. Fake it. my $home = (getpwuid($<))[7]; # This needs to be done before "use Net::DBus" if (open(F, "$home/murmur/.dbus.sh")) { while() { chomp(); if ($_ =~ /^(.+?)\='(.+)';$/) { $ENV{$1}=$2; } } close(F); } use Net::DBus; use CGI::Carp qw(fatalsToBrowser); use HTML::Template; my $tmpl_fname = $1 if ($0 =~ /(.+)\.([a-z]+)$/); my $tmpl; if (-f "$tmpl_fname.tmpl") { $tmpl = HTML::Template->new(filename => "$tmpl_fname.tmpl"); } else { $tmpl = HTML::Template->new(filehandle => *DATA); } my $bus; my $service; # First try the system bus eval { $bus=Net::DBus->system(); $service = $bus->get_service("net.sourceforge.mumble.murmur"); }; # If that failed, the session bus if (! $service) { eval { $bus = Net::DBus->session(); $service = $bus->get_service("net.sourceforge.mumble.murmur"); } } die "Murmur service not found" if (! $service); # Fetch handle to remote object my $object = $service->get_object("/"); # Call a function on the murmur object my $servers = $object->getBootedServers(); my $params = []; foreach my $server (@{$servers}) { my $name = $object->getConf($server, "registername"); my $servobj = $service->get_object("/$server"); my %users; # First, get channel names my $channels = $servobj->getChannels(); my %channels; foreach my $c (@{$channels}) { my @c = @{$c}; my $id = $c[0]; my $name = $c[1]; $channels{$id}=$name; } # Then, get and print the players my $players = $servobj->getPlayers(); my $_total = 0; foreach my $p (@{$players}) { my @p = @{$p}; my $chanid = $p[6]; my $name = $p[8]; my $chan = $channels{$chanid}; $users{$chan} = [] unless $users{$chan}; push @{$users{$chan}}, $name; $_total++; } my $_channels = []; for my $c (sort keys %users) { my $_users = []; for my $u (sort @{$users{$c}}) { push @{$_users}, {'user' => $u}; } push @{$_channels}, { 'channel' => $c, 'users' => $_users }; } push @{$params}, {'server' => $server, 'name' => $name, 'total' => $_total, 'channels' => $_channels}; } $tmpl->param("servers", $params); print "Content-type: text/html;charset=utf8\r\n\r\n", $tmpl->output; __END__ mumble server user list

    Server #

    total:
    ,
    mumble-1.3.4/scripts/server/ice/0000775000175000017500000000000014010707273016376 5ustar builderbuildermumble-1.3.4/scripts/server/ice/mumble-auth.py0000775000175000017500000002520014010707273021172 0ustar builderbuilder#!/usr/bin/env python # -*- coding: utf-8 # # mumble-auth.py - Sample script to show the basics of using server controlled # context menu entries for in-client registration tickets. # # Requirements: # * python 2.5 or higher # * cherrypy 3 or higher # * python ice bindings # * murmur + mumble rev 1530 or higher import cherrypy import Ice from threading import Semaphore import random, time # #--- Config stuff # baseurl = "http://localhost:8080/register?id=" # Baseurl for registrations storage_time = 10*24*60*60 # Time in seconds a reg entry is guaranteed to be valid proxy = "Meta:tcp -h 127.0.0.1 -p 6502" group = "admin" # ACL group which has the right to send regurls host = "0.0.0.0" # Interface to listen on port = 8080 # Cherrypy port slice = "Murmur.ice" production = False # Set this to true to surpress tracebacks # Runtime generate bindings Ice.loadSlice(slice) import Murmur # Global vars sema_ids = Semaphore() ids = {} #Contains list(sid, user, time) class MetaCallbackI(Murmur.MetaCallback): def started(self, s, current=None): serverR = Murmur.ServerCallbackPrx.uncheckedCast(adapter.addWithUUID(ServerCallbackI(server, current.adapter))) s.addCallback(serverR) def stopped(self, s, current=None): pass # Unused callback class ServerCallbackI(Murmur.ServerCallback): def __init__(self, server, adapter): self.server = server self.contextR=Murmur.ServerContextCallbackPrx.uncheckedCast(adapter.addWithUUID(ServerContextCallbackI(server))) def userConnected(self, p, current=None): if p.userid != 0: # SuperUser is always allowed # Check if the user is in the right acl class and add the context menu allowed = False for acl in self.server.getACL(0)[1]: if acl.name == group and p.userid in acl.members: allowed = True break if not allowed: return self.server.addContextCallback(p.session, "sendregurl", "Send registration URL", self.contextR, Murmur.ContextUser) def userDisconnected(self, p, current=None): pass # Unused callbacks def userStateChanged(self, p, current=None): pass def channelCreated(self, c, current=None): pass def channelRemoved(self, c, current=None): pass def channelStateChanged(self, c, current=None): pass class ServerContextCallbackI(Murmur.ServerContextCallback): #--- Server message template strings err_notallowed = "You are not allowed to send registration urls" msg_regurl = "You've been allowed to register with this mumble server, " \ "please click here to register." def __init__(self, server): self.server = server def contextAction(self, action, p, session, chanid, current=None): if action == "sendregurl" and p: if p.userid != 0: # If it isn't SuperUser check if he is in the right acl group allowed = False for acl in self.server.getACL(0)[1]: if acl.name == group and p.userid in acl.members: allowed = True break if not allowed: self.server.sendMessage(p, self.err_notallowed) return sema_ids.acquire() try: # Take the chance to cleanup old entries todel = [] for key, reg in ids.iteritems(): if int(time.time()) - reg[2] > storage_time: todel.append(key) for key in todel: del ids[key] # Ok, now generate his registration id (64bit) rid = None while not rid or rid in ids: rid = random.randrange(0, pow(2,64)) sid = self.server.id() # Remember his username try: username = self.server.getState(session).name except Murmur.InvalidSessionException: username = "" # Save everything ids[str(rid)] = (sid, username, int(time.time())) # Send reg url to the user url = baseurl + str(rid) self.server.sendMessage(session, self.msg_regurl % {'url':url}) finally: sema_ids.release() class mumble_auth(object): #--- Web template strings template = """ %(title)s

    %(title)s

    %(body)s """ err_id = """

    Invalid ID

    The ID for your registration has already been used or is invalid.
    Please request a new registration link from a Mumble administrator.

    """ err_username = """

    Invalid username

    The username you chose contains characters which are not allowed.
    Please only use normal characters without whitespaces.

    """ err_username_existing = """

    Username already registered

    The username you chose is already registered on this server.
    Please choose another one.

    """ err_password = """

    Invalid password

    The password you chose didn't match the criteria enforced by this server.
    Your password should be at least 6 characters long.

    """ err_password_mismatch = """

    Passwords do not match

    The password you entered did not match the one in the confirmation box.
    Make sure both boxes contain the same password.

    """ snippet_retry = '
    Click here to try again' body_index = """

    This is the mumble-auth script, to be able to register yourself an account please ask a admin on the mumble server.

    """ body_complete = """

    Success

    You have been registered with the server successfully,
    please try to login to the server with your new login credentials!

    """ body_regform = """
    Enter user information


    """ def __init__(self, murmur): self.murmur = murmur def index(self): title = "Mumble Auth - Index" return self.template % {'title':title, 'body':self.body_index} index.exposed = True def register(self, id = None): title = "Mumble Auth - Register"; if not id in ids: body = self.err_id # Invalid ID else: # In case of a valid ID body = self.body_regform % {'username':ids[id][1], 'id':id} return self.template % {'title':title, 'body':body} register.exposed = True def doregister(self, id = None, username = None, password = None, cpassword = None): title = "Mumble Auth - Register"; sema_ids.acquire() try: # Check if all parameters are ok if not id in ids: body = self.err_id # Invalid id elif not username or " " in username: # Invalid username body = self.err_username + \ self.snippet_retry % {'url':baseurl+id} elif len(password) < 6: # Password criteria didn't match body = self.err_password + \ self.snippet_retry % {'url':baseurl+id} elif password != cpassword: # Password mismatch body = self.err_password_mismatch + \ self.snippet_retry % {'url':baseurl+id} else: # Ok, try to register him server = self.murmur.getServer(ids[id][0]) if (len(server.getRegisteredUsers(username))!=0): body = self.err_username_existing + \ self.snippet_retry % {'url':baseurl+id} else: # Register user info = {Murmur.UserInfo.UserName:username, Murmur.UserInfo.UserPassword:password} server.registerUser(info) # Void registration id del ids[id] # Success body = self.body_complete finally: sema_ids.release() return self.template % {'title':title, 'body':body} doregister.exposed = True if __name__ == "__main__": random.seed() ice = Ice.initialize() try: meta = Murmur.MetaPrx.checkedCast(ice.stringToProxy(proxy)) adapter = ice.createObjectAdapterWithEndpoints("Callback.Client", "tcp -h 127.0.0.1") metaR=Murmur.MetaCallbackPrx.uncheckedCast(adapter.addWithUUID(MetaCallbackI())) adapter.activate() meta.addCallback(metaR) for server in meta.getBootedServers(): serverR=Murmur.ServerCallbackPrx.uncheckedCast(adapter.addWithUUID(ServerCallbackI(server, adapter))) server.addCallback(serverR) if production: cherrypy.config.update({'environment': 'production'}) cherrypy.server.socket_host = host cherrypy.server.socket_port = port cherrypy.quickstart(mumble_auth(meta)) finally: ice.shutdown() ice.waitForShutdown() mumble-1.3.4/scripts/server/ice/addban.php0000664000175000017500000000164214010707273020323 0ustar builderbuilder= 30400) { require 'Ice.php'; require 'Murmur.php'; } else { Ice_loadProfile(); } try { if (Ice_intversion() >= 30400) { $ICE = Ice_initialize(); } $base = $ICE->stringToProxy("Meta:tcp -h 127.0.0.1 -p 6502"); $meta = $base->ice_checkedCast("::Murmur::Meta"); $default = $meta->getDefaultConf(); $server = $meta->getServer(1); $bans = $server->getBans(); print_r($bans); foreach($bans as $ban) { for($i=0;$i<16;$i+=2) { echo sprintf("%02x%02x", $ban->address[$i], $ban->address[$i+1]); if ($i != 14) { echo ":"; } } $mask = $ban->bits; echo "/$mask\n"; } $ban = new Murmur_Ban(); $ban->address = array(0,0,0,0,0,0,0,0,0,0,255,255,127,0,0,1); $ban->bits = 128; array_push($bans, $ban); $server->setBans($bans); } catch (Ice_Exception $ex) { print_r($ex); } ?> mumble-1.3.4/scripts/server/ice/idle.php0000664000175000017500000000567114010707273020035 0ustar builderbuilderstringToProxy($ice); $murmur = $base->ice_checkedCast('::Murmur::Meta'); $m = $murmur->getServer($mid); $users = $m->getUsers(); foreach ($users as $u) { printf("%s: %s\n", $u->name, $u->idlesecs); if ($u->idlesecs > $idle && $u->channel != $afk) { $state = $m->getState($u->session); if ($state) { $state->channel = $afk; $m->setState($state); } } } ?>mumble-1.3.4/scripts/server/ice/simpleregister.php0000664000175000017500000000457214010707273022155 0ustar builderbuilder stringToProxy("Meta:tcp -h 127.0.0.1 -p 6502"); $meta = $base->ice_checkedCast("::Murmur::Meta"); $server = $meta->getServer($serverId); if(empty($server)){ echo 'Server could not be found.'; }else{ $registrationId = $server->registerPlayer($_GET['uname']); $registration = $server->getRegistration(intval($registrationId)); $registration->pw = $_GET['password']; $registration->email = $_GET['email']; $server->updateregistration($registration); } }catch(InvalidPlayerException $ex){ echo 'InvalidPlayerException'; }catch(ServerBootedException $ex){ echo 'Server is not running'; }catch(Ice_UnknownLocalException $exc){ echo 'Ice could probably not be found'; }catch (Ice_Exception $ex){ echo "

    \n

    \n";
        print_r($ex);
        echo "
    \n

    \n"; } } ?>
    Username
    Password
    eMail
    mumble-1.3.4/scripts/server/ice/testdynamic.py0000775000175000017500000000150314010707273021276 0ustar builderbuilder#!/usr/bin/env python # -*- coding: utf-8 import Ice, IcePy, sys, tempfile, os ice = Ice.initialize(sys.argv) proxy = ice.stringToProxy('Meta:tcp -h 127.0.0.1 -p 6502') try: slice = IcePy.Operation('getSlice', Ice.OperationMode.Idempotent, Ice.OperationMode.Idempotent, True, (), (), (), IcePy._t_string, ()).invoke(proxy, ((), None)) (slicefiledesc, slicefilepath) = tempfile.mkstemp(suffix = '.ice') slicefile = os.fdopen(slicefiledesc, 'w') slicefile.write(slice) slicefile.flush() Ice.loadSlice('', ['-I' + Ice.getSliceDir(), slicefilepath]) slicefile.close() os.remove(slicefilepath) print 'Using dynamic slice' except Exception: Ice.loadSlice('', ['-I' + Ice.getSliceDir(), 'Murmur.ice']) print 'Using bundled slice' import Murmur meta = Murmur.MetaPrx.checkedCast(proxy) print meta.getVersion() mumble-1.3.4/scripts/server/ice/rubytest.rb0000775000175000017500000000224314010707273020610 0ustar builderbuilder#!/usr/bin/env ruby # Download Murmur.ice from # http://mumble.git.sourceforge.net/git/gitweb.cgi?p=mumble;a=blob_plain;f=src/murmur/Murmur.ice;hb=HEAD # and run 'slice2rb Murmur.ice'. slice2rb is part of ICE. # This will generate the necessary 'Murmur.rb' file which needs to be included: require 'Murmur.rb' status = 0 ic = nil begin ic = Ice::initialize(ARGV) base = ic.stringToProxy("Meta:tcp -h 127.0.0.1 -p 6502") meta = Murmur::MetaPrx::checkedCast(base) unless meta rais "invalid proxy" end # All commands are documented here: # http://mumble.sourceforge.net/slice/?title=slice servers = meta.getBootedServers puts "Server version:", meta.getVersion[3] servers.each do |server| puts "" puts "Server name:"+server.getConf('registername') channels = server.getChannels players = server.getPlayers players.each do |id,player| channel = channels[player.channel] puts player.name+" in "+channel.name end end rescue puts $! puts $!.backtrace.join("\n") status = 1 end if ic # Clean up begin ic.destroy() rescue puts $! puts $!.backtrace.join("\n") status = 1 end end exit(status) mumble-1.3.4/scripts/server/ice/testcallback.py0000775000175000017500000000677714010707273021430 0ustar builderbuilder#!/usr/bin/env python # -*- coding: utf-8 import Ice, sys, sha from M2Crypto import X509; Ice.loadSlice('', ['-I' + Ice.getSliceDir(), 'Murmur.ice']) import Murmur class MetaCallbackI(Murmur.MetaCallback): def started(self, s, current=None): print "started" serverR=Murmur.ServerCallbackPrx.uncheckedCast(adapter.addWithUUID(ServerCallbackI(server, current.adapter))) s.addCallback(serverR) def stopped(self, s, current=None): print "stopped" class ServerCallbackI(Murmur.ServerCallback): def __init__(self, server, adapter): self.server = server self.contextR=Murmur.ServerContextCallbackPrx.uncheckedCast(adapter.addWithUUID(ServerContextCallbackI(server))) def userConnected(self, p, current=None): print "connected" print p self.server.addContextCallback(p.session, "flubber", "Power up the T", self.contextR, Murmur.ContextChannel | Murmur.ContextUser) if (self.server.hasPermission(p.session, 0, Murmur.PermissionWrite)): print "Is a global admin" certlist=self.server.getCertificateList(p.session) for cert in certlist: hash = sha.new() hash.update(cert) cert = X509.load_cert_der_string(cert) print cert.get_subject(), "issued by", cert.get_issuer(), "hash", hash.hexdigest() if current: print current.ctx def userDisconnected(self, p, current=None): print "disconnected" print p def userStateChanged(self, p, current=None): print "stateChanged" print self.server print p def userTextMessage(self, p, msg, current=None): print "userTextMessage" print self.server print p print msg def channelCreated(self, c, current=None): print "created" print c def channelRemoved(self, c, current=None): print "removed" print c def channelStateChanged(self, c, current=None): print "stateChanged" print c class ServerContextCallbackI(Murmur.ServerContextCallback): def __init__(self, server): self.server = server def contextAction(self, action, p, session, chanid, current=None): print "aaand ACTION" print action print p print session print chanid if (session != 0): server.sendMessage(session, "Bouncy") elif (chanid >= 0): server.sendMessageChannel(chanid, 0, "Channel Bouncy") if __name__ == "__main__": global contextR prop = Ice.createProperties(sys.argv) prop.setProperty("Ice.ImplicitContext", "Shared") idd = Ice.InitializationData() idd.properties = prop ice = Ice.initialize(idd) print "Creating callbacks...", # If icesecret is set, we need to set it here as well. ice.getImplicitContext().put("secret", "fourtytwo") meta = Murmur.MetaPrx.checkedCast(ice.stringToProxy('Meta:tcp -h 127.0.0.1 -p 6502')) adapter = ice.createObjectAdapterWithEndpoints("Callback.Client", "tcp -h 127.0.0.1") metaR=Murmur.MetaCallbackPrx.uncheckedCast(adapter.addWithUUID(MetaCallbackI())) adapter.activate() meta.addCallback(metaR) for server in meta.getBootedServers(): serverR=Murmur.ServerCallbackPrx.uncheckedCast(adapter.addWithUUID(ServerCallbackI(server, adapter))) server.addCallback(serverR) print "Done" print 'Script running (press CTRL-C to abort)'; try: ice.waitForShutdown() except KeyboardInterrupt: print 'CTRL-C caught, aborting' meta.removeCallback(metaR) ice.shutdown() print "Goodbye" mumble-1.3.4/scripts/server/ice/testauth.py0000775000175000017500000000661514010707273020624 0ustar builderbuilder#!/usr/bin/env python # -*- coding: utf-8 import Ice, sys, time from M2Crypto import X509; Ice.loadSlice('', ['-I' + Ice.getSliceDir(), 'Murmur.ice']) import Murmur class ServerAuthenticatorI(Murmur.ServerUpdatingAuthenticator): def __init__(self, server, adapter): self.server = server def authenticate(self, name, pw, certlist, certhash, strong, current=None): print certhash, strong for cert in certlist: cert = X509.load_cert_der_string(cert) print cert.get_subject(), "issued by", cert.get_issuer() groups = ("GroupA", "GroupB"); if (name == "One"): if (pw == "Magic"): return (1, "One", groups) else: return (-1, None, None) elif (name == "Two"): if (pw == "Mushroom"): return (2, "twO", groups) else: return (-1, None, None) elif (name == "White Space"): if (pw == "Space White"): return (3, "White Space", groups) else: return (-1, None, None) elif (name == "Fail"): time.sleep(6) return (-2, None, None) def getInfo(self, id, current=None): print "getInfo ", id name = self.idToName(id); if (name == None): return (False, {}) map = {} map[Murmur.UserInfo.UserName]=name return (True, map) def nameToId(self, name, current=None): if (name == "One"): return 1 elif (name == "Twoer"): return 2 else: return -2; def idToName(self, id, current=None): if (id == 1): return "One" elif (id == 2): return "Two" else: return None def idToTexture(self, id, current=None): print "idToTexture", id return open("../icons/mumble.osx.png").read(); # The expanded methods from UpdatingAuthenticator. We only implement a subset for this example, but # a valid implementation has to define all of them def registerUser(self, name, current=None): print "Someone tried to register " + name[Murmur.UserInfo.UserName] return -2 def unregisterUser(self, id, current=None): print "Unregister ", id return -2 def getRegistration(self, id, current=None): return (-2, None, None) def setInfo(self, id, info, current=None): print "Set", id, info return -1 if __name__ == "__main__": global contextR print "Creating callbacks...", ice = Ice.initialize(sys.argv) meta = Murmur.MetaPrx.checkedCast(ice.stringToProxy('Meta:tcp -h 127.0.0.1 -p 6502')) adapter = ice.createObjectAdapterWithEndpoints("Callback.Client", "tcp -h 127.0.0.1") adapter.activate() for server in meta.getBootedServers(): serverR=Murmur.ServerUpdatingAuthenticatorPrx.uncheckedCast(adapter.addWithUUID(ServerAuthenticatorI(server, adapter))) server.setAuthenticator(serverR) print "Done" map = {}; map[Murmur.UserInfo.UserName] = 'TestUser'; for server in meta.getBootedServers(): ids= server.getUserIds(["TestUser"]) for name,id in ids.iteritems(): if (id > 0): print "Will unregister ", id server.unregisterUser(id) server.registerUser(map) print 'Script running (press CTRL-C to abort)'; try: ice.waitForShutdown() except KeyboardInterrupt: print 'CTRL-C caught, aborting' meta.removeCallback(metaR) ice.shutdown() print "Goodbye" mumble-1.3.4/scripts/server/ice/icedemo.php0000664000175000017500000002033514010707273020517 0ustar builderbuilder Userlist 0) { for($i=1;$i<$argc;$i++) { parse_str($argv[$i], $tmp); $_REQUEST=array_merge($_REQUEST, $tmp); } } function ucmp($a, $b) { if (($a->playerid == 0) || ($b->playerid == 0)) { return ($a->playerid - $b->playerid); } return strcasecmp($a->name, $b->name); } $confitems = array(); $confbig = array(); $confitems['host']="IP Address to bind to"; $confitems['port']="Port to use"; $confitems['password']="Password for unregistered users"; $confitems['timeout']="Timeout before kicking dead connections"; $confitems['bandwidth']="Maximum bandwidth in bytes/sec"; $confitems['users']="Maximum number of users on server"; $confitems['welcometext']="Welcome message"; $confbig['welcometext']=1; $confitems['registername']="Server Name"; $confitems['registerpassword']="Password for Global Server List"; $confitems['registerhostname']="Hostname for Global Server List"; $confitems['registerurl']="HTTP URL for Global Server List"; $confitems['certificate']="PEM Encoded SSL Certificate"; $confbig['certificate']=1; $confitems['key']="PEM Encoded SSL Key"; $confbig['key']=1; try { $base = $ICE->stringToProxy("Meta:tcp -h 127.0.0.1 -p 6502"); $meta = $base->ice_checkedCast("::Murmur::Meta"); $default = $meta->getDefaultConf(); if (! is_null($_REQUEST['newserver'])) { $meta->newServer(); } else if (! is_null($_REQUEST['delserver'])) { $meta->getServer((int)$_REQUEST['delserver'])->delete(); } else if (! is_null($_REQUEST['stop'])) { $meta->getServer((int) $_REQUEST['stop'])->stop(); } else if (! is_null($_REQUEST['start'])) { $meta->getServer((int) $_REQUEST['start'])->start(); } else if (! is_null($_REQUEST['action'])) { $server = $meta->getServer((int) $_REQUEST['action']); if (!is_null($_REQUEST['kick'])) { $server->kickPlayer((int) $_REQUEST['kick'], "Mushroom"); } } else if (! is_null($_REQUEST['uedit'])) { $server = $meta->getServer((int) $_REQUEST['uedit']); if (isset($_REQUEST['newplayer'])) { $reg = array(); $reg[Murmur_UserInfo::UserName] = $_REQUEST['newplayer']; if ($_REQUEST['password']) $reg[Murmur_UserInfo::UserPassword] = $_REQUEST['password']; // This line is added for password at user creation $_REQUEST['uid'] = $server->registerUser($reg); } if (! is_null($_REQUEST['deleteplayer'])) { $server->unregisterUser((int) $_REQUEST['deleteplayer']); } if (! is_null($_REQUEST['uid'])) { $uid = (int) $_REQUEST['uid']; $user = $server->getRegistration($uid); if (! is_null($_REQUEST['set'])) { $user[Murmur_UserInfo::UserEmail] = $_REQUEST['email']; $user[Murmur_UserInfo::UserPassword] = $_REQUEST['pw']; $server->updateRegistration($uid,$user); } else { echo "
    \n"; echo "

    \n"; echo "Name: ".$user[Murmur_UserInfo::UserName]."
    \n"; echo "\n"; echo "id()."\" />\n"; echo "\n"; echo "Email:
    \n"; echo "New password:
    \n"; echo "\n"; echo "

    \n"; echo "
    \n"; } } echo "

    Registered User List

    \n"; echo "
    \n"; echo "

    \n"; echo "id()."\" />\n"; echo "New User:"; echo ""; echo "User Password:"; echo ""; echo "\n"; echo "

    \n"; echo "
    \n"; echo "\n"; echo "\n"; $users = $server->getRegisteredUsers(""); foreach($users as $id=>$name) { $u = $server->getRegistration($id); echo "\n"; } echo "
    UserNameEmail
    $name $id".$u[Murmur_UserInfo::UserEmail].""; echo "id()."&uid=".$id."\">[Edit] "; echo "id()."&deleteplayer=".$id."\">[Unregister] "; echo "
    \n"; } else if (! is_null($_REQUEST['server'])) { $server = $meta->getServer($_REQUEST['server'] + 0); if (! is_null($_REQUEST['set'])) { foreach($confitems as $key=>$desc) { $server->setConf($key, $_REQUEST[$key]); } } else { $conf = $server->getAllConf(); $default['port'] += $server->id() - 1; echo "

    Server Configuration

    \n"; echo "
    \n"; echo "
    \n"; echo "id()."\" />\n"; echo "\n"; echo "
    \n"; echo "\n"; foreach($confitems as $key=>$desc) { if (! isset($confbig[$key])) { echo "\n"; } else { echo ""; echo "\n"; } } echo "
    DescriptionDefaultValue
    $desc".htmlspecialchars($default[$key]).""; echo ""; echo "
    $desc".htmlspecialchars($default[$key])."
     "; echo "
    \n"; echo "
    \n"; echo "
    \n"; } } $servers = $meta->getAllServers(); $booted = $meta->getBootedServers(); echo "

    Murmur ICE Interface demo

    \n"; echo "

    Warning: This is not intended as a full management suite. It's an example. It has bugs. It has security holes. "; echo "It might make precious body parts fall off. Do not run it on a production server.\n"; echo "

    \n"; echo "

    \n"; echo "[New Server]\n"; echo "

    \n"; foreach($servers as $s) { $name = $s->getConf("registername"); if (! $name) { $name = $default["registername"]; } $id = $s->id(); echo "

    SERVER #" . $id . " " .$name ."

    \n"; echo "

    \n"; echo "[Config] "; if (in_array($s, $booted)) { echo "[Manage Users] "; echo "[Stop] "; } else { echo "[Delete Server] "; echo "[Start] "; } echo "

    \n"; if (in_array($s, $booted)) { echo "\n"; $channels = $s->getChannels(); $players = $s->getUsers(); foreach($players as $pid => $state) { $chan = $channels[$state->channel]; echo "\n"; } echo "
    NameChannelActions
    ".$state->name."".$chan->name.""; echo "session\">[Kick]"; echo "
    \n"; } } } catch (Ice_Exception $ex) { echo "

    \n

    \n";
      print_r($ex);
      echo "
    \n

    \n"; } ?> mumble-1.3.4/scripts/server/ice/weblist.php0000664000175000017500000000257214010707273020566 0ustar builderbuilder Userlist = 30400) { if (!stream_resolve_include_path('Ice.php')) { exit('The required file Ice.php could not be found in the PHP include path(s).'); } if (!stream_resolve_include_path('Murmur.php')) { exit('The required file Murmur.php could not be found in the PHP include path(s).'); } require 'Ice.php'; require 'Murmur.php'; } else { Ice_loadProfile(); } try { if (Ice_intversion() >= 30400) { $ICE = Ice_initialize(); } $base = $ICE->stringToProxy("Meta:tcp -h 127.0.0.1 -p 6502"); $meta = $base->ice_checkedCast("::Murmur::Meta"); $servers = $meta->getBootedServers(); $default = $meta->getDefaultConf(); foreach($servers as $s) { $name = $s->getConf("registername"); if (! $name) { $name = $default["registername"]; } echo "

    SERVER #" . $s->id() . " " .$name ."

    \n"; echo "\n"; $channels = $s->getChannels(); $players = $s->getUsers(); foreach($players as $id => $state) { $chan = $channels[$state->channel]; echo "\n"; } echo "
    NameChannel
    ".$state->name."".$chan->name."
    \n"; } } catch (Ice_LocalException $ex) { print_r($ex); } ?> mumble-1.3.4/scripts/server/ice/glacier/0000775000175000017500000000000014010707273020004 5ustar builderbuildermumble-1.3.4/scripts/server/ice/glacier/glacier.php0000664000175000017500000000227714010707273022133 0ustar builderbuilder Userlist stringToProxy("Glacier2/router:tcp -p 4063 -h 128.39.114.1"); $router = $router->ice_uncheckedCast("::Glacier2::Router")->ice_router(null); $session = $router->createSession("testuser", "testpass"); $base = $ICE->stringToProxy("Meta:tcp -h 127.0.0.1 -p 6502")->ice_router($router); $meta = $base->ice_checkedCast("::Murmur::Meta"); $servers = $meta->getBootedServers(); $default = $meta->getDefaultConf(); foreach($servers as $s) { $s = $s->ice_router($router); $name = $s->getConf("registername"); if (! $name) { $name = $default["registername"]; } echo "

    SERVER #" . $s->id() . " " .$name ."

    \n"; echo "\n"; $channels = $s->getChannels(); $players = $s->getUsers(); foreach($players as $id => $state) { $chan = $channels[$state->channel]; echo "\n"; } echo "
    NameChannel
    ".$state->name."".$chan->name."
    \n"; } } catch (Ice_LocalException $ex) { print_r($ex); } ?> mumble-1.3.4/scripts/server/ice/glacier/config0000664000175000017500000000015614010707273021176 0ustar builderbuilderGlacier2.Client.Endpoints=tcp -h 0.0.0.0 -p 4063 Glacier2.SessionTimeout=60 Glacier2.CryptPasswords=passwords mumble-1.3.4/scripts/server/ice/glacier/passwords0000664000175000017500000000014214010707273021751 0ustar builderbuilder# Username/password pairs. # passwords are generated with 'openssl passwd' testuser Ok0Z9JAEBWiAY mumble-1.3.4/scripts/git2cl.pl0000775000175000017500000000376314010707273016065 0ustar builderbuilder#! /usr/bin/perl -w # # Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . use warnings; use strict; use XML::Simple; use Data::Dumper; use Date::Parse; use Text::Wrap qw(wrap fill); open(LOG, "git log origin/master --date=short --pretty=format:'%h%x00%an%x00%ae%x00%ad%x00%s'|"); my %dates; my %authors; my $lsub = ''; while() { chomp(); my ($hash,$author,$email,$date,$subject) = split(/\0/,$_); if ($author eq "Thorvald Natvig") { # Because someone forgets to set their git username on every platform... $email = 'slicer@users.sourceforge.net'; } if ($subject =~ s/\s*\[([\w-]+)\]\s*$//) { $author = $1; $email = lc "$1\@users.sourceforge.net"; } if (! exists($authors{$email})) { $authors{$email}=$author; } next if ($subject =~ /^Merge branch 'master/); next if ($subject =~ /^Indent and submodule update/); next if ($subject =~ /^Indent, changelog and submodule update/); next if ($subject =~ /^Indent, changelog, submodule and language update/); next if ($subject =~ /^Indent run/); next if ($subject =~ /^\*\*\* empty log message/); next if ($subject =~ /^git-svn-id: http/); next if ($subject =~ /^TEST/); next if ($subject =~ /^Merge pull request/); next if ($subject eq $lsub); $lsub = $subject; my $entry = wrap(" $hash ", " ", $subject); if (! exists($dates{$date})) { $dates{$date} = {}; } if (! exists($dates{$date}{$email})) { $dates{$date}{$email} = (); } push @{$dates{$date}{$email}},$entry; } close(LOG); open(C, ">CHANGES"); foreach my $date (reverse sort keys %dates) { print C $date."\n"; my $h = $dates{$date}; my $first = 1; foreach my $author (sort keys %$h) { print C " ".$authors{$author}." <$author>\n"; print C join("\n", @{$dates{$date}{$author}}); print C "\n\n"; } } close(C); mumble-1.3.4/scripts/generate-AUTHORS.py0000664000175000017500000001432414010707273017623 0ustar builderbuilder#!/usr/bin/env python # -*- coding: utf-8 -*- # # Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . from __future__ import (unicode_literals, print_function, division) import sys import subprocess import codecs import pyuca blacklist = ( # Unknown "(no author) <(no author)@05730e5d-ab1b-0410-a4ac-84af385074fa>", "root ", "unknown ", # Bots "MumbleTransifexBot ", # ...What? "Netbios Domain Administrator ", ) # These are authors whose patches were applied during # the time when Mumble used SVN for version control. # The patches themselves are in Git, but the author # and commiter metadata in Git does not reflect the # actual patch author. # This list has been manually compiled by looking # through the Git history. patchAuthors = ( # Via 6cc47c35cac16877e119cef35d9255918849495d "Opalium ", # Via d16876d804d028153f37f4f8aff770469edf6997 "Marc Deslauriers ", # Via bd690db64560cd1785c9aaed86547ffe681b60db "Otto Allmendinger ", # Via 143589b1a8f264026c12f974e084030eaba51428 "ozon ", # Via 1b048e6c1516eee4f932f9f9eeeb6b13de5d15cb "Cesare Tirabassi ", # Via ddfc033c3c20a67994ef6329691f2a3616a346c0 "Stefan Gehn ", # Via c317abec96d9007cc7ca95f54e5193b48268e7ad "Thibault Capdevielled ", # Via 51510ff8f744adc281c4eca6c0fdef5ba2ab9cbb "Jan Braun ", # Via 887368a9fb5a6d35c3750a5f48d1293d4fc58df3 "Balazs Nagy ", # Via 7814dba5f86b69f446e45c639ae3db7adfaf9c48 "Jerome Vidal ", # Via 82e4966bba8d390e22f43d15764c6c272dd91e2b "Matt M. ", # Via b40cf89632a8ac46ac92d8a7fa4091c7d035122a "mystic_sam ", # Via 2cecce4270555e4b7fc4c9e3f39c064f72247667 "Entitaet ", # Via 2a6ae358c37ff0c3570ebcb8466aacd673352b95 "Jakob Dettner ", # Via b8ff5eed6ef0835b4db2ed160f1e41a045d16db4 "derandi ", # Via b2f70a7802e90eea0d04eef7edc0a52178fda753 "Prosper_Spurius ", # Via 9952748561122969d02f2d9ebc49b001ffe82823 "Leszek Godlewski ", # Via 2c0a0ff8244966be4d058742a3c01859bad44b37 "Mark Schreiber ", # Via 39005601bb92b8f994e8e50887b3bb6535a2c305 "Sebastian Schlingmann ", # Via d2b735799ca37d957def45816766ef266c2b7057 "Arseniy Lartsev ", # Via 12191680451f0f9d31526908a9c0ded669f05cb8 "javitonino ", # Via 82ffa8948f06f87f58ca7072960d7c54729e7e8b "Thibaut Girka", # Via a1ba43376db2ec76f2cf244793bfc1565ac88454 "Jérôme \"buggerone\" ", # Via 0d9f5d03426735c4d42e9cd9fe81868b1437aa06 "Friedrich Uz-Valentin ", # Added to AudioConfigDialog.cpp's license header # in 324540e8fab00af7a894c8ce7ad5a726cde80034 by # slicer. "Andreas Messer ", ) def gitAuthorsOutput(): p = subprocess.Popen(["git", "log", "--use-mailmap", "--format=%aN <%aE>", "origin/master", "origin/1.2.x"], stdout=subprocess.PIPE) stdout, stderr = p.communicate() if stdout is not None: stdout = stdout.decode('utf-8') if stderr is not None: stderr = stderr.decode('utf-8') if p.returncode != 0: raise Exception('"git log" failed: %s', stderr) return stdout def main(): authorsSet = set() authorsText = gitAuthorsOutput() for line in authorsText.split("\n"): if line == '': continue # Email addresses completely when they are not set. # See for example "zapman ". if " " in line: line = line.replace(" ", "") # Use GitHub URL instead of $user@users.noreply.github.com if '@users.noreply.github.com' in line: line = line.replace('@users.noreply.github.com', '') line = line.replace('<', '. // // Contributions made on behalf of another entity, such as a // company are indicated with the following suffix: // // John Doe (on behalf of $COMPANY) // // It is possible to mix individual contributions with company // contributions. For example, if a contributor, over time, // has contributed code copyrighted by the contributor, as well // as various companies: // // John Doe (individually, on behalf of // $COMPANY1, on behalf of // $COMPANY2, [...]). // // Mumble's code is developed in a Git repository. A log of // every contribution ever made to Mumble is available in the // Git repository. The Git repository can be queried to get // detailed authorship information for copyright and attribution // purposes for each file that makes up the software. A detailed // analysis of contributions made to Mumble is available via GitHub's // contribution statistics: // // ''') # Sort alphabetically authors = list(authorsSet) collator = pyuca.Collator() authors.sort(key=collator.sort_key) for author in authors: f.write(author) f.write("\n") f.write(""" // Special thanks to: // // Thorvald Natvig, for founding the Mumble project // and maintaining it during its formative years. """) f.close() if __name__ == '__main__': main() mumble-1.3.4/scripts/murmur.ini.osx0000664000175000017500000003664014010707354017201 0ustar builderbuilder; Murmur configuration file. ; ; General notes: ; * Settings in this file are default settings and many of them can be overridden ; with virtual server specific configuration via the Ice or DBus interface. ; * Due to the way this configuration file is read some rules have to be ; followed when specifying variable values (as in variable = value): ; * Make sure to quote the value when using commas in strings or passwords. ; NOT variable = super,secret BUT variable = "super,secret" ; * Make sure to escape special characters like '\' or '"' correctly ; NOT variable = """ BUT variable = "\"" ; NOT regex = \w* BUT regex = \\w* ; Path to database. If blank, will search for ; murmur.sqlite in default locations or create it if not found. database= ; Murmur defaults to using SQLite with its default rollback journal. ; In some situations, using SQLite's write-ahead log (WAL) can be ; advantageous. ; If you encounter slowdowns when moving between channels and similar ; operations, enabling the SQLite write-ahead log might help. ; ; To use SQLite's write-ahead log, set sqlite_wal to one of the following ; values: ; ; 0 - Use SQLite's default rollback journal. ; 1 - Use write-ahead log with synchronous=NORMAL. ; If Murmur crashes, the database will be in a consistent state, but ; the most recent changes might be lost if the operating system did ; not write them to disk yet. This option can improve Murmur's ; interactivity on busy servers, or servers with slow storage. ; 2 - Use write-ahead log with synchronous=FULL. ; All database writes are synchronized to disk when they are made. ; If Murmur crashes, the database will be include all completed writes. ;sqlite_wal=0 ; If you wish to use something other than SQLite, you'll need to set the name ; of the database above, and also uncomment the below. ; Sticking with SQLite is strongly recommended, as it's the most well tested ; and by far the fastest solution. ; ;dbDriver=QMYSQL ;dbUsername= ;dbPassword= ;dbHost= ;dbPort= ;dbPrefix=murmur_ ;dbOpts= ; Murmur defaults to not using D-Bus. If you wish to use dbus, which is one of the ; RPC methods available in Murmur, please specify so here. ; ;dbus=session ; Alternate D-Bus service name. Only use if you are running distinct ; murmurd processes connected to the same D-Bus daemon. ;dbusservice=net.sourceforge.mumble.murmur ; If you want to use ZeroC Ice to communicate with Murmur, you need ; to specify the endpoint to use. Since there is no authentication ; with ICE, you should only use it if you trust all the users who have ; shell access to your machine. ; Please see the ICE documentation on how to specify endpoints. ice="tcp -h 127.0.0.1 -p 6502" ; Ice primarily uses local sockets. This means anyone who has a ; user account on your machine can connect to the Ice services. ; You can set a plaintext "secret" on the Ice connection, and ; any script attempting to access must then have this secret ; (as context with name "secret"). ; Access is split in read (look only) and write (modify) ; operations. Write access always includes read access, ; unless read is explicitly denied (see note below). ; ; Note that if this is uncommented and with empty content, ; access will be denied. ;icesecretread= icesecretwrite= ; If you want to expose Murmur's experimental gRPC API, you ; need to specify an address to bind on. ; Note: not all builds of Murmur support gRPC. If gRPC is not ; available, Murmur will warn you in its log output. ;grpc="127.0.0.1:50051" ; Specifying both a certificate and key file below will cause gRPC to use ; secured, TLS connections. ;grpccert="" ;grpckey="" ; Specifies the file Murmur should log to. By default, Murmur ; logs to the file 'murmur.log'. If you leave this field blank ; on Unix-like systems, Murmur will force itself into foreground ; mode which logs to the console. ;logfile=murmur.log ; If set, Murmur will write its process ID to this file ; when running in daemon mode (when the -fg flag is not ; specified on the command line). Only available on ; Unix-like systems. ;pidfile= ; The below will be used as defaults for new configured servers. ; If you're just running one server (the default), it's easier to ; configure it here than through D-Bus or Ice. ; ; Welcome message sent to clients when they connect. ; If the welcome message is set to an empty string, ; no welcome message will be sent to clients. welcometext="
    Welcome to this server running Murmur.
    Enjoy your stay!
    " ; Port to bind TCP and UDP sockets to. port=64738 ; Specific IP or hostname to bind to. ; If this is left blank (default), Murmur will bind to all available addresses. ;host= ; Password to join server. serverpassword= ; Maximum bandwidth (in bits per second) clients are allowed ; to send speech at. bandwidth=72000 ; Murmur and Mumble are usually pretty good about cleaning up hung clients, but ; occasionally one will get stuck on the server. The timeout setting will cause ; a periodic check of all clients who haven't communicated with the server in ; this many seconds - causing zombie clients to be disconnected. ; ; Note that this has no effect on idle clients or people who are AFK. It will ; only affect people who are already disconnected, and just haven't told the ; server. ;timeout=30 ; Maximum number of concurrent clients allowed. users=100 ; Where users sets a blanket limit on the number of clients per virtual server, ; usersperchannel sets a limit on the number per channel. The default is 0, for ; no limit. ;usersperchannel=0 ; Per-user rate limiting ; ; These two settings allow to configure the per-user rate limiter for some ; command messages sent from the client to the server. The messageburst setting ; specifies an amount of messages which are allowed in short bursts. The ; messagelimit setting specifies the number of messages per second allowed over ; a longer period. If a user hits the rate limit, his packages are then ignored ; for some time. Both of these settings have a minimum of 1 as setting either to ; 0 could render the server unusable. messageburst=5 messagelimit=1 ; Respond to UDP ping packets. ; ; Setting to true exposes the current user count, the maximum user count, and ; the server's maximum bandwidth per client to unauthenticated users. In the ; Mumble client, this information is shown in the Connect dialog. allowping=true ; Amount of users with Opus support needed to force Opus usage, in percent. ; 0 = Always enable Opus, 100 = enable Opus if it's supported by all clients. ;opusthreshold=100 ; Maximum depth of channel nesting. Note that some databases like MySQL using ; InnoDB will fail when operating on deeply nested channels. ;channelnestinglimit=10 ; Maximum number of channels per server. 0 for unlimited. Note that an ; excessive number of channels will impact server performance ;channelcountlimit=1000 ; Regular expression used to validate channel names. ; (Note that you have to escape backslashes with \ ) ;channelname=[ \\-=\\w\\#\\[\\]\\{\\}\\(\\)\\@\\|]+ ; Regular expression used to validate user names. ; (Note that you have to escape backslashes with \ ) ;username=[-=\\w\\[\\]\\{\\}\\(\\)\\@\\|\\.]+ ; If a user has no stored channel (they've never been connected to the server ; before, or rememberchannel is set to false) and the client hasn't been given ; a URL that includes a channel path, the default behavior is that they will ; end up in the root channel. ; ; You can set this setting to a channel ID, and the user will automatically be ; moved into that channel instead. Note that this is the numeric ID of the ; channel, which can be a little tricky to get (you'll either need to use an ; RPC mechanism, watch the console of a debug client, or root around through ; the Murmur Database to get it). ; ;defaultchannel=0 ; When a user connects to a server they've already been on, by default the ; server will remember the last channel they were in and move them to it ; automatically. Toggling this setting to false will disable that feature. ; ;rememberchannel=true ; Maximum length of text messages in characters. 0 for no limit. ;textmessagelength=5000 ; Maximum length of text messages in characters, with image data. 0 for no limit. ;imagemessagelength=131072 ; Allow clients to use HTML in messages, user comments and channel descriptions? ;allowhtml=true ; Murmur retains the per-server log entries in an internal database which ; allows it to be accessed over D-Bus/ICE. ; How many days should such entries be kept? ; Set to 0 to keep forever, or -1 to disable logging to the DB. ;logdays=31 ; To enable public server registration, the serverpassword must be blank, and ; this must all be filled out. ; The password here is used to create a registry for the server name; subsequent ; updates will need the same password. Don't lose your password. ; The URL is your own website, and only set the registerHostname for static IP ; addresses. ; Location is typically the country of typical users of the server, in ; two-letter TLD style (ISO 3166-1 alpha-2 country code) ; ; If you only wish to give your "Root" channel a custom name, then only ; uncomment the 'registerName' parameter. ; ;registerName=Mumble Server ;registerPassword=secret ;registerUrl=http://www.mumble.info/ ;registerHostname= ;registerLocation= ; If this option is enabled, the server will announce its presence via the ; bonjour service discovery protocol. To change the name announced by bonjour ; adjust the registerName variable. ; See http://developer.apple.com/networking/bonjour/index.html for more information ; about bonjour. ;bonjour=True ; If you have a proper SSL certificate, you can provide the filenames here. ; Otherwise, Murmur will create its own certificate automatically. ;sslCert= ;sslKey= ; If the keyfile specified above is encrypted with a passphrase, you can enter ; it in this setting. It must be plaintext, so you may wish to adjust the ; permissions on your murmur.ini file accordingly. ;sslPassPhrase= ; If your certificate is signed by an authority that uses a sub-signed or ; "intermediate" certificate, you probably need to bundle it with your ; certificate in order to get Murmur to accept it. You can either concatenate ; the two certificates into one file, or you can put it in a file by itself and ; put the path to that PEM-file in sslCA. ;sslCA= ; The sslDHParams option allows you to specify a PEM-encoded file with ; Diffie-Hellman parameters, which will be used as the default Diffie- ; Hellman parameters for all virtual servers. ; ; Instead of pointing sslDHParams to a file, you can also use the option ; to specify a named set of Diffie-Hellman parameters for Murmur to use. ; Murmur comes bundled with the Diffie-Hellman parameters from RFC 7919. ; These parameters are available by using the following names: ; ; @ffdhe2048, @ffdhe3072, @ffdhe4096, @ffdhe6144, @ffdhe8192 ; ; By default, Murmur uses @ffdhe2048. ;sslDHParams=@ffdhe2048 ; The sslCiphers option chooses the cipher suites to make available for use ; in SSL/TLS. This option is server-wide, and cannot be set on a ; per-virtual-server basis. ; ; This option is specified using OpenSSL cipher list notation (see ; https://www.openssl.org/docs/apps/ciphers.html#CIPHER-LIST-FORMAT). ; ; It is recommended that you try your cipher string using 'openssl ciphers ' ; before setting it here, to get a feel for which cipher suites you will get. ; ; After setting this option, it is recommend that you inspect your Murmur log ; to ensure that Murmur is using the cipher suites that you expected it to. ; ; Note: Changing this option may impact the backwards compatibility of your ; Murmur server, and can remove the ability for older Mumble clients to be able ; to connect to it. ;sslCiphers=EECDH+AESGCM:EDH+aRSA+AESGCM:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:AES256-SHA:AES128-SHA ; If Murmur is started as root, which user should it switch to? ; This option is ignored if Murmur isn't started with root privileges. ;uname= ; By default, in log files and in the user status window for privileged users, ; Mumble will show IP addresses - in some situations you may find this unwanted ; behavior. If obfuscate is set to true, Murmur will randomize the IP addresses ; of connecting users. ; ; The obfuscate function only affects the log file and DOES NOT effect the user ; information section in the client window. ;obfuscate=false ; If this options is enabled, only clients which have a certificate are allowed ; to connect. ;certrequired=False ; If enabled, clients are sent information about the servers version and operating ; system. ;sendversion=True ; You can set a recommended minimum version for your server, and clients will ; be notified in their log when they connect if their client does not meet the ; minimum requirements. suggestVersion expects the version in the format X.X.X. ; ; Note that the suggest* options appeared after 1.2.3 and will have no effect ; on client versions 1.2.3 and earlier. ; ;suggestVersion= ; Setting this to "true" will alert any user who does not have positional audio ; enabled that the server administrators recommend enabling it. Setting it to ; "false" will have the opposite effect - if you do not care whether the user ; enables positional audio or not, set it to blank. The message will appear in ; the log window upon connection, but only if the user's settings do not match ; what the server requests. ; ; Note that the suggest* options appeared after 1.2.3 and will have no effect ; on client versions 1.2.3 and earlier. ; ;suggestPositional= ; Setting this to "true" will alert any user who does not have Push-To-Talk ; enabled that the server administrators recommend enabling it. Setting it to ; "false" will have the opposite effect - if you do not care whether the user ; enables PTT or not, set it to blank. The message will appear in the log ; window upon connection, but only if the user's settings do not match what the ; server requests. ; ; Note that the suggest* options appeared after 1.2.3 and will have no effect ; on client versions 1.2.3 and earlier. ; ;suggestPushToTalk= ; This sets password hash storage to legacy mode (1.2.4 and before) ; (Note that setting this to true is insecure and should not be used unless absolutely necessary) ;legacyPasswordHash=false ; By default a strong amount of PBKDF2 iterations are chosen automatically. If >0 this setting ; overrides the automatic benchmark and forces a specific number of iterations. ; (Note that you should only change this value if you know what you are doing) ;kdfIterations=-1 ; In order to prevent misconfigured, impolite or malicious clients from ; affecting the low-latency of other users, Murmur has a rudimentary global-ban ; system. It's configured using the autobanAttempts, autobanTimeframe and ; autobanTime settings. ; ; If a client attempts autobanAttempts connections in autobanTimeframe seconds, ; they will be banned for autobanTime seconds. This is a global ban, from all ; virtual servers on the Murmur process. It will not show up in any of the ; ban-lists on the server, and they can't be removed without restarting the ; Murmur process - just let them expire. A single, properly functioning client ; should not trip these bans. ; ; To disable, set autobanAttempts or autobanTimeframe to 0. Commenting these ; settings out will cause Murmur to use the defaults: ; ;autobanAttempts=10 ;autobanTimeframe=120 ;autobanTime=300 ; You can configure any of the configuration options for Ice here. We recommend ; leave the defaults as they are. ; Please note that this section has to be last in the configuration file. ; [Ice] Ice.Warn.UnknownProperties=1 Ice.MessageSizeMax=65536 mumble-1.3.4/scripts/travis-ci/0000775000175000017500000000000014010707273016231 5ustar builderbuildermumble-1.3.4/scripts/travis-ci/script.bash0000775000175000017500000001027014010707273020377 0ustar builderbuilder#!/bin/bash -ex # # Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . if [ "${TRAVIS_REPO_SLUG}" == "mumble-voip/mumble" ] && [ "${TRAVIS_PULL_REQUEST}" == "false" ]; then if [ "${TRAVIS_BRANCH}" == "master" ]; then MASTER_BRANCH=1 fi fi if [ "${TRAVIS_OS_NAME}" == "linux" ]; then if [ "${MUMBLE_QT}" == "qt4" ] && [ "${MUMBLE_HOST}" == "x86_64-linux-gnu" ]; then EXTRA_CONFIG= if [ "${MUMBLE_NO_PCH}" == "1" ]; then EXTRA_CONFIG="no-pch ${EXTRA_CONFIG}" fi qmake-qt4 CONFIG+="release tests g15-emulator qt4-legacy-compat ${EXTRA_CONFIG}" -recursive make -j2 make check elif [ "${MUMBLE_QT}" == "qt5" ] && [ "${MUMBLE_HOST}" == "x86_64-linux-gnu" ]; then EXTRA_CONFIG=PREFIX=/usr if [ "${MUMBLE_NO_PCH}" == "1" ]; then EXTRA_CONFIG="no-pch ${EXTRA_CONFIG}" fi qmake CONFIG+="release tests g15-emulator ${EXTRA_CONFIG}" DEFINES+="MUMBLE_VERSION=${TRAVIS_COMMIT:0:7}" -recursive if [ "${MUMBLE_NO_PCH}" == "1" ] && [ "${MASTER_BRANCH}" = "1" ]; then # Wraps the compilation with the Build Wrapper to generate the configuration used later by the SonarQube Scanner. mkdir build build-wrapper-linux-x86-64 --out-dir build/sonar make -j 2 make check # Run the SonarQube analysis sonar-scanner else make -j2 make check if [ "${MASTER_BRANCH}" = "1" ]; then # The next few lines should really be done by "make install"; https://github.com/mumble-voip/mumble/issues/1029 mkdir -p appdir/usr/bin appdir/usr/lib/mumble appdir/usr/share/metainfo/ appdir/usr/share/icons/hicolor/scalable/apps/ appdir/usr/share/applications/ cp release/lib* appdir/usr/lib/ cp release/mumble appdir/usr/bin cp release/plugins/lib* appdir/usr/lib/mumble/ cp scripts/mumble.desktop appdir/usr/share/applications/ cp scripts/mumble.appdata.xml appdir/usr/share/metainfo/ cp icons/mumble.svg appdir/usr/share/icons/hicolor/scalable/apps/ wget -c -nv "https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage" chmod a+x linuxdeployqt-continuous-x86_64.AppImage ./linuxdeployqt-continuous-x86_64.AppImage $(find $HOME -type d -name 'appdir'| head -n 1)/usr/share/applications/*.desktop -appimage -extra-plugins=sqldrivers/libqsqlite.so wget -c https://github.com/probonopd/uploadtool/raw/master/upload.sh bash upload.sh Mumble*.AppImage* fi fi elif [ "${MUMBLE_QT}" == "qt5" ] && [ "${MUMBLE_HOST}" == "i686-w64-mingw32" ]; then wget http://www.steinberg.net/sdk_downloads/asiosdk2.3.zip -P ../ unzip ../asiosdk2.3.zip -d ../ mv ../ASIOSDK2.3 3rdparty/asio PATH=$PATH:/usr/lib/mxe/usr/bin export MUMBLE_PROTOC=/usr/lib/mxe/usr/x86_64-pc-linux-gnu/bin/protoc EXTRA_CONFIG= if [ "${MUMBLE_NO_PCH}" == "1" ]; then EXTRA_CONFIG="no-pch ${EXTRA_CONFIG}" fi ${MUMBLE_HOST}.static-qmake-qt5 -recursive -Wall CONFIG+="release tests g15-emulator no-overlay no-bonjour no-elevation no-ice ${EXTRA_CONFIG}" make -j2 make check TESTRUNNER="wine" elif [ "${MUMBLE_QT}" == "qt5" ] && [ "${MUMBLE_HOST}" == "x86_64-w64-mingw32" ]; then wget http://www.steinberg.net/sdk_downloads/asiosdk2.3.zip -P ../ unzip ../asiosdk2.3.zip -d ../ mv ../ASIOSDK2.3 3rdparty/asio PATH=$PATH:/usr/lib/mxe/usr/bin export MUMBLE_PROTOC=/usr/lib/mxe/usr/x86_64-pc-linux-gnu/bin/protoc EXTRA_CONFIG= if [ "${MUMBLE_NO_PCH}" == "1" ]; then EXTRA_CONFIG="no-pch ${EXTRA_CONFIG}" fi ${MUMBLE_HOST}.static-qmake-qt5 -recursive -Wall CONFIG+="release tests g15-emulator no-overlay no-bonjour no-elevation no-ice ${EXTRA_CONFIG}" make -j2 make check TESTRUNNER="wine" else exit 1 fi elif [ "${TRAVIS_OS_NAME}" == "osx" ]; then export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/opt/openssl/lib/pkgconfig export PATH=$PATH:/usr/local/opt/qt5/bin:/usr/local/bin export MUMBLE_PREFIX=/usr/local export MUMBLE_ICE_PREFIX=/usr/local/opt/ice qmake CONFIG+="release tests" make -j2 make check ./macx/scripts/osxdist.py --no-compat-warning else exit 1 fi mumble-1.3.4/scripts/travis-ci/before_install.bash0000775000175000017500000000736414010707273022075 0ustar builderbuilder#!/bin/bash -ex # # Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . MUMBLE_HOST_DEB=${MUMBLE_HOST/_/-} if [ "${TRAVIS_OS_NAME}" == "linux" ]; then # Bump the apt http timeout to 120 seconds. # Without this, we'd regularly get timeout errors # from our MXE mirror on dl.mumble.info. # # See mumble-voip/mumble#3312 for more information. echo 'Acquire::http::Timeout "120";' | sudo tee /etc/apt/apt.conf.d/99zzztimeout if [ "${MUMBLE_QT}" == "qt4" ] && [ "${MUMBLE_HOST}" == "x86_64-linux-gnu" ]; then sudo apt-get -qq update sudo apt-get build-dep -qq mumble sudo apt-get install libjack-jackd2-dev elif [ "${MUMBLE_QT}" == "qt5" ] && [ "${MUMBLE_HOST}" == "x86_64-linux-gnu" ]; then sudo apt-get -qq update sudo apt-get build-dep -qq mumble sudo apt-get install libqt5sql5 libqt5sql5-sqlite qt5-default qttools5-dev qttools5-dev-tools qtbase5-dev qtbase5-dev-tools qttranslations5-l10n libqt5svg5-dev sudo apt-get install libjack-jackd2-dev elif [ "${MUMBLE_QT}" == "qt5" ] && [ "${MUMBLE_HOST}" == "i686-w64-mingw32" ]; then sudo dpkg --add-architecture i386 sudo apt-get -qq update echo "deb https://dl.mumble.info/mirror/pkg.mxe.cc/repos/apt xenial main" | sudo tee /etc/apt/sources.list.d/mxe.list sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 86B72ED9 sudo apt-get -qq update sudo apt-get install \ wine \ mxe-${MUMBLE_HOST_DEB}.static-qtbase \ mxe-${MUMBLE_HOST_DEB}.static-qtsvg \ mxe-${MUMBLE_HOST_DEB}.static-qttools \ mxe-${MUMBLE_HOST_DEB}.static-qttranslations \ mxe-${MUMBLE_HOST_DEB}.static-boost \ mxe-${MUMBLE_HOST_DEB}.static-protobuf \ mxe-${MUMBLE_HOST_DEB}.static-sqlite \ mxe-${MUMBLE_HOST_DEB}.static-flac \ mxe-${MUMBLE_HOST_DEB}.static-ogg \ mxe-${MUMBLE_HOST_DEB}.static-vorbis \ mxe-${MUMBLE_HOST_DEB}.static-libsndfile elif [ "${MUMBLE_QT}" == "qt5" ] && [ "${MUMBLE_HOST}" == "x86_64-w64-mingw32" ]; then sudo dpkg --add-architecture i386 sudo apt-get -qq update echo "deb https://dl.mumble.info/mirror/pkg.mxe.cc/repos/apt xenial main" | sudo tee /etc/apt/sources.list.d/mxe.list sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 86B72ED9 sudo apt-get -qq update sudo apt-get install \ wine \ mxe-${MUMBLE_HOST_DEB}.static-qtbase \ mxe-${MUMBLE_HOST_DEB}.static-qtsvg \ mxe-${MUMBLE_HOST_DEB}.static-qttools \ mxe-${MUMBLE_HOST_DEB}.static-qttranslations \ mxe-${MUMBLE_HOST_DEB}.static-boost \ mxe-${MUMBLE_HOST_DEB}.static-protobuf \ mxe-${MUMBLE_HOST_DEB}.static-sqlite \ mxe-${MUMBLE_HOST_DEB}.static-flac \ mxe-${MUMBLE_HOST_DEB}.static-ogg \ mxe-${MUMBLE_HOST_DEB}.static-vorbis \ mxe-${MUMBLE_HOST_DEB}.static-libsndfile else exit 1 fi elif [ "${TRAVIS_OS_NAME}" == "osx" ]; then # We install the protobuf package via brew, # which depends on "python@2". # # The build image upgraded the installed "python", # and now "python@2" conflicts with it when trying # to create symlinks. # # We don’t use the symlinked "python" installed # by default in the image, so we unlink it to allow # the "python@2" package to be installed without conflict. brew update && brew unlink python # As brew will set a non-zero exit status if one of the packages it is asked to install # is installed already. Thus we have to iterate through every single one and check if it # is installed first. for pkg in qt5 libogg libvorbis flac libsndfile protobuf openssl ice; do if brew ls --versions "$pkg" > /dev/null; then echo "Skipping installation of $pkg as it is already installed" else brew install "$pkg" fi done else exit 1 fi mumble-1.3.4/scripts/murmur.service0000664000175000017500000000043214010707273017240 0ustar builderbuilder[Unit] Description=Mumble Daemon After=network.target [Service] Type=forking PIDFile=/run/murmur/murmur.pid ExecStart=/usr/bin/murmurd -ini /etc/murmur.ini Restart=always PrivateDevices=true PrivateTmp=true ProtectSystem=full ProtectHome=true [Install] WantedBy=multi-user.target mumble-1.3.4/scripts/mkwrapper.pl0000775000175000017500000000717514010707273016712 0ustar builderbuilder#! /usr/bin/perl # # Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . use warnings; use strict; my $class; my %return; open(my $MI, "MurmurIce.cpp"); my @mi = <$MI>; close($MI); my $ice; open(my $ICE, "Murmur.ice"); my @ice=<$ICE>; close($ICE); $ice = join("", @ice); $ice =~ s/\/\*.+?\*\///gms; $ice =~ s/^\t+//gm; $ice =~ s/\n+/\n/gs; $ice =~ s/^\n+//s; $ice =~ s/"/\\"/g; $ice =~ s/\n/\\n/g; open(my $I, ">MurmurIceWrapper.cpp"); open(my $B, ">BasicImpl.cpp"); for my $fh ($I, $B) { print $fh qq' // Auto-generated by scripts/mkwrapper.pl . Do not edit manually. '; } open(my $MH, "murmur_ice/Murmur.h") or die "Could not open murmur_ice/Murmur.h"; sub func($$\@\@\@) { my ($class, $func, $wrapargs, $callargs, $implargs) = @_; print $I qq' void ::Murmur::${class}I::${func}_async('. join(", ", @{$wrapargs}).qq') { // qWarning() << "${func}" << meta->mp.qsIceSecretRead.isNull() << meta->mp.qsIceSecretRead.isEmpty(); #ifndef ACCESS_${class}_${func}_ALL #ifdef ACCESS_${class}_${func}_READ if (! meta->mp.qsIceSecretRead.isNull()) { bool ok = ! meta->mp.qsIceSecretRead.isEmpty(); #else if (! meta->mp.qsIceSecretRead.isNull() || ! meta->mp.qsIceSecretWrite.isNull()) { bool ok = ! meta->mp.qsIceSecretWrite.isEmpty(); #endif ::Ice::Context::const_iterator i = current.ctx.find("secret"); ok = ok && (i != current.ctx.end()); if (ok) { const QString &secret = u8((*i).second); #ifdef ACCESS_${class}_${func}_READ ok = ((secret == meta->mp.qsIceSecretRead) || (secret == meta->mp.qsIceSecretWrite)); #else ok = (secret == meta->mp.qsIceSecretWrite); #endif } if (! ok) { cb->ice_exception(InvalidSecretException()); return; } } #endif ExecEvent *ie = new ExecEvent(boost::bind(&impl_${class}_$func, ' . join(", ", @${callargs}).qq')); QCoreApplication::instance()->postEvent(mi, ie); } '; if( ! grep(/impl_${class}_$func/,@mi)) { print $B "static void impl_${class}_$func(".join(", ", @${implargs}). ") {}\n"; } } while(<$MH>) { chomp(); if (/^class AMD_(.+) : virtual public ::Ice(?:::AMDCallback|Util::Shared)/) { $class = "AMD_".$1; } if (/virtual void ice_response\((.*)\) = 0;/) { $return{$class}=$1; } if (/virtual void (.+)_async\(const (.+?)&,(.*) const ::Ice::Current&/) { my $func=$1; my $obj=$2; my $args=$3; next if ($func eq "getSlice"); my $class="Meta"; $class = "Server" if ($obj =~ /AMD_Server/); my @wrapargs; my @callargs; my @implargs; my $pc=0; push @wrapargs, "const $obj &cb"; push @callargs, "cb"; push @implargs, "const $obj cb"; if ($class eq "Server") { push @callargs, "QString::fromStdString(current.id.name).toInt()"; push @implargs, "int server_id"; } else { push @callargs, "current.adapter"; push @implargs, "const Ice::ObjectAdapterPtr adapter"; } foreach my $p (split(/,/,$args)) { $pc++; push @wrapargs, "$p p$pc"; push @callargs, "p$pc"; push @implargs, "$p p$pc"; } # if ($class eq "Server") { push @wrapargs, "const ::Ice::Current ¤t"; # } else { # push @wrapargs, "const ::Ice::Current &"; # } func($class,$func,@wrapargs,@callargs,@implargs); } } print $I qq' void ::Murmur::MetaI::getSlice_async(const ::Murmur::AMD_Meta_getSlicePtr& cb, const Ice::Current&) { cb->ice_response(std::string("$ice")); } '; close($MH); close($I); close($B); mumble-1.3.4/scripts/generate-ffdhe.py0000664000175000017500000004552614010707273017562 0ustar builderbuilder#!/usr/bin/env python # # Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . # # generate-ffdhe.py # Generate PEM strings for the FFDHE parameters in RFC 7919 # For reference, see https://tools.ietf.org/rfc/rfc7919.txt # # The idea of this file is to implement an easy way to generate # PEM Diffie-Hellman parameters by using the data straight from # the RFC. This is to make it easy to verify that the data is # correct and not tampered with. For transparency. # # To verify the P and G values, you can copy/paste the listings # from the RFC, and verify (via 'diff' or 'git diff') that the # values used are same. # # This file also implements a minimal set of ASN.1 DER methods # that allow us to marshal Diffie-Hellman parameters according # to the PKCS#3 DH standard # (ftp://ftp.rsasecurity.com/pub/pkcs/ascii/pkcs-3.asc) # # The ASN.1 definition of DHparameters is as follows: # # DHParameter ::= SEQUENCE { # prime INTEGER, -- p # base INTEGER, -- g # privateValueLength INTEGER OPTIONAL # } # # We only use 'p' and 'g' for Diffie-Hellman parameters. # # To encode this, we need to be able to encode the ASN.1 # types SEQUENCE and INTEGER in DER form. # # A short ASN.1 DER-form crash course: # # All objects are marshalled as follows: # - Identifier/tag byte # - Length bytes # - Content bytes # # The identifier byte is a single byte tag that describes # the object that follows. (0x30 for SEQUENCE, 0x02 for # INTEGER). # # The length bytes contain the size of the content bytes # that follow them. Length bytes have two forms, a short # form (<= 127) and a long form (> 127). # We use the derLength function to marshal a Python integer # into a series of length bytes. See the doc string of the # derLength function for a more thorough explanation. # # The content bytes contain the content itself. # # For the SEQUENCE type (identifier 0x30), the content # bytes are a series of other marshalled ASN.1 # DER objects. In our case, for the DHparameters # SEQUENCE, the content bytes are the result of # marshalling the two ASN.1 DER INTEGERs and # concatenating the resulting bytes. # # For the INTEGER type (identifier 0x02), the content # bytes are the bytes of the integer itself in # two's complement form, stored in big-endian order. # Due to the use of two's complement form, the INTEGER # type can represent both signed and unsigned integers. # If the sign-bit is set, the integer is treated as # signed. The integers we're going to marshal in this # context are all stored as unsigned values. This means # we have to be careful about marshalling them. # For example, say we want to marshal the value 0xFF. If # we output 0xFF as the integer's content bytes, it will # have the value -1, and not 255. This is due to the sign # bit being set. To allow unsigned integers to be # marshalled, the trick is to prepend a zero byte. This # ensures that the sign bit is not set, but does not change # the value of the integer itself. So, the correct way to # marshal the unsigned integer 0xff (255) is to output # 0x00 0xff. # # This concludes the ASN.1 DER crash course. # # In this program, we use hex strings to represent # 'bignums'. The main reason is that the input # bignums from RFC 7919 are listed in this way. # However, using hex strings also makes it easy to # marshal them into ASN.1 DER form, because we can # iterate over each byte in the number, and construct # a bytearray from them. Functions that take these # bignums use the parameter name 'hexString'. To convert # from a hexString to a bytearray, we use the 'dehexify' # function. The 'dehexify' function strips all whitespace # from the string, so it is safe to use it on the 'bignum' # value for P that we've copied from RFC 7919. from __future__ import (unicode_literals, print_function, division) # Python 3 doesn't have a long type. # Map the long type to int here, so # we can easily be compatible with both # interpreters. try: type(long) except NameError: long = int import doctest import os import base64 import codecs # The following P values are copy/pasted from RFC 7919 at # https://tools.ietf.org/rfc/rfc7919.txt # # This is intentional: it allows others to do the same, and # verify that the values match the data from the RFC. ffdhe2048_p = ''' FFFFFFFF FFFFFFFF ADF85458 A2BB4A9A AFDC5620 273D3CF1 D8B9C583 CE2D3695 A9E13641 146433FB CC939DCE 249B3EF9 7D2FE363 630C75D8 F681B202 AEC4617A D3DF1ED5 D5FD6561 2433F51F 5F066ED0 85636555 3DED1AF3 B557135E 7F57C935 984F0C70 E0E68B77 E2A689DA F3EFE872 1DF158A1 36ADE735 30ACCA4F 483A797A BC0AB182 B324FB61 D108A94B B2C8E3FB B96ADAB7 60D7F468 1D4F42A3 DE394DF4 AE56EDE7 6372BB19 0B07A7C8 EE0A6D70 9E02FCE1 CDF7E2EC C03404CD 28342F61 9172FE9C E98583FF 8E4F1232 EEF28183 C3FE3B1B 4C6FAD73 3BB5FCBC 2EC22005 C58EF183 7D1683B2 C6F34A26 C1B2EFFA 886B4238 61285C97 FFFFFFFF FFFFFFFF ''' ffdhe3072_p = ''' FFFFFFFF FFFFFFFF ADF85458 A2BB4A9A AFDC5620 273D3CF1 D8B9C583 CE2D3695 A9E13641 146433FB CC939DCE 249B3EF9 7D2FE363 630C75D8 F681B202 AEC4617A D3DF1ED5 D5FD6561 2433F51F 5F066ED0 85636555 3DED1AF3 B557135E 7F57C935 984F0C70 E0E68B77 E2A689DA F3EFE872 1DF158A1 36ADE735 30ACCA4F 483A797A BC0AB182 B324FB61 D108A94B B2C8E3FB B96ADAB7 60D7F468 1D4F42A3 DE394DF4 AE56EDE7 6372BB19 0B07A7C8 EE0A6D70 9E02FCE1 CDF7E2EC C03404CD 28342F61 9172FE9C E98583FF 8E4F1232 EEF28183 C3FE3B1B 4C6FAD73 3BB5FCBC 2EC22005 C58EF183 7D1683B2 C6F34A26 C1B2EFFA 886B4238 611FCFDC DE355B3B 6519035B BC34F4DE F99C0238 61B46FC9 D6E6C907 7AD91D26 91F7F7EE 598CB0FA C186D91C AEFE1309 85139270 B4130C93 BC437944 F4FD4452 E2D74DD3 64F2E21E 71F54BFF 5CAE82AB 9C9DF69E E86D2BC5 22363A0D ABC52197 9B0DEADA 1DBF9A42 D5C4484E 0ABCD06B FA53DDEF 3C1B20EE 3FD59D7C 25E41D2B 66C62E37 FFFFFFFF FFFFFFFF ''' ffdhe4096_p = ''' FFFFFFFF FFFFFFFF ADF85458 A2BB4A9A AFDC5620 273D3CF1 D8B9C583 CE2D3695 A9E13641 146433FB CC939DCE 249B3EF9 7D2FE363 630C75D8 F681B202 AEC4617A D3DF1ED5 D5FD6561 2433F51F 5F066ED0 85636555 3DED1AF3 B557135E 7F57C935 984F0C70 E0E68B77 E2A689DA F3EFE872 1DF158A1 36ADE735 30ACCA4F 483A797A BC0AB182 B324FB61 D108A94B B2C8E3FB B96ADAB7 60D7F468 1D4F42A3 DE394DF4 AE56EDE7 6372BB19 0B07A7C8 EE0A6D70 9E02FCE1 CDF7E2EC C03404CD 28342F61 9172FE9C E98583FF 8E4F1232 EEF28183 C3FE3B1B 4C6FAD73 3BB5FCBC 2EC22005 C58EF183 7D1683B2 C6F34A26 C1B2EFFA 886B4238 611FCFDC DE355B3B 6519035B BC34F4DE F99C0238 61B46FC9 D6E6C907 7AD91D26 91F7F7EE 598CB0FA C186D91C AEFE1309 85139270 B4130C93 BC437944 F4FD4452 E2D74DD3 64F2E21E 71F54BFF 5CAE82AB 9C9DF69E E86D2BC5 22363A0D ABC52197 9B0DEADA 1DBF9A42 D5C4484E 0ABCD06B FA53DDEF 3C1B20EE 3FD59D7C 25E41D2B 669E1EF1 6E6F52C3 164DF4FB 7930E9E4 E58857B6 AC7D5F42 D69F6D18 7763CF1D 55034004 87F55BA5 7E31CC7A 7135C886 EFB4318A ED6A1E01 2D9E6832 A907600A 918130C4 6DC778F9 71AD0038 092999A3 33CB8B7A 1A1DB93D 7140003C 2A4ECEA9 F98D0ACC 0A8291CD CEC97DCF 8EC9B55A 7F88A46B 4DB5A851 F44182E1 C68A007E 5E655F6A FFFFFFFF FFFFFFFF ''' ffdhe6144_p = ''' FFFFFFFF FFFFFFFF ADF85458 A2BB4A9A AFDC5620 273D3CF1 D8B9C583 CE2D3695 A9E13641 146433FB CC939DCE 249B3EF9 7D2FE363 630C75D8 F681B202 AEC4617A D3DF1ED5 D5FD6561 2433F51F 5F066ED0 85636555 3DED1AF3 B557135E 7F57C935 984F0C70 E0E68B77 E2A689DA F3EFE872 1DF158A1 36ADE735 30ACCA4F 483A797A BC0AB182 B324FB61 D108A94B B2C8E3FB B96ADAB7 60D7F468 1D4F42A3 DE394DF4 AE56EDE7 6372BB19 0B07A7C8 EE0A6D70 9E02FCE1 CDF7E2EC C03404CD 28342F61 9172FE9C E98583FF 8E4F1232 EEF28183 C3FE3B1B 4C6FAD73 3BB5FCBC 2EC22005 C58EF183 7D1683B2 C6F34A26 C1B2EFFA 886B4238 611FCFDC DE355B3B 6519035B BC34F4DE F99C0238 61B46FC9 D6E6C907 7AD91D26 91F7F7EE 598CB0FA C186D91C AEFE1309 85139270 B4130C93 BC437944 F4FD4452 E2D74DD3 64F2E21E 71F54BFF 5CAE82AB 9C9DF69E E86D2BC5 22363A0D ABC52197 9B0DEADA 1DBF9A42 D5C4484E 0ABCD06B FA53DDEF 3C1B20EE 3FD59D7C 25E41D2B 669E1EF1 6E6F52C3 164DF4FB 7930E9E4 E58857B6 AC7D5F42 D69F6D18 7763CF1D 55034004 87F55BA5 7E31CC7A 7135C886 EFB4318A ED6A1E01 2D9E6832 A907600A 918130C4 6DC778F9 71AD0038 092999A3 33CB8B7A 1A1DB93D 7140003C 2A4ECEA9 F98D0ACC 0A8291CD CEC97DCF 8EC9B55A 7F88A46B 4DB5A851 F44182E1 C68A007E 5E0DD902 0BFD64B6 45036C7A 4E677D2C 38532A3A 23BA4442 CAF53EA6 3BB45432 9B7624C8 917BDD64 B1C0FD4C B38E8C33 4C701C3A CDAD0657 FCCFEC71 9B1F5C3E 4E46041F 388147FB 4CFDB477 A52471F7 A9A96910 B855322E DB6340D8 A00EF092 350511E3 0ABEC1FF F9E3A26E 7FB29F8C 183023C3 587E38DA 0077D9B4 763E4E4B 94B2BBC1 94C6651E 77CAF992 EEAAC023 2A281BF6 B3A739C1 22611682 0AE8DB58 47A67CBE F9C9091B 462D538C D72B0374 6AE77F5E 62292C31 1562A846 505DC82D B854338A E49F5235 C95B9117 8CCF2DD5 CACEF403 EC9D1810 C6272B04 5B3B71F9 DC6B80D6 3FDD4A8E 9ADB1E69 62A69526 D43161C1 A41D570D 7938DAD4 A40E329C D0E40E65 FFFFFFFF FFFFFFFF ''' ffdhe8192_p = ''' FFFFFFFF FFFFFFFF ADF85458 A2BB4A9A AFDC5620 273D3CF1 D8B9C583 CE2D3695 A9E13641 146433FB CC939DCE 249B3EF9 7D2FE363 630C75D8 F681B202 AEC4617A D3DF1ED5 D5FD6561 2433F51F 5F066ED0 85636555 3DED1AF3 B557135E 7F57C935 984F0C70 E0E68B77 E2A689DA F3EFE872 1DF158A1 36ADE735 30ACCA4F 483A797A BC0AB182 B324FB61 D108A94B B2C8E3FB B96ADAB7 60D7F468 1D4F42A3 DE394DF4 AE56EDE7 6372BB19 0B07A7C8 EE0A6D70 9E02FCE1 CDF7E2EC C03404CD 28342F61 9172FE9C E98583FF 8E4F1232 EEF28183 C3FE3B1B 4C6FAD73 3BB5FCBC 2EC22005 C58EF183 7D1683B2 C6F34A26 C1B2EFFA 886B4238 611FCFDC DE355B3B 6519035B BC34F4DE F99C0238 61B46FC9 D6E6C907 7AD91D26 91F7F7EE 598CB0FA C186D91C AEFE1309 85139270 B4130C93 BC437944 F4FD4452 E2D74DD3 64F2E21E 71F54BFF 5CAE82AB 9C9DF69E E86D2BC5 22363A0D ABC52197 9B0DEADA 1DBF9A42 D5C4484E 0ABCD06B FA53DDEF 3C1B20EE 3FD59D7C 25E41D2B 669E1EF1 6E6F52C3 164DF4FB 7930E9E4 E58857B6 AC7D5F42 D69F6D18 7763CF1D 55034004 87F55BA5 7E31CC7A 7135C886 EFB4318A ED6A1E01 2D9E6832 A907600A 918130C4 6DC778F9 71AD0038 092999A3 33CB8B7A 1A1DB93D 7140003C 2A4ECEA9 F98D0ACC 0A8291CD CEC97DCF 8EC9B55A 7F88A46B 4DB5A851 F44182E1 C68A007E 5E0DD902 0BFD64B6 45036C7A 4E677D2C 38532A3A 23BA4442 CAF53EA6 3BB45432 9B7624C8 917BDD64 B1C0FD4C B38E8C33 4C701C3A CDAD0657 FCCFEC71 9B1F5C3E 4E46041F 388147FB 4CFDB477 A52471F7 A9A96910 B855322E DB6340D8 A00EF092 350511E3 0ABEC1FF F9E3A26E 7FB29F8C 183023C3 587E38DA 0077D9B4 763E4E4B 94B2BBC1 94C6651E 77CAF992 EEAAC023 2A281BF6 B3A739C1 22611682 0AE8DB58 47A67CBE F9C9091B 462D538C D72B0374 6AE77F5E 62292C31 1562A846 505DC82D B854338A E49F5235 C95B9117 8CCF2DD5 CACEF403 EC9D1810 C6272B04 5B3B71F9 DC6B80D6 3FDD4A8E 9ADB1E69 62A69526 D43161C1 A41D570D 7938DAD4 A40E329C CFF46AAA 36AD004C F600C838 1E425A31 D951AE64 FDB23FCE C9509D43 687FEB69 EDD1CC5E 0B8CC3BD F64B10EF 86B63142 A3AB8829 555B2F74 7C932665 CB2C0F1C C01BD702 29388839 D2AF05E4 54504AC7 8B758282 2846C0BA 35C35F5C 59160CC0 46FD8251 541FC68C 9C86B022 BB709987 6A460E74 51A8A931 09703FEE 1C217E6C 3826E52C 51AA691E 0E423CFC 99E9E316 50C1217B 624816CD AD9A95F9 D5B80194 88D9C0A0 A1FE3075 A577E231 83F81D4A 3F2FA457 1EFC8CE0 BA8A4FE8 B6855DFE 72B0A66E DED2FBAB FBE58A30 FAFABE1C 5D71A87E 2F741EF8 C1FE86FE A6BBFDE5 30677F0D 97D11D49 F7A8443D 0822E506 A9F4614E 011E2A94 838FF88C D68C8BB7 C5C6424C FFFFFFFF FFFFFFFF ''' # The G value is the same for all parameters, so # it is only here once. All the groups from RFC 7919 # use the generator 2. g = '''02''' # Not just '2' because these hex strings must # only contain bytes. def dehexify(hexString): ''' Convert the "bignum" hexString representation to a bytearray containing the number. ''' return bytearray.fromhex(' '.join(line.strip() for line in hexString.splitlines())) def derLength(size): ''' Returns the ASN.1 DER length bytes for the given size. Short form: For lengths <= 127, the length is just a byte containing the literal number. (Note that for numbers <= 127, the MSB is not set.) In doctest form, that is: >>> derLength(1) bytearray(b'\\x01') >>> derLength(127) bytearray(b'\\x7f') Long form: For lengths > 127, the encoding is different: The first byte has the MSB set (that is, by itself, 0x80). The rest of the bits in the first byte specify the number of bytes that follow. So, to encode the length 128, you would emit 0x81 0x80 The high bit of the first byte is set. This means the remaining 7 bits contain how many bytes follow it. If we mask the MSB away, we end up with 0x01. So, only a single byte follows. The value of the following byte is 0x80, which is 128 decimal. In doctest form, that is: >>> derLength(128) bytearray(b'\\x81\\x80') Error cases: The size passed to this function must be an integer: >>> derLength(0.1) Traceback (most recent call last): ... Exception: bad type >>> derLength('5') Traceback (most recent call last): ... Exception: bad type Negative numbers are not supported, and throw an exception: >>> derLength(-1) Traceback (most recent call last): ... Exception: bad size The long form does not support very large numbers. This is because the 'additional bytes' counter can only count up to 127 (2**7-1) bytes. So, if we try to encode a length that will use exactly 127 bytes, it will succeed: >>> derLength(int('ff'*127, 16)) # doctest:+ELLIPSIS bytearray(b'\\xff...\\xff') But if we try to go over that limit, we get an exception: >>> derLength(int('ff'*128, 16)) Traceback (most recent call last): ... Exception: unencodable ''' # Ensure that the passed-in size is an integer. if not isinstance(size, (int, long)): raise Exception('bad type') if size > 127: # Convert 'size' to a hexString-style # bignum that we can pass to dehexify. # # Strip '0x' prefix from the hex string. hexString = hex(size)[2:] # In Python 2.7, the output of hex() # can have an L suffix. Make sure we # strip that. if hexString.endswith('L'): hexString = hexString[:-1] # Ensure the final hex string only # contains full bytes. If not, prepend # a zero byte. if len(hexString) % 2 != 0: hexString = '0' + hexString # If the computed hexString bignum # contains more than 127 bytes, we # can't encode it using ASN.1 DER # encoding. Throw an exception. nbytes = len(hexString) // 2 if nbytes > 127: raise Exception('unencodable') buf = dehexify(hexString) out = bytearray((0x80 | nbytes,)) out += buf return out elif size > 0: # Short form is simply the number itself, # as a byte. return bytearray((size,)) else: # We don't support negative sizes. raise Exception('bad size') def derSequence(sequence): ''' Encode an ASN.1 DER sequence Takes a sequence of DER data as its input. Returns a bytearray of the resulting data. The encoding of a DER sequence is simply an identifier (0x30), a length (the length of the content bytes -- see the derLength function), and the content itself (just a byte stream of other ASN.1 DER objects) ''' out = bytearray((0x30,)) # SEQUENCE tag content = bytearray() for entry in sequence: content += entry out += derLength(len(content)) out += content return out def derUnsignedInteger(hexString): ''' Encode a hex string to a ASN.1 DER INTEGER. This function only handles unsigned integers. Returns a bytearray of the resulting data. The encoding of an ASN.1 DER INTEGER is an identifier (0x02), a length (the length of the content bytes -- see the derLength function), and the content, which in this case is the bytes that make up the integer. An INTEGER can be signed, or unsigned. Our function here only deals with unsigned integers. Signed integers have the MSB/sign bit set. Our input data is guaranteed to be unsigned, so if we detect that the MSB is set in the data, we prepend a zero byte to it. This is the way to signal that the value is unsigned rather than signed. ''' out = bytearray((0x02,)) # INTEGER tag buf = dehexify(hexString) # If the sign bit is set, prepend a zero byte. # Otherwise, the number will be treated as signed, # which we don't want. if (buf[0] & 0x80) != 0: buf = bytearray((0,)) + buf out += derLength(len(buf)) out += buf return out def pem(der, kind='DH PARAMETERS'): ''' Convert the ASN.1 DER data to PEM form. Returns the resulting string (type 'unicode' for Python 2). The PEM format consists of a header, the content itself (base64, using the standard alphabet) and a trailer. The header is of the form: -----BEGIN $KIND----- and the trailer is of the form: -----END $KIND----- where $KIND defines the type of data contained in the PEM data. Between the header and the trailer is the content itself. The content is the DER form encoded using base64. Our implementation splits the base64 data such that each line of base64 data can be no longer than 64 characters long. ''' out = u'-----BEGIN {0}-----\n'.format(kind) enc = base64.b64encode(der) n = 0 for ch in enc: if type(ch) == int: # Python 3 out += chr(ch) else: out += ch n += 1 if n == 64: out += '\n' n = 0 if out[-1] != '\n': out += '\n' out += u'-----END {0}-----\n'.format(kind) return out def writeHeader(f): ''' Output the LICENSE.header file plus a warning about the output file being auto-generated. ''' hf = codecs.open('LICENSE.header', 'r', 'utf-8') hdr = hf.read() hf.close() f.write(hdr) f.write('\n') f.write('// Automatically generated by "{0}". DO NOT EDIT BY HAND.\n'.format(os.path.basename(__file__))) f.write('\n') def writeCStr(f, identifier, str): ''' Output the string 'str' as a static C-style string (in array form, so sizeof works). ''' f.write('static const char {0}[] = \\\n'.format(identifier)) splat = str.split('\n') splat = splat[:-1] lastLine = splat[-1] for line in splat: terminator = '' if line == lastLine: terminator = ';' if len(line) > 0: f.write('"{0}\\n"{1}\n'.format(line, terminator)) def main(): doctest.testmod() f = codecs.open(os.path.join('src', 'FFDHETable.h'), 'w', 'utf-8') writeHeader(f) writeCStr(f, 'ffdhe2048_pem', pem( derSequence(( derUnsignedInteger(ffdhe2048_p), derUnsignedInteger(g), )) )) f.write('\n') writeCStr(f, 'ffdhe3072_pem', pem( derSequence(( derUnsignedInteger(ffdhe3072_p), derUnsignedInteger(g) )) )) f.write('\n') writeCStr(f, 'ffdhe4096_pem', pem( derSequence(( derUnsignedInteger(ffdhe4096_p), derUnsignedInteger(g), )) )) f.write('\n') writeCStr(f, 'ffdhe6144_pem', pem( derSequence(( derUnsignedInteger(ffdhe6144_p), derUnsignedInteger(g), )) )) f.write('\n') writeCStr(f, 'ffdhe8192_pem', pem( derSequence(( derUnsignedInteger(ffdhe8192_p), derUnsignedInteger(g), )) )) f.close() if __name__ == '__main__': main() mumble-1.3.4/scripts/mumble-overlay0000775000175000017500000000335614010707273017225 0ustar builderbuilder#!/bin/bash # # Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . if [ -z "$1" -o "$1" = '--help' ]; then echo "USAGE: $0 [args...]" exit 1 fi for libpath in /usr/lib /usr/lib/mumble /usr/lib32 /usr/lib32/mumble /usr/lib64 /usr/lib64/mumble; do if [ -d "$libpath" ]; then if [ -f "$libpath/libmumble.so.1" ]; then case $(file -L "$libpath/libmumble.so.1") in *64-bit*) MUMBLE_OVERLAY_PATH_64="$libpath" ; echo set ;; *32-bit*) MUMBLE_OVERLAY_PATH_32="$libpath" ;; esac fi fi done if [ -f /etc/sysconfig/mumble ]; then . /etc/sysconfig/mumble fi binary="$1" if [ "${binary/\/}" = "$binary" ]; then binary=$(which "$binary") fi if [ ! -x "$binary" ]; then echo "$1 not found" >&2 exit 1 fi is64=no is32=no case $(file -L "$binary") in *64-bit*) if [ -z "${MUMBLE_OVERLAY_PATH_64}" ]; then echo "64-bit libmumble.so.1 not found" >&2 exit 1 fi MUMBLE_PRELOAD="${MUMBLE_OVERLAY_PATH_64}/libmumble.so.1" ;; *32-bit*) if [ -z "${MUMBLE_OVERLAY_PATH_32}" ]; then echo "32-bit libmumble.so.1 not found" >&2 exit 1 fi MUMBLE_PRELOAD="${MUMBLE_OVERLAY_PATH_32}/libmumble.so.1" ;; *) if [ -n "${MUMBLE_OVERLAY_PATH_64}" ]; then MUMBLE_PRELOAD="${MUMBLE_OVERLAY_PATH_64}/libmumble.so.1" fi if [ -n "${MUMBLE_OVERLAY_PATH_32}" ]; then MUMBLE_PRELOAD="${MUMBLE_PRELOAD} ${MUMBLE_OVERLAY_PATH_32}/libmumble.so.1" fi if [ -z "${MUMBLE_PRELOAD}" ]; then echo "Neither 32-bit or 64-bit libmumble.so.1 found" exit 1 fi esac LD_PRELOAD="${MUMBLE_PRELOAD} ${LD_PRELOAD}" "${@}" mumble-1.3.4/scripts/murmur-user-wrapper0000775000175000017500000000522514010707273020243 0ustar builderbuilder#! /bin/bash # # Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . DIR=$HOME/murmur SYSDIR=/usr/share/doc/mumble-server/examples if [ $UID == 0 ] || [ $EUID == 0 ]; then echo "You should never run this script as root. If you want a system-wide install, see " echo "the documentation included with this package." exit 2 fi unset SETPW DO_KILL=0 DO_STATUS=0 DO_INITONLY=0 while getopts "sid:p:k" flag; do case "$flag" in "s") DO_STATUS=1 ;; "i") DO_INITONLY=1 ;; "d") DIR=$OPTARG ;; "p") SETPW=$OPTARG ;; "k") DO_KILL=1 ;; *) exit 2 ;; esac done DBUSFILE=$DIR/.dbus.sh if [ $DO_KILL == 1 ]; then if pkill -U $UID -u $EUID -o -x -f "/usr/sbin/murmurd -ini $DIR/murmur.ini"; then echo "Termination signal sent" else echo "Murmur process not found; not terminated" exit 2 fi exit 0 fi if [ ! -d $DIR ]; then echo "Making $DIR" mkdir -m 0700 $DIR fi cd $DIR || exit 2 if [ ! -f $DIR/murmur.ini ]; then echo "Creating $DIR/murmur.ini" if [ -f $SYSDIR/murmur.ini ]; then cp $SYSDIR/murmur.ini $DIR elif [ -f $SYSDIR/murmur.ini.gz ]; then gzip -cd $SYSDIR/murmur.ini.gz > $DIR/murmur.ini else echo "Could not find template for murmur.ini in $SYSDIR." exit 2 fi elif [ $DO_INITONLY == 1 ]; then echo "$DIR/murmur.ini already exists, initialization failed." exit 2 fi if [ $DO_INITONLY == 1 ]; then echo "Initialization done. Please edit $DIR/murmur.ini" exit 0 fi if [ "X$SETPW" != "X" ]; then echo "Setting superuser password to \"$SETPW\"" /usr/sbin/murmurd -ini $DIR/murmur.ini -supw $SETPW exit 0 fi PID=$(pgrep -U $UID -u $EUID -o -x -f "/usr/sbin/murmurd -ini $DIR/murmur.ini") if [ $DO_STATUS == 1 ]; then if [ "X$PID" != "X" ]; then echo "Murmur is running" exit 1 else echo "Murmur is not running" exit 0 fi fi if [ "X$PID" != "X" ]; then echo "Murmur is already running." exit 1 fi DBUS_SESSION_BUS_ADDRESS=invalid:/ [ -f $DBUSFILE ] && . $DBUSFILE if ! dbus-send --print-reply --dest=org.freedesktop.DBus --type=method_call / org.freedesktop.DBus.GetId 2> /dev/null > /dev/null; then echo "Launching D-Bus session" dbus-launch --sh-syntax > $DBUSFILE . $DBUSFILE if ! dbus-send --print-reply --dest=org.freedesktop.DBus --type=method_call / org.freedesktop.DBus.GetId 2> /dev/null > /dev/null; then echo "Failed to launch session DBUS, bailing out." exit 2 fi fi echo "Starting Murmur" exec /usr/sbin/murmurd -ini $DIR/murmur.ini mumble-1.3.4/scripts/mumble.protocol0000664000175000017500000000023714010707273017376 0ustar builderbuilder[Protocol] exec=mumble %u protocol=mumble input=none output=none Icon=mumble helper=true Description=A low-latency, high quality voice chat program for gaming mumble-1.3.4/scripts/generate-qrc.py0000775000175000017500000000272714010707273017272 0ustar builderbuilder#!/usr/bin/env python # Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . # # Improved version of rcc --project # import sys import os import re import argparse parser = argparse.ArgumentParser(description='Improved version of rcc --project') parser.add_argument('theme') parser.add_argument('--cwd', default='.') parser.add_argument('--prefix', default='') parser.add_argument('--output', '-o') parser.add_argument('--include', '-i', default='.*', help='Default inclusion regex') parser.add_argument('--exclude', '-e', default='a^', help='Default exclusion regex') args = parser.parse_args() out = sys.stdout if args.output: out = open(args.output, 'w') print>>out, '' print>>out, '' print>>out, '' % args.prefix include = re.compile(args.include) exclude = re.compile(args.exclude) os.chdir(args.cwd) for (dirpath, dirnames, filenames) in os.walk(args.theme): for f in filenames: path = os.path.join(dirpath, f) relpath = os.path.relpath(path, args.theme) if not include.search(relpath): continue if exclude.search(relpath): continue print>>out, ' %s' % (relpath, path) print>>out, '' print>>out, '' mumble-1.3.4/scripts/generate-CHANGES.py0000664000175000017500000002355514010707273017554 0ustar builderbuilder#!/usr/bin/env python # -*- coding: utf-8 -*- # # Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . # Convert the Git log of the repository into a CHANGES file. # # This script uses the same formatting that # 'git2cl.pl' has historically used. from __future__ import (unicode_literals, print_function, division) from collections import defaultdict import subprocess import sys import re def textwidth(text): ''' Calculate the width of 'text' in number of characters. This function counts tabs as 8 characters. ''' count = 0 for char in text: if char == '\t': count += 8 else: count += 1 return count def perlCompatibleTextWrap(text, width, initial_indent, subsequent_indent): ''' Format text like Perl's Text::Wrap#wrap function. We do this to keep compatibility with existing formatting in the CHANGES file. (Invoking this script overwrites the old file, so the output of this function must match the Perl function's output.) ''' lines = [] line = "" # Require at least one empty character # of free space at the end of the line. width -= 1 # Create our word queue by splitting the commit # description by a regular space character (' '). # # This is a little simplistic, but it works in practice. # In an ideal world, we should probably split all # whitespace, so our queue guaranteed to only contain # words. queue = text.split(' ') # Iterate through each word and in the queue # and construct our formatted text. while len(queue) > 0: word = queue.pop(0) # Which indentation mode should we use for # this line? # If this is the first line, use 'initial_indent'. # If not, use 'subsequent_indent'. if len(lines) == 0: indent = initial_indent else: indent = subsequent_indent # If nothing has been added to our line yet, # add the indentation. if line == "": line = indent # Find the wordPrefix. # # The wordPrefix represents the string that # will come before 'word' when 'word' is added # to the line. # # If no other words have been added to the # line, the wordPrefix is the indentation. # (Either initial_indent or subsequent_indent). # If other words have been added to the line # already, the wordPrefix will be the existing # content of the line, plus a space. if line == indent: wordPrefix = line else: wordPrefix = line + " " # Calculate the width of line with the word added. widthWithWordAdded = textwidth(wordPrefix + word) # Check if the line would become too long if the word # was added to the line as-is (considering the wordPrefix). if widthWithWordAdded > width: # Handle words that need to be split. # As a rule, split words MUST start at the very beginning # of a line (considering indentation) -- that is, there # most be no other words in the line for a split word to # be output. # # We check that the line only contains indentation. # This is the same as saying that the current line has # no other words in it. # # Since the word could not fit onto the line, we enter the # 'else'-part of this if-statement, and we consider the # current line done -- the rest of the current line is # left unused. # Then, once we're on the next line, which is empty, we # enter the word-splitting part of this if-statement and # begin outputting the split word. if line == indent: # The preconditions have been met # for word splitting to occur. # # Cut the word into two parts. # # The first part is the one that goes # onto the empty line are are currently at, # and fills it. # # The other part is the remainder. That part # is put back into the word queue. size = width - textwidth(wordPrefix) keep = word[0:size] putBack = word[size:] queue.insert(0, putBack) word = keep else: # There was not enough space left in the line to be # able to contain this word. # # This is either because, # (a) There simply was not enough space, or... # (b) The word-splitting check demanded that # we skip the rest of the line. This # happens because we, as a rule, only # output split words beginning on their # own pristine line. # # Discard the word, and consider the current line complete. # This moves on to the next line. queue.insert(0, word) lines.append(line) line = "" continue # Add the word to the line line = wordPrefix + word # If we have a non-empty line, but no # words left in the queue, it is the last # line. Append it to the 'lines' list. if line != "": lines.append(line) # Format the lines for user consumption. return "\n".join(lines) def matchRegexp(regexp, content): ''' A simple function to make regular expression matching return a boolean value for easier readability. ''' return re.match(regexp, content, re.UNICODE) is not None def gitMailmapLookup(author, email): ''' Look up the canonical forms of the combination of 'author' and 'email' in the .mailmap file. ''' escapedAuthor = author.replace('<', '?').replace('>', '?') escapedEmail = email.replace('<', '?').replace('<', '?') contact = "{0} <{1}>".format(escapedAuthor, escapedEmail) p = subprocess.Popen(["git", "check-mailmap", contact], stdout=subprocess.PIPE) stdout, stderr = p.communicate() if stdout is not None: stdout = stdout.decode('utf-8') if stderr is not None: stderr = stderr.decode('utf-8') if p.returncode != 0: raise Exception('"git check-mailmap" failed: %s', stderr) match = re.match('^(.*)\ \<(.*)\>$', stdout) if match is None: raise Exception("unable to parse contact output from 'git check-mailmap'") groups = match.groups() author = groups[0] email = groups[1] return (author, email) def gitLogOutput(): ''' Invoke git to get NUL-separated log lines. The rows are as follows: - Commit hash - Author - Email - Date (YYYY-MM-DD) - Subject ''' p = subprocess.Popen(["git", "log", "--use-mailmap", "--date=short", "--pretty=format:%h%x00%aN%x00%aE%x00%cd%x00%s"], stdout=subprocess.PIPE) stdout, stderr = p.communicate() if stdout is not None: stdout = stdout.decode('utf-8') if stderr is not None: stderr = stderr.decode('utf-8') if p.returncode != 0: raise Exception('"git log" failed: %s', stderr) return stdout def main(): log = gitLogOutput() # The authors dict maps between email addresses # and author names. authors = {} # The dates dictionary maps from # dates, to another dictionary # that maps from email addresses # to a sorted list of commit subject # lines. # # In pseudo code, the type of 'dates' is: # # dict> # dates = defaultdict(lambda: defaultdict(list)) # lastSubject contains the last subject line # processed. It is used to detect duplicate # subject lines and discard them. lastSubject = "" for line in log.split('\n'): commit, author, email, date, subject = line.split('\0') if author == "Thorvald Natvig": # Because someone forgets to set their git username on every platform... email = "slicer@users.sourceforge.net" # Back in the old days, we appended [$SourceForgeUserName] # in our commit messages when we applied patches by contributors # on SourceForge. # # For example: # # Half-Life 2 Deathmatch Positional Audio [Snares] # # The code below extracts author names from the subject line # of the commit message, and updates the 'author' and # 'email' variables to point to the SourceForge user # specified in the square brackets. The email address # is simply the lowercase username @users.sourceforge.net. patchAuthorRe = "\s*\[([\w-]+)\]\s*$" match = re.search(patchAuthorRe, subject, flags=re.UNICODE) if match is not None: author = match.groups()[0] email = "{0}@users.sourceforge.net".format(author.lower()) # Translate the author/email via .mailmap author, email = gitMailmapLookup(author, email) # Remove the [$SourceForgeUserName] from the subject line. subject = re.sub(patchAuthorRe, "", subject) # Record the first occurrence of an author's # email address and name in the author <-> email map. if email not in authors: authors[email] = author if matchRegexp("^Merge branch 'master", subject): continue if matchRegexp("^Indent and submodule update", subject): continue if matchRegexp("^Indent, changelog and submodule update", subject): continue if matchRegexp("^Indent, changelog, submodule and language update", subject): continue if matchRegexp("^Indent run", subject): continue if matchRegexp("^\*\*\* empty log message", subject): continue if matchRegexp("^git-svn-id: http", subject): continue if matchRegexp("^TEST", subject): continue if matchRegexp("^Merge pull request", subject): continue if matchRegexp("^Transifex translation update", subject): continue # Skip duplicate subject lines. if subject == lastSubject: continue lastSubject = subject # Format the commit hash and subject line. entry = perlCompatibleTextWrap(subject, 76, initial_indent=" {0} ".format(commit), subsequent_indent="\t ") # Add the entry to the dictionary structure. dates[date][email].append(entry) # Output all collected entries # to the CHANGES file. with open('CHANGES', 'wb') as f: dateKeys = sorted(dates.keys(), reverse=True) for date in dateKeys: f.write("{0}\n".format(date).encode('utf-8')) entries = dates[date] emails = sorted(authors.keys()) for email in emails: author = authors[email] entry = entries.get(email) if entry is None: continue f.write(" {0} <{1}>\n".format(author, email).encode('utf-8')) f.write("\n".join(entries[email]).encode('utf-8')) f.write("\n\n".encode('utf-8')) if __name__ == '__main__': main() mumble-1.3.4/scripts/mkflags.py0000664000175000017500000000611714010707273016333 0ustar builderbuilder#!/usr/bin/env python # -*- coding: utf-8 -*- # # Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . # mkflags.py generates .pri and .qrc files from Mumble's # flag SVGs, such that the flags can be included as Qt # resources. # # The script splits the flags into multiple .qrc files once # a single .qrc file exceeds a given threshold. # # This is because older compilers (and old hardware, too!) # can have problems with large source files. When Qt embeds # a .qrc file, it generates a .cpp file and compiles it. Some # of our flag SVGs can be quite large, and if we only use a # single .qrc file, it is (as of this writing) 32MB+ large. from __future__ import (unicode_literals, print_function, division) import os import shutil import codecs import collections # Container for an on-disk flag SVG. Contains size and filename. OnDiskFlag = collections.namedtuple('OnDiskFlag', ['size', 'filename']) # Once a .qrc file's content exceeds this size, the # file will be considered full. MAX_SIZE = 1024*1024 def main(): # Get a list of all flag SVGs, and sort them by size. flags = [] flagsDir = os.path.join('icons', 'flags') flagFns = os.listdir(flagsDir) for fn in flagFns: if not fn.lower().endswith('svg'): continue with open(os.path.join(flagsDir, fn), 'r') as f: buf = f.read() sz = len(buf) flags.append(OnDiskFlag(size=sz, filename=fn)) flags = sorted(flags) # Sort by first tuple index (size). # Figure out the .qrc target of the individual # SVG files. Once a .qrc target exceeds MAX_SIZE, # we add a new file. flagsOut = [] curFileContent = [] curFileSz = 0 for flag in flags: sz = flag.size fn = flag.filename curFileSz += sz curFileContent.append(fn) if curFileSz > MAX_SIZE: flagsOut.append(curFileContent) curFileContent = [] curFileSz = 0 if len(curFileContent) > 0: flagsOut.append(curFileContent) # Remove old flags qrc file. oldFlagsQrc = os.path.join('src', 'mumble', 'mumble_flags.qrc') if os.path.exists(oldFlagsQrc): os.remove(oldFlagsQrc) # Remove existing flags dir in src/mumble. flagsOutDir = os.path.join('src', 'mumble', 'flags') if os.path.exists(flagsOutDir): shutil.rmtree(flagsOutDir) os.mkdir(flagsOutDir) # Generate output files. for idx, content in enumerate(flagsOut): fn = 'mumble_flags_{0}.qrc'.format(idx) with codecs.open(os.path.join(flagsOutDir, fn), "w", "utf-8") as f: f.write('\n') f.write('\n') f.write('\n') for fn in content: f.write('{1}\n'.format('flags/' + fn, '../../../icons/flags/' + fn)) f.write('\n') f.write('\n') # Generate .pri file for flags. with codecs.open(os.path.join(flagsOutDir, 'mumble_flags.pri'), "w", "utf-8") as f: for idx, _ in enumerate(flagsOut): fn = 'mumble_flags_{0}.qrc'.format(idx) f.write('RESOURCES *= flags/{0}\n'.format(fn)) if __name__ == '__main__': main() mumble-1.3.4/scripts/generate-ApplicationPalette-class.py0000775000175000017500000001003614010707273023362 0ustar builderbuilder#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . # Generates the Mumble palette generation class from # template_source and writes it into target after # template expansion. template_source = "ApplicationPaletteTemplate.h" target = "ApplicationPalette.h" color_group = ["Active", "Disabled", "Inactive"] color_role = [ "WindowText", "Button", "Light", "Midlight", "Dark", "Mid", "Text", "BrightText", "ButtonText", "Base", "Window", "Shadow", "Highlight", "HighlightedText", "Link", "LinkVisited", "AlternateBase", "ToolTipBase", "ToolTipText"] property_template = """ Q_PROPERTY(QBrush %(prop)s READ get_%(prop)s WRITE set_%(prop)s) """ gettersetter_template = """ QBrush get_%(prop)s() { if (!m_%(prop)s) return QBrush(); return *m_%(prop)s; } void set_%(prop)s(const QBrush& brush) { m_%(prop)s = brush; } """ role_multigettersetter_template = """ QBrush get_%(role)s() { if (%(comparators)s) { return %(representative)s; } return QBrush(); } void set_%(role)s(const QBrush& brush) { %(setters)s } """ role_multisetter_template=""" m_%(prop)s = brush; """ paletteupdate_template =""" if (m_%(prop)s) { newPalette.setBrush(QPalette::%(group)s, QPalette::%(role)s, *m_%(prop)s); } """ variable_template = """ boost::optional m_%(prop)s; """ reset_template = """ m_%(prop)s = boost::none; """ def rolename(role): return role.lower() def groupname(group): return group.lower() def propname(role, group): return rolename(role) + "_" + groupname(group) def add_role_property(variables, role): """ Add a property that sets all color groups to the same QBrush using the setters of the single group properties. """ variables["properties"] += property_template % {"prop": rolename(role)} # Build a comparator that checks whether all properties # are equal and can be represented as one QBrush. all_groups_equal = " && ".join( ['property("%s") == property("%s")' % (propname(role, color_group[0]), propname(role, color_group[i])) for i in range(1, len(color_group))]) role_representative = 'qvariant_cast(property("%s"))' % propname(role, color_group[0]) role_multisetters = "".join([role_multisetter_template % {"prop": propname(role, group)} for group in color_group]) variables["getterssetters"] += role_multigettersetter_template % {"role": rolename(role), "comparators": all_groups_equal, "representative": role_representative, "setters": role_multisetters} def add_role_group_property(variables, role, group): """ Add separate group properties. """ vars = {"prop" : propname(role, group), "group" : group, "role" : role} variables["properties"] += property_template % vars variables["getterssetters"] += gettersetter_template % vars variables["paletteupdates"] += paletteupdate_template % vars variables["variables"] += variable_template % vars variables["propertyresets"] += reset_template % vars if __name__ == "__main__": template = open(template_source, "r").read() variables = {"warning": "// Auto-generated from %s . Do not edit manually." % template_source, "properties": "", "propertyresets": "", "getterssetters": "", "paletteupdates": "", "variables": ""} for role in color_role: add_role_property(variables, role) for group in color_group: add_role_group_property(variables, role, group) open(target, "w").write(template % variables) mumble-1.3.4/scripts/php.ini0000664000175000017500000000002514010707273015615 0ustar builderbuilderice.slice=Murmur.ice mumble-1.3.4/scripts/development/0000775000175000017500000000000014010707273016652 5ustar builderbuildermumble-1.3.4/scripts/development/IconSync.cpp0000664000175000017500000000320414010707273021102 0ustar builderbuilder#include #include #include #include void svg2png(const QString & svgpath, const QList & sizes, QStringList & qslImages) { QSvgRenderer svg(svgpath); QImage original(512, 512, QImage::Format_ARGB32); original.fill(Qt::transparent); QPainter painter(&original); painter.setRenderHint(QPainter::Antialiasing); painter.setRenderHint(QPainter::TextAntialiasing); painter.setRenderHint(QPainter::SmoothPixmapTransform); painter.setRenderHint(QPainter::HighQualityAntialiasing); svg.render(&painter); foreach(int size, sizes) { QImage img = original.scaled(size,size,Qt::IgnoreAspectRatio, Qt::SmoothTransformation); QString png = QDir::temp().absoluteFilePath(QString::fromLatin1("mumble.%1.png").arg(size)); QImageWriter qiw(png); qiw.write(img); qslImages << png; } } int main(int argc, char **argv) { QCoreApplication a(argc, argv); QStringList qslImages; QString svgSmallPath = QLatin1String("../../icons/mumble_small.svg"); QList sizesSmall; sizesSmall << 16; sizesSmall << 24; svg2png(svgSmallPath, sizesSmall, qslImages); QLatin1String svgPath("../../icons/mumble.svg"); QList sizes; sizes << 32; sizes << 48; sizes << 64; sizes << 96; sizes << 128; sizes << 256; svg2png(svgPath, sizes, qslImages); QStringList args; args << qslImages; args << QDir::current().absoluteFilePath("../../icons/mumble.ico"); qWarning() << args; QProcess qp; qp.setProcessChannelMode(QProcess::ForwardedChannels); qp.start("/usr/bin/convert", args); if (! qp.waitForFinished()) qWarning() << "No finish"; foreach(const QString &png, qslImages) QDir::temp().remove(png); } mumble-1.3.4/scripts/development/IconSync.pro0000664000175000017500000000027714010707273021127 0ustar builderbuilderinclude(../../qmake/compiler.pri) TEMPLATE = app CONFIG += qt thread warn_on debug console CONFIG -= app_bundle QT += network gui svg LANGUAGE = C++ TARGET = IconSync SOURCES = IconSync.cpp mumble-1.3.4/scripts/mklic.pl0000775000175000017500000002000514010707273015764 0ustar builderbuilder#! /usr/bin/perl # # Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . use warnings; use strict; use Carp; sub licenseFileToVar($$) { my ($var,$file)=@_; my $ret; open(IN, $file) or croak; my $l = join("", ); $l =~ s/\r//g; $l =~ s/\f//g; $l =~ s/\"/\\\"/g; $l = join("\\n\"\n\t\"",split(/\n/, $l)); return qq!static const char *${var} = \n\t\"! . $l . "\";\n"; } sub printGuarded($$$) { my ($F, $S, $Guard)=@_; if ($Guard) { print $F "#ifdef " . $Guard . "\n"; } print $F $S; if ($Guard) { print $F "#endif\n"; } } open(my $F, "> ../src/licenses.h"); binmode $F; # Ensure consistent file endings across platforms print $F "/*\n"; print $F " * This file was auto-generated by scripts/mklic.pl\n"; print $F " * DO NOT EDIT IT MANUALLY\n"; print $F " */\n"; print $F "#ifndef MUMBLE_LICENSES_H_\n"; print $F "#define MUMBLE_LICENSES_H_\n"; print $F "\n"; print $F "#include \n"; print $F "\n"; print $F "struct ThirdPartyLicense {\n"; print $F " const char* name;\n"; print $F " const char* url;\n"; print $F " const char* license;\n"; print $F "\n"; print $F " ThirdPartyLicense() : name(0), url(0), license(0) {}\n"; print $F " ThirdPartyLicense(const char* name_, const char* url_, const char* license_)\n"; print $F " : name(name_), url(url_), license(license_) {}\n"; print $F " bool isEmpty() const { return (name == 0 && url == 0 && license == 0); }\n"; print $F "};\n"; print $F "\n"; print $F licenseFileToVar("licenseMumble", "../LICENSE"); print $F "\n\n"; print $F licenseFileToVar("authorsMumble", "../AUTHORS"); print $F "\n\n"; # List of 3rd party licenses [, , , ] my @thirdPartyLicenses = ( ["licenseCELT", "../3rdparty/celt-0.11.0-src/COPYING", "CELT", "http://www.celt-codec.org/"], ["licenseOpus", "../3rdparty/opus-src/COPYING", "Opus", "http://www.opus-codec.org/"], ["licenseSPEEX", "../3rdparty/speex-src/COPYING", "Speex", "http://www.speex.org/"], ["licenseOpenSSL", "../3rdPartyLicenses/openssl_license.txt", "OpenSSL", "http://www.openssl.org/"], ["licenseLibsndfile", "../3rdPartyLicenses/libsndfile_license.txt", "libsndfile", "http://www.mega-nerd.com/libsndfile/"], ["licenseOgg", "../3rdPartyLicenses/libogg_license.txt", "libogg", "http://www.xiph.org/"], ["licenseVorbis", "../3rdPartyLicenses/libvorbis_license.txt", "libvorbis", "http://www.xiph.org/"], ["licenseFLAC", "../3rdPartyLicenses/libflac_license.txt", "libFLAC", "http://flac.sourceforge.net/"], ["licenseMachOverride", "../3rdPartyLicenses/mach_override_license.txt", "mach_override", "https://github.com/rentzsch/mach_star", "Q_OS_MAC"], ["licenseMinHook", "../3rdparty/minhook-src/LICENSE.txt", "MinHook", "https://github.com/TsudaKageyu/minhook", "Q_OS_WIN64"], ["licenseQtTranslations", "../src/mumble/qttranslations/LICENSE", "Additional Qt translations", "https://www.virtualbox.org/ticket/2018", "USING_BUNDLED_QT_TRANSLATIONS"], ["licenseEmojiOne", "../3rdPartyLicenses/cc_by_sa_40_legalcode.txt", "Emoji One artwork", "http://emojione.com/"], ["licenseXInputCheck", "../3rdparty/xinputcheck-src/COPYING.txt", "XInputCheck (SDL_IsXInput function)", "https://www.libsdl.org/"], ["licenseQQBonjour", "../3rdparty/qqbonjour-src/LICENSE", "QQBonjour", "https://doc.qt.io/archives/qq/qq23-bonjour.html"], ["licenseSmallFT", "../3rdparty/smallft-src/LICENSE", "smallft", "https://www.xiph.org"], ["licenseOldStyleLicenseHeaders", "../3rdPartyLicenses/mumble-old-license-headers/LICENSE.txt", "Old-style Mumble license headers", "https://www.mumble.info"], ["licenseArc4RandomUniform", "../3rdparty/arc4random-src/LICENSE", "arc4random_uniform", "https://www.openbsd.org"], ["licenseMariaDBCConnector", "../3rdPartyLicenses/mariadb_c_connector_license.txt", "MariaDB Connector/C", "https://www.mariadb.org", "USE_BUILDENV"], ["licenseZlib", "../3rdPartyLicenses/zlib_license.txt", "ZLIB", "https://www.zlib.net", "USE_BUILDENV"], ["licenseProtobuf", "../3rdPartyLicenses/protobuf_license.txt", "Protobuf", "https://developers.google.com/protocol-buffers", "USE_BUILDENV"], ["licenseExpat", "../3rdPartyLicenses/expat_license.txt", "Expat", "http://libexpat.org", "USE_BUILDENV"], ["licenseBoost", "../3rdPartyLicenses/boost_license.txt", "Boost C++ Libraries", "https://www.boost.org/", "USE_BUILDENV"], ["licenseBzip2", "../3rdPartyLicenses/bzip2_license.txt", "bzip2", "http://www.bzip.org", "USE_BUILDENV"], ["licenseBerkeleyDB", "../3rdPartyLicenses/berkeleydb_license.txt", "BerkeleyDB", "https://www.oracle.com/database/berkeley-db", "USE_BUILDENV"], ["licenseFreetype", "../3rdPartyLicenses/freetype_license.txt", "Freetype", "https://www.freetype.org/", "USE_BUILDENV"], ["licenseHarfBuzzNG", "../3rdPartyLicenses/harfbuzzng_license.txt", "HarfBuzz", "https://www.freedesktop.org/wiki/Software/HarfBuzz", "USE_BUILDENV"], ["licenseLibPNG", "../3rdPartyLicenses/libpng_license.txt", "LibPNG", "http://www.libpng.org/pub/png/libpng.html", "USE_BUILDENV"], ["licenseLibjpegTurbo", "../3rdPartyLicenses/libjpeg_turbo_license.txt", "libjpeg-turbo", "http://www.libjpeg-turbo.org", "USE_BUILDENV"], ["licenseZeroCIce", "../3rdPartyLicenses/zeroc_ice_license.txt", "ZeroC Ice", "https://zeroc.com/", "USE_BUILDENV"], ["licenseMcpp", "../3rdPartyLicenses/mcpp_license.txt", "mcpp", "http://mcpp.sourceforge.net/", "USE_BUILDENV"], ["licenseMDNSResponder", "../3rdPartyLicenses/mdnsresponder_license.txt", "mDNSResponder", "https://opensource.apple.com/tarballs/mDNSResponder/", "USE_BUILDENV"], ["licensePCRE", "../3rdPartyLicenses/pcre_license.txt", "PCRE", "http://www.pcre.org/", "USE_BUILDENV"], ["licenseQt", "../3rdPartyLicenses/qt_license.txt", "Qt", "https://www.qt.io/", "USE_BUILDENV"], ["licenseSQLite3", "../3rdPartyLicenses/sqlite3_license.txt", "SQLite3", "http://sqlite.org", "USE_BUILDENV"], ["licenseXar", "../3rdPartyLicenses/xar_license.txt", "XAR", "https://opensource.apple.com/source/xar/", "USE_BUILDENV"], # macOS only ["licenseAvahi", "../3rdPartyLicenses/avahi_license.txt", "Avahi", "https://www.avahi.org/", "USE_BUILDENV"], # Linux only ["licenseDBus", "../3rdPartyLicenses/dbus_license.txt", "D-Bus", "https://www.freedesktop.org/wiki/Software/dbus", "USE_BUILDENV"], # Linux only ["licenseAppImageRuntime", "../3rdPartyLicenses/appimage_runtime_license.txt", "AppImage Runtime", "http://www.appimage.org", "USE_BUILDENV"], # Linux only ["licenseSquashfuse", "../3rdPartyLicenses/squashfuse_license.txt", "squashfuse", "https://github.com/vasi/squashfuse", "USE_BUILDENV"], # Linux only ["licenseLibfuse", "../3rdPartyLicenses/libfuse_license.txt", "libfuse", "https://github.com/libfuse/libfuse/", "USE_BUILDENV"], # Linux only ["licenseGlib", "../3rdPartyLicenses/glib_license.txt", "glib", "https://developer.gnome.org/glib/", "USE_BUILDENV"], # Linux only ["licenseLibcap2", "../3rdPartyLicenses/libcap2_license.txt", "libcap2", "https://sites.google.com/site/fullycapable/", "USE_BUILDENV"], # Linux only ["licenseLibdaemon", "../3rdPartyLicenses/libdaemon_license.txt", "libdaemon", "http://0pointer.de/lennart/projects/libdaemon/", "USE_BUILDENV"], # Linux only ["licenseLibffi", "../3rdPartyLicenses/libffi_license.txt", "libffi", "https://sourceware.org/libffi/", "USE_BUILDENV"] # Linux only ); # Print 3rd party licenses foreach (@thirdPartyLicenses) { printGuarded($F, licenseFileToVar(@$_[0], @$_[1]), @$_[4]); print $F "\n\n"; } # Print list of 3rd party licenses print $F "static const ThirdPartyLicense licenses3rdParties[] = {\n"; foreach (@thirdPartyLicenses) { printGuarded($F, "\tThirdPartyLicense(\"" . @$_[2] . "\", \"" . @$_[3] . "\", " . @$_[0] . "),\n", @$_[4]); } # Empty entry that marks the end of the array printGuarded($F, "\tThirdPartyLicense(),\n", @$_[4]); print $F "};\n\n\n"; print $F "#endif\n"; close($F); mumble-1.3.4/scripts/murmur.ini.system.bak0000664000175000017500000003701614010707354020446 0ustar builderbuilder; Murmur configuration file. ; ; General notes: ; * Settings in this file are default settings and many of them can be overridden ; with virtual server specific configuration via the Ice or DBus interface. ; * Due to the way this configuration file is read some rules have to be ; followed when specifying variable values (as in variable = value): ; * Make sure to quote the value when using commas in strings or passwords. ; NOT variable = super,secret BUT variable = "super,secret" ; * Make sure to escape special characters like '\' or '"' correctly ; NOT variable = """ BUT variable = "\"" ; NOT regex = \w* BUT regex = \\w* ; Path to database. If blank, will search for ; murmur.sqlite in default locations or create it if not found. database=/var/lib/mumble-server/mumble-server.sqlite ; Murmur defaults to using SQLite with its default rollback journal. ; In some situations, using SQLite's write-ahead log (WAL) can be ; advantageous. ; If you encounter slowdowns when moving between channels and similar ; operations, enabling the SQLite write-ahead log might help. ; ; To use SQLite's write-ahead log, set sqlite_wal to one of the following ; values: ; ; 0 - Use SQLite's default rollback journal. ; 1 - Use write-ahead log with synchronous=NORMAL. ; If Murmur crashes, the database will be in a consistent state, but ; the most recent changes might be lost if the operating system did ; not write them to disk yet. This option can improve Murmur's ; interactivity on busy servers, or servers with slow storage. ; 2 - Use write-ahead log with synchronous=FULL. ; All database writes are synchronized to disk when they are made. ; If Murmur crashes, the database will be include all completed writes. ;sqlite_wal=0 ; If you wish to use something other than SQLite, you'll need to set the name ; of the database above, and also uncomment the below. ; Sticking with SQLite is strongly recommended, as it's the most well tested ; and by far the fastest solution. ; ;dbDriver=QMYSQL ;dbUsername= ;dbPassword= ;dbHost= ;dbPort= ;dbPrefix=murmur_ ;dbOpts= ; Murmur defaults to not using D-Bus. If you wish to use dbus, which is one of the ; RPC methods available in Murmur, please specify so here. ; ;dbus=system ; Alternate D-Bus service name. Only use if you are running distinct ; murmurd processes connected to the same D-Bus daemon. ;dbusservice=net.sourceforge.mumble.murmur ; If you want to use ZeroC Ice to communicate with Murmur, you need ; to specify the endpoint to use. Since there is no authentication ; with ICE, you should only use it if you trust all the users who have ; shell access to your machine. ; Please see the ICE documentation on how to specify endpoints. ice="tcp -h 127.0.0.1 -p 6502" ; Ice primarily uses local sockets. This means anyone who has a ; user account on your machine can connect to the Ice services. ; You can set a plaintext "secret" on the Ice connection, and ; any script attempting to access must then have this secret ; (as context with name "secret"). ; Access is split in read (look only) and write (modify) ; operations. Write access always includes read access, ; unless read is explicitly denied (see note below). ; ; Note that if this is uncommented and with empty content, ; access will be denied. ;icesecretread= icesecretwrite= ; If you want to expose Murmur's experimental gRPC API, you ; need to specify an address to bind on. ; Note: not all builds of Murmur support gRPC. If gRPC is not ; available, Murmur will warn you in its log output. ;grpc="127.0.0.1:50051" ; Specifying both a certificate and key file below will cause gRPC to use ; secured, TLS connections. ;grpccert="" ;grpckey="" ; Specifies the file Murmur should log to. By default, Murmur ; logs to the file 'murmur.log'. If you leave this field blank ; on Unix-like systems, Murmur will force itself into foreground ; mode which logs to the console. logfile=/var/log/mumble-server/mumble-server.log ; If set, Murmur will write its process ID to this file ; when running in daemon mode (when the -fg flag is not ; specified on the command line). Only available on ; Unix-like systems. pidfile=/var/run/mumble-server/mumble-server.pid ; The below will be used as defaults for new configured servers. ; If you're just running one server (the default), it's easier to ; configure it here than through D-Bus or Ice. ; ; Welcome message sent to clients when they connect. ; If the welcome message is set to an empty string, ; no welcome message will be sent to clients. welcometext="
    Welcome to this server running Murmur.
    Enjoy your stay!
    " ; Port to bind TCP and UDP sockets to. port=64738 ; Specific IP or hostname to bind to. ; If this is left blank (default), Murmur will bind to all available addresses. ;host= ; Password to join server. serverpassword= ; Maximum bandwidth (in bits per second) clients are allowed ; to send speech at. bandwidth=72000 ; Murmur and Mumble are usually pretty good about cleaning up hung clients, but ; occasionally one will get stuck on the server. The timeout setting will cause ; a periodic check of all clients who haven't communicated with the server in ; this many seconds - causing zombie clients to be disconnected. ; ; Note that this has no effect on idle clients or people who are AFK. It will ; only affect people who are already disconnected, and just haven't told the ; server. ;timeout=30 ; Maximum number of concurrent clients allowed. users=100 ; Where users sets a blanket limit on the number of clients per virtual server, ; usersperchannel sets a limit on the number per channel. The default is 0, for ; no limit. ;usersperchannel=0 ; Per-user rate limiting ; ; These two settings allow to configure the per-user rate limiter for some ; command messages sent from the client to the server. The messageburst setting ; specifies an amount of messages which are allowed in short bursts. The ; messagelimit setting specifies the number of messages per second allowed over ; a longer period. If a user hits the rate limit, his packages are then ignored ; for some time. Both of these settings have a minimum of 1 as setting either to ; 0 could render the server unusable. messageburst=5 messagelimit=1 ; Respond to UDP ping packets. ; ; Setting to true exposes the current user count, the maximum user count, and ; the server's maximum bandwidth per client to unauthenticated users. In the ; Mumble client, this information is shown in the Connect dialog. allowping=true ; Amount of users with Opus support needed to force Opus usage, in percent. ; 0 = Always enable Opus, 100 = enable Opus if it's supported by all clients. ;opusthreshold=100 ; Maximum depth of channel nesting. Note that some databases like MySQL using ; InnoDB will fail when operating on deeply nested channels. ;channelnestinglimit=10 ; Maximum number of channels per server. 0 for unlimited. Note that an ; excessive number of channels will impact server performance ;channelcountlimit=1000 ; Regular expression used to validate channel names. ; (Note that you have to escape backslashes with \ ) ;channelname=[ \\-=\\w\\#\\[\\]\\{\\}\\(\\)\\@\\|]+ ; Regular expression used to validate user names. ; (Note that you have to escape backslashes with \ ) ;username=[-=\\w\\[\\]\\{\\}\\(\\)\\@\\|\\.]+ ; If a user has no stored channel (they've never been connected to the server ; before, or rememberchannel is set to false) and the client hasn't been given ; a URL that includes a channel path, the default behavior is that they will ; end up in the root channel. ; ; You can set this setting to a channel ID, and the user will automatically be ; moved into that channel instead. Note that this is the numeric ID of the ; channel, which can be a little tricky to get (you'll either need to use an ; RPC mechanism, watch the console of a debug client, or root around through ; the Murmur Database to get it). ; ;defaultchannel=0 ; When a user connects to a server they've already been on, by default the ; server will remember the last channel they were in and move them to it ; automatically. Toggling this setting to false will disable that feature. ; ;rememberchannel=true ; Maximum length of text messages in characters. 0 for no limit. ;textmessagelength=5000 ; Maximum length of text messages in characters, with image data. 0 for no limit. ;imagemessagelength=131072 ; Allow clients to use HTML in messages, user comments and channel descriptions? ;allowhtml=true ; Murmur retains the per-server log entries in an internal database which ; allows it to be accessed over D-Bus/ICE. ; How many days should such entries be kept? ; Set to 0 to keep forever, or -1 to disable logging to the DB. ;logdays=31 ; To enable public server registration, the serverpassword must be blank, and ; this must all be filled out. ; The password here is used to create a registry for the server name; subsequent ; updates will need the same password. Don't lose your password. ; The URL is your own website, and only set the registerHostname for static IP ; addresses. ; Location is typically the country of typical users of the server, in ; two-letter TLD style (ISO 3166-1 alpha-2 country code) ; ; If you only wish to give your "Root" channel a custom name, then only ; uncomment the 'registerName' parameter. ; ;registerName=Mumble Server ;registerPassword=secret ;registerUrl=http://www.mumble.info/ ;registerHostname= ;registerLocation= ; If this option is enabled, the server will announce its presence via the ; bonjour service discovery protocol. To change the name announced by bonjour ; adjust the registerName variable. ; See http://developer.apple.com/networking/bonjour/index.html for more information ; about bonjour. ;bonjour=True ; If you have a proper SSL certificate, you can provide the filenames here. ; Otherwise, Murmur will create its own certificate automatically. ;sslCert= ;sslKey= ; If the keyfile specified above is encrypted with a passphrase, you can enter ; it in this setting. It must be plaintext, so you may wish to adjust the ; permissions on your murmur.ini file accordingly. ;sslPassPhrase= ; If your certificate is signed by an authority that uses a sub-signed or ; "intermediate" certificate, you probably need to bundle it with your ; certificate in order to get Murmur to accept it. You can either concatenate ; the two certificates into one file, or you can put it in a file by itself and ; put the path to that PEM-file in sslCA. ;sslCA= ; The sslDHParams option allows you to specify a PEM-encoded file with ; Diffie-Hellman parameters, which will be used as the default Diffie- ; Hellman parameters for all virtual servers. ; ; Instead of pointing sslDHParams to a file, you can also use the option ; to specify a named set of Diffie-Hellman parameters for Murmur to use. ; Murmur comes bundled with the Diffie-Hellman parameters from RFC 7919. ; These parameters are available by using the following names: ; ; @ffdhe2048, @ffdhe3072, @ffdhe4096, @ffdhe6144, @ffdhe8192 ; ; By default, Murmur uses @ffdhe2048. ;sslDHParams=@ffdhe2048 ; The sslCiphers option chooses the cipher suites to make available for use ; in SSL/TLS. This option is server-wide, and cannot be set on a ; per-virtual-server basis. ; ; This option is specified using OpenSSL cipher list notation (see ; https://www.openssl.org/docs/apps/ciphers.html#CIPHER-LIST-FORMAT). ; ; It is recommended that you try your cipher string using 'openssl ciphers ' ; before setting it here, to get a feel for which cipher suites you will get. ; ; After setting this option, it is recommend that you inspect your Murmur log ; to ensure that Murmur is using the cipher suites that you expected it to. ; ; Note: Changing this option may impact the backwards compatibility of your ; Murmur server, and can remove the ability for older Mumble clients to be able ; to connect to it. ;sslCiphers=EECDH+AESGCM:EDH+aRSA+AESGCM:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:AES256-SHA:AES128-SHA ; If Murmur is started as root, which user should it switch to? ; This option is ignored if Murmur isn't started with root privileges. ;uname= ; By default, in log files and in the user status window for privileged users, ; Mumble will show IP addresses - in some situations you may find this unwanted ; behavior. If obfuscate is set to true, Murmur will randomize the IP addresses ; of connecting users. ; ; The obfuscate function only affects the log file and DOES NOT effect the user ; information section in the client window. ;obfuscate=false ; If this options is enabled, only clients which have a certificate are allowed ; to connect. ;certrequired=False ; If enabled, clients are sent information about the servers version and operating ; system. ;sendversion=True ; You can set a recommended minimum version for your server, and clients will ; be notified in their log when they connect if their client does not meet the ; minimum requirements. suggestVersion expects the version in the format X.X.X. ; ; Note that the suggest* options appeared after 1.2.3 and will have no effect ; on client versions 1.2.3 and earlier. ; ;suggestVersion= ; Setting this to "true" will alert any user who does not have positional audio ; enabled that the server administrators recommend enabling it. Setting it to ; "false" will have the opposite effect - if you do not care whether the user ; enables positional audio or not, set it to blank. The message will appear in ; the log window upon connection, but only if the user's settings do not match ; what the server requests. ; ; Note that the suggest* options appeared after 1.2.3 and will have no effect ; on client versions 1.2.3 and earlier. ; ;suggestPositional= ; Setting this to "true" will alert any user who does not have Push-To-Talk ; enabled that the server administrators recommend enabling it. Setting it to ; "false" will have the opposite effect - if you do not care whether the user ; enables PTT or not, set it to blank. The message will appear in the log ; window upon connection, but only if the user's settings do not match what the ; server requests. ; ; Note that the suggest* options appeared after 1.2.3 and will have no effect ; on client versions 1.2.3 and earlier. ; ;suggestPushToTalk= ; This sets password hash storage to legacy mode (1.2.4 and before) ; (Note that setting this to true is insecure and should not be used unless absolutely necessary) ;legacyPasswordHash=false ; By default a strong amount of PBKDF2 iterations are chosen automatically. If >0 this setting ; overrides the automatic benchmark and forces a specific number of iterations. ; (Note that you should only change this value if you know what you are doing) ;kdfIterations=-1 ; In order to prevent misconfigured, impolite or malicious clients from ; affecting the low-latency of other users, Murmur has a rudimentary global-ban ; system. It's configured using the autobanAttempts, autobanTimeframe and ; autobanTime settings. ; ; If a client attempts autobanAttempts connections in autobanTimeframe seconds, ; they will be banned for autobanTime seconds. This is a global ban, from all ; virtual servers on the Murmur process. It will not show up in any of the ; ban-lists on the server, and they can't be removed without restarting the ; Murmur process - just let them expire. A single, properly functioning client ; should not trip these bans. ; ; To disable, set autobanAttempts or autobanTimeframe to 0. Commenting these ; settings out will cause Murmur to use the defaults: ; ;autobanAttempts=10 ;autobanTimeframe=120 ;autobanTime=300 ; You can configure any of the configuration options for Ice here. We recommend ; leave the defaults as they are. ; Please note that this section has to be last in the configuration file. ; [Ice] Ice.Warn.UnknownProperties=1 Ice.MessageSizeMax=65536 mumble-1.3.4/scripts/murmur.logrotate0000664000175000017500000000042214010707273017577 0ustar builderbuilder/var/log/mumble-server/mumble-server.log { weekly rotate 7 compress delaycompress missingok postrotate start-stop-daemon --quiet --oknodo --stop --signal 1 --exec /usr/sbin/murmurd --user mumble-server --pidfile /var/run/mumble-server/mumble-server.pid endscript } mumble-1.3.4/scripts/release.pl0000775000175000017500000000474614010707273016323 0ustar builderbuilder#! /usr/bin/perl -w # # Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . # # Creates a source tar.gz and zip file with adjusted Version.h file use strict; use warnings; use Carp; use POSIX; my $ver; system("rm mumble-*"); chdir("scripts"); system("bash mkini.sh"); chdir(".."); if ($#ARGV < 0) { open(F, "git describe origin/master|") or croak "Failed to get version string"; while () { chomp(); s/^(.+)-([0-9]+)-(g.+)$/$1|$2|$3/; s/-/~/; s/\|/-/g; $ver = $_; } close(F); print "REVISION $ver\n"; } elsif ($#ARGV == 0) { $ver = $ARGV[0]; } print "Adjusting Version.h\n"; open(F, "; close(F); my $content = join('', @lines); $content =~ s/(\#ifndef MUMBLE_VERSION)/$1\n\#define MUMBLE_VERSION $ver\n\#endif\n$1/; open(F, ">src/Version.h") or croak "Could not open src/Version.h for writing"; print F $content; close(F); print "Compressing tree\n"; my $ballname = "mumble-${ver}"; my $exclusions = join(" --exclude=", ("", "*/.git*", # Exclude the archive we are currently writing to "${ballname}.*", # Exclude files with Debian FSG licensing issues (#1230) "${ballname}/3rdparty/speex-src/doc/draft-herlein-avt-rtp-speex-00.txt", "${ballname}/3rdparty/speex-src/doc/draft-herlein-speex-rtp-profile-02.txt", "${ballname}/3rdparty/speex-src/doc/draft-herlein-speex-rtp-profile-03.txt", "${ballname}/3rdparty/speex-src/doc/draft-ietf-avt-rtp-speex-00.txt", "${ballname}/3rdparty/speex-src/doc/draft-ietf-avt-rtp-speex-01-tmp.txt", "${ballname}/3rdparty/speex-src/doc/draft-ietf-avt-rtp-speex-05-tmp.txt", "${ballname}/3rdparty/speex-src/doc/manual.lyx", "${ballname}/3rdparty/celt-0.11.0-src/doc/ietf/draft-valin-celt-rtp-profile-01.txt", "${ballname}/3rdparty/celt-0.7.0-src/doc/ietf/draft-valin-celt-rtp-profile-01.txt" ) ); system("mkdir ${ballname}") == 0 or croak "Could not create target directory ${ballname}"; system("mv * ${ballname}/"); eval { system("tar ${exclusions} -zchvf ${ballname}.tar.gz ${ballname}") == 0 or croak "Failed to create tar.gz"; system("zip -9 -r ${exclusions} ${ballname}.zip ${ballname}") == 0 or croak "Failed to create zip"; }; system("mv ${ballname}/* ."); system("rmdir ${ballname}"); print "Done\n"; mumble-1.3.4/scripts/generate-mumble_qt-qrc.py0000775000175000017500000000341114010707273021244 0ustar builderbuilder#!/usr/bin/env python # # Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . from __future__ import (unicode_literals, print_function, division) import os import platform import sys allowed_prefixes = ('qt', 'qtbase') def dirToQrc(of, dirName, alreadyProcessedLangs): processedLangs = [] absDirName = os.path.abspath(dirName) fns = os.listdir(dirName) for fn in fns: fnRoot, fnExt = os.path.splitext(fn) if fnExt.lower() != '.qm': continue lastUnderscoreIdx = fnRoot.rfind('_') if lastUnderscoreIdx == -1: continue prefix = fnRoot[:lastUnderscoreIdx] lang = fnRoot[lastUnderscoreIdx+1:] # Handle en_US-style locale names if lang.upper() == lang: nextToLastUnderscoreIdx = prefix.rfind('_') prefix = fnRoot[:nextToLastUnderscoreIdx] lang = fnRoot[nextToLastUnderscoreIdx+1:] if lang in alreadyProcessedLangs: continue if not prefix in allowed_prefixes: continue absFn = os.path.join(absDirName, fn) if platform.system() == 'Windows': absFn = absFn.replace('\\', '/') of.write(' {1}\n'.format(fn, absFn)) processedLangs.append(lang) return processedLangs def main(): # python generate-mumble_qt-qrc.py [inputs...] output = sys.argv[1] inputs = sys.argv[2:] of = open(output, 'w') of.write('\n') of.write('\n') processedLangs = [] for dirName in inputs: newlyProcssedLangs = dirToQrc(of, dirName, processedLangs) processedLangs.extend(newlyProcssedLangs) of.write('\n') of.write('\n') of.close() if __name__ == '__main__': main() mumble-1.3.4/scripts/rcc-depends.py0000775000175000017500000000260614010707273017100 0ustar builderbuilder#!/usr/bin/env python # # Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . # rcc-depends.py is a small tool that can be used as a drop-in # replacement for 'rcc -list' as a command to find dependencies # for .qrc files. from __future__ import (unicode_literals, print_function, division) import os import platform import sys from xml.dom import minidom def main(): inputs = sys.argv[1:] for fn in inputs: with open(fn, 'r') as f: absFn = os.path.abspath(fn) fnDir = os.path.dirname(absFn) s = f.read() dom = minidom.parseString(s) fileTags = dom.getElementsByTagName('file') for fileTag in fileTags: textNode = fileTag.childNodes[0].wholeText absPath = os.path.normpath(os.path.join(fnDir, textNode)) if platform.system() == 'Windows': try: output = os.path.relpath(absPath) except ValueError: # In some cases, Qt lives on another drive than Mumble. # This means that we can't create relative path from # our absolute path. # In those cases, use the absolute path instead. output = absPath output = output.replace('\\', '/') else: output = os.path.relpath(absPath) print(output) if __name__ == '__main__': main() mumble-1.3.4/scripts/generate-cipherinfo.py0000775000175000017500000002326514010707273020633 0ustar builderbuilder#!/usr/bin/env python # # Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . # # # cipherinfo.py # Generate static TLS cipher information for Mumble. from __future__ import (unicode_literals, print_function, division) import json import re import subprocess try: from urllib2 import urlopen except: from urllib.request import urlopen from xml.dom import minidom IETF_TLS_PARAMETERS_WWW = "https://www.ietf.org/assignments/tls-parameters/tls-parameters.xml" def integerFromIdent(ident): ''' Parses a TLS cipher suite identifier from the IETF TLS cipher suite registry. The cipher suite identifier is represented as a string of hex-encoded byte values separated by commas. This function consumes the byte sequence and converts it into an unsigned integer. ''' hexVals = ident.split(',') nbytes = len(hexVals) if nbytes > 3: raise Exception("unexpected amount of bytes") outVal = 0 for idx, val in enumerate(hexVals): intVal = int(val, base=16) outVal |= ((intVal & 0xff) << (((nbytes - 1) - idx) * 8)) return outVal def rfcNameLut(): lut = {} # Auto-generate from IETF_TLS_PARAMETERS_WWW u = urlopen(IETF_TLS_PARAMETERS_WWW) s = u.read() s = s.decode('utf-8') u.close() dom = minidom.parseString(s) registries = dom.getElementsByTagName("registry") for registry in registries: ident = registry.getAttribute("id") if ident == "tls-parameters-4": records = registry.getElementsByTagName("record") for record in records: value = record.getElementsByTagName("value")[0].childNodes[0].nodeValue.strip() description = record.getElementsByTagName("description")[0].childNodes[0].nodeValue.strip() # Skip free-form informational entries that use ranges (-) and * # in their value. if re.match("^[0xA-Z1-9,]*$", value) is None: continue lut[value] = description ########################################################################## # Obsolete SSLv2 cipher suites from RFC 4346, Appendix E: ########################################################################## # TLS_RC4_128_WITH_MD5 # 0x01, 0x00, 0x80 lut["0x01,0x00,0x80"] = "TLS_RC4_128_WITH_MD5" # TLS_RC4_128_EXPORT40_WITH_MD5 # 0x02, 0x00, 0x80 lut["0x02,0x00,0x80"] = "TLS_RC4_128_EXPORT40_WITH_MD5" # TLS_RC2_CBC_128_CBC_WITH_MD5 # 0x03, 0x00, 0x80 lut["0x03,0x00,0x80"] = "TLS_RC2_CBC_128_CBC_WITH_MD5" # TLS_RC2_CBC_128_CBC_EXPORT40_WITH_MD5 # 0x04, 0x00, 0x80 lut["0x04,0x00,0x80"] = "TLS_RC2_CBC_128_CBC_EXPORT40_WITH_MD5" # TLS_IDEA_128_CBC_WITH_MD5 # 0x05, 0x00, 0x80 lut["0x05,0x00,0x80"] = "TLS_IDEA_128_CBC_WITH_MD5" # TLS_DES_64_CBC_WITH_MD5 # 0x06, 0x00, 0x40 lut["0x06,0x00,0x40"] = "TLS_DES_64_CBC_WITH_MD5" # TLS_DES_192_EDE3_CBC_WITH_MD5 # 0x07, 0x00, 0xC0 lut["0x07,0x00,0xC0"] = "TLS_DES_192_EDE3_CBC_WITH_MD5" return lut def opensslCiphersOutput(): p = subprocess.Popen(['openssl', 'ciphers', '-V', 'ALL'], stdout=subprocess.PIPE) stdout, stderr = p.communicate() if stdout is not None: stdout = stdout.decode('utf-8') if stderr is not None: stderr = stderr.decode('utf-8') if p.returncode != 0: raise Exception('"openssl ciphers" failed: %s', stderr) return stdout def extract(splat): if len(splat) < 8: splat.extend(['']) return splat def Cstr(val): if val is None: return 'NULL' return '"{0}"'.format(val) def CPPbool(val): if val is True: return 'true' return 'false' def main(): added_ids = [] output = [] lut = rfcNameLut() ciphers = opensslCiphersOutput() for line in ciphers.split('\n'): if len(line) == 0: continue line = line.replace(' - ', ' ') line = line.replace('Kx=', '') line = line.replace('Au=', '') line = line.replace('Enc=', '') line = line.replace('Mac=', '') line = line.replace('(', '_') line = line.replace(')', '') line = line.replace('/', '_') tabline = re.sub('\ +', '', line, 1) tabline = re.sub('\ +', '\t', tabline) splat = tabline.split('\t') ident, osslname, minproto, kx, au, enc, mac, exp = extract(splat) # Look up the RFC name of this cipher suite. if ident in lut: rfcname = lut[ident] else: raise Exception('missing rfc_name in lut for %s' % ident) # Normalize kx, au, enc and mac. if 'None' in au: au = 'Anonymous' enc = enc.upper() if 'AESGCM' in enc: enc = enc.replace('GCM', '') enc = enc + '_GCM' if 'GCM' in rfcname and not 'GCM' in enc: enc = enc + '_GCM' elif 'EDE_CBC' in rfcname: enc = enc + '_EDE_CBC' elif 'CBC' in rfcname: enc = enc + '_CBC' elif 'CCM_8' in rfcname: enc = enc + '_CCM_8' elif 'CCM' in rfcname: enc = enc + '_CCM' if 'ECDHE' in osslname and not 'ECDHE' in kx: kx = kx.replace('ECDH', 'ECDHE') if 'ECDHE' in osslname and not 'ECDHE' in au: au = au.replace('ECDH', 'ECDHE') if 'DHE' in osslname and not 'DHE' in kx: kx = kx.replace('DH', 'DHE') if 'DHE' in osslname and not 'DHE' in au: au = au.replace('DH', 'DHE') if 'EDH' in osslname and not 'EDH' in kx: kx = kx.replace('DH', 'DHE') if 'EDH' in osslname and not 'EDH' in au: au = au.replace('DH', 'DHE') if mac != 'AEAD': mac = 'HMAC-' + mac # Validate macs valid_macs = ['AEAD', 'HMAC-MD5', 'HMAC-SHA1', 'HMAC-SHA256', 'HMAC-SHA384'] if mac not in valid_macs: raise Exception('invalid mac found: %s' % mac) # Use key exchange names from the RFCs, but also create # verbose key exchange names for export ciphers. match = re.match('^(TLS_|SSL_)(.*)_WITH.*$', rfcname) valid_rfc_kex = [ "ECDHE_RSA", "ECDHE_ECDSA", "SRP_SHA_DSS", "SRP_SHA_RSA", "SRP_SHA", "DHE_DSS", "DHE_RSA", "ECDH_anon", "DH_anon", "DH_DSS", "DH_RSA", "ECDH_RSA", "ECDH_ECDSA", "RSA", "PSK", ] valid_export_rfc_kex = [ "DHE_RSA_EXPORT", "DHE_DSS_EXPORT", "DHE_DSS_EXPORT", "DH_anon_EXPORT", "RSA_EXPORT", ] skip_rfc_kex = [ "IDEA_128_CBC", "RC2_CBC_128_CBC", "RC4_128", "DES_192_EDE3_CBC", "DES_64_CBC", "IDEA_128_CBC", "RC2_CBC_128_CBC_EXPORT40", "RC4_128_EXPORT40" ] if match is not None: rfc_kex = match.groups()[1] rfc_verbose_kex = rfc_kex if rfc_kex in skip_rfc_kex: rfc_kex = kx rfc_verbose_kex = kx elif rfc_kex in valid_rfc_kex: pass elif rfc_kex in valid_export_rfc_kex: if rfc_kex == 'DHE_RSA_EXPORT': rfc_verbose_kex = 'DHE_512_RSA_EXPORT' elif rfc_kex == 'DHE_DSS_EXPORT': rfc_verbose_kex = 'DHE_512_DSS_EXPORT' elif rfc_kex == 'DH_anon_EXPORT': rfc_verbose_kex = 'DH_anon_512_EXPORT' elif rfc_kex == 'RSA_EXPORT': rfc_verbose_kex = 'RSA_512_EXPORT' else: raise Exception('missing check for rfc_kex?') else: raise Exception('bad rfc_kex found: %s' % rfc_kex) pfs = False if rfc_verbose_kex == 'ECDHE_RSA': pfs = True elif rfc_verbose_kex == 'ECDHE_ECDSA': pfs = True elif rfc_verbose_kex == 'DHE_RSA': pfs = True elif rfc_verbose_kex == 'DHE_DSS': pfs = True elif rfc_verbose_kex == 'DHE_512_RSA_EXPORT': pfs = True elif rfc_verbose_kex == 'DHE_512_DSS_EXPORT': pfs = True # XXX: should SRP be marked as forward_secret? output.append({ 'sort_order': integerFromIdent(ident), 'identifier': ident, 'openssl_name': osslname, 'rfc_name': rfcname, 'minimum_protocol': minproto, 'key_exchange': rfc_kex, 'key_exchange_verbose': rfc_verbose_kex, 'openssl_key_exchange': kx, 'openssl_authentication': au, 'key_exchange': rfc_kex, 'encryption': enc, 'message_authentication': mac, 'export': exp == 'export', 'forward_secret': pfs }) added_ids.append(ident) # Add everything we missed from OpenSSL... include_extras = False if include_extras: for key in lut.keys(): if not key in added_ids: output.append({ 'sort_order': integerFromIdent(key), 'identifier': key, 'openssl_name': None, 'rfc_name': lut[key], 'minimum_protocol': None, 'key_exchange': None, 'key_exchange_verbose': None, 'openssl_key_exchange': None, 'openssl_authentication': None, 'key_exchange': None, 'encryption': None, 'message_authentication': None, 'export': None, 'forward_secret': None }) sortedOutput = sorted(output, key=lambda meta: meta['sort_order']) output_c = True if output_c: print('// Automatically generated by "generate-cipherinfo.py". DO NOT EDIT BY HAND.') print('//') print('// I also agree to have manually vetted this file for correctness.') print('//') print('// If I do not agree, I will not have removed the line above saying') print('// otherwise. Nor will I have removed the line below this one which') print('// will cause a preprocessor error. Oops!') print('#error Please verify this file is correct') print('static const SSLCipherInfo cipher_info_lookup_table[] = {') for entry in sortedOutput: print('\t{') print('\t\t// openssl_name') print('\t\t{0},'.format(Cstr(entry["openssl_name"]))) print('\t\t// rfc_name') print('\t\t{0},'.format(Cstr(entry["rfc_name"]))) print('\t\t// encryption') print('\t\t{0},'.format(Cstr(entry["encryption"]))) print('\t\t// key_exchange_verbose. kx = {0}, au = {1}'.format(entry["openssl_key_exchange"], entry["openssl_authentication"])) print('\t\t{0},'.format(Cstr(entry["key_exchange_verbose"]))) print('\t\t// forward secret') print('\t\t{0},'.format(CPPbool(entry["forward_secret"]))) print('\t\t// message authentication') print('\t\t{0},'.format(Cstr(entry["message_authentication"]))) print('\t},') print('};') else: print(json.dumps(sortedOutput, sort_keys=True, indent=4, separators=(',', ': '))) if __name__ == '__main__': main() mumble-1.3.4/scripts/extract-emojione-flags.py0000775000175000017500000000463314010707273021262 0ustar builderbuilder#!/usr/bin/env python # # Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . # # # extract-emojione-flags.py # Extract SVG flags from the Emoji One emoji collection. # # This script walks the Emoji One SVG collection and extracts # flag emojis. # # Emoji One's emojis all use the Unicode code points (base 16) as # their on-disk names. If a character consists of multiple code points, # they are separated by a dash ('-'). # # This script walks all the Emoji One SVGs, and finds the ones which # only contain symbols in the Regional Indicator Symbol range. # These are flag emojis. # # The flags are then copied to the destination directory, and named # as the region's lower case ISO_3166-1_alpha-2 code with the ".svg" # extension. from __future__ import (unicode_literals, print_function, division) import os import shutil import sys # Beginning and end of the Regional Indicator Symbol range, # as defined by Unicode 6.0's emoji support. # # See https://en.wikipedia.org/wiki/Regional_Indicator_Symbol # for more information. REGIONAL_INDICATOR_SYMBOL_LETTER_A = 0x1F1E6 REGIONAL_INDICATOR_SYMBOL_LETTER_Z = 0x1F1FF def is_region(points): for point in points: if point > REGIONAL_INDICATOR_SYMBOL_LETTER_Z \ or point < REGIONAL_INDICATOR_SYMBOL_LETTER_A: return False return True def region_name(points): name = '' for point in points: name += chr(point - REGIONAL_INDICATOR_SYMBOL_LETTER_A + ord('a')) return name def main(): if len(sys.argv) < 3: print('''Usage: extract-emojione-flags.py [emojione-svg-dir] [dst-dir] emojione-svg-dir: point this to the directory containing Emoji One SVGs, such as $EMOJIONE_SRC_TREE/assets/svg. dst-dir: point this to the directory you want the resulting SVGs to be written to. ''') sys.exit(1) emojiOneSvgDir = sys.argv[1] dstDir = sys.argv[2] files = os.listdir(emojiOneSvgDir) for fn in files: base, ext = os.path.splitext(fn.lower()) if not ext == '.svg': continue pointsStr = base.split('-') points = [int(p, 16) for p in pointsStr] if is_region(points): name = region_name(points) svgName = name + '.svg' shutil.copy(os.path.join(emojiOneSvgDir, fn), os.path.join(dstDir, svgName)) if __name__ == '__main__': main() mumble-1.3.4/scripts/mkini.sh0000775000175000017500000000161314010707273015777 0ustar builderbuilder#! /bin/bash # # Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . cp murmur.ini murmur.ini.win32 cp murmur.ini murmur.ini.osx cp murmur.ini murmur.ini.system perl -pi.bak -e 's/^(#|;|)dbus=.*$/\1dbus=system/' murmur.ini.system perl -pi.bak -e 's/^(#|;|)logfile=.*$/logfile=\/var\/log\/mumble-server\/mumble-server.log/' murmur.ini.system perl -pi.bak -e 's/^(#|;|)pidfile=.*$/pidfile=\/var\/run\/mumble-server\/mumble-server.pid/' murmur.ini.system perl -pi.bak -e 's/^(#|;|)database=.*$/database=\/var\/lib\/mumble-server\/mumble-server.sqlite/' murmur.ini.system perl -pi.bak -e 's/^(#|;|)uname=.*$/uname=mumble-server/' murmur.ini.system perl -pi.bak -e 'BEGIN{undef $/;} s/\n/\r\n/smg' murmur.ini.win32 mumble-1.3.4/scripts/mumble.desktop0000664000175000017500000000125714010707273017211 0ustar builderbuilder[Desktop Entry] Name=Mumble GenericName=Voice Chat GenericName[de]=Sprachkonferenz GenericName[fr]=Chat vocal GenericName[tr]=Sesle Sohbet Comment=A low-latency, high quality voice chat program for gaming Comment[de]=Ein Sprachkonferenzprogramm mit niedriger Latenz und hoher Qualität für Spiele Comment[fr]=Un logiciel de chat vocal de haute qualité et de faible latence pour les jeux Comment[tr]=Oyunlar için yüksek kaliteli ve düşük gecikmeli sesle sohbet programı Exec=mumble %u Icon=mumble Terminal=false Type=Application StartupNotify=false MimeType=x-scheme-handler/mumble; Categories=Network;Chat;Qt; Keywords=VoIP;Messaging;Voice Chat;Secure Communication; Version=1.0 mumble-1.3.4/scripts/murmur.ini.win32.bak0000664000175000017500000003664014010707354020066 0ustar builderbuilder; Murmur configuration file. ; ; General notes: ; * Settings in this file are default settings and many of them can be overridden ; with virtual server specific configuration via the Ice or DBus interface. ; * Due to the way this configuration file is read some rules have to be ; followed when specifying variable values (as in variable = value): ; * Make sure to quote the value when using commas in strings or passwords. ; NOT variable = super,secret BUT variable = "super,secret" ; * Make sure to escape special characters like '\' or '"' correctly ; NOT variable = """ BUT variable = "\"" ; NOT regex = \w* BUT regex = \\w* ; Path to database. If blank, will search for ; murmur.sqlite in default locations or create it if not found. database= ; Murmur defaults to using SQLite with its default rollback journal. ; In some situations, using SQLite's write-ahead log (WAL) can be ; advantageous. ; If you encounter slowdowns when moving between channels and similar ; operations, enabling the SQLite write-ahead log might help. ; ; To use SQLite's write-ahead log, set sqlite_wal to one of the following ; values: ; ; 0 - Use SQLite's default rollback journal. ; 1 - Use write-ahead log with synchronous=NORMAL. ; If Murmur crashes, the database will be in a consistent state, but ; the most recent changes might be lost if the operating system did ; not write them to disk yet. This option can improve Murmur's ; interactivity on busy servers, or servers with slow storage. ; 2 - Use write-ahead log with synchronous=FULL. ; All database writes are synchronized to disk when they are made. ; If Murmur crashes, the database will be include all completed writes. ;sqlite_wal=0 ; If you wish to use something other than SQLite, you'll need to set the name ; of the database above, and also uncomment the below. ; Sticking with SQLite is strongly recommended, as it's the most well tested ; and by far the fastest solution. ; ;dbDriver=QMYSQL ;dbUsername= ;dbPassword= ;dbHost= ;dbPort= ;dbPrefix=murmur_ ;dbOpts= ; Murmur defaults to not using D-Bus. If you wish to use dbus, which is one of the ; RPC methods available in Murmur, please specify so here. ; ;dbus=session ; Alternate D-Bus service name. Only use if you are running distinct ; murmurd processes connected to the same D-Bus daemon. ;dbusservice=net.sourceforge.mumble.murmur ; If you want to use ZeroC Ice to communicate with Murmur, you need ; to specify the endpoint to use. Since there is no authentication ; with ICE, you should only use it if you trust all the users who have ; shell access to your machine. ; Please see the ICE documentation on how to specify endpoints. ice="tcp -h 127.0.0.1 -p 6502" ; Ice primarily uses local sockets. This means anyone who has a ; user account on your machine can connect to the Ice services. ; You can set a plaintext "secret" on the Ice connection, and ; any script attempting to access must then have this secret ; (as context with name "secret"). ; Access is split in read (look only) and write (modify) ; operations. Write access always includes read access, ; unless read is explicitly denied (see note below). ; ; Note that if this is uncommented and with empty content, ; access will be denied. ;icesecretread= icesecretwrite= ; If you want to expose Murmur's experimental gRPC API, you ; need to specify an address to bind on. ; Note: not all builds of Murmur support gRPC. If gRPC is not ; available, Murmur will warn you in its log output. ;grpc="127.0.0.1:50051" ; Specifying both a certificate and key file below will cause gRPC to use ; secured, TLS connections. ;grpccert="" ;grpckey="" ; Specifies the file Murmur should log to. By default, Murmur ; logs to the file 'murmur.log'. If you leave this field blank ; on Unix-like systems, Murmur will force itself into foreground ; mode which logs to the console. ;logfile=murmur.log ; If set, Murmur will write its process ID to this file ; when running in daemon mode (when the -fg flag is not ; specified on the command line). Only available on ; Unix-like systems. ;pidfile= ; The below will be used as defaults for new configured servers. ; If you're just running one server (the default), it's easier to ; configure it here than through D-Bus or Ice. ; ; Welcome message sent to clients when they connect. ; If the welcome message is set to an empty string, ; no welcome message will be sent to clients. welcometext="
    Welcome to this server running Murmur.
    Enjoy your stay!
    " ; Port to bind TCP and UDP sockets to. port=64738 ; Specific IP or hostname to bind to. ; If this is left blank (default), Murmur will bind to all available addresses. ;host= ; Password to join server. serverpassword= ; Maximum bandwidth (in bits per second) clients are allowed ; to send speech at. bandwidth=72000 ; Murmur and Mumble are usually pretty good about cleaning up hung clients, but ; occasionally one will get stuck on the server. The timeout setting will cause ; a periodic check of all clients who haven't communicated with the server in ; this many seconds - causing zombie clients to be disconnected. ; ; Note that this has no effect on idle clients or people who are AFK. It will ; only affect people who are already disconnected, and just haven't told the ; server. ;timeout=30 ; Maximum number of concurrent clients allowed. users=100 ; Where users sets a blanket limit on the number of clients per virtual server, ; usersperchannel sets a limit on the number per channel. The default is 0, for ; no limit. ;usersperchannel=0 ; Per-user rate limiting ; ; These two settings allow to configure the per-user rate limiter for some ; command messages sent from the client to the server. The messageburst setting ; specifies an amount of messages which are allowed in short bursts. The ; messagelimit setting specifies the number of messages per second allowed over ; a longer period. If a user hits the rate limit, his packages are then ignored ; for some time. Both of these settings have a minimum of 1 as setting either to ; 0 could render the server unusable. messageburst=5 messagelimit=1 ; Respond to UDP ping packets. ; ; Setting to true exposes the current user count, the maximum user count, and ; the server's maximum bandwidth per client to unauthenticated users. In the ; Mumble client, this information is shown in the Connect dialog. allowping=true ; Amount of users with Opus support needed to force Opus usage, in percent. ; 0 = Always enable Opus, 100 = enable Opus if it's supported by all clients. ;opusthreshold=100 ; Maximum depth of channel nesting. Note that some databases like MySQL using ; InnoDB will fail when operating on deeply nested channels. ;channelnestinglimit=10 ; Maximum number of channels per server. 0 for unlimited. Note that an ; excessive number of channels will impact server performance ;channelcountlimit=1000 ; Regular expression used to validate channel names. ; (Note that you have to escape backslashes with \ ) ;channelname=[ \\-=\\w\\#\\[\\]\\{\\}\\(\\)\\@\\|]+ ; Regular expression used to validate user names. ; (Note that you have to escape backslashes with \ ) ;username=[-=\\w\\[\\]\\{\\}\\(\\)\\@\\|\\.]+ ; If a user has no stored channel (they've never been connected to the server ; before, or rememberchannel is set to false) and the client hasn't been given ; a URL that includes a channel path, the default behavior is that they will ; end up in the root channel. ; ; You can set this setting to a channel ID, and the user will automatically be ; moved into that channel instead. Note that this is the numeric ID of the ; channel, which can be a little tricky to get (you'll either need to use an ; RPC mechanism, watch the console of a debug client, or root around through ; the Murmur Database to get it). ; ;defaultchannel=0 ; When a user connects to a server they've already been on, by default the ; server will remember the last channel they were in and move them to it ; automatically. Toggling this setting to false will disable that feature. ; ;rememberchannel=true ; Maximum length of text messages in characters. 0 for no limit. ;textmessagelength=5000 ; Maximum length of text messages in characters, with image data. 0 for no limit. ;imagemessagelength=131072 ; Allow clients to use HTML in messages, user comments and channel descriptions? ;allowhtml=true ; Murmur retains the per-server log entries in an internal database which ; allows it to be accessed over D-Bus/ICE. ; How many days should such entries be kept? ; Set to 0 to keep forever, or -1 to disable logging to the DB. ;logdays=31 ; To enable public server registration, the serverpassword must be blank, and ; this must all be filled out. ; The password here is used to create a registry for the server name; subsequent ; updates will need the same password. Don't lose your password. ; The URL is your own website, and only set the registerHostname for static IP ; addresses. ; Location is typically the country of typical users of the server, in ; two-letter TLD style (ISO 3166-1 alpha-2 country code) ; ; If you only wish to give your "Root" channel a custom name, then only ; uncomment the 'registerName' parameter. ; ;registerName=Mumble Server ;registerPassword=secret ;registerUrl=http://www.mumble.info/ ;registerHostname= ;registerLocation= ; If this option is enabled, the server will announce its presence via the ; bonjour service discovery protocol. To change the name announced by bonjour ; adjust the registerName variable. ; See http://developer.apple.com/networking/bonjour/index.html for more information ; about bonjour. ;bonjour=True ; If you have a proper SSL certificate, you can provide the filenames here. ; Otherwise, Murmur will create its own certificate automatically. ;sslCert= ;sslKey= ; If the keyfile specified above is encrypted with a passphrase, you can enter ; it in this setting. It must be plaintext, so you may wish to adjust the ; permissions on your murmur.ini file accordingly. ;sslPassPhrase= ; If your certificate is signed by an authority that uses a sub-signed or ; "intermediate" certificate, you probably need to bundle it with your ; certificate in order to get Murmur to accept it. You can either concatenate ; the two certificates into one file, or you can put it in a file by itself and ; put the path to that PEM-file in sslCA. ;sslCA= ; The sslDHParams option allows you to specify a PEM-encoded file with ; Diffie-Hellman parameters, which will be used as the default Diffie- ; Hellman parameters for all virtual servers. ; ; Instead of pointing sslDHParams to a file, you can also use the option ; to specify a named set of Diffie-Hellman parameters for Murmur to use. ; Murmur comes bundled with the Diffie-Hellman parameters from RFC 7919. ; These parameters are available by using the following names: ; ; @ffdhe2048, @ffdhe3072, @ffdhe4096, @ffdhe6144, @ffdhe8192 ; ; By default, Murmur uses @ffdhe2048. ;sslDHParams=@ffdhe2048 ; The sslCiphers option chooses the cipher suites to make available for use ; in SSL/TLS. This option is server-wide, and cannot be set on a ; per-virtual-server basis. ; ; This option is specified using OpenSSL cipher list notation (see ; https://www.openssl.org/docs/apps/ciphers.html#CIPHER-LIST-FORMAT). ; ; It is recommended that you try your cipher string using 'openssl ciphers ' ; before setting it here, to get a feel for which cipher suites you will get. ; ; After setting this option, it is recommend that you inspect your Murmur log ; to ensure that Murmur is using the cipher suites that you expected it to. ; ; Note: Changing this option may impact the backwards compatibility of your ; Murmur server, and can remove the ability for older Mumble clients to be able ; to connect to it. ;sslCiphers=EECDH+AESGCM:EDH+aRSA+AESGCM:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:AES256-SHA:AES128-SHA ; If Murmur is started as root, which user should it switch to? ; This option is ignored if Murmur isn't started with root privileges. ;uname= ; By default, in log files and in the user status window for privileged users, ; Mumble will show IP addresses - in some situations you may find this unwanted ; behavior. If obfuscate is set to true, Murmur will randomize the IP addresses ; of connecting users. ; ; The obfuscate function only affects the log file and DOES NOT effect the user ; information section in the client window. ;obfuscate=false ; If this options is enabled, only clients which have a certificate are allowed ; to connect. ;certrequired=False ; If enabled, clients are sent information about the servers version and operating ; system. ;sendversion=True ; You can set a recommended minimum version for your server, and clients will ; be notified in their log when they connect if their client does not meet the ; minimum requirements. suggestVersion expects the version in the format X.X.X. ; ; Note that the suggest* options appeared after 1.2.3 and will have no effect ; on client versions 1.2.3 and earlier. ; ;suggestVersion= ; Setting this to "true" will alert any user who does not have positional audio ; enabled that the server administrators recommend enabling it. Setting it to ; "false" will have the opposite effect - if you do not care whether the user ; enables positional audio or not, set it to blank. The message will appear in ; the log window upon connection, but only if the user's settings do not match ; what the server requests. ; ; Note that the suggest* options appeared after 1.2.3 and will have no effect ; on client versions 1.2.3 and earlier. ; ;suggestPositional= ; Setting this to "true" will alert any user who does not have Push-To-Talk ; enabled that the server administrators recommend enabling it. Setting it to ; "false" will have the opposite effect - if you do not care whether the user ; enables PTT or not, set it to blank. The message will appear in the log ; window upon connection, but only if the user's settings do not match what the ; server requests. ; ; Note that the suggest* options appeared after 1.2.3 and will have no effect ; on client versions 1.2.3 and earlier. ; ;suggestPushToTalk= ; This sets password hash storage to legacy mode (1.2.4 and before) ; (Note that setting this to true is insecure and should not be used unless absolutely necessary) ;legacyPasswordHash=false ; By default a strong amount of PBKDF2 iterations are chosen automatically. If >0 this setting ; overrides the automatic benchmark and forces a specific number of iterations. ; (Note that you should only change this value if you know what you are doing) ;kdfIterations=-1 ; In order to prevent misconfigured, impolite or malicious clients from ; affecting the low-latency of other users, Murmur has a rudimentary global-ban ; system. It's configured using the autobanAttempts, autobanTimeframe and ; autobanTime settings. ; ; If a client attempts autobanAttempts connections in autobanTimeframe seconds, ; they will be banned for autobanTime seconds. This is a global ban, from all ; virtual servers on the Murmur process. It will not show up in any of the ; ban-lists on the server, and they can't be removed without restarting the ; Murmur process - just let them expire. A single, properly functioning client ; should not trip these bans. ; ; To disable, set autobanAttempts or autobanTimeframe to 0. Commenting these ; settings out will cause Murmur to use the defaults: ; ;autobanAttempts=10 ;autobanTimeframe=120 ;autobanTime=300 ; You can configure any of the configuration options for Ice here. We recommend ; leave the defaults as they are. ; Please note that this section has to be last in the configuration file. ; [Ice] Ice.Warn.UnknownProperties=1 Ice.MessageSizeMax=65536 mumble-1.3.4/scripts/transtate.py0000775000175000017500000000371514010707273016720 0ustar builderbuilder#!/usr/bin/env python # # Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . # Extracts the progress of translations from the compilation # log in easily readable form. Make sure to delete all .qm # files beforehand. # # Usage: cat log | .\transtate.py import sys import re def n(val): return (int(val) if val else 0) if __name__ == "__main__": #--Regex matches strings like # #Updating 'mumble_zh_CN.qm'... # Generated 1421 translation(s) (1145 finished and 276 unfinished) # Ignored 89 untranslated source text(s) # s:\dev\QtMumble\bin\lrelease.exe mumble_zh_TW.ts #Updating 'mumble_zh_TW.qm'... # Generated 664 translation(s) (594 finished and 70 unfinished) # Ignored 846 untranslated source text(s) update = re.compile(r"Updating '([\w\.]+)'\.\.\.\s+Generated (\d+) translation\(s\) \((\d+) finished and (\d+) unfinished\)(?:\s+ Ignored (\d+) untranslated source text\(s\))?") langs = 0 s = 's' sortedbyuntranslated = sorted(update.findall(sys.stdin.read()), key=lambda s: (float(s[2]) / (n(s[1]) + n(s[4]))) if n(s[1]) else 10, reverse=True) for lang, total, finished, unfinished, ignored in sortedbyuntranslated: print "%s:" % lang if int(total) == 0: print " Source language" else: realtotal = n(total) + n(ignored) percent = float(finished) / realtotal * 100 print " %d marked unfinished" % (n(unfinished)) if n(ignored): print " %d untranslated." % (n(ignored)) print " => %d%% done (total %d + %d)." % (percent, n(total), n(ignored)) print langs += 1 print "Number of languages: %d" % langs mumble-1.3.4/scripts/murmur.ini.system0000664000175000017500000003703214010707354017710 0ustar builderbuilder; Murmur configuration file. ; ; General notes: ; * Settings in this file are default settings and many of them can be overridden ; with virtual server specific configuration via the Ice or DBus interface. ; * Due to the way this configuration file is read some rules have to be ; followed when specifying variable values (as in variable = value): ; * Make sure to quote the value when using commas in strings or passwords. ; NOT variable = super,secret BUT variable = "super,secret" ; * Make sure to escape special characters like '\' or '"' correctly ; NOT variable = """ BUT variable = "\"" ; NOT regex = \w* BUT regex = \\w* ; Path to database. If blank, will search for ; murmur.sqlite in default locations or create it if not found. database=/var/lib/mumble-server/mumble-server.sqlite ; Murmur defaults to using SQLite with its default rollback journal. ; In some situations, using SQLite's write-ahead log (WAL) can be ; advantageous. ; If you encounter slowdowns when moving between channels and similar ; operations, enabling the SQLite write-ahead log might help. ; ; To use SQLite's write-ahead log, set sqlite_wal to one of the following ; values: ; ; 0 - Use SQLite's default rollback journal. ; 1 - Use write-ahead log with synchronous=NORMAL. ; If Murmur crashes, the database will be in a consistent state, but ; the most recent changes might be lost if the operating system did ; not write them to disk yet. This option can improve Murmur's ; interactivity on busy servers, or servers with slow storage. ; 2 - Use write-ahead log with synchronous=FULL. ; All database writes are synchronized to disk when they are made. ; If Murmur crashes, the database will be include all completed writes. ;sqlite_wal=0 ; If you wish to use something other than SQLite, you'll need to set the name ; of the database above, and also uncomment the below. ; Sticking with SQLite is strongly recommended, as it's the most well tested ; and by far the fastest solution. ; ;dbDriver=QMYSQL ;dbUsername= ;dbPassword= ;dbHost= ;dbPort= ;dbPrefix=murmur_ ;dbOpts= ; Murmur defaults to not using D-Bus. If you wish to use dbus, which is one of the ; RPC methods available in Murmur, please specify so here. ; ;dbus=system ; Alternate D-Bus service name. Only use if you are running distinct ; murmurd processes connected to the same D-Bus daemon. ;dbusservice=net.sourceforge.mumble.murmur ; If you want to use ZeroC Ice to communicate with Murmur, you need ; to specify the endpoint to use. Since there is no authentication ; with ICE, you should only use it if you trust all the users who have ; shell access to your machine. ; Please see the ICE documentation on how to specify endpoints. ice="tcp -h 127.0.0.1 -p 6502" ; Ice primarily uses local sockets. This means anyone who has a ; user account on your machine can connect to the Ice services. ; You can set a plaintext "secret" on the Ice connection, and ; any script attempting to access must then have this secret ; (as context with name "secret"). ; Access is split in read (look only) and write (modify) ; operations. Write access always includes read access, ; unless read is explicitly denied (see note below). ; ; Note that if this is uncommented and with empty content, ; access will be denied. ;icesecretread= icesecretwrite= ; If you want to expose Murmur's experimental gRPC API, you ; need to specify an address to bind on. ; Note: not all builds of Murmur support gRPC. If gRPC is not ; available, Murmur will warn you in its log output. ;grpc="127.0.0.1:50051" ; Specifying both a certificate and key file below will cause gRPC to use ; secured, TLS connections. ;grpccert="" ;grpckey="" ; Specifies the file Murmur should log to. By default, Murmur ; logs to the file 'murmur.log'. If you leave this field blank ; on Unix-like systems, Murmur will force itself into foreground ; mode which logs to the console. logfile=/var/log/mumble-server/mumble-server.log ; If set, Murmur will write its process ID to this file ; when running in daemon mode (when the -fg flag is not ; specified on the command line). Only available on ; Unix-like systems. pidfile=/var/run/mumble-server/mumble-server.pid ; The below will be used as defaults for new configured servers. ; If you're just running one server (the default), it's easier to ; configure it here than through D-Bus or Ice. ; ; Welcome message sent to clients when they connect. ; If the welcome message is set to an empty string, ; no welcome message will be sent to clients. welcometext="
    Welcome to this server running Murmur.
    Enjoy your stay!
    " ; Port to bind TCP and UDP sockets to. port=64738 ; Specific IP or hostname to bind to. ; If this is left blank (default), Murmur will bind to all available addresses. ;host= ; Password to join server. serverpassword= ; Maximum bandwidth (in bits per second) clients are allowed ; to send speech at. bandwidth=72000 ; Murmur and Mumble are usually pretty good about cleaning up hung clients, but ; occasionally one will get stuck on the server. The timeout setting will cause ; a periodic check of all clients who haven't communicated with the server in ; this many seconds - causing zombie clients to be disconnected. ; ; Note that this has no effect on idle clients or people who are AFK. It will ; only affect people who are already disconnected, and just haven't told the ; server. ;timeout=30 ; Maximum number of concurrent clients allowed. users=100 ; Where users sets a blanket limit on the number of clients per virtual server, ; usersperchannel sets a limit on the number per channel. The default is 0, for ; no limit. ;usersperchannel=0 ; Per-user rate limiting ; ; These two settings allow to configure the per-user rate limiter for some ; command messages sent from the client to the server. The messageburst setting ; specifies an amount of messages which are allowed in short bursts. The ; messagelimit setting specifies the number of messages per second allowed over ; a longer period. If a user hits the rate limit, his packages are then ignored ; for some time. Both of these settings have a minimum of 1 as setting either to ; 0 could render the server unusable. messageburst=5 messagelimit=1 ; Respond to UDP ping packets. ; ; Setting to true exposes the current user count, the maximum user count, and ; the server's maximum bandwidth per client to unauthenticated users. In the ; Mumble client, this information is shown in the Connect dialog. allowping=true ; Amount of users with Opus support needed to force Opus usage, in percent. ; 0 = Always enable Opus, 100 = enable Opus if it's supported by all clients. ;opusthreshold=100 ; Maximum depth of channel nesting. Note that some databases like MySQL using ; InnoDB will fail when operating on deeply nested channels. ;channelnestinglimit=10 ; Maximum number of channels per server. 0 for unlimited. Note that an ; excessive number of channels will impact server performance ;channelcountlimit=1000 ; Regular expression used to validate channel names. ; (Note that you have to escape backslashes with \ ) ;channelname=[ \\-=\\w\\#\\[\\]\\{\\}\\(\\)\\@\\|]+ ; Regular expression used to validate user names. ; (Note that you have to escape backslashes with \ ) ;username=[-=\\w\\[\\]\\{\\}\\(\\)\\@\\|\\.]+ ; If a user has no stored channel (they've never been connected to the server ; before, or rememberchannel is set to false) and the client hasn't been given ; a URL that includes a channel path, the default behavior is that they will ; end up in the root channel. ; ; You can set this setting to a channel ID, and the user will automatically be ; moved into that channel instead. Note that this is the numeric ID of the ; channel, which can be a little tricky to get (you'll either need to use an ; RPC mechanism, watch the console of a debug client, or root around through ; the Murmur Database to get it). ; ;defaultchannel=0 ; When a user connects to a server they've already been on, by default the ; server will remember the last channel they were in and move them to it ; automatically. Toggling this setting to false will disable that feature. ; ;rememberchannel=true ; Maximum length of text messages in characters. 0 for no limit. ;textmessagelength=5000 ; Maximum length of text messages in characters, with image data. 0 for no limit. ;imagemessagelength=131072 ; Allow clients to use HTML in messages, user comments and channel descriptions? ;allowhtml=true ; Murmur retains the per-server log entries in an internal database which ; allows it to be accessed over D-Bus/ICE. ; How many days should such entries be kept? ; Set to 0 to keep forever, or -1 to disable logging to the DB. ;logdays=31 ; To enable public server registration, the serverpassword must be blank, and ; this must all be filled out. ; The password here is used to create a registry for the server name; subsequent ; updates will need the same password. Don't lose your password. ; The URL is your own website, and only set the registerHostname for static IP ; addresses. ; Location is typically the country of typical users of the server, in ; two-letter TLD style (ISO 3166-1 alpha-2 country code) ; ; If you only wish to give your "Root" channel a custom name, then only ; uncomment the 'registerName' parameter. ; ;registerName=Mumble Server ;registerPassword=secret ;registerUrl=http://www.mumble.info/ ;registerHostname= ;registerLocation= ; If this option is enabled, the server will announce its presence via the ; bonjour service discovery protocol. To change the name announced by bonjour ; adjust the registerName variable. ; See http://developer.apple.com/networking/bonjour/index.html for more information ; about bonjour. ;bonjour=True ; If you have a proper SSL certificate, you can provide the filenames here. ; Otherwise, Murmur will create its own certificate automatically. ;sslCert= ;sslKey= ; If the keyfile specified above is encrypted with a passphrase, you can enter ; it in this setting. It must be plaintext, so you may wish to adjust the ; permissions on your murmur.ini file accordingly. ;sslPassPhrase= ; If your certificate is signed by an authority that uses a sub-signed or ; "intermediate" certificate, you probably need to bundle it with your ; certificate in order to get Murmur to accept it. You can either concatenate ; the two certificates into one file, or you can put it in a file by itself and ; put the path to that PEM-file in sslCA. ;sslCA= ; The sslDHParams option allows you to specify a PEM-encoded file with ; Diffie-Hellman parameters, which will be used as the default Diffie- ; Hellman parameters for all virtual servers. ; ; Instead of pointing sslDHParams to a file, you can also use the option ; to specify a named set of Diffie-Hellman parameters for Murmur to use. ; Murmur comes bundled with the Diffie-Hellman parameters from RFC 7919. ; These parameters are available by using the following names: ; ; @ffdhe2048, @ffdhe3072, @ffdhe4096, @ffdhe6144, @ffdhe8192 ; ; By default, Murmur uses @ffdhe2048. ;sslDHParams=@ffdhe2048 ; The sslCiphers option chooses the cipher suites to make available for use ; in SSL/TLS. This option is server-wide, and cannot be set on a ; per-virtual-server basis. ; ; This option is specified using OpenSSL cipher list notation (see ; https://www.openssl.org/docs/apps/ciphers.html#CIPHER-LIST-FORMAT). ; ; It is recommended that you try your cipher string using 'openssl ciphers ' ; before setting it here, to get a feel for which cipher suites you will get. ; ; After setting this option, it is recommend that you inspect your Murmur log ; to ensure that Murmur is using the cipher suites that you expected it to. ; ; Note: Changing this option may impact the backwards compatibility of your ; Murmur server, and can remove the ability for older Mumble clients to be able ; to connect to it. ;sslCiphers=EECDH+AESGCM:EDH+aRSA+AESGCM:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:AES256-SHA:AES128-SHA ; If Murmur is started as root, which user should it switch to? ; This option is ignored if Murmur isn't started with root privileges. uname=mumble-server ; By default, in log files and in the user status window for privileged users, ; Mumble will show IP addresses - in some situations you may find this unwanted ; behavior. If obfuscate is set to true, Murmur will randomize the IP addresses ; of connecting users. ; ; The obfuscate function only affects the log file and DOES NOT effect the user ; information section in the client window. ;obfuscate=false ; If this options is enabled, only clients which have a certificate are allowed ; to connect. ;certrequired=False ; If enabled, clients are sent information about the servers version and operating ; system. ;sendversion=True ; You can set a recommended minimum version for your server, and clients will ; be notified in their log when they connect if their client does not meet the ; minimum requirements. suggestVersion expects the version in the format X.X.X. ; ; Note that the suggest* options appeared after 1.2.3 and will have no effect ; on client versions 1.2.3 and earlier. ; ;suggestVersion= ; Setting this to "true" will alert any user who does not have positional audio ; enabled that the server administrators recommend enabling it. Setting it to ; "false" will have the opposite effect - if you do not care whether the user ; enables positional audio or not, set it to blank. The message will appear in ; the log window upon connection, but only if the user's settings do not match ; what the server requests. ; ; Note that the suggest* options appeared after 1.2.3 and will have no effect ; on client versions 1.2.3 and earlier. ; ;suggestPositional= ; Setting this to "true" will alert any user who does not have Push-To-Talk ; enabled that the server administrators recommend enabling it. Setting it to ; "false" will have the opposite effect - if you do not care whether the user ; enables PTT or not, set it to blank. The message will appear in the log ; window upon connection, but only if the user's settings do not match what the ; server requests. ; ; Note that the suggest* options appeared after 1.2.3 and will have no effect ; on client versions 1.2.3 and earlier. ; ;suggestPushToTalk= ; This sets password hash storage to legacy mode (1.2.4 and before) ; (Note that setting this to true is insecure and should not be used unless absolutely necessary) ;legacyPasswordHash=false ; By default a strong amount of PBKDF2 iterations are chosen automatically. If >0 this setting ; overrides the automatic benchmark and forces a specific number of iterations. ; (Note that you should only change this value if you know what you are doing) ;kdfIterations=-1 ; In order to prevent misconfigured, impolite or malicious clients from ; affecting the low-latency of other users, Murmur has a rudimentary global-ban ; system. It's configured using the autobanAttempts, autobanTimeframe and ; autobanTime settings. ; ; If a client attempts autobanAttempts connections in autobanTimeframe seconds, ; they will be banned for autobanTime seconds. This is a global ban, from all ; virtual servers on the Murmur process. It will not show up in any of the ; ban-lists on the server, and they can't be removed without restarting the ; Murmur process - just let them expire. A single, properly functioning client ; should not trip these bans. ; ; To disable, set autobanAttempts or autobanTimeframe to 0. Commenting these ; settings out will cause Murmur to use the defaults: ; ;autobanAttempts=10 ;autobanTimeframe=120 ;autobanTime=300 ; You can configure any of the configuration options for Ice here. We recommend ; leave the defaults as they are. ; Please note that this section has to be last in the configuration file. ; [Ice] Ice.Warn.UnknownProperties=1 Ice.MessageSizeMax=65536 mumble-1.3.4/CHANGES0000664000175000017500000225762214010707273013654 0ustar builderbuilder2019-08-30 Davide Beatrici fc04121 Merge PR #3770: CI: Fix Azure Pipelines build failing 2019-08-29 Davide Beatrici 44c5e22 Azure Pipelines: store build environment in the proper directory 9f442e1 Merge PR #3772: compiler.pri: disable warnings for deprecated stuff 10be08c compiler.pri: disable warnings for deprecated stuff 2019-07-26 Davide Beatrici 2b997d6 Merge PR #3728: Travis CI: only execute SonarScan and AppImage builder when in our repository 82b0aac Travis CI: only execute SonarScan and AppImage builder when in our repository 2019-07-20 Davide Beatrici c3a9f0d Merge PR #3726: Correct path to icon probonopd 8026d1c Correct path to icon 2019-07-17 Davide Beatrici 467cbd9 Merge PR #3655: Add Cirrus CI for continuous integration (FreeBSD) 0bd53d7 Add Cirrus CI for continuous integration (FreeBSD) 2019-07-03 Davide Beatrici b36dd3d Merge PR #3718: Create lgtm.yml to configure C/C++ analysis for LGTM.com ce76e00 Merge PR #3719: Azure Pipelines: remove macOS build until we fix the many errors (deprecated stuff) 2019-07-02 Bas van Schaik <5082246+sjvs@users.noreply.github.com> 16801b8 Create lgtm.yml to configure C/C++ analysis for LGTM.com Davide Beatrici bb6416c Azure Pipelines: remove macOS build until we fix the many errors (deprecated stuff) da67a1f .lgtm.yml: override qmake command 2019-07-01 Davide Beatrici 2fa33c4 Create FUNDING.yml 2019-06-29 Davide Beatrici e19aaa1 Merge PR #3715: Travis CI: add SonarCloud integration for static code analysis b517f01 Travis CI: add SonarCloud integration for static code analysis 2019-06-10 Davide Beatrici 41b2655 Merge PR #3704: Do not build tags that we create when we upload to GitHub Releases 83bca04 Merge PR #3703: Generate and upload AppImage probonopd 3f31c9b Do not build tags that we create when we upload to GitHub Releases 049f6a2 DEFINES+="MUMBLE_VERSION=${TRAVIS_COMMIT:0:7}" 78155c5 DEFINES+="MUMBLE_VERSION=$TRAVIS_COMMIT" 2019-06-09 probonopd 6013e8d AppImage 2019-05-31 Constantin Wenger 5207c00 fixed setting comment to username instead of updating username over grpc when updating database user Davide Beatrici 41502bb Merge PR #3698: fixed setting comment to username instead of updating username 2019-05-26 Davide Beatrici 02a14f4 Merge PR #3695: ServerUser: use QTime instead of std::chrono and ctime 2019-05-25 Davide Beatrici da7baf5 ServerUser: use QTime instead of std::chrono and ctime 4e83913 Merge PR #3603: GlobalShortcutMac: fix segmentation fault in setEnabled() 2019-05-24 Davide Beatrici d7353b7 GlobalShortcutMac: fix segmentation fault in setEnabled() 2019-05-09 Davide Beatrici cbbc342 Merge PR #3690: Build/package murmur in a docker image 5a4f4cd Merge PR #3691: Minimize window on tray icon click Graeme Lawes 041136d Build/package murmur in a docker image 2019-05-08 Andre 48e793e Minimize window on tray icon click 2019-05-07 Graeme Lawes f0b393a Remove Ice version/path locks for static builds 2019-05-04 Davide Beatrici d737867 Merge PR #3683: JackAudio: fix segmentation fault, revamp initialization logic 0ee0683 JackAudio: fix segmentation fault, revamp initialization logic 2019-05-03 Davide Beatrici 0e71f79 Merge PR #3684: Set temporary, position, and description in GRPC ChannelAdd 2019-05-02 Thomas Ross 38a9960 Set temporary, position, and description in GRPC ChannelAdd 2019-04-09 Davide Beatrici 0f39a12 Merge PR #3633: Add missing ssleay32 library reference in openssl qmake configuration f90ef83 Merge PR #3632: Add missing advapi32 library reference in server project 2019-04-07 Alexis Jeandeau 5af3145 Add support for TLS 1.3 in the server information window Davide Beatrici 4c82dd5 Merge PR #3663: Add support for TLS 1.3 in the server information window 2019-04-05 Davide Beatrici 1e3d6a5 Merge PR #3646: Build Opus as shared library in static build, copy it into App Bundle c75aafc travis-ci: build installer in macOS build 8893126 macx/scripts/osxdist.py: add "--no-compat-warning" option 1813fe1 macx/scripts/osxdist.py: copy Opus library into App Bundle b1f8964 3rdparty/opus-build: build as shared library even if it's a static build 2019-04-03 Davide Beatrici c38d77e Merge PR #3659: Fix transaction handling in Server::registerUser ca8f3dd Merge PR #3652: Azure Pipelines: add macOS build 2019-04-02 Davide Beatrici 2555a87 Azure Pipelines: add macOS build 5f43f65 Merge PR #3658: Fixed a bug/typo which prevented audio from playing on user disconnect Thomas Ross e95617a Fix transaction handling in Server::registerUser 2019-04-01 Elbon <4796255+Elbon@users.noreply.github.com> 3f178a4 Fixed a bug/typo which prevented audio from playing on user disconnect 2019-03-29 Davide Beatrici 193c01d Merge PR #3654: LCD.cpp: remove unused "bound" variable efcbb16 LCD.cpp: remove unused "bound" variable 2019-03-25 Alexis Jeandeau afa9f83 Fix typos in ServerDB::loadOrSetupMetaPKBDF2IterationsCount f66a8d5 Remove unnecessary spaces in the logs when setting up the PBKDF2 iteration count Davide Beatrici 15072a4 Merge PR #3645: Fix log spacing and typos when setting up the PBKDF2 iteration count 2019-03-21 Davide Beatrici f8ba6e0 Merge PR #3641: Add "Classic - Old Style" theme 4b93a9d INSTALL: document new "no-classic-theme" CONFIG option 9f6d21b themes: add "Classic - Old Style" theme 2019-03-19 Davide Beatrici 6ed06bd Merge PR #3639: Messages: show "You moved user to channel" message also when the user is not in/moved to own channel 8d3521c Merge PR #3638: Fix pod bay doors trigger system a9b0311 Messages: show "You moved user to channel" message also when the user is not in/moved to own channel 1961ce1 Fix pod bay doors trigger system 2019-03-17 Jan Klass 5fe390a Add missing ssleay32 library reference in openssl qmake configuration bcf4704 Add missing advapi32 library reference in server project 2019-03-13 Davide Beatrici 1ee050a Merge PR #3606: Transifex translation update 2019-03-10 Davide Beatrici 12f3ba1 travis-ci: switch to Xenial for Qt 5 builds, improve matrix, update MXE mirror d560056 Merge PR #3626: mumble/main.cpp: fix compilation with Qt >= 5.9 Jan Klass 72b4df2 Merge PR #3622: travis-ci: switch to Xenial for Qt 5 builds, improve matrix, update MXE mirror 2019-03-09 Davide Beatrici 4f59dd7 mumble/main.cpp: fix compilation with Qt >= 5.9 8a1e0e8 Merge PR #3627: Add global shortcuts for setting specific transmit modes 3010e03 Translation update David 307999e Add global shortcuts for setting specific transmit modes 2019-03-05 Davide Beatrici c014e04 Merge PR #3623: Include "Global.h" after "Mumble.pb.h", to avoid a redefinition issue with protobuf 3.7 ce0ecff Include "Global.h" after "Mumble.pb.h", to avoid a redefinition issue with protobuf 3.7 2019-03-01 Davide Beatrici 0325836 Merge PR #3616: OverlayEditorScene: fix object opacity calculation 42ab841 OverlayEditorScene: fix object opacity calculation 2019-02-28 Davide Beatrici 1974ac0 Merge PR #3614: Default disable GKey Stefan Hacker b0bd029 Default disable GKey 2019-02-26 Davide Beatrici c91553c Merge PR #3612: mumble: change title of windows which have the default one ("Form") c49301b Merge PR #3611: AudioWizard: fix speech sample path 268a437 mumble: change title of windows which have the default one ("Form") 69864bd AudioWizard: fix speech sample path 2019-02-22 Davide Beatrici 755c290 Merge PR #3604: Add tray menu action to show the main window 896d51a Translation update trudnorx e76140b Add tray menu action to show the main window 2019-02-09 Davide Beatrici ba08786 Merge PR #3595: Refactor themes.cpp and themes.h JustABanana bdfda03 Refactor themes.cpp and themes.h 2019-02-07 Davide Beatrici 1fb1e9c Merge PR #3594: murmur: cross pkg-config build fix 2019-02-06 Timo Gurr cd55aec murmur: cross pkg-config build fix 2019-01-26 Chris Knadle 4e024a2 qmake/pkgconfig.pri: Update to allow building with Qt4 Davide Beatrici c176974 Merge PR #3589: Crossbuild fix 909c13c Merge PR #3590: Fix Duplicate Certificates In Chain Viewer Maxwell Cody ead94a8 Fix duplicate certificates in certificate chain viewer 2019-01-25 Davide Beatrici 4976c1a Merge PR #3577: Update copyright (2019) 6e70999 Merge PR #3587: Global: fix migrateDataDir() not migrating the data directory 30ad8ba Global: fix migrateDataDir() not migrating the data directory e154a1b src/murmur/MurmurIceWrapper.cpp: update copyright years 08ef8ac Update copyright years in about dialogs for Mumble and Murmur ceed206 Update src/licenses.h via scripts/mklic.pl c4d0b00 scripts/mklic.pl: remove license for icon not present anymore 12cf955 Update copyright years in .plist and .rc files b427333 Auto-update LICENSE.header in source files 0105626 LICENSE, LICENSE.header: add 2019 to the copyright range 15f268c Merge PR #3586: Murmur: fix Denial of Service vulnerability in msgChannelState() 3edc46f Murmur: fix Denial of Service vulnerability in msgChannelState() 2019-01-19 Chris Knadle 427c746 src/mumble/mumble.pro: use PKG_CONFIG instead of hardcoding call to pkg-config e10b155 src/mumble.pri: remove unneeded call to pkg-config to allow cross building bb61d40 main.pro: use PKG_CONFIG instead of hardcoding call to pkg-config 50e5a2b qmake/compiler.pri: use PKG_CONFIG instead of hardcoding call to pkg-config 40ba488 qmake/pkgconfig.pri: set PKG_CONFIG to allow making package cross buildable 2019-01-18 Davide Beatrici e31d267 Merge PR #3576: Transifex translation update 2019-01-17 Davide Beatrici 66f5ae9 Merge PR #3580: ConnectDialog: create "Unknown" continent, never expand it automatically f041737 Translation update 6084223 ConnectDialog: create "Unknown" continent, never expand it automatically 2019-01-16 Davide Beatrici 8c14906 Merge PR #3578: Remove AppVeyor configuration 2a37f18 Remove AppVeyor configuration 17cdab7 Merge PR #3575: Add Azure Pipelines for continuous integration (Windows) cdecae6 README.md: add Azure Pipelines status badge 0383dee Add Azure Pipelines for continuous integration (Windows) 2019-01-14 Davide Beatrici b981566 Merge PR #3572: WASAPI: print log message when the OS blocks access to the microphone 2019-01-13 Davide Beatrici b01639d Translation update 5913171 WASAPI: print log message when the OS blocks access to the microphone 2019-01-02 Davide Beatrici 5e1ec5a Murmur: use dedicated domain for public list registration 885187e Merge PR #3569: Transifex translation update 2018-12-30 Davide Beatrici 5ff6fdc Merge PR #3566: Transifex translation update Kevin Zheng a78cff3 Fix build with OpenSSL 1.1.1a 4f0394a Update gitignore 2018-12-20 Davide Beatrici 5f370a8 Merge PR #3464: Fix crash when Opus is not available and add critical error message d63337d Translation update 2a5fa1c Messages: show critical error message if Opus is not available 6d01f1d Fix crash when Opus is not available 2018-12-18 Davide Beatrici 16c1145 Merge PR #3564: Don't drop indices on MySQL 2018-12-15 Davide Beatrici d7ef517 Merge PR #3418: ALSAAudioInput: use snd_pcm_drop() instead of snd_pcm_drain() in class destructor Lorenz Brun e5aadf2 Don't drop indices, this breaks the upgrade process 2018-12-09 Davide Beatrici 1a95cff Merge PR #3559: Messages: fix user registration status not being updated bb245f8 Messages: fix user registration status not being updated 2018-11-26 Davide Beatrici 9b19e60 Merge PR #3548: Disable hiding when system tray not present 2018-11-25 meditator c199fe5 Disable hiding when system tray not present 2018-11-04 Davide Beatrici bfc8749 Merge PR #3546: Transifex translation update 2018-10-29 Prakhar Yadav 709db1a corrected spelling/grammar aa0b42e corrected spellings/grammar for readability b66cdab corrected spellings and grammar for readability 2018-10-28 Davide Beatrici df8b774 Merge PR #3545: Minor corrections for better readability 2018-10-01 Davide Beatrici 5d6978c Merge PR #3527: Transifex translation update 2018-09-08 Davide Beatrici b44b1f2 Merge PR #3517: Make Rate limiter configurable MadMaurice 73a0b2f Make Rate limiter configurable. 2018-08-31 Davide Beatrici f7221c1 Merge PR #3512: Lower bucket params MadMaurice 4761ca4 Lower bucket params 2018-08-30 Davide Beatrici 44b9004 Merge PR #3510: Prevent instability and crash due to message flood MadMaurice 0daec57 Prevent instability and crash due to message flood 2018-08-28 Davide Beatrici f672edd Merge PR #3499: icons: update Mumble icon for macOS 2018-08-20 Davide Beatrici 94b14fa icons: remove unused "mumble.osx.png" image 0db0ea3 icons: update Mumble icon for macOS 7bf387d Merge PR #3475: Use Mumble theme icons for the system theme 2018-08-14 Davide Beatrici 3fa973c Merge PR #3495: Transifex translation update 2018-08-04 Davide Beatrici 4269b0b Merge PR #3488: Transifex translation update 2018-08-02 Davide Beatrici d3cf441 Merge PR #3490: JackAudio: change disconnect_ports() so that it uses stored ports instead of retrieving them using jack_get_ports() 84f3488 JackAudio: change disconnect_ports() so that it uses stored ports instead of retrieving them using jack_get_ports() 2018-07-23 Davide Beatrici 3c54253 icons: delete third party icons and move our own into "classic" 0f38d4e Remove icons which are not used anymore from the list of files to embed 2018-07-22 Davide Beatrici fb8466c Themes: change skins resources path from ":/" to ":/themes/Mumble" 86be682 themes: drop redundant `builtin` path prefix 2018-07-21 Davide Beatrici 7c08da0 Merge PR #3481: installer: copy rnnoise.dll 2018-07-20 Edward 09204fe installer: copy rnnoise.dll 2018-07-17 Davide Beatrici adcf9fe Merge PR #3474: Log: fix notification being triggered for own messages when TTS readback is enabled b7c9ae6 Log: fix notification being triggered for own messages when TTS readback is enabled 91601a1 Merge PR #2902: installer: quote GUIDs in Settings.wxi. 86197ff Merge PR #3473: Messages: set user hash and ID on join 3a51d6b Messages: set user hash and ID on server join 2018-07-15 Davide Beatrici 68aae1d Merge PR #3468: Transifex translation update 2018-07-13 Davide Beatrici 5039340 Merge PR #3370: Fix Boost library link for MSYS2 68cfcc4 Merge PR #3466: Translation update 2018-07-12 Davide Beatrici 70d336b Translation update e9600d4 Merge PR #3459: Transifex translation update 2018-07-08 Davide Beatrici e21ff85 Merge PR #3445: Transifex translation update f6a6b66 Merge PR #3456: Add "--jackname" and "--jn" parameters to set a custom Jack client name e981c61 Merge PR #3450: OpusCodec: add "libopus.so.0" (Linux) and "opus.dll" (Windows) to the library names e3ad955 Merge PR #3454: INSTALL: document "no-jackaudio" option 493e4a2 Add "--jackname" and "--jn" parameters to set a custom Jack client name 1781697 Merge PR #3453: AudioInput: calculate audio statistics after RNNoise processing 531e164 INSTALL: document "no-jackaudio" option ec11400 AudioInput: check denoiseState before calling rnnoise_process_frame() 0618356 AudioInput: calculate audio statistics after RNNoise processing 91f5e1c Merge PR #3451: Add configurable private text message notification 7fb1e50 Translation update a579fc8 Add configurable private text message notification fbe0638 OpusCodec: add "libopus.so.0" (Linux) and "opus.dll" (Windows) to the library names 07c8e00 Merge PR #3442: Add configurable "User connected and entered channel" and "User left channel and disconnected" messages a3c2242 Translation update fc4368a Add configurable "User connected and entered channel" and "User left channel and disconnected" messages 2018-07-07 Davide Beatrici e54f60f Merge PR #3427: RNNoise 854d0b2 Translation update 37718eb INSTALL: document RNNoise options b6cc8e7 rnnoise-build: define USE_MALLOC to use malloc() and free() instead of variable length arrays 0e9944f rnnoise-build: define _USE_MATH_DEFINES for MSVC, to add the M_PI macro main() 8060171 Add RNNoise support 2018-07-06 Davide Beatrici 42b43ee Merge PR #3443: installer: remove unused variables e0ee016 Merge PR #3431: Create OpusCodec class, similar to CeltCodec, in order to load Opus' functions from a shared library 8ca51d0 Compile Opus as shared library 8adf78d Introduce OpusCodec to use Opus as shared library 23f783d installer: remove unused variables 426cd1e Merge PR #3441: Transifex translation update 2018-07-05 Davide Beatrici 1098afc Merge PR #3426: Messages: revamp channel join/leave logic and add "User connected and entered channel." message 7632305 Translation update c964162 Messages: revamp channel join/leave logic 2018-07-04 Davide Beatrici a963fd0 Merge PR #3438: Translation update 09c71b4 Merge PR #3437: Settings: enable JACK auto-connect option by default eded751 Translation update 92ed3ee Settings: enable JACK auto-connect option by default 08d9b9c Merge PR #3435: JACK: don't start the server if using another backend, create only required ports e450d80 JACK: don't start the server if using another backend, create only required ports 7e15d9e Merge PR #3436: Comment and status text fixes 2018-07-03 Jan Klass 5c3c96e Add descriptive comment to release.pl 38e8893 Fix incorrect status text in release.pl cfe8f80 Fix typo in comment 2018-07-02 Bernd Buschinski dc64e33 Jack: adapt codestyle 7e9a767 Jack: fix possible crash on close 00805e9 Jack: add option to autostart jackserver (default on) and another one to autoconnect Jack ports (default off) bbaed83 Jack: improve error checking db3f041 Jack: fix possible crash on Mumble shutdown c848936 Jack: make number of output channels configurable (mono/stereo) 0017d8b Jack: fix it always being active 6d170c3 Jack: add stereo support 5267074 Jack: convert spaces to tabs, to fit better with Mumble's coding style Davide Beatrici 6ac6ae8 Fix Boost library link for MSYS2 e399de7 Merge PR #3194: Third-party license update 1bf549d Merge PR #3396: Add JACK Audio support 702c8a4 Jack: add missing include 7dce59a Travis CI: install "libjack-jackd2-dev" for Linux builds 9e715f1 Jack: update license header Mark Felder a1d1272 Jack: add initial support 2018-07-01 Tim Cooper c19ac8c Merge PR #3432: Mark installer as AppVeyor build artifact bf64461 Mark installer as AppVeyor build artifact 2018-06-18 Davide Beatrici 6195761 Merge PR #3422: Fix #3411: Threaded access to Database Jan Klass 222def7 Fix #3411: Threaded access to Database 2018-06-16 Davide Beatrici fbbdf2e ALSAAudioInput: use snd_pcm_drop() instead of snd_pcm_drain() in class destructor a092a44 Merge PR #3405: travis-ci: unlink Python 2 files on MacOS 2018-06-15 Davide Beatrici 0663833 travis-ci: Fix MacOS build for new images Stefan Hacker 5b034be Accept incompatibility with other 1.3 pre-release snapshots 2018-06-14 Stefan Hacker 46cd35c Fix typo 9e0526c Introduce channelcountlimit to limit max channels per server 2018-06-09 Davide Beatrici e85191b Merge PR #3407: Transifex translation update 2018-04-29 Tim Cooper 2ad8c65 Merge PR #3403: use user leave message when user disconnects and is in the same channel 8f60ca8 use user leave message when user disconnects and is in the same channel 2018-04-22 Mikkel Krautz 00625d6 Merge PR #3399: Transifex translation update 2018-04-20 Mikkel Krautz af4b752 Merge PR #3398: Use Utf8 QStrings for PulseAudio Tasos Sahanidis ee08dc0 Use Utf8 QStrings for PulseAudio 2018-04-02 Mikkel Krautz 2126495 Merge PR #3393: Add qtaccessiblewidgets to PLUGINS for Qt 4 builds. 0fad7ad Add qtaccessiblewidgets to PLUGINS for Qt 4 builds. 2018-04-01 Davide Beatrici b25ea2d Merge PR #3392: Only invoke Q_IMPORT_PLUGIN(qico) on Windows. 03a4d45 Merge PR #3391: XMLTools: include QXmlStream headers to get proper symbols names on Qt 4. Mikkel Krautz f69e776 Only invoke Q_IMPORT_PLUGIN(qico) on Windows. 2018-03-31 Mikkel Krautz fe732bd XMLTools: include QXmlStream headers to get proper symbols names on Qt 4. 2018-03-26 Davide Beatrici 109ddd4 Merge PR #3383: UserModel: show muted/deafened state icon only in the right hand column 0c2a023 UserModel: show muted/deafened state icon only in the right hand column 1971dd0 Merge PR #3382: plugins/rl: update plugin and add avatar top vector support c45695c plugins/rl: update plugin and add avatar top vector support 2018-03-25 Davide Beatrici 26c732f Merge PR #3381: About: allow text in "About" tab to be selected 3575a4c About: allow text in "About" tab to be selected 2018-03-18 Davide Beatrici b25db3e Merge PR #3359: SvgIcon: add new class to work around issues with SVG QIcons in Plasma/KStatusNotifierItem Mikkel Krautz 004a105 SvgIcon: add new class to work around issues with SVG QIcons in Plasma/KStatusNotifierItem 2018-03-16 Davide Beatrici 208ff15 Merge PR #3372: plugins/rl: single source file for both Linux and Windows 2018-03-15 Davide Beatrici ebb79ee plugins/rl: single source file for both Linux and Windows 2018-03-12 Davide Beatrici b230c28 Merge PR #3364: Correct case of AGL/agl.h to allow compilation on case-sensitive filesystem Mikkel Krautz e3e3263 Merge PR #3369: installer: only use WiX toolset from MUMBLE_PREFIX if the MUMBLE_PREFIX env var is set. 2018-03-11 Davide Beatrici 80f3686 Merge PR #3368: Change icon when muted/deafened 4877327 Add push-to-mute status icon f540d9e Change icon when muted/deafened Harald Niesche 481299a Correct case of AGL/agl.h to allow compilation on case-sensitive filesystem Mikkel Krautz adccd8c installer: only use WiX toolset from MUMBLE_PREFIX if the MUMBLE_PREFIX env var is set. 2018-03-02 Davide Beatrici ce8fd36 Merge PR #3354: Add per-notification setting to toggle window highlight (if not active) dcdf069 Translation update 21eb9cc Add per-notification setting to toggle window highlight 2018-03-01 Davide Beatrici 651e4d0 Merge PR #3349: Add configurable "You joined channel" and "You have been moved to channel by..." messages a02084a Translation update 620c67c Add configurable "You joined channel" and "You have been moved to channel by..." messages 3cd8b98 Merge PR #3355: Translation update 8f7c61b Translation update 2018-02-19 Davide Beatrici ec3f2ca Merge PR #3339: Set custom build folders globally, with support for shadow builds 2018-02-18 Davide Beatrici 9a47475 g15helper: don't set custom build directory 42e8d60 macx: don't set custom build directory 5477e8f overlay: set custom build directory in relation to the global one b0974d7 plugins: set custom build directory in relation to the global one 2396580 src: set custom build directory in relation to the global one 209255d 3rdparty: don't set custom build directories, aside from the two CELT versions 696e968 qmake: set custom build folders globally, with separated directories for each build file type 2018-02-13 Davide Beatrici a0e2797 Build with PortAudio support only with "portaudio" CONFIG flag Mikkel Krautz 48277cb Merge PR #3338: Build with PortAudio support if the "portaudio" CONFIG flag is specified 2018-02-11 Mikkel Krautz e25cc49 scripts/mklic.pl, 3rdPartyLicenses: add libffi license. 8eb9dfd scripts/mklic.pl, 3rdPartyLicenses: add libdaemon license. 185a0aa scripts/mklic.pl, 3rdPartyLicenses: add libcap2 license. 33a1a05 scripts/mklic.pl, 3rdPartyLicenses: add glib license. c93692c scripts/mklic.pl, 3rdPartyLicenses: add libfuse license. 4a83bb8 scripts/mklic.pl, 3rdPartyLicenses: add squashfuse license. c310c42 scripts/mklic.pl, 3rdPartyLicenses: add AppImage runtime license. 8407b49 scripts/mklic.pl, 3rdPartyLicenses: add D-Bus license. eae5e74 scripts/mklic.pl, 3rdPartyLicenses: add Avahi license. 2a2a0e0 scripts/mklic.pl, 3rdPartyLicenses: add XAR license. ec789c6 scripts/mklic.pl, 3rdPartyLicenses: add SQLite3 license. 0eb596a scripts/mklic.pl, 3rdPartyLicenses: add Qt license. ced5a50 scripts/mklic.pl, 3rdPartyLicenses: add PCRE license. 9b1f221 scripts/mklic.pl, 3rdPartyLicenses: add mDNSResponder license. 1d0e700 scripts/mklic.pl, 3rdPartyLicenses: add mcpp license. 4f846c3 scripts/mklic.pl, 3rdPartyLicenses: add ZeroC Ice license. ab20c90 scripts/mklic.pl, 3rdPartyLicenses: add libjpeg-turbo license. ae213d7 scripts/mklic.pl, 3rdPartyLicenses: add libpng license. 51907d0 scripts/mklic.pl, 3rdPartyLicenses: add harfbuzz-ng license. bbc0cb5 scripts/mklic.pl, 3rdPartyLicenses: add freetype license. f47335c scripts/mklic.pl, 3rdPartyLicenses: add BerkeleyDB license. b07551d scripts/mklic.pl, 3rdPartyLicenses: add bzip2 license. 96cd9b9 scripts/mklic.pl, 3rdPartyLicenses: add Boost license. a19b388 scripts/mklic.pl, 3rdPartyLicenses: add expat license. 44b1248 scripts/mklic.pl, 3rdPartyLicenses: add protobuf license. 717cefc scripts/mklic.pl, 3rdPartyLicenses: add zlib license. 84e0f7d scripts/mklic.pl: add MariaDB Connector/C license. 6fc31cb scripts/mklic.pl: Use MinHook license from 3rdparty/minhook-src. ada91f1 3rdPartyLicenses: update OpenSSL license. 0dddc43 Merge PR #3337: XMLTools: remove unused default argument 'opstyle' in recurseParse(). 7f52257 XMLTools: remove default argument 'opstyle' in recurseParse(). 2018-02-10 Mikkel Krautz 39c526a Merge PR #3335: Update mumble.desktop ronnystandtke dfef2eb Update mumble.desktop 2018-02-08 Tim Cooper 23b171c ignore connecting users in qhUsers hash in gRPC implementation 2018-01-29 Jan Klass c8ed9f9 Fix error when handling TCP tunneled UDP voice packets Mikkel Krautz aa90739 Merge PR #3326: Fix error when handling TCP tunneled UDP voice packets 2018-01-27 Mikkel Krautz 16810dd Merge PR #3322: SelfSignedCertificate: fix automatic certificate generator b28c30a TestSelfSignedCertificate: add tests that exercise new email SAN behavior. 519d04b SelfSignedCertificate: only add email SAN to client certs if the passed-in email is non-empty. 7dd6ec6 SelfSignedCertificate: add missing 'goto out's. 2018-01-25 Davide Beatrici 92011a9 TestSelfSignedCertificate: Change empty name and email test to work with SelfSignedCertificate's new logic e017c40 TestSelfSignedCertificate: Check that both "cert" and "key" are not empty d47f2e3 SelfSignedCertificate: Fix automatic certificate generator, by specifying the certificate type with an enum Mikkel Krautz 1273ba9 Merge PR #3318: Fix changes made in #3311 2018-01-23 Davide Beatrici 6d8dcdc PulseAudio.cpp: Revert changes applied by commit 0b5579c and comment intentional fallthroughs f2d0a2f Server.cpp: Remove line of code accidentally added in commit 0b5579c 2018-01-22 Davide Beatrici 1b203cd Merge PR #3311: Fix and refactor problems found via GCC 7's -Wimplicit-fallthrough. 2018-01-21 Davide Beatrici 0b5579c Fix and refactor problems found via GCC 7's -Wimplicit-fallthrough. 6bd9bc9 Correctly handle ServerResolver errors, with dedicated signal and slot Mikkel Krautz e5ff9c5 Merge PR #3310: Correctly handle ServerResolver errors, with dedicated signal and slot 2018-01-20 Mikkel Krautz 71ab5b0 Merge PR #3313: scripts/travis-ci: bump apt timeout in before_install.bash. 031abd0 Merge PR #3315: scripts/travis-ci: fix MUMBLE_NO_PCH checks in script.bash. 6a1663a scripts/travis-ci: fix MUMBLE_NO_PCH checks in script.bash. edd1de0 scripts/travis-ci: bump apt timeout in before_install.bash. 2018-01-15 Mikkel Krautz a189969 Merge PR #3304: ServerHandler, Settings: add ping interval and connection timeout duration settings. 2018-01-14 Mikkel Krautz 97d776a ServerHandler: use ping interval and connection timeout duration from Settings instead of magic numbers. 5d4a7d3 Settings: implement settings for ping interval and connection timeout duration. b7b16cf Merge PR #3305: scripts/travis-ci: use our own (Fastly-fronted) mirror of pkg.mxe.info. 8b1ef2e scripts/travis-ci: use our own (Fastly-fronted) mirror of pkg.mxe.info. 2c24ee0 Merge PR #3303: ServerHandler: do not send pings unless the TLS handshake has completed. 2018-01-13 Mikkel Krautz d188861 ServerHandler: do not send pings unless the TLS handshake has completed. 2018-01-12 Davide Beatrici e348e47 Remove leftover includes from "main" and "macx" project files Mikkel Krautz 1844f21 Merge PR #3301: GRPC: fix deadlock in removeChannel 2018-01-09 Jonas Herzig fb4451d GRPC: fix deadlock in removeChannel 2018-01-08 Mikkel Krautz 28a8e64 Merge PR #3298: Update gRPC server to work with recent gRPC versions 2018-01-07 Jonas Herzig 27edcd4 GRPC: remove unsafe calls to IsCancelled 76a1757 GRPC: fix flipped logic in removeTextMessageFilter 92cd615 GRPC: use AsyncNotifyWhenDone instead of cleanup timer 2018-01-05 Mikkel Krautz 76eb586 Merge PR #3277: .travis.yml: remove mingw builds from allow_failures. f41b058 .travis.yml: remove mingw builds from allow_failures. 820ee72 Merge PR #3295: Disable SRV tests when running on Wine 2018-01-04 Mikkel Krautz 28f55af TestServerResolver: reference upstream WineHQ bug in tests skipped on Wine. 3dd8f1d PlatformCheck: add a reference to the Wine wiki for our Wine detection code. 159be4b PlatformCheck: do not assign QLibrary::resolve() retval to variable for wider compatibility. f0c2d8b TestServerResolver: skip SRV tests when running on Wine. 5192831 src/tests: update .pro files to append to SOURCES and HEADERS instead of overwriting them. 29ebd2b Build PlatformCheck into all test binaries. 3c400f4 Add PlatformCheck class, for runtime platform detection. 2018-01-02 Mikkel Krautz 3ffd9ad Merge PR #3291: 2018: Happy New Year 2018-01-01 Mikkel Krautz d007191 Re-generate MurmurIceWrapper.cpp via scripts/mkwrapper.pl. acb43a2 Update copyright years in about dialogs for Mumble and Murmur. cc88443 Update src/licenses.h via scripts/mklic.pl. 23261e2 Update copyright years in .plist and .rc files. f6ba3a5 Auto-update LICENSE.header in source files. 4c69e1d LICENSE, LICENSE.header: add 2018 to the copyright range. 2017-12-31 Mikkel Krautz caa1873 Merge PR #3287: AudioOutput: do not use non-existant template version of std::abs. 6ca110a src/tests: add TestStdAbs test. a221fed mumble_pch.hpp: explicitly include . ea861fe AudioOutput: do not use non-existant template version of std::abs. ab5ecba Merge PR #3289: qmake/compiler.pri: target macOS 10.8 when building against Qt 5.10 or above. 7ed03e6 OSInfo: ignore deprecation warnings for Gestalt. da3222d qmake/compiler.pri: target macOS 10.8 when building against Qt 5.10 or above. 2017-12-02 Davide Beatrici 742a5d9 Merge PR #3276: GlobalShortcut_win: fix std::/boost:: confusion in comment. Mikkel Krautz 53912f6 GlobalShortcut_win: fix std::/boost:: confusion in comment. 2017-11-30 Davide Beatrici 6bfd039 Merge PR #3272: ManualPlugin.cpp: "MublePluginQt" -> "MumblePluginQt" 2017-11-29 Davide Beatrici 60d18cd ManualPlugin.cpp: "MublePluginQt" -> "MumblePluginQt" 2017-11-26 Mikkel Krautz 3125439 Merge PR #3168: Log: remove support for external images. 24e437c Merge PR #3230: overlay_gl: linux: only assume absolute dynamic entries on glibc. 2d89506 Merge PR #3270: Assorted MinGW fixes b65b55c mumble.pro: add correct Boost libraries to LIBS, now that we use boost_thread in GlobalShortcut_win. fa981e5 os_early_win: make compat_layer_env const to avoid GCC writable strings error. ba2a202 os_early_win: use 0 instead of NULL for ulOptions DWORD parameter in RegOpenKeyEx. e91f282 GlobalShortcut_win: use boost::future/boost::promise instead of std:: variants for better MinGW compatibility. 48f3eb9 Merge PR #3268: Fix SRV port bugs in ServerResolver and ConnectDialog 7acf687 ConnectDialog: use port from ServerResolverRecord instead of original port from ServerResolver::port(). 04a8a5d ServerResolver: fix bug where ServerResolver_qt5 would always pass on the original port given to the resolver. 2017-11-19 Davide Beatrici fba1d65 Merge PR #3262: Plugins: Determine correct pointer size automatically, without the need of specific headers and variables 2a51c7b Accomplish changes in all the plugins f397c40 Replace legacy header with the new one 7286fb0 Determine correct pointer size automatically, without the need of specific headers and variables 2017-11-13 Davide Beatrici 8bf71ba Merge PR #3264: Ignore "target_wrapper.sh", ".directory" and all files with ".Debug" and ".Release" extensions 2017-11-12 Davide Beatrici ea08127 Ignore "target_wrapper.sh", ".directory" and all files with ".Debug" and ".Release" extensions 2017-11-11 Davide Beatrici 3eae0dc Merge PR #3182: Allow Prefilling Add Server Dialog With HTTP URLs Jan Klass d25feb7 Update theme submodule for changes of PR #3182 2a4413e Do not update fill suggestion on clipboard changes 2017-10-28 Davide Beatrici 894ade2 Merge PR #3257: ServerHandler.cpp: Remove "Qt::QueuedConnection" attribute for connection between "readyRead()" and "udpReady()" 1121ef9 ServerHandler.cpp: Remove "Qt::QueuedConnection" attribute for connection between "readyRead()" and "udpReady()" 2017-10-22 Stefan Hacker 12de49e Switch client DB to sqlite synchronization mode NORMAL 2017-10-17 Davide Beatrici d2943a5 Merge PR #3250: Fixed crashing on disconnect 04c0578 Merge PR #3252: Check ClientUser pointer before dereference pchk c45957d Fixed crashing on disconnect 86f7815 Check ClientUser pointer before dereference 2017-10-15 Jan Klass a8d8c13 Merge PR #3249: Fix travis OSX build ed06886 Fix travis OSX build e03989e Merge PR #3240: Fix travis osx build; Add Ice 3.7 support 2017-10-02 Jan Klass 264d1ed Replace obsolete Ice statements for Ice >= 3.7 387fc01 Fix Travis OSX build - add keg slice subpath 2017-09-03 Matthias von Faber 2903f3b overlay_gl: linux: only assume absolute dynamic entries on glibc. 2017-08-24 Alexis Jeandeau ba6d829 MurmurGRPCImpl.cpp: fix typo Davide Beatrici f2cbebd Merge PR #3227: MurmurGRPCImpl.cpp: fix typo 2017-08-19 Jan Klass c33f5de Fix code formatting 2017-08-12 Mikkel Krautz 13bad23 Merge PR #3222: GlobalShortcutWin: fall back to 'Unknown' for unknown DirectInput buttons. 9ff8232 GlobalShortcutWin: fall back to 'Unknown' for unknown DirectInput buttons. 9709ed8 ConnectDialogEdit: layout updates. 2017-08-07 Jan Klass cea7064 ConnectDialog: Show fill suggestion for current server 2758a7c ConnectDialog: Try to disable vertical resizability 2f609a2 ConnectDialog: Update prefill-ability notice on clipboard changes 0298ac4 ConnectDialog: Handle HTTP URLs from clipboard Mikkel Krautz d196a4b Merge PR #3219: mumble.pri: make SOURCES and HEADERS multiline. 923d649 Merge PR #3184: murmur/Cert: remove auto-generation of Diffie-Hellman parameters. 9550487 Merge PR #3185: Allow users to specify RFC 7919 Diffie-Hellman parameters for the sslDHParams murmur.ini option 807869b Merge PR #3208: GlobalShortcutWin, MumbleApplication: add suppression support for injected Windows keyboard/mouse message events. 2017-08-06 Jan Klass 90bf3f9 ConnectDialog: Move ConnectDialogEdit prefill logic into separate constructor 571c84f ConnectDialog: Move default server name logic to fromMimeData dc01f27 ConnectDialog: Separate fromMimeData and fromUrl f6d25e5 ConnectDialog: Describe parsing of windows URL shortcut files c28a0f7 ConnectDialog: Add missing password label buddy Mikkel Krautz 1ea4b92 Meta: fix error message shown when using sslDHParams option with Qt without DH support. b22f9c3 GlobalShortcutWin, MumbleApplication: add suppression support for injected Windows keyboard/mouse message events. 2a84ae6 Meta: make sslDHParams errors fatal instead of critical. 7b4535c Meta: improve error message when sslDHParams contains unknown named group. 7d83448 FFDHE: add NamedGroups method for getting a list of supported named groups. 1178f64 scripts/murmur.ini: update default murmur.ini to reflect new FFDHE feature. 4098109 Meta: use @ffdhe2048 as default value for sslDHParams. 5b3190e Meta: implement support for named DH parameters for sslDHParams option. b505857 mumble.pri: make SOURCES and HEADERS multiline. 5db1fa4 Merge PR #3218: Remove DIST directive from all .pro files. 828d930 Remove DIST directive from all .pro files. ec254df Merge PR #3217: GlobalShortcut: fix typo in What's This for 'Enable shortcuts in privileged applications' 4e1df3b GlobalShortcut: fix typo in What's This for 'Enable shortcuts in privileged applications' 52ad772 Merge PR #3207: GlobalShortcutWin, MumbleApplication: inject native WM_* keyboard and mouse messages into GlobalShortcutWin. cce4851 Merge PR #3214: Add greek translation for installer 4411059 Merge PR #3213: Fix indentation and spacing in pro files thalieht 608028b Add greek translation for installer 2017-08-05 Jan Klass 23e7638 Fix assignment spacing in pro files 27a983d Fix indentation in pro files Mikkel Krautz a3f0eb6 Merge PR #3212: Allow users to disable UIAccess via Additional Shortcut Engines setting. 805985d GlobalShortcut: add UI to allow users to opt-out of UIAccess. 4bdf673 os_early_win: implement ability to disable UIAccess via config option. 64a1cb3 os_early: a new mechanism for running OS-specific tasks immediately upon entering main(). cfb7df4 Settings: add 'shortcut/windows/uiaccess/enable' setting. 2017-08-03 Giovanni Harting <539@idlegandalf.com> 39f861e fixed major version extraction 0452789 refined version checking logic a8e2f93 added include path for ice 3.7, added logic for removed IceUtils lib Mikkel Krautz f90ab07 Merge PR #3211: [BUILD] ZeroC Ice 3.7 compatibility 2017-08-01 Mikkel Krautz a0ddf8e GlobalShortcut_win: only allow injection of native keyboard/mouse messages if Windows hooks are enabled. 2017-07-30 Mikkel Krautz bfb74a6 MumbleApplication: forward native Windows mouse/keyboard events from nativeEventFilter/winEventFilter into GlobalShortcutWin. 4f0a748 GlobalShortcutWin: implement public API for injecting native Windows keyboard/mouse events. e4f7256 GlobalShortcutWin: handle incoming InjectKeyboardMessageEvent and InjectMouseMessageEvent events. 22d6396 GlobalShortcutWin: implement InjectKeyboardMessageEvent and InjectMouseMessageEvent QEvents. 1648741 GlobalShortcutWin: refactor HookKeyboard and HookMouse callbacks into functions. 567f33a GlobalShortcutWin: add comment about button indexes in HookMouse(). 4f87be8 Merge PR #3204: GlobalShortcutWin: remove code related to the in-overlay Mumble client. 2017-07-29 Mikkel Krautz e336368 GlobalShortcut, GlobalShortcutWin: MumbleApplication: remove GlobalShortcut::prepareInput(). 4bf0355 GlobalShortcutWin: remove code related to the in-overlay Mumble client. 36cb960 Merge PR #3183: FFDHE: add new class for accessing RFC 7919 Diffie-Hellman parameters. 2017-07-28 Mikkel Krautz d993b83 FFDHE: new class for accessing RFC 7919 FFDHE parameters. a590ad9 scripts: add generate-ffdhe.py for generating FFDHETable.h. 5aaf1ed Merge PR #3199: src/murmur: remove CONFIG(ermine), use CONFIG(buildenv) instead. 4566f09 Merge PR #3198: ConnectDialog: re-arrange lookedUp() code to avoid recursive runloop problem. 2724ff5 Merge PR #3201: MurmurGRPCImpl.h: declare variable for QMutexLocker in RPCSingleStreamCall class. 2017-07-24 Davide Beatrici ec61c2b Merge PR #3202: scripts/murmur.ini: fix minor typo in gRPC comment. Mikkel Krautz f3aed2a src/murmur: remove CONFIG(ermine), use CONFIG(buildenv) instead. f47562b scripts/murmur.ini: fix minor typo in gRPC comment. daca82c MurmurGRPCImpl.h: declare variable for QMutexLocker in RPCSingleStreamCall class. 2017-07-23 Mikkel Krautz ac9fa64 Merge PR #3195: Update AUTHORS and src/licenses.h. af0b2ec Merge PR #3196: Merge murmur.grpc.ini and murmur.ini bb4b36d ConnectDialog: re-arrange lookedUp() code to avoid recursive runloop problem. c0be50a Make Murmur warn if any of the grpc options are set, but the binary is built without gRPC support. 863cb3b scripts: remove gRPC-specific murmur.ini. 899e1f4 src/licenses.h: re-run scripts/mklic.pl with new AUTHORS file. e354493 AUTHORS: update via scripts/generate-AUTHORS.py. 2017-07-20 Mikkel Krautz 38c525e Merge PR #3190: GlobalShortcut_win: delete poll timer inside the GlobalShortcut thread. 14ac2b3 Merge PR #3188: Overlay_win: properly terminate our overlay helper processes. 00e1cfc GlobalShortcut_win: delete poll timer inside the GlobalShortcut thread. 3ea9f08 Overlay_win: properly terminate our overlay helper processes. 2017-07-19 Mikkel Krautz 3ee0728 installer: revert "installer: force uninstall before install." bed5763 murmur/Cert: remove auto-generation of Diffie-Hellman parameters. 2017-07-17 Mikkel Krautz 5b82a7a Merge PR #3174: SSL: register OpenSSL threading callbacks when we can't access Qt's OpenSSL. 80916fd Merge PR #3181: .gitmodules: always use our own submodule repos on GitHub. a642894 .gitmodules: always use our own submodule repos on GitHub. f6fb4d8 src/tests: add TestSSLLocks test for testing our OpenSSL locking implementation. 6892c8b src/tests: update tests to initialize and destroy the MumbleSSL module to ensure OpenSSL is properly initialized. 72e0a78 SSL: register OpenSSL threading callbacks when we can't access Qt's OpenSSL. f041bdb SSL: add destroy() function to the SSL module. 2017-07-16 Davide Beatrici 6f434d3 Merge PR #3179: UserListModel.cpp: "id" -> "ID" 5564901 Merge PR #3178: Log.cpp: "ftp" -> "FTP" Allan Nordhøy d001702 ID 12b0a16 FTP 2017-07-15 Mikkel Krautz 6770eac Merge PR #3176: SelfSignedCertificate: add missing newline to SelfSignedCertificate.cpp. b5c17b8 SelfSignedCertificate: add missing newline to SelfSignedCertificate.cpp. 38e647f Merge PR #3173: scripts/mkini-win32.bat: perform LF -> CRLF conversion. 2017-07-14 Jan Klass d817937 Merge PR #3171: SelfSignedCertificate: new class for creation of self-signed certificates. 9d4691c Merge PR #3172: ServerResolver: treat SRV lookups that return NOERROR but no records as errors. d6e327d Merge PR #3166: TestServerResolver: add CNAME test. Mikkel Krautz c2a3e2f scripts/mkini-win32.bat: perform LF -> CRLF conversion. 7578e85 Settings: remove iMaxImageSize and deprecate 'net/maximagesize'. cf93bd6 NetworkConfig: remove 'disable image download' option from the UI. 119bb5c Log: remove support for external images. a69668a SelfSignedCertificate: new class for creation of self-signed certificates. 2017-07-13 Jan Klass e79ca50 Merge PR #3169: Settings: add DEPRECATED macro for keeping old, reserved names around. 5357472 Merge PR #3167: Log: remove dead m_valid code from LogDocument. 65bb0e6 Make use of Qt5 QSignalSpy::wait to make tests succeed earlier d3938c1 Fix #3162: Travis builds could fail with timeout 36fc0f1 overlay: Use size_t as correct type for memory addresses 7689647 Remove type variable prefix Mikkel Krautz 350ad28 TestServerResolver: add CNAME test. a318787 Merge PR #3170: Fix #3162: Travis builds could fail with timeout ea5c038 Merge PR #3160: overlay: Use SIZE_T as correct type for memory addresses 2bd0b7e ServerResolver: treat SRV lookups that return NOERROR but no records as errors. 8acdb95 Settings: add DEPRECATED macro for keeping old, reserved names around. 708821d Log: remove dead m_valid code from LogDocument. 2017-07-12 Jan Klass 49b80d8 Merge PR #3165: Translation update 911f957 Merge PR #3164: ServerHandler: avoid leaking ServerResolver in ::run(). Mikkel Krautz f7b7cf4 Translation update 37b84ed ServerHandler: avoid leaking ServerResolver in ::run(). 2017-07-11 Jan Klass ce864c7 Cast to correct API types Mikkel Krautz 9a2fa24 Merge PR #3161: Cast to correct API types 2017-07-09 Mikkel Krautz fcb367f Merge PR #3157: Log: remove the notion of an invalid LogDocument. ab783c7 Log: remove the notion of an invalid LogDocument. a4e859e Merge PR #3156: Add toggle to lock layout when in custom layout mode 2017-07-08 Davide Beatrici 6cd17bd Merge PR #3154: ServerHandler: ensure only a single connection timeout timer is active at one time. Max Weber e72a22f Add toggle to lock layout when in custom layout mode Mikkel Krautz ffc8bf1 ServerHandler: ensure only a single connection timeout timer is active at one time. 2017-07-07 Mikkel Krautz c93b087 Merge PR #3152: ServerHandler: fix broken hostname validation. ae392dc ServerHandler: fix broken hostname validation. 2017-07-06 Davide Beatrici 90777a9 ServerAddress.cpp: Fix ServerAddress ports comparison typo 2b3d75c TestServerAddress.pro: HostAddresss.h -> HostAddress.h Davide Beatrici 176c041 Merge PR #3150: ServerAddress.cpp: Fix ServerAddress ports comparison typo 8275f77 Merge PR #3149: TestServerAddress.pro: HostAddresss.h -> HostAddress.h Mikkel Krautz 3fcd786 Merge PR #3151: ServerHandler: add missing return for hostname lookup failure case. 7f8b2d3 ServerHandler: add missing return for hostname lookup failure case. cada677 Merge PR #3148: Update Opus to v1.2.1 2017-07-04 Davide Beatrici e4bcede Update Opus to v1.2.1 James Fraser eba7466 Make comparison case-insensitive in ConnectDialog.cpp Mikkel Krautz 455ab19 Merge PR #3147: Make comparison case-insensitive in ConnectDialog.cpp 2017-06-23 Davide Beatrici 8029f3f Merge PR #3140: Transifex translation update 2017-06-16 Davide Beatrici ae6e08c Merge PR #3133: Transifex translation update 2017-06-11 Mikkel Krautz e913a44 Merge PR #3127: Implement new hostname resolving infrastructure 2017-06-10 Mikkel Krautz 8f8aa1a ServerHandler: integrate ServerResolver. edd95a8 ServerHandler: transform run() to a do-while loop in preparation of server fallback in SRV. 5976158 ServerHandler: manually perform the TLS handshake. 23b2c52 ServerHandler: use qsHostName as the hostname for the TLS handshake. 9560c23 ServerHandler: ensure pings are only sent when in the Connected state. d88fb6c ServerHandler: make qtsSock a member variable. d238eaf ConnectDialog: update the connect dialog to use ServerResolver for hostname lookups. 8068772 TestServerResolver: make the test Qt 4 compatible. 75a4008 TestServerResolver: modify test to work on systems that do not support both IPv4 and IPv6. ea7af99 ServerResolver: add new class for hostname resolving (including SRV support). 67838db ConnectDialog, Database: use UnresolvedServerAddress type for the ping cache. b1d901b ConnectDialog: use ServerAddress for address list in ServerItem, and for qhDNSCache. f2ee244a ConnectDialog: use ServerAddress instead of QPair-based qpAddress type. 332c371 ServerAddress: new struct for containing a HostAddress along with a port number. ac34059 UnresolvedServerAddress: add new struct for holding an unresolved hostname/port pair. 2017-06-08 Antonio Larrosa 9fa4922 Initialize siInfo.format Mikkel Krautz d472e06 Merge PR #3125: Initialize siInfo.format 2017-06-07 Mikkel Krautz a0eba81 Merge PR #3123: Transifex translation update 2017-06-04 Mikkel Krautz d66eeeb Merge PR #3118: WASAPI, Settings: expose 'wasapi/role' setting to allow users to set WASAPI role. 2018934 WASAPI, Settings: expose 'wasapi/role' setting to allow users to set WASAPI role. 2017-06-03 Mikkel Krautz 4de645c Merge PR #3114: mumble_exe: fix typo and simplify comment about LoadLibraryEx bug. cff7ce7 mumble_exe: fix typo and simplify comment about LoadLibraryEx bug. d3bacc5 Merge PR #3113: mumble_exe: document LoadLibraryEx workaround for mumble-voip/mumble#2837. 8ba982f mumble_exe: document LoadLibraryEx workaround for mumble-voip/mumble#2837. 2017-06-01 Davide Beatrici d0db59b Remove unnecessary "-ldl" library from Mumble and Murmur project files Davide Beatrici 7c77b8c Merge PR #3111: Remove unnecessary "-ldl" library from Mumble and Murmur project files 9ef302e Merge PR #3110: Transifex translation update Mikkel Krautz 13bc12d Merge PR #3109: SSL: remove multi-OpenSSL sanity check. f544524 SSL: remove qsslSanityCheck. dff1557 SSL: also initialize Mumble's copy of libssl/libcrypto. 2017-05-31 Mikkel Krautz 30a9176 Merge PR #3107: murmur.ini: Remove extra whitespaces d1baf4f Merge PR #3037: Replacing grayed out with closed mouth icon 2017-05-30 concatime 908e17d Update murmur.ini 2017-05-25 Mikkel Krautz 3754898 Merge PR #3099: src/tests: make TestTimer's resolution test more VM friendly. 389d82b src/tests: make TestTimer's resolution test more VM friendly. 2017-05-23 Mikkel Krautz 4481729 Merge PR #3098: AudioInput, Settings: add 'audio/inputchannelmask' setting for selecting which mic channels should be mixed. 2017-05-21 Jan Klass 5205818 Merge PR #3083: Move RichTextEditor XML tool methods into separate class and add Tests 41dbb4b Add XMLTools tests 2b62693 Add mumble and murmur paths to VPATH 7d081f7 Improve method documentation 367fba9 Move XML functions into separate class 2017-05-20 Jan Klass d8f7800 Make use of EnvUtils::setenv f7657b5 Make use of EnvUtils in murmur Mikkel Krautz a6cae4f Merge PR #3056: Make EnvUtils available to murmur, implement setenv 03de498 AudioInput, Settings: add 'audio/inputchannelmask' setting for selecting which mic channels should be mixed. 3399a50 Implement EnvUtils::setenv d783c09 EnvUtils: fix documentation comment in header. b8c70b7 EnvUtils: convert EnvUtils to use local 8-bit instead of UTF-8. 2017-05-15 Mikkel Krautz a7c8344 Merge PR #3095: murmur/Cert: OPENSSL_VERSION -> OPENSSL_VERSION_NUMBER. cbeed58 murmur/Cert: OPENSSL_VERSION -> OPENSSL_VERSION_NUMBER. 2017-05-14 Mikkel Krautz dde8173 Merge PR #3093: OpenSSL include fixes 7e10fc2 murmur_pch: include . 7be4861 murmur_pch: explicitly include . 449c797 Merge PR #3059: Recompress png files and ico files 5c9a46e Merge PR #3068: Added a "Undo Idle action upon activity" setting. 2017-05-13 Mikkel Krautz 10511de Merge PR #3091: src/tests: remove fragile TestTimer tests. 2017-05-12 Mikkel Krautz a221dee src/tests: remove fragile TestTimer tests. 2017-05-11 Jan Klass c7d5d5a Fix #3021: Update cert wizard introductory text Mikkel Krautz 97c34f4 Merge PR #3084: Fix #3021: Update cert wizard introductory text 6aba984 Merge PR #3080: murmur/Cert: check for 'Murmur Autogenerated Certificate' prefix instead of explicit version in self-signed cert check. 50c94b0 Merge PR #3086: Fix #3085: Display correct, new icon 80602a3 Merge PR #3088: add trailing ellipses to each main window action text that open a window or dialog 576c017 Merge PR #3089: Transifex translation update 2017-05-10 Jan Klass ebf3b38 Fix #3085: Display correct, new icon Tim Cooper 60a0d3b add trailing ellipses to each main window action text that open a window or dialog 2017-05-09 Jan Klass 650e8f0 Merge PR #3082: Transifex translation update 2017-05-08 Andrew Johnson 48c2cc3 Added a "Undo Idle action upon activity" setting. Mikkel Krautz 3160fc9 murmur/Cert: check for 'Murmur Autogenerated Certificate' prefix instead of explicit version in self-signed cert check. d3470c3 Merge PR #3071: TextToSpeech_unix: lazy initialize speech-dispatcher. c0c5ba7 Merge PR #3076: Use RSA_generate_key_ex instead of RSA_generate_key for generating Murmur's self-signed certificate. b928c04 Merge PR #3078: main: fix typo in RPC help output: stauts -> status. 3c25873 main: fix typo in RPC help output: stauts -> status. 46fb405 Merge PR #3077: plugins/bf1: update plugin to work with version 1.0.49.52296 2017-05-07 Davide Beatrici 75c4de8 plugins/bf1: update plugin to work with version 1.0.49.52296 Davide Beatrici ffa3be9 Merge PR #3067: plugins/bf2: extend identity with in-game VoiP state and selected squad Mikkel Krautz a6aba12 Merge PR #3066: SocketRPC: ensure pipe paths match up. 44687d5 TextToSpeech_unix: make setVolume not initialize speech-dispatcher. bf7ce38 TextToSpeech_unix: lazily initialize speech-dispatcher. 0d08ab3 selfSignedServerCert_SHA1_RSA_2048: use RSA_generate_key_ex(). f0b33c4 murmur/Cert: improve error handling in the add_ext() function. 70da3ba selfSignedServerCert_SHA1_RSA_2048: add error handling. 3210091 selfSignedServerCert_SHA1_RSA_2048: refactor variable declarations. e7c2787 selfSignedServerCert_SHA1_RSA_2048: nullify output variables on failure. 402596b murmur/Cert: move self-signed server certificate generation to its own function. 81b00bf Merge PR #3072: Murmur: fix warning about unused mumble_BN_GENCB_new/mumble_BN_GENCB_free. 2017-05-06 Flumble b47bfc8 Add `target_squad_id` and `ipport` to identity Mikkel Krautz 2a08974 Murmur: fix warning about unused mumble_BN_GENCB_new/mumble_BN_GENCB_free. 2017-05-05 Flumble aa87489 add VoiP state to Battlefield 2 identity 2017-05-04 Kyle Wickens 3705494 FIXED: RPC calls to run on a Raspberry Pi Mikkel Krautz 0cffca1 Merge PR #3062: Use BN_GENCB_new() and BN_GENCB_free() where applicable. 2017-05-02 Mikkel Krautz 4dabb1b Use BN_GENCB_new() and BN_GENCB_free() where applicable. 2017-04-30 Shen-Ta Hsieh 7c059d9 Recompress png files and ico files 2017-04-29 Jan Klass a535810 Make EnvUtils available to Murmur 5a5a3b2 Merge PR #3054: Fix issues identified by PVS-Studio 1f302ad Remove wrong assert 2017-04-28 Jan Klass a8a8236 Simplify returns Svyatoslav 2a38c88 Checking with PVS-Studio static analyser. 2017-04-26 Jan Klass 5489564 Merge PR #3051: Fix Some Issues, Improve Code quality Mikkel Krautz 948331e Merge PR #3050: man: update murmurd.1 to mention SIGHUP and SIGUSR1. 2017-04-25 Jan Klass ce4e3cf Check env-var function return values for errors 89b1ec2 Add comment for workaround from/as in mumble/main.cpp 830ea8a Initialize pointers in constructor 386112e Reduce variable scope c9d6d91 Check for null before pointer use 17c7ee0 Check for error on winapi calls 03d11d4 Use readable hex version constant for checks f814cc5 Use constants instead of magic numbers 248859c Merge PR #3049: overlay: add LaunchPad.exe (Daybreak Games's launcher) to the launcher list. 2017-04-24 Mikkel Krautz 6749835 man: update murmurd.1 to mention SIGHUP and SIGUSR1. 425a994 overlay: add LaunchPad.exe (Daybreak Games's launcher) to the launcher list. 2017-04-23 Jan Klass 2968a92 Merge PR #3001: Accept File And Folder Drops In Overlay Exceptions 1464873 Merge PR #3046: Add itch.exe as known overlay launcher ee44430 Add itch.exe as known overlay launcher Mikkel Krautz a902dec Merge PR #3045: Transifex translation update 2017-04-22 Jan Klass f2362cb Code formatting 203a6a8 Use PathListWidget for Overlay exception lists edcdc4d Add PathListWidget with drop functionality Mikkel Krautz 8f65051 Merge PR #3044: overlay: remove ability for overlay to decline being attached to a process. 557eacd overlay: remove ability for overlay to decline being attached to a process. 2017-04-21 lewisca04 5669cf1 Added fix for murmur check for MySQL, SQLite, and Postgres Mikkel Krautz 65c2500 Merge PR #3039: Updating ServerDB.cpp to check for MySQL, SQLite, and Postgres 2017-04-20 Jan Klass b7cb6be Move code into method addWhitelistPath 8ac5db2 Move OverlayAppInfo (creation) logic into OverlayAppInfo 2017-04-19 Davide Beatrici a935808 Merge PR #3040: Update BF2142 plugin, adding identity support Flumble c92b599 Update BF2142 plugin, adding identity support 2017-04-18 Jan Klass 4d005f0 Merge PR #3038: Fix "Enable XInput" What's This text formatting cfc2bab Fix "Enable XInput" What's This text formatting mray c582bde Replacing grayed out with closed mouth icon 2017-04-17 Mikkel Krautz 9e834cb Merge PR #3033: qmake/compiler.pri: add CONFIG(dpkg-buildflags). e3460f6 qmake/compiler.pri: add CONFIG(dpkg-buildflags). 2017-04-16 Mikkel Krautz eb63d0b Merge PR #3025: MainWindow: only perform changeEvent's hide-in-tray logic if there is a system tray available. 2017-04-15 Mikkel Krautz 224d0f3 MainWindow: only perform changeEvent's hide-in-tray logic if there is a system tray available. 2017-04-14 Mikkel Krautz 46462cd Merge PR #3020: Cert: use classic wizard style for the Certificate Wizard. 4e430f7 Merge PR #3015: Do not include OS in HTTP user agent depending on privacy setting 2fe1fb1 Cert: use classic wizard style for the Certificate Wizard. 2017-04-12 Piratonym 710aa60 Do not include OS in HTTP user agent depending on privacy setting 2017-04-10 Mikkel Krautz eca5d03 Merge PR #3008: Net: split Net.cpp/Net.h into multiple files 4e635cc Merge PR #3016: Transifex translation update 5bfd665 Net: refactor Ban class to its own set of files. 5ede036 Net: refactor HostAddress class to its own set of files. 2017-04-09 Mikkel Krautz c01ff8c Net: refactor SWAP64 macro into its own header, ByteSwap.h. 65909b8 Merge PR #3009: Add option to hide OS information from server ("privacy mode") d4c8abd Merge PR #3013: AppVeyor: add no-pch build for x86_64 MSVC. 11b5c28 Merge PR #3014: .travis.yml: add no-pch build for Linux/Qt 4. 67653f5 AppVeyor: add no-pch build for x86_64 MSVC. fc1af7a Merge PR #3012: scripts/appveyor: fix comment about signing/UIAccess in appveyor-build.ps1. a25d5f4 .travis.yml: add no-pch build for Linux/Qt 4. 1b2b642 Merge PR #3011: Fix CONFIG(no-pch) build on MSVC. f0a2ac8 scripts/appveyor: fix comment about signing/UIAccess in appveyor-build.ps1. dfc0c39 WinGUIDs: include wtypes.h in WinGUIDs to fix no-pch build. d921262 DirectSound: move includes to implementation file to fix moc in CONFIG(no-pch). 27189b6 Merge PR #3010: MainWindow: Don't open tooltips when not active db4a591 Merge PR #3007: Fix local volume dialog default size Piratonym d0e2cdc Add option to hide OS information from server 2017-04-08 Jan Klass a3f85fe Fix local volume dialog default size Max Weber 9e7fd2e MainWindow: Don't open tooltips when not active Mikkel Krautz cc30e71 Merge PR #3006: TestTimer: refactor some tests to provide more useful log output bd6a466 Merge PR #2981: Resolve code issues b54166b Merge PR #3002: Update description of configuring lib paths 2a7a87f TestTimer: add delta64 function and use it for delta calculations. da53f52 TestTimer: add logging to atomicity test. 55b7b49 TestTimer: refator accuracy test and add logging. bf9ea60 Merge PR #3005: Add new path for winpaths_custom.pri (in qmake/) to gitignore. c3ae569 Add new path for winpaths_custom.pri (in qmake/) to gitignore. 5424496 Merge PR #3004: Fix #2683 2017-04-07 Davide Beatrici 9f77740 plugins/bf1: update plugin to work with version 1.0.49.28890 Jan Klass 7c8a364 Drop redundant if condition in else case 5cd4b09 Initialize variables in constructor fdc1fe1 Update description of configuring lib paths Max Weber 56151bb Just use text color Mikkel Krautz 50540fd Merge PR #3003: plugins/bf1: update plugin to work with version 1.0.49.28890 2017-04-06 Davide Beatrici f56074b plugins/bf4: update plugin to work with version 1.8.2.48475 Jan Klass 79dd6b9 Discard duplicate path exceptions Mikkel Krautz e7e6197 Merge PR #2999: plugins/bf4: update plugin to work with version 1.8.2.48475 2017-04-05 Jan Klass 7073b3a Drop Speex from README Mikkel Krautz a69916b Merge PR #2995: Drop Speex from README 2017-04-02 Mikkel Krautz 2a9fa47 Merge PR #2994: MainWindow: avoid floor/ceil in VolumeUp/VolumeDown global shortcut handlers. 9fa4c56 MainWindow: avoid floor/ceil in VolumeUp/VolumeDown global shortcut handlers. 2017-04-01 Mikkel Krautz f8072e8 Merge PR #2988: Re-run generate-cipherinfo.py to regenerate SSLCipherInfoTable.h 4f8ea24 Merge PR #2990: TestTimer: make resolution test independent of QTime. 7b11430 TestTimer: make resolution test independent of QTime. 502cfc4 Update SSLCipherInfoTable.h via scripts/generate-cipherinfo.py. 16dc758 scripts/generate-cipherinfo.py: ensure output is consistently sorted. 62107aa Convert existing SSLCipherInfoTable.h to Unix-style line endings. 5bbf313 scripts/generate-cipherinfo.py: use correct script name in comment. 4a63973 scripts/generate-cipherinfo.py: add DH_RSA and DH_DSS key exchanges. 15d18ee Merge PR #2985: overlay: treat launchers as implicitly blacklisted programs. 2017-03-30 Mikkel Krautz a9bdde0 overlay: treat launchers as implicitly blacklisted programs. fc13fd1 Merge PR #2987: ACLEditor: fix tooltip for channel sort order. 2017-03-29 Mikkel Krautz dc05de7 ACLEditor: fix tooltip for channel sort order. b2455f2 Merge PR #2950: travis-ci: add macOS target. 5db8665 travis-ci: add macOS target. 8dd4b10 Merge PR #2984: murmur_ice: various fixes in preparation of macOS Travis-CI PR e0048d8 murmur_ice: accommodate Homebrew slice path in macx block 68718fd murmur_ice: use MUMBLE_ICE_PREFIX in murmur_ice for macx e97adf7 Merge PR #2983: Simplify delta calculation in TestTimer.cpp 2017-03-28 Davide Beatrici 2244414 overlay: add GTAVLauncher.exe to the default launcher-filter program blacklist. e878332 overlay_blacklist.h: Add missing comma Mikkel Krautz 375ca92 Simplify delta calculation in TestTimer.cpp b47b1da Merge PR #2975: Overlay_macx: fix code to work with removal of OverlaySettings::bUseWhitelist. fdd837c Merge PR #2980: tests: depend on OpenSSL in test.pri instead of each individual test. 7a17c68 Overlay_macx: fix code to work with removal of OverlaySettings::bUseWhitelist. b7ad9d6 Merge PR #2982: overlay: add GTAVLauncher.exe to the default launcher-filter program blacklist. 57b3aa6 tests: depend on OpenSSL in test.pri instead of each individual test. 2017-03-27 Davide Beatrici bd29b6a plugins/gtav: update plugin to work with version 1.38 (Retail) Mikkel Krautz 888df45 Merge PR #2979: TestPacketDataStream: use UTF-8 instead of Latin1. dcc6689 TestPacketDataStream: use UTF-8 instead of Latin1. 234cbdd Merge PR #2977: plugins/gtav: update plugin to work with version 1.38 (Retail) 2017-03-26 Mikkel Krautz 19ecc86 Merge PR #2974: Introduce protobuf.pri helper for depending on protobuf a358d0d mumble_proto: use protobuf.pri. 0500a42 mumble.pri: use protobuf.pri. 029f0b8 qmake/protobuf.pri: new file to include in .pro files for depending on protobuf. 623d2af Merge PR #2973: overlay: add gw2-64.exe to the default launcher-filter program whitelist. 0a497b0 overlay: add gw2-64.exe to the default launcher-filter program whitelist. b1b3d4f Merge PR #2920: Add overlay launcher filter 2017-03-25 Mikkel Krautz cb5e34f Merge PR #2971: Update AUTHORS file (2017-03-25) e84915d AUTHORS: update. 0dfa304 .mailmap: add new hacst mail. 45ad52f Merge PR #2970: .mailmap: add dark_skeleton's preferred author line. ccbcb0b .mailmap: add dark_skeleton's preferred author line. 2017-03-24 Mikkel Krautz efd6361 Merge PR #2788: Document workaround in LogTextBrowser a27fbb7 Merge PR #2969: Log_macx: disable Growl fallback on Qt >= 5.8. e51edae Log_macx: disable Growl fallback on Qt >= 5.8. 2017-03-22 Davide Beatrici a1a1ff1 3rdparty/opus-build: remove unnecessary shared library handling for macOS Mikkel Krautz 282d672 Merge PR #2966: 3rdparty/opus-build: remove unnecessary shared library handling for macOS 0962523 Merge PR #2963: Transifex translation update 2017-03-19 Mikkel Krautz 8d4d5f0 overlay: hook up new excludecheck-based overlay exclusion check. 58c208c overlay: implement new overlay exclusion logic in excludecheck.cpp/excludecheck.h. 151bc49 overlay: re-introduce checks for 'debugoverlay' and 'nooverlay'. de6e9ec overlay: move procname parsing to separate function. 2f07778 overlay: allow overlay to decline being attached to a process. bffd2ec overlay: remove legacy overlay exclusion code. d30ab5b overlay: refactor bBlacklisted into bEnableOverlay. 35c7d13 overlay: add olsettings.cpp/olsettings.h, accessors for launcher overlay settings. be43c91 overlay: add ancestor.cpp/.h, utilities for getting process ancestor info. 88bfbbb overlay: add util.h with vector/string/path utilities. 06b646d OverlayConfig: add UI for configuring the launcher filter. be70cee Settings: add overlay launcher filter settings. 3cf2801 overlay: update overlay_blacklist.h. ab298d8 overlay: add overlay_launchers.h and overlay_whitelist.h. e414bd3 Merge PR #2958: Fix no-pch build and add a no-pch configuration to Travis CI f31bbf3 Merge PR #2959: scripts/rcc-depends.py: fall back to using the absolute path when os.path.relpath() fails on Windows. b6c6b18 Meta: add QSslCipher header to fix no-pch build. 8ec4775 travis-ci: add a no-pch build to the Travis matrix. ac674d9 scripts/rcc-depends.py: fall back to using the absolute path when os.path.relpath() fails on Windows. 2017-03-18 Davide Beatrici 942ba6d travis-ci: Remove unneeded "winpaths_custom" CONFIG option d19fdd5 plugins/gtav: update plugin to work with version 1.38 (Steam) Mikkel Krautz 3313f9b Merge PR #2956: MurmurIce: fix signed/unsigned comparison between string size and std::numeric_limits. c84af26 Merge PR #2955: qmake/compiler.pri: fix value of MUMBLE_ARCH on Qt 5. 37269b1 Merge PR #2954: travis-ci: Remove unneeded "winpaths_custom" CONFIG option a58815c qmake/compiler.pri: fix value of MUMBLE_ARCH on Qt 5. 8728ea7 MurmurIce: fix signed/unsigned comparison between string size and std::numeric_limits. 69defe5 Merge PR #2953: plugins/gtav: update plugin to work with version 1.38 (Steam) 2017-03-17 Davide Beatrici cb1c1b4 WinGUIDs.cpp: Fix missing symbol linker error b674036 compiler.pri: Use the Unix block for win32-g++ too 19c4f9f Move "getenvQString()" function to a dedicated header and rename it ad0a3c5 Move Windows GUID initialization to WinGUIDS.cpp file. 42134a1 mumble.pro: Fix "avrt" library linkage 2c045c8 Timer.cpp: Fix missing Boost symbol for MinGW e07240e WASAPI.cpp: Fix cross-initialization problem 3f8919e WASAPI.cpp: Manually define GUIDs a913a33 os_win.cpp: Use the "delayHook()" function only with MSVC d01994d DirectSound.cpp: Replace "LPDIRECTSOUNDNOTIFY8" with "LPDIRECTSOUNDNOTIFY" bad172f ServerHandler.cpp: Delay load "qwave.dll" only with MSVC 170f284 src: Fix QoS build with MinGW 5ce8161 mumble_pch.hpp: Include to fix MinGW build e3bc8ff mumble_pch.hpp: Set up Windows macros _WIN32_WINNT and NTDDI_VERSION to target Windows 7 on MinGW. bb5c365 opus-build.pro: Don't use MSVC-specific SSE config options options for MinGW 594d010 opus-build: Rename "Win32" folder to "win32" 06606f7 mumble_exe.pro: Enable UNICODE for MinGW 78717d3 mumble.pro: split MSVC/MinGW libsndfile linking, due to different ordering and dependency requirements. 6aa30d8 mumble.pro: Link against "ksuser" in the MinGW build d8a165b openssl.pri: Link against "libssl", "libcrypto" and "gdi32" when targetting MinGWi b44cc7e mumble.pri: Create configuration for MinGW 5754a09 compiler.pri: Enable SSE and SSE2 for MinGW 45a40bf compiler.pri: Define "MINGW_HAS_SECURE_API" to enable secure functions 67422bc compiler.pri: Add CONFIG(symbols) support to win32-g++ build. 886098b compiler.pri: Use QT_ARCH instead of QMAKE_target.arch with Qt 5 0a253c7 mumble_exe.pro: Remove MSVC flags for MinGW 633f50b minhook-build.pro: Remove MSVC flags for MinGW d84dc1a speex-build.pro: Use Unix-like config.h for the MinGW build, instead of win32/config.h" 322e711 celt-0.7.0-build.pro: Use Unix-like config.h for the MinGW build, instead of win32/config.h" 0e460ba celt-0.11.0-build.pro: Use Unix-like config.h for the MinGW build, instead of win32/config.h" a2526bc g15helper.pro: Don't use "mt.exe" with MinGW e50eefc murmur.pro: Don't use "mt.exe" with MinGW 5257dce mumble_exe.pro: Don't use "mt.exe" with MinGW 756dadc mumble.pro: Don't use "mt.exe" with MinGW 882d972 Connection, Server, ServerHandler: Cast "dwFlow" to DWORD pointer to fix MinGW build. f03ef98 DirectSound.h: include to fix MinGW build. 568915d os_win.cpp: Include and to fix MinGW build 93efd81 os_win.cpp: Include to fix MinGW build ac9c6fc os_win.cpp: Include to fix MinGW build 2c431b8 murmur_pch.h: Include missing headers 2bd9f06 travis-ci: Execute "make check" using Wine 1726c81 TextToSpeech.cpp: Fix build problem Mikkel Krautz 10079ed Merge PR #2907: Implement support for building Mumble and Murmur using the MinGW toolchain. f9cf8da travis-ci: Use MinGW build envs 8758cf5 Merge PR #2952: TextToSpeech.cpp: Fix build problem 048d029 Merge PR #2951: Transifex translation update 2017-03-16 Davide Beatrici 08e2d0a Use Qt Speech if specified and available Mikkel Krautz b16983f Merge PR #2922: Mumble: remove expert mode. 0d2e891 Settings: document that expert mode has been removed. 1017830 Mumble: remove expert mode. b9165ae Merge PR #2939: Implement QtSpeech-based text-to-speech backend 6b7dfc7 Merge PR #2948: Fixed uname() query on Solaris. 562353a Merge PR #2949: Transifex translation update Maxwell Cody fef7252 OSInfo: Documented Solaris uname() fix. 2017-03-15 Jan Klass aa68f5a By default do not use other-talk attenuation Mikkel Krautz 5e7cbca Merge PR #2935: WASAPI.cpp: Remove unused "numFramesLeft" variable 92b82cf Merge PR #2943: Murmur: update registration URL to use mumble.info instead of mumble.hive.no. 6898407 Merge PR #2944: Transifex translation update Maxwell Cody 41e0652 Fixed uname() query on Solaris. 2017-03-14 Davide Beatrici 0b4d204 WASAPI.cpp: Remove unused "numFramesLeft" variable 48c988c plugins/sto.cpp: Retract plugin 57e3d90 plugins/ql: Fix spectator state offset e284bcc Overlay_win: Fix "m_active" variable order f7798c3 MurmurIce.cpp: Fix signed/unsigned comparison warning Mikkel Krautz aea841a Murmur: update registration URL to use mumble.info instead of mumble.hive.no. 2667fe4 Merge PR #2932: Overlay_win: Fix "m_active" variable order 9de6718 Merge PR #2941: plugins/sto.cpp: Retract plugin bbceaa6 Merge PR #2942: plugins/ql: Fix spectator state offset 47be309 Merge PR #2924: GlobalShortcut: allow users to enable/disable our additional shortcut engines on Windows. 649537f Merge PR #2938: MurmurIce.cpp: Fix comparison between signed and unsigned integer 50fc0ca Merge PR #2931: UserView.cpp: Fix deprecated Qt class ec07f61 Merge PR #2936: WASAPI.cpp: Fix print format warnings c495c57 Merge PR #2937: XboxInput: Fix type-punned pointer dereference warning 905461f Merge PR #2930: Global.cpp: Fix unused "migrateDataDir()" function on Windows e7c39bb Merge PR #2940: Transifex translation update 2017-03-13 Davide Beatrici 49bbe3c Global.cpp: Fix unused "migrateDataDir()" function on Windows 00885e3 WASAPI.cpp: Fix wrong print format 179556d UserView.cpp: use the QStyleOptionViewItem appropriate for the Qt version we build against. 9fa3843 XboxInput: clean up code by introducing XboxInputGetStateFunc typedef. 88654df ASIOInput.cpp: Fix print format warning 357c30e os_win.cpp: Fix unused "mumbleMessageOutput()" function Mikkel Krautz dbab0f7 Merge PR #2926: Add setting for enabling the Developer menu 841bff8 Merge PR #2933: os_win.cpp: Fix unused "mumbleMessageOutput()" function with Qt 5 76d2ea2 Merge PR #2934: ASIOInput.cpp: Fix print format warning 2017-03-12 Mikkel Krautz dda999c Merge PR #2929: main.pro: use qmake/compiler.pri -- the compiler.pri in the root does not exist. 1a953fc main.pro: use qmake/compiler.pri -- the compiler.pri in the root does not exist. 7e4205b MainWindow: implement UI logic for 'ui/developermenu' setting. 4a6a2bd LookConfig: hook up 'ui/developermenu' setting in the User Interface config dialog. 4a62783 Settings: add setting for enabling developer menu. c59ca21 Merge PR #2925: Use 'Third-Party Licenses' in About dialog instead of "3rd party licenses" 845e516 Murmur: use title-case for 'Third-Party Licenses' text in About dialog. fc606ce Mumble: use 'Third-Party Licenses' in About dialog. c319d5c GlobalShortcut: allow users to enable/disable our additional shortcut engines on Windows. 0e49ea3 GlobalShortcut_win: check for gkey != NULL in gkey handling. da41c19 GlobalShortcut_win: check for xboxinput != NULL before use. 82e8a33 Settings: add missing save call for the 'shortcut/gkey' setting. 9cb4040 Settings: add setting for winhooks. 2017-03-11 Davide Beatrici 74710cf GlobalShortcut_win.cpp: Make the "qHash()" function non-static 94d5552 main.cpp: Change "_declspec" to "__declspec" 846e1eb MumbleApplication.h: Remove additional scope resolution for the "nativeEventFilter()" function 9d2cdc0 mumble.pro: Use "3rdparty/asio" instead of "ASIO_PATH", if the folder exists Mikkel Krautz bed0869 Merge PR #2921: Overlay_win: properly initialize m_helper_enabled, m_helper64_enabled and m_mumble_handle. b3f2833 Overlay_win: properly initialize m_helper_enabled, m_helper64_enabled and m_mumble_handle. aef577f Merge PR #2917: MumbleApplication.h: Remove additional scope resolution for the "nativeEventFilter()" function 5076416 Merge PR #2918: main.cpp: Change "_declspec" to "__declspec" 0740c0a Merge PR #2919: GlobalShortcut_win.cpp: Make the "qHash()" function non-static 91a8c2c Merge PR #2916: mumble.pro: Use "3rdparty/asio" instead of "ASIO_PATH", if the folder exists 2017-03-07 brooss b651526 add kodi.exe to overlay_blacklist.h Mikkel Krautz 4fe90ae Merge PR #2909: MurmurIce: avoid NUL bytes in Ice messages 2017-03-06 Davide Beatrici cc00b21 mumble_pch.hpp: Remove "interface" workaround for Qt 5 2f3062a mumble_pch.hpp: Include "mmreg.h" header 9ab67db mumble_pch.hpp: Define "WIN32_LEAN_AND_MEAN", as in "murmur_pch.h" d096132 mumble_pch.hpp: Delete _WINSOCKAPI_ definition c8e3283 mumble_pch.hpp: Include "qos2.h" before "windows.h", as in Murmur 4064792 mumble_pch.hpp: Include "winsock2.h" before "windows.h" Davide Beatrici 617975e Merge PR #2781: mumble_pch.hpp: Improve MinGW compatibility. Mikkel Krautz 63bf486 MurmurIce: base64-encode MurmurUser::context on the wire to avoid NUL bytes w/o losing data. 6e820e8 Merge PR #2912: overlay_blacklist.h: add "kodi.exe" 2017-03-05 Davide Beatrici 0fdbb5d rcc.pri: Fix wrong script path d049958 Move .pri files and "toolchain" folder in "qmake" Mikkel Krautz cad1bac Merge PR #2794: ServerDB, Meta: add support for SQLite WAL. 1818476 ServerDB, Meta: add support for SQLite WAL. 6f41f4b MurmurIce: avoid NUL bytes in Ice messages cb952e0 Merge PR #2908: Meta: enable both IPv4 and IPv6 if we're unable to query network interfaces. a9b9dfe Meta: enable both IPv4 and IPv6 if we're unable to query network interfaces. 5a31a63 Merge PR #2910: rcc.pri: Fix wrong script path 48ca9e0 Merge PR #2905: Move .pri files to the "qmake" folder b3df846 Merge PR #2904: Transifex translation update 1742f86 Merge PR #2850: Live reload of Murmur SSL settings via SIGUSR1 (including runtime certificate-swap for Let's Encrypt) c0b0f01 Merge PR #2903: appveyor.yml: use win64-static-no-ltcg-1.3.x-2017-03-04-1ddd966-811. 03e5311 appveyor.yml: use win64-static-no-ltcg-1.3.x-2017-03-04-1ddd966-811. 2017-03-04 Mikkel Krautz 7925c37 Cert: reset Server's SSL state in initializeCert(). af172cf installer: quote guids in Settings.wxi. 2017-03-03 Mikkel Krautz 03908a0 Merge PR #2898: Transifex translation update 2017-03-02 Mikkel Krautz a90fc60 Merge PR #2896: src/tests: make all test .pro files 'inherit' from common test.pri file. 839237c Merge PR #2897: Transifex translation update 1560970 src/tests: make all test .pro files 'inherit' from common test.pri file. 09d4bd3 MetaParams: replace SSL settings setup code with a call to loadSSLSettings(). fd78d64 Meta, UnixMurmur: implement live certificate reloading via the USR1 signal. 9ae2a7f Merge PR #2891: ServerDB: use PasswordGenerator class for generating initial SuperUser password. 218eb18 ServerDB: use PasswordGenerator class for generating initial SuperUser password. b046d6f Merge PR #2890: PasswordGenerator: add new class for generating human-friendly passwords via CryptographicRandom. a9e7ccf PasswordGenerator: add new class for generating human-friendly passwords via CryptographicRandom. e848e56 Merge PR #2895: TestCryptographicRandom: add QT_NO_OPENGL to fix 'make check' for win32-msvc builds. fc878e0 TestCryptographicRandom: add QT_NO_OPENGL to fix 'make check' for win32-msvc builds. a58d708 Merge PR #2882: CryptographicRandom: new class for acquiring random data for cryptographic purposes. 2017-03-01 Mikkel Krautz aa25435 CryptographicRandom: new class for acquiring random data for cryptographic purposes. 2017-02-28 Mikkel Krautz cae5d6d Merge PR #2885: .gitignore: add target_wrapper.bat. 5a785f9 Merge PR #2889: Transifex translation update 28d5b8e Cert: require Qt 5.5 for QSsl::Ec. 629dd2d Add Qt 5 Trusty build to .travis.yml. 9ff780b Merge PR #2886: src/tests: fix various MSVC build issues. d1454a1 qmake/openssl.pri: link against gdi32.dll. cba18e9 src/tests: fix various MSVC build issues. 6070c82 Merge PR #2883: ManualPlugin: re-enable unhinge button for Qt 5. 360477e .gitignore: add target_wrapper.bat. d6751e8 ManualPlugin: re-enable unhinge button for Qt 5. 2017-02-27 Mikkel Krautz 0be6855 Merge PR #2881: tests: add existing TestCrypt, TestPacketDataStream and TestTimer tests to the test suite. 2017-02-26 Mikkel Krautz 05c79d5 tests: move TestTimer to new testing infrastructure. 955ca86 tests: move TestPacketDataStream to the new testing infrastructure. 7b25a05 tests: move TestCrypt to the new testing infrastructure. 1a1bd8c Merge PR #2879: Various minor fixes in preparation for hot-cert reload 85d6239 Merge PR #2880: MurmurIce: remove ad-hoc RSA checks in updateCertificate with Server::isKeyForCert(). 01f91ec MurmurIce: remove ad-hoc RSA checks in updateCertificate with Server::isKeyForCert(). 1a0e145 Meta: remove use of global QSslSocket::defaultCiphers() list. 947eb90 Move SSL check and version log message to main.cpp from MetaParams::read(). 887aa91 Meta: add qAbsSettingsFilePath variable. 250a93b Server: add bUsingMetaCert flag. 4fbbdda Meta: move qmConfig.clear(). f2ea3de UnixMurmur: Add USR1 signal handler for reloading SSL settings. 21888b1 Meta: add 'QSettings *' parameter to MetaParams::typeCheckedFromSettings(). fa98f6d Merge PR #2876: .travis.yml: add 'make check' to the Travis Linux build. 329dd4e Merge PR #2864: Fix crash when using the VoiceRecorder with voice target shortcuts e32f971 Merge PR #2878: TestCryptographicHash: make test GUI-less. fee1934 TestCryptographicHash: make test GUI-less. 0df9a37 Merge PR #2877: Translation update 4a6074e Translation update 2abd928 .travis.yml: add 'make check' to the Travis Linux build. 70bf686 Merge PR #2874: Add make target 'check' to the build. f4dfc4a Audio, AudioOutput: guard against invalid packet types in AudioOutput::addFrameToBuffer(). aa2683f AudioOutputSpeech: only process Speex packets as Speex. 8294f2d AudioInput: check iTarget and iPrevTarget for errors before use in flushCheck(). 6172477 Add make target 'check' to the build. dcc9236 Merge PR #2875: qmake/openssl.pri: when using OpenSSL via pkgconfig, ensure link_pkgconfig is in CONFIG. 2017-02-25 Mikkel Krautz 260b32d Merge PR #2860: Murmur: clean up use of the global QSslSocket::defaultCaCertificates() list. 45276e8 Cert: for servers using the cert/key specified in murmur.ini, also inherit its intermediates. 7b500db Server: treat certs from murmur.ini's sslCA as CA certs for client verification. ac02f45 Register: treat certs from murmur.ini's sslCA option as CA certs when registering. 1c8b637 Server: rename qlCA to qlIntermediates, to properly reflect its function. d5f04b4 Meta: avoid cluttering the global QSslSocket::defaultCaCertificates() list. 939f6f1 qmake/openssl.pri: when using OpenSSL via pkgconfig, ensure link_pkgconfig is in CONFIG. e95dd30 Merge PR #2873: .gitignore: make xxx_plugin_import.cpp a glob entry. c435f9e .gitignore: make xxx_plugin_import.cpp a glob entry. accc8fd Merge PR #2868: CryptographicHash: new class for computing cryptographic hashes. 7c22b84 CryptographicHash: new class for computing cryptographic hashes. 2017-02-24 Mikkel Krautz c74fc80 Merge PR #2867: mumble.pri: split out OpenSSL depenency lookup into qmake/openssl.pri for easier use in tests. 2017-02-23 Mikkel Krautz 6329ed7 mumble.pri: split out OpenSSL depenency lookup into qmake/openssl.pri for easier use in tests. 2017-02-21 Davide Beatrici 707164b plugins/rl: update plugin to work with version 1.29 Davide Beatrici 5e73de9 Merge PR #2861: plugins/rl: update plugin to work with version 1.29 Mikkel Krautz 90a904d Merge PR #2862: lrelease.pri: add Windows-specific code path, to fix nmake build. ecdd997 lrelease.pri: add Windows-specific code path, to fix nmake build. 5d036bc Merge PR #2859: Murmur: refactor private key loading sequence. 2017-02-20 Davide Beatrici a978593 Merge PR #2857: OverlayConfig: handle removal of qWinAppInst() in Qt 5.8. Mikkel Krautz 30c4c41 MurmurIce: use Server::privateKeyFromPEM in updateCertificate RPC method. affa2c4 Meta: use Server::privateKeyFromPEM. 32ca3cf Server, Cert: make use of Server::privateKeyFromPEM() method. 441063f Server, Cert: add Server::privateKeyFromPEM() method. 1a4ecd1 OverlayConfig: handle removal of qWinAppInst() in Qt 5.8. Steven Noonan e75e737 murmur: add support for EC private keys 2017-02-19 Davide Beatrici b50ab76 Always use lrelease binary from QT_INSTALL_BINS. Mikkel Krautz 17bae48 Merge PR #2852: Always use lrelease binary from QT_INSTALL_BINS. d41923d Merge PR #2851: mumble.pro: handle case where QSQLite a plugin in static builds. af903fa Merge PR #2765: python.pri: Fix path search for MinGW on Linux 2017-02-18 Davide Beatrici 91abad7 mumble.pro: handle case where QSQLite a plugin in static builds. 2017-02-16 Mikkel Krautz f30e1d6 Merge PR #2853: Transifex translation update 2017-02-14 Davide Beatrici c0b6750 Add support for custom "protoc" path and scan using "which" on Linux Jan Klass ef03f56 Add theme push-to-mute icon Mikkel Krautz 84044a7 Merge PR #2847: Transifex translation update e0b384b Merge PR #2844: Add support for custom "protoc" path and scan using "which" on Linux 2017-02-13 Davide Beatrici 09cfc1d python.pri: Fix path search for MinGW on Linux Jan Klass bb32763 Add push-to-mute icon 2017-02-12 Stefan Hacker 86f8eef Add appveyor configuration for windows proof builds d9ba3db Add travis configuration for linux proof builds Mikkel Krautz 1619dbb Merge PR #2840: Add travis configuration for linux proof builds 7bd6b6c Merge PR #2839: Add appveyor configuration for windows proof builds 2017-02-11 Mikkel Krautz 289d0d4 Merge PR #2838: mumble_exe: when using a versioned root, set the CWD to it. 03cfe38 mumble_exe: when using a versioned root, set the CWD to it. 2017-02-10 Mikkel Krautz 5bbd804 Merge PR #2835: installer: don't ship dbghelp.dll anymore. 81f36bb Merge PR #2817: installer: use WiX from buildenv. 18caa17 installer: don't ship dbghelp.dll anymore. 2017-02-09 Davide Beatrici 00f81cb mumble_proto.pro: fix protoc invocation for out-of-tree builds Mikkel Krautz 3315e01 Merge PR #2830: mumble_proto.pro: fix protoc invocation for out-of-tree builds 7ebabda Merge PR #2833: Transifex translation update 2017-02-08 Davide Beatrici 2dee4ea minhook-build.pro: Fix paths Mikkel Krautz 4eef649 Merge PR #2828: minhook-build.pro: Fix paths 2017-02-07 Mikkel Krautz d15c3f9 Merge PR #2821: Murmur: fix bad interaction with QDBus and fork(). 1e9d2b3 Murmur: fix bad interaction with QDBus and fork(). ef5f082 Merge PR #2826: 3rdparty/minhook-src: update MinHook to v1.3.3. b005b71 3rdparty/minhook-src: update MinHook to v1.3.3. 2fb5ee7 Merge PR #2825: Revert 91dc3d39f0 ('Move counter variable in processMsg into Opus condition.'). a9330a4 Revert 91dc3d39f0 ('Move counter variable in processMsg into Opus condition.'). Piratonym 0c10bca Add push-to-mute icon to mumble.qrc 9b8e745 Indicate in the tray when the push-to-mute button is pressed 2017-02-06 Davide Beatrici 7e72e77 GlobalShortcut_win.cpp: Fix MinGW compilation warnings Mikkel Krautz 4400a80 Merge PR #2823: GlobalShortcut_win.cpp: Fix MinGW compilation warnings 2017-02-05 Davide Beatrici 6afeca6 DirectSound.cpp: Fix MinGW compilation warnings e8c8220 GKey.cpp: Fix MinGW compilation warnings Mikkel Krautz 012429c Merge PR #2818: installer: ship app-local copies of UCRT DLLs. c895dad installer: ship app-local copies of UCRT DLLs. e4fe8fb installer: use WiX from buildenv. 4ca6f2c Merge PR #2810: DirectSound.cpp: Fix MinGW compilation warnings cef2324 Merge PR #2812: GKey.cpp: Fix MinGW compilation warnings 78ff4fc Merge PR #2816: LCD: drop workaround for Qt >= 5.6.2. 7a0790b LCD: drop workaround for Qt >= 5.6.2. 2017-02-04 Davide Beatrici aee1469 Overlay_win.cpp: Fix MinGW compilation warning Davide Beatrici b817d3f Merge PR #2811: Fix MinGW compilation warning Stefan Hacker 43109d1 Fix linking mumble client in static debug mode 1773dc7 Integrate review comments on getenvQString Mikkel Krautz 11f9244 MumbleApplication: introduce getenvQString and use it in applicationVersionRoot. 2017-02-03 Davide Beatrici 625d1ce OSInfo.cpp: Fix MinGW compilation warnings Jan Klass 52662d7 Fix usage of QFileInfo for Qt4 Mikkel Krautz 487e032 Merge PR #2807: Fix usage of QFileInfo for Qt4 d871f34 Merge PR #2793: Show fallback icon on missing country flag icon 4886268 Merge PR #2804: OSInfo.cpp: Fix MinGW compilation warnings 2017-02-02 Davide Beatrici 2966e5f os_win.cpp: Fix PATH_MAX redefinition warning Jan Klass 95c7b5e Show fallback icon on missing country flag icon Mikkel Krautz 077cbfd Merge PR #2796: VoiceRecorder.cpp: Use braces to avoid ambiguous "else" 51bb441 Merge PR #2797: os_win.cpp: Fix PATH_MAX redefinition warning 1be562f Merge PR #2790: mumble_plugin_win32_ptr_type.h: Prevent redefinition of "NOMINMAX" 4d6a813 Refactor Server::supportsDualStack(). 2017-02-01 Davide Beatrici 49f9d61 VoiceRecorder.cpp: Use braces to avoid ambiguous "else" Jan Klass c083432 CertWizard: Password requirement notice on import 2017-01-31 Davide Beatrici 2213d50 plugins: Prevent redefinition of "NOMINMAX" Jan Klass b9e9ee9 Reduce SVG icon file size 2017-01-30 Jan Klass 5dbb124 Update country flag icons 475907b Document workaround in LogTextBrowser Mikkel Krautz 039096a Merge PR #2792: Re-run mkflags.py to remove non-existant '__.svg' from our flags QRC files. c8d0880 Re-run mkflags.py to remove non-existant '__.svg' from our flags QRC files. 867d4f6 Merge PR #2791: Update country flag icons 2017-01-29 Davide Beatrici 474b370 plugins: Fix indentation and whitespace Mikkel Krautz c936b99 Merge PR #2785: plugins: Use tabs for indentation, remove trailing whitespace 2017-01-27 Mikkel Krautz 82d385f Merge PR #2780: installer: use "vcruntime140.dll" instead of "msvcr140.dll" for vcruntime140.dll's component ID. ea1c1b3 installer: use "vcruntime140.dll" instead of "msvcr140.dll" for vcruntime140.dll's component ID. 2017-01-26 Mikkel Krautz c3ebc17 Merge PR #2776: installer: use VC140 CRT. 452aa61 installer: use VC140 CRT. afd86cf Merge PR #2775: MVSC2015 toolchain fixes: ignore C4091 on v140_xp toolchain and fix UCRT lib path in toolchain files 09c22a5 toolchain: update win32-msvc2015 x64 and x86 toolchains to include ucrt lib dir. df4b0d8 compiler.pri: for win32-msvc, ignore C4091 when building against v140_xp toolset. 3cbccc5 Merge PR #2760: Update QSslDiffieHellmanParameters API calls to final Qt 5.8 API 2017-01-25 Davide Beatrici d179468 WASAPI.h: Include missing header for MinGW on Linux 28b9b1d WASAPI.h: Change header name capitalization for MinGW on Linux a4b1f8a rcc.pri: Fix script path for MinGW on Linux 7b31e4f mumble_pch.hpp: Change header name capitalization for MinGW on Linux Mikkel Krautz cc4d32f Merge PR #2774: WASAPI.h: Include missing header for MinGW on Linux 7e1fdaa Merge PR #2771: rcc.pri: Fix script path for MinGW on Linux 8fc69fe Merge PR #2772: WASAPI.h: Change header name capitalization for MinGW on Linux cda06e9 Merge PR #2770: mumble_pch.hpp: Change header name capitalization for MinGW on Linux 2017-01-24 Mikkel Krautz c3e2905 Merge PR #2753: Murmur: set detach=false for -limits (implies -fg). 460f550 Merge PR #2744: Revert PR 2674 and document audio backend initialization and teardown 50be180 Merge PR #2767: Transifex translation update 3e777ba Merge PR #2768: mumble.pro: use forward slash for GENQRC also on Windows f542989 Merge PR #2769: Use forward slash for paths in .rc files 2017-01-23 Davide Beatrici 1ba4269 Use forward slash for paths in .rc files 3bc58e8 mumble.pro: use forward slash for GENQRC also on Windows 2017-01-22 Davide Beatrici 63280fc python.pri: Correct typo "unble" to "unable" f1ba1df main.pro: don't build minhook if "no-overlay" option specified 920244c main.pro: fix no-overlay to actually work on Windows fda85f4 main.pro: ensure we don't build overlay_gl on Windows. e42e6ca Make "no-overlay" option available also for Windows 6096b74 plugins: Fix MinGW compilation warnings and errors e92b27b plugins: Fix visibility for plugins compiled with MinGW Mikkel Krautz c2f6865 Merge PR #2764: python.pri: Correct typo "unble" to "unable" b5aef4c Merge PR #2762: MainWindow: don't include 'Hide Mumble' menu item on macOS. 32030ed MainWindow: don't include 'Hide Mumble' menu item on macOS. bf90fad Merge PR #2747: Allow hiding Muble from the menu without minimizing 348d457 Merge PR #2761: main.pro: don't build minhook if "no-overlay" option specified 44790f6 murmur.pro: remove Mumble buildenv requirement for QSslDiffieHellmanParameters. 6456037 Murmur: use final Qt 5.8 API for QSslDiffieHellmanParameters. a08c509 Merge PR #2759: main.pro: fix-ups for "no-overlay" CONFIG option on Windows 98349a1 Merge PR #2755: plugins: Fix visibility, warnings and errors when compiled with MinGW 0e898da Murmur: set detach=false for -limits (implies -fg). 12b9c9b Merge PR #2749: python.pri: detect missing 'which' command and try to recover. 0c14aae python.pri: detect missing 'which' command and try to recover. 2017-01-21 Mikkel Krautz 63661c0 Merge PR #2746: Remove long-form BSD-license from GKey.cpp/.h. Piratonym 74572fd Allow hiding Muble from the menu without minimizing 2017-01-20 Mikkel Krautz 70573da Remove long-form BSD-license from GKey.cpp/.h. 89036d5 Audio, AudioInput, AudioOutput: add proper documentation about AudioInput and AudioOutput construction and destruction. a4743f3 Revert PR #2674: Mumble: convert AudioInputPtr and AudioOutputPtr to use QSharedPointer instead of boost::shared_ptr. 4fe07a5 Merge PR #2742: Mumble.proto: explicitly use proto2 syntax. 4e6d3bf Mumble.proto: explicitly use proto2 syntax. 59275f5 Merge PR #2741: CryptState: introduce AES_KEY_SIZE_* constants. 4d256ca CryptState: introduce AES_KEY_SIZE_* constants. 2017-01-17 Mikkel Krautz fe65beb Merge PR #2733: Transifex translation update 2017-01-11 Mikkel Krautz 9e26fae Merge PR #2727: Transifex translation update 2017-01-10 Davide Beatrici 549197a plugins/rl: update plugin to work with version 1.27 2017-01-08 Mikkel Krautz 73fe457 Merge PR #2724: Update tree copyrights to 2017. 91ebb8b Update tree copyrights to 2017. bc01254 Merge PR #2723: Transifex translation update 2016-12-31 Davide Beatrici 4d3d4d8 plugins/bf1: update plugin to work with version 1.0.47.30570 2016-12-24 Davide Beatrici 501651b plugins/gtav: update plugin to work with version 1.37 (Steam only) 2016-12-23 Lari Tikkanen 6366ff4 Default case for user dragging is unneeded 7586175 Use ChannelDrag enum for UserDrag 7e6c415 Implement configuring user dragging Mikkel Krautz df0bd66 Merge PR #2716: Update AUTHORS and CHANGES. f5a053f Update AUTHORS and CHANGES. ddd4764 Merge PR #2709: Add setting to configure user dragging 2016-12-22 Mikkel Krautz 3c62a18 Merge PR #2715: Transifex translation update 2016-12-20 Mikkel Krautz a1c964b Merge PR #2707: Transifex translation update 2016-12-14 Davide Beatrici e8849a4 plugins/rl: update plugin to work with version 1.26 2016-12-11 Mikkel Krautz 900803c Merge PR #2704: Transifex translation update 2016-12-08 Davide Beatrici 6bad7ae plugins/rl: update plugin to work with version 1.25 Mikkel Krautz be79bff Merge PR #2703: Qt 4-related FTBFS issues 74f5930 *.pro: use 'linux*' instead of 'linux' for Linux conditionals. 704069e DeveloperConsole: drop QPointer::clear() call. It is unnecessary, and the clear() method is Qt 5-only. 2016-12-04 Mikkel Krautz 6ac0553 Merge PR #2698: Add Developer Console to Mumble f62af9a Add Developer Console to Mumble, where users can inspect Mumble's log output. ab35897 Mumble: add os_unix.cpp, with LogEmitter support. a45bf73 os_macx.mm: add LogEmitter support. 967e93e Add LogEmitter to Mumble and use it in os_win.cpp. 681ecf6 Merge PR #2697: Refactor LogEmitter from Murmur into its own file in src/. cd8f6b7 Refactor LogEmitter from Murmur into its own file in src/. ec0ed4e Merge PR #2696: 3rdparty/opus-build: update verison references in config.h for Unix-like systems to 1.1.3. 0502f61 3rdparty/opus-build: update verison references in config.h for Unix-like systems to 1.1.3. c722cd1 Merge PR #2695: 3rdparty/opus-src: update to 1.1.3. 94493ac 3rdparty/opus-src: update to 1.1.3. e596b72 Merge PR #2694: ConfigDialog_macx, mumble.pro: extra cleanups after removal in PR #2693. 2016-12-03 Mikkel Krautz 95a666d ConfigDialog_macx, mumble.pro: extra cleanups after removal in PR #2693. 7dd03f3 Merge PR #2693: ConfigDiaglog_macx: remove, now that we default to the new Mumble theme. 599bd1b ConfigDiaglog_macx: remove, now that we default to the new Mumble theme. 5998cc0 Merge PR #2692: os_win: remove MumbleHWNDForQWidget, add mumble_mw_hwnd. 5075b6c os_win: remove MumbleHWNDForQWidget, add mumble_mw_hwnd. aa263e9 Merge PR #2691: mumble.pro: don't add to QTPLUGIN if we're on a Qt with auto-plugin support. 4bcd067 mumble.pro: don't add to QTPLUGIN if we're on a Qt with auto-plugin support. d15ca88 Merge PR #2690: qt.pri: introduce QT_VERSION_INT for easier version comparisons in qmake files. 48b8ef7 qt.pri: introduce QT_VERSION_INT for easier version comparisons in qmake files. 6fe920b Merge PR #2689: mumble.pro: only use qico on Windows. 7a45072 mumble.pro: only use qico on Windows. eda8ade Merge PR #2688: mumble.pro: refactor handling of accessiblewidgets plugin. 67945fd mumble.pro: refactor handling of accessiblewidgets plugin. 2016-12-02 Mikkel Krautz 06d3785 Merge PR #2687: Settings: add workaround for macOS "@Variant(" bug. c6029e6 Settings: add workaround for macOS "@Variant(" bug. c45298e Merge PR #2685: MainWindow: disable MainWindow::changeEvent on macOS; it causes Mumble to be non-interactive after restoring from being minimized. 0f170bf MainWindow: disable MainWindow::changeEvent on macOS; it causes Mumble to be non-interactive after restoring from being minimized. 2016-12-01 Mikkel Krautz 9b4ee06 Merge PR #2682: main, SocketRPC: add 'togglemute' and 'toggledeaf' RPC commands. 541ac08 main, SocketRPC: add 'togglemute' and 'toggledeaf' RPC commands. 8aa2558 Merge PR #2681: Audio: start qtLastFetch timer in LoopUser to fix local loopback. f7c40bd Audio: start qtLastFetch timer in LoopUser to fix local loopback. acd664a Merge PR #2673: ffxiv_x64 Plugin: Add a plugin for Final Fantasy XIV DX11/x64 f1b901e Merge PR #2677: Transifex translation update 2016-11-29 Arthur Moore 84c2ae2 ffxiv_x64 Plugin: Add a plugin for Final Fantasy XIV x64 Mikkel Krautz 0a58100 Merge PR #2675: Transifex translation update 2016-11-28 Mikkel Krautz 2a106e1 Merge PR #2674: Mumble: convert AudioInputPtr and AudioOutputPtr to use QSharedPointer instead of boost::shared_ptr. b676712 Mumble: convert AudioInputPtr and AudioOutputPtr to use QSharedPointer instead of boost::shared_ptr. 2016-11-27 Arthur Moore 07308dc ffxiv Plugin: Add a plugin for Final Fantasy XIV Mikkel Krautz 0bc6d7d Merge PR #2672: installer: add ffxiv plugin to the installer. 5fc3721 installer: add ffxiv plugin to the installer. 8bbb34d Merge PR #2653: Add plugin for Final Fantasy XIV 0df5c64 Merge PR #2671: Split mumble_flags.qrc into seperate files to reduce .cpp size for older compilers. 54dd7e7 Split mumble_flags.qrc into seperate files to reduce .cpp size for older compilers. b6d7cf4 Merge PR #2670: scripts/mkflags.pl: remove old flags script. 2c3eb27 scripts/mkflags.pl: remove old flags script. feb2b21 Merge PR #2669: Add OpenBSD to compiler.pri and, in main.pro disable the overlay on OpenBSD. c0865e1 Merge PR #2668: Only link against -lrt when using a linux mkspec. 473b874 Only link against -lrt when using a linux mkspec. 66693d8 main.pro: don't build overlay on OpenBSD. 030a901 compiler.pri: add OpenBSD. d22a797 Merge PR #2666: ServerHandler: use QUdpSocket::bind(QHostAddress, int) overload to fix Qt 4 build. afbf239 ServerHandler: use QUdpSocket::bind(QHostAddress, int) overload to fix Qt 4 build. 46137d9 Merge PR #2665: Always prepend 'release' or 'debug' dirs when adding to QMAKE_LIBDIR. 5cffbf3 Always prepend 'release' or 'debug' dirs when adding to QMAKE_LIBDIR. 2016-11-26 Mikkel Krautz cb1732b Merge PR #2664: Connection.h: fix build-breaking typo in include: Qtcore -> QtCore. 989f5d6 Connection.h: fix build-breaking typo in include: Qtcore -> QtCore. 8a10b93 Merge PR #2663: Fix Windows no-pch build by including correct headers in .h files. 1f430e4 Merge PR #2662: 3rdparty/speex-build: add CONFIG += no_batch to speex-build.pro. 27dc651 Fix Windows no-pch build by including correct headers in .h files. ca8a117 3rdparty/speex-build: add CONFIG += no_batch to speex-build.pro. 153c0aa Merge PR #2661: Restore green background for strong certificate in UserView (root channel) and ServerView (ConnectDialog) b3a1722 UserView: amend UserDelgate to allow a UserView's BackgroundRole to override the theme's default background color. 18d73fa ConnectDialog: add ServerViewDelegate for ConnectDialog's QTreeView to be able to override the theme's background color. 89b3916 Merge PR #2657: 3rdparty/qqbonjour-src: in BonjourServiceResolver, always tear down ResolveRecord on error. 2016-11-25 Arthur Moore 8494361 l4d2 plugin: cleanup cd92d83 l4d2 plugin: combined plugin files d043606 l4d2 plugin: Moved constants to a single const block Mikkel Krautz 6130b34 Merge PR #2659: macx/compat: fix build of compat.m shim with Sierra SDK. f3e8b13 Merge PR #2658: cplusplus.pri: pipe gcc -print-multiarch output to stderr. db12479 Merge PR #2650: L4d2 Plugin Simplification f01f6e5 macx/compat: fix build of compat.m shim with Sierra SDK. f47822d cplusplus.pri: pipe gcc -print-multiarch output to stderr. 21a603c 3rdparty/qqbonjour-src: in BonjourServiceResolver, always tear down ResolveRecord on error. 64d730a Merge PR #2656: buildenv.pri: set USE_BUILDENV preprocessor define when inside a buildenv. 9ecbc1c buildenv.pri: set USE_BUILDENV preprocessor define when inside a buildenv. 52fd689 Merge PR #2655: .gitignore: add mocinclude.opt. 0f2e4fb .gitignore: add mocinclude.opt. 0d76ff9 Merge PR #2589: Remove additional word character channel name restriction 82c27fe Merge PR #2644: Add command-line flags for accessing license information for Mumble and Murmur 2016-11-24 Mikkel Krautz 25cb53d Murmur: use About dialog for -license, -authors and -third-party-licenses on Windows. e96f81a Murmur: Add AboutDialogOptions flag to the AboutDialog class. 821d547 Add About dialog to Murmur. 33ae63e murmur: add -license, -authors and -third-party-licenses flags. b55a75d mumble: implement --license, --authors, and --third-party-licenses flags. 7c5b3d4 About: use License class in the about dialog. 6bb3270 License: new class for easier access to license data. cc2b1c7 Move licenses.h header to src/ from src/mumble/. 2016-11-18 Mikkel Krautz 54eab8d Merge PR #2648: cplusplus.pri: refactor 'prior modern C++ standards' logic to work for Qt 4. edf3e89 cplusplus.pri: refactor 'prior modern C++ standards' logic to work for Qt 4. 2016-11-17 Jan Klass e2ad9c0 Fix 2643: Revert "Merge PR #2611: plugins: use the short form of peekProc" Mikkel Krautz f47df77 Merge PR #2647: main.pro: include compiler.pri to make CONFIG(buildenv) check in macx section work. 84d88b3 main.pro: include compiler.pri to make CONFIG(buildenv) check in macx section work. 09a0f84 Merge PR #2499: Themes: add support for user styles. 5e005a7 Merge PR #2641: GlobalShortcutWin: ensure winhook NumLock and Pause keys are translated into their correct DirectInput key IDs. b466faa Merge PR #2637: Fix Murmur build inside the Linux buildenv e9f3c08 Merge PR #2640: ServerDB: ensure 'id' is never uninitialized in Server::removeChannelDB(). 2016-11-15 Mikkel Krautz 486381c Merge PR #2642: About: add AUTHORS file to the about dialog. 493204f About: add AUTHORS file to the about dialog. 2016-11-14 Mikkel Krautz fa27098 GlobalShortcutWin: ensure winhook NumLock and Pause keys are translated into their correct DirectInput key IDs. 2016-11-13 Mikkel Krautz 175ddb6 ServerDB: ensure 'id' is never uninitialized in Server::removeChannelDB(). 491363e Merge PR #2636: compiler.pri: drop old modern C++ detection logic that is now handled by cplusplus.pri. f97a28b compiler.pri: drop old modern C++ detection logic that is now handled by cplusplus.pri. d2c0cc3 main.pro: use CONFIG(buildenv) instead of custom buildenv-detection logic. 0dcb493 murmur.pro: use CONFIG(buildenv) in QSslDiffieHellmanParameters check. 454e3d7 compiler.pri: use CONFIG(buildenv) instead of custom buildenv-detection logic. 6af0190 cplusplus.pri: do not use Debian C++11 lib dir when inside a buildenv. 3c3714a compiler.pri, buildenv.pri: add CONFIG+=buildenv when inside a Mumble buildenv. 4be78f2 When using -isystem, also add the included path via the regular -I flag. c21518f Themes: add support for user styles. b2e37e6 Merge PR #2623: Use same source address for UDP packets that is used for TCP packets 2b1c6b4 ServerHandler: implement ServerHandler logic for 'net/udpforcetcpaddr'. 7d621d7 Settings: add 'net/udpforcetcpaddr' option to configure the default UDP binding behavior. cb6329b Connection: add localAddress() and localPort() getters. 380cd6b Merge PR #2634: overlay: fall back to fxc.exe on PATH if DXSDK is not set. 713e2aa Merge PR #2630: compiler.pri: improve modern C++ detection d9cc484 overlay: fall back to fxc.exe on PATH if DXSDK is not set. 4a91dd7 cplusplus.pri: handle Debian C++11 library path. 20b33c2 compiler.pri, cplusplus.pri: improve modern C++ detection. 2016-11-06 Mikkel Krautz 9fc379a ServerHandler: reconnect to the server if it is not responding to TCP pings 2016-11-05 Jan Klass dd874cc Add and update author alias for Jan Klass 94b05db Fix #2584 by reverting introduction of log message with PR #2580 2016-11-03 Davide Beatrici 685b5d6 plugins: fix compile error on Linux Mikkel Krautz 8396904 murmur_ice: use `slice2cpp --version` to guess the slice include path for slice2cpp. 4efd506 Merge PR #2616: plugins: fix compile error on Linux 36ae0fc Merge PR #2613: Transifex translation update 2016-11-02 Jan Klass 628ddc3 Remove most of channel name restriction 2016-11-01 Mikkel Krautz e9c558f Merge PR #2611: plugins: use the short form of peekProc 2016-10-31 Davide Beatrici 921ee19 plugins: use the short form of peekProc 2016-10-30 Davide Beatrici dead5a7 plugins/l4d: total revamp and identity support Davide Beatrici f836ed4 Merge PR #2609: plugins/l4d: total revamp and identity support Mikkel Krautz ca2fd07 Merge PR #2593: Introduce QAtomicIntLoad inline function in QAtomicIntCompat.h header, use for aiUdpFlag in Murmur. 2016-10-29 Davide Beatrici 882ad70 plugins: build x64 ones only when the target is x86_64 Mikkel Krautz b96bd07 Merge PR #2607: plugins: Build x64 ones only when the target is x86_64 2016-10-27 Davide Beatrici c553e04 Merge PR #2603: plugins/bf1: better squad pointer zeroX-tj 360cac6 plugins/bf1: better squad pointer 2016-10-26 Davide Beatrici 30c779c plugins/bf1: update plugin to work with version 1.0.9.53998 Mikkel Krautz 509d7fd compiler.pri: use -std=c++98 instead of -std=c++03. 2e6625b Murmur: replace all QAtomicInt loads with new QAtomicIntLoad compatibility function. 2e08433 murmur_pch.h: add QAtomicIntCompat.h header to Murmur's PCH file. 6c3544d Add QAtomicIntLoad via new QAtomicIntCompat.h header. 2016-10-23 Davide Beatrici 90bcd40 plugins: Move NUL terminator to escape function Mikkel Krautz 308e4f7 Merge PR #2592: plugins: Move NUL terminator to escape function 2016-10-22 Mikkel Krautz 0258d2a Merge PR #2582: compiler.pri: explicitly default to C++03 on Unix-like systems. e99b0c9 compiler.pri: explicitly default to C++03 on Unix-like systems. 2016-10-21 Mikkel Krautz e9a34bd Merge PR #2583: Fix BF1 PA plugin Windows installer integration 61b53ca Fix BF1 PA plugin Windows installer integration. 2016-10-20 Davide Beatrici 7ab7d1d Positional audio support for Battlefield 1 Mikkel Krautz 4add9ce Merge PR #2580: Log information about missing target channel c1cd99e Merge PR #2581: Positional audio support for Battlefield 1 2016-10-19 Jan Klass 9c5d02c Log information about missing target channel 2016-10-18 Davide Beatrici 0785dea plugins/wow: Update version number 2016-10-16 Davide Beatrici 05cc7e3 plugins/l4d2: Added player SteamID in identity 2016-10-05 Jan Klass 9d2bb10 Fix #2572: Fix invisible Quickchat bar on startup 2016-10-04 Davide Beatrici 89b0f31 plugins/rl: update plugin to work with version 1.24 2016-09-26 Mikkel Krautz 2d6e099 Merge PR #2564: Added an appdata.xml file for Linux software gallery integration 2733fed Merge PR #2565: plugins/wow: update plugin to work with build 22624 2016-09-25 Davide Beatrici a18d61c plugins/wow: update plugin to work with build 22624 Matthias Mailänder a063ee2 Add an appdata.xml file. 2016-09-20 Mikkel Krautz d08be37 Merge PR #2557: Transifex translation update 2016-09-19 Mikkel Krautz f3a1a6c Merge PR #2555: Added a DBus method for getting a list of currently talking users. 2016-09-16 Jeff Rogers a528343 Added a DBus method for getting a list of currently talking users. 2016-09-14 Mikkel Krautz 4009ea3 Merge PR #2552: MainWindow: avoid initial setupView(false) call in setupGui() on Qt 5. 2016-09-13 Davide Beatrici fe3ec08 plugins/rl: update plugin to work with version 1.23 Mikkel Krautz 99899d1 MainWindow: avoid initial setupView(false) call in setupGui() on Qt 5. 2016-09-12 Davide Beatrici 04dacb1 plugins/wow: Total revamp and support for the x64 executable. Davide Beatrici 28fe58f Build Rocket League on Linux Mikkel Krautz 0556b6c Merge PR #2549: plugins/wow: Total revamp and support for the x64 version of the executable d13a877 Merge PR #2551: Revert PR #2531: installer: use MSVC2015 runtime. e3acce3 Revert PR #2531: installer: use MSVC2015 runtime. a235d1a Merge PR #2550: Build Rocket League on Linux 2016-09-09 Davide Beatrici 29f6e20 Positional audio support for Rocket League on Linux Davide Beatrici fbf7900 plugins/rl: update plugin to work with version 1.22 Mikkel Krautz f064a8d Merge PR #2547: Positional audio support for Rocket League on Linux 2016-09-07 Mikkel Krautz 9be606e Merge PR #2541: Murmur postgresql support 2016-09-04 Mikkel Krautz 2eaed7e Merge PR #2542: Enable the Opus music encoder Natenom 498e558 Enable the Opus music encoder 2016-08-31 Luke A Pitt 1c12c81 Replace checks for (not SQLite and not PostgreSQL) with checks for MySQL. 2016-08-30 Luke A Pitt 477f335 Whitespace fixes. 64d09ce This commit removes the reconnection logic from ServerDB::query(). Logic was removed due to issues raised in comment https://github.com/mumble-voip/mumble/pull/2383#issuecomment-2 30173429 . 7560db0 Use UPSERT for PostgreSQL, REPLACE INTO for other databases. Used place holder marks for PostgreSQL UPSERT values instead of positional binding since the statements require the values twice (once for the INSERT, and once for the UPDATE should the insert fail). The values to use for the ON CONFLICT DO UPDATE part of the UPSERT have been prefixed with u_ . 8f20669 Minimum changes to make previously applied postgresql pacth work with current version of mumur. Change users table to have new column format. Change slog table to have a default value of "now()" for column msgtime as other databases use triggers to add this value. Revert database logging statement so that the timestamp is assigned by triggers or column default values. 3d5c743 Indentation fix - Replace spaces with tabs. Arne Fenske b99a459 Murmur now supports PostgreSQL. The PostgreSQL plugin for Qt 4 ('libqt4-sql-psql' package in Debian) is required. To enable this feature, use the 'dbDriver=QPSQL' option in your 'mumble-server.ini'. 2016-08-29 Mikkel Krautz 96d87db Merge PR #2540: Remove some old-style plugin license headers. They are now covered by LICENSE/AUTHORS. ca678fe Fix UT99 plugin license in 3rdPartyLicenses. 9340a10 Update 3rdPartyLicenses for plugins. 047e9f3 Merge PR #2539: Update AUTHORS and CHANGES 08198a6 plugins: remove some old-style license headers now covered by LICENSE/AUTHORS. 5e96c33 CHANGES: update. 0624e36 AUTHORS: regenerate. 80b8e3c Merge PR #2538: .mailmap: add Eli Tallman. 56ea5a2 .mailmap: add Eli Tallman. e6cde15 Merge PR #2537: Messages: add the prefix “Private” in MainWindow::msgTextMessage(). 2016-08-28 Mikkel Krautz 13772c1 Merge PR #2472: Remove the message size restriction and fix the validation of images 2016-08-26 Mikkel Krautz 79f1885 Merge PR #2531: installer: use MSVC2015 runtime. 824db88 installer: use MSVC2015 runtime. c05d4de Merge PR #2534: Send clipboard content to chat 2866033 Merge PR #2535: Transifex translation update 2016-08-25 Anthony Alves 79f67f6 Send clipboard content to chat 2016-08-24 Mikkel Krautz 355bf07 Merge PR #2526: compiler.pri: enable warnings-as-errors by default on Windows. fc9dc2e Merge PR #2524: OSInfo: fix implicit size_t conversion. d7ac6f7 OSInfo: fix implicit size_t conversion. dd14796 Merge PR #2525: Fix various warnings in the Windows overlay found by upgrading to MSVC2015 173aa7d Merge PR #2523: Fix various plugin problems that popped up with MSVC2015 a017810 Merge PR #2522: overlay: remove use of d3dx9, d3dx10 and d3dx11. d657238 Merge PR #2527: Allow Mumble to be built with MSVC2015 2016-08-21 Mikkel Krautz 5d75109 compiler.pri: remove -Zc:strictStrings on MSVC2015 as well. 2a8551d os_win: supply new definition of __pfnDliNotifyHook2 instead of assigning to it. 7868bea compiler.pri: enable warnings-as-errors by default on Windows. 4cc3441 overlay/overlay_exe: use unsigned long long for our passed-in handle to silence MSVC2015 warning. b711ea9 overlay/lib.h: fix _WIN32_WINNT redefinition. 9f50ca8 overlay/lib.cpp: cast to long when creating RECT. a474aa2 plugins/null_plugin.cpp: remove use of legacy plugin header. c194b1c plugins/mumble_plugin_win32_ptr_type.h: convert to uintptr_t before converting to procptrXX_t. 4030d2c plugins/wow: convert plugin to use mumble_plugin_win32_32bit.h. 72f038e overlay: remove use of d3dx9, d3dx10 and d3dx11. 7960c50 plugins/mumble_plugin.h: add magic values for MSVC2015 x86 and x64 ABIs. 9d926ac compiler.pri: remove DXSDK sanity check. 2ad58a5 toolchain: add MSVC2015 toolchain. 2016-08-19 Mikkel Krautz 1603d08 Merge PR #2518: Reset to 0 dB on Local Volume Adjustment reset button 2016-08-18 Anthony Alves 3cb7334 Reset to 0 dB on localvoladj reset Mikkel Krautz 3557cd2 Merge PR #2517: Transifex translation update 2016-08-17 Mikkel Krautz 89ef242 Merge PR #2515: Transifex translation update 2016-08-14 Davide Beatrici 7d7887a Build Left 4 Dead 2 on Linux 2016-08-13 Mikkel Krautz de1d983 Merge PR #2514: Build Left 4 Dead 2 on Linux f735a63 Merge PR #2513: plugins: use MUMBLE_PLUGIN_EXPORT instead of compiler-specific declarations. 2f5118c plugins: use MUMBLE_PLUGIN_EXPORT instead of __attribute__((visibility("default"))). b19840c plugins: use MUMBLE_PLUGIN_EXPORT instead of __declspec(dllexport). 2396a99 Merge PR #2512: Plugins: lay the groundwork for using Windows PA plugins on Linux with Wine 743f129 plugins/rl: allow Windows plugin to be built on Linux. 8002f23 plugins: allow mumble_plugin_win32_32bit.h and mumble_plugin_win32_64bit.h to be included on Linux. 9a99bd5 plugins/l4d2: use new Linux plugin API in l4d2_linux. 2a049e6 mumble_plugin_linux.h: align API of the Windows and Linux plugin headers. 797bc9b mumble_plugin.h: add MUMBLE_PLUGIN_EXPORT macro. dc7fefd Plugins: teach Linux pid-fetcher to be Wine-aware. 2016-08-12 Mikkel Krautz 86824a3 Merge PR #2511: Fix warnings in mumble_plugin_linux.h 5b51676 pugins/mumble_plugin_linux.h: convert C-style casts to C++-style casts. ee0c6a2 plugins/mumble_plugin_linux.h: use non-C++11 std::ifstream::open(). 2016-08-11 Davide Beatrici 746322e plugins/l4d2: Rename "l4d2.cpp" to "l4d2_win32.cpp" 88797fa mumble/plugins: Rename Win32 headers 2b414da Positional audio support for Left 4 Dead 2 on Linux 2da60f9 Linux support for positional audio plugins Mikkel Krautz 30ec38d Merge PR #2510: mumble/plugins: Rename Win32 headers 58a7ff5 Merge PR #2508: Positional audio support for Left 4 Dead 2 on Linux d364932 Merge PR #2507: Linux support for positional audio plugins 8248ab8 Merge PR #2509: Transifex translation update 2016-08-10 Mikkel Krautz e83d01c Merge PR #2506: Plugins: fill out pids map on Linux. 2016-08-09 Mikkel Krautz 2aec53d Merge PR #2505: themes/Mumble: sync. 33d422e themes/Mumble: sync. 2016-08-08 Davide Beatrici 713d531 plugins/link: Initialize wsPluginName to fix #2482 Mikkel Krautz d3f79b6 Merge PR #2500: Transifex translation update 664ca40 Merge PR #2498: GlobalShortcut, Themes: move hard-coded stylesheet from GlobalShortcut.ui into the Themes class's default stylesheet. dab868e Merge PR #2503: plugins/link: Initialize wsPluginName to fix the empty shortname problem 66d41ef Merge PR #2497: Introduce MUComboBox subclass and use it throughout the tree. 2016-08-07 Kevin Rohland 3d082c8 Log: introduce new 2048x2048 message area size restriction. Mikkel Krautz 613b7fc GlobalShortcut, Themes: move hard-coded stylesheet from GlobalShortcut.ui into the Themes class's default stylesheet. 56ffa37 GlobalShortcut: use MUComboBox. 29e905a Use MUComboBox in .ui files. 4b7ebd9 MainWindow: use MUComboBox. 25c0740 Add MUComboBox. 59e5344 Merge PR #2496: Sync themes/Mumble. 5d66094 Sync themes/Mumble. 0a9c69d Merge PR #2470: OSInfo: fix new Windows 10 OSInfo to not include NUL values in the displayable version string. ab58864 Merge PR #2495: 3rdparty/xinputcheck-src: add Xbox One controller (w/ 3.5 mm jack). ad10136 Merge PR #2493: Various mumble_plugin.h and ManualPlugin fixes 2016-08-06 Kevin Rohland 50c7c77 Messages: add the prefix “Private” in MainWindow::msgTextMessage(). Mikkel Krautz 302afda 3rdparty/xinputcheck-src: add Xbox One controller (w/ 3.5 mm jack). 2df5f2f OSInfo: fix new Windows 10 OSInfo to not include NUL values in the displayable version string. 042efe4 plugins/link: remove uses of HWND in about() and config(). 9fbe678 ManualPlugin: remove unnecessary mumble_plugin.h preamble. d818a8d plugins/mumble_plugin.h: fix typo in MUMBLE_PLUGIN_MAGIC_QT for _MSC_VER == 1600, M_IX86. f0a5bd2 plugins/mumble_plugin.h: replace use of HWND with void *. e7ff17b Merge PR #2492: GlobalShortcut_win: log product guid when adding a new DirectInput device. 896f6f5 Merge PR #2491: GlobalShortcut_win: log product GUID when excluding an XInput device from DirectInput processing. 0763a3d Merge PR #2490: GlobalShortcut_win: fix XboxInput button mask in buttonName(). 46a05fe Merge PR #2489: 3rdparty/xinputcheck-src: add Xbox One S wireless (non-Bluetooth) and Xbox One Elite wireless. 6b67f35 plugins/mumble_plugin.h: replace hardcoded __cdecl with MUMBLE_PLUGIN_CALLING_CONVENTION. d3aa65d GlobalShortcut_win: log product guid when adding a new DirectInput device. 682d33b GlobalShortcut_win: log product GUID when excluding an XInput device from DirectInput processing. 3ad420f GlobalShortcut_win: fix XboxInput button mask in buttonName(). 5ca9503 3rdparty/xinputcheck-src: add Xbox One S wireless (non-Bluetooth) and Xbox One Elite wireless. 2016-08-04 Mikkel Krautz fe52ad0 Plugins: fill out pids map on Linux. 8bdfd7d Merge PR #2484: 3rdparty/xinputcheck-src: add Xbox One controller GUIDs to avoid device list querying for Xbox One controllers. 8ee2bbc 3rdparty/xinputcheck-src: add Xbox One controller GUIDs to avoid device list querying for Xbox One controllers. 2016-07-31 Kevin Rohland fb19de1 Log: check for QSizeF::isValid() in Log::validHtml(). Mikkel Krautz b126c4e Merge PR #2478: Log: check for QSizeF::isValid() in Log::validHtml() 3923ce8 Merge PR #2460: Transifex translation update 2016-07-30 Mikkel Krautz 44f1055 Merge PR #2475: Fix for ban reason context menu overlap. 2016-07-29 synapse84 b205f6d Removed RightToLeft property. 2016-07-21 Mikkel Krautz 2f88605 Merge PR #2447: OSInfo: add Windows 10 displayable version string. 2016-07-20 Mikkel Krautz 88e6647 OSInfo: add Windows 10 displayable version string. cf9877c Merge PR #2440: GlobalShortcut_win: add additional diagnostic logging to the DirectInput backend 4a99cde Merge PR #2446: AudioWizard: always use ClassicStyle. acfa044 Merge PR #2450: About: HTML-escape third party license text. 5ea862b Merge PR #2451: Transifex translation update 2016-07-19 Mikkel Krautz e0f368d About: HTML-escape third party license text. 2016-07-18 Davide Beatrici 730200a plugins/l4d2: Updated server ID memory address Mikkel Krautz 7091a4c AudioWizard: always use ClassicStyle. 3b53aad Merge PR #2444: bump overlay version to force re-install on macOS. d54cb77 macx/osax: bump overlay version to force re-install on macOS. ee1a671 Merge PR #2442: plugins: allow getModuleAddr() to enumerate 32-bit modules in WoW64 mode. bb72d91 plugins: allow getModuleAddr() to enumerate 32-bit modules in WoW64 mode. 57819f1 GlobalShortcut_win: log dwDevType when rejecting a blacklisted device. c2eb801 GlobalShortcut_win: when adding a DirectInput device, log its dwDevType. 00f4e06 GlobalShortcut_win: allow logging of a device's objects in verbose mode. af38fdb Merge PR #2424: Fix updatecheck result logging ac134d3 Merge PR #2438: ManualPlugin: fix macOS build. 2016-07-17 Davide Beatrici d7b26dd plugins/gtav: update game_name memory addresses Mikkel Krautz 0f9d5c1 ManualPlugin: fix macOS build. 220f272 Merge PR #2434: installer: remove manual.dll from the installer. 956497c installer: remove manual.dll from the installer. 6e2f710 Merge PR #2431: Move the manual plugin into Mumble itself 42ddfcc Remove hacks specific to the manual plugin from the build. 9984f48 INSTALL: document no-manual-plugin. f59d080 ManualPlugin.h: make include guards fit the src/mumble style. 32919bb ManualPlugin.h: add missing LICENSE.header. 202fa2d Rename the manual plugin's files in src/mumble to be ManualPlugin.{cpp,h,ui}. db4c16d Teach the Plugins class about the built-in manual plugin. a179f5d Move 'manual' plugin into Mumble itself. 3ea298a Plugins: add MumblePluginQt to better support the 'manual' plugin. b2f2277 Merge PR #2430: LCD: add workarounds for LCD drawing on Qt 5.6. 9adc52d Merge PR #2428: g15helper: add Qt-based G15 emulator, for debugging. 2016-07-16 Mikkel Krautz be4ae5b Merge PR #2419: MainWindow, CustomElements: implement proper Backtab/Shift-Tab behavior for MainWindow::qteChat. 10abf36 Merge PR #2411: MainWindow: allow using F6 to switch between MainWindow's main widgets. 615fe7f MainWindow: allow using F6 to switch between MainWindow's main widgets. 0dcbf54 Merge PR #2425: GlobalShortcutWin: delay winhook initialization until after our first timeTicked() slot. d573183 GlobalShortcutWin: delay winhook initialization until after our first timeTicked() slot. 9923ec9 g15helper: add Qt-based G15 emulator, for debugging. 2016-07-15 Mikkel Krautz c04aa4e LCD: add workarounds for LCD drawing on Qt 5.6. ebbac0b Merge PR #2420: Murmur: use aiUdpFlag.load() in comparisons to fix Qt <5.2 build. 46b5b62 Murmur: use aiUdpFlag.load() in comparisons to fix Qt <5.2 build. 2016-07-14 Davide Beatrici bfa9be7 plugins/gtav: update plugin to work with version 1.35 Jan Klass edba745 Fix missing update check failure message Mikkel Krautz 48ad19e Merge PR #2423: plugins/gtav: update plugin to work with version 1.35 2016-07-13 Jan Klass 72cd86c Fix mapping description Mikkel Krautz 90d9cec MainWindow, CustomElements: implement proper Backtab/Shift-Tab behavior for MainWindow::qteChat. 2016-07-10 Kevin Rohland 3a980fd Fix must_pkgconfig and misspelling in mumble.pro Mikkel Krautz 43db0c4 Merge PR #2416: Transifex translation update fcd2de6 Merge PR #2417: Fix must_pkgconfig and misspelling in mumble.pro 4dc497e Merge PR #2413: build: add pkgconfig.pri and must_pkgconfig qmake function. c2be406 Merge PR #2408: TextMessage, RichTextEditor: accept TextMessage dialog when Ctrl-Enter is pressed. 7d2e1ef TextMessage, RichTextEditor: accept TextMessage dialog when Ctrl-Enter is pressed. 2016-07-09 Davide Beatrici 4f565c6 plugins/rl: update plugin to work with version 1.21 Mikkel Krautz 96998f0 build: add pkgconfig.pri and must_pkgconfig qmake function. 6a78217 Merge PR #2412: plugins/rl: update plugin to work with version 1.21 2016-07-07 Mikkel Krautz f241782 Merge PR #2399: AudioInput: remove use of the register keyword. 7eefd32 AudioInput: remove use of the register keyword. 6902b22 Merge PR #2400: GlobalShortcut_macx: add missing default-case to switch statement to fix -Werror build. e5d365e Merge PR #2401: mumble: add various Q_DECL_OVERRIDE declarations to fix the macOS build. 3d05088 Merge PR #2402: WASAPI: remove unnecessary Timer.h and User.h includes in WASAPI.cpp. fd95696 Merge PR #2403: toolchain/win32-msvc2013: escape all backslahes to make qmake happy. 67face3 Merge PR #2404: rcc.pri: escape backslahes. 238618d Merge PR #2405: overlay: escape backslashes in overlay-shared.pro. d82ee96 Merge PR #2406: Convert all remaining uses of LIBPATH in qmake files to use QMAKE_LIBDIR instead. 5f04b19 Merge PR #2407: Transifex translation update 2016-07-05 Mikkel Krautz 295961d Convert all remaining uses of LIBPATH in qmake files to use QMAKE_LIBDIR instead. 0d1244d overlay: escape backslashes in overlay-shared.pro. 084ef05 rcc.pri: escape backslahes. bcbf371 toolchain/win32-msvc2013: escape all backslahes to make qmake happy. ae2d47b WASAPI: remove unnecessary Timer.h and User.h includes in WASAPI.cpp. 800ee06 mumble: add various Q_DECL_OVERRIDE declarations to fix the macOS build. 3525ac8 GlobalShortcut_macx: add missing default-case to switch statement to fix -Werror build. f35d0cb Merge PR #2367: overlay: in D3D9's doPresent(), use swapchain's backbuffer and dimensions if drawn via IDirect3DSwapChain9::present(). 7c8b8ab overlay: in D3D9's doPresent(), use swapchain's backbuffer and dimensions if drawn via IDirect3DSwapChain9::present(). 6bc1da3 Merge PR #2395: ViewCert: only include 'QStringList processQSslCertificateInfo(QString in)' when built against Qt 4. 95222b9 Merge PR #2396: overlay: ensure the whole Microsoft Office suite is blacklisted. 64754ad Merge PR #2398: Transifex translation update 2016-07-04 Mikkel Krautz 4bae627 Merge PR #2393: Murmur: fix MurmurDBus::addChannel that was broken by Murmur's new locking. 8ae8dbb overlay: ensure the whole Microsoft Office suite is blacklisted. 1705c43 ViewCert: only include 'QStringList processQSslCertificateInfo(QString in)' when built against Qt 4. 8540966 Merge PR #2391: overlay_gl: use Elf_Sym instead of Elf64_Sym in FreeBSD specific-code. f45c1f7 Murmur: fix MurmurDBus::addChannel that was broken by Murmur's new locking. 2016-07-03 Mikkel Krautz 477f886 overlay_gl: use Elf_Sym instead of Elf64_Sym in FreeBSD specific-code. 41613d6 Merge PR #2376: compiler.pri: enable warnings-as-errors by default if inside Mumble buildenv. a8e5514 Merge PR #2387: Transifex translation update 2016-07-02 Mikkel Krautz 2e20f73 MErge PR #2363: Transifex translation update 950fa15 Merge PR #2365: OverlayClient: hide QGraphicsPixmapItems when FPS and time are disabled instead of setting an empty QPixmap. 52a7624 Merge PR #2364: overlay: optimize blit() to not perform a blit if the active item rect is empty. 8272e48 overlay: optimize blit() to not perform a blit if the active item rect is empty. daba32f Merge PR #2375: Fix Timer class's system-header Boost problems aba01d8 Timer: use header-only boost::chrono if it is available. 2c3e791 Timer: use clock_gettime with CLOCK_MONOTONIC if available. 6ad70e4 Timer: revert PR #2333 ("use boost::chrono::steady_clock as the underlyingmonotonic timer.") 35a1979 Merge PR #2382: ViewCert: clean up Qt 4/Qt 5 compatibility code. 046e0ca Merge PR #2384: plugins/gtav: Support for retail version 2016-07-01 Davide Beatrici 536a3a5 plugins/gtav: Support for retail version 2016-06-30 Mikkel Krautz 4f4e5ac Merge PR #2380: ViewCert: show certificate's SHA-256 fingerprint. 6e020c7 ViewCert: clean up Qt 4/Qt 5 compatibility code. 2016-06-29 Davide Beatrici e1b80c0 plugins/rl: Plugin update for game's latest version Mikkel Krautz 0040b7b ViewCert: show certificate's SHA-256 fingerprint. 68606fe Merge PR #2378: plugins/rl: Plugin update for game's latest version c9814ae Merge PR #2370: plugins: build fixes for UT3 and RL plugins to fix warnings-as-errors build 2016-06-27 anonym 0577ab7 Show the SSL cert's SHA1 digest in the "SSL Verification failed" prompt. Mikkel Krautz 4d1cd4e compiler.pri: enable warnings-as-errors by default if inside Mumble buildenv. a297a24 Merge PR #2374: ViewCert: use QChar::fromLatin1 instead of QChar::fromAscii. da39bfb ViewCert: use QChar::fromLatin1 instead of QChar::fromAscii. e54e7cf Merge PR #2372: Show the SSL cert's SHA1 digest in the "SSL Verification failed" prompt. 2016-06-26 Mikkel Krautz aa34251 plugins/ut3: fix warnings-as-errors build for UT3. c4301b5 plugins/rl: fix warnings-as-errors build for Rocket League plugin. 2016-06-25 Mikkel Krautz 27abc98 OverlayClient: hide QGraphicsPixmapItems when FPS and time are disabled instead of setting an empty QPixmap. 2016-06-24 Davide Beatrici c1b91cf plugins/ql: Native front and top vectors Mikkel Krautz d21de05 Merge PR #2361: plugins/ql: Native front and top vectors ea372de Merge PR #2276: Document and implement Murmur locking strategy 18ccbf1 docs/MurmurLocking.md: add documentation for Murmur's locking strategy. c73df62 Fix locking in the unknown peer path of UDP receive in Server::run(). cb446f1 Server: convert bUdp to use QAtomicInt for proper synchronization. cf6a5b7 Hold write lock on qrwlVoiceThread when writing to bDeaf, bMute and bSuppress. c8bd941 Hold write lock on qrwlVoiceThread when writing to bSelfDeaf, bSelfMute and ssContext. 80c6e31 Writing to User->sState requires holding qrwlVoiceThread. 9dfca42 Add Mutex internal to BanwidthRecord. b1285fc Ensure all ACL write operations hold qrwlVoiceThread. cfb535a Add missing ACL cache lock to Server::processMsg. 3be686c Fix User->qmWhisperRedirect qrwlVoiceThread locking. f03b74d Add mutex for csCrypt usage in Murmur. f260bd1 Implement correct write locking for addChannel/removeChannel/link/unlink. 5c0c8d8 Add documentation for qrwlVoiceThread. b33e1ac Rearrange code in Server header. f66b0d3 Rename qrwlUsers to qrwlVoiceThread. 91dc3d3 Move counter variable in processMsg into Opus condition. 77ddc01 Move processMsg's 'c' Channel pointer into 'normal speech' code path. d6d6f6f Refactor use of 'p' User pointer used in foreach loops. f696ddc Server: refactor bandwidth check in processMsg. 2016-06-23 Davide Beatrici ed8748d plugins: update memory addresses retrieval to use procptr32_t/procptr64_t. Davide Beatrici b1a9a36 plugins/rl: Plugin update for game's latest version Mikkel Krautz ff09c04 Merge PR #2360: plugins/rl: Plugin update for game's latest version f28e9b7 Merge PR #2349: plugins: update memory addresses retrieval to use procptr32_t/procptr64_t. 51af785 Merge PR #2354: plugins: add arch-specific mumble_plugin_win32.h variants dce83ca Merge PR #2356: overlay_gl: call glDrawArrays with GL_TRIANGLES instead of GL_QUADS. 557dbae Merge PR #2355: overlay_gl: unmask framebuffer color components in drawContext(). 5a50bb2 Merge PR #2358: Transifex translation update 2016-06-20 Mikkel Krautz 6c2cf49 plugins.pri, mumble_plugin_win32.h: add CONFIG(no-plugin-legacy-ptr) to disable use of non-explicit mumble_plugin_win32.h header. c450c3b plugins/rl: convert plugin to use 'mumble_plugin_win32_x86.h'. 9d7ead3 plugins: add distinct header files for x86 and x64. 2016-06-19 Mikkel Krautz b16e5a1 overlay_gl: unmask framebuffer color components in drawContext(). e13d6c9 overlay_gl: call glDrawArrays with GL_TRIANGLES instead of GL_QUADS. 2016-06-15 Mikkel Krautz 07559e2 Merge PR #2333: Timer: use boost::chrono::steady_clock as the underlying monotonic timer. ab6b4b6 Merge PR #2342: Implement uname.pri and use it to detect FreeBSD on both Qt 4 and Qt 5 2c2744e Merge PR #2343: .mailmap: update dekarl's info. a9384f1 Merge PR #2344: Remove old-style license header from WoW plugin. 2016-06-11 Davide Beatrici 5271180 plugins/gtav: Plugin update for game's latest version Mikkel Krautz f4ca0cf Merge PR #2345: plugins/gtav: Plugin update for game's latest version 64f1c09 Remove old-style license header from WoW plugin. 09d2942 .mailmap: update dekarl's info. 5f2122c Use 'contains(UNAME, FreeBSD)' instead of 'freebsd' (mkspec) to detect FreeBSD. 2550c4f uname.pri: introduce uname.pri, and use it in various .pri files. 04b2635 Merge PR #2341: scripts/mkini.sh: consider semicolons as comments to fix .ini generation. f6a0138 scripts/mkini.sh: consider semicolons as comments to fix .ini generation. d840fa7 Merge PR #2335: Murmur: use non-forceful disconnect when encountering SSL handshake errors on Qt 5. 3897c79 Murmur: use non-forceful disconnect when encountering SSL handshake errors on Qt 5. c738f7b Merge PR #2340: plugins/ql: Plugin update for game's latest version 2016-06-10 Davide Beatrici 3e7b0ba plugins/ql: Plugin update for game's latest version 2016-06-07 Mikkel Krautz a3275f5 plugins/l4d2: fix build. 2016-06-06 Mikkel Krautz 8929c74 Timer: use boost::chrono::steady_clock as the underlying monotonic timer. f491aac Merge PR #2221: Murmur.ice: add updateCertificate() method. 6091625 Murmur.ice: add updateCertificate() method. 18e8014 Cert: add ERR_clear_error() to the end of initializeCert(). 0a5b68c Merge PR #2326: Murmur: add no-op userTextMessage signal for DBus to silence connect()'s error log output. 5467f3a Murmur: add no-op userTextMessage signal for DBus to silence connect()'s error log output. 9b5d066 Merge PR #2327: plugins/l4d2: Plugin update for game's latest version and identity support 2016-06-04 Davide Beatrici e652888 Plugin update for game's latest version and identity support Mikkel Krautz fd9c794 Murmur: add no-op userTextMessage signal for DBus to silence connect()'s error log output. 2016-06-03 Mikkel Krautz 5640f0a Merge PR #2323: Transifex translation update 2016-05-31 Davide Beatrici d2416ca Fixed inverted Z (left/right) value Mikkel Krautz 3e1d7ed Merge PR #2320: [Rocket League] Fixed inverted Z (left/right) value 2016-05-29 Davide Beatrici b147287 Plugin update for latest version of Rocket League c695463 Positional Audio support for Grand Theft Auto V 7591b5c Move "escape" function to mumble_plugin_utils.h header decab3f Plugin update for latest version of Rocket League John Marion 61ff49f Correctly denote serverid as optional on manpage 2634d62 Remove unnecessary .BI man macro 775b391 Document -disablesu option for murmur on manpage Mikkel Krautz 44ea8c8 Merge PR #2315: Add GTA V plugin to the build and to the installer. 7a89a2c Add GTA V plugin to the build and to the installer. eb0a2a0 Merge PR #2314: Plugin update for latest version of Rocket League f38363f Merge PR #2310: Positional Audio support for Grand Theft Auto V d3e1c68 Merge PR #2308: Move "escape" function to mumble_plugin_utils.h header 88825e3 mumble.pro: query pkg-config for protobuf instead of using -lprotobuf. fa92480 man/murmurd.1: add paragraph about what disabling SuperUser means. 2016-05-26 Davide Beatrici da1d081 Plugin update for latest version of Rocket League Mikkel Krautz 3eec33a Merge PR #2307: Plugin update for latest version of Rocket League 2016-05-22 Frank Engler <9x6@users.noreply.github.com> fd24ee9 ServerDB.cpp: refactor code writing SuperUser password into DB 16f7323 murmurd: command line argument "-disablesu" disables SuperUser Mikkel Krautz 7164d3d Merge PR #2297: mumble.pro: query pkg-config for protobuf instead of using -lprotobuf. cb2b5ee mumble.pro: query pkg-config for protobuf instead of using -lprotobuf. 708ace4 Merge PR #2298: man/murmurd.1: add paragraph about what disabling SuperUser means. e067c4d man/murmurd.1: add paragraph about what disabling SuperUser means. aaf3666 Merge PR #2301: Document -disablesu on murmur manpage f990b90 Merge PR #1779: Disable SuperUser 7b54ad0 Merge PR #2124: MumbleSSL: add a sanity check for QSsl loading a different version of OpenSSL than we're linked against. 4aa902d MumbleSSL: add a sanity check for QSsl loading a different version of OpenSSL than we're linked against. 2016-05-21 John Marion 5e66269 Correctly denote serverid as optional on manpage 89643b4 Remove unnecessary .BI man macro 84de178 Document -disablesu option for murmur on manpage Mikkel Krautz b82b6eb Merge PR #2281: Plugins, VersionCheck: don't pass WTD_LIFETIME_SIGNING_FLAG to WinTrust APIs. f3a02c3 Plugins, VersionCheck: don't pass WTD_LIFETIME_SIGNING_FLAG to WinTrust APIs. 2016-05-19 Davide Beatrici e023f45 plugins/bf4: Added Squad State value a1fe822 Positional Audio support for Battlefield 4 (x86) Kevin Rohland 3be04af Allow only one instance from UserLocalVolumeDialog per User Mikkel Krautz a779870 Merge PR #2284: Allow only one instance from UserLocalVolumeDialog per User 2f34ff7 Merge PR #2289: Net: use QLatin1String instead of implicit char * -> QString conversion Ban::toString(). dac910b Net: use QLatin1String instead of implicit char * -> QString conversion in Ban::toString(). 38dbec1 Merge PR #2287: plugins/bf4: Added Squad State value c522cff Merge PR #2144: Ban logging verbosity ec87aa6 Merge PR #2286: Add BF4 x86 to the build and to the installer. 8af5c23 Add BF4 x86 to the build and to the installer. d157e71 Merge PR #2285: Positional Audio support for Battlefield 4 (x86) spede 5d1a56e Add logging for ban removals/changes. 2016-05-18 Mikkel Krautz 2a20e16 Merge PR #2280: scripts/generate-CHANGES.py, CHANGES: update script to use commit date rather than author date. c71461e scripts/generate-CHANGES.py, CHANGES: update script to use commit date rather than author date. bed423e Merge PR #2275: plugins/bf4: fix JSON encoding. 0c07d25 plugins/bf4: fix JSON encoding. 0354aeb Merge PR #2282: Transifex translation update abb770b Merge PR #2265: Update CHANGES. 25becb6 Update CHANGES. 52f385c Merge PR #2279: Use # for license header instead of // in various .pro files. 60465f5 Use # for license header instead of // in various .pro files. 2016-05-13 Mikkel Krautz 23b4e85 Merge PR #2270: scripts/generate-CHANGES.py: fix capture group in gitMailmapLookup's contact regexp. b0005c4 scripts/generate-CHANGES.py: fix capture group in gitMailmapLookup's contact regexp. 3b1ad3a Merge PR #2268: Transifex translation update 2016-05-11 Davide Beatrici e4c91e2 Fixed Squad/Squad Leader pointers (#2267) 2016-05-10 Mikkel Krautz 37c4749 Merge PR #2264: Add Joeliam to .mailmap and sync AUTHORS. c1251fd Add Joeliam to .mailmap and sync AUTHORS. 084da53 Merge PR #2256: Update the Mumble tree to use LICENSE.header for all license headers 19214a4 Add remaining files that use the old-style license header to 3rdPartyLicenses. 78a46ea src/murmur_grpcwrapper_protoc_plugin: update to use LICENSE.header. 313be4b plugins: update to use LICENSE.header. 63f2bd8 scripts: update to use LICENSE.header. 84aa1ae 3rdparty: update to use LICENSE.header. af43d61 mumble_proto: update to use LICENSE.header. d2bda14 src/mumble: update to use LICENSE.header. 4e2c7e3 macx: update to use LICENSE.header. 5f71ce6 src/mumble_exe: update to use LICENSE.header. ce9e4c7 *.pri: update to use LICENSE.header. e45183b toolchain: update to use LICENSE.header. 35358ca overlay_winx64: update to use LICENSE.header. 3dad85f overlay_gl: update to use LICENSE.header. 76f3168 g15helper: update to use LICENSE.header. 049fcae overlay: update to use LICENSE.header. 54c28d3 src/murmur: update to use LICENSE.header. 395c084 src: update to use LICENSE.header. f3d19ad LICENSE.header: update default license header to use "2005-2016". f4e3ca9 Merge PR #2250: Various OpenBSD fixes 3283c43 Add python.pri to detect the system's Python binary. Use it in mumble.pro. 1f72548 Fix mumble_pch.hpp for OpenBSD. cc48689 PulseAudio: remove OSS headers from PulseAudio.cpp. 2016-05-09 Davide Beatrici 2854b32 Positional Audio support for Battlefield 4 (x64) John Marion 4462701 Touch up Mumble and Murmur manpages 6123439 Remove hardcoded IP whitelist for master server Mikkel Krautz 77b59e5 Merge PR #2262: Touch up Mumble and Murmur manpages 7072cb2 Merge PR #2257: Various C++11 fixes 39aebda Channel, ServerUser: make cast operator non-const. 69086d8 GlobalShortcut_macx: fix build in C++11 mode (strongly typed enums) 9b2bb22 Merge PR #2246: scripts/generate-CHANGES.py: add Python replacement for 'git2cl.pl'. ac716df scripts/generate-CHANGES.py: add Python replacement for 'git2cl.pl'. 11b2823 .gitignore: add .DS_Store. 656be8f Merge PR #2259: remove non-existent file from .gitignore 691d80a installer, plugins: add bf4 plugin to build and installer. 5b6bdac Merge PR #2258: Remove hardcoded IP whitelist for master server a30f1dd Merge PR #2255: Positional Audio support for Battlefield 4 (x64) Tim Cooper 412c0d1 Document undocumented fields in Mumble.proto (#2261) 2016-05-08 Joel Kees 192a89c Fix Left 4 Dead 2 plugin and clean up plugin code Mikkel Krautz c8d136f Merge PR #2248: Fix Left 4 Dead 2 plugin and clean up plugin code 790bd79 Merge PR #2253: Transifex translation update 89097d5 Merge PR #1682: murmur grpc support 4a419de grpc: limit gRPC to Qt 5. 8d5236f grpc: add log message in GRPCStart, so users know that GRPC is enabled. e93d566 grpc: use single-line comments for docs in MurmurGRPCImpl.cpp. 88a6653 grpc: use single-line doxygen-style comments in RPCSingleStreamCall top-level comment. cd6b532 grpc: fix implicit QString conversions in setChannelStateGRPC. 9128351 grpc: rename GRPC-specific Server::setChannelState method, and add docs. c7cd28b grpc: indent pre-declaration of classes in MurmurRPC::Wrapper. 505df4f grpc: make mServer and qtCleanup members in MurmurRPCImpl conform to coding style. a02ef1b grpc: fix Server::sendTextMessageGRPC and Server::setChannelState to build in non-C++11 mode. 9fafa9a grpc: make member variables in RPCCall and RPCSingleStreamCall coding style conformant. 71f90de grpc: rename remaining MurmurRPCImpl member variables to be coding style conformant. d8710c1 grpc: rename aV1Service to m_V1Service. 32b8abd grpc: rename mCQ to m_completionQueue as per our coding style. 31928ca grpc: use single-line comments for MurmurGRPCImpl.cpp system overview. 83c0b09 grpc: rename RPCStart and RPCStop to GRPCStart and GRPCStop. a107fb3 grpc: fix formatting of textMessageFilter result handling. ee1988e grpc: rename GRPC-specific Server::sendTextMessage to Server::sendTextMessageGRPC(), and add docs. 9c55e95 grpc: mention that gRPC is experimental in the INSTALL file. 7666447 grpc: rename murmur_grpc_wrapper_gen to murmur_grpcwrapper_protoc_plugin. 4c54bb2 grpc: update license headers to use the new-style header. 75d68fb grpc: sync murmur.ini.grpc with murmur.ini. 49f9833 grpc: shell out to 'which grpc_cpp_plugin' to find grpc_cpp_plugin path in murmur_grpc.pro. 41885a2 grpc: ignore unused parameter warnings from MurmurRPC.grpc.pb.h. 772191f grpc: use RegisterService instead of RegisterAsyncService. 46e954d grpc: remove 'gpr' from PKGCONFIG. Tim Cooper 0b0ce8e remove non-existent file from .gitignore 21f9a29 grpc: fix uninitialized RPCCall reference count 1af50bd grpc: do not use CONFIG for grpc block edcd4cd grpc: require protobuf>=3 59bda9b grpc: rename murmur.ini.grpc to murmur.grpc.ini 750f08d grpc: do not include generated proto wrapper 4a0f287 grpc: fix grpc CONFIG flag ff109d9 grpc: integrate murmur_grpc_wrapper_gen into qmake build 97741f6 grpc: move grpc-specific ini options to separate file 77e0bc2 grpc: fix compilation errors 49a6d35 grpc: rename grpcCert, grpcKey to grpccert, grpckey 7c7ccfb grpc: change "no-grpc" build flag to "grpc" 9bd982c grpc: add TextMessageFilter method comment 805c047 grpc: implement TextMessageFilter 19537ac grpc: allow connections to be secured using TLS 6c68dec grpc: only allow users to trigger explicitly added context actions 92320bf grpc: add comment about incomplete embedded protobuf messages af63163 grpc: fix crash when writing to a stream that hasn't completed its previous write d4b799d grpc: add RPCSingleStreamCall base for single-streaming wrappers 1253f77 grpc: add helper method "end" to RPCSingleSingleCall 8401b51 grpc: document more of the RPC protocol 28fc480 grpc: add internal system overview 0cbd230 grpc: reduce amount of generated wrapper code 7514247 grpc: change RPCCall.mRefs to atomic 23c931d grpc: fix potential use after free issue 6dfbce2 grpc: normalize RPC method names b52d4df grpc: remove ContextAction.Context.None ab09ba3 grpc: fix ACL.allow, ACL.deny, ContextAction.context bitmasks b10811a grpc: update RPC service comments f87267f grpc: switch to versioned API 56e0507 grpc: fix stream referencing counting issues 5805883 grpc: fix crash in listener cleanup method d65eccf grpc: document "no-grpc" config flag b69e5f8 grpc: periodically clean up old listeners c7686ff grpc: fix possible use-after-frees with the GRPC wrappers 89b487c grpc: reduce compile warnings e953933 grpc: move grpc protobuf into separate sub-project 9d26e93 grpc: remove TODOs e35f427 grpc: move ChannelService_Update logic to RPC.cpp 3f47647 grpc: protocol documentation 47a52f2 grpc: remove event listeners on write failure b558149 grpc: split AudioService.SetRedirectWhisperGroup into two methods cccbec3 grpc: fix several TODO items 7250656 grpc: fix build problems with GRPC 0.10 80930b5 grpc: support setting temporary groups from authenticator 3225be0 grpc: update some protocol field types to be more descriptive b331245 grpc: support texture in DatabaseServer methods 37931ca grpc: change TreeService.Get to TreeService.Query (allows for query options to be added in the future) 8f830b6 grpc: TODO fixes 15f8258 grpc: normalize some grpc status codes thrown by Must* 7df16ed grpc: move TextMessageService_Send logic to RPC.cpp cace36d grpc: simplify TextMessageService_Send a39df33 grpc: fix ConfigService.GetField, ConfigService.Get, LogService.Query not working for stopped servers 8192e55 grpc: fix ConfigService.SetField not working for stopped servers 5696efb grpc: simplify ChannelService_Add f080702 grpc: simplify ChannelService_Update 4a56a24 grpc: add User.Kick.actor 060ae78 grpc: add a lock around the authenticator when it does a write-read c53134d grpc: simplify authenticator slots acfa8e8 grpc: update docs 9b84646 grpc: change Server.uptime to Update from uint32 a1d428d grpc: minor cleanup 17498d1 grpc: fix ServerService.Get for stopped servers 4e6b3b9 grpc: move meta event sending to new method 11eefc0 grpc: remove proto field Authenticator.Response.Initialize.updating 5d9d1af grpc: remove old authenticator upon error or new authenticator fd52a05 grpc: make RPCCall.error's argument const ecf254f grpc: implement MurmurRPCImpl::getRegisteredUsersSlot 02c7f74 grpc: implement MurmurRPCImpl::registerUserSlot 70cb2b7 grpc: implement MurmurRPCImpl::unregisterUserSlot 541312d grpc: implement MurmurRPCImpl::setTextureSlot 4455db8 grpc: implement MurmurRPCImpl::setInfoSlot a813b13 grpc: implement MurmurRPCImpl::idToTextureSlot 743ca4a grpc: implement MurmurRPCImpl::nameToIdSlot d929e70 grpc: implement MurmurRPCImpl::idToNameSlot 55cb261 grpc: implement MurmurRPCImpl::getRegistrationSlot a5cbcfa grpc: add Find message to Authenticator 5bb9a4f grpc: include user certificate chain in authenticator request ac2418f grpc: start AuthenticatorService.Stream implementation d63b5c7 grpc: add "request", "response" to stream-stream wrapper 3af2bc8 grpc: rename "response" in generated code to "stream" 5b2f2b9 grpc: generate callback() for "stream-stream" RPC methods 5c071f0 grpc: change AuthenticatorService to a (hopefully) easier to use API cc59e82 grpc: add authenticator slot stubs 28e6041 grpc: implement ACLService.Get 57dc921 grpc: implement ACLService.Set 7f537d3 grpc: implement ConfigService.GetDefaults 9b6eaed grpc: implement ConfigService.Get ba30ef1 grpc: implement ConfigService.SetField 729fad4 grpc: implement ConfigService.GetField 51b5050 grpc: replace individual Config fields in favour of a map 59340c3 grpc: implement ACLService.GetEffectivePermissions 24e9400 grpc: implement ACLService.RemoveTemporaryGroup cf77593 grpc: implement ACLService.AddTemporaryGroup 39940a4 grpc: finish ServerService.Events implementation e279bef grpc: start ServerService.Events implementation 95d4ab4 grpc: implement AudioService.SetRedirectWhisperGroup e9ec7d7 grpc: implement LogService.Query 12e70ed grpc: implement BanService.Set 62a627e grpc: implement BanService.Get b5afebe grpc: implement MetaService.Events 2acd97a grpc: remove ContextActionService.Events listeners after they fail 39984f6 grpc: add timer that will trigger cleanup function every minute 3a1da38 grpc: add callback() method to single-streaming calls, reenable ContextActionService.Events 0fdb1df grpc: RPCCall::error does not need to be a function anymore a89333d grpc: pass grpc success variable to callback functions 1b3cdd8 grpc: re-enable streaming wrapper generation c386db3 grpc: rework non-streaming call wrappers, temporary disable streaming calls f8677db grpc: implement DatabaseService.Query 3fdd054 grpc: implement DatabaseService.Verify 3b44029 grpc: implement DatabaseService.Deregister 9d0899e grpc: implement DatabaseService.Register dee4fbd grpc: implement DatabaseService.Update cb85565 grpc: implement DatabaseService.Get 3f9d0a9 grpc: implement ServerService.Query. e8125d6 grpc: rename channelToRPCChannel,userToRPCUser to ToRPC d5e8ef3 grpc: implement UserService.Query 48f9b00 grpc: implement ChannelService.Query. 45f90c0 grpc: implement TreeService.Get. a8d772a grpc: implement targeting of TextMessageService.Send messages c748dbb grpc: implement UserService.Update 9269ab9 grpc: implement ServerService.Start 0462dff grpc: implement ServerService.Remove 3b9bf4f grpc: implement (rough) ContextActionService.Events ba0df3e grpc: add basic meta and server event slots to MurmurRPCImpl b6aca49 grpc: implemented streaming generator, temporary removed certain streaming RPC methods d711b8c grpc: implement ServerService.Get f952591 grpc: implement ServerService.Stop a3c80ad grpc: implement ServerService.Create cba1db8 grpc: replace "response->FinishWithError + return"s with "throw"s fb97e5e grpc: implement ContextActionService.Remove b929b2d grpc: implement ContextActionService.Add 3a7b724 grpc: replace old code with Must* functions 6916629 grpc: add MustChannel for MurmurRPC.Channel 082e145 grpc: add MustUser for MurmurRPC.User message e233c53 grpc: add exception hander around *_Impl to ease error handing 0041ab3 grpc: switch to async grpc API, change naming of service methods d181c0d grpc: add *_Init to protoc-gen-grpcwrapper 05a4501 grpc: remove MurmurRPCImpl and AsyncService from _Impl signature d749e0f grpc: add protoc-gen-grpcwrapper.cpp d681631 grpc: implement ChannelService.add 08971f3 grpc: implement ChannelService.remove ab3c520 grpc: implement ChannelService.update bb86b3a grpc: implement ChannelService.get b9c2169 grpc: fix incorrect status 32ec04b grpc: start ChannelService implementation f68b35d grpc: implement UserService.kick 418ff98 grpc: implement UserService.query 2c0b3dc grpc: start UserService, implement UserService::get 5a7536c grpc: add broadcasting to TextMessageService.send 776c084 grpc: start implementation 7b0bb82 grpc: switch to proto2 from proto3 8d46083 grpc: do renames and add notes to MurmurRPC.proto 375d0ae grpc: add first MurmurRPC protobuf draft 3960228 grpc: add empty MurmurRPC.proto file 2016-05-07 Mikkel Krautz 0d35a9c scripts/ts2html.pl: remove. 6d2364a scripts/qt.conf: remove. 2016-05-06 Mikkel Krautz aedb1a3 Re-generate and update AUTHORS file. d475b44 scripts/generate-AUTHORS.py: use pyuca for sorting to get deterministic output on all platforms. 2016-05-04 Mikkel Krautz ba1a189 GlobalShortcut_win: fix access to nxboxinput in EnumDevicesCB. 2016-05-01 James Fraser 0288120 Don't expose SSL secrets over Ice/D-Bus. Mikkel Krautz a1a969e AudioOutput: make playSample() time out after 1 second if no AudioOutput is present. a50a120 PulseAudio: fall back to default device if chosen device is no longer present. 8dbc793 GlobalShortcut_win: only poll XboxInput if there are XInput devices present. 3434ff8 .mailmap: update James Fraser alias. 9f20c21 scripts/generate-AUTHORS.py: use 'origin/branch' instead of just 'branch' in git log call. 2016-04-30 Davide Beatrici cb8cbd0 Plugin update for latest version of Quake Live Tim Cooper 6a3f2ef add note about allowping to murmur.ini regarding information exposure 2016-04-28 Mikkel Krautz 5c17181 Move smallft to 3rdparty/smallft-src and add to 3rdPartyLicenses. b7271c2 Log: remove 'console' parameter of postNotification(). cd8fbbd Log_unix: use plain log message for KDE notifications. a2e6cb8 Log_unix: always send plain text notifications via org.freedesktop.Notifications. 2016-04-26 Davide Beatrici 6f843e5 Plugin update for latest version of Rocket League James Fraser 68547c9 Fix missing whitespace in if statement 25422e7 Add comments to some conditionals in initializeCert() Tim Cooper b347f7e fix crash caused by decoding all MIME data formats in RichTextHtmlEdit 2016-04-25 Davide Beatrici 6f1b851 plugins/ql: Added Spectator state value ccb1ff7 plugins/ql: Added camera values for a more precise PA 47a6e32 plugins/ql: Fix host address string and add comments 4f7af50 Positional audio support for Quake Live Mikkel Krautz 3a9edb8 plugins.pro: add ql plugin to the build. 2c65953 installer: add ql.dll plugin to the installer. 2016-04-17 Mikkel Krautz 0502fa6 Drop OS X specific '64-bit' check. 72ef902 Add build number to OS X OSInfo. 48cc538 Fix 'rl.dl' typo in Plugins.wxs. 2016-04-15 Davide Beatrici 043a7d7 Plugin update for latest version of Rocket League 2016-04-10 Davide Beatrici 8017a01 l4d2: Plugin update for latest game version 80d0354 Positional Audio support for Rocket League Mikkel Krautz 6be0de4 installer: add 'rl.dll' to Plugins.wxs. 95b3cc1 plugins.pro: add 'rl'. 0393ed3 mumble_plugin.h: use _M_IX86 instead of (typo'd) _M_X86. 2016-04-01 John Marion 4e9f412 Remove unused jitter reporting code Mikkel Krautz ef72e3e overlay: remove Far Cry 4 from the default blacklist. 2016-03-14 Mikkel Krautz a59e166 Do not enable warnings-as-errors by default. 2016-03-13 Mikkel Krautz a24b8c3 Do not use _FORTIFY_SOURCE for debug builds since they're not built with optimizations. b03a689 Add .mailmap file and us it in scripts/generate-AUTHORS.py. 6beb46e Move src/bonjour to 3rdparty/qqbonjour-src and add its license to the third party license list. 2016-03-07 Stefan Hacker 3643c24 Add missing iMask to Ban equality operator Mikkel Krautz 25f0e1f Remove OpenSSL 0.9.x compatibility hacks. 2016-03-06 John Marion 8b4ed1e Remove timer to run reportJitter. 2016-03-05 Mikkel Krautz 888a459 GlobalShortcutWin: fix memory leak of 'di' in new XInputCheck code path. 2016-03-04 Mikkel Krautz bc12e8e XInputCheck: add string.h and stdlib.h includes to xinputcheck.cpp. b817122 GlobalShortcutWin: add issue references to comment describing recent Windows 10 DirectInput/XInput breakge. cbff56b XInputCheck: fix missing file reference in the README. da12c2b XInputCheck: add comment at the top of the file describing development practices and origin of the code. 25b88a7 XInputCheck: add documentation for XInputCheck_IsGuidProductXInputDevice. 0f80533 XInputCheck: add XInputCheck_ClearDeviceCache(). 2016-03-03 Mikkel Krautz e174f8d compiler.pri: fix architecture checks for force-x86-toolchain and force-x86_64-toolchain builds. 6f1331b GlobalShortcutWin: Exclude XInput devices from DirectInput. 2016-02-25 Nick Heindl 93427af Fix typo in comment: Issue #2070 2016-02-23 John Marion f5e03d6 Fix relative paths for Murmur -ini switch 2016-02-21 John Marion 53107ca Fix building Mumble on unix with no-dbus Mikkel Krautz 999b59b Add LuaMilkshake to AUTHORS. 2016-02-20 Mikkel Krautz e3b14f3 themes/Mumble: sync with mumble-theme submodule. 4b3746a Add Tim Visée to AUTHORS. 34cbd3c compiler.pri: on Windows, treat MSVC linker warnings as errors. 3b2a169 Simplify LICENSE file, add LICENSE.header and add AUTHORS. Tim Visée b4589b4 Add README.md for GitHub 2016-02-17 Mikkel Krautz 0840dd4 Fix OpenSSL intialization. 0c08e73 compiler.pri: pass '-compress 9' to rcc. 2016-01-31 Mikkel Krautz 1aae05e TextToSpeech_unix: use Mumble's language setting, or the system locale for TTS language. bd8f92b Move HTML filtering to a separate shared class. Tim Cooper 56fc9de Remember the last directory used for saving images from the chat log 8722bdd Use a lossless image format when saving chat log images that do not have a file extension 2016-01-27 Stefan Hacker cffa565 Fix warning typo reported in #2087 2016-01-10 Mikkel Krautz 58c06f2 Fix Murmur on Windows DoS as described in Mumble-SA-2016-001. 2016-01-05 Mikkel Krautz c22393e Messages, Murmur.ice: make username checking case insensitive throughout Murmur. 2016-01-02 Mikkel Krautz c56cb01 mumble.pro: use separate libsndfile libs on Windows. 2016-01-01 Mikkel Krautz 6e16502 Update the Copyright year range for The Mumble Developers throughout the tree. 7a33318 About: update copyright year range to 2005-2016. 50bc11d Update LICENSE for 2016. Happy new year! 3a18e13 compiler.pri: add CONFIG(verbose-linker) option for diagnosing MSVC runtime library issues. 2015-12-30 Mikkel Krautz 143bf86 AppNap: only declare 'appNapSuppressed' static variable when AppNap is available. 7a82dc9 Plugins: remove unused url parameter from fetchedUpdatePAPlugins slot. ad6acf2 GlobalShortcut_win, mumble.pro: remove use of HardHook in GlobalShortcut_win. 17ddc1a VersionCheck: use updated WebFetch::fetch() for snapshot downloads. e82debb 3rdparty/opus-build: re-structure qmake logic for including SSE, SSE2 and SSE4.1 sources into the build. 9652f7f compiler.pri: disable warnings-as-errors when MSVC static analysis is enabled. acb69be Update WebFetch, and its users, to use the new service hostnames and endpoints, as well as HTTPS. bd49fa5 CrashReporter: use new service hostname and endpoint for the crash reporter service. 3910dc9 Remove all REPORT_JITTER-related code. 9db3015 Usage: use new usage service hostname and endpoint, and use HTTPS. 2015-12-28 Mikkel Krautz 2857d71 Translation update 8eec7cc Overlay_win: silence MSVC warning about potentially uninitialized local variables. d0ced44 Mumble: implement lock file mechanism for Windows. a3ad0c5 installer: use 'The Mumble Developers' as ProductManufacturer in the Windows installer. 7d4fe6c man: refer to The Mumble Developers as the Mumble authors in our man pages. a97c4bb 3rdparty/minhook-build: disable third-party warnings by default in MinHook. 2015-12-27 Mikkel Krautz 69cdaee MainWindow: only allow toolbar dragging in the 'custom' layout. 2015-12-26 Mikkel Krautz 7f37b71 GlobalShortcut_win: NULL-initialize xboxinput and gkey member variables. 25ceebb MainWindow: only allow layout to be changed via settings. 173b68a Update copyright strings in .rc and .plist files to refer to 'The Mumble Developers'. a2b7020 About: change 'The Mumble team' to 'The Mumble Developers', as used in our license. 33f8448 Murmur: allow both bitmasked version and version string when setting 'suggestversion' via RPC. da8a95e 3rdparty/opus-build: only enable OS X SIMD for x86-64 (non-universal) build. 4e53e6f AppNap: fix build for OS X Universal, which uses the 10.4 SDK. 3e680f7 Update themes/Mumble submodule and themes/MumbleTheme.qrc to point to latest mumble-theme. 1719496 ThemeInfo: fix loading of platform-specific QSS files. 7cb6bb1 3rdparty/opus-build: enable use of SSE and SSE2 intrinsics in Opus on OS X. 779496c AppNap: add AppNap support for OS X. Natenom b83316a Show self mute/deaf, global mute/deaf, prio speaker, user left channel and disconnected states in linked channels. 2015-12-25 Stefan Hacker aa92699 Revert "Settings: disable 'shortcut/windows/xbox/enable' by default, disabling XboxInput." 1070b40 Fix use of wrong calling convention on xboxinput function pointers 2015-12-24 Stefan Hacker c2bbcd5 Fix XboxInputState being to small for XInputGetStateEx calls Mikkel Krautz fe81316 Settings: disable 'shortcut/windows/xbox/enable' by default, disabling XboxInput. abdb500 murmur: exit(1) when encountering a qFatal() when using syslog logging. 608e802 GlobalShortcut_win, XboxInput: implement native XInput support in GlobalShortcut_win. df28734 GlobalShortcut_win: add PID/VID blacklist for misbehaving devices. 703f8c7 murmur: exit with status code 1 on fatal error. 08af66d ConnectDialog: disable ping and host lookups when using a proxy. 2015-12-20 Mikkel Krautz 1bcea4e GlobalShortuct_win: warn if a device takes more than 1 second to poll via DirectInput. 9295be4 Update Opus to 1.1.1. 2015-12-13 Mikkel Krautz 4090c21 Settings: enable expert mode by default for 1.3.0. 2015-12-12 John P 37618b7 fix unix ub celt build Matt Hamilton 40868d4 Update svg URL(s) from sourceforge to github Mikkel Krautz 2a31708 GlobalShortcut: only build in the OS X-specific AXIsProcessTrustedWithOptions check if we're on a 10.9 or newer SDK. 23fa9b3 AudioInput: ensure our encoders are reset correctly when using > 1 frame per packet. synapse84 f6b746e Migrate old Qt 4 data directory to new Qt 5 location 2015-12-09 Mikkel Krautz eaad2da Database: use separate QFile variables for legacy DB path and modern DB path. 2015-12-08 Jan Klass 31abc89 Add outlook to overlay blacklist Mikkel Krautz ba49ba5 Murmur: use OPENSSL_VERSION_NUMBER instead of OPENSSL_VERSION. 2015-12-07 Mikkel Krautz 42c0684 UserLocalVolumeDialog: subclass QDialog instead of QWidget. 7852dce GlobalShortcut: update help text for marking Mumble trusted for OS X Mavericks and greater. Natenom b582547 Show more information when a banned user connects doggone 925587a Unhide mumble.sqlite on non-Windows 2015-12-06 Roman Priesol 21673bf mumble.desktop: added missing semicolons 2015-12-01 Mikkel Krautz 197f13e RichTextEditor: inherit QApplication's stylesheet in RichTextHtmlEdit. 2015-11-30 Mikkel Krautz 77bb12f themes/Mumble: sync submodule. d793aa1 murmur.ini: document empty welcometext behavior. Natenom 9e8a40f Echo -> Echo cancellation in settings dialog 2015-11-29 Mikkel Krautz ce1df5d os_win.cpp: disable MSVC 2013's FMA-optimized math routines on Windows versions earlier than 8. 2015-11-28 Mikkel Krautz e8e7ed3 3rdparty: for CELT and Opus, define APPROX_FLOAT if -ffast-math is in CFLAGS. 551f109 PBKDF2: use 8 digits in OPENSSL_VERSION check. 711c2ec Murmur: forcefully disable PBKDF2 on OpenSSL < 0.9.9. 74ce74c mumble.pro: don't find OpenSSL via pkconfig here, it is already found via mumble.pri. f44b7df GlobalShortcut_unix: fix GCC deprecation pragmas for GCC 4.2. ed308af SSL: add const_cast to be compatible with OpenSSL 0.9.8. 5dac7e8 Net: GCC 4.2 on FreeBSD 9.3 does not have __builtin_bswap. 2fdbc83 toolchain/win32-msvc2013: only use native amd64 compiler if it is available. a5724cf installer: do not bundle D3DCompiler_43.dll and D3DCompiler_47.dll with Mumble anymore. 329afa3 main.pro, 3rdparty: remove fx11 from the Mumble build. 3763d59 overlay: replace use of Effects11 with direct use of our split HLSL shaders. 53a529c overlay: split the shaders in overlay.fx out into separate HLSL files. Tim Cooper fea39f2 Respect maximum channel user limits when joining server 2015-11-27 Mikkel Krautz 3762ad0 mumble.pro: fix g15 logic for detecting Windows and OS X. 2015-11-26 Mikkel Krautz 218c6a5 g15helper: statically link against runtime library on Windows. 8904591 g15helper: apply mumble.appcompat.manifest to mumble-g15-helper.exe. 2015-11-25 Stefan Hacker 6390946 Allow no-warnings-as-errors for vc too Mikkel Krautz ee43279 plugins/sto: fix signed/unsigned mismatch. aef9ef7 Settings: enable XInput 2 by default once again. 956a8ca GlobalShortcut_unix: request latest XInput 2 version by default. 2015-11-24 Kevin Rohland bd9bb66 Improve local user volume adjustment. Mikkel Krautz 58efe0c GlobalShortcut_unix, Settings: disable XInput2 by default. c52d1a3 compiler.pri: treat warnings as errors for MSVC (-WX). 114495e overlay: add runtime checks for offset overflow in D3D9. a3e7958 overlay: add runtime check for when GetFnOffsetInModule()'s return value would have overflowed its return type. 5f79a3e overlay: fix a few MSVC signed/unsigned conversion warnings. 150d096 os_win: fix conversion from size_t to DWORD. Tim Cooper 0b0c074 Allow users with Write permission to bypass channel user limits 2015-11-23 Mikkel Krautz 0214948 compiler.pri: ensure we only pass -pie as a linker flag. 514100d compiler.pri: fix erronous QMAKE_FLAGS overwrite. 3a356a2 overlay_gl: port to FreeBSD. 2015-11-22 Mikkel Krautz 0e4070c scripts/updatetranslations.sh: fix shebang to work on systems where bash doesn't live in /bin. 00090db Translation update f56143f mumble_pch.hpp: add missing networking headers to fix FreeBSD build. e9b240c mumble.pro: always disable G15 on FreeBSD. 80e0f96 GlobalShortcut_unix: fix build on non-Linux systems. 1f3b254 mumble.pri: use freebsd (mkspec) to check whether we're on FreeBSD, rather than checking the uname. b88728c compiler.pri: fixups for FreeBSD. bbd93e1 installer: remove support for merge modules. c19ec3f installer: remove support for the Intel compilers. 377d7cd rcc.pri: use manual quoting via escape_expand(\") instead of system_quote() to be compatible with Qt 4. 9222b9a installer: remove non-static installer logic. Tim Cooper c0879e5 Allow creating channel with a set maximum number of users b0c9521 Add saving of images from chat log 84b1bce Add per-channel user limit 07a142d Include actor when performing a user rename 2015-11-21 Mark Felder 30df2cb Revert 72038f6, add -lssl for FreeBSD Mikkel Krautz be7367f compiler.pri: undefine _FORTIFY_SOURCE before defiining it. b0d53e1 compiler.pri: unsure that all our compiler.pri CFLAGS and CXXFLAGS are also applied for Objective-C(++). 2015-11-20 Mikkel Krautz 8ea1740 CoreAudio: use '#pragma GCC' to be compatible with both GCC and Clang. 2015-11-17 Mikkel Krautz 82561a4 UserInformation: only implement decode_utf8_qssl_string()'s QStringList override for Qt 5 builds. 2757a0c Cert: disable old-style cast warning for the whole source file to fix GCC 4.2 build. 159aad4 Cert: fix old-style cast warning on older GCCs that disallow 'pragma GCC diagnostic' within functions. e94c8f7 Use Emoji One SVGs for our flag icons instead of FamFamFam. 2015-11-16 Mikkel Krautz 5feef96 Remove __int64_t define/undef dance from mumble_pch.hpp. Tim Cooper 4862897 Add maximum number of server users to control channel protocol 2015-11-15 Mikkel Krautz 1f6a1f2 ViewCert: only implement decode_utf8_qssl_string()'s QStringList override for Qt 5 builds. f5d72ba OverlayConfig: avoid implementing OverlayConfigDialogNew on OS X Universal. 9dba18f OSInfo: fix OS X version string formatting build error. 8ebd51a mumble.pro: add opus-src/celt and opus-src/include as -isystem headers. 8d2edb8 G15LCDEngine_helper: change size parameter in submitFrame() to qint64. 6c47ca7 compiler.pri: update non-universal deployment target to 10.7, as mandated by Qt 5.5. c25da2c OverlayUserGroup: fix build in OS X ifdef block. 147be10 Overlay: fix OS X pid comparison. a7e7e1b CrashReporter: fix build with -Werror. bcaebc0 CoreAudio: make it build with -Werror. 28d43b5 ApplicationPalette: add missing QDebug include. f931ef1 overlay_gl: add missing mach_override include for OS X. 9f85eeb Meta: cast rlim_t to unsigned long when format printing. 1e06692 Disable warnings by default for third party library mach-override. d02ea64 Convert icons/filter.txt to ASCII and sync licenses.h. 33f295f Update .gitignore to point to the new location of Ice-generated files. 2015-11-13 Stefan Hacker 5fb2573 Fix regression in last commit 2015-11-12 Mark Felder 7eb4987 FreeBSD can use pkgconfig too 2015-11-08 Mikkel Krautz f32343d Use %zd for ssize_t printing in OSS.cpp. 671598b Fix warnings in SharedMemory_unix when built with GCC 5.2.1 on i386. e4c80da Fix warnings in overlay_gl when built with GCC 5.2.1 for i386. 2015-11-02 Jan Klass c1b6110 Reorder server menu 2015-11-01 Jan Klass 21cd4dd Show Minimal View status in title 2015-10-31 Mikkel Krautz a6ac95b Do not warn about missing QT_INSTALL_TRANSLATIONS_DIR when no-embed-qt-translations is used. 86f97a9 Add warning about missing QT_INSTALL_TRANSLATIONS directory. 2015-10-28 Stefan Hacker 4795ae5 Fix qFatal message generation in Diffie Hellmann error path 12cb827 Fix Murmur.ice path lookup for ermine and osx bfe43e3 Drop -std=XXX directives for gcc e074dde Consistently use -Wall -Wextra -Werror for C++ and C b828a0a Fix warning in debug assertion 648f35b Fix remaining backend warnings in mumble c9c9d0e Fix remaining frontend warnings for mumble e0cb6e0 Fix overlay code related warnings in mumble f9b2db4 Fix various shadow warnings in mumble by renaming 3206530 Fix isystem compiler flag for celt 66ff6d6 Fix warnings in overlay_gl C code 39b8b07 Fix warnings in AudioOutput code 2062b24 Supress deprecation warning on XKeycodeToKeysym 1090423 Supress remaining old-style casts we incur from 3rd party headers. These should all be system headers but we still get these warnings from macro expansions which is kinda strange... 2015-10-27 Stefan Hacker 68205b9 Fix remaining warnings in murmur code 7b882d0 Fix warnings in murmur/Server.cpp 2015-10-26 Stefan Hacker 1a8175b Use intrinsic instead of inline asm in Net.h 234ed23 Fix "-isystem" flag use for mumble_proto e21ce49 Fix shadow warning in SignalCurry.h 99d37cf Fix warnings in Bonjour code 8ecc3d1 Fix warnings in shared connection code 2015-10-25 Stefan Hacker 51ab40a Fix warning due to missing default case in protocolToString 0db712e Make mkwrapper.pl write a banner to its generated files a8bed29 Modify generator for licenses.h to fix warnings in that file 73f6051 Modify generator for ApplicationPalette.h to fix warnings in that file d8889f8 Extract Ice compilation to murmur_ice lib 2015-10-18 Mikkel Krautz 10c902f Fix rcc.pri to work when there are spaces in our $PWD. 2015-10-17 Benjamin Neff e9f87a6 Add missing includes Fredrik Nordin 15f47f4 Add local per-user volume adjustment. Mikkel Krautz 75a25c4 ConnectDialog, ServerHandler: use HostAddress instead of QHostAddress when comparing addresses. 311f6f7 Auto-generate qrc file for embedded Qt translations when running qmake. 571b3c1 Use murmur_pch.h instead of mumble_pch.hpp in SSLCipherInfo.cpp. 2015-10-13 Mikkel Krautz a5009b6 Fix "RCC: Error in [...]" output that appears when running qmake. 2015-10-11 Jan Klass 495dfdc Replace obsolete Qt method with new method 8bf9b0a Make overlay FPS and clock positionable f732ec4 Add dwm and MouseKeyboardCenter to overlay blacklist 2015-10-04 Stefan Hacker f18c587 Translation update e8027bd Output more control channel encryption parameters Mikkel Krautz 8e195e1 Use lookup table for cipher info in 'Connection Info' dialog. 2015-09-27 Mikkel Krautz 13e494c Update sbcelt submodule to include fix for Xiph.org's git:// -> https:// transition. 2015-09-26 Mikkel Krautz 8bd3f76 Murmur: add support for EDH cipher suites, and for specifying Diffie-Hellman parmeters. 2015-09-22 Samuel D. Leslie 83da4f1 Replace all murmur.ini comments using hash (#) w/ semicolons (;) 2015-09-20 James Fraser 263607f Update World of Warcraft 32-bit plugin to build 20444 Jan Klass df44859 Add EpicGamesLauncher to default overlay blacklist Mikkel Krautz 612d6b5 Enable bHideInTray only on Windows versions below 7. 2015-09-19 Mikko Rantanen 52898aa Add Finnish translations to the wix project Mikkel Krautz 0f2c07c compiler.pri: increase MSVC PCH heap to up to 150MB (-Zm). 2015-09-08 Stefan Hacker 492293b Translation update 0528883 Add an experimental translator comment 47631f7 Enable LookConfig to detect changes to user themes folder 426edb6 Add link to user themes directory to LookConfig Jan Klass ce413bd Mark text as not to be translated 2015-08-20 Stefan Hacker 4794770 Fix Qt 5 compatibility of our Qt translation use 2015-08-19 asmolero d110e56 Fix grammar in default murmur.ini file Stefan Hacker 8169811 Fix broken range check in UserListModel::data 2015-08-06 Stefan Hacker d39e773 Fix setting an empty SuperUser password not creating an error 857e839 Translation update 2015-07-30 Tim Cooper 6fe5547 Don't initialize qsWelcomeText to "Welcome to this server" 2612b67 Don't display "Welcome message: " in client if none was sent. 2015-07-25 Stefan Hacker 4c16f25 Fix build on Linux (missing semicolon) e061b72 Ensure closeEvent for MainWindow is called on self-restart a11bccf Create themes directory if it doesn't exist 459022d Work around Windows permissions preventing Mumble restart 2015-07-21 Lartza 9f1b01a Fix small error in bEnableEvdev config Tim Cooper ebf6d23 Broadcast RPC-updated welcome text, even when it is empty 2015-07-14 Jordan Klassen 6c096c3 Add Logitech G-key support for use in global shortcuts Mikkel Krautz 3183da9 themes/Mumble: update submodule. e614a7b Document no-gkey CONFIG option. Sven-Hendrik Haase e8f627f Add fallback include path for speech-dispatcher 2015-07-12 Stefan Hacker 84a8bbc Fix build for Qt < 5.2 d275284 Add built-in "Mumble" theme and set "Lite" variant as default. 65c1aff Add generate-qrc.py script as a rcc -project replacement 83b6071 Add Theme support to Mumble 8bd78a5 Add ThemeInfo class for finding and loading Theme descriptions Mikkel Krautz 9c462ce Fix logging in Themes::getConfiguredOutput() to use the correct settings variable. 4ebfb90 Re-work Mac-specific style code in MainWindow.cpp and OverlayClient.cpp to work with the new theme system. 0a5d2ba Do not re-index themes in Themes::getConfiguredStyle() if both the theme and style are unset. 1408041 Use passed-in settings object in Themes::getConfiguredStyle(). 2015-07-11 Mikkel Krautz 35e58eb Add CONFIG(unix)'s new SYSTEM_INCLUDES to CFLAGS and CXXFLAGS. 81bc94c Add $MUMBLE_PREFIX/include and $MUMBLE_PREFIX/lib when in a build env in CONFIG(unix) builds. 2015-07-05 synapse84 0623c14 changed sourceforge links to mumble.info links 2015-07-04 Alex Krishnan 821486a Update OS X murmur docs Stefan Hacker 4fe1664 Handle some possible failure cases in overlay_gl 5acf4af Fix qmake warning about qdbus CONFIG option being deprecated d3d6920 Fix various warnings in Linux build 75feffb Suppress protobuf warnings in unix builds fac930b Suppress warnings in 3rd party codec builds Kevin Strasser 5aabbcd Normalize submodule URLs as https 2015-06-28 Will Tange 46cb8a3 Add `UserRenamed` `MsgType` b4d48ef Handle input device suspend/recovery gracefully 2015-06-26 Tim Cooper d19e266 Add period after "renamed to" message. 2015-06-19 Stefan Hacker a1ff21b Enable audio to be played during config restart query 2015-06-13 Nikita Puzyryov 6db171e Harden systemd service Stefan Hacker 3f0e2d2 Make change of language and users top settings require restart d08336e Add capability to trigger restart to ConfigDialog c431d37 Add self-restart capability to client 2015-06-09 Stefan Hacker 7fbe61e Strip schema and path component from new server addresses 2015-06-06 Mikkel Krautz 3d46634 installer: force uninstall before install. 2015-06-05 Stefan Hacker c84916f SSL: Fix build for Qt 5 versions before Qt 5.3 e934c1e Fix dual-stack UDP on Windows and improve dual-stack detection 9a426b1 Fix Qt 5 mumur incorrectly binding to IPv6 only by default James Fraser 7e4639c Add rules to compiler.pri to fix FreeBSD builds w/ Qt5 Mikkel Krautz 06e19e6 Check for Mesa rather than GLX > 1.2 when determining glXQueryDrawable GLX_WIDTH/GLX_HEIGHT availability. 859da4d Do not link the Linux overlay with '-z now'. faddfda Remove old "non-tagged" Boost include directories. 441ae3f Point 3rdparty/minhook-src back to 'cbd6254467b0f4b20f3fc2b47ceea44e26330a34'. a66fdeb overlay_gl: remove unnecessary qmake message. 3283ac2 SSL: fix build for Qt 4. 2015-06-03 Mikkel Krautz b90b420 mumble_exe: fix expansion of baked-in MUMBLE_VERSION. 2015-06-01 Mikkel Krautz 5a8c7f5 Update the Mumble installer to work with a versioned directory hierarchy. e6b17b5 Add support for running with a versioned root path in mumble.exe. 1250b04 Use MumbleApplication::applicationVersionRootPath() throughout Mumble to support a versioned directory hierarchy. 83da956 Add MumbleApplication::applicationVersionRootPath(). ced3bf8 Do not delayload speex.dll. 2015-05-29 Mikkel Krautz 239b89c installer: rearrange codec components in the installer. 2015-05-24 Jan Klass 9ee9e8a Use upstreamed MH_STATUS to string function 2015-05-23 Jan Klass da004cf Overlay: Resolve undefined behavior 2015-05-22 Mikkel Krautz e5ddf55 SSL: move declaration of 'i' in MumbleSSL::ciphersFromOpenSSLCipherString() to the top of the function. 63a6985 SSL: remove class name qualifier in SSL.h for new cipher string methods. 8ae710b Mumble: add 'net/sslciphers' hidden setting to allow configuring the client's advertised TLS cipher suites. a3f93f7 Murmur: add 'sslCiphers' option to allow server admins full control of Murmur's advertised TLS cipher suites. 49f57d3 SSL: add MumbleSSL::defaultOpenSSLCipherString(). 1dc6ecc SSL: implement OpenSSL cipher list format reader. 2015-05-17 Stefan Hacker 5026c47 Fix ice documentation mistake 2015-05-16 Jan Klass d9e0d08 Ignore VS *.aps files 834365e Cleanup: Remove unused Hooks 771657a HardHook(MH): Reuse inject function and error logging fcb908b Initialize fields in OverlayClient 70451a6 Fix #1637 application crashes on Mumble exit Mikkel Krautz 57740e7 Rename overlay helpers to avoid PDB name clashes with DLLs. 2015-05-15 Stefan Hacker 15fbe1d Remove ICC support and some VC10 workarounds bf2a2cd Add /Zo to release flags for improved optimized build debugging f6e17fe Drop support for VC10 by updating compiler.pri for VC12 default flags Mikkel Krautz e871691 3rdparty/fx11-build-shared: set _WIN32_WINNT to 0x0501. 8f4b071 3rdparty/minhook-src: sync with MinHook master. 2015-05-14 Jan Klass 3282887 Fix access violations on exit with Overlay active Nikolaj Dombrow de27cd7 Add RTMP as an allowed protocol for links 2015-05-12 Will Tange ab78e6c Sensible warning message 78604d8 Connect button should be disabled by default 0fdb7c1 Mark shebanged files as executable 2015-05-11 Evan Purkhiser 82ca800 Follow XDG directory spec for RPC socket & overlay pipe 2015-05-10 Stefan Hacker a96a8e7 Add deprecation warning for building client with Qt 4 Charles Ricketts 5b104e0 PulseAudio: Add options to disable attenuating applications on other audio outputs and to disable attenuation of loopback modules. 2015-05-09 Evan Purkhiser c005fe3 Remove tabs from the project file Joël Troch c3236b3 Fix for Windows 10 detection in murmur 2015-05-07 Stefan Hacker 4e459a9 Do not consider a default hostname from clipboard to be custom 78d0db8 Fix title from URLs not being picked up in connect dialog. Nik Johnson b2282e7 Move label to bottom of connect dialog and default it to hostname 2015-05-06 Stefan Hacker 2c0d37f Switch from old speex to new speex and speexdsp Tim Cooper 263a292 fix minor spelling mistake 2015-04-30 Stefan Hacker ad1ed22 Prevent OverlayClient destructor from hanging on disconnect 2015-04-29 Lartza f1eb642 Add Finnish to languages in Product.wxs b2b3106 Fix typo in Finnish translation 2015-04-27 Patrick Matthäi 0f072ef Add missing LSB Description to the init script. 2015-04-26 Chris Knadle e24cfe6 Add Keywords to mumble.desktop to satisfy Lintian warning 2015-04-23 Mikkel Krautz 0128e7d installer: include both x86 and x64 variants of D3DCompiler_XX.dll. 2015-04-22 Jordan Cristiano 445cdf0 Do not set the Mumble process's priority to High on Windows. Mikkel Krautz 2eef8ba g15helper: force 32-bit x86 compilation. d63fc6d Use the index variable instead of hardcoding 0 in overlay_exe's GetCommandLineArgs(). 2379f1f Use non-negative error constants in overlay_exe.h. 9a18c77 Re-work command line parsing in the Windows overlay helper executable. 8e333b3 OverlayPrivateWin: add qFatal calls for invalid states. a2be915 Fix missing comma in license header in overlay_exe.cpp. b29df64 Rename 'missing magic argument' error to 'no arguments' in overlay helper. 6c446e4 Ensure overlay helpers exit when the Mumble process terminates. b188029 Add config options for disabling specific overlay helpers. bb0ccc4 Add restart limiter to OverlayPrivateWin to avoid bombing the system with process spawns. 8e31de7 Log overlay helper process errors in OverlayPrivateWin. 3018c5e Handle WM_CLOSE messages in overlay helper. 0e358bf Check if the host supports 64-bit processes before attempting to start the x64 helper process. 21a1519 Log path to the executable of the helper process in onHelperProcessExited(). 529f76f Add the x86_64 Windows overlay to the installer. 8d3c1f7 Add support for using both x86 and x86_64 overlays in Overlay_win.cpp. d609879 Use arch-specific shared memory regions in the Windows overlay. 3a6c4f0 Build two separate Windows overlays - one for x86 and one for x86_64. 4a478f7 Add force-x86-toolchain and force-x86_64-toolchain to compiler.pri. 5d41a78 Add toolchain files. To be used by 32-bit on 64-bit overlay (and vice versa). x89 57396fa Add systemd service file for Murmur. Ferdinand Thiessen 67ed33f Do not show TTS options when speechd is disabled. 2015-04-12 Jan Klass ad0ee22 Translation update d0f6b96 Make script for updating translation strings more robust 2015-03-22 Mikkel Krautz 3223c8a Fix translatability of 'Cycle transmit mode' GlobalShortcut log messages. f05e657 Fix typo in speex-build.pro: '../speex-build' instead of '../speex-srcbuild'. 46fc40e Fix Qt 4 build of mach-override to build both x86 and x86-64 binaries. d855b67 Fix config.h issues in 3rdparty caused by new INCLUDEPATH handling in Qt 5.4.1. 2015-03-19 Mikkel Krautz 6c96ab4 Use 'QSsl::TlsV1_0' on Qt 5.0 through 5.3 and allow 'QSsl::SecureProtocols' to be used on 5.4.X. 2015-03-18 Derrick Dymock a7dd1b7 Remove __DATE__ and __TIME__. Joël Troch 122ed92 OSInfo: update Windows 10 detection due to kernel version change. Mikkel Krautz 71e522f Use QSsl::TlsV1_0OrLater on Qt 5.5 or later, and QSsl::SecureProtocols on Qt 5.4. Tim Cooper f5affcd Better log message when a user disconnects from the same channel as the client. 9ba92b5 Add user friendly UserRemove message when disconnecting a ghost user. dede317 Add basic support for sending text messages via GlobalShortcuts. 2015-03-17 Sami Laine 47889eb Add Finnish translation for the installer. Tim Cooper 88aefca Fix protocol documentation for RequestBlob in the .proto file. eda74f2 Add protocol buffer comments from the old 'doc' directory to the .proto file. 6eecd62 Remove 'doc' directory in favour of https://github.com/mumble-voip/mumble-protocol 2015-03-15 Stefan Hacker fca6278 Fix double free in WASAPI no positional audio fallback code-path 988eeb5 Translation update 2015-03-14 Stefan Hacker 525995d Address review concerns to mix format check changes MumbleTransifexBot 657f9e8 Transifex translation 2015-03-10 Mikkel Krautz 18c359f GlobalShortcut_unix: disable evdev by default. 2015-03-09 Stefan Hacker 5a033b8 Simplify and extend mix format check in WASAPI.cpp b4f5050 Fix handling of WAVEFORMATEX in WASAPI backend. 2015-02-25 Stefan Hacker 1c00533 Incorrectly assumed SF_FORMAT_* subtypes were flags. 2015-02-08 Mew bc5852d Implement "mumble rpc" subcommand Kyle Smith 44dc94e Add optional combobox for transmit mode selection in the MainWindow's toolbar. BuddyButterfly 80f1623 PulseAudio: allow monitor devices to be used as inputs. Mikkel Krautz f8b63cd macx/osax: bump OS X overlay version to 19. 2015-02-07 Mikkel Krautz f0ff84f Unify overlay code for Unix and OS X. a565197 Add setting 'asio/enable' to allow users to disable ASIO via the Mumble configuration. 2015-02-06 Mikkel Krautz 3293f7a Make 3rdparty/mach-override-src point to mumble-voip/mach_override, and use https instead of ssh. 2015-02-05 dennisschagt 32f3273 Translation update 99f3de8 Fixed typo reported at github #1552 Mikkel Krautz 1fab580 Use glDrawArrays instead of immediate mode in OS X's drawOverlay(). f4568b9 Port 6e9a7e7c to the OS X overlay. 8e3168b Port ec7e78d1 to the OS X overlay. 403aedb Add mach_override as a 3rdparty dep and hook it into the OS X overlay. 2015-01-17 Jan Klass 06d00f4 OpenGL overlay injection requirements 2418b80 Remove unused injection code and function lookups 967a325 In OpenGL Overlay, make code and context swapping more clear 2015-01-15 Mikkel Krautz 9f1e605 Move Windows overlay setup and injection to mumble_ol.exe. 2015-01-11 Jan Klass 3b507d5 Overlay: Use standard OpenGL headers rather than duplicating code 2015-01-10 Jan Klass a7d103f Fix indentation. Add curly braces according to coding style. 2015-01-05 Mikkel Krautz faa6730 Move speex, celt-0.7.0, celt-0.11.0, opus and sbcelt to the 3rdparty directory. 2015-01-04 Mikkel Krautz ec3120c installer: distribute all plugins for Windows x64 build. 2015-01-03 Mikkel Krautz f1e298a murmur: fix CONFIG(static) block in the unix section of murmur.pro to not be applied for OS X. 7f69c51 Add Far Cry 4 to the blacklist due to crashes with the x64 overlay. a2bb659 murmur: move murmur.pro's CONFIG(static) and CONFIG(ermine) sections into the unix section. ecf543b GlobalShortcut: enable use of hooks for Windows x64 now that we have HardHook available. 93ad74b Add MinHook-based overlay for Windows x64. 2014-12-31 Mikkel Krautz 29525cb installer: distribute D3DCompiler_43.dll for our Windows x86 builds. 2014-12-30 Mikkel Krautz a88b316 installer: distribute D3DCompiler_47.dll for our Windows x64 builds. 9345abe plugins: limit win32-specific plugins to win32. c9f476c compiler.pri: only set explicit -ARCH:SSE for Windows x86. 4d55c33 compiler.pri: use explicit subsystem versioning for Windows builds. a0247d7 plugins: enable all plugins for the x64 build. 370fae6 plugins: cleanup a few warnings in the WoW plugin. f3c64b3 plugins: move u8 function into the Star Trek: Online plugin. 2014-12-29 Mikkel Krautz b2f5bd0 Update Opus submodule to include our workaround for MSVC2013.3+ x64's bad sqrt auto-vectorizer codegen. 2014-12-28 Mikkel Krautz 6a07cbd Update changelog. 2014-12-26 Stefan Hacker c5e427d Revert "Use TLS 1.2 when built with Qt 5." Mikkel Krautz ef9ffea Fix qtaccessiblewidgets removal logic to be compatible with Qt 4 as well. 2014-12-25 Mikkel Krautz 75843b6 Use TLS 1.2 when built with Qt 5. 78ac468 Murmur: fix override of TcpSocket::incomingConnection(). it takes a qintptr (and not an int) in Qt 5. 7ecf4b3 Define Qt 4 no-ops for Q_DECL_OVERRIDE and Q_DECL_FINAL on the command line. a24b566 Only use $$shell_path on Qt 5. 2014-12-24 Mikkel Krautz fc0ab93 Do not use the qtaccessiblewidgets plugin on Qt 5.4 and greater. d2dbfed Remove -Zc:strictStrings flag that Qt 5.4 adds when using MSVS 2013. 124b1ce Make os_win.cpp strictStrings-safe. 630a17b Use $$shell_path to ensure QMAKE_LRELEASE is formatted correctly regardless of the OS. 2014-12-22 Andreas Sinz ad19d15 Display the native language name in the language chooser rather than the locale Stefan Hacker 2438f31 Fix Esperanto entry in language list and display cc in parentheses behind name. 2014-11-09 Stefan Hacker 78d7198 Fix typo in AudioEchoWidget regression fix b78f34d Calculate peak and max microphone level in the same loop. 996a3df Reset buffered frames count on encoding failure. 2682987 Fix sequence counter becoming invalid for end-of-speech frames. ef6353b Fix Qt5 transition regression in AudioEchoWidget. James Fraser b9baebb Update WoW Plugin to build #19116 Mikkel Krautz 1bd6c88 Add RC files for CELT 0.7.0 and CELT 0.11.0. 56e7e5a Add rc file for mumble_ol.dll. d6ba8cf Fix mumble_dll.rc to identify as a DLL. 82a8e7d Update .gitignore to ignore more of Qt 5's auto-generated plugin importer .cpp files. 2014-11-04 dennisschagt cc0533c Fixed typo in the main README Mikkel Krautz 2c0bfa0 Fix compilation of Overlay.cpp. It was accidentally broken by fd782c3c. f1dbd92 Ensure up-to-date built-in overlay blacklist. e5b6dac Add Spotify to the overlay blacklist. It can cause Mumble to freeze/hang for multiple seconds. fd782c3 Overlay, OverlayClient: add PID and process name diagnostics to 'Dead client detected' notice. 2014-11-01 James Fraser d2a1b5c Update WoW plugin to build 19103 2014-10-30 Stefan Hacker 7d434bb Revert "Fix issue with tray icon double clicking." a120c8e Fix issue with tray icon double clicking. Joël Troch 236e987 Added Windows 10 in OS detection and manifest file. 2014-10-27 Stefan Hacker f35ef65 Fix compilation failure on OSX due to missing include. Natenom 23899b4 Extended icon theming options. 2014-10-26 Stefan Hacker cbe3956 Fix more ApplicationPalette aspects. b923e06 Use real-name in copyright line. 38807be Integrate some feedback to ApplicationPalette 291ed48 Add ApplicationPalette class which allows theming the QApplication::palette. James Fraser cde294f Fix assert when viewing legacy user registration lists 2014-10-25 Stefan Hacker 7fbd9d4 Switch from fixing width to height for "What's this". 2014-10-24 Stefan Hacker fac902d Translation update 2014-10-23 Stefan Hacker 4a149f8 Update man pages author to "the Mumble team" and bump dates. 71ff77b Add placeholder texts to connect dialog. Natenom 9cc1c0a Add -limits to help text and improve man page 44a0846 Show messages for priority speaker status d9785f9 Shows move message if you moved a user from another channel into another channel 2014-10-21 Stefan Hacker c664b98 Fix more coding guideline violations. cebcbd3 Fix RAND_bytes return value checking. c9f170e Revert recent installer changes as they create more issues than they fixed. acf73f5 Drop unused files and icon. 7a18851 Make AudioInputDialog and AudioOutputDialog use own icons. 8aa125f Fix issues found in review of PR #1422 2014-10-19 Stefan Hacker 6f2552d Fix Qt 5 transition bug making certificate wizard access out of bounds. 54ec595 Update Opus to version 1.1.1 beta Bas Wijnen dc87fa2 Fix crash on Linux when trying to configure shortcuts. 2014-10-18 James Fraser 8ab0c4a Update WoW Plugin to build 19034 2014-10-15 scapula 6e9a7e7 Disable vertex attrib arrays in overlay_gl (fixes #1298) 2014-10-11 Stefan Hacker 1749ef4 Resolve installer upgrade issues. fc0e20b Fix recording timer not properly displaying in Qt 5 version of Mumble. 2014-10-08 Stefan Hacker 7647538 Change Pulseaudio Role. 2014-10-04 Stefan Hacker 06d9f7e Drop minimize functionality from tray icon. 2014-10-03 Stefan Hacker bf5693b Remove special case for allowing override on Qt 4 for windows. 5131d9e Review and refactor of PBKDF2 support patch. 2014-10-02 tkmorris 813aceb Add PBKDF2 support to Murmur. 2014-09-27 Stefan Hacker e728205 Do not allow installing x86 and x64 side by side. 2014-09-26 Stefan Hacker 17d95c0 Update URLs in installer and add a comment. Matt Lewandowsky fcc2a39 Add property to enable "Launch app at exit" by default. 2014-09-25 Stefan Hacker bc11185 Update murmur.ini and scripts to disable dbus by default and enable ice. 2014-09-24 Stefan Hacker 491789c Restore old log timestamp format. 2014-09-22 Stefan Hacker 3c280a6 Add poor man's padding to last column in connect dialog. 2014-09-21 Stefan Hacker 4eba193 Add "Uninstall" shortcut to start menu folder with windows installer. 9f5b01b Make the Windows install create desktop shortcuts again. b4f0c66 Update product manufacturer to be "The Mumble team" 7c5a9fb Fix murmur handling all groups starting with "sub" as special. 47a81f7 Do not use non-standard tool window for minimal mode. bc5056c Update LICENSE file Steve Hill 5e7706a Update Borderlands 2 plugin for version 1.8.3 qwestduck 1c1dac5 Fix FTBFS regression from dd7cc7caa7257d2d1525daebbcc070cbb0983915 Mikkel Krautz 754fc00 MainWindow: don't use custom flags for MinimalView - keep standard Close, Minimize and Maximize buttons. dedf841 GlobalShortcut: remove margins on the Mac Event Tap warning's layout container. 1375022 Make 'Close' the default for the AskOnQuit message box. ace1917 Add QMAKE_TARGET_BUNDLE_PREFIX to the manual plugin's .qmake.cache file. 731d863 GlobalShortcut: do not require expert mode for Mac event tap warning message in GlobalShortcutConfig. dd7cc7c Improve the look of Mumble on Retina Display Macs. e9e2680 Add mumble_pch.hpp include to various .mm files. 2014-09-20 Markus S f0fc66b Self muted/deafened message seperated into self muted, self unmuted, self deafened, self undeafened. Stefan Hacker 570a1f2 Translation update acd8174 Use enum type and constants instead of integer indices. 916dcc0 Special case the Unity desktop to also default to not minimize to tray 694dca8 Replace hacky hide/show handling with more straight-forward implementation. 4a67eeb Fix ServerView::mimeData not actually overriding base class function. 7c4fbee Fix hide in tray on windows. ddab6ed Replace overlooked QT_VERSION_CHECKs with explicit version. 8cf4e14 Introduce use of Q_DECL_OVERRIDE and Q_DECL_FINAL into the codebase. edaca2e Fix hide in tray default value for Windows 8.1 2014-09-19 Mikkel Krautz 8ad8812 MainWindow: only trigger link tooltips of Mumble is the frontmost program. 2014-09-13 Stefan Hacker 6095134 Fix Mumble build failing on OSX due to missing include. 2014-08-27 Michael Pavlyshko 2c0c0ed Add Microsoft Visual Studio to overlay blacklist 2014-08-24 Mikkel Krautz 67fc74f Build fixes for the debug variant of the win32-static/win64-static build envs. 2014-08-22 Stefan Hacker 12eb264 Replace all uses of QT_VERSION_CHECK with explicit version. 4efabce Fix Qt 4 compilation. Mikkel Krautz fc5fd45 Delete MumbleApplication.cpp.autosave Natenom 83218f1 Update project url and copyright info 2014-08-18 Stefan Hacker b5d3758 Fix channel filtering not working. 34daf71 Split up long HEADERS, SOUCES and FORMS lines to improve readability. f1e3e09 Fix Qt 5 upgrade broke shutdown ask on quit suppression (#1362) 2014-08-17 Mikkel Krautz 9d668eb Use QStandardPaths's DataLocation instead of GenericDataLocation when looking up AppData directory. d299360 Log, TextMessage: remove $ as an illegal character in our simple URL regexp. 2014-08-16 Stefan Hacker 7cfc2e5 Split out translation resources from mumble.qrc. 2014-08-09 Stefan Hacker 880e126 Split out translations list from mumble.pro. 90d7546 Translation update Mikkel Krautz d1a19d4 Cert: drop OpenSSL 0.9.7 compatibility code. 2014-08-01 Jan Klass ed2bf49 Change default overlay avatar alignment to centered as per #1325 Mikkel Krautz 19996c5 g15helper, macx/compat: fix OS X i386 targetting when using Qt 5. 2014-07-29 Mikkel Krautz c0d7aad scripts/gen-mumble_app-qt-def.py: add Python 3 compatibility. 2014-07-28 Mikkel Krautz 340c7b6 ASIOInput: use MumbleHWNDForQWidget() to get HWND for Qt 5 compatibility. 2014-07-27 Mikkel Krautz 094ab1e Ensure "syslog" string literal in murmur's main.cpp is wrapped in QLatin1String. 08d7cb3 UnixMurmur: ensure logToSyslog is initialized to false. 2014-07-25 Mikkel Krautz 0faf8fa .gitignore: add .qmake.cache, .qmake.stash, and murmurd_plugin_import.cpp. 3fe7ff4 OverlayEditorScene: include QtGlobal before QT_VERSION check in header. 68fb468 UserListModel: add mumble_pch.hpp header instead of directly using Qt headers in order to fix Qt::escape on Qt 5. 64d28eb mumble.pro: when using Qt 5, use its bundled icns plugin instead of our own qicnsicon. 21554c6 3rdparty/fx11-build: remove DX_SDK include dir, we get it from the environment. c84e9b7 mumble, murmur: add a 'Qt::escape' for Qt 5 to avoid ifdef hell. 434087c SSL: make CA filter code compatible with Qt 5. Peter Vágner 800947e Messages: fix conversion from protobuf uint64 to ChanACL::Permissions when building against Qt 5. 2bc61db OverlayEditorScene: fix header to allow building with Qt 5. 2014-07-23 Mikkel Krautz 63f35d6 PulseAudio: don't call pa_stream_drop() for empty pa_stream_peek(). 2014-07-22 Jan Klass 47d8a4f Update gmod PA plugin with updated addresses. 2014-07-20 Mikkel Krautz 840a31d macx/scripts: fix osxdist.py and build-installer-overlay to work in a source tree path with spaces in it. e740ea5 PulseAudio: stricter pa_stream_peek() validation. 2014-07-19 Mikkel Krautz 322ed8a Murmur: pass a format string to syslog(3). 2014-07-18 main() 30023c5 Support logging to syslog in Murmur 2014-07-17 main() dc3b78c Add "forceExternalAuth" config option to Murmur Mikkel Krautz cf51bf3 OverlayConfig: hide the Overlay in Settings on winx64, since it's not enabled at the moment. 1e30fc6 installer: remove vccorlib120.dll from the installer. 2014-07-16 Mikkel Krautz 8ffe90a installer: make WiX produce a working x64 installer. f657478 installer: fix whitespace issue in Plugins.wxs. be8f932 installer: additional update to the .sln file for x64. 9482cc8 installer: add x64 platform to the installer. 2e5c8a5 Overlay_win: move early-return on WinX64 below variable initializations. 19efac3 plugins: temporarily disable game plugins on Windows/amd64. the 'link' and 'manual' plugins are still built. 8540e08 Set mumble_app.dll's version to 1.3.0. 2014-07-15 Mikkel Krautz 6d96281 OSInfo: use 'WinX64' as the OS identifier for Windows/amd64 builds. 769855b Use set the 'os' query parameter to 'WinX64' when doing version checks and plugin updates on Windows/amd64. 2014-07-14 Jan Klass cdcf77c Adjust method comment to match usage 2014-07-13 Iain Georgeson 97cf80d Log IP address on failed login Mikkel Krautz c31269a Make Mumble and Murmur build on Windows/amd64. 2014-07-12 Mikkel Krautz 50206ce celt-0.7.0-src, .gitmodules: point the submodule to our own CELT 0.7.0 code base to fix Windows/amd64 build of celt-0.7.0. e31b716 plugins: add missing 'elif'; fix indentation of MSVS2008 'if' block. 9f327be plugins: add magic values for all previously supported ABIs (and a couple of new ones) to mumble_plugin.h. 2014-07-04 Stefan Hacker e438a05 Comment memcpy from #1305 2014-07-02 Mikkel Krautz 01a5e83 PulseAudio: fix access to protected enums in AudioInput and AudioOutput. 77314f4 installer: add the ability to use a custom bzip2 directory in the Win32 installer. 9ecdc0f installer: fix ability to use a custom OpenSslDir when building the Win32 installer. 2014-06-16 Bernhard M. Wiedemann 527d24e Make sure exported certs are not world readable 2014-06-13 Mikkel Krautz 7141a05 Add CA certificate filter to MumbleSSL::addSystemCA() to work around issue 1271. 2014-06-11 Tim Cooper 2b8fc35 Fix issue where the chat box does not scroll down when an image is loaded (#1258) 2014-06-10 Tim Cooper 4f7ede5 Removed g.uiSession from ServerHandler::joinChannel abdb5ac Added setTokens to ServerHandler 22d8740 Add doxygen output directory to .gitignore 2014-06-06 James Fraser 82f95c6 Update World of Warcraft Plugin to build 18291 2014-05-15 Mikkel Krautz f91386b mumble: fix Mumble-SA-2014-005. 2014-05-12 Mikkel Krautz d9ff1e9 ConnectDialog: HTML-escape name in ServerItem::toMimeData(). 17fa695 MainWindow: HTML-escape host in Server Information dialog to state our intention. 9837c4d MainWindow: HTML-escape hostname in 'Connecting to...' message. b6e17ca Log: HTML-escape QDateTime's Qt::DefaultLocaleShortDate string representation. d58990c CertView: do not use Qt::PlainText for qlExpiry - it needs HTML for its expiry warning color. 73a1a98 AudioOutputSample: HTML-escape filename in QMessageBox. 1f6ddaf ASIOInput: use Qt::PlainText for QLabels. Tim Cooper c52dedc Remove unneeded Qt::escape. a0ebded CertView: remove incorrect use of an HTML line break for qlSubjectEmail. 2014-05-11 Mikkel Krautz 1caaec7 CertView: explicitly use plain-text QLabels for subject/issuer/email/expiry labels. 2014-05-10 Christian Krause 3494362 Avoid "jump to label crosses initialization" error. 2014-04-27 Stefan Hacker abad339 Remove flawed MX host existence check for cert wizard (#1178) a429c76 Add transifex client configuration for project. d366065 Translation update b3cf94f Add translation update script with transifex issue workaround (#1195) 2014-04-26 Stefan Hacker e562e92 Exclude files with DFSG licensing issues from tar balls (#1230) 2014-04-24 James Fraser fb3d6c6 Update WoW plugin to build 18019. 2014-04-15 Tim Cooper 52d19ac Allow admins to clear user avatars/textures. 2014-04-13 Tim Cooper 02ddd91 Allow user renames via UserList without requiring a reconnect. 1256386 Fix auto-reconnect behavior when kicked or banned. 2014-04-12 Mikkel Krautz 2d2509f UserListModel: fix non-PCH build by including QTextDocument header for Qt::escape. Tim Cooper 306e1f7 Log: fix typo in 'image too big' warning. 2014-04-10 Philip Cass 9946dc7 Reorder Mumble.proto to match ordering in Message.h. Tim Cooper b7d9387 Be more stringent about properly escaping external strings in HTML ('rich text' in Qt-speak). 13c6e58 Fix incorrect handling of mumble:// links 2014-04-06 Tim Cooper 01a7c58 MainWindow: fix a bug where user/channel actions were enabled even though no user or channel was selected. 2014-04-05 Mikkel Krautz c897c56 installer: drop InstallerVersion back to 300. add note about InstallerVersion requirements for VC12 redist to MergeModuleDir setting. 8aafb6c installer: automatically embed VCRedist 12.0 DLLs when env var MumbleNoMergeModule is set. 0e44742 installer: change InstallerVersion to 405 to be able to merge with MSVS2013 VCRedist. 1b3f199 installer: update Product.wxs to refer to the VC120 CRT. 689f4c1 Bump version to 1.3.0 53daac8 mumble_plugin.h: change plugin magic values in preparation of the MSVS 2013 switch-over. b20d9e9 Plugins: add support for the 'path' attribute in plugin auto-update XML. 2014-04-04 Mikkel Krautz af37749 compiler.pri: explicitly specify -ARCH:SSE for MSVS 2012 and 2013. 724d9e9 compiler.pri: explicitly target Windows XP when specifying output binary's subsystem. 2014-03-30 Jan Klass 0285e3b Adjust build error text (missing submodule dir) 2014-03-27 Stefan Hacker b252959 Missed DIST dependency on mkini.sh results. 2014-03-25 Stefan Hacker c03d8fc Drastically simplify release.pl. a7ae275 Make paths in fx11-build.pro case sensitive 2014-03-13 Stefan Hacker 6a345f5 Added hidden option to disable add/edit in connect dialog (FR #1120) fd5a9b1 Add hidden option to disable pubserver list (FR #1120) f2bfe2f L4D2 PA plugin update to game version 2.1.3.5 (#1184) 2014-02-25 Mikkel Krautz 487fcab mumble: fix Mac build after the overlay header refactoring. 2014-02-23 Stefan Hacker d41c148 Refactor ClientUser to UserModel/MainWindow signal & slot connections. 12eac3c Fix client freeze due to deadlock (#1167) Jan Klass 00392d1 Fix: Add forward declaration and include 640b532 Refactor code: Create headers for cpp files 2014-02-21 bendem cd2a5e5 Update french translation 2014-02-19 Jan Klass 207f66c Add entries to default overlay blacklist 2014-02-18 Michał "Zuko" Żukowski 221a5d7 Updated Polish translation 2014-02-17 Stefan Hacker c377cea Update translations for #1164 2014-02-16 Jan Klass f789386 Overlay: Introduce D3D call result logging 2014-02-15 Stefan Hacker d3e00de Remove 'About' action from tray context menu (#1161) Spaccaossi fbaadc4 Updated italian translation 2014-02-13 Stefan Hacker ea165cd Prevent adding to VoiceRecorder buffer after recording was stopped. 2ca559b Fix assumptions in alignment fix by reintroducing silence heuristic. 8e22f9a Fix "Inverted samples in WAV recording when clipping" #971 ed424af Modify VoiceRecorder to be able to properly abort a recording. a0aa1bc Refactoring of VoiceRecord.h/cpp according to new coding guidelines. fc4e1e3 Fix recorder crash due to use after free on user object. 9a47e05 Fix multi-track recordings going out of alignment on long recordings 2014-02-09 Stefan Hacker afa6ee4 Make banlist filter case insensitive (#1011) 2014-02-08 Mikkel Krautz 90963a1 compiler.pri: tweak OS X SDK detection when building with Qt 4. d55d944 g15helper: update G15 SDK paths for OS X. 2014-02-07 Mikkel Krautz 229f041 Merge v1.2.5 into master. 2014-02-05 Mikkel Krautz d3be3d7 mumble: fix Mumble-SA-2014-002 (CVE-2014-0045). 8506492 mumble: fix Mumble-SA-2014-001 (CVE-2014-0044). 2014-01-31 Mikkel Krautz c3c13f9 Update changelog 269e93e mumble: fix Mumble-SA-2014-002 (CVE-2014-0045). 7e31c32 mumble: fix Mumble-SA-2014-001 (CVE-2014-0044). f5ebe9d Bump version to 1.2.5 2014-01-25 Mikkel Krautz 1bd57bd TextToSpeech_macx: selectively conform to NSSpeechSynthesizerDelegate protocol. 3e0112d README.static.osx: remove Linux references. 2014-01-21 Zorg c2f75bb TextToSpeech_macx: fix 10.4 compatibility. 15f7610 TextToSpeech_macx: reimplement using NSSpeechSynthesizer. 2014-01-19 Piratonym 29a65c6 AudioOutput: add an 'attenuate others' option for priority speakers. 2014-01-12 Mikkel Krautz 44a5bd1 scripts: remove unused svn2cl scripts. 97b75de scripts: remove old Ermine build scripts. 6da40b8 winpaths_static.pri: remove executable bit. 64abcb3 scripts: set +x bit for the files people are expected to run. f623a69 scripts/mkini-win32.bat: use ',' as substitution delimiter; also fix regexp. 4323a21 scripts/release.pl: remove slicer-specific deployment functionality. Natenom b2d938b Messages: use actual username (instead of the ConnectDialog username) in msgPermissionDenied. Rafael Lopez d9d81a9 MainWindow: add Cancel button to the "Minimize or Close?" message box. 2014-01-11 Steve Hill fb1cff6 plugins/borderlands2: add support for v1.7.0. Mikkel Krautz 1d0b1c8 OSInfo: fix display of Windows service packs in getOSDisplayableVersion. 9521471 plugins/borderlands2: fix version check. Tim Burke 1eefaab mumble.appcompat.manifest: add Windows 8 and Windows 8.1 entries. Michał "Zuko" Żukowski 8f0ae69 OSInfo: use full Windows version when version string is user-facing. 2014-01-10 Jan Klass 9544bec Overlay: Add Direct3D 11 support Mikkel Krautz 00b3686 scripts/release.pl: add vpath special-case for fx11. 2014-01-02 Kyle Smith da6c244 New approach using a QHash to track PTT events per whisper. 2013-12-30 Mikkel Krautz 2ac3b67 AudioInput: make a copy of the EncodingOutputBuffer when calling flushCheck. 2013-12-29 Stefan Hacker 5fa918b Fix accidental CBR limit for large Opus frames. 2013-12-17 Mikkel Krautz 338f024 opus-build: revert ff9086e3 and error out if built with CONFIG(sbcelt) instead. ff9086e opus-build: build as C++ on Unix-like systems. 2013-12-15 Mikkel Krautz b5ee1f4 mumble: add os=MacOSX-Universal to VersionCheck.cpp and Plugins.cpp. 6918c9d scripts/release.pl: add dirs new to Opus 1.1 to fix from-tarball build. 2013-12-14 Mikkel Krautz 3a47d99 mumble: allow Log_macx.mm to build against the OS X 10.4 SDK (for universal builds). 2013-12-06 Stefan Hacker 61391ae Update to Opus 1.1 Jan Klass 67914c3 Logtextfix. Logically format code. 2013-12-05 Stefan Hacker fb56112 Fix crash of target application due to failures in D10State::init. 2013-12-04 Stefan Hacker c148aaf Update Opus to 1.1-rc3 2013-11-30 Stefan Hacker ab12d35 Fix handling of failed shared data map creation in overlay. Artem Vorotnikov 829d4c6 Russian translation fixes 2013-11-26 Stefan Hacker d322ad1 Update Opus to 1.1-rc Jan Klass 71e6ab1 Overlay: Resolve d3d9 hook TODO. Fix naming. 80a9350 Overlay: Code improvements 2013-11-24 Jan Klass cd4e835 Overlay: Changes as per PR-comments Tristan Matthews f514107 AGC: remove redundant speex_preprocess_ctl call 2013-11-22 Jan Klass 250835e Overlay: Rework Code. 2013-11-16 Mikkel Krautz 087e38a overlay: fix blacklist debug ods call. 2013-11-10 Mikkel Krautz 7f976ed mumble, mumble_exe: fix overlay self-detection for the mumble_app.dll build. 192135d Add x-scheme-handler support to the Mumble .desktop file. Michał "Zuko" Żukowski f459c5b Updated Polish translation 2013-11-04 zapman 807dd4c Update Turkish translation 2013-10-24 Michał "Zuko" Żukowski 75976ec Fix two GUI issues 2013-10-23 Stefan Hacker 2c892fe Fix various compiler warnings with VS2010 e51921e Fix bug and formating in subrosa PA plugin. 3af1651 Fix warning due to implicit BOOL to bool conversion. 07e055f Fix overlay regression that in some cases prevented injection into devices in myCreateDevice(/Ex) 2013-10-22 Stefan Hacker a6f7610 Fix mixup between printf and QString format character in VoiceRecorder error message 2013-10-21 Mikkel Krautz 35765f6 mumble: use ConfigDialog_macx on Qt5/macx. 2013-10-20 Mikkel Krautz 915fe15 mumble: allow GlobalShortcut_macx.mm to build using the OS X 10.9 SDK. d59a3b1 compiler.pri: use default OS X SDK instead of hard-coding it. 1509f56 mumble: fix UserListModel.h includes to work without PCH. 2013-10-16 Timo Gurr d2ed7d2 Update slice path for Ice 3.5.1 2013-10-14 Natenom f07f0c8 Show channelid to ACLEditor 2013-09-21 Stefan Hacker cde5610 Make userlist filter case-insensitive 5b9e899 Fix application shortcuts not working in minimal mode. 39697c7 Re-implement UserEdit using Model/View paradigm to resolve various problems with the old implementation. 2013-09-20 Stefan Hacker 15ff072 Remove event handler for retired global channel filter shortcut 198f45a Update Opus to v1.1 beta release d35468c Make sure filter never hides the channel the user resides in. 983b6db Expand "What's this" and tooltip for filter action 15afc05 Default enable hide empty channel behavior for filter 499b3f5 Add Ctrl+F shortcut for quickly enabling/disabling channel filtering 2013-09-19 Stefan Hacker 42d74df Fix channel flag handling with filter patch 8f30d0c First set of fixes for filter patch b422e0a Disconnect if for some reason we established a connection to a server without it having a certificate 679eacd Remove channel filtering from tray 860ec5c Reduce probability for possible race until a real fix can be implemented fc24262 Abort drop when drag setting is invalid 549c155 Fixed Mumble not remembering hidden dockwidgets Frank Mueller 5b3a406 Fixed leaving channel message not being sent when leaving the server tkmorris e26020e update mumble_pt_BR.ts 2013-09-15 Mikkel Krautz bcf1a3e build: add support for building against Qt 5 from the win32-static build env. 2013-09-13 Mikkel Krautz b25a906 mumble_exe: do not add mumble.exe's parent directory to PATH. bcaa10a mumble_exe: add user-visible alert dialogs for error states. 2013-09-06 Mikkel Krautz 442b46e installer: automatically build a static installer when in the win32-static build env. 2013-08-25 Mikkel Krautz 6c7e0e3 compiler.pri: allow version-less Boost to be used on Windows. 6c83548 winpaths_static.pri: use version-less protobuf path. a20185d plugins/manual: use qt_dynamic_lookup instead of static to guard linking against mumble_app.dll. f62db49 plugins/manual: only link against mumble_app when doing a static win32 build. 6da2930 mumble, murmur: final adjustments for the win32-static buildenv. 2013-08-19 Jan Klass 7c2d1a3 Open soundfile selection dialog with current path 6e09508 Fix path in skin selection dialog 2013-08-14 Mikkel Krautz 2864eee murmur: build fixes for win32-static. 2013-08-10 Mikkel Krautz 91e3daf build: allow Mumble on Win32 to be built against a static Qt. 2013-08-02 Mikkel Krautz 4c48f72 mumble: fix VoiceRecorderDialog build on Apple clang-500.1.70. c9f46b8 compiler.pri: use short-form OS X SDKs for Qt 5. d848af9 compiler.pri: update to Boost 1.54.0 on OS X. 2013-07-14 Jan Klass 1011d53 Code cleanup. 8021c66 Refac mklic.pl. Generate new licenses.h file. 82fa0e6 Adjust mklic.pl script 2fd6a3c Fix mixup of CELT and Speex licenses in about dialog. 3aa9179 Refactor third party license code info (About dialog) 2cec7ba Add Filter.svg license notice f96dfca Add shortcut for de-/activating channel filter 2013-07-13 Jan Klass 36217ac Rename variable. Informative tooltips. c0be6cb Channel Filtering: Fix shortcut. Specific text. 9450d66 Unify comment style. 84be1eb Move method comments. Remove obsolete. 2c07833 Reduce variable scopes 2013-07-08 Kyle Smith 325226c Added CycleTransmitMode global shortcut. dc6jgk 304bf43 Added channel hiding/filter feature 2013-07-07 Jan Klass 63e3fd0 Overlay clock: Fix tooltip text and indent. Michał "Zuko" Żukowski 5c87ded Clock in Overlay 2013-07-04 Mikkel Krautz 72407cf GlobalShortcut_macx: always make a deep copy of the translated key name. 2013-07-03 Mikkel Krautz 4df44b9 mumble: make new user editor work with Qt 5. 2013-07-02 Micah Caldwell 4305165 Updated L4D2 to 5338. 2013-07-01 Micah Caldwell 56ce5d5 Updated L4D2 Offsets 2013-06-30 Jan Klass ac65b31 Banlist: PR commit adjustments Michał "Zuko" Żukowski bf5927e BanList improvements 2013-06-29 Jan Klass 51ecb7a Accountlist: Fix filtering. Windowtitle and refacs. c40b0b0 Merge branch 'pr-userlist' Mikkel Krautz cd23aee Revert "src/mumble/mumble.pro: silence some qmake warnings." 7b68d0c User.h: add missing QDateTime include. c47d95a src/mumble/mumble.pro: silence some qmake warnings. 6a2f2bd plugins/manual: only depend on gui-private on Windows. 28bb66e plugins: disable unhinge functionality for the manual plugin when using Qt 5. 3cc2419 mumble, plugins: fix QWidget-for-HWND lookup for the 'manual' plugin. be75138 mumble, plugins: allow 'manual' plugin dialogs to work OS X when using Qt 5. e0b884e mumble: fix dynamic lookup for the 'manual' plugin on OS X with Qt 5. c469104 mumble: fix main.cpp to not reference MumbleFileEngineHandler. 21c4bbf mumble: remove FileEngine.{cpp,h} and use data URLs for better Qt 5 compatibility. 84bc19c mumble: migrate hardcoded 0x050000 Qt version to the QT_VERSION_CHECK macro. 9f62921 mumble: Qt 5 support for OS X. 4bbc561 mumble: fix Linux build for Qt 4 and Qt 5. 26b0597 mumble: fix HWND handling for Qt 5. 7e452dc mumble, murmur: Qt 5 support for Windows. 5cb3370 mumble, murmur: Qt 5 support for Linux. bendem 2994048 Translation: French: Fix 2013-06-28 Jan Klass ef8b3b9 Userlist improvements: Use QDateTime. b5ade6e Userlist Improvements: Display localized time. Refactoring. ab6d873 Userlist improvement: Use plural form translation b951fc3 Userlist Improvements: Use RPC callbacks as well. f6ceaf9 Improved Userlist: Refacs. eeb9b86 fix indent 0af571b Filtered Userlist: Refactoring. C bendem 2967697 Unified channel traduction to "salon" b7b3018 Translation improvements 2013-06-23 Jan Klass 2a7e789 Userlist improv.: Fix indent. Use iterator again. 1919b2c Overlay: Less obtrusive logging. Michał "Zuko" Żukowski b3aac5e UserList improvements 2013-06-17 Jan Klass 9d0de38 Overlay: Pass on procname buffer 3c787be Overlay: Move logic into function ..IsBlacklisted 0e7d860 Overlay: Move DllMain logic into functions e64fa10 Overlay: Use string var instead of hardcoded strings b070532 Overlay: Fix address offset 1182fc2 Overlay: Introduce hook for ResetEx. Hook PresentEx. 123486b Overlay: Move logic to function, Varnaming, msgfix 2013-06-16 Jan Klass dfc8638 Overlay: Add myPresentEx function 3865e8c Overlay: Code comments 04b344d Overlay: Var init, comment, error loggin. 2013-06-15 Jan Klass d74b5b0 IconSync.cpp: Move Icon creation script f92455b Refac: Reduce code duplication in IconSync.cpp c70dc78 Generate Mumble icon file with simplified minis 8dc58ef Use simplified Mumble logo for small icons 54e74c1 Keep small, simplified mumble icon closer to original 2013-06-11 Jan Klass 07c78b1 Refac: Use constant to check return value f09e943 * Commenting, varnaming, fix indent f8f4b0f refacs: more elaborative Varnaming; codeformatting 11d5305 Code refacs; fix typo and adjust texts cab4a3d Extend Windows Overlay code and clean it up. 2013-06-10 Stefan Hacker 65c366a Fixed connection setup diagram in mumble protocol documentation 2013-06-09 Jan Klass 9e6e6bb Benchmark.cpp: Fix: Set version to prevent crash 14db2e9 OverlayTest.pro: Add includepaths for celt and speex 33295b8 tests-files: Add description to file db472b9 tests/Benchmark: Foarmatting and descriptiveness d218030 add small version of mumble logo for small icons 8a3b8ea add 256px icon layer to mumble icon 30051f9 Update opus submodule to opus 1.0.2 2013-06-08 Mikkel Krautz 8632246 Bump version to 1.2.5 dee463e bonjour: use Qt::AutoConnection for BonjourServiceResolver's QSocketNotifier slot. 2013-06-06 Mikkel Krautz 22d1821 mumble.pro: add speech-dispatcher 0.8 compatibiltiy. Timo Gurr a436774 Update slice path for Ice 3.5.0 2013-06-05 Jan Klass 676bb0e use qFatal instead of exception 2013-06-04 Generator acb756c Upload european portuguese translation Stefan Hacker 77233ed Fixed crash triggered by reading large files referenced in the clipboard. 7d649aa Make sure mklic.pl always outputs LF endings Steve Hill 54d3f5a Borderlands 2 PA: Update for version 1.5.0 b0ddb59 Borderlands 2 PA: v1.4.0 update, fix v-detection Filip Hedman 9226245 Fixes and improvements to the swedish translation. Henry Fallon 5dea592 Apply patch with translations for FR #1096 88d41e1 FR #1096 by Henry Fallon: Corrections to string, Add missing comments in Murmur.ice and add Missing MainWindow::msgReject in Client 7cff8ca Introduce auth rejection type AuthenticatorFail Mikko Rantanen 5a09fb4 Improve protocol documentation Jan Klass 557b74b fix build: add qt_nl translation to mumble project file 398b773 Cherry-pick changes as per pull request #158 6eab5a9 Refac: Commenting, readability/code-flow of vars 0abf7e3 move logic into method OverlayClient::readyReadMsgInit; add curly braces 839a3e6 refac: readability/consistency 923a3b4 Update translation files (lupdate) 1621ff2 Add Hungarian (hu) and Dutch (nl) translations to project files b004a4c add a comment, remove an unused variable 708212a fix warning on unused var 1459792 fix 2 typos, add TODOs fd6b6e2 Update translation files (lupdate) 6e8c893 shorten and specify comment of authenticate return code 52272e2 update string: “ban list” not “ban lists” f4c54b2 Explicitly mark childmethods as virtual 46fc3cc Commenting, formatting. Remove obsolete/wrong comment. bb47083 Reduce varscopes and improve debugtext. 85fa2ce Code formatting, smaller refacs, robustness. 33069f8 comments. more elaborative debugoutput, consistent prefixing. 8b04426 reduce varscopes 487ed14 Implement copy constructors, minor cleaning 491228e lupdate translation files - mainly for HE d6b4b8e Add Hebrew translation to project files 6cc47c3 Update Hebrew translation by patch #366 b0707fd Apply patch #960: add preprocessor #if for OpenBSD 44202b2 add new translation pt-PT to project files 3227b1c Add guard define to licenses.h 2c490d7 categorize scripts (move example scripts for serverside into subfolders) 15370fb add path (sub-src) to header guard define 1e4bb6d Prepend Projectname to header guard defines 7642e72 Adjust header guard defines for uniformity 40ca9b4 Rename header guard defines to not use c++-reserved names Lukas Orsvärn c86ce47 Adds positional audio plugin for Sub Rosa Wesley W. Terpstra 10b2d00 Prevent overlay from disappearing on D3D DLL reloading. 2013-06-01 Stefan Hacker 5ff038e Update changelog Mikkel Krautz aab9cdc Server::sendMessage: encode the source IP of outgoing UDP packets to match the UDP socket's address family. 2013-05-11 Michał "Zuko" Żukowski c00b44e Minor fix in pl translation 2013-03-28 bogie dab8157 Updated BF3 PA plugin to Endgame DLC(b1147186) 2013-03-27 Martin von Gagern d71b2fd Ensure that the MAX macro is always defined. Mikkel Krautz bc871f6 murmur.pro: add CONFIG(ermine) for the Ermine packaged build. 2013-03-19 Stefan Hacker deeeb72 Swedish translation error (#973) 2013-02-02 Mikkel Krautz b115a29 opus-build: build with CONFIG=staticlib on Unix as we do for our bundled Speex library. 2013-01-27 Mikkel Krautz 1fa4e82 ConfigDialogDelegate: return fully standalone NSImage in QIcon_to_AutoreleasedNSImage. 2013-01-20 Stefan Hacker f4cc3f0 Fix mumble_ol.dll not being versioned under windows. 1a9aec9 mklic.pl run to update in-client license display Steve Hill 4dcd700 Positional audio plugin for Borderlands 2 v1.3.1 Mikkel Krautz c8b6d69 osxdist.py: create a tarball in addition to the XIP archive for OS X static Murmur. bogie fed89ce BF3 PA plugin update: fixed one value 2013-01-15 Stefan Hacker 8cbf176 Update changelog and LICENSE file. 2013-01-14 Stefan Hacker 6d67d07 Default disable hide in tray also for Windows 8 2013-01-13 Stefan Hacker 8678a0c Introduce concept of NULL plugin to retract plugins. Mikkel Krautz 8e79041 mumble_qt.qrc: remove nl, he, hu. 8b83aba mumble.pro, mumble.qrc: remove unfinished Hungarian translation from release. 0ddb922 mumble.pro, mumble.qrc: remove unfinished Hebrew translation from release. 886e8d1 mumble.qrc: also remove NL from here. 2d1bc76 mumble.pro: exclude unfinished NL translation. cd8e996 mumble_ja.ts: mark as finished. 09d8fa1 mumble_da.ts: 3. part licenser -> Tredjepartslicenser. Svenne33 e530cab mumble_sv.ts: update for 1.2.4. 2013-01-11 zapman d9edcbf Minor fixes for French translation 2013-01-10 Stefan Hacker 1253532 setLiveConf for opusthreshold and channelnestinglimit didn't reset on empty string (#938) 2013-01-08 Mikkel Krautz acb28e8 GlobalShortcutWin: revert 242af40b to restore keyboard suppression. 2013-01-07 Mikkel Krautz 242af40 GlobalShortcutWin: try to make WinHooks do less work. 2013-01-04 Stefan Hacker f569e1e Fix typo in mklic.pl 086d4a2 Add back accelerator keys for Cancel in QDialogButtonBox. e87028a Integrate MIT licensed 3rd party Qt translations for missing locales. 2013-01-03 Mikkel Krautz a691c40 Murmur: restore old meaning of -fg on Windows: don't write to the log file. 268ae8d Murmur: remove logfile detach warning on Windows. Detach is a no-op on Windows. 92206cc Various murmur.ini fixes. 2013-01-02 Mikkel Krautz 921f6e4 GlobalShortcut_win: log the user's LowLevelHooksTimeout value 2012-12-29 Michał "Zuko" Żukowski d25c069 Fix for Polish translation 2012-12-28 bogie ad1c30a Update for BF3 PA plugin 2012-12-27 Stefan Hacker 8b74d4b Make analyze config option also apply to release builds 2012-12-24 Stefan Hacker 0d825b3 WASAPINotificationClient singleton initialization wasn't threadsafe. 2012-12-22 Mikkel Krautz ea221f3 compiler.pri: add CONFIG=clang-analyzer for the clang-checker slave. 2012-12-21 zapman 3fc8861 French and Turkish translation improvements 2012-12-20 bogie 14f10e5 Update bf3 PA plugin 2012-12-18 Stefan Hacker e9ce44a Make sure we don't accidently add spaces to installer paths 24b6148 Add ini creation file for windows build 2012-12-15 Jan Klass 6ad5ea4 add RzSynapse.exe to overlay blacklist to prevent invisible hooking Mikkel Krautz 1eca952 Add Windows Phone IP over USB Service to the overlay blacklist. 2012-12-13 zapman 857b03a Fix swapped string in fr and tr translation 2012-12-10 Stefan Hacker 305b883 Small fix for French translation. bogie 9b0ae8b Updated bf3 PA plugin to Aftermath patch 2012-12-09 Stefan Hacker afa21be Add debug output to client-side SQL queries. 1b2023c Missing two strings for French translation. Jan Klass 001a5c2 fix bug 924: Server favorites disappear on second Mumble instance (-m) 2012-12-08 Stefan Hacker d14db99 Use same sentence structure for send message to channel/user in German translation so switching between the two is less jarring. 7f70a4a Fix typo in config and remote leftover debug statement in Meta.cpp f0c94f4 Fix outdated comment on bonjour config option default value. 9988e9a Improve murmur.ini documentation. 8c07c75 Add MetaParams::typeCheckedFromSettings to be able to warn the user if a default settings value was used because the given value wasn't in the expected format. zapman 5f46755 Turkish translation update d2839c8 French translation update 2012-12-04 Jan Klass 2a469e8 remove duplicate overlay blacklist entry for chrome.exe 2012-12-02 Jan Klass 4ec62f1 add Steam and chrome to (default) overlay blacklist 7d6beed fix bug #933: Double-clicking mumble in the taskbar results in a blank window 529f666 add version and fn existence checks to the PHP sample scripts 2012-11-30 GoD-Tony 0bdf4c6 Updated offsets for Counter-Strike: Source. 2012-11-28 Stefan Hacker bb76e7a Fix pre 1.2.4 clients receiving Opus warnings unintentionally. 2012-11-27 Stefan Hacker 07a0e51 Add Adobe Acrobat to overlay blacklist 2012-11-26 Stefan Hacker 3297416 Fix use of cConnection smart_ptr in ServerHandler Michał "Zuko" Żukowski bddefc2 Fixes in Polish translation 2012-11-18 Stefan Hacker 338c985 Manual positioning plugin had X-Axis backwards Michał "Zuko" Żukowski ab225ea Polish translation for Mumble 1.2.4 2012-11-16 Stefan Hacker 90599b8 Fix Servers with less than 1 ms latency do not show in the server list (#926) b933b3d Add WASAPINotificationClient code to reset audio in reaction to device changes on Windows >= Vista. Mikkel Krautz 46d659d overlay/d3d9: pass through IDirect3DDevice9 AddRef/Release methods to originals on Windows 8. 2012-11-15 Álvaro Manuel Recio Pérez e661969 Updated Spanish translation file for version 1.2.4 2012-11-12 Stefan Hacker becbda5 Add a small script to pull translation state from compile logs. 1922df7 Connection reject messages weren't translated properly client-side. B0nuse 09f2ec0 Final release mumble_ru.ts for Mumble 1.2.4 with new translating position 'Copy URL' in channel menu_fix 2012-11-11 Stefan Hacker f96c736 Update German translation and mark already translated strings as done. tkmorris 4316bea Minor tweaks to pt_BR translation Mikkel Krautz 071be0f HardHook: add additional opcodes. Spaccaossi 18d1b7b Updated Italian translation 2012-11-09 tkmorris 076f10c Lupdate missed a string in pt_BR translation 2012-11-06 haru_arc cb22b39 Update Japanese Translation 2012-11-05 Stefan Hacker 48646c0 Changing installer components without changing their GUIDs resulted in shortcuts not getting removed properly on update. 3f252eb Swap "Send Message" and "Copy URL" in channel context menu as copying a url is rarer and should be easier to hit. Jonathan E. Hansen 46740a2 Minor fixes for Danish translation 2012-11-04 Stefan Hacker ce83353 Make opustreshold and channelnestinglimit accept zero values in setLiveConf. 92152e1 lupdate run with disabled similartext heuristics. afd6ca3 Make installer use Mumble* environment variables for configuration if they are enable. Otherwise fallback to current buildserver defaults. 756f9cf Remove license, readme and uninstaller shortcuts from application menu. Mikkel Krautz a13bb16 ConfigDialogDelegate: memory management and coding style fixes. B0nuse 4f9b332 Final release mumble_ru.ts for Mumble 1.2.4. 2012-10-31 Stefan Hacker df56b92 Fix regression in RichTextEditor that prevent it from being completely emptied. 2012-10-30 Stefan Hacker 5fdf6e2 Fix drag and drop regression introduced by Qt updated. Lekensteyn ca5d432 Partial Dutch translation for 1.2.4 (#3581588) Jonathan E. Hansen 3d543fa Updated Danish translation for 1.2.4 (#3581734) 2012-10-29 Mikkel Krautz e430a08 macx: don't add scripts as a subdir, include it instead. 7de07df macx: pro file fixes for release.pl. 286f148 scripts/release.pl: make sure to archive files listed in OBJECTIVE_SOURCES. ef07910 scripts/release.pl: add sbcelt directories to fulldirs. 8b226ca scripts/release.pl: special considerations for sbcelt. 2012-10-28 Thorvald Natvig f4da625 QtMumble path c6b0e8b Fix build regression with ASIO 2012-10-27 Mikkel Krautz 752a630 plugins/link: make POSIX link work with Apple clang++ (Xcode 4.5). c49a17a tests: .pro file cleanup. d07f38f tests: update TestLink to build on OS X. 2012-10-26 tkmorris 9b09608 Fix typos in pt_BR translation after the string freeze 2012-10-25 Stefan Hacker 1983ff2 String freeze for 1.2.4. Jan Klass b9a0c54 add qt_hu.qm to mumble.pro project file 2012-10-24 Jan Klass 9bd10b0 refacs; initialization, var-scope reduction, replace c-style casts, rm unused 2012-10-19 Jan Klass 204affd add depend on Hungarian translation of qt 2012-10-18 zapman d74ea83 Update Turkish translation and add installer Translation 16b38b6 Update French translation 2012-10-17 tkmorris 04592b6 WIX Portuguese Brazil translation update, mostly typos 2012-10-04 Stefan Hacker ce65945 Forgot to update language list in Product.wxs db0fbee Add Portoguese translation to installer. tkmorris 19c9475 Portuguese installer translation. 2012-10-03 Stefan Hacker 1007d24 WIX msi installer chinese locale (#3565260) 2012-09-27 Stefan Hacker 5f42a5f Use U+2191 Upwards Arrow to indicate parent channel relationship for subchannel whisper to prevent "Data" field truncation. e69c3c6 Use new constants some more. bogie e4ea4b3 Added possibility to whisper to sub channels of parent channel(#1-#8) 2012-09-23 Jan Klass e5101f2 Fix debug output for overlay chain notice ea29bd2 initialize member variable DevState::initRefCount in constructor Natenom 95d2137 Translation updates; fix shortcuts for right click on a channel 2012-09-20 Mikkel Krautz 8fd27f6 osxdist.py: use new README for static server; tweak filename. c71aea2 Add more newbie friendly READMEs to the static servers. 2012-09-18 Stefan Hacker 145d9f9 Introduce channel nesting limit (default=10). 2012-09-16 Mikkel Krautz 98cacbc osxdist.py: only rmtree if path exists. b86c3b7 osxdist.py: move to a separate Murmur package on OS X. 58bd65b Murmur: fix static OS X build. a1eb9cf Mumble: include and export all Qt symbols to plugins (static OS X) 2012-09-15 Mikkel Krautz 63c91fa osxdist.py: consistent .dmg naming for releases and snapshots. e8a28dc compiler.pri: Update OS X Boost to 1.51.0. 2012-09-14 tkmorris 87bda5c Portuguese Brazilian update Benjamin Jemlich 6626e1d OverlayConfig: Hide uninstall button on Windows bogie 2aa057d accidentally switched top and front vector, has been fixed and tested with two people. 2012-09-13 Benjamin Jemlich 1db5d03 Benchmark: Fix crypt resync handling 2012-09-08 bogie 2b9233c updated plugins/bf3/bf3.cpp for DLC Armored Kill(build 981420) 2012-09-01 Natenom 9177738 Update INSTALL 2012-08-30 Natenom 6602fb6 Updated German translations Tsbook f884680 Czech localization update 2012-08-29 Stefan Hacker f178216 Update .ts files tkmorris 837e037 Updated Brazilian Portuguese translation B0nuse 4d17ba4 Translated new position at RU language file. 2012-08-20 EarlOfWenc 09d5c07 Replaced last traces of MD5 by SHA-1 2012-08-19 d-rez fba76cd Updated gw plugin for game build 36001 2668713 New PA plugin: Blacklight: Retribution (v0.9.8.0) Supports camera position, front and top vectors and context. No support for identity and avatar position/top/front vectors 752d582 Updated LoL plugin for game version .145 Mikkel Krautz a0b3706 compiler.pri: fix mistakes from previous commit; use QMAKE_OBJECTIVE_C(XX)FLAGS for ObjC-flags. 2012-08-18 d-rez 8333ba8 Updated League of Legends plugin (v1.0.0.144). * Moved some static addresses outside functions for clarity Removed top vectors retrieval which can be problematic and aren't used at all in this game * Fixed context support Jan Klass 92a37af make the overlay exceptions window more elaborative EarlOfWenc 377c65f Extended recording notification to linked channels Mikkel Krautz beea301 compiler.pri: cleanup -isystem includes, fix ObjC/ObjC++ FLAGS. f102f56 compiler.pri: mark all external library include paths as system paths to suppress warnings. 971f0ff macx/osax: fix unused parameter warnings. b6d8bf3 Log_macx: remove Notification Center notifications on click. 2012-08-14 Spaccaossi de46c7b updated italian translation 2012-08-12 Stefan Hacker 86383df Modify VersionCheck::fetched to keep last N (currently N=1) snapshots. b6f8996 Installer integration for just cause 2 pa plugin. Mike 7edc2a2 Add positional audio plugin for Just Cause 2 Benjamin Jemlich a01155c Installer: Remove useless Feature element 2012-08-09 Mikkel Krautz c2655fc Mumble: allow client to use SBCELT for CELT decoding via CONFIG(sbcelt). 2012-08-07 Benjamin Jemlich f5bac3d Log: Fix compile and logic error for ballon messages 2012-08-06 Stefan Hacker f8d57e4 A number of translations were missing from resource files. aa580f3 Trigger codec re-negotiation also on user disconnect and when opusthreshold is set. 8a9b532 Shuffle around idle action UI a bit. Mikkel Krautz 7a0f358 Log: clean up notification handling; add Notification Center support for OS X. 2c73aeb ConfigDialog: keep a ConfigWidget in expert mode after defaults have been restored. 2012-08-05 Mikkel Krautz a331d10 GlobalShortcut: instruct users how to enable full shortcut functionality on OS X, if they so please. 05c740b macx/osax: bump OS X overlay version. 9001c28 3rdPartyLicenses: add mach_override license. 96fd34d macx/overlay: sync with latest mach_override. 19577ae Only show the annoying 'Drag me' title bars on DockWidgets in Custom layout mode. 07e232e LookConfig: center layout options. 7154ec5 3rdPartyLicenses: add libogg, libvorbis and libFLAC licenses. 10d4307 3rdPartyLicenses: insert a carefully considered space into the libsndfile license text. 4d41a6e build: put Objective-C(++) source files into OBJECTIVE_SOURCES to make qmake shut up. 503c79f Overlay: only consider MumbleOverlay.pkg in app bundle. 7ad4569 Overlay: simplify OS X overlay installation. dbe199e Overlay: disable auto-updating. cfa5125 Boost 1.50.0 for OS X. 2012-08-04 Stefan Hacker 54384d7 Fix some strings. c088699 Redesign idle action configuration and add a mute idle action. f8c1b92 Make displaying users above channels default. f58dbc1 Make sure to send initial ping right after connect to establish UDP connection. cde04dc Fix Opus encoding for end of speech frames as well as bandwidth display. Benjamin Jemlich 3b1a6c0 ServerHandler: Fix Opus handling via TCP 2012-08-03 Stefan Hacker e7f8f0d Add CELT kill switch to configuration. (g.s.bDisableCelt @ audio/disablecelt) 27a98c0 Remove some now outdated references to CELT. 069b01f Use Opus in CBR mode to prevent bandwidth spikes. Benjamin Jemlich 139c625 Add Opus license to the about dialog 2012-08-02 Thorvald Natvig 6c9694d 'Fix' release script for opus 2012-07-23 Natenom 2ba6f00 Updated German translations 2012-07-22 Mikkel Krautz 9e23320 Plugins: make manual plugin load in static Mumble builds; still needs a few symbols to actually run, though. c3a86b8 Opus: switch submodule back to d060dd7c; last commit accidently changed it. c6c63fc Mumble: add Apple anchor library requirement to OS X codesign requirements. 08af6c2 Mumble: properly specify designated requirements for OS X Developer ID code signing. 2012-07-21 Mikkel Krautz cf0d1d1 Mumble: don't explicitly set codesign signature size in osxdist.py anymore (not needed for Developer ID). f2253cf Mumble: optimize osxdist.py for Developer ID signing. 723dd79 Mumble: simplify osxdist.py script, now that our OS X builds are static. 805e22d Mumble: more force-shared library builds. ab15cc0 Mumble: build shared CELT libraries, even for CONFIG(static). Benjamin Jemlich 924114f More translation updates 7dcaf46 Update translation files 2012-07-20 Mikkel Krautz 3d63fb9 Mumble: allow static client builds 2012-07-16 Benjamin Jemlich 994e130 Murmur: Fix message type detection in Server::processMsg and add a few more comments ab940f1 Mumble: Add Windows 7 compatibility keys to the manifest ddd3f61 Update Opus submodule and don't change the library version on Windows 2012-07-15 d-rez 442a9fd Further updates and optimizations to the LoL plugin - made the code simplier, less nested in fetch(). - strings are now ensured to be zero-terminated - replaced calcout() call from trylock() with fetch call that can actually fail. - Disabled identity support since it still needs some work. cb4b040 Fixed plugin for v1.0.0.142, added identity support added avatar top vector support added helpful arrays of bytes in case someone wants to update this plugin faster than me - if necessary, I can record a video-tutorial for this changed the way trylock function is executed since we don't need all these checks (and important ones are checked in refreshPointers() function anyway) Stefan Hacker 7d9d54a Minor modifications for lol plugin. e5c5649 Fix zero terminations. 2012-07-11 Bojan d8cbd6f BF3 plugin update. Added context + identity support. Stefan Hacker d39892e Minor fixes for bf3 plugin 1ba3a8b Clarify audio processing option: 'Amplification' -> 'Max. Amplification' Mikkel Krautz 5e4c61c OS X: use clang++ for QMAKE_CXX. 105c72e OS X: update build for Xcode 4.4. 2012-07-10 Benjamin Jemlich d2fb4e3 Fix code style 2012-07-09 Stefan Hacker 08f0d24 Modify Ice logging to only output on action and verify all callback adding functions are fine with being called multiple times with the same proxy. Benjamin Jemlich e0d031d Add (no-)bundled-opus config options 115c352 Build libopus.so.0 instead of libopus.so.1 ceab493 Installer: Add Opus DLLs 2012-07-06 Stefan Hacker 3bcc83e More comments for HardHook code ab155bd Ensure Mumble will actually crash on callback crashes on Windows 2012-07-05 Mikkel Krautz 03dbaa5 Embed install name in Opus dylib so OS X dist script knows where to look. Benjamin Jemlich e5ea4a2 Really enable Opus by default... 2012-07-04 Benjamin Jemlich 1368cbb Enable Opus by default 2012-06-28 Benjamin Jemlich 2e74b1b Move some variable declarations 2012-06-24 Stefan Hacker fea97c7 Unreal Tournament PA plugin: Installer integration + Some fixes. Jan Klass f432047 Update German translation 2012-06-23 QuirB 1b20395 New PA plugin: UT99 with context support. 2012-06-11 Jan Klass 01fc4bf WolfET: set context data in JSON format 833c02e WolfET: fix string buffer termination and use more efficient peeking 2012-06-08 Benjamin Jemlich 7ec4f6a Murmur: Add codec warnings and ignore non-Opus packets if Opus is enabled 1443478 CELTCodec: Fix compile error if PLUGIN_PATH is set f0c16f3 Murmur: add Opus threshold option 2012-06-06 Benjamin Jemlich 3c2dec5 Audio: Move CELT code 99c4e21 Audio: Remove unused CELT loading code 2012-06-05 Benjamin Jemlich 852d346 AudioOutputSpeech: Fix noise problems in Opus mode Ryan Austin e16ee9a Updated BF3 PA plugin for BF3 v944019 2012-06-03 Stefan Hacker a2a3836 PTT hold feature that can virtually "hold" down the PTT key for up to 5s after releasing it. (#3380557) 2012-05-31 Jan Klass 5f2096a Update WolfET positional audio plugin - fix Z and add context Benjamin Jemlich 5c353d2 Update Opus submodule 84ed2eb Murmur: Remove unused DBus.h includes 0159d50 Murmur: Allow temporary user name changes via Ice c2b7c00 Murmur: Generate a random SuperUser password for new servers 019e6da Murmur: Disconnect clients sending huge packets 81caf1c GW plugin: break it because it doesn't work 611abe5 GW plugin: style fixes 6633ea0 MainWindow: Manually minimize the window 441d06f ChatBar: Always use the current channel by default d7f03ab MainWindow: Remove annoying connect/disconnect shortcuts 315b5f5 mumble.pro: Enable Opus on Linux if it's installed 2012-05-20 d-rez 317f5a0 New positional audio plugin: Guild Wars Supports context and identity 2012-05-18 Benjamin Jemlich 814ae5e AudioInput: Add codec switching code which supports Opus f27ad36 Remove Speex encoding code 13a97b4 ... and another #ifdef USE_OPUS 69fe654 Add some more #ifdef USE_OPUS checks ed06d82 UserInformation: Fix Opus status display f86012e MainWindow: Display current codec in the server information dialog 7c700a4 AudioInput: let's use the correct limits and constants 8aa681c AudioInput: Fix float to short conversion 2012-05-16 Benjamin Jemlich 1807da3 MainWindow: Restore MainWindow if someone clicks on a notification message 52e27ef Murmur: Disallow mute/deafen status changes in temporary channels 4bc8782 LOL plugin: code style fixes and optimization :) f7afaec Add VS files to .gitignore 2012-05-15 Benjamin Jemlich fff96fa ConnectDialogEdit: fix tab order 0f70781 Update translation files 9550c3b MainWindow: View comment should change the seen state for comments fd796db UserView: fix comment icon click target if ignore text messages is enabled 2012-05-14 d-rez eef9a67 updated plugin for Team Fortress 2 b4934 840487d context support for League of Legends plugin f81049d Added context support for the l4d2 plugin. Changed global pointers to static (as thorvald requested in one of my previous commits. Context contains provides ipport as json attribute. Benjamin Jemlich 2ff3d34 Unify .gitignore files a919a56 Installer: More plugin installation fixes 2012-05-13 d-rez 56fcebb New plugin for one of my favorite games, League of Legends. Supports ingame detection (based on a pointer being NULL or not), reports camera and avatar independent position, front and top vectors. 84b897c Fixed l4d2 pa plugin for build 4777, re-enabled states support Stefan Hacker 3c2dd60 Add missing build/installer integration for LeageOfLegends PA plugin. 2012-05-01 Benjamin Jemlich f90c6e3 More plugin touching 2012-04-30 Benjamin Jemlich 2026dfa Comment changes to the plugin headers 2012-04-29 Thorvald Natvig 4653fd8 Upgrade boost 2012-04-28 Ryan Austin 3503cd2 Updated BF3 PA plugin for BF3 v936211 2012-04-10 Benjamin Jemlich 1a3b3b0 ClientUser: remove getByHash 2012-04-02 Ryan Austin 2047c9f Updated BF3 PA plugin for BF3 v925790 2012-03-22 jgeboski 0c51fbd MainWindow: directly set the window icon 2012-03-20 Benjamin Jemlich e5c4657 Save one more byte in the Opus terminator b498613 Reset Opus encoder state on stream start e1b5710 Fix Opus frame counter in AudioInput bd195cd Improve Opus terminator flag 2012-03-13 Harry Gabriel c707cad Update slice path for Ice 3.4.2 Ilmar Kruis 7e5e7f9 Lotro Update 6 2012-03-12 Benjamin Jemlich c17ca26 Murmur: Add workaround for databases that contain channel_info rows for channels that don't exist 2012-02-26 Benjamin Jemlich 88e9e6a Link benchmark test to QtXml b2258e6 Fix GCC compile error 491cd1e Misc fixes 0bba55b Check correct key usage in the Win cert verify function 2012-02-25 Benjamin Jemlich 74d9ccd Fix Win cert validation code for hostname mismatches 6f7f05e Empty server response in WebFetch::fetched is not an error 07d5679 Use a more correct way to get the application data path on Windows ea121b6 Validate server certificates using the Windows API 06f0d18 Fix Windows installer build 2012-02-24 Patrick Matthäi 5f79a1b Unified spelling of of writable (s/writeable/writable) 2012-02-23 Mikkel Krautz 442d19e GlobalShortcut_macx: add EventTap listing when pressing Ctrl-Alt-Cmd. 1d0ed05 GlobalShortuct_macx: TailAppend instead of HeadInsert. fe25495 GlobalShortcut: allow users to disable global shortcuts without removing all of their shortcuts (for supported engines). 2012-02-22 Mikkel Krautz 370c2d3 OS X: move upgrade variables to upgrade.xml for new productbuild overlay installer. 114c201 Overlay_macx: mv-to-tmp-based uninstall. 30b94b7 OS X: productbuild-based overlay installer. 2012-02-19 Mikkel Krautz 46b8cd4 OCD. Benjamin Jemlich d16876d Fix certificate validation with QT 4.8 2012-02-18 Mikkel Krautz 4ad6ccf OS X: Add more licenses to disk image. da7f5b7 Include instead of the HAVE_STDINT_H hack. 6c7d8dc OS X: Update dist scripts, add --no-server option. 9446e3e OS X: Build fixes for Xcode 4.3 (mostly PCH-related) fa9aed8 OS X: Update compiler.pri to new Lion toolchain Benjamin Jemlich 079bba8 More G15 SDK path fixes 2d9d78a Remove hardcoded CA certificates a3c55c4 Update Opus submodule 9a7470f Fix G15 SDK path 2012-02-05 Mikkel Krautz cde6c68 Revert back to mumble-g15-helper-based G15 support on Windows. Benjamin Jemlich 98f4ac1 Fix user what's this help icon -> text mapping 586cd61 Load update check option using the correct variable 70c3af0 Fix G15 helper program installation 2012-01-15 Mikkel Krautz ca8b25c Re-enable uiAccess=true 2012-01-14 Mikkel Krautz f77936b Allow hooks in GlobalShortcut to be disabled on Windows via hidden setting. Natenom 314132a Updated German translations Benjamin Jemlich 63018bd Temporarily disable uiAccess=true 7300338 Try to read system-wide ini files first if running as root 6289931 Added more logging for Ice callbacks cc8e245 Mark Server::log as const zapman 63a384d Updated french translation 6b3a97e Turkish translation 2012-01-11 Mikkel Krautz 133a83f Build fixes for universal OS X. 2012-01-08 Benjamin Jemlich 8667e6d Fix Speak ACL for users entering a channel 2b9e094 Allow using ChanACL::hasPermission without a cache Thorvald Natvig 9bd726a Parse \ in pro files 2012-01-07 Benjamin Jemlich fc322ea Fix compile error 17eb6cc Apply suppress ACL before switching channels 356bd2e Obey Whisper ACL for User-to-User Whispers 2012-01-04 Benjamin Jemlich eb291db Workaround for missing disconnected signals on Windows 87376a9 Fix strong cert check for self-signed server certificates 2012-01-02 Michael Ziegler 8ab94fe add 'status' command to the init script 2011-12-23 Mike 9e8976a Update TF2 plugin to build 4785 2011-12-11 Stefan Hacker a45a4dd License work 2011-12-08 Ryan Austin 31bb25e Updated plugin for BF3 v889134 2011-12-03 James Fraser 723eafd Fix typo in French translation per WarT (blabla29 @ sf). 8e84148 Update World of Warcraft plugin to build #15050. 2011-12-01 Benjamin Jemlich 39319f8 AudioInput: Fix crash on short audio packets 2011-11-24 Benjamin Jemlich 7f9395f AudioOutputSpeech: Use the correct buffer size for the resampler 2011-11-23 Ryan Austin b9957f0 Updated plugin for BF3 v8865831 2011-11-22 Benjamin Jemlich f43a072 AudioOutput: Fix compile error on Windows 0a6aa01 AudioOutputSpeech: Fix output buffer size calculations 6e12d31 AudioOutputSpeech: Use a buffer on the heap for the resampler 99d0b2c Add terminator packet for Opus streams fd98bdf Split AudioOutput.h/cpp 2011-11-21 Benjamin Jemlich 4238455 Fix some Opus FIXMEs and add a few new ones 2011-11-20 Benjamin Jemlich 391be12 Fix compiling without Opus 29e7a54 Change Opus packets to remove the library hack 2011-11-11 Benjamin Jemlich b5f082a Remove unused files bb2ef52 Windows build fixes 2011-11-10 Ryan Austin c8d1447 Added Battlefield 3 Plugin for build #876650 2011-11-09 Benjamin Jemlich 43e6118 Remove Qt <4.6 compatibility defines 07737a3 Fix include guards and PCH includes 2011-11-08 Benjamin Jemlich 37c2e27 Fix crash on server messages c45dad9 Fix Opus on Linux 2011-11-06 Benjamin Jemlich 4ffa9d7 Fix typo in include guard Thorvald Natvig 6e1db01 Undo the debug test, silly me 54fee0b Opus negotiation (client) 86fc793 Opus codec negotiation (server) 2011-11-05 Benjamin Jemlich 7586a61 Add basic Opus support ab713e5 Unbreak Ice authenticators 2011-11-04 Jan Klass 19aeaed add lollauncher.exe to overlay blacklist 2011-11-02 Benjamin Jemlich 865b007 WASAPI: write the correct variable to the log a21e39c WASAPI: use a function to open the devices 2011-11-01 Benjamin Jemlich f35cc6a WASAPI: add more error logging 5d3f770 WASAPI: ask WASAPI if it supports our modified format and fall back to the mix format if it doesn't 46af9f8 WASAPI: move ducking opt-out to a separate function 8ccad2b WASAPI: unify exclusive & shared mode rendering loop 2011-10-29 Stefan Hacker eb93c08 Fix forced auto update check for snapshot builds. Benjamin Jemlich 32787e5 Fix auto version check logic 2011-10-27 Benjamin Jemlich 5344bbd Request 2 output channels on Windows without PA 2011-10-23 Benjamin Jemlich 089b23d Fix ghost disconnect removing permissions (#3423985) Spaccaossi 7964a55 Updated and applied improvements based on suggestions given by italian users. 2011-10-22 James Fraser 380b52d Update Retail version of Battlefield: Bad Company 2 to build #795745. 2011-10-14 James Fraser b383722 Update Counter Strike: Source to Build #4724. 832eb89 Update Counter Strike: Source plugin to build #4720. 09325a3 Update Battlefield: Bad Company 2 Plugin to build #795745 (Steam Only). 60cf7f8 Add local-ignore-text-messages option. 2011-10-13 James Fraser b46b5e1 Update WoW plugin to build 14545. 2011-10-12 Asura Lee 47dae73 Updated Chinese Translation. Ilmar Kruis 2411943 Update LOTRO to RoI release 2011-10-09 Jan Klass f6e586d remove obsolete MumbleScript.h/.cpp files 5fe6801 handle some cppcheck-found issues: * uninitialized membervars, * AudioOutput.cpp: fix delete on array to delete[] * OSS.cpp: close file descriptor in false data case * OverlayEditorScene.cpp: rm duplicate logic * fix ifndef to match usage of declared variable * member var initializations * check for null (ds in d3d9 as some lines above), * lower scope of var decl., * swap bufsize check and array dereference so check is before! deref, * initialize member vars in constr. 2011-10-04 James Fraser e11752b Update Counter Strike: Source to build 4687. 2011-10-01 DNW a8975fe Add Server::effectivePermissions() to ICE (https://sourceforge.net/tracker/?func=detail&aid=3389065&grou p_id=147372&atid=768008) James Fraser 6a46030 Make edit button greyed out if selected item is not a favorite. b61f781 Added Edit button to Connect dialog. 9cc9539 Fix bug #3200725 @ SF - RichTextEditor disregarding g.uiImageLength. Thorvald Natvig ccd95be Strip merge pull request from changelog (oh, and update the changelog) f506511 Add %s for printf 2011-09-18 Stefan Hacker ae54c0c Add some comments to AudioInput::addMic/addEcho 2011-09-05 James Fraser 41100fd Add 'Crimecraft: Bleedout' to default blacklist. 2011-08-25 Jacob Peddicord 0e4d963 Implement audio attenuation for PulseAudio. 2011-08-21 Stefan Hacker aed5c1e Split up and refactor WASAPIOutput::setVolumes function to get rid of excesive indentation. 2011-08-14 Mikkel Krautz 72185ae Mark OverlayInjectorMac as conforming to SBApplicationDelegate on 10.6+ to fix Lion-only builds. 53cd8e4 Update Boost version for OS X. 2011-08-07 Stefan Hacker 86b8c00 Make bf2 plugin correctly clear its context and identity 2011-08-05 Stefan Hacker b05dc71 Make vld an explicit, default off, option instead of implicit default 1a8d879 Make winpaths_default.pri arch independent 2011-07-31 Stefan Hacker f0c2bfd Replace some manual version conversions with appropriate MumbleVersion calls. c99661d Remove some dead code previously related to version checking Michael Ziegler b79b960 tr() the strings and change default version to 1.2.0. 2011-07-29 Stefan Hacker d31b33d Updated boost to 1.47 Michael Ziegler f1c6e83 style/typo fixes, use QMessageBox on Windows, don't rely on argv[0] being set 4a26190 add long command line option names, add -h/--help options. 2011-06-30 Jan Klass 69baac1 add thunderbird and instantbird to overlay blacklist (new hw-accelerated versions) 2011-06-25 Mikkel Krautz 81dee1c Update version number of OSAX overlay injector. d9417cb Fix the overlay on Mac OS X 10.6.8. 2011-06-17 Mikkel Krautz e9cfd21 Add build configuration for compiling on Lion. 2011-06-15 Benjamin Jemlich eeb1737 Fix UDP problems on IPv4 only hosts 2011-06-13 Stefan Hacker 2d838f2 Prevent PTT window from showing up in non-PTT modes as well as from minimizing when the MainWindow gets minimized. Natenom a270c7f Updated German translations 2011-06-11 Tsbook 60ea789 Czech Tanslation Update (#3315071) 2011-06-10 tkmorris c581e0e Updated Brazilian Portuguese translation (#3314540) 2011-06-09 Semion Tsinman 821d7ce Updated Hebrew translation (#3308818) Stefan Hacker c873e08 Prevent user from accepting the channel add/edit dialog when channel names are empty. Implements patch #3289052 in a leaner way Natenom bc32f8d Updated German translations Svenne33 fc03b89 Updated Swedish Translation (#3296034) 2011-05-28 Mikkel Krautz d4f271b Don't link against ScriptingBridge in universal builds. 2011-05-27 Thorvald Natvig 5632c35 Explicitly remove file permissions for settings and DB 2011-05-21 Stefan Hacker 67ed381 Add PTT button window for tablet users 2011-05-20 Benjamin Jemlich a25d3a5 Fix log window resize behavior 2011-05-19 Stefan Hacker f9ab14c Add sendversion parameter to ini Thorvald Natvig 0afd37a Include entire plugin structure 2011-05-16 Stefan Hacker a24e50e Fix Windows build. Reverted move of overlay blacklist as it is needed in both the overlay itself and the client (broken by 2dad2795bd0d60320811) Fixed error introduced in VersionCheck::fetched (broken by f57f81248f0a15e7f77e) Readded missing Server.h header in Tray.h (broken by 7529297760ac4d2d1f0a) Fixed broken build files (broken by f7cc6e7adee66b57c33a) Benjamin Jemlich 6a52586 Move overlay blacklist to its own file fbeed39 Fix iObfuscate for IPv6 4fd379b Fix more Windows build errors Thorvald Natvig c3ffe0b Horrible hack to allow parallel resource builds f7cc6e7 Now with 'make -j' support 2011-05-15 Ludwig Nussel 10baf16 fix bonjour support using avahi compat lib 3322f1b remove CAP_NET_ADMIN Benjamin Jemlich 7529297 Fix uppercase vs lowercase vs PCH include problems Thorvald Natvig dbf8879 Resort to predeps 03136ba quiet-build-log for binserver 45bd813 Fix murmur warnings 1ada87d Fix warnings in overlay_gl 2dad279 Move overlayBlacklist and care about error on ftruncate c675089 Use __typeof__ CELT resolve for g++ f57f812 Fix some compiler warnings b99c639 Get rid of unused macros d0f075e Add quiet-build-log config option 5459d4d Make -j for binserver 4c28e60 Clean up proto/Ice headers on make clean 2011-05-14 Benjamin Jemlich d09176e Include more boost::shared_ptr headers to fix the build b87ee95 Fix use after delete in DX10 overlay code c8bd81a Use make_shared in the VoiceRecorder 900f1e5 Opus support for the server d9324c2 Add a missing pch include in WebFetch.h 23f6820 Restore forward declaration in VoiceRecorder.h c35d093 Fix coding style in PulseAudio code e53de87 Fix coding style in the UserInformation dialog 07ddfc7 Add NOMINMAX define 373cdeb Disable sending Speex encoded audio 342ed0e Use the qBound macro to clip samples 6150084 Add and remove some forward declares from header files fa7ea52 Fixes for /Zc:wchar_t 4315214 Fix some -Wshadow warnings 6d6afca Fix changing iMaxUsers f7d7b99 Merge ContextActionRemove and ContextActionAdd and rename it to ContextActionModify 2011-05-13 Stefan Hacker ba66c4d Do not change the order of protobuf message types. c98e3ea Fix: Stale custom context menu entries (#3301658) 052d51d Fix: Ducking events attenuate Mumble (Win7) (#3294588) Opt-out of ducking events. This prevents Mumble from being influenced by stream attenuations triggered by other communications applications. Only applies to Windows 7 with WASAPI since other platforms do not have this feature. df4b0b3 Work around scrolling behavior of QTextBrowser in Log(Fixes #3298338). 2011-05-12 Thorvald Natvig b8986c9 Ok, actually commit the script change so it doesn't get wiped out 2011-05-11 Thorvald Natvig 07bf146 Use TCP destination as UDP source 2011-05-10 Thorvald Natvig bcb42f1 Ermine based server dist 2011-05-08 Thorvald Natvig d96648e Answer ping from same UDP address sent to (Linux only for now) 2011-05-04 Thorvald Natvig 1550415 Use installation default paths and stop being difficult 2011-04-30 Stefan Hacker 74a4051 Fix mixed up buttons in AudioInput 6b33a67 Improve documentation of Ice stop() command James Fraser 4586068 Don't check version numbers of URLs being sent over RPC. 2011-04-25 Stefan Hacker ee72dea Modify PTT queue to work for all kinds of transmission (#2857488) 2011-04-24 James Fraser fa7a412 Added option -wipelogs to clear logs in DB. Thorvald Natvig 4420c07 CONFIG+=no-xinput2 2011-04-21 Benjamin Jemlich 23e3999 Restore Qt <4.6 compatibility in WebFetch 2011-04-18 Mark-Willem Jansen a3245f0 Plugins: TF2 updated to build 4539 2011-04-17 Stefan Hacker 4d50beb Improve error message when connecting with an invalid password/certificate to a registered account 2011-04-08 Stefan Hacker 05d91c1 Regenerate Ice wrapper file James Fraser bd690db Fixed up Otto's patch (#2911421), mostly style stuff. Changed int -> uint and iterators to foreach() Otto Allmendinger 1d832d5 Text Message Callback with Ice 2011-04-03 James Fraser 6f156fa Correctly disable 'Disconnect' option when you abort a reconnection. 2011-04-02 Stefan Hacker f738bb2 Fix chatbar sending empty messages (#3267833) a972df6 Convert context field to json Mark-Willem Jansen 4a98c74 Plugins: updated Team Fortress 2 to 4426 Thorvald Natvig f7d8711 Deal with non-rc versions for tarballs 2011-04-01 Matthias Salzeder 4232dc1 added meta shortcut to toggle channel link state 2011-03-29 Eli Tallman 6297937 Update/Fix L4D plugins 2011-03-27 James Fraser 9c4a194 Added a more helpful error condition to -supw being used without a password Mikkel Krautz ac0cf66 Overlay_macx: Use newer version of libxar with proper codesigning support. d5161aa Overlay_macx: Remove more unused code from the previous cleanup. 23d1baa osxdist: Add extra codesigning step for flat pkg files and the ability to select the keychain for your codesigning identity. d12bb8a Bump OS X overlay installer version and set minimum required version to 1.2.3 since we haven't broken compatibility yet. 2011-03-26 Mikkel Krautz 9923549 Overlay_macx: Undo intermediate CA workaround for versions of Mac OS X prior to Snow Leopard. 2061dc1 Fix QString-from-ASCII errors on OS X. Thorvald Natvig 9facb12 Fix serverside suggestconf error for versions 2011-03-25 Mike 20ebcdc Positional audio plugin for Grand Theft Auto IV Benjamin Jemlich d775d5c Remove OpenGL dependency in the audio statistics dialog Thorvald Natvig 94967ab Suggest Config 2011-03-24 Ludwig Nussel 101bcaf if service name is empty don't pass an empty string e57c008 fix compile error Thorvald Natvig 35cc9cf ; 2011-03-21 Thorvald Natvig 4aec112 Add \brief c06dfbc Create common utility class for fetching from mumble.info 2011-03-19 Stefan Hacker 0e1a351 Merge branches 'fwaggle-fix-default-port-on-paste' and 'master' 6de7303 Make text log only scroll automatically when user hasn't manually used the scrollbar to scroll to something in the middle (#3220440) 6f079db Fix compilation on Windows. 7bdd779 Update boost to 1.46.1 James Fraser b752ea0 Added a macro "DEFAULT_MUMBLE_PORT" in src/Net.h so that its a one-line change should the default port ever change. fb9df24 Fixed pasting of port-less URLs into connect dialog 2011-03-18 Thorvald Natvig f3437a6 Update copyright year ranges of dev team. 2011-03-17 ronoc e6831d8 Set the correct pulse audio properties, for the icon, app name and the media role on the pulse connection. This will help other apps identify mumble at runtime and be able to determine mumble's purpose. Ludwig Nussel 7d2d3ef open log file early so log dir can be root owned 82c4186 fix user switching c858071 fix build error with capability.h Thorvald Natvig 0e66a64 Make log rotation more robust 2011-03-14 Mark-Willem Jansen 2f3f6b1 Plugins: Initial setup for the breach plugin Thorvald Natvig aed9d26 Update binserver git-describe 2011-03-13 Thorvald Natvig 64f17cf Fix a few warnings Tsbook a3c1eac Updated Czech Translation (#3208772) 2011-03-12 Thorvald Natvig fb6e0ac And move qobject defs to a header so they will be parsed ee6bccf Fix speexbuild pro and mysql installer path 973790f Update win32 build paths 2011-03-10 James Fraser d2a023e Added "Copy URL" to channel context menu. 2011-03-09 Stefan Hacker fb61d50 Fix Timer includes all over the codebase and fix some pro/pri buildfiles. Martijn Stolk db2538f Overlay: add sorting options, including ability to sort on last state change 6d62ae7 Overlay: add support for displaying active users Thorvald Natvig 9682d7d Allow some leeway in the timer atomicity test 2011-03-07 Stefan Hacker e83cec0 Instead of warning when casting from ASCII to QString in the client disable it completely. 2011-03-06 Stefan Hacker 8c952c3 Remove duplicate overlay debug output code. James Fraser e83173c ICE: Add udpPing and tcpPing to User Mark-Willem Jansen c245e2d PulseAudio: Fix multi speakers configuration. 2011-03-04 Stefan Hacker b986e84 Fix possible access violation in Overlay 05096f7 Add some comments to hooking code 2011-03-03 Tsbook 630d712 Czech Translation Update 2011-03-01 James Fraser 188b652 Fixed Ice method getLogLen() requiring write secret instead of read secret. 2011-02-27 Stefan Hacker 4774dab Moved windows self detection mechanism into Windows specific Overlay code instead of special casing it in generic one 3db23e6 Make mumble overlay able to detect mumble independent of executable name James Fraser 296ee6f Fixed typo: "staring" -> "starting" in OSS.cpp Thorvald Natvig 2cd9863 Work around broken XI2 master devices 2011-02-26 Mikkel Krautz ad3926a Kill the nagging accessibility dialog from GlobalShortcutMac. Benjamin Jemlich fcc8c2b Split AudioInput::encodeAudioFrame Thorvald Natvig ffbeaa2 XInput 2.0 support 2011-02-25 Michał "Zuko" Żukowski e067269 User Information improvements 2011-02-22 Stefan Hacker ddd9c97 Add no-elevation build-flag to prevent the need of signing win32 release builds during testing 2011-02-21 Stefan Hacker a65bb68 Make message read back user configurable Michał "Zuko" Żukowski 6755b81 Added gg, xmpp, skype and mailto to allowedSchemes 2011-02-20 Stefan Hacker 859d7a4 Remove leftover launchCompatibilityClient signature 4188575 mumble:// links without or with invalid version parameter now refer to 1.2.0 by default. Also remove version hardcoding in checker and fix version check in general. cb39dc6 Save current input when using the history 8fa3b10 User ctrl+up/down for chatbar history ee21456 Fix violation of abstraction in ChatbarTextEdit 127a09c Fix setenv called on windows build f07d33b Add history to chatbar ae024c8 Remove obvious "FPS:" text from overlay leaving only the number 0e155a5 After downloading a new snapshot delete all snapshots older than 30 days from the snapshot folder Justin McGrath 52a8f39 Added FR 2109227: limit the chat log size. Mikkel Krautz 91a4fe6 Don't try launch compatibility client anymore. Rafael Correia 99cc86d rework to improve the quality of the code of the patch (bug 3067616 - DUAL Head PTT) Thorvald Natvig f11d097 Protobuf 2.4.0a on Win32 (and static) 873282b Update ASIO path 064a5a3 Bump version to 1.2.4 d294ccd Fix pch 2b84bd7 Suppress vendor lockin suggestions 2400cae Unify snapshot/release defines 1161c9a Remove 1.1.x - no longer maintained 2011-02-18 Stefan Hacker df0f290 Add some other applications to the overlay blacklist 2011-02-17 Stefan Hacker 520ad96 Add Photoshop, Blender and GoogleEarth to the overlay blacklist 2011-02-16 Thorvald Natvig 3ccbe53 Experiment with immediate overlay delete 2011-02-15 Stefan Hacker 263338e Add Windows Live Suite and Secunia PSI to default overlay blacklist Thorvald Natvig ed8ab35 No, events from deleted objects are really not ok. 1e74ee5 Upgrade to CELT 0.11.1 in-place 2011-02-12 Eli Tallman 2da7fb6 Plugin update run Thorvald Natvig f6b6f21 Don't spam console for release build 9f2c927 No variance without averge Michał "Zuko" Żukowski 1601fb8 Password is now not visible in the Import Certificate window e027b3f Updated Polish translation cebb2dd Fixed 'nan' in user information (average ping) for newly connected users 2011-02-11 Thorvald Natvig d694432 Update mumble-overlay script 2011-02-07 karokatona 3c1d24c Hungarian Translation Thorvald Natvig 685809c Remove CELT 0.10.0 2011-02-04 Mikkel Krautz 775165f Add CELT 0.11.0 to OS X dist script. Benjamin Jemlich d256a9f Add missing celt-0.11.0-build dir 04a3fcd Fix overlay editor font dialog opens behind MainWindow 58aba64 Add CELT 0.11.0 support 2011-02-01 Mikkel Krautz cd52bf6 Re-add menu roles to Settings and About menu items. The default (text heuristic) only yields the correct result when the texts are in English. 4199de4 ShortcutActionWidget: Use default size for OS X. With AdjustToContents, the QComboBox *is* bigger than the contents. 2011-01-23 Thorvald Natvig e0ba383 Work around timestamp update for mysql 53e5c75 Fix ID of new server if all servers deleted 4559674 Add Qt 4.6 Guard to QAppMumble::event c61522e Remove older CELT 0.9.0 2011-01-22 Joshua Kocinski dc662e0 Set bAutoUnmute flag properly when deafening while muted. Benjamin Jemlich 421833e Fix bIsSpeech logic 95d13a5 Style fixes in ACLEditor.cpp 426c411 Simplify iIsSpeech logic 2011-01-21 Thorvald Natvig 324338f Iterator oddness in ACL Editor 460e489 Ok, slightly less verbose, then Spaccaossi a7f91b7 Updated italian translation 2011-01-20 Thorvald Natvig 1cafc8b Add overly verbose proxy widget adding. e1b24d2 Clean up a few compiler warnings. 832f5aa Include ancient ice path as well 2011-01-12 Benjamin Jemlich 1e5cd08 Fix benchmark client to compile on Windows 2011-01-11 Mikkel Krautz 51223e9 Remove unused AppleEvent parameter hack from os_mac.mm. db1b92a Update Mac OS X URL handling to be compatible with current Qt. eeac069 Fix "freeze on launch" issue on OS X. It turns out that sending blocking AppleEvents to oneself is not such a good idea. Benjamin Jemlich cd1f4b3 Add a workaround for broken CodecVersion messages on 1.2.2 servers 2011-01-10 Benjamin Jemlich 08904af Use TLSv1 in the benchmark client Thorvald Natvig 82879ed Re-add 0.9.0 to package script ce85721 Change CELT 0.9.0 to 0.10.0 in package script 2011-01-09 Stefan Hacker 194ab56 Fix overlay causing stack overflow when closing vs2010 solution ce51f28 Prevent random fluke in ip/port readout in bf2 plugin 2011-01-08 Antoine Bertin d90cf06 Updated french translation for Mumble B0nuse 032546b Updated mumble_ru.ts Mark-Willem Jansen 283b935 Added information to the warnings, to help trace problems on windows systems Ilmar Kruis f8d393c 'November Update' for Lord of the Rings Online plugin Thorvald Natvig 41af016 Make active-state of shortcuts be data-dependent 2011-01-04 Benjamin Jemlich c30e964 Create the RecordInfo object before adding a new RecordBuffer 2011-01-03 Benjamin Jemlich 48c3c07 Set bDisconnectEmitted in the client code 2010-12-28 Thorvald Natvig f9089d8 Auto-rename tarfiles 2010-12-27 Mikkel Krautz f38d1ad Add CELT 0.10 to osxdist.py. Thorvald Natvig 5bdf525 Timestamp table upgrades 2010-12-24 Stefan Hacker b50a0ac Update bf2 plugin to use json instead of xml for context/identity representation 357725a Fix AudioWizard focus after invalid shortcut entry Benjamin Jemlich 87f41f4 Add CELT 0.10.0 DLLs to the installer 03a8634 Change MySQL table creation statements to work with 5.5.x ecf3bdd Save last channel on user registration 606658e Always set umtType to the correct version 7c66886 Move bDisconnectEmitted down by one level 2010-12-23 Stefan Hacker ee8dcd8 Fix some problems with overlay backlisting not preventing dx hooking. Improve checking for WPF. 0813b58 Add 'M:' prefix to fods/ods overlay debugging function output Eli Tallman 90e1f7e Fix unreliable commander state memory address 2010-12-22 Stefan Hacker 50a136c Fix Timer class for systems with unusually high performance frequency numbers or long uptime 2010-12-21 Stefan Hacker 2077aa0 Fix previous wizard patch Benjamin Jemlich 83dcdc3 Add CELT 0.10.0 d82a608 Use QElapsedTimer if it's available 2010-12-20 Stefan Hacker f642271 Prevent server from forward audio from muted clients 90f5f78 Fix possible client/server mute state mismatch b36c879 Fix attenuation not being disabled on disconnect 04a5b5c Fix possible crash in MainWindow::talkingChanged() 2010-12-19 Eli Tallman 6d332cb Update Steam support for BC2 09008e6 Fix semicolon omission 120fa9e Plugin updates for release 2010-12-16 Benjamin Jemlich 4c1e473 Restore Qt < 4.6 compatibility 495c8c3 Remove Qt dependency in the LOTRO plugin 2010-12-05 Benjamin Jemlich 223d0a9 Unbreak send message on double click fcb681c Fix another chatbar size bug be86148 Release the plugin lock before calling about/config on a plugin be7ad39 Fix updateMenuPermissions() after context menu change 2010-12-04 Michael Ziegler 5072837 work around linux (that is, kde) switching channels on a single click Benjamin Jemlich 079f1ad Remove local variable in getOSVersion ece6a89 Readd the scrollbar changing to the chatbar in way that doesn't crash and doesn't break everything Thorvald Natvig c0bf2c2 Update release script 012dfc6 Use bzip2 for static build 2010-12-03 Stefan Hacker b8a2745 Fix two signed|unsigned comparison warnings e8a2bb5 Prepare murmur for user defined server locations Mikkel Krautz c857a99 CoreAudio: Use AudioUnitPropertyListener instead of AUEventListener to listen for AudioUnit stream format changes. 405ef1a OverlayMac: Don't use NSBundle#objectForInfoDictionaryKey to determine whether we're up to date. Mark-Willem Jansen da83cdd Overlay: On windows sync the settings to registry when overlay config is changed 2010-12-02 Mikkel Krautz c85be07 Use Audio::start() and Audio::stop() in ConfigDialogMac. 8366832 CoreAudio: Restart AudioInput/AudioOutput on stream format changes. 2010-11-29 Finessi Manuel ef07a72 Patch for bug: 3117145 Mikkel Krautz acf85af Drop the date from Mac OS X snapshots. 2ffa671 Don't include newline character from 'git describe' in osxdist.py. Benjamin Jemlich 8c4abd2 Use default indentation in the treeview 39039c2 Disallow RequestBlob for unauthenticated users Thorvald Natvig 1893804 Changing scrollbars in chatbar causes infinite loops. Remove it for now. 2010-11-28 Mikkel Krautz b8cb9d0 Update Boost path for OSX to 1.45.0. a0207d5 Use 'git describe' in osxdist.py. Benjamin Jemlich 4f5089f Fix context menu handling for disconnected users Thorvald Natvig 5dfd1f0 Try to be slightly more tolerant of third-party tables in the DB 2010-11-25 Semion Tsinman 03b5df8 [translation] Hebrew update Stefan Hacker b38e264 Make TTS link simplification case insensitive Jan Klass 2a48fa0 correct ice-doc description for auth-callback idToName() Benjamin Jemlich df7dc3a Don't crash if someone tries to add an ACE for an unknown user id Ilmar Kruis c435d5c Update Lotro plugin to Vol III Book 2 Thorvald Natvig a085d26 Use git describe for server snapshots 2010-11-24 Thorvald Natvig 35c6e03 Unify link detection regexps 84884ba Boost 1.45 2010-11-22 Mikkel Krautz 07c0813 TCD -> TCP in Danish translation. 091d9be Fix Group::members() to include members of the channel that the group is defined on even if it's marked as inheritable. 2010-11-21 Stefan Hacker 8eb1b7e Fix user sorting in UserEdit form ac10fe4 Fix muted/deafen indicator offset in overlay default Benjamin Jemlich 933a9dd Don't reset the connection timeout until the user is authenticated 2010-11-20 Stefan Hacker 1fa0c3c Refactor overlay preset code. Switch default layout. Try to make new default look better. ecff17a Set min width for log as first aid to #3109452 cb9dee6 Fix custom TTS setting saving in wizard and make switching to TTS always enable main TTS switch. 576c9ee Fix regression in user sorting 2010-11-19 Benjamin Jemlich 6c78711 Print the correct filename in the error message 34ff2e7 More potential a_ucTexture == NULL crash fixes 2010-11-18 Stefan Hacker ce8cedf Unify User/ClientUser sorting. Fix "usernames in overlay are in different order" #3110572 . Fix other sorting issues. Fix OverlayTest compilation. 2010-11-17 Benjamin Jemlich c644952 Fix a crash in the overlay if a_ucTexture is NULL 2010-11-15 Stefan Hacker c2f0c53 Fix mumble packet image in documentation ca23daf Add no-vld and no-plugin qmake flags Mikko Rantanen 77827af Documented no-bundled-celt option in INSTALL with a note concerning CELT 0.7.x 2131364 Documentation: Added a note concerning the codec requirements and clarified UDP tunneling. Also some minor float/margin tweaks. Benjamin Jemlich 907c41f Fix compile without PCH 3994350 Fix #3090083 2010-11-08 Benjamin Jemlich 42930a7 Update CELT 0.9 submodule to get the PLC fixes 11ff9b1 Remove more unused files 2010-11-07 Stefan Hacker ec0e463 Add firefox.exe to overlay blacklist Mikkel Krautz 42fc791 Don't use DBus for the client on OS X. 409aaa7 Use CELT 0.9 in osxdist script. 2010-11-06 Stefan Hacker 01e2247 Fix rounding behavior in conjunction with iroundf macro in lots of places. Benjamin Jemlich 7186e61 Replace CELT 0.8.1 with 0.9.0 2010-11-03 Stefan Hacker f7aec20 Fix VoiceRecorder::sanitizeFilenameOrPathComponent: When a 255 character filename/path-component ends on '.' infinite recursion might have occurred on windows machines. 2010-11-02 haru_arc b1340c3 Updated Japanese Translation for 1.2.3 Benjamin Jemlich f21ecfa Use the Wix custom action to launch Mumble 7139599 Fix use of uninitialized variables and unused assignments c865e05 Add swedish Qt translation bee5338 Readd overlay hook on DLL_THREAD_ATTACH 2010-10-30 Spaccaossi 2a26a18 Italian translation for 1.2.3 Svenne33 97e4bd6 Swedish translation for 1.2.3 Jonathan E. Hansen 6f7435f Danish translation: small update 2010-10-24 Álvaro Manuel Recio Pérez f913b99 Updated Spanish translation for 1.2.3 2010-10-22 haru_arc ec2b987 Updated Japanese Translation Mark-Willem Jansen 848d242 ALSA: added Rear Center and boosted the channel count to 9 45ea514 ALSA:re-ordered the speaker mapping to ALSA standards. Thorvald Natvig 1d05e6e Patch build patch 2010-10-21 Stefan Hacker d84fa5d Add a winpaths_default.pri to contain all windows dependency paths and make them easily overridable by a custom winpaths_custom.pri 2010-10-19 Stefan Hacker c4211c1 Merge remote branch 'rantanen/master' Mikko Rantanen 0b14cb3 Clarified varint encoding Jan Klass 4bb38b8 updated german translation tkmorris 7f3d833 Brazilian Portuguese translation update Álvaro Manuel Recio Pérez 99ddd8f Updated Spanish translation for 1.2.3 Mark-Willem Jansen 66fa813 Plugins: Manual plugin corrected. Jonathan E. Hansen aca189b Updated Danish translation for 1.2.3 Michał "Zuko" Żukowski 84c611c Updated Polish translation 2010-10-18 Stefan Hacker 65e4071 Switch VAD default from SnR to Amplitude and adjust UI accordingly. Run audio wizard without asking first. Add update counter to config for future updates. Add abstraction for Version query/parsing. Mikko Rantanen e90d14f Described varint decode function in documentation 2010-10-17 Mikko Rantanen 90b46fc Boredom? 23408f8 Fixed a reference and UDP packet size unit 594f950 Updated message documentation and fixed some errors based on pcgod's input. Fixed some references as well. 4b71e41 Rather complete documentation of Messages tkmorris 4731d82 Brazilian Portuguese Translation 2010-10-16 Stefan Hacker ce79583 Fix easter time and a compiler warning Mikko Rantanen 00fb3c6 More additions to the packet descriptions 4606a71 Further documented some of the Messages in the reference 96c80d0 More documentation. - Some tweaks to TCP connecting, mainly in form of figures. - Initial Proto buffer message descriptions as tables that contain field descriptions. Most descriptions missing. Svenne33 854f5da New update of Swedish translation 2010-10-15 Arie f4b0278 Better Engrish for button Mikko Rantanen b4cdc19 Further enhancements to the documentation cc5137e Why not include the updated pdf as well? 46f27d7 - Added message structure env/command - Added initial description on UDP protocol Justin McGrath 4170dc7 Added *.jpeg to image filter for avatars as per Feature Request 2998995 B0nuse fd6faf1 Updated mumble_ru.ts with fixes. Natenom 1eaee4b Updated German translations. Svenne33 4a684df Swedish translation updated 2010-10-14 Thorvald Natvig 9fee66e Speed up SQLite for client even more 8eef3c0 Speed up SQLite for client 2010-10-12 Stefan Hacker 8d97167 Fix "Optimize for high contrast" makes volume bars disappear (#3085154) 2010-10-09 Eli Tallman bdd383c Fixed unreliable Steam linking for BFBC2 2010-10-08 Michał "Zuko" Żukowski bb3cb7f Updated Polish translation 2010-10-07 DK 52f7090 String fixes Stefan Hacker 2a1bd18 Add no-vorbis-recording buildflag for disabling vorbis for older libsndfile versions 9fd2611 Fix support for older libsndfile Justin McGrath 8ac8b45 Fixed bug #3062825 Thorvald Natvig 1a8da34 Make the icon valid 76df86a Alternative svg rendering for application icon 7df254a Sync alternate icon render f52fb66 Update to new G15 SDK 2010-10-06 haru_arc 3556898 Updated Japanese Translation Natenom e8810bf Limit name label width in ban editor to 500 to not break the UI with very long names. Benjamin Jemlich 392333a String fixes in the ACL edit dialog found by fwaggle ba6bd1e Fix codec selection and outdated bitstream constants Thorvald Natvig bd121b5 Support older libsndfile 31488de Experimentally switch back to "real" boost typeof 2010-10-05 Benjamin Jemlich ac2b6ca Remove unused code, spotted by rawnar Mark-Willem Jansen 87f3c8c Plugins: Borderlands updated to version 1.40. 2010-10-04 haru_arc 3a703dd Updated Japanese Translation Natenom 5f774af Fixed a translation typo submitted by Radioactiveman in IRC on #mumble, German translation updates Benjamin Jemlich 343510e Flush client ACL cache after registration Thorvald Natvig 0369e8e Fix English source strings 2010-10-03 Mikkel Krautz bd2f257 Bundle intermediate CAs for the overlay installer to make Mac OS X 10.5 play along nicely. 2010-10-02 Stefan Hacker ac49c60 Prevent GUI password editor from leaking token ACLs into inherited channels. Benjamin Jemlich f0b3af6 Recorder string fixes 2010-09-29 Mikkel Krautz a72dfa8 Explicitly specify which events to intercept via EventTap. Fixes random crashes on Leopard. 2010-09-27 Benjamin Jemlich ab2ed68 Blacklist WPF apps in the overlay Svenne33 8a5998f Swedish Translation (#3071209 & #3071223) 2010-09-15 Stefan Hacker 9374b51 Adding new favourite server now completes from clipboard. Added password edit field to favourite edit dialog (only shown for SuperUser or favourites which already have a password) Natenom fe52c22 Fixed a German translation typo which caused the overlay editor to save mumblelay files without extension. Submitted by Thomas via email. 2010-09-09 Stefan Hacker 979c415 Fix typo in qaSelfComment patch 4c739e9 Fix qaSelfComment not disabled on startup Benjamin Jemlich f4b7ff2 Reformat this block and reword the comments Thorvald Natvig 25e7ebb Move qmake profile lines to single line to work with release script Michał "Zuko" Żukowski 10625c9 Update polish translation 2010-09-07 Mikkel Krautz 0b34efb Hide system cursor when in interactive overlay on Mac OS X. Thorvald Natvig 6e3fc04 Give the overlay text a bit more space eb3479b Disallow suppressing left mouse button 1f4be58 Use slice path for Ice 3.4.1 ccb9350 4.7.0 cross-compatible qmake 2010-09-06 Mikkel Krautz 07b7533 Alternative way to enable overlay debugging on OSX. 0f355bd Only disable GL_TEXTURE_GEN_* if they're already enabled. Fixes black screen issue with EVE on OSX (via Cider) 2010-09-05 Stefan Hacker a8a2129 TextMessage recording warning for pre 1.2.3 clients + Comments + minor refactoring Mikkel Krautz dba101a Re-add NSOpenGLContext awareness to Mac OS X overlay to improve resolution detection in SC2 and Source Engine games. Benjamin Jemlich c8bfedb Added launch checkbox and new bitmaps for the installer 2010-09-03 Mikkel Krautz 803a6d5 Update jp filenames for mumble11x as well. 2010-09-02 haru_arc f78a58b Updated Japanese Translation (#3058069) Nicos Gollan 8dccb14 Improve Overlay Font Resizing Mikkel Krautz 518b2aa Make overlay injection work on Mac OS X Leopard. B0nuse 09c23f8 Russian translation update. 81005bf Update of Russian translation with Fixes. Natenom 83d2ee8 Updated German translations Mark-Willem Jansen 8b3dee1 Plugins: Borderlands extended support and changed context handling. Michał "Zuko" Żukowski a3518d4 Translation update - Polish (#3054197) 2010-08-31 Mikkel Krautz f0a8051 Re-add missing codesign files from overlay installer. 1ac9afa Unix/MacOSX overlay library: Tell OverlayClient when we've mapped SharedMemory so it can safely be released. 2010-08-30 Stefan Hacker 47fcb76 Add a mutex locking for plugin strings to fix race condition Eli Tallman dd3d537 Make toolbar icons skinnable Mikkel Krautz 3bae17a ConnectDialogEdit: Use "Add Server" title when adding a new server. f1a0740 Report bIs64 for OSX. The arch info stuff returns the arch of the kernel, which is almost always i386. 212ed93 Remove Mac OS X overlay launcher. 9e5d846 Only disallow opening external URLs when overlay-embedded, internal URLs are still allowed. 2010-08-29 Mikkel Krautz 37faf24 Fix comment of the previous commit. 092784e Disallow clicking links in the log when embedded into the overlay on OSX. 531bb4e Use Cleanlooks style when embedded into the overlay on OSX. 16170ad Manually embed OverlayUserGroup into QGraphicsScene on Mac OS X to get correct positioning. 52dcfb1 Use event->widget() as parent for OverlayUserGroup context menu when not embedded (fixes non-embedded OverlayConfig menu on OSX) c477395 Disable unifiedToolbar hack for Qt >= 4.7. 2010-08-28 James Fraser 71e9029 Ice method: int getLogLen() Mikkel Krautz fb9f982 Allow semi-transparent windows on our overlay for Mac OS X again. Fixed in mumble-developers-qt. Natenom 4f1ff20 This patch adds a read-only recording flag to the User object that is returned by getState() over Ice. Polished by Svedrin (Michael Ziegler ) Benjamin Jemlich 95233ce Change german translation to match the english text 0fc10ed Remove CWD from DLL search path on Windows cbd8457 Qt's japanese translation file was renamed in 4.7 2010-08-27 Mikkel Krautz f9fb2fd Forward events through Qt instead of using performSelector:onThread: to be able to properly forward events in nested event loops. ae18413 Don't call activateWindow on qteText. It cancels the window's Qt::WA_DontShowOnScreen state on Mac OS X. a4c33cc Only allow interactive overlay for fullscreen apps on Mac OS X. Thorvald Natvig 0afaf58 ifdef jitter reporting 2010-08-25 Stefan Hacker ab16dfc Add sound for recording state change notifications a74fdf8 Exclusive input is now disabled by default Mikkel Krautz f7aa9be Add no-crash-report to INSTALL. Fix wording for CONFIG+=universal. 2010-08-23 Eli Tallman 685954c Source updates Nicos Gollan 82aae29 Portable OverlayTest, disable exception on Linux a53926e Fix config layout, some code fixes a6a6823 Add FPS functionality to OverlayTest d398718 Overlay corrections fa3529f Import/export of overlay settings 616d5b9 Extended the overlay settings 49558f7 Broke up monster Overlay.cpp f649795 Overlay text refactoring and refining 2010-08-22 Mikkel Krautz 1eb4c72 Fix my broken hide-overlay logic. 433c5f6 Use QT_MAC_USE_COCOA instead of MACOSX_UNIVERSAL_BUILD. Fix universal build. 89b8307 Move around a few calls that make the overlay-embedded MainWindow usable on OSX. 132add5 Use ConfigDialogMac for empty g.qsCurrentStyle as well. 0f0e141 Fix restoreGeometry for Mac OS X when using unifiedToolbarOnMac. Benjamin Jemlich 630fe7d Don't crash using local loopback / recording + overlay 2010-08-21 Stefan Hacker f6c98e4 Add backend to frontend error reporting for recorder cb8ddcf Fix compile errors 8faf40f Add support for ASIO format ASIOSTInt24LSB Eli Tallman ab81d38 Add player-specific context information to BF2 Mikkel Krautz c88692b csShape is no longer a member variable. f6d9c4f Use system cursors for OSX interactive overlay. 24fb17f Don't restore/store geometry for overlay-embedded ConfigDialog. 326f5b0 Fix crashbug where forwarded ocIntercept events were processed after we were out of the interactive overlay. c101191 Add PID message to OSX overlay lib. 2010-08-19 Thorvald Natvig 92fe3c7 ServerHandler as shared_ptr 81f9d9f Boost 1.44 2010-08-18 haru_arc c19821c Updated Japanese Translation Mikkel Krautz 11edcd6 Bump Boost to 1.44.0 for OSX. 5ec6c9c Fix CrashReporter build for Mac OS X. Natenom f5eeaaf Updated German translations. Benjamin Jemlich 1a88c2e Fix old version uninstall 2010-08-17 Benjamin Jemlich fb784a5 Merge branch 'recording-clean' of git://github.com/arrai/mumble-record e5c668f Add more keyboard shortcuts in the settings dialog 1a51db9 Installer fixes Thorvald Natvig ccf4b33 Use .mm ending in 11x as well f6a3e82 Add cpu type and SSE2 state to usage stats 2010-08-16 haru_arc 1d32a33 Japanese translation for current git arrai 3ef3ea8 Add recording state handling to the client Stefan Hacker 22a74ac Add log messages/notifications for recording state changes 66ef598 Add vcheck 163ae5a Prevent turning / into // at the beginning of filenames (d'oh) 3c4fbd5 Maybe fix linux absolute paths + Minor stuff. 7b9ca2c Add path and filename templating. Fix recording mode restore. Add missing licensing headers. 324d43e Make sure recorder is aware of connection state. Don't show recorder icon in menu. d876cab Fix browse button 2622533 Fix deadlock on codec change while recording. Various minor style fixes. 03009a9 Fix crash on close + recording dialog behavior when stop is pressed 598b7c3 Add recording UI 4a2d48d VoiceRecorder backend extension for UI needs 32017ea Settings load and restore for recording feature B0nuse 172d060 More fixes for mumble_ru.ts file Benjamin Jemlich 4518147 Fix recorder error messages. 3870798 Add comments in VoiceRecorder 2926e6f Use Qt's StringBuilder where available and add pch include 7732ca1 Add a namespace for VoiceRecorder format functions 7301003 Fix multichannel recording a6423d9 Delete dialog and possible crash fixes 3a29bdc Possible crash fix e555a83 Add a namespace for the enum fad3790 Fix crash on recording stop 2e99628 Style fixes and safer pointer handling 0a880fe Add local voice recording 1f56580 Add basic recording logic 0321c24 Add recording icon Mark-Willem Jansen 95cdca8 Borderlands plugin: added support for german version of Borderlands 2010-08-15 Eli Tallman a4b5217 Arma2 conditional to prevent premature linking; L4D2 update 2010-08-13 Mikkel Krautz 8376c46 Fix permission issue with OSX overay installer when no /Library/ScriptingAdditions/ directory exists prior to install. 2010-08-11 James Fraser bf561d3 Toggle setting (rememberchannel) for remembering a registered users last channel. ab31fc2 added timestamps to foreground log output Mikkel Krautz 40c04a1 Don't use ConfigDialog_macx for compat client. Benjamin Jemlich 7e18e35 Use the correct way to add the WIX UI extension c333198 Always install libmysql.dll Mark-Willem Jansen 1a0e643 Borderlands plugin updated to version 1.31 Thorvald Natvig a40cd34 Fix a few more SSE/SSE2 installer issues 00f405c Add SSE2 export to installer ff47838 SSE2 build using MSVC 6cf5ac9 Update Ice embedded doc 2010-08-10 Mikkel Krautz 0bd663f Split out native-looking OSX ConfigDialog into a fully separate class. Allows us to pick which one to use at runtime. 1db53c6 Call winId() in MacOS ConfigDialog to ensure is backed by a native window. Thorvald Natvig 331da15 Correct debug path and Ice version in installer d6f8076 Machine-dependent installer settings 2010-08-09 Eli Tallman 06dd3ab Gmod update; minor plugin fixes/updates Benjamin Jemlich 4ad437a Use the MSVCRT 2010 merge module and readd the translation files 4bb0bf2 Add MSI-based installer Thorvald Natvig 1009e97 Include MSVC version in plugin query 38ffcfb Avoid NULL on sendmessage to invalid sessions dac82c9 VS 2010 build 2010-08-08 Mikkel Krautz a34f73a Fix URL and Mac OS X install instructions in README. 451c11d Fix mumble11x GlobalShortcut_macx symlink. 8b298ba Forward intercepted events directly to NSView rather than going through NSApplication first... f9f142f Forward more events to ocIntercept. 2010-08-05 Benjamin Jemlich 3d6ef0f Ignore zero scopeId in ping replies 2010-08-03 Mikkel Krautz b4dc0e6 Forward ocIntercept events on Mac OS X to viewport instead of QGraphicsView. QAbstractScrollArea does not propagate QEvent::Mouse* events. B0nuse ff56005 Updated Russian translations. 2010-07-31 Mikkel Krautz 6a05cd6 Attempt at forwarding Mac OS X mosue events to QGraphicsView during ocIntercept. 2010-07-30 Eli Tallman 019c47a l4d2 update 1a2ea89 Fix last commit aa0fc95 Add context support to BFBC2 0c69d52 Gmod update James Fraser 85feea3 Added ability to disable logging to DB Nicos Gollan 2debbf0 Refining overlay font rendering Mikkel Krautz 41cdc04 Diable overlay for universal Mac OS X builds. ba654a5 Auto-updating overlay installer on Mac OS X. Natenom e0163bd Updated German translations Benjamin Jemlich a2e2a82 Fix crash when connecting to a different server Imre Botos 3e91919 Counter-Strike 1.6 plugin fix 2010-07-29 Eli Tallman d0a6627 Source plugin updates; clarify regName parameter usage in Murmur.ini Benjamin Jemlich e681802 Add Qt's russian translation 2010-07-28 Mikkel Krautz 6422f37 Fix appdata migration when no ~/Library/Application Support/Mumble exists. 8aeda4d Move Mac OS X data dir to ~/Library/Application Support/[...] 2010-07-27 Nicos Gollan 022772e More uniform font rendering in overlay Mikkel Krautz 8f63e4d Check overlay installer for version info instead of the Mumble app bundle. B0nuse b8f14d8 Translation fixes (Russian) Benjamin Jemlich 8f73beb Fix a possible race condition on reconnect 2010-07-26 Eli Tallman f5f526d Fix multiple issues with ArmA 2 plugin, and update it to 1.07 Mikkel Krautz e0d1de4 Don't stop device initialization in CoreAudio in cases where reading BufferFrameSizeRange fails. f88ca84 Fix typo in CoreAudio. bf8d005 Zero out AudioBufList in CoreAudioInput constructor. Could lead to nasty crashes in cases of failing CoreAudio input initialization. 1c39e8d Bump overlay version to get users to test the new installer. acb93fb Switch Mac OS X overlay installer to a signed Apple .pkg installer. Benjamin Jemlich 385f256 Fix overlay dll debug output 8f0a2bd Revert "Overlay blacklist wmpnscfg.exe and fix the mumble_ol.dll's debug output" because it breaks the overlay 2010-07-25 Stefan Hacker dd93a58 Prevent Russian language file for installer from overwriting the English source strings 2010-07-24 Stefan Hacker c8dfd56 Fix typo in last patch f5704a0 Clicking tray icon now activates the window if it is inactive instead of hiding it c24b79e Overlay blacklist wmpnscfg.exe and fix the mumble_ol.dll's debug output Mikkel Krautz 9ba3eb3 Dist script fixes for universal build. cbc880e New LGLCD SDK path on Mac OS X. 3c936c2 Make CONFIG+=universal imply no-cocoa 2010-07-22 Mikkel Krautz 41f8041 Work around the overlay preview resizing problem by minimizing the amount of unnecessary style changes we do. Benjamin Jemlich dcc541a Add Qt's accessibility dll to the installer 2010-07-20 Benjamin Jemlich 4335312 Add another QThread::yield in the audio output code 8bd2060 Added/updated russian installer and client translation, submitted by B0nuse on #mumble. 4315190 Add russian translation file to the resource file. 2997897 Fix some gcc and cppcheck warnings fe9ae2d Disable crash reporter on linux 89d30a9 Fix possible fd leak in OSS code 2010-07-18 Benjamin Jemlich 7208fcc Fix more crashes if we have no ServerHandler cf3c151 Lazy init the ServerHandler object and don't crash if we have no ServerHandler 2010-07-17 Nicos Gollan 8bd79b6 Use noise-filtered amplitude for VAD Mikkel Krautz 1b3d329 Fix AudioStats for compat client. Benjamin Jemlich bfa01db Fix reconnecting when using Qt 4.7 63b84d3 Disable system CA override in Qt 4.7 0dc54d7 Fix MSVC compile errors 3b594af Workaround for the client certificate verification bug in Qt Thorvald Natvig 173ebf8 Allow getRegistration with read pw 75df5b7 Handle external auth with whitespace 2010-07-16 Mikkel Krautz 932fe13 Fix logic error in osxdist.py. Also make copied libraries explicitly owner-writable (OpenSSL wasn't). 2010-07-14 James Fraser 9c9983b Added default root certificate store on FreeBSD. ea20c4c Fixed Murmur Build on FreeBSD Natenom e4615e6 Add -n (suppress certificat) to the command line options. Thorvald Natvig c4eefe7 Use local OpenSSL for static build 470a089 New servers have DB version 5 2010-07-12 Stefan Hacker fe2e3e5 Some minor cleanup in the bfbc2 plugin 10e5299 Prevent l4d2 plugin from crashing Mumble on trylock a8efbbf Fix display bug in Audio Wizard 2010-07-11 Eli Tallman bbd417b Fix typo in L4D2 Mikkel Krautz 0cf351e Only copy mumble-g15-helper to app bundle if it exists. e925ec6 Update Mac OS X build for Ice-3.4.1, Boost 1.43.0 and detect the presence of LGLCD SDK (disable g15helper if not present) Thorvald Natvig 288dab9 Update to CELT 0.8.1 6c61371 Report OpenSSL version to console 2010-07-10 Eli Tallman 492ffa4 See if state value causes L4D2 bug 25e833b Source plugin updates; BFBC2 update, works with Steam now 2010-07-05 Semion Tsinman 1d155a1 Hebrew translation update: translated audio input, audio output, user interface and shortcuts sections. Andreas Bibok 3c4fe52 Partial translation to Hungarian Karl Dietz d1dd3e7 wow: update to 3.3.5 Jan Klass 0c38e42 correct inline-doc and make it clearer Sergey Ivanov e6514f0 Updated russian translation Mark-Willem Jansen d135236 Plugins: Changed the pointers for the camera information of Borderlands d187857 WINAPI update: WinVerifyTrust() returns a LONG instead of HRESULT 2010-07-03 Stefan Hacker cb9c5bd Customize labels for high contrast mode so they talk about what is actually visible 2010-06-29 Stefan Hacker 5c40cfe Don't validate the name before we are sure it wasn't already validated by an authenticator Benjamin Jemlich 6b33dda Don't crash on long usernames 2010-06-21 Benjamin Jemlich cb223d4 Add a wrapper for the new CELT 0.8.0 API 2010-06-20 Benjamin Jemlich 4d79d80 Allow tags with an empty source url 2010-06-19 Benjamin Jemlich 73f3ac2 Fix WASAPI exclusive output for some broken drivers Thorvald Natvig a0593c9 s/input/output/ for warning 2010-06-18 Stefan Hacker 54f1a03 Fix server compilation on Debian Lenny (Qt 4.4, Ice 3.2) Thorvald Natvig 33990fb Fix output buffer size for exclusive mode WASAPI c3f587b WASAPI Exclusive Mode output and 11x compile fix 2010-06-14 Benjamin Jemlich 74fc0b0 Increase murmur log window size on windows 47af935 Enable Windows security stuff for release builds 2493907 Fix qmake 4.7 deprecation warnings 6f52a68 Add VS 2010 pdb files to .gitignore 2010-06-06 Benjamin Jemlich 773f05a Fix some warnings in the chatbar code e75ec48 Hide overlay black-/whitelist on Linux 2010-06-02 haru_arc a6d75b5 Updated Japanese Translation Stefan Hacker fe9496d Fix: Option "Don't hide in tray when minimized" partly broken (#2975969). Also remove unused custom signal Karl Dietz dc11bc5 wow update plugin to 3.3.3a 2010-06-01 Stefan Hacker 671a3e3 Remove margins for p tag in the default style to get rid of unwanted double spacing Mark-Willem Jansen 3f353e8 Fixed: Passing zero length string in Borderlands plugin Thorvald Natvig 84088f8 Experimental WASAPI exclusive input mode 99fb316 Remove desktop shortcut for 1.1.x e5b8627 Fix download path for bonjour 2010-05-31 Stefan Hacker 6d7408f Add text to the DockTitleBar so its purpose is clearer 6a2c230 Restore nickname auto-completion for TextEdit based Chatbar 2f5db27 Prevent richtext from being pasted into the chatbar and make sure we escape html entities before sending. Also rename of ChatbarLineEdit to ChatbarTextEdit. rdb 68d4371 recieve -> receive Mark-Willem Jansen e84fbbb Updated Borderlands plugin for the new API. 2201bdd Added a postional audio plugin for Borderlands. Thorvald Natvig d10747f Updated installer 2010-05-29 Thorvald Natvig 502c8ad Remove mention of deprecated no-xevie in INSTALL 2010-05-27 Thorvald Natvig e4c5071 Only show tray config if tray exists a8268d7 Add recommended user CAs explicitly 2010-05-22 Thorvald Natvig 1741e72 Direct G15 support 2010-05-19 Eli Tallman 36e3950 DoDS, TF2 updates 2010-05-18 Semion Tsinman 91cef12 Hebrew update Jan Klass fb7dbfe make icesecret comments clearer 8cfb579 fix string 9e9fe0a updated German translation Ludwig Nussel 70a528a fix build for Qt 4.5 Ilmar Kruis 57d55c0 Update lotro to Vol 3, Book 1 patch 1 Thorvald Natvig 230c942 Update to new Boost and Bonjour 2010-05-16 Stefan Hacker 491de61 Enable multi channel audio by default to prevent problems with bad audio drivers 2010-05-15 Eli Tallman 69aaf67 Plugin updates 2010-05-08 Álvaro Manuel Recio Pérez 0846a64 Updated Spanish translation 2010-05-06 Eli Tallman 5fe803e MW2, gmod updates; BFBC2 address fix 2010-05-04 Stefan Hacker ec31de1 Add black/whitelist icon loading for Windows. Make lists match on full path as well as executable names 532c3f2 Fix compile on non OSX systems 2010-05-03 Eli Tallman d8e8909 TF2, DODS update Mikkel Krautz ae4244a Move FPS counter checkbox below 'Enable Overlay' checkbox. 9238e32 Hook up the last missing piece for overlay exclusion on Mac OS X. a768909 Use mumble.icns instead of mumble.osx.png now that we can load .icns with QIcon. 1f6d202 Bump OSX overlay version because of the FPS counter. 28056d1 CFBundleIdentifier-based overlay app-exclusion. Also, show icons for excluded apps. 2010-04-29 Stefan Hacker 11fda9b Fix *nix OpenGL overlay and add FPS counter code to OSX overlay.m 58bf724 Fix mkwrapper.pl for Ice 3.4 and update MurmurIceWrapper.cpp 1beb966 Fix SCALESIZE macro for overlay editor. Rename fHeight symbol to fZoom to prevent confusion. 6380a88 Transmit fps more often and represent them as float 02811bc Make sure temporary group memberships of a user are purged once he disconnects 2010-04-28 Stefan Hacker d8f1ac1 Add an optional FPS counter to the overlay fbb54cb Set a title for the Overlay Editor Eli Tallman 6b5b738 L4D2 update ebdcfa1 BFBC2 update; attempt at using position array to determine gamestate 2010-04-26 Mikkel Krautz 7d8d6cd Don't try to do overlay stuff if we're in an invalid GL context. Bump overlay version once again. 6d3567b Sanity check viewport size in overlay. Bump version. 2010-04-25 Mikkel Krautz 3deff65 Update Mac OS X dist script to build with new Xcode and new libcelt. a74a0f6 Specify absolute path for slice2cpp for macx. Álvaro Manuel Recio Pérez e1eacae Updated Spanish translation 2010-04-23 Stefan Hacker 44fb5c9 Fixed misleading label in ConnectDialogEdit.ui (Servername -> Label) (#2991173) aad4de1 Enter a channel with keyboard (#2981163) 974a1ee Prevent debug version from checking for updates 4e57b3a Limit debug version to only loading PA plugins from executable/plugins folder Thorvald Natvig e016c4c Fix ice compile of static server 2010-04-21 Thorvald Natvig 02071e4 Fix compile of cs plugin 0f7a141 Add dynload of CELT 0.8.0 e5858a6 Add config.h for 0.8.0 on Win32 b6e2574 Add CELT 0.8.0 module 2010-04-18 Semion Tsinman 5f98de7 [translation] Hebrew Stefan Hacker beb7708 Make sure context string in cs1.6 plugin is zero terminated before doing anything with it 653434f Add Counterstrike 1.6 plugin to installer 3c34514 Disable local TTS playback of messages you sent Thorvald Natvig c365656 Add Hebrew to dist files Anton Romanov ec7e78d in case GL_ARRAY_BUFFER is bound, store and reset it before rendering overlay and restore after Imre Botos 7b77dea Counter-Strike 1.6 Positional Audio support fa066e5 Counter-Strike 1.6 Positional Audio support 2010-04-17 haru_arc 472296f Updated japanese translation. Jan Klass 372f763 add some detail to the ini-comment Sergey Ivanov 2d3a791 Russian Translation 2010-04-11 Stefan Hacker 74b56d6 Remove UTF-8 BOM from all python scripting samples as they mess up the shebang on *nix 9019afb We do not need to rely on ICE env after all. Just use the relative path. 00c1d7d Make testdynamic.py work on windows systems e6d84a8 Add UserLastActive to UserInfo so it is available over Ice. 9d32c71 Make slice include path rely on ICE environment variable on win32 2010-04-09 Thorvald Natvig a21e814 Fix Ice compile on RHEL 87e2ba9 Relabel automute to autodeafen 61f1cf2 Fix ice compile on Win32 2010-04-04 Eli Tallman e336340 Attempt to fix unreliable BFBC2 addresses 2010-04-03 Benjamin Jemlich 8a3f9ee Fix changing ban timestamps 2010-04-02 Mikkel Krautz 8e9f260 Move overlay loader from our app bundle to the loader itself. Bump loader version. 4441ccc Refine overlay uninstall. 2010-03-31 Mikkel Krautz 9e15f34 Force single applaunch observer. 6354747 Override --signature-size passed to codesign in osxdist.py. 6c63e2a Pass user's current priority speaker flag in DBus. Not false. c982354 Fix OSX overlay installer. Create ScriptingAdditions directory if needed. Rename destination plist key. 6691d62 Pass false for priority speaker on DBus. 9e6a3b4 Update OSX Ice path to 3.4.0, fix slice command too. 335ab7b Add GL symbol availability checking to OSX overlay. 2010-03-30 Benjamin Jemlich 9b296bc Don't require a secret for getSliceChecksums() 80a7907 Fix some Ice examples 77e70aa Add Ice checksum and priority speaker flag 359d01c priority speaker - server side d556ca3 priority speaker - client side 8ce81fe Allow read-only access to the logfile on Windows 2010-03-27 Thorvald Natvig e9ed414 Change session queue dynamically 2010-03-26 Eli Tallman a030ee8 BFBC2 update 2010-03-25 Thorvald Natvig ee679ba Fix width/height mixup for scale factors 2010-03-22 Mikkel Krautz c63cfa0 Installable overlay for OSX. 2010-03-21 Eli Tallman 4b426f3 TF2 update 2010-03-20 Eli Tallman 9358a16 Add alpha-testing BFBC2 plugin Mikkel Krautz 7fea437 Add stubs needed for new installable overlay on OSX. 55992db Add (Mac OS X specific) overlay installation and overlay upgrade pages to the Overlay config. a8b96ce Remove frame from chat QTextEdit box on Mac OS X. 9215dbe Re-enable unified toolbar for OSX. b5ec788 Always center the alert dialog in the Mumble.compat binary. e5e7fed Remove wrong include in macx.pro. 2010-03-19 Eli Tallman 02115d6 MW2 update Thorvald Natvig 52c8931 Fix array index 2010-03-18 Benjamin Jemlich 69a34a9 Fix copy&paste from the log window root 2903d05 Updated French Translation Thorvald Natvig 0485e2e Add timeout to authenticators 2010-03-16 Stefan Hacker 620f169 Make sure the overlay closes its registry handle 2010-03-15 Martin Skilnand 55aee09 New default_avatar.svg "Mr.Jibberish" *Work in progress* Mikkel Krautz e97a7a1 QTextEdit doesn't have a setFrame() method. 2010-03-12 Thorvald Natvig b5b0a4d Handle mixed case groups in group editor 710dfb7 Use new slice doc syntax 136cac0 Add a few testgroups to the testauth 10a069b Save geometry when embedding in overlay 8776329 Create SU account if it doesn't exist yet when setting password d723a63 Update addban to use new Ice init 7a0d75d Update weblist.php to work with both Ice 3.3 and 3.4 2010-03-10 Thorvald Natvig c5736e3 QDateTime seems to think time_t should be local time. It's not 06fec27 Work around WSAAsyncSelect and WSAEventSelect overlapping on Win32 2b6bad6 Flash in browser workaround 2010-03-09 Natenom 49ae4cb Translation Updates to German Thorvald Natvig 413ea83 Only give UserInfo parent when in overlay 96765f5 Add workaround for creeping gain ab21722 Fix restore to maximize state on tray click 2ba4270 Fix inherit/inheritable for groups in editor 6d4c13f Work around QGraphicsScene's boundingrect including invisible items 2010-03-08 Ilmar Kruis 505e046 Update lotro to Vol 3, Book 1 Thorvald Natvig 7fa0529 Remove user from talklist on disconnect c27debc Unify talkstate and s/WhisperChannel/Shouting/ c5b6a84 Adjustable column number 4ab0a3d Remove leftover overlay code 8f2fddf Render text to pixmap, not qimage d26b54c Don't update geometry when only updating state 8f0bd7f Sort overlay users b7bc978 Add filter to overlay e5e7797 Add simple instructions to overlay config 9c5086c Greatly improve rendering quality of overlay preview c06f54b Reintroduce logic to ensure either avatar or username is visible 94a8d14 Parent UserInformation to g.mw; fixes overlay bug ec6b3c6 Drop additional old triggers when upgrading 2010-03-07 Benjamin Jemlich 10175ef Windows build fix (warning in gcc -> error on windows...) 2010-03-06 Benjamin Jemlich 47cbf78 Another build fix 048ae07 Fix whisper target bitmask 3f420f9 Multiline chatbar 141488d Linux build fix Thorvald Natvig 5437170 Preserve murmur.ini during upgrades, and switch to Ice 3.4 2010-03-05 Thorvald Natvig 7f01023 Draggable anchor for overlay ef947aa Have config-based editor update config settings, not global settings 2010-03-04 Stefan Hacker 4455854 Fix drag and drop into Chatbar 4b58f15 Frontend part of "Editable Overlay blacklist" (#2881663) c2397ee Backend for user controlled overlay Black-/Whitelisting Eli Tallman f0b40a6 Gmod, L4D2 updates Thorvald Natvig d73b644 Start of config-based editor 7efcd52 Move userhandling directly to OverlayUserGroup 2010-03-03 haru_arc 9b8d1be Updated Japanese Translation Stefan Hacker 1e6b573 Do not minimize to tray on windows 7 by default (#2947574) Thorvald Natvig a4d90a9 Mention that we need lsb_release in the INSTALL 47ef042 Switch to utf8_bin collate for MySQL 38f059c Proper bounding box and padding for overlay painter 2a9dbee Save/load overlay 1e35f54 Refactor overlay config var names and clean up old configdialog ebcb6d9 Fix zoom factor and add grid background 2ee79f2 Standalone overlay editor 2010-03-01 Karl Dietz d6d2e4a wow: unbreak plugin after regexp experiment Thorvald Natvig dde4708 Scaled alignment for elements 030ed4d Bounding box and element toggle 2b12585 Same transparency for all speakstates text 9fa00c3 Use premultiplied alpha textures b658561 Speed up rendering slightly b7d97dd Add two preset layouts 2010-02-28 Thorvald Natvig d44c84c This is not the window you are looking for f223a82 Update weblist.php to use Ice 3.4b 2010-02-27 Thorvald Natvig 47a4538 Reprotect WindowFromPoint after patching 0abb9e5 Don't use widget functions on embedded widgets, they misbehave in release mode 4ee7782 Hold shift for square resize and scale with wheel f1ab7fa Editable overlay 2010-02-26 Thorvald Natvig ed8f3e2 Fix unlink over Ice 0f377b1 Don't strip header in Ice getTexture 2010-02-25 Benjamin Jemlich 5da308f Fix image selection in the german translation Thorvald Natvig 7cfe0b2 Constrain avatars to visible screen 3f7287c Avatar placement based on Settings 9022177 Context menu for avatars 3fcb682 Add example users to overlay ed39267 Update STO plugin 6d11c22 Use process map in initialize f2c191d The grand plugin multiregexp experiment 63adacd Common dwPid var 71e5e85 Backwards compatible plugin structure c263aa0 Update plugins to new trylock signature 6d9bc4e Send pidmap to plugin trylock b23d6fa Require write lock to lock/unlock plugins 1856143 Fix autoconnect 2010-02-24 Mikkel Krautz 1df4b0d Handle symbol-generation for plugin_bundles on Mac OS X. Benjamin Jemlich 56406e3 Fix a possible null pointer deref Thorvald Natvig f9091f0 Add option to autoconnect to last used server on start a2f724e Handle VirtualProtect failures 3d31674 Add logo to overlay 26a2a3c Work around a few utf8 qssl issues and change window title on userinfo to be user name 2de762a Restore maximized state on trayicon click 41724d8 Clientside idletimer counts keypresses, and deafens instead of mutes aef4c71 Try switching back to Move action for UserModel 76d9960 Unify log message of chatbar and rmb message 0f7d727 Reset shared_ptr so it can be released c463029 We don't have plugins for NULL items add15dc Assume input URLs are valid-ish Michał "Zuko" Żukowski 952a837 Some fixes in Polish translation 2010-02-23 haru_arc eda6b17 Updated Japanese Translations for 1.2.2 Karl Dietz d8e25b0 LOTRO use Pi from math.h Jan Klass eda77d2 Fix spelling error in murmur.ini Ludwig Nussel 0bec6cc function must return a value Thorvald Natvig 0e65387 Update lotro plugin to use win32 generic functions aa41d15 Fix HookWindowFromPoint for 11x caee7c8 Merge branch 'overlay' c157f6e Fix overlay to compile on nix 46288be Cleanup unused Scene e4c7724 Grab cursor from Win32 directly 3b38ac2 Override DoDragDrop's window detection 2010-02-22 Thorvald Natvig dac5d96 Honor Win32 focus/capture override b52344d Fix keyboard input state and remove mouse as valid click object 2010-02-21 Thorvald Natvig 145fbce Doubleclick and direct mouse update 44d8c7c Clone cursor bitmap from system 2010-02-20 Mikkel Krautz 1be405b Add targets for x86_64 and universal (i386 and ppc) to osxdist.py. a309532 Move OSX dist scripts to macx directory. 8934d91 Add automatic overlay injection for OSX (Snow Leopard only, for now). Thorvald Natvig 6725d88 Cursor with offset support f6ed071 Temporary cursors e71a214 Eventloop fixing; gracefull enter/exit 2010-02-19 Thorvald Natvig fde785e Re-modalize about dialog f690f2f Use non-native dialogs when embedded, and unembed on window hide 2c2918e Doublebuffer painter 2010-02-18 Thorvald Natvig 0d45ea6 Async about dialog 46bb060 Somewhat threaded input handling 5a9b23d WIP: Overlay 2010-02-16 Eli Tallman 59d6d67 Attempt to fix Arma 2 rotation addresses using pointers; fix DoDS typo Mikkel Krautz 4a31df9 Sneakily fix MUMBLE_PREFIX envvar detection. e815da0 Bail if no MUMBLE_PREFIX envvar is set during OSX build. c0791fb Add CONFIG+=universal for the traditional (i386,ppc) build of Mumble. Thorvald Natvig 1576957 Calculate overlay offset correctly Michał "Zuko" Żukowski aa6250d Updated Polish translation 2010-02-15 Mikkel Krautz 80863d5 Add compat stub-app to instruct users that they're using an unsupported arch, and how to get a version that will work for them. 2dbba84 Move OSX overlay and overlay launcher into macx subdir. ffe8fe2 Use new OSX install prefix for Murmur. e268627 Rename 'installer_macx' to 'macx'. We don't have an installer anymore. Use it for more general OSX stuff. 6fa6411 CFLAGS fix for multiarch OSX overlay. cbc5380 Change default OSX build to x86_64. Thorvald Natvig 79fc874 Expand dynamic slice-fetch example to show fallback a2b4f85 Example of on-the-fly slice-fetch for Python 7ba42b7 Split icesecret in icesecretread and icesecretwrite 2010-02-14 Thorvald Natvig eca8b3c Fix compile error on gcc 2010-02-13 Eli Tallman 9d3a304 Gmod, Insurgency updates 0de84db DoDs, L4D2, TF2 updates Thorvald Natvig 6e430ca Add irc:// protocol to whitelist 11ec4b4 Only allow register for users with a cert bdbd480 Grey out autoupdate for snapshots 2010-02-12 Stefan Hacker 7f459eb Update some license stuff we missed Natenom c067589 Add few German translations strings Thorvald Natvig f0583b1 Add error message on snapshot installer fail 31cd532 Use ShellExecuteEx instead of QProcess to launch installer 97e8720 Remove gone users from overlay c551d63 QGraphicsLayout based overlay render d97d55c Remove period in tooltip 2010-02-11 Thorvald Natvig fb5a618 Fix crash when dropping nonexisting channels c473d5f Update STO plugin 58cbf0e Hopefully fix a compilebug I introduced on OSX 91cf6c7 Pipeline http fetch and set user-agent 61a1074 /dontskip for dxdiag requires Win7, so skip it 15a299a Remove debug define from VersionCheck 2010-02-10 Thorvald Natvig 7d74f37 Fix new audio compile problems in 11x 1ef46ba Add steam:// as allowed URL scheme 926e4fe Create isAlive() to check runstate instead of bRunning, and unify stop/start of audio threads e411773 Debian/kFreeBSD compile fixes 7c33c9b Fix X11 compile of VersionCheck b33d3b8 Automatic snapshot download and install dd75b31 Make plugin config be name-based instead of pointer based e31b265 Bump version to 1.2.3 2010-02-09 Mikkel Krautz b2cd5de Do not add menus to user/channel context menus on OSX. Menus that are added to the global menu bar on Cocoa/OSX must not be added to other menus or menu bars, according to the Qt docs. b303856 Disable unified toolbar on OSX. Too buggy at the moment. Get rid of graphical artifacts on launch. Thorvald Natvig c41a192 Zap commenthash when switching servers 2010-02-08 Martin Skilnand 1e36860 Placeholder default_avatar.svg Stefan Hacker 070692d Small style fixes in some plugins dfaa2d5 Zero camera position if manual plugin is deactivated Thorvald Natvig 3938ebe Move plugin system-level includes to common header 99366f3 Disable config/about buttons if plugin doesn't have that, and add a generic_unlock de21a22 Update STO plugin and add common initialize() function effc993 Template helpers for Win32 plugins e207ef6 Zero camera positions in plugins' fetch() 5271bc0 Disable PLUGIN_DEBUG as the console spams breaks up audio 33b90aa Spawn state for STO f1c66fb STO plugin, and use camera position for positional audio and rotate top vector properly 2010-02-07 Thorvald Natvig 5595aba Add vertical space for empty lines and add some space around the avatar f7d3dc7 Deprecate the OverlayUserTextures option; they are now on-demand loaded avatars, so always on 8a1705d Work around colors lost when application style lost 031a0fa Add a hackish workaround for people who ignore reboot warnings Michał "Zuko" Żukowski 1ec8726 Small fixes in Polish translation 2010-02-06 Álvaro Manuel Recio Pérez cf75490 Updated Spanish translation Thorvald Natvig a349a08 Use symlinks in release tarball 3a05189 Work around bug in g++ on Jaunty 2010-02-05 Karl Dietz 1615b47 WOW update to 3.3.2 Jan Klass 29b65b8 german translation update Mikkel Krautz 298bbb7 Boost 1.42.0 for Mac OS X. Ilmar Kruis 985af69 Fix heading readout for lotro. Thorvald Natvig 9bd867f Fix overlay crash in Killing Floor when IDirect3DDevice9::Reset() fails 4c2ffdf Fix SocketRPC on nix 228e9ed Local socket RPC for mumble self-RPC Spaccaossi 9a58ef1 Updated Italian translation 1.2.2 2010-02-04 Mikkel Krautz 4529500 Hide tray-options in LookConfig on OSX, where we don't have a tray. 121e6ec Use unified window/toolbar on OSX. 37430b1 Make sure to pop the whole GL error stack when cleaning up. d15128e Resync GL overlay code. Thorvald Natvig 7a0d844 Only send texture if it changed. cd6667b Boost 1.42 for Win32 Jonathan E. Hansen 0f630bf Updated Danish translation for 1.2.2. 2010-02-03 Netbios Domain Administrator 97a15a8 User join defaultchan if last channel is not permitted Stefan Hacker 9929a44 Add getUptime() function returning uptime in seconds to murmur and individual virtual servers Eli Tallman 936779d MW2 updates James Fraser a9e9922 Added a crappy example of an auto idle-move written in PHP. DWM|G 38b47ec Added Icon Toolbar. Natenom 11e4cec Added some new strings to German translations Ilmar Kruis 59e10d1 Update lotro plugin to Book 9 Patch 1. Thorvald Natvig e0c6b91 Only switch unpack buffer if we have to 7d73e62 Add icon maker, sort of 1b3dadf Use QImage::fill instead of QPainter::eraseRect 5a7beda Limit avatar sizes to iMaxImageMessageLength 35fbbcd Only use integer decimation in tooltip avatars ef9de69 Precache texture/comment when sending to server 1679e06 Drop qaUserComment in favor of qaSelfComment, and query comment/desc on view/edit 346755d Handle SVG for overlay properly, and fix a crashbug in ~Overlay 3b33b67 Clean up default channel logic slightly Michał "Zuko" Żukowski 2becf4f Updated Polish translation 2010-02-02 Stefan Hacker 2e816c7 Make idleseconds not only reset on voice but on all actions caused by the user 7218413 phpBB3 and SMF authenticator moved to http://gitorious.org/mumble-scripts/ . From now one all non-sample scripts will be placed in this repository. Eli Tallman 1afffff Fix unstable TF2 state address 7ef0e7f TF2 update; hopefully more update-friendly arrays now Thorvald Natvig b6bd51c Add disambiguation for "Bandwidth" in UserInformation c372eb4 Windows XP doesn't have DXGI or D3D10 fd0bbfb Save state for dock widgets when going minimal 83f8d64 Add dontskip for dxdiag aa9616e Work around QLocalSocket NOT closing sockets when it is deleted Michał "Zuko" Żukowski 7925624 Polish translation 2010-02-01 Stefan Hacker dfd5e43 Hide high contrast option from audio wizard on windows e40ea57 Make notification settings in wizard reflect current settings Mikkel Krautz 9a9ad5c Fix no-overlay option. 3203941 Add CONFIG+=no-overlay for devices where an overlay doesn't make sense. 6f28020 Unbind PBO buffer before we draw our GL overlay. 1b99c94 Remove overlay from Mumble11x. Codesign libmanual.dylib. Benjamin Jemlich f375d2b Re-Regroup the UI config page Thorvald Natvig 99a8546 Send userstate to pre 1.2.2 clients without textures as well. Oops. f9c3d34 Don't send new-style textures to old clients e6b585d Fix compat textures without proper alpha, make the avatars be memoryblob://avatar/ and expand the fileengine slightly 07e0d90 Send only the avatar hash on login Michał "Zuko" Żukowski 3ca49eb Polish translation 2010-01-31 Stefan Hacker a7e7171 Auto-enable high contrast mode when high contrast theme is detected (Win only) 95e41b8 Make high contrast mode of AudioBar use color to brush replacement table instead of fixed values 48cc272 Add High contrast option for visually impaired. For now only affects AGC/VAD config bars Álvaro Manuel Recio Pérez 3ae5144 Updated Spanish translation Benjamin Jemlich 62272b4 Regroup UI options 584ab54 Always start the channel context menu at the first option 5c17dbe Fix TTS plaintext for long text messages Thorvald Natvig bd97e45 Proof-of-concept image filesystem e99122c Fix qt<4.6 overlay render 0901e3a Allow removing of texture without downloading it 2010-01-30 Stefan Hacker c1515fe Special case for Speak right in the ACLEditors indicate scope for WriteACL functionality 03f5930 Do not hide group/acl tabs from non-experts and visualize that WriteACL grants all rights by graying out the others if it is set. Natenom 82e3d5c German Strings updated Thorvald Natvig 5004a8e Fix snapshot path in binserver 28641d2 Fix texture in D3D9 after reset 3ebcd23 s/Texture/Avatar/ in menus 93a4c7f Fix mouseover textures and 1.2.1-compatibility 2010-01-29 Stefan Hacker e70d404 Allow the use of realName in smfauth and make it possible to read avatars from local file system ff36e04 Make smfauth display realName instead of memberName d30713c Added Simple Machine Forums (SMF) authenticator to scripts folder Thorvald Natvig 1070713 Make channel_info and user_info be utf8 on mysql e913f4b Have testauth return a dummy avatar 705738a Server-side avatar support 75fc50a User avatars 2010-01-28 haru_arc f816fe6 Updated and fixed japanese translation Erik Bouvin Pedersen eda8b2f Update Danish translation. Mikkel Krautz b2181bc Re-enable Intel-specific hacks in OSX overlay. 5f4fcb1 Socket-based overlay for Mac OS X. Thorvald Natvig eba8bb3 Add strong cert link to cert wizard 8b90d2e Show tooltip warning in rich text editor when over message limits 7a2061c Propagate a few server config options to the client 7d81002 Split ServerUser from Server.cpp d878550 Use glPixelStorei for subtexture updates on Win32 fc76734 Fix LCD enable state 2010-01-27 Stefan Hacker cdf21bc Some untranslatable strings were marked translatable Natenom b502e7f Updated German Translations Benjamin Jemlich 202d1bb Only enable Join Channel if we can join the channel. d891807 Always visible Join Channel context menu option Thorvald Natvig f54a142 Fix endian on ARM af4ac7a Fix enable-state for mute/deafen 2010-01-26 haru_arc 8bd520e Updated Japanese Translation Natenom b1884ac Updated German Translations Thorvald Natvig 57ef6e6 Fix texture assignment in server cf9c337 Fix enable-state of usermenu 7f019a7 Remove last parts of old SharedMemory 4568886 Be quiet about expected suppress state 38015bf Use the new blob/sha1 functions 89a0f32 Make database work on sha1 for comment seen state 63568fd Client-side blob cache for comments e51a048 Make Win32 OGL overlay work in windowed mode Michał "Zuko" Żukowski 8b56834 Polish translation 2010-01-25 Thorvald Natvig c00b9bf Socket-based linux overlay eaf4fc0 Make new overlay drawer Qt 4.5 compaible and use QDir::home() for sockets 2010-01-24 Stefan Hacker e548546 Initial import of WIP mumble protocol description Álvaro Manuel Recio Pérez 59b0d54 Updated Spanish translation Thorvald Natvig 036c6c3 Remove dependence on sm.sm from Win32 overlay 0baf758 D3D9, D3D10 and OpenGL/Win32 pipe-based overlay 2322bec Clean up texture assignment 2010-01-23 Eli Tallman d24d29b Added alpha-testing ArmA 2 plugin; plugin version bumps Thorvald Natvig 7b30742 Add placeholder SharedMem unix implementation 9dfc063 Add missing SharedMem files d173452 New SharedMemory2 class for communication client/server 2010-01-22 Benjamin Jemlich 909d515 Add menu bar config option 7213a00 Add a Self menu and remove the context menus from the menubar f07dc00 Disable auto expand in the user list 64f30a4 Add text before the welcome message to fix weird QTextDocument behaviour 588975a Fix two compiler warnings Thorvald Natvig b915976 Explicitly name 'struct' for C89 compliance 6d885b2 Shared texture based overlay (client part) 1f51f0c Shmem based overlay (still WIP) 2010-01-21 Stefan Hacker 345d96b Replace URLs in TTS with more ear friendly strings Eli Tallman 295bc08 MW2 updates 71fd273 Add L4D2 plugin Thorvald Natvig 30b63c2 socket-based overlay (WIP) 8d64449 Fix a few strings in AudioInput.ui 2010-01-20 Stefan Hacker 179159c Fix overlay cropping (used blue instead of alpha channel) 02805c7 Give phpBB3auth.py auth the ability to display username next to avatar Mikkel Krautz 0216000 Fix OSX dist script for new libcelt-naming. Thorvald Natvig 6b75459 Instead of showing selfsigns as red, show strong certs as green, also in browser 019224c Upgrade CELT to 0.7.1 2010-01-19 Benjamin Jemlich e28919d Fix log time coloring & text object too large text object error message 7d8102f Display errorString on listen failure Thorvald Natvig bf008bb Mark untrusted servers with a pale red color 8b0cbe8 Qt 4.6.1 for static snapshots 0835890 Reset document iterator after editing 416a742 Fix icon contextmenu fd8dd9d Update mkwrapper to generate astyle-compatible output 2010-01-18 Thorvald Natvig 20e73fc Texture on demand 56bff0a Fetch comment/desc on demand b1bb8a8 Show cert expiry in wizard, and warn on startup if cert expires in <14 days 731d293 Make the client compile, even if it's missing blob support 5cd6a1b Add icesecret .ini parameter to "protect" local Ice connections c129ba4 Add imagemessagelength limit to server 2010-01-17 Stefan Hacker dd6a310 Round out the redirectWhisperGroup doc in Murmur.ice Thorvald Natvig d89423b On-demand stuff for Ice 60e7151 Serverside comment/texture send-on-demand 2010-01-16 Eli Tallman ad0f30f MW2 version update Thorvald Natvig d109910 Update to new naming for libcelt0 7ec36ab Update CELT 814752a Request CAP_SYS_RESOURCE and dynamically increase nofile on demand 3a50ef5 Clean up suppress state messages 2010-01-15 Stefan Hacker 838697d Update LICENSE file for 2010 Thorvald Natvig 0fc5d55 Fix bandwidth estimate for UserInformation and Ice 8463c82 Increase userinfo update frequency and show stddev instead of variance 2010-01-14 Stefan Hacker 221626f Make click on client/channel link focus the chat bar Natenom 759480f Updated German Translations Benjamin Jemlich e5fbc07 Fix stylesheets in log messages Thorvald Natvig 2f2012f Use Qt 4.6.0 for static server snapshots 31ff2e6 Use Protobuf 2.3.0 on Win32 a14e3f2 Specify that we want crashreport descriptions in English, please 2010-01-13 Thorvald Natvig daa8341 Don't set appusermodelid for 11x c876409 Include dxdiag in crashreport 2010-01-12 Benjamin Jemlich 1e0ec8c Fix coding style in ServerHandler 68ac664 Unbreak log messages containing invalid links 0bfb9c7 Update comment in updateRegistration for connected users Thorvald Natvig c9f005b Save/restore connectdialog state 0671d7b Show server name in trayicon tooltip cac28da Show remote host in Server|Information 95d667b Show channel user count in G15 c39492f Unify 'IsThisVista?' checks to one place, and use release build apppath for jumplist 2010-01-11 Stefan Hacker c12f127 Fix focus tracking hiccup on disconnect in chat bar 09dd4a3 Fix mumble-auth.py for 1.2.0 (#2926521) Benjamin Jemlich 16a38a1 Add QThread yield calls c34a38c Make cert details dialog in the user info dialog window modal 5a567c0 Set last servername in URL handler Thorvald Natvig da6ef89 Use QNetworkAccessManager to register, QHttp is deprecated 876fd2f Remove 'ulimit -r' from init script as it requires bash cbee6c8 Only show userinformation if server >= 1.2.2 2010-01-10 haru_arc 5eed139 Fixed Japanese Translation for 1.2.1 Jan Klass de2208e German translation updates Benjamin Jemlich cf33de4 Move assembly of some protobuf messages to ServerHandler 170fd04 Disable translation for some invisible strings a6a6680 Fix possible memory leak in tasklist code 625fbc4 Fix multiple recent list entries with different usernames Thorvald Natvig 01b78bb Show strong certificate state in client fd87e5b Zero packet stats on startup (oops) and export strong certificate state a3cb3fb Make UserInfo fields copyable 3a2280f Bump version to 1.2.2 360085f Hide empty statistics fields 070f316 Show bandwidthrecord stats in client fba3df2 Export bandwidthrecord statistics 73dc378 Clientside user information e233e6e Fix mixed up stats sent from server 08c753b Userinfo (serverside) 2010-01-09 Eli Tallman a27bda5 Add top vector to UT2004 77713c8 Fix unreliable pointer on 1942; fix UT3 top[1] reversal issue when looking down Thorvald Natvig e11e8a7 Fixed patch for sqlite syntax ad833d6 Revert "Don't use mysql syntax in sqlite path" 114d4ea Don't use mysql syntax in sqlite path c85e37d Try using skin: in a few more places 2010-01-08 Thorvald Natvig 0457bb0 Have G15 default as unavailable until proven otherwise 2e177ba Use uiAccess only for mumble.exe 2010-01-07 Eli Tallman 57e8b77 Update remaining plugin licenses 58081c6 Update licenses; add UT3, 2004, 1942 plugins; update some Source plugins Mikkel Krautz d43d38c Tell codesign where the mumble-overlay binary resides now. Álvaro Manuel Recio Pérez 9a38eee Updated Spanish translation 5989b9c Updated Spanish Translation Benjamin Jemlich 3ec3f5e Fix compiling mumur on FreeBSD 7426294 Update LICENSE Thorvald Natvig 2e36c68 Process disconnect events before connecting to new server 10e4c19 Add Africa f6dd2b7 Intel C++ 11.1.054 on Win32 b5b6ba2 Add getCertificateList to Ice Jonathan E. Hansen 2e2652b Update Danish translation for 1.2.1. 2010-01-06 haru_arc a8d4b61 Updated Japanese Translations Ilmar Kruis 2701266 Positional audio plugin for Lord of the Rings Online. 2010-01-05 Thorvald Natvig 16339bf Update license to 2010 45da4e1 Add license info to a few plugins 2010-01-04 Eli Tallman 85e5429 Add licenses to plugins 2010-01-03 haru_arc b9a647b Updated Japanese Translations for 1.2.1 Álvaro Manuel Recio Pérez eee808d Updated Spanish translation Natenom c9f7a54 Updated German Translations Thorvald Natvig 2950634 Fix a few spelling problems cfcc962 Fix stuck PTT input in audiowizard 6a8a20d Roll back mumble_de.ts d150ba1 Fix spelling error in manpage 64a7d22 Honor CONFIG+=no-crash-report for 11x Spaccaossi 9019991 Italian translation for 1.2.1 and 1.1.x Michał "Zuko" Żukowski 336d02d Updated Polish translation 2009-12-31 Thorvald Natvig 064969a Allow setChannelState on root channel 2009-12-30 Benjamin Jemlich 0434d8f Hide the custom quality text if the checkbox is not visible 2009-12-29 Eli Tallman dec2ba8 Link AW PA setting to TransmitPosition c70af3e Fix qcbHeadphone fce765a Remove leftover stub d58af53 Fix remaining plugin bugs; ensure console connects get handled properly; link PA in AW to bTransmitPosition; set default minimum volume of PA to 85% Benjamin Jemlich 3f9be33 Fix QWindowsVistaStyle hack when using stylesheets 530bc5e Add a default stylesheet for log messages 3983bd1 Fix log CSS classes and remove "'s around channel/usernames Thorvald Natvig 52b5939 Don't showpage() on exit 764151d Fix a few leftover column 1 dataChanged() 7825b04 Allow viewing comments in richtexteditor ef1b9ff Search for mumble.ini in APPDATA as well feef4ef Per-channel userlimits (usersperchannel in .ini, hidden option) 2009-12-28 Stefan Hacker 32d4490 Replace bitwise operators with boolean ones in attenuation handling Benjamin Jemlich 827cab2 Hack around Qt's Vista Style weirdness and drawing code cleanup 9caba4f Rewrite UserView drawing code Thorvald Natvig 04f3e4f Handle permissiondenied for user rename in client 338ea0f Validate usernames on user rename 02214c0 New PLC code in CELT master bef7408 Show and react immediately to tranmission changes in audiowizard Michał "Zuko" Żukowski 243f5c7 Update Polish installer 2009-12-27 haru_arc 6364d67 Updated Japanese Translations for 1.2.1 Stefan Hacker 117f396 Make audio quality selection in audio wizard apply immediately afb7b45 Add "Attenuate applications while other users talk" check box to the audio wizard's device selection page 26a5f9c Make other applications volume slider represent attenuation. Fix surrounding strings. 8bc620d Add what's this and correct tooltip for attenuation feature 6412b3a Disable new attenuate others controls if the sound system does not support them c24b7f0 Make Gui for volume attenuation of other applications more useful 347ef1d Fix bug in attenuate others while you talk code Eli Tallman c0ecbd2 Fix vehicle V/H floats 86f851f Add ETQW plugin files 417ae98 Unified string messages; added ETQW plugin; various plugin fixes, improvements and updates Mikkel Krautz 1b52809 Fix 11x crashreporter for OSX. Natenom 60ca8ee Added some new translations for 1.2.1 Benjamin Jemlich 69a05b8 Small fixes for the german translation 1c2a5b3 Change some translated strings 5f8aedf Add tasklist entries for recent connections Thorvald Natvig ff50167 Use ShellExec to launch mumble in installer 484aa0b Add symlink for os_win 676f6da Backport crash reporter to 1.1.x 1831073 Compile fix for 11x 19d171c Update changelog script to skip language updates a42f160 Set uiAccess to true eac3c5a Allow spotify links 107aedb No, really, use short instead of char 075098e Listen to IPv4 explicitly if IPV6_V6ONLY is 1 357e016 Fix bandwidth monitor to handle larger frame sizes Jonathan E. Hansen 48646e1 Update Danish translation b24f793 Danish translation for 1.2 2009-12-26 Eli Tallman 2566014 Linkcheck is different if loading movies 87ec3c5 Fix BF2 link bug; improved context address 98cd01e Update MW2; remove useless context 2009-12-24 Stefan Hacker 7a058a9 Add possibility to attenuate other applications while talking a7a18de Show talking state in tray icon Eli Tallman 9f48958 TF2 update Benjamin Jemlich b39f73b Remove the flags column and draw the flags icons right aligned a6a4bba Fix 11x compile error e2568ea Added/Fixed accelerator keys and tab ordering f3a3d1d Add channel join action to context menu 4a45dd8 Fix TTS output for user links 2009-12-23 Thorvald Natvig 27ad7ea Update Qt license text 8389b64 Print a big, fat warning if resource limits indicate insuficient descriptors are available c360c5c Update path to G15SDK 3.04 2009-12-22 Thorvald Natvig 20e65f8 Automatic certificate creation with backup and restore 2009-12-21 Stefan Hacker bb55b37 Fix current index on item move + chatbar default text update a9bd564 Only enable comment reset if there is a comment dc0cee5 Add the possibility to disable individual plugins (#2868251) Karl Dietz 6da2259 update wow plugin Jan Klass f5260da indendation fix, normalization Benjamin Jemlich c25a624 Fix joined server link for registered users 9f19fe4 Fixed typos and missing types in log messages. fa8a98d Change getPathToChannel to return a QString instead of modifing it's arguments 902fe58 Add links to the log window 17f619e Remember last channel on disconnect Thorvald Natvig 546b35c Quickgenerate certificate for lazy users 06f3542 Make celt compile on msvc again cb5c323 Add a few more CELT fixes 32c256b Delay plugin rescan ffed0d8 Don't update user plugins if userdir == systemdir 2009-12-20 unknown 725c4cf Update French translation Stefan Hacker 2b70c8e Add rename context menu entry in "Registered User" (#2885100) 608650b Disable qaUserComment/qaUserCommentReset action when no user is selected a193f1b Improve robustness of custom chatbar context menu 315ff84 Paste and send context menu entry for Chatbar (#2915069) Mikkel Krautz d6ac81e Fix resampling in PortAudio backend. 04725ad Attempt at better OSX 10.4 support. Thorvald Natvig b392119 Fix help text for shortcut bind 3593ead Remove a leftover else for red->blue transition ed33707 Disable foreign key checks during database migration 2009-12-19 Eli Tallman 75fbf02 TF2 update Thorvald Natvig d179b5d Allow exact match of server bandwidth b3e2cd6 Avoid red->blue flash transition on incoming whisper 2009-12-18 Benjamin Jemlich ebef80e Fix audio wizard page visibility and layout ec9c1d7 Resend mute status after deleting a channel 13d7225 Fix join subchannel shortcuts 9d16137 Set correct target for the last whisper frame 2009-12-17 Stefan Hacker c421faf Fix faulty function call in phpBB3auth.py Eli Tallman 2c83e67 TF2 update; update DOS build number 7b2d347 DODS update 2009-12-16 Stefan Hacker 53346cb Only show comment reset for other users Thorvald Natvig 90e945c Add CONFIG+=analyze for VC. Needs a lot more filtering to be really usefull. 2009-12-15 Stefan Hacker d2114f2 Enhance adjustability of always on top setting Benjamin Jemlich 0e241d1 Save server specific shortcuts on quit 39ba54f Fix RichTextEditor resizing in edit channel dialog 839cf4c Add a command line option to allow multiple clients fd830d7 Add the ability to colorize log messages Thorvald Natvig 718da15 Avoid a potential divide by 0 under really bizarre circumstances 2009-12-14 Eli Tallman 9aaa8cc TF2 update 2009-12-13 Stefan Hacker 76c2c4d Add quality & notification page to Audio Wizard Thorvald Natvig 2ed1710 Reupdate the CELT rev 2009-12-12 Phrag 6efe83a Czech installer Julien Pardons 8d76b5a Patch for icedemo.php (user edit) Thorvald Natvig 18a3e80 Fix permissiondenied on invalid channel a1114e4 Enable connect to freshly added servers 11a6e94 Cache result of doEcho 2009-12-11 Thorvald Natvig 9716748 Include varlength array fix for CELT 842769a Use a bit more forgiving bandwidth estimation on the server 7dcc10e Add frame header when computing bandwidth on client 43c4def Try the new LPC-based LPC for CELT f0298e3 Bump version to 1.2.1 867da14 Order channels when importing to MySQL 2009-12-10 haru_arc d5e0afb Japanese Translation for 1.2.0 Eli Tallman a4ea89c Added BFHeroes plugin; updated BF2 and BF2142 with IP contexts and improved linkstates Mikkel Krautz 9171b43 Add missing .plists to DIST. e9f7e0a Add no-cocoa CONFIG option, to allow Mumble to build against non-Cocoa Qt. Thorvald Natvig 68d33ba Disable unfinished translations 84c63d8 Update release scripts for new host 2009-12-08 Cristian Gattamelati 75f5b37 Italian Installer update Eli Tallman eb9ab11 Various Source plugin updates, fixes; CoD4, MW2 context fixes Mikkel Krautz e595948 Fix overlay launcher for Snow Leopard. Update bundle identifiers. Thorvald Natvig f4093f7 Work around bug in 4.4 compat emitDataChanged Bartek "stranded" Sumowski 58f9726 Updated Polish translation 2009-12-07 Álvaro Manuel Recio Pérez be4786d Updated Spanish translation Thorvald Natvig 5554295 Use Qt4.4 compatible datastream for jitter report 2009-12-06 Thorvald Natvig a0908d5 Only reload stylesheet when necesarry 8f09a06 Set context for 4.6.0 translations 2009-12-04 Stefan Hacker 332b143 Make phpBB3auth.py python 2.4 compatible and improve avatar resizing Eli Tallman e77beae AOC, CSS string updates; Dys, Insurgenccy, TF2 IP:Port context support. DODS IP:Port+Team context support; CoD4 context fix; Manual plugin shortname fix Thorvald Natvig acb7642 Better fix for zerosized voice packets 5819780 Ignore zero-sized voice packets 2009-12-03 Thorvald Natvig 4023e4c Back to the updated master branch of CELT 2009-12-02 Thorvald Natvig 22f70fb Usage format 2 a4f1ff7 Don't bother sending short jitter reports Bartek "stranded" Sumowski 0521e38 Update 11x Polish translation 2009-12-01 Stefan Hacker aa59399 Manual positioning plugin Eli Tallman 53fcb70 Gmod update BAYSSE Laurent d8188f7 Translations in French of new strings, and some minor write and grammar errors corrected Mikkel Krautz fdc8261 Fix up dylib refs for libmanual.dylib. 84099e5 Fix Mac ConfigDialog for Qt 4.6. 36c015c OSX build fixes for Qt 4.6. 7aa6e67 Fix graphical glitch on OSX. 0e676a1 Strip debug symbols after extracting them for CONFIG+=symbol for macx. Benjamin Jemlich 8533e2a Fix manual positioning plugin on linux Thorvald Natvig 45ebdb6 Quiet down a few compiler warnings a908b5a Use WId explicitly 7b30399 Commit shortcut editor before adding/removing ad9c725 Use SEH magic to work around __HrLoadAllImportsForDll oddities ff4057b Try to promote libGL.so to global scope if we can't resolve it directly 14ff24f Add magic 0.7.0 detector 2009-11-30 arrai 00f3aa2 Fixed linking temporary channels Stefan Hacker 3a3926c Extend TestLink plugin with comments so its code can be used directly in the documentation page BAYSSE Laurent 0632e82 Add the new strings 47d2398 Translations in French of installer and Mumble Natenom f392cb6 Updated German translations for 1.2.0 Thorvald Natvig e7f089b String updates 334fe4d Upgrade deps to 4.6.0-rc1, openssl 1.0.0b4, boost 1.41 6d9a0e0 Change to straight 4-byte encoding for floats dfd87b0 For fresh IP bans, don't clone hash and username 1f6e1dd Fall back to -ldns_sd if pkgconfig for avahi isn't found 2009-11-28 Stefan Hacker 1c8d127 Fix mistake in previous message patch 2009-11-27 Eli Tallman 85919ce Remove uncommitted game plugin f6c26d6 CoD5 version bump; fix MW2SO .pro Mikkel Krautz 3089fbe Fix typo in ConfigDialog fix for OSX. f61dd13 Make sure ConfigDialog is sized properly on OSX. 2009-11-26 Mikkel Krautz a7f4bea Fix mumble11x build. Benjamin Jemlich fbb9989 Fix crash with importing a passworded cert Thorvald Natvig 4b9941f Update the celt codec yet again to fix more bugs 4d64a01 Update celt version 6bce206 Delay restoreGeometry to after windowflags are set d042b70 Add jitter data to usage report 2009-11-25 Stefan Hacker b2b8c10 Fix #2903204: wrong status message displayed for deafened (server) event Eli Tallman 9766240 MW2 string updates, TF2 identifier update Mikkel Krautz 760bf63 Fix no-dbus build. e0e8bc0 Fix OSX compatibility client launching and URL handling for unversioned and ?version=1.1.x URLs. Benjamin Jemlich a22567a Fix cert name display with non ascii chars 1d07f8a Store the comment in the user object if it's changed via RPC Thorvald Natvig 23ada59 Update 0.7.0-src to a version that builds on Win32 2009-11-24 Eli Tallman 50af882 MW2SO fix state value Thorvald Natvig 62aa53b Don't deref the mainwindow before it's created 2009-11-23 Eli Tallman b7bc917 Fix MW2 positional data Thorvald Natvig 3f7ad99 Fix a few strings 39cd472 Upgrade celt to exp_time_pitch 67fc2c4 Change qwave loading to avoid a few XP bugs 2009-11-22 Stefan Hacker 0c60717 Add channelname and username var to murmur.ini to make them more visible 6150c78 Fix Unicode handling in phpBB3auth.py and make it able to load raw Ice configuration tuples Mikkel Krautz 860c105 Update Mac OS X Boost to 1.41.0. a3cc6a2 Property list fixup for OSX binaries. e96809e Extract .dSYM debug symbols on Mac OS X when using CONFIG=symbols. c365ac6 Clean up overlay_mac build. ae45a2f Use -dead_strip linker option on OSX. 0a2ef0e Clean up Unix section of compiler.pri. Keep platform specific flags in their own sections. 8a10baf Add phpBB3auth to OSX dist script. Remove dead PackageMaker code. Benjamin Jemlich 3172ae4 Fix client ban timezone handling c180869 Check bans using UTC time 248d44a Fix ban expiration Thorvald Natvig f16570e Stop findDesiredChannel while still connecting 2dc541b Fix lingering channel comments 2009-11-21 Stefan Hacker 01a72bb Integrate default sound pack into mumble Eli Tallman 54a487e AOC, CSS full context support 765c399 MW2 MP update BAYSSE Laurent 6390d4a French translation update for 1.2.0 Mikkel Krautz 88c1b27 Refine MainWindow aesthetics on OSX. Benjamin Jemlich 3e66866 Use a new instance for each iteration so we don't leak information of previous items in Ice replies 2009-11-20 Stefan Hacker 4ad97d3 Add Server connect timeout of 30s. 99b99e9 Reduce TTS/Notification Spam in defaults and reclassify some unimportant log messages to info level. Mikkel Krautz 447ac82 General LCD fixups and make G15 on OSX a bit prettier. 2009-11-19 Martin Skilnand 7f0ba42 Centered dD0T type authenticated.svg. 62f9a8b dD0T version of authenticated.svg. Attempt two. b803a43 Making comment icons less 3D. 421d778 Replaced authenticated.svg Stefan Hacker 6144233 Revert to second draft for authenticated.svg. Mikkel Krautz 81c9e78 Revert AudioDevice{set,get} parameter change in CoreAudio. da18c1f Make sure G15 works on OSX. 2009-11-18 haru_arc a8a25e9 Japanese Translation Eli Tallman 1176bdf MW2 plugins version updates Jan Klass 640d91e German translation update minor English text fix Mikkel Krautz a3cbe21 Don't disable for CoreAudio builds on Mac. Benjamin Jemlich 3c050e9 Add an option to reject connections without a certificate 298d342 Add a warning if the settings database is read-only Thorvald Natvig 5254448 Initialize bCertRequired 2009-11-17 Stefan Hacker 34f9ea9 Raise default quality to 40kbit/s Benjamin Jemlich 2a582a6 Change reject type field to uint32 Thorvald Natvig 0c36a80 Add some type safetyp to denytype c8b81b6 Make rejecttype optional 2009-11-16 Martin Skilnand c4d99f5 New comment icons for review. 2009-11-15 Stefan Hacker d28e95f Some comments and minimal refactoring of Server::recheckCodecVersions() 0eea7b5 Make hl2dm PA plugin compile again. 2009-11-14 Eli Tallman 5ec2225 Ins, TF2, L4D updates ac11b54 Fix CoDMW2SO state value 9cc7f15 Add MW2 plugins to installer b560789 Add MW2 plugins to plugins.pro d5777ef Fixed state and V/H for MW2; MW2SpecOps plugin added dfd7909 Fixed state for MW2; MW2SpecOps plugin added Álvaro Manuel Recio Pérez 4911c8a Update Spanish translation 2009-11-13 Mikkel Krautz c81ff65 CoreAudio: Allow devices to run even if they have to use their default buffer length (when we can't set it ourselves) 71e1b7b Add buffer range debugging to CoreAudio. Fix isInput parameter for setting buffer size. 2009-11-12 Stefan Hacker 7411fc9 Use localeAwareCompare for overlay sorting. Karl Dietz 6019fc1 plugins/wow: disable context in release builds 8589e57 Clarify condition in PA context handling Eli Tallman 7f146f2 CRLF Álvaro Manuel Recio Pérez 382bca6 Updated Spanish translation Patrick Matthäi ec48050 Spelling fix Thorvald Natvig 3df0dce Add direct dependent libraries under X11 2009-11-11 Eli Tallman ddb16ce CoDMW2 plugin; HL2DM context example Mikkel Krautz aba1fc2 Update osxdist script for beta and fix diskimage window dimensions. Thorvald Natvig ada9d58 Allow setting version on binserver script too f3b2395 Allow release script to specify custom version f3e9ed7 Automatically use system CELT if it's >= 0.7.0 66c2261 Change initialization order to allow direct-copy constructor bd33712 .ts file update a59ce15 Don't distribute older celt versions in tarball either f765851 Initialize ucFlags properly 786ed67 First check SSL cert errors, THEN check the SSL version 2009-11-10 Jan Klass 91f536b fix some obvious English text issues Ludwig Nussel 7dae3ed silence integer/pointer cast warning 1b2647b Qt 4.4 doesn't have emitDataChanged(), the function is the replacement Mikkel Krautz 3efd3dd Fix reference to two sliders in Audio Wizard VAD strings. Benjamin Jemlich 0917b0a Deny category dragging Thorvald Natvig 7e4ce0e Build only 0.7.0, 0.6.1 etc are deprecated for the beta 505e774 Source string fixes from naproxeno 9239379 Punctuation fixes for tooltips 2f7e430 Use TLSv1 on server 75b9256 Use CONFIG+=packaged when building official packages from git 6fdad28 TLSv1 by default -- fallback to 1.1.x for SSLv3 8b0549b Display bitrate correctly for Speex, and default to 2x10ms packets 64d16b8 Remove input policy from dist list Spaccaossi aed4569 Italian translation for 1.2 2009-11-09 Thorvald Natvig 0a0c83f Add overlay safety checks for 11x too 51f4bf3 Update benchmark test 997c5f3 Fix player removing from overlay when they disconnect 52aead7 Use UAC NSIS plugin 2009-11-08 Álvaro Manuel Recio Pérez 0bfaea9 Updated Spanish translation. meanracoon 6db9fb1 Dutch Installer Translation 2009-11-07 Stefan Hacker 4c5930b Make channel moving require ChanACL::Write privileges. Karl Dietz e0c0609 stabilty improvements Ludwig Nussel e2a8a20 allow to disable crash report dialog c7f93ed fix build with qt 4.4 317a2bf add support for certificate directories Benjamin Jemlich 1ef709d show user count on channels 966f34d fix memory leak with ptt audio cue 3a6e97a pass commandline arguments to Ice Thorvald Natvig 72d78aa Arch-dependant library load on Win32 e5dab47 Make celtbuilds symlinks ede39c7 Ice options in murmur.ini 5e71c19 Use 0x040500 instead of QT_VERSION_CHECK() cf437d9 Make no-crash-report a config option b46694b And fix the same leak in speech itself. 47f8d8f Usr \r\n on Win32 for murmur.ini 2009-11-06 Mikkel Krautz 8dcb531 Catch and handle kCGEventTapDisabledByTimeout Snow Leopard behavior in GlobalShortcutMac. af80da5 Catch 'disable' events in GlobalShortctMac. 13e7d21 Allow Default Device in CoreAudio to be translated. 2009-11-05 haru_arc cd3e90f fixed japanese translation 2009-11-04 Thorvald Natvig bf23ffc Show client versions in the log 2009-11-03 haru_arc 26d77a2 Japanese Installer Translation 48d03a5 Japanese Translation Thorvald Natvig 5f07255 Add workaround for Chrome cut&paste URL on Win32 e3aae8c If not connected, use highest codec version c9117e1 Use SO_PRIORITY on nix to set packet queue priority 2ea8ede Clientside QoS option 2009-11-02 Spaccaossi 366110e Italian installer translation 2009-11-01 Stefan Hacker 2308cf5 Minimal fixes in German translation. 68536c3 Switch default overlay font for Windows and OSX to Verdana. cad983b German Translation (1/3) Mikkel Krautz 7acf3ff Change QPushButton -> QToolButton in ShortcutTargetWidget. Fixes ShortcutTargetWidget glitch on OSX. Benjamin Jemlich aab13b4 German Translation (2/3) Timo K 7a66764 German Translation (3/3) 2009-10-31 Stefan Hacker 7cb7803 Fix regression in regression Fix (phpBB3auth.py) 122cfcb Fix regression in boolean config value parsing in phpBB3auth.py 9f36caa Fix getRegisteredUsers in phpBB3auth.py and restrict operations to normal and founder users. Karl Dietz d6de243 Transmit position from avatar and heading from camera. b5b4777 Update WoW plugin. Jan Klass c9112a2 German Translation 2009-10-30 Stefan Hacker 5207473 Daemon mode and py25 compat for phpBB3auth.py. Fixed line endings of phpBB3auth.ini + minimal changes. 9c3351c Fix phpBB3auth.py encoding/line endings + small style changes. Thorvald Natvig ccbe964 Sort overlay 2009-10-29 Thorvald Natvig d899cc2 Update bFirstTime to be unique to 1.2.0 -- get people through the audio wizard again c1a4cb0 Allow ftp:// links through whitewash list 2009-10-28 Stefan Hacker 9dd0edc phpBB3 authenticator written in python + ice Thorvald Natvig 893f8c1 Keep references to volume objects around, should improve WASAPI volume ducking. 471b2df Remove debugging output from addMic b8192cf Qipo still produces SSE2 opcodes in pure-float paths, even without QxSSE2. 351c1b3 Replace echo-jitterbuffer with a queue 2009-10-27 Mikkel Krautz c1c0025 Re-add bRunning to CoreAudio. encodeAudioFrame() uses it to determine if AudioInput is running. 9e7e9f2 Add small warning message to help debug GlobalShortcutMac strangeness. 80a2baf Change libcelt filename in osxdist. Thorvald Natvig 1260b95 Speed tests for resamplers e7b4688 Fix crash if sharedmemory is missing e3bfc2f Clean up compiler flags on Win32 e24c809 Update scripts for 1.2, remove deprecated input policy 1b2bf32 Mention the s/UserInfo/byte/ hack in the .ice 2009-10-26 Thorvald Natvig 0e6214f Don't put unpushed speex reference in the tree. dba7de2 Re-enable IPO now that we have a workaround, and add the missing speex file 2045012 Use correct includes for celt, and update packaging script 2de0060 Build CELT 0.7.0 2009-10-25 Thorvald Natvig 9b9b5eb Libspeex's resampler misbuilds with -Qipo, disable until analyzed 384c0df Blacklist explroer.exe from the overlay 54adcf8 Make protobuf a dll f05f8a1 Use speex_lib_get_mode instead of direct linking 62b1536 Enable edit menuentry if write on parent (sync with server permissions), and fix speex compile bug 6a4a2b6 Precache permission on parent channel 0c05ca0 Don't send superuser in msgUserList 9d3274b Enable more SSE optimizations and compile Speex as dll 2009-10-24 Mikkel Krautz aa5cdbc Remove superfluous bRunning's from CoreAudio. 94ecb90 Don't sleep in CoreAudio thread when waiting for output data. Clashes with TextToSpeech. Thorvald Natvig a517f5a Permission denied for missing cert 2009-10-23 Mikkel Krautz 720b0e4 Crash Reporter implementation for OSX. Thorvald Natvig 874c03a Source strings for 1.2.0 alpha 580655f English source strings 2009-10-22 Mikkel Krautz 6cde32b Remove custom speex fatal handler as well. ae0d2db OSX ConfigDialog for 11x. 470f6ed Remove old unused OSX overlay code. 3bfe5b3 Proper debug handling for OSX overlay launcher. 94f4542 Add CoreAudio source files for 11x, as well. 4d08538 CoreAudio for 11x. 01a4770 Build OSX client without PortAudio. 9d78c54 CoreAudio audio backend for OSX. Thorvald Natvig af09b09 CELT with proper VBR 1ca8016 Use proper symlinks for shared files 2009-10-21 Thorvald Natvig 9a7e709 Allow EINTR during poll 572b530 Allow setInfo with name if it doesn't change 02ccd34 Clear ACL cache when removing users 0104375 Disable echobox on wizard init unless supported e73c9b0 Compile released snapshots with IPP 6216f4a Distribute dbghelp.dll on Win32 so it can work on older XP installations 99ba4f4 Clean up STACKVAR for murmur 79d7461 We don't really support plaintext anymore, so remove detection from the rich text editor 146cc63 Cache pingsort 2009-10-20 Martin Skilnand 1813b2e channel_linked.svg now with blue glow. fa3f1e9 Different style edge for better rendering? 025138d New test muted_local.svg Thorvald Natvig 3b23451 Explicitly set DirectInput device pointer to NULL to ease debugging 866214d Save localmute state 2a2417a If sighup when not detached, interpret as quit be58259 Allow murmurd to compile under Qt 4.4.3 e6037df Update release script for multiple celt versions 488f252 Fix crash when removing last shortcut after editing it a4c6556 Compile new celt juggling on Intel compiler 2009-10-19 Martin Skilnand a2426bf Test icons/muted_local.svg Mikkel Krautz 3cf23bd Properly save expert state in OSX ConfigDialog. a484529 CELT dynload paths for OSX. Benjamin Jemlich 5917312 Don't allow to disable the temporary checkbox Thorvald Natvig 59678e2 Delete 1.1.x shortcut from desktop on uninstall 8a7b17e Allow serverpassword as alias for password in setConf d97a49f Check if name is already in use before allowing a rename d71202b Fix more compiler warnings 12a2644 Fix a few compiler warnings 9958660 Clean up compiler warnings on Win32 943f241 Moc turbo-mode aed0eda Update Win32 installer with celt dynlibs a122549 Reset encoder when restarting sending d655742 Default codec to 0x800000a on client 53bb306 Clientside celt codec juggling 73388f3 Force alpha-preference for bitstream 8000000a 2009-10-18 Thorvald Natvig 7dbaf74 Use full version filenames for celt lib 925dd22 Serverside alpha/beta celt version choice 5f8c841 Use int instead of uint to represent version f00341b Set permission value to heuristic to avoid quadruple query a3aea25 Send celt version on login 2abfacf Multicelt build fixes on nix 5247bf7 Clientside celt juggling library load b8813f3 Build CELT dynamic 2009-10-17 Stefan Hacker a879bf8 Fix 2880700 : [8af721] wrong chat line text fe8789c Fix behavior if we don't get permission query replies. aa88607 Fix permission poll on connect + docs for involved functions Thorvald Natvig 465cbbd Use 0 to express missing permissions 94035cf Add CELT version vector to authenticate packet d9335a5 Move user before clearing cache, not after 2009-10-16 Thorvald Natvig 20ec12c Don't query channel permissions when disconnected 1ba7c2d Clear permission cache on root on connect 2009-10-15 Stefan Hacker 62c3531 Disable chatbar if it is not usable anyway. Thorvald Natvig 696bfed Avoid overcopy for multichannel echo d1e5d7f English source strings 8fdfabe Include image dimensions in document size 7a8ca97 Remove texture option and fix chantemp default 2009-10-14 Eli Tallman 7eee5f5 Source plugins update Benjamin Jemlich d0b371c fix text cursor in chatbar Thorvald Natvig 5ae7c8c SuperUser can't query permissions 2c92c17 Clientside permission query ff70bc7 Clientside dummy for permission query 2009-10-13 Chosi f75ae8b L4D plugin update to rev 3986 Stefan Hacker 56f5f97 Tab and Ctrl+Space completion for chatbar. 0043285 Very small style fix ;-) Thorvald Natvig 7439bc4 Permission query (serverside) 055c13f Force config iconlist size 6076cc0 Restrict comments to message size limit, and only allow admins to clear (not set) other people's comments) Timo K d0bd7b8 COD5 plugin update to rev 1.6.1252 2009-10-12 Mikkel Krautz a974dc8 Fix Mac OS X ConfigDialog. Thorvald Natvig 4ddc686 Add (2), (3) etc to servernames when drag&dropped, and allow drag from public->favorite e4bc4a2 Don't initialize D3D etc if sharedmem fails 0693714 Whisper target redirect and session-based tempgroups 6a30255 Inproc draw for d3d10 e8f46da Delete bonjour servers from the list when they go away 36de491 Reset stats when editing hostname 2009-10-11 Thorvald Natvig fe9fee3 Make items in connectdialog selectable, eases keyboard navigation 2009-10-10 Thorvald Natvig c780f4b Fix overlay images e7a37de Fix crash if GetMixFormat fails. 67b12ee Use Qt4.5 as path instead of 4.5.2 2009-10-09 Thorvald Natvig bad2c33 Fix 11x to work with new config f1977b2 Update ts2html script 77570c4 Spelling fixes bfceb94 Merge expert config and advanced acl options 498a0db Change a few expert/nonexpert settings 0ac3cde Switch back to listbased config dialog df8e907 Mime demangler for richtexteditor 2009-10-08 Thorvald Natvig f3a6e64 Don't crash without bonjour f7dfa10 Scroll dd0t to the top a7a7c04 Don't add context menu for parent items 6261bbc Hierarchical connect dialog 2009-10-07 Thorvald Natvig f065c2b Fetch continent of public servers and grab geoip of user a9fdf25 Flush denormals on Win32 e6a49ff Force text to be interpreted as basic html 2009-10-06 Stefan Hacker 42c9d8c Make chatbar indicate target. 2009-10-02 Thorvald Natvig c935e13 Make binrelease script use IPv4 too 1989a19 Add overlay magic number and check memory size 7ecfc7b Make release script use IPv4 2009-10-01 Thorvald Natvig 052d23f Italitcs for the chatbar ce46ab4 Make keyboard search on userview do recursive, delay-expanded search 8d0b279 Fix dbus compile on Win32 ba1ae14 Allow ghost from same hash 2e93363 Show texture images in tooltip 2009-09-30 Stefan Hacker ddeb79f Fix translatability of ChatbarLineEdit Thorvald Natvig da6e842 Use service.name instead of :x.y in DBus calls 2009-09-29 Natenom 9a1ec81 Rename Name to Servername Thorvald Natvig 85dbca3 Fix bonjour in new DNS resolver 2009-09-28 Thorvald Natvig 4179db1 Separate dns loop and stabilize pingsort. Probably breaks bonjour 2009-09-27 Stefan Hacker 812e6b1 Comments for GlobalShortcut.cpp 8c197b3 Remove deprecated WoW plugin. 5082c26 Add TemporaryChannel permission deny type. b0384b6 Fix Channel DnD crash bug. b6357cc Do not allow channels to be dropped in temporary channels. fb41646 Fix CustomElements.h/cpp license headers and update some others. c30ac51 Slight chat bar behavior change + mumble.pro style revert 1fcfddb Merged channel tree and normal messages. 080ab96 Make chat bar clearly indicate its purpose. Mikkel Krautz e9b84b4 Don't do TextMessage symlinks in mklinks.sh 2009-09-26 Natenom c54a7ed Dont use always muted_self icon in tray. Show wether muted self or by server or suppressed. 2009-09-25 Thorvald Natvig cf662aa Add initialization to ValidDocument 5d6637b Add local TextMessage for 11x 2009-09-24 Thorvald Natvig 4e675bc Add selfreference for OpenGL ae2984b Use longtext instead of varchar for infos 0963a3a Rich Text Editor 0419b34 Start of rich text editor 2009-09-21 Thorvald Natvig e41dbbe Show focus message when running snapshots 511773d DX10 fullscreen texture test 2009-09-20 Thorvald Natvig 79a9abd data: handling support, and proper washing of harmfull links in all contexts 2009-09-19 Thorvald Natvig 90cb11c Wash URLs if not http, https or mumble e43d963 Send allowhtml state to client 8e79eae Allow stripping of HTML serverside 2009-09-18 Stefan Hacker c2b8f3b Disable port field if address is bonjour identifier. 224be19 What's this + tooltips in Log.ui and ConnectDialogEdit.ui 5a79945 Tooltips for GlobalShortcutTarget.ui dialog. d75ee9c TextMessage.ui What's this + slight change in looks 88a10c0 Introduce permission denied type TextTooLong. Thorvald Natvig 03516cc Send full cert details to external authenticator 2009-09-17 Stefan Hacker 8466232 Server side limit on text message length. d44ff93 Unify browsing for sound files. 60fb1cb Fix What's this for image dl switch 5962a14 What's this + tooltip for DoublePush time Thorvald Natvig c1db2c8 QScrollArea's background seems to be bugged in a QTabWidget, so stick our head in the sand and ignore it. 2009-09-16 Thorvald Natvig 537fe05 Fix display of default permissions when not inheriting ACLs 8528a23 Fix background on scrolled config widgets 2009-09-15 Stefan Hacker b4d2491 int boundary handling and more intelligent insertion for Channel DnD 948d772 Make Channel DnD MVC compliant. ff34f7f Fix obvious faults in channel DnD 4cc09d9 Drag and drop placement for channels. Mikkel Krautz c0a490c Enable 11x overlay for OSX. 2009-09-14 Stefan Hacker 3a0cf23 Prevent TTS/Sounds from being triggered when user deafened himself. 155bb16 Use localeAwareCompare for channel sorting Thorvald Natvig c3421d7 Workaround for qsystemtrayicon::activated 2051568 Check patchlevel in URLs d212243 Add version queryitem to URLs 2009-09-10 Eli Tallman 2f0821c Source games build updates Mikkel Krautz 4026950 Programatically generate .DS_Store file for OSX disk images. 2009-09-09 Thorvald Natvig db919c0 @strong group for strong certificates 75062d4 Remove leftover debug output eb34fad Support copy/paste from ConnectDialog d9e706c Make default bandwidth on server be 72 kbit/s a022487 Show date rollover in log window 6b5daa5 Clear comment on connect to new server 96b99d5 Show website and version on tooltip 8293a5d Drag and drop URLs to connect dialog 2009-09-08 Thorvald Natvig cf0192a Switch to P^2 estimator for ping 63fc19e Update installer to use qt.conf 2009-09-07 Stefan Hacker 18e9f17 New prefix broke UDPTunnel messages. Thorvald Natvig 9e65ae8 Add ServerShow as boost type 7710c86 Update 11x to have new global var 75356e1 4 byte packet length, 2 byte type, and use SSL compression to encode it 96ae2b2 Variable length packet length encoding 2009-09-06 Thorvald Natvig 62b83d8 Support for regional servers for server list 2009-09-05 Mikkel Krautz fa95e61 Update OSX license script. Natenom 6c90415 Updated German translations. 2009-09-04 Mikkel Krautz a078791 Don't use the installer on OSX. Go back to 'Copy to Applications folder to install!'-method. Disable .DS_Store for disk image (for now). 345852e Switch to new manual overlay injector on OSX. Natenom a74e859 Changed translations and fixed errors. Thorvald Natvig 5d0e14c Show you muted X messages properly. 40e8431 Maintain stable ServerItem list 2c3f8f8 Only one pingsweep per second a87e113 Filter to show only favorites 2009-09-02 Álvaro Manuel Recio Pérez 37d26c8 Corrected Spanish translation Benjamin Jemlich e7aacbc cache hostname lookups 38a8581 Don't retry already running DNS lookups. QT will never send us any reply if we do. 730e7d0 Restart timers earlier so we don't block pinging other servers while waiting for DNS response Thorvald Natvig d9d7f36 use .value and .insert, and use toLower() for hostnames 2009-09-01 Mikkel Krautz 4ed8d8f Remove superfluous welcome text from the welcome screen of the OSX installer. ca68ce2 Fix installer_macx to properly install IM-based overlay. Allow building both an InputManager and a pure .dylib overlay (for manual injection, for example). 9b3ab4b Working InputManager-based OSX overlay. 63c9e94 Add proper Qt plugin support to OSX dist script. 4315a94 License scripts for OSX. fdb578a Update OSX installer for 11x and prepare for new overlay. Make macx build with pch on by default. ea311ff Boost 1.40.0 for OSX. 80e82e3 Fix MumbleSSL for no-pch. 62cf549 Fix Bonjour build for no-pch. Thorvald Natvig 6e8e547 Auto-unmute on un-deafen 8f0b374 Clean up sorting a73d60c Update includes in RPC so it works under feature-less compiles 2009-08-31 Thorvald Natvig 475c9c5 Fix unregistation of users b534867 Fix color for amplify audiobar c6fdcc5 Remove "Add New..." from context menu, it's a button b16e765 Share pings for multiple entries for same host/port 558f787 Ping randomimzation 8194a21 Make Quit from menu always quit, without asking d9a2d47 Order tray menu according to screen position 2009-08-30 Stefan Hacker cafe559 Fix typo in SAVELOAD for audio/pushclickoff. 076f6fb Customizable sound for PTT Audio Cue. 6742f2b Add Channel position QSpinBox to advanced ACL editor. 4393235 Add group "Add" button to ACL dialog. 7800978 Focus name field in channel add/edit. Hengqing Hu acbb44f Add BOM and s/LANG_SIMPCHINESE/LANG_TRADCHINESE/ Thorvald Natvig 31c8de9 Make Filters a group, and add a "Add New..." button 4b66e47 Filters 46f3f23 Show slightly more pingstats 2009-08-29 Benjamin Jemlich 279ca01 Fix crypto on FreeBSD amd64 Thorvald Natvig 440f16e Default sort by ascending ping 23275df Allow up to 1024 byte UDP packets, to contain up to 6*127bytes audio 8911fdc Update .ini text for pidfile d9cea2c Digest-based shortcut/token storage 2009-08-28 Stefan Hacker 00e8be8 Clean output buffer when skipping frame to avoid crackling. Thorvald Natvig 61391cf Modify whatsThis in overlay to not mention D3D9 specifically c183557 Boost 1.40 on Win32 9ba05ce Add data() fetcher for ServerItem and tooltips e5c38f4 Show single-value ping again, and show max users ed45391 Accumulator-based ping stats 66c0433 Send maxusers in ping 383f394 Send maxbandwidth in ping query 6e2b006 Validate ConnectDialogEdit 093f98f Always include bonjourrecord. 46da19c Add icon for LAN servers 522c27a Grand Unified Connect 2009-08-27 Stefan Hacker 0f5a49d Make virtual server specific bonjour switch work. Mikkel Krautz a2a687d Remove qt.conf reference in scripts.pro. Thorvald Natvig 7fe654a Set default value for bBonjour 3a8c8b3 #ifndef MUMBLE_VERSION for release script f3c3546 Make Glacier2 example actually use the proxy 491108f Glacier2 example 3a941fd Show ping and usercount in public server list b13d7f0 Add iSampleRate for 1.1.x c38e741 Drain UDP socket even when thread is not running, and answer ping requests 2009-08-25 Stefan Hacker baad944 Forward/backward password update in add/edit dialog. Thorvald Natvig f1c4138 Fix DirectSound 32khz mode c663db3 Remove ods() for addref/release, impossible to run real apps with it on 8e0cbc8 Release heuristic cafb24c Include fxo binary in overlay 93b6c57 Proof-of-concept DX10 overlay 2009-08-24 Stefan Hacker 7057604 Actually impose restrictions on users without password. 0dd931c Add password edit capability to Channel edit dialog. Mikkel Krautz 9c620aa Don't try to look-up Avahi packages on the Mac. c2a92d9 Rename 1.1.x plist file to mumble11x.plist. c3a21f8 Do not copy in our own qt.conf for Mac builds. We will move to using the macdeployqt utility for preparing our app bundle instead. 82a4373 Don't pass incompatible parameters to the Darwin linker. 9e9b032 Build fix for g15helper utility. 23aff3c Add InputManager for automatic overlay injection on Mac OS X. Thorvald Natvig ad845f5 Fix typo in debug mode for d3d9ex d2a64ee Start of DXGI Hook 2009-08-23 Stefan Hacker 849aa9c Improve ACL editor layout. 2009-08-22 Stefan Hacker 8b7f1d6 Added checkbox to disable image download bbba5fc Move advanced channel editor switch to options menu. Thorvald Natvig 865cdab Precache support for d3d9ex d7b53b0 History-based jitter buffer initialization, and power-based activity detector. d2b467a Revert "Fix indenting in changelog script" dc658e2 Fix indenting in changelog script 040f16d Make sure audio bandwidth never falls below 8kbit/s 449cc31 Remove a bunch of compiler warnings 2e87ec0 Update config dialog to have minimum 24kbit/s for 10ms mode 10c0e74 Add some hardening source flags, to make sure we can be compiled with them ce7ce45 Work around the ducking in Win7; we always have the device open. 2009-08-21 Thorvald Natvig e4d3485 Add RegisterSelf permission to Ice. c3d2198 Copy, don't ref frame to decode 403c95b Don't use post-1.2rc-only speex functions 1c88786 Use new whisper icons d41afda Move mumble/murmur specific state out of User 950b104 Server-side low-bandwidth mode 9c6b1d0 Re-enable red color for high bandwidth in the AudioConfigDialog, and allow 8kbit/s transmissions. a4579d2 Fix typo when reducing bandwidth. 6479de3 Low bandwidth mode 2009-08-20 Martin Skilnand 0fd52da Parameter change in inkscape to prevent bugging in QT... Stefan Hacker 55179d9 Make build environment more flexible Thorvald Natvig 4ff3993 Get rid of some compiler warnings on Win32 2009-08-19 Martin Skilnand b5ba5db Fixed artifacts in talk icons add5e12 Fixed metadata for mumble.svg, and added talking_whisper.svg. Thorvald Natvig 6707c8d Support 10, 20, 40 and 60ms audio packets f8ba374 Make the bandwidth limit on the server be in bit/s instead of byte/s eb668a1 Add placeholder icons 9653d4e Disallow image links in comments 7a7a9b2 Use blank image instead of "missing link" for invalid image URLs a40cf25 Switch last few icons to temporary svgs, and change formatting of whatsthis messages. e62f502 Update checkstate for Mute if suppressed 1a7f024 Honor requested audio bandwidth slightly better, and lower minimum allowed 2009-08-18 Martin Skilnand c696a8f Next test of in UI icons. Hengqing Hu 2fd9a62 Traditional Chinese translation for Mumble 1.1.8 included Thorvald Natvig cce8c3f Don't display tooltip/whatsthis for abnormally large comments/descriptions cf17684 Update testauth script to use new index-based userinfo map 028cf24 Use group-GUUID based volume history for other applications 8377f00 Don't include test things in the changelog ed384bf More volume testing 07b5a12 Check session states on Vista. a5a2c66 Don't explicitly state WinSDK path, it will be pulled in by vcvars. And replace DXSDK with a env var. 40d4998 Unified Win7/Vista volume control. I hope. 847ed7a Make NO_UPDATE_CHECK hide options completely b27f0d4 On X11, you can minimize the parent window while a modal dialog is shown, without reactivating the parent's event loop 0978bc7 Protobuf 2.2.0 for Win32 4683c46 Fix ALSA periods for raw HW 2544297 Volatile the iMixerFreq 99cd9d4 Add a dummy thread for pulseinput/output, so we don't delete it during start() 02ec1f0 Switch weak to unique-checking for 11x too 7da8e1b Fix abort on quit with Pulse due to wrong thread deleting a dummy object. 95a9af7 Use group-GUUID based volume history for other applications 4848a2d Don't include test things in the changelog 29cc812 More volume testing 2009-08-17 Thorvald Natvig b17f3b2 Check session states on Vista. a11c188 Don't explicitly state WinSDK path, it will be pulled in by vcvars. And replace DXSDK with a env var. b6208a7 Unified Win7/Vista volume control. I hope. 1077335 Make NO_UPDATE_CHECK hide options completely 7e7b3f3 On X11, you can minimize the parent window while a modal dialog is shown, without reactivating the parent's event loop 4923f42 Protobuf 2.2.0 for Win32 e4935a8 Fix ALSA periods for raw HW 2009-08-16 Martin Skilnand 2acd26f Removed yellow circle from icons/mumble.svg 95dc226 Fixed bugged icons/mumble.svg, verified. Álvaro Manuel Recio Pérez b0aaa8e Fixed installer' Spanish translation 59b741f Updated installer' Spanish translation Thorvald Natvig 4f9e599 Volatile the iMixerFreq 5688781 Add a dummy thread for pulseinput/output, so we don't delete it during start() 8361a1c Switch weak to unique-checking for 11x too a71e118 Fix abort on quit with Pulse due to wrong thread deleting a dummy object. 45fad10 Threaded pulseaudio 12f9c69 Locking test 20eadb6 Make pulseaudio play nice again bcf77b7 Make ALSA work under Pulse on karmic. c70caee Don't double-delete (G15 unix) 2009-08-15 Martin Skilnand 9958cfe Attempt to fix corrupt icons/mumble.svg Thorvald Natvig 304f12c #ifdef protobuf 2.1 features afa6f35 Get rid of global memory from ConfigRegistrars ce3df76 Use enum for InfoMap bcaa6c7 Use VLD for debug builds c63e4f5 Use the new SVG icons f62ae27 Make hardcoded ACL default be without selfregister, and make it a part of initial ACLs added to new servers 2009-08-14 Martin Skilnand edf3369 New attempt of icons for 1.2.0 release. Eli Tallman 4884458 Cod5 update for 1.5 a1767db TF2, DODS updates Thorvald Natvig 3a686bd Fix ASIO config save 2009-08-11 Mikkel Krautz df9b900 Use system CA certificates on OS X. 2009-08-08 Patrick Matthäi c957ff4 Spelling fix in ACLEditor Thorvald Natvig 88dcb4c Don't show lip icon if suppressed c7cffde Build protobuf earlier, so header is generated 2009-08-07 Mikkel Krautz 203a125 Allow *.pkcs12 file extension for certificate import and export. Thorvald Natvig 5b3c901 Allow specifying SYSTEM_CA_BUNDLE define to force CA path 6296282 Share a bit more of .pro files, and add win32 ca store 8159eec Add system-installed CAs b8dc011 GPG sign and upload source snapshots 7294099 Allow expired/not-yet-valid certificates as non-strong certs d9a5206 Add cert-send/pw-store suppress option (nonsaved) 2009-08-06 Thorvald Natvig cab2850 Always require password for SuperUser 379f88b Clientside selfregister 7a84624 Serverside SelfRegister 91c230f Remove warnings when cleaning indexes 0b107aa Clean out MySQL indexes and foreign keys on upgrade, and remove multithreaded logging 2009-08-05 Eli Tallman 06d48b9 L4D, Gmod updates; DODS version bump ae26954 TF2 build 3897 Thorvald Natvig a391d01 Add Message.h to tarball for 11x e4eabb5 Dummy manpage for mumble11x 91c5176 Nmake can't handle self-dependencies, so give up and provide a shell script for the symlinks 585b0dd Symlinks and ugly copy hacks. I want gitsymlink on win32. e3261db Mumble11x in source tree 36e2059 Mark email field in crashreporter as optional, so users aren't compelled to put bogus addresses there 1f52513 Update installation strings to default english ones 2009-08-04 Thorvald Natvig d20e27e Include celt in tarball 52c42bd Mystery contexts 2009-08-03 Stefan Hacker 8835385 Tooltips and What's this for Add/Edit dialog. Saveload advanced cfg checkbox. Prevent root channel name change. b78c706 Fix channel description loading. 2bfb54c Display client version in tray tooltip af08aee Do lookups with Channel::get() Benjamin Jemlich 018d5a1 Fix crash while trying to rename the root channel Thorvald Natvig 0cb7485 uniquie => unique bbd9bfd Clickable comment icons e6b623e Remove tempchannels on disconnect too 2009-08-02 Stefan Hacker df86a73 Channel Add/Edit dialog. Thorvald Natvig d559445 Send uid=-1 to all clients when unregistering connected user a651dce Various jitter fixes, and audio fade 237b9e2 Update position-stripping in server to mach updated voice packets 2009-08-01 Alex Maclean b08972a We use boost even without Ice now Benjamin Jemlich 7c27178 Fix column sizes in shortcut dialog Thorvald Natvig ccbd3d7 Slightly less blunt obscurity report d10cdb8 Remove some debug noise from plugin download 4fe8ea8 Update benchmark 7b983c1 Widen the shortcuts again. *Sigh* 413dc8c Time-distribute plugin link attempts 91b94d7 Reduce shortcut columns even further 5b644a6 Obscure security dd0320f Ensure cConnection is deleted from serverhandler thread, as Qt throws a fit if the deleted() signal is emitted from another thread. 8016d1d Allow shortcut columns to scale slightly better edf7d48 Support not sending any os/build info to the client 8abceec Use CELT 0.6.1 for now 835dfec s/dbServerUsername/dbUsername/ 2009-07-31 Mikkel Krautz e923c0d Add CrashReporter. Generate minidumps on Win32 and report them via CrashReporter. Thorvald Natvig ffaca57 If no cert, return an empty list, not a list with a null cert 1238f2b Binary != Boolean 01cf723 Allow to add email/comment on crash a2812c4 Compile without bonjour 16a44d9 Use basepath in minidumpwrite, and add some comments and a progress bar 7530b91 Global qdBasePath 2009-07-30 Thorvald Natvig b30efc5 Explicitly remove output buffers when clients disconnect 8cec38e Updated release scripts for new files and paths b5b94c0 http://support.microsoft.com/kb/971092 6991334 Replace XEViE with XInput 2009-07-29 Thorvald Natvig 1141eee Autoexpand usermodel on hover, and use QStyledItemDelegate 2009-07-28 Thorvald Natvig 113a294 Fix a few compiler warnings 2009-07-27 Thorvald Natvig d0690b8 Use local copy of manifest/cat for vc90.crt f2c804a Disable LTCG also for new Intel versions 2009-07-26 Thorvald Natvig 2082b4b Compile with Intel C++ 11.1 2009-07-25 Stefan Hacker 65a0f65 Make the fix actually work. 144c631 Fix argument injection. 2009-07-24 Thorvald Natvig 5893adc With the data column, there's now 4 columns for the shortcut editor 9e25322 Use new QColorDialog::getColor for alpha-editing for overlay colors e2ebe02 Raw Message => Disable formatting 2009-07-23 Stefan Hacker d3c9806 Channel sorting. Mikkel Krautz f67a93a Add CELT and Speex fatal error handling for Mac OS X. 2009-07-22 Mikkel Krautz 4eac398 Memory management fixes for ConfigDialogDelegate. 2009-07-21 Mikkel Krautz 2b96f33 Native-feeling ConfigDialog for Mac OS X. 1ef334b Disable GlobalShortcutMac for debug builds. Thorvald Natvig 057df90 Default-ACL for @all shows default deny as well as default allow fe47903 Show suppress state in client 2009-07-20 Thorvald Natvig f1ec2d8 Use translated section strings d095fd9 Allow SuperUser to move self 2009-07-19 Stefan Hacker d552f0b Fix comment save Thorvald Natvig 9510ab8 Always initialize qtTimeout 5a41af1 Don't bind to IPv6 if no interfaces has a v6 address 2009-07-18 Stefan Hacker 0e1b3f3 Improve forced shutdown behavior Thorvald Natvig 947a420 Certhash-based ACL, and creators have full write on created channels 2009-07-17 Stefan Hacker a89e7c6 Added layout default value cc57d13 Layout presets fb8ca85 Removed wrong tooltip b236e4c Allow cancel while bj resolving Thorvald Natvig f1c926e Quiet the Avahi warnings for now, and make the static murmur compile with bonjour Bartek "stranded" Sumowski 95fd031 Bonjour installer strings in Polish 2009-07-16 Stefan Hacker aa82976 Update German installer translation Hengqing Hu 9555bf6 Simplified Chinese Installer Matthias Vogelgesang b3fa0e5 * fix german translation Thorvald Natvig 43ac694 Bonjour download in installer 477a065 Grey out LAN tab with suitable tooltip if empty 45705e2 Re-add variable buffer to WASAPI; hardware-reported minimums are often false 2009-07-15 Stefan Hacker a89c5e2 Switch bonjour identifier to _mumble._tcp ca0f1c8 Fixed cancel button and added resolver delay workaround. b94dd05 Update INSTALL and LICENSE file 12e0e80 Reorder murmur tray menu 6582af7 Bonjour support. Mikkel Krautz 6270d5d Don't use Avahi compatibility layer on Mac OS X. 5cc3d0d Update Mac OS X build environment. Thorvald Natvig 69ebadc No, really don't replace CRLF in the signed manifest, please 34b5e28 Preserve CRLF in signed manifest 9f2b29d Final CRT 31106d3 More AssemblyCRT 1a38dd4 Build bonjour on nix 19fde80 AssemblyCRT again 1062965 Send channelRemove after userState for temp channel removal b11d633 Clientside tempchannels 8562704 CRT Assemblies efbba85 Temprary channels protocol changes 2009-07-14 Thorvald Natvig 1ba33d0 Update installer for new v1.1.x plugins, and fix start menu on undelete 2009-07-13 Thorvald Natvig 34eea53 The Norwegian translation isn't in English 892cf9f Plugins in the plugin directory 416cfb8 Distribute Qt plugins 3e281c1 Update WhatsThis for new # groups 6b5b174 Send access tokens on authenticate e2875f5 Access Token Editor 9c5ecca Use QStringList for tokens 37076e3 Token-based ACL 866a66d ifdef out module-specific parts of shared code 2009-07-12 Thorvald Natvig 85c9c78 Fix Ice callbacks and examples 5ccce13 Fix bandwidth() 2009-07-11 Stefan Hacker 3861102 Updated German installer Thorvald Natvig b45eac1 Revert murmur static to Qt 4.5.1; 4.5.2 crashes 96fe83c Link QtSvg. I really mean it. 8483892 Explicitly link svg Bartek "stranded" Sumowski 0afb4c7 Updated Polish installer 2009-07-10 Thorvald Natvig 55233df 1.1.x doesn't have BF2142 plugin cc4263d Update Norwegian installer ba4c405 Add 11x plugins to installer 2009-07-09 Thorvald Natvig 4391a12 Use UTF-8 ini files, and support importing partial configs 2009-07-08 Thorvald Natvig 0f3d2dc Installer link for compatible client 2009-07-06 Eli Tallman ecef2b6 AOC offsets update Thorvald Natvig 1d23889 Store server-specific whisper in a per-server config 2009-07-04 Eli Tallman 606bff7 CSS, AOC updates Thorvald Natvig 29c26d6 Don't focus on URL open 2c74fa1 Qt 4.5.2 for murmur static 6738419 Make HostAddress a movable type for faster containers 1c6ac0c Update ASIO driver to use new format 2009-07-03 Thorvald Natvig 44439c6 Rediscover DInput devices on hotplug 37886d4 Don't show dragbar over scroll buttons 2009-07-02 Thorvald Natvig 801a9e9 Add the QtSvg4 library to the installer. Kind of necesarry to actually show those SVGs. 2009-07-01 Thorvald Natvig c06ca3e Updated Intel compiler on Win32 2009-06-30 Thorvald Natvig 4703fa7 Single-slider VAD for the wizard f99300b Don't compare bool to 0 5e539d8 Qt 4.5.2 for Win32 2009-06-29 Eli Tallman 10f4572 Source game updates Thorvald Natvig 59dff3c Use git:// instead of http:// for xiph submodules 3fe520c Update echo jitter buffer 2009-06-22 Thorvald Natvig 44dfffa Notify on connection attempt start 4ec866a Remove silly debug output a83592e Multibind for Win32 3976433 Multibind for nix 9b226ca Clientside IPv6 support c1c460b Allow IPv6 control connections 2009-06-21 Thorvald Natvig 3c8745f Add proper names instead of label_123 in .ui files 2009-06-19 Thorvald Natvig 6f9c7d6 Use QDesktopServices for datalocations 2009-06-18 Thorvald Natvig 5074ef0 Option to only accept whispers from friends 2009-06-09 Thorvald Natvig 0b9c19b s/RGBA/BGRA/ d1689db Make the default be 48kbit/s rather than 16 kbit/s 2009-06-08 Thorvald Natvig 5248ca4 Avoid cert warning when falling back to .ini cert 26e4f3a Remove player from ACLs / Groups when unregistered 2635598 Re-disable DirectSound on Vista fb96eed VBR for CELT, and auto-readjust based on server quality levels 19e91f5 Replace AudioSine with samples 709289f Make centerpos be a whisper option 2009-06-05 Christoph Hofmann 733ee3d Make compile on Qt from Lenny Thorvald Natvig 2191991 Remove a few FIXMEs c5874e1 Remove redundant flag from Group 6b9ab90 Glue code for the experimental zero-latency preprocessing (not merged yet) 2009-06-02 Thorvald Natvig e6c9d33 Use new svg icons 2009-06-01 Martin Skilnand e2e75ae fixed metadata. still need to find way to include bsd license information. Added test of talking_on.svg for review. Thorvald Natvig 75262e9 Fix typo of QsslKey 2009-05-31 Martin Skilnand 68deaf3 Second batch of test icons in .svg for review. Thorvald Natvig 90e189a Fall back to .ini cert if one is specified, currently using selfgenerated, and bind address matches 8bdc1a2 Use new svg icon for linked channels 26b3449 SoundFile class which wraps QFile to allow resource-based samples ce76715 .ui based AudioWizard 2009-05-30 Martin Skilnand 4d5b94e First test of svg icon. Thorvald Natvig 29df24c Speech sample in Ogg/Vorbis 2009-05-29 Thorvald Natvig 71853df Force database to .ini path in roaming mode and fix a banlist crashbug 2009-05-28 Thorvald Natvig 07a1e49 Store textures for registered users. 0c67135 Change texture from client 2738bb6 Add libsndfile to installer 0c66fe4 Protobuf 2.1.0 for Win32 b9b5cd5 s/AltSpeak/Whisper/ 47fe8d2 Whisper ac75cef Skeleton for server-side voicetarget 10a359d VoiceTarget clientside 2009-05-27 Thorvald Natvig fa5d4e5 Workaround for focus bug in itemdelegate editors with dialogs e3efc68 Forgot group name for whisper 2009992 Shortcut Editor for Whisper 2009-05-26 Thorvald Natvig 2dab6a2 ShortcutTargetDialog (WIP) f7f7da7 Make shortcuts mute/deafen take parameter 2009-05-25 Thorvald Natvig b43f237 Shortcut target editor (WIP) 2009-05-23 Stefan Hacker 6cfb223 Fixed script for newer cherrypy versions 2009-05-22 Thorvald Natvig 6d82782 Add workaround for MSVC for __int64_t 39e2f5a Allow adding CA chain to cert files 2009-05-21 Stefan Hacker e5cdd85 Remove libogg 177a58c Optimized mixer code. 6c5b9e6 Use libsndfile for audio file processing. Thorvald Natvig ae02f97 Add sndfile pkgconfig for *nix, switch to utf8 const char * paths, and fix a leftover compilebug in Plugins 2009-05-19 Stefan Hacker 1c1cb64 Reorder tray actions 2009-05-17 Thorvald Natvig e3a122c Allow empty messages 3b0c702 Clientside useredit 73131d2 Server-side unregister 2009-05-16 Thorvald Natvig f1859f2 Automatically download updated plugins 2009-05-15 Thorvald Natvig 8750f00 Validate bans before adding to the list a98d45a Faster quint64 based netaddress handling 9f7ef74 Updated Ban Editor 2009-05-13 Thorvald Natvig 03ef639 Fix SQL for udp database 2009-05-12 Thorvald Natvig 9df364f Automatically switch to TCP mode. a826a9e Only count voice packets as "switch to UDP" signal withgod a30fc85 weblist.pl modified 2009-05-08 Eli Tallman 8415c87 L4d, TF2 build update 2009-05-07 Thorvald Natvig f56fca0 Submodule update 23389b3 Remove password from ConnectDialog gui 226402f Flags in public server list dc41e53 CRLF 8634a9c Avoid vacuum in initialization 2009-05-06 Thorvald Natvig 39ec136 Flags 2009-05-05 Thorvald Natvig e3cc00c Store date, duration, username, reason and hash with bans 53a9b08 Recreate SQL when upgrading 2009-05-04 Mikkel Krautz dc6e8d1 Fix blank email corner-case. Abort in-progress host lookups on email change. Show proper error on invalid email. 92e9ef6 Show '(none)' for email-less certificates in CertView. 67ed2b0 Delayed email validation in CertWizard. Thorvald Natvig 4194703 Avoid encoding empty packet at end-of-speech 534753f Optimize audio framing, and preserve flags c6b204c Add missing disable_copy() 3cc160b Trim whitespace from ConnectDialog input 2009-05-03 Stefan Hacker bf8ccda Replace speex event sound support with celt support. Álvaro Manuel Recio Pérez 3c9ea0e Updated Spanish translation Thorvald Natvig 4a7251b s/SuperServerUser/SuperUser/ a067f2e Support enabling noise a65ebd0 Cleanup speexbuild.pro file df6c8ed Move DX Input initialization to one thread 803781d Remove libspeex, as we only use libspeexdsp 32d16cd Fix PulseAudio 9b21329 Rescale .spx to float 5de517f Link channels over Ice 2009-05-02 Mikkel Krautz d3915cb Fix certificate genration on OpenSSL 0.9.7. 21da51d Fix PCH for Protobuf on OSX. Apple's headers really pollute the preprocssor with all sorts of junk. Thorvald Natvig 51120fe s/Player/User/ 2009-05-01 Stefan Hacker e3b0a63 Remove restriction to root channel. Thorvald Natvig 7dcfa00 Valgrind run 5049bea Mention that we really prefer SQLite in the .ini files ade79f8 description is also an info-value 42b53e4 `fieldname` for SQL fabb1ef email is now an info-value, not a db field d8f5d4b Persistent BFF b0632cf Add combobox for usernames in ACLEditor, and fix a few bugs d110fef Send proper case for name on QueryUsers 2009-04-30 Stefan Hacker 53d2343 Fix crash on SuperUser connect 1ccf22e Fix chatbars session detection Eli Tallman 4a560b6 Dys, gmod, tf2 build updates Hengqing Hu faa55b0 Chinese translation for Mumble 1.1.8 update Thorvald Natvig 5c0730e Distribute hash with the UserState, to allow players to recognize friends 317cfe5 Add Q_OBJECT for CertView 8ab8c51 Remove character LCDs, which we never had an implementation for 38ad1a0 Remove a few fixed FIXME 0764034 Use ACLGroup for ACLEditor instead of base Group 58f15cb Convert last deny messages to identifiers a787cb1 Fix a few more compiler warnings 936ef86 Remove a lot of compiler warnings 4760546 Add script to convert ts files to HTML for proofreading 389175d Fix a few HTML errors 55513e7 The big spelling fix 2009-04-29 Eli Tallman 6c760f0 Need avatar_ for top 5c4d8c5 Add back dummy top vector to Quake based games Mikkel Krautz b564f33 Add cancel button for Certificate Wizard on OSX. 3cf945a We may now resize QWizards on OSX again, so enable that for the OSX AudioWizard again. 66bbbd0 Fix Cert.cpp for OpenSSL >=0.9.8. ae3ee8a Fix constness issues with OpenSSL versions prior to 0.9.8. (Allows us to build against vendor-provided OpenSSL libraries on OSX) Thorvald Natvig a88d62b de-doctype b015fc7 Build static releases with Qt 4.5.1 ec40b7b Fix a few warnings in the ACLEditor cff157f Add tooltips and whatsthis to cert dialog, and add some icons c35c6e8 Update changelog script to fix silly email mistakes 702fe90 Write permission on root is good enough for registrations 962a2d4 Server-side support for in-client registration 98eb6a5 Fix error messages from celt/speex build files 0efd1dc Clientside user registration, and hide ban/kick if not allowed to use d3f6874 Use session instead of actor for permissiondenied efe0420 Update ACL Editor for new permissions 7925e61 Support flag sets for permission d6b878a Expand ACL permissions serverside 53e9b9d Print strong cert identities in log 56c139c Show current certificate (if any) on welcomepage of certwizard e7606f6 Rename qt translations to match 4.5.1 906cd1a Always reset certs if the user returns to the start of the cert dialog 2009-04-28 Mikkel Krautz 1ffbd81 Remove cdecl delcarations from g15helper_macx. 91a9f16 Add (untested) G15 LCD support for Mac OS X. Thorvald Natvig 6015d4a Fix double :: :: in Server 0e54cfa Use SHA1 instead of MD5 for selfsigned certs b76ad9e Certificate based authentication and account recovery 3727bf9 Use native dialogs 2009-04-27 Thorvald Natvig 34a4b1f Use Qt 4.5.1 6ecfa23 Check IDs on client (get those A icons back) 9f37777 Finish Cert Wizard 380205c Accept certificates c12d03c Start of Certificate Wizard 3f61167 Multichannel echo cancellation f916473 Avoid constref initializers of std::wstring inside const structs 2009-04-25 Thorvald Natvig f32c878 Intel C++ 11.0.074 for releases, and fix a bug with linked speaking 2009-04-24 Eli Tallman f594ce8 Plugins update for 1.2 PA; Cod5 and L4D patch update Thorvald Natvig 103df83 Measure idle time and export over Ice 3e4c38a Export client address and TCP state over Ice 031bf2b Export channel description over Ice 2009-04-23 Thorvald Natvig 139d4e0 Ice comment support b038dac Store infopairs in DB 4a83072 Clientside comment support 13dc3d6 Serverside comment support 2009-04-22 Stefan Hacker 922d9e8 Warn of incompatibilities among 1.2 snapshots Thorvald Natvig 128a669 SQL Schema is version 4, not 3 6a4fa30 info-based storage for registration 2009-04-21 Stefan Hacker 151240e Prevent deletion of root channel via Ice. 2009-04-20 Eli Tallman 25bdfb0 Source plugins update for 1.2 PA Thorvald Natvig 8a716dc Always use shortname as part of context e59ca71 Zero-terminate context, so it can be used as a string 1a36b56 Handle positional audio distribution server-side 820194a Export identity/context over Ice 6ec2d36 Store context 2009-04-18 Thorvald Natvig 4ef52e9 Send plugin context/identity to server 965a354 Check magic signature on plugins 5e79b06 Link 1.2.0 for nix 82c7cdc Link 1.2.0 for Win32 2009-04-16 Stefan Hacker 67f0459 Add resolution restriction to images. e89759a Added size restriction for image download. 39a3b77 Disable 1.2 incompatible plugins until they get updated. a9a5574 Add auto formating capability to chatbar. Hengqing Hu 686df2c Chinese Translation in UTF-8 coding for Mumble 1.1.8 He Tal 9243dbd to support Chinese languages need a patch Thorvald Natvig 0fff088 Allow reject message to be sent before we close the socket 7c6ec3e Add tooltip and whatsthis for chedk updates on startup 0f18efb Add .it to project files cb45da6 Add zh_CN to project files 027bc04 Have the client actually send the os info. Oops. 86d61cb OS info in version exchange f67b83e Add version info to mumble c760d4d Have murmur accept and send version packets Spaccaossi d48588a italian translation - finished for 1.1.8 2009-04-12 Stefan Hacker 75868a3 Added Chatbar dock widget to MainWindow 2009-04-11 Stefan Hacker 7a6b6ae Fix crash on player left 2009-04-09 Mikkel Krautz f195dc7 Remove setgid hack from overlay OSX injector. We're now properly signed, and can access the task_for_pid() API without being part of the procmod group. b810504 OSX codesign fix. eef5e81 Initial codesigning changes to osxdist.py 2009-04-07 Thorvald Natvig b597f4c Have setPlayerState only emit messages when something actually changed 2009-04-02 Mikkel Krautz 09a775a Rename some framework extensions for OSX overlay. 89886d9 Make 1.2 branch build on OSX. 2009-04-01 Thorvald Natvig 122a104 Make mumble use new plugin type 3ebfe2b Have plugins use std::basic_string, and use l4d as example 14d59e1 Make context and id length signed, so we can return -1 65aef28 Update plugin header 6b04d81 Add fixme for audiowizard path length ab2ee8d Fix loopback 2009-03-31 Thorvald Natvig c95557c CELT as audiocodec 2009-03-30 Thorvald Natvig 0a0ab34 CELT for Win32 8421f29 CELT build ffe7929 Add CELT submodule 2009-03-29 haru_arc 1399c24 Updated Japanese Translation Álvaro Manuel Recio Pérez fbf395c Updated Spanish translation Thorvald Natvig a33b3d1 Make ConnectDialog use QNetwork stuff and use a new URL for 1.2.x a4b1b1b Fix custom textures 3a6e2ae Murmur prints version info in log on startup 94aaf63 Fix crash with playercontext and context action 2009-03-28 Thorvald Natvig 34c0788 Fix treemessage cdfd8b7 Fix QueryUsers c18b1a2 Fix ACL Editor 5ec7a58 ProtoBuf for Ice/DBus c971091 Add experimental warning to installer 9f56cbf Use generated sendX handlers 64cdec6 Use Player to precache textures 95bf2c8 Textures aren't optional c2efc69 Use cache for textures 1803b93 Use MUMBLE_MH_ALL for headers b388ef0 Have UserQuery automatically follow ACL 47485ed Move accumulator to ServerHandler, avoid having murmur depend on boost::accumulators 715239c Accumulator based pingstats 52d386d Pass User instead of Connection to murmur message handlers 54466d5 Message references instead of pointers, and make UDPTunnel work 2009-03-27 Thorvald Natvig 561b7f2 Make preprocessing tokens gcc compatible ef1ea0c UDP Voice data works c0da46e Working TCP communication 68d3159 Update build instructions 2009-03-26 Eli Tallman e36f901 Gmod addresses update efe2334 Updated L4D for Build 3790 35d6fd2 crlf Thorvald Natvig 1718cde Make Mumble compile with protobuf. 2009-03-23 Eli Tallman b7a974d Added BF2142 plugin Thorvald Natvig 2fd181a Make ProtoBuf work on Win32 b377df8 Allow Tray to compile without DBus/Ice 3a05740 Fix TextMessage when AlwaysOnTop feca72d Revert "Make init script stop complaining", because it really should complain. 4518e1a Make init script stop complaining d4d7f36 Allow changing SuperUser email b831cfc Bump version to 1.2.0 1e9c437 Merge branch 'v1.1.x' 40884a3 Allow no-dbus to work for mumble 0f46c9e Update gitignore 481760c ProtoBuf for murmur (no DBus/Ice yet) a295819 Extended protobuf testing 14616d7 Add protobuf compiler 2009-03-22 Mikkel Krautz fc80d64 Add addban.php script to osxdist. 5fcee7b Copy qt.conf into AppBundle via qmake instead of dist script. 629fabc Be more explicit in postflight script. fbd9fa2 Remove dead code from OSX overlay contextmenu. 5b42a49 Handle symlinks properly in osxdist.py. Thorvald Natvig dff9e3a Make the logrotate fail gracefully if murmur isn't running e710a84 Update indent script 46e1e60 Update release script to work without a make a0d5920 Add mumble_plugin.h to distribution 2009-03-21 Mikkel Krautz e17401d Require a logout for OSX installer. 15e4cb7 Apparently, only hooking CGLFlushDrawable is just fine. This didn't seem to work first time I checked. :( 4ebaedd Reduce OSX overlay logspam. 2b81e4a Make contextmenu call `mumble-overlay' to launch apps. ae2ffcf Add 'mumble-overlay' app-launcher to OSX overlay. 0d3dd3b Add contextmenu.h to HEADERS. 276938f Add an overlay context menu for Mac OS X. Allows for launching apps with the overlay enabled by right clicking on them. Thorvald Natvig 5edfee0 Fix a few more odd writing cases for authors e0fe5c7 Update changelog script to credit SVN authors properly 4eb6d7d New changelog script 3732dce Fix WASAPI device selection Bartek "stranded" Sumowski b79e2a2 Polish translation quick fix 2009-03-20 Stefan Hacker 5e460af Fix crash of config dialog when always on top is set Jan Klass 0d45cd8 minor German translation update (double spaces) Mikkel Krautz ba56432 Update to the MIT licensed version of mach_star. Álvaro Manuel Recio Pérez f48f816 Updated Spanish translation for 1.1.8 Thorvald Natvig 0bd7c1c Workaround for alwaysontop bug 17537bd Fix broken output from lupdated, and remove empty 'tr' translation b4d4b86 Update source strings. b246faa Fix capitalization. 9a49e4f Revert "Fix crash of config dialog when always on top is set" Bartek "stranded" Sumowski 0f54d3c Polish translation - completed for 1.1.8 2009-03-19 Stefan Hacker 845f2d3 Always allow SuperUser in mumble-auth.py + style update Thorvald Natvig 27b7e15 Example of how to use structs from PHP 027ae42 Start of new protocol 2009-03-18 Matthias Vogelgesang 68ba119 German translation for latest changes Thorvald Natvig 5cb0d27 Update for new intel compiler 2009-03-17 Thorvald Natvig 15052fb Qt 4.5.0 has fixed signal emitting when deleting sockets, remove workaround 2009-03-16 Eli Tallman 50b3f50 L4D build number update 97098ab Fixed typo in installer for DODS plugin Thorvald Natvig b2029dd Fix lousy UTF8 handling in most browsers 2009-03-15 Thorvald Natvig ab0089c Fix input/output switch in tooltip and whatsthis in config gui 3cd95b5 Fix punctuation in ACL editor 6ff4b14 Fix typo bf867ed Fix message type of join/leave channel 2009-03-14 Jan Klass 4ca05b9 updated German translation Mikkel Krautz 5cc524f Fix osxdist.py optparser. Thorvald Natvig 5a7f04a Avoid locking mutex unless plugin has lock b35fdce Avoid setting duration on WASAPI f2e4aff Fix duplicate string 3a85112 Language file resync ae2d336c Switch to boost 1.38 for Win32 2009-03-13 Mikkel Krautz cc9e795 Fix various typos in osxdist.py. eb5fc92 Use plain messages for Growl. It doesn't do HTML. a977546 Remove old osxdist.sh script. 8b72150 Update Mac OS X dist script. ae1ba55 More OSX header fixes. 37c854f Don't try to detect Growl via AppleScript. It doesn't work. dbb0eb2 Fix header mess on Mac OS X. Thorvald Natvig a66cf2d Add speex as submodule 2009-03-12 Stefan Hacker 5202447 Detailed WhatIs strings for Log config Eli Tallman 4f35872 Updated Gmod plugin, added better spawn state Matthias Vogelgesang 143589b Apply patch from mumble-tower Mikkel Krautz ac83eb0 Add qt.conf to the source-tree. 390e291 Use qt.conf in app bundle to set Qt plugin path. Remove dirty hack from main.cpp. bbb4f92 Fix osxdist script. Thorvald Natvig c865f2f Update OpenGL overlay to recheck hook d7e070b Fix description message so it comes after the welcome message 1e324f2 Add a few periods to whatsthis 0558722 Update a few english strings 2009-03-11 Mikkel Krautz 0fddab0 Add additional Murmur scripts to OSX .dmg. Launch mkini.sh in osxdist.py. 3c38350 Update OSX installer with new license information. ae8bcbd New overlay paths for OSX injector. Load proper bundle when asked for it. 83c363a Add LGPLv2.1 license (new for Qt 4.5). Update Speex license. Add PortAudio license. ab63d65 Make GlobalShortuctMac build with 10.4 SDK once again. 95de017 Fix up permissions in OSX installer. 2009-03-10 Stefan Hacker e7dd7ed Updated strings for log configuration Eli Tallman 844af75 Added Dystopia plugin 8034ec1 Fixed v,h addresses 8c91027 Update for 1.3 patch c9ea6a0 Added Dystopia plugin 2009-03-09 Stefan Hacker 383e025 Removed secondary option for eventsound configuration b6a6e31 Correct invalid if in eventsound fallback code c92a410 TTS fallback and filecheck for eventsound Jan Klass cb67fc1 updated murmur.ini documentation Thorvald Natvig 080c586 Create .ini files based on template 2009-03-08 Thorvald Natvig 266a2b8 setSuperuserPasssword => setSuperuserPassword 2009-03-07 Eli Tallman ac6a5d4 DOD PA lacked sourcefiles 8be4101 Day of Defeat Source PA plugin 633a403 TF2 build 3771 update Jan Klass 665edfe German translation: 'Main Window' updated Thus German translation was checked throughout now 507e799 updated english translation some smaller flaws (typos, missing ., grammar) and made some things clearer Matthias Vogelgesang cf7cfb8 Apply patch from mumble-tower 455ebe9 Changed one awkward translation. bb2406e apply patches provided by kissaki Mikkel Krautz 1c95ce9 Use weak binding to determine whether to use Leopard-specific key-to-name translations in GlobalShortcutMac. Thorvald Natvig 9ced3f7 Fix comment parameters for Channel::add d26bb4c Add about to tray context menu 34fad98 Use consistent naming of channel actions 2009-03-06 Stefan Hacker c370c9f Some fixes in eventsound d9e6ff2 Merge branch 'eventsound' 1d677c4 Implemented the GUI part of the static sound for event feature Mikkel Krautz 03fc6ba Growl notification support. Thorvald Natvig a90db97 Support HTML editing for channel descriptions 6901c4c Final merge and CIA test 88fdb0c Merge test da96d6b Update path for ruby 2e778f6 Indent e880109 Resize minimum size of shortcut config 4d60fbd Remove HTML for trayicon balloon. c4ff017 Add function to check sample validity. 2009-03-05 Mikkel Krautz c048a02 Add 'proper' Mac OS X installer. 2009-03-04 Mikkel Krautz ae0c8b5 We don't want the OSX overlay to live inside the app-bundle. fe8c40a Make the OSX overlay injector live outside the Mumble app-bundle. 6d6c67d Fix Murmur build in OSX/Darwin. Thorvald Natvig ac0b3cf Indenting a2765a6 CRLF merge 1561941 Add mute/deafen to icon context menu 467cd16 Update release script 2009-03-03 Stefan Hacker 792ca1f Merge branch 'sourceplugs' f199f0b Add new PA plugins to the installer 64914f4 Backend support for playing sound files on events. 76e6416 Save/Load for soundfile paths Eli Tallman b58cea3 INSURGENCY: Modern Infantry Combat Positional Audio 5fe671b Garry's Mod Positional Audio d9ecf7d Age of Chivalry Positional Audio 8f1f066 Half-Life 2 Deathmatch Positional Audio 3c9cfae Counterstrike Source Positional Audio 1b3c71b TF2 PA fix Thorvald Natvig df69aef Update static murmur for Qt 4.5.0 and lzma compression f2232a5 Use realtime threads on Linux, as posix threads aren't prioritized under SCHED_OTHER 2009-03-02 Thorvald Natvig 71957d8 Fix typo for channel description f71a815 Support extended keys 2009-03-01 arrai aee1e23 Don't idlemute after self muted nomad 7bd80f8 Adding channel descriptions Matthias Vogelgesang 5929962 correct installer translation fb41b75 Standardgeraet Thorvald Natvig 1f8364b Avoid spamming log on description change 6ef0a0c Indent d8f994c Update documenation for Server.getLog f2022a0 Use non-cached Ice connections ab2d992 Support clearing texture over Ice/DBus, and remove qcompress() header from getTexture on Ice 9bb37b9 Add .gitignore for win32 bbeda39 Add .gitignore files b207e3d A few testcases for collections and hashes a41c00b Fix typo 2009-02-28 kissaki 608a90c Patch #2625917: really simple PHP + ICE registration script Thorvald Natvig 5db28fa Even with dropped capabilities, running murmurd as root is not a good idea, so always warn the user 796afe0 Avoid messing with ulimits in murmurd, and first part of updated init script to use privileged capabilities 2009-02-27 kissaki 944501f Patch #2645062: Installer Translation: German 89d5f51 Patch #2638107: Installer Translation: German Mikkel Krautz 56426af Overlay for Mac OS X. Thorvald Natvig 7515e31 Update default system ini to include the uname tag 5d9edfb Don't keep CAP_DAC_OVERRIDE after switching users a5a3a73 Unbreak QoS on Unix f56a47f qWave (QoS for Vista) Bartek "stranded" Sumowski 0ddd167 Patch #2645933: Polish translation (small fix) theblackstorm c317abe Patch #2645641: NSIS French Translation 2009-02-26 Thorvald Natvig b34cbc7 Clean up logic for capabilities, add resources automatically if root, and update the limits test 2c9f4f0 Add a umask, add the CAP_SETGID capability, and print a warning if running murmurd as root without a username to drop to. 7fc01d6 Use Linux capabilities to allow us to really use high priority threads 2009-02-25 haru_arc 9f8f3cd Patch #2637281: NSIS Japanese Translation update Thorvald Natvig 0df61d2 Kill running mumble, murmur etc on uninstall. 2350c48 Sections for the installer. 428bc1b Fix spelling error in NetworkConfig.ui 788b3f4 Distribute Murmur.ice with win32 install. 13ea9af Avoid using QPainter::scale() as that produced a few artifacts in Qt 4.5. 2009-02-24 Thorvald Natvig 468ed6d Replace previous notification -- needed on new Ubuntu notifier e73613a Clarify Ice documentation for verifyPassword 9ea9089 Handle lost textures ada9056 Update vertex shader 2009-02-23 lewellyn 7041b3f murmur_pch.h cleanup Thorvald Natvig db3c781 Update Linux overlay to guess window size on GLX<1.2 c58df3f Qt4.5.0 on Win32. 39c8094 Mutex cleanup 3568c5d Valgrind run for mumble. 66d04b2 Fix a few gcc warnings 2009-02-22 Thorvald Natvig fb84f8e Fix RPC.cpp to compile even with CONFIG+=no-dbus ba56098 registerPlayer throws InvalidPlayerException, update .ice to match 5de1027 Shader-based OpenGL same-context linux overlay, with ELF linkmap iteration 2009-02-21 Stefan Hacker f308c58 Fixed possible bug in several plugins and did some minor style tweaks Eli Tallman 35f52a9 Team Fortress 2 PA plugin 2009-02-20 haru_arc 4fd1812 Patch #2620308: NSIS Japanese Translation 17a6814 Patch #2620179: NSIS Japanese Translation Thorvald Natvig 58b6aa8 getServer() for Ice doesn't throw, it returns a null proxy. 5932d65 Use Ogg-Speex for samples. 2009-02-19 kissaki f74911e German Installer Translation Updated Thorvald Natvig cec4fae Check unlink state every second. 50e58c2 Correct L4D plugin. ebdc34c Show which channel has been moved to/from when moving a Player. 2a9dcfd Allow modification of ACL if you have Write on parent channel. 6c6b3b8 Multiple keycombos per shortcut. 5257860 Fix typo; murmur now compiles on Win32 again. 879d3b2 Indenting and moving of a few code blocks 1d9b576 Support KDE notifications as well 2009-02-18 nomad 990ab72 Patch #2613323: Support for QT System tray balloon tool-tips or libnotify Thorvald Natvig b6fbe4a9 Don't use embedded speex if system speex >= 1.2 46b1594 Use the correct interface for QDBusInterface for focus eb97048 Use default ice port in the example scripts b36bfdf hasPermission for Ice 5001daa External Ice Authentication 2009-02-17 Thorvald Natvig ff728cd Indenting run 96b5158 Use QString based logging instead of const char * 08c7814 Reduce server stack usage 3fb59f9 QNetworkAccessManager for http loading. Support images in welcome text. ueber cff1c68 Ruby Ice example 2009-02-16 Thorvald Natvig 7148a0b Add a thread count test 39519d2 Speedtest of Protocol Buffers 2009-02-15 Thorvald Natvig e2586a4 Indenting 23af558 Client-side resource usage. c64cd11 Server-supplied resource support c3f993b Start UDP thread on demand 100a9a3 Clean ACL cache on server shutdown 2009-02-14 Stefan Hacker cfba8f0 New sample script which uses the server controlled context menu entries to create registration tickets from a client kissaki 07741df Patch #2598251: german translation (mumble) updated Thorvald Natvig 675c10a Oops, didn't mean to commit empty directories 64e3381 Example on how to use DBus with C#. Forgot I made this one. e68d920 Be kinder to systems without working lsb_release c7f4f3a Set current index on context actions for the playerview. 2009-02-13 Thorvald Natvig b0aea9f Fix LFLAGS_ADD dd82270 Add support for building 32-bit library on amd64 6fc929e Fix typo; the overlay isn't speex 1ff3076 slice2html doesn't count ? as a terminator, so reword things slightly 75205b3 Initialize menus on startup so context shortcuts are activated 0091cdc Don't refresh the ALSA card list, it causes ALSA to crash 2009-02-12 Stefan Hacker e64d33b Replaced the 'while' with close on keyboard interrupt Thorvald Natvig 94c73a5 Client-side context menus. 261483e Context actions for Ice 307a198 Iterate servers at startup instead of abusing stop/start callback 2009-02-11 Thorvald Natvig 7517a5c ServerCallback for Ice e9d8601 Meta callbacks for Ice 03aaf77 Dynamic connect() for authentication 86ac8d3 Fix volume attenuation when max volume is 0. 6db5ccb Delete event filter first, so it won't get called with its own delete event during recursive delete. 2009-02-10 Thorvald Natvig 554763e Indenting run ed7c412 Readd started/stopped signal propagation 146d7c6 Signal/Slot based RPC callbacks 3d6ae39 Signal and slot test 8c97da4 Start of Ice callbacks 2009-02-09 Thorvald Natvig 6242768 Add L4D to installer. abbaf57 log based rolloff for audio. 667ce05 Sample-based output. 701c1a4 When already connected and clicking Server|Connect, default to adding current server to the list. 2009-02-08 Stefan Hacker 3798014 Patch #2580353: bf2 PA increased possible mapsize 29c0464 Patch #2579216: cod5 new version 1.2 pa patch Thorvald Natvig 49d3385 Positional support Left 4 Dead. dfa7a82 Switch to "MaxDistVolume" for distancce attenuation. 3fa2818 Put MumbleScript on ice for the time being, as it is hard to get gui elements secure. theblackstorm ad0a14f Patch #2574499: NSIS French Translation update 2009-02-04 Mikkel Krautz d56a85d Remove Window->Close menu item on OSX. Disconnect uses Cmd+W as well, and we should really only quit on Cmd+Q. 2009-02-03 kissaki 6004a57 Patch #2557593: Installer Translation German improved theblackstorm c7b215c Patch #2560147: NSIS French Translation 2009-02-02 Álvaro Manuel Recio Pérez d02a587 Spanish translation for installer Thorvald Natvig b3a171b Start of clientside scripting. 38c52b5 Have the installer check for SSE, and complain if it isn't found. 2009-02-01 Thorvald Natvig db7b312 Allow playername and channelname config to be set live 2009-01-31 Thorvald Natvig bab2100 Patch #2550233: German Installer Translation Updated feb2dcf Patch #2549845: Win32 installer Polish translation [sumowski] Use Unicode NSIS installer 2009-01-30 Matthias Vogelgesang 2be3586 German translation for installer Thorvald Natvig 02378c5 Localized Win32 installer. e9b3fe8 Clean up a few leftover code lines 412be5d First pass at adding inline documentation to the slice file. Could probably do with a spelling check or three. 2009-01-29 Thorvald Natvig a3a362d Version bump 2009-01-28 Thorvald Natvig 4aa85bb 1.1.7 release 971a164 Changelog update a0c9671 Indenting fixes 2009-01-27 Álvaro Manuel Recio Pérez 878fff7 Updated Spanish translation 2009-01-26 Thorvald Natvig 51510ff Debian Bug#513119: murmur-user-wrapper: confused about dbus. Patch by janbraun@gmx.net 2009-01-25 Thorvald Natvig 7508be1 Delay fetching OSInfo, as QProcess doesn't deal well with fork/detach 4a07c67 Update distribution scripts b4258dc Add elide mode for the audio devices, and store configdialog geometry. 048343f Updated mumble-overlay to support biarch systems, based on patch by ludwig.nussel@suse.de Bartek "stranded" Sumowski 901ffe7 Polish translation hotfix 2009-01-23 Mikkel Krautz e611b15 Include Mumble's LICENSE file instead of the GPL in the Mumble disk image. Thorvald Natvig 8eb7359 Dont use tool windows on OSX 70344b3 Preserve config menu settings entry. 2009-01-22 Mikkel Krautz b6cd05d Allow the i386-part of OSX Universal Binaries to be built with MMX/SSE/SSE2 optimizations. Thorvald Natvig 9277b53 Transparent background for extended images in the murmur.cgi 9ccba72 More consistently pick the same interface 386a8f2 If we don't find an active IPv4 interface, pick any other 2009-01-20 julian7 887368a Patch #2524995: DBus started/stopped signals Thorvald Natvig ae08a5e On FreeBSD, just link -lcrypto directly f3fa9ad Older input.h doesn't have KEY_CNT cad89be Attempted workaround for screeching. d0bd009 Strip " from lsb_release 1be6e51 Update to support G15 SDK 3.01 Bartek "stranded" Sumowski 490728e Polish hotfix 00bf4ac Updated polish translation 2009-01-19 Stefan Hacker 6e01e25 Stop frameless window from creeping around. Thorvald Natvig 30460fd Language update e3f271b Indenting update dfecfd3 Use just parts of uname() for OS info 2afcd0e Don't use /dev/input devices that are grabbed, and don't use /dev/input at all unless we find a keyboard c451437 Fix of the fix of the fix for the frameless mode 34acfe4 ALSA Locking 2009-01-18 Stefan Hacker 9fca9fb Patch #2516734: Independent geometry for Mumbles' Minimal View 0112a1a Patch #2516400: Self Mute/Deaf via DBus for Mumble client jerhum 7814dba Patch #2518154: French translation update Thorvald Natvig 6786ed6 Minor cleanup of the noframe patch. 49fbd6b Brutally simplified LCD overlay. 2970f91 Qt 4.4.3 for Win32. 763a061 Fix for QScrollArea in ConfigDialog. 4a414a4 Remove debug output from Overlay_win Use QTreeView::scrollTo() for the playerview. 2009-01-17 Thorvald Natvig 695074f Multiapp overlay for *nix 1faac99 Support simultaneous overlay in multiple applications. e90dd48 Prefetch offset for createdevice. c168a48 Always show that we attached to OpenGL in the debug log. 061aa70 Trampoline-based, chaining, push/ret calling overlay. 2009-01-16 Thorvald Natvig cb9dfc4 Remove a debug string from AudioOutputDialog eaacf2f Lrelease seems to merge a few contexts, so turn nounfinished and compress off. 2009-01-15 Matthias Vogelgesang 318e002 German translation Thorvald Natvig 7121374 WASAPI doesn't need output delay, or so it seems. 1023428 Add a outputdelay config for AudioOutputRegistrar e3d63c5 Stop g15helper from spamming debug log. 88f0732 Typo fix. 852f60d Thread-safe AddRef/Release for overlay. Delayed-insertion D3D9 hook, work around bug in SupCom. Bartek "stranded" Sumowski 7afa56f polish_for_1.1.7_release_update_v50-FINAL.tar 2009-01-14 Álvaro Manuel Recio Pérez bf34571 Updated Spanish translation. 2009-01-13 Mikkel Krautz 04825a7 Use sheets for ConnectDialog-related dialogs on OS X. 1fd2ae4 Prettify OSX OSInfo and include architecture. Thorvald Natvig d10b798 Locale-aware version queries. 729b7a4 Fix bug where muted trayicon wasn't shown on startup. fde3748 Apparantly -arch:SSE (SSE1) and -QxK (SSE1) at the same time becomes SSE2. This compiler is quite buggy. 97abe97 Fix exit crash of overlay. Also include interface replacement code. Not used yet though, it would fail if the game did device->GetSwapChain->GetDevice, unless we patch all of those as well. 2009-01-12 ikasamah 10aaace Updated Japanese translation Thorvald Natvig 1948c1d Fix positional test in Audio Wizard. 1fe8a5d Default IdleAudioMute to off. 3282f3c Update murmur-static script 058e073 Qt 4.3 doesn't have -removeidentical for lrelease a450608 Descriptor test only works on *nix. f7d5644 Add a descriptor test 4325826 Fix editor oops in Register.cpp 864a40a Updated installation documentation d28a8a8 Language file updates b13cd6a Report true Windows version. Bartek "stranded" Sumowski e2701fa Updated polish translation 2009-01-11 Thorvald Natvig 949a8c2 Make canEcho const, unify XML for OS info and don't start UDP thread if the socket failed 0f93c33 Default Console.txt path to %APPDATA%, and add a "Run Mumble" to the installer. 1087de9 Use UTF-8 for CStrings too, fixes a Mojibake 6a6ca34 When using WASAPI, decrease the volume of other applications during speech. 2009-01-09 Thorvald Natvig 31e2c53 Fix string playerid -> string name 4320a6f Explicitly use UTF8 for all output from murmur. 976f17e Spelling fix for wizard. 27fa1bc Workaround for distros that rename qmake and lrelease without providing mkspect pointers bf6844a Add the Linux OS for the VersionCheck. oops :) 36c9d56 Mute loopback in wizard during welcome and finish pages. Add question about statistics to the end of the audio wizard. e36d650 PTT in audio wizard. 8f5da0f Use qCritical where it makes sense. 130416e On Unix, detach even if logfile fails 2009-01-08 Mikkel Krautz 3f2c634 Fix universal build on Mac OS X (and other non-pch targets). 7565edb Only enable XEvie when building against an X11 version of Qt. Disable g15daemon support on Mac OS X. Thorvald Natvig 3fc100d If Mumble is already installed, call the uninstaller. 68a6d8f Ok, only disable DirectSound if we actually compiled with WASAPI (it is optional, after all). Add a diagnostic output from ASIO when no devices are found. 3e25021 Merge DirectSound code into single file, and disable DirectSound if WASAPI is found. af7c056 Anonymous statistics. d2af1eb Enable tab scrolling to save a bit of space in the config dialog. 3cad4a2 Anonymous statistics. 4bdf757 Register Win32 version in hex. 770a421 Include version and OS with global server registration a93e270 Readd the untranslated English as a selectable language. 2009-01-07 Thorvald Natvig e0ea5df qCompress global server list. 46d8c8a Register current # of users and channels on global server list 63cca58 Whitelist the global serverlist callback from the reconnect tempbans 2009-01-05 Mikkel Krautz e9fb2ff Allow global volume shortcuts to increase the volume up to 200%. Thorvald Natvig 6bea0e5 Intel C++ 11.0 compiles -Qipo into buggy code, so turn that off. 6d373a7 Translation file updates ec7f8cb Indenting update 1f33cb8 Write/Admin -> Write ACL ad2b8e2 Update copyright for 2009 219c8c9 Add desktop shortcut on Win32. 82bb384 Allow channel/player regexp to be changed 6a4e383 Rename "Write" to "Write/Admin" in the UI so people stop thinking it's for message writing. e8c9e47 CONFIG+=no-embed-qt-translations to load translations from Qt from the system installed directory. 4751c3c Remove a few missing translations 4294ad7 -jX safe make targets for translations 60c2877 Build updates for newer boost and C++ compiler. 2009-01-04 Thorvald Natvig b0162ef Experimental notify-less DirectSound, using estimated positions. 2009-01-02 Thorvald Natvig 6a494c8 Tab-based config widget. 2009-01-01 Thorvald Natvig 974ced3 Update Win32 Overlay to inject LoadLibraryA. With the CBT hook, this should hopefully be enough. 2008-12-30 Thorvald Natvig 81cec84 Fix for the regression introduced by the hanged connect fix. 2008-12-25 Thorvald Natvig 8037b8d Fix G15 on Linux 6c68408 Avoid stuck ServerHandler when server is unreachable. 2008-12-24 Stefan Hacker 02d47ea Patch #2457331: Make murmur use its own icon mokomull 82e4966 Patch #2463387: Add configuration option for hiding main window to tray 28636ed Patch #2462928: Reload ALSA device list when settings dialog is opened Thorvald Natvig e87688b Fix for crash with no LCD devices present. 2008-12-21 Thorvald Natvig b39c862 Don't show LCD Config if no devices are detected. Also minor cleanups of G15 helper. 2008-12-15 Thorvald Natvig 56ee577 Update G15 helper to use standard input/output Show all players/linked channels. Fudge the font metrics. 2008-12-13 Mikkel Krautz b4806cc Add g15helper.ico. 98da0f9 LCD Support Thorvald Natvig 5ab03f2 Fix some Boost/Qt stuff for icl for the G15 code. 62d3ac4 The G15 library doesn't handle multiple devices. 2008-12-12 Mikkel Krautz f838215 Add LCD config dialog icon. Thorvald Natvig f151df1 If the UDP socket failed. don't close it. Also, enable obfuscate parameter. 2008-12-08 Stefan Hacker 5665131 Patch #2393239: PA div by zero fix (/ bf2 plugin fix) Thorvald Natvig 1b264fb Add MSVCRT to the plugins directory as well. 2008-12-02 Thorvald Natvig 41aff5b Fix unaligned access issue on picky 64-bit platforms (such as IA64) 2008-12-01 Thorvald Natvig 913cd1e Keep expanded state of items when moved. ffa5621 Updated translation sources Bartek "stranded" Sumowski 5eb15b1 Updated polish translation 2008-11-29 Mikkel Krautz a76f1f0 Treat incoming and outgoing mumble:// URLs as URL encoded. 5f3d243 Fix typo in "What's This" for Noise Supression. Fixes bug #2238867. b6fdc6e Add all the new positioaln audio plugins to the installer. Fixes bug #2294035. 2008-11-28 Stefan Hacker 3eaff86 Patch #2293077: Tray icon update on disconnect d0f05fd Patch #2293288: Disable PA when position is reported as (0,0,0) d798227 Patch #2301216: Positional audio for Call of Duty 5 8d72daf Patch #2338606: Positional audio for Wolfenstein:ET Mikkel Krautz b5cdef7 Fix rounding issues in AudioConfigDialog. Fixes bug #2293514; Based on patch #2293714 by dd0t. 2008-11-01 Thorvald Natvig 6be3542 Change tray icon when muted/deafened. d9cecff Idle timer in client to auto-mute. 073c72e Fix so you can use minimal view and AlwaysOnTop at the same time. a5a4a33 Allow boosting volume to 200% (with warning about it's quality). 2008-10-22 Stefan Hacker d57321b Patch #2183224: Call of Duty 2 positional audio 2008-10-19 mystic_sam b40cf89 Patch #2178031: AudioBar in config dialog 2008-10-18 Stefan Hacker 9d6f296 Sanity checking for CoD4 plugin Mikkel Krautz b535225 Make GlobalShortcutMac build again. e61870e Fix version number in BF2 plugin about dialog. 2008-10-11 Mikkel Krautz 71684f1 Make sure LogTitleBar is properly hidden when launching Mumble. 0e48e6e Initialize DirectInput in the same thread as we are polling it in. 37e60be Move DirectInput handling to the same thread as the Win32 input hooks. Fixes GlobalShortcut signal delivery. 2008-10-09 Thorvald Natvig d680eb9 Add Q_DISABLE_COPY to most classes 2008-10-08 Stefan Hacker 2ed7d0f Patch #2151618: Positional audio for Call of Duty 4 Thorvald Natvig 6bedde8 Add _USE_MATH_DEFINES to the .pro for Win32 so M_PI is defined, instead of locally changing the file. Oops. 2008-09-30 Thorvald Natvig a53239f Compile on platforms where qreal is float 2008-09-29 entitaet 2cecce4 Patch #2133288: Correction in mumble_de.ts 2008-09-26 Álvaro Manuel Recio Pérez 42b0508 Updated Spanish translation 2008-09-24 Thorvald Natvig 7460e13 Distribute Qt 4.4.2 for Win32. 2008-09-23 jakobdettner 2a6ae35 Patch #2119472: tray icon exit menu entry on right klick l-n 0e86bb4 Remove C++ flags from CFLAGS 3bd6814 Patch #2122639: fix build with older alsa Thorvald Natvig 270040d Deny duplicate channel names 46ba719 Check valid player ID on texture get/set 2008-09-13 Thorvald Natvig be9a94b Bump BF2 plugin version. 30c144d Add uninstaller section for configuration settings and databases. e94da5f Version bump 9e33a86 Changelog update Bartek "stranded" Sumowski 9589f64 Updated Polish translation 2008-09-12 Mikkel Krautz 3b124ce Add dbOpts setting. Allows users to specify custom connect options for their QSqlDatabase. 2008-09-11 Thorvald Natvig 7e0368e Language updates 2488f6f Indenting 1cc6bcd Implement "Always on top" and "Ask on Quit". 256e218 Include stereo decorrelatation in speex builds. 2008-09-10 derandi b8ff5ee Patch #2104222: Workaround for buggy Alsa lib 1.0.17a Thorvald Natvig f34ca68 getVersion() for DBus/ICE 2008-09-08 Mikkel Krautz 5b0322d Distribute Murmur.ice along with the other Murmur-related files on OS X. 1430ecb Make setChannelState() rename channels for DBus and Ice. Add getChannelState() to DBus. (Fixes bug #2098835) Thorvald Natvig 3a393fe sendMessage and sendMessageChannel for ICE/DBus 2bceafa Version bump 65fb1bc Distribute fake manifest for VCR90. 4498fd6 Support source-less text messages. 2008-09-06 Matthias Vogelgesang 4d89809 Updated German translation Mikkel Krautz 5fd6da8 Add mumble.icns to mumble.qrc. 6dbc29f Add mumble.plist to DIST. 168e007 Add icedemo.php to OSX dist scripts. Thorvald Natvig a30e610 Polish a68f72c Fix translation loader. 4c19239 Remove link.pl from distribution list 84a0d6d Changelog update 3dc145d Fix minor typo in GlobalShortcutMac 2008-09-04 jerhum 502512d Updated french translation Thorvald Natvig 92d9f1a Add warning to user if speex hasn't been checked out. b41fc5b Remove unused FMODAudio b146db0 Remove outdated link.pl (which hasn't worked for several releases) a47fea8 Remove unused DSound/OpenAL hooks from overlay source 9b32d99 Remove debian/ and debian-hardy/ from SVN as debian builds are maintained in the official debian SVN. 2008-09-03 Thorvald Natvig bd660ad Final version of polish translation 2008-09-02 ikasamah 61f7ce3 Updated Japanese translation Álvaro Manuel Recio Pérez aa3c45d Updated Spanish translation Thorvald Natvig 02da74b Remove obsolete translations from polish file 01d6c1c Updated language files to match new context 2d6d90a Add context to text "Unlink" for translators (Channel or Plugin?) 16a9832 Work around bug in QDir::addSearchPath() and QTranslator::load() Bartek "stranded" Sumowski f1dc16c Updated polish translation df503d5 Polish translation 2008-09-01 Thorvald Natvig 4a4231d Updated language source files 2ff806e Indenting 62f8b23 Silky smooth positional audio mixer. 2008-08-31 Thorvald Natvig 6dc327f Include all necesarry files to compile in .tar.gz 3b4cbea Distribute Murmur.ice and php scripts with static binary bf16e9b Update binary snapshot to update front page d42e60e Switch to name hints for iterating PCM devices on ALSA. 2008-08-30 Mikkel Krautz 9ffa6f1 Use 'MBLE' process signature on OSX for easier identification. Thorvald Natvig 509bba6 Be slightly more forecefull when disconnecting timed out clients 61fc898 Try using the CBT hook to avoid IE slowdowns. Might be games that aren't catched by this one, though :( c9ff1db Use a separate message loop for the lowlevel input hooks on Win32. (Fixes bug #2083383) 2008-08-29 Mikkel Krautz 2e227c0 Fix urlCallback prototype on non-x86-64. Sigh. 8e99df7 More general Boost include path on OSX. d3e6a7c Support for building against Cocoa Qt4 in compiler.pri (CONFIG+=cocoa) 3d167b5 Bundle Info.plist for Mumble AppBundle instead of generating it on-the-fly. e88f98f Fixes for x86_64 Cocoa version of Qt4. Thorvald Natvig b8a995c Overlay blacklist and "override" added (put a file named "nooverlay" next to the executable to disable it). 942e4a6 Work around Qt 4.4.1 "feature" of default buttons. 4013745 Work around setRecord() being broken in Qt 4.4.1 2008-08-28 Mikkel Krautz 78d6ca4 GlobalShortcutMac cleanups. 13037b5 Use ~/Library/Logs/Mumble.log for our log on Mac OS X. d066df9 Convert GlobalShortcut on OSX to use the Quartz Event Tap API. Fixes bug #1929509. Enables key suppression and proper key names in the config dialog. 2008-08-27 Mikkel Krautz c468b39 Show version in title of Win32 Murmur log window. Thorvald Natvig 638fe72 Distrubute Murmur.ice with .tar.gz 9303b29 Holding VersionCheck::on_Agent_requestFinished with a messagebox means we'll get a second finish event when the connection is closed, which goes through before we've finished the first. Switch to msgBox 45753b6 Under win32, ICE has wstring as wchar_t, Qt as unsigned short, so we're switching to utf8 5a457e8 Small cleanup of Win32 output modules. 2008-08-26 Mikkel Krautz 19a4b0a Repair broken Murmur output formatting introduced by --version change. ab5df06 Do not output an AppBundle for Murmur on OSX. eed23df Add version parameter to commandline Murmur. f9952e2 Fix server thread termination on Darwin/OSX. Murmur will now properly shut down when receiving a SIGTERM. 2008-08-25 Thorvald Natvig b4b8df3 Full fledged ICE/PHP example 5ea8d53 Make ICE unicode safe (switch to utf16 strings) 2008-08-24 Thorvald Natvig a9c89d5 Package dbus-send on Win32 installs. 3d14c72 Add DBus setRegistration call 2008-08-21 Thorvald Natvig ed38530 Use unfiltered input for "amplitude" VAD. 93e2e0b Move boost path to compiler.pri and use Boost 1.36 on Win32. cc57019 Switch to using event-based async ICE functions; Meta::start is now safe to use. Fix a memory leak when stopping a virtual server. f4064df Statically compiled and linked ICE for static server. 2008-08-18 Thorvald Natvig 8bf0437 Update defaults slightly. 2008-08-17 Thorvald Natvig e560cff Allow AudioWizard audio loopback to work even if we're muted on the server. 2008-08-15 Thorvald Natvig b12e705 Remove a bit of debugging that snuck into the last update. 8a59b41 Qt 4.4.1 develops a few visual quirks if you reparent GUI elements during their creation, so switch to explicitly setting the parent. a29d68d Fix ICE link bug on Win32. 2008-08-14 Thorvald Natvig 764487e Add suppression for XEvie and fix Qt4.4ism for context menu 2008-08-13 Thorvald Natvig be7961f Update static packaging script d748461 Remove some SSL debugging 7d9b553 Possible support for key suppression with XEvie, but untested as Xevie itself is broken on i386 48959a2 Add a "clear" to the context menu of the log window. 4e1ff3f Remember correct input device for WASAPI. 00fa259 Indenting 11eea44 Use explicit static_cast<> instead of implicit conversions for float<->int etc 2008-08-12 Thorvald Natvig 38da8ad No longer need bin/ in path for Win32. 3c03642 Fix voice activation buglet. Updated Win32 build environment for VS2008 SP1 and Qt 4.4.1. 2008-08-08 Mikkel Krautz e4b4a27 Update Benchmark.cpp to use current Auth message. Thorvald Natvig 15dd890 Make it slightly easier to use TAB and other UI changing characters as shortcut keys. 9490153 Wrong default port in ConnectDialog 20594f5 Update installation instructions slightly. 57a79eb Suppress shortcuts from other applications. a9db643 Use frame power instead of peak sample for "amplitude" VAD. Also use post-filtering signal instead of raw. ac59593 DBus/ICE getLog now uses limit offset instead of seconds 2008-08-07 Thorvald Natvig b36270d Log channel id when a player moves cf962e6 Bit more cleanup of AudioOutput. b55d6c3 Use softmixer for DirectSound. 2008-07-31 derandi e1ecd33 Patch #2031394: Call set_rate_near() instead of set_rate_min() in ALSA Output. 2008-07-21 Thorvald Natvig dae48d8 CIA bot on #mumble 0cea5b9 Update documentation. 253fbc5 For those crazy enough to want it, we actually support quality 1 now. 2008-07-20 Mikkel Krautz 9b7b713 Consolidate player/channel name validation into validateName() functions. Fix bug that allowed users to rename channels to otherwise invalid channel names. The registerPlayer() function now correctly validates its name before performing its actions. 22d8808 Call correct removeChannel method for DBus as well. Thorvald Natvig 45d553c Remove some debugging output from PulseAudio e1d9798 Fix typo in registration 2008-07-19 Thorvald Natvig f56a687 Fix compile bug with ICE. Attempt to fix PlayerModel bugs. 2008-07-10 Mikkel Krautz 3bb651c Default to ICE for Murmur on OS X as well. 2008-07-09 Thorvald Natvig 1b1be13 Default to ICE for Win32 murmur 2008-07-07 Thorvald Natvig 325022b SSL PassPhrase 3056df3 Taborder in AudioInput 2008-07-04 Mikkel Krautz 5246e8e Ice for Mac OS X. Thorvald Natvig 5459683 Intel C++ release build with ICE breaks with inlining. 2008-07-03 Thorvald Natvig 7791fa4 ICE for Win32 38b6224 Include weblist.php using ICE 93a9638 Update slice definition with idempotent and exceptions a95c1e5 Allow specification of ICE endpoint c8ffe27 Possible fix for PTT cue crash 833c2fc ICE fixes for Ubuntu 2008-06-27 prosper_spurius b2f70a7 Patch 2003574: Cannot save current connection 2008-06-26 Mikkel Krautz 91abf12 Add a new icon for the Mac OS X port. Contributed by Karsten Bruns. prosper_spurius 60479dd Patch #2002867: Patch for Bug: 1986292 Tray Icon disappears on minimize Thorvald Natvig 2f51d05 Fix locking bug with ICE c8d5d87 Complete basic implementation for ICE 98b1156 More ICE 2008-06-25 prosper_spurius f8fe0bd Patch #1998399: Patch for Feature Request 1934842 Channel Locking Thorvald Natvig c9ffada Framework for ICE in Murmur 2008-06-24 Mikkel Krautz 05dcd3b Use OS X system langauge instead of locale data for translation determination. (Fixes bug #1952855: Mac: Mumble uses wrong language setting) dca353c Better XRUN handling in PortAudio. (Fixes bug #1993878: (OSX) No Audio from other after some time) 2008-06-23 Thorvald Natvig fa6a569 Install for all users, not current user. 2caf10b Align crypt buffers 2008-06-12 Thorvald Natvig a3501d8 Add DBus types on Win32 too. 2008-06-08 Thorvald Natvig 46991af Add _cs translation to qrc file 2008-06-06 Thorvald Natvig e28b561 Support speex.git master aed770f Remove external speex SVN 4c5157b Add logging to phpBB auth script 2008-06-05 Álvaro Manuel Recio Pérez 41025c8 Fixed some strings in the Spanish translation 2008-06-04 Mikkel Krautz 23da58d Make sure Mumble will even build with CONFIG=no-dbus. 2008-06-03 Mikkel Krautz cd41589 Remove unconditional DBus disablement on OS X. Qt can load libdbus at runetime now, yay! 29d857b Enable proper mumble:// protocol support on OS X. Likewise for Console.txt logging. 2008-05-28 Mikkel Krautz f1835a8 More useful PlayerModel tooltips (feature request #1942941: Additional tooltips) 2008-05-27 Mikkel Krautz 97d2d09 Hide 'Expand'-label in LookConfig for non-expert mode. d4ef1a8 Explicitly focus the text input field of the text message dialog. Win32 doesn't do this by default. e0617e0 Implement volume shortcuts (for feature request #1954994: volume keybind) 2008-05-17 Matthias Vogelgesang ab53c51 Updated translation 2008-05-11 Álvaro Manuel Recio Pérez bb952c1 Updated Spanish translation Thorvald Natvig 5da1ea3 Version bump 573a614 Make XEvie optional 2008-05-10 Thorvald Natvig ae9ebca Changelog update 05f0da7 Another translation sync from debian's pkg-voip team 0b43cb1 Update persistent indexes for children in PlayerModel 20e9aae Fix crash when moving populated channels to parents. 4f74fd7 Avoid crash when no audio systems worked 4479f08 Try to speed up filling the public server list on X11. Set a name on the GlobalShortcutConfig for skinning. 6092849 Fix crashbug when %APPDATA% is unset for some reason. 2008-05-09 Thorvald Natvig b4cce78 PulseAudio detection should be slightly more stable. 7eec3b6 Cure for Qt 4.4 SSL slowness. 196cfd5 Changelog update 18bb1f3 Static build with Qt 4.4 b9936a6 Indenting 1355a0a AGC tests 8aae8a1 Only enable ASIO devices are found. 8e5bf73 Renamed murmur-wrapper to murmur-user-wrapper 3980fd7 Debian packaging fixes 2008-05-08 Thorvald Natvig a6b4d92 Sync debian/po translations from debian's pkg-voip team 079e6ac Compiler warning cleanups 00b954a PulseAudio detection (sort of), and sound system priority b4454a2 Save dock state when switching to/from minimal mode. c1fccd5 Timed drag-grab for the log. 28dd945 Make the player model the central widget. d4b0e25 Drop the splitter and make the log and playermodel dock widgets. 2008-05-07 Mikkel Krautz 3166fa4 Workaround for the, now as of Qt 4.4.0 yet worse, QWizard bug. 8ac6be5 Fix automatic version parsing in OS X distribution scripts. d1c0313 Avoid loading system Qt plugins on Mac OS X. Thorvald Natvig a2c4d46 Update Win32 for Qt 4.4.0 2008-05-05 Thorvald Natvig 11db737 Translation sync 2008-04-29 Mikkel Krautz f88d0cb Hah. Correct 'passford' typo in Murmur usage output. 2008-04-28 Mikkel Krautz ce01bdc Linux only -> Unix-like systems only 2008-04-27 Mikkel Krautz 444dfd2 Oops. Remove MacVersion variable from TextToSpeech_macx.cpp as well. 96e395b Use qMacVersion() instead of Gestalt() in TextToSpeech_macx.cpp. fe36a5f Distribute Murmur on Mac OS X. Update dist scripts and README to reflect that. 7ba3737 Move RC_FILE into win32 conditional in murmur.pro. 2ef7c5a Don't use internet enabled disk images for OSX distribution. Thorvald Natvig f4a9042 Yet more resampler fixes 2008-04-26 Mikkel Krautz 83e782f Refactor MacOS X TTS engine and disable it when running on 10.4 (Tiger). Thanks to Christoph Pirkl for tracking down the bug. Thorvald Natvig 72f70e4 Fixed regexp bug in channel name matching 3a25186 Update to resampler test 709ad57 Move menus up one level when in minimal mode e4d647f Debian/Ubuntu packaging updates 2008-04-25 derandi 7ff1e6e Patch 1950979: Repair broken ALSA, Changes to Plugins Thorvald Natvig 3cae4d8 Remove static reference to database c7a2d8a Explicitly clear SQL queries d0e2cb6 Fix crashbug when reconnecting to removed channel 59c8bf8 Support live changing non-critical murmur parameters 7d87303 Indenting d0ac8bf Update for Speex visibility 2008-04-23 Mikkel Krautz 83793af Add VersionCheck QueryItem for OS X. Thorvald Natvig 8863fc3 Polled X input support, for OSes that lack both xevie and inputdev 5e136dc Dumbing down the ALSA a bit 2008-04-22 Mikkel Krautz 79ef80e PortAudio: Get rid of crackling noise when opening output streams. c15dd01 Mention that we also run on OS X in the README. Thorvald Natvig 625825d Add UID to shared memory and semaphore names on *nix, to allow multiple users at the same time. ebe7e0e Add HAL policy to give access to /dev/input cf1fb3d Add more debugging info to ALSA, stop using advanced functionality 2ed86fd Gracefully handle lost directsound devices. Ensure shortcuts work in the application context and not just the mainwindow context. 2008-04-21 Mikkel Krautz 3beb2b4 Disable the overlay ConfigWidget on OS X - we have no overlay implementation yet, so showing the widget just confuses people. Thorvald Natvig 5820e0f Add libspeechd dependency for debian 89d892c Update DBus Auth for phpBB3 release 2008-04-20 Thorvald Natvig 19f54d5 Fix missing pages with resized config widgets. 4a2d277 Delay database matching for URLs to better work with "already connected" URLs. 2008-04-19 Mikkel Krautz 6eec5d5 Stereo support for PortAudio. 2008-04-17 Mikkel Krautz 6849be2 Prefer ~/Library/Preferences to ~/.config/ on OSX for Mumrur as well. 68a7bc0 TextToSpeechMac: Fix the parameters for our SpeechDone callback. I confused it with another function. This doesn't change any code, as we were only using the first parameter anyway. 2008-04-14 Thorvald Natvig 2991d20 Wizard for positional audio. 2008-04-13 inequation 9952748 Patch #1940944: getCurrentUrl DBus method Thorvald Natvig e64d938 Updated README and INSTALL 082e9ec Minimal mode. 2008-04-12 Mikkel Krautz 44afd7a Distribute plugins on OSX. Thorvald Natvig 923dfa4 Show defaults in ACL Editor 6a2a7f7 Make URL handler not reconnect if same server, and fetch username and pw from the server database. c0e7da4 Expand channels with players. 0eddca3 Update default voice hold to 1 second. ede276c Make ConfigWidget depend on smallest screen in multiscreen setup, and fix the non-expert mode icons having spaces between them. 2008-04-11 Thorvald Natvig f6e9798 Path fixes for installer. 8f6afa7 Indenting df4967f Use slightly more sane resampler for ASIO. 2ed8a4b Multichannel pulseaudio c50afb3 OSS fixes cfe94fa Fix multichannel ALSA 88d872c nix compile fixes b90733f Input/Output mixer speedups. 2008-04-09 Mikkel Krautz e02770f Make sure srs is set to NULL if we're not doing resampling. 865effb OSX build system updates. Add dist scripts. Thorvald Natvig 3dd8c55 Moved resampler for input. 2008-04-06 Thorvald Natvig 4132161 Add float->short conversion to the mixer. Hope it works. 53e4a7d Bring *nix audio backends in sync with new mixer 8dcb7d7 Fix a few compiler warnings 2008-04-05 derandi 8a2fad6 Patch 1934642: A few linkplug fixes Álvaro Manuel Recio Pérez 67de848 Updated Spanish translation Thorvald Natvig ee9397e Make the surround mixer include a resampler and default to floats. This breaks all *nix audio targets. 6c78cc7 Forgot plugins.pri and updates to the resampler test 2008-04-04 derandi e917075 Patch 1931477: Linux port of Link Plugin, Minor changes to Thorvald Natvig 8d67fd1 Don't break Win32 API for link plugin -- there's no need. 45121cd Work on the speex resampler 2008-04-03 Mikkel Krautz 8438405 Prettify Mumble icon on Mac OS X (mumble.icns) ff58997 Fix about dialog icon on Mac OS X 2008-04-01 mark7 b08b47e Patch 1930045: Man page spelling error 2008-03-29 Thorvald Natvig 353ad07 Explicitly fetch plugin position from both input and output. 6025c47 Fix bug if users are deleted while an admin has the ACL dialog open, then applies 2008-03-28 Thorvald Natvig 2c0a0ff Patch 1927186: Reorder some function calls in the AudioWizard 3acf851 Fixed installer and use explicit widechar in TestLink.cpp 2db85f4 Plugin updates. 7e0e525 Support setting supw from standard input 2008-03-26 Thorvald Natvig bb3322f Minor update to WASAPI 8e6bd0d Fix for logic of Link plugin. 113804b Translation source updates 21ee2fd Indenting 2008-03-25 Thorvald Natvig 71ac0a2 Make Linux soundsystems use new config 9e6d1d2 Remove config for OSS, ALSA, PulseAudio and PortAudio 324540e Refactor "Basic Audio" config dialog, and remove most of the system-specific audio configs. 2008-03-24 Mikkel Krautz 3002066 Patch 1923982: Always unmask the NoCancelButton flag in the AudioWizard ff72785 Patch 1923965: TextToSpeech OSX Update Thorvald Natvig ccdcb68 Bug 1923716: mute -> audio assistant -> bug 2008-03-23 Thorvald Natvig cfe1dfc Seemingly working surround mixer for WASAPI. Though it only knows about the "left" and "right" speaker for now. 2fd3801 Infacy of surround mixer 2008-03-22 Mikkel Krautz 46510a9 Patch 1922968: Remove old reference to ALSAOutputPlayer in ALSAAudio.h Thorvald Natvig 416e061 Updates Ubuntu packaging 7114684 Bump version to 1.1.4 fa43ba7 Fix iOutputDelay on *nix 2008-03-21 arrai 1baed7e Patch 1921066: Option to disable html messages Mikkel Krautz c577d45 Patch 1922328: More OSX UI cleanups 264bbd0 Patch 1921277: Use powf instead of exp10f in PositionalSound.h d224c59 Patch 1920346: Disable QSysTrayIcon on OSX - use the dock instead ce7b093 Patch 1919733: Update for GlobalShortcutMac Thorvald Natvig 21c33ff Rename iDXOutputDelay to iOutputDelay and move it to the general config pane. 677a399 WASAPI Input and Output 6f904ef Add an icon for the network config 4a901b1 Minor cleanup of PositionalSound and some indenting fixes 2008-03-20 derandi 0f22bcf Patch 1920119: ALSA Stereo 3b43d94 Patch 1920117: Stereo Mixing 013c29b Patch 1920115: Positional Sound Widget + Volume Models Mikkel Krautz 83c5b45 Patch #1920346 Disable QSysTrayIcon on OSX - use the dock instead d296102 Patch #1920332 Add a cancel button to Server Browser of the Connect Dialog 7e79880 Patch #1920239 Prefer /home/xeno/Library/Preferences/Mumble on OSX 5a151a1 Patch #1919466 About Dialog cleanups Thorvald Natvig 1231db2 Make the stereo-enabled output compile on Win32 as well. e93c194 Indenting run 7c71309 Support system-installed speex (if it's 1.2b4 or newer) 2008-03-19 Thorvald Natvig 6bef650 WASAPI Input 2008-03-18 dark-storm b489aeb Path #1916131 Compilation Fixes for Visual C++ 2008 l-n ab6f5e1 Patch to fix no-speechd Mikkel Krautz 831aa39 Patch #1917558 Implement GlobalShortcut for OSX Álvaro Manuel Recio Pérez ec619c7 Updated Spanish translation. Thorvald Natvig 9ff6c4b Update to patched speex API. 1f89fdd Move compiler settings to compiler.pri Fix a lot of warnings with msvc 716b39e Add VersionInfo to the .rc files. 2008-03-17 jerhum d90d605 Language update and new french translations Mikkel Krautz bcd9c81 Patch #1916734 Fix TTS on OS X and add volume capability Thorvald Natvig 99aafd9 Spread registrations out a bit in time 46ea093 Add no-client and no-server for qmake. 703f08e Open Console.txt in User directory if current directory is not writeable. 5fc4580 Make Win32 audio modules optional. Don't crash if no modules are enabled/working. 77a914c Add Deafen/Mute self to the player menu if self is selected, and remove "Local Deafen" (can be done by setting output volume to 0%). a58ff30 Support skinning of the style sheet of the log window. 10edfac Sort server browser based on alphanumeric only (ignore whitespace and punctuation) f391624 Remove lefotver festival settings 033c466 Updated license script 2afb03d Initial support for plugins on non-win32, but disable GUI for now [Ludwig Nussel ] 0ccde72 Make all audio modules for Unix optional, as well as dbus and speechd (CONFIG+=no-whatver) 2008-03-16 Mikkel Krautz 49bb6aa Patch #1914863 Override TARGET for better OSX integration 862186f Patch #1915779 Add window titles to Mumble's about dialogs 731d349 Remove the empty line at the beginning of the log view and speed it up a bit. Based on patch #1915590 093c378 Patch #1915523 enable _MSC_EXT only for MSVC Thorvald Natvig 2bb285b Don't use boost typeof for GCC [Ludwig Nussel ] 7894e07 Quit => Quit Mumble vader42 5399fff Make murmur compile on freebsd 2008-03-15 Mikkel Krautz 279919a Patches #1914820: OSX patches (from bug #1914742) Thorvald Natvig ea9820f Only reload dbus if installed for postinst 9a01814 Basic WASAPI querying. 48ecb5e Minor pulseaudio cleanup 2008-03-11 Thorvald Natvig 8527d41 Fix compile warning in PulseAudio, add --as-needed to linker b5a4963 Add version checking to overlay 361d01f Use speech-dispatcher for TTS on *nix 9f58eb2 Add replaces: for mumble-server-web ebeac46 Add tooltip to systray icon so settings are saved by OS. 2008-03-05 Thorvald Natvig 2d34ee1 Fix vcredist options. e4156de Fix reference-to-just-deleted in DirectX output. 2008-03-04 Thorvald Natvig 1fa16a1 Fix for bug #1904336 -- renaming channels could crash the clients 99ce07b Use new murmur icon 134dc30 More compilation and installation tunings for Win32. 5f16fc3 Directory cleanup when purging package b05691c Use floats instead of doubles where it makes sense. 2008-03-02 Thorvald Natvig 77e5ad9 Remove ASCII warning 2008-03-01 mit_service 3900560 Patch: #1902036 small fix to make mac version compile Thorvald Natvig 677dc28 More directory fixes 0779a0f Default databases to ~/.config/Mumble on Linux 9845a40 Make Vista-friendly paths for sqlite databases. d4cc0fe MSVC doesn't need the thiscallresolver. 58712ba Fix home directory for mumble-server d6ef7b8 Compile Win32 with Visual Studio + Intel C Compiler 2008-02-29 Martin Skilnand 8b5507d Test 16x16 icons/murmur.ico for review by slicer. Will make proper 32x32 and 64x64 if OK. 2008-02-28 Thorvald Natvig 6b75830 Add SpeexMark.pro again 2008-02-26 Thorvald Natvig 4c5f56d Support profile-optimized libspeex. Slim gain so far, waiting to test on Core2 2008-02-24 Thorvald Natvig a9adffb Compat 6 for debian 9fd4692 Build static binaries with a qt snapshot to fix library loading 2008-02-23 Thorvald Natvig 7091532 Made VAD defaults more sane 6df7073 Clean up e2718e5 Fix dates in changelog 7e9c963 Make mumble-server suggest mumble-server-web a20297f Minor textchanges in changelog 40c8e02 Changelog update 01ac1f5 Small update to changelog script 897eb98 Update PulseAudio buffering to use bytes and not shorts 2008-02-22 Thorvald Natvig 078c49c Reread list of sinks and outputs when someone adds/removes a audio card for PulseAudio 2008-02-21 Thorvald Natvig a3a9166 Add DBus path for Murmur on Win32 401dc37 Major packaging cleanups. Getting ready for 1.1.3 2008-02-18 Álvaro Manuel Recio Pérez 0c96725 Updated Spanish translation. 2008-02-17 Thorvald Natvig 799641a Escaping a few - in manpages 7a93357 Small update to registration script 6ac1563 Minor updates to ubuntu packaging 2008-02-14 Thorvald Natvig 3a2e0c3 Language file sync. a413722 Make "Remove" disabled if there are no entries in the server list. 5c773fa Refresh public server list every 24 hours. Change the "Add" button into a context-sensitive "Update"/"New"/"Add" button. 2008-02-13 Thorvald Natvig 75abc3e Unembedding of speex FFT functions -- Mumble should now be able to build with a system-installed Speex >= 1.2.0 1d30b3e Merged most of our speex changes into speex upstream; first patch to unembed Speex. 2008-02-09 Thorvald Natvig 696f397 Improve visibility of linked channel state f745174 Fix "move to parent" bug. 2008-02-01 Mikkel Krautz e094fc9 Automatically add/remove /dev/input devices Thorvald Natvig 595bd13 s/proprietary/non-standard/ 2008-01-26 Thorvald Natvig 786a5d7 Ask "Are you sure?" if quitting while connected. 2008-01-20 Álvaro Manuel Recio Pérez 20bf4ab Fixed some strings in the Spanish translation 2008-01-17 Álvaro Manuel Recio Pérez 5cda451 Updated Spanish translation Thorvald Natvig a17a335 Restore linked state on server restart 2008-01-16 Thorvald Natvig 8cca0fa manpage updates and .config fix from patrick.matthaei@web.de abc6336 Disallow local mute of self 2008-01-15 Thorvald Natvig 15709d0 Changelog update ee05b27 Add template and config file for .deb c3276f5 Final touches for debian package 0ada0c0 Extensive updates to ubuntu package (not quite done) 2008-01-14 Thorvald Natvig 67010a3 Rename ubuntu package from murmur back to mumble-server 2008-01-12 ikasamah d67f7e0 Japanese translation Thorvald Natvig 5235be7 Work around bug in newer debian 2008-01-08 Mikkel Krautz f8c5319 Proxy support 2008-01-07 Thorvald Natvig dae8d2f Modified manpages 2008-01-06 Mikkel Krautz e83fcc8 Change the size parameter for EVIOCGBIT, based on patch by 2008-01-05 Thorvald Natvig dbaaa61 Increase safety size for config widgets fdf7ee6 Translation updates dc7e438 Update copyright for 2008 9ee2657 Fix messageType for CryptSync [Mikkel Krautz] 2007-12-16 Thorvald Natvig ea46e42 Handle SIGTERM and SIGHUP in Murmur 2007-12-14 Thorvald Natvig 8b43b42 Clean SQL log after adjustable interval, fetch logs via DBus 680a5f1 Add rotateLogs and quit methods for DBus 2724239 Make ALSA errors logwindow entries instead of popup boxes c024189 Show hostname when connecting. 598359f Revert to seconds instead of centiseconds for registration delays 0c74573 Use SSL callback to verify bound IP for multihomed machines 2007-12-11 Thorvald Natvig d0c6510 Update lintian override 2ba1d59 Support espeak, add festival suggestion for ubuntu a8579e1 Rename user from Murmur to murmur 2007-12-10 Thorvald Natvig a78b7ca Add murmur.default for init script f59fa90 Speex benchmark, used to test optimization flags ea32c9f Early bail for non-SSL 2007-12-09 Thorvald Natvig ed0acc9 ALSA labling fix. Softmixer fix. 756749d Standards 3.7.3 for Ubuntu 8ae34f4 As it breaks packaging policy for many distros, don't default to MMX/SSE for Linux d91a17f Various UNIX audio fixes 2007-12-08 Thorvald Natvig 254671d Installer now kills dbus-daemon.exe if found. 2007-12-07 Thorvald Natvig 3356227 Various dbus fixes e21e236 Log -h to stdout for murmurd 2007-12-06 ars3niy d2b7357 Patch 1845022 for delayed Global (fixes fonts on X11) metz 5106764 Patch #1844930 macx: add app icon / remove window icon 2007-12-03 Thorvald Natvig 9859554 Use SSE for Speex if compiler flags enabled e7449cd Clarify source license in debian/ b70ac9a Language updates 2007-12-02 Thorvald Natvig ddebe8f Build PortAudio and PulseAudio only if pkg-config finds them 621c8d8 Bump version to 1.1.2 (for all but debian/) 64f9511 Changelog update c286eed Minor Ubuntu fixes 2449c35 Fix yet another Win32 UDP bug. 2007-11-25 Thorvald Natvig c432df7 Threadsafe sockets for Win32 345f554 Oops. Added collation fix to sqlite instead of mysql. Fixed. f40e3eb Move audio input/output system to mumble.ini if present. f63c019 Use utf8 for Unicode 2007-11-23 Thorvald Natvig 7ae7fb6 Better audio path detection. Fix race bug in AudioOutput 2007-11-21 Thorvald Natvig 0133055 Bug 1835662: fixed caching bug in murmur dbus 2007-11-20 Thorvald Natvig 2238c6d Audio latency testing 2007-11-18 fitti_01 fed3ae2 Support setting dbus servie name Thorvald Natvig e1c36ec Use the new defines for Ubuntu ff829e1 Support NO_UPDATE_CHECK 4447a28 DeferInit -- avoids thread races for global initializers d47fa08 Support setting DEFAULT_SOUNDSYS 9257279 Better support for small desktops 4839b07 More Ubuntu Fixes 2007-11-17 Thorvald Natvig ff0a5b6 Multiscreen configdialog resize support 3a49d77 PulseAudio fix. More Ubuntu fixes 8de19f7 Patch #1832382 by metz d05df59 Indent 25e5995 Support all protocols for textmessage auto-URLing. Fix icon for win32 murmur. d403c42 Allow all usernames if they are registered 67dafef Echo support for PulseAudio (untested) a4c0cef Remember wizard settings for OSS/ALSA. 579a429 PulseAudio (very basic) 2007-11-15 Thorvald Natvig 20f8847 More Ubuntu updates 2007-11-09 Thorvald Natvig 6ac9d66 Updates for systemwide cgi installations a84aa6c More Ubuntu fixes 2854f19 DBus based murmur.pl registration script 2007-11-08 Thorvald Natvig 495eaf8 Update CryptState unit test f76f28b Typo in murmur.init 00e9835 More Ubuntu packaging fixes 2007-11-07 Thorvald Natvig dfa2c00 Start of more complex Ubuntu package 2007-11-06 Thorvald Natvig 25a6bac setTexture for DBus ba41b1c Update for latest Speex 051fa33 User registraion in DBus 2007-11-05 Thorvald Natvig 714258f Auto-XHTMLify TextMessage 5376461 Cleanup for non-expert mode 9851873 Updated AudioStats. Added voice detect to AudioConfigDialog. 2007-11-04 Matthias Vogelgesang 42f0f2a more spelling errors corrected 94ef85c german translation updated and 1825370 fixed 2007-11-03 fitti_01 5570be1 Defaultchannel for murmur 2007-11-02 fitti_01 940521e Fix lastchannel when using DBus auth Thorvald Natvig 379bd6a Try to work around a few QSslSocket bugs 2007-10-31 Thorvald Natvig 1661ebe PlayerModel keeps persistent indexes and has a root item. 2007-10-30 Thorvald Natvig 186dc71 Root channel name is server registration name dbaa00c Updated changed channel names in database 2007-10-29 Thorvald Natvig a1ec12e LICENSE updates 69112b4 Fix SQLite trigger c3995ff Doubleclick PushToTalk to Continous 0810a0f Delay MessageBox for win32 murmur 2d1ec93 QVariant Shortcut for Linux 98a1f8f QVariant based GlobalShortcut 2007-10-27 Matthias Vogelgesang 9db7eb0 german translation updates Thorvald Natvig 8513f99 Tighten database restrictions b47696b Unified GlobalShortcut vegars 4c6231f Hide MainWindow on trayicon click 2007-10-25 Thorvald Natvig a332fb8 Set SHA1 pw from murmur.pl 2007-10-24 Thorvald Natvig dc05737 Fix Linux overlay for older GLX 5fd89af Global shortcuts on Linux were completely broken 2007-10-22 Thorvald Natvig 4f2494a Add weblist.pl to distribution 9ad04e0 Logic fixes for ConnectDialog 974a742 More Speex build fixes 2007-10-21 Thorvald Natvig 2e56c3a Crash with MySQL without dbprefix 267542d Update for SVN release of Speex 2007-10-20 Matthias Vogelgesang dbe4a15 german translation updated Álvaro Manuel Recio Pérez 729c5e0 Fixed some strings in the Spanish translation Thorvald Natvig c097640 Include libmySQL.dll on Win32 23eb4ff Make ServerDB less chatty to avoid numerous messages on Win32. fbf83d3 Fix bugs in bandwidth quality adjuster and show quality in server information tab. 2007-10-19 Matthias Vogelgesang 5b337d1 german translation updated Thorvald Natvig 1cb276e Bump version to 1.1.1 eb428c3 Changelog update script fixed f94cf14 Ubuntu updates 4832ad9 Changelog update ab2721b Release script updates and last batch of text fixes b9e7412 Changelog update 81ce7a6 Ubuntu packaging updates 2007-10-18 Álvaro Manuel Recio Pérez bb17b2b Updated Spanish translation 2007-10-17 Álvaro Manuel Recio Pérez 705ebf2 Updated Spanish translation Thorvald Natvig dff89ba Fixes from Klocwork analysis (http://www.klocwork.com/) 4c6e200 Typo fix c97eec2 tr() bug in ALSAEnumerator 48dc9ca Support prehistoric OpenSSL dbacc6a Minor text fixes. 2007-10-16 Thorvald Natvig d7d2a2a Language update f63a308 Ensure labels are updated in config widgets. 98b43c2 tarbuilder updates 2007-10-15 Thorvald Natvig e5a6b3e Compile against OSS3 as well 2407f3a OSS4 983f067 no pch mode for klocwork 2007-10-14 Thorvald Natvig 98dfb02 Updated WhatsThis for ACLEditor.ui 2007-10-13 Thorvald Natvig b8df275 Local Deafen wasn't checkable. 2007-10-12 Thorvald Natvig 13f67ff Update DBus examples and fix reentrancy bugs 2007-10-09 Thorvald Natvig 50c912a Qt 4.3.2 in installer Fix buglet in bandwidth auto-adjust. 2007-10-08 Thorvald Natvig fae3c30 Portaudio support by metz 0b97396 Rename murmur to murmurd on Unixes and add a pid file 7e7d5b1 Various compile fixes for Linux 7990f39 Expert config mode 7d26a57 Memory map bugfixes fdd190d Support explicit linked games. 74f6e5c Add a volume slider. a82b296 Save state of playerview. Bump AGC to 30000 952d3c4 Autolower bandwidth on connect 496a6e4 Add TextMessage to svn. 2007-09-26 Thorvald Natvig d2b7a5a Fix bugs in ConnectDialog 57ad881 Serverside text-to-channel support 64b5b2d Multiline and multichannel messages. 2007-09-09 Thorvald Natvig 334fe8d Allow a few more characters for channel and user names 2007-09-07 Thorvald Natvig 568fdeb More gracefully handle oversized outgoing packets from murmur 2f046d8 Add username limit of 512 bytes. Bugs reported by Luigi Auriemma 2007-09-01 Matthias Vogelgesang 14c660e new batch of translations Thorvald Natvig 1b048e6 mumble.desktop patch from cesare.tirabassi@gmail.com 3c2dcd6 Fix D3D9 textures stacking. Fix OpenGL grey texture. Fix CrashLog dumper. (DOH!) 2007-08-30 Thorvald Natvig ddfc033 Patch #1785198 by metz - Log.ui -- Logging config looks a lot better. 65f0587 Patch #1785192 by metz - ConfigDialog fixes 7322922 Patch #1785183 by metz. Unix client compiles again. 92ad768 Patch #1785183 from metz. Enable AudioWizard on non-win32 platforms. fad508f Win32 OpenGL overlay. ETQW :) 2007-08-29 Thorvald Natvig f219925 Modularized win32 overlay. Added preliminary DSound and OpenAL position grab to the overlay. (Only works with demos so far, no actual games work). 93c3b9a Compile win32 overlay with GCC. 0678e97 Win32 overlay no longer depends on D3DX 2007-08-28 Thorvald Natvig aca25ea Re-add bf2 plugin to win32 installer. 80969a6 Use file mapping for shared memory on Win32. 48b53a0 Win32 installer asks for reboot if it can't update overlay file. cf86cdc Various bugfixes. Updated overlay to only draw on topmost surface. Needs testing. 2007-08-25 Thorvald Natvig ceea71c Bugfixes from public snapshots. 2007-08-21 Thorvald Natvig c49721c Automatically check version on startup. 2027b32 Re-enable drag&drop. 2007-08-20 Thorvald Natvig 6c74656 Minor fixes for new config system. Updated installer for Qt 4.3.1 2007-08-19 Thorvald Natvig e90cb8a Client now has "restore to default" and "restore to last saved" configuration, and all config is stored in the same way. Only changed configuration data is stored on disc, meaning if a user leaves a setting at it's default and the default later changes, the user will use the new default. 2007-08-16 Thorvald Natvig 7293dfc plugins.pro 2007-08-14 Thorvald Natvig ecce8da Update .uis for Linux a30e3e0 Fix warnings on Win32 bdee1de More .ui conversions. 2007-08-13 Thorvald Natvig ae57734 BanEditor.ui cc362d1 ConnectDialog.ui ff13d28 Fix meta-registration 2e5edd8 MainWindow.ui 1193b20 Show URL in tooltip for HTML anchors. 8c73444 Minor fix for TTS on Festival 1753f90 Safe HTML in Log 2007-08-12 Thorvald Natvig d30bee2 Yet another fix for reentrant SSL messages 6551302 Manual close of application 2007-08-11 Álvaro Manuel Recio Pérez 1d4905c Updated Spanish translation Thorvald Natvig 9dbb120 Experimentation with UI Designer 613fc3d Local deafen 8be82dd Adjust noise suppression level in settings. 6e2aad3 Use SHA1 for binary checksum for the upgrade check. dc72837 View extended server connection statistics. 36f625a Start of proper statistics 467316a Strip HTML from incoming TextMessage 76d9503 Certifiticate => Certificate 2007-08-10 Thorvald Natvig 1948e6c Strip HTML from TTS for Win32. 1e5cdbb Support URLs in the log window. 3e92399 OOO crypt recovery 2f9dd3f Fix GlobalShortcut_unix 5c76721 Update registration script c17cc96 Support kernel input devices on Linux 2007-08-09 Thorvald Natvig c95963a Update win32 Build Environment to GCC 4.2.1, Qt 4.3.1 and Boost 1.34.1 2007-08-08 Thorvald Natvig 4cc8782 Fix referential integrity for player group-memberships 6237d0f Add DBus getAllConf() and setSuperUserPassword 0ae6c48 Ask for AudioWizard config on first start. 2007-08-07 Thorvald Natvig 681c77f PushToLink implies AltSpeak e2f1dfe Fix a few more SQL problems 2007-08-06 dersebi b6b99c2 Fix typo in mumble.pro for OSX Thorvald Natvig 6d169a2 Yet one more try to get -mmmx out of the mac build d5a5441 Compile fix for 32-bit lenny 65c7e7e Another tiny SQL fix 705ce12 Typo which broke the client. Badly. 6bdeb32 Fix two crashbugs in murmur 7d2c4fa SQL Fix in ServerDB 93e427c Rename channel 2007-08-05 Thorvald Natvig fbe5831 Add TestCrypt to SVN c18a161 Minor build fix for regular Linux 0c3b618 OSX patches from mit_service 32c3dfc Optimized crypto 9fdefc0 Fix crash from race condition in DXAudioOutput 2007-08-04 Thorvald Natvig 9e61611 Fixed ConnectDialog to be slightly more sane. d9671c9 Minor bugfixes for DB and DBus layers 923901a Updated server info dialog to reflect voice crypt. 0bc0120 Use correct frame size for bandwidth calculation 03a7e5a Fix crypt on client. 7ed5e47 Testing UDP crypt a6376f8 Build updates 9eafd13 Link vertical height to font size. 2007-08-03 Thorvald Natvig d252e43 Allow multiple tests on same machine 0df11b8 Microbenchmark 7168275 URL path == channel support ffb4b96 MySQL schema embedded in murmur. Reconnect to SQL server on connection lost. b80bece plug:"hw instead of plug:hw 2007-08-02 Thorvald Natvig 24b1c04 DBus and URL support for Mumble. Fixed DBus autolaunch for Win32. It's a hack, but it works. f9ffe34 Native UDP for UNIX as well 7e24961 Win32 Murmur DBus 2007-08-01 Álvaro Manuel Recio Pérez 152d58b Updated Spanish translation Thorvald Natvig 42a69cc SQL reconnect on lost connection 0ef9c34 Per-server logging a7186c6 OSX Patch for murmur from mit_service 2ac4ca7 Timestamp players table 418cdba Make sure no -2 slips through to Mumble fc94f49 Multiserver support 2007-07-31 Thorvald Natvig d13bb46 server_id in ServerDB 11d9b70 Client compiles again 6d6bcff Global-less server. First step of multiserver support. Completely breaks client 2007-07-30 Thorvald Natvig a5c59c5 Platform edit 1219168 mouse shortcut patch from javitonino 2007-07-28 Thorvald Natvig 4b9beb2 Czech translation from David Pravec 07da183 Name -> Label 2007-07-22 Thorvald Natvig 3f77c95 Installer fixes for openssl. 2007-07-21 Thorvald Natvig 639ca57 Increase max settable amplification to 40x db4e86e Reset PushToTalk when configuring. 7296aed Make qFatal pop up as ::MessageBox on Win32. 5a19931 Use mingw built openssl -- the precompiled one depended on nondefault Visual C runtimes. 8f15162 Support fixing case of usernames in DBus auth b4817ee obsessive PacketDataStream optimization 2007-07-20 Matthias Vogelgesang 47fdafe translations Thorvald Natvig b9eb5cc Database cleanups and support for dbPrefix 5be2268 IP Binding for murmur 7eff82c Timer tests 3fdb39f Test indenting f81c7c2 Unit tests ae9f13e PacketDataStream bug for negative numbers > 32 bit 3d8e058 Reentrancy fixes 2007-07-19 Thorvald Natvig d7d1535 SSL crashfixes, ui session drag-and-drop fix. eebc950 queued readyRead, fixes a SSL crashbug 0147de1 Small optimization to win32 timer. f081a7a Deprecation cleanups 04d7e5f LARGE_INTEGER fixes for murmur 62dbc00 sPlayerId => uiSession 3621a6d More indenting 0372cc2 Use new Timer for murmur d4a1118 Ping measurement in Server Information, and optimized AudioInput->UDP latency. 7d145eb 64-bit message support. b3ac4e4 Latin1 for Festival 2007-07-18 Matthias Vogelgesang 3bbdcb6 German translation added. Thorvald Natvig 990f220 Proper certificate viewer. 7080e90 A few missing QLatin1Strings and also switch to pkgconfig for ALSA and Xevie b00a1b0 Use pkgconfig for openssl link ca9c473 Hashed passwords in murmur database 2007-07-17 Thorvald Natvig 1b265ff reindenting all the code d9ca67e installer fix for OpenSSL 0178d66 Avoid closing on errors, that happens automatically now 87e1835 Fix for #1755731. The event loop runs while dialogs are open. 8d80379 SSL client support. e28c646 UTF8 for dbusauth a6442cd Forgot to add new Cert.h and .cpp 852c064 Server-side SSL encryption 247b0a8 All icons can now be changed in skins. 3a2adb6 Crashbug in ConnectDialog 2007-07-16 Thorvald Natvig ffd5dfd Some more dbusauth fixes 9c0b661 Cached database handle in dbusauth.pl e6afb86 hostname registration e083364 overlay debug fixup aa7b85a Fix buglet in PlayerModel 2007-07-15 Álvaro Manuel Recio Pérez bcac0ae Minor corrections to the Spanish translation Thorvald Natvig 76171dd Platform-independent qmake pathhandling. a9fba24 Include QT translation d469c74 Overlay debugging 81d3d1d Explicitly link overlay with gcc to avoid libstdc++ dependency c3def10 Build fixes for Ubuntu 33604ed Changelog update 9dd4348 Final lupdate before release. b4d3042 Some more Qt 4.2.2 fixes. 2007-07-14 Álvaro Manuel Recio Pérez d2952d5 Updated Spanish translation Thorvald Natvig fe73c93 Capitalization fix. 36b9241 Updated French translations from Thibaut Girka. e13024e Keep just the LD_PRELOAD overlay c3d7033 Forgot a conditional for the audio wizard 2007-07-13 Matthias Vogelgesang 5e25cd3 Should do svn update more often ;) d259422 more translations. Unfortunately since I don't have Qt 4.3 I can't really check if the translations fit the wizard. Thorvald Natvig b0a7f04 Textlogger for murmur win32. cc7e2f2 AudioWizard builds on Win32 only for now -- no reliable way to get moc to check qt version. bc6c452 Clean compile on Qt 4.2.2 40ca34f More stable LD_PRELOAD for GL overlay 2007-07-12 Thorvald Natvig 12416a4 Fix compiler warnings 22c56e8 Wizard registrar for ALSA dd4b82a Fix bugs discovered by Klocwork [www.klocwork.com] ade816d Simple userauth. Example expanded to show phpBB3 authentication. c7bc5c1 More flexible bandwidth detection 2007-07-11 Thorvald Natvig 4519fbc Use new overlay icons. 9906dc2 Audio Wizard. Breaks Linux for now. 2007-07-10 Thorvald Natvig a66039d Use aligned stack buffer for MMX mix 7c5c3a0 I give up -- we create a separate context for the overlay fbf303a Loopback cleanups 3b2baae SineAudio fix, and non-mmx mixer support. 2007-07-09 Thorvald Natvig 34c2b3b Doubleclick player to send message, based on patch by m0ta. 76512f6 expand all channels by default. 0b76788 Minor Dbus fix and changed path and service name 6b42fbb Packet loss and delay variance for Loopback mode. 2007-07-08 Martin Skilnand c36e1f6 Test icons with hard edges for overlay for cartoon look. If this doesn't look good, I will try soft edges. Matthias Vogelgesang 3087e08 slight changes to the translations Thorvald Natvig 273b997 Revert to plain old C for Linux overlay c338f5a Jitter buffer fixes. Should work better now. 2007-07-07 Matthias Vogelgesang de744a8 updated german translation 412fb15 add menu entry for freedesktop.org compliant distributions c504036 updated german translation Thorvald Natvig c0aa51a Part #1 of Speex Packet merging and Jitter updates. ffafa93 Include French translation in binaries. c13d4a8 FR 1749422: User Textures can now be disabled. d9122f8 Updated Linux overlay 2007-07-06 Thorvald Natvig 9df9f51 QLatin1String for Overlay 3bd3e3a Server loopback mode 98c1b1d Local loopback mode. 3af031a Overhaul of Audio Output to support non-speech sources. Probably break ALSA. 62b5281 Players On Top e115603 Verbose output b660cd9 Popup user dialog on wrong username/pw to reconnect. 1e66e95 Popup on rejects. 36de5ea Add rejection enum 2007-07-05 Thorvald Natvig 4ab2813 Overlay tuning. fc85579 Updated murmur cgi script for image upload 25082c4 Custom UserTextures 43853bc Wrong int encoding in PacketDataStream. 24c7513 Fixup of Connection e6c259a More blob support, and break binary protocol AGAIN 4937d08 Serverside usertexture support a965a37 Reconnect bugfix c48af48 Proper fix for supression bug 12fe384 Working Linux OpenGL overlay 2007-07-04 Thorvald Natvig bfe2270 Testfix for 1746996 4dc29c6 Text fixups 115f114 Functional gl injection on linux games fede5fc Mumble-side of Linux overlay 2007-07-03 Thorvald Natvig 75d245d Config fixes f87c058 Updated overlay for Win32, should now be possible to port it to Linux. 7da4eba Updated french translation from Damien Rannou and Thibaut Girka. 2007-07-02 Thorvald Natvig 5b930d1 Consider connecting "Activity" 71f9d65 Typo in ConnectDialog 0338060 Need to distribute QtXml too. 19ff55e Correct path in client browser. 074fc02 Correct path for server registration 7b1cc75 Server Browser 8190ea1 Patch cleanups. 4434fbd Keep stream version at 8. f9068cb TextMessage patch by Mikkel Krautz 3aeb072 Fix fake DBus for Win32 82ffa89 DBus based authentication, based on patch from Thibaut Girka f9b2025 Fixed softmixer 2007-07-01 Álvaro Manuel Recio Pérez 880c997 Updated translation Thorvald Natvig 2d5b88c Remove default buttons until they're fixed. 2007-06-30 Martin Skilnand 0fe82f4 Fix alpha blending in some icons. Was due to indexed colors in source files. Need to see a test version to verify quality. Thorvald Natvig c08b1fe Registration part for the server browser d1ffed0 Fix recursion bug in getGroup a08f13f Update overlay on disconnect. 2f6bd48 Add mysql.sql to distribution cbbb73d Avoid double-allocation of outgoing packets 2ef9c1d Start of zero-copy UDP thread 2007-06-29 Thorvald Natvig 8d09fcc French translation from Damien Rannou e7b260e Updates for new binary protocol. e19057f Reserve space a9008bd New datastream. Breaks all kinds of things 2007-06-28 Álvaro Manuel Recio Pérez e2a05bc Updated Spanish translation Thorvald Natvig 960fa0c Forgot to rerun lupdate prior to release. Oops. 2007-06-27 Thorvald Natvig df7153c More descriptive information for horizontal splitter. 50c7fc4 Bump version to 1.0.0 2007-06-26 Thorvald Natvig 3c57cab Changelog update df09fd7 Fix race in UDP thread creation 4351e29 Fixed demonizing on Linux 44e43ea Daemonized murmur 2007-06-25 Thorvald Natvig df31097 Softmixed ALSA 2007-06-24 Thorvald Natvig d0ade65 Start of mix-it-all-together ALSA support 1888f38 Add MMX based software mixer 38f5604 ALSA Config dialog ff8266c Fix crashbug on late UDP packets 28ad3e9 Try externals 2007-06-23 Thorvald Natvig dd39467 Festival under Linux 2007-06-22 Thorvald Natvig be21e28 Make new timeout code lock-safe on Qt 4.2. Oops. 77cf932 Add shortcut to quit application, and add standard shortcuts for a few other actions. 2007-06-21 Thorvald Natvig 8bdff0b Really close on mainwindow close c3851b5 Fix a few bugs, add -h to murmur 2007-06-20 Thorvald Natvig 1032f63 Train coding session. Connections have a timeout on the server. Config dialog will add a scrollbar if needed. ServerDB doesn't create deprecated tables. Ghost handling autokicks if old ip == new ip, even if unregistered. Added some more locks to the thread handling. 2007-06-18 Thorvald Natvig f2eaeb2 Explicitly used queued connections for UDP thread. 2007-06-16 Thorvald Natvig 0941196 Allow adding groups again 2007-06-15 Thorvald Natvig e18767b Option to expand all channels when connecting [Feture Req 1619001] 2007-06-13 Thorvald Natvig 9ceb357 Make DBUS bindings conform to Qt standard, fix Introspection bugs 1d9675f Binary linux server release script f49b38b QLatin1String 1dee004 More database updates 2007-06-12 Thorvald Natvig 4c237b2 Open connect dialog on program start 08edc1d Last part of qstring fixes and some qt 4.3 fixes for win32. 9dafd37 Update copyrights to 2007 20d1771 Support fully static build of murmur 07531c5 QString::fromAscii b20e0e1 Updated Ubuntu build scripts 477a706 Updated source-release scripts dd06d83 Make .mumble.sqlite hidden 7f40e44 Remove deprecated Commands.txt 563f986 Multiple dbus sources 2007-06-11 Thorvald Natvig df89923 Clarified licensing of binaries 9577644 Initial multi-database support 8a1f436 Fast path UDP thread 057c270 Ensure correct include path 28d984b Implemented all DBUS functions 2007-06-08 Thorvald Natvig 500013b update connections table when changing channel 73e91ad DBus skeleton functions done, seems to work 2007-06-05 Thorvald Natvig 7ce31fd Don't install DBus on win32 3f35825 Functional DBUS 2007-05-29 Thorvald Natvig 9a1016e Install QtDBus on Win32, and go back to Qt 4.2 until 4.3 is actually released. 2007-05-28 Thorvald Natvig 7da815d Initial DBus tests 8606909 Setting period size changes the pointed to int 74b1492 Dead code removal f28d9ae Restored the "Microphone Loudness" information. 19fdb33 SNR based voice detect 2007-05-24 Thorvald Natvig 060701b restored icons 10a17f9 Post-refactoring cleanups. 56bf13f Speex is now a static library, don't include the old dll in the installer. 111ffe6 Linux build updates 3f3709e Updates to speex build for Linux 3b0fa27 Refactoring. Updated licenses to 2007 versions. 4151f4b Refactoring 3be4aec No longer manually reset preprocessor loudness. 2007-05-23 Thorvald Natvig 99a73c9 Updating to SVN Speex again. Missing voice detection. a1ba433 Avoid contignous disk access in murmur, patch by buggerone 0d9f5d0 Applied ALSA patch from uz_ Made some minor corrections to installer in preparation for Qt4.3 2007-03-03 Thorvald Natvig 9ca4935 Bugfix: Iterating all connected players should only iterate players that are also logged on. 2006-12-21 Kjetil Jørgensen 61869c8 Connect-dialog available while connected. When connectiong while connected, an implicit disconnect will be issued first. 4 whitespaces replaced with a tab 2006-12-17 Thorvald Natvig dd2bcee Murmur should read .ini file before opening DB. [patch by buggerone] 2006-12-13 Thorvald Natvig 1caac42 Use .ini file in executable directory if it exists. 2006-12-04 Thorvald Natvig c7caa3a Don't translate registry strings. 373bd84 Use Qt 4.2's saveGeometry/restoreGeometry 2006-12-02 Thorvald Natvig 897b097 Updated paths to match recommendations from Wiki 2006-11-27 Thorvald Natvig e652e5d Add firmumble.inc to tarball 2006-11-26 Thorvald Natvig cf88b1f Added Russian translation. Added icon for LookConfig 2006-11-24 Martin Skilnand bac023f Updated config_shortcuts.png with better look and feel and added config_ui.png for evaluation by lead programmer. 2006-11-23 Thorvald Natvig 6f09e6b Tiny typo correction. 2006-11-18 Thorvald Natvig a213324 Add LookConfig 2006-11-15 Thorvald Natvig 3ebdd1c Look&Feel Config. Skinning support. 2006-11-03 Thorvald Natvig 9a36950 Switch to use QSystemTrayIcon 2006-10-30 Thorvald Natvig b6482fa Bitrate info in AudioDialog is now translated. 9cf751e bump version 5e78a5d Add version info for debian builds 344a677 Updated the speex build files for win32 3069c21 qt4 lrelease. *Sigh* 2bcd9bd Changelog update 3965f15 Add lrelase for debian build dd33406 Last batch of translations for 0.9.4 2006-10-27 Thorvald Natvig a52b320 Don't save Win-only settings on non-win32. 73adf9c Reduce initial buffer fill 85bdeb2 Edgy Eft 2006-10-26 Thorvald Natvig e2e41e7 Negative user feedback on the new speex preprocessor; revert to last beta until it's finished. 2006-10-25 Thorvald Natvig 8bd4513 Fixing of audiostats for new speex. 01eb8dd Support for new Speex preprocessor which doesn't export it's data. 2006-10-24 Thorvald Natvig 7be4fc2 Updates for connectdialog in qt 4.2. 2006-10-20 Thorvald Natvig dc7980d DirectInput workaround for keyboards with thousands of buttons. 2006-10-17 Thorvald Natvig 34f0bee Grammar fixes 5d83197 Even more translatable strings 2006-10-16 Thorvald Natvig 071eca4 Add a few more strings for translation. 2006-10-15 Thorvald Natvig 692a929 Updated translation settings. 2006-10-14 Thorvald Natvig 5fbf4c8 Minor typo in translation fixed. 37b6911 VersionCheck shouldn't bail if it can't read the binary. 3843209 German translation provided by Matthias Vogelgesang (m0ta@sf.net) Spanish translation provided by Álvaro M. Recio Pérez (naproxeno@sf.net) Added more strings to be translated based on patch by m0ta. Made translation files embedded in binary. efda664 Working Globalkeys for X11 2006-10-12 Thorvald Natvig 4e24929 More globalkeys linux. Mostly messed up. 401abe9 Add Turkish translation 2006-10-11 Thorvald Natvig c92a962 Start of shortcuts for X11 2006-10-08 Thorvald Natvig d8f202b Fix for new modelview in 4.2.0. Now possible to drop in root channel again. 2006-10-05 Thorvald Natvig 338d506 Update for QT 4.2.0 74119e3 Update debug output slightly 2006-10-04 Thorvald Natvig cd69712 Murmur can now compile on compilers without Precompiled Headers. 6a07185 Split windows debug into separate file, add proper crashlog to the Console.txt 2006-10-02 Martin Skilnand a27c690 New temporary icon for shortcuts as requested by lead developer. Marius Grannæs 099b268 Added a more informative description. Thorvald Natvig 349f013 Console.txt error logging and fixed some shortcut bugs d7cdbc3 Spelling fixes 6ffa52e Prepare for Spanish translation. 41b7ce9 Add icon to dialog, fix a few bugs 860469f Dumped DI actions in favor of raw.. Which enables more fancy combinations, but DIA was standardized.. If only the config dialog had been prettier. aac37d0 Overlay nothing/all/talking as config option 741e65b Bump version 2006-09-29 Thorvald Natvig f7ddd6a ubuntu dapper build 2006-09-28 Thorvald Natvig a889f99 Older speex libraries don't have speex_echo_ctl 11fd8d0 Add pch files to tarball and mention PCH in INSTALL 2006-09-25 Thorvald Natvig c571563 Set sample rate for echo canceller 2006-09-22 Thorvald Natvig 5029ff8 Password resend e6b43de Updated Overlay error message. 55212bd Changelog update 3f41e7d SVN Changelog 7491c2e 2006 updates 2006-09-21 Thorvald Natvig af2452d Overlay crash fix d107d80 Cleaned up overlay interface and made it show mute/deafen status. 2a1bfcb GUI for reconnect 8fa9adb Allow connect directly to channels you're supressed in without crashing. 8718d9a Automatic reconnect (GUI config missing) 2006-09-20 Martin Skilnand 62b3213 Third try for talking_alt.png icon color. b34849e Updated icons, to remove white border on _on&_off and to try a lighter shade on _alt. Thorvald Natvig 8fea9ce TTS Volume adjustable 2006-09-19 Martin Skilnand 38398b6 Added muted_local.png and talking_alt.png after request from main developer. Thorvald Natvig 10ecf31 Added local mute and updated icons. 070248a Fixed push-to-talk, which I broke. Fixed overlay for players in other channels. 2006-09-18 Thorvald Natvig ef67602 Swapped privileges for Speak and AltSpeak 9c2e8a2 Various AltSpeak fixes. Fixed Deny-Speak-Implies-Mute on remembered channel freeze. Don't set high priority in debug client. aa95258 write does not imply speak e82c0f8 Support no-exception compile to avoid mingw lib dependency. 7e85259 AltSpeak 2006-08-25 Thorvald Natvig ac4f1c5 Updated overlay to compile with newer DX SDK 2006-08-23 Thorvald Natvig e8512e0 Updated defaults for 3D sound 2006-06-05 Thorvald Natvig 4bc4de8 The client now works on Linux, and FMOD is no longer used. dcff32d Removed FMOD from distribution 412ff94 TrayIcon should hide ec35202 Poll() based ALSA, sigio crashes X 64f97f7 Ubtuntu has ancient Speex. 23301d0 Initial ALSA Skeleton 2006-05-31 Thorvald Natvig 388b34a Use ALSA on Linux 30c2bed Compiles on Linux again 2006-05-27 Thorvald Natvig a850488 QT 4.1.3 updates 2006-05-05 Thorvald Natvig c5f5f18 Updates for new speex jitter buffer 2006-03-29 Thorvald Natvig 2c84f58 WoW 1.10 d4dd9ca Minor updates 2006-03-17 Thorvald Natvig 815e884 UNIX murmur compile fixes 5148d0b Qt 4.1.1 Allow TCP Compability mode (with TCP_NODELAY) for people with seriously broken ISPs. 2006-03-01 Thorvald Natvig fa9df03 No longer default export of wow plugin, as it's out of date. 229de2c Try EF type of service first. Also, more conservative defaults for audio settings, as the current defaults cause problems on most AC97 onboard cards. 2006-02-14 Thorvald Natvig 9290b59 Server IP TOS 09b5cf3 IP Type of Service 2006-01-29 Thorvald Natvig e2112d1 Longer AudioHold 2006-01-18 Thorvald Natvig cbaa6dd Textfile changes for the Linux release. 06a6817 Initial Linux testing work 13e0471 missing distfiles 2006-01-17 Thorvald Natvig 2e17851 Linux compiles clean dccc416 Forgot to check in pch headers 7efd9c5 Fixed FMOD 8a5165f FMOD support, not working yet though. 2006-01-11 Thorvald Natvig a1553af WoW 1.9.1 updates 2005-12-31 Thorvald Natvig e190a91 Precompiled header support 2005-12-25 Thorvald Natvig 4a934a8 Require 4.1.0 for mumble client, as that seems to work without patching Qt (which was required for 4.0.1) 3b910c6 Support max # users limitation on server. 2005-12-24 Thorvald Natvig 1ba4259 Update installer for Qt 4.1.0 4ef384a Qt 4.1.0 compilation fixes. ca3c73c Remove support for doppler effects; only works on a few soundcards, and makes sound horrible for anyone else that tries to enable it. 2005-12-23 Thorvald Natvig f6753d1 Create DSound buffer in same thread it's used, and let buffers linger for 5 secs before destroying them; some soundcards don't handle buffer creation very well. 2005-12-20 Thorvald Natvig 662e8fd wow support. Fixed a bug with some hardware 3d cards. 2005-12-19 Thorvald Natvig ec0bc48 Update version to 0.9.3 2005-12-16 Thorvald Natvig 1bcf0d9 average bandwidth over short time to avoid being kicked for VBR spike a531aaf Bugfixing bandwidth limits c02e331 Maximum bandwidth setting serverside. 2005-12-15 Thorvald Natvig 50e297c Allow _ in email addresses (darn@the-space.net) 2005-12-13 Thorvald Natvig 3a9374c Visualize all parts of the echo weights. d0f2538 rename from libspeex.dll to just speex.dll 2005-12-12 Thorvald Natvig ae2fcbd Updates to enable compilation on Linux, even if it's missing features. 2005-12-09 Thorvald Natvig d94f13b Enable ASIO with 32bit input. Needs verification. ccd63ed Visualization of echo canceller, and some testing.. Seems the weights get set non-optimally. 2005-12-08 Thorvald Natvig 1080265 Support graceful failure of loading the overlay (For Win2k support) 2005-12-04 Thorvald Natvig ba112bc Update INSTALL to reflect we now require Boost 7ac4637 Use boost::shared_ptr<> for objects shared between threads that we need to delete(). (AudioInput and Output mostly). 2005-12-03 Thorvald Natvig 543b19b Visualize power spectrum of input and noise estimate. 63179b9 Add fftpwrap for speex compile 2005-11-09 Thorvald Natvig 99d3749 Ping support 2005-10-14 Thorvald Natvig a2e714a make "Toggle overlay" a tristate; show only talking, show all or show none. 2005-10-13 Thorvald Natvig 084d465 Banlist editor. 6afe64a Removed TCP voice support; with Nagle it will always be laggy. Added message to query/set banlist. Reordered message ids. 2005-10-12 Thorvald Natvig 756ba78 Banlist (serverside). c4dbb06 Bump version 819ff2f Rename player support. 2005-10-09 Thorvald Natvig 753f26f Set sId=0 when closing 2005-10-05 Martin Skilnand d339b2b New icons for ASIO and OSD settings Thorvald Natvig a414c4c Audio bugfixing. Added new icons to code. 97b0ea1 Fix for multispeex-packet in UDP mode. 1a6e228 Immediate update of overlay on parameter change 2005-10-04 Thorvald Natvig fa62712 Debugging of ~sub 51555bf sub,a,b,c groups 09c24ee Config for overlay. 48d79e9 Make hooking less resource intensive on system. 2005-10-03 Thorvald Natvig 00f231b Overlay. 2005-10-01 Thorvald Natvig e21d62f Bold speec probability when we would transmit. Fix the SSE detection. 87b8010 Tooltips & whatsthis for the bitrate in AudioConfig. Bail out if SSE not detected (as we ship binaries which require it). 4bfb790 Variable number of frames / packet cda5095 Various bugfixes. Added metakey for shortcuts, to join channel instead of talk-to channel. Update to match timestamp in jitterbuffer in speex. e7eae88 Add uninstaller to Add/Remove programs in control panel. 2005-09-30 Thorvald Natvig f0dc0a1 Example of how to link murmur to other servers, using qstat 7e15f99 Fix "in" and "out" groups. 219d946 More command interface. f778342 Serverside commands through SQL. f2233fd Experimentation with non-actionmapped directinput; will be a lot of GUI work though. Added push-to-link support to the server. bd5f2d4 Version to 0.9.1 dd60a2b Channel linking, part 2. 2005-09-29 Thorvald Natvig 2c12d88 Channel linking, part 1. 2382f40 Cache ACL lookups. c0f9577 Kick off ghost connections, refuse connections with same name for anonymous users. 7f014bc Connection table in sqlite 3478060 Include murmur.ini 3ab26fe Use class references in headers instead of .h files, reduces dependency path to more sane levels. 2005-09-28 Thorvald Natvig faceb19 Move config into registrars. 62dd4ef Remove ACLs when removing channel 2005-09-27 Martin Skilnand d43f59e New icon for channel linked... f026171 Fixed authenticated and changed R shape into A shape. New channel icon Thorvald Natvig a035a3c Fix flag display 6794972 lowercase groupnames 155d342 Massively reduce debugging statements. 4c7a6f7 PlayerModel fixes, work around bug in QSet operator == 4d52920 Doubleclick to join channel cb84309 Rewrote the player model, should be more "in tune" with Qts method of referencing items now. Made the iconlist in the config dialog resizable. Updated "reg" to "auth" in a few places. 2005-09-26 Thorvald Natvig 3c55c1f qPrintable() 6f4c0b6 Fix tree e705eb1 Bugfixing session 66e90fb Tooltips and whatsthis for ACL part of ACLEditor. 2005-09-25 Thorvald Natvig 5fc1e91 Have long strings in "" in .ini files. aa1d309 .ini files for the server, updating documentation to reflect this. 93fe6b8 Functional ACL/Group editor. Let the bugfest commence. ff614da ACLEditor, ACL actions started, server bugfixes. 5c24663 ACLEditor, GUI elements done, missing action-logic. 2005-09-24 Thorvald Natvig 620f4dd ACLEditor, server part. 5ec2fcf Bugfixes from testing (release of 3d buffer, saving of transmit from settings, better rolloff defaults, smaller indentation for the channelview). 2005-09-23 Thorvald Natvig 3e52eaa Warning fixes. fdde84f On channel creation, add creator to "admin" group. 7f73d73 Channel ACLs and groups. (Still missing a edit function) 2005-09-22 Thorvald Natvig c1f3446 Update version string e27b074 Preliminary support for channels 2005-09-21 Thorvald Natvig 3efd365 Only check if registered player if there ARE registered players. Without any, everybody is priviliged. ae8b33e like = 2005-09-20 Martin Skilnand 6881c4d Made icon slightly fatter... e589da5 New icon for registered users Thorvald Natvig 578978a Slightly more agressive defaults, sounds better for most people. f23d9f7 Slightly more permissive namecheck 15bc047 Only registered users can mute/deafen/kick others 540b5cc And remove the authcode used... d0df397 Notify use when it succeeded as well. eb41fcf Registration script. 2691157 Empty tts should not be spoken. 0548bfe Welcome messages. a465ab4 Per-player password. Persistant storage on server. Minor ASIO fixes. 2005-09-19 Thorvald Natvig 9540220 Final part of UDP implementation. 62f573b UDP bugfixes on server. b36bf6d Version 0.3.2. First part of UDP support. 46d1a8d No console in release! 3ca1264 Provide feedback if an error occured. 1072c99 Minimize to tray. 2005-09-18 Thorvald Natvig a482c8d Start of unix compiles for mumble 00a2599 Spelling fixes 9080126 Typo in MainWindow fixed. Made the BF2 plugin slightly more picky about what values it accepts. 7798861 When sampling speakers, encode the cleaned output, not the original. Add clean signal power to the audio stats. 6f0577d About Speex dialog, still waiting for the icon. 419e2e5 Echo Canceller for inputs that can sample the speakers. de4b674 ASIO Audio Input 2005-09-16 Thorvald Natvig 67e3d85 Single-threaded directsound output 3d9e12b Change version to 0.3.1 180e4b5 Don't send implied messages anymore, the client already knows 75cf4ea Send the player object to AudioOutputPlayer, not just the sId. 95d066d Fix the versionchecker so it doesn't delete itself before showing the message. 7250279 Fixups for release script 2cdf489 Failing to open DirectSound shouldn't be fatal, just a messagebox error Add Apply button to the config screen 9bc83a6 Fix a few missing Q_OBJECT ef307bd Fixed a few bugs with positional audio Made a lot more member functions const Moved playerId to Global, it didn't belong in MainWindow 2005-09-15 Martin Skilnand 8fced49 Pixmap for Game plugin screen 2005-09-14 Thorvald Natvig 6225c04 Bugfixes for positional Audio Added a Center Position hotkey, to force yourself and all others to a center audio position, usefull to give commands to the whole group. eb7e1be Positional Audio Plugins Ability to switch input/output device without restart Version changed to 0.3.0cvs 2005-09-13 Martin Skilnand 9f73177 Pixmaps for config windows. Kjetil Jørgensen fa4114d Added (unfinished) config dialog for DX Audio. Thorvald Natvig a5391bb Use selected device from DXConfig. Still needs to close/reopen on ConfigDialog exit. b936144 New icons used in config 2412c5e Adjustable jitter buffer initial size ec3af68 More tooltips and whatsthis 23bd3a6 ToolTips and WhatsThis for rest of application. 2005-09-12 Thorvald Natvig f7254f3 Global Log class, which remembers what should be logged to console and TTS Fixed infinite selfrecursion in MainWindow, the application now actually exits when you close it instead of silently crashing b8fc8f4 Make versionchecking a userinitiated action 70df36b Add lots of detailed tooltips. Our first piece of documentation. 85825a8 Finish basic config widget for audio Added config options for compression and amplification Moved a few menu things into the config Keep user settings in Settings and statevars in Global fadd3fa When using nested layouts, Qt barfs if a widget already has a parent, so make sure it doesn't. e465ae6 Fixed crash bug if opening player menu while unconnected 6b49928 Centralized configuration dialog 2005-09-11 Thorvald Natvig 5d6a49d Switch a few QMutex to QReadWriteLock, and start using QMutexLocker, QReadLocker etc 6cf17df Squashed 3 QT bugs, submitted patches, and can now use them in our application. 90e84d4 DTX transmission support 6c9df68 Export symbol files for debugging of release builds 9d7fa85 Window title for the audiostats 6ed4a96 Set thread priorities; gui is LOW priority, but as we can't set it low we set everything else high. 2005-09-10 Martin Skilnand 04ae86a Status icons for user window Thorvald Natvig d290745 Audio statistics window beb7b04 Make list of players sorted by name and make local user bold 6a5e9cc Offset status icons by 1 pixel c5c9848 Turn cvs log into CHANGES, and restart CHANGES to get rid of cvs log messages for it 2005-09-09 Thorvald Natvig 093edde recent updates 613fec9 Deaf implies Mute logic in Server, and add ability to mute/deaf players again (added PlayerModel::getPlayer from index) 1b8ac3e QHash, foreach() and STL iterators. What ever gave me the idea QMap was a hash to begin with? 3fc5d6e Model-player-list. Work in progress 2005-09-08 Thorvald Natvig 021d58b Compile bugs in VersionCheck, update version in About dialog as well 88a69ca Change versions to 0.2.3cvs 1895db1 Avoid conflicts for MUMBLE_RELEASE 9fb7f82 Use new Connection slots for Server Make server log include date/time c01e34f Discover the magic of QObject::sender() and fix some leftover bugs from the refactorization be1a64d Refactor c325e72 Oops, we're working on 0.2.2, not 0.2.1 which is already released 84ca9db Remove compile warnings, and there sure were a lot of them Work around -Wshadow bug in gcc dfe76ed Turn g_ into Global, part 2 870ce04 Turn g_ into struct Global, part 1 4d6ba18 Remove m_ from everything 2005-09-07 Thorvald Natvig d82af08 Track both initiator and victim of actions 3e948bb Make all messageboxes use "Mumble" as the title, to follow the GUI guides 4ce9b9b Check version against sourceforge 15fc873 Show correct version in title 2d92fb8 Separate log window 8658883 Reduce dependencies in MainWindow.h 3475fc3 Add changes file Add persistant storage of server lists 9a73682 Increase default volume gain a9cf5fb Commit database 3a71488 Configure database for persistent storage 2005-09-06 Thorvald Natvig c53fbf9 **** the password field 5b86dd3 Fix args for window title ca7fec9 Exchange and display selfmute/selfdeaf a4289cf Audio Input/Output registration 465b636 Support self-mute/self-deafen. Start support for input/output configs 2005-09-05 Martin Skilnand 0705156 Temporary icon for alpha and beta stage Thorvald Natvig 6be61b3 config=profile to keep debug info for external profilers 5206193 Make the buffer what we need 3006847 Make it possible to abort connections, and display self-talk same as the others b140df7 More verifications 1814bb3 Make ids recyclable over time instead of immediately, and validate that the "target" of messages is actually valid. c4a0940 The FIRST loaded icon will be the appicon. Make sure it's the smallest. This really is buggy, Qt! f2754d3 MainWindow actiongroup for voicetrigger fixed build system fixed to use proper conditionals 1cd90fe Release build should NOT have the damn console! 0e42898 Release script fixes de8d70f Basic connect dialog aca3f3c About dialog with icon f08f825 Need all 3 icon sizes 6c5e300 Hopefully binary? ddaf56b Fixed... 1ea5a6c .. but Qt can't use windows resources to store images. d52f78b Added readme to installer Fixed crashbug in Server Made connection only emit disconnected once 6e5f88e Add readme 61ae1a1 Global settings and data exchange b1c2795 Shortcuts for muting self, removed compile warnings 7c3ae17 Text-To-Speech ef77c9c Actually poll the DirectInput devices too. 05acf99 Global shortcuts 2005-09-04 Thorvald Natvig 2ab6c96 Handle authentication, rejections and propagated error messages ce7ae41 Propagate connection errors for display 013fdea When disconnecting, just signal the thread that it's time to end, don't yank the socket or QT complains b840521 Support logging in with pw d7b7e9b handle authenticate/reject in networkToMessage 4818018 Proper connect dialog 9e57b20 Use compression for zips 7564d64 Add scripts to release source code 5d9d54a Versions in projects 65b705b debug_and_release 7e2405a Because they changed the signal in Qt 4.0.1 3b770e6 Why doesn't closed buffered sockets ever error() on disconnection? bf304fe Encode and display "speaking" state 37c10ca Accept some paramenters for murmur, to enable e.g. local loop test 1955a89 Update libspeex makefile to match dynamic libs Move license agreements to installer instead of embedded in program d99273e License files for qt and speex for installer b46b0f6 Dynamic release, only need licenses in installer/as files 2005-09-03 Thorvald Natvig 9c3c797 Forgot to checkin the new about dialog. Ahem. 2af8e4b Since we depend on mingw dlls anyway, switch to full dynamic linking and add an installer 87c0e0b remove debug output aa110d2 Kick 8feb561 Clean up UI, implement kick, remove debug for missing validators f43a4e9 Ooops, that was a debug statement 37bc1d6 DTX is broken a9b67d1 Server testing 3d67f4c Send deaf/mute on connect 2005-09-02 Thorvald Natvig 1e818ff Player Mute/Deaf, global Player c31108e DTX Support Make list of players at least somewhat usefull dc3e802 Add sequence to speex packet fdda9c3 Fix memory leak, it's now safe to pass stack-allocated messages 8f10abc About box, licenses included, and clean build in mingw f21fdf7 Let's try licenses again... 3e4fc1b licenses for about dialog 81623dd First functional audio test d7a47d9 connect() typo, and increased AGC 50% dd94e9d Pass QByteArrays instead of messages, much cleaner with refcounts 3b4b165 Initial DX Audio 2005-09-01 Thorvald Natvig a8e03ea Initial audio framework 828a022 Shorten down messages by making id and type 1 byte each daa74ad actually do something with messages 911ea20 debugging network e1bf768 First test of network protocol d9d814b Disconnect on errors, don't send disconnect unless authenticated aaf9366 Compile fixed 29e161f virtual destructor (to avoid nag) 0767e88 Initial version of the server 12acf13 Network structures dda3954 More data checking d51c2f6 Initial datastructures 2005-08-31 (no author) <(no author)@05730e5d-ab1b-0410-a4ac-84af385074fa> 08f0e1d New repository initialized by cvs2svn. Thorvald Natvig 1a04a2a Initial setup of project mumble-1.3.4/themes/0000775000175000017500000000000014010707274014127 5ustar builderbuildermumble-1.3.4/themes/Classic/0000775000175000017500000000000014010707274015510 5ustar builderbuildermumble-1.3.4/themes/Classic/config_audio_input.png0000664000175000017500000002410214010707274022062 0ustar builderbuilderPNG  IHDR``w8( IDATxX,Y`otmBg۶m[ mJc.kpƠ>s#veVs1C\zEpm3a*:*--˂-vl$ }c8M^ߖ.($$i !,K}=9N3k@olh#,aܝJ%_6~-tcqĆƋMY6H=dp}3ZG7O$]tC p!u^*-`p9xx)4L< cJootz["|gWwpfsuuuS7<`4TƆ+; I~͙\gP!W@U6pwq[SsANwWXlt:ݣi,3q u wq63_/:EDH.BGa"uO&i>eF+GTq}cB!]Uil`󷵵/'fS]9a@KHkʁp&(()HD5{<} <ܡt>n"]x0~9pz:i7\]DrO_Nxܘht---{XgnlFH0H0p!k g]נjr%"|{4+ϫ.EƎ|@{ B.[.ΕMw@SS]=vH4cjR)d3O҄320@г,B\]nQmae؄*kJ1Vj`g6Y)B|,HBbX-bI @WOMtm $؟7zQ 1q%qo5I:Nb>;eʔgrqk H {pTDJ.@1 744 re 7 rl)E6AnW6WBpL!fvۋҤU-J$HXGkMpEvrt[JD`b[|A\6*.hrQƏ0꺣!+ 2!(. Kwϯ4if@0?DA^$1.|l^xhdj0ƲOR50ǸYfcfffcfffef&)ꆍ+]i!)^bPXkv:3/Y䋲l9͎I9xH*`ܗ~*Et.e;SbHF)cS 9䡃xrb~3 `C휳D"'r$H45 :ks~Hΐ*DVfF^K7ŀzvor <1#vK<OKM)Uemb"e" U?1 {((,~ڵZ7:l"ϧE?aܽ.q⚰Lrjzzjؾcfff?Dŋ0.voD絡Z#΂IbgΜyō23sI0S[[nWYg_癰y2c`u#G`J *e]5>/9G1C`((2r˟y>,/:hB]c&ˆf$>-is'|CHͺsRx' rDi'P‚]kBL p@2@ovtHLVt.ڐ/Hm?J;Ι􎙏_ 1dv~#!n@n`b|L/(굺jBWU47Mƫ2`ӧ|gD7"F`Es^؝狴n7Hw(),vl~J;cYu>wU s]^x$ʒ.0T bW&Yiw ;~CH>Z|oeHwFjU.% u`rqqǖE(;O_if4LkJ(ggϜ;x_j{e;G2]&X5+s\2oֱh+kHn/*!! D'x\1ڴy6 %y68 #[O:nЏ'a'PA8:t<&JAp\}"5^*;T39OhP=AR-33XnsFFGVVWVguVúJUMuz]*jx4=,+ 7^K[^SH*igAGi _Ae>-hN78aUrtvn5-9|LD~C"<KFUUfQY/6y7<4( Ew;M0v^]51kZcG`Ν`"nH!YC +Ξ9hs(wmY!~L?X"he!ϋ- KVp{"@(d˄B) lۼ{bM%'oa[ B^rF6GLN|V T-/ ѐ e$a,of͍9|I vߓqBbzzhgc歴lZU7ΘV%XMn\차') [8cc&GATRHoI|uSdJ`Xbi!NfKh2 5ʶȜ '[" è1M8M5Jq2BgD J|d.(|Ge0 m*u>, G恴X* 0kg6؟@RgiJ{6-)\~fXl]S9ˇ%[õ 舕rX5Mmd5(*=m=O"0Y2etC%.y'@xOV`b4e<ğM!WƢBR"W]*aFr>TKif ]%`bEIcۡ  ΍֯7gϞ;]YxK[”Jʀ,qHQXpEas2L ׌ a-1S+W,asPW IYUⳭAm1ЪK#dFo&8{diq'W[g|"u!SjH,k}i QH*;)u)@{}0Ԩ]50a(j[dO(>^Rk3 Tqhh4{Lsw֮LBӺXx Q ;,-f1+6m\Oiv]^cMMѾ>j[L8̓hwWN_5XTK(  nvݘu>@P%~!fa F`ac:.}F!šh'{c_QmC6Z%(153j Ϩknw/&Da#!P B0M |l_>$Ihr6ȏ"Nf?)UU .OP% [7 uZ7Kޔj-a繲D@f̘ @)1ާDVį{qĠcu>J49DQ y?GoO|" X I]|uB(; f=e8ɴ5 hr VM$8Zcw=DmEȎz s,t[R~x%!] )_l㳛+5f0f0`yOl֙`ds.&,Ŝ1=OJO9ݳK8HK[n[dkerO$SXxD_c; 0"h䜦-Rjՙ)"p$^#'&b9>үIH$Lá6D߷ۼk~;V6msS düawJѧ; a8/ ![WÍO &t   b<{d-уEGے|`<ߗ V- DAADѩO{ߗlٹ~vͬRkVk@XP$~m@ 6!%(Q1Ec"FCoZ-Mp F]r+;$]rckN ΂ >#ͦ>M7}?wvnnƲk=-pMW'CiF'FϿ|+RNww(LfG/t~8e.7N{kkׂWB͐;7;7G2GSCȕ0E#zA2UM)nj{9#]dibo_y敿.%H|Sweݙ6Z #2\:w{_#eSaF9x.;z ؏'OH~] Щ㽈Qy>DI[OfMFC9ku]z%HC.n\zz>3}}ݷN`#vtg6ӽG.+̗L5+1>h?u)1quhFա|69-U ƕ/#Os/65 fFM#R'v=."((gי4 v:~S,y޻V t۲qN֭[%"ئsIP-AګPF9 L3 πBAG\k8fqf Zgx>|K~ ahi1'Ĝ"iyvx;{.$lN@<׶W,Mu0o;l4AH@'`6,+݁?cI(3|t-CC!{j4./cĪ4캶%7Tz88F'0Ca҉Z8[\Sh. >bDta6TDAəF!;1.M4MlӇn~c=5ևI8W0q 'W>в~e 8na5(Y=qQHšsiFdH"ƥˋ.pC{0=proE]!stҖ+ߒěVт&i>-k]ouk6;dFIpj#:eZP*" 1eDB2Lk͙2-`֗yz/׹xTs-/}/>f_fG LӨ&Vۆjܯ˿gr3p'G;tOcGla\ . |!#"EBտ7QF,-LZHm6h ҁYM|nbr"3cQϻN?N7㼲=G6K4=ss~(=`_`[N`P x@qX鐸 J>#`bs.+8ޟ>Tj ʙyּjx= Ծ8Q2q9fa[k> aֳS-A BH@<@ ),!@??:?oU_2dcNm15*%dAF% AX6rK tҀ(aЕ"o,'zR/ :'6u,;B4GARsvy˚90c "ul Sd%R <XX)Q5gz;r"H~59x?%2zϔ$ X0ƑHJ@a=&DW:!n| H>Ձ%'q#`@:8!-YXH/ JlV†ePTY9?Mk-y&c ͔WF-b'0?w$0΄|!WdD[/i@Eުo㯫8>D%/L0NLÎ&YZ_x]-_G9:BaE-d@ &RiX* s:q}~悘dCZ}CۂE0't^7`4 ZA &=pSbg)C2 CTJ"$$D>&0F8tn¥Sp% UAb_FİLCŸu~-r3jzàA3gFSdxTگ{TJB Q)L>MԬX}^E;~s8n\\>WVqdi\;5y_@(UW*&=}C0BFL—P"9ʐ[$0C7U@D d 9ߩHPb=ܵgaܒº;Oenhԩ3[3QFTOc?hr}S}نFdqa 7췈4z 4ƓAzai֐ LC00(ƭtT,mV;yͯ};mp3Xbv>([_8wĞu5tMhnb@iK )| }ߔ7E>4jiq‘χe wh c> &7M?Gdc6h ! p &($4bz؃ґ@0b L KXwMdmVvU`l܃~h\':6(t/fL~WxyChm<ͭmF@|R;_f( M` E'[BL)UL+jj6Z!)wsz`bm7̀k^toƖcpe!;; /:KpdЉNJݴdtũ'&qtPp9]%f%8O>@o%znI't&)>sӖӅjfgIa6<) 6F L:M$kHֶ`&w*a)Vo! ``ݔՂu/c5d֢hH[t,x rOe=& 3v Ƌhj_xjA yIins9;̭KE"IF^BI1|%2D"E-BC@"p<&z:VZن*F#@:툞`@{5;!ЙaAFghU5f3琬܃>%NZPҌLЁFXV(}P_%kkė&&(gG (PQx폂1`;_E?Ε-A*'V2pmcUt#[x :hM"|5fKs\]´pm01XJ-:%L6 IŬT`ާcTT>kc? SRP L;\znO:_5$Nppc€ԂXZJR۫I *2x3$HBWzqQ[rl(Qu!(>V㮀"Xe ,Q!˃d|v kwԐpSC|N԰؆ *8#|1Ht[qKV8q,EIxއ~Dȯ }4 0%esd(2Z:a9 Dƞ;`3kXn!)8% z'=؇L tXWέH;Kl; 龜* rAZj@tC|YA0Ր=?ֲfj9w|d]]ypiGY{i'~uw\Ös'V![sK<I3rե5lthQi1){wI5#o0MyuA/nd?$|3}IݎWZR\_s/7~'aIčh˲F*sm0~&hv=,-[vl9?9dmx@?,ESkCϚeY#2?a>ǸgΞòY 4Vt' w=^:;g^y_ȓ'd VV;_&6ZMEly=%}~k?h$fuB==ZيXvj- x eoXawqԃ/+hVX܆rȡ%־Gr^v ]0GOIENDB`mumble-1.3.4/themes/Classic/config_plugin.png0000664000175000017500000002724414010707274021052 0ustar builderbuilderPNG  IHDR``w8.kIDATxtds.KI%tӞxm۶m۶mcl[h3A*uo]ʭ|kw}o%/u_"oʿoC p/S]-W w1kc#$k}?_ʗw],ztt%c*SS;6<4j`0\H<Np)Eoſi ڦJ{ y~>& ԱǙhMc*5J8b}Q={Tժ$I$o8bh~h܉\>Fq}Ͽu=ȳnKOW*(>\?wKDŽ`oEkpQ ?׳|h<%M+ZȲJ1yX#0D\|_T6k`qb6dAyB2Ͷhv]VrêM[_y W)<ZJԺ-ֵv>mM֗M&0ڐg*+ VZL/R6ȶ1yTSd/"k ̊-2gBEu8W[Q(ʀY,,8E[`!9ޚ; ,7P9}ڭ ;q.СK:rp!,ޘr8<ᏽ}DW%7U#OU* X<@G:k#X^ * lL#qcN`dZn5,i]u7+dyy~/)Ė}{"[]S4N3F pԡgLYJOiP?0&CX  *\xo w3^~7{ƈyR:̙Rn|^B)oEmo[9E314iMm%W'IR*F0W:@yԥ*/k8EZT_rAuypn  8aE61ܲʆ'5AvπA2ߨ_LwpÒ>j5>,p$R0lB 6+(i%܀`<0n/%6YzqfצirR|G:ۏNk ݕg|`=B=GO)ԥ)ڀ2z*}rJt Jc? @Y~8H ib̠)j!z8PFc>hqRXhttc=3:4e1w66\+c1D֫(_kW"S*Cȟgf~~ߎ3i&XɦCX%[^ĖW:w]3R)Wjz52u BVk+Xtn@ z[l9إ_8BkWH@`-('XN|[krکf!-<0HkR..{ [™U]2jY[YLJ-ϩ MZӃc'?-;y;gx#I1;I?ʶ:$YsNyϑr⏶q1&'d+W]Hw9ĭs .*їz{AKto@f Z94FEV6{Hv^uJJkrMA4 :VpuPeTfu78 e S|n"V p]s T=zu\cxEHKr-CrX,_Ŏw ,,4(~ufʎAmfrX,fa!tLZhM\wuϑcM~[] ?>VU/0\֠,f*./JϜ؀&~ |o 8q?A 9㌯)%=a5UǗ.+68 pܝ21Yœ#nѠ>PBJ ˈ&o _]=v Rgij{",RQ-âC4LVAY;˳ӕ;UG^2fS]`vf; )$U{͸z}I8-xKLwbQ:flD8dez)GhC8\E/*!$OGq<%NSj64\$erE14>LΟY^RXk1wK p"5@It[H`߶m۶m۶m۶1IR?k}$-RݺUľ-6>TJZAdIAouSxCuԧ@dPb'iRa|p0 Reܶ" qMQ{5aH<6cc, ;0"v5ܯa].򱀖P9AZ[ai+W7>JaXt,@aPJA[PۈV];pQTsg0,Je W(rD% dRCCc3~ j <%M6{@yRIQ@, &eC!1Yx6J\g:G4IOtx=H/C1cPTf(A;w!d8x6, :qq'js̚5 8N 70 ~Bǚ4(+D'vվZO!1>0*㍛.C"lNZ}+VZfRZ2}X0 "dGރ /Zmz? `uM)٠`VK$ϼ"J\D Z:A3C^ju< CP:7 B( ț{OSi0{3fqKQᘰ:GF&/H0(?xeSKM;Vp<:B R sH6}Wp' 8r]ښ_O 0>"Єb\eK:Vk͢(΂Dsj^Js^(a=Go\kiHz҇&> nn3A'zJ)ՄaA)axx'1:q; LL HRP'Syܰ@!NCT0ƐM sI@ktt dF4]P, 2#^ kZq XD*2Vb109tYwH>Ϋw蒗.VpLZ-]UB ^y7P+ Ce دVG2*P:!w>7lϨ>WW@뭵OHSHa^M:/I<[A*1 CGMZAKVF@ c3CQ:% + CTJ@>'.: 0 ΧLHq8m4…a@k ss7,e4 /b|Y THZpܲ[ZNªaHg ˠS$ny[q!3+ 0{xnpA#%dn( ?E(a՚d&RI7̓I2slK9gO()pd?(NAZԓ "W)#n60>>]/ \o}8M\~֭&Ϛ0r|_wQڲeF\_ʞ74=@!!xZJ*@HFxΠcZrwe|`3ķM&*;vܛsRMEQ ~y`OcVYfn꭛3NVXAp >ϼT u[:O!x PQӱŞ6h ێ5}4 8geDJS;3;{zk__WQ̓<<+8Fjϕ(w2 FYΐA mܞF[EGAկ9«fflxZ|ߛoFi L39M?(ͣ|˥~.cMRŚ C{jQxɹk-[k&.i&gj/Ğ' E_ PL^`̺?|h%36~]c) 2Jj{Q~\~1c=Ep+hbrf)HjBgH8~lZrgK~:3\zfa!y-j˞!ltt3( K#3W oƘ19DJ_UB PR~NR1QI~J Lj M3(}tFE׫i5@4؛&Yٶm۶m۶m[Fެ~uD==.6_8Rx/BT(@ imʤZt2eVa m ia%CQb X8Ȗ.C+J}?P8(Ծe, vBQh ֖ m"Ɛex)e(_Jx$u@{aSMϞ5=gWD¤8 SE#UD[N'b2nRe4:ڱ;noM;1™qHXm,-3zitXLW #'sOZ'YCS4!-]uw[ݒt{#U2C`+.ae$jKdp=MfRܾύvXbN}4 TA Q D/ Y F ۜl2ž׌ZE+%.]k-b\:kX[~FpYnhlpng;`JfMNKRHtZhcƅb`IKc,.3+P}c#2iX eb2b<1Rg`/G+}P{Nob$E/f-)zo&3jX[قK B T[9-J5ÌoaeƠ.H&MI{ݶDi[P܊Lp97 W=aIS˖- &^0؝bEWOqx #(L{LLP7+ NwJ,Q V,Mo iM6 ҉C"ysi !~KS$cLؾ7ߦQ+ 7(FU'j IdG,%Oo9M o)1ariZ&Bn}EOXH\GªB+#3#E; 3X"˼AT6b;S<6KhB|Eyhul6! dt8OH; H7&y`_t?VLCs͹],! !\Ȫj>\m "#_FD̈gvqb!VP,~ IJOQAo)<~ pZu HLxlV(#O8I)=7S(0 GH.˗lکԍtYP!SJ.ډkNťhlҐHG `=VP$ ՋVZeP$E@+k@(#W֬ IPd*GWp/Vȑ K)Lӌ_, %H? p)d:WPV-{08J5q";sʵ>׳ b6K&!% {5Geg`Ch&z"Z9 y(VªkoK(>MiO{}gSؑ<ټ@+ D L~4ROH|)'W+k88ҟBMܖhEE?_ϓOؐBbrxdk[2Z5|]z7|l[FE".eXM'爽8l;Bs ~K5.qC96=(7nŮ̙3/NCa HA; (q3g>ܞLB80{74w4-JV;VR,Ļ# {)L`"{1נA.PYB'|?k+YF+>Nĩ#KL &u%-C`X͠MCᮖ溳.oHR ;.ew:O̿qQ$lNS5@ bGgKϝ->9̞5 WBF OO?T#xp@1aez]&5A9Ȭhd:G3"LOLߤm GG,6h7Vc>0z|b JNr1LV e@V]!TW68Ą3`\,RD,.rӧOȐ<oY .kq0Qu&xqX B- qo<.agEIi/>|o \S[cBX=ms ]`FR{4'GRfMt.ĵU}%rlА̭$ HT6-$=/z6|_+y IĘ̂ʘ3qŹ'Gm ",ρ¶Ύ-F=6'0ix斲zp;Hf_zD-SȇD:؀x\GH*x$; +9'`dZ|`?16W\So<cj/^3H,ֺ.^9fXF_ 뮷yc}h_Z>4M (G{IԴ!p,v :S`9NgN~33냸A6cE_Z~0gO 7ybCfL+oJ!h}A¸yI, wЂ_ֱ+8Dn\^C=D&67}Z\_;VlZ\R2ȷb]655-X,A碫m-C܇T2jQ5Cq-ڥӜhPڅ|Zs]n6QtnRq\b9S ȹ"| #˔)nd :SIύEc9.7QȄHHX<1hXLɦJ.ڄgh2$vS$Ϙ0*q>_=RHE>! (6i Ph$J@<M^$S#xQʆtuu Ts<::ўZANZwvtp 9]A.<UDqu F>$Y"NC# O{&6CJR~@*Zp|fbYǟb+3d75*+~ЉMȬU"#!m(9BJov4`r >`B`@PVαn,O3b_jll 㕑N%LcXO@~O؂.4k1?,6a7xc~EEqw q嚚qq| b: _%1gBwkopl 0]>vnAT "ؖb=2* o$[{ 7вMj@ 8i&?enu̡5XfN)zg9Z ։==Q 5^kBjf6x-&SɋQ/cԁ=cݹ}6&42.0 e =utOk?V@ )lLw7}t DO|E-'b=I{r+V<8U'Ilě~vVVж mFmVVPD v$" &?]h/%IH`S m &"X)?X!'>+`f\_&&ca&OXҧ"oeeRIENDB`mumble-1.3.4/themes/Classic/talking_off.svg0000664000175000017500000003501514010707274020520 0ustar builderbuilder talking_off image/svg+xml talking_off Martin Skilnand / Robert Martinez Robert Martinez 2009.08.17 Mumble team Icon for voice chat program mumble mumble talking off talking_off.svg https://github.com/mumble-voip/mumble/ Robert Martinez mumble-1.3.4/themes/Classic/talking_alt.svg0000664000175000017500000004511614010707274020531 0ustar builderbuilder talking_alt image/svg+xml talking_alt Martin Skilnand Martin Skilnand 2009.08.17 Mumble team Icon for voice chat program mumble mumble talking alternative talking_alt.svg https://github.com/mumble-voip/mumble/ mumble-1.3.4/themes/Classic/default_avatar.svg0000664000175000017500000005534314010707274021225 0ustar builderbuilder image/svg+xml mumble-1.3.4/themes/Classic/muted_local.svg0000664000175000017500000004666714010707274020544 0ustar builderbuilder muted_self image/svg+xml muted_self Martin Skilnand Martin Skilnand 2009.08.17 Mumble team Icon for voice chat program mumble mumble muted self https://github.com/mumble-voip/mumble/ muted_self.svg mumble-1.3.4/themes/Classic/comment_seen.svg0000664000175000017500000002066714010707274020720 0ustar builderbuilder comment_seen image/svg+xml comment_seen Martin Skilnand Martin Skilnand 2009.11. Mumble team Icon for voice chat program mumble mumble comment seen mumble-1.3.4/themes/Classic/muted_server.svg0000664000175000017500000004674014010707274020750 0ustar builderbuilder muted_server image/svg+xml muted_server Martin Skilnand Martin Skilnand 2009.08.17 Mumble team Icon for voice chat program mumble mumble muted server https://github.com/mumble-voip/mumble/ muted_server.svg mumble-1.3.4/themes/Classic/channel_active.svg0000664000175000017500000005766614010707274021220 0ustar builderbuilder channel_linked image/svg+xml channel_linked Martin Skilnand Martin Skilnand 2009.10.20 Mumble team Icon for voice chat program mumble mumble channel link mumble-1.3.4/themes/Classic/deafened_self.svg0000664000175000017500000003663114010707274021006 0ustar builderbuilder deafened_self image/svg+xml deafened_self 2009.08.17 Martin Skilnand Martin Skilnand Mumble team mumble deafened self Icon for voice chat program mumble deafened_self.svg https://github.com/mumble-voip/mumble/ mumble-1.3.4/themes/Classic/config_lcd.png0000664000175000017500000000400114010707274020300 0ustar builderbuilderPNG  IHDR``w8IDATxA@Q<J;y6nUoe4aag %|H$e'dC?1FB9o]k{g ` :kRjE(ʔ/$އ=  !N‡؄3g?uݨP,rqxOOǮ乜>X9!9&>(+X?sι: <}BKD{-- kpKJ6ˉ_~Uz  ܎ $py?x ? V%ur5k]gxJ]CX9;0[q],mb"P;PNzX[jpw@ Z:HARO 8$^[e'Bm0xhjEm65t 5 p``]`,K,G~/[;Vĵ~|r q/2( f]L d,ʐ @ W[/NGpTk%T6VZ|7 ),5 Q]5@G-Ӝ_BGE:'0zRD4 #r"ܳPSI{S"ޱ K9p[PRZ#~p"_@(pt5՟$JSZ00p1w[&- ^PDˈA^b c;F,\0`! ;d0a6 !(OSpM 8[PihAR?A ܱoA 6d *oz{(·p J8&6w'?3c)11D86'D^.V0OA 5J`P0Ξ"efhiBDI0'p l.=iw1DlCtW( jЂ*TwXrƩ/pz{$ ReAtx,q頪NCzOU;뫖6Gg1/O߰8_퉘 RG!lN􄝟zXd!܋| 7LJ3jΉ^پ;6.H S_G2 , j]-1H`XY`X S8o4?hÐ3f8.plhnkiɼaQ؉ Tk( _M2͛T"k JіӧMV\y^[LQr,כ8Ky1qQȋMB0X 9%R?2JG&.C J0Y\IEDپ@*[$"&R_[gϚuQ": M P҆TBajcɏrԂOL>P۝ ( ?R bĬ7p߹綣D }Dn!3;*ٹkxŲ2kDUmԹDUsSlBQ+ \=Ʊ,s9aXnZ*5IENDB`mumble-1.3.4/themes/Classic/Information_icon.svg0000664000175000017500000000250114010707274021524 0ustar builderbuilder mumble-1.3.4/themes/Classic/config_audio_output.png0000664000175000017500000002410214010707274022263 0ustar builderbuilderPNG  IHDR``w8( IDATxX,Y`otmBg۶m[ mJc.kpƠ>s#veVs1C\zEpm3a*:*--˂-vl$ }c8M^ߖ.($$i !,K}=9N3k@olh#,aܝJ%_6~-tcqĆƋMY6H=dp}3ZG7O$]tC p!u^*-`p9xx)4L< cJootz["|gWwpfsuuuS7<`4TƆ+; I~͙\gP!W@U6pwq[SsANwWXlt:ݣi,3q u wq63_/:EDH.BGa"uO&i>eF+GTq}cB!]Uil`󷵵/'fS]9a@KHkʁp&(()HD5{<} <ܡt>n"]x0~9pz:i7\]DrO_Nxܘht---{XgnlFH0H0p!k g]נjr%"|{4+ϫ.EƎ|@{ B.[.ΕMw@SS]=vH4cjR)d3O҄320@г,B\]nQmae؄*kJ1Vj`g6Y)B|,HBbX-bI @WOMtm $؟7zQ 1q%qo5I:Nb>;eʔgrqk H {pTDJ.@1 744 re 7 rl)E6AnW6WBpL!fvۋҤU-J$HXGkMpEvrt[JD`b[|A\6*.hrQƏ0꺣!+ 2!(. Kwϯ4if@0?DA^$1.|l^xhdj0ƲOR50ǸYfcfffcfffef&)ꆍ+]i!)^bPXkv:3/Y䋲l9͎I9xH*`ܗ~*Et.e;SbHF)cS 9䡃xrb~3 `C휳D"'r$H45 :ks~Hΐ*DVfF^K7ŀzvor <1#vK<OKM)Uemb"e" U?1 {((,~ڵZ7:l"ϧE?aܽ.q⚰Lrjzzjؾcfff?Dŋ0.voD絡Z#΂IbgΜyō23sI0S[[nWYg_癰y2c`u#G`J *e]5>/9G1C`((2r˟y>,/:hB]c&ˆf$>-is'|CHͺsRx' rDi'P‚]kBL p@2@ovtHLVt.ڐ/Hm?J;Ι􎙏_ 1dv~#!n@n`b|L/(굺jBWU47Mƫ2`ӧ|gD7"F`Es^؝狴n7Hw(),vl~J;cYu>wU s]^x$ʒ.0T bW&Yiw ;~CH>Z|oeHwFjU.% u`rqqǖE(;O_if4LkJ(ggϜ;x_j{e;G2]&X5+s\2oֱh+kHn/*!! D'x\1ڴy6 %y68 #[O:nЏ'a'PA8:t<&JAp\}"5^*;T39OhP=AR-33XnsFFGVVWVguVúJUMuz]*jx4=,+ 7^K[^SH*igAGi _Ae>-hN78aUrtvn5-9|LD~C"<KFUUfQY/6y7<4( Ew;M0v^]51kZcG`Ν`"nH!YC +Ξ9hs(wmY!~L?X"he!ϋ- KVp{"@(d˄B) lۼ{bM%'oa[ B^rF6GLN|V T-/ ѐ e$a,of͍9|I vߓqBbzzhgc歴lZU7ΘV%XMn\차') [8cc&GATRHoI|uSdJ`Xbi!NfKh2 5ʶȜ '[" è1M8M5Jq2BgD J|d.(|Ge0 m*u>, G恴X* 0kg6؟@RgiJ{6-)\~fXl]S9ˇ%[õ 舕rX5Mmd5(*=m=O"0Y2etC%.y'@xOV`b4e<ğM!WƢBR"W]*aFr>TKif ]%`bEIcۡ  ΍֯7gϞ;]YxK[”Jʀ,qHQXpEas2L ׌ a-1S+W,asPW IYUⳭAm1ЪK#dFo&8{diq'W[g|"u!SjH,k}i QH*;)u)@{}0Ԩ]50a(j[dO(>^Rk3 Tqhh4{Lsw֮LBӺXx Q ;,-f1+6m\Oiv]^cMMѾ>j[L8̓hwWN_5XTK(  nvݘu>@P%~!fa F`ac:.}F!šh'{c_QmC6Z%(153j Ϩknw/&Da#!P B0M |l_>$Ihr6ȏ"Nf?)UU .OP% [7 uZ7Kޔj-a繲D@f̘ @)1ާDVį{qĠcu>J49DQ y?GoO|" X I]|uB(; f=e8ɴ5 hr VM$8Zcw=DmEȎz s,t[R~x%!] )_l㳛+5f0f0`yOl֙`ds.&,Ŝ1=OJO9ݳK8HK[n[dkerO$SXxD_c; 0"h䜦-Rjՙ)"p$^#'&b9>үIH$Lá6D߷ۼk~;V6msS düawJѧ; a8/ ![WÍO &t   b<{d-уEGے|`<ߗ V- DAADѩO{ߗlٹ~vͬRkVk@XP$~m@ 6!%(Q1Ec"FCoZ-Mp F]r+;$]rckN ΂ >#ͦ>M7}?wvnnƲk=-pMW'CiF'FϿ|+RNww(LfG/t~8e.7N{kkׂWB͐;7;7G2GSCȕ0E#zA2UM)nj{9#]dibo_y敿.%H|Sweݙ6Z #2\:w{_#eSaF9x.;z ؏'OH~] Щ㽈Qy>DI[OfMFC9ku]z%HC.n\zz>3}}ݷN`#vtg6ӽG.+̗L5+1>h?u)1quhFա|69-U ƕ/#Os/65 fFM#R'v=."((gי4 v:~S,y޻V t۲qN֭[%"ئsIP-AګPF9 L3 πBAG\k8fqf Zgx>|K~ ahi1'Ĝ"iyvx;{.$lN@<׶W,Mu0o;l4AH@'`6,+݁?cI(3|t-CC!{j4./cĪ4캶%7Tz88F'0Ca҉Z8[\Sh. >bDta6TDAəF!;1.M4MlӇn~c=5ևI8W0q 'W>в~e 8na5(Y=qQHšsiFdH"ƥˋ.pC{0=proE]!stҖ+ߒěVт&i>-k]ouk6;dFIpj#:eZP*" 1eDB2Lk͙2-`֗yz/׹xTs-/}/>f_fG LӨ&Vۆjܯ˿gr3p'G;tOcGla\ . |!#"EBտ7QF,-LZHm6h ҁYM|nbr"3cQϻN?N7㼲=G6K4=ss~(=`_`[N`P x@qX鐸 J>#`bs.+8ޟ>Tj ʙyּjx= Ծ8Q2q9fa[k> aֳS-A BH@<@ ),!@??:?oU_2dcNm15*%dAF% AX6rK tҀ(aЕ"o,'zR/ :'6u,;B4GARsvy˚90c "ul Sd%R <XX)Q5gz;r"H~59x?%2zϔ$ X0ƑHJ@a=&DW:!n| H>Ձ%'q#`@:8!-YXH/ JlV†ePTY9?Mk-y&c ͔WF-b'0?w$0΄|!WdD[/i@Eުo㯫8>D%/L0NLÎ&YZ_x]-_G9:BaE-d@ &RiX* s:q}~悘dCZ}CۂE0't^7`4 ZA &=pSbg)C2 CTJ"$$D>&0F8tn¥Sp% UAb_FİLCŸu~-r3jzàA3gFSdxTگ{TJB Q)L>MԬX}^E;~s8n\\>WVqdi\;5y_@(UW*&=}C0BFL—P"9ʐ[$0C7U@D d 9ߩHPb=ܵgaܒº;Oenhԩ3[3QFTOc?hr}S}نFdqa 7췈4z 4ƓAzai֐ LC00(ƭtT,mV;yͯ};mp3Xbv>([_8wĞu5tMhnb@iK )| }ߔ7E>4jiq‘χe wh c> &7M?Gdc6h ! p &($4bz؃ґ@0b L KXwMdmVvU`l܃~h\':6(t/fL~WxyChm<ͭmF@|R;_f( M` E'[BL)UL+jj6Z!)wsz`bm7̀k^toƖcpe!;; /:KpdЉNJݴdtũ'&qtPp9]%f%8O>@o%znI't&)>sӖӅjfgIa6<) 6F L:M$kHֶ`&w*a)Vo! ``ݔՂu/c5d֢hH[t,x rOe=& 3v Ƌhj_xjA yIins9;̭KE"IF^BI1|%2D"E-BC@"p<&z:VZن*F#@:툞`@{5;!ЙaAFghU5f3琬܃>%NZPҌLЁFXV(}P_%kkė&&(gG (PQx폂1`;_E?Ε-A*'V2pmcUt#[x :hM"|5fKs\]´pm01XJ-:%L6 IŬT`ާcTT>kc? SRP L;\znO:_5$Nppc€ԂXZJR۫I *2x3$HBWzqQ[rl(Qu!(>V㮀"Xe ,Q!˃d|v kwԐpSC|N԰؆ *8#|1Ht[qKV8q,EIxއ~Dȯ }4 0%esd(2Z:a9 Dƞ;`3kXn!)8% z'=؇L tXWέH;Kl; 龜* rAZj@tC|YA0Ր=?ֲfj9w|d]]ypiGY{i'~uw\Ös'V![sK<I3rե5lthQi1){wI5#o0MyuA/nd?$|3}IݎWZR\_s/7~'aIčh˲F*sm0~&hv=,-[vl9?9dmx@?,ESkCϚeY#2?a>ǸgΞòY 4Vt' w=^:;g^y_ȓ'd VV;_&6ZMEly=%}~k?h$fuB==ZيXvj- x eoXawqԃ/+hVX܆rȡ%־Gr^v ]0GOIENDB`mumble-1.3.4/themes/Classic/self_comment.svg0000664000175000017500000002063314010707274020710 0ustar builderbuilder comment image/svg+xml comment Martin Skilnand Martin Skilnand 2009.11.19 Mumble team Icon for voice chat program mumble mumble comment mumble-1.3.4/themes/Classic/self_undeafened.svg0000664000175000017500000003461314010707274021347 0ustar builderbuilder deafened_self image/svg+xml deafened_self 2009.08.17 Martin Skilnand Martin Skilnand Mumble team mumble deafened self Icon for voice chat program mumble deafened_self.svg https://github.com/mumble-voip/mumble/ mumble-1.3.4/themes/Classic/config_msgs.png0000664000175000017500000002352614010707274020524 0ustar builderbuilderPNG  IHDR``w8'IDATx[lm۶m۸ m ضm۶1u=ww֪udRU<Ϳ7}/F-槎ؚ{Y[''}F?d889,&O@wHOyPgY/z#111\?nzUmM9ӾUQV٪ʊ]IM0.'{Smn9|gy_hq r]+x]By?DهCRv288*B}B^>?&Ro{`*dqć*3Ɔ}-gZ7>_^Z2> 𸜆a7n=wgsSͺCS!lz2,.s'c`Qpz튾62?ߗ.(ڌtHz:ҶA<bf2gx_CoZ|V#]+bENQ\l{c޶u ^%G2wva:i6K bxλ̛[]yin ;Nx.Ol0)pxfNOPOೡ Yex|^*:4UW m(a# ;l0{::>h!ܔ/*,Xmb9WCksXS~8]FglFkn`1ȻPN0١yҿo$BVwG : M]?"T3ԑ}嬷ݵ <`Z-]sQA~;qol*|>yGY]4y l[ձUWVXwڂYG&8<5Vg .XT]VGzEg~'b0$KD>>Yy;0lp뼹sރH(njښ)|Z[^}1;j XJCz]^4ie_ [?XZ8Yң E`]Ń @$!#d? Na?9)*\6|Unﮬ(gά/J!zdg-s6ЁBHB5T&D=}L#Dj!*\x ^8kY$ulc"&0up>֮}Lc̓&3{6Aeuiecu4O|rNAE 7ERm"MX{4 8^tҵP_[)/sr5uO{[ D~ (-.*vA*M{@'Wj,,2KQ4'CHΝjfqU .V:vz5Nכ`\w.,#yeu6ysQ6YN+[} \s#9wu}Algۻ:;Y3gp,owCs,oKъ,tox\ B ^r}$EIblZ)>7D_?FLiY$(7t~aw&$<˖.aQVRɉWVZRC}`s23.[ ׿$7;UP ̙d%E3֬Y,oٸY%%)V+jl0[6Je*`"3n@V98m> @1}Q ^↞șX->#n?q>6#[|MV rE*f4t̘kѢ >1[OhpZV85;3sMzȑŋ>!Q=-޶bŊw *p[ 3%rg'TMBj; [}"AV 8}FSv|dF!>EZ;ϯ' R;K+aBBl߶y+ ؔ7eE"X 74hڤ? MK;Tg572a5ԧMp6ZlQ>½.2|ָ_$+@9$+{O؍zw8/0&tL^t$y :<2ӻ:x—"F{2 aAf>&;פWV D;$sKx֪%h/\hK5 P)@P>F=D?1*Ғ2BSJB@@M$$&Q$dϠ} ߧ%^301#a݃I x!Hr"؀1_͞byzR|ٳJJDD >g10Zxp{&w:fkkj!F2x-ƈ!ɳ|S!w##0, %YWe a9SO#Tծo\S^zDS0n)HRTvIOe{ W c%#;@sQe3ڐcany&x ^'g#\ hPO$c;g4 c50}$3$MTZ!Km;cgB@wFl׊ebLgW"3FDy2fGjz"ҧyPnЮ#tEyd%cyxϙ,?B9&1D^9*O3\<:TUT$$n(1~2<#(kij'8߱G@ Ȝ*ijlrxDj:'>RO[τg[,S36ُ/x$ 7%ފr"+@Ή5vh+ GcZB 21 2JxpM#`ܘP罱*='Rԥ 9$f%];VFρOX ˍ? 6xd dIIX_x:åPf8^@nTgOxsZj|,FV AM岚RKa f.nw_i.E[$φt  Ҽar劏a8۪nm-6o?r5N_5v{y36QFG٭.ҕd`B47J^)s6 ru$Ѭp6g \4G$+'+GsG}F3ax#U_cCgw8l7B;?>L܁Cz/+u?[b  Qf=挥Q2NSmPN$9啓Q=BadJ@8`ag{|ҌPw?xD+ÀF*N }^9d0N5^ ̳6n| l\Nqvܟ}C"-=9J|1H8qwc(oi1vTnPmty f&tFԏ Iυ`dix["}sO`vYWy3F#:6v8tϻNon4-{Y0&'jX‡F@W z%@Y+@+pOJ0?X[XyZyD9hsNii>70?j>iʨOϚ/X\톨Mw@øq8sImK>;fc0˜lކ?oCY`>V]Yοm(o5=i*nnoHƍ@)NBPW R(uj8|40ڼ;Lr/w+wy4nIǖQæOV k`%c򀈀T?1'cj|uuuuvtt~yGLtr>pҥҒb1]*|x5wĺɰn׸ѝfǍ*\mm&444 nܸ&ܺu R]wEq?j:B!rDaj=S^^*L̢z4$}h҈sv;i$pZ3 ;+%d&4?}܃n-|\MZ48)Qx8kYSЕ&P_ԀDpI!*_.t.m7o d 'N{]P%_-˥*jllu..\Dt%N0/] i{1ŘKrT;37YKZFcRa99Oæ-^qI$D|F2/`uAgQΖGT|Hi~0t0;;:$'% rDRb"R4s;+ÓW|^qEqxh"G`Z.- |Fi"Ƃ|c^NlVQB+ t?c|j6C6sD(I,báCQRRjDh4:m].}٠0Xz$waXlD#5%%8R,-d*,?v I@ff^'&i2z1jZq@ xR\eJ_JRn7tq"58t9!j?03A(hpСCzZ/AJK>Wk%@P'(R0<!)J?&\|$w3;+RvMz_.kI"gt#FP)6@?fYrr ֿx6v9IUz\]#X "㳋^ ?rhlK.8JJE93_GhbjXq8+_TwMD0cf6Z}fWZOg1BĚPL `.KFu||_(HxddA47azza7cJއW=>xkWΝ;P477 >Oz.j^+Z/X1O[L+ <ҨȈ Lvhhmeة B?\FEgYN ;^ұGDL!TzIS }Z}lKKzo+F`A)Uھ1Q' KPe2AQbo#PsqyKPA~-aõ\M`Rz2?FޓF C!(0yzy"2\R ʈvʘt}tvvY2Cܾ 2rllLfmڼIdԄߨsȌᎭJF W*Wu9&[ ӹBr˛L*<+P6x|ژZPڿ|eltl].72W1|.5~Dɳ7rƆpRT֖qSc#H##Ð2n=u r['eܿ6k6/|Oe^*W n[e4`eW'gR624$Ѝ4P JB@#Fp w-XֈI0 ĸֆi3@&&j ~Waq:'߁xb-&DˇxlZ93OX6XNa#MPvzzApn] 8]S z[(s΂6x8#]%S1gnj (QD2V_!,\9dt_o/HL/(Ol"DBPћ@oB}*wb80Wl })Eb0llRFlp9p'-N l}  Un(]MiB-嘚K|ƴz^QsF}(CL#iեׁ+xUb,\8̖eap20ӎ #f"0 y`R$g݄]N1 H)(!-c\Rhcxܛx4HXrrr=g'=UYQN`t$ԔOw %3VG0W_)o.HG_B8|0lo nw ٷ`g8xFy)+!4CJmOIAe:c\9&޲Gqc]ܚ 8hqf] ܫRi,L%:`N;f{1uNyWj1Tw<9u5\, c~dCm;[Kwt7.ӸҠc"Œ tR)D`,#'j>P׏GrP AR+4wF'|GYSU4|s M,,,_Ȭ E9Ƽ̂NVd&˲FTF/ִhWk.߁DI0yK"""[B}y2avX",o) ߻{tHPUY ~xvkRLBrF&3eAKט?@?2W5ٱ/ Va % 6|ҒV_wd\,񏙃aZ iX#/&_Kth6md7R=09OEj>8DʋPWvG /KT؝R;\XD"***0EA# 7/چMaXu+֋7"L"]Kج-eˇ=L1Hxvf0j4DL02g4~p vPrtIXd0$3GSѽ{;SȌ6m!ΤCܦi OB}(Coo [BJ0=zل0}hU`%RAWlZ="cB'7Q!*U?(T_ee8S{FB_+/#i f_/1aý 3 Iچqw8&b`B'T'턁ep FB5fۀh10G;`d3%wĉ?rRWp626u|(q{nS`1ʝȵc2džd0Tr&>aiC-]uS_Ga} v :i4s_EY|cH+?#H-;NGs;頻Ee ؓ3=#jhwlcq٬>|RPn@k4"͵uiȲ1!" ] 喏$)zM-i_Mi ===kxrQ c_if7yْ.g-~ ߅@z]*=K9y6)Zے`:lcnx<,A͓&x}Cs"=G^䏑^+ Jd3\5h^,G כo^\㸱\NG򚵄>;gYoBe|wWOVzO|F[[I$49,Br2E/~o)Z3Mr,)>/}lk~d IA?>OSX%BIENDB`mumble-1.3.4/themes/Classic/comment.svg0000664000175000017500000002062614010707274017701 0ustar builderbuilder comment image/svg+xml comment Martin Skilnand Martin Skilnand 2009.11.19 Mumble team Icon for voice chat program mumble mumble comment mumble-1.3.4/themes/Classic/talking_on.svg0000664000175000017500000004530214010707274020362 0ustar builderbuilder talking_on image/svg+xml talking_on Martin Skilnand Martin Skilnand 2009.08.17 Mumble team Icon for voice chat program mumble mumble talking on https://github.com/mumble-voip/mumble/ talking_on.svg mumble-1.3.4/themes/Classic/muted_self.svg0000664000175000017500000004672414010707274020375 0ustar builderbuilder muted_self image/svg+xml muted_self Martin Skilnand Martin Skilnand 2009.08.17 Mumble team Icon for voice chat program mumble mumble muted self https://github.com/mumble-voip/mumble/ muted_self.svg mumble-1.3.4/themes/Classic/deafened_server.svg0000664000175000017500000003664514010707274021370 0ustar builderbuilder deafened_server image/svg+xml deafened_server 2009.08.17 Martin Skilnand Martin Skilnand Mumble team mumble deafened server Icon for voice chat program mumble deafened_server.svg https://github.com/mumble-voip/mumble/ mumble-1.3.4/themes/Classic/layout_classic.svg0000664000175000017500000000767314010707274021264 0ustar builderbuilder Chatbar Tree Log mumble-1.3.4/themes/Classic/talking_whisper.svg0000664000175000017500000004513214010707274021430 0ustar builderbuilder talking_whisper image/svg+xml talking_whisper Martin Skilnand Martin Skilnand 2009.08.19 Mumble team Icon for voice chat program mumble mumble talking whisper talking_whisper.svg https://github.com/mumble-voip/mumble/ mumble-1.3.4/themes/Classic/filter.svg0000664000175000017500000023720714010707274017531 0ustar builderbuilder image/svg+xml filter Mar 2010 Franziska Sponsel Franziska Sponsel RRZE filter search Beate Kaspar mumble-1.3.4/themes/Classic/config_ui.png0000664000175000017500000002643014010707274020165 0ustar builderbuilderPNG  IHDR``w8,IDATxԃ-G3ضmRBR-\۶ma;_M͵_+' ?U0`8c q828$% `{BL) K`#@p &kӵ#9b'J'E?`eݶ"\A cr ,ixs ]c \Zyv`Yf\7ЋФweDdê7pwN[Ͻ00b\"MЭ+x銓l+xIC~:/%_L`oA8Nn(pD"8(Ab]Hr3aS$ !hCLNta:o.IlؼM[6rbn"C\2f*'P}Muc R^e(@%e,&RFUAUC 9uPXcS:n/ ,YɜѝJr\S7 YŽ{.c˖vn3rb6lÇ> cߋ!曏RUFCx'&e u]L)5U͚[6l&,Xjh{*Ya̝C)Is92NYt3/<~{gǑ_Uw4b-[2CYJ>1c7Y8`;1,GCP:8K==sunzq"64^X]ϗ8zt&ne39B!M7pZԜ7sDZR±gh[X^`YO.uT2|c%Ɵvϝō [_|_ p=>!,%_a(ig?{|۩V5pX ȟlV6Up#Z"I(l¸pƶ%c#z<֘"0y?H$b"? ,˶-~o} Ҷ.W/_P(p_}_9}zo|U~7s8ժ?z> m2BHp @ ٙb\d gW/LTav~dW]ˣ13eǎ!~ JiVdttfqcbb 9hI@*g`Ÿ ),R q֮m¶07W3Ɇ KY:Yb2)͊bpm\OMm>&@RRV9uzl,żɓKrUF- /2I2fp%^ye(C]LOg8pX)qERIJ*N S(97<!~ce[X 4[6w13S\T.lHk yS'L{>=iEZOjfmV1=}]Lbl۾ťZ>tAR>0'; έ4'LV" Q"i#ƟtԱ B HCoq"&Jy ێ ( ,@77? 98֨RFiR*P 5Zk (UKGq[ @X& 8iSZ9ZHჄ=?2О4P4 +Ub;aS`%D:@]> 9Gk QZ1d(lT`ރFk !\.3;3Co j盪Tz R@.zf{)xTڤTX,L.N7mQ 4Zk4Q# }5l4B1Dzir̈́Sk()&&8+b3Df1m17b*Cm h4 C# ]&zzEJI eb('0E ]lo΅4h@?p.`v$w q_C*h!x5ƿkem+%EޱL0 ;$nYVЖ !6ͺ5ĐQP`A1@xp<(_R'dǗYG1 P Bh@JM>P| hD=DH|`oea|a xz:Ǒ#S%qssYΜ fg3,aY=o^Pw%v(x/^x;fNc IPe9S6qX%zTRVV bjQ-ޱF! 447 -8tئ>@ iok@)m[&#RZd2frd& $h-’6 W R7\0}S @!8%֊!4Q=;*_.0ެxeB`εB C  ![xAm@2SnA)S Q91?3А;~ޛpXbjPI47S%I"،WІ]nE T zVE+%.b~͚/J!cy[@݅XQjvxjg;tk%^z/oGFSLL,Vu/v&ڂ66"ea gO*}ږZ 极&hB ZK!Q&0Ibax1@7 &PHS#$a B+ǦvZ]G)^`?iPJ$IUY3%ߠ&݇m;|B"0"0UoZMOk#|X,}+ )H*fsyu7]L C$Hͧ9|yRRsn ߤ4Rj!mi xy+Os-Rl;@zWXw^V+p(ѧa^] iEśl٦ |h3l ~>pPAVAhisIXhc !QUAk^ya[~,̢ e$,p */ep/(?bI؛H" P> 259M7\{WMfYz[,NP)Ѷq$OR.MX4J)qC J'~*mN֜[uM=}L֫n"EU+d }2[Y\D?έV*߲&S4=0IZ:Cb]{k<===AP/Ts+FmӨsjւyلKm׆VyzU8{F1kL! \ϧyZ]ظǎ1^8B͌B"6Xlu vD@S @% ;l @i4H Zi;8~Ҳõ Up  }O.Zpe,A&im5S`C`eVF>ٕ  2Oej|U5CXʽ7dDQtʁڒd(z" Q&ЂƐ"{y6nEsKK=\! *++%э}xJ7S#|yqލF+`V ՛V'Y~Z+ga~ Mm:NAAw}ǿ-, ""NEh^wVy$hN<-R۶ĵn?M4Xr4"?s؝oj-njۖ{ƪ|ߧ!{#p:O-gfz'4sv.E5hy:| 7z~z3nY^&t^*8p)6Te+!cW5lo ጅrT`$¨߀-!*JA= x9{5gwwf'Lִٕ, ;GR!͢' n.;215`72 =GREa !-DB!FΡo|}cyq#d&p{AJpYʋ/WJ(TG&V̗V߁KLċ_l%Nfw/yhҡ(巴nvF$NИ@#(*gNsC`--133ê>g iv\|cⵀ!+jp=O?"Cҷf^֬lj(AsbF&M!so [*Bun 7V7>ˈ뺆˅]"cGe[ [cP T

    )@e 6@vEm]T% /1 ]q]1TZѨo!斤Yeᙑ :۱pcdۑPɓ1ZRuʛk'Qd˾ ~;y>Y2mUrʁ NYwzx#B`~ <ڲJX'n[0<7AZt )ۘ_sycRB)bN޲;AߖVofyfqB,iEYۜq8m4uҒnF@I;agNR dy`j%q=HD7,r5Y57((ܞ <ȓ<355x|.ϙ¹s#fSɓ,--qnxϞ5m_>tDCJz$w*F22zO~tuwc NLAVBt'GG?^1-s/"J%fy_!ʕy2gHS? [lj4J!ښ)w s T+5weE1᲋1c E ; wU4 Dv >cqB$6 ʟyBhmԸ |sMۓPͷkC18²$ )E4*hjG@N=EXUG፝?ޓKyp_[l 3ƶfI2˜D?_86ַ{|A / W hP iK 1B !5  ~I7Cڟ%z_%r(6/>fggg~~)FGGMWr\n6 |Mo2qO!'Xg?AD<:4 @*yBkQtb :;\c@@ vp'xGxL=W0.^v G{ƴ!2ΚoiyEbL=Ho+Wշm JCspGk/o]o  BIRctC`3I ?+XZVhv^WNQY"6$b3jj'l ;;2 ?kt<-"o&3B^iCv@Af5z+a= L-Sc@# k_pH͛LMEwмM"x_M1N{WpHR jचHtԳ1"q l@z t˾ǩ=\ ;ohUkimi{6?d)\%<kyQm)O`m)r^~e;:k8vIҍUl[\;K/=T!P|h O3؋6MP)sޣDV?8['F ǿ=;r'^t6?gOe6oSC_.`p !;]hTҐ 3;3N>T,w2?mCUD#F.>[+z9϶ru8%- Ɵ4vkhֿ{ $(!_FcT+U<%| F/QxRt[xKhߪ`ど/.aZV!Ӎ(iy)͉пl巿?';T@AmJ!ϛ줷 runKŢy^\HF@ѽUڎ/^~p vGEɤ֠#|<aJn`_NeCu\۲/ tD6ҍV A0-zq(Wɐ& ߑ+6Q=H4j&Is⚈pFPQ`U3-Io^k?P설!X!8ᑃ||ij<;#ĩQL(&lq4~g֬j*+>ԴWv^= |[zfsBpݽ/\)ҡ;O#%q-s4E%v_09~f2p}왯-U-9A. TQ/r,ZxBR8!7?Ÿc ppmzvy _ ݹ@*_PX߾6<BIJd)>o p4#ܻۆWPZ `ycX0B:OF [AY B(W&`Nk:Rww~xtÿx[端ǎxO&{f?Qm[,2h!ҦPv2++ΞW  $3AA-8(E=sBd,GWS#ge:|8(%7ƵM 3'-I<O%+t6FUΫj\ P!H̻:gbAj(vAId*7H3n =j (^1ZR{dz{qlOרO&"kp8UE `h1D)Jw{YL*7E6HV:B!g{DEg{KaZgXn֏47ÉƌvҲeaa}\gxF4EZDFTζ5ƞȸ^lɪLYVlXgbWqcv r pr/Q |9&؝r*,!ؖD| 5go,uc MԸ8E%ؿ%ߵDiP <4xq{=>;ғl! @%T&2\NW7y&ABRa/oMuQMmZЃk*_H8DJ6v7~m˚?t<||-A^#rrAh!T@Rz%R&\Ѵ+yݫ{^XH.B+B^Wi}hu*4S呻}f% Q5f \)].MLcSD}I{O3=p)E:Dm =Hwe>=SpRwqMOmi P" 8MMS47>G[k+D4 0zs~Ľ՟+v"pZ#i˃St ~8"^>z:P&\6^MʙLG"N9Zd4룺=M~ ?"K[@K2ݒKy}_k8˳EtEZ5JkR;",N֦طꪟs_}>$GUoZ@-@IU ; cqrK&`W_wmCͭ+mP`Br}} t[1ǜswn&Ab CX1.FɨXޠ/wUk?ZkRyeySNy LRsι> (o _UY*1cD5cn?w'֤^j:ɲ#[1lW{;j M 䫾+xNǨ1RyS~ˍ5+\-?h4zk0dz7/ػ6>>_Ĉv5CXX_i 7j41R:'??0k9_?q{gWVVlܹ圣w8_#7Y__/"B!ZTp/LOE/O:& *F  ~_{o|ٜqΑ9SSSwZo>H/v#iݚ>uΟ*cQQ^"NJɓ x~_p7_G߼F5vŻcl!#K>P7IQ "OlO7\iNO2HvgT7+ {W5W?i^Ƙs#"x< "s!ˣ[J,/$'PUZ֭θvuGQ[kkkc8t]j`DYYJKi A݈)FkV]Nkq\GT.R1i695=r]lWZJ몚G"BZx_:w,ιsOɶ#!ֽۭ/CDUP"/Żbmm>UV61Ʋ9c 1'B.˲$I!$I$Ǖ`N's'OpGO9WϲX=`Y^ZXKix.Iҁc8"W1fzzk }v:O<,;*vks^Jp(#W"dAL ET# B[rdH&Ȟ$pA:*\ V=Eb!^(BsVbm %FBGh6c;zYT闘c`I  PDp@UE+^ @w[TA/ (1Bb b T\\%c ɉ΢5$"A$\Z_? q 4-VWW)1Nc{B^OL,o5 hu !.XR*6r0-X`8\LTT2l3RX 84md"tQ*[%p)gWD$ w& + K '%X|٤Z204,RM<$6Ȯ@Vml>Gfm#/rj KE3ҜwO$KF,:19,Q 3"# mfӼ5G]h|kA.c6T/!$}Mbt qOL %y.TH(EPv)ex$֑r$QXRSGϙxbh-I%@Pg BybĖZ!JV2!W!1Nyd)g$r >`p#k o9.1v/|7߱ NT%pv )$D`L?u7p!2RsCX!`F-Gh.1*F,-*N*bȧ%:kA-oIM Ϭz])RK kfXhAjU -کD+\?pk|GD%-n o^XXvȳ'NG4*M&bvL?o1* X,0W1~o^t!X_]y>Ue`0\Ѧ*67x?{j+ ."Ѯ \ $}}6|~jߜUJ(AGP&` r=tc~JIY^L",L=PK;"p%0 m`'Bv 䩧յOi GAQbI"YZDBۏa8trCTH|S/U!* Dh:G#\lOgimI(lʍ7/< L9Om^`ӷ,pu[ 6zv}!D "(JJp]ɓ{Z$ňA?PUD0lj48MFA f9n;P!+ #ĀiL@B}sO>Ϗ!ńyuP g(ل61Txh\`9o#G'T-3BgڎD&j:.v,`O<35p0(µ%v "T#B( FCssFɃ(.Ƿڸ;0](hY_rZNxa gy:T+<<2 Pnѹ;pϽ' _0S3e7vDYyRB9DytڽJ: ȳwIB0bv<ծ#Pz!t:,,lv_>lhp~~?#jsM1\)K %n~;ۇ\(EDhFYY \ wnLe{RT->WZ >1FKSAkdEȼr#pRK2&%^.pj3r(&b}6'SɆre[pMsIUCX*HQ+@NSє[x5Dz(UGBdP"W!xJ59r70.<2  &2ux%-5pcز4cAC83E;3Eو)"$FU҄DK>AI`nd"B? 2jDL_G/o;fA\Dc0t+Ru@@h)$\,,D %$1*Shaz;Fq|~c<3wNl_%1Qp8b, P?⣀^'G+fb ""{OKjB`7j I_ޣ!P:@yx">-L2gNK,6M&8}{Y9JusC w|N`B9$b;cA **}q;W\PD @٣y~pǦobM4FK>|*) >{&Ĵ٧xV}6{Cw< 1 !aGTA#&xL $ktvEBM, ^F0eT:ϓ@B;OKj ZD.IQhĨY5^t8c-oi}iQBU.=[34F8\[>G> >jT hQkCCeDO4uH1ŢW q({fENnyCA Dg(mS\\EĐDq*a3p{igƄP 8{XΞc?G}cgY''p\MHB%:=  \kl6sf>KKJ" ߂PصJx$H|4 &.m:mT 2y\8V#x?B:$nXM83kAñā1R [d0W"$m=3/^C!vړ (JՐ2PUJuԇ=gQPU.B'b@bZ5N:V7i?G281ڕS9{<Q 8N/, KBq Oo5pbhLUvV$04q^(<_9 ;"z5|(# bErSY1pY~34<|~~~g*MP|ٳ&*XPU@Z܀o_yVDEl\~T.WJK877UɊc  ޳gvOB* :[vёqPh4?O|H AjP^bxvh Hb}BΞ)dxZ>o$S瞛 B6q`~`ؽ p(^D6 ^^"\3p)W, >SJ8^. `1"D@rW(c@ΜˁyىScs|s֪qD_nc`}C1F@nr1sTDFDԧA6<VZLbbadxp3*t 4 ;(Hn&jz_'&٬8qsgJ[ BhBvR>0%I*@IDr-bg+dkٙ秛lwky gYD\>c0>>mw܊+ 9CQzc%vKT}=^ACKH/~Po߾}۷o߾}w@fmx IENDB`mumble-1.3.4/themes/Classic/filter_on.svg0000664000175000017500000023720714010707274020225 0ustar builderbuilder image/svg+xml filter Mar 2010 Franziska Sponsel Franziska Sponsel RRZE filter search Beate Kaspar mumble-1.3.4/themes/Classic/config_shortcuts.png0000664000175000017500000001676514010707274021620 0ustar builderbuilderPNG  IHDR``w8IDATx]$=(ͱlo϶mimcjVU=lݘNTgq71Yag_w>|p='6 g OJaƍG"a({PApt8+T ? 1p]2c ee!v˖. !t5  2."O /D"Q^$;w%$ujc==fxXj%:A755=DʤoJf;D2DEE%ZZ|9V(" C@mmmh![h>v Xf 8T|sb"'I|6n}g<;vH !lM׋S3L+ :HJO Ns4An)0jkpoNj-~dd7m  -O; b>?xuco4U=__ Am```0H,QH$ H?[aY3}8Ad3bP-* ]u@{bQo?s{xdNu/ӝF %eB#͡O!'Ap8GʛP~^0{!ryI5\M(SmY+ TvL= $Tbj(6) -w=eSϫ{o,klU0n s B>:ԗY"H36wك'#\d裂y^]Nh}8 oe<#](w{Kx0C,// !<őY3J@8>W rC7>\{a0S{$YPQQ*sM7QbtLtww!a:PXx1¡\o$4Xv-vlۮ>d@+h}G)IK:g'sv5^S,SA@iҭMa}PҶ6 ~~)aʕ* -sN{y^34b…hnmE`085<#Z ~٬eA`86x◦ (ڈd"A\i@ձ}6s/"+޵ `p޼w^(Ìl޼Ý6)U4.pi n/ 7e2vG*䗚n ņ/VԈ(lsM 4G2@.rPe: )¢E`"SCŋThfr=]Cyyel{!﹛(yimM~Xo P ( seǽ te3+ pjkiC&Q깃= MxK_VF(/We 7~8# @CIҩ]v VvgU CsPQt53l~")T;TO<QUs4dVGZ611.6~v TW$qa0+n1oV!gbztSA:"\ǡ:O&ޟD@>TAPLl*5Q^`]UѪ'oePg`ⵀw/I((G:޲bJ@uu5jViMhzCJ= RR3m]bA0x`HB.#t`" 8C%uU3;1_ۻZjs,L5w <0ߨ 'M?#ܵP"FGFR?I[1 ^{=5=`Z4^Em{?y^](}GFsW2 hj`-}ɠ,`P/'S$n7B7-Y=.LGF"e|q H);pe7#N\^vlBzj@ $<Dj/4? LK1 Fx~hh\@˩+7OG"# "ʊ*%  : XrW/Zuښ!Do zZ 3ǩ J@EuWU}?G /ԲmJ"+ V=~0pr7Wq0oz'ĹU=τ"(1zPtEk.rv#rp|X͉{-RInxBM3aYN^$$Oլ^M7EJ:J G@ygMMw͛+W`T[qXdkÉ ޏL=-q> b??fG)|,eL<-@gO2X!ߤ\XO :_#4>J{b;p+u_fg h^6e'~z =$XL:;9Ƃ_b(xNgME ;oW2O$UAk0p؃\iDӠe=A@F slj0a A Yٷ.́ȝKK|8=4яl=#1<矸pzEX0'/qUiHS=暔Ξ573wU%AT)P:Su8 ?rb_ULloS5q_$#$hou!J_ 0`w;AQ S1&xzZ7>(܆F^AD%˖ 8GɜsIn[d\tXaS[eI5Doh,3ZҦW }eeQ _ zAn*1SĂDt$\@w4MQsHkY1B%`2}; `9Y<Ӌ1I2W!zB1=e$G8 y5BDRQ\ʶe/i[? mͩ!9Z^|><ݼ9??l YǢ)BSױ8 b#i$(H Jxgq QS71֠5vEY <,7O*͓x8+gW>L.ic֬Y (#ޠAsP;`y}OqrK'#z<0f!%PKlo,X7xyNFI !TUq_Ⱥu hmm,id ] (P TC#إUazB%(lu)Ԃs$x44V0Жm`j&Ӊ>}\S`K!3H/s8u u@ d񉚌xcGs=CS>kjlabNJNX -Gzhua'Ҩ F’r` cgџ {EgGX@3;J"zzUn޽[LEyƆ>e3@.C?Gq<]Y_ّ((|㙱hy+qt!egmZZ6g2M*á>.td=1C:9M%Kҵ$ 'TGG$Cθ맚V/:_^;^"6Ρ};n| |ƾ7\ȍl] ~<, ^@N>=d /oJ'>›%<қ<2gđPxy-z%O~pV^{=>+KEub(Wu*UkVו"HL$>L&_e[**LdmòdLZ\cNm6|D_J]͚B}Ύ?6Z?::y#5 5;).c(~Q|pd]p)+sƷz|S'Gi|o}&זe K"K$AeE%;bM 9ԓO++/[3`YX9M;t}9#@) =ic@2,`X!C@E3<|wki_kpꫯv:'CbBrBB{D2ͩmOdapg0D塱ѷ?j5hETLh{&푹 Z:q̷6s7p 0=<x A_󡪚m,.,x|M~_AIFlpsO uyd+!ܓ6u`/g+ -c twC#./B>ΟS4=0kNzw;vXnmc1pQ<%Θ==- X?"lEUE\U7,w )U'2*źbҥ\6laE[o~pdTVVp-:oH" 9{u$;n/0LUSKC[arݠJ$RBB:Zޝ;wkQE^  5**JҀfL]{.j^?BXK}|I JwTf(ꄞLGޫ<PQ7oκ|dFt-K>E5y\esQ6۲s o{vg/oo?lQ/@: =gWA -ޒ/`AmpFqHyZh0} \wSH)2'{pZ-jFkKt U^&^U/Bs[a텔`H$ b/8F(*Y*(XՀL1%-9mˢ~q]wk]=nq+&/*y8ZsR !WNǶJ qN|M_W,0smIENDB`mumble-1.3.4/themes/Classic/channel_linked.svg0000664000175000017500000005732514010707274021203 0ustar builderbuilder channel_linked image/svg+xml channel_linked Martin Skilnand Martin Skilnand 2009.10.20 Mumble team Icon for voice chat program mumble mumble channel link mumble-1.3.4/themes/Classic/layout_hybrid.svg0000664000175000017500000000773314010707274021121 0ustar builderbuilder Chatbar Tree Log mumble-1.3.4/themes/Classic/README.md0000664000175000017500000000400014010707274016761 0ustar builderbuilder`priority_speaker.svg` is a copy of `tango/actions/audio-input-microphone.svg`. ### tango/* Licensed under the Creative Commons Attribution-Share Alike 2.5 license: You are free to: Share — copy and redistribute the material in any medium or format Adapt — remix, transform, and build upon the material for any purpose, even commercially. Under the following terms: Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use. (Source: https://tango.freedesktop.org/Tango_Desktop_Project) ### filter.svg filter_off.svg filter_on.svg I, the copyright holder of this work, hereby publish it under the following license: This file is licensed under the Creative Commons Attribution-Share Alike 3.0 Unported license. You are free: to share - to copy, distribute and transmit the work to remix - to adapt the work Under the following conditions: attribution - You must attribute the work in the manner specified by the author or licensor (but not in any way that suggests that they endorse you or your use of the work). share alike - If you alter, transform, or build upon this work, you may distribute the resulting work only under the same or similar license to this one. (Source: https://commons.wikimedia.org/wiki/File:Filter.svg#Licensing) ### Information_icon.svg This work has been released into the public domain by its author, [El T](https://en.wikipedia.org/wiki/User:El_T) at English Wikipedia. This applies worldwide. In some countries this may not be legally possible; if so: [El T](https://en.wikipedia.org/wiki/User:El_T) grants anyone the right to use this work for any purpose, without any conditions, unless such conditions are required by law. (Source: https://commons.wikimedia.org/wiki/File:Information_icon.svg) mumble-1.3.4/themes/Classic/config_asio.png0000664000175000017500000001524714010707274020507 0ustar builderbuilderPNG  IHDR``w8nIDATxàSdήY@Ǒ+m{a\.L)8vLTw&;{>>Ѵ_"bfND&|ǔ"2a:O/,,%1ӌ{On5 W]Þ0uĉ =|хm|Էg7>p~}kVΝN98lx<9)õ\X\BN+*OrooGnooc~ KsmuYRf*.Co(@$פ \Ἀ Ó77^]YykgN-%`<yBW3_ s|O3Ƹd`̘ bf`rCmF4@U!^R"TMTľIťooa`Z^[nXH1I\90.ZFʨw7U{+q\ݓM&ؠ8;4̑h|n??xs3#e;2l=[ oo@oFk &ԑ_g }aڄKle|w־)s p0|O fHvtBDBD7{Hk{?'XF{Y`# פ*!6$iIa{gPUɃlT_wMw *6_#xb T~55Zꩀ2k<ՠ}4DW̦} s)u `%5Ko6?;yFC^/扪Љ3^`Ѱ*`P $F2& &Z:&eĄTY<)y#*!a{@2 OnGaL|xAJx;1 QȧsT3._l"Ԅ28RQ崆&HrLIԑA2zӬ88JEm`;Xdϯb^2M缄\쳒ߑGAH_T#f_x4+ `1+-O /0T)Caь*Aqte2)ez>FM:p_ RqqԢ9Ƶ׸pϟgqq3pY.\ȹs9SsD[Z\gdlf}.qXi T(@fx4~Vx<~s¿^ \o:<)bڪsDudi޻E=+M| %D >:KOs0c}:Eɣ#xﹶNq>!8q =wk]\t>xkܺykT6yF©%ync{{y:UU5;,hp]^{̲l[T 8d2hQa 擟^D2jq*N/ҹt9`%\bCB,Jpy>XL?OwA?5ٳTeIoUvv.fA3uh_dwoTu_*B|Xsv&y c41~դ,h;lRٽuSR1K7dyx&aEwwheG;u,Y85[([k dK]U8ٺIrX٣ZPwH1I)#_ d R@(Ap^"R@-1"Y`Ϝ93O@տ/|'a8Z{xisxUt У*H1NTI11eJP塊FZq81 ^ n`Mf Fr}g8Ro6"6.s!#UfEe÷? 4 *g索$Ȩ-cF3i&u2E#&a| -)#8R0UDhbho@Tt'Oŕ&&A38JކjaRDE#E[?tWDwyB 5g,I""tt^-\K Y@:q59Y `"ߑtKu޸`Ff*kvG(z.iH5 _^cht<ي%@glo9*W>;j0 iGo:1VWi/w"Y4 Az 36vli%j_Q?:BtpCTGǪz==S^\~0ǰ+;<#ћp5)9Wb<$2L1E^Y2{:c3C=@$9""OSѩGg p{e{ۍb8xKd UP>ԸPQX:@1RO\0&Ѹ~ai k h4\h}x7!DғeMجt*ٚ:!h36@d~$U\9.8xLjX]]7ۻtՐ i9OHƭ1cx4e[ٖ 652QJLƜ)RՇ^y:FcѽH ljݚ=Z 7ȲVSO!pS`e2 L }P%D_@ҷX8Kk,Q&cƨL*g_Yf2E ; 8u: #q/kq)S:a%YQX&d ؉/V[b d >΍ ^w $!'}D̃xYSpaah V;pSr 8&N4rGd&}YJ“Bgy=%I~ !jX"ꄰ`x?Ύqyylcol8dD@:2jBI3*L%}- `2t1KAwƈSe8C s%e1frsx#1frADM=AUהlu<&pӣU|>7[fGAyQ^cv_ 5^5pt w?+:BFKW0iB2NJ;zMPӪ" J>r~kEO05HgITXoRU`BWSH,qr\~m61:LVʨQ_ܪ}n6!q' >fjD P3u  07~.NHEտy>U努#NSK@DwMDځ?pKt0ws \!$yH  'D%Z>pvXhD 4y0>%qFU#GR 1JQA{xc1A8a:TӧyF>tx<*S!R!1E}{ٰ5W-LᜣP'Z>Prg4}dHR*eT@`D:DŒ3M?ՓL{g<~()%sojy xAV_q& !M#9wŢrMt@H/qPD\ F(} t:(p(Oud/wsy"092vtlC<0fi44++gGKI:FѹTOvZNB^DHY Le8l;ޞ /FzBgk-7{MX۶QXm۶m۶͘8qNе=ի3W{pLfาd(<>bt4 I8-5 ۉ? f^& 8V'jPUK[ &Ѱ .4ҩ䄇? 8/wV|կߨC~t_~ZȶX'b݂*V֘<༎\­ȰHz`[:qc/bܹ}G$Nl<&Xxv +7_kЊyߍ,=K ~lzaĆ܎ ~?ĶD4kLj53YONGVli[e@ƃ< q~} -GnѳBzޜ)}]Lzx{'XY4Z٥m9Z5SL630>>&]}4Ç'04/`TM׻-tXJO2ůZ,fc'Y~6UUWݞ:TRRL_]c (I.Bүd.־b#yRf =m%3+u gygUv7 d?>Wq'b>nng6a<H9 4=>t@ԎںxSR\L43qg ME0'G)"қLHCc-{8\eKr#hIK]ee%RTd>aɁ6dyNe_ K8ii?[^ cfSW!e-1a??HAex<1+<ֱH;&7XBR\=0(Wh\>=el}>/ v͐{v!,) ~́_)86:$h61vGG7X52|`dܹJq`W!{K %xeDEO/yyLL L5"#n2 Ό(hllJD.]$;NǑ5Jzijjc. IM%pEFUW[_w*|"d channel_linked image/svg+xml channel_linked Martin Skilnand Martin Skilnand 2009.05.30 Mumble team Icon for voice chat program mumble mumble channel link mumble-1.3.4/themes/Classic/layout_custom.svg0000664000175000017500000000621714010707274021146 0ustar builderbuilder ? ? ? mumble-1.3.4/themes/Classic/tango/0000775000175000017500000000000014010707274016620 5ustar builderbuildermumble-1.3.4/themes/Classic/tango/places/0000775000175000017500000000000014010707274020067 5ustar builderbuildermumble-1.3.4/themes/Classic/tango/places/network-workgroup.svg0000664000175000017500000023377114010707274024353 0ustar builderbuilder image/svg+xml Workgroup Jakub Steiner http://jimmac.musichall.cz lan workgroup network peer Garrett LeSage mumble-1.3.4/themes/Classic/tango/emblems/0000775000175000017500000000000014010707274020244 5ustar builderbuildermumble-1.3.4/themes/Classic/tango/emblems/emblem-favorite.svg0000664000175000017500000002371214010707274024050 0ustar builderbuilder image/svg+xml Favourites (emblem) 2005-02-01 Jakub Steiner http://jimmac.musichall.cz/ Andreas Nilsson <nisses.mail@home.se> mumble-1.3.4/themes/Classic/tango/categories/0000775000175000017500000000000014010707274020745 5ustar builderbuildermumble-1.3.4/themes/Classic/tango/categories/applications-internet.svg0000664000175000017500000007550714010707274026020 0ustar builderbuilder image/svg+xml Internet Category Jakub Steiner Tuomas Kuosmanen http://jimmac.musichall.cz internet tools applications category mumble-1.3.4/themes/Classic/tango/status/0000775000175000017500000000000014010707274020143 5ustar builderbuildermumble-1.3.4/themes/Classic/tango/status/text-missing.svg0000664000175000017500000003566714010707274023340 0ustar builderbuilder image/svg+xml Jakub Steiner http://jimmac.musichall.cz Broken Image image picture photo missing broken 404 Garrett LeSage mumble-1.3.4/themes/Classic/tango/actions/0000775000175000017500000000000014010707274020260 5ustar builderbuildermumble-1.3.4/themes/Classic/tango/actions/media-record.svg0000664000175000017500000002721014010707274023336 0ustar builderbuilder image/svg+xml Media Record Lapo Calamandrei media player record music sound video mumble-1.3.4/themes/Classic/tango/actions/audio-input-microphone-muted.svg0000664000175000017500000012673714010707274026534 0ustar builderbuilder image/svg+xml Jakub Steiner http://jimmac.musichall.cz mic mike microphone input audio record voice mumble-1.3.4/themes/Classic/tango/actions/format-text-underline.svg0000664000175000017500000003436714010707274025253 0ustar builderbuilder image/svg+xml Format Text - Underlined Lapo Calamandrei http://tango-project.org text a strikeout strike-out write letter strike-though jakub Steiner mumble-1.3.4/themes/Classic/tango/actions/format-text-italic.svg0000664000175000017500000002604614010707274024526 0ustar builderbuilder image/svg+xml Italic 2006-01-04 Lapo Calamandrei http://tango-project.org text a italic cursive write letter mumble-1.3.4/themes/Classic/tango/actions/document-open.svg0000664000175000017500000007412514010707274023567 0ustar builderbuilder image/svg+xml Folder Icon Accept 2005-01-31 Jakub Steiner http://jimmac.musichall.cz Active state - when files are being dragged to. Novell, Inc. mumble-1.3.4/themes/Classic/tango/actions/bookmark-new.svg0000664000175000017500000007146214010707274023407 0ustar builderbuilder image/svg+xml New Bookmark bookmark remember favorite Andreas Nilsson Jakub Steiner create bookmark action mumble-1.3.4/themes/Classic/tango/actions/document-new.svg0000664000175000017500000004177614010707274023425 0ustar builderbuilder image/svg+xml New Document Jakub Steiner http://jimmac.musichall.cz mumble-1.3.4/themes/Classic/tango/actions/format-text-bold.svg0000664000175000017500000002531114010707274024173 0ustar builderbuilder image/svg+xml Bold 2006-01-04 Lapo Calamandrei http://tango-project.org text a bold write letter Andreas Nilsson mumble-1.3.4/themes/Classic/tango/actions/audio-input-microphone.svg0000664000175000017500000012442314010707274025406 0ustar builderbuilder image/svg+xml Jakub Steiner http://jimmac.musichall.cz Microphone mic mike microphone input audio record voice mumble-1.3.4/themes/Classic/tango/actions/document-save-as.svg0000664000175000017500000007625114010707274024167 0ustar builderbuilder image/svg+xml Save As Jakub Steiner hdd hard drive save as io store http://jimmac.musichall.cz mumble-1.3.4/themes/Classic/tango/mimetypes/0000775000175000017500000000000014010707274020634 5ustar builderbuildermumble-1.3.4/themes/Classic/tango/mimetypes/image-x-generic.svg0000664000175000017500000004644614010707274024334 0ustar builderbuilder image/svg+xml Genric Image Jakub Steiner imagepicturesnapshotphoto mumble-1.3.4/themes/Classic/tango/mimetypes/text-html.svg0000664000175000017500000021421114010707274023304 0ustar builderbuilder image/svg+xml HTML Document Jakub Steiner http://jimmac.musichall.cz HTML hypertext web mumble-1.3.4/themes/Classic/config_network.png0000664000175000017500000002352614010707274021244 0ustar builderbuilderPNG  IHDR``w8'IDATx[lm۶m۸ m ضm۶1u=ww֪udRU<Ϳ7}/F-槎ؚ{Y[''}F?d889,&O@wHOyPgY/z#111\?nzUmM9ӾUQV٪ʊ]IM0.'{Smn9|gy_hq r]+x]By?DهCRv288*B}B^>?&Ro{`*dqć*3Ɔ}-gZ7>_^Z2> 𸜆a7n=wgsSͺCS!lz2,.s'c`Qpz튾62?ߗ.(ڌtHz:ҶA<bf2gx_CoZ|V#]+bENQ\l{c޶u ^%G2wva:i6K bxλ̛[]yin ;Nx.Ol0)pxfNOPOೡ Yex|^*:4UW m(a# ;l0{::>h!ܔ/*,Xmb9WCksXS~8]FglFkn`1ȻPN0١yҿo$BVwG : M]?"T3ԑ}嬷ݵ <`Z-]sQA~;qol*|>yGY]4y l[ձUWVXwڂYG&8<5Vg .XT]VGzEg~'b0$KD>>Yy;0lp뼹sރH(njښ)|Z[^}1;j XJCz]^4ie_ [?XZ8Yң E`]Ń @$!#d? Na?9)*\6|Unﮬ(gά/J!zdg-s6ЁBHB5T&D=}L#Dj!*\x ^8kY$ulc"&0up>֮}Lc̓&3{6Aeuiecu4O|rNAE 7ERm"MX{4 8^tҵP_[)/sr5uO{[ D~ (-.*vA*M{@'Wj,,2KQ4'CHΝjfqU .V:vz5Nכ`\w.,#yeu6ysQ6YN+[} \s#9wu}Algۻ:;Y3gp,owCs,oKъ,tox\ B ^r}$EIblZ)>7D_?FLiY$(7t~aw&$<˖.aQVRɉWVZRC}`s23.[ ׿$7;UP ̙d%E3֬Y,oٸY%%)V+jl0[6Je*`"3n@V98m> @1}Q ^↞șX->#n?q>6#[|MV rE*f4t̘kѢ >1[OhpZV85;3sMzȑŋ>!Q=-޶bŊw *p[ 3%rg'TMBj; [}"AV 8}FSv|dF!>EZ;ϯ' R;K+aBBl߶y+ ؔ7eE"X 74hڤ? MK;Tg572a5ԧMp6ZlQ>½.2|ָ_$+@9$+{O؍zw8/0&tL^t$y :<2ӻ:x—"F{2 aAf>&;פWV D;$sKx֪%h/\hK5 P)@P>F=D?1*Ғ2BSJB@@M$$&Q$dϠ} ߧ%^301#a݃I x!Hr"؀1_͞byzR|ٳJJDD >g10Zxp{&w:fkkj!F2x-ƈ!ɳ|S!w##0, %YWe a9SO#Tծo\S^zDS0n)HRTvIOe{ W c%#;@sQe3ڐcany&x ^'g#\ hPO$c;g4 c50}$3$MTZ!Km;cgB@wFl׊ebLgW"3FDy2fGjz"ҧyPnЮ#tEyd%cyxϙ,?B9&1D^9*O3\<:TUT$$n(1~2<#(kij'8߱G@ Ȝ*ijlrxDj:'>RO[τg[,S36ُ/x$ 7%ފr"+@Ή5vh+ GcZB 21 2JxpM#`ܘP罱*='Rԥ 9$f%];VFρOX ˍ? 6xd dIIX_x:åPf8^@nTgOxsZj|,FV AM岚RKa f.nw_i.E[$φt  Ҽar劏a8۪nm-6o?r5N_5v{y36QFG٭.ҕd`B47J^)s6 ru$Ѭp6g \4G$+'+GsG}F3ax#U_cCgw8l7B;?>L܁Cz/+u?[b  Qf=挥Q2NSmPN$9啓Q=BadJ@8`ag{|ҌPw?xD+ÀF*N }^9d0N5^ ̳6n| l\Nqvܟ}C"-=9J|1H8qwc(oi1vTnPmty f&tFԏ Iυ`dix["}sO`vYWy3F#:6v8tϻNon4-{Y0&'jX‡F@W z%@Y+@+pOJ0?X[XyZyD9hsNii>70?j>iʨOϚ/X\톨Mw@øq8sImK>;fc0˜lކ?oCY`>V]Yοm(o5=i*nnoHƍ@)NBPW R(uj8|40ڼ;Lr/w+wy4nIǖQæOV k`%c򀈀T?1'cj|uuuuvtt~yGLtr>pҥҒb1]*|x5wĺɰn׸ѝfǍ*\mm&444 nܸ&ܺu R]wEq?j:B!rDaj=S^^*L̢z4$}h҈sv;i$pZ3 ;+%d&4?}܃n-|\MZ48)Qx8kYSЕ&P_ԀDpI!*_.t.m7o d 'N{]P%_-˥*jllu..\Dt%N0/] i{1ŘKrT;37YKZFcRa99Oæ-^qI$D|F2/`uAgQΖGT|Hi~0t0;;:$'% rDRb"R4s;+ÓW|^qEqxh"G`Z.- |Fi"Ƃ|c^NlVQB+ t?c|j6C6sD(I,báCQRRjDh4:m].}٠0Xz$waXlD#5%%8R,-d*,?v I@ff^'&i2z1jZq@ xR\eJ_JRn7tq"58t9!j?03A(hpСCzZ/AJK>Wk%@P'(R0<!)J?&\|$w3;+RvMz_.kI"gt#FP)6@?fYrr ֿx6v9IUz\]#X "㳋^ ?rhlK.8JJE93_GhbjXq8+_TwMD0cf6Z}fWZOg1BĚPL `.KFu||_(HxddA47azza7cJއW=>xkWΝ;P477 >Oz.j^+Z/X1O[L+ <ҨȈ Lvhhmeة B?\FEgYN ;^ұGDL!TzIS }Z}lKKzo+F`A)Uھ1Q' KPe2AQbo#PsqyKPA~-aõ\M`Rz2?FޓF C!(0yzy"2\R ʈvʘt}tvvY2Cܾ 2rllLfmڼIdԄߨsȌᎭJF W*Wu9&[ ӹBr˛L*<+P6x|ژZPڿ|eltl].72W1|.5~Dɳ7rƆpRT֖qSc#H##Ð2n=u r['eܿ6k6/|Oe^*W n[e4`eW'gR624$Ѝ4P JB@#Fp w-XֈI0 ĸֆi3@&&j ~Waq:'߁xb-&DˇxlZ93OX6XNa#MPvzzApn] 8]S z[(s΂6x8#]%S1gnj (QD2V_!,\9dt_o/HL/(Ol"DBPћ@oB}*wb80Wl })Eb0llRFlp9p'-N l}  Un(]MiB-嘚K|ƴz^QsF}(CL#iեׁ+xUb,\8̖eap20ӎ #f"0 y`R$g݄]N1 H)(!-c\Rhcxܛx4HXrrr=g'=UYQN`t$ԔOw %3VG0W_)o.HG_B8|0lo nw ٷ`g8xFy)+!4CJmOIAe:c\9&޲Gqc]ܚ 8hqf] ܫRi,L%:`N;f{1uNyWj1Tw<9u5\, c~dCm;[Kwt7.ӸҠc"Œ tR)D`,#'j>P׏GrP AR+4wF'|GYSU4|s M,,,_Ȭ E9Ƽ̂NVd&˲FTF/ִhWk.߁DI0yK"""[B}y2avX",o) ߻{tHPUY ~xvkRLBrF&3eAKט?@?2W5ٱ/ Va % 6|ҒV_wd\,񏙃aZ iX#/&_Kth6md7R=09OEj>8DʋPWvG /KT؝R;\XD"***0EA# 7/چMaXu+֋7"L"]Kج-eˇ=L1Hxvf0j4DL02g4~p vPrtIXd0$3GSѽ{;SȌ6m!ΤCܦi OB}(Coo [BJ0=zل0}hU`%RAWlZ="cB'7Q!*U?(T_ee8S{FB_+/#i f_/1aý 3 Iچqw8&b`B'T'턁ep FB5fۀh10G;`d3%wĉ?rRWp626u|(q{nS`1ʝȵc2džd0Tr&>aiC-]uS_Ga} v :i4s_EY|cH+?#H-;NGs;頻Ee ؓ3=#jhwlcq٬>|RPn@k4"͵uiȲ1!" ] 喏$)zM-i_Mi ===kxrQ c_if7yْ.g-~ ߅@z]*=K9y6)Zے`:lcnx<,A͓&x}Cs"=G^䏑^+ Jd3\5h^,G כo^\㸱\NG򚵄>;gYoBe|wWOVzO|F[[I$49,Br2E/~o)Z3Mr,)>/}lk~d IA?>OSX%BIENDB`mumble-1.3.4/themes/Classic/priority_speaker.svg0000664000175000017500000012442314010707274021632 0ustar builderbuilder image/svg+xml Jakub Steiner http://jimmac.musichall.cz Microphone mic mike microphone input audio record voice mumble-1.3.4/themes/Classic/filter_off.svg0000664000175000017500000023720714010707274020363 0ustar builderbuilder image/svg+xml filter Mar 2010 Franziska Sponsel Franziska Sponsel RRZE filter search Beate Kaspar mumble-1.3.4/themes/Classic/muted_pushtomute.svg0000664000175000017500000003717414010707274021660 0ustar builderbuilder muted_pushtomute image/svg+xml muted_server Martin Skilnand Martin Skilnand 2009.08.17 Mumble team Icon for voice chat program mumble mumble muted pushtomute https://github.com/mumble-voip/mumble/ muted_pushtomute.svg mumble-1.3.4/themes/Classic/muted_suppressed.svg0000664000175000017500000004676414010707274021645 0ustar builderbuilder muted_suppressed image/svg+xml muted_suppressed Martin Skilnand Martin Skilnand 2009.08.17 Mumble team Icon for voice chat program mumble mumble muted suppressed muted_suppressed.svg https://github.com/mumble-voip/mumble/ mumble-1.3.4/themes/Classic/channel.svg0000664000175000017500000004673314010707274017656 0ustar builderbuilder channel_linked image/svg+xml channel_linked Martin Skilnand Martin Skilnand 2009.05.30 Mumble team Icon for voice chat program mumble mumble channel link mumble-1.3.4/themes/Classic/layout_stacked.svg0000664000175000017500000000764614010707274021261 0ustar builderbuilder Tree Log Chatbar mumble-1.3.4/themes/Classic/config_basic.png0000664000175000017500000002410214010707274020623 0ustar builderbuilderPNG  IHDR``w8( IDATxX,Y`otmBg۶m[ mJc.kpƠ>s#veVs1C\zEpm3a*:*--˂-vl$ }c8M^ߖ.($$i !,K}=9N3k@olh#,aܝJ%_6~-tcqĆƋMY6H=dp}3ZG7O$]tC p!u^*-`p9xx)4L< cJootz["|gWwpfsuuuS7<`4TƆ+; I~͙\gP!W@U6pwq[SsANwWXlt:ݣi,3q u wq63_/:EDH.BGa"uO&i>eF+GTq}cB!]Uil`󷵵/'fS]9a@KHkʁp&(()HD5{<} <ܡt>n"]x0~9pz:i7\]DrO_Nxܘht---{XgnlFH0H0p!k g]נjr%"|{4+ϫ.EƎ|@{ B.[.ΕMw@SS]=vH4cjR)d3O҄320@г,B\]nQmae؄*kJ1Vj`g6Y)B|,HBbX-bI @WOMtm $؟7zQ 1q%qo5I:Nb>;eʔgrqk H {pTDJ.@1 744 re 7 rl)E6AnW6WBpL!fvۋҤU-J$HXGkMpEvrt[JD`b[|A\6*.hrQƏ0꺣!+ 2!(. Kwϯ4if@0?DA^$1.|l^xhdj0ƲOR50ǸYfcfffcfffef&)ꆍ+]i!)^bPXkv:3/Y䋲l9͎I9xH*`ܗ~*Et.e;SbHF)cS 9䡃xrb~3 `C휳D"'r$H45 :ks~Hΐ*DVfF^K7ŀzvor <1#vK<OKM)Uemb"e" U?1 {((,~ڵZ7:l"ϧE?aܽ.q⚰Lrjzzjؾcfff?Dŋ0.voD絡Z#΂IbgΜyō23sI0S[[nWYg_癰y2c`u#G`J *e]5>/9G1C`((2r˟y>,/:hB]c&ˆf$>-is'|CHͺsRx' rDi'P‚]kBL p@2@ovtHLVt.ڐ/Hm?J;Ι􎙏_ 1dv~#!n@n`b|L/(굺jBWU47Mƫ2`ӧ|gD7"F`Es^؝狴n7Hw(),vl~J;cYu>wU s]^x$ʒ.0T bW&Yiw ;~CH>Z|oeHwFjU.% u`rqqǖE(;O_if4LkJ(ggϜ;x_j{e;G2]&X5+s\2oֱh+kHn/*!! D'x\1ڴy6 %y68 #[O:nЏ'a'PA8:t<&JAp\}"5^*;T39OhP=AR-33XnsFFGVVWVguVúJUMuz]*jx4=,+ 7^K[^SH*igAGi _Ae>-hN78aUrtvn5-9|LD~C"<KFUUfQY/6y7<4( Ew;M0v^]51kZcG`Ν`"nH!YC +Ξ9hs(wmY!~L?X"he!ϋ- KVp{"@(d˄B) lۼ{bM%'oa[ B^rF6GLN|V T-/ ѐ e$a,of͍9|I vߓqBbzzhgc歴lZU7ΘV%XMn\차') [8cc&GATRHoI|uSdJ`Xbi!NfKh2 5ʶȜ '[" è1M8M5Jq2BgD J|d.(|Ge0 m*u>, G恴X* 0kg6؟@RgiJ{6-)\~fXl]S9ˇ%[õ 舕rX5Mmd5(*=m=O"0Y2etC%.y'@xOV`b4e<ğM!WƢBR"W]*aFr>TKif ]%`bEIcۡ  ΍֯7gϞ;]YxK[”Jʀ,qHQXpEas2L ׌ a-1S+W,asPW IYUⳭAm1ЪK#dFo&8{diq'W[g|"u!SjH,k}i QH*;)u)@{}0Ԩ]50a(j[dO(>^Rk3 Tqhh4{Lsw֮LBӺXx Q ;,-f1+6m\Oiv]^cMMѾ>j[L8̓hwWN_5XTK(  nvݘu>@P%~!fa F`ac:.}F!šh'{c_QmC6Z%(153j Ϩknw/&Da#!P B0M |l_>$Ihr6ȏ"Nf?)UU .OP% [7 uZ7Kޔj-a繲D@f̘ @)1ާDVį{qĠcu>J49DQ y?GoO|" X I]|uB(; f=e8ɴ5 hr VM$8Zcw=DmEȎz s,t[R~x%!] )_l㳛+5f0f0`yOl֙`ds.&,Ŝ1=OJO9ݳK8HK[n[dkerO$SXxD_c; 0"h䜦-Rjՙ)"p$^#'&b9>үIH$Lá6D߷ۼk~;V6msS düawJѧ; a8/ ![WÍO &t   b<{d-уEGے|`<ߗ V- DAADѩO{ߗlٹ~vͬRkVk@XP$~m@ 6!%(Q1Ec"FCoZ-Mp F]r+;$]rckN ΂ >#ͦ>M7}?wvnnƲk=-pMW'CiF'FϿ|+RNww(LfG/t~8e.7N{kkׂWB͐;7;7G2GSCȕ0E#zA2UM)nj{9#]dibo_y敿.%H|Sweݙ6Z #2\:w{_#eSaF9x.;z ؏'OH~] Щ㽈Qy>DI[OfMFC9ku]z%HC.n\zz>3}}ݷN`#vtg6ӽG.+̗L5+1>h?u)1quhFա|69-U ƕ/#Os/65 fFM#R'v=."((gי4 v:~S,y޻V t۲qN֭[%"ئsIP-AګPF9 L3 πBAG\k8fqf Zgx>|K~ ahi1'Ĝ"iyvx;{.$lN@<׶W,Mu0o;l4AH@'`6,+݁?cI(3|t-CC!{j4./cĪ4캶%7Tz88F'0Ca҉Z8[\Sh. >bDta6TDAəF!;1.M4MlӇn~c=5ևI8W0q 'W>в~e 8na5(Y=qQHšsiFdH"ƥˋ.pC{0=proE]!stҖ+ߒěVт&i>-k]ouk6;dFIpj#:eZP*" 1eDB2Lk͙2-`֗yz/׹xTs-/}/>f_fG LӨ&Vۆjܯ˿gr3p'G;tOcGla\ . |!#"EBտ7QF,-LZHm6h ҁYM|nbr"3cQϻN?N7㼲=G6K4=ss~(=`_`[N`P x@qX鐸 J>#`bs.+8ޟ>Tj ʙyּjx= Ծ8Q2q9fa[k> aֳS-A BH@<@ ),!@??:?oU_2dcNm15*%dAF% AX6rK tҀ(aЕ"o,'zR/ :'6u,;B4GARsvy˚90c "ul Sd%R <XX)Q5gz;r"H~59x?%2zϔ$ X0ƑHJ@a=&DW:!n| H>Ձ%'q#`@:8!-YXH/ JlV†ePTY9?Mk-y&c ͔WF-b'0?w$0΄|!WdD[/i@Eުo㯫8>D%/L0NLÎ&YZ_x]-_G9:BaE-d@ &RiX* s:q}~悘dCZ}CۂE0't^7`4 ZA &=pSbg)C2 CTJ"$$D>&0F8tn¥Sp% UAb_FİLCŸu~-r3jzàA3gFSdxTگ{TJB Q)L>MԬX}^E;~s8n\\>WVqdi\;5y_@(UW*&=}C0BFL—P"9ʐ[$0C7U@D d 9ߩHPb=ܵgaܒº;Oenhԩ3[3QFTOc?hr}S}نFdqa 7췈4z 4ƓAzai֐ LC00(ƭtT,mV;yͯ};mp3Xbv>([_8wĞu5tMhnb@iK )| }ߔ7E>4jiq‘χe wh c> &7M?Gdc6h ! p &($4bz؃ґ@0b L KXwMdmVvU`l܃~h\':6(t/fL~WxyChm<ͭmF@|R;_f( M` E'[BL)UL+jj6Z!)wsz`bm7̀k^toƖcpe!;; /:KpdЉNJݴdtũ'&qtPp9]%f%8O>@o%znI't&)>sӖӅjfgIa6<) 6F L:M$kHֶ`&w*a)Vo! ``ݔՂu/c5d֢hH[t,x rOe=& 3v Ƌhj_xjA yIins9;̭KE"IF^BI1|%2D"E-BC@"p<&z:VZن*F#@:툞`@{5;!ЙaAFghU5f3琬܃>%NZPҌLЁFXV(}P_%kkė&&(gG (PQx폂1`;_E?Ε-A*'V2pmcUt#[x :hM"|5fKs\]´pm01XJ-:%L6 IŬT`ާcTT>kc? SRP L;\znO:_5$Nppc€ԂXZJR۫I *2x3$HBWzqQ[rl(Qu!(>V㮀"Xe ,Q!˃d|v kwԐpSC|N԰؆ *8#|1Ht[qKV8q,EIxއ~Dȯ }4 0%esd(2Z:a9 Dƞ;`3kXn!)8% z'=؇L tXWέH;Kl; 龜* rAZj@tC|YA0Ր=?ֲfj9w|d]]ypiGY{i'~uw\Ös'V![sK<I3rե5lthQi1){wI5#o0MyuA/nd?$|3}IݎWZR\_s/7~'aIčh˲F*sm0~&hv=,-[vl9?9dmx@?,ESkCϚeY#2?a>ǸgΞòY 4Vt' w=^:;g^y_ȓ'd VV;_&6ZMEly=%}~k?h$fuB==ZيXvj- x eoXawqԃ/+hVX܆rȡ%־Gr^v ]0GOIENDB`mumble-1.3.4/themes/Classic/Classic.qss0000664000175000017500000000000014010707274017607 0ustar builderbuildermumble-1.3.4/themes/Classic/theme.ini0000664000175000017500000000011514010707274017310 0ustar builderbuilder[theme] name=Classic styles=classic [classic] name=Old Style qss=Classic.qss mumble-1.3.4/themes/MumbleTheme.qrc0000664000175000017500000001516514010707274017052 0ustar builderbuilder Mumble/authenticated.svg Mumble/channel.svg Mumble/channel_active.svg Mumble/channel_linked.svg Mumble/comment.svg Mumble/comment_seen.svg Mumble/config_asio.png Mumble/config_audio_input.png Mumble/config_audio_output.png Mumble/config_basic.png Mumble/config_lcd.png Mumble/config_msgs.png Mumble/config_network.png Mumble/config_osd.png Mumble/config_plugin.png Mumble/config_shortcuts.png Mumble/config_ui.png Mumble/deafened_self.svg Mumble/deafened_server.svg Mumble/default_avatar.svg Mumble/filter.svg Mumble/filter_off.svg Mumble/filter_on.svg Mumble/Information_icon.svg Mumble/layout_classic.svg Mumble/layout_custom.svg Mumble/layout_hybrid.svg Mumble/layout_stacked.svg Mumble/Dark.qss Mumble/Lite.qss Mumble/mumble.ico Mumble/mumble.osx.png Mumble/mumble.png Mumble/mumble.svg Mumble/muted_local.svg Mumble/muted_self.svg Mumble/muted_server.svg Mumble/muted_suppressed.svg Mumble/muted_pushtomute.svg Mumble/overlay.mumblelay Mumble/priority_speaker.svg Mumble/self_comment.svg Mumble/self_undeafened.svg Mumble/talking_alt.svg Mumble/talking_off.svg Mumble/talking_on.svg Mumble/talking_whisper.svg Mumble/theme.ini Mumble/actions/audio-input-microphone-muted.svg Mumble/actions/audio-input-microphone.svg Mumble/actions/format-text-bold.svg Mumble/actions/format-text-italic.svg Mumble/actions/format-text-underline.svg Mumble/actions/media-record.svg Mumble/categories/applications-internet.svg Classic/tango/places/network-workgroup.svg Mumble/controls/arrow_down.svg Mumble/controls/arrow_down_disabled.svg Mumble/controls/arrow_up.svg Mumble/controls/arrow_up_disabled.svg Mumble/controls/branch_closed.svg Mumble/controls/branch_open.svg Mumble/controls/checkbox_check_dark.svg Mumble/controls/checkbox_check_disabled.svg Mumble/controls/checkbox_check_lite.svg Mumble/controls/handle_horizontal.svg Mumble/controls/handle_vertical.svg Mumble/controls/radio_check_dark.svg Mumble/controls/radio_check_disabled.svg Mumble/controls/radio_check_lite.svg Mumble/controls/toolbar_ext.svg Mumble/emblems/emblem-favorite.svg Mumble/exported/config_asio.svg Mumble/exported/config_audio_input.svg Mumble/exported/config_audio_output.svg Mumble/exported/config_basic.svg Mumble/exported/config_lcd.svg Mumble/exported/config_msgs.svg Mumble/exported/config_network.svg Mumble/exported/config_osd.svg Mumble/exported/config_plugin.svg Mumble/exported/config_shortcuts.svg Mumble/exported/config_ui.svg Mumble/mimetypes/image-x-generic.svg Mumble/mimetypes/text-html.svg Mumble/OSX Dark.qss Mumble/OSX Lite.qss Mumble/status/text-missing.svg mumble-1.3.4/themes/Mumble/0000775000175000017500000000000014010707353015346 5ustar builderbuildermumble-1.3.4/themes/Mumble/config_audio_input.png0000664000175000017500000000453114010707353021724 0ustar builderbuilderPNG  IHDRXtEXtSoftwareAdobe ImageReadyqe<IDATxm9@`` ,WȿKتVR*`?@ T`!,Eެ혗@0V3${9N@|otg?~_?jС BD8,_gmЪ3tѢJ$ARcd\O<1G~!HLY[~V mq KƤ]ҖRtF5CR9= MT MdL!HSr|3Oʥ\% CcAgXЛXuwU3ք%TmFrV!݊ UDkT== uU'i#]e3?[?=d 8+7 j9d 9]C.uadҾQALa+r0 J&{\R =ロy8/98g K 8@9-f!ȋ& ]ssD S{BjA                                       {64+{|ev~f'3mL3x=t=+EUmM+<&@ bM~Gx;bVM5w^uwHbJ<^ZHz /B) D*T{$/T mַ3Ih\MWFiRٶ$9K4}iah AC4i(2WFa#H6r_QEvm:T|+Ks;Dgj-Káy,&vKVUe%D=4Qt :[pe$ wDU` hE'.q#(,TURIṎif?SU:6FϤkP#R'$p6)GIKcINҥ{jҮc<wl{SSxXEoʯSe'zgt5l\r׷NMDg9GN;+jW> #!mpC.0$A\4dC[+MJDU%ˡ)qm6 ;[:.QTMRN9F#! ɅIބ;U,qH_JryT7!9FF?[u`^}$ jFΝ[3K~`AίM &YXR mA1uZ' {1:Mq]($VIN 'Y$h2Me9Eū[ iK򐃛ط1YE R$E1.LGۺvJ;$9 "y6etTq$j8svJ< fPD뺮.M&;K0HJd ԃh^}YK?R5fa#kp!&6.2*䩔KE/ mf$ kYKM[iޘ T?m "ĄZAB."#Q]S RwĐKvpA:E9Qz 7no@FyY10H7 H">-FͣhW$VYKAj lM&R H(515.&*r     @{/=?{&|!w!H|r\jpQSuo! :q'z @(d#{uS GI jc0z T0 f dE ǔ5;MV7>aF5H̉$!7yzXa'9 )1#Ѿ]jt[IENDB`mumble-1.3.4/themes/Mumble/config_plugin.png0000664000175000017500000000442414010707353020703 0ustar builderbuilderPNG  IHDRXtEXtSoftwareAdobe ImageReadyqe<IDATxAr6qӵOP63}[$%댜 jfU{ ɢDotPUB!B!B#O?=Г*Ѓ}\~}qL @r yH:H @ @#h@pXD`}Wm/k3MeseY#qenv㶱,Gr$'KZ25z# ߍ|LSWsqLҚ\ꑸnnۉ\&r*$,䋣w$ pDGpgCrDpT~EGHNhtJ ɻ[[ey $5.8!ݘm 9@±c98#@Y+/GT$rpDC{ cpDg [!Y"$;˰pB qȽjo]^5Y<8=06H%U53XE1Ȓ $ts?ۼ=*f-μ'^&鯫% j"iCPXvt;EOZi{fN +O{[Y am߸B/Fnմ -HGg1~@dBkɌ* 15 C¬&浃qhK?h1yHni)&ϟc1p୥XF9'_)W!Oȃ o3A(Znae1CRR` Ȳ9Y i |ER IcG ۰OfH#8$r7TqqL6u_ۃC?>Rq*D)&6pclG-IcG] qr^<[$1m5O>s拤6CE5P#NGn-GHj8 B@^`Q&?ag!?8<# OyX`KRgcʭƲ|s}W󍂑ԙ☏Md='~I8 $9!A@8HHjp3$I@AJBR %"A@p Ye EH.HRN@@BJHHI8R c# !HH8z+ހ䈣W !HHN8Qɫ$,bԏ#a4DudsHw*kif-Iu Yij[9rYS,beO^,'W苉xb2D]T^Mur b׆Od8"b g5ncƩq<(Qy2ԩ*mUԾϕ⁻ܥPROr-O6/֚WXTx}S7 ׂs9S+8Yܱi;  euC&D^v$g6 NUHw4= }+wz8njg6J*m$#|d?fN%ydeխ\f@]K:ҎCGh=zv,Ar[ɸp]Zf*,@ي]@dZ sHfWm~]s$΍f<@򼲗Ia0fi/5*qfȬ0ن%UI n٦ B٣b!]Ȕ1~/@jSqr=8p{aD]NÖV CV pSE$8^qd%o+}N-g7D8Ε9GjTF825GDVY !]ce}BmzAqf 372nGuitZ%$F!oϜs]@ȣ0iuUɧU4hx㯠WĀ K[KkEp$H @H H @@ 8pG 8p$I 8p$  8p 8B!@@nH 8B!B!B!ΈCIENDB`mumble-1.3.4/themes/Mumble/talking_off.svg0000664000175000017500000000151614010707353020355 0ustar builderbuilder mumble-1.3.4/themes/Mumble/talking_alt.svg0000664000175000017500000000235414010707353020364 0ustar builderbuilder mumble-1.3.4/themes/Mumble/default_avatar.svg0000664000175000017500000000160414010707353021052 0ustar builderbuilder mumble-1.3.4/themes/Mumble/muted_local.svg0000664000175000017500000000227114010707353020361 0ustar builderbuilder mumble-1.3.4/themes/Mumble/comment_seen.svg0000664000175000017500000000141414010707353020543 0ustar builderbuilder mumble-1.3.4/themes/Mumble/Lite.qss0000664000175000017500000004264614010707353017007 0ustar builderbuilder/* * Mumble Lite Theme * https://github.com/mumble-voip/mumble-theme * * Based on MetroMumble Theme by xPoke * https://github.com/xPoke * * Originally forked from Flat Mumble Theme by xPaw (xpaw.ru) * * Licensed under The Do What The Fuck You Want To Public License (WTFPL) */ /* * YOU SHOULD NOT MODIFY THIS FILE * Edit the files in the "source" folder instead. * See project README * */ ApplicationPalette { qproperty-window: #F2F2F2; qproperty-windowtext: #333; qproperty-windowtext_disabled: #BBB; qproperty-base: #FFF; qproperty-alternatebase: #FDFDFD; qproperty-text: #111; qproperty-text_disabled: #BBB; qproperty-tooltipbase: #FFF; qproperty-tooltiptext: #111; qproperty-tooltiptext_disabled: #BBB; qproperty-brighttext: #FFF; qproperty-brighttext_disabled: #BBB; qproperty-highlight: #298ce1; qproperty-highlightedtext: #FFF; qproperty-highlightedtext_disabled: #BBB; qproperty-button: #FFF; qproperty-buttontext: #111; qproperty-buttontext_disabled: #BBB; qproperty-link: #0b8eb2; qproperty-linkvisited: #0b8eb2; qproperty-light: #D2D2D2; qproperty-midlight: transparent; qproperty-mid: #D2D2D2; qproperty-dark: transparent; qproperty-shadow: #D2D2D2; } QObject, QObject::separator, QObject::handle, QObject::tab-bar, QObject::tab, QObject::section { font-family: "Segoe UI", Frutiger, "Frutiger Linotype", "Dejavu Sans", "Helvetica Neue", Arial, sans-serif; font-size: 10pt; margin: 0; padding: 0; outline: 0; border: 0; selection-background-color: #298ce1; selection-color: #FFF; alternate-background-color: transparent; color: #333; border-radius: 2px; } QMainWindow, QDockWidget { background-color: #F2F2F2; } QDialog, QWizard *, QCalendarWidget *, #qswPages > QObject { background-color: #F2F2F2; color: #111; } QObject:disabled, QObject::item:disabled { color: #BBB; } a { color: #0b8eb2; text-decoration: none; } QObject::separator { height: 4px; width: 4px; } QObject::separator:hover { background: #e0e0e0; } DockTitleBar { font-size: 7pt; } QToolTip, QWhatsThis { font-size: 8pt; min-height: 1.3em; border: 1px solid #666; border-radius: 0; background-color: #FFF; color: #111; } QTextBrowser, QTextEdit { background-color: #FFF; color: #111; border: 1px solid #D2D2D2; } QToolBar { background-color: #F2F2F2; spacing: 0; padding: 2px; } QToolButton { border: 1px solid transparent; border-radius: 2px; padding: 1px; margin: 1px; } QToolButton:on { background-color: #FFF; border: 1px solid #CCC; } QToolButton:hover { background-color: #e8e8e8; border: 1px solid #ccc; } QToolButton:pressed { background-color: #DDD; } QToolBar::separator { background: #D5D5D5; height: 1px; margin: 4px; width: 1px; } QToolBar::separator:hover { background: #D5D5D5; border: 0; } QToolButton#qt_toolbar_ext_button { min-width: 8px; width: 8px; padding: 1px; qproperty-icon: url(skin:controls/toolbar_ext.svg); } QToolBar::handle:horizontal { image: url(skin:controls/handle_horizontal.svg); width: 8px; padding: 4px; } QToolBar::handle:vertical { image: url(skin:controls/handle_vertical.svg); height: 8px; padding: 4px; } QMenuBar::item { background-color: transparent; padding: 4px 12px; } QMenuBar::item:selected { background: #298ce1; color: #FFF; } QMenuBar::item:pressed { background: #1979ca; color: #FFF; } QMenu { background: #F6F6F6; border: 1px solid #D2D2D2; color: #111; } QMenu::item { border: 1px solid transparent; color: #111; padding: 5px 16px; padding-left: 25px; border-radius: 2px; } QMenu::item:selected { background: #dcedf5; border: 1px solid #97b5c6; } QMenu::item:disabled { border: 1px solid transparent; background: transparent; } QMenu::separator { background: #D5D5D5; height: 1px; } QMenu::indicator { padding-top: 2px; height: 25px; width: 25px; } QPushButton { background-color: #FFF; border: 1px solid #C4C4C4; color: #111; font-size: 12pt; padding: 3px 20px; } QPushButton:focus { background-color: #f0faff; } QPushButton:hover { background-color: #F8F8F8; border-color: #AAA; } QPushButton:hover:focus { background-color: #dcedf5; border-color: #7ea8cc; } QPushButton:focus { border-color: #7ea8cc; } QPushButton:pressed, QPushButton:pressed:focus { background-color: #298ce1; border-color: #298ce1; color: #FFF; } QGroupBox, #qwMacWarning, #qwInlineNotice { background-color: #FDFDFD; border: 1px solid #D2D2D2; color: #111; font-size: 13pt; padding: 4px; padding-top: 1em; } QGroupBox::title { background-color: transparent; margin: 6px; margin-left: 8px; margin-right: 8px; } QListView { background-color: #FFF; border: 1px solid #D2D2D2; } QListView::item { border-radius: 2px; border: 1px solid transparent; color: #111; selection-color: #111; padding: 2px 4px; } QListView::item:hover { background-color: #eee; border: 1px solid #eee; } QListView::item:selected { background-color: #F4F4F4; border: 1px solid #C4C4C4; } QListView::item:selected:active { background-color: #dcedf5; border: 1px solid #97b5c6; } QTreeView { background-color: #FFF; color: #111; selection-background-color: #FFF; selection-color: #111; border: 1px solid #D2D2D2; } QTreeView::item { min-width: 60px; border: 1px solid transparent; border-left: 0; border-right: 0; color: #111; padding: 2px 4px; selection-color: #111; border-radius: 0; } QTreeView::item:first, QTreeView::item:only-one { border-left: 1px solid transparent; border-top-left-radius: 2px; border-bottom-left-radius: 2px; } QTreeView::item:last, QTreeView::item:only-one { border-right: 1px solid transparent; border-top-right-radius: 2px; border-bottom-right-radius: 2px; } QTreeView::item:hover, QTreeView::item:focus { background-color: #eee; border-color: #eee; } QTreeView::item:selected { background-color: #F4F4F4; border: 1px solid #C4C4C4; border-right: 0; border-left: 0; } QTreeView::item:selected:first, QTreeView::item:selected:only-one { border-left: 1px solid #C4C4C4; } QTreeView::item:selected:last, QTreeView::item:selected:only-one { border-right: 1px solid #C4C4C4; } QTreeView::item:selected:active { background-color: #dcedf5; border: 1px solid #97b5c6; border-right: 0; border-left: 0; } QTreeView::item:selected:active:first, QTreeView::item:selected:active:only-one { border-left: 1px solid #97b5c6; } QTreeView::item:selected:active:last, QTreeView::item:selected:active:only-one { border-right: 1px solid #97b5c6; } QTreeView::branch { border-image: none; image: none; margin-left: 3px; margin-top: 1px; padding-left: 3px; } QTreeView::branch:has-children:closed { image: url(skin:controls/branch_closed.svg); } QTreeView::branch:has-children:open { image: url(skin:controls/branch_open.svg); } QHeaderView { border-bottom: 1px solid #D2D2D2; border-radius: 0; } QHeaderView::section { border: 0; background-color: #FDFDFD; color: #111; padding: 4px; padding-left: 8px; padding-right: 20px; border-radius: 0; } QHeaderView::down-arrow, QHeaderView::up-arrow { margin: 1px; top: 1px; right: 5px; width: 14px; } QHeaderView::down-arrow { image: url(skin:controls/arrow_down.svg); } QHeaderView::up-arrow { image: url(skin:controls/arrow_up.svg); } QTabWidget::pane { background-color: #FDFDFD; border: 1px solid #D2D2D2; } QTabWidget::pane:top { margin-top: -1px; border-radius: 2px; border-top-left-radius: 0; } QTabWidget::pane:bottom { margin-bottom: -1px; border-radius: 2px; border-bottom-left-radius: 0; } QTabWidget::tab-bar { background-color: #F2F2F2; } QTabBar::tab { color: #111; background-color: #EEE; padding: 6px 16px; border-radius: 0; border: 1px solid #D2D2D2; border-right: 0; } QTabBar::tab:last, QTabBar::tab:only-one { border-right: 1px solid #D2D2D2; } QTabBar::tab:hover { background-color: #ddd; } QTabBar::tab:disabled { color: #BBB; } QTabBar::tab:selected { color: #111; background-color: #FDFDFD; } QTabBar::tab:top { border-bottom: 0; margin-bottom: 1px; } QTabBar::tab:bottom { border-top: 0; margin-top: 1px; } QTabBar::tab:top:selected { padding-bottom: 7px; margin-bottom: 0; } QTabBar::tab:bottom:selected { padding-top: 7px; margin-top: 0; } QTabBar::tab:top:first, QTabBar::tab:top:only-one { border-top-left-radius: 2px; } QTabBar::tab:top:last, QTabBar::tab:top:only-one { border-top-right-radius: 2px; } QTabBar::tab:bottom:first, QTabBar::tab:bottom:only-one { border-bottom-left-radius: 2px; } QTabBar::tab:bottom:last, QTabBar::tab:bottom:only-one { border-bottom-right-radius: 2px; } QScrollBar { border-radius: 0; font-size: 10pt; } QScrollBar:vertical { border-left: 1px solid #D6D6D6; width: 1em; } QScrollBar:horizontal { border-top: 1px solid #D6D6D6; height: 1em; } QScrollBar::handle { margin: -1px; background: #D6D6D6; border: 1px solid #D2D2D2; } QScrollBar::handle:vertical { min-height: 10px; } QScrollBar::handle:horizontal { min-width: 10px; } QScrollBar::handle:hover { background: #C6C6C6; } QScrollBar::left-arrow, QScrollBar::right-arrow, QScrollBar::up-arrow, QScrollBar::down-arrow, QScrollBar::sub-line, QScrollBar::add-line, QScrollBar::add-page, QScrollBar::sub-page { background: #F2F2F2; height: 0; width: 0; border-radius: 0; border: 0; } QAbstractScrollArea::corner { border-left: 1px solid #D6D6D6; border-top: 1px solid #D6D6D6; height: 0; width: 0; border-radius: 0; border-top: 1px solid #D6D6D6; border-left: 1px solid #D6D6D6; background: #FFF; } QLineEdit, QComboBox, QSpinBox, QAbstractSpinBox { color: #111; padding: 4px; min-height: 1em; } QComboBox, QSpinBox, QAbstractSpinBox { border: 1px solid #C4C4C4; background-color: #FFF; } QLineEdit, QTextEdit, QPlainTextEdit, QSpinBox, QAbstractSpinBox, QComboBox:editable { border: 1px solid #C4C4C4; background-color: #FFF; } QSpinBox, QAbstractSpinBox { min-width: 2.5em; padding-right: 10px; } QPushButton:disabled, QLineEdit:disabled, QTextEdit:disabled, QPlainTextEdit:disabled, QListWidget:disabled, QTreeWidget:disabled, QComboBox:disabled, QSpinBox:disabled, QAbstractSpinBox:disabled { border: 1px solid transparent; background-color: #F2F2F2; } QComboBox::drop-down, QAbstractSpinBox::drop-down, QSpinBox::drop-down, QDateTimeEdit::drop-down { background-color: #FFF; border: 0; margin-left: 4px; margin-right: 12px; margin-top: 5px; } QComboBox::down-arrow, QDateTimeEdit::down-arrow { margin-top: -2px; image: url(skin:controls/arrow_down.svg); width: 14px; } QComboBox::down-arrow:disabled, QDateTimeEdit::down-arrow:disabled { image: url(skin:controls/arrow_down_disabled.svg); } QToolButton[popupMode="1"], QToolButton[popupMode="2"], QPushButton[popupMode="1"], QPushButton[popupMode="2"] { padding-right: 14px; } QToolButton::menu-arrow, QToolButton::menu-indicator, QPushButton::menu-arrow, QPushButton::menu-indicator { image: url(skin:controls/arrow_down.svg); subcontrol-origin: padding; subcontrol-position: center right; top: 2px; right: 2px; width: 14px; } QSpinBox::down-button, QAbstractSpinBox::down-button { padding-right: 4px; image: url(skin:controls/arrow_down.svg); width: 14px; padding-bottom: 1px; } QSpinBox::down-button:disabled, QAbstractSpinBox::down-button:disabled { image: url(skin:controls/arrow_down_disabled.svg); } QSpinBox::up-button, QAbstractSpinBox::up-button { padding-right: 4px; image: url(skin:controls/arrow_up.svg); width: 14px; padding-top: 1px; } QSpinBox::up-button:disabled, QAbstractSpinBox::up-button:disabled { image: url(skin:controls/arrow_up_disabled.svg); } QComboBox QAbstractItemView { background-color: #FFF; border: 1px solid #D2D2D2; color: #111; border-radius: 0; } QLabel, QCheckBox, QAbstractCheckBox, QTreeView::indicator, QRadioButton { color: #111; background: transparent; } QCheckBox::indicator, QTreeView::indicator { background-color: #FFF; border: 1px solid #C4C4C4; height: 13px; width: 13px; margin-top: 1px; } QMenu::indicator { width: 12px; left: 6px; } QCheckBox::indicator:checked, QMenu::indicator:checked, QTreeView::indicator:checked { image: url(skin:controls/checkbox_check_lite.svg); } QCheckBox::indicator:disabled, QTreeView::indicator:disabled { border: 1px solid #FDFDFD; background-color: #F2F2F2; } QCheckBox::indicator:checked:disabled, QTreeView::indicator:checked:disabled { border: 1px solid transparent; image: url(skin:controls/checkbox_check_disabled.svg); } QRadioButton::indicator { background: #FFF; border: 1px solid #C4C4C4; border-radius: 7px; height: 12px; width: 12px; } QTreeView::indicator { background: #FFF; } QRadioButton::indicator:disabled { background-color: #F2F2F2; margin: 1px; border: 1px solid transparent; } QRadioButton::indicator:checked { image: url(skin:controls/radio_check_lite.svg); } QRadioButton::indicator:checked:disabled { image: url(skin:controls/radio_check_disabled.svg); } QSlider::groove { background: #F8F8F8; border: 1px solid #D8D8D8; border-radius: 2px; font-size: 3pt; } QSlider::groove:horizontal { height: 0.8em; } QSlider::groove:vertical { width: 0.8em; } QSlider::groove:disabled, QSlider::sub-page:disabled { background: #F2F2F2; border: 1px solid transparent; border-radius: 2px; } QSlider::sub-page { background: #82bcff; border: 1px solid #7ea8cc; border-radius: 2px; } QSlider::handle { background: #FFF; border: 1px solid #a2a2a2; border-radius: 3px; font-size: 4pt; } QSlider::handle:horizontal { margin: -5px -1px; width: 4.5em; } QSlider::handle:vertical { margin: -1px -5px; height: 4.5em; } QSlider::handle:focus { background-color: #e0eaff; border-color: #7ea8cc; } QSlider::handle:hover { background-color: #f0f0f0; } QSlider::handle:pressed { background-color: #dcedf5; border-color: #7ea8cc; } QSlider::handle:disabled { background-color: #F2F2F2; border: 1px solid #F2F2F2; } QCheckBox::indicator:focus, QTreeView::indicator:focus, QRadioButton::indicator:focus, QComboBox:focus { background-color: #f0faff; } QCheckBox::indicator:focus:hover, QTreeView::indicator:focus:hover, QRadioButton::indicator:focus:hover, QComboBox:focus:hover { background-color: #dcedf5; border-color: #7ea8cc; } QCheckBox::indicator:hover, QTreeView::indicator:hover, QRadioButton::indicator:hover, QComboBox:hover { background-color: #F8F8F8; border-color: #AAA; } QLineEdit:focus, QSpinBox:focus, QAbstractSpinBox:focus, QComboBox:editable:focus { background-color: #FFF; } QLineEdit:focus:hover, QSpinBox:focus:hover, QAbstractSpinBox:focus:hover, QComboBox:editable:focus:hover { border-color: #7ea8cc; } QLineEdit:hover, QSpinBox:hover, QAbstractSpinBox:hover, QComboBox:editable:hover { background-color: #FFF; border-color: #AAA; } QCheckBox::indicator:focus, QTreeView::indicator:focus, QRadioButton::indicator:focus, QComboBox:focus, QLineEdit:focus, QTextEdit:focus, QPlainTextEdit:focus, QSpinBox:focus, QAbstractSpinBox:focus, QComboBox:editable:focus { border-color: #7ea8cc; } QFontDialog { min-width: 32em; min-height: 24em; } QColorDialog QColorLuminancePicker { background-color: transparent; } QMessageBox, QDialogButtonBox { dialogbuttonbox-buttons-have-icons: 0; } /* Mumble Specifics */ LogTextBrowser, #qdsChat { margin: 0 2px; min-height: 120px; min-width: 40px; border-color: #D2D2D2; } UserView { margin: 0 2px; min-height: 120px; min-width: 40px; } UserView::item { padding: 0; padding-top: -1px; } #qdwChat > QTextEdit { padding: -2px; margin: 0 2px; margin-bottom: 2px; font-size: 10pt; } #qtIconToolbar QComboBox { font-size: 8pt; } .log-time { background-color: transparent; color: #95a5a6; font-size: 9pt; } .log-server { background-color: transparent; color: #F9655D; font-weight: bold; } .log-channel { background-color: transparent; color: #e67e22; font-weight: bold; } .log-privilege { background-color: transparent; color: #c0392b; font-weight: bold; } .log-target { background-color: transparent; color: #27ae60; font-weight: bold; } .log-source { background-color: transparent; color: #27ae60; font-weight: bold; } QListView#qlwIcons { padding: 0; background-color: transparent; border: 0; font-size: 12pt; min-width: 165%; margin-left: 4px; margin-top: 12px; } QListView#qlwIcons::item { margin-bottom: 1px; padding: 5px 7px; } QListView#qlwIcons::item:hover { border-color: #e0e0e0; background-color: #e0e0e0; } QListView#qlwIcons::item:selected { background-color: #FFF; border: 1px solid #CCC; } QListView#qlwIcons::item:focus { background-color: #dcedf5; border: 1px solid #97b5c6; } QSlider { margin-left: 30px; margin-right: 30px; } #qswPages > * > * > QScrollBar { margin: 0; } #qswPages > * > QWidget { margin: 2px; } QListView::item QListWidgetItem, QListView::item QLineEdit, QTreeView::item QComboBox, QTreeView::item QLineEdit { background: #FFF; margin: 0; padding-top: 0; padding-bottom: 0; padding-left: 4px; padding-right: 4px; font-size: 9pt; } QListView::item QListWidgetItem:hover, QListView::item QLineEdit:hover, QTreeView::item QComboBox:hover, QTreeView::item QLineEdit:hover { background: #FFF; } AboutDialog > QTextBrowser, AboutDialog QTextEdit { border: 0; } #qtbToolBar { border: 1px solid transparent; background: transparent; } #BanEditor { min-width: 600px; } #GlobalShortcutTarget { min-height: 600px; } ViewCert { min-height: 600px; } mumble-1.3.4/themes/Mumble/OSX Lite.qss0000664000175000017500000004330514010707353017432 0ustar builderbuilder/* * Mumble Lite Theme for OSX * https://github.com/mumble-voip/mumble-theme * * Based on MetroMumble Theme by xPoke * https://github.com/xPoke * * Originally forked from Flat Mumble Theme by xPaw (xpaw.ru) * * Licensed under The Do What The Fuck You Want To Public License (WTFPL) */ /* * YOU SHOULD NOT MODIFY THIS FILE * Edit the files in the "source" folder instead. * See project README * */ ApplicationPalette { qproperty-window: #F2F2F2; qproperty-windowtext: #333; qproperty-windowtext_disabled: #BBB; qproperty-base: #FFF; qproperty-alternatebase: #FDFDFD; qproperty-text: #111; qproperty-text_disabled: #BBB; qproperty-tooltipbase: #FFF; qproperty-tooltiptext: #111; qproperty-tooltiptext_disabled: #BBB; qproperty-brighttext: #FFF; qproperty-brighttext_disabled: #BBB; qproperty-highlight: #298ce1; qproperty-highlightedtext: #FFF; qproperty-highlightedtext_disabled: #BBB; qproperty-button: #FFF; qproperty-buttontext: #111; qproperty-buttontext_disabled: #BBB; qproperty-link: #0b8eb2; qproperty-linkvisited: #0b8eb2; qproperty-light: #D2D2D2; qproperty-midlight: transparent; qproperty-mid: #D2D2D2; qproperty-dark: transparent; qproperty-shadow: #D2D2D2; } QObject, QObject::separator, QObject::handle, QObject::tab-bar, QObject::tab, QObject::section { font-family: -apple-system, ".SF NS Text", "Helvetica Neue", "Lucida Grande"; font-size: 13pt; margin: 0; padding: 0; outline: 0; border: 0; selection-background-color: #298ce1; selection-color: #FFF; alternate-background-color: transparent; color: #333; border-radius: 2px; } QMainWindow, QDockWidget { background-color: #F2F2F2; } QDialog, QWizard *, QCalendarWidget *, #qswPages > QObject { background-color: #F2F2F2; color: #111; } QObject:disabled, QObject::item:disabled { color: #BBB; } a { color: #0b8eb2; text-decoration: none; } QObject::separator { height: 4px; width: 4px; } QObject::separator:hover { background: #e0e0e0; } DockTitleBar { font-size: 10pt; } QToolTip, QWhatsThis { font-size: 11pt; min-height: 1.3em; border: 1px solid #666; border-radius: 0; background-color: #FFF; color: #111; } QTextBrowser, QTextEdit { background-color: #FFF; color: #111; border: 1px solid #D2D2D2; } QToolBar { background-color: #F2F2F2; spacing: 0; padding: 2px; } QToolButton { border: 1px solid transparent; border-radius: 2px; padding: 1px; margin: 1px; } QToolButton:on { background-color: #FFF; border: 1px solid #CCC; } QToolButton:hover { background-color: #e8e8e8; border: 1px solid #ccc; } QToolButton:pressed { background-color: #DDD; } QToolBar::separator { background: #D5D5D5; height: 1px; margin: 4px; width: 1px; } QToolBar::separator:hover { background: #D5D5D5; border: 0; } QToolButton#qt_toolbar_ext_button { min-width: 8px; width: 8px; padding: 1px; qproperty-icon: url(skin:controls/toolbar_ext.svg); } QToolBar::handle:horizontal { image: url(skin:controls/handle_horizontal.svg); width: 8px; padding: 4px; } QToolBar::handle:vertical { image: url(skin:controls/handle_vertical.svg); height: 8px; padding: 4px; } QMenuBar::item { background-color: transparent; padding: 4px 12px; } QMenuBar::item:selected { background: #298ce1; color: #FFF; } QMenuBar::item:pressed { background: #1979ca; color: #FFF; } QMenu { background: #F6F6F6; border: 1px solid #D2D2D2; color: #111; } QMenu::item { border: 1px solid transparent; color: #111; padding: 5px 16px; padding-left: 25px; border-radius: 2px; } QMenu::item:selected { background: #dcedf5; border: 1px solid #97b5c6; } QMenu::item:disabled { border: 1px solid transparent; background: transparent; } QMenu::separator { background: #D5D5D5; height: 1px; } QMenu::indicator { padding-top: 2px; height: 25px; width: 25px; } QPushButton { background-color: #FFF; border: 1px solid #C4C4C4; color: #111; font-size: 15pt; padding: 3px 20px; } QPushButton:focus { background-color: #f0faff; } QPushButton:hover { background-color: #F8F8F8; border-color: #AAA; } QPushButton:hover:focus { background-color: #dcedf5; border-color: #7ea8cc; } QPushButton:focus { border-color: #7ea8cc; } QPushButton:pressed, QPushButton:pressed:focus { background-color: #298ce1; border-color: #298ce1; color: #FFF; } QGroupBox, #qwMacWarning, #qwInlineNotice { background-color: #FDFDFD; border: 1px solid #D2D2D2; color: #111; font-size: 16pt; padding: 4px; padding-top: 1em; } QGroupBox::title { background-color: transparent; margin: 6px; margin-left: 8px; margin-right: 8px; } QListView { background-color: #FFF; border: 1px solid #D2D2D2; } QListView::item { border-radius: 2px; border: 1px solid transparent; color: #111; selection-color: #111; padding: 2px 4px; } QListView::item:hover { background-color: #eee; border: 1px solid #eee; } QListView::item:selected { background-color: #F4F4F4; border: 1px solid #C4C4C4; } QListView::item:selected:active { background-color: #dcedf5; border: 1px solid #97b5c6; } QTreeView { background-color: #FFF; color: #111; selection-background-color: #FFF; selection-color: #111; border: 1px solid #D2D2D2; } QTreeView::item { min-width: 60px; border: 1px solid transparent; border-left: 0; border-right: 0; color: #111; padding: 2px 4px; selection-color: #111; border-radius: 0; } QTreeView::item:first, QTreeView::item:only-one { border-left: 1px solid transparent; border-top-left-radius: 2px; border-bottom-left-radius: 2px; } QTreeView::item:last, QTreeView::item:only-one { border-right: 1px solid transparent; border-top-right-radius: 2px; border-bottom-right-radius: 2px; } QTreeView::item:hover, QTreeView::item:focus { background-color: #eee; border-color: #eee; } QTreeView::item:selected { background-color: #F4F4F4; border: 1px solid #C4C4C4; border-right: 0; border-left: 0; } QTreeView::item:selected:first, QTreeView::item:selected:only-one { border-left: 1px solid #C4C4C4; } QTreeView::item:selected:last, QTreeView::item:selected:only-one { border-right: 1px solid #C4C4C4; } QTreeView::item:selected:active { background-color: #dcedf5; border: 1px solid #97b5c6; border-right: 0; border-left: 0; } QTreeView::item:selected:active:first, QTreeView::item:selected:active:only-one { border-left: 1px solid #97b5c6; } QTreeView::item:selected:active:last, QTreeView::item:selected:active:only-one { border-right: 1px solid #97b5c6; } QTreeView::branch { border-image: none; image: none; margin-left: 3px; margin-top: 1px; padding-left: 3px; } QTreeView::branch:has-children:closed { image: url(skin:controls/branch_closed.svg); } QTreeView::branch:has-children:open { image: url(skin:controls/branch_open.svg); } QHeaderView { border-bottom: 1px solid #D2D2D2; border-radius: 0; } QHeaderView::section { border: 0; background-color: #FDFDFD; color: #111; padding: 4px; padding-left: 8px; padding-right: 20px; border-radius: 0; } QHeaderView::down-arrow, QHeaderView::up-arrow { margin: 1px; top: 1px; right: 5px; width: 14px; } QHeaderView::down-arrow { image: url(skin:controls/arrow_down.svg); } QHeaderView::up-arrow { image: url(skin:controls/arrow_up.svg); } QTabWidget::pane { background-color: #FDFDFD; border: 1px solid #D2D2D2; } QTabWidget::pane:top { margin-top: -1px; border-radius: 2px; border-top-left-radius: 0; } QTabWidget::pane:bottom { margin-bottom: -1px; border-radius: 2px; border-bottom-left-radius: 0; } QTabWidget::tab-bar { background-color: #F2F2F2; } QTabBar::tab { color: #111; background-color: #EEE; padding: 6px 16px; border-radius: 0; border: 1px solid #D2D2D2; border-right: 0; } QTabBar::tab:last, QTabBar::tab:only-one { border-right: 1px solid #D2D2D2; } QTabBar::tab:hover { background-color: #ddd; } QTabBar::tab:disabled { color: #BBB; } QTabBar::tab:selected { color: #111; background-color: #FDFDFD; } QTabBar::tab:top { border-bottom: 0; margin-bottom: 1px; } QTabBar::tab:bottom { border-top: 0; margin-top: 1px; } QTabBar::tab:top:selected { padding-bottom: 7px; margin-bottom: 0; } QTabBar::tab:bottom:selected { padding-top: 7px; margin-top: 0; } QTabBar::tab:top:first, QTabBar::tab:top:only-one { border-top-left-radius: 2px; } QTabBar::tab:top:last, QTabBar::tab:top:only-one { border-top-right-radius: 2px; } QTabBar::tab:bottom:first, QTabBar::tab:bottom:only-one { border-bottom-left-radius: 2px; } QTabBar::tab:bottom:last, QTabBar::tab:bottom:only-one { border-bottom-right-radius: 2px; } QScrollBar { border-radius: 0; font-size: 13pt; } QScrollBar:vertical { border-left: 1px solid #D6D6D6; width: 1em; } QScrollBar:horizontal { border-top: 1px solid #D6D6D6; height: 1em; } QScrollBar::handle { margin: -1px; background: #D6D6D6; border: 1px solid #D2D2D2; } QScrollBar::handle:vertical { min-height: 10px; } QScrollBar::handle:horizontal { min-width: 10px; } QScrollBar::handle:hover { background: #C6C6C6; } QScrollBar::left-arrow, QScrollBar::right-arrow, QScrollBar::up-arrow, QScrollBar::down-arrow, QScrollBar::sub-line, QScrollBar::add-line, QScrollBar::add-page, QScrollBar::sub-page { background: #F2F2F2; height: 0; width: 0; border-radius: 0; border: 0; } QAbstractScrollArea::corner { border-left: 1px solid #D6D6D6; border-top: 1px solid #D6D6D6; height: 0; width: 0; border-radius: 0; border-top: 1px solid #D6D6D6; border-left: 1px solid #D6D6D6; background: #FFF; } QLineEdit, QComboBox, QSpinBox, QAbstractSpinBox { color: #111; padding: 4px; min-height: 1em; } QComboBox, QSpinBox, QAbstractSpinBox { border: 1px solid #C4C4C4; background-color: #FFF; } QLineEdit, QTextEdit, QPlainTextEdit, QSpinBox, QAbstractSpinBox, QComboBox:editable { border: 1px solid #C4C4C4; background-color: #FFF; } QSpinBox, QAbstractSpinBox { min-width: 2.5em; padding-right: 10px; } QPushButton:disabled, QLineEdit:disabled, QTextEdit:disabled, QPlainTextEdit:disabled, QListWidget:disabled, QTreeWidget:disabled, QComboBox:disabled, QSpinBox:disabled, QAbstractSpinBox:disabled { border: 1px solid transparent; background-color: #F2F2F2; } QComboBox::drop-down, QAbstractSpinBox::drop-down, QSpinBox::drop-down, QDateTimeEdit::drop-down { background-color: #FFF; border: 0; margin-left: 4px; margin-right: 12px; margin-top: 5px; } QComboBox::down-arrow, QDateTimeEdit::down-arrow { margin-top: -2px; image: url(skin:controls/arrow_down.svg); width: 14px; } QComboBox::down-arrow:disabled, QDateTimeEdit::down-arrow:disabled { image: url(skin:controls/arrow_down_disabled.svg); } QToolButton[popupMode="1"], QToolButton[popupMode="2"], QPushButton[popupMode="1"], QPushButton[popupMode="2"] { padding-right: 14px; } QToolButton::menu-arrow, QToolButton::menu-indicator, QPushButton::menu-arrow, QPushButton::menu-indicator { image: url(skin:controls/arrow_down.svg); subcontrol-origin: padding; subcontrol-position: center right; top: 2px; right: 2px; width: 14px; } QSpinBox::down-button, QAbstractSpinBox::down-button { padding-right: 4px; image: url(skin:controls/arrow_down.svg); width: 14px; padding-bottom: 1px; } QSpinBox::down-button:disabled, QAbstractSpinBox::down-button:disabled { image: url(skin:controls/arrow_down_disabled.svg); } QSpinBox::up-button, QAbstractSpinBox::up-button { padding-right: 4px; image: url(skin:controls/arrow_up.svg); width: 14px; padding-top: 1px; } QSpinBox::up-button:disabled, QAbstractSpinBox::up-button:disabled { image: url(skin:controls/arrow_up_disabled.svg); } QComboBox QAbstractItemView { background-color: #FFF; border: 1px solid #D2D2D2; color: #111; border-radius: 0; } QLabel, QCheckBox, QAbstractCheckBox, QTreeView::indicator, QRadioButton { color: #111; background: transparent; } QCheckBox::indicator, QTreeView::indicator { background-color: #FFF; border: 1px solid #C4C4C4; height: 13px; width: 13px; margin-top: 1px; } QMenu::indicator { width: 12px; left: 6px; } QCheckBox::indicator:checked, QMenu::indicator:checked, QTreeView::indicator:checked { image: url(skin:controls/checkbox_check_lite.svg); } QCheckBox::indicator:disabled, QTreeView::indicator:disabled { border: 1px solid #FDFDFD; background-color: #F2F2F2; } QCheckBox::indicator:checked:disabled, QTreeView::indicator:checked:disabled { border: 1px solid transparent; image: url(skin:controls/checkbox_check_disabled.svg); } QRadioButton::indicator { background: #FFF; border: 1px solid #C4C4C4; border-radius: 7px; height: 12px; width: 12px; } QTreeView::indicator { background: #FFF; } QRadioButton::indicator:disabled { background-color: #F2F2F2; margin: 1px; border: 1px solid transparent; } QRadioButton::indicator:checked { image: url(skin:controls/radio_check_lite.svg); } QRadioButton::indicator:checked:disabled { image: url(skin:controls/radio_check_disabled.svg); } QSlider::groove { background: #F8F8F8; border: 1px solid #D8D8D8; border-radius: 2px; font-size: 6pt; } QSlider::groove:horizontal { height: 0.8em; } QSlider::groove:vertical { width: 0.8em; } QSlider::groove:disabled, QSlider::sub-page:disabled { background: #F2F2F2; border: 1px solid transparent; border-radius: 2px; } QSlider::sub-page { background: #82bcff; border: 1px solid #7ea8cc; border-radius: 2px; } QSlider::handle { background: #FFF; border: 1px solid #a2a2a2; border-radius: 3px; font-size: 5pt; } QSlider::handle:horizontal { margin: -5px -1px; width: 4.5em; } QSlider::handle:vertical { margin: -1px -5px; height: 4.5em; } QSlider::handle:focus { background-color: #e0eaff; border-color: #7ea8cc; } QSlider::handle:hover { background-color: #f0f0f0; } QSlider::handle:pressed { background-color: #dcedf5; border-color: #7ea8cc; } QSlider::handle:disabled { background-color: #F2F2F2; border: 1px solid #F2F2F2; } QCheckBox::indicator:focus, QTreeView::indicator:focus, QRadioButton::indicator:focus, QComboBox:focus { background-color: #f0faff; } QCheckBox::indicator:focus:hover, QTreeView::indicator:focus:hover, QRadioButton::indicator:focus:hover, QComboBox:focus:hover { background-color: #dcedf5; border-color: #7ea8cc; } QCheckBox::indicator:hover, QTreeView::indicator:hover, QRadioButton::indicator:hover, QComboBox:hover { background-color: #F8F8F8; border-color: #AAA; } QLineEdit:focus, QSpinBox:focus, QAbstractSpinBox:focus, QComboBox:editable:focus { background-color: #FFF; } QLineEdit:focus:hover, QSpinBox:focus:hover, QAbstractSpinBox:focus:hover, QComboBox:editable:focus:hover { border-color: #7ea8cc; } QLineEdit:hover, QSpinBox:hover, QAbstractSpinBox:hover, QComboBox:editable:hover { background-color: #FFF; border-color: #AAA; } QCheckBox::indicator:focus, QTreeView::indicator:focus, QRadioButton::indicator:focus, QComboBox:focus, QLineEdit:focus, QTextEdit:focus, QPlainTextEdit:focus, QSpinBox:focus, QAbstractSpinBox:focus, QComboBox:editable:focus { border-color: #7ea8cc; } QFontDialog { min-width: 32em; min-height: 24em; } QColorDialog QColorLuminancePicker { background-color: transparent; } QMessageBox, QDialogButtonBox { dialogbuttonbox-buttons-have-icons: 0; } /* Mumble Specifics */ LogTextBrowser, #qdsChat { margin: 0 2px; min-height: 120px; min-width: 40px; border-color: #D2D2D2; } UserView { margin: 0 2px; min-height: 120px; min-width: 40px; } UserView::item { padding: 0; padding-top: -1px; } #qdwChat > QTextEdit { padding: -2px; margin: 0 2px; margin-bottom: 2px; font-size: 13pt; } #qtIconToolbar QComboBox { font-size: 11pt; } .log-time { background-color: transparent; color: #95a5a6; font-size: 12pt; } .log-server { background-color: transparent; color: #F9655D; font-weight: bold; } .log-channel { background-color: transparent; color: #e67e22; font-weight: bold; } .log-privilege { background-color: transparent; color: #c0392b; font-weight: bold; } .log-target { background-color: transparent; color: #27ae60; font-weight: bold; } .log-source { background-color: transparent; color: #27ae60; font-weight: bold; } QListView#qlwIcons { padding: 0; background-color: transparent; border: 0; font-size: 15pt; min-width: 165%; margin-left: 4px; margin-top: 12px; } QListView#qlwIcons::item { margin-bottom: 1px; padding: 5px 7px; } QListView#qlwIcons::item:hover { border-color: #e0e0e0; background-color: #e0e0e0; } QListView#qlwIcons::item:selected { background-color: #FFF; border: 1px solid #CCC; } QListView#qlwIcons::item:focus { background-color: #dcedf5; border: 1px solid #97b5c6; } QSlider { margin-left: 30px; margin-right: 30px; } #qswPages > * > * > QScrollBar { margin: 0; } #qswPages > * > QWidget { margin: 2px; } QListView::item QListWidgetItem, QListView::item QLineEdit, QTreeView::item QComboBox, QTreeView::item QLineEdit { background: #FFF; margin: 0; padding-top: 0; padding-bottom: 0; padding-left: 4px; padding-right: 4px; font-size: 12pt; } QListView::item QListWidgetItem:hover, QListView::item QLineEdit:hover, QTreeView::item QComboBox:hover, QTreeView::item QLineEdit:hover { background: #FFF; } AboutDialog > QTextBrowser, AboutDialog QTextEdit { border: 0; } #qtbToolBar { border: 1px solid transparent; background: transparent; } #BanEditor { min-width: 600px; } #GlobalShortcutTarget { min-height: 600px; } ViewCert { min-height: 600px; } QToolBar { background-color: transparent; border: 0px; spacing: 0; } QToolButton:hover { background-color: transparent; } QToolButton:pressed { background-color: transparent; } QToolButton:on { background-color: transparent; } QToolButton:on:pressed { background-color: transparent; } mumble-1.3.4/themes/Mumble/mumble.ico0000664000175000017500000012772014010707353017334 0ustar builderbuilder hV   F00 % :kD(    777+¶߱߾°+GGGxww nIII777~~~ܬnzzz ~}}{{{ vuuyyy\\\sssxxx ~~~nLLLTSSOOOJJJn+~~!!!YYYWWW {{{ۜ+ppp\\\[[[poottt"""###___^^^###"""tssߘ((('''cbbaaa'(((((MMM)))fffedd)))HHHQQQggg~}}fffNNNlkkFFFKKKjii+sssPPPOOOnnnۍ+nmmmSSSTTTiiinxxxYYY ɍUUUvvvTTTVUU}}}UUUɍYYY yxxnnn n^^^wwwtttaaaܭnnnn hhhGGG+߾¡+<<<ggg(0   JJJ~~RжЮRLLLLLLkɔkMMMwww5ggg %%%^]]baaonnvvv5DڝKKKAAA|{{===ڃD|{{5EEE&&& LLL{zz5ZYYTTTIII'''"""DDDWVVZZZk)))(((~~~kFFF[ZZ,,,+++YYYFFFRCCC """"""///..."""""" CCC􆆆R@@@###%%%%%%111000%%%%%%###@@@PPP&&&((((((444333((((((&&&NNN|{{''',,,+++666555+++,,,'''uuuм:::---...999888...---666е666///;;;:::000333CCC<<<[[[KKKKKKaaa<<>>;;;======yyyxxx5DڱDDDYYYhhh@@@@@@qqqYXXEEEڄD|||5QQQDDDBBBBBBDDDVVV|||5[[[kɗɝkYYYiiiRпRddd ( @   ### III+ooo`ooo`III+ ###[[[+++lllS⚚mllS+++[[[ cbbExxx777///QQQcbbE DDD(((~ """======999iii큁~(((DDDNNN444YYY"""555WWW999444NNN@@@#$$LLL """]\\$$$@@@%%%~---ppp...~%%%ihhEAAAxxx:::jjjE;::{{{:::pppSHHHEEEqppS,,, !!!!!! +++JJJ+ᳳ$$$########################%$$JJJ+srr`%%%%%%%%%%%%%%%!!! %%%%%%%%%%%%%%%srr`***''''''''''''######''''''''''''***:::(((*********%%%%%%*********(((777dcc''',,,,,,,,,'''''',,,,,,,,,((([[[///.........)))))).........,,,wvv+++000111++++++111111+++iiisss222222......222///ddduuu`666///JJJ555//////777TTT///777uuu`KKK+A@@111:::222IIIIHH111FFF111CCCKKK+BBB333333<<<:::444333AAArrrSDDD666~~~555KKKEEE555666AAArrrS;;;EEE888777MMMGGG777888AAA;;;gggEGGG::::::JJJHHH::::::DDDgggE$$$~MMM<<<<<>>PPP@@@iiiAAAPPP333BBBCCCXXXRRRDDDNNNMMMCCC[[[YYYCCCBBB333PPPFFF(((~퐐HHHBBBEEEGGGNNNNNNGGGDDDAAAMMM팋~(((FFFmmmEzzzddd```XXXeeelllEiii222}}}S⨨|||S///eee&&&RRR+{{{`|||`RRR+ $$$??(0` $  5558JJJ\YYYzcbbggggggcbbYYYzJJJ\5558%%%NNNYpppͧ빸뎍pppNNNY%%% 555/dddغddd555/ +++!ccc```888000AAAwwwccc+++!JJJW$$$ ;;;rrrsrrrrrrrrJJJW222aaa   $$$baa222>>>%%%ppp:::  a``FFFVVVppp%%%>>>;;;$$$vvvyyyPPPHHHttt\\\RRRfff211 ===vvv$$$;;;///rrr&&&666rrr///%%%cccyyywvvccc%%% KKKX򔓓KKKX 999)))"///&&&)))"999+++dddqqqdddedd+++???4440/// ***4440???000fff!!! fff000555"""mmm """!!! jjj"""555```OOOYPPP""""""""""""""""""!!!###"""!!!""""""""""""""""""OOOOOOY```sssBBB #####################$$$######################## BBBsss???"""$$$$$$$$$$$$$$$$$$$$$%%%$$$$$$$$$$$$$$$$$$$$$$$$"""???6668EEE###&&&&&&&&&&&&&&&&&&&&&&&&%%%&&&&&&&&&&&&&&&&&&&&&###DDD6668LLL\UUU###((((((((((((((((((''''''&&&(((((((((((((((((((((###RRRLLL\\\\zutt""")))))))))))))))))))))(((''')))))))))))))))))))))"""nnn\\\zggg%%%+++++++++++++++++++++)))(((+++++++++++++++++++++###ggglll<<<***,,,,,,,,,,,,,,,,,,****)),,,,,,,,,,,,,,,,,,+++444llllll%%%..................,+++++..................&&&ooolllgggBBB+++000////////////---,,,///////////////---666ggg]]]z000...111111111111...---111111111111000***]]]zMMM\333,,,333333222///...333222333///,++MMM\6668TTT---333444000aaaSSSOOOMMMTTTiii///444444,,,BBB6668eee...666111777,,,000///,,,,,,//////+++III000666...cccvvv{{{///777222666444888///===\\\^]]>>>000888000KKK111888...vvvcccQPPYzzz000999333www///999111bbb]]]222999...222999000|||QPPYccc555!!!{zz222:::555UTT666:::666333;;;222xxx333;;;222xxx!!!555000iii{{{333<<<888LLL999999FFF<<<;;;555jjj444<<<444rrriii000@@@4440|{{444===:::NNN:::;;;III???<<<666jjj555>>>666mmm4440@@@***hhh|||666???<<>>>>>777ppp666???888kkkhhh***:::((("}||777@@@;;;SSS===???BBB???@@@888vvv666AAA999ooo(((":::MMMX888CCC888UUU>>>AAABBB@@@AAA999www666CCC999zzzMMMX$$$ggg888EEE777WWW???BBBCBBAAACCC;;;www888EEE888ggg$$$///www999FFF???[[[XXXAAADDDCCCBBBEEE<<>>ppp}}};;;GGGAAAUUU}}}###<<<???$$$xxx999GGGHHH===BBB:::GGGGGGEEECCCGGGEEE<<jSIDATxwxչ?ghzoܫܻ1%C'H K@ )BB b0tw܋ekն9?fg򢿓 8;(( @ ^0]aHG"MI+M *2z@PX;s+9Bt{"hd"B B#:8 ^42~@MCr#MI;h`B~I)hMJi!6 ͆bj(U,:ak$!  wBЈakiRH" FէS_RL) xFFAnn.呟ONNdeerjVp8x^0vxR Ahhh#Gp<ȡChkkP(dB`'X |L!M ._/NJ) ($''aÆ1vXȑ# 33iɊp8rAjjjطo;v` h*4cZ;d `EgcYRJ!rQPP1c0acǎeԨQv;:: =i hjjbر[sNioo5)i+ׁL4 '|4?MI)TUbÙ6mՌ7BNg'IvA/ٰa7nd߾}DP!D ^F3I qCS, L砩٪bZcĉ̜93f0|p;'fBD"o>֮]˚5kزe ̈́a ZќA#-ht&` H)K|&Mٳ={6Çv `&Ǿ}ټy3MMMzABHk1!M@Th ҩ*; `FЕ jjjxxرc^W hgDw  ~0PJ9BJiX,0gN;4NJnn~`0cKK 6l`ʕ|G9rH$A#@ MG;BwWK% رc9YhÇfi,d طo:;v(ˁGwzGz@Mdgg3m4.]ʜ9s(((@gkΉ@"$%g466G|r֯_CMhDi"i0IsssYp!g}6SN%++ s~W2- Fʬ)%`͆(vSEAJI[[޽ZhkkCQrssʢrJKKvcX}W^y7҂'B`Z8N3f 'NdƌL> #\z<2Љa^~eVZE}}:YA`"SNphz)0)w/jv{/B!>̚5kXz5[n׋l&Mg?Y.R $( G}?lڴ(2B`XX,zDMFFF]`\bI l޼Z=p?wТ᧒L zv233!33S!O. 3HH$B{{;MMM>|VTUo}[|_$###$__B$!33#GRRR3\exhii6Y̛7e˖qYgQYYb9.x^>|I֭[G(BQZ/্>5`GJ)F_YgEAAA۷cOsNQt:lSSSC  ''￟ni2ƿ/|+_ɓМB!^/ 444jv &l2.b&Mf;.466+3ϰ{nguhA |zOzTUyyy,]K/*^mC裏;vYYYR\\V;,GaӦM~Fc=Ƽyb/p.B֬Yfƌ1 O hii:RaÆ~޽{yꩧX|1hF@K(T -Eb֬Y~#V3g_W袋),,իnQWWgGfرY233l466Ԅgҥ]=B%0fEvSXXHII .H$B ^zZ FAA!c9?&9""H,Q^^X^^NmmmBw(p@twSUQZZu]ǭQ,?۷oGJINNcǎeر effzikkÕW^Avvΐ`0{>c\.Ǐ7rs*-..&33p&ꫯFQdgguyX, ÇW1طommmBY""J'vr࿀… 뮻8묳p\H]MUwy;z OFF#Gd„ vEF233馛Nկ~šC(,,rH}zB444oSPψUFM,NNɓijjСC"E\`Syyyۉ P`{2 UU]\r-5׿O<8_WXnL4ʄ߄444Dvvv^Chkk!Φeihh`„ 3y摕Ş={z!<{D"FrB3gwy'K.<|;ߡJUU'N4TdH4ڵ~v _`XHb裏Xf #F`=ZLNM?~<:tHRBրdKyyyD!'_E\r%q?p87nF2z(+SZZJNNNBhoog޽1ycpB*++3gRJvM B| $Hi0g9.SU5o+c${ww~n7&MKtz+~;%%Ũj:/ /}݇t2aZ9'<?1%'?~祗^⡇>?@wxb o'|bB\?`۬YR( $ӀJ)OBh"/3z~BSOPRRBUUՀB":hoov.h6ý bpOii)yyyuVQFSNa…XR2c j*!(RJ\*gAN'/ncGFIxB"++H$Bnn.̝;u?g}ǖ-[L=, Æ 6׿riݿ*UUorO !~O@҅{/1͠5xGٷoR*dܹ`0HII {/gMNN4@>;똺G/ah8trI'_ 6p8̮]8p>;;;p\7|3&BRv?_GG{I0aR@Ovƛp\&)5{u^x@S :rw&SUU{nrssB/{K]D\up8o7 UUU BȠ'xG,ͲTUr*I i?k¯KXѾܹEQ(++Fܵk`b~.pB%z9q&~Hd"`?~ ޽n|M6oތ(I]SUu]ǕW^UXEIA]B}1W^yE_e.!i嗗D:=XDػw/^]wŅ^Bx[_џ]xr-X,Z[[9x` VZ^}><(f㪫.3o!@$J)g~Ǫ۷666KrM7Nfo~,?cZ… 5Z,rrr`Ŋ477٪k7tfU @Á(¹ˍ78`Mehhhbod c@UO)38JTU8j5z?nܸƸi[z%QU|MDiVUխ5j4P`۶x^, 1ގbᬳ";;;,axbÀPC*6l88KOzcǎۚE"*Fo UU 1N!%Z76m!*)Uv2ychS-Z K&ClҔRv1|śyjƍnuSӦM37)A͆'DN'^{-zjU[!}w6q,X,-[9眣 SpH :!\ܠ2{l{C 4X^p8`ʔ) ;LG: RjE=cǎ_%fX,\. kq_r={6* h2"|Cwz뭔 Z]A04<6-fJNN&MJq:UHtaҏ}S_(Q%Dcc㠍[)zf7¡2*I)233|xdqD)X+ݎb!PWW7$j\pg}Mf샭 ~yUU3gqWbgCoM݅1v"c_i(1#wEOrBǡ@A_KU\qŕ̜9K|!l`_Gtmmm{UO2Hp=VB y3ib"C}1jFkkl)..FU\dh0(e,p'0fq饗2s挸' vJ0DUU, O<^%xq>'ecHo#=B!YSU0s .R}&CN.RUsr QUݞ4g`0 4-# , EgܹBA1K"Gw]RRµ^K^^^…'ĐP(Zx)f ^)Qkwƚ>}: Z4ي)oRqUW%tlFxHq z$x\uU\f sB&FX pYg1kA/uQ#v>&nN9NŒϜ,2u6;~b;0k\*5k6gu>QO `,p#GrEcS7Lsz cxtD]$h}3'+_lc1 $04h0qzIb۸袋9r$ځ[^(LQ&U1Ml,[ x;XĊ c^hK8MHJUp-[Tz- ^tjUUԩS(׿ELu<BZmX>DcL:UOMf)eK.Iǟk H2'EQ >2cXO.((tp#M=''&<0pv`/'4כ:dC|ƕs3GZ2c&5[-\0.Z@@p2?''3X&2!^X@ ۿHyԳl%^|#;5_ϵj5qv8L\~#V ,R2|2 t[4 67O{&%~f@9\6Qeʔjϟo L"S%Rʲ,,YT`"o՚4^dXnl Xd~HMp 1dƢ.R2u t=r* Ef^oB\+?d{=TWW3uT}.@~OWJ9ppg&.X,.ppx@g(dS_n@!D_׈p8l;;;;Rs24}|YYYy智>вѣG3k֬db1:֚;;ҡC {A !tN9' $ZGZ6Yf1zh Zv`Q'01giSO=7:x5T%tD"1 誽{bSR8@{{;%f5Y׆+yi,+0Ƥ(JR}N=T]+&}8b,Xem ӂŒq׵X%aZbXS!qzÇٻw?P(LMM Rj}ބ挌 c}Z $=>%`#tGe50 8EW; Lğxv)%EE5;vcXhiia͚lf[Ў^/p89 E3 ʰafs4Y &U,)eONğC4 #5RTThgI)c"^heoN[DN)`׮lٲRݨVDttD;g@7|z!^)p -G>C:tV%ڰ@;y6V ܠcÆ CZ*˗/BVVVLD=q#6[{ouu yh_ߚY4!#777% ``)3'V??v|F<, h(ܹ{̑~u `ĉ }^2o<&1 B켼<Νq@חa ӖRԩSCh++++xgx{z!6oތ˜C>P(dԩIq~DW !!;wFK3i2aF2o tBfϞMff/VXVʰp; Z@O׿hx UUT撒M4Nesne8!dĈL0A_d YVfΜN Ū v%Eo0jv̛9.effR^^(lݺ|+KkJp8O?=Ckk+vN'W `y2?3em;wfYF6>I?]Jˌ3M\ITlUU)--3\XӋSZZ(l޼[ng:tSX.W%wy'bPYYi$W#RL ppKq\,{XkJ1cN8fގB6lاV0[V;|JJJD"iEQJ]]?я+ӟHMM HhB]kzR!<أ\wݵw}444`>|8EE8P(DSeҤI|)$S9Y菆RJ f@xޛj`baݮ ΃}U5´i83?Ass3g@)r\.vZ?p)0o<)--tI;BtttŽ;xy7ظqsTVV7lhhbXK)++{' c4 %]$? H)q]L>` H&a2'''^2j)K\NnVXÇvT^^.l߾۷Cii)u*tx<:t܌3殥PTTd$2!աǮ-[u꫉=8hF SN%;;!"Yfzn{7.8IJIeeeʫ UU={6_~9ox9v)((҂# R__O}}=7n<}trC^^c9x ~7LUUURiz}hzU@7*++iiiAq,=XP LR2y䔩OzM7on:>[ )((  nB!Ibfaq:ƥ:&)%6l /~INjhddd$=Gd:OE=~70sNjV뀜UɀXL3o~|_cZ2;P(0*z)j0ГvQ[[ӧA{ o{T Juu5N@@1ܓ[@A!3fLJ{=FcK.;pE{+jtwxF"jkkٿ?H*&LH$94M{5f@;szo TUQFGSG ,{ b#r+z+~CsssJ6~{hhh`Ŋlڴŋs%0o]#''Gcc#---x<{1~mznJKKk4t`Z5|4wzRlUF?YZ6m75=>BCW zHébٲeձe>d#[neϞ=8pG   v:}hmZq\8N ҄ 6mՔWɳa Rj-tzZZZ8p?OXj淘?~6x@U%ÇWrhkkBLKaA&(@qݔ'd@?|o];lnƼqݴ)hUpŽK@( Ixb= Tud3##u]7 >o;|!eee?q4CYsNͪ))1wC^fOp*Cut2"]lC !x<'?^}O$Q^P"yfQ^^NVV裏*CRI(Bu;&xvmS"s_'@Us7dEr=sfA W^,Sn3P&@-ːez !X5x㸨؇{o}/_h0$`K5!z^{ ~ɨ$SS4Th7immSO=u(4b bF~,`I?=z"$jQOn,eddyV^=(ZjvQ@z1x@Q>doe&9θOt(ԧBt.)bh&'g먫"t\)Z- 5 ZB!6lXO0CfMt`󝛄p8˄B|lTSmi6r| zyAI~W'`KPh5@O{\(b@MM q.&@3DRJ<6s Ñi$;R5SAFFBZ[[ټy3SLa =C#Om Pnii& `ىW͛imm4T{ =DÉ=i&&dXl߾=꽏un`0@Kk<P/P(4l۶@ b'Oq"yV,WSS BŵDf qAMMMhp,6-eZ\) ͆g׮]xh% djdLn{x>Y^vnlN x<9E S8&@0@M#G,G|T4fhoo466@<GeTBuuu;4j ɤFLJf|/!uuu~a,={/=t=i(B2*dR-!HQQH+tPŇ&@# ,=|`0b9rPjt.@r P__f{d1 pp. h2n vIGux04%YsIyZ0 |>ep]0V^M݀zZJKKa<1H#U>М[[[cԭk>MQ"}1sL1p=񠥥ŘD*kf y i'B?9 i9Bo>=l{=绀P(āZX)!Q DN$H/ى貣wB @+zZBQ555p8Lkk+pTIUUO0>;&YhnksM[SSLe:z`رoj.xYH\'N<|0H _;vwt7F-EQ)mHC Fw$ nj lߵkPZup: YqH)ݛ ҏwOk.AW=+i&'GBƎ6mL$1//">~9^ǃ?ySCD7tf{A]8fӦͺ|л Z[U9DHc(`4z [ t`ƱBp~u%ldg,FiF;tz΁ *#hmk'TDN͹:SfE|_/6l `Xvp8^`(رf$#NQQNJ^X,**"#;J4@TeB֣%%X,NLH$q*BaaQnz 6u@Mbuq PUIYYgSUd'zHwNa;.JJJPUyNuX,h{LY_Q3`۷frN'@LL= FD~8w.z۷>&̀VV^ݧ-**"??H# lJK7W2QohzUU :MUUpIiq|jaÎېG??l=}P${԰y>رcMIR'HH{k xĈ !ؼy3{ PKh2{\L*+B>w}V+cǎjDbnkht&C0ƌ8A}]|>BZ4x?] %`uz~.Hvѣy+|MV>i&U `}$aժU466(zR]]mLDq6K.?vX s466j*dX&}R&@=BaݺuRJSNCQq˖FrDy.p Sի `ݺuzoxMF>QB`ʕxc̙3CJi >Σ >ԯC3L 4M9t:1cFj^V\7 <}h JJ4=e )W]]lqƙݙQsܿ^zI? xMcBLГGiSϾU7N: D8.3NDDOdZY$C"ol00 4ލ\.?\.HĘpi|  iFEEeYg;ϋx<u 㼇kXvu/Z… 5k~FGUUrs8ۻ `լ^Fgd/D?8<(MsssZ@~~>_|16P(D{{{'ەFj#À5ѵ 0}wfߴB~ c(rM=,^|ӦMp8–&CW3G$ppz7ټyHߺxa`! KH))--/Q H~+.!V[2sSOG(Kѳh7ZzB4(Jp޽ B] ,]Xzp(v!ڴcEIWRPPsP^x{(J1V\kLG4RZN'pχ Ht;} ouQkױrJ[9N&4BԵ3Ԍ/3SO4/h*dN)5Hn lgggs ד_.ASS3< ---zg_701[ÊO>W_}WSJINN7PU{t Jc衟l?Ys9O>ۻ* |{MC5Bhvp8 /-56PUyq%" tJN4z3K'DC]'RRU5n[՟(lٲ^xA?c4 S!&h'|RWc:fn` I#|i"H- ij(tNtCvoN qBZZZx'O9Lq'C=<92+/TUUqwC$37x`0EJMWrHk <M:CaLہ !ZxǩLRJ222[X`G~m&vR2ӧB@KK `0p8L[[HLnhQMWQ-dh0h`" EQuÆ <!}TUTVV"&]hPDǼWϗdTU`0j?i BГɒFG&>ln6Gq[_GC)9bgm5peq 7bZ B/h: Fohii1KG=z˂ 6ኢ}6qp==h23t01OE8p~X?])ӄn6-[f8=OB"i"H-5%:$,]gϞ}#Gv~!<8pEQ| O0$@t"鯊֭'vo~3< De &-aـyR2id3ynO>uth2"BaLځI)yx饗RYY=-ēM˔&dFnn"xXܹsկ~ܹsp_|^{M^C~B0 m!Ħ@ SO={cBȑ#  iCH Œ0ۿVBN;4~6mZ~}ϧ|!R01wGZZZx῱i'jI&_3<0tH^RdggcنTPUgD222~ĉTL͇-!A!Ͱ !8վ&LOnn^WJI~~gϡ;wG( !ZjK) rI'B(455 /O`0 $ a>)%|K_殻{( {#w֝~Gk5dvCN`>By z&MDfff7eHePUUX,#SӅyRJ,XȢEBygzXVn< ik7zZZ,̙.RNgT:?azE a!! ˄S:$Z[=L4 ;w%%%l۶C6``&SN9  rJ<A86_Z-,,o;ӧOB_W{]*ڮ($G;t,0~޽XVL¬YB!BH!D\D":::X,w=mN#9YcWꪾ$nŋ~/ !ׅKh0I#d=f/+1iBB V{n֮]ƍٹso743, 6 rss>}:w>rq?7 CSêUx뭷ٸqFYj( 6ٳgs)0g 0ibPWWCϧ u?##)dR]]ͯ~kF6nMj ?$!H|.n]T{ɮBmm---ʹ^`Mqq1rRbӴ֭eŊ:tS?)z4r1qD;<;|***jRڵk/[oE8BQN'檷Rhͧ~HRI`3{ :Qs7G_>Ea߾}g{==+Iu =K=`0b׮TTTP\\a9E7/ߏӉ)]o"v#,X5sD"^'v_gzj G'@ 3.2Gvt~za#@ CzB/PK%UU3sssKYt類ff׿旿Gt&lDzM|8gL01p8̞=5;,_adI @J%Kp]w1n>M|C)8jkk(ApD1% n߾ݻwSXX@qqqx@={yW l @;;+/v1@7n/[B!Eكֿ@ի^'D-sZ 983BlЎUW]Imm-v}}%x *}AAw>]w݀|?zJk /@CCDhT8:wRZVOg?{ 'N! r CBQQ-K.eܹdddĜԣZi֭[H+N=Bh骪"=\/>\T5ro͗e$Dz'C7n3gdѢE3cŦ7+^_EQ$-D+pä CRf[V&O̲e˘:uZ4R:yBh1<bC'ی5{wq eZcB!6lXs=ǦM]l***BO£>;zל6z}uY:%۱K更j,:>h vk@X1&oƍQ%IP+222={7o6R}7\5O0~{yC|VcߡNo|GE|7i~hfD;ZUUͰlL8s93f]]#K\%?yf, V䙾oƎZw:/}L0!)JJvZٲe1vI = [D 0K/ժ*.3ftR&LH&؂}>Ϳ/kdBS;03F3+Yx1YYYIF֭[X|9k׮EQT`#) Nl[7|* @G0FJ9LJ)9sK,aFJq2r::={+xزe3]Ͷ3w\.=瓗CUB'P(ĶmxYf5!BF!Ar& >TX4HJYLٳ9S0a#%;wd5_;wPWW/v^^vڂO:iӦQQQaK507ݺu+o1MMMgB|)[O (d/KRJ4`&z&L0N0N&! z455Q[[K}}>_;-UYYYnr),,233Zqq ^/[n7Wf}G, ҂iBdff2q$N9dLJ^^^f#RvUE4޽3r#ٻ0Rƍx뭷ٲe3^?i8hDP"10{,ʍi<`C|j=٣!H!4iL RRJb)S0o|ƏONNC``Ѕ^JIkk+۶mgƍ444蕀!U>!M@hQ ю4wWU`L>aÆEi2;vϺukYf-{1 !4ŧ('H@ 0 ϠRR)( 93SP]]MyyE BA>6lΝ;xZ&0Z3@p^H`J(rs)R)%lFCud&NDyyYp6BЅ]Q0^Cef>dv4Њ%`+x!MqI+fKӀqR,)%EYY9Ǐc 9|Gh‰F樃~JOss55{ضm+۶mmmmFo!DZEJebfһ}ܐ&A) FcRJp8ͥQF3b FnnqOF׃X0~Ϟ={صk{i5-z=N4c#ĝAA&2ڕ<,z{AffeTUUQVVNee%%%%.22vݡ"s@|R#Gpjkw^m3MPш[V Z~~ZiB̄L`0\op8nJJJ"q]lZs b'EBZh=BP HCC 9rĸ|>ѧ D[m֠/i~H&¤dU`jX@J XtR0egM^^.999䒙8Nt: w?Gh{^::xک<^Z[[inn j-1ƨG^4~oC^CzO(D0u5v9GEF"-t~rj5BjtkrhouT!!D59n#MI)8шM[^e@)1i6)M=nݟ sDl NBhv#jkog>OZؓiHQrhihž 9uM%= u-9s7EA#@ C:H&Ÿ4H#O?9h4 %tEXtdate:create2014-10-26T06:33:06+08:00F%tEXtdate:modify2014-10-26T06:33:06+08:00tEXtSoftwareAdobe ImageReadyqe<IENDB`mumble-1.3.4/themes/Mumble/muted_server.svg0000664000175000017500000000250714010707353020577 0ustar builderbuilder mumble-1.3.4/themes/Mumble/channel_active.svg0000664000175000017500000000063714010707353021040 0ustar builderbuilder mumble-1.3.4/themes/Mumble/deafened_self.svg0000664000175000017500000000236214010707353020636 0ustar builderbuilder mumble-1.3.4/themes/Mumble/config_lcd.png0000664000175000017500000000252014010707353020142 0ustar builderbuilderPNG  IHDRXtEXtSoftwareAdobe ImageReadyqe<IDATxkEl~5ٖZC zo"lN޼H1o67O'OmObq)vXAD6b+y RZndarhogn؁TgMO(u@B;Z LCbPVfN13͙[`%!(+=ڴ94Cr%逄`r_CPVCc!t6a8$ޫjz^R@07  _) lHx5IH*_B2t^jھVscNjV^յ-VG|w=-;akY8avZֳzl;"ogY0DZuWJ:gH~zpye'g0qS G4=/6ohOL=oKh8ߩ^p_ڊM9k0QREe) ]^AP,--ŀ4%% 8 ύ'%d.l)jSrȳjg>6DZU9?:pnCzުj˷5=裰z|յd!B2 PptWnFxyd5YB.``RUĭֲ-yށ>\@j2m8lոRtCPBw&9sHv5c[/P9EvThkܲσjL@'8SBRGMf>ڗIENDB`mumble-1.3.4/themes/Mumble/Information_icon.svg0000664000175000017500000000177414010707353021375 0ustar builderbuilder mumble-1.3.4/themes/Mumble/config_audio_output.png0000664000175000017500000000533014010707353022123 0ustar builderbuilderPNG  IHDRXtEXtSoftwareAdobe ImageReadyqe< zIDATxmF@G~/ ­` L_ lWU+)RATN&g9pTK^]I#yzw3\x>r#BEݑ\kAܴG.d g l71S4AFd3>gABg(ܺm%C\sδ#X 9ؗ[9cxVvV+ɉMXq kS܊t@6]`,ؽDr4MTA+rX]\Ԓꧥ2 -)Q7ᖨZ&ղP4g/RI]bTlwI*k>(RjkcQv릴A $ oÖV!PA$37q5\ ?kl|AHɉ2*G,ϲi9 Sf͕H!|A! E5O :,EhݔiUHGz ("M4@WHrf- (9K[J$DFYH CuHxA=_R9bCr!h CCV IJ/+&( DM["d'E_A V"M0 †]NbAVX Ч+4#!ł]E[}AZ!,uJ {jՂ@ W9Ү_A YCS ,A $\C:wr[N@MzBM-I4] +IQ(b Ż>y[JD6s)A JSQ*9Pe=D c6ѴA yzUuH%m,ܭP:=n%P!p!G {{\(ݫ=4J9#E#?|1TF,B#]ߩUCqJ@H=ls|",[{ %\ Jn"zZȚ/ KMi^}GH=*e=`* J|W1TF+߈ Fo1pM nbwFy-T9A@C9l8QlWmPyMGc):A )4r\*Ǥߊ KF* c I]&zN rp?lJr9Qb鼝 Y-wԂ隥$M sm8WF0+!v mumble-1.3.4/themes/Mumble/self_undeafened.svg0000664000175000017500000000273514010707353021205 0ustar builderbuilder mumble-1.3.4/themes/Mumble/mumble.osx.png0000664000175000017500000001475014010707353020154 0ustar builderbuilderPNG  IHDR>atEXtSoftwareAdobe ImageReadyqe<IDATxypTž;Q7Td ؗU URdr<@ Ux,"<"OE^6w bAb^zL&Y3 jNHf[/G֦֒M4yɐŸ"eIj,υsO_5SVlxZvmqW__~E,AS&e,EIT#K7 |4_s5K/U? ȑ#/P?R K^u)\Q+۶mSBɲ:!o>wMdff할% D~~j#\I$> *߿\nE (sZ!%\ֳgO ʕ+ '"L'"regg JѾcQ\\jhժHKK˖-S-,, .##C4nX]$pBUqI,]/6mZԩS?Κ5wޥRN . XO}/7E:{nդIRT5jޛvpxFgO[ X=0U?d㫢"sωs犳:K\r%Bv*{n:O<);zիsڀvaqj[ѣp_I3Ir%>}apsd[ O'/bۇ¸`Ew~t6iذcӦMub͚5:p@h"ѵkWED~S!77WP!4i,$У~6?xJ6vРD4mT4h {1?c_\ /RG矅4MW&UJ3fLWAR|\FO?]ɳGS.bѲeKۣ-b͒3۷z:$>3QfM1sLe*F ? 0 ɩA)uE=*tĖ-[}Y}4ϖƃԪUg8 ne!+#g Ϛҽ{wS uVvH۶m#j?\D,:u(o.9嬆 WO8!~abŽɍ~{[o|?ĵ^k:piÆ s۷6T +^x裏u몶3n_{C>#qeIH`$o:zj_0$$zL[]`Tf $Kҷ^ ziTx`TE]d:B/Wڵk̲ϸ+V*[wh+$h֬RflԨR vЧ~ #Th>lY|@1{ŋZ-_}'Ъ- tcD" _29h%HQq]uUiv7?;vL9@t0ː27" vZ[u9}1=to) ymT;tDYz!hZzJmkXfiԨ?i{!<}c]&RE5@ltl zl*׬3{ѭ[WSl? 6;/`VZ `쵋>}oLǎzbgVE "B6,Q47LH7Nצw 9 H#VQBupCE"cDNI`&8h0oaQTՈkVaU]t  Z6ij}%^ɓOFeO׮->Yhvv}k >K1Z<ܽS.IȊya% M#'&sr*@i U(h7NF\O sϙp6mnUƖ-[Ť-LnehF7#;_j|n[gxfSm9WСiiu}o/9;ws Ξ=r#Ҧ TMi^IJ`%1#E+h R3b!FXORf> XYiT;o,׶y|\6́)`vVZ UX8~6} fvL3%8k1t'U@vᙻ=Ǐq v`(-'^nGNr,?p<nںc`gd]:턯%N4@+RPNsul"8B#SF +VD+>۴N3yv Gq-ijgDR}-a+aG46 j.]뻳Li k׭['ym0aEX~6"nnhgS ܹŵ([/+? Y玦%q{ `إKgƾg5AF[㠉QFf͚*p@U^,{GtA}YIGyZ>Ν=+j@ /TZ$aaرOѣGSD Fd8vW,z/LωDn<yc*GS5nm@fFaC'#x߾}oF;zlNjyv3#@fFFk&c쬱Y+:u H@"J m߶ӮoF5m+괯"pw[Ḭ>aѪZ;qV_9juˆ߽{Z9m4GDVFR(=>*1cF;MbhƍtѯJm`'ps:CpZ*{7F 4ںuk= mM@x&0zJuoo#rOL@Hg%d~W2;{mn*YF&cU㙼Li?U8d2*j;8*JÆ_0uv.E~6<}+!Glf90H I;vO<1Vㅀ$@FX\qŕ܄ΆзvxO-U'x890)v+r>N]rŞN:NkRKtL&I)ԩJXiGcf$ '0Pnd޼y⡇Rvxͱl,8!hO?Xbn@Mݺ |fnK-(lg$ bZFd7Y ?YѴS*\]'l"dD&X=fb1G#/RK};iؤ@)F4֍C nb'#ޭ}q&J ]x'-LcOQvlܯ8F^ I5lv\$j`uWӨ^x(UНǖg}>O$صkü@7䧓?>kx f9Z P{mَ_?>:w &V()9aF6WSh\@] >0C0450h4&IջwR6v&p|2ΠU[) CM:I_Nn r#؎|ỖC 6F 9P̃kz`+)U+`~τ`\$~?m1kTBew-k̎ױjCcQl8tUp޽{3sAy$藰7Kf¦VcW$ƏF; p>@ơ;gV-yC>ۑl+@ʉI.׉`+4"\&0$AUڱ_P~9DZw $K+@PN= Y_kp`CgMa+a[cgN ؀Q8 4/"tr oӦUNwLEeqDI%ҬYsӗ&n_@6xoSv8h35j<(߳ꀌcXZE˫YѼysEL؟Ft9$ TF2;q%!Ij|f͚obn%d )Z4=A =}+y>Lu-wO0ɟ|2e17-)Z00?跃% &3̑/Я_7I;?KhaJ^R4`S7oT J.!,bF݃3pΟ L@MC2 gݻW`f5%@G~t,x`R;~hd"ȹwI{ߎ0@ׯ:@9)U+ BsY~[ zrGA4M.`:`4F`fV߮DofP4hP "יD4,4{P4~Xī'В6/ۇUvTgwĈ!&d+Ic_Wp0)Sj09`]0 ls ='&8y)<97hswU #"FIuiDx+ q9"x&Pc$|!aӃvg)Pޣ a`ݎ~F>GkQ;1zYlؼys̚5[5  iQhYL-f,ĉw ԎР%KGNI:> ?9꟣11!N28qB`يةhA"O8 |Vtɒ%* $N@ߗ:=#N2)YX;moA,^D#@ãYB> }yпUQ'}N߃Mta!h-[m۩ Yd*̠B租Ѡl1bB_}.hQ_G9Z~/ߟ}1"u֑dآWH-"nƄ"6|ڵ_*>?T#`A{^d^Y>V8M6e7, {-3fPg Sb Nx5,Mk [wuسg? sZrIԹ@^ vS1#@( n  :>T7+ h /qv&{?P6H*1x`&4qϪ`xlӦͦ'f{N$~xh$3r!p>Bo JYv6˗/(8ydLy#<9Ą /r5|?(Okʗʇk.f?+wl}C5&Mʕ~F#jB$ϝnC*#&/($_9W^bР1!v7+'LjRV1'rl?Ϝ9CXBwE _g?jDJ"6iD :LpSp:th4j-Nuk!ŸqeDTuO.1#&o-KFvv[nU$0s$Tsī},}^ p~,Ԟ~a0)B0N^E 4܊V/O*;kw{*1;]Q(!_F dp5kҿ2 Ѿ4\tQ=)>d8|h+mƚ;Fo)g͚}UEh0g%8={{'rs')NAc"Ƙ)5V\ mumble-1.3.4/themes/Mumble/config_msgs.png0000664000175000017500000000157114010707353020356 0ustar builderbuilderPNG  IHDRXtEXtSoftwareAdobe ImageReadyqe<IDATxڱqA;ƱB'vrр*pv.8 \R'UlvoWyf4ʄdS5C֫>z, 6))BE0I1WΕ ^㱭,c82d8jl3"mP8&_{.H|8 cI.ȭ8hhnoZV@f\ڻbw t6tbc ΅N\@@ @@@ @@@ @@ @@ @@ @@ @@ @@ @@ @@ 4䗏N{ չЉR/4|Wo!·q?zw>4V,ȗ`Ĵ!ߜ|` "IOΊM+jn c mumble-1.3.4/themes/Mumble/talking_on.svg0000664000175000017500000000215414010707353020216 0ustar builderbuilder mumble-1.3.4/themes/Mumble/muted_self.svg0000664000175000017500000000267314010707353020226 0ustar builderbuilder mumble-1.3.4/themes/Mumble/prepros.cfg0000664000175000017500000002536214010707353017531 0ustar builderbuilder[ { "About This File": "This is Prepros config file, https://prepros.io . Please do not edit this file, doing so can crash Prepros." }, { "data": { "id": "", "cfgVersion": 2, "name": "mumble-theme", "path": "", "files": { "e7da077f": { "id": "e7da077f", "path": "source/Dark.scss", "output": "Dark.qss", "name": "Dark.scss", "category": "CSS", "autoCompile": true, "autoprefixer": false, "sourceMaps": false, "libSass": true, "compass": false, "fullCompass": false, "outputStyle": "expanded", "customOutput": true, "imported": false, "parents": [], "type": "sass", "forceImportAutoCompile": true }, "fb573155": { "id": "fb573155", "path": "source/Lite.scss", "output": "Lite.qss", "name": "Lite.scss", "category": "CSS", "autoCompile": true, "autoprefixer": false, "sourceMaps": false, "libSass": true, "compass": false, "fullCompass": false, "outputStyle": "expanded", "customOutput": true, "imported": false, "parents": [], "type": "sass", "forceImportAutoCompile": true }, "2950e408": { "id": "2950e408", "path": "source/OSX Lite.scss", "output": "OSX Lite.qss", "name": "OSX Lite.scss", "category": "CSS", "autoCompile": true, "autoprefixer": false, "sourceMaps": false, "libSass": true, "compass": false, "fullCompass": false, "outputStyle": "expanded", "customOutput": true, "imported": false, "parents": [], "type": "sass" }, "80e9cf34": { "id": "80e9cf34", "path": "source/OSX Dark.scss", "output": "OSX Dark.qss", "name": "OSX Dark.scss", "category": "CSS", "autoCompile": true, "autoprefixer": false, "sourceMaps": false, "libSass": true, "compass": false, "fullCompass": false, "outputStyle": "expanded", "customOutput": true, "imported": false, "parents": [], "type": "sass" }, "4aab08e6": { "id": "4aab08e6", "path": "source/Imports/Dark Definitions.scss", "output": "source/Imports/Dark Definitions.css", "name": "Dark Definitions.scss", "category": "CSS", "autoCompile": false, "autoprefixer": false, "sourceMaps": false, "libSass": true, "compass": false, "fullCompass": false, "outputStyle": "compressed", "customOutput": false, "imported": true, "parents": [ "80e9cf34", "e7da077f" ], "type": "sass" }, "6c7becf8": { "id": "6c7becf8", "path": "source/Imports/Lite Definitions.scss", "output": "source/Imports/Lite Definitions.css", "name": "Lite Definitions.scss", "category": "CSS", "autoCompile": false, "autoprefixer": false, "sourceMaps": false, "libSass": true, "compass": false, "fullCompass": false, "outputStyle": "compressed", "customOutput": false, "imported": true, "parents": [ "2950e408", "fb573155" ], "type": "sass" }, "9e6d8270": { "id": "9e6d8270", "path": "source/Imports/Base Theme.scss", "output": "source/Imports/Base Theme.css", "name": "Base Theme.scss", "category": "CSS", "autoCompile": false, "autoprefixer": false, "sourceMaps": false, "libSass": true, "compass": false, "fullCompass": false, "outputStyle": "expanded", "customOutput": false, "imported": true, "parents": [ "e7da077f", "fb573155", "80e9cf34", "2950e408" ], "type": "sass" } }, "deploymentHistory": {}, "config": { "watch": "", "liveRefresh": true, "useCustomServer": false, "port": 0, "useCustomPort": false, "customServerUrl": "", "watchedFileExtensions": "less, sass, scss, styl, md, markdown, coffee, js, jade, haml, slim, ls, html,htm, css, rb, php, asp, aspx, cfm, chm, cms, do, erb, jsp, mhtml, mspx, pl, py, shtml, cshtml, cs,vb, vbs, tpl, ctp, kit, png, jpg, jpeg", "excludePatterns": "Prepros Build, node_modules, .git, .idea, .sass-cache, .hg, .svn, .cache, config.rb, prepros.cfg, .DS_Store, bower_components, source/Base/**, *.svg, *.png, README.md", "autoprefixerBrowsers": "last 4 versions", "liveRefreshDelay": 0, "disableImportAutoCompile": true, "browserFlow": { "enabled": false, "mouseSync": true, "scrollSync": true, "keyboardSync": true, "animateCss": true }, "deployment": { "ftpHost": "", "ftpPort": "21", "ftpUsePrivateKey": false, "ftpPrivateKey": "", "ftpRemotePath": "", "ftpUserName": "", "ftpPassword": "", "ftpType": "FTP", "ftpSecure": false, "ftpUploadOnModify": false, "ftpRefreshAfterUpload": false, "ignorePreprocessableFiles": true, "copyPath": "Prepros Build", "excludePatterns": ".map, Prepros Build, config.rb, prepros.cfg, node_modules, .git, .idea, .sass-cache, .hg, .svn, .cache, .DS_Store, bower_components" }, "css": { "path": "css/", "outputType": "REPLACE_SEGMENT", "segmentToReplace": "less, sass, stylus, scss, styl", "segmentToReplaceWith": "qss", "preprocessableFilesDirs": "less/\nsass/\nstylus/\nscss/\nstyl/\n" }, "minCss": { "path": "", "outputType": "RELATIVE_FILEDIR", "segmentToReplace": "", "segmentToReplaceWith": "", "types": "", "preprocessableFilesDirs": "", "filePrefix": "-dist" }, "html": { "segmentToReplace": "jade, haml, slim, markdown, md, kit", "segmentToReplaceWith": "html", "path": "html/", "extension": ".html", "outputType": "REPLACE_SEGMENT", "preprocessableFilesDirs": "jade/\nhaml/\nslim/\nmarkdown/\nmd/\nkit" }, "js": { "segmentToReplace": "coffee, coffeescript, coffeescripts, ls, livescript, livescripts", "segmentToReplaceWith": "html", "extension": ".html", "outputType": "REPLACE_SEGMENT", "preprocessableFilesDirs": "coffee/\ncoffeescript/\ncoffeescripts/\nls/\nlivescript/\nlivescripts", "path": "js/" }, "minJs": { "path": "", "outputType": "RELATIVE_FILEDIR", "segmentToReplace": "", "segmentToReplaceWith": "", "types": "", "preprocessableFilesDirs": "", "filePrefix": "-dist" }, "compilers": { "less": { "autoCompile": true, "autoprefixer": false, "compress": false, "sourceMaps": false }, "sass": { "autoCompile": true, "autoprefixer": false, "sourceMaps": false, "libSass": true, "compass": false, "fullCompass": false, "outputStyle": "expanded" }, "stylus": { "autoCompile": true, "sourceMaps": false, "autoprefixer": false, "nib": false, "compress": false }, "markdown": { "autoCompile": true, "sanitize": false, "gfm": true, "wrapWithHtml": false }, "coffee": { "autoCompile": true, "bare": false, "uglify": false, "mangle": true, "iced": false, "sourceMaps": false }, "livescript": { "autoCompile": true, "bare": false, "uglify": false, "mangle": true }, "javascript": { "autoCompile": false, "uglify": true, "mangle": true, "babel": false, "sourceMaps": false }, "jade": { "autoCompile": true, "pretty": true }, "haml": { "autoCompile": true, "pretty": true, "doubleQuotes": false }, "kit": { "autoCompile": true, "minifyHtml": false }, "slim": { "autoCompile": true, "pretty": true, "indent": "default" }, "css": { "autoCompile": false, "sourceMaps": false, "compress": false, "cssnext": false, "autoprefixer": false }, "uglify": { "compress": { "sequences": true, "properties": true, "dead_code": true, "drop_debugger": true, "unsafe": false, "unsafe_comps": false, "conditionals": true, "comparisons": true, "evaluate": true, "booleans": true, "loops": true, "unused": true, "hoist_funs": true, "keep_fargs": false, "hoist_vars": false, "if_return": true, "join_vars": true, "cascade": true, "side_effects": true, "pure_getters": false, "negate_iife": true, "screw_ie8": false, "drop_console": false, "angular": false, "warnings": true, "pure_funcs": null, "global_defs": null }, "output": { "quote_keys": false, "space_colon": true, "ascii_only": false, "unescape_regexps": false, "inline_script": false, "beautify": false, "bracketize": false, "semicolons": true, "comments": false, "preserve_line": false, "screw_ie8": false, "preamble": null } } } } } } ]mumble-1.3.4/themes/Mumble/deafened_server.svg0000664000175000017500000000221514010707353021210 0ustar builderbuilder mumble-1.3.4/themes/Mumble/layout_classic.svg0000664000175000017500000000476314010707353021117 0ustar builderbuilder Chatbar Tree Log mumble-1.3.4/themes/Mumble/talking_whisper.svg0000664000175000017500000000222614010707353021263 0ustar builderbuilder mumble-1.3.4/themes/Mumble/categories/0000775000175000017500000000000014010707353017473 5ustar builderbuildermumble-1.3.4/themes/Mumble/categories/applications-internet.svg0000664000175000017500000000434114010707353024532 0ustar builderbuilder mumble-1.3.4/themes/Mumble/filter.svg0000664000175000017500000000540714010707353017362 0ustar builderbuilder mumble-1.3.4/themes/Mumble/config_ui.png0000664000175000017500000000521114010707353020015 0ustar builderbuilderPNG  IHDRXtEXtSoftwareAdobe ImageReadyqe< +IDATxKnG1s1 z#y k`9@P`@t@oZA؇pK/uHtꪪ"Bٙ_ml^G\fqc^C?\8V @ ف$ 8$Hn8@p ఓ 8@pMH 8@pQcApk覎oH4פqSY"G˔'CokPN%'R+ $M X}F۪ |;vTV; ?.JBI4 ~QV*HZ8$oc;(JBI 4QU*H:8$Qfs$IG\$x ,S!H8$_S&9!H8$M.H8kC24$~0QU>wu6tpԑLm?䀣yF2 @9K"E ݯ$mۺa|3/jrf>$Gc 86ٞZ9 als+ϓlQ73#Ċ @%sbLH([RX Q#cG oϫdE'!+ @қ d4_ØpH\trD[ i/vu*H4uKVg#9 l8Lhպ^cǕ'82XgI،='8$9Ťa9cCW +D TpJWǾ0G d5X'ࠂl"8. B@ K@PE `A 2 r6u@v|!@EȖ0Q)m&Aْ'89F+يds,pPAࠂ~ lwpV8pcp5pvؤYӥ@j0lMC* 8;K`!8;ypOh}g @85o=o Bk=dWU|+>t1 iTQ]w6#8'!,Dt +b#c lY*[WX<^?plKsڥKF*ʁ8|)>8~9YiysG_gyH? Ea\?_S!3LT߬ D,gڀ Lϕ?9SL^A\z$BJ+Qq\#,ij(&Y$*cxﳚC}qt*2=4MD+Q\h9`jq5RQƁze]| q3U"FOqc/ԓ/ǟس&ȄqFEҪAy}BKjR9Jp屳:9 NPTzg]"wBԕ tPa3WOh@>eM!bW Aq޾sdi2ӎ8j+E/^j9Mïe^M*+uٮ ':qɱ׹KgN5 xA{Ԯbc覹:t7uVnUʵyM$zdQ]H_>NabF(X9QQouH&1 7"]ړtCrKCH2B9w46v]@*D6fEVyH WD SU= 2Y ![r| ZͬyX~\eWVߦcB,kg/㋵pY V[jVzVHtey@ iζ_5vcC ע`5wQb7-$vأ!MVߩ҃n J+ݱ@b'\ekCAÞgהB9[_**HΟC&lTښ>+^f (pCE*qirYתC]j{O6(eC,ہxEZBHg,e~B&DIw[})ƑcncUcwx;?t]B[vLD"1]fYmf)ӣ{mC =s bK5-;!")k/n=NwڞI $jUOɟ;.ZrMekCx"EK#ǚOω@tzׅ@e@~@l/Aΰ(EloMdݙ h' lWHy(I6hZTd$^f730 &!|zTӺX.Ѭ-XQbIJ~OQq>Q,DnjK .$2#dsշcwMb?bŪsW]nF q:D6ҏɦUQ~l>POnsŮg7MpvT$Έ#[J;qD JsInw%DhV7Nօ;=.^v`eă:Ew麼T_|vQB+vҋI+ HRATו7 v`% {^*`f^-qp]UayEPxh! -f8:f*,*9/tJ/qrIVH] xw:r-UțL"Ĕ pBmY.oHn<85G 2$M¸٭sw 0t/ҎDJޥhXHz=xYaT${tj(sĀ  m܉@ ;m<q.Ww&W>t#&;nww xj~1+\*,R㉊OQ~0,u[F8$2u3`?{s;V}l@ۙ5Y 'hL ZFl3BlX='gǃ@QF J2cH$m)rj"7$CO-M lz!u NS:/+ lnwg d柧 _/dO'(.BAK1 9TlC8"Y*֬™gV%#ApIJyQ{S2Mx='xa ~m#mIx urbȨ2B]}M$W1c 1E}YZiF bdžP]t+B1iڋ; phF pDql=݌@ʆUd3-Ra=O2 dNs,oH䝧tk-deutSC.MQ:ioHg-LV0u4uwBaE$MD O 8`ACCl5¢RGn#RN 6zE}i{Ęo]iJ"; )w7eS,5S:W^Hǩ $D]fHD:X D74 bD"yfkkxߑH2R}yPl#Ջ,"ca4q@E2߷ pq@İ Db‒"IrKNmh]D\:,佟%Jn<+qU/9<<͸ ]I&. *LW_Ɔ'y8 ?lձ9ejV<$vؗ]+rDҲ""/"5Pģ\eཱུǶ,HW_g1Bra.2 N-m VIENDB`mumble-1.3.4/themes/Mumble/exported/0000775000175000017500000000000014010707353017200 5ustar builderbuildermumble-1.3.4/themes/Mumble/exported/config_audio_output.svg0000664000175000017500000000244314010707353023772 0ustar builderbuilder mumble-1.3.4/themes/Mumble/exported/config_shortcuts.svg0000664000175000017500000000166414010707353023313 0ustar builderbuilder mumble-1.3.4/themes/Mumble/exported/config_osd.svg0000664000175000017500000000312714010707353022036 0ustar builderbuilder mumble-1.3.4/themes/Mumble/exported/config_plugin.svg0000664000175000017500000000211014010707353022536 0ustar builderbuilder mumble-1.3.4/themes/Mumble/exported/config_basic.svg0000664000175000017500000000454314010707353022335 0ustar builderbuilder mumble-1.3.4/themes/Mumble/exported/config_msgs.svg0000664000175000017500000000134314010707353022220 0ustar builderbuilder mumble-1.3.4/themes/Mumble/exported/config_ui.svg0000664000175000017500000000215614010707353021667 0ustar builderbuilder mumble-1.3.4/themes/Mumble/exported/config_asio.svg0000664000175000017500000000430214010707353022200 0ustar builderbuilder mumble-1.3.4/themes/Mumble/exported/config_lcd.svg0000664000175000017500000000152214010707353022010 0ustar builderbuilder mumble-1.3.4/themes/Mumble/exported/config_network.svg0000664000175000017500000000402014010707353022733 0ustar builderbuilder mumble-1.3.4/themes/Mumble/exported/config_audio_input.svg0000664000175000017500000000265314010707353023574 0ustar builderbuilder mumble-1.3.4/themes/Mumble/filter_on.svg0000664000175000017500000000327314010707353020055 0ustar builderbuilder mumble-1.3.4/themes/Mumble/config_shortcuts.png0000664000175000017500000000421614010707353021442 0ustar builderbuilderPNG  IHDRXtEXtSoftwareAdobe ImageReadyqe<0IDATxMkiqƗAedA8us, ϟy...իWCB@X0Rռ݌!|6d`*0??̬+fyf-={ 2 ̫ϟV/_eA*W_Zzݧ8˽2 ˫y.,T*/r.R@<|Y]^v!fggYa&3R*¹U8$ Hn=WUs$ɬ3;q?vK^%ͬ0,*¹+Eycf}PfyT*EZUdA*W$l"H-JfD^,ȫgP$&''2 R moig\\ W_`m)fy8OWi2 R雃2 "3ښYA:ER[{Y̊+"H-JfD^@NfD^e("H-*Mf$NV޾}rmUD3ɫիWX /yUdǼ gLڎE;jA ?mW5! b! b+D^)K˾: Gt>sO81<::3e'CWkkkݻ\v$Qb%ɫ>2 qߺ{Ii%V3q/<be$Z"HO ΄ ō2=dDIr"gfdA2$E}r6dWeY*\ +Ey%"dAU<}4,"RYW=qee%2 ϫMfggeA399UjfTl#Hpa*Ur6$Wi2 { Z^,Wƭ u+Ey%"dA"Y( u+Eycf-,,~.f\AWi̪ uͫMb?l uΫM9xd/fON^z;wf A@ A @  @ A A @ A%O^JvjkZֿ?-TiZ Be~t[ogֻc\DEnuw,n ܲg2CY>'F߲|H+ݍ6j#A[y&U_ٖ]wOvKQ?Sd,aIx̬ mumble-1.3.4/themes/Mumble/controls/checkbox_check_lite.svg0000664000175000017500000000107514010707353023675 0ustar builderbuilder mumble-1.3.4/themes/Mumble/controls/handle_vertical.svg0000664000175000017500000000144014010707353023055 0ustar builderbuilder mumble-1.3.4/themes/Mumble/controls/radio_check_lite.svg0000664000175000017500000000101214010707353023174 0ustar builderbuilder mumble-1.3.4/themes/Mumble/controls/checkbox_check_disabled.svg0000664000175000017500000000116214010707353024504 0ustar builderbuilder mumble-1.3.4/themes/Mumble/controls/branch_closed.svg0000664000175000017500000000101514010707353022515 0ustar builderbuilder mumble-1.3.4/themes/Mumble/controls/toolbar_ext.svg0000664000175000017500000000103614010707353022254 0ustar builderbuilder mumble-1.3.4/themes/Mumble/controls/radio_check_disabled.svg0000664000175000017500000000106414010707353024015 0ustar builderbuilder mumble-1.3.4/themes/Mumble/controls/branch_open.svg0000664000175000017500000000103014010707353022202 0ustar builderbuilder mumble-1.3.4/themes/Mumble/controls/arrow_down.svg0000664000175000017500000000107314010707353022114 0ustar builderbuilder mumble-1.3.4/themes/Mumble/controls/arrow_down_disabled.svg0000664000175000017500000000111114010707353023734 0ustar builderbuilder mumble-1.3.4/themes/Mumble/controls/arrow_up.svg0000664000175000017500000000110114010707353021561 0ustar builderbuilder mumble-1.3.4/themes/Mumble/controls/radio_check_dark.svg0000664000175000017500000000101214010707353023160 0ustar builderbuilder mumble-1.3.4/themes/Mumble/controls/handle_horizontal.svg0000664000175000017500000000144014010707353023435 0ustar builderbuilder mumble-1.3.4/themes/Mumble/controls/checkbox_check_dark.svg0000664000175000017500000000107514010707353023661 0ustar builderbuilder mumble-1.3.4/themes/Mumble/channel_linked.svg0000664000175000017500000000256514010707353021035 0ustar builderbuilder mumble-1.3.4/themes/Mumble/layout_hybrid.svg0000664000175000017500000000476314010707353020757 0ustar builderbuilder Chatbar Tree Log mumble-1.3.4/themes/Mumble/README.md0000664000175000017500000000336614010707353016635 0ustar builderbuildermumble-theme - Theme for mumble formerly known as MetroMumble ([Old repository](https://github.com/xPoke/MetroMumble)). Comes packaged as the default skin of Mumble. ------------------------------------------------------ ###Skinning **Do not modify the qss files directly. Read below.** To change icons and other graphics, simply change the SVG files of the theme (with an editor such as [Inkscape](https://inkscape.org/en/) or Adobe Illustrator). See the [wiki article on Mumble skinning](http://wiki.mumble.info/wiki/Skinning). The theme is written in [Sass](https://en.wikipedia.org/wiki/Sass_%28stylesheet_language%29), a language that processes into CSS (or [QSS](http://doc.qt.io/qt-4.8/stylesheet.html) in this case). If you want to make your own skin based on it, install a Sass processor such as [Prepros](http://alphapixels.com/prepros/). A Prepros project file is included, so simply add the `mumble-theme` folder as a project. The file `source/Imports/Base Theme.scss` contains the actual theme QSS, but it is **not recommended** to modify. In future versions you might want to swap `Base Theme.scss` to a newer version, so it will be easier to update your theme in the future if you leave it alone. Instead, you should edit either the `Lite.scss` or `Dark.scss` files in the `source` folder, and add your own CSS at the end of the file. You can also add your own variants in the `source/Imports` folder, which contain the color definitions. When you process these files in Prepros, it will output the complete skin to the qss files in the parent folder. The OSX variant can also be found in the `source` folder, which imports the regular source files but adds a small [OSX fix](https://github.com/xPoke/MetroMumble/issues/4) and modifies font sizes. Have fun!mumble-1.3.4/themes/Mumble/mumble.png0000664000175000017500000006306714010707353017351 0ustar builderbuilderPNG  IHDRxtEXtSoftwareAdobe ImageReadyqe<eIDATx U_ ;iTu7H]|}%W 3?*.IpHâlaF58Ȫcc'$ f(t (7Ω[ZNU}>Svӹ]}<(p G__ߔKO qVறnz\7[?`~4":@@ _2x\7i {H.@=0h`@ fexk3P  }Oݸ7" Ǐf+WzvDPMpw eo{B_=&<=o}LoٌEuA@Жw`ăF^,85C("EDQ~*F^]_^{Zz^%8 8PA/CT?0_/>A u @,$eԺ?5)^>0͹xH Z r с?@Fc(H0RDb! 6SF_FGc H%tH=:T. J`A< BХ @ FX+Սp^>թїWhF"@b```@ Q3~oezv_>@ :`v\U;MxF_TC@B 0P <Wީ^!~>D "@^7mcb`.s&U2u?o_Gq`51h"h!1fT`~] s&e5[aXw|PT@x5tM8^a~y2 C٢JH F=(ᗱ묳*q< U##F瀌s{q F*gegaC// ϯ8S?JzK6qN7Xg^{dԧ>}k_C$y|ğ{b@="0  c~WG9s/ӟt{xfym*zssϭu|]D1ЦQ(Y^?Ϙ1ߒ7 +ěע,1ap [^zi-CЍ+.wtA~'j:;ӟ|TH H|,̙g_(XYqﯽ\~+xO{ܸqkp4{}iVYu\qg] &GYH׹SAkD@s?|_z kP S7S~NE}O-vRԥPo2=G @QkkH")Y('1#H'EbSO,*"1:ԅijS?>͞=ѵkWW?? y\6~ Qh'^kHIH+$uVFm(RD"-Ik~ݬP׿1 [o&x;_xn;@ H⋱;=wH *-9G3P\Ls2XO:ϯ*~yAa˞~h=c e}bJ B]B@ ǹRI[ޓ lif]NAi'^D_!~-6//O`o?~x^E|cƌ)߰zO?+'|[gup|7 I&oZ}!:P^u?B-ZZX0\Tp®΀#/ T9IU`@ t1j-D /⬳fG<# !NeF:G ϟ0K(oY0B{ї⭾VdwW7z}?M\pA8//P%wkmW$7Et 1BYDyY#?* Ky]v٥?y҇)eʀ,QCϊVuy|5Z5CkGZs~S_dh{^k?'pB?;-d[tMUC"R!UwFF秖P`h@=0St̩ux≉U}(½nU7q7#;vl?uT,VV]i<9ZpYڀXUC@喽iz22>-2xv;v7KA׀@[ h| 50ʷe |+ן,Leo0жl "q"<0>"z^ hю5O0˿G!ko=,؁=czT7a;OzNN0NL\5tf{jr|PEDmB E#HHUN7GAmk k^=Im4J!{5Z{i-`zm=M}M0^Don_|_Q_9ZK.@h-Қ"%YuWΏT -2֭7xZ}Qk~yU*/McmҚv6oDa*k4fnD5viD'[f. ޺?P6͐wpXzmK& @kU.h@/W PeS m2[0m Elso&}LhkPkW>}c}Ku@KkQ wsE7Okq'X}u|_;L>&l7tS8pppp;PT~f>*gm0 QQxg@ZȈʛ0zuu10!{U! `z:ԧ#7gV@ HjpWتTak-j o{ߢZUՑd0f S4iSP~*eAɓK, N^絻(9%l̹R,8͟=Y"`zm@ e㯇(O㯍~LFPKU*կ~|^~O??N9\*62RDCTnS[nh0,ڜ,E@s=]o~^32.#0G-Z\*4jE$|Ak_T4@" n+mdSQj|bz0ud) x.VК~"`3A~l3yn1yXre<.#Dkyfm74/(ijDt^غ\ %vR o2~cn$I"h*¨%\<ӹ}&aZX|޿yOPR!"y S߿yB5>i.@3Lk [ǡEAAUQ~4(_չ6W)΅MU)5JuϚE4iTYƥ}:yzM˼Q[I `ZG޸^Hn]^o/as̴Bm08<#l7vaJY/^RLkv m{8=XzO}yaXd Q2 2d)_^s]k&T3C!=\۪F)w"ȑ}M-.1ynn4ͬ~odg@@MͪL5)\"5cMMcgb0%K,)mO@ L/Z8bv "r<\ Z-̬ي~@g?Sw߽!چ ht_sw@SQT kV%`,;üiӦ3=yvBDv@S@iSMQ/` (GE<0yZ=vm{k֬"Å?ߦmgj"5c*k־T9L/ t'c[@-;EիW;YL ?@&(@q-2̓K) N8T^)Wd0\kE )-)될Fj " Zς_~9B'TC0E(LE`B2)CJ'ӛr=e¦]iS3zV"6@wẼ4g;iODZLEm{=K?试ΫP[YskyLg"1$ʲ([/"` S9ǵB2"[UpU{o~_=Uia;`Ve3n\8}g`tS!a_J!m9 sι짞i&;wn'&R| ƵV@S @aKxfYZ /ZB|7aͫV'K,Jjh0 ȆllR!*?Y`# 0s2nq~zOƍh#g+: _{9ܾͬ\҉Oa KP$Bk&YUDI>[VD\Q 8?E\KիGJ}ʖD8N9Kos -HSmVj\ڑ4-dSd[ zt@޿.?-cJ0{LuLy *ʶ-P8/yc*(*eL1 ϿMBxRh 8 oC-$H)6R1I M5*>6EXMHLD*p _Hp{=Zx @$BDm A B5={ (64r6T@a v^+6LgBkcf\2@ a6@"W #F%@D;pfyƞi[o㱩Z\6~U.\G>nllW\^ٰYD7/?Oc LG}Օ?I\r `g(;LBP<0 ʀgɒŜm2@ez￿[r~1 oߏ1ssSH{6oMwuBz*2*q)r2 )%7[oN"eQ6@ BJI-ban*K[sQ@}ro 0/y9*׎U>¶%#Áml%>ۼwޡ]iP4LBadd 8OK)Љ9SPXlWO!PD3:G2' ̣$\ؼmܨ;6\K>k&(@]MoJRJڵ$ȡ]G}n}owporrv}k^lO~mUmPvd,Q:`P(w Z| YDe#K!^zM̘v d<^x! ؾ޺,] /4-;#Z*PS4)}%/~ N DrwĺʊNDBF9CdCi@CQ˼vQ3 !2{)k/>amv,L pSi;s)c$&ỎL©Y "R2U´|$qP(e nQ,7T_yz")qW^y%ɬ v6)?##n&vjw8xBjH)UnJb{n Lz+')m}՞oB<9Z\@E L5x"E`ԔBtFS~ƍq泘RUd126@g 58nK%M9oiD2}py-H>OCŀ&$lug75*꡿9si ~g6@ mn`j"`J _i.i6P.X@*6㯨{^05 "[HkpGi\҉'&P>v>OQ mQnQIjat$ 7@q4u(%hgޑÌi_-EiqܙϨ(ETu g}4Md'NZmEu[#+UByl NV+PKlþ2nq62K`B2īWdr,Y싏V_oPXaFgj<3yKt7@m݉LB˗/+`phP.(GjH>XhQ쭞560k$L;F QedSe[L6x(/UP&eNJ{y|ʣ7;G̶nx cvR,A 1FEF}nr/Jy`ak%'i ?0h6llelQ3w]K4M:h#;ߌ}0mEB[VSd; c_py&Oab MBzLc\y{55yo0tS8-bnxP(iMޢkepexetQ>~R'+VĀǔgpR>Q88.T д<ˮLW^K00|Uo馾J! >LbNT @IDAh]t$P'N-vڠG]EFZGcPPOݐ~ IzoS 3&d8 &tP\z-x s/2*+;2 /uJ~";4@(0e D@1KT@sW@[`E@PB~OԞF{}" N-RuUg}S{J< iy/t n<λv36Ԑ=v(@gf 7.U>$+ xb'dEJ{e˖y?N>s$qUsɒŬ9I+B"Pf6(väAB\4tg?Z>\s vlF);̻袋8AcmN߲FCw}w*H{t tGp>>'<)ːW>(Do9_CXlo*4_y!"١MJ{ĉFd* 3*.yzۗx+4 }a„ 1>)%s\h6$ c )j=PzQ@h@1SZ b~z!ۗh7^[[&d}{w_ D@[`P (Zn܊舳#_`FNFdo<q*eߵ@zhɓ')8kDB -lg/3y`zzz^($뮻|qLgmyRZPmo{[HW_:x6ïQ̈́G3fM15K\L@lüNIEsйWM%j|'![a;΍_牌{o|H'> ?_Uo?@u ]oEZjg*_פXfu8ō`!( cՎ[i 9 N jd_B! 1o^Г0QA Zp@1PjƏ 6! ~8[Ӏ`bM4쁤@*> =7ݴ(Vany:\Pcw>Q 9;Q0"Ȓ~Fxhm:JPtC/!!ПlG;\pq ? u5WH;h׷~n(Zc/t&Ζ6JLL`膗 ciCK_ A=7Sb]w nPRł?|mbc@v^=4ʫA !qf_ R *ڱ;;oYAh-wx=u&j䒋mDm ㎋8K460- _[JQVc7{,RԵAvrJ?"`[+UpdSsCͶ{pppH~_~?o6,Q;^o5yVu<1DK Sm 3 0TLxy(/o]v@PS;m#&,#By挷 hq{C* :h+vVJ`}lL,6'`UOPUߦZewi (N˗Yρ&/Dzbk^()&jm;*JXlrOW`7רLyI IS`X6V)^@Z+%"mb+ P ThRe@z_rS8ّ ka 6O ְt}xC2 Ŧ@3*a'z2@Aw@ni=SpS&Za+ 6jsMo2]PHk,y8i8V25k]~&`*dlo;/sc *bvI@86:Ip{X0 X6:mohOjN-1uHbͫ7jweԇ uxF;wPG0 ,6wӉS=D ]dkw$po;/v44S??nܸЮKzqg8P *"'ɆH$d@d7n{ w&)ڜV `aç0[1ٚ4jd;-&o$&lrK' LL,t@,Fl$ZMmKH,HHZk~cŊlL+ n͔cc!ɲ`A't)0٘vH~ v3cS8Gڝhf*dg??b*`W@s`2]3&s4 3n 4 j -HVZõ.4.gPi(sg,rn[ªċ@^`4ZM?M` '@@^ --6R #jvijx#VGWɶL81E1Hp}A@.$Ʀկק)Q;C'_0^z_z%o 6RB`<J?QDĢ rz΁ "r>jKJU Bŀr;HŋϤe_jYE|S#m4y 'l%??+ 0[z&s79 [hq.ӋB}{@IuXl4&0*$[=P"HϾY#5%3`j \pA"-\PرcTj+tvl d<͒%K_/V+)cpq#}yy z;pD~)$T 9I[lpڭyEDhG#m~`iӎ M@zO)F@{rHWS"rNPJ0:!"Lmߚtp:6Lr,?w;`U>Ck֬ΐn!bey {Gϻl8cF/Ysj3M=ϔw!`U@W_]-?zOm>t;?–]DEVX?׍/J@ {|;ꗚZHK 4bjbF6/w=_FSb@P)?m4dd d>k|_jPGgj&o]WPWDJ,L-=w=Z:-aZ@"@hؤ)38>v $w )_m3qޞa: vQg>sQeg"la)$Y5I@*09}P PMl6S_62on10HmQg}GyՎuB)%E7=*hljп\4ycٲjueiIǎlluhp9st1 `7W7vXN޿693P6H9ߩ( G#d,5j\j+R@"`gh \`AJz;uCC ˰twh7EV:ed m)~|jPӽ8#tSQP G7ҥB5ݡu4oy]#"8sO,{=NO1#XSRnO=TۿSBuYQYyͰ_=2o> ˬQ"Aj~CsLx3C9)1 4=%! X»;YQS=Kh spt~@u 7+͐00Pā?AX3lIkhh@y&5MEr޴~lll[IPSfö osSm7G~&E!![as06XP{慍d4dГZ@`?Q-ŹuR*:Wrgh Thk*d* lT@Rh|͜-vNl%U\@c=@lEAJ026G- لZZgo(В4xɣU-IقQ3W)PzN%<)+/߉oa mHi)ޒ T@HK/w* HI) SH7GXe;+d,CuQjG=C=ϽnXؕ0O51&MhΞ}V_kl(=͏`'C`ZV\T4UkI'V_Dez :ʡ% ԒS* 槝WUe; E/.fyyvTGhN;ATaƿZ?LsfC G'q17;@jvSWnBOT?*mk{w4"kmG+ xU iAЍiB{D ^%܄d?q}n喎&hm{6~a0\{9.-ۛ0]]?;nz>ӡx\]Cmرc (B'yQW#c N? ?e M.T$H 4zhH <~GOX+YP<$STBYX5Jc/63Td;zQkPOAklˎZb?PH(tc%F7DB\6)XA7E-LLn`{ʝ) F2BST0h-[GDP=`$m@ڕP-Uܡ 94E\ RP_L2[ HzΜF FG\ob]Nڬ\r{^{[,7`}{4RԪU1i6}4i˗?-[,.lᆹ  ~řQ_GAt$wؾ}\f#Gj_N GNL5XVN-H Tnv(ƍ~^xޖ///_v%IGh-8/{T&GnQZ0F7r{ЇSO=-OZ{mu_""O1 ow= ^{ׅTw92zm7'G޾!C?;@'K3ШU NM)ӃDsJ(=e@WDC= mw C_`D!`cY~V϶|}&nᡄQG>= Z &wn#AAiE4K/}A닁=IBEB 'MPEN8Yyhk&4? Vg   !=4vjDP<(ńA8m'x7{Y0BѦFś Z},T1P-AT  p Q1E뮻䍌yw`<}FߊFAmYYUٲ֥kڮcE]Ju!ϛ7pKNM3^\M/Hg͚][h0yzj)ա;C $ !eϘ1O[;2lIK(ؼ|!>2ΊFuP sw[]hQ`#|OG6A0zo,6V>yjm/@t[o#-vٛߤ'ǐ+]_E\1QHH ^d5oP<[zdM?$L@F0qPDqA$?|]!00$P1GYT'?hbM cNCG0'"hKcKg y~:BM$ u:jm̙3lj Ph{"`7DA[(?s̶  /IL ȴP(uѨG!=C%4&t-d}F_^?"`„ 7q6"b̬Y3#?868Ta<3E@+lAߥ~2_{dF_>ӟOF'ʕ+?i[fy O<(++/"o/(=*26j1!&#=N:'|wZG+/=Κ"j e.bo-."*5K?No2IxN`KV{ػ Q^`?54C?o{XlEtϲuJ }tt t( /4V@u]_n8~EyuB.ky/H@}Gj_Nmo7wq0_ q=罍"%1d%ЮwԏB˗/qm\x"'F9YQ@!Eڗ*ݠY򗿬-{}{9Ye,7!!"@^ '}iMH8IoU(9 +Bō7]|ŶoԎjZVD9 ]Tx[1}YEՂDVm|w/E5?JAȑUǏi˽jWkҥ^{E@PUU5` x駽ZuQUNv~~NٳgGOLz$`* <( |5~O* AU+6y pkE{ЎTGm㫐*]@ϼys+"@mm'M*124*TOVT@\Tm|}߆k!E:Q?v#.~GrJGz_Io屛:"hfq6oW?0'N*5Sa;'ɍ7j 2^K?F֬1nCԷn&t Ac=((s Zy F|wWx|~;DqнX*(x _L.RsuׅxH_p/^gPX"V\9<~dCѹ!F&ND4 've oªNue/ f< YRDas=я~jEy5"PhӦ ˉN:ݨ]O l^^m; Ά?G@9EjT)"S(H4OlD5e0=}[*G@@NOfgn xAh^@QQY?j?=d8{P_%\;=~hmL-ѓQ ^{$@ OE3+ܯר?G}wbF!G~_x |fp@=hԨS}t'-C$fU$(bd[}!?s,_@z뭾cO^"AH١9s.X?hĀy}E)tXws2 {!B`VT/bs!! ! A٠=fϞY hBb@B@i dvM}@RK@<" ?vLoJ mBPZ`Μ9m ApH H@vevMƌ ' ֧ ׎BmG))-* +ǟ~V!0m !& fj!мKۗEE}   E8H@ƨ[@Mkk=Wn ~B!~m33D[ R"!p=e˖l'M87{woO6C~?@@B V B=QzsC=z $L=@n8?a4bG %!덦b <9m6n]ïp0gP3ӯ>~ ? XB@)iӦy x}/qv-d8#J"ch"?(5  8W#o[o_cT Oy1 E8 @n_("S7D޾Ш^m33( qE$"yu?YUօ"=q;mEtKO}%o(?n9*^{~vB/n_@]LJ" F_~gK^@XoE cF_ Ԏ_zu[ |`T P@=_Wmdmw]S"&4i"`DeT@b@"Nŀĉ_lFCfpVP 1耄@ Hy}@] 4 zað>F: tM;Aoo/!o~xxMxn< ~r(GC*J ! ?c//__w7"vR EJ":`lŖTDNx,[7O?T_ ~@TK ԅI h 5/}^]9{z?6 u0q[_oo%z /^(\/N72P7|@ۢ 7?H-~Z] z BN>~ X@%IuR~q 6= & q[ ԍw@^x A Ս{`a` ƯDB^=ph6_zk =Q(0`hKKIENDB`mumble-1.3.4/themes/Mumble/config_asio.png0000664000175000017500000001072514010707353020341 0ustar builderbuilderPNG  IHDRXtEXtSoftwareAdobe ImageReadyqe<wIDATxq9{81cwteVR)^W[ @'@'`FpOkC}U,֊ohG5O?/閯wl5{4 bX3(_}զ|J`VU:¨| [x_לޅ@qSz }\AYD gP`2ݣ<0s j</'H47!(?Mp?'M@i$enkĦ*S8\St7Jԧ}s풤sD^c&M"'cW'`$xvgpDt\NSGmU2FV4V21q"*xŽ#G8%F8sQhsHj{I~]HnV[ HYP`]E:XՍĬ+ jyѐV: –1\LA3F)+$0-a婴Ap1vy5XJgjDݙ%9$bwkT>B℆m)&=>F,k8^dQӐFl"R8Vo1Gc5: jHJJb׬1ݤ#f,5Wu&$x[!I,FYzjheڥFevgC>Շ^shc1 bKB5kFMf,!Hv,ȍ5az[^y6jwKN |.dFWmhѐh'LvA A8vK<1Z#Ch;z_Ip%4tׄ`c-`7$28QMZ)BX=>!i; g#n"=i[.:ig7ڐ{{zw"8qTB܏@sOsf|XLXV?{T9Kݴ& ŋX\9[ P/+ jPdh'Z6+cb7CfԋV2S-'k“νʫ'QC 5t@ h3{XVfE;'acd18%;?XKU (+k8 xw0%6~ h =,r]r(1BbA#$٦do^0AW2·|uo#!]Aܧ!`hվP x?Дـ=Й%‹|||AdAv*W 9jљ#VX m d3, Fszza [4h ="ȌVj"XKь攭б޾ƒp ([c{&>@Нehղ3jPa;sCCkz{4e/tm$y6T7 }ӯڰ(a& ն} Ӱ_5!6bNݮ8FCBiաl=\ AA|ڒًjvc}6K'p(5\hOu߳mÓ>64)1?bjwۧU 6j@A4V/CxwE@(TmUÏո>$@6T6,ĜjM({c dkd}xң%'{c\O|/B,4Qv[̂$!C,M|*@6X)Y$BO~OSVؾɽ6_xBSix!n&}RyY_x v)1En1vHz)C-DY [ܛPrL-ϖ@Fg:c&=oȉwӋd=j^DA~C]xցnQ:& cڸO6V/7$`T9Po9;5[g)!a 5l"_՜ Φ'49VHKWFԝ AB!"P]|@r36pv$i'HED(ւpP YXd"H\7N@vϮ &y@@랎%M0H.Cqz-9m}AmzS u_#YFSAw!e!HEOnq9R D++0=(ws%~@9 # LPcҚ'Ǵ FՖ‹=$-@/-Zx70Y8Y$2V/ = =+ CݿYKъcX7|GfF}@C@Y 6/h|| K:8'[JLA}!`|2W$>@,NT )3oRE !HS)hfTFë!dS\(DK"0Qq5d$0tJ.4%=җ Y C3^OypH]9@ؠ X '%nUScqK|%~K5آC84\ìf@R h)W){gLo^?g0,S> TsaCcD@漈X}w $cWC2}% {~cO: ?g%d=:ޠ7vK"(>=N`4ؔݙZ {_Q+;SA>(5SAN=|\BI :erCZ.b{lP64:%y9xhAz% 'ΌB@N'edkiC-ֽcVlp\r]ռc0IHӁYs.mQ OC_ =IENDB`mumble-1.3.4/themes/Mumble/status/0000775000175000017500000000000014010707353016671 5ustar builderbuildermumble-1.3.4/themes/Mumble/status/text-missing.svg0000664000175000017500000000154614010707353022053 0ustar builderbuilder mumble-1.3.4/themes/Mumble/actions/0000775000175000017500000000000014010707353017006 5ustar builderbuildermumble-1.3.4/themes/Mumble/actions/media-record.svg0000664000175000017500000000210514010707353022060 0ustar builderbuilder mumble-1.3.4/themes/Mumble/actions/audio-input-microphone-muted.svg0000664000175000017500000000273314010707353025247 0ustar builderbuilder mumble-1.3.4/themes/Mumble/actions/format-text-underline.svg0000664000175000017500000001171714010707353023773 0ustar builderbuilder mumble-1.3.4/themes/Mumble/actions/format-text-italic.svg0000664000175000017500000000607214010707353023251 0ustar builderbuilder mumble-1.3.4/themes/Mumble/actions/format-text-bold.svg0000664000175000017500000000633714010707353022730 0ustar builderbuilder mumble-1.3.4/themes/Mumble/actions/audio-input-microphone.svg0000664000175000017500000000257714010707353024141 0ustar builderbuilder mumble-1.3.4/themes/Mumble/authenticated.svg0000664000175000017500000000115314010707353020711 0ustar builderbuilder mumble-1.3.4/themes/Mumble/layout_custom.svg0000664000175000017500000000620114010707353020775 0ustar builderbuilder Chatbar Tree Log mumble-1.3.4/themes/Mumble/LICENSE0000664000175000017500000000227214010707353016356 0ustar builderbuilderThis is free and unencumbered software released into the public domain. Anyone is free to copy, modify, publish, use, compile, sell, or distribute this software, either in source code form or as a compiled binary, for any purpose, commercial or non-commercial, and by any means. In jurisdictions that recognize copyright laws, the author or authors of this software dedicate any and all copyright interest in the software to the public domain. We make this dedication for the benefit of the public at large and to the detriment of our heirs and successors. We intend this dedication to be an overt act of relinquishment in perpetuity of all present and future rights to this software under copyright law. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. For more information, please refer to mumble-1.3.4/themes/Mumble/mimetypes/0000775000175000017500000000000014010707353017362 5ustar builderbuildermumble-1.3.4/themes/Mumble/mimetypes/image-x-generic.svg0000664000175000017500000000315514010707353023050 0ustar builderbuilder mumble-1.3.4/themes/Mumble/mimetypes/text-html.svg0000664000175000017500000000504614010707353022036 0ustar builderbuilder mumble-1.3.4/themes/Mumble/mumble.svg0000664000175000017500000000654714010707353017364 0ustar builderbuilder mumble-1.3.4/themes/Mumble/config_network.png0000664000175000017500000001457014010707353021101 0ustar builderbuilderPNG  IHDRXtEXtSoftwareAdobe ImageReadyqe<IDATx]koW6nm+w5 8&&h3Cp6s$Q®VZisQX&+vW&;L& K&&tF$L.c.5}ۘ9ۧOUs}VKvwuy} @ ;g^L:,yWZStֈ ,S}љ3%+/ȰtDI:Dſ`{N|X)FD8ZDdQ׼GBCO13 FInF]  azYU&8!|Y =!E)O) nHv%E CJX3b$.sK"+oTO5ߪc1α*K+5!^[zɚi;,J"9^fFv嚉ܪTLll[^6( ƍ_6b>c̚9ASo3ܮ5WkVx} _~gw]idPUO4dc1b֌7P*c⟼ +L83B ݸFdO|.ћeM~Ad Z ȧ QHMV%f#ieƓ[n͚$>+ZCZp֊dp?\QGjIX!bZ"<嬅,! e^T%VToL"TE~s3?8쐟՟"*uw>j? Br@R#m.ÿ/qAUr~}l͔еk&\۸ok+5*%&N?8 F޿}LݻITI#1I$Ӟ CJ\@rC&TxL8Uʓ%..D8D幵uƽcr,J"Zh; O2Hq˅db\;)<\%]BPnGcWO4Dmri HsH֒>ae{ɡba[R^ ,eWN ZdqW[ 4|)! HaI.AXőkϾߨbE.s]|ήʷBno5YmT0g  )/DE#ӈ rDt.YHv$ @bM%r,;Pz!U$ɬo߼Kr-(@D)_v$5L7, Ðui`_]2d__[{rCt;,ŊϬR`O9ah%HZl<xÆ !mT*+vސ ,*r֫ Iؘ:pB Q AH.T;7LJ/g^Q DQwy AtVLcL~0e2,?;]p˵P9rͦQV7]tGdO7D@{LW'|􅣯]Kb-ypZZkU$-ܙ͚[ M̺4޼wGsPEʹZ)cn$F(Fc NY|U-Ȣ&I+d0t@ `w֌ RR_Nwa< $"}'/?FbC%=#H7ynUh `N%( Z9aZ?#Vd'ae ɫ{;=vnx|[FILl^R ɮB֣I8pJ>`+zq{=b-oa-dlZ9 [W"G|Kҝ.^{hٵ gϼ4[O) &0Hr=\g}3Ka]x"P=uJ\#FqHA o3Sۖe9[M I,z۔n,sza: |=1qodNo:EI{wfsk'+;_I^8Z϶S5MD@jX1ίd[UX_iMZ tډ`^l[&UoGb?P.GαkǣSD I-ͪrÍd$na:`)?G>jAt"P mQhV!+C0kWbPBM8 ӋcDQ,Y!O.(LLZjā̯.cuւ`1 '$Ƭ"(WVM"[lW3#[< a#Pa | lImNמO X@ێn$^y4L%2I~fȡc*+;k TkX\eA۩^D[Q^%,"p>QªIf~TD8ʐW9 2'.'|"3-~r/w?~ZǶF|oDJA! $l/Cw~Z,A y_ _iMdEf\W"[BcɭxъYGU$,#ڿVr[(A$7ܑ9OPJ^"H6~y̫:B n=WW$] ,Gf,=:=rj#2Tv +WjcD ;Am2Q}v)@Pb&%7O\i9_sՋޏgt𵽿͵(ڧ]s0ᒐ.L޶eAҢ~$bG!s0/LޔkYI[U -#}xAXrЬh͛9>)$Yqw#Vi"?a `NǯE YO㓻RZ[L6Q "]1>N`lj܅h19 8QMrD-FD]aNh1n櫟+e/&Hɼ7NA)dֵ6W5Ab}|O3փ;Z²|nXopH7EHY͜ Ou]4Xm~ yFmE~Ȍ߉d{F&΁s':kb=z<'~u}(UzuXOh8֣5ZA5%.'%vt\kH:=DYkiKdJ<]~lkdeJȨ;&H0RHآjvPv+#bQ,eKH%o(B䛢DYh<:k`,}#){NUK wIRtɚxL /y}ȅ5oŤ[aNA rG Z&CNH  5rB.5x*n y@o!.䘓v uÓwW g>h j/3V/D0EP{ .* )2jA^ y@/M>hϬ"d[[yW ’5/.nWϪ` Ac!1 F'd*Q A#8ϼ6ri[Dr ,ɝSjNss;yfwpSZyJF7O{\/iN D{(D$ReU%#wu[Ԑ}!r)bχ(h K(-vw#!)Dxd  N%9<'#I$?bp)`dWbXk/DSSA&L QObject { background-color:$dialog-bg; color:$sub-text; } QObject:disabled, QObject::item:disabled { color:$base-text-disabled; } a { color:$link; text-decoration:none; } QObject::separator { height:4px; width:4px; } QObject::separator:hover { background:$base-hover; } DockTitleBar { font-size: $font-size-extra-small; } QToolTip, QWhatsThis { font-size:$font-size-small; min-height:1.3em; border: 1px solid $control-icon; border-radius: 0; background-color:$sub-bg; color:$sub-text; } QTextBrowser, QTextEdit { background-color:$sub-bg; color:$sub-text; border:1px solid $base-border; } QToolBar { background-color:$base-bg; spacing:0; padding:2px; } QToolButton { border:1px solid transparent; border-radius:$base-border-radius; padding:$base-padding - 3; margin:1px; } QToolButton:on { background-color:$toolbutton-on; border:1px solid $toolbutton-border; } QToolButton:hover { background-color:$toolbutton-hover; border:1px solid $toolbutton-hover-border; } QToolButton:pressed { background-color:$toolbutton-pressed; } QToolBar::separator { background:$sub-highlight; height:1px; margin:$base-padding; width:1px; } QToolBar::separator:hover { background:$sub-highlight; border:0; } QToolButton#qt_toolbar_ext_button { min-width:$base-padding*2; width:$base-padding*2; padding:1px; qproperty-icon:url(skin:controls/toolbar_ext.svg); } QToolBar::handle:horizontal { image:url(skin:controls/handle_horizontal.svg); width:8px; padding:$base-padding; } QToolBar::handle:vertical { image:url(skin:controls/handle_vertical.svg); height:8px; padding:$base-padding; } QMenuBar::item { background-color:transparent; padding:$base-padding 12px; } QMenuBar::item:selected { background:$highlight-bg; color:$highlight-text; } QMenuBar::item:pressed { background:$highlight-pressed; color:$highlight-text; } QMenu { background:$menu-bg; border:1px solid $base-border; color:$sub-text; } QMenu::item { border:1px solid transparent; color:$sub-text; padding:$base-padding + 1 $base-padding * 4; padding-left:25px; border-radius:$base-border-radius; } QMenu::item:selected { background:$menuitem-hover; border:1px solid $menuitem-border; } QMenu::item:disabled { border:1px solid transparent; background:transparent; } QMenu::separator { background:$sub-highlight; height:1px; } QMenu::indicator { padding-top: 2px; height:25px; width:25px; } QPushButton { background-color:$button-bg; border:$button-border; color:$sub-text; font-size: $font-size-big; padding: $base-padding - 1 $base-padding*4+4; } QPushButton:focus { background-color:$button-focus; } QPushButton:hover { background-color:$button-hover; border-color:$button-hover-border; } QPushButton:hover:focus { background-color:$button-focus-hover-bg; border-color:$button-focus-hover-border; } QPushButton:focus { border-color:$base-border-focus; } QPushButton:pressed, QPushButton:pressed:focus { background-color:$highlight-bg; border-color:$highlight-bg; color:$highlight-text; } QGroupBox, #qwMacWarning { background-color:$median-bg; border:1px solid $base-border; color:$sub-text; font-size: $font-size-bigger; padding:$base-padding; padding-top:1em; } QGroupBox::title { background-color:transparent; margin:$base-padding * 1.5; margin-left:$base-padding + 4; margin-right:$base-padding * 2; } QListView { background-color:$sub-bg; border:1px solid $base-border; } QListView::item { border-radius:$base-border-radius; border:1px solid transparent; color:$sub-text; selection-color:$sub-text; padding:$base-padding/2 $base-padding; } QListView::item:hover { background-color:$sub-hover; border:1px solid $sub-hover; } QListView::item:selected { background-color:$item-selected-inactive-bg; border:$item-selected-inactive-border; } QListView::item:selected:active { background-color:$item-selected-active-bg; border:$item-selected-active-border; } QTreeView { background-color:$sub-bg; color:$sub-text; selection-background-color:$sub-bg; selection-color:$sub-text; border:1px solid $base-border; } QTreeView::item { min-width:60px; border:1px solid transparent; border-left:0; border-right:0; color:$sub-text; padding:$base-padding/2 $base-padding; selection-color:$sub-text; border-radius:0; } QTreeView::item:first, QTreeView::item:only-one { border-left:1px solid transparent; border-top-left-radius:$base-border-radius; border-bottom-left-radius:$base-border-radius; } QTreeView::item:last, QTreeView::item:only-one { border-right:1px solid transparent; border-top-right-radius:$base-border-radius; border-bottom-right-radius:$base-border-radius; } QTreeView::item:hover, QTreeView::item:focus { background-color:$sub-hover; border-color:$sub-hover; } QTreeView::item:selected { background-color:$item-selected-inactive-bg; border:$item-selected-inactive-border; border-right:0; border-left:0; } QTreeView::item:selected:first, QTreeView::item:selected:only-one { border-left:$item-selected-inactive-border; } QTreeView::item:selected:last, QTreeView::item:selected:only-one { border-right:$item-selected-inactive-border; } QTreeView::item:selected:active { background-color:$item-selected-active-bg; border:$item-selected-active-border; border-right:0; border-left:0; } QTreeView::item:selected:active:first, QTreeView::item:selected:active:only-one { border-left:$item-selected-active-border; } QTreeView::item:selected:active:last, QTreeView::item:selected:active:only-one { border-right:$item-selected-active-border; } QTreeView::branch { border-image:none; image:none; margin-left:3px; margin-top:1px; padding-left:3px; } QTreeView::branch:has-children:closed { image:url(skin:controls/branch_closed.svg); } QTreeView::branch:has-children:open { image:url(skin:controls/branch_open.svg); } QHeaderView { border-bottom:1px solid $base-border; border-radius:0; } QHeaderView::section { border:0; background-color:$median-bg; color:$sub-text; padding:$base-padding; padding-left:$base-padding * 2; padding-right: 20px; border-radius:0; } QHeaderView::down-arrow, QHeaderView::up-arrow { margin:1px; top:1px; right:5px; width:14px; } QHeaderView::down-arrow { image:url(skin:controls/arrow_down.svg); } QHeaderView::up-arrow { image:url(skin:controls/arrow_up.svg); } QTabWidget::pane { background-color:$median-bg; border:1px solid $base-border; } QTabWidget::pane:top { margin-top:-1px; border-radius:$base-border-radius; border-top-left-radius:0; } QTabWidget::pane:bottom { margin-bottom:-1px; border-radius:$base-border-radius; border-bottom-left-radius:0; } QTabWidget::tab-bar { background-color:$dialog-bg; } QTabBar::tab { color:$tab-deselected-text; background-color:$tab-deselected; padding:$base-padding * 1.5 $base-padding * 4; border-radius:0; border:1px solid $base-border; border-right:0; } QTabBar::tab:last, QTabBar::tab:only-one { border-right:1px solid $base-border; } QTabBar::tab:hover { background-color:$tab-hover; } QTabBar::tab:disabled { color:$base-text-disabled; } QTabBar::tab:selected, { color:$sub-text; background-color:$median-bg; } QTabBar::tab:top { border-bottom:0; margin-bottom:1px; } QTabBar::tab:bottom { border-top:0; margin-top:1px; } QTabBar::tab:top:selected { padding-bottom:$base-padding * 1.5 + 1; margin-bottom:0; } QTabBar::tab:bottom:selected { padding-top:$base-padding * 1.5 + 1; margin-top:0; } QTabBar::tab:top:first, QTabBar::tab:top:only-one { border-top-left-radius:$base-border-radius; } QTabBar::tab:top:last, QTabBar::tab:top:only-one { border-top-right-radius:$base-border-radius; } QTabBar::tab:bottom:first, QTabBar::tab:bottom:only-one { border-bottom-left-radius:$base-border-radius; } QTabBar::tab:bottom:last, QTabBar::tab:bottom:only-one { border-bottom-right-radius:$base-border-radius; } QScrollBar { border-radius:0; font-size: $font-size-normal; } QScrollBar:vertical { border-left:1px solid $scrollbar-border; width:1em; } QScrollBar:horizontal { border-top:1px solid $scrollbar-border; height:1em; } QScrollBar::handle { margin:-1px; background:$scrollbar-handle; border:1px solid $scrollbar-handle-border; } QScrollBar::handle:vertical { min-height:10px; } QScrollBar::handle:horizontal { min-width:10px; } QScrollBar::handle:hover { background:$scrollbar-handle-hover; } QScrollBar::left-arrow, QScrollBar::right-arrow, QScrollBar::up-arrow, QScrollBar::down-arrow, QScrollBar::sub-line, QScrollBar::add-line, QScrollBar::add-page, QScrollBar::sub-page { background:$base-bg; height:0; width:0; border-radius:0; border:0; } QAbstractScrollArea::corner { border-left:1px solid $scrollbar-border; border-top:1px solid $scrollbar-border; height:0; width:0; border-radius:0; border-top:1px solid $scrollbar-border; border-left:1px solid $scrollbar-border; background:$sub-bg; } QLineEdit, QComboBox, QSpinBox, QAbstractSpinBox { color:$sub-text; padding:$base-padding; min-height:1em; } QComboBox, QSpinBox, QAbstractSpinBox { border:$button-border; background-color:$button-bg; } QLineEdit, QTextEdit, QPlainTextEdit, QSpinBox, QAbstractSpinBox, QComboBox:editable { border:$input-border; background-color:$input-bg; } QSpinBox, QAbstractSpinBox { min-width: 2.5em; padding-right: 10px; } QPushButton:disabled, QLineEdit:disabled, QTextEdit:disabled, QPlainTextEdit:disabled, QListWidget:disabled, QTreeWidget:disabled, QComboBox:disabled, QSpinBox:disabled, QAbstractSpinBox:disabled { border:1px solid transparent; background-color:$control-disabled; } QComboBox::drop-down, QAbstractSpinBox::drop-down, QSpinBox::drop-down, QDateTimeEdit::drop-down { background-color:$sub-bg; border:0; margin-left:$base-padding; margin-right:$base-padding * 3; margin-top:5px; } QComboBox::down-arrow, QDateTimeEdit::down-arrow { margin-top: -2px; image:url(skin:controls/arrow_down.svg); width:14px; } QComboBox::down-arrow:disabled, QDateTimeEdit::down-arrow:disabled { image:url(skin:controls/arrow_down_disabled.svg); } QToolButton[popupMode="1"], QToolButton[popupMode="2"], QPushButton[popupMode="1"], QPushButton[popupMode="2"] { padding-right: 14px; } QToolButton::menu-arrow, QToolButton::menu-indicator, QPushButton::menu-arrow, QPushButton::menu-indicator { image:url(skin:controls/arrow_down.svg); subcontrol-origin: padding; subcontrol-position: center right; top:2px; right:2px; width:14px; } QSpinBox::down-button, QAbstractSpinBox::down-button, { padding-right:4px; image:url(skin:controls/arrow_down.svg); width:14px; padding-bottom:1px; } QSpinBox::down-button:disabled, QAbstractSpinBox::down-button:disabled, { image:url(skin:controls/arrow_down_disabled.svg); } QSpinBox::up-button, QAbstractSpinBox::up-button { padding-right:4px; image:url(skin:controls/arrow_up.svg); width:14px; padding-top:1px; } QSpinBox::up-button:disabled, QAbstractSpinBox::up-button:disabled, { image:url(skin:controls/arrow_up_disabled.svg); } QComboBox QAbstractItemView { background-color:$sub-bg; border:1px solid $base-border; color:$sub-text; border-radius:0; } QLabel, QCheckBox, QAbstractCheckBox, QTreeView::indicator, QRadioButton { color:$sub-text; background:transparent; } QCheckBox::indicator, QTreeView::indicator, { background-color:$button-bg; border:$button-border; height:13px; width:13px; margin-top: 1px; } QMenu::indicator { width: 12px; left: 6px; } QCheckBox::indicator:checked, QMenu::indicator:checked, QTreeView::indicator:checked { image:$checkbox; } QCheckBox::indicator:disabled, QTreeView::indicator:disabled { border:1px solid $median-bg; background-color:$control-disabled; } QCheckBox::indicator:checked:disabled, QTreeView::indicator:checked:disabled { border:1px solid transparent; image:$checkbox-disabled; } QRadioButton::indicator { background:$button-bg; border:$button-border; border-radius:7px; height:12px; width:12px; } QTreeView::indicator { background:$button-bg; } QRadioButton::indicator:disabled { background-color:$control-disabled; margin:1px; border:1px solid transparent; } QRadioButton::indicator:checked { image:$radio; } QRadioButton::indicator:checked:disabled { image:$radio_disabled; } QSlider::groove { background:$slider-groove; border:1px solid $slider-groove-border; border-radius:2px; font-size: $font-size-qslider-groove; } QSlider::groove:horizontal { height:0.8em; } QSlider::groove:vertical { width:0.8em; } QSlider::groove:disabled, QSlider::sub-page:disabled { background:$control-disabled; border:1px solid transparent; border-radius:2px; } QSlider::sub-page { background: $slider-fill; border:1px solid $slider-fill-border; border-radius:2px; } QSlider::handle { background:$slider-handle; border:1px solid $slider-handle-border; border-radius:3px; font-size: $font-size-qslider-handle; } QSlider::handle:horizontal { margin:-5px -1px; width:4.5em; } QSlider::handle:vertical { margin:-1px -5px; height:4.5em; } QSlider::handle:focus { background-color:$slider-handle-focus; border-color:$slider-handle-focus-border; } QSlider::handle:hover { background-color:$slider-handle-hover; } QSlider::handle:pressed { background-color:$slider-handle-pressed; border-color:$slider-handle-pressed-border; } QSlider::handle:disabled { background-color:$control-disabled; border:1px solid $control-disabled; } QCheckBox::indicator:focus, QTreeView::indicator:focus, QRadioButton::indicator:focus, QComboBox:focus { background-color:$button-focus; } QCheckBox::indicator:focus:hover, QTreeView::indicator:focus:hover, QRadioButton::indicator:focus:hover, QComboBox:focus:hover { background-color:$button-focus-hover-bg; border-color:$button-focus-hover-border; } QCheckBox::indicator:hover, QTreeView::indicator:hover, QRadioButton::indicator:hover, QComboBox:hover { background-color:$button-hover; border-color:$button-hover-border; } QLineEdit:focus, QSpinBox:focus, QAbstractSpinBox:focus, QComboBox:editable:focus { background-color:$input-bg; } QLineEdit:focus:hover, QSpinBox:focus:hover, QAbstractSpinBox:focus:hover, QComboBox:editable:focus:hover { border-color:$button-focus-hover-border; } QLineEdit:hover, QSpinBox:hover, QAbstractSpinBox:hover, QComboBox:editable:hover { background-color:$input-bg; border-color:$button-hover-border; } QCheckBox::indicator:focus, QTreeView::indicator:focus, QRadioButton::indicator:focus, QComboBox:focus, QLineEdit:focus, QTextEdit:focus, QPlainTextEdit:focus, QSpinBox:focus, QAbstractSpinBox:focus, QComboBox:editable:focus { border-color:$base-border-focus; } QFontDialog { min-width: 32em; min-height: 24em; } QColorDialog QColorLuminancePicker { background-color:transparent; } QMessageBox, QDialogButtonBox { dialogbuttonbox-buttons-have-icons: 0; } /* Mumble Specifics */ LogTextBrowser, #qdsChat { margin:0 2px; min-height:120px; min-width:40px; border-color:$base-border; } UserView { margin:0 2px; min-height:120px; min-width:40px; } UserView::item { padding:0; padding-top:-1px; } #qdwChat > QTextEdit { padding:-2px; margin:0 2px; margin-bottom:2px; font-size: $font-size-normal; } #qtIconToolbar QComboBox { font-size: $font-size-small; } .log-time { background-color:transparent; color:#95a5a6; font-size: $font-size-medium; } .log-server { background-color:transparent; color:#F9655D; font-weight:bold; } .log-channel { background-color:transparent; color:#e67e22; font-weight:bold; } .log-privilege { background-color:transparent; color:#c0392b; font-weight:bold; } .log-target { background-color:transparent; color:#27ae60; font-weight:bold; } .log-source { background-color:transparent; color:#27ae60; font-weight:bold; } QListView#qlwIcons { padding:0; background-color:transparent; border:0; font-size: $font-size-big; min-width:165%; margin-left:$base-padding; margin-top:$base-padding + 8; } QListView#qlwIcons::item { margin-bottom:1px; padding:5px $base-padding * 2 - 1; } QListView#qlwIcons::item:hover { border-color:$base-hover; background-color:$base-hover; } QListView#qlwIcons::item:selected { background-color:$toolbutton-on; border:1px solid $toolbutton-border; } QListView#qlwIcons::item:focus { background-color:$item-selected-active-bg; border:$item-selected-active-border; } QSlider { margin-left:30px; margin-right:30px; } #qswPages > * > * > QScrollBar { margin:0; } #qswPages > * > QWidget { margin: $base-padding / 2; } QListView::item QListWidgetItem, QListView::item QLineEdit, QTreeView::item QComboBox, QTreeView::item QLineEdit { background:$button-bg; margin: 0; padding-top: 0; padding-bottom: 0; padding-left: $base-padding; padding-right: $base-padding; font-size: $font-size-medium; } QListView::item QListWidgetItem:hover, QListView::item QLineEdit:hover, QTreeView::item QComboBox:hover, QTreeView::item QLineEdit:hover { background:$button-bg; } AboutDialog > QTextBrowser, AboutDialog QTextEdit { border:0; } #qtbToolBar { border:1px solid transparent; background:transparent; } #BanEditor { min-width: 600px; } #GlobalShortcutTarget { min-height: 600px; } ViewCert { min-height: 600px; }mumble-1.3.4/themes/Mumble/source/Imports/Dark Definitions.scss0000664000175000017500000000463214010707353024322 0ustar builderbuilder// This is a file you could modify if you are making your own skin. // See README.md // Add your own custom QSS at the end of this file // Skin color definitions below $base-padding: 4px; $base-bg: #2e2e2e; $base-hover: #333; $base-pressed: #484848; $base-text: #eee; $base-text-disabled: #484848; $base-border: #1c1c1c; $base-border-focus: #3e4f5e; $base-border-radius: 2px; $item-selected-active-bg: #3e4f5e; $item-selected-active-border: 1px solid #3e4f5e; $item-selected-inactive-bg: #3b3b3b; $item-selected-inactive-border: 1px solid #3b3b3b; $sub-bg: #191919; $sub-hover: #333; $sub-text: #d8d8d8; $sub-highlight: #555; $dialog-bg: #1D1D1D; $median-bg: #2d2d2d; $toolbutton-on: #444; $toolbutton-border: #444; $toolbutton-hover: #3e4f5e; $toolbutton-hover-border: #3e4f5e; $toolbutton-pressed: $base-pressed; $highlight-bg: #298ce1; $highlight-pressed: #1979ca; $highlight-text: #FFF; $menu-bg: #2b2b2b; $menuitem-hover: #3e4f5e; $menuitem-border: #3e4f5e; $scrollbar-border: $base-border; $scrollbar-handle: #666; $scrollbar-handle-border: $base-border; $scrollbar-handle-hover: #888; $input-bg: #191919; $input-border: 1px solid #2e2e2e; $input-hover: #484848; $control-icon: #888; $control-icon-disabled: #444; $control-disabled: #282828; $slider-groove: #393939; $slider-groove-border: #393939; $slider-fill: #486d8d; $slider-fill-border: #486d8d; $slider-handle: #777; $slider-handle-border: #222; $slider-handle-focus: #6d96ba; $slider-handle-focus-border: #226; $slider-handle-hover: #999; $slider-handle-pressed: #bbb; $slider-handle-pressed-border: #222; $tab-selected: #333; $tab-deselected: #1e1e1e; $tab-deselected-text: #ccc; $tab-separator: #111; $tab-hover: #3e4f5e; $button-bg: #444; $button-hover: #595959; $button-focus: #3e4f5e; $button-focus-hover-bg: #485d6f; $button-focus-hover-border: #485d6f; $button-border: 1px solid #444; $button-hover-border: #555; $radio: url(skin:controls/radio_check_dark.svg); $radio_disabled: url(skin:controls/radio_check_disabled.svg); $checkbox: url(skin:controls/checkbox_check_dark.svg); $checkbox-disabled: url(skin:controls/checkbox_check_disabled.svg); $link: #39a5dd; $font-family: "Segoe UI", Frutiger, "Frutiger Linotype", "Dejavu Sans", "Helvetica Neue", Arial, sans-serif; $font-size-bigger: 13pt; $font-size-big: 12pt; $font-size-normal: 10pt; $font-size-medium: 9pt; $font-size-small: 8pt; $font-size-extra-small: 7pt; $font-size-qslider-groove: 3pt; $font-size-qslider-handle: 4pt; mumble-1.3.4/themes/Mumble/source/Lite.scss0000664000175000017500000000111514010707353020436 0ustar builderbuilder/* * Mumble Lite Theme * https://github.com/mumble-voip/mumble-theme * * Based on MetroMumble Theme by xPoke * https://github.com/xPoke * * Originally forked from Flat Mumble Theme by xPaw (xpaw.ru) * * Licensed under The Do What The Fuck You Want To Public License (WTFPL) */ // This is a file you could modify if you are making your own skin. // See README.md // Add your own custom QSS at the end of this file // Import skin definitions @import 'Imports/Lite Definitions'; // Import base theme CSS @import 'Imports/Base Theme'; // Add or import your own custom QSS below mumble-1.3.4/themes/Mumble/source/Dark.scss0000664000175000017500000000111414010707353020421 0ustar builderbuilder/* * Mumble Dark Theme * https://github.com/mumble-voip/mumble-theme * * Based on MetroMumble Theme by xPoke * https://github.com/xPoke * * Originally forked from Flat Mumble Theme by xPaw (xpaw.ru) * * Licensed under The Do What The Fuck You Want To Public License (WTFPL) */ // This is a file you could modify if you are making your own skin. // See README.md // Add your own custom QSS at the end of this file // Import skin definitions @import 'Imports/Dark Definitions'; // Import base theme CSS @import 'Imports/Base Theme'; // Add or import your own custom QSS below mumble-1.3.4/themes/Mumble/source/OSX Lite.scss0000664000175000017500000000231514010707353021073 0ustar builderbuilder/* * Mumble Lite Theme for OSX * https://github.com/mumble-voip/mumble-theme * * Based on MetroMumble Theme by xPoke * https://github.com/xPoke * * Originally forked from Flat Mumble Theme by xPaw (xpaw.ru) * * Licensed under The Do What The Fuck You Want To Public License (WTFPL) */ // This is a file you could modify if you are making your own skin. // See README.md // Add your own custom QSS at the end of this file // Import skin definitions @import 'Imports/Lite Definitions'; // OSX specific definitions $font-family: -apple-system, ".SF NS Text", "Helvetica Neue", "Lucida Grande"; $font-size-bigger: 16pt; $font-size-big: 15pt; $font-size-normal: 13pt; $font-size-medium: 12pt; $font-size-small: 11pt; $font-size-extra-small: 10pt; $font-size-qslider-groove: 6pt; $font-size-qslider-handle: 5pt; // Import base theme CSS @import 'Imports/Base Theme'; // OSX specific CSS QToolBar { background-color:transparent; border: 0px; spacing:0; } QToolButton:hover { background-color:transparent; } QToolButton:pressed { background-color:transparent; } QToolButton:on { background-color:transparent; } QToolButton:on:pressed { background-color:transparent; } // Add or import your own custom QSS belowmumble-1.3.4/themes/Mumble/priority_speaker.svg0000664000175000017500000000303614010707353021464 0ustar builderbuilder mumble-1.3.4/themes/Mumble/local_volume.svg0000664000175000017500000000444314010707353020555 0ustar builderbuilder mumble-1.3.4/themes/Mumble/overlay.mumblelay0000664000175000017500000000320014010707353020733 0ustar builderbuilder[overlay] version=1.3.0 alwaysself=false sort=1 y=@Variant(\0\0\0\x87>j\xbcl) states\1\color=@Variant(\0\0\0\x43\x1\xff\xff\xff\xff\x9e\x9e\x9e\x9e\0\0) states\3\color=@Variant(\0\0\0\x43\x1\xff\xff\xe2\xe2nn\xff\xff\0\0) states\4\color=@Variant(\0\0\0\x43\x1\xff\xfftt\x92\x92\xff\xff\0\0) userfont=@Variant(\0\0\0@\0\0\0\n\0\x41\0r\0i\0\x61\0l@<\0\0\0\0\0\0\xff\xff\xff\xff\x5\x1\0\x32\x10) channelfont=@Variant(\0\0\0@\0\0\0\"\0S\0\x65\0g\0o\0\x65\0 \0U\0I\0 \0S\0\x65\0m\0i\0\x62\0o\0l\0\x64@<\0\0\0\0\0\0\xff\xff\xff\xff\x5\x1\0K\x10) channelcolor=@Variant(\0\0\0\x43\x1\xff\xff\xff\xff\xff\xff\xff\xff\0\0) fpsfont=@Variant(\0\0\0@\0\0\0\n\0\x41\0r\0i\0\x61\0l@4\0\0\0\0\0\0\xff\xff\xff\xff\x5\x1\0\x32\x10) fpscolor=@Variant(\0\0\0\x43\x1\xff\xff\xf5\xf5\xf5\xf5\xf5\xf5\0\0) pencolor=@Variant(\0\0\0\x43\x1\x1\x1))\x8c\x8c\xe1\xe1\0\0) fillcolor=@Variant(\0\0\0\x43\x1\x1\x1\xe1\xe1\xe1\xe1\xe1\xe1\0\0) channelshow=true channelopacity=1 mutedopacity=1 userrect=@Variant(\0\0\0\x14\xbf\xd9{B^\xd0\x97\xb4\xbf\xaa\x12\xf6\x84\xbd\xa1\x30?\xd6^\xd0\x97\xb4%\xed?\xa5UUUUUV) channelrect=@Variant(\0\0\0\x14\xbf\xa9\xd6H\xf+\x9d\x65\xbf\xb2\xd8-\x82\xd8-\x83?\xb9\x99\x99\x99\x99\x99\x9a?\x92\xf6\x84\xbd\xa1/h) mutedrect=@Variant(\0\0\0\x14\xbf\xad\x64\x80\xf2\xb9\xd6H\xbf\xb2\"\"\"\"\"\"?\xa4%\xed\t{B_?\xa6\xc1l\x16\xc1l\x17) avatarrect=@Variant(\0\0\0\x14\xbf\xa3\x33\x33\x33\x33\x33\x33\xbf\xb0\0\0\0\0\0\0?\xb2\xb9\xd6H\xf+\x9e?\xb2\x9b\x7f\rF)\xb8) useralign=130 channelalign=132 states\2\color=@Variant(\0\0\0\x43\x1\xff\xff\xf0\xf0\xf0\xf0\xf0\xf0\0\0) padding=0 show=0 states\1\opacity=0.625 states\2\opacity=1 states\3\opacity=1 states\4\opacity=1 mumble-1.3.4/themes/Mumble/filter_off.svg0000664000175000017500000000540514010707353020212 0ustar builderbuilder mumble-1.3.4/themes/Mumble/muted_pushtomute.svg0000664000175000017500000000235114010707353021503 0ustar builderbuildermumble-1.3.4/themes/Mumble/muted_suppressed.svg0000664000175000017500000000266714010707353021475 0ustar builderbuilder mumble-1.3.4/themes/Mumble/OSX Dark.qss0000664000175000017500000004343414010707353017421 0ustar builderbuilder/* * Mumble Dark Theme for OSX * https://github.com/mumble-voip/mumble-theme * * Based on MetroMumble Theme by xPoke * https://github.com/xPoke * * Originally forked from Flat Mumble Theme by xPaw (xpaw.ru) * * Licensed under The Do What The Fuck You Want To Public License (WTFPL) */ /* * YOU SHOULD NOT MODIFY THIS FILE * Edit the files in the "source" folder instead. * See project README * */ ApplicationPalette { qproperty-window: #2e2e2e; qproperty-windowtext: #eee; qproperty-windowtext_disabled: #484848; qproperty-base: #191919; qproperty-alternatebase: #2d2d2d; qproperty-text: #d8d8d8; qproperty-text_disabled: #484848; qproperty-tooltipbase: #191919; qproperty-tooltiptext: #d8d8d8; qproperty-tooltiptext_disabled: #484848; qproperty-brighttext: #FFF; qproperty-brighttext_disabled: #484848; qproperty-highlight: #298ce1; qproperty-highlightedtext: #FFF; qproperty-highlightedtext_disabled: #484848; qproperty-button: #444; qproperty-buttontext: #d8d8d8; qproperty-buttontext_disabled: #484848; qproperty-link: #39a5dd; qproperty-linkvisited: #39a5dd; qproperty-light: #1c1c1c; qproperty-midlight: transparent; qproperty-mid: #1c1c1c; qproperty-dark: transparent; qproperty-shadow: #1c1c1c; } QObject, QObject::separator, QObject::handle, QObject::tab-bar, QObject::tab, QObject::section { font-family: -apple-system, ".SF NS Text", "Helvetica Neue", "Lucida Grande"; font-size: 13pt; margin: 0; padding: 0; outline: 0; border: 0; selection-background-color: #298ce1; selection-color: #FFF; alternate-background-color: transparent; color: #eee; border-radius: 2px; } QMainWindow, QDockWidget { background-color: #2e2e2e; } QDialog, QWizard *, QCalendarWidget *, #qswPages > QObject { background-color: #1D1D1D; color: #d8d8d8; } QObject:disabled, QObject::item:disabled { color: #484848; } a { color: #39a5dd; text-decoration: none; } QObject::separator { height: 4px; width: 4px; } QObject::separator:hover { background: #333; } DockTitleBar { font-size: 10pt; } QToolTip, QWhatsThis { font-size: 11pt; min-height: 1.3em; border: 1px solid #888; border-radius: 0; background-color: #191919; color: #d8d8d8; } QTextBrowser, QTextEdit { background-color: #191919; color: #d8d8d8; border: 1px solid #1c1c1c; } QToolBar { background-color: #2e2e2e; spacing: 0; padding: 2px; } QToolButton { border: 1px solid transparent; border-radius: 2px; padding: 1px; margin: 1px; } QToolButton:on { background-color: #444; border: 1px solid #444; } QToolButton:hover { background-color: #3e4f5e; border: 1px solid #3e4f5e; } QToolButton:pressed { background-color: #484848; } QToolBar::separator { background: #555; height: 1px; margin: 4px; width: 1px; } QToolBar::separator:hover { background: #555; border: 0; } QToolButton#qt_toolbar_ext_button { min-width: 8px; width: 8px; padding: 1px; qproperty-icon: url(skin:controls/toolbar_ext.svg); } QToolBar::handle:horizontal { image: url(skin:controls/handle_horizontal.svg); width: 8px; padding: 4px; } QToolBar::handle:vertical { image: url(skin:controls/handle_vertical.svg); height: 8px; padding: 4px; } QMenuBar::item { background-color: transparent; padding: 4px 12px; } QMenuBar::item:selected { background: #298ce1; color: #FFF; } QMenuBar::item:pressed { background: #1979ca; color: #FFF; } QMenu { background: #2b2b2b; border: 1px solid #1c1c1c; color: #d8d8d8; } QMenu::item { border: 1px solid transparent; color: #d8d8d8; padding: 5px 16px; padding-left: 25px; border-radius: 2px; } QMenu::item:selected { background: #3e4f5e; border: 1px solid #3e4f5e; } QMenu::item:disabled { border: 1px solid transparent; background: transparent; } QMenu::separator { background: #555; height: 1px; } QMenu::indicator { padding-top: 2px; height: 25px; width: 25px; } QPushButton { background-color: #444; border: 1px solid #444; color: #d8d8d8; font-size: 15pt; padding: 3px 20px; } QPushButton:focus { background-color: #3e4f5e; } QPushButton:hover { background-color: #595959; border-color: #555; } QPushButton:hover:focus { background-color: #485d6f; border-color: #485d6f; } QPushButton:focus { border-color: #3e4f5e; } QPushButton:pressed, QPushButton:pressed:focus { background-color: #298ce1; border-color: #298ce1; color: #FFF; } QGroupBox, #qwMacWarning, #qwInlineNotice { background-color: #2d2d2d; border: 1px solid #1c1c1c; color: #d8d8d8; font-size: 16pt; padding: 4px; padding-top: 1em; } QGroupBox::title { background-color: transparent; margin: 6px; margin-left: 8px; margin-right: 8px; } QListView { background-color: #191919; border: 1px solid #1c1c1c; } QListView::item { border-radius: 2px; border: 1px solid transparent; color: #d8d8d8; selection-color: #d8d8d8; padding: 2px 4px; } QListView::item:hover { background-color: #333; border: 1px solid #333; } QListView::item:selected { background-color: #3b3b3b; border: 1px solid #3b3b3b; } QListView::item:selected:active { background-color: #3e4f5e; border: 1px solid #3e4f5e; } QTreeView { background-color: #191919; color: #d8d8d8; selection-background-color: #191919; selection-color: #d8d8d8; border: 1px solid #1c1c1c; } QTreeView::item { min-width: 60px; border: 1px solid transparent; border-left: 0; border-right: 0; color: #d8d8d8; padding: 2px 4px; selection-color: #d8d8d8; border-radius: 0; } QTreeView::item:first, QTreeView::item:only-one { border-left: 1px solid transparent; border-top-left-radius: 2px; border-bottom-left-radius: 2px; } QTreeView::item:last, QTreeView::item:only-one { border-right: 1px solid transparent; border-top-right-radius: 2px; border-bottom-right-radius: 2px; } QTreeView::item:hover, QTreeView::item:focus { background-color: #333; border-color: #333; } QTreeView::item:selected { background-color: #3b3b3b; border: 1px solid #3b3b3b; border-right: 0; border-left: 0; } QTreeView::item:selected:first, QTreeView::item:selected:only-one { border-left: 1px solid #3b3b3b; } QTreeView::item:selected:last, QTreeView::item:selected:only-one { border-right: 1px solid #3b3b3b; } QTreeView::item:selected:active { background-color: #3e4f5e; border: 1px solid #3e4f5e; border-right: 0; border-left: 0; } QTreeView::item:selected:active:first, QTreeView::item:selected:active:only-one { border-left: 1px solid #3e4f5e; } QTreeView::item:selected:active:last, QTreeView::item:selected:active:only-one { border-right: 1px solid #3e4f5e; } QTreeView::branch { border-image: none; image: none; margin-left: 3px; margin-top: 1px; padding-left: 3px; } QTreeView::branch:has-children:closed { image: url(skin:controls/branch_closed.svg); } QTreeView::branch:has-children:open { image: url(skin:controls/branch_open.svg); } QHeaderView { border-bottom: 1px solid #1c1c1c; border-radius: 0; } QHeaderView::section { border: 0; background-color: #2d2d2d; color: #d8d8d8; padding: 4px; padding-left: 8px; padding-right: 20px; border-radius: 0; } QHeaderView::down-arrow, QHeaderView::up-arrow { margin: 1px; top: 1px; right: 5px; width: 14px; } QHeaderView::down-arrow { image: url(skin:controls/arrow_down.svg); } QHeaderView::up-arrow { image: url(skin:controls/arrow_up.svg); } QTabWidget::pane { background-color: #2d2d2d; border: 1px solid #1c1c1c; } QTabWidget::pane:top { margin-top: -1px; border-radius: 2px; border-top-left-radius: 0; } QTabWidget::pane:bottom { margin-bottom: -1px; border-radius: 2px; border-bottom-left-radius: 0; } QTabWidget::tab-bar { background-color: #1D1D1D; } QTabBar::tab { color: #ccc; background-color: #1e1e1e; padding: 6px 16px; border-radius: 0; border: 1px solid #1c1c1c; border-right: 0; } QTabBar::tab:last, QTabBar::tab:only-one { border-right: 1px solid #1c1c1c; } QTabBar::tab:hover { background-color: #3e4f5e; } QTabBar::tab:disabled { color: #484848; } QTabBar::tab:selected { color: #d8d8d8; background-color: #2d2d2d; } QTabBar::tab:top { border-bottom: 0; margin-bottom: 1px; } QTabBar::tab:bottom { border-top: 0; margin-top: 1px; } QTabBar::tab:top:selected { padding-bottom: 7px; margin-bottom: 0; } QTabBar::tab:bottom:selected { padding-top: 7px; margin-top: 0; } QTabBar::tab:top:first, QTabBar::tab:top:only-one { border-top-left-radius: 2px; } QTabBar::tab:top:last, QTabBar::tab:top:only-one { border-top-right-radius: 2px; } QTabBar::tab:bottom:first, QTabBar::tab:bottom:only-one { border-bottom-left-radius: 2px; } QTabBar::tab:bottom:last, QTabBar::tab:bottom:only-one { border-bottom-right-radius: 2px; } QScrollBar { border-radius: 0; font-size: 13pt; } QScrollBar:vertical { border-left: 1px solid #1c1c1c; width: 1em; } QScrollBar:horizontal { border-top: 1px solid #1c1c1c; height: 1em; } QScrollBar::handle { margin: -1px; background: #666; border: 1px solid #1c1c1c; } QScrollBar::handle:vertical { min-height: 10px; } QScrollBar::handle:horizontal { min-width: 10px; } QScrollBar::handle:hover { background: #888; } QScrollBar::left-arrow, QScrollBar::right-arrow, QScrollBar::up-arrow, QScrollBar::down-arrow, QScrollBar::sub-line, QScrollBar::add-line, QScrollBar::add-page, QScrollBar::sub-page { background: #2e2e2e; height: 0; width: 0; border-radius: 0; border: 0; } QAbstractScrollArea::corner { border-left: 1px solid #1c1c1c; border-top: 1px solid #1c1c1c; height: 0; width: 0; border-radius: 0; border-top: 1px solid #1c1c1c; border-left: 1px solid #1c1c1c; background: #191919; } QLineEdit, QComboBox, QSpinBox, QAbstractSpinBox { color: #d8d8d8; padding: 4px; min-height: 1em; } QComboBox, QSpinBox, QAbstractSpinBox { border: 1px solid #444; background-color: #444; } QLineEdit, QTextEdit, QPlainTextEdit, QSpinBox, QAbstractSpinBox, QComboBox:editable { border: 1px solid #2e2e2e; background-color: #191919; } QSpinBox, QAbstractSpinBox { min-width: 2.5em; padding-right: 10px; } QPushButton:disabled, QLineEdit:disabled, QTextEdit:disabled, QPlainTextEdit:disabled, QListWidget:disabled, QTreeWidget:disabled, QComboBox:disabled, QSpinBox:disabled, QAbstractSpinBox:disabled { border: 1px solid transparent; background-color: #282828; } QComboBox::drop-down, QAbstractSpinBox::drop-down, QSpinBox::drop-down, QDateTimeEdit::drop-down { background-color: #191919; border: 0; margin-left: 4px; margin-right: 12px; margin-top: 5px; } QComboBox::down-arrow, QDateTimeEdit::down-arrow { margin-top: -2px; image: url(skin:controls/arrow_down.svg); width: 14px; } QComboBox::down-arrow:disabled, QDateTimeEdit::down-arrow:disabled { image: url(skin:controls/arrow_down_disabled.svg); } QToolButton[popupMode="1"], QToolButton[popupMode="2"], QPushButton[popupMode="1"], QPushButton[popupMode="2"] { padding-right: 14px; } QToolButton::menu-arrow, QToolButton::menu-indicator, QPushButton::menu-arrow, QPushButton::menu-indicator { image: url(skin:controls/arrow_down.svg); subcontrol-origin: padding; subcontrol-position: center right; top: 2px; right: 2px; width: 14px; } QSpinBox::down-button, QAbstractSpinBox::down-button { padding-right: 4px; image: url(skin:controls/arrow_down.svg); width: 14px; padding-bottom: 1px; } QSpinBox::down-button:disabled, QAbstractSpinBox::down-button:disabled { image: url(skin:controls/arrow_down_disabled.svg); } QSpinBox::up-button, QAbstractSpinBox::up-button { padding-right: 4px; image: url(skin:controls/arrow_up.svg); width: 14px; padding-top: 1px; } QSpinBox::up-button:disabled, QAbstractSpinBox::up-button:disabled { image: url(skin:controls/arrow_up_disabled.svg); } QComboBox QAbstractItemView { background-color: #191919; border: 1px solid #1c1c1c; color: #d8d8d8; border-radius: 0; } QLabel, QCheckBox, QAbstractCheckBox, QTreeView::indicator, QRadioButton { color: #d8d8d8; background: transparent; } QCheckBox::indicator, QTreeView::indicator { background-color: #444; border: 1px solid #444; height: 13px; width: 13px; margin-top: 1px; } QMenu::indicator { width: 12px; left: 6px; } QCheckBox::indicator:checked, QMenu::indicator:checked, QTreeView::indicator:checked { image: url(skin:controls/checkbox_check_dark.svg); } QCheckBox::indicator:disabled, QTreeView::indicator:disabled { border: 1px solid #2d2d2d; background-color: #282828; } QCheckBox::indicator:checked:disabled, QTreeView::indicator:checked:disabled { border: 1px solid transparent; image: url(skin:controls/checkbox_check_disabled.svg); } QRadioButton::indicator { background: #444; border: 1px solid #444; border-radius: 7px; height: 12px; width: 12px; } QTreeView::indicator { background: #444; } QRadioButton::indicator:disabled { background-color: #282828; margin: 1px; border: 1px solid transparent; } QRadioButton::indicator:checked { image: url(skin:controls/radio_check_dark.svg); } QRadioButton::indicator:checked:disabled { image: url(skin:controls/radio_check_disabled.svg); } QSlider::groove { background: #393939; border: 1px solid #393939; border-radius: 2px; font-size: 6pt; } QSlider::groove:horizontal { height: 0.8em; } QSlider::groove:vertical { width: 0.8em; } QSlider::groove:disabled, QSlider::sub-page:disabled { background: #282828; border: 1px solid transparent; border-radius: 2px; } QSlider::sub-page { background: #486d8d; border: 1px solid #486d8d; border-radius: 2px; } QSlider::handle { background: #777; border: 1px solid #222; border-radius: 3px; font-size: 5pt; } QSlider::handle:horizontal { margin: -5px -1px; width: 4.5em; } QSlider::handle:vertical { margin: -1px -5px; height: 4.5em; } QSlider::handle:focus { background-color: #6d96ba; border-color: #226; } QSlider::handle:hover { background-color: #999; } QSlider::handle:pressed { background-color: #bbb; border-color: #222; } QSlider::handle:disabled { background-color: #282828; border: 1px solid #282828; } QCheckBox::indicator:focus, QTreeView::indicator:focus, QRadioButton::indicator:focus, QComboBox:focus { background-color: #3e4f5e; } QCheckBox::indicator:focus:hover, QTreeView::indicator:focus:hover, QRadioButton::indicator:focus:hover, QComboBox:focus:hover { background-color: #485d6f; border-color: #485d6f; } QCheckBox::indicator:hover, QTreeView::indicator:hover, QRadioButton::indicator:hover, QComboBox:hover { background-color: #595959; border-color: #555; } QLineEdit:focus, QSpinBox:focus, QAbstractSpinBox:focus, QComboBox:editable:focus { background-color: #191919; } QLineEdit:focus:hover, QSpinBox:focus:hover, QAbstractSpinBox:focus:hover, QComboBox:editable:focus:hover { border-color: #485d6f; } QLineEdit:hover, QSpinBox:hover, QAbstractSpinBox:hover, QComboBox:editable:hover { background-color: #191919; border-color: #555; } QCheckBox::indicator:focus, QTreeView::indicator:focus, QRadioButton::indicator:focus, QComboBox:focus, QLineEdit:focus, QTextEdit:focus, QPlainTextEdit:focus, QSpinBox:focus, QAbstractSpinBox:focus, QComboBox:editable:focus { border-color: #3e4f5e; } QFontDialog { min-width: 32em; min-height: 24em; } QColorDialog QColorLuminancePicker { background-color: transparent; } QMessageBox, QDialogButtonBox { dialogbuttonbox-buttons-have-icons: 0; } /* Mumble Specifics */ LogTextBrowser, #qdsChat { margin: 0 2px; min-height: 120px; min-width: 40px; border-color: #1c1c1c; } UserView { margin: 0 2px; min-height: 120px; min-width: 40px; } UserView::item { padding: 0; padding-top: -1px; } #qdwChat > QTextEdit { padding: -2px; margin: 0 2px; margin-bottom: 2px; font-size: 13pt; } #qtIconToolbar QComboBox { font-size: 11pt; } .log-time { background-color: transparent; color: #95a5a6; font-size: 12pt; } .log-server { background-color: transparent; color: #F9655D; font-weight: bold; } .log-channel { background-color: transparent; color: #e67e22; font-weight: bold; } .log-privilege { background-color: transparent; color: #c0392b; font-weight: bold; } .log-target { background-color: transparent; color: #27ae60; font-weight: bold; } .log-source { background-color: transparent; color: #27ae60; font-weight: bold; } QListView#qlwIcons { padding: 0; background-color: transparent; border: 0; font-size: 15pt; min-width: 165%; margin-left: 4px; margin-top: 12px; } QListView#qlwIcons::item { margin-bottom: 1px; padding: 5px 7px; } QListView#qlwIcons::item:hover { border-color: #333; background-color: #333; } QListView#qlwIcons::item:selected { background-color: #444; border: 1px solid #444; } QListView#qlwIcons::item:focus { background-color: #3e4f5e; border: 1px solid #3e4f5e; } QSlider { margin-left: 30px; margin-right: 30px; } #qswPages > * > * > QScrollBar { margin: 0; } #qswPages > * > QWidget { margin: 2px; } QListView::item QListWidgetItem, QListView::item QLineEdit, QTreeView::item QComboBox, QTreeView::item QLineEdit { background: #444; margin: 0; padding-top: 0; padding-bottom: 0; padding-left: 4px; padding-right: 4px; font-size: 12pt; } QListView::item QListWidgetItem:hover, QListView::item QLineEdit:hover, QTreeView::item QComboBox:hover, QTreeView::item QLineEdit:hover { background: #444; } AboutDialog > QTextBrowser, AboutDialog QTextEdit { border: 0; } #qtbToolBar { border: 1px solid transparent; background: transparent; } #BanEditor { min-width: 600px; } #GlobalShortcutTarget { min-height: 600px; } ViewCert { min-height: 600px; } QToolBar { background-color: transparent; border: 0px; spacing: 0; } QToolButton:hover { background-color: transparent; } QToolButton:pressed { background-color: transparent; } QToolButton:on { background-color: transparent; } QToolButton:on:pressed { background-color: transparent; } mumble-1.3.4/themes/Mumble/channel.svg0000664000175000017500000000063714010707353017505 0ustar builderbuilder mumble-1.3.4/themes/Mumble/layout_stacked.svg0000664000175000017500000000500614010707353021103 0ustar builderbuilder Chatbar Tree Log mumble-1.3.4/themes/Mumble/config_basic.png0000664000175000017500000000620214010707353020462 0ustar builderbuilderPNG  IHDRXtEXtSoftwareAdobe ImageReadyqe< $IDATxaR95T~d8AT?p- ' pL `MC;;!gHjER0ԯ[# Ac f>3?f 0ՏSv+g ׸PN׵n$9^N $xTQNg=fÞ> @'tY:ag!X;A/sx&RfLɄcKRuE$EO-ڻub^ea_uRI#qtr@K[]7'9SXBcAERLk\:*W7! =G=:Y5>솽G^22BP>EZ""8v#$tPhnqէe-'Ab{߸!wGo|M:3dե*JрK| d eD!)n_)ۘW c>Z" :f.}˹xB9IdK7 0'N>"/v~G>kA!|rH!AGzaB #А5%ŮRo;;xx0i.Б'%v{lYhls`I ߱ f \0g mHD s`I o f ]5[0!"װdЖyْTQqc7jé pkdl*v£0JM͈AK9~?h0$ Srj3"',H]bXCwVWr>9׏_QcOt`]+Zx-tf."qq 2qD \ڳQqcd 4:lDNWC<qt[g [#D%_ZȴibC Ixs)y^d5F١/Z1ٰARz&ll^bw+↩v|w઻ v{1; @z<{ Q<[Ȝnh̐s{sZW<pF;=,RT?:SI>xkH{2IwZHgw=Uw\r{ό>Zfb3G6&o Szt=(=x9):[YzAGSW(^iU+iM. n8қ, t:0PM.]C&E/,X8's(C$ڿ@)ZuI8 Gۏ-B :"˃skS!!U.Gɻq`\]zڭj1eƻ Ms|mԹ]"} 祒b߅ H^&[ ]D;Cn,R/&m-4Ys`I \pl@H-p@"j0XR"y]׃9[0!-Tb & 6] Zf=ZF5*O0xőK^X$ʹ!%& xCw@Kvfbw\ &Abw:l /!GBQHI#!n%d!yGA ^ xo܃CP 1䡪 3OU |MR Hx'j/?Ձ7,<⒕6^d>aoj6[}#Y՚[gjбVV" u{W Pqܲ2<^,*v– "` , m]z碐SnsO'#@*_8Sq,:lz uWM>#@B""Y;zAԫ EH8"hȗk$TFd&!W4qDHאC[d%j;QUQggD"zJC; XF:QVv%?flaGX9=!Ba*~%L{Af x? tc@34^x܌-KyQÌ bG 7t?<b:1gqa_E1fr+@HH1H*XŃ d 5aYzYŃF t'B,"|Bw##³Y<@ G>H^Ƴ=y);sw_ q ^ Wm҅4S r #P)TIENDB`mumble-1.3.4/themes/Mumble/Dark.qss0000664000175000017500000004277514010707353016776 0ustar builderbuilder/* * Mumble Dark Theme * https://github.com/mumble-voip/mumble-theme * * Based on MetroMumble Theme by xPoke * https://github.com/xPoke * * Originally forked from Flat Mumble Theme by xPaw (xpaw.ru) * * Licensed under The Do What The Fuck You Want To Public License (WTFPL) */ /* * YOU SHOULD NOT MODIFY THIS FILE * Edit the files in the "source" folder instead. * See project README * */ ApplicationPalette { qproperty-window: #2e2e2e; qproperty-windowtext: #eee; qproperty-windowtext_disabled: #484848; qproperty-base: #191919; qproperty-alternatebase: #2d2d2d; qproperty-text: #d8d8d8; qproperty-text_disabled: #484848; qproperty-tooltipbase: #191919; qproperty-tooltiptext: #d8d8d8; qproperty-tooltiptext_disabled: #484848; qproperty-brighttext: #FFF; qproperty-brighttext_disabled: #484848; qproperty-highlight: #298ce1; qproperty-highlightedtext: #FFF; qproperty-highlightedtext_disabled: #484848; qproperty-button: #444; qproperty-buttontext: #d8d8d8; qproperty-buttontext_disabled: #484848; qproperty-link: #39a5dd; qproperty-linkvisited: #39a5dd; qproperty-light: #1c1c1c; qproperty-midlight: transparent; qproperty-mid: #1c1c1c; qproperty-dark: transparent; qproperty-shadow: #1c1c1c; } QObject, QObject::separator, QObject::handle, QObject::tab-bar, QObject::tab, QObject::section { font-family: "Segoe UI", Frutiger, "Frutiger Linotype", "Dejavu Sans", "Helvetica Neue", Arial, sans-serif; font-size: 10pt; margin: 0; padding: 0; outline: 0; border: 0; selection-background-color: #298ce1; selection-color: #FFF; alternate-background-color: transparent; color: #eee; border-radius: 2px; } QMainWindow, QDockWidget { background-color: #2e2e2e; } QDialog, QWizard *, QCalendarWidget *, #qswPages > QObject { background-color: #1D1D1D; color: #d8d8d8; } QObject:disabled, QObject::item:disabled { color: #484848; } a { color: #39a5dd; text-decoration: none; } QObject::separator { height: 4px; width: 4px; } QObject::separator:hover { background: #333; } DockTitleBar { font-size: 7pt; } QToolTip, QWhatsThis { font-size: 8pt; min-height: 1.3em; border: 1px solid #888; border-radius: 0; background-color: #191919; color: #d8d8d8; } QTextBrowser, QTextEdit { background-color: #191919; color: #d8d8d8; border: 1px solid #1c1c1c; } QToolBar { background-color: #2e2e2e; spacing: 0; padding: 2px; } QToolButton { border: 1px solid transparent; border-radius: 2px; padding: 1px; margin: 1px; } QToolButton:on { background-color: #444; border: 1px solid #444; } QToolButton:hover { background-color: #3e4f5e; border: 1px solid #3e4f5e; } QToolButton:pressed { background-color: #484848; } QToolBar::separator { background: #555; height: 1px; margin: 4px; width: 1px; } QToolBar::separator:hover { background: #555; border: 0; } QToolButton#qt_toolbar_ext_button { min-width: 8px; width: 8px; padding: 1px; qproperty-icon: url(skin:controls/toolbar_ext.svg); } QToolBar::handle:horizontal { image: url(skin:controls/handle_horizontal.svg); width: 8px; padding: 4px; } QToolBar::handle:vertical { image: url(skin:controls/handle_vertical.svg); height: 8px; padding: 4px; } QMenuBar::item { background-color: transparent; padding: 4px 12px; } QMenuBar::item:selected { background: #298ce1; color: #FFF; } QMenuBar::item:pressed { background: #1979ca; color: #FFF; } QMenu { background: #2b2b2b; border: 1px solid #1c1c1c; color: #d8d8d8; } QMenu::item { border: 1px solid transparent; color: #d8d8d8; padding: 5px 16px; padding-left: 25px; border-radius: 2px; } QMenu::item:selected { background: #3e4f5e; border: 1px solid #3e4f5e; } QMenu::item:disabled { border: 1px solid transparent; background: transparent; } QMenu::separator { background: #555; height: 1px; } QMenu::indicator { padding-top: 2px; height: 25px; width: 25px; } QPushButton { background-color: #444; border: 1px solid #444; color: #d8d8d8; font-size: 12pt; padding: 3px 20px; } QPushButton:focus { background-color: #3e4f5e; } QPushButton:hover { background-color: #595959; border-color: #555; } QPushButton:hover:focus { background-color: #485d6f; border-color: #485d6f; } QPushButton:focus { border-color: #3e4f5e; } QPushButton:pressed, QPushButton:pressed:focus { background-color: #298ce1; border-color: #298ce1; color: #FFF; } QGroupBox, #qwMacWarning, #qwInlineNotice { background-color: #2d2d2d; border: 1px solid #1c1c1c; color: #d8d8d8; font-size: 13pt; padding: 4px; padding-top: 1em; } QGroupBox::title { background-color: transparent; margin: 6px; margin-left: 8px; margin-right: 8px; } QListView { background-color: #191919; border: 1px solid #1c1c1c; } QListView::item { border-radius: 2px; border: 1px solid transparent; color: #d8d8d8; selection-color: #d8d8d8; padding: 2px 4px; } QListView::item:hover { background-color: #333; border: 1px solid #333; } QListView::item:selected { background-color: #3b3b3b; border: 1px solid #3b3b3b; } QListView::item:selected:active { background-color: #3e4f5e; border: 1px solid #3e4f5e; } QTreeView { background-color: #191919; color: #d8d8d8; selection-background-color: #191919; selection-color: #d8d8d8; border: 1px solid #1c1c1c; } QTreeView::item { min-width: 60px; border: 1px solid transparent; border-left: 0; border-right: 0; color: #d8d8d8; padding: 2px 4px; selection-color: #d8d8d8; border-radius: 0; } QTreeView::item:first, QTreeView::item:only-one { border-left: 1px solid transparent; border-top-left-radius: 2px; border-bottom-left-radius: 2px; } QTreeView::item:last, QTreeView::item:only-one { border-right: 1px solid transparent; border-top-right-radius: 2px; border-bottom-right-radius: 2px; } QTreeView::item:hover, QTreeView::item:focus { background-color: #333; border-color: #333; } QTreeView::item:selected { background-color: #3b3b3b; border: 1px solid #3b3b3b; border-right: 0; border-left: 0; } QTreeView::item:selected:first, QTreeView::item:selected:only-one { border-left: 1px solid #3b3b3b; } QTreeView::item:selected:last, QTreeView::item:selected:only-one { border-right: 1px solid #3b3b3b; } QTreeView::item:selected:active { background-color: #3e4f5e; border: 1px solid #3e4f5e; border-right: 0; border-left: 0; } QTreeView::item:selected:active:first, QTreeView::item:selected:active:only-one { border-left: 1px solid #3e4f5e; } QTreeView::item:selected:active:last, QTreeView::item:selected:active:only-one { border-right: 1px solid #3e4f5e; } QTreeView::branch { border-image: none; image: none; margin-left: 3px; margin-top: 1px; padding-left: 3px; } QTreeView::branch:has-children:closed { image: url(skin:controls/branch_closed.svg); } QTreeView::branch:has-children:open { image: url(skin:controls/branch_open.svg); } QHeaderView { border-bottom: 1px solid #1c1c1c; border-radius: 0; } QHeaderView::section { border: 0; background-color: #2d2d2d; color: #d8d8d8; padding: 4px; padding-left: 8px; padding-right: 20px; border-radius: 0; } QHeaderView::down-arrow, QHeaderView::up-arrow { margin: 1px; top: 1px; right: 5px; width: 14px; } QHeaderView::down-arrow { image: url(skin:controls/arrow_down.svg); } QHeaderView::up-arrow { image: url(skin:controls/arrow_up.svg); } QTabWidget::pane { background-color: #2d2d2d; border: 1px solid #1c1c1c; } QTabWidget::pane:top { margin-top: -1px; border-radius: 2px; border-top-left-radius: 0; } QTabWidget::pane:bottom { margin-bottom: -1px; border-radius: 2px; border-bottom-left-radius: 0; } QTabWidget::tab-bar { background-color: #1D1D1D; } QTabBar::tab { color: #ccc; background-color: #1e1e1e; padding: 6px 16px; border-radius: 0; border: 1px solid #1c1c1c; border-right: 0; } QTabBar::tab:last, QTabBar::tab:only-one { border-right: 1px solid #1c1c1c; } QTabBar::tab:hover { background-color: #3e4f5e; } QTabBar::tab:disabled { color: #484848; } QTabBar::tab:selected { color: #d8d8d8; background-color: #2d2d2d; } QTabBar::tab:top { border-bottom: 0; margin-bottom: 1px; } QTabBar::tab:bottom { border-top: 0; margin-top: 1px; } QTabBar::tab:top:selected { padding-bottom: 7px; margin-bottom: 0; } QTabBar::tab:bottom:selected { padding-top: 7px; margin-top: 0; } QTabBar::tab:top:first, QTabBar::tab:top:only-one { border-top-left-radius: 2px; } QTabBar::tab:top:last, QTabBar::tab:top:only-one { border-top-right-radius: 2px; } QTabBar::tab:bottom:first, QTabBar::tab:bottom:only-one { border-bottom-left-radius: 2px; } QTabBar::tab:bottom:last, QTabBar::tab:bottom:only-one { border-bottom-right-radius: 2px; } QScrollBar { border-radius: 0; font-size: 10pt; } QScrollBar:vertical { border-left: 1px solid #1c1c1c; width: 1em; } QScrollBar:horizontal { border-top: 1px solid #1c1c1c; height: 1em; } QScrollBar::handle { margin: -1px; background: #666; border: 1px solid #1c1c1c; } QScrollBar::handle:vertical { min-height: 10px; } QScrollBar::handle:horizontal { min-width: 10px; } QScrollBar::handle:hover { background: #888; } QScrollBar::left-arrow, QScrollBar::right-arrow, QScrollBar::up-arrow, QScrollBar::down-arrow, QScrollBar::sub-line, QScrollBar::add-line, QScrollBar::add-page, QScrollBar::sub-page { background: #2e2e2e; height: 0; width: 0; border-radius: 0; border: 0; } QAbstractScrollArea::corner { border-left: 1px solid #1c1c1c; border-top: 1px solid #1c1c1c; height: 0; width: 0; border-radius: 0; border-top: 1px solid #1c1c1c; border-left: 1px solid #1c1c1c; background: #191919; } QLineEdit, QComboBox, QSpinBox, QAbstractSpinBox { color: #d8d8d8; padding: 4px; min-height: 1em; } QComboBox, QSpinBox, QAbstractSpinBox { border: 1px solid #444; background-color: #444; } QLineEdit, QTextEdit, QPlainTextEdit, QSpinBox, QAbstractSpinBox, QComboBox:editable { border: 1px solid #2e2e2e; background-color: #191919; } QSpinBox, QAbstractSpinBox { min-width: 2.5em; padding-right: 10px; } QPushButton:disabled, QLineEdit:disabled, QTextEdit:disabled, QPlainTextEdit:disabled, QListWidget:disabled, QTreeWidget:disabled, QComboBox:disabled, QSpinBox:disabled, QAbstractSpinBox:disabled { border: 1px solid transparent; background-color: #282828; } QComboBox::drop-down, QAbstractSpinBox::drop-down, QSpinBox::drop-down, QDateTimeEdit::drop-down { background-color: #191919; border: 0; margin-left: 4px; margin-right: 12px; margin-top: 5px; } QComboBox::down-arrow, QDateTimeEdit::down-arrow { margin-top: -2px; image: url(skin:controls/arrow_down.svg); width: 14px; } QComboBox::down-arrow:disabled, QDateTimeEdit::down-arrow:disabled { image: url(skin:controls/arrow_down_disabled.svg); } QToolButton[popupMode="1"], QToolButton[popupMode="2"], QPushButton[popupMode="1"], QPushButton[popupMode="2"] { padding-right: 14px; } QToolButton::menu-arrow, QToolButton::menu-indicator, QPushButton::menu-arrow, QPushButton::menu-indicator { image: url(skin:controls/arrow_down.svg); subcontrol-origin: padding; subcontrol-position: center right; top: 2px; right: 2px; width: 14px; } QSpinBox::down-button, QAbstractSpinBox::down-button { padding-right: 4px; image: url(skin:controls/arrow_down.svg); width: 14px; padding-bottom: 1px; } QSpinBox::down-button:disabled, QAbstractSpinBox::down-button:disabled { image: url(skin:controls/arrow_down_disabled.svg); } QSpinBox::up-button, QAbstractSpinBox::up-button { padding-right: 4px; image: url(skin:controls/arrow_up.svg); width: 14px; padding-top: 1px; } QSpinBox::up-button:disabled, QAbstractSpinBox::up-button:disabled { image: url(skin:controls/arrow_up_disabled.svg); } QComboBox QAbstractItemView { background-color: #191919; border: 1px solid #1c1c1c; color: #d8d8d8; border-radius: 0; } QLabel, QCheckBox, QAbstractCheckBox, QTreeView::indicator, QRadioButton { color: #d8d8d8; background: transparent; } QCheckBox::indicator, QTreeView::indicator { background-color: #444; border: 1px solid #444; height: 13px; width: 13px; margin-top: 1px; } QMenu::indicator { width: 12px; left: 6px; } QCheckBox::indicator:checked, QMenu::indicator:checked, QTreeView::indicator:checked { image: url(skin:controls/checkbox_check_dark.svg); } QCheckBox::indicator:disabled, QTreeView::indicator:disabled { border: 1px solid #2d2d2d; background-color: #282828; } QCheckBox::indicator:checked:disabled, QTreeView::indicator:checked:disabled { border: 1px solid transparent; image: url(skin:controls/checkbox_check_disabled.svg); } QRadioButton::indicator { background: #444; border: 1px solid #444; border-radius: 7px; height: 12px; width: 12px; } QTreeView::indicator { background: #444; } QRadioButton::indicator:disabled { background-color: #282828; margin: 1px; border: 1px solid transparent; } QRadioButton::indicator:checked { image: url(skin:controls/radio_check_dark.svg); } QRadioButton::indicator:checked:disabled { image: url(skin:controls/radio_check_disabled.svg); } QSlider::groove { background: #393939; border: 1px solid #393939; border-radius: 2px; font-size: 3pt; } QSlider::groove:horizontal { height: 0.8em; } QSlider::groove:vertical { width: 0.8em; } QSlider::groove:disabled, QSlider::sub-page:disabled { background: #282828; border: 1px solid transparent; border-radius: 2px; } QSlider::sub-page { background: #486d8d; border: 1px solid #486d8d; border-radius: 2px; } QSlider::handle { background: #777; border: 1px solid #222; border-radius: 3px; font-size: 4pt; } QSlider::handle:horizontal { margin: -5px -1px; width: 4.5em; } QSlider::handle:vertical { margin: -1px -5px; height: 4.5em; } QSlider::handle:focus { background-color: #6d96ba; border-color: #226; } QSlider::handle:hover { background-color: #999; } QSlider::handle:pressed { background-color: #bbb; border-color: #222; } QSlider::handle:disabled { background-color: #282828; border: 1px solid #282828; } QCheckBox::indicator:focus, QTreeView::indicator:focus, QRadioButton::indicator:focus, QComboBox:focus { background-color: #3e4f5e; } QCheckBox::indicator:focus:hover, QTreeView::indicator:focus:hover, QRadioButton::indicator:focus:hover, QComboBox:focus:hover { background-color: #485d6f; border-color: #485d6f; } QCheckBox::indicator:hover, QTreeView::indicator:hover, QRadioButton::indicator:hover, QComboBox:hover { background-color: #595959; border-color: #555; } QLineEdit:focus, QSpinBox:focus, QAbstractSpinBox:focus, QComboBox:editable:focus { background-color: #191919; } QLineEdit:focus:hover, QSpinBox:focus:hover, QAbstractSpinBox:focus:hover, QComboBox:editable:focus:hover { border-color: #485d6f; } QLineEdit:hover, QSpinBox:hover, QAbstractSpinBox:hover, QComboBox:editable:hover { background-color: #191919; border-color: #555; } QCheckBox::indicator:focus, QTreeView::indicator:focus, QRadioButton::indicator:focus, QComboBox:focus, QLineEdit:focus, QTextEdit:focus, QPlainTextEdit:focus, QSpinBox:focus, QAbstractSpinBox:focus, QComboBox:editable:focus { border-color: #3e4f5e; } QFontDialog { min-width: 32em; min-height: 24em; } QColorDialog QColorLuminancePicker { background-color: transparent; } QMessageBox, QDialogButtonBox { dialogbuttonbox-buttons-have-icons: 0; } /* Mumble Specifics */ LogTextBrowser, #qdsChat { margin: 0 2px; min-height: 120px; min-width: 40px; border-color: #1c1c1c; } UserView { margin: 0 2px; min-height: 120px; min-width: 40px; } UserView::item { padding: 0; padding-top: -1px; } #qdwChat > QTextEdit { padding: -2px; margin: 0 2px; margin-bottom: 2px; font-size: 10pt; } #qtIconToolbar QComboBox { font-size: 8pt; } .log-time { background-color: transparent; color: #95a5a6; font-size: 9pt; } .log-server { background-color: transparent; color: #F9655D; font-weight: bold; } .log-channel { background-color: transparent; color: #e67e22; font-weight: bold; } .log-privilege { background-color: transparent; color: #c0392b; font-weight: bold; } .log-target { background-color: transparent; color: #27ae60; font-weight: bold; } .log-source { background-color: transparent; color: #27ae60; font-weight: bold; } QListView#qlwIcons { padding: 0; background-color: transparent; border: 0; font-size: 12pt; min-width: 165%; margin-left: 4px; margin-top: 12px; } QListView#qlwIcons::item { margin-bottom: 1px; padding: 5px 7px; } QListView#qlwIcons::item:hover { border-color: #333; background-color: #333; } QListView#qlwIcons::item:selected { background-color: #444; border: 1px solid #444; } QListView#qlwIcons::item:focus { background-color: #3e4f5e; border: 1px solid #3e4f5e; } QSlider { margin-left: 30px; margin-right: 30px; } #qswPages > * > * > QScrollBar { margin: 0; } #qswPages > * > QWidget { margin: 2px; } QListView::item QListWidgetItem, QListView::item QLineEdit, QTreeView::item QComboBox, QTreeView::item QLineEdit { background: #444; margin: 0; padding-top: 0; padding-bottom: 0; padding-left: 4px; padding-right: 4px; font-size: 9pt; } QListView::item QListWidgetItem:hover, QListView::item QLineEdit:hover, QTreeView::item QComboBox:hover, QTreeView::item QLineEdit:hover { background: #444; } AboutDialog > QTextBrowser, AboutDialog QTextEdit { border: 0; } #qtbToolBar { border: 1px solid transparent; background: transparent; } #BanEditor { min-width: 600px; } #GlobalShortcutTarget { min-height: 600px; } ViewCert { min-height: 600px; } mumble-1.3.4/themes/Mumble/theme.ini0000664000175000017500000000021314010707353017145 0ustar builderbuilder[theme] name=Mumble styles=dark,lite [dark] name=Dark qss=Dark.qss qss_MAC=OSX Dark.qss [lite] name=Lite qss=Lite.qss qss_MAC=OSX Lite.qss mumble-1.3.4/themes/ClassicTheme.qrc0000664000175000017500000001003714010707274017203 0ustar builderbuilder Classic/Classic.qss Classic/authenticated.svg Classic/channel.svg Classic/channel_active.svg Classic/channel_linked.svg Classic/comment.svg Classic/comment_seen.svg Classic/config_asio.png Classic/config_audio_input.png Classic/config_audio_output.png Classic/config_basic.png Classic/config_lcd.png Classic/config_msgs.png Classic/config_network.png Classic/config_osd.png Classic/config_plugin.png Classic/config_shortcuts.png Classic/config_ui.png Classic/deafened_self.svg Classic/deafened_server.svg Classic/default_avatar.svg Classic/filter.svg Classic/filter_off.svg Classic/filter_on.svg Classic/Information_icon.svg Classic/layout_classic.svg Classic/layout_custom.svg Classic/layout_hybrid.svg Classic/layout_stacked.svg Classic/muted_local.svg Classic/muted_self.svg Classic/muted_server.svg Classic/muted_suppressed.svg Classic/muted_pushtomute.svg Classic/priority_speaker.svg Classic/self_comment.svg Classic/self_undeafened.svg Classic/talking_alt.svg Classic/talking_off.svg Classic/talking_on.svg Classic/talking_whisper.svg Classic/theme.ini Classic/tango/actions/audio-input-microphone-muted.svg Classic/tango/actions/audio-input-microphone.svg Classic/tango/actions/format-text-bold.svg Classic/tango/actions/format-text-italic.svg Classic/tango/actions/format-text-underline.svg Classic/tango/actions/media-record.svg Classic/tango/categories/applications-internet.svg Classic/tango/places/network-workgroup.svg Classic/tango/emblems/emblem-favorite.svg Classic/tango/mimetypes/image-x-generic.svg Classic/tango/mimetypes/text-html.svg Classic/tango/status/text-missing.svg mumble-1.3.4/g15helper/0000775000175000017500000000000014010707273014435 5ustar builderbuildermumble-1.3.4/g15helper/g15helper.rc0000664000175000017500000000254614010707273016566 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #include IDI_ICON1 ICON DISCARDABLE "../icons/g15helper.ico" #ifndef DEBUG #define VER_DEBUG 0L #else #define VER_DEBUG VS_FF_DEBUG #endif #ifdef SNAPSHOT_BUILD #define VER_RELEASE VS_FF_SPECIALBUILD|VS_FF_PRERELEASE #else #define VER_RELEASE 0L #endif VS_VERSION_INFO VERSIONINFO FILEVERSION 1,3,4,0 PRODUCTVERSION 1,3,4,0 FILEFLAGSMASK VS_FFI_FILEFLAGSMASK FILEFLAGS (VER_DEBUG|VER_RELEASE) FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_APP FILESUBTYPE 0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904E4" BEGIN VALUE "CompanyName", "The Mumble Developers" VALUE "FileDescription", "Mumble G15 LCD Helper" VALUE "FileVersion", "1.3.4" VALUE "ProductVersion", "1.3.4" VALUE "LegalCopyright", "Copyright (c) 2005-2021 The Mumble Developers" VALUE "OriginalFilename", "mumble-g15-helper.exe" VALUE "ProductName", "Mumble G15 LCD Helper" #ifdef SNAPSHOT_BUILD VALUE "SpecialBuild", "Snapshot development release" #endif END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1252 END END mumble-1.3.4/g15helper/g15helper.pro0000664000175000017500000000541314010707273016756 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . # Build rules for G15 helper daemon win32:!CONFIG(g15-emulator) { CONFIG += force-x86-toolchain } include (../qmake/compiler.pri) TEMPLATE = app CONFIG *= debug_and_release warn_on TARGET = mumble-g15-helper HEADERS = g15helper.h # The g15helper utility can be built in two modes: # # - Native. This is what will be built if you're # on Windows or macOS by default. # # - Emulator. This can be enabled by using the # CONFIG(g15-emulator) when invoking qmake. # Instead of building a g15helper that talks # to the G15 LCD using the Logitech provided # library, we build a small program that # emulates the LCD display in an on-screen # window. This is useful for debugging # Mumble's LCD/G15 support. CONFIG(g15-emulator) { QT *= core gui isEqual(QT_MAJOR_VERSION, 5) { QT *= widgets } SOURCES *= g15helper_emu.cpp HEADERS *= g15helper_emu.h win32 { RC_FILE = g15helper.rc win32-msvc* { QMAKE_POST_LINK = $$QMAKE_POST_LINK$$escape_expand(\\n\\t)$$quote(mt.exe -nologo -updateresource:$(DESTDIR_TARGET);1 -manifest ../src/mumble/mumble.appcompat.manifest) } } } else { CONFIG -= qt win32 { SOURCES = g15helper.c RC_FILE = g15helper.rc LIBS *= -llgLcd -ladvapi32 -lshell32 -luser32 QMAKE_LIBDIR *= "$$G15SDK_PATH/Lib/x86" INCLUDEPATH *= "$$G15SDK_PATH/Src" DEFINES *= WIN32 win32-msvc* { QMAKE_POST_LINK = $$QMAKE_POST_LINK$$escape_expand(\\n\\t)$$quote(mt.exe -nologo -updateresource:$(DESTDIR_TARGET);1 -manifest ../src/mumble/mumble.appcompat.manifest) } CONFIG(release, debug|release) { QMAKE_CFLAGS_RELEASE -= -MD QMAKE_CFLAGS_RELEASE *= -MT QMAKE_CXXFLAGS_RELEASE -= -MD QMAKE_CXXFLAGS_RELEASE *= -MT } CONFIG(debug, debug|release) { QMAKE_CFLAGS_DEBUG -= -MDd QMAKE_CFLAGS_DEBUG *= -MTd QMAKE_CXXFLAGS_DEBUG -= -MDd QMAKE_CXXFLAGS_DEBUG *= -MTd } } macx { CONFIG -= app_bundle isEqual(QT_MAJOR_VERSION, 5) { QMAKE_CFLAGS += -arch i386 QMAKE_OBJECTIVE_CFLAGS += -arch i386 QMAKE_CXXFLAGS += -arch i386 QMAKE_LFLAGS += -arch i386 } else { CONFIG -= x86_64 CONFIG += x86 } SOURCES = g15helper_macx.c LIBS *= -llgLcd QMAKE_LIBDIR *= $$(MUMBLE_PREFIX)/../LCDSDK/lib/ INCLUDEPATH *= $$(MUMBLE_PREFIX)/../LCDSDK/Src/ QMAKE_LFLAGS += -framework CoreFoundation -sectcreate __TEXT __info_plist g15helper.plist DEFINES *= APPLE } } CONFIG(debug, debug|release) { DEFINES *= USE_LOGFILE } include(../qmake/symbols.pri) mumble-1.3.4/g15helper/g15helper.h0000664000175000017500000000155314010707273016406 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_G15_HELPER_H_ #define MUMBLE_G15_HELPER_H_ #define G15_MAX_DEV 5 #define G15_MAX_WIDTH 160 #define G15_MAX_HEIGHT 43 #define G15_MAX_BPP 1 #define G15_MAX_FBMEM (G15_MAX_WIDTH * G15_MAX_HEIGHT * G15_MAX_BPP) #define G15_MAX_FBMEM_BITS (G15_MAX_FBMEM / 8) #if defined(WIN32) #define G15_WIDGET_NAME L"Mumble G15 Display" #elif defined(APPLE) #define G15_WIDGET_NAME CFSTR("Mumble G15 Display") #endif enum { G15_ERR_INIT = 1, G15_ERR_CONNECT, G15_ERR_ENUMERATE, G15_ERR_OPEN, G15_ERR_READFILE, G15_ERR_CLOSE, G15_ERR_DISCONNECT, G15_ERR_DEINIT, }; #endif mumble-1.3.4/g15helper/g15helper_macx.c0000664000175000017500000000747214010707273017417 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . /* * G15 Helper Daemon for Mac OS X. */ #include #include #include #include #include "g15helper.h" #include "lglcd.h" #define ERROR_SUCCESS 0 #define BOOL unsigned char #define BYTE unsigned char #define TRUE 1 #define FALSE 0 static void ods(const char *fmt, va_list args) { vfprintf(stderr, fmt, args); } static void warn(const char *fmt, ...) { va_list args; va_start(args, fmt); ods(fmt, args); va_end(args); } static void die(int err, const char *fmt, ...) { va_list args; va_start(args, fmt); ods(fmt, args); va_end(args); exit(err); } int main(int argc, char *argv[]) { int dwErr; BOOL bDetect = FALSE; int i; lgLcdConnectContextEx conn; lgLcdOpenByTypeContext ctx; lgLcdBitmap160x43x1 bitmap; if (argc > 1 && (strcmp(argv[1], "/detect") == 0)) { warn("Detect mode!"); bDetect = TRUE; } else if (!(argc > 1) || (strcmp(argv[1], "/mumble") != 0)) { CFUserNotificationDisplayAlert(0, 0, NULL, NULL, NULL, CFSTR("Nothing to see here"), CFSTR("This program is run by Mumble, and should not be started separately."), CFSTR("OK"), NULL, NULL, NULL); return 0; } /* * Clear and set up initial structures. */ memset(&conn, 0, sizeof(conn)); memset(&ctx, 0, sizeof(ctx)); memset(&bitmap, 0, sizeof(bitmap)); conn.appFriendlyName = G15_WIDGET_NAME; conn.isAutostartable = FALSE; conn.isPersistent = FALSE; conn.dwAppletCapabilitiesSupported =LGLCD_APPLET_CAP_BASIC | LGLCD_APPLET_CAP_BW; conn.connection = LGLCD_INVALID_CONNECTION; /* * Initialize and connect. */ dwErr = lgLcdInit(); if (dwErr != ERROR_SUCCESS) die(G15_ERR_INIT, "Unable to initialize Logitech LCD library. (Error: %i)", dwErr); dwErr = lgLcdConnectEx(&conn); if (dwErr != ERROR_SUCCESS) die(G15_ERR_CONNECT, "Unable to connect to Logitech LCD manager. (Error: %i)", dwErr); ctx.connection = conn.connection; ctx.device = LGLCD_INVALID_DEVICE; ctx.deviceType =LGLCD_DEVICE_BW; dwErr = lgLcdOpenByType(&ctx); warn("That returned %d %d", dwErr, ERROR_SUCCESS); if (bDetect) return (dwErr != ERROR_SUCCESS); else if (dwErr != ERROR_SUCCESS) die(G15_ERR_OPEN, "Unable to open device. (Error: %i)", dwErr); /* * Diplay buffer format. */ bitmap.hdr.Format = LGLCD_BMP_FORMAT_160x43x1; /* * Main drawing loop. */ while (1) { int ret; int remain = 0; BYTE bPriority; ret = read(0, &bPriority, 1); if (ret == -1 || ret != 1) die(G15_ERR_READFILE, "Error while reading priority."); do { ret = read(0, bitmap.pixels + remain, G15_MAX_FBMEM - remain); if (ret < 1) die(G15_ERR_READFILE, "Error while reading framebuffer. %d (%s)", ret, strerror(errno)); remain += ret; } while (remain < G15_MAX_FBMEM); dwErr = lgLcdUpdateBitmap(ctx.device, (const lgLcdBitmapHeader *) &bitmap, bPriority ? LGLCD_SYNC_UPDATE(LGLCD_PRIORITY_ALERT) : LGLCD_SYNC_UPDATE(LGLCD_PRIORITY_NORMAL)); if (dwErr != ERROR_SUCCESS) warn("Unable to update bitmap for device #%i successfully. (Error: %i)", i, dwErr); } /* * Close device connections. */ dwErr = lgLcdClose(ctx.device); if (dwErr != ERROR_SUCCESS) die(G15_ERR_CLOSE, "Unable to close LCD device. (Error: %i)", dwErr); /* * Disconnect from LCD monitor. */ dwErr = lgLcdDisconnect(conn.connection); if (dwErr != ERROR_SUCCESS) die(G15_ERR_DISCONNECT, "Unable to disconnect from LCD manager. (Error: %i)", dwErr); /* * Deinitialize G15 library. */ dwErr = lgLcdDeInit(); if (dwErr != ERROR_SUCCESS) die(G15_ERR_DEINIT, "Unable to deinitialize LCD library. (Error: %i)", dwErr); warn("Terminated successfully."); return 0; } mumble-1.3.4/g15helper/g15helper.c0000664000175000017500000001073014010707273016376 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . /* * G15 Helper Daemon for Win32. */ #include #include #include #include #include #include "g15helper.h" #include "lglcd.h" static void __cdecl ods(const char *fmt, va_list args) { char buffer[2048]; _vsnprintf_s(buffer, 2048, _TRUNCATE, fmt, args); OutputDebugStringA(buffer); } static void __cdecl warn(const char *fmt, ...) { va_list args; va_start(args, fmt); ods(fmt, args); va_end(args); } static void __cdecl die(int err, const char *fmt, ...) { va_list args; va_start(args, fmt); ods(fmt, args); va_end(args); exit(err); } int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { DWORD dwErr; BOOL bErr; BOOL bDetect = FALSE; HANDLE hStdin, hStdout; lgLcdConnectContextEx conn; lgLcdOpenByTypeContext ctx; lgLcdBitmap160x43x1 bitmap; warn("Args: %s", lpCmdLine); if (lpCmdLine && (strcmp(lpCmdLine, "/detect") == 0)) { warn("Detect mode!"); bDetect = TRUE; } else if (! lpCmdLine || (strcmp(lpCmdLine, "/mumble") != 0)) { MessageBox(NULL, L"This program is run by Mumble, and should not be started separately.", L"Nothing to see here, move along", MB_OK | MB_ICONERROR); return 0; } hStdin = GetStdHandle(STD_INPUT_HANDLE); if (hStdin == INVALID_HANDLE_VALUE) die(G15_ERR_INIT, "Failed to get standard input"); hStdout = GetStdHandle(STD_OUTPUT_HANDLE); if (hStdout == INVALID_HANDLE_VALUE) die(G15_ERR_INIT, "Failed to get standard output"); /* * Clear and set up initial structures. */ ZeroMemory(&conn, sizeof(conn)); ZeroMemory(&ctx, sizeof(ctx)); ZeroMemory(&bitmap, sizeof(bitmap)); conn.appFriendlyName = G15_WIDGET_NAME; conn.isAutostartable = FALSE; conn.isPersistent = FALSE; conn.dwAppletCapabilitiesSupported =LGLCD_APPLET_CAP_BASIC | LGLCD_APPLET_CAP_BW; conn.connection = LGLCD_INVALID_CONNECTION; /* * Initialize and connect. */ dwErr = lgLcdInit(); if (dwErr != ERROR_SUCCESS) die(G15_ERR_INIT, "Unable to initialize Logitech LCD library. (Error: %i)", dwErr); dwErr = lgLcdConnectEx(&conn); if (dwErr != ERROR_SUCCESS) die(G15_ERR_CONNECT, "Unable to connect to Logitech LCD manager. (Error: %i)", dwErr); ctx.connection = conn.connection; ctx.device = LGLCD_INVALID_DEVICE; ctx.deviceType =LGLCD_DEVICE_BW; dwErr = lgLcdOpenByType(&ctx); warn("That returned %d %d", dwErr, ERROR_SUCCESS); if (bDetect) return (dwErr != ERROR_SUCCESS); else if (dwErr != ERROR_SUCCESS) die(G15_ERR_OPEN, "Unable to open device. (Error: %i)", dwErr); /* * Diplay buffer format. */ bitmap.hdr.Format = LGLCD_BMP_FORMAT_160x43x1; /* * Main drawing loop. */ while (1) { DWORD dwRead; DWORD dwTotRead = 0; BYTE bPriority; dwErr = WaitForSingleObject(hStdin, 2000); if (dwErr != WAIT_OBJECT_0) { die(0, "Unable to wait for object."); } bErr = ReadFile(hStdin, &bPriority, 1, &dwRead, NULL); if ((bErr == FALSE) || (dwRead != 1)) die(G15_ERR_READFILE, "Error while reading priority."); do { dwErr = WaitForSingleObject(hStdin, 2000); if (dwErr != WAIT_OBJECT_0) { die(0, "Unable to wait for object."); } bErr = ReadFile(hStdin, bitmap.pixels + dwTotRead, G15_MAX_FBMEM - dwTotRead, &dwRead, NULL); if (bErr == FALSE || dwRead == 0) die(G15_ERR_READFILE, "Error while reading framebuffer. %d %x",dwRead,GetLastError()); dwTotRead += dwRead; } while (dwTotRead < G15_MAX_FBMEM); dwErr = lgLcdUpdateBitmap(ctx.device, (const lgLcdBitmapHeader *) &bitmap, bPriority ? LGLCD_SYNC_UPDATE(LGLCD_PRIORITY_ALERT) : LGLCD_SYNC_UPDATE(LGLCD_PRIORITY_NORMAL)); if (dwErr != ERROR_SUCCESS) warn("Unable to update bitmap for device. (Error: %i)", dwErr); } /* * Close device connections. */ dwErr = lgLcdClose(ctx.device); if (dwErr != ERROR_SUCCESS) die(G15_ERR_CLOSE, "Unable to close LCD device. (Error: %i)", dwErr); /* * Disconnect from LCD monitor. */ dwErr = lgLcdDisconnect(conn.connection); if (dwErr != ERROR_SUCCESS) die(G15_ERR_DISCONNECT, "Unable to disconnect from LCD manager. (Error: %i)", dwErr); /* * Deinitialize G15 library. */ dwErr = lgLcdDeInit(); if (dwErr != ERROR_SUCCESS) die(G15_ERR_DEINIT, "Unable to deinitialize LCD library. (Error: %i)", dwErr); warn("Terminated successfully."); return 0; } mumble-1.3.4/g15helper/g15helper.plist0000664000175000017500000000133314010707273017306 0ustar builderbuilder CFBundleExecutable mumble-g15-helper CFBundleGetInfoString Mumble helper daemon for interfacing with G15 and compatible keyboards. CFBundleIdentifier net.sourceforge.mumble.g15helper CFBundlePackageType APPL CFBundleSignature G15H CFBundleVersion 1.3.4 NSHumanReadableCopyright Copyright (c) 2005-2021 The Mumble Developers mumble-1.3.4/g15helper/g15helper_emu.h0000664000175000017500000000132314010707273017247 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_G15_HELPER_EMU_H_ #define MUMBLE_G15_HELPER_EMU_H_ #include #include #include #include class G15Reader : public QThread { Q_OBJECT public: G15Reader(); ~G15Reader(); void run() Q_DECL_OVERRIDE; bool m_isRunning; signals: void readFrame(QPixmap p); }; class G15Emulator : public QMainWindow { Q_OBJECT public: QLabel *m_displayLabel; G15Emulator(); public slots: void drawFrame(QPixmap p); }; #endif mumble-1.3.4/g15helper/g15helper_emu.cpp0000664000175000017500000000554714010707273017616 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . /* * G15 Helper Emulator */ #include #include #include #include "g15helper.h" #include "g15helper_emu.h" #if defined(Q_OS_WIN) # include # include #endif G15Reader::G15Reader() : QThread() { moveToThread(this); m_isRunning = true; } G15Reader::~G15Reader() { m_isRunning = false; } void G15Reader::run() { #if defined(Q_OS_WIN) _setmode(_fileno(stdin), O_BINARY); #endif quint8 buf[G15_MAX_FBMEM]; QImage img(QSize(G15_MAX_WIDTH, G15_MAX_HEIGHT), QImage::Format_RGB32); while (m_isRunning) { quint8 priority = 0; size_t nread = 0; size_t ntotal = 0; memset(&buf, 0, G15_MAX_FBMEM); nread = fread(&priority, 1, sizeof(priority), stdin); if (nread <= 0) { qFatal("g15helper_emu: unable to read stdin, retval %lli", static_cast(nread)); } // The priority flag is not used by the emulator. Q_UNUSED(priority); do { nread = fread(&buf[0] + ntotal, 1, G15_MAX_FBMEM - ntotal, stdin); if (nread <= 0) { qFatal("g15helper_emu: unable to read stdin, retval %lli", static_cast(nread)); } ntotal += nread; } while (ntotal < G15_MAX_FBMEM); for (int w = 0; w < G15_MAX_WIDTH; w++) { for (int h = 0; h < G15_MAX_HEIGHT; h++) { quint8 color = buf[G15_MAX_WIDTH * h + w]; uint val = 0xff000000; if (color == 0xff) { val = 0xffffffff; } img.setPixel(w, h, val); } } QPixmap p = QPixmap::fromImage(img); emit readFrame(p); } } G15Emulator::G15Emulator() : QMainWindow() { setWindowTitle(QLatin1String("Mumble G15 Emulator")); setStyleSheet("QMainWindow {background: #cacaca;}"); m_displayLabel = new QLabel(this); m_displayLabel->setMinimumSize(QSize(G15_MAX_WIDTH, G15_MAX_HEIGHT)); setCentralWidget(m_displayLabel); } void G15Emulator::drawFrame(QPixmap p) { m_displayLabel->setPixmap(p); } int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { Q_UNUSED(hInstance); Q_UNUSED(hPrevInstance); Q_UNUSED(nCmdShow); if (lpCmdLine && (strcmp(lpCmdLine, "/detect") == 0)) { return 0; } else if (! lpCmdLine || (strcmp(lpCmdLine, "/mumble") != 0)) { MessageBox(NULL, L"This program is run by Mumble, and should not be started separately.", L"Nothing to see here, move along", MB_OK | MB_ICONERROR); return 0; } char *argvec[1]; argvec[0] = NULL; int argc = 0; char **argv = &argvec[0]; QApplication app(argc, argv); G15Reader reader; G15Emulator emu; QObject::connect(&reader, SIGNAL(readFrame(QPixmap)), &emu, SLOT(drawFrame(QPixmap))); reader.start(); emu.show(); app.exec(); return 0; } mumble-1.3.4/main.pro0000664000175000017500000000477414010707273014323 0ustar builderbuilder# Copyright 2005-2019 The Mumble Developers. All rights reserved. # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file at the root of the # Mumble source tree or at . include(qmake/compiler.pri) TEMPLATE = subdirs CONFIG *= ordered debug_and_release SUBDIRS *= src/mumble_proto !CONFIG(no-client) { unix:!CONFIG(bundled-speex):system($$PKG_CONFIG --atleast-version=1.2 speexdsp):system($$PKG_CONFIG --atleast-version=1.2 speex) { CONFIG *= no-bundled-speex } !CONFIG(no-bundled-speex) { SUBDIRS *= 3rdparty/speex-build } CONFIG(sbcelt) { SUBDIRS *= 3rdparty/celt-0.7.0-build 3rdparty/sbcelt-lib-build 3rdparty/sbcelt-helper-build } else { unix:!CONFIG(bundled-celt):system($$PKG_CONFIG --atleast-version=0.7.0 celt) { CONFIG *= no-bundled-celt } !CONFIG(no-bundled-celt) { SUBDIRS *= 3rdparty/celt-0.7.0-build 3rdparty/celt-0.11.0-build } } !CONFIG(no-opus) { CONFIG *= opus } CONFIG(opus):!CONFIG(no-bundled-opus) { SUBDIRS *= 3rdparty/opus-build } !CONFIG(no-rnnoise) { CONFIG *= rnnoise } CONFIG(rnnoise):!CONFIG(no-bundled-rnnoise) { SUBDIRS *= 3rdparty/rnnoise-build } win32 { SUBDIRS *= 3rdparty/xinputcheck-build } SUBDIRS *= src/mumble win32:CONFIG(static) { SUBDIRS *= src/mumble_exe } !CONFIG(no-plugins) { SUBDIRS *= plugins } win32:!CONFIG(no-overlay) { SUBDIRS *= 3rdparty/minhook-build SUBDIRS *= overlay SUBDIRS *= overlay/overlay_exe SUBDIRS *= overlay_winx64 SUBDIRS *= overlay_winx64/overlay_exe_winx64 } win32:!CONFIG(no-g15) { SUBDIRS *= g15helper } contains(UNAME, OpenBSD) { CONFIG *= no-overlay } unix:!macx:!CONFIG(no-overlay) { SUBDIRS *= overlay_gl } macx { !CONFIG(buildenv) { error("Not inside a Mumble buildenv ($MUMBLE_PREFIX environment variable is missing)"); } SUBDIRS *= 3rdparty/mach-override-build SUBDIRS *= overlay_gl SUBDIRS *= macx !exists($$(MUMBLE_PREFIX)/../LCDSDK) { CONFIG *= no-g15 } !CONFIG(no-g15) { SUBDIRS *= g15helper } } } !CONFIG(no-server) { !CONFIG(no-ice) { SUBDIRS *= src/murmur/murmur_ice } CONFIG(grpc) { !system($$PKG_CONFIG --atleast-version=3 protobuf) { error(grpc requires protobuf>=3) } SUBDIRS *= src/murmur_grpcwrapper_protoc_plugin SUBDIRS *= src/murmur/murmur_grpc } SUBDIRS *= src/murmur } CONFIG(tests) { SUBDIRS *= src/tests } mumble-1.3.4/3rdparty/0000775000175000017500000000000014010707273014411 5ustar builderbuildermumble-1.3.4/3rdparty/speex-src/0000775000175000017500000000000014010707304016315 5ustar builderbuildermumble-1.3.4/3rdparty/speex-src/AUTHORS0000664000175000017500000000076614010707304017376 0ustar builderbuilderJean-Marc Valin All the code except the following David Rowe lsp.c lsp.h Also ideas and feedback John Francis Edwards wave_out.[ch], some #ifdefs for windows port and MSVC project files Segher Boessenkool Misc. optimizations (for QMF in particular) Atsuhiko Yamanaka : Patch to speexenc.c to add Vorbis comment format Radim Kolar : Patch to speexenc.c for supporting more input formats mumble-1.3.4/3rdparty/speex-src/Speex.kdevelop0000664000175000017500000001464514010707304021146 0ustar builderbuilder Jean-Marc Valin jean-marc.valin@usherbrooke.ca $VERSION$ KDevAutoProject C . false kdevsubversion Speex libspeex/libspeex.la float src/Speex executable / false true false false float kdevgccoptions kdevgppoptions kdevpgf77options -O2 -g -Wall --disable-shared --enable-fixed-point --disable-shared fixed kdevgccoptions kdevgppoptions kdevpgf77options -O2 -g -Wall false 4 false true 0 libtool true false false false true 10 true true true false true true true 350 400 250 false 0 true true false std=_GLIBCXX_STD;__gnu_cxx=std true true false false true true true true .; false false false 3 /usr/share/qt3 3 EmbeddedKDevDesigner /usr/share/qt3/bin/qmake /usr/bin/designer-qt3 set m_,_ theValue true true true true Horizontal false false *.o,*.lo,CVS true false html/ html/ .h .cpp mumble-1.3.4/3rdparty/speex-src/README0000664000175000017500000000111714010707304017175 0ustar builderbuilderSee INSTALL file for instruction on how to install Speex. The Speex is a patent-free, Open Source/Free Software voice codec. Unlike other codecs like MP3 and Ogg Vorbis, Speex is designed to compress voice at bitrates in the 2-45 kbps range. Possible applications include VoIP, internet audio streaming, archiving of speech data (e.g. voice mail), and audio books. In some sense, it is meant to be complementary to the Ogg Vorbis codec. To use the Speex command line tools: % speexenc [options] input_file.wav compressed_file.spx % speexdec [options] compressed_file.spx output_file.wav mumble-1.3.4/3rdparty/speex-src/TODO0000664000175000017500000000137314010707304017011 0ustar builderbuilderFor 1.2: Major points: - Make documentation match the actual code - Stabilise all APIs (need feedback) - NaN checks? - Better error reporting - Make kiss-fft 32-bit safe Minor issues: - Fix last frame of speexenc Post 1.2: improve float<->int conversion split encoder and decoder? Merge TriMedia stuff packet dump Do VAD properly Optimisations - Add restrict in a few places? - enable 4x4 version of pitch_xcorr() at least on some archs? - use __builtin_expect() (likely()/unlikely()) Would be nice: Implement wideband split as IIR instead of QMF? Allocator override (speex_lib_ctl?) Fixed-point: - VBR Standards -Complete Speex RTP profile -MIME type registration ideas: Peelable stream (double codebook, higher bands, stereo) LPC from spectral domain mumble-1.3.4/3rdparty/speex-src/IDEAS0000664000175000017500000000023114010707304017061 0ustar builderbuilder- Non-linear adaptive codebook (use exc[n]*|exc[n]| to reduce noise component in adaptive codebook excitation) - Include time-domain masking for VBR mumble-1.3.4/3rdparty/speex-src/macosx/0000775000175000017500000000000014010707304017607 5ustar builderbuildermumble-1.3.4/3rdparty/speex-src/macosx/Speex_UB.xcodeproj/0000775000175000017500000000000014010707304023255 5ustar builderbuildermumble-1.3.4/3rdparty/speex-src/macosx/Speex_UB.xcodeproj/project.pbxproj0000664000175000017500000011076714010707304026345 0ustar builderbuilder// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 42; objects = { /* Begin PBXBuildFile section */ 73814B000907FB8200C478FC /* speex_header.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF40907FB8200C478FC /* speex_header.h */; settings = {ATTRIBUTES = (Public, ); }; }; 73814B030907FB8200C478FC /* speex_stereo.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF70907FB8200C478FC /* speex_stereo.h */; settings = {ATTRIBUTES = (Public, ); }; }; 73814B040907FB8200C478FC /* speex_types.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF80907FB8200C478FC /* speex_types.h */; settings = {ATTRIBUTES = (Public, ); }; }; 73814B060907FBAB00C478FC /* speex_callbacks.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF10907FB8200C478FC /* speex_callbacks.h */; settings = {ATTRIBUTES = (Public, ); }; }; 73814B070907FBAD00C478FC /* speex_bits.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF00907FB8200C478FC /* speex_bits.h */; settings = {ATTRIBUTES = (Public, ); }; }; 73814B080907FBAE00C478FC /* speex.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AEF0907FB8200C478FC /* speex.h */; settings = {ATTRIBUTES = (Public, ); }; }; 73814B5A0907FC9900C478FC /* bits.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B0D0907FC9900C478FC /* bits.c */; }; 73814B5E0907FC9900C478FC /* cb_search.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B110907FC9900C478FC /* cb_search.c */; }; 73814B600907FC9900C478FC /* exc_5_64_table.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B130907FC9900C478FC /* exc_5_64_table.c */; }; 73814B610907FC9900C478FC /* exc_5_256_table.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B140907FC9900C478FC /* exc_5_256_table.c */; }; 73814B620907FC9900C478FC /* exc_8_128_table.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B150907FC9900C478FC /* exc_8_128_table.c */; }; 73814B630907FC9900C478FC /* exc_10_16_table.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B160907FC9900C478FC /* exc_10_16_table.c */; }; 73814B640907FC9900C478FC /* exc_10_32_table.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B170907FC9900C478FC /* exc_10_32_table.c */; }; 73814B650907FC9900C478FC /* exc_20_32_table.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B180907FC9900C478FC /* exc_20_32_table.c */; }; 73814B690907FC9900C478FC /* filters.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B1C0907FC9900C478FC /* filters.c */; }; 73814B700907FC9900C478FC /* gain_table_lbr.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B230907FC9900C478FC /* gain_table_lbr.c */; }; 73814B710907FC9900C478FC /* gain_table.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B240907FC9900C478FC /* gain_table.c */; }; 73814B720907FC9900C478FC /* hexc_10_32_table.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B250907FC9900C478FC /* hexc_10_32_table.c */; }; 73814B730907FC9900C478FC /* hexc_table.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B260907FC9900C478FC /* hexc_table.c */; }; 73814B740907FC9900C478FC /* high_lsp_tables.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B270907FC9900C478FC /* high_lsp_tables.c */; }; 73814B760907FC9900C478FC /* lbr_48k_tables.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B290907FC9900C478FC /* lbr_48k_tables.c */; }; 73814B780907FC9900C478FC /* lpc.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B2B0907FC9900C478FC /* lpc.c */; }; 73814B7A0907FC9900C478FC /* lsp_tables_nb.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B2D0907FC9900C478FC /* lsp_tables_nb.c */; }; 73814B7B0907FC9900C478FC /* lsp.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B2E0907FC9900C478FC /* lsp.c */; }; 73814B800907FC9900C478FC /* ltp.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B330907FC9900C478FC /* ltp.c */; }; 73814B840907FC9900C478FC /* math_approx.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B370907FC9900C478FC /* math_approx.c */; }; 73814B880907FC9900C478FC /* misc.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B3B0907FC9900C478FC /* misc.c */; }; 73814B8A0907FC9900C478FC /* modes.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B3D0907FC9900C478FC /* modes.c */; }; 73814B8C0907FC9900C478FC /* nb_celp.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B3F0907FC9900C478FC /* nb_celp.c */; }; 73814B8F0907FC9900C478FC /* quant_lsp.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B420907FC9900C478FC /* quant_lsp.c */; }; 73814B910907FC9900C478FC /* sb_celp.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B440907FC9900C478FC /* sb_celp.c */; }; 73814B930907FC9900C478FC /* smallft.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B460907FC9900C478FC /* smallft.c */; }; 73814B950907FC9900C478FC /* speex_callbacks.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B480907FC9900C478FC /* speex_callbacks.c */; }; 73814B960907FC9900C478FC /* speex_header.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B490907FC9900C478FC /* speex_header.c */; }; 73814B970907FC9900C478FC /* speex.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B4A0907FC9900C478FC /* speex.c */; }; 73814B990907FC9900C478FC /* stereo.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B4C0907FC9900C478FC /* stereo.c */; }; 73814B9F0907FC9900C478FC /* vbr.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B520907FC9900C478FC /* vbr.c */; }; 73814BA40907FC9900C478FC /* vq.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B570907FC9900C478FC /* vq.c */; }; 8D07F2C00486CC7A007CD1D0 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C1666FE841158C02AAC07 /* InfoPlist.strings */; }; /* End PBXBuildFile section */ /* Begin PBXBuildStyle section */ 4F0BB7EC011F40E904CA0E50 /* Development */ = { isa = PBXBuildStyle; buildSettings = { COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; GCC_OPTIMIZATION_LEVEL = 0; ZERO_LINK = YES; }; name = Development; }; 4F0BB7ED011F40E904CA0E50 /* Deployment */ = { isa = PBXBuildStyle; buildSettings = { COPY_PHASE_STRIP = YES; GCC_ENABLE_FIX_AND_CONTINUE = NO; ZERO_LINK = NO; }; name = Deployment; }; /* End PBXBuildStyle section */ /* Begin PBXFileReference section */ 089C1667FE841158C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; 32BAE0B70371A74B00C91783 /* Speex_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Speex_Prefix.pch; sourceTree = ""; }; 73814AEF0907FB8200C478FC /* speex.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex.h; sourceTree = ""; }; 73814AF00907FB8200C478FC /* speex_bits.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_bits.h; sourceTree = ""; }; 73814AF10907FB8200C478FC /* speex_callbacks.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_callbacks.h; sourceTree = ""; }; 73814AF40907FB8200C478FC /* speex_header.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_header.h; sourceTree = ""; }; 73814AF70907FB8200C478FC /* speex_stereo.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_stereo.h; sourceTree = ""; }; 73814AF80907FB8200C478FC /* speex_types.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_types.h; sourceTree = ""; }; 73814B0C0907FC9900C478FC /* arch.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = arch.h; path = ../libspeex/arch.h; sourceTree = SOURCE_ROOT; }; 73814B0D0907FC9900C478FC /* bits.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = bits.c; path = ../libspeex/bits.c; sourceTree = SOURCE_ROOT; }; 73814B0E0907FC9900C478FC /* cb_search_arm4.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = cb_search_arm4.h; path = ../libspeex/cb_search_arm4.h; sourceTree = SOURCE_ROOT; }; 73814B0F0907FC9900C478FC /* cb_search_bfin.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = cb_search_bfin.h; path = ../libspeex/cb_search_bfin.h; sourceTree = SOURCE_ROOT; }; 73814B100907FC9900C478FC /* cb_search_sse.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = cb_search_sse.h; path = ../libspeex/cb_search_sse.h; sourceTree = SOURCE_ROOT; }; 73814B110907FC9900C478FC /* cb_search.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = cb_search.c; path = ../libspeex/cb_search.c; sourceTree = SOURCE_ROOT; }; 73814B120907FC9900C478FC /* cb_search.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = cb_search.h; path = ../libspeex/cb_search.h; sourceTree = SOURCE_ROOT; }; 73814B130907FC9900C478FC /* exc_5_64_table.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = exc_5_64_table.c; path = ../libspeex/exc_5_64_table.c; sourceTree = SOURCE_ROOT; }; 73814B140907FC9900C478FC /* exc_5_256_table.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = exc_5_256_table.c; path = ../libspeex/exc_5_256_table.c; sourceTree = SOURCE_ROOT; }; 73814B150907FC9900C478FC /* exc_8_128_table.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = exc_8_128_table.c; path = ../libspeex/exc_8_128_table.c; sourceTree = SOURCE_ROOT; }; 73814B160907FC9900C478FC /* exc_10_16_table.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = exc_10_16_table.c; path = ../libspeex/exc_10_16_table.c; sourceTree = SOURCE_ROOT; }; 73814B170907FC9900C478FC /* exc_10_32_table.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = exc_10_32_table.c; path = ../libspeex/exc_10_32_table.c; sourceTree = SOURCE_ROOT; }; 73814B180907FC9900C478FC /* exc_20_32_table.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = exc_20_32_table.c; path = ../libspeex/exc_20_32_table.c; sourceTree = SOURCE_ROOT; }; 73814B190907FC9900C478FC /* filters_arm4.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = filters_arm4.h; path = ../libspeex/filters_arm4.h; sourceTree = SOURCE_ROOT; }; 73814B1A0907FC9900C478FC /* filters_bfin.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = filters_bfin.h; path = ../libspeex/filters_bfin.h; sourceTree = SOURCE_ROOT; }; 73814B1B0907FC9900C478FC /* filters_sse.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = filters_sse.h; path = ../libspeex/filters_sse.h; sourceTree = SOURCE_ROOT; }; 73814B1C0907FC9900C478FC /* filters.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = filters.c; path = ../libspeex/filters.c; sourceTree = SOURCE_ROOT; }; 73814B1D0907FC9900C478FC /* filters.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = filters.h; path = ../libspeex/filters.h; sourceTree = SOURCE_ROOT; }; 73814B1E0907FC9900C478FC /* fixed_arm4.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = fixed_arm4.h; path = ../libspeex/fixed_arm4.h; sourceTree = SOURCE_ROOT; }; 73814B1F0907FC9900C478FC /* fixed_arm5e.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = fixed_arm5e.h; path = ../libspeex/fixed_arm5e.h; sourceTree = SOURCE_ROOT; }; 73814B200907FC9900C478FC /* fixed_bfin.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = fixed_bfin.h; path = ../libspeex/fixed_bfin.h; sourceTree = SOURCE_ROOT; }; 73814B210907FC9900C478FC /* fixed_debug.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = fixed_debug.h; path = ../libspeex/fixed_debug.h; sourceTree = SOURCE_ROOT; }; 73814B220907FC9900C478FC /* fixed_generic.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = fixed_generic.h; path = ../libspeex/fixed_generic.h; sourceTree = SOURCE_ROOT; }; 73814B230907FC9900C478FC /* gain_table_lbr.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = gain_table_lbr.c; path = ../libspeex/gain_table_lbr.c; sourceTree = SOURCE_ROOT; }; 73814B240907FC9900C478FC /* gain_table.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = gain_table.c; path = ../libspeex/gain_table.c; sourceTree = SOURCE_ROOT; }; 73814B250907FC9900C478FC /* hexc_10_32_table.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = hexc_10_32_table.c; path = ../libspeex/hexc_10_32_table.c; sourceTree = SOURCE_ROOT; }; 73814B260907FC9900C478FC /* hexc_table.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = hexc_table.c; path = ../libspeex/hexc_table.c; sourceTree = SOURCE_ROOT; }; 73814B270907FC9900C478FC /* high_lsp_tables.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = high_lsp_tables.c; path = ../libspeex/high_lsp_tables.c; sourceTree = SOURCE_ROOT; }; 73814B290907FC9900C478FC /* lbr_48k_tables.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = lbr_48k_tables.c; path = ../libspeex/lbr_48k_tables.c; sourceTree = SOURCE_ROOT; }; 73814B2A0907FC9900C478FC /* lpc_bfin.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = lpc_bfin.h; path = ../libspeex/lpc_bfin.h; sourceTree = SOURCE_ROOT; }; 73814B2B0907FC9900C478FC /* lpc.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = lpc.c; path = ../libspeex/lpc.c; sourceTree = SOURCE_ROOT; }; 73814B2C0907FC9900C478FC /* lpc.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = lpc.h; path = ../libspeex/lpc.h; sourceTree = SOURCE_ROOT; }; 73814B2D0907FC9900C478FC /* lsp_tables_nb.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = lsp_tables_nb.c; path = ../libspeex/lsp_tables_nb.c; sourceTree = SOURCE_ROOT; }; 73814B2E0907FC9900C478FC /* lsp.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = lsp.c; path = ../libspeex/lsp.c; sourceTree = SOURCE_ROOT; }; 73814B2F0907FC9900C478FC /* lsp.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = lsp.h; path = ../libspeex/lsp.h; sourceTree = SOURCE_ROOT; }; 73814B300907FC9900C478FC /* ltp_arm4.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = ltp_arm4.h; path = ../libspeex/ltp_arm4.h; sourceTree = SOURCE_ROOT; }; 73814B310907FC9900C478FC /* ltp_bfin.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = ltp_bfin.h; path = ../libspeex/ltp_bfin.h; sourceTree = SOURCE_ROOT; }; 73814B320907FC9900C478FC /* ltp_sse.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = ltp_sse.h; path = ../libspeex/ltp_sse.h; sourceTree = SOURCE_ROOT; }; 73814B330907FC9900C478FC /* ltp.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = ltp.c; path = ../libspeex/ltp.c; sourceTree = SOURCE_ROOT; }; 73814B340907FC9900C478FC /* ltp.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = ltp.h; path = ../libspeex/ltp.h; sourceTree = SOURCE_ROOT; }; 73814B370907FC9900C478FC /* math_approx.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = math_approx.c; path = ../libspeex/math_approx.c; sourceTree = SOURCE_ROOT; }; 73814B380907FC9900C478FC /* math_approx.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = math_approx.h; path = ../libspeex/math_approx.h; sourceTree = SOURCE_ROOT; }; 73814B3A0907FC9900C478FC /* misc_bfin.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = misc_bfin.h; path = ../libspeex/misc_bfin.h; sourceTree = SOURCE_ROOT; }; 73814B3B0907FC9900C478FC /* misc.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = misc.c; path = ../libspeex/misc.c; sourceTree = SOURCE_ROOT; }; 73814B3C0907FC9900C478FC /* misc.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = misc.h; path = ../libspeex/misc.h; sourceTree = SOURCE_ROOT; }; 73814B3D0907FC9900C478FC /* modes.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = modes.c; path = ../libspeex/modes.c; sourceTree = SOURCE_ROOT; }; 73814B3E0907FC9900C478FC /* modes.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = modes.h; path = ../libspeex/modes.h; sourceTree = SOURCE_ROOT; }; 73814B3F0907FC9900C478FC /* nb_celp.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = nb_celp.c; path = ../libspeex/nb_celp.c; sourceTree = SOURCE_ROOT; }; 73814B400907FC9900C478FC /* nb_celp.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = nb_celp.h; path = ../libspeex/nb_celp.h; sourceTree = SOURCE_ROOT; }; 73814B420907FC9900C478FC /* quant_lsp.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = quant_lsp.c; path = ../libspeex/quant_lsp.c; sourceTree = SOURCE_ROOT; }; 73814B430907FC9900C478FC /* quant_lsp.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = quant_lsp.h; path = ../libspeex/quant_lsp.h; sourceTree = SOURCE_ROOT; }; 73814B440907FC9900C478FC /* sb_celp.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = sb_celp.c; path = ../libspeex/sb_celp.c; sourceTree = SOURCE_ROOT; }; 73814B450907FC9900C478FC /* sb_celp.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = sb_celp.h; path = ../libspeex/sb_celp.h; sourceTree = SOURCE_ROOT; }; 73814B460907FC9900C478FC /* smallft.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = smallft.c; path = ../libspeex/smallft.c; sourceTree = SOURCE_ROOT; }; 73814B470907FC9900C478FC /* smallft.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = smallft.h; path = ../libspeex/smallft.h; sourceTree = SOURCE_ROOT; }; 73814B480907FC9900C478FC /* speex_callbacks.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = speex_callbacks.c; path = ../libspeex/speex_callbacks.c; sourceTree = SOURCE_ROOT; }; 73814B490907FC9900C478FC /* speex_header.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = speex_header.c; path = ../libspeex/speex_header.c; sourceTree = SOURCE_ROOT; }; 73814B4A0907FC9900C478FC /* speex.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = speex.c; path = ../libspeex/speex.c; sourceTree = SOURCE_ROOT; }; 73814B4B0907FC9900C478FC /* stack_alloc.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = stack_alloc.h; path = ../libspeex/stack_alloc.h; sourceTree = SOURCE_ROOT; }; 73814B4C0907FC9900C478FC /* stereo.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = stereo.c; path = ../libspeex/stereo.c; sourceTree = SOURCE_ROOT; }; 73814B4F0907FC9900C478FC /* testenc_uwb.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = testenc_uwb.c; path = ../libspeex/testenc_uwb.c; sourceTree = SOURCE_ROOT; }; 73814B500907FC9900C478FC /* testenc_wb.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = testenc_wb.c; path = ../libspeex/testenc_wb.c; sourceTree = SOURCE_ROOT; }; 73814B510907FC9900C478FC /* testenc.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = testenc.c; path = ../libspeex/testenc.c; sourceTree = SOURCE_ROOT; }; 73814B520907FC9900C478FC /* vbr.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = vbr.c; path = ../libspeex/vbr.c; sourceTree = SOURCE_ROOT; }; 73814B530907FC9900C478FC /* vbr.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = vbr.h; path = ../libspeex/vbr.h; sourceTree = SOURCE_ROOT; }; 73814B540907FC9900C478FC /* vq_arm4.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = vq_arm4.h; path = ../libspeex/vq_arm4.h; sourceTree = SOURCE_ROOT; }; 73814B550907FC9900C478FC /* vq_bfin.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = vq_bfin.h; path = ../libspeex/vq_bfin.h; sourceTree = SOURCE_ROOT; }; 73814B560907FC9900C478FC /* vq_sse.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = vq_sse.h; path = ../libspeex/vq_sse.h; sourceTree = SOURCE_ROOT; }; 73814B570907FC9900C478FC /* vq.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = vq.c; path = ../libspeex/vq.c; sourceTree = SOURCE_ROOT; }; 73814B580907FC9900C478FC /* vq.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = vq.h; path = ../libspeex/vq.h; sourceTree = SOURCE_ROOT; }; 8D07F2C70486CC7A007CD1D0 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 8D07F2C80486CC7A007CD1D0 /* Speex.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Speex.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 8D07F2C30486CC7A007CD1D0 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 034768DDFF38A45A11DB9C8B /* Products */ = { isa = PBXGroup; children = ( 8D07F2C80486CC7A007CD1D0 /* Speex.framework */, ); name = Products; sourceTree = ""; }; 0867D691FE84028FC02AAC07 /* Speex */ = { isa = PBXGroup; children = ( 08FB77ACFE841707C02AAC07 /* Source */, 73814AEB0907FB6400C478FC /* Headers */, 089C1665FE841158C02AAC07 /* Resources */, 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */, 034768DDFF38A45A11DB9C8B /* Products */, ); name = Speex; sourceTree = ""; }; 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */ = { isa = PBXGroup; children = ( ); name = "External Frameworks and Libraries"; sourceTree = ""; }; 089C1665FE841158C02AAC07 /* Resources */ = { isa = PBXGroup; children = ( 8D07F2C70486CC7A007CD1D0 /* Info.plist */, 089C1666FE841158C02AAC07 /* InfoPlist.strings */, ); name = Resources; sourceTree = ""; }; 08FB77ACFE841707C02AAC07 /* Source */ = { isa = PBXGroup; children = ( 73814B0C0907FC9900C478FC /* arch.h */, 73814B0D0907FC9900C478FC /* bits.c */, 73814B0E0907FC9900C478FC /* cb_search_arm4.h */, 73814B0F0907FC9900C478FC /* cb_search_bfin.h */, 73814B100907FC9900C478FC /* cb_search_sse.h */, 73814B110907FC9900C478FC /* cb_search.c */, 73814B120907FC9900C478FC /* cb_search.h */, 73814B130907FC9900C478FC /* exc_5_64_table.c */, 73814B140907FC9900C478FC /* exc_5_256_table.c */, 73814B150907FC9900C478FC /* exc_8_128_table.c */, 73814B160907FC9900C478FC /* exc_10_16_table.c */, 73814B170907FC9900C478FC /* exc_10_32_table.c */, 73814B180907FC9900C478FC /* exc_20_32_table.c */, 73814B190907FC9900C478FC /* filters_arm4.h */, 73814B1A0907FC9900C478FC /* filters_bfin.h */, 73814B1B0907FC9900C478FC /* filters_sse.h */, 73814B1C0907FC9900C478FC /* filters.c */, 73814B1D0907FC9900C478FC /* filters.h */, 73814B1E0907FC9900C478FC /* fixed_arm4.h */, 73814B1F0907FC9900C478FC /* fixed_arm5e.h */, 73814B200907FC9900C478FC /* fixed_bfin.h */, 73814B210907FC9900C478FC /* fixed_debug.h */, 73814B220907FC9900C478FC /* fixed_generic.h */, 73814B230907FC9900C478FC /* gain_table_lbr.c */, 73814B240907FC9900C478FC /* gain_table.c */, 73814B250907FC9900C478FC /* hexc_10_32_table.c */, 73814B260907FC9900C478FC /* hexc_table.c */, 73814B270907FC9900C478FC /* high_lsp_tables.c */, 73814B290907FC9900C478FC /* lbr_48k_tables.c */, 73814B2A0907FC9900C478FC /* lpc_bfin.h */, 73814B2B0907FC9900C478FC /* lpc.c */, 73814B2C0907FC9900C478FC /* lpc.h */, 73814B2D0907FC9900C478FC /* lsp_tables_nb.c */, 73814B2E0907FC9900C478FC /* lsp.c */, 73814B2F0907FC9900C478FC /* lsp.h */, 73814B300907FC9900C478FC /* ltp_arm4.h */, 73814B310907FC9900C478FC /* ltp_bfin.h */, 73814B320907FC9900C478FC /* ltp_sse.h */, 73814B330907FC9900C478FC /* ltp.c */, 73814B340907FC9900C478FC /* ltp.h */, 73814B370907FC9900C478FC /* math_approx.c */, 73814B380907FC9900C478FC /* math_approx.h */, 73814B3A0907FC9900C478FC /* misc_bfin.h */, 73814B3B0907FC9900C478FC /* misc.c */, 73814B3C0907FC9900C478FC /* misc.h */, 73814B3D0907FC9900C478FC /* modes.c */, 73814B3E0907FC9900C478FC /* modes.h */, 73814B3F0907FC9900C478FC /* nb_celp.c */, 73814B400907FC9900C478FC /* nb_celp.h */, 73814B420907FC9900C478FC /* quant_lsp.c */, 73814B430907FC9900C478FC /* quant_lsp.h */, 73814B440907FC9900C478FC /* sb_celp.c */, 73814B450907FC9900C478FC /* sb_celp.h */, 73814B460907FC9900C478FC /* smallft.c */, 73814B470907FC9900C478FC /* smallft.h */, 73814B480907FC9900C478FC /* speex_callbacks.c */, 73814B490907FC9900C478FC /* speex_header.c */, 73814B4A0907FC9900C478FC /* speex.c */, 73814B4B0907FC9900C478FC /* stack_alloc.h */, 73814B4C0907FC9900C478FC /* stereo.c */, 73814B4F0907FC9900C478FC /* testenc_uwb.c */, 73814B500907FC9900C478FC /* testenc_wb.c */, 73814B510907FC9900C478FC /* testenc.c */, 73814B520907FC9900C478FC /* vbr.c */, 73814B530907FC9900C478FC /* vbr.h */, 73814B540907FC9900C478FC /* vq_arm4.h */, 73814B550907FC9900C478FC /* vq_bfin.h */, 73814B560907FC9900C478FC /* vq_sse.h */, 73814B570907FC9900C478FC /* vq.c */, 73814B580907FC9900C478FC /* vq.h */, 32BAE0B70371A74B00C91783 /* Speex_Prefix.pch */, ); name = Source; sourceTree = ""; }; 73814AEB0907FB6400C478FC /* Headers */ = { isa = PBXGroup; children = ( 73814AEC0907FB8200C478FC /* speex */, ); name = Headers; sourceTree = ""; }; 73814AEC0907FB8200C478FC /* speex */ = { isa = PBXGroup; children = ( 73814AEF0907FB8200C478FC /* speex.h */, 73814AF00907FB8200C478FC /* speex_bits.h */, 73814AF10907FB8200C478FC /* speex_callbacks.h */, 73814AF40907FB8200C478FC /* speex_header.h */, 73814AF70907FB8200C478FC /* speex_stereo.h */, 73814AF80907FB8200C478FC /* speex_types.h */, ); name = speex; path = ../include/speex; sourceTree = SOURCE_ROOT; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ 8D07F2BD0486CC7A007CD1D0 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 73814B000907FB8200C478FC /* speex_header.h in Headers */, 73814B030907FB8200C478FC /* speex_stereo.h in Headers */, 73814B040907FB8200C478FC /* speex_types.h in Headers */, 73814B060907FBAB00C478FC /* speex_callbacks.h in Headers */, 73814B070907FBAD00C478FC /* speex_bits.h in Headers */, 73814B080907FBAE00C478FC /* speex.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ 8D07F2BC0486CC7A007CD1D0 /* Speex */ = { isa = PBXNativeTarget; buildConfigurationList = 73814ADF0907FB1E00C478FC /* Build configuration list for PBXNativeTarget "Speex" */; buildPhases = ( 8D07F2BD0486CC7A007CD1D0 /* Headers */, 8D07F2BF0486CC7A007CD1D0 /* Resources */, 8D07F2C10486CC7A007CD1D0 /* Sources */, 8D07F2C30486CC7A007CD1D0 /* Frameworks */, 8D07F2C50486CC7A007CD1D0 /* Rez */, ); buildRules = ( ); buildSettings = { DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; FRAMEWORK_VERSION = A; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = Speex_Prefix.pch; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Library/Frameworks"; LIBRARY_STYLE = DYNAMIC; PRODUCT_NAME = Speex; WRAPPER_EXTENSION = framework; }; dependencies = ( ); name = Speex; productInstallPath = "$(HOME)/Library/Frameworks"; productName = Speex; productReference = 8D07F2C80486CC7A007CD1D0 /* Speex.framework */; productType = "com.apple.product-type.framework"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 0867D690FE84028FC02AAC07 /* Project object */ = { isa = PBXProject; buildConfigurationList = 73814AE30907FB1E00C478FC /* Build configuration list for PBXProject "Speex_UB" */; buildSettings = { }; buildStyles = ( 4F0BB7EC011F40E904CA0E50 /* Development */, 4F0BB7ED011F40E904CA0E50 /* Deployment */, ); hasScannedForEncodings = 1; mainGroup = 0867D691FE84028FC02AAC07 /* Speex */; productRefGroup = 034768DDFF38A45A11DB9C8B /* Products */; projectDirPath = ""; targets = ( 8D07F2BC0486CC7A007CD1D0 /* Speex */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 8D07F2BF0486CC7A007CD1D0 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 8D07F2C00486CC7A007CD1D0 /* InfoPlist.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXRezBuildPhase section */ 8D07F2C50486CC7A007CD1D0 /* Rez */ = { isa = PBXRezBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXRezBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 8D07F2C10486CC7A007CD1D0 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 73814B5A0907FC9900C478FC /* bits.c in Sources */, 73814B5E0907FC9900C478FC /* cb_search.c in Sources */, 73814B600907FC9900C478FC /* exc_5_64_table.c in Sources */, 73814B610907FC9900C478FC /* exc_5_256_table.c in Sources */, 73814B620907FC9900C478FC /* exc_8_128_table.c in Sources */, 73814B630907FC9900C478FC /* exc_10_16_table.c in Sources */, 73814B640907FC9900C478FC /* exc_10_32_table.c in Sources */, 73814B650907FC9900C478FC /* exc_20_32_table.c in Sources */, 73814B690907FC9900C478FC /* filters.c in Sources */, 73814B700907FC9900C478FC /* gain_table_lbr.c in Sources */, 73814B710907FC9900C478FC /* gain_table.c in Sources */, 73814B720907FC9900C478FC /* hexc_10_32_table.c in Sources */, 73814B730907FC9900C478FC /* hexc_table.c in Sources */, 73814B740907FC9900C478FC /* high_lsp_tables.c in Sources */, 73814B760907FC9900C478FC /* lbr_48k_tables.c in Sources */, 73814B780907FC9900C478FC /* lpc.c in Sources */, 73814B7A0907FC9900C478FC /* lsp_tables_nb.c in Sources */, 73814B7B0907FC9900C478FC /* lsp.c in Sources */, 73814B800907FC9900C478FC /* ltp.c in Sources */, 73814B840907FC9900C478FC /* math_approx.c in Sources */, 73814B880907FC9900C478FC /* misc.c in Sources */, 73814B8A0907FC9900C478FC /* modes.c in Sources */, 73814B8C0907FC9900C478FC /* nb_celp.c in Sources */, 73814B8F0907FC9900C478FC /* quant_lsp.c in Sources */, 73814B910907FC9900C478FC /* sb_celp.c in Sources */, 73814B930907FC9900C478FC /* smallft.c in Sources */, 73814B950907FC9900C478FC /* speex_callbacks.c in Sources */, 73814B960907FC9900C478FC /* speex_header.c in Sources */, 73814B970907FC9900C478FC /* speex.c in Sources */, 73814B990907FC9900C478FC /* stereo.c in Sources */, 73814B9F0907FC9900C478FC /* vbr.c in Sources */, 73814BA40907FC9900C478FC /* vq.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ 089C1666FE841158C02AAC07 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( 089C1667FE841158C02AAC07 /* English */, ); name = InfoPlist.strings; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 73814AE00907FB1E00C478FC /* Development */ = { isa = XCBuildConfiguration; buildSettings = { COPY_PHASE_STRIP = NO; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; FRAMEWORK_VERSION = A; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = Speex_Prefix.pch; INFOPLIST_FILE = Info.plist; INSTALL_PATH = /Library/Frameworks; LIBRARY_STYLE = DYNAMIC; MACH_O_TYPE = mh_dylib; PRODUCT_NAME = Speex; WRAPPER_EXTENSION = framework; ZERO_LINK = YES; }; name = Development; }; 73814AE10907FB1E00C478FC /* Deployment */ = { isa = XCBuildConfiguration; buildSettings = { COPY_PHASE_STRIP = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; FRAMEWORK_VERSION = A; GCC_ENABLE_FIX_AND_CONTINUE = NO; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = Speex_Prefix.pch; INFOPLIST_FILE = Info.plist; INSTALL_PATH = /Library/Frameworks; LIBRARY_STYLE = DYNAMIC; MACH_O_TYPE = mh_dylib; PRODUCT_NAME = Speex; WRAPPER_EXTENSION = framework; ZERO_LINK = NO; }; name = Deployment; }; 73814AE20907FB1E00C478FC /* Default */ = { isa = XCBuildConfiguration; buildSettings = { DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; FRAMEWORK_VERSION = A; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = Speex_Prefix.pch; INFOPLIST_FILE = Info.plist; INSTALL_PATH = /Library/Frameworks; LIBRARY_STYLE = DYNAMIC; MACH_O_TYPE = mh_dylib; PRODUCT_NAME = Speex; WRAPPER_EXTENSION = framework; }; name = Default; }; 73814AE40907FB1E00C478FC /* Development */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ( ppc, i386, ); GCC_PREPROCESSOR_DEFINITIONS = __MACOSX__; SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; }; name = Development; }; 73814AE50907FB1E00C478FC /* Deployment */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ( ppc, i386, ); GCC_PREPROCESSOR_DEFINITIONS = __MACOSX__; SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; }; name = Deployment; }; 73814AE60907FB1E00C478FC /* Default */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ( ppc, i386, ); GCC_PREPROCESSOR_DEFINITIONS = __MACOSX__; SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; }; name = Default; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 73814ADF0907FB1E00C478FC /* Build configuration list for PBXNativeTarget "Speex" */ = { isa = XCConfigurationList; buildConfigurations = ( 73814AE00907FB1E00C478FC /* Development */, 73814AE10907FB1E00C478FC /* Deployment */, 73814AE20907FB1E00C478FC /* Default */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Default; }; 73814AE30907FB1E00C478FC /* Build configuration list for PBXProject "Speex_UB" */ = { isa = XCConfigurationList; buildConfigurations = ( 73814AE40907FB1E00C478FC /* Development */, 73814AE50907FB1E00C478FC /* Deployment */, 73814AE60907FB1E00C478FC /* Default */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Default; }; /* End XCConfigurationList section */ }; rootObject = 0867D690FE84028FC02AAC07 /* Project object */; } mumble-1.3.4/3rdparty/speex-src/macosx/Speex.xcodeproj/0000775000175000017500000000000014010707304022667 5ustar builderbuildermumble-1.3.4/3rdparty/speex-src/macosx/Speex.xcodeproj/project.pbxproj0000664000175000017500000014231714010707304025753 0ustar builderbuilder// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 42; objects = { /* Begin PBXBuildFile section */ 37CA8DEB0DD73333005C8CB6 /* modes_wb.c in Sources */ = {isa = PBXBuildFile; fileRef = 37CA8DEA0DD73333005C8CB6 /* modes_wb.c */; }; 37CA8DEC0DD73333005C8CB6 /* modes_wb.c in Sources */ = {isa = PBXBuildFile; fileRef = 37CA8DEA0DD73333005C8CB6 /* modes_wb.c */; }; 37CA8E000DD7352A005C8CB6 /* os_support.h in Headers */ = {isa = PBXBuildFile; fileRef = 37CA8DFF0DD7352A005C8CB6 /* os_support.h */; }; 73814B000907FB8200C478FC /* speex_header.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF40907FB8200C478FC /* speex_header.h */; settings = {ATTRIBUTES = (Public, ); }; }; 73814B030907FB8200C478FC /* speex_stereo.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF70907FB8200C478FC /* speex_stereo.h */; settings = {ATTRIBUTES = (Public, ); }; }; 73814B040907FB8200C478FC /* speex_types.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF80907FB8200C478FC /* speex_types.h */; settings = {ATTRIBUTES = (Public, ); }; }; 73814B060907FBAB00C478FC /* speex_callbacks.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF10907FB8200C478FC /* speex_callbacks.h */; settings = {ATTRIBUTES = (Public, ); }; }; 73814B070907FBAD00C478FC /* speex_bits.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF00907FB8200C478FC /* speex_bits.h */; settings = {ATTRIBUTES = (Public, ); }; }; 73814B080907FBAE00C478FC /* speex.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AEF0907FB8200C478FC /* speex.h */; settings = {ATTRIBUTES = (Public, ); }; }; 73814B5A0907FC9900C478FC /* bits.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B0D0907FC9900C478FC /* bits.c */; }; 73814B5E0907FC9900C478FC /* cb_search.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B110907FC9900C478FC /* cb_search.c */; }; 73814B600907FC9900C478FC /* exc_5_64_table.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B130907FC9900C478FC /* exc_5_64_table.c */; }; 73814B610907FC9900C478FC /* exc_5_256_table.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B140907FC9900C478FC /* exc_5_256_table.c */; }; 73814B620907FC9900C478FC /* exc_8_128_table.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B150907FC9900C478FC /* exc_8_128_table.c */; }; 73814B630907FC9900C478FC /* exc_10_16_table.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B160907FC9900C478FC /* exc_10_16_table.c */; }; 73814B640907FC9900C478FC /* exc_10_32_table.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B170907FC9900C478FC /* exc_10_32_table.c */; }; 73814B650907FC9900C478FC /* exc_20_32_table.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B180907FC9900C478FC /* exc_20_32_table.c */; }; 73814B690907FC9900C478FC /* filters.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B1C0907FC9900C478FC /* filters.c */; }; 73814B700907FC9900C478FC /* gain_table_lbr.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B230907FC9900C478FC /* gain_table_lbr.c */; }; 73814B710907FC9900C478FC /* gain_table.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B240907FC9900C478FC /* gain_table.c */; }; 73814B720907FC9900C478FC /* hexc_10_32_table.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B250907FC9900C478FC /* hexc_10_32_table.c */; }; 73814B730907FC9900C478FC /* hexc_table.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B260907FC9900C478FC /* hexc_table.c */; }; 73814B740907FC9900C478FC /* high_lsp_tables.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B270907FC9900C478FC /* high_lsp_tables.c */; }; 73814B780907FC9900C478FC /* lpc.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B2B0907FC9900C478FC /* lpc.c */; }; 73814B7A0907FC9900C478FC /* lsp_tables_nb.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B2D0907FC9900C478FC /* lsp_tables_nb.c */; }; 73814B7B0907FC9900C478FC /* lsp.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B2E0907FC9900C478FC /* lsp.c */; }; 73814B800907FC9900C478FC /* ltp.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B330907FC9900C478FC /* ltp.c */; }; 73814B8A0907FC9900C478FC /* modes.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B3D0907FC9900C478FC /* modes.c */; }; 73814B8C0907FC9900C478FC /* nb_celp.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B3F0907FC9900C478FC /* nb_celp.c */; }; 73814B8F0907FC9900C478FC /* quant_lsp.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B420907FC9900C478FC /* quant_lsp.c */; }; 73814B910907FC9900C478FC /* sb_celp.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B440907FC9900C478FC /* sb_celp.c */; }; 73814B930907FC9900C478FC /* smallft.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B460907FC9900C478FC /* smallft.c */; }; 73814B950907FC9900C478FC /* speex_callbacks.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B480907FC9900C478FC /* speex_callbacks.c */; }; 73814B960907FC9900C478FC /* speex_header.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B490907FC9900C478FC /* speex_header.c */; }; 73814B970907FC9900C478FC /* speex.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B4A0907FC9900C478FC /* speex.c */; }; 73814B990907FC9900C478FC /* stereo.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B4C0907FC9900C478FC /* stereo.c */; }; 73814B9F0907FC9900C478FC /* vbr.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B520907FC9900C478FC /* vbr.c */; }; 73814BA40907FC9900C478FC /* vq.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B570907FC9900C478FC /* vq.c */; }; 738837540B193581005C7A69 /* _kiss_fft_guts.h in Headers */ = {isa = PBXBuildFile; fileRef = 738837460B193581005C7A69 /* _kiss_fft_guts.h */; }; 738837550B193581005C7A69 /* fftwrap.c in Sources */ = {isa = PBXBuildFile; fileRef = 738837470B193581005C7A69 /* fftwrap.c */; }; 738837560B193581005C7A69 /* fftwrap.h in Headers */ = {isa = PBXBuildFile; fileRef = 738837480B193581005C7A69 /* fftwrap.h */; }; 738837590B193581005C7A69 /* kiss_fft.c in Sources */ = {isa = PBXBuildFile; fileRef = 7388374B0B193581005C7A69 /* kiss_fft.c */; }; 7388375A0B193581005C7A69 /* kiss_fft.h in Headers */ = {isa = PBXBuildFile; fileRef = 7388374C0B193581005C7A69 /* kiss_fft.h */; }; 7388375B0B193581005C7A69 /* kiss_fftr.c in Sources */ = {isa = PBXBuildFile; fileRef = 7388374D0B193581005C7A69 /* kiss_fftr.c */; }; 7388375C0B193581005C7A69 /* kiss_fftr.h in Headers */ = {isa = PBXBuildFile; fileRef = 7388374E0B193581005C7A69 /* kiss_fftr.h */; }; 7388375D0B193581005C7A69 /* lsp_bfin.h in Headers */ = {isa = PBXBuildFile; fileRef = 7388374F0B193581005C7A69 /* lsp_bfin.h */; }; 7388375E0B193581005C7A69 /* pseudofloat.h in Headers */ = {isa = PBXBuildFile; fileRef = 738837500B193581005C7A69 /* pseudofloat.h */; }; 7388375F0B193581005C7A69 /* quant_lsp_bfin.h in Headers */ = {isa = PBXBuildFile; fileRef = 738837510B193581005C7A69 /* quant_lsp_bfin.h */; }; 738837600B193581005C7A69 /* vorbis_psy.c in Sources */ = {isa = PBXBuildFile; fileRef = 738837520B193581005C7A69 /* vorbis_psy.c */; }; 738837610B193581005C7A69 /* vorbis_psy.h in Headers */ = {isa = PBXBuildFile; fileRef = 738837530B193581005C7A69 /* vorbis_psy.h */; }; 7388377B0B193784005C7A69 /* bits.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B0D0907FC9900C478FC /* bits.c */; }; 7388377C0B193785005C7A69 /* cb_search.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B110907FC9900C478FC /* cb_search.c */; }; 7388377D0B193788005C7A69 /* exc_10_16_table.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B160907FC9900C478FC /* exc_10_16_table.c */; }; 7388377E0B193789005C7A69 /* exc_10_32_table.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B170907FC9900C478FC /* exc_10_32_table.c */; }; 7388377F0B19378A005C7A69 /* exc_20_32_table.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B180907FC9900C478FC /* exc_20_32_table.c */; }; 738837800B19378A005C7A69 /* exc_5_256_table.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B140907FC9900C478FC /* exc_5_256_table.c */; }; 738837810B19378C005C7A69 /* exc_5_64_table.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B130907FC9900C478FC /* exc_5_64_table.c */; }; 738837820B19378E005C7A69 /* exc_8_128_table.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B150907FC9900C478FC /* exc_8_128_table.c */; }; 738837830B193791005C7A69 /* fftwrap.c in Sources */ = {isa = PBXBuildFile; fileRef = 738837470B193581005C7A69 /* fftwrap.c */; }; 738837850B193793005C7A69 /* filters.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B1C0907FC9900C478FC /* filters.c */; }; 738837860B193795005C7A69 /* gain_table.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B240907FC9900C478FC /* gain_table.c */; }; 738837870B193796005C7A69 /* gain_table_lbr.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B230907FC9900C478FC /* gain_table_lbr.c */; }; 738837880B193799005C7A69 /* hexc_10_32_table.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B250907FC9900C478FC /* hexc_10_32_table.c */; }; 738837890B19379B005C7A69 /* hexc_table.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B260907FC9900C478FC /* hexc_table.c */; }; 7388378A0B19379E005C7A69 /* high_lsp_tables.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B270907FC9900C478FC /* high_lsp_tables.c */; }; 7388378C0B1937A4005C7A69 /* kiss_fft.c in Sources */ = {isa = PBXBuildFile; fileRef = 7388374B0B193581005C7A69 /* kiss_fft.c */; }; 7388378D0B1937A9005C7A69 /* kiss_fftr.c in Sources */ = {isa = PBXBuildFile; fileRef = 7388374D0B193581005C7A69 /* kiss_fftr.c */; }; 7388378F0B1937B0005C7A69 /* lpc.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B2B0907FC9900C478FC /* lpc.c */; }; 738837900B1937B0005C7A69 /* lsp.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B2E0907FC9900C478FC /* lsp.c */; }; 738837910B1937B5005C7A69 /* lsp_tables_nb.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B2D0907FC9900C478FC /* lsp_tables_nb.c */; }; 738837920B1937B7005C7A69 /* ltp.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B330907FC9900C478FC /* ltp.c */; }; 738837960B1937BE005C7A69 /* modes.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B3D0907FC9900C478FC /* modes.c */; }; 738837970B1937C0005C7A69 /* nb_celp.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B3F0907FC9900C478FC /* nb_celp.c */; }; 738837990B1937C4005C7A69 /* quant_lsp.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B420907FC9900C478FC /* quant_lsp.c */; }; 7388379A0B1937C6005C7A69 /* sb_celp.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B440907FC9900C478FC /* sb_celp.c */; }; 7388379B0B1937C9005C7A69 /* smallft.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B460907FC9900C478FC /* smallft.c */; }; 7388379C0B1937CB005C7A69 /* speex.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B4A0907FC9900C478FC /* speex.c */; }; 7388379D0B1937CE005C7A69 /* speex_callbacks.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B480907FC9900C478FC /* speex_callbacks.c */; }; 7388379E0B1937D0005C7A69 /* speex_header.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B490907FC9900C478FC /* speex_header.c */; }; 7388379F0B1937D1005C7A69 /* stereo.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B4C0907FC9900C478FC /* stereo.c */; }; 738837A00B1937DA005C7A69 /* vbr.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B520907FC9900C478FC /* vbr.c */; }; 738837A10B1937DD005C7A69 /* vorbis_psy.c in Sources */ = {isa = PBXBuildFile; fileRef = 738837520B193581005C7A69 /* vorbis_psy.c */; }; 738837A20B1937DF005C7A69 /* vq.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B570907FC9900C478FC /* vq.c */; }; 738837A30B1937E1005C7A69 /* window.c in Sources */ = {isa = PBXBuildFile; fileRef = BFF73DCF0A78AA170078A4A8 /* window.c */; }; 8D07F2C00486CC7A007CD1D0 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C1666FE841158C02AAC07 /* InfoPlist.strings */; }; BFF73DD00A78AA170078A4A8 /* window.c in Sources */ = {isa = PBXBuildFile; fileRef = BFF73DCF0A78AA170078A4A8 /* window.c */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 089C1667FE841158C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; 32BAE0B70371A74B00C91783 /* Speex_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Speex_Prefix.pch; sourceTree = ""; }; 37CA8DEA0DD73333005C8CB6 /* modes_wb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = modes_wb.c; path = ../libspeex/modes_wb.c; sourceTree = SOURCE_ROOT; }; 37CA8DFF0DD7352A005C8CB6 /* os_support.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = os_support.h; path = ../libspeex/os_support.h; sourceTree = SOURCE_ROOT; }; 73814AEF0907FB8200C478FC /* speex.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex.h; sourceTree = ""; }; 73814AF00907FB8200C478FC /* speex_bits.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_bits.h; sourceTree = ""; }; 73814AF10907FB8200C478FC /* speex_callbacks.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_callbacks.h; sourceTree = ""; }; 73814AF40907FB8200C478FC /* speex_header.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_header.h; sourceTree = ""; }; 73814AF70907FB8200C478FC /* speex_stereo.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_stereo.h; sourceTree = ""; }; 73814AF80907FB8200C478FC /* speex_types.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_types.h; sourceTree = ""; }; 73814B0C0907FC9900C478FC /* arch.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = arch.h; path = ../libspeex/arch.h; sourceTree = SOURCE_ROOT; }; 73814B0D0907FC9900C478FC /* bits.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = bits.c; path = ../libspeex/bits.c; sourceTree = SOURCE_ROOT; }; 73814B0E0907FC9900C478FC /* cb_search_arm4.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = cb_search_arm4.h; path = ../libspeex/cb_search_arm4.h; sourceTree = SOURCE_ROOT; }; 73814B0F0907FC9900C478FC /* cb_search_bfin.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = cb_search_bfin.h; path = ../libspeex/cb_search_bfin.h; sourceTree = SOURCE_ROOT; }; 73814B100907FC9900C478FC /* cb_search_sse.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = cb_search_sse.h; path = ../libspeex/cb_search_sse.h; sourceTree = SOURCE_ROOT; }; 73814B110907FC9900C478FC /* cb_search.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = cb_search.c; path = ../libspeex/cb_search.c; sourceTree = SOURCE_ROOT; }; 73814B120907FC9900C478FC /* cb_search.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = cb_search.h; path = ../libspeex/cb_search.h; sourceTree = SOURCE_ROOT; }; 73814B130907FC9900C478FC /* exc_5_64_table.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = exc_5_64_table.c; path = ../libspeex/exc_5_64_table.c; sourceTree = SOURCE_ROOT; }; 73814B140907FC9900C478FC /* exc_5_256_table.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = exc_5_256_table.c; path = ../libspeex/exc_5_256_table.c; sourceTree = SOURCE_ROOT; }; 73814B150907FC9900C478FC /* exc_8_128_table.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = exc_8_128_table.c; path = ../libspeex/exc_8_128_table.c; sourceTree = SOURCE_ROOT; }; 73814B160907FC9900C478FC /* exc_10_16_table.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = exc_10_16_table.c; path = ../libspeex/exc_10_16_table.c; sourceTree = SOURCE_ROOT; }; 73814B170907FC9900C478FC /* exc_10_32_table.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = exc_10_32_table.c; path = ../libspeex/exc_10_32_table.c; sourceTree = SOURCE_ROOT; }; 73814B180907FC9900C478FC /* exc_20_32_table.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = exc_20_32_table.c; path = ../libspeex/exc_20_32_table.c; sourceTree = SOURCE_ROOT; }; 73814B190907FC9900C478FC /* filters_arm4.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = filters_arm4.h; path = ../libspeex/filters_arm4.h; sourceTree = SOURCE_ROOT; }; 73814B1A0907FC9900C478FC /* filters_bfin.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = filters_bfin.h; path = ../libspeex/filters_bfin.h; sourceTree = SOURCE_ROOT; }; 73814B1B0907FC9900C478FC /* filters_sse.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = filters_sse.h; path = ../libspeex/filters_sse.h; sourceTree = SOURCE_ROOT; }; 73814B1C0907FC9900C478FC /* filters.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = filters.c; path = ../libspeex/filters.c; sourceTree = SOURCE_ROOT; }; 73814B1D0907FC9900C478FC /* filters.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = filters.h; path = ../libspeex/filters.h; sourceTree = SOURCE_ROOT; }; 73814B1E0907FC9900C478FC /* fixed_arm4.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = fixed_arm4.h; path = ../libspeex/fixed_arm4.h; sourceTree = SOURCE_ROOT; }; 73814B1F0907FC9900C478FC /* fixed_arm5e.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = fixed_arm5e.h; path = ../libspeex/fixed_arm5e.h; sourceTree = SOURCE_ROOT; }; 73814B200907FC9900C478FC /* fixed_bfin.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = fixed_bfin.h; path = ../libspeex/fixed_bfin.h; sourceTree = SOURCE_ROOT; }; 73814B210907FC9900C478FC /* fixed_debug.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = fixed_debug.h; path = ../libspeex/fixed_debug.h; sourceTree = SOURCE_ROOT; }; 73814B220907FC9900C478FC /* fixed_generic.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = fixed_generic.h; path = ../libspeex/fixed_generic.h; sourceTree = SOURCE_ROOT; }; 73814B230907FC9900C478FC /* gain_table_lbr.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = gain_table_lbr.c; path = ../libspeex/gain_table_lbr.c; sourceTree = SOURCE_ROOT; }; 73814B240907FC9900C478FC /* gain_table.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = gain_table.c; path = ../libspeex/gain_table.c; sourceTree = SOURCE_ROOT; }; 73814B250907FC9900C478FC /* hexc_10_32_table.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = hexc_10_32_table.c; path = ../libspeex/hexc_10_32_table.c; sourceTree = SOURCE_ROOT; }; 73814B260907FC9900C478FC /* hexc_table.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = hexc_table.c; path = ../libspeex/hexc_table.c; sourceTree = SOURCE_ROOT; }; 73814B270907FC9900C478FC /* high_lsp_tables.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = high_lsp_tables.c; path = ../libspeex/high_lsp_tables.c; sourceTree = SOURCE_ROOT; }; 73814B2A0907FC9900C478FC /* lpc_bfin.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = lpc_bfin.h; path = ../libspeex/lpc_bfin.h; sourceTree = SOURCE_ROOT; }; 73814B2B0907FC9900C478FC /* lpc.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = lpc.c; path = ../libspeex/lpc.c; sourceTree = SOURCE_ROOT; }; 73814B2C0907FC9900C478FC /* lpc.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = lpc.h; path = ../libspeex/lpc.h; sourceTree = SOURCE_ROOT; }; 73814B2D0907FC9900C478FC /* lsp_tables_nb.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = lsp_tables_nb.c; path = ../libspeex/lsp_tables_nb.c; sourceTree = SOURCE_ROOT; }; 73814B2E0907FC9900C478FC /* lsp.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = lsp.c; path = ../libspeex/lsp.c; sourceTree = SOURCE_ROOT; }; 73814B2F0907FC9900C478FC /* lsp.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = lsp.h; path = ../libspeex/lsp.h; sourceTree = SOURCE_ROOT; }; 73814B300907FC9900C478FC /* ltp_arm4.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = ltp_arm4.h; path = ../libspeex/ltp_arm4.h; sourceTree = SOURCE_ROOT; }; 73814B310907FC9900C478FC /* ltp_bfin.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = ltp_bfin.h; path = ../libspeex/ltp_bfin.h; sourceTree = SOURCE_ROOT; }; 73814B320907FC9900C478FC /* ltp_sse.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = ltp_sse.h; path = ../libspeex/ltp_sse.h; sourceTree = SOURCE_ROOT; }; 73814B330907FC9900C478FC /* ltp.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = ltp.c; path = ../libspeex/ltp.c; sourceTree = SOURCE_ROOT; }; 73814B340907FC9900C478FC /* ltp.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = ltp.h; path = ../libspeex/ltp.h; sourceTree = SOURCE_ROOT; }; 73814B380907FC9900C478FC /* math_approx.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = math_approx.h; path = ../libspeex/math_approx.h; sourceTree = SOURCE_ROOT; }; 73814B3A0907FC9900C478FC /* misc_bfin.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = misc_bfin.h; path = ../libspeex/misc_bfin.h; sourceTree = SOURCE_ROOT; }; 73814B3D0907FC9900C478FC /* modes.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = modes.c; path = ../libspeex/modes.c; sourceTree = SOURCE_ROOT; }; 73814B3E0907FC9900C478FC /* modes.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = modes.h; path = ../libspeex/modes.h; sourceTree = SOURCE_ROOT; }; 73814B3F0907FC9900C478FC /* nb_celp.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = nb_celp.c; path = ../libspeex/nb_celp.c; sourceTree = SOURCE_ROOT; }; 73814B400907FC9900C478FC /* nb_celp.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = nb_celp.h; path = ../libspeex/nb_celp.h; sourceTree = SOURCE_ROOT; }; 73814B420907FC9900C478FC /* quant_lsp.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = quant_lsp.c; path = ../libspeex/quant_lsp.c; sourceTree = SOURCE_ROOT; }; 73814B430907FC9900C478FC /* quant_lsp.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = quant_lsp.h; path = ../libspeex/quant_lsp.h; sourceTree = SOURCE_ROOT; }; 73814B440907FC9900C478FC /* sb_celp.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = sb_celp.c; path = ../libspeex/sb_celp.c; sourceTree = SOURCE_ROOT; }; 73814B450907FC9900C478FC /* sb_celp.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = sb_celp.h; path = ../libspeex/sb_celp.h; sourceTree = SOURCE_ROOT; }; 73814B460907FC9900C478FC /* smallft.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = smallft.c; path = ../libspeex/smallft.c; sourceTree = SOURCE_ROOT; }; 73814B470907FC9900C478FC /* smallft.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = smallft.h; path = ../libspeex/smallft.h; sourceTree = SOURCE_ROOT; }; 73814B480907FC9900C478FC /* speex_callbacks.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = speex_callbacks.c; path = ../libspeex/speex_callbacks.c; sourceTree = SOURCE_ROOT; }; 73814B490907FC9900C478FC /* speex_header.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = speex_header.c; path = ../libspeex/speex_header.c; sourceTree = SOURCE_ROOT; }; 73814B4A0907FC9900C478FC /* speex.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = speex.c; path = ../libspeex/speex.c; sourceTree = SOURCE_ROOT; }; 73814B4B0907FC9900C478FC /* stack_alloc.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = stack_alloc.h; path = ../libspeex/stack_alloc.h; sourceTree = SOURCE_ROOT; }; 73814B4C0907FC9900C478FC /* stereo.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = stereo.c; path = ../libspeex/stereo.c; sourceTree = SOURCE_ROOT; }; 73814B4F0907FC9900C478FC /* testenc_uwb.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = testenc_uwb.c; path = ../libspeex/testenc_uwb.c; sourceTree = SOURCE_ROOT; }; 73814B500907FC9900C478FC /* testenc_wb.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = testenc_wb.c; path = ../libspeex/testenc_wb.c; sourceTree = SOURCE_ROOT; }; 73814B510907FC9900C478FC /* testenc.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = testenc.c; path = ../libspeex/testenc.c; sourceTree = SOURCE_ROOT; }; 73814B520907FC9900C478FC /* vbr.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = vbr.c; path = ../libspeex/vbr.c; sourceTree = SOURCE_ROOT; }; 73814B530907FC9900C478FC /* vbr.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = vbr.h; path = ../libspeex/vbr.h; sourceTree = SOURCE_ROOT; }; 73814B540907FC9900C478FC /* vq_arm4.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = vq_arm4.h; path = ../libspeex/vq_arm4.h; sourceTree = SOURCE_ROOT; }; 73814B550907FC9900C478FC /* vq_bfin.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = vq_bfin.h; path = ../libspeex/vq_bfin.h; sourceTree = SOURCE_ROOT; }; 73814B560907FC9900C478FC /* vq_sse.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = vq_sse.h; path = ../libspeex/vq_sse.h; sourceTree = SOURCE_ROOT; }; 73814B570907FC9900C478FC /* vq.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = vq.c; path = ../libspeex/vq.c; sourceTree = SOURCE_ROOT; }; 73814B580907FC9900C478FC /* vq.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = vq.h; path = ../libspeex/vq.h; sourceTree = SOURCE_ROOT; }; 738837460B193581005C7A69 /* _kiss_fft_guts.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = _kiss_fft_guts.h; path = ../libspeex/_kiss_fft_guts.h; sourceTree = SOURCE_ROOT; }; 738837470B193581005C7A69 /* fftwrap.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = fftwrap.c; path = ../libspeex/fftwrap.c; sourceTree = SOURCE_ROOT; }; 738837480B193581005C7A69 /* fftwrap.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = fftwrap.h; path = ../libspeex/fftwrap.h; sourceTree = SOURCE_ROOT; }; 7388374B0B193581005C7A69 /* kiss_fft.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = kiss_fft.c; path = ../libspeex/kiss_fft.c; sourceTree = SOURCE_ROOT; }; 7388374C0B193581005C7A69 /* kiss_fft.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = kiss_fft.h; path = ../libspeex/kiss_fft.h; sourceTree = SOURCE_ROOT; }; 7388374D0B193581005C7A69 /* kiss_fftr.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = kiss_fftr.c; path = ../libspeex/kiss_fftr.c; sourceTree = SOURCE_ROOT; }; 7388374E0B193581005C7A69 /* kiss_fftr.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = kiss_fftr.h; path = ../libspeex/kiss_fftr.h; sourceTree = SOURCE_ROOT; }; 7388374F0B193581005C7A69 /* lsp_bfin.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = lsp_bfin.h; path = ../libspeex/lsp_bfin.h; sourceTree = SOURCE_ROOT; }; 738837500B193581005C7A69 /* pseudofloat.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = pseudofloat.h; path = ../libspeex/pseudofloat.h; sourceTree = SOURCE_ROOT; }; 738837510B193581005C7A69 /* quant_lsp_bfin.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = quant_lsp_bfin.h; path = ../libspeex/quant_lsp_bfin.h; sourceTree = SOURCE_ROOT; }; 738837520B193581005C7A69 /* vorbis_psy.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = vorbis_psy.c; path = ../libspeex/vorbis_psy.c; sourceTree = SOURCE_ROOT; }; 738837530B193581005C7A69 /* vorbis_psy.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = vorbis_psy.h; path = ../libspeex/vorbis_psy.h; sourceTree = SOURCE_ROOT; }; 738837770B193667005C7A69 /* libspeex.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libspeex.a; sourceTree = BUILT_PRODUCTS_DIR; }; 8D07F2C70486CC7A007CD1D0 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 8D07F2C80486CC7A007CD1D0 /* Speex.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Speex.framework; sourceTree = BUILT_PRODUCTS_DIR; }; BFF73DCF0A78AA170078A4A8 /* window.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = window.c; path = ../libspeex/window.c; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 738837750B193667005C7A69 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 8D07F2C30486CC7A007CD1D0 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 034768DDFF38A45A11DB9C8B /* Products */ = { isa = PBXGroup; children = ( 8D07F2C80486CC7A007CD1D0 /* Speex.framework */, 738837770B193667005C7A69 /* libspeex.a */, ); name = Products; sourceTree = ""; }; 0867D691FE84028FC02AAC07 /* Speex */ = { isa = PBXGroup; children = ( 08FB77ACFE841707C02AAC07 /* Source */, 73814AEB0907FB6400C478FC /* Headers */, 089C1665FE841158C02AAC07 /* Resources */, 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */, 034768DDFF38A45A11DB9C8B /* Products */, ); name = Speex; sourceTree = ""; }; 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */ = { isa = PBXGroup; children = ( ); name = "External Frameworks and Libraries"; sourceTree = ""; }; 089C1665FE841158C02AAC07 /* Resources */ = { isa = PBXGroup; children = ( 8D07F2C70486CC7A007CD1D0 /* Info.plist */, 089C1666FE841158C02AAC07 /* InfoPlist.strings */, ); name = Resources; sourceTree = ""; }; 08FB77ACFE841707C02AAC07 /* Source */ = { isa = PBXGroup; children = ( 37CA8DFF0DD7352A005C8CB6 /* os_support.h */, 37CA8DEA0DD73333005C8CB6 /* modes_wb.c */, 738837460B193581005C7A69 /* _kiss_fft_guts.h */, 738837470B193581005C7A69 /* fftwrap.c */, 738837480B193581005C7A69 /* fftwrap.h */, 7388374B0B193581005C7A69 /* kiss_fft.c */, 7388374C0B193581005C7A69 /* kiss_fft.h */, 7388374D0B193581005C7A69 /* kiss_fftr.c */, 7388374E0B193581005C7A69 /* kiss_fftr.h */, 7388374F0B193581005C7A69 /* lsp_bfin.h */, 738837500B193581005C7A69 /* pseudofloat.h */, 738837510B193581005C7A69 /* quant_lsp_bfin.h */, 738837520B193581005C7A69 /* vorbis_psy.c */, 738837530B193581005C7A69 /* vorbis_psy.h */, 73814B0C0907FC9900C478FC /* arch.h */, 73814B0D0907FC9900C478FC /* bits.c */, 73814B0E0907FC9900C478FC /* cb_search_arm4.h */, 73814B0F0907FC9900C478FC /* cb_search_bfin.h */, 73814B100907FC9900C478FC /* cb_search_sse.h */, BFF73DCF0A78AA170078A4A8 /* window.c */, 73814B110907FC9900C478FC /* cb_search.c */, 73814B120907FC9900C478FC /* cb_search.h */, 73814B130907FC9900C478FC /* exc_5_64_table.c */, 73814B140907FC9900C478FC /* exc_5_256_table.c */, 73814B150907FC9900C478FC /* exc_8_128_table.c */, 73814B160907FC9900C478FC /* exc_10_16_table.c */, 73814B170907FC9900C478FC /* exc_10_32_table.c */, 73814B180907FC9900C478FC /* exc_20_32_table.c */, 73814B190907FC9900C478FC /* filters_arm4.h */, 73814B1A0907FC9900C478FC /* filters_bfin.h */, 73814B1B0907FC9900C478FC /* filters_sse.h */, 73814B1C0907FC9900C478FC /* filters.c */, 73814B1D0907FC9900C478FC /* filters.h */, 73814B1E0907FC9900C478FC /* fixed_arm4.h */, 73814B1F0907FC9900C478FC /* fixed_arm5e.h */, 73814B200907FC9900C478FC /* fixed_bfin.h */, 73814B210907FC9900C478FC /* fixed_debug.h */, 73814B220907FC9900C478FC /* fixed_generic.h */, 73814B230907FC9900C478FC /* gain_table_lbr.c */, 73814B240907FC9900C478FC /* gain_table.c */, 73814B250907FC9900C478FC /* hexc_10_32_table.c */, 73814B260907FC9900C478FC /* hexc_table.c */, 73814B270907FC9900C478FC /* high_lsp_tables.c */, 73814B2A0907FC9900C478FC /* lpc_bfin.h */, 73814B2B0907FC9900C478FC /* lpc.c */, 73814B2C0907FC9900C478FC /* lpc.h */, 73814B2D0907FC9900C478FC /* lsp_tables_nb.c */, 73814B2E0907FC9900C478FC /* lsp.c */, 73814B2F0907FC9900C478FC /* lsp.h */, 73814B300907FC9900C478FC /* ltp_arm4.h */, 73814B310907FC9900C478FC /* ltp_bfin.h */, 73814B320907FC9900C478FC /* ltp_sse.h */, 73814B330907FC9900C478FC /* ltp.c */, 73814B340907FC9900C478FC /* ltp.h */, 73814B380907FC9900C478FC /* math_approx.h */, 73814B3A0907FC9900C478FC /* misc_bfin.h */, 73814B3D0907FC9900C478FC /* modes.c */, 73814B3E0907FC9900C478FC /* modes.h */, 73814B3F0907FC9900C478FC /* nb_celp.c */, 73814B400907FC9900C478FC /* nb_celp.h */, 73814B420907FC9900C478FC /* quant_lsp.c */, 73814B430907FC9900C478FC /* quant_lsp.h */, 73814B440907FC9900C478FC /* sb_celp.c */, 73814B450907FC9900C478FC /* sb_celp.h */, 73814B460907FC9900C478FC /* smallft.c */, 73814B470907FC9900C478FC /* smallft.h */, 73814B480907FC9900C478FC /* speex_callbacks.c */, 73814B490907FC9900C478FC /* speex_header.c */, 73814B4A0907FC9900C478FC /* speex.c */, 73814B4B0907FC9900C478FC /* stack_alloc.h */, 73814B4C0907FC9900C478FC /* stereo.c */, 73814B4F0907FC9900C478FC /* testenc_uwb.c */, 73814B500907FC9900C478FC /* testenc_wb.c */, 73814B510907FC9900C478FC /* testenc.c */, 73814B520907FC9900C478FC /* vbr.c */, 73814B530907FC9900C478FC /* vbr.h */, 73814B540907FC9900C478FC /* vq_arm4.h */, 73814B550907FC9900C478FC /* vq_bfin.h */, 73814B560907FC9900C478FC /* vq_sse.h */, 73814B570907FC9900C478FC /* vq.c */, 73814B580907FC9900C478FC /* vq.h */, 32BAE0B70371A74B00C91783 /* Speex_Prefix.pch */, ); name = Source; sourceTree = ""; }; 73814AEB0907FB6400C478FC /* Headers */ = { isa = PBXGroup; children = ( 73814AEC0907FB8200C478FC /* speex */, ); name = Headers; sourceTree = ""; }; 73814AEC0907FB8200C478FC /* speex */ = { isa = PBXGroup; children = ( 73814AEF0907FB8200C478FC /* speex.h */, 73814AF00907FB8200C478FC /* speex_bits.h */, 73814AF10907FB8200C478FC /* speex_callbacks.h */, 73814AF40907FB8200C478FC /* speex_header.h */, 73814AF70907FB8200C478FC /* speex_stereo.h */, 73814AF80907FB8200C478FC /* speex_types.h */, ); name = speex; path = ../include/speex; sourceTree = SOURCE_ROOT; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ 738837730B193667005C7A69 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 8D07F2BD0486CC7A007CD1D0 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 73814B000907FB8200C478FC /* speex_header.h in Headers */, 73814B030907FB8200C478FC /* speex_stereo.h in Headers */, 73814B040907FB8200C478FC /* speex_types.h in Headers */, 73814B060907FBAB00C478FC /* speex_callbacks.h in Headers */, 73814B070907FBAD00C478FC /* speex_bits.h in Headers */, 73814B080907FBAE00C478FC /* speex.h in Headers */, 738837540B193581005C7A69 /* _kiss_fft_guts.h in Headers */, 738837560B193581005C7A69 /* fftwrap.h in Headers */, 7388375A0B193581005C7A69 /* kiss_fft.h in Headers */, 7388375C0B193581005C7A69 /* kiss_fftr.h in Headers */, 7388375D0B193581005C7A69 /* lsp_bfin.h in Headers */, 7388375E0B193581005C7A69 /* pseudofloat.h in Headers */, 7388375F0B193581005C7A69 /* quant_lsp_bfin.h in Headers */, 738837610B193581005C7A69 /* vorbis_psy.h in Headers */, 37CA8E000DD7352A005C8CB6 /* os_support.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ 738837760B193667005C7A69 /* libspeex (static) */ = { isa = PBXNativeTarget; buildConfigurationList = 738837780B193687005C7A69 /* Build configuration list for PBXNativeTarget "libspeex (static)" */; buildPhases = ( 738837730B193667005C7A69 /* Headers */, 738837740B193667005C7A69 /* Sources */, 738837750B193667005C7A69 /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = "libspeex (static)"; productName = speex; productReference = 738837770B193667005C7A69 /* libspeex.a */; productType = "com.apple.product-type.library.static"; }; 8D07F2BC0486CC7A007CD1D0 /* Speex */ = { isa = PBXNativeTarget; buildConfigurationList = 73814ADF0907FB1E00C478FC /* Build configuration list for PBXNativeTarget "Speex" */; buildPhases = ( 8D07F2BD0486CC7A007CD1D0 /* Headers */, 8D07F2BF0486CC7A007CD1D0 /* Resources */, 8D07F2C10486CC7A007CD1D0 /* Sources */, 8D07F2C30486CC7A007CD1D0 /* Frameworks */, 8D07F2C50486CC7A007CD1D0 /* Rez */, ); buildRules = ( ); dependencies = ( ); name = Speex; productInstallPath = "$(HOME)/Library/Frameworks"; productName = Speex; productReference = 8D07F2C80486CC7A007CD1D0 /* Speex.framework */; productType = "com.apple.product-type.framework"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 0867D690FE84028FC02AAC07 /* Project object */ = { isa = PBXProject; buildConfigurationList = 73814AE30907FB1E00C478FC /* Build configuration list for PBXProject "Speex" */; compatibilityVersion = "Xcode 2.4"; hasScannedForEncodings = 1; mainGroup = 0867D691FE84028FC02AAC07 /* Speex */; productRefGroup = 034768DDFF38A45A11DB9C8B /* Products */; projectDirPath = ""; projectRoot = ..; targets = ( 8D07F2BC0486CC7A007CD1D0 /* Speex */, 738837760B193667005C7A69 /* libspeex (static) */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 8D07F2BF0486CC7A007CD1D0 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 8D07F2C00486CC7A007CD1D0 /* InfoPlist.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXRezBuildPhase section */ 8D07F2C50486CC7A007CD1D0 /* Rez */ = { isa = PBXRezBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXRezBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 738837740B193667005C7A69 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 7388377B0B193784005C7A69 /* bits.c in Sources */, 7388377C0B193785005C7A69 /* cb_search.c in Sources */, 7388377D0B193788005C7A69 /* exc_10_16_table.c in Sources */, 7388377E0B193789005C7A69 /* exc_10_32_table.c in Sources */, 7388377F0B19378A005C7A69 /* exc_20_32_table.c in Sources */, 738837800B19378A005C7A69 /* exc_5_256_table.c in Sources */, 738837810B19378C005C7A69 /* exc_5_64_table.c in Sources */, 738837820B19378E005C7A69 /* exc_8_128_table.c in Sources */, 738837830B193791005C7A69 /* fftwrap.c in Sources */, 738837850B193793005C7A69 /* filters.c in Sources */, 738837860B193795005C7A69 /* gain_table.c in Sources */, 738837870B193796005C7A69 /* gain_table_lbr.c in Sources */, 738837880B193799005C7A69 /* hexc_10_32_table.c in Sources */, 738837890B19379B005C7A69 /* hexc_table.c in Sources */, 7388378A0B19379E005C7A69 /* high_lsp_tables.c in Sources */, 7388378C0B1937A4005C7A69 /* kiss_fft.c in Sources */, 7388378D0B1937A9005C7A69 /* kiss_fftr.c in Sources */, 7388378F0B1937B0005C7A69 /* lpc.c in Sources */, 738837900B1937B0005C7A69 /* lsp.c in Sources */, 738837910B1937B5005C7A69 /* lsp_tables_nb.c in Sources */, 738837920B1937B7005C7A69 /* ltp.c in Sources */, 738837960B1937BE005C7A69 /* modes.c in Sources */, 738837970B1937C0005C7A69 /* nb_celp.c in Sources */, 738837990B1937C4005C7A69 /* quant_lsp.c in Sources */, 7388379A0B1937C6005C7A69 /* sb_celp.c in Sources */, 7388379B0B1937C9005C7A69 /* smallft.c in Sources */, 7388379C0B1937CB005C7A69 /* speex.c in Sources */, 7388379D0B1937CE005C7A69 /* speex_callbacks.c in Sources */, 7388379E0B1937D0005C7A69 /* speex_header.c in Sources */, 7388379F0B1937D1005C7A69 /* stereo.c in Sources */, 738837A00B1937DA005C7A69 /* vbr.c in Sources */, 738837A10B1937DD005C7A69 /* vorbis_psy.c in Sources */, 738837A20B1937DF005C7A69 /* vq.c in Sources */, 738837A30B1937E1005C7A69 /* window.c in Sources */, 37CA8DEC0DD73333005C8CB6 /* modes_wb.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 8D07F2C10486CC7A007CD1D0 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 73814B5A0907FC9900C478FC /* bits.c in Sources */, 73814B5E0907FC9900C478FC /* cb_search.c in Sources */, 73814B600907FC9900C478FC /* exc_5_64_table.c in Sources */, 73814B610907FC9900C478FC /* exc_5_256_table.c in Sources */, 73814B620907FC9900C478FC /* exc_8_128_table.c in Sources */, 73814B630907FC9900C478FC /* exc_10_16_table.c in Sources */, 73814B640907FC9900C478FC /* exc_10_32_table.c in Sources */, 73814B650907FC9900C478FC /* exc_20_32_table.c in Sources */, 73814B690907FC9900C478FC /* filters.c in Sources */, 73814B700907FC9900C478FC /* gain_table_lbr.c in Sources */, 73814B710907FC9900C478FC /* gain_table.c in Sources */, 73814B720907FC9900C478FC /* hexc_10_32_table.c in Sources */, 73814B730907FC9900C478FC /* hexc_table.c in Sources */, 73814B740907FC9900C478FC /* high_lsp_tables.c in Sources */, 73814B780907FC9900C478FC /* lpc.c in Sources */, 73814B7A0907FC9900C478FC /* lsp_tables_nb.c in Sources */, 73814B7B0907FC9900C478FC /* lsp.c in Sources */, 73814B800907FC9900C478FC /* ltp.c in Sources */, 73814B8A0907FC9900C478FC /* modes.c in Sources */, 73814B8C0907FC9900C478FC /* nb_celp.c in Sources */, 73814B8F0907FC9900C478FC /* quant_lsp.c in Sources */, 73814B910907FC9900C478FC /* sb_celp.c in Sources */, 73814B930907FC9900C478FC /* smallft.c in Sources */, 73814B950907FC9900C478FC /* speex_callbacks.c in Sources */, 73814B960907FC9900C478FC /* speex_header.c in Sources */, 73814B970907FC9900C478FC /* speex.c in Sources */, 73814B990907FC9900C478FC /* stereo.c in Sources */, 73814B9F0907FC9900C478FC /* vbr.c in Sources */, 73814BA40907FC9900C478FC /* vq.c in Sources */, BFF73DD00A78AA170078A4A8 /* window.c in Sources */, 738837550B193581005C7A69 /* fftwrap.c in Sources */, 738837590B193581005C7A69 /* kiss_fft.c in Sources */, 7388375B0B193581005C7A69 /* kiss_fftr.c in Sources */, 738837600B193581005C7A69 /* vorbis_psy.c in Sources */, 37CA8DEB0DD73333005C8CB6 /* modes_wb.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ 089C1666FE841158C02AAC07 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( 089C1667FE841158C02AAC07 /* English */, ); name = InfoPlist.strings; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 73814AE00907FB1E00C478FC /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { COPY_PHASE_STRIP = NO; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; FRAMEWORK_VERSION = A; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = Speex_Prefix.pch; INFOPLIST_FILE = Info.plist; INSTALL_PATH = /Library/Frameworks; LIBRARY_STYLE = DYNAMIC; MACH_O_TYPE = mh_dylib; PRODUCT_NAME = Speex; WRAPPER_EXTENSION = framework; ZERO_LINK = YES; }; name = Debug; }; 73814AE10907FB1E00C478FC /* Release */ = { isa = XCBuildConfiguration; buildSettings = { COPY_PHASE_STRIP = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; FRAMEWORK_VERSION = A; GCC_ENABLE_FIX_AND_CONTINUE = NO; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = Speex_Prefix.pch; INFOPLIST_FILE = Info.plist; INSTALL_PATH = /Library/Frameworks; LIBRARY_STYLE = DYNAMIC; MACH_O_TYPE = mh_dylib; PRODUCT_NAME = Speex; WRAPPER_EXTENSION = framework; ZERO_LINK = NO; }; name = Release; }; 73814AE40907FB1E00C478FC /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", __MACOSX__, FLOATING_POINT, "$(GCC_PREPROCESSOR_DEFINITIONS_QUOTED_FOR_PROJECT_1)", ); GCC_PREPROCESSOR_DEFINITIONS_QUOTED_FOR_PROJECT_1 = "EXPORT=__attribute__((visibility(\\\"default\\\")))"; SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; }; name = Debug; }; 73814AE50907FB1E00C478FC /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ( ppc, i386, ); GCC_OPTIMIZATION_LEVEL = 3; GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", __MACOSX__, FLOATING_POINT, "$(GCC_PREPROCESSOR_DEFINITIONS_QUOTED_FOR_PROJECT_1)", ); GCC_PREPROCESSOR_DEFINITIONS_QUOTED_FOR_PROJECT_1 = "EXPORT=__attribute__((visibility(\\\"default\\\")))"; OTHER_CFLAGS = ( "$(OTHER_CFLAGS)", "-falign-loops=16", ); SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; }; name = Release; }; 738837790B193687005C7A69 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; GCC_OPTIMIZATION_LEVEL = 0; INSTALL_PATH = /usr/local/lib; PREBINDING = NO; PRODUCT_NAME = speex; ZERO_LINK = YES; }; name = Debug; }; 7388377A0B193687005C7A69 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { COPY_PHASE_STRIP = YES; GCC_ENABLE_FIX_AND_CONTINUE = NO; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; INSTALL_PATH = /usr/local/lib; PREBINDING = NO; PRODUCT_NAME = speex; ZERO_LINK = NO; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 73814ADF0907FB1E00C478FC /* Build configuration list for PBXNativeTarget "Speex" */ = { isa = XCConfigurationList; buildConfigurations = ( 73814AE00907FB1E00C478FC /* Debug */, 73814AE10907FB1E00C478FC /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 73814AE30907FB1E00C478FC /* Build configuration list for PBXProject "Speex" */ = { isa = XCConfigurationList; buildConfigurations = ( 73814AE40907FB1E00C478FC /* Debug */, 73814AE50907FB1E00C478FC /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 738837780B193687005C7A69 /* Build configuration list for PBXNativeTarget "libspeex (static)" */ = { isa = XCConfigurationList; buildConfigurations = ( 738837790B193687005C7A69 /* Debug */, 7388377A0B193687005C7A69 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 0867D690FE84028FC02AAC07 /* Project object */; } mumble-1.3.4/3rdparty/speex-src/macosx/Speex_Prefix.pch0000664000175000017500000000016614010707304022707 0ustar builderbuilder// // Prefix header for all source files of the 'Speex' target in the 'Speex' project. // #include mumble-1.3.4/3rdparty/speex-src/macosx/English.lproj/0000775000175000017500000000000014010707304022325 5ustar builderbuildermumble-1.3.4/3rdparty/speex-src/macosx/English.lproj/InfoPlist.strings0000664000175000017500000000021414010707304025644 0ustar builderbuilder/* Localized versions of Info.plist keys */ CFBundleName = "Speex"; mumble-1.3.4/3rdparty/speex-src/macosx/Info.plist0000664000175000017500000000176414010707304021567 0ustar builderbuilder CFBundleDevelopmentRegion English CFBundleExecutable Speex CFBundleGetInfoString Speex framework 1.1.12svn, Copyright © 2002-2006 Xiph.Org Foundation CFBundleIconFile CFBundleIdentifier org.xiph.speex CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType FMWK CFBundleShortVersionString 1.1.12svn CFBundleSignature ???? CFBundleVersion 1.1.12d1 NSHumanReadableCopyright Speex framework 1.1.12svn, Copyright © 2002-2006 Xiph.Org Foundation CSResourcesFileMapped mumble-1.3.4/3rdparty/speex-src/README.blackfin0000664000175000017500000000126314010707304020747 0ustar builderbuilderSpeex has been ported to the Blackfin DSP, for the STAMP development board. This port has been tested on the STAMP development board and requires the toolchain available at http://blackfin.uclinux.org/ 1/ In order to cross-compile for uClinux from the Speex tarball: ./configure --enable-blackfin-asm --enable-fixed-point --host=bfin-uclinux cd libspeex make The --enable-blackfin-asm option is not required, but it speeds up Speex by approximately a factor of two. 2/ In order to cross-compile for uClinux from the Speex Git: git clone git://git.xiph.org/speex.git cd speex ./autogen.sh --enable-blackfin-asm --enable-fixed-point --host=bfin-uclinux cd libspeex make mumble-1.3.4/3rdparty/speex-src/libspeex/0000775000175000017500000000000014010707304020130 5ustar builderbuildermumble-1.3.4/3rdparty/speex-src/libspeex/lsp.c0000664000175000017500000004336314010707304021103 0ustar builderbuilder/*---------------------------------------------------------------------------*\ Original copyright FILE........: lsp.c AUTHOR......: David Rowe DATE CREATED: 24/2/93 Heavily modified by Jean-Marc Valin (c) 2002-2006 (fixed-point, optimizations, additional functions, ...) This file contains functions for converting Linear Prediction Coefficients (LPC) to Line Spectral Pair (LSP) and back. Note that the LSP coefficients are not in radians format but in the x domain of the unit circle. Speex License: Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /*---------------------------------------------------------------------------*\ Introduction to Line Spectrum Pairs (LSPs) ------------------------------------------ LSPs are used to encode the LPC filter coefficients {ak} for transmission over the channel. LSPs have several properties (like less sensitivity to quantisation noise) that make them superior to direct quantisation of {ak}. A(z) is a polynomial of order lpcrdr with {ak} as the coefficients. A(z) is transformed to P(z) and Q(z) (using a substitution and some algebra), to obtain something like: A(z) = 0.5[P(z)(z+z^-1) + Q(z)(z-z^-1)] (1) As you can imagine A(z) has complex zeros all over the z-plane. P(z) and Q(z) have the very neat property of only having zeros _on_ the unit circle. So to find them we take a test point z=exp(jw) and evaluate P (exp(jw)) and Q(exp(jw)) using a grid of points between 0 and pi. The zeros (roots) of P(z) also happen to alternate, which is why we swap coefficients as we find roots. So the process of finding the LSP frequencies is basically finding the roots of 5th order polynomials. The root so P(z) and Q(z) occur in symmetrical pairs at +/-w, hence the name Line Spectrum Pairs (LSPs). To convert back to ak we just evaluate (1), "clocking" an impulse thru it lpcrdr times gives us the impulse response of A(z) which is {ak}. \*---------------------------------------------------------------------------*/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "lsp.h" #include "stack_alloc.h" #include "math_approx.h" #ifndef M_PI #define M_PI 3.14159265358979323846 /* pi */ #endif #ifndef NULL #define NULL 0 #endif #ifdef FIXED_POINT #define FREQ_SCALE 16384 /*#define ANGLE2X(a) (32768*cos(((a)/8192.)))*/ #define ANGLE2X(a) (SHL16(spx_cos(a),2)) /*#define X2ANGLE(x) (acos(.00006103515625*(x))*LSP_SCALING)*/ #define X2ANGLE(x) (spx_acos(x)) #ifdef BFIN_ASM #include "lsp_bfin.h" #endif #else /*#define C1 0.99940307 #define C2 -0.49558072 #define C3 0.03679168*/ #define FREQ_SCALE 1. #define ANGLE2X(a) (spx_cos(a)) #define X2ANGLE(x) (acos(x)) #endif #ifndef DISABLE_ENCODER /*---------------------------------------------------------------------------*\ FUNCTION....: cheb_poly_eva() AUTHOR......: David Rowe DATE CREATED: 24/2/93 This function evaluates a series of Chebyshev polynomials \*---------------------------------------------------------------------------*/ #ifdef FIXED_POINT #ifndef OVERRIDE_CHEB_POLY_EVA static inline spx_word32_t cheb_poly_eva( spx_word16_t *coef, /* P or Q coefs in Q13 format */ spx_word16_t x, /* cos of freq (-1.0 to 1.0) in Q14 format */ int m, /* LPC order/2 */ char *stack ) { int i; spx_word16_t b0, b1; spx_word32_t sum; /*Prevents overflows*/ if (x>16383) x = 16383; if (x<-16383) x = -16383; /* Initialise values */ b1=16384; b0=x; /* Evaluate Chebyshev series formulation usin g iterative approach */ sum = ADD32(EXTEND32(coef[m]), EXTEND32(MULT16_16_P14(coef[m-1],x))); for(i=2;i<=m;i++) { spx_word16_t tmp=b0; b0 = SUB16(MULT16_16_Q13(x,b0), b1); b1 = tmp; sum = ADD32(sum, EXTEND32(MULT16_16_P14(coef[m-i],b0))); } return sum; } #endif #else static float cheb_poly_eva(spx_word32_t *coef, spx_word16_t x, int m, char *stack) { int k; float b0, b1, tmp; /* Initial conditions */ b0=0; /* b_(m+1) */ b1=0; /* b_(m+2) */ x*=2; /* Calculate the b_(k) */ for(k=m;k>0;k--) { tmp=b0; /* tmp holds the previous value of b0 */ b0=x*b0-b1+coef[m-k]; /* b0 holds its new value based on b0 and b1 */ b1=tmp; /* b1 holds the previous value of b0 */ } return(-b1+.5*x*b0+coef[m]); } #endif /*---------------------------------------------------------------------------*\ FUNCTION....: lpc_to_lsp() AUTHOR......: David Rowe DATE CREATED: 24/2/93 This function converts LPC coefficients to LSP coefficients. \*---------------------------------------------------------------------------*/ #ifdef FIXED_POINT #define SIGN_CHANGE(a,b) ((((a)^(b))&0x80000000)||(b==0)) #else #define SIGN_CHANGE(a,b) (((a)*(b))<0.0) #endif int lpc_to_lsp (spx_coef_t *a,int lpcrdr,spx_lsp_t *freq,int nb,spx_word16_t delta, char *stack) /* float *a lpc coefficients */ /* int lpcrdr order of LPC coefficients (10) */ /* float *freq LSP frequencies in the x domain */ /* int nb number of sub-intervals (4) */ /* float delta grid spacing interval (0.02) */ { spx_word16_t temp_xr,xl,xr,xm=0; spx_word32_t psuml,psumr,psumm,temp_psumr/*,temp_qsumr*/; int i,j,m,flag,k; VARDECL(spx_word32_t *Q); /* ptrs for memory allocation */ VARDECL(spx_word32_t *P); VARDECL(spx_word16_t *Q16); /* ptrs for memory allocation */ VARDECL(spx_word16_t *P16); spx_word32_t *px; /* ptrs of respective P'(z) & Q'(z) */ spx_word32_t *qx; spx_word32_t *p; spx_word32_t *q; spx_word16_t *pt; /* ptr used for cheb_poly_eval() whether P' or Q' */ int roots=0; /* DR 8/2/94: number of roots found */ flag = 1; /* program is searching for a root when, 1 else has found one */ m = lpcrdr/2; /* order of P'(z) & Q'(z) polynomials */ /* Allocate memory space for polynomials */ ALLOC(Q, (m+1), spx_word32_t); ALLOC(P, (m+1), spx_word32_t); /* determine P'(z)'s and Q'(z)'s coefficients where P'(z) = P(z)/(1 + z^(-1)) and Q'(z) = Q(z)/(1-z^(-1)) */ px = P; /* initialise ptrs */ qx = Q; p = px; q = qx; #ifdef FIXED_POINT *px++ = LPC_SCALING; *qx++ = LPC_SCALING; for(i=0;i=32768) speex_warning_int("px", *px); if (fabs(*qx)>=32768) speex_warning_int("qx", *qx);*/ *px = PSHR32(*px,2); *qx = PSHR32(*qx,2); px++; qx++; } /* The reason for this lies in the way cheb_poly_eva() is implemented for fixed-point */ P[m] = PSHR32(P[m],3); Q[m] = PSHR32(Q[m],3); #else *px++ = LPC_SCALING; *qx++ = LPC_SCALING; for(i=0;i= -FREQ_SCALE){ spx_word16_t dd; /* Modified by JMV to provide smaller steps around x=+-1 */ #ifdef FIXED_POINT dd = MULT16_16_Q15(delta,SUB16(FREQ_SCALE, MULT16_16_Q14(MULT16_16_Q14(xl,xl),14000))); if (psuml<512 && psuml>-512) dd = PSHR16(dd,1); #else dd=delta*(1-.9*xl*xl); if (fabs(psuml)<.2) dd *= .5; #endif xr = SUB16(xl, dd); /* interval spacing */ psumr = cheb_poly_eva(pt,xr,m,stack);/* poly(xl-delta_x) */ temp_psumr = psumr; temp_xr = xr; /* if no sign change increment xr and re-evaluate poly(xr). Repeat til sign change. if a sign change has occurred the interval is bisected and then checked again for a sign change which determines in which interval the zero lies in. If there is no sign change between poly(xm) and poly(xl) set interval between xm and xr else set interval between xl and xr and repeat till root is located within the specified limits */ if(SIGN_CHANGE(psumr,psuml)) { roots++; psumm=psuml; for(k=0;k<=nb;k++){ #ifdef FIXED_POINT xm = ADD16(PSHR16(xl,1),PSHR16(xr,1)); /* bisect the interval */ #else xm = .5*(xl+xr); /* bisect the interval */ #endif psumm=cheb_poly_eva(pt,xm,m,stack); /*if(psumm*psuml>0.)*/ if(!SIGN_CHANGE(psumm,psuml)) { psuml=psumm; xl=xm; } else { psumr=psumm; xr=xm; } } /* once zero is found, reset initial interval to xr */ freq[j] = X2ANGLE(xm); xl = xm; break; /* reset flag for next search */ } else{ psuml=temp_psumr; xl=temp_xr; } } } return(roots); } #endif /* DISABLE_ENCODER */ /*---------------------------------------------------------------------------*\ FUNCTION....: lsp_to_lpc() AUTHOR......: David Rowe DATE CREATED: 24/2/93 Converts LSP coefficients to LPC coefficients. \*---------------------------------------------------------------------------*/ #ifdef FIXED_POINT void lsp_to_lpc(const spx_lsp_t *freq,spx_coef_t *ak,int lpcrdr, char *stack) /* float *freq array of LSP frequencies in the x domain */ /* float *ak array of LPC coefficients */ /* int lpcrdr order of LPC coefficients */ { int i,j; spx_word32_t xout1,xout2,xin; spx_word32_t mult, a; VARDECL(spx_word16_t *freqn); VARDECL(spx_word32_t **xp); VARDECL(spx_word32_t *xpmem); VARDECL(spx_word32_t **xq); VARDECL(spx_word32_t *xqmem); int m = lpcrdr>>1; /* Reconstruct P(z) and Q(z) by cascading second order polynomials in form 1 - 2cos(w)z(-1) + z(-2), where w is the LSP frequency. In the time domain this is: y(n) = x(n) - 2cos(w)x(n-1) + x(n-2) This is what the ALLOCS below are trying to do: int xp[m+1][lpcrdr+1+2]; // P matrix in QIMP int xq[m+1][lpcrdr+1+2]; // Q matrix in QIMP These matrices store the output of each stage on each row. The final (m-th) row has the output of the final (m-th) cascaded 2nd order filter. The first row is the impulse input to the system (not written as it is known). The version below takes advantage of the fact that a lot of the outputs are zero or known, for example if we put an inpulse into the first section the "clock" it 10 times only the first 3 outputs samples are non-zero (it's an FIR filter). */ ALLOC(xp, (m+1), spx_word32_t*); ALLOC(xpmem, (m+1)*(lpcrdr+1+2), spx_word32_t); ALLOC(xq, (m+1), spx_word32_t*); ALLOC(xqmem, (m+1)*(lpcrdr+1+2), spx_word32_t); for(i=0; i<=m; i++) { xp[i] = xpmem + i*(lpcrdr+1+2); xq[i] = xqmem + i*(lpcrdr+1+2); } /* work out 2cos terms in Q14 */ ALLOC(freqn, lpcrdr, spx_word16_t); for (i=0;i 32767) a = 32767; ak[j-1] = (short)a; } } #else void lsp_to_lpc(const spx_lsp_t *freq,spx_coef_t *ak,int lpcrdr, char *stack) /* float *freq array of LSP frequencies in the x domain */ /* float *ak array of LPC coefficients */ /* int lpcrdr order of LPC coefficients */ { int i,j; float xout1,xout2,xin1,xin2; VARDECL(float *Wp); float *pw,*n1,*n2,*n3,*n4=NULL; VARDECL(float *x_freq); int m = lpcrdr>>1; ALLOC(Wp, 4*m+2, float); pw = Wp; /* initialise contents of array */ for(i=0;i<=4*m+1;i++){ /* set contents of buffer to 0 */ *pw++ = 0.0; } /* Set pointers up */ pw = Wp; xin1 = 1.0; xin2 = 1.0; ALLOC(x_freq, lpcrdr, float); for (i=0;i0) ak[j-1] = (xout1 + xout2)*0.5f; *(n4+1) = xin1; *(n4+2) = xin2; xin1 = 0.0; xin2 = 0.0; } } #endif #ifdef FIXED_POINT void lsp_interpolate(spx_lsp_t *old_lsp, spx_lsp_t *new_lsp, spx_lsp_t *lsp, int len, int subframe, int nb_subframes, spx_word16_t margin) { int i; spx_word16_t m = margin; spx_word16_t m2 = 25736-margin; spx_word16_t tmp = DIV32_16(SHL32(EXTEND32(1 + subframe),14),nb_subframes); spx_word16_t tmp2 = 16384-tmp; for (i=0;im2) lsp[len-1]=m2; for (i=1;ilsp[i+1]-m) lsp[i]= SHR16(lsp[i],1) + SHR16(lsp[i+1]-m,1); } } #else void lsp_interpolate(spx_lsp_t *old_lsp, spx_lsp_t *new_lsp, spx_lsp_t *lsp, int len, int subframe, int nb_subframes, spx_word16_t margin) { int i; float tmp = (1.0f + subframe)/nb_subframes; for (i=0;iLSP_SCALING*(M_PI-margin)) lsp[len-1]=LSP_SCALING*(M_PI-margin); for (i=1;ilsp[i+1]-LSP_SCALING*margin) lsp[i]= .5f* (lsp[i] + lsp[i+1]-LSP_SCALING*margin); } } #endif mumble-1.3.4/3rdparty/speex-src/libspeex/vbr.h0000664000175000017500000000442314010707304021075 0ustar builderbuilder/* Copyright (C) 2002 Jean-Marc Valin */ /** @file vbr.h @brief Variable Bit-Rate (VBR) related routines */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef VBR_H #define VBR_H #include "arch.h" #define VBR_MEMORY_SIZE 5 extern const float vbr_nb_thresh[9][11]; extern const float vbr_hb_thresh[5][11]; extern const float vbr_uhb_thresh[2][11]; /** VBR state. */ typedef struct VBRState { float average_energy; float last_energy; float last_log_energy[VBR_MEMORY_SIZE]; float accum_sum; float last_pitch_coef; float soft_pitch; float last_quality; float noise_level; float noise_accum; float noise_accum_count; int consec_noise; } VBRState; void vbr_init(VBRState *vbr); float vbr_analysis(VBRState *vbr, spx_word16_t *sig, int len, int pitch, float pitch_coef); void vbr_destroy(VBRState *vbr); #endif mumble-1.3.4/3rdparty/speex-src/libspeex/exc_8_128_table.c0000664000175000017500000001160314010707304023044 0ustar builderbuilder/* Copyright (C) 2002 Jean-Marc Valin File: exc_8_128_table.c Codebook for excitation in narrowband CELP mode (7000 bps) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ const signed char exc_8_128_table[1024] = { -14,9,13,-32,2,-10,31,-10, -8,-8,6,-4,-1,10,-64,23, 6,20,13,6,8,-22,16,34, 7,42,-49,-28,5,26,4,-15, 41,34,41,32,33,24,23,14, 8,40,34,4,-24,-41,-19,-15, 13,-13,33,-54,24,27,-44,33, 27,-15,-15,24,-19,14,-36,14, -9,24,-12,-4,37,-5,16,-34, 5,10,33,-15,-54,-16,12,25, 12,1,2,0,3,-1,-4,-4, 11,2,-56,54,27,-20,13,-6, -46,-41,-33,-11,-5,7,12,14, -14,-5,8,20,6,3,4,-8, -5,-42,11,8,-14,25,-2,2, 13,11,-22,39,-9,9,5,-45, -9,7,-9,12,-7,34,-17,-102, 7,2,-42,18,35,-9,-34,11, -5,-2,3,22,46,-52,-25,-9, -94,8,11,-5,-5,-5,4,-7, -35,-7,54,5,-32,3,24,-9, -22,8,65,37,-1,-12,-23,-6, -9,-28,55,-33,14,-3,2,18, -60,41,-17,8,-16,17,-11,0, -11,29,-28,37,9,-53,33,-14, -9,7,-25,-7,-11,26,-32,-8, 24,-21,22,-19,19,-10,29,-14, 0,0,0,0,0,0,0,0, -5,-52,10,41,6,-30,-4,16, 32,22,-27,-22,32,-3,-28,-3, 3,-35,6,17,23,21,8,2, 4,-45,-17,14,23,-4,-31,-11, -3,14,1,19,-11,2,61,-8, 9,-12,7,-10,12,-3,-24,99, -48,23,50,-37,-5,-23,0,8, -14,35,-64,-5,46,-25,13,-1, -49,-19,-15,9,34,50,25,11, -6,-9,-16,-20,-32,-33,-32,-27, 10,-8,12,-15,56,-14,-32,33, 3,-9,1,65,-9,-9,-10,-2, -6,-23,9,17,3,-28,13,-32, 4,-2,-10,4,-16,76,12,-52, 6,13,33,-6,4,-14,-9,-3, 1,-15,-16,28,1,-15,11,16, 9,4,-21,-37,-40,-6,22,12, -15,-23,-14,-17,-16,-9,-10,-9, 13,-39,41,5,-9,16,-38,25, 46,-47,4,49,-14,17,-2,6, 18,5,-6,-33,-22,44,50,-2, 1,3,-6,7,7,-3,-21,38, -18,34,-14,-41,60,-13,6,16, -24,35,19,-13,-36,24,3,-17, -14,-10,36,44,-44,-29,-3,3, -54,-8,12,55,26,4,-2,-5, 2,-11,22,-23,2,22,1,-25, -39,66,-49,21,-8,-2,10,-14, -60,25,6,10,27,-25,16,5, -2,-9,26,-13,-20,58,-2,7, 52,-9,2,5,-4,-15,23,-1, -38,23,8,27,-6,0,-27,-7, 39,-10,-14,26,11,-45,-12,9, -5,34,4,-35,10,43,-22,-11, 56,-7,20,1,10,1,-26,9, 94,11,-27,-14,-13,1,-11,0, 14,-5,-6,-10,-4,-15,-8,-41, 21,-5,1,-28,-8,22,-9,33, -23,-4,-4,-12,39,4,-7,3, -60,80,8,-17,2,-6,12,-5, 1,9,15,27,31,30,27,23, 61,47,26,10,-5,-8,-12,-13, 5,-18,25,-15,-4,-15,-11,12, -2,-2,-16,-2,-6,24,12,11, -4,9,1,-9,14,-45,57,12, 20,-35,26,11,-64,32,-10,-10, 42,-4,-9,-16,32,24,7,10, 52,-11,-57,29,0,8,0,-6, 17,-17,-56,-40,7,20,18,12, -6,16,5,7,-1,9,1,10, 29,12,16,13,-2,23,7,9, -3,-4,-5,18,-64,13,55,-25, 9,-9,24,14,-25,15,-11,-40, -30,37,1,-19,22,-5,-31,13, -2,0,7,-4,16,-67,12,66, -36,24,-8,18,-15,-23,19,0, -45,-7,4,3,-13,13,35,5, 13,33,10,27,23,0,-7,-11, 43,-74,36,-12,2,5,-8,6, -33,11,-16,-14,-5,-7,-3,17, -34,27,-16,11,-9,15,33,-31, 8,-16,7,-6,-7,63,-55,-17, 11,-1,20,-46,34,-30,6,9, 19,28,-9,5,-24,-8,-23,-2, 31,-19,-16,-5,-15,-18,0,26, 18,37,-5,-15,-2,17,5,-27, 21,-33,44,12,-27,-9,17,11, 25,-21,-31,-7,13,33,-8,-25, -7,7,-10,4,-6,-9,48,-82, -23,-8,6,11,-23,3,-3,49, -29,25,31,4,14,16,9,-4, -18,10,-26,3,5,-44,-9,9, -47,-55,15,9,28,1,4,-3, 46,6,-6,-38,-29,-31,-15,-6, 3,0,14,-6,8,-54,-50,33, -5,1,-14,33,-48,26,-4,-5, -3,-5,-3,-5,-28,-22,77,55, -1,2,10,10,-9,-14,-66,-49, 11,-36,-6,-20,10,-10,16,12, 4,-1,-16,45,-44,-50,31,-2, 25,42,23,-32,-22,0,11,20, -40,-35,-40,-36,-32,-26,-21,-13, 52,-22,6,-24,-20,17,-5,-8, 36,-25,-11,21,-26,6,34,-8, 7,20,-3,5,-25,-8,18,-5, -9,-4,1,-9,20,20,39,48, -24,9,5,-65,22,29,4,3, -43,-11,32,-6,9,19,-27,-10, -47,-14,24,10,-7,-36,-7,-1, -4,-5,-5,16,53,25,-26,-29, -4,-12,45,-58,-34,33,-5,2, -1,27,-48,31,-15,22,-5,4, 7,7,-25,-3,11,-22,16,-12, 8,-3,7,-11,45,14,-73,-19, 56,-46,24,-20,28,-12,-2,-1, -36,-3,-33,19,-6,7,2,-15, 5,-31,-45,8,35,13,20,0, -9,48,-13,-43,-3,-13,2,-5, 72,-68,-27,2,1,-2,-7,5, 36,33,-40,-12,-4,-5,23,19}; mumble-1.3.4/3rdparty/speex-src/libspeex/exc_10_16_table.c0000664000175000017500000000415214010707304023032 0ustar builderbuilder/* Copyright (C) 2002 Jean-Marc Valin File: exc_10_16_table.c Codebook for excitation in narrowband CELP mode (3200 bps) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ const signed char exc_10_16_table[160] = { 22,39,14,44,11,35,-2,23,-4,6, 46,-28,13,-27,-23,12,4,20,-5,9, 37,-18,-23,23,0,9,-6,-20,4,-1, -17,-5,-4,17,0,1,9,-2,1,2, 2,-12,8,-25,39,15,9,16,-55,-11, 9,11,5,10,-2,-60,8,13,-6,11, -16,27,-47,-12,11,1,16,-7,9,-3, -29,9,-14,25,-19,34,36,12,40,-10, -3,-24,-14,-37,-21,-35,-2,-36,3,-6, 67,28,6,-17,-3,-12,-16,-15,-17,-7, -59,-36,-13,1,7,1,2,10,2,11, 13,10,8,-2,7,3,5,4,2,2, -3,-8,4,-5,6,7,-42,15,35,-2, -46,38,28,-20,-9,1,7,-3,0,-2, 0,0,0,0,0,0,0,0,0,0, -15,-28,52,32,5,-5,-17,-20,-10,-1}; mumble-1.3.4/3rdparty/speex-src/libspeex/kiss_fftr.h0000664000175000017500000000203714010707304022275 0ustar builderbuilder#ifndef KISS_FTR_H #define KISS_FTR_H #include "kiss_fft.h" #ifdef __cplusplus extern "C" { #endif /* Real optimized version can save about 45% cpu time vs. complex fft of a real seq. */ typedef struct kiss_fftr_state *kiss_fftr_cfg; kiss_fftr_cfg kiss_fftr_alloc(int nfft,int inverse_fft,void * mem, size_t * lenmem); /* nfft must be even If you don't care to allocate space, use mem = lenmem = NULL */ void kiss_fftr(kiss_fftr_cfg cfg,const kiss_fft_scalar *timedata,kiss_fft_cpx *freqdata); /* input timedata has nfft scalar points output freqdata has nfft/2+1 complex points */ void kiss_fftr2(kiss_fftr_cfg st,const kiss_fft_scalar *timedata,kiss_fft_scalar *freqdata); void kiss_fftri(kiss_fftr_cfg cfg,const kiss_fft_cpx *freqdata,kiss_fft_scalar *timedata); void kiss_fftri2(kiss_fftr_cfg st,const kiss_fft_scalar *freqdata, kiss_fft_scalar *timedata); /* input freqdata has nfft/2+1 complex points output timedata has nfft scalar points */ #define kiss_fftr_free speex_free #ifdef __cplusplus } #endif #endif mumble-1.3.4/3rdparty/speex-src/libspeex/stack_alloc.h0000664000175000017500000000645514010707304022572 0ustar builderbuilder/* Copyright (C) 2002 Jean-Marc Valin */ /** @file stack_alloc.h @brief Temporary memory allocation on stack */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef STACK_ALLOC_H #define STACK_ALLOC_H #ifdef USE_ALLOCA # ifdef WIN32 # include # else # ifdef HAVE_ALLOCA_H # include # else # include # endif # endif #endif /** * @def ALIGN(stack, size) * * Aligns the stack to a 'size' boundary * * @param stack Stack * @param size New size boundary */ /** * @def PUSH(stack, size, type) * * Allocates 'size' elements of type 'type' on the stack * * @param stack Stack * @param size Number of elements * @param type Type of element */ /** * @def VARDECL(var) * * Declare variable on stack * * @param var Variable to declare */ /** * @def ALLOC(var, size, type) * * Allocate 'size' elements of 'type' on stack * * @param var Name of variable to allocate * @param size Number of elements * @param type Type of element */ #ifdef ENABLE_VALGRIND #include #define ALIGN(stack, size) ((stack) += ((size) - (long)(stack)) & ((size) - 1)) #define PUSH(stack, size, type) (VALGRIND_MAKE_NOACCESS(stack, 1000),ALIGN((stack),sizeof(type)),VALGRIND_MAKE_WRITABLE(stack, ((size)*sizeof(type))),(stack)+=((size)*sizeof(type)),(type*)((stack)-((size)*sizeof(type)))) #else #define ALIGN(stack, size) ((stack) += ((size) - (long)(stack)) & ((size) - 1)) #define PUSH(stack, size, type) (ALIGN((stack),sizeof(type)),(stack)+=((size)*sizeof(type)),(type*)((stack)-((size)*sizeof(type)))) #endif #if defined(VAR_ARRAYS) #define VARDECL(var) #define ALLOC(var, size, type) type var[size] #elif defined(USE_ALLOCA) #define VARDECL(var) var #define ALLOC(var, size, type) var = alloca(sizeof(type)*(size)) #else #define VARDECL(var) var #define ALLOC(var, size, type) var = PUSH(stack, size, type) #endif #endif mumble-1.3.4/3rdparty/speex-src/libspeex/nb_celp.h0000664000175000017500000002133214010707304021704 0ustar builderbuilder/* Copyright (C) 2002-2006 Jean-Marc Valin */ /** @file nb_celp.h @brief Narrowband CELP encoder/decoder */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef NB_CELP_H #define NB_CELP_H #include "modes.h" #include "speex/speex_callbacks.h" #include "vbr.h" #include "filters.h" #ifdef VORBIS_PSYCHO #include "vorbis_psy.h" #endif #define NB_ORDER 10 #define NB_FRAME_SIZE 160 #define NB_SUBFRAME_SIZE 40 #define NB_NB_SUBFRAMES 4 #define NB_PITCH_START 17 #define NB_PITCH_END 144 #define NB_WINDOW_SIZE (NB_FRAME_SIZE+NB_SUBFRAME_SIZE) #define NB_EXCBUF (NB_FRAME_SIZE+NB_PITCH_END+2) #define NB_DEC_BUFFER (NB_FRAME_SIZE+2*NB_PITCH_END+NB_SUBFRAME_SIZE+12) /**Structure representing the full state of the narrowband encoder*/ typedef struct EncState { const SpeexMode *mode; /**< Mode corresponding to the state */ int first; /**< Is this the first frame? */ spx_word32_t cumul_gain; /**< Product of previously used pitch gains (Q10) */ int bounded_pitch; /**< Next frame should not rely on previous frames for pitch */ int ol_pitch; /**< Open-loop pitch */ int ol_voiced; /**< Open-loop voiced/non-voiced decision */ int pitch[NB_NB_SUBFRAMES]; #ifdef VORBIS_PSYCHO VorbisPsy *psy; float *psy_window; float *curve; float *old_curve; #endif spx_word16_t gamma1; /**< Perceptual filter: A(z/gamma1) */ spx_word16_t gamma2; /**< Perceptual filter: A(z/gamma2) */ spx_word16_t lpc_floor; /**< Noise floor multiplier for A[0] in LPC analysis*/ char *stack; /**< Pseudo-stack allocation for temporary memory */ spx_word16_t winBuf[NB_WINDOW_SIZE-NB_FRAME_SIZE]; /**< Input buffer (original signal) */ spx_word16_t excBuf[NB_EXCBUF]; /**< Excitation buffer */ spx_word16_t *exc; /**< Start of excitation frame */ spx_word16_t swBuf[NB_EXCBUF]; /**< Weighted signal buffer */ spx_word16_t *sw; /**< Start of weighted signal frame */ const spx_word16_t *window; /**< Temporary (Hanning) window */ const spx_word16_t *lagWindow; /**< Window applied to auto-correlation */ spx_lsp_t old_lsp[NB_ORDER]; /**< LSPs for previous frame */ spx_lsp_t old_qlsp[NB_ORDER]; /**< Quantized LSPs for previous frame */ spx_mem_t mem_sp[NB_ORDER]; /**< Filter memory for signal synthesis */ spx_mem_t mem_sw[NB_ORDER]; /**< Filter memory for perceptually-weighted signal */ spx_mem_t mem_sw_whole[NB_ORDER]; /**< Filter memory for perceptually-weighted signal (whole frame)*/ spx_mem_t mem_exc[NB_ORDER]; /**< Filter memory for excitation (whole frame) */ spx_mem_t mem_exc2[NB_ORDER]; /**< Filter memory for excitation (whole frame) */ spx_mem_t mem_hp[2]; /**< High-pass filter memory */ spx_word32_t pi_gain[NB_NB_SUBFRAMES]; /**< Gain of LPC filter at theta=pi (fe/2) */ spx_word16_t *innov_rms_save; /**< If non-NULL, innovation RMS is copied here */ #ifndef DISABLE_VBR VBRState vbr; /**< State of the VBR data */ float vbr_quality; /**< Quality setting for VBR encoding */ float relative_quality; /**< Relative quality that will be needed by VBR */ spx_int32_t vbr_enabled; /**< 1 for enabling VBR, 0 otherwise */ spx_int32_t vbr_max; /**< Max bit-rate allowed in VBR mode */ int vad_enabled; /**< 1 for enabling VAD, 0 otherwise */ int dtx_enabled; /**< 1 for enabling DTX, 0 otherwise */ int dtx_count; /**< Number of consecutive DTX frames */ spx_int32_t abr_enabled; /**< ABR setting (in bps), 0 if off */ float abr_drift; float abr_drift2; float abr_count; #endif /* #ifndef DISABLE_VBR */ int complexity; /**< Complexity setting (0-10 from least complex to most complex) */ spx_int32_t sampling_rate; int plc_tuning; int encode_submode; const SpeexSubmode * const *submodes; /**< Sub-mode data */ int submodeID; /**< Activated sub-mode */ int submodeSelect; /**< Mode chosen by the user (may differ from submodeID if VAD is on) */ int isWideband; /**< Is this used as part of the embedded wideband codec */ int highpass_enabled; /**< Is the input filter enabled */ } EncState; /**Structure representing the full state of the narrowband decoder*/ typedef struct DecState { const SpeexMode *mode; /**< Mode corresponding to the state */ int first; /**< Is this the first frame? */ int count_lost; /**< Was the last frame lost? */ spx_int32_t sampling_rate; spx_word16_t last_ol_gain; /**< Open-loop gain for previous frame */ char *stack; /**< Pseudo-stack allocation for temporary memory */ spx_word16_t excBuf[NB_DEC_BUFFER]; /**< Excitation buffer */ spx_word16_t *exc; /**< Start of excitation frame */ spx_lsp_t old_qlsp[NB_ORDER]; /**< Quantized LSPs for previous frame */ spx_coef_t interp_qlpc[NB_ORDER]; /**< Interpolated quantized LPCs */ spx_mem_t mem_sp[NB_ORDER]; /**< Filter memory for synthesis signal */ spx_mem_t mem_hp[2]; /**< High-pass filter memory */ spx_word32_t pi_gain[NB_NB_SUBFRAMES]; /**< Gain of LPC filter at theta=pi (fe/2) */ spx_word16_t *innov_save; /** If non-NULL, innovation is copied here */ spx_word16_t level; spx_word16_t max_level; spx_word16_t min_level; /* This is used in packet loss concealment */ int last_pitch; /**< Pitch of last correctly decoded frame */ spx_word16_t last_pitch_gain; /**< Pitch gain of last correctly decoded frame */ spx_word16_t pitch_gain_buf[3]; /**< Pitch gain of last decoded frames */ int pitch_gain_buf_idx; /**< Tail of the buffer */ spx_int32_t seed; /** Seed used for random number generation */ int encode_submode; const SpeexSubmode * const *submodes; /**< Sub-mode data */ int submodeID; /**< Activated sub-mode */ int lpc_enh_enabled; /**< 1 when LPC enhancer is on, 0 otherwise */ SpeexCallback speex_callbacks[SPEEX_MAX_CALLBACKS]; SpeexCallback user_callback; /*Vocoder data*/ spx_word16_t voc_m1; spx_word32_t voc_m2; spx_word16_t voc_mean; int voc_offset; int dtx_enabled; int isWideband; /**< Is this used as part of the embedded wideband codec */ int highpass_enabled; /**< Is the input filter enabled */ } DecState; /** Initializes encoder state*/ void *nb_encoder_init(const SpeexMode *m); /** De-allocates encoder state resources*/ void nb_encoder_destroy(void *state); /** Encodes one frame*/ int nb_encode(void *state, void *in, SpeexBits *bits); /** Initializes decoder state*/ void *nb_decoder_init(const SpeexMode *m); /** De-allocates decoder state resources*/ void nb_decoder_destroy(void *state); /** Decodes one frame*/ int nb_decode(void *state, SpeexBits *bits, void *out); /** ioctl-like function for controlling a narrowband encoder */ int nb_encoder_ctl(void *state, int request, void *ptr); /** ioctl-like function for controlling a narrowband decoder */ int nb_decoder_ctl(void *state, int request, void *ptr); #endif mumble-1.3.4/3rdparty/speex-src/libspeex/exc_20_32_table.c0000664000175000017500000000675214010707304023041 0ustar builderbuilder/* Copyright (C) 2002 Jean-Marc Valin File: exc_20_32_table.c Codebook for excitation in narrowband CELP mode (2000 bps) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ const signed char exc_20_32_table[640] = { 12,32,25,46,36,33,9,14,-3,6,1,-8,0,-10,-5,-7,-7,-7,-5,-5, 31,-27,24,-32,-4,10,-11,21,-3,19,23,-9,22,24,-10,-1,-10,-13,-7,-11, 42,-33,31,19,-8,0,-10,-16,1,-21,-17,10,-8,14,8,4,11,-2,5,-2, -33,11,-16,33,11,-4,9,-4,11,2,6,-5,8,-5,11,-4,-6,26,-36,-16, 0,4,-2,-8,12,6,-1,34,-46,-22,9,9,21,9,5,-66,-5,26,2,10, 13,2,19,9,12,-81,3,13,13,0,-14,22,-35,6,-7,-4,6,-6,10,-6, -31,38,-33,0,-10,-11,5,-12,12,-17,5,0,-6,13,-9,10,8,25,33,2, -12,8,-6,10,-2,21,7,17,43,5,11,-7,-9,-20,-36,-20,-23,-4,-4,-3, 27,-9,-9,-49,-39,-38,-11,-9,6,5,23,25,5,3,3,4,1,2,-3,-1, 87,39,17,-21,-9,-19,-9,-15,-13,-14,-17,-11,-10,-11,-8,-6,-1,-3,-3,-1, -54,-34,-27,-8,-11,-4,-5,0,0,4,8,6,9,7,9,7,6,5,5,5, 48,10,19,-10,12,-1,9,-3,2,5,-3,2,-2,-2,0,-2,-26,6,9,-7, -16,-9,2,7,7,-5,-43,11,22,-11,-9,34,37,-15,-13,-6,1,-1,1,1, -64,56,52,-11,-27,5,4,3,1,2,1,3,-1,-4,-4,-10,-7,-4,-4,2, -1,-7,-7,-12,-10,-15,-9,-5,-5,-11,-16,-13,6,16,4,-13,-16,-10,-4,2, -47,-13,25,47,19,-14,-20,-8,-17,0,-3,-13,1,6,-17,-14,15,1,10,6, -24,0,-10,19,-69,-8,14,49,17,-5,33,-29,3,-4,0,2,-8,5,-6,2, 120,-56,-12,-47,23,-9,6,-5,1,2,-5,1,-10,4,-1,-1,4,-1,0,-3, 30,-52,-67,30,22,11,-1,-4,3,0,7,2,0,1,-10,-4,-8,-13,5,1, 1,-1,5,13,-9,-3,-10,-62,22,48,-4,-6,2,3,5,1,1,4,1,13, 3,-20,10,-9,13,-2,-4,9,-20,44,-1,20,-32,-67,19,0,28,11,8,2, -11,15,-19,-53,31,2,34,10,6,-4,-58,8,10,13,14,1,12,2,0,0, -128,37,-8,44,-9,26,-3,18,2,6,11,-1,9,1,5,3,0,1,1,2, 12,3,-2,-3,7,25,9,18,-6,-37,3,-8,-16,3,-10,-7,17,-34,-44,11, 17,-15,-3,-16,-1,-13,11,-46,-65,-2,8,13,2,4,4,5,15,5,9,6, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -9,19,-12,12,-28,38,29,-1,12,2,5,23,-10,3,4,-15,21,-4,3,3, 6,17,-9,-4,-8,-20,26,5,-10,6,1,-19,18,-15,-12,47,-6,-2,-7,-9, -1,-17,-2,-2,-14,30,-14,2,-7,-4,-1,-12,11,-25,16,-3,-12,11,-7,7, -17,1,19,-28,31,-7,-10,7,-10,3,12,5,-16,6,24,41,-29,-54,0,1, 7,-1,5,-6,13,10,-4,-8,8,-9,-27,-53,-38,-1,10,19,17,16,12,12, 0,3,-7,-4,13,12,-31,-14,6,-5,3,5,17,43,50,25,10,1,-6,-2}; mumble-1.3.4/3rdparty/speex-src/libspeex/ltp_bfin.h0000664000175000017500000003230714010707304022103 0ustar builderbuilder/* Copyright (C) 2005 Analog Devices */ /** @file ltp_bfin.h @author Jean-Marc Valin @brief Long-Term Prediction functions (Blackfin version) */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "bfin.h" #define OVERRIDE_INNER_PROD spx_word32_t inner_prod(const spx_word16_t *x, const spx_word16_t *y, int len) { spx_word32_t sum=0; __asm__ __volatile__ ( "P0 = %3;\n\t" "P1 = %1;\n\t" "P2 = %2;\n\t" "I0 = P1;\n\t" "I1 = P2;\n\t" "L0 = 0;\n\t" "L1 = 0;\n\t" "A0 = 0;\n\t" "R0.L = W[I0++] || R1.L = W[I1++];\n\t" "LOOP inner%= LC0 = P0;\n\t" "LOOP_BEGIN inner%=;\n\t" "A0 += R0.L*R1.L (IS) || R0.L = W[I0++] || R1.L = W[I1++];\n\t" "LOOP_END inner%=;\n\t" "A0 += R0.L*R1.L (IS);\n\t" "A0 = A0 >>> 6;\n\t" "R0 = A0;\n\t" "%0 = R0;\n\t" : "=m" (sum) : "m" (x), "m" (y), "d" (len-1) : "P0", "P1", "P2", "R0", "R1", "A0", "I0", "I1", "L0", "L1", "R3", "ASTAT" BFIN_HWLOOP0_REGS ); return sum; } #define OVERRIDE_PITCH_XCORR void pitch_xcorr(const spx_word16_t *_x, const spx_word16_t *_y, spx_word32_t *corr, int len, int nb_pitch, char *stack) { corr += nb_pitch - 1; __asm__ __volatile__ ( "P2 = %0;\n\t" "I0 = P2;\n\t" /* x in I0 */ "B0 = P2;\n\t" /* x in B0 */ "R0 = %3;\n\t" /* len in R0 */ "P3 = %3;\n\t" "P3 += -2;\n\t" /* len in R0 */ "P4 = %4;\n\t" /* nb_pitch in R0 */ "R1 = R0 << 1;\n\t" /* number of bytes in x */ "L0 = R1;\n\t" "P0 = %1;\n\t" "P1 = %2;\n\t" "B1 = P1;\n\t" "L1 = 0;\n\t" /*Disable looping on I1*/ "r0 = [I0++];\n\t" "LOOP pitch%= LC0 = P4 >> 1;\n\t" "LOOP_BEGIN pitch%=;\n\t" "I1 = P0;\n\t" "A1 = A0 = 0;\n\t" "R1 = [I1++];\n\t" "LOOP inner_prod%= LC1 = P3 >> 1;\n\t" "LOOP_BEGIN inner_prod%=;\n\t" "A1 += R0.L*R1.H, A0 += R0.L*R1.L (IS) || R1.L = W[I1++];\n\t" "A1 += R0.H*R1.L, A0 += R0.H*R1.H (IS) || R1.H = W[I1++] || R0 = [I0++];\n\t" "LOOP_END inner_prod%=;\n\t" "A1 += R0.L*R1.H, A0 += R0.L*R1.L (IS) || R1.L = W[I1++];\n\t" "A1 += R0.H*R1.L, A0 += R0.H*R1.H (IS) || R0 = [I0++];\n\t" "A0 = A0 >>> 6;\n\t" "A1 = A1 >>> 6;\n\t" "R2 = A0, R3 = A1;\n\t" "[P1--] = r2;\n\t" "[P1--] = r3;\n\t" "P0 += 4;\n\t" "LOOP_END pitch%=;\n\t" "L0 = 0;\n\t" : : "m" (_x), "m" (_y), "m" (corr), "m" (len), "m" (nb_pitch) : "A0", "A1", "P0", "P1", "P2", "P3", "P4", "R0", "R1", "R2", "R3", "I0", "I1", "L0", "L1", "B0", "B1", "memory", "ASTAT" BFIN_HWLOOP0_REGS BFIN_HWLOOP1_REGS ); } #define OVERRIDE_COMPUTE_PITCH_ERROR static inline spx_word32_t compute_pitch_error(spx_word16_t *C, spx_word16_t *g, spx_word16_t pitch_control) { spx_word32_t sum; __asm__ __volatile__ ( "A0 = 0;\n\t" "R0 = W[%1++];\n\t" "R1.L = %2.L*%5.L (IS);\n\t" "A0 += R1.L*R0.L (IS) || R0 = W[%1++];\n\t" "R1.L = %3.L*%5.L (IS);\n\t" "A0 += R1.L*R0.L (IS) || R0 = W[%1++];\n\t" "R1.L = %4.L*%5.L (IS);\n\t" "A0 += R1.L*R0.L (IS) || R0 = W[%1++];\n\t" "R1.L = %2.L*%3.L (IS);\n\t" "A0 -= R1.L*R0.L (IS) || R0 = W[%1++];\n\t" "R1.L = %4.L*%3.L (IS);\n\t" "A0 -= R1.L*R0.L (IS) || R0 = W[%1++];\n\t" "R1.L = %4.L*%2.L (IS);\n\t" "A0 -= R1.L*R0.L (IS) || R0 = W[%1++];\n\t" "R1.L = %2.L*%2.L (IS);\n\t" "A0 -= R1.L*R0.L (IS) || R0 = W[%1++];\n\t" "R1.L = %3.L*%3.L (IS);\n\t" "A0 -= R1.L*R0.L (IS) || R0 = W[%1++];\n\t" "R1.L = %4.L*%4.L (IS);\n\t" "A0 -= R1.L*R0.L (IS);\n\t" "%0 = A0;\n\t" : "=&D" (sum), "=a" (C) : "d" (g[0]), "d" (g[1]), "d" (g[2]), "d" (pitch_control), "1" (C) : "R0", "R1", "R2", "A0", "ASTAT" ); return sum; } #define OVERRIDE_OPEN_LOOP_NBEST_PITCH #ifdef OVERRIDE_OPEN_LOOP_NBEST_PITCH void open_loop_nbest_pitch(spx_word16_t *sw, int start, int end, int len, int *pitch, spx_word16_t *gain, int N, char *stack) { int i,j,k; VARDECL(spx_word32_t *best_score); VARDECL(spx_word32_t *best_ener); spx_word32_t e0; VARDECL(spx_word32_t *corr); VARDECL(spx_word32_t *energy); ALLOC(best_score, N, spx_word32_t); ALLOC(best_ener, N, spx_word32_t); ALLOC(corr, end-start+1, spx_word32_t); ALLOC(energy, end-start+2, spx_word32_t); for (i=0;i>>= 6;\n\t" " R1 = R1 + R2;\n\t" " R0 >>>= 6;\n\t" " R1 = R1 - R0;\n\t" " R2 = MAX(R1,R3);\n\t" "eu2: [P0++] = R2;\n\t" : : "d" (energy), "d" (&sw[-start-1]), "d" (&sw[-start+len-1]), "a" (end-start) : "P0", "I1", "I2", "R0", "R1", "R2", "R3", "ASTAT" BFIN_HWLOOP1_REGS ); pitch_xcorr(sw, sw-end, corr, len, end-start+1, stack); /* FIXME: Fixed-point and floating-point code should be merged */ { VARDECL(spx_word16_t *corr16); VARDECL(spx_word16_t *ener16); ALLOC(corr16, end-start+1, spx_word16_t); ALLOC(ener16, end-start+1, spx_word16_t); /* Normalize to 180 so we can square it and it still fits in 16 bits */ normalize16(corr, corr16, 180, end-start+1); normalize16(energy, ener16, 180, end-start+1); if (N == 1) { /* optimised asm to handle N==1 case */ __asm__ __volatile__ ( " I0 = %1;\n\t" /* I0: corr16[] */ " L0 = 0;\n\t" " I1 = %2;\n\t" /* I1: energy */ " L1 = 0;\n\t" " R2 = -1;\n\t" /* R2: best score */ " R3 = 0;\n\t" /* R3: best energy */ " P0 = %4;\n\t" /* P0: best pitch */ " P1 = %4;\n\t" /* P1: counter */ " LSETUP (sl1, sl2) LC1 = %3;\n\t" "sl1: R0.L = W [I0++] || R1.L = W [I1++];\n\t" " R0 = R0.L * R0.L (IS);\n\t" " R1 += 1;\n\t" " R4 = R0.L * R3.L;\n\t" " R5 = R2.L * R1.L;\n\t" " cc = R5 < R4;\n\t" " if cc R2 = R0;\n\t" " if cc R3 = R1;\n\t" " if cc P0 = P1;\n\t" "sl2: P1 += 1;\n\t" " %0 = P0;\n\t" : "=&d" (pitch[0]) : "a" (corr16), "a" (ener16), "a" (end+1-start), "d" (start) : "P0", "P1", "I0", "I1", "R0", "R1", "R2", "R3", "R4", "R5", "ASTAT", "CC" BFIN_HWLOOP1_REGS ); } else { for (i=start;i<=end;i++) { spx_word16_t tmp = MULT16_16_16(corr16[i-start],corr16[i-start]); /* Instead of dividing the tmp by the energy, we multiply on the other side */ if (MULT16_16(tmp,best_ener[N-1])>MULT16_16(best_score[N-1],ADD16(1,ener16[i-start]))) { /* We can safely put it last and then check */ best_score[N-1]=tmp; best_ener[N-1]=ener16[i-start]+1; pitch[N-1]=i; /* Check if it comes in front of others */ for (j=0;jMULT16_16(best_score[j],ADD16(1,ener16[i-start]))) { for (k=N-1;k>j;k--) { best_score[k]=best_score[k-1]; best_ener[k]=best_ener[k-1]; pitch[k]=pitch[k-1]; } best_score[j]=tmp; best_ener[j]=ener16[i-start]+1; pitch[j]=i; break; } } } } } } /* Compute open-loop gain */ if (gain) { for (j=0;jbest_sum && gain_sum<=max_gain) ------ (1) if (sum>best_sum && !(gain_sum>max_gain)) ------ (2) if (max_gain<=gain_sum) { ------ (3) sum = -VERY_LARGE32; } if (best_sum<=sum) The blackin cc instructions are all of the form: cc = x < y (or cc = x <= y) */ " R1 = B0\n\t" " R2 = %5\n\t" " R3 = %6\n\t" " cc = R2 <= R1;\n\t" " if cc R0 = R3;\n\t" " cc = %0 <= R0;\n\t" " if cc %0 = R0;\n\t" " if cc %1 = P1;\n\t" "pgs2: P1 += 1;\n\t" : "=&d" (best_sum), "=&d" (best_cdbk) : "a" (gain_cdbk), "a" (C16), "a" (gain_cdbk_size), "a" (max_gain), "b" (-VERY_LARGE32) : "R0", "R1", "R2", "R3", "R4", "P0", "P1", "I1", "L1", "A0", "B0", "CC", "ASTAT" BFIN_HWLOOP1_REGS ); return best_cdbk; } #endif mumble-1.3.4/3rdparty/speex-src/libspeex/kiss_fft.h0000664000175000017500000000550714010707304022120 0ustar builderbuilder#ifndef KISS_FFT_H #define KISS_FFT_H #include #include #include "arch.h" #ifdef __cplusplus extern "C" { #endif /* ATTENTION! If you would like a : -- a utility that will handle the caching of fft objects -- real-only (no imaginary time component ) FFT -- a multi-dimensional FFT -- a command-line utility to perform ffts -- a command-line utility to perform fast-convolution filtering Then see kfc.h kiss_fftr.h kiss_fftnd.h fftutil.c kiss_fastfir.c in the tools/ directory. */ #ifdef USE_SIMD # include # define kiss_fft_scalar __m128 #define KISS_FFT_MALLOC(nbytes) memalign(16,nbytes) #else #define KISS_FFT_MALLOC speex_alloc #endif #ifdef FIXED_POINT #include "arch.h" # define kiss_fft_scalar spx_int16_t #else # ifndef kiss_fft_scalar /* default is float */ # define kiss_fft_scalar float # endif #endif typedef struct { kiss_fft_scalar r; kiss_fft_scalar i; }kiss_fft_cpx; typedef struct kiss_fft_state* kiss_fft_cfg; /* * kiss_fft_alloc * * Initialize a FFT (or IFFT) algorithm's cfg/state buffer. * * typical usage: kiss_fft_cfg mycfg=kiss_fft_alloc(1024,0,NULL,NULL); * * The return value from fft_alloc is a cfg buffer used internally * by the fft routine or NULL. * * If lenmem is NULL, then kiss_fft_alloc will allocate a cfg buffer using malloc. * The returned value should be free()d when done to avoid memory leaks. * * The state can be placed in a user supplied buffer 'mem': * If lenmem is not NULL and mem is not NULL and *lenmem is large enough, * then the function places the cfg in mem and the size used in *lenmem * and returns mem. * * If lenmem is not NULL and ( mem is NULL or *lenmem is not large enough), * then the function returns NULL and places the minimum cfg * buffer size in *lenmem. * */ kiss_fft_cfg kiss_fft_alloc(int nfft,int inverse_fft,void * mem,size_t * lenmem); /* * kiss_fft(cfg,in_out_buf) * * Perform an FFT on a complex input buffer. * for a forward FFT, * fin should be f[0] , f[1] , ... ,f[nfft-1] * fout will be F[0] , F[1] , ... ,F[nfft-1] * Note that each element is complex and can be accessed like f[k].r and f[k].i * */ void kiss_fft(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout); /* A more generic version of the above function. It reads its input from every Nth sample. * */ void kiss_fft_stride(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout,int fin_stride); /* If kiss_fft_alloc allocated a buffer, it is one contiguous buffer and can be simply free()d when no longer needed*/ #define kiss_fft_free speex_free /* Cleans up some memory that gets managed internally. Not necessary to call, but it might clean up your compiler output to call this before you exit. */ void kiss_fft_cleanup(void); #ifdef __cplusplus } #endif #endif mumble-1.3.4/3rdparty/speex-src/libspeex/gain_table.c0000664000175000017500000000735114010707304022367 0ustar builderbuilder/* Copyright (C) 2002 Jean-Marc Valin File: gain_table.c Codebook for 3-tap pitch prediction gain (128 entries) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ const signed char gain_cdbk_nb[512] = { -32, -32, -32, 0, -28, -67, -5, 33, -42, -6, -32, 18, -57, -10, -54, 35, -16, 27, -41, 42, 19, -19, -40, 36, -45, 24, -21, 40, -8, -14, -18, 28, 1, 14, -58, 53, -18, -88, -39, 39, -38, 21, -18, 37, -19, 20, -43, 38, 10, 17, -48, 54, -52, -58, -13, 33, -44, -1, -11, 32, -12, -11, -34, 22, 14, 0, -46, 46, -37, -35, -34, 5, -25, 44, -30, 43, 6, -4, -63, 49, -31, 43, -41, 43, -23, 30, -43, 41, -43, 26, -14, 44, -33, 1, -13, 27, -13, 18, -37, 37, -46, -73, -45, 34, -36, 24, -25, 34, -36, -11, -20, 19, -25, 12, -18, 33, -36, -69, -59, 34, -45, 6, 8, 46, -22, -14, -24, 18, -1, 13, -44, 44, -39, -48, -26, 15, -32, 31, -37, 34, -33, 15, -46, 31, -24, 30, -36, 37, -41, 31, -23, 41, -50, 22, -4, 50, -22, 2, -21, 28, -17, 30, -34, 40, -7, -60, -28, 29, -38, 42, -28, 42, -44, -11, 21, 43, -16, 8, -44, 34, -39, -55, -43, 21, -11, -35, 26, 41, -9, 0, -34, 29, -8, 121, -81, 113, 7, -16, -22, 33, -37, 33, -31, 36, -27, -7, -36, 17, -34, 70, -57, 65, -37, -11, -48, 21, -40, 17, -1, 44, -33, 6, -6, 33, -9, 0, -20, 34, -21, 69, -33, 57, -29, 33, -31, 35, -55, 12, -1, 49, -33, 27, -22, 35, -50, -33, -47, 17, -50, 54, 51, 94, -1, -5, -44, 35, -4, 22, -40, 45, -39, -66, -25, 24, -33, 1, -26, 20, -24, -23, -25, 12, -11, 21, -45, 44, -25, -45, -19, 17, -43, 105, -16, 82, 5, -21, 1, 41, -16, 11, -33, 30, -13, -99, -4, 57, -37, 33, -15, 44, -25, 37, -63, 54, -36, 24, -31, 31, -53, -56, -38, 26, -41, -4, 4, 37, -33, 13, -30, 24, 49, 52, -94, 114, -5, -30, -15, 23, 1, 38, -40, 56, -23, 12, -36, 29, -17, 40, -47, 51, -37, -41, -39, 11, -49, 34, 0, 58, -18, -7, -4, 34, -16, 17, -27, 35, 30, 5, -62, 65, 4, 48, -68, 76, -43, 11, -11, 38, -18, 19, -15, 41, -23, -62, -39, 23, -42, 10, -2, 41, -21, -13, -13, 25, -9, 13, -47, 42, -23, -62, -24, 24, -44, 60, -21, 58, -18, -3, -52, 32, -22, 22, -36, 34, -75, 57, 16, 90, -19, 3, 10, 45, -29, 23, -38, 32, -5, -62, -51, 38, -51, 40, -18, 53, -42, 13, -24, 32, -34, 14, -20, 30, -56, -75, -26, 37, -26, 32, 15, 59, -26, 17, -29, 29, -7, 28, -52, 53, -12, -30, 5, 30, -5, -48, -5, 35, 2, 2, -43, 40, 21, 16, 16, 75, -25, -45, -32, 10, -43, 18, -10, 42, 9, 0, -1, 52, -1, 7, -30, 36, 19, -48, -4, 48, -28, 25, -29, 32, -22, 0, -31, 22, -32, 17, -10, 36, -64, -41, -62, 36, -52, 15, 16, 58, -30, -22, -32, 6, -7, 9, -38, 36}; mumble-1.3.4/3rdparty/speex-src/libspeex/vq.c0000664000175000017500000001045514010707304020727 0ustar builderbuilder/* Copyright (C) 2002 Jean-Marc Valin File: vq.c Vector quantization Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "vq.h" #include "stack_alloc.h" #include "arch.h" #ifdef _USE_SSE #include #include "vq_sse.h" #elif defined(SHORTCUTS) && (defined(ARM4_ASM) || defined(ARM5E_ASM)) #include "vq_arm4.h" #elif defined(BFIN_ASM) #include "vq_bfin.h" #endif #ifndef DISABLE_ENCODER int scal_quant(spx_word16_t in, const spx_word16_t *boundary, int entries) { int i=0; while (iboundary[0]) { boundary++; i++; } return i; } int scal_quant32(spx_word32_t in, const spx_word32_t *boundary, int entries) { int i=0; while (iboundary[0]) { boundary++; i++; } return i; } #endif /* DISABLE_ENCODER */ #if !defined(OVERRIDE_VQ_NBEST) && !defined(DISABLE_ENCODER) /*Finds the indices of the n-best entries in a codebook*/ void vq_nbest(spx_word16_t *in, const spx_word16_t *codebook, int len, int entries, spx_word32_t *E, int N, int *nbest, spx_word32_t *best_dist, char *stack) { int i,j,k,used; used = 0; for (i=0;i= 1) && (k > used || dist < best_dist[k-1]); k--) { best_dist[k]=best_dist[k-1]; nbest[k] = nbest[k-1]; } best_dist[k]=dist; nbest[k]=i; used++; } } } #endif /* !defined(OVERRIDE_VQ_NBEST) && !defined(DISABLE_ENCODER) */ #if !defined(OVERRIDE_VQ_NBEST_SIGN) && !defined(DISABLE_WIDEBAND) && !defined(DISABLE_ENCODER) /*Finds the indices of the n-best entries in a codebook with sign*/ void vq_nbest_sign(spx_word16_t *in, const spx_word16_t *codebook, int len, int entries, spx_word32_t *E, int N, int *nbest, spx_word32_t *best_dist, char *stack) { int i,j,k, sign, used; used=0; for (i=0;i0) { sign=0; dist=-dist; } else { sign=1; } #ifdef FIXED_POINT dist = ADD32(dist,SHR32(E[i],1)); #else dist = ADD32(dist,.5f*E[i]); #endif if (i= 1) && (k > used || dist < best_dist[k-1]); k--) { best_dist[k]=best_dist[k-1]; nbest[k] = nbest[k-1]; } best_dist[k]=dist; nbest[k]=i; used++; if (sign) nbest[k]+=entries; } } } #endif /* !defined(OVERRIDE_VQ_NBEST_SIGN) && !defined(DISABLE_WIDEBAND) && !defined(DISABLE_ENCODER) */ mumble-1.3.4/3rdparty/speex-src/libspeex/exc_5_256_table.c0000664000175000017500000001370314010707304023046 0ustar builderbuilder/* Copyright (C) 2002 Jean-Marc Valin File: exc_5_256_table.c Codebook for excitation in narrowband CELP mode (12800 bps) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ const signed char exc_5_256_table[1280] = { -8,-37,5,-43,5, 73,61,39,12,-3, -61,-32,2,42,30, -3,17,-27,9,34, 20,-1,-5,2,23, -7,-46,26,53,-47, 20,-2,-33,-89,-51, -64,27,11,15,-34, -5,-56,25,-9,-1, -29,1,40,67,-23, -16,16,33,19,7, 14,85,22,-10,-10, -12,-7,-1,52,89, 29,11,-20,-37,-46, -15,17,-24,-28,24, 2,1,0,23,-101, 23,14,-1,-23,-18, 9,5,-13,38,1, -28,-28,4,27,51, -26,34,-40,35,47, 54,38,-54,-26,-6, 42,-25,13,-30,-36, 18,41,-4,-33,23, -32,-7,-4,51,-3, 17,-52,56,-47,36, -2,-21,36,10,8, -33,31,19,9,-5, -40,10,-9,-21,19, 18,-78,-18,-5,0, -26,-36,-47,-51,-44, 18,40,27,-2,29, 49,-26,2,32,-54, 30,-73,54,3,-5, 36,22,53,10,-1, -84,-53,-29,-5,3, -44,53,-51,4,22, 71,-35,-1,33,-5, -27,-7,36,17,-23, -39,16,-9,-55,-15, -20,39,-35,6,-39, -14,18,48,-64,-17, -15,9,39,81,37, -68,37,47,-21,-6, -104,13,6,9,-2, 35,8,-23,18,42, 45,21,33,-5,-49, 9,-6,-43,-56,39, 2,-16,-25,87,1, -3,-9,17,-25,-11, -9,-1,10,2,-14, -14,4,-1,-10,28, -23,40,-32,26,-9, 26,4,-27,-23,3, 42,-60,1,49,-3, 27,10,-52,-40,-2, 18,45,-23,17,-44, 3,-3,17,-46,52, -40,-47,25,75,31, -49,53,30,-30,-32, -36,38,-6,-15,-16, 54,-27,-48,3,38, -29,-32,-22,-14,-4, -23,-13,32,-39,9, 8,-45,-13,34,-16, 49,40,32,31,28, 23,23,32,47,59, -68,8,62,44,25, -14,-24,-65,-16,36, 67,-25,-38,-21,4, -33,-2,42,5,-63, 40,11,26,-42,-23, -61,79,-31,23,-20, 10,-32,53,-25,-36, 10,-26,-5,3,0, -71,5,-10,-37,1, -24,21,-54,-17,1, -29,-25,-15,-27,32, 68,45,-16,-37,-18, -5,1,0,-77,71, -6,3,-20,71,-67, 29,-35,10,-30,19, 4,16,17,5,0, -14,19,2,28,26, 59,3,2,24,39, 55,-50,-45,-18,-17, 33,-35,14,-1,1, 8,87,-35,-29,0, -27,13,-7,23,-13, 37,-40,50,-35,14, 19,-7,-14,49,54, -5,22,-2,-29,-8, -27,38,13,27,48, 12,-41,-21,-15,28, 7,-16,-24,-19,-20, 11,-20,9,2,13, 23,-20,11,27,-27, 71,-69,8,2,-6, 22,12,16,16,9, -16,-8,-17,1,25, 1,40,-37,-33,66, 94,53,4,-22,-25, -41,-42,25,35,-16, -15,57,31,-29,-32, 21,16,-60,45,15, -1,7,57,-26,-47, -29,11,8,15,19, -105,-8,54,27,10, -17,6,-12,-1,-10, 4,0,23,-10,31, 13,11,10,12,-64, 23,-3,-8,-19,16, 52,24,-40,16,10, 40,5,9,0,-13, -7,-21,-8,-6,-7, -21,59,16,-53,18, -60,11,-47,14,-18, 25,-13,-24,4,-39, 16,-28,54,26,-67, 30,27,-20,-52,20, -12,55,12,18,-16, 39,-14,-6,-26,56, -88,-55,12,25,26, -37,6,75,0,-34, -81,54,-30,1,-7, 49,-23,-14,21,10, -62,-58,-57,-47,-34, 15,-4,34,-78,31, 25,-11,7,50,-10, 42,-63,14,-36,-4, 57,55,57,53,42, -42,-1,15,40,37, 15,25,-11,6,1, 31,-2,-6,-1,-7, -64,34,28,30,-1, 3,21,0,-88,-12, -56,25,-28,40,8, -28,-14,9,12,2, -6,-17,22,49,-6, -26,14,28,-20,4, -12,50,35,40,13, -38,-58,-29,17,30, 22,60,26,-54,-39, -12,58,-28,-63,10, -21,-8,-12,26,-62, 6,-10,-11,-22,-6, -7,4,1,18,2, -70,11,14,4,13, 19,-24,-34,24,67, 17,51,-21,13,23, 54,-30,48,1,-13, 80,26,-16,-2,13, -4,6,-30,29,-24, 73,-58,30,-27,20, -2,-21,41,45,30, -27,-3,-5,-18,-20, -49,-3,-35,10,42, -19,-67,-53,-11,9, 13,-15,-33,-51,-30, 15,7,25,-30,4, 28,-22,-34,54,-29, 39,-46,20,16,34, -4,47,75,1,-44, -55,-24,7,-1,9, -42,50,-8,-36,41, 68,0,-4,-10,-23, -15,-50,64,36,-9, -27,12,25,-38,-47, -37,32,-49,51,-36, 2,-4,69,-26,19, 7,45,67,46,13, -63,46,15,-47,4, -41,13,-6,5,-21, 37,26,-55,-7,33, -1,-28,10,-17,-64, -14,0,-36,-17,93, -3,-9,-66,44,-21, 3,-12,38,-6,-13, -12,19,13,43,-43, -10,-12,6,-5,9, -49,32,-5,2,4, 5,15,-16,10,-21, 8,-62,-8,64,8, 79,-1,-66,-49,-18, 5,40,-5,-30,-45, 1,-6,21,-32,93, -18,-30,-21,32,21, -18,22,8,5,-41, -54,80,22,-10,-7, -8,-23,-64,66,56, -14,-30,-41,-46,-14, -29,-37,27,-14,42, -2,-9,-29,34,14, 33,-14,22,4,10, 26,26,28,32,23, -72,-32,3,0,-14, 35,-42,-78,-32,6, 29,-18,-45,-5,7, -33,-45,-3,-22,-34, 8,-8,4,-51,-25, -9,59,-78,21,-5, -25,-48,66,-15,-17, -24,-49,-13,25,-23, -64,-6,40,-24,-19, -11,57,-33,-8,1, 10,-52,-54,28,39, 49,34,-11,-61,-41, -43,10,15,-15,51, 30,15,-51,32,-34, -2,-34,14,18,16, 1,1,-3,-3,1, 1,-18,6,16,48, 12,-5,-42,7,36, 48,7,-20,-10,7, 12,2,54,39,-38, 37,54,4,-11,-8, -46,-10,5,-10,-34, 46,-12,29,-37,39, 36,-11,24,56,17, 14,20,25,0,-25, -28,55,-7,-5,27, 3,9,-26,-8,6, -24,-10,-30,-31,-34, 18,4,22,21,40, -1,-29,-37,-8,-21, 92,-29,11,-3,11, 73,23,22,7,4, -44,-9,-11,21,-13, 11,9,-78,-1,47, 114,-12,-37,-19,-5, -11,-22,19,12,-30, 7,38,45,-21,-8, -9,55,-45,56,-21, 7,17,46,-57,-87, -6,27,31,31,7, -56,-12,46,21,-5, -12,36,3,3,-21, 43,19,12,-7,9, -14,0,-9,-33,-91, 7,26,3,-11,64, 83,-31,-46,25,2, 9,5,2,2,-1, 20,-17,10,-5,-27, -8,20,8,-19,16, -21,-13,-31,5,5, 42,24,9,34,-20, 28,-61,22,11,-39, 64,-20,-1,-30,-9, -20,24,-25,-24,-29, 22,-60,6,-5,41, -9,-87,14,34,15, -57,52,69,15,-3, -102,58,16,3,6, 60,-75,-32,26,7, -57,-27,-32,-24,-21, -29,-16,62,-46,31, 30,-27,-15,7,15}; mumble-1.3.4/3rdparty/speex-src/libspeex/speex.c0000664000175000017500000001500314010707304021417 0ustar builderbuilder/* Copyright (C) 2002 Jean-Marc Valin File: speex.c Basic Speex functions Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "modes.h" #include #include "os_support.h" #ifndef NULL #define NULL 0 #endif #define MAX_IN_SAMPLES 640 EXPORT void *speex_encoder_init(const SpeexMode *mode) { return mode->enc_init(mode); } EXPORT void *speex_decoder_init(const SpeexMode *mode) { return mode->dec_init(mode); } EXPORT void speex_encoder_destroy(void *state) { (*((SpeexMode**)state))->enc_destroy(state); } EXPORT void speex_decoder_destroy(void *state) { (*((SpeexMode**)state))->dec_destroy(state); } int speex_encode_native(void *state, spx_word16_t *in, SpeexBits *bits) { return (*((SpeexMode**)state))->enc(state, in, bits); } int speex_decode_native(void *state, SpeexBits *bits, spx_word16_t *out) { return (*((SpeexMode**)state))->dec(state, bits, out); } #ifdef FIXED_POINT #ifndef DISABLE_FLOAT_API EXPORT int speex_encode(void *state, float *in, SpeexBits *bits) { int i; spx_int32_t N; spx_int16_t short_in[MAX_IN_SAMPLES]; speex_encoder_ctl(state, SPEEX_GET_FRAME_SIZE, &N); for (i=0;i32767.f) short_in[i] = 32767; else if (in[i]<-32768.f) short_in[i] = -32768; else short_in[i] = (spx_int16_t)floor(.5+in[i]); } return (*((SpeexMode**)state))->enc(state, short_in, bits); } #endif /* #ifndef DISABLE_FLOAT_API */ EXPORT int speex_encode_int(void *state, spx_int16_t *in, SpeexBits *bits) { SpeexMode *mode; mode = *(SpeexMode**)state; return (mode)->enc(state, in, bits); } #ifndef DISABLE_FLOAT_API EXPORT int speex_decode(void *state, SpeexBits *bits, float *out) { int i, ret; spx_int32_t N; spx_int16_t short_out[MAX_IN_SAMPLES]; speex_decoder_ctl(state, SPEEX_GET_FRAME_SIZE, &N); ret = (*((SpeexMode**)state))->dec(state, bits, short_out); for (i=0;idec(state, bits, out); } #else EXPORT int speex_encode(void *state, float *in, SpeexBits *bits) { return (*((SpeexMode**)state))->enc(state, in, bits); } EXPORT int speex_encode_int(void *state, spx_int16_t *in, SpeexBits *bits) { int i; spx_int32_t N; float float_in[MAX_IN_SAMPLES]; speex_encoder_ctl(state, SPEEX_GET_FRAME_SIZE, &N); for (i=0;ienc(state, float_in, bits); } EXPORT int speex_decode(void *state, SpeexBits *bits, float *out) { return (*((SpeexMode**)state))->dec(state, bits, out); } EXPORT int speex_decode_int(void *state, SpeexBits *bits, spx_int16_t *out) { int i; spx_int32_t N; float float_out[MAX_IN_SAMPLES]; int ret; speex_decoder_ctl(state, SPEEX_GET_FRAME_SIZE, &N); ret = (*((SpeexMode**)state))->dec(state, bits, float_out); if (ret == 0) { for (i=0;i32767.f) out[i] = 32767; else if (float_out[i]<-32768.f) out[i] = -32768; else out[i] = (spx_int16_t)floor(.5+float_out[i]); } } return ret; } #endif EXPORT int speex_encoder_ctl(void *state, int request, void *ptr) { return (*((SpeexMode**)state))->enc_ctl(state, request, ptr); } EXPORT int speex_decoder_ctl(void *state, int request, void *ptr) { return (*((SpeexMode**)state))->dec_ctl(state, request, ptr); } int nb_mode_query(const void *mode, int request, void *ptr) { const SpeexNBMode *m = (const SpeexNBMode*)mode; switch (request) { case SPEEX_MODE_FRAME_SIZE: *((int*)ptr)=m->frameSize; break; case SPEEX_SUBMODE_BITS_PER_FRAME: if (*((int*)ptr)==0) *((int*)ptr) = NB_SUBMODE_BITS+1; else if (m->submodes[*((int*)ptr)]==NULL) *((int*)ptr) = -1; else *((int*)ptr) = m->submodes[*((int*)ptr)]->bits_per_frame; break; default: speex_warning_int("Unknown nb_mode_query request: ", request); return -1; } return 0; } EXPORT int speex_lib_ctl(int request, void *ptr) { switch (request) { case SPEEX_LIB_GET_MAJOR_VERSION: *((int*)ptr) = SPEEX_MAJOR_VERSION; break; case SPEEX_LIB_GET_MINOR_VERSION: *((int*)ptr) = SPEEX_MINOR_VERSION; break; case SPEEX_LIB_GET_MICRO_VERSION: *((int*)ptr) = SPEEX_MICRO_VERSION; break; case SPEEX_LIB_GET_EXTRA_VERSION: *((const char**)ptr) = SPEEX_EXTRA_VERSION; break; case SPEEX_LIB_GET_VERSION_STRING: *((const char**)ptr) = SPEEX_VERSION; break; /*case SPEEX_LIB_SET_ALLOC_FUNC: break; case SPEEX_LIB_GET_ALLOC_FUNC: break; case SPEEX_LIB_SET_FREE_FUNC: break; case SPEEX_LIB_GET_FREE_FUNC: break;*/ default: speex_warning_int("Unknown wb_mode_query request: ", request); return -1; } return 0; } mumble-1.3.4/3rdparty/speex-src/libspeex/lsp_tables_nb.c0000664000175000017500000002016614010707304023110 0ustar builderbuilder/* Copyright (C) 2002 Jean-Marc Valin File: lsp_tables_nb.c Codebooks for LSPs in narrowband CELP mode Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ const signed char cdbk_nb[640]={ 30,19,38,34,40,32,46,43,58,43, 5,-18,-25,-40,-33,-55,-52,20,34,28, -20,-63,-97,-92,61,53,47,49,53,75, -14,-53,-77,-79,0,-3,-5,19,22,26, -9,-53,-55,66,90,72,85,68,74,52, -4,-41,-58,-31,-18,-31,27,32,30,18, 24,3,8,5,-12,-3,26,28,74,63, -2,-39,-67,-77,-106,-74,59,59,73,65, 44,40,71,72,82,83,98,88,89,60, -6,-31,-47,-48,-13,-39,-9,7,2,79, -1,-39,-60,-17,87,81,65,50,45,19, -21,-67,-91,-87,-41,-50,7,18,39,74, 10,-31,-28,39,24,13,23,5,56,45, 29,10,-5,-13,-11,-35,-18,-8,-10,-8, -25,-71,-77,-21,2,16,50,63,87,87, 5,-32,-40,-51,-68,0,12,6,54,34, 5,-12,32,52,68,64,69,59,65,45, 14,-16,-31,-40,-65,-67,41,49,47,37, -11,-52,-75,-84,-4,57,48,42,42,33, -11,-51,-68,-6,13,0,8,-8,26,32, -23,-53,0,36,56,76,97,105,111,97, -1,-28,-39,-40,-43,-54,-44,-40,-18,35, 16,-20,-19,-28,-42,29,47,38,74,45, 3,-29,-48,-62,-80,-104,-33,56,59,59, 10,17,46,72,84,101,117,123,123,106, -7,-33,-49,-51,-70,-67,-27,-31,70,67, -16,-62,-85,-20,82,71,86,80,85,74, -19,-58,-75,-45,-29,-33,-18,-25,45,57, -12,-42,-5,12,28,36,52,64,81,82, 13,-9,-27,-28,22,3,2,22,26,6, -6,-44,-51,2,15,10,48,43,49,34, -19,-62,-84,-89,-102,-24,8,17,61,68, 39,24,23,19,16,-5,12,15,27,15, -8,-44,-49,-60,-18,-32,-28,52,54,62, -8,-48,-77,-70,66,101,83,63,61,37, -12,-50,-75,-64,33,17,13,25,15,77, 1,-42,-29,72,64,46,49,31,61,44, -8,-47,-54,-46,-30,19,20,-1,-16,0, 16,-12,-18,-9,-26,-27,-10,-22,53,45, -10,-47,-75,-82,-105,-109,8,25,49,77, 50,65,114,117,124,118,115,96,90,61, -9,-45,-63,-60,-75,-57,8,11,20,29, 0,-35,-49,-43,40,47,35,40,55,38, -24,-76,-103,-112,-27,3,23,34,52,75, 8,-29,-43,12,63,38,35,29,24,8, 25,11,1,-15,-18,-43,-7,37,40,21, -20,-56,-19,-19,-4,-2,11,29,51,63, -2,-44,-62,-75,-89,30,57,51,74,51, 50,46,68,64,65,52,63,55,65,43, 18,-9,-26,-35,-55,-69,3,6,8,17, -15,-61,-86,-97,1,86,93,74,78,67, -1,-38,-66,-48,48,39,29,25,17,-1, 13,13,29,39,50,51,69,82,97,98, -2,-36,-46,-27,-16,-30,-13,-4,-7,-4, 25,-5,-11,-6,-25,-21,33,12,31,29, -8,-38,-52,-63,-68,-89,-33,-1,10,74, -2,-15,59,91,105,105,101,87,84,62, -7,-33,-50,-35,-54,-47,25,17,82,81, -13,-56,-83,21,58,31,42,25,72,65, -24,-66,-91,-56,9,-2,21,10,69,75, 2,-24,11,22,25,28,38,34,48,33, 7,-29,-26,17,15,-1,14,0,-2,0, -6,-41,-67,6,-2,-9,19,2,85,74, -22,-67,-84,-71,-50,3,11,-9,2,62}; const signed char cdbk_nb_low1[320]={ -34,-52,-15,45,2, 23,21,52,24,-33, -9,-1,9,-44,-41, -13,-17,44,22,-17, -6,-4,-1,22,38, 26,16,2,50,27, -35,-34,-9,-41,6, 0,-16,-34,51,8, -14,-31,-49,15,-33, 45,49,33,-11,-37, -62,-54,45,11,-5, -72,11,-1,-12,-11, 24,27,-11,-43,46, 43,33,-12,-9,-1, 1,-4,-23,-57,-71, 11,8,16,17,-8, -20,-31,-41,53,48, -16,3,65,-24,-8, -23,-32,-37,-32,-49, -10,-17,6,38,5, -9,-17,-46,8,52, 3,6,45,40,39, -7,-6,-34,-74,31, 8,1,-16,43,68, -11,-19,-31,4,6, 0,-6,-17,-16,-38, -16,-30,2,9,-39, -16,-1,43,-10,48, 3,3,-16,-31,-3, 62,68,43,13,3, -10,8,20,-56,12, 12,-2,-18,22,-15, -40,-36,1,7,41, 0,1,46,-6,-62, -4,-12,-2,-11,-83, -13,-2,91,33,-10, 0,4,-11,-16,79, 32,37,14,9,51, -21,-28,-56,-34,0, 21,9,-26,11,28, -42,-54,-23,-2,-15, 31,30,8,-39,-66, -39,-36,31,-28,-40, -46,35,40,22,24, 33,48,23,-34,14, 40,32,17,27,-3, 25,26,-13,-61,-17, 11,4,31,60,-6, -26,-41,-64,13,16, -26,54,31,-11,-23, -9,-11,-34,-71,-21, -34,-35,55,50,29, -22,-27,-50,-38,57, 33,42,57,48,26, 11,0,-49,-31,26, -4,-14,5,78,37, 17,0,-49,-12,-23, 26,14,2,2,-43, -17,-12,10,-8,-4, 8,18,12,-6,20, -12,-6,-13,-25,34, 15,40,49,7,8, 13,20,20,-19,-22, -2,-8,2,51,-51}; const signed char cdbk_nb_low2[320]={ -6,53,-21,-24,4, 26,17,-4,-37,25, 17,-36,-13,31,3, -6,27,15,-10,31, 28,26,-10,-10,-40, 16,-7,15,13,41, -9,0,-4,50,-6, -7,14,38,22,0, -48,2,1,-13,-19, 32,-3,-60,11,-17, -1,-24,-34,-1,35, -5,-27,28,44,13, 25,15,42,-11,15, 51,35,-36,20,8, -4,-12,-29,19,-47, 49,-15,-4,16,-29, -39,14,-30,4,25, -9,-5,-51,-14,-3, -40,-32,38,5,-9, -8,-4,-1,-22,71, -3,14,26,-18,-22, 24,-41,-25,-24,6, 23,19,-10,39,-26, -27,65,45,2,-7, -26,-8,22,-12,16, 15,16,-35,-5,33, -21,-8,0,23,33, 34,6,21,36,6, -7,-22,8,-37,-14, 31,38,11,-4,-3, -39,-32,-8,32,-23, -6,-12,16,20,-28, -4,23,13,-52,-1, 22,6,-33,-40,-6, 4,-62,13,5,-26, 35,39,11,2,57, -11,9,-20,-28,-33, 52,-5,-6,-2,22, -14,-16,-48,35,1, -58,20,13,33,-1, -74,56,-18,-22,-31, 12,6,-14,4,-2, -9,-47,10,-3,29, -17,-5,61,14,47, -12,2,72,-39,-17, 92,64,-53,-51,-15, -30,-38,-41,-29,-28, 27,9,36,9,-35, -42,81,-21,20,25, -16,-5,-17,-35,21, 15,-28,48,2,-2, 9,-19,29,-40,30, -18,-18,18,-16,-57, 15,-20,-12,-15,-37, -15,33,-39,21,-22, -13,35,11,13,-38, -63,29,23,-27,32, 18,3,-26,42,33, -64,-66,-17,16,56, 2,36,3,31,21, -41,-39,8,-57,14, 37,-2,19,-36,-19, -23,-29,-16,1,-3, -8,-10,31,64,-65}; const signed char cdbk_nb_high1[320]={ -26,-8,29,21,4, 19,-39,33,-7,-36, 56,54,48,40,29, -4,-24,-42,-66,-43, -60,19,-2,37,41, -10,-37,-60,-64,18, -22,77,73,40,25, 4,19,-19,-66,-2, 11,5,21,14,26, -25,-86,-4,18,1, 26,-37,10,37,-1, 24,-12,-59,-11,20, -6,34,-16,-16,42, 19,-28,-51,53,32, 4,10,62,21,-12, -34,27,4,-48,-48, -50,-49,31,-7,-21, -42,-25,-4,-43,-22, 59,2,27,12,-9, -6,-16,-8,-32,-58, -16,-29,-5,41,23, -30,-33,-46,-13,-10, -38,52,52,1,-17, -9,10,26,-25,-6, 33,-20,53,55,25, -32,-5,-42,23,21, 66,5,-28,20,9, 75,29,-7,-42,-39, 15,3,-23,21,6, 11,1,-29,14,63, 10,54,26,-24,-51, -49,7,-23,-51,15, -66,1,60,25,10, 0,-30,-4,-15,17, 19,59,40,4,-5, 33,6,-22,-58,-70, -5,23,-6,60,44, -29,-16,-47,-29,52, -19,50,28,16,35, 31,36,0,-21,6, 21,27,22,42,7, -66,-40,-8,7,19, 46,0,-4,60,36, 45,-7,-29,-6,-32, -39,2,6,-9,33, 20,-51,-34,18,-6, 19,6,11,5,-19, -29,-2,42,-11,-45, -21,-55,57,37,2, -14,-67,-16,-27,-38, 69,48,19,2,-17, 20,-20,-16,-34,-17, -25,-61,10,73,45, 16,-40,-64,-17,-29, -22,56,17,-39,8, -11,8,-25,-18,-13, -19,8,54,57,36, -17,-26,-4,6,-21, 40,42,-4,20,31, 53,10,-34,-53,31, -17,35,0,15,-6, -20,-63,-73,22,25, 29,17,8,-29,-39, -69,18,15,-15,-5}; const signed char cdbk_nb_high2[320]={ 11,47,16,-9,-46, -32,26,-64,34,-5, 38,-7,47,20,2, -73,-99,-3,-45,20, 70,-52,15,-6,-7, -82,31,21,47,51, 39,-3,9,0,-41, -7,-15,-54,2,0, 27,-31,9,-45,-22, -38,-24,-24,8,-33, 23,5,50,-36,-17, -18,-51,-2,13,19, 43,12,-15,-12,61, 38,38,7,13,0, 6,-1,3,62,9, 27,22,-33,38,-35, -9,30,-43,-9,-32, -1,4,-4,1,-5, -11,-8,38,31,11, -10,-42,-21,-37,1, 43,15,-13,-35,-19, -18,15,23,-26,59, 1,-21,53,8,-41, -50,-14,-28,4,21, 25,-28,-40,5,-40, -41,4,51,-33,-8, -8,1,17,-60,12, 25,-41,17,34,43, 19,45,7,-37,24, -15,56,-2,35,-10, 48,4,-47,-2,5, -5,-54,5,-3,-33, -10,30,-2,-44,-24, -38,9,-9,42,4, 6,-56,44,-16,9, -40,-26,18,-20,10, 28,-41,-21,-4,13, -18,32,-30,-3,37, 15,22,28,50,-40, 3,-29,-64,7,51, -19,-11,17,-27,-40, -64,24,-12,-7,-27, 3,37,48,-1,2, -9,-38,-34,46,1, 27,-6,19,-13,26, 10,34,20,25,40, 50,-6,-7,30,9, -24,0,-23,71,-61, 22,58,-34,-4,2, -49,-33,25,30,-8, -6,-16,77,2,38, -8,-35,-6,-30,56, 78,31,33,-20,13, -39,20,22,4,21, -8,4,-6,10,-83, -41,9,-25,-43,15, -7,-12,-34,-39,-37, -33,19,30,16,-33, 42,-25,25,-68,44, -15,-11,-4,23,50, 14,4,-39,-43,20, -30,60,9,-20,7, 16,19,-33,37,29, 16,-35,7,38,-27}; mumble-1.3.4/3rdparty/speex-src/libspeex/fftwrap.h0000664000175000017500000000432514010707304021756 0ustar builderbuilder/* Copyright (C) 2005 Jean-Marc Valin File: fftwrap.h Wrapper for various FFTs Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef FFTWRAP_H #define FFTWRAP_H #include "arch.h" /** Compute tables for an FFT */ void *spx_fft_init(int size); /** Destroy tables for an FFT */ void spx_fft_destroy(void *table); /** Forward (real to half-complex) transform */ void spx_fft(void *table, spx_word16_t *in, spx_word16_t *out); /** Backward (half-complex to real) transform */ void spx_ifft(void *table, spx_word16_t *in, spx_word16_t *out); /** Forward (real to half-complex) transform of float data */ void spx_fft_float(void *table, float *in, float *out); /** Backward (half-complex to real) transform of float data */ void spx_ifft_float(void *table, float *in, float *out); #endif mumble-1.3.4/3rdparty/speex-src/libspeex/vq_arm4.h0000664000175000017500000000762514010707304021664 0ustar builderbuilder/* Copyright (C) 2004 Jean-Marc Valin */ /** @file vq_arm4.h @brief ARM4-optimized vq routine */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #define OVERRIDE_VQ_NBEST void vq_nbest(spx_word16_t *in, const spx_word16_t *codebook, int len, int entries, spx_word32_t *E, int N, int *nbest, spx_word32_t *best_dist, char *stack) { int i,j; for (i=0;i=(spx_int32_t)65536) { x >>= 16; r += 16; } if (x>=256) { x >>= 8; r += 8; } if (x>=16) { x >>= 4; r += 4; } if (x>=4) { x >>= 2; r += 2; } if (x>=2) { r += 1; } return r; } static inline spx_int16_t spx_ilog4(spx_uint32_t x) { int r=0; if (x>=(spx_int32_t)65536) { x >>= 16; r += 8; } if (x>=256) { x >>= 8; r += 4; } if (x>=16) { x >>= 4; r += 2; } if (x>=4) { r += 1; } return r; } #ifdef FIXED_POINT /** Generate a pseudo-random number */ static inline spx_word16_t speex_rand(spx_word16_t std, spx_int32_t *seed) { spx_word32_t res; *seed = 1664525 * *seed + 1013904223; res = MULT16_16(EXTRACT16(SHR32(*seed,16)),std); return EXTRACT16(PSHR32(SUB32(res, SHR32(res, 3)),14)); } /* sqrt(x) ~= 0.22178 + 1.29227*x - 0.77070*x^2 + 0.25723*x^3 (for .25 < x < 1) */ /*#define C0 3634 #define C1 21173 #define C2 -12627 #define C3 4215*/ /* sqrt(x) ~= 0.22178 + 1.29227*x - 0.77070*x^2 + 0.25659*x^3 (for .25 < x < 1) */ #define C0 3634 #define C1 21173 #define C2 -12627 #define C3 4204 static inline spx_word16_t spx_sqrt(spx_word32_t x) { int k; spx_word32_t rt; k = spx_ilog4(x)-6; x = VSHR32(x, (k<<1)); rt = ADD16(C0, MULT16_16_Q14(x, ADD16(C1, MULT16_16_Q14(x, ADD16(C2, MULT16_16_Q14(x, (C3))))))); rt = VSHR32(rt,7-k); return rt; } /* log(x) ~= -2.18151 + 4.20592*x - 2.88938*x^2 + 0.86535*x^3 (for .5 < x < 1) */ #define A1 16469 #define A2 2242 #define A3 1486 static inline spx_word16_t spx_acos(spx_word16_t x) { int s=0; spx_word16_t ret; spx_word16_t sq; if (x<0) { s=1; x = NEG16(x); } x = SUB16(16384,x); x = x >> 1; sq = MULT16_16_Q13(x, ADD16(A1, MULT16_16_Q13(x, ADD16(A2, MULT16_16_Q13(x, (A3)))))); ret = spx_sqrt(SHL32(EXTEND32(sq),13)); /*ret = spx_sqrt(67108864*(-1.6129e-04 + 2.0104e+00*f + 2.7373e-01*f*f + 1.8136e-01*f*f*f));*/ if (s) ret = SUB16(25736,ret); return ret; } #define K1 8192 #define K2 -4096 #define K3 340 #define K4 -10 static inline spx_word16_t spx_cos(spx_word16_t x) { spx_word16_t x2; if (x<12868) { x2 = MULT16_16_P13(x,x); return ADD32(K1, MULT16_16_P13(x2, ADD32(K2, MULT16_16_P13(x2, ADD32(K3, MULT16_16_P13(K4, x2)))))); } else { x = SUB16(25736,x); x2 = MULT16_16_P13(x,x); return SUB32(-K1, MULT16_16_P13(x2, ADD32(K2, MULT16_16_P13(x2, ADD32(K3, MULT16_16_P13(K4, x2)))))); } } #define L1 32767 #define L2 -7651 #define L3 8277 #define L4 -626 static inline spx_word16_t _spx_cos_pi_2(spx_word16_t x) { spx_word16_t x2; x2 = MULT16_16_P15(x,x); return ADD16(1,MIN16(32766,ADD32(SUB16(L1,x2), MULT16_16_P15(x2, ADD32(L2, MULT16_16_P15(x2, ADD32(L3, MULT16_16_P15(L4, x2)))))))); } static inline spx_word16_t spx_cos_norm(spx_word32_t x) { x = x&0x0001ffff; if (x>SHL32(EXTEND32(1), 16)) x = SUB32(SHL32(EXTEND32(1), 17),x); if (x&0x00007fff) { if (x14) return 0x7fffffff; else if (integer < -15) return 0; frac = SHL16(x-SHL16(integer,11),3); frac = ADD16(D0, MULT16_16_Q14(frac, ADD16(D1, MULT16_16_Q14(frac, ADD16(D2 , MULT16_16_Q14(D3,frac)))))); return VSHR32(EXTEND32(frac), -integer-2); } /* Input in Q11 format, output in Q16 */ static inline spx_word32_t spx_exp(spx_word16_t x) { if (x>21290) return 0x7fffffff; else if (x<-21290) return 0; else return spx_exp2(MULT16_16_P14(23637,x)); } #define M1 32767 #define M2 -21 #define M3 -11943 #define M4 4936 static inline spx_word16_t spx_atan01(spx_word16_t x) { return MULT16_16_P15(x, ADD32(M1, MULT16_16_P15(x, ADD32(M2, MULT16_16_P15(x, ADD32(M3, MULT16_16_P15(M4, x))))))); } #undef M1 #undef M2 #undef M3 #undef M4 /* Input in Q15, output in Q14 */ static inline spx_word16_t spx_atan(spx_word32_t x) { if (x <= 32767) { return SHR16(spx_atan01(x),1); } else { int e = spx_ilog2(x); if (e>=29) return 25736; x = DIV32_16(SHL32(EXTEND32(32767),29-e), EXTRACT16(SHR32(x, e-14))); return SUB16(25736, SHR16(spx_atan01(x),1)); } } #else #ifndef M_PI #define M_PI 3.14159265358979323846 /* pi */ #endif #define C1 0.9999932946f #define C2 -0.4999124376f #define C3 0.0414877472f #define C4 -0.0012712095f #define SPX_PI_2 1.5707963268 static inline spx_word16_t spx_cos(spx_word16_t x) { if (x>1; j++) { spx_word16_t tmp1, tmp2; /* It could be that j == i-1-j, in which case, we're updating the same value twice, which is OK */ tmp1 = lpc[j]; tmp2 = lpc[i-1-j]; lpc[j] = MAC16_16_P13(tmp1,r,tmp2); lpc[i-1-j] = MAC16_16_P13(tmp2,r,tmp1); } error = SUB16(error,MULT16_16_Q13(r,MULT16_16_Q13(error,r))); } return error; } #ifdef FIXED_POINT /* Compute the autocorrelation * ,--, * ac(i) = > x(n) * x(n-i) for all n * `--' * for lags between 0 and lag-1, and x == 0 outside 0...n-1 */ #ifndef OVERRIDE_SPEEX_AUTOCORR void _spx_autocorr( const spx_word16_t *x, /* in: [0...n-1] samples x */ spx_word16_t *ac, /* out: [0...lag-1] ac values */ int lag, int n ) { spx_word32_t d; int i, j; spx_word32_t ac0=1; int shift, ac_shift; for (j=0;j x(n) * x(n-i) for all n * `--' * for lags between 0 and lag-1, and x == 0 outside 0...n-1 */ void _spx_autocorr( const spx_word16_t *x, /* in: [0...n-1] samples x */ float *ac, /* out: [0...lag-1] ac values */ int lag, int n ) { float d; int i; while (lag--) { for (i = lag, d = 0; i < n; i++) d += x[i] * x[i-lag]; ac[lag] = d; } ac[0] += 10; } #endif #endif /* DISABLE_ENCODER */ mumble-1.3.4/3rdparty/speex-src/libspeex/vorbis_psy.c0000664000175000017500000002662714010707304022510 0ustar builderbuilder/* Copyright (C) 2005 Jean-Marc Valin, CSIRO, Christopher Montgomery File: vorbis_psy.c Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef VORBIS_PSYCHO #include "arch.h" #include "smallft.h" #include "lpc.h" #include "vorbis_psy.h" #include "os_support.h" #include #include #include /* psychoacoustic setup ********************************************/ static VorbisPsyInfo example_tuning = { .5,.5, 3,3,25, /*63 125 250 500 1k 2k 4k 8k 16k*/ // vorbis mode 4 style //{-32,-32,-32,-32,-28,-24,-22,-20,-20, -20, -20, -8, -6, -6, -6, -6, -6}, { -4, -6, -6, -6, -6, -6, -6, -6, -8, -8,-10,-10, -8, -6, -4, -4, -2}, { 0, 1, 2, 3, 4, 5, 5, 5, /* 7dB */ 6, 6, 6, 5, 4, 4, 4, 4, /* 15dB */ 4, 4, 5, 5, 5, 6, 6, 6, /* 23dB */ 7, 7, 7, 8, 8, 8, 9, 10, /* 31dB */ 11,12,13,14,15,16,17, 18, /* 39dB */ } }; /* there was no great place to put this.... */ #include static void _analysis_output(char *base,int i,float *v,int n,int bark,int dB){ int j; FILE *of; char buffer[80]; sprintf(buffer,"%s_%d.m",base,i); of=fopen(buffer,"w"); if(!of)perror("failed to open data dump file"); for(j=0;j> 16; if( lo>=0 ) break; hi = b[i] & 0xffff; tN = N[hi] + N[-lo]; tX = X[hi] - X[-lo]; tXX = XX[hi] + XX[-lo]; tY = Y[hi] + Y[-lo]; tXY = XY[hi] - XY[-lo]; A = tY * tXX - tX * tXY; B = tN * tXY - tX * tY; D = tN * tXX - tX * tX; R = (A + x * B) / D; if (R < 0.f) R = 0.f; noise[i] = R - offset; } for ( ;; i++, x += 1.f) { lo = b[i] >> 16; hi = b[i] & 0xffff; if(hi>=n)break; tN = N[hi] - N[lo]; tX = X[hi] - X[lo]; tXX = XX[hi] - XX[lo]; tY = Y[hi] - Y[lo]; tXY = XY[hi] - XY[lo]; A = tY * tXX - tX * tXY; B = tN * tXY - tX * tY; D = tN * tXX - tX * tX; R = (A + x * B) / D; if (R < 0.f) R = 0.f; noise[i] = R - offset; } for ( ; i < n; i++, x += 1.f) { R = (A + x * B) / D; if (R < 0.f) R = 0.f; noise[i] = R - offset; } if (fixed <= 0) return; for (i = 0, x = 0.f;; i++, x += 1.f) { hi = i + fixed / 2; lo = hi - fixed; if(lo>=0)break; tN = N[hi] + N[-lo]; tX = X[hi] - X[-lo]; tXX = XX[hi] + XX[-lo]; tY = Y[hi] + Y[-lo]; tXY = XY[hi] - XY[-lo]; A = tY * tXX - tX * tXY; B = tN * tXY - tX * tY; D = tN * tXX - tX * tX; R = (A + x * B) / D; if (R - offset < noise[i]) noise[i] = R - offset; } for ( ;; i++, x += 1.f) { hi = i + fixed / 2; lo = hi - fixed; if(hi>=n)break; tN = N[hi] - N[lo]; tX = X[hi] - X[lo]; tXX = XX[hi] - XX[lo]; tY = Y[hi] - Y[lo]; tXY = XY[hi] - XY[lo]; A = tY * tXX - tX * tXY; B = tN * tXY - tX * tY; D = tN * tXX - tX * tX; R = (A + x * B) / D; if (R - offset < noise[i]) noise[i] = R - offset; } for ( ; i < n; i++, x += 1.f) { R = (A + x * B) / D; if (R - offset < noise[i]) noise[i] = R - offset; } } static void _vp_noisemask(VorbisPsy *p, float *logfreq, float *logmask){ int i,n=p->n/2; float *work=alloca(n*sizeof(*work)); bark_noise_hybridmp(n,p->bark,logfreq,logmask, 140.,-1); for(i=0;ibark,work,logmask,0., p->vi->noisewindowfixed); for(i=0;i=NOISE_COMPAND_LEVELS)dB=NOISE_COMPAND_LEVELS-1; if(dB<0)dB=0; logmask[i]= work[i]+p->vi->noisecompand[dB]+p->noiseoffset[i]; } } VorbisPsy *vorbis_psy_init(int rate, int n) { long i,j,lo=-99,hi=1; VorbisPsy *p = speex_alloc(sizeof(VorbisPsy)); memset(p,0,sizeof(*p)); p->n = n; spx_drft_init(&p->lookup, n); p->bark = speex_alloc(n*sizeof(*p->bark)); p->rate=rate; p->vi = &example_tuning; /* BH4 window */ p->window = speex_alloc(sizeof(*p->window)*n); float a0 = .35875f; float a1 = .48829f; float a2 = .14128f; float a3 = .01168f; for(i=0;iwindow[i] = //a0 - a1*cos(2.*M_PI/n*(i+.5)) + a2*cos(4.*M_PI/n*(i+.5)) - a3*cos(6.*M_PI/n*(i+.5)); sin((i+.5)/n * M_PI)*sin((i+.5)/n * M_PI); /* bark scale lookups */ for(i=0;ivi->noisewindowlominvi->noisewindowlo);lo++); for(;hi<=n && (hivi->noisewindowhimin || toBARK(rate/(2*n)*hi)<(bark+p->vi->noisewindowhi));hi++); p->bark[i]=((lo-1)<<16)+(hi-1); } /* set up rolling noise median */ p->noiseoffset=speex_alloc(n*sizeof(*p->noiseoffset)); for(i=0;i=P_BANDS-1)halfoc=P_BANDS-1; inthalfoc=(int)halfoc; del=halfoc-inthalfoc; p->noiseoffset[i]= p->vi->noiseoff[inthalfoc]*(1.-del) + p->vi->noiseoff[inthalfoc+1]*del; } #if 0 _analysis_output_always("noiseoff0",ls,p->noiseoffset,n,1,0,0); #endif return p; } void vorbis_psy_destroy(VorbisPsy *p) { if(p){ spx_drft_clear(&p->lookup); if(p->bark) speex_free(p->bark); if(p->noiseoffset) speex_free(p->noiseoffset); if(p->window) speex_free(p->window); memset(p,0,sizeof(*p)); speex_free(p); } } void compute_curve(VorbisPsy *psy, float *audio, float *curve) { int i; float work[psy->n]; float scale=4.f/psy->n; float scale_dB; scale_dB=todB(scale); /* window the PCM data; use a BH4 window, not vorbis */ for(i=0;in;i++) work[i]=audio[i] * psy->window[i]; { static int seq=0; //_analysis_output("win",seq,work,psy->n,0,0); seq++; } /* FFT yields more accurate tonal estimation (not phase sensitive) */ spx_drft_forward(&psy->lookup,work); /* magnitudes */ work[0]=scale_dB+todB(work[0]); for(i=1;in-1;i+=2){ float temp = work[i]*work[i] + work[i+1]*work[i+1]; work[(i+1)>>1] = scale_dB+.5f * todB(temp); } /* derive a noise curve */ _vp_noisemask(psy,work,curve); #define SIDEL 12 for (i=0;in>>1)-i-1]=curve[(psy->n>>1)-SIDEH]; } for(i=0;i<((psy->n)>>1);i++) curve[i] = fromdB(1.2*curve[i]+.2*i); //curve[i] = fromdB(0.8*curve[i]+.35*i); //curve[i] = fromdB(0.9*curve[i])*pow(1.0*i+45,1.3); } /* Transform a masking curve (power spectrum) into a pole-zero filter */ void curve_to_lpc(VorbisPsy *psy, float *curve, float *awk1, float *awk2, int ord) { int i; float ac[psy->n]; float tmp; int len = psy->n >> 1; for (i=0;i<2*len;i++) ac[i] = 0; for (i=1;ilookup, ac); _spx_lpc(awk1, ac, ord); tmp = 1.; for (i=0;ilookup, ac); /* Compute (power) response of awk1 (all zero) */ ac[0] *= ac[0]; for (i=1;ilookup, ac); _spx_lpc(awk2, ac, ord); tmp = 1; for (i=0;i #include #define ORDER 10 #define CURVE_SIZE 24 int main() { int i; float curve[CURVE_SIZE]; float awk1[ORDER], awk2[ORDER]; for (i=0;i void filter_mem16_10(const float *x, const float *_num, const float *_den, float *y, int N, int ord, float *_mem) { __m128 num[3], den[3], mem[3]; int i; /* Copy numerator, denominator and memory to aligned xmm */ for (i=0;i<2;i++) { mem[i] = _mm_loadu_ps(_mem+4*i); num[i] = _mm_loadu_ps(_num+4*i); den[i] = _mm_loadu_ps(_den+4*i); } mem[2] = _mm_setr_ps(_mem[8], _mem[9], 0, 0); num[2] = _mm_setr_ps(_num[8], _num[9], 0, 0); den[2] = _mm_setr_ps(_den[8], _den[9], 0, 0); for (i=0;i #include "ltp.h" #include "stack_alloc.h" #include "filters.h" #include "math_approx.h" #include "os_support.h" #ifndef NULL #define NULL 0 #endif #ifdef _USE_SSE #include "ltp_sse.h" #elif defined (ARM4_ASM) || defined(ARM5E_ASM) #include "ltp_arm4.h" #elif defined (BFIN_ASM) #include "ltp_bfin.h" #endif #ifndef OVERRIDE_INNER_PROD spx_word32_t inner_prod(const spx_word16_t *x, const spx_word16_t *y, int len) { spx_word32_t sum=0; len >>= 2; while(len--) { spx_word32_t part=0; part = MAC16_16(part,*x++,*y++); part = MAC16_16(part,*x++,*y++); part = MAC16_16(part,*x++,*y++); part = MAC16_16(part,*x++,*y++); /* HINT: If you had a 40-bit accumulator, you could shift only at the end */ sum = ADD32(sum,SHR32(part,6)); } return sum; } #endif #ifndef DISABLE_ENCODER #ifndef OVERRIDE_PITCH_XCORR #if 0 /* HINT: Enable this for machines with enough registers (i.e. not x86) */ static void pitch_xcorr(const spx_word16_t *_x, const spx_word16_t *_y, spx_word32_t *corr, int len, int nb_pitch, char *stack) { int i,j; for (i=0;i16383) { scaledown=1; break; } } /* If the weighted input is close to saturation, then we scale it down */ if (scaledown) { for (i=-end;iMULT16_16(best_score[N-1],ADD16(1,ener16[i-start]))) { /* We can safely put it last and then check */ best_score[N-1]=tmp; best_ener[N-1]=ener16[i-start]+1; pitch[N-1]=i; /* Check if it comes in front of others */ for (j=0;jMULT16_16(best_score[j],ADD16(1,ener16[i-start]))) { for (k=N-1;k>j;k--) { best_score[k]=best_score[k-1]; best_ener[k]=best_ener[k-1]; pitch[k]=pitch[k-1]; } best_score[j]=tmp; best_ener[j]=ener16[i-start]+1; pitch[j]=i; break; } } } } /* Compute open-loop gain if necessary */ if (gain) { for (j=0;jbest_sum && gain_sum<=max_gain) { best_sum=sum; best_cdbk=i; } } return best_cdbk; } #endif /** Finds the best quantized 3-tap pitch predictor by analysis by synthesis */ static spx_word32_t pitch_gain_search_3tap( const spx_word16_t target[], /* Target vector */ const spx_coef_t ak[], /* LPCs for this subframe */ const spx_coef_t awk1[], /* Weighted LPCs #1 for this subframe */ const spx_coef_t awk2[], /* Weighted LPCs #2 for this subframe */ spx_sig_t exc[], /* Excitation */ const signed char *gain_cdbk, int gain_cdbk_size, int pitch, /* Pitch value */ int p, /* Number of LPC coeffs */ int nsf, /* Number of samples in subframe */ SpeexBits *bits, char *stack, const spx_word16_t *exc2, const spx_word16_t *r, spx_word16_t *new_target, int *cdbk_index, int plc_tuning, spx_word32_t cumul_gain, int scaledown ) { int i,j; VARDECL(spx_word16_t *tmp1); VARDECL(spx_word16_t *e); spx_word16_t *x[3]; spx_word32_t corr[3]; spx_word32_t A[3][3]; spx_word16_t gain[3]; spx_word32_t err; spx_word16_t max_gain=128; int best_cdbk=0; ALLOC(tmp1, 3*nsf, spx_word16_t); ALLOC(e, nsf, spx_word16_t); if (cumul_gain > 262144) max_gain = 31; x[0]=tmp1; x[1]=tmp1+nsf; x[2]=tmp1+2*nsf; for (j=0;j0) bound = pp; for (j=0;j0) bound = pp+pitch; for (;j=0;i--) { spx_word16_t e0=exc2[-pitch-1+i]; #ifdef FIXED_POINT /* Scale excitation down if needed (avoiding overflow) */ if (scaledown) e0 = SHR16(e0,1); #endif x[i][0]=MULT16_16_Q14(r[0], e0); for (j=0;j30) plc_tuning=30; #ifdef FIXED_POINT C[0] = SHL32(C[0],1); C[1] = SHL32(C[1],1); C[2] = SHL32(C[2],1); C[3] = SHL32(C[3],1); C[4] = SHL32(C[4],1); C[5] = SHL32(C[5],1); C[6] = MAC16_32_Q15(C[6],MULT16_16_16(plc_tuning,655),C[6]); C[7] = MAC16_32_Q15(C[7],MULT16_16_16(plc_tuning,655),C[7]); C[8] = MAC16_32_Q15(C[8],MULT16_16_16(plc_tuning,655),C[8]); normalize16(C, C16, 32767, 9); #else C[6]*=.5*(1+.02*plc_tuning); C[7]*=.5*(1+.02*plc_tuning); C[8]*=.5*(1+.02*plc_tuning); #endif best_cdbk = pitch_gain_search_3tap_vq(gain_cdbk, gain_cdbk_size, C16, max_gain); #ifdef FIXED_POINT gain[0] = ADD16(32,(spx_word16_t)gain_cdbk[best_cdbk*4]); gain[1] = ADD16(32,(spx_word16_t)gain_cdbk[best_cdbk*4+1]); gain[2] = ADD16(32,(spx_word16_t)gain_cdbk[best_cdbk*4+2]); /*printf ("%d %d %d %d\n",gain[0],gain[1],gain[2], best_cdbk);*/ #else gain[0] = 0.015625*gain_cdbk[best_cdbk*4] + .5; gain[1] = 0.015625*gain_cdbk[best_cdbk*4+1]+ .5; gain[2] = 0.015625*gain_cdbk[best_cdbk*4+2]+ .5; #endif *cdbk_index=best_cdbk; } SPEEX_MEMSET(exc, 0, nsf); for (i=0;i<3;i++) { int j; int tmp1, tmp3; int pp=pitch+1-i; tmp1=nsf; if (tmp1>pp) tmp1=pp; for (j=0;jpp+pitch) tmp3=pp+pitch; for (j=tmp1;jgain_bits; gain_cdbk = params->gain_cdbk + 4*gain_cdbk_size*cdbk_offset; N=complexity; if (N>10) N=10; if (N<1) N=1; ALLOC(nbest, N, int); params = (const ltp_params*) par; if (endpitch_bits); speex_bits_pack(bits, 0, params->gain_bits); SPEEX_MEMSET(exc, 0, nsf); return start; } #ifdef FIXED_POINT /* Check if we need to scale everything down in the pitch search to avoid overflows */ for (i=0;i16383) { scaledown=1; break; } } for (i=-end;i<0;i++) { if (ABS16(exc2[i])>16383) { scaledown=1; break; } } #endif if (N>end-start+1) N=end-start+1; if (end != start) open_loop_nbest_pitch(sw, start, end, nsf, nbest, NULL, N, stack); else nbest[0] = start; ALLOC(best_exc, nsf, spx_sig_t); ALLOC(new_target, nsf, spx_word16_t); ALLOC(best_target, nsf, spx_word16_t); for (i=0;ipitch_bits); speex_bits_pack(bits, best_gain_index, params->gain_bits); #ifdef FIXED_POINT *cumul_gain = MULT16_32_Q13(SHL16(params->gain_cdbk[4*best_gain_index+3],8), MAX32(1024,*cumul_gain)); #else *cumul_gain = 0.03125*MAX32(1024,*cumul_gain)*params->gain_cdbk[4*best_gain_index+3]; #endif /*printf ("%f\n", cumul_gain);*/ /*printf ("encode pitch: %d %d\n", best_pitch, best_gain_index);*/ SPEEX_COPY(exc, best_exc, nsf); SPEEX_COPY(target, best_target, nsf); #ifdef FIXED_POINT /* Scale target back up if needed */ if (scaledown) { for (i=0;igain_bits; gain_cdbk = params->gain_cdbk + 4*gain_cdbk_size*cdbk_offset; pitch = speex_bits_unpack_unsigned(bits, params->pitch_bits); pitch += start; gain_index = speex_bits_unpack_unsigned(bits, params->gain_bits); /*printf ("decode pitch: %d %d\n", pitch, gain_index);*/ #ifdef FIXED_POINT gain[0] = ADD16(32,(spx_word16_t)gain_cdbk[gain_index*4]); gain[1] = ADD16(32,(spx_word16_t)gain_cdbk[gain_index*4+1]); gain[2] = ADD16(32,(spx_word16_t)gain_cdbk[gain_index*4+2]); #else gain[0] = 0.015625*gain_cdbk[gain_index*4]+.5; gain[1] = 0.015625*gain_cdbk[gain_index*4+1]+.5; gain[2] = 0.015625*gain_cdbk[gain_index*4+2]+.5; #endif if (count_lost && pitch > subframe_offset) { spx_word16_t gain_sum; if (1) { #ifdef FIXED_POINT spx_word16_t tmp = count_lost < 4 ? last_pitch_gain : SHR16(last_pitch_gain,1); if (tmp>62) tmp=62; #else spx_word16_t tmp = count_lost < 4 ? last_pitch_gain : 0.5 * last_pitch_gain; if (tmp>.95) tmp=.95; #endif gain_sum = gain_3tap_to_1tap(gain); if (gain_sum > tmp) { spx_word16_t fact = DIV32_16(SHL32(EXTEND32(tmp),14),gain_sum); for (i=0;i<3;i++) gain[i]=MULT16_16_Q14(fact,gain[i]); } } } *pitch_val = pitch; gain_val[0]=gain[0]; gain_val[1]=gain[1]; gain_val[2]=gain[2]; gain[0] = SHL16(gain[0],7); gain[1] = SHL16(gain[1],7); gain[2] = SHL16(gain[2],7); SPEEX_MEMSET(exc_out, 0, nsf); for (i=0;i<3;i++) { int j; int tmp1, tmp3; int pp=pitch+1-i; tmp1=nsf; if (tmp1>pp) tmp1=pp; for (j=0;jpp+pitch) tmp3=pp+pitch; for (j=tmp1;j63) pitch_coef=63; #else if (pitch_coef>.99) pitch_coef=.99; #endif for (i=0;i63) pitch_coef=63; #else if (pitch_coef>.99) pitch_coef=.99; #endif for (i=0;i #define sqr(x) ((x)*(x)) #define MIN_ENERGY 6000 #define NOISE_POW .3 #ifndef DISABLE_VBR const float vbr_nb_thresh[9][11]={ {-1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f}, /* CNG */ { 4.0f, 2.5f, 2.0f, 1.2f, 0.5f,-0.25f, -0.5f, -0.7f, -0.8f, -0.9f, -1.0f}, /* 2 kbps */ {10.0f, 6.5f, 5.2f, 4.5f, 3.9f, 3.7f, 3.0f, 2.5f, 2.3f, 1.8f, 1.0f}, /* 6 kbps */ {11.0f, 8.8f, 7.5f, 6.5f, 5.0f, 4.2f, 3.9f, 3.9f, 3.5f, 3.0f, 1.0f}, /* 8 kbps */ {11.0f, 11.0f, 9.9f, 8.5f, 7.0f, 5.25f, 4.5f, 4.0f, 4.0f, 4.0f, 2.0f}, /* 11 kbps */ {11.0f, 11.0f, 11.0f, 11.0f, 9.5f, 9.25f, 8.0f, 7.0f, 5.0f, 4.0f, 3.0f}, /* 15 kbps */ {11.0f, 11.0f, 11.0f, 11.0f, 11.0f, 11.0f, 9.5f, 8.5f, 6.2f, 5.2f, 5.0f}, /* 18 kbps */ {11.0f, 11.0f, 11.0f, 11.0f, 11.0f, 11.0f, 11.0f, 11.0f, 10.0f, 9.8f, 7.5f}, /* 24 kbps */ { 7.0f, 4.5f, 3.7f, 3.0f, 2.5f, 1.0f, 1.8f, 1.5f, 1.0f, 0.0f, 0.0f} /* 4 kbps */ }; const float vbr_hb_thresh[5][11]={ {-1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f}, /* silence */ {-1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f}, /* 2 kbps */ {11.0f, 11.0f, 9.5f, 8.5f, 7.5f, 6.0f, 5.0f, 3.9f, 3.0f, 2.0f, 1.0f}, /* 6 kbps */ {11.0f, 11.0f, 11.0f, 11.0f, 11.0f, 9.5f, 8.7f, 7.8f, 7.0f, 6.5f, 4.0f}, /* 10 kbps */ {11.0f, 11.0f, 11.0f, 11.0f, 11.0f, 11.0f, 11.0f, 11.0f, 9.8f, 7.5f, 5.5f} /* 18 kbps */ }; const float vbr_uhb_thresh[2][11]={ {-1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f}, /* silence */ { 3.9f, 2.5f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -1.0f} /* 2 kbps */ }; void vbr_init(VBRState *vbr) { int i; vbr->average_energy=1600000; vbr->last_energy=1; vbr->accum_sum=0; vbr->soft_pitch=0; vbr->last_pitch_coef=0; vbr->last_quality=0; vbr->noise_accum = .05*pow(MIN_ENERGY, NOISE_POW); vbr->noise_accum_count=.05; vbr->noise_level=vbr->noise_accum/vbr->noise_accum_count; vbr->consec_noise=0; for (i=0;ilast_log_energy[i] = log(MIN_ENERGY); } /* This function should analyse the signal and decide how critical the coding error will be perceptually. The following factors should be taken into account: -Attacks (positive energy derivative) should be coded with more bits -Stationary voiced segments should receive more bits -Segments with (very) low absolute energy should receive less bits (maybe only shaped noise?) -DTX for near-zero energy? -Stationary fricative segments should have less bits -Temporal masking: when energy slope is decreasing, decrease the bit-rate -Decrease bit-rate for males (low pitch)? -(wideband only) less bits in the high-band when signal is very non-stationary (harder to notice high-frequency noise)??? */ float vbr_analysis(VBRState *vbr, spx_word16_t *sig, int len, int pitch, float pitch_coef) { int i; float ener=0, ener1=0, ener2=0; float qual=7; int va; float log_energy; float non_st=0; float voicing; float pow_ener; for (i=0;i>1;i++) ener1 += ((float)sig[i])*sig[i]; for (i=len>>1;ilast_log_energy[i]); non_st = non_st/(30*VBR_MEMORY_SIZE); if (non_st>1) non_st=1; voicing = 3*(pitch_coef-.4)*fabs(pitch_coef-.4); vbr->average_energy = 0.9*vbr->average_energy + .1*ener; vbr->noise_level=vbr->noise_accum/vbr->noise_accum_count; pow_ener = pow(ener,NOISE_POW); if (vbr->noise_accum_count<.06 && ener>MIN_ENERGY) vbr->noise_accum = .05*pow_ener; if ((voicing<.3 && non_st < .2 && pow_ener < 1.2*vbr->noise_level) || (voicing<.3 && non_st < .05 && pow_ener < 1.5*vbr->noise_level) || (voicing<.4 && non_st < .05 && pow_ener < 1.2*vbr->noise_level) || (voicing<0 && non_st < .05)) { float tmp; va = 0; vbr->consec_noise++; if (pow_ener > 3*vbr->noise_level) tmp = 3*vbr->noise_level; else tmp = pow_ener; if (vbr->consec_noise>=4) { vbr->noise_accum = .95*vbr->noise_accum + .05*tmp; vbr->noise_accum_count = .95*vbr->noise_accum_count + .05; } } else { va = 1; vbr->consec_noise=0; } if (pow_ener < vbr->noise_level && ener>MIN_ENERGY) { vbr->noise_accum = .95*vbr->noise_accum + .05*pow_ener; vbr->noise_accum_count = .95*vbr->noise_accum_count + .05; } /* Checking for very low absolute energy */ if (ener < 30000) { qual -= .7; if (ener < 10000) qual-=.7; if (ener < 3000) qual-=.7; } else { float short_diff, long_diff; short_diff = log((ener+1)/(1+vbr->last_energy)); long_diff = log((ener+1)/(1+vbr->average_energy)); /*fprintf (stderr, "%f %f\n", short_diff, long_diff);*/ if (long_diff<-5) long_diff=-5; if (long_diff>2) long_diff=2; if (long_diff>0) qual += .6*long_diff; if (long_diff<0) qual += .5*long_diff; if (short_diff>0) { if (short_diff>5) short_diff=5; qual += 1*short_diff; } /* Checking for energy increases */ if (ener2 > 1.6*ener1) qual += .5; } vbr->last_energy = ener; vbr->soft_pitch = .8*vbr->soft_pitch + .2*pitch_coef; qual += 2.2*((pitch_coef-.4) + (vbr->soft_pitch-.4)); if (qual < vbr->last_quality) qual = .5*qual + .5*vbr->last_quality; if (qual<4) qual=4; if (qual>10) qual=10; /* if (vbr->consec_noise>=2) qual-=1.3; if (vbr->consec_noise>=5) qual-=1.3; if (vbr->consec_noise>=12) qual-=1.3; */ if (vbr->consec_noise>=3) qual=4; if (vbr->consec_noise) qual -= 1.0 * (log(3.0 + vbr->consec_noise)-log(3)); if (qual<0) qual=0; if (ener<1600000) { if (vbr->consec_noise>2) qual-=0.5*(log(3.0 + vbr->consec_noise)-log(3)); if (ener<10000&&vbr->consec_noise>2) qual-=0.5*(log(3.0 + vbr->consec_noise)-log(3)); if (qual<0) qual=0; qual += .3*log(.0001+ener/1600000.0); } if (qual<-1) qual=-1; /*printf ("%f %f %f %f %d\n", qual, voicing, non_st, pow_ener/(.01+vbr->noise_level), va);*/ vbr->last_pitch_coef = pitch_coef; vbr->last_quality = qual; for (i=VBR_MEMORY_SIZE-1;i>0;i--) vbr->last_log_energy[i] = vbr->last_log_energy[i-1]; vbr->last_log_energy[0] = log_energy; /*printf ("VBR: %f %f %f %d %f\n", (float)(log_energy-log(vbr->average_energy+MIN_ENERGY)), non_st, voicing, va, vbr->noise_level);*/ return qual; } void vbr_destroy(VBRState *vbr) { } #endif /* #ifndef DISABLE_VBR */ mumble-1.3.4/3rdparty/speex-src/libspeex/fixed_arm4.h0000664000175000017500000001065614010707304022333 0ustar builderbuilder/* Copyright (C) 2004 Jean-Marc Valin */ /** @file fixed_arm4.h @brief ARM4 fixed-point operations */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef FIXED_ARM4_H #define FIXED_ARM4_H #undef MULT16_32_Q14 static inline spx_word32_t MULT16_32_Q14(spx_word16_t x, spx_word32_t y) { int res; int dummy; asm ( "smull %0,%1,%2,%3 \n\t" "mov %0, %0, lsr #14 \n\t" "add %0, %0, %1, lsl #18 \n\t" : "=&r"(res), "=&r" (dummy) : "r"(y),"r"((int)x)); return(res); } #undef MULT16_32_Q15 static inline spx_word32_t MULT16_32_Q15(spx_word16_t x, spx_word32_t y) { int res; int dummy; asm ( "smull %0,%1,%2,%3 \n\t" "mov %0, %0, lsr #15 \n\t" "add %0, %0, %1, lsl #17 \n\t" : "=&r"(res), "=&r" (dummy) : "r"(y),"r"((int)x)); return(res); } #undef DIV32_16 static inline short DIV32_16(int a, int b) { int res=0; int dead1, dead2, dead3, dead4, dead5; __asm__ __volatile__ ( "\teor %5, %0, %1\n" "\tmovs %4, %0\n" "\trsbmi %0, %0, #0 \n" "\tmovs %4, %1\n" "\trsbmi %1, %1, #0 \n" "\tmov %4, #1\n" "\tsubs %3, %0, %1, asl #14 \n" "\tmovpl %0, %3 \n" "\torrpl %2, %2, %4, asl #14 \n" "\tsubs %3, %0, %1, asl #13 \n" "\tmovpl %0, %3 \n" "\torrpl %2, %2, %4, asl #13 \n" "\tsubs %3, %0, %1, asl #12 \n" "\tmovpl %0, %3 \n" "\torrpl %2, %2, %4, asl #12 \n" "\tsubs %3, %0, %1, asl #11 \n" "\tmovpl %0, %3 \n" "\torrpl %2, %2, %4, asl #11 \n" "\tsubs %3, %0, %1, asl #10 \n" "\tmovpl %0, %3 \n" "\torrpl %2, %2, %4, asl #10 \n" "\tsubs %3, %0, %1, asl #9 \n" "\tmovpl %0, %3 \n" "\torrpl %2, %2, %4, asl #9 \n" "\tsubs %3, %0, %1, asl #8 \n" "\tmovpl %0, %3 \n" "\torrpl %2, %2, %4, asl #8 \n" "\tsubs %3, %0, %1, asl #7 \n" "\tmovpl %0, %3 \n" "\torrpl %2, %2, %4, asl #7 \n" "\tsubs %3, %0, %1, asl #6 \n" "\tmovpl %0, %3 \n" "\torrpl %2, %2, %4, asl #6 \n" "\tsubs %3, %0, %1, asl #5 \n" "\tmovpl %0, %3 \n" "\torrpl %2, %2, %4, asl #5 \n" "\tsubs %3, %0, %1, asl #4 \n" "\tmovpl %0, %3 \n" "\torrpl %2, %2, %4, asl #4 \n" "\tsubs %3, %0, %1, asl #3 \n" "\tmovpl %0, %3 \n" "\torrpl %2, %2, %4, asl #3 \n" "\tsubs %3, %0, %1, asl #2 \n" "\tmovpl %0, %3 \n" "\torrpl %2, %2, %4, asl #2 \n" "\tsubs %3, %0, %1, asl #1 \n" "\tmovpl %0, %3 \n" "\torrpl %2, %2, %4, asl #1 \n" "\tsubs %3, %0, %1 \n" "\tmovpl %0, %3 \n" "\torrpl %2, %2, %4 \n" "\tmovs %5, %5, lsr #31 \n" "\trsbne %2, %2, #0 \n" : "=r" (dead1), "=r" (dead2), "=r" (res), "=r" (dead3), "=r" (dead4), "=r" (dead5) : "0" (a), "1" (b), "2" (res) : "cc" ); return res; } #endif mumble-1.3.4/3rdparty/speex-src/libspeex/cb_search.h0000664000175000017500000000676114010707304022224 0ustar builderbuilder/* Copyright (C) 2002 Jean-Marc Valin & David Rowe */ /** @file cb_search.h @brief Overlapped codebook search */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef CB_SEARCH_H #define CB_SEARCH_H #include "speex/speex_bits.h" #include "arch.h" /** Split codebook parameters. */ typedef struct split_cb_params { int subvect_size; int nb_subvect; const signed char *shape_cb; int shape_bits; int have_sign; } split_cb_params; void split_cb_search_shape_sign( spx_word16_t target[], /* target vector */ spx_coef_t ak[], /* LPCs for this subframe */ spx_coef_t awk1[], /* Weighted LPCs for this subframe */ spx_coef_t awk2[], /* Weighted LPCs for this subframe */ const void *par, /* Codebook/search parameters */ int p, /* number of LPC coeffs */ int nsf, /* number of samples in subframe */ spx_sig_t *exc, spx_word16_t *r, SpeexBits *bits, char *stack, int complexity, int update_target ); void split_cb_shape_sign_unquant( spx_sig_t *exc, const void *par, /* non-overlapping codebook */ int nsf, /* number of samples in subframe */ SpeexBits *bits, char *stack, spx_int32_t *seed ); void noise_codebook_quant( spx_word16_t target[], /* target vector */ spx_coef_t ak[], /* LPCs for this subframe */ spx_coef_t awk1[], /* Weighted LPCs for this subframe */ spx_coef_t awk2[], /* Weighted LPCs for this subframe */ const void *par, /* Codebook/search parameters */ int p, /* number of LPC coeffs */ int nsf, /* number of samples in subframe */ spx_sig_t *exc, spx_word16_t *r, SpeexBits *bits, char *stack, int complexity, int update_target ); void noise_codebook_unquant( spx_sig_t *exc, const void *par, /* non-overlapping codebook */ int nsf, /* number of samples in subframe */ SpeexBits *bits, char *stack, spx_int32_t *seed ); #endif mumble-1.3.4/3rdparty/speex-src/libspeex/fixed_bfin.h0000664000175000017500000001131314010707304022375 0ustar builderbuilder/* Copyright (C) 2005 Analog Devices Author: Jean-Marc Valin */ /** @file fixed_bfin.h @brief Blackfin fixed-point operations */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef FIXED_BFIN_H #define FIXED_BFIN_H #include "bfin.h" #undef PDIV32_16 static inline spx_word16_t PDIV32_16(spx_word32_t a, spx_word16_t b) { spx_word32_t res, bb; bb = b; a += b>>1; __asm__ ( "P0 = 15;\n\t" "R0 = %1;\n\t" "R1 = %2;\n\t" //"R0 = R0 + R1;\n\t" "R0 <<= 1;\n\t" "DIVS (R0, R1);\n\t" "LOOP divide%= LC0 = P0;\n\t" "LOOP_BEGIN divide%=;\n\t" "DIVQ (R0, R1);\n\t" "LOOP_END divide%=;\n\t" "R0 = R0.L;\n\t" "%0 = R0;\n\t" : "=m" (res) : "m" (a), "m" (bb) : "P0", "R0", "R1", "ASTAT" BFIN_HWLOOP0_REGS); return res; } #undef DIV32_16 static inline spx_word16_t DIV32_16(spx_word32_t a, spx_word16_t b) { spx_word32_t res, bb; bb = b; /* Make the roundinf consistent with the C version (do we need to do that?)*/ if (a<0) a += (b-1); __asm__ ( "P0 = 15;\n\t" "R0 = %1;\n\t" "R1 = %2;\n\t" "R0 <<= 1;\n\t" "DIVS (R0, R1);\n\t" "LOOP divide%= LC0 = P0;\n\t" "LOOP_BEGIN divide%=;\n\t" "DIVQ (R0, R1);\n\t" "LOOP_END divide%=;\n\t" "R0 = R0.L;\n\t" "%0 = R0;\n\t" : "=m" (res) : "m" (a), "m" (bb) : "P0", "R0", "R1", "ASTAT" BFIN_HWLOOP0_REGS); return res; } #undef MAX16 static inline spx_word16_t MAX16(spx_word16_t a, spx_word16_t b) { spx_word32_t res; __asm__ ( "%1 = %1.L (X);\n\t" "%2 = %2.L (X);\n\t" "%0 = MAX(%1,%2);" : "=d" (res) : "%d" (a), "d" (b) : "ASTAT" ); return res; } #undef MULT16_32_Q15 static inline spx_word32_t MULT16_32_Q15(spx_word16_t a, spx_word32_t b) { spx_word32_t res; __asm__ ( "A1 = %2.L*%1.L (M);\n\t" "A1 = A1 >>> 15;\n\t" "%0 = (A1 += %2.L*%1.H) ;\n\t" : "=&W" (res), "=&d" (b) : "d" (a), "1" (b) : "A1", "ASTAT" ); return res; } #undef MAC16_32_Q15 static inline spx_word32_t MAC16_32_Q15(spx_word32_t c, spx_word16_t a, spx_word32_t b) { spx_word32_t res; __asm__ ( "A1 = %2.L*%1.L (M);\n\t" "A1 = A1 >>> 15;\n\t" "%0 = (A1 += %2.L*%1.H);\n\t" "%0 = %0 + %4;\n\t" : "=&W" (res), "=&d" (b) : "d" (a), "1" (b), "d" (c) : "A1", "ASTAT" ); return res; } #undef MULT16_32_Q14 static inline spx_word32_t MULT16_32_Q14(spx_word16_t a, spx_word32_t b) { spx_word32_t res; __asm__ ( "%2 <<= 1;\n\t" "A1 = %1.L*%2.L (M);\n\t" "A1 = A1 >>> 15;\n\t" "%0 = (A1 += %1.L*%2.H);\n\t" : "=W" (res), "=d" (a), "=d" (b) : "1" (a), "2" (b) : "A1", "ASTAT" ); return res; } #undef MAC16_32_Q14 static inline spx_word32_t MAC16_32_Q14(spx_word32_t c, spx_word16_t a, spx_word32_t b) { spx_word32_t res; __asm__ ( "%1 <<= 1;\n\t" "A1 = %2.L*%1.L (M);\n\t" "A1 = A1 >>> 15;\n\t" "%0 = (A1 += %2.L*%1.H);\n\t" "%0 = %0 + %4;\n\t" : "=&W" (res), "=&d" (b) : "d" (a), "1" (b), "d" (c) : "A1", "ASTAT" ); return res; } #endif mumble-1.3.4/3rdparty/speex-src/libspeex/ltp_sse.h0000664000175000017500000000620614010707304021756 0ustar builderbuilder/* Copyright (C) 2002 Jean-Marc Valin */ /** @file ltp_sse.h @brief Long-Term Prediction functions (SSE version) */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #define OVERRIDE_INNER_PROD float inner_prod(const float *a, const float *b, int len) { int i; float ret; __m128 sum = _mm_setzero_ps(); for (i=0;i<(len>>2);i+=2) { sum = _mm_add_ps(sum, _mm_mul_ps(_mm_loadu_ps(a+0), _mm_loadu_ps(b+0))); sum = _mm_add_ps(sum, _mm_mul_ps(_mm_loadu_ps(a+4), _mm_loadu_ps(b+4))); a += 8; b += 8; } sum = _mm_add_ps(sum, _mm_movehl_ps(sum, sum)); sum = _mm_add_ss(sum, _mm_shuffle_ps(sum, sum, 0x55)); _mm_store_ss(&ret, sum); return ret; } #define OVERRIDE_PITCH_XCORR void pitch_xcorr(const float *_x, const float *_y, float *corr, int len, int nb_pitch, char *stack) { int i, offset; VARDECL(__m128 *x); VARDECL(__m128 *y); int N, L; N = len>>2; L = nb_pitch>>2; ALLOC(x, N, __m128); ALLOC(y, N+L, __m128); for (i=0;i #include "nb_celp.h" #include "lpc.h" #include "lsp.h" #include "ltp.h" #include "quant_lsp.h" #include "cb_search.h" #include "filters.h" #include "stack_alloc.h" #include "vq.h" #include "vbr.h" #include "arch.h" #include "math_approx.h" #include "os_support.h" #ifdef VORBIS_PSYCHO #include "vorbis_psy.h" #endif #ifndef NULL #define NULL 0 #endif #define SUBMODE(x) st->submodes[st->submodeID]->x /* Default size for the encoder and decoder stack (can be changed at compile time). This does not apply when using variable-size arrays or alloca. */ #ifndef NB_ENC_STACK #define NB_ENC_STACK (8000*sizeof(spx_sig_t)) #endif #ifndef NB_DEC_STACK #define NB_DEC_STACK (4000*sizeof(spx_sig_t)) #endif #ifdef FIXED_POINT static const spx_word32_t ol_gain_table[32]={18900, 25150, 33468, 44536, 59265, 78865, 104946, 139653, 185838, 247297, 329081, 437913, 582736, 775454, 1031906, 1373169, 1827293, 2431601, 3235761, 4305867, 5729870, 7624808, 10146425, 13501971, 17967238, 23909222, 31816294, 42338330, 56340132, 74972501, 99766822, 132760927}; static const spx_word16_t exc_gain_quant_scal3_bound[7]={1841, 3883, 6051, 8062, 10444, 13580, 18560}; static const spx_word16_t exc_gain_quant_scal3[8]={1002, 2680, 5086, 7016, 9108, 11781, 15380, 21740}; static const spx_word16_t exc_gain_quant_scal1_bound[1]={14385}; static const spx_word16_t exc_gain_quant_scal1[2]={11546, 17224}; #define LSP_MARGIN 16 #define LSP_DELTA1 6553 #define LSP_DELTA2 1638 #else static const float exc_gain_quant_scal3_bound[7]={0.112338f, 0.236980f, 0.369316f, 0.492054f, 0.637471f, 0.828874f, 1.132784f}; static const float exc_gain_quant_scal3[8]={0.061130f, 0.163546f, 0.310413f, 0.428220f, 0.555887f, 0.719055f, 0.938694f, 1.326874f}; static const float exc_gain_quant_scal1_bound[1]={0.87798f}; static const float exc_gain_quant_scal1[2]={0.70469f, 1.05127f}; #define LSP_MARGIN .002f #define LSP_DELTA1 .2f #define LSP_DELTA2 .05f #endif #ifdef VORBIS_PSYCHO #define EXTRA_BUFFER 100 #else #define EXTRA_BUFFER 0 #endif extern const spx_word16_t lag_window[]; extern const spx_word16_t lpc_window[]; #ifndef DISABLE_ENCODER void *nb_encoder_init(const SpeexMode *m) { EncState *st; const SpeexNBMode *mode; int i; mode=(const SpeexNBMode *)m->mode; st = (EncState*)speex_alloc(sizeof(EncState)); if (!st) return NULL; #if defined(VAR_ARRAYS) || defined (USE_ALLOCA) st->stack = NULL; #else st->stack = (char*)speex_alloc_scratch(NB_ENC_STACK); #endif st->mode=m; st->gamma1=mode->gamma1; st->gamma2=mode->gamma2; st->lpc_floor = mode->lpc_floor; st->submodes=mode->submodes; st->submodeID=st->submodeSelect=mode->defaultSubmode; st->bounded_pitch = 1; st->encode_submode = 1; #ifdef VORBIS_PSYCHO st->psy = vorbis_psy_init(8000, 256); st->curve = (float*)speex_alloc(128*sizeof(float)); st->old_curve = (float*)speex_alloc(128*sizeof(float)); st->psy_window = (float*)speex_alloc(256*sizeof(float)); #endif st->cumul_gain = 1024; st->window= lpc_window; /* Create the window for autocorrelation (lag-windowing) */ st->lagWindow = lag_window; st->first = 1; for (i=0;iold_lsp[i]= DIV32(MULT16_16(QCONST16(3.1415927f, LSP_SHIFT), i+1), NB_ORDER+1); st->innov_rms_save = NULL; #ifndef DISABLE_VBR vbr_init(&st->vbr); st->vbr_quality = 8; st->vbr_enabled = 0; st->vbr_max = 0; st->vad_enabled = 0; st->dtx_enabled = 0; st->dtx_count=0; st->abr_enabled = 0; st->abr_drift = 0; st->abr_drift2 = 0; #endif /* #ifndef DISABLE_VBR */ st->plc_tuning = 2; st->complexity=2; st->sampling_rate=8000; st->isWideband = 0; st->highpass_enabled = 1; #ifdef ENABLE_VALGRIND VALGRIND_MAKE_READABLE(st, NB_ENC_STACK); #endif return st; } void nb_encoder_destroy(void *state) { EncState *st=(EncState *)state; /* Free all allocated memory */ #if !(defined(VAR_ARRAYS) || defined (USE_ALLOCA)) speex_free_scratch(st->stack); #endif #ifndef DISABLE_VBR vbr_destroy(&st->vbr); #endif /* #ifndef DISABLE_VBR */ #ifdef VORBIS_PSYCHO vorbis_psy_destroy(st->psy); speex_free (st->curve); speex_free (st->old_curve); speex_free (st->psy_window); #endif /*Free state memory... should be last*/ speex_free(st); } int nb_encoder_ctl(void *state, int request, void *ptr) { EncState *st; st=(EncState*)state; switch(request) { case SPEEX_GET_FRAME_SIZE: (*(spx_int32_t*)ptr) = NB_FRAME_SIZE; break; case SPEEX_SET_LOW_MODE: case SPEEX_SET_MODE: st->submodeSelect = st->submodeID = (*(spx_int32_t*)ptr); break; case SPEEX_GET_LOW_MODE: case SPEEX_GET_MODE: (*(spx_int32_t*)ptr) = st->submodeID; break; #ifndef DISABLE_VBR case SPEEX_SET_VBR: st->vbr_enabled = (*(spx_int32_t*)ptr); break; case SPEEX_GET_VBR: (*(spx_int32_t*)ptr) = st->vbr_enabled; break; case SPEEX_SET_VAD: st->vad_enabled = (*(spx_int32_t*)ptr); break; case SPEEX_GET_VAD: (*(spx_int32_t*)ptr) = st->vad_enabled; break; case SPEEX_SET_DTX: st->dtx_enabled = (*(spx_int32_t*)ptr); break; case SPEEX_GET_DTX: (*(spx_int32_t*)ptr) = st->dtx_enabled; break; case SPEEX_SET_ABR: st->abr_enabled = (*(spx_int32_t*)ptr); st->vbr_enabled = st->abr_enabled!=0; if (st->vbr_enabled) { spx_int32_t i=10; spx_int32_t rate, target; float vbr_qual; target = (*(spx_int32_t*)ptr); while (i>=0) { speex_encoder_ctl(st, SPEEX_SET_QUALITY, &i); speex_encoder_ctl(st, SPEEX_GET_BITRATE, &rate); if (rate <= target) break; i--; } vbr_qual=i; if (vbr_qual<0) vbr_qual=0; speex_encoder_ctl(st, SPEEX_SET_VBR_QUALITY, &vbr_qual); st->abr_count=0; st->abr_drift=0; st->abr_drift2=0; } break; case SPEEX_GET_ABR: (*(spx_int32_t*)ptr) = st->abr_enabled; break; #endif /* #ifndef DISABLE_VBR */ #if !defined(DISABLE_VBR) && !defined(DISABLE_FLOAT_API) case SPEEX_SET_VBR_QUALITY: st->vbr_quality = (*(float*)ptr); break; case SPEEX_GET_VBR_QUALITY: (*(float*)ptr) = st->vbr_quality; break; #endif /* !defined(DISABLE_VBR) && !defined(DISABLE_FLOAT_API) */ case SPEEX_SET_QUALITY: { int quality = (*(spx_int32_t*)ptr); if (quality < 0) quality = 0; if (quality > 10) quality = 10; st->submodeSelect = st->submodeID = ((const SpeexNBMode*)(st->mode->mode))->quality_map[quality]; } break; case SPEEX_SET_COMPLEXITY: st->complexity = (*(spx_int32_t*)ptr); if (st->complexity<0) st->complexity=0; break; case SPEEX_GET_COMPLEXITY: (*(spx_int32_t*)ptr) = st->complexity; break; case SPEEX_SET_BITRATE: { spx_int32_t i=10; spx_int32_t rate, target; target = (*(spx_int32_t*)ptr); while (i>=0) { speex_encoder_ctl(st, SPEEX_SET_QUALITY, &i); speex_encoder_ctl(st, SPEEX_GET_BITRATE, &rate); if (rate <= target) break; i--; } } break; case SPEEX_GET_BITRATE: if (st->submodes[st->submodeID]) (*(spx_int32_t*)ptr) = st->sampling_rate*SUBMODE(bits_per_frame)/NB_FRAME_SIZE; else (*(spx_int32_t*)ptr) = st->sampling_rate*(NB_SUBMODE_BITS+1)/NB_FRAME_SIZE; break; case SPEEX_SET_SAMPLING_RATE: st->sampling_rate = (*(spx_int32_t*)ptr); break; case SPEEX_GET_SAMPLING_RATE: (*(spx_int32_t*)ptr)=st->sampling_rate; break; case SPEEX_RESET_STATE: { int i; st->bounded_pitch = 1; st->first = 1; for (i=0;iold_lsp[i]= DIV32(MULT16_16(QCONST16(3.1415927f, LSP_SHIFT), i+1), NB_ORDER+1); for (i=0;imem_sw[i]=st->mem_sw_whole[i]=st->mem_sp[i]=st->mem_exc[i]=0; for (i=0;iexcBuf[i]=st->swBuf[i]=0; for (i=0;iwinBuf[i]=0; } break; case SPEEX_SET_SUBMODE_ENCODING: st->encode_submode = (*(spx_int32_t*)ptr); break; case SPEEX_GET_SUBMODE_ENCODING: (*(spx_int32_t*)ptr) = st->encode_submode; break; case SPEEX_GET_LOOKAHEAD: (*(spx_int32_t*)ptr)=(NB_WINDOW_SIZE-NB_FRAME_SIZE); break; case SPEEX_SET_PLC_TUNING: st->plc_tuning = (*(spx_int32_t*)ptr); if (st->plc_tuning>100) st->plc_tuning=100; break; case SPEEX_GET_PLC_TUNING: (*(spx_int32_t*)ptr)=(st->plc_tuning); break; #ifndef DISABLE_VBR case SPEEX_SET_VBR_MAX_BITRATE: st->vbr_max = (*(spx_int32_t*)ptr); break; case SPEEX_GET_VBR_MAX_BITRATE: (*(spx_int32_t*)ptr) = st->vbr_max; break; #endif /* #ifndef DISABLE_VBR */ case SPEEX_SET_HIGHPASS: st->highpass_enabled = (*(spx_int32_t*)ptr); break; case SPEEX_GET_HIGHPASS: (*(spx_int32_t*)ptr) = st->highpass_enabled; break; /* This is all internal stuff past this point */ case SPEEX_GET_PI_GAIN: { int i; spx_word32_t *g = (spx_word32_t*)ptr; for (i=0;ipi_gain[i]; } break; case SPEEX_GET_EXC: { int i; for (i=0;iexc+i*NB_SUBFRAME_SIZE, NB_SUBFRAME_SIZE); } break; #ifndef DISABLE_VBR case SPEEX_GET_RELATIVE_QUALITY: (*(float*)ptr)=st->relative_quality; break; #endif /* #ifndef DISABLE_VBR */ case SPEEX_SET_INNOVATION_SAVE: st->innov_rms_save = (spx_word16_t*)ptr; break; case SPEEX_SET_WIDEBAND: st->isWideband = *((spx_int32_t*)ptr); break; case SPEEX_GET_STACK: *((char**)ptr) = st->stack; break; default: speex_warning_int("Unknown nb_ctl request: ", request); return -1; } return 0; } int nb_encode(void *state, void *vin, SpeexBits *bits) { EncState *st; int i, sub, roots; int ol_pitch; spx_word16_t ol_pitch_coef; spx_word32_t ol_gain; VARDECL(spx_word16_t *target); VARDECL(spx_sig_t *innov); VARDECL(spx_word32_t *exc32); VARDECL(spx_mem_t *mem); VARDECL(spx_coef_t *bw_lpc1); VARDECL(spx_coef_t *bw_lpc2); VARDECL(spx_coef_t *lpc); VARDECL(spx_lsp_t *lsp); VARDECL(spx_lsp_t *qlsp); VARDECL(spx_lsp_t *interp_lsp); VARDECL(spx_lsp_t *interp_qlsp); VARDECL(spx_coef_t *interp_lpc); VARDECL(spx_coef_t *interp_qlpc); char *stack; VARDECL(spx_word16_t *syn_resp); spx_word32_t ener=0; spx_word16_t fine_gain; spx_word16_t *in = (spx_word16_t*)vin; st=(EncState *)state; stack=st->stack; ALLOC(lpc, NB_ORDER, spx_coef_t); ALLOC(bw_lpc1, NB_ORDER, spx_coef_t); ALLOC(bw_lpc2, NB_ORDER, spx_coef_t); ALLOC(lsp, NB_ORDER, spx_lsp_t); ALLOC(qlsp, NB_ORDER, spx_lsp_t); ALLOC(interp_lsp, NB_ORDER, spx_lsp_t); ALLOC(interp_qlsp, NB_ORDER, spx_lsp_t); ALLOC(interp_lpc, NB_ORDER, spx_coef_t); ALLOC(interp_qlpc, NB_ORDER, spx_coef_t); st->exc = st->excBuf + NB_PITCH_END + 2; st->sw = st->swBuf + NB_PITCH_END + 2; /* Move signals 1 frame towards the past */ SPEEX_MOVE(st->excBuf, st->excBuf+NB_FRAME_SIZE, NB_PITCH_END+2); SPEEX_MOVE(st->swBuf, st->swBuf+NB_FRAME_SIZE, NB_PITCH_END+2); if (st->highpass_enabled) highpass(in, in, NB_FRAME_SIZE, (st->isWideband?HIGHPASS_WIDEBAND:HIGHPASS_NARROWBAND)|HIGHPASS_INPUT, st->mem_hp); { VARDECL(spx_word16_t *w_sig); VARDECL(spx_word16_t *autocorr); ALLOC(w_sig, NB_WINDOW_SIZE, spx_word16_t); ALLOC(autocorr, NB_ORDER+1, spx_word16_t); /* Window for analysis */ for (i=0;iwinBuf[i],st->window[i]); for (;iwindow[i]); /* Compute auto-correlation */ _spx_autocorr(w_sig, autocorr, NB_ORDER+1, NB_WINDOW_SIZE); autocorr[0] = ADD16(autocorr[0],MULT16_16_Q15(autocorr[0],st->lpc_floor)); /* Noise floor in auto-correlation domain */ /* Lag windowing: equivalent to filtering in the power-spectrum domain */ for (i=0;ilagWindow[i]); autocorr[0] = ADD16(autocorr[0],1); /* Levinson-Durbin */ _spx_lpc(lpc, autocorr, NB_ORDER); /* LPC to LSPs (x-domain) transform */ roots=lpc_to_lsp (lpc, NB_ORDER, lsp, 10, LSP_DELTA1, stack); /* Check if we found all the roots */ if (roots!=NB_ORDER) { /*If we can't find all LSP's, do some damage control and use previous filter*/ for (i=0;iold_lsp[i]; } } } /* Whole frame analysis (open-loop estimation of pitch and excitation gain) */ { int diff = NB_WINDOW_SIZE-NB_FRAME_SIZE; if (st->first) for (i=0;iold_lsp, lsp, interp_lsp, NB_ORDER, NB_NB_SUBFRAMES, NB_NB_SUBFRAMES<<1, LSP_MARGIN); /* Compute interpolated LPCs (unquantized) for whole frame*/ lsp_to_lpc(interp_lsp, interp_lpc, NB_ORDER,stack); /*Open-loop pitch*/ if (!st->submodes[st->submodeID] || (st->complexity>2 && SUBMODE(have_subframe_gain)<3) || SUBMODE(forced_pitch_gain) || SUBMODE(lbr_pitch) != -1 #ifndef DISABLE_VBR || st->vbr_enabled || st->vad_enabled #endif ) { int nol_pitch[6]; spx_word16_t nol_pitch_coef[6]; bw_lpc(0.9, interp_lpc, bw_lpc1, NB_ORDER); bw_lpc(0.55, interp_lpc, bw_lpc2, NB_ORDER); SPEEX_COPY(st->sw, st->winBuf, diff); SPEEX_COPY(st->sw+diff, in, NB_FRAME_SIZE-diff); filter10(st->sw, bw_lpc1, bw_lpc2, st->sw, NB_FRAME_SIZE, st->mem_sw_whole, stack); open_loop_nbest_pitch(st->sw, NB_PITCH_START, NB_PITCH_END, NB_FRAME_SIZE, nol_pitch, nol_pitch_coef, 6, stack); ol_pitch=nol_pitch[0]; ol_pitch_coef = nol_pitch_coef[0]; /*Try to remove pitch multiples*/ for (i=1;i<6;i++) { #ifdef FIXED_POINT if ((nol_pitch_coef[i]>MULT16_16_Q15(nol_pitch_coef[0],27853)) && #else if ((nol_pitch_coef[i]>.85*nol_pitch_coef[0]) && #endif (ABS(2*nol_pitch[i]-ol_pitch)<=2 || ABS(3*nol_pitch[i]-ol_pitch)<=3 || ABS(4*nol_pitch[i]-ol_pitch)<=4 || ABS(5*nol_pitch[i]-ol_pitch)<=5)) { /*ol_pitch_coef=nol_pitch_coef[i];*/ ol_pitch = nol_pitch[i]; } } /*if (ol_pitch>50) ol_pitch/=2;*/ /*ol_pitch_coef = sqrt(ol_pitch_coef);*/ } else { ol_pitch=0; ol_pitch_coef=0; } /*Compute "real" excitation*/ /*SPEEX_COPY(st->exc, st->winBuf, diff); SPEEX_COPY(st->exc+diff, in, NB_FRAME_SIZE-diff);*/ fir_mem16(st->winBuf, interp_lpc, st->exc, diff, NB_ORDER, st->mem_exc, stack); fir_mem16(in, interp_lpc, st->exc+diff, NB_FRAME_SIZE-diff, NB_ORDER, st->mem_exc, stack); /* Compute open-loop excitation gain */ { spx_word16_t g = compute_rms16(st->exc, NB_FRAME_SIZE); if (st->submodeID!=1 && ol_pitch>0) ol_gain = MULT16_16(g, MULT16_16_Q14(QCONST16(1.1,14), spx_sqrt(QCONST32(1.,28)-MULT16_32_Q15(QCONST16(.8,15),SHL32(MULT16_16(ol_pitch_coef,ol_pitch_coef),16))))); else ol_gain = SHL32(EXTEND32(g),SIG_SHIFT); } } #ifdef VORBIS_PSYCHO SPEEX_MOVE(st->psy_window, st->psy_window+NB_FRAME_SIZE, 256-NB_FRAME_SIZE); SPEEX_COPY(&st->psy_window[256-NB_FRAME_SIZE], in, NB_FRAME_SIZE); compute_curve(st->psy, st->psy_window, st->curve); /*print_vec(st->curve, 128, "curve");*/ if (st->first) SPEEX_COPY(st->old_curve, st->curve, 128); #endif /*VBR stuff*/ #ifndef DISABLE_VBR if (st->vbr_enabled||st->vad_enabled) { float lsp_dist=0; for (i=0;iold_lsp[i] - lsp[i])*(st->old_lsp[i] - lsp[i]); lsp_dist /= LSP_SCALING*LSP_SCALING; if (st->abr_enabled) { float qual_change=0; if (st->abr_drift2 * st->abr_drift > 0) { /* Only adapt if long-term and short-term drift are the same sign */ qual_change = -.00001*st->abr_drift/(1+st->abr_count); if (qual_change>.05) qual_change=.05; if (qual_change<-.05) qual_change=-.05; } st->vbr_quality += qual_change; if (st->vbr_quality>10) st->vbr_quality=10; if (st->vbr_quality<0) st->vbr_quality=0; } st->relative_quality = vbr_analysis(&st->vbr, in, NB_FRAME_SIZE, ol_pitch, GAIN_SCALING_1*ol_pitch_coef); /*if (delta_qual<0)*/ /* delta_qual*=.1*(3+st->vbr_quality);*/ if (st->vbr_enabled) { spx_int32_t mode; int choice=0; float min_diff=100; mode = 8; while (mode) { int v1; float thresh; v1=(int)floor(st->vbr_quality); if (v1==10) thresh = vbr_nb_thresh[mode][v1]; else thresh = (st->vbr_quality-v1)*vbr_nb_thresh[mode][v1+1] + (1+v1-st->vbr_quality)*vbr_nb_thresh[mode][v1]; if (st->relative_quality > thresh && st->relative_quality-threshrelative_quality-thresh; } mode--; } mode=choice; if (mode==0) { if (st->dtx_count==0 || lsp_dist>.05 || !st->dtx_enabled || st->dtx_count>20) { mode=1; st->dtx_count=1; } else { mode=0; st->dtx_count++; } } else { st->dtx_count=0; } speex_encoder_ctl(state, SPEEX_SET_MODE, &mode); if (st->vbr_max>0) { spx_int32_t rate; speex_encoder_ctl(state, SPEEX_GET_BITRATE, &rate); if (rate > st->vbr_max) { rate = st->vbr_max; speex_encoder_ctl(state, SPEEX_SET_BITRATE, &rate); } } if (st->abr_enabled) { spx_int32_t bitrate; speex_encoder_ctl(state, SPEEX_GET_BITRATE, &bitrate); st->abr_drift+=(bitrate-st->abr_enabled); st->abr_drift2 = .95*st->abr_drift2 + .05*(bitrate-st->abr_enabled); st->abr_count += 1.0; } } else { /*VAD only case*/ int mode; if (st->relative_quality<2) { if (st->dtx_count==0 || lsp_dist>.05 || !st->dtx_enabled || st->dtx_count>20) { st->dtx_count=1; mode=1; } else { mode=0; st->dtx_count++; } } else { st->dtx_count = 0; mode=st->submodeSelect; } /*speex_encoder_ctl(state, SPEEX_SET_MODE, &mode);*/ st->submodeID=mode; } } else { st->relative_quality = -1; } #endif /* #ifndef DISABLE_VBR */ if (st->encode_submode) { /* First, transmit a zero for narrowband */ speex_bits_pack(bits, 0, 1); /* Transmit the sub-mode we use for this frame */ speex_bits_pack(bits, st->submodeID, NB_SUBMODE_BITS); } /* If null mode (no transmission), just set a couple things to zero*/ if (st->submodes[st->submodeID] == NULL) { for (i=0;iexc[i]=st->sw[i]=VERY_SMALL; for (i=0;imem_sw[i]=0; st->first=1; st->bounded_pitch = 1; SPEEX_COPY(st->winBuf, in+2*NB_FRAME_SIZE-NB_WINDOW_SIZE, NB_WINDOW_SIZE-NB_FRAME_SIZE); /* Clear memory (no need to really compute it) */ for (i=0;imem_sp[i] = 0; return 0; } /* LSP Quantization */ if (st->first) { for (i=0;iold_lsp[i] = lsp[i]; } /*Quantize LSPs*/ #if 1 /*0 for unquantized*/ SUBMODE(lsp_quant)(lsp, qlsp, NB_ORDER, bits); #else for (i=0;i15) quant=15; if (quant<0) quant=0; speex_bits_pack(bits, quant, 4); ol_pitch_coef=MULT16_16_P15(QCONST16(0.066667,15),SHL16(quant,GAIN_SHIFT)); } /*Quantize and transmit open-loop excitation gain*/ #ifdef FIXED_POINT { int qe = scal_quant32(ol_gain, ol_gain_table, 32); /*ol_gain = exp(qe/3.5)*SIG_SCALING;*/ ol_gain = MULT16_32_Q15(28406,ol_gain_table[qe]); speex_bits_pack(bits, qe, 5); } #else { int qe = (int)(floor(.5+3.5*log(ol_gain*1.0/SIG_SCALING))); if (qe<0) qe=0; if (qe>31) qe=31; ol_gain = exp(qe/3.5)*SIG_SCALING; speex_bits_pack(bits, qe, 5); } #endif /* Special case for first frame */ if (st->first) { for (i=0;iold_qlsp[i] = qlsp[i]; } /* Target signal */ ALLOC(target, NB_SUBFRAME_SIZE, spx_word16_t); ALLOC(innov, NB_SUBFRAME_SIZE, spx_sig_t); ALLOC(exc32, NB_SUBFRAME_SIZE, spx_word32_t); ALLOC(syn_resp, NB_SUBFRAME_SIZE, spx_word16_t); ALLOC(mem, NB_ORDER, spx_mem_t); /* Loop on sub-frames */ for (sub=0;subexc+offset; /* Weighted signal */ sw=st->sw+offset; /* LSP interpolation (quantized and unquantized) */ lsp_interpolate(st->old_lsp, lsp, interp_lsp, NB_ORDER, sub, NB_NB_SUBFRAMES, LSP_MARGIN); lsp_interpolate(st->old_qlsp, qlsp, interp_qlsp, NB_ORDER, sub, NB_NB_SUBFRAMES, LSP_MARGIN); /* Compute interpolated LPCs (quantized and unquantized) */ lsp_to_lpc(interp_lsp, interp_lpc, NB_ORDER,stack); lsp_to_lpc(interp_qlsp, interp_qlpc, NB_ORDER, stack); /* Compute analysis filter gain at w=pi (for use in SB-CELP) */ { spx_word32_t pi_g=LPC_SCALING; for (i=0;iinterp_qlpc[i] + st->interp_qlpc[i+1];*/ pi_g = ADD32(pi_g, SUB32(EXTEND32(interp_qlpc[i+1]),EXTEND32(interp_qlpc[i]))); } st->pi_gain[sub] = pi_g; } #ifdef VORBIS_PSYCHO { float curr_curve[128]; float fact = ((float)sub+1.0f)/NB_NB_SUBFRAMES; for (i=0;i<128;i++) curr_curve[i] = (1.0f-fact)*st->old_curve[i] + fact*st->curve[i]; curve_to_lpc(st->psy, curr_curve, bw_lpc1, bw_lpc2, 10); } #else /* Compute bandwidth-expanded (unquantized) LPCs for perceptual weighting */ bw_lpc(st->gamma1, interp_lpc, bw_lpc1, NB_ORDER); bw_lpc(st->gamma2, interp_lpc, bw_lpc2, NB_ORDER); /*print_vec(st->bw_lpc1, 10, "bw_lpc");*/ #endif /*FIXME: This will break if we change the window size */ speex_assert(NB_WINDOW_SIZE-NB_FRAME_SIZE == NB_SUBFRAME_SIZE); if (sub==0) inBuf = st->winBuf; else inBuf = &in[((sub-1)*NB_SUBFRAME_SIZE)]; for (i=0;icomplexity==0) response_bound >>= 1; compute_impulse_response(interp_qlpc, bw_lpc1, bw_lpc2, syn_resp, response_bound, NB_ORDER, stack); for (i=response_bound;imem_sp[i],1); for (i=0;imem_sw[i],1); filter10(exc, st->bw_lpc1, st->bw_lpc2, exc, response_bound, mem, stack); SPEEX_MEMSET(&exc[response_bound], 0, NB_SUBFRAME_SIZE-response_bound); #else iir_mem16(exc, interp_qlpc, exc, NB_SUBFRAME_SIZE, NB_ORDER, mem, stack); for (i=0;imem_sw[i],1); filter10(exc, bw_lpc1, bw_lpc2, exc, NB_SUBFRAME_SIZE, mem, stack); #endif /* Compute weighted signal */ for (i=0;imem_sw[i]; filter10(sw, bw_lpc1, bw_lpc2, sw, NB_SUBFRAME_SIZE, mem, stack); if (st->complexity==0) for (i=0;imem_sw[i]=mem[i]; /* Compute target signal (saturation prevents overflows on clipped input speech) */ for (i=0;imem_exc2, stack); /* If we have a long-term predictor (otherwise, something's wrong) */ speex_assert (SUBMODE(ltp_quant)); { int pit_min, pit_max; /* Long-term prediction */ if (SUBMODE(lbr_pitch) != -1) { /* Low bit-rate pitch handling */ int margin; margin = SUBMODE(lbr_pitch); if (margin) { if (ol_pitch < NB_PITCH_START+margin-1) ol_pitch=NB_PITCH_START+margin-1; if (ol_pitch > NB_PITCH_END-margin) ol_pitch=NB_PITCH_END-margin; pit_min = ol_pitch-margin+1; pit_max = ol_pitch+margin; } else { pit_min=pit_max=ol_pitch; } } else { pit_min = NB_PITCH_START; pit_max = NB_PITCH_END; } /* Force pitch to use only the current frame if needed */ if (st->bounded_pitch && pit_max>offset) pit_max=offset; /* Perform pitch search */ pitch = SUBMODE(ltp_quant)(target, sw, interp_qlpc, bw_lpc1, bw_lpc2, exc32, SUBMODE(ltp_params), pit_min, pit_max, ol_pitch_coef, NB_ORDER, NB_SUBFRAME_SIZE, bits, stack, exc, syn_resp, st->complexity, 0, st->plc_tuning, &st->cumul_gain); st->pitch[sub]=pitch; } /* Quantization of innovation */ SPEEX_MEMSET(innov, 0, NB_SUBFRAME_SIZE); /* FIXME: Make sure this is safe from overflows (so far so good) */ for (i=0;icomplexity, SUBMODE(double_codebook)); /* De-normalize innovation and update excitation */ signal_mul(innov, innov, ener, NB_SUBFRAME_SIZE); /* In some (rare) modes, we do a second search (more bits) to reduce noise even more */ if (SUBMODE(double_codebook)) { char *tmp_stack=stack; VARDECL(spx_sig_t *innov2); ALLOC(innov2, NB_SUBFRAME_SIZE, spx_sig_t); SPEEX_MEMSET(innov2, 0, NB_SUBFRAME_SIZE); for (i=0;icomplexity, 0); signal_mul(innov2, innov2, MULT16_32_Q15(QCONST16(0.454545f,15),ener), NB_SUBFRAME_SIZE); for (i=0;iinnov_rms_save) st->innov_rms_save[sub] = compute_rms(innov, NB_SUBFRAME_SIZE); } /* Final signal synthesis from excitation */ iir_mem16(exc, interp_qlpc, sw, NB_SUBFRAME_SIZE, NB_ORDER, st->mem_sp, stack); /* Compute weighted signal again, from synthesized speech (not sure it's the right thing) */ if (st->complexity!=0) filter10(sw, bw_lpc1, bw_lpc2, sw, NB_SUBFRAME_SIZE, st->mem_sw, stack); } /* Store the LSPs for interpolation in the next frame */ if (st->submodeID>=1) { for (i=0;iold_lsp[i] = lsp[i]; for (i=0;iold_qlsp[i] = qlsp[i]; } #ifdef VORBIS_PSYCHO if (st->submodeID>=1) SPEEX_COPY(st->old_curve, st->curve, 128); #endif if (st->submodeID==1) { #ifndef DISABLE_VBR if (st->dtx_count) speex_bits_pack(bits, 15, 4); else #endif speex_bits_pack(bits, 0, 4); } /* The next frame will not be the first (Duh!) */ st->first = 0; SPEEX_COPY(st->winBuf, in+2*NB_FRAME_SIZE-NB_WINDOW_SIZE, NB_WINDOW_SIZE-NB_FRAME_SIZE); if (SUBMODE(innovation_quant) == noise_codebook_quant || st->submodeID==0) st->bounded_pitch = 1; else st->bounded_pitch = 0; return 1; } #endif /* DISABLE_ENCODER */ #ifndef DISABLE_DECODER void *nb_decoder_init(const SpeexMode *m) { DecState *st; const SpeexNBMode *mode; int i; mode=(const SpeexNBMode*)m->mode; st = (DecState *)speex_alloc(sizeof(DecState)); if (!st) return NULL; #if defined(VAR_ARRAYS) || defined (USE_ALLOCA) st->stack = NULL; #else st->stack = (char*)speex_alloc_scratch(NB_DEC_STACK); #endif st->mode=m; st->encode_submode = 1; st->first=1; /* Codec parameters, should eventually have several "modes"*/ st->submodes=mode->submodes; st->submodeID=mode->defaultSubmode; st->lpc_enh_enabled=1; SPEEX_MEMSET(st->excBuf, 0, NB_FRAME_SIZE + NB_PITCH_END); st->last_pitch = 40; st->count_lost=0; st->pitch_gain_buf[0] = st->pitch_gain_buf[1] = st->pitch_gain_buf[2] = 0; st->pitch_gain_buf_idx = 0; st->seed = 1000; st->sampling_rate=8000; st->last_ol_gain = 0; st->user_callback.func = &speex_default_user_handler; st->user_callback.data = NULL; for (i=0;i<16;i++) st->speex_callbacks[i].func = NULL; st->voc_m1=st->voc_m2=st->voc_mean=0; st->voc_offset=0; st->dtx_enabled=0; st->isWideband = 0; st->highpass_enabled = 1; #ifdef ENABLE_VALGRIND VALGRIND_MAKE_READABLE(st, NB_DEC_STACK); #endif return st; } void nb_decoder_destroy(void *state) { DecState *st; st=(DecState*)state; #if !(defined(VAR_ARRAYS) || defined (USE_ALLOCA)) speex_free_scratch(st->stack); #endif speex_free(state); } int nb_decoder_ctl(void *state, int request, void *ptr) { DecState *st; st=(DecState*)state; switch(request) { case SPEEX_SET_LOW_MODE: case SPEEX_SET_MODE: st->submodeID = (*(spx_int32_t*)ptr); break; case SPEEX_GET_LOW_MODE: case SPEEX_GET_MODE: (*(spx_int32_t*)ptr) = st->submodeID; break; case SPEEX_SET_ENH: st->lpc_enh_enabled = *((spx_int32_t*)ptr); break; case SPEEX_GET_ENH: *((spx_int32_t*)ptr) = st->lpc_enh_enabled; break; case SPEEX_GET_FRAME_SIZE: (*(spx_int32_t*)ptr) = NB_FRAME_SIZE; break; case SPEEX_GET_BITRATE: if (st->submodes[st->submodeID]) (*(spx_int32_t*)ptr) = st->sampling_rate*SUBMODE(bits_per_frame)/NB_FRAME_SIZE; else (*(spx_int32_t*)ptr) = st->sampling_rate*(NB_SUBMODE_BITS+1)/NB_FRAME_SIZE; break; case SPEEX_SET_SAMPLING_RATE: st->sampling_rate = (*(spx_int32_t*)ptr); break; case SPEEX_GET_SAMPLING_RATE: (*(spx_int32_t*)ptr)=st->sampling_rate; break; case SPEEX_SET_HANDLER: { SpeexCallback *c = (SpeexCallback*)ptr; st->speex_callbacks[c->callback_id].func=c->func; st->speex_callbacks[c->callback_id].data=c->data; st->speex_callbacks[c->callback_id].callback_id=c->callback_id; } break; case SPEEX_SET_USER_HANDLER: { SpeexCallback *c = (SpeexCallback*)ptr; st->user_callback.func=c->func; st->user_callback.data=c->data; st->user_callback.callback_id=c->callback_id; } break; case SPEEX_RESET_STATE: { int i; for (i=0;imem_sp[i]=0; for (i=0;iexcBuf[i]=0; } break; case SPEEX_SET_SUBMODE_ENCODING: st->encode_submode = (*(spx_int32_t*)ptr); break; case SPEEX_GET_SUBMODE_ENCODING: (*(spx_int32_t*)ptr) = st->encode_submode; break; case SPEEX_GET_LOOKAHEAD: (*(spx_int32_t*)ptr)=NB_SUBFRAME_SIZE; break; case SPEEX_SET_HIGHPASS: st->highpass_enabled = (*(spx_int32_t*)ptr); break; case SPEEX_GET_HIGHPASS: (*(spx_int32_t*)ptr) = st->highpass_enabled; break; /* FIXME: Convert to fixed-point and re-enable even when float API is disabled */ #ifndef DISABLE_FLOAT_API case SPEEX_GET_ACTIVITY: { float ret; ret = log(st->level/st->min_level)/log(st->max_level/st->min_level); if (ret>1) ret = 1; /* Done in a strange way to catch NaNs as well */ if (!(ret > 0)) ret = 0; /*printf ("%f %f %f %f\n", st->level, st->min_level, st->max_level, ret);*/ (*(spx_int32_t*)ptr) = (int)(100*ret); } break; #endif case SPEEX_GET_PI_GAIN: { int i; spx_word32_t *g = (spx_word32_t*)ptr; for (i=0;ipi_gain[i]; } break; case SPEEX_GET_EXC: { int i; for (i=0;iexc+i*NB_SUBFRAME_SIZE, NB_SUBFRAME_SIZE); } break; case SPEEX_GET_DTX_STATUS: *((spx_int32_t*)ptr) = st->dtx_enabled; break; case SPEEX_SET_INNOVATION_SAVE: st->innov_save = (spx_word16_t*)ptr; break; case SPEEX_SET_WIDEBAND: st->isWideband = *((spx_int32_t*)ptr); break; case SPEEX_GET_STACK: *((char**)ptr) = st->stack; break; default: speex_warning_int("Unknown nb_ctl request: ", request); return -1; } return 0; } #define median3(a, b, c) ((a) < (b) ? ((b) < (c) ? (b) : ((a) < (c) ? (c) : (a))) : ((c) < (b) ? (b) : ((c) < (a) ? (c) : (a)))) #ifdef FIXED_POINT const spx_word16_t attenuation[10] = {32767, 31483, 27923, 22861, 17278, 12055, 7764, 4616, 2533, 1283}; #else const spx_word16_t attenuation[10] = {1., 0.961, 0.852, 0.698, 0.527, 0.368, 0.237, 0.141, 0.077, 0.039}; #endif static void nb_decode_lost(DecState *st, spx_word16_t *out, char *stack) { int i; int pitch_val; spx_word16_t pitch_gain; spx_word16_t fact; spx_word16_t gain_med; spx_word16_t innov_gain; spx_word16_t noise_gain; st->exc = st->excBuf + 2*NB_PITCH_END + NB_SUBFRAME_SIZE + 6; if (st->count_lost<10) fact = attenuation[st->count_lost]; else fact = 0; gain_med = median3(st->pitch_gain_buf[0], st->pitch_gain_buf[1], st->pitch_gain_buf[2]); if (gain_med < st->last_pitch_gain) st->last_pitch_gain = gain_med; #ifdef FIXED_POINT pitch_gain = st->last_pitch_gain; if (pitch_gain>54) pitch_gain = 54; pitch_gain = SHL16(pitch_gain, 9); #else pitch_gain = GAIN_SCALING_1*st->last_pitch_gain; if (pitch_gain>.85) pitch_gain=.85; #endif pitch_gain = MULT16_16_Q15(fact,pitch_gain) + VERY_SMALL; /* FIXME: This was rms of innovation (not exc) */ innov_gain = compute_rms16(st->exc, NB_FRAME_SIZE); noise_gain = MULT16_16_Q15(innov_gain, MULT16_16_Q15(fact, SUB16(Q15ONE,MULT16_16_Q15(pitch_gain,pitch_gain)))); /* Shift all buffers by one frame */ SPEEX_MOVE(st->excBuf, st->excBuf+NB_FRAME_SIZE, 2*NB_PITCH_END + NB_SUBFRAME_SIZE + 12); pitch_val = st->last_pitch + SHR32((spx_int32_t)speex_rand(1+st->count_lost, &st->seed),SIG_SHIFT); if (pitch_val > NB_PITCH_END) pitch_val = NB_PITCH_END; if (pitch_val < NB_PITCH_START) pitch_val = NB_PITCH_START; for (i=0;iexc[i]= MULT16_16_Q15(pitch_gain, (st->exc[i-pitch_val]+VERY_SMALL)) + speex_rand(noise_gain, &st->seed); } bw_lpc(QCONST16(.98,15), st->interp_qlpc, st->interp_qlpc, NB_ORDER); iir_mem16(&st->exc[-NB_SUBFRAME_SIZE], st->interp_qlpc, out, NB_FRAME_SIZE, NB_ORDER, st->mem_sp, stack); highpass(out, out, NB_FRAME_SIZE, HIGHPASS_NARROWBAND|HIGHPASS_OUTPUT, st->mem_hp); st->first = 0; st->count_lost++; st->pitch_gain_buf[st->pitch_gain_buf_idx++] = PSHR16(pitch_gain,9); if (st->pitch_gain_buf_idx > 2) /* rollover */ st->pitch_gain_buf_idx = 0; } /* Just so we don't need to carry the complete wideband mode information */ static const int wb_skip_table[8] = {0, 36, 112, 192, 352, 0, 0, 0}; int nb_decode(void *state, SpeexBits *bits, void *vout) { DecState *st; int i, sub; int pitch; spx_word16_t pitch_gain[3]; spx_word32_t ol_gain=0; int ol_pitch=0; spx_word16_t ol_pitch_coef=0; int best_pitch=40; spx_word16_t best_pitch_gain=0; int wideband; int m; char *stack; VARDECL(spx_sig_t *innov); VARDECL(spx_word32_t *exc32); VARDECL(spx_coef_t *ak); VARDECL(spx_lsp_t *qlsp); spx_word16_t pitch_average=0; spx_word16_t *out = (spx_word16_t*)vout; VARDECL(spx_lsp_t *interp_qlsp); st=(DecState*)state; stack=st->stack; st->exc = st->excBuf + 2*NB_PITCH_END + NB_SUBFRAME_SIZE + 6; /* Check if we're in DTX mode*/ if (!bits && st->dtx_enabled) { st->submodeID=0; } else { /* If bits is NULL, consider the packet to be lost (what could we do anyway) */ if (!bits) { nb_decode_lost(st, out, stack); return 0; } if (st->encode_submode) { /* Search for next narrowband block (handle requests, skip wideband blocks) */ do { if (speex_bits_remaining(bits)<5) return -1; wideband = speex_bits_unpack_unsigned(bits, 1); if (wideband) /* Skip wideband block (for compatibility) */ { int submode; int advance; advance = submode = speex_bits_unpack_unsigned(bits, SB_SUBMODE_BITS); /*speex_mode_query(&speex_wb_mode, SPEEX_SUBMODE_BITS_PER_FRAME, &advance);*/ advance = wb_skip_table[submode]; if (advance < 0) { speex_notify("Invalid mode encountered. The stream is corrupted."); return -2; } advance -= (SB_SUBMODE_BITS+1); speex_bits_advance(bits, advance); if (speex_bits_remaining(bits)<5) return -1; wideband = speex_bits_unpack_unsigned(bits, 1); if (wideband) { advance = submode = speex_bits_unpack_unsigned(bits, SB_SUBMODE_BITS); /*speex_mode_query(&speex_wb_mode, SPEEX_SUBMODE_BITS_PER_FRAME, &advance);*/ advance = wb_skip_table[submode]; if (advance < 0) { speex_notify("Invalid mode encountered. The stream is corrupted."); return -2; } advance -= (SB_SUBMODE_BITS+1); speex_bits_advance(bits, advance); wideband = speex_bits_unpack_unsigned(bits, 1); if (wideband) { speex_notify("More than two wideband layers found. The stream is corrupted."); return -2; } } } if (speex_bits_remaining(bits)<4) return -1; /* FIXME: Check for overflow */ m = speex_bits_unpack_unsigned(bits, 4); if (m==15) /* We found a terminator */ { return -1; } else if (m==14) /* Speex in-band request */ { int ret = speex_inband_handler(bits, st->speex_callbacks, state); if (ret) return ret; } else if (m==13) /* User in-band request */ { int ret = st->user_callback.func(bits, state, st->user_callback.data); if (ret) return ret; } else if (m>8) /* Invalid mode */ { speex_notify("Invalid mode encountered. The stream is corrupted."); return -2; } } while (m>8); /* Get the sub-mode that was used */ st->submodeID = m; } } /* Shift all buffers by one frame */ SPEEX_MOVE(st->excBuf, st->excBuf+NB_FRAME_SIZE, 2*NB_PITCH_END + NB_SUBFRAME_SIZE + 12); /* If null mode (no transmission), just set a couple things to zero*/ if (st->submodes[st->submodeID] == NULL) { VARDECL(spx_coef_t *lpc); ALLOC(lpc, NB_ORDER, spx_coef_t); bw_lpc(QCONST16(0.93f,15), st->interp_qlpc, lpc, NB_ORDER); { spx_word16_t innov_gain=0; /* FIXME: This was innov, not exc */ innov_gain = compute_rms16(st->exc, NB_FRAME_SIZE); for (i=0;iexc[i]=speex_rand(innov_gain, &st->seed); } st->first=1; /* Final signal synthesis from excitation */ iir_mem16(st->exc, lpc, out, NB_FRAME_SIZE, NB_ORDER, st->mem_sp, stack); st->count_lost=0; return 0; } ALLOC(qlsp, NB_ORDER, spx_lsp_t); /* Unquantize LSPs */ SUBMODE(lsp_unquant)(qlsp, NB_ORDER, bits); /*Damp memory if a frame was lost and the LSP changed too much*/ if (st->count_lost) { spx_word16_t fact; spx_word32_t lsp_dist=0; for (i=0;iold_qlsp[i] - qlsp[i]))); #ifdef FIXED_POINT fact = SHR16(19661,SHR32(lsp_dist,LSP_SHIFT+2)); #else fact = .6*exp(-.2*lsp_dist); #endif for (i=0;imem_sp[i] = MULT16_32_Q15(fact,st->mem_sp[i]); } /* Handle first frame and lost-packet case */ if (st->first || st->count_lost) { for (i=0;iold_qlsp[i] = qlsp[i]; } /* Get open-loop pitch estimation for low bit-rate pitch coding */ if (SUBMODE(lbr_pitch)!=-1) { ol_pitch = NB_PITCH_START+speex_bits_unpack_unsigned(bits, 7); } if (SUBMODE(forced_pitch_gain)) { int quant; quant = speex_bits_unpack_unsigned(bits, 4); ol_pitch_coef=MULT16_16_P15(QCONST16(0.066667,15),SHL16(quant,GAIN_SHIFT)); } /* Get global excitation gain */ { int qe; qe = speex_bits_unpack_unsigned(bits, 5); #ifdef FIXED_POINT /* FIXME: Perhaps we could slightly lower the gain here when the output is going to saturate? */ ol_gain = MULT16_32_Q15(28406,ol_gain_table[qe]); #else ol_gain = SIG_SCALING*exp(qe/3.5); #endif } ALLOC(ak, NB_ORDER, spx_coef_t); ALLOC(innov, NB_SUBFRAME_SIZE, spx_sig_t); ALLOC(exc32, NB_SUBFRAME_SIZE, spx_word32_t); if (st->submodeID==1) { int extra; extra = speex_bits_unpack_unsigned(bits, 4); if (extra==15) st->dtx_enabled=1; else st->dtx_enabled=0; } if (st->submodeID>1) st->dtx_enabled=0; /*Loop on subframes */ for (sub=0;subexc+offset; /* Original signal */ sp=out+offset; if (st->innov_save) innov_save = st->innov_save+offset; /* Reset excitation */ SPEEX_MEMSET(exc, 0, NB_SUBFRAME_SIZE); /*Adaptive codebook contribution*/ speex_assert (SUBMODE(ltp_unquant)); { int pit_min, pit_max; /* Handle pitch constraints if any */ if (SUBMODE(lbr_pitch) != -1) { int margin; margin = SUBMODE(lbr_pitch); if (margin) { /* GT - need optimization? if (ol_pitch < NB_PITCH_START+margin-1) ol_pitch=NB_PITCH_START+margin-1; if (ol_pitch > NB_PITCH_END-margin) ol_pitch=NB_PITCH_END-margin; pit_min = ol_pitch-margin+1; pit_max = ol_pitch+margin; */ pit_min = ol_pitch-margin+1; if (pit_min < NB_PITCH_START) pit_min = NB_PITCH_START; pit_max = ol_pitch+margin; if (pit_max > NB_PITCH_END) pit_max = NB_PITCH_END; } else { pit_min = pit_max = ol_pitch; } } else { pit_min = NB_PITCH_START; pit_max = NB_PITCH_END; } SUBMODE(ltp_unquant)(exc, exc32, pit_min, pit_max, ol_pitch_coef, SUBMODE(ltp_params), NB_SUBFRAME_SIZE, &pitch, &pitch_gain[0], bits, stack, st->count_lost, offset, st->last_pitch_gain, 0); /* Ensuring that things aren't blowing up as would happen if e.g. an encoder is crafting packets to make us produce NaNs and slow down the decoder (vague DoS threat). We can probably be even more aggressive and limit to 15000 or so. */ sanitize_values32(exc32, NEG32(QCONST32(32000,SIG_SHIFT-1)), QCONST32(32000,SIG_SHIFT-1), NB_SUBFRAME_SIZE); tmp = gain_3tap_to_1tap(pitch_gain); pitch_average += tmp; if ((tmp>best_pitch_gain&&ABS(2*best_pitch-pitch)>=3&&ABS(3*best_pitch-pitch)>=4&&ABS(4*best_pitch-pitch)>=5) || (tmp>MULT16_16_Q15(QCONST16(.6,15),best_pitch_gain)&&(ABS(best_pitch-2*pitch)<3||ABS(best_pitch-3*pitch)<4||ABS(best_pitch-4*pitch)<5)) || (MULT16_16_Q15(QCONST16(.67,15),tmp)>best_pitch_gain&&(ABS(2*best_pitch-pitch)<3||ABS(3*best_pitch-pitch)<4||ABS(4*best_pitch-pitch)<5)) ) { best_pitch = pitch; if (tmp > best_pitch_gain) best_pitch_gain = tmp; } } /* Unquantize the innovation */ { int q_energy; spx_word32_t ener; SPEEX_MEMSET(innov, 0, NB_SUBFRAME_SIZE); /* Decode sub-frame gain correction */ if (SUBMODE(have_subframe_gain)==3) { q_energy = speex_bits_unpack_unsigned(bits, 3); ener = MULT16_32_Q14(exc_gain_quant_scal3[q_energy],ol_gain); } else if (SUBMODE(have_subframe_gain)==1) { q_energy = speex_bits_unpack_unsigned(bits, 1); ener = MULT16_32_Q14(exc_gain_quant_scal1[q_energy],ol_gain); } else { ener = ol_gain; } speex_assert (SUBMODE(innovation_unquant)); { /*Fixed codebook contribution*/ SUBMODE(innovation_unquant)(innov, SUBMODE(innovation_params), NB_SUBFRAME_SIZE, bits, stack, &st->seed); /* De-normalize innovation and update excitation */ signal_mul(innov, innov, ener, NB_SUBFRAME_SIZE); /* Decode second codebook (only for some modes) */ if (SUBMODE(double_codebook)) { char *tmp_stack=stack; VARDECL(spx_sig_t *innov2); ALLOC(innov2, NB_SUBFRAME_SIZE, spx_sig_t); SPEEX_MEMSET(innov2, 0, NB_SUBFRAME_SIZE); SUBMODE(innovation_unquant)(innov2, SUBMODE(innovation_params), NB_SUBFRAME_SIZE, bits, stack, &st->seed); signal_mul(innov2, innov2, MULT16_32_Q15(QCONST16(0.454545f,15),ener), NB_SUBFRAME_SIZE); for (i=0;isubmodeID==1) { spx_word16_t g=ol_pitch_coef; g=MULT16_16_P14(QCONST16(1.5f,14),(g-QCONST16(.2f,6))); if (g<0) g=0; if (g>GAIN_SCALING) g=GAIN_SCALING; SPEEX_MEMSET(exc, 0, NB_SUBFRAME_SIZE); while (st->voc_offsetvoc_offset]= g*sqrt(2*ol_pitch)*ol_gain; Not quite sure why we need the factor of two in the sqrt */ if (st->voc_offset>=0) exc[st->voc_offset]=MULT16_16(spx_sqrt(MULT16_16_16(2,ol_pitch)),EXTRACT16(PSHR32(MULT16_16(g,PSHR32(ol_gain,SIG_SHIFT)),6))); st->voc_offset+=ol_pitch; } st->voc_offset -= NB_SUBFRAME_SIZE; for (i=0;ivoc_m1)), SUB16(MULT16_16_Q15(Q15_ONE-MULT16_16_16(QCONST16(.85f,9),g),EXTRACT16(PSHR32(innov[i],SIG_SHIFT))), MULT16_16_Q15(MULT16_16_16(QCONST16(.15f,9),g),EXTRACT16(PSHR32(st->voc_m2,SIG_SHIFT))) )); st->voc_m1 = exci; st->voc_m2=innov[i]; st->voc_mean = EXTRACT16(PSHR32(ADD32(MULT16_16(QCONST16(.8f,15),st->voc_mean), MULT16_16(QCONST16(.2f,15),exc[i])), 15)); exc[i]-=st->voc_mean; } } } } ALLOC(interp_qlsp, NB_ORDER, spx_lsp_t); if (st->lpc_enh_enabled && SUBMODE(comb_gain)>0 && !st->count_lost) { multicomb(st->exc-NB_SUBFRAME_SIZE, out, st->interp_qlpc, NB_ORDER, 2*NB_SUBFRAME_SIZE, best_pitch, 40, SUBMODE(comb_gain), stack); multicomb(st->exc+NB_SUBFRAME_SIZE, out+2*NB_SUBFRAME_SIZE, st->interp_qlpc, NB_ORDER, 2*NB_SUBFRAME_SIZE, best_pitch, 40, SUBMODE(comb_gain), stack); } else { SPEEX_COPY(out, &st->exc[-NB_SUBFRAME_SIZE], NB_FRAME_SIZE); } /* If the last packet was lost, re-scale the excitation to obtain the same energy as encoded in ol_gain */ if (st->count_lost) { spx_word16_t exc_ener; spx_word32_t gain32; spx_word16_t gain; exc_ener = compute_rms16 (st->exc, NB_FRAME_SIZE); gain32 = PDIV32(ol_gain, ADD16(exc_ener,1)); #ifdef FIXED_POINT if (gain32 > 32767) gain32 = 32767; gain = EXTRACT16(gain32); #else if (gain32 > 2) gain32=2; gain = gain32; #endif for (i=0;iexc[i] = MULT16_16_Q14(gain, st->exc[i]); out[i]=st->exc[i-NB_SUBFRAME_SIZE]; } } /*Loop on subframes */ for (sub=0;subexc+offset; /* LSP interpolation (quantized and unquantized) */ lsp_interpolate(st->old_qlsp, qlsp, interp_qlsp, NB_ORDER, sub, NB_NB_SUBFRAMES, LSP_MARGIN); /* Compute interpolated LPCs (unquantized) */ lsp_to_lpc(interp_qlsp, ak, NB_ORDER, stack); /* Compute analysis filter at w=pi */ { spx_word32_t pi_g=LPC_SCALING; for (i=0;iinterp_qlpc[i] + st->interp_qlpc[i+1];*/ pi_g = ADD32(pi_g, SUB32(EXTEND32(ak[i+1]),EXTEND32(ak[i]))); } st->pi_gain[sub] = pi_g; } iir_mem16(sp, st->interp_qlpc, sp, NB_SUBFRAME_SIZE, NB_ORDER, st->mem_sp, stack); for (i=0;iinterp_qlpc[i] = ak[i]; } if (st->highpass_enabled) highpass(out, out, NB_FRAME_SIZE, (st->isWideband?HIGHPASS_WIDEBAND:HIGHPASS_NARROWBAND)|HIGHPASS_OUTPUT, st->mem_hp); /*for (i=0;iframe[i]);*/ /* Tracking output level */ st->level = 1+PSHR32(ol_gain,SIG_SHIFT); st->max_level = MAX16(MULT16_16_Q15(QCONST16(.99f,15), st->max_level), st->level); st->min_level = MIN16(ADD16(1,MULT16_16_Q14(QCONST16(1.01f,14), st->min_level)), st->level); if (st->max_level < st->min_level+1) st->max_level = st->min_level+1; /*printf ("%f %f %f %d\n", og, st->min_level, st->max_level, update);*/ /* Store the LSPs for interpolation in the next frame */ for (i=0;iold_qlsp[i] = qlsp[i]; /* The next frame will not be the first (Duh!) */ st->first = 0; st->count_lost=0; st->last_pitch = best_pitch; #ifdef FIXED_POINT st->last_pitch_gain = PSHR16(pitch_average,2); #else st->last_pitch_gain = .25*pitch_average; #endif st->pitch_gain_buf[st->pitch_gain_buf_idx++] = st->last_pitch_gain; if (st->pitch_gain_buf_idx > 2) /* rollover */ st->pitch_gain_buf_idx = 0; st->last_ol_gain = ol_gain; return 0; } #endif /* DISABLE_DECODER */ mumble-1.3.4/3rdparty/speex-src/libspeex/vq_bfin.h0000664000175000017500000001021614010707304021725 0ustar builderbuilder/* Copyright (C) 2005 Analog Devices */ /** @file vq_bfin.h @author Jean-Marc Valin @brief Blackfin-optimized vq routine */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "bfin.h" #define OVERRIDE_VQ_NBEST void vq_nbest(spx_word16_t *in, const spx_word16_t *codebook, int len, int entries, spx_word32_t *E, int N, int *nbest, spx_word32_t *best_dist, char *stack) { if (N==1) { best_dist[0] = 2147483647; { spx_word32_t dist; __asm__ __volatile__ ( "LC0 = %8;\n\t" "R2 = 0;\n\t" "I0 = %6;\n\t" "B0 = %6;\n\t" "L0 = %9;\n\t" "LOOP entries_loop%= LC0;\n\t" "LOOP_BEGIN entries_loop%=;\n\t" "%0 = [%4++];\n\t" "%0 >>= 1;\n\t" "A0 = %0;\n\t" "R0.L = W[%1++%7] || R1.L = W[I0++];\n\t" "LOOP vq_loop%= LC1 = %5;\n\t" "LOOP_BEGIN vq_loop%=;\n\t" "%0 = (A0 -= R0.L*R1.L) (IS) || R0.L = W[%1++%7] || R1.L = W[I0++];\n\t" "LOOP_END vq_loop%=;\n\t" "%0 = (A0 -= R0.L*R1.L) (IS);\n\t" "cc = %0 < %2;\n\t" "if cc %2 = %0;\n\t" "if cc %3 = R2;\n\t" "R2 += 1;\n\t" "LOOP_END entries_loop%=;\n\t" : "=&D" (dist), "=&a" (codebook), "=&d" (best_dist[0]), "=&d" (nbest[0]), "=&a" (E) : "a" (len-1), "a" (in), "a" (2), "d" (entries), "d" (len<<1), "1" (codebook), "4" (E), "2" (best_dist[0]), "3" (nbest[0]) : "R0", "R1", "R2", "I0", "L0", "B0", "A0", "cc", "memory", "ASTAT" BFIN_HWLOOP0_REGS BFIN_HWLOOP1_REGS ); } } else { int i,k,used; used = 0; for (i=0;i>= 1;\n\t" "A0 = %0;\n\t" "I0 = %3;\n\t" "L0 = 0;\n\t" "R0.L = W[%1++%4] || R1.L = W[I0++];\n\t" "LOOP vq_loop%= LC0 = %2;\n\t" "LOOP_BEGIN vq_loop%=;\n\t" "%0 = (A0 -= R0.L*R1.L) (IS) || R0.L = W[%1++%4] || R1.L = W[I0++];\n\t" "LOOP_END vq_loop%=;\n\t" "%0 = (A0 -= R0.L*R1.L) (IS);\n\t" : "=D" (dist), "=a" (codebook) : "a" (len-1), "a" (in), "a" (2), "1" (codebook), "0" (E[i]) : "R0", "R1", "I0", "L0", "A0", "ASTAT" BFIN_HWLOOP0_REGS ); if (i= 1) && (k > used || dist < best_dist[k-1]); k--) { best_dist[k]=best_dist[k-1]; nbest[k] = nbest[k-1]; } best_dist[k]=dist; nbest[k]=i; used++; } } } } mumble-1.3.4/3rdparty/speex-src/libspeex/quant_lsp.h0000664000175000017500000000540614010707304022314 0ustar builderbuilder/* Copyright (C) 2002 Jean-Marc Valin */ /** @file quant_lsp.h @brief LSP vector quantization */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef QUANT_LSP_H #define QUANT_LSP_H #include "speex/speex_bits.h" #include "arch.h" #define MAX_LSP_SIZE 20 #define NB_CDBK_SIZE 64 #define NB_CDBK_SIZE_LOW1 64 #define NB_CDBK_SIZE_LOW2 64 #define NB_CDBK_SIZE_HIGH1 64 #define NB_CDBK_SIZE_HIGH2 64 /*Narrowband codebooks*/ extern const signed char cdbk_nb[]; extern const signed char cdbk_nb_low1[]; extern const signed char cdbk_nb_low2[]; extern const signed char cdbk_nb_high1[]; extern const signed char cdbk_nb_high2[]; /* Quantizes narrowband LSPs with 30 bits */ void lsp_quant_nb(spx_lsp_t *lsp, spx_lsp_t *qlsp, int order, SpeexBits *bits); /* Decodes quantized narrowband LSPs */ void lsp_unquant_nb(spx_lsp_t *lsp, int order, SpeexBits *bits); /* Quantizes low bit-rate narrowband LSPs with 18 bits */ void lsp_quant_lbr(spx_lsp_t *lsp, spx_lsp_t *qlsp, int order, SpeexBits *bits); /* Decodes quantized low bit-rate narrowband LSPs */ void lsp_unquant_lbr(spx_lsp_t *lsp, int order, SpeexBits *bits); /* Quantizes high-band LSPs with 12 bits */ void lsp_quant_high(spx_lsp_t *lsp, spx_lsp_t *qlsp, int order, SpeexBits *bits); /* Decodes high-band LSPs */ void lsp_unquant_high(spx_lsp_t *lsp, int order, SpeexBits *bits); #endif mumble-1.3.4/3rdparty/speex-src/libspeex/filters.h0000664000175000017500000001075414010707304021760 0ustar builderbuilder/* Copyright (C) 2002 Jean-Marc Valin */ /** @file filters.h @brief Various analysis/synthesis filters */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef FILTERS_H #define FILTERS_H #include "arch.h" spx_word16_t compute_rms(const spx_sig_t *x, int len); spx_word16_t compute_rms16(const spx_word16_t *x, int len); void signal_mul(const spx_sig_t *x, spx_sig_t *y, spx_word32_t scale, int len); void signal_div(const spx_word16_t *x, spx_word16_t *y, spx_word32_t scale, int len); #ifdef FIXED_POINT int normalize16(const spx_sig_t *x, spx_word16_t *y, spx_sig_t max_scale, int len); #endif #define HIGHPASS_NARROWBAND 0 #define HIGHPASS_WIDEBAND 2 #define HIGHPASS_INPUT 0 #define HIGHPASS_OUTPUT 1 #define HIGHPASS_IRS 4 void highpass(const spx_word16_t *x, spx_word16_t *y, int len, int filtID, spx_mem_t *mem); void qmf_decomp(const spx_word16_t *xx, const spx_word16_t *aa, spx_word16_t *, spx_word16_t *y2, int N, int M, spx_word16_t *mem, char *stack); void qmf_synth(const spx_word16_t *x1, const spx_word16_t *x2, const spx_word16_t *a, spx_word16_t *y, int N, int M, spx_word16_t *mem1, spx_word16_t *mem2, char *stack); void filter_mem16(const spx_word16_t *x, const spx_coef_t *num, const spx_coef_t *den, spx_word16_t *y, int N, int ord, spx_mem_t *mem, char *stack); #ifdef MERGE_FILTERS #define OVERRIDE_IIR_MEM16 #define OVERRIDE_FIR_MEM16 extern const spx_word16_t zeros[]; #define iir_mem16(x, den, y, N, ord, mem, stack) filter_mem16(x, zeros, den, y, N, ord, mem, stack) #define fir_mem16(x, num, y, N, ord, mem, stack) filter_mem16(x, num, zeros, y, N, ord, mem, stack) #else /* MERGE_FILTERS */ void iir_mem16(const spx_word16_t *x, const spx_coef_t *den, spx_word16_t *y, int N, int ord, spx_mem_t *mem, char *stack); void fir_mem16(const spx_word16_t *x, const spx_coef_t *num, spx_word16_t *y, int N, int ord, spx_mem_t *mem, char *stack); #endif /* MERGE_FILTERS */ /* Apply bandwidth expansion on LPC coef */ void bw_lpc(spx_word16_t , const spx_coef_t *lpc_in, spx_coef_t *lpc_out, int order); void sanitize_values32(spx_word32_t *vec, spx_word32_t min_val, spx_word32_t max_val, int len); void syn_percep_zero16(const spx_word16_t *xx, const spx_coef_t *ak, const spx_coef_t *awk1, const spx_coef_t *awk2, spx_word16_t *y, int N, int ord, char *stack); void residue_percep_zero16(const spx_word16_t *xx, const spx_coef_t *ak, const spx_coef_t *awk1, const spx_coef_t *awk2, spx_word16_t *y, int N, int ord, char *stack); void compute_impulse_response(const spx_coef_t *ak, const spx_coef_t *awk1, const spx_coef_t *awk2, spx_word16_t *y, int N, int ord, char *stack); void multicomb( spx_word16_t *exc, /*decoded excitation*/ spx_word16_t *new_exc, /*enhanced excitation*/ spx_coef_t *ak, /*LPC filter coefs*/ int p, /*LPC order*/ int nsf, /*sub-frame size*/ int pitch, /*pitch period*/ int max_pitch, /*pitch gain (3-tap)*/ spx_word16_t comb_gain, /*gain of comb filter*/ char *stack ); #define filter10(x, num, den, y, N, mem, stack) filter_mem16(x, num, den, y, N, 10, mem, stack) #endif mumble-1.3.4/3rdparty/speex-src/libspeex/arch.h0000664000175000017500000001550114010707304021220 0ustar builderbuilder/* Copyright (C) 2003 Jean-Marc Valin */ /** @file arch.h @brief Various architecture definitions Speex */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef ARCH_H #define ARCH_H #ifndef SPEEX_VERSION #define SPEEX_MAJOR_VERSION 1 /**< Major Speex version. */ #define SPEEX_MINOR_VERSION 1 /**< Minor Speex version. */ #define SPEEX_MICRO_VERSION 16 /**< Micro Speex version. */ #define SPEEX_EXTRA_VERSION "" /**< Extra Speex version. */ #define SPEEX_VERSION "speex-1.2rc2" /**< Speex version string. */ #endif /* A couple test to catch stupid option combinations */ #ifdef FIXED_POINT #ifdef FLOATING_POINT #error You cannot compile as floating point and fixed point at the same time #endif #ifdef _USE_SSE #error SSE is only for floating-point #endif #if ((defined (ARM4_ASM)||defined (ARM4_ASM)) && defined(BFIN_ASM)) || (defined (ARM4_ASM)&&defined(ARM5E_ASM)) #error Make up your mind. What CPU do you have? #endif #ifdef VORBIS_PSYCHO #error Vorbis-psy model currently not implemented in fixed-point #endif #else #ifndef FLOATING_POINT #error You now need to define either FIXED_POINT or FLOATING_POINT #endif #if defined (ARM4_ASM) || defined(ARM5E_ASM) || defined(BFIN_ASM) #error I suppose you can have a [ARM4/ARM5E/Blackfin] that has float instructions? #endif #ifdef FIXED_POINT_DEBUG #error "Don't you think enabling fixed-point is a good thing to do if you want to debug that?" #endif #endif #include "speex/speex_types.h" #define ABS(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute integer value. */ #define ABS16(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute 16-bit value. */ #define MIN16(a,b) ((a) < (b) ? (a) : (b)) /**< Maximum 16-bit value. */ #define MAX16(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 16-bit value. */ #define ABS32(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute 32-bit value. */ #define MIN32(a,b) ((a) < (b) ? (a) : (b)) /**< Maximum 32-bit value. */ #define MAX32(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 32-bit value. */ #ifdef FIXED_POINT typedef spx_int16_t spx_word16_t; typedef spx_int32_t spx_word32_t; typedef spx_word32_t spx_mem_t; typedef spx_word16_t spx_coef_t; typedef spx_word16_t spx_lsp_t; typedef spx_word32_t spx_sig_t; #define Q15ONE 32767 #define LPC_SCALING 8192 #define SIG_SCALING 16384 #define LSP_SCALING 8192. #define GAMMA_SCALING 32768. #define GAIN_SCALING 64 #define GAIN_SCALING_1 0.015625 #define LPC_SHIFT 13 #define LSP_SHIFT 13 #define SIG_SHIFT 14 #define GAIN_SHIFT 6 #define VERY_SMALL 0 #define VERY_LARGE32 ((spx_word32_t)2147483647) #define VERY_LARGE16 ((spx_word16_t)32767) #define Q15_ONE ((spx_word16_t)32767) #ifdef FIXED_DEBUG #include "fixed_debug.h" #else #include "fixed_generic.h" #ifdef ARM5E_ASM #include "fixed_arm5e.h" #elif defined (ARM4_ASM) #include "fixed_arm4.h" #elif defined (BFIN_ASM) #include "fixed_bfin.h" #endif #endif #else typedef float spx_mem_t; typedef float spx_coef_t; typedef float spx_lsp_t; typedef float spx_sig_t; typedef float spx_word16_t; typedef float spx_word32_t; #define Q15ONE 1.0f #define LPC_SCALING 1.f #define SIG_SCALING 1.f #define LSP_SCALING 1.f #define GAMMA_SCALING 1.f #define GAIN_SCALING 1.f #define GAIN_SCALING_1 1.f #define VERY_SMALL 1e-15f #define VERY_LARGE32 1e15f #define VERY_LARGE16 1e15f #define Q15_ONE ((spx_word16_t)1.f) #define QCONST16(x,bits) (x) #define QCONST32(x,bits) (x) #define NEG16(x) (-(x)) #define NEG32(x) (-(x)) #define EXTRACT16(x) (x) #define EXTEND32(x) (x) #define SHR16(a,shift) (a) #define SHL16(a,shift) (a) #define SHR32(a,shift) (a) #define SHL32(a,shift) (a) #define PSHR16(a,shift) (a) #define PSHR32(a,shift) (a) #define VSHR32(a,shift) (a) #define SATURATE16(x,a) (x) #define SATURATE32(x,a) (x) #define PSHR(a,shift) (a) #define SHR(a,shift) (a) #define SHL(a,shift) (a) #define SATURATE(x,a) (x) #define ADD16(a,b) ((a)+(b)) #define SUB16(a,b) ((a)-(b)) #define ADD32(a,b) ((a)+(b)) #define SUB32(a,b) ((a)-(b)) #define MULT16_16_16(a,b) ((a)*(b)) #define MULT16_16(a,b) ((spx_word32_t)(a)*(spx_word32_t)(b)) #define MAC16_16(c,a,b) ((c)+(spx_word32_t)(a)*(spx_word32_t)(b)) #define MULT16_32_Q11(a,b) ((a)*(b)) #define MULT16_32_Q13(a,b) ((a)*(b)) #define MULT16_32_Q14(a,b) ((a)*(b)) #define MULT16_32_Q15(a,b) ((a)*(b)) #define MULT16_32_P15(a,b) ((a)*(b)) #define MAC16_32_Q11(c,a,b) ((c)+(a)*(b)) #define MAC16_32_Q15(c,a,b) ((c)+(a)*(b)) #define MAC16_16_Q11(c,a,b) ((c)+(a)*(b)) #define MAC16_16_Q13(c,a,b) ((c)+(a)*(b)) #define MAC16_16_P13(c,a,b) ((c)+(a)*(b)) #define MULT16_16_Q11_32(a,b) ((a)*(b)) #define MULT16_16_Q13(a,b) ((a)*(b)) #define MULT16_16_Q14(a,b) ((a)*(b)) #define MULT16_16_Q15(a,b) ((a)*(b)) #define MULT16_16_P15(a,b) ((a)*(b)) #define MULT16_16_P13(a,b) ((a)*(b)) #define MULT16_16_P14(a,b) ((a)*(b)) #define DIV32_16(a,b) (((spx_word32_t)(a))/(spx_word16_t)(b)) #define PDIV32_16(a,b) (((spx_word32_t)(a))/(spx_word16_t)(b)) #define DIV32(a,b) (((spx_word32_t)(a))/(spx_word32_t)(b)) #define PDIV32(a,b) (((spx_word32_t)(a))/(spx_word32_t)(b)) #endif #if defined (CONFIG_TI_C54X) || defined (CONFIG_TI_C55X) /* 2 on TI C5x DSP */ #define BYTES_PER_CHAR 2 #define BITS_PER_CHAR 16 #define LOG2_BITS_PER_CHAR 4 #else #define BYTES_PER_CHAR 1 #define BITS_PER_CHAR 8 #define LOG2_BITS_PER_CHAR 3 #endif #ifdef FIXED_DEBUG extern long long spx_mips; #endif #endif mumble-1.3.4/3rdparty/speex-src/libspeex/gain_table_lbr.c0000664000175000017500000000412214010707304023217 0ustar builderbuilder/* Copyright (C) 2002 Jean-Marc Valin File: gain_table_lbr.c Codebook for 3-tap pitch prediction gain (32 entries) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ const signed char gain_cdbk_lbr[128] = { -32, -32, -32, 0, -31, -58, -16, 22, -41, -24, -43, 14, -56, -22, -55, 29, -13, 33, -41, 47, -4, -39, -9, 29, -41, 15, -12, 38, -8, -15, -12, 31, 1, 2, -44, 40, -22, -66, -42, 27, -38, 28, -23, 38, -21, 14, -37, 31, 0, 21, -50, 52, -53, -71, -27, 33, -37, -1, -19, 25, -19, -5, -28, 22, 6, 65, -44, 74, -33, -48, -33, 9, -40, 57, -14, 58, -17, 4, -45, 32, -31, 38, -33, 36, -23, 28, -40, 39, -43, 29, -12, 46, -34, 13, -23, 28, -16, 15, -27, 34, -14, -82, -15, 43, -31, 25, -32, 29, -21, 5, -5, 38, -47, -63, -51, 33, -46, 12, 3, 47, -28, -17, -29, 11, -10, 14, -40, 38}; mumble-1.3.4/3rdparty/speex-src/libspeex/fixed_arm5e.h0000664000175000017500000001224114010707304022471 0ustar builderbuilder/* Copyright (C) 2003 Jean-Marc Valin */ /** @file fixed_arm5e.h @brief ARM-tuned fixed-point operations */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef FIXED_ARM5E_H #define FIXED_ARM5E_H #undef MULT16_16 static inline spx_word32_t MULT16_16(spx_word16_t x, spx_word16_t y) { int res; asm ("smulbb %0,%1,%2;\n" : "=&r"(res) : "%r"(x),"r"(y)); return(res); } #undef MAC16_16 static inline spx_word32_t MAC16_16(spx_word32_t a, spx_word16_t x, spx_word32_t y) { int res; asm ("smlabb %0,%1,%2,%3;\n" : "=&r"(res) : "%r"(x),"r"(y),"r"(a)); return(res); } #undef MULT16_32_Q15 static inline spx_word32_t MULT16_32_Q15(spx_word16_t x, spx_word32_t y) { int res; asm ("smulwb %0,%1,%2;\n" : "=&r"(res) : "%r"(y<<1),"r"(x)); return(res); } #undef MAC16_32_Q15 static inline spx_word32_t MAC16_32_Q15(spx_word32_t a, spx_word16_t x, spx_word32_t y) { int res; asm ("smlawb %0,%1,%2,%3;\n" : "=&r"(res) : "%r"(y<<1),"r"(x),"r"(a)); return(res); } #undef MULT16_32_Q11 static inline spx_word32_t MULT16_32_Q11(spx_word16_t x, spx_word32_t y) { int res; asm ("smulwb %0,%1,%2;\n" : "=&r"(res) : "%r"(y<<5),"r"(x)); return(res); } #undef MAC16_32_Q11 static inline spx_word32_t MAC16_32_Q11(spx_word32_t a, spx_word16_t x, spx_word32_t y) { int res; asm ("smlawb %0,%1,%2,%3;\n" : "=&r"(res) : "%r"(y<<5),"r"(x),"r"(a)); return(res); } #undef DIV32_16 static inline short DIV32_16(int a, int b) { int res=0; int dead1, dead2, dead3, dead4, dead5; __asm__ __volatile__ ( "\teor %5, %0, %1\n" "\tmovs %4, %0\n" "\trsbmi %0, %0, #0 \n" "\tmovs %4, %1\n" "\trsbmi %1, %1, #0 \n" "\tmov %4, #1\n" "\tsubs %3, %0, %1, asl #14 \n" "\torrpl %2, %2, %4, asl #14 \n" "\tmovpl %0, %3 \n" "\tsubs %3, %0, %1, asl #13 \n" "\torrpl %2, %2, %4, asl #13 \n" "\tmovpl %0, %3 \n" "\tsubs %3, %0, %1, asl #12 \n" "\torrpl %2, %2, %4, asl #12 \n" "\tmovpl %0, %3 \n" "\tsubs %3, %0, %1, asl #11 \n" "\torrpl %2, %2, %4, asl #11 \n" "\tmovpl %0, %3 \n" "\tsubs %3, %0, %1, asl #10 \n" "\torrpl %2, %2, %4, asl #10 \n" "\tmovpl %0, %3 \n" "\tsubs %3, %0, %1, asl #9 \n" "\torrpl %2, %2, %4, asl #9 \n" "\tmovpl %0, %3 \n" "\tsubs %3, %0, %1, asl #8 \n" "\torrpl %2, %2, %4, asl #8 \n" "\tmovpl %0, %3 \n" "\tsubs %3, %0, %1, asl #7 \n" "\torrpl %2, %2, %4, asl #7 \n" "\tmovpl %0, %3 \n" "\tsubs %3, %0, %1, asl #6 \n" "\torrpl %2, %2, %4, asl #6 \n" "\tmovpl %0, %3 \n" "\tsubs %3, %0, %1, asl #5 \n" "\torrpl %2, %2, %4, asl #5 \n" "\tmovpl %0, %3 \n" "\tsubs %3, %0, %1, asl #4 \n" "\torrpl %2, %2, %4, asl #4 \n" "\tmovpl %0, %3 \n" "\tsubs %3, %0, %1, asl #3 \n" "\torrpl %2, %2, %4, asl #3 \n" "\tmovpl %0, %3 \n" "\tsubs %3, %0, %1, asl #2 \n" "\torrpl %2, %2, %4, asl #2 \n" "\tmovpl %0, %3 \n" "\tsubs %3, %0, %1, asl #1 \n" "\torrpl %2, %2, %4, asl #1 \n" "\tmovpl %0, %3 \n" "\tsubs %3, %0, %1 \n" "\torrpl %2, %2, %4 \n" "\tmovpl %0, %3 \n" "\tmovs %5, %5, lsr #31 \n" "\trsbne %2, %2, #0 \n" : "=r" (dead1), "=r" (dead2), "=r" (res), "=r" (dead3), "=r" (dead4), "=r" (dead5) : "0" (a), "1" (b), "2" (res) : "memory", "cc" ); return res; } #endif mumble-1.3.4/3rdparty/speex-src/libspeex/.cvsignore0000664000175000017500000000013214010707304022124 0ustar builderbuilder.deps .libs *.la *.lo *.o Makefile Makefile.in testdenoise testenc testenc_uwb testenc_wb mumble-1.3.4/3rdparty/speex-src/libspeex/modes.c0000664000175000017500000002207414010707304021410 0ustar builderbuilder/* Copyright (C) 2002-2006 Jean-Marc Valin File: modes.c Describes the different modes of the codec Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "modes.h" #include "ltp.h" #include "quant_lsp.h" #include "cb_search.h" #include "sb_celp.h" #include "nb_celp.h" #include "vbr.h" #include "arch.h" #include #ifndef NULL #define NULL 0 #endif #ifdef DISABLE_ENCODER #define nb_encoder_init NULL #define nb_encoder_destroy NULL #define nb_encode NULL #define nb_encoder_ctl NULL #define split_cb_search_shape_sign NULL #define noise_codebook_quant NULL #define pitch_search_3tap NULL #define forced_pitch_quant NULL #define lsp_quant_nb NULL #define lsp_quant_lbr NULL #endif /* DISABLE_ENCODER */ #ifdef DISABLE_DECODER #define nb_decoder_init NULL #define nb_decoder_destroy NULL #define nb_decode NULL #define nb_decoder_ctl NULL #define noise_codebook_unquant NULL #define split_cb_shape_sign_unquant NULL #define lsp_unquant_nb NULL #define lsp_unquant_lbr NULL #define pitch_unquant_3tap NULL #define forced_pitch_unquant NULL #endif /* DISABLE_DECODER */ /* Extern declarations for all codebooks we use here */ extern const signed char gain_cdbk_nb[]; extern const signed char gain_cdbk_lbr[]; extern const signed char exc_5_256_table[]; extern const signed char exc_5_64_table[]; extern const signed char exc_8_128_table[]; extern const signed char exc_10_32_table[]; extern const signed char exc_10_16_table[]; extern const signed char exc_20_32_table[]; /* Parameters for Long-Term Prediction (LTP)*/ static const ltp_params ltp_params_nb = { gain_cdbk_nb, 7, 7 }; /* Parameters for Long-Term Prediction (LTP)*/ static const ltp_params ltp_params_vlbr = { gain_cdbk_lbr, 5, 0 }; /* Parameters for Long-Term Prediction (LTP)*/ static const ltp_params ltp_params_lbr = { gain_cdbk_lbr, 5, 7 }; /* Parameters for Long-Term Prediction (LTP)*/ static const ltp_params ltp_params_med = { gain_cdbk_lbr, 5, 7 }; /* Split-VQ innovation parameters for very low bit-rate narrowband */ static const split_cb_params split_cb_nb_vlbr = { 10, /*subvect_size*/ 4, /*nb_subvect*/ exc_10_16_table, /*shape_cb*/ 4, /*shape_bits*/ 0, }; /* Split-VQ innovation parameters for very low bit-rate narrowband */ static const split_cb_params split_cb_nb_ulbr = { 20, /*subvect_size*/ 2, /*nb_subvect*/ exc_20_32_table, /*shape_cb*/ 5, /*shape_bits*/ 0, }; /* Split-VQ innovation parameters for low bit-rate narrowband */ static const split_cb_params split_cb_nb_lbr = { 10, /*subvect_size*/ 4, /*nb_subvect*/ exc_10_32_table, /*shape_cb*/ 5, /*shape_bits*/ 0, }; /* Split-VQ innovation parameters narrowband */ static const split_cb_params split_cb_nb = { 5, /*subvect_size*/ 8, /*nb_subvect*/ exc_5_64_table, /*shape_cb*/ 6, /*shape_bits*/ 0, }; /* Split-VQ innovation parameters narrowband */ static const split_cb_params split_cb_nb_med = { 8, /*subvect_size*/ 5, /*nb_subvect*/ exc_8_128_table, /*shape_cb*/ 7, /*shape_bits*/ 0, }; /* Split-VQ innovation for low-band wideband */ static const split_cb_params split_cb_sb = { 5, /*subvect_size*/ 8, /*nb_subvect*/ exc_5_256_table, /*shape_cb*/ 8, /*shape_bits*/ 0, }; /* 2150 bps "vocoder-like" mode for comfort noise */ static const SpeexSubmode nb_submode1 = { 0, 1, 0, 0, /* LSP quantization */ lsp_quant_lbr, lsp_unquant_lbr, /* No pitch quantization */ forced_pitch_quant, forced_pitch_unquant, NULL, /* No innovation quantization (noise only) */ noise_codebook_quant, noise_codebook_unquant, NULL, -1, 43 }; /* 3.95 kbps very low bit-rate mode */ static const SpeexSubmode nb_submode8 = { 0, 1, 0, 0, /*LSP quantization*/ lsp_quant_lbr, lsp_unquant_lbr, /*No pitch quantization*/ forced_pitch_quant, forced_pitch_unquant, NULL, /*Innovation quantization*/ split_cb_search_shape_sign, split_cb_shape_sign_unquant, &split_cb_nb_ulbr, QCONST16(.5,15), 79 }; /* 5.95 kbps very low bit-rate mode */ static const SpeexSubmode nb_submode2 = { 0, 0, 0, 0, /*LSP quantization*/ lsp_quant_lbr, lsp_unquant_lbr, /*No pitch quantization*/ pitch_search_3tap, pitch_unquant_3tap, <p_params_vlbr, /*Innovation quantization*/ split_cb_search_shape_sign, split_cb_shape_sign_unquant, &split_cb_nb_vlbr, QCONST16(.6,15), 119 }; /* 8 kbps low bit-rate mode */ static const SpeexSubmode nb_submode3 = { -1, 0, 1, 0, /*LSP quantization*/ lsp_quant_lbr, lsp_unquant_lbr, /*Pitch quantization*/ pitch_search_3tap, pitch_unquant_3tap, <p_params_lbr, /*Innovation quantization*/ split_cb_search_shape_sign, split_cb_shape_sign_unquant, &split_cb_nb_lbr, QCONST16(.55,15), 160 }; /* 11 kbps medium bit-rate mode */ static const SpeexSubmode nb_submode4 = { -1, 0, 1, 0, /*LSP quantization*/ lsp_quant_lbr, lsp_unquant_lbr, /*Pitch quantization*/ pitch_search_3tap, pitch_unquant_3tap, <p_params_med, /*Innovation quantization*/ split_cb_search_shape_sign, split_cb_shape_sign_unquant, &split_cb_nb_med, QCONST16(.45,15), 220 }; /* 15 kbps high bit-rate mode */ static const SpeexSubmode nb_submode5 = { -1, 0, 3, 0, /*LSP quantization*/ lsp_quant_nb, lsp_unquant_nb, /*Pitch quantization*/ pitch_search_3tap, pitch_unquant_3tap, <p_params_nb, /*Innovation quantization*/ split_cb_search_shape_sign, split_cb_shape_sign_unquant, &split_cb_nb, QCONST16(.25,15), 300 }; /* 18.2 high bit-rate mode */ static const SpeexSubmode nb_submode6 = { -1, 0, 3, 0, /*LSP quantization*/ lsp_quant_nb, lsp_unquant_nb, /*Pitch quantization*/ pitch_search_3tap, pitch_unquant_3tap, <p_params_nb, /*Innovation quantization*/ split_cb_search_shape_sign, split_cb_shape_sign_unquant, &split_cb_sb, QCONST16(.15,15), 364 }; /* 24.6 kbps high bit-rate mode */ static const SpeexSubmode nb_submode7 = { -1, 0, 3, 1, /*LSP quantization*/ lsp_quant_nb, lsp_unquant_nb, /*Pitch quantization*/ pitch_search_3tap, pitch_unquant_3tap, <p_params_nb, /*Innovation quantization*/ split_cb_search_shape_sign, split_cb_shape_sign_unquant, &split_cb_nb, QCONST16(.05,15), 492 }; /* Default mode for narrowband */ static const SpeexNBMode nb_mode = { NB_FRAME_SIZE, /*frameSize*/ NB_SUBFRAME_SIZE, /*subframeSize*/ NB_ORDER, /*lpcSize*/ NB_PITCH_START, /*pitchStart*/ NB_PITCH_END, /*pitchEnd*/ QCONST16(0.92,15), /* gamma1 */ QCONST16(0.6,15), /* gamma2 */ QCONST16(.0002,15), /*lpc_floor*/ {NULL, &nb_submode1, &nb_submode2, &nb_submode3, &nb_submode4, &nb_submode5, &nb_submode6, &nb_submode7, &nb_submode8, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, 5, {1, 8, 2, 3, 3, 4, 4, 5, 5, 6, 7} }; /* Default mode for narrowband */ EXPORT const SpeexMode speex_nb_mode = { &nb_mode, nb_mode_query, "narrowband", 0, 4, nb_encoder_init, nb_encoder_destroy, nb_encode, nb_decoder_init, nb_decoder_destroy, nb_decode, nb_encoder_ctl, nb_decoder_ctl, }; EXPORT int speex_mode_query(const SpeexMode *mode, int request, void *ptr) { return mode->query(mode->mode, request, ptr); } #ifdef FIXED_DEBUG long long spx_mips=0; #endif mumble-1.3.4/3rdparty/speex-src/libspeex/modes.h0000664000175000017500000001557314010707304021423 0ustar builderbuilder/* Copyright (C) 2002-2006 Jean-Marc Valin */ /** @file modes.h @brief Describes the different modes of the codec */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef MODES_H #define MODES_H #include "speex/speex.h" #include "arch.h" #define NB_SUBMODES 16 #define NB_SUBMODE_BITS 4 #define SB_SUBMODES 8 #define SB_SUBMODE_BITS 3 /* Used internally, NOT TO BE USED in applications */ /** Used internally*/ #define SPEEX_GET_PI_GAIN 100 /** Used internally*/ #define SPEEX_GET_EXC 101 /** Used internally*/ #define SPEEX_GET_INNOV 102 /** Used internally*/ #define SPEEX_GET_DTX_STATUS 103 /** Used internally*/ #define SPEEX_SET_INNOVATION_SAVE 104 /** Used internally*/ #define SPEEX_SET_WIDEBAND 105 /** Used internally*/ #define SPEEX_GET_STACK 106 /** Quantizes LSPs */ typedef void (*lsp_quant_func)(spx_lsp_t *, spx_lsp_t *, int, SpeexBits *); /** Decodes quantized LSPs */ typedef void (*lsp_unquant_func)(spx_lsp_t *, int, SpeexBits *); /** Long-term predictor quantization */ typedef int (*ltp_quant_func)(spx_word16_t *, spx_word16_t *, spx_coef_t *, spx_coef_t *, spx_coef_t *, spx_sig_t *, const void *, int, int, spx_word16_t, int, int, SpeexBits*, char *, spx_word16_t *, spx_word16_t *, int, int, int, spx_word32_t *); /** Long-term un-quantize */ typedef void (*ltp_unquant_func)(spx_word16_t *, spx_word32_t *, int, int, spx_word16_t, const void *, int, int *, spx_word16_t *, SpeexBits*, char*, int, int, spx_word16_t, int); /** Innovation quantization function */ typedef void (*innovation_quant_func)(spx_word16_t *, spx_coef_t *, spx_coef_t *, spx_coef_t *, const void *, int, int, spx_sig_t *, spx_word16_t *, SpeexBits *, char *, int, int); /** Innovation unquantization function */ typedef void (*innovation_unquant_func)(spx_sig_t *, const void *, int, SpeexBits*, char *, spx_int32_t *); /** Description of a Speex sub-mode (wither narrowband or wideband */ typedef struct SpeexSubmode { int lbr_pitch; /**< Set to -1 for "normal" modes, otherwise encode pitch using a global pitch and allowing a +- lbr_pitch variation (for low not-rates)*/ int forced_pitch_gain; /**< Use the same (forced) pitch gain for all sub-frames */ int have_subframe_gain; /**< Number of bits to use as sub-frame innovation gain */ int double_codebook; /**< Apply innovation quantization twice for higher quality (and higher bit-rate)*/ /*LSP functions*/ lsp_quant_func lsp_quant; /**< LSP quantization function */ lsp_unquant_func lsp_unquant; /**< LSP unquantization function */ /*Long-term predictor functions*/ ltp_quant_func ltp_quant; /**< Long-term predictor (pitch) quantizer */ ltp_unquant_func ltp_unquant; /**< Long-term predictor (pitch) un-quantizer */ const void *ltp_params; /**< Pitch parameters (options) */ /*Quantization of innovation*/ innovation_quant_func innovation_quant; /**< Innovation quantization */ innovation_unquant_func innovation_unquant; /**< Innovation un-quantization */ const void *innovation_params; /**< Innovation quantization parameters*/ spx_word16_t comb_gain; /**< Gain of enhancer comb filter */ int bits_per_frame; /**< Number of bits per frame after encoding*/ } SpeexSubmode; /** Struct defining the encoding/decoding mode*/ typedef struct SpeexNBMode { int frameSize; /**< Size of frames used for encoding */ int subframeSize; /**< Size of sub-frames used for encoding */ int lpcSize; /**< Order of LPC filter */ int pitchStart; /**< Smallest pitch value allowed */ int pitchEnd; /**< Largest pitch value allowed */ spx_word16_t gamma1; /**< Perceptual filter parameter #1 */ spx_word16_t gamma2; /**< Perceptual filter parameter #2 */ spx_word16_t lpc_floor; /**< Noise floor for LPC analysis */ const SpeexSubmode *submodes[NB_SUBMODES]; /**< Sub-mode data for the mode */ int defaultSubmode; /**< Default sub-mode to use when encoding */ int quality_map[11]; /**< Mode corresponding to each quality setting */ } SpeexNBMode; /** Struct defining the encoding/decoding mode for SB-CELP (wideband) */ typedef struct SpeexSBMode { const SpeexMode *nb_mode; /**< Embedded narrowband mode */ int frameSize; /**< Size of frames used for encoding */ int subframeSize; /**< Size of sub-frames used for encoding */ int lpcSize; /**< Order of LPC filter */ spx_word16_t gamma1; /**< Perceptual filter parameter #1 */ spx_word16_t gamma2; /**< Perceptual filter parameter #1 */ spx_word16_t lpc_floor; /**< Noise floor for LPC analysis */ spx_word16_t folding_gain; const SpeexSubmode *submodes[SB_SUBMODES]; /**< Sub-mode data for the mode */ int defaultSubmode; /**< Default sub-mode to use when encoding */ int low_quality_map[11]; /**< Mode corresponding to each quality setting */ int quality_map[11]; /**< Mode corresponding to each quality setting */ #ifndef DISABLE_VBR const float (*vbr_thresh)[11]; #endif int nb_modes; } SpeexSBMode; int speex_encode_native(void *state, spx_word16_t *in, SpeexBits *bits); int speex_decode_native(void *state, SpeexBits *bits, spx_word16_t *out); int nb_mode_query(const void *mode, int request, void *ptr); int wb_mode_query(const void *mode, int request, void *ptr); #endif mumble-1.3.4/3rdparty/speex-src/libspeex/fixed_debug.h0000664000175000017500000003467514010707304022565 0ustar builderbuilder/* Copyright (C) 2003 Jean-Marc Valin */ /** @file fixed_debug.h @brief Fixed-point operations with debugging */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef FIXED_DEBUG_H #define FIXED_DEBUG_H #include extern long long spx_mips; #define MIPS_INC spx_mips++, #define QCONST16(x,bits) ((spx_word16_t)(.5+(x)*(((spx_word32_t)1)<<(bits)))) #define QCONST32(x,bits) ((spx_word32_t)(.5+(x)*(((spx_word32_t)1)<<(bits)))) #define VERIFY_SHORT(x) ((x)<=32767&&(x)>=-32768) #define VERIFY_INT(x) ((x)<=2147483647LL&&(x)>=-2147483648LL) static inline short NEG16(int x) { int res; if (!VERIFY_SHORT(x)) { fprintf (stderr, "NEG16: input is not short: %d\n", (int)x); } res = -x; if (!VERIFY_SHORT(res)) fprintf (stderr, "NEG16: output is not short: %d\n", (int)res); spx_mips++; return res; } static inline int NEG32(long long x) { long long res; if (!VERIFY_INT(x)) { fprintf (stderr, "NEG16: input is not int: %d\n", (int)x); } res = -x; if (!VERIFY_INT(res)) fprintf (stderr, "NEG16: output is not int: %d\n", (int)res); spx_mips++; return res; } #define EXTRACT16(x) _EXTRACT16(x, __FILE__, __LINE__) static inline short _EXTRACT16(int x, char *file, int line) { int res; if (!VERIFY_SHORT(x)) { fprintf (stderr, "EXTRACT16: input is not short: %d in %s: line %d\n", x, file, line); } res = x; spx_mips++; return res; } #define EXTEND32(x) _EXTEND32(x, __FILE__, __LINE__) static inline int _EXTEND32(int x, char *file, int line) { int res; if (!VERIFY_SHORT(x)) { fprintf (stderr, "EXTEND32: input is not short: %d in %s: line %d\n", x, file, line); } res = x; spx_mips++; return res; } #define SHR16(a, shift) _SHR16(a, shift, __FILE__, __LINE__) static inline short _SHR16(int a, int shift, char *file, int line) { int res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(shift)) { fprintf (stderr, "SHR16: inputs are not short: %d >> %d in %s: line %d\n", a, shift, file, line); } res = a>>shift; if (!VERIFY_SHORT(res)) fprintf (stderr, "SHR16: output is not short: %d in %s: line %d\n", res, file, line); spx_mips++; return res; } #define SHL16(a, shift) _SHL16(a, shift, __FILE__, __LINE__) static inline short _SHL16(int a, int shift, char *file, int line) { int res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(shift)) { fprintf (stderr, "SHL16: inputs are not short: %d %d in %s: line %d\n", a, shift, file, line); } res = a<>shift; if (!VERIFY_INT(res)) { fprintf (stderr, "SHR32: output is not int: %d\n", (int)res); } spx_mips++; return res; } static inline int SHL32(long long a, int shift) { long long res; if (!VERIFY_INT(a) || !VERIFY_SHORT(shift)) { fprintf (stderr, "SHL32: inputs are not int: %d %d\n", (int)a, shift); } res = a<>1))),shift)) #define PSHR32(a,shift) (SHR32(ADD32((a),((EXTEND32(1)<<((shift))>>1))),shift)) #define VSHR32(a, shift) (((shift)>0) ? SHR32(a, shift) : SHL32(a, -(shift))) #define SATURATE16(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) #define SATURATE32(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) //#define SHR(a,shift) ((a) >> (shift)) //#define SHL(a,shift) ((a) << (shift)) #define ADD16(a, b) _ADD16(a, b, __FILE__, __LINE__) static inline short _ADD16(int a, int b, char *file, int line) { int res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "ADD16: inputs are not short: %d %d in %s: line %d\n", a, b, file, line); } res = a+b; if (!VERIFY_SHORT(res)) { fprintf (stderr, "ADD16: output is not short: %d+%d=%d in %s: line %d\n", a,b,res, file, line); } spx_mips++; return res; } #define SUB16(a, b) _SUB16(a, b, __FILE__, __LINE__) static inline short _SUB16(int a, int b, char *file, int line) { int res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "SUB16: inputs are not short: %d %d in %s: line %d\n", a, b, file, line); } res = a-b; if (!VERIFY_SHORT(res)) fprintf (stderr, "SUB16: output is not short: %d in %s: line %d\n", res, file, line); spx_mips++; return res; } #define ADD32(a, b) _ADD32(a, b, __FILE__, __LINE__) static inline int _ADD32(long long a, long long b, char *file, int line) { long long res; if (!VERIFY_INT(a) || !VERIFY_INT(b)) { fprintf (stderr, "ADD32: inputs are not int: %d %d in %s: line %d\n", (int)a, (int)b, file, line); } res = a+b; if (!VERIFY_INT(res)) { fprintf (stderr, "ADD32: output is not int: %d in %s: line %d\n", (int)res, file, line); } spx_mips++; return res; } static inline int SUB32(long long a, long long b) { long long res; if (!VERIFY_INT(a) || !VERIFY_INT(b)) { fprintf (stderr, "SUB32: inputs are not int: %d %d\n", (int)a, (int)b); } res = a-b; if (!VERIFY_INT(res)) fprintf (stderr, "SUB32: output is not int: %d\n", (int)res); spx_mips++; return res; } #define ADD64(a,b) (MIPS_INC(a)+(b)) /* result fits in 16 bits */ static inline short MULT16_16_16(int a, int b) { int res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16_16: inputs are not short: %d %d\n", a, b); } res = a*b; if (!VERIFY_SHORT(res)) fprintf (stderr, "MULT16_16_16: output is not short: %d\n", res); spx_mips++; return res; } #define MULT16_16(a, b) _MULT16_16(a, b, __FILE__, __LINE__) static inline int _MULT16_16(int a, int b, char *file, int line) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16: inputs are not short: %d %d in %s: line %d\n", a, b, file, line); } res = ((long long)a)*b; if (!VERIFY_INT(res)) fprintf (stderr, "MULT16_16: output is not int: %d in %s: line %d\n", (int)res, file, line); spx_mips++; return res; } #define MAC16_16(c,a,b) (spx_mips--,ADD32((c),MULT16_16((a),(b)))) #define MAC16_16_Q11(c,a,b) (EXTRACT16(ADD16((c),EXTRACT16(SHR32(MULT16_16((a),(b)),11))))) #define MAC16_16_Q13(c,a,b) (EXTRACT16(ADD16((c),EXTRACT16(SHR32(MULT16_16((a),(b)),13))))) #define MAC16_16_P13(c,a,b) (EXTRACT16(ADD32((c),SHR32(ADD32(4096,MULT16_16((a),(b))),13)))) #define MULT16_32_QX(a, b, Q) _MULT16_32_QX(a, b, Q, __FILE__, __LINE__) static inline int _MULT16_32_QX(int a, long long b, int Q, char *file, int line) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_INT(b)) { fprintf (stderr, "MULT16_32_Q%d: inputs are not short+int: %d %d in %s: line %d\n", Q, (int)a, (int)b, file, line); } if (ABS32(b)>=(EXTEND32(1)<<(15+Q))) fprintf (stderr, "MULT16_32_Q%d: second operand too large: %d %d in %s: line %d\n", Q, (int)a, (int)b, file, line); res = (((long long)a)*(long long)b) >> Q; if (!VERIFY_INT(res)) fprintf (stderr, "MULT16_32_Q%d: output is not int: %d*%d=%d in %s: line %d\n", Q, (int)a, (int)b,(int)res, file, line); spx_mips+=5; return res; } static inline int MULT16_32_PX(int a, long long b, int Q) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_INT(b)) { fprintf (stderr, "MULT16_32_P%d: inputs are not short+int: %d %d\n", Q, (int)a, (int)b); } if (ABS32(b)>=(EXTEND32(1)<<(15+Q))) fprintf (stderr, "MULT16_32_Q%d: second operand too large: %d %d\n", Q, (int)a, (int)b); res = ((((long long)a)*(long long)b) + ((EXTEND32(1)<>1))>> Q; if (!VERIFY_INT(res)) fprintf (stderr, "MULT16_32_P%d: output is not int: %d*%d=%d\n", Q, (int)a, (int)b,(int)res); spx_mips+=5; return res; } #define MULT16_32_Q11(a,b) MULT16_32_QX(a,b,11) #define MAC16_32_Q11(c,a,b) ADD32((c),MULT16_32_Q11((a),(b))) #define MULT16_32_Q12(a,b) MULT16_32_QX(a,b,12) #define MULT16_32_Q13(a,b) MULT16_32_QX(a,b,13) #define MULT16_32_Q14(a,b) MULT16_32_QX(a,b,14) #define MULT16_32_Q15(a,b) MULT16_32_QX(a,b,15) #define MULT16_32_P15(a,b) MULT16_32_PX(a,b,15) #define MAC16_32_Q15(c,a,b) ADD32((c),MULT16_32_Q15((a),(b))) static inline int SATURATE(int a, int b) { if (a>b) a=b; if (a<-b) a = -b; return a; } static inline int MULT16_16_Q11_32(int a, int b) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16_Q11: inputs are not short: %d %d\n", a, b); } res = ((long long)a)*b; res >>= 11; if (!VERIFY_INT(res)) fprintf (stderr, "MULT16_16_Q11: output is not short: %d*%d=%d\n", (int)a, (int)b, (int)res); spx_mips+=3; return res; } static inline short MULT16_16_Q13(int a, int b) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16_Q13: inputs are not short: %d %d\n", a, b); } res = ((long long)a)*b; res >>= 13; if (!VERIFY_SHORT(res)) fprintf (stderr, "MULT16_16_Q13: output is not short: %d*%d=%d\n", a, b, (int)res); spx_mips+=3; return res; } static inline short MULT16_16_Q14(int a, int b) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16_Q14: inputs are not short: %d %d\n", a, b); } res = ((long long)a)*b; res >>= 14; if (!VERIFY_SHORT(res)) fprintf (stderr, "MULT16_16_Q14: output is not short: %d\n", (int)res); spx_mips+=3; return res; } static inline short MULT16_16_Q15(int a, int b) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16_Q15: inputs are not short: %d %d\n", a, b); } res = ((long long)a)*b; res >>= 15; if (!VERIFY_SHORT(res)) { fprintf (stderr, "MULT16_16_Q15: output is not short: %d\n", (int)res); } spx_mips+=3; return res; } static inline short MULT16_16_P13(int a, int b) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16_P13: inputs are not short: %d %d\n", a, b); } res = ((long long)a)*b; res += 4096; if (!VERIFY_INT(res)) fprintf (stderr, "MULT16_16_P13: overflow: %d*%d=%d\n", a, b, (int)res); res >>= 13; if (!VERIFY_SHORT(res)) fprintf (stderr, "MULT16_16_P13: output is not short: %d*%d=%d\n", a, b, (int)res); spx_mips+=4; return res; } static inline short MULT16_16_P14(int a, int b) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16_P14: inputs are not short: %d %d\n", a, b); } res = ((long long)a)*b; res += 8192; if (!VERIFY_INT(res)) fprintf (stderr, "MULT16_16_P14: overflow: %d*%d=%d\n", a, b, (int)res); res >>= 14; if (!VERIFY_SHORT(res)) fprintf (stderr, "MULT16_16_P14: output is not short: %d*%d=%d\n", a, b, (int)res); spx_mips+=4; return res; } static inline short MULT16_16_P15(int a, int b) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16_P15: inputs are not short: %d %d\n", a, b); } res = ((long long)a)*b; res += 16384; if (!VERIFY_INT(res)) fprintf (stderr, "MULT16_16_P15: overflow: %d*%d=%d\n", a, b, (int)res); res >>= 15; if (!VERIFY_SHORT(res)) fprintf (stderr, "MULT16_16_P15: output is not short: %d*%d=%d\n", a, b, (int)res); spx_mips+=4; return res; } #define DIV32_16(a, b) _DIV32_16(a, b, __FILE__, __LINE__) static inline int _DIV32_16(long long a, long long b, char *file, int line) { long long res; if (b==0) { fprintf(stderr, "DIV32_16: divide by zero: %d/%d in %s: line %d\n", (int)a, (int)b, file, line); return 0; } if (!VERIFY_INT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "DIV32_16: inputs are not int/short: %d %d in %s: line %d\n", (int)a, (int)b, file, line); } res = a/b; if (!VERIFY_SHORT(res)) { fprintf (stderr, "DIV32_16: output is not short: %d / %d = %d in %s: line %d\n", (int)a,(int)b,(int)res, file, line); if (res>32767) res = 32767; if (res<-32768) res = -32768; } spx_mips+=20; return res; } #define DIV32(a, b) _DIV32(a, b, __FILE__, __LINE__) static inline int _DIV32(long long a, long long b, char *file, int line) { long long res; if (b==0) { fprintf(stderr, "DIV32: divide by zero: %d/%d in %s: line %d\n", (int)a, (int)b, file, line); return 0; } if (!VERIFY_INT(a) || !VERIFY_INT(b)) { fprintf (stderr, "DIV32: inputs are not int/short: %d %d in %s: line %d\n", (int)a, (int)b, file, line); } res = a/b; if (!VERIFY_INT(res)) fprintf (stderr, "DIV32: output is not int: %d in %s: line %d\n", (int)res, file, line); spx_mips+=36; return res; } #define PDIV32(a,b) DIV32(ADD32((a),(b)>>1),b) #define PDIV32_16(a,b) DIV32_16(ADD32((a),(b)>>1),b) #endif mumble-1.3.4/3rdparty/speex-src/libspeex/lpc_bfin.h0000664000175000017500000001041014010707304022051 0ustar builderbuilder/* Copyright (C) 2005 Analog Devices */ /** @file lpc_bfin.h @author Jean-Marc Valin @brief Functions for LPC (Linear Prediction Coefficients) analysis (Blackfin version) */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "bfin.h" #define OVERRIDE_SPEEX_AUTOCORR void _spx_autocorr( const spx_word16_t *x, /* in: [0...n-1] samples x */ spx_word16_t *ac, /* out: [0...lag-1] ac values */ int lag, int n ) { spx_word32_t d; const spx_word16_t *xs; int i, j; spx_word32_t ac0=1; spx_word32_t ac32[11], *ac32top; int shift, ac_shift; ac32top = ac32+lag-1; int lag_1, N_lag; int nshift; lag_1 = lag-1; N_lag = n-lag_1; for (j=0;j> 1;\n\t" "LOOP_BEGIN pitch%=;\n\t" "I1 = P0;\n\t" "A1 = A0 = 0;\n\t" "R1 = [I1++];\n\t" "LOOP inner_prod%= LC1 = P3 >> 1;\n\t" "LOOP_BEGIN inner_prod%=;\n\t" "A1 += R0.L*R1.H, A0 += R0.L*R1.L (IS) || R1.L = W[I1++];\n\t" "A1 += R0.H*R1.L, A0 += R0.H*R1.H (IS) || R1.H = W[I1++] || R0 = [I0++];\n\t" "LOOP_END inner_prod%=;\n\t" "A0 = ASHIFT A0 by R4.L;\n\t" "A1 = ASHIFT A1 by R4.L;\n\t" "R2 = A0, R3 = A1;\n\t" "[P1--] = R2;\n\t" "[P1--] = R3;\n\t" "P0 += 4;\n\t" "LOOP_END pitch%=;\n\t" : : "m" (xs), "m" (x), "m" (ac32top), "m" (N_lag), "m" (lag_1), "m" (nshift) : "A0", "A1", "P0", "P1", "P2", "P3", "P4", "R0", "R1", "R2", "R3", "R4", "I0", "I1", "L0", "L1", "B0", "B1", "memory", "ASTAT" BFIN_HWLOOP0_REGS BFIN_HWLOOP1_REGS ); d=0; for (j=0;j void vq_nbest(spx_word16_t *in, const __m128 *codebook, int len, int entries, __m128 *E, int N, int *nbest, spx_word32_t *best_dist, char *stack); void vq_nbest_sign(spx_word16_t *in, const __m128 *codebook, int len, int entries, __m128 *E, int N, int *nbest, spx_word32_t *best_dist, char *stack); #else void vq_nbest(spx_word16_t *in, const spx_word16_t *codebook, int len, int entries, spx_word32_t *E, int N, int *nbest, spx_word32_t *best_dist, char *stack); void vq_nbest_sign(spx_word16_t *in, const spx_word16_t *codebook, int len, int entries, spx_word32_t *E, int N, int *nbest, spx_word32_t *best_dist, char *stack); #endif #endif mumble-1.3.4/3rdparty/speex-src/libspeex/exc_5_64_table.c0000664000175000017500000000531414010707304022762 0ustar builderbuilder/* Copyright (C) 2002 Jean-Marc Valin File: exc_5_64_table.c Codebook for excitation in narrowband CELP mode (9600 bps) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ const signed char exc_5_64_table[320]={ 1,5,-15,49,-66, -48,-4,50,-44,7, 37,16,-18,25,-26, -26,-15,19,19,-27, -47,28,57,5,-17, -32,-41,68,21,-2, 64,56,8,-16,-13, -26,-9,-16,11,6, -39,25,-19,22,-31, 20,-45,55,-43,10, -16,47,-40,40,-20, -51,3,-17,-14,-15, -24,53,-20,-46,46, 27,-68,32,3,-18, -5,9,-31,16,-9, -10,-1,-23,48,95, 47,25,-41,-32,-3, 15,-25,-55,36,41, -27,20,5,13,14, -22,5,2,-23,18, 46,-15,17,-18,-34, -5,-8,27,-55,73, 16,2,-1,-17,40, -78,33,0,2,19, 4,53,-16,-15,-16, -28,-3,-13,49,8, -7,-29,27,-13,32, 20,32,-61,16,14, 41,44,40,24,20, 7,4,48,-60,-77, 17,-6,-48,65,-15, 32,-30,-71,-10,-3, -6,10,-2,-7,-29, -56,67,-30,7,-5, 86,-6,-10,0,5, -31,60,34,-38,-3, 24,10,-2,30,23, 24,-41,12,70,-43, 15,-17,6,13,16, -13,8,30,-15,-8, 5,23,-34,-98,-4, -13,13,-48,-31,70, 12,31,25,24,-24, 26,-7,33,-16,8, 5,-11,-14,-8,-65, 13,10,-2,-9,0, -3,-68,5,35,7, 0,-31,-1,-17,-9, -9,16,-37,-18,-1, 69,-48,-28,22,-21, -11,5,49,55,23, -86,-36,16,2,13, 63,-51,30,-11,13, 24,-18,-6,14,-19, 1,41,9,-5,27, -36,-44,-34,-37,-21, -26,31,-39,15,43, 5,-8,29,20,-8, -20,-52,-28,-1,13, 26,-34,-10,-9,27, -8,8,27,-66,4, 12,-22,49,10,-77, 32,-18,3,-38,12, -3,-1,2,2,0}; mumble-1.3.4/3rdparty/speex-src/libspeex/exc_10_32_table.c0000664000175000017500000000512014010707304023024 0ustar builderbuilder/* Copyright (C) 2002 Jean-Marc Valin File: exc_10_32_table.c Codebook for excitation in narrowband CELP mode (4000 bps) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ const signed char exc_10_32_table[320] = { 7,17,17,27,25,22,12,4,-3,0, 28,-36,39,-24,-15,3,-9,15,-5,10, 31,-28,11,31,-21,9,-11,-11,-2,-7, -25,14,-22,31,4,-14,19,-12,14,-5, 4,-7,4,-5,9,0,-2,42,-47,-16, 1,8,0,9,23,-57,0,28,-11,6, -31,55,-45,3,-5,4,2,-2,4,-7, -3,6,-2,7,-3,12,5,8,54,-10, 8,-7,-8,-24,-25,-27,-14,-5,8,5, 44,23,5,-9,-11,-11,-13,-9,-12,-8, -29,-8,-22,6,-15,3,-12,-1,-5,-3, 34,-1,29,-16,17,-4,12,2,1,4, -2,-4,2,-1,11,-3,-52,28,30,-9, -32,25,44,-20,-24,4,6,-1,0,0, 0,0,0,0,0,0,0,0,0,0, -25,-10,22,29,13,-13,-22,-13,-4,0, -4,-16,10,15,-36,-24,28,25,-1,-3, 66,-33,-11,-15,6,0,3,4,-2,5, 24,-20,-47,29,19,-2,-4,-1,0,-1, -2,3,1,8,-11,5,5,-57,28,28, 0,-16,4,-4,12,-6,-1,2,-20,61, -9,24,-22,-42,29,6,17,8,4,2, -65,15,8,10,5,6,5,3,2,-2, -3,5,-9,4,-5,23,13,23,-3,-63, 3,-5,-4,-6,0,-3,23,-36,-46,9, 5,5,8,4,9,-5,1,-3,10,1, -6,10,-11,24,-47,31,22,-12,14,-10, 6,11,-7,-7,7,-31,51,-12,-6,7, 6,-17,9,-11,-20,52,-19,3,-6,-6, -8,-5,23,-41,37,1,-21,10,-14,8, 7,5,-15,-15,23,39,-26,-33,7,2, -32,-30,-21,-8,4,12,17,15,14,11}; mumble-1.3.4/3rdparty/speex-src/libspeex/fixed_generic.h0000664000175000017500000001213614010707304023077 0ustar builderbuilder/* Copyright (C) 2003 Jean-Marc Valin */ /** @file fixed_generic.h @brief Generic fixed-point operations */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef FIXED_GENERIC_H #define FIXED_GENERIC_H #define QCONST16(x,bits) ((spx_word16_t)(.5+(x)*(((spx_word32_t)1)<<(bits)))) #define QCONST32(x,bits) ((spx_word32_t)(.5+(x)*(((spx_word32_t)1)<<(bits)))) #define NEG16(x) (-(x)) #define NEG32(x) (-(x)) #define EXTRACT16(x) ((spx_word16_t)(x)) #define EXTEND32(x) ((spx_word32_t)(x)) #define SHR16(a,shift) ((a) >> (shift)) #define SHL16(a,shift) ((a) << (shift)) #define SHR32(a,shift) ((a) >> (shift)) #define SHL32(a,shift) ((a) << (shift)) #define PSHR16(a,shift) (SHR16((a)+((1<<((shift))>>1)),shift)) #define PSHR32(a,shift) (SHR32((a)+((EXTEND32(1)<<((shift))>>1)),shift)) #define VSHR32(a, shift) (((shift)>0) ? SHR32(a, shift) : SHL32(a, -(shift))) #define SATURATE16(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) #define SATURATE32(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) #define SHR(a,shift) ((a) >> (shift)) #define SHL(a,shift) ((spx_word32_t)(a) << (shift)) #define PSHR(a,shift) (SHR((a)+((EXTEND32(1)<<((shift))>>1)),shift)) #define SATURATE(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) #define ADD16(a,b) ((spx_word16_t)((spx_word16_t)(a)+(spx_word16_t)(b))) #define SUB16(a,b) ((spx_word16_t)(a)-(spx_word16_t)(b)) #define ADD32(a,b) ((spx_word32_t)(a)+(spx_word32_t)(b)) #define SUB32(a,b) ((spx_word32_t)(a)-(spx_word32_t)(b)) /* result fits in 16 bits */ #define MULT16_16_16(a,b) ((((spx_word16_t)(a))*((spx_word16_t)(b)))) /* (spx_word32_t)(spx_word16_t) gives TI compiler a hint that it's 16x16->32 multiply */ #define MULT16_16(a,b) (((spx_word32_t)(spx_word16_t)(a))*((spx_word32_t)(spx_word16_t)(b))) #define MAC16_16(c,a,b) (ADD32((c),MULT16_16((a),(b)))) #define MULT16_32_Q12(a,b) ADD32(MULT16_16((a),SHR((b),12)), SHR(MULT16_16((a),((b)&0x00000fff)),12)) #define MULT16_32_Q13(a,b) ADD32(MULT16_16((a),SHR((b),13)), SHR(MULT16_16((a),((b)&0x00001fff)),13)) #define MULT16_32_Q14(a,b) ADD32(MULT16_16((a),SHR((b),14)), SHR(MULT16_16((a),((b)&0x00003fff)),14)) #define MULT16_32_Q11(a,b) ADD32(MULT16_16((a),SHR((b),11)), SHR(MULT16_16((a),((b)&0x000007ff)),11)) #define MAC16_32_Q11(c,a,b) ADD32(c,ADD32(MULT16_16((a),SHR((b),11)), SHR(MULT16_16((a),((b)&0x000007ff)),11))) #define MULT16_32_P15(a,b) ADD32(MULT16_16((a),SHR((b),15)), PSHR(MULT16_16((a),((b)&0x00007fff)),15)) #define MULT16_32_Q15(a,b) ADD32(MULT16_16((a),SHR((b),15)), SHR(MULT16_16((a),((b)&0x00007fff)),15)) #define MAC16_32_Q15(c,a,b) ADD32(c,ADD32(MULT16_16((a),SHR((b),15)), SHR(MULT16_16((a),((b)&0x00007fff)),15))) #define MAC16_16_Q11(c,a,b) (ADD32((c),SHR(MULT16_16((a),(b)),11))) #define MAC16_16_Q13(c,a,b) (ADD32((c),SHR(MULT16_16((a),(b)),13))) #define MAC16_16_P13(c,a,b) (ADD32((c),SHR(ADD32(4096,MULT16_16((a),(b))),13))) #define MULT16_16_Q11_32(a,b) (SHR(MULT16_16((a),(b)),11)) #define MULT16_16_Q13(a,b) (SHR(MULT16_16((a),(b)),13)) #define MULT16_16_Q14(a,b) (SHR(MULT16_16((a),(b)),14)) #define MULT16_16_Q15(a,b) (SHR(MULT16_16((a),(b)),15)) #define MULT16_16_P13(a,b) (SHR(ADD32(4096,MULT16_16((a),(b))),13)) #define MULT16_16_P14(a,b) (SHR(ADD32(8192,MULT16_16((a),(b))),14)) #define MULT16_16_P15(a,b) (SHR(ADD32(16384,MULT16_16((a),(b))),15)) #define MUL_16_32_R15(a,bh,bl) ADD32(MULT16_16((a),(bh)), SHR(MULT16_16((a),(bl)),15)) #define DIV32_16(a,b) ((spx_word16_t)(((spx_word32_t)(a))/((spx_word16_t)(b)))) #define PDIV32_16(a,b) ((spx_word16_t)(((spx_word32_t)(a)+((spx_word16_t)(b)>>1))/((spx_word16_t)(b)))) #define DIV32(a,b) (((spx_word32_t)(a))/((spx_word32_t)(b))) #define PDIV32(a,b) (((spx_word32_t)(a)+((spx_word16_t)(b)>>1))/((spx_word32_t)(b))) #endif mumble-1.3.4/3rdparty/speex-src/libspeex/sb_celp.h0000664000175000017500000001327014010707304021713 0ustar builderbuilder/* Copyright (C) 2002-2006 Jean-Marc Valin */ /** @file sb_celp.h @brief Sub-band CELP mode used for wideband encoding */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef SB_CELP_H #define SB_CELP_H #include "modes.h" #include "nb_celp.h" /**Structure representing the full state of the sub-band encoder*/ typedef struct SBEncState { const SpeexMode *mode; /**< Pointer to the mode (containing for vtable info) */ void *st_low; /**< State of the low-band (narrowband) encoder */ int full_frame_size; /**< Length of full-band frames*/ int frame_size; /**< Length of high-band frames*/ int subframeSize; /**< Length of high-band sub-frames*/ int nbSubframes; /**< Number of high-band sub-frames*/ int windowSize; /**< Length of high-band LPC window*/ int lpcSize; /**< Order of high-band LPC analysis */ int first; /**< First frame? */ spx_word16_t lpc_floor; /**< Controls LPC analysis noise floor */ spx_word16_t gamma1; /**< Perceptual weighting coef 1 */ spx_word16_t gamma2; /**< Perceptual weighting coef 2 */ char *stack; /**< Temporary allocation stack */ spx_word16_t *high; /**< High-band signal (buffer) */ spx_word16_t *h0_mem; const spx_word16_t *window; /**< LPC analysis window */ const spx_word16_t *lagWindow; /**< Auto-correlation window */ spx_lsp_t *old_lsp; /**< LSPs of previous frame */ spx_lsp_t *old_qlsp; /**< Quantized LSPs of previous frame */ spx_coef_t *interp_qlpc; /**< Interpolated quantized LPCs for current sub-frame */ spx_mem_t *mem_sp; /**< Synthesis signal memory */ spx_mem_t *mem_sp2; spx_mem_t *mem_sw; /**< Perceptual signal memory */ spx_word32_t *pi_gain; spx_word16_t *exc_rms; spx_word16_t *innov_rms_save; /**< If non-NULL, innovation is copied here */ #ifndef DISABLE_VBR float vbr_quality; /**< Quality setting for VBR encoding */ int vbr_enabled; /**< 1 for enabling VBR, 0 otherwise */ spx_int32_t vbr_max; /**< Max bit-rate allowed in VBR mode (total) */ spx_int32_t vbr_max_high; /**< Max bit-rate allowed in VBR mode for the high-band */ spx_int32_t abr_enabled; /**< ABR setting (in bps), 0 if off */ float abr_drift; float abr_drift2; float abr_count; int vad_enabled; /**< 1 for enabling VAD, 0 otherwise */ float relative_quality; #endif /* #ifndef DISABLE_VBR */ int encode_submode; const SpeexSubmode * const *submodes; int submodeID; int submodeSelect; int complexity; spx_int32_t sampling_rate; } SBEncState; /**Structure representing the full state of the sub-band decoder*/ typedef struct SBDecState { const SpeexMode *mode; /**< Pointer to the mode (containing for vtable info) */ void *st_low; /**< State of the low-band (narrowband) encoder */ int full_frame_size; int frame_size; int subframeSize; int nbSubframes; int lpcSize; int first; spx_int32_t sampling_rate; int lpc_enh_enabled; char *stack; spx_word16_t *g0_mem, *g1_mem; spx_word16_t *excBuf; spx_lsp_t *old_qlsp; spx_coef_t *interp_qlpc; spx_mem_t *mem_sp; spx_word32_t *pi_gain; spx_word16_t *exc_rms; spx_word16_t *innov_save; /** If non-NULL, innovation is copied here */ spx_word16_t last_ener; spx_int32_t seed; int encode_submode; const SpeexSubmode * const *submodes; int submodeID; } SBDecState; /**Initializes encoder state*/ void *sb_encoder_init(const SpeexMode *m); /**De-allocates encoder state resources*/ void sb_encoder_destroy(void *state); /**Encodes one frame*/ int sb_encode(void *state, void *in, SpeexBits *bits); /**Initializes decoder state*/ void *sb_decoder_init(const SpeexMode *m); /**De-allocates decoder state resources*/ void sb_decoder_destroy(void *state); /**Decodes one frame*/ int sb_decode(void *state, SpeexBits *bits, void *out); int sb_encoder_ctl(void *state, int request, void *ptr); int sb_decoder_ctl(void *state, int request, void *ptr); #endif mumble-1.3.4/3rdparty/speex-src/libspeex/kiss_fft.c0000664000175000017500000003662514010707304022120 0ustar builderbuilder/* Copyright (c) 2003-2004, Mark Borgerding Copyright (c) 2005-2007, Jean-Marc Valin All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the author nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "_kiss_fft_guts.h" #include "arch.h" #include "os_support.h" /* The guts header contains all the multiplication and addition macros that are defined for fixed or floating point complex numbers. It also delares the kf_ internal functions. */ static void kf_bfly2( kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_cfg st, int m, int N, int mm ) { kiss_fft_cpx * Fout2; kiss_fft_cpx * tw1; kiss_fft_cpx t; if (!st->inverse) { int i,j; kiss_fft_cpx * Fout_beg = Fout; for (i=0;itwiddles; for(j=0;jr , tw1->r),MULT16_16(Fout2->i , tw1->i)), 1); ti = SHR32(ADD32(MULT16_16(Fout2->i , tw1->r),MULT16_16(Fout2->r , tw1->i)), 1); tw1 += fstride; Fout2->r = PSHR32(SUB32(SHL32(EXTEND32(Fout->r), 14), tr), 15); Fout2->i = PSHR32(SUB32(SHL32(EXTEND32(Fout->i), 14), ti), 15); Fout->r = PSHR32(ADD32(SHL32(EXTEND32(Fout->r), 14), tr), 15); Fout->i = PSHR32(ADD32(SHL32(EXTEND32(Fout->i), 14), ti), 15); ++Fout2; ++Fout; } } } else { int i,j; kiss_fft_cpx * Fout_beg = Fout; for (i=0;itwiddles; for(j=0;jinverse) { kiss_fft_cpx * Fout_beg = Fout; for (i=0;itwiddles; for (j=0;jtwiddles; for (j=0;jr = PSHR16(Fout->r, 2); Fout->i = PSHR16(Fout->i, 2); C_SUB( scratch[5] , *Fout, scratch[1] ); C_ADDTO(*Fout, scratch[1]); C_ADD( scratch[3] , scratch[0] , scratch[2] ); C_SUB( scratch[4] , scratch[0] , scratch[2] ); Fout[m2].r = PSHR16(Fout[m2].r, 2); Fout[m2].i = PSHR16(Fout[m2].i, 2); C_SUB( Fout[m2], *Fout, scratch[3] ); tw1 += fstride; tw2 += fstride*2; tw3 += fstride*3; C_ADDTO( *Fout , scratch[3] ); Fout[m].r = scratch[5].r + scratch[4].i; Fout[m].i = scratch[5].i - scratch[4].r; Fout[m3].r = scratch[5].r - scratch[4].i; Fout[m3].i = scratch[5].i + scratch[4].r; ++Fout; } } } } static void kf_bfly3( kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_cfg st, size_t m ) { size_t k=m; const size_t m2 = 2*m; kiss_fft_cpx *tw1,*tw2; kiss_fft_cpx scratch[5]; kiss_fft_cpx epi3; epi3 = st->twiddles[fstride*m]; tw1=tw2=st->twiddles; do{ if (!st->inverse) { C_FIXDIV(*Fout,3); C_FIXDIV(Fout[m],3); C_FIXDIV(Fout[m2],3); } C_MUL(scratch[1],Fout[m] , *tw1); C_MUL(scratch[2],Fout[m2] , *tw2); C_ADD(scratch[3],scratch[1],scratch[2]); C_SUB(scratch[0],scratch[1],scratch[2]); tw1 += fstride; tw2 += fstride*2; Fout[m].r = Fout->r - HALF_OF(scratch[3].r); Fout[m].i = Fout->i - HALF_OF(scratch[3].i); C_MULBYSCALAR( scratch[0] , epi3.i ); C_ADDTO(*Fout,scratch[3]); Fout[m2].r = Fout[m].r + scratch[0].i; Fout[m2].i = Fout[m].i - scratch[0].r; Fout[m].r -= scratch[0].i; Fout[m].i += scratch[0].r; ++Fout; }while(--k); } static void kf_bfly5( kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_cfg st, int m ) { kiss_fft_cpx *Fout0,*Fout1,*Fout2,*Fout3,*Fout4; int u; kiss_fft_cpx scratch[13]; kiss_fft_cpx * twiddles = st->twiddles; kiss_fft_cpx *tw; kiss_fft_cpx ya,yb; ya = twiddles[fstride*m]; yb = twiddles[fstride*2*m]; Fout0=Fout; Fout1=Fout0+m; Fout2=Fout0+2*m; Fout3=Fout0+3*m; Fout4=Fout0+4*m; tw=st->twiddles; for ( u=0; uinverse) { C_FIXDIV( *Fout0,5); C_FIXDIV( *Fout1,5); C_FIXDIV( *Fout2,5); C_FIXDIV( *Fout3,5); C_FIXDIV( *Fout4,5); } scratch[0] = *Fout0; C_MUL(scratch[1] ,*Fout1, tw[u*fstride]); C_MUL(scratch[2] ,*Fout2, tw[2*u*fstride]); C_MUL(scratch[3] ,*Fout3, tw[3*u*fstride]); C_MUL(scratch[4] ,*Fout4, tw[4*u*fstride]); C_ADD( scratch[7],scratch[1],scratch[4]); C_SUB( scratch[10],scratch[1],scratch[4]); C_ADD( scratch[8],scratch[2],scratch[3]); C_SUB( scratch[9],scratch[2],scratch[3]); Fout0->r += scratch[7].r + scratch[8].r; Fout0->i += scratch[7].i + scratch[8].i; scratch[5].r = scratch[0].r + S_MUL(scratch[7].r,ya.r) + S_MUL(scratch[8].r,yb.r); scratch[5].i = scratch[0].i + S_MUL(scratch[7].i,ya.r) + S_MUL(scratch[8].i,yb.r); scratch[6].r = S_MUL(scratch[10].i,ya.i) + S_MUL(scratch[9].i,yb.i); scratch[6].i = -S_MUL(scratch[10].r,ya.i) - S_MUL(scratch[9].r,yb.i); C_SUB(*Fout1,scratch[5],scratch[6]); C_ADD(*Fout4,scratch[5],scratch[6]); scratch[11].r = scratch[0].r + S_MUL(scratch[7].r,yb.r) + S_MUL(scratch[8].r,ya.r); scratch[11].i = scratch[0].i + S_MUL(scratch[7].i,yb.r) + S_MUL(scratch[8].i,ya.r); scratch[12].r = - S_MUL(scratch[10].i,yb.i) + S_MUL(scratch[9].i,ya.i); scratch[12].i = S_MUL(scratch[10].r,yb.i) - S_MUL(scratch[9].r,ya.i); C_ADD(*Fout2,scratch[11],scratch[12]); C_SUB(*Fout3,scratch[11],scratch[12]); ++Fout0;++Fout1;++Fout2;++Fout3;++Fout4; } } /* perform the butterfly for one stage of a mixed radix FFT */ static void kf_bfly_generic( kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_cfg st, int m, int p ) { int u,k,q1,q; kiss_fft_cpx * twiddles = st->twiddles; kiss_fft_cpx t; kiss_fft_cpx scratchbuf[17]; int Norig = st->nfft; /*CHECKBUF(scratchbuf,nscratchbuf,p);*/ if (p>17) speex_fatal("KissFFT: max radix supported is 17"); for ( u=0; uinverse) { C_FIXDIV(scratchbuf[q1],p); } k += m; } k=u; for ( q1=0 ; q1

    =Norig) twidx-=Norig; C_MUL(t,scratchbuf[q] , twiddles[twidx] ); C_ADDTO( Fout[ k ] ,t); } k += m; } } } static void kf_shuffle( kiss_fft_cpx * Fout, const kiss_fft_cpx * f, const size_t fstride, int in_stride, int * factors, const kiss_fft_cfg st ) { const int p=*factors++; /* the radix */ const int m=*factors++; /* stage's fft length/p */ /*printf ("fft %d %d %d %d %d %d\n", p*m, m, p, s2, fstride*in_stride, N);*/ if (m==1) { int j; for (j=0;j32000 || (spx_int32_t)p*(spx_int32_t)p > n) p = n; /* no more factors, skip to end */ } n /= p; *facbuf++ = p; *facbuf++ = n; } while (n > 1); } /* * * User-callable function to allocate all necessary storage space for the fft. * * The return value is a contiguous block of memory, allocated with malloc. As such, * It can be freed with free(), rather than a kiss_fft-specific function. * */ kiss_fft_cfg kiss_fft_alloc(int nfft,int inverse_fft,void * mem,size_t * lenmem ) { kiss_fft_cfg st=NULL; size_t memneeded = sizeof(struct kiss_fft_state) + sizeof(kiss_fft_cpx)*(nfft-1); /* twiddle factors*/ if ( lenmem==NULL ) { st = ( kiss_fft_cfg)KISS_FFT_MALLOC( memneeded ); }else{ if (mem != NULL && *lenmem >= memneeded) st = (kiss_fft_cfg)mem; *lenmem = memneeded; } if (st) { int i; st->nfft=nfft; st->inverse = inverse_fft; #ifdef FIXED_POINT for (i=0;iinverse) phase = -phase; kf_cexp2(st->twiddles+i, DIV32(SHL32(phase,17),nfft)); } #else for (i=0;iinverse) phase *= -1; kf_cexp(st->twiddles+i, phase ); } #endif kf_factor(nfft,st->factors); } return st; } void kiss_fft_stride(kiss_fft_cfg st,const kiss_fft_cpx *fin,kiss_fft_cpx *fout,int in_stride) { if (fin == fout) { speex_fatal("In-place FFT not supported"); /*CHECKBUF(tmpbuf,ntmpbuf,st->nfft); kf_work(tmpbuf,fin,1,in_stride, st->factors,st); SPEEX_MOVE(fout,tmpbuf,st->nfft);*/ } else { kf_shuffle( fout, fin, 1,in_stride, st->factors,st); kf_work( fout, fin, 1,in_stride, st->factors,st, 1, in_stride, 1); } } void kiss_fft(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout) { kiss_fft_stride(cfg,fin,fout,1); } mumble-1.3.4/3rdparty/speex-src/libspeex/kiss_fftr.c0000664000175000017500000002465514010707304022302 0ustar builderbuilder/* Copyright (c) 2003-2004, Mark Borgerding All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the author nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "os_support.h" #include "kiss_fftr.h" #include "_kiss_fft_guts.h" struct kiss_fftr_state{ kiss_fft_cfg substate; kiss_fft_cpx * tmpbuf; kiss_fft_cpx * super_twiddles; #ifdef USE_SIMD long pad; #endif }; kiss_fftr_cfg kiss_fftr_alloc(int nfft,int inverse_fft,void * mem,size_t * lenmem) { int i; kiss_fftr_cfg st = NULL; size_t subsize, memneeded; if (nfft & 1) { speex_warning("Real FFT optimization must be even.\n"); return NULL; } nfft >>= 1; kiss_fft_alloc (nfft, inverse_fft, NULL, &subsize); memneeded = sizeof(struct kiss_fftr_state) + subsize + sizeof(kiss_fft_cpx) * ( nfft * 2); if (lenmem == NULL) { st = (kiss_fftr_cfg) KISS_FFT_MALLOC (memneeded); } else { if (*lenmem >= memneeded) st = (kiss_fftr_cfg) mem; *lenmem = memneeded; } if (!st) return NULL; st->substate = (kiss_fft_cfg) (st + 1); /*just beyond kiss_fftr_state struct */ st->tmpbuf = (kiss_fft_cpx *) (((char *) st->substate) + subsize); st->super_twiddles = st->tmpbuf + nfft; kiss_fft_alloc(nfft, inverse_fft, st->substate, &subsize); #ifdef FIXED_POINT for (i=0;i>1); if (!inverse_fft) phase = -phase; kf_cexp2(st->super_twiddles+i, DIV32(SHL32(phase,16),nfft)); } #else for (i=0;isuper_twiddles+i, phase ); } #endif return st; } void kiss_fftr(kiss_fftr_cfg st,const kiss_fft_scalar *timedata,kiss_fft_cpx *freqdata) { /* input buffer timedata is stored row-wise */ int k,ncfft; kiss_fft_cpx fpnk,fpk,f1k,f2k,tw,tdc; if ( st->substate->inverse) { speex_fatal("kiss fft usage error: improper alloc\n"); } ncfft = st->substate->nfft; /*perform the parallel fft of two real signals packed in real,imag*/ kiss_fft( st->substate , (const kiss_fft_cpx*)timedata, st->tmpbuf ); /* The real part of the DC element of the frequency spectrum in st->tmpbuf * contains the sum of the even-numbered elements of the input time sequence * The imag part is the sum of the odd-numbered elements * * The sum of tdc.r and tdc.i is the sum of the input time sequence. * yielding DC of input time sequence * The difference of tdc.r - tdc.i is the sum of the input (dot product) [1,-1,1,-1... * yielding Nyquist bin of input time sequence */ tdc.r = st->tmpbuf[0].r; tdc.i = st->tmpbuf[0].i; C_FIXDIV(tdc,2); CHECK_OVERFLOW_OP(tdc.r ,+, tdc.i); CHECK_OVERFLOW_OP(tdc.r ,-, tdc.i); freqdata[0].r = tdc.r + tdc.i; freqdata[ncfft].r = tdc.r - tdc.i; #ifdef USE_SIMD freqdata[ncfft].i = freqdata[0].i = _mm_set1_ps(0); #else freqdata[ncfft].i = freqdata[0].i = 0; #endif for ( k=1;k <= ncfft/2 ; ++k ) { fpk = st->tmpbuf[k]; fpnk.r = st->tmpbuf[ncfft-k].r; fpnk.i = - st->tmpbuf[ncfft-k].i; C_FIXDIV(fpk,2); C_FIXDIV(fpnk,2); C_ADD( f1k, fpk , fpnk ); C_SUB( f2k, fpk , fpnk ); C_MUL( tw , f2k , st->super_twiddles[k]); freqdata[k].r = HALF_OF(f1k.r + tw.r); freqdata[k].i = HALF_OF(f1k.i + tw.i); freqdata[ncfft-k].r = HALF_OF(f1k.r - tw.r); freqdata[ncfft-k].i = HALF_OF(tw.i - f1k.i); } } void kiss_fftri(kiss_fftr_cfg st,const kiss_fft_cpx *freqdata, kiss_fft_scalar *timedata) { /* input buffer timedata is stored row-wise */ int k, ncfft; if (st->substate->inverse == 0) { speex_fatal("kiss fft usage error: improper alloc\n"); } ncfft = st->substate->nfft; st->tmpbuf[0].r = freqdata[0].r + freqdata[ncfft].r; st->tmpbuf[0].i = freqdata[0].r - freqdata[ncfft].r; /*C_FIXDIV(st->tmpbuf[0],2);*/ for (k = 1; k <= ncfft / 2; ++k) { kiss_fft_cpx fk, fnkc, fek, fok, tmp; fk = freqdata[k]; fnkc.r = freqdata[ncfft - k].r; fnkc.i = -freqdata[ncfft - k].i; /*C_FIXDIV( fk , 2 ); C_FIXDIV( fnkc , 2 );*/ C_ADD (fek, fk, fnkc); C_SUB (tmp, fk, fnkc); C_MUL (fok, tmp, st->super_twiddles[k]); C_ADD (st->tmpbuf[k], fek, fok); C_SUB (st->tmpbuf[ncfft - k], fek, fok); #ifdef USE_SIMD st->tmpbuf[ncfft - k].i *= _mm_set1_ps(-1.0); #else st->tmpbuf[ncfft - k].i *= -1; #endif } kiss_fft (st->substate, st->tmpbuf, (kiss_fft_cpx *) timedata); } void kiss_fftr2(kiss_fftr_cfg st,const kiss_fft_scalar *timedata,kiss_fft_scalar *freqdata) { /* input buffer timedata is stored row-wise */ int k,ncfft; kiss_fft_cpx f2k,tdc; spx_word32_t f1kr, f1ki, twr, twi; if ( st->substate->inverse) { speex_fatal("kiss fft usage error: improper alloc\n"); } ncfft = st->substate->nfft; /*perform the parallel fft of two real signals packed in real,imag*/ kiss_fft( st->substate , (const kiss_fft_cpx*)timedata, st->tmpbuf ); /* The real part of the DC element of the frequency spectrum in st->tmpbuf * contains the sum of the even-numbered elements of the input time sequence * The imag part is the sum of the odd-numbered elements * * The sum of tdc.r and tdc.i is the sum of the input time sequence. * yielding DC of input time sequence * The difference of tdc.r - tdc.i is the sum of the input (dot product) [1,-1,1,-1... * yielding Nyquist bin of input time sequence */ tdc.r = st->tmpbuf[0].r; tdc.i = st->tmpbuf[0].i; C_FIXDIV(tdc,2); CHECK_OVERFLOW_OP(tdc.r ,+, tdc.i); CHECK_OVERFLOW_OP(tdc.r ,-, tdc.i); freqdata[0] = tdc.r + tdc.i; freqdata[2*ncfft-1] = tdc.r - tdc.i; for ( k=1;k <= ncfft/2 ; ++k ) { /*fpk = st->tmpbuf[k]; fpnk.r = st->tmpbuf[ncfft-k].r; fpnk.i = - st->tmpbuf[ncfft-k].i; C_FIXDIV(fpk,2); C_FIXDIV(fpnk,2); C_ADD( f1k, fpk , fpnk ); C_SUB( f2k, fpk , fpnk ); C_MUL( tw , f2k , st->super_twiddles[k]); freqdata[2*k-1] = HALF_OF(f1k.r + tw.r); freqdata[2*k] = HALF_OF(f1k.i + tw.i); freqdata[2*(ncfft-k)-1] = HALF_OF(f1k.r - tw.r); freqdata[2*(ncfft-k)] = HALF_OF(tw.i - f1k.i); */ /*f1k.r = PSHR32(ADD32(EXTEND32(st->tmpbuf[k].r), EXTEND32(st->tmpbuf[ncfft-k].r)),1); f1k.i = PSHR32(SUB32(EXTEND32(st->tmpbuf[k].i), EXTEND32(st->tmpbuf[ncfft-k].i)),1); f2k.r = PSHR32(SUB32(EXTEND32(st->tmpbuf[k].r), EXTEND32(st->tmpbuf[ncfft-k].r)),1); f2k.i = SHR32(ADD32(EXTEND32(st->tmpbuf[k].i), EXTEND32(st->tmpbuf[ncfft-k].i)),1); C_MUL( tw , f2k , st->super_twiddles[k]); freqdata[2*k-1] = HALF_OF(f1k.r + tw.r); freqdata[2*k] = HALF_OF(f1k.i + tw.i); freqdata[2*(ncfft-k)-1] = HALF_OF(f1k.r - tw.r); freqdata[2*(ncfft-k)] = HALF_OF(tw.i - f1k.i); */ f2k.r = SHR32(SUB32(EXTEND32(st->tmpbuf[k].r), EXTEND32(st->tmpbuf[ncfft-k].r)),1); f2k.i = PSHR32(ADD32(EXTEND32(st->tmpbuf[k].i), EXTEND32(st->tmpbuf[ncfft-k].i)),1); f1kr = SHL32(ADD32(EXTEND32(st->tmpbuf[k].r), EXTEND32(st->tmpbuf[ncfft-k].r)),13); f1ki = SHL32(SUB32(EXTEND32(st->tmpbuf[k].i), EXTEND32(st->tmpbuf[ncfft-k].i)),13); twr = SHR32(SUB32(MULT16_16(f2k.r,st->super_twiddles[k].r),MULT16_16(f2k.i,st->super_twiddles[k].i)), 1); twi = SHR32(ADD32(MULT16_16(f2k.i,st->super_twiddles[k].r),MULT16_16(f2k.r,st->super_twiddles[k].i)), 1); #ifdef FIXED_POINT freqdata[2*k-1] = PSHR32(f1kr + twr, 15); freqdata[2*k] = PSHR32(f1ki + twi, 15); freqdata[2*(ncfft-k)-1] = PSHR32(f1kr - twr, 15); freqdata[2*(ncfft-k)] = PSHR32(twi - f1ki, 15); #else freqdata[2*k-1] = .5f*(f1kr + twr); freqdata[2*k] = .5f*(f1ki + twi); freqdata[2*(ncfft-k)-1] = .5f*(f1kr - twr); freqdata[2*(ncfft-k)] = .5f*(twi - f1ki); #endif } } void kiss_fftri2(kiss_fftr_cfg st,const kiss_fft_scalar *freqdata,kiss_fft_scalar *timedata) { /* input buffer timedata is stored row-wise */ int k, ncfft; if (st->substate->inverse == 0) { speex_fatal ("kiss fft usage error: improper alloc\n"); } ncfft = st->substate->nfft; st->tmpbuf[0].r = freqdata[0] + freqdata[2*ncfft-1]; st->tmpbuf[0].i = freqdata[0] - freqdata[2*ncfft-1]; /*C_FIXDIV(st->tmpbuf[0],2);*/ for (k = 1; k <= ncfft / 2; ++k) { kiss_fft_cpx fk, fnkc, fek, fok, tmp; fk.r = freqdata[2*k-1]; fk.i = freqdata[2*k]; fnkc.r = freqdata[2*(ncfft - k)-1]; fnkc.i = -freqdata[2*(ncfft - k)]; /*C_FIXDIV( fk , 2 ); C_FIXDIV( fnkc , 2 );*/ C_ADD (fek, fk, fnkc); C_SUB (tmp, fk, fnkc); C_MUL (fok, tmp, st->super_twiddles[k]); C_ADD (st->tmpbuf[k], fek, fok); C_SUB (st->tmpbuf[ncfft - k], fek, fok); #ifdef USE_SIMD st->tmpbuf[ncfft - k].i *= _mm_set1_ps(-1.0); #else st->tmpbuf[ncfft - k].i *= -1; #endif } kiss_fft (st->substate, st->tmpbuf, (kiss_fft_cpx *) timedata); } mumble-1.3.4/3rdparty/speex-src/libspeex/cb_search_bfin.h0000664000175000017500000000771714010707304023224 0ustar builderbuilder/* Copyright (C) 2005 Analog Devices */ /** @author Jean-Marc Valin @file cb_search_bfin.h @brief Fixed codebook functions (Blackfin version) */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "bfin.h" #define OVERRIDE_COMPUTE_WEIGHTED_CODEBOOK void compute_weighted_codebook(const signed char *shape_cb, const spx_word16_t *r, spx_word16_t *resp, spx_word16_t *resp2, spx_word32_t *E, int shape_cb_size, int subvect_size, char *stack) { int i; for (i=0;i>>= 13;\n\t" "A1 += R0.L*R0.L (IS);\n\t" "W[P3++] = R0;\n\t" "P0 += 1;\n\t" "P2 += 2;\n\t" "LOOP_END outter%=;\n\t" "P4 = %4;\n\t" "R1 = A1;\n\t" "[P4] = R1;\n\t" : : "m" (subvect_size), "m" (shape_cb), "m" (r), "m" (resp), "m" (E) : "A0", "P0", "P1", "P2", "P3", "P4", "R0", "R1", "R2", "I0", "I1", "L0", "L1", "A0", "A1", "memory", "ASTAT" BFIN_HWLOOP0_REGS BFIN_HWLOOP1_REGS ); shape_cb += subvect_size; resp += subvect_size; E++; } } #define OVERRIDE_TARGET_UPDATE static inline void target_update(spx_word16_t *t, spx_word16_t g, spx_word16_t *r, int len) { if (!len) return; __asm__ __volatile__ ( "I0 = %0;\n\t" "I1 = %1;\n\t" "L0 = 0;\n\t" "L1 = 0;\n\t" "R2 = 4096;\n\t" "LOOP tupdate%= LC0 = %3;\n\t" "LOOP_BEGIN tupdate%=;\n\t" "R0.L = W[I0] || R1.L = W[I1++];\n\t" "R1 = (A1 = R1.L*%2.L) (IS);\n\t" "R1 = R1 + R2;\n\t" "R1 >>>= 13;\n\t" "R0.L = R0.L - R1.L;\n\t" "W[I0++] = R0.L;\n\t" "LOOP_END tupdate%=;\n\t" : : "a" (t), "a" (r), "d" (g), "a" (len) : "R0", "R1", "R2", "A1", "I0", "I1", "L0", "L1", "ASTAT" BFIN_HWLOOP0_REGS ); } mumble-1.3.4/3rdparty/speex-src/libspeex/smallft.h0000664000175000017500000000272214010707304021746 0ustar builderbuilder/******************************************************************** * * * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2001 * * by the XIPHOPHORUS Company http://www.xiph.org/ * * * ******************************************************************** function: fft transform last mod: $Id: smallft.h,v 1.3 2003/09/16 18:35:45 jm Exp $ ********************************************************************/ /** @file smallft.h @brief Discrete Rotational Fourier Transform (DRFT) */ #ifndef _V_SMFT_H_ #define _V_SMFT_H_ #ifdef __cplusplus extern "C" { #endif /** Discrete Rotational Fourier Transform lookup */ struct drft_lookup{ int n; float *trigcache; int *splitcache; }; extern void spx_drft_forward(struct drft_lookup *l,float *data); extern void spx_drft_backward(struct drft_lookup *l,float *data); extern void spx_drft_init(struct drft_lookup *l,int n); extern void spx_drft_clear(struct drft_lookup *l); #ifdef __cplusplus } #endif #endif mumble-1.3.4/3rdparty/speex-src/libspeex/quant_lsp.c0000664000175000017500000002322014010707304022301 0ustar builderbuilder/* Copyright (C) 2002 Jean-Marc Valin File: quant_lsp.c LSP vector quantization Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "quant_lsp.h" #include "os_support.h" #include #ifndef M_PI #define M_PI 3.14159265358979323846 #endif #include "arch.h" #ifdef BFIN_ASM #include "quant_lsp_bfin.h" #endif #ifdef FIXED_POINT #define LSP_LINEAR(i) (SHL16(i+1,11)) #define LSP_LINEAR_HIGH(i) (ADD16(MULT16_16_16(i,2560),6144)) #define LSP_DIV_256(x) (SHL16((spx_word16_t)x, 5)) #define LSP_DIV_512(x) (SHL16((spx_word16_t)x, 4)) #define LSP_DIV_1024(x) (SHL16((spx_word16_t)x, 3)) #define LSP_PI 25736 #else #define LSP_LINEAR(i) (.25*(i)+.25) #define LSP_LINEAR_HIGH(i) (.3125*(i)+.75) #define LSP_SCALE 256. #define LSP_DIV_256(x) (0.0039062*(x)) #define LSP_DIV_512(x) (0.0019531*(x)) #define LSP_DIV_1024(x) (0.00097656*(x)) #define LSP_PI M_PI #endif #ifndef DISABLE_ENCODER static void compute_quant_weights(spx_lsp_t *qlsp, spx_word16_t *quant_weight, int order) { int i; spx_word16_t tmp1, tmp2; for (i=0;i tmp2 ? tmp1 : tmp2; }*/ for (i=0;i0 ? g[0] : -SHR16(g[0],1)) + (g[2]>0 ? g[2] : -SHR16(g[2],1))) #else #define gain_3tap_to_1tap(g) (ABS(g[1]) + (g[0]>0 ? g[0] : -.5*g[0]) + (g[2]>0 ? g[2] : -.5*g[2])) #endif spx_word32_t inner_prod(const spx_word16_t *x, const spx_word16_t *y, int len); void open_loop_nbest_pitch(spx_word16_t *sw, int start, int end, int len, int *pitch, spx_word16_t *gain, int N, char *stack); /** Finds the best quantized 3-tap pitch predictor by analysis by synthesis */ int pitch_search_3tap( spx_word16_t target[], /* Target vector */ spx_word16_t *sw, spx_coef_t ak[], /* LPCs for this subframe */ spx_coef_t awk1[], /* Weighted LPCs #1 for this subframe */ spx_coef_t awk2[], /* Weighted LPCs #2 for this subframe */ spx_sig_t exc[], /* Overlapping codebook */ const void *par, int start, /* Smallest pitch value allowed */ int end, /* Largest pitch value allowed */ spx_word16_t pitch_coef, /* Voicing (pitch) coefficient */ int p, /* Number of LPC coeffs */ int nsf, /* Number of samples in subframe */ SpeexBits *bits, char *stack, spx_word16_t *exc2, spx_word16_t *r, int complexity, int cdbk_offset, int plc_tuning, spx_word32_t *cumul_gain ); /*Unquantize adaptive codebook and update pitch contribution*/ void pitch_unquant_3tap( spx_word16_t exc[], /* Input excitation */ spx_word32_t exc_out[], /* Output excitation */ int start, /* Smallest pitch value allowed */ int end, /* Largest pitch value allowed */ spx_word16_t pitch_coef, /* Voicing (pitch) coefficient */ const void *par, int nsf, /* Number of samples in subframe */ int *pitch_val, spx_word16_t *gain_val, SpeexBits *bits, char *stack, int lost, int subframe_offset, spx_word16_t last_pitch_gain, int cdbk_offset ); /** Forced pitch delay and gain */ int forced_pitch_quant( spx_word16_t target[], /* Target vector */ spx_word16_t *sw, spx_coef_t ak[], /* LPCs for this subframe */ spx_coef_t awk1[], /* Weighted LPCs #1 for this subframe */ spx_coef_t awk2[], /* Weighted LPCs #2 for this subframe */ spx_sig_t exc[], /* Excitation */ const void *par, int start, /* Smallest pitch value allowed */ int end, /* Largest pitch value allowed */ spx_word16_t pitch_coef, /* Voicing (pitch) coefficient */ int p, /* Number of LPC coeffs */ int nsf, /* Number of samples in subframe */ SpeexBits *bits, char *stack, spx_word16_t *exc2, spx_word16_t *r, int complexity, int cdbk_offset, int plc_tuning, spx_word32_t *cumul_gain ); /** Unquantize forced pitch delay and gain */ void forced_pitch_unquant( spx_word16_t exc[], /* Input excitation */ spx_word32_t exc_out[], /* Output excitation */ int start, /* Smallest pitch value allowed */ int end, /* Largest pitch value allowed */ spx_word16_t pitch_coef, /* Voicing (pitch) coefficient */ const void *par, int nsf, /* Number of samples in subframe */ int *pitch_val, spx_word16_t *gain_val, SpeexBits *bits, char *stack, int lost, int subframe_offset, spx_word16_t last_pitch_gain, int cdbk_offset ); #endif /* LTP_H */ mumble-1.3.4/3rdparty/speex-src/libspeex/_kiss_fft_guts.h0000664000175000017500000001306514010707304023317 0ustar builderbuilder/* Copyright (c) 2003-2004, Mark Borgerding All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the author nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #define MIN(a,b) ((a)<(b) ? (a):(b)) #define MAX(a,b) ((a)>(b) ? (a):(b)) /* kiss_fft.h defines kiss_fft_scalar as either short or a float type and defines typedef struct { kiss_fft_scalar r; kiss_fft_scalar i; }kiss_fft_cpx; */ #include "kiss_fft.h" #include "math_approx.h" #define MAXFACTORS 32 /* e.g. an fft of length 128 has 4 factors as far as kissfft is concerned 4*4*4*2 */ struct kiss_fft_state{ int nfft; int inverse; int factors[2*MAXFACTORS]; kiss_fft_cpx twiddles[1]; }; /* Explanation of macros dealing with complex math: C_MUL(m,a,b) : m = a*b C_FIXDIV( c , div ) : if a fixed point impl., c /= div. noop otherwise C_SUB( res, a,b) : res = a - b C_SUBFROM( res , a) : res -= a C_ADDTO( res , a) : res += a * */ #ifdef FIXED_POINT #include "arch.h" # define FRACBITS 15 # define SAMPPROD spx_int32_t #define SAMP_MAX 32767 #define SAMP_MIN -SAMP_MAX #if defined(CHECK_OVERFLOW) # define CHECK_OVERFLOW_OP(a,op,b) \ if ( (SAMPPROD)(a) op (SAMPPROD)(b) > SAMP_MAX || (SAMPPROD)(a) op (SAMPPROD)(b) < SAMP_MIN ) { \ fprintf(stderr,"WARNING:overflow @ " __FILE__ "(%d): (%d " #op" %d) = %ld\n",__LINE__,(a),(b),(SAMPPROD)(a) op (SAMPPROD)(b) ); } #endif # define smul(a,b) ( (SAMPPROD)(a)*(b) ) # define sround( x ) (kiss_fft_scalar)( ( (x) + (1<<(FRACBITS-1)) ) >> FRACBITS ) # define S_MUL(a,b) sround( smul(a,b) ) # define C_MUL(m,a,b) \ do{ (m).r = sround( smul((a).r,(b).r) - smul((a).i,(b).i) ); \ (m).i = sround( smul((a).r,(b).i) + smul((a).i,(b).r) ); }while(0) # define C_MUL4(m,a,b) \ do{ (m).r = PSHR32( smul((a).r,(b).r) - smul((a).i,(b).i),17 ); \ (m).i = PSHR32( smul((a).r,(b).i) + smul((a).i,(b).r),17 ); }while(0) # define DIVSCALAR(x,k) \ (x) = sround( smul( x, SAMP_MAX/k ) ) # define C_FIXDIV(c,div) \ do { DIVSCALAR( (c).r , div); \ DIVSCALAR( (c).i , div); }while (0) # define C_MULBYSCALAR( c, s ) \ do{ (c).r = sround( smul( (c).r , s ) ) ;\ (c).i = sround( smul( (c).i , s ) ) ; }while(0) #else /* not FIXED_POINT*/ # define S_MUL(a,b) ( (a)*(b) ) #define C_MUL(m,a,b) \ do{ (m).r = (a).r*(b).r - (a).i*(b).i;\ (m).i = (a).r*(b).i + (a).i*(b).r; }while(0) #define C_MUL4(m,a,b) C_MUL(m,a,b) # define C_FIXDIV(c,div) /* NOOP */ # define C_MULBYSCALAR( c, s ) \ do{ (c).r *= (s);\ (c).i *= (s); }while(0) #endif #ifndef CHECK_OVERFLOW_OP # define CHECK_OVERFLOW_OP(a,op,b) /* noop */ #endif #define C_ADD( res, a,b)\ do { \ CHECK_OVERFLOW_OP((a).r,+,(b).r)\ CHECK_OVERFLOW_OP((a).i,+,(b).i)\ (res).r=(a).r+(b).r; (res).i=(a).i+(b).i; \ }while(0) #define C_SUB( res, a,b)\ do { \ CHECK_OVERFLOW_OP((a).r,-,(b).r)\ CHECK_OVERFLOW_OP((a).i,-,(b).i)\ (res).r=(a).r-(b).r; (res).i=(a).i-(b).i; \ }while(0) #define C_ADDTO( res , a)\ do { \ CHECK_OVERFLOW_OP((res).r,+,(a).r)\ CHECK_OVERFLOW_OP((res).i,+,(a).i)\ (res).r += (a).r; (res).i += (a).i;\ }while(0) #define C_SUBFROM( res , a)\ do {\ CHECK_OVERFLOW_OP((res).r,-,(a).r)\ CHECK_OVERFLOW_OP((res).i,-,(a).i)\ (res).r -= (a).r; (res).i -= (a).i; \ }while(0) #ifdef FIXED_POINT # define KISS_FFT_COS(phase) floor(MIN(32767,MAX(-32767,.5+32768 * cos (phase)))) # define KISS_FFT_SIN(phase) floor(MIN(32767,MAX(-32767,.5+32768 * sin (phase)))) # define HALF_OF(x) ((x)>>1) #elif defined(USE_SIMD) # define KISS_FFT_COS(phase) _mm_set1_ps( cos(phase) ) # define KISS_FFT_SIN(phase) _mm_set1_ps( sin(phase) ) # define HALF_OF(x) ((x)*_mm_set1_ps(.5)) #else # define KISS_FFT_COS(phase) (kiss_fft_scalar) cos(phase) # define KISS_FFT_SIN(phase) (kiss_fft_scalar) sin(phase) # define HALF_OF(x) ((x)*.5) #endif #define kf_cexp(x,phase) \ do{ \ (x)->r = KISS_FFT_COS(phase);\ (x)->i = KISS_FFT_SIN(phase);\ }while(0) #define kf_cexp2(x,phase) \ do{ \ (x)->r = spx_cos_norm((phase));\ (x)->i = spx_cos_norm((phase)-32768);\ }while(0) /* a debugging function */ #define pcpx(c)\ fprintf(stderr,"%g + %gi\n",(double)((c)->r),(double)((c)->i) ) mumble-1.3.4/3rdparty/speex-src/libspeex/testenc_uwb.c0000664000175000017500000000664614010707304022632 0ustar builderbuilder#ifdef HAVE_CONFIG_H #include "config.h" #endif #include "speex/speex_callbacks.h" #include #include #ifdef FIXED_DEBUG extern long long spx_mips; #endif #define FRAME_SIZE 640 #include int main(int argc, char **argv) { char *inFile, *outFile, *bitsFile; FILE *fin, *fout, *fbits=NULL; short in_short[FRAME_SIZE]; short out_short[FRAME_SIZE]; float in_float[FRAME_SIZE]; float sigpow,errpow,snr, seg_snr=0; int snr_frames = 0; char cbits[200]; int nbBits; int i; void *st; void *dec; SpeexBits bits; spx_int32_t tmp; int bitCount=0; spx_int32_t skip_group_delay; SpeexCallback callback; sigpow = 0; errpow = 0; st = speex_encoder_init(speex_lib_get_mode(SPEEX_MODEID_UWB)); dec = speex_decoder_init(speex_lib_get_mode(SPEEX_MODEID_UWB)); callback.callback_id = SPEEX_INBAND_CHAR; callback.func = speex_std_char_handler; callback.data = stderr; speex_decoder_ctl(dec, SPEEX_SET_HANDLER, &callback); callback.callback_id = SPEEX_INBAND_MODE_REQUEST; callback.func = speex_std_mode_request_handler; callback.data = st; speex_decoder_ctl(dec, SPEEX_SET_HANDLER, &callback); tmp=0; speex_decoder_ctl(dec, SPEEX_SET_ENH, &tmp); tmp=0; speex_encoder_ctl(st, SPEEX_SET_VBR, &tmp); tmp=7; speex_encoder_ctl(st, SPEEX_SET_QUALITY, &tmp); tmp=1; speex_encoder_ctl(st, SPEEX_SET_COMPLEXITY, &tmp); speex_encoder_ctl(st, SPEEX_GET_LOOKAHEAD, &skip_group_delay); speex_decoder_ctl(dec, SPEEX_GET_LOOKAHEAD, &tmp); skip_group_delay += tmp; if (argc != 4 && argc != 3) { fprintf (stderr, "Usage: encode [in file] [out file] [bits file]\nargc = %d", argc); exit(1); } inFile = argv[1]; fin = fopen(inFile, "rb"); outFile = argv[2]; fout = fopen(outFile, "wb+"); if (argc==4) { bitsFile = argv[3]; fbits = fopen(bitsFile, "wb"); } speex_bits_init(&bits); while (!feof(fin)) { fread(in_short, sizeof(short), FRAME_SIZE, fin); if (feof(fin)) break; for (i=0;i static inline void _spx_mm_getr_ps (__m128 U, float *__Z, float *__Y, float *__X, float *__W) { union { float __a[4]; __m128 __v; } __u; __u.__v = U; *__Z = __u.__a[0]; *__Y = __u.__a[1]; *__X = __u.__a[2]; *__W = __u.__a[3]; } #define OVERRIDE_COMPUTE_WEIGHTED_CODEBOOK static void compute_weighted_codebook(const signed char *shape_cb, const spx_sig_t *_r, float *resp, __m128 *resp2, __m128 *E, int shape_cb_size, int subvect_size, char *stack) { int i, j, k; __m128 resj, EE; VARDECL(__m128 *r); VARDECL(__m128 *shape); ALLOC(r, subvect_size, __m128); ALLOC(shape, subvect_size, __m128); for(j=0;j>2] = EE; } } mumble-1.3.4/3rdparty/speex-src/libspeex/cb_search.c0000664000175000017500000004342014010707304022210 0ustar builderbuilder/* Copyright (C) 2002-2006 Jean-Marc Valin File: cb_search.c Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "cb_search.h" #include "filters.h" #include "stack_alloc.h" #include "vq.h" #include "arch.h" #include "math_approx.h" #include "os_support.h" #ifdef _USE_SSE #include "cb_search_sse.h" #elif defined(ARM4_ASM) || defined(ARM5E_ASM) #include "cb_search_arm4.h" #elif defined(BFIN_ASM) #include "cb_search_bfin.h" #endif #ifndef DISABLE_ENCODER #ifndef OVERRIDE_COMPUTE_WEIGHTED_CODEBOOK static void compute_weighted_codebook(const signed char *shape_cb, const spx_word16_t *r, spx_word16_t *resp, spx_word16_t *resp2, spx_word32_t *E, int shape_cb_size, int subvect_size, char *stack) { int i, j, k; VARDECL(spx_word16_t *shape); ALLOC(shape, subvect_size, spx_word16_t); for (i=0;isubvect_size; nb_subvect = params->nb_subvect; shape_cb_size = 1<shape_bits; shape_cb = params->shape_cb; have_sign = params->have_sign; ALLOC(resp, shape_cb_size*subvect_size, spx_word16_t); #ifdef _USE_SSE ALLOC(resp2, (shape_cb_size*subvect_size)>>2, __m128); ALLOC(E, shape_cb_size>>2, __m128); #else resp2 = resp; ALLOC(E, shape_cb_size, spx_word32_t); #endif ALLOC(t, nsf, spx_word16_t); ALLOC(e, nsf, spx_sig_t); /* FIXME: Do we still need to copy the target? */ SPEEX_COPY(t, target, nsf); compute_weighted_codebook(shape_cb, r, resp, resp2, E, shape_cb_size, subvect_size, stack); for (i=0;ishape_bits+have_sign); { int rind; spx_word16_t *res; spx_word16_t sign=1; rind = best_index; if (rind>=shape_cb_size) { sign=-1; rind-=shape_cb_size; } res = resp+rind*subvect_size; if (sign>0) for (m=0;m=shape_cb_size) { sign=-1; rind-=shape_cb_size; } q=subvect_size-m; #ifdef FIXED_POINT g=sign*shape_cb[rind*subvect_size+m]; #else g=sign*0.03125*shape_cb[rind*subvect_size+m]; #endif target_update(t+subvect_size*(i+1), g, r+q, nsf-subvect_size*(i+1)); } } /* Update excitation */ /* FIXME: We could update the excitation directly above */ for (j=0;j10) N=10; /* Complexity isn't as important for the codebooks as it is for the pitch */ N=(2*N)/3; if (N<1) N=1; if (N==1) { split_cb_search_shape_sign_N1(target,ak,awk1,awk2,par,p,nsf,exc,r,bits,stack,update_target); return; } ALLOC(ot2, N, spx_word16_t*); ALLOC(nt2, N, spx_word16_t*); ALLOC(oind, N, int*); ALLOC(nind, N, int*); params = (const split_cb_params *) par; subvect_size = params->subvect_size; nb_subvect = params->nb_subvect; shape_cb_size = 1<shape_bits; shape_cb = params->shape_cb; have_sign = params->have_sign; ALLOC(resp, shape_cb_size*subvect_size, spx_word16_t); #ifdef _USE_SSE ALLOC(resp2, (shape_cb_size*subvect_size)>>2, __m128); ALLOC(E, shape_cb_size>>2, __m128); #else resp2 = resp; ALLOC(E, shape_cb_size, spx_word32_t); #endif ALLOC(t, nsf, spx_word16_t); ALLOC(e, nsf, spx_sig_t); ALLOC(ind, nb_subvect, int); ALLOC(tmp, 2*N*nsf, spx_word16_t); for (i=0;im;n--) { ndist[n] = ndist[n-1]; best_nind[n] = best_nind[n-1]; best_ntarget[n] = best_ntarget[n-1]; } /* n is equal to m here, so they're interchangeable */ ndist[m] = err; best_nind[n] = best_index[k]; best_ntarget[n] = j; break; } } } } if (i==0) break; } for (j=0;j=shape_cb_size) { sign=-1; rind-=shape_cb_size; } q=subvect_size-m; #ifdef FIXED_POINT g=sign*shape_cb[rind*subvect_size+m]; #else g=sign*0.03125*shape_cb[rind*subvect_size+m]; #endif target_update(nt[j]+subvect_size*(i+1), g, r+q, nsf-subvect_size*(i+1)); } for (q=0;qshape_bits+have_sign); } /* Put everything back together */ for (i=0;i=shape_cb_size) { sign=-1; rind-=shape_cb_size; } #ifdef FIXED_POINT if (sign==1) { for (j=0;jsubvect_size; nb_subvect = params->nb_subvect; shape_cb_size = 1<shape_bits; shape_cb = params->shape_cb; have_sign = params->have_sign; ALLOC(ind, nb_subvect, int); ALLOC(signs, nb_subvect, int); /* Decode codewords and gains */ for (i=0;ishape_bits); } /* Compute decoded excitation */ for (i=0;i1e-13?log((x)*(x))*4.34294480f:-30) #define fromdB(x) (exp((x)*.11512925f)) /* The bark scale equations are approximations, since the original table was somewhat hand rolled. The below are chosen to have the best possible fit to the rolled tables, thus their somewhat odd appearance (these are more accurate and over a longer range than the oft-quoted bark equations found in the texts I have). The approximations are valid from 0 - 30kHz (nyquist) or so. all f in Hz, z in Bark */ #define toBARK(n) (13.1f*atan(.00074f*(n))+2.24f*atan((n)*(n)*1.85e-8f)+1e-4f*(n)) #define fromBARK(z) (102.f*(z)-2.f*pow(z,2.f)+.4f*pow(z,3.f)+pow(1.46f,z)-1.f) /* Frequency to octave. We arbitrarily declare 63.5 Hz to be octave 0.0 */ #define toOC(n) (log(n)*1.442695f-5.965784f) #define fromOC(o) (exp(((o)+5.965784f)*.693147f)) typedef struct { float noisewindowlo; float noisewindowhi; int noisewindowlomin; int noisewindowhimin; int noisewindowfixed; float noiseoff[P_BANDS]; float noisecompand[NOISE_COMPAND_LEVELS]; } VorbisPsyInfo; typedef struct { int n; int rate; struct drft_lookup lookup; VorbisPsyInfo *vi; float *window; float *noiseoffset; long *bark; } VorbisPsy; VorbisPsy *vorbis_psy_init(int rate, int size); void vorbis_psy_destroy(VorbisPsy *psy); void compute_curve(VorbisPsy *psy, float *audio, float *curve); void curve_to_lpc(VorbisPsy *psy, float *curve, float *awk1, float *awk2, int ord); #endif #endif mumble-1.3.4/3rdparty/speex-src/libspeex/hexc_10_32_table.c0000664000175000017500000000556314010707304023207 0ustar builderbuilder/* Copyright (C) 2002 Jean-Marc Valin File: hexc_10_32_table.c Codebook for high-band excitation in SB-CELP mode (4000 bps) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ const signed char hexc_10_32_table[320] = { -3, -2, -1, 0, -4, 5, 35, -40, -9, 13, -44, 5, -27, -1, -7, 6, -11, 7, -8, 7, 19, -14, 15, -4, 9, -10, 10, -8, 10, -9, -1, 1, 0, 0, 2, 5, -18, 22, -53, 50, 1, -23, 50, -36, 15, 3, -13, 14, -10, 6, 1, 5, -3, 4, -2, 5, -32, 25, 5, -2, -1, -4, 1, 11, -29, 26, -6, -15, 30, -18, 0, 15, -17, 40, -41, 3, 9, -2, -2, 3, -3, -1, -5, 2, 21, -6, -16, -21, 23, 2, 60, 15, 16, -16, -9, 14, 9, -1, 7, -9, 0, 1, 1, 0, -1, -6, 17, -28, 54, -45, -1, 1, -1, -6, -6, 2, 11, 26, -29, -2, 46, -21, 34, 12, -23, 32, -23, 16, -10, 3, 66, 19, -20, 24, 7, 11, -3, 0, -3, -1, -50, -46, 2, -18, -3, 4, -1, -2, 3, -3, -19, 41, -36, 9, 11, -24, 21, -16, 9, -3, -25, -3, 10, 18, -9, -2, -5, -1, -5, 6, -4, -3, 2, -26, 21, -19, 35, -15, 7, -13, 17, -19, 39, -43, 48, -31, 16, -9, 7, -2, -5, 3, -4, 9, -19, 27, -55, 63, -35, 10, 26, -44, -2, 9, 4, 1, -6, 8, -9, 5, -8, -1, -3, -16, 45, -42, 5, 15, -16, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -16, 24, -55, 47, -38, 27, -19, 7, -3, 1, 16, 27, 20, -19, 18, 5, -7, 1, -5, 2, -6, 8, -22, 0, -3, -3, 8, -1, 7, -8, 1, -3, 5, 0, 17, -48, 58, -52, 29, -7, -2, 3, -10, 6, -26, 58, -31, 1, -6, 3, 93, -29, 39, 3, 17, 5, 6, -1, -1, -1, 27, 13, 10, 19, -7, -34, 12, 10, -4, 9, -76, 9, 8, -28, -2, -11, 2, -1, 3, 1, -83, 38, -39, 4, -16, -6, -2, -5, 5, -2, }; mumble-1.3.4/3rdparty/speex-src/libspeex/Makefile.am0000664000175000017500000000362014010707304022165 0ustar builderbuilder# Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies if BUILD_VORBIS_PSY VPSY_SOURCE=vorbis_psy.c if BUILD_KISS_FFT FFTSRC=kiss_fft.c _kiss_fft_guts.h kiss_fft.h kiss_fftr.c kiss_fftr.h else if BUILD_SMALLFT FFTSRC=smallft.c else FFTSRC= endif endif else VPSY_SOURCE= FFTSRC= endif AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include/speex -I$(top_builddir) @OGG_CFLAGS@ @FFT_CFLAGS@ lib_LTLIBRARIES = libspeex.la # Sources for compilation in the library libspeex_la_SOURCES = $(VPSY_SOURCE) $(FFTSRC) cb_search.c exc_10_32_table.c exc_8_128_table.c \ filters.c gain_table.c hexc_table.c high_lsp_tables.c lsp.c \ ltp.c speex.c stereo.c vbr.c vq.c bits.c exc_10_16_table.c \ exc_20_32_table.c exc_5_256_table.c exc_5_64_table.c gain_table_lbr.c hexc_10_32_table.c \ lpc.c lsp_tables_nb.c modes.c modes_wb.c nb_celp.c quant_lsp.c sb_celp.c \ speex_callbacks.c speex_header.c window.c noinst_HEADERS = arch.h bfin.h cb_search_arm4.h cb_search_bfin.h cb_search_sse.h \ filters.h filters_arm4.h filters_bfin.h filters_sse.h fixed_arm4.h \ fixed_arm5e.h fixed_bfin.h fixed_debug.h lpc.h lpc_bfin.h ltp.h ltp_arm4.h \ ltp_sse.h math_approx.h misc_bfin.h nb_celp.h quant_lsp.h sb_celp.h \ stack_alloc.h vbr.h vq.h vq_arm4.h vq_bfin.h vq_sse.h cb_search.h fftwrap.h \ fixed_generic.h lsp.h lsp_bfin.h ltp_bfin.h modes.h os_support.h \ quant_lsp_bfin.h smallft.h vorbis_psy.h libspeex_la_LDFLAGS = -no-undefined -version-info @SPEEX_LT_CURRENT@:@SPEEX_LT_REVISION@:@SPEEX_LT_AGE@ libspeex_la_LIBADD = $(LIBM) if BUILD_BINARIES noinst_PROGRAMS = testenc testenc_wb testenc_uwb testenc_SOURCES = testenc.c testenc_LDADD = libspeex.la $(LIBM) testenc_wb_SOURCES = testenc_wb.c testenc_wb_LDADD = libspeex.la $(LIBM) testenc_uwb_SOURCES = testenc_uwb.c testenc_uwb_LDADD = libspeex.la $(LIBM) endif mumble-1.3.4/3rdparty/speex-src/libspeex/filters.c0000664000175000017500000006036614010707304021757 0ustar builderbuilder/* Copyright (C) 2002-2006 Jean-Marc Valin File: filters.c Various analysis/synthesis filters Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "filters.h" #include "stack_alloc.h" #include "arch.h" #include "math_approx.h" #include "ltp.h" #include #ifdef _USE_SSE #include "filters_sse.h" #elif defined (ARM4_ASM) || defined(ARM5E_ASM) #include "filters_arm4.h" #elif defined (BFIN_ASM) #include "filters_bfin.h" #endif void bw_lpc(spx_word16_t gamma, const spx_coef_t *lpc_in, spx_coef_t *lpc_out, int order) { int i; spx_word16_t tmp=gamma; for (i=0;i=min_val && vec[i] <= max_val)) { if (vec[i] < min_val) vec[i] = min_val; else if (vec[i] > max_val) vec[i] = max_val; else /* Has to be NaN */ vec[i] = 0; } } } void highpass(const spx_word16_t *x, spx_word16_t *y, int len, int filtID, spx_mem_t *mem) { int i; #ifdef FIXED_POINT const spx_word16_t Pcoef[5][3] = {{16384, -31313, 14991}, {16384, -31569, 15249}, {16384, -31677, 15328}, {16384, -32313, 15947}, {16384, -22446, 6537}}; const spx_word16_t Zcoef[5][3] = {{15672, -31344, 15672}, {15802, -31601, 15802}, {15847, -31694, 15847}, {16162, -32322, 16162}, {14418, -28836, 14418}}; #else const spx_word16_t Pcoef[5][3] = {{1.00000f, -1.91120f, 0.91498f}, {1.00000f, -1.92683f, 0.93071f}, {1.00000f, -1.93338f, 0.93553f}, {1.00000f, -1.97226f, 0.97332f}, {1.00000f, -1.37000f, 0.39900f}}; const spx_word16_t Zcoef[5][3] = {{0.95654f, -1.91309f, 0.95654f}, {0.96446f, -1.92879f, 0.96446f}, {0.96723f, -1.93445f, 0.96723f}, {0.98645f, -1.97277f, 0.98645f}, {0.88000f, -1.76000f, 0.88000f}}; #endif const spx_word16_t *den, *num; if (filtID>4) filtID=4; den = Pcoef[filtID]; num = Zcoef[filtID]; /*return;*/ for (i=0;i SHL32(EXTEND32(SIG_SCALING), 8)) { spx_word16_t scale_1; scale = PSHR32(scale, SIG_SHIFT); scale_1 = EXTRACT16(PDIV32_16(SHL32(EXTEND32(SIG_SCALING),7),scale)); for (i=0;i SHR32(EXTEND32(SIG_SCALING), 2)) { spx_word16_t scale_1; scale = PSHR32(scale, SIG_SHIFT-5); scale_1 = DIV32_16(SHL32(EXTEND32(SIG_SCALING),3),scale); for (i=0;i max_val) max_val = tmp; } sig_shift=0; while (max_val>16383) { sig_shift++; max_val >>= 1; } for (i=0;i max_val) max_val = tmp; } if (max_val>16383) { spx_word32_t sum=0; for (i=0;i= max_val) max_val = tmp; } sig_shift=0; while (max_val>max_scale) { sig_shift++; max_val >>= 1; } for (i=0;i>1; for (i=0;i>1; N2 = N>>1; ALLOC(xx1, M2+N2, spx_word16_t); ALLOC(xx2, M2+N2, spx_word16_t); for (i = 0; i < N2; i++) xx1[i] = x1[N2-1-i]; for (i = 0; i < M2; i++) xx1[N2+i] = mem1[2*i+1]; for (i = 0; i < N2; i++) xx2[i] = x2[N2-1-i]; for (i = 0; i < M2; i++) xx2[N2+i] = mem2[2*i+1]; for (i = 0; i < N2; i += 2) { spx_sig_t y0, y1, y2, y3; spx_word16_t x10, x20; y0 = y1 = y2 = y3 = 0; x10 = xx1[N2-2-i]; x20 = xx2[N2-2-i]; for (j = 0; j < M2; j += 2) { spx_word16_t x11, x21; spx_word16_t a0, a1; a0 = a[2*j]; a1 = a[2*j+1]; x11 = xx1[N2-1+j-i]; x21 = xx2[N2-1+j-i]; #ifdef FIXED_POINT /* We multiply twice by the same coef to avoid overflows */ y0 = MAC16_16(MAC16_16(y0, a0, x11), NEG16(a0), x21); y1 = MAC16_16(MAC16_16(y1, a1, x11), a1, x21); y2 = MAC16_16(MAC16_16(y2, a0, x10), NEG16(a0), x20); y3 = MAC16_16(MAC16_16(y3, a1, x10), a1, x20); #else y0 = ADD32(y0,MULT16_16(a0, x11-x21)); y1 = ADD32(y1,MULT16_16(a1, x11+x21)); y2 = ADD32(y2,MULT16_16(a0, x10-x20)); y3 = ADD32(y3,MULT16_16(a1, x10+x20)); #endif a0 = a[2*j+2]; a1 = a[2*j+3]; x10 = xx1[N2+j-i]; x20 = xx2[N2+j-i]; #ifdef FIXED_POINT /* We multiply twice by the same coef to avoid overflows */ y0 = MAC16_16(MAC16_16(y0, a0, x10), NEG16(a0), x20); y1 = MAC16_16(MAC16_16(y1, a1, x10), a1, x20); y2 = MAC16_16(MAC16_16(y2, a0, x11), NEG16(a0), x21); y3 = MAC16_16(MAC16_16(y3, a1, x11), a1, x21); #else y0 = ADD32(y0,MULT16_16(a0, x10-x20)); y1 = ADD32(y1,MULT16_16(a1, x10+x20)); y2 = ADD32(y2,MULT16_16(a0, x11-x21)); y3 = ADD32(y3,MULT16_16(a1, x11+x21)); #endif } #ifdef FIXED_POINT y[2*i] = EXTRACT16(SATURATE32(PSHR32(y0,15),32767)); y[2*i+1] = EXTRACT16(SATURATE32(PSHR32(y1,15),32767)); y[2*i+2] = EXTRACT16(SATURATE32(PSHR32(y2,15),32767)); y[2*i+3] = EXTRACT16(SATURATE32(PSHR32(y3,15),32767)); #else /* Normalize up explicitly if we're in float */ y[2*i] = 2.f*y0; y[2*i+1] = 2.f*y1; y[2*i+2] = 2.f*y2; y[2*i+3] = 2.f*y3; #endif } for (i = 0; i < M2; i++) mem1[2*i+1] = xx1[i]; for (i = 0; i < M2; i++) mem2[2*i+1] = xx2[i]; } #endif /* DISABLE_WIDEBAND */ #ifndef DISABLE_DECODER #ifdef FIXED_POINT #if 0 const spx_word16_t shift_filt[3][7] = {{-33, 1043, -4551, 19959, 19959, -4551, 1043}, {-98, 1133, -4425, 29179, 8895, -2328, 444}, {444, -2328, 8895, 29179, -4425, 1133, -98}}; #else const spx_word16_t shift_filt[3][7] = {{-390, 1540, -4993, 20123, 20123, -4993, 1540}, {-1064, 2817, -6694, 31589, 6837, -990, -209}, {-209, -990, 6837, 31589, -6694, 2817, -1064}}; #endif #else #if 0 const float shift_filt[3][7] = {{-9.9369e-04, 3.1831e-02, -1.3889e-01, 6.0910e-01, 6.0910e-01, -1.3889e-01, 3.1831e-02}, {-0.0029937, 0.0345613, -0.1350474, 0.8904793, 0.2714479, -0.0710304, 0.0135403}, {0.0135403, -0.0710304, 0.2714479, 0.8904793, -0.1350474, 0.0345613, -0.0029937}}; #else const float shift_filt[3][7] = {{-0.011915f, 0.046995f, -0.152373f, 0.614108f, 0.614108f, -0.152373f, 0.046995f}, {-0.0324855f, 0.0859768f, -0.2042986f, 0.9640297f, 0.2086420f, -0.0302054f, -0.0063646f}, {-0.0063646f, -0.0302054f, 0.2086420f, 0.9640297f, -0.2042986f, 0.0859768f, -0.0324855f}}; #endif #endif static int interp_pitch( spx_word16_t *exc, /*decoded excitation*/ spx_word16_t *interp, /*decoded excitation*/ int pitch, /*pitch period*/ int len ) { int i,j,k; spx_word32_t corr[4][7]; spx_word32_t maxcorr; int maxi, maxj; for (i=0;i<7;i++) { corr[0][i] = inner_prod(exc, exc-pitch-3+i, len); } for (i=0;i<3;i++) { for (j=0;j<7;j++) { int i1, i2; spx_word32_t tmp=0; i1 = 3-j; if (i1<0) i1 = 0; i2 = 10-j; if (i2>7) i2 = 7; for (k=i1;k maxcorr) { maxcorr = corr[i][j]; maxi=i; maxj=j; } } } for (i=0;i0) { for (k=0;k<7;k++) { tmp += MULT16_16(exc[i-(pitch-maxj+3)+k-3],shift_filt[maxi-1][k]); } } else { tmp = SHL32(exc[i-(pitch-maxj+3)],15); } interp[i] = PSHR32(tmp,15); } return pitch-maxj+3; } void multicomb( spx_word16_t *exc, /*decoded excitation*/ spx_word16_t *new_exc, /*enhanced excitation*/ spx_coef_t *ak, /*LPC filter coefs*/ int p, /*LPC order*/ int nsf, /*sub-frame size*/ int pitch, /*pitch period*/ int max_pitch, spx_word16_t comb_gain, /*gain of comb filter*/ char *stack ) { int i; VARDECL(spx_word16_t *iexc); spx_word16_t old_ener, new_ener; int corr_pitch; spx_word16_t iexc0_mag, iexc1_mag, exc_mag; spx_word32_t corr0, corr1; spx_word16_t gain0, gain1; spx_word16_t pgain1, pgain2; spx_word16_t c1, c2; spx_word16_t g1, g2; spx_word16_t ngain; spx_word16_t gg1, gg2; #ifdef FIXED_POINT int scaledown=0; #endif #if 0 /* Set to 1 to enable full pitch search */ int nol_pitch[6]; spx_word16_t nol_pitch_coef[6]; spx_word16_t ol_pitch_coef; open_loop_nbest_pitch(exc, 20, 120, nsf, nol_pitch, nol_pitch_coef, 6, stack); corr_pitch=nol_pitch[0]; ol_pitch_coef = nol_pitch_coef[0]; /*Try to remove pitch multiples*/ for (i=1;i<6;i++) { #ifdef FIXED_POINT if ((nol_pitch_coef[i]>MULT16_16_Q15(nol_pitch_coef[0],19661)) && #else if ((nol_pitch_coef[i]>.6*nol_pitch_coef[0]) && #endif (ABS(2*nol_pitch[i]-corr_pitch)<=2 || ABS(3*nol_pitch[i]-corr_pitch)<=3 || ABS(4*nol_pitch[i]-corr_pitch)<=4 || ABS(5*nol_pitch[i]-corr_pitch)<=5)) { corr_pitch = nol_pitch[i]; } } #else corr_pitch = pitch; #endif ALLOC(iexc, 2*nsf, spx_word16_t); interp_pitch(exc, iexc, corr_pitch, 80); if (corr_pitch>max_pitch) interp_pitch(exc, iexc+nsf, 2*corr_pitch, 80); else interp_pitch(exc, iexc+nsf, -corr_pitch, 80); #ifdef FIXED_POINT for (i=0;i16383) { scaledown = 1; break; } } if (scaledown) { for (i=0;i MULT16_16(iexc0_mag,exc_mag)) pgain1 = QCONST16(1., 14); else pgain1 = PDIV32_16(SHL32(PDIV32(corr0, exc_mag),14),iexc0_mag); if (corr1 > MULT16_16(iexc1_mag,exc_mag)) pgain2 = QCONST16(1., 14); else pgain2 = PDIV32_16(SHL32(PDIV32(corr1, exc_mag),14),iexc1_mag); gg1 = PDIV32_16(SHL32(EXTEND32(exc_mag),8), iexc0_mag); gg2 = PDIV32_16(SHL32(EXTEND32(exc_mag),8), iexc1_mag); if (comb_gain>0) { #ifdef FIXED_POINT c1 = (MULT16_16_Q15(QCONST16(.4,15),comb_gain)+QCONST16(.07,15)); c2 = QCONST16(.5,15)+MULT16_16_Q14(QCONST16(1.72,14),(c1-QCONST16(.07,15))); #else c1 = .4*comb_gain+.07; c2 = .5+1.72*(c1-.07); #endif } else { c1=c2=0; } #ifdef FIXED_POINT g1 = 32767 - MULT16_16_Q13(MULT16_16_Q15(c2, pgain1),pgain1); g2 = 32767 - MULT16_16_Q13(MULT16_16_Q15(c2, pgain2),pgain2); #else g1 = 1-c2*pgain1*pgain1; g2 = 1-c2*pgain2*pgain2; #endif if (g1max_pitch) { gain0 = MULT16_16_Q15(QCONST16(.7,15),MULT16_16_Q14(g1,gg1)); gain1 = MULT16_16_Q15(QCONST16(.3,15),MULT16_16_Q14(g2,gg2)); } else { gain0 = MULT16_16_Q15(QCONST16(.6,15),MULT16_16_Q14(g1,gg1)); gain1 = MULT16_16_Q15(QCONST16(.6,15),MULT16_16_Q14(g2,gg2)); } for (i=0;i new_ener) old_ener = new_ener; ngain = PDIV32_16(SHL32(EXTEND32(old_ener),14),new_ener); for (i=0;imax_scale) { sig_shift++; max_val >>= 1; } __asm__ __volatile__ ( ".normalize16loop%=: \n" "\tldr %4, [%0], #4 \n" "\tldr %5, [%0], #4 \n" "\tmov %4, %4, asr %3 \n" "\tstrh %4, [%1], #2 \n" "\tldr %4, [%0], #4 \n" "\tmov %5, %5, asr %3 \n" "\tstrh %5, [%1], #2 \n" "\tldr %5, [%0], #4 \n" "\tmov %4, %4, asr %3 \n" "\tstrh %4, [%1], #2 \n" "\tsubs %2, %2, #1 \n" "\tmov %5, %5, asr %3 \n" "\tstrh %5, [%1], #2 \n" "\tbgt .normalize16loop%=\n" : "=r" (dead1), "=r" (dead2), "=r" (dead3), "=r" (dead4), "=r" (dead5), "=r" (dead6) : "0" (x), "1" (y), "2" (len>>2), "3" (sig_shift) : "cc", "memory"); return sig_shift; } mumble-1.3.4/3rdparty/speex-src/libspeex/speex_callbacks.c0000664000175000017500000001040314010707304023415 0ustar builderbuilder/* Copyright (C) 2002 Jean-Marc Valin File speex_callbacks.c Callback handling and in-band signalling Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "speex/speex_callbacks.h" #include "arch.h" #include "os_support.h" EXPORT int speex_inband_handler(SpeexBits *bits, SpeexCallback *callback_list, void *state) { int id; SpeexCallback *callback; /*speex_bits_advance(bits, 5);*/ id=speex_bits_unpack_unsigned(bits, 4); callback = callback_list+id; if (callback->func) { return callback->func(bits, state, callback->data); } else /*If callback is not registered, skip the right number of bits*/ { int adv; if (id<2) adv = 1; else if (id<8) adv = 4; else if (id<10) adv = 8; else if (id<12) adv = 16; else if (id<14) adv = 32; else adv = 64; speex_bits_advance(bits, adv); } return 0; } EXPORT int speex_std_mode_request_handler(SpeexBits *bits, void *state, void *data) { spx_int32_t m; m = speex_bits_unpack_unsigned(bits, 4); speex_encoder_ctl(data, SPEEX_SET_MODE, &m); return 0; } EXPORT int speex_std_low_mode_request_handler(SpeexBits *bits, void *state, void *data) { spx_int32_t m; m = speex_bits_unpack_unsigned(bits, 4); speex_encoder_ctl(data, SPEEX_SET_LOW_MODE, &m); return 0; } EXPORT int speex_std_high_mode_request_handler(SpeexBits *bits, void *state, void *data) { spx_int32_t m; m = speex_bits_unpack_unsigned(bits, 4); speex_encoder_ctl(data, SPEEX_SET_HIGH_MODE, &m); return 0; } #ifndef DISABLE_VBR EXPORT int speex_std_vbr_request_handler(SpeexBits *bits, void *state, void *data) { spx_int32_t vbr; vbr = speex_bits_unpack_unsigned(bits, 1); speex_encoder_ctl(data, SPEEX_SET_VBR, &vbr); return 0; } #endif /* #ifndef DISABLE_VBR */ EXPORT int speex_std_enh_request_handler(SpeexBits *bits, void *state, void *data) { spx_int32_t enh; enh = speex_bits_unpack_unsigned(bits, 1); speex_decoder_ctl(data, SPEEX_SET_ENH, &enh); return 0; } #ifndef DISABLE_VBR EXPORT int speex_std_vbr_quality_request_handler(SpeexBits *bits, void *state, void *data) { float qual; qual = speex_bits_unpack_unsigned(bits, 4); speex_encoder_ctl(data, SPEEX_SET_VBR_QUALITY, &qual); return 0; } #endif /* #ifndef DISABLE_VBR */ EXPORT int speex_std_char_handler(SpeexBits *bits, void *state, void *data) { unsigned char ch; ch = speex_bits_unpack_unsigned(bits, 8); _speex_putc(ch, data); /*printf("speex_std_char_handler ch=%x\n", ch);*/ return 0; } /* Default handler for user callbacks: skip it */ EXPORT int speex_default_user_handler(SpeexBits *bits, void *state, void *data) { int req_size = speex_bits_unpack_unsigned(bits, 4); speex_bits_advance(bits, 5+8*req_size); return 0; } mumble-1.3.4/3rdparty/speex-src/libspeex/smallft.c0000664000175000017500000005336314010707304021750 0ustar builderbuilder/******************************************************************** * * * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2001 * * by the XIPHOPHORUS Company http://www.xiph.org/ * * * ******************************************************************** function: *unnormalized* fft transform last mod: $Id: smallft.c,v 1.19 2003/10/08 05:12:37 jm Exp $ ********************************************************************/ /* FFT implementation from OggSquish, minus cosine transforms, * minus all but radix 2/4 case. In Vorbis we only need this * cut-down version. * * To do more than just power-of-two sized vectors, see the full * version I wrote for NetLib. * * Note that the packing is a little strange; rather than the FFT r/i * packing following R_0, I_n, R_1, I_1, R_2, I_2 ... R_n-1, I_n-1, * it follows R_0, R_1, I_1, R_2, I_2 ... R_n-1, I_n-1, I_n like the * FORTRAN version */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "smallft.h" #include "arch.h" #include "os_support.h" static void drfti1(int n, float *wa, int *ifac){ static int ntryh[4] = { 4,2,3,5 }; static float tpi = 6.28318530717958648f; float arg,argh,argld,fi; int ntry=0,i,j=-1; int k1, l1, l2, ib; int ld, ii, ip, is, nq, nr; int ido, ipm, nfm1; int nl=n; int nf=0; L101: j++; if (j < 4) ntry=ntryh[j]; else ntry+=2; L104: nq=nl/ntry; nr=nl-ntry*nq; if (nr!=0) goto L101; nf++; ifac[nf+1]=ntry; nl=nq; if(ntry!=2)goto L107; if(nf==1)goto L107; for (i=1;i>1; ipp2=ip; idp2=ido; nbd=(ido-1)>>1; t0=l1*ido; t10=ip*ido; if(ido==1)goto L119; for(ik=0;ikl1){ for(j=1;j>1; ipp2=ip; ipph=(ip+1)>>1; if(idol1)goto L139; is= -ido-1; t1=0; for(j=1;jn==1)return; drftf1(l->n,data,l->trigcache,l->trigcache+l->n,l->splitcache); } void spx_drft_backward(struct drft_lookup *l,float *data){ if (l->n==1)return; drftb1(l->n,data,l->trigcache,l->trigcache+l->n,l->splitcache); } void spx_drft_init(struct drft_lookup *l,int n) { l->n=n; l->trigcache=(float*)speex_alloc(3*n*sizeof(*l->trigcache)); l->splitcache=(int*)speex_alloc(32*sizeof(*l->splitcache)); fdrffti(n, l->trigcache, l->splitcache); } void spx_drft_clear(struct drft_lookup *l) { if(l) { if(l->trigcache) speex_free(l->trigcache); if(l->splitcache) speex_free(l->splitcache); } } mumble-1.3.4/3rdparty/speex-src/libspeex/testenc.c0000664000175000017500000000736414010707304021753 0ustar builderbuilder#ifdef HAVE_CONFIG_H #include "config.h" #endif #include "speex/speex_callbacks.h" #include #include #ifdef FIXED_DEBUG extern long long spx_mips; #endif #define FRAME_SIZE 160 #include int main(int argc, char **argv) { char *inFile, *outFile, *bitsFile; FILE *fin, *fout, *fbits=NULL; short in_short[FRAME_SIZE]; short out_short[FRAME_SIZE]; int snr_frames = 0; char cbits[200]; int nbBits; int i; void *st; void *dec; SpeexBits bits; spx_int32_t tmp; int bitCount=0; spx_int32_t skip_group_delay; SpeexCallback callback; st = speex_encoder_init(speex_lib_get_mode(SPEEX_MODEID_NB)); dec = speex_decoder_init(speex_lib_get_mode(SPEEX_MODEID_NB)); /* BEGIN: You probably don't need the following in a real application */ callback.callback_id = SPEEX_INBAND_CHAR; callback.func = speex_std_char_handler; callback.data = stderr; speex_decoder_ctl(dec, SPEEX_SET_HANDLER, &callback); callback.callback_id = SPEEX_INBAND_MODE_REQUEST; callback.func = speex_std_mode_request_handler; callback.data = st; speex_decoder_ctl(dec, SPEEX_SET_HANDLER, &callback); /* END of unnecessary stuff */ tmp=1; speex_decoder_ctl(dec, SPEEX_SET_ENH, &tmp); tmp=0; speex_encoder_ctl(st, SPEEX_SET_VBR, &tmp); tmp=8; speex_encoder_ctl(st, SPEEX_SET_QUALITY, &tmp); tmp=1; speex_encoder_ctl(st, SPEEX_SET_COMPLEXITY, &tmp); /* Turn this off if you want to measure SNR (on by default) */ tmp=1; speex_encoder_ctl(st, SPEEX_SET_HIGHPASS, &tmp); speex_decoder_ctl(dec, SPEEX_SET_HIGHPASS, &tmp); speex_encoder_ctl(st, SPEEX_GET_LOOKAHEAD, &skip_group_delay); speex_decoder_ctl(dec, SPEEX_GET_LOOKAHEAD, &tmp); skip_group_delay += tmp; if (argc != 4 && argc != 3) { fprintf (stderr, "Usage: encode [in file] [out file] [bits file]\nargc = %d", argc); exit(1); } inFile = argv[1]; fin = fopen(inFile, "rb"); outFile = argv[2]; fout = fopen(outFile, "wb+"); if (argc==4) { bitsFile = argv[3]; fbits = fopen(bitsFile, "wb"); } speex_bits_init(&bits); while (!feof(fin)) { fread(in_short, sizeof(short), FRAME_SIZE, fin); if (feof(fin)) break; speex_bits_reset(&bits); speex_encode_int(st, in_short, &bits); nbBits = speex_bits_write(&bits, cbits, 200); bitCount+=bits.nbBits; if (argc==4) fwrite(cbits, 1, nbBits, fbits); speex_bits_rewind(&bits); speex_decode_int(dec, &bits, out_short); speex_bits_reset(&bits); fwrite(&out_short[skip_group_delay], sizeof(short), FRAME_SIZE-skip_group_delay, fout); skip_group_delay = 0; } fprintf (stderr, "Total encoded size: %d bits\n", bitCount); speex_encoder_destroy(st); speex_decoder_destroy(dec); speex_bits_destroy(&bits); #ifndef DISABLE_FLOAT_API { float sigpow,errpow,snr, seg_snr=0; sigpow = 0; errpow = 0; /* This code just computes SNR, so you don't need it either */ rewind(fin); rewind(fout); while ( FRAME_SIZE == fread(in_short, sizeof(short), FRAME_SIZE, fin) && FRAME_SIZE == fread(out_short, sizeof(short), FRAME_SIZE,fout) ) { float s=0, e=0; for (i=0;i>24; ret |= (ui>>8)&0x0000ff00; ret |= (ui<<8)&0x00ff0000; ret |= (ui<<24); return ret; #else return i; #endif } #define ENDIAN_SWITCH(x) {x=le_int(x);} /* typedef struct SpeexHeader { char speex_string[8]; char speex_version[SPEEX_HEADER_VERSION_LENGTH]; int speex_version_id; int header_size; int rate; int mode; int mode_bitstream_version; int nb_channels; int bitrate; int frame_size; int vbr; int frames_per_packet; int extra_headers; int reserved1; int reserved2; } SpeexHeader; */ EXPORT void speex_init_header(SpeexHeader *header, int rate, int nb_channels, const SpeexMode *m) { int i; const char *h="Speex "; /* strncpy(header->speex_string, "Speex ", 8); strncpy(header->speex_version, SPEEX_VERSION, SPEEX_HEADER_VERSION_LENGTH-1); header->speex_version[SPEEX_HEADER_VERSION_LENGTH-1]=0; */ for (i=0;i<8;i++) header->speex_string[i]=h[i]; for (i=0;ispeex_version[i]=SPEEX_VERSION[i]; for (;ispeex_version[i]=0; header->speex_version_id = 1; header->header_size = sizeof(SpeexHeader); header->rate = rate; header->mode = m->modeID; header->mode_bitstream_version = m->bitstream_version; if (m->modeID<0) speex_warning("This mode is meant to be used alone"); header->nb_channels = nb_channels; header->bitrate = -1; speex_mode_query(m, SPEEX_MODE_FRAME_SIZE, &header->frame_size); header->vbr = 0; header->frames_per_packet = 0; header->extra_headers = 0; header->reserved1 = 0; header->reserved2 = 0; } EXPORT char *speex_header_to_packet(SpeexHeader *header, int *size) { SpeexHeader *le_header; le_header = (SpeexHeader*)speex_alloc(sizeof(SpeexHeader)); SPEEX_COPY(le_header, header, 1); /*Make sure everything is now little-endian*/ ENDIAN_SWITCH(le_header->speex_version_id); ENDIAN_SWITCH(le_header->header_size); ENDIAN_SWITCH(le_header->rate); ENDIAN_SWITCH(le_header->mode); ENDIAN_SWITCH(le_header->mode_bitstream_version); ENDIAN_SWITCH(le_header->nb_channels); ENDIAN_SWITCH(le_header->bitrate); ENDIAN_SWITCH(le_header->frame_size); ENDIAN_SWITCH(le_header->vbr); ENDIAN_SWITCH(le_header->frames_per_packet); ENDIAN_SWITCH(le_header->extra_headers); *size = sizeof(SpeexHeader); return (char *)le_header; } EXPORT SpeexHeader *speex_packet_to_header(char *packet, int size) { int i; SpeexHeader *le_header; const char *h = "Speex "; /*FIXME: Do we allow larger headers?*/ if (size < (int)sizeof(SpeexHeader)) { speex_notify("Speex header too small"); return NULL; } for (i=0;i<8;i++) if (packet[i]!=h[i]) { /* This doesn't look like a Speex file */ return NULL; } le_header = (SpeexHeader*)speex_alloc(sizeof(SpeexHeader)); SPEEX_COPY(le_header, (SpeexHeader*)packet, 1); /*Make sure everything is converted correctly from little-endian*/ ENDIAN_SWITCH(le_header->speex_version_id); ENDIAN_SWITCH(le_header->header_size); ENDIAN_SWITCH(le_header->rate); ENDIAN_SWITCH(le_header->mode); ENDIAN_SWITCH(le_header->mode_bitstream_version); ENDIAN_SWITCH(le_header->nb_channels); ENDIAN_SWITCH(le_header->bitrate); ENDIAN_SWITCH(le_header->frame_size); ENDIAN_SWITCH(le_header->vbr); ENDIAN_SWITCH(le_header->frames_per_packet); ENDIAN_SWITCH(le_header->extra_headers); if (le_header->mode >= SPEEX_NB_MODES || le_header->mode < 0) { speex_notify("Invalid mode specified in Speex header"); speex_free (le_header); return NULL; } if (le_header->nb_channels>2) le_header->nb_channels = 2; if (le_header->nb_channels<1) le_header->nb_channels = 1; return le_header; } EXPORT void speex_header_free(void *ptr) { speex_free(ptr); } mumble-1.3.4/3rdparty/speex-src/libspeex/lsp.h0000664000175000017500000000506414010707304021104 0ustar builderbuilder/*---------------------------------------------------------------------------*\ Original Copyright FILE........: AK2LSPD.H TYPE........: Turbo C header file COMPANY.....: Voicetronix AUTHOR......: James Whitehall DATE CREATED: 21/11/95 Modified by Jean-Marc Valin This file contains functions for converting Linear Prediction Coefficients (LPC) to Line Spectral Pair (LSP) and back. Note that the LSP coefficients are not in radians format but in the x domain of the unit circle. \*---------------------------------------------------------------------------*/ /** @file lsp.h @brief Line Spectral Pair (LSP) functions. */ /* Speex License: Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef __AK2LSPD__ #define __AK2LSPD__ #include "arch.h" int lpc_to_lsp (spx_coef_t *a, int lpcrdr, spx_lsp_t *freq, int nb, spx_word16_t delta, char *stack); void lsp_to_lpc(const spx_lsp_t *freq, spx_coef_t *ak, int lpcrdr, char *stack); /*Added by JMV*/ void lsp_interpolate(spx_lsp_t *old_lsp, spx_lsp_t *new_lsp, spx_lsp_t *interp_lsp, int len, int subframe, int nb_subframes, spx_word16_t margin); #endif /* __AK2LSPD__ */ mumble-1.3.4/3rdparty/speex-src/libspeex/ltp_arm4.h0000664000175000017500000001465414010707304022035 0ustar builderbuilder/* Copyright (C) 2004 Jean-Marc Valin */ /** @file ltp_arm4.h @brief Long-Term Prediction functions (ARM4 version) */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #define OVERRIDE_INNER_PROD spx_word32_t inner_prod(const spx_word16_t *x, const spx_word16_t *y, int len) { spx_word32_t sum1=0,sum2=0; spx_word16_t *deadx, *deady; int deadlen, dead1, dead2, dead3, dead4, dead5, dead6; __asm__ __volatile__ ( "\tldrsh %5, [%0], #2 \n" "\tldrsh %6, [%1], #2 \n" ".inner_prod_loop%=:\n" "\tsub %7, %7, %7\n" "\tsub %10, %10, %10\n" "\tldrsh %8, [%0], #2 \n" "\tldrsh %9, [%1], #2 \n" "\tmla %7, %5, %6, %7\n" "\tldrsh %5, [%0], #2 \n" "\tldrsh %6, [%1], #2 \n" "\tmla %10, %8, %9, %10\n" "\tldrsh %8, [%0], #2 \n" "\tldrsh %9, [%1], #2 \n" "\tmla %7, %5, %6, %7\n" "\tldrsh %5, [%0], #2 \n" "\tldrsh %6, [%1], #2 \n" "\tmla %10, %8, %9, %10\n" "\tldrsh %8, [%0], #2 \n" "\tldrsh %9, [%1], #2 \n" "\tmla %7, %5, %6, %7\n" "\tldrsh %5, [%0], #2 \n" "\tldrsh %6, [%1], #2 \n" "\tmla %10, %8, %9, %10\n" "\tldrsh %8, [%0], #2 \n" "\tldrsh %9, [%1], #2 \n" "\tmla %7, %5, %6, %7\n" "\tldrsh %5, [%0], #2 \n" "\tldrsh %6, [%1], #2 \n" "\tmla %10, %8, %9, %10\n" "\tsubs %4, %4, #1\n" "\tadd %2, %2, %7, asr #5\n" "\tadd %3, %3, %10, asr #5\n" "\tbne .inner_prod_loop%=\n" : "=r" (deadx), "=r" (deady), "+r" (sum1), "+r" (sum2), "=r" (deadlen), "=r" (dead1), "=r" (dead2), "=r" (dead3), "=r" (dead4), "=r" (dead5), "=r" (dead6) : "0" (x), "1" (y), "4" (len>>3) : "cc" ); return (sum1+sum2)>>1; } #define OVERRIDE_PITCH_XCORR void pitch_xcorr(const spx_word16_t *_x, const spx_word16_t *_y, spx_word32_t *corr, int len, int nb_pitch, char *stack) { int i,j; for (i=0;i #include "os_support.h" #ifndef NULL #define NULL 0 #endif #if defined(DISABLE_ENCODER) || defined(DISABLE_WIDEBAND) #define split_cb_search_shape_sign NULL #define noise_codebook_quant NULL #define pitch_search_3tap NULL #define forced_pitch_quant NULL #define sb_encoder_init NULL #define sb_encoder_destroy NULL #define sb_encode NULL #define sb_encoder_ctl NULL #define lsp_quant_high NULL #endif /* DISABLE_ENCODER */ #if defined(DISABLE_DECODER) || defined(DISABLE_WIDEBAND) #define noise_codebook_unquant NULL #define split_cb_shape_sign_unquant NULL #define lsp_unquant_high NULL #define sb_decoder_init NULL #define sb_decoder_destroy NULL #define sb_decode NULL #define sb_decoder_ctl NULL #endif /* DISABLE_DECODER */ EXPORT const SpeexMode * const speex_mode_list[SPEEX_NB_MODES] = {&speex_nb_mode, &speex_wb_mode, &speex_uwb_mode}; extern const signed char hexc_table[]; extern const signed char hexc_10_32_table[]; #ifndef DISABLE_WIDEBAND /* Split-VQ innovation for high-band wideband */ static const split_cb_params split_cb_high = { 8, /*subvect_size*/ 5, /*nb_subvect*/ hexc_table, /*shape_cb*/ 7, /*shape_bits*/ 1, }; /* Split-VQ innovation for high-band wideband */ static const split_cb_params split_cb_high_lbr = { 10, /*subvect_size*/ 4, /*nb_subvect*/ hexc_10_32_table, /*shape_cb*/ 5, /*shape_bits*/ 0, }; #endif static const SpeexSubmode wb_submode1 = { 0, 0, 1, 0, /*LSP quantization*/ lsp_quant_high, lsp_unquant_high, /*Pitch quantization*/ NULL, NULL, NULL, /*No innovation quantization*/ NULL, NULL, NULL, -1, 36 }; static const SpeexSubmode wb_submode2 = { 0, 0, 1, 0, /*LSP quantization*/ lsp_quant_high, lsp_unquant_high, /*Pitch quantization*/ NULL, NULL, NULL, /*Innovation quantization*/ split_cb_search_shape_sign, split_cb_shape_sign_unquant, #ifdef DISABLE_WIDEBAND NULL, #else &split_cb_high_lbr, #endif -1, 112 }; static const SpeexSubmode wb_submode3 = { 0, 0, 1, 0, /*LSP quantization*/ lsp_quant_high, lsp_unquant_high, /*Pitch quantization*/ NULL, NULL, NULL, /*Innovation quantization*/ split_cb_search_shape_sign, split_cb_shape_sign_unquant, #ifdef DISABLE_WIDEBAND NULL, #else &split_cb_high, #endif -1, 192 }; static const SpeexSubmode wb_submode4 = { 0, 0, 1, 1, /*LSP quantization*/ lsp_quant_high, lsp_unquant_high, /*Pitch quantization*/ NULL, NULL, NULL, /*Innovation quantization*/ split_cb_search_shape_sign, split_cb_shape_sign_unquant, #ifdef DISABLE_WIDEBAND NULL, #else &split_cb_high, #endif -1, 352 }; /* Split-band wideband CELP mode*/ static const SpeexSBMode sb_wb_mode = { &speex_nb_mode, 160, /*frameSize*/ 40, /*subframeSize*/ 8, /*lpcSize*/ #ifdef FIXED_POINT 29491, 19661, /* gamma1, gamma2 */ #else 0.9, 0.6, /* gamma1, gamma2 */ #endif QCONST16(.0002,15), /*lpc_floor*/ QCONST16(0.9f,15), {NULL, &wb_submode1, &wb_submode2, &wb_submode3, &wb_submode4, NULL, NULL, NULL}, 3, {1, 8, 2, 3, 4, 5, 5, 6, 6, 7, 7}, {1, 1, 1, 1, 1, 1, 2, 2, 3, 3, 4}, #ifndef DISABLE_VBR vbr_hb_thresh, #endif 5 }; EXPORT const SpeexMode speex_wb_mode = { &sb_wb_mode, wb_mode_query, "wideband (sub-band CELP)", 1, 4, sb_encoder_init, sb_encoder_destroy, sb_encode, sb_decoder_init, sb_decoder_destroy, sb_decode, sb_encoder_ctl, sb_decoder_ctl, }; /* "Ultra-wideband" mode stuff */ /* Split-band "ultra-wideband" (32 kbps) CELP mode*/ static const SpeexSBMode sb_uwb_mode = { &speex_wb_mode, 320, /*frameSize*/ 80, /*subframeSize*/ 8, /*lpcSize*/ #ifdef FIXED_POINT 29491, 19661, /* gamma1, gamma2 */ #else 0.9, 0.6, /* gamma1, gamma2 */ #endif QCONST16(.0002,15), /*lpc_floor*/ QCONST16(0.7f,15), {NULL, &wb_submode1, NULL, NULL, NULL, NULL, NULL, NULL}, 1, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, #ifndef DISABLE_VBR vbr_uhb_thresh, #endif 2 }; int wb_mode_query(const void *mode, int request, void *ptr) { const SpeexSBMode *m = (const SpeexSBMode*)mode; switch (request) { case SPEEX_MODE_FRAME_SIZE: *((int*)ptr)=2*m->frameSize; break; case SPEEX_SUBMODE_BITS_PER_FRAME: if (*((int*)ptr)==0) *((int*)ptr) = SB_SUBMODE_BITS+1; else if (m->submodes[*((int*)ptr)]==NULL) *((int*)ptr) = -1; else *((int*)ptr) = m->submodes[*((int*)ptr)]->bits_per_frame; break; default: speex_warning_int("Unknown wb_mode_query request: ", request); return -1; } return 0; } EXPORT const SpeexMode speex_uwb_mode = { &sb_uwb_mode, wb_mode_query, "ultra-wideband (sub-band CELP)", 2, 4, sb_encoder_init, sb_encoder_destroy, sb_encode, sb_decoder_init, sb_decoder_destroy, sb_decode, sb_encoder_ctl, sb_decoder_ctl, }; /* We have defined speex_lib_get_mode() as a macro in speex.h */ #undef speex_lib_get_mode EXPORT const SpeexMode * speex_lib_get_mode (int mode) { if (mode < 0 || mode >= SPEEX_NB_MODES) return NULL; return speex_mode_list[mode]; } mumble-1.3.4/3rdparty/speex-src/libspeex/bits.c0000664000175000017500000002367314010707304021250 0ustar builderbuilder/* Copyright (C) 2002 Jean-Marc Valin File: speex_bits.c Handles bit packing/unpacking Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "speex/speex_bits.h" #include "arch.h" #include "os_support.h" /* Maximum size of the bit-stream (for fixed-size allocation) */ #ifndef MAX_CHARS_PER_FRAME #define MAX_CHARS_PER_FRAME (2000/BYTES_PER_CHAR) #endif EXPORT void speex_bits_init(SpeexBits *bits) { bits->chars = (char*)speex_alloc(MAX_CHARS_PER_FRAME); if (!bits->chars) return; bits->buf_size = MAX_CHARS_PER_FRAME; bits->owner=1; speex_bits_reset(bits); } EXPORT void speex_bits_init_buffer(SpeexBits *bits, void *buff, int buf_size) { bits->chars = (char*)buff; bits->buf_size = buf_size; bits->owner=0; speex_bits_reset(bits); } EXPORT void speex_bits_set_bit_buffer(SpeexBits *bits, void *buff, int buf_size) { bits->chars = (char*)buff; bits->buf_size = buf_size; bits->owner=0; bits->nbBits=buf_size<charPtr=0; bits->bitPtr=0; bits->overflow=0; } EXPORT void speex_bits_destroy(SpeexBits *bits) { if (bits->owner) speex_free(bits->chars); /* Will do something once the allocation is dynamic */ } EXPORT void speex_bits_reset(SpeexBits *bits) { /* We only need to clear the first byte now */ bits->chars[0]=0; bits->nbBits=0; bits->charPtr=0; bits->bitPtr=0; bits->overflow=0; } EXPORT void speex_bits_rewind(SpeexBits *bits) { bits->charPtr=0; bits->bitPtr=0; bits->overflow=0; } EXPORT void speex_bits_read_from(SpeexBits *bits, const char *chars, int len) { int i; int nchars = len / BYTES_PER_CHAR; if (nchars > bits->buf_size) { speex_notify("Packet is larger than allocated buffer"); if (bits->owner) { char *tmp = (char*)speex_realloc(bits->chars, nchars); if (tmp) { bits->buf_size=nchars; bits->chars=tmp; } else { nchars=bits->buf_size; speex_warning("Could not resize input buffer: truncating input"); } } else { speex_warning("Do not own input buffer: truncating oversize input"); nchars=bits->buf_size; } } #if (BYTES_PER_CHAR==2) /* Swap bytes to proper endian order (could be done externally) */ #define HTOLS(A) ((((A) >> 8)&0xff)|(((A) & 0xff)<<8)) #else #define HTOLS(A) (A) #endif for (i=0;ichars[i]=HTOLS(chars[i]); bits->nbBits=nchars<charPtr=0; bits->bitPtr=0; bits->overflow=0; } static void speex_bits_flush(SpeexBits *bits) { int nchars = ((bits->nbBits+BITS_PER_CHAR-1)>>LOG2_BITS_PER_CHAR); if (bits->charPtr>0) SPEEX_MOVE(bits->chars, &bits->chars[bits->charPtr], nchars-bits->charPtr); bits->nbBits -= bits->charPtr<charPtr=0; } EXPORT void speex_bits_read_whole_bytes(SpeexBits *bits, const char *chars, int nbytes) { int i,pos; int nchars = nbytes/BYTES_PER_CHAR; if (((bits->nbBits+BITS_PER_CHAR-1)>>LOG2_BITS_PER_CHAR)+nchars > bits->buf_size) { /* Packet is larger than allocated buffer */ if (bits->owner) { char *tmp = (char*)speex_realloc(bits->chars, (bits->nbBits>>LOG2_BITS_PER_CHAR)+nchars+1); if (tmp) { bits->buf_size=(bits->nbBits>>LOG2_BITS_PER_CHAR)+nchars+1; bits->chars=tmp; } else { nchars=bits->buf_size-(bits->nbBits>>LOG2_BITS_PER_CHAR)-1; speex_warning("Could not resize input buffer: truncating oversize input"); } } else { speex_warning("Do not own input buffer: truncating oversize input"); nchars=bits->buf_size; } } speex_bits_flush(bits); pos=bits->nbBits>>LOG2_BITS_PER_CHAR; for (i=0;ichars[pos+i]=HTOLS(chars[i]); bits->nbBits+=nchars<bitPtr; charPtr=bits->charPtr; nbBits=bits->nbBits; speex_bits_insert_terminator(bits); bits->bitPtr=bitPtr; bits->charPtr=charPtr; bits->nbBits=nbBits; if (max_nchars > ((bits->nbBits+BITS_PER_CHAR-1)>>LOG2_BITS_PER_CHAR)) max_nchars = ((bits->nbBits+BITS_PER_CHAR-1)>>LOG2_BITS_PER_CHAR); for (i=0;ichars[i]); return max_nchars*BYTES_PER_CHAR; } EXPORT int speex_bits_write_whole_bytes(SpeexBits *bits, char *chars, int max_nbytes) { int max_nchars = max_nbytes/BYTES_PER_CHAR; int i; if (max_nchars > ((bits->nbBits)>>LOG2_BITS_PER_CHAR)) max_nchars = ((bits->nbBits)>>LOG2_BITS_PER_CHAR); for (i=0;ichars[i]); if (bits->bitPtr>0) bits->chars[0]=bits->chars[max_nchars]; else bits->chars[0]=0; bits->charPtr=0; bits->nbBits &= (BITS_PER_CHAR-1); return max_nchars*BYTES_PER_CHAR; } EXPORT void speex_bits_pack(SpeexBits *bits, int data, int nbBits) { unsigned int d=data; if (bits->charPtr+((nbBits+bits->bitPtr)>>LOG2_BITS_PER_CHAR) >= bits->buf_size) { speex_notify("Buffer too small to pack bits"); if (bits->owner) { int new_nchars = ((bits->buf_size+5)*3)>>1; char *tmp = (char*)speex_realloc(bits->chars, new_nchars); if (tmp) { bits->buf_size=new_nchars; bits->chars=tmp; } else { speex_warning("Could not resize input buffer: not packing"); return; } } else { speex_warning("Do not own input buffer: not packing"); return; } } while(nbBits) { int bit; bit = (d>>(nbBits-1))&1; bits->chars[bits->charPtr] |= bit<<(BITS_PER_CHAR-1-bits->bitPtr); bits->bitPtr++; if (bits->bitPtr==BITS_PER_CHAR) { bits->bitPtr=0; bits->charPtr++; bits->chars[bits->charPtr] = 0; } bits->nbBits++; nbBits--; } } EXPORT int speex_bits_unpack_signed(SpeexBits *bits, int nbBits) { unsigned int d=speex_bits_unpack_unsigned(bits,nbBits); /* If number is negative */ if (d>>(nbBits-1)) { d |= (-1)<charPtr<bitPtr+nbBits>bits->nbBits) bits->overflow=1; if (bits->overflow) return 0; while(nbBits) { d<<=1; d |= (bits->chars[bits->charPtr]>>(BITS_PER_CHAR-1 - bits->bitPtr))&1; bits->bitPtr++; if (bits->bitPtr==BITS_PER_CHAR) { bits->bitPtr=0; bits->charPtr++; } nbBits--; } return d; } EXPORT unsigned int speex_bits_peek_unsigned(SpeexBits *bits, int nbBits) { unsigned int d=0; int bitPtr, charPtr; char *chars; if ((bits->charPtr<bitPtr+nbBits>bits->nbBits) bits->overflow=1; if (bits->overflow) return 0; bitPtr=bits->bitPtr; charPtr=bits->charPtr; chars = bits->chars; while(nbBits) { d<<=1; d |= (chars[charPtr]>>(BITS_PER_CHAR-1 - bitPtr))&1; bitPtr++; if (bitPtr==BITS_PER_CHAR) { bitPtr=0; charPtr++; } nbBits--; } return d; } EXPORT int speex_bits_peek(SpeexBits *bits) { if ((bits->charPtr<bitPtr+1>bits->nbBits) bits->overflow=1; if (bits->overflow) return 0; return (bits->chars[bits->charPtr]>>(BITS_PER_CHAR-1 - bits->bitPtr))&1; } EXPORT void speex_bits_advance(SpeexBits *bits, int n) { if (((bits->charPtr<bitPtr+n>bits->nbBits) || bits->overflow){ bits->overflow=1; return; } bits->charPtr += (bits->bitPtr+n) >> LOG2_BITS_PER_CHAR; /* divide by BITS_PER_CHAR */ bits->bitPtr = (bits->bitPtr+n) & (BITS_PER_CHAR-1); /* modulo by BITS_PER_CHAR */ } EXPORT int speex_bits_remaining(SpeexBits *bits) { if (bits->overflow) return -1; else return bits->nbBits-((bits->charPtr<bitPtr); } EXPORT int speex_bits_nbytes(SpeexBits *bits) { return ((bits->nbBits+BITS_PER_CHAR-1)>>LOG2_BITS_PER_CHAR); } EXPORT void speex_bits_insert_terminator(SpeexBits *bits) { if (bits->bitPtr) speex_bits_pack(bits, 0, 1); while (bits->bitPtr) speex_bits_pack(bits, 1, 1); } mumble-1.3.4/3rdparty/speex-src/libspeex/os_support.h0000664000175000017500000001230114010707304022513 0ustar builderbuilder/* Copyright (C) 2007 Jean-Marc Valin File: os_support.h This is the (tiny) OS abstraction layer. Aside from math.h, this is the only place where system headers are allowed. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef OS_SUPPORT_H #define OS_SUPPORT_H #include #include #include #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef OS_SUPPORT_CUSTOM #include "os_support_custom.h" #endif /** Speex wrapper for calloc. To do your own dynamic allocation, all you need to do is replace this function, speex_realloc and speex_free NOTE: speex_alloc needs to CLEAR THE MEMORY */ #ifndef OVERRIDE_SPEEX_ALLOC static inline void *speex_alloc (int size) { /* WARNING: this is not equivalent to malloc(). If you want to use malloc() or your own allocator, YOU NEED TO CLEAR THE MEMORY ALLOCATED. Otherwise you will experience strange bugs */ return calloc(size,1); } #endif /** Same as speex_alloc, except that the area is only needed inside a Speex call (might cause problem with wideband though) */ #ifndef OVERRIDE_SPEEX_ALLOC_SCRATCH static inline void *speex_alloc_scratch (int size) { /* Scratch space doesn't need to be cleared */ return calloc(size,1); } #endif /** Speex wrapper for realloc. To do your own dynamic allocation, all you need to do is replace this function, speex_alloc and speex_free */ #ifndef OVERRIDE_SPEEX_REALLOC static inline void *speex_realloc (void *ptr, int size) { return realloc(ptr, size); } #endif /** Speex wrapper for calloc. To do your own dynamic allocation, all you need to do is replace this function, speex_realloc and speex_alloc */ #ifndef OVERRIDE_SPEEX_FREE static inline void speex_free (void *ptr) { free(ptr); } #endif /** Same as speex_free, except that the area is only needed inside a Speex call (might cause problem with wideband though) */ #ifndef OVERRIDE_SPEEX_FREE_SCRATCH static inline void speex_free_scratch (void *ptr) { free(ptr); } #endif /** Copy n elements from src to dst. The 0* term provides compile-time type checking */ #ifndef OVERRIDE_SPEEX_COPY #define SPEEX_COPY(dst, src, n) (memcpy((dst), (src), (n)*sizeof(*(dst)) + 0*((dst)-(src)) )) #endif /** Copy n elements from src to dst, allowing overlapping regions. The 0* term provides compile-time type checking */ #ifndef OVERRIDE_SPEEX_MOVE #define SPEEX_MOVE(dst, src, n) (memmove((dst), (src), (n)*sizeof(*(dst)) + 0*((dst)-(src)) )) #endif /** For n elements worth of memory, set every byte to the value of c, starting at address dst */ #ifndef OVERRIDE_SPEEX_MEMSET #define SPEEX_MEMSET(dst, c, n) (memset((dst), (c), (n)*sizeof(*(dst)))) #endif #ifndef OVERRIDE_SPEEX_FATAL static inline void _speex_fatal(const char *str, const char *file, int line) { fprintf (stderr, "Fatal (internal) error in %s, line %d: %s\n", file, line, str); exit(1); } #endif #ifndef OVERRIDE_SPEEX_WARNING static inline void speex_warning(const char *str) { #ifndef DISABLE_WARNINGS fprintf (stderr, "warning: %s\n", str); #endif } #endif #ifndef OVERRIDE_SPEEX_WARNING_INT static inline void speex_warning_int(const char *str, int val) { #ifndef DISABLE_WARNINGS fprintf (stderr, "warning: %s %d\n", str, val); #endif } #endif #ifndef OVERRIDE_SPEEX_NOTIFY static inline void speex_notify(const char *str) { #ifndef DISABLE_NOTIFICATIONS fprintf (stderr, "notification: %s\n", str); #endif } #endif #ifndef OVERRIDE_SPEEX_PUTC /** Speex wrapper for putc */ static inline void _speex_putc(int ch, void *file) { FILE *f = (FILE *)file; fprintf(f, "%c", ch); } #endif #define speex_fatal(str) _speex_fatal(str, __FILE__, __LINE__); #define speex_assert(cond) {if (!(cond)) {speex_fatal("assertion failed: " #cond);}} #ifndef RELEASE static inline void print_vec(float *vec, int len, char *name) { int i; printf ("%s ", name); for (i=0;i #include #ifdef FIXED_DEBUG extern long long spx_mips; #endif #define FRAME_SIZE 320 #include int main(int argc, char **argv) { char *inFile, *outFile, *bitsFile; FILE *fin, *fout, *fbits=NULL; short in_short[FRAME_SIZE]; short out_short[FRAME_SIZE]; float sigpow,errpow,snr, seg_snr=0; int snr_frames = 0; char cbits[200]; int nbBits; int i; void *st; void *dec; SpeexBits bits; spx_int32_t tmp; int bitCount=0; spx_int32_t skip_group_delay; SpeexCallback callback; sigpow = 0; errpow = 0; st = speex_encoder_init(speex_lib_get_mode(SPEEX_MODEID_WB)); dec = speex_decoder_init(speex_lib_get_mode(SPEEX_MODEID_WB)); callback.callback_id = SPEEX_INBAND_CHAR; callback.func = speex_std_char_handler; callback.data = stderr; speex_decoder_ctl(dec, SPEEX_SET_HANDLER, &callback); callback.callback_id = SPEEX_INBAND_MODE_REQUEST; callback.func = speex_std_mode_request_handler; callback.data = st; speex_decoder_ctl(dec, SPEEX_SET_HANDLER, &callback); tmp=1; speex_decoder_ctl(dec, SPEEX_SET_ENH, &tmp); tmp=0; speex_encoder_ctl(st, SPEEX_SET_VBR, &tmp); tmp=8; speex_encoder_ctl(st, SPEEX_SET_QUALITY, &tmp); tmp=3; speex_encoder_ctl(st, SPEEX_SET_COMPLEXITY, &tmp); /*tmp=3; speex_encoder_ctl(st, SPEEX_SET_HIGH_MODE, &tmp); tmp=6; speex_encoder_ctl(st, SPEEX_SET_LOW_MODE, &tmp); */ speex_encoder_ctl(st, SPEEX_GET_LOOKAHEAD, &skip_group_delay); speex_decoder_ctl(dec, SPEEX_GET_LOOKAHEAD, &tmp); skip_group_delay += tmp; if (argc != 4 && argc != 3) { fprintf (stderr, "Usage: encode [in file] [out file] [bits file]\nargc = %d", argc); exit(1); } inFile = argv[1]; fin = fopen(inFile, "rb"); outFile = argv[2]; fout = fopen(outFile, "wb+"); if (argc==4) { bitsFile = argv[3]; fbits = fopen(bitsFile, "wb"); } speex_bits_init(&bits); while (!feof(fin)) { fread(in_short, sizeof(short), FRAME_SIZE, fin); if (feof(fin)) break; speex_bits_reset(&bits); speex_encode_int(st, in_short, &bits); nbBits = speex_bits_write(&bits, cbits, 200); bitCount+=bits.nbBits; if (argc==4) fwrite(cbits, 1, nbBits, fbits); speex_bits_rewind(&bits); speex_decode_int(dec, &bits, out_short); speex_bits_reset(&bits); fwrite(&out_short[skip_group_delay], sizeof(short), FRAME_SIZE-skip_group_delay, fout); skip_group_delay = 0; } fprintf (stderr, "Total encoded size: %d bits\n", bitCount); speex_encoder_destroy(st); speex_decoder_destroy(dec); speex_bits_destroy(&bits); rewind(fin); rewind(fout); while ( FRAME_SIZE == fread(in_short, sizeof(short), FRAME_SIZE, fin) && FRAME_SIZE == fread(out_short, sizeof(short), FRAME_SIZE,fout) ) { float s=0, e=0; for (i=0;i>> 16;\n\t" " R1 = (A1 += R2.L*R0.H) (IS);\n\t" "4: R3 = R3 + R1;\n\t" " cc =R3<%0;\n\t" " if cc %0=R3;\n\t" " if cc %1=R5;\n\t" "2: R5 += 1;\n\t" " L0 = 0;\n\t" " L1 = 0;\n\t" : "=&d" (best_dist), "=&d" (best_id) : "a" (x), "a" (weight), "b" (cdbk), "a" (nbVec), "a" (nbDim) : "I0", "I1", "P2", "R0", "R1", "R2", "R3", "R5", "A1", "L0", "L1", "B0", "B1", "CC", "ASTAT" BFIN_HWLOOP0_REGS BFIN_HWLOOP1_REGS ); for (j=0;j>2)-1), "0" (src), "1" (dest) : "R0", "I0", "L0", "memory" BFIN_HWLOOP0_REGS ); return dest; } mumble-1.3.4/3rdparty/speex-src/libspeex/lsp_bfin.h0000664000175000017500000000616314010707304022103 0ustar builderbuilder/* Copyright (C) 2006 David Rowe */ /** @file lsp_bfin.h @author David Rowe @brief LSP routines optimised for the Blackfin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #define OVERRIDE_CHEB_POLY_EVA #ifdef OVERRIDE_CHEB_POLY_EVA static inline spx_word32_t cheb_poly_eva( spx_word16_t *coef, /* P or Q coefs in Q13 format */ spx_word16_t x, /* cos of freq (-1.0 to 1.0) in Q14 format */ int m, /* LPC order/2 */ char *stack ) { spx_word32_t sum; __asm__ __volatile__ ( "P0 = %2;\n\t" /* P0: coef[m], coef[m-1],..., coef[0] */ "R4 = 8192;\n\t" /* R4: rounding constant */ "R2 = %1;\n\t" /* R2: x */ "R5 = -16383;\n\t" "R2 = MAX(R2,R5);\n\t" "R5 = 16383;\n\t" "R2 = MIN(R2,R5);\n\t" "R3 = W[P0--] (X);\n\t" /* R3: sum */ "R5 = W[P0--] (X);\n\t" "R5 = R5.L * R2.L (IS);\n\t" "R5 = R5 + R4;\n\t" "R5 >>>= 14;\n\t" "R3 = R3 + R5;\n\t" "R0 = R2;\n\t" /* R0: b0 */ "R1 = 16384;\n\t" /* R1: b1 */ "LOOP cpe%= LC0 = %3;\n\t" "LOOP_BEGIN cpe%=;\n\t" "P1 = R0;\n\t" "R0 = R2.L * R0.L (IS) || R5 = W[P0--] (X);\n\t" "R0 >>>= 13;\n\t" "R0 = R0 - R1;\n\t" "R1 = P1;\n\t" "R5 = R5.L * R0.L (IS);\n\t" "R5 = R5 + R4;\n\t" "R5 >>>= 14;\n\t" "R3 = R3 + R5;\n\t" "LOOP_END cpe%=;\n\t" "%0 = R3;\n\t" : "=&d" (sum) : "a" (x), "a" (&coef[m]), "a" (m-1) : "R0", "R1", "R3", "R2", "R4", "R5", "P0", "P1", "ASTAT" BFIN_HWLOOP0_REGS ); return sum; } #endif mumble-1.3.4/3rdparty/speex-src/libspeex/stereo.c0000664000175000017500000002342114010707304021577 0ustar builderbuilder/* Copyright (C) 2002 Jean-Marc Valin File: stereo.c Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "speex/speex_stereo.h" #include "speex/speex_callbacks.h" #include "math_approx.h" #include "vq.h" #include #include "os_support.h" typedef struct RealSpeexStereoState { spx_word32_t balance; /**< Left/right balance info */ spx_word32_t e_ratio; /**< Ratio of energies: E(left+right)/[E(left)+E(right)] */ spx_word32_t smooth_left; /**< Smoothed left channel gain */ spx_word32_t smooth_right; /**< Smoothed right channel gain */ spx_uint32_t reserved1; /**< Reserved for future use */ spx_int32_t reserved2; /**< Reserved for future use */ } RealSpeexStereoState; /*float e_ratio_quant[4] = {1, 1.26, 1.587, 2};*/ #ifndef FIXED_POINT static const float e_ratio_quant[4] = {.25f, .315f, .397f, .5f}; static const float e_ratio_quant_bounds[3] = {0.2825f, 0.356f, 0.4485f}; #else static const spx_word16_t e_ratio_quant[4] = {8192, 10332, 13009, 16384}; static const spx_word16_t e_ratio_quant_bounds[3] = {9257, 11665, 14696}; static const spx_word16_t balance_bounds[31] = {18, 23, 30, 38, 49, 63, 81, 104, 134, 172, 221, 284, 364, 468, 600, 771, 990, 1271, 1632, 2096, 2691, 3455, 4436, 5696, 7314, 9392, 12059, 15484, 19882, 25529, 32766}; #endif /* This is an ugly compatibility hack that properly resets the stereo state In case it it compiled in fixed-point, but initialised with the deprecated floating point static initialiser */ #ifdef FIXED_POINT #define COMPATIBILITY_HACK(s) do {if ((s)->reserved1 != 0xdeadbeef) speex_stereo_state_reset((SpeexStereoState*)s); } while (0); #else #define COMPATIBILITY_HACK(s) #endif EXPORT SpeexStereoState *speex_stereo_state_init() { SpeexStereoState *stereo = speex_alloc(sizeof(SpeexStereoState)); speex_stereo_state_reset(stereo); return stereo; } EXPORT void speex_stereo_state_reset(SpeexStereoState *_stereo) { RealSpeexStereoState *stereo = (RealSpeexStereoState*)_stereo; #ifdef FIXED_POINT stereo->balance = 65536; stereo->e_ratio = 16384; stereo->smooth_left = 16384; stereo->smooth_right = 16384; stereo->reserved1 = 0xdeadbeef; stereo->reserved2 = 0; #else stereo->balance = 1.0f; stereo->e_ratio = .5f; stereo->smooth_left = 1.f; stereo->smooth_right = 1.f; stereo->reserved1 = 0; stereo->reserved2 = 0; #endif } EXPORT void speex_stereo_state_destroy(SpeexStereoState *stereo) { speex_free(stereo); } #ifndef DISABLE_ENCODER #ifndef DISABLE_FLOAT_API EXPORT void speex_encode_stereo(float *data, int frame_size, SpeexBits *bits) { int i, tmp; float e_left=0, e_right=0, e_tot=0; float balance, e_ratio; for (i=0;i0) speex_bits_pack(bits, 0, 1); else speex_bits_pack(bits, 1, 1); balance=floor(.5+fabs(balance)); if (balance>30) balance=31; speex_bits_pack(bits, (int)balance, 5); /* FIXME: this is a hack */ tmp=scal_quant(e_ratio*Q15_ONE, e_ratio_quant_bounds, 4); speex_bits_pack(bits, tmp, 2); } #endif /* #ifndef DISABLE_FLOAT_API */ EXPORT void speex_encode_stereo_int(spx_int16_t *data, int frame_size, SpeexBits *bits) { int i, tmp; spx_word32_t e_left=0, e_right=0, e_tot=0; spx_word32_t balance, e_ratio; spx_word32_t largest, smallest; int balance_id; #ifdef FIXED_POINT int shift; #endif /* In band marker */ speex_bits_pack(bits, 14, 5); /* Stereo marker */ speex_bits_pack(bits, SPEEX_INBAND_STEREO, 4); for (i=0;i e_right) { speex_bits_pack(bits, 0, 1); largest = e_left; smallest = e_right; } else { speex_bits_pack(bits, 1, 1); largest = e_right; smallest = e_left; } /* Balance quantization */ #ifdef FIXED_POINT shift = spx_ilog2(largest)-15; largest = VSHR32(largest, shift-4); smallest = VSHR32(smallest, shift); balance = DIV32(largest, ADD32(smallest, 1)); if (balance > 32767) balance = 32767; balance_id = scal_quant(EXTRACT16(balance), balance_bounds, 32); #else balance=(largest+1.)/(smallest+1.); balance=4*log(balance); balance_id=floor(.5+fabs(balance)); if (balance_id>30) balance_id=31; #endif speex_bits_pack(bits, balance_id, 5); /* "coherence" quantisation */ #ifdef FIXED_POINT shift = spx_ilog2(e_tot); e_tot = VSHR32(e_tot, shift-25); e_left = VSHR32(e_left, shift-10); e_right = VSHR32(e_right, shift-10); e_ratio = DIV32(e_tot, e_left+e_right+1); #else e_ratio = e_tot/(1.+e_left+e_right); #endif tmp=scal_quant(EXTRACT16(e_ratio), e_ratio_quant_bounds, 4); /*fprintf (stderr, "%d %d %d %d\n", largest, smallest, balance_id, e_ratio);*/ speex_bits_pack(bits, tmp, 2); } #else /* DISABLE_ENCODER */ EXPORT void speex_encode_stereo_int(spx_int16_t *data, int frame_size, SpeexBits *bits) { } #endif /* DISABLE_ENCODER */ #ifndef DISABLE_FLOAT_API EXPORT void speex_decode_stereo(float *data, int frame_size, SpeexStereoState *_stereo) { int i; spx_word32_t balance; spx_word16_t e_left, e_right, e_ratio; RealSpeexStereoState *stereo = (RealSpeexStereoState*)_stereo; COMPATIBILITY_HACK(stereo); balance=stereo->balance; e_ratio=stereo->e_ratio; /* These two are Q14, with max value just below 2. */ e_right = DIV32(QCONST32(1., 22), spx_sqrt(MULT16_32_Q15(e_ratio, ADD32(QCONST32(1., 16), balance)))); e_left = SHR32(MULT16_16(spx_sqrt(balance), e_right), 8); for (i=frame_size-1;i>=0;i--) { spx_word16_t tmp=data[i]; stereo->smooth_left = EXTRACT16(PSHR32(MAC16_16(MULT16_16(stereo->smooth_left, QCONST16(0.98, 15)), e_left, QCONST16(0.02, 15)), 15)); stereo->smooth_right = EXTRACT16(PSHR32(MAC16_16(MULT16_16(stereo->smooth_right, QCONST16(0.98, 15)), e_right, QCONST16(0.02, 15)), 15)); data[2*i] = (float)MULT16_16_P14(stereo->smooth_left, tmp); data[2*i+1] = (float)MULT16_16_P14(stereo->smooth_right, tmp); } } #endif /* #ifndef DISABLE_FLOAT_API */ EXPORT void speex_decode_stereo_int(spx_int16_t *data, int frame_size, SpeexStereoState *_stereo) { int i; spx_word32_t balance; spx_word16_t e_left, e_right, e_ratio; RealSpeexStereoState *stereo = (RealSpeexStereoState*)_stereo; COMPATIBILITY_HACK(stereo); balance=stereo->balance; e_ratio=stereo->e_ratio; /* These two are Q14, with max value just below 2. */ e_right = DIV32(QCONST32(1., 22), spx_sqrt(MULT16_32_Q15(e_ratio, ADD32(QCONST32(1., 16), balance)))); e_left = SHR32(MULT16_16(spx_sqrt(balance), e_right), 8); for (i=frame_size-1;i>=0;i--) { spx_int16_t tmp=data[i]; stereo->smooth_left = EXTRACT16(PSHR32(MAC16_16(MULT16_16(stereo->smooth_left, QCONST16(0.98, 15)), e_left, QCONST16(0.02, 15)), 15)); stereo->smooth_right = EXTRACT16(PSHR32(MAC16_16(MULT16_16(stereo->smooth_right, QCONST16(0.98, 15)), e_right, QCONST16(0.02, 15)), 15)); data[2*i] = (spx_int16_t)MULT16_16_P14(stereo->smooth_left, tmp); data[2*i+1] = (spx_int16_t)MULT16_16_P14(stereo->smooth_right, tmp); } } EXPORT int speex_std_stereo_request_handler(SpeexBits *bits, void *state, void *data) { RealSpeexStereoState *stereo; spx_word16_t sign=1, dexp; int tmp; stereo = (RealSpeexStereoState*)data; COMPATIBILITY_HACK(stereo); if (speex_bits_unpack_unsigned(bits, 1)) sign=-1; dexp = speex_bits_unpack_unsigned(bits, 5); #ifndef FIXED_POINT stereo->balance = exp(sign*.25*dexp); #else stereo->balance = spx_exp(MULT16_16(sign, SHL16(dexp, 9))); #endif tmp = speex_bits_unpack_unsigned(bits, 2); stereo->e_ratio = e_ratio_quant[tmp]; return 0; } mumble-1.3.4/3rdparty/speex-src/libspeex/fftwrap.c0000664000175000017500000002471014010707304021751 0ustar builderbuilder/* Copyright (C) 2005-2006 Jean-Marc Valin File: fftwrap.c Wrapper for various FFTs Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "arch.h" #include "os_support.h" #define MAX_FFT_SIZE 2048 #ifdef FIXED_POINT static int maximize_range(spx_word16_t *in, spx_word16_t *out, spx_word16_t bound, int len) { int i, shift; spx_word16_t max_val = 0; for (i=0;imax_val) max_val = in[i]; if (-in[i]>max_val) max_val = -in[i]; } shift=0; while (max_val <= (bound>>1) && max_val != 0) { max_val <<= 1; shift++; } for (i=0;i void *spx_fft_init(int size) { struct drft_lookup *table; table = speex_alloc(sizeof(struct drft_lookup)); spx_drft_init((struct drft_lookup *)table, size); return (void*)table; } void spx_fft_destroy(void *table) { spx_drft_clear(table); speex_free(table); } void spx_fft(void *table, float *in, float *out) { if (in==out) { int i; float scale = 1./((struct drft_lookup *)table)->n; speex_warning("FFT should not be done in-place"); for (i=0;i<((struct drft_lookup *)table)->n;i++) out[i] = scale*in[i]; } else { int i; float scale = 1./((struct drft_lookup *)table)->n; for (i=0;i<((struct drft_lookup *)table)->n;i++) out[i] = scale*in[i]; } spx_drft_forward((struct drft_lookup *)table, out); } void spx_ifft(void *table, float *in, float *out) { if (in==out) { speex_warning("FFT should not be done in-place"); } else { int i; for (i=0;i<((struct drft_lookup *)table)->n;i++) out[i] = in[i]; } spx_drft_backward((struct drft_lookup *)table, out); } #elif defined(USE_INTEL_MKL) #include struct mkl_config { DFTI_DESCRIPTOR_HANDLE desc; int N; }; void *spx_fft_init(int size) { struct mkl_config *table = (struct mkl_config *) speex_alloc(sizeof(struct mkl_config)); table->N = size; DftiCreateDescriptor(&table->desc, DFTI_SINGLE, DFTI_REAL, 1, size); DftiSetValue(table->desc, DFTI_PACKED_FORMAT, DFTI_PACK_FORMAT); DftiSetValue(table->desc, DFTI_PLACEMENT, DFTI_NOT_INPLACE); DftiSetValue(table->desc, DFTI_FORWARD_SCALE, 1.0f / size); DftiCommitDescriptor(table->desc); return table; } void spx_fft_destroy(void *table) { struct mkl_config *t = (struct mkl_config *) table; DftiFreeDescriptor(t->desc); speex_free(table); } void spx_fft(void *table, spx_word16_t *in, spx_word16_t *out) { struct mkl_config *t = (struct mkl_config *) table; DftiComputeForward(t->desc, in, out); } void spx_ifft(void *table, spx_word16_t *in, spx_word16_t *out) { struct mkl_config *t = (struct mkl_config *) table; DftiComputeBackward(t->desc, in, out); } #elif defined(USE_INTEL_IPP) #include struct ipp_fft_config { IppsDFTSpec_R_32f *dftSpec; Ipp8u *buffer; }; void *spx_fft_init(int size) { int bufferSize = 0; int hint; struct ipp_fft_config *table; table = (struct ipp_fft_config *)speex_alloc(sizeof(struct ipp_fft_config)); /* there appears to be no performance difference between ippAlgHintFast and ippAlgHintAccurate when using the with the floating point version of the fft. */ hint = ippAlgHintAccurate; ippsDFTInitAlloc_R_32f(&table->dftSpec, size, IPP_FFT_DIV_FWD_BY_N, hint); ippsDFTGetBufSize_R_32f(table->dftSpec, &bufferSize); table->buffer = ippsMalloc_8u(bufferSize); return table; } void spx_fft_destroy(void *table) { struct ipp_fft_config *t = (struct ipp_fft_config *)table; ippsFree(t->buffer); ippsDFTFree_R_32f(t->dftSpec); speex_free(t); } void spx_fft(void *table, spx_word16_t *in, spx_word16_t *out) { struct ipp_fft_config *t = (struct ipp_fft_config *)table; ippsDFTFwd_RToPack_32f(in, out, t->dftSpec, t->buffer); } void spx_ifft(void *table, spx_word16_t *in, spx_word16_t *out) { struct ipp_fft_config *t = (struct ipp_fft_config *)table; ippsDFTInv_PackToR_32f(in, out, t->dftSpec, t->buffer); } #elif defined(USE_GPL_FFTW3) #include struct fftw_config { float *in; float *out; fftwf_plan fft; fftwf_plan ifft; int N; }; void *spx_fft_init(int size) { struct fftw_config *table = (struct fftw_config *) speex_alloc(sizeof(struct fftw_config)); table->in = fftwf_malloc(sizeof(float) * (size+2)); table->out = fftwf_malloc(sizeof(float) * (size+2)); table->fft = fftwf_plan_dft_r2c_1d(size, table->in, (fftwf_complex *) table->out, FFTW_PATIENT); table->ifft = fftwf_plan_dft_c2r_1d(size, (fftwf_complex *) table->in, table->out, FFTW_PATIENT); table->N = size; return table; } void spx_fft_destroy(void *table) { struct fftw_config *t = (struct fftw_config *) table; fftwf_destroy_plan(t->fft); fftwf_destroy_plan(t->ifft); fftwf_free(t->in); fftwf_free(t->out); speex_free(table); } void spx_fft(void *table, spx_word16_t *in, spx_word16_t *out) { int i; struct fftw_config *t = (struct fftw_config *) table; const int N = t->N; float *iptr = t->in; float *optr = t->out; const float m = 1.0 / N; for(i=0;ifft); out[0] = optr[0]; for(i=1;iN; float *iptr = t->in; float *optr = t->out; iptr[0] = in[0]; iptr[1] = 0.0f; for(i=1;iifft); for(i=0;iforward = kiss_fftr_alloc(size,0,NULL,NULL); table->backward = kiss_fftr_alloc(size,1,NULL,NULL); table->N = size; return table; } void spx_fft_destroy(void *table) { struct kiss_config *t = (struct kiss_config *)table; kiss_fftr_free(t->forward); kiss_fftr_free(t->backward); speex_free(table); } #ifdef FIXED_POINT void spx_fft(void *table, spx_word16_t *in, spx_word16_t *out) { int shift; struct kiss_config *t = (struct kiss_config *)table; shift = maximize_range(in, in, 32000, t->N); kiss_fftr2(t->forward, in, out); renorm_range(in, in, shift, t->N); renorm_range(out, out, shift, t->N); } #else void spx_fft(void *table, spx_word16_t *in, spx_word16_t *out) { int i; float scale; struct kiss_config *t = (struct kiss_config *)table; scale = 1./t->N; kiss_fftr2(t->forward, in, out); for (i=0;iN;i++) out[i] *= scale; } #endif void spx_ifft(void *table, spx_word16_t *in, spx_word16_t *out) { struct kiss_config *t = (struct kiss_config *)table; kiss_fftri2(t->backward, in, out); } #else #error No other FFT implemented #endif #ifdef FIXED_POINT /*#include "smallft.h"*/ void spx_fft_float(void *table, float *in, float *out) { int i; #ifdef USE_SMALLFT int N = ((struct drft_lookup *)table)->n; #elif defined(USE_KISS_FFT) int N = ((struct kiss_config *)table)->N; #else #endif #ifdef VAR_ARRAYS spx_word16_t _in[N]; spx_word16_t _out[N]; #else spx_word16_t _in[MAX_FFT_SIZE]; spx_word16_t _out[MAX_FFT_SIZE]; #endif for (i=0;iN); scale = 1./((struct kiss_config *)table)->N; for (i=0;i<((struct kiss_config *)table)->N;i++) out[i] = scale*in[i]; spx_drft_forward(&t, out); spx_drft_clear(&t); } #endif } void spx_ifft_float(void *table, float *in, float *out) { int i; #ifdef USE_SMALLFT int N = ((struct drft_lookup *)table)->n; #elif defined(USE_KISS_FFT) int N = ((struct kiss_config *)table)->N; #else #endif #ifdef VAR_ARRAYS spx_word16_t _in[N]; spx_word16_t _out[N]; #else spx_word16_t _in[MAX_FFT_SIZE]; spx_word16_t _out[MAX_FFT_SIZE]; #endif for (i=0;iN); for (i=0;i<((struct kiss_config *)table)->N;i++) out[i] = in[i]; spx_drft_backward(&t, out); spx_drft_clear(&t); } #endif } #else void spx_fft_float(void *table, float *in, float *out) { spx_fft(table, in, out); } void spx_ifft_float(void *table, float *in, float *out) { spx_ifft(table, in, out); } #endif mumble-1.3.4/3rdparty/speex-src/libspeex/bfin.h0000664000175000017500000000060714010707304021222 0ustar builderbuilder/* Common Blackfin assembly defines * * Copyright (C) 2005-2009 Analog Devices */ #if __GNUC__ <= 3 /* GCC-3.4 and older did not use hardware loops and thus did not have * register constraints for declaring clobbers. */ # define BFIN_HWLOOP0_REGS # define BFIN_HWLOOP1_REGS #else # define BFIN_HWLOOP0_REGS , "LB0", "LT0", "LC0" # define BFIN_HWLOOP1_REGS , "LB1", "LT1", "LC1" #endif mumble-1.3.4/3rdparty/speex-src/libspeex/vq_sse.h0000664000175000017500000000725714010707304021614 0ustar builderbuilder/* Copyright (C) 2004 Jean-Marc Valin */ /** @file vq_sse.h @brief SSE-optimized vq routine */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #define OVERRIDE_VQ_NBEST void vq_nbest(spx_word16_t *_in, const __m128 *codebook, int len, int entries, __m128 *E, int N, int *nbest, spx_word32_t *best_dist, char *stack) { int i,j,k,used; VARDECL(float *dist); VARDECL(__m128 *in); __m128 half; used = 0; ALLOC(dist, entries, float); half = _mm_set_ps1(.5f); ALLOC(in, len, __m128); for (i=0;i>2;i++) { __m128 d = _mm_mul_ps(E[i], half); for (j=0;j= 1) && (k > used || dist[i] < best_dist[k-1]); k--) { best_dist[k]=best_dist[k-1]; nbest[k] = nbest[k-1]; } best_dist[k]=dist[i]; nbest[k]=i; used++; } } } #define OVERRIDE_VQ_NBEST_SIGN void vq_nbest_sign(spx_word16_t *_in, const __m128 *codebook, int len, int entries, __m128 *E, int N, int *nbest, spx_word32_t *best_dist, char *stack) { int i,j,k,used; VARDECL(float *dist); VARDECL(__m128 *in); __m128 half; used = 0; ALLOC(dist, entries, float); half = _mm_set_ps1(.5f); ALLOC(in, len, __m128); for (i=0;i>2;i++) { __m128 d = _mm_setzero_ps(); for (j=0;j0) { sign=0; dist[i]=-dist[i]; } else { sign=1; } dist[i] += .5f*((float*)E)[i]; if (i= 1) && (k > used || dist[i] < best_dist[k-1]); k--) { best_dist[k]=best_dist[k-1]; nbest[k] = nbest[k-1]; } best_dist[k]=dist[i]; nbest[k]=i; used++; if (sign) nbest[k]+=entries; } } } mumble-1.3.4/3rdparty/speex-src/libspeex/sb_celp.c0000664000175000017500000013072014010707304021706 0ustar builderbuilder/* Copyright (C) 2002-2006 Jean-Marc Valin File: sb_celp.c Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "sb_celp.h" #include "filters.h" #include "lpc.h" #include "lsp.h" #include "stack_alloc.h" #include "cb_search.h" #include "quant_lsp.h" #include "vq.h" #include "ltp.h" #include "arch.h" #include "math_approx.h" #include "os_support.h" #ifndef NULL #define NULL 0 #endif /* Default size for the encoder and decoder stack (can be changed at compile time). This does not apply when using variable-size arrays or alloca. */ #ifndef SB_ENC_STACK #define SB_ENC_STACK (10000*sizeof(spx_sig_t)) #endif #ifndef SB_DEC_STACK #define SB_DEC_STACK (6000*sizeof(spx_sig_t)) #endif #ifndef DISABLE_WIDEBAND #define sqr(x) ((x)*(x)) #define SUBMODE(x) st->submodes[st->submodeID]->x #ifdef FIXED_POINT static const spx_word16_t gc_quant_bound[16] = {125, 164, 215, 282, 370, 484, 635, 832, 1090, 1428, 1871, 2452, 3213, 4210, 5516, 7228}; static const spx_word16_t fold_quant_bound[32] = { 39, 44, 50, 57, 64, 73, 83, 94, 106, 120, 136, 154, 175, 198, 225, 255, 288, 327, 370, 420, 476, 539, 611, 692, 784, 889, 1007, 1141, 1293, 1465, 1660, 1881}; #define LSP_MARGIN 410 #define LSP_DELTA1 6553 #define LSP_DELTA2 1638 #else static const spx_word16_t gc_quant_bound[16] = { 0.97979, 1.28384, 1.68223, 2.20426, 2.88829, 3.78458, 4.95900, 6.49787, 8.51428, 11.15642, 14.61846, 19.15484, 25.09895, 32.88761, 43.09325, 56.46588}; static const spx_word16_t fold_quant_bound[32] = { 0.30498, 0.34559, 0.39161, 0.44375, 0.50283, 0.56979, 0.64565, 0.73162, 0.82903, 0.93942, 1.06450, 1.20624, 1.36685, 1.54884, 1.75506, 1.98875, 2.25355, 2.55360, 2.89361, 3.27889, 3.71547, 4.21018, 4.77076, 5.40598, 6.12577, 6.94141, 7.86565, 8.91295, 10.09969, 11.44445, 12.96826, 14.69497}; #define LSP_MARGIN .05 #define LSP_DELTA1 .2 #define LSP_DELTA2 .05 #endif #define QMF_ORDER 64 #ifdef FIXED_POINT static const spx_word16_t h0[64] = {2, -7, -7, 18, 15, -39, -25, 75, 35, -130, -41, 212, 38, -327, -17, 483, -32, -689, 124, 956, -283, -1307, 543, 1780, -973, -2467, 1733, 3633, -3339, -6409, 9059, 30153, 30153, 9059, -6409, -3339, 3633, 1733, -2467, -973, 1780, 543, -1307, -283, 956, 124, -689, -32, 483, -17, -327, 38, 212, -41, -130, 35, 75, -25, -39, 15, 18, -7, -7, 2}; #else static const float h0[64] = { 3.596189e-05f, -0.0001123515f, -0.0001104587f, 0.0002790277f, 0.0002298438f, -0.0005953563f, -0.0003823631f, 0.00113826f, 0.0005308539f, -0.001986177f, -0.0006243724f, 0.003235877f, 0.0005743159f, -0.004989147f, -0.0002584767f, 0.007367171f, -0.0004857935f, -0.01050689f, 0.001894714f, 0.01459396f, -0.004313674f, -0.01994365f, 0.00828756f, 0.02716055f, -0.01485397f, -0.03764973f, 0.026447f, 0.05543245f, -0.05095487f, -0.09779096f, 0.1382363f, 0.4600981f, 0.4600981f, 0.1382363f, -0.09779096f, -0.05095487f, 0.05543245f, 0.026447f, -0.03764973f, -0.01485397f, 0.02716055f, 0.00828756f, -0.01994365f, -0.004313674f, 0.01459396f, 0.001894714f, -0.01050689f, -0.0004857935f, 0.007367171f, -0.0002584767f, -0.004989147f, 0.0005743159f, 0.003235877f, -0.0006243724f, -0.001986177f, 0.0005308539f, 0.00113826f, -0.0003823631f, -0.0005953563f, 0.0002298438f, 0.0002790277f, -0.0001104587f, -0.0001123515f, 3.596189e-05f }; #endif extern const spx_word16_t lag_window[]; extern const spx_word16_t lpc_window[]; #ifndef DISABLE_ENCODER void *sb_encoder_init(const SpeexMode *m) { int i; spx_int32_t tmp; SBEncState *st; const SpeexSBMode *mode; st = (SBEncState*)speex_alloc(sizeof(SBEncState)); if (!st) return NULL; st->mode = m; mode = (const SpeexSBMode*)m->mode; st->st_low = speex_encoder_init(mode->nb_mode); #if defined(VAR_ARRAYS) || defined (USE_ALLOCA) st->stack = NULL; #else /*st->stack = (char*)speex_alloc_scratch(SB_ENC_STACK);*/ speex_encoder_ctl(st->st_low, SPEEX_GET_STACK, &st->stack); #endif st->full_frame_size = 2*mode->frameSize; st->frame_size = mode->frameSize; st->subframeSize = mode->subframeSize; st->nbSubframes = mode->frameSize/mode->subframeSize; st->windowSize = st->frame_size+st->subframeSize; st->lpcSize=mode->lpcSize; st->encode_submode = 1; st->submodes=mode->submodes; st->submodeSelect = st->submodeID=mode->defaultSubmode; tmp=9; speex_encoder_ctl(st->st_low, SPEEX_SET_QUALITY, &tmp); tmp=1; speex_encoder_ctl(st->st_low, SPEEX_SET_WIDEBAND, &tmp); st->lpc_floor = mode->lpc_floor; st->gamma1=mode->gamma1; st->gamma2=mode->gamma2; st->first=1; st->high=(spx_word16_t*)speex_alloc((st->windowSize-st->frame_size)*sizeof(spx_word16_t)); st->h0_mem=(spx_word16_t*)speex_alloc((QMF_ORDER)*sizeof(spx_word16_t)); st->window= lpc_window; st->lagWindow = lag_window; st->old_lsp = (spx_lsp_t*)speex_alloc(st->lpcSize*sizeof(spx_lsp_t)); st->old_qlsp = (spx_lsp_t*)speex_alloc(st->lpcSize*sizeof(spx_lsp_t)); st->interp_qlpc = (spx_coef_t*)speex_alloc(st->lpcSize*sizeof(spx_coef_t)); st->pi_gain = (spx_word32_t*)speex_alloc((st->nbSubframes)*sizeof(spx_word32_t)); st->exc_rms = (spx_word16_t*)speex_alloc((st->nbSubframes)*sizeof(spx_word16_t)); st->innov_rms_save = NULL; st->mem_sp = (spx_mem_t*)speex_alloc((st->lpcSize)*sizeof(spx_mem_t)); st->mem_sp2 = (spx_mem_t*)speex_alloc((st->lpcSize)*sizeof(spx_mem_t)); st->mem_sw = (spx_mem_t*)speex_alloc((st->lpcSize)*sizeof(spx_mem_t)); for (i=0;ilpcSize;i++) st->old_lsp[i]= DIV32(MULT16_16(QCONST16(3.1415927f, LSP_SHIFT), i+1), st->lpcSize+1); #ifndef DISABLE_VBR st->vbr_quality = 8; st->vbr_enabled = 0; st->vbr_max = 0; st->vbr_max_high = 20000; /* We just need a big value here */ st->vad_enabled = 0; st->abr_enabled = 0; st->relative_quality=0; #endif /* #ifndef DISABLE_VBR */ st->complexity=2; speex_encoder_ctl(st->st_low, SPEEX_GET_SAMPLING_RATE, &st->sampling_rate); st->sampling_rate*=2; #ifdef ENABLE_VALGRIND VALGRIND_MAKE_READABLE(st, (st->stack-(char*)st)); #endif return st; } void sb_encoder_destroy(void *state) { SBEncState *st=(SBEncState*)state; speex_encoder_destroy(st->st_low); #if !(defined(VAR_ARRAYS) || defined (USE_ALLOCA)) /*speex_free_scratch(st->stack);*/ #endif speex_free(st->high); speex_free(st->h0_mem); speex_free(st->old_lsp); speex_free(st->old_qlsp); speex_free(st->interp_qlpc); speex_free(st->pi_gain); speex_free(st->exc_rms); speex_free(st->mem_sp); speex_free(st->mem_sp2); speex_free(st->mem_sw); speex_free(st); } int sb_encoder_ctl(void *state, int request, void *ptr) { SBEncState *st; st=(SBEncState*)state; switch(request) { case SPEEX_GET_FRAME_SIZE: (*(spx_int32_t*)ptr) = st->full_frame_size; break; case SPEEX_SET_HIGH_MODE: st->submodeSelect = st->submodeID = (*(spx_int32_t*)ptr); break; case SPEEX_SET_LOW_MODE: speex_encoder_ctl(st->st_low, SPEEX_SET_LOW_MODE, ptr); break; case SPEEX_SET_DTX: speex_encoder_ctl(st->st_low, SPEEX_SET_DTX, ptr); break; case SPEEX_GET_DTX: speex_encoder_ctl(st->st_low, SPEEX_GET_DTX, ptr); break; case SPEEX_GET_LOW_MODE: speex_encoder_ctl(st->st_low, SPEEX_GET_LOW_MODE, ptr); break; case SPEEX_SET_MODE: speex_encoder_ctl(st, SPEEX_SET_QUALITY, ptr); break; #ifndef DISABLE_VBR case SPEEX_SET_VBR: st->vbr_enabled = (*(spx_int32_t*)ptr); speex_encoder_ctl(st->st_low, SPEEX_SET_VBR, ptr); break; case SPEEX_GET_VBR: (*(spx_int32_t*)ptr) = st->vbr_enabled; break; case SPEEX_SET_VAD: st->vad_enabled = (*(spx_int32_t*)ptr); speex_encoder_ctl(st->st_low, SPEEX_SET_VAD, ptr); break; case SPEEX_GET_VAD: (*(spx_int32_t*)ptr) = st->vad_enabled; break; #endif /* #ifndef DISABLE_VBR */ #if !defined(DISABLE_VBR) && !defined(DISABLE_FLOAT_API) case SPEEX_SET_VBR_QUALITY: { spx_int32_t q; float qual = (*(float*)ptr)+.6; st->vbr_quality = (*(float*)ptr); if (qual>10) qual=10; q=(int)floor(.5+*(float*)ptr); if (q>10) q=10; speex_encoder_ctl(st->st_low, SPEEX_SET_VBR_QUALITY, &qual); speex_encoder_ctl(state, SPEEX_SET_QUALITY, &q); break; } case SPEEX_GET_VBR_QUALITY: (*(float*)ptr) = st->vbr_quality; break; #endif /* #if !defined(DISABLE_VBR) && !defined(DISABLE_FLOAT_API) */ #ifndef DISABLE_VBR case SPEEX_SET_ABR: st->abr_enabled = (*(spx_int32_t*)ptr); st->vbr_enabled = st->abr_enabled!=0; speex_encoder_ctl(st->st_low, SPEEX_SET_VBR, &st->vbr_enabled); if (st->vbr_enabled) { spx_int32_t i=10, rate, target; float vbr_qual; target = (*(spx_int32_t*)ptr); while (i>=0) { speex_encoder_ctl(st, SPEEX_SET_QUALITY, &i); speex_encoder_ctl(st, SPEEX_GET_BITRATE, &rate); if (rate <= target) break; i--; } vbr_qual=i; if (vbr_qual<0) vbr_qual=0; speex_encoder_ctl(st, SPEEX_SET_VBR_QUALITY, &vbr_qual); st->abr_count=0; st->abr_drift=0; st->abr_drift2=0; } break; case SPEEX_GET_ABR: (*(spx_int32_t*)ptr) = st->abr_enabled; break; #endif /* #ifndef DISABLE_VBR */ case SPEEX_SET_QUALITY: { spx_int32_t nb_qual; int quality = (*(spx_int32_t*)ptr); if (quality < 0) quality = 0; if (quality > 10) quality = 10; st->submodeSelect = st->submodeID = ((const SpeexSBMode*)(st->mode->mode))->quality_map[quality]; nb_qual = ((const SpeexSBMode*)(st->mode->mode))->low_quality_map[quality]; speex_encoder_ctl(st->st_low, SPEEX_SET_MODE, &nb_qual); } break; case SPEEX_SET_COMPLEXITY: speex_encoder_ctl(st->st_low, SPEEX_SET_COMPLEXITY, ptr); st->complexity = (*(spx_int32_t*)ptr); if (st->complexity<1) st->complexity=1; break; case SPEEX_GET_COMPLEXITY: (*(spx_int32_t*)ptr) = st->complexity; break; case SPEEX_SET_BITRATE: { spx_int32_t i=10; spx_int32_t rate, target; target = (*(spx_int32_t*)ptr); while (i>=0) { speex_encoder_ctl(st, SPEEX_SET_QUALITY, &i); speex_encoder_ctl(st, SPEEX_GET_BITRATE, &rate); if (rate <= target) break; i--; } } break; case SPEEX_GET_BITRATE: speex_encoder_ctl(st->st_low, request, ptr); /*fprintf (stderr, "before: %d\n", (*(int*)ptr));*/ if (st->submodes[st->submodeID]) (*(spx_int32_t*)ptr) += st->sampling_rate*SUBMODE(bits_per_frame)/st->full_frame_size; else (*(spx_int32_t*)ptr) += st->sampling_rate*(SB_SUBMODE_BITS+1)/st->full_frame_size; /*fprintf (stderr, "after: %d\n", (*(int*)ptr));*/ break; case SPEEX_SET_SAMPLING_RATE: { spx_int32_t tmp=(*(spx_int32_t*)ptr); st->sampling_rate = tmp; tmp>>=1; speex_encoder_ctl(st->st_low, SPEEX_SET_SAMPLING_RATE, &tmp); } break; case SPEEX_GET_SAMPLING_RATE: (*(spx_int32_t*)ptr)=st->sampling_rate; break; case SPEEX_RESET_STATE: { int i; st->first = 1; for (i=0;ilpcSize;i++) st->old_lsp[i]= DIV32(MULT16_16(QCONST16(3.1415927f, LSP_SHIFT), i+1), st->lpcSize+1); for (i=0;ilpcSize;i++) st->mem_sw[i]=st->mem_sp[i]=st->mem_sp2[i]=0; for (i=0;ih0_mem[i]=0; } break; case SPEEX_SET_SUBMODE_ENCODING: st->encode_submode = (*(spx_int32_t*)ptr); speex_encoder_ctl(st->st_low, SPEEX_SET_SUBMODE_ENCODING, ptr); break; case SPEEX_GET_SUBMODE_ENCODING: (*(spx_int32_t*)ptr) = st->encode_submode; break; case SPEEX_GET_LOOKAHEAD: speex_encoder_ctl(st->st_low, SPEEX_GET_LOOKAHEAD, ptr); (*(spx_int32_t*)ptr) = 2*(*(spx_int32_t*)ptr) + QMF_ORDER - 1; break; case SPEEX_SET_PLC_TUNING: speex_encoder_ctl(st->st_low, SPEEX_SET_PLC_TUNING, ptr); break; case SPEEX_GET_PLC_TUNING: speex_encoder_ctl(st->st_low, SPEEX_GET_PLC_TUNING, ptr); break; #ifndef DISABLE_VBR case SPEEX_SET_VBR_MAX_BITRATE: { st->vbr_max = (*(spx_int32_t*)ptr); if (SPEEX_SET_VBR_MAX_BITRATE<1) { speex_encoder_ctl(st->st_low, SPEEX_SET_VBR_MAX_BITRATE, &st->vbr_max); st->vbr_max_high = 17600; } else { spx_int32_t low_rate; if (st->vbr_max >= 42200) { st->vbr_max_high = 17600; } else if (st->vbr_max >= 27800) { st->vbr_max_high = 9600; } else if (st->vbr_max > 20600) { st->vbr_max_high = 5600; } else { st->vbr_max_high = 1800; } if (st->subframeSize==80) st->vbr_max_high = 1800; low_rate = st->vbr_max - st->vbr_max_high; speex_encoder_ctl(st->st_low, SPEEX_SET_VBR_MAX_BITRATE, &low_rate); } } break; case SPEEX_GET_VBR_MAX_BITRATE: (*(spx_int32_t*)ptr) = st->vbr_max; break; #endif /* #ifndef DISABLE_VBR */ case SPEEX_SET_HIGHPASS: speex_encoder_ctl(st->st_low, SPEEX_SET_HIGHPASS, ptr); break; case SPEEX_GET_HIGHPASS: speex_encoder_ctl(st->st_low, SPEEX_GET_HIGHPASS, ptr); break; /* This is all internal stuff past this point */ case SPEEX_GET_PI_GAIN: { int i; spx_word32_t *g = (spx_word32_t*)ptr; for (i=0;inbSubframes;i++) g[i]=st->pi_gain[i]; } break; case SPEEX_GET_EXC: { int i; for (i=0;inbSubframes;i++) ((spx_word16_t*)ptr)[i] = st->exc_rms[i]; } break; #ifndef DISABLE_VBR case SPEEX_GET_RELATIVE_QUALITY: (*(float*)ptr)=st->relative_quality; break; #endif /* #ifndef DISABLE_VBR */ case SPEEX_SET_INNOVATION_SAVE: st->innov_rms_save = (spx_word16_t*)ptr; break; case SPEEX_SET_WIDEBAND: speex_encoder_ctl(st->st_low, SPEEX_SET_WIDEBAND, ptr); break; case SPEEX_GET_STACK: *((char**)ptr) = st->stack; break; default: speex_warning_int("Unknown nb_ctl request: ", request); return -1; } return 0; } int sb_encode(void *state, void *vin, SpeexBits *bits) { SBEncState *st; int i, roots, sub; char *stack; VARDECL(spx_mem_t *mem); VARDECL(spx_sig_t *innov); VARDECL(spx_word16_t *target); VARDECL(spx_word16_t *syn_resp); VARDECL(spx_word32_t *low_pi_gain); spx_word16_t *low; spx_word16_t *high; VARDECL(spx_word16_t *low_exc_rms); VARDECL(spx_word16_t *low_innov_rms); const SpeexSBMode *mode; spx_int32_t dtx; spx_word16_t *in = (spx_word16_t*)vin; spx_word16_t e_low=0, e_high=0; VARDECL(spx_coef_t *lpc); VARDECL(spx_coef_t *interp_lpc); VARDECL(spx_coef_t *bw_lpc1); VARDECL(spx_coef_t *bw_lpc2); VARDECL(spx_lsp_t *lsp); VARDECL(spx_lsp_t *qlsp); VARDECL(spx_lsp_t *interp_lsp); VARDECL(spx_lsp_t *interp_qlsp); st = (SBEncState*)state; stack=st->stack; mode = (const SpeexSBMode*)(st->mode->mode); low = in; high = in+st->frame_size; /* High-band buffering / sync with low band */ /* Compute the two sub-bands by filtering with QMF h0*/ qmf_decomp(in, h0, low, high, st->full_frame_size, QMF_ORDER, st->h0_mem, stack); #ifndef DISABLE_VBR if (st->vbr_enabled || st->vad_enabled) { /* Need to compute things here before the signal is trashed by the encoder */ /*FIXME: Are the two signals (low, high) in sync? */ e_low = compute_rms16(low, st->frame_size); e_high = compute_rms16(high, st->frame_size); } #endif /* #ifndef DISABLE_VBR */ ALLOC(low_innov_rms, st->nbSubframes, spx_word16_t); speex_encoder_ctl(st->st_low, SPEEX_SET_INNOVATION_SAVE, low_innov_rms); /* Encode the narrowband part*/ speex_encode_native(st->st_low, low, bits); high = high - (st->windowSize-st->frame_size); SPEEX_COPY(high, st->high, st->windowSize-st->frame_size); SPEEX_COPY(st->high, &high[st->frame_size], st->windowSize-st->frame_size); ALLOC(low_pi_gain, st->nbSubframes, spx_word32_t); ALLOC(low_exc_rms, st->nbSubframes, spx_word16_t); speex_encoder_ctl(st->st_low, SPEEX_GET_PI_GAIN, low_pi_gain); speex_encoder_ctl(st->st_low, SPEEX_GET_EXC, low_exc_rms); speex_encoder_ctl(st->st_low, SPEEX_GET_LOW_MODE, &dtx); if (dtx==0) dtx=1; else dtx=0; ALLOC(lpc, st->lpcSize, spx_coef_t); ALLOC(interp_lpc, st->lpcSize, spx_coef_t); ALLOC(bw_lpc1, st->lpcSize, spx_coef_t); ALLOC(bw_lpc2, st->lpcSize, spx_coef_t); ALLOC(lsp, st->lpcSize, spx_lsp_t); ALLOC(qlsp, st->lpcSize, spx_lsp_t); ALLOC(interp_lsp, st->lpcSize, spx_lsp_t); ALLOC(interp_qlsp, st->lpcSize, spx_lsp_t); { VARDECL(spx_word16_t *autocorr); VARDECL(spx_word16_t *w_sig); ALLOC(autocorr, st->lpcSize+1, spx_word16_t); ALLOC(w_sig, st->windowSize, spx_word16_t); /* Window for analysis */ /* FIXME: This is a kludge */ if (st->subframeSize==80) { for (i=0;iwindowSize;i++) w_sig[i] = EXTRACT16(SHR32(MULT16_16(high[i],st->window[i>>1]),SIG_SHIFT)); } else { for (i=0;iwindowSize;i++) w_sig[i] = EXTRACT16(SHR32(MULT16_16(high[i],st->window[i]),SIG_SHIFT)); } /* Compute auto-correlation */ _spx_autocorr(w_sig, autocorr, st->lpcSize+1, st->windowSize); autocorr[0] = ADD16(autocorr[0],MULT16_16_Q15(autocorr[0],st->lpc_floor)); /* Noise floor in auto-correlation domain */ /* Lag windowing: equivalent to filtering in the power-spectrum domain */ for (i=0;ilpcSize+1;i++) autocorr[i] = MULT16_16_Q14(autocorr[i],st->lagWindow[i]); /* Levinson-Durbin */ _spx_lpc(lpc, autocorr, st->lpcSize); } /* LPC to LSPs (x-domain) transform */ roots=lpc_to_lsp (lpc, st->lpcSize, lsp, 10, LSP_DELTA1, stack); if (roots!=st->lpcSize) { roots = lpc_to_lsp (lpc, st->lpcSize, lsp, 10, LSP_DELTA2, stack); if (roots!=st->lpcSize) { /*If we can't find all LSP's, do some damage control and use a flat filter*/ for (i=0;ilpcSize;i++) { lsp[i]=st->old_lsp[i]; } } } #ifndef DISABLE_VBR /* VBR code */ if ((st->vbr_enabled || st->vad_enabled) && !dtx) { float ratio; if (st->abr_enabled) { float qual_change=0; if (st->abr_drift2 * st->abr_drift > 0) { /* Only adapt if long-term and short-term drift are the same sign */ qual_change = -.00001*st->abr_drift/(1+st->abr_count); if (qual_change>.1) qual_change=.1; if (qual_change<-.1) qual_change=-.1; } st->vbr_quality += qual_change; if (st->vbr_quality>10) st->vbr_quality=10; if (st->vbr_quality<0) st->vbr_quality=0; } ratio = 2*log((1.f+e_high)/(1.f+e_low)); speex_encoder_ctl(st->st_low, SPEEX_GET_RELATIVE_QUALITY, &st->relative_quality); if (ratio<-4) ratio=-4; if (ratio>2) ratio=2; /*if (ratio>-2)*/ if (st->vbr_enabled) { spx_int32_t modeid; modeid = mode->nb_modes-1; st->relative_quality+=1.0*(ratio+2); if (st->relative_quality<-1) st->relative_quality=-1; while (modeid) { int v1; float thresh; v1=(int)floor(st->vbr_quality); if (v1==10) thresh = mode->vbr_thresh[modeid][v1]; else thresh = (st->vbr_quality-v1) * mode->vbr_thresh[modeid][v1+1] + (1+v1-st->vbr_quality) * mode->vbr_thresh[modeid][v1]; if (st->relative_quality >= thresh && st->sampling_rate*st->submodes[modeid]->bits_per_frame/st->full_frame_size <= st->vbr_max_high) break; modeid--; } speex_encoder_ctl(state, SPEEX_SET_HIGH_MODE, &modeid); if (st->abr_enabled) { spx_int32_t bitrate; speex_encoder_ctl(state, SPEEX_GET_BITRATE, &bitrate); st->abr_drift+=(bitrate-st->abr_enabled); st->abr_drift2 = .95*st->abr_drift2 + .05*(bitrate-st->abr_enabled); st->abr_count += 1.0; } } else { /* VAD only */ int modeid; if (st->relative_quality<2.0) modeid=1; else modeid=st->submodeSelect; /*speex_encoder_ctl(state, SPEEX_SET_MODE, &mode);*/ st->submodeID=modeid; } /*fprintf (stderr, "%f %f\n", ratio, low_qual);*/ } #endif /* #ifndef DISABLE_VBR */ if (st->encode_submode) { speex_bits_pack(bits, 1, 1); if (dtx) speex_bits_pack(bits, 0, SB_SUBMODE_BITS); else speex_bits_pack(bits, st->submodeID, SB_SUBMODE_BITS); } /* If null mode (no transmission), just set a couple things to zero*/ if (dtx || st->submodes[st->submodeID] == NULL) { for (i=0;iframe_size;i++) high[i]=VERY_SMALL; for (i=0;ilpcSize;i++) st->mem_sw[i]=0; st->first=1; /* Final signal synthesis from excitation */ iir_mem16(high, st->interp_qlpc, high, st->frame_size, st->lpcSize, st->mem_sp, stack); if (dtx) return 0; else return 1; } /* LSP quantization */ SUBMODE(lsp_quant)(lsp, qlsp, st->lpcSize, bits); if (st->first) { for (i=0;ilpcSize;i++) st->old_lsp[i] = lsp[i]; for (i=0;ilpcSize;i++) st->old_qlsp[i] = qlsp[i]; } ALLOC(mem, st->lpcSize, spx_mem_t); ALLOC(syn_resp, st->subframeSize, spx_word16_t); ALLOC(innov, st->subframeSize, spx_sig_t); ALLOC(target, st->subframeSize, spx_word16_t); for (sub=0;subnbSubframes;sub++) { VARDECL(spx_word16_t *exc); VARDECL(spx_word16_t *res); VARDECL(spx_word16_t *sw); spx_word16_t *sp; spx_word16_t filter_ratio; /*Q7*/ int offset; spx_word32_t rl, rh; /*Q13*/ spx_word16_t eh=0; offset = st->subframeSize*sub; sp=high+offset; ALLOC(exc, st->subframeSize, spx_word16_t); ALLOC(res, st->subframeSize, spx_word16_t); ALLOC(sw, st->subframeSize, spx_word16_t); /* LSP interpolation (quantized and unquantized) */ lsp_interpolate(st->old_lsp, lsp, interp_lsp, st->lpcSize, sub, st->nbSubframes, LSP_MARGIN); lsp_interpolate(st->old_qlsp, qlsp, interp_qlsp, st->lpcSize, sub, st->nbSubframes, LSP_MARGIN); lsp_to_lpc(interp_lsp, interp_lpc, st->lpcSize,stack); lsp_to_lpc(interp_qlsp, st->interp_qlpc, st->lpcSize, stack); bw_lpc(st->gamma1, interp_lpc, bw_lpc1, st->lpcSize); bw_lpc(st->gamma2, interp_lpc, bw_lpc2, st->lpcSize); /* Compute mid-band (4000 Hz for wideband) response of low-band and high-band filters */ st->pi_gain[sub]=LPC_SCALING; rh = LPC_SCALING; for (i=0;ilpcSize;i+=2) { rh += st->interp_qlpc[i+1] - st->interp_qlpc[i]; st->pi_gain[sub] += st->interp_qlpc[i] + st->interp_qlpc[i+1]; } rl = low_pi_gain[sub]; #ifdef FIXED_POINT filter_ratio=EXTRACT16(SATURATE(PDIV32(SHL32(ADD32(rl,82),7),ADD32(82,rh)),32767)); #else filter_ratio=(rl+.01)/(rh+.01); #endif /* Compute "real excitation" */ fir_mem16(sp, st->interp_qlpc, exc, st->subframeSize, st->lpcSize, st->mem_sp2, stack); /* Compute energy of low-band and high-band excitation */ eh = compute_rms16(exc, st->subframeSize); if (!SUBMODE(innovation_quant)) {/* 1 for spectral folding excitation, 0 for stochastic */ spx_word32_t g; /*Q7*/ spx_word16_t el; /*Q0*/ el = low_innov_rms[sub]; /* Gain to use if we want to use the low-band excitation for high-band */ g=PDIV32(MULT16_16(filter_ratio,eh),EXTEND32(ADD16(1,el))); #if 0 { char *tmp_stack=stack; float *tmp_sig; float g2; ALLOC(tmp_sig, st->subframeSize, spx_sig_t); for (i=0;ilpcSize;i++) mem[i]=st->mem_sp[i]; iir_mem2(st->low_innov+offset, st->interp_qlpc, tmp_sig, st->subframeSize, st->lpcSize, mem); g2 = compute_rms(sp, st->subframeSize)/(.01+compute_rms(tmp_sig, st->subframeSize)); /*fprintf (stderr, "gains: %f %f\n", g, g2);*/ g = g2; stack = tmp_stack; } #endif /*print_vec(&g, 1, "gain factor");*/ /* Gain quantization */ { int quant = scal_quant(g, fold_quant_bound, 32); /*speex_warning_int("tata", quant);*/ if (quant<0) quant=0; if (quant>31) quant=31; speex_bits_pack(bits, quant, 5); } if (st->innov_rms_save) { st->innov_rms_save[sub] = eh; } st->exc_rms[sub] = eh; } else { spx_word16_t gc; /*Q7*/ spx_word32_t scale; /*Q14*/ spx_word16_t el; /*Q0*/ el = low_exc_rms[sub]; /*Q0*/ gc = PDIV32_16(MULT16_16(filter_ratio,1+eh),1+el); /* This is a kludge that cleans up a historical bug */ if (st->subframeSize==80) gc = MULT16_16_P15(QCONST16(0.70711f,15),gc); /*printf ("%f %f %f %f\n", el, eh, filter_ratio, gc);*/ { int qgc = scal_quant(gc, gc_quant_bound, 16); speex_bits_pack(bits, qgc, 4); gc = MULT16_16_Q15(QCONST16(0.87360,15),gc_quant_bound[qgc]); } if (st->subframeSize==80) gc = MULT16_16_P14(QCONST16(1.4142f,14), gc); scale = SHL32(MULT16_16(PDIV32_16(SHL32(EXTEND32(gc),SIG_SHIFT-6),filter_ratio),(1+el)),6); compute_impulse_response(st->interp_qlpc, bw_lpc1, bw_lpc2, syn_resp, st->subframeSize, st->lpcSize, stack); /* Reset excitation */ for (i=0;isubframeSize;i++) res[i]=VERY_SMALL; /* Compute zero response (ringing) of A(z/g1) / ( A(z/g2) * Aq(z) ) */ for (i=0;ilpcSize;i++) mem[i]=st->mem_sp[i]; iir_mem16(res, st->interp_qlpc, res, st->subframeSize, st->lpcSize, mem, stack); for (i=0;ilpcSize;i++) mem[i]=st->mem_sw[i]; filter_mem16(res, bw_lpc1, bw_lpc2, res, st->subframeSize, st->lpcSize, mem, stack); /* Compute weighted signal */ for (i=0;ilpcSize;i++) mem[i]=st->mem_sw[i]; filter_mem16(sp, bw_lpc1, bw_lpc2, sw, st->subframeSize, st->lpcSize, mem, stack); /* Compute target signal */ for (i=0;isubframeSize;i++) target[i]=SUB16(sw[i],res[i]); signal_div(target, target, scale, st->subframeSize); /* Reset excitation */ SPEEX_MEMSET(innov, 0, st->subframeSize); /*print_vec(target, st->subframeSize, "\ntarget");*/ SUBMODE(innovation_quant)(target, st->interp_qlpc, bw_lpc1, bw_lpc2, SUBMODE(innovation_params), st->lpcSize, st->subframeSize, innov, syn_resp, bits, stack, st->complexity, SUBMODE(double_codebook)); /*print_vec(target, st->subframeSize, "after");*/ signal_mul(innov, innov, scale, st->subframeSize); if (SUBMODE(double_codebook)) { char *tmp_stack=stack; VARDECL(spx_sig_t *innov2); ALLOC(innov2, st->subframeSize, spx_sig_t); SPEEX_MEMSET(innov2, 0, st->subframeSize); for (i=0;isubframeSize;i++) target[i]=MULT16_16_P13(QCONST16(2.5f,13), target[i]); SUBMODE(innovation_quant)(target, st->interp_qlpc, bw_lpc1, bw_lpc2, SUBMODE(innovation_params), st->lpcSize, st->subframeSize, innov2, syn_resp, bits, stack, st->complexity, 0); signal_mul(innov2, innov2, MULT16_32_P15(QCONST16(0.4f,15),scale), st->subframeSize); for (i=0;isubframeSize;i++) innov[i] = ADD32(innov[i],innov2[i]); stack = tmp_stack; } for (i=0;isubframeSize;i++) exc[i] = PSHR32(innov[i],SIG_SHIFT); if (st->innov_rms_save) { st->innov_rms_save[sub] = MULT16_16_Q15(QCONST16(.70711f, 15), compute_rms(innov, st->subframeSize)); } st->exc_rms[sub] = compute_rms16(exc, st->subframeSize); } /*Keep the previous memory*/ for (i=0;ilpcSize;i++) mem[i]=st->mem_sp[i]; /* Final signal synthesis from excitation */ iir_mem16(exc, st->interp_qlpc, sp, st->subframeSize, st->lpcSize, st->mem_sp, stack); /* Compute weighted signal again, from synthesized speech (not sure it's the right thing) */ filter_mem16(sp, bw_lpc1, bw_lpc2, sw, st->subframeSize, st->lpcSize, st->mem_sw, stack); } for (i=0;ilpcSize;i++) st->old_lsp[i] = lsp[i]; for (i=0;ilpcSize;i++) st->old_qlsp[i] = qlsp[i]; st->first=0; return 1; } #endif /* DISABLE_ENCODER */ #ifndef DISABLE_DECODER void *sb_decoder_init(const SpeexMode *m) { spx_int32_t tmp; SBDecState *st; const SpeexSBMode *mode; st = (SBDecState*)speex_alloc(sizeof(SBDecState)); if (!st) return NULL; st->mode = m; mode=(const SpeexSBMode*)m->mode; st->encode_submode = 1; st->st_low = speex_decoder_init(mode->nb_mode); #if defined(VAR_ARRAYS) || defined (USE_ALLOCA) st->stack = NULL; #else /*st->stack = (char*)speex_alloc_scratch(SB_DEC_STACK);*/ speex_decoder_ctl(st->st_low, SPEEX_GET_STACK, &st->stack); #endif st->full_frame_size = 2*mode->frameSize; st->frame_size = mode->frameSize; st->subframeSize = mode->subframeSize; st->nbSubframes = mode->frameSize/mode->subframeSize; st->lpcSize=mode->lpcSize; speex_decoder_ctl(st->st_low, SPEEX_GET_SAMPLING_RATE, &st->sampling_rate); st->sampling_rate*=2; tmp=1; speex_decoder_ctl(st->st_low, SPEEX_SET_WIDEBAND, &tmp); st->submodes=mode->submodes; st->submodeID=mode->defaultSubmode; st->first=1; st->g0_mem = (spx_word16_t*)speex_alloc((QMF_ORDER)*sizeof(spx_word16_t)); st->g1_mem = (spx_word16_t*)speex_alloc((QMF_ORDER)*sizeof(spx_word16_t)); st->excBuf = (spx_word16_t*)speex_alloc((st->subframeSize)*sizeof(spx_word16_t)); st->old_qlsp = (spx_lsp_t*)speex_alloc((st->lpcSize)*sizeof(spx_lsp_t)); st->interp_qlpc = (spx_coef_t*)speex_alloc(st->lpcSize*sizeof(spx_coef_t)); st->pi_gain = (spx_word32_t*)speex_alloc((st->nbSubframes)*sizeof(spx_word32_t)); st->exc_rms = (spx_word16_t*)speex_alloc((st->nbSubframes)*sizeof(spx_word16_t)); st->mem_sp = (spx_mem_t*)speex_alloc((2*st->lpcSize)*sizeof(spx_mem_t)); st->innov_save = NULL; st->lpc_enh_enabled=0; st->seed = 1000; #ifdef ENABLE_VALGRIND VALGRIND_MAKE_READABLE(st, (st->stack-(char*)st)); #endif return st; } void sb_decoder_destroy(void *state) { SBDecState *st; st = (SBDecState*)state; speex_decoder_destroy(st->st_low); #if !(defined(VAR_ARRAYS) || defined (USE_ALLOCA)) /*speex_free_scratch(st->stack);*/ #endif speex_free(st->g0_mem); speex_free(st->g1_mem); speex_free(st->excBuf); speex_free(st->old_qlsp); speex_free(st->interp_qlpc); speex_free(st->pi_gain); speex_free(st->exc_rms); speex_free(st->mem_sp); speex_free(state); } int sb_decoder_ctl(void *state, int request, void *ptr) { SBDecState *st; st=(SBDecState*)state; switch(request) { case SPEEX_SET_HIGH_MODE: st->submodeID = (*(spx_int32_t*)ptr); break; case SPEEX_SET_LOW_MODE: speex_decoder_ctl(st->st_low, SPEEX_SET_LOW_MODE, ptr); break; case SPEEX_GET_LOW_MODE: speex_decoder_ctl(st->st_low, SPEEX_GET_LOW_MODE, ptr); break; case SPEEX_GET_FRAME_SIZE: (*(spx_int32_t*)ptr) = st->full_frame_size; break; case SPEEX_SET_ENH: speex_decoder_ctl(st->st_low, request, ptr); st->lpc_enh_enabled = *((spx_int32_t*)ptr); break; case SPEEX_GET_ENH: *((spx_int32_t*)ptr) = st->lpc_enh_enabled; break; case SPEEX_SET_MODE: case SPEEX_SET_QUALITY: { spx_int32_t nb_qual; int quality = (*(spx_int32_t*)ptr); if (quality < 0) quality = 0; if (quality > 10) quality = 10; st->submodeID = ((const SpeexSBMode*)(st->mode->mode))->quality_map[quality]; nb_qual = ((const SpeexSBMode*)(st->mode->mode))->low_quality_map[quality]; speex_decoder_ctl(st->st_low, SPEEX_SET_MODE, &nb_qual); } break; case SPEEX_GET_BITRATE: speex_decoder_ctl(st->st_low, request, ptr); if (st->submodes[st->submodeID]) (*(spx_int32_t*)ptr) += st->sampling_rate*SUBMODE(bits_per_frame)/st->full_frame_size; else (*(spx_int32_t*)ptr) += st->sampling_rate*(SB_SUBMODE_BITS+1)/st->full_frame_size; break; case SPEEX_SET_SAMPLING_RATE: { spx_int32_t tmp=(*(spx_int32_t*)ptr); st->sampling_rate = tmp; tmp>>=1; speex_decoder_ctl(st->st_low, SPEEX_SET_SAMPLING_RATE, &tmp); } break; case SPEEX_GET_SAMPLING_RATE: (*(spx_int32_t*)ptr)=st->sampling_rate; break; case SPEEX_SET_HANDLER: speex_decoder_ctl(st->st_low, SPEEX_SET_HANDLER, ptr); break; case SPEEX_SET_USER_HANDLER: speex_decoder_ctl(st->st_low, SPEEX_SET_USER_HANDLER, ptr); break; case SPEEX_RESET_STATE: { int i; for (i=0;i<2*st->lpcSize;i++) st->mem_sp[i]=0; for (i=0;ig0_mem[i]=st->g1_mem[i]=0; st->last_ener=0; } break; case SPEEX_SET_SUBMODE_ENCODING: st->encode_submode = (*(spx_int32_t*)ptr); speex_decoder_ctl(st->st_low, SPEEX_SET_SUBMODE_ENCODING, ptr); break; case SPEEX_GET_SUBMODE_ENCODING: (*(spx_int32_t*)ptr) = st->encode_submode; break; case SPEEX_GET_LOOKAHEAD: speex_decoder_ctl(st->st_low, SPEEX_GET_LOOKAHEAD, ptr); (*(spx_int32_t*)ptr) = 2*(*(spx_int32_t*)ptr); break; case SPEEX_SET_HIGHPASS: speex_decoder_ctl(st->st_low, SPEEX_SET_HIGHPASS, ptr); break; case SPEEX_GET_HIGHPASS: speex_decoder_ctl(st->st_low, SPEEX_GET_HIGHPASS, ptr); break; case SPEEX_GET_ACTIVITY: speex_decoder_ctl(st->st_low, SPEEX_GET_ACTIVITY, ptr); break; case SPEEX_GET_PI_GAIN: { int i; spx_word32_t *g = (spx_word32_t*)ptr; for (i=0;inbSubframes;i++) g[i]=st->pi_gain[i]; } break; case SPEEX_GET_EXC: { int i; for (i=0;inbSubframes;i++) ((spx_word16_t*)ptr)[i] = st->exc_rms[i]; } break; case SPEEX_GET_DTX_STATUS: speex_decoder_ctl(st->st_low, SPEEX_GET_DTX_STATUS, ptr); break; case SPEEX_SET_INNOVATION_SAVE: st->innov_save = (spx_word16_t*)ptr; break; case SPEEX_SET_WIDEBAND: speex_decoder_ctl(st->st_low, SPEEX_SET_WIDEBAND, ptr); break; case SPEEX_GET_STACK: *((char**)ptr) = st->stack; break; default: speex_warning_int("Unknown nb_ctl request: ", request); return -1; } return 0; } static void sb_decode_lost(SBDecState *st, spx_word16_t *out, int dtx, char *stack) { int i; int saved_modeid=0; if (dtx) { saved_modeid=st->submodeID; st->submodeID=1; } else { bw_lpc(QCONST16(0.99f,15), st->interp_qlpc, st->interp_qlpc, st->lpcSize); } st->first=1; /* Final signal synthesis from excitation */ if (!dtx) { st->last_ener = MULT16_16_Q15(QCONST16(.9f,15),st->last_ener); } for (i=0;iframe_size;i++) out[i+st->frame_size] = speex_rand(st->last_ener, &st->seed); iir_mem16(out+st->frame_size, st->interp_qlpc, out+st->frame_size, st->frame_size, st->lpcSize, st->mem_sp, stack); /* Reconstruct the original */ qmf_synth(out, out+st->frame_size, h0, out, st->full_frame_size, QMF_ORDER, st->g0_mem, st->g1_mem, stack); if (dtx) { st->submodeID=saved_modeid; } return; } int sb_decode(void *state, SpeexBits *bits, void *vout) { int i, sub; SBDecState *st; int wideband; int ret; char *stack; VARDECL(spx_word32_t *low_pi_gain); VARDECL(spx_word16_t *low_exc_rms); VARDECL(spx_coef_t *ak); VARDECL(spx_lsp_t *qlsp); VARDECL(spx_lsp_t *interp_qlsp); spx_int32_t dtx; const SpeexSBMode *mode; spx_word16_t *out = (spx_word16_t*)vout; spx_word16_t *low_innov_alias; spx_word32_t exc_ener_sum = 0; st = (SBDecState*)state; stack=st->stack; mode = (const SpeexSBMode*)(st->mode->mode); low_innov_alias = out+st->frame_size; speex_decoder_ctl(st->st_low, SPEEX_SET_INNOVATION_SAVE, low_innov_alias); /* Decode the low-band */ ret = speex_decode_native(st->st_low, bits, out); speex_decoder_ctl(st->st_low, SPEEX_GET_DTX_STATUS, &dtx); /* If error decoding the narrowband part, propagate error */ if (ret!=0) { return ret; } if (!bits) { sb_decode_lost(st, out, dtx, stack); return 0; } if (st->encode_submode) { /*Check "wideband bit"*/ if (speex_bits_remaining(bits)>0) wideband = speex_bits_peek(bits); else wideband = 0; if (wideband) { /*Regular wideband frame, read the submode*/ wideband = speex_bits_unpack_unsigned(bits, 1); st->submodeID = speex_bits_unpack_unsigned(bits, SB_SUBMODE_BITS); } else { /*Was a narrowband frame, set "null submode"*/ st->submodeID = 0; } if (st->submodeID != 0 && st->submodes[st->submodeID] == NULL) { speex_notify("Invalid mode encountered. The stream is corrupted."); return -2; } } /* If null mode (no transmission), just set a couple things to zero*/ if (st->submodes[st->submodeID] == NULL) { if (dtx) { sb_decode_lost(st, out, 1, stack); return 0; } for (i=0;iframe_size;i++) out[st->frame_size+i]=VERY_SMALL; st->first=1; /* Final signal synthesis from excitation */ iir_mem16(out+st->frame_size, st->interp_qlpc, out+st->frame_size, st->frame_size, st->lpcSize, st->mem_sp, stack); qmf_synth(out, out+st->frame_size, h0, out, st->full_frame_size, QMF_ORDER, st->g0_mem, st->g1_mem, stack); return 0; } ALLOC(low_pi_gain, st->nbSubframes, spx_word32_t); ALLOC(low_exc_rms, st->nbSubframes, spx_word16_t); speex_decoder_ctl(st->st_low, SPEEX_GET_PI_GAIN, low_pi_gain); speex_decoder_ctl(st->st_low, SPEEX_GET_EXC, low_exc_rms); ALLOC(qlsp, st->lpcSize, spx_lsp_t); ALLOC(interp_qlsp, st->lpcSize, spx_lsp_t); SUBMODE(lsp_unquant)(qlsp, st->lpcSize, bits); if (st->first) { for (i=0;ilpcSize;i++) st->old_qlsp[i] = qlsp[i]; } ALLOC(ak, st->lpcSize, spx_coef_t); for (sub=0;subnbSubframes;sub++) { VARDECL(spx_word32_t *exc); spx_word16_t *innov_save=NULL; spx_word16_t *sp; spx_word16_t filter_ratio; spx_word16_t el=0; int offset; spx_word32_t rl=0,rh=0; offset = st->subframeSize*sub; sp=out+st->frame_size+offset; ALLOC(exc, st->subframeSize, spx_word32_t); /* Pointer for saving innovation */ if (st->innov_save) { innov_save = st->innov_save+2*offset; SPEEX_MEMSET(innov_save, 0, 2*st->subframeSize); } /* LSP interpolation */ lsp_interpolate(st->old_qlsp, qlsp, interp_qlsp, st->lpcSize, sub, st->nbSubframes, LSP_MARGIN); /* LSP to LPC */ lsp_to_lpc(interp_qlsp, ak, st->lpcSize, stack); /* Calculate reponse ratio between the low and high filter in the middle of the band (4000 Hz) */ st->pi_gain[sub]=LPC_SCALING; rh = LPC_SCALING; for (i=0;ilpcSize;i+=2) { rh += ak[i+1] - ak[i]; st->pi_gain[sub] += ak[i] + ak[i+1]; } rl = low_pi_gain[sub]; #ifdef FIXED_POINT filter_ratio=EXTRACT16(SATURATE(PDIV32(SHL32(ADD32(rl,82),7),ADD32(82,rh)),32767)); #else filter_ratio=(rl+.01)/(rh+.01); #endif SPEEX_MEMSET(exc, 0, st->subframeSize); if (!SUBMODE(innovation_unquant)) { spx_word32_t g; int quant; quant = speex_bits_unpack_unsigned(bits, 5); g= spx_exp(MULT16_16(QCONST16(.125f,11),(quant-10))); g = PDIV32(g, filter_ratio); for (i=0;isubframeSize;i+=2) { exc[i]=SHL32(MULT16_32_P15(MULT16_16_Q15(mode->folding_gain,low_innov_alias[offset+i]),SHL32(g,6)),SIG_SHIFT); exc[i+1]=NEG32(SHL32(MULT16_32_P15(MULT16_16_Q15(mode->folding_gain,low_innov_alias[offset+i+1]),SHL32(g,6)),SIG_SHIFT)); } } else { spx_word16_t gc; spx_word32_t scale; int qgc = speex_bits_unpack_unsigned(bits, 4); el = low_exc_rms[sub]; gc = MULT16_16_Q15(QCONST16(0.87360,15),gc_quant_bound[qgc]); if (st->subframeSize==80) gc = MULT16_16_P14(QCONST16(1.4142f,14),gc); scale = SHL32(PDIV32(SHL32(MULT16_16(gc, el),3), filter_ratio),SIG_SHIFT-3); SUBMODE(innovation_unquant)(exc, SUBMODE(innovation_params), st->subframeSize, bits, stack, &st->seed); signal_mul(exc,exc,scale,st->subframeSize); if (SUBMODE(double_codebook)) { char *tmp_stack=stack; VARDECL(spx_sig_t *innov2); ALLOC(innov2, st->subframeSize, spx_sig_t); SPEEX_MEMSET(innov2, 0, st->subframeSize); SUBMODE(innovation_unquant)(innov2, SUBMODE(innovation_params), st->subframeSize, bits, stack, &st->seed); signal_mul(innov2, innov2, MULT16_32_P15(QCONST16(0.4f,15),scale), st->subframeSize); for (i=0;isubframeSize;i++) exc[i] = ADD32(exc[i],innov2[i]); stack = tmp_stack; } } if (st->innov_save) { for (i=0;isubframeSize;i++) innov_save[2*i]=EXTRACT16(PSHR32(exc[i],SIG_SHIFT)); } iir_mem16(st->excBuf, st->interp_qlpc, sp, st->subframeSize, st->lpcSize, st->mem_sp, stack); for (i=0;isubframeSize;i++) st->excBuf[i]=EXTRACT16(PSHR32(exc[i],SIG_SHIFT)); for (i=0;ilpcSize;i++) st->interp_qlpc[i] = ak[i]; st->exc_rms[sub] = compute_rms16(st->excBuf, st->subframeSize); exc_ener_sum = ADD32(exc_ener_sum, DIV32(MULT16_16(st->exc_rms[sub],st->exc_rms[sub]), st->nbSubframes)); } st->last_ener = spx_sqrt(exc_ener_sum); qmf_synth(out, out+st->frame_size, h0, out, st->full_frame_size, QMF_ORDER, st->g0_mem, st->g1_mem, stack); for (i=0;ilpcSize;i++) st->old_qlsp[i] = qlsp[i]; st->first=0; return 0; } #endif /* DISABLE_DECODER */ #endif mumble-1.3.4/3rdparty/speex-src/libspeex/filters_bfin.h0000664000175000017500000003413514010707304022755 0ustar builderbuilder/* Copyright (C) 2005 Analog Devices */ /** @file filters_bfin.h @brief Various analysis/synthesis filters (Blackfin version) */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "bfin.h" #define OVERRIDE_NORMALIZE16 int normalize16(const spx_sig_t *x, spx_word16_t *y, spx_sig_t max_scale, int len) { spx_sig_t max_val=1; int sig_shift; __asm__ ( "%0 = 0;\n\t" "I0 = %1;\n\t" "L0 = 0;\n\t" "R1 = [I0++];\n\t" "LOOP norm_max%= LC0 = %2;\n\t" "LOOP_BEGIN norm_max%=;\n\t" "R2 = ABS R1 || R1 = [I0++];\n\t" "%0 = MAX(%0, R2);\n\t" "LOOP_END norm_max%=;\n\t" : "=&d" (max_val) : "a" (x), "a" (len) : "R1", "R2", "ASTAT" BFIN_HWLOOP0_REGS ); sig_shift=0; while (max_val>max_scale) { sig_shift++; max_val >>= 1; } __asm__ __volatile__ ( "I0 = %0;\n\t" "L0 = 0;\n\t" "P1 = %1;\n\t" "R0 = [I0++];\n\t" "LOOP norm_shift%= LC0 = %3;\n\t" "LOOP_BEGIN norm_shift%=;\n\t" "R1 = ASHIFT R0 by %2.L || R0 = [I0++];\n\t" "W[P1++] = R1;\n\t" "LOOP_END norm_shift%=;\n\t" "R1 = ASHIFT R0 by %2.L;\n\t" "W[P1++] = R1;\n\t" : : "a" (x), "a" (y), "d" (-sig_shift), "a" (len-1) : "I0", "L0", "P1", "R0", "R1", "memory", "ASTAT" BFIN_HWLOOP0_REGS ); return sig_shift; } #define OVERRIDE_FILTER_MEM16 void filter_mem16(const spx_word16_t *_x, const spx_coef_t *num, const spx_coef_t *den, spx_word16_t *_y, int N, int ord, spx_mem_t *mem, char *stack) { VARDECL(spx_word32_t *xy2); VARDECL(spx_word32_t *numden_a); spx_word32_t *xy; spx_word16_t *numden; int i; ALLOC(xy2, (N+1), spx_word32_t); ALLOC(numden_a, (2*ord+2), spx_word32_t); xy = xy2+1; numden = (spx_word16_t*) numden_a; for (i=0;i>> 13;\n\t" "W[%0] = R3.L;\n\t" "R0 <<= 1;\n\t" "R1 = R1 + R0;\n\t" "R1 >>>= 13;\n\t" "W[%1] = R1.L;\n\t" "LOOP_END samples%=;\n\t" : "=a" (ytmp2), "=a" (y) : "a" (awk2), "a" (ak), "d" (ord), "m" (N), "0" (ytmp2), "1" (y) : "A0", "A1", "R0", "R1", "R2", "R3", "I0", "I1", "I2", "I3", "L0", "L1", "L2", "L3", "ASTAT" BFIN_HWLOOP0_REGS BFIN_HWLOOP1_REGS ); } #if 0 /* Equivalent C function for filter_mem2 and compute_impulse_response */ #define min(a,b) ((a)<(b) ? (a):(b)) void compute_impulse_response(const spx_coef_t *ak, const spx_coef_t *awk1, const spx_coef_t *awk2, spx_word16_t *y, int N, int ord, char *stack) { int i,j; VARDECL(spx_word16_t *ytmp); ALLOC(ytmp, N, spx_word16_t); y[0] = LPC_SCALING; for (i=0;i 0.5.2 - Added buildroot and docdir and ldconfig. Makes it builadble by non-roots and also doesn't write to actual library paths when building. %prep %setup %build export CFLAGS='-O3' ./configure --prefix=/usr --enable-shared --enable-static make %install rm -rf $RPM_BUILD_ROOT make DESTDIR=$RPM_BUILD_ROOT install %post -p /sbin/ldconfig %postun -p /sbin/ldconfig %files %defattr(644,root,root,755) %doc COPYING AUTHORS ChangeLog NEWS README %doc doc/manual.pdf /usr/share/man/man1/speexenc.1* /usr/share/man/man1/speexdec.1* %attr(755,root,root) %{_bindir}/speex* %attr(755,root,root) %{_libdir}/libspeex*.so* %files devel %defattr(644,root,root,755) %attr(755,root,root) %{_libdir}/libspeex*.la %{_includedir}/speex/speex*.h /usr/share/aclocal/speex.m4 %{_libdir}/pkgconfig/speex.pc %{_libdir}/pkgconfig/speexdsp.pc %{_libdir}/libspeex*.a mumble-1.3.4/3rdparty/speex-src/.cvsignore0000664000175000017500000000027114010707304020315 0ustar builderbuilderMakefile Makefile.in Speex.spec aclocal.m4 autom4te.cache config.guess config.log config.status config.sub configure depcomp install-sh libtool ltconfig ltmain.sh missing mkinstalldirs mumble-1.3.4/3rdparty/speex-src/README.Trimedia0000664000175000017500000001427114010707304020737 0ustar builderbuilder################# REMOVE warnings on trimedia compiler ############################## ################# Not critical to compilation ############################## 1. Change the following statements to remove warning for constant expression (i) mdf.c [if(0) --> #if 0] (ii) ltp.c [if(1) --> #if 1] (iii) preprocess.c [if(1) --> #if 1] (iv) sb_celp.c [if (SPEEX_SET_VBR_MAX_BITRATE<1) --> #if (SPEEX_SET_VBR_MAX_BITRATE<1)] 2. add REMARK_ON macro to remove warning on not reference variable -- uses (void) to remove warning on not referenced variable -- #define REMARK_ON -- (void) -- #endif -- search for REMARK_ON on the following files (i) jitter.c (ii) lsp.c (iii) ltp.c (iv) mdf.c (v) filters.c (vi) filterbank.c (vii) cb_search.c (viii) vq.c (ix) vbr.c (x) stereo.c (xi) speex_callbacks.c (xii) preprocess.c 3. commented out the following in pseudofloat.h for unused variable //static const spx_float_t FLOAT_HALF = {16384,-15}; 4. commented out unused variable in nb_celp.c //spx_word16_t *sp; ***unused variable*** //sp=out+offset; ***unused variable*** //int submode; ***unused variable*** // ***unused variable*** // advance = submode = speex_bits_unpack_unsigned(bits, SB_SUBMODE_BITS); advance = speex_bits_unpack_unsigned(bits, SB_SUBMODE_BITS); // ***unused variable*** //advance = submode = speex_bits_unpack_unsigned(bits, SB_SUBMODE_BITS); advance = speex_bits_unpack_unsigned(bits, SB_SUBMODE_BITS); // spx_word16_t *exc; ***unused variable*** // exc=st->exc+offset; ***unused variable*** 5. commented out unused variable in vbr.c //int va; ***unused variable*** //va = 0; ***unused variable*** //va = 1; ***unused variable*** 6. added HAVE_CONFIG into medfilter.c ################# Patches for trimedia compiler ############################## ################# Critical to compilation ############################## -- change the following in modes.c and speex.h as compiler does not support const * const... (i) modes.c #ifdef __TCS__ const SpeexMode * speex_mode_list[SPEEX_NB_MODES] = {&speex_nb_mode, &speex_wb_mode, &speex_uwb_mode}; #else const SpeexMode * const speex_mode_list[SPEEX_NB_MODES] = {&speex_nb_mode, &speex_wb_mode, &speex_uwb_mode}; #endif (ii) speex.h #ifdef __TCS__ extern const SpeexMode * speex_mode_list[SPEEX_NB_MODES]; #else extern const SpeexMode * const speex_mode_list[SPEEX_NB_MODES]; #endif -- added the #elif defined (TM_ASM) to the following files for optimized codes (1) arch.h (2) cb_search.c (3) fftwrap.c (4) filterbank.c (5) filters.c (6) kiss_fft.c (7) kiss_fftr.c (8) lpc.c (9) lsp.c (10) ltp.c (11) mdf.c (12) misc.c (13) preprocess.c (14) quant_lsp.c (15) vq.c -- reorder macro definations in quant_lsp.c #ifdef FIXED_POINT #define LSP_LINEAR(i) (SHL16(i+1,11)) #define LSP_LINEAR_HIGH(i) (ADD16(MULT16_16_16(i,2560),6144)) #define LSP_DIV_256(x) (SHL16((spx_word16_t)x, 5)) #define LSP_DIV_512(x) (SHL16((spx_word16_t)x, 4)) #define LSP_DIV_1024(x) (SHL16((spx_word16_t)x, 3)) #define LSP_PI 25736 #else #define LSP_LINEAR(i) (.25*(i)+.25) #define LSP_LINEAR_HIGH(i) (.3125*(i)+.75) #define LSP_SCALE 256. #define LSP_DIV_256(x) (0.0039062*(x)) #define LSP_DIV_512(x) (0.0019531*(x)) #define LSP_DIV_1024(x) (0.00097656*(x)) #define LSP_PI M_PI #endif #ifdef BFIN_ASM #include "quant_lsp_bfin.h" #elif defined (TM_ASM) #include "quant_lsp_tm.h" #endif -- added macro PREPROCESS_MDF_FLOAT to allow using of floating point -- in mdf and preprocess while keeping fixed point in encoder/decoder -- This is due to the fact that preprocess/mdf run faster on floating -- point on trimedia -- added the following 3 lines to the files below #ifdef PREPROCESS_MDF_FLOAT #undef FIXED_POINT #endif (1) mdf.c (2) preprocess.c (3) filterbank.c (4) fftwrap.c (5) kiss_fft.c (6) kiss_fftr.c -- created a new USE_COMPACT_KISS_FFT for fftwrap.c and shifted defination -- to config file so that user configure the usage of fft on config.h -- TOEXPLORE:is it possible to share table between mdf/preprocess? -- Introducing this macro made the following changes in C code -- New macro to facilitate integration (grouping real/complex for dc and nyquist frequency seems to require a large amount of memory for mdf, therefore did not made the changes for that) (1) modify preprocess.c on init and destroy (2) modify mdf.c on init and destroy (3) shifted power_spectrum to fftwrap.c to share optimised code between preprocess.c and mdf.c ################# NOTES ############################## (1) fixed point encoding/decoding is tested on narrowband - some of the QX fractions are packed together to (frac1 * a + frac2 * a) >> X (should be more accurate in rounding) instead of ((frac1 * a) >> X) + ((frac2 * a) >> X) will cause some different between optimized and unoptimized code. tried decoding/encoding optimized code on some audio files retains the clearity of the word - wideband/ultrawideband is not heavily tested yet (2) optimized fixed point code requires memory alignment - used config to debug on functions where memory is not align (3) floating point optimization for preprocess/mdf is tested fixed point is not tested yet (except fft/filterbank) Note (1) also applies to sround in fft for fixed point some optimization is provided for fixed point as it requires lesser memory compared to floating point. (4) unroll configurations provided to reduce code size if required (5) use profile options only if compiler profiling fails to work (6) can't include the makefile as it is close proprietary ################# TODO:For Trimedia ############################## (1) Possible add TSSA wrapper for codec but don't think this can be open source. (2) Optimizations for fixed point in mdf/preprocess ################# Added Files ############################## - _kiss_fft_guts_tm.h - cb_search_tm.h - fftwrap_tm.h - filterbank_tm.h - filters_tm.h - fixed_tm.h - kiss_fft_tm.h - kiss_fftr_tm.h - lpc_tm.h - lsp_tm.h - ltp_tm.h - mdf_tm.h - misc_tm.h - preprocess_tm.h - profile_tm.h - quant_lsp_tm.h - vq_tm.h - config.h - speex_config_types.h mumble-1.3.4/3rdparty/speex-src/COPYING0000664000175000017500000000335614010707304017357 0ustar builderbuilderCopyright 2002-2008 Xiph.org Foundation Copyright 2002-2008 Jean-Marc Valin Copyright 2005-2007 Analog Devices Inc. Copyright 2005-2008 Commonwealth Scientific and Industrial Research Organisation (CSIRO) Copyright 1993, 2002, 2006 David Rowe Copyright 2003 EpicGames Copyright 1992-1994 Jutta Degener, Carsten Bormann Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. mumble-1.3.4/3rdparty/speex-src/INSTALL0000664000175000017500000000030614010707304017345 0ustar builderbuilderInstalling Speex is as easy as: % ./configure [--prefix=] % make % make install Note that if you are using the code from Git, you will need to run "autogen.sh" and then "configure". mumble-1.3.4/3rdparty/speex-src/speex.pc.in0000664000175000017500000000045514010707304020376 0ustar builderbuilder# libspeex pkg-config source file prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: speex Description: Speex is an audio codec tuned for speech Version: @SPEEX_VERSION@ Requires: Conflicts: Libs: -L${libdir} -lspeex Libs.private: @LIBM@ Cflags: -I${includedir} mumble-1.3.4/3rdparty/speex-src/html/0000775000175000017500000000000014010707304017261 5ustar builderbuildermumble-1.3.4/3rdparty/speex-src/html/speex.png0000664000175000017500000001056614010707304021123 0ustar builderbuilderPNG  IHDRWF*bKGD pHYs  ~tIME@VIDATx]}lUE?, hPl HBX>!#6fAb5uY|li *A>dE,n*6]!A$H,bA,"Yu{s̛9woΜ93^̵Q%[Tuqpb@ rC@ -rȦfWY.up0E#$ɺ<Ә"~cup0#vp1CO4r-c98e\*6p@b/m `88d7p>CFPkr\C0q lc&WDIx;VϿ.5 yubD] 1jT3vQAcŠ>x\-l"We|:9\ ȒAeuё.lLF;-hmN%ڂ ΂ۂ'bxֶ f6dSG up'4.~kjQN<ąmVV>xnS] "j QV Iʬ\ZFoSr"e*kd^b6@rb(/vų!-xb7xWRʦWՉDNAH{ # RB֏2RrH%[rgVYCϓ.lNl㊟U2}c! r|e[f,ZTq_ݬ32VGPm(U:G}Q ÷A6X c"lUE$wA֑ '.l`oivvPfAO19lAy{ 7O\ٽ2b `uB|,1e;dDFzCFn"+S`5kCfy!jq Dݼ Jlg:K]0]Vïtjrk"d$H2d=JKWܺDNG57+&1O57@+x,# UVҦ*;}1Qhw:*yY#{mH $xo)$^+{@] &"m^xhxw)is m`T 6h{饗iɋc"57N:Uz?9Bt(UVV͟ΞݮJ0`""4Bu0-"}mH Q׮OH'" .\/Q.X,X oVHW/thlhooX,vG9sWfbMM˗HnM&zjb.M_|OD[NuuuŠf5kaE䮮&{JO> `ԨQuWJAݛ| C "QL ޚXH(tIQ(AkI'/廔޽{=i2r֭4s[cC|+++}W^^NttgJ4v?Y)n t^Է/HB~ ܻiSQA?l>]dvgw:N3gzDΛ'pK.\`jZlŎmh@?x0ë rM~VF[Rr3B#"DOGv3H};ϑẗ́# B4tM)+󲢢`z\x@<' /Zh'㭌"#?o>}B'TWEƪib\ֶ`)ϡ-sϞ)O{yp2? a #GY!ăJK dZ[FLNGHY87 7=p"ajU:ӢE?g{/gټpҤmNC:q"~&Ggvh yb/7j-aΥZS2UOS?p@YT^Ņ{H ]\>QiBo[(^!54xtLGG/ hje_7x IEmm )"c&<"Wq3p= G 4Lݏ~t--bGBHF[O>,|'Ci|ٲg@ZhZ^#6 qʔjl$翌 uuur]<}"@KK 5*$g}p=xdBġJ>9"]/س'{օLB ٳ***D֯j8 ep/YPPn|$]X jmGz+q/:uj">d̙HCLfҥ۶j?/&v?*oذ!!3a„򛚚|u1bDBfHǞ=CLJ@&s…Dzaa,)r T2aIBԣG6c ,ZBS%Zn[ жmY]fa9n<eܪGܔ qI heu#=2y$bUI @ oS5v :Mߥ#Jӿg!*gD_wNdG5pEW&:atA\oH[)VC+ү'27e*KQ9{p;Md6*dˬQϒDv 0.񴕚&I$w*Dvp\h<&>o$iA;CF-Ay[2S"z"XqyՊ~OI&(Cn%Rz \|jb"?qNu(+!\ /D{;.8ON+=}F`|y d"/mB*YCN,]iD vܽ#LT D)u+9 %aGW|#%8J%2Z]:[ dVO!IVFDhȿO e> 6/FD5DY%]S7;!|a!]pMK2F"̀|&6x lz"8G|Kdrw y,('!½9lK|p _I݉t!J,( 1tAɣ7@ՂfA)+ ܂2W{Xl"R]CXòUL@ TA D(P5@Npy^/"_D c.({ŕRQ"&X?s aqw,&sOme8 u$\F[.M-9CsGd%. ,("&b(8DAEY\Y@LĺV62Kb"}_C]FBWs:C 5JBzY$P"S %iP`b"!H-QF_BNs5iAW/ӛYwM. lPIENDB`mumble-1.3.4/3rdparty/speex-src/html/index.html0000664000175000017500000002051314010707304021257 0ustar builderbuilder The Speex Speech Codec

    Speex


    The Speex project aims to build an open-source (LGPL) patent-free voice codec. Unlike other codecs like MP3 and Ogg Vorbis, Speex is specially designed for compressing voice at low bit-rates in the 8-32 kbps/channel range. Possible applications include Voice over IP (VoIP), Internet audio streaming, archiving of speech data (e.g. voice mail), and audio books. In some sense, it is meant to be complementary to the Ogg Vorbis codec.

    If you are interested in participating to the project, contact us at speex-devel@lists.sourceforge.net or join our mailing list. Right now, we are mostly looking for developers with signal processing and speech coding knowledge, as well as people with knowledge about patents in that field. See the task list for more details about what's left to do in Speex

    Download

    You can download Speex from here.

    Documentation

    This Speex manual includes information about the algorithms used in Speex, the bit-stream, the API and more.
    Speex manual (PDF)
    Speex manual (Postscript)
    Speex manual (HTML online)
    Speex manual (HTML tarball)

    There is also some API documentation generated by Doxygen directly from the header files
    Speex API (PDF)

    Samples

    You can listen to samples encoded with Speex here

    Who uses Speex

    LinPhone: A SIP-based VoIP phone written for GNOME
    Speex XMMS plugin written by Jens Burkal
    OpenH323: An open-source H.323 stack
    GnomeMeeting: A H323 Video Conferencing Program

    In development:
    Asterisk: An open-source PBX

    News

    2002/09/04

    Speex 0.8.1 released. This release fixes a bug in the new 0.8 API (function speex_mode_query). For those using only speexenc/speexdec, no need to upgrade but those using libspeex (directly or through another application) should.

    2002/08/24

    Speex 0.8.0 released. The speex_decode() function no longer uses the 'lost' parameter. Applications will need to be updated.

    2002/08/09

    Speex 0.7.0 released. The format of the bit stream has changed once again and the bandwidth required has been reduced slightly.

    2002/08/01

    Speex 0.6.0 has been released. This is a major release that contains many improvements and lots of bug-fixing. The post-filter that was causing problems throughout 0.5.x was replaced with a new perceptual enhancement system, which sounds better and consume much less CPU. Also many changes to Ogg encoder/decoder, including possibility to see the bit-rate being played/encoded. There is also a discontinuous transmission (DTX) mode. Last but not least, 0.6.0 now reports no error when being run with the valgrind memory debugger.

    2002/07/26

    Speex 0.5.2 is out and brings a number of improvements and bug fixes. First, the search has been improved and it is now possible to choose the right quality/encoding time tradeoff (--comp option). Is is also possible to pack more that one frame in an Ogg packet (--nframes), reducing the overhead for low bit-rates. Last but not least: there is now some documentation about Speex!

    2002/07/17

    Version 0.5.1 is released. This release brings quality improvements at very low bit-rate (5.7 kbps) and a new post-filter. VBR should also be a bit better though there's still a lot to do. Most of the modes are bit-rate compatible with 0.5.0, with the exception of the very low bit-rate (which is sometimes used in VBR, so expect some glitches). The source (and probably binary) compatibility with 0.5.0 is maintained.

    2002/07/08

    Speex 0.5.0 is out. The most important new feature is Varible Bit-Rate (VBR). It can be enabled by using the --vbr option to speexenc. When encoding in VBR, the --quality option can still be used. Note VBR implementation in this release is experimental and still requires lots of tuning.

    2002/06/23

    Speex 0.4.0 is here, adding many more bit-rates to both narrowband and wideband, as well as the ability to change bit-rate dynamically from frame to frame. The narrowband modes now range from 8 kbps to 18 kbps, while wideband range from 10 kbps to 28 kbps. There is also a "noise coding" mode at 2 kbps for narrowband and 3 kbps for wideband. All this will lead to real Variable Bit-Rate (VBR) in the future. Also, worth mentioning the codec latency has been reduced from 40 ms to 30 ms (20 ms frames + 10 ms lookahead).

    2002/06/12

    Speex 0.3.0 has been released. There is now a new "low bit-rate" narrowband mode for coding speech at 8 kbps. There's also support for big-endian machines (untested, please report bugs). Speex files now have real header containing information like bit-stream version (revents from playing an incompatible bit-stream), sampling rate, bit-rate and user comments. On the quality side, the post-filter has been improved and there has been more codebook optimization. Note that this release breaks bit-stream compatibility with previous releases.

    2002/06/07

    Speex 0.2.0 is out. This is a major release with lots of improvements and bugfixes. First, the encoder and decoder can work directly from wav files (mono only for now) and the decoder can play directly to soundcard. Also, most of the codebooks have been re-trained in order to improve quality (but this also breaks format compatibility with previous versions), while slightly decreasing complexity. Speex is now able to encode both DTMF and music (not as good as Vorbis of course) after bugs were fixed in the pitch prediction and LSP quantization. Last but not the least, the perceptual post-filter has been improved.

    2002/06/04

    Speex 0.1.2 is out. This adds a perceptual post-filter at the decoder to (hopefully) increase quality. It can be enabled with the --pf option to speexdec. The Speex format remains the same for both narrowband and wideband.

    2002/05/15

    Speex 0.1.0 has been released. Speex now uses the Ogg bitstream (using libogg). That means that there is now (limited) bitstream error recovery. Also, the narrowband bit-rate has been reduced from 15.7 kbps to 15.1 kbps and the wideband bit-rate has been reduced from 31.3 kbps to 27.7 kbps. The quality remains roughly the same for both narrowband and wideband. Once again, this breaks compatibility with previous versions.
    Say NO to corrupt audio discs
    SourceForge Logo
    Jean-Mrc Valin
    $Date: 2002/09/16 00:59:10 $
    mumble-1.3.4/3rdparty/speex-src/html/speex.webprj0000664000175000017500000000027314010707304021622 0ustar builderbuilder mumble-1.3.4/3rdparty/speex-src/html/patents.html0000664000175000017500000000361714010707304021634 0ustar builderbuilder Speex and patents

    Position regarding patents

    The goal of Speex is to provide a codec that is open-source (released under the LGPL) and that can be used in open-source software. This implies that it also has to be free from patent restrictions. Unfortunately, the field of speech coding known to be a real patent minefield and to make the matter worse, each country has its own patent laws and list of granted patents so tracking them all would be next to impossible. This is why we cannot provide an absolute warranty that Speex is indeed completely patent-free.

    That being said, we are doing our best to keep away from known patents and we do not patent the algorithms we use. That's about all we can do about it. If you are aware of a patent issue with Speex, please let us know.

    Normally there shouldn't be any problem when you use Speex. However for the reasons explained above, if you are thinking about using Speex commercially, we strongly suggest that you have a closer look at patent issues with respect to your country. Note that this is not specific to Speex, since many "standardized" codecs have an unclear patent status (like MP3, GSM and probably others), not to mention the risks of a previously unknown patent holder claiming rights on a standardized codec long after standardization (GIF, JPEG).
    mumble-1.3.4/3rdparty/speex-src/html/speex.xcf0000664000175000017500000006045714010707304021123 0ustar builderbuildergimp xcf fileBB/ gimp-commentCreated with The GIMPm&9+Kc^Speex     TtIUa 0@PV H  )9 q=======88UU6qU20U 8.Uq-8-+88+U U+8 ,;::U8 q 88  Uqq U88U8U qq8U8 8qUqU qq 8   q  UUU UU 8UU 8 U8UU  qU   U88 q8 U8  qU UUU qUU88UqU UUU⪪qU UUqqUU88Uq8UUq88 U88qUUUUU8UU8q88q qq8q U88 UqU U q7878798UUqU4<q;U;:8q997q64UU3 ƪ0U 258UqU  U8q UUU8UU U U  q U  qU UUU q UUU q UU  UU  8q 8U UqU U q 8U Uq qq8q8UU88qU88qU 8"ƍ8888qU88888qq888988q7U4ƪqU, 8,8U U^UUU8UUUU UU UUU  U U8U 8Uq8UqUUUUUq8UU 88 U8 U8 qUUqU8+ q88888q9q8U8U8U88;8 HU<UU:87UU3⪪84U6U8 `@0 Bottom     0&&& ,<L\lY$&f&v&&&&& !"$' !"$' !"$' ( ( !"$' !"$' !"$' ( ( !"$' !"$' !"$' ( ( !"$' !"$' !"$i((+++((,,,(i((+++((,,,($$$$$$$$$$$$$$$$$%'(*,-/023578:;=>@BCEFHIKMNPQSTVXY[\^`acdfgiklnoqrtvwyz|}%'(*,-/023578:;=>@BCEFHIKMNPQSTVXY[\^`acdfgiklnoqrtvwyz|}%'(*,-/023578:;=>@BCEFHIKMNPQSTVXY[\^`acdfgiklnoqrtvwyz|}%'23578:;CEFQST`alnoqr|}%'23578:;EFST`alnoq%',-/023578:>@FKMNTY[\^`afgiklnovwyʁ%',-/023578:>@BCEFKMNPTY[\^`afgiklntvwyz|%',-/023578:@BCEFKMNPTY[\^`afgiklnrtvwyz|}%'23578:;CEFT`alnrtvwyz|}%'23578:;=EFQST`alnrtvwyz|}%',-/023578:;=>@FKMNPQSTY[\^`afgiklnrtvwyz|}%',-/023578:;=>@BFKMNPQSTY[\^`afgiklntvwyz|}%',-/023578:>@FKMNPQSTY[\^`afgiklnovwyz%'23578:EFKMNPQST`alnoq%'23578:;CEFKMNPQST`alnoqr|}%'(*,-/023578:;=>@BCEFHIKMNPQSTVXY[\^`acdfgiklnoqrtvwyz|}%'(*,-/023578:;=>@BCEFHIKMNPQSTVXY[\^`acdfgiklnoqrtvwyz|}%'(*,-/023578:;=>@BCEFHIKMNPQSTVXY[\^`acdfgiklnoqrtvwyz|}B         B         Ί튌튌튌튌튌ﱳΐ͐ﱳ튌튌튌튌B    B    ///////// / ///////0A97675568A97675568/////////////////0`@0  Signal#2     ~''999(+(;(K([(k({((((((((-368888888%$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%$$$$$$$$$$$$ # # # #%$$$$$$ $  $  $ $ $$$$$$$$%$$$$$$$$$$$$ # # # #%$$$$$$ $  $  $ $ $$$$$$$$v<=9111$#-///0124== y'LVy&JLV`wy%GJLTV`wy{$GNTV`bow{"7ENTV^`bow{ %-59CNRX^bloquw{ '+/159CNRX^blqu{)3;APRX^bdjqu{;?PX^dhjqu{}=PX^dfqsu} X\^s}+X\s}+X\;X\;X\ #if !defined WIN32 && !defined _WIN32 #include #endif #ifdef HAVE_GETOPT_H #include #endif #ifndef HAVE_GETOPT_LONG #include "getopt_win.h" #endif #include #include #include #if defined WIN32 || defined _WIN32 #include "wave_out.h" /* We need the following two to set stdout to binary */ #include #include #endif #include #ifdef __MINGW32__ #include "wave_out.c" #endif #ifdef HAVE_SYS_SOUNDCARD_H #include #include #include #include #include #elif defined HAVE_SYS_AUDIOIO_H #include #include #include #include #ifndef AUDIO_ENCODING_SLINEAR #define AUDIO_ENCODING_SLINEAR AUDIO_ENCODING_LINEAR /* Solaris */ #endif #endif #include #include "wav_io.h" #include "speex/speex_header.h" #include "speex/speex_stereo.h" #include "speex/speex_callbacks.h" #define MAX_FRAME_SIZE 2000 #define readint(buf, base) (((buf[base+3]<<24)&0xff000000)| \ ((buf[base+2]<<16)&0xff0000)| \ ((buf[base+1]<<8)&0xff00)| \ (buf[base]&0xff)) static void print_comments(char *comments, int length) { char *c=comments; int len, i, nb_fields; char *end; if (length<8) { fprintf (stderr, "Invalid/corrupted comments\n"); return; } end = c+length; len=readint(c, 0); c+=4; if (len < 0 || c+len>end) { fprintf (stderr, "Invalid/corrupted comments\n"); return; } fwrite(c, 1, len, stderr); c+=len; fprintf (stderr, "\n"); if (c+4>end) { fprintf (stderr, "Invalid/corrupted comments\n"); return; } nb_fields=readint(c, 0); c+=4; for (i=0;iend) { fprintf (stderr, "Invalid/corrupted comments\n"); return; } len=readint(c, 0); c+=4; if (len < 0 || c+len>end) { fprintf (stderr, "Invalid/corrupted comments\n"); return; } fwrite(c, 1, len, stderr); c+=len; fprintf (stderr, "\n"); } } FILE *out_file_open(char *outFile, int rate, int *channels) { FILE *fout=NULL; /*Open output file*/ if (strlen(outFile)==0) { #if defined HAVE_SYS_SOUNDCARD_H int audio_fd, format, stereo; audio_fd=open("/dev/dsp", O_WRONLY); if (audio_fd<0) { perror("Cannot open /dev/dsp"); exit(1); } format=AFMT_S16_NE; if (ioctl(audio_fd, SNDCTL_DSP_SETFMT, &format)==-1) { perror("SNDCTL_DSP_SETFMT"); close(audio_fd); exit(1); } stereo=0; if (*channels==2) stereo=1; if (ioctl(audio_fd, SNDCTL_DSP_STEREO, &stereo)==-1) { perror("SNDCTL_DSP_STEREO"); close(audio_fd); exit(1); } if (stereo!=0) { if (*channels==1) fprintf (stderr, "Cannot set mono mode, will decode in stereo\n"); *channels=2; } if (ioctl(audio_fd, SNDCTL_DSP_SPEED, &rate)==-1) { perror("SNDCTL_DSP_SPEED"); close(audio_fd); exit(1); } fout = fdopen(audio_fd, "w"); #elif defined HAVE_SYS_AUDIOIO_H audio_info_t info; int audio_fd; audio_fd = open("/dev/audio", O_WRONLY); if (audio_fd<0) { perror("Cannot open /dev/audio"); exit(1); } AUDIO_INITINFO(&info); #ifdef AUMODE_PLAY /* NetBSD/OpenBSD */ info.mode = AUMODE_PLAY; #endif info.play.encoding = AUDIO_ENCODING_SLINEAR; info.play.precision = 16; info.play.sample_rate = rate; info.play.channels = *channels; if (ioctl(audio_fd, AUDIO_SETINFO, &info) < 0) { perror ("AUDIO_SETINFO"); exit(1); } fout = fdopen(audio_fd, "w"); #elif defined WIN32 || defined _WIN32 { unsigned int speex_channels = *channels; if (Set_WIN_Params (INVALID_FILEDESC, rate, SAMPLE_SIZE, speex_channels)) { fprintf (stderr, "Can't access %s\n", "WAVE OUT"); exit(1); } } #else fprintf (stderr, "No soundcard support\n"); exit(1); #endif } else { if (strcmp(outFile,"-")==0) { #if defined WIN32 || defined _WIN32 _setmode(_fileno(stdout), _O_BINARY); #elif defined OS2 _fsetmode(stdout,"b"); #endif fout=stdout; } else { fout = fopen(outFile, "wb"); if (!fout) { perror(outFile); exit(1); } if (strcmp(outFile+strlen(outFile)-4,".wav")==0 || strcmp(outFile+strlen(outFile)-4,".WAV")==0) write_wav_header(fout, rate, *channels, 0, 0); } } return fout; } void usage() { printf ("Usage: speexdec [options] input_file.spx [output_file]\n"); printf ("\n"); printf ("Decodes a Speex file and produce a WAV file or raw file\n"); printf ("\n"); printf ("input_file can be:\n"); printf (" filename.spx regular Speex file\n"); printf (" - stdin\n"); printf ("\n"); printf ("output_file can be:\n"); printf (" filename.wav Wav file\n"); printf (" filename.* Raw PCM file (any extension other that .wav)\n"); printf (" - stdout\n"); printf (" (nothing) Will be played to soundcard\n"); printf ("\n"); printf ("Options:\n"); printf (" --enh Enable perceptual enhancement (default)\n"); printf (" --no-enh Disable perceptual enhancement\n"); printf (" --force-nb Force decoding in narrowband\n"); printf (" --force-wb Force decoding in wideband\n"); printf (" --force-uwb Force decoding in ultra-wideband\n"); printf (" --mono Force decoding in mono\n"); printf (" --stereo Force decoding in stereo\n"); printf (" --rate n Force decoding at sampling rate n Hz\n"); printf (" --packet-loss n Simulate n %% random packet loss\n"); printf (" -V Verbose mode (show bit-rate)\n"); printf (" -h, --help This help\n"); printf (" -v, --version Version information\n"); printf (" --pf Deprecated, use --enh instead\n"); printf (" --no-pf Deprecated, use --no-enh instead\n"); printf ("\n"); printf ("More information is available from the Speex site: http://www.speex.org\n"); printf ("\n"); printf ("Please report bugs to the mailing list `speex-dev@xiph.org'.\n"); } void version() { const char* speex_version; speex_lib_ctl(SPEEX_LIB_GET_VERSION_STRING, (void*)&speex_version); printf ("speexdec (Speex decoder) version %s (compiled " __DATE__ ")\n", speex_version); printf ("Copyright (C) 2002-2006 Jean-Marc Valin\n"); } void version_short() { const char* speex_version; speex_lib_ctl(SPEEX_LIB_GET_VERSION_STRING, (void*)&speex_version); printf ("speexdec version %s\n", speex_version); printf ("Copyright (C) 2002-2006 Jean-Marc Valin\n"); } static void *process_header(ogg_packet *op, spx_int32_t enh_enabled, spx_int32_t *frame_size, int *granule_frame_size, spx_int32_t *rate, int *nframes, int forceMode, int *channels, SpeexStereoState *stereo, int *extra_headers, int quiet) { void *st; const SpeexMode *mode; SpeexHeader *header; int modeID; SpeexCallback callback; header = speex_packet_to_header((char*)op->packet, op->bytes); if (!header) { fprintf (stderr, "Cannot read header\n"); return NULL; } if (header->mode >= SPEEX_NB_MODES || header->mode<0) { fprintf (stderr, "Mode number %d does not (yet/any longer) exist in this version\n", header->mode); free(header); return NULL; } modeID = header->mode; if (forceMode!=-1) modeID = forceMode; mode = speex_lib_get_mode (modeID); if (header->speex_version_id > 1) { fprintf (stderr, "This file was encoded with Speex bit-stream version %d, which I don't know how to decode\n", header->speex_version_id); free(header); return NULL; } if (mode->bitstream_version < header->mode_bitstream_version) { fprintf (stderr, "The file was encoded with a newer version of Speex. You need to upgrade in order to play it.\n"); free(header); return NULL; } if (mode->bitstream_version > header->mode_bitstream_version) { fprintf (stderr, "The file was encoded with an older version of Speex. You would need to downgrade the version in order to play it.\n"); free(header); return NULL; } st = speex_decoder_init(mode); if (!st) { fprintf (stderr, "Decoder initialization failed.\n"); free(header); return NULL; } speex_decoder_ctl(st, SPEEX_SET_ENH, &enh_enabled); speex_decoder_ctl(st, SPEEX_GET_FRAME_SIZE, frame_size); *granule_frame_size = *frame_size; if (!*rate) *rate = header->rate; /* Adjust rate if --force-* options are used */ if (forceMode!=-1) { if (header->mode < forceMode) { *rate <<= (forceMode - header->mode); *granule_frame_size >>= (forceMode - header->mode); } if (header->mode > forceMode) { *rate >>= (header->mode - forceMode); *granule_frame_size <<= (header->mode - forceMode); } } speex_decoder_ctl(st, SPEEX_SET_SAMPLING_RATE, rate); *nframes = header->frames_per_packet; if (*channels==-1) *channels = header->nb_channels; if (!(*channels==1)) { *channels = 2; callback.callback_id = SPEEX_INBAND_STEREO; callback.func = speex_std_stereo_request_handler; callback.data = stereo; speex_decoder_ctl(st, SPEEX_SET_HANDLER, &callback); } if (!quiet) { fprintf (stderr, "Decoding %d Hz audio using %s mode", *rate, mode->modeName); if (*channels==1) fprintf (stderr, " (mono"); else fprintf (stderr, " (stereo"); if (header->vbr) fprintf (stderr, ", VBR)\n"); else fprintf(stderr, ")\n"); /*fprintf (stderr, "Decoding %d Hz audio at %d bps using %s mode\n", *rate, mode->bitrate, mode->modeName);*/ } *extra_headers = header->extra_headers; free(header); return st; } int main(int argc, char **argv) { int c; int option_index = 0; char *inFile, *outFile; FILE *fin, *fout=NULL; short out[MAX_FRAME_SIZE]; short output[MAX_FRAME_SIZE]; int frame_size=0, granule_frame_size=0; void *st=NULL; SpeexBits bits; int packet_count=0; int stream_init = 0; int quiet = 0; ogg_int64_t page_granule=0, last_granule=0; int skip_samples=0, page_nb_packets; struct option long_options[] = { {"help", no_argument, NULL, 0}, {"quiet", no_argument, NULL, 0}, {"version", no_argument, NULL, 0}, {"version-short", no_argument, NULL, 0}, {"enh", no_argument, NULL, 0}, {"no-enh", no_argument, NULL, 0}, {"pf", no_argument, NULL, 0}, {"no-pf", no_argument, NULL, 0}, {"force-nb", no_argument, NULL, 0}, {"force-wb", no_argument, NULL, 0}, {"force-uwb", no_argument, NULL, 0}, {"rate", required_argument, NULL, 0}, {"mono", no_argument, NULL, 0}, {"stereo", no_argument, NULL, 0}, {"packet-loss", required_argument, NULL, 0}, {0, 0, 0, 0} }; ogg_sync_state oy; ogg_page og; ogg_packet op; ogg_stream_state os; int enh_enabled; int nframes=2; int print_bitrate=0; int close_in=0; int eos=0; int forceMode=-1; int audio_size=0; float loss_percent=-1; SpeexStereoState stereo = SPEEX_STEREO_STATE_INIT; int channels=-1; int rate=0; int extra_headers=0; int wav_format=0; int lookahead; int speex_serialno = -1; enh_enabled = 1; /*Process options*/ while(1) { c = getopt_long (argc, argv, "hvV", long_options, &option_index); if (c==-1) break; switch(c) { case 0: if (strcmp(long_options[option_index].name,"help")==0) { usage(); exit(0); } else if (strcmp(long_options[option_index].name,"quiet")==0) { quiet = 1; } else if (strcmp(long_options[option_index].name,"version")==0) { version(); exit(0); } else if (strcmp(long_options[option_index].name,"version-short")==0) { version_short(); exit(0); } else if (strcmp(long_options[option_index].name,"enh")==0) { enh_enabled=1; } else if (strcmp(long_options[option_index].name,"no-enh")==0) { enh_enabled=0; } else if (strcmp(long_options[option_index].name,"pf")==0) { fprintf (stderr, "--pf is deprecated, use --enh instead\n"); enh_enabled=1; } else if (strcmp(long_options[option_index].name,"no-pf")==0) { fprintf (stderr, "--no-pf is deprecated, use --no-enh instead\n"); enh_enabled=0; } else if (strcmp(long_options[option_index].name,"force-nb")==0) { forceMode=0; } else if (strcmp(long_options[option_index].name,"force-wb")==0) { forceMode=1; } else if (strcmp(long_options[option_index].name,"force-uwb")==0) { forceMode=2; } else if (strcmp(long_options[option_index].name,"mono")==0) { channels=1; } else if (strcmp(long_options[option_index].name,"stereo")==0) { channels=2; } else if (strcmp(long_options[option_index].name,"rate")==0) { rate=atoi (optarg); } else if (strcmp(long_options[option_index].name,"packet-loss")==0) { loss_percent = atof(optarg); } break; case 'h': usage(); exit(0); break; case 'v': version(); exit(0); break; case 'V': print_bitrate=1; break; case '?': usage(); exit(1); break; } } if (argc-optind!=2 && argc-optind!=1) { usage(); exit(1); } inFile=argv[optind]; if (argc-optind==2) outFile=argv[optind+1]; else outFile = ""; wav_format = strlen(outFile)>=4 && ( strcmp(outFile+strlen(outFile)-4,".wav")==0 || strcmp(outFile+strlen(outFile)-4,".WAV")==0); /*Open input file*/ if (strcmp(inFile, "-")==0) { #if defined WIN32 || defined _WIN32 _setmode(_fileno(stdin), _O_BINARY); #endif fin=stdin; } else { fin = fopen(inFile, "rb"); if (!fin) { perror(inFile); exit(1); } close_in=1; } /*Init Ogg data struct*/ ogg_sync_init(&oy); speex_bits_init(&bits); /*Main decoding loop*/ while (1) { char *data; int i, j, nb_read; /*Get the ogg buffer for writing*/ data = ogg_sync_buffer(&oy, 200); /*Read bitstream from input file*/ nb_read = fread(data, sizeof(char), 200, fin); ogg_sync_wrote(&oy, nb_read); /*Loop for all complete pages we got (most likely only one)*/ while (ogg_sync_pageout(&oy, &og)==1) { int packet_no; if (stream_init == 0) { ogg_stream_init(&os, ogg_page_serialno(&og)); stream_init = 1; } if (ogg_page_serialno(&og) != os.serialno) { /* so all streams are read. */ ogg_stream_reset_serialno(&os, ogg_page_serialno(&og)); } /*Add page to the bitstream*/ ogg_stream_pagein(&os, &og); page_granule = ogg_page_granulepos(&og); page_nb_packets = ogg_page_packets(&og); if (page_granule>0 && frame_size) { /* FIXME: shift the granule values if --force-* is specified */ skip_samples = frame_size*(page_nb_packets*granule_frame_size*nframes - (page_granule-last_granule))/granule_frame_size; if (ogg_page_eos(&og)) skip_samples = -skip_samples; /*else if (!ogg_page_bos(&og)) skip_samples = 0;*/ } else { skip_samples = 0; } /*printf ("page granulepos: %d %d %d\n", skip_samples, page_nb_packets, (int)page_granule);*/ last_granule = page_granule; /*Extract all available packets*/ packet_no=0; while (!eos && ogg_stream_packetout(&os, &op) == 1) { if (op.bytes>=5 && !memcmp(op.packet, "Speex", 5)) { speex_serialno = os.serialno; } if (speex_serialno == -1 || os.serialno != speex_serialno) break; /*If first packet, process as Speex header*/ if (packet_count==0) { st = process_header(&op, enh_enabled, &frame_size, &granule_frame_size, &rate, &nframes, forceMode, &channels, &stereo, &extra_headers, quiet); if (!st) exit(1); speex_decoder_ctl(st, SPEEX_GET_LOOKAHEAD, &lookahead); if (!nframes) nframes=1; fout = out_file_open(outFile, rate, &channels); } else if (packet_count==1) { if (!quiet) print_comments((char*)op.packet, op.bytes); } else if (packet_count<=1+extra_headers) { /* Ignore extra headers */ } else { int lost=0; packet_no++; if (loss_percent>0 && 100*((float)rand())/RAND_MAX 0) { /*printf ("chopping first packet\n");*/ new_frame_size -= skip_samples+lookahead; frame_offset = skip_samples+lookahead; } if (packet_no == page_nb_packets && skip_samples < 0) { int packet_length = nframes*frame_size+skip_samples+lookahead; new_frame_size = packet_length - j*frame_size; if (new_frame_size<0) new_frame_size = 0; if (new_frame_size>frame_size) new_frame_size = frame_size; /*printf ("chopping end: %d %d %d\n", new_frame_size, packet_length, packet_no);*/ } if (new_frame_size>0) { #if defined WIN32 || defined _WIN32 if (strlen(outFile)==0) WIN_Play_Samples (out+frame_offset*channels, sizeof(short) * new_frame_size*channels); else #endif fwrite(out+frame_offset*channels, sizeof(short), new_frame_size*channels, fout); audio_size+=sizeof(short)*new_frame_size*channels; } } } } packet_count++; } } if (feof(fin)) break; } if (fout && wav_format) { if (fseek(fout,4,SEEK_SET)==0) { int tmp; tmp = le_int(audio_size+36); fwrite(&tmp,4,1,fout); if (fseek(fout,32,SEEK_CUR)==0) { tmp = le_int(audio_size); fwrite(&tmp,4,1,fout); } else { fprintf (stderr, "First seek worked, second didn't\n"); } } else { fprintf (stderr, "Cannot seek on wave file, size will be incorrect\n"); } } if (st) speex_decoder_destroy(st); else { fprintf (stderr, "This doesn't look like a Speex file\n"); } speex_bits_destroy(&bits); if (stream_init) ogg_stream_clear(&os); ogg_sync_clear(&oy); #if defined WIN32 || defined _WIN32 if (strlen(outFile)==0) WIN_Audio_close (); #endif if (close_in) fclose(fin); if (fout != NULL) fclose(fout); return 0; } mumble-1.3.4/3rdparty/speex-src/src/wave_out.c0000664000175000017500000001504514010707304021106 0ustar builderbuilder/* Copyright (c) 2002, John Edwards Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif /* Set TABS = 4 */ /******************************************************************** function: To provide playback of 16 bit PCM wave data in Win32 environments from decoded compressed files. ********************************************************************/ #if defined WIN32 || defined _WIN32 #include #include #include "wave_out.h" #define MAXWAVESIZE 4294967040LU #define MAX_WAVEBLOCKS 32 // This is modified for USE_WIN_AUDIO - ONLY 2002-02-27 static CRITICAL_SECTION cs; static HWAVEOUT dev = NULL; static int ScheduledBlocks = 0; static int PlayedWaveHeadersCount = 0; // free index static WAVEHDR* PlayedWaveHeaders [MAX_WAVEBLOCKS]; static int Box ( const char* msg ) { MessageBox ( NULL, msg, " "VERSION_STRING": Error Message . . .", MB_OK | MB_ICONEXCLAMATION ); return -1; } /* * This function registers already played WAVE chunks. Freeing is done by free_memory(), */ static void CALLBACK wave_callback ( HWAVE hWave, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2 ) { if ( uMsg == WOM_DONE ) { EnterCriticalSection ( &cs ); PlayedWaveHeaders [PlayedWaveHeadersCount++] = (WAVEHDR*) dwParam1; LeaveCriticalSection ( &cs ); } } static void free_memory ( void ) { WAVEHDR* wh; HGLOBAL hg; EnterCriticalSection ( &cs ); wh = PlayedWaveHeaders [--PlayedWaveHeadersCount]; ScheduledBlocks--; // decrease the number of USED blocks LeaveCriticalSection ( &cs ); waveOutUnprepareHeader ( dev, wh, sizeof (WAVEHDR) ); hg = GlobalHandle ( wh -> lpData ); // Deallocate the buffer memory GlobalUnlock (hg); GlobalFree (hg); hg = GlobalHandle ( wh ); // Deallocate the header memory GlobalUnlock (hg); GlobalFree (hg); } Int Set_WIN_Params ( FILE_T dummyFile , Ldouble SampleFreq, Uint BitsPerSample, Uint Channels ) { WAVEFORMATEX outFormat; UINT deviceID = WAVE_MAPPER; (void) dummyFile; if ( waveOutGetNumDevs () == 0 ) return Box ( "No audio device present." ); outFormat.wFormatTag = WAVE_FORMAT_PCM; outFormat.wBitsPerSample = BitsPerSample; outFormat.nChannels = Channels; outFormat.nSamplesPerSec = (unsigned long)(SampleFreq + 0.5); outFormat.nBlockAlign = (outFormat.wBitsPerSample + 7) / 8 * outFormat.nChannels; outFormat.nAvgBytesPerSec = outFormat.nSamplesPerSec * outFormat.nBlockAlign; switch ( waveOutOpen ( &dev, deviceID, &outFormat, (DWORD)wave_callback, 0, CALLBACK_FUNCTION ) ) { case MMSYSERR_ALLOCATED: return Box ( "Device is already open." ); case MMSYSERR_BADDEVICEID: return Box ( "The specified device is out of range." ); case MMSYSERR_NODRIVER: return Box ( "There is no audio driver in this system." ); case MMSYSERR_NOMEM: return Box ( "Unable to allocate sound memory." ); case WAVERR_BADFORMAT: return Box ( "This audio format is not supported." ); case WAVERR_SYNC: return Box ( "The device is synchronous." ); default: return Box ( "Unknown media error." ); case MMSYSERR_NOERROR: break; } waveOutReset ( dev ); InitializeCriticalSection ( &cs ); SetPriorityClass ( GetCurrentProcess (), HIGH_PRIORITY_CLASS ); return 0; } int WIN_Play_Samples ( const void* data, size_t len ) { HGLOBAL hg; HGLOBAL hg2; LPWAVEHDR wh; void* allocptr; do { while ( PlayedWaveHeadersCount > 0 ) // free used blocks ... free_memory (); if ( ScheduledBlocks < sizeof(PlayedWaveHeaders)/sizeof(*PlayedWaveHeaders) ) // wait for a free block ... break; Sleep (26); } while (1); if ( (hg2 = GlobalAlloc ( GMEM_MOVEABLE, len )) == NULL ) // allocate some memory for a copy of the buffer return Box ( "GlobalAlloc failed." ); allocptr = GlobalLock (hg2); CopyMemory ( allocptr, data, len ); // Here we can call any modification output functions we want.... if ( (hg = GlobalAlloc (GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof (WAVEHDR))) == NULL ) // now make a header and WRITE IT! return -1; wh = GlobalLock (hg); wh -> dwBufferLength = len; wh -> lpData = allocptr; if ( waveOutPrepareHeader ( dev, wh, sizeof (WAVEHDR)) != MMSYSERR_NOERROR ) { GlobalUnlock (hg); GlobalFree (hg); return -1; } if ( waveOutWrite ( dev, wh, sizeof (WAVEHDR)) != MMSYSERR_NOERROR ) { GlobalUnlock (hg); GlobalFree (hg); return -1; } EnterCriticalSection ( &cs ); ScheduledBlocks++; LeaveCriticalSection ( &cs ); return len; } int WIN_Audio_close ( void ) { if ( dev != NULL ) { while ( ScheduledBlocks > 0 ) { Sleep (ScheduledBlocks); while ( PlayedWaveHeadersCount > 0 ) // free used blocks ... free_memory (); } waveOutReset (dev); // reset the device waveOutClose (dev); // close the device dev = NULL; } DeleteCriticalSection ( &cs ); ScheduledBlocks = 0; return 0; } #endif /* end of wave_out.c */ mumble-1.3.4/3rdparty/speex-src/src/wave_out.h0000664000175000017500000000544414010707304021115 0ustar builderbuilder/* Copyright (c) 2002, John Edwards Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ // WAVE_OUT.H - Necessary stuff for WIN_AUDIO #ifndef WAVE_OUT_H #define WAVE_OUT_H #include #include #ifdef __MINGW32__ #include #endif #define VERSION_STRING "\n 0.7.0\n" #define Cdecl __cdecl #define __attribute__(x) #define sleep(__sec) Sleep ((__sec) * 1000) #define inline __inline #define restrict //// constants ///////////////////////////////////////////////////// #define CD_SAMPLE_FREQ 44.1e3 #define SAMPLE_SIZE 16 #define SAMPLE_SIZE_STRING "" #define WINAUDIO_FD ((FILE_T)-128) #define FILE_T FILE* #define INVALID_FILEDESC NULL //// Simple types ////////////////////////////////////////////////// typedef signed int Int; // at least -32767...+32767, fast type typedef unsigned int Uint; // at least 0...65535, fast type typedef long double Ldouble; // most exact floating point format //// procedures/functions ////////////////////////////////////////// // wave_out.c Int Set_WIN_Params ( FILE_T dummyFile , Ldouble SampleFreq, Uint BitsPerSample, Uint Channels); int WIN_Play_Samples ( const void* buff, size_t len ); int WIN_Audio_close ( void ); #endif /* WAVE_OUT_H */ mumble-1.3.4/3rdparty/speex-src/src/getopt1.c0000664000175000017500000001071014010707304020632 0ustar builderbuilder/* getopt_long and getopt_long_only entry points for GNU getopt. Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with the GNU C Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "getopt_win.h" #if !defined __STDC__ || !__STDC__ /* This is a separate conditional since some stdc systems reject `defined (const)'. */ #ifndef const #define const #endif #endif #include /* Comment out all this code if we are using the GNU C Library, and are not actually compiling the library itself. This code is part of the GNU C Library, but also included in many other GNU distributions. Compiling and linking in this code is a waste when using the GNU C library (especially if it is a shared library). Rather than having every GNU program understand `configure --with-gnu-libc' and omit the object files, it is simpler to just do this in the source for each such file. */ #define GETOPT_INTERFACE_VERSION 2 #if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 #include #if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION #define ELIDE_CODE #endif #endif #ifndef ELIDE_CODE /* This needs to come after some library #include to get __GNU_LIBRARY__ defined. */ #ifdef __GNU_LIBRARY__ #include #endif #ifndef NULL #define NULL 0 #endif int getopt_long (argc, argv, options, long_options, opt_index) int argc; char *const *argv; const char *options; const struct option *long_options; int *opt_index; { return _getopt_internal (argc, argv, options, long_options, opt_index, 0); } /* Like getopt_long, but '-' as well as '--' can indicate a long option. If an option that starts with '-' (not '--') doesn't match a long option, but does match a short option, it is parsed as a short option instead. */ int getopt_long_only (argc, argv, options, long_options, opt_index) int argc; char *const *argv; const char *options; const struct option *long_options; int *opt_index; { return _getopt_internal (argc, argv, options, long_options, opt_index, 1); } #endif /* Not ELIDE_CODE. */ #ifdef TEST #include int main (argc, argv) int argc; char **argv; { int c; int digit_optind = 0; while (1) { int this_option_optind = optind ? optind : 1; int option_index = 0; static struct option long_options[] = { {"add", 1, 0, 0}, {"append", 0, 0, 0}, {"delete", 1, 0, 0}, {"verbose", 0, 0, 0}, {"create", 0, 0, 0}, {"file", 1, 0, 0}, {0, 0, 0, 0} }; c = getopt_long (argc, argv, "abc:d:0123456789", long_options, &option_index); if (c == -1) break; switch (c) { case 0: printf ("option %s", long_options[option_index].name); if (optarg) printf (" with arg %s", optarg); printf ("\n"); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (digit_optind != 0 && digit_optind != this_option_optind) printf ("digits occur in two different argv-elements.\n"); digit_optind = this_option_optind; printf ("option %c\n", c); break; case 'a': printf ("option a\n"); break; case 'b': printf ("option b\n"); break; case 'c': printf ("option c with value `%s'\n", optarg); break; case 'd': printf ("option d with value `%s'\n", optarg); break; case '?': break; default: printf ("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); printf ("\n"); } exit (0); } #endif /* TEST */ mumble-1.3.4/3rdparty/speex-src/src/skeleton.c0000664000175000017500000001474114010707304021103 0ustar builderbuilder/* * skeleton.c * author: Tahseen Mohammad */ #include #include #include #include #include "skeleton.h" /* write an ogg_page to a file pointer */ int write_ogg_page_to_file(ogg_page *og, FILE *out) { int written; written = fwrite(og->header,1, og->header_len, out); written += fwrite(og->body,1, og->body_len, out); return written; } int add_message_header_field(fisbone_packet *fp, char *header_key, char *header_value) { /* size of both key and value + ': ' + CRLF */ int this_message_size = strlen(header_key) + strlen(header_value) + 4; if (fp->message_header_fields == NULL) { fp->message_header_fields = _ogg_calloc(this_message_size, sizeof(char)); } else { int new_size = (fp->current_header_size + this_message_size) * sizeof(char); fp->message_header_fields = _ogg_realloc(fp->message_header_fields, new_size); } snprintf(fp->message_header_fields + fp->current_header_size, this_message_size+1, "%s: %s\r\n", header_key, header_value); fp->current_header_size += this_message_size; return 0; } /* create a ogg_packet from a fishead_packet structure */ ogg_packet ogg_from_fishead(fishead_packet *fp) { ogg_packet op; memset(&op, 0, sizeof(op)); op.packet = _ogg_calloc(FISHEAD_SIZE, sizeof(unsigned char)); memset(op.packet, 0, FISHEAD_SIZE); memcpy (op.packet, FISHEAD_IDENTIFIER, 8); /* identifier */ *((ogg_uint16_t*)(op.packet+8)) = SKELETON_VERSION_MAJOR; /* version major */ *((ogg_uint16_t*)(op.packet+10)) = SKELETON_VERSION_MINOR; /* version minor */ *((ogg_int64_t*)(op.packet+12)) = (ogg_int64_t)fp->ptime_n; /* presentationtime numerator */ *((ogg_int64_t*)(op.packet+20)) = (ogg_int64_t)fp->ptime_d; /* presentationtime denominator */ *((ogg_int64_t*)(op.packet+28)) = (ogg_int64_t)fp->btime_n; /* basetime numerator */ *((ogg_int64_t*)(op.packet+36)) = (ogg_int64_t)fp->btime_d; /* basetime denominator */ /* TODO: UTC time, set to zero for now */ op.b_o_s = 1; /* its the first packet of the stream */ op.e_o_s = 0; /* its not the last packet of the stream */ op.bytes = FISHEAD_SIZE; /* length of the packet in bytes */ return op; } /* create a ogg_packet from a fisbone_packet structure. * call this method after the fisbone_packet is filled and all message header fields are added * by calling add_message_header_field method. */ ogg_packet ogg_from_fisbone(fisbone_packet *fp) { ogg_packet op; int packet_size = FISBONE_SIZE + fp->current_header_size; memset (&op, 0, sizeof (op)); op.packet = _ogg_calloc (packet_size, sizeof(unsigned char)); memset (op.packet, 0, packet_size); memcpy (op.packet, FISBONE_IDENTIFIER, 8); /* identifier */ *((ogg_uint32_t*)(op.packet+8)) = FISBONE_MESSAGE_HEADER_OFFSET; /* offset of the message header fields */ *((ogg_uint32_t*)(op.packet+12)) = fp->serial_no; /* serialno of the respective stream */ *((ogg_uint32_t*)(op.packet+16)) = fp->nr_header_packet; /* number of header packets */ *((ogg_int64_t*)(op.packet+20)) = fp->granule_rate_n; /* granulrate numerator */ *((ogg_int64_t*)(op.packet+28)) = fp->granule_rate_d; /* granulrate denominator */ *((ogg_int64_t*)(op.packet+36)) = fp->start_granule; /* start granule */ *((ogg_uint32_t*)(op.packet+44)) = fp->preroll; /* preroll, for theora its 0 */ *(op.packet+48) = fp->granule_shift; /* granule shift */ memcpy((op.packet+FISBONE_SIZE), fp->message_header_fields, fp->current_header_size); op.b_o_s = 0; op.e_o_s = 0; op.bytes = packet_size; /* size of the packet in bytes */ return op; } /* fills up a fishead_packet from a fishead ogg_packet of a skeleton bistream */ fishead_packet fishead_from_ogg(ogg_packet *op) { fishead_packet fp; if (memcmp(op->packet, FISHEAD_IDENTIFIER, 8)) ; /* invalid packet what do we do? */ fp.version_major = *((ogg_uint16_t*)(op->packet+8)); /* version major */ fp.version_minor = *((ogg_uint16_t*)(op->packet+10)); /* version minor */ fp.ptime_n = *((ogg_int64_t*)(op->packet+12)); /* presentationtime numerator */ fp.ptime_d = *((ogg_int64_t*)(op->packet+20)); /* presentationtime denominator */ fp.btime_n = *((ogg_int64_t*)(op->packet+28)); /* basetime numerator */ fp.btime_d = *((ogg_int64_t*)(op->packet+36)); /* basetime denominator */ memcpy(fp.UTC, op->packet+44, 20); return fp; } /* fills up a fisbone_packet from a fisbone ogg_packet of a skeleton bitstream */ fisbone_packet fisbone_from_ogg(ogg_packet *op) { fisbone_packet fp; if (memcmp(op->packet, FISBONE_IDENTIFIER, 8)) ; /* invalid value, what do we do? */ fp.serial_no = *((ogg_uint32_t*)(op->packet+12)); /* serialno of the stream represented by this fisbone packet */ fp.nr_header_packet = *((ogg_uint32_t*)(op->packet+16)); /* number of header packets */ fp.granule_rate_n = *((ogg_int64_t*)(op->packet+20)); /* granulrate numerator */ fp.granule_rate_d = *((ogg_int64_t*)(op->packet+28)); /* granulrate denominator */ fp.start_granule = *((ogg_int64_t*)(op->packet+36)); /* start granule */ fp.preroll = *((ogg_uint32_t*)(op->packet+44)); /* preroll, for theora its 0 */ fp.granule_shift = *(op->packet+48); /* granule shift */ fp.current_header_size = op->bytes - FISBONE_SIZE; fp.message_header_fields = _ogg_calloc(fp.current_header_size+1, sizeof(char)); memcpy(fp.message_header_fields, op->packet+FISBONE_SIZE, fp.current_header_size); return fp; } int add_fishead_to_stream(ogg_stream_state *os, fishead_packet *fp) { ogg_packet op; op = ogg_from_fishead(fp); ogg_stream_packetin(os, &op); _ogg_free(op.packet); return 0; } int add_fisbone_to_stream(ogg_stream_state *os, fisbone_packet *fp) { ogg_packet op; op = ogg_from_fisbone(fp); ogg_stream_packetin(os, &op); _ogg_free(op.packet); return 0; } int add_eos_packet_to_stream(ogg_stream_state *os) { ogg_packet op; memset (&op, 0, sizeof(op)); op.e_o_s = 1; ogg_stream_packetin(os, &op); return 0; } int flush_ogg_stream_to_file(ogg_stream_state *os, FILE *out) { ogg_page og; int result; while((result = ogg_stream_flush(os, &og))) { if(!result) break; result = write_ogg_page_to_file(&og, out); if(result != og.header_len + og.body_len) return 1; } return 0; } mumble-1.3.4/3rdparty/speex-src/src/skeleton.h0000664000175000017500000000571614010707304021112 0ustar builderbuilder/* * skeleton.h * author: Tahseen Mohammad */ #ifndef _SKELETON_H #define _SKELETON_H #ifdef __cplusplus extern "C" { #endif #ifdef WIN32 #define snprintf _snprintf #endif #include #define SKELETON_VERSION_MAJOR 3 #define SKELETON_VERSION_MINOR 0 #define FISHEAD_IDENTIFIER "fishead\0" #define FISBONE_IDENTIFIER "fisbone\0" #define FISHEAD_SIZE 64 #define FISBONE_SIZE 52 #define FISBONE_MESSAGE_HEADER_OFFSET 44 /* fishead_packet holds a fishead header packet. */ typedef struct { ogg_uint16_t version_major; /* skeleton version major */ ogg_uint16_t version_minor; /* skeleton version minor */ /* Start time of the presentation * For a new stream presentationtime & basetime is same. */ ogg_int64_t ptime_n; /* presentation time numerator */ ogg_int64_t ptime_d; /* presentation time denominator */ ogg_int64_t btime_n; /* basetime numerator */ ogg_int64_t btime_d; /* basetime denominator */ /* will holds the time of origin of the stream, a 20 bit field. */ unsigned char UTC[20]; } fishead_packet; /* fisbone_packet holds a fisbone header packet. */ typedef struct { ogg_uint32_t serial_no; /* serial no of the corresponding stream */ ogg_uint32_t nr_header_packet; /* number of header packets */ /* granule rate is the temporal resolution of the logical bitstream */ ogg_int64_t granule_rate_n; /* granule rate numerator */ ogg_int64_t granule_rate_d; /* granule rate denominator */ ogg_int64_t start_granule; /* start granule value */ ogg_uint32_t preroll; /* preroll */ unsigned char granule_shift; /* 1 byte value holding the granule shift */ char *message_header_fields; /* holds all the message header fields */ /* current total size of the message header fields, for realloc purpose, initially zero */ ogg_uint32_t current_header_size; } fisbone_packet; extern int write_ogg_page_to_file(ogg_page *og, FILE *out); extern int add_message_header_field(fisbone_packet *fp, char *header_key, char *header_value); /* remember to deallocate the returned ogg_packet properly */ extern ogg_packet ogg_from_fishead(fishead_packet *fp); extern ogg_packet ogg_from_fisbone(fisbone_packet *fp); extern fishead_packet fishead_from_ogg(ogg_packet *op); extern fisbone_packet fisbone_from_ogg(ogg_packet *op); extern int add_fishead_to_stream(ogg_stream_state *os, fishead_packet *fp); extern int add_fisbone_to_stream(ogg_stream_state *os, fisbone_packet *fp); extern int add_eos_packet_to_stream(ogg_stream_state *os); extern int flush_ogg_stream_to_file(ogg_stream_state *os, FILE *out); #ifdef __cplusplus } #endif #endif /* _SKELETON_H */ mumble-1.3.4/3rdparty/speex-src/src/wav_io.h0000664000175000017500000000472414010707304020550 0ustar builderbuilder/* Copyright (C) 2002 Jean-Marc Valin File: wav_io.h Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef WAV_IO_H #define WAV_IO_H #include #include "speex/speex_types.h" #if !defined(__LITTLE_ENDIAN__) && ( defined(WORDS_BIGENDIAN) || defined(__BIG_ENDIAN__) ) #define le_short(s) ((short) ((unsigned short) (s) << 8) | ((unsigned short) (s) >> 8)) #define be_short(s) ((short) (s)) #else #define le_short(s) ((short) (s)) #define be_short(s) ((short) ((unsigned short) (s) << 8) | ((unsigned short) (s) >> 8)) #endif /** Convert little endian */ static inline spx_int32_t le_int(spx_int32_t i) { #if !defined(__LITTLE_ENDIAN__) && ( defined(WORDS_BIGENDIAN) || defined(__BIG_ENDIAN__) ) spx_uint32_t ui, ret; ui = i; ret = ui>>24; ret |= (ui>>8)&0x0000ff00; ret |= (ui<<8)&0x00ff0000; ret |= (ui<<24); return ret; #else return i; #endif } int read_wav_header(FILE *file, int *rate, int *channels, int *format, spx_int32_t *size); void write_wav_header(FILE *file, int rate, int channels, int format, int size); #endif mumble-1.3.4/3rdparty/speex-src/src/speexdec.10000664000175000017500000000277614010707304021002 0ustar builderbuilder.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.29. .TH SPEEXDEC "1" "September 2003" "speexdec version 1.1" "User Commands" .SH NAME speexdec \- The reference implementation speex decoder. .SH SYNOPSIS .B speexdec [\fIoptions\fR] \fIinput_file.spx \fR[\fIoutput_file\fR] .SH DESCRIPTION Decodes a Speex file and produce a WAV file or raw file .SS "input_file can be:" .TP filename.spx regular Speex file .TP - stdin .SS "output_file can be:" .TP filename.wav Wav file .TP filename.* Raw PCM file (any extension other that .wav) .TP - stdout .TP (nothing) Will be played to soundcard .SH OPTIONS .TP \fB\-\-enh\fR Enable perceptual enhancement (default) .TP \fB\-\-no\-enh\fR Disable perceptual enhancement .TP \fB\-\-force\-nb\fR Force decoding in narrowband .TP \fB\-\-force\-wb\fR Force decoding in wideband .TP \fB\-\-force\-uwb\fR Force decoding in ultra-wideband .TP \fB\-\-mono\fR Force decoding in mono .TP \fB\-\-stereo\fR Force decoding in stereo .TP \fB\-\-rate\fR n Force decoding at sampling rate n Hz .TP \fB\-\-packet\-loss\fR n Simulate n % random packet loss .TP \fB\-V\fR Verbose mode (show bit-rate) .TP \fB\-h\fR, \fB\-\-help\fR This help .TP \fB\-v\fR, \fB\-\-version\fR Version information .TP \fB\-\-pf\fR Deprecated, use \fB\-\-enh\fR instead .TP \fB\-\-no\-pf\fR Deprecated, use \fB\-\-no\-enh\fR instead .PP More information is available from the Speex site: http://www.speex.org .PP Please report bugs to the mailing list `speex-dev@xiph.org'. .SH COPYRIGHT Copyright \(co 2002 Jean-Marc Valin mumble-1.3.4/3rdparty/speex-src/src/.cvsignore0000664000175000017500000000003314010707304021100 0ustar builderbuilder.deps Makefile Makefile.in mumble-1.3.4/3rdparty/speex-src/src/getopt.c0000664000175000017500000007246314010707304020566 0ustar builderbuilder/* Getopt for GNU. NOTE: getopt is now part of the C library, so if you don't know what "Keep this file name-space clean" means, talk to drepper@gnu.org before changing it! Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99 Free Software Foundation, Inc. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with the GNU C Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* This tells Alpha OSF/1 not to define a getopt prototype in . Ditto for AIX 3.2 and . */ #ifndef _NO_PROTO # define _NO_PROTO #endif #ifdef HAVE_CONFIG_H # include "config.h" #endif #if !defined __STDC__ || !__STDC__ /* This is a separate conditional since some stdc systems reject `defined (const)'. */ # ifndef const # define const # endif #endif #include /* Comment out all this code if we are using the GNU C Library, and are not actually compiling the library itself. This code is part of the GNU C Library, but also included in many other GNU distributions. Compiling and linking in this code is a waste when using the GNU C library (especially if it is a shared library). Rather than having every GNU program understand `configure --with-gnu-libc' and omit the object files, it is simpler to just do this in the source for each such file. */ #define GETOPT_INTERFACE_VERSION 2 #if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 # include # if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION # define ELIDE_CODE # endif #endif #ifndef ELIDE_CODE /* This needs to come after some library #include to get __GNU_LIBRARY__ defined. */ #ifdef __GNU_LIBRARY__ /* Don't include stdlib.h for non-GNU C libraries because some of them contain conflicting prototypes for getopt. */ # include # include #endif /* GNU C library. */ #ifdef VMS # include # if HAVE_STRING_H - 0 # include # endif #endif #ifndef _ /* This is for other GNU distributions with internationalized messages. When compiling libc, the _ macro is predefined. */ # ifdef HAVE_LIBINTL_H # include # define _(msgid) gettext (msgid) # else # define _(msgid) (msgid) # endif #endif /* This version of `getopt' appears to the caller like standard Unix `getopt' but it behaves differently for the user, since it allows the user to intersperse the options with the other arguments. As `getopt' works, it permutes the elements of ARGV so that, when it is done, all the options precede everything else. Thus all application programs are extended to handle flexible argument order. Setting the environment variable POSIXLY_CORRECT disables permutation. Then the behavior is completely standard. GNU application programs can use a third alternative mode in which they can distinguish the relative order of options and other arguments. */ #include "getopt_win.h" /* For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, the argument value is returned here. Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ char *optarg; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to `getopt'. On entry to `getopt', zero means this is the first call; initialize. When `getopt' returns -1, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, `optind' communicates from one call to the next how much of ARGV has been scanned so far. */ /* 1003.2 says this must be 1 before any call. */ int optind = 1; /* Formerly, initialization of getopt depended on optind==0, which causes problems with re-calling getopt as programs generally don't know that. */ int __getopt_initialized; /* The next char to be scanned in the option-element in which the last option character we returned was found. This allows us to pick up the scan where we left off. If this is zero, or a null string, it means resume the scan by advancing to the next ARGV-element. */ static char *nextchar; /* Callers store zero here to inhibit the error message for unrecognized options. */ int opterr = 1; /* Set to an option character which was unrecognized. This must be initialized on some systems to avoid linking in the system's own getopt implementation. */ int optopt = '?'; /* Describe how to deal with options that follow non-option ARGV-elements. If the caller did not specify anything, the default is REQUIRE_ORDER if the environment variable POSIXLY_CORRECT is defined, PERMUTE otherwise. REQUIRE_ORDER means don't recognize them as options; stop option processing when the first non-option is seen. This is what Unix does. This mode of operation is selected by either setting the environment variable POSIXLY_CORRECT, or using `+' as the first character of the list of option characters. PERMUTE is the default. We permute the contents of ARGV as we scan, so that eventually all the non-options are at the end. This allows options to be given in any order, even with programs that were not written to expect this. RETURN_IN_ORDER is an option available to programs that were written to expect options and other ARGV-elements in any order and that care about the ordering of the two. We describe each non-option ARGV-element as if it were the argument of an option with character code 1. Using `-' as the first character of the list of option characters selects this mode of operation. The special argument `--' forces an end of option-scanning regardless of the value of `ordering'. In the case of RETURN_IN_ORDER, only `--' can cause `getopt' to return -1 with `optind' != ARGC. */ static enum { REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER } ordering; /* Value of POSIXLY_CORRECT environment variable. */ static char *posixly_correct; #ifdef __GNU_LIBRARY__ /* We want to avoid inclusion of string.h with non-GNU libraries because there are many ways it can cause trouble. On some systems, it contains special magic macros that don't work in GCC. */ # include # define my_index strchr #else #include /* Avoid depending on library functions or files whose names are inconsistent. */ #ifndef getenv extern char *getenv (); #endif static char * my_index (str, chr) const char *str; int chr; { while (*str) { if (*str == chr) return (char *) str; str++; } return 0; } /* If using GCC, we can safely declare strlen this way. If not using GCC, it is ok not to declare it. */ #ifdef __GNUC__ /* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h. That was relevant to code that was here before. */ # if (!defined __STDC__ || !__STDC__) && !defined strlen /* gcc with -traditional declares the built-in strlen to return int, and has done so at least since version 2.4.5. -- rms. */ extern int strlen (const char *); # endif /* not __STDC__ */ #endif /* __GNUC__ */ #endif /* not __GNU_LIBRARY__ */ /* Handle permutation of arguments. */ /* Describe the part of ARGV that contains non-options that have been skipped. `first_nonopt' is the index in ARGV of the first of them; `last_nonopt' is the index after the last of them. */ static int first_nonopt; static int last_nonopt; #ifdef _LIBC /* Bash 2.0 gives us an environment variable containing flags indicating ARGV elements that should not be considered arguments. */ /* Defined in getopt_init.c */ extern char *__getopt_nonoption_flags; static int nonoption_flags_max_len; static int nonoption_flags_len; static int original_argc; static char *const *original_argv; /* Make sure the environment variable bash 2.0 puts in the environment is valid for the getopt call we must make sure that the ARGV passed to getopt is that one passed to the process. */ static void __attribute__ ((unused)) store_args_and_env (int argc, char *const *argv) { /* XXX This is no good solution. We should rather copy the args so that we can compare them later. But we must not use malloc(3). */ original_argc = argc; original_argv = argv; } # ifdef text_set_element text_set_element (__libc_subinit, store_args_and_env); # endif /* text_set_element */ # define SWAP_FLAGS(ch1, ch2) \ if (nonoption_flags_len > 0) \ { \ char __tmp = __getopt_nonoption_flags[ch1]; \ __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ __getopt_nonoption_flags[ch2] = __tmp; \ } #else /* !_LIBC */ # define SWAP_FLAGS(ch1, ch2) #endif /* _LIBC */ /* Exchange two adjacent subsequences of ARGV. One subsequence is elements [first_nonopt,last_nonopt) which contains all the non-options that have been skipped so far. The other is elements [last_nonopt,optind), which contains all the options processed since those non-options were skipped. `first_nonopt' and `last_nonopt' are relocated so that they describe the new indices of the non-options in ARGV after they are moved. */ #if defined __STDC__ && __STDC__ static void exchange (char **); #endif static void exchange (argv) char **argv; { int bottom = first_nonopt; int middle = last_nonopt; int top = optind; char *tem; /* Exchange the shorter segment with the far end of the longer segment. That puts the shorter segment into the right place. It leaves the longer segment in the right place overall, but it consists of two parts that need to be swapped next. */ #ifdef _LIBC /* First make sure the handling of the `__getopt_nonoption_flags' string can work normally. Our top argument must be in the range of the string. */ if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len) { /* We must extend the array. The user plays games with us and presents new arguments. */ char *new_str = malloc (top + 1); if (new_str == NULL) nonoption_flags_len = nonoption_flags_max_len = 0; else { memset (__mempcpy (new_str, __getopt_nonoption_flags, nonoption_flags_max_len), '\0', top + 1 - nonoption_flags_max_len); nonoption_flags_max_len = top + 1; __getopt_nonoption_flags = new_str; } } #endif while (top > middle && middle > bottom) { if (top - middle > middle - bottom) { /* Bottom segment is the short one. */ int len = middle - bottom; register int i; /* Swap it with the top part of the top segment. */ for (i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[top - (middle - bottom) + i]; argv[top - (middle - bottom) + i] = tem; SWAP_FLAGS (bottom + i, top - (middle - bottom) + i); } /* Exclude the moved bottom segment from further swapping. */ top -= len; } else { /* Top segment is the short one. */ int len = top - middle; register int i; /* Swap it with the bottom part of the bottom segment. */ for (i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[middle + i]; argv[middle + i] = tem; SWAP_FLAGS (bottom + i, middle + i); } /* Exclude the moved top segment from further swapping. */ bottom += len; } } /* Update records for the slots the non-options now occupy. */ first_nonopt += (optind - last_nonopt); last_nonopt = optind; } /* Initialize the internal data when the first call is made. */ #if defined __STDC__ && __STDC__ static const char *_getopt_initialize (int, char *const *, const char *); #endif static const char * _getopt_initialize (argc, argv, optstring) int argc; char *const *argv; const char *optstring; { /* Start processing options with ARGV-element 1 (since ARGV-element 0 is the program name); the sequence of previously skipped non-option ARGV-elements is empty. */ first_nonopt = last_nonopt = optind; nextchar = NULL; posixly_correct = getenv ("POSIXLY_CORRECT"); /* Determine how to handle the ordering of options and nonoptions. */ if (optstring[0] == '-') { ordering = RETURN_IN_ORDER; ++optstring; } else if (optstring[0] == '+') { ordering = REQUIRE_ORDER; ++optstring; } else if (posixly_correct != NULL) ordering = REQUIRE_ORDER; else ordering = PERMUTE; #ifdef _LIBC if (posixly_correct == NULL && argc == original_argc && argv == original_argv) { if (nonoption_flags_max_len == 0) { if (__getopt_nonoption_flags == NULL || __getopt_nonoption_flags[0] == '\0') nonoption_flags_max_len = -1; else { const char *orig_str = __getopt_nonoption_flags; int len = nonoption_flags_max_len = strlen (orig_str); if (nonoption_flags_max_len < argc) nonoption_flags_max_len = argc; __getopt_nonoption_flags = (char *) malloc (nonoption_flags_max_len); if (__getopt_nonoption_flags == NULL) nonoption_flags_max_len = -1; else memset (__mempcpy (__getopt_nonoption_flags, orig_str, len), '\0', nonoption_flags_max_len - len); } } nonoption_flags_len = nonoption_flags_max_len; } else nonoption_flags_len = 0; #endif return optstring; } /* Scan elements of ARGV (whose length is ARGC) for option characters given in OPTSTRING. If an element of ARGV starts with '-', and is not exactly "-" or "--", then it is an option element. The characters of this element (aside from the initial '-') are option characters. If `getopt' is called repeatedly, it returns successively each of the option characters from each of the option elements. If `getopt' finds another option character, it returns that character, updating `optind' and `nextchar' so that the next call to `getopt' can resume the scan with the following option character or ARGV-element. If there are no more option characters, `getopt' returns -1. Then `optind' is the index in ARGV of the first ARGV-element that is not an option. (The ARGV-elements have been permuted so that those that are not options now come last.) OPTSTRING is a string containing the legitimate option characters. If an option character is seen that is not listed in OPTSTRING, return '?' after printing an error message. If you set `opterr' to zero, the error message is suppressed but we still return '?'. If a char in OPTSTRING is followed by a colon, that means it wants an arg, so the following text in the same ARGV-element, or the text of the following ARGV-element, is returned in `optarg'. Two colons mean an option that wants an optional arg; if there is text in the current ARGV-element, it is returned in `optarg', otherwise `optarg' is set to zero. If OPTSTRING starts with `-' or `+', it requests different methods of handling the non-option ARGV-elements. See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. Long-named options begin with `--' instead of `-'. Their names may be abbreviated as long as the abbreviation is unique or is an exact match for some defined option. If they have an argument, it follows the option name in the same ARGV-element, separated from the option name by a `=', or else the in next ARGV-element. When `getopt' finds a long-named option, it returns 0 if that option's `flag' field is nonzero, the value of the option's `val' field if the `flag' field is zero. The elements of ARGV aren't really const, because we permute them. But we pretend they're const in the prototype to be compatible with other systems. LONGOPTS is a vector of `struct option' terminated by an element containing a name which is zero. LONGIND returns the index in LONGOPT of the long-named option found. It is only valid when a long-named option has been found by the most recent call. If LONG_ONLY is nonzero, '-' as well as '--' can introduce long-named options. */ int _getopt_internal (argc, argv, optstring, longopts, longind, long_only) int argc; char *const *argv; const char *optstring; const struct option *longopts; int *longind; int long_only; { optarg = NULL; if (optind == 0 || !__getopt_initialized) { if (optind == 0) optind = 1; /* Don't scan ARGV[0], the program name. */ optstring = _getopt_initialize (argc, argv, optstring); __getopt_initialized = 1; } /* Test whether ARGV[optind] points to a non-option argument. Either it does not have option syntax, or there is an environment flag from the shell indicating it is not an option. The later information is only used when the used in the GNU libc. */ #ifdef _LIBC # define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \ || (optind < nonoption_flags_len \ && __getopt_nonoption_flags[optind] == '1')) #else # define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0') #endif if (nextchar == NULL || *nextchar == '\0') { /* Advance to the next ARGV-element. */ /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been moved back by the user (who may also have changed the arguments). */ if (last_nonopt > optind) last_nonopt = optind; if (first_nonopt > optind) first_nonopt = optind; if (ordering == PERMUTE) { /* If we have just processed some options following some non-options, exchange them so that the options come first. */ if (first_nonopt != last_nonopt && last_nonopt != optind) exchange ((char **) argv); else if (last_nonopt != optind) first_nonopt = optind; /* Skip any additional non-options and extend the range of non-options previously skipped. */ while (optind < argc && NONOPTION_P) optind++; last_nonopt = optind; } /* The special ARGV-element `--' means premature end of options. Skip it like a null option, then exchange with previous non-options as if it were an option, then skip everything else like a non-option. */ if (optind != argc && !strcmp (argv[optind], "--")) { optind++; if (first_nonopt != last_nonopt && last_nonopt != optind) exchange ((char **) argv); else if (first_nonopt == last_nonopt) first_nonopt = optind; last_nonopt = argc; optind = argc; } /* If we have done all the ARGV-elements, stop the scan and back over any non-options that we skipped and permuted. */ if (optind == argc) { /* Set the next-arg-index to point at the non-options that we previously skipped, so the caller will digest them. */ if (first_nonopt != last_nonopt) optind = first_nonopt; return -1; } /* If we have come to a non-option and did not permute it, either stop the scan or describe it to the caller and pass it by. */ if (NONOPTION_P) { if (ordering == REQUIRE_ORDER) return -1; optarg = argv[optind++]; return 1; } /* We have found another option-ARGV-element. Skip the initial punctuation. */ nextchar = (argv[optind] + 1 + (longopts != NULL && argv[optind][1] == '-')); } /* Decode the current option-ARGV-element. */ /* Check whether the ARGV-element is a long option. If long_only and the ARGV-element has the form "-f", where f is a valid short option, don't consider it an abbreviated form of a long option that starts with f. Otherwise there would be no way to give the -f short option. On the other hand, if there's a long option "fubar" and the ARGV-element is "-fu", do consider that an abbreviation of the long option, just like "--fu", and not "-f" with arg "u". This distinction seems to be the most useful approach. */ if (longopts != NULL && (argv[optind][1] == '-' || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1]))))) { char *nameend; const struct option *p; const struct option *pfound = NULL; int exact = 0; int ambig = 0; int indfound = -1; int option_index; for (nameend = nextchar; *nameend && *nameend != '='; nameend++) /* Do nothing. */ ; /* Test all long options for either exact match or abbreviated matches. */ for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!strncmp (p->name, nextchar, nameend - nextchar)) { if ((unsigned int) (nameend - nextchar) == (unsigned int) strlen (p->name)) { /* Exact match found. */ pfound = p; indfound = option_index; exact = 1; break; } else if (pfound == NULL) { /* First nonexact match found. */ pfound = p; indfound = option_index; } else /* Second or later nonexact match found. */ ambig = 1; } if (ambig && !exact) { if (opterr) fprintf (stderr, _("%s: option `%s' is ambiguous\n"), argv[0], argv[optind]); nextchar += strlen (nextchar); optind++; optopt = 0; return '?'; } if (pfound != NULL) { option_index = indfound; optind++; if (*nameend) { /* Don't test has_arg with >, because some C compilers don't allow it to be used on enums. */ if (pfound->has_arg) optarg = nameend + 1; else { if (opterr) { if (argv[optind - 1][1] == '-') /* --option */ fprintf (stderr, _("%s: option `--%s' doesn't allow an argument\n"), argv[0], pfound->name); else /* +option or -option */ fprintf (stderr, _("%s: option `%c%s' doesn't allow an argument\n"), argv[0], argv[optind - 1][0], pfound->name); } nextchar += strlen (nextchar); optopt = pfound->val; return '?'; } } else if (pfound->has_arg == 1) { if (optind < argc) optarg = argv[optind++]; else { if (opterr) fprintf (stderr, _("%s: option `%s' requires an argument\n"), argv[0], argv[optind - 1]); nextchar += strlen (nextchar); optopt = pfound->val; return optstring[0] == ':' ? ':' : '?'; } } nextchar += strlen (nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) { *(pfound->flag) = pfound->val; return 0; } return pfound->val; } /* Can't find it as a long option. If this is not getopt_long_only, or the option starts with '--' or is not a valid short option, then it's an error. Otherwise interpret it as a short option. */ if (!long_only || argv[optind][1] == '-' || my_index (optstring, *nextchar) == NULL) { if (opterr) { if (argv[optind][1] == '-') /* --option */ fprintf (stderr, _("%s: unrecognized option `--%s'\n"), argv[0], nextchar); else /* +option or -option */ fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), argv[0], argv[optind][0], nextchar); } nextchar = (char *) ""; optind++; optopt = 0; return '?'; } } /* Look at and handle the next short option-character. */ { char c = *nextchar++; char *temp = my_index (optstring, c); /* Increment `optind' when we start to process its last character. */ if (*nextchar == '\0') ++optind; if (temp == NULL || c == ':') { if (opterr) { if (posixly_correct) /* 1003.2 specifies the format of this message. */ fprintf (stderr, _("%s: illegal option -- %c\n"), argv[0], c); else fprintf (stderr, _("%s: invalid option -- %c\n"), argv[0], c); } optopt = c; return '?'; } /* Convenience. Treat POSIX -W foo same as long option --foo */ if (temp[0] == 'W' && temp[1] == ';') { char *nameend; const struct option *p; const struct option *pfound = NULL; int exact = 0; int ambig = 0; int indfound = 0; int option_index; /* This is an option that requires an argument. */ if (*nextchar != '\0') { optarg = nextchar; /* If we end this ARGV-element by taking the rest as an arg, we must advance to the next element now. */ optind++; } else if (optind == argc) { if (opterr) { /* 1003.2 specifies the format of this message. */ fprintf (stderr, _("%s: option requires an argument -- %c\n"), argv[0], c); } optopt = c; if (optstring[0] == ':') c = ':'; else c = '?'; return c; } else /* We already incremented `optind' once; increment it again when taking next ARGV-elt as argument. */ optarg = argv[optind++]; /* optarg is now the argument, see if it's in the table of longopts. */ for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++) /* Do nothing. */ ; /* Test all long options for either exact match or abbreviated matches. */ for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!strncmp (p->name, nextchar, nameend - nextchar)) { if ((unsigned int) (nameend - nextchar) == strlen (p->name)) { /* Exact match found. */ pfound = p; indfound = option_index; exact = 1; break; } else if (pfound == NULL) { /* First nonexact match found. */ pfound = p; indfound = option_index; } else /* Second or later nonexact match found. */ ambig = 1; } if (ambig && !exact) { if (opterr) fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), argv[0], argv[optind]); nextchar += strlen (nextchar); optind++; return '?'; } if (pfound != NULL) { option_index = indfound; if (*nameend) { /* Don't test has_arg with >, because some C compilers don't allow it to be used on enums. */ if (pfound->has_arg) optarg = nameend + 1; else { if (opterr) fprintf (stderr, _("\ %s: option `-W %s' doesn't allow an argument\n"), argv[0], pfound->name); nextchar += strlen (nextchar); return '?'; } } else if (pfound->has_arg == 1) { if (optind < argc) optarg = argv[optind++]; else { if (opterr) fprintf (stderr, _("%s: option `%s' requires an argument\n"), argv[0], argv[optind - 1]); nextchar += strlen (nextchar); return optstring[0] == ':' ? ':' : '?'; } } nextchar += strlen (nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) { *(pfound->flag) = pfound->val; return 0; } return pfound->val; } nextchar = NULL; return 'W'; /* Let the application handle it. */ } if (temp[1] == ':') { if (temp[2] == ':') { /* This is an option that accepts an argument optionally. */ if (*nextchar != '\0') { optarg = nextchar; optind++; } else optarg = NULL; nextchar = NULL; } else { /* This is an option that requires an argument. */ if (*nextchar != '\0') { optarg = nextchar; /* If we end this ARGV-element by taking the rest as an arg, we must advance to the next element now. */ optind++; } else if (optind == argc) { if (opterr) { /* 1003.2 specifies the format of this message. */ fprintf (stderr, _("%s: option requires an argument -- %c\n"), argv[0], c); } optopt = c; if (optstring[0] == ':') c = ':'; else c = '?'; } else /* We already incremented `optind' once; increment it again when taking next ARGV-elt as argument. */ optarg = argv[optind++]; nextchar = NULL; } } return c; } } int getopt (argc, argv, optstring) int argc; char *const *argv; const char *optstring; { return _getopt_internal (argc, argv, optstring, (const struct option *) 0, (int *) 0, 0); } #endif /* Not ELIDE_CODE. */ #ifdef TEST /* Compile with -DTEST to make an executable for use in testing the above definition of `getopt'. */ int main (argc, argv) int argc; char **argv; { int c; int digit_optind = 0; while (1) { int this_option_optind = optind ? optind : 1; c = getopt (argc, argv, "abc:d:0123456789"); if (c == -1) break; switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (digit_optind != 0 && digit_optind != this_option_optind) printf ("digits occur in two different argv-elements.\n"); digit_optind = this_option_optind; printf ("option %c\n", c); break; case 'a': printf ("option a\n"); break; case 'b': printf ("option b\n"); break; case 'c': printf ("option c with value `%s'\n", optarg); break; case '?': break; default: printf ("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); printf ("\n"); } exit (0); } #endif /* TEST */ mumble-1.3.4/3rdparty/speex-src/src/speexenc.c0000664000175000017500000007500714010707304021073 0ustar builderbuilder/* Copyright (C) 2002-2006 Jean-Marc Valin File: speexenc.c Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #if !defined WIN32 && !defined _WIN32 #include #endif #ifdef HAVE_GETOPT_H #include #endif #ifndef HAVE_GETOPT_LONG #include "getopt_win.h" #endif #include #include #include #include "speex/speex.h" #include "speex/speex_header.h" #include "speex/speex_stereo.h" #include #include "wav_io.h" #ifdef USE_SPEEXDSP #include #endif #if defined WIN32 || defined _WIN32 /* We need the following two to set stdout to binary */ #include #include #endif #include "skeleton.h" void comment_init(char **comments, int* length, char *vendor_string); void comment_add(char **comments, int* length, char *tag, char *val); /*Write an Ogg page to a file pointer*/ int oe_write_page(ogg_page *page, FILE *fp) { int written; written = fwrite(page->header,1,page->header_len, fp); written += fwrite(page->body,1,page->body_len, fp); return written; } #define MAX_FRAME_SIZE 2000 #define MAX_FRAME_BYTES 2000 /* Convert input audio bits, endians and channels */ static int read_samples(FILE *fin,int frame_size, int bits, int channels, int lsb, short * input, char *buff, spx_int32_t *size) { unsigned char in[MAX_FRAME_BYTES*2]; int i; short *s; int nb_read; size_t to_read; if (size && *size<=0) { return 0; } to_read = bits/8*channels*frame_size; /*Read input audio*/ if (size) { if (*size >= to_read) { *size -= to_read; } else { to_read = *size; *size = 0; } } if (buff) { for (i=0;i<12;i++) in[i]=buff[i]; nb_read = fread(in+12,1,to_read-12,fin) + 12; if (size) *size += 12; } else { nb_read = fread(in,1,to_read,fin); } nb_read /= bits/8*channels; /*fprintf (stderr, "%d\n", nb_read);*/ if (nb_read==0) return 0; s=(short*)in; if(bits==8) { /* Convert 8->16 bits */ for(i=frame_size*channels-1;i>=0;i--) { s[i]=(in[i]<<8)^0x8000; } } else { /* convert to our endian format */ for(i=0;iextra_headers; fp.granule_rate_n = header->rate; fp.granule_rate_d = 1; fp.start_granule = 0; fp.preroll = 3; fp.granule_shift = 0; add_message_header_field(&fp, "Content-Type", "audio/x-speex"); add_fisbone_to_stream(os, &fp); } void version() { const char* speex_version; speex_lib_ctl(SPEEX_LIB_GET_VERSION_STRING, (void*)&speex_version); printf ("speexenc (Speex encoder) version %s (compiled " __DATE__ ")\n", speex_version); printf ("Copyright (C) 2002-2006 Jean-Marc Valin\n"); } void version_short() { const char* speex_version; speex_lib_ctl(SPEEX_LIB_GET_VERSION_STRING, (void*)&speex_version); printf ("speexenc version %s\n", speex_version); printf ("Copyright (C) 2002-2006 Jean-Marc Valin\n"); } void usage() { printf ("Usage: speexenc [options] input_file output_file\n"); printf ("\n"); printf ("Encodes input_file using Speex. It can read the WAV or raw files.\n"); printf ("\n"); printf ("input_file can be:\n"); printf (" filename.wav wav file\n"); printf (" filename.* Raw PCM file (any extension other than .wav)\n"); printf (" - stdin\n"); printf ("\n"); printf ("output_file can be:\n"); printf (" filename.spx Speex file\n"); printf (" - stdout\n"); printf ("\n"); printf ("Options:\n"); printf (" -n, --narrowband Narrowband (8 kHz) input file\n"); printf (" -w, --wideband Wideband (16 kHz) input file\n"); printf (" -u, --ultra-wideband \"Ultra-wideband\" (32 kHz) input file\n"); printf (" --quality n Encoding quality (0-10), default 8\n"); printf (" --bitrate n Encoding bit-rate (use bit-rate n or lower)\n"); printf (" --vbr Enable variable bit-rate (VBR)\n"); printf (" --vbr-max-bitrate Set max VBR bit-rate allowed\n"); printf (" --abr rate Enable average bit-rate (ABR) at rate bps\n"); printf (" --vad Enable voice activity detection (VAD)\n"); printf (" --dtx Enable file-based discontinuous transmission (DTX)\n"); printf (" --comp n Set encoding complexity (0-10), default 3\n"); printf (" --nframes n Number of frames per Ogg packet (1-10), default 1\n"); #ifdef USE_SPEEXDSP printf (" --denoise Denoise the input before encoding\n"); printf (" --agc Apply adaptive gain control (AGC) before encoding\n"); #endif printf (" --no-highpass Disable the encoder's built-in high-pass filter\n"); printf (" --skeleton Outputs ogg skeleton metadata (may cause incompatibilities)\n"); printf (" --comment Add the given string as an extra comment. This may be\n"); printf (" used multiple times\n"); printf (" --author Author of this track\n"); printf (" --title Title for this track\n"); printf (" -h, --help This help\n"); printf (" -v, --version Version information\n"); printf (" -V Verbose mode (show bit-rate)\n"); printf (" --print-rate Print the bitrate for each frame to standard output\n"); printf ("Raw input options:\n"); printf (" --rate n Sampling rate for raw input\n"); printf (" --stereo Consider raw input as stereo\n"); printf (" --le Raw input is little-endian\n"); printf (" --be Raw input is big-endian\n"); printf (" --8bit Raw input is 8-bit unsigned\n"); printf (" --16bit Raw input is 16-bit signed\n"); printf ("Default raw PCM input is 16-bit, little-endian, mono\n"); printf ("\n"); printf ("More information is available from the Speex site: http://www.speex.org\n"); printf ("\n"); printf ("Please report bugs to the mailing list `speex-dev@xiph.org'.\n"); } int main(int argc, char **argv) { int nb_samples, total_samples=0, nb_encoded; int c; int option_index = 0; char *inFile, *outFile; FILE *fin, *fout; short input[MAX_FRAME_SIZE]; spx_int32_t frame_size; int quiet=0; spx_int32_t vbr_enabled=0; spx_int32_t vbr_max=0; int abr_enabled=0; spx_int32_t vad_enabled=0; spx_int32_t dtx_enabled=0; int nbBytes; const SpeexMode *mode=NULL; int modeID = -1; void *st; SpeexBits bits; char cbits[MAX_FRAME_BYTES]; int with_skeleton = 0; struct option long_options[] = { {"wideband", no_argument, NULL, 0}, {"ultra-wideband", no_argument, NULL, 0}, {"narrowband", no_argument, NULL, 0}, {"vbr", no_argument, NULL, 0}, {"vbr-max-bitrate", required_argument, NULL, 0}, {"abr", required_argument, NULL, 0}, {"vad", no_argument, NULL, 0}, {"dtx", no_argument, NULL, 0}, {"quality", required_argument, NULL, 0}, {"bitrate", required_argument, NULL, 0}, {"nframes", required_argument, NULL, 0}, {"comp", required_argument, NULL, 0}, #ifdef USE_SPEEXDSP {"denoise", no_argument, NULL, 0}, {"agc", no_argument, NULL, 0}, #endif {"no-highpass", no_argument, NULL, 0}, {"skeleton",no_argument,NULL, 0}, {"help", no_argument, NULL, 0}, {"quiet", no_argument, NULL, 0}, {"le", no_argument, NULL, 0}, {"be", no_argument, NULL, 0}, {"8bit", no_argument, NULL, 0}, {"16bit", no_argument, NULL, 0}, {"stereo", no_argument, NULL, 0}, {"rate", required_argument, NULL, 0}, {"version", no_argument, NULL, 0}, {"version-short", no_argument, NULL, 0}, {"comment", required_argument, NULL, 0}, {"author", required_argument, NULL, 0}, {"title", required_argument, NULL, 0}, {"print-rate", no_argument, NULL, 0}, {0, 0, 0, 0} }; int print_bitrate=0; spx_int32_t rate=0; spx_int32_t size; int chan=1; int fmt=16; spx_int32_t quality=-1; float vbr_quality=-1; int lsb=1; ogg_stream_state os; ogg_stream_state so; /* ogg stream for skeleton bitstream */ ogg_page og; ogg_packet op; int bytes_written=0, ret, result; int id=-1; SpeexHeader header; int nframes=1; spx_int32_t complexity=3; const char* speex_version; char vendor_string[64]; char *comments; int comments_length; int close_in=0, close_out=0; int eos=0; spx_int32_t bitrate=0; double cumul_bits=0, enc_frames=0; char first_bytes[12]; int wave_input=0; spx_int32_t tmp; #ifdef USE_SPEEXDSP SpeexPreprocessState *preprocess = NULL; int denoise_enabled=0, agc_enabled=0; #endif int highpass_enabled=1; int output_rate=0; spx_int32_t lookahead = 0; speex_lib_ctl(SPEEX_LIB_GET_VERSION_STRING, (void*)&speex_version); snprintf(vendor_string, sizeof(vendor_string), "Encoded with Speex %s", speex_version); comment_init(&comments, &comments_length, vendor_string); /*Process command-line options*/ while(1) { c = getopt_long (argc, argv, "nwuhvV", long_options, &option_index); if (c==-1) break; switch(c) { case 0: if (strcmp(long_options[option_index].name,"narrowband")==0) { modeID = SPEEX_MODEID_NB; } else if (strcmp(long_options[option_index].name,"wideband")==0) { modeID = SPEEX_MODEID_WB; } else if (strcmp(long_options[option_index].name,"ultra-wideband")==0) { modeID = SPEEX_MODEID_UWB; } else if (strcmp(long_options[option_index].name,"vbr")==0) { vbr_enabled=1; } else if (strcmp(long_options[option_index].name,"vbr-max-bitrate")==0) { vbr_max=atoi(optarg); if (vbr_max<1) { fprintf (stderr, "Invalid VBR max bit-rate value: %d\n", vbr_max); exit(1); } } else if (strcmp(long_options[option_index].name,"abr")==0) { abr_enabled=atoi(optarg); if (!abr_enabled) { fprintf (stderr, "Invalid ABR value: %d\n", abr_enabled); exit(1); } } else if (strcmp(long_options[option_index].name,"vad")==0) { vad_enabled=1; } else if (strcmp(long_options[option_index].name,"dtx")==0) { dtx_enabled=1; } else if (strcmp(long_options[option_index].name,"quality")==0) { quality = atoi (optarg); vbr_quality=atof(optarg); } else if (strcmp(long_options[option_index].name,"bitrate")==0) { bitrate = atoi (optarg); } else if (strcmp(long_options[option_index].name,"nframes")==0) { nframes = atoi (optarg); if (nframes<1) nframes=1; if (nframes>10) nframes=10; } else if (strcmp(long_options[option_index].name,"comp")==0) { complexity = atoi (optarg); #ifdef USE_SPEEXDSP } else if (strcmp(long_options[option_index].name,"denoise")==0) { denoise_enabled=1; } else if (strcmp(long_options[option_index].name,"agc")==0) { agc_enabled=1; #endif } else if (strcmp(long_options[option_index].name,"no-highpass")==0) { highpass_enabled=0; } else if (strcmp(long_options[option_index].name,"skeleton")==0) { with_skeleton=1; } else if (strcmp(long_options[option_index].name,"help")==0) { usage(); exit(0); } else if (strcmp(long_options[option_index].name,"quiet")==0) { quiet = 1; } else if (strcmp(long_options[option_index].name,"version")==0) { version(); exit(0); } else if (strcmp(long_options[option_index].name,"version-short")==0) { version_short(); exit(0); } else if (strcmp(long_options[option_index].name,"print-rate")==0) { output_rate=1; } else if (strcmp(long_options[option_index].name,"le")==0) { lsb=1; } else if (strcmp(long_options[option_index].name,"be")==0) { lsb=0; } else if (strcmp(long_options[option_index].name,"8bit")==0) { fmt=8; } else if (strcmp(long_options[option_index].name,"16bit")==0) { fmt=16; } else if (strcmp(long_options[option_index].name,"stereo")==0) { chan=2; } else if (strcmp(long_options[option_index].name,"rate")==0) { rate=atoi (optarg); } else if (strcmp(long_options[option_index].name,"comment")==0) { if (!strchr(optarg, '=')) { fprintf (stderr, "Invalid comment: %s\n", optarg); fprintf (stderr, "Comments must be of the form name=value\n"); exit(1); } comment_add(&comments, &comments_length, NULL, optarg); } else if (strcmp(long_options[option_index].name,"author")==0) { comment_add(&comments, &comments_length, "author=", optarg); } else if (strcmp(long_options[option_index].name,"title")==0) { comment_add(&comments, &comments_length, "title=", optarg); } break; case 'n': modeID = SPEEX_MODEID_NB; break; case 'h': usage(); exit(0); break; case 'v': version(); exit(0); break; case 'V': print_bitrate=1; break; case 'w': modeID = SPEEX_MODEID_WB; break; case 'u': modeID = SPEEX_MODEID_UWB; break; case '?': usage(); exit(1); break; } } if (argc-optind!=2) { usage(); exit(1); } inFile=argv[optind]; outFile=argv[optind+1]; /*Initialize Ogg stream struct*/ srand(time(NULL)); if (ogg_stream_init(&os, rand())==-1) { fprintf(stderr,"Error: stream init failed\n"); exit(1); } if (with_skeleton && ogg_stream_init(&so, rand())==-1) { fprintf(stderr,"Error: stream init failed\n"); exit(1); } if (strcmp(inFile, "-")==0) { #if defined WIN32 || defined _WIN32 _setmode(_fileno(stdin), _O_BINARY); #elif defined OS2 _fsetmode(stdin,"b"); #endif fin=stdin; } else { fin = fopen(inFile, "rb"); if (!fin) { perror(inFile); exit(1); } close_in=1; } { if (fread(first_bytes, 1, 12, fin) != 12) { perror("short file"); exit(1); } if (strncmp(first_bytes,"RIFF",4)==0 || strncmp(first_bytes,"riff",4)==0) { if (read_wav_header(fin, &rate, &chan, &fmt, &size)==-1) exit(1); wave_input=1; lsb=1; /* CHECK: exists big-endian .wav ?? */ } } if (modeID==-1 && !rate) { /* By default, use narrowband/8 kHz */ modeID = SPEEX_MODEID_NB; rate=8000; } else if (modeID!=-1 && rate) { mode = speex_lib_get_mode (modeID); if (rate>48000) { fprintf (stderr, "Error: sampling rate too high: %d Hz, try down-sampling\n", rate); exit(1); } else if (rate>25000) { if (modeID != SPEEX_MODEID_UWB) { fprintf (stderr, "Warning: Trying to encode in %s at %d Hz. I'll do it but I suggest you try ultra-wideband instead\n", mode->modeName , rate); } } else if (rate>12500) { if (modeID != SPEEX_MODEID_WB) { fprintf (stderr, "Warning: Trying to encode in %s at %d Hz. I'll do it but I suggest you try wideband instead\n", mode->modeName , rate); } } else if (rate>=6000) { if (modeID != SPEEX_MODEID_NB) { fprintf (stderr, "Warning: Trying to encode in %s at %d Hz. I'll do it but I suggest you try narrowband instead\n", mode->modeName , rate); } } else { fprintf (stderr, "Error: sampling rate too low: %d Hz\n", rate); exit(1); } } else if (modeID==-1) { if (rate>48000) { fprintf (stderr, "Error: sampling rate too high: %d Hz, try down-sampling\n", rate); exit(1); } else if (rate>25000) { modeID = SPEEX_MODEID_UWB; } else if (rate>12500) { modeID = SPEEX_MODEID_WB; } else if (rate>=6000) { modeID = SPEEX_MODEID_NB; } else { fprintf (stderr, "Error: Sampling rate too low: %d Hz\n", rate); exit(1); } } else if (!rate) { if (modeID == SPEEX_MODEID_NB) rate=8000; else if (modeID == SPEEX_MODEID_WB) rate=16000; else if (modeID == SPEEX_MODEID_UWB) rate=32000; } if (!quiet) if (rate!=8000 && rate!=16000 && rate!=32000) fprintf (stderr, "Warning: Speex is only optimized for 8, 16 and 32 kHz. It will still work at %d Hz but your mileage may vary\n", rate); if (!mode) mode = speex_lib_get_mode (modeID); speex_init_header(&header, rate, 1, mode); header.frames_per_packet=nframes; header.vbr=vbr_enabled; header.nb_channels = chan; { char *st_string="mono"; if (chan==2) st_string="stereo"; if (!quiet) fprintf (stderr, "Encoding %d Hz audio using %s mode (%s)\n", header.rate, mode->modeName, st_string); } /*fprintf (stderr, "Encoding %d Hz audio at %d bps using %s mode\n", header.rate, mode->bitrate, mode->modeName);*/ /*Initialize Speex encoder*/ st = speex_encoder_init(mode); if (strcmp(outFile,"-")==0) { #if defined WIN32 || defined _WIN32 _setmode(_fileno(stdout), _O_BINARY); #endif fout=stdout; } else { fout = fopen(outFile, "wb"); if (!fout) { perror(outFile); exit(1); } close_out=1; } speex_encoder_ctl(st, SPEEX_GET_FRAME_SIZE, &frame_size); speex_encoder_ctl(st, SPEEX_SET_COMPLEXITY, &complexity); speex_encoder_ctl(st, SPEEX_SET_SAMPLING_RATE, &rate); if (quality >= 0) { if (vbr_enabled) { if (vbr_max>0) speex_encoder_ctl(st, SPEEX_SET_VBR_MAX_BITRATE, &vbr_max); speex_encoder_ctl(st, SPEEX_SET_VBR_QUALITY, &vbr_quality); } else speex_encoder_ctl(st, SPEEX_SET_QUALITY, &quality); } if (bitrate) { if (quality >= 0 && vbr_enabled) fprintf (stderr, "Warning: --bitrate option is overriding --quality\n"); speex_encoder_ctl(st, SPEEX_SET_BITRATE, &bitrate); } if (vbr_enabled) { tmp=1; speex_encoder_ctl(st, SPEEX_SET_VBR, &tmp); } else if (vad_enabled) { tmp=1; speex_encoder_ctl(st, SPEEX_SET_VAD, &tmp); } if (dtx_enabled) speex_encoder_ctl(st, SPEEX_SET_DTX, &tmp); if (dtx_enabled && !(vbr_enabled || abr_enabled || vad_enabled)) { fprintf (stderr, "Warning: --dtx is useless without --vad, --vbr or --abr\n"); } else if ((vbr_enabled || abr_enabled) && (vad_enabled)) { fprintf (stderr, "Warning: --vad is already implied by --vbr or --abr\n"); } if (with_skeleton) { fprintf (stderr, "Warning: Enabling skeleton output may cause some decoders to fail.\n"); } if (abr_enabled) { speex_encoder_ctl(st, SPEEX_SET_ABR, &abr_enabled); } speex_encoder_ctl(st, SPEEX_SET_HIGHPASS, &highpass_enabled); speex_encoder_ctl(st, SPEEX_GET_LOOKAHEAD, &lookahead); #ifdef USE_SPEEXDSP if (denoise_enabled || agc_enabled) { preprocess = speex_preprocess_state_init(frame_size, rate); speex_preprocess_ctl(preprocess, SPEEX_PREPROCESS_SET_DENOISE, &denoise_enabled); speex_preprocess_ctl(preprocess, SPEEX_PREPROCESS_SET_AGC, &agc_enabled); lookahead += frame_size; } #endif /* first packet should be the skeleton header. */ if (with_skeleton) { add_fishead_packet(&so); if ((ret = flush_ogg_stream_to_file(&so, fout))) { fprintf (stderr,"Error: failed skeleton (fishead) header to output stream\n"); exit(1); } else bytes_written += ret; } /*Write header*/ { int packet_size; op.packet = (unsigned char *)speex_header_to_packet(&header, &packet_size); op.bytes = packet_size; op.b_o_s = 1; op.e_o_s = 0; op.granulepos = 0; op.packetno = 0; ogg_stream_packetin(&os, &op); free(op.packet); while((result = ogg_stream_flush(&os, &og))) { if(!result) break; ret = oe_write_page(&og, fout); if(ret != og.header_len + og.body_len) { fprintf (stderr,"Error: failed writing header to output stream\n"); exit(1); } else bytes_written += ret; } op.packet = (unsigned char *)comments; op.bytes = comments_length; op.b_o_s = 0; op.e_o_s = 0; op.granulepos = 0; op.packetno = 1; ogg_stream_packetin(&os, &op); } /* fisbone packet should be write after all bos pages */ if (with_skeleton) { add_fisbone_packet(&so, os.serialno, &header); if ((ret = flush_ogg_stream_to_file(&so, fout))) { fprintf (stderr,"Error: failed writing skeleton (fisbone )header to output stream\n"); exit(1); } else bytes_written += ret; } /* writing the rest of the speex header packets */ while((result = ogg_stream_flush(&os, &og))) { if(!result) break; ret = oe_write_page(&og, fout); if(ret != og.header_len + og.body_len) { fprintf (stderr,"Error: failed writing header to output stream\n"); exit(1); } else bytes_written += ret; } free(comments); /* write the skeleton eos packet */ if (with_skeleton) { add_eos_packet_to_stream(&so); if ((ret = flush_ogg_stream_to_file(&so, fout))) { fprintf (stderr,"Error: failed writing skeleton header to output stream\n"); exit(1); } else bytes_written += ret; } speex_bits_init(&bits); if (!wave_input) { nb_samples = read_samples(fin,frame_size,fmt,chan,lsb,input, first_bytes, NULL); } else { nb_samples = read_samples(fin,frame_size,fmt,chan,lsb,input, NULL, &size); } if (nb_samples==0) eos=1; total_samples += nb_samples; nb_encoded = -lookahead; /*Main encoding loop (one frame per iteration)*/ while (!eos || total_samples>nb_encoded) { id++; /*Encode current frame*/ if (chan==2) speex_encode_stereo_int(input, frame_size, &bits); #ifdef USE_SPEEXDSP if (preprocess) speex_preprocess(preprocess, input, NULL); #endif speex_encode_int(st, input, &bits); nb_encoded += frame_size; if (print_bitrate) { int tmp; char ch=13; speex_encoder_ctl(st, SPEEX_GET_BITRATE, &tmp); fputc (ch, stderr); cumul_bits += tmp; enc_frames += 1; if (!quiet) { if (vad_enabled || vbr_enabled || abr_enabled) fprintf (stderr, "Bitrate is use: %d bps (average %d bps) ", tmp, (int)(cumul_bits/enc_frames)); else fprintf (stderr, "Bitrate is use: %d bps ", tmp); if (output_rate) printf ("%d\n", tmp); } } if (wave_input) { nb_samples = read_samples(fin,frame_size,fmt,chan,lsb,input, NULL, &size); } else { nb_samples = read_samples(fin,frame_size,fmt,chan,lsb,input, NULL, NULL); } if (nb_samples==0) { eos=1; } if (eos && total_samples<=nb_encoded) op.e_o_s = 1; else op.e_o_s = 0; total_samples += nb_samples; if ((id+1)%nframes!=0) continue; speex_bits_insert_terminator(&bits); nbBytes = speex_bits_write(&bits, cbits, MAX_FRAME_BYTES); speex_bits_reset(&bits); op.packet = (unsigned char *)cbits; op.bytes = nbBytes; op.b_o_s = 0; /*Is this redundent?*/ if (eos && total_samples<=nb_encoded) op.e_o_s = 1; else op.e_o_s = 0; op.granulepos = (id+1)*frame_size-lookahead; if (op.granulepos>total_samples) op.granulepos = total_samples; /*printf ("granulepos: %d %d %d %d %d %d\n", (int)op.granulepos, id, nframes, lookahead, 5, 6);*/ op.packetno = 2+id/nframes; ogg_stream_packetin(&os, &op); /*Write all new pages (most likely 0 or 1)*/ while (ogg_stream_pageout(&os,&og)) { ret = oe_write_page(&og, fout); if(ret != og.header_len + og.body_len) { fprintf (stderr,"Error: failed writing header to output stream\n"); exit(1); } else bytes_written += ret; } } if ((id+1)%nframes!=0) { while ((id+1)%nframes!=0) { id++; speex_bits_pack(&bits, 15, 5); } nbBytes = speex_bits_write(&bits, cbits, MAX_FRAME_BYTES); op.packet = (unsigned char *)cbits; op.bytes = nbBytes; op.b_o_s = 0; op.e_o_s = 1; op.granulepos = (id+1)*frame_size-lookahead; if (op.granulepos>total_samples) op.granulepos = total_samples; op.packetno = 2+id/nframes; ogg_stream_packetin(&os, &op); } /*Flush all pages left to be written*/ while (ogg_stream_flush(&os, &og)) { ret = oe_write_page(&og, fout); if(ret != og.header_len + og.body_len) { fprintf (stderr,"Error: failed writing header to output stream\n"); exit(1); } else bytes_written += ret; } speex_encoder_destroy(st); speex_bits_destroy(&bits); ogg_stream_clear(&os); if (close_in) fclose(fin); if (close_out) fclose(fout); return 0; } /* Comments will be stored in the Vorbis style. It is describled in the "Structure" section of http://www.xiph.org/ogg/vorbis/doc/v-comment.html The comment header is decoded as follows: 1) [vendor_length] = read an unsigned integer of 32 bits 2) [vendor_string] = read a UTF-8 vector as [vendor_length] octets 3) [user_comment_list_length] = read an unsigned integer of 32 bits 4) iterate [user_comment_list_length] times { 5) [length] = read an unsigned integer of 32 bits 6) this iteration's user comment = read a UTF-8 vector as [length] octets } 7) [framing_bit] = read a single bit as boolean 8) if ( [framing_bit] unset or end of packet ) then ERROR 9) done. If you have troubles, please write to ymnk@jcraft.com. */ #define readint(buf, base) (((buf[base+3]<<24)&0xff000000)| \ ((buf[base+2]<<16)&0xff0000)| \ ((buf[base+1]<<8)&0xff00)| \ (buf[base]&0xff)) #define writeint(buf, base, val) do{ buf[base+3]=((val)>>24)&0xff; \ buf[base+2]=((val)>>16)&0xff; \ buf[base+1]=((val)>>8)&0xff; \ buf[base]=(val)&0xff; \ }while(0) void comment_init(char **comments, int* length, char *vendor_string) { int vendor_length=strlen(vendor_string); int user_comment_list_length=0; int len=4+vendor_length+4; char *p=(char*)malloc(len); if(p==NULL){ fprintf (stderr, "malloc failed in comment_init()\n"); exit(1); } writeint(p, 0, vendor_length); memcpy(p+4, vendor_string, vendor_length); writeint(p, 4+vendor_length, user_comment_list_length); *length=len; *comments=p; } void comment_add(char **comments, int* length, char *tag, char *val) { char* p=*comments; int vendor_length=readint(p, 0); int user_comment_list_length=readint(p, 4+vendor_length); int tag_len=(tag?strlen(tag):0); int val_len=strlen(val); int len=(*length)+4+tag_len+val_len; p=(char*)realloc(p, len); if(p==NULL){ fprintf (stderr, "realloc failed in comment_add()\n"); exit(1); } writeint(p, *length, tag_len+val_len); /* length of comment */ if(tag) memcpy(p+*length+4, tag, tag_len); /* comment */ memcpy(p+*length+4+tag_len, val, val_len); /* comment */ writeint(p, 4+vendor_length, user_comment_list_length+1); *comments=p; *length=len; } #undef readint #undef writeint mumble-1.3.4/3rdparty/speex-src/src/Makefile.am0000664000175000017500000000154214010707304021142 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # $Id: Makefile.am,v 1.11 2004/02/18 06:59:40 jm Exp $ # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include/speex -I$(top_builddir) @OGG_CFLAGS@ @SPEEXDSP_CFLAGS@ man_MANS = speexenc.1 speexdec.1 EXTRA_DIST = $(man_MANS) getopt_win.h getopt.c getopt1.c wave_out.c wave_out.h skeleton.h include_HEADERS = noinst_HEADERS = wav_io.h bin_PROGRAMS = speexenc speexdec CFLAGS += $(OGG_CFLAGS) speexenc_SOURCES = speexenc.c wav_io.c skeleton.c speexenc_LDADD = $(top_builddir)/libspeex/libspeex.la \ $(OGG_LIBS) @FFT_LIBS@ @SPEEXDSP_LIBS@ speexdec_SOURCES = speexdec.c wav_io.c speexdec_LDADD = $(top_builddir)/libspeex/libspeex.la \ $(OGG_LIBS) @FFT_LIBS@ mumble-1.3.4/3rdparty/speex-src/src/getopt_win.h0000664000175000017500000001334514010707304021442 0ustar builderbuilder/* Declarations for getopt. Copyright (C) 1989,90,91,92,93,94,96,97,98 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with the GNU C Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _GETOPT_H #ifndef __need_getopt # define _GETOPT_H 1 #endif #ifdef __cplusplus extern "C" { #endif /* For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, the argument value is returned here. Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ extern char *optarg; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to `getopt'. On entry to `getopt', zero means this is the first call; initialize. When `getopt' returns -1, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, `optind' communicates from one call to the next how much of ARGV has been scanned so far. */ extern int optind; /* Callers store zero here to inhibit the error message `getopt' prints for unrecognized options. */ extern int opterr; /* Set to an option character which was unrecognized. */ extern int optopt; #ifndef __need_getopt /* Describe the long-named options requested by the application. The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector of `struct option' terminated by an element containing a name which is zero. The field `has_arg' is: no_argument (or 0) if the option does not take an argument, required_argument (or 1) if the option requires an argument, optional_argument (or 2) if the option takes an optional argument. If the field `flag' is not NULL, it points to a variable that is set to the value given in the field `val' when the option is found, but left unchanged if the option is not found. To have a long-named option do something other than set an `int' to a compiled-in constant, such as set a value from `optarg', set the option's `flag' field to zero and its `val' field to a nonzero value (the equivalent single-letter option character, if there is one). For long options that have a zero `flag' field, `getopt' returns the contents of the `val' field. */ struct option { # if defined __STDC__ && __STDC__ const char *name; # else char *name; # endif /* has_arg can't be an enum because some compilers complain about type mismatches in all the code that assumes it is an int. */ int has_arg; int *flag; int val; }; /* Names for the values of the `has_arg' field of `struct option'. */ # define no_argument 0 # define required_argument 1 # define optional_argument 2 #endif /* need getopt */ /* Get definitions and prototypes for functions to process the arguments in ARGV (ARGC of them, minus the program name) for options given in OPTS. Return the option character from OPTS just read. Return -1 when there are no more options. For unrecognized options, or options missing arguments, `optopt' is set to the option letter, and '?' is returned. The OPTS string is a list of characters which are recognized option letters, optionally followed by colons, specifying that that letter takes an argument, to be placed in `optarg'. If a letter in OPTS is followed by two colons, its argument is optional. This behavior is specific to the GNU `getopt'. The argument `--' causes premature termination of argument scanning, explicitly telling `getopt' that there are no more options. If OPTS begins with `--', then non-option arguments are treated as arguments to the option '\0'. This behavior is specific to the GNU `getopt'. */ #if defined __STDC__ && __STDC__ # ifdef __GNU_LIBRARY__ /* Many other libraries have conflicting prototypes for getopt, with differences in the consts, in stdlib.h. To avoid compilation errors, only prototype getopt for the GNU C library. */ extern int getopt (int __argc, char *const *__argv, const char *__shortopts); # else /* not __GNU_LIBRARY__ */ extern int getopt (); # endif /* __GNU_LIBRARY__ */ # ifndef __need_getopt extern int getopt_long (int __argc, char *const *__argv, const char *__shortopts, const struct option *__longopts, int *__longind); extern int getopt_long_only (int __argc, char *const *__argv, const char *__shortopts, const struct option *__longopts, int *__longind); /* Internal only. Users should not call this directly. */ extern int _getopt_internal (int __argc, char *const *__argv, const char *__shortopts, const struct option *__longopts, int *__longind, int __long_only); # endif #else /* not __STDC__ */ extern int getopt (); # ifndef __need_getopt extern int getopt_long (); extern int getopt_long_only (); extern int _getopt_internal (); # endif #endif /* __STDC__ */ #ifdef __cplusplus } #endif /* Make sure we later can get all the definitions and declarations. */ #undef __need_getopt #endif /* getopt.h */ mumble-1.3.4/3rdparty/speex-src/src/speexenc.10000664000175000017500000000412514010707304021002 0ustar builderbuilder.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.29. .TH SPEEXENC "1" "September 2003" "speexenc version 1.1" "User Commands" .SH NAME speexenc \- The reference implementation speex encoder. .SH SYNOPSIS .B speexenc [\fIoptions\fR] \fIinput_file output_file\fR .SH DESCRIPTION Encodes input_file using Speex. It can read the WAV or raw files. .SS "input_file can be:" .TP filename.wav wav file .TP filename.* Raw PCM file (any extension other than .wav) .TP - stdin .SS "output_file can be:" .TP filename.spx Speex file .TP - stdout .SH OPTIONS .TP \fB\-n\fR, \fB\-\-narrowband\fR Narrowband (8 kHz) input file .TP \fB\-w\fR, \fB\-\-wideband\fR Wideband (16 kHz) input file .HP \fB\-u\fR, \fB\-\-ultra\-wideband\fR "Ultra-wideband" (32 kHz) input file .TP \fB\-\-quality\fR n Encoding quality (0-10), default 8 .TP \fB\-\-bitrate\fR n Encoding bit-rate (use bit-rate n or lower) .TP \fB\-\-vbr\fR Enable variable bit-rate (VBR) .TP \fB\-\-abr\fR rate Enable average bit-rate (ABR) at rate bps .TP \fB\-\-vad\fR Enable voice activity detection (VAD) .TP \fB\-\-dtx\fR Enable file-based discontinuous transmission (DTX) .TP \fB\-\-comp\fR n Set encoding complexity (0-10), default 3 .TP \fB\-\-nframes\fR n Number of frames per Ogg packet (1-10), default 1 .TP \fB\-\-comment\fR Add the given string as an extra comment. This may be used multiple times .TP \fB\-\-author\fR Author of this track .TP \fB\-\-title\fR Title for this track .TP \fB\-h\fR, \fB\-\-help\fR This help .TP \fB\-v\fR, \fB\-\-version\fR Version information .TP \fB\-V\fR Verbose mode (show bit-rate) .SS "Raw input options:" .TP \fB\-\-rate\fR n Sampling rate for raw input .TP \fB\-\-stereo\fR Consider raw input as stereo .TP \fB\-\-le\fR Raw input is little-endian .TP \fB\-\-be\fR Raw input is big-endian .TP \fB\-\-8bit\fR Raw input is 8-bit unsigned .TP \fB\-\-16bit\fR Raw input is 16-bit signed .PP Default raw PCM input is 16-bit, little-endian, mono .PP More information is available from the Speex site: http://www.speex.org .PP Please report bugs to the mailing list `speex-dev@xiph.org'. .SH COPYRIGHT Copyright \(co 2002 Jean-Marc Valin mumble-1.3.4/3rdparty/speex-src/src/wav_io.c0000664000175000017500000001322214010707304020534 0ustar builderbuilder/* Copyright (C) 2002 Jean-Marc Valin File: wav_io.c Routines to handle wav (RIFF) headers Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include "wav_io.h" int read_wav_header(FILE *file, int *rate, int *channels, int *format, spx_int32_t *size) { char ch[5]; spx_int32_t itmp; spx_int16_t stmp; spx_int32_t bpersec; spx_int16_t balign; int skip_bytes; int i; ch[4]=0; #if 0 fread(ch, 1, 4, file); if (strcmp(ch, "RIFF")!=0) { fseek(file, 0, SEEK_SET); return 0; } fread(&itmp, 4, 1, file); *size = le_int(itmp-36); fread(ch, 1, 4, file); if (strcmp(ch, "WAVE")!=0) { fprintf (stderr, "RIFF file is not a WAVE file\n"); return -1; } #endif fread(ch, 1, 4, file); while (strcmp(ch, "fmt ")!=0) { fread(&itmp, 4, 1, file); itmp = le_int(itmp); /*fprintf (stderr, "skip=%d\n", itmp);*/ /*strange way of seeking, but it works even for pipes*/ for (i=0;i2) { fprintf (stderr, "Only mono and (intensity) stereo supported\n"); return -1; } fread(&itmp, 4, 1, file); itmp = le_int(itmp); *rate = itmp; if (*rate != 8000 && *rate != 16000 && *rate != 11025 && *rate != 22050 && *rate != 32000 && *rate != 44100 && *rate != 48000) { fprintf (stderr, "Only 8 kHz (narrowband) and 16 kHz (wideband) supported (plus 11.025 kHz and 22.05 kHz, but your mileage may vary)\n"); return -1; } fread(&itmp, 4, 1, file); bpersec = le_int(itmp); fread(&stmp, 2, 1, file); balign = le_short(stmp); fread(&stmp, 2, 1, file); stmp = le_short(stmp); if (stmp!=16 && stmp!=8) { fprintf (stderr, "Only 8/16-bit linear supported\n"); return -1; } *format=stmp; if (bpersec!=*rate**channels*stmp/8) { fprintf (stderr, "Corrupted header: ByteRate mismatch\n"); return -1; } if (balign!=*channels*stmp/8) { fprintf (stderr, "Corrupted header: BlockAlign mismatch\n"); return -1; } /*strange way of seeking, but it works even for pipes*/ if (skip_bytes>0) for (i=0;i spxGlobalHeapEnd ) { #ifdef VERBOSE_ALLOC fprintf (stderr, "insufficient space for persistent alloc request %d bytes\n", size); #endif return 0; } #ifdef VERBOSE_ALLOC fprintf (stderr, "Persist Allocated %d chars at %x, %d remaining\n", size, ptr, ((int)spxGlobalHeapEnd - (int)spxGlobalHeapPtr)); #endif memset(ptr, 0, size); return ptr; } #define OVERRIDE_SPEEX_ALLOC_SCRATCH static inline void *speex_alloc_scratch (int size) { void *ptr; ptr = (void *) (((int)spxGlobalScratchPtr + BLOCK_MASK) & ~BLOCK_MASK); //Start on 8 boundary spxGlobalScratchPtr = (char *)((int)ptr + size); // Update pointer to next free location if (spxGlobalScratchPtr > spxGlobalScratchEnd ) { #ifdef VERBOSE_ALLOC fprintf (stderr, "insufficient space for scratch alloc request %d bytes\n", size); #endif return 0; } #ifdef VERBOSE_ALLOC fprintf (stderr, "Scratch Allocated %d chars at %x, %d remaining\n", size, ptr, ((int)spxGlobalScratchEnd - (int)spxGlobalScratchPtr)); #endif memset(ptr, 0, size); return ptr; } #define OVERRIDE_SPEEX_REALLOC static inline void *speex_realloc (void *ptr, int size) { #ifdef VERBOSE_ALLOC speex_warning("realloc attempted, not allowed"); #endif return 0; } #define OVERRIDE_SPEEX_FREE static inline void speex_free (void *ptr) { #ifdef VERBOSE_ALLOC speex_warning("at speex_free"); #endif } #define OVERRIDE_SPEEX_FREE_SCRATCH static inline void speex_free_scratch (void *ptr) { #ifdef VERBOSE_ALLOC speex_warning("at speex_free_scratch"); #endif } #endif /* !MANUAL_ALLOC */ mumble-1.3.4/3rdparty/speex-src/ti/speex_C64_test/0000775000175000017500000000000014010707304021530 5ustar builderbuildermumble-1.3.4/3rdparty/speex-src/ti/speex_C64_test/speex_C64_test.pjt0000664000175000017500000000365314010707304025055 0ustar builderbuilder; Code Composer Project File, Version 2.0 (do not modify or remove this line) [Project Settings] ProjectDir="C:\Speex\speex_14274\ti\speex_C64_test\" ProjectType=Executable CPUFamily=TMS320C64XX Tool="Compiler" Tool="CustomBuilder" Tool="DspBiosBuilder" Tool="Linker" Config="Debug" Config="Release" [Source Files] Source="..\..\..\..\CCStudio_v3.1\C6000\cgtools\lib\rts6400.lib" Source="..\..\libspeex\bits.c" Source="..\..\libspeex\cb_search.c" Source="..\..\libspeex\exc_10_16_table.c" Source="..\..\libspeex\exc_10_32_table.c" Source="..\..\libspeex\exc_20_32_table.c" Source="..\..\libspeex\exc_5_256_table.c" Source="..\..\libspeex\exc_5_64_table.c" Source="..\..\libspeex\exc_8_128_table.c" Source="..\..\libspeex\filters.c" Source="..\..\libspeex\gain_table.c" Source="..\..\libspeex\gain_table_lbr.c" Source="..\..\libspeex\lpc.c" Source="..\..\libspeex\lsp.c" Source="..\..\libspeex\lsp_tables_nb.c" Source="..\..\libspeex\ltp.c" Source="..\..\libspeex\modes.c" Source="..\..\libspeex\nb_celp.c" Source="..\..\libspeex\quant_lsp.c" Source="..\..\libspeex\sb_celp.c" Source="..\..\libspeex\speex.c" Source="..\..\libspeex\speex_callbacks.c" Source="..\..\libspeex\vbr.c" Source="..\..\libspeex\vq.c" Source="..\..\libspeex\window.c" Source="..\testenc-TI-C64x.c" Source="speex_C64_test.cmd" ["Compiler" Settings: "Debug"] Options=-g -o3 -fr"$(Proj_dir)\Debug" -i"..\ti" -i"..\include" -d"_DEBUG" -d"CONFIG_TI_C6X" -d"HAVE_CONFIG_H" -mv6400 ["Compiler" Settings: "Release"] Options=-o3 -fr"$(Proj_dir)\Release" -i"..\ti" -i"..\include" -d"HAVE_CONFIG_H" -mv6400 ["DspBiosBuilder" Settings: "Debug"] Options=-v6x ["DspBiosBuilder" Settings: "Release"] Options=-v6x ["Linker" Settings: "Debug"] Options=-c -m".\Debug\speex_C64_test.map" -o".\Debug\speex_C64_test.out" -w -x ["Linker" Settings: "Release"] Options=-c -m".\Release\speex_C64_test.map" -o".\Release\speex_C64_test.out" -w -x mumble-1.3.4/3rdparty/speex-src/ti/speex_C64_test/Makefile.am0000664000175000017500000000036414010707304023567 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies EXTRA_DIST = speex_C64_test.cmd speex_C64_test.pjt mumble-1.3.4/3rdparty/speex-src/ti/speex_C64_test/speex_C64_test.cmd0000664000175000017500000000426714010707304025025 0ustar builderbuilder/* Copyright (C) 2005 Psi Systems, Inc. File: speex_C64_test.cmd Linker command file with memory allocation for TI TMS320C6415 processor for use with TI Code Composer (TM) DSP development tools. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -stack 0x10000 -heap 0x10000 MEMORY { VECRAM : origin = 0x0, len = 0x200 IPRAM : origin = 0x200, len = 0x40000 IDRAM : origin = 0x80000, len = 0x70000 } SECTIONS { .vectors > VECRAM .text > IPRAM .bss > IDRAM .cinit > IDRAM .const > IDRAM .far > IDRAM .stack > IDRAM .cio > IDRAM .sysmem > IDRAM .switch > IDRAM .myheap > IDRAM } mumble-1.3.4/3rdparty/speex-src/ti/testenc-TI-C64x.c0000664000175000017500000001702514010707304021603 0ustar builderbuilder/* Copyright (C) 2005 Psi Systems, Inc. Author: Jean-Marc Valin File: testenc-TI-C64x.c Encoder/Decoder Loop Main file for TI TMS320C64xx processor for use with TI Code Composer (TM) DSP development tools. Modified from speexlib/testenc.c Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #undef DECODE_ONLY #define CHECK_RESULT /* Compares original file with encoded/decoder file */ #define TESTENC_BYTES_PER_FRAME 20 /* 8kbps */ #define TESTENC_QUALITY 4 /* 8kbps */ //#define TESTENC_BYTES_PER_FRAME 28 /* 11kbps */ //#define TESTENC_QUALITY 5 /* 11 kbps */ /* For narrowband, QUALITY maps to these bit rates (see modes.c, manual.pdf) * {1, 8, 2, 3, 3, 4, 4, 5, 5, 6, 7} * 0 -> 2150 * 1 -> 3950 * 2 -> 5950 * 3 -> 8000 * 4 -> 8000 * 5 -> 11000 * 6 -> 11000 * 7 -> 15000 * 8 -> 15000 * 9 -> 18200 *10 -> 26400 */ #ifdef FIXED_DEBUG extern long long spx_mips; #endif #ifdef MANUAL_ALLOC /* Take all Speex space from this private heap */ /* This is useful for multichannel applications */ #pragma DATA_SECTION(spxHeap, ".myheap"); static char spxHeap[SPEEX_PERSIST_STACK_SIZE]; #pragma DATA_SECTION(spxScratch, ".myheap"); static char spxScratch[SPEEX_SCRATCH_STACK_SIZE]; char *spxGlobalHeapPtr, *spxGlobalHeapEnd; char *spxGlobalScratchPtr, *spxGlobalScratchEnd; #endif /* MANUAL_ALLOC */ #include void main() { char *outFile, *bitsFile; FILE *fout, *fbits=NULL; #if !defined(DECODE_ONLY) || defined(CHECK_RESULT) char *inFile; FILE *fin; short in_short[FRAME_SIZE]; #endif short out_short[FRAME_SIZE]; #ifndef DECODE_ONLY int nbBits; #endif #ifdef CHECK_RESULT float sigpow,errpow,snr, seg_snr=0; int snr_frames = 0; int i; #endif char cbits[200]; void *st; void *dec; SpeexBits bits; spx_int32_t tmp; unsigned long bitCount=0; spx_int32_t skip_group_delay; SpeexCallback callback; #ifdef CHECK_RESULT sigpow = 0; errpow = 0; #endif #ifdef MANUAL_ALLOC spxGlobalHeapPtr = spxHeap; spxGlobalHeapEnd = spxHeap + sizeof(spxHeap); spxGlobalScratchPtr = spxScratch; spxGlobalScratchEnd = spxScratch + sizeof(spxScratch); #endif st = speex_encoder_init(&speex_nb_mode); #ifdef MANUAL_ALLOC spxGlobalScratchPtr = spxScratch; /* Reuse scratch for decoder */ #endif dec = speex_decoder_init(&speex_nb_mode); callback.callback_id = SPEEX_INBAND_CHAR; callback.func = speex_std_char_handler; callback.data = stderr; speex_decoder_ctl(dec, SPEEX_SET_HANDLER, &callback); callback.callback_id = SPEEX_INBAND_MODE_REQUEST; callback.func = speex_std_mode_request_handler; callback.data = st; speex_decoder_ctl(dec, SPEEX_SET_HANDLER, &callback); tmp=0; speex_decoder_ctl(dec, SPEEX_SET_ENH, &tmp); tmp=0; speex_encoder_ctl(st, SPEEX_SET_VBR, &tmp); tmp=TESTENC_QUALITY; speex_encoder_ctl(st, SPEEX_SET_QUALITY, &tmp); tmp=1; /* Lowest */ speex_encoder_ctl(st, SPEEX_SET_COMPLEXITY, &tmp); #ifdef DISABLE_HIGHPASS /* Turn this off if you want to measure SNR (on by default) */ tmp=0; speex_encoder_ctl(st, SPEEX_SET_HIGHPASS, &tmp); speex_decoder_ctl(dec, SPEEX_SET_HIGHPASS, &tmp); #endif speex_encoder_ctl(st, SPEEX_GET_LOOKAHEAD, &skip_group_delay); speex_decoder_ctl(dec, SPEEX_GET_LOOKAHEAD, &tmp); skip_group_delay += tmp; fprintf (stderr, "decoder lookahead = %d\n", skip_group_delay); #ifdef DECODE_ONLY bitsFile = "c:\\speextrunktest\\samples\\malebitsin.dat"; fbits = fopen(bitsFile, "rb"); #else bitsFile = "c:\\speextrunktest\\samples\\malebits6x.dat"; fbits = fopen(bitsFile, "wb"); #endif #if !defined(DECODE_ONLY) || defined(CHECK_RESULT) inFile = "c:\\speextrunktest\\samples\\male.snd"; fin = fopen(inFile, "rb"); #endif outFile = "c:\\speextrunktest\\samples\\maleout6x.snd"; fout = fopen(outFile, "wb+"); speex_bits_init(&bits); #ifndef DECODE_ONLY while (!feof(fin)) { fread(in_short, sizeof(short), FRAME_SIZE, fin); if (feof(fin)) break; speex_bits_reset(&bits); speex_encode_int(st, in_short, &bits); nbBits = speex_bits_write(&bits, cbits, 200); bitCount+=bits.nbBits; fwrite(cbits, 1, nbBits, fbits); speex_bits_rewind(&bits); #else /* DECODE_ONLY */ while (!feof(fbits)) { fread(cbits, 1, TESTENC_BYTES_PER_FRAME, fbits); if (feof(fbits)) break; speex_bits_read_from(&bits, cbits, TESTENC_BYTES_PER_FRAME); // bitCount+=160; /* only correct for 8kbps, but just for the printf */ bitCount+=bits.nbBits; #endif speex_decode_int(dec, &bits, out_short); speex_bits_reset(&bits); fwrite(&out_short[skip_group_delay], sizeof(short), FRAME_SIZE-skip_group_delay, fout); skip_group_delay = 0; #if 1 fprintf (stderr, "Bits so far: %lu \n", bitCount); #endif } fprintf (stderr, "Total encoded size: %lu bits\n", bitCount); speex_encoder_destroy(st); speex_decoder_destroy(dec); #ifdef CHECK_RESULT rewind(fin); rewind(fout); while ( FRAME_SIZE == fread(in_short, sizeof(short), FRAME_SIZE, fin) && FRAME_SIZE == fread(out_short, sizeof(short), FRAME_SIZE,fout) ) { float s=0, e=0; for (i=0;i VECT .bootmem: {} > DARAM .text: {} > SARAM_B .cinit: {} > SARAM_B .switch: {} > SARAM_B .bss: {} > DARAM /* .far: {} > DARAM*/ .const: {} > DARAM .sysmem: {} > DARAM_B .cio: {} > DARAM .stack: {} > DARAM .sysstack: {} > DARAM .myheap: {} > SARAM_A } mumble-1.3.4/3rdparty/speex-src/ti/speex_C55_test/speex_C55_test.pjt0000664000175000017500000000363014010707304025050 0ustar builderbuilder; Code Composer Project File, Version 2.0 (do not modify or remove this line) [Project Settings] ProjectDir="C:\Speex\speex_14274\ti\speex_C55_test\" ProjectType=Executable CPUFamily=TMS320C55XX Tool="Compiler" Tool="CustomBuilder" Tool="DspBiosBuilder" Tool="Linker" Config="Debug" Config="Release" [Source Files] Source="..\..\libspeex\bits.c" Source="..\..\libspeex\cb_search.c" Source="..\..\libspeex\exc_10_16_table.c" Source="..\..\libspeex\exc_10_32_table.c" Source="..\..\libspeex\exc_20_32_table.c" Source="..\..\libspeex\exc_5_256_table.c" Source="..\..\libspeex\exc_5_64_table.c" Source="..\..\libspeex\exc_8_128_table.c" Source="..\..\libspeex\filters.c" Source="..\..\libspeex\gain_table.c" Source="..\..\libspeex\gain_table_lbr.c" Source="..\..\libspeex\lpc.c" Source="..\..\libspeex\lsp.c" Source="..\..\libspeex\lsp_tables_nb.c" Source="..\..\libspeex\ltp.c" Source="..\..\libspeex\modes.c" Source="..\..\libspeex\nb_celp.c" Source="..\..\libspeex\quant_lsp.c" Source="..\..\libspeex\sb_celp.c" Source="..\..\libspeex\speex.c" Source="..\..\libspeex\speex_callbacks.c" Source="..\..\libspeex\vbr.c" Source="..\..\libspeex\vq.c" Source="..\..\libspeex\window.c" Source="..\..\ti\testenc-TI-C5x.c" Source="speex_C55_test.cmd" ["Compiler" Settings: "Debug"] Options=-g -q -o3 -fr"..\ti\speex_C55_test\Debug" -i"..\ti" -i"..\include" -d"_DEBUG" -d"CONFIG_TI_C55X" -d"HAVE_CONFIG_H" -mn ["Compiler" Settings: "Release"] Options=-q -o2 -fr"..\ti\speex_C55_test\Release" -i"..\ti" -i"..\include" -d"CONFIG_TI_C55X" -d"HAVE_CONFIG_H" -mn ["DspBiosBuilder" Settings: "Debug"] Options=-v55 ["DspBiosBuilder" Settings: "Release"] Options=-v55 ["Linker" Settings: "Debug"] Options=-q -c -m".\Debug\speex_C55_test.map" -o".\Debug\speex_C55_test.out" -w -x ["Linker" Settings: "Release"] Options=-q -c -m".\Release\speex_C55_test.map" -o".\Release\speex_C55_test.out" -w -x mumble-1.3.4/3rdparty/speex-src/ti/speex_C55_test/Makefile.am0000664000175000017500000000036414010707304023567 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies EXTRA_DIST = speex_C55_test.cmd speex_C55_test.pjt mumble-1.3.4/3rdparty/speex-src/ti/speex_C54_test/0000775000175000017500000000000014010707304021527 5ustar builderbuildermumble-1.3.4/3rdparty/speex-src/ti/speex_C54_test/speex_C54_test.pjt0000664000175000017500000000372514010707304025053 0ustar builderbuilder; Code Composer Project File, Version 2.0 (do not modify or remove this line) [Project Settings] ProjectDir="C:\Speex\speex_14274\ti\speex_C54_test\" ProjectType=Executable CPUFamily=TMS320C54XX Tool="Compiler" Tool="CustomBuilder" Tool="DspBiosBuilder" Tool="Linker" Config="Debug" Config="Release" [Source Files] Source="..\..\libspeex\bits.c" Source="..\..\libspeex\cb_search.c" Source="..\..\libspeex\exc_10_16_table.c" Source="..\..\libspeex\exc_10_32_table.c" Source="..\..\libspeex\exc_20_32_table.c" Source="..\..\libspeex\exc_5_256_table.c" Source="..\..\libspeex\exc_5_64_table.c" Source="..\..\libspeex\exc_8_128_table.c" Source="..\..\libspeex\filters.c" Source="..\..\libspeex\gain_table.c" Source="..\..\libspeex\gain_table_lbr.c" Source="..\..\libspeex\lpc.c" Source="..\..\libspeex\lsp.c" Source="..\..\libspeex\lsp_tables_nb.c" Source="..\..\libspeex\ltp.c" Source="..\..\libspeex\modes.c" Source="..\..\libspeex\nb_celp.c" Source="..\..\libspeex\quant_lsp.c" Source="..\..\libspeex\sb_celp.c" Source="..\..\libspeex\speex.c" Source="..\..\libspeex\speex_callbacks.c" Source="..\..\libspeex\vbr.c" Source="..\..\libspeex\vq.c" Source="..\..\libspeex\window.c" Source="..\..\ti\testenc-TI-C5x.c" Source="speex_C54_test.cmd" ["Compiler" Settings: "Debug"] Options=-g -q -o3 -fr"..\ti\speex_C54_test\Debug" -i"..\ti" -i"..\include" -d"_DEBUG" -d"CONFIG_TI_C54X" -d"HAVE_CONFIG_H" -d"NO_LONGLONG" -mf -ms ["Compiler" Settings: "Release"] Options=-q -o2 -fr"..\ti\speex_C54_test\Release" -i"..\ti" -i"..\include" -d"CONFIG_TI_C54X" -d"HAVE_CONFIG_H" -d"NO_LONGLONG" -mf -ms ["DspBiosBuilder" Settings: "Debug"] Options=-v54 ["DspBiosBuilder" Settings: "Release"] Options=-v54 ["Linker" Settings: "Debug"] Options=-q -c -heap4096 -m".\Debug\speex_C54_test.map" -o".\Debug\speex_C54_test.out" -stack4096 -w -x ["Linker" Settings: "Release"] Options=-q -c -m".\Release\speex_C54_test.map" -o".\Release\speex_C54_test.out" -w -x mumble-1.3.4/3rdparty/speex-src/ti/speex_C54_test/speex_C54_test.cmd0000664000175000017500000000611514010707304025015 0ustar builderbuilder/* Copyright (C) 2005 Psi Systems, Inc. File: speex_C54_test.cmd Linker command file with memory allocation for TI TMS320VC5416 processor for use with TI Code Composer (TM) DSP development tools. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -c -stack 0x2000 -heap 0x1000 /* If private memory allocation is used for Speex */ /*-heap 0x6000 /* If calloc is used for Speex */ -lrts_ext.lib MEMORY { /* PAGE 0: P_DARAM03: origin = 0x80, len = 0x7f00*/ PAGE 0: P_DARAM03: origin = 0x5000, len = 0x2f80 PAGE 0: VECT: origin = 0x7f80, len = 0x80 PAGE 0: P_DARAM47: origin = 0x18000, len = 0x8000 PAGE 0: SARAM03: origin = 0x28000, len = 0x8000 PAGE 0: SARAM47: origin = 0x38000, len = 0x8000 PAGE 1: USERREGS: origin = 0x60, len = 0x1a PAGE 1: BIOSREGS: origin = 0x7c, len = 0x4 PAGE 1: CSLREGS: origin = 0x7a, len = 0x2 D_DARAM03: origin = 0x80, len = 0x4f80 D_DARAM47: origin = 0x8000, len = 0x8000 } SECTIONS { .vectors: {} > VECT PAGE 0 .bootmem: {rts_ext.lib (.text)} > P_DARAM03 PAGE 0 /* .bootmem: {} > P_DARAM03 PAGE 0 */ .text: {} > SARAM03 PAGE 0 .cinit: {} > SARAM03 PAGE 0 .switch: {} > SARAM03 PAGE 0 .bss: {} > D_DARAM03 | D_DARAM47 PAGE 1 .far: {} > D_DARAM03 | D_DARAM47 PAGE 1 .const: {} > D_DARAM03 | D_DARAM47 PAGE 1 .sysmem: {} > D_DARAM47 PAGE 1 .cio: {} > D_DARAM03 | D_DARAM47 PAGE 1 .stack: {} > D_DARAM03 | D_DARAM47 PAGE 1 .myheap: {} > D_DARAM47 PAGE 1 } mumble-1.3.4/3rdparty/speex-src/ti/speex_C54_test/Makefile.am0000664000175000017500000000036614010707304023570 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies EXTRA_DIST = speex_C54_test.cmd speex_C54_test.pjt mumble-1.3.4/3rdparty/speex-src/ti/Makefile.am0000664000175000017500000000050614010707304020766 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies SUBDIRS = speex_C54_test speex_C55_test speex_C64_test EXTRA_DIST = config.h testenc-TI-C5x.c os_support_custom.h testenc-TI-C64x.c mumble-1.3.4/3rdparty/speex-src/ti/testenc-TI-C5x.c0000664000175000017500000002136414010707304021517 0ustar builderbuilder/* Copyright (C) 2005 Psi Systems, Inc. File: testenc-TI-C5x.c Encoder/Decoder Loop Main file for TI C54xx and C55xx processors for use with TI Code Composer (TM) DSP development tools. Modified from speexlib/testenc.c Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif /* Modified from speexlib/testenc.c for Code Composer simulator */ #include #include #include #include #include <..\libspeex\arch.h> #undef DECODE_ONLY #define CHECK_RESULT /* Compares original file with encoded/decoder file */ #define TESTENC_BYTES_PER_FRAME 20 /* 8kbps */ #define TESTENC_QUALITY 4 /* 8kbps */ //#define TESTENC_BYTES_PER_FRAME 28 /* 11kbps */ //#define TESTENC_QUALITY 5 /* 11 kbps */ /* For narrowband, QUALITY maps to these bit rates (see modes.c, manual.pdf) * {1, 8, 2, 3, 3, 4, 4, 5, 5, 6, 7} * 0 -> 2150 * 1 -> 3950 * 2 -> 5950 * 3 -> 8000 * 4 -> 8000 * 5 -> 11000 * 6 -> 11000 * 7 -> 15000 * 8 -> 15000 * 9 -> 18200 *10 -> 26400 */ #ifdef FIXED_DEBUG extern long long spx_mips; #endif #include #ifdef MANUAL_ALLOC /* Take all Speex space from this private heap */ /* This is useful for multichannel applications */ #pragma DATA_SECTION(spxHeap, ".myheap"); static char spxHeap[SPEEX_PERSIST_STACK_SIZE]; #pragma DATA_SECTION(spxScratch, ".myheap"); static char spxScratch[SPEEX_SCRATCH_STACK_SIZE]; char *spxGlobalHeapPtr, *spxGlobalHeapEnd; char *spxGlobalScratchPtr, *spxGlobalScratchEnd; #endif void byte2word(short* pInBuf, short* pOutBuf, int nWords) { short *pIn, *pOut, sNext; int i; pIn = pInBuf; pOut = pOutBuf; for(i=0;i> 8); } } void main() { char *outFile, *bitsFile; FILE *fout, *fbits=NULL; #if !defined(DECODE_ONLY) || defined(CHECK_RESULT) char *inFile; FILE *fin; short in_short[FRAME_SIZE]; #endif short out_short[FRAME_SIZE]; short inout_byte[2*FRAME_SIZE]; #ifndef DECODE_ONLY int nbChars; #endif #ifdef CHECK_RESULT float sigpow,errpow,snr, seg_snr=0; int snr_frames = 0; int i; #endif char cbits[TESTENC_BYTES_PER_FRAME/2 + 2]; /* temp store for encoded data */ void *st; void *dec; SpeexBits bits; spx_int32_t tmp; unsigned long bitCount=0; spx_int32_t skip_group_delay; SpeexCallback callback; /* C54xx defaults to max wait states, even for parts like C5416 with larger internal memory. Need to force the wait state register to zero */ #ifdef CONFIG_TI_C54X asm(" STM #0,SWWSR"); #endif #ifdef CHECK_RESULT sigpow = 0; errpow = 0; #endif #ifdef MANUAL_ALLOC spxGlobalHeapPtr = spxHeap; spxGlobalHeapEnd = spxHeap + sizeof(spxHeap); spxGlobalScratchPtr = spxScratch; spxGlobalScratchEnd = spxScratch + sizeof(spxScratch); #endif st = speex_encoder_init(&speex_nb_mode); #ifdef MANUAL_ALLOC spxGlobalScratchPtr = spxScratch; /* Reuse scratch for decoder */ #endif dec = speex_decoder_init(&speex_nb_mode); callback.callback_id = SPEEX_INBAND_CHAR; callback.func = speex_std_char_handler; callback.data = stderr; speex_decoder_ctl(dec, SPEEX_SET_HANDLER, &callback); callback.callback_id = SPEEX_INBAND_MODE_REQUEST; callback.func = speex_std_mode_request_handler; callback.data = st; speex_decoder_ctl(dec, SPEEX_SET_HANDLER, &callback); tmp=0; speex_decoder_ctl(dec, SPEEX_SET_ENH, &tmp); tmp=0; speex_encoder_ctl(st, SPEEX_SET_VBR, &tmp); tmp=TESTENC_QUALITY; speex_encoder_ctl(st, SPEEX_SET_QUALITY, &tmp); tmp=1; /* Lowest */ speex_encoder_ctl(st, SPEEX_SET_COMPLEXITY, &tmp); #ifdef DISABLE_HIGHPASS /* Turn this off if you want to measure SNR (on by default) */ tmp=0; speex_encoder_ctl(st, SPEEX_SET_HIGHPASS, &tmp); speex_decoder_ctl(dec, SPEEX_SET_HIGHPASS, &tmp); #endif speex_encoder_ctl(st, SPEEX_GET_LOOKAHEAD, &skip_group_delay); speex_decoder_ctl(dec, SPEEX_GET_LOOKAHEAD, &tmp); skip_group_delay += tmp; fprintf (stderr, "decoder lookahead = %ld\n", skip_group_delay); #ifdef DECODE_ONLY bitsFile = "c:\\speextrunktest\\samples\\malebitsin.dat"; fbits = fopen(bitsFile, "rb"); #else bitsFile = "c:\\speextrunktest\\samples\\malebits5x.dat"; fbits = fopen(bitsFile, "wb"); #endif #if !defined(DECODE_ONLY) || defined(CHECK_RESULT) inFile = "c:\\speextrunktest\\samples\\male.snd"; fin = fopen(inFile, "rb"); #endif outFile = "c:\\speextrunktest\\samples\\maleout5x.snd"; fout = fopen(outFile, "wb+"); speex_bits_init(&bits); #ifndef DECODE_ONLY while (!feof(fin)) { fread(inout_byte, 2, FRAME_SIZE, fin); byte2word(inout_byte, in_short, FRAME_SIZE); /* C5x has 16-bit char */ if (feof(fin)) break; speex_bits_reset(&bits); speex_encode_int(st, in_short, &bits); nbChars = speex_bits_write(&bits, cbits, sizeof(cbits)*BYTES_PER_CHAR) /BYTES_PER_CHAR; bitCount+=bits.nbBits; word2byte((short *) cbits, inout_byte, nbChars); fwrite(inout_byte, 2, nbChars, fbits); speex_bits_rewind(&bits); #else /* DECODE_ONLY */ while (!feof(fbits)) { fread(inout_byte, 1, TESTENC_BYTES_PER_FRAME, fbits); if (feof(fbits)) break; byte2word(inout_byte, (short *)cbits, TESTENC_BYTES_PER_FRAME/2); speex_bits_read_from(&bits, cbits, TESTENC_BYTES_PER_FRAME); bitCount+=160; #endif speex_decode_int(dec, &bits, out_short); speex_bits_reset(&bits); word2byte(&out_short[skip_group_delay], inout_byte, FRAME_SIZE-skip_group_delay); fwrite(inout_byte, 2, FRAME_SIZE-skip_group_delay, fout); skip_group_delay = 0; #if 1 fprintf (stderr, "Bits so far: %lu \n", bitCount); #endif } fprintf (stderr, "Total encoded size: %lu bits\n", bitCount); speex_encoder_destroy(st); speex_decoder_destroy(dec); #ifdef CHECK_RESULT rewind(fin); rewind(fout); while ( FRAME_SIZE == fread(inout_byte, 2, FRAME_SIZE, fin)) { float s=0, e=0; byte2word(inout_byte, in_short, FRAME_SIZE); fread(inout_byte, 2, FRAME_SIZE, fout); byte2word(inout_byte, out_short, FRAME_SIZE); for (i=0;i typedef _G_int32_t spx_int32_t; typedef _G_uint32_t spx_uint32_t; typedef _G_int16_t spx_int16_t; typedef _G_uint16_t spx_uint16_t; # elif defined(__MINGW32__) typedef short spx_int16_t; typedef unsigned short spx_uint16_t; typedef int spx_int32_t; typedef unsigned int spx_uint32_t; # elif defined(__MWERKS__) typedef int spx_int32_t; typedef unsigned int spx_uint32_t; typedef short spx_int16_t; typedef unsigned short spx_uint16_t; # else /* MSVC/Borland */ typedef __int32 spx_int32_t; typedef unsigned __int32 spx_uint32_t; typedef __int16 spx_int16_t; typedef unsigned __int16 spx_uint16_t; # endif #elif defined(__MACOS__) # include typedef SInt16 spx_int16_t; typedef UInt16 spx_uint16_t; typedef SInt32 spx_int32_t; typedef UInt32 spx_uint32_t; #elif (defined(__APPLE__) && defined(__MACH__)) /* MacOS X Framework build */ # include typedef int16_t spx_int16_t; typedef u_int16_t spx_uint16_t; typedef int32_t spx_int32_t; typedef u_int32_t spx_uint32_t; #elif defined(__BEOS__) /* Be */ # include typedef int16_t spx_int16_t; typedef u_int16_t spx_uint16_t; typedef int32_t spx_int32_t; typedef u_int32_t spx_uint32_t; #elif defined (__EMX__) /* OS/2 GCC */ typedef short spx_int16_t; typedef unsigned short spx_uint16_t; typedef int spx_int32_t; typedef unsigned int spx_uint32_t; #elif defined (DJGPP) /* DJGPP */ typedef short spx_int16_t; typedef int spx_int32_t; typedef unsigned int spx_uint32_t; #elif defined(R5900) /* PS2 EE */ typedef int spx_int32_t; typedef unsigned spx_uint32_t; typedef short spx_int16_t; #elif defined(__SYMBIAN32__) /* Symbian GCC */ typedef signed short spx_int16_t; typedef unsigned short spx_uint16_t; typedef signed int spx_int32_t; typedef unsigned int spx_uint32_t; #elif defined(CONFIG_TI_C54X) || defined (CONFIG_TI_C55X) typedef short spx_int16_t; typedef unsigned short spx_uint16_t; typedef long spx_int32_t; typedef unsigned long spx_uint32_t; #elif defined(CONFIG_TI_C6X) typedef short spx_int16_t; typedef unsigned short spx_uint16_t; typedef int spx_int32_t; typedef unsigned int spx_uint32_t; #else #include "speex_config_types.h" #endif #endif /* _SPEEX_TYPES_H */ mumble-1.3.4/3rdparty/speex-src/include/speex/speex.h0000664000175000017500000003331614010707304022367 0ustar builderbuilder/* Copyright (C) 2002-2006 Jean-Marc Valin*/ /** @file speex.h @brief Describes the different modes of the codec */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef SPEEX_H #define SPEEX_H /** @defgroup Codec Speex encoder and decoder * This is the Speex codec itself. * @{ */ #include "speex_types.h" #include "speex_bits.h" #ifdef __cplusplus extern "C" { #endif /* Values allowed for *ctl() requests */ /** Set enhancement on/off (decoder only) */ #define SPEEX_SET_ENH 0 /** Get enhancement state (decoder only) */ #define SPEEX_GET_ENH 1 /*Would be SPEEX_SET_FRAME_SIZE, but it's (currently) invalid*/ /** Obtain frame size used by encoder/decoder */ #define SPEEX_GET_FRAME_SIZE 3 /** Set quality value */ #define SPEEX_SET_QUALITY 4 /** Get current quality setting */ /* #define SPEEX_GET_QUALITY 5 -- Doesn't make much sense, does it? */ /** Set sub-mode to use */ #define SPEEX_SET_MODE 6 /** Get current sub-mode in use */ #define SPEEX_GET_MODE 7 /** Set low-band sub-mode to use (wideband only)*/ #define SPEEX_SET_LOW_MODE 8 /** Get current low-band mode in use (wideband only)*/ #define SPEEX_GET_LOW_MODE 9 /** Set high-band sub-mode to use (wideband only)*/ #define SPEEX_SET_HIGH_MODE 10 /** Get current high-band mode in use (wideband only)*/ #define SPEEX_GET_HIGH_MODE 11 /** Set VBR on (1) or off (0) */ #define SPEEX_SET_VBR 12 /** Get VBR status (1 for on, 0 for off) */ #define SPEEX_GET_VBR 13 /** Set quality value for VBR encoding (0-10) */ #define SPEEX_SET_VBR_QUALITY 14 /** Get current quality value for VBR encoding (0-10) */ #define SPEEX_GET_VBR_QUALITY 15 /** Set complexity of the encoder (0-10) */ #define SPEEX_SET_COMPLEXITY 16 /** Get current complexity of the encoder (0-10) */ #define SPEEX_GET_COMPLEXITY 17 /** Set bit-rate used by the encoder (or lower) */ #define SPEEX_SET_BITRATE 18 /** Get current bit-rate used by the encoder or decoder */ #define SPEEX_GET_BITRATE 19 /** Define a handler function for in-band Speex request*/ #define SPEEX_SET_HANDLER 20 /** Define a handler function for in-band user-defined request*/ #define SPEEX_SET_USER_HANDLER 22 /** Set sampling rate used in bit-rate computation */ #define SPEEX_SET_SAMPLING_RATE 24 /** Get sampling rate used in bit-rate computation */ #define SPEEX_GET_SAMPLING_RATE 25 /** Reset the encoder/decoder memories to zero*/ #define SPEEX_RESET_STATE 26 /** Get VBR info (mostly used internally) */ #define SPEEX_GET_RELATIVE_QUALITY 29 /** Set VAD status (1 for on, 0 for off) */ #define SPEEX_SET_VAD 30 /** Get VAD status (1 for on, 0 for off) */ #define SPEEX_GET_VAD 31 /** Set Average Bit-Rate (ABR) to n bits per seconds */ #define SPEEX_SET_ABR 32 /** Get Average Bit-Rate (ABR) setting (in bps) */ #define SPEEX_GET_ABR 33 /** Set DTX status (1 for on, 0 for off) */ #define SPEEX_SET_DTX 34 /** Get DTX status (1 for on, 0 for off) */ #define SPEEX_GET_DTX 35 /** Set submode encoding in each frame (1 for yes, 0 for no, setting to no breaks the standard) */ #define SPEEX_SET_SUBMODE_ENCODING 36 /** Get submode encoding in each frame */ #define SPEEX_GET_SUBMODE_ENCODING 37 /*#define SPEEX_SET_LOOKAHEAD 38*/ /** Returns the lookahead used by Speex separately for an encoder and a decoder. * Sum encoder and decoder lookahead values to get the total codec lookahead. */ #define SPEEX_GET_LOOKAHEAD 39 /** Sets tuning for packet-loss concealment (expected loss rate) */ #define SPEEX_SET_PLC_TUNING 40 /** Gets tuning for PLC */ #define SPEEX_GET_PLC_TUNING 41 /** Sets the max bit-rate allowed in VBR mode */ #define SPEEX_SET_VBR_MAX_BITRATE 42 /** Gets the max bit-rate allowed in VBR mode */ #define SPEEX_GET_VBR_MAX_BITRATE 43 /** Turn on/off input/output high-pass filtering */ #define SPEEX_SET_HIGHPASS 44 /** Get status of input/output high-pass filtering */ #define SPEEX_GET_HIGHPASS 45 /** Get "activity level" of the last decoded frame, i.e. how much damage we cause if we remove the frame */ #define SPEEX_GET_ACTIVITY 47 /* Preserving compatibility:*/ /** Equivalent to SPEEX_SET_ENH */ #define SPEEX_SET_PF 0 /** Equivalent to SPEEX_GET_ENH */ #define SPEEX_GET_PF 1 /* Values allowed for mode queries */ /** Query the frame size of a mode */ #define SPEEX_MODE_FRAME_SIZE 0 /** Query the size of an encoded frame for a particular sub-mode */ #define SPEEX_SUBMODE_BITS_PER_FRAME 1 /** Get major Speex version */ #define SPEEX_LIB_GET_MAJOR_VERSION 1 /** Get minor Speex version */ #define SPEEX_LIB_GET_MINOR_VERSION 3 /** Get micro Speex version */ #define SPEEX_LIB_GET_MICRO_VERSION 5 /** Get extra Speex version */ #define SPEEX_LIB_GET_EXTRA_VERSION 7 /** Get Speex version string */ #define SPEEX_LIB_GET_VERSION_STRING 9 /*#define SPEEX_LIB_SET_ALLOC_FUNC 10 #define SPEEX_LIB_GET_ALLOC_FUNC 11 #define SPEEX_LIB_SET_FREE_FUNC 12 #define SPEEX_LIB_GET_FREE_FUNC 13 #define SPEEX_LIB_SET_WARNING_FUNC 14 #define SPEEX_LIB_GET_WARNING_FUNC 15 #define SPEEX_LIB_SET_ERROR_FUNC 16 #define SPEEX_LIB_GET_ERROR_FUNC 17 */ /** Number of defined modes in Speex */ #define SPEEX_NB_MODES 3 /** modeID for the defined narrowband mode */ #define SPEEX_MODEID_NB 0 /** modeID for the defined wideband mode */ #define SPEEX_MODEID_WB 1 /** modeID for the defined ultra-wideband mode */ #define SPEEX_MODEID_UWB 2 struct SpeexMode; /* Prototypes for mode function pointers */ /** Encoder state initialization function */ typedef void *(*encoder_init_func)(const struct SpeexMode *mode); /** Encoder state destruction function */ typedef void (*encoder_destroy_func)(void *st); /** Main encoding function */ typedef int (*encode_func)(void *state, void *in, SpeexBits *bits); /** Function for controlling the encoder options */ typedef int (*encoder_ctl_func)(void *state, int request, void *ptr); /** Decoder state initialization function */ typedef void *(*decoder_init_func)(const struct SpeexMode *mode); /** Decoder state destruction function */ typedef void (*decoder_destroy_func)(void *st); /** Main decoding function */ typedef int (*decode_func)(void *state, SpeexBits *bits, void *out); /** Function for controlling the decoder options */ typedef int (*decoder_ctl_func)(void *state, int request, void *ptr); /** Query function for a mode */ typedef int (*mode_query_func)(const void *mode, int request, void *ptr); /** Struct defining a Speex mode */ typedef struct SpeexMode { /** Pointer to the low-level mode data */ const void *mode; /** Pointer to the mode query function */ mode_query_func query; /** The name of the mode (you should not rely on this to identify the mode)*/ const char *modeName; /**ID of the mode*/ int modeID; /**Version number of the bitstream (incremented every time we break bitstream compatibility*/ int bitstream_version; /** Pointer to encoder initialization function */ encoder_init_func enc_init; /** Pointer to encoder destruction function */ encoder_destroy_func enc_destroy; /** Pointer to frame encoding function */ encode_func enc; /** Pointer to decoder initialization function */ decoder_init_func dec_init; /** Pointer to decoder destruction function */ decoder_destroy_func dec_destroy; /** Pointer to frame decoding function */ decode_func dec; /** ioctl-like requests for encoder */ encoder_ctl_func enc_ctl; /** ioctl-like requests for decoder */ decoder_ctl_func dec_ctl; } SpeexMode; /** * Returns a handle to a newly created Speex encoder state structure. For now, * the "mode" argument can be &nb_mode or &wb_mode . In the future, more modes * may be added. Note that for now if you have more than one channels to * encode, you need one state per channel. * * @param mode The mode to use (either speex_nb_mode or speex_wb.mode) * @return A newly created encoder state or NULL if state allocation fails */ void *speex_encoder_init(const SpeexMode *mode); /** Frees all resources associated to an existing Speex encoder state. * @param state Encoder state to be destroyed */ void speex_encoder_destroy(void *state); /** Uses an existing encoder state to encode one frame of speech pointed to by "in". The encoded bit-stream is saved in "bits". @param state Encoder state @param in Frame that will be encoded with a +-2^15 range. This data MAY be overwritten by the encoder and should be considered uninitialised after the call. @param bits Bit-stream where the data will be written @return 0 if frame needs not be transmitted (DTX only), 1 otherwise */ int speex_encode(void *state, float *in, SpeexBits *bits); /** Uses an existing encoder state to encode one frame of speech pointed to by "in". The encoded bit-stream is saved in "bits". @param state Encoder state @param in Frame that will be encoded with a +-2^15 range @param bits Bit-stream where the data will be written @return 0 if frame needs not be transmitted (DTX only), 1 otherwise */ int speex_encode_int(void *state, spx_int16_t *in, SpeexBits *bits); /** Used like the ioctl function to control the encoder parameters * * @param state Encoder state * @param request ioctl-type request (one of the SPEEX_* macros) * @param ptr Data exchanged to-from function * @return 0 if no error, -1 if request in unknown, -2 for invalid parameter */ int speex_encoder_ctl(void *state, int request, void *ptr); /** Returns a handle to a newly created decoder state structure. For now, * the mode argument can be &nb_mode or &wb_mode . In the future, more modes * may be added. Note that for now if you have more than one channels to * decode, you need one state per channel. * * @param mode Speex mode (one of speex_nb_mode or speex_wb_mode) * @return A newly created decoder state or NULL if state allocation fails */ void *speex_decoder_init(const SpeexMode *mode); /** Frees all resources associated to an existing decoder state. * * @param state State to be destroyed */ void speex_decoder_destroy(void *state); /** Uses an existing decoder state to decode one frame of speech from * bit-stream bits. The output speech is saved written to out. * * @param state Decoder state * @param bits Bit-stream from which to decode the frame (NULL if the packet was lost) * @param out Where to write the decoded frame * @return return status (0 for no error, -1 for end of stream, -2 corrupt stream) */ int speex_decode(void *state, SpeexBits *bits, float *out); /** Uses an existing decoder state to decode one frame of speech from * bit-stream bits. The output speech is saved written to out. * * @param state Decoder state * @param bits Bit-stream from which to decode the frame (NULL if the packet was lost) * @param out Where to write the decoded frame * @return return status (0 for no error, -1 for end of stream, -2 corrupt stream) */ int speex_decode_int(void *state, SpeexBits *bits, spx_int16_t *out); /** Used like the ioctl function to control the encoder parameters * * @param state Decoder state * @param request ioctl-type request (one of the SPEEX_* macros) * @param ptr Data exchanged to-from function * @return 0 if no error, -1 if request in unknown, -2 for invalid parameter */ int speex_decoder_ctl(void *state, int request, void *ptr); /** Query function for mode information * * @param mode Speex mode * @param request ioctl-type request (one of the SPEEX_* macros) * @param ptr Data exchanged to-from function * @return 0 if no error, -1 if request in unknown, -2 for invalid parameter */ int speex_mode_query(const SpeexMode *mode, int request, void *ptr); /** Functions for controlling the behavior of libspeex * @param request ioctl-type request (one of the SPEEX_LIB_* macros) * @param ptr Data exchanged to-from function * @return 0 if no error, -1 if request in unknown, -2 for invalid parameter */ int speex_lib_ctl(int request, void *ptr); /** Default narrowband mode */ extern const SpeexMode speex_nb_mode; /** Default wideband mode */ extern const SpeexMode speex_wb_mode; /** Default "ultra-wideband" mode */ extern const SpeexMode speex_uwb_mode; /** List of all modes available */ extern const SpeexMode * const speex_mode_list[SPEEX_NB_MODES]; /** Obtain one of the modes available */ const SpeexMode * speex_lib_get_mode (int mode); #ifndef WIN32 /* We actually override the function in the narrowband case so that we can avoid linking in the wideband stuff */ #define speex_lib_get_mode(mode) ((mode)==SPEEX_MODEID_NB ? &speex_nb_mode : speex_lib_get_mode (mode)) #endif #ifdef __cplusplus } #endif /** @}*/ #endif mumble-1.3.4/3rdparty/speex-src/include/speex/speex_header.h0000664000175000017500000000776414010707304023707 0ustar builderbuilder/* Copyright (C) 2002 Jean-Marc Valin */ /** @file speex_header.h @brief Describes the Speex header */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef SPEEX_HEADER_H #define SPEEX_HEADER_H /** @defgroup SpeexHeader SpeexHeader: Makes it easy to write/parse an Ogg/Speex header * This is the Speex header for the Ogg encapsulation. You don't need that if you just use RTP. * @{ */ #include "speex_types.h" #ifdef __cplusplus extern "C" { #endif struct SpeexMode; /** Length of the Speex header identifier */ #define SPEEX_HEADER_STRING_LENGTH 8 /** Maximum number of characters for encoding the Speex version number in the header */ #define SPEEX_HEADER_VERSION_LENGTH 20 /** Speex header info for file-based formats */ typedef struct SpeexHeader { char speex_string[SPEEX_HEADER_STRING_LENGTH]; /**< Identifies a Speex bit-stream, always set to "Speex " */ char speex_version[SPEEX_HEADER_VERSION_LENGTH]; /**< Speex version */ spx_int32_t speex_version_id; /**< Version for Speex (for checking compatibility) */ spx_int32_t header_size; /**< Total size of the header ( sizeof(SpeexHeader) ) */ spx_int32_t rate; /**< Sampling rate used */ spx_int32_t mode; /**< Mode used (0 for narrowband, 1 for wideband) */ spx_int32_t mode_bitstream_version; /**< Version ID of the bit-stream */ spx_int32_t nb_channels; /**< Number of channels encoded */ spx_int32_t bitrate; /**< Bit-rate used */ spx_int32_t frame_size; /**< Size of frames */ spx_int32_t vbr; /**< 1 for a VBR encoding, 0 otherwise */ spx_int32_t frames_per_packet; /**< Number of frames stored per Ogg packet */ spx_int32_t extra_headers; /**< Number of additional headers after the comments */ spx_int32_t reserved1; /**< Reserved for future use, must be zero */ spx_int32_t reserved2; /**< Reserved for future use, must be zero */ } SpeexHeader; /** Initializes a SpeexHeader using basic information */ void speex_init_header(SpeexHeader *header, int rate, int nb_channels, const struct SpeexMode *m); /** Creates the header packet from the header itself (mostly involves endianness conversion) */ char *speex_header_to_packet(SpeexHeader *header, int *size); /** Creates a SpeexHeader from a packet */ SpeexHeader *speex_packet_to_header(char *packet, int size); /** Frees the memory allocated by either speex_header_to_packet() or speex_packet_to_header() */ void speex_header_free(void *ptr); #ifdef __cplusplus } #endif /** @} */ #endif mumble-1.3.4/3rdparty/speex-src/include/speex/speex_bits.h0000664000175000017500000001500414010707304023402 0ustar builderbuilder/* Copyright (C) 2002 Jean-Marc Valin */ /** @file speex_bits.h @brief Handles bit packing/unpacking */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef BITS_H #define BITS_H /** @defgroup SpeexBits SpeexBits: Bit-stream manipulations * This is the structure that holds the bit-stream when encoding or decoding * with Speex. It allows some manipulations as well. * @{ */ #ifdef __cplusplus extern "C" { #endif /** Bit-packing data structure representing (part of) a bit-stream. */ typedef struct SpeexBits { char *chars; /**< "raw" data */ int nbBits; /**< Total number of bits stored in the stream*/ int charPtr; /**< Position of the byte "cursor" */ int bitPtr; /**< Position of the bit "cursor" within the current char */ int owner; /**< Does the struct "own" the "raw" buffer (member "chars") */ int overflow;/**< Set to one if we try to read past the valid data */ int buf_size;/**< Allocated size for buffer */ int reserved1; /**< Reserved for future use */ void *reserved2; /**< Reserved for future use */ } SpeexBits; /** Initializes and allocates resources for a SpeexBits struct */ void speex_bits_init(SpeexBits *bits); /** Initializes SpeexBits struct using a pre-allocated buffer*/ void speex_bits_init_buffer(SpeexBits *bits, void *buff, int buf_size); /** Sets the bits in a SpeexBits struct to use data from an existing buffer (for decoding without copying data) */ void speex_bits_set_bit_buffer(SpeexBits *bits, void *buff, int buf_size); /** Frees all resources associated to a SpeexBits struct. Right now this does nothing since no resources are allocated, but this could change in the future.*/ void speex_bits_destroy(SpeexBits *bits); /** Resets bits to initial value (just after initialization, erasing content)*/ void speex_bits_reset(SpeexBits *bits); /** Rewind the bit-stream to the beginning (ready for read) without erasing the content */ void speex_bits_rewind(SpeexBits *bits); /** Initializes the bit-stream from the data in an area of memory */ void speex_bits_read_from(SpeexBits *bits, const char *bytes, int len); /** Append bytes to the bit-stream * * @param bits Bit-stream to operate on * @param bytes pointer to the bytes what will be appended * @param len Number of bytes of append */ void speex_bits_read_whole_bytes(SpeexBits *bits, const char *bytes, int len); /** Write the content of a bit-stream to an area of memory * * @param bits Bit-stream to operate on * @param bytes Memory location where to write the bits * @param max_len Maximum number of bytes to write (i.e. size of the "bytes" buffer) * @return Number of bytes written to the "bytes" buffer */ int speex_bits_write(SpeexBits *bits, char *bytes, int max_len); /** Like speex_bits_write, but writes only the complete bytes in the stream. Also removes the written bytes from the stream */ int speex_bits_write_whole_bytes(SpeexBits *bits, char *bytes, int max_len); /** Append bits to the bit-stream * @param bits Bit-stream to operate on * @param data Value to append as integer * @param nbBits number of bits to consider in "data" */ void speex_bits_pack(SpeexBits *bits, int data, int nbBits); /** Interpret the next bits in the bit-stream as a signed integer * * @param bits Bit-stream to operate on * @param nbBits Number of bits to interpret * @return A signed integer represented by the bits read */ int speex_bits_unpack_signed(SpeexBits *bits, int nbBits); /** Interpret the next bits in the bit-stream as an unsigned integer * * @param bits Bit-stream to operate on * @param nbBits Number of bits to interpret * @return An unsigned integer represented by the bits read */ unsigned int speex_bits_unpack_unsigned(SpeexBits *bits, int nbBits); /** Returns the number of bytes in the bit-stream, including the last one even if it is not "full" * * @param bits Bit-stream to operate on * @return Number of bytes in the stream */ int speex_bits_nbytes(SpeexBits *bits); /** Same as speex_bits_unpack_unsigned, but without modifying the cursor position * * @param bits Bit-stream to operate on * @param nbBits Number of bits to look for * @return Value of the bits peeked, interpreted as unsigned */ unsigned int speex_bits_peek_unsigned(SpeexBits *bits, int nbBits); /** Get the value of the next bit in the stream, without modifying the * "cursor" position * * @param bits Bit-stream to operate on * @return Value of the bit peeked (one bit only) */ int speex_bits_peek(SpeexBits *bits); /** Advances the position of the "bit cursor" in the stream * * @param bits Bit-stream to operate on * @param n Number of bits to advance */ void speex_bits_advance(SpeexBits *bits, int n); /** Returns the number of bits remaining to be read in a stream * * @param bits Bit-stream to operate on * @return Number of bits that can still be read from the stream */ int speex_bits_remaining(SpeexBits *bits); /** Insert a terminator so that the data can be sent as a packet while auto-detecting * the number of frames in each packet * * @param bits Bit-stream to operate on */ void speex_bits_insert_terminator(SpeexBits *bits); #ifdef __cplusplus } #endif /* @} */ #endif mumble-1.3.4/3rdparty/speex-src/include/speex/speex_stereo.h0000664000175000017500000000713314010707304023746 0ustar builderbuilder/* Copyright (C) 2002 Jean-Marc Valin*/ /** @file speex_stereo.h @brief Describes the handling for intensity stereo */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef STEREO_H #define STEREO_H /** @defgroup SpeexStereoState SpeexStereoState: Handling Speex stereo files * This describes the Speex intensity stereo encoding/decoding * @{ */ #include "speex_types.h" #include "speex_bits.h" #ifdef __cplusplus extern "C" { #endif /** If you access any of these fields directly, I'll personally come and bite you */ typedef struct SpeexStereoState { float balance; /**< Left/right balance info */ float e_ratio; /**< Ratio of energies: E(left+right)/[E(left)+E(right)] */ float smooth_left; /**< Smoothed left channel gain */ float smooth_right; /**< Smoothed right channel gain */ float reserved1; /**< Reserved for future use */ float reserved2; /**< Reserved for future use */ } SpeexStereoState; /** Deprecated. Use speex_stereo_state_init() instead. */ #define SPEEX_STEREO_STATE_INIT {1,.5,1,1,0,0} /** Initialise/create a stereo stereo state */ SpeexStereoState *speex_stereo_state_init(); /** Reset/re-initialise an already allocated stereo state */ void speex_stereo_state_reset(SpeexStereoState *stereo); /** Destroy a stereo stereo state */ void speex_stereo_state_destroy(SpeexStereoState *stereo); /** Transforms a stereo frame into a mono frame and stores intensity stereo info in 'bits' */ void speex_encode_stereo(float *data, int frame_size, SpeexBits *bits); /** Transforms a stereo frame into a mono frame and stores intensity stereo info in 'bits' */ void speex_encode_stereo_int(spx_int16_t *data, int frame_size, SpeexBits *bits); /** Transforms a mono frame into a stereo frame using intensity stereo info */ void speex_decode_stereo(float *data, int frame_size, SpeexStereoState *stereo); /** Transforms a mono frame into a stereo frame using intensity stereo info */ void speex_decode_stereo_int(spx_int16_t *data, int frame_size, SpeexStereoState *stereo); /** Callback handler for intensity stereo info */ int speex_std_stereo_request_handler(SpeexBits *bits, void *state, void *data); #ifdef __cplusplus } #endif /** @} */ #endif mumble-1.3.4/3rdparty/speex-src/include/speex/speex_callbacks.h0000664000175000017500000001165114010707304024364 0ustar builderbuilder/* Copyright (C) 2002 Jean-Marc Valin*/ /** @file speex_callbacks.h @brief Describes callback handling and in-band signalling */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef SPEEX_CALLBACKS_H #define SPEEX_CALLBACKS_H /** @defgroup SpeexCallbacks Various definitions for Speex callbacks supported by the decoder. * @{ */ #include "speex.h" #ifdef __cplusplus extern "C" { #endif /** Total number of callbacks */ #define SPEEX_MAX_CALLBACKS 16 /* Describes all the in-band requests */ /*These are 1-bit requests*/ /** Request for perceptual enhancement (1 for on, 0 for off) */ #define SPEEX_INBAND_ENH_REQUEST 0 /** Reserved */ #define SPEEX_INBAND_RESERVED1 1 /*These are 4-bit requests*/ /** Request for a mode change */ #define SPEEX_INBAND_MODE_REQUEST 2 /** Request for a low mode change */ #define SPEEX_INBAND_LOW_MODE_REQUEST 3 /** Request for a high mode change */ #define SPEEX_INBAND_HIGH_MODE_REQUEST 4 /** Request for VBR (1 on, 0 off) */ #define SPEEX_INBAND_VBR_QUALITY_REQUEST 5 /** Request to be sent acknowledge */ #define SPEEX_INBAND_ACKNOWLEDGE_REQUEST 6 /** Request for VBR (1 for on, 0 for off) */ #define SPEEX_INBAND_VBR_REQUEST 7 /*These are 8-bit requests*/ /** Send a character in-band */ #define SPEEX_INBAND_CHAR 8 /** Intensity stereo information */ #define SPEEX_INBAND_STEREO 9 /*These are 16-bit requests*/ /** Transmit max bit-rate allowed */ #define SPEEX_INBAND_MAX_BITRATE 10 /*These are 32-bit requests*/ /** Acknowledge packet reception */ #define SPEEX_INBAND_ACKNOWLEDGE 12 /** Callback function type */ typedef int (*speex_callback_func)(SpeexBits *bits, void *state, void *data); /** Callback information */ typedef struct SpeexCallback { int callback_id; /**< ID associated to the callback */ speex_callback_func func; /**< Callback handler function */ void *data; /**< Data that will be sent to the handler */ void *reserved1; /**< Reserved for future use */ int reserved2; /**< Reserved for future use */ } SpeexCallback; /** Handle in-band request */ int speex_inband_handler(SpeexBits *bits, SpeexCallback *callback_list, void *state); /** Standard handler for mode request (change mode, no questions asked) */ int speex_std_mode_request_handler(SpeexBits *bits, void *state, void *data); /** Standard handler for high mode request (change high mode, no questions asked) */ int speex_std_high_mode_request_handler(SpeexBits *bits, void *state, void *data); /** Standard handler for in-band characters (write to stderr) */ int speex_std_char_handler(SpeexBits *bits, void *state, void *data); /** Default handler for user-defined requests: in this case, just ignore */ int speex_default_user_handler(SpeexBits *bits, void *state, void *data); /** Standard handler for low mode request (change low mode, no questions asked) */ int speex_std_low_mode_request_handler(SpeexBits *bits, void *state, void *data); /** Standard handler for VBR request (Set VBR, no questions asked) */ int speex_std_vbr_request_handler(SpeexBits *bits, void *state, void *data); /** Standard handler for enhancer request (Turn enhancer on/off, no questions asked) */ int speex_std_enh_request_handler(SpeexBits *bits, void *state, void *data); /** Standard handler for VBR quality request (Set VBR quality, no questions asked) */ int speex_std_vbr_quality_request_handler(SpeexBits *bits, void *state, void *data); #ifdef __cplusplus } #endif /** @} */ #endif mumble-1.3.4/3rdparty/speex-src/include/speex/Makefile.am0000664000175000017500000000042614010707304023122 0ustar builderbuilder# Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies nodist_pkginclude_HEADERS = speex_config_types.h pkginclude_HEADERS = speex.h speex_bits.h speex_callbacks.h \ speex_header.h \ speex_stereo.h speex_types.h mumble-1.3.4/3rdparty/speex-src/include/speex/speex_config_types.h.in0000664000175000017500000000031414010707304025535 0ustar builderbuilder#ifndef __SPEEX_TYPES_H__ #define __SPEEX_TYPES_H__ @INCLUDE_STDINT@ typedef @SIZE16@ spx_int16_t; typedef @USIZE16@ spx_uint16_t; typedef @SIZE32@ spx_int32_t; typedef @USIZE32@ spx_uint32_t; #endif mumble-1.3.4/3rdparty/speex-src/OPTIMIZE0000664000175000017500000000041714010707304017502 0ustar builderbuilderNarrowband: - pitch_gain_search_3tap calls syn_filt_zero more times than it should (we're computing some things twice) Wideband - All narrowband optimizations apply - Lots of time spent in the codebook search. We could speed that up by using a hierarchical codebook mumble-1.3.4/3rdparty/speex-src/Doxyfile0000664000175000017500000002040014010707304020017 0ustar builderbuilder# Doxyfile 1.5.1-KDevelop #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = Speex PROJECT_NUMBER = 1.2-beta2 OUTPUT_DIRECTORY = doc CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = NO STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES SEPARATE_MEMBER_PAGES = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO BUILTIN_STL_SUPPORT = NO DISTRIBUTE_GROUP_DOC = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = NO EXTRACT_PRIVATE = NO EXTRACT_STATIC = NO EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = YES HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES SHOW_DIRECTORIES = YES FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_NO_PARAMDOC = NO WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = include/speex FILE_PATTERNS = RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = speex_config_types.h EXAMPLE_PATH = EXAMPLE_PATTERNS = EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = NO INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = YES REFERENCES_RELATION = YES REFERENCES_LINK_SOURCE = YES USE_HTAGS = NO VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = HTML_FOOTER = HTML_STYLESHEET = HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = YES LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = YES USE_PDFLATEX = YES LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = YES HIDE_UNDOC_RELATIONS = YES HAVE_DOT = NO CLASS_GRAPH = YES COLLABORATION_GRAPH = YES GROUP_GRAPHS = YES UML_LOOK = NO TEMPLATE_RELATIONS = YES INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO CALLER_GRAPH = NO GRAPHICAL_HIERARCHY = YES DIRECTORY_GRAPH = YES DOT_IMAGE_FORMAT = gif DOT_PATH = DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 0 DOT_TRANSPARENT = NO DOT_MULTI_TARGETS = NO GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO mumble-1.3.4/3rdparty/speex-src/README.TI-DSP0000664000175000017500000000613114010707304020135 0ustar builderbuilderThese are all of the changes and additions necessary to build a loopback application for the TI C6415, C5509A, or C5416 simulators using the TI Code Composer Studio (CCS) development system. A trial version of the tools can be downloaded from the TI website. This build runs 8kbps narrowband, with minimum complexity. Several changes are introduced in Speex 1.1.11 which are used in these applications: arch.h: Added switch for compilers not supporting "long long" (C55x does, C54x, CCS 2.x C64x does not) bits.c: Allow external definition for max buffer size, changed MAX_BYTES_PER_FRAME to MAX_CHARS_PER_FRAME for consistency misc.c: Added override switches to alloc routines, conditional include of user file "user_misc.h". These changes allow manual memory allocation rather than using heap The arch.h change allows operation with 2.x versions of Code Composer Studio. The bits.c change reduces the data memory usage. The misc.c change allows private memory allocation, for cases where it is not desirable to use the normal heap. Added files: testenc-TI-C5x.c (For C54x and C55x builds, derived from testenc.c, manual alloc, byte packing/unpacking added) testenc-TI-C64x.c (For C64x builds, derived from testenc.c, manual alloc, byte packing/unpacking added) config.h (not automatically generated, sets memory sizes, enables/disables manual alloc) user_misc.h (contains the manual memory alloc routines, with debug code to display mem usage) speex\speex_config_types.h (match Speex types to compiler types, not generated from types.in) speex_c54_test\speex_c54_test.cmd (C5416 linker command file) speex_c54_test\speex_c54_test.pjt (Code Composer Studio Project File ) speex_c55_test\speex_c55_test.cmd (C5509A linker command file) speex_c55_test\speex_c55_test.pjt (Code Composer Studio Project File ) speex_c64_test\speex_c64_test.cmd (C6415 linker command file) speex_c64_test\speex_c64_test.pjt (Code Composer Studio Project File ) samples\male.snd Usage: 1. Create a Speex 1.1.11 (or later) source tree. 2. Edit the files testenc-TI-C5x.c and/or testenc-TI-C64x.c to change the hard-coded path for the test audio and data files. This build uses the file e:\speextrunktest\samples\male.snd. Note: This is a headerless 16-bit stereo audio file derived from the male.wav test file http://www.speex.org/samples/male.wav 3. Edit the .pjt file with a text editor and change projdir or projectdir to the correct path (one place near the top of the file). 4. Edit config.h if desired, to change the memory allocation method (calloc or manual), and to enable/disable debug prints for the memory allocation (this makes it easier to determine the required size). 5. Run Code Composer Studio, and open the project for the desired target (e.g. speex_c55_test). Note that the correct simulator must be selected (in CCS Setup) before starting CCS. 6. Build and run the simulation. Note that assembly optimizations will be required to run C54x in real time. There are no assembly optimizations in any of these builds. mumble-1.3.4/3rdparty/speex-src/Makefile.am0000664000175000017500000000132014010707304020345 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # To disable automatic dependency tracking if using other tools than # gcc and gmake, add the option 'no-dependencies' AUTOMAKE_OPTIONS = 1.8 ACLOCAL_AMFLAGS = -I m4 m4datadir = $(datadir)/aclocal m4data_DATA = speex.m4 pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = speex.pc EXTRA_DIST = Speex.spec Speex.spec.in Speex.kdevelop speex.m4 speex.pc.in README.blackfin README.symbian README.TI-DSP #Fools KDevelop into including all files SUBDIRS = libspeex include doc win32 symbian ti if BUILD_BINARIES SUBDIRS += src endif DIST_SUBDIRS = libspeex include src doc win32 symbian ti rpm: dist rpmbuild -ta ${PACKAGE}-${VERSION}.tar.gz mumble-1.3.4/3rdparty/speex-src/tmv/0000775000175000017500000000000014010707304017123 5ustar builderbuildermumble-1.3.4/3rdparty/speex-src/tmv/speex_config_types.h0000664000175000017500000000106214010707304023170 0ustar builderbuilder#ifndef __SPEEX_TYPES_H__ #define __SPEEX_TYPES_H__ #ifdef __TCS__ #include typedef Int16 spx_int16_t; typedef UInt16 spx_uint16_t; typedef Int32 spx_int32_t; typedef UInt32 spx_uint32_t; #ifdef FIXED_POINT #define VMUX(a,b,c) mux((a),(b),(c)) #define VABS(a) iabs((a)) #define VMAX(a,b) imax((a),(b)) #define VMIN(a,b) imin((a),(b)) #else #define VMUX(a,b,c) fmux((a),(b),(c)) #define VABS(a) fabs((a)) #define VMAX(a,b) fmax((a),(b)) #define VMIN(a,b) fmin((a),(b)) #endif #endif #endif mumble-1.3.4/3rdparty/speex-src/tmv/misc_tm.h0000664000175000017500000000514314010707304020732 0ustar builderbuilder/* Copyright (C) 2007 Hong Zhiqian */ /** @file misc_tm.h @author Hong Zhiqian @brief Various compatibility routines for Speex (TriMedia version) */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #if TM_PROFILE int __profile_begin; int __profile_end; #endif #define OVERRIDE_SPEEX_ALLOC void *speex_alloc (int size) { void *ptr; if ( tmmlMalloc(0, size, (pVoid*)&ptr, tmmlMallocCacheAligned | tmmlMallocCleared) != TM_OK ) { return NULL; } return ptr; } #define OVERRIDE_SPEEX_ALLOC_SCRATCH void *speex_alloc_scratch (int size) { void *ptr; if ( tmmlMalloc(0, size, (pVoid*)&ptr, tmmlMallocCacheAligned | tmmlMallocCleared) != TM_OK ) { return NULL; } return ptr; } #define OVERRIDE_SPEEX_REALLOC void *speex_realloc (void *ptr, int size) { if ( tmmlRealloc(0, size, (pVoid)ptr, (pVoid*)&ptr, tmmlMallocCacheAligned | tmmlMallocCleared) != TM_OK ) { return NULL; } return ptr; } #define OVERRIDE_SPEEX_FREE void speex_free (void *ptr) { tmmlFree(ptr); } #define OVERRIDE_SPEEX_FREE_SCRATCH void speex_free_scratch (void *ptr) { tmmlFree(ptr); } mumble-1.3.4/3rdparty/speex-src/tmv/fftwrap_tm.h0000664000175000017500000001222614010707304021450 0ustar builderbuilder/* Copyright (C) 2007 Hong Zhiqian */ /** @file fftwrap_tm.h @author Hong Zhiqian @brief Various compatibility routines for Speex (TriMedia version) */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include "profile_tm.h" #ifdef FIXED_POINT #define OVERRIDE_MAXIMIZE_RANGE static int maximize_range(Int16 *in, Int16 *out, int bound, int len) { register int max_val=0; register int shift=0; register int i, j; TMDEBUG_ALIGNMEM(in); TMDEBUG_ALIGNMEM(out); MAXIMIZERANGE_START(); len >>= 1; for ( i=0 ; i>1) && max_val != 0 ) { max_val <<= 1; shift++; } if ( shift != 0 ) { for ( i=0,j=0 ; i>1); s = pack16lsb(s,s); len >>= 1; l = len & (int)0xFFFFFFFE; for ( i=0,j=0 ; i>= 1; for( i=1 ; itwiddles; register int i, j; register int _inv = !st->inverse; Fout2 = (int*)Fout + m; for ( i=0,j=0 ; iinverse; tw3 = tw2 = tw1 = (int*)st->twiddles; fstride2 = fstride << 1; fstride3 = fstride * 3; Fout1 = (int*)Fout + m; Fout2 = (int*)Fout + (m << 1); Fout3 = (int*)Fout + (m * 3); for ( i=0,j=0 ; iinverse; tw1 = tw2 = (int*)st->twiddles; Fout1 = (int*)Fout + m; Fout2 = (int*)Fout + (m << 1); epi = tw1[fstride*m]; epi = pack16lsb(epi,epi); fstride2 = fstride << 1; for ( i=0,j=0 ; iinverse; Fout1=(int*)Fout+m; Fout2=(int*)Fout+(m<<1); Fout3=(int*)Fout+(3 *m); Fout4=(int*)Fout+(m<<2); tw1 = tw2 = tw3 = tw4 = (int*)st->twiddles; i = tw1[fstride*m]; yab_lsb = tw1[fstride*(m<<1)]; yab_msb = pack16msb(i, yab_lsb); yab_lsb = pack16lsb(i, yab_lsb); yba_msb = funshift2(-sex16(yab_msb), yab_msb); yba_lsb = funshift2(yab_lsb, yab_lsb); fstride2 = fstride << 1; fstride3 = fstride * 3; fstride4 = fstride << 2; for ( i=0,j=0 ; iinverse; register int i, j, k, l; register int * restrict twiddles = (int*)st->twiddles; register int Norig = st->nfft; CHECKBUF(scratchbuf,nscratchbuf,p); for ( i=0; i=Norig ) { twidx -= Norig; } sc = ld32x(scratchbuf,l); tw = ld32x(twiddles,twidx); TM_MUL(sc, sc, tw); TM_ADD(f10, f10, sc); } st32d(k<<2, Fout, f10); } } } #else #define OVERRIDE_KFBFLY2 static void kf_bfly2( kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_cfg st, int m ) { register kiss_fft_cpx * restrict Fout2; register kiss_fft_cpx * restrict tw1 = st->twiddles; Fout2 = Fout + m; do { register kiss_fft_cpx _fout2, _fout, t; _fout2 = *Fout2; _fout = *Fout; C_MUL ( t, _fout2, *tw1); C_SUB (_fout2, _fout, t); C_ADD (_fout, _fout, t); *Fout2 = _fout2; *Fout = _fout; tw1 += fstride; ++Fout2; ++Fout; } while ( --m ); } #define OVERRIDE_KFBFLY4 static void kf_bfly4( kiss_fft_cpx * Fout, const int fstride, const kiss_fft_cfg st, int m ) { register kiss_fft_cpx * restrict tw1,* restrict tw2,* restrict tw3; register kiss_fft_cpx * restrict Fout1, * restrict Fout2, * restrict Fout3; register int _inv = !st->inverse; tw3 = tw2 = tw1 = st->twiddles; Fout1 = Fout + m; Fout2 = Fout + (m << 1); Fout3 = Fout + (m * 3); do { register kiss_fft_cpx _fout; register kiss_fft_cpx sc0, sc1, sc2, sc3, sc4, sc5; _fout = *Fout; C_MUL( sc0,*Fout1, *tw1); C_MUL( sc1,*Fout2, *tw2); C_MUL( sc2,*Fout3, *tw3); C_SUB( sc5, _fout, sc1); C_ADD( _fout, _fout, sc1); C_ADD( sc3, sc0, sc2); C_SUB( sc4, sc0, sc2); C_SUB(*Fout2, _fout, sc3); C_ADD( *Fout, _fout, sc3); tw1 += fstride; tw2 += (fstride << 1); tw3 += (fstride * 3); if ( _inv ) { Fout1->r = sc5.r + sc4.i; Fout1->i = sc5.i - sc4.r; Fout3->r = sc5.r - sc4.i; Fout3->i = sc5.i + sc4.r; } else { Fout1->r = sc5.r - sc4.i; Fout1->i = sc5.i + sc4.r; Fout3->r = sc5.r + sc4.i; Fout3->i = sc5.i - sc4.r; } ++Fout; ++Fout1; ++Fout2; ++Fout3; } while(--m); } #define OVERRIDE_KFBFLY3 static void kf_bfly3( kiss_fft_cpx * Fout, const int fstride, const kiss_fft_cfg st, int m ) { register kiss_fft_cpx * restrict Fout1, * restrict Fout2; register kiss_fft_cpx * restrict tw1,* restrict tw2; register float epi; tw1 = tw2 = st->twiddles; epi = st->twiddles[fstride*m].i; Fout1 = Fout + m; Fout2 = Fout + (m << 1); do { register kiss_fft_cpx _fout; register kiss_fft_cpx sc0, sc1, sc2, sc3; _fout = *Fout; C_MUL( sc1, *Fout1, *tw1); C_MUL( sc2, *Fout2, *tw2); C_ADD( sc3, sc1, sc2); C_SUB( sc0, sc1, sc2); tw1 += fstride; tw2 += (fstride << 1); sc1.r = _fout.r - HALF_OF(sc3.r); sc1.i = _fout.i - HALF_OF(sc3.i); C_MULBYSCALAR(sc0, epi); C_ADD(*Fout, _fout, sc3); Fout2->r = sc1.r + sc0.i; Fout2->i = sc1.i - sc0.r; Fout1->r = sc1.i - sc0.i; Fout1->i = sc1.r + sc0.r; ++Fout; ++Fout1; ++Fout2; } while(--m); } #define OVERRIDE_KFBFLY5 static void kf_bfly5( kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_cfg st, int m ) { register kiss_fft_cpx * restrict Fout1,* restrict Fout2,* restrict Fout3,* restrict Fout4; register int u; register kiss_fft_cpx *tw; register float yar, yai, ybr, ybi; Fout1=Fout+m; Fout2=Fout+(m<<1); Fout3=Fout+(m*3); Fout4=Fout+(m<<2); tw = st->twiddles; yar = tw[fstride*m].r; yai = tw[fstride*m].i; ybr = tw[fstride*2*m].r; ybi = tw[fstride*2*m].i; for ( u=0; ur = sc0.r + sc7.r + sc8.r; Fout->i = sc0.i + sc7.i + sc8.i; sc5.r = sc0.r + S_MUL(sc7.r,yar) + S_MUL(sc8.r,ybr); sc5.i = sc0.i + S_MUL(sc7.i,yar) + S_MUL(sc8.i,ybr); sc6.r = S_MUL(sc10.i,yai) + S_MUL(sc9.i,ybi); sc6.i = -S_MUL(sc10.r,yai) - S_MUL(sc9.r,ybi); C_SUB(*Fout1,sc5,sc6); C_ADD(*Fout4,sc5,sc6); sc11.r = sc0.r + S_MUL(sc7.r,ybr) + S_MUL(sc8.r,yar); sc11.i = sc0.i + S_MUL(sc7.i,ybr) + S_MUL(sc8.i,yar); sc12.r = - S_MUL(sc10.i,ybi) + S_MUL(sc9.i,yai); sc12.i = S_MUL(sc10.r,ybi) - S_MUL(sc9.r,yai); C_ADD(*Fout2,sc11,sc12); C_SUB(*Fout3,sc11,sc12); ++Fout1; ++Fout2; ++Fout3; ++Fout4; } } #endif #endif mumble-1.3.4/3rdparty/speex-src/tmv/filters_tm.h0000664000175000017500000010523714010707304021454 0ustar builderbuilder#include #include "profile_tm.h" #ifdef FIXED_POINT #define iadd(a,b) ((a) + (b)) #define OVERRIDE_BW_LPC void bw_lpc(Int16 gamma, const Int16 *lpc_in, Int16 *lpc_out, int order) { register int tmp, g, i; TMDEBUG_ALIGNMEM(lpc_in); TMDEBUG_ALIGNMEM(lpc_out); BWLPC_START(); tmp = g = gamma; for ( i=0 ; i<4 ; i+=2,lpc_out+=4 ) { register int in10, y1, y0, y10; register int in32, y3, y2, y32; in10 = ld32x(lpc_in,i); y0 = ((tmp * sex16(in10)) + 16384) >> 15; tmp = ((tmp * g) + 16384) >> 15; y1 = ((tmp * asri(16,in10)) + 16384) >> 15; tmp = ((tmp * g) + 16384) >> 15; y10 = pack16lsb(y1,y0); st32(lpc_out,y10); in32 = ld32x(lpc_in,i+1); y2 = ((tmp * sex16(in32)) + 16384) >> 15; tmp = ((tmp * g) + 16384) >> 15; y3 = ((tmp * asri(16,in32)) + 16384) >> 15; tmp = ((tmp * g) + 16384) >> 15; y32 = pack16lsb(y3,y2); st32d(4,lpc_out,y32); } if ( order == 10 ) { register int in10, y1, y0, y10; in10 = ld32x(lpc_in,i); y0 = ((tmp * sex16(in10)) + 16384) >> 15; tmp = ((tmp * g) + 16384) >> 15; y1 = ((tmp * asri(16,in10)) + 16384) >> 15; tmp = ((tmp * g) + 16384) >> 15; y10 = pack16lsb(y1,y0); st32(lpc_out,y10); } BWLPC_STOP(); } #define OVERRIDE_HIGHPASS void highpass(const Int16 *x, Int16 *y, int len, int filtID, Int32 *mem) { const Int16 Pcoef[5][3] = {{16384, -31313, 14991}, {16384, -31569, 15249}, {16384, -31677, 15328}, {16384, -32313, 15947}, {16384, -22446, 6537}}; const Int16 Zcoef[5][3] = {{15672, -31344, 15672}, {15802, -31601, 15802}, {15847, -31694, 15847}, {16162, -32322, 16162}, {14418, -28836, 14418}}; register int i; register int den1, den2, num0, num1, num2, den11, den22, mem0, mem1; TMDEBUG_ALIGNMEM(mem); HIGHPASS_START(); filtID = imin(4, filtID); den1 = -Pcoef[filtID][1]; den2 = -Pcoef[filtID][2]; num0 = Zcoef[filtID][0]; num1 = Zcoef[filtID][1]; num2 = Zcoef[filtID][2]; den11 = den1 << 1; den22 = den2 << 1; mem0 = mem[0]; mem1 = mem[1]; #if (TM_UNROLL && TM_UNROLL_HIGHPASS) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( i=0 ; i> 15; vout_d = vout & 0x7FFF; yi = iclipi(PSHR32(vout,14),32767); mem0 = (mem1 + num1 * xi) + (den11 * vout_i) + (((den1 * vout_d) >> 15) << 1); mem1 = (num2 * xi) + (den22 * vout_i) + (((den2 * vout_d) >> 15) << 1); y[i] = yi; } #if (TM_UNROLL && TM_UNROLL_HIGHPASS) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif mem[0] = mem0; mem[1] = mem1; HIGHPASS_STOP(); } #define OVERRIDE_SIGNALMUL void signal_mul(const Int32 *x, Int32 *y, Int32 scale, int len) { register int i, scale_i, scale_d; SIGNALMUL_START(); scale_i = scale >> 14; scale_d = scale & 0x3FFF; #if (TM_UNROLL && TM_UNROLL_SIGNALMUL) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( i=0 ; i> 7; y[i] = ((xi * scale_i + ((xi * scale_d) >> 14)) << 7); } #if (TM_UNROLL && TM_UNROLL_SIGNALMUL) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif SIGNALMUL_STOP(); } #define OVERRIDE_SIGNALDIV void signal_div(const Int16 *x, Int16 *y, Int32 scale, int len) { register int i; SIGNALDIV_START(); if (scale > SHL32(EXTEND32(SIG_SCALING), 8)) { register int scale_1; scale = PSHR32(scale, SIG_SHIFT); scale_1 = DIV32_16(SHL32(EXTEND32(SIG_SCALING),7),scale); #if (TM_UNROLL && TM_UNROLL_SIGNALDIV) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( i=0 ; i SHR32(EXTEND32(SIG_SCALING), 2)) { register int scale_1; scale = PSHR32(scale, SIG_SHIFT-5); scale_1 = DIV32_16(SHL32(EXTEND32(SIG_SCALING),3),scale); #if (TM_UNROLL && TM_UNROLL_SIGNALDIV) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for (i=0;i16383 ) { sig_shift++; max_val >>= 1; } for ( i=0 ; i> sig_shift, ld32x(x,i+1) >> sig_shift); acc1 = pack16lsb(ld32x(x,i+2) >> sig_shift, ld32x(x,i+3) >> sig_shift); acc2 = ifir16(acc0,acc0) + ifir16(acc1, acc1); sum += acc2 >> 6; } return EXTRACT16(PSHR32(SHL32(EXTEND32(spx_sqrt(DIV32(sum,len))),(sig_shift+3)),SIG_SHIFT)); } #define OVERRIDE_COMPUTE_RMS16 Int16 compute_rms16(const Int16 *x, int len) { register int max_val, i; COMPUTERMS16_START(); max_val = 10; #if 0 { register int len2 = len >> 1; #if (TM_UNROLL && TM_UNROLL_COMPUTERMS16) #pragma TCS_unroll=2 #pragma TCS_unrollexact=1 #endif for ( i=0 ; i16383) { register int sum = 0; #if (TM_UNROLL && TM_UNROLL_COMPUTERMS16) #pragma TCS_unroll=2 #pragma TCS_unrollexact=1 #endif for ( i=0 ; i> 6; } #if (TM_UNROLL && TM_UNROLL_COMPUTERMS16) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif COMPUTERMS16_STOP(); return spx_sqrt(sum/len) << 4; } else { register int sig_shift; register int sum=0; sig_shift = mux(max_val < 8192, 1, 0); sig_shift = mux(max_val < 4096, 2, sig_shift); sig_shift = mux(max_val < 2048, 3, sig_shift); #if (TM_UNROLL && TM_UNROLL_COMPUTERMS16) #pragma TCS_unroll=2 #pragma TCS_unrollexact=1 #endif for ( i=0 ; i> 6; } #if (TM_UNROLL && TM_UNROLL_COMPUTERMS16) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif COMPUTERMS16_STOP(); return spx_sqrt(sum/len) << (3 - sig_shift); } } #else { #if (TM_UNROLL && TM_UNROLL_COMPUTERMS16) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( i=0 ; i16383) { register int sum = 0; #if (TM_UNROLL && TM_UNROLL_COMPUTERMS16) #pragma TCS_unroll=2 #pragma TCS_unrollexact=1 #endif for ( i=0 ; i> 6; } #if (TM_UNROLL && TM_UNROLL_COMPUTERMS16) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif COMPUTERMS16_STOP(); return spx_sqrt(sum/len) << 4; } else { register int sig_shift; register int sum=0; sig_shift = mux(max_val < 8192, 1, 0); sig_shift = mux(max_val < 4096, 2, sig_shift); sig_shift = mux(max_val < 2048, 3, sig_shift); #if (TM_UNROLL && TM_UNROLL_COMPUTERMS16) #pragma TCS_unroll=2 #pragma TCS_unrollexact=1 #endif for ( i=0 ; i> 6; } #if (TM_UNROLL && TM_UNROLL_COMPUTERMS16) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif COMPUTERMS16_STOP(); return spx_sqrt(sum/len) << (3 - sig_shift); } } #endif } int normalize16_9(const Int32* restrict x, Int16 * restrict y, Int32 max_scale) { register int x0, x1, x2, x3, x4, x5, x6, x7, x8; register int max_val, m0, m1, m2, m3, m4; register int sig_shift; register int y10, y32, y54, y76; TMDEBUG_ALIGNMEM(x); x0 = ld32(x); x1 = ld32x(x,1); x2 = ld32x(x,2); x3 = ld32x(x,3); x4 = ld32x(x,4); x5 = ld32x(x,5); x6 = ld32x(x,6); x7 = ld32x(x,7); x8 = ld32x(x,8); m0 = imax(iabs(x0), iabs(x1)); m1 = imax(iabs(x2), iabs(x3)); m2 = imax(iabs(x4), iabs(x5)); m3 = imax(iabs(x6), iabs(x7)); m4 = imax(m0, iabs(x8)); m1 = imax(m1, m2); m3 = imax(m3, m4); max_val = imax(1,imax(m1,m3)); sig_shift=0; while (max_val>max_scale) { sig_shift++; max_val >>= 1; } if ( sig_shift != 0 ) { y10 = pack16lsb(x1 >> sig_shift, x0 >> sig_shift); y32 = pack16lsb(x3 >> sig_shift, x2 >> sig_shift); y54 = pack16lsb(x5 >> sig_shift, x4 >> sig_shift); y76 = pack16lsb(x7 >> sig_shift, x6 >> sig_shift); y[8] = x8 >> sig_shift; st32(y,y10); st32d(4,y,y32); st32d(8,y,y54); st32d(12,y,y76); } return sig_shift; } int normalize16_mod8(const Int32 * restrict x, Int16 * restrict y, Int32 max_scale,int len) { register int i, max_val, sig_shift; TMDEBUG_ALIGNMEM(x); max_val = 1; for ( i=0 ; imax_scale) { sig_shift++; max_val >>= 1; } if ( sig_shift != 0 ) { for ( i=0 ; i> sig_shift, x0 >> sig_shift); y32 = pack16lsb(x3 >> sig_shift, x2 >> sig_shift); y54 = pack16lsb(x5 >> sig_shift, x4 >> sig_shift); y76 = pack16lsb(x7 >> sig_shift, x6 >> sig_shift); st32(y,y10); st32d(4,y,y32); st32d(8,y,y54); st32d(12,y,y76); } } return sig_shift; } #define OVERRIDE_NORMALIZE16 int normalize16(const Int32 *x, Int16 *y, Int32 max_scale, int len) { TMDEBUG_ALIGNMEM(x); TMDEBUG_ALIGNMEM(y); NORMALIZE16_START(); if ( len == 9 ) { NORMALIZE16_STOP(); return normalize16_9(x,y,max_scale); } else { NORMALIZE16_STOP(); return normalize16_mod8(x,y,max_scale,len); } } void filter_mem16_10(const Int16 *x, const Int16 *num, const Int16 *den, Int16 *y, int N, Int32 *mem) { register int i; register int c9, c8, c7, c6, c5; register int c4, c3, c2, c1, c0; register int input; register int output_0, output_1, output_2, output_3, output_4; register int output_5, output_6, output_7, output_8, output_9; register Int16 xi, yi; c9 = pack16lsb(-den[9],num[9]); c8 = pack16lsb(-den[8],num[8]); c7 = pack16lsb(-den[7],num[7]); c6 = pack16lsb(-den[6],num[6]); c5 = pack16lsb(-den[5],num[5]); c4 = pack16lsb(-den[4],num[4]); c3 = pack16lsb(-den[3],num[3]); c2 = pack16lsb(-den[2],num[2]); c1 = pack16lsb(-den[1],num[1]); c0 = pack16lsb(-den[0],num[0]); output_0 = mem[0]; output_1 = mem[1]; output_2 = mem[2]; output_3 = mem[3]; output_4 = mem[4]; output_5 = mem[5]; output_6 = mem[6]; output_7 = mem[7]; output_8 = mem[8]; output_9 = mem[9]; #if (TM_UNROLL && TM_UNROLL_FILTER) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( i=0 ; i> 1; c67 = ld32x(num,3); c45 = ld32x(num,2); c23 = ld32x(num,1); c01 = ld32x(num,0); c67 = funshift2(c67,c67); c45 = funshift2(c45,c45); c23 = funshift2(c23,c23); c01 = funshift2(c01,c01); b3 = x76 = ld32x(x,N_2-1); b2 = x54 = ld32x(x,N_2-2); b1 = x32 = ld32x(x,N_2-3); b0 = x10 = ld32x(x,N_2-4); #if (TM_UNROLL && TM_UNROLL_FILTER > 0) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( i=N-1 ; i >= 8 ; --i ) { xi = asri(16,x76); x76 = funshift2(x76, x54); x54 = funshift2(x54, x32); x32 = funshift2(x32, x10); x10 = pack16lsb(x10, (int)x[i-8]); r2 = iadd(ifir16(x10,c67),ifir16(x32,c45)); r3 = iadd(ifir16(x54,c23),ifir16(x76,c01)); r1 = iadd(r2,r3); y[i] = iclipi(iadd(xi,PSHR32(r1,LPC_SHIFT)),32767); } for ( i=7, a=(Int16*)mem ; i>=0 ; --i ) { xi = asri(16,x76); x76 = funshift2(x76, x54); x54 = funshift2(x54, x32); x32 = funshift2(x32, x10); x10 = pack16lsb(x10, (int)a[i]); r2 = iadd(ifir16(x10,c67),ifir16(x32,c45)); r3 = iadd(ifir16(x54,c23),ifir16(x76,c01)); r1 = iadd(r2,r3); y[i] = iclipi(iadd(xi,PSHR32(r1,LPC_SHIFT)),32767); } #if (TM_UNROLL && TM_UNROLL_FILTER > 0) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif mem[0] = b0; mem[1] = b1; mem[2] = b2; mem[3] = b3; } void fir_mem16_10(const Int16 *x, const Int16 *num, Int16 *y, int N, Int32 *mem) { register int N_2, i; register int c89, c67, c45, c23, c01; register int b0, b1, b2, b3, b4; register int r1, r2, r3, r4, r5; register int x10, x32, x54, x76, x98, xi; register Int16 *a; N_2 = N >> 1; c89 = ld32x(num,4); c67 = ld32x(num,3); c45 = ld32x(num,2); c23 = ld32x(num,1); c01 = ld32x(num,0); c89 = funshift2(c89,c89); c67 = funshift2(c67,c67); c45 = funshift2(c45,c45); c23 = funshift2(c23,c23); c01 = funshift2(c01,c01); b4 = x98 = ld32x(x,N_2-1); b3 = x76 = ld32x(x,N_2-2); b2 = x54 = ld32x(x,N_2-3); b1 = x32 = ld32x(x,N_2-4); b0 = x10 = ld32x(x,N_2-5); #if (TM_UNROLL && TM_UNROLL_FIR > 0) #pragma TCS_unroll=5 #pragma TCS_unrollexact=1 #endif for ( i=N-1 ; i >= 10 ; --i ) { xi = asri(16,x98); x98 = funshift2(x98, x76); x76 = funshift2(x76, x54); x54 = funshift2(x54, x32); x32 = funshift2(x32, x10); x10 = pack16lsb(x10, (int)(x[i-10])); r2 = iadd(ifir16(x10,c89),ifir16(x32,c67)); r3 = iadd(ifir16(x54,c45),ifir16(x76,c23)); r4 = ifir16(x98,c01); r5 = iadd(r2,r3); r1 = iadd(r4,r5); y[i] = iclipi(iadd(xi,PSHR32(r1,LPC_SHIFT)),32767); } for ( i=9,a =(Int16*)mem ; i>=0 ; --i ) { xi = asri(16,x98); x98 = funshift2(x98, x76); x76 = funshift2(x76, x54); x54 = funshift2(x54, x32); x32 = funshift2(x32, x10); x10 = pack16lsb(x10, (int)(a[i])); r2 = iadd(ifir16(x10,c89),ifir16(x32,c67)); r3 = iadd(ifir16(x54,c45),ifir16(x76,c23)); r4 = ifir16(x98,c01); r5 = iadd(r2,r3); r1 = iadd(r4,r5); y[i] = iclipi(iadd(xi,PSHR32(r1,LPC_SHIFT)),32767); } #if (TM_UNROLL && TM_UNROLL_FIR > 0) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif mem[0] = b0; mem[1] = b1; mem[2] = b2; mem[3] = b3; mem[4] = b4; } #define OVERRIDE_FIR_MEM16 void fir_mem16(const spx_word16_t *x, const Int16 *num, spx_word16_t *y, int N, int ord, Int32 *mem, char *stack) { TMDEBUG_ALIGNMEM(x); TMDEBUG_ALIGNMEM(y); TMDEBUG_ALIGNMEM(num); FIRMEM16_START(); if(ord==10) fir_mem16_10(x, num, y, N, mem); else if (ord==8) fir_mem16_8(x, num, y, N, mem); #ifndef REMARK_ON (void)stack; #endif FIRMEM16_STOP(); } #define OVERRIDE_SYN_PERCEP_ZERO16 void syn_percep_zero16(const Int16 *xx, const Int16 *ak, const Int16 *awk1, const Int16 *awk2, Int16 *y, int N, int ord, char *stack) { register int i,j; VARDECL(Int32 *mem); ALLOC(mem, ord, Int32); TMDEBUG_ALIGNMEM(mem); for ( i=0,j=0 ; i 0) #pragma TCS_unroll=2 #pragma TCS_unrollexact=1 #endif for ( i=24 ; i 0) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif y10 = y32 = y54 = y76 = y98 = 0; awk_01 = ld32(awk2); awk_23 = ld32x(awk2,1); awk_45 = ld32x(awk2,2); awk_67 = ld32x(awk2,3); awk_89 = ld32x(awk2,4); awk_01 = funshift2(awk_01, awk_01); awk_23 = funshift2(awk_23, awk_23); awk_45 = funshift2(awk_45, awk_45); awk_67 = funshift2(awk_67, awk_67); awk_89 = funshift2(awk_89, awk_89); #if (TM_UNROLL && TM_UNROLL_COMPUTEIMPULSERESPONSE > 0) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( i=0 ; i 0) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif y10 = y32 = y54 = y76 = y98 = 0; awk_01 = ld32(ak); awk_23 = ld32x(ak,1); awk_45 = ld32x(ak,2); awk_67 = ld32x(ak,3); awk_89 = ld32x(ak,4); awk_01 = funshift2(awk_01, awk_01); awk_23 = funshift2(awk_23, awk_23); awk_45 = funshift2(awk_45, awk_45); awk_67 = funshift2(awk_67, awk_67); awk_89 = funshift2(awk_89, awk_89); #if (TM_UNROLL && TM_UNROLL_COMPUTEIMPULSERESPONSE > 0) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( i=0 ; i 0) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif } void compute_impulse_response_8(const Int16 *ak, const Int16 *awk1, const Int16 *awk2, Int16 *y, int N) { register int awk_01, awk_23, awk_45, awk_67; register int y10, y32, y54, y76, yi; register int i, acc0, acc1, N_2; N_2 = N << 1; awk_01 = ld32(awk1); awk_23 = ld32x(awk1,1); awk_45 = ld32x(awk1,2); awk_67 = ld32x(awk1,3); y10 = funshift2(awk_01, LPC_SCALING << 16); st32d(0, y, y10); y32 = funshift2(awk_23, awk_01); st32d(4, y, y32); y54 = funshift2(awk_45, awk_23); st32d(8, y, y54); y76 = funshift2(awk_67, awk_45); st32d(12, y, y76); y10 = funshift2(0, awk_67); st32d(16, y, y10); st32d(20, y, 0); #if (TM_UNROLL && TM_UNROLL_COMPUTEIMPULSERESPONSE > 0) #pragma TCS_unroll=2 #pragma TCS_unrollexact=1 #endif for ( i=24 ; i 0) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif y10 = y32 = y54 = y76 = 0; awk_01 = ld32(awk2); awk_23 = ld32x(awk2,1); awk_45 = ld32x(awk2,2); awk_67 = ld32x(awk2,3); awk_01 = funshift2(awk_01, awk_01); awk_23 = funshift2(awk_23, awk_23); awk_45 = funshift2(awk_45, awk_45); awk_67 = funshift2(awk_67, awk_67); #if (TM_UNROLL && TM_UNROLL_COMPUTEIMPULSERESPONSE > 0) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( i=0 ; i 0) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif y10 = y32 = y54 = y76 = 0; awk_01 = ld32(ak); awk_23 = ld32x(ak,1); awk_45 = ld32x(ak,2); awk_67 = ld32x(ak,3); awk_01 = funshift2(awk_01, awk_01); awk_23 = funshift2(awk_23, awk_23); awk_45 = funshift2(awk_45, awk_45); awk_67 = funshift2(awk_67, awk_67); #if (TM_UNROLL && TM_UNROLL_COMPUTEIMPULSERESPONSE > 0) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( i=0 ; i 0) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif } #define OVERRIDE_COMPUTE_IMPULSE_RESPONSE void compute_impulse_response(const Int16 *ak, const Int16 *awk1, const Int16 *awk2, Int16 *y, int N, int ord, char *stack) { TMDEBUG_ALIGNMEM(ak); TMDEBUG_ALIGNMEM(awk1); TMDEBUG_ALIGNMEM(awk2); TMDEBUG_ALIGNMEM(y); COMPUTEIMPULSERESPONSE_START(); if ( ord == 10 ) compute_impulse_response_10(ak,awk1,awk2,y,N); else compute_impulse_response_8(ak,awk1,awk2,y,N); (void)stack; COMPUTEIMPULSERESPONSE_STOP(); } #define OVERRIDE_QMFSYNTH void qmf_synth(const Int16 *x1, const Int16 *x2, const Int16 *a, Int16 *y, int N, int M, Int32 *mem1, Int32 *mem2, char *stack) /* assumptions: all odd x[i] are zero -- well, actually they are left out of the array now N and M are multiples of 4 */ { register int i, j; register int M2, N2; VARDECL(int *x12); M2 = M>>1; N2 = N>>1; ALLOC(x12, M2+N2, int); TMDEBUG_ALIGNMEM(a); TMDEBUG_ALIGNMEM(x12); TMDEBUG_ALIGNMEM(mem1); TMDEBUG_ALIGNMEM(mem2); QMFSYNTH_START(); #if (TM_UNROLL && TM_UNROLL_QMFSYNTH > 0) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( i=0 ; i 0) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif for (i = 0; i < N2; i += 2) { register int y0, y1, y2, y3; register int x12_0; y0 = y1 = y2 = y3 = 0; x12_0 = x12[N2-2-i]; for (j = 0; j < M2; j += 2) { register int x12_1; register int a10, a11, a0_0; register int _a10, _a11, _a0_0; a10 = ld32x(a,j); a11 = pack16msb(a10,a10); a0_0= pack16lsb(a10,ineg(sex16(a10))); x12_1 = x12[N2-1+j-i]; y0 += ifir16(a0_0,x12_1); y1 += ifir16(a11, x12_1); y2 += ifir16(a0_0,x12_0); y3 += ifir16(a11 ,x12_0); _a10 = ld32x(a,j+1); _a11 = pack16msb(_a10,_a10); _a0_0 = pack16lsb(_a10,ineg(sex16(_a10))); x12_0 = x12[N2+j-i]; y0 += ifir16(_a0_0,x12_0); y1 += ifir16(_a11, x12_0); y2 += ifir16(_a0_0,x12_1); y3 += ifir16(_a11 ,x12_1); } y[2*i] = EXTRACT16(SATURATE32(PSHR32(y0,15),32767)); y[2*i+1] = EXTRACT16(SATURATE32(PSHR32(y1,15),32767)); y[2*i+2] = EXTRACT16(SATURATE32(PSHR32(y2,15),32767)); y[2*i+3] = EXTRACT16(SATURATE32(PSHR32(y3,15),32767)); } #if (TM_UNROLL && TM_UNROLL_QMFSYNTH > 0) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for (i = 0; i < M2; ++i) { mem1[2*i+1] = asri(16,x12[i]); mem2[2*i+1] = sex16(x12[i]); } #if (TM_UNROLL && TM_UNROLL_QMFSYNTH > 0) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif QMFSYNTH_STOP(); } #define OVERRIDE_QMFDECOMP void qmf_decomp(const Int16 *xx, const Int16 *aa, Int16 *y1, Int16 *y2, int N, int M, Int16 *mem, char *stack) { VARDECL(int *_a); VARDECL(int *_x); register int i, j, k, MM, M2, N2; register int _xx10, _mm10; register int *_x2; M2=M>>1; N2=N>>1; MM=(M-2)<<1; ALLOC(_a, M2, int); ALLOC(_x, N2+M2, int); _x2 = _x + M2 - 1; TMDEBUG_ALIGNMEM(xx); TMDEBUG_ALIGNMEM(aa); TMDEBUG_ALIGNMEM(y1); TMDEBUG_ALIGNMEM(y2); TMDEBUG_ALIGNMEM(mem); TMDEBUG_ALIGNMEM(_a); TMDEBUG_ALIGNMEM(_x); QMFDECOMP_START(); _xx10 = ld32(xx); _xx10 = dualasr(_xx10,1); _mm10 = ld32(mem); _x2[0] = pack16lsb(_xx10,_mm10); #if (TM_UNROLL && TM_UNROLL_QMFSYNTH > 0) #pragma TCS_unroll=2 #pragma TCS_unrollexact=1 #endif for ( i=0 ; i 0) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif mem[M-2] = xx[N-M+1] >> 1; M2 >>= 1; for ( i=0 ; i #include "profile_tm.h" #ifdef FIXED_POINT inline void vq_nbest_dist(int i, int N, int dist, int *used, int *nbest, Int32 *best_dist) { register int k; if (i= 1) && (k > *used || dist < best_dist[k-1]); k--) { best_dist[k]=best_dist[k-1]; nbest[k] = nbest[k-1]; } best_dist[k]=dist; nbest[k]=i; *used++; } } void vq_nbest_5(Int16 *in, const Int16 *codebook, int entries, Int32 *E, int N, int *nbest, Int32 *best_dist) { register int i, j; register int in10, in32, in4; int used = 0; in10 = pack16lsb(in[1],in[0]); /* Note: memory is not align here */ in32 = pack16lsb(in[3],in[2]); in4 = sex16(in[4]); #if (TM_UNROLL && TM_UNROLL_VQNBEST > 0) #pragma TCS_unroll=2 #pragma TCS_unrollexact=1 #endif for ( i=0,j=0 ; i> 1) - dist1; cb65 = funshift2(cb76,cb54); cb87 = funshift2(cb98,cb76); dist2 = asri(16,cb98) * in4; dist2 += ifir16(in10,cb65) + ifir16(in32,cb87); dist2 = (E[i+1] >> 1) - dist2; vq_nbest_dist(i,N,dist1,&used,nbest,best_dist); vq_nbest_dist(i+1,N,dist2,&used,nbest,best_dist); } #if (TM_UNROLL && TM_UNROLL_VQNBEST > 0) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif } void vq_nbest_8(Int16 *in, const Int16 *codebook, int entries, Int32 *E, int N, int *nbest, Int32 *best_dist) { register int i, j; register int in10, in32, in54, in76; int used = 0; in10 = pack16lsb(in[1],in[0]); /* Note: memory is not align here */ in32 = pack16lsb(in[3],in[2]); in54 = pack16lsb(in[5],in[4]); in76 = pack16lsb(in[7],in[6]); #if (TM_UNROLL && TM_UNROLL_VQNBEST > 0) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( i=0,j=0 ; i> 1) - dist; vq_nbest_dist(i,N,dist,&used,nbest,best_dist); } #if (TM_UNROLL && TM_UNROLL_VQNBEST > 0) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif } void vq_nbest_10(Int16 *in, const Int16 *codebook, int entries, Int32 *E, int N, int *nbest, Int32 *best_dist) { register int i, j; register int in10, in32, in54, in76, in98; int used = 0; in10 = pack16lsb(in[1],in[0]); in32 = pack16lsb(in[3],in[2]); in54 = pack16lsb(in[5],in[4]); in76 = pack16lsb(in[7],in[6]); in98 = pack16lsb(in[9],in[8]); #if (TM_UNROLL && TM_UNROLL_VQNBEST > 0) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( i=0,j=0 ; i> 1) - dist; vq_nbest_dist(i,N,dist,&used,nbest,best_dist); } #if (TM_UNROLL && TM_UNROLL_VQNBEST > 0) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif } void vq_nbest_20(Int16 *in, const Int16 *codebook, int entries, Int32 *E, int N, int *nbest, Int32 *best_dist) { register int i, j; register int in10, in32, in54, in76, in98, in_10, in_32, in_54, in_76, in_98; int used = 0; in10 = pack16lsb(in[1],in[0]); /* Note: memory is not align here */ in32 = pack16lsb(in[3],in[2]); in54 = pack16lsb(in[5],in[4]); in76 = pack16lsb(in[6],in[6]); in98 = pack16lsb(in[9],in[8]); in_10 = pack16lsb(in[11],in[10]); in_32 = pack16lsb(in[13],in[12]); in_54 = pack16lsb(in[15],in[14]); in_76 = pack16lsb(in[17],in[16]); in_98 = pack16lsb(in[19],in[18]); #if (TM_UNROLL && TM_UNROLL_VQNBEST > 0) #pragma TCS_unroll=2 #pragma TCS_unrollexact=1 #endif for ( i=0,j=0 ; i> 1) - dist; vq_nbest_dist(i,N,dist,&used,nbest,best_dist); } #if (TM_UNROLL && TM_UNROLL_VQNBEST > 0) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif } #define OVERRIDE_VQ_NBEST void vq_nbest (Int16 *in, const Int16 *codebook, int len, int entries, Int32 *E, int N, int *nbest, Int32 *best_dist, char *stack) { TMDEBUG_ALIGNMEM(codebook); VQNBEST_START(); if( len==5 ) vq_nbest_5(in,codebook,entries,E,N,nbest,best_dist); else if ( len==8 ) vq_nbest_8(in,codebook,entries,E,N,nbest,best_dist); else if ( len==10 ) vq_nbest_10(in,codebook,entries,E,N,nbest,best_dist); else if ( len==20 ) vq_nbest_20(in,codebook,entries,E,N,nbest,best_dist); #ifndef REMARK_ON (void)stack; #endif VQNBEST_STOP(); } inline void vq_nbest_sign_dist(int i, int N, int dist, int sign, int entries, int *used, int *nbest, Int32 *best_dist) { register int k; if (i= 1) && (k > *used || dist < best_dist[k-1]); k--) { best_dist[k]=best_dist[k-1]; nbest[k] = nbest[k-1]; } if ( sign ) i += entries; best_dist[k]=dist; *used++; nbest[k] = i; } } void vq_nbest_sign_5(Int16 *in, const Int16 *codebook, int entries, Int32 *E, int N, int *nbest, Int32 *best_dist) { register int i, j; register int in10, in32, in4; int used = 0; in10 = ld32(in); in32 = ld32x(in,1); in4 = sex16(in[4]); #if (TM_UNROLL && TM_UNROLL_VQSIGNNBEST > 0) #pragma TCS_unroll=2 #pragma TCS_unrollexact=1 #endif for ( i=0,j=0 ; i0,0,1); dist1 = iflip(dist1>0,dist1); dist1 = (E[i] >> 1) + dist1; cb65 = funshift2(cb76,cb54); cb87 = funshift2(cb98,cb76); dist2 = asri(16,cb98) * in4; dist2 += ifir16(in10,cb65) + ifir16(in32,cb87); sign2 = mux(dist2>0,0,1); dist2 = iflip(dist2>0,dist2); dist2 = (E[i] >> 1) + dist2; vq_nbest_sign_dist(i,N,dist1,sign1,entries,&used,nbest,best_dist); vq_nbest_sign_dist(i+1,N,dist2,sign2,entries,&used,nbest,best_dist); } #if (TM_UNROLL && TM_UNROLL_VQSIGNNBEST > 0) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif } void vq_nbest_sign_8(Int16 *in, const Int16 *codebook, int entries, Int32 *E, int N, int *nbest, Int32 *best_dist) { register int i, j; register int sign; register int in10, in32, in54, in76; int used = 0; in10 = ld32(in); in32 = ld32x(in,1); in54 = ld32x(in,2); in76 = ld32x(in,3); #if (TM_UNROLL && TM_UNROLL_VQSIGNNBEST > 0) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( i=0,j=0 ; i0,0,1); dist = iflip(dist>0,dist); dist = (E[i] >> 1) + dist; vq_nbest_sign_dist(i,N,dist,sign,entries,&used,nbest,best_dist); } #if (TM_UNROLL && TM_UNROLL_VQSIGNNBEST > 0) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif } void vq_nbest_sign_10(Int16 *in, const Int16 *codebook, int entries, Int32 *E, int N, int *nbest, Int32 *best_dist) { register int i, j; register int sign; register int in10, in32, in54, in76, in98; int used = 0; in10 = ld32(in); in32 = ld32x(in,1); in54 = ld32x(in,2); in76 = ld32x(in,3); in98 = ld32x(in,4); #if (TM_UNROLL && TM_UNROLL_VQSIGNNBEST > 0) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( i=0,j=0 ; i0,0,1); dist = iflip(dist>0,dist); dist = (E[i] >> 1) + dist; vq_nbest_sign_dist(i,N,dist,sign,entries,&used,nbest,best_dist); } #if (TM_UNROLL && TM_UNROLL_VQSIGNNBEST > 0) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif } void vq_nbest_sign_20(Int16 *in, const Int16 *codebook, int entries, Int32 *E, int N, int *nbest, Int32 *best_dist) { register int i, j; register int sign; register int in10, in32, in54, in76, in98, in_10, in_32, in_54, in_76, in_98; int used = 0; in10 = ld32(in); in32 = ld32x(in,1); in54 = ld32x(in,2); in76 = ld32x(in,3); in98 = ld32x(in,4); in_10 = ld32x(in,5); in_32 = ld32x(in,6); in_54 = ld32x(in,7); in_76 = ld32x(in,8); in_98 = ld32x(in,9); #if (TM_UNROLL && TM_UNROLL_VQSIGNNBEST > 0) #pragma TCS_unroll=2 #pragma TCS_unrollexact=1 #endif for ( i=0,j=0 ; i0,0,1); dist = iflip(dist>0,dist); dist = (E[i] >> 1) + dist; vq_nbest_sign_dist(i,N,dist,sign,entries,&used,nbest,best_dist); } #if (TM_UNROLL && TM_UNROLL_VQSIGNNBEST > 0) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif } #define OVERRIDE_VQ_NBEST_SIGN void vq_nbest_sign (Int16 *in, const Int16 *codebook, int len, int entries, Int32 *E, int N, int *nbest, Int32 *best_dist, char *stack) { TMDEBUG_ALIGNMEM(in); TMDEBUG_ALIGNMEM(codebook); VQNBESTSIGN_START(); if( len==5 ) vq_nbest_sign_5(in,codebook,entries,E,N,nbest,best_dist); else if ( len==8 ) vq_nbest_sign_8(in,codebook,entries,E,N,nbest,best_dist); else if ( len==10 ) vq_nbest_sign_10(in,codebook,entries,E,N,nbest,best_dist); else if ( len==20 ) vq_nbest_sign_20(in,codebook,entries,E,N,nbest,best_dist); #ifndef REMARK_ON (void)stack; #endif VQNBESTSIGN_STOP(); } #endif mumble-1.3.4/3rdparty/speex-src/tmv/fixed_tm.h0000664000175000017500000000612214010707304021074 0ustar builderbuilder/* Copyright (C) 2007 Hong Zhiqian */ /** @file fixed_tm.h @author Hong Zhiqian @brief Various compatibility routines for Speex (TriMedia version) */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef FIXED_TM_H #define FIXED_TM_H #include #undef SATURATE #undef SATURATE16 #undef SATURATE32 #define SATURATE(x,a) iclipi(x,a) #define SATURATE16(x,a) iclipi(x,a) #define SATURATE32(x,a) iclipi(x,a) #undef EXTEND32 #define EXTEND32(x) sex16(x) #undef NEG16 #undef NEG32 #define NEG16(x) ineg((int)(x)) #define NEG32(x) ineg(x) #undef ABS #undef ABS16 #undef ABS32 #define ABS(x) iabs(x) #define ABS32(x) iabs(x) #define ABS16(x) iabs((int)(x)) #undef MIN16 #undef MIN32 #define MIN16(a,b) imin((int)(a),(int)(b)) #define MIN32(a,b) imin(a,b) #undef MAX16 #undef MAX32 #define MAX16(a,b) imax((int)(a),(int)(b)) #define MAX32(a,b) imax(a,b) #undef ADD16 #undef SUB16 #undef ADD32 #undef SUB32 #undef MULT16_16 #undef MULT16_16_16 #define ADD16(a,b) ((int)(a) + (int)(b)) #define SUB16(a,b) ((int)(a) - (int)(b)) #define ADD32(a,b) ((int)(a) + (int)(b)) #define SUB32(a,b) ((int)(a) - (int)(b)) #define MULT16_16_16(a,b) ((int)(a) * (int)(b)) #define MULT16_16(a,b) ((int)(a) * (int)(b)) #if TM_DEBUGMEM_ALIGNNMENT #include #define TMDEBUG_ALIGNMEM(x) \ { if( ((int)(x) & (int)(0x00000003)) != 0 ) \ { printf("memory not align. file: %s, line: %d\n", __FILE__, __LINE__); \ } \ } #else #define TMDEBUG_ALIGNMEM(x) #endif #endif mumble-1.3.4/3rdparty/speex-src/tmv/lpc_tm.h0000664000175000017500000000755714010707304020570 0ustar builderbuilder/* Copyright (C) 2007 Hong Zhiqian */ /** @file lpc_tm.h @author Hong Zhiqian @brief Various compatibility routines for Speex (TriMedia version) */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include "profile_tm.h" #ifdef FIXED_POINT #define OVERRIDE_SPEEX_AUTOCORR void _spx_autocorr(const Int16 *x, Int16 *ac, int lag, int n) { register int i, j; register int shift, ac_shift; register int n_2; register int ac0; TMDEBUG_ALIGNMEM(x); TMDEBUG_ALIGNMEM(ac); _SPX_AUTOCORR_START(); n_2 = n >> 1; ac0 = n + 1; #if (TM_UNROLL && TM_UNROLL__SPXAUTOCORR) #pragma TCS_unroll=5 #pragma TCS_unrollexact=1 #endif for ( j=0 ; j> 8; ac0 += ifir16(x32, x32) >> 8; ac0 += ifir16(x54, x54) >> 8; ac0 += ifir16(x76, x76) >> 8; } #if (TM_UNROLL && TM_UNROLL__SPXAUTOCORR) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif shift = 8; while (shift && ac0<0x40000000) { shift--; ac0 <<= 1; } ac_shift = 18; while (ac_shift && ac0<0x40000000) { ac_shift--; ac0 <<= 1; } if ( shift == 0 ) { for ( i=0 ; i> ac_shift; } } else { for ( i=0 ; i> shift; } for ( k=16,l=8,m=16-i ; k> shift; acc2 += ifir16(x32,y32) >> shift; } ac[i] = (acc0 + acc1 + acc2) >> ac_shift; } } _SPX_AUTOCORR_STOP(); } #endif mumble-1.3.4/3rdparty/speex-src/tmv/profile_tm.h0000664000175000017500000002546714010707304021452 0ustar builderbuilder/* Copyright (C) 2007 Hong Zhiqian */ /** @file profile_tm.h @author Hong Zhiqian @brief Various compatibility routines for Speex (TriMedia version) */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @remarks This file provide some capabilities to measure clock cycles. * Use this if unable to compile with TriMedia profile options */ extern int __profile_begin; extern int __profile_end; #if TM_PROFILE #define PROFILE_START() \ { \ __profile_begin = cycles(); \ } \ #define PROFILE_STOP() \ { \ __profile_end = cycles(); \ printf("%s\t%d\n", __FUNCTION__, end - begin); \ } \ #else #define PROFILE_START() #define PROFILE_STOP() #endif #if TM_PROFILE_SPXAUTOCORR #define _SPX_AUTOCORR_START() PROFILE_START() #define _SPX_AUTOCORR_STOP() PROFILE_STOP() #else #define _SPX_AUTOCORR_START() #define _SPX_AUTOCORR_STOP() #endif #if TM_PROFILE_INNERPROD #define INNERPROD_START() PROFILE_START() #define INNERPROD_STOP() PROFILE_STOP() #else #define INNERPROD_START() #define INNERPROD_STOP() #endif #if TM_PROFILE_PITCHXCORR #define PITCHXCORR_START() PROFILE_START() #define PITCHXCORR_STOP() PROFILE_STOP() #else #define PITCHXCORR_START() #define PITCHXCORR_STOP() #endif #if TM_PROFILE_COMPUTEPITCHERROR #define COMPUTEPITCHERROR_START() PROFILE_START() #define COMPUTEPITCHERROR_STOP() PROFILE_STOP() #else #define COMPUTEPITCHERROR_START() #define COMPUTEPITCHERROR_STOP() #endif #if TM_PROFILE_PITCHGAINSEARCH3TAPVQ #define PITCHGAINSEARCH3TAPVQ_START() PROFILE_START() #define PITCHGAINSEARCH3TAPVQ_STOP() PROFILE_STOP() #else #define PITCHGAINSEARCH3TAPVQ_START() #define PITCHGAINSEARCH3TAPVQ_STOP() #endif #if TM_PROFILE_OPENLOOPNBESTPITCH #define OPENLOOPNBESTPITCH_START() PROFILE_START() #define OPENLOOPNBESTPITCH_STOP() PROFILE_STOP() #else #define OPENLOOPNBESTPITCH_START() #define OPENLOOPNBESTPITCH_STOP() #endif #if TM_PROFILE_LSP_INTERPOLATE #define LSPINTERPOLATE_START() PROFILE_START() #define LSPINTERPOLATE_STOP() PROFILE_STOP() #else #define LSPINTERPOLATE_START() #define LSPINTERPOLATE_STOP() #endif #if TM_PROFILE_CHEBPOLYEVA #define CHEBPOLYEVA_START() PROFILE_START() #define CHEBPOLYEVA_STOP() PROFILE_STOP() #else #define CHEBPOLYEVA_START() #define CHEBPOLYEVA_STOP() #endif #if TM_PROFILE_COMPUTEQUANTWEIGHTS #define COMPUTEQUANTWEIGHTS_START() PROFILE_START() #define COMPUTEQUANTWEIGHTS_STOP() PROFILE_STOP() #else #define COMPUTEQUANTWEIGHTS_START() #define COMPUTEQUANTWEIGHTS_STOP() #endif #if TM_PROFILE_LSPQUANT #define LSPQUANT_START() PROFILE_START() #define LSPQUANT_STOP() PROFILE_STOP() #else #define LSPQUANT_START() #define LSPQUANT_STOP() #endif #if TM_PROFILE_LSPWEIGHTQUANT #define LSPWEIGHTQUANT_START() PROFILE_START() #define LSPWEIGHTQUANT_STOP() PROFILE_STOP() #else #define LSPWEIGHTQUANT_START() #define LSPWEIGHTQUANT_STOP() #endif #if TM_PROFILE_FIRMEM16 #define FIRMEM16_START() PROFILE_START() #define FIRMEM16_STOP() PROFILE_STOP() #else #define FIRMEM16_START() #define FIRMEM16_STOP() #endif #if TM_PROFILE_IIRMEM16 #define IIRMEM16_START() PROFILE_START() #define IIRMEM16_STOP() PROFILE_STOP() #else #define IIRMEM16_START() #define IIRMEM16_STOP() #endif #if TM_PROFILE_FILTERMEM16 #define FILTERMEM16_START() PROFILE_START() #define FILTERMEM16_STOP() PROFILE_STOP() #else #define FILTERMEM16_START() #define FILTERMEM16_STOP() #endif #if TM_PROFILE_COMPUTERMS16 #define COMPUTERMS16_START() PROFILE_START() #define COMPUTERMS16_STOP() PROFILE_STOP() #else #define COMPUTERMS16_START() #define COMPUTERMS16_STOP() #endif #if TM_PROFILE_NORMALIZE16 #define NORMALIZE16_START() PROFILE_START() #define NORMALIZE16_STOP() PROFILE_STOP() #else #define NORMALIZE16_START() #define NORMALIZE16_STOP() #endif #if TM_PROFILE_BWLPC #define BWLPC_START() PROFILE_START() #define BWLPC_STOP() PROFILE_STOP() #else #define BWLPC_START() #define BWLPC_STOP() #endif #if TM_PROFILE_HIGHPASS #define HIGHPASS_START() PROFILE_START() #define HIGHPASS_STOP() PROFILE_STOP() #else #define HIGHPASS_START() #define HIGHPASS_STOP() #endif #if TM_PROFILE_SIGNALMUL #define SIGNALMUL_START() PROFILE_START() #define SIGNALMUL_STOP() PROFILE_STOP() #else #define SIGNALMUL_START() #define SIGNALMUL_STOP() #endif #if TM_PROFILE_SIGNALDIV #define SIGNALDIV_START() PROFILE_START() #define SIGNALDIV_STOP() PROFILE_STOP() #else #define SIGNALDIV_START() #define SIGNALDIV_STOP() #endif #if TM_PROFILE_COMPUTEIMPULSERESPONSE #define COMPUTEIMPULSERESPONSE_START() PROFILE_START() #define COMPUTEIMPULSERESPONSE_STOP() PROFILE_STOP() #else #define COMPUTEIMPULSERESPONSE_START() #define COMPUTEIMPULSERESPONSE_STOP() #endif #if TM_PROFILE_COMPUTEWEIGHTEDCODEBOOK #define COMPUTEWEIGHTEDCODEBOOK_START() PROFILE_START() #define COMPUTEWEIGHTEDCODEBOOK_STOP() PROFILE_STOP() #else #define COMPUTEWEIGHTEDCODEBOOK_START() #define COMPUTEWEIGHTEDCODEBOOK_STOP() #endif #if TM_PROFILE_TARGETUPDATE #define TARGETUPDATE_START() PROFILE_START() #define TARGETUPDATE_STOP() PROFILE_STOP() #else #define TARGETUPDATE_START() #define TARGETUPDATE_STOP() #endif #if TM_PROFILE_VQNBEST #define VQNBEST_START() PROFILE_START() #define VQNBEST_STOP() PROFILE_STOP() #else #define VQNBEST_START() #define VQNBEST_STOP() #endif #if TM_PROFILE_VQNBESTSIGN #define VQNBESTSIGN_START() PROFILE_START() #define VQNBESTSIGN_STOP() PROFILE_STOP() #else #define VQNBESTSIGN_START() #define VQNBESTSIGN_STOP() #endif #if TM_PROFILE_PREPROCESSANALYSIS #define PREPROCESSANAYLSIS_START() PROFILE_START() #define PREPROCESSANAYLSIS_STOP() PROFILE_STOP() #else #define PREPROCESSANAYLSIS_START() #define PREPROCESSANAYLSIS_STOP() #endif #if TM_PROFILE_UPDATENOISEPROB #define UPDATENOISEPROB_START() PROFILE_START() #define UPDATENOISEPROB_STOP() PROFILE_STOP() #else #define UPDATENOISEPROB_START() #define UPDATENOISEPROB_STOP() #endif #if TM_PROFILE_COMPUTEGAINFLOOR #define COMPUTEGAINFLOOR_START() PROFILE_START() #define COMPUTEGAINFLOOR_STOP() PROFILE_STOP() #else #define COMPUTEGAINFLOOR_START() #define COMPUTEGAINFLOOR_STOP() #endif #if TM_PROFILE_FILTERDCNOTCH16 #define FILTERDCNOTCH16_START() PROFILE_START() #define FILTERDCNOTCH16_STOP() PROFILE_STOP() #else #define FILTERDCNOTCH16_START() #define FILTERDCNOTCH16_STOP() #endif #if TM_PROFILE_MDFINNERPROD #define MDFINNERPROD_START() PROFILE_START() #define MDFINNERPROD_STOP() PROFILE_STOP() #else #define MDFINNERPROD_START() #define MDFINNERPROD_STOP() #endif #if TM_PROFILE_SPECTRALMULACCUM #define SPECTRALMULACCUM_START() PROFILE_START() #define SPECTRALMULACCUM_STOP() PROFILE_STOP() #else #define SPECTRALMULACCUM_START() #define SPECTRALMULACCUM_STOP() #endif #if TM_PROFILE_WEIGHTEDSPECTRALMULCONJ #define WEIGHTEDSPECTRALMULCONJ_START() PROFILE_START() #define WEIGHTEDSPECTRALMULCONJ_STOP() PROFILE_STOP() #else #define WEIGHTEDSPECTRALMULCONJ_START() #define WEIGHTEDSPECTRALMULCONJ_STOP() #endif #if TM_PROFILE_MDFADJUSTPROP #define MDFADJUSTPROP_START() PROFILE_START() #define MDFADJUSTPROP_STOP() PROFILE_STOP() #else #define MDFADJUSTPROP_START() #define MDFADJUSTPROP_STOP() #endif #if TM_PROFILE_SPEEXECHOGETRESIDUAL #define SPEEXECHOGETRESIDUAL_START() PROFILE_START() #define SPEEXECHOGETRESIDUAL_STOP() PROFILE_STOP() #else #define SPEEXECHOGETRESIDUAL_START() #define SPEEXECHOGETRESIDUAL_STOP() #endif #if TM_PROFILE_LSPENFORCEMARGIN #define LSPENFORCEMARGIN_START() PROFILE_START() #define LSPENFORCEMARGIN_STOP() PROFILE_STOP() #else #define LSPENFORCEMARGIN_START() #define LSPENFORCEMARGIN_STOP() #endif #if TM_PROFILE_LSPTOLPC #define LSPTOLPC_START() PROFILE_START() #define LSPTOLPC_STOP() PROFILE_STOP() #else #define LSPTOLPC_START() #define LSPTOLPC_STOP() #endif #if TM_PROFILE_MAXIMIZERANGE #define MAXIMIZERANGE_START() PROFILE_START() #define MAXIMIZERANGE_STOP() PROFILE_STOP() #else #define MAXIMIZERANGE_START() #define MAXIMIZERANGE_STOP() #endif #if TM_PROFILE_RENORMRANGE #define RENORMRANGE_START() PROFILE_START() #define RENORMRANGE_STOP() PROFILE_STOP() #else #define RENORMRANGE_START() #define RENORMRANGE_STOP() #endif #if TM_PROFILE_POWERSPECTRUM #define POWERSPECTRUM_START() PROFILE_START() #define POWERSPECTRUM_STOP() PROFILE_STOP() #else #define POWERSPECTRUM_START() #define POWERSPECTRUM_STOP() #endif #if TM_PROFILE_QMFSYNTH #define QMFSYNTH_START() PROFILE_START() #define QMFSYNTH_STOP() PROFILE_STOP() #else #define QMFSYNTH_START() #define QMFSYNTH_STOP() #endif #if TM_PROFILE_QMFDECOMP #define QMFDECOMP_START() PROFILE_START() #define QMFDECOMP_STOP() PROFILE_STOP() #else #define QMFDECOMP_START() #define QMFDECOMP_STOP() #endif #if TM_PROFILE_FILTERBANKCOMPUTEBANK32 #define FILTERBANKCOMPUTEBANK32_START() PROFILE_START() #define FILTERBANKCOMPUTEBANK32_STOP() PROFILE_STOP() #else #define FILTERBANKCOMPUTEBANK32_START() #define FILTERBANKCOMPUTEBANK32_STOP() #endif #if TM_PROFILE_FILTERBANKCOMPUTEPSD16 #define FILTERBANKCOMPUTEPSD16_START() PROFILE_START() #define FILTERBANKCOMPUTEPSD16_STOP() PROFILE_STOP() #else #define FILTERBANKCOMPUTEPSD16_START() #define FILTERBANKCOMPUTEPSD16_STOP() #endif mumble-1.3.4/3rdparty/speex-src/tmv/cb_search_tm.h0000664000175000017500000001002314010707304021701 0ustar builderbuilder/* Copyright (C) 2007 Hong Zhiqian */ /** @file cb_search_tm.h @author Hong Zhiqian @brief Various compatibility routines for Speex (TriMedia version) */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include "profile_tm.h" #ifdef FIXED_POINT #define OVERRIDE_COMPUTE_WEIGHTED_CODEBOOK static void compute_weighted_codebook( const signed char * restrict shape_cb, const Int16 * restrict r, Int16 * restrict resp, Int16 * restrict resp2, Int32 * restrict E, int shape_cb_size, int subvect_size, char *stack) { register int i, j; register int quadsize; TMDEBUG_ALIGNMEM(r); TMDEBUG_ALIGNMEM(resp); TMDEBUG_ALIGNMEM(resp2); COMPUTEWEIGHTEDCODEBOOK_START(); quadsize = subvect_size << 2; for ( i=0 ; i>= 13; resj1 >>= 13; resj2 >>= 13; resj3 >>= 13; e0 += resj0 * resj0; e1 += resj1 * resj1; e2 += resj2 * resj2; e3 += resj3 * resj3; resp[j] = resj0; resp[j+subvect_size] = resj1; resp[j+2*subvect_size] = resj2; resp[j+3*subvect_size] = resj3; } E[i] = e0; E[i+1] = e1; E[i+2] = e2; E[i+3] = e3; resp += quadsize; shape_cb += quadsize; } #ifndef REMARK_ON (void)resp2; (void)stack; #endif COMPUTEWEIGHTEDCODEBOOK_STOP(); } #define OVERRIDE_TARGET_UPDATE static inline void target_update(Int16 * restrict t, Int16 g, Int16 * restrict r, int len) { register int n; register int gr1, gr2, t1, t2, r1, r2; register int quadsize; TARGETUPDATE_START(); quadsize = len & 0xFFFFFFFC; for ( n=0; n #include "profile_tm.h" #ifdef FIXED_POINT #define OVERRIDE_LSP_INTERPOLATE void lsp_interpolate(Int16 *old_lsp, Int16 *new_lsp, Int16 *interp_lsp, int len, int subframe, int nb_subframes) { register int tmp = DIV32_16(SHL32(EXTEND32(1 + subframe),14),nb_subframes); register int tmp2 = 16384-tmp; register int in_0, in_1, factor, out_1, out_2, olsp, nlsp, ilsp; register int i; TMDEBUG_ALIGNMEM(old_lsp); TMDEBUG_ALIGNMEM(new_lsp); TMDEBUG_ALIGNMEM(interp_lsp); LSPINTERPOLATE_START(); factor = pack16lsb(tmp,tmp2); len >>= 1; for ( i=0 ; i> 14, out_1 >> 14); st32d(i << 2, interp_lsp, ilsp); } LSPINTERPOLATE_STOP(); } #define OVERRIDE_CHEB_POLY_EVA static inline Int32 cheb_poly_eva(Int16 *coef, Int16 x, int m, char *stack) { register int c10, c32, c54; register int sum, b0, f0, f1, f2, f3; register int xx, f32, f10; CHEBPOLYEVA_START(); xx = sex16(x); b0 = iclipi(xx,16383); #if 0 c10 = ld32(coef); c32 = ld32x(coef,1); c54 = ld32x(coef,2); #else c10 = pack16lsb(coef[1],coef[0]); c32 = pack16lsb(coef[3],coef[2]); c54 = pack16lsb(coef[5],coef[4]); #endif f0 = ((xx * b0) >> 13) - 16384; f1 = ((xx * f0) >> 13) - b0; f2 = ((xx * f1) >> 13) - f0; if ( m == 4 ) { sum = sex16(c54); f32 = pack16lsb(xx,f0); f10 = pack16lsb(f1,f2); } else { sum = asri(16,c54); sum += ((sex16(c54) * xx) + 8192) >> 14; f3 = ((xx * f2) >> 13) - f1; f32 = pack16lsb(f0,f1); f10 = pack16lsb(f2,f3); } sum += (ifir16(c32,f32) + 8192) >> 14; sum += (ifir16(c10,f10) + 8192) >> 14; #ifndef REMARK_ON (void)stack; #endif CHEBPOLYEVA_STOP(); return sum; } #define OVERRIDE_LSP_ENFORCE_MARGIN void lsp_enforce_margin(Int16 *lsp, int len, Int16 margin) { register int i; register int m = margin; register int m2 = 25736-margin; register int lsp0, lsp1, lsp2; TMDEBUG_ALIGNMEM(lsp); LSPENFORCEMARGIN_START(); lsp0 = ld32(lsp); lsp1 = asri(16,lsp0); lsp0 = sex16(lsp0); lsp2 = lsp[len-1]; if ( lsp0 < m ) { lsp0 = m; lsp[0] = m; } if ( lsp2 > m2 ) { lsp2 = m2; lsp[len-1] = m2; } for ( i=1 ; i m2 ) { lsp1 = (lsp1 >> 1) + (m2 >> 1); lsp[i] = lsp1; } lsp0 = lsp1; lsp1 = lsp2; } LSPENFORCEMARGIN_STOP(); } #define OVERRIDE_LSP_TO_LPC void lsp_to_lpc(Int16 *freq, Int16 *ak,int lpcrdr, char *stack) { VARDECL(Int16 *freqn); VARDECL(int **xp); VARDECL(int *xpmem); VARDECL(int **xq); VARDECL(int *xqmem); register int i, j, k; register int xout1,xout2,xin; register int m; LSPTOLPC_START(); m = lpcrdr>>1; /* Reconstruct P(z) and Q(z) by cascading second order polynomials in form 1 - 2cos(w)z(-1) + z(-2), where w is the LSP frequency. In the time domain this is: y(n) = x(n) - 2cos(w)x(n-1) + x(n-2) This is what the ALLOCS below are trying to do: int xp[m+1][lpcrdr+1+2]; // P matrix in QIMP int xq[m+1][lpcrdr+1+2]; // Q matrix in QIMP These matrices store the output of each stage on each row. The final (m-th) row has the output of the final (m-th) cascaded 2nd order filter. The first row is the impulse input to the system (not written as it is known). The version below takes advantage of the fact that a lot of the outputs are zero or known, for example if we put an inpulse into the first section the "clock" it 10 times only the first 3 outputs samples are non-zero (it's an FIR filter). */ ALLOC(xp, (m+1), int*); ALLOC(xpmem, (m+1)*(lpcrdr+1+2), int); ALLOC(xq, (m+1), int*); ALLOC(xqmem, (m+1)*(lpcrdr+1+2), int); for ( i=0; i<=m; i++ ) { xp[i] = xpmem + i*(lpcrdr+1+2); xq[i] = xqmem + i*(lpcrdr+1+2); } /* work out 2cos terms in Q14 */ ALLOC(freqn, lpcrdr, Int16); for ( j=0,k=0 ; j #include "profile_tm.h" #ifdef FIXED_POINT #define OVERRIDE_COMPUTE_QUANT_WEIGHTS static void compute_quant_weights(Int16 *qlsp, Int16 *qw, int order) { int qlspi, qlspii; int w1, w2; int i; TMDEBUG_ALIGNMEM(qlsp); TMDEBUG_ALIGNMEM(qw); COMPUTEQUANTWEIGHTS_START(); --order; qlspi = (int)qlsp[0]; qlspii = (int)qlsp[1]; w1 = qlspi; w2 = qlspii - qlspi; qw[0] = 81920 / (300 + imin(w1,w2)); for ( i=1 ; i>1); cb0 = pack16lsb((int)ptr[1], (int)ptr[0]); cb0 = dualasl(cb0,five); cb0 = dspidualsub(xx,cb0); dt0 += ifir16(cb0,cb0); cb1 = pack16lsb((int)ptr[nbDim+1], (int)ptr[nbDim]); cb1 = dualasl(cb1,five); cb1 = dspidualsub(xx,cb1); dt1 += ifir16(cb1, cb1); cb2 = pack16lsb((int)ptr[nbDim*2+1], (int)ptr[nbDim*2]); cb2 = dualasl(cb2,five); cb2 = dspidualsub(xx,cb2); dt2 += ifir16(cb2, cb2); cb3 = pack16lsb((int)ptr[nbDim*3+1], (int)ptr[nbDim*3]); cb3 = dualasl(cb3,five); cb3 = dspidualsub(xx,cb3); dt3 += ifir16(cb3, cb3); ptr += 2; } if ( dt0>1); cb0 = pack16lsb((int)ptr[j+1], (int)ptr[j]); cb0 = dualasl(cb0,five); dt0 = dspidualsub(xx,cb0); st32d(j<<1, x, dt0); } LSPQUANT_STOP(); return best_id; } #define OVERRIDE_LSP_WEIGHT_QUANT static int lsp_weight_quant(Int16 *x, Int16 *weight, const signed char *cdbk, int nbVec, int nbDim) { register int best_dist=VERY_LARGE32; register int best_id=0; register int i, j; register int dt1, dt2, dt3, dt4; register int cb1, cb2, cb3, cb4, wt, xx; register int ptr_inc = nbDim * 3; const signed char *ptr; LSPWEIGHTQUANT_START(); for ( i=0, ptr=cdbk ; i> 15)) + ((wt * (cb1 & 0x7fff)) >> 15); dt2 += (wt * (cb2 >> 15)) + ((wt * (cb2 & 0x7fff)) >> 15); dt3 += (wt * (cb3 >> 15)) + ((wt * (cb3 & 0x7fff)) >> 15); dt4 += (wt * (cb4 >> 15)) + ((wt * (cb4 & 0x7fff)) >> 15); } if ( dt1 tmp2 ? tmp1 : tmp2; }*/ for (i=0;isubstate->nfft; ncfft2 = ncfft >> 1; tmpbuf = (int*)st->tmpbuf; twiddles = (int*)st->super_twiddles; TMDEBUG_ALIGNMEM(timedata); TMDEBUG_ALIGNMEM(freqdata); TMDEBUG_ALIGNMEM(tmpbuf); TMDEBUG_ALIGNMEM(twiddles); kiss_fft(st->substate , (const kiss_fft_cpx*)timedata, st->tmpbuf); { register int tdcr, tdci; tdcr = sround(st->tmpbuf[0].r * (32767/2)); tdci = sround(st->tmpbuf[0].i * (32767/2)); freqdata[0].r = tdcr + tdci; freqdata[ncfft].r = tdcr - tdci; freqdata[ncfft].i = freqdata[0].i = 0; } for ( k=1 ; k <= ncfft2 ; ++k ) { register int fpk, fpnk, i, tw, f1k, f2k; register int fq1, fq2; i = ncfft-k; fpk = ld32x(tmpbuf,k); tw = ld32x(twiddles,k); fpnk = ld32x(tmpbuf,i); TM_DIV(fpk, fpk, 2); TM_NDIV(fpnk,fpnk,2); TM_ADD( f1k, fpk , fpnk ); TM_SUB( f2k, fpk , fpnk ); TM_MUL( tw , f2k, tw ); TM_ADD( fq1, f1k, tw ); TM_SHR( fq1, fq1, 1 ); TM_SUB( fq2, f1k, tw ); TM_NEGMSB( fq2, fq2 ); TM_SHR( fq2, fq2, 1 ); st32d( k<<2, freqdata, fq1 ); st32d( i<<2, freqdata, fq2 ); } } #define OVERRIDE_KISS_FFTRI void kiss_fftri(kiss_fftr_cfg st,const kiss_fft_cpx * restrict freqdata,kiss_fft_scalar * restrict timedata) { register int k, ncfft, ncfft2; register int * restrict tmpbuf; register int * restrict twiddles; ncfft = st->substate->nfft; ncfft2 = ncfft >> 1; tmpbuf = (int*)st->tmpbuf; twiddles = (int*)st->super_twiddles; TMDEBUG_ALIGNMEM(freqdata); TMDEBUG_ALIGNMEM(timedata); TMDEBUG_ALIGNMEM(tmpbuf); TMDEBUG_ALIGNMEM(twiddles); { register int fqr, fqnr; fqr = freqdata[0].r; fqnr = freqdata[ncfft].r; st->tmpbuf[0].r = fqr + fqnr; st->tmpbuf[0].i = fqr - fqnr; } for ( k=1 ; k <= ncfft2 ; ++k ) { register int fk, fnkc, i, tw, fek, fok, tmp; register int tbk, tbn; i = ncfft-k; fk = ld32x(freqdata,k); tw = ld32x(twiddles,k); fnkc = pack16lsb(-freqdata[i].i, freqdata[i].r); TM_ADD (fek, fk, fnkc); TM_SUB (tmp, fk, fnkc); TM_MUL (fok, tmp, tw ); TM_ADD (tbk, fek, fok); TM_SUB (tbn, fek, fok); TM_NEGMSB(tbn, tbn); st32d(k<<2, tmpbuf, tbk); st32d(i<<2, tmpbuf, tbn); } kiss_fft (st->substate, st->tmpbuf, (kiss_fft_cpx *) timedata); } #else #define OVERRIDE_KISS_FFTR void kiss_fftr(kiss_fftr_cfg st,const kiss_fft_scalar * restrict timedata,kiss_fft_cpx * restrict freqdata) { register kiss_fft_cpx fpnk, fpk, f1k, f2k, twk; register int k, ncfft; register kiss_fft_cpx * restrict tmpbuf, * restrict tw; register float tdcr, tdci; ncfft = st->substate->nfft; tmpbuf= st->tmpbuf; tw = st->super_twiddles; kiss_fft( st->substate , (const kiss_fft_cpx*)timedata, tmpbuf ); tdcr = tmpbuf[0].r; tdci = tmpbuf[0].i; freqdata[0].r = tdcr + tdci; freqdata[ncfft].r = tdcr - tdci; freqdata[ncfft].i = freqdata[0].i = 0; for ( k=1;k <= ncfft/2 ; ++k ) { fpk = tmpbuf[k]; fpnk.r = tmpbuf[ncfft-k].r; fpnk.i = -tmpbuf[ncfft-k].i; C_ADD( f1k, fpk , fpnk ); C_SUB( f2k, fpk , fpnk ); C_MUL( twk, f2k , tw[k]); freqdata[k].r = HALF_OF(f1k.r + twk.r); freqdata[k].i = HALF_OF(f1k.i + twk.i); freqdata[ncfft-k].r = HALF_OF(f1k.r - twk.r); freqdata[ncfft-k].i = HALF_OF(twk.i - f1k.i); } } #define OVERRIDE_KISS_FFTRI void kiss_fftri(kiss_fftr_cfg st,const kiss_fft_cpx * restrict freqdata,kiss_fft_scalar * restrict timedata) { register int k, ncfft; register kiss_fft_cpx * restrict tmpbuf, * restrict tw; ncfft = st->substate->nfft; tmpbuf= st->tmpbuf; tw = st->super_twiddles; tmpbuf[0].r = freqdata[0].r + freqdata[ncfft].r; tmpbuf[0].i = freqdata[0].r - freqdata[ncfft].r; for (k = 1; k <= ncfft / 2; ++k) { register kiss_fft_cpx fk, fnkc, fek, fok, tmp; fk = freqdata[k]; fnkc.r = freqdata[ncfft - k].r; fnkc.i = -freqdata[ncfft - k].i; C_ADD (fek, fk, fnkc); C_SUB (tmp, fk, fnkc); C_MUL (fok,tmp,tw[k]); C_ADD (tmpbuf[k],fek, fok); C_SUB (tmp, fek, fok); tmpbuf[ncfft - k].r = tmp.r; tmpbuf[ncfft - k].i = -tmp.i; } kiss_fft (st->substate, st->tmpbuf, (kiss_fft_cpx *) timedata); } #endif #endif mumble-1.3.4/3rdparty/speex-src/tmv/ltp_tm.h0000664000175000017500000002747114010707304020606 0ustar builderbuilder/* Copyright (C) 2007 Hong Zhiqian */ /** @file ltp_tm.h @author Hong Zhiqian @brief Various compatibility routines for Speex (TriMedia version) */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include "profile_tm.h" #ifdef FIXED_POINT #define OVERRIDE_INNER_PROD Int32 inner_prod(const Int16 * restrict x, const Int16 * restrict y, int len) { register int sum = 0; INNERPROD_START(); if ( (int)x & 0x03 == 0 && (int)y & 0x03 == 0 ) { register int i; len >>= 1; for ( i=0 ; i> 6; x2 = ld32x(x,i+2); y2 = ld32x(x,i+2); x3 = ld32x(x,i+3); y3 = ld32x(x,i+3); sum += (ifir16(x2,y2) + ifir16(x3,y3)) >> 6; } } else { len >>= 3; while( len-- ) { register int x0, x1, x2, x3, y0, y1, y2, y3; x0 = pack16lsb(x[0],x[1]); y0 = pack16lsb(y[0],y[1]); x1 = pack16lsb(x[2],x[3]); y1 = pack16lsb(y[2],y[3]); sum += (ifir16(x0,y0) + ifir16(x1,y1)) >> 6; x2 = pack16lsb(x[4],x[5]); y2 = pack16lsb(y[4],y[5]); x3 = pack16lsb(x[6],x[7]); y3 = pack16lsb(y[6],y[7]); sum += (ifir16(x2,y2) + ifir16(x3,y3)) >> 6; x += 8; y += 8; } } INNERPROD_STOP(); return sum; } #define OVERRIDE_PITCH_XCORR void pitch_xcorr(const Int16 *_x, const Int16 *_y, Int32 *corr, int len, int nb_pitch, char *stack) { register int sum_1, sum_2, sum_3, sum_4; register int y10, y32, y54, y76, y21, y43, y65; register int x10, x32; register int i, j, k, limit; TMDEBUG_ALIGNMEM(_x); TMDEBUG_ALIGNMEM(_y); PITCHXCORR_START(); limit = nb_pitch >> 1; len >>= 1; for (i=0 ; i> 6; sum_3 += (ifir16(x10,y32) + ifir16(x32,y54)) >> 6; y21 = funshift2(y32,y10); y43 = funshift2(y54,y32); y65 = funshift2(y76,y54); sum_2 += (ifir16(x10,y21) + ifir16(x32,y43)) >> 6; sum_4 += (ifir16(x10,y43) + ifir16(x32,y65)) >> 6; y10 = y54; y32 = y76; } k = i << 1; corr[nb_pitch-1-k]=sum_1; corr[nb_pitch-2-k]=sum_2; corr[nb_pitch-3-k]=sum_3; corr[nb_pitch-4-k]=sum_4; } #ifndef REMARK_ON (void)stack; #endif PITCHXCORR_STOP(); } #ifndef ttisim #define OVERRIDE_PITCH_GAIN_SEARCH_3TAP_VQ static int pitch_gain_search_3tap_vq ( const signed char *gain_cdbk, int gain_cdbk_size, Int16 *C16, Int16 max_gain ) { register int pp = 0x00400040, p=64; register int g10, g2, g20, g21, g02, g22, g01; register int cb0, cb1, cb2, cb5432; register int C10, C32, C54, C76, C98, C83, C2; register int acc0, acc1, acc2, acc3, sum, gsum, bsum=-VERY_LARGE32; register int i, best_cdbk=0; register Int16 tmp; TMDEBUG_ALIGNMEM(C16); TMDEBUG_ALIGNMEM(gain_cdbk+2); PITCHGAINSEARCH3TAPVQ_START(); tmp = ild16(gain_cdbk); C98 = ld32x(C16,4); C32 = ld32x(C16,1); C10 = ld32(C16); C54 = ld32x(C16,2); C76 = ld32x(C16,3); cb0 = sex8(tmp); cb1 = sex8(tmp>>8); C83 = funshift2(C98,C32); C2 = sex16(C32); gain_cdbk += 2; #if (TM_UNROLL && TM_UNROLL_PITCHGAINSEARCH3TAPVQ > 0) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( i=0 ; i>8); sum = 0; g10 = pack16lsb(cb1 + 32, cb0 + 32); g2 = cb2 + 32; g02 = pack16lsb(g10, g2); acc0 = dspidualmul(g10,pp); sum += ifir16(acc0,C10); sum += p * g2 * C2; g22 = pack16lsb(g02, g02); g01 = funshift2(g10, g10); acc1 = dspidualmul(g22, g01); sum -= ifir16(acc1, C54); acc2 = dspidualmul(g10, g10); sum -= ifir16(acc2, C76); g20 = pack16lsb(g2, g10); g21 = funshift2(g2, g10); acc3 = dspidualmul(g20, g21); sum -= ifir16(acc3, C83); if ( sum>bsum && gsum<=max_gain ) { bsum = sum; best_cdbk=i; } cb0 = sex8(cb5432 >> 16); cb1 = asri(24,cb5432); } #if (TM_UNROLL && TM_UNROLL_PITCHGAINSEARCH3TAPVQ > 0) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif PITCHGAINSEARCH3TAPVQ_STOP(); return best_cdbk; } #endif #define OVERRIDE_COMPUTE_PITCH_ERROR #ifndef OVERRIDE_PITCH_GAIN_SEARCH_3TAP_VQ inline Int32 compute_pitch_error(Int16 *C, Int16 *g, Int16 pitch_control) { register int c10, c32, c54, c76, c98, c83; register int g10, g32, g02, g22, g01, g21, g20; register int pp, tmp0, tmp1, tmp2, tmp3; register int sum = 0; COMPUTEPITCHERROR_START(); g10 = ld32(g); g32 = ld32x(g,1); pp = pack16lsb(pitch_control,pitch_control); c10 = ld32(C); c32 = ld32x(C,1); g02 = pack16lsb(g10,g32); g22 = pack16lsb(g32,g32); g01 = funshift2(g10,g10); tmp0 = dspidualmul(g10,pp); sum += ifir16(tmp0, c10); sum += pitch_control * sex16(g32) * sex16(c32); c54 = ld32x(C,2); c76 = ld32x(C,3); c98 = ld32x(C,4); tmp1 = dspidualmul(g22,g01); sum -= ifir16(tmp1, c54); tmp2 = dspidualmul(g10,g10); sum -= ifir16(tmp2,c76); c83 = funshift2(c98,c32); g20 = funshift2(g02,g02); g21 = funshift2(g02,g10); tmp3 = dspidualmul(g20,g21); sum -= ifir16(tmp3,c83); COMPUTEPITCHERROR_STOP(); return sum; } #endif #define OVERRIDE_OPEN_LOOP_NBEST_PITCH void open_loop_nbest_pitch(Int16 *sw, int start, int end, int len, int *pitch, Int16 *gain, int N, char *stack) { VARDECL(int *best_score); VARDECL(int *best_ener); VARDECL(Int32 *corr); VARDECL(Int16 *corr16); VARDECL(Int16 *ener16); register int i, j, k, l, N4, N2; register int _sw10, _sw32, _s0, _s2, limit; register int *energy; register int cshift=0, eshift=0; register int scaledown = 0; register int e0, _energy0; ALLOC(corr16, end-start+1, Int16); ALLOC(ener16, end-start+1, Int16); ALLOC(corr, end-start+1, Int32); ALLOC(best_score, N, int); ALLOC(best_ener, N, int); energy = corr; N4 = N << 2; N2 = N >> 1; TMDEBUG_ALIGNMEM(sw); TMDEBUG_ALIGNMEM(pitch); TMDEBUG_ALIGNMEM(gain); TMDEBUG_ALIGNMEM(best_score); TMDEBUG_ALIGNMEM(best_ener); TMDEBUG_ALIGNMEM(corr16); TMDEBUG_ALIGNMEM(ener16); OPENLOOPNBESTPITCH_START(); for ( i=0 ; i> 6)) - ((_s2 * _s2) >> 6); _energy0 = imax(0,_energy1); energy[i] = _energy0; __sw10 = ld32x(sw,j); __sw32 = ld32x(sw,k); __s0 = asri(16,__sw10); __s2 = asri(16,__sw32); _energy1 = (_energy0 + ((__s0 * __s0) >> 6)) - ((__s2 * __s2) >> 6); _energy0 = imax(0,_energy1); energy[i+1] = _energy0; _sw10 = __sw10; _sw32 = __sw32; } _s0 = sex16(_sw10); _s2 = sex16(_sw32); _energy0 = imax(0,(_energy0 + ((_s0 * _s0) >> 6)) - ((_s2 * _s2) >> 6)); energy[i] = _energy0; eshift = normalize16(energy, ener16, 32766, end-start+1); /* In fixed-point, this actually overrites the energy array (aliased to corr) */ pitch_xcorr(sw, sw-end, corr, len, end-start+1, stack); /* Normalize to 180 so we can square it and it still fits in 16 bits */ cshift = normalize16(corr, corr16, 180, end-start+1); /* If we scaled weighted input down, we need to scale it up again (OK, so we've just lost the LSB, who cares?) */ if ( scaledown ) { for ( j=asri(1,-end),k=asli(1,-end) ; j (best_score[N-1] * _e0) ) { best_score[N-1] = _c0; best_ener[N-1] = _e0; pitch[N-1] = i; for( j=0 ; j best_score[j] * _e0 ) { for( k=N-1 ; k>j ; --k ) { best_score[k]=best_score[k-1]; best_ener[k]=best_ener[k-1]; pitch[k]=pitch[k-1]; } best_score[j]=_c0; best_ener[j]=_e0; pitch[j]=i; break; } } } if ( (_c1 * best_ener[N-1]) > (best_score[N-1] * _e1) ) { best_score[N-1] = _c1; best_ener[N-1] = _e1; pitch[N-1] = i+1; for( j=0 ; j best_score[j] * _e1 ) { for( k=N-1 ; k>j ; --k ) { best_score[k]=best_score[k-1]; best_ener[k]=best_ener[k-1]; pitch[k]=pitch[k-1]; } best_score[j]=_c1; best_ener[j]=_e1; pitch[j]=i+1; break; } } } } /* Compute open-loop gain if necessary */ if (gain) { for (j=0;j #include "profile_tm.h" #ifdef FIXED_POINT #define OVERRIDE_FILTERBANK_COMPUTE_BANK32 void filterbank_compute_bank32(FilterBank * restrict bank, spx_word32_t * restrict ps, spx_word32_t * restrict mel) { register int i, j, k, banks, len, zero, s; register int * restrict left; register int * restrict right; register int * restrict bleft; register int * restrict bright; left = (int*)bank->filter_left; right = (int*)bank->filter_right; bleft = (int*)bank->bank_left; bright = (int*)bank->bank_right; TMDEBUG_ALIGNMEM(ps); TMDEBUG_ALIGNMEM(mel); TMDEBUG_ALIGNMEM(left); TMDEBUG_ALIGNMEM(right); TMDEBUG_ALIGNMEM(bleft); TMDEBUG_ALIGNMEM(bright); FILTERBANKCOMPUTEBANK32_START(); banks = bank->nb_banks << 2; zero = 0; len = bank->len; s = (1<<((15))>>1); #if (TM_UNROLL && TM_UNROLL_FILTERBANKCOMPUTEBANK32) #pragma TCS_unroll=2 #pragma TCS_unrollexact=1 #endif for ( i=0 ; i> 15; ps0_lsb = ps0 & 0x00007fff; left0 = sex16(left10); right0 = sex16(right10); _mel += left0 * ps0_msb + ((left0 * ps0_lsb + s ) >> 15); mel[il0]= _mel; _mel = ld32x(mel,ir0); _mel += right0 * ps0_msb + ((right0 * ps0_lsb + s ) >> 15); mel[ir0]= _mel; ps1 = ld32x(ps,j); il1 = ld32x(bleft,j); _mel = ld32x(mel,il1); ir1 = ld32x(bright,j); left1 = asri(16,left10); right1 = asri(16,right10); ps1_msb = ps1 >> 15; ps1_lsb = ps1 & 0x00007fff; _mel += left1 * ps1_msb + ((left1 * ps1_lsb + s ) >> 15); mel[il1]= _mel; _mel = ld32x(mel,ir1); _mel += right1 * ps1_msb + ((right1 * ps1_lsb + s ) >> 15); mel[ir1]= _mel; } #if (TM_UNROLL && TM_UNROLL_FILTERBANKCOMPUTEBANK32) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif FILTERBANKCOMPUTEBANK32_STOP(); } #define OVERRIDE_FILTERBANK_COMPUTE_PSD16 void filterbank_compute_psd16(FilterBank * restrict bank, spx_word16_t * restrict mel, spx_word16_t * restrict ps) { register int i, j, k, len, s; register int * restrict left; register int * restrict right; register int * restrict bleft; register int * restrict bright; left = (int*)bank->filter_left; right = (int*)bank->filter_right; bleft = (int*)bank->bank_left; bright = (int*)bank->bank_right; TMDEBUG_ALIGNMEM(ps); TMDEBUG_ALIGNMEM(mel); TMDEBUG_ALIGNMEM(left); TMDEBUG_ALIGNMEM(right); TMDEBUG_ALIGNMEM(bleft); TMDEBUG_ALIGNMEM(bright); FILTERBANKCOMPUTEPSD16_START(); len = bank->len; s = (1<<((15))>>1); #if (TM_UNROLL && TM_UNROLL_FILTERBANKCOMPUTEPSD16) #pragma TCS_unroll=2 #pragma TCS_unrollexact=1 #endif for ( i=0,j=0,k=0 ; i>= 15; il1 = ld32x(bleft, i+1); ir1 = ld32x(bright,i+1); mell1 = mel[il1]; melr1 = mel[ir1]; mel1 = pack16lsb(mell1, melr1); lr1 = pack16msb(left10, right10); acc1 += ifir16(mel1, lr1); acc1 >>= 15; ps10 = pack16lsb(acc1, acc0); st32d(j, ps, ps10); } #if (TM_UNROLL && TM_UNROLL_FILTERBANKCOMPUTEPSD16) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif FILTERBANKCOMPUTEPSD16_STOP(); } #else #define OVERRIDE_FILTERBANK_COMPUTE_BANK32 void filterbank_compute_bank32(FilterBank * restrict bank, float * restrict ps, float * restrict mel) { register int i, banks, len; register int * restrict bleft, * restrict bright; register float * restrict left, * restrict right; banks = bank->nb_banks; len = bank->len; bleft = bank->bank_left; bright= bank->bank_right; left = bank->filter_left; right = bank->filter_right; FILTERBANKCOMPUTEBANK32_START(); memset(mel, 0, banks * sizeof(float)); #if (TM_UNROLL && TM_UNROLL_FILTERBANKCOMPUTEBANK32) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( i=0 ; ilen; bleft = bank->bank_left; bright= bank->bank_right; left = bank->filter_left; right = bank->filter_right; FILTERBANKCOMPUTEPSD16_START(); #if (TM_UNROLL && TM_UNROLL_FILTERBANKCOMPUTEPSD16) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( i=0 ; i #ifdef FIXED_POINT #undef sround #define sround(x) sex16(((x) + (1<<(FRACBITS-1)) ) >> FRACBITS) #undef MIN #undef MAX #define MIN(a,b) imin(a,b) #define MAX(a,b) imax(a,b) #define TM_MUL(res,a,b) \ { register int a0, a1, b0, b1; \ \ a0 = sex16((a)); \ a1 = asri(16,(a)); \ b0 = sex16((b)); \ b1 = asri(16,(b)); \ (res)= pack16lsb( \ sround(ifir16((a),funshift2((b),(b)))), \ sround(a0*b0-a1*b1)); \ } \ #define TM_ADD(res,a,b) \ { (res)=dspidualadd((a),(b)); \ } \ #define TM_SUB(res,a,b) \ { (res)=dspidualsub((a),(b)); \ } \ #define TM_SHR(res,a,shift) \ { (res)=dualasr((a),(shift)); \ } \ #define TM_DIV(res,c,frac) \ { register int c1, c0; \ \ c1 = asri(16,(c)); \ c0 = sex16((c)); \ (res) = pack16lsb(sround(c1 * (32767/(frac))), sround(c0 * (32767/(frac))));\ } \ #define TM_NEGMSB(res, a) \ { (res) = pack16lsb((ineg(asri(16,(a)))), (a)); \ } \ #else #undef MIN #undef MAX #define MIN(a,b) fmin(a,b) #define MAX(a,b) fmax(a,b) #endif #endif #undef CHECKBUF #define CHECKBUF(buf,nbuf,n) \ { \ if ( nbuf < (size_t)(n) ) { \ speex_free(buf); \ buf = (kiss_fft_cpx*)KISS_FFT_MALLOC(sizeof(kiss_fft_cpx)*(n)); \ nbuf = (size_t)(n); \ } \ } \ #undef C_ADD #define C_ADD( res, a,b) \ { \ CHECK_OVERFLOW_OP((a).r,+,(b).r) \ CHECK_OVERFLOW_OP((a).i,+,(b).i) \ (res).r=(a).r+(b).r; (res).i=(a).i+(b).i; \ } \ #undef C_SUB #define C_SUB( res, a,b) \ { \ CHECK_OVERFLOW_OP((a).r,-,(b).r) \ CHECK_OVERFLOW_OP((a).i,-,(b).i) \ (res).r=(a).r-(b).r; (res).i=(a).i-(b).i; \ } \ #undef C_ADDTO #define C_ADDTO( res , a) \ { \ CHECK_OVERFLOW_OP((res).r,+,(a).r) \ CHECK_OVERFLOW_OP((res).i,+,(a).i) \ (res).r += (a).r; (res).i += (a).i; \ } \ #undef C_SUBFROM #define C_SUBFROM( res, a) \ { \ CHECK_OVERFLOW_OP((res).r,-,(a).r) \ CHECK_OVERFLOW_OP((res).i,-,(a).i) \ (res).r -= (a).r; (res).i -= (a).i; \ } \ #undef kf_cexp #define kf_cexp(x,phase) \ { (x)->r = KISS_FFT_COS(phase); \ (x)->i = KISS_FFT_SIN(phase); } \ #undef kf_cexp2 #define kf_cexp2(x,phase) \ { (x)->r = spx_cos_norm((phase)); \ (x)->i = spx_cos_norm((phase)-32768); } \ #ifdef FIXED_POINT #undef C_MUL #define C_MUL(m,a,b) \ { (m).r = sround( smul((a).r,(b).r) - smul((a).i,(b).i) ); \ (m).i = sround( smul((a).r,(b).i) + smul((a).i,(b).r) ); } \ #undef C_FIXDIV #define C_FIXDIV(c,div) \ { DIVSCALAR( (c).r , div); \ DIVSCALAR( (c).i , div); } \ #undef C_MULBYSCALAR #define C_MULBYSCALAR( c, s ) \ { (c).r = sround( smul( (c).r , s ) ) ; \ (c).i = sround( smul( (c).i , s ) ) ; } \ #else #undef C_MUL #define C_MUL(m,a,b) \ { (m).r = (a).r*(b).r - (a).i*(b).i; \ (m).i = (a).r*(b).i + (a).i*(b).r; } \ #undef C_MULBYSCALAR #define C_MULBYSCALAR( c, s ) \ { (c).r *= (s); \ (c).i *= (s); } \ #endif #endif mumble-1.3.4/3rdparty/speex-src/m4/0000775000175000017500000000000014010707304016635 5ustar builderbuildermumble-1.3.4/3rdparty/speex-src/m4/pkg.m40000664000175000017500000002306014010707304017661 0ustar builderbuilder# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # serial 1 (pkg-config-0.24) # # Copyright © 2004 Scott James Remnant . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # PKG_PROG_PKG_CONFIG([MIN-VERSION]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])# PKG_PROG_PKG_CONFIG # PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # # Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) # only at the first occurence in configure.ac, so if the first place # it's called might be skipped (such as if it is within an "if", you # have to call PKG_CHECK_EXISTS manually # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])# _PKG_CONFIG # _PKG_SHORT_ERRORS_SUPPORTED # ----------------------------- AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])# _PKG_SHORT_ERRORS_SUPPORTED # PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], # [ACTION-IF-NOT-FOUND]) # # # Note that if there is a possibility the first call to # PKG_CHECK_MODULES might not happen, you should be sure to include an # explicit call to PKG_PROG_PKG_CONFIG in your configure.ac # # # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])# PKG_CHECK_MODULES # PKG_INSTALLDIR(DIRECTORY) # ------------------------- # Substitutes the variable pkgconfigdir as the location where a module # should install pkg-config .pc files. By default the directory is # $libdir/pkgconfig, but the default can be changed by passing # DIRECTORY. The user can override through the --with-pkgconfigdir # parameter. AC_DEFUN([PKG_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([pkgconfigdir], [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, [with_pkgconfigdir=]pkg_default) AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ]) dnl PKG_INSTALLDIR # PKG_NOARCH_INSTALLDIR(DIRECTORY) # ------------------------- # Substitutes the variable noarch_pkgconfigdir as the location where a # module should install arch-independent pkg-config .pc files. By # default the directory is $datadir/pkgconfig, but the default can be # changed by passing DIRECTORY. The user can override through the # --with-noarch-pkgconfigdir parameter. AC_DEFUN([PKG_NOARCH_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([noarch-pkgconfigdir], [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, [with_noarch_pkgconfigdir=]pkg_default) AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ]) dnl PKG_NOARCH_INSTALLDIR # PKG_WITH_MODULES(VARIABLE-PREFIX, MODULES, # [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND], # [DESCRIPTION], [DEFAULT]) # # Prepare a "--with-" configure option using the lowercase [VARIABLE-PREFIX] # name, merging the behaviour of AC_ARG_WITH and PKG_CHECK_MODULES in a single # macro # # -------------------------------------------------------------- AC_DEFUN([PKG_WITH_MODULES], [ m4_pushdef([with_arg], m4_tolower([$1])) m4_pushdef([description], [m4_default([$5], [build with ]with_arg[ support])]) m4_pushdef([def_arg], [m4_default([$6], [auto])]) m4_pushdef([def_action_if_found], [AS_TR_SH([with_]with_arg)=yes]) m4_pushdef([def_action_if_not_found], [AS_TR_SH([with_]with_arg)=no]) m4_case(def_arg, [yes],[m4_pushdef([with_without], [--without-]with_arg)], [m4_pushdef([with_without],[--with-]with_arg)]) AC_ARG_WITH(with_arg, AS_HELP_STRING(with_without, description[ @<:@default=]def_arg[@:>@]),, [AS_TR_SH([with_]with_arg)=def_arg]) AS_CASE([$AS_TR_SH([with_]with_arg)], [yes],[PKG_CHECK_MODULES([$1],[$2],$3,$4)], [auto],[PKG_CHECK_MODULES([$1],[$2], [m4_n([def_action_if_found]) $3], [m4_n([def_action_if_not_found]) $4])]) m4_popdef([with_arg]) m4_popdef([description]) m4_popdef([def_arg]) ]) dnl PKG_WITH_MODULES # PKG_HAVE_WITH_MODULES(VARIABLE-PREFIX, MODULES, # [DESCRIPTION], [DEFAULT]) # # Convenience macro to trigger AM_CONDITIONAL after # PKG_WITH_MODULES check. # # HAVE_[VARIABLE-PREFIX] is exported as make variable. # # -------------------------------------------------------------- AC_DEFUN([PKG_HAVE_WITH_MODULES], [ PKG_WITH_MODULES([$1],[$2],,,[$3],[$4]) AM_CONDITIONAL([HAVE_][$1], [test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"]) ]) # PKG_HAVE_DEFINE_WITH_MODULES(VARIABLE-PREFIX, MODULES, # [DESCRIPTION], [DEFAULT]) # # Convenience macro to run AM_CONDITIONAL and AC_DEFINE after # PKG_WITH_MODULES check. # # HAVE_[VARIABLE-PREFIX] is exported as make and preprocessor variable. # # -------------------------------------------------------------- AC_DEFUN([PKG_HAVE_DEFINE_WITH_MODULES], [ PKG_HAVE_WITH_MODULES([$1],[$2],[$3],[$4]) AS_IF([test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"], [AC_DEFINE([HAVE_][$1], 1, [Enable ]m4_tolower([$1])[ support])]) ]) mumble-1.3.4/3rdparty/speex-src/speex.m40000664000175000017500000000717014010707304017710 0ustar builderbuilder# Configure paths for libspeex # Jean-Marc Valin # Shamelessly stolen from: # Jack Moffitt 10-21-2000 # Shamelessly stolen from Owen Taylor and Manish Singh dnl XIPH_PATH_SPEEX([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) dnl Test for libspeex, and define SPEEX_CFLAGS and SPEEX_LIBS dnl AC_DEFUN([XIPH_PATH_SPEEX], [dnl dnl Get the cflags and libraries dnl AC_ARG_WITH(speex,[ --with-speex=PFX Prefix where libspeex is installed (optional)], speex_prefix="$withval", speex_prefix="") AC_ARG_WITH(speex-libraries,[ --with-speex-libraries=DIR Directory where libspeex library is installed (optional)], speex_libraries="$withval", speex_libraries="") AC_ARG_WITH(speex-includes,[ --with-speex-includes=DIR Directory where libspeex header files are installed (optional)], speex_includes="$withval", speex_includes="") AC_ARG_ENABLE(speextest, [ --disable-speextest Do not try to compile and run a test Speex program],, enable_speextest=yes) if test "x$speex_libraries" != "x" ; then SPEEX_LIBS="-L$speex_libraries" elif test "x$speex_prefix" != "x" ; then SPEEX_LIBS="-L$speex_prefix/lib" elif test "x$prefix" != "xNONE" ; then SPEEX_LIBS="-L$prefix/lib" fi SPEEX_LIBS="$SPEEX_LIBS -lspeex" if test "x$speex_includes" != "x" ; then SPEEX_CFLAGS="-I$speex_includes" elif test "x$speex_prefix" != "x" ; then SPEEX_CFLAGS="-I$speex_prefix/include" elif test "x$prefix" != "xNONE"; then SPEEX_CFLAGS="-I$prefix/include" fi AC_MSG_CHECKING(for Speex) no_speex="" if test "x$enable_speextest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $SPEEX_CFLAGS" LIBS="$LIBS $SPEEX_LIBS" dnl dnl Now check if the installed Speex is sufficiently new. dnl rm -f conf.speextest AC_TRY_RUN([ #include #include #include #include int main () { system("touch conf.speextest"); return 0; } ],, no_speex=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi if test "x$no_speex" = "x" ; then AC_MSG_RESULT(yes) ifelse([$1], , :, [$1]) else AC_MSG_RESULT(no) if test -f conf.speextest ; then : else echo "*** Could not run Speex test program, checking why..." CFLAGS="$CFLAGS $SPEEX_CFLAGS" LIBS="$LIBS $SPEEX_LIBS" AC_TRY_LINK([ #include #include ], [ return 0; ], [ echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding Speex or finding the wrong" echo "*** version of Speex. If it is not finding Speex, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], [ echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means Speex was incorrectly installed" echo "*** or that you have moved Speex since it was installed." ]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi SPEEX_CFLAGS="" SPEEX_LIBS="" ifelse([$2], , :, [$2]) fi AC_SUBST(SPEEX_CFLAGS) AC_SUBST(SPEEX_LIBS) rm -f conf.speextest ]) mumble-1.3.4/3rdparty/speex-src/README.win320000664000175000017500000000106714010707304020142 0ustar builderbuilderWin32 Specific options In order to enable the following options within Speex, you will need to manually edit the project options for the appropriate VC configuration. These macros can be specified by adding them as "Preprocessor Definitions" under the appropriate Configuration's project options. If you don't know how to do this, please check your Visual C documentation. Feature: Intel Streaming SIMD Extensions - SSE - macro: USE_SSE Fixed point - macro: FIXED_POINT Epic 48 - macro: EPIC_48K Note: USE_SSE and FIXED_POINT are mutually exclusive. mumble-1.3.4/3rdparty/speex-src/win32/0000775000175000017500000000000014010707304017257 5ustar builderbuildermumble-1.3.4/3rdparty/speex-src/win32/VS2003/0000775000175000017500000000000014010707304020114 5ustar builderbuildermumble-1.3.4/3rdparty/speex-src/win32/VS2003/libspeex.sln0000664000175000017500000002356714010707304022462 0ustar builderbuilderMicrosoft Visual Studio Solution File, Format Version 8.00 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libspeex", "libspeex\libspeex.vcproj", "{E972C52F-9E85-4D65-B19C-031E511E9DB4}" ProjectSection(ProjectDependencies) = postProject EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "speexdec", "speexdec\speexdec.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}" ProjectSection(ProjectDependencies) = postProject {E972C52F-9E85-4D65-B19C-031E511E9DB4} = {E972C52F-9E85-4D65-B19C-031E511E9DB4} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "speexenc", "speexenc\speexenc.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}" ProjectSection(ProjectDependencies) = postProject {E972C52F-9E85-4D65-B19C-031E511E9DB4} = {E972C52F-9E85-4D65-B19C-031E511E9DB4} {03207781-0D1C-4DB3-A71D-45C608F28DBD} = {03207781-0D1C-4DB3-A71D-45C608F28DBD} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testdenoise", "tests\testdenoise.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}" ProjectSection(ProjectDependencies) = postProject {03207781-0D1C-4DB3-A71D-45C608F28DBD} = {03207781-0D1C-4DB3-A71D-45C608F28DBD} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testecho", "tests\testecho.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}" ProjectSection(ProjectDependencies) = postProject {03207781-0D1C-4DB3-A71D-45C608F28DBD} = {03207781-0D1C-4DB3-A71D-45C608F28DBD} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testenc", "tests\testenc.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}" ProjectSection(ProjectDependencies) = postProject {E972C52F-9E85-4D65-B19C-031E511E9DB4} = {E972C52F-9E85-4D65-B19C-031E511E9DB4} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testenc_uwb", "tests\testenc_uwb.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}" ProjectSection(ProjectDependencies) = postProject {E972C52F-9E85-4D65-B19C-031E511E9DB4} = {E972C52F-9E85-4D65-B19C-031E511E9DB4} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testenc_wb", "tests\testenc_wb.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}" ProjectSection(ProjectDependencies) = postProject {E972C52F-9E85-4D65-B19C-031E511E9DB4} = {E972C52F-9E85-4D65-B19C-031E511E9DB4} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testresample", "tests\testresample.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}" ProjectSection(ProjectDependencies) = postProject {03207781-0D1C-4DB3-A71D-45C608F28DBD} = {03207781-0D1C-4DB3-A71D-45C608F28DBD} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libspeexdsp", "libspeexdsp\libspeexdsp.vcproj", "{03207781-0D1C-4DB3-A71D-45C608F28DBD}" ProjectSection(ProjectDependencies) = postProject EndProjectSection EndProject Global GlobalSection(SolutionConfiguration) = preSolution Debug = Debug Release = Release Release_Dynamic_SSE = Release_Dynamic_SSE Release_Static_SSE = Release_Static_SSE EndGlobalSection GlobalSection(ProjectDependencies) = postSolution EndGlobalSection GlobalSection(ProjectConfiguration) = postSolution {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug.ActiveCfg = Debug|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug.Build.0 = Debug|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release.ActiveCfg = Release|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release.Build.0 = Release|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic_SSE.ActiveCfg = Release_Dynamic_SSE|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic_SSE.Build.0 = Release_Dynamic_SSE|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Static_SSE.ActiveCfg = Release_Static_SSE|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Static_SSE.Build.0 = Release_Static_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic_SSE.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic_SSE.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Static_SSE.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Static_SSE.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic_SSE.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic_SSE.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Static_SSE.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Static_SSE.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Dynamic_SSE.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Dynamic_SSE.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Static_SSE.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Static_SSE.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Dynamic_SSE.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Dynamic_SSE.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Static_SSE.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Static_SSE.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Dynamic_SSE.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Dynamic_SSE.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Static_SSE.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Static_SSE.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Dynamic_SSE.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Dynamic_SSE.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Static_SSE.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Static_SSE.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Dynamic_SSE.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Dynamic_SSE.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Static_SSE.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Static_SSE.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Dynamic_SSE.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Dynamic_SSE.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Static_SSE.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Static_SSE.Build.0 = Release_SSE|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug.ActiveCfg = Debug|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug.Build.0 = Debug|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release.ActiveCfg = Release|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release.Build.0 = Release|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_Dynamic_SSE.ActiveCfg = Release_Dynamic_SSE|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_Dynamic_SSE.Build.0 = Release_Dynamic_SSE|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_Static_SSE.ActiveCfg = Release_Static_SSE|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_Static_SSE.Build.0 = Release_Static_SSE|Win32 EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution EndGlobalSection GlobalSection(ExtensibilityAddIns) = postSolution EndGlobalSection EndGlobal mumble-1.3.4/3rdparty/speex-src/win32/VS2003/libspeex/0000775000175000017500000000000014010707304021727 5ustar builderbuildermumble-1.3.4/3rdparty/speex-src/win32/VS2003/libspeex/libspeex.vcproj0000664000175000017500000002554014010707304024775 0ustar builderbuilder mumble-1.3.4/3rdparty/speex-src/win32/VS2003/libspeex/Makefile.am0000664000175000017500000000034714010707304023767 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies EXTRA_DIST = libspeex.vcproj mumble-1.3.4/3rdparty/speex-src/win32/VS2003/speexenc/0000775000175000017500000000000014010707304021726 5ustar builderbuildermumble-1.3.4/3rdparty/speex-src/win32/VS2003/speexenc/speexenc.vcproj0000664000175000017500000001472214010707304024773 0ustar builderbuilder mumble-1.3.4/3rdparty/speex-src/win32/VS2003/speexenc/Makefile.am0000664000175000017500000000034714010707304023766 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies EXTRA_DIST = speexenc.vcproj mumble-1.3.4/3rdparty/speex-src/win32/VS2003/tests/0000775000175000017500000000000014010707304021256 5ustar builderbuildermumble-1.3.4/3rdparty/speex-src/win32/VS2003/tests/testenc_wb.vcproj0000664000175000017500000001332714010707304024646 0ustar builderbuilder mumble-1.3.4/3rdparty/speex-src/win32/VS2003/tests/testenc_uwb.vcproj0000664000175000017500000001333414010707304025031 0ustar builderbuilder mumble-1.3.4/3rdparty/speex-src/win32/VS2003/tests/Makefile.am0000664000175000017500000000041314010707304023310 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies EXTRA_DIST = testenc.vcproj testenc_uwb.vcproj testenc_wb.vcproj mumble-1.3.4/3rdparty/speex-src/win32/VS2003/tests/testenc.vcproj0000664000175000017500000001331014010707304024146 0ustar builderbuilder mumble-1.3.4/3rdparty/speex-src/win32/VS2003/Makefile.am0000664000175000017500000000041614010707304022151 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies SUBDIRS = libspeex speexenc speexdec tests EXTRA_DIST = libspeex.sln mumble-1.3.4/3rdparty/speex-src/win32/VS2003/speexdec/0000775000175000017500000000000014010707304021714 5ustar builderbuildermumble-1.3.4/3rdparty/speex-src/win32/VS2003/speexdec/Makefile.am0000664000175000017500000000034714010707304023754 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies EXTRA_DIST = speexdec.vcproj mumble-1.3.4/3rdparty/speex-src/win32/VS2003/speexdec/speexdec.vcproj0000664000175000017500000001451414010707304024746 0ustar builderbuilder mumble-1.3.4/3rdparty/speex-src/win32/libspeex/0000775000175000017500000000000014010707304021072 5ustar builderbuildermumble-1.3.4/3rdparty/speex-src/win32/libspeex/libspeex.dsw0000664000175000017500000000220414010707304023422 0ustar builderbuilderMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "libspeex"=.\libspeex.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libspeex_dynamic"=.\libspeex_dynamic.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libspeexdsp"=.\libspeexdsp.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libspeexdsp_dynamic"=.\libspeexdsp_dynamic.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### mumble-1.3.4/3rdparty/speex-src/win32/libspeex/libspeex_dynamic.dsp0000664000175000017500000002143114010707304025122 0ustar builderbuilder# Microsoft Developer Studio Project File - Name="libspeex_dynamic" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libspeex_dynamic - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libspeex_dynamic.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libspeex_dynamic.mak" CFG="libspeex_dynamic - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libspeex_dynamic - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libspeex_dynamic - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libspeex_dynamic - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "libspeex_dynamic___Win32_Release" # PROP BASE Intermediate_Dir "libspeex_dynamic___Win32_Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Dynamic_Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBSPEEX_DYNAMIC_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /GX /O2 /I "../../include" /I "../" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"..\..\bin\libspeex.dll" /implib:"..\..\lib\libspeex.lib" !ELSEIF "$(CFG)" == "libspeex_dynamic - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "libspeex_dynamic___Win32_Debug" # PROP BASE Intermediate_Dir "libspeex_dynamic___Win32_Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Dynamic_Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBSPEEX_DYNAMIC_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "../../include" /I "../" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "HAVE_CONFIG_H" /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /out:"..\..\bin\libspeex.dll" /implib:"..\..\lib\libspeex.lib" /pdbtype:sept !ENDIF # Begin Target # Name "libspeex_dynamic - Win32 Release" # Name "libspeex_dynamic - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\libspeex\bits.c # End Source File # Begin Source File SOURCE=..\..\libspeex\cb_search.c # End Source File # Begin Source File SOURCE=..\..\libspeex\exc_10_16_table.c # End Source File # Begin Source File SOURCE=..\..\libspeex\exc_10_32_table.c # End Source File # Begin Source File SOURCE=..\..\libspeex\exc_20_32_table.c # End Source File # Begin Source File SOURCE=..\..\libspeex\exc_5_256_table.c # End Source File # Begin Source File SOURCE=..\..\libspeex\exc_5_64_table.c # End Source File # Begin Source File SOURCE=..\..\libspeex\exc_8_128_table.c # End Source File # Begin Source File SOURCE=..\..\libspeex\filters.c # End Source File # Begin Source File SOURCE=..\..\libspeex\gain_table.c # End Source File # Begin Source File SOURCE=..\..\libspeex\gain_table_lbr.c # End Source File # Begin Source File SOURCE=..\..\libspeex\hexc_10_32_table.c # End Source File # Begin Source File SOURCE=..\..\libspeex\hexc_table.c # End Source File # Begin Source File SOURCE=..\..\libspeex\high_lsp_tables.c # End Source File # Begin Source File SOURCE=..\..\libspeex\lpc.c # End Source File # Begin Source File SOURCE=..\..\libspeex\lsp.c # End Source File # Begin Source File SOURCE=..\..\libspeex\lsp_tables_nb.c # End Source File # Begin Source File SOURCE=..\..\libspeex\ltp.c # End Source File # Begin Source File SOURCE=..\..\libspeex\modes.c # End Source File # Begin Source File SOURCE=..\..\libspeex\modes_wb.c # End Source File # Begin Source File SOURCE=..\..\libspeex\nb_celp.c # End Source File # Begin Source File SOURCE=..\..\libspeex\quant_lsp.c # End Source File # Begin Source File SOURCE=..\..\libspeex\sb_celp.c # End Source File # Begin Source File SOURCE=..\..\libspeex\speex.c # End Source File # Begin Source File SOURCE=..\..\libspeex\speex_callbacks.c # End Source File # Begin Source File SOURCE=..\..\libspeex\speex_header.c # End Source File # Begin Source File SOURCE=..\..\libspeex\stereo.c # End Source File # Begin Source File SOURCE=..\..\libspeex\vbr.c # End Source File # Begin Source File SOURCE=..\..\libspeex\vq.c # End Source File # Begin Source File SOURCE=..\..\libspeex\window.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\libspeex\arch.h # End Source File # Begin Source File SOURCE=..\..\libspeex\cb_search.h # End Source File # Begin Source File SOURCE=..\..\libspeex\cb_search_sse.h # End Source File # Begin Source File SOURCE=..\..\libspeex\filters.h # End Source File # Begin Source File SOURCE=..\..\libspeex\filters_sse.h # End Source File # Begin Source File SOURCE=..\..\libspeex\fixed_debug.h # End Source File # Begin Source File SOURCE=..\..\libspeex\fixed_generic.h # End Source File # Begin Source File SOURCE=..\..\libspeex\lpc.h # End Source File # Begin Source File SOURCE=..\..\libspeex\lsp.h # End Source File # Begin Source File SOURCE=..\..\libspeex\ltp.h # End Source File # Begin Source File SOURCE=..\..\libspeex\ltp_sse.h # End Source File # Begin Source File SOURCE=..\..\libspeex\math_approx.h # End Source File # Begin Source File SOURCE=..\..\libspeex\modes.h # End Source File # Begin Source File SOURCE=..\..\libspeex\nb_celp.h # End Source File # Begin Source File SOURCE=..\..\libspeex\os_support.h # End Source File # Begin Source File SOURCE=..\..\libspeex\quant_lsp.h # End Source File # Begin Source File SOURCE=..\..\libspeex\sb_celp.h # End Source File # Begin Source File SOURCE=..\..\libspeex\stack_alloc.h # End Source File # Begin Source File SOURCE=..\..\libspeex\vbr.h # End Source File # Begin Source File SOURCE=..\..\libspeex\vq.h # End Source File # Begin Source File SOURCE=..\..\libspeex\vq_sse.h # End Source File # End Group # Begin Group "Public Header Files" # PROP Default_Filter "*.h" # Begin Source File SOURCE=..\..\include\speex\speex.h # End Source File # Begin Source File SOURCE=..\..\include\speex\speex_bits.h # End Source File # Begin Source File SOURCE=..\..\include\speex\speex_callbacks.h # End Source File # Begin Source File SOURCE=..\..\include\speex\speex_header.h # End Source File # Begin Source File SOURCE=..\..\include\speex\speex_stereo.h # End Source File # Begin Source File SOURCE=..\..\include\speex\speex_types.h # End Source File # End Group # Begin Source File SOURCE=..\config.h # End Source File # Begin Source File SOURCE=..\libspeex.def # End Source File # End Target # End Project mumble-1.3.4/3rdparty/speex-src/win32/libspeex/Makefile.am0000664000175000017500000000037414010707304023132 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies EXTRA_DIST = libspeex.dsw libspeex.dsp libspeex_dynamic.dsp mumble-1.3.4/3rdparty/speex-src/win32/libspeex/libspeex.dsp0000664000175000017500000001662114010707304023423 0ustar builderbuilder# Microsoft Developer Studio Project File - Name="libspeex" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Static Library" 0x0104 CFG=libspeex - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libspeex.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libspeex.mak" CFG="libspeex - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libspeex - Win32 Release" (based on "Win32 (x86) Static Library") !MESSAGE "libspeex - Win32 Debug" (based on "Win32 (x86) Static Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "Perforce Project" # PROP Scc_LocalPath "..\.." CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "libspeex - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /nologo /MD /GX- /O2 /Ob2 /I "../../include" /I "../" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_LIB" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE RSC /l 0x809 /d "NDEBUG" # ADD RSC /l 0x809 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo /out:"..\..\lib\libspeex.lib" !ELSEIF "$(CFG)" == "libspeex - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /GX- /Zi /Od /Ob2 /I "../../include" /I "../" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_LIB" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE RSC /l 0x809 /d "_DEBUG" # ADD RSC /l 0x809 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo /out:"..\..\lib\libspeex.lib" !ENDIF # Begin Target # Name "libspeex - Win32 Release" # Name "libspeex - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\libspeex\bits.c # End Source File # Begin Source File SOURCE=..\..\libspeex\cb_search.c # End Source File # Begin Source File SOURCE=..\..\libspeex\exc_10_16_table.c # End Source File # Begin Source File SOURCE=..\..\libspeex\exc_10_32_table.c # End Source File # Begin Source File SOURCE=..\..\libspeex\exc_20_32_table.c # End Source File # Begin Source File SOURCE=..\..\libspeex\exc_5_256_table.c # End Source File # Begin Source File SOURCE=..\..\libspeex\exc_5_64_table.c # End Source File # Begin Source File SOURCE=..\..\libspeex\exc_8_128_table.c # End Source File # Begin Source File SOURCE=..\..\libspeex\filters.c # End Source File # Begin Source File SOURCE=..\..\libspeex\gain_table.c # End Source File # Begin Source File SOURCE=..\..\libspeex\gain_table_lbr.c # End Source File # Begin Source File SOURCE=..\..\libspeex\hexc_10_32_table.c # End Source File # Begin Source File SOURCE=..\..\libspeex\hexc_table.c # End Source File # Begin Source File SOURCE=..\..\libspeex\high_lsp_tables.c # End Source File # Begin Source File SOURCE=..\..\libspeex\lpc.c # End Source File # Begin Source File SOURCE=..\..\libspeex\lsp.c # End Source File # Begin Source File SOURCE=..\..\libspeex\lsp_tables_nb.c # End Source File # Begin Source File SOURCE=..\..\libspeex\ltp.c # End Source File # Begin Source File SOURCE=..\..\libspeex\modes.c # End Source File # Begin Source File SOURCE=..\..\libspeex\modes_wb.c # End Source File # Begin Source File SOURCE=..\..\libspeex\nb_celp.c # End Source File # Begin Source File SOURCE=..\..\libspeex\quant_lsp.c # End Source File # Begin Source File SOURCE=..\..\libspeex\sb_celp.c # End Source File # Begin Source File SOURCE=..\..\libspeex\speex.c # End Source File # Begin Source File SOURCE=..\..\libspeex\speex_callbacks.c # End Source File # Begin Source File SOURCE=..\..\libspeex\speex_header.c # End Source File # Begin Source File SOURCE=..\..\libspeex\stereo.c # End Source File # Begin Source File SOURCE=..\..\libspeex\vbr.c # End Source File # Begin Source File SOURCE=..\..\libspeex\vq.c # End Source File # Begin Source File SOURCE=..\..\libspeex\window.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\libspeex\arch.h # End Source File # Begin Source File SOURCE=..\..\libspeex\cb_search.h # End Source File # Begin Source File SOURCE=..\..\libspeex\cb_search_sse.h # End Source File # Begin Source File SOURCE=..\..\libspeex\filters.h # End Source File # Begin Source File SOURCE=..\..\libspeex\filters_sse.h # End Source File # Begin Source File SOURCE=..\..\libspeex\fixed_debug.h # End Source File # Begin Source File SOURCE=..\..\libspeex\fixed_generic.h # End Source File # Begin Source File SOURCE=..\..\libspeex\lpc.h # End Source File # Begin Source File SOURCE=..\..\libspeex\lsp.h # End Source File # Begin Source File SOURCE=..\..\libspeex\ltp.h # End Source File # Begin Source File SOURCE=..\..\libspeex\ltp_sse.h # End Source File # Begin Source File SOURCE=..\..\libspeex\math_approx.h # End Source File # Begin Source File SOURCE=..\..\libspeex\modes.h # End Source File # Begin Source File SOURCE=..\..\libspeex\nb_celp.h # End Source File # Begin Source File SOURCE=..\..\libspeex\os_support.h # End Source File # Begin Source File SOURCE=..\..\libspeex\quant_lsp.h # End Source File # Begin Source File SOURCE=..\..\libspeex\sb_celp.h # End Source File # Begin Source File SOURCE=..\..\libspeex\stack_alloc.h # End Source File # Begin Source File SOURCE=..\..\libspeex\vbr.h # End Source File # Begin Source File SOURCE=..\..\libspeex\vq.h # End Source File # Begin Source File SOURCE=..\..\libspeex\vq_sse.h # End Source File # End Group # Begin Group "Public Header Files" # PROP Default_Filter "*.h" # Begin Source File SOURCE=..\..\include\speex\speex.h # End Source File # Begin Source File SOURCE=..\..\include\speex\speex_bits.h # End Source File # Begin Source File SOURCE=..\..\include\speex\speex_callbacks.h # End Source File # Begin Source File SOURCE=..\..\include\speex\speex_header.h # End Source File # Begin Source File SOURCE=..\..\include\speex\speex_stereo.h # End Source File # Begin Source File SOURCE=..\..\include\speex\speex_types.h # End Source File # End Group # Begin Source File SOURCE=..\config.h # End Source File # End Target # End Project mumble-1.3.4/3rdparty/speex-src/win32/speexenc/0000775000175000017500000000000014010707304021071 5ustar builderbuildermumble-1.3.4/3rdparty/speex-src/win32/speexenc/speexenc.dsw0000664000175000017500000000263214010707304023425 0ustar builderbuilderMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "libspeex"=..\libspeex\libspeex.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libspeexdsp"=..\libspeex\libspeexdsp.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "ogg_static"=..\..\..\libogg\win32\ogg_static.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "speexenc"=.\speexenc.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libspeex End Project Dependency Begin Project Dependency Project_Dep_Name ogg_static End Project Dependency Begin Project Dependency Project_Dep_Name libspeexdsp End Project Dependency }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### mumble-1.3.4/3rdparty/speex-src/win32/speexenc/Makefile.am0000664000175000017500000000035014010707304023123 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies EXTRA_DIST = speexenc.dsp speexenc.dsw mumble-1.3.4/3rdparty/speex-src/win32/speexenc/speexenc.dsp0000664000175000017500000001071214010707304023414 0ustar builderbuilder# Microsoft Developer Studio Project File - Name="speexenc" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=speexenc - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "speexenc.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "speexenc.mak" CFG="speexenc - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "speexenc - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "speexenc - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "speexenc - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MD /GX /Ox /Ot /Og /Oi /Ob2 /I "../" /I "../../include" /I "../../../libogg/include" /D "HAVE_CONFIG_H" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD BASE RSC /l 0x809 /d "NDEBUG" # ADD RSC /l 0x809 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /nodefaultlib:"LIBCMT.lib" /out:"../../bin/speexenc.exe" !ELSEIF "$(CFG)" == "speexenc - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "../" /I "../../include" /I "../../../libogg/include" /D "HAVE_CONFIG_H" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD BASE RSC /l 0x809 /d "_DEBUG" # ADD RSC /l 0x809 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"../../bin/speexenc.exe" /pdbtype:sept !ENDIF # Begin Target # Name "speexenc - Win32 Release" # Name "speexenc - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\src\getopt.c # End Source File # Begin Source File SOURCE=..\..\src\getopt1.c # End Source File # Begin Source File SOURCE=..\..\src\skeleton.c # End Source File # Begin Source File SOURCE=..\..\src\speexenc.c # End Source File # Begin Source File SOURCE=..\..\src\wav_io.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\src\getopt_win.h # End Source File # Begin Source File SOURCE=..\..\src\skeleton.h # End Source File # Begin Source File SOURCE=..\..\src\wav_io.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project mumble-1.3.4/3rdparty/speex-src/win32/libspeex.def0000664000175000017500000000242414010707304021554 0ustar builderbuilderLIBRARY libspeex EXPORTS ; ; speex.h ; speex_encoder_init speex_encoder_destroy speex_encode speex_encode_int speex_encoder_ctl speex_decoder_init speex_decoder_destroy speex_decode speex_decode_int speex_decoder_ctl speex_mode_query speex_lib_ctl speex_lib_get_mode ; ; speex_bits.h ; speex_bits_init speex_bits_init_buffer speex_bits_set_bit_buffer speex_bits_destroy speex_bits_reset speex_bits_rewind speex_bits_read_from speex_bits_read_whole_bytes speex_bits_write speex_bits_write_whole_bytes speex_bits_pack speex_bits_unpack_signed speex_bits_unpack_unsigned speex_bits_nbytes speex_bits_peek_unsigned speex_bits_peek speex_bits_advance speex_bits_remaining speex_bits_insert_terminator ; ; speex_callbacks.h ; speex_inband_handler speex_std_mode_request_handler speex_std_high_mode_request_handler speex_std_char_handler speex_default_user_handler speex_std_low_mode_request_handler speex_std_vbr_request_handler speex_std_enh_request_handler speex_std_vbr_quality_request_handler ; ; speex_header.h ; speex_init_header speex_header_to_packet speex_packet_to_header ; ; speex_stereo.h ; speex_stereo_state_init speex_stereo_state_reset speex_stereo_state_destroy speex_encode_stereo speex_encode_stereo_int speex_decode_stereo speex_decode_stereo_int speex_std_stereo_request_handler mumble-1.3.4/3rdparty/speex-src/win32/VS2008/0000775000175000017500000000000014010707304020121 5ustar builderbuildermumble-1.3.4/3rdparty/speex-src/win32/VS2008/libspeex.sln0000664000175000017500000012641414010707304022462 0ustar builderbuilderMicrosoft Visual Studio Solution File, Format Version 10.00 # Visual Studio 2008 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libspeex", "libspeex\libspeex.vcproj", "{E972C52F-9E85-4D65-B19C-031E511E9DB4}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "speexdec", "speexdec\speexdec.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}" ProjectSection(ProjectDependencies) = postProject {E972C52F-9E85-4D65-B19C-031E511E9DB4} = {E972C52F-9E85-4D65-B19C-031E511E9DB4} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "speexenc", "speexenc\speexenc.vcproj", "{CD6043D1-D5E7-46D0-854F-00BB1BC308FC}" ProjectSection(ProjectDependencies) = postProject {E972C52F-9E85-4D65-B19C-031E511E9DB4} = {E972C52F-9E85-4D65-B19C-031E511E9DB4} {03207781-0D1C-4DB3-A71D-45C608F28DBD} = {03207781-0D1C-4DB3-A71D-45C608F28DBD} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testdenoise", "tests\testdenoise.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}" ProjectSection(ProjectDependencies) = postProject {03207781-0D1C-4DB3-A71D-45C608F28DBD} = {03207781-0D1C-4DB3-A71D-45C608F28DBD} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testecho", "tests\testecho.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}" ProjectSection(ProjectDependencies) = postProject {03207781-0D1C-4DB3-A71D-45C608F28DBD} = {03207781-0D1C-4DB3-A71D-45C608F28DBD} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testenc", "tests\testenc.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}" ProjectSection(ProjectDependencies) = postProject {E972C52F-9E85-4D65-B19C-031E511E9DB4} = {E972C52F-9E85-4D65-B19C-031E511E9DB4} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testenc_uwb", "tests\testenc_uwb.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}" ProjectSection(ProjectDependencies) = postProject {E972C52F-9E85-4D65-B19C-031E511E9DB4} = {E972C52F-9E85-4D65-B19C-031E511E9DB4} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testenc_wb", "tests\testenc_wb.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}" ProjectSection(ProjectDependencies) = postProject {E972C52F-9E85-4D65-B19C-031E511E9DB4} = {E972C52F-9E85-4D65-B19C-031E511E9DB4} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testresample", "tests\testresample.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}" ProjectSection(ProjectDependencies) = postProject {03207781-0D1C-4DB3-A71D-45C608F28DBD} = {03207781-0D1C-4DB3-A71D-45C608F28DBD} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libspeexdsp", "libspeexdsp\libspeexdsp.vcproj", "{03207781-0D1C-4DB3-A71D-45C608F28DBD}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug_RTL_dll|Win32 = Debug_RTL_dll|Win32 Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) Debug_WM5_PPC_ARM|Win32 = Debug_WM5_PPC_ARM|Win32 Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) Debug|Win32 = Debug|Win32 Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) Release_Dynamic_SSE|Win32 = Release_Dynamic_SSE|Win32 Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) Release_Dynamic|Win32 = Release_Dynamic|Win32 Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) Release_RTL_dll|Win32 = Release_RTL_dll|Win32 Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) Release_SSE|Win32 = Release_SSE|Win32 Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) Release_SSE2|Win32 = Release_SSE2|Win32 Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) Release_Static_SSE|Win32 = Release_Static_SSE|Win32 Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) Release_WM5_PPC_ARM|Win32 = Release_WM5_PPC_ARM|Win32 Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) Release|Win32 = Release|Win32 Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_RTL_dll|Win32.ActiveCfg = Debug_RTL_dll|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_RTL_dll|Win32.Build.0 = Debug_RTL_dll|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug_WM5_PPC_ARM|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_WM5_PPC_ARM|Win32.Build.0 = Debug_WM5_PPC_ARM|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|Win32.ActiveCfg = Debug|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|Win32.Build.0 = Debug|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_Dynamic_SSE|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic_SSE|Win32.Build.0 = Release_Dynamic_SSE|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_Dynamic_SSE|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_Dynamic_SSE|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic|Win32.ActiveCfg = Release_Dynamic|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic|Win32.Build.0 = Release_Dynamic|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_RTL_dll|Win32.ActiveCfg = Release_RTL_dll|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_RTL_dll|Win32.Build.0 = Release_RTL_dll|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE2|Win32.ActiveCfg = Release_SSE2|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE2|Win32.Build.0 = Release_SSE2|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Static_SSE|Win32.ActiveCfg = Release_Static_SSE|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Static_SSE|Win32.Build.0 = Release_Static_SSE|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_Static_SSE|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_Static_SSE|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_WM5_PPC_ARM|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_WM5_PPC_ARM|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|Win32.ActiveCfg = Release|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|Win32.Build.0 = Release|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug_WM5_PPC_ARM|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic|Win32.ActiveCfg = Release_SSE2|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic|Win32.Build.0 = Release_SSE2|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE2|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_RTL_dll|Win32.ActiveCfg = Release_SSE2|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_RTL_dll|Win32.Build.0 = Release_SSE2|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE2|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_SSE2|Win32.ActiveCfg = Release_SSE2|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_SSE2|Win32.Build.0 = Release_SSE2|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE2|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Static_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Static_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE2|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE2|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE2|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Debug_WM5_PPC_ARM|Win32.Build.0 = Debug|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Debug|Win32.ActiveCfg = Debug|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE2|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE2|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_Dynamic|Win32.ActiveCfg = Release_SSE2|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_Dynamic|Win32.Build.0 = Release_SSE2|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE2|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_RTL_dll|Win32.ActiveCfg = Release_SSE2|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_RTL_dll|Win32.Build.0 = Release_SSE2|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE2|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_SSE2|Win32.ActiveCfg = Release_SSE2|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_SSE2|Win32.Build.0 = Release_SSE2|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE2|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_Static_SSE|Win32.ActiveCfg = Release_SSE2|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE2|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE2|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE2|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE2|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release|Win32.ActiveCfg = Release|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug_WM5_PPC_ARM|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Dynamic|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Dynamic|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_RTL_dll|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_RTL_dll|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Static_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Static_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug_WM5_PPC_ARM|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Dynamic|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Dynamic|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_RTL_dll|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_RTL_dll|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Static_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Static_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug_WM5_PPC_ARM|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Dynamic|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Dynamic|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_RTL_dll|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_RTL_dll|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Static_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Static_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug_WM5_PPC_ARM|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Dynamic|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Dynamic|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_RTL_dll|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_RTL_dll|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Static_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Static_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug_WM5_PPC_ARM|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Dynamic|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Dynamic|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_RTL_dll|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_RTL_dll|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Static_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Static_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug_WM5_PPC_ARM|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Dynamic|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Dynamic|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_RTL_dll|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_RTL_dll|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Static_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Static_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug|Win32.ActiveCfg = Debug|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_Dynamic_SSE|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_Dynamic_SSE|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_Dynamic|Win32.ActiveCfg = Release_Dynamic_SSE|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_Dynamic_SSE|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_RTL_dll|Win32.ActiveCfg = Release_Static_SSE|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_Static_SSE|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_SSE|Win32.ActiveCfg = Release_Static_SSE|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_Static_SSE|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_SSE2|Win32.ActiveCfg = Release_Static_SSE|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_Static_SSE|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_Static_SSE|Win32.ActiveCfg = Release_Static_SSE|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_Static_SSE|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_Static_SSE|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_Static_SSE|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release|Win32.ActiveCfg = Release|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal mumble-1.3.4/3rdparty/speex-src/win32/VS2008/libspeex/0000775000175000017500000000000014010707304021734 5ustar builderbuildermumble-1.3.4/3rdparty/speex-src/win32/VS2008/libspeex/libspeex.vcproj0000664000175000017500000011077614010707304025010 0ustar builderbuilder mumble-1.3.4/3rdparty/speex-src/win32/VS2008/libspeex/Makefile.am0000664000175000017500000000034714010707304023774 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies EXTRA_DIST = libspeex.vcproj mumble-1.3.4/3rdparty/speex-src/win32/VS2008/speexenc/0000775000175000017500000000000014010707304021733 5ustar builderbuildermumble-1.3.4/3rdparty/speex-src/win32/VS2008/speexenc/speexenc.vcproj0000664000175000017500000002272014010707304024775 0ustar builderbuilder mumble-1.3.4/3rdparty/speex-src/win32/VS2008/speexenc/Makefile.am0000664000175000017500000000034714010707304023773 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies EXTRA_DIST = speexenc.vcproj mumble-1.3.4/3rdparty/speex-src/win32/VS2008/tests/0000775000175000017500000000000014010707304021263 5ustar builderbuildermumble-1.3.4/3rdparty/speex-src/win32/VS2008/tests/testenc_wb.vcproj0000664000175000017500000001535114010707304024652 0ustar builderbuilder mumble-1.3.4/3rdparty/speex-src/win32/VS2008/tests/testenc_uwb.vcproj0000664000175000017500000001535614010707304025044 0ustar builderbuilder mumble-1.3.4/3rdparty/speex-src/win32/VS2008/tests/Makefile.am0000664000175000017500000000041314010707304023315 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies EXTRA_DIST = testenc.vcproj testenc_uwb.vcproj testenc_wb.vcproj mumble-1.3.4/3rdparty/speex-src/win32/VS2008/tests/testenc.vcproj0000664000175000017500000001533214010707304024161 0ustar builderbuilder mumble-1.3.4/3rdparty/speex-src/win32/VS2008/Makefile.am0000664000175000017500000000041614010707304022156 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies SUBDIRS = libspeex speexenc speexdec tests EXTRA_DIST = libspeex.sln mumble-1.3.4/3rdparty/speex-src/win32/VS2008/speexdec/0000775000175000017500000000000014010707304021721 5ustar builderbuildermumble-1.3.4/3rdparty/speex-src/win32/VS2008/speexdec/Makefile.am0000664000175000017500000000034714010707304023761 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies EXTRA_DIST = speexdec.vcproj mumble-1.3.4/3rdparty/speex-src/win32/VS2008/speexdec/speexdec.vcproj0000664000175000017500000002272014010707304024751 0ustar builderbuilder mumble-1.3.4/3rdparty/speex-src/win32/speex.iss0000664000175000017500000000345614010707304021133 0ustar builderbuilder; Script generated by the Inno Setup Script Wizard. ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! [Setup] AppName=Speex AppVerName=Speex V1.1.6 AppPublisherURL=http://www.speex.org AppSupportURL=http://www.speex.org AppUpdatesURL=http://www.speex.org DefaultDirName={pf}\Speex DefaultGroupName=Speex AllowNoIcons=yes LicenseFile=..\COPYING InfoAfterFile=..\README OutputDir=. OutputBaseFilename=speex_win32_1.1.6_setup ; uncomment the following line if you want your installation to run on NT 3.51 too. ; MinVersion=4,3.51 [Tasks] ;Name: "desktopicon"; Description: "Create a &desktop icon"; GroupDescription: "Additional icons:"; MinVersion: 4,4 [Dirs] Name: "{app}" Name: "{app}\doc" Name: "{app}\html" Name: "{app}\libspeex" Name: "{app}\libspeex\include" [Files] Source: "speexdec\Release\speexdec.exe"; DestDir: "{app}"; Flags: ignoreversion Source: "speexenc\Release\speexenc.exe"; DestDir: "{app}"; Flags: ignoreversion Source: "libspeex\Release\libspeex.lib"; DestDir: "{app}\libspeex"; Flags: ignoreversion Source: "libspeex\Release\libspeex.exp"; DestDir: "{app}\libspeex"; Flags: ignoreversion Source: "libspeex\Release\libspeex.dll"; DestDir: "{app}\libspeex"; Flags: ignoreversion Source: "..\include\speex\speex.h"; DestDir: "{app}\libspeex\include"; Flags: ignoreversion Source: "..\include\speex\speex_bits.h"; DestDir: "{app}\libspeex\include"; Flags: ignoreversion Source: "..\include\speex\speex_callbacks.h"; DestDir: "{app}\libspeex\include"; Flags: ignoreversion Source: "..\include\speex\speex_header.h"; DestDir: "{app}\libspeex\include"; Flags: ignoreversion Source: "..\include\speex\speex_stereo.h"; DestDir: "{app}\libspeex\include"; Flags: ignoreversion Source: "..\doc\manual.pdf"; DestDir: "{app}\doc"; Flags: ignoreversion [Run] mumble-1.3.4/3rdparty/speex-src/win32/VS2005/0000775000175000017500000000000014010707304020116 5ustar builderbuildermumble-1.3.4/3rdparty/speex-src/win32/VS2005/libspeex.sln0000664000175000017500000005043114010707304022452 0ustar builderbuilder Microsoft Visual Studio Solution File, Format Version 9.00 # Visual Studio 2005 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libspeex", "libspeex\libspeex.vcproj", "{E972C52F-9E85-4D65-B19C-031E511E9DB4}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libspeexdsp", "libspeexdsp\libspeexdsp.vcproj", "{E42FDC95-7243-4219-9EA4-ACCE4AB97197}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "speexdec", "speexdec\speexdec.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}" ProjectSection(ProjectDependencies) = postProject {E972C52F-9E85-4D65-B19C-031E511E9DB4} = {E972C52F-9E85-4D65-B19C-031E511E9DB4} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "speexenc", "speexenc\speexenc.vcproj", "{CD6043D1-D5E7-46D0-854F-00BB1BC308FC}" ProjectSection(ProjectDependencies) = postProject {E972C52F-9E85-4D65-B19C-031E511E9DB4} = {E972C52F-9E85-4D65-B19C-031E511E9DB4} {E42FDC95-7243-4219-9EA4-ACCE4AB97197} = {E42FDC95-7243-4219-9EA4-ACCE4AB97197} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testdenoise", "tests\testdenoise.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}" ProjectSection(ProjectDependencies) = postProject {E42FDC95-7243-4219-9EA4-ACCE4AB97197} = {E42FDC95-7243-4219-9EA4-ACCE4AB97197} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testecho", "tests\testecho.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}" ProjectSection(ProjectDependencies) = postProject {E42FDC95-7243-4219-9EA4-ACCE4AB97197} = {E42FDC95-7243-4219-9EA4-ACCE4AB97197} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testenc", "tests\testenc.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}" ProjectSection(ProjectDependencies) = postProject {E972C52F-9E85-4D65-B19C-031E511E9DB4} = {E972C52F-9E85-4D65-B19C-031E511E9DB4} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testenc_uwb", "tests\testenc_uwb.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}" ProjectSection(ProjectDependencies) = postProject {E972C52F-9E85-4D65-B19C-031E511E9DB4} = {E972C52F-9E85-4D65-B19C-031E511E9DB4} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testenc_wb", "tests\testenc_wb.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}" ProjectSection(ProjectDependencies) = postProject {E972C52F-9E85-4D65-B19C-031E511E9DB4} = {E972C52F-9E85-4D65-B19C-031E511E9DB4} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testresample", "tests\testresample.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}" ProjectSection(ProjectDependencies) = postProject {E42FDC95-7243-4219-9EA4-ACCE4AB97197} = {E42FDC95-7243-4219-9EA4-ACCE4AB97197} EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug_RTL_dll|Win32 = Debug_RTL_dll|Win32 Debug_WM5_PPC_ARM|Win32 = Debug_WM5_PPC_ARM|Win32 Debug|Win32 = Debug|Win32 Release_Dynamic_SSE|Win32 = Release_Dynamic_SSE|Win32 Release_Dynamic|Win32 = Release_Dynamic|Win32 Release_RTL_dll|Win32 = Release_RTL_dll|Win32 Release_SSE|Win32 = Release_SSE|Win32 Release_SSE2|Win32 = Release_SSE2|Win32 Release_WM5_PPC_ARM|Win32 = Release_WM5_PPC_ARM|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_RTL_dll|Win32.ActiveCfg = Debug_RTL_dll|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_RTL_dll|Win32.Build.0 = Debug_RTL_dll|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug_WM5_PPC_ARM|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_WM5_PPC_ARM|Win32.Build.0 = Debug_WM5_PPC_ARM|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|Win32.ActiveCfg = Debug|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|Win32.Build.0 = Debug|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_Dynamic_SSE|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic_SSE|Win32.Build.0 = Release_Dynamic_SSE|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic|Win32.ActiveCfg = Release_Dynamic|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic|Win32.Build.0 = Release_Dynamic|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_RTL_dll|Win32.ActiveCfg = Release_RTL_dll|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_RTL_dll|Win32.Build.0 = Release_RTL_dll|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE2|Win32.ActiveCfg = Release_SSE2|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE2|Win32.Build.0 = Release_SSE2|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_WM5_PPC_ARM|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_WM5_PPC_ARM|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|Win32.ActiveCfg = Release|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|Win32.Build.0 = Release|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Debug_RTL_dll|Win32.ActiveCfg = Debug_RTL_dll|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Debug_RTL_dll|Win32.Build.0 = Debug_RTL_dll|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug_WM5_PPC_ARM|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Debug_WM5_PPC_ARM|Win32.Build.0 = Debug_WM5_PPC_ARM|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Debug|Win32.ActiveCfg = Debug|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Debug|Win32.Build.0 = Debug|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_Dynamic_SSE|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release_Dynamic_SSE|Win32.Build.0 = Release_Dynamic_SSE|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release_Dynamic|Win32.ActiveCfg = Release_Dynamic|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release_Dynamic|Win32.Build.0 = Release_Dynamic|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release_RTL_dll|Win32.ActiveCfg = Release_RTL_dll|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release_RTL_dll|Win32.Build.0 = Release_RTL_dll|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release_SSE2|Win32.ActiveCfg = Release_SSE2|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release_SSE2|Win32.Build.0 = Release_SSE2|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release_WM5_PPC_ARM|Win32.Build.0 = Release|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release|Win32.ActiveCfg = Release|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_RTL_dll|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_RTL_dll|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release|Win32.Build.0 = Release|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Debug|Win32.ActiveCfg = Debug|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Debug|Win32.Build.0 = Debug|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_Dynamic|Win32.ActiveCfg = Release|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_Dynamic|Win32.Build.0 = Release|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_RTL_dll|Win32.ActiveCfg = Release|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_RTL_dll|Win32.Build.0 = Release|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release|Win32.ActiveCfg = Release|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Dynamic|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Dynamic|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_RTL_dll|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_RTL_dll|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Dynamic|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Dynamic|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_RTL_dll|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_RTL_dll|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Dynamic|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Dynamic|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_RTL_dll|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_RTL_dll|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Dynamic|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Dynamic|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_RTL_dll|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_RTL_dll|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Dynamic|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Dynamic|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_RTL_dll|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_RTL_dll|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Dynamic|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Dynamic|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_RTL_dll|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_RTL_dll|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal mumble-1.3.4/3rdparty/speex-src/win32/VS2005/libspeex/0000775000175000017500000000000014010707304021731 5ustar builderbuildermumble-1.3.4/3rdparty/speex-src/win32/VS2005/libspeex/libspeex.vcproj0000664000175000017500000011440214010707304024773 0ustar builderbuilder mumble-1.3.4/3rdparty/speex-src/win32/VS2005/libspeex/Makefile.am0000664000175000017500000000034714010707304023771 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies EXTRA_DIST = libspeex.vcproj mumble-1.3.4/3rdparty/speex-src/win32/VS2005/speexenc/0000775000175000017500000000000014010707304021730 5ustar builderbuildermumble-1.3.4/3rdparty/speex-src/win32/VS2005/speexenc/speexenc.vcproj0000664000175000017500000001750314010707304024775 0ustar builderbuilder mumble-1.3.4/3rdparty/speex-src/win32/VS2005/speexenc/Makefile.am0000664000175000017500000000034714010707304023770 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies EXTRA_DIST = speexenc.vcproj mumble-1.3.4/3rdparty/speex-src/win32/VS2005/tests/0000775000175000017500000000000014010707304021260 5ustar builderbuildermumble-1.3.4/3rdparty/speex-src/win32/VS2005/tests/testenc_wb.vcproj0000664000175000017500000001523214010707304024645 0ustar builderbuilder mumble-1.3.4/3rdparty/speex-src/win32/VS2005/tests/testenc_uwb.vcproj0000664000175000017500000001523714010707304025037 0ustar builderbuilder mumble-1.3.4/3rdparty/speex-src/win32/VS2005/tests/Makefile.am0000664000175000017500000000041314010707304023312 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies EXTRA_DIST = testenc.vcproj testenc_uwb.vcproj testenc_wb.vcproj mumble-1.3.4/3rdparty/speex-src/win32/VS2005/tests/testenc.vcproj0000664000175000017500000001521314010707304024154 0ustar builderbuilder mumble-1.3.4/3rdparty/speex-src/win32/VS2005/Makefile.am0000664000175000017500000000041614010707304022153 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies SUBDIRS = libspeex speexenc speexdec tests EXTRA_DIST = libspeex.sln mumble-1.3.4/3rdparty/speex-src/win32/VS2005/speexdec/0000775000175000017500000000000014010707304021716 5ustar builderbuildermumble-1.3.4/3rdparty/speex-src/win32/VS2005/speexdec/Makefile.am0000664000175000017500000000034714010707304023756 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies EXTRA_DIST = speexdec.vcproj mumble-1.3.4/3rdparty/speex-src/win32/VS2005/speexdec/speexdec.vcproj0000664000175000017500000001732214010707304024750 0ustar builderbuilder mumble-1.3.4/3rdparty/speex-src/win32/Makefile.am0000664000175000017500000000046014010707304021313 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies SUBDIRS = libspeex speexenc speexdec VS2003 VS2005 VS2008 EXTRA_DIST = speex.iss config.h libspeex.def mumble-1.3.4/3rdparty/speex-src/win32/speexdec/0000775000175000017500000000000014010707304021057 5ustar builderbuildermumble-1.3.4/3rdparty/speex-src/win32/speexdec/speexdec.dsp0000664000175000017500000001071414010707304023372 0ustar builderbuilder# Microsoft Developer Studio Project File - Name="speexdec" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=speexdec - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "speexdec.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "speexdec.mak" CFG="speexdec - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "speexdec - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "speexdec - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "speexdec - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MD /GX /O2 /I "../../../libogg/include" /I "../../include" /I "../" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "HAVE_CONFIG_H" /YX /FD /c # ADD BASE RSC /l 0x809 /d "NDEBUG" # ADD RSC /l 0x809 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib /nologo /subsystem:console /machine:I386 /nodefaultlib:"LIBCMT.lib" /out:"../../bin/speexdec.exe" !ELSEIF "$(CFG)" == "speexdec - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "../../../libogg/include" /I "../../include" /I "../" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "HAVE_CONFIG_H" /YX /FD /GZ /c # ADD BASE RSC /l 0x809 /d "_DEBUG" # ADD RSC /l 0x809 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib /nologo /subsystem:console /debug /machine:I386 /out:"../../bin/speexdec.exe" /pdbtype:sept !ENDIF # Begin Target # Name "speexdec - Win32 Release" # Name "speexdec - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\src\getopt.c # End Source File # Begin Source File SOURCE=..\..\src\getopt1.c # End Source File # Begin Source File SOURCE=..\..\src\speexdec.c # End Source File # Begin Source File SOURCE=..\..\src\wav_io.c # End Source File # Begin Source File SOURCE=..\..\src\wave_out.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\src\getopt_win.h # End Source File # Begin Source File SOURCE=..\..\src\wav_io.h # End Source File # Begin Source File SOURCE=..\..\src\wave_out.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project mumble-1.3.4/3rdparty/speex-src/win32/speexdec/Makefile.am0000664000175000017500000000035014010707304023111 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies EXTRA_DIST = speexdec.dsp speexdec.dsw mumble-1.3.4/3rdparty/speex-src/win32/speexdec/speexdec.dsw0000664000175000017500000000216114010707304023376 0ustar builderbuilderMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "libspeex"=..\libspeex\libspeex.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "ogg_static"="..\..\..\libogg\win32\ogg_static.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "speexdec"=.\speexdec.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libspeex End Project Dependency Begin Project Dependency Project_Dep_Name ogg_static End Project Dependency }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### mumble-1.3.4/3rdparty/speex-src/win32/config.h0000664000175000017500000000145514010707304020702 0ustar builderbuilder// Microsoft version of 'inline' #define inline __inline // In Visual Studio, _M_IX86_FP=1 means /arch:SSE was used, likewise // _M_IX86_FP=2 means /arch:SSE2 was used. // Also, enable both _USE_SSE and _USE_SSE2 if we're compiling for x86-64 #if _M_IX86_FP >= 1 || defined(_M_X64) #define _USE_SSE #endif #if _M_IX86_FP >= 2 || defined(_M_X64) #define _USE_SSE2 #endif // Visual Studio support alloca(), but it always align variables to 16-bit // boundary, while SSE need 128-bit alignment. So we disable alloca() when // SSE is enabled. #ifndef _USE_SSE # define USE_ALLOCA #endif /* Default to floating point */ #ifndef FIXED_POINT # define FLOATING_POINT # define USE_SMALLFT #else # define USE_KISS_FFT #endif /* We don't support visibility on Win32 */ #define EXPORT mumble-1.3.4/3rdparty/speex-src/speexclient/0000775000175000017500000000000014010707304020640 5ustar builderbuildermumble-1.3.4/3rdparty/speex-src/speexclient/speex_jitter_buffer.h0000664000175000017500000000333014010707304025046 0ustar builderbuilder/* Copyright (C) 2002 Jean-Marc Valin */ /** @file speex_jitter_buffer.h @brief Adaptive jitter buffer for Speex packets only */ #include #include #ifdef __cplusplus extern "C" { #endif /** @defgroup SpeexJitter SpeexJitter: Adaptive jitter buffer specifically for Speex * This is the jitter buffer that reorders UDP/RTP packets and adjusts the buffer size * to maintain good quality and low latency. This is a simplified version that works only * with Speex, but is much easier to use. * @{ */ /** Speex jitter-buffer state. Never use it directly! */ typedef struct SpeexJitter { SpeexBits current_packet; /**< Current Speex packet */ int valid_bits; /**< True if Speex bits are valid */ JitterBuffer *packets; /**< Generic jitter buffer state */ void *dec; /**< Pointer to Speex decoder */ spx_int32_t frame_size; /**< Frame size of Speex decoder */ } SpeexJitter; /** Initialise jitter buffer * * @param jitter State of the Speex jitter buffer * @param decoder Speex decoder to call * @param sampling_rate Sampling rate used by the decoder */ void speex_jitter_init(SpeexJitter *jitter, void *decoder, int sampling_rate); /** Destroy jitter buffer */ void speex_jitter_destroy(SpeexJitter *jitter); /** Put one packet into the jitter buffer */ void speex_jitter_put(SpeexJitter *jitter, char *packet, int len, int timestamp); /** Get one packet from the jitter buffer */ void speex_jitter_get(SpeexJitter *jitter, spx_int16_t *out, int *start_offset); /** Get pointer timestamp of jitter buffer */ int speex_jitter_get_pointer_timestamp(SpeexJitter *jitter); #ifdef __cplusplus } #endif /* @} */ mumble-1.3.4/3rdparty/speex-src/speexclient/README0000664000175000017500000000140014010707304021513 0ustar builderbuilderThis is a VERY SIMPLE Speex VoIP client. It is not a complete VoIP application, isn't compatible with anything else (including probably future versions of itself) and does not support any form of standard protocols. It is intended only as a way to show how to use Speex in a VoIP application. To use it: On Alices machine: % speexclient plughw:0,0 bob.somewhere.net alice_port bob_port On Bob's machine: % speexclient plughw:0,0 alice.somewhere.net bob_port alice_port where bob_port is the UDP port on which bob receives and alice_port is the UDP port on which alice receives. In most cases, the two ports can be the same. Note that the clients do not even know whether they are connected or not. All they do is send/receive the audio to/from a specific port. mumble-1.3.4/3rdparty/speex-src/speexclient/speexclient.c0000664000175000017500000001755414010707304023343 0ustar builderbuilder/*************************************************************************** Copyright (C) 2004-2006 by Jean-Marc Valin Copyright (C) 2006 Commonwealth Scientific and Industrial Research Organisation (CSIRO) Australia Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************************************************************/ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include #include /* close() */ #include /* memset() */ #include "alsa_device.h" #include #include #include #include #include "speex_jitter_buffer.h" #include #define MAX_MSG 1500 #define SAMPLING_RATE 16000 #define FRAME_SIZE 320 int main(int argc, char *argv[]) { int sd, rc, n; int i; struct sockaddr_in cliAddr, remoteAddr; char msg[MAX_MSG]; struct hostent *h; int local_port, remote_port; int nfds; struct pollfd *pfds; SpeexPreprocessState *preprocess; AlsaDevice *audio_dev; int tmp; if (argc != 5) { fprintf(stderr, "wrong options\n"); exit(1); } h = gethostbyname(argv[2]); if(h==NULL) { fprintf(stderr, "%s: unknown host '%s' \n", argv[0], argv[1]); exit(1); } local_port = atoi(argv[3]); remote_port = atoi(argv[4]); printf("%s: sending data to '%s' (IP : %s) \n", argv[0], h->h_name, inet_ntoa(*(struct in_addr *)h->h_addr_list[0])); { remoteAddr.sin_family = h->h_addrtype; memcpy((char *) &remoteAddr.sin_addr.s_addr, h->h_addr_list[0], h->h_length); remoteAddr.sin_port = htons(remote_port); } /* socket creation */ sd=socket(AF_INET, SOCK_DGRAM, 0); if(sd<0) { printf("%s: cannot open socket \n",argv[0]); exit(1); } /* bind any port */ cliAddr.sin_family = AF_INET; cliAddr.sin_addr.s_addr = htonl(INADDR_ANY); cliAddr.sin_port = htons(local_port); rc = bind(sd, (struct sockaddr *) &cliAddr, sizeof(cliAddr)); if(rc<0) { printf("%s: cannot bind port\n", argv[0]); exit(1); } /* Setup audio device */ audio_dev = alsa_device_open(argv[1], SAMPLING_RATE, 1, FRAME_SIZE); /* Setup the encoder and decoder in wideband */ void *enc_state, *dec_state; enc_state = speex_encoder_init(&speex_wb_mode); tmp = 8; speex_encoder_ctl(enc_state, SPEEX_SET_QUALITY, &tmp); tmp = 2; speex_encoder_ctl(enc_state, SPEEX_SET_COMPLEXITY, &tmp); dec_state = speex_decoder_init(&speex_wb_mode); tmp = 1; speex_decoder_ctl(dec_state, SPEEX_SET_ENH, &tmp); SpeexBits enc_bits, dec_bits; speex_bits_init(&enc_bits); speex_bits_init(&dec_bits); struct sched_param param; /*param.sched_priority = 40; */ param.sched_priority = sched_get_priority_min(SCHED_FIFO); if (sched_setscheduler(0,SCHED_FIFO,¶m)) perror("sched_setscheduler"); int send_timestamp = 0; int recv_started=0; /* Setup all file descriptors for poll()ing */ nfds = alsa_device_nfds(audio_dev); pfds = malloc(sizeof(*pfds)*(nfds+1)); alsa_device_getfds(audio_dev, pfds, nfds); pfds[nfds].fd = sd; pfds[nfds].events = POLLIN; /* Setup jitter buffer using decoder */ SpeexJitter jitter; speex_jitter_init(&jitter, dec_state, SAMPLING_RATE); /* Echo canceller with 200 ms tail length */ SpeexEchoState *echo_state = speex_echo_state_init(FRAME_SIZE, 10*FRAME_SIZE); tmp = SAMPLING_RATE; speex_echo_ctl(echo_state, SPEEX_ECHO_SET_SAMPLING_RATE, &tmp); /* Setup preprocessor and associate with echo canceller for residual echo suppression */ preprocess = speex_preprocess_state_init(FRAME_SIZE, SAMPLING_RATE); speex_preprocess_ctl(preprocess, SPEEX_PREPROCESS_SET_ECHO_STATE, echo_state); alsa_device_start(audio_dev); /* Infinite loop on capture, playback and receiving packets */ while (1) { /* Wait for either 1) capture 2) playback 3) socket data */ poll(pfds, nfds+1, -1); /* Received packets */ if (pfds[nfds].revents & POLLIN) { /*fprintf (stderr, "x");*/ n = recv(sd, msg, MAX_MSG, 0); int recv_timestamp = ((int*)msg)[1]; int payload = ((int*)msg)[0]; if ((payload & 0x80000000) == 0) { /* Put content of the packet into the jitter buffer, except for the pseudo-header */ speex_jitter_put(&jitter, msg+8, n-8, recv_timestamp); recv_started = 1; } } /* Ready to play a frame (playback) */ if (alsa_device_playback_ready(audio_dev, pfds, nfds)) { short pcm[FRAME_SIZE]; if (recv_started) { /* Get audio from the jitter buffer */ speex_jitter_get(&jitter, pcm, NULL); } else { for (i=0;i #include struct AlsaDevice_ { char *device_name; int channels; int period; snd_pcm_t *capture_handle; snd_pcm_t *playback_handle; int readN, writeN; struct pollfd *read_fd, *write_fd; }; AlsaDevice *alsa_device_open(char *device_name, unsigned int rate, int channels, int period) { int dir; int err; snd_pcm_hw_params_t *hw_params; snd_pcm_sw_params_t *sw_params; snd_pcm_uframes_t period_size = period; snd_pcm_uframes_t buffer_size = 2*period; static snd_output_t *jcd_out; AlsaDevice *dev = malloc(sizeof(*dev)); if (!dev) return NULL; dev->device_name = malloc(1+strlen(device_name)); if (!dev->device_name) { free(dev); return NULL; } strcpy(dev->device_name, device_name); dev->channels = channels; dev->period = period; err = snd_output_stdio_attach(&jcd_out, stdout, 0); if ((err = snd_pcm_open (&dev->capture_handle, dev->device_name, SND_PCM_STREAM_CAPTURE, 0)) < 0) { fprintf (stderr, "cannot open audio device %s (%s)\n", dev->device_name, snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params_malloc (&hw_params)) < 0) { fprintf (stderr, "cannot allocate hardware parameter structure (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params_any (dev->capture_handle, hw_params)) < 0) { fprintf (stderr, "cannot initialize hardware parameter structure (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params_set_access (dev->capture_handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) { fprintf (stderr, "cannot set access type (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params_set_format (dev->capture_handle, hw_params, SND_PCM_FORMAT_S16_LE)) < 0) { fprintf (stderr, "cannot set sample format (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params_set_rate_near (dev->capture_handle, hw_params, &rate, 0)) < 0) { fprintf (stderr, "cannot set sample rate (%s)\n", snd_strerror (err)); assert(0); } /*fprintf (stderr, "rate = %d\n", rate);*/ if ((err = snd_pcm_hw_params_set_channels (dev->capture_handle, hw_params, channels)) < 0) { fprintf (stderr, "cannot set channel count (%s)\n", snd_strerror (err)); assert(0); } period_size = period; dir = 0; if ((err = snd_pcm_hw_params_set_period_size_near (dev->capture_handle, hw_params, &period_size, &dir)) < 0) { fprintf (stderr, "cannot set period size (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params_set_periods (dev->capture_handle, hw_params, 2, 0)) < 0) { fprintf (stderr, "cannot set number of periods (%s)\n", snd_strerror (err)); assert(0); } buffer_size = period_size * 2; dir=0; if ((err = snd_pcm_hw_params_set_buffer_size_near (dev->capture_handle, hw_params, &buffer_size)) < 0) { fprintf (stderr, "cannot set buffer time (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params (dev->capture_handle, hw_params)) < 0) { fprintf (stderr, "cannot set capture parameters (%s)\n", snd_strerror (err)); assert(0); } /*snd_pcm_dump_setup(dev->capture_handle, jcd_out);*/ snd_pcm_hw_params_free (hw_params); if ((err = snd_pcm_sw_params_malloc (&sw_params)) < 0) { fprintf (stderr, "cannot allocate software parameters structure (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_sw_params_current (dev->capture_handle, sw_params)) < 0) { fprintf (stderr, "cannot initialize software parameters structure (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_sw_params_set_avail_min (dev->capture_handle, sw_params, period)) < 0) { fprintf (stderr, "cannot set minimum available count (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_sw_params (dev->capture_handle, sw_params)) < 0) { fprintf (stderr, "cannot set software parameters (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_open (&dev->playback_handle, dev->device_name, SND_PCM_STREAM_PLAYBACK, 0)) < 0) { fprintf (stderr, "cannot open audio device %s (%s)\n", dev->device_name, snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params_malloc (&hw_params)) < 0) { fprintf (stderr, "cannot allocate hardware parameter structure (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params_any (dev->playback_handle, hw_params)) < 0) { fprintf (stderr, "cannot initialize hardware parameter structure (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params_set_access (dev->playback_handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) { fprintf (stderr, "cannot set access type (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params_set_format (dev->playback_handle, hw_params, SND_PCM_FORMAT_S16_LE)) < 0) { fprintf (stderr, "cannot set sample format (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params_set_rate_near (dev->playback_handle, hw_params, &rate, 0)) < 0) { fprintf (stderr, "cannot set sample rate (%s)\n", snd_strerror (err)); assert(0); } /*fprintf (stderr, "rate = %d\n", rate);*/ if ((err = snd_pcm_hw_params_set_channels (dev->playback_handle, hw_params, channels)) < 0) { fprintf (stderr, "cannot set channel count (%s)\n", snd_strerror (err)); assert(0); } period_size = period; dir = 0; if ((err = snd_pcm_hw_params_set_period_size_near (dev->playback_handle, hw_params, &period_size, &dir)) < 0) { fprintf (stderr, "cannot set period size (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params_set_periods (dev->playback_handle, hw_params, 2, 0)) < 0) { fprintf (stderr, "cannot set number of periods (%s)\n", snd_strerror (err)); assert(0); } buffer_size = period_size * 2; dir=0; if ((err = snd_pcm_hw_params_set_buffer_size_near (dev->playback_handle, hw_params, &buffer_size)) < 0) { fprintf (stderr, "cannot set buffer time (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params (dev->playback_handle, hw_params)) < 0) { fprintf (stderr, "cannot set playback parameters (%s)\n", snd_strerror (err)); assert(0); } /*snd_pcm_dump_setup(dev->playback_handle, jcd_out);*/ snd_pcm_hw_params_free (hw_params); if ((err = snd_pcm_sw_params_malloc (&sw_params)) < 0) { fprintf (stderr, "cannot allocate software parameters structure (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_sw_params_current (dev->playback_handle, sw_params)) < 0) { fprintf (stderr, "cannot initialize software parameters structure (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_sw_params_set_avail_min (dev->playback_handle, sw_params, period)) < 0) { fprintf (stderr, "cannot set minimum available count (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_sw_params_set_start_threshold (dev->playback_handle, sw_params, period)) < 0) { fprintf (stderr, "cannot set start mode (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_sw_params (dev->playback_handle, sw_params)) < 0) { fprintf (stderr, "cannot set software parameters (%s)\n", snd_strerror (err)); assert(0); } snd_pcm_link(dev->capture_handle, dev->playback_handle); if ((err = snd_pcm_prepare (dev->capture_handle)) < 0) { fprintf (stderr, "cannot prepare audio interface for use (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_prepare (dev->playback_handle)) < 0) { fprintf (stderr, "cannot prepare audio interface for use (%s)\n", snd_strerror (err)); assert(0); } dev->readN = snd_pcm_poll_descriptors_count(dev->capture_handle); dev->writeN = snd_pcm_poll_descriptors_count(dev->playback_handle); dev->read_fd = malloc(dev->readN*sizeof(*dev->read_fd)); /*printf ("descriptors: %d %d\n", dev->readN, dev->writeN);*/ if (snd_pcm_poll_descriptors(dev->capture_handle, dev->read_fd, dev->readN) != dev->readN) { fprintf (stderr, "cannot obtain capture file descriptors (%s)\n", snd_strerror (err)); assert(0); } dev->write_fd = malloc(dev->writeN*sizeof(*dev->read_fd)); if (snd_pcm_poll_descriptors(dev->playback_handle, dev->write_fd, dev->writeN) != dev->writeN) { fprintf (stderr, "cannot obtain playback file descriptors (%s)\n", snd_strerror (err)); assert(0); } return dev; } void alsa_device_close(AlsaDevice *dev) { snd_pcm_close(dev->capture_handle); snd_pcm_close(dev->playback_handle); free(dev->device_name); free(dev); } int alsa_device_read(AlsaDevice *dev, short *pcm, int len) { int err; /*fprintf (stderr, "-");*/ if ((err = snd_pcm_readi (dev->capture_handle, pcm, len)) != len) { if (err<0) { //fprintf(stderr, "error %d, EPIPE = %d\n", err, EPIPE); if (err == -EPIPE) { fprintf (stderr, "An overrun has occured, reseting capture\n"); } else { fprintf (stderr, "read from audio interface failed (%s)\n", snd_strerror (err)); } if ((err = snd_pcm_prepare (dev->capture_handle)) < 0) { fprintf (stderr, "cannot prepare audio interface for use (%s)\n", snd_strerror (err)); } if ((err = snd_pcm_start (dev->capture_handle)) < 0) { fprintf (stderr, "cannot prepare audio interface for use (%s)\n", snd_strerror (err)); } /*alsa_device_read(dev,pcm,len);*/ } else { fprintf (stderr, "Couldn't read as many samples as I wanted (%d instead of %d)\n", err, len); } return 1; } return 0; } int alsa_device_write(AlsaDevice *dev, const short *pcm, int len) { int err; /*fprintf (stderr, "+");*/ if ((err = snd_pcm_writei (dev->playback_handle, pcm, len)) != len) { if (err<0) { if (err == -EPIPE) { fprintf (stderr, "An underrun has occured, reseting playback, len=%d\n", len); } else { fprintf (stderr, "write to audio interface failed (%s)\n", snd_strerror (err)); } if ((err = snd_pcm_prepare (dev->playback_handle)) < 0) { fprintf (stderr, "cannot prepare audio interface for use (%s)\n", snd_strerror (err)); } } else { fprintf (stderr, "Couldn't write as many samples as I wanted (%d instead of %d)\n", err, len); } /*alsa_device_write(dev,pcm,len);*/ return 1; } return 0; } int alsa_device_capture_ready(AlsaDevice *dev, struct pollfd *pfds, unsigned int nfds) { unsigned short revents=0; int err; if ((err = snd_pcm_poll_descriptors_revents(dev->capture_handle, pfds, dev->readN, &revents)) < 0) { //cerr << "error in snd_pcm_poll_descriptors_revents for capture: " << snd_strerror (err) << endl; //FIXME: This is a kludge fprintf (stderr, "error in alsa_device_capture_ready: %s\n", snd_strerror (err)); return pfds[0].revents & POLLIN; } //cerr << (revents & POLLERR) << endl; return revents & POLLIN; } int alsa_device_playback_ready(AlsaDevice *dev, struct pollfd *pfds, unsigned int nfds) { unsigned short revents=0; int err; if ((err = snd_pcm_poll_descriptors_revents(dev->playback_handle, pfds+dev->readN, dev->writeN, &revents)) < 0) { //cerr << "error in snd_pcm_poll_descriptors_revents for playback: " << snd_strerror (err) << endl; //FIXME: This is a kludge fprintf (stderr, "error in alsa_device_playback_ready: %s\n", snd_strerror (err)); return pfds[1].revents & POLLOUT; } //cerr << (revents & POLLERR) << endl; return revents & POLLOUT; } void alsa_device_start(AlsaDevice *dev) { int i; short pcm[dev->period*dev->channels]; for (i=0;iperiod*dev->channels;i++) pcm[i] = 0; alsa_device_write(dev, pcm, dev->period); alsa_device_write(dev, pcm, dev->period); snd_pcm_start(dev->capture_handle); snd_pcm_start(dev->playback_handle); } int alsa_device_nfds(AlsaDevice *dev) { return dev->writeN+dev->readN; } void alsa_device_getfds(AlsaDevice *dev, struct pollfd *pfds, unsigned int nfds) { int i; assert (nfds >= dev->writeN+dev->readN); for (i=0;ireadN;i++) pfds[i] = dev->read_fd[i]; for (i=0;iwriteN;i++) pfds[i+dev->readN] = dev->write_fd[i]; } mumble-1.3.4/3rdparty/speex-src/speexclient/alsa_device.h0000664000175000017500000000452114010707304023252 0ustar builderbuilder/* Copyright (C) 2004-2006 Jean-Marc Valin Copyright (C) 2006 Commonwealth Scientific and Industrial Research Organisation (CSIRO) Australia Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef ALSA_DEVICE_H #define ALSA_DEVICE_H #include #ifdef __cplusplus extern "C" { #endif struct AlsaDevice_; typedef struct AlsaDevice_ AlsaDevice; AlsaDevice *alsa_device_open(char *device_name, unsigned int rate, int channels, int period); void alsa_device_close(AlsaDevice *dev); int alsa_device_read(AlsaDevice *dev, short *pcm, int len); int alsa_device_write(AlsaDevice *dev, const short *pcm, int len); int alsa_device_capture_ready(AlsaDevice *dev, struct pollfd *pfds, unsigned int nfds); int alsa_device_playback_ready(AlsaDevice *dev, struct pollfd *pfds, unsigned int nfds); void alsa_device_start(AlsaDevice *dev); int alsa_device_nfds(AlsaDevice *dev); void alsa_device_getfds(AlsaDevice *dev, struct pollfd *pfds, unsigned int nfds); #ifdef __cplusplus } #endif #endif mumble-1.3.4/3rdparty/speex-src/speexclient/speex_jitter_buffer.c0000664000175000017500000000443314010707304025046 0ustar builderbuilder#include #include "speex_jitter_buffer.h" #ifndef NULL #define NULL 0 #endif void speex_jitter_init(SpeexJitter *jitter, void *decoder, int sampling_rate) { jitter->dec = decoder; speex_decoder_ctl(decoder, SPEEX_GET_FRAME_SIZE, &jitter->frame_size); jitter->packets = jitter_buffer_init(jitter->frame_size); speex_bits_init(&jitter->current_packet); jitter->valid_bits = 0; } void speex_jitter_destroy(SpeexJitter *jitter) { jitter_buffer_destroy(jitter->packets); speex_bits_destroy(&jitter->current_packet); } void speex_jitter_put(SpeexJitter *jitter, char *packet, int len, int timestamp) { JitterBufferPacket p; p.data = packet; p.len = len; p.timestamp = timestamp; p.span = jitter->frame_size; jitter_buffer_put(jitter->packets, &p); } void speex_jitter_get(SpeexJitter *jitter, spx_int16_t *out, int *current_timestamp) { int i; int ret; spx_int32_t activity; char data[2048]; JitterBufferPacket packet; packet.data = data; packet.len = 2048; if (jitter->valid_bits) { /* Try decoding last received packet */ ret = speex_decode_int(jitter->dec, &jitter->current_packet, out); if (ret == 0) { jitter_buffer_tick(jitter->packets); return; } else { jitter->valid_bits = 0; } } ret = jitter_buffer_get(jitter->packets, &packet, jitter->frame_size, NULL); if (ret != JITTER_BUFFER_OK) { /* No packet found */ /*fprintf (stderr, "lost/late frame\n");*/ /*Packet is late or lost*/ speex_decode_int(jitter->dec, NULL, out); } else { speex_bits_read_from(&jitter->current_packet, packet.data, packet.len); /* Decode packet */ ret = speex_decode_int(jitter->dec, &jitter->current_packet, out); if (ret == 0) { jitter->valid_bits = 1; } else { /* Error while decoding */ for (i=0;iframe_size;i++) out[i]=0; } } speex_decoder_ctl(jitter->dec, SPEEX_GET_ACTIVITY, &activity); if (activity < 30) jitter_buffer_update_delay(jitter->packets, &packet, NULL); jitter_buffer_tick(jitter->packets); } int speex_jitter_get_pointer_timestamp(SpeexJitter *jitter) { return jitter_buffer_get_pointer_timestamp(jitter->packets); } mumble-1.3.4/3rdparty/speex-src/speexclient/compile.sh0000775000175000017500000000027714010707304022635 0ustar builderbuilder#!/bin/sh gcc -Wall -I../include speex_jitter_buffer.c speexclient.c alsa_device.c `pkg-config --cflags speexdsp` -o speexclient -lspeex -lspeexdsp -lasound -lm `pkg-config --libs speexdsp` mumble-1.3.4/3rdparty/speex-src/README.symbian0000664000175000017500000000265514010707304020646 0ustar builderbuilderUsing Speex on Symbian OS Conrad Parker and Colin Ward, CSIRO Australia, July 2004 Introduction ------------ The symbian/ directory contains the following files for Symbian's abuild tool: bld.inf Component definition file speex.mmp Project specification file config.h Configuration options for both emulator and device builds Developing applications for libspeex for Symbian OS --------------------------------------------------- Any references to the statically defined SpeexMode structures must be replaced by a call to a speex_lib_get_mode () for that mode. * References to the statically defined array speex_mode_list[modeID] must be replaced by a call to speex_lib_get_mode (modeID): - mode = speex_mode_list[modeID]; + mode = speex_lib_get_mode (modeID); * References to the statically defined mode structures must be replaced: SpeexMode * mode1, * mode2, * mode3; - mode1 = &speex_nb_mode; + mode1 = speex_lib_get_mode (SPEEX_MODEID_NB); - mode2 = &speex_wb_mode; + mode2 = speex_lib_get_mode (SPEEX_MODEID_WB); - mode3 = &speex_uwb_mode; + mode3 = speex_lib_get_mode (SPEEX_MODEID_UWB); Note that the constants SPEEX_MODEID_NB, SPEEX_MODEID_WB and SPEEX_MODEID_UWB were introduced in libspeex 1.1.6, and are defined in . speex_lib_get_mode() was introduced in libspeex 1.1.7 and is declared in . mumble-1.3.4/3rdparty/speex-src/ChangeLog0000664000175000017500000000144214010707304020070 0ustar builderbuilder2005-09-07 Thomas Vander Stichele * libspeex/cb_search.c: (split_cb_search_shape_sign_N1): add declaration for n, seems like an obvious build fix, slap me down if it's not 2004-02-18 Jean-Marc Valin Patch for compiling with mingw32 sent by j@thing.net 2004-02-18 Jean-Marc Valin Integrated IRIX patch (getopt stuff) from Michael Pruett 2004-02-18 Jean-Marc Valin Changed the Makefile.am so that KDevelop can parse SUBDIRS correctly 2002/03/27 Jean-Marc Valin: Working encoder and decoder for both narrowband and wideband. 2002/02/27 Jean-Marc Valin: Got the basic encoder working as a demo with quantization only on some parameters. mumble-1.3.4/3rdparty/speex-src/doc/0000775000175000017500000000000014010707304017062 5ustar builderbuildermumble-1.3.4/3rdparty/speex-src/doc/ref_shaping.eps0000664000175000017500000006357214010707304022075 0ustar builderbuilder%!PS-Adobe-2.0 EPSF-2.0 %%Title: printout.eps %%Creator: gnuplot 4.0 patchlevel 0 %%CreationDate: Mon Mar 6 17:15:27 2006 %%DocumentFonts: (atend) %%BoundingBox: 50 50 410 302 %%Orientation: Portrait %%EndComments /gnudict 256 dict def gnudict begin /Color true def /Solid false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def /vshift -46 def /dl {10.0 mul} def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def /Rounded false def /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /C {setrgbcolor} bind def /f {rlineto fill} bind def /vpt2 vpt 2 mul def /hpt2 hpt 2 mul def /Lshow { currentpoint stroke M 0 vshift R show } def /Rshow { currentpoint stroke M dup stringwidth pop neg vshift R show } def /Cshow { currentpoint stroke M dup stringwidth pop -2 div vshift R show } def /UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def /DL { Color {setrgbcolor Solid {pop []} if 0 setdash } {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def /BL { stroke userlinewidth 2 mul setlinewidth Rounded { 1 setlinejoin 1 setlinecap } if } def /AL { stroke userlinewidth 2 div setlinewidth Rounded { 1 setlinejoin 1 setlinecap } if } def /UL { dup gnulinewidth mul /userlinewidth exch def dup 1 lt {pop 1} if 10 mul /udl exch def } def /PL { stroke userlinewidth setlinewidth Rounded { 1 setlinejoin 1 setlinecap } if } def /LTw { PL [] 1 setgray } def /LTb { BL [] 0 0 0 DL } def /LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def /LT0 { PL [] 1 0 0 DL } def /LT1 { PL [4 dl 2 dl] 0 1 0 DL } def /LT2 { PL [2 dl 3 dl] 0 0 1 DL } def /LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def /LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def /LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def /LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def /LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def /LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def /Pnt { stroke [] 0 setdash gsave 1 setlinecap M 0 0 V stroke grestore } def /Dia { stroke [] 0 setdash 2 copy vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V closepath stroke Pnt } def /Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V currentpoint stroke M hpt neg vpt neg R hpt2 0 V stroke } def /Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V closepath stroke Pnt } def /Crs { stroke [] 0 setdash exch hpt sub exch vpt add M hpt2 vpt2 neg V currentpoint stroke M hpt2 neg 0 R hpt2 vpt2 V stroke } def /TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V closepath stroke Pnt } def /Star { 2 copy Pls Crs } def /BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V closepath fill } def /TriUF { stroke [] 0 setdash vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V closepath fill } def /TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M hpt neg vpt 1.62 mul V hpt 2 mul 0 V hpt neg vpt -1.62 mul V closepath stroke Pnt } def /TriDF { stroke [] 0 setdash vpt 1.12 mul sub M hpt neg vpt 1.62 mul V hpt 2 mul 0 V hpt neg vpt -1.62 mul V closepath fill} def /DiaF { stroke [] 0 setdash vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V closepath fill } def /Pent { stroke [] 0 setdash 2 copy gsave translate 0 hpt M 4 {72 rotate 0 hpt L} repeat closepath stroke grestore Pnt } def /PentF { stroke [] 0 setdash gsave translate 0 hpt M 4 {72 rotate 0 hpt L} repeat closepath fill grestore } def /Circle { stroke [] 0 setdash 2 copy hpt 0 360 arc stroke Pnt } def /CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def /C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def /C1 { BL [] 0 setdash 2 copy moveto 2 copy vpt 0 90 arc closepath fill vpt 0 360 arc closepath } bind def /C2 { BL [] 0 setdash 2 copy moveto 2 copy vpt 90 180 arc closepath fill vpt 0 360 arc closepath } bind def /C3 { BL [] 0 setdash 2 copy moveto 2 copy vpt 0 180 arc closepath fill vpt 0 360 arc closepath } bind def /C4 { BL [] 0 setdash 2 copy moveto 2 copy vpt 180 270 arc closepath fill vpt 0 360 arc closepath } bind def /C5 { BL [] 0 setdash 2 copy moveto 2 copy vpt 0 90 arc 2 copy moveto 2 copy vpt 180 270 arc closepath fill vpt 0 360 arc } bind def /C6 { BL [] 0 setdash 2 copy moveto 2 copy vpt 90 270 arc closepath fill vpt 0 360 arc closepath } bind def /C7 { BL [] 0 setdash 2 copy moveto 2 copy vpt 0 270 arc closepath fill vpt 0 360 arc closepath } bind def /C8 { BL [] 0 setdash 2 copy moveto 2 copy vpt 270 360 arc closepath fill vpt 0 360 arc closepath } bind def /C9 { BL [] 0 setdash 2 copy moveto 2 copy vpt 270 450 arc closepath fill vpt 0 360 arc closepath } bind def /C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill 2 copy moveto 2 copy vpt 90 180 arc closepath fill vpt 0 360 arc closepath } bind def /C11 { BL [] 0 setdash 2 copy moveto 2 copy vpt 0 180 arc closepath fill 2 copy moveto 2 copy vpt 270 360 arc closepath fill vpt 0 360 arc closepath } bind def /C12 { BL [] 0 setdash 2 copy moveto 2 copy vpt 180 360 arc closepath fill vpt 0 360 arc closepath } bind def /C13 { BL [] 0 setdash 2 copy moveto 2 copy vpt 0 90 arc closepath fill 2 copy moveto 2 copy vpt 180 360 arc closepath fill vpt 0 360 arc closepath } bind def /C14 { BL [] 0 setdash 2 copy moveto 2 copy vpt 90 360 arc closepath fill vpt 0 360 arc } bind def /C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill vpt 0 360 arc closepath } bind def /Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto closepath } bind def /Square { dup Rec } bind def /Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def /S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def /S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def /S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def /S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def /S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def /S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def /S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def /S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill 2 copy vpt Square fill Bsquare } bind def /S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def /S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def /S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def /S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def /S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def /S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill 2 copy vpt Square fill Bsquare } bind def /S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def /S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def /D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def /D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def /D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def /D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def /D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def /D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def /D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def /D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def /D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def /D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def /D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def /D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def /D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def /D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def /D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def /D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def /DiaE { stroke [] 0 setdash vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V closepath stroke } def /BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V closepath stroke } def /TriUE { stroke [] 0 setdash vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V closepath stroke } def /TriDE { stroke [] 0 setdash vpt 1.12 mul sub M hpt neg vpt 1.62 mul V hpt 2 mul 0 V hpt neg vpt -1.62 mul V closepath stroke } def /PentE { stroke [] 0 setdash gsave translate 0 hpt M 4 {72 rotate 0 hpt L} repeat closepath stroke grestore } def /CircE { stroke [] 0 setdash hpt 0 360 arc stroke } def /Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def /DiaW { stroke [] 0 setdash vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V Opaque stroke } def /BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V Opaque stroke } def /TriUW { stroke [] 0 setdash vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V Opaque stroke } def /TriDW { stroke [] 0 setdash vpt 1.12 mul sub M hpt neg vpt 1.62 mul V hpt 2 mul 0 V hpt neg vpt -1.62 mul V Opaque stroke } def /PentW { stroke [] 0 setdash gsave translate 0 hpt M 4 {72 rotate 0 hpt L} repeat Opaque stroke grestore } def /CircW { stroke [] 0 setdash hpt 0 360 arc Opaque stroke } def /BoxFill { gsave Rec 1 setgray fill grestore } def /BoxColFill { gsave Rec /Fillden exch def currentrgbcolor /ColB exch def /ColG exch def /ColR exch def /ColR ColR Fillden mul Fillden sub 1 add def /ColG ColG Fillden mul Fillden sub 1 add def /ColB ColB Fillden mul Fillden sub 1 add def ColR ColG ColB setrgbcolor fill grestore } def % % PostScript Level 1 Pattern Fill routine % Usage: x y w h s a XX PatternFill % x,y = lower left corner of box to be filled % w,h = width and height of box % a = angle in degrees between lines and x-axis % XX = 0/1 for no/yes cross-hatch % /PatternFill { gsave /PFa [ 9 2 roll ] def PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec gsave 1 setgray fill grestore clip currentlinewidth 0.5 mul setlinewidth /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def 0 0 M PFa 5 get rotate PFs -2 div dup translate 0 1 PFs PFa 4 get div 1 add floor cvi { PFa 4 get mul 0 M 0 PFs V } for 0 PFa 6 get ne { 0 1 PFs PFa 4 get div 1 add floor cvi { PFa 4 get mul 0 2 1 roll M PFs 0 V } for } if stroke grestore } def % /Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall currentdict end definefont pop end %%EndProlog gnudict begin gsave 50 50 translate 0.050 0.050 scale 0 setgray newpath (Helvetica) findfont 140 scalefont setfont 1.000 UL LTb 630 420 M 63 0 V 6269 0 R -63 0 V 546 420 M (-40) Rshow 1.000 UL LTb 630 1056 M 63 0 V 6269 0 R -63 0 V -6353 0 R (-30) Rshow 1.000 UL LTb 630 1692 M 63 0 V 6269 0 R -63 0 V -6353 0 R (-20) Rshow 1.000 UL LTb 630 2328 M 63 0 V 6269 0 R -63 0 V -6353 0 R (-10) Rshow 1.000 UL LTb 630 2964 M 63 0 V 6269 0 R -63 0 V -6353 0 R ( 0) Rshow 1.000 UL LTb 630 3600 M 63 0 V 6269 0 R -63 0 V -6353 0 R ( 10) Rshow 1.000 UL LTb 630 4236 M 63 0 V 6269 0 R -63 0 V -6353 0 R ( 20) Rshow 1.000 UL LTb 630 4872 M 63 0 V 6269 0 R -63 0 V -6353 0 R ( 30) Rshow 1.000 UL LTb 630 420 M 0 63 V 0 4389 R 0 -63 V 630 280 M ( 0) Cshow 1.000 UL LTb 1421 420 M 0 63 V 0 4389 R 0 -63 V 0 -4529 R ( 500) Cshow 1.000 UL LTb 2213 420 M 0 63 V 0 4389 R 0 -63 V 0 -4529 R ( 1000) Cshow 1.000 UL LTb 3004 420 M 0 63 V 0 4389 R 0 -63 V 0 -4529 R ( 1500) Cshow 1.000 UL LTb 3796 420 M 0 63 V 0 4389 R 0 -63 V 0 -4529 R ( 2000) Cshow 1.000 UL LTb 4587 420 M 0 63 V 0 4389 R 0 -63 V 0 -4529 R ( 2500) Cshow 1.000 UL LTb 5379 420 M 0 63 V 0 4389 R 0 -63 V 0 -4529 R ( 3000) Cshow 1.000 UL LTb 6170 420 M 0 63 V 0 4389 R 0 -63 V 0 -4529 R ( 3500) Cshow 1.000 UL LTb 6962 420 M 0 63 V 0 4389 R 0 -63 V 0 -4529 R ( 4000) Cshow 1.000 UL LTb 1.000 UL LTb 630 420 M 6332 0 V 0 4452 V -6332 0 V 630 420 L LTb 140 2646 M currentpoint gsave translate 90 rotate 0 0 M (Response \(dB\)) Cshow grestore LTb 3796 70 M (Frequency \(Hz\)) Cshow 1.000 UP 1.000 UL LT0 LTb 6311 4739 M (Speech signal) Rshow LT0 6395 4739 M 399 0 V 630 1817 M 12 -132 V 13 -287 V 12 256 V 12 139 V 13 -127 V 12 -193 V 13 256 V 12 101 V 12 -189 V 13 -269 V 12 429 V 12 152 V 13 -102 V 12 -276 V 13 139 V 12 115 V 12 -205 V 13 -174 V 12 485 V 12 193 V 13 37 V 12 -17 V 12 41 V 13 230 V 12 242 V 13 107 V 12 190 V 12 513 V 13 436 V 12 323 V 12 236 V 13 168 V 12 110 V 12 58 V 13 9 V 12 -40 V 13 -90 V 12 -141 V 12 -197 V 13 -251 V 12 -289 V 12 -283 V 13 -247 V 12 -265 V 13 -324 V 12 -302 V 12 -231 V 13 -75 V 12 150 V 12 1 V 13 -298 V 1273 782 L 12 1103 V 13 76 V 12 -338 V 13 252 V 12 357 V 12 86 V 13 -118 V 12 -341 V 12 -20 V 13 364 V 12 243 V 12 212 V 13 214 V 12 208 V 13 180 V 12 136 V 12 82 V 13 23 V 12 -40 V 12 -107 V 13 -177 V 12 -240 V 13 -259 V 12 -215 V 12 -220 V 13 -297 V 12 -196 V 12 -128 V 13 -701 V 12 632 V 12 329 V 13 -25 V 12 -470 V 13 -54 V 12 538 V 12 70 V 13 -246 V 1743 551 L 12 1111 V 13 185 V 12 -159 V 1793 652 L 12 893 V 12 321 V 13 103 V 12 164 V 12 262 V 13 239 V 12 190 V 12 141 V stroke 1891 2965 M 13 91 V 12 39 V 13 -13 V 12 -62 V 12 -97 V 13 -110 V 12 -120 V 12 -161 V 13 -265 V 12 -453 V 12 -215 V 13 139 V 12 -195 V 2062 420 L 5 0 R 10 961 V 12 135 V 13 -422 V 12 167 V 12 491 V 13 101 V 12 -169 V 13 -737 V 12 482 V 12 299 V 13 -48 V 12 -421 V 12 -151 V 13 434 V 12 -3 V 12 -378 V 13 -12 V 12 298 V 13 -187 V 12 -44 V 12 658 V 13 272 V 12 90 V 12 -49 V 13 -191 V 12 -370 V 13 -579 V 12 -329 V 12 385 V 13 444 V 12 172 V 12 -57 V 13 -407 V 12 -311 V 12 617 V 13 97 V 12 -198 V 13 -469 V 12 446 V 12 177 V 13 -114 V 12 -483 V 12 196 V 13 269 V 12 -74 V 12 -404 V 13 263 V 12 248 V 13 -37 V 12 -66 V 12 339 V 13 312 V 12 244 V 12 215 V 13 176 V 12 125 V 13 69 V 12 15 V 12 -30 V 13 -64 V 12 -85 V 12 -104 V 13 -138 V 12 -195 V 12 -278 V 13 -354 V 12 -257 V 13 -43 V 12 -20 V 12 -73 V 13 -202 V 12 -25 V 12 318 V 13 132 V 12 -73 V 12 -242 V 13 107 V 12 220 V 13 7 V 12 -277 V 9 -811 V 6 0 R 10 887 V 12 241 V 12 20 V 13 -14 V 12 241 V 13 323 V 12 262 V stroke 3153 2380 M 12 197 V 13 138 V 12 86 V 12 36 V 13 -10 V 12 -54 V 12 -92 V 13 -116 V 12 -108 V 13 -73 V 12 -63 V 12 -107 V 13 -195 V 12 -267 V 12 -88 V 13 50 V 12 -97 V 13 -367 V 12 -285 V 12 374 V 13 3 V 12 -352 V 12 88 V 13 347 V 12 47 V 12 -192 V 13 -264 V 12 200 V 13 16 V 12 -421 V 12 296 V 13 398 V 12 65 V 12 -212 V 13 69 V 12 453 V 12 240 V 13 104 V 12 12 V 13 -52 V 12 -82 V 12 -69 V 13 -34 V 12 -25 V 12 -64 V 13 -158 V 12 -346 V 13 -166 V 12 375 V 12 139 V 13 -46 V 12 -207 V 12 -187 V 13 102 V 12 -14 V 12 -357 V 13 -271 V 12 601 V 13 119 V 12 -172 V 12 -486 V 13 521 V 12 256 V 12 10 V 13 -219 V 12 -294 V 13 446 V 12 285 V 12 167 V 13 137 V 12 152 V 12 161 V 13 144 V 12 106 V 12 58 V 13 7 V 12 -44 V 13 -87 V 12 -116 V 12 -119 V 13 -118 V 12 -152 V 12 -241 V 13 -363 V 12 -109 V 12 172 V 13 43 V 12 -75 V 13 -176 V 12 -313 V 12 -344 V 13 236 V 12 93 V 12 -169 V 13 -102 V 12 320 V 13 123 V 12 17 V 12 207 V 13 270 V 12 201 V 12 186 V 13 217 V 12 213 V stroke 4439 2543 M 12 174 V 13 125 V 12 79 V 13 42 V 12 14 V 12 -3 V 13 -17 V 12 -34 V 12 -62 V 13 -102 V 12 -149 V 12 -182 V 13 -151 V 12 -70 V 13 -73 V 12 -146 V 12 -150 V 13 43 V 12 81 V 12 -27 V 13 -148 V 12 -213 V 13 -14 V 12 246 V 12 262 V 13 190 V 12 94 V 12 -7 V 13 -56 V 12 149 V 12 312 V 13 269 V 12 212 V 13 169 V 12 136 V 12 105 V 13 76 V 12 45 V 12 15 V 13 -15 V 12 -43 V 13 -66 V 12 -80 V 12 -83 V 13 -79 V 12 -80 V 12 -99 V 13 -136 V 12 -193 V 12 -274 V 13 -400 V 12 -462 V 13 173 V 12 148 V 12 -21 V 13 -198 V 12 -146 V 12 391 V 13 253 V 12 99 V 12 -38 V 13 -208 V 12 -260 V 13 418 V 12 330 V 12 210 V 13 153 V 12 123 V 12 105 V 13 88 V 12 68 V 13 47 V 12 24 V 12 1 V 13 -19 V 12 -38 V 12 -54 V 13 -67 V 12 -80 V 12 -93 V 13 -111 V 12 -132 V 13 -152 V 12 -167 V 12 -183 V 13 -211 V 12 -236 V 12 -139 V 13 15 V 12 -22 V 13 -164 V 12 -405 V 12 -211 V 13 440 V 12 230 V 12 152 V 13 96 V 12 29 V 12 -28 V 13 -10 V 12 81 V 13 96 V 12 29 V 12 -69 V stroke 5725 2104 M 13 -186 V 12 -239 V 12 142 V 13 249 V 12 155 V 12 88 V 13 49 V 12 35 V 13 39 V 12 38 V 12 13 V 13 -34 V 12 -87 V 12 -112 V 13 -72 V 12 -35 V 13 -100 V 12 -269 V 12 -452 V 13 296 V 12 99 V 12 -312 V 13 242 V 12 513 V 12 237 V 13 88 V 12 -21 V 13 -82 V 12 -1 V 12 153 V 13 177 V 12 156 V 12 145 V 13 134 V 12 114 V 12 87 V 13 56 V 12 26 V 13 -3 V 12 -30 V 12 -52 V 13 -74 V 12 -93 V 12 -108 V 13 -121 V 12 -130 V 13 -129 V 12 -118 V 12 -100 V 13 -92 V 12 -105 V 12 -135 V 13 -172 V 12 -195 V 12 -222 V 13 -353 V 12 -548 V 13 682 V 12 273 V 12 79 V 13 -59 V 12 -188 V 12 -225 V 13 39 V 12 80 V 13 -43 V 12 -44 V 12 184 V 13 213 V 12 127 V 12 42 V 13 -37 V 12 -115 V 12 -182 V 13 -179 V 12 -53 V 13 12 V 12 6 V 12 20 V 13 10 V 12 -65 V 12 -195 V 13 -296 V 12 56 V 12 100 V 13 -118 V 12 -182 V 13 253 V 12 155 V 12 -50 V 13 -222 V 12 21 V 12 197 V 13 7 V 12 -194 V 13 -77 V 12 240 V 12 73 V 13 -132 V 1.000 UL LT1 LTb 6311 4599 M (LPC synthesis filter) Rshow LT1 6395 4599 M 399 0 V 630 4034 M 12 0 V 13 0 V 12 1 V 12 1 V 13 1 V 12 1 V 13 1 V 12 2 V 12 2 V 13 3 V 12 2 V 12 4 V 13 3 V 12 5 V 13 4 V 12 6 V 12 6 V 13 7 V 12 8 V 12 8 V 13 10 V 12 11 V 12 11 V 13 13 V 12 15 V 13 16 V 12 17 V 12 19 V 13 21 V 12 23 V 12 25 V 13 27 V 12 29 V 12 31 V 13 32 V 12 33 V 13 33 V 12 30 V 12 26 V 13 16 V 12 4 V 12 -11 V 13 -26 V 12 -38 V 13 -49 V 12 -54 V 12 -56 V 13 -58 V 12 -57 V 12 -55 V 13 -53 V 12 -52 V 12 -49 V 13 -47 V 12 -45 V 13 -44 V 12 -41 V 12 -40 V 13 -38 V 12 -37 V 12 -35 V 13 -35 V 12 -33 V 12 -31 V 13 -31 V 12 -30 V 13 -29 V 12 -28 V 12 -27 V 13 -26 V 12 -26 V 12 -24 V 13 -25 V 12 -23 V 13 -23 V 12 -22 V 12 -22 V 13 -21 V 12 -20 V 12 -20 V 13 -20 V 12 -19 V 12 -19 V 13 -18 V 12 -17 V 13 -18 V 12 -17 V 12 -16 V 13 -16 V 12 -16 V 12 -15 V 13 -15 V 12 -15 V 13 -14 V 12 -14 V 12 -14 V 13 -13 V 12 -13 V 12 -13 V 13 -12 V 12 -13 V 12 -11 V stroke 1891 2822 M 13 -12 V 12 -11 V 13 -11 V 12 -11 V 12 -11 V 13 -10 V 12 -10 V 12 -10 V 13 -10 V 12 -9 V 12 -9 V 13 -9 V 12 -8 V 13 -9 V 12 -8 V 12 -8 V 13 -8 V 12 -7 V 12 -8 V 13 -7 V 12 -7 V 13 -7 V 12 -6 V 12 -6 V 13 -7 V 12 -6 V 12 -5 V 13 -6 V 12 -5 V 12 -6 V 13 -5 V 12 -5 V 13 -4 V 12 -5 V 12 -4 V 13 -5 V 12 -4 V 12 -4 V 13 -3 V 12 -4 V 13 -3 V 12 -4 V 12 -3 V 13 -3 V 12 -2 V 12 -3 V 13 -3 V 12 -2 V 12 -2 V 13 -2 V 12 -2 V 13 -2 V 12 -2 V 12 -1 V 13 -2 V 12 -1 V 12 -1 V 13 -2 V 12 -1 V 12 0 V 13 -1 V 12 -1 V 13 0 V 12 -1 V 12 0 V 13 0 V 12 -1 V 12 0 V 13 0 V 12 0 V 13 0 V 12 1 V 12 0 V 13 0 V 12 1 V 12 0 V 13 1 V 12 0 V 12 1 V 13 1 V 12 0 V 13 1 V 12 1 V 12 1 V 13 0 V 12 1 V 12 1 V 13 1 V 12 1 V 12 0 V 13 1 V 12 1 V 13 1 V 12 0 V 12 1 V 13 1 V 12 0 V 12 1 V 13 1 V 12 0 V 13 1 V 12 0 V 12 0 V 13 1 V stroke 3178 2508 M 12 0 V 12 0 V 13 0 V 12 0 V 12 0 V 13 0 V 12 0 V 13 0 V 12 0 V 12 -1 V 13 0 V 12 -1 V 12 0 V 13 -1 V 12 0 V 13 -1 V 12 -1 V 12 0 V 13 -1 V 12 -1 V 12 -1 V 13 -1 V 12 -1 V 12 0 V 13 -1 V 12 -1 V 13 -1 V 12 -1 V 12 -1 V 13 -1 V 12 -1 V 12 -1 V 13 -1 V 12 -1 V 12 0 V 13 -1 V 12 -1 V 13 -1 V 12 0 V 12 -1 V 13 0 V 12 -1 V 12 0 V 13 0 V 12 0 V 13 0 V 12 0 V 12 0 V 13 0 V 12 0 V 12 0 V 13 1 V 12 1 V 12 0 V 13 1 V 12 1 V 13 1 V 12 2 V 12 1 V 13 1 V 12 2 V 12 2 V 13 2 V 12 2 V 13 2 V 12 3 V 12 2 V 13 3 V 12 3 V 12 3 V 13 4 V 12 3 V 12 4 V 13 4 V 12 4 V 13 4 V 12 4 V 12 5 V 13 5 V 12 5 V 12 5 V 13 6 V 12 6 V 12 6 V 13 6 V 12 6 V 13 7 V 12 7 V 12 7 V 13 8 V 12 8 V 12 8 V 13 8 V 12 9 V 13 9 V 12 9 V 12 9 V 13 10 V 12 10 V 12 11 V 13 11 V 12 11 V 12 12 V 13 12 V stroke 4464 2759 M 12 12 V 13 13 V 12 13 V 12 14 V 13 14 V 12 15 V 12 15 V 13 16 V 12 16 V 12 17 V 13 17 V 12 18 V 13 18 V 12 19 V 12 20 V 13 21 V 12 21 V 12 22 V 13 23 V 12 23 V 13 24 V 12 26 V 12 26 V 13 26 V 12 28 V 12 28 V 13 30 V 12 29 V 12 31 V 13 30 V 12 31 V 13 30 V 12 29 V 12 27 V 13 26 V 12 22 V 12 18 V 13 13 V 12 8 V 13 2 V 12 -3 V 12 -9 V 13 -13 V 12 -16 V 12 -20 V 13 -21 V 12 -23 V 12 -24 V 13 -23 V 12 -24 V 13 -23 V 12 -23 V 12 -22 V 13 -21 V 12 -21 V 12 -20 V 13 -18 V 12 -18 V 12 -17 V 13 -16 V 12 -16 V 13 -14 V 12 -14 V 12 -13 V 13 -13 V 12 -11 V 12 -11 V 13 -11 V 12 -10 V 13 -9 V 12 -8 V 12 -8 V 13 -8 V 12 -6 V 12 -7 V 13 -6 V 12 -5 V 12 -5 V 13 -4 V 12 -4 V 13 -4 V 12 -3 V 12 -3 V 13 -2 V 12 -2 V 12 -2 V 13 -1 V 12 -1 V 13 0 V 12 0 V 12 0 V 13 0 V 12 1 V 12 1 V 13 1 V 12 2 V 12 2 V 13 2 V 12 2 V 13 2 V 12 3 V 12 3 V 13 2 V 12 3 V stroke 5750 3038 M 12 3 V 13 3 V 12 3 V 12 3 V 13 3 V 12 2 V 13 3 V 12 2 V 12 2 V 13 2 V 12 2 V 12 1 V 13 0 V 12 1 V 13 0 V 12 -1 V 12 -1 V 13 -2 V 12 -2 V 12 -3 V 13 -4 V 12 -4 V 12 -4 V 13 -6 V 12 -5 V 13 -7 V 12 -6 V 12 -8 V 13 -7 V 12 -9 V 12 -8 V 13 -9 V 12 -9 V 12 -10 V 13 -9 V 12 -10 V 13 -10 V 12 -10 V 12 -11 V 13 -10 V 12 -10 V 12 -11 V 13 -10 V 12 -10 V 13 -11 V 12 -10 V 12 -10 V 13 -10 V 12 -10 V 12 -9 V 13 -10 V 12 -10 V 12 -9 V 13 -9 V 12 -9 V 13 -9 V 12 -8 V 12 -8 V 13 -9 V 12 -8 V 12 -7 V 13 -8 V 12 -7 V 13 -7 V 12 -7 V 12 -7 V 13 -7 V 12 -6 V 12 -6 V 13 -6 V 12 -6 V 12 -5 V 13 -5 V 12 -5 V 13 -5 V 12 -5 V 12 -4 V 13 -4 V 12 -4 V 12 -4 V 13 -4 V 12 -3 V 12 -3 V 13 -3 V 12 -3 V 13 -2 V 12 -3 V 12 -2 V 13 -2 V 12 -2 V 12 -1 V 13 -1 V 12 -2 V 13 0 V 12 -1 V 12 -1 V 13 0 V 1.000 UL LT2 LTb 6311 4459 M (Reference shaping) Rshow LT2 6395 4459 M 399 0 V 630 3487 M 12 0 V 13 0 V 12 1 V 12 0 V 13 1 V 12 1 V 13 1 V 12 2 V 12 1 V 13 2 V 12 2 V 12 2 V 13 2 V 12 2 V 13 3 V 12 2 V 12 3 V 13 3 V 12 3 V 12 2 V 13 4 V 12 3 V 12 3 V 13 3 V 12 3 V 13 2 V 12 3 V 12 3 V 13 2 V 12 2 V 12 1 V 13 1 V 12 1 V 12 0 V 13 0 V 12 -2 V 13 -2 V 12 -2 V 12 -4 V 13 -4 V 12 -6 V 12 -6 V 13 -7 V 12 -8 V 13 -8 V 12 -10 V 12 -10 V 13 -11 V 12 -12 V 12 -12 V 13 -13 V 12 -13 V 12 -14 V 13 -14 V 12 -14 V 13 -15 V 12 -15 V 12 -15 V 13 -15 V 12 -15 V 12 -15 V 13 -14 V 12 -15 V 12 -15 V 13 -15 V 12 -14 V 13 -14 V 12 -15 V 12 -13 V 13 -14 V 12 -14 V 12 -13 V 13 -13 V 12 -13 V 13 -12 V 12 -12 V 12 -12 V 13 -12 V 12 -12 V 12 -11 V 13 -11 V 12 -11 V 12 -10 V 13 -10 V 12 -10 V 13 -10 V 12 -10 V 12 -9 V 13 -9 V 12 -9 V 12 -9 V 13 -8 V 12 -8 V 13 -8 V 12 -8 V 12 -8 V 13 -7 V 12 -7 V 12 -7 V 13 -7 V 12 -6 V 12 -7 V stroke 1891 2847 M 13 -6 V 12 -6 V 13 -6 V 12 -5 V 12 -6 V 13 -5 V 12 -5 V 12 -5 V 13 -5 V 12 -5 V 12 -4 V 13 -5 V 12 -4 V 13 -4 V 12 -4 V 12 -4 V 13 -4 V 12 -3 V 12 -4 V 13 -3 V 12 -3 V 13 -3 V 12 -3 V 12 -3 V 13 -2 V 12 -3 V 12 -2 V 13 -3 V 12 -2 V 12 -2 V 13 -2 V 12 -2 V 13 -2 V 12 -1 V 12 -2 V 13 -1 V 12 -2 V 12 -1 V 13 -1 V 12 -1 V 13 -2 V 12 0 V 12 -1 V 13 -1 V 12 -1 V 12 -1 V 13 0 V 12 -1 V 12 0 V 13 0 V 12 -1 V 13 0 V 12 0 V 12 0 V 13 0 V 12 0 V 12 0 V 13 0 V 12 0 V 12 1 V 13 0 V 12 0 V 13 1 V 12 0 V 12 0 V 13 1 V 12 0 V 12 1 V 13 1 V 12 0 V 13 1 V 12 1 V 12 0 V 13 1 V 12 1 V 12 1 V 13 0 V 12 1 V 12 1 V 13 1 V 12 1 V 13 1 V 12 0 V 12 1 V 13 1 V 12 1 V 12 1 V 13 1 V 12 1 V 12 0 V 13 1 V 12 1 V 13 1 V 12 0 V 12 1 V 13 1 V 12 1 V 12 0 V 13 1 V 12 1 V 13 0 V 12 1 V 12 0 V 13 1 V stroke 3178 2736 M 12 0 V 12 1 V 13 0 V 12 1 V 12 0 V 13 0 V 12 1 V 13 0 V 12 0 V 12 0 V 13 1 V 12 0 V 12 0 V 13 0 V 12 0 V 13 0 V 12 0 V 12 0 V 13 0 V 12 0 V 12 0 V 13 0 V 12 0 V 12 0 V 13 0 V 12 0 V 13 0 V 12 0 V 12 0 V 13 0 V 12 0 V 12 0 V 13 0 V 12 -1 V 12 0 V 13 0 V 12 0 V 13 0 V 12 1 V 12 0 V 13 0 V 12 0 V 12 0 V 13 0 V 12 0 V 13 1 V 12 0 V 12 0 V 13 1 V 12 0 V 12 1 V 13 1 V 12 0 V 12 1 V 13 1 V 12 1 V 13 0 V 12 1 V 12 2 V 13 1 V 12 1 V 12 1 V 13 2 V 12 1 V 13 2 V 12 1 V 12 2 V 13 2 V 12 2 V 12 2 V 13 2 V 12 3 V 12 2 V 13 3 V 12 2 V 13 3 V 12 3 V 12 3 V 13 3 V 12 3 V 12 4 V 13 3 V 12 4 V 12 4 V 13 4 V 12 4 V 13 4 V 12 5 V 12 4 V 13 5 V 12 5 V 12 5 V 13 5 V 12 5 V 13 6 V 12 6 V 12 6 V 13 6 V 12 6 V 12 6 V 13 7 V 12 6 V 12 7 V 13 7 V stroke 4464 2918 M 12 8 V 13 7 V 12 8 V 12 7 V 13 8 V 12 8 V 12 9 V 13 8 V 12 9 V 12 8 V 13 9 V 12 9 V 13 9 V 12 9 V 12 9 V 13 9 V 12 10 V 12 9 V 13 9 V 12 10 V 13 9 V 12 9 V 12 9 V 13 9 V 12 9 V 12 8 V 13 8 V 12 8 V 12 8 V 13 7 V 12 7 V 13 6 V 12 6 V 12 6 V 13 4 V 12 5 V 12 3 V 13 3 V 12 3 V 13 1 V 12 1 V 12 1 V 13 0 V 12 -1 V 12 -1 V 13 -2 V 12 -2 V 12 -3 V 13 -4 V 12 -3 V 13 -4 V 12 -5 V 12 -4 V 13 -5 V 12 -5 V 12 -5 V 13 -5 V 12 -6 V 12 -5 V 13 -6 V 12 -5 V 13 -6 V 12 -5 V 12 -5 V 13 -5 V 12 -6 V 12 -5 V 13 -5 V 12 -4 V 13 -5 V 12 -4 V 12 -5 V 13 -4 V 12 -4 V 12 -4 V 13 -3 V 12 -4 V 12 -3 V 13 -3 V 12 -3 V 13 -3 V 12 -3 V 12 -2 V 13 -2 V 12 -2 V 12 -2 V 13 -2 V 12 -2 V 13 -1 V 12 -2 V 12 -1 V 13 -1 V 12 -1 V 12 -1 V 13 -1 V 12 0 V 12 -1 V 13 -1 V 12 0 V 13 -1 V 12 0 V 12 0 V 13 -1 V 12 0 V stroke 5750 3036 M 12 0 V 13 -1 V 12 0 V 12 0 V 13 -1 V 12 0 V 13 -1 V 12 0 V 12 -1 V 13 -1 V 12 0 V 12 -1 V 13 -1 V 12 -2 V 13 -1 V 12 -1 V 12 -2 V 13 -1 V 12 -2 V 12 -2 V 13 -2 V 12 -3 V 12 -2 V 13 -3 V 12 -2 V 13 -3 V 12 -3 V 12 -3 V 13 -4 V 12 -3 V 12 -4 V 13 -3 V 12 -4 V 12 -4 V 13 -4 V 12 -4 V 13 -4 V 12 -4 V 12 -5 V 13 -4 V 12 -4 V 12 -5 V 13 -4 V 12 -5 V 13 -4 V 12 -5 V 12 -5 V 13 -4 V 12 -5 V 12 -4 V 13 -5 V 12 -4 V 12 -4 V 13 -5 V 12 -4 V 13 -4 V 12 -5 V 12 -4 V 13 -4 V 12 -4 V 12 -4 V 13 -4 V 12 -4 V 13 -3 V 12 -4 V 12 -4 V 13 -3 V 12 -3 V 12 -4 V 13 -3 V 12 -3 V 12 -3 V 13 -3 V 12 -3 V 13 -2 V 12 -3 V 12 -2 V 13 -3 V 12 -2 V 12 -2 V 13 -2 V 12 -2 V 12 -2 V 13 -1 V 12 -2 V 13 -1 V 12 -2 V 12 -1 V 13 -1 V 12 -1 V 12 -1 V 13 -1 V 12 0 V 13 -1 V 12 0 V 12 0 V 13 -1 V 1.000 UL LTb 630 420 M 6332 0 V 0 4452 V -6332 0 V 630 420 L 1.000 UP stroke grestore end showpage %%Trailer %%DocumentFonts: Helvetica mumble-1.3.4/3rdparty/speex-src/doc/manual.pdf0000664000175000017500000153237114010707304021046 0ustar builderbuilder%PDF-1.3 %쏢 5 0 obj <> stream xmRMk@ Wq VҌFkRrh7mn/ϯfk;3$c@\k{0\w=vt݅A.aMd dł]-=#gg?!pK? $M0-4)⟙s{pzq%8k|=ѭcR|hҴ$6/T,#; AZzRpvϋ~$Eh%xTADZrCdW^YycMʐrᶦL@R- Y}U>.!TȓNU9Ӕy6z/X}ND>(}iWt r4@Ir/ɐ&lZZvQD/Dǜ{p,Yh yۏ o4~&endstream endobj 6 0 obj 414 endobj 13 0 obj <> stream xWnE}߯4#e}nDDD DH[,bo8=U=5; rutF+hO6GCsawy1Y\5$Z|3(Qa,(~y'lw]*Ɣ\Ce\DleۛB^v,X^T7$ʡ6ܞtQ`VƦkrCvI jJz58 sjJ| ]oVCs yߞMٴёH_9},u3}ON+0}T06W`.Q#ٱwCnj1RSV.o:rm5IgJP~&k$Rib;܃UZCgTxlpɵSۄZC9aX]"cΒ3?b=VkPB$"@K]u[b18WLt *X,u4Fm`&3QYJyMgʫH^;]D坙D0ڭDu^C+U2ˎb]T&2k.Nj*" 6 V\ s-yſh3IA@uƒeT}*{q~6@%urf"oJfDKF~%ԗU*UFVeeWq{u1s)H>pMf-fNu}*mČTNvJuV!ۑT#گ͜NԐj YK\ԘOl ]-ÓF¤Дfx=].3^$Da鮼Y":`3q=pGPM!F(al_LJqK93F9K~:P{bhf- #2Y9~Sha#h pHrlo\Ɵ#6#jRz''fQ~U[~4CR60Mj6A$Zq&4uva$,y:MԈ?*ݮm"a=%kZs0Zp(MF)-M0o\ʼW 4L{@GTD'|]Z1祾 : ̮)1;yCaA^5$|\cNޝKxŠ>\av񚍯`l"c-=&^=>2ഡ$@SG lendstream endobj 14 0 obj 1235 endobj 20 0 obj <> stream x][o6ѿb56 ҭqb؎c48)JȊoaFEqw.9|Xb_z\>êb!tr+Q2cYݫo+mޭÕߊgkΜ\W%OX^7iYB沉x?/{" W^~[<3B/%Zpr#ZzsZXx m`nITyf"y ײ8\aWx0.[p^+o: DhI=ŗᕕṫ'nWxʻwh|U`.+Y]ޔ̖P2`aWH{Y0w!=dUѥ! ¬UѾzY` % Vؒ]w>NrQ7:} _+l~\ PLA:3 ?{\D§AuxL:P,Ȃ[t./Hëۈ`Z3YD[+fh4|~\׀>9h]}hoja{oϢ&I`')U0mOh{(oVJA蘷L6Z9?rNDި dEWdUrn +~"ܮ# &/% ĜEt6^{iM)[]JFڂ]H@<м͈W D#G=ߥ rH/JF(deΧ;!5q\$Q R[،YwѼ>tDgIyb,GJ@WS"1J@JŬ;ajzm :"yxh&~AUX8B ),\ VrVļ(6H09ʇ]pH',Mw^"*=Xx,e(rcvBhuw,m5tO?lٿC!z EWWH)*RXTY5%0R-I@Wo j@=ʪݪ5%jRZ]b8t&}V^/ia.[`Xp}i{|@Dg& MuoL'ĶMNP|Z!޷OnR^eju*/3Tff33E8K~yZl>lIЛQW"dj͚EσH;N]-(V_@iWJT嫮_/+ 5$$;jk䔺{2|4ʘC:_c_| Q^[zډM71ԋo,u#7 WH7Qk:!6s}COq>e%|kΑICI(ahyi[5Rm%rO8Tu0qvEYmy'*B~~h8B3y¥$lW!X^+ ɇ]⬲ᄓFV S <7]#="rz8kLlK;;ZIvqIw130a1 D5xu  <30<3tTYTj|9Z佴 m3x*ݭ5O֒P]'Z r-=R$5u8$k!BlF}$ǔ[i5q9NݜN)lKlJW|t6forwgmHX>oĶPj(eWԬwyWT_f6$Hx^t@RW~M+wE€ oN|gGDs"9IHܻr1 NC{1ӖaG*J9Bd8\ʛBżLvJ$KkRe79Yɸt5S*g- ֊ Yr7),ã:K>8uY -lO߅&<)G!` tߦVa+"ߧo'tLsMڭD2YnR4ûnq N"ԩS<"VC$ٞVg5C| ¿8Hft'|K+{9q) qd\Eo܏عz#v<aH-Nj(?v`2U(:\; -XRNBhd8+18.ƭbNI+woFDX}r3n x~9ً/:nu% e?cRW00e bȳ4S1u9Ha]M)&u~T$ 6?8@>;,bbc UY܀W,)I Sr, \5Z]*ly%̣>4n(}.Z؏BSu(\ Ó=h&ə,Ѽ)!Y_+ ;W໖|nW''l;iѠ\~*[]wLiQ>1  ?}endstream endobj 21 0 obj 3032 endobj 27 0 obj <> stream xZKo6z_#uرA=4=8: Nv}HJ:vSYHof/P~~3Q=/3hڙP x&xVidPk{.u匊?lH Y7{;mGoH`nUݼyº?Q+_VG:2[|nJ޴`YݠJhG  PQ(gQR/פ Vy;b׍FAp/BG+GG4\Dw Gv2Ԁn 6a 4pgo/5c!!qyy,kҢ6td?R naOFppM z Oen0,Wܹvh@jV;Yyec)qm|Sc_%4"YpK-(MAq+z4J@dn&!s#O,&ow-ḏD,sk[rZ¹Ȑd]2e>I~Ur)dD4 yBS|>㲘z`r~ˆ&B\R-N6a8kA32N]$`08h?*7+akjb Nxޱ sU&QlS2BryZ.FenL&"2_|W֕z2?Ns zaQ@u+fq-2XXLט=+ݡ9LtT';~xD,6%ã=ڣN OXN ʼn,8)dH#KS#@"e͐r#ZQ.{V.'إ3oXAJCbxE:8ܛùM"u:KuT8TײAq7c0}!zlN=`iۭyTw׷h0>FUQmjE'^ ^.+qRA:6JyY_1Z1CS͵0f4YPK嘗Xk޻ 3,S=/ø]hي*` xd[yg@ n=Ybv =tR꧹4~ Ҝں$Z%v;s/vB( {Qx#B5ąJ5I,zǫԋ-d/+2/~ŏu-Nsڥh4+?2 SΛQ(Q(OR/N-Ibشَک7c~jYwR!ٯuƈ#qThbAtSdO]8QB|Ar> stream xKo!{dKkjUJ[C85vG_^/ĉHMY00O=>Toxt1Pu_y?%_h4X uPFi2VWuTu-koP/Uԑ4zl"@P߲ѤЫ> stream x]Ksqo/ 8]=i_֮%{5 M(׻UY3v gV>~s.l'_ήy6~扈.^}4<".E~lꗽ DZ ehy3V*ܳv}}5zۿަ-htgj2ӝp}} ؇}k3]B՛0Y'g.o ;|(|ZH,1,O| -/e{.CH#]<.V&z.߶G/jK+)qϵ ΅LʭڭZ6:(b"pBW/bQեCF 39(j Fka7OlTlMK8Si lDP ᦧx0lz /%m=hTn3Y;VVZm^Iת bP;)m1R ;3@>"u.0Z[q.jnhHc@YZP[q[#z=PW_hmʌ#d\~vƸįr<;Q>MQzq\[oA#|:c4P h`p0m_{f78CrGpW vfBSMq| U^G4,gT[m:ȧuP0Gom8I"2[!{ZP> Qo[ӌiSnR;M)|[8 .Īc8W%# D*(1s''ت[qQط@2(d67=85NǴR{3Lr>ļ T^ElahA*mmܴאFU(L*Qу/YK<"n5D'1Jzz`YϫvHHE ǂ:̔/tr]LYC9D,1^/W>I릳<:a Gs1V9NPն7"RzTx0dzAvk'̮ ߼?V*Yחn{@f22f,?V%,+y|dbӝ"jnޑH}<ȊEw4w/ZF ^^4䤁sQ&7YHM,x٬~&j qK4X޵ EFSgfDw9cUG`k < c}o%mll릐mه7c^aAͩpUIhWZVG%{!63Zcu2葺xfyx] 6!Bnk8+k kd:mTHE[ r`Maٶdh1B8'ͯ3p[s#,P`,,n߳8 /vz20<*KowVv-,Ѣ e$SakIR)|%N6.Ƕn.4٨_0wm wG{XL!͕ tGb(ĵa-p6x1h..py T6L( hvq`Hܵaqm>q\3[PwXV-3z\Uy#*UhN M!EUA}mh$; ɋHA C%x!D$ݒK5x!.4&6Eˀ!抿%wM衟p'JݘWy^9)RJK͝ldVն ļ9sBfymB0,w@{R{niVTX)x8~*H il+ŕ`\sz;D3IGb搸e'T#(pZ?;!|X?EPt|<]܇Vbz}&>lAm?WN.'Tg] DeC=MgzM.ᨮS}%xp ixd;ʂ{t QS] ۰1 ^l YjQZBY>@/uNk)d'ܿFC7 :$r1.pnF[&R\ٓy|My,NN]1F78 БE.l;?QEӝAcmmv[,82$8>%p0F  t؆2EyCD2WCԔdaUpWK#ߡk\;hx1Lڻ~&!"rd7Xn%L;;qG3'"mU>! @c#0"$?évB#`W]=`{~ѱmUSuݯ#1#D-|g9(AǜG9A<x˕G:ħѓ',@*~zt[|2 AeXBK ੈUb}u;5/$7(y;b 4  }G6ll'kϯ'!3r4Z!V;h0<٢d~t^b6N;d#P<`,I0q'eP JSAHҢy xUel W2,ع $qq#Pb':Ff sGHjo/x?-8&f9a7+xÒS79Ù+t}0 yWeS~ on" #|JNK`6=ZqN7ޯgW|zDj/EO=?6h-m}w ^5 F87/%q<`JջT"kxw*T)Sǧ!.<ج'Z>˦3ynsΚ(H@]uRq xZD"UqRelsPRZHVf⏽ڃRYC{v :@-f4XezDZ($D1wb ԉ bGpWnlPJZm\10s<.Xf e\ǖ8*;7UEn\U였3Gasdpe`Cu#1=_f~Ǎ a NJZ/he79c9{R%w%w_>c}(?j , \]8[bKf[m P3R 3PW7],E8LTK?NW6]1wڑ"W2 Lc񒜺#prH]$^zbTБ9@XjdX*Qmhg<&-R#}u" p|a`$W;G.mbe-ϸ)/B\ ;% y7c+W=͘]a+x!"~ٌ; PlCXbN2 N ۴2>]y3lkS6 Q!kݸ=tӬ.dRYQ!ɵ*܎eُ9Uu̚(8LY).W}PiVSffޠ|k_amLfY b= 'DϾˍem -vЖ[C%&9 l)dsH q$<2y4~ ΥIfy(Blz80Ӫ;SIRYnbI6ѳyf.J""%\3(4}Yzk A!^*dL/\2:ZCj< s @*Rz,|4Ɇ `(ai1YXELs1J?eu4oY;1KZ?5Wr)h?FqV|r#M!=Fc[*􌡹ɶgl6!lS@QJ,B9]&ᘲ J!{9X1A]q|S]hh Z2~9=>+t8u$Wageúrp:͞*rf2S)a[җ-G'jⱙCVX8KWJo t3YT1jix/4Q\"F2CiÎO B#&UMQ|9#%qMS|BHьs{cζ>~byP  ƅҚ Tr{V6fX@3\s=MY̾[d,b<( *?+~ytk=Ibo @gD+:gbA9Z(^Ql)gWycjGce V3 "L!kcDPu{H:1Еb}G<S@+uARFv_= 9NҺ!k<̅r0CMV3\%żzϒ+Ş;l(6$G׺#(ݑs %IhRN4~u4`k H<%Cs{ : VEQK!+,_cd]|./P?oAIHbxwdǥTe4OK'[J8`i3x*^@$>9d0'_F5k 1͏c'/\jqX@\; I'bUllPEM5Ӽԇꎘz*?-.Cb 3SUUbGoQwBLEn_GɊzk)v!rACPޑzSar#?eA~Vfu= ؘŊc fF{> 蟰z_@l!v*a gd[C^RBGrN$#PHA0mp7ik/cjXك+1pzai!n:͋X,nĆL߁ہ&} y4 Rd3}TW/أxͤ_i5Qh-_١$:qgYȍg'vB\NV`zÄXb$RE>6Nsa6@fg2F:mA5M>~)Zdٳ~ Bc[V~Ix$4}{Ja5 ː2RcgO!/f4pɱjGx פB4~c4r4(Ǭۏ}[[AR97y'XhbԢGUO+j~(Q[1k!tU_cF&NE$ȗl|fؙ{fu_Cx8IjV>L͚Uh<~',!/* dCKCVb&0S3+@_0ۀȟNgUDu%DeVq7sPSyF$Y}o95fU1dejeE: NB4WqgZuﷁ,Q"&Տk$_`-JC#@)K#s#ݵ-\(8` $t*qݧP,NPCI-h !?}Ya7endstream endobj 38 0 obj 7381 endobj 44 0 obj <> stream x]ے7rX+up-`# ɖW{C]?N EF`g]=B=U&2O^uW+K݃Oٮ^`U>+.J{Ń2vʻ+_{<̺.~_&>UXsxV>=?bԺIu3h߾;`wϛz;--OZx: 3WV պ8ʫ?xR0<oq{<Jqj1v] Fa[kQ[HoB~g-lNjΞRvjEڵ Kz{xw[IJ(xϸBJVQr? U*lZibV,ZË8VaJg Zx\?†(SxǾgvu]"M-/Ui>A]C#ʏT۲I8! +_mݪ+D;NJ$a,A) N\@pnYE:|O }8PN0 s\an(wSe$ 4G =Yw\S$|V9 R_7eJC JjCq}dYȃY0t<|©li+}WW/=^UL`$%=jN'A2-w<Ut'9e3S*Y2We3QntuԂ`򀑯⨈MoϾgAeiE{ML#'"ggѶpIy^rcxڼIļvŗO]I@UxfP?e᳠9`qÂ"+*쵦/×1EO4 t2r8U,>aX'yRΜ+y#}BޓYD֠(xI$Lƿ+|k(*Y}"^Эf:KBc*OJtQzh:*=aSN(hRs4^l[u|Aղ5hQyNN. .zt-'rR[aR٤%w$ܲ ϛ kAl4V$"2hHFЪ ["QJrSDy)(U~*L??K#L7TZMA ?D$ܯ`P w d%a}e3rzB'ΑIh9ɔΡۢ&E=>`WfRvha-\z%0iEUX"}AJQbQPwIA K `m `xp._M 0u^ٗoc[=2iUӂdx晈@,=#HـNz+Зtp-lXcXN P@mgut4RO3\h #NHg2~- ]߳*X{V+yHu凱lfe`Nj$,ԼcV&ē7%dpK8LHƾU[M݄`B(R9vp0,D߶ֶ!WZ!vHԛe cS~]&]BUr{.ux^?nLڏp5D:CE%gL Gm}bV!H [cݝu];k!? HnUh#zi)P 6[}I.jk{` slG?ۃ j"1Wr+yl.Wi) 2y'ooŅ:G=R! 1GdgծMT'\fk&uZTK `nܶsXlػٞq,rMdyv[}WٷEQ\EXZELEp*Ui* hx,#hNmo#BT/cfH}0R£2{xid QxqP]a. Ϣ Ʀ?G01yP1~pJ4܄ |򁋾w8y8#dq Ŕ匒zԸA%(ÏuK064E^sܒ\)g+\EX7f7LU-Ń v M#cGYӒD=&lք%ύS'BS'5䭤ie0ٛ; 3CE>oG ݺj ęyre'JtJ!J)p7^WS;@z}UΩn5:ت((# Y.fT0L _YŒA%A<CĉHfn)݈J5BTJ]MiM8MG#=Jf+f}p lFСgx(O !H+19\I[KU&*Nz%q ;8 =ND"[}`8|Yvpđ'v Fј"a&A@[V}=f=RjQ73C#'CH<>qԹP`݅ o#ݞ62ul`~eŔq>g|7+/}P)rMe d6wGvbOɸ2M )^5矉 G2mZrmc3+%#INb;{ 7D1"xK ꤝ^<'_OG mE)@kT[#ea<:#F3pnkɼnm" (Y3}:w9k\W~!iH+~E3wjlO!1GjTM5Ǿ Dܑʼng+ǣDNHMC>WBL3K\$o#C̫_g]QT@ <O❶fɻX3Dk)/Zez6d%G,D27{)%-FLy"{܌u#wK%5ϒYܑaX9bLbbփׇً ͗6o?޲{m`3zh S~Sc^'q1v-Gΐ*K8)\!A'S\ZۺE5S!jݖ^rjBt=vm'6vѪWёNᗷ7plg~E,٨2-̻z6uWXIK NAHLwygCNiwi指;I4ZlĿ' AoS4aKN8&.»V o$:iP&PwXS*ڮ3ۑs ׎+r"x{.3<5nf&qߏZי!z`ji㹈bx'ω-:W֪ A]RBr8Y{[1^;p9{#cwmp"$TOcYW#TTl#) xjwS$'(E^(Ll-JbTЊ̦*Na$'&1<9\\%zD ŢȤo#\$1QKygwiB%Z3 \φ8\>OgEFFGʾ#=9yDŽs(I+E}a4p&׏w0򫴓f|A7Y-ct pC\+l~#mK&2j+4 A2nlQ;mvQz, e!׋_c'ۃbvM`bm ; wc rHְx^j|[!61fe@4 #(]>yxf/._+@(:mh&0V ۼ@| Daܭ4OIdaCaCqW!}:1* =mKUA0=DY);sxukDrP+!:I `ybgw%]` xQ~ o#ɞ!V pX⧤|lxjsG@>L9qD!H% K GCoAxV7$^ZC]Ș?з.&Ѻ:n9snpH!A.=[KPm_,h|0lUBiN?:2NGNeRtJ, ^rorys* $ׅ'$Eh^|@I-l"M֒b;I/it%kַ{!Ӕ"N}D XY@&TvhsF9J$5yvf,AfMptr$3( s]mղrצnpȦsȾkE0A aOxJRgw^% G{: ^r.-N($N&rT"Q*ZLrh #\=0#1-tBGM m }1EHS!+y=Ztw6q)3Es"vׅ0ѺHW$-/Rj^@VD09ăH*ġ~ۺ׉.ќ}!*=ztxRIlbYLXePS[L:Ij%)Kξ!"Q,LIoòݘGcpðA"8:ΦZxY}SilV[T7Sެ06ȬKEXᦊc Fn`D.}Pϴ,g!󠏔 *?ZN;5`ʎP閃'0|`˒Xn5uz0&mCBEFh3]Qo3dգbϪ% ?Ig+2,͜ hjCľJP5ѿ4.+Jif٪!48ZK]r()z, ?#sZ]%(=z}-GOaQ~a?n,lre1u좌B=W(qm)ֆ́ Ŋ!0W $s‰mIc@"V#?[v8Dǝ6U-Ώ:]kƂҍiJV3㈍yk4@]Q8_xC~j~ia 65BSRo9\E"Ȓh({v>rh7Kc%D7IMTJ>-P=30SWj5vV N.)57kҜ _J/YDcfJя [&q$Ju1^,Aղڟ7j)†C7VT"nY2aXLԨ|Ũr:ꛚroԳ zC8S(l%ƼVjPGe#"cڽD?I?:/ɍ~~HMo<_A܉i0hEΩ"?\%>=c Y OƵ.&"IJQ_C2Q%~ 8\O}U`"brHN^)6cA.'ku4zL$ceulLB$+{/՘nnZ~e*dvTU8~Βŵ APYyp 4)wg/e7iܿ;_\^(sNj/y A|{p LdsU86rt$ [ܻ[0*_3%LAr?츁>P3c28;r N~\p\ RҷqwIɬ_2TwMNzK2 ;r05QU\Ex82݋/ow}^U(Y} I-eE:[/EW5)R{c~!WQ)+3{/0p#&v8a Sc2RV]zበ#V3iWH,; wai>0\(ïŀay@sn- V{āO!NL+oʂlK@ϖ%*ܙa(5Dni6P *f|vv[jе]Y l} ZeN9#vIEY9@TzR6lEW:ݥN_.|칎Xĕg +:hpΉ"ZRO誻6HЬ+Dt ͟ae:6(ދ:ՀQ^y+IYny??|'^endstream endobj 45 0 obj 7011 endobj 52 0 obj <> stream x\ɒq5BT%SdQ!Ҍԡn,3=17U k!-+22ϗ/E\'_]|d{'"5(=(E|d]JܓNvOZ{Z_vr!,k#7Ynwfw?Z պՔi*{Wue^HV{Y:o?1Rզ{0k!Qu^2qa#NL}Ћwľ"jYaq2j ʹ4CM~? !hYH CRYgr[~ة[Wm$kx%]^.J_w{sVMkѽV뼖"t M͓O :cWy/Vfk#0f]#lݬ8+ ǮD!uUU.DDq\JTԏW•v*Sv `'>K4 ݔTwhpވUDFol0d4Y*fD]Tzx Wi7e[4㥤"iFq7^l.Đ!Yj4,5]0jBo+s%YHfDi2D'PMoF1':k3f~l-3x `%~5K2As!wxyG'2DނE=<:5fJPHzh0A yC T"!e=D{zW !!D26yn*R@pP!יr) -"zRw֓yBMmck$YFG 048 2M< {YzUnonG>2F.X6P ؃,1kҌ1Js&4nɴjjd\ݭc"N|G(k,!4Ф+r kmwy ΄eucq^ ]v;%m?TWLiwh &VdYgW'UzMlY]~(R{]]GLhhB:* Ւdi7X%WFQ 8 "_Ī6=`,C i`^x0p3 t$0$W!XnXKBŵFpQWwgT Hs-=Bb\!j7HQ昜$a[!zeI3-jհv6.8ELeBI5\JWu1Jf1{z(#+aHqH" ġD J/WG$d-^u] !>AEcG)8M}t4x;j a kE3znGt&ZG|H|n {i[ZRH2&q4T_Ddڦ=1oJ>G#rji^)}O;n؜c[kLTt(M : t|u)ǦXId$ocI#l9IP.mo"ǘe^̜I^hHԒH`bao' 3SH6BVmIhx;$,<jn^O1dNz6  M'M#?$8)h/;i?rAVyd7;C&w~`,A @z2z@fHHGK ETE;r)xʥȯ$qN@nM {vd X9^})~&4=fzJq<3) Ioe&%ei0X߻No&H Aj$\Q_e6?tVȷVVͰh *_If{L.,C'B% EXVK.'| LfdZᇌeS6*oW[vgR"@e]S0sdL6;cdM+IJ 菅ggQ`˄]EY0aǛ/1e7ǚ5knuH׈/Z1"](N.W?\2a/WIp h^ WT񃝮MKun.'Kۛa׫nY_԰Q!o[(ǝGҖ!Bk;) @ ir>~˓*s$PqvTWIy46}-46o`bm{RZSu8(*0ćk ts VB{d?1kH՝G4zȄuH.QۡfQ½rcS]9k!"&VGk;iC\R+֓ZAƓR{B}/{PA[;j F[X'"~*j(,}o-D9_G<ꡂg.ѷr=U<UK:cMbVy0._ @mrԈyuTf>#CSʠqLN^Nݎ4d<FbFpNcٿ PAcC*{.C&#% 84ޑɎ]iLϫ!% dcKh!mx"%Iw"ӓns_9̎MN޿)$ph]c"j u4`6R ]&p EGrClJxn0+AU`/!Y%rWNPmY/5Wywx{Nj<)"LD/<:ogQ}Hy{}|۠'7ǚ]|蝇v C@O=ыci{\RWY( Frf{]`q8r;77u;ߙSHngeB(}>fN߯*Q8ff}y 18n>.{v@Tjd[r L 'w _}S19u?(OI7lsDs{!SKC1xV1Q"Jp)INrױ6z>qӏqQbN!I>P)@bDȞ#&=VD|JޏپyeNH(?b@ TU{*wz>ʗ<#B-1{{ +'b5 tZȧ4 ԙ!ɨ$1F6aQTp[K%mpJ4oP|I,&|Grh xf''QJ k/^}J8~T6~ |Zbp'H?=+NJ=T%=|A21Ih?2!*9ׄ=L¬Zr?Vw*|)^^,Qgv\ rVQuVʹUTnx8aAa1%3,nt,IƓ.1B#P~ _y *[,֤aP!獬տ%0 O]=D}1B]> ]b<]n'ȴ"BJ%aWxR+D/`[@ 4@]w.wӥw'9:K1q YҗvKLTZ2e} Ox|{([Ne'Y;g|v`TRTsX%Y1'pʊsWR6°?? XV$XZdj7bA,O+V}jAE+VkQ6gZ{'P>|HC<S?[endstream endobj 53 0 obj 5287 endobj 57 0 obj <> stream xܽMv%4_Qsb;3wF'^vs=@GGV{'qq|G~|H(||7 M|o>5{Ou\kW?-Z_{jԾo+kO߾O<_iZ@{/_?}HI#~Wn_3yHS_3ׯ4?멟?yʼfvԵ50ׯ7G5 bp?nq} =LINUp|-7s2z(b7s0E ̟veFGBwWx13.^U|V~5L Pis{v9tVK8x缙wu'ޘTg}6ȬQ]P`$"{=0_VWKaܾZJm$y##1IkZڏTz[$TęH OnHO9њ-Wc_(0XR i~@YAxjFeE"N-2PolK^zNCHhG! %Pf>6깧IiSԳw;{_k)fsԴk7ݓ:0VK^6uQCj뼖cK$UcYp:S),Ow|z,ܢ9q\_x]T,؍C-M9[fb}UlrYJI`h=bZ#0 .Qk:q+,~r303)T`vKvy!r^ud+JeҒ/+qh)uqf 3'YGCQХ]:o `M)J9QHl8e> ջGlW*:8ˇy]E8gD5N6"U ݫ ]+ *'ѽELfwA|]EcLd25>2ٯq"Rcf0weua% ya ƫXln?ΓA.v2fm~'#NfaUEI7222_+A~hPnjLlƒNX'лB^0 N7ZKd_+X$y"6SX m+U4{&O-`7=Da ~׍dx:L{-_nX45{[rOz2Wl+gYpy̋PWYmKAツXW7W" (j*Gf6sf o`[,1IYzB6`]1o0$ٸA}_dRqL'`^` S%:V@Zu7s}uΛ94)mVڂě9tΞ\sfBXW7sybi_ӕ<*"sְ|l]5m.S}ʲk.勼 n5&X/"=3R `[Ki[yL`u<> Bu| :-_ƕbdx#buK+}[Ƌԥ<8F0XRPB6CPN t(]j]~,}| `DPq&-Yb/:)jrڱa)[6}U]= X|D*~3X/U|`Z֘XcKV7 zYo錃U[Z .ܸYXd^U}~?X~g4:δ61XN  KXop#U7[R6NO% B0˄Y0Ⱦx(4%%ٸbewݞ{DU¢QmJTLƎ-hfDWCf<:_=<`˖QUIW1X{Ĩ"(-+al[F盥ö-Ӂan5jF NϜw_(#sa cRiAٳMU6#`cNF0"vVS*!v峵*]Q@шUƅŠA=䑲) b^ƈgCik53L*ĄnߺO77"m]0oPr*N{/fD ߚeҸ öx.EƐI"};϶Eju bnW;;3'|fz9"Q9i/EjN/+MO[=^2d "B7q]>_,{x Rc?2,4+To0{3wv2vryc(&11^/rcbLƤ/bNVW1%$Pz օOg$`xܬi`T[e %rKUJT > |䘓$ GKob0}zaAMer^\n{4KGE$nzeVXQ+v8Wx.6n%o} I~ Ε3CO eV xBp=T?jDCQIfPʨ Uŋ_@uR1M&Ͳ '?.ea5R+jN6~VRY:Jge2~ϓݵ:/JFdOvfV%قeÒQU%ؓ'] A&#b+ Zӹ\ih ~[EӮQy.|Dƍ: 81D[303KHLciE6<21Ȇh]'X*80I{q?@t3Ami3&,"*S9+Jrqx#$gcwUxW(geE eH|dMt0@@c "Hj H p K195ew)9>#~4˙-[AFZhKCUnE$6r_FlM'cjKbd|/o*BVSo* k!2%1QȠxmҒL7\T{[9U12CȑUtLC[(X.3-1%}ʖI+"6ZKD4`f5O`u.73`$qg?f ڀ,K e WT񩃱p1yu[ʈ8iTa̅->ײs+17 B#߼g sk_`3O(R~t=Jbau؟C+rtK{Ɲ2ƔGa(0*>̖D]V/sofr><%{LWfv(}ڗ]c]ǖ֙rE'Ui 3=gYgW2Z+X2IZ֨o_}~J#D"!({O}bTk_h$CCWnl5+X$Y52Ho&Zoqc?=ri!(|9|<#Eu1V,n,+@m Q$t[2_2$IҥC,bϹsFŢO OK߱07hy쯠6nl3wˊʪi ,bS,9;oPWq0ody qd`h$>h%k9I})Uwݩ}HHҊ&fHZR;9v/~a \ Q,.E+9]iɇQNwcwWjJY($hKOGV@ji|j0 HLA_pBA!6bid {ux3}UQ*06\Is٪ c˰"."9W73VB"ƩdE)j!Eh] !A^b0aaj{(MKَ@s!"{?J af%{9E Vqy$qjiav6~EsAmItZ~twu.lb|_5EFa[ŭ(?CXrگLz4q {z  QOI/N7 $(s&z4)3@Y`ۤxMfEb=Ɗr␝o>*^ Fq/N-c+w@~`jt>EDEo[\ZKNY5{\VЎ}p/ZW4Lf&=1% LrFa֫.w[U\Lgf8F'x3Zzwr-Jd=WcIܴ>h W}b\mk<$ީ* 12yE,o&s2#_|śٿh9%ܒ (EC#\cEU%w`kA80Zb UTckϿB4_fW,rո/.j; i6V/M:jj %s^ۚ{=]B/P'bWQ([(0QҚ:cJ*e.F 74gݚYch$q@FW<DS*PBA2hmiq`J-Zv]q3OteBZS\G z8-lӀsU^d#ZSb_upkPN("MJZFUy0ns :_~,y a3G$N$PŘ-JB\ၖlK;a~UX˯^j;=-TGIs%2²<"!16? ޿Y1t?ϗ*cESK3ȆMMd$6tfX$OL(zÌ#.zbn|tOɆ*Vh';oo&د"B)FmY w|כ9xTw-4t 6%{vHg.mjPzQ7spC C؇=j[| 1+uY_d -!rv G Lx О(cPB%czL_6ٵ> 9^2> 8p1sm<_*ΑfEh%$vEv.O dB61ϙA mR2Τ43!zOoK~r#Za7HIK]֤VU>{T"*ی}.HNiu0h~s/>aϦEbM&z`mĩre 1jSB?(">1c ⛹^\?ՏpX-$eYS.wph4B#(SU0~Fℂ~?{bYy n7s2#FFm׈s=3un3ِP#`4@8Lfu[GKqEgp}cG`PuBYwX19ztxs0;B17,b\Ay9V/i iK3Nad*OgP1l XϊFZyۚ |$9MXϪX`Q7WVWeb%ȈY3f{R؇58~"b 'P3vq@άaƠ u %pH[z3/ܧ E!;:I#Fb0 SU*5e`q@0Au 0^)&PBSޠvE!Fλ"^%Lf{Kl&uka=<@6O3 ,9kI Cy^jFZؼ">hjԡW$u7 YbBP׮0q4rV0䛭f,9QL8 C֛9؋g~CL3ޢ";3i'̋ljɎY>! Z"=,}* X3T[Q!+#^`vAcepsM ;Vێ"0܎EZq):!ҌETd?]>֡x72ժgk3`mjzuA 5H kf=f P1iĴ4R1P_f4IF\{1Gh'JJSuٔtU!oǿR%wXb#Qտr3ÿr u'^j_f*"׫ě XuXSJB=JJ'y10TgPS9R_-f>b*d^^ā\r$<$+2Εչr3*JAXF#;ΊR \+RL\mR*y$J$&p!65Z=-N "'yp92{BTd/:Fb3}.au2wnp/8u3x? ͅa: vlٯLȗo2؝t̠~Ũ {yn&pLB/_ONdC!ܟ<==qp(A`xZ̠H.D߬ZmS Z[de~=EZGfe4Te“'g)ww}>StMj Iiw&1ܫibcFcZ%I¸I;Ԓ<<sJX2KFn!,9~`X؄N")9DL,aZyD_7pWfldgAZs9ZOY0aZU5s bt Z"ڤskXWJ7D LBFMˬC5WwPw(rդTpSr3  Tq@Mx1UMT\fLyF{t>`|Zyt+`諲V=}ܘjiRΣ]tOhUqg/-{c=1Iy腇YujCkki0\bM.< wi\lNMeZ+@^|S[|̭OT\ \v -YG #S+}- 98o(w`qJފEG"j}u ŷ.Fa"s}3X#djc-髪6a9Ǚ`1`?`p+t4{ŵUJHOZɰ9؍ٸP'q-g:su6=>GH9X?nc Ê.6^:1/v'F?Ct. Da;O8+Qս \" ʠ6 G uΌ<*w. 7"SA ߐs9@"`|fW]fYӷ#R]#bRrjSs^Ѿ@-ΣMuP_&n1m_NU%}]k(TFo.G ^U{nf@zk3$rN?# ƆTW.-QUoК9ոr9e|?&F,] %z{Tu^?rLNrVt >:FTALbb:M4 7nX^abjUp1mM'zӦfc~AS x(GLC96x=O)j)+DPjaӆwORFfG)}37PLKyy"tٝ(iPl}Oa܃{gz .x.;Kjb Ӓ,KKdݗ'/gjVPxfxS[­βMB k={ƴ4.y{IG3q,n%Ml=pD6d3"€o8z&*%7jaTr֪)KV4EID+REitHjl,mp7s/饶Kl,gBVEΛ0\32z-wˉU4qUQ)w/ XN+|3oޓmV qX]ډ-Q3S?8]m8f/#c[>|*o&`7|^R6"M Q|3ר~mí- q7-j]tkAbY=H7i%YdGF6SB׻ `/Q$\x =D_L^?)_3rЩ%靴Py@2Ni /!e=_` "HRR^r)~3w;Nlb9Rp B. 7XrTy6nrjD+ xT:ic Ln`T^%Lx&J`:>oy_|;.f.#iJk#ϳkiG^bP;<-7 b> %LNoI f|3U-lMl_L t4.fnX-ǞdQPؑ30slCOOdNgh0m!bզ7skH/SA(ȃ7s0t޲hR9)qÃHmb ,YH%d h#d)vI֛ 2XE 0L8`3b%I~mfWdN9N*kGg}t`6S.0<hQq8upxU,2.QyAIb1mcfOktb &uT`%ʯ91SoGX{7O}5%]T4:|¯p>o} jK}` fz|3L}n&`[n!&fނ^6;"T6:{`Nay5kS`o`éWPG < mf|3Un)2ٳM3C/¡MNt ebۣE )WCZ(`Y$VZf0t0fLei8;jxWMRxj%(|`9:*F=u\->B#z#ֳ-{jKhFgת:S# "SY J`xeR&#9XW,yd;A # '#{yw)ȭ6rBŌ䊑B LG8[Jg+G2KJE|5 ;Ohk$C$z!&j*|~ Iȯz3 Lx)bˁ^]35BLoPq3Fbо]biy[#.E "o@Le!Æ)fef7~vɇjw3]Ћ:.s4$9o(xt`!=Y̏ÌdL&l.D)r3 7k7cPHpKP(FS,nj SmXa8-4\m$aN`)X mn`vo(A;p'|6.ff2ɧW7O)zs &u}1BS=0$͉aS°< &gJE1R%YTג53ndYD Zӡj8K | s 8P`w dOLN781&42Lq(Q%-&ƂOo-B\LI# BnQ /<LUw9D5y<{I~0Ő3@sޫRȍ؂]z1Wi oWԉ:5ueiC/b80cϮ%fnT#H֨ۥIJBر _(3p T&T5f uw}q֘Lq3z}a(m)|dNmMݾbJ6פUWhMsk*yŸU2rEPqZk沬f%ɚ)|^xUvzlJi4x_Sl U+_J Pu/`8}&ǤWAFXΑs0fJtc-TSn<~84d$ o&WkVx"f9\1 fz3x;J*kjW8#^3B-PH23KO{$t1yGD&uKp\5|uHK&+?xmx,/ˮ`2\,_$s%`B˵yx1:]󌴽ց&gXLGx-xQ̕  wԞNSq7P;:]ά,_(XkC9 \xS0F?K΃1K_hA.}=MC vKe fx18N–c#f%?tKʶ'~S{~Qw%SS>}ޮ&F:X,M 81n&f-Q ߒDD fD-qR#unބMC빲c|P %jB- oKv$ԓK *Mzp={1?n` UĆz+:0+ RY3VQ}rcR3U{ţ喩22 & rdd9tA "u7֗FCxFd;xr1"󢯀ڊ [S-*E?n3Fq~hd( 2bnSL`Y7;4U7pf7nt)f Ld6nם,aViGSv+Uu|jas0ƨ@?3eXݽ$=1ntU3]-ʰN͙'2ɒz\1QJ)In.W~IpY ]KW]_f==_E41\uI[,(a-fp9˝m}{ p8 jDˏWrM UЊOW3C~:,&5׸WM #rsX(o"Dn}Z\7ֳS$ڛ6GP:Wtr}7%t{kԛ9ؼQܔ>ݿ\%+ e|1br]t3U6W*d5^C_*-'ɠhHK>ݩ yoq^/ѼH{㦿-?Msob ޠZl^Z՘P|aXbPB.x8E}*Y,ndslKv`vSυx30M |3@B+IL$~!MA2,aMd4muLU=~{`rKL|-LUb *f&dYBpLOgRǒi^,r%&Mr=7 ^bB턍,a@hVU$6)q]ɟcl| y )7Xg'g{e Nxb$Ԧ0q,fFKk)_ G|AR ;v.̙%@Go^Ǔ{J8(NԴ _1|ŔqSqpEYyJ8kgk.XKLILQE⸐ИJd͜*Xbtv^*Lh4!{Z`V|2>/&ɍrY50T aBƭDshzٴGt&BS](#B6LX"fo$z܇ ?닛q,<~2̘ߥifWf/"@?o<Kmtξ0,7ތc~3w#y_w& B[zY1=)%IZ7Mt\pW+K+я'GէJu[$MiȦ$G Ʊ4r'/`Yg$M,r-_UxE騛));?Kt `Qo ̤f` NN$lٝXz}џ?zGȓ ђ<-9>X29;a J{$n7,TUVXl{5tCYQo5q"wȦE(K"UJSifBUPJ+G)c;Bucב \w/>{h\L/H[y"III\r,Qqr؁EϗEfv,F@珥?Ap07R;QK4'J>f:$;F0eHbtr3-s3EBfe 9Ŷ>tfhhnie$BTFT?0kr\#s]3Lb]M`--`q,_1+<*En A^m R7j-LKBV {،7l#9PJ&ȳRF&; LW0x29z7ez#yWӸV_,X3E3 =AG=JZj&׼EK  ,swnJwJGW?f}BT$8jd~I )$\+tyMz3wyMnjh.;êq9* @-hP]< LZ&I彐y"̕$aE’:꺙籌Jplj=ZpQ䫲` "kZ"?[$9;PsygoFa㌈iX`阣B q)/:$ްHS98|&}+J3LME _)f^S b F;ZWjX7ݠ<1")JdSWML%GD#赈ئX~Sb+YLpU‡Ѥ"/X؞+CP n "q،ddv {Jy Jjbb.ֱ碷嚪Cȸ!69%ė'<#3Hs 0%`ĸUF;aIzajGJrIRSyPu\MV}Ap`ȅ/ {6[OOLxa){6nndUx'e.[׳_d5q2N ɋAU@0I#: WG!Q1HpFg8c }aj0oHFt]tŧwIpZTK9B%[d3/&`o7cTo&ଁ&*9cJAcS'oe´eEWTGM>@)a4_윺8jxϐ)H_:0qYV1>.ez1E5-#uH{:%;ܲBHGxhָOUO|͠ymMTKtSK|S+S23ͼGW 6߼cSaH"ܮ1m]q%ިk5k ܪqFԜjth>?3ϭURA9. ݨtO}nU9|Wr%aQG}~Z,aڵzkLndxpi*QuEMP||L:%֢~WgK+q~3{񋰗X{0L*1~3ժ[MLYG|kGUUh|c5xl*!#zoW,1(wa!#_`EDʼnAC~~*i^%/n„? 5o*:~"{OpViW^F847Ð#eePcmeXo9%x1e+7''4\ݚ)ʺf )ZCs=Jj2TI-Jn/ZҦ Ajw{ؼ Dpғ@Ƈ9};Oܗh ݓx@Mgr"];&01|3w-%ɫ#1^GҊy T]C$Ka{ T~a6P<|iUMfB|7@j6Pbb ^JgUM(QZ T$F5mh9C|fzPz\(iFahۘʝKGu TUj%qWh]-jb6l%!] VttVZ`Ly!4hzĺwHn-@v7VM&ahSnW &4bjBXEhO!M"4?s1s?ֽKy F5'1㐛?)ݺI8s|iHgtdL[GHVV#ø'Uys151-x0:Y500b7L!<.I\w\:7@{*ڦ}>{ץuޒdXzɋ9XPJMgNp07.l iQrP;pNցL}=`i ʎwAe7@U>"0]j*υUWu8fUVYwNS, ?O͠p3Ћ6Q[6e86Ќm;0D;\'cD cwN6M֘gd/!Rc?"L$ fQ<wHhͱRvhl~}ҋ+//{gDp~:affN[thXLWvK Twy3/\ ƣfKrO/i3IvЛBu\YzL4}`QBoƱҌ%ӽDR܊_dXgUJvyԟWvfɁҭ *U(`Η97:KH#LB"Sq5ΊnXoF/2Cqw7,qՈvQSjuSI.kߌj<@t4NIߧ٤UL:q^EH O^LI/fnU#i`{^ fVfpXWaRYo ,mFD>q!c5āt i*OpTjɓn&`/Qu#K2q2 Ff^v ܽ̉ ~>1_IZgɩCSTc_ ƷsisJKw8_aO|׃J:_>7A u1Պ 5!A %d$(J'"b ɦb_OÅ{G~@:z3jfj+WQXJcrq9Ɋ-_&(|`@3sJ--_el*b*6<.&`S2L0ŷWϽ3kHSKdd>XٚXɍ0אC 5io&`o7S/&L ,Ft:!s9WJs%2urA}Zԅ7s;."gZjFqfنakp)g< Yrם N:;[rcs>|8ׯ{ذoORW& ɒt7N1mb4k86@`;X-'>'a3~h/aAH'i|.<xrA XaNAnr>lqz }3~XwV~@\o,AKVT_fiJ34635LK쑦"63}{;A | C{{B2=ou}K3{5Hw 4#/iPlya%0=@8aI7s*bLmiJB ,&3%R (͒!3zNǾOz3g߷wU'LK1En,[,n{[LjqnoֹUg}a244ھZb.cOf8,)#ṃl ȩoט#TJ,!x'yǚ6hRG5=asz3wSɯKMAw1}p'OWwJ;l/5I:W~?y3w-іL pUL~z@cI\/g9`  xd񁋞}S7xW㞰^*o9:CUG*@-n&`o7q:]'A+s8? -|_5 ;i8b+?'AAX0zؖ,yCI, KdyXy7C1(hƩz =fK@<`'?G!2.:G2=Vhduin!*G(DS6 vGBC(it`$D(ZlYPC-=16?b씐XPzWrvyy"`= q8%qzW;%֣KF[iG!n\UgN~PEOQ,Z%fSzTBG!n d:~rT%Kͼ n;Ay33rO5䵩s^>v^O}3{nFng9rĽ?-I!qBY豸bl8ya"|ΏY?sʶ,wPAYPxw{ɒ|:EEy7spGX~0"q^_aEoV3N"T3o}AyOEY984Ë K{3?tFڒf%[el eģ!RD\b ]fK$mIpq]^DƁw7J_ixA xKT!Rqf᐀~xB=ђȒ{Xbş /ǽ?ƿvQB}V̫SD܀+n4G<NPSe\HfkLG`!v/!+,v3{՛C19oƱoL@gCz+s^ԝYtGd8>6ad<'u*Ȫܡ dueWLY ;R,Kz 6Cň z!+^g_&˹.`s,.K2NpXbGPVYҘ7=0f(e8frvF;̠my?fTz1A2ěeWE|h/$!=ir 'a| CjH /|Fs %N0\|6m'Y=82P_,Z_M$-EEpK }8Zl]y=|'Fz(*梋m.&핑 H1\O'Gn*̀勸esWqg+S>F'BSyr7f991gX] &~γgIl]vTR; ,fIH/3by8-Rx-9γa"Nv鞦{6'H>K' GSTz䍊a'PG/ѿN:> /O}hC9Xp|ߨBaY8жeo&ayD2Xߝ!G7sw n&NT)q $sP)0n1@(ѐS\.CYr) xfpQ~[,f^x/.SpbnE>N%(=׵[q:ؤ?:hMjx# aL),|"VόWX…ꥤ;LؠdKHL9EoK/nBCcWr† FJ\yf(A? MJEɾ8(p) :ΞP:+ՉD;+:*ʼnneWs5YKjV[6;0$CYWъ_8Df tvt]:bT:x0Qsڊf< B!?IZ0,eF@#Ww`ŵUԞ 1gjA&)ɭy(IWzˮ5.S(ߧSΡ\ >'El3ZIǎigT[e6r5_{J!0.oST#7s+G8T8ċtJf [P36)?%ӉD|Pʪߌ&vbzE%S$E|(pb gvRΚ*gIefrU f{Lѕ-]8zx"w3|y؞9^e^x!eUIVUiRv׿7 A^,|jQ \F ^vD}ʘkԙ4P /?ݬ@`U7J$YsZ|k;fŬ~5#=S*Є}L8J;,+t2T"D)êoN+Eo0$w0+10xndnf TM%2Gʖ E!X„;p# "!@ C|G>^OR:xl^I0ȈF -X)*=9} bk)G%k`8`N\(1j1.O*bDسy`:'xz̓wcCEj)xRbϟ z0jQ+v7 hP4? 5G#OYoļ)*RnFttE.H`G~ )_q~MMBɪ"\c-w[P*H ldf"*?Ï\ْ7(, FL0u-؋^DOf`R]E>*Tl!7-j)h`g̀ ~M8Iμd7. vв3qK9ms86:9zKdDaFiA L-ΉU3% :7Ѷ(l57(|InOf&g`8@S 7jNT0Tq h Qٯnઓ5c$Ԏ"& Y0D(?,CbL#|qJ5YZIdӢ_QrbdZ`P\Y݄^Lي !Dv3rbBȶ? ZxH:Ԃ0=,=|>O)hC v8NSS ΊpK ʅc.vr,ٌiyoJcdyQgdOQQS wG_0 \X`M4MWQ>XN&rB!9Fbr'l<1a᧛3[0m$e9[0_Qү(re&1x' ƲfϠഋ8&X0(o_=&Vq{{ߨUdǂ1 \ْ$,,Yt{< O| W%jQ!lm]wsNjxDkW36RtFZ0( EHag#)P(NYc$*ԍ ] #mQQt+9J 9tVRLjǭjKV!0E4F`bҭ$F+z;e>; NKoeݭvB*Q9A$ΉGNS b?K/”B`?Ԙdi.+mOPUpZ0V`P-Ō1EU W i VʂzK8.YX+B-GU`<pD.%J:QpJS+H@xuRmXM /pw.-nR~~|*ѽ` "iO PE?0BY<%#(0 P>Ϟ;Uak6i)B0Qa# 09c[FKm?pʣ(LBF)60^3QnzQ e7EG{R+#AL煟(JES>n;1 31i؏ (s1c4H"#)v:z3kO7+Ɲ m1c L+Yi-߱J ̓^Mgv$ɱkvJKT}(`\Rs[մܖ31U3Ɲ81 1=1Q fdS8ek\1nDQ2fRdm*0Y$ܩ-Y*n|/d8 `:9݄0\1`GOS1!pz"+fc ƕɇ &L8c\vc$iEDYkB(wH'5JYS%$tTNS'M4G$(@-isETQڔ' >,RdԔ|oeR܎ +_ >`HHE͘瞆ih9Z ItљtreA,ۓqZVju?mfhW9:[arJ>Άϋȁr;N< ڢ' 0.ڙf2DMkv~AbE")uwuq ˽dr9M-fE]Li1+gPdL`Ł~΃p9ĸ "Z yP?= <ĥK:^mJu9eɛB_5 Sb{vC Դ\Qe4hiqpO'H\ fsu [Z@\yװG nɜDēz!#L"G9IFHkrNM?-IWcF R}7 "jijp # Ձ`&1 `;G 3`%޶8 jjx&kg> fA0f 6-fBF;vݏ=c4Z2?5c=pFTRLN#v(|N]}64J\+y3w(+iq \1~,giQJXYw*7D,54 (92cZXsbȵ7U ^΀(IഷMuˢ蓎34 ӊ]jͩBh_b0O9^Rz$rN_0gƸJ]&` ,"IjLcv=c" X)P7pp'x{ e+L}Gu.?0qY%k >0PV9^c_*;*1#OQL bdd̀c/A2c!؞zA0p~rƬ;FrvVV 4ހpꔞ4ȞD(aqo[Y>''5t"FjŒUΐ#J"wZ*k%ef̺|# :xt+ 6"O RX R2-|$1oH f텞ᓔĈ!XbuVA`Pp߫O0l2S|2 VU 괘3€x+q% C iZ<ެ3gj&Ok%;҂0f=,[K;ga1['IHP%S7`UY&(a$9rHi$R,?%7k`ѦD W frѺ>\`A'3Pr"ePQ҃GAq)bAt0G@n?C JbV ۉc*R4 9co[AZe!ɠԈC© :%:!У0$ly9i`Ef#N x4\o9G[T6ټ0c ֌Y+h`"~=6'|<=0]|K9QX[pN!R(/zAXRyNVzjBuVFq'z4Q38D)g[2Q/NNX0{= 'k CSzn7D2 BZX͊Oz#z/#tn@wcUa<Xe0\A_ .iQi)A*Θz>ެy1y})3U.(qzk m$R S7Pܛ+ [N3r6 *p@ یрk%u(%̵^!=J538de'N$-I7ӍqcaNHOt X Lm8j0B97@Ff D6PG?C T)S |tZ67Sw@7Q9T D-pǶf-m1Xܜt,N?Lg\GWtQhOxJutLi,0ɉkA2ݰ&U9)pVȔԀ̈E㛇 L7Ij$89Z=MmZ)ԃ9~r+M:z`]'&)Z$L aQ/ 880+*#%OMn E9F*73- .vŴ'l{cZp7j-OŽ5a^` @K748΂Zؤc<f efksi=(@ D-8c7h+f.Y%lt ˆ3Ă$'/,pCn)Ce E\Q$V@NsazB1rOpv8)="Sh\ٝz 8]2K|x ^x2K&KMT);xBb,|O }VIBIdxZ(DafZLGX+Rk1AQp3FnC>ѴQe b0'"S@fb{TP·(P*\UDa-S\ sH"ڰhAM 2ȁhMB1V46ŤP+p"9=RE>FQL8, "96Z$1SǩxUGy:R44At0M3b'' ]lW0JҊ@<tb)\JEȕ˃J gwty6)KNEwd2_\]X[d.͏iUɓ1'sb\*bS~70tOHES\=XNl@:M= C\j6mө[৛ լ |f+_!"#'_vy<$Q/2cS$dSPȵ—f2b7o%Hv ="CiQ jVn^M:`A^} 7N[qN]@VLAVިB= ]D!?ώi-:,nwCN뮳6mH38+-tktBLhr̂ ~~!J ZIֆIEbMeW#h ZL&"d @L5<`bdue{]GB9ŖpG@?+vF MSTJn dz3fe[`Ar!q8\$;\R"12k, ,(Z}# bL=gO=q8nO}0INVJ /Ǜ:Yk7ۿw_[:A9~q[qF __׻|O;JC/r ΥP@=λwor:ҝMFRw#l=Io:37%pi|؟)UJ/ꋾJl>Q(qc@#>e*v|߼?߼oȅ݈m澾CBկ M o>R7ǁ4zT{>rZr&{GIoƟ ׻o/{u%٭1`felގPh;k&]lxb8? bV=vNGC~3W dIey7:DGdCyO8^0?[G_~}۬"i i'Uv3SO,ڄw ~q 65ȩHO7iPBkK)F}^'ZBWkGw}gn>3L)?ɃzQP 8mzݞݟ%x.0S.9}<]?k'}~ܾw˱>i8)rƅJd>td"OE̓Öa,K'>gi{9(QYF#:QcY5;|!JZd'lz3f_ko,ː'T^ԲQ*u2i祈#^OC$}]Yo?{ 0 Vq! AA.r6x<4oW:o #(#qr:)(RxcXƚLJԦ:3EGq؉~/WeKKc9ϽܫkJK+w:FNq Mp" o8\x |O>\7^0V|,5NMSS)jeX9$˙b ,݄7[٫M5yauchq۬~.45}=vcH2Nv*:fs@>qbeD~ սaxj(~Te͉ψ8Udsx *ĽS79c ̮'S |BYgzU.QO|l?n7p{J:OD]IZWt|=س} |Am\OW BECW6yin!}%~fS5}:-G?$dfl9Lby<;[<;A,hdO|tDV `v:v}5]^~Ɵvܙ&U_ 'ƄeC 4x1gFQ)Z>p{6?M^3PHW-7J?ҖgfqHI֞v"oTH5MثNWݴT.ƽlrl?ؾLl[o=õ#a3BRf ̪+ϴqð&3u!z50:Iq^n}!PO\ߍiYuzw]9 NJlf!ucg`&Ń%vJ[9i4!4pۼѾt E{6I7FylEEn2wfPg^S^+Krӷ Lc _HeYzŋ0#-~a(!JkĖ_-0; _y&<*LW-US<kv;(%78MKK{{::>)ȏ@J]3͘7|>31jG]o?|;Q%+>NC)iQ cCr}O匏&&GWP#qo-`X5{nx /Aߕ̳a D 4I?%Cbߙ/BW1} τ‡z(O⼎B}jq?Ư)-Rj9:t1kUkltMxy 1!zֹ+:y]\8,keXT{w't0[gQTaJ"ŧdU*&q:1b^5e +?' > EUo+Ky2~}kd5vrVp5q mg,o|g\52HI4.ҽUފ%ɥJV0ug(o\]Ӳ97g4|cM/cى(WZkz; |E':D=dʘ vxkw'DtFΠ/M:HN~ XC42tr/?"Vsbm;G]YU_ƟMPzrdSƤ3M4St턿7ؑCruwm>jeFF}x 7MJɿ=?)m Wޡ_MqFoql]Ɍ2Ǝlzh 0^#x+l^q|txnKu/~e:)Iq͸1A7)ݤn㑜izZC)xvkf9qxNLWDޥ`E3aI]S v{c[5;fa$Ȧ-ڵ[,6sv_lW@=f!m̦$G6%¦W=ؗbU >s 3~I;BzL^sZ1r *9)\ݹNNǍ5V73^K.W%ԟ~TM[A_?k]bt[NÃ7487f Fb>Xw@iq3J1{ E)D&+'LI[qyTKA*k6UbgrKXƹ 3&E"ϊ~a,*lfUiH~y }n*E#uF3"|F)#8ހ&:Y1}50_q]HC^3Os %p/h~6si-Ί΍$K|8k{\l/|񵧫Y#(Dho,eK˽liŎ;y[ʨVmx s\gv0Uorʟq7|˒>ie G̷ZԴ<&vXow%RJ;ӗ_r:TK@Pry JoX2=g"m}׏WuL6 %Gn 1d_mNט&[Dmd~ei!Evc},6ےA\pWӳxQ|4ܒ- =naα-f~SxV$t {'?YolLKccG^~)vz/,:|vǮv{ޓ5ŎgH`"zy3O Er7` !ꝊW|x:\&3~jkقL|_~u.> stream x\mooҿ/-ކ I)M@zeCIX#ᒜܝHF[׻|3<3$}}{|ӽt*9 Fu!ro}肍~M \y?-u7^%<_\,U笏1,˕UX#{EO+3zq\[Ʈe_CjM'?xW~܏P÷A~= u8%-sh20N|wLh(>"puߢV+J_HQ}\A%`n񆊲VOǡ+ixg#X{c_-W31(a 0sq=ފ]CW#RFHAjƃ~V~Yh6Vع(P&vF`6oŜѿ045TX5Yk5u]пT ǰVWj0f>2;$7uݠC3PG5N~ Cgf_0im`ԑHՌQ#0qHZz&IB (kKYL-b-*8`tbu@s^ahf37,V+3[ a'5?e5̘H%wQX!'54jzW )iPϷ]u>2vhYY' mƢj1 dlp.7mʔK 89ܘ([&_ <|hЗ=6|>̚HɦLǮ$^-LhYK3H_ y2;Ʃwy7t6ljDMUd^8!^&~G^HI&hL}4EJsFH/D-yKӦ@gL5IXt\|-r y&^mPY)fcdEq,krn65P @'=RLLfB.J&?2z`rcDKVIB}jdMo>`\gROGK:ڧ[&LDSKRm=i˲H7b)܋ iҸ7d'W p&}Q$^ޟeMxrgC/fkLCTm_϶S NF1LNYg|8K-W&1 +wm9frz UJC4[n7Zp5KԔEoGIяiHq!pK^9Qb?lR,|i% Pzv@~[vLO%Z`' ]mע=}'ar:"g9-؇ǢF~,kUӂ)؇/[>1gcZs[)ݜb2ہ-zljÙ=%?˻I{QCi{UR(+F~Aԣ|T}GL#F.*|y3( |<5F@))˭7?ꥴYz$2 ^]wL1,+,<]rMcQa[Dx)r_ Ōoʙ(Rc|Y`ƕ+&푰.Xw62WĹJiKT2\/Y7)s3g`>!0LOUdu"Ly`z·,; jYL{9~%v6LyC* *%7 %>5nk0At hTiMMIBj΢}8T]@9zOLJ ; SGh8%`dN\4[MZg0:7zΌuIGܴLhM+dz2 s2x=ix~+Hӽ1L;kx)eD%-fnZ8s3mŶ=7$hCN%Y*1_O*1AklؿSYƊbΚdĆh\]v gY01gƽtY:etձ-SwpD|d-lo^b<}5vbWd6?DDp4u'Ș>ykiD0 0ưNYG<)s"lrnY葈x頜 C^7u/]nJO۽m␙_q"́pJ%f}!ȕsk]M-Y[­cbqg9< J仮s[x=QrzsJnFZKNᮟ+Xpv zfw99V'h'"Zl"#nAֳ6FF>F&q7ݗܴMp\T-QVRjw 3@01N5T՚qBQRR)v~ I0,` HaWݑFK')|(7"Xk8"}Nm;5Mi:nK ^B E=tCl՟H _աI0lM@= gіmUgW%WE6I> stream x\[s%lțNvʮΦjEQT"e?߻ݸ6CRlT33?8Z/ͣ_^{;{G">p{x(E=:9{.[ENzO({Z>:yvjCX^/FZvWcx iڽ7fj_Hju޽lϾKX,֪bt/Īsiw7h,uO~(SjL8r fBUjtz1r=9gO `T=lCQ\t.N֎庬:⥮!K5:(W/҄aqJh䭋Qf]]z._iN=t_J5}}@E}.&% Afb.[W==$i4OFWTڊݻZ 0{iW Cm /v|ua"C֊ٝ35]]d.ԗ.jd}^_D6_)aIA-<*Ģ P%W\GzGm^V]i7Erj}} K6ya(s)n_sVyx.Bf`K|RJȲ0/8 %s`p%Wwz!nA\ƼA&ˌ&=L]t! 4^ÅOAμ4@ߡ%8s}L|TϾҊ`]%LR[3/M6ׅ6'R/rZ"ݯۇֱ.}@2r]+vڽ$6wĮ$[eOݞB0S XP;M*!ĠhI/VGP1 우q d4޺ž!3JG 6I{Qb':U LQ[ mEW:38[=U5xt ( HusE+VFSA8 R|oUGm2)TN}0KͨO?G^{ V3C1w7'jꄬcעXx7vZm1͸"4SY2إf$ $ٯ"=m]m%1-_O&Xp;?Am `}Hܑɰ OiM1ٱGօ|`DxtMPIm; mVK`:!5\o$:6ۢ/ۓw&5l'DH$ޤ*͊~kSd-4B{҃]`,wm^]Ot6^.\nj<#kt3J65~0,A0g Ɛa-_`C;_V؁yc$([0;w] _>Nw~{Ł8K(+k3HatqN'ʄ WhLƩ4`fb39ȠsUA }Q#': wը)oI eJw&*^z a~6RNz7}tY[Q}#GX8!xtc Tu8SVLA|2 g{pDfl6w@qs[g{Kt^Ѧ(LMYE2@e{N|15Nl'IBO, _]; IrkHh⋟LIOشW%:Vta2l^G^k#_?cdϭfayY˹,Dt/]B832q4nف嘫D̊͢1.aŀPD P\u D~L  G*4Z>LّY-$!٭Ug$jN]/8a}3mw`FZM!)#/4'jYc28V,Z*LeiZ.E-A(2P%EZ g+ب|WUj"H tb՟g{^J`nՓ=dy]7W^ g > >z {: ̓Y7j1*%tidAZ_B첏lw15wXJwi{Wii|ĉZ\P}e+$D0Ώ(w MvH(5F\Yݘ KM 7Ñ1#\mR_v-Ҷ ̿/#$j" 1VQ^o]c /(kHe@>Ek[|ei#M‚Gy\]'ћ(ɠf{"CʁBo#L.r;+u 9LWS)h;BV>NJq?EDZ| |q>x=UPeJQW|yHp|_9؉`܀HQ@'uHnˊB?zq7< '="1"Q!eEX`50rPmP`7[0kd(qAp@jS@c.}oa) y`Vx4m eBU.F=-݊ c5:Ab_VvF،1LR(dұ#Umy{\eLhxf3FJ&61H5/ٙyK1(^|0OÈO3Ic*٬2[`idZ J*^2 BZ5?Io,8Ǘ[Łu¾%!H-4!{PF)TiۅrY?: ( D>US-vid|ʹ[2k̮ņK2x&1֢@, g?]֭ 8fFXˎ%]pPFkS~c\秹cHXqu ILsE5/[v,/R}:C$>pCkz &lr+k>ր`6x-H4A%DJsj ʸRs(cS!sL~g*c/-;XL7,k O5H.fV%>-;F?B2 |cR᯿M"A_'l'w4^r-]S? ,"}i:ƚ>qJ"F*LNZJ1߮q{9Ħ1-Zl'm94ٕ̈́#!'&ʖ<ޭ,h=O+<U[5m QDRg*EdvбE>.孝NMH+g nIvBR)ʻ_C[r`)꽽aFS"¤ >E,08 {M|v([ {L5M ,NJ/" #_3qO#L5FA[0+HdwRw;oKMLT9CARޯ:ǪEliJ09s0(@Cwi{=#J-, M˴C}]7mAv:U:&9l]CSqÆhDUԉm33i{チIwici"X܉iO;|gt)Y3 Fq= e]Kq]]a%wE{4Pv+vۀ>8"^^] XIw[vZn֝sV~n+Vi?m[oi/Wt 99oapvJ=8f{*.F2zq2ù(AGmx"y8>< XߑB~KIL˘XЭv9.,DaΞW?c?!?ϒ@M0ZmԻrJ--c3Iu/˞d&Id+ v([E=Sz%FJ:&{<]9#!Zlu }})Q"+xͽ}z]眏y^WoK{ HWV7@EYZ$Ar莵';,\i/O*Z.ҿmFmU-~A\r]ąf't2Nw'_XtДW.5׻[520[C)LsSTe Nciĩuk{kFFՙ )_&;@oXp׉"t72g)Ev D">LHM NJۈPRןW'q똲g32*0_S??Lo3."%ÇdxZJ?\;/^JaR}[wJRقC:j.U-~}Йęe> stream x\Yvq_i}-c :v%k+:Yp8:z3ˬja'w>W'l'l?^lB#7Θٜ;#=eߔ{BErjs{;ha^zq uB}nzz4Z YN^նjnv{# Ce_L߿!~sŁ/0náCh WoY`nc^Hx5Xv{0X{,Yls!>m &Ua"Ţ Hi5Bcy/}U^{V7]KU\#8oNvr8EH0|;M &+g2L w.FU2gL*Eo Je̟'cJ#k/K&ɻHI.ݛmymItbO[=7͋nӇh{$#12Au&) Z(}TDmV9CϚ3d!p-]3> ƙ :SJiQtt~84"=qJuYZEѐyE9IJ.u?8{{nʩ~Rd;tZod P“Inϒl/doa2|ς] g36jn*[\O+ (;0dc`rQ-@E+k0D ^oN Kl]#EllwaX-錩E\Jxxk W@ڨgU1*ߓQqn&yڻ5hqWl //ª0NWk` '~bQ@K75+N/'iEfζIɗۃ•r7HH# wxM1NPb|o%σam'bwRB{6ZؘA$au*o)xs )ymJ/kJBU'8҄dfȐ1@gWJJ^ì>xR JPMC0 >MG¬Iva"VGNGupgA8+L]i[|>e*% /< yo'q6/m'D$W@p7ri(5afL`AtSn-0w]jNWXMpL!Һ+Hv!>+}O,cwL~+?R _=|5b1{i-HE[C/}:}r-?,>Q$M2>oV3{]֑aiMwCɪ(.S! о20T*])/ujx1Be}2cR?:A2{9 FD@(qw^gMMCny®2{^n"kTF)7QBSj◰~MQuƗ_j,*=P+؏er9b?F?kcIuǨdrd+`G?{-,ǘ]X.[7rѪ?'Gq0oj=H%eq,[ZOXXNC?v'`ٽ!j#mEYP]։wO8/*,i{ZA`]\LO5Wz#č GJz5&iW[efOuAunv.| V<5'eHqW嶓dH%CdV1:0~{Gc-eRd0Tz:}FX,fMgF>dlԾ@ ^܃&Ø9mIdgV00M`P,W:4e/*y4)SBW4l{mv(~Ն pCXCMl.{%Oa63@w(R!%ZRdZbl2G R:pCő`di.qfmhĮ bک̬u+P̙\TaR5IjI)Me>sIvXHf'h nɠ dA¶ƙbFOl͕d2OJqYԚn"e~9\7p`$UŸS2m:"Ic H1_Kq2#{Ygi6w$:^~@MB4q*! `oW {2 sW0lvp:]fȈ,z^0VҶB[ue~pѩ{%Uc+g% a|Xd9rzSrj7Q3\zL45޹FrlΥrxة9/GOzV ќE:${/r@zHt54@Vzȴry~NOv\Uq"G>Y}~ߛ5iFAkN1RZMh]64;+22~!g7aHr#b0HT+,FA>Vp  o7֑ب{Ol`}zwg5"" zQnBOjөc;LJHH?QDʹ5iܠ;[- ˃Zǵϲ泳)z|Ro&E b{Rg$1їА؊i_ѩ+j{GΎk$aLS/fE꫙Oպ?.^c2Z@FLϴ0C57||<}zi=mU5=_BfGJJT`W^V_&J7Ka,(=k5ZqOO>:j6XnMX߭΃o;mɝ?oN?|tiXmmb=lx E 1`2$807EGi_dz%6T$@dޫc;D<ƅ5_XT URVgQqo~#;/[.Jl=312^0e X*PxvZMbG{E( C"endstream endobj 74 0 obj 4788 endobj 78 0 obj <> stream x[n%Л rܗyC$3ahiiƓHMlշ l.SV:</=}q3x@e>Hs"|Wk p;XI.f&5/:a.#V5NwRMhNӺH6^ G `|IKaBjCؗ,2I2ܡqc´opg!P@YMKrZe^Pwr8뭵hV9d-g{ a3P5WtLؠi9XƜixnA֘qC^wuYu-;f1:kQ;FX[5m\+-3%RH+y\ >%}ip[&fѡTO,8gsIdd*G/c6ϫvSݶ3P`o"39T$n.&ύL;H@P%DNʀbFb:oz_e7&%& N)&F(\kqo  X 2#LV U(je߁UE\yi*KQ%BvXag0<=hL/]W n.{bf(Hi4p$q =]>9X,żt$ )Ra#ˣcj:%1R7s|6)|z^f {j"  燌+sƩc,C8o/]?ֲÎ AՈM^O W/=)!xYsGekl;Guق'] ʨO:)m)₇՘(;iZ!;K&f-*N_F\ QR&B `=2F*tWǺt -Y!917kBB>[|_JjȴkaywSQct!. JFTy40LUn7 AmOokemۗ6S\}l?fe۵qzd: e̝ ~[P=>aFh&tժȻS$}^p5O#d vԛ2 nU$&&2O,LY.̂ Nb]U?*JF[?|J/s\phj-%q2.9Iu"vt)k6|Z '[@Hˊ$ĕ+XCҢU畺壎\a};]D^o^B.W]AQh`ڭEU^%guN{wj5RTıXn4&lO6ч9y9Y39ܻ j$[ʡ#B2^eeщWva)j:#i3cܨmJ.t ykXi>BWbȸ]IN+wU$d:O^ Xθ<.%@J㢫4RwX$Z8I e;MY(W1=f뭄x)z5˳DO* oJҙAd#%=ڵS˟(aab:óy ~*O@ttE* $ 4 ǽGB7?ȱr%9|߱~\vkR&,}i9\{S~f ^w  $i xZӻ׵r*{X>;/LjAo_PzI0#?UBF@]g!9=EKFd$)ʐ(E .%UK~OHb;r}Yٵ󜭒%j _EKԣiC']4>U+ى2Vі5vyDMn,SߓH &riOS`djB=,C&O3w#;y0ٔ;6kn&Uk^r6 Kb"q6l:]jܗdeRdadR4xc>2rvVtO*YJBY*xNO>ݛ)VڐM. n[wHn}bgY7ueټ ˇY< >dh<,z_<Ճ1i0,F~YׅH rD!l2q|?Ү-Z7K+4yQNhKiQTFEkҔl_$qCʾu83uҗ- ڂ9d%{:mAd`ec%ɠE'vo.4s~endstream endobj 79 0 obj 4191 endobj 83 0 obj <> stream xYYo5x̯ b7@,BFȏ`TO. AQTTqc97xcs\2Esș3(>{4t/Z-TԖ} L9OHF5MI疪%g^VbFFٹ RĴqn"H6.l*;GԒNNRn8pC_,cK`& .@R{0ԅSrei5T`>vQppj8$ *9p8UsKq7CS>kb&AMn-xCy؄> 3e pDLW21V0ć.2PȑI#_hV$p_qgZ@ :@/Q?š"|TK'z[A,K}\MP՜:ceɴܺ9&Q)[3Ɓ !U,Q%ʫ҉fNJhrjgHW(JܷLApaq]TGQż_]W$6cKM)$!:*3ǵ%525km\V0-+"v*<3`#Tbjł0E9v@]E)bk!O!fqCpjGYdAWLЍ.Dkmgi֠G0EҤ'EI I<(f.oBx=!\QV263jV3 cVoON?|Y`2 3E$ $9pA3 w!M6~&(p]^ZoM a"8l0o{7rEL-"^-8:TH"0mDjۍɦ->DlM.&kwԐxƢUECp.,QIvee]b0_]i0 Q"|8%dGB&#`nLJ X~ H޷Hp.YV bBՌOvMO}[rir,o:/"/To%RSiԕΈWZgaڸ7#qnu)  tZm-Mw4l5LD4lyغ}-j1r]I;Z͙t]r^<0% Kso1 v9LX;|d'knNDT"G?\w"x*-¹EpBKpH<Ekia AFZ8=k S%#"I0ߟB͚<+ArR%aD!K|rc( rq#It~Juh}8A[j Iu?2%)uz䖞⽼'YUFď,ư] 7Ԙ74vQ}=%O_(>>-^R3~N/sV;@rJ0!f%"#;a&ƾC= :CJЕ%|COF fL>o!榐.GO+yDMlEHJQ@ܹV~qz=3-endstream endobj 84 0 obj 1976 endobj 88 0 obj <> stream x]{oS(D>gfѦi`m,YaYeɶ{CΙvar89$fO ^=[w{̓1vK9zt{R Jwp`zy3v*=W1}#|o(7o`5nw)Fk6}` k3Ayo{1״Cv4^o>zֿljX6c#do7A3u #% "$gi֌yZ2B٢F5MϦ6 lFLɩo j컯Wȩv_ @}aj۴LI@ nFl  v`cƇƕ>L]!,~66g/zVaV}x;;:E}|jz%C)|.jgd'( {UXE4̦+*O楄jKaMמyQ!vhiqrpa`iMtpbPD阦Ϩ0"9k]7AnZy]/id^&ߡPO2G9mwRפU_<=|A}N7DAcU^C+gBDaJ4$ =Ā(!gkt=zͻC9jp_D\mQiyMEƓFG>)̠IG"̀k$A^/NwzN5,*Q6ZJuxX(~6iˈ̖fD/-]42|M pƦI h!!+B=D<^ (5JNLJw9wU`yPt*2'޶lfB|dvA$^4rFdQoIPpoGX+^e@@?:$Uh xi]DR+&'=2hiP=3dN!; `~BSd$PM&gS) XAf 8('IH!#|W5Ӽ#{CU4yH9|37J @p`iԐШCej6Ytろ\f](y!~ ݥdbr&CC'@ƾ Dܤًq̠UQ3g! t@Vf@ ^g dy\s)B l+DeHߧGmGDyޑw)d6[1D#q[#z:ٙ-ا1,!֏j?{)me %@Oh`z~3b2JIm4>`W! Ŭ"D9-MF)t೿ Oq#$Nh"˶_R葅!vl٠pU4{Gp%G\1fr!@hA߅J:_} oCߕ1ht9~M<ͣ<qR1]Y?!킱Jntɾaϖ{Y֣a) ,`^361UA66rO0뛀-#?҂rQ/Xh>.MJr.+2p^N6Mw>}nQ:P8F˫"fsICy35\ 0z`Yc!S~6gy','*/$p5䧿),q )M0yNHaf.d݄rW9cHgU6ilS8StC^ӯFJ'P.L -0xB}t \ҦX}Fb39pX%Y%'#"&a W$-LpW]cyZ_pB=ֲ񉦰Zp]4?zV|,]t >fj+ZzsIf(w|jqXNgC*/Uy(/$@vВxKuw-ߧ2ހzSݫRskp@`բB\y!ⴁXha67!& ?c䧗%a5D8+0aH*5$n(zlrjkFc1R۽rgωWgDAsVMRE3%r nO<{4Yz[띩<8V$-T?+7حsfa|zSw"/"OsKxx9u Te]!/֌E{ӄcZF?%Xy2giap P3%e>?Iw9xDs* g̠g2qN O7{3Xo揬B$uxgMm^9KތD󹹛{"0nǜMWg7[WBڦM5~<$ Q .(Ѹ |Um *|#hG+I kOJ_7L&V̞̗ F$Α%xU -9tFKo &dZO ۩4~dOFZHլ~x[4y0L) 牮2J~gOS=>'wzAW5^/v'밓2Aq*=f)i|V0.4OS7@|(l%y;cuk15;]S3AvL6iv풳wOo{< roB~B&ꌮH3.nmrO,2X<~ͶRA9E8jw?}/jUi33sWw\6j/\RDlL@\O,]c) 'n6?= dm2)c{Z46IRvmwݥz~FY`5jw w-q~䜈ƻ_l$.ߣcxl73t^= V띜lp+"fe\2Ǭ0`/1ӑ|&+qkĮ= ܵ'5QWU:X^ـIM~+. ~Zr&ҝ2šN<Χh ]>M4CM9u:eX{PљjJOM< ~/J>.ZEn/""GMfL I~V܌u#z nJ'\Q;4W̢ey8KثPsV9u-CHKI"N&^:S[/_*C<|_"X4 * $;yCqJ32i'`E$ء"y>BZdQX]{~ I^bq<['oP&Zbʴ<8D٢,OGe8ZAZ}B3jm 5G,ͥu 4j6Ja@ھ+-cU.H1(\S0w -HūKFGbi>fnh­ Ií]>JG-'D^k@6DμK ċ~hdKnᒆKet}T;3$CO&xqj0o:&IDS 9=rKf[!`ohO)JMgYG7 !Gٳ| p;;(Z[ƀ"Os?GcE1 H_gDA=*gb,) +*D7 REW V&վ\HEgL-$Rkz9K\um"7+榟w`}D;sax-0e(?NII9!u(\]W\ P|nZ%rugWwQCw\F|2 d] :9Vw0I_oU8tYW{?y0y8'ښɳx1CD~?(::,] 1D2o({__c|HU&vAq%%Xpr[ûZ ~G^+ uE} RGLE9VK>l,NIX  "a )QV-D3ȅR?ɽ/ęj)ZiC5|e9aTVZsL'Ev4tǧNN3d#)gms/y/Y*H_Mw;A^o]1)ap!+;yvu-X;]Eπc}w݀=\~u-J`QS;*{{r}ALgE3'C۩hn.!-"bn$u꟰'oO)DfwY$9j}b\YcQK?zB}c.]+W!0$oӅM}V崱knbD["ytsו2|4_(F%(ߡ3+?zH6w5÷nta{'KN|R< @`0{oZfƋN]8X 'SkۭwevOg]ܛ>۳~Xd'5i\ծ,h=Nni<>endstream endobj 89 0 obj 6321 endobj 94 0 obj <> stream x]{o]S] 7N>M6[hwۅa[mIJYJ|~;gx"wG&!͐hь=G_>?ώ>NLbUZđ^?*ϤTGQGuci1?migg;vټ¯y=6snټKmU}d<ڊ+1Ex0^L* WnҠr'#2 KNl>%|%oX?aj$\8RFNkh1)6*.( pVK*ͷ6umMħ.jʹ ƿ߽͋~TCEi9^Շ^,kN1Yť2-BQQ6O+l66E|^R>_ 6 &,ad]vG. SF8Q1:UeUYuU'7-c{6n=@GU.j6bxrDV}d>]KU.F3G=(w H9sd iS9OJc5xSGMW\xLGI#a/VA}>}q7VUf,oFdfzJoBLβ(0lFoS;]= [~6?)BMJ_;Dk|$0C.x~AatIis(䊇{,6W<j;yBˊ ,`_~w2^BlRxz+`]d!*ވ#p/ڙHpu!v[< D'L dK?rD+qԮ'IpHܽ'\g6I~K#Ѯ[=“]@F,]3Eָk jЂhEuSVQ~"鑁5_ !uҾ8қIyN`aJPma}\;PqHf.yiz1^;DY(1yG-<[&jOL:kjW0;EO,D;Ρ9\nFzt`!^N-gtRzwRIIIKmkaYeypb|gؾ$~_iexW{U;d5BCC,S%FcaؘHpv"lzIbD c(*^uC>iӣA.MoT)l*_b V*U#vVkjH8Vm-t18Sv%'6#ZoxK \jmmF'v#X= * Oh0OکȦ BiE3hZe}JЭ%FȸYFXa$ 8vQ.~ᚥ:ibB( =%Pf? E,/R+""WF f=O [؟uW5BO~.l A z ~ m+I@Onx(3" 6.K4aӛ/Gm|&hٖZ JV^uĉxGPHZDjdIz;avʎ@3-[t|bXɇo..Ӳ4\!yRY?8û*JhmF_X%fy{Hg\UQs| o;svVf5isZ)M/|T˺s! kňM`xV+aMeNy֌!:AlӑӬ?,'Jk[D 7lLzGqh[2&ÊxݰT{n0TPw^~D2e.NSٓ;\6#76kfO崲Lv#X -_h~aQW4 }'D[ U,}v fJM2`X6ٗ\lfWV xWȶD{ e $@e֭\gL0Ms|.˴AS_T XW>5еQ^ELHڷ8SLQS ?sn*Nc Fb1v- KVYcҹsTTM5 NQ Fajá9$"yhGւ0C{TFh5'yR3Lr wIa]|6| g4k4lF- JM㯌#QS?u0Z \:ZjZ=|r~u[?|o,桩[2 S+}-Y[< :/< ^mғXT뻑]#mw.}Ul;avsdMs#B35L!K3Y&ywWi/))r<:I>ygnd/ƙUW5͔yٚX1j[e:&^xM nSPƆ-1̸ Cn."p'ޕ]p3/jx+@~>B=!Q"{SAvNOY>J%P/*i"ע \I`^`ę5INEDK<$[MUל5J\k2qÆ5u-,/`YM^zrȟV ?J9d#uBk$^9JјXarߕ?J%? ;Uokبq+U؂˱v,hmia@ˢ"Ȩ #΍OWY*./,KUg+x+IU4h܀=5;rI/'.pd[-׎8E|usu7t LtY ck`J8=%%,YjF&2s)Y:0v{@GLuҕ#;=0E:wN1G_(g:cqkknbqw_o}A R\c.D.G;ץCd*_5ۡHӾA򀝹`Ûs)* d0$?ValeQx=+ckA.ו8>kG\Eۇ8}j1\C ptVC/9Kg#/ T=%LmG\0E um!s" 8RR@݁ՖhS`q4g-g]eߖR(ex 5j?'G}Y?*`ZU)fk0M4r{2Mc }ZT?$'Us9X 2/,D:ʏr"$m0z umȼc[|Mm''!#X,d(U `ΪgFR{{qn$"Ox[OJHN+_[m[Ik?}ĒxYQW,Hav\3/1*'))_.$.%ܔ2O"̆!͵3dLfu:iJU..^DƇ#D9|1ю[poo_9򖛀/8f7Hi\~8ܯi|+%a f\ #,D~0\=7O;z0Ј;|':2=<cx)!٢Ce?ffH-Z3]CSnizS;.Eo `1l_]Crmet&^JV+8vͥwH`IaAAkZֻږ;щXG.[hn#rx +sS#^4k^wn'/s1Og7Dǿ+޷pC `? e6a> stream x]YsJ+ʎ>-ٱRSTJIrQE":DHvz傲K2c0}SpBWW'NXy*aًJBj$- s(2J.WgoN^F:G*7JfŇjSZZPÊFk).51:'Jɚ'cLh-C Fג(+n1/_7YV|PUg/ `\KOl%'&4z"R"bIjaocuԕVY}n}} >)+2G_gGJON,/t\JtzrXtcG.U(gag0KmULmD]֕,"->=uWc<{W5bM€ב "\`o2B b"$S!tc3Kw[-,a ms/4?xxo㡈<;B7ZV}7:"j)gO"vnNr6s$8Qh\zaYIc"ME E5j.#FɒgJaP:ë`^4Ld\9j{^?[P /5zT!FtC3x_ۀ"V)R=WM\ߑn}d;~E*Rh[mT/O2e!Lh0!9,ُCHxPCK7Z42R I/Vqv ^5#k5…^2ZmrXތB"rI0n zfyI B" )hrZW7bΘ~^k&k89W1`b6>6"˂qon̜C=}`Qb& .jJy ?d%2g2P> CX,d`HNB2Y#Jl; S ?hi͑__OKjArI Mr0ofB@d&ek01LV^DaW{^i(i"K8\`4l5j#3&kᝤ;{ *sjGe&@EZFVTiս*3T2{ -zhx9)}/DqcX Fm t-nDeT3~oZK0|X1Z,qU/- W`͕弞ƒ3Y0`ayr(cc<Ճ:૤X^Aeid y[RV$S;Uʆ&bƊ(%b艫]G #t.Ҭ0u}̔%I l@REA 2v]FQAL/ 'aBQhi}bsiH#pd+v鲴+cnb5ΒNpD>hё14Qєpm5v]!EY5*b,Du7͝'RMPUpnh9&w`L+T!7?c95txYTo l_&g& c"lMN447+.VΙ& Mc}l3gV;[֮iMe|c$S'YY詫a`nUHcCJ'U\G6vRIpCmZO`ŜWXm_îYX'D3ڦdqD.RҤ UH*Db %z.GV-GB5I y'lÎD`̂m.:zM OtGqYݣt3 Uf4]-Fܹ?i )>X&o)*(%wZ$H @b|3Dy~i0q1|Z ߠZqL{ˬDSHP"'-!rP6 ]D{3詚9d2^A~ BX&gm |+U]╒,2 | :]'|]C-DX|rh /K·r~:: ל ͩAbO^ҨY(YۜupخUutwLa-k S؎BF mܨMfh‰PP[8Z0%_>7Q2uI=D[^~l.T#_#o3($]cuF2DU]A?sS"ц˭%:PRX:̈ '>w9_=V8j27#Ȫ氬4dX VϪyxT6gXTځ|M٢|(<c0g>'qs<\W ZdoIe{ ONRH x{nNۯL3jÕuE2arաB2Z}ѽiHٓ8;?(eOdۮ=t s6Էvm\};mC)sb%MsSP? ͇VTMF+Zʇ|Myߵ9ipln3 W̄}UT:~7t\͎}.x"^8U(U (> stream x]YƑݶBo.XɲD{ko0H 3): FkZp(@!Y7qI}}Wn컋q;ś .ؤ?߾||. n?[Ej'M9'87__ekvzg]Go^8Z}^.wgKi&%F ?OB] ֪I!?A~ӃVL2coӓ~D<^``%_05gX hVUe0f^90FJP]HU>q8s&7l뮛=(m%,GW`qN~rwj*XfѰ߭ }SϾo@u'ɤdyR0Dyu7ay x=I3CxWb1#4(z~>Txҥ4z"Ki-r!,C݌@dq?x`4fO*'Ert yO2O"^mKZC:!(i== oW^ճֳvo{`{@oR\JWwo=` <<-Lryٯ0P PppIެHF-e^!;6df ]k@fE#LcX=̌<^Kh  ՔY8H)ä QPRx%&i9 @M}U7k XQĎ*DY(`zBȋޖe )~_:a,Z%]=J7Dp\.Po{0+mF szY,,xI>*X9)cf iJUkhބ l!#Ef ӄǑAFt u~!/$odLy)mQEezX|>.qPjozM=|5\Ozx]#wЫ^{[@X4,ZwpKd{?FTgT`ވPe(?Eb:3TAO%ml(%uX~'4dq+&(DMfU~\g߈L4G}EV UT Gug@tA[fU7Bp۳KP@.҃b>,Jgy1K(Jل#`iuYo"A,Z׷0 !M 3p3(G~`" Vϐo#h_K?"uXnJXGHX1q\;"' DM9F"$ަF S3B4X٢Ͻ9w*A4JPC+`F30Ǧ=]L?S"1t9 K x=,:  _ُzTN#7CW3; Vm1BЍuޢ Qs W;8K1 t+Yж;c&WvKGZ6uWOb1OI2@qe ijz>[yb._Xr[><$:00]OqTFIΎd^#DgDUj`lnR $!1)@TjL"{b;1ARD+VdsI*ӹ@5Yz7].9(P&OmUv *%3Dn$CZ|+{QC.ұ4AH^oF+|斡Ml:2-)mhc s!v4YH˼zzVw>esNm/LގS=K-Ǧ,TٴMbr*4&&tf:Q40+x #vZ)"sgZBpRr{*s;T;7(fz!'PSo4+Is$-g}4ZĔ5"Z)%==`/1D2jҌ&m2+e}:(*eז1:`mB`؟DDu%񥎀mI6&b;O~VH)UϗsC18L]9,*v\WLkQ&PrLƎ_՘Za|uH:0Y^iպr^-.*Ԡo Z\Ռ_,RzJ%IW8!SQܪ [ k|#}|!cSdxRa\xOUr.a@۾0!UXI%k K2ٮ\0JIu&]SGuM$@Q*4pcep`2DQؒ 6l2X\=R*<2<ƤlVu vv,rɶ#s+|D(l{Cy:5.ؚ5@@R'޲b1[S2R2(,D˾1ԻT0nTZ_ul4"{b}{\8tY-388nLYIy_Ҥ•ʭ`T8ҩZFh ͵.7k‹V]q KϦ"Jz+pE[~a%@aܠ浛MJMf1f y[lڍIsbRhMLDxy8G LZ ȹNh=FctҪACw6&r"I>8ю?3PX͇\xT9:nWPjbl*$D7]GXt>n&-y4$OPMIN{*scP*nܵQǨFi夢XkDS~0jGHVNb 2NW!%uTV6 ->i,maw"Uů*lLPfG"ڛFr> !qWs fӝ-"DL %$i9m"iI$R.P pT0^OFEMi(UL]𛄉L-x2P:n.;T .>'F\|{_~}mp,ypl@=>Vt$7Y[;|R*Џ(OJRB92iCyB5 q_n1ŹO>3])5emN7i T2h#18cg :`sc xg93m|V缤I#,pEV);#r![%==͝)TsbMz>Py/v #7lzՙa\9b/,S akCZm%G {l,{'~_if:GٹihFHGٙIö{!m 6K+{br-3FCwZ+eY$$VwU*}3RBKY@Ij/f圔Un/.[Lf3 h*ܰ,.0x>3mQ i+$Iivվ*YY ٰXA;jd^rd«F(@pSju`[U1˘^|fX^P?oöts"Mf2)m2 ٙuZ`܄iZ MnO'?L[ue:/i0M=߬-[{<[>LJA(ٹDÓn+Gʡi,z,^I Vʈv:^L[uB Q?/i(mm#9EGl%>6?iey)RM;$?c7en{Z99c25S7+N\QAyn2mh@1$g&)>JGmK". Q+h ɹ*78zf6d(5DrӨerIFlR1ҼߧqYӒ=I'02&yz,vgMFLٙ_Xyn2&duC>@/ xAN^?eNvrX<'=ssUޮ;73jK#$Huj}?|muPz 7JF\kN=7og(;-KWKdz4^ ;7I yz\dWsu{HId{g|| ٹLLȴ̜|^23'2N^?eNVfuɸ 㫢MfdBi|^23'2N^?eNƠ%Z ڜ)Y7*}ooT:ΞmwS06׊ncIC)@Uo'fK!*UxlD@) -U^:X>Z^QA|J;zm+~^"B"xl :8ݷ??#ӈPTyRJ߷|d*:oUU=QK/m][yԍrp|+۶HοS۽1}[<9ZH$A+W)e>,@tOp6L/1^D=GB-(3'=b|!sj#*/Xd=nrP}, rf6MP=8h?ƐzS9O<`sc5 95;X:T<άde|CۑsOP]S~nr Iendstream endobj 105 0 obj 6305 endobj 109 0 obj <> stream x\koǑQ~7^'17dq`P^ E"i뷪=5lم 5]uTu|}$&y$O_y">/|D GGu‘s<27GMNp会"7nBLv'뭜Pzj!-mDjrSO繽vf+Eԛ͢(v1~sYۿ$<| ςuJwcדWnjD?N4`CNaHYIG}ZG%[iay) pTD2N!I}MwRUQ¼N3pj2sąP&JI[é k6#onNټ +wp^;3)]dYd*D8K Nd{:)8jObLC6kTtTAgO^\7eיa2t~XMإ9gKj/n4t't% QyOkk)L3Ji=CG5ɝ&ڢ)ct=AQL~餝\ɂtY~'f'S&-%E[}Ufr, |&D"޹z\%b#y]kkbR{͡T8eQTo}lS'#W\_۹\"(L[R\"Ϥ.Zgoa_?)V2^G@( {PȨ(=fWA@c#q釯ŷ )q=\IN@i7iN. ` ƹTճF.Ӛb@\7)ǘ{UnŧeF$3!Yn+tًxR*}6ihC*>ghAG{5£8ŅUB2&nPm4;DqR8Ma%~s@Yݠ^G̎_?JVXBxTDY/'5xU7ϭlϴN1.ULe"a,!nܯi9 bnt^E>.g60kN'=͖X -y۹zmg}BV!ydo*mj⌬!X=̲݀p#zA!Cy ? Њq`5IgE)Hmv6dɤM۩&^g^~q g j0G'=9߫o#Yo1~m d` tV #.;:2*? -UL$֌ |OP-%U m`n0 F#B\eJxيgxъwx&dzF>BΎtEbA|}i!$Z3Ԭz$P GGUShUwxVY&N2vcP5/թ^ѓbǨ]x"ccJKuo+4e0ce] P;, f$M`!j_͈6'DO:f mȐ'G8Nc2 $t5hkJmHIIAv(1OV(ђ޻?<_Mb߱83/&!|DcRt?!ȓy,!&LrQa!ҙI@2W#EMZh 0NG=FZj5!Kߤ$aLƸ7z}T.s&'m̩(MveJ) K3U'™VJyH[(jO"O.(gRd;fTj٣Wie2ٔx 50lJPz%0NW+!=8T[-&6 / sS*KWqVouk4dV?FN{?iF-YbΖ=C|M$ :ė\sߟoKg5O6+n-IBNQNVq5[6*+=5ly aE\{~r5f\H `{8پ[g7sh (w&lDIםH}HOҚ5QJѲli= XcW)ӯȫpQ- }H^0&Ԫ1aJA- S%rB 9KH'ݰŜҗkO[f_~;0{P) N&Mr HBoEޞ~7wB ƸJ8 s(B 3-O'aP$pgGY]#,m\QC"UяpnR8Gi/{*5X"L5M$J_kR 5 @WUd=%>Wq$ V28:VާLERCL}C4=/٬ A@&Q; Db !) w{ OéL;9j d&0(t8`xOLr<#90kwLoOkDA,iCW(D?bMWMcfbm6.:w2voZ֭X#H_Nևʖ1o⤰ |W,Q$^C $=0գ}jXI?K#^OY~YVTl.b{-8pcITim+V()Yo1'@\<#M|*胗A ~ ;[ƃ}_&ʅtfjߡ{nYկ|؟-b5ShlQF2'h;ܸ<ͺ.wjuK6w0ܓ|{̛1HerVA_~zӕSf71  >?qCK,=o{؂LXk#|!Ƨ]4$b jTZ$LHv +.WG)z¡6苭=@VYX@ai!FHI*h-ݐDY}X->,<!>V|o=~EE XH}7fpp1) HD-jNN7_endstream endobj 110 0 obj 4643 endobj 114 0 obj <> stream x\o\Q~- $QIE0dɲȒbK3<˖0Lsx$Lr=|n%}ӎ v?w?݇F*pUZv"uR3I| \3`A ˕a>a+UAa*ZO+-s^,:x2iQؗ~DzTXn]*/flbqZFR9+Q10=Q.ոGiŮR8f;NЊ;Ag΢|Xc28 a 2mQyŸnfr\[  T?[jfwJ%c!n ^/͐oRŷ8 ?~)=w3 !h>tnEHDSk5/W^駵#?_jXvq9>aӡ%cJ㥔LJ^Z8vN!-H/nZ{QYʕ0) go2 _i wW3S, x&r_!(CWuQ=0^60EG $w9gQArukX2i\e̚:-;'(EP  o[)0G?`/:*҄y̡"s Mȴ2QpYћ+3oDN;H[:LiWLBi8;@hp7mϻ}Fjؕg3%9qa ;Թ DqMBL=9~#=؆nrC.(YR#)[|]QgL^(~7<nPł*{HA7ﻡjUdIj_]]`Pj s*Pq`~Hj<#ExrL8.lKUaRB@;xچf+?7H /q[hbiTSLmB}t1,fboSSNSв<[;\iəGL6t8 55a5nk y\YoUY+;#|x\a,~ Zu?azh)Ehx*L}Kp蔙Jq @HGcdk*Q jL& 16 ? O簶$IM}X$Xx5&3 "p1 w'![J8I:! "7@Im \^ `xwH@):Ka[ }ra\Tr덭!gTd~P6 *L\#H ϒ9s׼:"Nrn"b8 &-8k,)=m{ч_1Dk~ƒIW6 \atq@?o=z 3ϙ˕ķ>=4QZ|_vG{C?Akɦ徠@QR'ݏn<t VX\=@[_ETf80LkBqeЛ;u|Ɇ M0!TS6|JTJa`B vUoqPkH`zC l`h/ EԫVm^%z봮]ؗm7пeȿA* p8C|t4<cuj'Plf7O+&Ҥۡ{ NgɼN&.k[TIӁנ]ɽzЄ)΋&Z3}իl`E>εR7}Odߟ %A0/kL5m>1}D0w/?fhɡ-HBD {L=bqӴW3)o|zj̓ar76rʈ5g$:=*ȾX;̱7D^zǚOJd!E+}°[;CXtcoGpU0'Œ ?a;jpڇCdͯ4xf{+b64cĮl3O[8X֭Yzyfrd6Gs&@-$E}[37 P/]@ڽ&ɯ^.z|̺-ŏlZ.02[iEuU8Kf5Z.x 8Vʮ%zt/b\P_ iPƻ>mW$x>hy_VUGtpI1OK\`xaùnT2 ˣNCƺiEE V\+'ꂧw0}8n@B11H9:qn2I؏<>4]W|'qI\%nOdW &v Kaoci67c(xm cpidGYLwendstream endobj 115 0 obj 4308 endobj 119 0 obj <> stream x]nGvQ/0] ă  HJhcQ3pjuUծ>PHÍf]k}?8_}rpۋ=1qO_=J Y/œsRNOI R<λ3m̰L?`lV#tz;<+?zfw&<,8c/ŤNoݽu0iΎx&)NoP^')=,Z~;e`Z9Χ:M#psd-ihht\Gq8yyw.ZdࡋV5v<v_%̢ni&$氎 OP#bGi] Q*Z@{C>χ/U>%ße:d^~6Tf#K~w,F1D(FN8'ifĴ_y13q,8Y>`\)(]&V5y7oV0@v#硾ɒ|틯iڧ%I#o'Ob"DlV@R6/v&yH}V/v' 1(5D&-\P# W j,,ڋŝ3!|c1'JOn&I=YT 6MAʘ{)^~ؙ-6h:ZrWaYuK/cb>t ͥø&8IzoagE @u^A-s|k~!4״v$vA$Pʴa'<6H4ݐ)Ѕ@M'(RZ!(m(#m }վp4 Ν%4as΀ûpI4O!/ŠN-j"9;= 呷5˜ J@ErG2#2YR19?;[IGvνh\ Dc#\V֙Fh׸$!rI ({_I- IL kiX{LjX6f,(PP-ڌ2se뤘k)ʫ|X"p6 shV5V+h0oVjh\HL\jF"eV^@ħqH߳L.-*@ځ_춰3:7zK?@^LyHc3Kλ]al[ + kw/e^ܟAδ~uk`'!-̧_t}^;vWv{iװZWL\0nvrO޳G@ 8 , @3Fʩc-tS=YERm䤒f) x(3P"i$ 7njx#)#s>ZM")|Jrq ^ =ƒˢXʁUю:̏ֈD(Sߧ?w^<}Q7Ufc!@;_D#Yl kvfȮ߱~#3?F&1G=|=gvgGo|.0@1H k%yTVopXArA oI\-֘!$Ha*uW%hTBd>{ZڙYIɅ̙'GeHա@IzlEY>)ZxvۤГ{k?zDZ= ^Pš;fF: i@2@`4f<<Iymq;Za藎qKH}q@:FmBG|q"V1{D~E8a.2ϊL{+T(N{p^;| 9~qbve~e%"}AkjV'n'^!?LYb]x*p)ѯ` 84EPIv}vxȇ/YoV=efģâGD%?>h.nzpul#NxT1V9Ba;!\6E8~jNYcX%jmTJɹI8ܧ¼nkhNjJo 񽝀@cDq]E`4\x̓_);lirIvs!<#@h!zjMPS_将qcrg|9[Oq+<. x4(٫[:sN9-wCVH WݒNQ)PGR%\{}oUJ([dE/v@NFDO ,sH.2mGU~Fq {?ݡ8XPa25.1 wYoQ::Z \#\1n6:K0=~:̴+>$+(fJѫOc={V뉰;ܮ˦tRRl%|qܐ@*T`2R#%-خl-Tz^X&-p :,sZqo,}I?z} Q`*);K_K9{†\&IIkSI O/"Y 7뒣 ޗ풳J#.qfalG}Lm!G?`]'lò" e#[2s#$`eO5m&+/`w0\ZSZnOU=)Ai/qb{i)ů@0DVlnP VZQX2{N8eN7' L׼<wpNJ^աP1ާn5#MAYtj[羇0cBZ1|ցE1OHUԺ-6Tvm2/ZWb*v|gDaM C3ҿLqe;⪧ ]iL@.Z_: Uٶ+0Si&@)P>vTSd\Br!NdujIsu%zDF/ W7I[qKVtVr/j |op4ƻ\RݨP}USCOه-1餱טOQxWxպW"o^\i'ewvl!?4mnx< C[j7/,X~]xaZ`"t;qR'}#fw(RoW>,e;JvKmW͔{>V[is,k5I4 8.^5)bPd_ىPǡf:ΖfW'lH5n6a ðu{ &W ZE^Bw۴c$ A7g1^L<-PŒ 5B 5-Ė/:c6%q#眷;,T>WAHtpgVN2-=w!nuBlާn~0qUҦ\Zl(yfcw1jlfgOQocB5ǡ&:E Jk9e6~"<`d :&'A1K Zb\-8Z[2?,k R7 /<_{cjʈV1ʀ)2;ќ*ur둬dF=NO7-~礠,~W0z-|vʞ"+B=. ;^(nH-`zgCD=M<fx~/6|B>:gY&t^c[7{Pe\E,+ט Z!a07~0(d-ʨцK*Lx;+p˴s(;Rf!VM #fM\kѱ)V718CB+kY8M2I$yh;kY z$&c#]a7 mh궶MjqAQٗL!k e k/7hF/ۍDXGI Prμ 4#9U*kGn |_Ԏk 3x{[!1H-ؒUTEE@]5~l2S&PSvIeΜdXܘqrG6$Wʄʼk bJ~RG*Y8#n9Y/KQBp5 XYT7d-MX[*&MIfW=b ;+V5,ŧL@y3ɵd1f|i,'B/m ]mRڴ~uHALݵbכ0ʣ9O!;w߂`ץװ`{BGfSEݨhhb@2R\1g3e`J3s=߆P0? 7{ <`lsncAC|}Sߘ,{+lzm{Ѹ^+7ȇ`8 Xrs*Rm).b^;ʍnM qlLq'Ē~zQ [V $t֝A(/`#>tw}$>-5kLU?j"hk 5qeg¶aܚdH; Pge°N&,/#0g&Pk)Zh9/|m9'&u:_óW+:'GɃ!npS%Vegq%Qn|t+ $oC;nUk_sm)ý!&rχ8ͷ* ShHACG> n]=>D|FټLd7$Q?W{endstream endobj 120 0 obj 7295 endobj 124 0 obj <> stream x=io$uA>W 1ޮP^ r"+ !˕H.JbW3.%,WU8Ո/՟?p*9^<<\88xgq&rMife'5H:>j;c#Ĩ׷ip^i}91+:*j $/m~[guuް{v2Pe)TK#|u5´Ei<?W;gzIkdtz<:sSַAA2h(XU*hNdTYy"g!%MjS݀"Gɯ۴F뎜bK^@< *|7;O2 "ݰ3@i<BV ϕNz F#|~0WU%}55c S84"h+{G ri'pdտ|eEM:JGD o8ǒٽ;%eW(xfs]S]v 3&"x'NSbW}WɽW^CK(8emT%V½yځ'fTPn![Ej ȣ&CH4p(gY!  CQu(P!Ivz۸أju`s:ccr"ϟ9%lJ"e!o; !1˽cn?`k)DlA2cKE(D6aN#^5۸5#TFՉv LNuN6^mO-ZkHТꐼP'@Q{DjȝW{rU>|UuW|#JLg䜗[t~'"PhZYcBXQ | k?`~ $k17*EԠcp+oEO>WB'ˊ3 q 6mF8eU-$hG=Ee7,a%)R*☢+䦸f}urtV/%Yr4FH|M3+R6\p~""lTpfnCBc7?PTOoJY]_3oۇҭ={,&ݾ Uj/q+AU4U^<LKriG v ___B3yћabrAq ö ֎h׃PZF]e%QfoyϢ\cZk5Hј"tVZt 4#hL;hOXk7>T;O <."r|:‘BSN7qU{1v >&YbZlbT(Xs8V}[rT" m@ĘiJsP}1s#D^L.T/ z"Ų1Yي^AsYM~pÚiCK !qˊu8]IW/0b(FÖE~nVtD1ف:|2q|/_87 @f?omce6]*Á[+q[xP_hPU¯-f]J`0g'0d(2?^YQL^1jww^&4@l+QxƉ7y ͺBhj~kx̋[?ObFTQOIdM]Ygu1ɘr~yȈfDU\*]m f>7vSppy>BdBlS&Z;JY6)ጝ74$Z lI Xsl^!#ؔӂ9;]&)& *VnA*$Ibې 1M)CϪhYqGj`{jO56!jֆj+>)Id2UP \9`t'42-|'cO52Ph4Mɴ' $H mymEXqI⸥oҨnO%f&CKu)>z{g ݩ$ʘ@2"J}&&۴Bp͚ iMY8*iԣ4m}$VC,fjf^GI!tD,0:L~YLDa.z{gT^oHf\P 0Gq0 )QfE+[R9(Yld3;Q}IoI3` 594-9 P) yVK.jBX×z?/R#k^?r1ɑ KZL97;jd0I]n3_XicD?/(Kr*14sQnFrʵ7mܕ:Q'zi1M$9{LӖ6,h[C¥B"}˙vouHܮ${v WY #5 2lv / j. 3Ink*;XQɈPuH|gՋV ;NϭEO>ܮъ&Td a4poq<$9R~>cq$q! f$XyG@$Aݛ]k#H nĄb2e3C}lD~˛MF/cʡ%됤ƿߵod/To{'@4[w `fC]fxYqENX1#$D7Xh6n9?\w .?7b+(LT#w6Ӌ[ XQs̾c@bG0$"P[>1MRtqF;.!&edfpa~G f/n{ԷAGjTiݗ#P {S?|\ۤiQ氜j|_3p&bC.ƳtVfwm 1_򦷇StBpFi/8d* ȋ= ~1+$W" ȣv=j#12rg/ "h=Kל_qԾ#%$cX rhltlUkQD5NQY?Xv1U!f>]MS hTNҶ1xPJJTb~8otnvrNϥ`L%g9_O@7 #5SYJaqM` ;)Sc m&5.C~eT#h`zk c%qYŋ%8.la|s'qfw9$a&»&3$>d?ݨcREY7<ȿP_5ὕwY%]5q%-I5Gó vɹcV ?H=ݖl Y*5 ;=D!WĨJN] s[$61t=VZ5"0'VKk ]S8?'WYXK1ۓ,9dpCEǺChꏗt-~@cm–HqmeaK,<3³ 3$]BcWNs߻P%쌧z%ONeYvv7۸ǏeBNq&0xoU} Ʀz7iu$F-2xk0Y![ƴqŶvZ: k8>2Uz|׶Q͕s۫ :h$KbmQ2 oB>}lw̉F/gm͟TLh[o݂YKʱ.Kw٤O^#ߛ r ^lkEH.g;|,>ۅh^A1虋B>t{9٦Zջ ep9U%zY>@,$żXb\w C|8YO-uWhV,M$Q7\_>ԦQQ Ξx؏ZwԎhgn k|?v%hfΗy<(v5ͺJ/gY$Z5[ҩ-`z[`l!^ڦ@6>6SP/|#{38h @*DAGI&FtK]cxQ HÎOc[^.O-9vtF&b<#t4%USZ&tn0$k=3?X1w-+hvf?P1Wx/xkWբK-HkЁ/|҆$!\\ӂ q^bvfj@Q^Cy K؀m VΪnt%*|kOu Zg.<>BO|"u07EfR6kcSAN)D'D۶[ߧ(+ Wy!eIu!1m4ŬedpJdǚ;=0ٷe[/ٶ?5C#rpϏzJxC/N@iҭ 8>xūޟJ3ןŸWW+@{QAW9(,mnoG!BAǯmL_'St^: $azᯠɁbGn MYL{ P8)` &Mkg[ 6dQD:i ׷aPR a~,!e$3i}0u.:K@|~> `Fڠ쑱}ɋ4 h=6il1:2ooʣ@ ȨH 'LQea,pkQeg> stream x\Yo6o3vnyH&0dYe[JVY$5Ҭ DgyG3O^|}z1{WG=JLbyUZĖvgR#g$Ջo7vOlي+1vg a6g۝U^i,Zl.;Ki#4:I+܄їHSj2v."Flbs]zRzrZo~͓^ MroqFVGJК ] :7uuefgtfj!|_~~6>|&EMnFm7] & b'$,̷Y-~ס3\tћ-blL/>ujjo. ZIdy}|YOG" 3YأX߂dow `\DQQtK幀Cn'ߺE8 J Iq&bqwrZBRiY 9c  -{A8F aiܲ 6`Q{rW CK=((qReRfotyXjI:ڻB2w`nIUd(C .-P+%&! dvMìZ.̬roY U&-ά(*ؗUyK5ɨN6n᧟8R-% y'/Øp5@fYfAM(7Z z89όHfKG QW;ؓ,چHCH57V#␧O9y}>'ұB(HK2qG]Ta$jiBH@g"]L,yy(;B)ǹZZq87*H[xC^xtHD\]t2ڋe =buq10ÇX;^ƊDZYmZe4>'ftYt8ÙD3OZ(S@FS֣m$|xIYװpi'q/V~ 6ȈλFT 3}-+~aͩ51!^ևƬ}+JVO[Y͗.Э1A) '= .xd+D4VRٍP,)L&m4hw/8XxgB)ʞ>TvgK  Ah}W۪4<o_T%&-& ($GjsJ]ttyEUKIzгZp%F[ iiÚ-ȜR'`*{k  ViѰPϮpb<{{%0l5tTQ?Z$lkA)RI$V~Cܞu`1gVn-ppZym$ӭF 8#1e>G:U~;N5=iYr;[Yh# ?(v }rG&Pq}cD-E&^zVms?$}_Ö85"Xu^JDdϬ.u9N6Ohj`/KܘҰ7}VA\#gGp>̬Xx?~"D~׵'Փ' O?zLwtO|K 躩O ׵x@S4At9 ܣQrBk|j߽`0p`s$ښ.F&g?L4X;3ArKCB-* KyWgpPV)δ #R ޤ `͸6,2=aWu emzf]x6bV`خGÂj] ZͫhrDxIJ1Y%j&7IYDZvxsp}G@Є(5kdЃSdzVc`rd:-[sgIx {B-L8U㭏BS!$:{5 mLy- G٩!=;!NgkQ0m{HΊ"Gtl}^6P>UM Y]RcQw`2sn/jjUB׹K( ф$&iQuhHP@2CޏuΐsэNE;v6p.>gw4~/izg6RFFP,@?8o]ai`)sg=4Җ jL $}Y=eiyH*exMúfFKF_^JB&F6ުCAƫ[ޭCASz˼:|K260̺нC?n176`H ̕= P t:men Xjg6g"?lTLJ`GӸ1d\ ڕ0u/yl&H$,ekc|,^}(P+`feiq L接:Xip4PD%V3 wAM).TJ'CșM);F`'?)yoX vj=4W1zBF :DjIMʤ <> stream x][oǑ^8opa-ֈ0, HJ2,2E*TbmV}Uuuݺ݊=۽z:HݗPX+QX] ~g\y{u]s"W:=Y9>ٿ=^nv|"V!P6X OO_=}U뺀-:,~Qy"o[yݪ ]z8J.Vrw_Gئ ^CPKZ#,kMEhʄ_o($n]u_Q_ D86 MNܼh5ņw(BҺłޜ^t㶋 CɡjXhm{c k[_/ @m'b4'NHʺUKۊFQ_ hPߒ  ]c Eiy9V?G-.u{!:`iR/UyH[3"w3\:m<)pEEiՉjCHEH`2x r3M٨ZwgY;U'x]!~_ez;pNq@aV_bAxl+,ce&p]*OSATl'QQ_L0M\-/8ּS1 `J]EHG@aIgS"3|$ۯzzʺPU1 e˺*v5V0ҋV VO&Bk7zc0EJ fXLX0q2ȸghԜflf:jNW^`N7D 5Xo@ȂTxAHY6" Y'Ul}BiPr;b*se'=6/#R)'t2R(@ i$t/I/}UJ$Qbф^K[Qi?~=/ZP-ڱ4p[ n " GCku R߱Fc W~k`"#+)}y˩,\B2vfEX۷e*bv* $c}鞙PHfeD hӽ^ 'ז>(aXt݁d*FNlOUƏbȓMl,SF \t8Ql[~4bIdNzSKS_7'6㬳)h#af1zh uFP[*R$r5++񶕥a*GQ&R◙KUn2ku*S!')D$3.mX$60s#a)giY߱IRg4l& O ZT.q.IPlVgo%FaB#0 HЅ\"A]JE[Bw"W81IJdayh>F?q+1XC?&Ynzd'yyfLˋq2:_ԙ0x>s!(qD:Ze#%:b:4܄;1q}&rO r2V [8Б }"JG{E/]&T]:yվ"-̫[+'HDdH z7%RzyJ}ۯ{ Dĥ - 4ْHXc#0DW6о\k&7>NQe_<$ x,_DS^߄0,dՇ4nVT H5l9aS%.I`ڴ df00,{j g9ԺL#`Enର+ mȪ<,Mʍr X -ScСP@; 'Y엸//1`C@+8DA O@ŷɤ~|2gz7,(Y}}{{R4PX")[SjPPΩȨ0:j1ZP5CEBdE{KףdN/z3ޑ/ GH>,s4=vd"oX%6[2 cn f78" ^ )~lt&8[CM1؍n#1.}]7,R.1Ѱ;S3[ڴm}|qi&.Ǐl =b{v=k/*< &o/Wx/{™6p7cvb@V}$+'$֪W ,ikPD Q`gd]ۏB+)G*B[7b7$&I4uTpE/֦9Q=U2m!ś/$n#z*lz-̷OBJ?yɨ>ٍQdDžӌ>b7q"w|oһ~8n1!g} M]' `6R~CH(>2^b6} Ck+_ˤv TMa$ƦTop- ==EY%q7)ж>Xmc,Q1Xl4 AhOU?]D"?y;ih v?"2(9f\z薰|E2Z;  X6G |ezLV~@шϪir0Nr"en7Sm 0j@;hr4+~| PxSlj+q<"uGl(}%Bxځ$A Cٝ}LP(@S=DT,/vʍ^~LmfظJpHf!O޾'}aQ ]h„C{ޠc}#cߙI:6Up9v43k%6nA nJU-Ώٺks>LmBA5x9urɮRУŸX2I E8Z18KDŽ_ yUmi$RuQsL0!1}OhL$5T* )_1 |/3f_ \'iB@Ci=m3?Ŝ~'aN[L3 ᶃG~nKOHb}i4 ۃbaˤ`+YXĸ_YFB$lH8xdȁyBu"AGi#ȧ?g>H` 42eT$N:&iV:z눡$I"X"\&1qk7JVxNK}C( )AѼ}:1Fn Kv.'ԡUzs ȹOg'~Yȸƥ\;9Gn];i+b B Z16?4 wRHkE) qni-L3fTسJ_'kɷI*,,y=0E2.RinIw)oi{y9F9Mmxʝ19XNsZ+lږ́i;hC@qrcbw66tH5G8t%e $a|B/זRolK89@so> stream x͛Mo6{֯Q{X9M[(ڴ Eb;N؍4h3rYʊNP 4r 9Cҷ=g__w'}窻Dzϗt߼8 *-v"=i,SwF1utp93|gjm S&0j竵`֪+0nwbxZKi7V br밁ɷU>2yztlSx=n{Lނ|/W`7r|z֝xewG/~ og}Oѐ`:JC؋[,| WnbA uuou{Pқ ^+6+J diϤtUAj3^O.GL')9?%-  >0eS*I+*XܟIhA}35(ƈf4Ui&exPQ7Y落&#ZH o|&$ 8ڹDǕe7 `y%qn-AAץ=rt9?]pK G!84qG6o~@F8[u,3 ֛ $XϞ3ڥMX=,ɧ), O}bRʗjӒ,s5nȐ#/,Xo y)ȵwHrU$VCH R!N[Zƌs&&ҾMbM$x>ҦЄU&.-%y -l:$V{&I_J&L&XJ8L8<viQjJ|f[N÷ry/w&Wčۢ۶]j[t>@ކT`RF0r<,CRKE̤$?čh/EXoF v)nTGiI:*$ךHxZQ ?##һGbG$x>ҦpRG+$ Shu|[[FV茶~PNrj<3 s/.b9F!Үl*Dqc`ȐpEMY_4y^CfEHEz-d/y䙥#o6Er͖+'(MZWSC|Z i~ -W4.XnY`an6s,ԎRO8zr )!r6ʹ 4.řXgx>ڦxCc,w_do"VdA{H:<wfeqGd' yj39,t{bSr?"")w|!_KY> stream x]ےqUoˌCW9B/(HM X\..(a̺fUg.@ ͞dM͗!dOORc1v*ur ˓lnoy m䬙b'&9 eWprf'ܤ栶Wkzuۋɨ[߭n/I}szJ[{1{}ln&m˵vebpYr`j\17f+9Y Z!XXRqa.ؾ$͞XkՇw5F |Tj9a. z,BJӝP|^Ͱ&쯙Lp~&=2^*X"嶯~8I++i7ةt$7WFlH`@087+ QmC3ѓt.Zz=9w(nr~e-̳۫TH];g2Epͳbq*Ynvu(SDs/2 K(<boo`1U{ (S .vdڎ +y#:} /ZJ _~4ONs=pކ%\.#p$)8f QT1 zU.̇|p]N139g-( U}KlWX$]=x7"> W57֩)+5Cjuv1I7*[}+vS?_~f?ybA W^IMZBGۘg3֭}j?E (71`ʨF=lw'y0 e=v+!%IǂD9%,H= Ql0uzN UfcrpeiXwR0JjQRI_:sz-;Vm5(J7smr汝c4 Q1Y+1F0A $9SMR;H֧U,W~o1KtFޓ] ?=o;ޘrOEB%uaQ  ?0j/F%%zSa@x-[؁rf'֏u1eHbV%x/&AeL+C`pX (>tq)]Uh}lQhP3xh<jCIVNww%.ifA(;x$XIPbr 7C)i@j[#@ -Q>?YuŁ cYn;U9 e1/ )>!j&X'ԮhvQYB)YJvk:5|ԭѧWW ^b_UdIEu䒉,wDvHB/3_b҄,=A% R fp6  @-ݪ\~4.坎x-Jc ˾;C$qTx$oY[H S+ܷpR> 8g;.`8޻hwr:V̔Jcn|V5`z2DY܇`TS9^$DHc 1,EvQN\9chinmk ˱HJnrSTI YfL0TMQf#uLLQ6!7qf79:Q?wRǵƤjWs|mQi%ejq"<&EuOQrDx;[a&%qQDFjV.|o((7~e(yW3q-I?fd>rR%:;ޣBɅ]7/!M).5EWh + &KDAʰ Β(]Š6ԙ߀g }U7IJ(,Y2(>:"}9rOw%F]vô:jjw.%ZG/bFx6hW-̫$n'2[aGݥ\dHj.UaKKm[!:rTcJ'8>J/o[35^NF/`WrNB!e5d2:UcHVM%i"=ը-[#UV%}~Ts'gg с'qcT \z8:D7a%o cŁ#h V&[tP7zݗ+OKcQMLUu/G2?\3_.qNso47;Z20`bws/},#)Bh`|}4%"/GYܻzV)SWPn,,}(1XaK/ʲVkKq/\Ն\9vNJe)!_v5r,_+K)f-)e!:Kc퓈 p9|To8 J4]{cwXFכU"˂p)8[|S17NJ?;kkǬ9*&0 }^{;5w]UЎ61Vk;- 9V̭b۳f_C1~qtGl>)E!MhM%|7 y yCZP`&R_C'FA9aҵ7wH!zBjلouQ%0)%ʹ^22CMvf1V XcgC}UB~.E6R}$pFq+q~0ٖ`TR\qc (_ŻO&>ks l~pijgJy],Ǖ >4]ˡk2}!􅖵C$(c^$Wq?#5HL' }WQfgӅVō|.(E!ϟDVH;Ƿ&~g5''Eb0B U/bI^dtu B+a9W2i^ĵ ^px0Ԣkphfė;%G:U$Ecd^wR+.5A\}$EGI9#s/{S I /=;`*Z劕v |Bv ks9Xbobbx`SFNLϝe 3373;W:8~q Rl )"?NJ%PfQg9YBə7g]{ħt8Td5i-&'z jӺd1vp(_Ю$xgV@ܶ?FupkvQ€xƅuڬEOO 2 R#ہ1֔^ 0qo:-ߊqrOyZ!!է0g!+(<!}ءê$_?85<^RЍӗ'_=7Wo>9qſ?6:?fuù* 6L,`g/e_ Х =G¤Rl +gWw@F-,(ؚ,c ,e9gV[ekٻE'"Q ++?D] F`do4OD}xnV 0K2X{y=ewƈ팑7}ޏ/5?[RrC" c~2pp"Y3!&ۉƣDuv&0yI|JO" ,^HNN\o0-ޫ@R'[)O5bߜ/endstream endobj 146 0 obj 5850 endobj 154 0 obj <> stream x_emc:oӝr/'C83rebV̓yKW9,YV|{mTn"A^?_o }5 -xZO瘟yWyV>XCIsy4+tWY>}ϵԵ~)1|nUt~))?٫>}ϳh+vW~Zѿ?~o>$o?O8T&)?cIOcNf'ĴgyYɄ<zcdպkw_PbHOg##<9S)8 f w75FH^v#nT@OnükfaЙ~fW߆͡ݴm(l.lL~8 6wR\Ԍa&sz1WOu[n=]X=GZz.g5C̔< S.pf96z531yi+7L [nh)sUi#X?Grc S0,!9?4;5F>4K*i瘋*ǔѳ ΆQ}XjDZ61-).:*60uC)>AstkqSw?i! K[=p \iU0.B}!ȆyqԬGb)̍&fC}5 K̞ R7<1 %Pu#sxyL(Uˤg3\3%6"Zl)aN)G,OԤI{:[wyq=L;]bvE1SdN[I*nIi sM:>b[+ɭ}N֩jbV:\(Z]TO{sWMM jFok̏yJ{K rpk:]at ̽t]t>_olȱMߧ*jO 7Wi$-$U!:y9cĉQ'W-=sbLT1 *=\Z>lL;vuq̕6g(̮iVXSVJ5&٧h4 S5uz(P;4T )^{R˜S 41)+ ɴ:ڬ0L2pRbFsͯC4cr2ej!-AF͸0Y.в SDjIbHyN` k:sϽ0@o6ձq Dm[ ˎdnTI)` LK) *Fi%&!{)Lr~'(9+k#pE6\g>C_#*be,Y-fI| Ka pTD]B>H1+0`HpS̶$THzI[fVGJd OQ &5j9W=OLP̅bsEf{%1{ gsдHZA qtȏ,ls.AOGF .]YEhSࢨ3|t~uE1E_c 8AlU!KL3]3WΘD?tI8vƒaKsp-8ޤF5V0GXKp׍`0LUU:Xq%v/vs83Le1ʚ^pq8aZ5CYSu=V9Gjq0ІٝU5f͕2rQg5.c.|t)'z{qF r1,0^lPT:&Ul{PtN9&,G8l5zPK`Ls]mu$um*fbJ8Qe%J 531 fJӆ( _سmz՜ebK77.I\v0V&J&#ګ)-LiHpV2lU05_sVEK ~bPCJ* `4U>C$ZQhSR<ÍMU8C)A IF2+`Y,<1c\sjp3J*h AQky "&R?*OB+i2rTT8rjY4xڳc:^AM9G]SxQg8t[fDi"YG‚9$&rZ&[ \ۃ\OA22.[7alQص1V;k:#Fj</r&7,;2qFԳH)YیtNɌxʩLIqˌӔĖd9h،dڌ\𚑆Q[ƙ݌d7Jv%ij`30#9׌8 ~RNL9>\u: <ٔ4xMɅ)YXdn2lJNnMuJ6E$bMI16/9geV̦ZpKYycuB2ژ "{~F S&? K6W(@gAѦ gޫ3yՆ`CL6,lC\`V FY~utFѣ5p^]3E1k_8";ٍ[GmL{|Z/hyN Ӧ+e*S LaKDžY3#fpYka6^"Vԩ$IUeA>Y:- [XQ)9dfb͊8`Ħ_b^EE3̇-H*FL4qM\<SoSlk1kDd{8.Q`G5eQLb^mOQܛ8XU`QԥQ\J0k[gdžK햕6FTu0H&8'H)YDZ u'SŞD _P g 76 ~c =PDɔa3գ9[%+rM2t H=) E1G#yf98ќ_0/ &1v-MM{&UF'nZhTI461bD_# D+ß2oU=;ӟE^H5of;FU!IpBHsN\4,bLy&&tղ65ȆtNRLf0V%@@0:5mƑjkó#/G=msɢv'AJYKT:LT:1Y ycW$Ց5C +/M0Ђ a^:|; J*WSʓtTי@7Uիt[KQ,p6L0PϺhgVfvKm.\1b8ڠË8`q&K Q7ƷiˆTײ0&ւ$I,mՕC[k èɲZ^q# eKȶm *F Ղ1F& iɳ èX-X/OP- +Ӵdonx0FskxRh5JL=u$ׂ1Y 8m EEnoƨn-Wllooh߻c|q%\t%QQZJiqR.\P7D8a Xdf+#o,Z8c;ȁmbl 0ay-4hlV&\kPp+;&I`yJ<(:a6/a6 FLtUY/GZ塖5J/&0Z#Gz+*&\^'cŒ[WpnZr{ ($PB B`c$X'!IF]_ ı% R*/DnJq E!IF-MTyv׽*gK-WȍEwaL@%@ZJhz4ŸzR@[V+V}{=v{%Zc,F k`qƴ[Z0w7БL0kkA^F6$٢Go'`OQ͵2hu1+`6 \ +8eugw}'nq*rȀV8J[ƈ=*8 @r6pSL1Uyʪ$׺ʡK?LL:{#cDf+9<5f#FL@9SrX/y\rXB Brq,J"^Dx jF0'V Ԣ!O:+)ͲVI$>+EM1N$#fBT #&hǻ$؂\[fF0s^401VrEɺZ D&M0ԞzQ4ӄ6`p]pLlA9CHSglo&gft ͙0&<$M$ YvZ+gJ [@H4ݜ~1)YTSA}K%H2[hDvK.Z`mL 6^`fq!%j nF, <Mtj2Zw\{e2[%sHir(s횫i9e۽S]Cpc +HϞFŬbbVVB:p- m?v3ބ.]6:=pPN6lUW&$Vc*6/qY:G Z ]ƈ1T3h+%k<Y0'坓gpNV/ ۆ& )IT5fD[| gE2^u]9w97VB V5Q5+q;H7f% j/^x#{1YeMŬ9j;<@㥟lg 4>˝QLZɣ/41.!_&p_Att 1H"LXb:OX:s ]LtX&of↵&Hy\G+ncc$Lh%NDᛐ[k*yAͣ˸ae F1}UNQ; W 쿴ب (ָ\pt[nHsGJ+BT둼I}_`Mۅ<'Y7^Gsi^z+Q%&ܜKĂ1?Lpb |sWVB*~UiH{{ oǐ]Bё@Ga<Բ}[0=J=-Q`x"0 Q*,КFNdâKLUnr+N=G|buŜt~2vOs+ʏu\_P=}gtNsAn>:ӹb5\ )C\F!v F D&FӦdTċ#9DE=22}]dxقcK]++UuZ*l~9QI*Z0x}A椲0`?"ұni:S7 U_ Qm!x+Q45` LWX!Ȭ:)n ᤸf)n)nX)n|RXSMp୸Ƹ8ͽOS^VYbUG^q/RFGWv MOY4Sfƈn0Z7hu9ōg$h$q`JAU ^0Bun*B9Q2?ug^#xӢfU7WW"VO?"SOl}Dg m:Ob'ex)lMu9VV(?0j~&) sDnY\O 1ceO 2ɭX/Fv,2$e\:f']/eˁy^'fI|#29VnY=TBZRY1Z_ZusG$ qUd0[=q?b;SH^@OۇyƗX0FUJW5<ІyԒv`CgT_:^+}W8xŅœ-* a-4FNȍ^ԜɍndJ[X[9[+yx-iu0ˬXzĬȻvÎ_ךmZ#iF: ĖB6t&j2!)A<넇up[Տ -thb+ I'9I{ZM QUO# ^KWl0Y:3 D(Xn# 0N8©5/EVCC"A^}-*`a%LGbO*Ō\ Yw"b{Ysro(6xC2vBžc|pq* 1%C_^M{%#f/+C\ X?0\ߑ_w0L1XΧb2~H7h\x͹ty]j&y;n0q&(ݼ ج6xʍi%$"W)iEJt: w^]w fo ]q/ &Œ%-""*i""έhN9(B -l|sKTF17oPDDFY^Iz f%@0 k9Y\1&ޗp5cтQb⫽@fޘ(4 a @(&Ȏň Y,3 ےuĐ"*.{ l׼$ DߠMW Q*y)dJhו@ҫ0[gfnȢ\)W"8 C^Q s?.8h'9V$A[ q1rH%EatCwiIW]ef|9|, bjJ*WքcX0 W0H46:$|:Jl\љ[p2Y1ZU;sc9T8h! zUv3t&\t L3a>Ǻ4?>NfeV":CA9LZ8C޳K/`G! azm WdurX_\fNNo[H6&<*}v >@"!,] nᳩY"Y|R0]B U.T.O%t ֮ Myc^V\m<{Zը Б]KIIowx78a(nS6nQҳX P*y+Zlx1UzNM5U v5ZⳍmH],>Y#_Sc\ϣ]^Z^NUm {*ƈ-,4>*gvv%:36 Pbzym۠#l: *#V_,m"=+Q[0xB1iyrT+Z7y9%Ҟ<7T{Rz ՠպOQ6rÈQ(Q=qnvBql ݰȓzk@7PٔlJt6 ¨-Gq(A+1+uy# Dˢq#N9ߗe@QpE|cUHB@ 1>Q +j .XD&DT|L' k*CD\`JM2Гt!$tɿ TG`io"'8Wy#-`ߛ& u6K\2A؋W&KTX0S gg =%PAQ=CR @B0xn Oj-<=|;>0pYDNj4ŊIIDd$kEW[t%_>Ԣ_jdR:ӁA(yJ bazuĵqy`175/aS)C=M)9>dbv%f0 !|,'Cz ;MJn=tq5*E!6G# 1ȧ Ӓ83l]7 /Ky%ԭE"ἃ@k`vF|-h4fB# '8e0]Jd?BC=w]}\S:416C"NWQ&Nf}-CPN(#i+yZ0gh 8A^)7Y8m=Jr Ǘg/J6 X?o&uda7I2$B>DL& Q󱊗ZcOU)vɪ+%V鼔URS1"`,ijʻ ep뒫scӮgQvo),ap<B{Cu0 0AO1*A|[Kw%电Ch u~3 &\yGO1kF!\Klg`"bH\6 T(4JGep؅eex+'TXB. ɥ3H %nJazYLl/ KrDYr;w$!9A^\xnDl>0fgrK5yVdaЄ x}S ̾(8]mnohŒi8(Msw4A=l8DWm M<hXQxu hυ>aZ XM:"h:CJGO]pPєQy\:%!xU?qIOH xHdx0XDrad_̝[Xj Mv4H3PCv4"Yq`#wdSM!pٷM0+ *.6@?QH7s[vWXjnkQ"Iƥ{FoL-47Utrd(l@Eux5 U N˼fwPF6_l!u'rV  e >gWkH:0eqݍ\\vƘX1n%oLT~I-5xEꩣ[%{akBLfRj C3+o.*;8mD wvadssژED1k|IEN_N}4ҙJ҅LW 2Ѕ ]핸os/ƈr\1߃e7OGf{z)UX6RʮJVP59":I9 JOH 屃n%Pɾ]hmDҧc,* R׿b&qVwHEO٧,{99zT/CU\%(Թy3 W:F􂗛gc̓KuhfYC<ئ!nxxtUBZjSB=ƽL2Pr7DWv%̘ׄ\XE?"i1C3->*}bf%ੌય1nd@mL+<#^PuLJagF,5mٖ.W~|!J8ǟ}B4mH-9 _}sAH*<a!DV>~\F*wUkjlE++2׷~|jA`)3~OS3֣?6;4 )5ק~M6]gt$k]D X_?s67?yh(>HZ.ϟ+=F+cԬNhaNeGE#*O1-,~-L(%F#ȯߝ:+> ٸ)Uk`/lIUdJYU/$ JkNH߃?Xgf(8+N~-6ltcS<[i0YMQeS6}[ޚic[Lrq\\Q<@9zBb֯ 5|7֜{#&t eR$*=F!Q;Sj!X4ORzso(≋G"_}aWkxB=uJߺ}C 'w8ws䳽sơ9k;1 DWU'P?ͿV/Ęe)[0bاnAZCǾ- sE pY+5 ?+<SnNK=?P?g݂r &z6l,YL=gw=k俸"ǟpY]TAE/1wҋuC:+_(NɟL^GwqZӴw>Emֱg/ >5*.8S1ol~{qG΍i1oaS:$7{Skf<α5x3*Sje==.x i._\.w,?=Q櫴e>ynUxK7qx޸w̳ؒY#7s|r)c8W tMkv9X{N&v4)ο\5_w~kr,sczcvYx`u1>8ݡ>qNwE&^tR;_}qܼ_BKD#/I w&G=TE_ڧ'F Ĵ/\dҟwt?qL>38\x?w?sjpK7~v7Z+_?a˹7S_! ҋHMTGvV1vX/;ŧ]Z>0>Gzb?!#'84n)ʲ:.ie'#9Į_GW!~v}{q<4ܗOG~>oݒ(1 ޼ng>Xm+L{N/Ėaky3'D=Y_NO6VZ֘לּv~K]\>x=|ũN8H3~=e?Z+E]/ގQpE^?Ģ˨;qm~ZK]g\oⴼ͈97"=ܗ](w:%N[`E=ʒ-jK?bB@Prve{&ОWHh:8]ɎzAqL緟-W1LgD2tSN':Mh?fA%ybi[wԾ䁺Rzwkz|5S ;ڤslOko:{vgҨXMiqk˷\ztk7)zd 7MZm*(-ؗ/t0zp,b^?y vt>)Mp1?6]tَ5ƺ"u;Վ;LT㖌pގ<4 HVrےGIR.H ݍx|8b*fϯ>u-#$̓+ڄ*T|=;lX\+_\]^;rX\`wA^>L{cC [d/|\%\rpn n 5TD{;]؝ދǝƞaĖ2/0'`O,FqI^>LO}Rt܍ƫJQ8wBhl/}%A}5H~<s_m̿Ugc_Rj9mw=S[0c앨淧@T#!7mN҃o\ζڥ w#5]?1aNAXd~O7wrA'έ{y??1? ݄xXFl(.swfqLy,cl9yq9{V &7yeAA,}kv_9!aa;y8hq7.U\(;)']EP׶凿?g$:a>#HޚW˃7doVqڟގ)+b_̥Rsq|Ԏ# GZEtJMUF $Raiv^d/6aU7.IӬNj~gOHBɻk}Uq{́Y99w]G77ޑyVO8ֳm]2=|)oJX.9ۼ_83 G8㽮7%v8}qm">lgRV-$'PW_</T'ct.-peQEN Dф/' gh ?i:hp*z-9ڮm'Bvؿkw\9K^+h _)_d\>In$t|/g?_|7}ÍV0\NA/貹XWn~c(fUbr௾EA!ꗢ٬Qow6+4v[QXM_!-ŽΏ\jej!f]9Ej^(ޅmhߟC:y]:Se 'D|y%qV] q[W9~w b]Xj5xN.*iw9_Z dP ro ja ե3r >Z>_{㸼uD*wKg ߷GB{CuZi֔.CZ]'rӘ00g߻@g| endstream endobj 155 0 obj 23027 endobj 161 0 obj <> stream xݝr%u]? feR]2)%DH.f8&{8=#q{YspLBUVVV×YZNjWg<ݳ\?/]s\}rj[)HI%Ю\pjU񴦫=vsZ;|tZKm>mVK\j۲]࿷K;m8R缆zQRzJ/iE_vr77锩V7TseҸK{/{MUyߥo?Y{&}J׫74_#INKkHkCܹī|7EWa •MK^kֱ*jx_C^e)&XE5V~+Z|Js3L#{Jz5^O&UIYکIJb&H li]@8uEPMx5Mҫ%V^ӪJ=9.elOdK^+Jc+.۾d 5ݨkRdK^kZiPImC1IzMjyZMBk{>:iLd솩KzMU2%^S/525ݵi%s7N]k.z9OitqlӴx*hǙkjAjybM[%0ئ3S%o&qj6=Ǻ|;+UE5oQPŰRU֧__]~sZhv/i{tAUo +adH]}_zWoqכ;D7JפYn.a]V9^X-$ES\I]# Z*mFW*&P}WlF^!+yCT5zkp?,:HW'TgI=-,Jc%L_G"#HB*B$N^iBCL}**P )ԅ&t+aIK1J,Z$<I"i"rBBR#HxKIQX6$@{ȳHh.L6DmDT gx#,VvEnO/)UH9SP4A^DroD&R 6 ʫA8押f㶭Iϋn/$jHcbj 9(~腩Ы촑 gV&E^D<5`4\C󄚤$R@7MH)U%Wډ?Q*I ,4~׵:uFDд*V%4/M^lXmLT}UD>Z`xʰd22H˕ea7Xܥ!,7Ag '5UUD^3SGOJ27ZLMbex+G⨜*KPQdPM %DfXu`iś,M$RP.lPYYd LpdbTc%)%nMo.Q WagfV+L@h(RF&aX@Ұu%VacV% # ēN<)OX\̃ȄIJ&EuDԭfKjtS[ae%"߅Wpat B492 G1y6224ܴLԜ`gřwΤKBGѸ <MlÔ%KҖ&%ATDO;mQGB#c(p`؝VF6؝u66mdY-#ѢӤe=?BF񉔊D]խ%ȎNc[%/9Jڨoajw.n0GW Eu[[} VxyF}͒ qEn5Y%/K /4T7edo.fk5҃ 30yq3xaR ^ږ I=:F-K,7(Kl|yQ$M\o+PT^཯r Q<&+ϓ%0G밎V =%,lHxas=CaH 2"OW"%K(Q #A*HklT"P'L& #:tӻk z[x\e+$&4 MEc K8M@)|c^֤Xd^";̬TdВX,C+[*A{\rYw6;B UEA\Bk\l 211ͅI.V\뤗ZOR-)IuDYHa_b4RuXCp{N$-YVA HiGt.M$̕MAس& &ݴ]#6괎,NK؎QJTVF$El,„r*C LɑA5fiM 0APMlAR-`arU^E vatlbT*޲dC9@.>8 %pd YDȗxW.lL+k&KqM"k5r@ ]kN5aBoId!8Ɣ%b_,+HEK2 zuL84ONNW`MBj$7#8k*%NlF1Rd35!S`O"ҏ%Di? Ih,-wELVƒ U3J /:rnPtFGI,&{M}*(J]d& g]8gׅ͆h%mU90(1 .uºUY%:WkITaQBT j5YQUžp"KK2/gt*I8"wb,idK"Q$\Hz2;)WIJp]^(KjY7ؔ;}aS$hL«zJ8vY#ٖ0I8߭-/`y R֘\MY8[u`o)iJ C4 BĕU/ bLΑhIGPtSSX`M$ρ &2xrWЪ8nB $@h071k΂'oa0ZmTsE5ȃҰEIDǚ9A~5hQ,%ӁfoYRaѐTDԋ*k"&5hcϤՅɖyRfg:rI޶)UgLVlq$<@ QC% O9^qI"\$ [ ^f?C Nr!&M("eN#a(&p TְRp\GKhp'Vh*[H&4WPtsdY$80$ a$V.qHO sD3 2fY}$$5E2m;YX-Q+T4dيLp"U I#6RQ"K#d %3G㏪:Ts0 @g@B0YEy?<]-5akF ߗ!HEL ZQJ H%JRV 9DΙW Ҁ(EJ Ci)T#Ȱ2)cHnN;BJ.4)EIrxSH4 -rdH9*flNCuqqHK:jdlGF?BQKR(t#8B(}dRqj#Le|@>G gn/#֨$ѹN)h4t(bFJh>WKA#HhAm344nQAڎ!lWJI$3IdiTkYѐV҈$I]%JI#mWȒX#8Ѣ݌5ԚF%JY#NV-AW "Fp)ljFH6$ 4oIe X#LvDbdD)j%5Q; CX-Qug5j\Y]蓰F,h'VԅPkQcvf8ȢAm1'FpB- łG+4H W0,K mXPo-łv, :$䭮X3T,\1T0N I`@$fTF:RA;IamV :n }c Q" PCF{ ɺdƮrʦ(ʦW(Q"M1lp6Ck(gӛP0wlVWf+lzeӻ(>PIԢP6}eQ6}deGS6>CyeM{F딍slF s6=hmĚ5 l(t gW%UT`¶$Y5iv&G)ܲ4UVe[Rexs[Tehű ngpKr[q|0ތoQj|}[|V9߂SX[ ny-| *Vj p1.bt5ECoIڬη%*,f ! pIK ҍ.\0sI Ys:CW%oʷt T2S&do!IԞ-$)QUh-F¼WX*6W츊cJ]!1\4 WLUF* vU hh<9a "*}&y*F`hWu::b{;T9pƫd B+k+n9:4d IFd{`!+ۮ:wu~2WaoPƍ* IlV)B=ÀQ>ث+b;>J]E!T0IPq$JA T-j6 `(2oJ)jr:XSrR] QHĦHA*N}V6C*phe9L"kΨY(ΨXx ⌊쐊N{唊zNj a 4I5;Mbm~딊d)jF9)l S3RIَ1J=Rj-);ܡS*I2He,UTrJ)AgR1)DT2\v}ޏCrBsHNSws*a;Ʃ4[!Sil8҂XΩXs*Tj8q* GUh6GUwTeSϩ*UGUjuTwQ؇*5 8dR("GUK'U!FHҎᤊCNXb*ʼn#U{JqDHpG`ɲ;/aJ*Jw^*( R#U Q`CINAwK*DQwɜL%H&!D~ DXt;ef ߂YW9f3c %HzA#'͌AJzWf7p#JF%}Q6#J2?#J ѓg(q$}+O$(WNOb=aNOo0˳$B<"DET1x"dGc(|` X+(<{Iغ09=tv=B œ>FN{ɉ漅M3O4RNىf Q;;0v i55-bi1&ަx?%,M})?vi5z%vq\+'lQۮՂ)LA!۲do_oƀ'E[AkRi6n8f{H=,RyrX_[T`7cP֮>?CYrԴ0J];V;bM{/}/aCYg?zh^miOc,톫y׫}VYXQ2c5%#1/ROD=q oB_ ypҟ9 *>~|udk}}(˚|[!ik)oq?cV.|Ai fc\Qk\_; E`WA +P֡7rE~W0xߢ; fX<ۈ,:3z; RQud!{L ,}!7]<Ǭ:"5ԢGnÂg8fY˗vB A]3x|}c V ĔOn z;3sk j]25Y&^ۻ91ϻT&^6:}O:j`D0'qeK|=`FUBw.ۅ tottO7Twx;n}U[ˣ6<u;Q:w*.jsn]]bЦďdM/fB}x-+uђW01#ET,Yb ;S{.{<^| Lv&|2;X4 mX/\*;!X/=g~_}w䟮³g7g/;Htm:?'&CvC}'S>ƽ2ȱݝdžW/)nmxZՁ@ܟ5r~Czl^V0G1X#^,^j !N^rʲgG?zz? c9po ѷdzܫpyt#I~ oXHhx X̱fd $ 3$:Ci){僩fcS}1.6|!(<8U w*˫ͳa zb]uIvٻV{tEoqVܵ 5gsM/{C}hὺit~oit4@1zvMpCwAjj \4U0sWʹ>LmFkTvimvOcUmXҕ$byuH=\ă8~i؋x.BEl n ,y9BsdSnZ?Cs>2`^0!-'ƹgj]nN\O'֣6cPz:1}(&$I"]|_qUg3)׺Pǀ;9lQ|9P}Kޡ8#YC>W]K{}> m vN}uMs$ r:d 7)F=ew+07BzqU ]C/AI ch~頛j7&M5a?]mkـi3 XYw͚Zr j`/{"`nq>~ބ:EΔ%Wv5T+ܙ/#3 #7dDl1OY~IYxk7G4tJ7Aü~ԡ}ԁ%NO] vhzzSqyw81Gr{/kbC?FPiA)cЊ)*ei!޶7dlՀ& lVm}zt(@{|e릩)5m5~XUs=X?J> LǐTǽy ෘ^sgO -4XzJڃz? -`)Kt00g|x(0s2Wo=ND!C`#|R&|~^1]K T_+d|Gpu:t0%Y[|*T}8ӥMl3 y/ nTkKqh%l8eM0뽃Es^vm`|@'9ykHQfՑ]deIzLӮ?vޮ3^vbI gOݼ?eϓSicsWmOh%θq_k4qSp_p¿ 7e_H;Z q;>wFKwE Tc_+mÅf5N?`&ݦz*6rAV,a}(L_d:p{=791_S#I!0MxG_^t=Nrh9^ZfI1Xr}|ͯs|S<QTdhn4UpfsKvh<"2ΆH7K/lC)qXq=\孺xwv o9rige7 iK\NygO'2Oe,=tq^> n) 5u"N\C5⤤ hDu8}>]Wy,xq8q0l;Rr"hL 6M> N;J9L 1g hkO5#8žpΩmB`ۀm @Z=4'۩CU]0ڦA-@4/م8%pA,+t99yH]}9RpQ駃6v?wcCLEH>3^ #0>Zs{*r憭'MKg8yWM=gLOHS?4EQlmC|NgY/,/5k9CgUx3 ˥b_PKyMB&V=Y6f}"㦥qQ9#2ySɀ<y [_X97MaSs<$ZhX‘pCyoP sɳv\t#jLrBs9KFi|y9l^'bÌc25e7e<-ӵagxE8>sL{ԚZr7ƪdrݬl3 yY'yv ^Ӡ-L=r9*̒$v| $ZHVwκ'̩;7{@[N=nDOy'`pC??s9v'j~oя:6H`g=FF3_J{A}7*ѳ^5'LSMg)_с5N҃cqK3J=zoJzAOlV8: H@f9YͬZ4==8-rQ%pYJ{ΐSQdˡ z8C-V3u滩Wðhx݇g%߁#|r%K9r W\W?tzˡH_kH#~W `%' +U,0Tbg;_G.e?ݒc~{A4 3AE|&|~N\Ϳ)0p1;I׶b?oP l=foN윟8@) 'z L8y9`ˠ'ףwZ7Y`o;%2t_/mA!5ua'pFj= ϶C˺|j~9d:c'ceg1>; $"h*~v.DDZ%~z`|սtްl&o{PkSGܗ}Gp]o=0@Vl\= g,|;dxoR4M5ÔwdǗ 6kg!)e-]=L:s* U<(%|~*Dr];H)endstream endobj 162 0 obj 16461 endobj 167 0 obj <> stream xXKo6Q,ߏ[EboE6Wi~G;$EP( 2Eo8p&os~ǝH6X`s;>8 *-$C]Z gz8~!0gƷĤFw0&8lwb|LM~Of<խb fU~>o5[AT3/äfڃA3V壃d+?h^?X$̪̉' >KFg0&Z%ZZ* 8Kgaʠ5$K&6kkbΨ5Ij˂'@ }1BҭWւ8iVC%t))JlxLЭnPXJPh^DW^G P 6m/\qcN-PH^vmS4?)> stream xݽ˲f9n.pO<|Ϝ)um~X 9B k*Z)m_;3V8NTT~.^@Asxρÿ><_)<~3yO^s /O\Ks<^߾o!ۯ7x_R*bZ2(oWi4bcw/9oXHo~N]緫_jo> /%9Ud?oy1V9훯~Wko~4g~leVq)i_j -VjyN5Uk9W;*+ƛܮѹa-%!6J4o&kR\s_f?5 /ysW>Ɨ{}ZsY^R 7s d+}h@b-Yg?= $, C-.`׺8$RG|BCr\F]l/%eF-Z/% ҙ/&1ҫc}j:!FYk-%4O_z]ȏT&jYJ(YhO3qdr iiי_Q5e}Zp5N^\]*2WٷC{ ՗&H.ҿsW`bq AlIS+[bJӄAK[:^Fo.k)^ЛJ4hPʃ0pNPO7*|V:j5\YJ̗ܛJ>>Cfoټ%|]ǻߊ͖N'?QjzS0sjSAv:$Tũ~Bt/C;=NTBg[qZ5>IW)PtK3Dj ?İ[ke|KTB!z?Bqc ӟd֑$9y[\Wݨsbc"++S.5B,FZ3"!MSҩrWd~؏p6嬾oV _o'[G"i}B*ݺBMolG} ޯzB[khx~GR=U1^91&wE6>hq/ulɅsp?:[V?;uCt2ߏo\.{i^P7kzok?_*>Z=دVm^XG$pe$έ^N L/^ܯ@Kn,j|49Kt^V1>+nѿ :~8n|cHC3Ϲt{6_ze[[tC~esѪjI ?V[Gvv eR3mjKKDRMffs^m֋pm1=ھAuoyU?Gc>f4eV.Ɋ?RHhoMR[)Jc5?^ȵ}}.I:i'Jzup7V:Wu-sEZt=V\Zzͧ>K6iٝex ItX]?hO@;cm'zn-L|B S{Ж,uˏߑxc%|zx!>N[Z*|''4md~dorydK"ܳrx3>DXlav4m\*UD/eнs{-$.a7hՍT_?P5u[¾zz~¡sc;"p+UYpͫt#^_:ҷye/jyY4_5zM9i =gu~ʲЍ&De[o/Ś%t ]Vٗ%x}JBW5rs2Uv=Cײ6r6ᫎ1- 2K|{H(pi(:}ӱD:.E .\ V!b ĵr.EW[Tv2Ui/^b/%:5[Y 8Tf]u}⭑z&yn^<fV|rz$-#xΕcgTki,~]ݿ-z͎W+c@j3@sM6ΣUHJﷷ S/i~:Z*!+lk5VrDLlEV<;zβ/uT^Ѧ\o.yz"_!^ǹtxMqo8!C [OZXNOiBv{u~̻, t8P`NY.:>ۋOq-(Z\UUSW[18M'bIOakz)')gez*M6peq'fzJq7'dOx.yEtTw~iNKzk|+U'_DӱW|N-9GWϘ[w k|8'jXޯn>o?_~zeKۛ_Gw0oߪϸu/k_=<9r7_PcCݬg-̸W 7 YDVB 2æu'7DeJ_p>g8E*lەz~^Q/2û.d]6Tr]eF߭W}TR:]d}$BWD8v}?)j\Z+"+ބ6u-k+!eBK>[^%?=A6JLW$̓^?*SvлZu*־?eŻW_x?e^Yy&~wM.DjAY߸&.=G]ܵL׎}ۻ.gh9=a~/,ttUCҵpA+5[y𨖼?چc6z)vG6Z g_^OliT;4x=%_ ŒΤ5Ȼo #BEv9=3^|JAnH%n{JDϸp|f!.t:d:(ҳdʿIm͗aC<>{1o(DG[~D`z -[N?ioˬ , 4q_j9?AV;"NjRgzs3s[;@秷"鳧Ou7Q=<h7| 1Dc|g݇-˧串.9f^yElNm],{rGM~HbU+N;uيVl{]7Ʋv8{?:K۾4>@}It2NFA< Bo!{2~(\7w#)/kۥ zmy3ÝVkkFn#u΋wWKkBV5[kygf/ nB^Bm.|Ob9Vkm_|ɯZ}Z( sg_qov mc?#ubyALaz ror[+)/9_fL^/vLW7N^Ne G.9opYsBec{ErZ@m;+7珧BԬ FeӒ]}nsk ^?}'?4Iouߙ5utUNΙ-r;s; me.լܔtؽeYSMt}b0oR: ]S%p3v\м$ݝr̨$\Xy}mYl@(so9?[ Üv|>-}?LPbdQ]ܰ)]cE ^8RJC4thwkH*)VDNhXߥ_<:mR,wNIJ!䈱 +ʼnHB7&m͙GdڒѲA:D73FQOurVwpP?Qyۛr>M*GWx&Hh{VtD$^mۣnVob|<\C3S坉[?\}ut~9E0?Fߥ<߆?dW!y}w癐sTjfI°Wx8>ȅ}^l[D;'<6]+BW#f񤥛7{UfTe9du?/WVu_"tBUκ3S-1t3o`Au![;=@%b}^ ɱ4 \mW7 3SoDSOş%v!Mo6-z_|~\j8~ /&"lrBo%G!+8f_]g=.}I>\o COexZ B_42ך șcJr@-LcCхOO>"K˷F6)v_[z' C/͟ǧ+f,.%h H w{K }]TRڇ/3@҃ ZR~{P軴'iLjHPeYJjHR'ISSHkU[/TjU,'&ȷ0q%e%~j$4<'fdm{<]DKP4(D4˜/Hx=.= y}d'=SQ\5WdƖ$KeRiΗ")ԍ] 0&8Ȍ(aX0XH:i$k *5Ԉқfi=HCbѶ '<^h $fDh]0JN;xx]W$@c/_B}ŲDy)n.Nn4 f#S<-੬UUM6`8ӓh2= Qj. AE}QYF8eVxjZV蟩 o馿kԂ I:!N7;\bDPfQ- y~3ۨНSwD":i m I(:LʯeDBJPaڕ"yZ55D&t0. {M\0 +bBX0Rņ7GX &H#_$> _dMb#A$ 1pԿ$20S6 Ģ4VR?JX\Ym%|X]Ͳb_ڧ8Zc|,%4DPnUaMh6ʺ;4JNX;kvk%XT D"5f&Nd?J )7WbUà |l`%Ldh Id[r-]FמR44 !]x{cB pHu3TH ͳ KpJ &'K"0#qiGd}#8z. wx`RP; ‰Ia͑6'`P.Yﲒk͂g 7#RF;ebǐA];;ղ]D ǵZq{ = ,& DU4U}1P$C+ٯjv f%Hn[;TQBAһ+fô ?'\J0H/R0hLJ*v'HB<ʋzzU59 3XO?>]12 +qbu% (T`*2 zΪqD1r/9@!-6 :Vzh5ՃSyb6莕0YfD"a%jfQEEVF2qMǙa5PFIӪl >OX<⪷f0r.K`^t# !u⣠E[Ŵ3kE `Y$YP :mPxt +3$k?ޙ' %{c:jHk /W(M VPgjE?EBʣj);*Uh7Bd2&hQ$ &041 9 ĢjmPsRJ1՗=10@e o͖VCp[ŁIh޲Flf\Nm1M*cneY;D;7D.%-%=FUVUCR mdbP/"fm7hV2/DF%A!v݉0$%C^&ћqMFJ$V02 A ikHyL]9`_d M tAҫ^J}ߓ/ CBƖ|ڟqd''@7q]ZΞ-dIC{a' BtgF'Ϋq&MrZ >-_q--B~Qbg'ϴn<*9y`3yVx˳a Zsg:iNɳ7j4qH4mvNuf@*Jzg q30[O ~ 3MZtLAq܃&Sf$'M߄yM ߪ2"4`¬L[2%X"ӊ0K!òɱjo'>/Rts϶I>%\|t,꺉9 ^[̵ stc`²H69sy乨S`ǸB;iTo8k&0SRLLlHRZ5?2Vʢc3 1! iJpǨBUIL=q5D'9*`*P+*GgL<&(-6%T nbqMI&"_Q%Mw&MӞΛ|ѱnImqq!+[. YEr-oc0G*nu$ g(JtzԽb,Cݒ,\BzJ%g\>Ju'X·FfP YDSMb6,ҏĚZOgy@ 3Y H8)Y0GF9ugJIJy;@:itA,ATԿ&6*4$$4݇lMTioҽ6aIHbX*. ;+ ZUL4{Ytd {m$m;ʄ.&.\> !w`yKmXr>'Y"L߆? EA@Pѹ܃fs)l;Q*:ަx'd} hKA@XeAq.#Ńw)6ɍ"rȖ"fwO}aJ3D9`{A9PY'wY5E5^1A4D _4,)Z5Ԡ-LJ8W00}E,Z̯溬BH$Eyb KtzW`8LL=u]!%%J2sw_ws+%x`'ʉ#5r8ʹ85#31ELz(6Q>Vx_NNzI`t#]8x:9J '/A..R`i„8v}-^z4=O ̇O'囜VpHfe K(><3«.#:|/Pgn{pĞ>8EG gQ`ﺶpP,L s҈;Gl&'GK]k9i@¢b\"0^"VD/dm69YڇC21K~Y,lks/iLcG־āqIeQt<1^{X2BMΉ٩#\?dV_"Y+{ȳxiZ"Oc[fŋ/S id nݵ\>I<*1D}fF.H)d9dw_6_MGqk%b}O;dGk,u1 ^wOqYW1tjdguztˡ / %95.#()%bɓ0HDaA Hdkůu%`L 8VbrDCJ< +1t-в-8'%bh5lv~EIk𠏻D#WvϲlQ ڋC,hb*\6%8Lݗ`5ٵq`15=:uiOUA:gB !qZ m&1/\qP)ءϺYbԤS7'^bhҕ/d9Lg1 +ֺr{M szg!|PE遜\xt8x} TIbqcdi'?eqa b -v]<*Yx]|LKjrbIaNA 'HAqE`hN0/ E:d2.Lڈ| kGY%aF$DBW'/3\P"##N &[>X$;nt(#E]pX%+5-Koui#s7~FH@)nV\|AD"L `'IxƜ@fVd芠Kl)T5]bi,4`F& \hE):r<Zg%8;]tfD;,S׿Nq8ЇSQUeWړIlE!BqH?iޤb"h"a -=o zj2zᔷDjސQ|viyI9 vf&9LCů%Aj=|_O~#Ȇm:W+|ӡf.pW188uG"cv9+ѻJTz*/QH.ɇGJ0, חˠtosǡLCW<1Â0QbJd;8uʙ& Bj :8q:7:El g`B\0|"M`d\0 ~/UstS.h.rBSޅl8Z nƎ/d0..n4۔vL8L Y6*OKP n?.,lE0`..7f?>]1;7LbO;'d0r`>mdb`;Τ PD:`X- 3Caw|yb,V8LϩWf BW@ PTɬmVE5].^ ٘)m OYn"n} vNL eTNpq1s 2NU``8jnā-/ȭhh`8#pT2ʓ҆~z0[=|f_hxhGzO5L>%ޘsV!t ]:9p`8g9wlmaQeG'd3(0HU&^<(c",0ǿl5)..nH&6 t)5(mf:$ b `ʪ8_I̖[vWG^m=]1Whݍcć#OVA&(e؉{#XlS gvA.m#&[#b1r.a( MܚE]`q'O"n N{C #G{'>z}je1V>xhQtX77'lf&vI}W7”=(3bIii#/ e`'Di8*Q4>^cP.Տ_hǹ|䋆0'NdI,,q` \ KUJm2/9|t91LPIRDH}B"]8Va8ħ×`uR}+Dw?Cqԁf*Pl$ f9sݕ<%IVOĻȯkg5$a"CЄ|PۤJ0 |@wB|( h4)_.+S1xZ|&uf_#:@·̂{B%0'8/<1ES2WfB^3) z%>RTBd6 =xG;UBHpj+:ģ/'nU@wmTx 4J/g!4dUH)6Aگ?PZ J7"OSbt;Khv[o,9Ą;kTT { e15ad`KA7)/p P6}a''Za#`) qy)|EωaqbRM9̗81 lXWg%X(\(I !Ƃ Q`Hq$Q86slVGjZ鑵 % k zbĐ`u-Kàx~:Xfϙ fwi֍H9M][ &D>ycYJA)I5A_DJ[BHlPb 'b3NWCul$UVNQ$^ ؆)Pyi PBF$;Kp' c*2&Q((L91^LZX_DjM3{|9w>"٧>O!8˕V8W5R#5 YXGRxpSzv$PG}`v_.D<]l8r} ptZĠ:16x,V@e-J1CJ2,U"!M4!s1pI16t`nI54sT0tg_2=1tgɠ+]HHLL =\d`ɤ0r]!N rΐ*]U:ơ$etbH1чaquS`A4RtJK1aL[ ,rAHKG"͗hwOWuFyYi9X_$F 0 _a" ѳ\"7z53}dIzkc)c1K͖y-"S0[;`|`vR%1dC.4$\ٗ0tN1)Pf 9E7-8 9]:o(%iA({G1JtmK~LbJAuH}A @5,_ /-x!_DV8kmgՇO0!i\qhcj|EHƁ^$IKD2ffq"@*S"C-◢c' 6h8L_E|ǿl6Ά\dU 28.x9XVpnxBb6d{c8fkk{Λ\>flr¥r2V *#/XEF^XJ6ak߉vIQR!)AG27/3r5N3yi6kJM;!?>1Y8 ,1Ob~mw)+ZI~^Zi,@pIgrI]Йbvӹ68OA! 'tsKgFt~ytpdǑvHbQ1niϦI ס :_!A/Ox&COۆYSd ;φIb*QrE$_4=?D@buJHnҫ9|$'#t8ڠ@t4\:IC+3/@,3e\$9- &#Dr+т6{v o5h"i5$ͻ>'@Nef {v L\Ȧ/99S)XO9^qk<'KS:^`i%e~M1x&p\'#V&ppO҆yq%cۚ|aIHo 1 [#Gs-2c$sLT<'@\`M60Hs% lуGB|̫9r[-U:=,@Q?Eod*y0H+IҤª cwWxnwr9w<1ėٝ;5 |sG4A ;edrԿ};}XøʯyeJQ8D<)tEZ9>pj}j;2z^n<Ű1bhO}(B R(X[Te 3kC4kʗ` Tdb=b|g[t=v=v7lolSlGR3%Y WLp+&SOG)AQ2\2.f]^.xY Js kX/*rRb8_Gb'fU),lb#7F; rV:{Ust]1`{aQp49")*IVы[g2(yiߜHٯ''ۏ׬q}ư4GͲ0Ѡc)/lL y݀śG5ڿʷ(_/h`HNPwLf#G|%̃-)Od/ Dtu\xذhcZgl?ӮOfJ7*"$Ϲȼ].Eeڃi-uHFQ##3(L@Rf"L1lCh!3ֈ3<Nf1>ey.;@#Wy c_PJx6  XY,)"М^+&b6(Mqvѝ%hwR'w2} (_*!a(SLs Q}e66#^u1v@$~nIt`vx 6`V96g\SϹL9+&[*wgȎu\$\5)Aԓ@|vɁ,\-d @)WyCiȆKWT6Fޣ4z5A Ɛ?̟<G1D]1$mIUS7ZSZ|2%^TLdtR<Qw1yC#Wu&1 I^ؕcv,9aA䮮fBˁsnb| ]&CNr svFzG:w9<"r'^: b<4 wRJi !8 F3,MNL ŁjdX @ٙ_kU{D~B28R|쯮5[pEX*%mc:+qwQȄH< ("+x }u,aq_]j6U->5l_0^η04 _$f=1$hXd|=*3k&iSSRcޗ4SJA֫sa:ܓy a9JF}/'|F[`|"Q_NV9~3 L"ҨP%kV,e9PDhUڡѥM.8к'U\^1.|81y8NRx`9'uJzf kBôPY脑/`E0 ޼b ĥamha ̪a 琲K4v K}^!tP6qT?&E%הALX "cHD8*`GO{@ [[~}nUl~%]! /ZEUlJؐ2h/:~:Xm^v { ĉq0y@+%BjiS.PUymB;J.@ymxa *'f`ѕu  V2Vc䝸hSs?gqd8!rŎ7FD;llQٙ 3̒#qS-7h̪=7c*&'Q'f ]%ٻiIqdK"X0lX⏮L-Y3au2_1TJNn i òS'BK%)5DA`lSMʝ';^ԕ80%{y9ٰ /L7Y88quZaqj/ XX=}O9 K;E6+PJ3͎ȘmWvb^@q&Qb&y[VE 9~';+Q pm*6XnKTb>h/𫉭Nk`#8o<1ClKU_8̆M<\J'U^3eYb_tZt7xm$*F׷P$P%Q>K6DqY,sIHr I`3U[9MW>hbduR -#f ]FLY U{ /F@ !ZF]T0uZ@)*)Д81 +wFHLP[䧸1/zF-TJ>dTȉqY'&s816b6F @u2ЂnC99G=m 'f%0m0AxWޒurnB6 Ym!# QZZUJ*{{0B l81WVEey?\0 RajÀ`kÔQ $̢p%RI.$Zrܓj(?Kth'xPw.#*5CcaCNMQFͪA O6&wvI} d!V\Y7'Aq6$J{x4fs~4n4^>EeTz'Spv g}RT W _[)SK}G yX^6!ip Î-J];*p@❅Ё(T1J"A5r-.RxBM\@|J:r0sq^9 ̸$D74x:UP/h4r%L< gE`\7q.!a՞yidr \$G4l4qS )!ISd#E+-FW`JW.`ZI3Ey0B[A]Z;b /:%Dg5谋xh< I:NzVDV-$/8Ȣ]J"99hk:v8OaO/L5$M ѕc: d=|(Ռ5zi"lL^da)ON $81<0 +q0\ G˄ X"$gAͻ ]mAkCK+ d/UIA Yd]]gPNY5ёG¢he&[rst͢U/2"gNQMA:aN Q޻up6&D0k{+G4Q 㔴y KJQ4'.RC6]2TEYL&'G j"?=ʗfXcPFP^!H #brDk5d̜+t*]V]lJì.!R_*ZaJYnLң91$!A !y) Hҕ4C!e,:Yg'0QMH Z2$GhɲtFR $2d qgtchbF yϥ,5rNa9@9avmk[{, pKlvkSs(DTcRudH|G$]YEj(Cvav%IX"krMzq`l-ǧ+%O-Yu )ۣ&1f13VB693pK?FRFRSaFp"]Qԙ]V.T{jT3eu+pɜü$p ňG<,ǜufyA 8>]4?]ѡ$VQͧU)`Dqj1-z\k &0B'Wf'#ZxhӋ_Vrژ@t;1N~ny34 [ϐ QL>ð5I7oh`;ϻM!b;LÀa03:ҷv=1<ʌ筵 k:>/pp5VTu[^4MDG>Wi;Ѯ;쌻fÂӱDC 1C"J^ɮzzOYI;1\gLCa3*{AgÈlYZ\JօC7)@hFi !\7-֓핖M^I)qx ޳yփ0f`N lTI'@d17'&S^TDGe&lg5Qj8,0#*pf2Fť]0mij""f(3V:cxja>op 4agc 0ǒk‚ꚜ O:K0H`g.Q$dESn`)+A^ԕ`0AuzXLf5V^_i` q V91"BNQU9ާDPUNnYu&ı_'&2+5v+TYf%HÕ gek'd$ņsd_Sg1d+i%;'~7c&tܺ\[Sr$LXق &Ѕ#INx:F?oqwKB#:9zH%~Ûz:C_N kp5YXؘ=Pn+H'`CFѧej;*.4ʐu?qATJrSqS\~AhvV,I{BF-I4hrH_/#Ԃ[/U5@vԎP* %Xh_a  _GM8ϊY(: ,^uCհyJ9ב0OTPC_ב b%z$q:riCpDS딄nO6= Jgb+Qȍ!F }!hIC_{uQcWJr~vVv#5;5S~7E :l'$jD  kƀT SԆDB$z:5p\FРcSBnK4RfiT:IH kƀQC_f8d }9 PB_ur4UKgz;ց*Չw86nd\F+/7 kHB#_Mj+ hJ<(zO[GxJl,A ^~Wv+kٱ*;jkv%*,;0|JRG9`B_GJW4:]"k`p 4 UC_Ui+iHfn89}:[B_F6. [ U#"D6$o.u/=JlvҢ_/JQ~5>W@a݆PjrH&! ɔ9D|ӠCԗ1KugTm% z\Ti]4+Q-Sb+ޮбk$@5*5V/ ,إ P/dFWsL3~`{r?>]1ް.,q`2=r\JnG Ev3֌Wz+@+`.QBIK䨄+ق[d]_i $mIKpLG|2& F96& !+XHnA`WIVX,=RZXPm;XBLD̒ޏzX1ЄG ' 'e4xOƜ6 EY`Εցw .cx;"l}\$6==+1PcÀ#Xj Kp$c_݂\8 K~/\x$Q¨]ГtG h$0XScBp,|05.`IK`G GS?aΆLswSa{M;uГ͇@XZ,]>05$dMlL@\v,5!Kv+(WdM>vӎya Q궼s"5(A+U SCMRtOQP`7Fɪ5H`wņ!10Zc b'<%J`, 3}*a=g;^evkG,ͶHM|`QR3%"ΉׁSxXg`y=1A:cn"& i$_ ӓ0})0 E[縃^U?;Q*z@k`cj]0,jjuFHa<2oc2vT êE:/w/jTY0,2t֬kQ83By= Ԉ=r`.;% Ƙp(6Cf40M";ﰖ@"?grq6f.2#?^0 bQJIc;jS,8LѮ$w~(Ky*JEi&?P&-qlx SOic! aB4(ݢl W;G r) ГHasbLnӇP#)'PG`4:ԐeTvwk:H4#O1dQVňЃ&)b`0YNV([&x`O^Xجz-q.xS< _HʪGW.;+0,f . LD`S=!Q2lga\cO P`i1jKiĩ T-<6}(1ϙxpd=OdT' kF 35o>rQS4VCp gedFz Ά .Fo .)1HG!m4 *^x:GꨔzlJeU05kڴ̫:ay`0̤h^%Gi+? 6'1G;.]Р^ȳ%eD[ 77Bo%숎@JZ*i)TADZubq=¬aDx5Ʋf@XYskD&&%$5' mxa$jUDam,lN$WF$,Ұ4`cܺ91:"fe plR+d|`ˁ~KGQ/ )7xO'(zuNv ^{8CIY(Z%iхϔ`JPWbJq95y_K1DvRW4*}!{{j y7>K.VV1#n@WS_?> stream xˎ.;%6ϧP]15`NWa]v~|k-RSqp ]H71J߿?q|_?|V{!u={=:W\?Xkǿ?yH/wY\)s1M_ز[}~v_ϞZ4u׿5k:ؽoU뵽ܺuus??}&4_?Sm_m|5tJ`~mL-Z_uS}1uVG5[`WKu^=1Nxl-WBC kKfDHtSx } k2ݢ1>k|GYvA8qO̒(7ŎтnuHl3L:~[K}N.t괯\ɥ깸6hDu%&v8X'{Y,x0-{X42ߑ1M ZIZzr ^ ZZk$Z.hΨZK n7; ?L Kd%1]NFB. c+ͳwPwsk0bo[INz.7R|‚o!C9<1o@p<652- #=1 vI[<0ED V#I5>3f1K1Ocsf'yhTtpHx-MW" f_]BkY0eE[q6]O9Q})EZDqV~G]$jDr;vr 0DynTy㉮(1p1-wv [o`R弆M{l$-=`,s>^EZ8@h7tѢv ޚͺ*4;mНGZou2u0ct{;1tv;80rr#wc;7q{WJ#q {d7ACР@5L.7Wճ$\p1Xgs?Ks? ?0M B7o3CO tbB#1YtP)\?-& Zq2Gp:n=w\ 5jR&{PjISkQˤZ8$yϽ֏=S{X}bp,s%Yo)8LNo~Rah&7l?Bw4[E]Z=,8C)4ɌYOwL I qrzu2kA6Q#(e RxhKKvp)b4uDNi(˒!r ;RǶgu RbW.CIְ|WL\uq_uS<{:iy#dRR8)zzC'̑AlkےH%XImq6ei(2`_S^r,>b5fmaz6cVZovVۤSd/ű`ddQx:G"3=v&ѦG?1 N8-Cn^]`iSƃ01M5#,m{*e\ҕ29ڼhGF-`5~<_9僧 4b~/Ok݃o~b^Hjs+C/LC/8 =|XC m_>O)KKL`N v]\ڃׂӔR S~mC7g`1c!ټtts^K:+\SMJsBKcl'ٱOelKrR7llR_${oJ7cldNBs:{rq(Lj'ն+X87ۦ+)y_RGXlVx2 Z%b-- 1'/gn}9qhSFjogͦi[㘮0ɴ:kw})HR+7Qf`#*k79^ 2Z\:i Q9D:z Yރx>l:2U|i lb](p@l 9#k;EP72)sj5za%=Rvz~WKwߢuyl$dQba.2s9N$W:pٞ,)O_u lؔםp=`:-039|i?12[&&3EBi ۉ dᲒTU5ZЂ #4)OKݳ`O[|Gs#cN}6 m's\yOpX?zc&j.u$tN)n$K9O3MچzJ]1r C'y@V>E pgAK|w-ɜvJ'q?IY"Pbuxbة7|G޴A"I.s .Y7Y$i"7? O>QZ;NBw Φш|ȳ0(32riESDYxTVEn=/7f:ڙfS}R<0 G`Ti<16%N7f"S%|5ܞGB 54 v iD$o!\ Hxw|cM9YOX{`4yPͺh|%1`apՙf5nR`V1XKX5Ϣ/f<`dXlywcĭ6 X_7=9nqnpQt0@78숅s,71F=b3G0(8fv lָqÔIqm- 54-}- n>ƙ ,m s'|u1ZA%8WªYK+~gޞNu|nT=`҃v)u5Qw`w $M O05H < d7m;|)iaKbǁF$QIhP8˲9F˜we-jGvIt'0,grn`-$9L|.L4̾(F:Ņ%||`#1dC f$^1R'a1v+ׂ vCĕ :az`D >1H[bܯ̆ʬBނП%ʲDĶ0LO]%w$ɳیW/DIl'͢c[a-.&Iފ@plH̓]:ˡK,8Ŝ J~`gI#ERa<p'fk4 ؎z6h1/QXdz{Z¶i bűU64UL ԯC˗3E"y!Lj#R &)#(J-i|XtV.=lSCl3X EXRL:h.wnA>2hl' 2׉s`լ?/3~ЃnBlOз̇~g+3*QOE`IR{]ɩ[?#L:WL`H&4ql:c<ELJL$jg$9\NBxSLk?[0aI%="sR(3V{N2 LK/f9 ؎<3'cqTY1Tf7̂g=t0 hpAFC pZ {m}.")CGG#mE viGb~>G9f٣y;9@IY5K Z Dmt8l%d VQ&oIM"@9V)+Q =g1gN پap ZkcRB_Cn&B#(7&-J2d EkՊn5%5W2Yf7%ΞENV\YDepX˘2wV1aq?|"xD:5y4̃0kٻ2v&&Pvbv[S̈p1N:-QQCI}FPUZ|q0g-q+ T ɒQ'?7f2qSH:r+t1ESE ҝ ZPZQB Nz4 5rKTζ"|JNnMӭoD:-ﻝ& T?nedg Sb 3Q)].ֲr`ӼSq?1Q3ƣsq[<<[CSTqKlmLW8lOڶ'`OLR&I`č^TZT3ՠΠ+C}TzZ+w5SӃ\+Kox`3wү;0n7-ɔtq11G%]\dJRxnrv}YS߾|0y>+.At]:[&iV:g;|+q``I _fJ =M7CӖ=DTR.WNM9̆sHb)Gl2t6((<l|2nm_ڑnHjgiYkZzcOHs 8'dMCu& [ ! yxw?~c@Ď}`c W%Am R_)51+PnA=71T}0pEvV*ܮ8f9m˪)$Qmfm<_pиap!6oƣv=a9sbjyv./e@ʱjmI@Ώ}y"*GjYke yRxib6w"W-.$FK+%DDKI@^bފl bs, zʻHiQ._ a`rt,@ju)}11z%g%s0~Hg:\MSg!(lmIBwS9&u>NEԨLAXAԑt땅T- M(#1H3p"rR:aXFx y4\Jf W>Μ6CmGxun!sCN٥f*J@_fUʦ]fleal6 mVSɩ O) `0×S T?|[ l*l&=2C4'F&}7vYE:>Z<1\#A?l+Cۍ*y)ovo`}0A {xa-(:IO2fP)Ry2i;9 Uk Bޠ3dR3-5!虽i06QÓoYT/f.Us<'ȟ7&#%^YӞ,`NAʫ>H_IAJiM CAOo~` okyxb8(9+!n>QfA0]uLxi+I;@ÛvH[cnJ/M#yiuRgnҮCqN,J&ejXe·gpAq\ܜH.-^D boE٢ ~ʔ&Y6"|2tŘOefvX\i&5j5q,EZ4Fo|b$iIzQf\(9R؃lMO , 'fBI8}^MG武-d7zpCZy^$>r\LL5*Oݶ^Y"<Z^3%M&%)*%K`Lڼ-f$z8 p*]]#d<%AxBQw!5vE@Jy9Z=uGGl? ɖRc JK㇙BbTny [^-#v7ŲEV¨Ehw "/̛&@8:$~`I0ǘijU>>Em68\YHF2al=? ׽6zԻ]#djk ty^YUsD[j*s`ORW4.dd  N%jInzUFZYL/tK-Xb3Uih"^pW:4n`ll)"Ӎ"P<p 1[^5LӐOc'<04|6x"Yrc33@(,P=J/y0sj@D-N}HnZ lfÅoP`Tf f! 9 v8<<0d=Bha> hhum`6,-k=-eQ+Kb K"}PWH9^0$ B1n3 j1x]n-{к6zIPX6cM[?kp|X"G'-w|􊫪ڥbެt1NZ`Z6mcsD:3WwpqY%3^am]J{a2 G q`h+"jCJTV@'aj&oRPTg=Ho=_`#`L9zY,{`2JG'怓/ Fލ(K'&ۅ|,nbs!P:ʰ&xmT^4<є6 qONdTtQg/wId N$2_4F>kVQjS5H`#8xa :ԅ" jPɁH™&s$xc˨.qIM*Q)8-xrҪ @]r 8ƐkvoQTl1orNY$0 #S5Ʊ&-N>0 i0SMs Sw*/Mm.|pW?S ]4L#Ƭ"Sl+*Uj SmJ#m|wU o$_ut$f I}TRG :Iw4 JA|nBsB/ ڻ-,ڭ@unM܄/٭ЧQDa\n }r,\3K-KAd+1=T=#,gWKDח :q+<`=X͂ 횀3*+x 6yFʚ _t, ld)[<1٨G%CzOXVo.\Gߝe™b:$И l6M 6TҩEO-ĂI(,f3 쪩OE'怑h5WͶT҅FSX٢.qwUτ/]tPWM"0FڼT0پoZMA'RZ}7rUáUFd7%X^8Fc=!eW--^a'M"dU(s|iP&}fj2+M(|7)M)I)6x0Zb㘢 0dV`$yoo'P})+/{;[roIjNG DbsDYf?V;|*[83+ _S}Aq׈ubn_S?1z:KrNUL2I58aj%@Y 3j& =I-`̿~§hq- f ob'0أi l ä(*!D՟ ?D3xO #iSiG bLJ$AU_aDG0ޑ6&Gp_#njҊmG~[CG~bvWpD~&!m}2Ư;D(x woЪ1πoe6Ʃ_[wזx&ĩ3BAE>MEOLzOy`<һ<4_~}5\~} QV.3+o(#-#Kqot_*OT8RmWsD^fEK)m{ZaGü6tmla~_r#.W<k5m7F#kc19-PzzEADoh.'ضg|&86sa^""ʻWww`5 (B1ޖ;9YՖQ"$ ocQ鶒t#-i ۣs(hq+MODk!螘-?-=a֔A֨yv5my[TH#OLtAA(q(1P*;rRGy5 "*LVǣ(oFyΒvyMДcDG]Sq wR҃&Gӕ 0U`$=R<ސ/U*1\]{I4yo3['w6|I[ǻ1ZD-5^ ҆ )[X;_1ށ’-c`-c(^kH=OfHgW-#oQh!u;ZH7.;k3U"4aKBۏH ,Ezmy Yn,&ºG'1Ӄ-mz)kcY(kpr3%0s͌uSVV*iAAOLuyb"{xb"{A ڰa)kRZ2^J O!qzk@Xo.9=g^sfOGAFX5BHrp$\P3QY֚h:/YV#UDl0B*/VXl-R> #*W Wځ^FiЮ܀C^9嶇z];죰g4{ym;[ZR<߃zGd'f?(Rgeg:W吏z_*4a~~'FO=F}b@~1I{ 3w& ;놨{+ZzE7~8CǼ6>B)qgů>1S8v ֈVb oQh_ߛc9׉s9G?+pW'Ծmguji.@nq~Sr ~]Qh7f?ꗌ^3Ϻ1|z$" +?>Qrc#c=t~ā^.D+M׊ J]̡)p4N(pݐ7cnp >G:9:) n6)ot5|TρՑC(u]M&/7˴=V6'fߊNtE?9A9G쎭%"bݨOn<1OJb!*C:0pg}n! }GKo،@/MX{*P}L;0EAb~qCqlr~X{X]5b]ofJayKتxaHQ X#nu6$bT˚2Jc(vnX[|?Z &I6v8A qBSR Z\xW?,2{Nٰk*/̆dqyĻ_ {\p竁<8D0ǭ3'Ő^=Lf2jeBB|濴*{8@0,`3Ӑc.{"ė[U3d3HFd(ew$/yo?0.k)P<0Y),τB3as)C eU&VzȁR9e@g! .j&-ia I$}"bLk=< ['X<- CCg Efx۽RCXiC5?SO.yڤݲ$-Ir~MoP+P)E0$q&<3/(|١X=rؚVPf1œhRo7{ӵ4 ŏ/wCl %V JGRV|ݩ1yO1H:`U(iCu.~ey`2dƀsxb;ô)E.ro 4DV|!f5SR&6Rr: PH_L>flܨ;)S/b@8*l4R\%dJW:NviIFq1E(E2N[`̆Yl$,NqqN3t]7*w~77u T{1%U>]َy"O4#a1C鍇D+.-FiI˛dUwWRzp:5 aMG'aIy6Ҹ.؃yjzu2iLewR"`0?oLxc81z}a%;*fw U,haKw ;Ot:։Bgxo&FqKb>VPkW}J|?==AdiavIF*FBpr&Og/LO{,vaNĸUަ!lx n啛ƴy-5`嬾c 0sv2P(uf%4{ƠWJ'ambiۂ]@JkX .t;g {kuna hD1F,T\F*?.,L?0!hp!1v;S|Eh ĂS_9悫 %7急1K\O+0.RKK\L[k΅TfkyѾva[ЭoTUXz ڠ\fu1=@fP⴪Cga4ԣ*Ϙ70 |1`rޖycd.I]BS/P Jh rEt/sӵ0:yyR E7FT.EBԫQ_ԫ;u~aaT&sX#`MRZstv.%ўh,L+myOp(o?1WܟR'怃z ۫jQ1N")ՊvOE˾{c֨51B≩W2;SF[^ )~\0=/{Km"EhS~;3\XЙ?ޘ7? M(|O 4\S@7Ђ0S꽨_tgr4@KSbY]H`,,É8=<1o`Qia^TT%'^M&A&E~q?f8hdD\2a^~}*~CAG f7RD tw[v:YDAnʷNRx{ wPU$~&H#jA]`&"IB#nc #ɵ*ekҊϤ-~=/xQYG?Exq o`i MK[g}a1zRA2IO1 H$Wm]GRa}m3b3UڵwȜgs9R"kW<ឩ{ l䇌&eNA "v)ISޜ/,Xx1z7%7E2qE  I׉ .1"5pbqegi뙩6٤ z^= t)Q"US#- L=s%!=d13bjɌ<̍Grg?? y1m6JcMH DZOpqE`\Lb$9|H>}H e) /Y_j4M颱NZv A4d4M݅d;b#x`6z[`ymCHO 1!-2Co|*׺,gH<+Ŷyv#z@۞^$^GM %*!Әo֯O@6L>U`qdSb=`<-#ݜcH fC;w a<сu  JJР<9M|g;[$Uv6%0KRXڄ(Ŝp! )|O]A_5},m9aS=6ŵ^`Lv?މ>$1˓\OC "yɴ0Y-wd#efvyƏ;<#hO(m-a&u_6|Eu hϣi3.I^3bSYTP}Wu4Tԏ[)qYd)xY.ڎ΢~O]Y+;0.{Y+Z?d|yypJ]Ir|m#'Ʌ8,:0DT;YQXndٻ?1urSRI7뎷|̓c(.|ȇ E|u<"T Fނ$Mul`kTE咉U| q5ckEv>0 #^EK'WLwKˈ\pn"s-ilae35kxS&@))5z/&3 ̪iLe VJNlkqï"HLsDu 7O+$xӁ8:O+7OBZTU@q+p,I Ocqxǔ׿gY|*!qx>d |eS,*Sy$-&d0QTꎽ151lp2əa8Ʃ$/L3)nĔ eNOqa27)8z;3/n9QäOh=X*Lg9;A)OCRxcnOwe[.M}񘧓erRiٮ1,AVs[!1ReH1cyH !i]>:Y83n0{¬Oh%32W= rx~g:JX<{ٰ6Fɇ 3<RaACj%&Zv`K3R$7 a)y.7f~~ޘiTb>yNޮ昨Vƺ?1WϪuVSKI\~-l \f7 Ya{*/]@O,ڙ &ْ3h΃ {4UV.!ƥl[^zGQ ;*7񎪬 ^ ›6.2?vCΡlТw-eΠ\bC1yDKwaMkgp~$9iupL=FASiI[nNc>0,\E.8育yNu-gmg >m%Ŗ(PH$ iAHd_68[(`7*EFs},x`p;̔-3Iv k(Wn3QYBpfXڰy%ErцQ%z\2sKWf ya=Ws$FɧUr$%S(a$0y*y, J_u9Cق2ƮvKa(5>{Ϣ/n)Oq^}O[K"Ҩ̭?Y‹m~ p\}aJph_|a>ak ]Me騨'p^-fޟqŶFTPc-mXvomH;/̂h+F g[z٠ƾņa(0J9kR{Ŭy6챈T]Ysu7Ǜg5vgi4q o0yaJmG'np3f羆5\(-`U_;]{[}Ö[w\-.8T*AHK?^ UXQFՃ<.AҌYF%nr D *a?56*c=RjV^` W+JV/dk՞jjž_3h Z)7*V$Vcr?~zʫٌQۊSybe1ܞe^^mcq,SƂ`fC0: D^W-LLGNaFYvdjCu*/3C,(*VdhqRa5 KJjڵT+T.lW ya66o"IEm5vZ1NADZX@f兎sja(J1m;[٣r{enhdm$\h՞j֣ou(fh1Z%wIV+E?j}_hH\V{a6GBYZZ,[ALζjBx^_mc\nfww1oyrmN5!Rs^%k|^n- {5Ji"Vb_+ =6šCׅ})([LD' N8/pS`HG8-3*ϊ8_*}TVfbe^O+ù+8[S;5蚖*ٷPH6;^ Ga5U/{ y5SAx5Anjx*$P2[[ k/{Тs^?Y0͕EU5o`#? kAV*Ϟj]a0v^bmêDl0m ˬ̚C/s SOL62k6)2ka~i]j}[wӑj` ״^gx-$mu^ G ~aq| mZz}jfzr0(L4C-fRE:h*EZZQgmcDDWT9xɾꡝ 7lH gv6uTp};dn&4suЌjOK %!1/)fp-U%18ԅ~Ϥ8x|y~y SA-ŴXIxYzy)h1.}?v}FDt`5lһEpQ@?AO<1|-ø'7*2ƦD=aD㞾39bEoʋ}h r] (:gO}`m iz5cF0s|vl)wz>+kO 9P#8s%Cɶ'\≶/^xРހi}0ÜwV< <~d૟7bHVu]Minf0t1Ha^ZܻBLq62)Gt5 AH<`#.Dс6cY[Ҵ.2n~#Jha¯4/-Taq._LF f\L7"j;A9#bkLzHҪ$ԝ }9pKxzsML{qI~ /#=d{PPr[A5p:`g]a+;8=$!{]V[MaeGl^6:=4j&csІ D!,q?u 5x+tvҶrkM+}nGS,gKDˢU0 s=HYY{s`pƣt]^"vدqwcM 绨 /x=@$ ʢv`SRt_]rMѤV!eP-697:"l;is7S!Y"μZL>ٔWP9)-$C'B܋eN!d{o9g^5x7 . m;ŋHI׹_S:/*d#es~yc: 4S ޛZ+wQڧT;E ih1gTA><'̷O T~\e/iS爊r]/|llGVοF Z[ ZI႒lHc_Đ4)gO+κV"T.}{- ~\ hxN5/8/̆7gIbƬx|6VZkwv %H)5u[Li/ORQYyav )</q+-6bI$Ke A1> 4.P\{z)fem'~+M;$jřP^SGW2Z 6!Uə I:Cŷ. Ӧ>jw.Zܮʒz. ޠx 0LQehGk䋅aE"A{@$g F=J6~"9l ڍ$ˎW pǐ p"0 c4XJ1V y{a66%k;pmJu &SQ_1wHkcXIo /r}xbXiz%=gjyd75ӜTVD+SXMIXm>,ZBzj:"oFcN3b6%w8u*CףRgV:a=耤,ɹyODvE>ޘ7hޫhxUYEGқbYr5:#zG=CgY*(QCӒ~u4 l8X:"2#up2^Nc Nf$SYKsO ;=[TYq=B@ny y ݧM2nI^x*`B7@lBC;"CQ#@m_ w9H|ah'0bhNtm&rp` Ƚ y/G{_+E 頿ƣoS`k!3}4pԗNlU"{^O ?G??H:<r0 wʌWPu>Q\F'أNS79Ue_>?0Xْ^?^_ h~ޗ٭v耘_'9(Χ~bul^Amʁ`M$w;ap*ރc|eL2S$4+b?Jek|VLyN/+@0ExS\O 1z㆞0lA:0HeraIC FKNbyc6Z M XoގfTv1^X׏ҍpODX C?#70K|N-qM?|K3fza})6(hZmUk@'- m.aC!Cx6=׏wa:4 i<1[Ufџ`P0;`paX|l}5¦<t-E8͂V.čaa .ցB0 oZЎY@DfbY{K5jkl3 6S.ť+]KQNK=پCc )KK- }r"xxb$d0P`@Mt0/NmDxc,v3Ob[>vN =1Bnh,|s.Z\Ӹnӂ0d vnۋh7&o w)[JXjs}ݬ2D}h!ȷx2i>ӡW?<< Q{e NH' FE^,P7<*d3Ap)oP\ Ӑ<&Y :FY9x 6Lc'K`:l_:Gdl{|09"X `F,ӵ.*;"x9A[51G¯V:KӾp7m:l+`m7&ۄrtl1}W=['͢K0WBZi$NlVSB  e&: t:l$b>X'f3$ Mnh]`^J'ޘZ®g*sP̈d~xJ jf I/|Ŝ=Vc+0󝎳7&.0y 1/I-x$q8Oɼl2ޛLGVBkOE+n[ 'Zt2m'!q0볰$~DZ0>hX靧̴g]blmI%pHHr!TQ`U}TOkCݾZigz2sn׻z.ܦfKb nBEA|h+_0ά 3?@c =Z<1MOkQ6[SqV*M61\Mʢ5[Mhe%%vV ?0KU 9@ww#`$< BaC `^gĂǗT9zb\q,+O TQ;leA`(ĆFcè≽4 FHBNitB/0W#&cu;;/lת$ 10lRI|1y/^ 5̖vF3pL_ |y 3jn=)^>p*il*zb&k lbqlFsŰ{r\4;x8ZDՅ=I֐FcpHL/CgJ͔ϲYKF+~ ̚?o D>v%b.נcGlpXͥ\JLx/ QTLr@\#WL.OЁ"4 pFP' I%ͬ_{UG˂ڂ9h5#^n=1\S/h^9)&qJ~)|b2659` M92Ź[ˉQؿ߻=2̯^kuHЂ:oeS4I9"^~~0J~`[.?ab L SrOw{cs;SUuBZmU&RR{QuP`U%N1[ļSE?}U` J-h||٪9!?OVܼyjIlq*vBB51)eC.ZJ({+3S O'wtcbYn^-n.kcքoZxŘ>s=Q*Vc;ltp|Q(ga׌j #ZX h 4Z܋6$8l5i#YJ|e7F햎t |?i:^B( Y§2>fEDbFB `{"-ȿj@$vN}wRunRC6v`U2On'vlE9  8)lAgI;ܞMrtsv?+z^k APw15z$OĤ;`LRg j"YcVDL*P+uL5^dd[gpEYz6UU1Fx- nIfCgHnPtT  A `YàL-dsAXJ-t|ovgR@J ˩jr# 寣Νh XA,/fx-)XUJu #o YE[DSɳDf0ͱWv V0HX2L|_F1nzbPFusq'l&.I郞Z DIGQ7#sXOw>aqCc{avטn1o%f]g# zQSP#͊ 7`L% wHg] TڵY:h=9[/"NDb&ʷaP'3%o0^SikMM2wxB|]"r5)2t*k9~[vr1U%SZ$%o_:*(\+ʺe€!ُ g&ǧ\qwk7OsM&ֳڞ,Jc P#׷ϩҜxThOL/~cbݴ@'eP ־O.fx4!)3A*;O@_^( k&vah~ϪSj $$"vd'd:|Sd~nʾ$%dHdeqlp ??nA2v{A7YV[玃Y gt/Ì2ix3Uw܁i!b<0 %# 0 ER'Ypmxl.p 2d.BzG:@K߰^%SA H+Ȏ2OPx\j-.Wgp\97.vaW9hϲ|z= hS~2Z_ 8-әS7&֝7ynfT>sIJQ4ps&&l*#1sER,gR gd7tW%)'OݭX4pe'|krL`׏H.5YC~0`{U.T綮y (XtՖO]%?LaqPaHQ'OȰse;?9j~uT`)M!Yбe瘮Dެ̓._dzt5(y £OSۍŏCdb7]vALqC4+ @c:b?yJGSn)Ve/~]5~V2|t-;cI?ly6g av6*t 49`j̆S\1*ؚ-p-Ǧ w;A-W5ċ>,<[ż}Gs>lK;P]4WATQV^ R"CѹQ_ ?c[:ʱ Վd} !ajW bQB96?[hG 68M~ ?/ìH` "5ʼ^iY>FeT.MkP(i61™|'?jV^Y}(d-'a?9Nŋ)c!8J<&/tJ72tIb.YFwfA o@:W f-B'1-`ƥ"1ǖӸ=5 YNq9`YzQzIQR{̻ioqN3pЊ,~^#9 0w1,n ڋ}mXL wc4HG?~nIpk`]i&/&ssgmЬFm|*ȍ͇NةѨVV;/F3kƢԴݪgA4Mث93h }C.|“)Fi's9<۰ Uѩwɬfh^>Ӷ%fZpe7ULޣ C j<.͙9AFUd]1X6x Gi$s!fx'&=xC S2*%'.WM۞ޚfbIU jJQV}P,xù!KoaY'CY?ӤT Zyd2B ?@OcprHX*2ӗk 'Y`ɵ -6&8(1;F|X\A3^rs):ܳ `V;u}%4_B`Ɨ`OTUB?V xkRǸJZ1U:+f$q %U_bh=1埐CWiz6]_pagavW1zJYB9?MۮU蘺_4ϊF*a3PAгŅy 's}Pd]_umbYp1[bjs@niebz)26HTU;Җ%=*$5 F dO8ƀ7@~+v iJKZY֫չÌ!au 4l;N՟zC:K{7\'&hu<@E#%%s~~4QI`RҬm2=`(hS}V59q.8ˎq΂^دEQ>5RW%0QwO70v`SH났{&VM놅"zO+4v3gU\u K u^oJ4/+ jQv-S+Lia+^%^?0+o5آ?OYHz1~ߣ5[Ο{VD 86Y / DO@/MVսKYu- h74.k)bGndHi fF@191DF ´0`=1$Nu!A[(:OڨܠSL&P7K#GWwT{aݥΧy?iU݌ ,"?Hbk!ߓIso1MrjiyfnH۠ԃ.tTm>& '*C i+|ARR0Z@ѡz1 /"*ņjw-PiD\e]o5DgW[#aJL+X*x+jqcδ)FKV<150l 8U0QLԫU}K R=Pb>JEgF&?F*g1/',c?Fb,*Y`BLM=X?[0wx@+3*x1Wa)ޘƥs}X'!"p)Ї3nhjc|NA6-h)#3ya ^n^g {71Š2O4C~ ..A!+ 4] 5Z4R~1Nni{f Ɔ7!MEy>!fk l'͔Q=h>س>J[dXOܾ|&!MJ\v\_~|1_E;dQA']Z0Hx34-#N\2I',rMX驑1n S;1f[ďdzp:^Xj|r3*=TeJ2]RJF(8DuSrM+}mk`l2:0X ,2mF}`eA_+1ЛSvaJܓi{TX͋r:҃.88b^d)iwMtʆs 7kp1>r60oy 2oê;m0B,Fގш䌽  =dgoȇc_x>Ü:=IazܸHKYU[a\g>Z$7|X1Z8 o~{wd`>g[kNxĴyE6șTZ=>Jϭ{ ̵1f&<֔]5Wij+ J$kJH"_,+V{r/D[5 O%`&t,[ ersIN2Q8$d*t:'^t??~%a]٪#sm̾*~GnmDAe)c.׹E`/^n,}r 7慷ɾ1x'=ҤK>UNZ( .~9}!)H| FT_xP\%1i$Y;N 2k=x([Z=#q)I;jJ@ucDlhozcۚ.Y$;5'I[Wd'~֬R;V=(ׯ8EV;VցAveRk5Efkv/Fu KUf ^ybUef+$,إM^b+?@lx2[?V :;FU/vF?D_d.S$R[ꍡ7 8V|}yDф1#a2aS?~bk9LRFV"mV6CTp;;B P !ɭ:agt&fB0*$䎀U~P*'kUDMT%fɭ9-z _J |޶\ O4md.CqSf֠pK [:V"s>k )W!v+֗ә:n֜U6[sey+9ob< =yj,52lڙzBE1RE9˝ZO`"uJn=DTnl%?+KY`0GA,Vb>O 'Fzk8a P"?fѳ[7G0:n٭Hn=&dL56/Eɭӱ(9e+yrkc0Cmuc\ 3LҥCOvxmt6YAV :)k}aHW}/X܊li+PP?:dRf~:NaG/"ۊSQnNh[LrڱHX_^6O97/-k-i*s˓zDmÕ; }|y z˭ {êB_ n!0aGE2XTх"7J7k?9pvTlz-hQWlY e+7Jkn7QV4-jl-v4go%`c6 hqaWR=[_1R*\֡Gd ֠j5PwfIr6,h#4Bիy/qxc0&2vXZ 2wEo]wm6VtK*.&%!=³;(4^"ls'ՕW]n$U\)ReNCuB勇nIb74G~^aR ”Rҋ f'\nܰb08O'/Xȗtn"({ C8*${T2Hս2'.L6'$ XaLM1 -5]SB9wO44ܛ38,&}ર+b ycT4k̋W Of*  d $\"y[3(}_'n}0a)vnzpE^KsD_PC*Aao`T:훾 kHpHP.D"{yQِ~lev‰ ;HG-AUIЃc!oi!(ZH.Ϧ0(;6`T"^&s?k??b\#9Ki/wщ^Oz^h6\s{b)-\9O:xNtU *&~j᫅%$:rF;?>|LH}_@Nyeof ZȌ1BLV:xJzlGʐŠ(C:w{w5EbtJҼ=tyxuK+Z(*}Yg' 3̱p -i VGm9K%x ]g=6a8>>X7onf+YǚU áJ?3$]t$nۄ(9ꦴM0FwD7)JLi*M4BБfʞ9P-/uL/ZcIH: 4['sjۇScV}ٯ=k%C^HpCVxp^fo=}JITU 25MZU-g(nhICFL}owgODWH&4,Ygv 6c؈D'gG:QF -׫ai|sZ㔾Zl`Wl*v?E*w]Y,&ƴ6W|2ՃI @,KT#et+Ud_߿/ ?= N k;f44=n[ShҊ ìy5Ȫ 0ϑ==|I˹{bX"dž1&V[m5gSc,`of̴y>f6~oL[+s9{y"pGy_^w&+o{`PI߿h\Dnqb(|J[ n&w%1x50X+P1|U*LFa=0ܫE*V~a''Vqͳ.ScN*t{ arGjz̴!z2 cUEasc4=gHfp!1yaF8VbF Kf6}4"I|ojfVaIxpc|"O+B</EmӆW JSyYܭrG݇yQ"fhӂ;{磃!Ycξo0WCq!fz/д wx5^GH5Q%ﲲPXLm`CO?``ѩ@4h vm%>b" =hNz ]X7춅ztbC ys٨X}܉WPO\l?l~ar \02P4$UvK~X{0DL\XWO_g-t1/` iώZ<[EOKzY/5}IXaH '1x fZ7̃oUzA;j?Paʡ,mS`| ES.K%*-bJԿV g,r>87 &@1ʀ7F$9>mX'r>$g?> ]O0yXFࠬ; [ Y 2áIwQ̱ԣ\ﯳ[ 7DiNt`^)!?P)ClN reoHwܘ}adVlBs-56O(eDCacTj ꄖ+u;r:mc zd)l9>0 7d+KJ>/:wAٜgӸw~@i*-7C`|R$`4Zjbfa2=&h O*`VxE fdC|}ˤcya&΅_Tā]<,wc^-n7S&W `s03&1/A%uG{Tr> 1&ÎU`<3$W|Xi14 1zmʱ-`ڮ3q.̗]l2&bu!;!h,5ͧ\/He KG8(cOPk_c"nф0U]N0Hܠl /LfDXF4N0Ļm݂F>`3o2+Q& VntyFT8.a3xgB`xי'k]0%LޫZw|PO#,1N8&xLSnSc:?7[ܘA.?Gl[48*=5W ݳ/9’ U*NoR^@y6˼ކցYBA}PT7zZ JY3ɾv_Ԛ\N[ͶdkS#_k*<ȗ~C,"{|D2ʛVmJ/7"* `*X*H#IMI XD qӆ co07 x@Hn=ME7FY&j/ h3ˮ>0\xcة#[ܘK4w ; W %3̮0I \ì!U\ÂDKv*E,XO  d|1mcj/gM-ż*f_E9\O;dias.o~:6D5z*>m.̗Ye lo{R_bքYumNY>l;F75{8ISCMPPTtYvIbӊE4uM PK&*) a*G/5z4#gTnw>=v5߱sc/RKxfeI̕mկžX`,yCWVvh S1 {~vWWz>80Z [ARcj%f˛]܆31L1 BH7n'|1Q'_ؗf"*t>90Sq^`С+yc/E(5ewPU,-``Q==|} ֿQsĿ'F—%9rWpS8.@OY@d"z?[bf)g  yY'4ğX8YbPp1֋p F9Z8yL/ s a'63GZa)Gi CBNiQ00 17oz}L$`,St*۽82%j 0o`eNd5\Pf=1|ąA&]_̆_ ፫ōʍ\1[LcEu=bfezu]#x(8}REe`VGe1 6SSE{8aH@4px8- oDs@lM-xĔn$&JaNu`~3o0_|g{c|qJjAk>,u Xڱɜ 5{KOKa^Й D^{c&$x'u^`#89TAySFmd8Oxf7j,E^e; vpn /lw1/?aY._܍ 2z6C.Ǧ}Rlѩ|c^\ w3k\ӍAY̾9y0&ƞ ^0'pp[֭TA/HIO̡Ā[ħTW ACG_34npc6,C ٲİt ;X y$mo%viLܘ-MqO͸¯ZW80vI Miṽ6…*X/̆V5`P_=&I%:o7{OэD )&2K5 ;%POH7}%"9PF\}eu!(6 O\rGWchb;̩+Ђbѩy4ܒ6`; @bŅ\[>CU _ K'ʻ^$N|;io"[Τcn"rP?cD(xx\c;P/k(beT/\R.UVZ6s,8;{يy{}>)n,|6-SV=aˬ6lY g4rlnXmeHq*5EVi!ϐ#q7O6P}2sp2mZv#UK}ug4+6 Xƭ#Ӳ`e+cpzXAN ]jYZh+6^LWpHzCy'&vDl9 DZ:0 p |8EvV977s6 yKb~_#;'s^bAf5R s10PЇH\~qnێӀ1qQ 0F-dO."yc^+$7ż_ -1fB\Rǣhqcv[x-`%upx/LHz#] 4 tS!a GD2y0껢A/p.o<`楝<(lF=ˌ^5Iÿ';Sbi#/2N.t1Q MKjS!L3`Oͻ]}Xxc/0^͇0Z z;u. mIhѝKP2Y>K۷5PXAmN X%tL!ǪX{ OP}\TЩԸX(, Ob*^0D%yX"))4 tWeŀmCl0(VFMX'GVLϲ(vYxA7ȓscFIl;1;Mt5}27 (}nv/FS 'ԚcjsDl7@q0S@R: WKcW\COSERa .Pdbf~̷,`3Zd`DSQ',&g}zt(DۃMx(%Fgb1`{k)]l>e(p X;n2' Lr.0ISEfԳ6TJQ6pk'j"`n)хJ& HCʆ: շ[ CXh|hsPP-M-3{Nx ,qAmDEA X9!%Km"]ϪZxЃ0x3 3Z8bSKYCSwq:dp1l?.tw̟ygk>3VTjH TOکo7 ]7Q2CzRʤgy g.1jMnFQc}B1k>/T5'\W-̐~Bd*=%^=qSvM$><1vR$`oSb}qq)ݷ"I[u;umk0PEPK@ST9?C䱋vapu0G V J}Q`eCe}UqNt/SkbkP\nSpoXRn{~0ioNR7>%sS mT0 u$(9L1&fHDi z:/3.D<[$)j/&T`=K58+v!_0d] VfgGXXAt@H39tcAD?ls aP__Q86@4zlbvI[>vBtn ͪ]mވխGG[: R\t~qcjiU$MK_dV!j{K94XW%Ŷ^1rX +sL- U f_|j/eMb1"1σrP.~b\I-27&6b.28o%Ӽ_PqRښ(A m./ $Sk}P}i[ݧ>8In`bG{Y4 m:D*`RFE{B/S\쓰xO!?\⵸ |<I.CԉM׻E/%P!nN6cf%|>YsSEf`dN:Ef:-|xlNv!vjȶnLln.|ai?PJL_|4gs(JYXň#bF7WaK )`8ׇ.AVq .m U{zZx=Uvsс%C`5?"V_fDt,K<8 ʲAt])O ,UG|,`TH};Dn'=D<Gַz|.cD'=Dd60M(rG)Z`ulݨ#sT!"%p6Su<0{;D#<1d/Qqxo=U1"_}㼖,_ƻ}eǯ{1#K)O FD3m#HdpCQ|f*LQ-RŇl8 A-<FF axVh|#mlP~^j 6pce":d*颵8f33SuT=gN) r.}g)vqĹٍ44IG|K%¼@\Wɒ0G<.a@!}0w1 63C s/ Yi´1{3-]#kFC5ARdMYL$A'eyp%ˣda;ZBmyvj;%yv˳6CY!c;ffz[e9=Ik鶵m(.;Y&nKie1u`j x#!JT/X煗vR܍`X%Bl0 Qp@ɒe0,,S:C*-Gv&~'M݇!G"w,g &IrAQJM6 ͋4<ز:+krbs^z!6u!^) nDŽ>ZJ,O?H-:z ʣk)TEL %WOC6&&i` Ffh\Gôc`&lROD 0Rt#N*fl`~KQ&&( 7 >:缆ਰ YeC=0VzT @$ʼݨvؘy;@<Ÿ )# =0"Ȉd y `n6_&€a)5Jg\P zìǫ^NJLbj& <Ϯ D7,{%Q>͌WMǃsN^)+̇mtݝ/}L\p:Foy2=1t\cHx}`]7zj`0~^*p5@i cf6;.ƮŸ9O2N=1 S{( ~M#Y6Lr,պ$\k5E2^ts0V^sq?^wfK[R+DžV>e= u~|1\A֫X 색'^pe5/5 9Z|0c%@mwD kRQ ˺=Y ׊ſ(an Uc>ZG) q#nQYvdI O|1(X2o̗UTps A'|ZJ džibio}t6~ԕf5 (sLax&UIbaM%idޣsji4*y~r-8ϋA1*M2ip(X1LaL$rBI3+f4G?DzbN7͊oob8LoLD^q3+Wgp;ւsS%/Vڨ<*}b-NZ''׏/1`!8PU`3ZQ1ͧFno]x/ȭ.M2[d*XɈiwnj^{ܕ=/ͭn9/j:o?J_T`u*Z"#/Fv`PQ~OuwW2g;bk[2Ion=S-`Cζ(vaۗ[qXwts fo*/vdۼ[I^5 .rMmQƸ|Ӽ[iΖ_.rTY1"0_^l)iNsӜm }k=-zsդ*-f [rvps{ 7F'ZNdpYާsm x^#fՅi| #C8.! >)Le HoT;%3^V݊;썶#3fVQ,} qwcV wzAm1}S}Otx/ꗾ v2.}gw~#g3`L9}g|``^Sufz08}+dUFS;gǸv3qHoq 7tbPMu3{ޤl{ fOv!š?Y P>kS3hwb!BBTs{ L Bd`.ۃ>meD>ScoLf!z@ SUfX`qb,Ϩ}uFg7P̠`~F]hQQM`[X>&ե6 X+:+3y8*KX糝 e`X1׳ 0=G|cjB7fy,tdTvcD1MBQ5]NͩW/2n6p d,&J^QxK2怟Ct8@j/$TL:[$9Zh<9nkƢa11S)IrU3UҬ]Sug//qc6ܵ177F749L{mw΁E)~db|FBS:$m 3uG_0[-of 8miBN7l^JM]zWo@pKvA:W+ M%Uɜa*xli`t1eelS ,c+qHѨ} j8,O~@q+g/X/6SqU0[۪HZ%0/8=.omKGRLxC@?`\u0(C|JˈE*$oKˀ}8>qPJZlzRɥ_ S-&p^ l>%N566{}ca_qg 0e}sKKZRy!6Xb1(u[ܘ Xɠ.ĥd>=Dd>V,YITv3Y ̿14 7rF|mn3 Z r  ׊.s#u[.ʳ7H|P~|19Ϗ/ 힕׍ٰC{6Zs[|0x6bp6 Bq3ΧQ*1VX@mue|MFA5dFVLl ٲv d %Y34QJw',"cUf̔5$@<]& -91 S<\®@[SPe 'Jl TyІ0:)ZCi&X@/¨ ˓=5șgڡ,<{1bxvrazr7sqL/h=^*kƭS+ɓ#(bN=vYOݐ% 32,ZWX[:>mK\2񠓗Ƃ>^H.U|w(j%F 6*-h߉Kc/B {365qȓ5>I./pp#L?ѦO6T تJVUl ` nqc6@G-]#@14Ș mdPgl~4P $7X&S3 3] #^@rˣL6cH$|TZ]SghDkX5E:pwO$ը7fÛeRʍoI6l5g[#L˖6wWbv~|7Ѷwj&7ّݫo,͎Y(KKQF XP7skX&jNu+ieQ"lzN;:TnHv@UrJ*G<^go8eu萒~nr'`wT.OE{z5 g+hf&^y4X~hIڨluI51mP,CY"mI*ߤޢe9 ɘ~8^A!kS#~al _Ɠun~pqԎ@WA 3c8dnn="o+-MᶲksGF,w֛q"1Z Bb,UhLjꔷhZMPy˃6E|U|T]h1]Z3Y4,СNj7滌vX ww+\ pn(c;&}=%K)+C';T`8LiK-> xp(b{ }+29z2tB]'( x| | r,`)l C a}Ks.h6+l!#!?)>W0܈c, Lvj,yiֆHݼV? <9alXR6qö4k`=~:3t }u?ZkaLI^nePh=,&ar]: 0 ә0 Rwsgy}ae#"<^n8/R{iQƌ^v0Ox򀰩Kͬ&QyvjAFK=5ӤTkʡCkV4m:Bz;iN5,a+aEgXm71'zsbg¼ҵڗY0 xFv7o]#a dIǓ~޲wFey;C<"W}}J(L.wQ젋r܉Ls1DyĚZ)I޳LIO Id(s/Rq Ƀ\E$<+$0"8d΄zᦌSG lyN/9imґ)5J#@AM#`@1bf#ʒy.߰L@HhU&b6'>aZ#^ajVy[F-Z}~Bc^#o5QXy@H椳Ex nPx<^PXDfQDR u2F`4xؤ^1KR:&Qa J a*ycPb4 M"|^[1.j0`P*clk怫|0),P1wD1eXף&Hea+:Q}3&/B.`6TdicF'GٹFJY UF2N5s Y# eHR|QQ)֦0UbH4֋Ȭ[+5"4BQ(9I!o0L/[Slc/ۥ(x5tl,pbe`'릹V[I@hTB˸4^̺]zN KNqX,c*KeŔs=9`S:p)[ݢrQp@IICOI0|mނD C8DlC9ZzvnBId AT%6'i7~,*>$ :_̆7&qY&HyT `DsvnFZ7#{j݊ˍ9Sl+{00.+Ǘ5k/(hд ZPnLyVXO.fܣ-\p;,XpRNӂ %_cB^^LOZ%}XoZ &Zop֛TYYn77$-fþ|0I7^\ RNIBrݒn.駤T\HV;sܘbiEs. ɗiʼnCݝ&E &x^r ni/9r9a9vl8֜߭kNR%IUK$춑~vƤK͈cX{ɱe4SbM4gl#ݬ'#ʓf#ޘlva^[H9 sf7/K-ƹ+hO<:1U'0\u Ls:Xu[UVc0m#_ub`·V5í2x HEF|0EWjkyhqa V&ܞRixlX2T?QLV4 'Tᦲ&6)a兇j'ž Esr+͇$0"/ NZTf&umBX젒})MC+ԅ-حwxm&Dw n!X$$%)c.BdӍ]@+JEgJ^Zr΂oPBfMLyswOuaN `PJD􉊶ұ)ڰ KKneTi{o$>Im$ULBQW-qƈ.ζ]h\r|Gj&1Vw+)J_ ʍpa/5z[<\㽅 ~r#e77H ݰ<0>*vnfżR/Ƌ "W 9T3(1(~sq8oWi^ۣkz;7-\Ѽ[?ߘ/ 5Ѫ/H5ќke,'-WL`yS/1 ]-.L<a]+bX_8GDJLŢ6RmiLiM->uWUJ:뿵E iN:5[}2Bx5`7EِnQw* Sɪ/1ӺatO8(JNBV0XJȵ0NZ0&֬d^%j&:N:e{:JƔ9[p5Q]jXdbCDP l^aV-CZKE 撦sFKvPu^ɲ5O>[lnkEq0IQ,+? XPy4++A\57m-Ms8C!X+ũ!DJkƴfGN;dSYՕi1p3_ o{Ơ^^/g!QW }[|0T.K"5 7Mf%?Đ-QZS3BHZԘ0pJ+\RP"gL_;9Uik.7{BW È-:EbJr&%'ET*CSy)P5rc6YƼ*rC>IaOn0j% LR>:=eO-o3{t!nA祵gN/{c2dF% B7uB1V GdXqX6l U\`# S~fIFPS"gV]\.j;fÑpZ %SEQt;+ بAl(BG'_(1DZ ]"0/"d`!newiRѺ.XOJN@XxP|+T/BVуܴųF\XV_Q8+ `TŗZXEtZuˤ$tn9:a}A S9Tشxr]Pa&BVlb3B ųl\xVǬxZ>nPt!%֨[Q|A *1xAbxoHUsU3@Rb&}UYL`V}0{cXq"4sRr1Ueq$ZyN<ܱ`0N. 9Xo y/k)~}y=ɭҭ`8T)0.9` a0ò CP<ͺ;^f>! Tߗ` O]UD[A=*.PQb%w׌,F2K_pQIgV *'_~bI+s13GrbV49gbq8Je (c6@l2/ix""6W D/sl cm)!mi*mxD#OeBGaHb^v^qk%Lm&.+ OM>;-iU/ Ϯ,{Gߞș>}xHJ :ZZ"|b*J`6<&9ZLjNn.G%83ߩ_G cG#<o)yQɩZ#_,٠T;7sycQHPȰMxm_xla6LKM 1Q9+N&K5PiY*aڕ9P-JUtT)~p󌉍.7t>_?xlA.cM oQS^0)zyQQc0N_KiAgS 85׻#PbV؁& PMv*OqH<$|] gZe,6c3+}#s_l~aqx\3Su$-1L 4`GOVJ 4de)2c);1t7v=7a[Qo+~3EB `]~Z`ţ}[+jKvoWPl]. .;ƣ˾_YbdYb#Ur+u=LQDHfT-k:zT2s7 /fͯbP+M˯;=4[[Nv3n1};RD\bFu3]mRbDUhf'tPn-b̾ )fmeơM{ !ce+7k5jC\iN=H¶bd/|ܥ.ݞCgަAλqu̬Jک~4+Ll1)(3",XZr{|)cI,m4ɪ g|& ui\Yܘ U2r17፦3=MoʔC1!a2<.}v?.U)=tG A)v<]0d^i䥨K ̮~jʭxwʔfqm# sHO& %F `. Pmÿ-uut\'>>[ھa0@ڙ,/-ϟdϸa9I 'x y 5_(x@Iߐ-lΝ;`6EZ{ +1{mą uP2rO[lpn AI>'y1ZZJ,~@_Gcz,V5:jhUVz A,E8Q[ݩw1ՎDP(]?v;^G{ʪ;IT P*NGӏXpW"ۇ,c61ZѬFx@L9{ҫjG}#|c~5iL̚-D^\ꅛ޿y׵5;>7Wux-iP 6]ߘl0n6Ƥcxapa@I:Ic6`[zr怛m_gW<[ܘ7=GIku&, /ģ4Q&|Erka`Pzl=Z}`ӮLMcn_+E F`",ƳToe_g!}tY=p-* s0Iunp+-_SFN?;5 z1FЯ"#Sfl ۚ_g/IA#6Fz tv(t! 6SkKna2Oh=y.T_:B*(і#݄H~'YؔQA[~ϟ~U 6 03Qhl_yOj3wQdm6;0`)5s5f@+i_2F% c_G>?r0cök^/L~z1߽ol{̄h-Wq_F&? npoLFr-xE|[X̀`%àTP+~`*51KVdKX1ٲ$P|0RM]FE2hMkأ`=ʄGSAV֭=dϕA#)iHJNNYT°X;.08>'"?C?s_9{gV֜ftV*I$-ME2fsd{g4`A1X*=ՂZLloʔC__#jct\?~08 %JjiWg="YF ?v>)+/Xpj]XRj i8f`#s滗`Kj,`Ywi> [ȫADQ~ْڎ+aIj1exl9)0'dK / MX,29Bٽ(Յɖgγsvj : ?l_ !m| v"L*]JLkMi?4 *Z$N^<wLs@}ןL*4CРC)mY5G ceЯ?xYGL{<v3!p 2?FmI#3>r㮸ȍ coq!?L^1b$p$^֊H w;G- 9zw5U1 Pc‰=VqG_X\&Y5/Hb0X# f ~ᘦ*4u.lr ;8Aa"KA6ZApνrMQTϕ7̕КZil&u캮xN0$?oƃX0a/ƣVJ}7QEz~+Kh}%3}RBʠD 7)\t{\9vU87-sp~ d!h{_ r,A[mgabNrj|[)%{ 9)1$x ^X``nM"o "JW[O{CDzQKrY4'AEE )CGoiQ]b s||1B7Xv9T…h.ʧd~Ksf:41 10Ȋt ۡ(>-ʶay( ?80Iv"fMܖuץI9^ ? vh22t#t릎򢊷yŞ4Ȓ{YH;93ˀg bp˴8ƠC?nq@DΙWYz|=]l-`X?`;߈{t9FZ$+ ^N8~}nEkw ~ SjkPmL.C1< ~"{k0=l׏llFڊhI e:^إuІ , NQ$Y|v`6C~Pq'~CC!oQ?IY /R6+x.E爸L[p 3la`1_zRT뜜c'f҈v `O`D/o]`:_F:cݥ)9L*.*pHT'أM@2)J2?յ [<- Z)[JQ=Wr8L~͵Ojs)*عfΌ¼oО>Lڱqs;k|Rit N 4,nB]yPc/rj>6:;7܋m69:kμ<ù@sGc% .1C}N)ElbnGU>Rߍ`+U ƭuc7Z ,BMK \^ŜIڿ88`e2;*2өyu[rxyc }?ߌK~T4V"W9hG,:h7K*bF'eF_ۻiyC 4im hohE%LFNJ|)i/E. w6OMhsz_FTb0d-+æ`YwKbR7tfd욷eA[,-mZP͚J8h3$8*Cq 1h|1z1y =٠Ȇe_Yp-D"3*NʙN㣌mxꣅl|˶C$g^ .x/\AIJ+L%4xi&;F &77ug]֓SlC7&2}gKQGst^p=Oo[r6 wO.Tc&,YyC9]t2d,s".5Db= jW 11etbz ٿ-nԟFg35sσJydeHa V{!3[ >ii6\cRmMΤt YXiK3r5yꩅwvhk)HB]#A h-N_@ ?TN&ӥ0UP~y`N+| ]ņԵN?5[v Xih 1[YKhT- o2',&r`7 wG><UҭcPDHV"Ӡr_TN]ǠiߛBowJ}4>n-m<&-LA)CD]'Ԋ6xYKV߿+Szm Zm_V_ $7LVBbdտT7rw`$̼ld1 Lm{1`#j0gρ71U{\aNz{d{!nhvG$³CT9|!CZ1kNtiU9ds9}MS_LFi-|ٮʃR/LGV]Ztg:/"[.Tlav ggECB0ws5i̘epH}Xhu˪Rb}U'^X]̬-lj'l3‰ Y6hбZE]OEn Rчjy I{ S4,G 8KՅ,=A&_>R{ڵe,'ۺE&J4LPd.WaE*@m`Ƽ̋@LL~ЅxaB-6ݿPP٥v$c"8+ jy&?9ҵ0\E[l 3Au'LQg~aO[U- I, @"83jI0mxp`7@=Xa#Z Y+{t^<ۘtrC4t6Mi! 1 <r'(s 9sn_Ҧ͟0يhpRZGPŊG2 0 <]~[|-CՑak)t ]@!6)7xT* Am9hs >pp o'[|9hTE'Pq(0(,i - ՛خʘ' ?f-"/H"0n2Du6w 72V M^ 3nx ;g/Il_Oqҝ \rlx*Ĵ{m ?KA4dd1$ jSG?>X0b8Vqf`3UzDU.Mb&ZnW+h~a}C] ޼d"bM+#j҆:r4eeKa`1 BFVBJXaջ|#2.ز< OW!4?lQ5u_xb(-r=nvZW]T*Y:ؕEԬE9/T(yʔ$Js8@ b<|)^XDW/لg]fA/OHDa]Xb[HɫšŁ*&_. fLQ=`HTt-g'I[{:`Z|809r&sKC3e vK#RN,&g OMh#j~TIv s˒~8DW3bJ^aH9}u1"H*znږXЋqh E'<|c_~}Ġ贔"l*b`{VkK^L:YE KP BqϋʒkjҘ LSR%BpY҅x{pԐ`a.1JQn9u㥝KƂb,HU;ʨEoJU6x8%\iI;Vv?d8w˪/2ωQ 4KHǖ$]dK0]SoƶQaYgs2\RMlg^|X>ZUa٦8Z,^'REuR @XU{+Y]j\9'!2(]4lSϣ7re8-5Gsc}a aqFiCcڠkZr+;xډP,cJ)*D- ŲQ'< 9'G/ >#X.T[l 95.:WU笤 q4Nϖz0(8̰Yu@R[<| Kd)ܰ7E+m4yePeIIb{ _;X>*Gp!0WEB^D^ 8a6G@|d#n`^ ?0-d/0n9/o?:u~yU_%bؓt: Z ?ׄe6{U*8|x#*Ïއn%E͡M3 k1*si+}WnĞQCm֏V{uvch`d 5(ftaT<m])q .vFR@9 LVf Qgu'!}9K؅5VzNF-^v=ŭv >j;@y}? JR@j.JQg9sQ 8X΁yUq3ׯ2iDP|P嬇rHM ѩ^*ų.ڶ|[uaB2ϕaj?= 7,CR-`q &΋p~ZS!Sap4+ӧu@lӧͻə)m2=ŷ1*8N&3(F 96m7 mx˃0,dz>ciA,Ix>i ՗]).˽yRR/ p&r0k u1Z.|a^IQDzY+.bjG4"NEn(Yh4~0(qY?oW|Pʴ:6l0u[bBt/ ӧ+aSXqClE~-4sY,X-TBMTþa:J ؒ. V:vn1W)'HƐP.iW8# ~$AW=N80YlVSSQqa%-LT[> Ф*|Zn"| kw۾k.-OTM?ôxe=,⡈Sy7ۧrӲkRin7 scd"^d20=a>$CR0 `O%YkvOK./3|nhԿ ӧl}޲P`Mq,J1qd=% +ӧ-`"@׵#ISJ>J„NƇ_6KLgnD༌OIr0}~0N ˧hK |SLe/'#ìٲw>9>i4&GgMs6o/8C%x잶]2[xsҙi,F*|>C0|B.T`ڇSwSRoXe~c> ЏvOU?J|vO$Fum]aG3[=P깹7͚?Acud ~meZa'C q>*X|@CTAaUAX@[֓"͟pgωR1y%nZ0rRpNU$t~P-ܿQfI\PGzZyPiayo4 1e.6 ~n0V&\$n PXN]-w\ `C d%\pW'qgͫ{w=v T.sJLfim,Hraa8mlslߣCޣ>,| C2͓{X>L"{gm41B1>̗o*|A\ĝ ^ma6I6ra{"~3Vܻ{.j刯30Aju >Jwr_q*Ṫ͠So9_e=m%F(5IGҒ>2zfNdF [Yȼ / yjL% POUys ad>KӨUU¼p!!%Jv <>9 ά.UG6$Ņ9` ^}D qS"BVIِSbs_U鰗0Wc^оΊY\@Nam"Geq͖WTޯ*i[QPspBsZܘn({yi%;&Œi=~2e<2춪}Re/慳Lj4gU7+aw q;af+&@35r :$Z)c%ӵŅ9دٯ{7cG U1X^0'?ؼG:ケ1ΐ|D$.^< SYUg8VB:̦7#BYK!XrԪk6 hЇR9> a0͍go4s?T5?Uhˎ\UM6+ Ѩf}T_`mZ])?¥2#KsџtܝR3s9tJ-nݔ~#fOabjT@ m;Jm|3/ |7, gYKyT=ɧ 2Շ$Jz1_Bo1Lseh4*{=ܤ $iz,^:/ގgBҴ3yujiczN{-,| 39bM5E͈+{:>c,aD S.XOc@{;xvS6\UtcFb Oxp|^1/}0B BlIcܰbcD B +celi(u0K=ZH0o:)`Xߒխw#IkD]œ,t[`S,יC1$c }cqB5[R=UOZr-d'_JinW`6q{p}d8-sqS=1`3 tq:Ο)1|}贅_̗eOl4Y? F8@lAB WJ q|K#n˅R=q%{[Ft't _\<֪t!Q\W$Փ DD;g>4|Y3۫SAWWV']p>z=rÞ,S,g\ ӒNrJ٫###c4Tןguop:yUe/96|NkcQHӅ_GC yJųDRPROY|񄍶NQ4%urYbkꛉwmeba Ko?܋=%8vi0kRu5Dtc^ONz0S- XPAdwcØJF<2ß*7"[&3?N`u+>X /-_}yHLݲ<?2i;&&9VuEJ-^jSF19ɀ@ =8͜do]*N"*u_7, 􄫀0*(aIy=~,(*fp=>lrpIx!;/y-@__%ŐWNti |Ac. e޲;7lX-huonK8MBAXnDģg!—tv;_'`t' x^vcT~T,`.z$Āc4Z)Ơ1B;d S.ᰮm M>̙SrQ>d)Jܯq<+6Kyn9Ee 상[Wsn`pK|LӘ:x\ XMjy{v0m 5#4DYn`Qf|*: lb9 dсͳm/nV&Bҵ>≀'cM3]Ou+:DKaaZEA!F\cCU R֊)bLYo7ՂX y;둯[:vL7жrkN3{童gR#uʚ)k!s,\e:,m(T^zӣ-~,m"$}&$5h߽&KT3mk֥bRV5Y:V^o).\Jߕ(v-vE!0n|LW|3>OLl),՝ߞڕw' V )LZX[ʋLI3zBF^%pȆ8l8Pnx.!Nc`pwehxWQa(ꇐ`EY1B5>-jE3HuHAWW<%b*K*? 1fZG;@"Ma =YHUe*aLw|]ӄ (t1ŃW0_?~ [cd=<\7^65^h;僕`tPՍ/ּZܘ=QV47 Qw^j.TgګmbQ. 0{[vѥ8qH0jd!\@/&Y 1 ZNcR7 {`q|XGϯX,!p'ǰ<=t3/~aJ!iKOD*^u rD`h 1Hx#iD@qL,Nw$IK?IH+_t]:HC6ZrI0_eaKOPz$WkcEkM,a?[4(axxlʕhנlCawG P:a͇jq,[Xd9lEgϙlXq HOET{>d#sg̏®o&_>* Y|1SM< ;_N ڦ cMCH/צe)4>c>dkt oClN-9%%5Y xruzπg,ce^hs0\բ!~ҕl՞&(ޝ!Un3~nvrmo 1qSA݈<2hSlzNxQ䅫p6'U%fEtQ3NP'\h;0".i4܎.`= =Q`N G-*G A-ﳻW Oi'bL6E:#SAd`~a*m_p3U|x{-qP&zj Н7 }Uԙ CגzO>^[Ǡh3qCcncB0+_ƅ(8/&Y>VIիō78v9,N7c/4bnI0K65?xM\yvsQ$ MB\]`ukucweu xBC+vw Ϣnxaadn0S™5*!a LtL?]}zaגu|t?HR#]:0d~Hx l Kk/Q>.|`YT1m_!;ZO[7*l~"\^"+O5sR7B+>kQnU'p*4%XH7_X,%9~/c;j&9Xʁ>E|#|ao?]˛:H)S@ըbR.Oj"$J@t'D`4Bu#j9=&Vj+Զ+P0 ! j밯w}C]0.\25 ao0j*c{P))>HeJvm8)C}8<:0Tb0S6bė]4*'P}PjыԐS񞊇p,pVRg\?8.I5u?'à2B0q\*amp5LǛ0Vʧ&ni\YAY_Fڗ)x':HdIDe)`L  p%jY)]G,%vϗqH4T5PI*ɱPX{j'&VV;Jk H.Y5NS<+dxL q!2 ⨈ݬ-Q[ucӯD3j,#Y985։?@  xVr{p\.-A%RS.yFTAn2lvcYǼi Ϫ N`7 PyJ) w辌__CxW0!p5QDAۓ ȨE_!7)p5P{~Std1~[ i n"|Ha0 OH#{a_6RRSLc~ lLJ+?;ӽ+N^.ؿ^X\Db!^'R!ԅӵUK|kq9@Y67H| Y{p{D>$AE;vVohiu{ChL#90(5` Ĕ(]>clg '^TJV0I4E\nJ^k+e/?qϻ(TōyxaG/慵%G SQiZO3~ ;`h~6> o$`j2`gޢS9/G54[lo2xxb Hy)c IN/Yܾpc,$V:Zty>/_X2/v$x2om;~qaQr51{t IuR[GGrڍx|F/R\~è". pdY;c(Ȳ~Cߩ0ޟ!c]%EF̣_ j6ū3}ܣ+o5(}Xryh.a[{=7 A4g1¹"!|zB`k]"=ze^OGb2գ"IȬa{2V_p  U/VA!Kp]\3~gѳD`T)dTdYd *>omj*x^}2U-RwI ^`U ;M{.ڣ _{}@^rfrܑ3R TJ/s{4yqՙXζJ^:{I_Pe@'%eep5:ʎibX! ஢`Z[>QTOFþ Q~*rJJ6q۪z:߫<n Q8Qhs̪]*3r(wFm%_`y\oRXѳhC"\.2O'ݪэ9d|ms >U5Z܊Zi\Uh[8KŴnC?-\R" ^BxQFGH,*64fUT'U@z\XThjrXtnBa9мyj?Fs2(Yj Ӫ[T&@םx}J+ s}8{1ii*.Ҵȋ2H6mpp ?0ά\M*I]mioZjsƺXSZ\7@<>(Bi%"=^mߺJ&8O7A IWLܩIƷ51l")Re0x 'M0wVϲ*S,)J\ C/0t|dZ? .~yܽs`\~tj껯R._mtX_FteyҿPFm` 6H5E'r6@\`$mH'd`$e u Y|eA%1hƆmv3f?u.QcŠ?S/[XX9!($|ɛܸ 3.j Qݟ;-ɡ[CZKz/,/غJ5 IZ2u:hU ]/`6gy#HcwI[nRM62Jy:AŹQ719`?̻"態hE}5Z_:&{( 3@3S5Oxmq_hm05 ߈ һр>c{ s'..*6-)?1$3iJl +-BO~rl80</GdSt3lӔ1rMӵEbA`0~]"pHۺNX.E mp'8Qxqeȅ .DNŤ`0O:d9mS[ ݦC@,-B"ajFܬoR3$Bn̻`6-.WHȘ.!ca22x~]sdz ɸKQCƘA1v>%b,zKB\d;,b[bP"~q-2RyaljTyha8pYWs!;nLмZ{Ɂ+!ba/CѢ^eak.l9ံdq>xZrg-fO`1S 'D 8>!Xn̆m!E\y_0:Sy4.곧M}Y{:]m1idyc8hdxbq,q)Y̥-Y ?~NNb!Y#ɂ%: % r-pbV@>:ܰ5oҕŠ?oҌC|0@-L6og_"fS|E˰O#1!G5;@ ^&se7<[6A:/i eiԂNtSqnJ}(h11HZFvs]/,\?Z$:={㒝,g<-wN|0_&NPwcs+mޒr$ b7DZ/_Liۙe9?tv#kws>mt.d1n' [D҃/ZF:aoZGM/nX|Flp:H, e͛OMBk4soHr}'Gs.^ʣ$g3#ET?f(Tm7Ea/fAH (x}~stO-^XAǛHߒ\MIDi9M6_q?q D'O PtŒjKa:m;} Nۏvc}(丁"s-z̘X6+Qm,חuGr  SedØ;a0\SN Di"t sdޘ?o":6E/CZ97kLf1}"a۹] =B <o_[(sk`.')ǣx)5jD!/]E7)azD?mTi{ ;:^uW1xvgnUqku\l` {٨fnԢc֮sHY!9G@>;tw` &w`K?܁NM݁M=܁mk;Ɛo.V1 w٥3 ދw&'/ř M_&8[RO  \b6D" 6[ _zb3GJcn%}x< ̆#8W`swNGpHy圏vVw1Z.?m>颍Ӷy8ot I^ߑ.# x_!c v tλFeyv%B>e/lH*tt'ؠ7"+y19t +4Fp޷ 9WRȺ9@$_t\h6t!J[:0 Uͫ%b4dJ*Em&:͗>àDKeLzF4&CXddt~w¼5|ɜz<ae-~m{=]-r-7`x1Իx>ƒ=F!%=c!&buybBC 8&M3e>B(|)x>`K? ;";Sfp[- l9u4ڢ͒6. ܝŰn˺1ٲZC`7思gYyX,?ah2=5./a6MMa0`Ȝ~vY7b~a@7f}cAMf 7fvcߘmgK~?*F]Yl|N׍im>/YuQHfuc]ɖD>]9ࠪ~9xtr"COZho&Fj& {6+0#G5/<6vVH'-k ȅHܓd.WsPŮk;)v"ˮߩ\nebrg|y!H;V sݤ(cH^nlE#'?| Tt0( yg Q>;kj(20_eXnnɇigᖽ>0ˎKfugnx;>J{xWt$d)ς10OꪳH&X0|0&2Mz-&KJh޺_À*mU><; |w|dQ =ݼdm>;CΚ<\,mˢA3F=u'ʨ|Xwv8}E@R; ygchQ0ؐgUy2BobnuX[o9V#)dV qg|eg#x]1vHJY @2:,J`h8|~aHaeH_{Pl^ٰMPP{ZNjM 0y\.~!> qC3͏fs1j<ן}^x-ak/xQ=ZOxQRmeƙ&6>u"+AY6V 2AM'92A@1$^,NP,ivv}a4xDR)٘4|1_oڼ}졣?[U:wƔd;+ ޤдah:0/SW?e騡dpϝɈ#XJ"G#ԥ]Kcwqlν}$s91GL Wל@/:s r89$cT%rMsn2;.M?A١ hJ Ըh2ݷɦXqnrz\ӍŌP1rRI;%ؠ qM^ n|`^8/^LL1lQ[]}e;煇v84L%̻Ԇ%o= Pݏ1= Zr0¤?_,K4kn u@F}db6%{0Ŭ|E@Mv K )4sAa7NpP؍y\X (8OBJoa6|ȓ upg8;E] zH+4)0B,C0I$f91/{R @(Ί@0uX4Xq,hR.?߾"\`67+F0N/ꁾ`locfA~TeG_Q,ێ@ڋaT*DLU1b1&T]8VfJ 0U0 ULv-,b/֘ > IydY >K`hz|FmpŔ' t ]ܲF^ WAM?9/.mj$q_)rg$d% (Sx6ePhOQ-Q_;ĘY҂rZرs-+hY ,F?-LmEjcqVI' ;O|A9i1FkKػsq 07!P{#sL`0a2VS 1êcl50 kUy`G`8S, z|1"{[\misKH㠳p8)[ȥcY<)bA*tEfT,Tq.Ǚ[c]bg=@k?TH9  #Sռ >8  %L&̆ߣqc],Hw1)j8Yg$Kh9jqc7K?Z0q+\,>#(t\,+d] zU?0"w=CY .m0,ΐ-G ~P\DAqJM+n̆7Ah !K^i Q^a|hi|P֍)sS xE~t5RKTZ! 3NAg6`奛~p">GRֶ@p}AbY/Z> V^X>fhM?c-^e(rjf GauQ42  l_ <-_KzK4楀ܘb9wz|-(-W}CZ]k-:.|I٤2ol8C$=ZB. ߮(vɜG ndi]X:w8]h$wƞϕHn .`C||kUQR3칢S,<ō xS, ySV|0Ų=ȝf_eܓG&]ˡPdLZz4E/:\?}$X b DI ¯ǧΩ7,2Um]/NiyU7jAun+&Vkc;)^_/ؖ~ blcIt vG)(SQ-|Uw9;0YGЎr(Pjks(̃ap^A-.f-bao_Buǯ`e#Q&?[D8;}ڌa xaS}K6^I. -&9)Ǽ$  9Gpgz&!2Bi4](=.N]6)sǔ 1]gb5Q;r~*-vAf0s쥳bʜ|{dPh[/S)mMATp[ :9vF !6 2_-U͡$7@I'N,Dž9YWPȊ{nc&Ss{dx+oC-.In_ȰցY*`HC9lζ\ c`"Q6C^5ZG7cdĶpؼN[UBK'pydYK;5 x$8JL7~$N8PaX-*7|%Z(:LKj'02 ’jF*eja}t9.)=rL" |vRQ|f.ttrjeZX &Aα`A9 Tv ]VMT_uȋ~Jydf(x2#\J٪t/J 2 93r04 :\t*(,%A5@l64&V[tShLu&2uVYOG{ 7]Q0O}k[~p&v-bLi² &,f@9ak}B-Oxl$>b}H4ٸc{̅I.CSrE%#]QRSK1pb5s[mǾjƬ*[LYC ry:Ios;X&$,2Tgqg{ʚI܌i@ T #N(05I*&WriLpM`%$MTY=^GxV&h&fZ귙l aU{'s7^&.G,h@*27N 7$.ٽoPdj? vЌ V#f•ynA9]0%-LU08,'c,GM[7b)k",A fc{C$ tD0D&q`͸^h1ffmDnZ.U/GILq;x *&륐|2Fn"h Ez-RdZ> =7U7`Õ+lzbXZ(R!6Ǭ0>Z b2>?=bl vh$vU3O>U/GUيj$]s`xmڼo#9RbaYˤi˵TXZalm<;ŎPEqu6$#;aF`UMIB<-+l9P-$aeVugRc1 9rSaEa+27ӗBvo!s/>KųhEmp' k$ ͑6b5cGLj$&incVK4Ny dUvJ/Eo8&;i2:P$bWE6 3fH"c/;X*#}b3ayHjs&,{&3cc g0pw*k۞ #_iϱO'DvʒeXR2WuYncJew M2#6TLs9;&*EIUc?aƼPL-6g\C=xֲX$۬/sx+NA w0#Q0\^C,] ~jjK|QC%5yMV1[pshUk~@lZ\ghҍh/m aZsv>;]2WwLa>}18Ḡn-n :KMM8Glnhlƶi-%S.IR.w@<ϩ,7?'f`|ryh Ab~.Cdx2xqIL% kcXMXp!—0~R 3ťw걵a n{`ҍ y^6V x~Fe"1Q{ڏVBa儉fł?=\Ο wjUy5#QMs5p%'`%`Qy-2{wZ~aX JÞX9`1luG1TȂ)x'3WE6@='森$|mӀS0z4{@ a m̞:`c ZՂ\6vg ! {GHN!L7g7cG'n9"EzJ&4z ˡE/%-OkrXk?~`S:o=ɕw>%#Ik~~O/{E̓+Vh/{}éW75Fy ?{oC2߿iHk9_ m˯_ߦ񁿼MV6gH|v Y59yF_i@~X?x˸:lZ??PrA5c~#Mleg/?2wLAnÍ~T}.fd'`IYBeɳю /.ZʶEKM5{NǖQb)fֿ}7endstream endobj 178 0 obj 85442 endobj 182 0 obj <> stream x]IqvзZQ;J:mAY4=ȳqC7Z0E8ҴBVU._.44ҿ_?|@NǯO_><\8gOViG *פ'g yWյ&/9?G רOWR9}~n&wwZ5Ø4~Za하98q8?>Wk18P%_ò[ ek*NJ~#,Fw)w~\aMFS:Nks͕ޞMovoV5ҷOʨU]0~cT`K ⌭(ƱjtLy=h)x&?MlM0 ,'y˹ޜd5a\!j23(C^B^M"N)!֫d\!('`F4o}S^}[6bG}H?+bSvȠvR"! o?`D(YX2r:?,=i&6SD @4Q)qe~`X ?Îq jO23B"a]YZ:xZi=G3)$#?=&FZq n@yEnq\S^Ǟ |;[gԉ@C!AiM 8PZO`0/%ؘK??kAܥWNS=`.'(rʊYU2j22h]p]b34U)8'62JhbU@h¡2W wB'D)|JaR% ٫E«ƙhK+H"Z2r*, v SSl iri|o $q(QO̍40GgZp~PG,duB9Ȇ>/^qrhJ(Oi;6:gHB\]AEU@RR l] V)8Tx/pKJN,fVaopda^_Rz|)/BVbaif~TuT5Z4h uE$u:n\]O^G?IEv {mQR^ >}qC q jp%?`;5#"(6&p6@7E(- )JzYA= k}Al аj|I+nY5VfOӠ?B5Aԋj8 &L;/&h%l߼b ^RstG.pk;Y MJ7&7~p@%Y(i<R&`n!8:!9C5UŞׇDl׿ J@l}e Ng0ZX5Y̺dtAWJ Bzla n) \A~ MH='\*_\uإ@boSb Rj$s=&iU) ڴ-f*x|y29ǣY/ r.MXhqʳ:`$Rh'dD o /P%)|4|}WC~Ī=.n-w:eJcg'=+tB WI\f4#WW,`SMhrLtzPJ,N}Toyјj<ӈUGWNCR'z+Kh_bUUȋPӓ)oZS&)rhrP`cOyTmC=PR]4}VV'QQs'iG韤w7Ac.v&Sp?Zioht cU9Ke <.Cts:NY7VX+x0lz,vjB*߰Qeݘ6Wk֝q?4"A] >PGA[`CE%=ʒ: J)Y Մ3j#C 2\SǾ4x*i%?*gAlE{uSʉ&p 1K0SŅDU5dʠͨ¡&ybXFGŒ5dJ@ 2 %1iγ ("JCii~PfDg?y;}X75'Y9P=AK%$X;"ίRHYR( D֫$K6v+ DB@4Xk #|л<܊Jx>0mL6)~ox*.\3I GYٽG5jBMIw >pe1vtd"GN*E &D "i =W3uRŘjYR8n/kNs!9F̨͚f-nSPX RFּY,ӽj SblC.eƑҏZ(L#LL494~O њX `\HkZ^ il6NRW,iLq P1?Y$)=۰.#į1d${k%E4)a 7Z S9L>Y7J=-#L=f#H-Aaj嫇໓2:'xd:Y'm~w>'?_ca !GHtNh[|G ߝJ(P ͻVk5#>a9b̴ [ÓS/e?q+Hӷӷ`UkcҰB6MҼ$u&M[8cE¥)7'MmfTRR}IVJޤl'`5, i=EݧPpL l`iSZ u mn6 A9HߟM۴MжnBB/>P QPB<\X?_ipd{tς-KmGbv&RABB|w 7aBy$@m3LLZ H0/i&!Τ%p :a!2LLY GH+0/i&]83q'&.pn17~p,޺K#p !ߦWeU4%r/4}g4Q'3yLylXLw&-Ce3ݗlVtgҒ>DZ6ӝIfeLw,#3ݗ/He;Ӗce#ݙ-㴭hha1\=7,~OcǦKn6N<&NLڤP%;!iR<#?b;S+G tg"cƺ3+> ;㶎v/0\xT 3djGyg2qt1=v8v}ԇÿ}oo⦅kkIյMwn uB'@~ߙn/]OW1銞},V3]>@V6Ɋ>~KWrgt2՝ ²qLXtg'l+/ch<2? ^f5o+?hs==vK̷Z1'L8n+ޛvw;Ӗ-eƼ7iɘ"-ޤE{~d{SLҲULZ ޴%~d{ӖlB{1AۺyFq/r,d`%xUďk>x9g7LpJoۯ&\IþcW'S3NxLZ2H/i{IKiw&-Ceߙd i ~_Ҳw mL[і}gڒwq֭VG=5=Kl:GȡE/쮱赲+'DL"e#NNx?@LY';S5+3e X:S28LX/lЗ IKit&-!pI[ =kLɐA2??yE2 +wg@~Йa@_)c]UgB0(_b…_^i 0ick󨤓ХLgzl;fz"A/>MGmnv.yk25V,l2ŦkJoi_XqtmBOIW)r)`道? ̠1En&_Qn?h|ijʝ3kp%mGV*"ߴaOe;<^a> w74`C IZklnxF;<٤hi`6KJQ`JϮ@-O7MxtDOpZSo느^Fi@Ŵ֢}rhCmJ!(#r˭jťv9,^զ{r(o~;_-&;Ifmܳr *ߩy3|`%r:=f4m$j9}'ԭښ(q56$qmZ'N^MYv=}`X8Nj,MlՏWj[ex6GJ͡umզ/UwP3躇x~D@"ndZ9J_M((f+mM^_)虛EN?(3X֤" 1CjO YlnlhQADK?vp_}pQ̺ccmHiQJ G Q< #0oJ]|r-aچt;Ȃ?[¸5#%b`Q9݀Vߖ)g2W$c-JXÝԲ -ߥ#:ipBv][ϳ`G*,1>/5*} dZ*›;(87[^12$H[ו]GDKkA_3%!4Z8hetⵕmN,+2Mjrص)$G"ub^Jbi?x[A~}w y,Br<*ySz܇(`٘gԋJ"yrכ)KGN OyEK=s[v%$>%T FAtU> _fŠk&,4LJ8⫒F` SbUSN&ȶX&FMv"ii6WM IeUwh2>LaJ0i$]'V3,'lS=rNVŷ1B fjѩA;Cpa}RS=O-P´2bЮ M{6GtGVn1Y4dxX ti?;>G~'C8GgQ5|#fLA ~A']'n^Cib+? Q)fpɕ|eۂ>k"~l[)K!^#y9h9C"kWzVO9./) byݮ&!.ĂRmBs?q<U)mV|X 9n.5M0|:"گޱkw),2͗D3( 0B&mϡ֑D6ia, R^]*WѭMі&yG=?;x^ sj\r'Gl!֤cF|]K +N먇N>Ch=ε'lCi.99;G%F .%ZE)ћ{@ĞnwFV.gĎ<9TZ:$#u?w9!f@?_p2a|VB$G%_6xq[<:8DC+'0ؠ13n:Kªu-Ow7܋;޴vF=ZuP'$rQ5rbOT[+(/^:f1b[Ϟi -6==1z>|~b8~vYz1%?`lwh}*fB) #'dVE߅&endstream endobj 183 0 obj 9453 endobj 187 0 obj <> stream x[ܶǃmou4.Nm[^ߓ"CZI㡝Hw Kԟ^wſW/vߛvnvw,?W/p Qg;JB$- sp+F{w8JQqQu8*bcjpGp~k5nÑKMpfS eM?5Sb,ᔊχ#%RI\5 ^ڿE9/ T.rhLCsӶsj;# wݻ7.ٱŷ+7P<avZ}9ҁ-v#Ns~0G;5!twD* A1+g0|[Kp?򽮝Bgŏ՜?? kg9݃$Kg{CяL yt+!Wh?R^ Qr0\p0~7m. QE rGT:X*?A eƬԤ~~WEU4U5su ֺ|E Td~v5ޏ`X@E)#PPytqqtV[Y"n~K9=sk@v[F/GM_m`hPpxkkElz4֦81ж :9WCX~R&".N֢g^ DoX?L0F uG~qu]HpƸgxo2z/Bo}Qn@X}p]# ߊhj@?ft.:Y;e7mP bGVD"ik-iSU_ZDJkq!f0n IP_^@ z>%:xaTSicmHTicN3GZ08!@f %N+zz6VL!VX-ڥmJxAOWw{؅f1#2 ړ.{ŜC>f!?ǖVk%rE7z7"o[DI}A"ۊґH-YtSCh+NKvJ[okߍK7~bco*DV> ZhZD+x ;^E^d2\9vՠ vՄ%XYb\isX[,҆kGضB*zMKr}ԢRl",;`؈rE COgޛLp7f~rN$tЄGYDoDQ^7Kt!Yv ܚu ѹ/Do \# Qs}DkH&JU돃{ %O۽ҝBegQe5Fs%!g-'XLi8dPϯGh pn7ufF`?jQR"Ysβ}֤S E7vmE^"{cmqiC[Ki[i I8o,= /5_d >u,OSZc! Xq˨Վ)/B61lԖ(V0pkmQ͆A\՜s*v尦,_v9Z|kXX4ZZoۤEso,-;YZZUۋYiRoF{i\om%{J[cEߦ-Y|[m⑶c۫9ko/f򆋦I.=5$7t¢o̼dIuq*iTx?ZfoHzKo,YTco-6mkkY9IV?߃KP`ghn{нyh?ۛ|?Bm/%Q_lo8Zfr=~*KJ["~iKiMhZiRsF b@5GeBa8Ą~7CxLF^JvJ4RYԧU{܅e_NJD-6<P3>l: oT8:/YlS0 hR|Hxjl'!EY PZn(Y?R$܏v0|j=7pK8,~gwJ5E i;L@j9LXA&fdt*\ǙQ>K0_>MhzL_sWMo\}w>|[;h3Rɝ$F-0S;oĦ$NݯE6=&K d׆.\?ŕGMQ dT~ua~Hb~?endstream endobj 188 0 obj 3381 endobj 192 0 obj <> stream x]ے6ݘz۪ ;yX OyهV%+%Yvkl7v?x3qM`l5p*H0d ޼??Wy{xnc9<um#=Q y{#?%Ng8tfq׃V>ep>%;ϣ_x/^\k/q6Ƿ'6Ι{=iҿގǿ3HFtdL( # sc K!5FuU뜌_+F 8FpL#oS l=ad zaxMBaK?~$ :ӥҭ[ciXnKnwE[?mmkxq7]1rgIh^d Ȭ;2#8mp !%,5m=tI95Xycf.Q=xWGvJҀ}RO'Qn`Zޗ@a%,X2bxjbrd ]0a`$uy'rȅ1Ҝ> ocߋZHw8(XxpmoN"b- aH-3$H4~| MRj0·1fxY BsQw)\>)y^ts[ O@Iw2fiʊzSur/zϧ!A)[o\MdmUWZW}2!.; E\$0Su^Bu.f q@up;HA#KBzHSB: .GL V]Bh ==F!Ik?ʩ)`n`Jma?qqM[ >fqiwy)[2gߢej/Ǭ%TvY0I *z||P+.g/~NJ㤕!pKݟESxf,g2)"E%JwSjd^-hbVIHS'iP,#эEjOtOzYIr LC )%M~ٞd՞@P\qr ňK8u쁫A*#d6| d)UBX1̈Ҹsʵ b!ܡ)+K$r֗or^(oߗ'0.#?:RwcI 1פ2 ʊ7zL &]n2)i #'%u4+( Wd٣}Y5% QmuH!lgʢ"'6cxɀInu3SOE1)1O1ZXE?L(}.t4CLz A jFAMfD, B#ӭDNTtcvq/S&WZ|42x*ORHZ"Zsyu ׇțҨD#ݗg)6F \3W ѝF$1]nev514nO+Ӑ#]PPK#n7 C_ʽU6ЃD._fcDa) '`W4FO u ~JLق݂jЁaoml*zݛbfqQaB^h}x DvM'tzv"=$W)9xM (MMO$9qч~7jv ~3I q{ij*d<1"Hw$sC7 T,=U$r.F \"TJ½.<6el4 F9lҁ%iE)4^gP -ePrWɷe'"^/@Zmb{yv/4[d!^ae=fѻ/ bxbG,Q,[Z#5_`E☂ fRt}~ՇLI{yz-(a zg>˿՗<dzr}C\0l <|CC3U7Tǟ&gS+r_@[DВ ]pvs9Yt \%#w_b:Yw?Ȭi`lӤi|48i6N#M_4k[ia))ԾLU r4F|ͣTؖC+ P@nDWڂXZ~qT53o?n~,cMɴ;q{i w6-2nkZep{iXy cnX VP+Dh(<<+hUkQs%,= 4FҍEj1sg"fn,AΖEbYB̝- Z5l^nl/}$Ձv#݄.gJ|p~ w7!w'8ܷi?;ɄlUhظ[prg+FPx25RqVj#{[PYTIfVl.LGnWq=5oh'-v!W=A@\#%w$r-O,yrR @r=oyĂٓ3AaG?TO95EN-q)PPY~{>endstream endobj 193 0 obj 5197 endobj 197 0 obj <> stream xYo6_G ҼթѸh]M|;j_+C-IޥFHR 9i8ݖ?Y.ϋۂes8*wX˳#%dՓ䊘FBT!U{E@ZkUzAꗚ '!DT )a>ieeޤF c-I +RtnpWʅ U7]_'\a$>T-DfHH,U-z0"ExHj^Q4Lpu'eqPܖLb=. a]rM~|{<-v~+I=W~U헮/wP:HSgu4hU!Y$II\ zgG1^m1DV;,:p"5Nk|_C8}n 7ź Ѡvv\Ⱦz,^2 : #?Sw^hJ[sZ0Tگ=?ݵ30$]F`[vI}: .גQ}SB-qs(Kߌ%XrɑlOwQLl3 טU(vĂ:̬H@ä|Ҋ.s) 7}ϻ˨T BtӅKBW;,MxY;h 7*- JlFh3Pݡ5 4 I3b3DA䕭M6Hf%Jj:SX6@܌~ ˊ8~r\bgj4zq2B 1pלǰ s,CnXhD:9Ъ\Ua\#WW'F:&tmg55$=M8 xϡєWM@6MP5PW4m4jhohbr.&&9hf ֢ fRh= DS^%&߂ 0T`@ p1HMk=A!(L tʜOs=㹁L)3x8y5W4J(PKA6.Zt{WQe5LɆ>Ҵ܉{s>1@ʧ9#ϟa'Dm'yJ})H(089-x1~{zy:o!` "YJ?NZor22˶B\ @nh֋'di [V7{6FHuigvyBLzP9e/Ƕ%6F9bfF]*MB &f+YHۑ$03}SW@@!HȭNC+!co!ÄP|v_iB(N_ Y7[=yekD P9Y7- Dz%}olj63rՋE`Dz\ h]-8\+XIFdv;;.ŧ`q % &/\q&Y?H>1RS17IgF3} ؊RSȓWr9 L5_|;2(+7xU3](eQ;,+p8hc>3Llcģo؜S&cq<~N@\˂kNSt}utPQC.endstream endobj 198 0 obj 1914 endobj 202 0 obj <> stream x[moQ␢./𭸯Mv."UgI ,ݝOe'%Yr- >3Mr'Wbr~}O ;IӫɳXd'"g399;66Hg'/WGә%S9^Mg92:Ogis]MsѶ6SDK0h-3Q(NuvPO B9Q^H)Q<:uv2I&.Gr]ñ(dy}1JJܥ5\l]kWYxi>q6KrPKiOsn*N`x7[nR.]atr' _ >dvdQ: D.n*9s֜.%yZ&M[ó/*r-3( t q4ꍬ[ǜY¶koux0y$WtŁ̼$`2hq]?U؍-tBqyvBʰ†,+QNFBLpЊeiZ%ΔK+jە>"EPqI<_4 * _7\ Ƙй($WD2˒THVBɳH,בjV/ဒG)\X@p^eQ`S]}]!PZ nIy7qKo)N{e"X1A`2$\n2%/mڧzTVSkP;cEPFo V p|kW L^j:ZG@H@5R{0 r0*Q! TQor] SJ⺢j*aQ)mv¡*#|j f}\@22~O}O@] dfZ6)\7/u匷w94#@ ⼩8KB ʵj!uQ}^ŵ"g#y;5 JBaL١07!/=ԖYpMG9D1p4^S6^=:7^dtMNP,W<(M]) Цn-k)v zqBЇo#H=;肵EHm*2uH3F;֤B<*$EE6$ԋ z'nQO'"M >LF N`LY, @40!争WHpqA(S"@"㩒/bɤoҬD2N3SA@5^/#"Gv^U"!xKh{YMRk Id T\E 5T!9Vnfk(][7$UQ8&8GW^ W)Irh ki~'#)9eF3*jƅj]FJ}Qj&?L龜jh .?uf9liݶu!bMDs;Tj>.̀C /~i~8HnILYf[bEdȵ=Ku rA%rd/Am(r56-7}7IoIDο/\ &]Iޓb$TRDGܿѝ  >3UrL`IK$GrƭeKT`W"Fi$DWv""N,d>\#Ôyntj'^yC;TwޛA(uQ*xP4va")e(E6vj>Zz:+8T"=-?Ź^&F Ck;m!`(փG+L2WQ| P~o]lZw!7)tMyMyGηz&\*ݦ5:8GE!JOI`ƬnuAX=zL>`m#=tPigHiIkXqzcxk)}2qQZ`u lrg0lΙ0xʛ;ZCyuph9=!ߋķT\~^{*n;{R3,bG^~a[<+O /8t+Į6<2p&Rڰ_m+ajB+&IZ*6iI~.g!އۃWyc"{{Wd.󗻢oyp {U rQ^GpzoH-T%o9X˜?H!_ATASsLP/ww\pJW"/zF٠{s`T|= ¡Z0"!h$?1< jS;أ,d$8$Kߒ>}Ӣo^>@0j"LK9anW:I^kOȵDDk/#dQW_Ր]M?}(YG wOqmכt `h@=} x|Lp'&QP|F$3ӈ_j} 24?kif>*ѕ>*P!F@p?~X&;t GW߅wrЖꃤC+m]hn;^MA {}]4z).#8i1ihwВ}/wo #qMk75E:&жDn6T|]03q,WT| -09s|1OL`q.xPSB~!3*}Qi՗7ùU1Ó9gDȗvy3e|'팪-]%-C/P+}^|zGJb-AjX\>0 *x^Oendstream endobj 203 0 obj 3232 endobj 207 0 obj <> stream xkoG 4wEeSMh,@ 8N`IH'+i^rw>o0 {C-S{v}[?G?|z a%6Bb%- 70J.'G-_Dlnňzü}v˕ձ"Y-5l]sɉryVV,wP˘ZnYjNm51wqh1:"%b%B P]XүϤu#\Qc@F.*XBX#J9%q"լ?Ə_G#&?F]4HƥIߣ5S(bMRѰF!~aDeA_t3G9oN>xJ!udՏnW|`@PRGSAˉtvi(alM]=Y2Ya>&Ȁ0iYA7qI1 sur!$:"6/;+zѥ5i=1FC5Ȅcp1!7ߍ!X`G{JBa )Ķ8Bޫe*eNiCP*ۓ-JP^q[Fn+y},4"XSgyb e /O9pޡw}M%/(KK2Mfp"\l!u«i};_:}HCBY]*8A:GAm3}I}X.0%7- K"—;T- ] %Qo穸= ,X9ܚ3i @]4f6e6mqu Z-K gokAwgfhaה1 QG%5\,BQ-qk'͑Pe\),!@avX笯7vlHE:9\:fӟ6cJ."b6.*B~{ݖ:>*N55vE5@n>ORдTFvE*;T/t:\jzԎx>hd,=d &p)?thՊD1R Մ[8*Ȍv)@nPjOM ոMhڏ"`qQRz[9:Q^:Yc㛝,t0)C[~R$q;zJ5M~_ xQw67kb9MlnTF2UKY)UXa79 C]ݏt~>~ڔ`2~>"rQ6{LzenuLy1؛dL̆3ewJѿ??Ts=*!x- Pi\)sԈ"OVmKFIG@F_~TsTXKC C%%_ / y)1fAvy84!2/gxu]r,?q1 'x3`ɉ72SYneh $a=2=}mơ""i"Xt:UԪ_Oؚ40g񳼪ANB V&ۚH8 q?/ =Z59u*i7AZT9nJ/m{tY:J"uB坱%2:qQ(U5*yo).nrJ*sq,A*Nb*~ gM48@CB8 y< kae>译 (ɖ"@gZD[/`|?ajn+(O%VL#1egF HINS%Lˏ[;kstZo0jolGHGw(m!8 pF}DN1Tƙughw6ȶۃqfi@Gp!X傚RJ ƯUtkvaiCѫE5r#VmtVRioM.j+ӮᬳǒA8nmB]V Pz h*/Rj|MFMB=-z+^KzYO~H P\>~O ]*қ'^Whp1wvw^ǣ%xE)}xZt4.+% %ڳp=ݵܿ?Dg~a "upk =xh~zyi޸Ŭ67(ޮ Tl~=GWءOß2kaչ_L;7Q'*Ƌ wcEA&jb гßG )m&#1}n3>Zҧ3gRfzs6T4>Z1\>nCTb1t!bͩ!f8D9|Sw98ʹ.ҹn(c24By #-\x 'k> stream xoFt?* %\|0: h$Q4D]Ǧ;۱|M,Oݻ޽~ #B(o;]qnDO߻S@3p3]BH ":Q\|%%b,%'LEzp8Zɓi$%J)paͤH$I|hTvf7%/8GmdK.nnzۗ婍M ա'l0=|h`g*o cbV>KTW/Q5ɧ UBN;@wWg'm4,pNYa+ [R@)(=S2!*Tj$pz]ZsVbN!\k˵U;yÖ /@NӼh ,S^ij }'b./0l;DžQW ]rQ@(9@xB6Gh"IKq6кϓnsy(b*IbQO{U6 %tf}>z͂'@D(} ٛ=grC,d^h,y)2.wlF@`@D8v[A[t9-x*D8=6:EuV4v̟\f"`62oUڬf.Ď2ۑCiYwx>*}F(IYxyqu_4?MGs(&x|ȸl)uJ.8HoAOC~هhF}nPՋ>qKQES3ɱ7K8<̃C6NY;ǝQL[cG/v_4&`3OD4_v| N1Í/a{*~u7W@3NJjСВ{#YNZD$kݭG ~ml3TLۚqmWbkZxc;53e+]4x^WVTքx^uާMH7| +YXqFUB)q9;z>|SqS؋sqz+n֐ܰyoܫ7ę%w6J4_Rn[_ϗ*={ 뭗 =cRȦB>X gwxxïtÅpŌ%!_ukr)cQ).)$0yEendstream endobj 213 0 obj 2025 endobj 217 0 obj <> stream x[{6?ED% h RO(\q/n$NI6G:!F=o3NcIp7drJ.'8ydM>NH1!wlI:IIes8)DH$щTd"ʦ31I)AaBw#%,#vTQyMH+cY4ŔZc)Ś#D IϊD ϛs,Hϫ u5jgۚ$Ɗ@%/LA  Ut.ʩߴRu-;q7{< uP".\)vMFf5:#k@s^m`>7X\Ƃ[Y^5VH{R!m]GK{n ڨV/HL'zR\a3.l|v..$ ЏsLvH==Ƀ\/uS"ݓO  a,٦F S%qI^2dr{TPD9uLHg5Ac0]%OםAfy2 86-rJ_~4uca;cTʝwk$1B g5n1B)As ]Ua" Y^&5Ozߟcbvgkuc\ 9r1:JcέAvɇ hGpϞ|ɟ< ,ؓ\[x{yL5DQ Ua8uI <%+\D8a 룈k(xF:-hYdL;4VRBSVGASS1ZYlya4H^ nW 'Cܞ rǛeιZ?n5Tw VC=ȅ}K S7>}К]@'4F 𢬭LʂUu1.}MwF kKY!(4?G_ΝQȍ,+Vhf`sllIPڤp6P9Q뛕J*Eb$rېcTQ^ׁ-[jT}vdo}AAwX~pw+1(O] gȀೢCΦ(&ʷVvto9O&>YO}Ya MX3C-7KLduse+:l׋\9{zq"=d1X>v`=0F/N%֟zBiAM lOڍ@dM%F߲ FF^@ʍzw(6ѕ2=fC}׃6ê]Dꚓ0 Q>Ʌ+e}վ#%! 1H.=~$m WåS`! E,' q 'wr{R{UWdIш>Ww>_YhK޲˲ngo]ќth=VpM F>9>[֘ |XM{ FS2_pg`endstream endobj 218 0 obj 2005 endobj 222 0 obj <> stream x[YoG~_1%lK@8(( {!cjY*B.YUWսH˿磝292z="Edһ0R⟗!5nq4Zh7D&>`z+l Ro"%YLwB[Pk%=lCle@i; +# XAڙblόS,C gԊބX,1LL&&6^"[$_Ѽ%2"af`yYO&Į-| B ;#au}{r 7Z뀣ϔMDPoV ~i F~F>M <ИێOџu GP !"-m5rO >ȣD=`]W+98.7S(W Sd>0?/LPѴLBIc( -IKѰ~JKse9q N| np~tΌ>EHm%̹E>|6Dp f/v< f˚ "^hl|JSgru 'Zz`e89f5C;`}pVG V:x>dKeJ0)4C觵 4K[gf-p,'bL=ωRvэKGqiiCRi>4eδt^%p7j 9q3ѼK듫_]nYM!5υboq|E^ISgT!,3"U]-*b6YoDņ"ۂdƚse [2v')}7[g=leEW7rKv#t'ZùTcy4 Grͦ^DSHT6D6yh?U3pÎZWަNj[xw_bwV{ [i$.sB[}C`OFW[qhJR M1iDٰΤfwA7PSWN] zui1pSL vxgv_bs+H7p; G+z,\XYp;=z"T*ORؾ O<6ϋyWXc̾1̾h. ?Vx'=<2{l6PBC7s&[3c@uaIx຀0YO2V(&cQZy_^9\8guۅphu9VL?ԚW'Cū`|moa=h5x%4'QtoNƉ_g8?ϏgWCirl=iMuh$z崙'_Ap(QcQ@stA3bP_ٟyg_k6endstream endobj 223 0 obj 1930 endobj 227 0 obj <> stream x[Ks6QՉoNLҺK҃d) XPqҴdoX _q/(潗Ǚw;ǫ^hA,MN{r2Q{iB2}$Xp?X&Adi 2q,̣zTZ4J%EAfO 5KbҤ?,xP *BqA( Bo7Z$#/Mde{8j~C łUhrp,ԋ8gypZMN4cjZuJɩ$9(yc.bc(X9m۲7$^ fy0O\̮ K ]iʰe;{sik#l喕5%Ɩ J̽̓5C5 esL(9?.ݺy DɩµbV!*ɛxW8Cr ilĵD%TyQANbqx c=Zra-K0E>6j{j ܊ $=Nf PTIfp 0KܺXK8vͮ-O)p0|3QG}j%|\9V ߑv덑B$"11j/ *$~&#TaDFKZnG9kIls{mVp,v'ԅ-"'i΢KB+D@$8ȭn846quݯkj\k!k5ɾIči,KkO6FRJY@fJ$c=`"N"ɦ1MdY۬/YZ9A@M9̽0pjr"Md g8c8 c )gDccI͞br'>}uL% q9qJm;5(X*fڑ̸ŀ52%3.1pb֙j<Qpd}{#Be0&\Y۪V *唅Qb(ach\mi'zk`+,G:U|l&6Su\SaX xVܛ4ƕNΎ i5H/ANwHfVPÅ1 ,`ͪr%0Kd 5"f6p /їMU80F=RݙPtqe萲7PZ2 ځ8t,inTCVf͝&@ zz XX7m8Yo~ؼޱ3--s|=\`nlJݛ5/L+h1хa-r[ƼTYEj.>`og 7SF@'R|ϭJeϠm~zfS%q Ț;:5KCb#̝ÈIjCC ܌_pZ褘&O˜4\wOO]l ]\L<$|Ӄ32wv>Fup\ylTg1%鮎pE`F-Qhk7TYj⸻rҺ{|sfpی3$߁}@\[^BE4n)DezZy!RXg<~< K;𦚕%17h:U=rwOT;> ^Wt8. 'ڞN.-zLX=]pU]\v .X dQz>i89Bg;?[Rb\7XKuZay [3\7i[fv2qMfAQӘl{pHR ?U2[27T\a'J!i;S8E>`5#{yl0LYzlVt6ϪW,/8Oʙ?^Ozendstream endobj 228 0 obj 1990 endobj 232 0 obj <> stream xWn@+z:o{}7U &"q A% & !.3uܱgRL>@fr{ BIx EjJlc Yg3Blx=8J[EiʙCQ%8 ~,JmjΏ oEҨFIm%꺮EY|TJxo92! )UWT漈KWpzUXh'IN:8'8 &oZhSibA zmk]vVuJP1/au3s,":-slNkZPqo*d=$ȺsK sDqH /Op_N6/*`mBT\~ )AW 2QLG롉 U7Ԍs N3h.0ERuVn6 I >PF,9n FLMD,]7Kg="+;;kI,e֞dʂcqܞiL]WE5"L+˲8G80IdI{'ފx2c(xy2Uܺ:g]V3l-`3Xl:~{% ?MѤ5F6AXҋ?{? D:y- Jp=~lwendstream endobj 233 0 obj 949 endobj 237 0 obj <> stream xZMo6zЭr⒢HI4M-i6C`N/dm}) O8(  ߛ)~P~ۓ>&^()(݃8$8.0>X`!de&Kku!D(<Z; `O<[G,0Lۓ?daV~4u%DNȿI'Wc&>8Z#J7}GPňR_-Ts}4܆MF.W1=NEUGI<b{>Q sQCI`WJ~1Q5iɨchҀIDp=\2> JBzmja+m*E*l7&FuquL Qז7zҍX}=lH͐*/ {H ho;؁>ƔYv`gWit!Om1 %VmaC{`_֐ !y[%ҥd|RԇQw{lV~#<nRg-.mR*zmyXπ듂VU\YJ Ox!YQ5T'2)Ka_W.Kِ{B=[(T\AH>#[N)9s3yZ?uB-ʅ8/"S6ķ|'] l=e~qvU! DpGm!vN ×8;F* aeC !X B9da]_'{-q2g/p[lċ> [#`7iy5|ls:\~vXjl'gϣ?H"sM"U4Zl@ yioi+mu >χǐW/x2ڞ6gb`@K-|nSpa SQOر ll0JR,[=JLAOendstream endobj 238 0 obj 1423 endobj 242 0 obj <> stream xYo6Bؓ~A6>T OJc߳*)}C '.Sɂ3fF^5\ LSZkd&r~/i ?NbxL{ښ plpOl>}" Shm<<C\yγ)zNČ`w wku]>'l|8&} OQo?wjMh)K<ޏH)L\׍iQ<3ȋ_.Hvz +MqxȭX I_Go{:RkÖ׃GAuagae~疇CM70Q8x9ťe6$6ٽ=C/O ƕoa0q>(,*a o__BoijND6Y*rh OZendstream endobj 243 0 obj 1385 endobj 247 0 obj <> stream xWYO@_aTx-GK,v|tVBd7\0kSWwrY]'VE2R(m߼c& 6T|hSQ:ɴsF: R >._'7VrN@ڋ p 46%H5qIXtrggf Dչ .;.'iuT/k:il]^+z^,.m Kj BddKoH/T|bgrH1ܬ!XPC [?#2*4#(VBZ(4_4gsV@eʾ@ @tl±c@vN]ؖpXkZeedúܰykOIk x]5'/\WsڴQ +]K1Ф!;&&-G\ Xgmr:\ʬK=niF@Lz`Ƃ.{rN_usA>q 7dfd J]i&5dF|Z's!2~mѷ4Bn|CДS|AB vZu0Nm嗞 DE cM'dcŐMJ.zFs" =RH壳@AKZV1Nd".?/HHlXؚz4 a{Ur?-Aendstream endobj 248 0 obj 903 endobj 252 0 obj <> stream x\o6Vq>(CY7[a@ڇNGmmLQ|D_տ70\ IR 0Eb8>DL"I^I9z,a%,NQdfgIZ”łgIt)2ɲ`lQ'"^Dzq%\ɄGi0^XQy]x6R؉$yp: 9"\r3TL05cn($ in!wHۣqW xkoocDTEi*ۂLZ,#F̜k#^=wV^Cm|7nH<{;.=Z/kRF@_rsϭ}6j p0Oҷo!8,HRji*k'g gOǃ%XIendstream endobj 253 0 obj 2346 endobj 257 0 obj <> stream x\IoFzrhCInhQE҃m *K$q_{#~Ԑc}f޾q9pԿgG_G3!6 ]^NMI ㄃#8|O H&r ă(&GߎƁ#ßFc_ 8ݒxA0hzHBwx< }埿M?p&@lrZ4#Zgd+֊Q;[C% D{f=`DuW b_EӇ_0zw~B9d1.teBǘV񤒁lfap.Σ5!YQmͷ2MH_Yj^GʼV]xЋb cT#-ߖa,oG8yL^½nʊљBpq츅n±At, !㈏хö<…ѳX&%ؿi`.'"8`9nyQG%w\M+ bs0|i{Rf`S)#V7V9`'-_ q}om2ًYLnf@ڞN. ȖPkE\Y>XJ}m_},~f!fTwjM>5QT]{vNpb0dRQ\RBJ=ٗ"pu˲Lqq20VkZ׷b^ ?L%ks}yN%d6euYg݊溵˻MM\ܥr~i*a?aݟtyߋ{]>-9{ aKi'b3))f7?&纡"I:EHレgdendstream endobj 258 0 obj 2536 endobj 262 0 obj <> stream xYKo18Wq!Q`oԴ%-$~l཭.&zߣ t7(sSμ3RA( yh]edBUl]?6կb€i"^j]|>mtQŬo% Kઞ'gh9l}g\>wFr fc㒾Q!>+PYP 1|@Lh.d}>xưqU,}Jgd3gA~YVTca,ZD`lzsZ1uTW>ٶiPԌb78H1Pȕ,ec9vϓPiQGM.|zBBO贸BO[#,K1 dE&C{sp,H fy:ͯjR! Q@[:l_=v#\ܸMV$7!0/<jmb~\_\:`7 4tCx31qhU8 ^kz ɮ9y?~zH0qejåcsP.7JponiPoePxɼ JXGp`,7zFAIrB{Ͱn^5{xD(erj|:Y;yoGendstream endobj 263 0 obj 1034 endobj 267 0 obj <> stream xZ[o6_GyXQwKuCfIJߏPqf0|i\s!O9O|;꿫@d2ғg4BeIj$JrcA ?s8A xža HCd)*cwDta&T$i,>RPU^"˲iPK~*Г"IB~ ͒PtD)Jzc~"x '\0*T;R@DIT-Gf4p4zKP Z.3'xCpE2_DA~щ%w/b+=hlM!L/Ľ3:W8fFna 38|QN ]^6'0{~~`+XAJg2LV}ƶe!̆TƆCS~[?Q1$ j0mc"0[VfeT'p <7\D Tgi`>J.ܜls iO6aP1{rW*d@iU*]aNIG=$5sϡWp FwfÈlΡb 8s.`C`hkLXZ=98-&&hJ|kFe$t2-d=ToJC᱁XA՞5vpCO2ŎGMďDl>:0ouR}N9%xLU-e4eSarڝgRyيxx԰G)c=6:4ڂ OĜfS8?Q} C-]OT16 j=Oq9TifT7Cep0bf^\wGp\a'ŠifEλ}iEvQ1P8cզ*ˢJo '.c#S|c9q*I}Kgf9ma<ޗV,luoT,Ҏy=YY!mN`*\(sWdI&Ǐ/ˆv| ]i Oc~%TG2xcn ']6&/ =@k*~&X'bubf"6$ax2ǴHrO`;6_]8v{;mzsGa;rI]ểk8i|L8V ª(+#|بm:gkB{:w!vɒߺtX}7bQ9mfes ҟ'endstream endobj 268 0 obj 1502 endobj 272 0 obj <> stream xXn7Uee}I^Rw#bF%ّ&{ ٸE hHΜ93ՇL /7Ud2ffuM]|0%˚vڨn'g*峣tV:ɚ*?V*MFNYkkż(u-+˹3߿ [%V*ᵒ&Ѯ,Quuz=9-+_ %^m~yix31Y'Kx pGp n[hbjBƙ޷k/Ⱥ&(CK;;}ج”6$|7Q%Y 8qV[/tYd쬒p#t2R[H0Hvh'؍;7 PVRNvƉ^R,n/0;UB]Y)pN7E_Snƒug/4;UkhN/4RRΧqW<ΥtٴJ \+ȱC̈́p] αX>| &GK@:s3jyWLމ3^,\Z\ʰ/a'k<|rzFᷡRhe%>a@V: DM#G_N 9%k-M[_j@G!0K*%ĺjו1sm}XR3"znZF3K! @Y:AEd v+QXJsgi0FXj.A1}IpJw)Yfy66]1A#xN4)PJS6bDhzf~NK*|!U)h5 RA%;n(_Ƅ1 ֣rUXjol0遳w*MZW͘sWTL,cz!;ty'/乢:37QPߑCt+%H#@92}7a\f2e&$Av- gsJq@1K<7,gF]{#S TPRBkzBDR7Qnr|=n% VປU mC]*WqxO3n\UUJ7n=v,(X|s"콍Ȉy5VbJȎ# B'*"EY b(4k>~[5+J!|LpBb:dq^&>G#O?Q2q̉bTsM-Ac_hZ'^꒞fB=zӄ.* m+{j4n`hWU_i̫'UqT[0Wz!ОdM,#9ÄmZJ^`JY1i\S)c\ۿ$Ձ[d+MKsB W/$3-p7K­15(x#M*gĘ7$+@LZ#)ʼnf;7YrK⿂h*faRm=Aitx/ww{ƀ8QSOZ8^NTҰgu a=.hjf,DSO8[Af-o k߷j.;-?i=IU rd€TR{!/M_>AsDOczDI"EOve3txΐYQ9^l=$,Dl_]Ǽ>]5ܱ;.`z cw0~ il>*֚)@Њ󍂡 ~Mhendstream endobj 278 0 obj 2415 endobj 282 0 obj <> stream x[[6c~ZXhiN)dC.fY.ږm|$vv(twR;_O{/R|=𝟋YMp& Q1)/ȳ$Z)R;XϜ4E9hža HC+a#M40y/I$X~( R<~^UW^"˲x>,KB?Г"I<|;+̝,JV'9I8PB<-6AaHC^kr'\jrYQ)Ie(M3c=:פ(&|^3IW&nbQ c!W<]k=<Y֣5Isizo[< ,pKgl0uL~Pyc;"ӣaf¼\A<ݗt Y Ai^F%;0V:J"Sg4-LV}_ox $Npbanb&~$bK uԦvq wx k+b,5>Kq3Y<O$+npy^3ѓx3dn"ʛ@cI+5Km.b`">Pq e"NZinO/6tUS`},;zm Nv͸<,+Y'm=a N m!ggJg-WL[:EW kC}Ͼp}2)+kOԋ F&V/=FO' hG#8&.ĉ|@dfzZre:&}Tg\^C:SL SU |[P;V vLI=',>irI2 ܳA6ond6Tb@pQztIҔI|}6(or n8TR ⸁VLf3(*W@xFHIZԇ3.gUpI6z7߳Vr_{8ӁLN(kUL"ڏ%Q$6+4]Rq`tK&hK϶94éi%Y/QlgʽgqG'3kwG 1S P7*5;v`[ǁz UJrSK,l=Th-|JAjquZYN"٩],I:k9%3%בB7 }L7r8ڸƧ׆p=/DQ|KZ ӱcHbbP!0 IB.0Ay[nc}ozOMv ,[&$^K*~kELƐc9Bj$t3GlFe#t@w=_KAfTˎO^$]']\*gw6 &Ԏ$͛=s.>c+/fGG'lWGՔ1Fv}Sͫ)jG͒OX/X axI$rjx&6\ʸLJendstream endobj 283 0 obj 2178 endobj 287 0 obj <> stream xYY6_G^yhBK]nRdOM[g8F9!dnXAJh`sٶZ)k2]8rQ/ckōp]#1dnK |z_17^uG58X Z<}G`qσїnjҊQpWr^4cfX*[ -5 B~ c >bC|($S [Yrg\7pJgz=d@"p }Ş$s eY9HS(2Ͻ#|ϽH@&vGyw @/SȄj궅: u+lg&⻯f^4\w]Uit}`G7Fmֱ\s'P6ICM{(ğaHlqċY nO& #(iDYbh8EGȭ.d#\fZW7Aikp cz"DA@<,bEo(ao40_f`yvX]Lɔtt ٥qfʖir24l;[q Gݜ1!OӤQ?ecnc7 ɎsyW:י2Ai7 E>,SFguAH1Ts\Ak{HtD} 2g|"yjXݰ>@5w[;v,uVp[EvN}zV0|{ DHW WL@$R=F|Z?ϵSюIq))U f' 9=H7vH/~`*}ʹO!,i*Iz;&OJÔL2Xԡ?dȫFh&endstream endobj 288 0 obj 1320 endobj 292 0 obj <> stream xZr6飾TD ^@I6NzAj%˖d @4x2١@`{bG/d ˿zu-vE[ 5MޛTFAȊ\ gI }1ooAr'a$,n"x*74P~|rY(Я``a%_![mةv%XۜvL`x^bG\T}\|bTWbJw*_4c >6sda`Zɩ`1Y|!_q}GBJZN'KLk%Bwfhᚡl'HFx~MsIx`o:%b.mK* qŠH[?'=CzTHX-,@]8{xd'@G)èz_5hZ8ϛt jk+]SG>|3I W}λ%jrĖ[UBZ65rZAfQLڒ!<>|[f e4t'%S WVƧ~ _1N 3Ί>%lm> stream xYYO#G_15&,KE˂}@X sa"吅(j_ERHVx90fr@x=M[J,(XplhT"S#FqbR cabTjm)M#"w6(33+Ti>UBH%JuEQwC']fd0Q"Liޏpz2*2[)XEEi&ܖ"\Qb],t*xrMnyQRmIYja3WoOhuAp\󫟉$rNHv۵cVHauq 'WD~$U 46HHä(Ri|LD2q ~CVDhz0Bf訚 t,lo%Lӆ,LYqPzw Ie) k>иX0'c8*-3(s h`0m'](jeYvCu*dI{x1^A%ׁ [h c̻0BL^Ec bơm:B͘}]eҊm*:$\Ѫ`#` =x&-K!AYòr y ;`/8/9gF28ofa 70a 5raMW*D a 57c= UKH Cc篠w vd&v-'Nf V-FNPaX i:в8 ,oz0#NmX"uMLNVjEݿE00';Z}C2C])5:L٦Bp ]b9mODqe/B> stream xZKs6QՉ` A ƱSf{qrpeT۲KP>Nxg.m Dŧ? Nj9v Ao< s:Q|25Z%L`ŋu*"dqY3*1( #Ī4 s"Xau u"Tc}*E#JFIxGRn/aV_ON;LÑZ+>.e[l°+2HpKLLqe/ncQ ! yG.&r^Ia+EzmɽoqxN)-pz^B Dv[:a&IwӐ "H [A2V4<#1;W:)WdXp\Lo,#܁\m:YÐsmqMB%˩mcHp3k]>5Ĥ(1?0~"s\Fz*=Z|}B08m3  ]MmKڸֳ*;0ˮ cP{ѵ.:'O~ mVsqts5ki%\0Vjg^7k2 9,v*$.Xxk;jJƷ6)Y6Vg#>a˱#n04DѷIjЄm&Fcۜ)ig-6="dYY\iYcAS @=!;D1 ,O~`J3CZX3.L-~#pg,4@78vLTe*7x^0BP_`!Y{lCx-ƒ5) .`$kJ܂.Rx~:KJ_lU[!l9)['׳Xc@f SEi{:G< m\{evϵl,Јײ"m暛"j=5'&QL~_BmqOj;gK71:FJYaO.)+eZ<~s\rsendstream endobj 303 0 obj 1576 endobj 307 0 obj <> stream xXKSGQbo^y/ L, XaJu*lN.Wޞ~|ڛL ?~9'7oܻ驅B7f/APRl0IkgJJl- Yg5B`;JNY⍵~M-QߕJ߇ҨF2oU8Ku]O_O;gd~sƛσose2+*N:sU%^[8Xh+iD@K,О/+W m"(D^K% ;mRH:L܉4֐뚤%8QVދ'$}OegP$u?a[|mONZfZ]UuXꬬ˼ +Xh k[ Jǰ&(SXc2~LVCzU%W0s:) ­ *:+֤8-x0.xmVa:cR5' %yz[}wv/ApHOcmi9mltassk1vGX=L*Ukqk9R@%#:~٘UKbsゞB.:t d)~A^ (vajYqbզC8HҶ]z5+ߟmCg' ٘Csxc1KugϠ ¯XU`}a:KtvxI×;M}c}E&[0& ZVm9괋^7 8Ar~:co1{'s_B> ~%RzM827J! 'vZ6w0IRKЧMnF p`'1fcFYtPj60yFgzF.V 䕲އol9endstream endobj 308 0 obj 1075 endobj 312 0 obj <> stream x͜rFr`L067+`++[ Eqr:m()y hŻrk<{zzs7;ƣb^|Vz?ӛI)ubu$B)G^ګ8rܤ7{0r='`:~EA`0̺A'< qq"ϗ9ne礁{=]$ɨ]A]#>zNiL bq VhEuIzhD~!laǏ\?'Q&Z+2E120˾֥jֹ&CƗZɏ&jluB?֩"4'׬5.0II{zIKgL+2|?pz92͍ZKۮ;EnuDsQI3x^:gHfHQ abYy: 2[#C4Љr4)8bcZliB%Qux4,׀fklE~㨳du&}JGj }m:.cbw.WzS|:ћpztg6G'tPY.0L^, L`(tĤ@9N6)ix&g[BNL9%ζXڼ}%36 ܖ{@2.}jG'Y:1C/FE3kK-?ө9z3/3Ԭp,rӦ0ٖ.j{ r,y,/fj%/8hD^U,-T'"ɗ0a[ dah_۟;2y;t}IyqoG6dWB7{(.,tòBL]l`h M;W`8/pׅĦK=T>sÎ1f}dc$9 S3;D:Lb6! !L8]cMl<9նa'FQ>ljͼS<)<.*nCt-8l1M XA Ĉy~u NJmqp–w3k,d"_"wqH+&{=3 tsJBTK:>e̓; ȶϑIv5QNuhU@M)8mԁ9T `opYagʘ7ߏ\h9k O܍W(78/~1^{)T Ѽ0*N܊!Zk֚H|%2.p[ckWXU7Us#2):\T7(=glL  G[W]7Nv*SǐWp_ c3[xm-YQL5W+q|hu*(ɹޢ{Wpl:'K! [8/?Ӭ)m EC%VKϹu:,=&5јhg)`?{1—]yCkˮcN~ƅQ ɶwqZ4[MukW8Mq ֘ךSW+_9ՠ0"m8Mng}gdf`u]->"򹞑􈼲V[SrVʱ,'Zi>jb3V)qi)" QLGr<{'Gۦvэ}@e+4a5Bø[ArR3g&SbDt(Rt?;hq˷oO|ne rpW Q&ľyůt lk%^QN;D}ԤxgMvUN;Cn6ZWŰa(jbZs-qe}hr X.ڑh3-`<\b̝< @p-Je{x>/(Wb?9 |+ ņ1NvN٩ziZv4PƖ|d_Pendstream endobj 313 0 obj 2825 endobj 317 0 obj <> stream xmN0E% /m ׆ReWuJ-) >Id)"]_9 (tz_,؜ -[8o뽸ȔI:АSHEbL𠓈ނqKyJKIL@oLd{Y1ޫ9PAh.tEBlQ;Ys傔RWNQuS!lW3eMƺȒDx`6 c͸4l[tMkTe6;{[W|cud?-cxDg|au=*dK7G=Q) %sƋlF)ĸ{Q`Q>32oΪ?.Bendstream endobj 318 0 obj 359 endobj 322 0 obj <> stream x\iOI_o1+<'0`cBPsim8wn!("4QU16gh\{9hկjn}yـѸ9LıׇW|Wb':zNq]ck^x:VG5]/.ך'9v;l[vFyNoő7F8)[^cR }J:NġׇwnG4nEQ{oD0٠q4g8;aԗ.a@>Z^;1x+OoD+k"ދ]'Yĉ"8ݲk+yzI4[ӱpP#97t%PW!Zԭ)C=/ԗ#:A,ޣ4G;_c*R:h|]8ɩfq x;+B_ذ @չGRAt$/ȫF50atw$7fJۭN+U3 mPl~ߐǀD8tV25 Ols3z2C@u1~)2vHzn@ a}[Qp@g+x2d 8!R\uMNSu8q"wSmRxbcۄ䥈Da8v$Um1e}<]=?Љp$>x\ $|&z `ݯTR>3oAWȒ8LSY|,橕7!xEUd[PVw/pGՍQѰLu~lz>4,_*/M#\!a;){`S^t+T[8UC᥺c!?Sme08%|"tӱ鈮YnLЃ_]b9ud S?K Ӹp}裶Ve+l^MM(T+ZflKΛG޸To?Ar{#V:WJo05g~xeϓ=Ylu òU;i7L{j%F*,>3Js9+zVm\/M|Fpksw/x7=y15S}*ziL&E/wU #-P|~,-)tN-rs~jI'u4n3blR.gs f^HAX&?W=4h2v)QGr+Oyb߈%(X-=RsBL3?a/FW3uYf}!-9 LHC1%Gg*xx6Ϟ NfͧY+od(M+P~W=`١M"ZWx[},>6|,VҶj]xu&OA]]ـ.H[ C.ݢom@^?~h4 ]ФAcV/dK @QlC>SOl |7m]=XZqNvzg\trT&㶤}J)0불ő +Qltlܥ.6Q™ H9͛6!lfjFɴhX7FG8)POt(U48#j˱ :,ƙfN-#R-׉K eo:d40# s.v7O^[T~t2jW0H6 z+ IJG)8' [ÌC]zZ1\a.݂&RW]Ɏ_}\#Tu5(x[) @͐[TX/5MPkrL2S>}ڣC~ܲ0ØR2'1GPWݧJ ;Id巐< P [:RNPjl4Bٵc(^BǡG}vvEm.%B ۮlj<6*+!4T~y&J̫%gGU爮`̭~C"R}x: P9pR ;YBHo-kGܖ+O>kbB~:A]#).f3ZyQ:o{X{Mendstream endobj 323 0 obj 2365 endobj 327 0 obj <> stream x]Y%c ^N)l3،]=՛iԿIG:2o5ysv>}gշ".V7O~gw'ϟ|D.B^\?{.V:7Ozʬ뢤9j]/Ų\^M.NE kNbfNO/bnJ'S_;ߕ\VN8otW~~֩M}8]ᯗgv3wb(>/AA_}ܼ /|UU^\zK0P*=eç,^ևתuƬ-H}em^vk8O"^ѧ%\]Ы*gVaUFΦ/՞d:9r }#sq%'U\\߆Cxsi6kOdHן^ 4a~<픺*]v֮Wbtlֱk|sKYi-C[q$ ı3w;^rϫ'S*]q拷"M:12Z6>=2rʞLC=]_-4q饱0j^Š~o[@R(#vt/Ɇ6OAO\Xz'SBHwRO>6eWwm\]Vx2;QZ&e~9?A.L|uAH4-LGp,voƧdS*yfա/O&;n]7+ҸIK|Hi{խF|W{_w>z]2$| 44]a(]U-kƋW!T{k ~Z ^P""JPi|V6"^$@àR}1穹m@j Xg_fQHH:@KUR qE H\$Ӿ\X?rb%'$ "1A5)"[myuq'ݡ?2]. Z63۸Ԙ/A@hopqEvs^&"h~O(iNjO,( # ׉̂himb݂ޥÂU':+BK? DN管UqK&,62r[gT_ {jE5 GKS7}ǽ%om`~Ŧxr벅JlͿ*~ A'̋Z":K>,,⺢?"ʞ@[tMeIč ų:@sgD kQ7QʃÀN:Z Wcܪ%2xUJv{O4e(5r.gMOhd4 Q$fB-촶*rD(Js˰ґ)#oMZ);xA #"kly?Š дޟETd<R2LZUaaCKZ}LbE#^+"?ؾNq |*M6e՚hK+Ѡ[n;_"2UT6ѵD4ȝRDfP^[AF6x A;J^ZWL%m_kI ZC7l _]k&tSJcFh$A1|PqP4 ES1v$v$57*,4kTnQI3–_{qWlJƌ`#QO*wL=}HS­xܓ(ԑ)ƯAMz:o"GB*Mka f<>+nF ^IEvU_D"¦)a co+uNTRM5K,me_?$' _7I?twS{%>4ʠ$Y{ndƻEYR7X~Oj_>܄Ȼz;罉s!V@mg)Q$*r sfźȍ8.rTz[r+vDD̟̣nϩ^[2(^Je9OS(Mhc>ZwZzuµ4E4^\OsPŸ@V IܝʆQ]qoe~/oĀdI/87t oAU[ȷsMF O``n-,a>!4#@?"Ln4^36>%/piD*bshtsfb}lU:t)3qUȻ͡cʹ0GB@MP,?Y? !E^#g/p!ilKg2lWyu݃uN%*zI'Px@X ʝ/bԿTq@ygc˽Sr :pBa煛MZ"ayi\DRL.Q(HZF`kޝ1؅1؎'5T QjQ ~:YIo1V`c.(fz='\Ubf~bɋu Cz:A/ꭝ)A[`Y2d?nhzErwEZIe!'1.y *jYRM5rfXl5n6ͳדp9s}Ѝ. :% VĚMdݖp3e(]?l/AK@0O3*/!)BT6yIG?*!$4cd ,&mޜ>NQ t]O31c3֦.Be|[!f\s7)\\>s\^;X96-vqjYeAtގA`>LϹ.fTo’ޛ eU@ng2!P=HʺE\D#87,J;39dPĩ$/l<0VFy@yLm}f<ő]%}`R=c<6D\u#OS&KKʧRHBבBM\hz]cACoPEfѐxVʲ _yjX9\S<^@)L3:km ߟS񇬒{ɗ" ަ'HqC@{4xx3*P+}0՘ckOoj48л*Ryt|ΘW8"LHko@hh#V$0 +qL:"D;Oj^:69z=WQ^AyU<4!G/'[(,sȖ%N'{^qLχ]Ԋ"&Q3Vf#>s~jlOHKoy`\UV#߃έ0F#Ҏ󛟸CGf5nq+)B4i?K[V O#Pt}a )ĆLqf) huF5Ɗv`X(g5+p=M&tfM퐩?h(QմhK"2̽@qڈ/D6s$-n:ϪhH{5SHیLa[b٫#s `"@m]ZV `vLQ'|!TD .A$zwj'AB7ϝIJl>LTÒOODž/v|d[]^v({z҅Z9oqc*)q]BǠ |)MIȵT2pAg PEa|Vu)#g&0tED惜RӂP wbE~' P'BU9Ć.a̩EOD"0ƧTap]u}.#@L=RUhcj: eAs'G9".F|[١6R)|rG帛nxjYn4Ƈ𾩶ވos׆7s,N |Hz쪙#rJF&PQ-j6X7r;Ӻ\;H:cTf \yl ]B0|Uo<=;+daP-R&KKuMKXj"ĸ]S.ï~eM?d&6Փw!˯s YY~j/ԖS0n,f}?&7%Wg)- i}vsVLŰ!6# QO7n⣛&L bұ ꉲY]Yfyt~FdJ}PTI7$=ydjm~­YK5I84Q{:!R8jИWaUˈlryaC|G#FŇ[ÇxK#*t~nyȮ7 kxdqҜLRzCaYv+'*hkMQE\1 9)0)>ч&"ˌWb),3.Td? f[W.XڄSٖݶSؓJXA>uUofbfd}"'}˲NCbN7u~\z]gGy6+û{Y߰f'*tie@&}Kr /TE);?`E5 {d WIw_f+1?۾EB *ݡ/\X4 >6 UuFMlM+( ]C-vY0Ta .dK`]:w#Mؖ'[o;ў3C`bvq6J:'8RNxY[V v-g=`9nX )%j PsS=,yNԌUO0RQ2\3'RLBC[oRELLPjxf$g*VZCшT&hV#\:TP~~?"=*9N$RX,s#Z`iR6 OXuK^Uf:v4ͫǛ5&& I>œM*y{4WHz&|vHw]7|"!iB}҇XNw8ʙt֧_ϩԽb/|kh; :kP^-n& E,A~r௱vg85C/ƚ>x0xRC\r}zFJY Fs;sԹAn3!CheZ#36kAAf txO޹Xti`w<(Ffٱ5V#\[WIr^`jqc ⸄6fJeOd2NҒ6NktWB,L]uCsB˓mMYPv'qg^,te@ e+T:HRiFbL,98g( ]^Ug~%<8sk;j}ԏnF(Ʒ=n 3&' 0fkovQn>ƫh"=&f%ɠV}Au h)-8qMv0rj9]&SKdFks˘n{ń?&5ȋeyq-bUi=>kRz.m8*Vyms ռxȭn)~ѽ?emőRKzX3y+U-5_)$E&aY>Y^4ƝWǥҟw`*n6fE!:!Ba` C X'נ;V/y}!WlaꪍBKxUu ;Qgh~P;MO_L]#(P.ozpVV4CJ%Ա,бH]?5~-;nc;)iGʉ |`1ppD'uӉǗq@@q}ۡ81ŷas0C_slqG×B[jNpkŽGw3rMj!%GRLӺ&m/`'dNJJS56P95l4~++&qs霓Tob7Q]W5(_|#d=YHAn-d@zΞ 5X VΒ}(bzLLjNSCZt8P<'W'TN(*XEܨsme#1yT lv|ɡf8˗#JlB-rHOp/Zh0T'=c2gDR1UL E7M}] 8ڷ MM5a!ĚC{=ϲ&l£6+ghGy2Zۣ\b<@5@J5Aå ߻ &kkZcOjU)htY! 1\0sZKBuUar a:_BI(*YyXW/:jˌM'[xEendstream endobj 328 0 obj 8640 endobj 332 0 obj <> stream x]I }{rva[D+bž\G$%k&WiO(jի˗.I\O^<|pEO?0y6='Ex'p\i]/^&.~K$rx9OvW#Ex)fY_1I㥘Y\S*9U>Cw>^jpwkڔ{oo RїeQz)d=x-ZSȸr\&mfcO~ E 3?O+մɕnY9L~Mb?q/&?QNk9s丘iv>>:5mC?jkƭW;Z>-O,r6]sg~ucc_tNtΟ$_?l.ib$W]>,R'] ?s4 6p*N}SO}e>vJa I:3:,p'tS 9?Z=Q7΋GΓ$MzgGUh-~i~K2TBhQtGV:- mE#WO  ]Xˮ'cFrMīzU}?')0(AKGͬ;r87\;/Y C%#^ŅaTP:ko+ѧGCRP%0BMJEHKK!D$ VxS`8ϊnE*Xj+M>b ‰*E/u_Xf;F%9I ZS %dӫeW~FtQ 70+"z_n2‡4^2G>x|՚_T/fFǒMgt{,F:'jE{S* [`jm0E5'h>wE(B4^ &M2Fpdƣت}SG`g۟k\+j?3L1,SfǤY&!s Ux{٤`Py10OS y(@ k⬽}9B˪!PK<_I*_Q)xCװ.U[F ,k o¡A;)٨oJov+ ev$\h9OT&4)F>ȫFcUNвB@KXW-mO*Vi@x05UG%n@-wcL$Ѥ"(qq,.UJ^w+A6K=;WVcbLB-Эk]_~.v6:jA`WZ+aEKl'<Ǝ8̌0wF9{mWL(|vvƽs`z)ȳ]Zg Q]G "Qd0q.،`iiCw^g W(#&^SG-do Ҙ pzOU$b-9XQVhV?V Qro6Q.JQ~?sl2#^qz+tLoa -mZkm,Qx7pF6;HC&VQ> ^Afiymͣ֜\Q^<]>}m7`f8,7y3g֦!ob]Q&=F s !^~4?_q ʚIZgMjPb0(39I+QD0x6g1dm'1Go($~ta|ZGy'^2ܘsNRqtbDIgÂ'aR#adD]1Z d+D*6P5;xV͢>İ"%:n Vb`{O1Azh#hgvdbc% DW#d80o5PJq³3ixLA=SP1cBYfhjfvmWlTiJ`.Q0rK`SXY7yyLɑ$4s}+Mݎ!{ʮ=q63Sႍ)kKV]F%@$! Vs+>Duqu,!=&r~;oYF`<,6a v|ka:Y?tQ:IAͦD0QV8 CKZH%f] b(潳crh{aڕ6p!*6CT8dc\Y¢4;]Nq©si0uqZy +!~);E k\4񇦲SvTċY-y,o`ӛAfM6!OQL%Mrh+DkqJFeuFy=ބC:\`RycUhb5 %7-p^NNIE)zʺ zOm)RMؤzew@*@7߉3q1$A7uZH<:';M+Si)$xJYG׀_uϥ6<8oc SYq5fTogb_{3L\d-lQP &O$H,KU"xr#I!>] kᑵp a:IHi1k.fsY`mS($i8IIe=dѬis-~>+-^b $r~;42g  Kɑ"̃ ʓ`v;Rly5+`elA2:q=9nv1Qv,/Q mL]Zѣ'FBLy{6IS x<2:O4+QD>UC 8"rhAkO.6a]i9›0Bf@DF3|4ɦhyC2EC91?T{jO  Y3h,Y3#IpĄ\YAT8b0 #E6τJ`ÎA.];ix(y`kvY> 4Ftd_ "h w@B"Ʌ ]w|߇GoC9zT|耒ʆuW"Goد|y \ &5*~p]/Z8+b O{u^i g‰WӜ_$nt.m|OxBl/bgd+;L&?s@RBmokwdMiD3iaL@Jl󒋂wDO!RuUc#T"'-IΏ;1Zp*;AՐBN? }-#j͇@%$:Ѕ)0>G#=6 -:gG0>Xq1|̐Po;w;kul^7 KS'& q0'BsrɌEɡbF; 9r6# $P࿮QJbv=pv`EzqS.h <l!**߱LF Q! "ZQ'FjdOZaثµCqw.ACS3ߩ~bd)]XXbem7""[5U:,T k fýL Qf\;(M ts uTjw0@q=ka|`iHƦ!v88]꺎}p==zl ' {GXf0 yJ .eakPθEV ,YEfڇB%4nd?s-ϮA忍 <3[gqiWWe) 4@\ok+:s% =PSXZ)ipgXÌ#F1fB,be^q* (@gf! HH9 |$'B%UCn? ; lP%mJa@5D:eEI댨vHn*W+4l :z\8M$a?abޚwa<AYJ RNԅn2aMEeRh_d>ljeI*_(ޟdfQ:6 ӷir4-Ef.foܰJ.[nԾ0EBˣ_5'>͗7(0;F%9W.h@kݩAr}qTUFA691ȭֽoˢsICO(E&΁:< w't*-8^AX2#!]6kK-=J[fDeMcfOv`̿$ВԅmJq.Cט\C&)CEH-OU{Hcl5fJ۴|rT.~J-=KjKDdRxJֆ̹rGb0Gt8k%b\=a#J`H@̎|"ёVҭDqPГgrˎڱM Cr6;Q?RC5jĈZ^ }½D&x+"X. ›=N´POڟ;[uS tK>Ga[ P"✄ZܘMkO D5%dVGO)5y†6O)=5e;sl9Ⱥ{2ϳ!+5=}V :AC P3?ϖȐJgĆrmJh1!#!$/h[g/LEpMh憛~\XaςReB/PA%;e!l$~s,4wz=6{!V̌-Fp-l=5N b?=FOR LjRѩ=4n̍g}<D\nݭ.K>fX_R^7@͇@j_tM)ΖGWvpţRn8l$(sk'Ag:yw#${VD^%Bw:Ubg(a1e'!=i4;ۑW!.t=괃8yR>}$kxsj +l? \ѶDzcm ucSlBٞ} S /S7eJS m˜i=*9H>R%m>jo0\y~ـ=m9gO( yRNl rl`}м. Jg*7?wf|ŇÑ4#1|V Ĕuoz;%Խ|`;E ,:>́+AOM,'?%eendstream endobj 333 0 obj 7792 endobj 337 0 obj <> stream x][qr嗜ҎAɖeˎb'1.Җ(!A3svg})J[̙o_7x5OjϿ~0Wy2_0U~]dg}y;iiʟq1Orezߟ8_Kk&y2hv5wk~rMVY~7q͔88_Ika\I-3tr^y15ro Rѧob6Q0s| ϫq,&gmWnƙ.\K^ʸkugdſ?go޺kgTYmOlӿs88tRYOL^q6ݬ'怼)pɭUOۓM2nwOt[]&/FC7 pohSy:|Zn4~/^ڿ.l v2=l d JX+gUp Zho瞱 n'S >kwgWqZԿrY`Lӯy%OR?,ݞ\Omqsf&4%}qv%aXR~JeŽqʦ-7dGz1?R:hW׌~ 0D|Ͳ5jB ƥ@ܕ ^2rʚuNBnb 6ݖK`~aE%?\j? #0[sj.l_Kߜ5@ыJ ouDӳ@ߕODAm|UUST4/iiL GTihiDxqWR߽kAi4A+x{6ׁ@P7ܺ_11T ^8 P0#OBo~TX5ڙt$ &[j 3,`b%<^VtWp/314([#ހ-7K/tqY[t|%kËҰ;E$rEx]k02jzM)qEu8ԀY_ZE8(3Dz$|Ydt[6fTp=Η5 6Kڕ.*Cto= ۚ7h*kJmomZƕ w5YxQ"9|Xt"7htF]1B#̿!p#Z.}ތ/jڂ$q>P_6wZ4^>x'm*Z!a|ЭD32 * &v۔Cv%_:EBCC *Pߟ %VoەpNup%EU^,#Մu6vjY:BĊppsI7}ꢠ$gVVb9 I*n{ijVhJѠZFPxxeߕY{/tkVpiI.E7Yq~?Pn_x^}2Njd!_̰$[HPggdॿW7bW֭ ?tҏ4F0A[b*ҡ} &`cm^WLrR@(6qK<(QÀCn$)jCDOBCq0-gX9~h0]U6ʧh?D|Le(7\m]c|vr @F>ЁR `vO-jKbiY,ERbOr> Վnyyǧ0za,k  9kn q0zM`"a,"%iJ?X_g=, 20{%xI~Z=b;%Xҝ d汋TH3U{DL" FpF Ma%5-ECBP5poJ~PX@l!~̺|,qЭHFG{i@ER]8dx,,fWW?5X6+k?HV\p]& h%7Hgy׺ 4fl4_/ʭ/D D!Y(-cHq ʿ3$57[ؔhx̺/]5H"g vzoNrǔ*3^F(fӰKzS!7Swa2 3zXYhĦ袟qݛXL6t&$L.2D%į^en ZӔ5l`'.$^Iq b IcLH@]-贻B4> tAoqa3G*-md o1 CX{ynҮ6T\WWqⴙ*N}C\t m?>Rc} _ꍲA`C|^X"VE%#j8ʪ\S]>QdŎM7= PQ|#(uRAA$&,YL=~KַDŇzeWo,ïe6S+c%!idJzhqbg2Nc]w@S@#B>Gy$Fdnye.CJ|ӷG&P㸷(Q`i2.<5o1k<齮 4R\s&鐁33^ q,^ҐqW._ l'F{/5g;edbx](%81ېJ1BK&;t|-TN&5Z.VR.0BXbd&Ų3"X&3Kr3҂W-Zô8hܒPZK5#c9ҸGsVWq#P0Q崴DQ2 H. ԕf7V) /ʧ[wqGh>pS?X/OEwS Z뢏JY(B]l|U+v;l6]vSq(\@"DIWFעr;C3)i]S@6ѩ3; [ݟi B?+S[D4p mݰ-[#9V#g!t@Ja"9o u1XvCUb b3R]K%<ޚ>{0$f. Z)Ԯ;wM+Ajᅤa !9^$T 0I{:Gu-!( 7ʼyFHw-4c7k\ ՞K2AJѵh3M<>_$/1zőh9lYt%#] :@RT`eM8;:t6;&e*xmJyصOhJ. }Q_ c8ccM}5IQ&iZǎV&4_ 4Rܨ+ӏѵm~F|].,9—\ŝgoZtRSԝDQ:4ʶ0[/«+ a]Z`*rUՉqrm,ATmO@!]u22¸BQ99 S7o3uгȬ1ӾJ86"Cm:Kp}?̦/Q#u0gS t12?i6U#d|cNy!ߠ~2Mgz.y+ ? ܍Ғc(zEt OLX_[&Bad4MMĨY~`7E-4O¨oʥÉJ&&W#@"SȜ(ulڔ9b;H:ޒBY9RUY[62-h::)a^{=!KP91Hiu t wu([ǻr4X)>9+jZ4m"8EƑ}>a \*jA,>pZ/ro0=̤l:4*6>Z4XX }! Obn9&!.뱰+72V!# |rC?@ؐ Wѫ2^:}3w*֪Ht+ƴlEcY4чDC#'yLcFČ1FMֲ}m@ÏCD3EJh03MH{X}(`jzdI4rh'{4+Pa/oV̀ YHM,խE֋ܤ棖TVYԡ| OjB d~-rۙUi6nG$)oP7mC['W=vbh9}\L’Rv실EWFca!R=N" %oPo֥+# 8\Zw$hSwaߜ3dĶpbrRstj|]WOO:ICX,DFN9$:=j?2O~ oru#w/ }?ϗ. x!g04oDyvxzQRh7 Êv'F5emV@,D]^h=R:xWZs iPHImH2l<okU%vcND:ND_zt(ћzrbGl_TJ,Qڰ 䲨ËPöq 82?İT T6K\wڶ*wa^"n ݩ!Qq%XB1ˎ, IðBq˧2%[!M'pDUg.y\}K)VKQ$c!1Gl imrcH66?1UwPcQ:cQZ Vmd$i dFYu\-}w[vKSz@m~5)n6P&ik!7zjv$d#J͔Owjݶ24buZh#DO ;*@N;JpCtYZyBҁRC{R"rD4y)jQJ_ ff$2b2әHL]Nc-zoT *t$CV5}ܣ])N=?b\zAmC 8NkG|ZAe`p( M[.%+]qejȡ]<[ "Q:Ri9'Q?HKoW$Pѻa,&h)f'mT$KFzGJlV,4DߐZ\hZ c4yVyZq{GW K3ʼH.rj Ch!йH{GmET(5nP"<%9*bHDVlRo#[\W(rg+m$+#\%lݟY6ktO<*5)ط6G$n.4\͢YMi@"HHmI‰ hBât2]kf:RV=_N,aG sSXFp̶:X|gV+=vK(299z;iDG9޼KYa7zwj܌sCfDsK,J`^ڕn-a;J]NRGDHM`{2KwBgϠx@"|;Ĕ>U.d]Z(HSQ 'aؘ:hfvR:?5ώf!hݤ xv<0A/3a5g8BN#j,qA %9r ڒFk#Un*c rDbݐhH(xvi[;3Öpz">!f__ƈ4.wU혊4rPme+ ˏMN~ǻ]pߘO<2Cl PP BLfGRcN4_9(-Kx\x&RmV%4MN7xBzJȾM3WDsc!jbLfAV ,S (%>t{]D:ȓ<=;4_>f`%\dĘ_}s?wla|jJ;skY)Bsc]C{m.4.&װg|%/'نjI< CEpL48Ԝ8cNJkdA'\̿2CXҳyq}.SL$ĒBY;:/q-M'v)a9Gg)_Y.J9y#=htZyХJFr udETfGt^etUQi=)dԼ Ŧ-^<OGD>Bg=ɲ*H<4J0cJA[KuYmhrec:* rGHf! b\'aGB.]WV8`Kt 6C iэ\ [經@L!Yga fy"r fŰ|9*$%5t׸XϜMF=-~umQH* "ګt%yN}>n=]xR[gQT'iN6=ED8hʯW([7Ö˲ْuaUHQZRx%hbT]m99REyEڿ6-pW# Tc3EI:y(? )\ʺ ,4$!N0˅r c%ۦfq}QLi3 -G>O# *PB4[|܁HӲt,d# K5c1!ީ>ӞjL],+IIL7\ 4kH*> stream x]ےG~ń_{CS* )[^^Sc;6}qx 3%Jo& P8^|hţpUonpajn?ZYElj'U&պlە3jͣﯵwjuݬ'v_Xm=Z]#?`ķ+%!0R/[\-x9[/JݯF.20zU5?'NHDo0{ -xX \ѻ/qjv&M4Jv ;0j{q XFy&3O\=P_u7a6:?I__L+VLlÌ|?ct-WhÌg[mWWզ^F- FoV{=zx'i / ha\q#5 hMq0vMoސ&{aHt~ fYӻb[ t[nN+64NE{] L Txgňl.c6XPWյ[\@kڌ`뚸V'ҀJ/*@ x^Ta MSo5`Mtb2^R^q0$ ̂*Zpa*f5+m!m7XFy܂iv\.mF*[Z&]gyZ$@}~>Y۷=c 3RozGJ,jd\@Mh4}Q8mks'Dn=Z2skJ_}o Rq) CYZ<26h '7xt x5~$pDqmX,7XCkn~UxjwT :OJ✄{fS+%Ҫ[U1?[0J xItSWO=Uz3 /+<'--?S/թL8)AxclY}H)cT>gi  0Os!* cb3;;HzL[?[ǜ>?FZ"8FpƱ8)AC.)ᆰ$8E:U7{%M69[vB6 C#Uu^1w. @F]r.䬈;T3ScL[] X1,8y~Y.y[IC]嗒N:TCmGYR MNēa(zEl Cq-,ц afbFZ6P8Ϡ 9dd&@ (LT==S4bU,`!<)i=Sݤ5-eoCjſ&Y/V7(N.B:B- ~(8Eq{[T)W?G%P{*&.g.b9KxaAһlb]|?.ab)W\z,^xqe\9"Wy6 BI/M :b%)of} XSv 6( 90Y$NF*sk5u=$rF?HS qW='2/FT:Mb.&u $xG_VN*y@%ziJZ! 7G$+bTxk2I*UWu!SaidL)H;RT]׫8Z~,FpْLރr3#R93jN0FEC)o]*ho2Az#%DZ``lj8#M/l@I03SEA= 'P:Z$u[I?$PVaSQ #}]6ܦb-tA]:ƒm=5|xd{f_SCЛb:x(A6Odﲽf), U~'TiJ" tߒdz(vn dc6K_+/D]'$'i1ͤJ` v !Iĭ= ^)'cU);IX90 ڭ @,TD)d#vqMV>pQGȀSK\M^bM4 &şC7xտ]ýd[LL:V98ƂX{4_H;ey ܗn@<~<îƽ<  HlD~ {*€Eeyn3pYxN'b`>k^!ii X snDa0FElϩ6 5'hڛlYm/"!GlDRxQݾ}cK/꽷7l'@,B[$Z3LQi< T>$Yݫ=h=2gkkB'gXGD(J:cmƅ lpֻ'yI]Lȿ?KVCGRY:\ Esxل"Os2T~,4VkBdoDZ1n"Tl3"NX*)pt_[Z< ̛04Af%p* n0pc+H@Xs61C&LA~rz펄;Qge:{m[`vp]kS@@.` 5{ӷyHPevK^O~ot>B`4iH06ҩ0_)hr7Z3 Hf{A {" t7vAڮx,% yŠ&a_!`l4BQwbm q+(aVlfzo.xa- є&Vդk l@1SX̹<8GW~whؠY}$v(?&vp>+HqOl]l| 3Q-qOKrU>Y4Gz r5V0E2/YJn5^ @؂Z]D8LɽA M }8~.ŧ mzAǕxZ_0n9 y%Riqo٠%x%sD`;okOO⊪e _4}"/ Qɦ/I`Z\!lVS M4E:z|?eh KPjccOMde (]Hlʓ=A)uBX4L^`-umL%A=ғ0%dXj@ ?]Iz_pD>mU[x>lQֶ>֝TjAU:RUDb٦)23 Y&-sc(:+@<$&+b+݊YC'\n.1XTIp7h%BNs&hotX}vuvXcwTĨ?"NK(U&R] fRԤX 3xNӹX'lZu3&Nbtf\:GC*8sGY L8^F"i+=%L"E,C>ϡ jlta"F^K;cHEWJtasCfwI~sհ[@Xߒ\ MDIi+"$sTSEF&+mQJ:K8B')kՖBnbA“!{t\r[xgu'EG`7NҹF;Z-rC?8x|g[>Պ[{\ x$;f26;z)epveU15hJ0jalynͣ?WI endstream endobj 343 0 obj 5674 endobj 347 0 obj <> stream xYMo7zԯnQ6-Zh۪\n~qwVrab%g޼y3WRJ~P>ld67P v4k_/yMl+o?7[)wF -q47ʉ6z[lpF*!VQDڽ~[Ksw:[mZK1CcR!sZwCeL hZ޵d m^ꔦziB maٻl aM87d"XTN dpnDZ]n47j'5Z@5R8R-x$X:m<4x>fC>U~ 'x90E;~/pC>% 10?~tIbݬ2zV)S?k9\SqWnb) ;ֈ]ZU!jlX)-M&[|K`Zfkֿ7JIatgG[uFF~Ao@fBPhSe9l/;ƺ)J,[!XN0+$]FO#,YW!^*UYaXx`{Z֎U]wld:hݞ\d!P j .U&'J,f-i^5f*lmT%1wK%Rh]GS 80ȩ8><KG4kD{v 3R`R>5*P+{f2IYz~@˜[z{0ܳݵ[]OoG {xE5iE@ɞY$%ӡkypo'^vm s.v3-Ytu9-cBޖr:S%YTC]syJ_@NV[:j)3,# WӮwZiH@]tjkZ8~ˇ*4,.p S~-XvY\ i'\(lq"Mݳa[kq<TY؝n OӎMMp e~!7E-Lvdօ6QO]1n}MXendstream endobj 348 0 obj 1667 endobj 4 0 obj <
    > /Contents 5 0 R >> endobj 12 0 obj <
    > /Contents 13 0 R >> endobj 19 0 obj <> /Contents 20 0 R >> endobj 26 0 obj <> /Contents 27 0 R >> endobj 31 0 obj <> /Contents 32 0 R >> endobj 36 0 obj <> /Contents 37 0 R >> endobj 43 0 obj <> /Contents 44 0 R >> endobj 51 0 obj <> /Contents 52 0 R >> endobj 56 0 obj <> /Contents 57 0 R >> endobj 61 0 obj <> /Contents 62 0 R >> endobj 66 0 obj <> /Contents 67 0 R >> endobj 72 0 obj <> /Contents 73 0 R >> endobj 77 0 obj <> /Contents 78 0 R >> endobj 82 0 obj <> /Contents 83 0 R >> endobj 87 0 obj <> /Contents 88 0 R >> endobj 93 0 obj <> /Contents 94 0 R >> endobj 98 0 obj <> /Contents 99 0 R >> endobj 103 0 obj <> /Contents 104 0 R >> endobj 108 0 obj <> /Contents 109 0 R >> endobj 113 0 obj <> /Contents 114 0 R >> endobj 118 0 obj <> /Contents 119 0 R >> endobj 123 0 obj <> /Contents 124 0 R >> endobj 129 0 obj <> /Contents 130 0 R >> endobj 134 0 obj <> /Contents 135 0 R >> endobj 139 0 obj <> /Contents 140 0 R >> endobj 144 0 obj <> /Contents 145 0 R >> endobj 153 0 obj <> /Contents 154 0 R >> endobj 160 0 obj <> /Contents 161 0 R >> endobj 166 0 obj <> /Contents 167 0 R >> endobj 171 0 obj <> /Contents 172 0 R >> endobj 176 0 obj <> /Contents 177 0 R >> endobj 181 0 obj <> /Contents 182 0 R >> endobj 186 0 obj <> /Contents 187 0 R >> endobj 191 0 obj <> /Contents 192 0 R >> endobj 196 0 obj <> /Contents 197 0 R >> endobj 201 0 obj <> /Contents 202 0 R >> endobj 206 0 obj <> /Contents 207 0 R >> endobj 211 0 obj <> /Contents 212 0 R >> endobj 216 0 obj <> /Contents 217 0 R >> endobj 221 0 obj <> /Contents 222 0 R >> endobj 226 0 obj <> /Contents 227 0 R >> endobj 231 0 obj <> /Contents 232 0 R >> endobj 236 0 obj <> /Contents 237 0 R >> endobj 241 0 obj <> /Contents 242 0 R >> endobj 246 0 obj <> /Contents 247 0 R >> endobj 251 0 obj <> /Contents 252 0 R >> endobj 256 0 obj <> /Contents 257 0 R >> endobj 261 0 obj <> /Contents 262 0 R >> endobj 266 0 obj <> /Contents 267 0 R >> endobj 271 0 obj <> /Contents 272 0 R >> endobj 276 0 obj <> /Contents 277 0 R >> endobj 281 0 obj <> /Contents 282 0 R >> endobj 286 0 obj <> /Contents 287 0 R >> endobj 291 0 obj <> /Contents 292 0 R >> endobj 296 0 obj <> /Contents 297 0 R >> endobj 301 0 obj <> /Contents 302 0 R >> endobj 306 0 obj <> /Contents 307 0 R >> endobj 311 0 obj <> /Contents 312 0 R >> endobj 316 0 obj <> /Contents 317 0 R >> endobj 321 0 obj <> /Contents 322 0 R >> endobj 326 0 obj <> /Contents 327 0 R >> endobj 331 0 obj <> /Contents 332 0 R >> endobj 336 0 obj <> /Contents 337 0 R >> endobj 341 0 obj <> /Contents 342 0 R >> endobj 346 0 obj <> /Contents 347 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R 12 0 R 19 0 R 26 0 R 31 0 R 36 0 R 43 0 R 51 0 R 56 0 R 61 0 R 66 0 R 72 0 R 77 0 R 82 0 R 87 0 R 93 0 R 98 0 R 103 0 R 108 0 R 113 0 R 118 0 R 123 0 R 129 0 R 134 0 R 139 0 R 144 0 R 153 0 R 160 0 R 166 0 R 171 0 R 176 0 R 181 0 R 186 0 R 191 0 R 196 0 R 201 0 R 206 0 R 211 0 R 216 0 R 221 0 R 226 0 R 231 0 R 236 0 R 241 0 R 246 0 R 251 0 R 256 0 R 261 0 R 266 0 R 271 0 R 276 0 R 281 0 R 286 0 R 291 0 R 296 0 R 301 0 R 306 0 R 311 0 R 316 0 R 321 0 R 326 0 R 331 0 R 336 0 R 341 0 R 346 0 R ] /Count 65 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 10 0 obj <> endobj 11 0 obj <> endobj 17 0 obj <> endobj 18 0 obj <> endobj 24 0 obj <> endobj 25 0 obj <> endobj 29 0 obj <> endobj 30 0 obj <> endobj 34 0 obj <> endobj 35 0 obj <> endobj 41 0 obj <> endobj 42 0 obj <> endobj 49 0 obj <> endobj 50 0 obj <> endobj 54 0 obj <> endobj 55 0 obj <> endobj 59 0 obj <> endobj 60 0 obj <> endobj 64 0 obj <> endobj 65 0 obj <> endobj 70 0 obj <> endobj 71 0 obj <> endobj 75 0 obj <> endobj 76 0 obj <> endobj 80 0 obj <> endobj 81 0 obj <> endobj 85 0 obj <> endobj 86 0 obj <> endobj 91 0 obj <> endobj 92 0 obj <> endobj 96 0 obj <> endobj 97 0 obj <> endobj 101 0 obj <> endobj 102 0 obj <> endobj 106 0 obj <> endobj 107 0 obj <> endobj 111 0 obj <> endobj 112 0 obj <> endobj 116 0 obj <> endobj 117 0 obj <> endobj 121 0 obj <> endobj 122 0 obj <> endobj 127 0 obj <> endobj 128 0 obj <> endobj 132 0 obj <> endobj 133 0 obj <> endobj 137 0 obj <> endobj 138 0 obj <> endobj 142 0 obj <> endobj 143 0 obj <> endobj 151 0 obj <> endobj 152 0 obj <> endobj 158 0 obj <> endobj 159 0 obj <> endobj 164 0 obj <> endobj 165 0 obj <> endobj 169 0 obj <> endobj 170 0 obj <> endobj 174 0 obj <> endobj 175 0 obj <> endobj 179 0 obj <> endobj 180 0 obj <> endobj 184 0 obj <> endobj 185 0 obj <> endobj 189 0 obj <> endobj 190 0 obj <> endobj 194 0 obj <> endobj 195 0 obj <> endobj 199 0 obj <> endobj 200 0 obj <> endobj 204 0 obj <> endobj 205 0 obj <> endobj 209 0 obj <> endobj 210 0 obj <> endobj 214 0 obj <> endobj 215 0 obj <> endobj 219 0 obj <> endobj 220 0 obj <> endobj 224 0 obj <> endobj 225 0 obj <> endobj 229 0 obj <> endobj 230 0 obj <> endobj 234 0 obj <> endobj 235 0 obj <> endobj 239 0 obj <> endobj 240 0 obj <> endobj 244 0 obj <> endobj 245 0 obj <> endobj 249 0 obj <> endobj 250 0 obj <> endobj 254 0 obj <> endobj 255 0 obj <> endobj 259 0 obj <> endobj 260 0 obj <> endobj 264 0 obj <> endobj 265 0 obj <> endobj 269 0 obj <> endobj 270 0 obj <> endobj 274 0 obj <> endobj 275 0 obj <> endobj 279 0 obj <> endobj 280 0 obj <> endobj 284 0 obj <> endobj 285 0 obj <> endobj 289 0 obj <> endobj 290 0 obj <> endobj 294 0 obj <> endobj 295 0 obj <> endobj 299 0 obj <> endobj 300 0 obj <> endobj 304 0 obj <> endobj 305 0 obj <> endobj 309 0 obj <> endobj 310 0 obj <> endobj 314 0 obj <> endobj 315 0 obj <> endobj 319 0 obj <> endobj 320 0 obj <> endobj 324 0 obj <> endobj 325 0 obj <> endobj 329 0 obj <> endobj 330 0 obj <> endobj 334 0 obj <> endobj 335 0 obj <> endobj 339 0 obj <> endobj 340 0 obj <> endobj 344 0 obj <> endobj 345 0 obj <> endobj 349 0 obj <> endobj 350 0 obj <> endobj 126 0 obj <> endobj 40 0 obj <> endobj 356 0 obj <> endobj 156 0 obj <> endobj 48 0 obj <> endobj 90 0 obj <> endobj 39 0 obj <> endobj 147 0 obj <> endobj 22 0 obj <> endobj 357 0 obj <> endobj 163 0 obj <> endobj 23 0 obj <> endobj 46 0 obj <> endobj 358 0 obj <> endobj 359 0 obj <>stream x] @|09^vagG;jcԓ U򔀶IMX]vRg4Fz!dod_+$jIAH֭̀l[R#3IǤlMz@di~ƈ~;3hwMaT =f endstream endobj 15 0 obj <> endobj 360 0 obj <> endobj 69 0 obj <> endobj 8 0 obj <> endobj 361 0 obj <> endobj 362 0 obj <>stream x]=0 "7"U^ 24v$n"}엤i/5L~O%{kY.{Ճr"iʽ>e@ZLEդ'4ze(4U"UUtxV4X%"WK1~ԋhg͡bc/nt%e endstream endobj 149 0 obj <> endobj 363 0 obj <> endobj 9 0 obj <> endobj 364 0 obj <> endobj 157 0 obj <> endobj 351 0 obj <>stream xcd`ab`ddd/*N+6415~H3a!s< <<, t }=PҾ9(3=DA#YS!$19_#?5<$HGBO1'GX(8,5Ebs~^YjQqf~BZQ~BnBr)PX!R7$1-?l0 SĢ̼ F&Xu?Yּ2:h˻?hZYrWWGUUFdRDHBbVtqF7mStӮs{_>z`ɵۻt[5aBmwuwysIea}UuUY}s[K{s'GѤݩY91qaifEMN=}}=ݽ==3'HMnٷU>޽4'*7N.[.%x_>yY-feomm쮙m1Xć]Ǘpjae>}'NWgb7Br\,y8e`e endstream endobj 148 0 obj <> endobj 352 0 obj <>stream xUOHqݜ?m%PsYB&((F5+`-%u2g21勯h^tKPg AB:Οhosx>>sr/׏RIwp5PR(ǖ2pxwH*pgGE:QPS J]]R`o'>9@ng{#rXp!uv#!FN!Nb1 Y]FJv:aVJ|p+x [ЎeR0 u&$F1ULyXWd"s7wj}wsy~L>yޥbCЁ)ߴĞ/`,/lEN[W ª*C endstream endobj 47 0 obj <> endobj 353 0 obj <>stream xcd`ab`dddw441UH3a!G&nn}n]_'9(3=DAYS\17(391O7$#57QOL-SpQ(VJ-N-*KMX휟[PZZZlme tb@ |E3]+wυ{DmJ*//_f)Sz{zz9zzj3;;8Z&OvwN9A_~er@tE⼼⼼+V,^BG3!g=Ӛ4tv~ϷKaJӴ}L+]~eӦ`8}en9.> endobj 354 0 obj <>stream xRk[U?'vivS acӱ2[6k216575ki=ݛfK^*c{ :2Dr8p{F&1e:3}p ֟5c -{'!O ȌY4Qþٹ D@ ? O('D'~tBO XƷ !Ofpp6,xJhwN|~v {#ڃL=<6>P}(W1hLh9ѷ>~M#&㨞4O3_/c/}o[4L,K8GVlWΑh۶UTøecƇ* XU*%2YXg-9%A,% lpQW> endobj 355 0 obj <>stream xumlSUik[Y[R1^&S0 a˜,*Acmw]㶎Nm} ݳcm3@bDSI_\\dŐ0h3M.%,kՅhAP6Axxbũ/hOkZR롷:zC#?.?{ݮYb*64ԋ{$-ڝr唹yZݒ&#|Q'yߕeX<]=6u#ɝR,,DDjXJj ,.W+uLsso !wQ_n#/׈ [2OhFըBu1;Ǫ3aAL k9rjǥ1'hq"2s03Y auq>;x?\ d|Mpv%\*t,oʼnE`لܠA*d)*Y5*FcF2v pITûXq%Ě3;^!Ѐ$>>ᾀUd6`>`UY3n`Wρ>yex36`cp]?OF@t0>hݟ'76x!T}b#{ @EUFL3hyӎWsCUƄct(m,1,ufv]wLQ6"Fp8Zp,b(jDf2Y ,%Kc-vR$")`/)ΰ7óґS @ Ap >U:n24X1{]QA:DќCMxwWn*U.ɲ@eߛ-LnUaZ{ OO $/K endstream endobj 2 0 obj <>endobj xref 0 365 0000000000 65535 f 0000417495 00000 n 0000431961 00000 n 0000416939 00000 n 0000406121 00000 n 0000000015 00000 n 0000000499 00000 n 0000417543 00000 n 0000425665 00000 n 0000426643 00000 n 0000417584 00000 n 0000417614 00000 n 0000406281 00000 n 0000000518 00000 n 0000001825 00000 n 0000425132 00000 n 0000429321 00000 n 0000417653 00000 n 0000417683 00000 n 0000406443 00000 n 0000001846 00000 n 0000004950 00000 n 0000424303 00000 n 0000424523 00000 n 0000417724 00000 n 0000417754 00000 n 0000406605 00000 n 0000004971 00000 n 0000006531 00000 n 0000417815 00000 n 0000417845 00000 n 0000406767 00000 n 0000006552 00000 n 0000007511 00000 n 0000417884 00000 n 0000417914 00000 n 0000406929 00000 n 0000007531 00000 n 0000014984 00000 n 0000423968 00000 n 0000423533 00000 n 0000417953 00000 n 0000417983 00000 n 0000407091 00000 n 0000015005 00000 n 0000022088 00000 n 0000424600 00000 n 0000428626 00000 n 0000423828 00000 n 0000418055 00000 n 0000418085 00000 n 0000407253 00000 n 0000022109 00000 n 0000027468 00000 n 0000418168 00000 n 0000418198 00000 n 0000407415 00000 n 0000027489 00000 n 0000066612 00000 n 0000418259 00000 n 0000418289 00000 n 0000407577 00000 n 0000066634 00000 n 0000070695 00000 n 0000418339 00000 n 0000418369 00000 n 0000407739 00000 n 0000070716 00000 n 0000076488 00000 n 0000425603 00000 n 0000418441 00000 n 0000418471 00000 n 0000407901 00000 n 0000076509 00000 n 0000081369 00000 n 0000418554 00000 n 0000418584 00000 n 0000408071 00000 n 0000081390 00000 n 0000085653 00000 n 0000418645 00000 n 0000418675 00000 n 0000408233 00000 n 0000085674 00000 n 0000087722 00000 n 0000418747 00000 n 0000418777 00000 n 0000408395 00000 n 0000087743 00000 n 0000094136 00000 n 0000423900 00000 n 0000418849 00000 n 0000418879 00000 n 0000408557 00000 n 0000094157 00000 n 0000100386 00000 n 0000418973 00000 n 0000419003 00000 n 0000408719 00000 n 0000100407 00000 n 0000104244 00000 n 0000419086 00000 n 0000419117 00000 n 0000408883 00000 n 0000104266 00000 n 0000110645 00000 n 0000419168 00000 n 0000419199 00000 n 0000409057 00000 n 0000110667 00000 n 0000115384 00000 n 0000419272 00000 n 0000419303 00000 n 0000409223 00000 n 0000115406 00000 n 0000119788 00000 n 0000419398 00000 n 0000419429 00000 n 0000409389 00000 n 0000119810 00000 n 0000127179 00000 n 0000419502 00000 n 0000419533 00000 n 0000409555 00000 n 0000127201 00000 n 0000134135 00000 n 0000423461 00000 n 0000419617 00000 n 0000419648 00000 n 0000409729 00000 n 0000134157 00000 n 0000139141 00000 n 0000419745 00000 n 0000419776 00000 n 0000409895 00000 n 0000139163 00000 n 0000144955 00000 n 0000419849 00000 n 0000419880 00000 n 0000410069 00000 n 0000144977 00000 n 0000146559 00000 n 0000419942 00000 n 0000419973 00000 n 0000410243 00000 n 0000146581 00000 n 0000152505 00000 n 0000424031 00000 n 0000427688 00000 n 0000426081 00000 n 0000430584 00000 n 0000420004 00000 n 0000420035 00000 n 0000410417 00000 n 0000152527 00000 n 0000175628 00000 n 0000423671 00000 n 0000426858 00000 n 0000420134 00000 n 0000420165 00000 n 0000410583 00000 n 0000175651 00000 n 0000192186 00000 n 0000424457 00000 n 0000420299 00000 n 0000420330 00000 n 0000410757 00000 n 0000192209 00000 n 0000193794 00000 n 0000420440 00000 n 0000420471 00000 n 0000410923 00000 n 0000193816 00000 n 0000220611 00000 n 0000420502 00000 n 0000420533 00000 n 0000411089 00000 n 0000220634 00000 n 0000306150 00000 n 0000420630 00000 n 0000420661 00000 n 0000411255 00000 n 0000306173 00000 n 0000315700 00000 n 0000420692 00000 n 0000420723 00000 n 0000411429 00000 n 0000315722 00000 n 0000319177 00000 n 0000420820 00000 n 0000420851 00000 n 0000411603 00000 n 0000319199 00000 n 0000324470 00000 n 0000420941 00000 n 0000420972 00000 n 0000411777 00000 n 0000324492 00000 n 0000326480 00000 n 0000421023 00000 n 0000421054 00000 n 0000411951 00000 n 0000326502 00000 n 0000329808 00000 n 0000421085 00000 n 0000421116 00000 n 0000412117 00000 n 0000329830 00000 n 0000332966 00000 n 0000421202 00000 n 0000421233 00000 n 0000412283 00000 n 0000332988 00000 n 0000335087 00000 n 0000421319 00000 n 0000421350 00000 n 0000412457 00000 n 0000335109 00000 n 0000337188 00000 n 0000421416 00000 n 0000421447 00000 n 0000412623 00000 n 0000337210 00000 n 0000339214 00000 n 0000421509 00000 n 0000421540 00000 n 0000412789 00000 n 0000339236 00000 n 0000341300 00000 n 0000421606 00000 n 0000421637 00000 n 0000412955 00000 n 0000341322 00000 n 0000342345 00000 n 0000421688 00000 n 0000421719 00000 n 0000413121 00000 n 0000342366 00000 n 0000343863 00000 n 0000421761 00000 n 0000421792 00000 n 0000413287 00000 n 0000343885 00000 n 0000345344 00000 n 0000421834 00000 n 0000421865 00000 n 0000413453 00000 n 0000345366 00000 n 0000346343 00000 n 0000421907 00000 n 0000421938 00000 n 0000413619 00000 n 0000346364 00000 n 0000348784 00000 n 0000421980 00000 n 0000422011 00000 n 0000413785 00000 n 0000348806 00000 n 0000351416 00000 n 0000422053 00000 n 0000422084 00000 n 0000413951 00000 n 0000351438 00000 n 0000352546 00000 n 0000422126 00000 n 0000422157 00000 n 0000414117 00000 n 0000352568 00000 n 0000354144 00000 n 0000422199 00000 n 0000422230 00000 n 0000414283 00000 n 0000354166 00000 n 0000355238 00000 n 0000422272 00000 n 0000422303 00000 n 0000414449 00000 n 0000355259 00000 n 0000357748 00000 n 0000422345 00000 n 0000422376 00000 n 0000414615 00000 n 0000357770 00000 n 0000360022 00000 n 0000422418 00000 n 0000422449 00000 n 0000414781 00000 n 0000360044 00000 n 0000361438 00000 n 0000422491 00000 n 0000422522 00000 n 0000414947 00000 n 0000361460 00000 n 0000363409 00000 n 0000422564 00000 n 0000422595 00000 n 0000415113 00000 n 0000363431 00000 n 0000364914 00000 n 0000422637 00000 n 0000422668 00000 n 0000415279 00000 n 0000364936 00000 n 0000366586 00000 n 0000422710 00000 n 0000422741 00000 n 0000415445 00000 n 0000366608 00000 n 0000367757 00000 n 0000422783 00000 n 0000422814 00000 n 0000415611 00000 n 0000367779 00000 n 0000370678 00000 n 0000422856 00000 n 0000422887 00000 n 0000415777 00000 n 0000370700 00000 n 0000371133 00000 n 0000422929 00000 n 0000422960 00000 n 0000415943 00000 n 0000371154 00000 n 0000373593 00000 n 0000423002 00000 n 0000423033 00000 n 0000416109 00000 n 0000373615 00000 n 0000382329 00000 n 0000423084 00000 n 0000423115 00000 n 0000416275 00000 n 0000382351 00000 n 0000390217 00000 n 0000423155 00000 n 0000423186 00000 n 0000416441 00000 n 0000390239 00000 n 0000398566 00000 n 0000423237 00000 n 0000423268 00000 n 0000416607 00000 n 0000398588 00000 n 0000404336 00000 n 0000423319 00000 n 0000423350 00000 n 0000416773 00000 n 0000404358 00000 n 0000406099 00000 n 0000423390 00000 n 0000423421 00000 n 0000427068 00000 n 0000427956 00000 n 0000428855 00000 n 0000429608 00000 n 0000430968 00000 n 0000423616 00000 n 0000424388 00000 n 0000424757 00000 n 0000424861 00000 n 0000425410 00000 n 0000425751 00000 n 0000425817 00000 n 0000426379 00000 n 0000426726 00000 n trailer << /Size 365 /Root 1 0 R /Info 2 0 R /ID [] >> startxref 432088 %%EOF mumble-1.3.4/3rdparty/speex-src/doc/celp_decoder.odg0000664000175000017500000002501514010707304022170 0ustar builderbuilderPKUzS=YElvmx~/:>w!>ca:D߃ZTYe;5<4M^iPTƀ#򩩉E6Wc/^tSzE]7;9)\>: ,jOt@k0JZŽfbG.vCr?);yZ%U~RMrEL۲ 8+Zӄ:Z/.+q=irNCuE5-]]DM.C1dFYYfic5ۥ4y~%4?.^'6n]"ń/VT}!rQPr&Sp9wl‘zz{D$xQdF}P|07OlggVۛbT$Y bͮDus'(rlp{ęT6i HnvŤ eNP*Y4Ju,PѤ*||u gwʒ#X *0PpP#&(MRT6"r"d )!6ϐ:^SUmߓI| ۾n1A"$_냖lh?MJYWBg֐cP.mC7WgkB'ȇdrOpaCqzTZxJk ~UZ0%SZgZJ[ +˫t~m=b0VK,uI)J1/a3>qc}Y:NHN5Õ88S95 >'0<< :'do}Ş ^l )޸?R!$C2'm>Y4B\+kC,"J,Ș,Gu R(ղ ] VTfY X`Dȵ  3C v\Pm)#Y .];Fq€ϻ3Ltltˤ|e}~ͲX6bNJ1,WeT F1JLw H~{dgDUɾ؎_.)oh, z%SW÷;#xiخ0o!=*{*A4}^$a8d$S"ɴ4, Yhy: 3eM3 %DDiPkIoׅg$>7uДzʫsVV~SɁIܙ[ӕmvn:lcҖJaKsIqdN\1G}JI1 hUS3`s_{.Moztog*ӠL]6F|۱ ?>~s T>#io3.O)T*إlYޝd11> q| ~._$(!iߗyWD`_03wѝi>ޙcL50fbl9v3[ʶC?{?a"$K#jA/R9>/%(\0GhE8v&sgkz]$(N9>{oqؽ?g7`i&o}5_WNn6UQj,D;sP%Y!9f |qE{rNyHbEQEfswfF4%-lFBD(")Vj4GR8$"9E>E("3!2\9J ͪ؅]G`cΒ4q%!U(~Rg(1~KoD N0+*)>x&zx˱%m`(dryᗶ)!q@(ZՔJ"*ЦdP:[UTm$]S# cPE[UڦbX{R#J#KE<ogϡ T/Ɏ2m WG)Q@W8TimtJT05 N jpH4].}? (A+fpC#!} V(\(g@i Z'g[M#}+4iሿ %~RDp@԰ΣsCŸ"Yygͮtu>b~kCRJ.ܾS0;g$)#wk$+7$"'oτbM"4 B7byٛDbM$>< Bo3O F.vWssCͱCq/sTͱ(e;a8D{k!#q%ԉxT5AsN5Fj-fk-!UHtVnFJXlI<:9m(wӏ'[j|rƿPDUH- kptu1` tJj#g"t+p}1$P})i4VAM%r{dw h{I8 ~ "'XR^t"|s|k_SӇb6ت_ \w`u]JD6[mIn:/Lj_]ۉyl-ֱz5-ֱ:X"4XuX= ZKJ+lP)Lr_æ[6j lx8G&NW.7|9Y~S3jArUZrXWuXW_ Bc]=c]=c]}ujKǕxNDRT Dg:+-F 4g^ahѫ^Nl0Y:!"ckīޙzrWZWj'4B>x](^zVI(a`4 1[xNyk:r"vWϝ̗Nґ2R`C(/iGd.Qp'rيf:]onm!RBՉHJgӀG`moXBI< 5l) +aAzdv뻏,! rt+c88-`x>t,ġدVz^/Vu1f!k1(9%}h0Vp0[Vv vO?PKj~HPK OpenOffice.org/1.9.129$Linux OpenOffice.org_project/680$Build-88252005-11-25T09:23:412005-11-25T10:01:57fr-FR9PT38M16SPKڌB:޲@ /CýFOs K MM򵏯&{Ү^G xY&{7 ێ>]Fw9 mW3?{;X;,yAL Yދn=O?UD֗+[0.K ٜaYvٻ.}$2oѥ;lkd=ѕOl_3@ H*Y=6ZE9`8N!]2:l~VWD:T/K>nPmXѻ7/d%w9}\@ 1 ܯtO/V%w.D0Xp8@)>Qg\DѺW#۽z8o =瓒*wC U|S|t~sK2\)I7X,vyv lgj1}vm ,A[`Zj}Jj}Tk=_+e"Z>3477T3dk7(^ZKHTF Jo}B]]6\H' q1܃ɥ{^uMu wJK#G-?p,֊-LFJv^j iz/:H(DPNA9::iP LuznWkIm6gڐr:kcEIЋꔸ GXV"QOnA~vIk5'C\F=-j_)>hG&#g fL* z-)[w4ZT3@[&Z֖!NKOoxd'.i]tZQrieNпvίj.DߜIȐ&؏PKe` PK%[|c=)0 ~Qosxo@8x]GD>!o+ f>-dv)]*"=t1&JcЕ_ 8}x$;\D]W0ȼt%Pm+?]$ T?7d\2E oaӦǩǡ:2Ou8CC都cȎn8U&rN|t>7}eF?+pHm hr6yRKjlP_QFP@}{t}РN#.d=DZp/K(t`᳅Pqs~tqoHs@r S8gKZV TMYO\mYVհ&k+h]~=.d@P4$4H8վɘzL)@#=$ wQ29n$nxӀ8Ӷᳰyx55/jHHE*vL?h0,Sʜ[×6 K.9&$k3d}U_HBg-&d5123c!IEty/\f)mH\ٖqZ%_ɏAmk!pܠpxAKpGɠWGwcӔd~yҕ?IoxnC} PBGkfWƇxR Ք~D"azpT2B e(W;|iWW&aM&)) 6%x;Ώp!9n 񄭪0|w ]gK ̀À7+qľLCXZrOV mX4ʣžR3Ȉg~+ t>1+ßF1Si[ֱ#|4Q0|ʯi7s s/VwP-gߖ`TϵWVΫu3'u~LFK'&D,&#ɯ/;0c= ۤP˸ܪczUXb}r7) KixkL n2N%˾0 ?%zded5Dl/8_PK K'PK;]bsvOĒ&53 eZdAX@K^S^bLF , E(p!{Tڒإ[7Zz&TјKS~a,jtgRo5BCf罹4x po m?b+ #>lT_PK] 76PK #include /*The frame size in hardcoded for this sample code but it doesn't have to be*/ #define FRAME_SIZE 160 int main(int argc, char **argv) { char *outFile; FILE *fout; /*Holds the audio that will be written to file (16 bits per sample)*/ short out[FRAME_SIZE]; /*Speex handle samples as float, so we need an array of floats*/ float output[FRAME_SIZE]; char cbits[200]; int nbBytes; /*Holds the state of the decoder*/ void *state; /*Holds bits so they can be read and written to by the Speex routines*/ SpeexBits bits; int i, tmp; /*Create a new decoder state in narrowband mode*/ state = speex_decoder_init(&speex_nb_mode); /*Set the perceptual enhancement on*/ tmp=1; speex_decoder_ctl(state, SPEEX_SET_ENH, &tmp); outFile = argv[1]; fout = fopen(outFile, "w"); /*Initialization of the structure that holds the bits*/ speex_bits_init(&bits); while (1) { /*Read the size encoded by sampleenc, this part will likely be different in your application*/ fread(&nbBytes, sizeof(int), 1, stdin); fprintf (stderr, "nbBytes: %d\n", nbBytes); if (feof(stdin)) break; /*Read the "packet" encoded by sampleenc*/ fread(cbits, 1, nbBytes, stdin); /*Copy the data into the bit-stream struct*/ speex_bits_read_from(&bits, cbits, nbBytes); /*Decode the data*/ speex_decode(state, &bits, output); /*Copy from float to short (16 bits) for output*/ for (i=0;i #include "nb_celp.h" #include "lsp.h" #include "ltp.h" #include "quant_lsp.h" #include "cb_search.h" #include "filters.h" #include "os_support.h" #ifndef NULL #define NULL 0 #endif #define LSP_MARGIN .002f #define SIG_SCALING 1.f #define NB_DEC_BUFFER (NB_FRAME_SIZE+2*NB_PITCH_END+NB_SUBFRAME_SIZE+12) #define NB_ORDER 10 #define NB_FRAME_SIZE 160 #define NB_SUBFRAME_SIZE 40 #define NB_NB_SUBFRAMES 4 #define NB_PITCH_START 17 #define NB_PITCH_END 144 struct speex_decode_state { float excBuf[NB_DEC_BUFFER]; /**< Excitation buffer */ float *exc; /**< Start of excitation frame */ float old_qlsp[10]; /**< Quantized LSPs for previous frame */ float interp_qlpc[10]; /**< Interpolated quantized LPCs */ float mem_sp[10]; /**< Filter memory for synthesis signal */ int first; /**< Is this the first frame? */ }; static const float exc_gain_quant_scal1[2] = {0.70469f, 1.05127f}; struct speex_decode_state *nb_decoder_init(void) { struct speex_decode_state *st; st = malloc(sizeof(*st)); if (!st) return NULL; memset(st, 0, sizeof(*st)); st->first = 1; return st; } void nb_decoder_destroy(struct speex_decode_state *state) { if (state) free(state); } /* basic decoder using mode3 only */ int nb_decode(struct speex_decode_state *st, SpeexBits *bits, float *out) { int i, sub, wideband, mode, qe; float ol_gain; float innov[NB_SUBFRAME_SIZE]; float exc32[NB_SUBFRAME_SIZE]; float qlsp[NB_ORDER], interp_qlsp[NB_ORDER]; float ak[NB_ORDER]; if (!bits) return -1; st->exc = st->excBuf + 2*NB_PITCH_END + NB_SUBFRAME_SIZE + 6; /* Decode Sub-modes */ do { if (speex_bits_remaining(bits) < 5) return -1; wideband = speex_bits_unpack_unsigned(bits, 1); if (wideband) { printf("wideband not supported\n"); return -2; } mode = speex_bits_unpack_unsigned(bits, 4); if (mode == 15) return -1; } while (mode > 8); if (mode != 3) { printf("only mode 3 supported\n"); return -2; } /* Shift all buffers by one frame */ SPEEX_MOVE(st->excBuf, st->excBuf+NB_FRAME_SIZE, 2*NB_PITCH_END + NB_SUBFRAME_SIZE + 12); /* Unquantize LSPs */ lsp_unquant_lbr(qlsp, NB_ORDER, bits); /* Handle first frame */ if (st->first) { st->first = 0; for (i=0; iold_qlsp[i] = qlsp[i]; } /* Get global excitation gain */ qe = speex_bits_unpack_unsigned(bits, 5); ol_gain = SIG_SCALING*exp(qe/3.5); /* Loop on subframes */ for (sub=0; sub<4; sub++) { int offset, q_energy; float *exc, *sp; float ener; offset = NB_SUBFRAME_SIZE*sub; exc = st->exc + offset; sp = out + offset; SPEEX_MEMSET(exc, 0, NB_SUBFRAME_SIZE); /* Adaptive codebook contribution */ pitch_unquant_3tap(exc, exc32, NB_PITCH_START, NB_SUBFRAME_SIZE, bits, 0); sanitize_values32(exc32, -32000, 32000, NB_SUBFRAME_SIZE); /* Unquantize the innovation */ SPEEX_MEMSET(innov, 0, NB_SUBFRAME_SIZE); /* Decode sub-frame gain correction */ q_energy = speex_bits_unpack_unsigned(bits, 1); ener = exc_gain_quant_scal1[q_energy] * ol_gain; /* Fixed codebook contribution */ split_cb_shape_sign_unquant(innov, bits); /* De-normalize innovation and update excitation */ signal_mul(innov, innov, ener, NB_SUBFRAME_SIZE); for (i=0; iexc[-NB_SUBFRAME_SIZE], NB_FRAME_SIZE); /* Loop on subframes */ for (sub=0; sub<4; sub++) { const int offset = NB_SUBFRAME_SIZE*sub; float *sp, *exc; sp = out + offset; exc = st->exc + offset; /* LSP interpolation (quantized and unquantized) */ lsp_interpolate(st->old_qlsp, qlsp, interp_qlsp, NB_ORDER, sub, NB_NB_SUBFRAMES, LSP_MARGIN); /* Compute interpolated LPCs (unquantized) */ lsp_to_lpc(interp_qlsp, ak, NB_ORDER); iir_mem16(sp, st->interp_qlpc, sp, NB_SUBFRAME_SIZE, NB_ORDER, st->mem_sp); /* Save for interpolation in next frame */ for (i=0; iinterp_qlpc[i] = ak[i]; } /* Store the LSPs for interpolation in the next frame */ for (i=0; iold_qlsp[i] = qlsp[i]; return 0; } mumble-1.3.4/3rdparty/speex-src/doc/components.eps0000664000175000017500000026037414010707304021774 0ustar builderbuilder%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 770 174 %%Pages: 0 %%Creator: Sun Microsystems, Inc. %%Title: none %%CreationDate: none %%LanguageLevel: 2 %%EndComments %%BeginProlog %%BeginResource: procset SDRes-Prolog 1.0 0 /b4_inc_state save def /dict_count countdictstack def /op_count count 1 sub def userdict begin 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit[] 0 setdash newpath /languagelevel where {pop languagelevel 1 ne {false setstrokeadjust false setoverprint} if} if /bdef {bind def} bind def /c {setrgbcolor} bdef /l {neg lineto} bdef /rl {neg rlineto} bdef /lc {setlinecap} bdef /lj {setlinejoin} bdef /lw {setlinewidth} bdef /ml {setmiterlimit} bdef /ld {setdash} bdef /m {neg moveto} bdef /ct {6 2 roll neg 6 2 roll neg 6 2 roll neg curveto} bdef /r {rotate} bdef /t {neg translate} bdef /s {scale} bdef /sw {show} bdef /gs {gsave} bdef /gr {grestore} bdef /f {findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding ISOLatin1Encoding def currentdict end /NFont exch definefont pop /NFont findfont} bdef /p {closepath} bdef /sf {scalefont setfont} bdef /ef {eofill}bdef /pc {closepath stroke}bdef /ps {stroke}bdef /pum {matrix currentmatrix}bdef /pom {setmatrix}bdef /bs {/aString exch def /nXOfs exch def /nWidth exch def currentpoint nXOfs 0 rmoveto pum nWidth aString stringwidth pop div 1 scale aString show pom moveto} bdef %%EndResource %%EndProlog %%BeginSetup %%EndSetup %%Page: 1 1 %%BeginPageSetup %%EndPageSetup pum 0.02835 0.0284 s 0 -6126 t /tm matrix currentmatrix def tm setmatrix -450 -7975 t 1 1 s 50 lw 1 lj 0.003 0.003 0.003 c 4400 9500 m 2900 9500 l 2900 8000 l 5900 8000 l 5900 9500 l 4400 9500 l pc gs gs pum 3380 8974 t 50 0 m 50 -455 l 251 -455 l 292 -455 323 -451 344 -443 ct 365 -435 382 -420 394 -399 ct 407 -379 413 -356 413 -331 ct 413 -299 403 -271 382 -249 ct 361 -227 329 -213 285 -207 ct 301 -199 313 -192 322 -184 ct 339 -168 356 -148 371 -124 ct 451 0 l 375 0 l 315 -95 l 297 -122 283 -143 271 -157 ct 260 -172 250 -182 241 -188 ct 232 -194 223 -198 213 -200 ct 207 -201 195 -202 180 -202 ct 110 -202 l 110 0 l 50 0 l p 110 -254 m 239 -254 l 267 -254 288 -257 304 -263 ct 319 -268 331 -277 339 -290 ct 347 -303 351 -316 351 -331 ct 351 -352 344 -370 328 -384 ct 312 -398 288 -405 254 -405 ct 110 -405 l 110 -254 l p ef 724 -107 m 782 -99 l 773 -66 756 -40 731 -21 ct 707 -2 675 7 637 7 ct 589 7 551 -8 523 -37 ct 494 -67 480 -109 480 -162 ct 480 -218 495 -261 523 -291 ct 552 -322 589 -337 634 -337 ct 678 -337 714 -322 742 -292 ct 770 -262 784 -220 784 -166 ct 784 -163 784 -158 783 -151 ct 538 -151 l 540 -115 550 -87 569 -68 ct 587 -49 610 -39 637 -39 ct 658 -39 675 -44 690 -55 ct 704 -66 716 -83 724 -107 ct p 541 -197 m 725 -197 l 722 -225 715 -245 704 -259 ct 686 -280 663 -291 635 -291 ct 609 -291 587 -283 570 -265 ct 553 -248 543 -226 541 -197 ct p ef 1066 -121 m 1121 -114 l 1115 -76 1099 -46 1075 -25 ct 1050 -4 1020 7 984 7 ct 939 7 902 -8 875 -37 ct 848 -67 834 -109 834 -164 ct 834 -199 840 -230 851 -257 ct 863 -284 881 -304 905 -317 ct 929 -330 956 -337 984 -337 ct 1020 -337 1049 -328 1072 -310 ct 1094 -292 1109 -266 1115 -233 ct 1061 -224 l 1056 -247 1047 -263 1034 -274 ct 1021 -286 1005 -291 986 -291 ct 958 -291 935 -281 918 -261 ct 900 -241 891 -209 891 -165 ct 891 -121 900 -89 917 -69 ct 934 -49 956 -39 983 -39 ct 1005 -39 1023 -46 1038 -59 ct 1053 -72 1062 -93 1066 -121 ct p ef 1147 -165 m 1147 -226 1164 -271 1198 -301 ct 1226 -325 1261 -337 1302 -337 ct 1347 -337 1384 -322 1412 -293 ct 1441 -263 1456 -222 1456 -170 ct 1456 -127 1449 -94 1437 -70 ct 1424 -45 1405 -27 1381 -13 ct 1357 0 1330 7 1302 7 ct 1255 7 1218 -8 1190 -37 ct 1161 -67 1147 -110 1147 -165 ct p 1204 -165 m 1204 -123 1214 -91 1232 -70 ct 1250 -49 1274 -39 1302 -39 ct 1329 -39 1352 -49 1371 -71 ct 1389 -92 1398 -124 1398 -167 ct 1398 -208 1389 -239 1370 -260 ct 1352 -281 1329 -291 1302 -291 ct 1274 -291 1250 -281 1232 -260 ct 1214 -239 1204 -207 1204 -165 ct p ef 1518 0 m 1518 -330 l 1568 -330 l 1568 -280 l 1581 -303 1593 -318 1604 -326 ct 1615 -333 1627 -337 1640 -337 ct 1659 -337 1678 -331 1697 -319 ct 1678 -267 l 1664 -275 1651 -279 1637 -279 ct 1625 -279 1614 -276 1604 -268 ct 1594 -261 1587 -251 1583 -238 ct 1577 -218 1574 -196 1574 -173 ct 1574 0 l 1518 0 l p ef 1944 0 m 1944 -42 l 1924 -9 1893 7 1852 7 ct 1826 7 1802 0 1780 -15 ct 1758 -29 1741 -49 1729 -75 ct 1717 -101 1711 -131 1711 -165 ct 1711 -198 1716 -228 1727 -254 ct 1738 -281 1755 -302 1776 -316 ct 1798 -330 1823 -337 1850 -337 ct 1870 -337 1887 -333 1903 -325 ct 1918 -316 1931 -305 1941 -292 ct 1941 -455 l 1996 -455 l 1996 0 l 1944 0 l p 1768 -165 m 1768 -123 1777 -91 1795 -70 ct 1813 -49 1833 -39 1858 -39 ct 1882 -39 1903 -49 1920 -69 ct 1937 -89 1945 -119 1945 -160 ct 1945 -205 1937 -238 1919 -259 ct 1902 -280 1881 -291 1855 -291 ct 1830 -291 1810 -281 1793 -261 ct 1776 -240 1768 -208 1768 -165 ct p ef pom gr gr 12748 9525 m 12697 9525 l 12697 9475 l 12748 9475 l 12748 9525 l p ef 12646 9525 m 12595 9525 l 12595 9475 l 12646 9475 l 12646 9525 l p ef 12544 9525 m 12493 9525 l 12493 9475 l 12544 9475 l 12544 9525 l p ef 12442 9525 m 12391 9525 l 12391 9475 l 12442 9475 l 12442 9525 l p ef 12340 9525 m 12289 9525 l 12289 9475 l 12340 9475 l 12340 9525 l p ef 12238 9525 m 12187 9525 l 12187 9475 l 12238 9475 l 12238 9525 l p ef 12136 9525 m 12085 9525 l 12085 9475 l 12136 9475 l 12136 9525 l p ef 12034 9525 m 11983 9525 l 11983 9475 l 12034 9475 l 12034 9525 l p ef 11932 9525 m 11881 9525 l 11881 9475 l 11932 9475 l 11932 9525 l p ef 11830 9525 m 11779 9525 l 11779 9475 l 11830 9475 l 11830 9525 l p ef 11728 9525 m 11677 9525 l 11677 9475 l 11728 9475 l 11728 9525 l p ef 11626 9525 m 11575 9525 l 11575 9475 l 11626 9475 l 11626 9525 l p ef 11524 9525 m 11473 9525 l 11473 9475 l 11524 9475 l 11524 9525 l p ef 11422 9525 m 11400 9525 l 11400 9500 l 11400 9475 l 11422 9475 l 11422 9500 l 11422 9525 l p ef 11400 9500 m 11400 9525 l 11396 9525 l 11391 9523 l 11388 9522 l 11384 9519 l 11381 9516 l 11378 9513 l 11377 9509 l 11375 9504 l 11375 9500 l 11375 9500 l 11400 9500 l p ef 11375 9500 m 11375 9471 l 11400 9471 l 11425 9471 l 11425 9500 l 11400 9500 l 11375 9500 l p ef 11375 9420 m 11375 9369 l 11425 9369 l 11425 9420 l 11375 9420 l p ef 11375 9318 m 11375 9267 l 11425 9267 l 11425 9318 l 11375 9318 l p ef 11375 9216 m 11375 9165 l 11425 9165 l 11425 9216 l 11375 9216 l p ef 11375 9114 m 11375 9063 l 11425 9063 l 11425 9114 l 11375 9114 l p ef 11375 9012 m 11375 8961 l 11425 8961 l 11425 9012 l 11375 9012 l p ef 11375 8910 m 11375 8859 l 11425 8859 l 11425 8910 l 11375 8910 l p ef 11375 8808 m 11375 8757 l 11425 8757 l 11425 8808 l 11375 8808 l p ef 11375 8706 m 11375 8655 l 11425 8655 l 11425 8706 l 11375 8706 l p ef 11375 8604 m 11375 8553 l 11425 8553 l 11425 8604 l 11375 8604 l p ef 11375 8502 m 11375 8451 l 11425 8451 l 11425 8502 l 11375 8502 l p ef 11375 8400 m 11375 8349 l 11425 8349 l 11425 8400 l 11375 8400 l p ef 11375 8298 m 11375 8247 l 11425 8247 l 11425 8298 l 11375 8298 l p ef 11375 8196 m 11375 8145 l 11425 8145 l 11425 8196 l 11375 8196 l p ef 11375 8094 m 11375 8043 l 11425 8043 l 11425 8094 l 11375 8094 l p ef 11408 7975 m 11459 7975 l 11459 8025 l 11408 8025 l 11408 7975 l p ef 11510 7975 m 11561 7975 l 11561 8025 l 11510 8025 l 11510 7975 l p ef 11612 7975 m 11663 7975 l 11663 8025 l 11612 8025 l 11612 7975 l p ef 11714 7975 m 11765 7975 l 11765 8025 l 11714 8025 l 11714 7975 l p ef 11816 7975 m 11867 7975 l 11867 8025 l 11816 8025 l 11816 7975 l p ef 11918 7975 m 11969 7975 l 11969 8025 l 11918 8025 l 11918 7975 l p ef 12020 7975 m 12071 7975 l 12071 8025 l 12020 8025 l 12020 7975 l p ef 12122 7975 m 12173 7975 l 12173 8025 l 12122 8025 l 12122 7975 l p ef 12224 7975 m 12275 7975 l 12275 8025 l 12224 8025 l 12224 7975 l p ef 12326 7975 m 12377 7975 l 12377 8025 l 12326 8025 l 12326 7975 l p ef 12428 7975 m 12479 7975 l 12479 8025 l 12428 8025 l 12428 7975 l p ef 12530 7975 m 12581 7975 l 12581 8025 l 12530 8025 l 12530 7975 l p ef 12632 7975 m 12683 7975 l 12683 8025 l 12632 8025 l 12632 7975 l p ef 12734 7975 m 12785 7975 l 12785 8025 l 12734 8025 l 12734 7975 l p ef 12836 7975 m 12887 7975 l 12887 8025 l 12836 8025 l 12836 7975 l p ef 12938 7975 m 12989 7975 l 12989 8025 l 12938 8025 l 12938 7975 l p ef 13040 7975 m 13091 7975 l 13091 8025 l 13040 8025 l 13040 7975 l p ef 13142 7975 m 13193 7975 l 13193 8025 l 13142 8025 l 13142 7975 l p ef 13244 7975 m 13295 7975 l 13295 8025 l 13244 8025 l 13244 7975 l p ef 13346 7975 m 13397 7975 l 13397 8025 l 13346 8025 l 13346 7975 l p ef 13448 7975 m 13499 7975 l 13499 8025 l 13448 8025 l 13448 7975 l p ef 13550 7975 m 13601 7975 l 13601 8025 l 13550 8025 l 13550 7975 l p ef 13652 7975 m 13703 7975 l 13703 8025 l 13652 8025 l 13652 7975 l p ef 13754 7975 m 13805 7975 l 13805 8025 l 13754 8025 l 13754 7975 l p ef 13856 7975 m 13907 7975 l 13907 8025 l 13856 8025 l 13856 7975 l p ef 13958 7975 m 14009 7975 l 14009 8025 l 13958 8025 l 13958 7975 l p ef 14060 7975 m 14111 7975 l 14111 8025 l 14060 8025 l 14060 7975 l p ef 14162 7975 m 14213 7975 l 14213 8025 l 14162 8025 l 14162 7975 l p ef 14264 7975 m 14300 7975 l 14300 8000 l 14300 8025 l 14264 8025 l 14264 8000 l 14264 7975 l p ef 14300 8000 m 14300 7975 l 14304 7975 l 14309 7977 l 14312 7978 l 14316 7981 l 14319 7984 l 14322 7987 l 14323 7991 l 14325 7996 l 14325 8000 l 14325 8000 l 14300 8000 l p ef 14325 8000 m 14325 8015 l 14300 8015 l 14275 8015 l 14275 8000 l 14300 8000 l 14325 8000 l p ef 14325 8066 m 14325 8117 l 14275 8117 l 14275 8066 l 14325 8066 l p ef 14325 8168 m 14325 8219 l 14275 8219 l 14275 8168 l 14325 8168 l p ef 14325 8270 m 14325 8321 l 14275 8321 l 14275 8270 l 14325 8270 l p ef 14325 8372 m 14325 8423 l 14275 8423 l 14275 8372 l 14325 8372 l p ef 14325 8474 m 14325 8525 l 14275 8525 l 14275 8474 l 14325 8474 l p ef 14325 8576 m 14325 8627 l 14275 8627 l 14275 8576 l 14325 8576 l p ef 14325 8678 m 14325 8729 l 14275 8729 l 14275 8678 l 14325 8678 l p ef 14325 8780 m 14325 8831 l 14275 8831 l 14275 8780 l 14325 8780 l p ef 14325 8882 m 14325 8933 l 14275 8933 l 14275 8882 l 14325 8882 l p ef 14325 8984 m 14325 9035 l 14275 9035 l 14275 8984 l 14325 8984 l p ef 14325 9086 m 14325 9137 l 14275 9137 l 14275 9086 l 14325 9086 l p ef 14325 9188 m 14325 9239 l 14275 9239 l 14275 9188 l 14325 9188 l p ef 14325 9290 m 14325 9341 l 14275 9341 l 14275 9290 l 14325 9290 l p ef 14325 9392 m 14325 9443 l 14275 9443 l 14275 9392 l 14325 9392 l p ef 14325 9494 m 14325 9500 l 14300 9500 l 14275 9500 l 14275 9494 l 14300 9494 l 14325 9494 l p ef 14300 9500 m 14325 9500 l 14325 9504 l 14323 9509 l 14322 9512 l 14319 9516 l 14316 9519 l 14313 9522 l 14309 9523 l 14304 9525 l 14300 9525 l 14300 9525 l 14300 9500 l p ef 14300 9525 m 14255 9525 l 14255 9500 l 14255 9475 l 14300 9475 l 14300 9500 l 14300 9525 l p ef 14204 9525 m 14153 9525 l 14153 9475 l 14204 9475 l 14204 9525 l p ef 14102 9525 m 14051 9525 l 14051 9475 l 14102 9475 l 14102 9525 l p ef 14000 9525 m 13949 9525 l 13949 9475 l 14000 9475 l 14000 9525 l p ef 13898 9525 m 13847 9525 l 13847 9475 l 13898 9475 l 13898 9525 l p ef 13796 9525 m 13745 9525 l 13745 9475 l 13796 9475 l 13796 9525 l p ef 13694 9525 m 13643 9525 l 13643 9475 l 13694 9475 l 13694 9525 l p ef 13592 9525 m 13541 9525 l 13541 9475 l 13592 9475 l 13592 9525 l p ef 13490 9525 m 13439 9525 l 13439 9475 l 13490 9475 l 13490 9525 l p ef 13388 9525 m 13337 9525 l 13337 9475 l 13388 9475 l 13388 9525 l p ef 13286 9525 m 13235 9525 l 13235 9475 l 13286 9475 l 13286 9525 l p ef 13184 9525 m 13133 9525 l 13133 9475 l 13184 9475 l 13184 9525 l p ef 13082 9525 m 13031 9525 l 13031 9475 l 13082 9475 l 13082 9525 l p ef 12980 9525 m 12929 9525 l 12929 9475 l 12980 9475 l 12980 9525 l p ef 12878 9525 m 12850 9525 l 12850 9500 l 12850 9475 l 12878 9475 l 12878 9500 l 12878 9525 l p ef 12850 9525 m 12799 9525 l 12799 9500 l 12799 9475 l 12850 9475 l 12850 9500 l 12850 9525 l p ef gs gs pum 12191 8974 t -1 0 m 174 -455 l 238 -455 l 424 0 l 356 0 l 303 -138 l 113 -138 l 63 0 l -1 0 l p 130 -187 m 284 -187 l 237 -313 l 222 -351 212 -383 205 -407 ct 199 -378 191 -349 180 -320 ct 130 -187 l p ef 473 0 m 473 -455 l 802 -455 l 802 -401 l 533 -401 l 533 -262 l 785 -262 l 785 -209 l 533 -209 l 533 -54 l 812 -54 l 812 0 l 473 0 l p ef 1220 -159 m 1280 -144 l 1268 -95 1245 -57 1212 -31 ct 1180 -5 1140 8 1092 8 ct 1043 8 1003 -2 973 -22 ct 942 -42 919 -71 903 -109 ct 887 -147 879 -187 879 -231 ct 879 -278 888 -319 906 -355 ct 924 -390 950 -417 983 -435 ct 1016 -453 1053 -463 1093 -463 ct 1139 -463 1177 -451 1208 -428 ct 1239 -405 1261 -372 1273 -330 ct 1213 -316 l 1203 -349 1188 -373 1168 -388 ct 1148 -403 1122 -411 1092 -411 ct 1057 -411 1028 -403 1004 -386 ct 981 -369 964 -347 955 -318 ct 945 -290 941 -261 941 -231 ct 941 -192 946 -159 958 -130 ct 969 -101 986 -79 1010 -65 ct 1034 -51 1060 -44 1087 -44 ct 1121 -44 1150 -53 1173 -73 ct 1196 -92 1212 -121 1220 -159 ct p ef pom gr gr 17600 9525 m 17549 9525 l 17549 9475 l 17600 9475 l 17600 9525 l p ef 17498 9525 m 17447 9525 l 17447 9475 l 17498 9475 l 17498 9525 l p ef 17396 9525 m 17345 9525 l 17345 9475 l 17396 9475 l 17396 9525 l p ef 17294 9525 m 17243 9525 l 17243 9475 l 17294 9475 l 17294 9525 l p ef 17192 9525 m 17141 9525 l 17141 9475 l 17192 9475 l 17192 9525 l p ef 17090 9525 m 17039 9525 l 17039 9475 l 17090 9475 l 17090 9525 l p ef 16988 9525 m 16937 9525 l 16937 9475 l 16988 9475 l 16988 9525 l p ef 16886 9525 m 16835 9525 l 16835 9475 l 16886 9475 l 16886 9525 l p ef 16784 9525 m 16733 9525 l 16733 9475 l 16784 9475 l 16784 9525 l p ef 16682 9525 m 16631 9525 l 16631 9475 l 16682 9475 l 16682 9525 l p ef 16580 9525 m 16529 9525 l 16529 9475 l 16580 9475 l 16580 9525 l p ef 16478 9525 m 16427 9525 l 16427 9475 l 16478 9475 l 16478 9525 l p ef 16376 9525 m 16325 9525 l 16325 9475 l 16376 9475 l 16376 9525 l p ef 16274 9525 m 16223 9525 l 16223 9475 l 16274 9475 l 16274 9525 l p ef 16172 9525 m 16121 9525 l 16121 9475 l 16172 9475 l 16172 9525 l p ef 16070 9525 m 16019 9525 l 16019 9475 l 16070 9475 l 16070 9525 l p ef 15968 9525 m 15917 9525 l 15917 9475 l 15968 9475 l 15968 9525 l p ef 15866 9525 m 15815 9525 l 15815 9475 l 15866 9475 l 15866 9525 l p ef 15764 9525 m 15713 9525 l 15713 9475 l 15764 9475 l 15764 9525 l p ef 15662 9525 m 15611 9525 l 15611 9475 l 15662 9475 l 15662 9525 l p ef 15560 9525 m 15509 9525 l 15509 9475 l 15560 9475 l 15560 9525 l p ef 15458 9525 m 15407 9525 l 15407 9475 l 15458 9475 l 15458 9525 l p ef 15375 9456 m 15375 9405 l 15425 9405 l 15425 9456 l 15375 9456 l p ef 15375 9354 m 15375 9303 l 15425 9303 l 15425 9354 l 15375 9354 l p ef 15375 9252 m 15375 9201 l 15425 9201 l 15425 9252 l 15375 9252 l p ef 15375 9150 m 15375 9099 l 15425 9099 l 15425 9150 l 15375 9150 l p ef 15375 9048 m 15375 8997 l 15425 8997 l 15425 9048 l 15375 9048 l p ef 15375 8946 m 15375 8895 l 15425 8895 l 15425 8946 l 15375 8946 l p ef 15375 8844 m 15375 8793 l 15425 8793 l 15425 8844 l 15375 8844 l p ef 15375 8742 m 15375 8691 l 15425 8691 l 15425 8742 l 15375 8742 l p ef 15375 8640 m 15375 8589 l 15425 8589 l 15425 8640 l 15375 8640 l p ef 15375 8538 m 15375 8487 l 15425 8487 l 15425 8538 l 15375 8538 l p ef 15375 8436 m 15375 8385 l 15425 8385 l 15425 8436 l 15375 8436 l p ef 15375 8334 m 15375 8283 l 15425 8283 l 15425 8334 l 15375 8334 l p ef 15375 8232 m 15375 8181 l 15425 8181 l 15425 8232 l 15375 8232 l p ef 15375 8130 m 15375 8079 l 15425 8079 l 15425 8130 l 15375 8130 l p ef 15375 8028 m 15375 8000 l 15400 8000 l 15425 8000 l 15425 8028 l 15400 8028 l 15375 8028 l p ef 15400 8000 m 15375 8000 l 15375 7996 l 15377 7991 l 15378 7988 l 15381 7984 l 15384 7981 l 15387 7978 l 15391 7977 l 15396 7975 l 15400 7975 l 15400 7975 l 15400 8000 l p ef 15400 7975 m 15423 7975 l 15423 8000 l 15423 8025 l 15400 8025 l 15400 8000 l 15400 7975 l p ef 15474 7975 m 15525 7975 l 15525 8025 l 15474 8025 l 15474 7975 l p ef 15576 7975 m 15627 7975 l 15627 8025 l 15576 8025 l 15576 7975 l p ef 15678 7975 m 15729 7975 l 15729 8025 l 15678 8025 l 15678 7975 l p ef 15780 7975 m 15831 7975 l 15831 8025 l 15780 8025 l 15780 7975 l p ef 15882 7975 m 15933 7975 l 15933 8025 l 15882 8025 l 15882 7975 l p ef 15984 7975 m 16035 7975 l 16035 8025 l 15984 8025 l 15984 7975 l p ef 16086 7975 m 16137 7975 l 16137 8025 l 16086 8025 l 16086 7975 l p ef 16188 7975 m 16239 7975 l 16239 8025 l 16188 8025 l 16188 7975 l p ef 16290 7975 m 16341 7975 l 16341 8025 l 16290 8025 l 16290 7975 l p ef 16392 7975 m 16443 7975 l 16443 8025 l 16392 8025 l 16392 7975 l p ef 16494 7975 m 16545 7975 l 16545 8025 l 16494 8025 l 16494 7975 l p ef 16596 7975 m 16647 7975 l 16647 8025 l 16596 8025 l 16596 7975 l p ef 16698 7975 m 16749 7975 l 16749 8025 l 16698 8025 l 16698 7975 l p ef 16800 7975 m 16851 7975 l 16851 8025 l 16800 8025 l 16800 7975 l p ef 16902 7975 m 16953 7975 l 16953 8025 l 16902 8025 l 16902 7975 l p ef 17004 7975 m 17055 7975 l 17055 8025 l 17004 8025 l 17004 7975 l p ef 17106 7975 m 17157 7975 l 17157 8025 l 17106 8025 l 17106 7975 l p ef 17208 7975 m 17259 7975 l 17259 8025 l 17208 8025 l 17208 7975 l p ef 17310 7975 m 17361 7975 l 17361 8025 l 17310 8025 l 17310 7975 l p ef 17412 7975 m 17463 7975 l 17463 8025 l 17412 8025 l 17412 7975 l p ef 17514 7975 m 17565 7975 l 17565 8025 l 17514 8025 l 17514 7975 l p ef 17616 7975 m 17667 7975 l 17667 8025 l 17616 8025 l 17616 7975 l p ef 17718 7975 m 17769 7975 l 17769 8025 l 17718 8025 l 17718 7975 l p ef 17820 7975 m 17871 7975 l 17871 8025 l 17820 8025 l 17820 7975 l p ef 17922 7975 m 17973 7975 l 17973 8025 l 17922 8025 l 17922 7975 l p ef 18024 7975 m 18075 7975 l 18075 8025 l 18024 8025 l 18024 7975 l p ef 18126 7975 m 18177 7975 l 18177 8025 l 18126 8025 l 18126 7975 l p ef 18228 7975 m 18279 7975 l 18279 8025 l 18228 8025 l 18228 7975 l p ef 18330 7975 m 18381 7975 l 18381 8025 l 18330 8025 l 18330 7975 l p ef 18432 7975 m 18483 7975 l 18483 8025 l 18432 8025 l 18432 7975 l p ef 18534 7975 m 18585 7975 l 18585 8025 l 18534 8025 l 18534 7975 l p ef 18636 7975 m 18687 7975 l 18687 8025 l 18636 8025 l 18636 7975 l p ef 18738 7975 m 18789 7975 l 18789 8025 l 18738 8025 l 18738 7975 l p ef 18840 7975 m 18891 7975 l 18891 8025 l 18840 8025 l 18840 7975 l p ef 18942 7975 m 18993 7975 l 18993 8025 l 18942 8025 l 18942 7975 l p ef 19044 7975 m 19095 7975 l 19095 8025 l 19044 8025 l 19044 7975 l p ef 19146 7975 m 19197 7975 l 19197 8025 l 19146 8025 l 19146 7975 l p ef 19248 7975 m 19299 7975 l 19299 8025 l 19248 8025 l 19248 7975 l p ef 19350 7975 m 19401 7975 l 19401 8025 l 19350 8025 l 19350 7975 l p ef 19452 7975 m 19503 7975 l 19503 8025 l 19452 8025 l 19452 7975 l p ef 19554 7975 m 19605 7975 l 19605 8025 l 19554 8025 l 19554 7975 l p ef 19656 7975 m 19707 7975 l 19707 8025 l 19656 8025 l 19656 7975 l p ef 19758 7975 m 19800 7975 l 19800 8000 l 19800 8025 l 19758 8025 l 19758 8000 l 19758 7975 l p ef 19800 8000 m 19800 7975 l 19804 7975 l 19809 7977 l 19812 7978 l 19816 7981 l 19819 7984 l 19822 7987 l 19823 7991 l 19825 7996 l 19825 8000 l 19825 8000 l 19800 8000 l p ef 19825 8000 m 19825 8009 l 19800 8009 l 19775 8009 l 19775 8000 l 19800 8000 l 19825 8000 l p ef 19825 8060 m 19825 8111 l 19775 8111 l 19775 8060 l 19825 8060 l p ef 19825 8162 m 19825 8213 l 19775 8213 l 19775 8162 l 19825 8162 l p ef 19825 8264 m 19825 8315 l 19775 8315 l 19775 8264 l 19825 8264 l p ef 19825 8366 m 19825 8417 l 19775 8417 l 19775 8366 l 19825 8366 l p ef 19825 8468 m 19825 8519 l 19775 8519 l 19775 8468 l 19825 8468 l p ef 19825 8570 m 19825 8621 l 19775 8621 l 19775 8570 l 19825 8570 l p ef 19825 8672 m 19825 8723 l 19775 8723 l 19775 8672 l 19825 8672 l p ef 19825 8774 m 19825 8825 l 19775 8825 l 19775 8774 l 19825 8774 l p ef 19825 8876 m 19825 8927 l 19775 8927 l 19775 8876 l 19825 8876 l p ef 19825 8978 m 19825 9029 l 19775 9029 l 19775 8978 l 19825 8978 l p ef 19825 9080 m 19825 9131 l 19775 9131 l 19775 9080 l 19825 9080 l p ef 19825 9182 m 19825 9233 l 19775 9233 l 19775 9182 l 19825 9182 l p ef 19825 9284 m 19825 9335 l 19775 9335 l 19775 9284 l 19825 9284 l p ef 19825 9386 m 19825 9437 l 19775 9437 l 19775 9386 l 19825 9386 l p ef 19825 9488 m 19825 9500 l 19800 9500 l 19775 9500 l 19775 9488 l 19800 9488 l 19825 9488 l p ef 19800 9500 m 19825 9500 l 19825 9504 l 19823 9509 l 19822 9512 l 19819 9516 l 19816 9519 l 19813 9522 l 19809 9523 l 19804 9525 l 19800 9525 l 19800 9525 l 19800 9500 l p ef 19800 9525 m 19761 9525 l 19761 9500 l 19761 9475 l 19800 9475 l 19800 9500 l 19800 9525 l p ef 19710 9525 m 19659 9525 l 19659 9475 l 19710 9475 l 19710 9525 l p ef 19608 9525 m 19557 9525 l 19557 9475 l 19608 9475 l 19608 9525 l p ef 19506 9525 m 19455 9525 l 19455 9475 l 19506 9475 l 19506 9525 l p ef 19404 9525 m 19353 9525 l 19353 9475 l 19404 9475 l 19404 9525 l p ef 19302 9525 m 19251 9525 l 19251 9475 l 19302 9475 l 19302 9525 l p ef 19200 9525 m 19149 9525 l 19149 9475 l 19200 9475 l 19200 9525 l p ef 19098 9525 m 19047 9525 l 19047 9475 l 19098 9475 l 19098 9525 l p ef 18996 9525 m 18945 9525 l 18945 9475 l 18996 9475 l 18996 9525 l p ef 18894 9525 m 18843 9525 l 18843 9475 l 18894 9475 l 18894 9525 l p ef 18792 9525 m 18741 9525 l 18741 9475 l 18792 9475 l 18792 9525 l p ef 18690 9525 m 18639 9525 l 18639 9475 l 18690 9475 l 18690 9525 l p ef 18588 9525 m 18537 9525 l 18537 9475 l 18588 9475 l 18588 9525 l p ef 18486 9525 m 18435 9525 l 18435 9475 l 18486 9475 l 18486 9525 l p ef 18384 9525 m 18333 9525 l 18333 9475 l 18384 9475 l 18384 9525 l p ef 18282 9525 m 18231 9525 l 18231 9475 l 18282 9475 l 18282 9525 l p ef 18180 9525 m 18129 9525 l 18129 9475 l 18180 9475 l 18180 9525 l p ef 18078 9525 m 18027 9525 l 18027 9475 l 18078 9475 l 18078 9525 l p ef 17976 9525 m 17925 9525 l 17925 9475 l 17976 9475 l 17976 9525 l p ef 17874 9525 m 17823 9525 l 17823 9475 l 17874 9475 l 17874 9525 l p ef 17772 9525 m 17721 9525 l 17721 9475 l 17772 9475 l 17772 9525 l p ef 17670 9525 m 17619 9525 l 17619 9475 l 17670 9475 l 17670 9525 l p ef gs gs pum 15705 8974 t 49 0 m 49 -455 l 220 -455 l 251 -455 274 -454 290 -451 ct 312 -447 331 -440 346 -429 ct 361 -419 373 -404 382 -385 ct 391 -367 396 -346 396 -323 ct 396 -285 384 -252 359 -225 ct 334 -198 290 -185 226 -185 ct 109 -185 l 109 0 l 49 0 l p 109 -239 m 227 -239 l 266 -239 293 -246 309 -260 ct 326 -275 334 -295 334 -322 ct 334 -341 329 -357 320 -370 ct 310 -384 297 -393 282 -397 ct 271 -400 253 -401 225 -401 ct 109 -401 l 109 -239 l p ef 464 0 m 464 -330 l 514 -330 l 514 -280 l 527 -303 539 -318 550 -326 ct 561 -333 573 -337 586 -337 ct 605 -337 624 -331 643 -319 ct 624 -267 l 610 -275 597 -279 583 -279 ct 571 -279 560 -276 550 -268 ct 540 -261 533 -251 529 -238 ct 523 -218 520 -196 520 -173 ct 520 0 l 464 0 l p ef 902 -107 m 960 -99 l 951 -66 934 -40 909 -21 ct 885 -2 853 7 815 7 ct 767 7 729 -8 701 -37 ct 672 -67 658 -109 658 -162 ct 658 -218 673 -261 701 -291 ct 730 -322 767 -337 812 -337 ct 856 -337 892 -322 920 -292 ct 948 -262 962 -220 962 -166 ct 962 -163 962 -158 961 -151 ct 716 -151 l 718 -115 728 -87 747 -68 ct 765 -49 788 -39 815 -39 ct 836 -39 853 -44 868 -55 ct 882 -66 894 -83 902 -107 ct p 719 -197 m 903 -197 l 900 -225 893 -245 882 -259 ct 864 -280 841 -291 813 -291 ct 787 -291 765 -283 748 -265 ct 731 -248 721 -226 719 -197 ct p ef 1028 126 m 1028 -330 l 1079 -330 l 1079 -287 l 1091 -304 1104 -316 1119 -324 ct 1134 -333 1153 -337 1174 -337 ct 1202 -337 1227 -330 1249 -315 ct 1270 -301 1286 -280 1297 -254 ct 1308 -228 1314 -199 1314 -167 ct 1314 -134 1308 -103 1296 -77 ct 1284 -50 1266 -29 1243 -15 ct 1220 0 1196 7 1170 7 ct 1152 7 1135 3 1120 -5 ct 1105 -13 1093 -23 1084 -35 ct 1084 126 l 1028 126 l p 1078 -163 m 1078 -121 1087 -90 1104 -69 ct 1121 -49 1142 -39 1166 -39 ct 1191 -39 1213 -49 1230 -70 ct 1248 -91 1257 -124 1257 -168 ct 1257 -210 1248 -241 1231 -262 ct 1214 -283 1193 -293 1169 -293 ct 1145 -293 1124 -282 1106 -260 ct 1088 -238 1078 -205 1078 -163 ct p ef 1379 0 m 1379 -330 l 1429 -330 l 1429 -280 l 1442 -303 1454 -318 1465 -326 ct 1476 -333 1488 -337 1501 -337 ct 1520 -337 1539 -331 1558 -319 ct 1539 -267 l 1525 -275 1512 -279 1498 -279 ct 1486 -279 1475 -276 1465 -268 ct 1455 -261 1448 -251 1444 -238 ct 1438 -218 1435 -196 1435 -173 ct 1435 0 l 1379 0 l p ef 1570 -165 m 1570 -226 1587 -271 1621 -301 ct 1649 -325 1684 -337 1725 -337 ct 1770 -337 1807 -322 1835 -293 ct 1864 -263 1879 -222 1879 -170 ct 1879 -127 1872 -94 1860 -70 ct 1847 -45 1828 -27 1804 -13 ct 1780 0 1753 7 1725 7 ct 1678 7 1641 -8 1613 -37 ct 1584 -67 1570 -110 1570 -165 ct p 1627 -165 m 1627 -123 1637 -91 1655 -70 ct 1673 -49 1697 -39 1725 -39 ct 1752 -39 1775 -49 1794 -71 ct 1812 -92 1821 -124 1821 -167 ct 1821 -208 1812 -239 1793 -260 ct 1775 -281 1752 -291 1725 -291 ct 1697 -291 1673 -281 1655 -260 ct 1637 -239 1627 -207 1627 -165 ct p ef 2158 -121 m 2213 -114 l 2207 -76 2191 -46 2167 -25 ct 2142 -4 2112 7 2076 7 ct 2031 7 1994 -8 1967 -37 ct 1940 -67 1926 -109 1926 -164 ct 1926 -199 1932 -230 1943 -257 ct 1955 -284 1973 -304 1997 -317 ct 2021 -330 2048 -337 2076 -337 ct 2112 -337 2141 -328 2164 -310 ct 2186 -292 2201 -266 2207 -233 ct 2153 -224 l 2148 -247 2139 -263 2126 -274 ct 2113 -286 2097 -291 2078 -291 ct 2050 -291 2027 -281 2010 -261 ct 1992 -241 1983 -209 1983 -165 ct 1983 -121 1992 -89 2009 -69 ct 2026 -49 2048 -39 2075 -39 ct 2097 -39 2115 -46 2130 -59 ct 2145 -72 2154 -93 2158 -121 ct p ef 2485 -107 m 2543 -99 l 2534 -66 2517 -40 2492 -21 ct 2468 -2 2436 7 2398 7 ct 2350 7 2312 -8 2284 -37 ct 2255 -67 2241 -109 2241 -162 ct 2241 -218 2256 -261 2284 -291 ct 2313 -322 2350 -337 2395 -337 ct 2439 -337 2475 -322 2503 -292 ct 2531 -262 2545 -220 2545 -166 ct 2545 -163 2545 -158 2544 -151 ct 2299 -151 l 2301 -115 2311 -87 2330 -68 ct 2348 -49 2371 -39 2398 -39 ct 2419 -39 2436 -44 2451 -55 ct 2465 -66 2477 -83 2485 -107 ct p 2302 -197 m 2486 -197 l 2483 -225 2476 -245 2465 -259 ct 2447 -280 2424 -291 2396 -291 ct 2370 -291 2348 -283 2331 -265 ct 2314 -248 2304 -226 2302 -197 ct p ef 2590 -99 m 2645 -107 l 2648 -85 2656 -68 2671 -57 ct 2685 -45 2705 -39 2730 -39 ct 2756 -39 2775 -44 2787 -55 ct 2799 -65 2806 -77 2806 -91 ct 2806 -104 2800 -114 2789 -121 ct 2782 -126 2763 -132 2732 -140 ct 2691 -150 2663 -159 2647 -167 ct 2631 -174 2619 -185 2611 -198 ct 2603 -211 2599 -226 2599 -242 ct 2599 -257 2602 -270 2609 -283 ct 2616 -295 2625 -306 2636 -314 ct 2645 -320 2657 -326 2672 -330 ct 2687 -335 2703 -337 2720 -337 ct 2746 -337 2769 -333 2788 -326 ct 2808 -318 2822 -308 2831 -296 ct 2841 -283 2847 -266 2851 -245 ct 2796 -237 l 2794 -254 2786 -267 2774 -277 ct 2763 -286 2746 -291 2724 -291 ct 2698 -291 2680 -287 2669 -278 ct 2658 -270 2653 -260 2653 -249 ct 2653 -241 2655 -235 2660 -229 ct 2664 -223 2671 -218 2681 -214 ct 2687 -212 2703 -207 2730 -200 ct 2770 -189 2797 -181 2813 -174 ct 2829 -167 2841 -158 2850 -145 ct 2859 -132 2863 -116 2863 -97 ct 2863 -79 2858 -61 2847 -45 ct 2836 -28 2820 -15 2800 -6 ct 2779 3 2756 7 2730 7 ct 2688 7 2655 -2 2632 -20 ct 2610 -37 2596 -64 2590 -99 ct p ef 2907 -99 m 2962 -107 l 2965 -85 2973 -68 2988 -57 ct 3002 -45 3022 -39 3047 -39 ct 3073 -39 3092 -44 3104 -55 ct 3116 -65 3123 -77 3123 -91 ct 3123 -104 3117 -114 3106 -121 ct 3099 -126 3080 -132 3049 -140 ct 3008 -150 2980 -159 2964 -167 ct 2948 -174 2936 -185 2928 -198 ct 2920 -211 2916 -226 2916 -242 ct 2916 -257 2919 -270 2926 -283 ct 2933 -295 2942 -306 2953 -314 ct 2962 -320 2974 -326 2989 -330 ct 3004 -335 3020 -337 3037 -337 ct 3063 -337 3086 -333 3105 -326 ct 3125 -318 3139 -308 3148 -296 ct 3158 -283 3164 -266 3168 -245 ct 3113 -237 l 3111 -254 3103 -267 3091 -277 ct 3080 -286 3063 -291 3041 -291 ct 3015 -291 2997 -287 2986 -278 ct 2975 -270 2970 -260 2970 -249 ct 2970 -241 2972 -235 2977 -229 ct 2981 -223 2988 -218 2998 -214 ct 3004 -212 3020 -207 3047 -200 ct 3087 -189 3114 -181 3130 -174 ct 3146 -167 3158 -158 3167 -145 ct 3176 -132 3180 -116 3180 -97 ct 3180 -79 3175 -61 3164 -45 ct 3153 -28 3137 -15 3117 -6 ct 3096 3 3073 7 3047 7 ct 3005 7 2972 -2 2949 -20 ct 2927 -37 2913 -64 2907 -99 ct p ef 3226 -165 m 3226 -226 3243 -271 3277 -301 ct 3305 -325 3340 -337 3381 -337 ct 3426 -337 3463 -322 3491 -293 ct 3520 -263 3535 -222 3535 -170 ct 3535 -127 3528 -94 3516 -70 ct 3503 -45 3484 -27 3460 -13 ct 3436 0 3409 7 3381 7 ct 3334 7 3297 -8 3269 -37 ct 3240 -67 3226 -110 3226 -165 ct p 3283 -165 m 3283 -123 3293 -91 3311 -70 ct 3329 -49 3353 -39 3381 -39 ct 3408 -39 3431 -49 3450 -71 ct 3468 -92 3477 -124 3477 -167 ct 3477 -208 3468 -239 3449 -260 ct 3431 -281 3408 -291 3381 -291 ct 3353 -291 3329 -281 3311 -260 ct 3293 -239 3283 -207 3283 -165 ct p ef 3597 0 m 3597 -330 l 3647 -330 l 3647 -280 l 3660 -303 3672 -318 3683 -326 ct 3694 -333 3706 -337 3719 -337 ct 3738 -337 3757 -331 3776 -319 ct 3757 -267 l 3743 -275 3730 -279 3716 -279 ct 3704 -279 3693 -276 3683 -268 ct 3673 -261 3666 -251 3662 -238 ct 3656 -218 3653 -196 3653 -173 ct 3653 0 l 3597 0 l p ef pom gr gr 4400 13500 m 2900 13500 l 2900 12000 l 5900 12000 l 5900 13500 l 4400 13500 l pc gs gs pum 3122 12970 t 49 0 m 49 -455 l 220 -455 l 251 -455 274 -454 290 -451 ct 312 -447 331 -440 346 -429 ct 361 -419 373 -404 382 -385 ct 391 -367 396 -346 396 -323 ct 396 -285 384 -252 359 -225 ct 334 -198 290 -185 226 -185 ct 109 -185 l 109 0 l 49 0 l p 109 -239 m 227 -239 l 266 -239 293 -246 309 -260 ct 326 -275 334 -295 334 -322 ct 334 -341 329 -357 320 -370 ct 310 -384 297 -393 282 -397 ct 271 -400 253 -401 225 -401 ct 109 -401 l 109 -239 l p ef 464 0 m 464 -455 l 519 -455 l 519 0 l 464 0 l p ef 820 -41 m 799 -24 779 -11 760 -4 ct 741 3 720 7 699 7 ct 662 7 635 -2 615 -20 ct 596 -37 586 -60 586 -87 ct 586 -103 590 -118 597 -131 ct 604 -145 614 -156 626 -164 ct 638 -172 651 -178 666 -182 ct 677 -185 693 -188 716 -190 ct 761 -196 794 -202 815 -209 ct 815 -217 815 -222 815 -224 ct 815 -247 810 -263 800 -272 ct 785 -285 764 -291 736 -291 ct 710 -291 690 -286 678 -277 ct 665 -268 656 -252 650 -228 ct 596 -236 l 601 -259 609 -278 620 -292 ct 631 -307 648 -318 669 -326 ct 691 -333 716 -337 744 -337 ct 772 -337 795 -334 813 -327 ct 830 -321 843 -312 851 -302 ct 860 -292 865 -280 869 -264 ct 871 -255 872 -238 872 -213 ct 872 -138 l 872 -87 873 -54 875 -40 ct 877 -26 882 -13 889 0 ct 831 0 l 825 -12 821 -26 820 -41 ct p 815 -166 m 795 -157 764 -150 724 -145 ct 701 -141 685 -138 675 -133 ct 666 -129 658 -123 653 -115 ct 648 -107 645 -99 645 -89 ct 645 -74 651 -62 662 -52 ct 674 -42 690 -37 712 -37 ct 733 -37 752 -41 769 -51 ct 786 -60 798 -73 806 -89 ct 812 -102 815 -121 815 -145 ct 815 -166 l p ef 953 127 m 947 75 l 959 78 970 80 979 80 ct 992 80 1001 78 1009 73 ct 1016 69 1022 64 1027 56 ct 1031 51 1036 37 1044 15 ct 1045 11 1047 7 1049 1 ct 924 -330 l 984 -330 l 1053 -139 l 1062 -114 1070 -89 1077 -62 ct 1083 -88 1091 -113 1100 -137 ct 1170 -330 l 1226 -330 l 1101 6 l 1087 42 1077 67 1069 81 ct 1059 99 1048 113 1035 121 ct 1022 130 1007 134 989 134 ct 979 134 967 132 953 127 ct p ef 1316 0 m 1265 0 l 1265 -455 l 1320 -455 l 1320 -293 l 1344 -322 1374 -337 1411 -337 ct 1431 -337 1450 -333 1468 -325 ct 1486 -317 1501 -305 1513 -290 ct 1524 -276 1534 -258 1540 -237 ct 1547 -216 1550 -194 1550 -170 ct 1550 -114 1536 -70 1508 -39 ct 1480 -8 1447 7 1408 7 ct 1369 7 1338 -9 1316 -42 ct 1316 0 l p 1316 -167 m 1316 -128 1321 -100 1332 -82 ct 1349 -53 1373 -39 1403 -39 ct 1428 -39 1449 -50 1466 -71 ct 1484 -92 1493 -123 1493 -165 ct 1493 -208 1485 -240 1467 -260 ct 1450 -281 1430 -291 1406 -291 ct 1381 -291 1360 -281 1342 -259 ct 1325 -238 1316 -208 1316 -167 ct p ef 1832 -41 m 1811 -24 1791 -11 1772 -4 ct 1753 3 1732 7 1711 7 ct 1674 7 1647 -2 1627 -20 ct 1608 -37 1598 -60 1598 -87 ct 1598 -103 1602 -118 1609 -131 ct 1616 -145 1626 -156 1638 -164 ct 1650 -172 1663 -178 1678 -182 ct 1689 -185 1705 -188 1728 -190 ct 1773 -196 1806 -202 1827 -209 ct 1827 -217 1827 -222 1827 -224 ct 1827 -247 1822 -263 1812 -272 ct 1797 -285 1776 -291 1748 -291 ct 1722 -291 1702 -286 1690 -277 ct 1677 -268 1668 -252 1662 -228 ct 1608 -236 l 1613 -259 1621 -278 1632 -292 ct 1643 -307 1660 -318 1681 -326 ct 1703 -333 1728 -337 1756 -337 ct 1784 -337 1807 -334 1825 -327 ct 1842 -321 1855 -312 1863 -302 ct 1872 -292 1877 -280 1881 -264 ct 1883 -255 1884 -238 1884 -213 ct 1884 -138 l 1884 -87 1885 -54 1887 -40 ct 1889 -26 1894 -13 1901 0 ct 1843 0 l 1837 -12 1833 -26 1832 -41 ct p 1827 -166 m 1807 -157 1776 -150 1736 -145 ct 1713 -141 1697 -138 1687 -133 ct 1678 -129 1670 -123 1665 -115 ct 1660 -107 1657 -99 1657 -89 ct 1657 -74 1663 -62 1674 -52 ct 1686 -42 1702 -37 1724 -37 ct 1745 -37 1764 -41 1781 -51 ct 1798 -60 1810 -73 1818 -89 ct 1824 -102 1827 -121 1827 -145 ct 1827 -166 l p ef 2183 -121 m 2238 -114 l 2232 -76 2216 -46 2192 -25 ct 2167 -4 2137 7 2101 7 ct 2056 7 2019 -8 1992 -37 ct 1965 -67 1951 -109 1951 -164 ct 1951 -199 1957 -230 1968 -257 ct 1980 -284 1998 -304 2022 -317 ct 2046 -330 2073 -337 2101 -337 ct 2137 -337 2166 -328 2189 -310 ct 2211 -292 2226 -266 2232 -233 ct 2178 -224 l 2173 -247 2164 -263 2151 -274 ct 2138 -286 2122 -291 2103 -291 ct 2075 -291 2052 -281 2035 -261 ct 2017 -241 2008 -209 2008 -165 ct 2008 -121 2017 -89 2034 -69 ct 2051 -49 2073 -39 2100 -39 ct 2122 -39 2140 -46 2155 -59 ct 2170 -72 2179 -93 2183 -121 ct p ef 2286 0 m 2286 -455 l 2342 -455 l 2342 -196 l 2474 -330 l 2546 -330 l 2420 -207 l 2559 0 l 2490 0 l 2381 -169 l 2342 -131 l 2342 0 l 2286 0 l p ef pom gr gr 22600 9500 m 21100 9500 l 21100 8000 l 24100 8000 l 24100 9500 l 22600 9500 l pc gs gs pum 21425 8974 t 50 0 m 50 -455 l 379 -455 l 379 -401 l 110 -401 l 110 -262 l 362 -262 l 362 -209 l 110 -209 l 110 -54 l 389 -54 l 389 0 l 50 0 l p ef 465 0 m 465 -330 l 515 -330 l 515 -283 l 539 -319 574 -337 620 -337 ct 640 -337 658 -333 675 -326 ct 691 -319 704 -310 712 -298 ct 720 -287 726 -273 729 -257 ct 731 -247 732 -229 732 -203 ct 732 0 l 677 0 l 677 -200 l 677 -223 674 -240 670 -252 ct 666 -263 658 -272 647 -279 ct 636 -285 623 -289 608 -289 ct 584 -289 564 -281 547 -266 ct 529 -251 521 -222 521 -180 ct 521 0 l 465 0 l p ef 1032 -121 m 1087 -114 l 1081 -76 1065 -46 1041 -25 ct 1016 -4 986 7 950 7 ct 905 7 868 -8 841 -37 ct 814 -67 800 -109 800 -164 ct 800 -199 806 -230 817 -257 ct 829 -284 847 -304 871 -317 ct 895 -330 922 -337 950 -337 ct 986 -337 1015 -328 1038 -310 ct 1060 -292 1075 -266 1081 -233 ct 1027 -224 l 1022 -247 1013 -263 1000 -274 ct 987 -286 971 -291 952 -291 ct 924 -291 901 -281 884 -261 ct 866 -241 857 -209 857 -165 ct 857 -121 866 -89 883 -69 ct 900 -49 922 -39 949 -39 ct 971 -39 989 -46 1004 -59 ct 1019 -72 1028 -93 1032 -121 ct p ef 1113 -165 m 1113 -226 1130 -271 1164 -301 ct 1192 -325 1227 -337 1268 -337 ct 1313 -337 1350 -322 1378 -293 ct 1407 -263 1422 -222 1422 -170 ct 1422 -127 1415 -94 1403 -70 ct 1390 -45 1371 -27 1347 -13 ct 1323 0 1296 7 1268 7 ct 1221 7 1184 -8 1156 -37 ct 1127 -67 1113 -110 1113 -165 ct p 1170 -165 m 1170 -123 1180 -91 1198 -70 ct 1216 -49 1240 -39 1268 -39 ct 1295 -39 1318 -49 1337 -71 ct 1355 -92 1364 -124 1364 -167 ct 1364 -208 1355 -239 1336 -260 ct 1318 -281 1295 -291 1268 -291 ct 1240 -291 1216 -281 1198 -260 ct 1180 -239 1170 -207 1170 -165 ct p ef 1699 0 m 1699 -42 l 1679 -9 1648 7 1607 7 ct 1581 7 1557 0 1535 -15 ct 1513 -29 1496 -49 1484 -75 ct 1472 -101 1466 -131 1466 -165 ct 1466 -198 1471 -228 1482 -254 ct 1493 -281 1510 -302 1531 -316 ct 1553 -330 1578 -337 1605 -337 ct 1625 -337 1642 -333 1658 -325 ct 1673 -316 1686 -305 1696 -292 ct 1696 -455 l 1751 -455 l 1751 0 l 1699 0 l p 1523 -165 m 1523 -123 1532 -91 1550 -70 ct 1568 -49 1588 -39 1613 -39 ct 1637 -39 1658 -49 1675 -69 ct 1692 -89 1700 -119 1700 -160 ct 1700 -205 1692 -238 1674 -259 ct 1657 -280 1636 -291 1610 -291 ct 1585 -291 1565 -281 1548 -261 ct 1531 -240 1523 -208 1523 -165 ct p ef 2062 -107 m 2120 -99 l 2111 -66 2094 -40 2069 -21 ct 2045 -2 2013 7 1975 7 ct 1927 7 1889 -8 1861 -37 ct 1832 -67 1818 -109 1818 -162 ct 1818 -218 1833 -261 1861 -291 ct 1890 -322 1927 -337 1972 -337 ct 2016 -337 2052 -322 2080 -292 ct 2108 -262 2122 -220 2122 -166 ct 2122 -163 2122 -158 2121 -151 ct 1876 -151 l 1878 -115 1888 -87 1907 -68 ct 1925 -49 1948 -39 1975 -39 ct 1996 -39 2013 -44 2028 -55 ct 2042 -66 2054 -83 2062 -107 ct p 1879 -197 m 2063 -197 l 2060 -225 2053 -245 2042 -259 ct 2024 -280 2001 -291 1973 -291 ct 1947 -291 1925 -283 1908 -265 ct 1891 -248 1881 -226 1879 -197 ct p ef 2187 0 m 2187 -330 l 2237 -330 l 2237 -280 l 2250 -303 2262 -318 2273 -326 ct 2284 -333 2296 -337 2309 -337 ct 2328 -337 2347 -331 2366 -319 ct 2347 -267 l 2333 -275 2320 -279 2306 -279 ct 2294 -279 2283 -276 2273 -268 ct 2263 -261 2256 -251 2252 -238 ct 2246 -218 2243 -196 2243 -173 ct 2243 0 l 2187 0 l p ef pom gr gr 17400 13500 m 15900 13500 l 15900 12000 l 18900 12000 l 18900 13500 l 17400 13500 l pc gs gs pum 16195 12970 t 49 0 m 49 -455 l 206 -455 l 241 -455 268 -453 287 -448 ct 313 -442 335 -432 353 -416 ct 377 -396 395 -370 407 -338 ct 419 -307 425 -271 425 -230 ct 425 -195 421 -165 413 -138 ct 405 -111 394 -89 382 -72 ct 369 -54 355 -41 340 -31 ct 325 -21 307 -13 286 -8 ct 265 -3 241 0 213 0 ct 49 0 l p 109 -54 m 206 -54 l 236 -54 260 -56 277 -62 ct 294 -68 307 -76 318 -86 ct 332 -100 343 -119 351 -143 ct 359 -167 363 -197 363 -231 ct 363 -279 355 -315 339 -341 ct 324 -366 305 -383 282 -392 ct 266 -398 240 -401 205 -401 ct 109 -401 l 109 -54 l p ef 724 -107 m 782 -99 l 773 -66 756 -40 731 -21 ct 707 -2 675 7 637 7 ct 589 7 551 -8 523 -37 ct 494 -67 480 -109 480 -162 ct 480 -218 495 -261 523 -291 ct 552 -322 589 -337 634 -337 ct 678 -337 714 -322 742 -292 ct 770 -262 784 -220 784 -166 ct 784 -163 784 -158 783 -151 ct 538 -151 l 540 -115 550 -87 569 -68 ct 587 -49 610 -39 637 -39 ct 658 -39 675 -44 690 -55 ct 704 -66 716 -83 724 -107 ct p 541 -197 m 725 -197 l 722 -225 715 -245 704 -259 ct 686 -280 663 -291 635 -291 ct 609 -291 587 -283 570 -265 ct 553 -248 543 -226 541 -197 ct p ef 1066 -121 m 1121 -114 l 1115 -76 1099 -46 1075 -25 ct 1050 -4 1020 7 984 7 ct 939 7 902 -8 875 -37 ct 848 -67 834 -109 834 -164 ct 834 -199 840 -230 851 -257 ct 863 -284 881 -304 905 -317 ct 929 -330 956 -337 984 -337 ct 1020 -337 1049 -328 1072 -310 ct 1094 -292 1109 -266 1115 -233 ct 1061 -224 l 1056 -247 1047 -263 1034 -274 ct 1021 -286 1005 -291 986 -291 ct 958 -291 935 -281 918 -261 ct 900 -241 891 -209 891 -165 ct 891 -121 900 -89 917 -69 ct 934 -49 956 -39 983 -39 ct 1005 -39 1023 -46 1038 -59 ct 1053 -72 1062 -93 1066 -121 ct p ef 1147 -165 m 1147 -226 1164 -271 1198 -301 ct 1226 -325 1261 -337 1302 -337 ct 1347 -337 1384 -322 1412 -293 ct 1441 -263 1456 -222 1456 -170 ct 1456 -127 1449 -94 1437 -70 ct 1424 -45 1405 -27 1381 -13 ct 1357 0 1330 7 1302 7 ct 1255 7 1218 -8 1190 -37 ct 1161 -67 1147 -110 1147 -165 ct p 1204 -165 m 1204 -123 1214 -91 1232 -70 ct 1250 -49 1274 -39 1302 -39 ct 1329 -39 1352 -49 1371 -71 ct 1389 -92 1398 -124 1398 -167 ct 1398 -208 1389 -239 1370 -260 ct 1352 -281 1329 -291 1302 -291 ct 1274 -291 1250 -281 1232 -260 ct 1214 -239 1204 -207 1204 -165 ct p ef 1732 0 m 1732 -42 l 1712 -9 1681 7 1640 7 ct 1614 7 1590 0 1568 -15 ct 1546 -29 1529 -49 1517 -75 ct 1505 -101 1499 -131 1499 -165 ct 1499 -198 1504 -228 1515 -254 ct 1526 -281 1543 -302 1564 -316 ct 1586 -330 1611 -337 1638 -337 ct 1658 -337 1675 -333 1691 -325 ct 1706 -316 1719 -305 1729 -292 ct 1729 -455 l 1784 -455 l 1784 0 l 1732 0 l p 1556 -165 m 1556 -123 1565 -91 1583 -70 ct 1601 -49 1621 -39 1646 -39 ct 1670 -39 1691 -49 1708 -69 ct 1725 -89 1733 -119 1733 -160 ct 1733 -205 1725 -238 1707 -259 ct 1690 -280 1669 -291 1643 -291 ct 1618 -291 1598 -281 1581 -261 ct 1564 -240 1556 -208 1556 -165 ct p ef 2096 -107 m 2154 -99 l 2145 -66 2128 -40 2103 -21 ct 2079 -2 2047 7 2009 7 ct 1961 7 1923 -8 1895 -37 ct 1866 -67 1852 -109 1852 -162 ct 1852 -218 1867 -261 1895 -291 ct 1924 -322 1961 -337 2006 -337 ct 2050 -337 2086 -322 2114 -292 ct 2142 -262 2156 -220 2156 -166 ct 2156 -163 2156 -158 2155 -151 ct 1910 -151 l 1912 -115 1922 -87 1941 -68 ct 1959 -49 1982 -39 2009 -39 ct 2030 -39 2047 -44 2062 -55 ct 2076 -66 2088 -83 2096 -107 ct p 1913 -197 m 2097 -197 l 2094 -225 2087 -245 2076 -259 ct 2058 -280 2035 -291 2007 -291 ct 1981 -291 1959 -283 1942 -265 ct 1925 -248 1915 -226 1913 -197 ct p ef 2221 0 m 2221 -330 l 2271 -330 l 2271 -280 l 2284 -303 2296 -318 2307 -326 ct 2318 -333 2330 -337 2343 -337 ct 2362 -337 2381 -331 2400 -319 ct 2381 -267 l 2367 -275 2354 -279 2340 -279 ct 2328 -279 2317 -276 2307 -268 ct 2297 -261 2290 -251 2286 -238 ct 2280 -218 2277 -196 2277 -173 ct 2277 0 l 2221 0 l p ef pom gr gr 22600 13500 m 21100 13500 l 21100 12000 l 24100 12000 l 24100 13500 l 22600 13500 l pc gs gs pum 21916 12626 t 18 -129 m 73 -136 l 74 -102 81 -78 92 -65 ct 104 -52 120 -46 140 -46 ct 155 -46 168 -49 179 -56 ct 190 -63 198 -72 202 -84 ct 206 -96 208 -115 208 -141 ct 208 -455 l 268 -455 l 268 -145 l 268 -107 264 -77 254 -56 ct 245 -35 231 -19 211 -8 ct 191 3 167 8 140 8 ct 101 8 70 -3 49 -26 ct 28 -49 17 -84 18 -129 ct p ef 360 -391 m 360 -455 l 416 -455 l 416 -391 l 360 -391 l p 360 0 m 360 -330 l 416 -330 l 416 0 l 360 0 l p ef 621 -50 m 629 -1 l 613 2 599 4 587 4 ct 566 4 551 1 539 -6 ct 528 -12 520 -20 516 -31 ct 511 -41 509 -63 509 -97 ct 509 -287 l 468 -287 l 468 -330 l 509 -330 l 509 -412 l 565 -445 l 565 -330 l 621 -330 l 621 -287 l 565 -287 l 565 -94 l 565 -78 566 -68 568 -63 ct 570 -58 573 -55 577 -52 ct 582 -49 588 -48 596 -48 ct 602 -48 611 -49 621 -50 ct p ef 799 -50 m 807 -1 l 791 2 777 4 765 4 ct 744 4 729 1 717 -6 ct 706 -12 698 -20 694 -31 ct 689 -41 687 -63 687 -97 ct 687 -287 l 646 -287 l 646 -330 l 687 -330 l 687 -412 l 743 -445 l 743 -330 l 799 -330 l 799 -287 l 743 -287 l 743 -94 l 743 -78 744 -68 746 -63 ct 748 -58 751 -55 755 -52 ct 760 -49 766 -48 774 -48 ct 780 -48 789 -49 799 -50 ct p ef 1080 -107 m 1138 -99 l 1129 -66 1112 -40 1087 -21 ct 1063 -2 1031 7 993 7 ct 945 7 907 -8 879 -37 ct 850 -67 836 -109 836 -162 ct 836 -218 851 -261 879 -291 ct 908 -322 945 -337 990 -337 ct 1034 -337 1070 -322 1098 -292 ct 1126 -262 1140 -220 1140 -166 ct 1140 -163 1140 -158 1139 -151 ct 894 -151 l 896 -115 906 -87 925 -68 ct 943 -49 966 -39 993 -39 ct 1014 -39 1031 -44 1046 -55 ct 1060 -66 1072 -83 1080 -107 ct p 897 -197 m 1081 -197 l 1078 -225 1071 -245 1060 -259 ct 1042 -280 1019 -291 991 -291 ct 965 -291 943 -283 926 -265 ct 909 -248 899 -226 897 -197 ct p ef 1205 0 m 1205 -330 l 1255 -330 l 1255 -280 l 1268 -303 1280 -318 1291 -326 ct 1302 -333 1314 -337 1327 -337 ct 1346 -337 1365 -331 1384 -319 ct 1365 -267 l 1351 -275 1338 -279 1324 -279 ct 1312 -279 1301 -276 1291 -268 ct 1281 -261 1274 -251 1270 -238 ct 1264 -218 1261 -196 1261 -173 ct 1261 0 l 1205 0 l p ef pom gr gs pum 21764 13337 t 47 0 m 47 -455 l 217 -455 l 252 -455 280 -450 301 -441 ct 322 -432 338 -418 350 -399 ct 362 -380 368 -359 368 -339 ct 368 -319 362 -301 352 -284 ct 341 -266 325 -253 304 -242 ct 332 -234 353 -220 368 -201 ct 382 -181 390 -158 390 -132 ct 390 -111 385 -91 376 -72 ct 367 -54 356 -40 343 -30 ct 330 -20 313 -13 293 -8 ct 273 -3 249 0 220 0 ct 47 0 l p 107 -264 m 205 -264 l 232 -264 251 -265 262 -269 ct 278 -274 289 -281 297 -292 ct 305 -302 309 -315 309 -331 ct 309 -347 305 -360 298 -371 ct 290 -383 280 -391 267 -395 ct 253 -399 230 -401 198 -401 ct 107 -401 l 107 -264 l p 107 -54 m 220 -54 l 239 -54 253 -54 261 -56 ct 275 -58 286 -62 295 -68 ct 305 -74 312 -82 318 -94 ct 324 -105 327 -117 327 -132 ct 327 -149 323 -164 314 -176 ct 306 -189 294 -197 278 -202 ct 263 -207 241 -210 212 -210 ct 107 -210 l 107 -54 l p ef 681 0 m 681 -49 l 655 -12 620 7 576 7 ct 557 7 539 3 522 -4 ct 505 -12 492 -21 484 -32 ct 476 -44 470 -57 467 -74 ct 465 -85 464 -102 464 -126 ct 464 -330 l 519 -330 l 519 -147 l 519 -118 521 -98 523 -88 ct 526 -74 534 -62 545 -54 ct 557 -45 571 -41 587 -41 ct 604 -41 620 -45 634 -54 ct 649 -63 660 -74 666 -89 ct 672 -104 675 -125 675 -153 ct 675 -330 l 731 -330 l 731 0 l 681 0 l p ef 830 0 m 830 -286 l 781 -286 l 781 -329 l 830 -329 l 830 -364 l 830 -387 832 -403 836 -414 ct 841 -428 851 -440 864 -449 ct 878 -458 897 -462 921 -462 ct 937 -462 954 -460 973 -457 ct 965 -408 l 953 -410 943 -411 932 -411 ct 915 -411 903 -407 896 -400 ct 889 -393 886 -379 886 -360 ct 886 -329 l 950 -329 l 950 -286 l 886 -286 l 886 0 l 830 0 l p ef 995 0 m 995 -286 l 946 -286 l 946 -329 l 995 -329 l 995 -364 l 995 -387 997 -403 1001 -414 ct 1006 -428 1016 -440 1029 -449 ct 1043 -458 1062 -462 1086 -462 ct 1102 -462 1119 -460 1138 -457 ct 1130 -408 l 1118 -410 1108 -411 1097 -411 ct 1080 -411 1068 -407 1061 -400 ct 1054 -393 1051 -379 1051 -360 ct 1051 -329 l 1115 -329 l 1115 -286 l 1051 -286 l 1051 0 l 995 0 l p ef 1385 -107 m 1443 -99 l 1434 -66 1417 -40 1392 -21 ct 1368 -2 1336 7 1298 7 ct 1250 7 1212 -8 1184 -37 ct 1155 -67 1141 -109 1141 -162 ct 1141 -218 1156 -261 1184 -291 ct 1213 -322 1250 -337 1295 -337 ct 1339 -337 1375 -322 1403 -292 ct 1431 -262 1445 -220 1445 -166 ct 1445 -163 1445 -158 1444 -151 ct 1199 -151 l 1201 -115 1211 -87 1230 -68 ct 1248 -49 1271 -39 1298 -39 ct 1319 -39 1336 -44 1351 -55 ct 1365 -66 1377 -83 1385 -107 ct p 1202 -197 m 1386 -197 l 1383 -225 1376 -245 1365 -259 ct 1347 -280 1324 -291 1296 -291 ct 1270 -291 1248 -283 1231 -265 ct 1214 -248 1204 -226 1202 -197 ct p ef 1510 0 m 1510 -330 l 1560 -330 l 1560 -280 l 1573 -303 1585 -318 1596 -326 ct 1607 -333 1619 -337 1632 -337 ct 1651 -337 1670 -331 1689 -319 ct 1670 -267 l 1656 -275 1643 -279 1629 -279 ct 1617 -279 1606 -276 1596 -268 ct 1586 -261 1579 -251 1575 -238 ct 1569 -218 1566 -196 1566 -173 ct 1566 0 l 1510 0 l p ef pom gr gr 7100 8750 m 6538 8938 l 6538 8563 l 7100 8750 l p ef 5900 8725 m 6650 8725 l 6650 8775 l 5900 8775 l 5900 8725 l p ef 15400 8750 m 14838 8938 l 14838 8563 l 15400 8750 l p ef 14300 8725 m 14950 8725 l 14950 8775 l 14300 8775 l 14300 8725 l p ef 21100 8750 m 20538 8938 l 20538 8563 l 21100 8750 l p ef 19800 8725 m 20650 8725 l 20650 8775 l 19800 8775 l 19800 8725 l p ef 10500 12750 m 11063 12563 l 11063 12938 l 10500 12750 l p ef 15900 12775 m 10950 12775 l 10950 12725 l 15900 12725 l 15900 12775 l p ef 18900 12750 m 19463 12563 l 19463 12938 l 18900 12750 l p ef 21100 12775 m 19350 12775 l 19350 12725 l 21100 12725 l 21100 12775 l p ef 12850 9500 m 13038 10063 l 12663 10063 l 12850 9500 l p ef 15900 12775 m 12850 12775 l 12850 12750 l 12850 12725 l 15900 12725 l 15900 12750 l 15900 12775 l p ef 12850 12750 m 12850 12775 l 12846 12775 l 12841 12773 l 12838 12772 l 12834 12769 l 12831 12766 l 12828 12763 l 12827 12759 l 12825 12754 l 12825 12750 l 12825 12750 l 12850 12750 l p ef 12825 12750 m 12825 9950 l 12850 9950 l 12875 9950 l 12875 12750 l 12850 12750 l 12825 12750 l p ef 1225 13350 m 1000 13350 l 1000 12150 l 1450 12150 l 1450 13350 l 1225 13350 l pc 500 14050 m 500 11549 l 1001 12175 l 1001 13425 l 500 14050 l pc 1450 12750 m 2013 12563 l 2013 12938 l 1450 12750 l p ef 2900 12775 m 1900 12775 l 1900 12725 l 2900 12725 l 2900 12775 l p ef 24100 12750 m 24663 12563 l 24663 12938 l 24100 12750 l p ef 25100 12775 m 24550 12775 l 24550 12725 l 25100 12725 l 25100 12775 l p ef 25100 8750 m 24538 8938 l 24538 8563 l 25100 8750 l p ef 24100 8725 m 24650 8725 l 24650 8775 l 24100 8775 l 24100 8725 l p ef 1000 9250 m 724 9250 500 9026 500 8750 ct 500 8474 724 8250 1000 8250 ct 1276 8250 1500 8474 1500 8750 ct 1500 9026 1276 9250 1000 9250 ct pc 500 8250 m 500 9250 l ps 2900 8750 m 2338 8938 l 2338 8563 l 2900 8750 l p ef 1500 8724 m 2200 8724 l 2200 8749 l 2200 8774 l 1500 8774 l 1500 8749 l 1500 8724 l p ef 2200 8749 m 2200 8724 l 2204 8724 l 2209 8726 l 2212 8727 l 2216 8730 l 2219 8733 l 2222 8736 l 2223 8740 l 2225 8745 l 2225 8749 l 2225 8749 l 2200 8749 l p ef 2225 8749 m 2225 8750 l 2200 8750 l 2175 8750 l 2175 8749 l 2200 8749 l 2225 8749 l p ef 2200 8750 m 2200 8775 l 2196 8775 l 2191 8773 l 2188 8772 l 2184 8769 l 2181 8766 l 2178 8763 l 2177 8759 l 2175 8754 l 2175 8750 l 2175 8750 l 2200 8750 l p ef 2200 8725 m 2450 8725 l 2450 8750 l 2450 8775 l 2200 8775 l 2200 8750 l 2200 8725 l p ef 4400 9500 m 4588 10063 l 4213 10063 l 4400 9500 l p ef 4400 12000 m 4213 11438 l 4588 11438 l 4400 12000 l p ef 4425 9950 m 4425 11550 l 4375 11550 l 4375 9950 l 4425 9950 l p ef 8698 9525 m 8647 9525 l 8647 9475 l 8698 9475 l 8698 9525 l p ef 8596 9525 m 8545 9525 l 8545 9475 l 8596 9475 l 8596 9525 l p ef 8494 9525 m 8443 9525 l 8443 9475 l 8494 9475 l 8494 9525 l p ef 8392 9525 m 8341 9525 l 8341 9475 l 8392 9475 l 8392 9525 l p ef 8290 9525 m 8239 9525 l 8239 9475 l 8290 9475 l 8290 9525 l p ef 8188 9525 m 8137 9525 l 8137 9475 l 8188 9475 l 8188 9525 l p ef 8086 9525 m 8035 9525 l 8035 9475 l 8086 9475 l 8086 9525 l p ef 7984 9525 m 7933 9525 l 7933 9475 l 7984 9475 l 7984 9525 l p ef 7882 9525 m 7831 9525 l 7831 9475 l 7882 9475 l 7882 9525 l p ef 7780 9525 m 7729 9525 l 7729 9475 l 7780 9475 l 7780 9525 l p ef 7678 9525 m 7627 9525 l 7627 9475 l 7678 9475 l 7678 9525 l p ef 7576 9525 m 7525 9525 l 7525 9475 l 7576 9475 l 7576 9525 l p ef 7474 9525 m 7423 9525 l 7423 9475 l 7474 9475 l 7474 9525 l p ef 7372 9525 m 7321 9525 l 7321 9475 l 7372 9475 l 7372 9525 l p ef 7270 9525 m 7219 9525 l 7219 9475 l 7270 9475 l 7270 9525 l p ef 7168 9525 m 7117 9525 l 7117 9475 l 7168 9475 l 7168 9525 l p ef 7075 9466 m 7075 9415 l 7125 9415 l 7125 9466 l 7075 9466 l p ef 7075 9364 m 7075 9313 l 7125 9313 l 7125 9364 l 7075 9364 l p ef 7075 9262 m 7075 9211 l 7125 9211 l 7125 9262 l 7075 9262 l p ef 7075 9160 m 7075 9109 l 7125 9109 l 7125 9160 l 7075 9160 l p ef 7075 9058 m 7075 9007 l 7125 9007 l 7125 9058 l 7075 9058 l p ef 7075 8956 m 7075 8905 l 7125 8905 l 7125 8956 l 7075 8956 l p ef 7075 8854 m 7075 8803 l 7125 8803 l 7125 8854 l 7075 8854 l p ef 7075 8752 m 7075 8701 l 7125 8701 l 7125 8752 l 7075 8752 l p ef 7075 8650 m 7075 8599 l 7125 8599 l 7125 8650 l 7075 8650 l p ef 7075 8548 m 7075 8497 l 7125 8497 l 7125 8548 l 7075 8548 l p ef 7075 8446 m 7075 8395 l 7125 8395 l 7125 8446 l 7075 8446 l p ef 7075 8344 m 7075 8293 l 7125 8293 l 7125 8344 l 7075 8344 l p ef 7075 8242 m 7075 8191 l 7125 8191 l 7125 8242 l 7075 8242 l p ef 7075 8140 m 7075 8089 l 7125 8089 l 7125 8140 l 7075 8140 l p ef 7075 8038 m 7075 8000 l 7100 8000 l 7125 8000 l 7125 8038 l 7100 8038 l 7075 8038 l p ef 7100 8000 m 7075 8000 l 7075 7996 l 7077 7991 l 7078 7988 l 7081 7984 l 7084 7981 l 7087 7978 l 7091 7977 l 7096 7975 l 7100 7975 l 7100 7975 l 7100 8000 l p ef 7100 7975 m 7113 7975 l 7113 8000 l 7113 8025 l 7100 8025 l 7100 8000 l 7100 7975 l p ef 7164 7975 m 7215 7975 l 7215 8025 l 7164 8025 l 7164 7975 l p ef 7266 7975 m 7317 7975 l 7317 8025 l 7266 8025 l 7266 7975 l p ef 7368 7975 m 7419 7975 l 7419 8025 l 7368 8025 l 7368 7975 l p ef 7470 7975 m 7521 7975 l 7521 8025 l 7470 8025 l 7470 7975 l p ef 7572 7975 m 7623 7975 l 7623 8025 l 7572 8025 l 7572 7975 l p ef 7674 7975 m 7725 7975 l 7725 8025 l 7674 8025 l 7674 7975 l p ef 7776 7975 m 7827 7975 l 7827 8025 l 7776 8025 l 7776 7975 l p ef 7878 7975 m 7929 7975 l 7929 8025 l 7878 8025 l 7878 7975 l p ef 7980 7975 m 8031 7975 l 8031 8025 l 7980 8025 l 7980 7975 l p ef 8082 7975 m 8133 7975 l 8133 8025 l 8082 8025 l 8082 7975 l p ef 8184 7975 m 8235 7975 l 8235 8025 l 8184 8025 l 8184 7975 l p ef 8286 7975 m 8337 7975 l 8337 8025 l 8286 8025 l 8286 7975 l p ef 8388 7975 m 8439 7975 l 8439 8025 l 8388 8025 l 8388 7975 l p ef 8490 7975 m 8541 7975 l 8541 8025 l 8490 8025 l 8490 7975 l p ef 8592 7975 m 8643 7975 l 8643 8025 l 8592 8025 l 8592 7975 l p ef 8694 7975 m 8745 7975 l 8745 8025 l 8694 8025 l 8694 7975 l p ef 8796 7975 m 8847 7975 l 8847 8025 l 8796 8025 l 8796 7975 l p ef 8898 7975 m 8949 7975 l 8949 8025 l 8898 8025 l 8898 7975 l p ef 9000 7975 m 9051 7975 l 9051 8025 l 9000 8025 l 9000 7975 l p ef 9102 7975 m 9153 7975 l 9153 8025 l 9102 8025 l 9102 7975 l p ef 9204 7975 m 9255 7975 l 9255 8025 l 9204 8025 l 9204 7975 l p ef 9306 7975 m 9357 7975 l 9357 8025 l 9306 8025 l 9306 7975 l p ef 9408 7975 m 9459 7975 l 9459 8025 l 9408 8025 l 9408 7975 l p ef 9510 7975 m 9561 7975 l 9561 8025 l 9510 8025 l 9510 7975 l p ef 9612 7975 m 9663 7975 l 9663 8025 l 9612 8025 l 9612 7975 l p ef 9714 7975 m 9765 7975 l 9765 8025 l 9714 8025 l 9714 7975 l p ef 9816 7975 m 9867 7975 l 9867 8025 l 9816 8025 l 9816 7975 l p ef 9918 7975 m 9969 7975 l 9969 8025 l 9918 8025 l 9918 7975 l p ef 10020 7975 m 10071 7975 l 10071 8025 l 10020 8025 l 10020 7975 l p ef 10122 7975 m 10173 7975 l 10173 8025 l 10122 8025 l 10122 7975 l p ef 10224 7975 m 10275 7975 l 10275 8025 l 10224 8025 l 10224 7975 l p ef 10326 7975 m 10377 7975 l 10377 8025 l 10326 8025 l 10326 7975 l p ef 10428 7975 m 10479 7975 l 10479 8025 l 10428 8025 l 10428 7975 l p ef 10525 8030 m 10525 8081 l 10475 8081 l 10475 8030 l 10525 8030 l p ef 10525 8132 m 10525 8183 l 10475 8183 l 10475 8132 l 10525 8132 l p ef 10525 8234 m 10525 8285 l 10475 8285 l 10475 8234 l 10525 8234 l p ef 10525 8336 m 10525 8387 l 10475 8387 l 10475 8336 l 10525 8336 l p ef 10525 8438 m 10525 8489 l 10475 8489 l 10475 8438 l 10525 8438 l p ef 10525 8540 m 10525 8591 l 10475 8591 l 10475 8540 l 10525 8540 l p ef 10525 8642 m 10525 8693 l 10475 8693 l 10475 8642 l 10525 8642 l p ef 10525 8744 m 10525 8795 l 10475 8795 l 10475 8744 l 10525 8744 l p ef 10525 8846 m 10525 8897 l 10475 8897 l 10475 8846 l 10525 8846 l p ef 10525 8948 m 10525 8999 l 10475 8999 l 10475 8948 l 10525 8948 l p ef 10525 9050 m 10525 9101 l 10475 9101 l 10475 9050 l 10525 9050 l p ef 10525 9152 m 10525 9203 l 10475 9203 l 10475 9152 l 10525 9152 l p ef 10525 9254 m 10525 9305 l 10475 9305 l 10475 9254 l 10525 9254 l p ef 10525 9356 m 10525 9407 l 10475 9407 l 10475 9356 l 10525 9356 l p ef 10525 9458 m 10525 9500 l 10500 9500 l 10475 9500 l 10475 9458 l 10500 9458 l 10525 9458 l p ef 10500 9500 m 10525 9500 l 10525 9504 l 10523 9509 l 10522 9512 l 10519 9516 l 10516 9519 l 10513 9522 l 10509 9523 l 10504 9525 l 10500 9525 l 10500 9525 l 10500 9500 l p ef 10500 9525 m 10491 9525 l 10491 9500 l 10491 9475 l 10500 9475 l 10500 9500 l 10500 9525 l p ef 10440 9525 m 10389 9525 l 10389 9475 l 10440 9475 l 10440 9525 l p ef 10338 9525 m 10287 9525 l 10287 9475 l 10338 9475 l 10338 9525 l p ef 10236 9525 m 10185 9525 l 10185 9475 l 10236 9475 l 10236 9525 l p ef 10134 9525 m 10083 9525 l 10083 9475 l 10134 9475 l 10134 9525 l p ef 10032 9525 m 9981 9525 l 9981 9475 l 10032 9475 l 10032 9525 l p ef 9930 9525 m 9879 9525 l 9879 9475 l 9930 9475 l 9930 9525 l p ef 9828 9525 m 9777 9525 l 9777 9475 l 9828 9475 l 9828 9525 l p ef 9726 9525 m 9675 9525 l 9675 9475 l 9726 9475 l 9726 9525 l p ef 9624 9525 m 9573 9525 l 9573 9475 l 9624 9475 l 9624 9525 l p ef 9522 9525 m 9471 9525 l 9471 9475 l 9522 9475 l 9522 9525 l p ef 9420 9525 m 9369 9525 l 9369 9475 l 9420 9475 l 9420 9525 l p ef 9318 9525 m 9267 9525 l 9267 9475 l 9318 9475 l 9318 9525 l p ef 9216 9525 m 9165 9525 l 9165 9475 l 9216 9475 l 9216 9525 l p ef 9114 9525 m 9063 9525 l 9063 9475 l 9114 9475 l 9114 9525 l p ef 9012 9525 m 8961 9525 l 8961 9475 l 9012 9475 l 9012 9525 l p ef 8910 9525 m 8859 9525 l 8859 9475 l 8910 9475 l 8910 9525 l p ef 8808 9525 m 8800 9525 l 8800 9500 l 8800 9475 l 8808 9475 l 8808 9500 l 8808 9525 l p ef 8800 9525 m 8749 9525 l 8749 9500 l 8749 9475 l 8800 9475 l 8800 9500 l 8800 9525 l p ef gs gs pum 7276 8974 t 50 0 m 50 -455 l 251 -455 l 292 -455 323 -451 344 -443 ct 365 -435 382 -420 394 -399 ct 407 -379 413 -356 413 -331 ct 413 -299 403 -271 382 -249 ct 361 -227 329 -213 285 -207 ct 301 -199 313 -192 322 -184 ct 339 -168 356 -148 371 -124 ct 451 0 l 375 0 l 315 -95 l 297 -122 283 -143 271 -157 ct 260 -172 250 -182 241 -188 ct 232 -194 223 -198 213 -200 ct 207 -201 195 -202 180 -202 ct 110 -202 l 110 0 l 50 0 l p 110 -254 m 239 -254 l 267 -254 288 -257 304 -263 ct 319 -268 331 -277 339 -290 ct 347 -303 351 -316 351 -331 ct 351 -352 344 -370 328 -384 ct 312 -398 288 -405 254 -405 ct 110 -405 l 110 -254 l p ef 724 -107 m 782 -99 l 773 -66 756 -40 731 -21 ct 707 -2 675 7 637 7 ct 589 7 551 -8 523 -37 ct 494 -67 480 -109 480 -162 ct 480 -218 495 -261 523 -291 ct 552 -322 589 -337 634 -337 ct 678 -337 714 -322 742 -292 ct 770 -262 784 -220 784 -166 ct 784 -163 784 -158 783 -151 ct 538 -151 l 540 -115 550 -87 569 -68 ct 587 -49 610 -39 637 -39 ct 658 -39 675 -44 690 -55 ct 704 -66 716 -83 724 -107 ct p 541 -197 m 725 -197 l 722 -225 715 -245 704 -259 ct 686 -280 663 -291 635 -291 ct 609 -291 587 -283 570 -265 ct 553 -248 543 -226 541 -197 ct p ef 829 -99 m 884 -107 l 887 -85 895 -68 910 -57 ct 924 -45 944 -39 969 -39 ct 995 -39 1014 -44 1026 -55 ct 1038 -65 1045 -77 1045 -91 ct 1045 -104 1039 -114 1028 -121 ct 1021 -126 1002 -132 971 -140 ct 930 -150 902 -159 886 -167 ct 870 -174 858 -185 850 -198 ct 842 -211 838 -226 838 -242 ct 838 -257 841 -270 848 -283 ct 855 -295 864 -306 875 -314 ct 884 -320 896 -326 911 -330 ct 926 -335 942 -337 959 -337 ct 985 -337 1008 -333 1027 -326 ct 1047 -318 1061 -308 1070 -296 ct 1080 -283 1086 -266 1090 -245 ct 1035 -237 l 1033 -254 1025 -267 1013 -277 ct 1002 -286 985 -291 963 -291 ct 937 -291 919 -287 908 -278 ct 897 -270 892 -260 892 -249 ct 892 -241 894 -235 899 -229 ct 903 -223 910 -218 920 -214 ct 926 -212 942 -207 969 -200 ct 1009 -189 1036 -181 1052 -174 ct 1068 -167 1080 -158 1089 -145 ct 1098 -132 1102 -116 1102 -97 ct 1102 -79 1097 -61 1086 -45 ct 1075 -28 1059 -15 1039 -6 ct 1018 3 995 7 969 7 ct 927 7 894 -2 871 -20 ct 849 -37 835 -64 829 -99 ct p ef 1383 -41 m 1362 -24 1342 -11 1323 -4 ct 1304 3 1283 7 1262 7 ct 1225 7 1198 -2 1178 -20 ct 1159 -37 1149 -60 1149 -87 ct 1149 -103 1153 -118 1160 -131 ct 1167 -145 1177 -156 1189 -164 ct 1201 -172 1214 -178 1229 -182 ct 1240 -185 1256 -188 1279 -190 ct 1324 -196 1357 -202 1378 -209 ct 1378 -217 1378 -222 1378 -224 ct 1378 -247 1373 -263 1363 -272 ct 1348 -285 1327 -291 1299 -291 ct 1273 -291 1253 -286 1241 -277 ct 1228 -268 1219 -252 1213 -228 ct 1159 -236 l 1164 -259 1172 -278 1183 -292 ct 1194 -307 1211 -318 1232 -326 ct 1254 -333 1279 -337 1307 -337 ct 1335 -337 1358 -334 1376 -327 ct 1393 -321 1406 -312 1414 -302 ct 1423 -292 1428 -280 1432 -264 ct 1434 -255 1435 -238 1435 -213 ct 1435 -138 l 1435 -87 1436 -54 1438 -40 ct 1440 -26 1445 -13 1452 0 ct 1394 0 l 1388 -12 1384 -26 1383 -41 ct p 1378 -166 m 1358 -157 1327 -150 1287 -145 ct 1264 -141 1248 -138 1238 -133 ct 1229 -129 1221 -123 1216 -115 ct 1211 -107 1208 -99 1208 -89 ct 1208 -74 1214 -62 1225 -52 ct 1237 -42 1253 -37 1275 -37 ct 1296 -37 1315 -41 1332 -51 ct 1349 -60 1361 -73 1369 -89 ct 1375 -102 1378 -121 1378 -145 ct 1378 -166 l p ef 1519 0 m 1519 -330 l 1569 -330 l 1569 -283 l 1579 -299 1593 -312 1610 -322 ct 1627 -332 1647 -337 1669 -337 ct 1693 -337 1713 -332 1729 -322 ct 1744 -312 1755 -297 1762 -279 ct 1788 -318 1822 -337 1863 -337 ct 1896 -337 1921 -328 1939 -310 ct 1956 -292 1965 -264 1965 -226 ct 1965 0 l 1910 0 l 1910 -208 l 1910 -230 1908 -246 1904 -256 ct 1901 -266 1894 -274 1884 -280 ct 1875 -286 1864 -289 1851 -289 ct 1828 -289 1809 -281 1793 -265 ct 1778 -250 1770 -225 1770 -191 ct 1770 0 l 1715 0 l 1715 -214 l 1715 -239 1710 -258 1701 -270 ct 1692 -282 1677 -289 1656 -289 ct 1641 -289 1626 -284 1613 -276 ct 1599 -268 1590 -256 1584 -240 ct 1578 -224 1575 -201 1575 -171 ct 1575 0 l 1519 0 l p ef 2049 126 m 2049 -330 l 2100 -330 l 2100 -287 l 2112 -304 2125 -316 2140 -324 ct 2155 -333 2174 -337 2195 -337 ct 2223 -337 2248 -330 2270 -315 ct 2291 -301 2307 -280 2318 -254 ct 2329 -228 2335 -199 2335 -167 ct 2335 -134 2329 -103 2317 -77 ct 2305 -50 2287 -29 2264 -15 ct 2241 0 2217 7 2191 7 ct 2173 7 2156 3 2141 -5 ct 2126 -13 2114 -23 2105 -35 ct 2105 126 l 2049 126 l p 2099 -163 m 2099 -121 2108 -90 2125 -69 ct 2142 -49 2163 -39 2187 -39 ct 2212 -39 2234 -49 2251 -70 ct 2269 -91 2278 -124 2278 -168 ct 2278 -210 2269 -241 2252 -262 ct 2235 -283 2214 -293 2190 -293 ct 2166 -293 2145 -282 2127 -260 ct 2109 -238 2099 -205 2099 -163 ct p ef 2399 0 m 2399 -455 l 2454 -455 l 2454 0 l 2399 0 l p ef 2765 -107 m 2823 -99 l 2814 -66 2797 -40 2772 -21 ct 2748 -2 2716 7 2678 7 ct 2630 7 2592 -8 2564 -37 ct 2535 -67 2521 -109 2521 -162 ct 2521 -218 2536 -261 2564 -291 ct 2593 -322 2630 -337 2675 -337 ct 2719 -337 2755 -322 2783 -292 ct 2811 -262 2825 -220 2825 -166 ct 2825 -163 2825 -158 2824 -151 ct 2579 -151 l 2581 -115 2591 -87 2610 -68 ct 2628 -49 2651 -39 2678 -39 ct 2699 -39 2716 -44 2731 -55 ct 2745 -66 2757 -83 2765 -107 ct p 2582 -197 m 2766 -197 l 2763 -225 2756 -245 2745 -259 ct 2727 -280 2704 -291 2676 -291 ct 2650 -291 2628 -283 2611 -265 ct 2594 -248 2584 -226 2582 -197 ct p ef 2890 0 m 2890 -330 l 2940 -330 l 2940 -280 l 2953 -303 2965 -318 2976 -326 ct 2987 -333 2999 -337 3012 -337 ct 3031 -337 3050 -331 3069 -319 ct 3050 -267 l 3036 -275 3023 -279 3009 -279 ct 2997 -279 2986 -276 2976 -268 ct 2966 -261 2959 -251 2955 -238 ct 2949 -218 2946 -196 2946 -173 ct 2946 0 l 2890 0 l p ef pom gr gr 11400 8750 m 10838 8938 l 10838 8563 l 11400 8750 l p ef 10500 8725 m 10950 8725 l 10950 8775 l 10500 8775 l 10500 8725 l p ef 8698 13525 m 8647 13525 l 8647 13475 l 8698 13475 l 8698 13525 l p ef 8596 13525 m 8545 13525 l 8545 13475 l 8596 13475 l 8596 13525 l p ef 8494 13525 m 8443 13525 l 8443 13475 l 8494 13475 l 8494 13525 l p ef 8392 13525 m 8341 13525 l 8341 13475 l 8392 13475 l 8392 13525 l p ef 8290 13525 m 8239 13525 l 8239 13475 l 8290 13475 l 8290 13525 l p ef 8188 13525 m 8137 13525 l 8137 13475 l 8188 13475 l 8188 13525 l p ef 8086 13525 m 8035 13525 l 8035 13475 l 8086 13475 l 8086 13525 l p ef 7984 13525 m 7933 13525 l 7933 13475 l 7984 13475 l 7984 13525 l p ef 7882 13525 m 7831 13525 l 7831 13475 l 7882 13475 l 7882 13525 l p ef 7780 13525 m 7729 13525 l 7729 13475 l 7780 13475 l 7780 13525 l p ef 7678 13525 m 7627 13525 l 7627 13475 l 7678 13475 l 7678 13525 l p ef 7576 13525 m 7525 13525 l 7525 13475 l 7576 13475 l 7576 13525 l p ef 7474 13525 m 7423 13525 l 7423 13475 l 7474 13475 l 7474 13525 l p ef 7372 13525 m 7321 13525 l 7321 13475 l 7372 13475 l 7372 13525 l p ef 7270 13525 m 7219 13525 l 7219 13475 l 7270 13475 l 7270 13525 l p ef 7168 13525 m 7117 13525 l 7117 13475 l 7168 13475 l 7168 13525 l p ef 7075 13466 m 7075 13415 l 7125 13415 l 7125 13466 l 7075 13466 l p ef 7075 13364 m 7075 13313 l 7125 13313 l 7125 13364 l 7075 13364 l p ef 7075 13262 m 7075 13211 l 7125 13211 l 7125 13262 l 7075 13262 l p ef 7075 13160 m 7075 13109 l 7125 13109 l 7125 13160 l 7075 13160 l p ef 7075 13058 m 7075 13007 l 7125 13007 l 7125 13058 l 7075 13058 l p ef 7075 12956 m 7075 12905 l 7125 12905 l 7125 12956 l 7075 12956 l p ef 7075 12854 m 7075 12803 l 7125 12803 l 7125 12854 l 7075 12854 l p ef 7075 12752 m 7075 12701 l 7125 12701 l 7125 12752 l 7075 12752 l p ef 7075 12650 m 7075 12599 l 7125 12599 l 7125 12650 l 7075 12650 l p ef 7075 12548 m 7075 12497 l 7125 12497 l 7125 12548 l 7075 12548 l p ef 7075 12446 m 7075 12395 l 7125 12395 l 7125 12446 l 7075 12446 l p ef 7075 12344 m 7075 12293 l 7125 12293 l 7125 12344 l 7075 12344 l p ef 7075 12242 m 7075 12191 l 7125 12191 l 7125 12242 l 7075 12242 l p ef 7075 12140 m 7075 12089 l 7125 12089 l 7125 12140 l 7075 12140 l p ef 7075 12038 m 7075 12000 l 7100 12000 l 7125 12000 l 7125 12038 l 7100 12038 l 7075 12038 l p ef 7100 12000 m 7075 12000 l 7075 11996 l 7077 11991 l 7078 11988 l 7081 11984 l 7084 11981 l 7087 11978 l 7091 11977 l 7096 11975 l 7100 11975 l 7100 11975 l 7100 12000 l p ef 7100 11975 m 7113 11975 l 7113 12000 l 7113 12025 l 7100 12025 l 7100 12000 l 7100 11975 l p ef 7164 11975 m 7215 11975 l 7215 12025 l 7164 12025 l 7164 11975 l p ef 7266 11975 m 7317 11975 l 7317 12025 l 7266 12025 l 7266 11975 l p ef 7368 11975 m 7419 11975 l 7419 12025 l 7368 12025 l 7368 11975 l p ef 7470 11975 m 7521 11975 l 7521 12025 l 7470 12025 l 7470 11975 l p ef 7572 11975 m 7623 11975 l 7623 12025 l 7572 12025 l 7572 11975 l p ef 7674 11975 m 7725 11975 l 7725 12025 l 7674 12025 l 7674 11975 l p ef 7776 11975 m 7827 11975 l 7827 12025 l 7776 12025 l 7776 11975 l p ef 7878 11975 m 7929 11975 l 7929 12025 l 7878 12025 l 7878 11975 l p ef 7980 11975 m 8031 11975 l 8031 12025 l 7980 12025 l 7980 11975 l p ef 8082 11975 m 8133 11975 l 8133 12025 l 8082 12025 l 8082 11975 l p ef 8184 11975 m 8235 11975 l 8235 12025 l 8184 12025 l 8184 11975 l p ef 8286 11975 m 8337 11975 l 8337 12025 l 8286 12025 l 8286 11975 l p ef 8388 11975 m 8439 11975 l 8439 12025 l 8388 12025 l 8388 11975 l p ef 8490 11975 m 8541 11975 l 8541 12025 l 8490 12025 l 8490 11975 l p ef 8592 11975 m 8643 11975 l 8643 12025 l 8592 12025 l 8592 11975 l p ef 8694 11975 m 8745 11975 l 8745 12025 l 8694 12025 l 8694 11975 l p ef 8796 11975 m 8847 11975 l 8847 12025 l 8796 12025 l 8796 11975 l p ef 8898 11975 m 8949 11975 l 8949 12025 l 8898 12025 l 8898 11975 l p ef 9000 11975 m 9051 11975 l 9051 12025 l 9000 12025 l 9000 11975 l p ef 9102 11975 m 9153 11975 l 9153 12025 l 9102 12025 l 9102 11975 l p ef 9204 11975 m 9255 11975 l 9255 12025 l 9204 12025 l 9204 11975 l p ef 9306 11975 m 9357 11975 l 9357 12025 l 9306 12025 l 9306 11975 l p ef 9408 11975 m 9459 11975 l 9459 12025 l 9408 12025 l 9408 11975 l p ef 9510 11975 m 9561 11975 l 9561 12025 l 9510 12025 l 9510 11975 l p ef 9612 11975 m 9663 11975 l 9663 12025 l 9612 12025 l 9612 11975 l p ef 9714 11975 m 9765 11975 l 9765 12025 l 9714 12025 l 9714 11975 l p ef 9816 11975 m 9867 11975 l 9867 12025 l 9816 12025 l 9816 11975 l p ef 9918 11975 m 9969 11975 l 9969 12025 l 9918 12025 l 9918 11975 l p ef 10020 11975 m 10071 11975 l 10071 12025 l 10020 12025 l 10020 11975 l p ef 10122 11975 m 10173 11975 l 10173 12025 l 10122 12025 l 10122 11975 l p ef 10224 11975 m 10275 11975 l 10275 12025 l 10224 12025 l 10224 11975 l p ef 10326 11975 m 10377 11975 l 10377 12025 l 10326 12025 l 10326 11975 l p ef 10428 11975 m 10479 11975 l 10479 12025 l 10428 12025 l 10428 11975 l p ef 10525 12030 m 10525 12081 l 10475 12081 l 10475 12030 l 10525 12030 l p ef 10525 12132 m 10525 12183 l 10475 12183 l 10475 12132 l 10525 12132 l p ef 10525 12234 m 10525 12285 l 10475 12285 l 10475 12234 l 10525 12234 l p ef 10525 12336 m 10525 12387 l 10475 12387 l 10475 12336 l 10525 12336 l p ef 10525 12438 m 10525 12489 l 10475 12489 l 10475 12438 l 10525 12438 l p ef 10525 12540 m 10525 12591 l 10475 12591 l 10475 12540 l 10525 12540 l p ef 10525 12642 m 10525 12693 l 10475 12693 l 10475 12642 l 10525 12642 l p ef 10525 12744 m 10525 12795 l 10475 12795 l 10475 12744 l 10525 12744 l p ef 10525 12846 m 10525 12897 l 10475 12897 l 10475 12846 l 10525 12846 l p ef 10525 12948 m 10525 12999 l 10475 12999 l 10475 12948 l 10525 12948 l p ef 10525 13050 m 10525 13101 l 10475 13101 l 10475 13050 l 10525 13050 l p ef 10525 13152 m 10525 13203 l 10475 13203 l 10475 13152 l 10525 13152 l p ef 10525 13254 m 10525 13305 l 10475 13305 l 10475 13254 l 10525 13254 l p ef 10525 13356 m 10525 13407 l 10475 13407 l 10475 13356 l 10525 13356 l p ef 10525 13458 m 10525 13500 l 10500 13500 l 10475 13500 l 10475 13458 l 10500 13458 l 10525 13458 l p ef 10500 13500 m 10525 13500 l 10525 13504 l 10523 13509 l 10522 13512 l 10519 13516 l 10516 13519 l 10513 13522 l 10509 13523 l 10504 13525 l 10500 13525 l 10500 13525 l 10500 13500 l p ef 10500 13525 m 10491 13525 l 10491 13500 l 10491 13475 l 10500 13475 l 10500 13500 l 10500 13525 l p ef 10440 13525 m 10389 13525 l 10389 13475 l 10440 13475 l 10440 13525 l p ef 10338 13525 m 10287 13525 l 10287 13475 l 10338 13475 l 10338 13525 l p ef 10236 13525 m 10185 13525 l 10185 13475 l 10236 13475 l 10236 13525 l p ef 10134 13525 m 10083 13525 l 10083 13475 l 10134 13475 l 10134 13525 l p ef 10032 13525 m 9981 13525 l 9981 13475 l 10032 13475 l 10032 13525 l p ef 9930 13525 m 9879 13525 l 9879 13475 l 9930 13475 l 9930 13525 l p ef 9828 13525 m 9777 13525 l 9777 13475 l 9828 13475 l 9828 13525 l p ef 9726 13525 m 9675 13525 l 9675 13475 l 9726 13475 l 9726 13525 l p ef 9624 13525 m 9573 13525 l 9573 13475 l 9624 13475 l 9624 13525 l p ef 9522 13525 m 9471 13525 l 9471 13475 l 9522 13475 l 9522 13525 l p ef 9420 13525 m 9369 13525 l 9369 13475 l 9420 13475 l 9420 13525 l p ef 9318 13525 m 9267 13525 l 9267 13475 l 9318 13475 l 9318 13525 l p ef 9216 13525 m 9165 13525 l 9165 13475 l 9216 13475 l 9216 13525 l p ef 9114 13525 m 9063 13525 l 9063 13475 l 9114 13475 l 9114 13525 l p ef 9012 13525 m 8961 13525 l 8961 13475 l 9012 13475 l 9012 13525 l p ef 8910 13525 m 8859 13525 l 8859 13475 l 8910 13475 l 8910 13525 l p ef 8808 13525 m 8800 13525 l 8800 13500 l 8800 13475 l 8808 13475 l 8808 13500 l 8808 13525 l p ef 8800 13525 m 8749 13525 l 8749 13500 l 8749 13475 l 8800 13475 l 8800 13500 l 8800 13525 l p ef gs gs pum 7276 12970 t 50 0 m 50 -455 l 251 -455 l 292 -455 323 -451 344 -443 ct 365 -435 382 -420 394 -399 ct 407 -379 413 -356 413 -331 ct 413 -299 403 -271 382 -249 ct 361 -227 329 -213 285 -207 ct 301 -199 313 -192 322 -184 ct 339 -168 356 -148 371 -124 ct 451 0 l 375 0 l 315 -95 l 297 -122 283 -143 271 -157 ct 260 -172 250 -182 241 -188 ct 232 -194 223 -198 213 -200 ct 207 -201 195 -202 180 -202 ct 110 -202 l 110 0 l 50 0 l p 110 -254 m 239 -254 l 267 -254 288 -257 304 -263 ct 319 -268 331 -277 339 -290 ct 347 -303 351 -316 351 -331 ct 351 -352 344 -370 328 -384 ct 312 -398 288 -405 254 -405 ct 110 -405 l 110 -254 l p ef 724 -107 m 782 -99 l 773 -66 756 -40 731 -21 ct 707 -2 675 7 637 7 ct 589 7 551 -8 523 -37 ct 494 -67 480 -109 480 -162 ct 480 -218 495 -261 523 -291 ct 552 -322 589 -337 634 -337 ct 678 -337 714 -322 742 -292 ct 770 -262 784 -220 784 -166 ct 784 -163 784 -158 783 -151 ct 538 -151 l 540 -115 550 -87 569 -68 ct 587 -49 610 -39 637 -39 ct 658 -39 675 -44 690 -55 ct 704 -66 716 -83 724 -107 ct p 541 -197 m 725 -197 l 722 -225 715 -245 704 -259 ct 686 -280 663 -291 635 -291 ct 609 -291 587 -283 570 -265 ct 553 -248 543 -226 541 -197 ct p ef 829 -99 m 884 -107 l 887 -85 895 -68 910 -57 ct 924 -45 944 -39 969 -39 ct 995 -39 1014 -44 1026 -55 ct 1038 -65 1045 -77 1045 -91 ct 1045 -104 1039 -114 1028 -121 ct 1021 -126 1002 -132 971 -140 ct 930 -150 902 -159 886 -167 ct 870 -174 858 -185 850 -198 ct 842 -211 838 -226 838 -242 ct 838 -257 841 -270 848 -283 ct 855 -295 864 -306 875 -314 ct 884 -320 896 -326 911 -330 ct 926 -335 942 -337 959 -337 ct 985 -337 1008 -333 1027 -326 ct 1047 -318 1061 -308 1070 -296 ct 1080 -283 1086 -266 1090 -245 ct 1035 -237 l 1033 -254 1025 -267 1013 -277 ct 1002 -286 985 -291 963 -291 ct 937 -291 919 -287 908 -278 ct 897 -270 892 -260 892 -249 ct 892 -241 894 -235 899 -229 ct 903 -223 910 -218 920 -214 ct 926 -212 942 -207 969 -200 ct 1009 -189 1036 -181 1052 -174 ct 1068 -167 1080 -158 1089 -145 ct 1098 -132 1102 -116 1102 -97 ct 1102 -79 1097 -61 1086 -45 ct 1075 -28 1059 -15 1039 -6 ct 1018 3 995 7 969 7 ct 927 7 894 -2 871 -20 ct 849 -37 835 -64 829 -99 ct p ef 1383 -41 m 1362 -24 1342 -11 1323 -4 ct 1304 3 1283 7 1262 7 ct 1225 7 1198 -2 1178 -20 ct 1159 -37 1149 -60 1149 -87 ct 1149 -103 1153 -118 1160 -131 ct 1167 -145 1177 -156 1189 -164 ct 1201 -172 1214 -178 1229 -182 ct 1240 -185 1256 -188 1279 -190 ct 1324 -196 1357 -202 1378 -209 ct 1378 -217 1378 -222 1378 -224 ct 1378 -247 1373 -263 1363 -272 ct 1348 -285 1327 -291 1299 -291 ct 1273 -291 1253 -286 1241 -277 ct 1228 -268 1219 -252 1213 -228 ct 1159 -236 l 1164 -259 1172 -278 1183 -292 ct 1194 -307 1211 -318 1232 -326 ct 1254 -333 1279 -337 1307 -337 ct 1335 -337 1358 -334 1376 -327 ct 1393 -321 1406 -312 1414 -302 ct 1423 -292 1428 -280 1432 -264 ct 1434 -255 1435 -238 1435 -213 ct 1435 -138 l 1435 -87 1436 -54 1438 -40 ct 1440 -26 1445 -13 1452 0 ct 1394 0 l 1388 -12 1384 -26 1383 -41 ct p 1378 -166 m 1358 -157 1327 -150 1287 -145 ct 1264 -141 1248 -138 1238 -133 ct 1229 -129 1221 -123 1216 -115 ct 1211 -107 1208 -99 1208 -89 ct 1208 -74 1214 -62 1225 -52 ct 1237 -42 1253 -37 1275 -37 ct 1296 -37 1315 -41 1332 -51 ct 1349 -60 1361 -73 1369 -89 ct 1375 -102 1378 -121 1378 -145 ct 1378 -166 l p ef 1519 0 m 1519 -330 l 1569 -330 l 1569 -283 l 1579 -299 1593 -312 1610 -322 ct 1627 -332 1647 -337 1669 -337 ct 1693 -337 1713 -332 1729 -322 ct 1744 -312 1755 -297 1762 -279 ct 1788 -318 1822 -337 1863 -337 ct 1896 -337 1921 -328 1939 -310 ct 1956 -292 1965 -264 1965 -226 ct 1965 0 l 1910 0 l 1910 -208 l 1910 -230 1908 -246 1904 -256 ct 1901 -266 1894 -274 1884 -280 ct 1875 -286 1864 -289 1851 -289 ct 1828 -289 1809 -281 1793 -265 ct 1778 -250 1770 -225 1770 -191 ct 1770 0 l 1715 0 l 1715 -214 l 1715 -239 1710 -258 1701 -270 ct 1692 -282 1677 -289 1656 -289 ct 1641 -289 1626 -284 1613 -276 ct 1599 -268 1590 -256 1584 -240 ct 1578 -224 1575 -201 1575 -171 ct 1575 0 l 1519 0 l p ef 2049 126 m 2049 -330 l 2100 -330 l 2100 -287 l 2112 -304 2125 -316 2140 -324 ct 2155 -333 2174 -337 2195 -337 ct 2223 -337 2248 -330 2270 -315 ct 2291 -301 2307 -280 2318 -254 ct 2329 -228 2335 -199 2335 -167 ct 2335 -134 2329 -103 2317 -77 ct 2305 -50 2287 -29 2264 -15 ct 2241 0 2217 7 2191 7 ct 2173 7 2156 3 2141 -5 ct 2126 -13 2114 -23 2105 -35 ct 2105 126 l 2049 126 l p 2099 -163 m 2099 -121 2108 -90 2125 -69 ct 2142 -49 2163 -39 2187 -39 ct 2212 -39 2234 -49 2251 -70 ct 2269 -91 2278 -124 2278 -168 ct 2278 -210 2269 -241 2252 -262 ct 2235 -283 2214 -293 2190 -293 ct 2166 -293 2145 -282 2127 -260 ct 2109 -238 2099 -205 2099 -163 ct p ef 2399 0 m 2399 -455 l 2454 -455 l 2454 0 l 2399 0 l p ef 2765 -107 m 2823 -99 l 2814 -66 2797 -40 2772 -21 ct 2748 -2 2716 7 2678 7 ct 2630 7 2592 -8 2564 -37 ct 2535 -67 2521 -109 2521 -162 ct 2521 -218 2536 -261 2564 -291 ct 2593 -322 2630 -337 2675 -337 ct 2719 -337 2755 -322 2783 -292 ct 2811 -262 2825 -220 2825 -166 ct 2825 -163 2825 -158 2824 -151 ct 2579 -151 l 2581 -115 2591 -87 2610 -68 ct 2628 -49 2651 -39 2678 -39 ct 2699 -39 2716 -44 2731 -55 ct 2745 -66 2757 -83 2765 -107 ct p 2582 -197 m 2766 -197 l 2763 -225 2756 -245 2745 -259 ct 2727 -280 2704 -291 2676 -291 ct 2650 -291 2628 -283 2611 -265 ct 2594 -248 2584 -226 2582 -197 ct p ef 2890 0 m 2890 -330 l 2940 -330 l 2940 -280 l 2953 -303 2965 -318 2976 -326 ct 2987 -333 2999 -337 3012 -337 ct 3031 -337 3050 -331 3069 -319 ct 3050 -267 l 3036 -275 3023 -279 3009 -279 ct 2997 -279 2986 -276 2976 -268 ct 2966 -261 2959 -251 2955 -238 ct 2949 -218 2946 -196 2946 -173 ct 2946 0 l 2890 0 l p ef pom gr gr 5900 12750 m 6463 12563 l 6463 12938 l 5900 12750 l p ef 7100 12775 m 6350 12775 l 6350 12725 l 7100 12725 l 7100 12775 l p ef gs gs pum 25603 12626 t 52 -1 m 52 -455 l 359 -455 l 359 -401 l 112 -401 l 112 -261 l 326 -261 l 326 -207 l 112 -207 l 112 -1 l 52 -1 l p ef 430 0 m 430 -330 l 480 -330 l 480 -280 l 493 -303 505 -318 516 -326 ct 527 -333 539 -337 552 -337 ct 571 -337 590 -331 609 -319 ct 590 -267 l 576 -275 563 -279 549 -279 ct 537 -279 526 -276 516 -268 ct 506 -261 499 -251 495 -238 ct 489 -218 486 -196 486 -173 ct 486 0 l 430 0 l p ef 622 -165 m 622 -226 639 -271 673 -301 ct 701 -325 736 -337 777 -337 ct 822 -337 859 -322 887 -293 ct 916 -263 931 -222 931 -170 ct 931 -127 924 -94 912 -70 ct 899 -45 880 -27 856 -13 ct 832 0 805 7 777 7 ct 730 7 693 -8 665 -37 ct 636 -67 622 -110 622 -165 ct p 679 -165 m 679 -123 689 -91 707 -70 ct 725 -49 749 -39 777 -39 ct 804 -39 827 -49 846 -71 ct 864 -92 873 -124 873 -167 ct 873 -208 864 -239 845 -260 ct 827 -281 804 -291 777 -291 ct 749 -291 725 -281 707 -260 ct 689 -239 679 -207 679 -165 ct p ef 995 0 m 995 -330 l 1045 -330 l 1045 -283 l 1055 -299 1069 -312 1086 -322 ct 1103 -332 1123 -337 1145 -337 ct 1169 -337 1189 -332 1205 -322 ct 1220 -312 1231 -297 1238 -279 ct 1264 -318 1298 -337 1339 -337 ct 1372 -337 1397 -328 1415 -310 ct 1432 -292 1441 -264 1441 -226 ct 1441 0 l 1386 0 l 1386 -208 l 1386 -230 1384 -246 1380 -256 ct 1377 -266 1370 -274 1360 -280 ct 1351 -286 1340 -289 1327 -289 ct 1304 -289 1285 -281 1269 -265 ct 1254 -250 1246 -225 1246 -191 ct 1246 0 l 1191 0 l 1191 -214 l 1191 -239 1186 -258 1177 -270 ct 1168 -282 1153 -289 1132 -289 ct 1117 -289 1102 -284 1089 -276 ct 1075 -268 1066 -256 1060 -240 ct 1054 -224 1051 -201 1051 -171 ct 1051 0 l 995 0 l p ef pom gr gs pum 25241 13337 t 42 0 m 42 -330 l 92 -330 l 92 -283 l 116 -319 151 -337 197 -337 ct 217 -337 235 -333 252 -326 ct 268 -319 281 -310 289 -298 ct 297 -287 303 -273 306 -257 ct 308 -247 309 -229 309 -203 ct 309 0 l 254 0 l 254 -200 l 254 -223 251 -240 247 -252 ct 243 -263 235 -272 224 -279 ct 213 -285 200 -289 185 -289 ct 161 -289 141 -281 124 -266 ct 106 -251 98 -222 98 -180 ct 98 0 l 42 0 l p ef 618 -107 m 676 -99 l 667 -66 650 -40 625 -21 ct 601 -2 569 7 531 7 ct 483 7 445 -8 417 -37 ct 388 -67 374 -109 374 -162 ct 374 -218 389 -261 417 -291 ct 446 -322 483 -337 528 -337 ct 572 -337 608 -322 636 -292 ct 664 -262 678 -220 678 -166 ct 678 -163 678 -158 677 -151 ct 432 -151 l 434 -115 444 -87 463 -68 ct 481 -49 504 -39 531 -39 ct 552 -39 569 -44 584 -55 ct 598 -66 610 -83 618 -107 ct p 435 -197 m 619 -197 l 616 -225 609 -245 598 -259 ct 580 -280 557 -291 529 -291 ct 503 -291 481 -283 464 -265 ct 447 -248 437 -226 435 -197 ct p ef 867 -50 m 875 -1 l 859 2 845 4 833 4 ct 812 4 797 1 785 -6 ct 774 -12 766 -20 762 -31 ct 757 -41 755 -63 755 -97 ct 755 -287 l 714 -287 l 714 -330 l 755 -330 l 755 -412 l 811 -445 l 811 -330 l 867 -330 l 867 -287 l 811 -287 l 811 -94 l 811 -78 812 -68 814 -63 ct 816 -58 819 -55 823 -52 ct 828 -49 834 -48 842 -48 ct 848 -48 857 -49 867 -50 ct p ef 984 0 m 883 -330 l 941 -330 l 993 -139 l 1012 -69 l 1013 -72 1019 -95 1030 -137 ct 1082 -330 l 1139 -330 l 1189 -138 l 1205 -75 l 1224 -139 l 1280 -330 l 1335 -330 l 1232 0 l 1174 0 l 1121 -197 l 1109 -253 l 1042 0 l 984 0 l p ef 1346 -165 m 1346 -226 1363 -271 1397 -301 ct 1425 -325 1460 -337 1501 -337 ct 1546 -337 1583 -322 1611 -293 ct 1640 -263 1655 -222 1655 -170 ct 1655 -127 1648 -94 1636 -70 ct 1623 -45 1604 -27 1580 -13 ct 1556 0 1529 7 1501 7 ct 1454 7 1417 -8 1389 -37 ct 1360 -67 1346 -110 1346 -165 ct p 1403 -165 m 1403 -123 1413 -91 1431 -70 ct 1449 -49 1473 -39 1501 -39 ct 1528 -39 1551 -49 1570 -71 ct 1588 -92 1597 -124 1597 -167 ct 1597 -208 1588 -239 1569 -260 ct 1551 -281 1528 -291 1501 -291 ct 1473 -291 1449 -281 1431 -260 ct 1413 -239 1403 -207 1403 -165 ct p ef 1717 0 m 1717 -330 l 1767 -330 l 1767 -280 l 1780 -303 1792 -318 1803 -326 ct 1814 -333 1826 -337 1839 -337 ct 1858 -337 1877 -331 1896 -319 ct 1877 -267 l 1863 -275 1850 -279 1836 -279 ct 1824 -279 1813 -276 1803 -268 ct 1793 -261 1786 -251 1782 -238 ct 1776 -218 1773 -196 1773 -173 ct 1773 0 l 1717 0 l p ef 1930 0 m 1930 -455 l 1986 -455 l 1986 -196 l 2118 -330 l 2190 -330 l 2064 -207 l 2203 0 l 2134 0 l 2025 -169 l 1986 -131 l 1986 0 l 1930 0 l p ef pom gr gr gs gs pum 26008 8604 t 165 0 m 165 -401 l 15 -401 l 15 -455 l 375 -455 l 375 -401 l 225 -401 l 225 0 l 165 0 l p ef 343 -165 m 343 -226 360 -271 394 -301 ct 422 -325 457 -337 498 -337 ct 543 -337 580 -322 608 -293 ct 637 -263 652 -222 652 -170 ct 652 -127 645 -94 633 -70 ct 620 -45 601 -27 577 -13 ct 553 0 526 7 498 7 ct 451 7 414 -8 386 -37 ct 357 -67 343 -110 343 -165 ct p 400 -165 m 400 -123 410 -91 428 -70 ct 446 -49 470 -39 498 -39 ct 525 -39 548 -49 567 -71 ct 585 -92 594 -124 594 -167 ct 594 -208 585 -239 566 -260 ct 548 -281 525 -291 498 -291 ct 470 -291 446 -281 428 -260 ct 410 -239 400 -207 400 -165 ct p ef pom gr gs pum 25241 9315 t 42 0 m 42 -330 l 92 -330 l 92 -283 l 116 -319 151 -337 197 -337 ct 217 -337 235 -333 252 -326 ct 268 -319 281 -310 289 -298 ct 297 -287 303 -273 306 -257 ct 308 -247 309 -229 309 -203 ct 309 0 l 254 0 l 254 -200 l 254 -223 251 -240 247 -252 ct 243 -263 235 -272 224 -279 ct 213 -285 200 -289 185 -289 ct 161 -289 141 -281 124 -266 ct 106 -251 98 -222 98 -180 ct 98 0 l 42 0 l p ef 618 -107 m 676 -99 l 667 -66 650 -40 625 -21 ct 601 -2 569 7 531 7 ct 483 7 445 -8 417 -37 ct 388 -67 374 -109 374 -162 ct 374 -218 389 -261 417 -291 ct 446 -322 483 -337 528 -337 ct 572 -337 608 -322 636 -292 ct 664 -262 678 -220 678 -166 ct 678 -163 678 -158 677 -151 ct 432 -151 l 434 -115 444 -87 463 -68 ct 481 -49 504 -39 531 -39 ct 552 -39 569 -44 584 -55 ct 598 -66 610 -83 618 -107 ct p 435 -197 m 619 -197 l 616 -225 609 -245 598 -259 ct 580 -280 557 -291 529 -291 ct 503 -291 481 -283 464 -265 ct 447 -248 437 -226 435 -197 ct p ef 867 -50 m 875 -1 l 859 2 845 4 833 4 ct 812 4 797 1 785 -6 ct 774 -12 766 -20 762 -31 ct 757 -41 755 -63 755 -97 ct 755 -287 l 714 -287 l 714 -330 l 755 -330 l 755 -412 l 811 -445 l 811 -330 l 867 -330 l 867 -287 l 811 -287 l 811 -94 l 811 -78 812 -68 814 -63 ct 816 -58 819 -55 823 -52 ct 828 -49 834 -48 842 -48 ct 848 -48 857 -49 867 -50 ct p ef 984 0 m 883 -330 l 941 -330 l 993 -139 l 1012 -69 l 1013 -72 1019 -95 1030 -137 ct 1082 -330 l 1139 -330 l 1189 -138 l 1205 -75 l 1224 -139 l 1280 -330 l 1335 -330 l 1232 0 l 1174 0 l 1121 -197 l 1109 -253 l 1042 0 l 984 0 l p ef 1346 -165 m 1346 -226 1363 -271 1397 -301 ct 1425 -325 1460 -337 1501 -337 ct 1546 -337 1583 -322 1611 -293 ct 1640 -263 1655 -222 1655 -170 ct 1655 -127 1648 -94 1636 -70 ct 1623 -45 1604 -27 1580 -13 ct 1556 0 1529 7 1501 7 ct 1454 7 1417 -8 1389 -37 ct 1360 -67 1346 -110 1346 -165 ct p 1403 -165 m 1403 -123 1413 -91 1431 -70 ct 1449 -49 1473 -39 1501 -39 ct 1528 -39 1551 -49 1570 -71 ct 1588 -92 1597 -124 1597 -167 ct 1597 -208 1588 -239 1569 -260 ct 1551 -281 1528 -291 1501 -291 ct 1473 -291 1449 -281 1431 -260 ct 1413 -239 1403 -207 1403 -165 ct p ef 1717 0 m 1717 -330 l 1767 -330 l 1767 -280 l 1780 -303 1792 -318 1803 -326 ct 1814 -333 1826 -337 1839 -337 ct 1858 -337 1877 -331 1896 -319 ct 1877 -267 l 1863 -275 1850 -279 1836 -279 ct 1824 -279 1813 -276 1803 -268 ct 1793 -261 1786 -251 1782 -238 ct 1776 -218 1773 -196 1773 -173 ct 1773 0 l 1717 0 l p ef 1930 0 m 1930 -455 l 1986 -455 l 1986 -196 l 2118 -330 l 2190 -330 l 2064 -207 l 2203 0 l 2134 0 l 2025 -169 l 1986 -131 l 1986 0 l 1930 0 l p ef pom gr gr gs gs pum 4551 10959 t 29 -146 m 85 -151 l 88 -128 94 -109 104 -95 ct 114 -80 129 -68 150 -59 ct 170 -51 194 -46 220 -46 ct 242 -46 263 -49 280 -56 ct 298 -63 311 -72 320 -84 ct 328 -96 332 -109 332 -123 ct 332 -137 328 -150 320 -161 ct 312 -171 298 -180 279 -187 ct 267 -192 240 -200 198 -210 ct 156 -220 127 -229 110 -238 ct 89 -249 73 -263 62 -280 ct 51 -297 46 -316 46 -337 ct 46 -360 52 -381 65 -401 ct 78 -421 97 -436 122 -447 ct 147 -457 175 -462 206 -462 ct 240 -462 269 -457 295 -446 ct 321 -435 341 -419 354 -398 ct 368 -377 376 -353 377 -326 ct 319 -322 l 316 -351 305 -372 288 -387 ct 270 -402 243 -409 208 -409 ct 172 -409 145 -402 129 -389 ct 112 -376 104 -360 104 -341 ct 104 -324 110 -311 122 -301 ct 133 -290 163 -279 212 -268 ct 261 -257 295 -247 313 -239 ct 339 -227 359 -211 371 -193 ct 384 -174 390 -153 390 -128 ct 390 -104 383 -81 370 -60 ct 356 -38 336 -22 310 -10 ct 284 2 255 8 222 8 ct 181 8 147 2 119 -10 ct 91 -22 69 -40 53 -64 ct 38 -88 29 -115 29 -146 ct p ef 680 -41 m 659 -24 639 -11 620 -4 ct 601 3 580 7 559 7 ct 522 7 495 -2 475 -20 ct 456 -37 446 -60 446 -87 ct 446 -103 450 -118 457 -131 ct 464 -145 474 -156 486 -164 ct 498 -172 511 -178 526 -182 ct 537 -185 553 -188 576 -190 ct 621 -196 654 -202 675 -209 ct 675 -217 675 -222 675 -224 ct 675 -247 670 -263 660 -272 ct 645 -285 624 -291 596 -291 ct 570 -291 550 -286 538 -277 ct 525 -268 516 -252 510 -228 ct 456 -236 l 461 -259 469 -278 480 -292 ct 491 -307 508 -318 529 -326 ct 551 -333 576 -337 604 -337 ct 632 -337 655 -334 673 -327 ct 690 -321 703 -312 711 -302 ct 720 -292 725 -280 729 -264 ct 731 -255 732 -238 732 -213 ct 732 -138 l 732 -87 733 -54 735 -40 ct 737 -26 742 -13 749 0 ct 691 0 l 685 -12 681 -26 680 -41 ct p 675 -166 m 655 -157 624 -150 584 -145 ct 561 -141 545 -138 535 -133 ct 526 -129 518 -123 513 -115 ct 508 -107 505 -99 505 -89 ct 505 -74 511 -62 522 -52 ct 534 -42 550 -37 572 -37 ct 593 -37 612 -41 629 -51 ct 646 -60 658 -73 666 -89 ct 672 -102 675 -121 675 -145 ct 675 -166 l p ef 817 0 m 817 -330 l 867 -330 l 867 -283 l 877 -299 891 -312 908 -322 ct 925 -332 945 -337 967 -337 ct 991 -337 1011 -332 1027 -322 ct 1042 -312 1053 -297 1060 -279 ct 1086 -318 1120 -337 1161 -337 ct 1194 -337 1219 -328 1237 -310 ct 1254 -292 1263 -264 1263 -226 ct 1263 0 l 1208 0 l 1208 -208 l 1208 -230 1206 -246 1202 -256 ct 1199 -266 1192 -274 1182 -280 ct 1173 -286 1162 -289 1149 -289 ct 1126 -289 1107 -281 1091 -265 ct 1076 -250 1068 -225 1068 -191 ct 1068 0 l 1013 0 l 1013 -214 l 1013 -239 1008 -258 999 -270 ct 990 -282 975 -289 954 -289 ct 939 -289 924 -284 911 -276 ct 897 -268 888 -256 882 -240 ct 876 -224 873 -201 873 -171 ct 873 0 l 817 0 l p ef 1571 -107 m 1629 -99 l 1620 -66 1603 -40 1578 -21 ct 1554 -2 1522 7 1484 7 ct 1436 7 1398 -8 1370 -37 ct 1341 -67 1327 -109 1327 -162 ct 1327 -218 1342 -261 1370 -291 ct 1399 -322 1436 -337 1481 -337 ct 1525 -337 1561 -322 1589 -292 ct 1617 -262 1631 -220 1631 -166 ct 1631 -163 1631 -158 1630 -151 ct 1385 -151 l 1387 -115 1397 -87 1416 -68 ct 1434 -49 1457 -39 1484 -39 ct 1505 -39 1522 -44 1537 -55 ct 1551 -66 1563 -83 1571 -107 ct p 1388 -197 m 1572 -197 l 1569 -225 1562 -245 1551 -259 ct 1533 -280 1510 -291 1482 -291 ct 1456 -291 1434 -283 1417 -265 ct 1400 -248 1390 -226 1388 -197 ct p ef 2090 -121 m 2145 -114 l 2139 -76 2123 -46 2099 -25 ct 2074 -4 2044 7 2008 7 ct 1963 7 1926 -8 1899 -37 ct 1872 -67 1858 -109 1858 -164 ct 1858 -199 1864 -230 1875 -257 ct 1887 -284 1905 -304 1929 -317 ct 1953 -330 1980 -337 2008 -337 ct 2044 -337 2073 -328 2096 -310 ct 2118 -292 2133 -266 2139 -233 ct 2085 -224 l 2080 -247 2071 -263 2058 -274 ct 2045 -286 2029 -291 2010 -291 ct 1982 -291 1959 -281 1942 -261 ct 1924 -241 1915 -209 1915 -165 ct 1915 -121 1924 -89 1941 -69 ct 1958 -49 1980 -39 2007 -39 ct 2029 -39 2047 -46 2062 -59 ct 2077 -72 2086 -93 2090 -121 ct p ef 2192 0 m 2192 -455 l 2247 -455 l 2247 0 l 2192 0 l p ef 2311 -165 m 2311 -226 2328 -271 2362 -301 ct 2390 -325 2425 -337 2466 -337 ct 2511 -337 2548 -322 2576 -293 ct 2605 -263 2620 -222 2620 -170 ct 2620 -127 2613 -94 2601 -70 ct 2588 -45 2569 -27 2545 -13 ct 2521 0 2494 7 2466 7 ct 2419 7 2382 -8 2354 -37 ct 2325 -67 2311 -110 2311 -165 ct p 2368 -165 m 2368 -123 2378 -91 2396 -70 ct 2414 -49 2438 -39 2466 -39 ct 2493 -39 2516 -49 2535 -71 ct 2553 -92 2562 -124 2562 -167 ct 2562 -208 2553 -239 2534 -260 ct 2516 -281 2493 -291 2466 -291 ct 2438 -291 2414 -281 2396 -260 ct 2378 -239 2368 -207 2368 -165 ct p ef 2899 -121 m 2954 -114 l 2948 -76 2932 -46 2908 -25 ct 2883 -4 2853 7 2817 7 ct 2772 7 2735 -8 2708 -37 ct 2681 -67 2667 -109 2667 -164 ct 2667 -199 2673 -230 2684 -257 ct 2696 -284 2714 -304 2738 -317 ct 2762 -330 2789 -337 2817 -337 ct 2853 -337 2882 -328 2905 -310 ct 2927 -292 2942 -266 2948 -233 ct 2894 -224 l 2889 -247 2880 -263 2867 -274 ct 2854 -286 2838 -291 2819 -291 ct 2791 -291 2768 -281 2751 -261 ct 2733 -241 2724 -209 2724 -165 ct 2724 -121 2733 -89 2750 -69 ct 2767 -49 2789 -39 2816 -39 ct 2838 -39 2856 -46 2871 -59 ct 2886 -72 2895 -93 2899 -121 ct p ef 3001 0 m 3001 -455 l 3057 -455 l 3057 -196 l 3189 -330 l 3261 -330 l 3135 -207 l 3274 0 l 3205 0 l 3096 -169 l 3057 -131 l 3057 0 l 3001 0 l p ef pom gr gr 0 6126 t pom count op_count sub {pop} repeat countdictstack dict_count sub {end} repeat b4_inc_state restore %%PageTrailer %%Trailer %%EOF mumble-1.3.4/3rdparty/speex-src/doc/.cvsignore0000664000175000017500000000002514010707304021057 0ustar builderbuilderMakefile Makefile.in mumble-1.3.4/3rdparty/speex-src/doc/speex_abs.odg0000664000175000017500000025007014010707304021532 0ustar builderbuilderPK 4i4.++mimetypeapplication/vnd.oasis.opendocument.graphicsPK 4i4Configurations2/PK 4i4VersionList.xml1o0ཿ"ݱϡP,6&4;rʱ#۠7O7nջF15`) oBgE{s`o_vQ%lxꌆp ;QO>'%r|RzCw1fGG0e&᳿=H(:S&m?̚ DR6@Z QXTq*& n*PK PK 4i4ObjectReplacements/Object 10 s qcd0dFid000309@!& #%;P4PT8 V5 O Ȳ[I~br0sdiV`L$CpIbQpenR~U@;b UR@ڟ*y36v7̊X`wZ@TVDG X¬j0 qthhIՖ,P`vmVHN|pE:a=u09to=`ͩ,0 ʊ39u*.X=PKCFPK 4i4ObjectReplacements/Object 2 s qcd0dFid10? b7YH~UT8 R5 O Ȳ[I~br0sdiV`L$CpIbQpenR~U@;b UR@ڟ*y36v7̊X`wZ@TVDG X¬j0 qthhIՖ,P`vmVHN|pE:a=u09to=`ͩ,0 ʊ39u*.X=PKCFPK 4i4ObjectReplacements/Object 3 s qcd0dFid10? b7YH~UT8 R5 O Ȳ˛I.Ģܤ9L A,VᖀPځ6 PT W fg{b h;H3d++&!\ wv[aNsd4&=8y"8X`wZ@++"#|,a 5 [8qr:4߶?PO 0x=+Hi8', :rAq`E,0 1f3T$]z PK ^APK 4i4ObjectReplacements/Object 4 s qcd0dFid1089@!& #%M PT8 R5 O Ȳ˛I.Ģܤ9AXP3-3;f121+5@mPA@ d?eCP،@vXU3QaoB6q=`}cA8l>p=a@!$37X/\!(?71bp-X3끲 FN3btZ+$`lA'4ӡz3" =k?+$r'>Fn5j2Qpץ1œ#HNwd;MH2*(17< $!!̩Ha"PK,5Z}PK 4i4ObjectReplacements/Object 5 s qcd0dFid{,n@TeT5(TMg@!$37X/\!(?71bX5H-3B Ĭ`' ā6PV Ўl{c@rZ+$p( q;Hr1$W& 2CCrCӡtq(@ݕ&> ;e$rAI.8Œj4e = +ȨJf\D\ԁl9je*iHԲ0&A|?Pʐ_" PK7&ҵUPK 4i4ObjectReplacements/Object 6 s qcd0dFid10? b7YH~UT8 R5 O Ȳ[I~br0sdiV`L$CpIbQpenR~U@;b UR@ڟ*y36v7̊X`wZ@TVDG X¬j0 qthhIՖ,P`vmVHN|pE:a=u09to=`ͩ,0 ʊ39u*.X=PKCFPK 4i4ObjectReplacements/Object 7 s qcd0dFid10030(9@!& #%m>PU6PT8 R5 O Ȳ˛I.Ģܤ9 A,VᖀPځ6 PT )Jwfg{b $8 )=8sؼ찃,Gr|;H3d++&A bu@ (Rj4#Ӧ"i=,PKPK 4i4ObjectReplacements/Object 8 s qcd0dFid10030(9@!& #%m>PU6PT8 R5 O Ȳ˛I.Ģܤ9 A,VᖀPځ6 PT )Jwfg{b $8 )=8sؼ찃,Gr|;H3d++&A bu@ (Rj4#Ӧ"i=,PKPK 4i4ObjectReplacements/Object 9 s qcd0dFidn110(9@! F KI['PMT8 R5 O Ȳ[I~br"V<(L%)=#.뽟OBE]Ũ;͕$K <SOESX>T~ 'mS}4gYq^q\[E8`T@% EAE)]K CSjR{?&_OkazZn`,,g.*'.*Ǐt_{t?UroE碴5؏Q1RLrUEg s(݃. qЁR(Iuuĉ}ݠ-ab2@h{(PZNur3] #,K1JLFs/a_HSf|?tcm|h`L e(y|8Q2#ZOw$=6EV w;ѥ<(uEZ- iw;C:"V(mp  5]&][m} Qu +$w~X*tEy[м)R#z`4ڗ8MJuthr;z|ڼv1wq([DYwd6 #j'kp_~p?$hv tΨc 11NK?12^ns`t=l|D[!MU~|Bfppl^t\L?*_3hCIbDU4޵5:_c7v. ^Vrn:d7[z~i16BƦie 6*0^UrśhCi2K;ԧ[a$xvV2y{,Vg䯏g_Yc!JKT >k7Q`Hq:LǤ48GywxyY鉬IϻAi Ӂ2B.j>$$O+I6\!0cˁOc MuQ}ylIf cM^5-{5[SbVINX'0 \ @,dy1 xZ_g6 +*_c%z@}?iU *#gZ ᡝQHJu(mE:2 P{MQ_#9Bk/KϪ\ަNjSc }e6%_QZIk(_S|7L̔ L%Yl%"Op]ޙX )^{̬=V VA^ `i>t/PBװga?LjlF,kcEC[XoB22Y&-((SYZT!r75~(NH,{iF'DZE! ]2ʄ/{@ͮ8{IVXf .ktx9+v{Q YIA*b'Hq i= 't C9X>+a6g5,Xu`hd13&F{H'k4+pіl'hjYtL %?aҰk( Hp;5ެ WFz͊Ҋ6GP[ ~㘫3)J(/wZ483;V5k/c8٪|[9Zyf@gZbAwa0S@m{@naT# (9,k8)<,qw:qzq{H^꙽-a:jB]%vr?dX$C)$CRO,߶HLbSg)|zu1U} ssGlXd]$a"{cC{C6mڿZl^Yp u1~ua A69V)jS#Y58B{KZ-+.E4bYg+P6S-7m8ǴO뾵JgPiGNOPy'?- ɔ ܌S}5qҮ zx$ |)Љ.N"@}m&?ќԼH1¬"uG椄%M*h:u#=L'Y `F<.os_=n(W?  tȼұN:I^סyN8Dl.lː(J^CsRIidQj퐐@ƺH|2¬''hkDfo1vz8:e7@96ﻓ$?v_`P& =*Ԣu&}W[ɐ-mBq:R5i}74¬:a~KTU4RunYp*U(p1͌H_;Few;2v/JjɎ:?Ʒq`N|Ͳy7v8'þjqm`u|myL5Qn&lz.aDdCtP 9mCn,w&/zs=¬#Z-7LPvBiC6]%gaڎh5UgY^OD T}IKݾ/9`$EJ>ˎpjžH}wY^G" ׺7bXp;G{^.n쾤4.GVqũWqۖJ1 rb@|F_պP3FJo!qv9Ŀ-\nZma5v*C4OkWtLfcdͲ8hkD^FFk%c>m䩢Iجo@0WwL7b9̙RU;N__ $hR9R *LMhqW.#VR5XްTu";џ@b/ XE%Sx[Ұ9MV̙jE$*"Q*"(հ]J|VLL.ĸ ݔSbQ*0.SW8jS (K.R5LGx[#ׅs5!6Yop)voX`i.zu`f֫h:4MBo9ſeEk6\Hu _U7xz+`;7xգ3WGV/ߓ3l,Qpȫqn253w9hv܇> x;~!I?PKI]qWPK 4i4Object 11/content.xml]j@}TBAPEz*&YxE ݘn^07̄mI>dewH-Lt7v&x-b\?̞bB{ԋ,SBUB掑) &sgψϔR^.gq7:gl4BCVnF%GƭfBHj/!x-mJ(xi)`13-JQT2(cr rt/h mɽ ;I~z;6b䫃@w\ PK>S&PK 4i4Object 11/settings.xml͙w8ө9 ;U[iC’ ڿ~hSLGɜC[ |on.7"ĥ9FJ Loǁqv|kuM'F@$1ȹhJ;aĤACA@Y Axߺwey(4=Ok4+zziS2AϢQ7P! VUՋr~փ5͍6k@ qf)ogCQ1G0}󚲫}C0y—xWuyK0;B[~fl瘿/wq3Y~#;a4%Y~/8q%|+6M9 )"- ٰ-qm >pl$F0.Y0-\h2@"+ebJ}r.|e:=Q! Js0'`b$ϖEU,oX YI7џ@ b+ XE従xo a42r\ YΔ+"'HU-"rT o Pwjx2j1_ Reٔ4g⫢Y~(ॄq8K{xO=gc5!ǽ'_^舀x4eu1å^mcWkd>-D8h;4\5mo 1'G[/;?c[njj1Ht{^^C# ٫;6>U ԅ߃72n'n7[7&A[M{m4mԗngi|;c{ݻU0hvjvd?Xŗ -M^ y5O!F}Fn9ߊ|})q!czC[>I] f9az(D[ip?{]W]EuQk tV885פ6$4 ^LSFt$KyD:c9%V\8E{b"eRp"g/z!У)Wp>Q DhQ䠜Z!_zȓ e~9Q͆sP˩!֧hqT!egz0 %&#*PT9Q$ugS*[>5PK;yPK 4i4 styles.xml\_6O!оcfSܡhp-Q6J(j~~C$xB ĜqǙ!gLw 1 Kl !H?sg/oYo" NŹiĭ]tPNMoDaN+ɽQSٔA-Y?b6#c%/`jlCN9!K2$#-(I?mu\0wz*jpXe+ ]L,wV h~T)-棡AuV580W2-ߏ~ۮƻ22e${~Ưx2v.ۂ*$m6cR@R7𼕫?dzGN{x=D4gIh{ 'A) 5\LTʻ:ݾ{+/'m wsOak{g8x_Ø˱Cfr'D(?{ǑI3NNbe*8ӽtjoq݅A ڬ+JS5:D8F-(K촵eo8RcNa i*TgHC"4+%[V(::G o$/vv#H4hmExH1-^#[ږcDs\ʲpͪ٥]k;?ECF$p $fZ oQD_T, |-q"7fL1}0S5"tcߔ|(qANXi 9sŠ/T,KmHV2gP  Jjaj^kjmb2| !2"#*?fx$ҙL?G0!n WO)_g@vZpCBÈDqI Hzq4CWlU?>4<0뽔U֙Du ó53T5:CIv@z;})qD~š8yN]{[!VfΣ&ʗwKԆI.>Jyscl'31pA|Or\Y$a9FBzFuj έܱ?-dVZx:I(n!%ibF>kcsb/ηsCtn ѫAhn ѹ!:7D_!:7D!XV@0RWZ;VjGi6 މtkdb&8׆mnl]`rϳ}AZ8ɹ깮zz: F5vrҗ"y'/\CpxUF/x9ڗ[Yt螩ZV=㈀ _#^PM+׺H}]/G/;EЩl{ ډ>xv9O:tBVWBo<$TUo[{mZKNI?Qf^2y*P8bѕFImyAL2GDQ _p| 9  ?9+ h'5uÛ,1c 5U#u^ q1 ⒐\tj~,lW~Cok 8g8D/wO>CR+mfCh"gƱGPiPK#rDGPK 4i4Object 1/content.xml͒J@>:'=4c(B[VZ[0x\6&jŋo  no^Yg~oݐGL \LƙX;='xF Rʃ,Wӛ@qb$Tkq4&3H2U7$3#M[ P"Xx5x!z7@,)G$aҜo-*QZ–YЖgY-׊k>M!|}2Y-}i,"RƸ>hv0呂R!ڤTA &au?!ǩRɨkm /PK@c=PK 4i4Object 1/settings.xml͙W8u GS@@ MNR߄kYԶ{sss}[87!C qȴ=ڷ_wt2A.,yԍ|H&,'VJ($% b%|J-M֥,AI8.i8bQ_=4u)gQI(J$;$Y q'Zn=_\Sa#r$.Mn}[ di`v߯}BЧy—x*ƝoVp"}5cm)܈BEM Ý E0ؠ홶)Է@8E3c1aX#h]<n*5@ـ#$3Dg€!HKRLG}@Ig-VxsU&3#W#"\FLjVa D#Շ䢂3b:NimJN42Z 2gDTv*rZ 31-fCj7wSJZZLNE=,O_yM׃/H2mQ_\հؐG!GX"¥1/F]Zu2`-^0W3>thɅVMsf=l/ Qo6ǣǧ;Vl1vHo5ywGgU5 _ 6 'gX 87?Qpȫqn253w9hv܇>E[E6/KߡB0y%QiVyK_\AO3ގ}Iҏ}c PKYjZPK 4i4Object 2/content.xml͒J@>:'=4c(B[VZ[0x\6&jŋo  no^Yg~oݐGL \LƙX;='xF Rʃ,Wӛ@qb$Tkq4&3H2U7$3#M[ P"Xx5x!z7@,)G$aҜo-*QZ–YЖgY-׊k>M!|}2Y-}i,"RƸ>hv0呂R!ڤTA &au?!ǩRɨkm /PK@c=PK 4i4Object 2/settings.xml͙W8u GS@@ MNR߄kYԶ{sss}[87!C qȴ=ڷ_wt2A.,yԍ|H&,'VJ($% b%|J-M֥,AI8.i8bQ_=4u)gQI(J$;$Y q'Zn=_\Sa#r$.Mn}[ di`v߯}BЧy—x*ƝoVp"}5cm)܈BEM Ý E0ؠ홶)Է@8E3c1aX#h]<n*5@ـ#$3Dg€!HKRLG}@Ig-VxsU&3#W#"\FLjVa D#Շ䢂3b:NimJN42Z 2gDTv*rZ 31-fCj7wSJZZLNE=,O_yM׃/H2mQ_\հؐG!GX"¥1/F]Zu2`-^0W3>thɅVMsf=l/ Qo6ǣǧ;Vl1vHo5ywGgU5 _ 6 'gX 87?Qpȫqn253w9hv܇>E[E6/KߡB0y%QiVyK_\AO3ގ}Iҏ}c PKYjZPK 4i4Object 3/content.xml͒N0}+`GBLl%8Bl5t)76;L//9?xn#שP2m#.\x^x@N|/&hKMX^MoF;.q,^1YF,xVمY|`r^d"L#fi!dYeĹՔo4kʜ*sRo)c\ }pҭܰ91ݤv*R)W{PB#CM jX8 Rjl;KwҖjl;V!΢GPK @PK 4i4Object 3/settings.xml͙W8u GS@@ MNR߄kYԶ{sss}[87!C qȴ=ڷ_wt2A.,yԍ|H&,'VJ($% b%|J-M֥,AI8.i8bQ_=4u)gQI(J$;$Y q'Zn=_\Sa#r$.Mn}[ di`v߯}BЧy—x*ƝoVp"}5cm)܈BEM Ý E0ؠ홶)Է@8E3c1aX#h]<n*5@ـ#$3Dg€!HKRLG}@Ig-VxsU&3#W#"\FLjVa D#Շ䢂3b:NimJN42Z 2gDTv*rZ 31-fCj7wSJZZLNE=,O_yM׃/H2mQ_\հؐG!GX"¥1/F]Zu2`-^0W3>thɅVMsf=l/ Qo6ǣǧ;Vl1vHo5ywGgU5 _ 6 'gX 87?Qpȫqn253w9hv܇>E[E6/KߡB0y%QiVyK_\AO3ގ}Iҏ}c PKYjZPK 4i4Object 4/content.xmlJ0}+X6mM67pCQb6Mj7^yw|v EěpH99~ Bc"nqv0Yp dHT`L Rt]fS#=)X(˨P9P.B[`0@l eiA_4M_b$T!BܘغTQe^ȘJY%Mthѽ""E- {K;^ !Z!GH x ޝ$qdp319(4|"?ebGkA?PKKPmPK 4i4Object 4/settings.xml͙W8u GS@@ MnR߄kԶ{sss}]87!C qȴ=_wt2A.,yԍ|H&,'VJ($% b%|J-M֥,AI8.i8bQ_=4u)gQI(J$;$Y q'Zn=\Sa#r$.Mn}[ di`vߏ}BЧy—x*ƝoVp"L?@4s/m)܈BEM Ý E0ؠ홶)Է@8E3c1aX#h]<n*5@ـ#$3Dg€!HKRLG}@Ig-VxsU&3#W#"\FLjVa D#߁^rQ  ՋJ|4 a'sR @3ՊHJUETDPa @9љ]q5)% --&ĢT`\䧊qfզAQ MjCΏd(ZG/ jXClȣÐ#\WRߺF]Zuzu`f֫h:4MBo9ſeEk6\Hu _U7xz+`;7xգ3WGV/ߓ3l,Qpȫqn253w9hv܇>I}oCckvo5wkI͞^!rE?040ײϋ ?څ>j=ST۱SջCTթvtFPK78SPK 4i4Object 5/settings.xml͙W8uZ0 Jف" oi &&_ ǑfM'ߛ2 G}Dfq<־U)`٧^@\4aѝr)S+@V^l߷.a%F䥢9˺$yrqN^4MS_?6(gQi(JHvH ROfV~fH!ZEkھ~V _ "\7[)W`v|>gd^D1~{n)7p2{F3"ÀٜFrȧlRbkD۔s !Q0,MG<nժuGF.L@9$+B€ HKRLO@NIgmV\J1DNf03F*FL‶@cra.=Ș^P~֘.M|b)kn NzΝOš˹m_DĚx@2yF AbR-Cr%4";+.e^R> *)2xrWh '2l je8 G\.QIOF5[Q-YCO)? h} nuLFּbārDJZ!1 .}9p% Ox;~%I?/PKLxXPK 4i4Object 6/content.xml͒J@>:'=4c(B[VZ[0x\6&jŋo  no^Yg~oݐGL \LƙX;='xF Rʃ,Wӛ@qb$Tkq4&3H2U7$3#M[ P"Xx5x!z7@,)G$aҜo-*QZ–YЖgY-׊k>M!|}2Y-}i,"RƸ>hv0呂R!ڤTA &au?!ǩRɨkm /PK@c=PK 4i4Object 6/settings.xml͙W8u GS@@ MNR߄kYԶ{sss}[87!C qȴ=ڷ_wt2A.,yԍ|H&,'VJ($% b%|J-M֥,AI8.i8bQ_=4u)gQI(J$;$Y q'Zn=_\Sa#r$.Mn}[ di`v߯}BЧy—x*ƝoVp"}5cm)܈BEM Ý E0ؠ홶)Է@8E3c1aX#h]<n*5@ـ#$3Dg€!HKRLG}@Ig-VxsU&3#W#"\FLjVa D#Շ䢂3b:NimJN42Z 2gDTv*rZ 31-fCj7wSJZZLNE=,O_yM׃/H2mQ_\հؐG!GX"¥1/F]Zu2`-^0W3>thɅVMsf=l/ Qo6ǣǧ;Vl1vHo5ywGgU5 _ 6 'gX 87?Qpȫqn253w9hv܇>E[E6/KߡB0y%QiVyK_\AO3ގ}Iҏ}c PKYjZPK 4i4Object 7/content.xmlJ@>ź'=4cZ$[0 4`xdMn"^/˰7?[lX)Ҝ4.0b<̣m c<#'֩;r2*ijq < 8NCf \)FݏobkC*/\4))@UUF5jd2-N Q.PhTW[BLɋc {֊mgH  /?;=-pS,31;e3Jo*`A ?芍3mSΩopagF-b°vG\7zy(ܪUj4  sgaGHf΄C49#\ZJJ1DLf05F*FD\Z%?)JլbyR։|GD{Eg2t0T/*2iJe$dT+"!(U!R @T*FgbZv&o璉,zPqY*ƙWG ^*w9 e:?ۢh !.a !vB~s]EKc_tc1s vte[aXf|4-w ]{Q0^lsQ#%~5ƣVlGOQw2ck:W7 ^j0YEl7Oΰp4n6~x W7vdV-k~g4qs{iz>6#}x^7nyj]Z>/ź'=4cZ$[0 4`xdMn"^/˰7?[lX)Ҝ4.0b<̣m c<#'֩;r2*ijq < 8NCf \)FݏobkC*/\4))@UUF5jd2-N Q.PhTW[BLɋc {֊mgH  /?;=-pS,31;e3Jo*`A ?芍3mSΩopagF-b°vG\7zy(ܪUj4  sgaGHf΄C49#\ZJJ1DLf05F*FD\Z%?)JլbyR։|GD{Eg2t0T/*2iJe$dT+"!(U!R @T*FgbZv&o璉,zPqY*ƙWG ^*w9 e:?ۢh !.a !vB~s]EKc_tc1s vte[aXf|4-w ]{Q0^lsQ#%~5ƣVlGOQw2ck:W7 ^j0YEl7Oΰp4n6~x W7vdV-k~g4qs{iz>6#}x^7nyj]Z>/jl&//=Zq)|:71ɜh» ٬Z#xD\jt :EJLg嫏 S O^u8S x 3P!߹4Mѭ^A W(PKtz PK 4i4Object 9/settings.xml͙]w:ϯpq{V ~LP(Vw ChID;1!g^فo+0d4$.WaZVfȅ `sхUBCBY@{weK0"/UmyP8/% z\.]W~`6aZmkj;?nЗmoˡU5,߼zgFB0k@ µq[.qfCvW_KLA4_Q)gs܈BE͉e Jo:`E ?芝3mSΩopagF#b°vO\ zPU5h"z0eŽ hv2D"+I19'AuX⏞s(6Ԅq2bj(UKuHX/!\%PwJ4dNS*# sZ A HHJ5-@BQNat&l`hb\ǔSbQ*0.SW8R (k.R5LGxW=¹Y֯JuD@;F|nnaVk`=Mz} 0 ٌte~ru\[O2[Ɠm/t)ۭa:^[ft}2Xxmt}xo~+)փ*[bӡ{pƭiÛ g<w&q{K]^Oۣksd]{{|xlorGz^x %ܮ&bw/%ʅU !h2-:C~-p2ts(t^m "A[7Zf."p|CޒP_$n1MMӕ,Q'qIJXApeGsCAaVI`Lp:YaQG>9) ?kt]RR͎sRKPOR>[E6/kߡB0y%QiVy K_\AjH3ގ}Hҏ}b PK{ZPK 4i47mmmeta.xml OpenOffice.org/2.0$Linux OpenOffice.org_project/680$Build-88252006-02-03T14:24:472006-03-09T17:32:26en-US21PT5H42M42SPK 4i4Versions/Version1{uX\˲/]$08 0xp܂C 8 $g>{U5Uݿݥ&~t [K[=`d cs3e- {)l sb5w4U~Åq_$AvfΎE9X!ܿ~%#/&V@|P-rdCT)/ %i[HO%{Th* /.7fġF&r4jQ vrFr_%s(9'M`['_f^ 1R`Scw)O ~ z\KA]-kG7O!|`4 fF֑&V{vm\ zQ6&ٸ(cR#Ww! E |MT$Etg{j͇gYA~d`%`(hj[Dv>S4{_NGNh/  aPϧ? !FFC "+388r3:g~:3S!X>v41$J|BY.y%7{y$֏|O]Th3A@{/K+t=<7 fmvBc#f[ܶ#:5:I7~KSy;~&6"jICXf%*b$%m1O!mXIQbBf9;=3q1Q{PT;C]8HXRAz#Iq#G;B@OLswJ,rR[e.Rqb%DbAQ? g?%TH(ގ|MEzg4\%G m,v.+`u5'l< P{6>&jOrx]_ ?./Wh4ޑ.7aE.旖a3?N˯PFkLGS|B2R/(d\N+zI$Oɣ%zjMZ+>)Y?i4Fl_`4nu8w'Br ;Aw9TɮS (FAK~sCM㛳+_e_E-$1y]vkA8 @Ƃ߱`*VƗ3Qyռ: n **\*ly_WIT(-Y<_Bc#W̠q.SjHb{*ȒjD]3ww((r(Jȃ!:M~Y)_<^Sx SэM]]CBZL$VJ*⺛.ɀ"EAm}.`Ap.WWt'e;OМ"k%4 W5[$;]Rǂr!ht )1N YtG\P5 Ažh/YɺQ)ĥ'n)\)Qu8#Cx0U}]+6搏k5bbYQؾZY0;9eF-a)itA0r9SZJ9$f^ {6ĝcq`ncX 0%e7ƃ =!',^psp?Q&\B¥8h $V !P\+5qTBԐ(v$\ǟ eW0ogJ!7G,\ V$)FW‘hGSΐjXW$a퉙:dALE;ݣڕ1uRBZ =64SxCÌekÙ Q]JԹMIs]M 3/o_mWpVC%z BB-SR֧ѵ+ت et޻ȩ/݃tI^rQWT,!2D}E9r/XƟ*>;JΛuHz?s#s&\{ZϠ5.xڣq~bREheT/XN ^YB V]Dе -#}\z)"Šhp 8] LD"ЎKښ3dIifMFs{ 4c)ݛGkVqfw5?{ \]qͷyո^y*T ױX?NWR.܍Y<$/(}jyeH˛Hj8(A՘/Pe,/N>rاlP]'ռ=b)`N~!1L{';cFq;߰ri>$M""=MM}cVjx @f{5rc=iWh@ *|@`jie]ugoc8q09]Mυ>̿LS sJGi ~w\`Q,4{dWhkÀ᥁o=v]f{ M,ʃqyYtVsl8K B[;!h(P % ׎Hυz? C]o/A *{w}bNLu;ݰO|ƅHmle KX!l'e.qk!yHΪ LfU&-_yH d)&{ Wn!M|벪֩8Z+;Wv>E+CꤡK[x֚葯No&${+_|q!UJ.W'"m+2Kkuo6<oa 6'T`b[XrK3ik65WcY+&v#˱?.Įi.ԗ8 u|MxT3~IOOYijt*&/&͇++:>q>a°`˓M9(@G,| 30Fdw͔:%-N| $>m^#ⷯ>;}c4$2Иy^-\җ= d3C<Q{]C 0_[걝j F6t;M`Zb^[nq㶡MyrPm*ё``pčǫr`݉xg\ ?5o *A/`'w f?r1R>Ek%`l7Nr OڑOo>at1vI2+ܮTg|y@=Kt0jmU6َ^UШ|$t-5Y~mr*O$QY&Lpܵj9|Eo9ܰ ύմƓ ֘k}}pF#B"DUJɸY܃Yhsz i !'-<@UOe[V0vq0Z\%e['4Z]Fj>Iv<\i/*tB"둳9!yRѲikpĺi(&@C4Vlc9="#SH'`7A<)RF2m4_? ʟ B ɷ QeCI>L-Hfo/0S%FH+?k3#nx}h#gz/5 ,ZLmebGUozRbӜݞ2o:[dh!)kƪBDI: u1čfYE;{8'b}tHq x.3 olXa>@^]`!攎8)`+.f` xʅ3=`~,>AajM;Na J ,˘^|{]̖j+8AwױZmpnEC}'}X ="aXlܢL2s Tq-B%jVݷoM"vw݊pwy6V.}. q 2FNz1Weƽ\!K:Um=q̫frUu_,,i? Ԍ쎮f}mU0(.)`-|K+6sXDV& nqؗ> @̔}/s^oX^O| Rբ}௮VEhmfvv !Ɂ،It OevY\kxڍ⍆KҌ XholiMG2Mfy,0(gXO&ȶU Nx#E+BYӚ!fx_D֋g&YO?fC0EwooiJI/,.La},.u~YsJ+n(e":8[kjI l4C=2t+P$,^mɭEnVjUBw:5h/=W!aP(n@}ZiYG5xGNMS\49-g*F%m2I>yH=W>ߪٷ嬪(r8y^Rta3[m=mԨ[ h WaB¦ŧL[oxZgղޤO/o@U{MF2@iŶrjL҂ ocMm9f-C@=u9UE(rFb;0E脹cS0=gu{J;0dUI|bG42HMK1W-F?)=R@"ۀBWIֹ*/&[F*s86p2-$su7-W,'i&/5UƐ*i:n=JӄkqDڪvcQGjEM>!c}(_Ρ/V@):9YڙᚓAgڙM~.0DXNأu=cvqf ES1cɀrMtR&-kiNv`Y+K@PX=Y?7|D\^)"Ic_ȍb2Zpf$ۗZu[/ aLf!O(ZlMX b<=3UF`t7-Bvr6+b-K*[ 2-|jɍϚo4H9]*Y(PQJP2yK'VDy&E54쑪5+2hTZo*y>Ӗ/x`yI$׾ hsG~n(hakd*xJ6|%3~0K՜"o!'r5p3)u{35=PAHJhiKpb"^n=!y,tw6|q*6o7J5SfEŚFhP&t=q艳FkTq|J@$P .ȺLpoɑ+2rGד1 sRj,ƒ:6:0ja!:.~*Tퟋk=6V%\0R oڊ!QK >oXqY;>bTc"b%̧`ʹ"Ruj(k5B+iA[M $XV6>dZpo .|߱DBNW?D"ADlu=g8ЯwLw̨',-W]tSܰE/E߈2x!@!QzNzZYkP8j/֍o!z*`2::8Mکv笫;H(q5>LL]c+q2]sS0CxrSheÊupf끷wn`р+4fdZ7Jm]y56zD_tޮ]mE#PҿD> D[IXѺbW 2QtVO{ ֩BxG=L03O ,8[ภhH*64͘&D#"Mk֨Η;\ߵ3%-hKOY.PӇC3E $Dfjv@GsLC Q9ȯ mMMbR9?Z ĩ.QɌj)`5zK&}YT7Ie',`sRlinIV εh)R^d\ YA+[ʉ:;;(\X{$Ԡ (KUI*_V9 X+DȄKhPg~/lT8Ś'Z?|TiZjnJa$N!:uNmG4-{=R](  *{ b(3],^BsAڙ(SDϲǥHޥ= JOW?P, U HN{,POHA;#[2  Ke,DGLiEiʱCn"2}k7fC *F=ZI}S!\ܨ.hYv֔!&[7%o$EW3sЫo)F+,wجg$@8"#ZHP$j$<"k0s ߳M37ScN-]bݢ[EƤSmk}g4oϸBT? W96+c@%K⇈FY'w~vm5lHS!"`:z)2D"f%ݷܑuۆn]&H5Vԇ$#%"AA'(Y·MLr9\|45+߮*6AwZM1ӐAa/QxOi⯊G ng#-!:%K {F˧Q]d$6| Y`ҳ:f  %B=y Q/xbUlr!1cfZz+CPǟ:NE4:( yéUleJz9<:BԱ-MEuL|v +}6L @b>\]+v3IuY mԥmjF֟U1 `}"}2 ddvэB62PnO OԀfZ ׾>N S5*w& :ftnND[$J^Pxr}P<)g(|ƣ֊- Ct2~Bo.@G%NhޏQaJM >JQ$!%({ ?=X*aJgG;-vƶ@@,77K;kaJ ''{66WWWVW.V9???IMwvNe `H2+]hTiwe,O~3w9ٹ~;5@߷ibM,m~"P"Be:;Ee*׿`gVsv#0=cp1ebEoMc15v[1 ;' ;'7?~27vNBlW>Pۙ;Ev{?oabl`4iM%ŧȩ ?rYLfv@Sw|%L)gg"d;dq쟣ЭN߈A'l$LSa#\U> 2i> kv"ahD^Voh](ٱu?_twžHOⅾ %Aa ԡׯd&z^;(#vVJH}ǑPZw_Y:d5Q|Ҥ ; ܒ|F?m;j6Aډ2YvE#*b]#uf7ژǷh!? s7-_z!a|IG^߳l^]VFĀ["ZԮ/T7oRNkf?€ra\P[]U[ឰ3? ~U"@vEovu[n=G(1P׬6ƞ^GVw(Y<_9wM je_LuK`Q$3!nŭheEX2::=x7!6_LVm01[Nj*Q1qMp{ȖHmh\h_Výwp:1ֳdUb/Umo1Sd&P{җk5W52[[4xrKI$EL 3-lc*IX/9+a5 LYu†[2 ?Om'e!4k#/T~Sg|IMꜷkȝWR~̃@9a񷘲iӆ'b 9Ex {ʬѨ_[rwnKL!g lE(ιof ~"w " V_1v"Dۉ`n2>`7.on`DyyigأLܝ/]A6oB:'D~pצNz/b>xqx۶TPZڠႿToRnH]"2Ծ=o$t LeA{u|U>V<]ɑ~? t~Pd,?=^ 䱵Epo& 3uO( ҍBgBS}pQ-,PQZCENI>1?O%.+/<,]0 8 ~'[NQ-ffmW71?$vQ"A&:iҪ8\iJR-8p5Ɠ;]Ot?ЈcI/b1 s= `vӪHkfVH&a06HQ!G0 0_{Fds^;5 XN Y xY)ة%3fBו*$< 3=\牋'K7`0n<A|+u׽Odfx5}GOy7GQyw-H%Z6~0&Jf~zG}P83{\?`ġ Gi΍Oiy&-/cς2WA?f, /ӗcς`2WA?6,h/SHc2O~JdzH?1by+ߏ>p~S'sJqW' Drt+aBǧ}+dr`W?}%dW?nDok*E៕f6PXY8?^KU1?+'Kկ6uep*ί 8֯?*S Ɍ5u(ïPKh0EPK 4i4Versions/Version2eX\6 4w'@pNw B4X9w&Ϝ=\ZU{{ݫ֪-'rŠ2zz9̬n@}[[K3C}G3kzgk#:}3:[ڑ^AB{CN#_KrfN@`n~~#9 [cDw89@34yBAGz} L`0E~ k/ovi䦕2أ`UX SKʄ醙x5~u> .`iiz;9zq1h31$ֵW k1қ $tqBwB\p$DK*L;y'd1S!~r}H\GI "' C^+sm'@o? . ID k60u0 ]7΀BV{/+HT3f vBܞ" RubmX |^1dRӏ8CDz.8 {yʈI2@97ԗ42}@ тxee_bEY,la@f?vA'.ɽ@x㐲Ky>S46氨7PPZ |x imл`0h "  D0SA$?te}x;A0Ǵ4J~urw2\O6^F$k~] |޸ D{)R4W&\rBmPhA2D#an@]gږL4gHeJK^^4N~ GOQ.@-颈V3w<2Ȱ1$QT{#$-2Y.J`@@|(g2 Yo0Y OX.+Ø;~B+0 |~8#>7!-"wj>AL6> Y:yp-yc:Wlx'Ǽ&!gbQk"cc@6%h%/q N1 H,["TqM/TWe=lq|#ޛSL9Kj 9h ŒvSx!4 3uI QOV#SD͛yBcg1*`U06A~R?2~\ޟ%wpڡC@osAʀ £Ao>-ϖ&0(@h_rdF%gE,$G+@n_‡ٴSrZidP,_G7=(,]OGZ1i[ It W5x\+{lS @ SB "E0D.QSnq[5tLBVd awpr7dw(H/W GЪKѪ h 8CO(F)d_2bJ0Ao秶rxt3qy<9kߜG|}-J," -7-1*o 7Z(׿S*c0z_)0ߧ_PJA]0Kc& }[ޢ{3Оv,BSCg}D5iICЛ 6◞9 moɨJn˞"|`e~Մ"͉1WOzN_u`7NYHTbm~"^uG^,؞@2_ x@! T^9u}lZAfS OF9KDw('wDg_ hl'pUXhu'$k۔45G0ޤI9sUFM'F*MVƆəz|HVuFxw#Zoxb?ƀ tTVH+I601 =׀LC9gY Fb}/H(2zʉiſXi8-%Ja$lbuhK(tXb?X]BcE(b cB5=8X^貸`h{FRY볳I6Zk' E)2Z1EJ,H|Y\LGI鏻¢hӫGBG4^g_7ջQF(l.{?j +\{r.0vFC㽅`N`):CӎhB & R% 򲈸k;\" S𾆶_G\kz* RcJg`ղcU>0]v3PKUMC_zR 14v9x$܃'?7#.ngs81*FcԤ"֕iMB6C OL7ibtڍ)h#a˸ӎn>-55I5^ʱ@pqF/u_+n=oj9LpPfGKvuKE-.DOGrO@^sq7IhfsP`{%{>dXe`5=,3ޝ5!f>NnzBbyCv~2: x#ŋy;Vi j_G'Zy4ߟ>x)6_z]-i<XQFߴt+N\tǒƶ eF^T(:nN0"CƜr=/f_r]aB#}otџ,Y%zqDra9 u_Jk DH/ Y@gB%Nn){)}O|G,2?_5zR>6NeK3uě/Z\/lONv ڒC}x94!LƓ O q'4 ' -="w8Zl2,%@KE7UL"#5jGQ^jEFTtnϛ3祣>=Qа#6衯榚#M'%5#ޱFh٤%UP3¢CNn+v,a,OFx &Y|Eqo_P=z٢Pᕩ{1$nZ_~a:aGO@#`<0|/v(<.q)0LEBEMuukXwa8• ʵuʥ$dx5YO3-YOcSx˺kjP+& BpՁ_ d?.zpEajA;6;,7CPfPc-`Vw->ڴ˘刅6^^nu^C  W~xtzHw~_Ri5̙-zb;'YnF%1#Jx:QSfQGY cQ$ (V% zd̙7;ǿ4%zm[ǶM_j|隈HZb[e!ӎoi?LO՗,=;ԓ2Hoj`Bտʚs3%B|SBfX$|rs %72mv~xQ<5ņp&cm+ 1"󂶩n:ToVw5=GtOHnz.F4/!us4%lS4۹!?cd=.067mT3 șo孽ln?}]Fܳ$X<9w)͌5JUtRW:xQ<3ۈB3 <#w;m@FqM[0y TtJPoGxfcWz~f" +'a>c݈ [Wq~H1][q݌q>2N.G_=ofJb+h'5P|Pce3aI.-^ K]v\)ʠWU*;<54/Y[6p j,  . "Gз:m3',h/umiU N$ [gGkfR&C;hkʌ[XA5vWH=إ]RFzM1X[(Q[QlSСl:m9;fZTH吰>HJf֋rjR4u%VC4&՟]Eԯ>0)0dרc {ꤾ E)T!}|TuN1Ǧ$f>7%[Ps?;neLp,P!&?@-@$'A6Ǧ36%xa@%m(>Aުvk>f&| ^ů")7{, ~Q(ө*6ɺl ٯ>g"5*EwVAe-byJtaY^^io8a"< zIv^Q"f?v. E6yɳ5C |@~6E6iM a+%Rb:^RbF/jU;g/yAyXx9CHK5!+/&l8Cu;Չ;m2jb]7.|^2#g3Y#^~x%(Xsnlp7IY{-P(͏'* OM/㢽`S \ÿk_N=$V:|<Mq3Aez|}W`S\@@ ^`T'z߅OFh~ 8WדyyG<=:oh׏\RSYܢtlKх7"Z@tv:_4u&*MX41$e+U?fL^&ed0Y+p{e_yk}$^Ϗ{cByx.]ux@%6L#0C|oMj2/dKy>}_9P26w[_&hfmp%yJҩjFS-hCc0jSUDX b>g20V8!O=ZbOv8-l Ef*D^V>OzVHo6Zd FIHXFƤ#ƥ8 :$CdY|Eq}~Sו5q5ڥtۢEӕ.tib^$<~~YDx]k/ 7$zj`2eݔsbI:\Tq $ѩrd5?Oxa&,6=ΖZNbå0~*ۘTwXF:;NI4yAĀ UvN8\T]?c GxMB1E\:ʘAS+qޓnHF0\y I.;Q<>g0,Q~-H-&:?L6ONjl@_b!p+I]):ɭx%eX!2_ZfEo*Фiq32k)p,8z$f ;Z/XѼZl)4EZgŗĠ4oM}"?\,εjW+ n7DlfaVm%|Ix<.:A, )l@lzw=dYxWcWP4:}\٧[Bⰾ c&4ѪWUEF<3,MO b$#%CqzٻN ry|ڼVN["2`O ˴E̬m zv ;4@|:aI%2ܤFF :9 Y=et ԫVk5 Ѝ lME|{d!֡]xQM$m4-tZ].b*VtXҁFU0s蟼H#Osqxh[=UΤ ƍksO)/}|KlXs.@g 4RocC#'=" lv4[Y /nGy)". I[K)ff6iȮ`(ۣRG\^`@ &D|DticM7Sb6;iݘd uGVPE]+hޠ&jc' ;h-,$@ .&#*%m/'7Ȇ붑z)V[ⵒ}fQtYmdx0 )۬qaw "| O" J%)&ٙReʎZt"Cw=vRfVM չx BY ?!њyyP+ƒnϤ]d!m|ƫxH|bhDko.uM04l+ˆA;#Sgq$v#asj K71 EssCE; *z2P=#{s&(.}Eie ŢWzRN>žJATX vSb2fۙMG[]%69L ̎p'}2 ¡­IgBxB_(9@hu [>t0Uz_ՐϾ0͒trjOǾ*:\4R>xd CV6HZQKE򍓯CvC( $~ꯔjۧv+Nym' ?/UV#5g˜DʞP99Z#ބwʛ'|^ռQ܀/qUWӓ3c3kNyY 3:XX8!;$pyFRaFyѝɎ&{IBmg\5IQ^ CZ!G"ӻ$lºXwˊHwT2‹) \*bf1hB- )gP-##!F< 14ؑ:ϋJksK_}\_ڂhǯԔ/f9W>#|eOqˏH̅'uX<{F?)d u)J?ȕ#j>PSrqUABƦ J71r+8DvG]2ᑩA9 =oq~4Vip1y<ӫQ0OeXUۆ{\ [ܦEJCJGcYX1 ܋*lamX}Ç#Y7Vnбx%Ҍ=biAogtlx q&xJ Qruz18I9KfTfOX,dkN:=00Ym_?Deh9pW4Ag- eM/[l,^%!WFճgӻ<^}+䧀t٪|mXȔm 4LZO"Ԋ\e"KGAϡc%;Qx90R jĥhhr\XS)vͫl>o#XBB$'\zV%VU tOEyx)ԓ[Das H~4 Qv-+qW",):bșȒdBc5HzQ\Y&\Q*HӄvP5/읖TMRiw$K1Q H཈!Y˨}B;w2߳b-Ӭ&Tn-pW/z/׻RM*IxDv}|^$ M^V}Wn_ksCĐ~h>tP+CsD;#Vx˗2(D`iep-њgtFQym@ÖGm[nl$ntX{|YeχN5nrᆍޱ1*e{'\WHfúa( ZsTZ>vXaE(wlߏܑ*0?f:㔑BZl,6G2P"L@\L ̀ zJvΟ4C{ݐp̊f$^8fwpLy(Rb#$ߊ)Y} ܐ >d>2Y\T $ ,?%΀%F1S#O-tTNpw\,ꆋXwDiV]n ]x}Tߕ-ń PWz{ Ir^hƾZ SҚa6vb^֚ }K/{>ߙ0=)_;5͆Lop"k+`Xg ɻCʱ4:ݸ'%} \0tZ]"<(8sI@Yȴ}?h$c]RxFh4=2A](QB z~ oIQVR@K1M f o;0smf@stY~Iu ySdn"T2/88dz=zbޖa,"Y|ڰ؎pYsGήZ9Z\f ۬C]quj\eOx`|0}T#c# S EaGsɐ.Jꯒ20g:cD*l8ڌ< :0la!*6~:Φ7 b mAa&P+v$`}*GajS!odB2pjS؉p-+\?7lN$$[z]r=R""ɚ?k[ "?"5|c%; bfVj:V6[&yԷ>29l:nc.P[p"]w|_аԺtyn[ղuReyO^M}ʒ46q{GmcEP/Tjrar4a|[D@3݁Lfj]eLr 9I":}I Kc}2PdMǛI/OIEt?O]щ枵7'ȁ;q_,,-7ðǖg3*}H21H&#!ܮȶ,)w/k^̃>|W6Ųf,:nÅ)u-gu\ӊy?\OgM|-ìv~msc*S4W%%s8TdbgcFS B%ΚGPa}"e gj0&ryRNFb6q4  L[8oWLD &yYi-LK_C4h744Mo fj3!a׫!{12al}y+/OO5V͚,Ե{޻Ub=,2Y6"=mhsɤ>c/h>:F'+'T'@w ,3bWedxsd!7C@*Q <>(EeP!WOѦ{B3 ,P}uN%m*x>PX BYE<.C[16ph0򦌁0p4MJM C1%]1)FQdYD7iVQ&XV6ʅmG.#`_'uP6@kx`FbDm(3D4M2N2yA:LXPg @`04Q-ɸ;˻߫9N?xsz KZWB&_N4CZVG p\P@̜ꊚ`4 "gAxf~pPjD;f:Pv\U\)!7ٓ/\ԱfkVA{.eWVD*a_`|HZ2GA/bΉ@ WVe1/_7b L} O7)g0) a؀2=d&c~qf4cz#|.5Dymm5c`GA6lb.~BPwMD7xwl?oxG%aQ_5yk~%`ߝ6^yp$"&X-<ǵ4uA [vhGq{͏v̪Sa6ꔍ&nP&X9?_ tއFM{I^͜:㌄f-b$w+R 'V^=xbGxp& X5eWk#*X|)A+]=E-tgkQB wN96Rd@8MXP3ف~eM^]T4ح&6듂F2MBg(TRTЗdy:bN)P:6XZPE=5Ó.%%?Pܮɂwֿ]P5:$}k87LH҈'=\DMY5D0z0G-NbHNֳ#c?5[~Y/l{SzBLőâ XkmWu n?<>\!HߢY' [ް`> [\v˂/oXpb[ t&aҪ2FsR{W #">o`DG`,uE#'Z) {lH~"d3/+%N1?|#>2ۧB`~JÎc !?-ljG# \1V~VCZ F^2h먰adq->ZV;܈}\$8.i (KeUޮ/X93̲L[`%"Ec܊*ʃ= Ȗܭ &kE/oYX+N|-Z??y\ 3^r5At댨Gv_n3h[-i~v#|]hb#(c1Di@7~x,;2KKբb8-9#"j6#JMޭx˙7R~Ia)GoνQ0`(>'NiiZ*OܷԤzߪMo}qa/=F)ҝb_ߊ\ɕ᛺6zVv-;;# 7O*|=0Z#}G Xi&%fNFfNf=62|؀UMR&N&@^5{'Ca)1p0( F@c3k+!6!f ;bO1!Gw= ]oN?'kGR? ޿)  Q<D,3rhIp5m:T¡%a.=O {7Yqx:1! l@bo O/uZ>={ՍQ;Z! ĉ#C(RId6]eP;FUR?KVAWG6-xp4pjW`\6'xP7U3k *>>^h)ioVh=_aL جҰ/\hlD ڋhL?ɌbIcc^wW,HVӍT!wُRW7q̗^E Z`kw' \X8IA嵣={ h+tEjWrulV/yn`P}OhL  T>1>>4^>l{ Mt, #dUZLj͖ye)!b/͈'T0Bp݃3>v[۱V&Q!'?b)ٜ]sbUByfŧTCg{1ﯓzkA.'/+\O# UكN p`;1梌am1;`7܇TF83N~>-"-l}Wwj W\ghb?kK}jh8i F-¤od5 #IWOc:1%zBL" &^ϩzOG>+aqh$dǛh j !״UJ ]k"E@-(IuKԍMpGv(&B2Egh 7t?yXLLyz*asQ!f>@.?&+]bRjI[/!-506ɇXˉhsI y8~%+5k4*0/3<#氨j"/1Ô٫Zve1X ٢ן "2[8M o-{ 5e;<;}ɷ T ҹ^dɆ~@̷tO v!׀iDvk^>'ɹvH :[Eo12R΋/uBpG0YUGb<m Հ[LZg$u7ovx~ᛯd9ܝҖމ=4yp{:IgO*eyyߏ:E =_gc>E;¥:ʚ}[rizѳv}%DŽEyDR U斖ɬ 6+_ (}\1Ny4njPt9q+S*9'oǝ4w7Ϯ2nkzZ@j6g|Ymht_؄g+6_, T|;Iˏ&Va=m~9ϭˠH5VtCEп,}dz?+_]peq ϊW}5VtEHJ~A) *Wz"PNv:W@P5_qQM{ML]g=4wx}#Db*h4۟oY5u?V<4g =4%_/ Hm?I}h؟/YC#b7_SwH~pYyF(Eazl)kz?Gx[-\9)H[7WWD?PK2AmPK 4i4Versions/Version3eX[- /]ww n5n>{>7Oj1bVUI~L?P@,666V'+:k]{S{:kC+k}GKC+:c;]S}{?wEEChEVPABW(V2_@BtGzW3p>={D=K`UdVa/NE-;P 9"=2>c.XwoKӃ,y&c7oiRn?OlR,zʁKW*KQ$!=( 0N3+\8 ,D $$ _x  ÿPix4=[RUM"=48 ƈߣ :y%,& ?}g97?u8a>p{CzGN`glX;jbRzavaC\黵{|/=te$ M•RA1{hzMtwIr;W4?pl;}ϐs5p = UW˸cbx4\3r700Sllⷄ G |~5U,C)h#'ХǵQG8{ "1)hm$TCy=,_ТP(L͝ZW)}=k`qD@N*bP26Q!k@9u# 8}? bHK;@3#"/8⿟_wJt ndo >sJNӨ>l&`a/&Ɍd-%S"%:T%4z4vЃ3AA;g7ǠK'#sGm,Gr G֕78fn X&K.fG@q#a]jRGH=ht`X4/m8끪xd@:/|]LQi!9lg? C:SVH k&vW32%y0ߠj_E Z\3S7-0Wc-( \O1B5x+(w焨 $?k@"{C>?Ol޶M2n"_g"R&:N@&/ &k} D6e:ԩgH>XoM3Og3rwĘC>Rڑ4 vX0ʣ4-3t'F8pIc})N`*``zGYHCD~qh{Ԇж#k L̎,\ulwp6&_P<3Ȭ`r{Wxv!!7z14@amvʌQffPfoY" )0L5=ZY3otP4XN2nAz`0O*c#S~NAvX)˿t`V2<S,yYriɭDyQ9B^ CYcc@ -+hFE5Ф4&.&D0}+E[fh`q$Җܖ F·=+(I:wتSQ㟋O\kY W Rkvl%.>y?r\+b1COGD}L b.f 9:(DWJ4Zɫc\j$cb_?9CSzޢ[P|c Ijp;H*`Qp2ӰI><-IͶ)7BS9k'KqƆT#֙xdL+LJN,t1#i Ih6K߱6B*WO%u4XvFcܲɃi$TxSnT C Hl!&#Y:z#Tè&CVHm ہTdG=`zO C\?جVSӐ }%u|Q%tցBM Y KCSZA}RG6Ig IqP0~r,zGT®!vBǨ#j'}XK.y[_ ;wW765JzReH/OmM-fz$%/GERIZkReL1߆fF Q{}VvS% >q `UTH8q/[9 3Vn6 %L:Hhu* PXѡql`4 >sH>ωFQn"l4@%Y>srRk/+`WSl\i4} HKYn8~qX WuCbl*8PQx-k۠wjJMd ~!oC!.wygxL^L,TVv(r>e!+,c4NpnXV^VK^YήHm_Z1awkg$OP]֨C>c}~t?ҠUQqQ1+͍R;`ů?|ccI$\;N L&91ufTm6azZBM6Nǜ ,WRRi :w}'Urހ:zCvyt ULsiVsCpHGbv)]<,:,H|PCL-A7gTvo!\}T蕉%,&4%(dK͞<:C#E :DZ =׉UCw~=%g6x6_]ul结S JW;5ӏ oʐ\6k^xa+z @][v^9"H.49BE`㘫~mG^ 5sG/h"GqWK )WM=9nz[ :m 򥠂:Zk'to]| sFlh3W7Ѻ$8i  9-CEF}+Sr.%@Q@:q% C(cS)zlJ1WGJl{ {ٞOmqV.ReOc "y7 m FTQɯmE|UIRN% uɄҼeٴ6MŻ<<_Ĺ5D_a$VCmm 9B!$XXu8ړ}vU N;`/џ!`9  "F{י Ł&[ Ձ.O}:-bRV$U8~h4Ka|c$Yj0`r=zŢHNHC* '~S8]3pJDGr[rƕΤE-,J=XLiD Rd /7wWj$&OJ$v7/8dX(;a*"$cAMቬ}=WRh<ru`|c]DqjvΪmdmKt0B1{8c3ok pKyfY%\nu?}EDOd嚋(0,8yYjGkB^ ԙWFpA$LsJ4Y);rZx$88ӊuSsofv<5nقv mjKop1,}qv`䧣qK#!oBU H } c@bv(VT\:McMGpKB>6{[x)E*#eJ恱a)N@2yu+Ϛ$v_ H鐂.<5J L#?\:{Bdb Lֻv%|h޼PYBO'GXlØJ1b߫MG\g:㐴" 2> sY ŏBlӿZANlp%LO<_VI,'B[}r,6nt$߽[JMRC 8I*Tl)i[PddU:|APJ%HGud|Wz 8@ooq\4*82UFR̄Iv婈)f+|$<2_FW)E؀D8E=yD*z3^5G3ō+SNIt ,AYR.he$;,D;K}l(o7WFV>>欞Е5ݵ?Ata;V>`|0š+~c,=ܳ#0o]Q~AxƜ5sYsF:P'P;nuȇ{,\T㖽ٜ&?bpQo'ܛ8NjHn (mb,gigrNmnݫ5iuշ| }&;\xކ5gL^`KyH,Ȟհ~"Av"}V7U;.u|)؇\fi#;9BV+8Y8n n %Dd[pWQ!71ƾ %iD>k$Xy;P*2%NM a<# Yp9!}|Pޏ ΰix"r\pq2Z5({!l/2G8Hx.b W\h ~,\L9G V89%/䀱 T9Y!tbp1>%6k$=XF7fQj7{,Z1 Fh q)bn=X]7td(CE]N<~W 67.nRT|WǕ<:s{6bm z6 }X0C.Q(:ߞ_mO823\Adp8]q/_>Ҿ$Xrzʣ 0"~lVVlXl8d)e̖s+3IVo1ݳWOo|OM~qkɀ7Q7pV&X.̕z;PvhS3W a#;E!C=:=)mO練W4>%ԋkz7 s$Qi "7ibk ;#!/mA:bE`A᳇4粒2AkK)<8JƟ qsļUAdvG"n1T!0aMPlTB Uȧde Mxݝsȏ ĿK7񮳽YW!.34vCK Τ~KVNBu.%Ox` T35X3Րƛ^gW;v}Q?U 'aiD-x}h?1: S\2A ڱigŕ@0k=Njjō,#w9FIǶO!2;rF;fR~j[@&ִ|go}s ~dM-e6Su-'s.n-Ԡ-C1*x|UYqBF5$2R?-YhE驠LF2$# -8bcTV&}ӕYڅ!xA(5TU:SJ 4IW%m,^N? 6;$nd #szu&٤W~ryux_#!*)P~C_ GR\=]lb>fӖ^ܕ2`{.B̥oL:;67Vr ր)[wX4ʔˇ9WܩknA~-aӝeO|5wO4Twy՝=\%dԼ{a׹H]776a?Ly)TF[!>;Zj#^V3kՀ~إN$Ap|?!vp/QPskn !QЭetC+LcWGjfQprZbOH&cLB/-O]JhsIh\/% k.-, U!/iᛇqU Z8((Mj [Ijk-w${;J'1S fq "ڃ62<imި8"D!t_N=Ƀ"HF-&þ7sYGS.iy/h,Wu+qAkV{e nn9RoȣqCHoZ BTJ(J}\R䭪e1ӢMUi``wpd*<j$t^Xف~mi `;1. ;ކ{,|TcEOP}"J|?kaFp~h<,K4ooUV]4圼 AX2)1ɆlffEvM͟g\x>H8"|$e/Lޠ"Į`#ԹJL%*D00Vϋ*0F2#j]\s孋=ۖw *̲Ñ6g`!KI΅˶>Y{ ~WYΒf}۹Bմd㻋m:nZ%,l`%EoL#>}o@u@+$W*4DH[m3K`%y[RKvG@0q&THN%O8A^Zhw5?fS&Rv; snkX X81* ĝ<#);m 0υzQ]en5TO0rȆ%1~LKڷ%d?X2M0\${eko"ˑ+(&28nyf,d8+y`R\Kxr` GRRK{Iտpl"Mlh I'4~oӊ䮊@r oMA[=,g{8!srz: bZ['UTj(qTBE7Fc w[c_][ԛL( t)bJ [)XŇ=&E<9~^l.3!/g ҝJà|E븧*{֏a~+6:S0 MNgE[SjWg59\T[A2bM`t#{1Yw^OzӲ~wHЄ>x*jb[T܃$E U=~W8@~-Pyz9ɹ)4bSU5\4Y&Gj{ì7`Ỹ}N|me}[-Z~.Fs S/E2 |@& zQ!aȏ&Qu:-Ҷm[)vy-3S#A2)ItHgspqZ? ˔ ]%ѬMhehM%n@Tu0-|`W#O<cD_\ΜGzVf+5L\ud9}}>)W _ʭlVJ'L"u&/W(,l5y<_fEX0l]޺ok]YϞ,5~chAo( 6.W:`Iug`F_/d XgkBpwdթPm XOz_(Ugqѯٷk &U)6̴{#< ]H≌BuGX.d hxA/@\@+|i}9`q s9TS|J^ S%C!Y%|(FVzւ]L[u}*(\`XuڽR~Vs 8 6S{L`'LP6'LYh͟]t %A-_kZ/hI_Ӓ)^> |<IK=?iɺ^m;Nl*8|0 z<]rTlh2P1( l%!bf;>ɔd-[cܝfʷd=J41v B+Zlf;7?&=I!ESwa-rVIJ5U7cuDL{/k_|^}Oε}R)[Dl)KChANM:z^;$dsB2AD(O.Ѭ 󹜤3!RBnαS$bWE,[ mv!ʉ7Pe( fpzcde.+r,bd>ǛǩOE)xDOw:I->uQx #`z3Xb3V`BnCA'+9dw\ݟӢ.KZO?%"'baLB/EIGSn! ?,i麜HBߵ_|C]þG QXG =+&YUن[Cc;7i6'zVPO+SmmZ(T+\)0x;Tddl)td Q$ qba*$v|vr ӡ_k)k>" VajBfyZg"uL 'b;Y:WaC @U%G~ &XE[ݧcL+-^] 1&P4\8\(4[4}A'__U ?># |%} Mq S26tڡclOgK|;ñsˀBD=Џl'5ϵ)?7eMSX,d̨oET@FESN hNXBW{Vd'/{q頫LN6*EJ͋b9A&m+VuE77]ux]=!u t/y_c^u.]ClAkݗkuP~pY7b1z/TsƀY12n5DyǶe !D}.b7Pp eusg~/o@JT~R%:}^;bGQ(:s>JPRj.TWȒyQ%cKۜ}M 0`#zQ`OT"RÓRJ̖+EZ?%q C0:0(2:)RĀXҋT$P|^gE;o}6eRǚ'h70>QLYCT=LiTtΗf Yn@ 7~P`c)|8̊f_۴c$Smsވw*6EkfnY,é\[:v WۃU  _FK8y,kQa0}$0Wp'<=fiNO*E4+,.Sf?NuI3{wY'ߖ4ӥ/q|1ߨ!F.YVy4GFlխn7Eq$i=撱芤=v(ͭ`&d2ez2-u1zRp\]E"#[pVp@Qp_']w 6ٽNf&lxt`IH.?']vd@G3ZEfljܗU׋}Ia}/X*K 3`s5\R$=\d߮;TC~ 8XfT+ 6sdqkvX)V6cA23 d9 IM֌ILW/8+YHѳdSiGQ(. ^Z/EKQ1b*aH Tc0DMLDL WxD[C b>H7`}OS[&k>3Uy_ʮjH(6֍sL1!'olr ]*(qJ/{-a0*D}{X#po{io>tkUydL0Ӣ:j`+ADɒ6P75ϟpg\G;̾k޹!.{3 7cF ܧBtg&HW&L$k&`wT]WbKRމ;gE/En{wÕ(Ce R&,d9*k<~fdHmdz=,w-wN6,';]pۄMue']$>.Bh#KdÌGa8cDamlp&adEN=`M308AsfNSTQQ@xמ#1/e[ۤJaڎO.X-Lr&zgeɲ;Dmu;>~SU? ɯ]$x TASq\I8J3pv>~[bajeMl` 8;;93Y888?=@q6v? {@4ﱯ=z}l _|_~_kuFzzfo{_=k,1,_kzaH=@ >e[ѓJZ9q"XIM- hYiw^gh t y^bggRb`dddf[?ƽ3]&Zz%6NFNzwo|е2v561UV~끡l[0p{74?5Go  h L y75!1௄10ۿk{S߂ټ =G+nb? ӤUuoH^]݇C` `hiPdE  & ˩^l:Fdq):v:µ1$6<*l; <#{*%0"[ՌL"k%,)dlJEe$d-"d}7|9y9yׁYIӄ>܉hff fQj>lnGu m h]61q\'7`zU^p,û׌z7~ӭ}5Giʘtѫ"Yy:UrdK=w19'9N-=Rڲb?uɴ}tW#ܰ!:bVw*+\_0î=!>KuBեGb(_s貯c"ʒrJ#t`n﨎͍R?tÀ<_g7nI.5>+7$nuC'K-|n֪tN(a}"zIDhjGEYOaUnbHE,کƼ`< WmTsp ߛX(*7Ms7I} 4_:7۩p9rw>7f -Ѻfr&z?Gw.>.;>m3ahԝVbvjUfm՛_]"GGii8/P<+fn 5s_:lP6Ȋ{,1;YXN51<ۣƍy1L(#)NL[$>\.d<48>R;Ed,БԞ.¼?>-uҗK1B=yy)mvOjm.XD?r,gzxtFu|J 1.&|\+Q ۞8S++v>z#/m4oχ#<촪> )9n.]cߣ)Inڅaao<_D)k|n/pd.OJN wser[bgSQWsVpWE )P,Ll^9"e%$lD%:T9[4ZZ4:Y5|^aJ I

    (Z+L:?fE}6.p1rA (Xq vEp3S"j`kWB z ]nP,b`2( dĠfbcBvn s?XItP,iibqf턎eE"Pk.B lo,#5t %7K .P $ ~I~˜ʎ'|<.Q%Gﮈ\9\XbLinɶ|]7ZϵV.9WHɴ7 n^m\@> Dt92;-`$bKo'tHƹO'm@<$yH7!TrUX,(:06'5w[fJa纭N &B:~˸tDzaoh͖Gf_*hp*]'is,}(MܺAqo Iȱ-7͙{gnhh5Zcnu\6;i܃f#8mj; 2](pgń2EfJp rCbgp6s+vM\`0EoR-rHI=\rM0S~A.eeS6\},3*J_Z/[c7QЗ6EЛeЗrY,a,+ĄJI7Ksso߾ X>:iܥwoKuvu]okkm Jyfnd$$$2Ace\ޏxԄyWQ<}dH Z4RRlZo9MP(rw31/R]T*^M?Ř ن3kOE{\1Fޫ U@l͹Sfgcc&N/ϥ(XSTZCw~b$#,<%w?TnCև*K^Z"uelIAL2@ph_f}Bwxd%_r}rp`/&$)]]O^|DE*xFD8Jk}`#͟Vy (L@j_xuPexTjMO/+%_JMee$7ʕr\@$953(*r|3 PjsN&F1"Zn!’3.s2n_xGyjʢRfZ(m2kXfӘ#9,gwPA;;qrr@¼}ㅦw_q3QebtYr FDC$٭@mQ,@AzD ٳgul~9׷Um:fApΗ7-,ui︽*׃*K:Y>HԌPCfBEW^'~I5&ps]x2-u>{gPxj jo>:=&K\%LGp8ܫȚg Ж* oT e3|SKpO=Whp+UXq?E\'ݫHSww Ȅvxtvvz͹0]=ƛ , !8e!t4/Fƈ@d87{k68JJKk hqg )) y&wS[P9.1yW_Bn|^y(yS'Bmtv??pU +#tX|WE9&LWQڝ׳m.:}Ae%Q2W<6atoq||4,-rУ|G[ha%whFrHw5FWD\c ħ!ױ* z'6me-p"B?كӨO~ M^Զ`W$grGhV^HIHu`+sQ@iÈ8jM&O .KW.ЇcKPF {0a<ϤR~ʗA9RcWMכo6-*mˠ r1Ќ{fE c!n\(3=t= { NqIS<̓n붶\_ N+9@r0﹛l}[h'^ nuv}{O1(6}Ҁ%ײ"|Y5"AM.r ] f?uVHă<ɔ77YOs9s,3nS摋ա2Sٜpu[N j!~ E&{l%[mڡm}P[W_ n59#?PKeH2 } PK 4i4 settings.xmlZW:~{up=YE&B4MIja"+ۚ{\&7Lf\~]q*ۅ#D=1]ƣf%{z@>(j8Rөn_BN+ ,*HTWaiѕlueA0}*̥ *Eqtz:)V|w34H(( c#ܞM1gFog ' ^3k{3Zʥ=Jf?FZZ]vcz">Z_|W+Fћ'潟s^),TONK'>owГLB/vn < t嬔=?胠)D wPlxr KuՔ|YZ.W!R?E^Xcs X/b~g 8uUI9g\mfhjOn PE[l' {/#yV[3$"GE6>ޕZR]όCzF@3gjaabrj$K/:\TO쬉ſCo8U 9]\:6m mJobOz8Sͤ(sduG3h4TunO(7iBt %i-ûm !i9A@cxH Q KБ]'# :e|d=vi |kzK3cl2!:uW;GJOMкl"5f=H%P$X l2b}3}gGaB$Y&)a| p ka~)@ mY6ړg-_!dhmUc 3m^L|rDf1zˌρ7qFLgA0RѬF؈: l(dxdy."hLz}.c#vwWڌ JPfaBog,w՞"Vg:m;`ߒaQQߌz(~CxVZIHIG2o^̽r۝`m8kpr? ^}vu`ò.j3P 2k5ǡb:JCs9-pj>܇aG#(WU^N[lwɔjxȹ7k׃R9Xl4Tb_2 #$[fڵ5dGPKD-e&PK 4i4META-INF/manifest.xml՘]o0+/v]IhH%T])C<Ͱi?4Mfmhd<6EX$38X<,vdi2~^X)f4"Bzu{jliF4h@ c&uS]|LP@Tx"gǂ OWB)a7+X[&VrRleF|, z`!\傻)`lN Q$vAU,( 8h\?gVE75U Q.F㐦DGx>_S,˥?)<:QA*h=7 w%8 ӆuYv[ͲnNve,fuewP˧}~E]I]^}ղȲG6qG3"jzőrg ~τ9rs2kb’h-Z|;ntmеF1]G nt]uF3]O nt}sus @jA7Ѝn`Acy[AՋT/ZZf"g&f,[޳ۋWd"O_PK GPPK 4i4.++mimetypePK 4i4QConfigurations2/PK 4i4 VersionList.xmlPK 4i4iObjectReplacements/Object 10PK 4i4nukObjectReplacements/Object 11PK 4i4CFObjectReplacements/Object 1PK 4i4CFtObjectReplacements/Object 2PK 4i4 ^AObjectReplacements/Object 3PK 4i4,5Z}ObjectReplacements/Object 4PK 4i47&ҵU0 ObjectReplacements/Object 5PK 4i4CF ObjectReplacements/Object 6PK 4i4] ObjectReplacements/Object 7PK 4i4ObjectReplacements/Object 8PK 4i40ObjectReplacements/Object 9PK 4i4#,{  content.xmlPK 4i4{rXObject 10/content.xmlPK 4i4I]qW2Object 10/settings.xmlPK 4i4>S&#Object 11/content.xmlPK 4i4;y6%Object 11/settings.xmlPK 4i4#rDG )styles.xmlPK 4i4@c=o2Object 1/content.xmlPK 4i4YjZ3Object 1/settings.xmlPK 4i4@c=8Object 2/content.xmlPK 4i4YjZ :Object 2/settings.xmlPK 4i4 @>Object 3/content.xmlPK 4i4YjZ)@Object 3/settings.xmlPK 4i4KPmDObject 4/content.xmlPK 4i4ZuFObject 4/settings.xmlPK 4i478SKObject 5/content.xmlPK 4i4LxXLObject 5/settings.xmlPK 4i4@c=BQObject 6/content.xmlPK 4i4YjZRObject 6/settings.xmlPK 4i4v^WObject 7/content.xmlPK 4i4GVXObject 7/settings.xmlPK 4i4vW]Object 8/content.xmlPK 4i4GV^Object 8/settings.xmlPK 4i4tz PcObject 9/content.xmlPK 4i4{ZdObject 9/settings.xmlPK 4i47mm9imeta.xmlPK 4i4h0EmVersions/Version1PK 4i42AmОVersions/Version2PK 4i4ID-MVersions/Version3PK 4i4eH2 } %.Thumbnails/thumbnail.pngPK 4i4D-e& ;settings.xmlPK 4i4 GPAMETA-INF/manifest.xmlPK-- jDmumble-1.3.4/3rdparty/speex-src/doc/echo_path.eps0000664000175000017500000023253414010707304021536 0ustar builderbuilder%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 415 235 %%Pages: 0 %%Creator: Sun Microsystems, Inc. %%Title: none %%CreationDate: none %%LanguageLevel: 2 %%EndComments %%BeginProlog %%BeginResource: procset SDRes-Prolog 1.0 0 /b4_inc_state save def /dict_count countdictstack def /op_count count 1 sub def userdict begin 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit[] 0 setdash newpath /languagelevel where {pop languagelevel 1 ne {false setstrokeadjust false setoverprint} if} if /bdef {bind def} bind def /c {setgray} bdef /l {neg lineto} bdef /rl {neg rlineto} bdef /lc {setlinecap} bdef /lj {setlinejoin} bdef /lw {setlinewidth} bdef /ml {setmiterlimit} bdef /ld {setdash} bdef /m {neg moveto} bdef /ct {6 2 roll neg 6 2 roll neg 6 2 roll neg curveto} bdef /r {rotate} bdef /t {neg translate} bdef /s {scale} bdef /sw {show} bdef /gs {gsave} bdef /gr {grestore} bdef /f {findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding ISOLatin1Encoding def currentdict end /NFont exch definefont pop /NFont findfont} bdef /p {closepath} bdef /sf {scalefont setfont} bdef /ef {eofill}bdef /pc {closepath stroke}bdef /ps {stroke}bdef /pum {matrix currentmatrix}bdef /pom {setmatrix}bdef /bs {/aString exch def /nXOfs exch def /nWidth exch def currentpoint nXOfs 0 rmoveto pum nWidth aString stringwidth pop div 1 scale aString show pom moveto} bdef %%EndResource %%EndProlog %%BeginSetup %%EndSetup %%Page: 1 1 %%BeginPageSetup %%EndPageSetup pum 0.02836 0.02836 s 0 -8286 t /tm matrix currentmatrix def tm setmatrix -3900 -8857 t 1 1 s 0.000 c 10000 12000 m 9581 12419 l 9413 12084 l 10000 12000 l p ef 6989 13478 m 9586 12179 l 9609 12224 l 7011 13522 l 6989 13478 l p ef 0.996 c 8500 13800 m 7500 13800 l 7500 11800 l 9500 11800 l 9500 13800 l 8500 13800 l p ef 50 lw 1 lj 0.000 c 8500 13800 m 7500 13800 l 7500 11800 l 9500 11800 l 9500 13800 l 8500 13800 l pc gs gs pum 8080 12960 t 103 -334 m 103 -334 103 -334 8 -334 ct 8 -334 8 -334 8 -323 ct 31 -318 34 -314 34 -294 ct 34 -294 34 -294 34 -42 ct 34 -21 30 -16 8 -12 ct 8 -12 8 -12 8 0 ct 8 0 8 0 127 0 ct 127 0 127 0 127 -12 ct 109 -14 103 -22 103 -40 ct 103 -40 103 -40 103 -172 ct 103 -174 106 -179 111 -184 ct 122 -195 134 -201 145 -201 ct 163 -201 171 -188 171 -160 ct 171 -160 171 -160 171 -40 ct 171 -22 165 -14 148 -12 ct 148 -12 148 -12 148 0 ct 148 0 148 0 264 0 ct 264 0 264 0 264 -12 ct 246 -13 240 -21 240 -42 ct 240 -42 240 -42 240 -164 ct 240 -207 213 -234 173 -234 ct 147 -234 128 -224 103 -195 ct 103 -195 103 -195 103 -334 ct p ef pom gr gs pum 8351 12960 t 143 -334 m 107 -310 92 -297 75 -274 ct 40 -231 23 -182 23 -124 ct 23 -62 41 -13 84 37 ct 104 61 116 72 141 87 ct 141 87 141 87 147 79 ct 108 48 95 31 82 -6 ct 70 -39 65 -76 65 -126 ct 65 -178 71 -218 84 -249 ct 98 -279 112 -297 147 -326 ct 147 -326 147 -326 143 -334 ct p ef pom gr gs pum 8516 12960 t 227 -58 m 227 -58 227 -58 217 -45 ct 203 -27 194 -19 187 -19 ct 183 -19 179 -23 179 -27 ct 179 -31 179 -31 186 -58 ct 186 -58 186 -58 214 -160 ct 216 -170 218 -181 218 -188 ct 218 -206 205 -218 186 -218 ct 154 -218 123 -189 72 -110 ct 72 -110 72 -110 105 -217 ct 105 -217 105 -217 104 -218 ct 77 -213 67 -211 24 -203 ct 24 -203 24 -203 24 -195 ct 49 -195 55 -192 55 -182 ct 55 -179 55 -176 54 -173 ct 54 -173 54 -173 7 0 ct 7 0 7 0 44 0 ct 67 -78 72 -89 93 -123 ct 123 -168 148 -193 166 -193 ct 174 -193 178 -188 178 -179 ct 178 -173 175 -156 171 -141 ct 171 -141 171 -141 150 -60 ct 143 -35 142 -28 142 -23 ct 142 -4 149 4 165 4 ct 187 4 200 -6 234 -52 ct 234 -52 234 -52 227 -58 ct p ef pom gr gs pum 8766 12960 t 18 87 m 54 64 69 51 87 28 ct 121 -15 138 -64 138 -122 ct 138 -185 120 -233 77 -283 ct 58 -307 45 -318 20 -334 ct 20 -334 20 -334 14 -326 ct 53 -295 66 -277 79 -240 ct 91 -207 96 -170 96 -120 ct 96 -69 90 -28 77 2 ct 63 33 49 51 14 79 ct 14 79 14 79 18 87 ct p ef pom gr gr 14100 16000 m 13824 16000 13600 15776 13600 15500 ct 13600 15224 13824 15000 14100 15000 ct 14376 15000 14600 15224 14600 15500 ct 14600 15776 14376 16000 14100 16000 ct pc gs gs pum 13954 15668 t 121 -141 m 15 -141 l 15 -108 l 121 -108 l 121 0 l 153 0 l 153 -108 l 259 -108 l 259 -141 l 153 -141 l 153 -250 l 121 -250 l 121 -141 l p ef pom gr gr 8500 16000 m 8224 16000 8000 15776 8000 15500 ct 8000 15224 8224 15000 8500 15000 ct 8776 15000 9000 15224 9000 15500 ct 9000 15776 8776 16000 8500 16000 ct pc 8500 15000 m 8313 14438 l 8688 14438 l 8500 15000 l p ef 8525 13800 m 8525 14550 l 8475 14550 l 8475 13800 l 8525 13800 l p ef 9000 15500 m 9563 15313 l 9563 15688 l 9000 15500 l p ef 13600 15525 m 9450 15525 l 9450 15475 l 13600 15475 l 13600 15525 l p ef 14100 13800 m 13100 13800 l 13100 11800 l 15100 11800 l 15100 13800 l 14100 13800 l pc gs gs pum 13663 12960 t 103 -334 m 103 -334 103 -334 8 -334 ct 8 -334 8 -334 8 -323 ct 31 -318 34 -314 34 -294 ct 34 -294 34 -294 34 -42 ct 34 -21 30 -16 8 -12 ct 8 -12 8 -12 8 0 ct 8 0 8 0 127 0 ct 127 0 127 0 127 -12 ct 109 -14 103 -22 103 -40 ct 103 -40 103 -40 103 -172 ct 103 -174 106 -179 111 -184 ct 122 -195 134 -201 145 -201 ct 163 -201 171 -188 171 -160 ct 171 -160 171 -160 171 -40 ct 171 -22 165 -14 148 -12 ct 148 -12 148 -12 148 0 ct 148 0 148 0 264 0 ct 264 0 264 0 264 -12 ct 246 -13 240 -21 240 -42 ct 240 -42 240 -42 240 -164 ct 240 -207 213 -234 173 -234 ct 147 -234 128 -224 103 -195 ct 103 -195 103 -195 103 -334 ct p ef pom gr gs pum 13934 12960 t 143 -334 m 107 -310 92 -297 75 -274 ct 40 -231 23 -182 23 -124 ct 23 -62 41 -13 84 37 ct 104 61 116 72 141 87 ct 141 87 141 87 147 79 ct 108 48 95 31 82 -6 ct 70 -39 65 -76 65 -126 ct 65 -178 71 -218 84 -249 ct 98 -279 112 -297 147 -326 ct 147 -326 147 -326 143 -334 ct p ef pom gr gs pum 14099 12960 t 227 -58 m 227 -58 227 -58 217 -45 ct 203 -27 194 -19 187 -19 ct 183 -19 179 -23 179 -27 ct 179 -31 179 -31 186 -58 ct 186 -58 186 -58 214 -160 ct 216 -170 218 -181 218 -188 ct 218 -206 205 -218 186 -218 ct 154 -218 123 -189 72 -110 ct 72 -110 72 -110 105 -217 ct 105 -217 105 -217 104 -218 ct 77 -213 67 -211 24 -203 ct 24 -203 24 -203 24 -195 ct 49 -195 55 -192 55 -182 ct 55 -179 55 -176 54 -173 ct 54 -173 54 -173 7 0 ct 7 0 7 0 44 0 ct 67 -78 72 -89 93 -123 ct 123 -168 148 -193 166 -193 ct 174 -193 178 -188 178 -179 ct 178 -173 175 -156 171 -141 ct 171 -141 171 -141 150 -60 ct 143 -35 142 -28 142 -23 ct 142 -4 149 4 165 4 ct 187 4 200 -6 234 -52 ct 234 -52 234 -52 227 -58 ct p ef pom gr gs pum 14349 12960 t 18 87 m 54 64 69 51 87 28 ct 121 -15 138 -64 138 -122 ct 138 -185 120 -233 77 -283 ct 58 -307 45 -318 20 -334 ct 20 -334 20 -334 14 -326 ct 53 -295 66 -277 79 -240 ct 91 -207 96 -170 96 -120 ct 96 -69 90 -28 77 2 ct 63 33 49 51 14 79 ct 14 79 14 79 18 87 ct p ef pom gr gr 14100 15000 m 13913 14438 l 14288 14438 l 14100 15000 l p ef 14125 13800 m 14125 14550 l 14075 14550 l 14075 13800 l 14125 13800 l p ef 5900 15500 m 6463 15313 l 6463 15688 l 5900 15500 l p ef 8000 15525 m 6350 15525 l 6350 15475 l 8000 15475 l 8000 15525 l p ef 8500 11800 m 8313 11238 l 8688 11238 l 8500 11800 l p ef 5600 10575 m 8500 10575 l 8500 10600 l 8500 10625 l 5600 10625 l 5600 10600 l 5600 10575 l p ef 8500 10600 m 8500 10575 l 8504 10575 l 8509 10577 l 8512 10578 l 8516 10581 l 8519 10584 l 8522 10587 l 8523 10591 l 8525 10596 l 8525 10600 l 8525 10600 l 8500 10600 l p ef 8525 10600 m 8525 11350 l 8500 11350 l 8475 11350 l 8475 10600 l 8500 10600 l 8525 10600 l p ef 14600 15500 m 15163 15313 l 15163 15688 l 14600 15500 l p ef 15900 15525 m 15050 15525 l 15050 15475 l 15900 15475 l 15900 15525 l p ef 14100 11800 m 13913 11238 l 14288 11238 l 14100 11800 l p ef 5600 10575 m 14100 10575 l 14100 10600 l 14100 10625 l 5600 10625 l 5600 10600 l 5600 10575 l p ef 14100 10600 m 14100 10575 l 14104 10575 l 14109 10577 l 14112 10578 l 14116 10581 l 14119 10584 l 14122 10587 l 14123 10591 l 14125 10596 l 14125 10600 l 14125 10600 l 14100 10600 l p ef 14125 10600 m 14125 11350 l 14100 11350 l 14075 11350 l 14075 10600 l 14100 10600 l 14125 10600 l p ef 7000 15500 m 7000 13500 l ps gs gs pum 16150 15536 t 10 -200 m 16 -200 20 -200 25 -200 ct 44 -200 49 -192 56 -146 ct 61 -112 67 -37 67 -8 ct 67 6 68 9 72 9 ct 84 9 130 -43 180 -114 ct 198 -138 210 -170 210 -189 ct 210 -205 198 -218 183 -218 ct 172 -218 165 -212 165 -201 ct 165 -193 167 -188 176 -180 ct 183 -174 185 -170 185 -165 ct 185 -142 153 -87 118 -50 ct 118 -50 118 -50 102 -35 ct 99 -104 96 -130 89 -167 ct 80 -217 80 -218 75 -218 ct 73 -218 69 -217 65 -216 ct 56 -214 29 -209 10 -206 ct 10 -206 10 -206 10 -200 ct p ef pom gr gs pum 16370 15536 t 143 -334 m 107 -310 92 -297 75 -274 ct 40 -231 23 -182 23 -124 ct 23 -62 41 -13 84 37 ct 104 61 116 72 141 87 ct 141 87 141 87 147 79 ct 108 48 95 31 82 -6 ct 70 -39 65 -76 65 -126 ct 65 -178 71 -218 84 -249 ct 98 -279 112 -297 147 -326 ct 147 -326 147 -326 143 -334 ct p ef pom gr gs pum 16535 15536 t 227 -58 m 227 -58 227 -58 217 -45 ct 203 -27 194 -19 187 -19 ct 183 -19 179 -23 179 -27 ct 179 -31 179 -31 186 -58 ct 186 -58 186 -58 214 -160 ct 216 -170 218 -181 218 -188 ct 218 -206 205 -218 186 -218 ct 154 -218 123 -189 72 -110 ct 72 -110 72 -110 105 -217 ct 105 -217 105 -217 104 -218 ct 77 -213 67 -211 24 -203 ct 24 -203 24 -203 24 -195 ct 49 -195 55 -192 55 -182 ct 55 -179 55 -176 54 -173 ct 54 -173 54 -173 7 0 ct 7 0 7 0 44 0 ct 67 -78 72 -89 93 -123 ct 123 -168 148 -193 166 -193 ct 174 -193 178 -188 178 -179 ct 178 -173 175 -156 171 -141 ct 171 -141 171 -141 150 -60 ct 143 -35 142 -28 142 -23 ct 142 -4 149 4 165 4 ct 187 4 200 -6 234 -52 ct 234 -52 234 -52 227 -58 ct p ef pom gr gs pum 16785 15536 t 18 87 m 54 64 69 51 87 28 ct 121 -15 138 -64 138 -122 ct 138 -185 120 -233 77 -283 ct 58 -307 45 -318 20 -334 ct 20 -334 20 -334 14 -326 ct 53 -295 66 -277 79 -240 ct 91 -207 96 -170 96 -120 ct 96 -69 90 -28 77 2 ct 63 33 49 51 14 79 ct 14 79 14 79 18 87 ct p ef pom gr gr gs gs pum 9747 15298 t 229 -55 m 202 -24 197 -20 188 -20 ct 183 -20 179 -24 179 -30 ct 179 -37 195 -97 211 -152 ct 225 -197 235 -237 260 -336 ct 260 -336 260 -336 258 -338 ct 232 -333 214 -330 182 -327 ct 182 -327 182 -327 182 -318 ct 209 -318 213 -316 213 -306 ct 213 -299 212 -296 206 -271 ct 206 -271 206 -271 184 -190 ct 180 -210 171 -218 152 -218 ct 87 -218 7 -125 7 -51 ct 7 -16 27 5 59 5 ct 93 5 115 -11 148 -60 ct 143 -35 142 -27 142 -16 ct 142 -3 150 6 163 6 ct 183 6 209 -14 235 -50 ct 235 -50 235 -50 229 -55 ct p 154 -207 m 168 -207 176 -198 176 -180 ct 176 -104 124 -19 79 -19 ct 62 -19 50 -32 50 -51 ct 50 -92 75 -149 108 -183 ct 122 -198 140 -207 154 -207 ct p ef pom gr gs pum 9997 15298 t 143 -334 m 107 -310 92 -297 75 -274 ct 40 -231 23 -182 23 -124 ct 23 -62 41 -13 84 37 ct 104 61 116 72 141 87 ct 141 87 141 87 147 79 ct 108 48 95 31 82 -6 ct 70 -39 65 -76 65 -126 ct 65 -178 71 -218 84 -249 ct 98 -279 112 -297 147 -326 ct 147 -326 147 -326 143 -334 ct p ef pom gr gs pum 10162 15298 t 227 -58 m 227 -58 227 -58 217 -45 ct 203 -27 194 -19 187 -19 ct 183 -19 179 -23 179 -27 ct 179 -31 179 -31 186 -58 ct 186 -58 186 -58 214 -160 ct 216 -170 218 -181 218 -188 ct 218 -206 205 -218 186 -218 ct 154 -218 123 -189 72 -110 ct 72 -110 72 -110 105 -217 ct 105 -217 105 -217 104 -218 ct 77 -213 67 -211 24 -203 ct 24 -203 24 -203 24 -195 ct 49 -195 55 -192 55 -182 ct 55 -179 55 -176 54 -173 ct 54 -173 54 -173 7 0 ct 7 0 7 0 44 0 ct 67 -78 72 -89 93 -123 ct 123 -168 148 -193 166 -193 ct 174 -193 178 -188 178 -179 ct 178 -173 175 -156 171 -141 ct 171 -141 171 -141 150 -60 ct 143 -35 142 -28 142 -23 ct 142 -4 149 4 165 4 ct 187 4 200 -6 234 -52 ct 234 -52 234 -52 227 -58 ct p ef pom gr gs pum 10412 15298 t 18 87 m 54 64 69 51 87 28 ct 121 -15 138 -64 138 -122 ct 138 -185 120 -233 77 -283 ct 58 -307 45 -318 20 -334 ct 20 -334 20 -334 14 -326 ct 53 -295 66 -277 79 -240 ct 91 -207 96 -170 96 -120 ct 96 -69 90 -28 77 2 ct 63 33 49 51 14 79 ct 14 79 14 79 18 87 ct p ef pom gr gr gs gs pum 4561 10747 t 199 -55 m 195 -51 192 -48 188 -42 ct 176 -27 170 -22 165 -22 ct 158 -22 153 -29 150 -42 ct 149 -46 148 -49 148 -51 ct 135 -101 130 -123 130 -131 ct 152 -169 169 -190 178 -190 ct 181 -190 185 -189 190 -186 ct 196 -183 200 -182 204 -182 ct 214 -182 221 -189 221 -200 ct 221 -210 212 -218 201 -218 ct 179 -218 160 -200 126 -147 ct 126 -147 126 -147 121 -175 ct 114 -208 108 -218 95 -218 ct 84 -218 67 -214 37 -204 ct 37 -204 37 -204 32 -202 ct 32 -202 32 -202 34 -194 ct 52 -199 57 -200 61 -200 ct 74 -200 77 -195 83 -166 ct 83 -166 83 -166 98 -105 ct 98 -105 98 -105 57 -47 ct 47 -33 38 -24 32 -24 ct 29 -24 24 -25 19 -28 ct 13 -32 7 -33 3 -33 ct -6 -33 -13 -26 -13 -16 ct -13 -3 -3 5 11 5 ct 27 5 33 1 57 -30 ct 71 -45 81 -59 102 -87 ct 102 -87 102 -87 117 -28 ct 123 -3 129 5 145 5 ct 164 5 177 -7 206 -51 ct 206 -51 206 -51 199 -55 ct p ef pom gr gs pum 4781 10747 t 143 -334 m 107 -310 92 -297 75 -274 ct 40 -231 23 -182 23 -124 ct 23 -62 41 -13 84 37 ct 104 61 116 72 141 87 ct 141 87 141 87 147 79 ct 108 48 95 31 82 -6 ct 70 -39 65 -76 65 -126 ct 65 -178 71 -218 84 -249 ct 98 -279 112 -297 147 -326 ct 147 -326 147 -326 143 -334 ct p ef pom gr gs pum 4946 10747 t 227 -58 m 227 -58 227 -58 217 -45 ct 203 -27 194 -19 187 -19 ct 183 -19 179 -23 179 -27 ct 179 -31 179 -31 186 -58 ct 186 -58 186 -58 214 -160 ct 216 -170 218 -181 218 -188 ct 218 -206 205 -218 186 -218 ct 154 -218 123 -189 72 -110 ct 72 -110 72 -110 105 -217 ct 105 -217 105 -217 104 -218 ct 77 -213 67 -211 24 -203 ct 24 -203 24 -203 24 -195 ct 49 -195 55 -192 55 -182 ct 55 -179 55 -176 54 -173 ct 54 -173 54 -173 7 0 ct 7 0 7 0 44 0 ct 67 -78 72 -89 93 -123 ct 123 -168 148 -193 166 -193 ct 174 -193 178 -188 178 -179 ct 178 -173 175 -156 171 -141 ct 171 -141 171 -141 150 -60 ct 143 -35 142 -28 142 -23 ct 142 -4 149 4 165 4 ct 187 4 200 -6 234 -52 ct 234 -52 234 -52 227 -58 ct p ef pom gr gs pum 5196 10747 t 18 87 m 54 64 69 51 87 28 ct 121 -15 138 -64 138 -122 ct 138 -185 120 -233 77 -283 ct 58 -307 45 -318 20 -334 ct 20 -334 20 -334 14 -326 ct 53 -295 66 -277 79 -240 ct 91 -207 96 -170 96 -120 ct 96 -69 90 -28 77 2 ct 63 33 49 51 14 79 ct 14 79 14 79 18 87 ct p ef pom gr gr gs gs pum 4932 15694 t 177 -54 m 141 -25 126 -17 105 -17 ct 77 -17 58 -35 58 -62 ct 58 -69 59 -77 63 -92 ct 63 -92 63 -92 77 -94 ct 151 -105 204 -142 204 -185 ct 204 -206 189 -218 164 -218 ct 93 -218 15 -137 15 -63 ct 15 -23 42 5 81 5 ct 116 5 154 -15 183 -48 ct 183 -48 183 -48 177 -54 ct p 75 -125 m 92 -169 128 -207 154 -207 ct 164 -207 171 -199 171 -188 ct 171 -172 162 -155 146 -140 ct 128 -123 109 -114 67 -103 ct 67 -103 67 -103 75 -125 ct p ef pom gr gs pum 5152 15694 t 143 -334 m 107 -310 92 -297 75 -274 ct 40 -231 23 -182 23 -124 ct 23 -62 41 -13 84 37 ct 104 61 116 72 141 87 ct 141 87 141 87 147 79 ct 108 48 95 31 82 -6 ct 70 -39 65 -76 65 -126 ct 65 -178 71 -218 84 -249 ct 98 -279 112 -297 147 -326 ct 147 -326 147 -326 143 -334 ct p ef pom gr gs pum 5317 15694 t 227 -58 m 227 -58 227 -58 217 -45 ct 203 -27 194 -19 187 -19 ct 183 -19 179 -23 179 -27 ct 179 -31 179 -31 186 -58 ct 186 -58 186 -58 214 -160 ct 216 -170 218 -181 218 -188 ct 218 -206 205 -218 186 -218 ct 154 -218 123 -189 72 -110 ct 72 -110 72 -110 105 -217 ct 105 -217 105 -217 104 -218 ct 77 -213 67 -211 24 -203 ct 24 -203 24 -203 24 -195 ct 49 -195 55 -192 55 -182 ct 55 -179 55 -176 54 -173 ct 54 -173 54 -173 7 0 ct 7 0 7 0 44 0 ct 67 -78 72 -89 93 -123 ct 123 -168 148 -193 166 -193 ct 174 -193 178 -188 178 -179 ct 178 -173 175 -156 171 -141 ct 171 -141 171 -141 150 -60 ct 143 -35 142 -28 142 -23 ct 142 -4 149 4 165 4 ct 187 4 200 -6 234 -52 ct 234 -52 234 -52 227 -58 ct p ef pom gr gs pum 5567 15694 t 18 87 m 54 64 69 51 87 28 ct 121 -15 138 -64 138 -122 ct 138 -185 120 -233 77 -283 ct 58 -307 45 -318 20 -334 ct 20 -334 20 -334 14 -326 ct 53 -295 66 -277 79 -240 ct 91 -207 96 -170 96 -120 ct 96 -69 90 -28 77 2 ct 63 33 49 51 14 79 ct 14 79 14 79 18 87 ct p ef pom gr gr gs gs pum 8954 15959 t 121 -141 m 15 -141 l 15 -108 l 121 -108 l 121 0 l 153 0 l 153 -108 l 259 -108 l 259 -141 l 153 -141 l 153 -250 l 121 -250 l 121 -141 l p ef pom gr gr gs gs pum 8848 15033 t 19 -127 m 19 -96 l 138 -96 l 138 -127 l 19 -127 l p ef pom gr gr gs gs pum 8080 12705 t 45 -147 m 114 -290 l 183 -147 l 216 -147 l 128 -327 l 99 -327 l 12 -147 l 45 -147 l p ef pom gr gr 0.996 c 12400 9601 m 12394 11602 l 11895 11099 l 11897 10099 l 12400 9601 l p ef 0.000 c 12400 9601 m 12394 11602 l 11895 11099 l 11897 10099 l 12400 9601 l pc 0.996 c 11397 10599 m 11398 10099 l 11898 10100 l 11895 11100 l 11395 11099 l 11397 10599 l p ef 0.000 c 11397 10599 m 11398 10099 l 11898 10100 l 11895 11100 l 11395 11099 l 11397 10599 l pc 0.996 c 11900 16000 m 11624 16000 11400 15776 11400 15500 ct 11400 15224 11624 15000 11900 15000 ct 12176 15000 12400 15224 12400 15500 ct 12400 15776 12176 16000 11900 16000 ct p ef 0.000 c 11900 16000 m 11624 16000 11400 15776 11400 15500 ct 11400 15224 11624 15000 11900 15000 ct 12176 15000 12400 15224 12400 15500 ct 12400 15776 12176 16000 11900 16000 ct pc 12400 15000 m 12400 16000 l ps gs gs pum 14880 16144 t 8 -196 m 11 -198 15 -198 21 -198 ct 34 -198 39 -191 39 -166 ct 39 -166 39 -166 39 -44 ct 39 -15 33 -8 9 -8 ct 9 -8 9 -8 9 0 ct 9 0 9 0 111 0 ct 111 0 111 0 111 -8 ct 87 -8 79 -14 79 -32 ct 79 -32 79 -32 79 -171 ct 103 -194 113 -200 129 -200 ct 153 -200 165 -184 165 -152 ct 165 -152 165 -152 165 -48 ct 165 -17 158 -8 134 -8 ct 134 -8 134 -8 134 0 ct 134 0 134 0 235 0 ct 235 0 235 0 235 -7 ct 211 -10 205 -16 205 -40 ct 205 -40 205 -40 205 -153 ct 205 -199 184 -227 148 -227 ct 126 -227 111 -219 78 -187 ct 78 -187 78 -187 78 -226 ct 78 -226 78 -226 75 -227 ct 51 -218 34 -213 8 -205 ct 8 -205 8 -205 8 -196 ct p ef 448 -81 m 424 -43 403 -29 372 -29 ct 345 -29 324 -43 310 -72 ct 301 -90 298 -107 297 -137 ct 297 -137 297 -137 446 -137 ct 442 -169 437 -183 425 -199 ct 411 -217 388 -227 363 -227 ct 339 -227 316 -218 298 -201 ct 275 -181 262 -146 262 -106 ct 262 -37 297 5 353 5 ct 399 5 435 -24 455 -78 ct 455 -78 455 -78 448 -81 ct p 298 -153 m 303 -191 320 -209 349 -209 ct 379 -209 390 -196 397 -153 ct 397 -153 397 -153 298 -153 ct p ef 684 -32 m 676 -26 670 -23 663 -23 ct 652 -23 648 -30 648 -52 ct 648 -52 648 -52 648 -148 ct 648 -173 646 -188 638 -200 ct 628 -218 607 -227 578 -227 ct 533 -227 497 -203 497 -171 ct 497 -160 507 -150 518 -150 ct 530 -150 540 -160 540 -171 ct 540 -173 539 -175 539 -179 ct 538 -183 537 -187 537 -191 ct 537 -204 553 -215 572 -215 ct 596 -215 609 -201 609 -174 ct 609 -174 609 -174 609 -144 ct 534 -113 526 -109 505 -90 ct 495 -81 488 -64 488 -48 ct 488 -17 509 5 539 5 ct 560 5 580 -5 609 -31 ct 612 -5 621 5 640 5 ct 657 5 667 -1 684 -20 ct 684 -20 684 -20 684 -32 ct p 609 -61 m 609 -45 607 -41 596 -35 ct 585 -28 571 -24 561 -24 ct 544 -24 531 -40 531 -62 ct 531 -62 531 -62 531 -63 ct 531 -92 550 -110 609 -132 ct 609 -132 609 -132 609 -61 ct p ef 693 -192 m 700 -194 705 -194 710 -194 ct 722 -194 727 -186 727 -164 ct 727 -164 727 -164 727 -41 ct 727 -17 723 -13 692 -7 ct 692 -7 692 -7 692 0 ct 692 0 692 0 809 0 ct 809 0 809 0 809 -8 ct 776 -8 767 -15 767 -44 ct 767 -44 767 -44 767 -155 ct 767 -171 788 -196 801 -196 ct 804 -196 809 -193 814 -188 ct 822 -182 827 -179 833 -179 ct 845 -179 852 -187 852 -201 ct 852 -217 842 -227 826 -227 ct 805 -227 791 -216 767 -181 ct 767 -181 767 -181 767 -226 ct 767 -226 767 -226 765 -227 ct 739 -216 722 -210 693 -200 ct 693 -200 693 -200 693 -192 ct p ef 1176 -81 m 1152 -43 1131 -29 1100 -29 ct 1073 -29 1052 -43 1038 -72 ct 1029 -90 1026 -107 1025 -137 ct 1025 -137 1025 -137 1174 -137 ct 1170 -169 1165 -183 1153 -199 ct 1139 -217 1116 -227 1091 -227 ct 1067 -227 1044 -218 1026 -201 ct 1003 -181 990 -146 990 -106 ct 990 -37 1025 5 1081 5 ct 1127 5 1163 -24 1183 -78 ct 1183 -78 1183 -78 1176 -81 ct p 1026 -153 m 1031 -191 1048 -209 1077 -209 ct 1107 -209 1118 -196 1125 -153 ct 1125 -153 1125 -153 1026 -153 ct p ef 1206 -196 m 1209 -198 1213 -198 1219 -198 ct 1232 -198 1237 -191 1237 -166 ct 1237 -166 1237 -166 1237 -44 ct 1237 -15 1231 -8 1207 -8 ct 1207 -8 1207 -8 1207 0 ct 1207 0 1207 0 1309 0 ct 1309 0 1309 0 1309 -8 ct 1285 -8 1277 -14 1277 -32 ct 1277 -32 1277 -32 1277 -171 ct 1301 -194 1311 -200 1327 -200 ct 1351 -200 1363 -184 1363 -152 ct 1363 -152 1363 -152 1363 -48 ct 1363 -17 1356 -8 1332 -8 ct 1332 -8 1332 -8 1332 0 ct 1332 0 1332 0 1433 0 ct 1433 0 1433 0 1433 -7 ct 1409 -10 1403 -16 1403 -40 ct 1403 -40 1403 -40 1403 -153 ct 1403 -199 1382 -227 1346 -227 ct 1324 -227 1309 -219 1276 -187 ct 1276 -187 1276 -187 1276 -226 ct 1276 -226 1276 -226 1273 -227 ct 1249 -218 1232 -213 1206 -205 ct 1206 -205 1206 -205 1206 -196 ct p ef 1615 5 m 1615 5 1615 5 1686 -21 ct 1686 -21 1686 -21 1686 -28 ct 1677 -28 1676 -28 1675 -28 ct 1657 -28 1653 -33 1653 -56 ct 1653 -56 1653 -56 1653 -336 ct 1653 -336 1653 -336 1651 -337 ct 1628 -329 1611 -324 1580 -315 ct 1580 -315 1580 -315 1580 -308 ct 1584 -308 1586 -308 1590 -308 ct 1608 -308 1613 -303 1613 -283 ct 1613 -283 1613 -283 1613 -206 ct 1594 -222 1581 -227 1562 -227 ct 1506 -227 1461 -171 1461 -101 ct 1461 -38 1497 5 1551 5 ct 1578 5 1596 -5 1613 -28 ct 1613 -28 1613 -28 1613 4 ct 1613 4 1613 4 1615 5 ct p 1613 -50 m 1613 -47 1609 -41 1604 -35 ct 1596 -26 1584 -21 1570 -21 ct 1529 -21 1503 -60 1503 -121 ct 1503 -177 1526 -213 1563 -213 ct 1589 -213 1613 -190 1613 -164 ct 1613 -164 1613 -164 1613 -50 ct p ef 1973 -155 m 1973 -155 1973 -155 1971 -222 ct 1971 -222 1971 -222 1965 -222 ct 1965 -222 1965 -222 1964 -221 ct 1960 -218 1959 -217 1957 -217 ct 1955 -217 1950 -218 1944 -221 ct 1934 -225 1923 -227 1911 -227 ct 1872 -227 1845 -202 1845 -166 ct 1845 -138 1860 -118 1901 -95 ct 1901 -95 1901 -95 1929 -78 ct 1946 -69 1955 -57 1955 -41 ct 1955 -20 1939 -6 1914 -6 ct 1898 -6 1883 -12 1874 -23 ct 1864 -35 1859 -47 1853 -75 ct 1853 -75 1853 -75 1845 -75 ct 1845 -75 1845 -75 1845 2 ct 1845 2 1845 2 1851 2 ct 1855 -3 1857 -4 1863 -4 ct 1867 -4 1874 -3 1885 0 ct 1898 3 1912 5 1920 5 ct 1957 5 1988 -24 1988 -58 ct 1988 -83 1977 -99 1948 -117 ct 1948 -117 1948 -117 1896 -148 ct 1882 -156 1875 -169 1875 -182 ct 1875 -202 1890 -216 1912 -216 ct 1940 -216 1954 -199 1965 -155 ct 1965 -155 1965 -155 1973 -155 ct p ef 2019 -195 m 2024 -195 2027 -195 2031 -195 ct 2048 -195 2051 -190 2051 -167 ct 2051 -167 2051 -167 2051 65 ct 2051 90 2046 96 2017 99 ct 2017 99 2017 99 2017 107 ct 2017 107 2017 107 2135 107 ct 2135 107 2135 107 2135 98 ct 2098 98 2092 93 2092 61 ct 2092 61 2092 61 2092 -16 ct 2109 0 2121 5 2141 5 ct 2198 5 2243 -50 2243 -122 ct 2243 -183 2209 -227 2162 -227 ct 2135 -227 2113 -215 2092 -189 ct 2092 -189 2092 -189 2092 -226 ct 2092 -226 2092 -226 2089 -227 ct 2063 -217 2046 -210 2019 -202 ct 2019 -202 2019 -202 2019 -195 ct p 2092 -165 m 2092 -180 2119 -197 2141 -197 ct 2177 -197 2201 -160 2201 -103 ct 2201 -48 2177 -11 2142 -11 ct 2120 -11 2092 -29 2092 -44 ct 2092 -44 2092 -44 2092 -165 ct p ef 2463 -81 m 2439 -43 2418 -29 2387 -29 ct 2360 -29 2339 -43 2325 -72 ct 2316 -90 2313 -107 2312 -137 ct 2312 -137 2312 -137 2461 -137 ct 2457 -169 2452 -183 2440 -199 ct 2426 -217 2403 -227 2378 -227 ct 2354 -227 2331 -218 2313 -201 ct 2290 -181 2277 -146 2277 -106 ct 2277 -37 2312 5 2368 5 ct 2414 5 2450 -24 2470 -78 ct 2470 -78 2470 -78 2463 -81 ct p 2313 -153 m 2318 -191 2335 -209 2364 -209 ct 2394 -209 2405 -196 2412 -153 ct 2412 -153 2412 -153 2313 -153 ct p ef 2683 -81 m 2659 -43 2638 -29 2607 -29 ct 2580 -29 2559 -43 2545 -72 ct 2536 -90 2533 -107 2532 -137 ct 2532 -137 2532 -137 2681 -137 ct 2677 -169 2672 -183 2660 -199 ct 2646 -217 2623 -227 2598 -227 ct 2574 -227 2551 -218 2533 -201 ct 2510 -181 2497 -146 2497 -106 ct 2497 -37 2532 5 2588 5 ct 2634 5 2670 -24 2690 -78 ct 2690 -78 2690 -78 2683 -81 ct p 2533 -153 m 2538 -191 2555 -209 2584 -209 ct 2614 -209 2625 -196 2632 -153 ct 2632 -153 2632 -153 2533 -153 ct p ef 2898 -77 m 2874 -42 2857 -31 2829 -31 ct 2785 -31 2754 -70 2754 -127 ct 2754 -178 2781 -213 2820 -213 ct 2838 -213 2844 -207 2849 -189 ct 2849 -189 2849 -189 2852 -178 ct 2856 -164 2864 -155 2874 -155 ct 2887 -155 2898 -164 2898 -176 ct 2898 -204 2864 -227 2823 -227 ct 2799 -227 2775 -217 2755 -199 ct 2731 -178 2717 -144 2717 -105 ct 2717 -41 2755 5 2809 5 ct 2831 5 2850 -3 2868 -18 ct 2881 -30 2890 -43 2904 -72 ct 2904 -72 2904 -72 2898 -77 ct p ef 3001 -169 m 3021 -192 3036 -200 3055 -200 ct 3079 -200 3091 -182 3091 -148 ct 3091 -148 3091 -148 3091 -50 ct 3091 -16 3086 -10 3058 -7 ct 3058 -7 3058 -7 3058 0 ct 3058 0 3058 0 3161 0 ct 3161 0 3161 0 3161 -7 ct 3135 -12 3132 -16 3132 -50 ct 3132 -50 3132 -50 3132 -148 ct 3132 -200 3111 -227 3072 -227 ct 3044 -227 3023 -215 3001 -185 ct 3001 -185 3001 -185 3001 -336 ct 3001 -336 3001 -336 2999 -337 ct 2982 -331 2970 -327 2943 -319 ct 2943 -319 2943 -319 2930 -315 ct 2930 -315 2930 -315 2930 -308 ct 2932 -308 2933 -308 2936 -308 ct 2956 -308 2960 -304 2960 -283 ct 2960 -283 2960 -283 2960 -50 ct 2960 -15 2957 -11 2929 -7 ct 2929 -7 2929 -7 2929 0 ct 2929 0 2929 0 3034 0 ct 3034 0 3034 0 3034 -7 ct 3006 -10 3001 -16 3001 -50 ct 3001 -50 3001 -50 3001 -169 ct p ef pom gr gs pum 15519 16745 t 214 -32 m 206 -26 200 -23 193 -23 ct 182 -23 178 -30 178 -52 ct 178 -52 178 -52 178 -148 ct 178 -173 176 -188 168 -200 ct 158 -218 137 -227 108 -227 ct 63 -227 27 -203 27 -171 ct 27 -160 37 -150 48 -150 ct 60 -150 70 -160 70 -171 ct 70 -173 69 -175 69 -179 ct 68 -183 67 -187 67 -191 ct 67 -204 83 -215 102 -215 ct 126 -215 139 -201 139 -174 ct 139 -174 139 -174 139 -144 ct 64 -113 56 -109 35 -90 ct 25 -81 18 -64 18 -48 ct 18 -17 39 5 69 5 ct 90 5 110 -5 139 -31 ct 142 -5 151 5 170 5 ct 187 5 197 -1 214 -20 ct 214 -20 214 -20 214 -32 ct p 139 -61 m 139 -45 137 -41 126 -35 ct 115 -28 101 -24 91 -24 ct 74 -24 61 -40 61 -62 ct 61 -62 61 -62 61 -63 ct 61 -92 80 -110 139 -132 ct 139 -132 139 -132 139 -61 ct p ef 228 -196 m 231 -198 235 -198 241 -198 ct 254 -198 259 -191 259 -166 ct 259 -166 259 -166 259 -44 ct 259 -15 253 -8 229 -8 ct 229 -8 229 -8 229 0 ct 229 0 229 0 331 0 ct 331 0 331 0 331 -8 ct 307 -8 299 -14 299 -32 ct 299 -32 299 -32 299 -171 ct 323 -194 333 -200 349 -200 ct 373 -200 385 -184 385 -152 ct 385 -152 385 -152 385 -48 ct 385 -17 378 -8 354 -8 ct 354 -8 354 -8 354 0 ct 354 0 354 0 455 0 ct 455 0 455 0 455 -7 ct 431 -10 425 -16 425 -40 ct 425 -40 425 -40 425 -153 ct 425 -199 404 -227 368 -227 ct 346 -227 331 -219 298 -187 ct 298 -187 298 -187 298 -226 ct 298 -226 298 -226 295 -227 ct 271 -218 254 -213 228 -205 ct 228 -205 228 -205 228 -196 ct p ef 637 5 m 637 5 637 5 708 -21 ct 708 -21 708 -21 708 -28 ct 699 -28 698 -28 697 -28 ct 679 -28 675 -33 675 -56 ct 675 -56 675 -56 675 -336 ct 675 -336 675 -336 673 -337 ct 650 -329 633 -324 602 -315 ct 602 -315 602 -315 602 -308 ct 606 -308 608 -308 612 -308 ct 630 -308 635 -303 635 -283 ct 635 -283 635 -283 635 -206 ct 616 -222 603 -227 584 -227 ct 528 -227 483 -171 483 -101 ct 483 -38 519 5 573 5 ct 600 5 618 -5 635 -28 ct 635 -28 635 -28 635 4 ct 635 4 635 4 637 5 ct p 635 -50 m 635 -47 631 -41 626 -35 ct 618 -26 606 -21 592 -21 ct 551 -21 525 -60 525 -121 ct 525 -177 548 -213 585 -213 ct 611 -213 635 -190 635 -164 ct 635 -164 635 -164 635 -50 ct p ef 850 -196 m 853 -198 857 -198 863 -198 ct 876 -198 881 -191 881 -166 ct 881 -166 881 -166 881 -44 ct 881 -15 875 -8 851 -8 ct 851 -8 851 -8 851 0 ct 851 0 851 0 953 0 ct 953 0 953 0 953 -8 ct 929 -8 921 -14 921 -32 ct 921 -32 921 -32 921 -171 ct 945 -194 955 -200 971 -200 ct 995 -200 1007 -184 1007 -152 ct 1007 -152 1007 -152 1007 -48 ct 1007 -17 1000 -8 976 -8 ct 976 -8 976 -8 976 0 ct 976 0 976 0 1077 0 ct 1077 0 1077 0 1077 -7 ct 1053 -10 1047 -16 1047 -40 ct 1047 -40 1047 -40 1047 -153 ct 1047 -199 1026 -227 990 -227 ct 968 -227 953 -219 920 -187 ct 920 -187 920 -187 920 -226 ct 920 -226 920 -226 917 -227 ct 893 -218 876 -213 850 -205 ct 850 -205 850 -205 850 -196 ct p ef 1213 -227 m 1150 -227 1106 -180 1106 -112 ct 1106 -45 1151 5 1212 5 ct 1273 5 1320 -47 1320 -115 ct 1320 -180 1275 -227 1213 -227 ct p 1207 -213 m 1247 -213 1276 -166 1276 -98 ct 1276 -42 1254 -9 1218 -9 ct 1199 -9 1181 -21 1171 -40 ct 1157 -66 1150 -101 1150 -136 ct 1150 -183 1172 -213 1207 -213 ct p ef 1427 -227 m 1427 -227 1427 -227 1352 -200 ct 1352 -200 1352 -200 1352 -192 ct 1352 -192 1352 -192 1356 -193 ct 1361 -194 1368 -194 1372 -194 ct 1384 -194 1388 -186 1388 -164 ct 1388 -164 1388 -164 1388 -49 ct 1388 -14 1383 -8 1350 -8 ct 1350 -8 1350 -8 1350 0 ct 1350 0 1350 0 1464 0 ct 1464 0 1464 0 1464 -8 ct 1433 -8 1429 -15 1429 -50 ct 1429 -50 1429 -50 1429 -225 ct 1429 -225 1429 -225 1427 -227 ct p 1404 -337 m 1391 -337 1380 -326 1380 -312 ct 1380 -298 1390 -287 1404 -287 ct 1418 -287 1429 -298 1429 -312 ct 1429 -326 1418 -337 1404 -337 ct p ef 1635 -155 m 1635 -155 1635 -155 1633 -222 ct 1633 -222 1633 -222 1627 -222 ct 1627 -222 1627 -222 1626 -221 ct 1622 -218 1621 -217 1619 -217 ct 1617 -217 1612 -218 1606 -221 ct 1596 -225 1585 -227 1573 -227 ct 1534 -227 1507 -202 1507 -166 ct 1507 -138 1522 -118 1563 -95 ct 1563 -95 1563 -95 1591 -78 ct 1608 -69 1617 -57 1617 -41 ct 1617 -20 1601 -6 1576 -6 ct 1560 -6 1545 -12 1536 -23 ct 1526 -35 1521 -47 1515 -75 ct 1515 -75 1515 -75 1507 -75 ct 1507 -75 1507 -75 1507 2 ct 1507 2 1507 2 1513 2 ct 1517 -3 1519 -4 1525 -4 ct 1529 -4 1536 -3 1547 0 ct 1560 3 1574 5 1582 5 ct 1619 5 1650 -24 1650 -58 ct 1650 -83 1639 -99 1610 -117 ct 1610 -117 1610 -117 1558 -148 ct 1544 -156 1537 -169 1537 -182 ct 1537 -202 1552 -216 1574 -216 ct 1602 -216 1616 -199 1627 -155 ct 1627 -155 1627 -155 1635 -155 ct p ef 1874 -81 m 1850 -43 1829 -29 1798 -29 ct 1771 -29 1750 -43 1736 -72 ct 1727 -90 1724 -107 1723 -137 ct 1723 -137 1723 -137 1872 -137 ct 1868 -169 1863 -183 1851 -199 ct 1837 -217 1814 -227 1789 -227 ct 1765 -227 1742 -218 1724 -201 ct 1701 -181 1688 -146 1688 -106 ct 1688 -37 1723 5 1779 5 ct 1825 5 1861 -24 1881 -78 ct 1881 -78 1881 -78 1874 -81 ct p 1724 -153 m 1729 -191 1746 -209 1775 -209 ct 1805 -209 1816 -196 1823 -153 ct 1823 -153 1823 -153 1724 -153 ct p ef pom gr gr gs gs pum 5435 10350 t 150 -222 m 150 -222 150 -222 90 -222 ct 90 -222 90 -222 90 -279 ct 90 -308 99 -323 118 -323 ct 128 -323 135 -318 143 -304 ct 151 -291 157 -286 165 -286 ct 176 -286 185 -295 185 -306 ct 185 -324 164 -337 135 -337 ct 105 -337 79 -324 67 -301 ct 54 -279 50 -261 50 -222 ct 50 -222 50 -222 10 -222 ct 10 -222 10 -222 10 -206 ct 10 -206 10 -206 50 -206 ct 50 -206 50 -206 50 -51 ct 50 -14 45 -8 10 -8 ct 10 -8 10 -8 10 0 ct 10 0 10 0 136 0 ct 136 0 136 0 136 -8 ct 96 -8 91 -13 91 -51 ct 91 -51 91 -51 91 -206 ct 91 -206 91 -206 150 -206 ct 150 -206 150 -206 150 -222 ct p ef 375 -32 m 367 -26 361 -23 354 -23 ct 343 -23 339 -30 339 -52 ct 339 -52 339 -52 339 -148 ct 339 -173 337 -188 329 -200 ct 319 -218 298 -227 269 -227 ct 224 -227 188 -203 188 -171 ct 188 -160 198 -150 209 -150 ct 221 -150 231 -160 231 -171 ct 231 -173 230 -175 230 -179 ct 229 -183 228 -187 228 -191 ct 228 -204 244 -215 263 -215 ct 287 -215 300 -201 300 -174 ct 300 -174 300 -174 300 -144 ct 225 -113 217 -109 196 -90 ct 186 -81 179 -64 179 -48 ct 179 -17 200 5 230 5 ct 251 5 271 -5 300 -31 ct 303 -5 312 5 331 5 ct 348 5 358 -1 375 -20 ct 375 -20 375 -20 375 -32 ct p 300 -61 m 300 -45 298 -41 287 -35 ct 276 -28 262 -24 252 -24 ct 235 -24 222 -40 222 -62 ct 222 -62 222 -62 222 -63 ct 222 -92 241 -110 300 -132 ct 300 -132 300 -132 300 -61 ct p ef 384 -192 m 391 -194 396 -194 401 -194 ct 413 -194 418 -186 418 -164 ct 418 -164 418 -164 418 -41 ct 418 -17 414 -13 383 -7 ct 383 -7 383 -7 383 0 ct 383 0 383 0 500 0 ct 500 0 500 0 500 -8 ct 467 -8 458 -15 458 -44 ct 458 -44 458 -44 458 -155 ct 458 -171 479 -196 492 -196 ct 495 -196 500 -193 505 -188 ct 513 -182 518 -179 524 -179 ct 536 -179 543 -187 543 -201 ct 543 -217 533 -227 517 -227 ct 496 -227 482 -216 458 -181 ct 458 -181 458 -181 458 -226 ct 458 -226 458 -226 456 -227 ct 430 -216 413 -210 384 -200 ct 384 -200 384 -200 384 -192 ct p ef 867 -81 m 843 -43 822 -29 791 -29 ct 764 -29 743 -43 729 -72 ct 720 -90 717 -107 716 -137 ct 716 -137 716 -137 865 -137 ct 861 -169 856 -183 844 -199 ct 830 -217 807 -227 782 -227 ct 758 -227 735 -218 717 -201 ct 694 -181 681 -146 681 -106 ct 681 -37 716 5 772 5 ct 818 5 854 -24 874 -78 ct 874 -78 874 -78 867 -81 ct p 717 -153 m 722 -191 739 -209 768 -209 ct 798 -209 809 -196 816 -153 ct 816 -153 816 -153 717 -153 ct p ef 897 -196 m 900 -198 904 -198 910 -198 ct 923 -198 928 -191 928 -166 ct 928 -166 928 -166 928 -44 ct 928 -15 922 -8 898 -8 ct 898 -8 898 -8 898 0 ct 898 0 898 0 1000 0 ct 1000 0 1000 0 1000 -8 ct 976 -8 968 -14 968 -32 ct 968 -32 968 -32 968 -171 ct 992 -194 1002 -200 1018 -200 ct 1042 -200 1054 -184 1054 -152 ct 1054 -152 1054 -152 1054 -48 ct 1054 -17 1047 -8 1023 -8 ct 1023 -8 1023 -8 1023 0 ct 1023 0 1023 0 1124 0 ct 1124 0 1124 0 1124 -7 ct 1100 -10 1094 -16 1094 -40 ct 1094 -40 1094 -40 1094 -153 ct 1094 -199 1073 -227 1037 -227 ct 1015 -227 1000 -219 967 -187 ct 967 -187 967 -187 967 -226 ct 967 -226 967 -226 964 -227 ct 940 -218 923 -213 897 -205 ct 897 -205 897 -205 897 -196 ct p ef 1306 5 m 1306 5 1306 5 1377 -21 ct 1377 -21 1377 -21 1377 -28 ct 1368 -28 1367 -28 1366 -28 ct 1348 -28 1344 -33 1344 -56 ct 1344 -56 1344 -56 1344 -336 ct 1344 -336 1344 -336 1342 -337 ct 1319 -329 1302 -324 1271 -315 ct 1271 -315 1271 -315 1271 -308 ct 1275 -308 1277 -308 1281 -308 ct 1299 -308 1304 -303 1304 -283 ct 1304 -283 1304 -283 1304 -206 ct 1285 -222 1272 -227 1253 -227 ct 1197 -227 1152 -171 1152 -101 ct 1152 -38 1188 5 1242 5 ct 1269 5 1287 -5 1304 -28 ct 1304 -28 1304 -28 1304 4 ct 1304 4 1304 4 1306 5 ct p 1304 -50 m 1304 -47 1300 -41 1295 -35 ct 1287 -26 1275 -21 1261 -21 ct 1220 -21 1194 -60 1194 -121 ct 1194 -177 1217 -213 1254 -213 ct 1280 -213 1304 -190 1304 -164 ct 1304 -164 1304 -164 1304 -50 ct p ef 1664 -155 m 1664 -155 1664 -155 1662 -222 ct 1662 -222 1662 -222 1656 -222 ct 1656 -222 1656 -222 1655 -221 ct 1651 -218 1650 -217 1648 -217 ct 1646 -217 1641 -218 1635 -221 ct 1625 -225 1614 -227 1602 -227 ct 1563 -227 1536 -202 1536 -166 ct 1536 -138 1551 -118 1592 -95 ct 1592 -95 1592 -95 1620 -78 ct 1637 -69 1646 -57 1646 -41 ct 1646 -20 1630 -6 1605 -6 ct 1589 -6 1574 -12 1565 -23 ct 1555 -35 1550 -47 1544 -75 ct 1544 -75 1544 -75 1536 -75 ct 1536 -75 1536 -75 1536 2 ct 1536 2 1536 2 1542 2 ct 1546 -3 1548 -4 1554 -4 ct 1558 -4 1565 -3 1576 0 ct 1589 3 1603 5 1611 5 ct 1648 5 1679 -24 1679 -58 ct 1679 -83 1668 -99 1639 -117 ct 1639 -117 1639 -117 1587 -148 ct 1573 -156 1566 -169 1566 -182 ct 1566 -202 1581 -216 1603 -216 ct 1631 -216 1645 -199 1656 -155 ct 1656 -155 1656 -155 1664 -155 ct p ef 1710 -195 m 1715 -195 1718 -195 1722 -195 ct 1739 -195 1742 -190 1742 -167 ct 1742 -167 1742 -167 1742 65 ct 1742 90 1737 96 1708 99 ct 1708 99 1708 99 1708 107 ct 1708 107 1708 107 1826 107 ct 1826 107 1826 107 1826 98 ct 1789 98 1783 93 1783 61 ct 1783 61 1783 61 1783 -16 ct 1800 0 1812 5 1832 5 ct 1889 5 1934 -50 1934 -122 ct 1934 -183 1900 -227 1853 -227 ct 1826 -227 1804 -215 1783 -189 ct 1783 -189 1783 -189 1783 -226 ct 1783 -226 1783 -226 1780 -227 ct 1754 -217 1737 -210 1710 -202 ct 1710 -202 1710 -202 1710 -195 ct p 1783 -165 m 1783 -180 1810 -197 1832 -197 ct 1868 -197 1892 -160 1892 -103 ct 1892 -48 1868 -11 1833 -11 ct 1811 -11 1783 -29 1783 -44 ct 1783 -44 1783 -44 1783 -165 ct p ef 2154 -81 m 2130 -43 2109 -29 2078 -29 ct 2051 -29 2030 -43 2016 -72 ct 2007 -90 2004 -107 2003 -137 ct 2003 -137 2003 -137 2152 -137 ct 2148 -169 2143 -183 2131 -199 ct 2117 -217 2094 -227 2069 -227 ct 2045 -227 2022 -218 2004 -201 ct 1981 -181 1968 -146 1968 -106 ct 1968 -37 2003 5 2059 5 ct 2105 5 2141 -24 2161 -78 ct 2161 -78 2161 -78 2154 -81 ct p 2004 -153 m 2009 -191 2026 -209 2055 -209 ct 2085 -209 2096 -196 2103 -153 ct 2103 -153 2103 -153 2004 -153 ct p ef 2374 -81 m 2350 -43 2329 -29 2298 -29 ct 2271 -29 2250 -43 2236 -72 ct 2227 -90 2224 -107 2223 -137 ct 2223 -137 2223 -137 2372 -137 ct 2368 -169 2363 -183 2351 -199 ct 2337 -217 2314 -227 2289 -227 ct 2265 -227 2242 -218 2224 -201 ct 2201 -181 2188 -146 2188 -106 ct 2188 -37 2223 5 2279 5 ct 2325 5 2361 -24 2381 -78 ct 2381 -78 2381 -78 2374 -81 ct p 2224 -153 m 2229 -191 2246 -209 2275 -209 ct 2305 -209 2316 -196 2323 -153 ct 2323 -153 2323 -153 2224 -153 ct p ef 2589 -77 m 2565 -42 2548 -31 2520 -31 ct 2476 -31 2445 -70 2445 -127 ct 2445 -178 2472 -213 2511 -213 ct 2529 -213 2535 -207 2540 -189 ct 2540 -189 2540 -189 2543 -178 ct 2547 -164 2555 -155 2565 -155 ct 2578 -155 2589 -164 2589 -176 ct 2589 -204 2555 -227 2514 -227 ct 2490 -227 2466 -217 2446 -199 ct 2422 -178 2408 -144 2408 -105 ct 2408 -41 2446 5 2500 5 ct 2522 5 2541 -3 2559 -18 ct 2572 -30 2581 -43 2595 -72 ct 2595 -72 2595 -72 2589 -77 ct p ef 2692 -169 m 2712 -192 2727 -200 2746 -200 ct 2770 -200 2782 -182 2782 -148 ct 2782 -148 2782 -148 2782 -50 ct 2782 -16 2777 -10 2749 -7 ct 2749 -7 2749 -7 2749 0 ct 2749 0 2749 0 2852 0 ct 2852 0 2852 0 2852 -7 ct 2826 -12 2823 -16 2823 -50 ct 2823 -50 2823 -50 2823 -148 ct 2823 -200 2802 -227 2763 -227 ct 2735 -227 2714 -215 2692 -185 ct 2692 -185 2692 -185 2692 -336 ct 2692 -336 2692 -336 2690 -337 ct 2673 -331 2661 -327 2634 -319 ct 2634 -319 2634 -319 2621 -315 ct 2621 -315 2621 -315 2621 -308 ct 2623 -308 2624 -308 2627 -308 ct 2647 -308 2651 -304 2651 -283 ct 2651 -283 2651 -283 2651 -50 ct 2651 -15 2648 -11 2620 -7 ct 2620 -7 2620 -7 2620 0 ct 2620 0 2620 0 2725 0 ct 2725 0 2725 0 2725 -7 ct 2697 -10 2692 -16 2692 -50 ct 2692 -50 2692 -50 2692 -169 ct p ef pom gr gr gs gs pum 10779 16488 t 9 -196 m 15 -198 19 -198 25 -198 ct 37 -198 42 -190 42 -166 ct 42 -166 42 -166 42 -41 ct 42 -15 35 -7 8 -7 ct 8 -7 8 -7 8 0 ct 8 0 8 0 115 0 ct 115 0 115 0 115 -8 ct 90 -8 82 -13 82 -33 ct 82 -33 82 -33 82 -172 ct 82 -173 86 -178 90 -181 ct 102 -193 122 -201 139 -201 ct 161 -201 171 -184 171 -149 ct 171 -149 171 -149 171 -42 ct 171 -14 166 -8 138 -8 ct 138 -8 138 -8 138 0 ct 138 0 138 0 247 0 ct 247 0 247 0 247 -7 ct 219 -7 212 -16 212 -46 ct 212 -46 212 -46 212 -171 ct 227 -192 243 -201 265 -201 ct 292 -201 301 -188 301 -147 ct 301 -147 301 -147 301 -43 ct 301 -15 297 -11 269 -7 ct 269 -7 269 -7 269 0 ct 269 0 269 0 375 0 ct 375 0 375 0 375 -8 ct 375 -8 375 -8 363 -8 ct 348 -8 342 -18 342 -37 ct 342 -37 342 -37 342 -139 ct 342 -197 323 -227 286 -227 ct 258 -227 233 -214 207 -185 ct 198 -214 182 -227 155 -227 ct 134 -227 121 -220 80 -189 ct 80 -189 80 -189 80 -226 ct 80 -226 80 -226 77 -227 ct 52 -218 36 -212 9 -205 ct 9 -205 9 -205 9 -196 ct p ef 470 -227 m 470 -227 470 -227 395 -200 ct 395 -200 395 -200 395 -192 ct 395 -192 395 -192 399 -193 ct 404 -194 411 -194 415 -194 ct 427 -194 431 -186 431 -164 ct 431 -164 431 -164 431 -49 ct 431 -14 426 -8 393 -8 ct 393 -8 393 -8 393 0 ct 393 0 393 0 507 0 ct 507 0 507 0 507 -8 ct 476 -8 472 -15 472 -50 ct 472 -50 472 -50 472 -225 ct 472 -225 472 -225 470 -227 ct p 447 -337 m 434 -337 423 -326 423 -312 ct 423 -298 433 -287 447 -287 ct 461 -287 472 -298 472 -312 ct 472 -326 461 -337 447 -337 ct p ef 718 -77 m 694 -42 677 -31 649 -31 ct 605 -31 574 -70 574 -127 ct 574 -178 601 -213 640 -213 ct 658 -213 664 -207 669 -189 ct 669 -189 669 -189 672 -178 ct 676 -164 684 -155 694 -155 ct 707 -155 718 -164 718 -176 ct 718 -204 684 -227 643 -227 ct 619 -227 595 -217 575 -199 ct 551 -178 537 -144 537 -105 ct 537 -41 575 5 629 5 ct 651 5 670 -3 688 -18 ct 701 -30 710 -43 724 -72 ct 724 -72 724 -72 718 -77 ct p ef 748 -192 m 755 -194 760 -194 765 -194 ct 777 -194 782 -186 782 -164 ct 782 -164 782 -164 782 -41 ct 782 -17 778 -13 747 -7 ct 747 -7 747 -7 747 0 ct 747 0 747 0 864 0 ct 864 0 864 0 864 -8 ct 831 -8 822 -15 822 -44 ct 822 -44 822 -44 822 -155 ct 822 -171 843 -196 856 -196 ct 859 -196 864 -193 869 -188 ct 877 -182 882 -179 888 -179 ct 900 -179 907 -187 907 -201 ct 907 -217 897 -227 881 -227 ct 860 -227 846 -216 822 -181 ct 822 -181 822 -181 822 -226 ct 822 -226 822 -226 820 -227 ct 794 -216 777 -210 748 -200 ct 748 -200 748 -200 748 -192 ct p ef 1031 -227 m 968 -227 924 -180 924 -112 ct 924 -45 969 5 1030 5 ct 1091 5 1138 -47 1138 -115 ct 1138 -180 1093 -227 1031 -227 ct p 1025 -213 m 1065 -213 1094 -166 1094 -98 ct 1094 -42 1072 -9 1036 -9 ct 1017 -9 999 -21 989 -40 ct 975 -66 968 -101 968 -136 ct 968 -183 990 -213 1025 -213 ct p ef 1164 -195 m 1169 -195 1172 -195 1176 -195 ct 1193 -195 1196 -190 1196 -167 ct 1196 -167 1196 -167 1196 65 ct 1196 90 1191 96 1162 99 ct 1162 99 1162 99 1162 107 ct 1162 107 1162 107 1280 107 ct 1280 107 1280 107 1280 98 ct 1243 98 1237 93 1237 61 ct 1237 61 1237 61 1237 -16 ct 1254 0 1266 5 1286 5 ct 1343 5 1388 -50 1388 -122 ct 1388 -183 1354 -227 1307 -227 ct 1280 -227 1258 -215 1237 -189 ct 1237 -189 1237 -189 1237 -226 ct 1237 -226 1237 -226 1234 -227 ct 1208 -217 1191 -210 1164 -202 ct 1164 -202 1164 -202 1164 -195 ct p 1237 -165 m 1237 -180 1264 -197 1286 -197 ct 1322 -197 1346 -160 1346 -103 ct 1346 -48 1322 -11 1287 -11 ct 1265 -11 1237 -29 1237 -44 ct 1237 -44 1237 -44 1237 -165 ct p ef 1486 -169 m 1506 -192 1521 -200 1540 -200 ct 1564 -200 1576 -182 1576 -148 ct 1576 -148 1576 -148 1576 -50 ct 1576 -16 1571 -10 1543 -7 ct 1543 -7 1543 -7 1543 0 ct 1543 0 1543 0 1646 0 ct 1646 0 1646 0 1646 -7 ct 1620 -12 1617 -16 1617 -50 ct 1617 -50 1617 -50 1617 -148 ct 1617 -200 1596 -227 1557 -227 ct 1529 -227 1508 -215 1486 -185 ct 1486 -185 1486 -185 1486 -336 ct 1486 -336 1486 -336 1484 -337 ct 1467 -331 1455 -327 1428 -319 ct 1428 -319 1428 -319 1415 -315 ct 1415 -315 1415 -315 1415 -308 ct 1417 -308 1418 -308 1421 -308 ct 1441 -308 1445 -304 1445 -283 ct 1445 -283 1445 -283 1445 -50 ct 1445 -15 1442 -11 1414 -7 ct 1414 -7 1414 -7 1414 0 ct 1414 0 1414 0 1519 0 ct 1519 0 1519 0 1519 -7 ct 1491 -10 1486 -16 1486 -50 ct 1486 -50 1486 -50 1486 -169 ct p ef 1780 -227 m 1717 -227 1673 -180 1673 -112 ct 1673 -45 1718 5 1779 5 ct 1840 5 1887 -47 1887 -115 ct 1887 -180 1842 -227 1780 -227 ct p 1774 -213 m 1814 -213 1843 -166 1843 -98 ct 1843 -42 1821 -9 1785 -9 ct 1766 -9 1748 -21 1738 -40 ct 1724 -66 1717 -101 1717 -136 ct 1717 -183 1739 -213 1774 -213 ct p ef 1917 -196 m 1920 -198 1924 -198 1930 -198 ct 1943 -198 1948 -191 1948 -166 ct 1948 -166 1948 -166 1948 -44 ct 1948 -15 1942 -8 1918 -8 ct 1918 -8 1918 -8 1918 0 ct 1918 0 1918 0 2020 0 ct 2020 0 2020 0 2020 -8 ct 1996 -8 1988 -14 1988 -32 ct 1988 -32 1988 -32 1988 -171 ct 2012 -194 2022 -200 2038 -200 ct 2062 -200 2074 -184 2074 -152 ct 2074 -152 2074 -152 2074 -48 ct 2074 -17 2067 -8 2043 -8 ct 2043 -8 2043 -8 2043 0 ct 2043 0 2043 0 2144 0 ct 2144 0 2144 0 2144 -7 ct 2120 -10 2114 -16 2114 -40 ct 2114 -40 2114 -40 2114 -153 ct 2114 -199 2093 -227 2057 -227 ct 2035 -227 2020 -219 1987 -187 ct 1987 -187 1987 -187 1987 -226 ct 1987 -226 1987 -226 1984 -227 ct 1960 -218 1943 -213 1917 -205 ct 1917 -205 1917 -205 1917 -196 ct p ef 2357 -81 m 2333 -43 2312 -29 2281 -29 ct 2254 -29 2233 -43 2219 -72 ct 2210 -90 2207 -107 2206 -137 ct 2206 -137 2206 -137 2355 -137 ct 2351 -169 2346 -183 2334 -199 ct 2320 -217 2297 -227 2272 -227 ct 2248 -227 2225 -218 2207 -201 ct 2184 -181 2171 -146 2171 -106 ct 2171 -37 2206 5 2262 5 ct 2308 5 2344 -24 2364 -78 ct 2364 -78 2364 -78 2357 -81 ct p 2207 -153 m 2212 -191 2229 -209 2258 -209 ct 2288 -209 2299 -196 2306 -153 ct 2306 -153 2306 -153 2207 -153 ct p ef pom gr gr gs gs pum 15356 12996 t 3 -192 m 10 -194 15 -194 20 -194 ct 32 -194 37 -186 37 -164 ct 37 -164 37 -164 37 -41 ct 37 -17 33 -13 2 -7 ct 2 -7 2 -7 2 0 ct 2 0 2 0 119 0 ct 119 0 119 0 119 -8 ct 86 -8 77 -15 77 -44 ct 77 -44 77 -44 77 -155 ct 77 -171 98 -196 111 -196 ct 114 -196 119 -193 124 -188 ct 132 -182 137 -179 143 -179 ct 155 -179 162 -187 162 -201 ct 162 -217 152 -227 136 -227 ct 115 -227 101 -216 77 -181 ct 77 -181 77 -181 77 -226 ct 77 -226 77 -226 75 -227 ct 49 -216 32 -210 3 -200 ct 3 -200 3 -200 3 -192 ct p ef 363 -81 m 339 -43 318 -29 287 -29 ct 260 -29 239 -43 225 -72 ct 216 -90 213 -107 212 -137 ct 212 -137 212 -137 361 -137 ct 357 -169 352 -183 340 -199 ct 326 -217 303 -227 278 -227 ct 254 -227 231 -218 213 -201 ct 190 -181 177 -146 177 -106 ct 177 -37 212 5 268 5 ct 314 5 350 -24 370 -78 ct 370 -78 370 -78 363 -81 ct p 213 -153 m 218 -191 235 -209 264 -209 ct 294 -209 305 -196 312 -153 ct 312 -153 312 -153 213 -153 ct p ef 616 -222 m 616 -222 616 -222 549 -222 ct 549 -222 549 -222 549 -215 ct 564 -213 571 -208 571 -199 ct 571 -194 570 -189 568 -184 ct 568 -184 568 -184 521 -56 ct 521 -56 521 -56 471 -182 ct 468 -189 467 -196 467 -201 ct 467 -210 472 -213 489 -215 ct 489 -215 489 -215 489 -222 ct 489 -222 489 -222 394 -222 ct 394 -222 394 -222 394 -214 ct 413 -214 416 -209 438 -158 ct 438 -158 438 -158 496 -16 ct 497 -13 499 -10 500 -6 ct 503 3 506 7 509 7 ct 512 7 515 1 522 -18 ct 522 -18 522 -18 584 -176 ct 599 -210 601 -213 616 -215 ct 616 -215 616 -215 616 -222 ct p ef 829 -81 m 805 -43 784 -29 753 -29 ct 726 -29 705 -43 691 -72 ct 682 -90 679 -107 678 -137 ct 678 -137 678 -137 827 -137 ct 823 -169 818 -183 806 -199 ct 792 -217 769 -227 744 -227 ct 720 -227 697 -218 679 -201 ct 656 -181 643 -146 643 -106 ct 643 -37 678 5 734 5 ct 780 5 816 -24 836 -78 ct 836 -78 836 -78 829 -81 ct p 679 -153 m 684 -191 701 -209 730 -209 ct 760 -209 771 -196 778 -153 ct 778 -153 778 -153 679 -153 ct p ef 854 -192 m 861 -194 866 -194 871 -194 ct 883 -194 888 -186 888 -164 ct 888 -164 888 -164 888 -41 ct 888 -17 884 -13 853 -7 ct 853 -7 853 -7 853 0 ct 853 0 853 0 970 0 ct 970 0 970 0 970 -8 ct 937 -8 928 -15 928 -44 ct 928 -44 928 -44 928 -155 ct 928 -171 949 -196 962 -196 ct 965 -196 970 -193 975 -188 ct 983 -182 988 -179 994 -179 ct 1006 -179 1013 -187 1013 -201 ct 1013 -217 1003 -227 987 -227 ct 966 -227 952 -216 928 -181 ct 928 -181 928 -181 928 -226 ct 928 -226 928 -226 926 -227 ct 900 -216 883 -210 854 -200 ct 854 -200 854 -200 854 -192 ct p ef 1090 -336 m 1090 -336 1090 -336 1088 -337 ct 1067 -330 1054 -326 1031 -319 ct 1031 -319 1031 -319 1017 -315 ct 1017 -315 1017 -315 1017 -308 ct 1020 -308 1022 -308 1026 -308 ct 1045 -308 1049 -304 1049 -283 ct 1049 -283 1049 -283 1049 -27 ct 1049 -11 1091 5 1129 5 ct 1193 5 1243 -49 1243 -120 ct 1243 -181 1206 -227 1157 -227 ct 1128 -227 1100 -209 1090 -185 ct 1090 -185 1090 -185 1090 -336 ct p 1090 -159 m 1090 -178 1113 -196 1138 -196 ct 1176 -196 1200 -157 1200 -97 ct 1200 -42 1177 -11 1137 -11 ct 1112 -11 1090 -22 1090 -35 ct 1090 -35 1090 -35 1090 -159 ct p ef 1464 -81 m 1440 -43 1419 -29 1388 -29 ct 1361 -29 1340 -43 1326 -72 ct 1317 -90 1314 -107 1313 -137 ct 1313 -137 1313 -137 1462 -137 ct 1458 -169 1453 -183 1441 -199 ct 1427 -217 1404 -227 1379 -227 ct 1355 -227 1332 -218 1314 -201 ct 1291 -181 1278 -146 1278 -106 ct 1278 -37 1313 5 1369 5 ct 1415 5 1451 -24 1471 -78 ct 1471 -78 1471 -78 1464 -81 ct p 1314 -153 m 1319 -191 1336 -209 1365 -209 ct 1395 -209 1406 -196 1413 -153 ct 1413 -153 1413 -153 1314 -153 ct p ef 1489 -192 m 1496 -194 1501 -194 1506 -194 ct 1518 -194 1523 -186 1523 -164 ct 1523 -164 1523 -164 1523 -41 ct 1523 -17 1519 -13 1488 -7 ct 1488 -7 1488 -7 1488 0 ct 1488 0 1488 0 1605 0 ct 1605 0 1605 0 1605 -8 ct 1572 -8 1563 -15 1563 -44 ct 1563 -44 1563 -44 1563 -155 ct 1563 -171 1584 -196 1597 -196 ct 1600 -196 1605 -193 1610 -188 ct 1618 -182 1623 -179 1629 -179 ct 1641 -179 1648 -187 1648 -201 ct 1648 -217 1638 -227 1622 -227 ct 1601 -227 1587 -216 1563 -181 ct 1563 -181 1563 -181 1563 -226 ct 1563 -226 1563 -226 1561 -227 ct 1535 -216 1518 -210 1489 -200 ct 1489 -200 1489 -200 1489 -192 ct p ef 1865 -32 m 1857 -26 1851 -23 1844 -23 ct 1833 -23 1829 -30 1829 -52 ct 1829 -52 1829 -52 1829 -148 ct 1829 -173 1827 -188 1819 -200 ct 1809 -218 1788 -227 1759 -227 ct 1714 -227 1678 -203 1678 -171 ct 1678 -160 1688 -150 1699 -150 ct 1711 -150 1721 -160 1721 -171 ct 1721 -173 1720 -175 1720 -179 ct 1719 -183 1718 -187 1718 -191 ct 1718 -204 1734 -215 1753 -215 ct 1777 -215 1790 -201 1790 -174 ct 1790 -174 1790 -174 1790 -144 ct 1715 -113 1707 -109 1686 -90 ct 1676 -81 1669 -64 1669 -48 ct 1669 -17 1690 5 1720 5 ct 1741 5 1761 -5 1790 -31 ct 1793 -5 1802 5 1821 5 ct 1838 5 1848 -1 1865 -20 ct 1865 -20 1865 -20 1865 -32 ct p 1790 -61 m 1790 -45 1788 -41 1777 -35 ct 1766 -28 1752 -24 1742 -24 ct 1725 -24 1712 -40 1712 -62 ct 1712 -62 1712 -62 1712 -63 ct 1712 -92 1731 -110 1790 -132 ct 1790 -132 1790 -132 1790 -61 ct p ef 1994 -222 m 1994 -222 1994 -222 1946 -222 ct 1946 -222 1946 -222 1946 -279 ct 1946 -284 1945 -286 1942 -286 ct 1939 -281 1936 -277 1932 -272 ct 1914 -245 1893 -221 1886 -219 ct 1880 -216 1877 -212 1877 -210 ct 1877 -208 1878 -207 1879 -206 ct 1879 -206 1879 -206 1905 -206 ct 1905 -206 1905 -206 1905 -58 ct 1905 -16 1919 5 1948 5 ct 1972 5 1990 -7 2006 -33 ct 2006 -33 2006 -33 2000 -38 ct 1990 -26 1981 -21 1971 -21 ct 1953 -21 1946 -34 1946 -65 ct 1946 -65 1946 -65 1946 -206 ct 1946 -206 1946 -206 1994 -206 ct 1994 -206 1994 -206 1994 -222 ct p ef 2096 -227 m 2096 -227 2096 -227 2021 -200 ct 2021 -200 2021 -200 2021 -192 ct 2021 -192 2021 -192 2025 -193 ct 2030 -194 2037 -194 2041 -194 ct 2053 -194 2057 -186 2057 -164 ct 2057 -164 2057 -164 2057 -49 ct 2057 -14 2052 -8 2019 -8 ct 2019 -8 2019 -8 2019 0 ct 2019 0 2019 0 2133 0 ct 2133 0 2133 0 2133 -8 ct 2102 -8 2098 -15 2098 -50 ct 2098 -50 2098 -50 2098 -225 ct 2098 -225 2098 -225 2096 -227 ct p 2073 -337 m 2060 -337 2049 -326 2049 -312 ct 2049 -298 2059 -287 2073 -287 ct 2087 -287 2098 -298 2098 -312 ct 2098 -326 2087 -337 2073 -337 ct p ef 2272 -227 m 2209 -227 2165 -180 2165 -112 ct 2165 -45 2210 5 2271 5 ct 2332 5 2379 -47 2379 -115 ct 2379 -180 2334 -227 2272 -227 ct p 2266 -213 m 2306 -213 2335 -166 2335 -98 ct 2335 -42 2313 -9 2277 -9 ct 2258 -9 2240 -21 2230 -40 ct 2216 -66 2209 -101 2209 -136 ct 2209 -183 2231 -213 2266 -213 ct p ef 2408 -196 m 2411 -198 2415 -198 2421 -198 ct 2434 -198 2439 -191 2439 -166 ct 2439 -166 2439 -166 2439 -44 ct 2439 -15 2433 -8 2409 -8 ct 2409 -8 2409 -8 2409 0 ct 2409 0 2409 0 2511 0 ct 2511 0 2511 0 2511 -8 ct 2487 -8 2479 -14 2479 -32 ct 2479 -32 2479 -32 2479 -171 ct 2503 -194 2513 -200 2529 -200 ct 2553 -200 2565 -184 2565 -152 ct 2565 -152 2565 -152 2565 -48 ct 2565 -17 2558 -8 2534 -8 ct 2534 -8 2534 -8 2534 0 ct 2534 0 2534 0 2635 0 ct 2635 0 2635 0 2635 -7 ct 2611 -10 2605 -16 2605 -40 ct 2605 -40 2605 -40 2605 -153 ct 2605 -199 2584 -227 2548 -227 ct 2526 -227 2511 -219 2478 -187 ct 2478 -187 2478 -187 2478 -226 ct 2478 -226 2478 -226 2475 -227 ct 2451 -218 2434 -213 2408 -205 ct 2408 -205 2408 -205 2408 -196 ct p ef pom gr gr gs gs pum 4561 12996 t 214 -32 m 206 -26 200 -23 193 -23 ct 182 -23 178 -30 178 -52 ct 178 -52 178 -52 178 -148 ct 178 -173 176 -188 168 -200 ct 158 -218 137 -227 108 -227 ct 63 -227 27 -203 27 -171 ct 27 -160 37 -150 48 -150 ct 60 -150 70 -160 70 -171 ct 70 -173 69 -175 69 -179 ct 68 -183 67 -187 67 -191 ct 67 -204 83 -215 102 -215 ct 126 -215 139 -201 139 -174 ct 139 -174 139 -174 139 -144 ct 64 -113 56 -109 35 -90 ct 25 -81 18 -64 18 -48 ct 18 -17 39 5 69 5 ct 90 5 110 -5 139 -31 ct 142 -5 151 5 170 5 ct 187 5 197 -1 214 -20 ct 214 -20 214 -20 214 -32 ct p 139 -61 m 139 -45 137 -41 126 -35 ct 115 -28 101 -24 91 -24 ct 74 -24 61 -40 61 -62 ct 61 -62 61 -62 61 -63 ct 61 -92 80 -110 139 -132 ct 139 -132 139 -132 139 -61 ct p ef 387 5 m 387 5 387 5 458 -21 ct 458 -21 458 -21 458 -28 ct 449 -28 448 -28 447 -28 ct 429 -28 425 -33 425 -56 ct 425 -56 425 -56 425 -336 ct 425 -336 425 -336 423 -337 ct 400 -329 383 -324 352 -315 ct 352 -315 352 -315 352 -308 ct 356 -308 358 -308 362 -308 ct 380 -308 385 -303 385 -283 ct 385 -283 385 -283 385 -206 ct 366 -222 353 -227 334 -227 ct 278 -227 233 -171 233 -101 ct 233 -38 269 5 323 5 ct 350 5 368 -5 385 -28 ct 385 -28 385 -28 385 4 ct 385 4 385 4 387 5 ct p 385 -50 m 385 -47 381 -41 376 -35 ct 368 -26 356 -21 342 -21 ct 301 -21 275 -60 275 -121 ct 275 -177 298 -213 335 -213 ct 361 -213 385 -190 385 -164 ct 385 -164 385 -164 385 -50 ct p ef 684 -32 m 676 -26 670 -23 663 -23 ct 652 -23 648 -30 648 -52 ct 648 -52 648 -52 648 -148 ct 648 -173 646 -188 638 -200 ct 628 -218 607 -227 578 -227 ct 533 -227 497 -203 497 -171 ct 497 -160 507 -150 518 -150 ct 530 -150 540 -160 540 -171 ct 540 -173 539 -175 539 -179 ct 538 -183 537 -187 537 -191 ct 537 -204 553 -215 572 -215 ct 596 -215 609 -201 609 -174 ct 609 -174 609 -174 609 -144 ct 534 -113 526 -109 505 -90 ct 495 -81 488 -64 488 -48 ct 488 -17 509 5 539 5 ct 560 5 580 -5 609 -31 ct 612 -5 621 5 640 5 ct 657 5 667 -1 684 -20 ct 684 -20 684 -20 684 -32 ct p 609 -61 m 609 -45 607 -41 596 -35 ct 585 -28 571 -24 561 -24 ct 544 -24 531 -40 531 -62 ct 531 -62 531 -62 531 -63 ct 531 -92 550 -110 609 -132 ct 609 -132 609 -132 609 -61 ct p ef 694 -195 m 699 -195 702 -195 706 -195 ct 723 -195 726 -190 726 -167 ct 726 -167 726 -167 726 65 ct 726 90 721 96 692 99 ct 692 99 692 99 692 107 ct 692 107 692 107 810 107 ct 810 107 810 107 810 98 ct 773 98 767 93 767 61 ct 767 61 767 61 767 -16 ct 784 0 796 5 816 5 ct 873 5 918 -50 918 -122 ct 918 -183 884 -227 837 -227 ct 810 -227 788 -215 767 -189 ct 767 -189 767 -189 767 -226 ct 767 -226 767 -226 764 -227 ct 738 -217 721 -210 694 -202 ct 694 -202 694 -202 694 -195 ct p 767 -165 m 767 -180 794 -197 816 -197 ct 852 -197 876 -160 876 -103 ct 876 -48 852 -11 817 -11 ct 795 -11 767 -29 767 -44 ct 767 -44 767 -44 767 -165 ct p ef 1063 -222 m 1063 -222 1063 -222 1015 -222 ct 1015 -222 1015 -222 1015 -279 ct 1015 -284 1014 -286 1011 -286 ct 1008 -281 1005 -277 1001 -272 ct 983 -245 962 -221 955 -219 ct 949 -216 946 -212 946 -210 ct 946 -208 947 -207 948 -206 ct 948 -206 948 -206 974 -206 ct 974 -206 974 -206 974 -58 ct 974 -16 988 5 1017 5 ct 1041 5 1059 -7 1075 -33 ct 1075 -33 1075 -33 1069 -38 ct 1059 -26 1050 -21 1040 -21 ct 1022 -21 1015 -34 1015 -65 ct 1015 -65 1015 -65 1015 -206 ct 1015 -206 1015 -206 1063 -206 ct 1063 -206 1063 -206 1063 -222 ct p ef 1165 -227 m 1165 -227 1165 -227 1090 -200 ct 1090 -200 1090 -200 1090 -192 ct 1090 -192 1090 -192 1094 -193 ct 1099 -194 1106 -194 1110 -194 ct 1122 -194 1126 -186 1126 -164 ct 1126 -164 1126 -164 1126 -49 ct 1126 -14 1121 -8 1088 -8 ct 1088 -8 1088 -8 1088 0 ct 1088 0 1088 0 1202 0 ct 1202 0 1202 0 1202 -8 ct 1171 -8 1167 -15 1167 -50 ct 1167 -50 1167 -50 1167 -225 ct 1167 -225 1167 -225 1165 -227 ct p 1142 -337 m 1129 -337 1118 -326 1118 -312 ct 1118 -298 1128 -287 1142 -287 ct 1156 -287 1167 -298 1167 -312 ct 1167 -326 1156 -337 1142 -337 ct p ef 1450 -222 m 1450 -222 1450 -222 1383 -222 ct 1383 -222 1383 -222 1383 -215 ct 1398 -213 1405 -208 1405 -199 ct 1405 -194 1404 -189 1402 -184 ct 1402 -184 1402 -184 1355 -56 ct 1355 -56 1355 -56 1305 -182 ct 1302 -189 1301 -196 1301 -201 ct 1301 -210 1306 -213 1323 -215 ct 1323 -215 1323 -215 1323 -222 ct 1323 -222 1323 -222 1228 -222 ct 1228 -222 1228 -222 1228 -214 ct 1247 -214 1250 -209 1272 -158 ct 1272 -158 1272 -158 1330 -16 ct 1331 -13 1333 -10 1334 -6 ct 1337 3 1340 7 1343 7 ct 1346 7 1349 1 1356 -18 ct 1356 -18 1356 -18 1418 -176 ct 1433 -210 1435 -213 1450 -215 ct 1450 -215 1450 -215 1450 -222 ct p ef 1663 -81 m 1639 -43 1618 -29 1587 -29 ct 1560 -29 1539 -43 1525 -72 ct 1516 -90 1513 -107 1512 -137 ct 1512 -137 1512 -137 1661 -137 ct 1657 -169 1652 -183 1640 -199 ct 1626 -217 1603 -227 1578 -227 ct 1554 -227 1531 -218 1513 -201 ct 1490 -181 1477 -146 1477 -106 ct 1477 -37 1512 5 1568 5 ct 1614 5 1650 -24 1670 -78 ct 1670 -78 1670 -78 1663 -81 ct p 1513 -153 m 1518 -191 1535 -209 1564 -209 ct 1594 -209 1605 -196 1612 -153 ct 1612 -153 1612 -153 1513 -153 ct p ef 1958 -222 m 1958 -222 1958 -222 1898 -222 ct 1898 -222 1898 -222 1898 -279 ct 1898 -308 1907 -323 1926 -323 ct 1936 -323 1943 -318 1951 -304 ct 1959 -291 1965 -286 1973 -286 ct 1984 -286 1993 -295 1993 -306 ct 1993 -324 1972 -337 1943 -337 ct 1913 -337 1887 -324 1875 -301 ct 1862 -279 1858 -261 1858 -222 ct 1858 -222 1858 -222 1818 -222 ct 1818 -222 1818 -222 1818 -206 ct 1818 -206 1818 -206 1858 -206 ct 1858 -206 1858 -206 1858 -51 ct 1858 -14 1853 -8 1818 -8 ct 1818 -8 1818 -8 1818 0 ct 1818 0 1818 0 1944 0 ct 1944 0 1944 0 1944 -8 ct 1904 -8 1899 -13 1899 -51 ct 1899 -51 1899 -51 1899 -206 ct 1899 -206 1899 -206 1958 -206 ct 1958 -206 1958 -206 1958 -222 ct p ef 2054 -227 m 2054 -227 2054 -227 1979 -200 ct 1979 -200 1979 -200 1979 -192 ct 1979 -192 1979 -192 1983 -193 ct 1988 -194 1995 -194 1999 -194 ct 2011 -194 2015 -186 2015 -164 ct 2015 -164 2015 -164 2015 -49 ct 2015 -14 2010 -8 1977 -8 ct 1977 -8 1977 -8 1977 0 ct 1977 0 1977 0 2091 0 ct 2091 0 2091 0 2091 -8 ct 2060 -8 2056 -15 2056 -50 ct 2056 -50 2056 -50 2056 -225 ct 2056 -225 2056 -225 2054 -227 ct p 2031 -337 m 2018 -337 2007 -326 2007 -312 ct 2007 -298 2017 -287 2031 -287 ct 2045 -287 2056 -298 2056 -312 ct 2056 -326 2045 -337 2031 -337 ct p ef 2117 -307 m 2117 -307 2117 -307 2120 -307 ct 2125 -308 2131 -308 2135 -308 ct 2151 -308 2155 -301 2155 -278 ct 2155 -278 2155 -278 2155 -42 ct 2155 -15 2149 -8 2118 -8 ct 2118 -8 2118 -8 2118 0 ct 2118 0 2118 0 2232 0 ct 2232 0 2232 0 2232 -8 ct 2202 -8 2196 -14 2196 -41 ct 2196 -41 2196 -41 2196 -336 ct 2196 -336 2196 -336 2194 -337 ct 2169 -328 2151 -323 2117 -315 ct 2117 -315 2117 -315 2117 -307 ct p ef 2367 -222 m 2367 -222 2367 -222 2319 -222 ct 2319 -222 2319 -222 2319 -279 ct 2319 -284 2318 -286 2315 -286 ct 2312 -281 2309 -277 2305 -272 ct 2287 -245 2266 -221 2259 -219 ct 2253 -216 2250 -212 2250 -210 ct 2250 -208 2251 -207 2252 -206 ct 2252 -206 2252 -206 2278 -206 ct 2278 -206 2278 -206 2278 -58 ct 2278 -16 2292 5 2321 5 ct 2345 5 2363 -7 2379 -33 ct 2379 -33 2379 -33 2373 -38 ct 2363 -26 2354 -21 2344 -21 ct 2326 -21 2319 -34 2319 -65 ct 2319 -65 2319 -65 2319 -206 ct 2319 -206 2319 -206 2367 -206 ct 2367 -206 2367 -206 2367 -222 ct p ef 2581 -81 m 2557 -43 2536 -29 2505 -29 ct 2478 -29 2457 -43 2443 -72 ct 2434 -90 2431 -107 2430 -137 ct 2430 -137 2430 -137 2579 -137 ct 2575 -169 2570 -183 2558 -199 ct 2544 -217 2521 -227 2496 -227 ct 2472 -227 2449 -218 2431 -201 ct 2408 -181 2395 -146 2395 -106 ct 2395 -37 2430 5 2486 5 ct 2532 5 2568 -24 2588 -78 ct 2588 -78 2588 -78 2581 -81 ct p 2431 -153 m 2436 -191 2453 -209 2482 -209 ct 2512 -209 2523 -196 2530 -153 ct 2530 -153 2530 -153 2431 -153 ct p ef 2607 -192 m 2614 -194 2619 -194 2624 -194 ct 2636 -194 2641 -186 2641 -164 ct 2641 -164 2641 -164 2641 -41 ct 2641 -17 2637 -13 2606 -7 ct 2606 -7 2606 -7 2606 0 ct 2606 0 2606 0 2723 0 ct 2723 0 2723 0 2723 -8 ct 2690 -8 2681 -15 2681 -44 ct 2681 -44 2681 -44 2681 -155 ct 2681 -171 2702 -196 2715 -196 ct 2718 -196 2723 -193 2728 -188 ct 2736 -182 2741 -179 2747 -179 ct 2759 -179 2766 -187 2766 -201 ct 2766 -217 2756 -227 2740 -227 ct 2719 -227 2705 -216 2681 -181 ct 2681 -181 2681 -181 2681 -226 ct 2681 -226 2681 -226 2679 -227 ct 2653 -216 2636 -210 2607 -200 ct 2607 -200 2607 -200 2607 -192 ct p ef pom gr gr gs gs pum 10753 9450 t 9 -307 m 9 -307 9 -307 12 -307 ct 17 -308 23 -308 27 -308 ct 43 -308 47 -301 47 -278 ct 47 -278 47 -278 47 -42 ct 47 -15 41 -8 10 -8 ct 10 -8 10 -8 10 0 ct 10 0 10 0 124 0 ct 124 0 124 0 124 -8 ct 94 -8 88 -14 88 -41 ct 88 -41 88 -41 88 -336 ct 88 -336 88 -336 86 -337 ct 61 -328 43 -323 9 -315 ct 9 -315 9 -315 9 -307 ct p ef 256 -227 m 193 -227 149 -180 149 -112 ct 149 -45 194 5 255 5 ct 316 5 363 -47 363 -115 ct 363 -180 318 -227 256 -227 ct p 250 -213 m 290 -213 319 -166 319 -98 ct 319 -42 297 -9 261 -9 ct 242 -9 224 -21 214 -40 ct 200 -66 193 -101 193 -136 ct 193 -183 215 -213 250 -213 ct p ef 617 -25 m 617 -25 617 -25 614 -25 ct 592 -25 587 -30 587 -53 ct 587 -53 587 -53 587 -222 ct 587 -222 587 -222 510 -222 ct 510 -222 510 -222 510 -213 ct 540 -213 546 -208 546 -183 ct 546 -183 546 -183 546 -67 ct 546 -53 544 -46 537 -41 ct 524 -30 509 -24 494 -24 ct 476 -24 460 -41 460 -61 ct 460 -61 460 -61 460 -222 ct 460 -222 460 -222 389 -222 ct 389 -222 389 -222 389 -214 ct 413 -214 419 -206 419 -184 ct 419 -184 419 -184 419 -59 ct 419 -20 443 5 478 5 ct 496 5 515 -3 528 -16 ct 528 -16 528 -16 549 -38 ct 549 -38 549 -38 549 4 ct 549 4 549 4 551 5 ct 575 -5 592 -11 617 -18 ct 617 -18 617 -18 617 -25 ct p ef 798 5 m 798 5 798 5 869 -21 ct 869 -21 869 -21 869 -28 ct 860 -28 859 -28 858 -28 ct 840 -28 836 -33 836 -56 ct 836 -56 836 -56 836 -336 ct 836 -336 836 -336 834 -337 ct 811 -329 794 -324 763 -315 ct 763 -315 763 -315 763 -308 ct 767 -308 769 -308 773 -308 ct 791 -308 796 -303 796 -283 ct 796 -283 796 -283 796 -206 ct 777 -222 764 -227 745 -227 ct 689 -227 644 -171 644 -101 ct 644 -38 680 5 734 5 ct 761 5 779 -5 796 -28 ct 796 -28 796 -28 796 4 ct 796 4 796 4 798 5 ct p 796 -50 m 796 -47 792 -41 787 -35 ct 779 -26 767 -21 753 -21 ct 712 -21 686 -60 686 -121 ct 686 -177 709 -213 746 -213 ct 772 -213 796 -190 796 -164 ct 796 -164 796 -164 796 -50 ct p ef 1034 -155 m 1034 -155 1034 -155 1032 -222 ct 1032 -222 1032 -222 1026 -222 ct 1026 -222 1026 -222 1025 -221 ct 1021 -218 1020 -217 1018 -217 ct 1016 -217 1011 -218 1005 -221 ct 995 -225 984 -227 972 -227 ct 933 -227 906 -202 906 -166 ct 906 -138 921 -118 962 -95 ct 962 -95 962 -95 990 -78 ct 1007 -69 1016 -57 1016 -41 ct 1016 -20 1000 -6 975 -6 ct 959 -6 944 -12 935 -23 ct 925 -35 920 -47 914 -75 ct 914 -75 914 -75 906 -75 ct 906 -75 906 -75 906 2 ct 906 2 906 2 912 2 ct 916 -3 918 -4 924 -4 ct 928 -4 935 -3 946 0 ct 959 3 973 5 981 5 ct 1018 5 1049 -24 1049 -58 ct 1049 -83 1038 -99 1009 -117 ct 1009 -117 1009 -117 957 -148 ct 943 -156 936 -169 936 -182 ct 936 -202 951 -216 973 -216 ct 1001 -216 1015 -199 1026 -155 ct 1026 -155 1026 -155 1034 -155 ct p ef 1079 -195 m 1084 -195 1087 -195 1091 -195 ct 1108 -195 1111 -190 1111 -167 ct 1111 -167 1111 -167 1111 65 ct 1111 90 1106 96 1077 99 ct 1077 99 1077 99 1077 107 ct 1077 107 1077 107 1195 107 ct 1195 107 1195 107 1195 98 ct 1158 98 1152 93 1152 61 ct 1152 61 1152 61 1152 -16 ct 1169 0 1181 5 1201 5 ct 1258 5 1303 -50 1303 -122 ct 1303 -183 1269 -227 1222 -227 ct 1195 -227 1173 -215 1152 -189 ct 1152 -189 1152 -189 1152 -226 ct 1152 -226 1152 -226 1149 -227 ct 1123 -217 1106 -210 1079 -202 ct 1079 -202 1079 -202 1079 -195 ct p 1152 -165 m 1152 -180 1179 -197 1201 -197 ct 1237 -197 1261 -160 1261 -103 ct 1261 -48 1237 -11 1202 -11 ct 1180 -11 1152 -29 1152 -44 ct 1152 -44 1152 -44 1152 -165 ct p ef 1523 -81 m 1499 -43 1478 -29 1447 -29 ct 1420 -29 1399 -43 1385 -72 ct 1376 -90 1373 -107 1372 -137 ct 1372 -137 1372 -137 1521 -137 ct 1517 -169 1512 -183 1500 -199 ct 1486 -217 1463 -227 1438 -227 ct 1414 -227 1391 -218 1373 -201 ct 1350 -181 1337 -146 1337 -106 ct 1337 -37 1372 5 1428 5 ct 1474 5 1510 -24 1530 -78 ct 1530 -78 1530 -78 1523 -81 ct p 1373 -153 m 1378 -191 1395 -209 1424 -209 ct 1454 -209 1465 -196 1472 -153 ct 1472 -153 1472 -153 1373 -153 ct p ef 1759 -32 m 1751 -26 1745 -23 1738 -23 ct 1727 -23 1723 -30 1723 -52 ct 1723 -52 1723 -52 1723 -148 ct 1723 -173 1721 -188 1713 -200 ct 1703 -218 1682 -227 1653 -227 ct 1608 -227 1572 -203 1572 -171 ct 1572 -160 1582 -150 1593 -150 ct 1605 -150 1615 -160 1615 -171 ct 1615 -173 1614 -175 1614 -179 ct 1613 -183 1612 -187 1612 -191 ct 1612 -204 1628 -215 1647 -215 ct 1671 -215 1684 -201 1684 -174 ct 1684 -174 1684 -174 1684 -144 ct 1609 -113 1601 -109 1580 -90 ct 1570 -81 1563 -64 1563 -48 ct 1563 -17 1584 5 1614 5 ct 1635 5 1655 -5 1684 -31 ct 1687 -5 1696 5 1715 5 ct 1732 5 1742 -1 1759 -20 ct 1759 -20 1759 -20 1759 -32 ct p 1684 -61 m 1684 -45 1682 -41 1671 -35 ct 1660 -28 1646 -24 1636 -24 ct 1619 -24 1606 -40 1606 -62 ct 1606 -62 1606 -62 1606 -63 ct 1606 -92 1625 -110 1684 -132 ct 1684 -132 1684 -132 1684 -61 ct p ef 1768 -307 m 1775 -307 1779 -308 1784 -308 ct 1800 -308 1805 -302 1805 -278 ct 1805 -278 1805 -278 1805 -40 ct 1805 -15 1803 -13 1768 -7 ct 1768 -7 1768 -7 1768 0 ct 1768 0 1768 0 1882 0 ct 1882 0 1882 0 1882 -8 ct 1882 -8 1882 -8 1872 -8 ct 1853 -8 1845 -15 1845 -32 ct 1845 -32 1845 -32 1845 -124 ct 1845 -124 1845 -124 1913 -32 ct 1913 -32 1913 -32 1915 -30 ct 1916 -28 1917 -27 1918 -25 ct 1922 -20 1923 -17 1923 -15 ct 1923 -10 1919 -7 1913 -7 ct 1913 -7 1913 -7 1904 -7 ct 1904 -7 1904 -7 1904 0 ct 1904 0 1904 0 2009 0 ct 2009 0 2009 0 2009 -8 ct 1988 -8 1973 -18 1953 -43 ct 1953 -43 1953 -43 1879 -139 ct 1879 -139 1879 -139 1893 -152 ct 1927 -185 1957 -208 1971 -212 ct 1979 -214 1985 -215 1994 -215 ct 1994 -215 1994 -215 1997 -215 ct 1997 -215 1997 -215 1997 -222 ct 1997 -222 1997 -222 1899 -222 ct 1899 -222 1899 -222 1899 -215 ct 1918 -215 1923 -213 1923 -206 ct 1923 -202 1918 -195 1912 -189 ct 1912 -189 1912 -189 1845 -129 ct 1845 -129 1845 -129 1845 -336 ct 1845 -336 1845 -336 1843 -337 ct 1825 -331 1811 -327 1783 -319 ct 1783 -319 1783 -319 1768 -315 ct 1768 -315 1768 -315 1768 -307 ct p ef 2217 -81 m 2193 -43 2172 -29 2141 -29 ct 2114 -29 2093 -43 2079 -72 ct 2070 -90 2067 -107 2066 -137 ct 2066 -137 2066 -137 2215 -137 ct 2211 -169 2206 -183 2194 -199 ct 2180 -217 2157 -227 2132 -227 ct 2108 -227 2085 -218 2067 -201 ct 2044 -181 2031 -146 2031 -106 ct 2031 -37 2066 5 2122 5 ct 2168 5 2204 -24 2224 -78 ct 2224 -78 2224 -78 2217 -81 ct p 2067 -153 m 2072 -191 2089 -209 2118 -209 ct 2148 -209 2159 -196 2166 -153 ct 2166 -153 2166 -153 2067 -153 ct p ef 2242 -192 m 2249 -194 2254 -194 2259 -194 ct 2271 -194 2276 -186 2276 -164 ct 2276 -164 2276 -164 2276 -41 ct 2276 -17 2272 -13 2241 -7 ct 2241 -7 2241 -7 2241 0 ct 2241 0 2241 0 2358 0 ct 2358 0 2358 0 2358 -8 ct 2325 -8 2316 -15 2316 -44 ct 2316 -44 2316 -44 2316 -155 ct 2316 -171 2337 -196 2350 -196 ct 2353 -196 2358 -193 2363 -188 ct 2371 -182 2376 -179 2382 -179 ct 2394 -179 2401 -187 2401 -201 ct 2401 -217 2391 -227 2375 -227 ct 2354 -227 2340 -216 2316 -181 ct 2316 -181 2316 -181 2316 -226 ct 2316 -226 2316 -226 2314 -227 ct 2288 -216 2271 -210 2242 -200 ct 2242 -200 2242 -200 2242 -192 ct p ef pom gr gr gs gs pum 4619 16250 t 121 -227 m 58 -227 14 -180 14 -112 ct 14 -45 59 5 120 5 ct 181 5 228 -47 228 -115 ct 228 -180 183 -227 121 -227 ct p 115 -213 m 155 -213 184 -166 184 -98 ct 184 -42 162 -9 126 -9 ct 107 -9 89 -21 79 -40 ct 65 -66 58 -101 58 -136 ct 58 -183 80 -213 115 -213 ct p ef 482 -25 m 482 -25 482 -25 479 -25 ct 457 -25 452 -30 452 -53 ct 452 -53 452 -53 452 -222 ct 452 -222 452 -222 375 -222 ct 375 -222 375 -222 375 -213 ct 405 -213 411 -208 411 -183 ct 411 -183 411 -183 411 -67 ct 411 -53 409 -46 402 -41 ct 389 -30 374 -24 359 -24 ct 341 -24 325 -41 325 -61 ct 325 -61 325 -61 325 -222 ct 325 -222 325 -222 254 -222 ct 254 -222 254 -222 254 -214 ct 278 -214 284 -206 284 -184 ct 284 -184 284 -184 284 -59 ct 284 -20 308 5 343 5 ct 361 5 380 -3 393 -16 ct 393 -16 393 -16 414 -38 ct 414 -38 414 -38 414 4 ct 414 4 414 4 416 5 ct 440 -5 457 -11 482 -18 ct 482 -18 482 -18 482 -25 ct p ef 618 -222 m 618 -222 618 -222 570 -222 ct 570 -222 570 -222 570 -279 ct 570 -284 569 -286 566 -286 ct 563 -281 560 -277 556 -272 ct 538 -245 517 -221 510 -219 ct 504 -216 501 -212 501 -210 ct 501 -208 502 -207 503 -206 ct 503 -206 503 -206 529 -206 ct 529 -206 529 -206 529 -58 ct 529 -16 543 5 572 5 ct 596 5 614 -7 630 -33 ct 630 -33 630 -33 624 -38 ct 614 -26 605 -21 595 -21 ct 577 -21 570 -34 570 -65 ct 570 -65 570 -65 570 -206 ct 570 -206 570 -206 618 -206 ct 618 -206 618 -206 618 -222 ct p ef 639 -195 m 644 -195 647 -195 651 -195 ct 668 -195 671 -190 671 -167 ct 671 -167 671 -167 671 65 ct 671 90 666 96 637 99 ct 637 99 637 99 637 107 ct 637 107 637 107 755 107 ct 755 107 755 107 755 98 ct 718 98 712 93 712 61 ct 712 61 712 61 712 -16 ct 729 0 741 5 761 5 ct 818 5 863 -50 863 -122 ct 863 -183 829 -227 782 -227 ct 755 -227 733 -215 712 -189 ct 712 -189 712 -189 712 -226 ct 712 -226 712 -226 709 -227 ct 683 -217 666 -210 639 -202 ct 639 -202 639 -202 639 -195 ct p 712 -165 m 712 -180 739 -197 761 -197 ct 797 -197 821 -160 821 -103 ct 821 -48 797 -11 762 -11 ct 740 -11 712 -29 712 -44 ct 712 -44 712 -44 712 -165 ct p ef 1117 -25 m 1117 -25 1117 -25 1114 -25 ct 1092 -25 1087 -30 1087 -53 ct 1087 -53 1087 -53 1087 -222 ct 1087 -222 1087 -222 1010 -222 ct 1010 -222 1010 -222 1010 -213 ct 1040 -213 1046 -208 1046 -183 ct 1046 -183 1046 -183 1046 -67 ct 1046 -53 1044 -46 1037 -41 ct 1024 -30 1009 -24 994 -24 ct 976 -24 960 -41 960 -61 ct 960 -61 960 -61 960 -222 ct 960 -222 960 -222 889 -222 ct 889 -222 889 -222 889 -214 ct 913 -214 919 -206 919 -184 ct 919 -184 919 -184 919 -59 ct 919 -20 943 5 978 5 ct 996 5 1015 -3 1028 -16 ct 1028 -16 1028 -16 1049 -38 ct 1049 -38 1049 -38 1049 4 ct 1049 4 1049 4 1051 5 ct 1075 -5 1092 -11 1117 -18 ct 1117 -18 1117 -18 1117 -25 ct p ef 1253 -222 m 1253 -222 1253 -222 1205 -222 ct 1205 -222 1205 -222 1205 -279 ct 1205 -284 1204 -286 1201 -286 ct 1198 -281 1195 -277 1191 -272 ct 1173 -245 1152 -221 1145 -219 ct 1139 -216 1136 -212 1136 -210 ct 1136 -208 1137 -207 1138 -206 ct 1138 -206 1138 -206 1164 -206 ct 1164 -206 1164 -206 1164 -58 ct 1164 -16 1178 5 1207 5 ct 1231 5 1249 -7 1265 -33 ct 1265 -33 1265 -33 1259 -38 ct 1249 -26 1240 -21 1230 -21 ct 1212 -21 1205 -34 1205 -65 ct 1205 -65 1205 -65 1205 -206 ct 1205 -206 1205 -206 1253 -206 ct 1253 -206 1253 -206 1253 -222 ct p ef pom gr gs pum 4138 16851 t 143 -334 m 107 -310 92 -297 75 -274 ct 40 -231 23 -182 23 -124 ct 23 -62 41 -13 84 37 ct 104 61 116 72 141 87 ct 141 87 141 87 147 79 ct 108 48 95 31 82 -6 ct 70 -39 65 -76 65 -126 ct 65 -178 71 -218 84 -249 ct 98 -279 112 -297 147 -326 ct 147 -326 147 -326 143 -334 ct p ef 288 -222 m 288 -222 288 -222 240 -222 ct 240 -222 240 -222 240 -279 ct 240 -284 239 -286 236 -286 ct 233 -281 230 -277 226 -272 ct 208 -245 187 -221 180 -219 ct 174 -216 171 -212 171 -210 ct 171 -208 172 -207 173 -206 ct 173 -206 173 -206 199 -206 ct 199 -206 199 -206 199 -58 ct 199 -16 213 5 242 5 ct 266 5 284 -7 300 -33 ct 300 -33 300 -33 294 -38 ct 284 -26 275 -21 265 -21 ct 247 -21 240 -34 240 -65 ct 240 -65 240 -65 240 -206 ct 240 -206 240 -206 288 -206 ct 288 -206 288 -206 288 -222 ct p ef 426 -227 m 363 -227 319 -180 319 -112 ct 319 -45 364 5 425 5 ct 486 5 533 -47 533 -115 ct 533 -180 488 -227 426 -227 ct p 420 -213 m 460 -213 489 -166 489 -98 ct 489 -42 467 -9 431 -9 ct 412 -9 394 -21 384 -40 ct 370 -66 363 -101 363 -136 ct 363 -183 385 -213 420 -213 ct p ef 827 -222 m 827 -222 827 -222 767 -222 ct 767 -222 767 -222 767 -279 ct 767 -308 776 -323 795 -323 ct 805 -323 812 -318 820 -304 ct 828 -291 834 -286 842 -286 ct 853 -286 862 -295 862 -306 ct 862 -324 841 -337 812 -337 ct 782 -337 756 -324 744 -301 ct 731 -279 727 -261 727 -222 ct 727 -222 727 -222 687 -222 ct 687 -222 687 -222 687 -206 ct 687 -206 687 -206 727 -206 ct 727 -206 727 -206 727 -51 ct 727 -14 722 -8 687 -8 ct 687 -8 687 -8 687 0 ct 687 0 687 0 813 0 ct 813 0 813 0 813 -8 ct 773 -8 768 -13 768 -51 ct 768 -51 768 -51 768 -206 ct 768 -206 768 -206 827 -206 ct 827 -206 827 -206 827 -222 ct p ef 1052 -32 m 1044 -26 1038 -23 1031 -23 ct 1020 -23 1016 -30 1016 -52 ct 1016 -52 1016 -52 1016 -148 ct 1016 -173 1014 -188 1006 -200 ct 996 -218 975 -227 946 -227 ct 901 -227 865 -203 865 -171 ct 865 -160 875 -150 886 -150 ct 898 -150 908 -160 908 -171 ct 908 -173 907 -175 907 -179 ct 906 -183 905 -187 905 -191 ct 905 -204 921 -215 940 -215 ct 964 -215 977 -201 977 -174 ct 977 -174 977 -174 977 -144 ct 902 -113 894 -109 873 -90 ct 863 -81 856 -64 856 -48 ct 856 -17 877 5 907 5 ct 928 5 948 -5 977 -31 ct 980 -5 989 5 1008 5 ct 1025 5 1035 -1 1052 -20 ct 1052 -20 1052 -20 1052 -32 ct p 977 -61 m 977 -45 975 -41 964 -35 ct 953 -28 939 -24 929 -24 ct 912 -24 899 -40 899 -62 ct 899 -62 899 -62 899 -63 ct 899 -92 918 -110 977 -132 ct 977 -132 977 -132 977 -61 ct p ef 1061 -192 m 1068 -194 1073 -194 1078 -194 ct 1090 -194 1095 -186 1095 -164 ct 1095 -164 1095 -164 1095 -41 ct 1095 -17 1091 -13 1060 -7 ct 1060 -7 1060 -7 1060 0 ct 1060 0 1060 0 1177 0 ct 1177 0 1177 0 1177 -8 ct 1144 -8 1135 -15 1135 -44 ct 1135 -44 1135 -44 1135 -155 ct 1135 -171 1156 -196 1169 -196 ct 1172 -196 1177 -193 1182 -188 ct 1190 -182 1195 -179 1201 -179 ct 1213 -179 1220 -187 1220 -201 ct 1220 -217 1210 -227 1194 -227 ct 1173 -227 1159 -216 1135 -181 ct 1135 -181 1135 -181 1135 -226 ct 1135 -226 1135 -226 1133 -227 ct 1107 -216 1090 -210 1061 -200 ct 1061 -200 1061 -200 1061 -192 ct p ef 1544 -81 m 1520 -43 1499 -29 1468 -29 ct 1441 -29 1420 -43 1406 -72 ct 1397 -90 1394 -107 1393 -137 ct 1393 -137 1393 -137 1542 -137 ct 1538 -169 1533 -183 1521 -199 ct 1507 -217 1484 -227 1459 -227 ct 1435 -227 1412 -218 1394 -201 ct 1371 -181 1358 -146 1358 -106 ct 1358 -37 1393 5 1449 5 ct 1495 5 1531 -24 1551 -78 ct 1551 -78 1551 -78 1544 -81 ct p 1394 -153 m 1399 -191 1416 -209 1445 -209 ct 1475 -209 1486 -196 1493 -153 ct 1493 -153 1493 -153 1394 -153 ct p ef 1574 -196 m 1577 -198 1581 -198 1587 -198 ct 1600 -198 1605 -191 1605 -166 ct 1605 -166 1605 -166 1605 -44 ct 1605 -15 1599 -8 1575 -8 ct 1575 -8 1575 -8 1575 0 ct 1575 0 1575 0 1677 0 ct 1677 0 1677 0 1677 -8 ct 1653 -8 1645 -14 1645 -32 ct 1645 -32 1645 -32 1645 -171 ct 1669 -194 1679 -200 1695 -200 ct 1719 -200 1731 -184 1731 -152 ct 1731 -152 1731 -152 1731 -48 ct 1731 -17 1724 -8 1700 -8 ct 1700 -8 1700 -8 1700 0 ct 1700 0 1700 0 1801 0 ct 1801 0 1801 0 1801 -7 ct 1777 -10 1771 -16 1771 -40 ct 1771 -40 1771 -40 1771 -153 ct 1771 -199 1750 -227 1714 -227 ct 1692 -227 1677 -219 1644 -187 ct 1644 -187 1644 -187 1644 -226 ct 1644 -226 1644 -226 1641 -227 ct 1617 -218 1600 -213 1574 -205 ct 1574 -205 1574 -205 1574 -196 ct p ef 1983 5 m 1983 5 1983 5 2054 -21 ct 2054 -21 2054 -21 2054 -28 ct 2045 -28 2044 -28 2043 -28 ct 2025 -28 2021 -33 2021 -56 ct 2021 -56 2021 -56 2021 -336 ct 2021 -336 2021 -336 2019 -337 ct 1996 -329 1979 -324 1948 -315 ct 1948 -315 1948 -315 1948 -308 ct 1952 -308 1954 -308 1958 -308 ct 1976 -308 1981 -303 1981 -283 ct 1981 -283 1981 -283 1981 -206 ct 1962 -222 1949 -227 1930 -227 ct 1874 -227 1829 -171 1829 -101 ct 1829 -38 1865 5 1919 5 ct 1946 5 1964 -5 1981 -28 ct 1981 -28 1981 -28 1981 4 ct 1981 4 1981 4 1983 5 ct p 1981 -50 m 1981 -47 1977 -41 1972 -35 ct 1964 -26 1952 -21 1938 -21 ct 1897 -21 1871 -60 1871 -121 ct 1871 -177 1894 -213 1931 -213 ct 1957 -213 1981 -190 1981 -164 ct 1981 -164 1981 -164 1981 -50 ct p ef 2084 87 m 2120 64 2135 51 2153 28 ct 2187 -15 2204 -64 2204 -122 ct 2204 -185 2186 -233 2143 -283 ct 2124 -307 2111 -318 2086 -334 ct 2086 -334 2086 -334 2080 -326 ct 2119 -295 2132 -277 2145 -240 ct 2157 -207 2162 -170 2162 -120 ct 2162 -69 2156 -28 2143 2 ct 2129 33 2115 51 2080 79 ct 2080 79 2080 79 2084 87 ct p ef pom gr gr gs gs pum 8742 14319 t 7 -199 m 14 -200 17 -201 23 -201 ct 51 -201 58 -188 81 -103 ct 89 -71 101 -13 101 -4 ct 101 4 98 11 91 20 ct 76 41 66 54 60 59 ct 50 70 44 74 38 74 ct 35 74 31 73 26 69 ct 18 63 13 60 7 60 ct -3 60 -12 69 -12 80 ct -12 92 -1 102 13 102 ct 45 102 110 27 163 -71 ct 197 -131 210 -167 210 -191 ct 210 -206 198 -219 183 -219 ct 172 -219 164 -211 164 -200 ct 164 -193 168 -188 178 -181 ct 187 -176 191 -171 191 -164 ct 191 -145 172 -106 130 -36 ct 130 -36 130 -36 121 -94 ct 113 -137 85 -219 78 -219 ct 78 -219 78 -219 76 -219 ct 76 -218 74 -218 72 -218 ct 67 -217 49 -214 23 -209 ct 21 -209 14 -208 7 -207 ct 7 -207 7 -207 7 -199 ct p ef pom gr gs pum 8962 14319 t 143 -334 m 107 -310 92 -297 75 -274 ct 40 -231 23 -182 23 -124 ct 23 -62 41 -13 84 37 ct 104 61 116 72 141 87 ct 141 87 141 87 147 79 ct 108 48 95 31 82 -6 ct 70 -39 65 -76 65 -126 ct 65 -178 71 -218 84 -249 ct 98 -279 112 -297 147 -326 ct 147 -326 147 -326 143 -334 ct p ef pom gr gs pum 9127 14319 t 227 -58 m 227 -58 227 -58 217 -45 ct 203 -27 194 -19 187 -19 ct 183 -19 179 -23 179 -27 ct 179 -31 179 -31 186 -58 ct 186 -58 186 -58 214 -160 ct 216 -170 218 -181 218 -188 ct 218 -206 205 -218 186 -218 ct 154 -218 123 -189 72 -110 ct 72 -110 72 -110 105 -217 ct 105 -217 105 -217 104 -218 ct 77 -213 67 -211 24 -203 ct 24 -203 24 -203 24 -195 ct 49 -195 55 -192 55 -182 ct 55 -179 55 -176 54 -173 ct 54 -173 54 -173 7 0 ct 7 0 7 0 44 0 ct 67 -78 72 -89 93 -123 ct 123 -168 148 -193 166 -193 ct 174 -193 178 -188 178 -179 ct 178 -173 175 -156 171 -141 ct 171 -141 171 -141 150 -60 ct 143 -35 142 -28 142 -23 ct 142 -4 149 4 165 4 ct 187 4 200 -6 234 -52 ct 234 -52 234 -52 227 -58 ct p ef pom gr gs pum 9377 14319 t 18 87 m 54 64 69 51 87 28 ct 121 -15 138 -64 138 -122 ct 138 -185 120 -233 77 -283 ct 58 -307 45 -318 20 -334 ct 20 -334 20 -334 14 -326 ct 53 -295 66 -277 79 -240 ct 91 -207 96 -170 96 -120 ct 96 -69 90 -28 77 2 ct 63 33 49 51 14 79 ct 14 79 14 79 18 87 ct p ef pom gr gr gs gs pum 8742 14186 t 45 -147 m 114 -290 l 183 -147 l 216 -147 l 128 -327 l 99 -327 l 12 -147 l 45 -147 l p ef pom gr gr gs gs pum 14351 14292 t 7 -199 m 14 -200 17 -201 23 -201 ct 51 -201 58 -188 81 -103 ct 89 -71 101 -13 101 -4 ct 101 4 98 11 91 20 ct 76 41 66 54 60 59 ct 50 70 44 74 38 74 ct 35 74 31 73 26 69 ct 18 63 13 60 7 60 ct -3 60 -12 69 -12 80 ct -12 92 -1 102 13 102 ct 45 102 110 27 163 -71 ct 197 -131 210 -167 210 -191 ct 210 -206 198 -219 183 -219 ct 172 -219 164 -211 164 -200 ct 164 -193 168 -188 178 -181 ct 187 -176 191 -171 191 -164 ct 191 -145 172 -106 130 -36 ct 130 -36 130 -36 121 -94 ct 113 -137 85 -219 78 -219 ct 78 -219 78 -219 76 -219 ct 76 -218 74 -218 72 -218 ct 67 -217 49 -214 23 -209 ct 21 -209 14 -208 7 -207 ct 7 -207 7 -207 7 -199 ct p ef pom gr gs pum 14571 14292 t 143 -334 m 107 -310 92 -297 75 -274 ct 40 -231 23 -182 23 -124 ct 23 -62 41 -13 84 37 ct 104 61 116 72 141 87 ct 141 87 141 87 147 79 ct 108 48 95 31 82 -6 ct 70 -39 65 -76 65 -126 ct 65 -178 71 -218 84 -249 ct 98 -279 112 -297 147 -326 ct 147 -326 147 -326 143 -334 ct p ef pom gr gs pum 14736 14292 t 227 -58 m 227 -58 227 -58 217 -45 ct 203 -27 194 -19 187 -19 ct 183 -19 179 -23 179 -27 ct 179 -31 179 -31 186 -58 ct 186 -58 186 -58 214 -160 ct 216 -170 218 -181 218 -188 ct 218 -206 205 -218 186 -218 ct 154 -218 123 -189 72 -110 ct 72 -110 72 -110 105 -217 ct 105 -217 105 -217 104 -218 ct 77 -213 67 -211 24 -203 ct 24 -203 24 -203 24 -195 ct 49 -195 55 -192 55 -182 ct 55 -179 55 -176 54 -173 ct 54 -173 54 -173 7 0 ct 7 0 7 0 44 0 ct 67 -78 72 -89 93 -123 ct 123 -168 148 -193 166 -193 ct 174 -193 178 -188 178 -179 ct 178 -173 175 -156 171 -141 ct 171 -141 171 -141 150 -60 ct 143 -35 142 -28 142 -23 ct 142 -4 149 4 165 4 ct 187 4 200 -6 234 -52 ct 234 -52 234 -52 227 -58 ct p ef pom gr gs pum 14986 14292 t 18 87 m 54 64 69 51 87 28 ct 121 -15 138 -64 138 -122 ct 138 -185 120 -233 77 -283 ct 58 -307 45 -318 20 -334 ct 20 -334 20 -334 14 -326 ct 53 -295 66 -277 79 -240 ct 91 -207 96 -170 96 -120 ct 96 -69 90 -28 77 2 ct 63 33 49 51 14 79 ct 14 79 14 79 18 87 ct p ef pom gr gr tm setmatrix 0 0 t 1 1 s 0 8286 t pom count op_count sub {pop} repeat countdictstack dict_count sub {end} repeat b4_inc_state restore %%PageTrailer %%Trailer %%EOF mumble-1.3.4/3rdparty/speex-src/doc/components.odg0000664000175000017500000003025614010707304021750 0ustar builderbuilderPK"8.++mimetypeapplication/vnd.oasis.opendocument.graphicsPK"8 content.xml\ێ}WBdu-c܍C0 7@[l%Qv{~"|Ixх%K̸вU")GDsLҥ&4 !NWKl߽ۛ#QIIPZI 14_ҥ&(_d(*B%)yG fU@OXaے[̪tHv0e+FDI SӇ.lavu&L)Jk/XpbM0fśՏ*X5(g,1Uʴq5ڻW=0kHG`nw'TeX{;7?B+m (FwSrZU. P׶,ה (Q=88'Ih@Aā{lSy[?> ( 3f6p0mqZѮySNӭpSiܬ pS.b$7OM~/0zI |Hrn42B/+ 5*r)OŐBP-E2hQQϚ[fM,/Ht }@u`89SkB'Malv\נaKpUu~cEX#Z8gY$8רU <ɸۣߓC(FQX)ee/ci45;udp {7GFB##K{?"w}yr/To<1dFPC^,:& h{rB1#οBf+xqߖ5/G>q0x ]JUDچ?Vd"y}bw2튭h*CQ\MBU|v5U[{W]|!BJ (9tu?SCQ*Q$d RNo>Hbxd1=rΆW{FWw6{Mφs·ϕ!^<뜧u65Q+el͖$/;'ry%l5e620gi8-ukن8DĕF\Y,wFr 0,cL0CJczZKJpqXpǯ)䚸4FZFWx47ff>JgJj}  KceeoPGB$A݉1@Xfi6Z.cuR0Wb*wF>h\})ުFk>-߄;o{$ ݈ hȿ/owoAoD?Rf9W؉?aY0xx{φLI(^O8[N|~f'_q*OYI|0o~DKIS]fpz`bqd:mW@R~"TTSRI^ddxP6BTڪ UϿ(8ǠhX8a^\faXa]{Ca5fBcڋӅƬ hYИ^þaO-'r  {Aģ܅iyVsVTJ^Jt~6Ƕ 7*(LsJ X ,uY3әNO,ʄƢ,yN0*"m1 .l|7_T֜U/kQ-L~BH:s_X3҇8ˆ21ϭ;1Q(qpFE|u61'3~oi`ؗ;$,̏9r<븜3n^}\fט4lГߙSX !-6(Vx2d'Y.ܯWOL?-'}HNlh:_n,{Xtf9˻P Qf'Û 5Q5gLZ! i s] Kx uGڒz$cɣIotd.b jk[Y60klfz$N7}>uPK0KPK"8 styles.xml\_6O!hq}gڍSh9M-Q6J(jΗ}$7$%%YNB Gq8h>9a'm4dIKw?:71 "baT8Q[ \O $_(B RZ 5 UW¦bm𑕰q,eSS=fCs Y!A$7Bd nՄsWqkZ.+8URQb`O|M@C퓲Ii0 hV3swe\{ӈ[wngJ*WPLM޸oy>x2t,)ۀ*$즖6cRA/venySW6[Nx+"ֈ 4]p ^lG ^ZF*~U]n_YR,לmA./mG85+"yFًX ~9ED;Gt-ڛ̼01xAS4%@t*Y7wSYo?E~ъ8b&D/&qpit,r Q/M9|eYnү#o;p`Q2/i*A˿{G Y[wThygS CTHDFDs ˍ~|Pi&t]5b!+Rn1~,ޢ4ﱫwɱyo!!崗W4,mbpstviu8R+(l,*U3\}b5sHòyq.n*?vii^@v;۫E;;_λC~C6i-w绩6dkK6X/ӓtڹ拿vJۺc[wl>ƶۺc[qۺc[iu} FVYUt :xrf'k1T׫c)ħt Kwy_FC'p:{\5B\݈]97PՕ҉<@N/(8Sq.S܀?g*<CST"Z:* :YlOقYVlNWd5N^Ɨ4ŤXыy]zM{WC[~ۤ[:\C=A}qىYѾ+{QgZe }XH?B';c4nMpBu+l, n`F"]h4NTه-o173>ȗBDZ]Q[6Aכ}foNQ6IAZ\ ZXymxBƜ!Nֹ'LsL}䍖_hƫ>TpZgDžuȢ&'c1cvq_~wړT/2]=6GHG( yyjJf mK."v~fCS7*ֿ5x)sZKZv%ғqgg.,j jҎ8-kcZ3c ):{>4,5hm\KWHD.ʚ!w5)O ۅŕХԄ#2فLӥ1D=eT܅E^ss"9Ϧ?u{ Ao1FK $zDtoɽLw#¶$K3t7X{K5l>'c#=|=JXߧg&ęuL`afEAKޘN}Ӎp?A6XVYIf|}C2F[wiN[Nbyl,N|[[ұwV!vcpj;g+ I8M/Jys]9r>IA,%(cokiQ4MQ/5|)SvH{=HbT t@/ٮ2{2.H*6Lj@+zBf'[-zS?uh|umvN@nZ?c]p_b6[=e䘀)o{gG%اD;==j~=L~215=Loz0ngm[MLdJ* (_]6դ+S+|Vխ5jr]{38컂|rO8uk34R_i91_<:{PkUG~iVf%G kh`ze{6V d8)iT7Ag}?n]SBMW+LbeR#?2Swj-:ˑx~`c3owlJ/4(O$ )!$$97 YSi:R;VBXgL@W#k_R]ׅ~Щ%l%/e-oգaFVc'+7OҴaUу4 倠ԧ`.ڐx.(fi,nٳ$Fzz2`/,9)fI9 02W;{YCKo& Z5 SJ#\/xC.oɠ?֖yY׳.6ux*0/[ K&.Oy~$؞/urH?k,iU-Z%Wj T4/6C88q;\*(/ tTa&w-j2EQxҷ2"It؋,{N\ޑpqij\4Ob4kqȤ6>z&MKL8 sS)r+ęc9 }%⳻``i1W.+B8_7K= q2D1}[LfQ5\{ȩ9pΘ5\{QߕX#{ "27Tklpp'[ݱ *E'pkBoQ?lp_o`_oWPdNjUe@ҿ{ t56OSOψ8GPB`he~ Ӱ #j!ܒQ~ʸti`,,ꦞ6.K{+hSrM}JeI{ ?&mZѱyc7l{.n4шlq n#F+OO*Fl3'4SEKb( A2[Xv!,Fow@"ڒQPs &D#9>8< 5SFx54ҡih bv;vDz ߊWTk!W6\Ǎr%)EXlKr傱jy,K QC]#D~SA!hyN0܃k?(PjœAtz~Ԗ8m&z#$ {apW4Qiλ3Y"Zo: uD:}腚7FW~kyHV?e*"?e)$;J:[$GPI\*ZWʝZ_($},ALZF~#_ˋyj=1Ͽ{>01yBv= rLL;9pog>{UBW- FJu2˝tdQGW; E*=U|T>zT:ͯP+s/)~<&A{SZ ʇnZ:tc̴o).A眔H &ܶw}pұrŘnk^ޭ/ݑ ߟ &Hmq&nqHIzu:Ɩǩ#cVIE?3}_sU<*^s!Ej>jֻ[]0aTfl;rrPI[VS6їQ+Z18\)w1863u \|]{]VVr|+ 9Pޠ%OA/Jf(Gg~g91i)nUykݪ<ʯ@+է3&Q9t#yZ'aX}3[2^!9ea {_[dezSeo3!7ݟ;sӮ6]v0gd3}̘,5|@R|gR^< w"N+F TQX4U!,}u:-D:<z$U5bKΏ,ZWo;ozE}"gKәW)S2,1_gcĪK\8F=뾈YE ?BNUkBs`g#[خtHGxo S9V*RDzͨyYz%9+,伢'7y Rv%6^trNk3Rrj 1/W`YYRV;hĊ=?z*aPK6zPK"8'Configurations2/accelerator/current.xmlPKPK"8Configurations2/progressbar/PK"8Configurations2/floater/PK"8Configurations2/popupmenu/PK"8Configurations2/menubar/PK"8Configurations2/toolbar/PK"8Configurations2/images/Bitmaps/PK"8Configurations2/statusbar/PK"8 settings.xmlZ[s6~x>C.'L !aIh =}jdGCI ؉#NyŖoo]-9'"oyúw(՛EhaX*Q~^eeZQeW"Fea 3ÿrw{۵K癢5 2>Uo>QXDoTe:coR-cr嵏]a`kGPNN@g\'gůE$Q3\wVGǎXpKLmag_ 2^{J*=|@' KIE! 3ʥ;}@9RLw P=:g>DnD^2 KkBWr)l+v}\1QN -S 1ty:. e.|D§ -Xzm疝,C"H3E߇ŎE"Vx\UJ9G BWLCC :xaq *5)AwN qupΈ=.}lvۑtYCߢq>pM`Wn7yFbi!w 7}?o^ ;B5rԕM; m CKv,/=ѣ/~\qm19Gsn^gTA"U'A$쿱J+:6p?(S9#eV%NXu#%E#3%5sk[6֚vDέ9CKN)M;RD:+Sb̎ސsHJ0J\}^/ n\ŝdfe RUu$5 CHkiao]4S1eNcD~3Qu:E nD8du~x[ ,C]gQEkI%Qm*D_O]d;XGEMw6f%ʜSf#PvkY<ՇwP80psI߼Y?ġOFcbF*7 r"PK}JX!PK"8META-INF/manifest.xmlj0 }{m6t:Jj\ڷ_R֟m=! -y>XS1Փ()j7sQjt9(}.Fjv`jVZEz4iU!:޵U*>BiEJ1e5B r>MyǣsLK|4Hc-2LއmvnhCa\?7|޻wS<z>JbvB}D-dtc}Haܔ? {oIi2# 8My<%76gtn+cçxKO\}PK2BNPK"8.++mimetypePK"80K Qcontent.xmlPK"8hr1H z styles.xmlPK"8 $meta.xmlPK"86z Thumbnails/thumbnail.pngPK"8'H$Configurations2/accelerator/current.xmlPK"8$Configurations2/progressbar/PK"8$Configurations2/floater/PK"8%Configurations2/popupmenu/PK"8G%Configurations2/menubar/PK"8}%Configurations2/toolbar/PK"8%Configurations2/images/Bitmaps/PK"8%Configurations2/statusbar/PK"8}JX! (&settings.xmlPK"82BN%+META-INF/manifest.xmlPK,mumble-1.3.4/3rdparty/speex-src/doc/draft-herlein-speex-rtp-profile-03.xml0000664000175000017500000006525014010707304026143 0ustar builderbuilder draft-herlein-speex-rtp-profile-03

    gherlein@herlein.com 2034 Filbert Street San Francisco California 94123 United States
    simon.morlat@linphone.org 35, av de Vizille App 42 Grenoble 38000 France
    jean-marc.valin@hermes.usherb.ca Department of Electrical and Computer Engineering University of Sherbrooke 2500 blvd Universite Sherbrooke Quebec J1K 2R1 Canada
    roger@freebsd.org 49 Nettleton Road Cheltenham Gloucestershire GL51 6NR England
    phil@plus24.com England
    General AVT Working Group I-D Internet-Draft Speex RTP Speex is an open-source voice codec suitable for use in Voice over IP (VoIP) type applications. This document describes the payload format for Speex generated bit streams within an RTP packet. Also included here are the necessary details for the use of Speex with the Session Description Protocol (SDP) and a preliminary method of using Speex within H.323 applications.
    The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119 .
    Speex is based on the CELP encoding technique with support for either narrowband (nominal 8kHz), wideband (nominal 16kHz) or ultra-wideband (nominal 32kHz), and (non-optimal) rates up to 48 kHz sampling also available. The main characteristics can be summarized as follows: Free software/open-source Integration of wideband and narrowband in the same bit-stream Wide range of bit-rates available Dynamic bit-rate switching and variable bit-rate (VBR) Voice Activity Detection (VAD, integrated with VBR) Variable complexity
    For RTP based transportation of Speex encoded audio the standard RTP header [2] is followed by one or more payload data blocks. An optional padding terminator may also be used.
    The RTP header begins with an octet of fields (V, P, X, and CC) to support specialized RTP uses (see and for details). For Speex the following values are used. Version (V): 2 bits This field identifies the version of RTP. The version used by this specification is two . Padding (P): 1 bit If the padding bit is set, the packet contains one or more additional padding octets at the end which are not part of the payload. P is set if the total packet size is less than the MTU. Extension (X): 1 bit If the extension, X, bit is set, the fixed header MUST be followed by exactly one header extension, with a format defined in Section 5.3.1. of . CSRC count (CC): 4 bits The CSRC count contains the number of CSRC identifiers. Marker (M): 1 bit The M bit indicates if the packet contains comfort noise. This field is used in conjunction with the cng SDP attribute and is detailed further in section 5 below. In normal usage this bit is set if the packet contains comfort noise. Payload Type (PT): 7 bits An RTP profile for a class of applications is expected to assign a payload type for this format, or a dynamically allocated payload type SHOULD be chosen which designates the payload as Speex. Sequence number: 16 bits The sequence number increments by one for each RTP data packet sent, and may be used by the receiver to detect packet loss and to restore packet sequence. This field is detailed further in . Timestamp: 32 bits A timestamp representing the sampling time of the first sample of the first Speex packet in the RTP packet. The clock frequency MUST be set to the sample rate of the encoded audio data. Speex uses 20 msec frames and a variable sampling rate clock. The RTP timestamp MUST be in units of 1/X of a second where X is the sample rate used. Speex uses a nominal 8kHz sampling rate for narrowband use, a nominal 16kHz sampling rate for wideband use, and a nominal 32kHz sampling rate for ultra-wideband use. SSRC/CSRC identifiers: These two fields, 32 bits each with one SSRC field and a maximum of 16 CSRC fields, are as defined in .
    For the purposes of packetizing the bit stream in RTP, it is only necessary to consider the sequence of bits as output by the Speex encoder , and present the same sequence to the decoder. The payload format described here maintains this sequence. A typical Speex frame, encoded at the maximum bitrate, is approx. 110 octets and the total number of Speex frames SHOULD be kept less than the path MTU to prevent fragmentation. Speex frames MUST NOT be fragmented across multiple RTP packets, An RTP packet MAY contain Speex frames of the same bit rate or of varying bit rates, since the bit-rate for a frame is conveyed in band with the signal. The encoding and decoding algorithm can change the bit rate at any 20 msec frame boundary, with the bit rate change notification provided in-band with the bit stream. Each frame contains both "mode" (narrowband, wideband or ultra-wideband) and "sub-mode" (bit-rate) information in the bit stream. No out-of-band notification is required for the decoder to process changes in the bit rate sent by the encoder. It is RECOMMENDED that values of 8000, 16000 and 32000 be used for normal internet telephony applications, though the sample rate is supported at rates as low as 6000 Hz and as high as 48 kHz. The RTP payload MUST be padded to provide an integer number of octets as the payload length. These padding bits are LSB aligned in network octet order and consist of a 0 followed by all ones (until the end of the octet). This padding is only required for the last frame in the packet, and only to ensure the packet contents ends on an octet boundary.
    In the example below we have a single Speex frame with 5 bits of padding to ensure the packet size falls on an octet boundary.
    Below is an example of two Speex frames contained within one RTP packet. The Speex frame length in this example fall on an octet boundary so there is no padding. Speex codecs are able to detect the the bitrate from the payload and are responsible for detecting the 20 msec boundaries between each frame.
    Full definition of the MIME type for Speex will be part of the Ogg Vorbis MIME type definition application . MIME media type name: audio MIME subtype: speex Optional parameters: Required parameters: to be included in the Ogg MIME specification. Encoding considerations: Security Considerations: See Section 6 of RFC 3047. Interoperability considerations: none Published specification: Applications which use this media type: Additional information: none Person & email address to contact for further information: Greg Herlein <gherlein@herlein.com> Jean-Marc Valin <jean-marc.valin@hermes.usherb.ca> Intended usage: COMMON Author/Change controller: Author: Greg Herlein <gherlein@herlein.com> Change controller: Greg Herlein <gherlein@herlein.com> Change controller: IETF AVT Working Group This transport type signifies that the content is to be interpreted according to this document if the contents are transmitted over RTP. Should this transport type appear over a lossless streaming protocol such as TCP, the content encapsulation should be interpreted as an Ogg Stream in accordance with , with the exception that the content of the Ogg Stream may be assumed to be Speex audio and Speex audio only.
    When conveying information by SDP , the encoding name MUST be set to "speex". An example of the media representation in SDP for offering a single channel of Speex at 8000 samples per second might be: m=audio 8088 RTP/AVP 97 a=rtpmap:97 speex/8000 Note that the RTP payload type code of 97 is defined in this media definition to be 'mapped' to the speex codec at an 8kHz sampling frequency using the 'a=rtpmap' line. Any number from 96 to 127 could have been chosen (the allowed range for dynamic types). The value of the sampling frequency is typically 8000 for narrow band operation, 16000 for wide band operation, and 32000 for ultra-wide band operation. If for some reason the offerer has bandwidth limitations, the client may use the "b=" header, as explained in SDP . The following example illustrates the case where the offerer cannot receive more than 10 kbit/s. m=audio 8088 RTP/AVP 97 b=AS:10 a=rtmap:97 speex/8000 In this case, if the remote part agrees, it should configure its Speex encoder so that it does not use modes that produce more than 10 kbit/s. Note that the "b=" constraint also applies on all payload types that may be proposed in the media line ("m="). An other way to make recommendations to the remote Speex encoder is to use its specific parameters via the a=fmtp: directive. The following parameters are defined for use in this way: ptime: duration of each packet in milliseconds. sr: actual sample rate in Hz. ebw: encoding bandwidth - either 'narrow' or 'wide' or 'ultra' (corresponds to nominal 8000, 16000, and 32000 Hz sampling rates). vbr: variable bit rate - either 'on' 'off' or 'vad' (defaults to off). If on, variable bit rate is enabled. If off, disabled. If set to 'vad' then constant bit rate is used but silence will be encoded with special short frames to indicate a lack of voice for that period. cng: comfort noise generation - either 'on' or 'off'. If off then silence frames will be silent; if 'on' then those frames will be filled with comfort noise. mode: Speex encoding mode. Can be {1,2,3,4,5,6,any} defaults to 3 in narrowband, 6 in wide and ultra-wide. penh: use of perceptual enhancement. 1 indicates to the decoder that perceptual enhancement is recommended, 0 indicates that it is not. Defaults to on (1). Examples: m=audio 8008 RTP/AVP 97 a=rtpmap:97 speex/8000 a=fmtp:97 mode=4 This examples illustrate an offerer that wishes to receive a Speex stream at 8000Hz, but only using speex mode 3. The offerer may suggest to the remote decoder to activate its perceptual enhancement filter like this: m=audio 8088 RTP/AVP 97 a=rtmap:97 speex/8000 a=fmtp:97 penh=1 Several Speex specific parameters can be given in a single a=fmtp line provided that they are separated by a semi-colon: a=fmtp:97 mode=any;penh=1 The offerer may indicate that it wishes to send variable bit rate frames with comfort noise: m=audio 8088 RTP/AVP 97 a=rtmap:97 speex/8000 a=fmtp:97 vbr=on;cng=on The "ptime" attribute is used to denote the packetization interval (ie, how many milliseconds of audio is encoded in a single RTP packet). Since Speex uses 20 msec frames, ptime values of multiples of 20 denote multiple Speex frames per packet. Values of ptime which are not multiples of 20 MUST be ignored and clients MUST use the default value of 20 instead. In the example below the ptime value is set to 40, indicating that there are 2 frames in each packet. m=audio 8008 RTP/AVP 97 a=rtpmap:97 speex/8000 a=ptime:40 Note that the ptime parameter applies to all payloads listed in the media line and is not used as part of an a=fmtp directive. Values of ptime not multiple of 20 msec are meaningless, so the receiver of such ptime values MUST ignore them. If during the life of an RTP session the ptime value changes, when there are multiple Speex frames for example, the SDP value must also reflect the new value. Care must be taken when setting the value of ptime so that the RTP packet size does not exceed the path MTU.
    Application is underway to make Speex a standard ITU codec. However, until that is finalized, Speex MAY be used in H.323 by using a non-standard codec block definition in the H.245 codec capability negotiations.
    For Speex use in H.245 based systems, the fields in the NonStandardMessage should be: t35CountryCode = Hex: B5 t35Extension = Hex: 00 manufacturerCode = Hex: 0026 [Length of the Binary Sequence (8 bit number)] [Binary Sequence consisting of an ASCII string, no NULL terminator] The binary sequence is an ascii string merely for ease of use. The string is not null terminated. The format of this string is speex [optional variables] The optional variables are identical to those used for the SDP a=fmtp strings discussed in section 5 above. The string is built to be all on one line, each key-value pair separated by a semi-colon. The optional variables MAY be omitted, which causes the default values to be assumed. They are: ebw=narrow;mode=3;vbr=off;cng=off;ptime=20;sr=8000;penh=no; The fifth octet of the block is the length of the binary sequence. NOTE: this method can result in the advertising of a large number of Speex 'codecs' based on the number of variables possible. For most VoIP applications, use of the default binary sequence of 'speex' is RECOMMENDED to be used in addition to all other options. This maximizes the chances that two H.323 based applications that support Speex can find a mutual codec.
    Dynamic payload type codes MUST be negotiated 'out-of-band' for the assignment of a dynamic payload type from the range of 96-127. H.323 applications MUST use the H.245 H2250LogicalChannelParameters encoding to accomplish this.
    RTP packets using the payload format defined in this specification are subject to the security considerations discussed in the RTP specification , and any appropriate RTP profile. This implies that confidentiality of the media streams is achieved by encryption. Because the data compression used with this payload format is applied end-to-end, encryption may be performed after compression so there is no conflict between the two operations. A potential denial-of-service threat exists for data encodings using compression techniques that have non-uniform receiver-end computational load. The attacker can inject pathological datagrams into the stream which are complex to decode and cause the receiver to be overloaded. However, this encoding does not exhibit any significant non-uniformity. As with any IP-based protocol, in some circumstances a receiver may be overloaded simply by the receipt of too many packets, either desired or undesired. Network-layer authentication may be used to discard packets from undesired sources, but the processing cost of the authentication itself may be too high.
    The authors would like to thank Equivalence Pty Ltd of Australia for their assistance in attempting to standardize the use of Speex in H.323 applications, and for implementing Speex in their open source OpenH323 stack. The authors would also like to thank Brian C. Wiles <brian@streamcomm.com> of StreamComm for his assistance in developing the proposed standard for Speex use in H.323 applications. The authors would also like to thank the following members of the Speex and AVT communities for their input: Ross Finlayson, Federico Montesino Pouzols, Henning Schulzrinne, Magnus Westerlund.
    Key words for use in RFCs to Indicate Requirement Levels RTP: A Transport Protocol for real-time applications Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies SDP: Session Description Protocol Packet-based Multimedia Communications Systems Control of communications between Visual Telephone Systems and Terminal Equipment RTP Profile for Audio and Video Conferences with Minimal Control. The application/ogg Media Type Speexenc/speexdec, reference command-line encoder/decoder CELP, U.S. Federal Standard 1016. mumble-1.3.4/3rdparty/speex-src/doc/rtp.txt0000664000175000017500000000665514010707304020444 0ustar builderbuilderThe Speex RTP payload is defined as a header, followed by any number of requests to the remote encoder and all encoded speech frames. +--------+----------+----------------+ | Header | Requests | Speech data... | +--------+----------+----------------+ The header contains only the number of frames sent encoded in 6 bits 0 1 2 3 4 5 +-+-+-+-+-+-+ | NB frames | +-+-+-+-+-+-+ There can be any number of requests of the form 0 1 2 3 4 5 6 7 0 1 +-+-+-+-+-+-+-+-+-+-+ |R| ReqID | ReqVal | +-+-+-+-+-+-+-+-+-+-+ where R is 1 when a request is following and 0 when there is no more request. Each request (if R=1) is composed of a 4-bit request ID (ReqID) and a 5-bit value (ReqVal) Possible values for ReqID are: 0: REQ_PERSIST ReqVal=1 for persistent requests/mode selection, 0 otherwise 1: PERSIST_ACK Acknowledge a REQ_PERSIST from the other end, ReqVal equals the value received 2: MODE Choose the encoder mode directly 3: QUALITY Choose the encoder quality 4: VBR Set VBR on (ReqVal=1) or off (ReqVal=2) 5: VBR_QUALITY Set the encoder quality for VBR mode 6: LOW_MODE Set the encoder mode for low-band (wideband only) 7: HIGH_MODE Set the encoder mode for high-band (wideband only) All requests should be considered at the receiver as a suggestion and compliance is not mandatory. The PERSIST_ACK should be sent upon receiving a REQ_PERSIST request to indicate that the request has been received. The speech data part contains speech frames one after the other. The size of the encoded frames can be found since the mode is directly encoded into each frame. For example, a frame where we request VBR to be on with quality 8 and we transmit two frames encoded at 8.35 kbps (167 bits/frame) will be: 0 1 2 3 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | NB=2 |1|ReqID=2| ReqVal=0|1|ReqID=3|ReqVal=8 |0| frame 1 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | frame 1 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | frame 1 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | frame 1 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | frame 1 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | frame 1 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |end| frame 2 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | frame 2 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | frame 2 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | frame 2 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | frame 2 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | end frame 2 |P|P|P|P|P|P| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ mumble-1.3.4/3rdparty/speex-src/doc/echo_path.odg0000664000175000017500000007062614010707304021522 0ustar builderbuilderPKd{6.++mimetypeapplication/vnd.oasis.opendocument.graphicsPKd{6VersionList.xmlN0E|5{DZbEUX}dO%?"8m,s޽#AoZ t46<tf;ZB*diRf|NČfc(3Xg x/ Ѷ|C]XQԠPx9,~q)?\SI b}]UKGoe*-G|#OO?RI-R'PKPKd{6ϣ[[-Pictures/10000000000000200000002000309F1C.pngPNG  IHDR DPLTE3f333f3333f3ffffff3f̙3f3f333f333333333f33333333f33f3ff3f3f3f3333f33̙33333f3333333f3333f3ffffff3f33ff3f3f3f3fff3ffffffffffff3ffff̙fff3fffffff3ffffff3f333f3333f3ffffff3f̙̙3̙f̙̙̙̙3f3f̙333f3̙333f3fff̙fff3f̙̙3f̙3f̙3f333f3333f3ffffff3f̙3f3fOIDATxc'F*U0RU<4IENDB`PKd{6 content.xml]nߧNۅd]}I'3b]Š3 #6w$QKKg߯OR^t!-ɒl9I$1ϡD~9!~ۙ3.Pj^n0U]Bj β8 AMܤ `XԺoؽxIՙX;OiTW ߙ)7+WQ& v1GѦk36 UɠeM`z;KZyUxD o$_>]jm[i|b5LѰ81]{tL4|I. mw39FyT57'#/>2|L"7g}8/#{9r.T 63)P$4ŸMHF};,/P)Y]$tLg_sq'(][2اqk¼1\F PXVsiYgF[O]^gC ^(w1xtиPFc"4Mc5srY8]AtIa9Xus|z;?5{9jD\QRBdT|#bF1BO2~W%tRIgs6?R6^0"BjEv uw~F]]FIQ=}DPBRyY^~iX2iTqӍa)?UbQ#H>z);BȧBz[o6 { nOKhﻲjqI"'5$%`㬲xSݓ2`)wu!=oF)۵#P* d6Y}+;(?/7P%<ȹCaǚ:Tq}@tCapbDsSŮ0 KNaj S0Tæv=1S bæ6Ű)}vTRv-{Z\ $p:yuEښn=70"-meY4WWD [sl{ +"LawG&N g蓜zl"ēC{_~-()KDv]i7&L&ojq?'Y T~k厗m[4G%.}ǬϫvJX U>.ç\Z(&-1ϪVt7_Ѓa:0?wP'6(s89gavr,6kSkgZF"V%} ~L0 4j @&\톒ޓ':E$L7Э}f Yv=8j,yi9eHw ;>*,v +k}qn9onwWJI>LS:A#•RmCC ؞eLZzEzO XQ :jrkd(pѦwC箂s;;V*k_T ,́/~zlB!Be.@¤gV{dzػRZ_)ja)mc ĭf )q)\6>FwhGeZ:cmE<ޠ>z}ya?VYWೀR[]9(fR2q (Vj狆ͥ}_>ɜY9~>1" ٮ b;1:#\D=L'=*%4{RL.,E !k4 |#"z9!djDh1B֋g9>/OFC~~z="B/Oh9_y\p}p5.|M?; oϷ'%tMh~r_:`OQ!?p O9=`XZynɤPJ'r3r;9 ಙy-r }yG_)Y&dzDOՑNqX$k]n&T2WٛpȕQAE='E7ՓCcmsDͱvvn-u<= O:Wc%}Qlm/O+%;Aq⭟:zzT Ee/2GYّ=ZFkEjEq":m޷зF_{u_{} Wk<| D@j69hGP}s HsqS]ۓ<3' 8AѫMA8 6hhy_͉`>-r9BS =lBVmqHJ[XqK{ʹ*riqq֖ AF=dhe~fhKm%ljȈT~}'7KRz#Lٿnb&O98)TR YZa[XZ `'9Nkȗ;gɺo1}/+yӪ5Jr;{Y("*;WqR)GgYMKmEW 1eCGOdSh{&FT1X?"+n3h5RaT8Yl'Czo7tQWt:7Y̩nF Β{ǜf1-T(Ȃzr*W+ #iwZXdksm;# fƩ)W)焎4%LaF/SB~^ L} M~Ed2eU)S9 gP8B+0$_),Mbg笰p:IdV-4"i'fڳDlkeuDcǶ1v8ߎsV凎9 ymmC1|=l`|Y8nwBdkօR SQI#mE0@Z0_c8.Picp;:Xk" W)V1~lN4Xzgzk-mk$~JTg4\iϙd%;=]-E\:S^oSPKJRobPKd{6 styles.xml\_o6O!p&OطzE[Eѽ}.hؕD_' ?-9ٸR sfęg1wܵ~%ұs!oP|۔7vnysW6GٷI* ({HA}CSxdl4kj;}wu}r#H9S?TcޯomMX'dt9\e]f lK8D_=W@VIL@s!O!g"Œt23&2M45P-k]pj.x$n_ ´=^њ%Z2+V1j*/cA׷,%d,̿[|kgZTreUUz1(ܨ"h"gwD)0|k[n`Yg]yzWØXx7+Rg#V]'ACY3sY+G'`gt9E~ĀOd Vm) a:ݨkU&iV5)f5a $Yh׼9D9D%$&!ENpQYIĮ2SlܺcqV8 qN#LF‘效bCz *kg`+ @6aG- )-[GM^% )Jd͵F5'9/KWeaSY?u;FhgC3 c w#gn{"2 ;sț%$ L ̤u>}v!dEJZU@mjSZ56UՄ~-q3M(d2d`b װj Kr P  üY0""wFE:Vyi"pFsZpv$=xVQaqu ƽ-kM0xlN".VqR᭏еDAMlP41E.1y%zI7Rq'@D;2I4UW5k.]>%2V-'UCi2HJM ^nb(e<{1X? TM=Vk$R50ٲ֣~#>,urֿ֙DG-gkn Ї`Q D<&zS& {֊Go4[&!.so{j@ͲXyze_DiG+oWt|:ƞ*YV'|.>i~[G哴\h?Tn'[[Yk׳n0JIv Ԗw /f6;O^ҙwjNMҩIz1MMҩI:5I&"45I&e5I]FSBkM_¦{2n؆ amnl]g9:^{Su._u ..,MNuTWOu 4S]=S]=՗TWֱtXYo5 \Aj=Ei\iLIWq^ y0gjE/RW}+ B6:g/y8&!ç"RRkīٙ:2Th/;u.AR_pW$ iw#Ɗo܇NMaPv=<<:j -n&,fo=TZ p_ȹ0%ÖaW 0SHy#x ˭K?;f!%Tkl!<׺V1 OpenOffice.org/2.0$Unix OpenOffice.org_project/680m5$Build-90732005-12-02T15:17:44Jean-Marc Valin2007-03-27T22:32:47en-US28PKd{6Versions/Version1yT6 ]" 14 - "H 1Cw "twwt ҂ zuϬ<{缳GE"!]#;ފ-n6L 0( 3q8`v` l :,L,! GpoE5X8;Ph[QPo?0n:ݹfkUlgj~)'dY1Jήr' Qq&<4[?j]#ņ@ QOݑG!2,  }㒫#͗(A]=a +t3,$ L3󟯱-Ct4Ĥ'LTz ndNE=[ i& dz1Uʡ=*cbDڡԟ$ m/|cSB6,MG Rk $o {DDOBg̬T= Ɇ#.KvU#0z7v\O1H'0d~R/snՖzB&8f$ľ{d?)Ji6:_fezb#zELM%a)^2r9`$Z@ ֋Y-lt a<3TBLђ 7?}|]bXZ,&!y;*|!a -p6?5Vyȣ:hk?iST$IN;.֚(.kpDsHDe!!Kq`J>b6DQwFyڐA7% 7 uCJ[*#F[lcj2}'[Kwx.VD {\DdF GױNCQa$p:[1-Wql_X60*S lQI[3 LbWUJ8TvhJPMV8fwxCЋ# a4E1ѡ6ٴRsO%_?2Dj}GwJM@G{*k }ާWo#av sJՈ|O7ޡj,45q?3`F4$z)(֑] 691_4Dڿ)o#;l5 >Ըr6=88. S0mNY(SG󁋱Z)tǯ~y=3ŜU+Op&/je7n#U]-{3@&ʷPDQg@Z2E>4WH4QKX=V_uU-Or6_YFj[ cfvisTKY8xlyNTLSS458kݫJn0bZQp ^-V0LcY 3ljd]Tcl@`(|*R`k@B>?0F pYPQK!c3yGzCw|NsVL~q[(Qd>-\b8te]a_6׾m+:|vE2ށd$&0%C񔰓Z֦Mח^9K>ޚ֍PL}Ƥ=qmwTbq95="mQqLOk䔑pvVbDcPGz.,21뉓kƨ O*5oya6rX(KOg[}(&^ r8LEL]T_X,{~'([[聵JUI&[vDNT|WNѳ Wo=<֣ Zja!Fz4/݂-ODh[+XYY.6 lqYP(S|eKGD_F3@`r=aBOqX#Ŵ㭌$) ȒM>ГaIShW*lOOYjQ(y(MN/^A(|0`-]5}Wƞt `>.HDr[T[Bmj>cyPA:ӝbbx1͵r~ Z~A)r<-wYh#5Zx>XIfBSx1;%,2pD?̄m2dmt4u>hOJf:EиjbVl NĽ$:7fm y5 |Z3ad.R.T7k :Z7,Ae!HfyNux(Q&kbQyD!6DS<؊ԛ\qѸPYaر}@fxђGB-5٦YzQ:rFkrSmJkNj_[y"58ʴ}RN"SfC޾H{bsޛ[$-^uSfAj J45Iq8qYO[{RkǼƖ(>lX(x_-uh$dtJjK nGYCds0n#L5,J|4|qc v5c%؛LkV6q"{Eϒ;^gMR Kjh<RSOq=QX+IMMFTYcI}T$gƼ8]*8.{9N|<0G>+ܸkHQ++R5@&R]mf!VOYыi<e~k9Z-LrN!&]4˲fyñ}ʦ4-RϧVz3hr7#3//STlYgrrp"TY]3;a} 5uH9Ƹ.b6Ml7;ÚJ17yyA^V噜(+rf}=:YFQJ5"hL&q ßƓ^[-$2F[ug /d+mxtFMzPKC,\v=_7ED]]& 3WqHsbP(o+Ǘŗ_s 1׃x:=bxfaPfW~xyu(BC@V:2,p]T46w(Lb۴ۤ&37 j8n5K$E U_w篝[բtɈ2=ǀRo!, Hpdbtl\{bv{U"ӕf oK1E›-+/aJCcXNȶ 7۰էS(ƓlJ.Vb-/uhCؐC6ɱj$q0*{X=Y:dE'VهR8U/7I:yCW(0O jl:b/_$29S=e'p OmΙCC|W9ډK܁7а(QA~$"V_e BU$c gzYD,C!' SF^9; JK99>c{D;x[>SA|~iWܓ<_ɮ0+u%0$qA]4i6*⻃R-mCtvI L51YOx:.n:<}?Π/|Sr-]UZܘ DLm=u"+KI⡭>SFam.1 =x[',yodͥ[XNd4aT^N0 *k՘s1y wɒ] 3jfD(!&$n{ȘD+Xwr;'Z`!c lvA5֔}LI" Zv`R'/rV`Ѕg^viX1gСC0dfXoJYN1v u%.fG1Xc658&M#s s&* )젗> ſTg}ݿ1j]MECvmjǒZ+{Å9v/YS[%fp4_>V=4~J*տhl2KلeJmwχ]!܅Yۄ彻0#Ac?YgFYOk +o$aBXk9O?Nos_5H~O~d:OD1+ cPFnPK, ,!PKd{6Versions/Version2zT6! () ) J 0 1t) Hw "9"H#݂1H = āMl*5f+zĊ8!T#dǦoxTَG/;?Xmf+9XT&2'9阖g$:B.D"՜nc繧+T8AiDTCѰU̯n1>N6o3}3_Ffq&BVf;j; Fώk%,1 KS "X2{-ꊀZėRbH4(}Uq{7 Xqr=zB667Ra %֡f/^89m| 5.SȪ`!b'\$f;.9IC "|j8%GL*o'|`ߟQ:$I(B_c$8z.zyNJ Ly+]Žv4f87 *9sLtr923DrAfp@EQT˺BВޝ83㑱(#דr,a>Ld"^VPv۾FB 7D4?Qjޗ: 5ңkDP2z l|+M+j7Vݯ`_PY߰-i+-9oqh(]$3vEs3NmbG~Z |U&18d{W4ӻ:5P@DRMk`"]|h@ZGYx3(Q07L fփ[,ReqE C!)s).8qvy:Lw{s]'rGmΙ}n|MC.\m""`0DCgn3fvLR![پMƬ%wyJ^(A|X͸TRY!~͔SwfpwDf ՗$AkTau8r *LtI\;ڐ3}߇>"UuQAJqq ZPKLb -#P!JЌMa?<-3WPd ot&?6tc_H2'jYyl>UIYzwa@:}F}Ȇ4i=A1efxr>sDJ,7n_>TvFDQ0u{1<+a&JqVҚWW4cx`v0ZڑlSp ]-v&=D4IKW텎 Av|W a#6hek[d÷5F 0V$n砈Bk"J[u0;nKosRcՊlj an}n|%U1jVɏEo_ X5` jy4žEH !nzNɎ[0u$hO5phUkx@ )A+HmW:m"k[ g7XV\ǴIWHoRvC]UQ)4qmiBܺ58R`,-;YqoZmg3jWf7nx4Mn=oW©WGڿ~;b9/̻[mB@ѝʹ0qV;X1c?gSs̛2iAi^#ƍ 1v+`$kRrLɸ,ˀ'|ǒ2iE Nɍx]4n ]H:-hIBYJJRY_1|#Ϙ0t(8-MYγJuRՓm̜u9pk^}4fK%g$oF*.ΩabGbB>2oRhYS<'"&DM9QǞsYvgO%Z^ٵЬFbJj!YeLM`o(VF9-,F|l: eNT0Y!]\q9l/"] n|u_ :/ \‘`SG8Z^r*畹Gn9^zHiZ=-Mt֐t^Kǿ/LFkOTxЩ3UGj`D! Ib;c4eBC"^Y1w?; 7RyL~r3ڂb/G=D@g0q>"qx雂^:&qf%Vjj' =Ah0S|.`ӛS>37m2@9WwaYH^(:$Ɠop9{OHWMEA0(}%rVe Qɴ:a^_~t39{bawz̧"dZub[&ޛxԴ7Pi̴\;"5*[ *GD#e&P3h!nA7k=o>: phmr 7g+I`.I r?i~duyi#+8rfӰ|:%6F諉į*uAqKx)ݾ|kZ\ooA!i EQ~^B6.k O '.5LUN#-d̽ǘBbCS 5Er_7Uc*U)Buft![_. K4|rq]ZJ] [Y"X~^jCTVyyF !8%.A֬H|ȴXgl+둢 u~M PyBIQ;+ HC U6"A Huy38I2[M䊐N<.KbLM͕忁|D ,l%V))& b P{҃SŅ5]9L$kɱ0䋓27c,9fˈ,3g)^-<8>\xxBkJ:/AȾ,rV1mSxHy:WC{ژ8Y5w'E+=Tg TĄU,B?2r5ÇǙ90) iVVBx T۶!k3D]xZ^,Eu5ӝNk@Ղ@LAڞx^gɇ4y) VmAw_/@F1'bj%/1FU69K{SEfOo)7ҡUywvjW@ږs,QCX߰T cYymJn+_# Flߑ Ą0((#[\Wz7 dcC0j-ɨ `•YYA`|+*Eg$3TG:Q jv~+g=j'h;򺻻 yEEEy 9:@`{^~~޿W vj}/ ״a. 98^鴴ͧP oSBvwY`g 8YJO=?((A{3 d]! n@@X.: %/'/,OLH/8 Pw.Zߍ({ 5X OO Mzs)~4Q;WV\JK_O_T?DW37lA?jKQjg/0o0`.S,jBᒌB|f ͐ vЏ%Ќ"wTy^aD Ȣcž&9)̬bsRu^xG k?S*.m`wǷ R/ΌO¤%o%K(ZqkɿlN|\&- ^N|>ie eyd4P"Vdդǖ@]PL:4*xQV82} Z*i^ -)==Hz9z%NԳ`m)m*j}XV\Y;4֛LF/Y]j+|]+p"3uI5/KL>m$gYrRCMG,9jɊіpcObt|WeE x 0 Mx)z8u ,1ael ú΢dgv׭)MY gjO;J3Hٿz,X}&*:qN'#.1ytARn.IJ#&Xz2Z )Ҝhi=\TSQ=:"hQ[e·OmbUSbE obx>86ސeZY2HjP.kY>Te%1<¢ ZH`5ߴ6hrH(hsFJ)uVR&k4.[b;Ogqv23ǦSu1<[|`2dp0C>̯y/vEc M)⭢dWe& R5r|Rq8:Z 1`9Bp55dhfȧ [g:Ω$Rp!yeC;S)1"$QD4n^$%%4E.]M9f큒'fJfmY}/JHAxS"i!,sFlZ6QM Y fHM'Q%q6wcpAw3tô۹cpܹtEov@*I~.)u9xZ%DM(mXrtvB=erHݝY\NVSt |j73_r֜|ni$AEZUa0I oK&d>ݪu޿m<csAE6GKtKybiJ)wMYϱtƥһ= ¹{ժVW| B]1Ȥ.|b0 wnථV1lrͽAiH(&A=vg l}Tq;h:3=@AdȯD]AW[EC*8^ծ(yB1]-IN5,"BF (WO7>-sSi~@?c$B3XaXw:Hϸhe3Ӳְ =x^HwF3â[[E Is-> Td#ud-crTMTKMipKHNQ"{׆-n٤!cx}>g;U? Sw & PjL,ȑ69j1/|}xgc!z|ﬦ)\J.><7x(L~]d4s&<*L((nFE#C-7ssq~c'9k7Z $`k:O;\Nd[\I A{'q"9E/*&ʏF_?PK6Y>&"PKd{6Thumbnails/thumbnail.pngՕ; =uԃz% sK"6pTȽH[G(GF )9"(16fѶ>y}.NT|e37U}ۦ?lk/'}u<`[P{d=yzF6#K/Y͖G WJ+WɢS~,R"veh(c2?LOJ R‹;Ym>2|ua[jm)5 .ر&&&hJRt%94I wRtØ7DO᧧>Yc}}FpL ߟT>v:pfQݏ)d%I* Zq5g8l> -C/I$:N#$EAkL!$M~. }BHUТ6^,jq{9!,txhfPjqW Gi0q}yp0Oq0/}!rNe#^LdL+ : AN v,52QsA6 M=lS0izR)vƆ^\#E3-Ǝ*;U瞱޼Gc ~Ae{1p+Iu*GP+=ۈմvIX Sߨt"689;ãtg e=›+ $ӳ?kko;Yc06KχY^.&\]9V ~N!l!aVZ9"__!eAD?YU]],UK W@G1ts  ղ*1j3@aubH;Q#r!6X5cqXxxxY#,0|>0sa{Gi~ѝK|j[,L7539zoݫF}W">c:]7}kS)3#j V>8| l-=b6S{P͢#fjJxfeH.vdl5w9Ο8߁V*%i+ȶvOzoG'pw$*R,&$F?:ytMaǏH$q-QRPEdQ68! DjJYN=AsY5ʊX_a/EY|I}hۈzQIC,|LS. sM7v];QZԟi桬kƁ{Ѕ!Q@ƑV7qD 8 -YM]JïOTj;Ӳ+Sڱ+|ss|%Dx!uYŚ 8DA8:޶ %%Qܺ~|M 㘝1whԉ =A!~2)/.=,0sU ,Dk10'bM±z縖ېf`u`޹gШ(HR x=EP plpC7zl q\OPKVjPKd{6'Configurations2/accelerator/current.xmlPKPKd{6Configurations2/progressbar/PKd{6Configurations2/floater/PKd{6Configurations2/popupmenu/PKd{6Configurations2/menubar/PKd{6Configurations2/toolbar/PKd{6Configurations2/images/Bitmaps/PKd{6Configurations2/statusbar/PKd{6 settings.xmlZ[s6~0}hC0$lcn \M h%$ǰIX9.}fcn\|GܥF:RI}-vK }P9_7w)"".EanYqv1$\YaDw^1 2l L81%٧)yFsQ6SJ_V 6 :]Rs6u=)  =Fzk7.|siv#t/]J^|A0xTԺk+eLEnP=9H_cng)|F /]q :\0UF[#1 ΁\0 M/343J1$Uz8uFɡ?xU,cw#“#QMDIO0ӷwh:gPy%LCn _Ky_j{#C:4[S^ޗ CWc$\Gw8r]Bu9us'KGn*4Ǣd>jSS۴B1=1~| ه>ګ9|xR.(}ӇXhQ a()}2J} F҂+Qs3>!Ae覤H@>Fz4ٹ.͢FfkMő?W؉ pAYBnZ/;BԱU6tR~{]Ȁ,9ӌ0#fQվrL=&ahjD%'8'DOؘR~#)92G\6`'p(m.,L7~fz^8dU Ce$Ay-Ao3KNgz2b@fB]ULKR~j2ښzUڜ&'|>/l.Ow͐@}ȦL2hk+Ht}+fVG-%vQM9mq]w`!>׳}=- #&>~Rb]2K kLxCDtgC:iƙ.8yr(vRB&k' %"AFR p(ghՂ QlF]w@e3L.5[YF}u\H#qh8=<9S{y&6&LLt)(#K#BΨCfomL2F94w7t}uW۬\j#lܔMsї_k|Իt(?ab[Պ[cCߑsw֓6*nžaHh;V-h\NF^־ꉩX&oUY5&]=.ƺmz[ar9oo|Mrj,\&ޢ7rϮ5*,WݺT3/|շ.Bw[/ϑLX\ K-N62Gɜ+VPK|k%PKd{6META-INF/manifest.xmlMo0 *w` ;CpK4b_6VRGJv8<*kr6NG,#F2ggi%*);I2g TQf$3l ~ aXo*%tp3VRP'ߙMzJi*J(C'h3x'۔T)#SULy$ǣ3iF/"m}sQH#oIPC'>{V@A~2Q~VPP9 Pe'\H \+ZQeԸ mA, >C|CVGWEp$(&"8>Versions/Version2PKd{6VjT\Thumbnails/thumbnail.pngPKd{6'bConfigurations2/accelerator/current.xmlPKd{6bConfigurations2/progressbar/PKd{61cConfigurations2/floater/PKd{6gcConfigurations2/popupmenu/PKd{6cConfigurations2/menubar/PKd{6cConfigurations2/toolbar/PKd{6 dConfigurations2/images/Bitmaps/PKd{6HdConfigurations2/statusbar/PKd{6|k% dsettings.xmlPKd{6r %e jMETA-INF/manifest.xmlPK|lmumble-1.3.4/3rdparty/speex-src/doc/Makefile.am0000664000175000017500000000006014010707304021112 0ustar builderbuilderdoc_DATA = manual.pdf EXTRA_DIST = $(doc_DATA) mumble-1.3.4/3rdparty/speex-src/doc/sampleenc.c0000664000175000017500000000342014010707304021174 0ustar builderbuilder#include #include /*The frame size in hardcoded for this sample code but it doesn't have to be*/ #define FRAME_SIZE 160 int main(int argc, char **argv) { char *inFile; FILE *fin; short in[FRAME_SIZE]; float input[FRAME_SIZE]; char cbits[200]; int nbBytes; /*Holds the state of the encoder*/ void *state; /*Holds bits so they can be read and written to by the Speex routines*/ SpeexBits bits; int i, tmp; /*Create a new encoder state in narrowband mode*/ state = speex_encoder_init(&speex_nb_mode); /*Set the quality to 8 (15 kbps)*/ tmp=8; speex_encoder_ctl(state, SPEEX_SET_QUALITY, &tmp); inFile = argv[1]; fin = fopen(inFile, "r"); /*Initialization of the structure that holds the bits*/ speex_bits_init(&bits); while (1) { /*Read a 16 bits/sample audio frame*/ fread(in, sizeof(short), FRAME_SIZE, fin); if (feof(fin)) break; /*Copy the 16 bits values to float so Speex can work on them*/ for (i=0;i Speex Programming

    Speex Programming

    Encoding

    In order to encode speech using Speex, you first need to:
    #include <speex.h>
    You then need to declare a Speex bit-packing struct
    SpeexBits bits;
    and a Speex encoder state
    void *enc_state;
    The two are initialized by:
    speex_bits_init(&bits);
    enc_state = speex_encoder_init(&speex_nb_mode);
    For wideband coding, speex_nb_mode will be replaced by speex_wb_mode . In most cases, you will need to know the frame size used by the mode you are using. You can get that value in the frame_size variable with:
    speex_encoder_ctl(enc_state, SPEEX_GET_FRAME_SIZE, &frame_size);
    For every input frame:
    speex_bits_reset(&bits);
    speex_encode(enc_state, input_frame, &bits);
    nbBytes = speex_bits_write(&bits, byte_ptr, MAX_NB_BYTES);
    where input_frame is a (float *) pointing to the beginning of a speech frame, byte_ptr is a (char *) where the encoded frame will be written, MAX_NB_BYTES is the maximum number of bytes that can be written to byte_ptr without causing an overflow and nbBytes is the number of bytes actually written to byte_ptr (the encoded size in bytes).

    After you're done with the encoding, free all resources with:
    speex_bits_destroy(&bits);
    speex_encoder_destroy(&enc_state);
    That's about it for the encoder.

    Decoding

    In order to encode speech using Speex, you first need to:
    #include <speex.h>
    You then need to declare a Speex bit-packing struct
    SpeexBits bits;
    and a Speex encoder state
    void *dec_state;
    The two are initialized by:
    speex_bits_init(&bits);
    dec_state = speex_decoder_init(&speex_nb_mode);
    For wideband decoding, speex_nb_mode will be replaced by speex_wb_mode . You can get that value in the frame_size variable with:
    speex_decoder_ctl(dec_state, SPEEX_GET_FRAME_SIZE, &frame_size);
    There is also a parameter that can be set for the decoder: whether or not to use a perceptual post-filter. This can be set by:
    speex_decoder_ctl(dec_state, SPEEX_SET_PF, &pf);
    where pf is an int that with value 0 to have the post-filter disabled and 1 to have it enabled.

    For every input frame:
    speex_bits_read_from(&bits, input_bytes, nbBytes);
    speex_decode(st, &bits, output_frame, 0);
    where input_bytes is a (char *) containing the bit-stream data received for a frame, nbBytes is the size (in bytes) of that bit-stream, and output_frame is a (float *) and points to the area where the decoded speech frame will be written. The last argument indicates whether the frame we'd like to decode was lost. A value of 0 indicates the normal case where bits points to the bit of the current frame. A value of 1 indicates that we don't have the bits for the current frame, in which case the bits argument should be the same as the bits for the last correctly received frame. When a frame is lost, the Speex decoder will do its best to "guess" the sorrect signal.

    mumble-1.3.4/3rdparty/speex-src/doc/speex_analysis.odg0000664000175000017500000004030514010707304022606 0ustar builderbuilderPK .i4.++mimetypeapplication/vnd.oasis.opendocument.graphicsPK .i4Configurations2/PK .i4ObjectReplacements/Object 1 s qcd0dFid209@!& #%+PT8 R5 O Ȳ[I~brPU6PT8 R5 O Ȳ˛I.Ģܤ9 A,VᖀPځ6 PT )Jfg{b $8 )=8sؼ,Gr|;H3d++&A e9B׉*l#H~ӌ`NPK 9PK .i4ObjectReplacements/Object 3 s qcd0dFiddDn@f T% T5(TMg@!$37X/\!(?71bX5XV0n5YN j;@Rn6?NeӔt"P)&QiE@% pgNE W,PKrPK .i4ObjectReplacements/Object 4 s qcd0dFidd 1,$mf@U@US,@>H4jN>y. ,o$K+ss T3LX&g[fv@bdhbVk:ڠ@P:LL|pbF ,ƀ0{,$?CHfnj_jBP~nbuqKc9-L2Ri@:ȨJf\D\T3"iE8\PK~nPK .i4 content.xml[[s6~`i߸c8;Ltt&lD}/$n€!RQJ%*%lt&I4 A4!L71 =ke$9(累0ɂy9(+x)~Ne)a RsǙJxiFX*&K͘L&-JxM{ [, ~WT)ZsHzCRаjL`BYvcHӲw=-;`V3\w*/ʆ ]uA+]֠{o31ƥL v붖= ܛRHvo/DmQ>C |b._"0ldNΩ`*ftYAQB& Q iAzB'Oӵp[V:LSx$'7YDO)->ؐsPͷF%K(kݢK]Wc@XyJ&pb\D &zP E#/% @ u` 9# (+LgZMA-)-OLWb t ~eIFYA\^ < QTRuQN+I1YWR3}ӔTPcaCԶ`}6ciVf=.@Gg]|EbOX'GwE?\g]&Lp =X>c]G%aϹxK;8U_TiĞ|s7o&gR_nAͨZ~b| ˴nerC?FG zr9;+G86N/]AԈ$|:u<3d!O0s|0AFc6nL{歇m8AuN O+p)Y7vgۧ1mFDIbIȒ2a*s*Sf|qIY!dU"d{CTD !*ϕiw0+ӓ#\un['T%Y6'/7˶@q_ &#̟e?_xʼu$CgAi r'sW{wCpoF+W0%[>1]Bt4=,z)e*?ux/1\6T} t{nvn7nVcp 7E:Y5V9WQt P1b)ƯElUQVg?6atEb&3HP3hɊZs$kRNa36dm0h~6ܪZl3:rY9liff 1k/ .pۮ^T[x2>uއʵΩjQ%"׊ȵfg5ruz݋t$l zd@jY֤6 N 6  q. 8E# @ F/OFڡO2헷\ϭnXm'"{ Yy\sߤqUw,;羉gʹoUwsŬ.U|ۂAjN~g ~goQ7ok;E ) S:f_k[?;(q:~*5r'*5Uk>|DYRXY:zϓ*0'3ZuZEW[z@[; xy:Xؓ%eI|oě.`=q$\=mUٓ.}nE(#WZPKNt@PK .i4 styles.xml\n64td^bð C3 kDl$Q8KoO#?T$9R$n(jQ821MV;sL'> HY?j/;aH| 8Vo#09ɖJ2s,)HLP%4I9ik/RjD>lt,tszRY0:Y|EVH-)7IVtiۻn;QbaKie_9V8bvg]Ƙ ]ݤ$ט qՔ T]ifpt]oz` 3 `xmٗ \~C |Fn*m}>2ULP.gnϚnUQWӸ 4smаDݞ A  B(R|Q]Un/Ex`Wbctgkw?ӛ9Ɖ!b,Wm=i_ p( xy27 [⛥ncV) J$rN*U[dji<[;̌iK9,lFP2ΈKVLx|,.E!C$8J>E"E|B4~*uW<T,O# %< DOi5@[`p|e2H \#FqT/7OPp"|'-?v- IEKq!V.F&&š.nȲC4} %YqVyJĦF֔͌$@,0Ih2!xHrY A`p1\cZ[\&NԶ܇ǷʚdמB59$QTyPT.2JSWO Szb M%pȅ%`d$ - C@6hA0nN6ҥ3G͕oɪ8"8"5l(PB1>*%^)VcեE#lxMTT!x9=DsIΑljoRĊT1)rgޫDh~@^%BCț_%Boɫyu`_i^Y]`~[Zv_qK_ /QT4Ǫ~)ʼnh,-lj#q%wPE|DsaN&f-fkj^nj4$+WgXģZ r)z]}^B'f\Rヘg0wPFpTRQx22T3GEn-R;e[\=]>uN1TQ%|#&xd枎%L*un?r{/4U=%E_P|Ci8qq.[e壬\%-BR3oKAh^{qQ?'N a- oǻ^7^'%6Gr~;!:GDNDN"4!z\h,A؁RG;zG>މq520-a޸*bkvx{bVPcg݃c髽#+S_=S_}4M}WO}WO}q#4U.;7zUjܝ&:'~h(Wq^͹h\7Zb"ˁԼUʂ CDB7G8$XDc=GP5Q_v׸Uz]+;_->見V)(a`8niu:"i%L\[9.(/zlqڔ4+T(9s?q`Py B2!hg],1Fl%WFsykq?"W (/! Y 8Xf7;UBJ=*r@ח;ıʼn}zs F%<YǷ3<\jy`Y@, wTA "Oq@d  E IuJ!,:HZ&u];u6$lqZI-ʢ%VKzhTlY(vJ\'O28֦:WϏ'to&LZpՃfes6Rf#ZrpPKpPK .i4Object 1/settings.xmln0)P@OF@Vڄ:v ݧ_ڒC$+Db7x<'M $EqZM9ˎ8?tq>xs:"z:^|D{H$'HOi_0_:Jsz}>?Et[n2GcQ(D܃ؙ̄-ټpNct8$ 9 qhJa5'='L1t;-w(WNv:`*nuQOUϭ˳lhHS_V蒛4tIL(¨oql#iW;Ūm.', ``Q0ӏ&U\lpކ3Eűx{մ35ͪ`WvE*&*"Xհ߀V|Q"*ȉO ⿀:,)uhH$#!/jZ͒| dY. )Un_avwT*8<` Cyos{˚& \Ls8Wa4U;WЅ~e5;uAt2u>j )#bޑc@Y;t$KWqF}+$I_0qVCMɀIH|Sm XW1"EPy-/v^/>$B-USl o#UQE2[0C6Q`xݎDY<խoO1,v3}#PK}tzMePK .i4Object 2/content.xmlJ@>ź'=4cZ$[0 4`xdMn"^/˰7?[lX)Ҝ4.0b<̣m c<#'֩;r2*ijq < 8NCf \)FݏobkC*/\4))@UUF5jd2-N Q.PhTW[BLɋc {֊mgH  /?;=-DʚqΓ@fZ ʤkv촅ӭ`! }\em] t{錋zN_BĉT/,yHzPKЩLdPK .i4Object 3/content.xml]J0{xc6 l'!^Il.ЦVݴ]&?X|VF{7BeM.Ua?[]q_v9vC8#JOBE!35mIcHQH<$[OyDr# &C<sZu]uբL;J(YnD(W%BW2CVǕj 7јz2ׂ[[!+_LLsX `PK ]PK .i4Object 3/settings.xmlo0WvFTЮt$XM|_?ڒeI'Db߻tn6x.(:oZ `.z-ułxF0y&@J5D4t&v׊8s*Ft %Ӝ,){Z+)CǶnm{w7"[婨x{"@zBj~\KuJozi]K!W ׬y<}dܑPݡLZfN[8ҀgUU@5k_gθ#pz 'Re%Yx^BQ"tEb{I(%c—e[.H(z=݀wl_rVw5%Lpą̏JZLcapP ?¬ނ*5ň0bT.а('@`*.&8ODmùEž3xѴ5ͨ`VfE*&1*"p؀F<*K|qICP萌u?^|%ۯoCo *.U|`>vwTHܔWyqA)c֤Ú& 90#+utS۲ *t6L`#X5;`Ptad*ΈoEAFsr .a6I0 2D=C6G+sY S]V$EӇOE5 PK B@EħuUTuy )A,^1Gc[0443 K}l>yHzPK,LdPK .i4Object 4/content.xml]j0Y@0u0)L],M@Hs\'`/gX.Uvs.;pYCV~pGJn{C:a7l5ݼBۇӔj/*I)SfF(`Jΰ\̟)5"1, .62~ PUUP l4BMV\֣KNkwBH !x-mRȎMxn)`11-sQ OpenOffice.org/2.0$Linux OpenOffice.org_project/680$Build-88252006-02-03T15:36:552006-03-09T16:48:21en-US5PT27M38SPK .i4Thumbnails/thumbnail.png; W ,ǤҚXR[N[e4tA6׹2GLCq +Nr:/΋y{~/vsVcρ=@1*SUޞH8@>X\CXsufjݛo3+i;[V[bΩA%C|"{ߎ5J伥Q5N㘎ZR⎷JG)/|SRCSǶ_}Ji Ǫ>Х0zItxsM. [o2MlRT;#fG-,,jT'oRQQYH\!nfLлDyb(Ϝ;)]Q(=QQNFyq"lAOZEVID8? #Zo…L<< 50% kA_0X1}۔7kbTZK`]:-8 NB)pX9q##3pkV[{;BOO#ְbpxCpEb8^e7DqIJjIbfwyRxkfh"i M]CC}'%}n6(@) =M=e5E>2ᜏOGIpq?bb7c%)F5v[ugEMA9YNH]###SmCd(۶RBU+ cLƐ)Irr{v]u22fk@VL`e ݃66.Y[/C :'}"L*zcHlgtuu5pU0} `˥eaU-Rj&E `kKxt߿5UZX8~IqЕ:eg҄+f wUjU YwbzE\仠amp9A7:7PKE \rtPK .i4 settings.xmlZr8}߯HEl *a@ $pɖ%W6%`fmM@N%o }*si.ut~_wl6*@.2-jP۩(oߧ|N , HS`mՅHʒ`zZH # wy#]q$0:SQ֫w3I֊EijyeoW Seks=&l(vO h1wݺxQt'%rC_l.SJF{$}3"Tޔ+OTL8-XܗGE|̟O"~ּ}9?/)DKe [<|u cM! T1 L2K8uA3@:ݷgEB)%Do9j>T70EGE|/ȑU.jf!ңLPHHV7 ]5r=#`S QUd P\\^\fRmep R'>>檤HUhOƥR s^5P-fIml2# [. 0x[',7--C–6y!^f t}LZX ~yUU% "g}tXkv-EHf\AE5i3w@="B14,c} ]C1eFcS8\ܝ/H>m[_yTp<+@/JX*Ea, #&sǥYW6 L.qRBepW>XZMz;(UXhb2B3Hd|^'wbix#.',&gĩ%0m:մE4(1J뮀p^utx2~:*>[JzƄz˄݉1(:QL#!zKׄ8WO^;|BM&))`(Yiй9Ѓ4%ԩFʸ bۘ*FxﺺRog,~%Em fkiUo1j%2JiOHI{~Uqo6W=wh6UbNfq8elXAґe5-b%ZznwkUsҳeZZѵ9Zt<wdR渄ش5fd:vtܪ-Ε鸙ovlULRUW,w8nhÊ4*hZ~5 X/g%)պY0jvzTKlއUĽu&#HYr3{Uzi)-a:7Н"7atO TUk>r=9?'1xPK~~$PK .i4META-INF/manifest.xmlVN0n"BP9ie'5r?CEDjo373? =J|H`$47y'>G*t{zu9D8t\ =21UNh2B5sSzvH )9(m*f5+J w`}gRJ fe$gC:%Zd+VN%!sJE%i)*h&qp3jru2v~S|fhQB HLU0'Oڃ=mbãp'JŸ Z6wKngvwKnoCko b~OB8I^ s%lFm~/`o?ƙ~74vt-nƱnu n+ڎ.YM6A3,zHJ7Ml}B=xPK7z5 PK .i4.++mimetypePK .i4QConfigurations2/PK .i46?ObjectReplacements/Object 1PK .i4 9ObjectReplacements/Object 2PK .i4r"ObjectReplacements/Object 3PK .i4~n3ObjectReplacements/Object 4PK .i4Nt@ mcontent.xmlPK .i4[z:5F  styles.xmlPK .i4pObject 1/content.xmlPK .i4}tzMeObject 1/settings.xmlPK .i4vObject 2/content.xmlPK .i4ЩLdObject 2/settings.xmlPK .i4 ]xObject 3/content.xmlPK .i4,Ld Object 3/settings.xmlPK .i4VNf'>$Object 4/content.xmlPK .i41Ld%Object 4/settings.xmlPK .i4!!pjj6)meta.xmlPK .i4E \rt-Thumbnails/thumbnail.pngPK .i4~~$ ~3settings.xmlPK .i47z5 9META-INF/manifest.xmlPK;mumble-1.3.4/3rdparty/speex-src/doc/celp_decoder.eps0000664000175000017500000011602614010707304022211 0ustar builderbuilder%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 442 315 %%Pages: 0 %%Creator: Sun Microsystems, Inc. %%Title: none %%CreationDate: none %%LanguageLevel: 2 %%EndComments %%BeginProlog %%BeginResource: SDRes /b4_inc_state save def /dict_count countdictstack def /op_count count 1 sub def userdict begin 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit[] 0 setdash newpath /languagelevel where {pop languagelevel 1 ne {false setstrokeadjust false setoverprint} if} if /bdef {bind def} bind def /c {setgray} bdef /l {neg lineto} bdef /rl {neg rlineto} bdef /lc {setlinecap} bdef /lj {setlinejoin} bdef /lw {setlinewidth} bdef /ml {setmiterlimit} bdef /ld {setdash} bdef /m {neg moveto} bdef /ct {6 2 roll neg 6 2 roll neg 6 2 roll neg curveto} bdef /r {rotate} bdef /t {neg translate} bdef /s {scale} bdef /sw {show} bdef /gs {gsave} bdef /gr {grestore} bdef /f {findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding ISOLatin1Encoding def currentdict end /NFont exch definefont pop /NFont findfont} bdef /p {closepath} bdef /sf {scalefont setfont} bdef /ef {eofill}bdef /pc {closepath stroke}bdef /ps {stroke}bdef /pum {matrix currentmatrix}bdef /pom {setmatrix}bdef /bs {/aString exch def /nXOfs exch def /nWidth exch def currentpoint nXOfs 0 rmoveto pum nWidth aString stringwidth pop div 1 scale aString show pom moveto} bdef %%EndResource %%EndProlog %%BeginSetup %%EndSetup %%Page: 1 1 %%BeginPageSetup %%EndPageSetup pum 0.02836 0.02834 s 0 -11113 t /tm matrix currentmatrix def tm setmatrix -5152 -9418 t 1 1 s 0 lw 1 lj 0.000 c 6935 14318 m 5435 14318 l 5435 10318 l 8435 10318 l 8435 14318 l 6935 14318 l pc 11436 12317 m 10934 12818 l 10936 11817 l 11436 12317 l pc 5831 11966 m 8109 11966 l ps 6425 11966 m 6425 11636 l ps 6123 11966 m 6123 12366 l ps 6727 11966 m 6727 11707 l ps 7719 11966 m 7719 11872 l ps 7070 11966 m 7070 12248 l ps 7439 11966 m 7439 11636 l ps 5830 10920 m 8108 10920 l ps 6163 10920 m 6163 10590 l ps 6470 10920 m 6470 11320 l ps 6726 10920 m 6726 10661 l ps 7109 10920 m 7109 10826 l ps 7417 10920 m 7417 11202 l ps 7699 10920 m 7699 10590 l ps 5831 10921 m 8109 10921 l ps 6164 10921 m 6164 10591 l ps 6471 10921 m 6471 11321 l ps 6727 10921 m 6727 10662 l ps 7110 10921 m 7110 10827 l ps 7418 10921 m 7418 11203 l ps 7700 10921 m 7700 10591 l ps 5857 12918 m 8135 12918 l ps 6190 12918 m 6188 12729 l ps 6497 12918 m 6497 13318 l ps 6753 12918 m 6751 13247 l ps 7136 12918 m 7136 12824 l ps 7444 12918 m 7442 12611 l ps 7796 12919 m 7794 13248 l ps 6935 17818 m 5435 17818 l 5435 15818 l 8435 15818 l 8435 17818 l 6935 17818 l pc gs pum 6263 17039 t 219 -104 m 214 -66 184 -39 147 -39 ct 120 -39 99 -51 85 -74 ct 74 -92 71 -110 69 -147 ct 268 -147 l 266 -213 260 -244 245 -277 ct 224 -321 193 -341 149 -341 ct 71 -341 20 -271 20 -160 ct 20 -55 68 9 146 9 ct 208 9 252 -32 264 -104 ct 219 -104 l p 69 -192 m 72 -252 104 -292 147 -292 ct 171 -292 191 -280 203 -260 ct 214 -243 218 -226 220 -192 ct 69 -192 l p ef 362 -412 m 418 -412 l 418 -458 l 321 -458 l 321 124 l 418 124 l 418 78 l 362 78 l 362 -412 l p ef 508 -332 m 465 -332 l 465 0 l 511 0 l 511 -180 l 511 -250 539 -292 586 -292 ct 625 -292 642 -265 642 -204 ct 642 0 l 687 0 l 687 -226 l 687 -299 653 -341 595 -341 ct 558 -341 532 -324 508 -283 ct 508 -332 l p ef 870 -204 m 742 -204 l 742 -147 l 870 -147 l 870 -204 l p ef 899 -400 m 1026 -400 l 1026 0 l 1077 0 l 1077 -400 l 1204 -400 l 1204 -455 l 899 -455 l 899 -400 l p ef 1281 78 m 1225 78 l 1225 124 l 1322 124 l 1322 -458 l 1225 -458 l 1225 -412 l 1281 -412 l 1281 78 l p ef pom gr 10410 12492 m 10410 12142 l 10935 12317 l 10410 12492 l p ef 1 lw 0 lj 8435 12318 m 9685 12318 l 9685 12317 l 10515 12317 l ps 0 lw 1 lj 11434 16817 m 10932 17318 l 10934 16317 l 11434 16817 l pc 10483 16967 m 10483 16667 l 10933 16817 l 10483 16967 l p ef 1 lw 0 lj 8435 16818 m 9684 16818 l 9684 16817 l 10573 16817 l ps 0 lw 1 lj 13085 14818 m 12947 14818 12835 14706 12835 14568 ct 12835 14430 12947 14318 13085 14318 ct 13223 14318 13335 14430 13335 14568 ct 13335 14706 13223 14818 13085 14818 ct pc gs pum 12931 14791 t 133 -183 m 20 -183 l 20 -137 l 133 -137 l 133 0 l 171 0 l 171 -137 l 283 -137 l 283 -183 l 171 -183 l 171 -320 l 133 -320 l 133 -183 l p ef pom gr 13234 15268 m 12934 15268 l 13084 14818 l 13234 15268 l p ef 1 lw 0 lj 11435 16817 m 13084 16817 l 13084 15178 l ps 12934 13868 m 13234 13868 l 13084 14318 l 12934 13868 l p ef 11437 12317 m 13084 12317 l 13084 13958 l ps 0 lw 1 lj 17835 15318 m 16335 15318 l 16335 13818 l 19335 13818 l 19335 15318 l 17835 15318 l pc 16668 15023 m 16778 14801 16891 14569 16925 14316 ct 16997 13766 17307 14273 17221 14551 ct 17165 14731 17523 15058 17694 14622 ct 17856 14213 18050 14912 18286 15000 ct 18489 15075 18680 14999 18878 15000 ct 18878 15000 18878 15000 19076 15047 ct 19076 15047 19076 15047 19135 15118 ct ps 15885 14718 m 15885 14418 l 16335 14568 l 15885 14718 l p ef 1 lw 0 lj 13335 14567 m 14935 14567 l 14935 14568 l 15975 14568 l ps gs pum 17085 13052 t 208 -214 m 206 -241 203 -254 195 -269 ct 180 -296 151 -311 114 -311 ct 84 -311 61 -302 46 -283 ct 33 -266 25 -243 25 -219 ct 25 -180 43 -156 78 -146 ct 129 -131 l 170 -120 182 -108 182 -79 ct 182 -46 158 -27 118 -27 ct 90 -27 69 -37 58 -56 ct 51 -68 49 -78 48 -98 ct 16 -98 l 17 -65 22 -48 35 -30 ct 54 -3 78 8 116 8 ct 177 8 214 -26 214 -83 ct 214 -126 195 -154 158 -164 ct 87 -184 l 67 -190 57 -202 57 -224 ct 57 -257 78 -276 114 -276 ct 137 -276 156 -267 166 -250 ct 172 -240 175 -231 176 -214 ct 208 -214 l p ef 319 -39 m 271 -221 l 236 -221 l 304 5 l 300 16 297 25 296 28 ct 289 51 284 57 271 57 ct 265 57 259 55 253 53 ct 253 87 l 255 87 l 261 90 263 90 268 90 ct 304 90 309 83 337 -4 ct 402 -221 l 368 -221 l 319 -39 l p ef 457 -221 m 428 -221 l 428 0 l 458 0 l 458 -120 l 458 -166 477 -194 508 -194 ct 534 -194 546 -176 546 -136 ct 546 0 l 576 0 l 576 -150 l 576 -199 553 -227 515 -227 ct 490 -227 472 -216 457 -188 ct 457 -221 l p ef 690 -190 m 690 -221 l 660 -221 l 660 -282 l 630 -282 l 630 -221 l 605 -221 l 605 -190 l 630 -190 l 630 -44 l 630 -12 641 2 665 2 ct 667 2 669 2 676 1 ct 678 1 683 0 689 0 ct 689 -29 l 679 -29 l 665 -29 660 -34 660 -46 ct 660 -190 l 690 -190 l p ef 751 -303 m 721 -303 l 721 0 l 751 0 l 751 -120 l 751 -167 770 -194 803 -194 ct 828 -194 839 -179 839 -144 ct 839 0 l 869 0 l 869 -150 l 869 -199 846 -227 808 -227 ct 784 -227 769 -218 751 -190 ct 751 -303 l p ef 1038 -69 m 1035 -44 1015 -26 991 -26 ct 973 -26 958 -34 950 -49 ct 942 -61 940 -73 939 -98 ct 1071 -98 l 1070 -142 1066 -162 1056 -184 ct 1042 -214 1022 -227 992 -227 ct 940 -227 906 -180 906 -106 ct 906 -36 938 6 990 6 ct 1032 6 1061 -21 1069 -69 ct 1038 -69 l p 939 -128 m 941 -167 962 -194 991 -194 ct 1007 -194 1020 -186 1028 -173 ct 1035 -162 1038 -151 1040 -128 ct 939 -128 l p ef 1242 -158 m 1240 -202 1215 -227 1174 -227 ct 1132 -227 1104 -200 1104 -157 ct 1104 -129 1118 -111 1146 -103 ct 1182 -92 l 1210 -84 1218 -77 1218 -60 ct 1218 -39 1202 -26 1175 -26 ct 1144 -26 1130 -39 1128 -71 ct 1099 -71 l 1100 -49 1102 -38 1108 -27 ct 1120 -5 1143 6 1173 6 ct 1219 6 1248 -22 1248 -66 ct 1248 -97 1234 -113 1197 -125 ct 1167 -134 l 1140 -142 1134 -148 1134 -163 ct 1134 -183 1148 -195 1172 -195 ct 1198 -195 1211 -183 1213 -158 ct 1242 -158 l p ef 1315 -221 m 1285 -221 l 1285 0 l 1315 0 l 1315 -221 l p 1315 -261 m 1315 -303 l 1285 -303 l 1285 -261 l 1315 -261 l p ef 1492 -158 m 1490 -202 1465 -227 1424 -227 ct 1382 -227 1354 -200 1354 -157 ct 1354 -129 1368 -111 1396 -103 ct 1432 -92 l 1460 -84 1468 -77 1468 -60 ct 1468 -39 1452 -26 1425 -26 ct 1394 -26 1380 -39 1378 -71 ct 1349 -71 l 1350 -49 1352 -38 1358 -27 ct 1370 -5 1393 6 1423 6 ct 1469 6 1498 -22 1498 -66 ct 1498 -97 1484 -113 1447 -125 ct 1417 -134 l 1390 -142 1384 -148 1384 -163 ct 1384 -183 1398 -195 1422 -195 ct 1448 -195 1461 -183 1463 -158 ct 1492 -158 l p ef pom pum 17085 13581 t 90 -190 m 90 -221 l 60 -221 l 60 -248 l 60 -266 65 -274 78 -274 ct 81 -274 85 -274 90 -273 ct 90 -307 l 81 -307 79 -307 76 -307 ct 46 -307 30 -291 30 -259 ct 30 -221 l 4 -221 l 4 -190 l 30 -190 l 30 0 l 60 0 l 60 -190 l 90 -190 l p ef 150 -221 m 120 -221 l 120 0 l 150 0 l 150 -221 l p 150 -261 m 150 -303 l 120 -303 l 120 -261 l 150 -261 l p ef 227 -303 m 197 -303 l 197 0 l 227 0 l 227 -303 l p ef 339 -190 m 339 -221 l 309 -221 l 309 -282 l 279 -282 l 279 -221 l 254 -221 l 254 -190 l 279 -190 l 279 -44 l 279 -12 290 2 314 2 ct 316 2 318 2 325 1 ct 327 1 332 0 338 0 ct 338 -29 l 328 -29 l 314 -29 309 -34 309 -46 ct 309 -190 l 339 -190 l p ef 492 -69 m 489 -44 469 -26 445 -26 ct 427 -26 412 -34 404 -49 ct 396 -61 394 -73 393 -98 ct 525 -98 l 524 -142 520 -162 510 -184 ct 496 -214 476 -227 446 -227 ct 394 -227 360 -180 360 -106 ct 360 -36 392 6 444 6 ct 486 6 515 -21 523 -69 ct 492 -69 l p 393 -128 m 395 -167 416 -194 445 -194 ct 461 -194 474 -186 482 -173 ct 489 -162 492 -151 494 -128 ct 393 -128 l p ef 657 -188 m 657 -226 l 654 -227 651 -227 649 -227 ct 627 -227 613 -215 597 -183 ct 597 -221 l 568 -221 l 568 0 l 599 0 l 599 -129 l 599 -163 618 -188 645 -188 ct 657 -188 l p ef 878 -297 m 854 -297 l 844 -253 834 -244 789 -240 ct 789 -211 l 845 -211 l 845 0 l 878 0 l 878 -297 l p ef 1050 -311 m 1027 -311 l 943 8 l 965 8 l 1050 -311 l p ef 1211 -88 m 1235 0 l 1272 0 l 1182 -303 l 1144 -303 l 1050 0 l 1085 0 l 1111 -88 l 1211 -88 l p 1121 -125 m 1161 -259 l 1199 -125 l 1121 -125 l p ef 1360 -310 m 1316 -231 1301 -179 1301 -110 ct 1301 -42 1314 1 1361 87 ct 1381 87 l 1343 -5 1334 -42 1334 -107 ct 1334 -182 1344 -225 1381 -310 ct 1360 -310 l p ef 1552 -190 m 1552 -221 l 1412 -221 l 1412 -190 l 1513 -190 l 1403 -29 l 1403 0 l 1555 0 l 1555 -30 l 1444 -30 l 1552 -190 l p ef 1599 87 m 1642 8 1657 -43 1657 -111 ct 1657 -179 1644 -223 1598 -310 ct 1577 -310 l 1616 -217 1625 -179 1625 -115 ct 1625 -40 1615 2 1578 87 ct 1599 87 l p ef pom gr gs pum 5708 9956 t 63 -137 m 185 -137 l 185 -174 l 63 -174 l 63 -266 l 202 -266 l 202 -303 l 30 -303 l 30 0 l 63 0 l 63 -137 l p ef 265 -221 m 235 -221 l 235 0 l 265 0 l 265 -221 l p 265 -261 m 265 -303 l 235 -303 l 235 -261 l 265 -261 l p ef 394 -113 m 455 -221 l 418 -221 l 375 -143 l 334 -221 l 294 -221 l 355 -113 l 291 0 l 330 0 l 373 -83 l 419 0 l 458 0 l 394 -113 l p ef 606 -69 m 603 -44 583 -26 559 -26 ct 541 -26 526 -34 518 -49 ct 510 -61 508 -73 507 -98 ct 639 -98 l 638 -142 634 -162 624 -184 ct 610 -214 590 -227 560 -227 ct 508 -227 474 -180 474 -106 ct 474 -36 506 6 558 6 ct 600 6 629 -21 637 -69 ct 606 -69 l p 507 -128 m 509 -167 530 -194 559 -194 ct 575 -194 588 -186 596 -173 ct 603 -162 606 -151 608 -128 ct 507 -128 l p ef 829 -303 m 798 -303 l 798 -187 l 784 -216 768 -227 743 -227 ct 698 -227 668 -182 668 -115 ct 668 -41 699 6 747 6 ct 772 6 787 -4 800 -31 ct 800 0 l 829 0 l 829 -303 l p 749 -194 m 780 -194 798 -162 798 -104 ct 798 -76 793 -57 782 -43 ct 773 -32 761 -26 748 -26 ct 717 -26 699 -58 699 -113 ct 699 -167 716 -194 749 -194 ct p ef 1113 -146 m 1107 -200 1085 -227 1044 -227 ct 991 -227 958 -180 958 -106 ct 958 -37 990 6 1039 6 ct 1081 6 1106 -22 1113 -78 ct 1083 -78 l 1077 -43 1062 -26 1039 -26 ct 1008 -26 991 -56 991 -109 ct 991 -163 1009 -194 1041 -194 ct 1065 -194 1078 -180 1083 -146 ct 1113 -146 l p ef 1219 -227 m 1168 -227 1134 -180 1134 -110 ct 1134 -41 1168 5 1218 5 ct 1268 5 1302 -41 1302 -110 ct 1302 -178 1268 -227 1219 -227 ct p 1219 -195 m 1250 -195 1270 -161 1270 -110 ct 1270 -59 1250 -26 1218 -26 ct 1186 -26 1165 -59 1165 -110 ct 1165 -162 1186 -195 1219 -195 ct p ef 1490 -303 m 1459 -303 l 1459 -187 l 1445 -216 1429 -227 1404 -227 ct 1359 -227 1329 -182 1329 -115 ct 1329 -41 1360 6 1408 6 ct 1433 6 1448 -4 1461 -31 ct 1461 0 l 1490 0 l 1490 -303 l p 1410 -194 m 1441 -194 1459 -162 1459 -104 ct 1459 -76 1454 -57 1443 -43 ct 1434 -32 1422 -26 1409 -26 ct 1378 -26 1360 -58 1360 -113 ct 1360 -167 1377 -194 1410 -194 ct p ef 1656 -69 m 1653 -44 1633 -26 1609 -26 ct 1591 -26 1576 -34 1568 -49 ct 1560 -61 1558 -73 1557 -98 ct 1689 -98 l 1688 -142 1684 -162 1674 -184 ct 1660 -214 1640 -227 1610 -227 ct 1558 -227 1524 -180 1524 -106 ct 1524 -36 1556 6 1608 6 ct 1650 6 1679 -21 1687 -69 ct 1656 -69 l p 1557 -128 m 1559 -167 1580 -194 1609 -194 ct 1625 -194 1638 -186 1646 -173 ct 1653 -162 1656 -151 1658 -128 ct 1557 -128 l p ef 1755 0 m 1755 -28 l 1768 -3 1782 6 1806 6 ct 1854 6 1885 -41 1885 -115 ct 1885 -182 1855 -227 1810 -227 ct 1788 -227 1772 -217 1756 -192 ct 1756 -303 l 1726 -303 l 1726 0 l 1755 0 l p 1805 -194 m 1837 -194 1853 -167 1853 -113 ct 1853 -58 1835 -26 1804 -26 ct 1792 -26 1780 -32 1771 -43 ct 1760 -57 1755 -76 1755 -105 ct 1755 -163 1772 -194 1805 -194 ct p ef 1998 -227 m 1947 -227 1913 -180 1913 -110 ct 1913 -41 1947 5 1997 5 ct 2047 5 2081 -41 2081 -110 ct 2081 -178 2047 -227 1998 -227 ct p 1998 -195 m 2029 -195 2049 -161 2049 -110 ct 2049 -59 2029 -26 1997 -26 ct 1965 -26 1944 -59 1944 -110 ct 1944 -162 1965 -195 1998 -195 ct p ef 2193 -227 m 2142 -227 2108 -180 2108 -110 ct 2108 -41 2142 5 2192 5 ct 2242 5 2276 -41 2276 -110 ct 2276 -178 2242 -227 2193 -227 ct p 2193 -195 m 2224 -195 2244 -161 2244 -110 ct 2244 -59 2224 -26 2192 -26 ct 2160 -26 2139 -59 2139 -110 ct 2139 -162 2160 -195 2193 -195 ct p ef 2390 -138 m 2459 -221 l 2421 -221 l 2342 -127 l 2342 -303 l 2313 -303 l 2313 0 l 2342 0 l 2342 -83 l 2368 -111 l 2424 0 l 2463 0 l 2390 -138 l p ef pom gr gs pum 5390 15539 t 165 -88 m 189 0 l 226 0 l 136 -303 l 98 -303 l 4 0 l 39 0 l 65 -88 l 165 -88 l p 75 -125 m 115 -259 l 153 -125 l 75 -125 l p ef 406 -303 m 375 -303 l 375 -187 l 361 -216 345 -227 320 -227 ct 275 -227 245 -182 245 -115 ct 245 -41 276 6 324 6 ct 349 6 364 -4 377 -31 ct 377 0 l 406 0 l 406 -303 l p 326 -194 m 357 -194 375 -162 375 -104 ct 375 -76 370 -57 359 -43 ct 350 -32 338 -26 325 -26 ct 294 -26 276 -58 276 -113 ct 276 -167 293 -194 326 -194 ct p ef 477 -153 m 481 -184 493 -196 520 -196 ct 547 -196 562 -184 562 -159 ct 562 -143 557 -136 546 -134 ct 495 -126 l 460 -121 440 -96 440 -58 ct 440 -19 463 6 498 6 ct 524 6 543 -4 562 -29 ct 565 -5 573 4 594 4 ct 598 4 602 3 608 1 ct 610 0 610 0 612 0 ct 612 -27 l 605 -25 603 -25 601 -25 ct 595 -25 591 -30 591 -38 ct 591 -165 l 591 -204 565 -227 522 -227 ct 493 -227 472 -217 460 -198 ct 453 -186 450 -175 449 -153 ct 477 -153 l p 561 -76 m 561 -48 535 -24 504 -24 ct 484 -24 472 -38 472 -61 ct 472 -83 483 -94 511 -98 ct 546 -104 554 -107 561 -112 ct 561 -76 l p ef 642 87 m 672 87 l 672 -24 l 685 -2 699 6 722 6 ct 770 6 801 -42 801 -115 ct 801 -182 771 -227 726 -227 ct 701 -227 687 -217 671 -188 ct 671 -221 l 642 -221 l 642 87 l p 721 -194 m 752 -194 769 -166 769 -114 ct 769 -58 751 -26 720 -26 ct 690 -26 671 -55 671 -103 ct 671 -163 688 -194 721 -194 ct p ef 906 -190 m 906 -221 l 876 -221 l 876 -282 l 846 -282 l 846 -221 l 821 -221 l 821 -190 l 846 -190 l 846 -44 l 846 -12 857 2 881 2 ct 883 2 885 2 892 1 ct 894 1 899 0 905 0 ct 905 -29 l 895 -29 l 881 -29 876 -34 876 -46 ct 876 -190 l 906 -190 l p ef 967 -221 m 937 -221 l 937 0 l 967 0 l 967 -221 l p 967 -261 m 967 -303 l 937 -303 l 937 -261 l 967 -261 l p ef 1076 -39 m 1029 -221 l 993 -221 l 1059 0 l 1092 0 l 1161 -221 l 1128 -221 l 1076 -39 l p ef 1309 -69 m 1306 -44 1286 -26 1262 -26 ct 1244 -26 1229 -34 1221 -49 ct 1213 -61 1211 -73 1210 -98 ct 1342 -98 l 1341 -142 1337 -162 1327 -184 ct 1313 -214 1293 -227 1263 -227 ct 1211 -227 1177 -180 1177 -106 ct 1177 -36 1209 6 1261 6 ct 1303 6 1332 -21 1340 -69 ct 1309 -69 l p 1210 -128 m 1212 -167 1233 -194 1262 -194 ct 1278 -194 1291 -186 1299 -173 ct 1306 -162 1309 -151 1311 -128 ct 1210 -128 l p ef 1621 -146 m 1615 -200 1593 -227 1552 -227 ct 1499 -227 1466 -180 1466 -106 ct 1466 -37 1498 6 1547 6 ct 1589 6 1614 -22 1621 -78 ct 1591 -78 l 1585 -43 1570 -26 1547 -26 ct 1516 -26 1499 -56 1499 -109 ct 1499 -163 1517 -194 1549 -194 ct 1573 -194 1586 -180 1591 -146 ct 1621 -146 l p ef 1727 -227 m 1676 -227 1642 -180 1642 -110 ct 1642 -41 1676 5 1726 5 ct 1776 5 1810 -41 1810 -110 ct 1810 -178 1776 -227 1727 -227 ct p 1727 -195 m 1758 -195 1778 -161 1778 -110 ct 1778 -59 1758 -26 1726 -26 ct 1694 -26 1673 -59 1673 -110 ct 1673 -162 1694 -195 1727 -195 ct p ef 1998 -303 m 1967 -303 l 1967 -187 l 1953 -216 1937 -227 1912 -227 ct 1867 -227 1837 -182 1837 -115 ct 1837 -41 1868 6 1916 6 ct 1941 6 1956 -4 1969 -31 ct 1969 0 l 1998 0 l 1998 -303 l p 1918 -194 m 1949 -194 1967 -162 1967 -104 ct 1967 -76 1962 -57 1951 -43 ct 1942 -32 1930 -26 1917 -26 ct 1886 -26 1868 -58 1868 -113 ct 1868 -167 1885 -194 1918 -194 ct p ef 2164 -69 m 2161 -44 2141 -26 2117 -26 ct 2099 -26 2084 -34 2076 -49 ct 2068 -61 2066 -73 2065 -98 ct 2197 -98 l 2196 -142 2192 -162 2182 -184 ct 2168 -214 2148 -227 2118 -227 ct 2066 -227 2032 -180 2032 -106 ct 2032 -36 2064 6 2116 6 ct 2158 6 2187 -21 2195 -69 ct 2164 -69 l p 2065 -128 m 2067 -167 2088 -194 2117 -194 ct 2133 -194 2146 -186 2154 -173 ct 2161 -162 2164 -151 2166 -128 ct 2065 -128 l p ef 2263 0 m 2263 -28 l 2276 -3 2290 6 2314 6 ct 2362 6 2393 -41 2393 -115 ct 2393 -182 2363 -227 2318 -227 ct 2296 -227 2280 -217 2264 -192 ct 2264 -303 l 2234 -303 l 2234 0 l 2263 0 l p 2313 -194 m 2345 -194 2361 -167 2361 -113 ct 2361 -58 2343 -26 2312 -26 ct 2300 -26 2288 -32 2279 -43 ct 2268 -57 2263 -76 2263 -105 ct 2263 -163 2280 -194 2313 -194 ct p ef 2506 -227 m 2455 -227 2421 -180 2421 -110 ct 2421 -41 2455 5 2505 5 ct 2555 5 2589 -41 2589 -110 ct 2589 -178 2555 -227 2506 -227 ct p 2506 -195 m 2537 -195 2557 -161 2557 -110 ct 2557 -59 2537 -26 2505 -26 ct 2473 -26 2452 -59 2452 -110 ct 2452 -162 2473 -195 2506 -195 ct p ef 2701 -227 m 2650 -227 2616 -180 2616 -110 ct 2616 -41 2650 5 2700 5 ct 2750 5 2784 -41 2784 -110 ct 2784 -178 2750 -227 2701 -227 ct p 2701 -195 m 2732 -195 2752 -161 2752 -110 ct 2752 -59 2732 -26 2700 -26 ct 2668 -26 2647 -59 2647 -110 ct 2647 -162 2668 -195 2701 -195 ct p ef 2898 -138 m 2967 -221 l 2929 -221 l 2850 -127 l 2850 -303 l 2821 -303 l 2821 0 l 2850 0 l 2850 -83 l 2876 -111 l 2932 0 l 2971 0 l 2898 -138 l p ef pom gr gs pum 14016 13846 t 213 -36 m 63 -36 l 63 -137 l 199 -137 l 199 -174 l 63 -174 l 63 -266 l 211 -266 l 211 -303 l 30 -303 l 30 0 l 213 0 l 213 -36 l p ef 339 -113 m 400 -221 l 363 -221 l 320 -143 l 279 -221 l 239 -221 l 300 -113 l 236 0 l 275 0 l 318 -83 l 364 0 l 403 0 l 339 -113 l p ef 571 -146 m 565 -200 543 -227 502 -227 ct 449 -227 416 -180 416 -106 ct 416 -37 448 6 497 6 ct 539 6 564 -22 571 -78 ct 541 -78 l 535 -43 520 -26 497 -26 ct 466 -26 449 -56 449 -109 ct 449 -163 467 -194 499 -194 ct 523 -194 536 -180 541 -146 ct 571 -146 l p ef 633 -221 m 603 -221 l 603 0 l 633 0 l 633 -221 l p 633 -261 m 633 -303 l 603 -303 l 603 -261 l 633 -261 l p ef 745 -190 m 745 -221 l 715 -221 l 715 -282 l 685 -282 l 685 -221 l 660 -221 l 660 -190 l 685 -190 l 685 -44 l 685 -12 696 2 720 2 ct 722 2 724 2 731 1 ct 733 1 738 0 744 0 ct 744 -29 l 734 -29 l 720 -29 715 -34 715 -46 ct 715 -190 l 745 -190 l p ef 803 -153 m 807 -184 819 -196 846 -196 ct 873 -196 888 -184 888 -159 ct 888 -143 883 -136 872 -134 ct 821 -126 l 786 -121 766 -96 766 -58 ct 766 -19 789 6 824 6 ct 850 6 869 -4 888 -29 ct 891 -5 899 4 920 4 ct 924 4 928 3 934 1 ct 936 0 936 0 938 0 ct 938 -27 l 931 -25 929 -25 927 -25 ct 921 -25 917 -30 917 -38 ct 917 -165 l 917 -204 891 -227 848 -227 ct 819 -227 798 -217 786 -198 ct 779 -186 776 -175 775 -153 ct 803 -153 l p 887 -76 m 887 -48 861 -24 830 -24 ct 810 -24 798 -38 798 -61 ct 798 -83 809 -94 837 -98 ct 872 -104 880 -107 887 -112 ct 887 -76 l p ef 1037 -190 m 1037 -221 l 1007 -221 l 1007 -282 l 977 -282 l 977 -221 l 952 -221 l 952 -190 l 977 -190 l 977 -44 l 977 -12 988 2 1012 2 ct 1014 2 1016 2 1023 1 ct 1025 1 1030 0 1036 0 ct 1036 -29 l 1026 -29 l 1012 -29 1007 -34 1007 -46 ct 1007 -190 l 1037 -190 l p ef 1099 -221 m 1069 -221 l 1069 0 l 1099 0 l 1099 -221 l p 1099 -261 m 1099 -303 l 1069 -303 l 1069 -261 l 1099 -261 l p ef 1219 -227 m 1168 -227 1134 -180 1134 -110 ct 1134 -41 1168 5 1218 5 ct 1268 5 1302 -41 1302 -110 ct 1302 -178 1268 -227 1219 -227 ct p 1219 -195 m 1250 -195 1270 -161 1270 -110 ct 1270 -59 1250 -26 1218 -26 ct 1186 -26 1165 -59 1165 -110 ct 1165 -162 1186 -195 1219 -195 ct p ef 1368 -221 m 1339 -221 l 1339 0 l 1369 0 l 1369 -120 l 1369 -166 1388 -194 1419 -194 ct 1445 -194 1457 -176 1457 -136 ct 1457 0 l 1487 0 l 1487 -150 l 1487 -199 1464 -227 1426 -227 ct 1401 -227 1383 -216 1368 -188 ct 1368 -221 l p ef pom pum 14480 14375 t 145 -69 m 142 -44 122 -26 98 -26 ct 80 -26 65 -34 57 -49 ct 49 -61 47 -73 46 -98 ct 178 -98 l 177 -142 173 -162 163 -184 ct 149 -214 129 -227 99 -227 ct 47 -227 13 -180 13 -106 ct 13 -36 45 6 97 6 ct 139 6 168 -21 176 -69 ct 145 -69 l p 46 -128 m 48 -167 69 -194 98 -194 ct 114 -194 127 -186 135 -173 ct 142 -162 145 -151 147 -128 ct 46 -128 l p ef 244 -274 m 281 -274 l 281 -305 l 217 -305 l 217 82 l 281 82 l 281 52 l 244 52 l 244 -274 l p ef 343 -221 m 314 -221 l 314 0 l 344 0 l 344 -120 l 344 -166 363 -194 394 -194 ct 420 -194 432 -176 432 -136 ct 432 0 l 462 0 l 462 -150 l 462 -199 439 -227 401 -227 ct 376 -227 358 -216 343 -188 ct 343 -221 l p ef 533 52 m 496 52 l 496 82 l 561 82 l 561 -305 l 496 -305 l 496 -274 l 533 -274 l 533 52 l p ef pom gr gs pum 9491 13237 t 63 -137 m 185 -137 l 185 -174 l 63 -174 l 63 -266 l 202 -266 l 202 -303 l 30 -303 l 30 0 l 63 0 l 63 -137 l p ef 265 -221 m 235 -221 l 235 0 l 265 0 l 265 -221 l p 265 -261 m 265 -303 l 235 -303 l 235 -261 l 265 -261 l p ef 394 -113 m 455 -221 l 418 -221 l 375 -143 l 334 -221 l 294 -221 l 355 -113 l 291 0 l 330 0 l 373 -83 l 419 0 l 458 0 l 394 -113 l p ef 606 -69 m 603 -44 583 -26 559 -26 ct 541 -26 526 -34 518 -49 ct 510 -61 508 -73 507 -98 ct 639 -98 l 638 -142 634 -162 624 -184 ct 610 -214 590 -227 560 -227 ct 508 -227 474 -180 474 -106 ct 474 -36 506 6 558 6 ct 600 6 629 -21 637 -69 ct 606 -69 l p 507 -128 m 509 -167 530 -194 559 -194 ct 575 -194 588 -186 596 -173 ct 603 -162 606 -151 608 -128 ct 507 -128 l p ef 829 -303 m 798 -303 l 798 -187 l 784 -216 768 -227 743 -227 ct 698 -227 668 -182 668 -115 ct 668 -41 699 6 747 6 ct 772 6 787 -4 800 -31 ct 800 0 l 829 0 l 829 -303 l p 749 -194 m 780 -194 798 -162 798 -104 ct 798 -76 793 -57 782 -43 ct 773 -32 761 -26 748 -26 ct 717 -26 699 -58 699 -113 ct 699 -167 716 -194 749 -194 ct p ef 1113 -146 m 1107 -200 1085 -227 1044 -227 ct 991 -227 958 -180 958 -106 ct 958 -37 990 6 1039 6 ct 1081 6 1106 -22 1113 -78 ct 1083 -78 l 1077 -43 1062 -26 1039 -26 ct 1008 -26 991 -56 991 -109 ct 991 -163 1009 -194 1041 -194 ct 1065 -194 1078 -180 1083 -146 ct 1113 -146 l p ef 1219 -227 m 1168 -227 1134 -180 1134 -110 ct 1134 -41 1168 5 1218 5 ct 1268 5 1302 -41 1302 -110 ct 1302 -178 1268 -227 1219 -227 ct p 1219 -195 m 1250 -195 1270 -161 1270 -110 ct 1270 -59 1250 -26 1218 -26 ct 1186 -26 1165 -59 1165 -110 ct 1165 -162 1186 -195 1219 -195 ct p ef 1490 -303 m 1459 -303 l 1459 -187 l 1445 -216 1429 -227 1404 -227 ct 1359 -227 1329 -182 1329 -115 ct 1329 -41 1360 6 1408 6 ct 1433 6 1448 -4 1461 -31 ct 1461 0 l 1490 0 l 1490 -303 l p 1410 -194 m 1441 -194 1459 -162 1459 -104 ct 1459 -76 1454 -57 1443 -43 ct 1434 -32 1422 -26 1409 -26 ct 1378 -26 1360 -58 1360 -113 ct 1360 -167 1377 -194 1410 -194 ct p ef 1656 -69 m 1653 -44 1633 -26 1609 -26 ct 1591 -26 1576 -34 1568 -49 ct 1560 -61 1558 -73 1557 -98 ct 1689 -98 l 1688 -142 1684 -162 1674 -184 ct 1660 -214 1640 -227 1610 -227 ct 1558 -227 1524 -180 1524 -106 ct 1524 -36 1556 6 1608 6 ct 1650 6 1679 -21 1687 -69 ct 1656 -69 l p 1557 -128 m 1559 -167 1580 -194 1609 -194 ct 1625 -194 1638 -186 1646 -173 ct 1653 -162 1656 -151 1658 -128 ct 1557 -128 l p ef 1755 0 m 1755 -28 l 1768 -3 1782 6 1806 6 ct 1854 6 1885 -41 1885 -115 ct 1885 -182 1855 -227 1810 -227 ct 1788 -227 1772 -217 1756 -192 ct 1756 -303 l 1726 -303 l 1726 0 l 1755 0 l p 1805 -194 m 1837 -194 1853 -167 1853 -113 ct 1853 -58 1835 -26 1804 -26 ct 1792 -26 1780 -32 1771 -43 ct 1760 -57 1755 -76 1755 -105 ct 1755 -163 1772 -194 1805 -194 ct p ef 1998 -227 m 1947 -227 1913 -180 1913 -110 ct 1913 -41 1947 5 1997 5 ct 2047 5 2081 -41 2081 -110 ct 2081 -178 2047 -227 1998 -227 ct p 1998 -195 m 2029 -195 2049 -161 2049 -110 ct 2049 -59 2029 -26 1997 -26 ct 1965 -26 1944 -59 1944 -110 ct 1944 -162 1965 -195 1998 -195 ct p ef 2193 -227 m 2142 -227 2108 -180 2108 -110 ct 2108 -41 2142 5 2192 5 ct 2242 5 2276 -41 2276 -110 ct 2276 -178 2242 -227 2193 -227 ct p 2193 -195 m 2224 -195 2244 -161 2244 -110 ct 2244 -59 2224 -26 2192 -26 ct 2160 -26 2139 -59 2139 -110 ct 2139 -162 2160 -195 2193 -195 ct p ef 2390 -138 m 2459 -221 l 2421 -221 l 2342 -127 l 2342 -303 l 2313 -303 l 2313 0 l 2342 0 l 2342 -83 l 2368 -111 l 2424 0 l 2463 0 l 2390 -138 l p ef 2734 -221 m 2705 -221 l 2705 -188 l 2688 -217 2674 -227 2649 -227 ct 2604 -227 2574 -182 2574 -115 ct 2574 -42 2606 6 2654 6 ct 2676 6 2691 -2 2703 -24 ct 2703 -15 l 2703 11 2701 25 2695 37 ct 2687 54 2673 62 2651 62 ct 2628 62 2616 52 2610 27 ct 2580 27 l 2585 55 2591 68 2605 79 ct 2617 88 2632 93 2650 93 ct 2681 93 2705 80 2719 57 ct 2729 39 2734 17 2734 -18 ct 2734 -221 l p 2656 -194 m 2687 -194 2704 -162 2704 -104 ct 2704 -55 2686 -26 2654 -26 ct 2624 -26 2606 -58 2606 -113 ct 2606 -167 2623 -194 2656 -194 ct p ef 2805 -153 m 2809 -184 2821 -196 2848 -196 ct 2875 -196 2890 -184 2890 -159 ct 2890 -143 2885 -136 2874 -134 ct 2823 -126 l 2788 -121 2768 -96 2768 -58 ct 2768 -19 2791 6 2826 6 ct 2852 6 2871 -4 2890 -29 ct 2893 -5 2901 4 2922 4 ct 2926 4 2930 3 2936 1 ct 2938 0 2938 0 2940 0 ct 2940 -27 l 2933 -25 2931 -25 2929 -25 ct 2923 -25 2919 -30 2919 -38 ct 2919 -165 l 2919 -204 2893 -227 2850 -227 ct 2821 -227 2800 -217 2788 -198 ct 2781 -186 2778 -175 2777 -153 ct 2805 -153 l p 2889 -76 m 2889 -48 2863 -24 2832 -24 ct 2812 -24 2800 -38 2800 -61 ct 2800 -83 2811 -94 2839 -98 ct 2874 -104 2882 -107 2889 -112 ct 2889 -76 l p ef 3004 -221 m 2974 -221 l 2974 0 l 3004 0 l 3004 -221 l p 3004 -261 m 3004 -303 l 2974 -303 l 2974 -261 l 3004 -261 l p ef 3078 -221 m 3049 -221 l 3049 0 l 3079 0 l 3079 -120 l 3079 -166 3098 -194 3129 -194 ct 3155 -194 3167 -176 3167 -136 ct 3167 0 l 3197 0 l 3197 -150 l 3197 -199 3174 -227 3136 -227 ct 3111 -227 3093 -216 3078 -188 ct 3078 -221 l p ef pom gr gs pum 9174 17762 t 165 -88 m 189 0 l 226 0 l 136 -303 l 98 -303 l 4 0 l 39 0 l 65 -88 l 165 -88 l p 75 -125 m 115 -259 l 153 -125 l 75 -125 l p ef 406 -303 m 375 -303 l 375 -187 l 361 -216 345 -227 320 -227 ct 275 -227 245 -182 245 -115 ct 245 -41 276 6 324 6 ct 349 6 364 -4 377 -31 ct 377 0 l 406 0 l 406 -303 l p 326 -194 m 357 -194 375 -162 375 -104 ct 375 -76 370 -57 359 -43 ct 350 -32 338 -26 325 -26 ct 294 -26 276 -58 276 -113 ct 276 -167 293 -194 326 -194 ct p ef 477 -153 m 481 -184 493 -196 520 -196 ct 547 -196 562 -184 562 -159 ct 562 -143 557 -136 546 -134 ct 495 -126 l 460 -121 440 -96 440 -58 ct 440 -19 463 6 498 6 ct 524 6 543 -4 562 -29 ct 565 -5 573 4 594 4 ct 598 4 602 3 608 1 ct 610 0 610 0 612 0 ct 612 -27 l 605 -25 603 -25 601 -25 ct 595 -25 591 -30 591 -38 ct 591 -165 l 591 -204 565 -227 522 -227 ct 493 -227 472 -217 460 -198 ct 453 -186 450 -175 449 -153 ct 477 -153 l p 561 -76 m 561 -48 535 -24 504 -24 ct 484 -24 472 -38 472 -61 ct 472 -83 483 -94 511 -98 ct 546 -104 554 -107 561 -112 ct 561 -76 l p ef 642 87 m 672 87 l 672 -24 l 685 -2 699 6 722 6 ct 770 6 801 -42 801 -115 ct 801 -182 771 -227 726 -227 ct 701 -227 687 -217 671 -188 ct 671 -221 l 642 -221 l 642 87 l p 721 -194 m 752 -194 769 -166 769 -114 ct 769 -58 751 -26 720 -26 ct 690 -26 671 -55 671 -103 ct 671 -163 688 -194 721 -194 ct p ef 906 -190 m 906 -221 l 876 -221 l 876 -282 l 846 -282 l 846 -221 l 821 -221 l 821 -190 l 846 -190 l 846 -44 l 846 -12 857 2 881 2 ct 883 2 885 2 892 1 ct 894 1 899 0 905 0 ct 905 -29 l 895 -29 l 881 -29 876 -34 876 -46 ct 876 -190 l 906 -190 l p ef 967 -221 m 937 -221 l 937 0 l 967 0 l 967 -221 l p 967 -261 m 967 -303 l 937 -303 l 937 -261 l 967 -261 l p ef 1076 -39 m 1029 -221 l 993 -221 l 1059 0 l 1092 0 l 1161 -221 l 1128 -221 l 1076 -39 l p ef 1309 -69 m 1306 -44 1286 -26 1262 -26 ct 1244 -26 1229 -34 1221 -49 ct 1213 -61 1211 -73 1210 -98 ct 1342 -98 l 1341 -142 1337 -162 1327 -184 ct 1313 -214 1293 -227 1263 -227 ct 1211 -227 1177 -180 1177 -106 ct 1177 -36 1209 6 1261 6 ct 1303 6 1332 -21 1340 -69 ct 1309 -69 l p 1210 -128 m 1212 -167 1233 -194 1262 -194 ct 1278 -194 1291 -186 1299 -173 ct 1306 -162 1309 -151 1311 -128 ct 1210 -128 l p ef 1621 -146 m 1615 -200 1593 -227 1552 -227 ct 1499 -227 1466 -180 1466 -106 ct 1466 -37 1498 6 1547 6 ct 1589 6 1614 -22 1621 -78 ct 1591 -78 l 1585 -43 1570 -26 1547 -26 ct 1516 -26 1499 -56 1499 -109 ct 1499 -163 1517 -194 1549 -194 ct 1573 -194 1586 -180 1591 -146 ct 1621 -146 l p ef 1727 -227 m 1676 -227 1642 -180 1642 -110 ct 1642 -41 1676 5 1726 5 ct 1776 5 1810 -41 1810 -110 ct 1810 -178 1776 -227 1727 -227 ct p 1727 -195 m 1758 -195 1778 -161 1778 -110 ct 1778 -59 1758 -26 1726 -26 ct 1694 -26 1673 -59 1673 -110 ct 1673 -162 1694 -195 1727 -195 ct p ef 1998 -303 m 1967 -303 l 1967 -187 l 1953 -216 1937 -227 1912 -227 ct 1867 -227 1837 -182 1837 -115 ct 1837 -41 1868 6 1916 6 ct 1941 6 1956 -4 1969 -31 ct 1969 0 l 1998 0 l 1998 -303 l p 1918 -194 m 1949 -194 1967 -162 1967 -104 ct 1967 -76 1962 -57 1951 -43 ct 1942 -32 1930 -26 1917 -26 ct 1886 -26 1868 -58 1868 -113 ct 1868 -167 1885 -194 1918 -194 ct p ef 2164 -69 m 2161 -44 2141 -26 2117 -26 ct 2099 -26 2084 -34 2076 -49 ct 2068 -61 2066 -73 2065 -98 ct 2197 -98 l 2196 -142 2192 -162 2182 -184 ct 2168 -214 2148 -227 2118 -227 ct 2066 -227 2032 -180 2032 -106 ct 2032 -36 2064 6 2116 6 ct 2158 6 2187 -21 2195 -69 ct 2164 -69 l p 2065 -128 m 2067 -167 2088 -194 2117 -194 ct 2133 -194 2146 -186 2154 -173 ct 2161 -162 2164 -151 2166 -128 ct 2065 -128 l p ef 2263 0 m 2263 -28 l 2276 -3 2290 6 2314 6 ct 2362 6 2393 -41 2393 -115 ct 2393 -182 2363 -227 2318 -227 ct 2296 -227 2280 -217 2264 -192 ct 2264 -303 l 2234 -303 l 2234 0 l 2263 0 l p 2313 -194 m 2345 -194 2361 -167 2361 -113 ct 2361 -58 2343 -26 2312 -26 ct 2300 -26 2288 -32 2279 -43 ct 2268 -57 2263 -76 2263 -105 ct 2263 -163 2280 -194 2313 -194 ct p ef 2506 -227 m 2455 -227 2421 -180 2421 -110 ct 2421 -41 2455 5 2505 5 ct 2555 5 2589 -41 2589 -110 ct 2589 -178 2555 -227 2506 -227 ct p 2506 -195 m 2537 -195 2557 -161 2557 -110 ct 2557 -59 2537 -26 2505 -26 ct 2473 -26 2452 -59 2452 -110 ct 2452 -162 2473 -195 2506 -195 ct p ef 2701 -227 m 2650 -227 2616 -180 2616 -110 ct 2616 -41 2650 5 2700 5 ct 2750 5 2784 -41 2784 -110 ct 2784 -178 2750 -227 2701 -227 ct p 2701 -195 m 2732 -195 2752 -161 2752 -110 ct 2752 -59 2732 -26 2700 -26 ct 2668 -26 2647 -59 2647 -110 ct 2647 -162 2668 -195 2701 -195 ct p ef 2898 -138 m 2967 -221 l 2929 -221 l 2850 -127 l 2850 -303 l 2821 -303 l 2821 0 l 2850 0 l 2850 -83 l 2876 -111 l 2932 0 l 2971 0 l 2898 -138 l p ef 3242 -221 m 3213 -221 l 3213 -188 l 3196 -217 3182 -227 3157 -227 ct 3112 -227 3082 -182 3082 -115 ct 3082 -42 3114 6 3162 6 ct 3184 6 3199 -2 3211 -24 ct 3211 -15 l 3211 11 3209 25 3203 37 ct 3195 54 3181 62 3159 62 ct 3136 62 3124 52 3118 27 ct 3088 27 l 3093 55 3099 68 3113 79 ct 3125 88 3140 93 3158 93 ct 3189 93 3213 80 3227 57 ct 3237 39 3242 17 3242 -18 ct 3242 -221 l p 3164 -194 m 3195 -194 3212 -162 3212 -104 ct 3212 -55 3194 -26 3162 -26 ct 3132 -26 3114 -58 3114 -113 ct 3114 -167 3131 -194 3164 -194 ct p ef 3313 -153 m 3317 -184 3329 -196 3356 -196 ct 3383 -196 3398 -184 3398 -159 ct 3398 -143 3393 -136 3382 -134 ct 3331 -126 l 3296 -121 3276 -96 3276 -58 ct 3276 -19 3299 6 3334 6 ct 3360 6 3379 -4 3398 -29 ct 3401 -5 3409 4 3430 4 ct 3434 4 3438 3 3444 1 ct 3446 0 3446 0 3448 0 ct 3448 -27 l 3441 -25 3439 -25 3437 -25 ct 3431 -25 3427 -30 3427 -38 ct 3427 -165 l 3427 -204 3401 -227 3358 -227 ct 3329 -227 3308 -217 3296 -198 ct 3289 -186 3286 -175 3285 -153 ct 3313 -153 l p 3397 -76 m 3397 -48 3371 -24 3340 -24 ct 3320 -24 3308 -38 3308 -61 ct 3308 -83 3319 -94 3347 -98 ct 3382 -104 3390 -107 3397 -112 ct 3397 -76 l p ef 3512 -221 m 3482 -221 l 3482 0 l 3512 0 l 3512 -221 l p 3512 -261 m 3512 -303 l 3482 -303 l 3482 -261 l 3512 -261 l p ef 3586 -221 m 3557 -221 l 3557 0 l 3587 0 l 3587 -120 l 3587 -166 3606 -194 3637 -194 ct 3663 -194 3675 -176 3675 -136 ct 3675 0 l 3705 0 l 3705 -150 l 3705 -199 3682 -227 3644 -227 ct 3619 -227 3601 -216 3586 -188 ct 3586 -221 l p ef pom gr 0 lw 1 lj 11185 19818 m 9435 19818 l 9435 18318 l 12935 18318 l 12935 19818 l 11185 19818 l pc gs pum 10523 19288 t 41 0 m 191 0 l 234 0 272 -17 297 -48 ct 332 -92 351 -157 351 -233 ct 351 -368 289 -455 193 -455 ct 41 -455 l 41 0 l p 92 -403 m 187 -403 l 259 -403 299 -341 299 -227 ct 299 -119 257 -52 190 -52 ct 92 -52 l 92 -403 l p ef 596 -104 m 591 -66 561 -39 524 -39 ct 497 -39 476 -51 462 -74 ct 451 -92 448 -110 446 -147 ct 645 -147 l 643 -213 637 -244 622 -277 ct 601 -321 570 -341 526 -341 ct 448 -341 397 -271 397 -160 ct 397 -55 445 9 523 9 ct 585 9 629 -32 641 -104 ct 596 -104 l p 446 -192 m 449 -252 481 -292 524 -292 ct 548 -292 568 -280 580 -260 ct 591 -243 595 -226 597 -192 ct 446 -192 l p ef 745 -455 m 699 -455 l 699 0 l 745 0 l 745 -455 l p ef 853 -231 m 859 -277 877 -295 917 -295 ct 958 -295 980 -276 980 -240 ct 980 -215 973 -204 956 -201 ct 880 -190 l 827 -182 798 -145 798 -87 ct 798 -29 832 9 885 9 ct 923 9 951 -6 981 -44 ct 984 -8 997 6 1028 6 ct 1035 6 1040 5 1049 1 ct 1052 0 1053 0 1055 0 ct 1055 -40 l 1045 -38 1043 -38 1039 -38 ct 1029 -38 1024 -45 1024 -57 ct 1024 -248 l 1024 -306 985 -341 920 -341 ct 878 -341 845 -326 827 -297 ct 817 -280 813 -264 811 -231 ct 853 -231 l p 979 -114 m 979 -73 940 -36 894 -36 ct 863 -36 845 -57 845 -92 ct 845 -125 862 -141 904 -148 ct 956 -157 969 -160 979 -169 ct 979 -114 l p ef 1197 -59 m 1124 -332 l 1072 -332 l 1173 8 l 1168 24 1164 38 1162 43 ct 1152 76 1144 85 1125 85 ct 1115 85 1106 83 1097 80 ct 1097 130 l 1101 132 l 1109 135 1113 135 1119 135 ct 1174 135 1182 125 1223 -6 ct 1321 -332 l 1270 -332 l 1197 -59 l p ef pom gr 13385 18918 m 13385 19218 l 12935 19068 l 13385 18918 l p ef 1 lw 0 lj 14935 14567 m 14935 19068 l 13295 19068 l ps 7085 18268 m 6785 18268 l 6935 17818 l 7085 18268 l p ef 9435 19068 m 6935 19068 l 6935 18178 l ps 20025 14718 m 20031 14418 l 20478 14577 l 20025 14718 l p ef 19335 14568 m 20127 14568 l ps gs pum 10179 20249 t 63 -128 m 141 -128 l 186 -128 215 -163 215 -217 ct 215 -269 186 -303 141 -303 ct 30 -303 l 30 0 l 63 0 l 63 -128 l p 63 -268 m 131 -268 l 164 -268 181 -251 181 -216 ct 181 -181 164 -163 130 -163 ct 63 -163 l 63 -268 l p ef 282 -153 m 286 -184 298 -196 325 -196 ct 352 -196 367 -184 367 -159 ct 367 -143 362 -136 351 -134 ct 300 -126 l 265 -121 245 -96 245 -58 ct 245 -19 268 6 303 6 ct 329 6 348 -4 367 -29 ct 370 -5 378 4 399 4 ct 403 4 407 3 413 1 ct 415 0 415 0 417 0 ct 417 -27 l 410 -25 408 -25 406 -25 ct 400 -25 396 -30 396 -38 ct 396 -165 l 396 -204 370 -227 327 -227 ct 298 -227 277 -217 265 -198 ct 258 -186 255 -175 254 -153 ct 282 -153 l p 366 -76 m 366 -48 340 -24 309 -24 ct 289 -24 277 -38 277 -61 ct 277 -83 288 -94 316 -98 ct 351 -104 359 -107 366 -112 ct 366 -76 l p ef 582 -158 m 580 -202 555 -227 514 -227 ct 472 -227 444 -200 444 -157 ct 444 -129 458 -111 486 -103 ct 522 -92 l 550 -84 558 -77 558 -60 ct 558 -39 542 -26 515 -26 ct 484 -26 470 -39 468 -71 ct 439 -71 l 440 -49 442 -38 448 -27 ct 460 -5 483 6 513 6 ct 559 6 588 -22 588 -66 ct 588 -97 574 -113 537 -125 ct 507 -134 l 480 -142 474 -148 474 -163 ct 474 -183 488 -195 512 -195 ct 538 -195 551 -183 553 -158 ct 582 -158 l p ef 690 -190 m 690 -221 l 660 -221 l 660 -282 l 630 -282 l 630 -221 l 605 -221 l 605 -190 l 630 -190 l 630 -44 l 630 -12 641 2 665 2 ct 667 2 669 2 676 1 ct 678 1 683 0 689 0 ct 689 -29 l 679 -29 l 665 -29 660 -34 660 -46 ct 660 -190 l 690 -190 l p ef 950 -158 m 948 -202 923 -227 882 -227 ct 840 -227 812 -200 812 -157 ct 812 -129 826 -111 854 -103 ct 890 -92 l 918 -84 926 -77 926 -60 ct 926 -39 910 -26 883 -26 ct 852 -26 838 -39 836 -71 ct 807 -71 l 808 -49 810 -38 816 -27 ct 828 -5 851 6 881 6 ct 927 6 956 -22 956 -66 ct 956 -97 942 -113 905 -125 ct 875 -134 l 848 -142 842 -148 842 -163 ct 842 -183 856 -195 880 -195 ct 906 -195 919 -183 921 -158 ct 950 -158 l p ef 1138 0 m 1138 -221 l 1108 -221 l 1108 -99 l 1108 -54 1088 -26 1058 -26 ct 1034 -26 1023 -42 1023 -74 ct 1023 -221 l 992 -221 l 992 -62 l 992 -19 1015 6 1052 6 ct 1079 6 1093 -3 1109 -34 ct 1109 0 l 1138 0 l p ef 1213 0 m 1213 -28 l 1226 -3 1240 6 1264 6 ct 1312 6 1343 -41 1343 -115 ct 1343 -182 1313 -227 1268 -227 ct 1246 -227 1230 -217 1214 -192 ct 1214 -303 l 1184 -303 l 1184 0 l 1213 0 l p 1263 -194 m 1295 -194 1311 -167 1311 -113 ct 1311 -58 1293 -26 1262 -26 ct 1250 -26 1238 -32 1229 -43 ct 1218 -57 1213 -76 1213 -105 ct 1213 -163 1230 -194 1263 -194 ct p ef 1449 -190 m 1449 -221 l 1419 -221 l 1419 -248 l 1419 -266 1424 -274 1437 -274 ct 1440 -274 1444 -274 1449 -273 ct 1449 -307 l 1440 -307 1438 -307 1435 -307 ct 1405 -307 1389 -291 1389 -259 ct 1389 -221 l 1363 -221 l 1363 -190 l 1389 -190 l 1389 0 l 1419 0 l 1419 -190 l 1449 -190 l p ef 1571 -188 m 1571 -226 l 1568 -227 1565 -227 1563 -227 ct 1541 -227 1527 -215 1511 -183 ct 1511 -221 l 1482 -221 l 1482 0 l 1513 0 l 1513 -129 l 1513 -163 1532 -188 1559 -188 ct 1571 -188 l p ef 1620 -153 m 1624 -184 1636 -196 1663 -196 ct 1690 -196 1705 -184 1705 -159 ct 1705 -143 1700 -136 1689 -134 ct 1638 -126 l 1603 -121 1583 -96 1583 -58 ct 1583 -19 1606 6 1641 6 ct 1667 6 1686 -4 1705 -29 ct 1708 -5 1716 4 1737 4 ct 1741 4 1745 3 1751 1 ct 1753 0 1753 0 1755 0 ct 1755 -27 l 1748 -25 1746 -25 1744 -25 ct 1738 -25 1734 -30 1734 -38 ct 1734 -165 l 1734 -204 1708 -227 1665 -227 ct 1636 -227 1615 -217 1603 -198 ct 1596 -186 1593 -175 1592 -153 ct 1620 -153 l p 1704 -76 m 1704 -48 1678 -24 1647 -24 ct 1627 -24 1615 -38 1615 -61 ct 1615 -83 1626 -94 1654 -98 ct 1689 -104 1697 -107 1704 -112 ct 1704 -76 l p ef 1787 0 m 1817 0 l 1817 -120 l 1817 -165 1836 -194 1866 -194 ct 1883 -194 1894 -179 1894 -153 ct 1894 0 l 1924 0 l 1924 -134 l 1924 -168 1943 -194 1968 -194 ct 1990 -194 2001 -177 2001 -142 ct 2001 0 l 2031 0 l 2031 -153 l 2031 -199 2009 -227 1974 -227 ct 1952 -227 1940 -219 1920 -191 ct 1908 -217 1894 -227 1872 -227 ct 1848 -227 1831 -216 1816 -188 ct 1816 -221 l 1787 -221 l 1787 0 l p ef 2198 -69 m 2195 -44 2175 -26 2151 -26 ct 2133 -26 2118 -34 2110 -49 ct 2102 -61 2100 -73 2099 -98 ct 2231 -98 l 2230 -142 2226 -162 2216 -184 ct 2202 -214 2182 -227 2152 -227 ct 2100 -227 2066 -180 2066 -106 ct 2066 -36 2098 6 2150 6 ct 2192 6 2221 -21 2229 -69 ct 2198 -69 l p 2099 -128 m 2101 -167 2122 -194 2151 -194 ct 2167 -194 2180 -186 2188 -173 ct 2195 -162 2198 -151 2200 -128 ct 2099 -128 l p ef pom gr tm setmatrix 0 0 t 1 1 s 0 11113 t pom count op_count sub {pop} repeat countdictstack dict_count sub {end} repeat b4_inc_state restore %%PageTrailer %%Trailer %%EOF mumble-1.3.4/3rdparty/speex-src/symbian/0000775000175000017500000000000014010707304017757 5ustar builderbuildermumble-1.3.4/3rdparty/speex-src/symbian/Makefile.am0000664000175000017500000000035214010707304022013 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies EXTRA_DIST = bld.inf config.h speex.mmp mumble-1.3.4/3rdparty/speex-src/symbian/speex.mmp0000664000175000017500000000450614010707304021623 0ustar builderbuilder/* Copyright (C) 2003 Commonwealth Scientific and Industrial Research Organisation (CSIRO) Australia Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of CSIRO Australia nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ORGANISATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ TARGET speex.lib TARGETTYPE lib UID 0 MACRO HAVE_CONFIG_H SOURCEPATH ..\libspeex SOURCE bits.c cb_search.c exc_5_64_table.c exc_5_256_table.c exc_8_128_table.c SOURCE exc_10_16_table.c exc_10_32_table.c exc_20_32_table.c fftwrap.c kiss_fft.c kiss_fftr.c filters.c gain_table.c SOURCE gain_table_lbr.c hexc_10_32_table.c hexc_table.c high_lsp_tables.c SOURCE lbr_48k_tables.c lpc.c lsp.c lsp_tables_nb.c ltp.c math_approx.c misc.c SOURCE modes.c nb_celp.c quant_lsp.c sb_celp.c smallft.c SOURCE speex.c speex_callbacks.c speex_header.c stereo.c vbr.c vq.c window.c USERINCLUDE . ..\include\speex SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\include mumble-1.3.4/3rdparty/speex-src/symbian/bld.inf0000664000175000017500000000424514010707304021223 0ustar builderbuilder/* Copyright (C) 2003 Commonwealth Scientific and Industrial Research Organisation (CSIRO) Australia Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of CSIRO Australia nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ORGANISATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ PRJ_EXPORTS ..\include\speex\speex_bits.h \epoc32\include\speex\speex_bits.h ..\include\speex\speex_callbacks.h \epoc32\include\speex\speex_callbacks.h ..\include\speex\speex_config_types.h \epoc32\include\speex\speex_config_types.h ..\include\speex\speex.h \epoc32\include\speex\speex.h ..\include\speex\speex_header.h \epoc32\include\speex\speex_header.h ..\include\speex\speex_stereo.h \epoc32\include\speex\speex_stereo.h ..\include\speex\speex_types.h \epoc32\include\speex\speex_types.h PRJ_MMPFILES speex.mmp mumble-1.3.4/3rdparty/speex-src/symbian/config.h0000664000175000017500000000457714010707304021412 0ustar builderbuilder/* Copyright (C) 2003 Commonwealth Scientific and Industrial Research Organisation (CSIRO) Australia Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of CSIRO Australia nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ORGANISATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef CONFIG_H #define CONFIG_H /* An inline macro is required for use of the inline keyword as not all C compilers support */ /* inline. It is officially C99 and C++ only */ #ifdef __WINS__ #define inline __inline /* Disable some pointless/stupid warnings */ #pragma warning(disable: 4100) /* unreferenced formal parameter */ #pragma warning(disable: 4127) /* conditional expression is constant */ #pragma warning(disable: 4305) /* truncation from '...' to '...' */ #pragma warning(disable: 4244) /* conversion from '...' to '...', possible loss of data */ #pragma warning(disable: 4701) /* local variable may be be used without having been initialized */ #endif /* ! __WINS__ */ /* Use only fixed point arithmetic */ #define FIXED_POINT 1 #endif /* ! CONFIG_H */ mumble-1.3.4/3rdparty/speex-src/configure.ac0000664000175000017500000002367514010707304020620 0ustar builderbuilderdnl Process this file with autoconf to produce a configure script. -*-m4-*- AC_INIT([speex],[1.2rc2],[speex-dev@xiph.org]) AC_CONFIG_SRCDIR([libspeex/speex.c]) AC_CONFIG_MACRO_DIR([m4]) dnl enable silent rules on automake 1.11 and later m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) SPEEX_MAJOR_VERSION=1 SPEEX_MINOR_VERSION=1 SPEEX_MICRO_VERSION=16 SPEEX_EXTRA_VERSION= SPEEX_LT_CURRENT=6 SPEEX_LT_REVISION=0 SPEEX_LT_AGE=5 AC_SUBST(SPEEX_LT_CURRENT) AC_SUBST(SPEEX_LT_REVISION) AC_SUBST(SPEEX_LT_AGE) AM_INIT_AUTOMAKE([foreign no-define]) AM_MAINTAINER_MODE([enable]) AC_CANONICAL_HOST AC_LIBTOOL_WIN32_DLL AM_PROG_LIBTOOL AC_C_BIGENDIAN AC_C_CONST AC_C_INLINE AC_C_RESTRICT AC_MSG_CHECKING(for C99 variable-size arrays) AC_TRY_COMPILE( , [ int foo; foo = 10; int array[foo]; ], [has_var_arrays=yes;AC_DEFINE([VAR_ARRAYS], [], [Use C99 variable-size arrays]) ], has_var_arrays=no ) AC_MSG_RESULT($has_var_arrays) AC_CHECK_HEADERS([alloca.h getopt.h]) AC_MSG_CHECKING(for alloca) AC_TRY_COMPILE( [ #ifdef HAVE_ALLOCA_H # include #endif #include ], [ int foo=10; int *array = alloca(foo); ], [ has_alloca=yes; if test x$has_var_arrays = "xno" ; then AC_DEFINE([USE_ALLOCA], [], [Make use of alloca]) fi ], has_alloca=no ) AC_MSG_RESULT($has_alloca) AC_MSG_CHECKING(for SSE in current arch/CFLAGS) AC_LINK_IFELSE([ AC_LANG_PROGRAM([[ #include __m128 testfunc(float *a, float *b) { return _mm_add_ps(_mm_loadu_ps(a), _mm_loadu_ps(b)); } ]])], [ has_sse=yes ], [ has_sse=no ] ) AC_MSG_RESULT($has_sse) SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -fvisibility=hidden" AC_MSG_CHECKING(for ELF visibility) AC_COMPILE_IFELSE([ AC_LANG_PROGRAM([[ #pragma GCC visibility push(hidden) __attribute__((visibility("default"))) int var=10; ]])], [ has_visibility=yes AC_DEFINE([EXPORT], [__attribute__((visibility("default")))], [Symbol visibility prefix]) ], [ has_visibility=no AC_DEFINE([EXPORT], [], [Symbol visibility prefix]) CFLAGS="$SAVE_CFLAGS" ] ) AC_MSG_RESULT($has_visibility) AC_CHECK_HEADERS(sys/soundcard.h sys/audioio.h) LT_LIB_M # Check for getopt_long; if not found, use included source. AC_CHECK_FUNCS([getopt_long],, [# FreeBSD has a gnugetopt library. AC_CHECK_LIB([gnugetopt],[getopt_long], [AC_DEFINE([HAVE_GETOPT_LONG])], [# Use the GNU replacement. AC_LIBOBJ(getopt) AC_LIBOBJ(getopt1)])]) SPEEX_VERSION=$PACKAGE_VERSION AC_SUBST(SPEEX_VERSION) AC_DEFINE_UNQUOTED(SPEEX_VERSION, "${PACKAGE_VERSION}", [Complete version string]) AC_DEFINE_UNQUOTED(SPEEX_MAJOR_VERSION, ${SPEEX_MAJOR_VERSION}, [Version major]) AC_DEFINE_UNQUOTED(SPEEX_MINOR_VERSION, ${SPEEX_MINOR_VERSION}, [Version minor]) AC_DEFINE_UNQUOTED(SPEEX_MICRO_VERSION, ${SPEEX_MICRO_VERSION}, [Version micro]) AC_DEFINE_UNQUOTED(SPEEX_EXTRA_VERSION, "${SPEEX_EXTRA_VERSION}", [Version extra]) AC_ARG_ENABLE(valgrind, [ --enable-valgrind Enable valgrind extra checks], [if test "$enableval" = yes; then AC_DEFINE([ENABLE_VALGRIND], , [Enable valgrind extra checks]) fi]) AC_ARG_ENABLE(sse, [ --enable-sse Enable SSE support], [ if test "x$enableval" != xno; then has_sse=yes CFLAGS="$CFLAGS -O3 -msse" else has_sse=no fi ]) FFT=smallft AC_ARG_ENABLE(fixed-point, [ --enable-fixed-point Compile as fixed-point], [if test "$enableval" = yes; then FFT=kiss has_sse=no AC_DEFINE([FIXED_POINT], , [Compile as fixed-point]) else AC_DEFINE([FLOATING_POINT], , [Compile as floating-point]) fi], AC_DEFINE([FLOATING_POINT], , [Compile as floating-point])) if test "$has_sse" = yes; then AC_DEFINE([_USE_SSE], , [Enable SSE support]) fi AC_ARG_ENABLE(float-api, [ --disable-float-api Disable the floating-point API], [if test "$enableval" = no; then AC_DEFINE([DISABLE_FLOAT_API], , [Disable all parts of the API that are using floats]) fi]) AC_ARG_ENABLE(binaries, [ --disable-binaries Do not build the encoder and decoder programs, only the library]) if test "$enableval" != no; then PKG_CHECK_MODULES([OGG], [ogg], AM_CONDITIONAL([BUILD_BINARIES], true), AM_CONDITIONAL([BUILD_BINARIES], false)) else AM_CONDITIONAL([BUILD_BINARIES], false) fi AC_ARG_ENABLE(vbr, [ --disable-vbr Disable VBR and VAD from the codec], [if test "$enableval" = no; then AC_DEFINE([DISABLE_VBR], , [Disable VBR and VAD from the codec]) fi]) AC_ARG_ENABLE(arm4-asm, [ --enable-arm4-asm Make use of ARM4 assembly optimizations], [if test "$enableval" = yes; then AC_DEFINE([ARM4_ASM], , [Make use of ARM4 assembly optimizations]) fi]) AC_ARG_ENABLE(arm5e-asm, [ --enable-arm5e-asm Make use of ARM5E assembly optimizations], [if test "$enableval" = yes; then AC_DEFINE([ARM5E_ASM], , [Make use of ARM5E assembly optimizations]) fi]) AC_ARG_ENABLE(blackfin-asm, [ --enable-blackfin-asm Make use of Blackfin assembly optimizations], [if test "$enableval" = yes; then AC_DEFINE([BFIN_ASM], , [Make use of Blackfin assembly optimizations]) fi]) case $host_os in uclinux) LDFLAGS="-Wl,-elf2flt=-s100000 $LDFLAGS";; esac AC_ARG_ENABLE(fixed-point-debug, [ --enable-fixed-point-debug Debug fixed-point implementation], [if test "$enableval" = yes; then AC_DEFINE([FIXED_DEBUG], , [Debug fixed-point implementation]) fi]) AC_ARG_ENABLE(ti-c55x, [ --enable-ti-c55x Enable support for TI C55X DSP], [if test "$enableval" = yes; then has_char16=yes; AC_DEFINE([TI_C55X], , [Enable support for TI C55X DSP]) fi]) AC_ARG_ENABLE(vorbis-psy, [ --enable-vorbis-psy Enable the Vorbis psy model], [if test "$enableval" = yes; then vorbis_psy=yes; AC_DEFINE([VORBIS_PSYCHO], , [Enable support for the Vorbis psy model]) fi]) AC_ARG_WITH([fft], [AS_HELP_STRING([--with-fft=choice],[use an alternate FFT implementation. The available choices are kiss (default fixed point), smallft (default floating point), gpl-fftw3 and proprietary-intel-mkl])], [FFT=$withval] ) FFT_PKGCONFIG= AS_CASE([$FFT], [kiss], [ AC_DEFINE([USE_KISS_FFT], [], [Use KISS Fast Fourier Transform]) ], [smallft], [ AC_DEFINE([USE_SMALLFT], [], [Use FFT from OggVorbis]) ], [gpl-fftw3], [ AC_DEFINE([USE_GPL_FFTW3], [], [Use FFTW3 for FFT]) PKG_CHECK_MODULES([FFT], [fftw3f]) ], [proprietary-intel-mkl], [ AC_DEFINE([USE_INTEL_MKL], [], [Use Intel Math Kernel Library for FFT]) AC_MSG_CHECKING(for valid MKL) AC_LINK_IFELSE([ AC_LANG_PROGRAM([[ #include void func() { DFTI_DESCRIPTOR_HANDLE h; MKL_LONG result=DftiCreateDescriptor(&h, DFTI_SINGLE, DFTI_REAL, 0); }]])], [AC_MSG_RESULT(yes)], [AC_MSG_FAILURE([Failed to compile MKL test program. Make sure you set CFLAGS to include the include directory and set LDFLAGS to include the library directory and all necesarry libraries.])] ) ], [AC_MSG_FAILURE([Unknown FFT $FFT specified for --with-fft])] ) AM_CONDITIONAL(BUILD_KISS_FFT, [test "$FFT" = "kiss"]) AM_CONDITIONAL(BUILD_SMALLFT, [test "$FFT" = "smallft"]) AC_SUBST(FFT_PKGCONFIG) AM_CONDITIONAL(BUILD_VORBIS_PSY, [test "x$vorbis_psy" = "xyes"]) PKG_CHECK_MODULES([SPEEXDSP], [speexdsp], [AC_DEFINE([USE_SPEEXDSP], [], [Use SpeexDSP library])], [speexdsp_failed=yes]) AC_CHECK_SIZEOF([int16_t]) AC_CHECK_SIZEOF([uint16_t]) AC_CHECK_SIZEOF([u_int16_t]) AC_CHECK_SIZEOF([int32_t]) AC_CHECK_SIZEOF([uint32_t]) AC_CHECK_SIZEOF([u_int32_t]) AC_CHECK_SIZEOF([short]) AC_CHECK_SIZEOF([int]) AC_CHECK_SIZEOF([long]) AS_IF([test "$has_char16" = "yes"], [ SIZEOF16=1 SIZEOF32=2 ],[ SIZEOF16=2 SIZEOF32=4 ]) case $SIZEOF16 in $ac_cv_sizeof_int16_t) SIZE16="int16_t";; $ac_cv_sizeof_short) SIZE16="short";; $ac_cv_sizeof_int) SIZE16="int";; esac case $SIZEOF16 in $ac_cv_sizeof_uint16_t) USIZE16="uint16_t";; $ac_cv_sizeof_u_int16_t) USIZE16="u_int16_t";; $ac_cv_sizeof_short) USIZE16="unsigned short";; $ac_cv_sizeof_int) USIZE16="unsigned int";; esac case $SIZEOF32 in $ac_cv_sizeof_int32_t) SIZE32="int32_t";; $ac_cv_sizeof_int) SIZE32="int";; $ac_cv_sizeof_long) SIZE32="long";; $ac_cv_sizeof_short) SIZE32="short";; esac case $SIZEOF32 in $ac_cv_sizeof_uint32_t) USIZE32="uint32_t";; $ac_cv_sizeof_u_int32_t) USIZE32="u_int32_t";; $ac_cv_sizeof_short) USIZE32="unsigned short";; $ac_cv_sizeof_int) USIZE32="unsigned int";; $ac_cv_sizeof_long) USIZE32="unsigned long";; esac AS_IF([test -z "$SIZE16"],[AC_MSG_ERROR([No 16 bit type found on this platform!])]) AS_IF([test -z "$SIZE32"],[AC_MSG_ERROR([No 32 bit type found on this platform!])]) AS_IF([test -z "$USIZE16"],[AC_MSG_ERROR([No unsigned 16 bit type found on this platform!])]) AS_IF([test -z "$USIZE32"],[AC_MSG_ERROR([No unsigned 32 bit type found on this platform!])]) AC_SUBST([SIZE16]) AC_SUBST([USIZE16]) AC_SUBST([SIZE32]) AC_SUBST([USIZE32]) AS_IF([test "$ac_cv_header_stdint_h" = "yes"], [INCLUDE_STDINT="#include "], [test "$ac_cv_header_inttypes_h" = "yes"], [INCLUDE_STDINT="#include "], [test "$ac_cv_header_sys_types_h" = "yes"], [INCLUDE_STDINT="#include "]) AC_SUBST([INCLUDE_STDINT]) AC_CONFIG_FILES([ Makefile libspeex/Makefile src/Makefile doc/Makefile Speex.spec include/Makefile include/speex/Makefile speex.pc win32/Makefile win32/libspeex/Makefile win32/speexenc/Makefile win32/speexdec/Makefile symbian/Makefile win32/VS2003/Makefile win32/VS2003/tests/Makefile win32/VS2003/libspeex/Makefile win32/VS2003/speexdec/Makefile win32/VS2003/speexenc/Makefile win32/VS2005/Makefile win32/VS2005/libspeex/Makefile win32/VS2005/speexdec/Makefile win32/VS2005/speexenc/Makefile win32/VS2005/tests/Makefile win32/VS2008/Makefile win32/VS2008/speexdec/Makefile win32/VS2008/tests/Makefile win32/VS2008/libspeex/Makefile win32/VS2008/speexenc/Makefile include/speex/speex_config_types.h ti/Makefile ti/speex_C54_test/Makefile ti/speex_C55_test/Makefile ti/speex_C64_test/Makefile ]) AC_CONFIG_HEADERS([config.h]) AC_OUTPUT echo "Type \"make; make install\" to compile and install Speex"; mumble-1.3.4/3rdparty/speex-src/NEWS0000664000175000017500000000005414010707304017013 0ustar builderbuilder2002/02/13: Creation of the "Speex" project mumble-1.3.4/3rdparty/mach-override-build/0000775000175000017500000000000014010707273020233 5ustar builderbuildermumble-1.3.4/3rdparty/mach-override-build/mach-override-build.pro0000664000175000017500000000160214010707273024576 0ustar builderbuilderinclude(../../qmake/compiler.pri) BUILDDIR=$$basename(PWD) SOURCEDIR=$$replace(BUILDDIR,-build,-src) !exists(../$$SOURCEDIR/README.markdown) { message("The $$SOURCEDIR/ directory was not found. Please update your submodules (git submodule update --init).") error("Aborting configuration") } TEMPLATE = lib CONFIG -= qt CONFIG += debug_and_release CONFIG += staticlib CONFIG += x86_64 x86 !CONFIG(third-party-warnings) { # We ignore warnings in third party builds. We won't actually look # at them and they clutter out our warnings. CONFIG -= warn_on CONFIG += warn_off } VPATH = ../mach-override-src TARGET = mach-override INCLUDEPATH = ../mach-override-src/ ../mach-override-src/libudis86 SOURCES *= \ mach_override.c \ libudis86/decode.c \ libudis86/input.c \ libudis86/itab.c \ libudis86/syn-att.c \ libudis86/syn-intel.c \ libudis86/syn.c \ libudis86/udis86.c mumble-1.3.4/3rdparty/celt-0.7.0-src/0000775000175000017500000000000014010707311016556 5ustar builderbuildermumble-1.3.4/3rdparty/celt-0.7.0-src/AUTHORS0000664000175000017500000000000014010707311017614 0ustar builderbuildermumble-1.3.4/3rdparty/celt-0.7.0-src/Doxyfile.devel0000664000175000017500000002403714010707311021370 0ustar builderbuilder# Doxyfile 1.5.3 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- DOXYFILE_ENCODING = UTF-8 PROJECT_NAME = CELT PROJECT_NUMBER = 0.7.0 OUTPUT_DIRECTORY = doc/devel CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class " \ "The $name widget " \ "The $name file " \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = YES STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO QT_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES SEPARATE_MEMBER_PAGES = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = YES OPTIMIZE_OUTPUT_JAVA = NO BUILTIN_STL_SUPPORT = NO CPP_CLI_SUPPORT = NO DISTRIBUTE_GROUP_DOC = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = NO EXTRACT_STATIC = NO EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO EXTRACT_ANON_NSPACES = NO HIDE_UNDOC_MEMBERS = YES HIDE_UNDOC_CLASSES = YES HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = YES HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES SHOW_DIRECTORIES = NO FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_NO_PARAMDOC = NO WARN_FORMAT = "$file:$line: $text " WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = libcelt INPUT_ENCODING = UTF-8 FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.d \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.dox \ *.py \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM \ *.PY RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXCLUDE_SYMBOLS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = YES INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = YES REFERENCES_RELATION = YES REFERENCES_LINK_SOURCE = YES USE_HTAGS = NO VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = HTML_FOOTER = HTML_STYLESHEET = HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO HTML_DYNAMIC_SECTIONS = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = YES LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = YES USE_PDFLATEX = YES LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = YES MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO MSCGEN_PATH = HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES GROUP_GRAPHS = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = NO INCLUDED_BY_GRAPH = NO CALL_GRAPH = NO CALLER_GRAPH = NO GRAPHICAL_HIERARCHY = YES DIRECTORY_GRAPH = YES DOT_IMAGE_FORMAT = png DOT_PATH = DOTFILE_DIRS = DOT_GRAPH_MAX_NODES = 50 MAX_DOT_GRAPH_DEPTH = 1000 DOT_TRANSPARENT = NO DOT_MULTI_TARGETS = NO GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/0000775000175000017500000000000014010707311020174 5ustar builderbuildermumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/entdec.c0000664000175000017500000000641314010707311021606 0ustar builderbuilder/* Copyright (c) 2001-2008 Timothy B. Terriberry Copyright (c) 2008-2009 Xiph.Org Foundation */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "entdec.h" #include "os_support.h" #include "arch.h" void ec_byte_readinit(ec_byte_buffer *_b,unsigned char *_buf,long _bytes){ _b->buf=_b->ptr=_buf; _b->storage=_bytes; _b->end_ptr=_b->buf+_bytes-1; } unsigned char ec_byte_look_at_end(ec_byte_buffer *_b){ if (_b->end_ptr < _b->buf) { celt_fatal("Trying to read raw bits before the beginning of the stream"); } return *(_b->end_ptr--); } void ec_byte_adv1(ec_byte_buffer *_b){ _b->ptr++; } int ec_byte_read1(ec_byte_buffer *_b){ ptrdiff_t endbyte; endbyte=_b->ptr-_b->buf; if(endbyte>=_b->storage)return -1; else return *(_b->ptr++); } ec_uint32 ec_dec_bits(ec_dec *_this,int _ftb){ ec_uint32 t; unsigned s; t=0; while(_ftb>EC_UNIT_BITS){ s=ec_decode_raw(_this,EC_UNIT_BITS); /*ec_dec_update(_this,s,s+1,EC_UNIT_MASK+1);*/ t=t<1); _ft--; ftb=EC_ILOG(_ft); if(ftb>EC_UNIT_BITS){ ftb-=EC_UNIT_BITS; ft=(unsigned)(_ft>>ftb)+1; s=ec_decode(_this,ft); ec_dec_update(_this,s,s+1,ft); t=t<_ft) { celt_notify("uint decode error"); t = _ft; } return t; } else { _ft++; s=ec_decode(_this,(unsigned)_ft); ec_dec_update(_this,s,s+1,(unsigned)_ft); t=t<>=m; ret|=m; m=!!(_v&0xFF00)<<3; _v>>=m; ret|=m; m=!!(_v&0xF0)<<2; _v>>=m; ret|=m; m=!!(_v&0xC)<<1; _v>>=m; ret|=m; ret+=!!(_v&0x2); return ret; #endif } mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/dump_modes.c0000664000175000017500000002014414010707311022475 0ustar builderbuilder/* Copyright (c) 2008 CSIRO Copyright (c) 2008-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "modes.h" #include "celt.h" #include "rate.h" #define INT16 "%d" #define INT32 "%d" #define FLOAT "%f" #ifdef FIXED_POINT #define WORD16 INT16 #define WORD32 INT32 #else #define WORD16 FLOAT #define WORD32 FLOAT #endif void dump_modes(FILE *file, CELTMode **modes, int nb_modes) { int i, j; fprintf(file, "/* The contents of this file is automatically generated and contains static\n"); fprintf(file, " definitions for some pre-defined modes */\n"); fprintf(file, "#include \"modes.h\"\n"); fprintf(file, "#include \"rate.h\"\n"); fprintf(file, "\n"); for (i=0;iFs, mode->mdctSize); fprintf(file, "#define DEF_EBANDS%d_%d\n", mode->Fs, mode->mdctSize); fprintf (file, "static const celt_int16 eBands%d_%d[%d] = {\n", mode->Fs, mode->mdctSize, mode->nbEBands+2); for (j=0;jnbEBands+2;j++) fprintf (file, "%d, ", mode->eBands[j]); fprintf (file, "};\n"); fprintf(file, "#endif\n"); fprintf(file, "\n"); fprintf(file, "#ifndef DEF_WINDOW%d\n", mode->overlap); fprintf(file, "#define DEF_WINDOW%d\n", mode->overlap); fprintf (file, "static const celt_word16 window%d[%d] = {\n", mode->overlap, mode->overlap); for (j=0;joverlap;j++) fprintf (file, WORD16 ", ", mode->window[j]); fprintf (file, "};\n"); fprintf(file, "#endif\n"); fprintf(file, "\n"); fprintf(file, "#ifndef DEF_ALLOC_VECTORS%d_%d\n", mode->Fs, mode->mdctSize); fprintf(file, "#define DEF_ALLOC_VECTORS%d_%d\n", mode->Fs, mode->mdctSize); fprintf (file, "static const celt_int16 allocVectors%d_%d[%d] = {\n", mode->Fs, mode->mdctSize, mode->nbEBands*mode->nbAllocVectors); for (j=0;jnbAllocVectors;j++) { int k; for (k=0;knbEBands;k++) fprintf (file, "%2d, ", mode->allocVectors[j*mode->nbEBands+k]); fprintf (file, "\n"); } fprintf (file, "};\n"); fprintf(file, "#endif\n"); fprintf(file, "\n"); fprintf(file, "#ifndef DEF_ALLOC_CACHE%d_%d\n", mode->Fs, mode->mdctSize); fprintf(file, "#define DEF_ALLOC_CACHE%d_%d\n", mode->Fs, mode->mdctSize); for (j=0;jnbEBands;j++) { int k; if (j==0 || (mode->bits[j] != mode->bits[j-1])) { fprintf (file, "static const celt_int16 allocCache_band%d_%d_%d[MAX_PSEUDO] = {\n", j, mode->Fs, mode->mdctSize); for (k=0;kbits[j][k]); fprintf (file, "};\n"); } else { fprintf (file, "#define allocCache_band%d_%d_%d allocCache_band%d_%d_%d\n", j, mode->Fs, mode->mdctSize, j-1, mode->Fs, mode->mdctSize); } } fprintf (file, "static const celt_int16 *allocCache%d_%d[%d] = {\n", mode->Fs, mode->mdctSize, mode->nbEBands); for (j=0;jnbEBands;j++) { fprintf (file, "allocCache_band%d_%d_%d, ", j, mode->Fs, mode->mdctSize); } fprintf (file, "};\n"); fprintf(file, "#endif\n"); fprintf(file, "\n"); fprintf(file, "static const CELTMode mode%d_%d_%d = {\n", mode->Fs, mode->mdctSize, mode->overlap); fprintf(file, "0x%x,\t/* marker */\n", 0xa110ca7e); fprintf(file, INT32 ",\t/* Fs */\n", mode->Fs); fprintf(file, "%d,\t/* overlap */\n", mode->overlap); fprintf(file, "%d,\t/* mdctSize */\n", mode->mdctSize); fprintf(file, "%d,\t/* nbEBands */\n", mode->nbEBands); fprintf(file, "%d,\t/* pitchEnd */\n", mode->pitchEnd); fprintf(file, "eBands%d_%d,\t/* eBands */\n", mode->Fs, mode->mdctSize); fprintf(file, WORD16 ",\t/* ePredCoef */\n", mode->ePredCoef); fprintf(file, "%d,\t/* nbAllocVectors */\n", mode->nbAllocVectors); fprintf(file, "allocVectors%d_%d,\t/* allocVectors */\n", mode->Fs, mode->mdctSize); fprintf(file, "allocCache%d_%d,\t/* bits */\n", mode->Fs, mode->mdctSize); fprintf(file, "{%d, 0, 0},\t/* mdct */\n", 2*mode->mdctSize); fprintf(file, "window%d,\t/* window */\n", mode->overlap); fprintf(file, "%d,\t/* nbShortMdcts */\n", mode->nbShortMdcts); fprintf(file, "%d,\t/* shortMdctSize */\n", mode->shortMdctSize); fprintf(file, "{%d, 0, 0},\t/* shortMdct */\n", 2*mode->mdctSize); fprintf(file, "window%d,\t/* shortWindow */\n", mode->overlap); fprintf(file, "0,\t/* prob */\n"); fprintf(file, "0x%x,\t/* marker */\n", 0xa110ca7e); fprintf(file, "};\n"); } fprintf(file, "\n"); fprintf(file, "/* List of all the available modes */\n"); fprintf(file, "#define TOTAL_MODES %d\n", nb_modes); fprintf(file, "static const CELTMode * const static_mode_list[TOTAL_MODES] = {\n"); for (i=0;iFs, mode->mdctSize, mode->overlap); } fprintf(file, "};\n"); } void dump_header(FILE *file, CELTMode **modes, int nb_modes) { int i; int channels = 0; int frame_size = 0; int overlap = 0; fprintf (file, "/* This header file is generated automatically*/\n"); for (i=0;imdctSize; else if (frame_size != mode->mdctSize) frame_size = -1; if (overlap==0) overlap = mode->overlap; else if (overlap != mode->overlap) overlap = -1; } if (channels>0) { fprintf (file, "#define CHANNELS(mode) %d\n", channels); if (channels==1) fprintf (file, "#define DISABLE_STEREO\n"); } if (frame_size>0) { fprintf (file, "#define FRAMESIZE(mode) %d\n", frame_size); } if (overlap>0) { fprintf (file, "#define OVERLAP(mode) %d\n", overlap); } } int main(int argc, char **argv) { int i, nb; FILE *file; CELTMode **m; if (argc%2 != 1) { fprintf (stderr, "must have a multiple of 2 arguments\n"); return 1; } nb = (argc-1)/2; m = malloc(nb*sizeof(CELTMode*)); for (i=0;i # else # ifdef HAVE_ALLOCA_H # include # else # include # endif # endif #endif /** * @def ALIGN(stack, size) * * Aligns the stack to a 'size' boundary * * @param stack Stack * @param size New size boundary */ /** * @def PUSH(stack, size, type) * * Allocates 'size' elements of type 'type' on the stack * * @param stack Stack * @param size Number of elements * @param type Type of element */ /** * @def VARDECL(var) * * Declare variable on stack * * @param var Variable to declare */ /** * @def ALLOC(var, size, type) * * Allocate 'size' elements of 'type' on stack * * @param var Name of variable to allocate * @param size Number of elements * @param type Type of element */ #if defined(VAR_ARRAYS) #define VARDECL(type, var) #define ALLOC(var, size, type) type var[size] #define SAVE_STACK #define RESTORE_STACK #define ALLOC_STACK #elif defined(USE_ALLOCA) #define VARDECL(type, var) type *var #define ALLOC(var, size, type) var = ((type*)alloca(sizeof(type)*(size))) #define SAVE_STACK #define RESTORE_STACK #define ALLOC_STACK #else #ifdef CELT_C char *global_stack=0; #else extern char *global_stack; #endif /*CELT_C*/ #ifdef ENABLE_VALGRIND #include #ifdef CELT_C char *global_stack_top=0; #else extern char *global_stack_top; #endif /*CELT_C*/ #define ALIGN(stack, size) ((stack) += ((size) - (long)(stack)) & ((size) - 1)) #define PUSH(stack, size, type) (VALGRIND_MAKE_MEM_NOACCESS(stack, global_stack_top-stack),ALIGN((stack),sizeof(type)/sizeof(char)),VALGRIND_MAKE_MEM_UNDEFINED(stack, ((size)*sizeof(type)/sizeof(char))),(stack)+=(2*(size)*sizeof(type)/sizeof(char)),(type*)((stack)-(2*(size)*sizeof(type)/sizeof(char)))) #define RESTORE_STACK ((global_stack = _saved_stack),VALGRIND_MAKE_MEM_NOACCESS(global_stack, global_stack_top-global_stack)) #define ALLOC_STACK ((global_stack = (global_stack==0) ? ((global_stack_top=celt_alloc_scratch(GLOBAL_STACK_SIZE*2)+(GLOBAL_STACK_SIZE*2))-(GLOBAL_STACK_SIZE*2)) : global_stack),VALGRIND_MAKE_MEM_NOACCESS(global_stack, global_stack_top-global_stack)) #else #define ALIGN(stack, size) ((stack) += ((size) - (long)(stack)) & ((size) - 1)) #define PUSH(stack, size, type) (ALIGN((stack),sizeof(type)/sizeof(char)),(stack)+=(size)*(sizeof(type)/sizeof(char)),(type*)((stack)-(size)*(sizeof(type)/sizeof(char)))) #define RESTORE_STACK (global_stack = _saved_stack) #define ALLOC_STACK (global_stack = (global_stack==0) ? celt_alloc_scratch(GLOBAL_STACK_SIZE) : global_stack) #endif /*ENABLE_VALGRIND*/ #include "os_support.h" #define VARDECL(type, var) type *var #define ALLOC(var, size, type) var = PUSH(global_stack, size, type) #define SAVE_STACK char *_saved_stack = global_stack; #endif /*VAR_ARRAYS*/ #endif /*STACK_ALLOC_H*/ mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/entcode.h0000664000175000017500000000656414010707311022001 0ustar builderbuilder/* Copyright (c) 2001-2008 Timothy B. Terriberry Copyright (c) 2008-2009 Xiph.Org Foundation */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "celt_types.h" #if !defined(_entcode_H) # define _entcode_H (1) # include # include "ecintrin.h" typedef celt_int32 ec_int32; typedef celt_uint32 ec_uint32; typedef struct ec_byte_buffer ec_byte_buffer; /*The number of bits to code at a time when coding bits directly.*/ # define EC_UNIT_BITS (8) /*The mask for the given bits.*/ # define EC_UNIT_MASK ((1U<ptr=_b->buf; } static inline long ec_byte_bytes(ec_byte_buffer *_b){ return _b->ptr-_b->buf; } static inline unsigned char *ec_byte_get_buffer(ec_byte_buffer *_b){ return _b->buf; } int ec_ilog(ec_uint32 _v); #endif mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/psy.h0000664000175000017500000000476514010707311021174 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef PSY_H #define PSY_H #include "arch.h" #include "celt.h" struct PsyDecay { /*celt_word16 *decayL;*/ const celt_word16 * restrict decayR; }; /** Pre-compute the decay of the psycho-acoustic spreading function */ void psydecay_init(struct PsyDecay *decay, int len, celt_int32 Fs); /** Free the memory allocated for the spreading function */ void psydecay_clear(struct PsyDecay *decay); /** Compute the masking curve for an input (DFT) spectrum X */ void compute_masking(const struct PsyDecay *decay, celt_word16 *X, celt_mask *mask, int len); /** Compute the masking curve for an input (MDCT) spectrum X */ void compute_mdct_masking(const struct PsyDecay *decay, celt_word32 *X, celt_word16 *tonality, celt_word16 *long_window, celt_mask *mask, int len); void compute_tonality(const CELTMode *m, celt_word16 * restrict X, celt_word16 * mem, int len, celt_word16 *tonality, int mdct_size); #endif /* PSY_H */ mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/c64_fft.h0000664000175000017500000000443614010707311021607 0ustar builderbuilder/* (c) Copyright 2008/2009 Xiph.Org Foundation */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _dsp_fft_h_ #define _dsp_fft_h_ #include "config.h" #include "arch.h" #include "os_support.h" #include "mathops.h" #include "stack_alloc.h" typedef struct { int nfft; int shift; celt_int32 *twiddle; celt_int32 *itwiddle; } c64_fft_t; extern c64_fft_t *c64_fft16_alloc(int length, int x, int y); extern void c64_fft16_free(c64_fft_t *state); extern void c64_fft16_inplace(c64_fft_t *state, celt_int16 *X); extern void c64_ifft16(c64_fft_t *state, const celt_int16 *X, celt_int16 *Y); extern c64_fft_t *c64_fft32_alloc(int length, int x, int y); extern void c64_fft32_free(c64_fft_t *state); extern void c64_fft32(c64_fft_t *state, const celt_int32 *X, celt_int32 *Y); extern void c64_ifft32(c64_fft_t *state, const celt_int32 *X, celt_int32 *Y); #endif mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/kiss_fft.h0000664000175000017500000001324014010707311022155 0ustar builderbuilder/* Copyright (c) 2003-2004, Mark Borgerding Lots of modifications by Jean-Marc Valin Copyright (c) 2005-2007, Xiph.Org Foundation Copyright (c) 2008, Xiph.Org Foundation, CSIRO All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the author nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef KISS_FFT_H #define KISS_FFT_H #include #include #include "arch.h" #ifdef __cplusplus extern "C" { #endif /* ATTENTION! If you would like a : -- a utility that will handle the caching of fft objects -- real-only (no imaginary time component ) FFT -- a multi-dimensional FFT -- a command-line utility to perform ffts -- a command-line utility to perform fast-convolution filtering Then see kfc.h kiss_fftr.h kiss_fftnd.h fftutil.c kiss_fastfir.c in the tools/ directory. */ #ifdef USE_SIMD # include # define kiss_fft_scalar __m128 #define KISS_FFT_MALLOC(nbytes) memalign(16,nbytes) #else #define KISS_FFT_MALLOC celt_alloc #endif #ifdef FIXED_POINT #include "arch.h" #ifdef DOUBLE_PRECISION # define kiss_fft_scalar celt_int32 # define kiss_twiddle_scalar celt_int32 # define KF_SUFFIX _celt_double #else # define kiss_fft_scalar celt_int16 # define kiss_twiddle_scalar celt_int16 # define KF_SUFFIX _celt_single #endif #else # ifndef kiss_fft_scalar /* default is float */ # define kiss_fft_scalar float # define kiss_twiddle_scalar float # define KF_SUFFIX _celt_single # endif #endif /* This adds a suffix to all the kiss_fft functions so we can easily link with more than one copy of the fft */ #define CAT_SUFFIX(a,b) a ## b #define SUF(a,b) CAT_SUFFIX(a, b) #define kiss_fft_alloc SUF(kiss_fft_alloc,KF_SUFFIX) #define kf_work SUF(kf_work,KF_SUFFIX) #define ki_work SUF(ki_work,KF_SUFFIX) #define kiss_fft SUF(kiss_fft,KF_SUFFIX) #define kiss_ifft SUF(kiss_ifft,KF_SUFFIX) #define kiss_fft_stride SUF(kiss_fft_stride,KF_SUFFIX) #define kiss_ifft_stride SUF(kiss_ifft_stride,KF_SUFFIX) typedef struct { kiss_fft_scalar r; kiss_fft_scalar i; }kiss_fft_cpx; typedef struct { kiss_twiddle_scalar r; kiss_twiddle_scalar i; }kiss_twiddle_cpx; typedef struct kiss_fft_state* kiss_fft_cfg; /** * kiss_fft_alloc * * Initialize a FFT (or IFFT) algorithm's cfg/state buffer. * * typical usage: kiss_fft_cfg mycfg=kiss_fft_alloc(1024,0,NULL,NULL); * * The return value from fft_alloc is a cfg buffer used internally * by the fft routine or NULL. * * If lenmem is NULL, then kiss_fft_alloc will allocate a cfg buffer using malloc. * The returned value should be free()d when done to avoid memory leaks. * * The state can be placed in a user supplied buffer 'mem': * If lenmem is not NULL and mem is not NULL and *lenmem is large enough, * then the function places the cfg in mem and the size used in *lenmem * and returns mem. * * If lenmem is not NULL and ( mem is NULL or *lenmem is not large enough), * then the function returns NULL and places the minimum cfg * buffer size in *lenmem. * */ kiss_fft_cfg kiss_fft_alloc(int nfft,void * mem,size_t * lenmem); void kf_work(kiss_fft_cpx * Fout,const kiss_fft_cpx * f,const size_t fstride, int in_stride,int * factors,const kiss_fft_cfg st,int N,int s2,int m2); /** Internal function. Can be useful when you want to do the bit-reversing yourself */ void ki_work(kiss_fft_cpx * Fout, const kiss_fft_cpx * f, const size_t fstride, int in_stride,int * factors,const kiss_fft_cfg st,int N,int s2,int m2); /** * kiss_fft(cfg,in_out_buf) * * Perform an FFT on a complex input buffer. * for a forward FFT, * fin should be f[0] , f[1] , ... ,f[nfft-1] * fout will be F[0] , F[1] , ... ,F[nfft-1] * Note that each element is complex and can be accessed like f[k].r and f[k].i * */ void kiss_fft(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout); void kiss_ifft(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout); /** A more generic version of the above function. It reads its input from every Nth sample. * */ void kiss_fft_stride(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout,int fin_stride); void kiss_ifft_stride(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout,int fin_stride); /** If kiss_fft_alloc allocated a buffer, it is one contiguous buffer and can be simply free()d when no longer needed*/ #define kiss_fft_free celt_free #ifdef __cplusplus } #endif #endif mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/mfrngenc.c0000664000175000017500000001674414010707311022153 0ustar builderbuilder/* Copyright (c) 2001-2008 Timothy B. Terriberry Copyright (c) 2008 Xiph.Org Foundation */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "arch.h" #include "entenc.h" #include "mfrngcod.h" /*A multiply-free range encoder. See mfrngdec.c and the references for implementation details \cite{Mar79,MNW98,SM98}. @INPROCEEDINGS{Mar79, author="Martin, G.N.N.", title="Range encoding: an algorithm for removing redundancy from a digitised message", booktitle="Video \& Data Recording Conference", year=1979, address="Southampton", month=Jul } @ARTICLE{MNW98, author="Alistair Moffat and Radford Neal and Ian H. Witten", title="Arithmetic Coding Revisited", journal="{ACM} Transactions on Information Systems", year=1998, volume=16, number=3, pages="256--294", month=Jul, URL="http://www.stanford.edu/class/ee398/handouts/papers/Moffat98ArithmCoding.pdf" } @INPROCEEDINGS{SM98, author="Lang Stuiver and Alistair Moffat", title="Piecewise Integer Mapping for Arithmetic Coding", booktitle="Proceedings of the {IEEE} Data Compression Conference", pages="1--10", address="Snowbird, UT", month="Mar./Apr.", year=1998 }*/ /*Outputs a symbol, with a carry bit. If there is a potential to propagate a carry over several symbols, they are buffered until it can be determined whether or not an actual carry will occur. If the counter for the buffered symbols overflows, then the stream becomes undecodable. This gives a theoretical limit of a few billion symbols in a single packet on 32-bit systems. The alternative is to truncate the range in order to force a carry, but requires similar carry tracking in the decoder, needlessly slowing it down.*/ static void ec_enc_carry_out(ec_enc *_this,int _c){ if(_c!=EC_SYM_MAX){ /*No further carry propagation possible, flush buffer.*/ int carry; carry=_c>>EC_SYM_BITS; /*Don't output a byte on the first write. This compare should be taken care of by branch-prediction thereafter.*/ if(_this->rem>=0)ec_byte_write1(_this->buf,_this->rem+carry); if(_this->ext>0){ unsigned sym; sym=EC_SYM_MAX+carry&EC_SYM_MAX; do ec_byte_write1(_this->buf,sym); while(--(_this->ext)>0); } _this->rem=_c&EC_SYM_MAX; } else _this->ext++; } static inline void ec_enc_normalize(ec_enc *_this){ /*If the range is too small, output some bits and rescale it.*/ while(_this->rng<=EC_CODE_BOT){ ec_enc_carry_out(_this,(int)(_this->low>>EC_CODE_SHIFT)); /*Move the next-to-high-order symbol into the high-order position.*/ _this->low=_this->low<rng<<=EC_SYM_BITS; } } void ec_enc_init(ec_enc *_this,ec_byte_buffer *_buf){ _this->buf=_buf; _this->rem=-1; _this->ext=0; _this->low=0; _this->rng=EC_CODE_TOP; _this->end_byte=0; _this->end_bits_left=8; _this->nb_end_bits=0; } void ec_encode(ec_enc *_this,unsigned _fl,unsigned _fh,unsigned _ft){ ec_uint32 fl; ec_uint32 fh; ec_uint32 ft; ec_uint32 r; ec_uint32 s; ec_uint32 d; int e; int nrm; /*Step 1: we want ft in the range of [rng/2,rng). The high-order bits of the rng and ft are computed via a logarithm. This could also be done on some architectures with some custom assembly, which would provide even more speed.*/ nrm=EC_ILOG(_this->rng)-EC_ILOG(_ft); /*Having the same high order bit may be too much. We may need to shift one less to ensure that ft is actually in the proper range.*/ ft=(ec_uint32)_ft<_this->rng; ft>>=e; nrm-=e; /*We then scale everything by the computed power of 2.*/ fl=(ec_uint32)_fl<rng-ft; r=fh+EC_MINI(fh,d); s=fl+EC_MINI(fl,d); /*Step 3: Update the end-point and range of the interval.*/ _this->low+=s; _this->rng=r-s; /*Step 4: Normalize the interval.*/ ec_enc_normalize(_this); } void ec_encode_bin(ec_enc *_this,unsigned _fl,unsigned _fh,unsigned bits){ #if 0 ec_encode(_this, _fl, _fh, 1U<nb_end_bits += bits; while (bits >= _this->end_bits_left) { _this->end_byte |= (_fl<<(8-_this->end_bits_left)) & 0xff; _fl >>= _this->end_bits_left; ec_byte_write_at_end(_this->buf, _this->end_byte); _this->end_byte = 0; bits -= _this->end_bits_left; _this->end_bits_left = 8; } _this->end_byte |= (_fl<<(8-_this->end_bits_left)) & 0xff; _this->end_bits_left -= bits; #endif } long ec_enc_tell(ec_enc *_this,int _b){ ec_uint32 r; int l; long nbits; nbits=(ec_byte_bytes(_this->buf)+(_this->rem>=0)+_this->ext)*EC_SYM_BITS; /*To handle the non-integral number of bits still left in the encoder state, we compute the number of bits of low that must be encoded to ensure that the value is inside the range for any possible subsequent bits.*/ nbits+=EC_CODE_BITS+1+_this->nb_end_bits; nbits<<=_b; l=EC_ILOG(_this->rng); r=_this->rng>>l-16; while(_b-->0){ int b; r=r*r>>15; b=(int)(r>>16); l=l<<1|b; r>>=b; } return nbits-l; } void ec_enc_done(ec_enc *_this){ ec_uint32 end; ec_uint32 msk; int l; /*We output the minimum number of bits that ensures that the symbols encoded thus far will be decoded correctly regardless of the bits that follow.*/ l=EC_CODE_BITS-EC_ILOG(_this->rng); msk=EC_CODE_TOP-1>>l; end=_this->low+msk&~msk; if((end|msk)>=_this->low+_this->rng){ l++; msk>>=1; end=_this->low+msk&~msk; } while(l>0){ ec_enc_carry_out(_this,(int)(end>>EC_CODE_SHIFT)); end=end<rem>=0||_this->ext>0){ ec_enc_carry_out(_this,0); _this->rem=-1; } { unsigned char *ptr = _this->buf->ptr; while (ptr<= _this->buf->end_ptr) *ptr++ = 0; if (_this->end_bits_left != 8) *_this->buf->end_ptr |= _this->end_byte; } } mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/vq.c0000664000175000017500000002417514010707311020777 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "mathops.h" #include "cwrs.h" #include "vq.h" #include "arch.h" #include "os_support.h" #include "rate.h" #ifndef M_PI #define M_PI 3.141592653 #endif static void exp_rotation(celt_norm *X, int len, int dir, int stride, int K) { int i, k, iter; celt_word16 c, s; celt_word16 gain, theta; celt_norm *Xptr; gain = celt_div((celt_word32)MULT16_16(Q15_ONE,len),(celt_word32)(3+len+6*K)); /* FIXME: Make that HALF16 instead of HALF32 */ theta = SUB16(Q15ONE, HALF32(MULT16_16_Q15(gain,gain))); /*if (len==30) { for (i=0;i 8*stride) stride *= len/(8*stride); iter = 1; for (k=0;k=0;i--) { celt_norm x1, x2; x1 = Xptr[0]; x2 = Xptr[stride]; Xptr[stride] = MULT16_16_Q15(c,x2) + MULT16_16_Q15(s,x1); *Xptr-- = MULT16_16_Q15(c,x1) - MULT16_16_Q15(s,x2); } } /*if (len==30) { for (i=0;i>1; #endif t = VSHR32(Ryy, (k-7)<<1); g = celt_rsqrt_norm(t); i=0; do X[i] = EXTRACT16(PSHR32(MULT16_16(g, iy[i]), k+1)); while (++i < N); } void alg_quant(celt_norm *X, int N, int K, int spread, ec_enc *enc) { VARDECL(celt_norm, y); VARDECL(int, iy); VARDECL(celt_word16, signx); int j, is; celt_word16 s; int pulsesLeft; celt_word32 sum; celt_word32 xy, yy; int N_1; /* Inverse of N, in Q14 format (even for float) */ #ifdef FIXED_POINT int yshift; #endif SAVE_STACK; K = get_pulses(K); #ifdef FIXED_POINT yshift = 13-celt_ilog2(K); #endif ALLOC(y, N, celt_norm); ALLOC(iy, N, int); ALLOC(signx, N, celt_word16); N_1 = 512/N; if (spread) exp_rotation(X, N, 1, spread, K); sum = 0; j=0; do { if (X[j]>0) signx[j]=1; else { signx[j]=-1; X[j]=-X[j]; } iy[j] = 0; y[j] = 0; } while (++j (N>>1)) { celt_word16 rcp; j=0; do { sum += X[j]; } while (++j=1, "Allocated too many pulses in the quick pass"); while (pulsesLeft > 0) { int pulsesAtOnce=1; int best_id; celt_word16 magnitude; celt_word32 best_num = -VERY_LARGE16; celt_word16 best_den = 0; #ifdef FIXED_POINT int rshift; #endif /* Decide on how many pulses to find at once */ pulsesAtOnce = (pulsesLeft*N_1)>>9; /* pulsesLeft/N */ if (pulsesAtOnce<1) pulsesAtOnce = 1; #ifdef FIXED_POINT rshift = yshift+1+celt_ilog2(K-pulsesLeft+pulsesAtOnce); #endif magnitude = SHL16(pulsesAtOnce, yshift); best_id = 0; /* The squared magnitude term gets added anyway, so we might as well add it outside the loop */ yy = MAC16_16(yy, magnitude,magnitude); /* Choose between fast and accurate strategy depending on where we are in the search */ /* This should ensure that anything we can process will have a better score */ j=0; do { celt_word16 Rxy, Ryy; /* Select sign based on X[j] alone */ s = magnitude; /* Temporary sums of the new pulse(s) */ Rxy = EXTRACT16(SHR32(MAC16_16(xy, s,X[j]),rshift)); /* We're multiplying y[j] by two so we don't have to do it here */ Ryy = EXTRACT16(SHR32(MAC16_16(yy, s,y[j]),rshift)); /* Approximate score: we maximise Rxy/sqrt(Ryy) (we're guaranteed that Rxy is positive because the sign is pre-computed) */ Rxy = MULT16_16_Q15(Rxy,Rxy); /* The idea is to check for num/den >= best_num/best_den, but that way we can do it without any division */ /* OPT: Make sure to use conditional moves here */ if (MULT16_16(best_den, Rxy) > MULT16_16(Ryy, best_num)) { best_den = Ryy; best_num = Rxy; best_id = j; } } while (++j C*N0/16) offset = C*N0/16; offset -= offset % (C*B); if (offset < 0) offset = 0; //printf ("%d\n", offset); id += offset; }*/ if (id+N>N0) for (j=0;j #include "bands.h" #include "modes.h" #include "vq.h" #include "cwrs.h" #include "stack_alloc.h" #include "os_support.h" #include "mathops.h" #include "rate.h" #ifdef FIXED_POINT /* Compute the amplitude (sqrt energy) in each of the bands */ void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *bank, int _C) { int i, c, N; const celt_int16 *eBands = m->eBands; const int C = CHANNELS(_C); N = FRAMESIZE(m); for (c=0;cnbEBands;i++) { int j; celt_word32 maxval=0; celt_word32 sum = 0; j=eBands[i]; do { maxval = MAX32(maxval, X[j+c*N]); maxval = MAX32(maxval, -X[j+c*N]); } while (++j 0) { int shift = celt_ilog2(maxval)-10; j=eBands[i]; do { sum = MAC16_16(sum, EXTRACT16(VSHR32(X[j+c*N],shift)), EXTRACT16(VSHR32(X[j+c*N],shift))); } while (++jnbEBands] = EPSILON+VSHR32(EXTEND32(celt_sqrt(sum)),-shift); } else { bank[i+c*m->nbEBands] = EPSILON; } /*printf ("%f ", bank[i+c*m->nbEBands]);*/ } } /*printf ("\n");*/ } /* Normalise each band such that the energy is one. */ void normalise_bands(const CELTMode *m, const celt_sig * restrict freq, celt_norm * restrict X, const celt_ener *bank, int _C) { int i, c, N; const celt_int16 *eBands = m->eBands; const int C = CHANNELS(_C); N = FRAMESIZE(m); for (c=0;cnbEBands])-13; E = VSHR32(bank[i+c*m->nbEBands], shift); g = EXTRACT16(celt_rcp(SHL32(E,3))); j=eBands[i]; do { X[j+c*N] = MULT16_16_Q15(VSHR32(freq[j+c*N],shift-1),g); } while (++jnbEBands); } } #else /* FIXED_POINT */ /* Compute the amplitude (sqrt energy) in each of the bands */ void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *bank, int _C) { int i, c, N; const celt_int16 *eBands = m->eBands; const int C = CHANNELS(_C); N = FRAMESIZE(m); for (c=0;cnbEBands;i++) { int j; celt_word32 sum = 1e-10; for (j=eBands[i];jnbEBands] = sqrt(sum); /*printf ("%f ", bank[i+c*m->nbEBands]);*/ } } /*printf ("\n");*/ } #ifdef EXP_PSY void compute_noise_energies(const CELTMode *m, const celt_sig *X, const celt_word16 *tonality, celt_ener *bank, int _C) { int i, c, N; const celt_int16 *eBands = m->eBands; const int C = CHANNELS(_C); N = FRAMESIZE(m); for (c=0;cnbEBands;i++) { int j; celt_word32 sum = 1e-10; for (j=eBands[i];jnbEBands] = sqrt(sum); /*printf ("%f ", bank[i+c*m->nbEBands]);*/ } } /*printf ("\n");*/ } #endif /* Normalise each band such that the energy is one. */ void normalise_bands(const CELTMode *m, const celt_sig * restrict freq, celt_norm * restrict X, const celt_ener *bank, int _C) { int i, c, N; const celt_int16 *eBands = m->eBands; const int C = CHANNELS(_C); N = FRAMESIZE(m); for (c=0;cnbEBands;i++) { int j; celt_word16 g = 1.f/(1e-10+bank[i+c*m->nbEBands]); for (j=eBands[i];jeBands; const int C = CHANNELS(_C); for (c=0;ceBands[m->nbEBands+1], Q15ONE, eBands[i+1]-eBands[i], 1); } while (++inbEBands); } } /* De-normalise the energy to produce the synthesis from the unit-energy bands */ void denormalise_bands(const CELTMode *m, const celt_norm * restrict X, celt_sig * restrict freq, const celt_ener *bank, int _C) { int i, c, N; const celt_int16 *eBands = m->eBands; const int C = CHANNELS(_C); N = FRAMESIZE(m); if (C>2) celt_fatal("denormalise_bands() not implemented for >2 channels"); for (c=0;cnbEBands;i++) { int j; celt_word32 g = SHR32(bank[i+c*m->nbEBands],1); j=eBands[i]; do { freq[j+c*N] = SHL32(MULT16_32_Q15(X[j+c*N], g),2); } while (++jnbEBands];inbEBands+1];i++) freq[i+c*N] = 0; } } int compute_pitch_gain(const CELTMode *m, const celt_sig *X, const celt_sig *P, int norm_rate, int *gain_id, int _C, celt_word16 *gain_prod) { int j, c; celt_word16 g; celt_word16 delta; const int C = CHANNELS(_C); celt_word32 Sxy=0, Sxx=0, Syy=0; int len = m->pitchEnd; const int N = FRAMESIZE(m); #ifdef FIXED_POINT int shift = 0; celt_word32 maxabs=0; for (c=0;cQCONST32(2., 13)) { *gain_id=9; *gain_prod = QCONST32(2., 13); } if (*gain_id < 0) { *gain_id = 0; return 0; } else { if (*gain_id > 15) *gain_id = 15; return 1; } } void apply_pitch(const CELTMode *m, celt_sig *X, const celt_sig *P, int gain_id, int pred, int _C) { int j, c, N; celt_word16 gain; celt_word16 delta; const int C = CHANNELS(_C); int len = m->pitchEnd; N = FRAMESIZE(m); gain = ADD16(QCONST16(.5,14), MULT16_16_16(QCONST16(.05,14),gain_id)); delta = PDIV32_16(gain, len); if (pred) gain = -gain; else delta = -delta; for (c=0;ceBands; int j; celt_word16 a1, a2; if (stereo_mode==0) { /* Do mid-side when not doing intensity stereo */ a1 = QCONST16(.70711f,14); a2 = dir*QCONST16(.70711f,14); } else { celt_word16 left, right; celt_word16 norm; #ifdef FIXED_POINT int shift = celt_zlog2(MAX32(bank[i], bank[i+m->nbEBands]))-13; #endif left = VSHR32(bank[i],shift); right = VSHR32(bank[i+m->nbEBands],shift); norm = EPSILON + celt_sqrt(EPSILON+MULT16_16(left,left)+MULT16_16(right,right)); a1 = DIV32_16(SHL32(EXTEND32(left),14),norm); a2 = dir*DIV32_16(SHL32(EXTEND32(right),14),norm); } for (j=0;jeBands; N0 = FRAMESIZE(m); for (c=0;cnbEBands;i++) { int j, N; int max_i=0; celt_word16 max_val=EPSILON; celt_word32 floor_ener=EPSILON; celt_norm * restrict x = X+eBands[i]+c*N0; N = eBands[i+1]-eBands[i]; for (j=0;jmax_val) { max_val = ABS16(x[j]); max_i = j; } } #if 0 for (j=0;j2) floor_ener += x[j]*x[j]; } #else floor_ener = QCONST32(1.,28)-MULT16_16(max_val,max_val); if (max_i < N-1) floor_ener -= MULT16_16(x[(max_i+1)], x[(max_i+1)]); if (max_i < N-2) floor_ener -= MULT16_16(x[(max_i+2)], x[(max_i+2)]); if (max_i > 0) floor_ener -= MULT16_16(x[(max_i-1)], x[(max_i-1)]); if (max_i > 1) floor_ener -= MULT16_16(x[(max_i-2)], x[(max_i-2)]); floor_ener = MAX32(floor_ener, EPSILON); #endif if (N>7) { celt_word16 r; celt_word16 den = celt_sqrt(floor_ener); den = MAX32(QCONST16(.02, 15), den); r = DIV32_16(SHL32(EXTEND32(max_val),8),den); ratio = ADD32(ratio, EXTEND32(r)); NR++; } } } if (NR>0) ratio = DIV32_16(ratio, NR); ratio = ADD32(HALF32(ratio), HALF32(*average)); if (!*last_decision) { *last_decision = (ratio < QCONST16(1.8,8)); } else { *last_decision = (ratio < QCONST16(3.,8)); } *average = EXTRACT16(ratio); return *last_decision; } /* Quantisation of the residual */ void quant_bands(const CELTMode *m, celt_norm * restrict X, const celt_ener *bandE, int *pulses, int shortBlocks, int fold, int total_bits, int encode, void *enc_dec) { int i, j, remaining_bits, balance; const celt_int16 * restrict eBands = m->eBands; celt_norm * restrict norm; VARDECL(celt_norm, _norm); int B; SAVE_STACK; B = shortBlocks ? m->nbShortMdcts : 1; ALLOC(_norm, eBands[m->nbEBands+1], celt_norm); norm = _norm; balance = 0; for (i=0;inbEBands;i++) { int tell; int N; int q; celt_word16 n; const celt_int16 * const *BPbits; int curr_balance, curr_bits; N = eBands[i+1]-eBands[i]; BPbits = m->bits; if (encode) tell = ec_enc_tell((ec_enc *) enc_dec, BITRES); else tell = ec_dec_tell((ec_dec *) enc_dec, BITRES); if (i != 0) balance -= tell; remaining_bits = (total_bits<nbEBands-i); if (curr_balance > 3) curr_balance = 3; curr_balance = balance / curr_balance; q = bits2pulses(m, BPbits[i], N, pulses[i]+curr_balance); curr_bits = pulses2bits(BPbits[i], N, q); remaining_bits -= curr_bits; while (remaining_bits < 0 && q > 0) { remaining_bits += curr_bits; q--; curr_bits = pulses2bits(BPbits[i], N, q); remaining_bits -= curr_bits; } balance += pulses[i] + tell; n = SHL16(celt_sqrt(eBands[i+1]-eBands[i]),11); if (q > 0) { int spread = fold ? B : 0; if (encode) alg_quant(X+eBands[i], eBands[i+1]-eBands[i], q, spread, (ec_enc *) enc_dec); else alg_unquant(X+eBands[i], eBands[i+1]-eBands[i], q, spread, (ec_dec *) enc_dec); } else { intra_fold(m, eBands[i+1]-eBands[i], norm, X+eBands[i], eBands[i], B); } for (j=eBands[i];jeBands; celt_norm * restrict norm; VARDECL(celt_norm, _norm); int B; celt_word16 mid, side; SAVE_STACK; B = shortBlocks ? m->nbShortMdcts : 1; ALLOC(_norm, eBands[m->nbEBands+1], celt_norm); norm = _norm; balance = 0; for (i=0;inbEBands;i++) { int tell; int q1, q2; celt_word16 n; const celt_int16 * const *BPbits; int b, qb; int N; int curr_balance, curr_bits; int imid, iside, itheta; int mbits, sbits, delta; int qalloc; celt_norm * restrict X, * restrict Y; X = _X+eBands[i]; Y = X+eBands[m->nbEBands+1]; BPbits = m->bits; N = eBands[i+1]-eBands[i]; tell = ec_enc_tell(enc, BITRES); if (i != 0) balance -= tell; remaining_bits = (total_bits<nbEBands-i); if (curr_balance > 3) curr_balance = 3; curr_balance = balance / curr_balance; b = IMIN(remaining_bits+1,pulses[i]+curr_balance); if (b<0) b = 0; qb = (b-2*(N-1)*(QTHETA_OFFSET-log2_frac(N,BITRES)))/(32*(N-1)); if (qb > (b>>BITRES)-1) qb = (b>>BITRES)-1; if (qb<0) qb = 0; if (qb>14) qb = 14; stereo_band_mix(m, X, Y, bandE, qb==0, i, 1); mid = renormalise_vector(X, Q15ONE, N, 1); side = renormalise_vector(Y, Q15ONE, N, 1); #ifdef FIXED_POINT itheta = MULT16_16_Q15(QCONST16(0.63662,15),celt_atan2p(side, mid)); #else itheta = floor(.5+16384*0.63662*atan2(side,mid)); #endif qalloc = log2_frac((1<>1))>>shift; ec_enc_uint(enc, itheta, (1<>2; } n = SHL16(celt_sqrt((eBands[i+1]-eBands[i])),11); #if 0 if (N==2) { int c2; int sign=1; celt_norm v[2], w[2]; celt_norm *x2, *y2; mbits = b-qalloc; sbits = 0; if (itheta != 0 && itheta != 16384) sbits = 1< 8192 ? 1 : 0; c2 = 1-c; x2 = X; y2 = Y; if (c==0) { v[0] = x2[0]; v[1] = x2[1]; w[0] = y2[0]; w[1] = y2[1]; } else { v[0] = y2[0]; v[1] = y2[1]; w[0] = x2[0]; w[1] = x2[1]; } q1 = bits2pulses(m, BPbits[i], N, mbits); curr_bits = pulses2bits(BPbits[i], N, q1)+qalloc+sbits; remaining_bits -= curr_bits; while (remaining_bits < 0 && q1 > 0) { remaining_bits += curr_bits; q1--; curr_bits = pulses2bits(BPbits[i], N, q1)+qalloc; remaining_bits -= curr_bits; } if (q1 > 0) { int spread = fold ? B : 0; alg_quant(v, N, q1, spread, enc); } else { v[0] = QCONST16(1.f, 14); v[1] = 0; } if (sbits) { if (v[0]*w[1] - v[1]*w[0] > 0) sign = 1; else sign = -1; ec_enc_bits(enc, sign==1, 1); } else { sign = 1; } w[0] = -sign*v[1]; w[1] = sign*v[0]; if (c==0) { x2[0] = v[0]; x2[1] = v[1]; y2[0] = w[0]; y2[1] = w[1]; } else { x2[0] = w[0]; x2[1] = w[1]; y2[0] = v[0]; y2[1] = v[1]; } } else #endif { mbits = (b-qalloc/2-delta)/2; if (mbits > b-qalloc) mbits = b-qalloc; if (mbits<0) mbits=0; sbits = b-qalloc-mbits; q1 = bits2pulses(m, BPbits[i], N, mbits); q2 = bits2pulses(m, BPbits[i], N, sbits); curr_bits = pulses2bits(BPbits[i], N, q1)+pulses2bits(BPbits[i], N, q2)+qalloc; remaining_bits -= curr_bits; while (remaining_bits < 0 && (q1 > 0 || q2 > 0)) { remaining_bits += curr_bits; if (q1>q2) { q1--; curr_bits = pulses2bits(BPbits[i], N, q1)+pulses2bits(BPbits[i], N, q2)+qalloc; } else { q2--; curr_bits = pulses2bits(BPbits[i], N, q1)+pulses2bits(BPbits[i], N, q2)+qalloc; } remaining_bits -= curr_bits; } if (q1 > 0) { int spread = fold ? B : 0; alg_quant(X, N, q1, spread, enc); } else { intra_fold(m, eBands[i+1]-eBands[i], norm, X, eBands[i], B); } if (q2 > 0) { int spread = fold ? B : 0; alg_quant(Y, N, q2, spread, enc); } else for (j=0;jeBands; celt_norm * restrict norm; VARDECL(celt_norm, _norm); int B; celt_word16 mid, side; SAVE_STACK; B = shortBlocks ? m->nbShortMdcts : 1; ALLOC(_norm, eBands[m->nbEBands+1], celt_norm); norm = _norm; balance = 0; for (i=0;inbEBands;i++) { int tell; int q1, q2; celt_word16 n; const celt_int16 * const *BPbits; int b, qb; int N; int curr_balance, curr_bits; int imid, iside, itheta; int mbits, sbits, delta; int qalloc; celt_norm * restrict X, * restrict Y; X = _X+eBands[i]; Y = X+eBands[m->nbEBands+1]; BPbits = m->bits; N = eBands[i+1]-eBands[i]; tell = ec_dec_tell(dec, BITRES); if (i != 0) balance -= tell; remaining_bits = (total_bits<nbEBands-i); if (curr_balance > 3) curr_balance = 3; curr_balance = balance / curr_balance; b = IMIN(remaining_bits+1,pulses[i]+curr_balance); if (b<0) b = 0; qb = (b-2*(N-1)*(QTHETA_OFFSET-log2_frac(N,BITRES)))/(32*(N-1)); if (qb > (b>>BITRES)-1) qb = (b>>BITRES)-1; if (qb>14) qb = 14; if (qb<0) qb = 0; qalloc = log2_frac((1<>2; } n = SHL16(celt_sqrt((eBands[i+1]-eBands[i])),11); #if 0 if (N==2) { int c2; int sign=1; celt_norm v[2], w[2]; celt_norm *x2, *y2; mbits = b-qalloc; sbits = 0; if (itheta != 0 && itheta != 16384) sbits = 1< 8192 ? 1 : 0; c2 = 1-c; x2 = X; y2 = Y; v[0] = x2[c]; v[1] = y2[c]; w[0] = x2[c2]; w[1] = y2[c2]; q1 = bits2pulses(m, BPbits[i], N, mbits); curr_bits = pulses2bits(BPbits[i], N, q1)+qalloc+sbits; remaining_bits -= curr_bits; while (remaining_bits < 0 && q1 > 0) { remaining_bits += curr_bits; q1--; curr_bits = pulses2bits(BPbits[i], N, q1)+qalloc; remaining_bits -= curr_bits; } if (q1 > 0) { int spread = fold ? B : 0; alg_unquant(v, N, q1, spread, dec); } else { v[0] = QCONST16(1.f, 14); v[1] = 0; } if (sbits) sign = 2*ec_dec_bits(dec, 1)-1; else sign = 1; w[0] = -sign*v[1]; w[1] = sign*v[0]; if (c==0) { x2[0] = v[0]; x2[1] = v[1]; y2[0] = w[0]; y2[1] = w[1]; } else { x2[0] = w[0]; x2[1] = w[1]; y2[0] = v[0]; y2[1] = v[1]; } } else #endif { mbits = (b-qalloc/2-delta)/2; if (mbits > b-qalloc) mbits = b-qalloc; if (mbits<0) mbits=0; sbits = b-qalloc-mbits; q1 = bits2pulses(m, BPbits[i], N, mbits); q2 = bits2pulses(m, BPbits[i], N, sbits); curr_bits = pulses2bits(BPbits[i], N, q1)+pulses2bits(BPbits[i], N, q2)+qalloc; remaining_bits -= curr_bits; while (remaining_bits < 0 && (q1 > 0 || q2 > 0)) { remaining_bits += curr_bits; if (q1>q2) { q1--; curr_bits = pulses2bits(BPbits[i], N, q1)+pulses2bits(BPbits[i], N, q2)+qalloc; } else { q2--; curr_bits = pulses2bits(BPbits[i], N, q1)+pulses2bits(BPbits[i], N, q2)+qalloc; } remaining_bits -= curr_bits; } if (q1 > 0) { int spread = fold ? B : 0; alg_unquant(X, N, q1, spread, dec); } else intra_fold(m, eBands[i+1]-eBands[i], norm, X, eBands[i], B); if (q2 > 0) { int spread = fold ? B : 0; alg_unquant(Y, N, q2, spread, dec); } else for (j=0;j>14; if (fs == 0) { if (fl+2 <= ft) { fs = 1; } else { fs = tmp_s; fl = tmp_l; if (s) *value = -i; else *value = i; break; } } } if (fl < 0) fl = 0; if (s) fl += fs; ec_encode_bin(enc, fl, fl+fs, 15); } void ec_laplace_encode(ec_enc *enc, int *value, int decay) { int fs = ec_laplace_get_start_freq(decay); ec_laplace_encode_start(enc, value, decay, fs); } int ec_laplace_decode_start(ec_dec *dec, int decay, int fs) { int val=0; int fl, fh, fm; unsigned int ft; fl = 0; ft = 32768; fh = fs; fm = ec_decode_bin(dec, 15); while (fm >= fh && fs != 0) { fl = fh; fs = (fs*(ec_int32)decay)>>14; if (fs == 0 && fh+2 <= ft) { fs = 1; } fh += fs*2; val++; } if (fl>0) { if (fm >= fl+fs) { val = -val; fl += fs; } else { fh -= fs; } } /* Preventing an infinite loop in case something screws up in the decoding */ if (fl==fh) fl--; ec_dec_update(dec, fl, fh, ft); return val; } int ec_laplace_decode(ec_dec *dec, int decay) { int fs = ec_laplace_get_start_freq(decay); return ec_laplace_decode_start(dec, decay, fs); } mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/mdct.c0000664000175000017500000002147114010707311021274 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2008 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* This is a simple MDCT implementation that uses a N/4 complex FFT to do most of the work. It should be relatively straightforward to plug in pretty much and FFT here. This replaces the Vorbis FFT (and uses the exact same API), which was a bit too messy and that was ending up duplicating code (might as well use the same FFT everywhere). The algorithm is similar to (and inspired from) Fabrice Bellard's MDCT implementation in FFMPEG, but has differences in signs, ordering and scaling in many places. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "mdct.h" #include "kfft_double.h" #include #include "os_support.h" #include "mathops.h" #include "stack_alloc.h" #ifndef M_PI #define M_PI 3.141592653 #endif void clt_mdct_init(mdct_lookup *l,int N) { int i; int N2; l->n = N; N2 = N>>1; l->kfft = cpx32_fft_alloc(N>>2); #ifndef ENABLE_TI_DSPLIB55 if (l->kfft==NULL) return; #endif l->trig = (kiss_twiddle_scalar*)celt_alloc(N2*sizeof(kiss_twiddle_scalar)); if (l->trig==NULL) return; /* We have enough points that sine isn't necessary */ #if defined(FIXED_POINT) #if defined(DOUBLE_PRECISION) & !defined(MIXED_PRECISION) for (i=0;itrig[i] = SAMP_MAX*cos(2*M_PI*(i+1./8.)/N); #else for (i=0;itrig[i] = TRIG_UPSCALE*celt_cos_norm(DIV32(ADD32(SHL32(EXTEND32(i),17),16386),N)); #endif #else for (i=0;itrig[i] = cos(2*M_PI*(i+1./8.)/N); #endif } void clt_mdct_clear(mdct_lookup *l) { cpx32_fft_free(l->kfft); celt_free(l->trig); } void clt_mdct_forward(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar * restrict out, const celt_word16 *window, int overlap) { int i; int N, N2, N4; VARDECL(kiss_fft_scalar, f); SAVE_STACK; N = l->n; N2 = N>>1; N4 = N>>2; ALLOC(f, N2, kiss_fft_scalar); /* Consider the input to be compused of four blocks: [a, b, c, d] */ /* Window, shuffle, fold */ { /* Temp pointers to make it really clear to the compiler what we're doing */ const kiss_fft_scalar * restrict xp1 = in+(overlap>>1); const kiss_fft_scalar * restrict xp2 = in+N2-1+(overlap>>1); kiss_fft_scalar * restrict yp = out; const celt_word16 * restrict wp1 = window+(overlap>>1); const celt_word16 * restrict wp2 = window+(overlap>>1)-1; for(i=0;i<(overlap>>2);i++) { /* Real part arranged as -d-cR, Imag part arranged as -b+aR*/ *yp++ = MULT16_32_Q15(*wp2, xp1[N2]) + MULT16_32_Q15(*wp1,*xp2); *yp++ = MULT16_32_Q15(*wp1, *xp1) - MULT16_32_Q15(*wp2, xp2[-N2]); xp1+=2; xp2-=2; wp1+=2; wp2-=2; } wp1 = window; wp2 = window+overlap-1; for(;i>2);i++) { /* Real part arranged as a-bR, Imag part arranged as -c-dR */ *yp++ = *xp2; *yp++ = *xp1; xp1+=2; xp2-=2; } for(;itrig[0]; for(i=0;ikfft, out, f, N4); /* Post-rotate */ { /* Temp pointers to make it really clear to the compiler what we're doing */ const kiss_fft_scalar * restrict fp = f; kiss_fft_scalar * restrict yp1 = out; kiss_fft_scalar * restrict yp2 = out+N2-1; kiss_fft_scalar *t = &l->trig[0]; /* Temp pointers to make it really clear to the compiler what we're doing */ for(i=0;in; N2 = N>>1; N4 = N>>2; ALLOC(f, N2, kiss_fft_scalar); ALLOC(f2, N2, kiss_fft_scalar); /* Pre-rotate */ { /* Temp pointers to make it really clear to the compiler what we're doing */ const kiss_fft_scalar * restrict xp1 = in; const kiss_fft_scalar * restrict xp2 = in+N2-1; kiss_fft_scalar * restrict yp = f2; kiss_fft_scalar *t = &l->trig[0]; for(i=0;ikfft, f2, f, N4); /* Post-rotate */ { kiss_fft_scalar * restrict fp = f; kiss_fft_scalar *t = &l->trig[0]; for(i=0;i #include #include "cwrs.h" #include "mathops.h" #include "arch.h" /*Guaranteed to return a conservatively large estimate of the binary logarithm with frac bits of fractional precision. Tested for all possible 32-bit inputs with frac=4, where the maximum overestimation is 0.06254243 bits.*/ int log2_frac(ec_uint32 val, int frac) { int l; l=EC_ILOG(val); if(val&val-1){ /*This is (val>>l-16), but guaranteed to round up, even if adding a bias before the shift would cause overflow (e.g., for 0xFFFFxxxx).*/ if(l>16)val=(val>>l-16)+((val&(1<>l-16); else val<<=16-l; l=l-1<>16); l+=b<>b; val=val*val+0x7FFF>>15; } while(frac-->0); /*If val is not exactly 0x8000, then we have to round up the remainder.*/ return l+(val>0x8000); } /*Exact powers of two require no rounding.*/ else return l-1<0); shift=EC_ILOG(_d^_d-1); celt_assert(_d<=256); inv=INV_TABLE[_d-1>>shift]; shift--; one=1<>shift)-(_c>>shift)+ (_a*(_b&mask)+one-(_c&mask)>>shift)-1)*inv&MASK32; } /*Compute floor(sqrt(_val)) with exact arithmetic. This has been tested on all possible 32-bit inputs.*/ static unsigned isqrt32(celt_uint32 _val){ unsigned b; unsigned g; int bshift; /*Uses the second method from http://www.azillionmonkeys.com/qed/sqroot.html The main idea is to search for the largest binary digit b such that (g+b)*(g+b) <= _val, and add it to the solution g.*/ g=0; bshift=EC_ILOG(_val)-1>>1; b=1U<>=1; bshift--; } while(bshift>=0); return g; } #endif /* SMALL_FOOTPRINT */ /*Although derived separately, the pulse vector coding scheme is equivalent to a Pyramid Vector Quantizer \cite{Fis86}. Some additional notes about an early version appear at http://people.xiph.org/~tterribe/notes/cwrs.html, but the codebook ordering and the definitions of some terms have evolved since that was written. The conversion from a pulse vector to an integer index (encoding) and back (decoding) is governed by two related functions, V(N,K) and U(N,K). V(N,K) = the number of combinations, with replacement, of N items, taken K at a time, when a sign bit is added to each item taken at least once (i.e., the number of N-dimensional unit pulse vectors with K pulses). One way to compute this is via V(N,K) = K>0 ? sum(k=1...K,2**k*choose(N,k)*choose(K-1,k-1)) : 1, where choose() is the binomial function. A table of values for N<10 and K<10 looks like: V[10][10] = { {1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {1, 2, 2, 2, 2, 2, 2, 2, 2, 2}, {1, 4, 8, 12, 16, 20, 24, 28, 32, 36}, {1, 6, 18, 38, 66, 102, 146, 198, 258, 326}, {1, 8, 32, 88, 192, 360, 608, 952, 1408, 1992}, {1, 10, 50, 170, 450, 1002, 1970, 3530, 5890, 9290}, {1, 12, 72, 292, 912, 2364, 5336, 10836, 20256, 35436}, {1, 14, 98, 462, 1666, 4942, 12642, 28814, 59906, 115598}, {1, 16, 128, 688, 2816, 9424, 27008, 68464, 157184, 332688}, {1, 18, 162, 978, 4482, 16722, 53154, 148626, 374274, 864146} }; U(N,K) = the number of such combinations wherein N-1 objects are taken at most K-1 at a time. This is given by U(N,K) = sum(k=0...K-1,V(N-1,k)) = K>0 ? (V(N-1,K-1) + V(N,K-1))/2 : 0. The latter expression also makes clear that U(N,K) is half the number of such combinations wherein the first object is taken at least once. Although it may not be clear from either of these definitions, U(N,K) is the natural function to work with when enumerating the pulse vector codebooks, not V(N,K). U(N,K) is not well-defined for N=0, but with the extension U(0,K) = K>0 ? 0 : 1, the function becomes symmetric: U(N,K) = U(K,N), with a similar table: U[10][10] = { {1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {0, 1, 3, 5, 7, 9, 11, 13, 15, 17}, {0, 1, 5, 13, 25, 41, 61, 85, 113, 145}, {0, 1, 7, 25, 63, 129, 231, 377, 575, 833}, {0, 1, 9, 41, 129, 321, 681, 1289, 2241, 3649}, {0, 1, 11, 61, 231, 681, 1683, 3653, 7183, 13073}, {0, 1, 13, 85, 377, 1289, 3653, 8989, 19825, 40081}, {0, 1, 15, 113, 575, 2241, 7183, 19825, 48639, 108545}, {0, 1, 17, 145, 833, 3649, 13073, 40081, 108545, 265729} }; With this extension, V(N,K) may be written in terms of U(N,K): V(N,K) = U(N,K) + U(N,K+1) for all N>=0, K>=0. Thus U(N,K+1) represents the number of combinations where the first element is positive or zero, and U(N,K) represents the number of combinations where it is negative. With a large enough table of U(N,K) values, we could write O(N) encoding and O(min(N*log(K),N+K)) decoding routines, but such a table would be prohibitively large for small embedded devices (K may be as large as 32767 for small N, and N may be as large as 200). Both functions obey the same recurrence relation: V(N,K) = V(N-1,K) + V(N,K-1) + V(N-1,K-1), U(N,K) = U(N-1,K) + U(N,K-1) + U(N-1,K-1), for all N>0, K>0, with different initial conditions at N=0 or K=0. This allows us to construct a row of one of the tables above given the previous row or the next row. Thus we can derive O(NK) encoding and decoding routines with O(K) memory using only addition and subtraction. When encoding, we build up from the U(2,K) row and work our way forwards. When decoding, we need to start at the U(N,K) row and work our way backwards, which requires a means of computing U(N,K). U(N,K) may be computed from two previous values with the same N: U(N,K) = ((2*N-1)*U(N,K-1) - U(N,K-2))/(K-1) + U(N,K-2) for all N>1, and since U(N,K) is symmetric, a similar relation holds for two previous values with the same K: U(N,K>1) = ((2*K-1)*U(N-1,K) - U(N-2,K))/(N-1) + U(N-2,K) for all K>1. This allows us to construct an arbitrary row of the U(N,K) table by starting with the first two values, which are constants. This saves roughly 2/3 the work in our O(NK) decoding routine, but costs O(K) multiplications. Similar relations can be derived for V(N,K), but are not used here. For N>0 and K>0, U(N,K) and V(N,K) take on the form of an (N-1)-degree polynomial for fixed N. The first few are U(1,K) = 1, U(2,K) = 2*K-1, U(3,K) = (2*K-2)*K+1, U(4,K) = (((4*K-6)*K+8)*K-3)/3, U(5,K) = ((((2*K-4)*K+10)*K-8)*K+3)/3, and V(1,K) = 2, V(2,K) = 4*K, V(3,K) = 4*K*K+2, V(4,K) = 8*(K*K+2)*K/3, V(5,K) = ((4*K*K+20)*K*K+6)/3, for all K>0. This allows us to derive O(N) encoding and O(N*log(K)) decoding routines for small N (and indeed decoding is also O(N) for N<3). @ARTICLE{Fis86, author="Thomas R. Fischer", title="A Pyramid Vector Quantizer", journal="IEEE Transactions on Information Theory", volume="IT-32", number=4, pages="568--583", month=Jul, year=1986 }*/ /*Determines if V(N,K) fits in a 32-bit unsigned integer. N and K are themselves limited to 15 bits.*/ int fits_in32(int _n, int _k) { static const celt_int16 maxN[15] = { 32767, 32767, 32767, 1476, 283, 109, 60, 40, 29, 24, 20, 18, 16, 14, 13}; static const celt_int16 maxK[15] = { 32767, 32767, 32767, 32767, 1172, 238, 95, 53, 36, 27, 22, 18, 16, 15, 13}; if (_n>=14) { if (_k>=14) return 0; else return _n <= maxN[_k]; } else { return _k <= maxK[_n]; } } #ifndef SMALL_FOOTPRINT /*Compute U(1,_k).*/ static inline unsigned ucwrs1(int _k){ return _k?1:0; } /*Compute V(1,_k).*/ static inline unsigned ncwrs1(int _k){ return _k?2:1; } /*Compute U(2,_k). Note that this may be called with _k=32768 (maxK[2]+1).*/ static inline unsigned ucwrs2(unsigned _k){ return _k?_k+(_k-1):0; } /*Compute V(2,_k).*/ static inline celt_uint32 ncwrs2(int _k){ return _k?4*(celt_uint32)_k:1; } /*Compute U(3,_k). Note that this may be called with _k=32768 (maxK[3]+1).*/ static inline celt_uint32 ucwrs3(unsigned _k){ return _k?(2*(celt_uint32)_k-2)*_k+1:0; } /*Compute V(3,_k).*/ static inline celt_uint32 ncwrs3(int _k){ return _k?2*(2*(unsigned)_k*(celt_uint32)_k+1):1; } /*Compute U(4,_k).*/ static inline celt_uint32 ucwrs4(int _k){ return _k?imusdiv32odd(2*_k,(2*_k-3)*(celt_uint32)_k+4,3,1):0; } /*Compute V(4,_k).*/ static inline celt_uint32 ncwrs4(int _k){ return _k?((_k*(celt_uint32)_k+2)*_k)/3<<3:1; } /*Compute U(5,_k).*/ static inline celt_uint32 ucwrs5(int _k){ return _k?(((((_k-2)*(unsigned)_k+5)*(celt_uint32)_k-4)*_k)/3<<1)+1:0; } /*Compute V(5,_k).*/ static inline celt_uint32 ncwrs5(int _k){ return _k?(((_k*(unsigned)_k+5)*(celt_uint32)_k*_k)/3<<2)+2:1; } #endif /* SMALL_FOOTPRINT */ /*Computes the next row/column of any recurrence that obeys the relation u[i][j]=u[i-1][j]+u[i][j-1]+u[i-1][j-1]. _ui0 is the base case for the new row/column.*/ static inline void unext(celt_uint32 *_ui,unsigned _len,celt_uint32 _ui0){ celt_uint32 ui1; unsigned j; /*This do-while will overrun the array if we don't have storage for at least 2 values.*/ j=1; do { ui1=UADD32(UADD32(_ui[j],_ui[j-1]),_ui0); _ui[j-1]=_ui0; _ui0=ui1; } while (++j<_len); _ui[j-1]=_ui0; } /*Computes the previous row/column of any recurrence that obeys the relation u[i-1][j]=u[i][j]-u[i][j-1]-u[i-1][j-1]. _ui0 is the base case for the new row/column.*/ static inline void uprev(celt_uint32 *_ui,unsigned _n,celt_uint32 _ui0){ celt_uint32 ui1; unsigned j; /*This do-while will overrun the array if we don't have storage for at least 2 values.*/ j=1; do { ui1=USUB32(USUB32(_ui[j],_ui[j-1]),_ui0); _ui[j-1]=_ui0; _ui0=ui1; } while (++j<_n); _ui[j-1]=_ui0; } /*Compute V(_n,_k), as well as U(_n,0..._k+1). _u: On exit, _u[i] contains U(_n,i) for i in [0..._k+1].*/ static celt_uint32 ncwrs_urow(unsigned _n,unsigned _k,celt_uint32 *_u){ celt_uint32 um2; unsigned len; unsigned k; len=_k+2; /*We require storage at least 3 values (e.g., _k>0).*/ celt_assert(len>=3); _u[0]=0; _u[1]=um2=1; #ifndef SMALL_FOOTPRINT if(_n<=6 || _k>255) #endif { /*If _n==0, _u[0] should be 1 and the rest should be 0.*/ /*If _n==1, _u[i] should be 1 for i>1.*/ celt_assert(_n>=2); /*If _k==0, the following do-while loop will overflow the buffer.*/ celt_assert(_k>0); k=2; do _u[k]=(k<<1)-1; while(++k=len)break; _u[k]=um1=imusdiv32odd(n2m1,um2,um1,k-1>>1)+um1; } } #endif /* SMALL_FOOTPRINT */ return _u[_k]+_u[_k+1]; } /*Returns the _i'th combination of _k elements (at most 32767) chosen from a set of size 1 with associated sign bits. _y: Returns the vector of pulses.*/ static inline void cwrsi1(int _k,celt_uint32 _i,int *_y){ int s; s=-(int)_i; _y[0]=_k+s^s; } #ifndef SMALL_FOOTPRINT /*Returns the _i'th combination of _k elements (at most 32767) chosen from a set of size 2 with associated sign bits. _y: Returns the vector of pulses.*/ static inline void cwrsi2(int _k,celt_uint32 _i,int *_y){ celt_uint32 p; int s; int yj; p=ucwrs2(_k+1U); s=-(_i>=p); _i-=p&s; yj=_k; _k=_i+1>>1; p=ucwrs2(_k); _i-=p; yj-=_k; _y[0]=yj+s^s; cwrsi1(_k,_i,_y+1); } /*Returns the _i'th combination of _k elements (at most 32767) chosen from a set of size 3 with associated sign bits. _y: Returns the vector of pulses.*/ static void cwrsi3(int _k,celt_uint32 _i,int *_y){ celt_uint32 p; int s; int yj; p=ucwrs3(_k+1U); s=-(_i>=p); _i-=p&s; yj=_k; /*Finds the maximum _k such that ucwrs3(_k)<=_i (tested for all _i<2147418113=U(3,32768)).*/ _k=_i>0?isqrt32(2*_i-1)+1>>1:0; p=ucwrs3(_k); _i-=p; yj-=_k; _y[0]=yj+s^s; cwrsi2(_k,_i,_y+1); } /*Returns the _i'th combination of _k elements (at most 1172) chosen from a set of size 4 with associated sign bits. _y: Returns the vector of pulses.*/ static void cwrsi4(int _k,celt_uint32 _i,int *_y){ celt_uint32 p; int s; int yj; int kl; int kr; p=ucwrs4(_k+1); s=-(_i>=p); _i-=p&s; yj=_k; /*We could solve a cubic for k here, but the form of the direct solution does not lend itself well to exact integer arithmetic. Instead we do a binary search on U(4,K).*/ kl=0; kr=_k; for(;;){ _k=kl+kr>>1; p=ucwrs4(_k); if(p<_i){ if(_k>=kr)break; kl=_k+1; } else if(p>_i)kr=_k-1; else break; } _i-=p; yj-=_k; _y[0]=yj+s^s; cwrsi3(_k,_i,_y+1); } /*Returns the _i'th combination of _k elements (at most 238) chosen from a set of size 5 with associated sign bits. _y: Returns the vector of pulses.*/ static void cwrsi5(int _k,celt_uint32 _i,int *_y){ celt_uint32 p; int s; int yj; p=ucwrs5(_k+1); s=-(_i>=p); _i-=p&s; yj=_k; /* A binary search on U(5,K) avoids the need for 64-bit arithmetic */ { int kl=0; int kr=_k; for(;;){ _k=kl+kr>>1; p=ucwrs5(_k); if(p<_i){ if(_k>=kr)break; kl=_k+1; } else if(p>_i)kr=_k-1; else break; } } _i-=p; yj-=_k; _y[0]=yj+s^s; cwrsi4(_k,_i,_y+1); } #endif /* SMALL_FOOTPRINT */ /*Returns the _i'th combination of _k elements chosen from a set of size _n with associated sign bits. _y: Returns the vector of pulses. _u: Must contain entries [0..._k+1] of row _n of U() on input. Its contents will be destructively modified.*/ static void cwrsi(int _n,int _k,celt_uint32 _i,int *_y,celt_uint32 *_u){ int j; celt_assert(_n>0); j=0; do{ celt_uint32 p; int s; int yj; p=_u[_k+1]; s=-(_i>=p); _i-=p&s; yj=_k; p=_u[_k]; while(p>_i)p=_u[--_k]; _i-=p; yj-=_k; _y[j]=yj+s^s; uprev(_u,_k+2,0); } while(++j<_n); } /*Returns the index of the given combination of K elements chosen from a set of size 1 with associated sign bits. _y: The vector of pulses, whose sum of absolute values is K. _k: Returns K.*/ static inline celt_uint32 icwrs1(const int *_y,int *_k){ *_k=abs(_y[0]); return _y[0]<0; } #ifndef SMALL_FOOTPRINT /*Returns the index of the given combination of K elements chosen from a set of size 2 with associated sign bits. _y: The vector of pulses, whose sum of absolute values is K. _k: Returns K.*/ static inline celt_uint32 icwrs2(const int *_y,int *_k){ celt_uint32 i; int k; i=icwrs1(_y+1,&k); i+=ucwrs2(k); k+=abs(_y[0]); if(_y[0]<0)i+=ucwrs2(k+1U); *_k=k; return i; } /*Returns the index of the given combination of K elements chosen from a set of size 3 with associated sign bits. _y: The vector of pulses, whose sum of absolute values is K. _k: Returns K.*/ static inline celt_uint32 icwrs3(const int *_y,int *_k){ celt_uint32 i; int k; i=icwrs2(_y+1,&k); i+=ucwrs3(k); k+=abs(_y[0]); if(_y[0]<0)i+=ucwrs3(k+1U); *_k=k; return i; } /*Returns the index of the given combination of K elements chosen from a set of size 4 with associated sign bits. _y: The vector of pulses, whose sum of absolute values is K. _k: Returns K.*/ static inline celt_uint32 icwrs4(const int *_y,int *_k){ celt_uint32 i; int k; i=icwrs3(_y+1,&k); i+=ucwrs4(k); k+=abs(_y[0]); if(_y[0]<0)i+=ucwrs4(k+1); *_k=k; return i; } /*Returns the index of the given combination of K elements chosen from a set of size 5 with associated sign bits. _y: The vector of pulses, whose sum of absolute values is K. _k: Returns K.*/ static inline celt_uint32 icwrs5(const int *_y,int *_k){ celt_uint32 i; int k; i=icwrs4(_y+1,&k); i+=ucwrs5(k); k+=abs(_y[0]); if(_y[0]<0)i+=ucwrs5(k+1); *_k=k; return i; } #endif /* SMALL_FOOTPRINT */ /*Returns the index of the given combination of K elements chosen from a set of size _n with associated sign bits. _y: The vector of pulses, whose sum of absolute values must be _k. _nc: Returns V(_n,_k).*/ celt_uint32 icwrs(int _n,int _k,celt_uint32 *_nc,const int *_y, celt_uint32 *_u){ celt_uint32 i; int j; int k; /*We can't unroll the first two iterations of the loop unless _n>=2.*/ celt_assert(_n>=2); _u[0]=0; for(k=1;k<=_k+1;k++)_u[k]=(k<<1)-1; i=icwrs1(_y+_n-1,&k); j=_n-2; i+=_u[k]; k+=abs(_y[j]); if(_y[j]<0)i+=_u[k+1]; while(j-->0){ unext(_u,_k+2,0); i+=_u[k]; k+=abs(_y[j]); if(_y[j]<0)i+=_u[k+1]; } *_nc=_u[k]+_u[k+1]; return i; } /*Computes get_required_bits when splitting is required. _left_bits and _right_bits must contain the required bits for the left and right sides of the split, respectively (which themselves may require splitting).*/ static void get_required_split_bits(celt_int16 *_bits, const celt_int16 *_left_bits,const celt_int16 *_right_bits, int _n,int _maxk,int _frac){ int k; for(k=_maxk;k-->0;){ /*If we've reached a k where everything fits in 32 bits, evaluate the remaining required bits directly.*/ if(fits_in32(_n,k)){ get_required_bits(_bits,_n,k+1,_frac); break; } else{ int worst_bits; int i; /*Due to potentially recursive splitting, it's difficult to derive an analytic expression for the location of the worst-case split index. We simply check them all.*/ worst_bits=0; for(i=0;i<=k;i++){ int split_bits; split_bits=_left_bits[i]+_right_bits[k-i]; if(split_bits>worst_bits)worst_bits=split_bits; } _bits[k]=log2_frac(k+1,_frac)+worst_bits; } } } /*Computes get_required_bits for a pair of N values. _n1 and _n2 must either be equal or two consecutive integers. Returns the buffer used to store the required bits for _n2, which is either _bits1 if _n1==_n2 or _bits2 if _n1+1==_n2.*/ static celt_int16 *get_required_bits_pair(celt_int16 *_bits1, celt_int16 *_bits2,celt_int16 *_tmp,int _n1,int _n2,int _maxk,int _frac){ celt_int16 *tmp2; /*If we only need a single set of required bits...*/ if(_n1==_n2){ /*Stop recursing if everything fits.*/ if(fits_in32(_n1,_maxk-1))get_required_bits(_bits1,_n1,_maxk,_frac); else{ _tmp=get_required_bits_pair(_bits2,_tmp,_bits1, _n1>>1,_n1+1>>1,_maxk,_frac); get_required_split_bits(_bits1,_bits2,_tmp,_n1,_maxk,_frac); } return _bits1; } /*Otherwise we need two distinct sets...*/ celt_assert(_n1+1==_n2); /*Stop recursing if everything fits.*/ if(fits_in32(_n2,_maxk-1)){ get_required_bits(_bits1,_n1,_maxk,_frac); get_required_bits(_bits2,_n2,_maxk,_frac); } /*Otherwise choose an evaluation order that doesn't require extra buffers.*/ else if(_n1&1){ /*This special case isn't really needed, but can save some work.*/ if(fits_in32(_n1,_maxk-1)){ tmp2=get_required_bits_pair(_tmp,_bits1,_bits2, _n2>>1,_n2>>1,_maxk,_frac); get_required_split_bits(_bits2,_tmp,tmp2,_n2,_maxk,_frac); get_required_bits(_bits1,_n1,_maxk,_frac); } else{ _tmp=get_required_bits_pair(_bits2,_tmp,_bits1, _n1>>1,_n1+1>>1,_maxk,_frac); get_required_split_bits(_bits1,_bits2,_tmp,_n1,_maxk,_frac); get_required_split_bits(_bits2,_tmp,_tmp,_n2,_maxk,_frac); } } else{ /*There's no need to special case _n1 fitting by itself, since _n2 requires us to recurse for both values anyway.*/ tmp2=get_required_bits_pair(_tmp,_bits1,_bits2, _n2>>1,_n2+1>>1,_maxk,_frac); get_required_split_bits(_bits2,_tmp,tmp2,_n2,_maxk,_frac); get_required_split_bits(_bits1,_tmp,_tmp,_n1,_maxk,_frac); } return _bits2; } void get_required_bits(celt_int16 *_bits,int _n,int _maxk,int _frac){ int k; /*_maxk==0 => there's nothing to do.*/ celt_assert(_maxk>0); if(fits_in32(_n,_maxk-1)){ _bits[0]=0; if(_maxk>1){ VARDECL(celt_uint32,u); SAVE_STACK; ALLOC(u,_maxk+1U,celt_uint32); ncwrs_urow(_n,_maxk-1,u); for(k=1;k<_maxk;k++)_bits[k]=log2_frac(u[k]+u[k+1],_frac); RESTORE_STACK; } } else{ VARDECL(celt_int16,n1bits); VARDECL(celt_int16,n2bits_buf); celt_int16 *n2bits; SAVE_STACK; ALLOC(n1bits,_maxk,celt_int16); ALLOC(n2bits_buf,_maxk,celt_int16); n2bits=get_required_bits_pair(n1bits,n2bits_buf,_bits, _n>>1,_n+1>>1,_maxk,_frac); get_required_split_bits(_bits,n1bits,n2bits,_n,_maxk,_frac); RESTORE_STACK; } } static inline void encode_pulses32(int _n,int _k,const int *_y,ec_enc *_enc){ celt_uint32 i; switch(_n){ case 1:{ i=icwrs1(_y,&_k); celt_assert(ncwrs1(_k)==2); ec_enc_bits(_enc,i,1); }break; #ifndef SMALL_FOOTPRINT case 2:{ i=icwrs2(_y,&_k); ec_enc_uint(_enc,i,ncwrs2(_k)); }break; case 3:{ i=icwrs3(_y,&_k); ec_enc_uint(_enc,i,ncwrs3(_k)); }break; case 4:{ i=icwrs4(_y,&_k); ec_enc_uint(_enc,i,ncwrs4(_k)); }break; case 5:{ i=icwrs5(_y,&_k); ec_enc_uint(_enc,i,ncwrs5(_k)); }break; #endif default: { VARDECL(celt_uint32,u); celt_uint32 nc; SAVE_STACK; ALLOC(u,_k+2U,celt_uint32); i=icwrs(_n,_k,&nc,_y,u); ec_enc_uint(_enc,i,nc); RESTORE_STACK; }; } } void encode_pulses(int *_y, int N, int K, ec_enc *enc) { if (K==0) { } else if(fits_in32(N,K)) { encode_pulses32(N, K, _y, enc); } else { int i; int count=0; int split; split = (N+1)/2; for (i=0;i> 15) #if 0 #include "dsplib.h" #undef MAX16 #define MAX16(a,b) _max(a,b) #undef MIN16 #define MIN16(a,b) _min(a,b) #undef MAX32 #define MAX32(a,b) _lmax(a,b) #undef MIN32 #define MIN32(a,b) _lmin(a,b) #undef VSHR32 #define VSHR32(a, shift) _lshl(a,-(shift)) #undef MULT16_16_Q15 #define MULT16_16_Q15(a,b) (_smpy(a,b)) #define celt_maxabs16(x, len) MAX16(maxval((DATA *)x, len),-minval((DATA *)x, len)) #define OVERRIDE_CELT_MAXABS16 #define OVERRIDE_FIND_MAX16 static inline int find_max16(celt_word16 *x, int len) { DATA max_corr16 = -VERY_LARGE16; DATA pitch16 = 0; maxvec((DATA *)x, len, &max_corr16, &pitch16); return pitch16; } #endif #endif /* FIXED_C6X_H */ mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/kfft_single.c0000664000175000017500000000330414010707311022633 0ustar builderbuilder/* Copyright (c) 2008 Xiph.Org Foundation, CSIRO */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef FIXED_POINT #include "kfft_single.h" #define SKIP_CONFIG_H #include "kiss_fft.c" #include "kiss_fftr.c" #endif mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/arch.h0000664000175000017500000001623614010707311021272 0ustar builderbuilder/* Copyright (c) 2003-2008 Jean-Marc Valin Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /** @file arch.h @brief Various architecture definitions for CELT */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef ARCH_H #define ARCH_H #include "celt_types.h" #define CELT_SIG_SCALE 32768. #define celt_fatal(str) _celt_fatal(str, __FILE__, __LINE__); #ifdef ENABLE_ASSERTIONS #define celt_assert(cond) {if (!(cond)) {celt_fatal("assertion failed: " #cond);}} #define celt_assert2(cond, message) {if (!(cond)) {celt_fatal("assertion failed: " #cond "\n" message);}} #else #define celt_assert(cond) #define celt_assert2(cond, message) #endif #define IMUL32(a,b) ((a)*(b)) #define UMUL32(a,b) ((celt_int32)(a)*(celt_int32)(b)) #define UMUL16_16(a,b) ((celt_int32)(a)*(celt_int32)(b)) #define ABS(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute integer value. */ #define ABS16(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute 16-bit value. */ #define MIN16(a,b) ((a) < (b) ? (a) : (b)) /**< Minimum 16-bit value. */ #define MAX16(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 16-bit value. */ #define ABS32(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute 32-bit value. */ #define MIN32(a,b) ((a) < (b) ? (a) : (b)) /**< Minimum 32-bit value. */ #define MAX32(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 32-bit value. */ #define IMIN(a,b) ((a) < (b) ? (a) : (b)) /**< Minimum int value. */ #define IMAX(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum int value. */ #define UADD32(a,b) ((a)+(b)) #define USUB32(a,b) ((a)-(b)) #define PRINT_MIPS(file) #ifdef FIXED_POINT typedef celt_int16 celt_word16; typedef celt_int32 celt_word32; typedef celt_word32 celt_sig; typedef celt_word16 celt_norm; typedef celt_word32 celt_ener; typedef celt_word32 celt_mask; #define Q15ONE 32767 #define Q30ONE 1073741823 #define SIG_SHIFT 12 #define NORM_SCALING 16384 #define NORM_SCALING_1 (1.f/16384.f) #define NORM_SHIFT 14 #define ENER_SCALING 16384.f #define ENER_SCALING_1 (1.f/16384.f) #define ENER_SHIFT 14 #define PGAIN_SCALING 32768.f #define PGAIN_SCALING_1 (1.f/32768.f) #define PGAIN_SHIFT 15 #define DB_SHIFT 8 #define EPSILON 1 #define VERY_SMALL 0 #define VERY_LARGE32 ((celt_word32)2147483647) #define VERY_LARGE16 ((celt_word16)32767) #define Q15_ONE ((celt_word16)32767) #define Q15_ONE_1 (1.f/32768.f) #define SCALEIN(a) (a) #define SCALEOUT(a) (a) #ifdef FIXED_DEBUG #include "fixed_debug.h" #else #include "fixed_generic.h" #ifdef ARM5E_ASM #include "fixed_arm5e.h" #elif defined (ARM4_ASM) #include "fixed_arm4.h" #elif defined (BFIN_ASM) #include "fixed_bfin.h" #elif defined (TI_C5X_ASM) #include "fixed_c5x.h" #elif defined (TI_C6X_ASM) #include "fixed_c6x.h" #endif #endif #else /* FIXED_POINT */ typedef float celt_word16; typedef float celt_word32; typedef float celt_sig; typedef float celt_norm; typedef float celt_ener; typedef float celt_pgain; typedef float celt_mask; #define Q15ONE 1.0f #define Q30ONE 1.0f #define NORM_SCALING 1.f #define NORM_SCALING_1 1.f #define ENER_SCALING 1.f #define ENER_SCALING_1 1.f #define PGAIN_SCALING 1.f #define PGAIN_SCALING_1 1.f #define EPSILON 1e-15f #define VERY_SMALL 1e-15f #define VERY_LARGE32 1e15f #define VERY_LARGE16 1e15f #define Q15_ONE ((celt_word16)1.f) #define Q15_ONE_1 ((celt_word16)1.f) #define QCONST16(x,bits) (x) #define QCONST32(x,bits) (x) #define NEG16(x) (-(x)) #define NEG32(x) (-(x)) #define EXTRACT16(x) (x) #define EXTEND32(x) (x) #define SHR16(a,shift) (a) #define SHL16(a,shift) (a) #define SHR32(a,shift) (a) #define SHL32(a,shift) (a) #define PSHR16(a,shift) (a) #define PSHR32(a,shift) (a) #define VSHR32(a,shift) (a) #define SATURATE16(x,a) (x) #define SATURATE32(x,a) (x) #define PSHR(a,shift) (a) #define SHR(a,shift) (a) #define SHL(a,shift) (a) #define SATURATE(x,a) (x) #define ROUND16(a,shift) (a) #define HALF32(x) (.5f*(x)) #define ADD16(a,b) ((a)+(b)) #define SUB16(a,b) ((a)-(b)) #define ADD32(a,b) ((a)+(b)) #define SUB32(a,b) ((a)-(b)) #define MULT16_16_16(a,b) ((a)*(b)) #define MULT16_16(a,b) ((celt_word32)(a)*(celt_word32)(b)) #define MAC16_16(c,a,b) ((c)+(celt_word32)(a)*(celt_word32)(b)) #define MULT16_32_Q11(a,b) ((a)*(b)) #define MULT16_32_Q13(a,b) ((a)*(b)) #define MULT16_32_Q14(a,b) ((a)*(b)) #define MULT16_32_Q15(a,b) ((a)*(b)) #define MULT16_32_Q16(a,b) ((a)*(b)) #define MULT16_32_P15(a,b) ((a)*(b)) #define MULT32_32_Q31(a,b) ((a)*(b)) #define MAC16_32_Q11(c,a,b) ((c)+(a)*(b)) #define MAC16_32_Q15(c,a,b) ((c)+(a)*(b)) #define MAC16_16_Q11(c,a,b) ((c)+(a)*(b)) #define MAC16_16_Q13(c,a,b) ((c)+(a)*(b)) #define MAC16_16_P13(c,a,b) ((c)+(a)*(b)) #define MULT16_16_Q11_32(a,b) ((a)*(b)) #define MULT16_16_Q13(a,b) ((a)*(b)) #define MULT16_16_Q14(a,b) ((a)*(b)) #define MULT16_16_Q15(a,b) ((a)*(b)) #define MULT16_16_P15(a,b) ((a)*(b)) #define MULT16_16_P13(a,b) ((a)*(b)) #define MULT16_16_P14(a,b) ((a)*(b)) #define DIV32_16(a,b) (((celt_word32)(a))/(celt_word16)(b)) #define PDIV32_16(a,b) (((celt_word32)(a))/(celt_word16)(b)) #define DIV32(a,b) (((celt_word32)(a))/(celt_word32)(b)) #define PDIV32(a,b) (((celt_word32)(a))/(celt_word32)(b)) #define SCALEIN(a) ((a)*CELT_SIG_SCALE) #define SCALEOUT(a) ((a)*(1/CELT_SIG_SCALE)) #endif /* !FIXED_POINT */ #if defined (CONFIG_TI_C54X) || defined (CONFIG_TI_C55X) /* 2 on TI C5x DSP */ #define BYTES_PER_CHAR 2 #define BITS_PER_CHAR 16 #define LOG2_BITS_PER_CHAR 4 #else /* CONFIG_TI_C54X */ #define BYTES_PER_CHAR 1 #define BITS_PER_CHAR 8 #define LOG2_BITS_PER_CHAR 3 #endif /* !CONFIG_TI_C54X */ #ifndef GLOBAL_STACK_SIZE #ifdef FIXED_POINT #define GLOBAL_STACK_SIZE 100000 #else #define GLOBAL_STACK_SIZE 100000 #endif #endif #endif /* ARCH_H */ mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/rate.h0000664000175000017500000001177414010707311021312 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef RATE_H #define RATE_H #define MAX_PSEUDO 40 #define LOG_MAX_PSEUDO 6 #define MAX_PULSES 128 #define LOG_MAX_PULSES 7 #define BITRES 4 #define FINE_OFFSET 50 #define QTHETA_OFFSET 40 #define BITOVERFLOW 30000 #include "cwrs.h" static inline int get_pulses(int i) { return i<8 ? i : (8 + (i&7)) << ((i>>3)-1); } static inline int bits2pulses(const CELTMode *m, const celt_int16 *cache, int N, int bits) { int i; int lo, hi; lo = 0; hi = MAX_PSEUDO-1; for (i=0;i>1; /* OPT: Make sure this is implemented with a conditional move */ if (cache[mid] >= bits) hi = mid; else lo = mid; } if (bits-cache[lo] <= cache[hi]-bits) return lo; else return hi; lo = 0; hi = MAX_PULSES-1; #if 0 /* Disabled until we can make that useful */ /* Use of more than MAX_PULSES is disabled until we are able to cwrs that decently */ if (bits > cache[MAX_PULSES-1] && N<=4) { /*int pulses; pulses = 127; while (16 + log2_frac(2*(pulses+1)*(pulses+1) + 1, 4) <= bits && pulses < 32767) pulses++;*/ lo = 127; switch (N) { case 3: hi = 1024; for (i=0;i<10;i++) { int pulses = (lo+hi)>>1; if (log2_frac(((UMUL16_16(pulses,pulses)>>1)+1)>>1, 4) > bits) hi = pulses; else lo = pulses; } break; case 4: hi = 1024; for (i=0;i<10;i++) { int pulses = (lo+hi)>>1; if (log2_frac((UMUL32(UMUL16_16(pulses,pulses)+2,pulses))/3<<3, 4) > bits) hi = pulses; else lo = pulses; } break; } return lo; } #endif /* Instead of using the "bisection condition" we use a fixed number of iterations because it should be faster */ /*while (hi-lo != 1)*/ for (i=0;i>1; /* OPT: Make sure this is implemented with a conditional move */ if (cache[mid] >= bits) hi = mid; else lo = mid; } if (bits-cache[lo] <= cache[hi]-bits) return lo; else return hi; } static inline int pulses2bits(const celt_int16 *cache, int N, int pulses) { #if 0 /* Use of more than MAX_PULSES is disabled until we are able to cwrs that decently */ if (pulses > 127) { int bits; switch (N) { case 3: bits = log2_frac(((UMUL16_16(pulses,pulses)>>1)+1)>>1, 4); break; case 4: bits = log2_frac((UMUL32(UMUL16_16(pulses,pulses)+2,pulses))/3<<3, 4); break; } /*printf ("%d <- %d\n", bits, pulses);*/ return bits; } #endif return cache[pulses]; } /** Computes a cache of the pulses->bits mapping in each band */ celt_int16 **compute_alloc_cache(CELTMode *m, int C); /** Compute the pulse allocation, i.e. how many pulses will go in each * band. @param m mode @param offsets Requested increase or decrease in the number of bits for each band @param total Number of bands @param pulses Number of pulses per band (returned) @return Total number of bits allocated */ void compute_allocation(const CELTMode *m, int *offsets, int total, int *pulses, int *ebits, int *fine_priority, int _C); #endif mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/match-test.sh0000775000175000017500000000103314010707311022601 0ustar builderbuilder#!/bin/sh #outfile=`mktemp` #if [ $? != 0 ]; then # echo "count not create temp output file" # exit 0 #fi outfile=/dev/null if [ -f mono_test_file.sw ]; then echo -n "mono test... " ./testcelt 44100 1 256 32 mono_test_file.sw $outfile if [ $? != 0 ]; then exit 1 fi else echo "no mono test file" fi if [ -f stereo_test_file.sw ]; then echo -n "stereo test... " ./testcelt 44100 2 256 92 stereo_test_file.sw $outfile if [ $? != 0 ]; then exit 1 fi else echo "no stereo test file" fi exit 0 mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/kfft_single.h0000664000175000017500000000512314010707311022641 0ustar builderbuilder/* Copyright (c) 2008 Xiph.Org Foundation, CSIRO */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef KFFT_SINGLE_H #define KFFT_SINGLE_H #ifdef ENABLE_TI_DSPLIB55 #include "dsplib.h" #define real16_fft_alloc(length) NULL #define real16_fft_free(state) #define BITREV(state, i) (i) #define real16_fft_inplace(state, X, nx)\ (\ cfft_SCALE(X,nx/2),\ cbrev(X,X,nx/2),\ unpack(X,nx)\ ) #define real16_ifft(state, X, Y, nx) \ (\ unpacki(X, nx),\ cifft_NOSCALE(X,nx/2),\ cbrev(X,Y,nx/2)\ ) #else /* ENABLE_TI_DSPLIB */ #ifdef FIXED_POINT #ifdef DOUBLE_PRECISION #undef DOUBLE_PRECISION #endif #ifdef MIXED_PRECISION #undef MIXED_PRECISION #endif #endif /* FIXED_POINT */ #include "kiss_fft.h" #include "kiss_fftr.h" #include "_kiss_fft_guts.h" #define real16_fft_alloc(length) kiss_fftr_alloc_celt_single(length, 0, 0); #define real16_fft_free(state) kiss_fft_free(state) #define real16_fft_inplace(state, X, nx) kiss_fftr_inplace(state,X) #define BITREV(state, i) ((state)->substate->bitrev[i]) #define real16_ifft(state, X, Y, nx) kiss_fftri(state,X, Y) #endif /* !ENABLE_TI_DSPLIB */ #endif /* KFFT_SINGLE_H */ mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/modes.c0000664000175000017500000003365714010707311021465 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Copyright (c) 2008 Gregory Maxwell Written by Jean-Marc Valin and Gregory Maxwell */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "celt.h" #include "modes.h" #include "rate.h" #include "os_support.h" #include "stack_alloc.h" #include "quant_bands.h" #ifdef STATIC_MODES #include "static_modes.c" #endif #define MODEVALID 0xa110ca7e #define MODEPARTIAL 0x7eca10a1 #define MODEFREED 0xb10cf8ee #ifndef M_PI #define M_PI 3.141592653 #endif int celt_mode_info(const CELTMode *mode, int request, celt_int32 *value) { if (check_mode(mode) != CELT_OK) return CELT_INVALID_MODE; switch (request) { case CELT_GET_FRAME_SIZE: *value = mode->mdctSize; break; case CELT_GET_LOOKAHEAD: *value = mode->overlap; break; case CELT_GET_BITSTREAM_VERSION: *value = CELT_BITSTREAM_VERSION; break; case CELT_GET_SAMPLE_RATE: *value = mode->Fs; break; default: return CELT_UNIMPLEMENTED; } return CELT_OK; } #ifndef STATIC_MODES /* Defining 25 critical bands for the full 0-20 kHz audio bandwidth Taken from http://ccrma.stanford.edu/~jos/bbt/Bark_Frequency_Scale.html */ #define BARK_BANDS 25 static const celt_int16 bark_freq[BARK_BANDS+1] = { 0, 100, 200, 300, 400, 510, 630, 770, 920, 1080, 1270, 1480, 1720, 2000, 2320, 2700, 3150, 3700, 4400, 5300, 6400, 7700, 9500, 12000, 15500, 20000}; /* This allocation table is per critical band. When creating a mode, the bits get added together into the codec bands, which are sometimes larger than one critical band at low frequency */ #ifdef STDIN_TUNING int BITALLOC_SIZE; int *band_allocation; #else #define BITALLOC_SIZE 12 static const int band_allocation[BARK_BANDS*BITALLOC_SIZE] = /* 0 100 200 300 400 510 630 770 920 1k 1.2 1.5 1.7 2k 2.3 2.7 3.1 3.7 4.4 5.3 6.4 7.7 9.5 12k 15k */ { 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*0*/ 2, 2, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*1*/ 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 4, 5, 7, 7, 7, 5, 4, 0, 0, 0, 0, 0, 0, /*2*/ 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 5, 6, 8, 8, 8, 6, 5, 4, 0, 0, 0, 0, 0, /*3*/ 3, 2, 2, 2, 3, 4, 4, 4, 4, 4, 4, 4, 6, 7, 9, 9, 9, 7, 6, 5, 5, 5, 0, 0, 0, /*4*/ 3, 3, 3, 4, 4, 5, 6, 6, 6, 6, 6, 7, 7, 9, 10, 10, 10, 9, 6, 5, 5, 5, 5, 1, 0, /*5*/ 4, 3, 3, 4, 6, 7, 7, 7, 7, 7, 8, 9, 9, 9, 11, 10, 10, 9, 9, 8, 11, 10, 10, 1, 0, /*6*/ 5, 5, 5, 6, 7, 7, 7, 7, 8, 8, 9, 10, 10, 12, 12, 11, 11, 17, 12, 15, 15, 20, 18, 10, 1, /*7*/ 6, 7, 7, 7, 8, 8, 8, 8, 9, 10, 11, 12, 14, 17, 18, 21, 22, 27, 29, 39, 37, 38, 40, 35, 1, /*8*/ 7, 7, 7, 8, 8, 8, 10, 10, 10, 13, 14, 18, 20, 24, 28, 32, 32, 35, 38, 38, 42, 50, 59, 54, 31, /*9*/ 8, 8, 8, 8, 8, 9, 10, 12, 14, 20, 22, 25, 28, 30, 35, 42, 46, 50, 55, 60, 62, 62, 72, 82, 62, /*10*/ 9, 9, 9, 10, 12, 13, 15, 18, 22, 30, 32, 35, 40, 45, 55, 62, 66, 70, 85, 90, 92, 92, 92,102, 92, /*11*/ }; #endif static celt_int16 *compute_ebands(celt_int32 Fs, int frame_size, int nbShortMdcts, int *nbEBands) { int min_bins = 3; celt_int16 *eBands; int i, res, min_width, lin, low, high, nBark, offset=0; /*if (min_bins < nbShortMdcts) min_bins = nbShortMdcts;*/ res = (Fs+frame_size)/(2*frame_size); min_width = min_bins*res; /* Find the number of critical bands supported by our sampling rate */ for (nBark=1;nBark= Fs) break; /* Find where the linear part ends (i.e. where the spacing is more than min_width */ for (lin=0;lin= min_width) break; low = ((bark_freq[lin]/res)+(min_bins-1))/min_bins; high = nBark-lin; *nbEBands = low+high; eBands = (celt_int16 *) celt_alloc(sizeof(celt_int16)*(*nbEBands+2)); if (eBands==NULL) return NULL; /* Linear spacing (min_width) */ for (i=0;i eBands[*nbEBands+1]) eBands[*nbEBands] = eBands[*nbEBands+1]; for (i=1;i<*nbEBands-1;i++) { if (eBands[i+1]-eBands[i] < eBands[i]-eBands[i-1]) { eBands[i] -= (2*eBands[i]-eBands[i-1]-eBands[i+1]+1)/2; } } /*for (i=0;i<*nbEBands+1;i++) printf ("%d ", eBands[i]); printf ("\n"); exit(1);*/ /* FIXME: Remove last band if too small */ return eBands; } static void compute_allocation_table(CELTMode *mode, int res) { int i, j, nBark; celt_int16 *allocVectors; /* Find the number of critical bands supported by our sampling rate */ for (nBark=1;nBark= mode->Fs) break; mode->nbAllocVectors = BITALLOC_SIZE; allocVectors = (celt_int16 *) celt_alloc(sizeof(celt_int16)*(BITALLOC_SIZE*mode->nbEBands)); if (allocVectors==NULL) return; /* Compute per-codec-band allocation from per-critical-band matrix */ for (i=0;ieBands[eband+1]*res; alloc = mode->mdctSize*band_allocation[i*BARK_BANDS+j]; if (edge < bark_freq[j+1]) { int num, den; num = alloc * (edge-bark_freq[j]); den = bark_freq[j+1]-bark_freq[j]; low = (num+den/2)/den; allocVectors[i*mode->nbEBands+eband] = (current+low+128)/256; current=0; eband++; current += alloc-low; } else { current += alloc; } } allocVectors[i*mode->nbEBands+eband] = (current+128)/256; } mode->allocVectors = allocVectors; } #endif /* STATIC_MODES */ CELTMode *celt_mode_create(celt_int32 Fs, int frame_size, int *error) { int i; #ifdef STDIN_TUNING scanf("%d ", &MIN_BINS); scanf("%d ", &BITALLOC_SIZE); band_allocation = celt_alloc(sizeof(int)*BARK_BANDS*BITALLOC_SIZE); for (i=0;iFs && frame_size == static_mode_list[i]->mdctSize) { m = static_mode_list[i]; break; } } if (m == NULL) { celt_warning("Mode not included as part of the static modes"); if (error) *error = CELT_BAD_ARG; return NULL; } mode = (CELTMode*)celt_alloc(sizeof(CELTMode)); if (mode==NULL) goto failure; CELT_COPY(mode, m, 1); mode->marker_start = MODEPARTIAL; #else int res; CELTMode *mode=NULL; celt_word16 *window; ALLOC_STACK; #if !defined(VAR_ARRAYS) && !defined(USE_ALLOCA) if (global_stack==NULL) { celt_free(global_stack); goto failure; } #endif /* The good thing here is that permutation of the arguments will automatically be invalid */ if (Fs < 32000 || Fs > 96000) { celt_warning("Sampling rate must be between 32 kHz and 96 kHz"); if (error) *error = CELT_BAD_ARG; return NULL; } if (frame_size < 64 || frame_size > 1024 || frame_size%2!=0) { celt_warning("Only even frame sizes from 64 to 1024 are supported"); if (error) *error = CELT_BAD_ARG; return NULL; } res = (Fs+frame_size)/(2*frame_size); mode = (CELTMode *) celt_alloc(sizeof(CELTMode)); if (mode==NULL) goto failure; mode->marker_start = MODEPARTIAL; mode->Fs = Fs; mode->mdctSize = frame_size; mode->ePredCoef = QCONST16(.8f,15); if (frame_size > 640 && (frame_size%16)==0) { mode->nbShortMdcts = 8; } else if (frame_size > 384 && (frame_size%8)==0) { mode->nbShortMdcts = 4; } else if (frame_size > 384 && (frame_size%10)==0) { mode->nbShortMdcts = 5; } else if (frame_size > 256 && (frame_size%6)==0) { mode->nbShortMdcts = 3; } else if (frame_size > 256 && (frame_size%8)==0) { mode->nbShortMdcts = 4; } else if (frame_size > 64 && (frame_size%4)==0) { mode->nbShortMdcts = 2; } else if (frame_size > 128 && (frame_size%6)==0) { mode->nbShortMdcts = 3; } else { mode->nbShortMdcts = 1; } mode->eBands = compute_ebands(Fs, frame_size, mode->nbShortMdcts, &mode->nbEBands); if (mode->eBands==NULL) goto failure; mode->pitchEnd = 4000*(celt_int32)frame_size/Fs; /* Overlap must be divisible by 4 */ if (mode->nbShortMdcts > 1) mode->overlap = ((frame_size/mode->nbShortMdcts)>>2)<<2; else mode->overlap = (frame_size>>3)<<2; compute_allocation_table(mode, res); if (mode->allocVectors==NULL) goto failure; window = (celt_word16*)celt_alloc(mode->overlap*sizeof(celt_word16)); if (window==NULL) goto failure; #ifndef FIXED_POINT for (i=0;ioverlap;i++) window[i] = Q15ONE*sin(.5*M_PI* sin(.5*M_PI*(i+.5)/mode->overlap) * sin(.5*M_PI*(i+.5)/mode->overlap)); #else for (i=0;ioverlap;i++) window[i] = MIN32(32767,32768.*sin(.5*M_PI* sin(.5*M_PI*(i+.5)/mode->overlap) * sin(.5*M_PI*(i+.5)/mode->overlap))); #endif mode->window = window; mode->bits = (const celt_int16 **)compute_alloc_cache(mode, 1); if (mode->bits==NULL) goto failure; #endif /* !STATIC_MODES */ clt_mdct_init(&mode->mdct, 2*mode->mdctSize); mode->shortMdctSize = mode->mdctSize/mode->nbShortMdcts; clt_mdct_init(&mode->shortMdct, 2*mode->shortMdctSize); mode->shortWindow = mode->window; mode->prob = quant_prob_alloc(mode); if ((mode->mdct.trig==NULL) || (mode->shortMdct.trig==NULL) #ifndef ENABLE_TI_DSPLIB55 || (mode->mdct.kfft==NULL) || (mode->shortMdct.kfft==NULL) #endif || (mode->prob==NULL)) goto failure; mode->marker_start = MODEVALID; mode->marker_end = MODEVALID; if (error) *error = CELT_OK; return mode; failure: if (error) *error = CELT_INVALID_MODE; if (mode!=NULL) celt_mode_destroy(mode); return NULL; } void celt_mode_destroy(CELTMode *mode) { int i; const celt_int16 *prevPtr = NULL; if (mode == NULL) { celt_warning("NULL passed to celt_mode_destroy"); return; } if (mode->marker_start == MODEFREED || mode->marker_end == MODEFREED) { celt_warning("Freeing a mode which has already been freed"); return; } if (mode->marker_start != MODEVALID && mode->marker_start != MODEPARTIAL) { celt_warning("This is not a valid CELT mode structure"); return; } mode->marker_start = MODEFREED; #ifndef STATIC_MODES if (mode->bits!=NULL) { for (i=0;inbEBands;i++) { if (mode->bits[i] != prevPtr) { prevPtr = mode->bits[i]; celt_free((int*)mode->bits[i]); } } } celt_free((int**)mode->bits); celt_free((int*)mode->eBands); celt_free((int*)mode->allocVectors); celt_free((celt_word16*)mode->window); #endif clt_mdct_clear(&mode->mdct); clt_mdct_clear(&mode->shortMdct); quant_prob_free(mode->prob); mode->marker_end = MODEFREED; celt_free((CELTMode *)mode); } int check_mode(const CELTMode *mode) { if (mode==NULL) return CELT_INVALID_MODE; if (mode->marker_start == MODEVALID && mode->marker_end == MODEVALID) return CELT_OK; if (mode->marker_start == MODEFREED || mode->marker_end == MODEFREED) celt_warning("Using a mode that has already been freed"); else celt_warning("This is not a valid CELT mode"); return CELT_INVALID_MODE; } mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/modes.h0000664000175000017500000000645114010707311021462 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Copyright (c) 2008 Gregory Maxwell Written by Jean-Marc Valin and Gregory Maxwell */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef MODES_H #define MODES_H #include "celt_types.h" #include "celt.h" #include "arch.h" #include "mdct.h" #include "pitch.h" #define CELT_BITSTREAM_VERSION 0x8000000b #ifdef STATIC_MODES #include "static_modes.h" #endif #define MAX_PERIOD 1024 #ifndef MCHANNELS # ifdef DISABLE_STEREO # define MCHANNELS(mode) (1) # else # define MCHANNELS(mode) ((mode)->nbChannels) # endif #endif #ifndef CHANNELS # ifdef DISABLE_STEREO # define CHANNELS(_C) (1) # else # define CHANNELS(_C) (_C) # endif #endif #define MDCT(mode) (&(mode)->mdct) #ifndef OVERLAP #define OVERLAP(mode) ((mode)->overlap) #endif #ifndef FRAMESIZE #define FRAMESIZE(mode) ((mode)->mdctSize) #endif /** Mode definition (opaque) @brief Mode definition */ struct CELTMode { celt_uint32 marker_start; celt_int32 Fs; int overlap; int mdctSize; int nbEBands; int pitchEnd; const celt_int16 *eBands; /**< Definition for each "pseudo-critical band" */ celt_word16 ePredCoef;/**< Prediction coefficient for the energy encoding */ int nbAllocVectors; /**< Number of lines in the matrix below */ const celt_int16 *allocVectors; /**< Number of bits in each band for several rates */ const celt_int16 * const *bits; /**< Cache for pulses->bits mapping in each band */ /* Stuff that could go in the {en,de}coder, but we save space this way */ mdct_lookup mdct; const celt_word16 *window; int nbShortMdcts; int shortMdctSize; mdct_lookup shortMdct; const celt_word16 *shortWindow; int *prob; celt_uint32 marker_end; }; int check_mode(const CELTMode *mode); #endif mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/fixed_debug.h0000664000175000017500000004147114010707311022621 0ustar builderbuilder/* Copyright (C) 2003-2008 Jean-Marc Valin Copyright (C) 2007-2009 Xiph.Org Foundation */ /** @file fixed_debug.h @brief Fixed-point operations with debugging */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef FIXED_DEBUG_H #define FIXED_DEBUG_H #include #ifdef CELT_C long long celt_mips=0; #else extern long long celt_mips; #endif #define MIPS_INC celt_mips++, #define MULT16_16SU(a,b) ((celt_word32)(celt_word16)(a)*(celt_word32)(celt_uint16)(b)) #define MULT32_32_Q31(a,b) ADD32(ADD32(SHL32(MULT16_16(SHR32((a),16),SHR((b),16)),1), SHR32(MULT16_16SU(SHR32((a),16),((b)&0x0000ffff)),15)), SHR32(MULT16_16SU(SHR32((b),16),((a)&0x0000ffff)),15)) /** 16x32 multiplication, followed by a 16-bit shift right. Results fits in 32 bits */ #define MULT16_32_Q16(a,b) ADD32(MULT16_16((a),SHR32((b),16)), SHR32(MULT16_16SU((a),((b)&0x0000ffff)),16)) #define QCONST16(x,bits) ((celt_word16)(.5+(x)*(((celt_word32)1)<<(bits)))) #define QCONST32(x,bits) ((celt_word32)(.5+(x)*(((celt_word32)1)<<(bits)))) #define VERIFY_SHORT(x) ((x)<=32767&&(x)>=-32768) #define VERIFY_INT(x) ((x)<=2147483647LL&&(x)>=-2147483648LL) #define VERIFY_UINT(x) ((x)<=(2147483647LLU<<1)) #define SHR(a,b) SHR32(a,b) #define PSHR(a,b) PSHR32(a,b) static inline short NEG16(int x) { int res; if (!VERIFY_SHORT(x)) { fprintf (stderr, "NEG16: input is not short: %d\n", (int)x); } res = -x; if (!VERIFY_SHORT(res)) fprintf (stderr, "NEG16: output is not short: %d\n", (int)res); celt_mips++; return res; } static inline int NEG32(long long x) { long long res; if (!VERIFY_INT(x)) { fprintf (stderr, "NEG16: input is not int: %d\n", (int)x); } res = -x; if (!VERIFY_INT(res)) fprintf (stderr, "NEG16: output is not int: %d\n", (int)res); celt_mips+=2; return res; } #define EXTRACT16(x) _EXTRACT16(x, __FILE__, __LINE__) static inline short _EXTRACT16(int x, char *file, int line) { int res; if (!VERIFY_SHORT(x)) { fprintf (stderr, "EXTRACT16: input is not short: %d in %s: line %d\n", x, file, line); } res = x; celt_mips++; return res; } #define EXTEND32(x) _EXTEND32(x, __FILE__, __LINE__) static inline int _EXTEND32(int x, char *file, int line) { int res; if (!VERIFY_SHORT(x)) { fprintf (stderr, "EXTEND32: input is not short: %d in %s: line %d\n", x, file, line); } res = x; celt_mips++; return res; } #define SHR16(a, shift) _SHR16(a, shift, __FILE__, __LINE__) static inline short _SHR16(int a, int shift, char *file, int line) { int res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(shift)) { fprintf (stderr, "SHR16: inputs are not short: %d >> %d in %s: line %d\n", a, shift, file, line); } res = a>>shift; if (!VERIFY_SHORT(res)) fprintf (stderr, "SHR16: output is not short: %d in %s: line %d\n", res, file, line); celt_mips++; return res; } #define SHL16(a, shift) _SHL16(a, shift, __FILE__, __LINE__) static inline short _SHL16(int a, int shift, char *file, int line) { int res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(shift)) { fprintf (stderr, "SHL16: inputs are not short: %d %d in %s: line %d\n", a, shift, file, line); } res = a<>shift; if (!VERIFY_INT(res)) { fprintf (stderr, "SHR32: output is not int: %d\n", (int)res); } celt_mips+=2; return res; } static inline int SHL32(long long a, int shift) { long long res; if (!VERIFY_INT(a) || !VERIFY_SHORT(shift)) { fprintf (stderr, "SHL32: inputs are not int: %d %d\n", (int)a, shift); } res = a<>1))),shift)) #define PSHR32(a,shift) (celt_mips--,SHR32(ADD32((a),(((celt_word32)(1)<<((shift))>>1))),shift)) #define VSHR32(a, shift) (((shift)>0) ? SHR32(a, shift) : SHL32(a, -(shift))) #define SATURATE16(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) #define SATURATE32(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) #define ROUND16(x,a) (celt_mips--,EXTRACT16(PSHR32((x),(a)))) #define HALF32(x) (SHR32(x,1)) //#define SHR(a,shift) ((a) >> (shift)) //#define SHL(a,shift) ((a) << (shift)) #define ADD16(a, b) _ADD16(a, b, __FILE__, __LINE__) static inline short _ADD16(int a, int b, char *file, int line) { int res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "ADD16: inputs are not short: %d %d in %s: line %d\n", a, b, file, line); } res = a+b; if (!VERIFY_SHORT(res)) { fprintf (stderr, "ADD16: output is not short: %d+%d=%d in %s: line %d\n", a,b,res, file, line); } celt_mips++; return res; } #define SUB16(a, b) _SUB16(a, b, __FILE__, __LINE__) static inline short _SUB16(int a, int b, char *file, int line) { int res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "SUB16: inputs are not short: %d %d in %s: line %d\n", a, b, file, line); } res = a-b; if (!VERIFY_SHORT(res)) fprintf (stderr, "SUB16: output is not short: %d in %s: line %d\n", res, file, line); celt_mips++; return res; } #define ADD32(a, b) _ADD32(a, b, __FILE__, __LINE__) static inline int _ADD32(long long a, long long b, char *file, int line) { long long res; if (!VERIFY_INT(a) || !VERIFY_INT(b)) { fprintf (stderr, "ADD32: inputs are not int: %d %d in %s: line %d\n", (int)a, (int)b, file, line); } res = a+b; if (!VERIFY_INT(res)) { fprintf (stderr, "ADD32: output is not int: %d in %s: line %d\n", (int)res, file, line); } celt_mips+=2; return res; } #define SUB32(a, b) _SUB32(a, b, __FILE__, __LINE__) static inline int _SUB32(long long a, long long b, char *file, int line) { long long res; if (!VERIFY_INT(a) || !VERIFY_INT(b)) { fprintf (stderr, "SUB32: inputs are not int: %d %d in %s: line %d\n", (int)a, (int)b, file, line); } res = a-b; if (!VERIFY_INT(res)) fprintf (stderr, "SUB32: output is not int: %d in %s: line %d\n", (int)res, file, line); celt_mips+=2; return res; } #undef UADD32 #define UADD32(a, b) _UADD32(a, b, __FILE__, __LINE__) static inline unsigned int _UADD32(unsigned long long a, unsigned long long b, char *file, int line) { long long res; if (!VERIFY_UINT(a) || !VERIFY_UINT(b)) { fprintf (stderr, "UADD32: inputs are not int: %u %u in %s: line %d\n", (unsigned)a, (unsigned)b, file, line); } res = a+b; if (!VERIFY_UINT(res)) { fprintf (stderr, "UADD32: output is not int: %u in %s: line %d\n", (unsigned)res, file, line); } celt_mips+=2; return res; } #undef USUB32 #define USUB32(a, b) _USUB32(a, b, __FILE__, __LINE__) static inline unsigned int _USUB32(unsigned long long a, unsigned long long b, char *file, int line) { long long res; if (!VERIFY_UINT(a) || !VERIFY_UINT(b)) { /*fprintf (stderr, "USUB32: inputs are not int: %llu %llu in %s: line %d\n", (unsigned)a, (unsigned)b, file, line);*/ } res = a-b; if (!VERIFY_UINT(res)) { /*fprintf (stderr, "USUB32: output is not int: %llu - %llu = %llu in %s: line %d\n", a, b, res, file, line);*/ } celt_mips+=2; return res; } /* result fits in 16 bits */ static inline short MULT16_16_16(int a, int b) { int res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16_16: inputs are not short: %d %d\n", a, b); } res = a*b; if (!VERIFY_SHORT(res)) fprintf (stderr, "MULT16_16_16: output is not short: %d\n", res); celt_mips++; return res; } #define MULT16_16(a, b) _MULT16_16(a, b, __FILE__, __LINE__) static inline int _MULT16_16(int a, int b, char *file, int line) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16: inputs are not short: %d %d in %s: line %d\n", a, b, file, line); } res = ((long long)a)*b; if (!VERIFY_INT(res)) fprintf (stderr, "MULT16_16: output is not int: %d in %s: line %d\n", (int)res, file, line); celt_mips++; return res; } #define MAC16_16(c,a,b) (celt_mips-=2,ADD32((c),MULT16_16((a),(b)))) #define MAC16_16_Q11(c,a,b) (ADD16((c),EXTRACT16(SHR32(MULT16_16((a),(b)),11)))) #define MAC16_16_Q13(c,a,b) (ADD16((c),EXTRACT16(SHR32(MULT16_16((a),(b)),13)))) #define MAC16_16_P13(c,a,b) (ADD16((c),SHR32(ADD32(4096,MULT16_16((a),(b))),13))) #define MULT16_32_QX(a, b, Q) _MULT16_32_QX(a, b, Q, __FILE__, __LINE__) static inline int _MULT16_32_QX(int a, long long b, int Q, char *file, int line) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_INT(b)) { fprintf (stderr, "MULT16_32_Q%d: inputs are not short+int: %d %d in %s: line %d\n", Q, (int)a, (int)b, file, line); } if (ABS32(b)>=((celt_word32)(1)<<(15+Q))) fprintf (stderr, "MULT16_32_Q%d: second operand too large: %d %d in %s: line %d\n", Q, (int)a, (int)b, file, line); res = (((long long)a)*(long long)b) >> Q; if (!VERIFY_INT(res)) fprintf (stderr, "MULT16_32_Q%d: output is not int: %d*%d=%d in %s: line %d\n", Q, (int)a, (int)b,(int)res, file, line); if (Q==15) celt_mips+=3; else celt_mips+=4; return res; } static inline int MULT16_32_PX(int a, long long b, int Q) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_INT(b)) { fprintf (stderr, "MULT16_32_P%d: inputs are not short+int: %d %d\n", Q, (int)a, (int)b); } if (ABS32(b)>=((celt_word32)(1)<<(15+Q))) fprintf (stderr, "MULT16_32_Q%d: second operand too large: %d %d\n", Q, (int)a, (int)b); res = ((((long long)a)*(long long)b) + (((celt_word32)(1)<>1))>> Q; if (!VERIFY_INT(res)) fprintf (stderr, "MULT16_32_P%d: output is not int: %d*%d=%d\n", Q, (int)a, (int)b,(int)res); if (Q==15) celt_mips+=4; else celt_mips+=5; return res; } #define MULT16_32_Q11(a,b) MULT16_32_QX(a,b,11) #define MAC16_32_Q11(c,a,b) ADD32((c),MULT16_32_Q11((a),(b))) #define MULT16_32_Q12(a,b) MULT16_32_QX(a,b,12) #define MULT16_32_Q13(a,b) MULT16_32_QX(a,b,13) #define MULT16_32_Q14(a,b) MULT16_32_QX(a,b,14) #define MULT16_32_Q15(a,b) MULT16_32_QX(a,b,15) #define MULT16_32_P15(a,b) MULT16_32_PX(a,b,15) #define MAC16_32_Q15(c,a,b) (celt_mips-=2,ADD32((c),MULT16_32_Q15((a),(b)))) static inline int SATURATE(int a, int b) { if (a>b) a=b; if (a<-b) a = -b; celt_mips+=3; return a; } static inline int MULT16_16_Q11_32(int a, int b) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16_Q11: inputs are not short: %d %d\n", a, b); } res = ((long long)a)*b; res >>= 11; if (!VERIFY_INT(res)) fprintf (stderr, "MULT16_16_Q11: output is not short: %d*%d=%d\n", (int)a, (int)b, (int)res); celt_mips+=3; return res; } static inline short MULT16_16_Q13(int a, int b) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16_Q13: inputs are not short: %d %d\n", a, b); } res = ((long long)a)*b; res >>= 13; if (!VERIFY_SHORT(res)) fprintf (stderr, "MULT16_16_Q13: output is not short: %d*%d=%d\n", a, b, (int)res); celt_mips+=3; return res; } static inline short MULT16_16_Q14(int a, int b) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16_Q14: inputs are not short: %d %d\n", a, b); } res = ((long long)a)*b; res >>= 14; if (!VERIFY_SHORT(res)) fprintf (stderr, "MULT16_16_Q14: output is not short: %d\n", (int)res); celt_mips+=3; return res; } #define MULT16_16_Q15(a, b) _MULT16_16_Q15(a, b, __FILE__, __LINE__) static inline short _MULT16_16_Q15(int a, int b, char *file, int line) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16_Q15: inputs are not short: %d %d in %s: line %d\n", a, b, file, line); } res = ((long long)a)*b; res >>= 15; if (!VERIFY_SHORT(res)) { fprintf (stderr, "MULT16_16_Q15: output is not short: %d in %s: line %d\n", (int)res, file, line); } celt_mips+=1; return res; } static inline short MULT16_16_P13(int a, int b) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16_P13: inputs are not short: %d %d\n", a, b); } res = ((long long)a)*b; res += 4096; if (!VERIFY_INT(res)) fprintf (stderr, "MULT16_16_P13: overflow: %d*%d=%d\n", a, b, (int)res); res >>= 13; if (!VERIFY_SHORT(res)) fprintf (stderr, "MULT16_16_P13: output is not short: %d*%d=%d\n", a, b, (int)res); celt_mips+=4; return res; } static inline short MULT16_16_P14(int a, int b) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16_P14: inputs are not short: %d %d\n", a, b); } res = ((long long)a)*b; res += 8192; if (!VERIFY_INT(res)) fprintf (stderr, "MULT16_16_P14: overflow: %d*%d=%d\n", a, b, (int)res); res >>= 14; if (!VERIFY_SHORT(res)) fprintf (stderr, "MULT16_16_P14: output is not short: %d*%d=%d\n", a, b, (int)res); celt_mips+=4; return res; } static inline short MULT16_16_P15(int a, int b) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16_P15: inputs are not short: %d %d\n", a, b); } res = ((long long)a)*b; res += 16384; if (!VERIFY_INT(res)) fprintf (stderr, "MULT16_16_P15: overflow: %d*%d=%d\n", a, b, (int)res); res >>= 15; if (!VERIFY_SHORT(res)) fprintf (stderr, "MULT16_16_P15: output is not short: %d*%d=%d\n", a, b, (int)res); celt_mips+=2; return res; } #define DIV32_16(a, b) _DIV32_16(a, b, __FILE__, __LINE__) static inline int _DIV32_16(long long a, long long b, char *file, int line) { long long res; if (b==0) { fprintf(stderr, "DIV32_16: divide by zero: %d/%d in %s: line %d\n", (int)a, (int)b, file, line); return 0; } if (!VERIFY_INT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "DIV32_16: inputs are not int/short: %d %d in %s: line %d\n", (int)a, (int)b, file, line); } res = a/b; if (!VERIFY_SHORT(res)) { fprintf (stderr, "DIV32_16: output is not short: %d / %d = %d in %s: line %d\n", (int)a,(int)b,(int)res, file, line); if (res>32767) res = 32767; if (res<-32768) res = -32768; } celt_mips+=35; return res; } #define DIV32(a, b) _DIV32(a, b, __FILE__, __LINE__) static inline int _DIV32(long long a, long long b, char *file, int line) { long long res; if (b==0) { fprintf(stderr, "DIV32: divide by zero: %d/%d in %s: line %d\n", (int)a, (int)b, file, line); return 0; } if (!VERIFY_INT(a) || !VERIFY_INT(b)) { fprintf (stderr, "DIV32: inputs are not int/short: %d %d in %s: line %d\n", (int)a, (int)b, file, line); } res = a/b; if (!VERIFY_INT(res)) fprintf (stderr, "DIV32: output is not int: %d in %s: line %d\n", (int)res, file, line); celt_mips+=70; return res; } #define PDIV32(a,b) DIV32(ADD32((a),(b)>>1),b) #define PDIV32_16(a,b) DIV32_16(ADD32((a),(b)>>1),b) #undef PRINT_MIPS #define PRINT_MIPS(file) do {fprintf (file, "total complexity = %llu MIPS\n", celt_mips);} while (0); #endif mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/entenc.h0000664000175000017500000001142714010707311021626 0ustar builderbuilder/* Copyright (c) 2001-2008 Timothy B. Terriberry Copyright (c) 2008-2009 Xiph.Org Foundation */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if !defined(_entenc_H) # define _entenc_H (1) # include # include "entcode.h" typedef struct ec_enc ec_enc; /*The entropy encoder.*/ struct ec_enc{ /*Buffered output.*/ ec_byte_buffer *buf; /*A buffered output symbol, awaiting carry propagation.*/ int rem; /*Number of extra carry propagating symbols.*/ size_t ext; /*The number of values in the current range.*/ ec_uint32 rng; /*The low end of the current range (inclusive).*/ ec_uint32 low; /*Byte that will be written at the end*/ unsigned char end_byte; /*Number of valid bits in end_byte*/ int end_bits_left; int nb_end_bits; }; /*Initializes the encoder. _buf: The buffer to store output bytes in. This must have already been initialized for writing and reset.*/ void ec_enc_init(ec_enc *_this,ec_byte_buffer *_buf); /*Encodes a symbol given its frequency information. The frequency information must be discernable by the decoder, assuming it has read only the previous symbols from the stream. It is allowable to change the frequency information, or even the entire source alphabet, so long as the decoder can tell from the context of the previously encoded information that it is supposed to do so as well. _fl: The cumulative frequency of all symbols that come before the one to be encoded. _fh: The cumulative frequency of all symbols up to and including the one to be encoded. Together with _fl, this defines the range [_fl,_fh) in which the decoded value will fall. _ft: The sum of the frequencies of all the symbols*/ void ec_encode(ec_enc *_this,unsigned _fl,unsigned _fh,unsigned _ft); void ec_encode_bin(ec_enc *_this,unsigned _fl,unsigned _fh,unsigned _bits); void ec_encode_raw(ec_enc *_this,unsigned _fl,unsigned _fh,unsigned bits); /*Encodes a sequence of raw bits in the stream. _fl: The bits to encode. _ftb: The number of bits to encode. This must be at least one, and no more than 32.*/ void ec_enc_bits(ec_enc *_this,ec_uint32 _fl,int _ftb); /*Encodes a raw unsigned integer in the stream. _fl: The integer to encode. _ft: The number of integers that can be encoded (one more than the max). This must be at least one, and no more than 2**32-1.*/ void ec_enc_uint(ec_enc *_this,ec_uint32 _fl,ec_uint32 _ft); /*Returns the number of bits "used" by the encoded symbols so far. The actual number of bits may be larger, due to rounding to whole bytes, or smaller, due to trailing zeros that can be stripped, so this is not an estimate of the true packet size. This same number can be computed by the decoder, and is suitable for making coding decisions. _b: The number of extra bits of precision to include. At most 16 will be accurate. Return: The number of bits scaled by 2**_b. This will always be slightly larger than the exact value (e.g., all rounding error is in the positive direction).*/ long ec_enc_tell(ec_enc *_this,int _b); /*Indicates that there are no more symbols to encode. All reamining output bytes are flushed to the output buffer. ec_enc_init() must be called before the encoder can be used again.*/ void ec_enc_done(ec_enc *_this); #endif mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/celt.c0000664000175000017500000013626314010707311021302 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Copyright (c) 2008 Gregory Maxwell Written by Jean-Marc Valin and Gregory Maxwell */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #define CELT_C #include "os_support.h" #include "mdct.h" #include #include "celt.h" #include "pitch.h" #include "bands.h" #include "modes.h" #include "entcode.h" #include "quant_bands.h" #include "rate.h" #include "stack_alloc.h" #include "mathops.h" #include "float_cast.h" #include #define LPC_ORDER 24 /* #define NEW_PLC */ #if !defined(FIXED_POINT) || defined(NEW_PLC) #include "plc.c" #endif static const celt_word16 preemph = QCONST16(0.8f,15); #ifdef FIXED_POINT static const celt_word16 transientWindow[16] = { 279, 1106, 2454, 4276, 6510, 9081, 11900, 14872, 17896, 20868, 23687, 26258, 28492, 30314, 31662, 32489}; #else static const float transientWindow[16] = { 0.0085135, 0.0337639, 0.0748914, 0.1304955, 0.1986827, 0.2771308, 0.3631685, 0.4538658, 0.5461342, 0.6368315, 0.7228692, 0.8013173, 0.8695045, 0.9251086, 0.9662361, 0.9914865}; #endif #define ENCODERVALID 0x4c434554 #define ENCODERPARTIAL 0x5445434c #define ENCODERFREED 0x4c004500 /** Encoder state @brief Encoder state */ struct CELTEncoder { celt_uint32 marker; const CELTMode *mode; /**< Mode used by the encoder */ int frame_size; int block_size; int overlap; int channels; int pitch_enabled; /* Complexity level is allowed to use pitch */ int pitch_permitted; /* Use of the LTP is permitted by the user */ int pitch_available; /* Amount of pitch buffer available */ int force_intra; int delayedIntra; celt_word16 tonal_average; int fold_decision; celt_word16 gain_prod; /* VBR-related parameters */ celt_int32 vbr_reservoir; celt_int32 vbr_drift; celt_int32 vbr_offset; celt_int32 vbr_count; celt_int32 vbr_rate; /* Target number of 16th bits per frame */ celt_word16 * restrict preemph_memE; celt_sig * restrict preemph_memD; celt_sig *in_mem; celt_sig *out_mem; celt_word16 *pitch_buf; celt_sig xmem; celt_word16 *oldBandE; }; static int check_encoder(const CELTEncoder *st) { if (st==NULL) { celt_warning("NULL passed as an encoder structure"); return CELT_INVALID_STATE; } if (st->marker == ENCODERVALID) return CELT_OK; if (st->marker == ENCODERFREED) celt_warning("Referencing an encoder that has already been freed"); else celt_warning("This is not a valid CELT encoder structure"); return CELT_INVALID_STATE; } CELTEncoder *celt_encoder_create(const CELTMode *mode, int channels, int *error) { int N, C; CELTEncoder *st; if (check_mode(mode) != CELT_OK) { if (error) *error = CELT_INVALID_MODE; return NULL; } #ifdef DISABLE_STEREO if (channels > 1) { celt_warning("Stereo support was disable from this build"); if (error) *error = CELT_BAD_ARG; return NULL; } #endif if (channels < 0 || channels > 2) { celt_warning("Only mono and stereo supported"); if (error) *error = CELT_BAD_ARG; return NULL; } N = mode->mdctSize; C = channels; st = (CELTEncoder *) celt_alloc(sizeof(CELTEncoder)); if (st==NULL) { if (error) *error = CELT_ALLOC_FAIL; return NULL; } st->marker = ENCODERPARTIAL; st->mode = mode; st->frame_size = N; st->block_size = N; st->overlap = mode->overlap; st->channels = channels; st->vbr_rate = 0; st->pitch_enabled = 1; st->pitch_permitted = 1; st->pitch_available = 1; st->force_intra = 0; st->delayedIntra = 1; st->tonal_average = QCONST16(1.,8); st->fold_decision = 1; st->in_mem = (celt_sig *) celt_alloc(st->overlap*C*sizeof(celt_sig)); st->out_mem = (celt_sig *) celt_alloc((MAX_PERIOD+st->overlap)*C*sizeof(celt_sig)); st->pitch_buf = (celt_word16 *) celt_alloc(((MAX_PERIOD>>1)+2)*sizeof(celt_word16)); st->oldBandE = (celt_word16*)celt_alloc(C*mode->nbEBands*sizeof(celt_word16)); st->preemph_memE = (celt_word16*)celt_alloc(C*sizeof(celt_word16)); st->preemph_memD = (celt_sig*)celt_alloc(C*sizeof(celt_sig)); if ((st->in_mem!=NULL) && (st->out_mem!=NULL) && (st->oldBandE!=NULL) && (st->preemph_memE!=NULL) && (st->preemph_memD!=NULL)) { if (error) *error = CELT_OK; st->marker = ENCODERVALID; return st; } /* If the setup fails for some reason deallocate it. */ celt_encoder_destroy(st); if (error) *error = CELT_ALLOC_FAIL; return NULL; } void celt_encoder_destroy(CELTEncoder *st) { if (st == NULL) { celt_warning("NULL passed to celt_encoder_destroy"); return; } if (st->marker == ENCODERFREED) { celt_warning("Freeing an encoder which has already been freed"); return; } if (st->marker != ENCODERVALID && st->marker != ENCODERPARTIAL) { celt_warning("This is not a valid CELT encoder structure"); return; } /*Check_mode is non-fatal here because we can still free the encoder memory even if the mode is bad, although calling the free functions in this order is a violation of the API.*/ check_mode(st->mode); celt_free(st->in_mem); celt_free(st->out_mem); celt_free(st->pitch_buf); celt_free(st->oldBandE); celt_free(st->preemph_memE); celt_free(st->preemph_memD); st->marker = ENCODERFREED; celt_free(st); } static inline celt_int16 FLOAT2INT16(float x) { x = x*CELT_SIG_SCALE; x = MAX32(x, -32768); x = MIN32(x, 32767); return (celt_int16)float2int(x); } static inline celt_word16 SIG2WORD16(celt_sig x) { #ifdef FIXED_POINT x = PSHR32(x, SIG_SHIFT); x = MAX32(x, -32768); x = MIN32(x, 32767); return EXTRACT16(x); #else return (celt_word16)x; #endif } static int transient_analysis(celt_word32 *in, int len, int C, int *transient_time, int *transient_shift) { int c, i, n; celt_word32 ratio; VARDECL(celt_word32, begin); SAVE_STACK; ALLOC(begin, len, celt_word32); for (i=0;i 1000) ratio = 1000; ratio *= ratio; if (ratio > 2048) *transient_shift = 3; else *transient_shift = 0; *transient_time = n; RESTORE_STACK; return ratio > 20; } /** Apply window and compute the MDCT for all sub-frames and all channels in a frame */ static void compute_mdcts(const CELTMode *mode, int shortBlocks, celt_sig * restrict in, celt_sig * restrict out, int _C) { const int C = CHANNELS(_C); if (C==1 && !shortBlocks) { const mdct_lookup *lookup = MDCT(mode); const int overlap = OVERLAP(mode); clt_mdct_forward(lookup, in, out, mode->window, overlap); } else { const mdct_lookup *lookup = MDCT(mode); const int overlap = OVERLAP(mode); int N = FRAMESIZE(mode); int B = 1; int b, c; VARDECL(celt_word32, x); VARDECL(celt_word32, tmp); SAVE_STACK; if (shortBlocks) { lookup = &mode->shortMdct; N = mode->shortMdctSize; B = mode->nbShortMdcts; } ALLOC(x, N+overlap, celt_word32); ALLOC(tmp, N, celt_word32); for (c=0;cwindow, overlap); /* Interleaving the sub-frames */ for (j=0;j>1; for (c=0;cwindow, overlap); } else { VARDECL(celt_word32, x); VARDECL(celt_word32, tmp); int b; int N2 = N; int B = 1; int n4offset=0; const mdct_lookup *lookup = MDCT(mode); SAVE_STACK; ALLOC(x, 2*N, celt_word32); ALLOC(tmp, N, celt_word32); if (shortBlocks) { lookup = &mode->shortMdct; N2 = mode->shortMdctSize; B = mode->nbShortMdcts; n4offset = N4; } /* Prevents problems from the imdct doing the overlap-add */ CELT_MEMSET(x+N4, 0, N2); for (b=0;bwindow, overlap); } if (transient_shift > 0) { #ifdef FIXED_POINT for (j=0;j<16;j++) x[N4+transient_time+j-16] = MULT16_32_Q15(SHR16(Q15_ONE-transientWindow[j],transient_shift)+transientWindow[j], SHL32(x[N4+transient_time+j-16],transient_shift)); for (j=transient_time;jchannels); int mdct_weight_shift = 0; int mdct_weight_pos=0; int gain_id=0; int norm_rate; SAVE_STACK; if (check_encoder(st) != CELT_OK) return CELT_INVALID_STATE; if (check_mode(st->mode) != CELT_OK) return CELT_INVALID_MODE; if (nbCompressedBytes<0 || pcm==NULL) return CELT_BAD_ARG; /* The memset is important for now in case the encoder doesn't fill up all the bytes */ CELT_MEMSET(compressed, 0, nbCompressedBytes); ec_byte_writeinit_buffer(&buf, compressed, nbCompressedBytes); ec_enc_init(&enc,&buf); N = st->block_size; N4 = (N-st->overlap)>>1; ALLOC(in, 2*C*N-2*C*N4, celt_sig); CELT_COPY(in, st->in_mem, C*st->overlap); for (c=0;coverlap+c; for (i=0;ipreemph_memE[c]),3)); st->preemph_memE[c] = SCALEIN(*pcmp); inp += C; pcmp += C; } } CELT_COPY(st->in_mem, in+C*(2*N-2*N4-st->overlap), C*st->overlap); /* Transient handling */ transient_time = -1; transient_shift = 0; shortBlocks = 0; if (st->mode->nbShortMdcts > 1 && transient_analysis(in, N+st->overlap, C, &transient_time, &transient_shift)) { #ifndef FIXED_POINT float gain_1; #endif /* Apply the inverse shaping window */ if (transient_shift) { #ifdef FIXED_POINT for (c=0;coverlap;i++) in[C*i+c] = SHR32(in[C*i+c], transient_shift); #else for (c=0;coverlap;i++) in[C*i+c] *= gain_1; #endif } shortBlocks = 1; has_fold = 1; } ALLOC(freq, C*N, celt_sig); /**< Interleaved signal MDCTs */ ALLOC(bandE,st->mode->nbEBands*C, celt_ener); ALLOC(bandLogE,st->mode->nbEBands*C, celt_word16); /* Compute MDCTs */ compute_mdcts(st->mode, shortBlocks, in, freq, C); norm_rate = (nbCompressedBytes-5)*8*(celt_uint32)st->mode->Fs/(C*N)>>10; /* Pitch analysis: we do it early to save on the peak stack space */ /* Don't use pitch if there isn't enough data available yet, or if we're using shortBlocks */ has_pitch = st->pitch_enabled && st->pitch_permitted && (N <= 512) && (st->pitch_available >= MAX_PERIOD) && (!shortBlocks) && norm_rate < 50; if (has_pitch) { VARDECL(celt_word16, x_lp); SAVE_STACK; ALLOC(x_lp, (2*N-2*N4)>>1, celt_word16); pitch_downsample(in, x_lp, 2*N-2*N4, N, C, &st->xmem, &st->pitch_buf[MAX_PERIOD>>1]); pitch_search(st->mode, x_lp, st->pitch_buf, 2*N-2*N4, MAX_PERIOD-(2*N-2*N4), &pitch_index, &st->xmem); RESTORE_STACK; } /* Deferred allocation after find_spectral_pitch() to reduce the peak memory usage */ ALLOC(X, C*N, celt_norm); /**< Interleaved normalised MDCTs */ ALLOC(pitch_freq, C*N, celt_sig); /**< Interleaved signal MDCTs */ if (has_pitch) { compute_mdcts(st->mode, 0, st->out_mem+pitch_index*C, pitch_freq, C); has_pitch = compute_pitch_gain(st->mode, freq, pitch_freq, norm_rate, &gain_id, C, &st->gain_prod); } if (has_pitch) apply_pitch(st->mode, freq, pitch_freq, gain_id, 1, C); compute_band_energies(st->mode, freq, bandE, C); for (i=0;imode->nbEBands*C;i++) bandLogE[i] = amp2Log(bandE[i]); /* Band normalisation */ normalise_bands(st->mode, freq, X, bandE, C); if (!shortBlocks && !folding_decision(st->mode, X, &st->tonal_average, &st->fold_decision, C)) has_fold = 0; /* Don't use intra energy when we're operating at low bit-rate */ intra_ener = st->force_intra || (!has_pitch && st->delayedIntra && nbCompressedBytes > st->mode->nbEBands); if (shortBlocks || intra_decision(bandLogE, st->oldBandE, st->mode->nbEBands)) st->delayedIntra = 1; else st->delayedIntra = 0; NN = st->mode->eBands[st->mode->nbEBands]; if (shortBlocks && !transient_shift) { celt_word32 sum[8]={1,1,1,1,1,1,1,1}; int m; for (c=0;cmode->nbShortMdcts) tmp += ABS32(X[i]); sum[m++] += tmp; } while (mmode->nbShortMdcts); } m=0; #ifdef FIXED_POINT do { if (SHR32(sum[m+1],3) > sum[m]) { mdct_weight_shift=2; mdct_weight_pos = m; } else if (SHR32(sum[m+1],1) > sum[m] && mdct_weight_shift < 2) { mdct_weight_shift=1; mdct_weight_pos = m; } m++; } while (mmode->nbShortMdcts-1); #else do { if (sum[m+1] > 8*sum[m]) { mdct_weight_shift=2; mdct_weight_pos = m; } else if (sum[m+1] > 2*sum[m] && mdct_weight_shift < 2) { mdct_weight_shift=1; mdct_weight_pos = m; } m++; } while (mmode->nbShortMdcts-1); #endif if (mdct_weight_shift) { mdct_shape(st->mode, X, mdct_weight_pos+1, st->mode->nbShortMdcts, N, st->mode->nbShortMdcts, mdct_weight_shift, C); renormalise_bands(st->mode, X, C); } } encode_flags(&enc, intra_ener, has_pitch, shortBlocks, has_fold); if (has_pitch) { ec_enc_uint(&enc, pitch_index, MAX_PERIOD-(2*N-2*N4)); ec_enc_uint(&enc, gain_id, 16); } if (shortBlocks) { if (transient_shift) { ec_enc_uint(&enc, transient_shift, 4); ec_enc_uint(&enc, transient_time, N+st->overlap); } else { ec_enc_uint(&enc, mdct_weight_shift, 4); if (mdct_weight_shift && st->mode->nbShortMdcts!=2) ec_enc_uint(&enc, mdct_weight_pos, st->mode->nbShortMdcts-1); } } ALLOC(fine_quant, st->mode->nbEBands, int); ALLOC(pulses, st->mode->nbEBands, int); /* Computes the max bit-rate allowed in VBR more to avoid busting the budget */ if (st->vbr_rate>0) { celt_int32 vbr_bound, max_allowed; vbr_bound = st->vbr_rate; max_allowed = (st->vbr_rate + vbr_bound - st->vbr_reservoir)>>(BITRES+3); if (max_allowed < 4) max_allowed = 4; if (max_allowed < nbCompressedBytes) nbCompressedBytes = max_allowed; } /* Bit allocation */ ALLOC(error, C*st->mode->nbEBands, celt_word16); coarse_needed = quant_coarse_energy(st->mode, bandLogE, st->oldBandE, nbCompressedBytes*4-8, intra_ener, st->mode->prob, error, &enc, C); coarse_needed = ((coarse_needed*3-1)>>3)+1; if (coarse_needed > nbCompressedBytes) coarse_needed = nbCompressedBytes; /* Variable bitrate */ if (st->vbr_rate>0) { celt_word16 alpha; celt_int32 delta; /* The target rate in 16th bits per frame */ celt_int32 target=st->vbr_rate; /* Shortblocks get a large boost in bitrate, but since they are uncommon long blocks are not greatly effected */ if (shortBlocks) target*=2; else if (st->mode->nbShortMdcts > 1) target-=(target+14)/28; /* The average energy is removed from the target and the actual energy added*/ target=target+st->vbr_offset-588+ec_enc_tell(&enc, BITRES); /* In VBR mode the frame size must not be reduced so much that it would result in the coarse energy busting its budget */ target=IMAX(coarse_needed,(target+64)/128); target=IMIN(nbCompressedBytes,target); /* Make the adaptation coef (alpha) higher at the beginning */ if (st->vbr_count < 990) { st->vbr_count++; alpha = celt_rcp(SHL32(EXTEND32(st->vbr_count+10),16)); /*printf ("%d %d\n", st->vbr_count+10, alpha);*/ } else alpha = QCONST16(.001f,15); /* By how much did we "miss" the target on that frame */ delta = (8<vbr_rate; /* How many bits have we used in excess of what we're allowed */ st->vbr_reservoir += delta; /*printf ("%d\n", st->vbr_reservoir);*/ /* Compute the offset we need to apply in order to reach the target */ st->vbr_drift += MULT16_32_Q15(alpha,delta-st->vbr_offset-st->vbr_drift); st->vbr_offset = -st->vbr_drift; /*printf ("%d\n", st->vbr_drift);*/ /* We could use any multiple of vbr_rate as bound (depending on the delay) */ if (st->vbr_reservoir < 0) { /* We're under the min value -- increase rate */ int adjust = 1-(st->vbr_reservoir-1)/(8<vbr_reservoir += adjust*(8<mode->nbEBands, int); ALLOC(fine_priority, st->mode->nbEBands, int); for (i=0;imode->nbEBands;i++) offsets[i] = 0; bits = nbCompressedBytes*8 - ec_enc_tell(&enc, 0) - 1; compute_allocation(st->mode, offsets, bits, pulses, fine_quant, fine_priority, C); quant_fine_energy(st->mode, bandE, st->oldBandE, error, fine_quant, &enc, C); /* Residual quantisation */ if (C==1) quant_bands(st->mode, X, bandE, pulses, shortBlocks, has_fold, nbCompressedBytes*8, 1, &enc); #ifndef DISABLE_STEREO else quant_bands_stereo(st->mode, X, bandE, pulses, shortBlocks, has_fold, nbCompressedBytes*8, &enc); #endif quant_energy_finalise(st->mode, bandE, st->oldBandE, error, fine_quant, fine_priority, nbCompressedBytes*8-ec_enc_tell(&enc, 0), &enc, C); /* Re-synthesis of the coded audio if required */ if (st->pitch_available>0 || optional_synthesis!=NULL) { if (st->pitch_available>0 && st->pitch_availablepitch_available+=st->frame_size; if (mdct_weight_shift) { mdct_shape(st->mode, X, 0, mdct_weight_pos+1, N, st->mode->nbShortMdcts, mdct_weight_shift, C); } /* Synthesis */ denormalise_bands(st->mode, X, freq, bandE, C); CELT_MOVE(st->out_mem, st->out_mem+C*N, C*(MAX_PERIOD+st->overlap-N)); if (has_pitch) apply_pitch(st->mode, freq, pitch_freq, gain_id, 0, C); compute_inv_mdcts(st->mode, shortBlocks, freq, transient_time, transient_shift, st->out_mem, C); /* De-emphasis and put everything back at the right place in the synthesis history */ if (optional_synthesis != NULL) { deemphasis(st->out_mem, optional_synthesis, N, C, preemph, st->preemph_memD); } } ec_enc_done(&enc); RESTORE_STACK; return nbCompressedBytes; } #ifdef FIXED_POINT #ifndef DISABLE_FLOAT_API int celt_encode_float(CELTEncoder * restrict st, const float * pcm, float * optional_synthesis, unsigned char *compressed, int nbCompressedBytes) { int j, ret, C, N; VARDECL(celt_int16, in); SAVE_STACK; if (check_encoder(st) != CELT_OK) return CELT_INVALID_STATE; if (check_mode(st->mode) != CELT_OK) return CELT_INVALID_MODE; if (pcm==NULL) return CELT_BAD_ARG; C = CHANNELS(st->channels); N = st->block_size; ALLOC(in, C*N, celt_int16); for (j=0;jmode) != CELT_OK) return CELT_INVALID_MODE; if (pcm==NULL) return CELT_BAD_ARG; C=CHANNELS(st->channels); N=st->block_size; ALLOC(in, C*N, celt_sig); for (j=0;jmode) != CELT_OK)) goto bad_mode; switch (request) { case CELT_GET_MODE_REQUEST: { const CELTMode ** value = va_arg(ap, const CELTMode**); if (value==0) goto bad_arg; *value=st->mode; } break; case CELT_SET_COMPLEXITY_REQUEST: { int value = va_arg(ap, celt_int32); if (value<0 || value>10) goto bad_arg; if (value<=2) { st->pitch_enabled = 0; st->pitch_available = 0; } else { st->pitch_enabled = 1; if (st->pitch_available<1) st->pitch_available = 1; } } break; case CELT_SET_PREDICTION_REQUEST: { int value = va_arg(ap, celt_int32); if (value<0 || value>2) goto bad_arg; if (value==0) { st->force_intra = 1; st->pitch_permitted = 0; } else if (value==1) { st->force_intra = 0; st->pitch_permitted = 0; } else { st->force_intra = 0; st->pitch_permitted = 1; } } break; case CELT_SET_VBR_RATE_REQUEST: { celt_int32 value = va_arg(ap, celt_int32); if (value<0) goto bad_arg; if (value>3072000) value = 3072000; st->vbr_rate = ((st->mode->Fs<<3)+(st->block_size>>1))/st->block_size; st->vbr_rate = ((value<<7)+(st->vbr_rate>>1))/st->vbr_rate; } break; case CELT_RESET_STATE: { const CELTMode *mode = st->mode; int C = st->channels; if (st->pitch_available > 0) st->pitch_available = 1; CELT_MEMSET(st->in_mem, 0, st->overlap*C); CELT_MEMSET(st->out_mem, 0, (MAX_PERIOD+st->overlap)*C); CELT_MEMSET(st->oldBandE, 0, C*mode->nbEBands); CELT_MEMSET(st->preemph_memE, 0, C); CELT_MEMSET(st->preemph_memD, 0, C); st->delayedIntra = 1; } break; default: goto bad_request; } va_end(ap); return CELT_OK; bad_mode: va_end(ap); return CELT_INVALID_MODE; bad_arg: va_end(ap); return CELT_BAD_ARG; bad_request: va_end(ap); return CELT_UNIMPLEMENTED; } /**********************************************************************/ /* */ /* DECODER */ /* */ /**********************************************************************/ #ifdef NEW_PLC #define DECODE_BUFFER_SIZE 2048 #else #define DECODE_BUFFER_SIZE MAX_PERIOD #endif #define DECODERVALID 0x4c434454 #define DECODERPARTIAL 0x5444434c #define DECODERFREED 0x4c004400 /** Decoder state @brief Decoder state */ struct CELTDecoder { celt_uint32 marker; const CELTMode *mode; int frame_size; int block_size; int overlap; int channels; ec_byte_buffer buf; ec_enc enc; celt_sig * restrict preemph_memD; celt_sig *out_mem; celt_sig *decode_mem; celt_word16 *oldBandE; #ifdef NEW_PLC celt_word16 *lpc; #endif int last_pitch_index; int loss_count; }; int check_decoder(const CELTDecoder *st) { if (st==NULL) { celt_warning("NULL passed a decoder structure"); return CELT_INVALID_STATE; } if (st->marker == DECODERVALID) return CELT_OK; if (st->marker == DECODERFREED) celt_warning("Referencing a decoder that has already been freed"); else celt_warning("This is not a valid CELT decoder structure"); return CELT_INVALID_STATE; } CELTDecoder *celt_decoder_create(const CELTMode *mode, int channels, int *error) { int N, C; CELTDecoder *st; if (check_mode(mode) != CELT_OK) { if (error) *error = CELT_INVALID_MODE; return NULL; } #ifdef DISABLE_STEREO if (channels > 1) { celt_warning("Stereo support was disable from this build"); if (error) *error = CELT_BAD_ARG; return NULL; } #endif if (channels < 0 || channels > 2) { celt_warning("Only mono and stereo supported"); if (error) *error = CELT_BAD_ARG; return NULL; } N = mode->mdctSize; C = CHANNELS(channels); st = (CELTDecoder *) celt_alloc(sizeof(CELTDecoder)); if (st==NULL) { if (error) *error = CELT_ALLOC_FAIL; return NULL; } st->marker = DECODERPARTIAL; st->mode = mode; st->frame_size = N; st->block_size = N; st->overlap = mode->overlap; st->channels = channels; st->decode_mem = (celt_sig *) celt_alloc((DECODE_BUFFER_SIZE+st->overlap)*C*sizeof(celt_sig)); st->out_mem = st->decode_mem+DECODE_BUFFER_SIZE-MAX_PERIOD; st->oldBandE = (celt_word16*)celt_alloc(C*mode->nbEBands*sizeof(celt_word16)); st->preemph_memD = (celt_sig*)celt_alloc(C*sizeof(celt_sig)); #ifdef NEW_PLC st->lpc = (celt_word16*)celt_alloc(C*LPC_ORDER*sizeof(celt_word16)); #endif st->loss_count = 0; if ((st->decode_mem!=NULL) && (st->out_mem!=NULL) && (st->oldBandE!=NULL) && #ifdef NEW_PLC (st->lpc!=NULL) && #endif (st->preemph_memD!=NULL)) { if (error) *error = CELT_OK; st->marker = DECODERVALID; return st; } /* If the setup fails for some reason deallocate it. */ celt_decoder_destroy(st); if (error) *error = CELT_ALLOC_FAIL; return NULL; } void celt_decoder_destroy(CELTDecoder *st) { if (st == NULL) { celt_warning("NULL passed to celt_decoder_destroy"); return; } if (st->marker == DECODERFREED) { celt_warning("Freeing a decoder which has already been freed"); return; } if (st->marker != DECODERVALID && st->marker != DECODERPARTIAL) { celt_warning("This is not a valid CELT decoder structure"); return; } /*Check_mode is non-fatal here because we can still free the encoder memory even if the mode is bad, although calling the free functions in this order is a violation of the API.*/ check_mode(st->mode); celt_free(st->decode_mem); celt_free(st->oldBandE); celt_free(st->preemph_memD); #ifdef NEW_PLC celt_free(st->lpc); #endif st->marker = DECODERFREED; celt_free(st); } static void celt_decode_lost(CELTDecoder * restrict st, celt_word16 * restrict pcm) { int c, N; int pitch_index; int overlap = st->mode->overlap; celt_word16 fade = Q15ONE; int i, len; VARDECL(celt_sig, freq); const int C = CHANNELS(st->channels); int offset; SAVE_STACK; N = st->block_size; len = N+st->mode->overlap; if (st->loss_count == 0) { celt_word16 pitch_buf[MAX_PERIOD>>1]; celt_word32 tmp=0; celt_word32 mem0[2]={0,0}; celt_word16 mem1[2]={0,0}; pitch_downsample(st->out_mem, pitch_buf, MAX_PERIOD, MAX_PERIOD, C, mem0, mem1); pitch_search(st->mode, pitch_buf+((MAX_PERIOD-len)>>1), pitch_buf, len, MAX_PERIOD-len-100, &pitch_index, &tmp); pitch_index = MAX_PERIOD-len-pitch_index; st->last_pitch_index = pitch_index; } else { pitch_index = st->last_pitch_index; if (st->loss_count < 5) fade = QCONST16(.8f,15); else fade = 0; } #ifndef NEW_PLC offset = MAX_PERIOD-pitch_index; ALLOC(freq,C*N, celt_sig); /**< Interleaved signal MDCTs */ while (offset+len >= MAX_PERIOD) offset -= pitch_index; compute_mdcts(st->mode, 0, st->out_mem+offset*C, freq, C); for (i=0;iout_mem, st->out_mem+C*N, C*(MAX_PERIOD+st->mode->overlap-N)); /* Compute inverse MDCTs */ compute_inv_mdcts(st->mode, 0, freq, -1, 0, st->out_mem, C); #else for (c=0;cout_mem[i*C+c], SIG_SHIFT); if (st->loss_count == 0) { _celt_autocorr(exc, ac, st->mode->window, st->mode->overlap, LPC_ORDER, MAX_PERIOD); /* Noise floor -50 dB */ ac[0] *= 1.00001; /* Lag windowing */ for (i=1;i<=LPC_ORDER;i++) { /*ac[i] *= exp(-.5*(2*M_PI*.002*i)*(2*M_PI*.002*i));*/ ac[i] -= ac[i]*(.008*i)*(.008*i); } _celt_lpc(st->lpc+c*LPC_ORDER, ac, LPC_ORDER); } fir(exc, st->lpc+c*LPC_ORDER, exc, MAX_PERIOD, LPC_ORDER, mem); /*for (i=0;i 1) decay = 1; } /* Copy excitation, taking decay into account */ for (i=0;imode->overlap;i++) { if (offset+i >= MAX_PERIOD) { offset -= pitch_index; decay *= decay; } e[i] = decay*SHL32(EXTEND32(exc[offset+i]), SIG_SHIFT); S1 += st->out_mem[offset+i]*1.*st->out_mem[offset+i]; } iir(e, st->lpc+c*LPC_ORDER, e, len+st->mode->overlap, LPC_ORDER, mem); { float S2=0; for (i=0;i 0.2f*S2)) { for (i=0;imode->overlap-N;i++) st->out_mem[C*i+c] = st->out_mem[C*(N+i)+c]; /* Apply TDAC to the concealed audio so that it blends with the previous and next frames */ for (i=0;imode->window[i ], e[i ]) - MULT16_32_Q15(st->mode->window[overlap-i-1], e[overlap-i-1]); tmp2 = MULT16_32_Q15(st->mode->window[i], e[N+overlap-1-i]) + MULT16_32_Q15(st->mode->window[overlap-i-1], e[N+i ]); tmp1 = MULT16_32_Q15(fade, tmp1); tmp2 = MULT16_32_Q15(fade, tmp2); st->out_mem[C*(MAX_PERIOD+i)+c] = MULT16_32_Q15(st->mode->window[overlap-i-1], tmp2); st->out_mem[C*(MAX_PERIOD+overlap-i-1)+c] = MULT16_32_Q15(st->mode->window[i], tmp2); st->out_mem[C*(MAX_PERIOD-N+i)+c] += MULT16_32_Q15(st->mode->window[i], tmp1); st->out_mem[C*(MAX_PERIOD-N+overlap-i-1)+c] -= MULT16_32_Q15(st->mode->window[overlap-i-1], tmp1); } for (i=0;iout_mem[C*(MAX_PERIOD-N+overlap+i)+c] = MULT16_32_Q15(fade, e[overlap+i]); } #endif deemphasis(st->out_mem, pcm, N, C, preemph, st->preemph_memD); st->loss_count++; RESTORE_STACK; } #ifdef FIXED_POINT int celt_decode(CELTDecoder * restrict st, const unsigned char *data, int len, celt_int16 * restrict pcm) { #else int celt_decode_float(CELTDecoder * restrict st, const unsigned char *data, int len, celt_sig * restrict pcm) { #endif int i, N, N4; int has_pitch, has_fold; int pitch_index; int bits; ec_dec dec; ec_byte_buffer buf; VARDECL(celt_sig, freq); VARDECL(celt_sig, pitch_freq); VARDECL(celt_norm, X); VARDECL(celt_ener, bandE); VARDECL(int, fine_quant); VARDECL(int, pulses); VARDECL(int, offsets); VARDECL(int, fine_priority); int shortBlocks; int intra_ener; int transient_time; int transient_shift; int mdct_weight_shift=0; const int C = CHANNELS(st->channels); int mdct_weight_pos=0; int gain_id=0; SAVE_STACK; if (check_decoder(st) != CELT_OK) return CELT_INVALID_STATE; if (check_mode(st->mode) != CELT_OK) return CELT_INVALID_MODE; if (pcm==NULL) return CELT_BAD_ARG; N = st->block_size; N4 = (N-st->overlap)>>1; ALLOC(freq, C*N, celt_sig); /**< Interleaved signal MDCTs */ ALLOC(X, C*N, celt_norm); /**< Interleaved normalised MDCTs */ ALLOC(bandE, st->mode->nbEBands*C, celt_ener); if (data == NULL) { celt_decode_lost(st, pcm); RESTORE_STACK; return 0; } if (len<0) { RESTORE_STACK; return CELT_BAD_ARG; } ec_byte_readinit(&buf,(unsigned char*)data,len); ec_dec_init(&dec,&buf); decode_flags(&dec, &intra_ener, &has_pitch, &shortBlocks, &has_fold); if (shortBlocks) { transient_shift = ec_dec_uint(&dec, 4); if (transient_shift == 3) { transient_time = ec_dec_uint(&dec, N+st->mode->overlap); } else { mdct_weight_shift = transient_shift; if (mdct_weight_shift && st->mode->nbShortMdcts>2) mdct_weight_pos = ec_dec_uint(&dec, st->mode->nbShortMdcts-1); transient_shift = 0; transient_time = 0; } } else { transient_time = -1; transient_shift = 0; } if (has_pitch) { pitch_index = ec_dec_uint(&dec, MAX_PERIOD-(2*N-2*N4)); gain_id = ec_dec_uint(&dec, 16); } else { pitch_index = 0; } ALLOC(fine_quant, st->mode->nbEBands, int); /* Get band energies */ unquant_coarse_energy(st->mode, bandE, st->oldBandE, len*4-8, intra_ener, st->mode->prob, &dec, C); ALLOC(pulses, st->mode->nbEBands, int); ALLOC(offsets, st->mode->nbEBands, int); ALLOC(fine_priority, st->mode->nbEBands, int); for (i=0;imode->nbEBands;i++) offsets[i] = 0; bits = len*8 - ec_dec_tell(&dec, 0) - 1; compute_allocation(st->mode, offsets, bits, pulses, fine_quant, fine_priority, C); /*bits = ec_dec_tell(&dec, 0); compute_fine_allocation(st->mode, fine_quant, (20*C+len*8/5-(ec_dec_tell(&dec, 0)-bits))/C);*/ unquant_fine_energy(st->mode, bandE, st->oldBandE, fine_quant, &dec, C); ALLOC(pitch_freq, C*N, celt_sig); /**< Interleaved signal MDCTs */ if (has_pitch) { /* Pitch MDCT */ compute_mdcts(st->mode, 0, st->out_mem+pitch_index*C, pitch_freq, C); } /* Decode fixed codebook and merge with pitch */ if (C==1) quant_bands(st->mode, X, bandE, pulses, shortBlocks, has_fold, len*8, 0, &dec); #ifndef DISABLE_STEREO else unquant_bands_stereo(st->mode, X, bandE, pulses, shortBlocks, has_fold, len*8, &dec); #endif unquant_energy_finalise(st->mode, bandE, st->oldBandE, fine_quant, fine_priority, len*8-ec_dec_tell(&dec, 0), &dec, C); if (mdct_weight_shift) { mdct_shape(st->mode, X, 0, mdct_weight_pos+1, N, st->mode->nbShortMdcts, mdct_weight_shift, C); } /* Synthesis */ denormalise_bands(st->mode, X, freq, bandE, C); CELT_MOVE(st->decode_mem, st->decode_mem+C*N, C*(DECODE_BUFFER_SIZE+st->overlap-N)); if (has_pitch) apply_pitch(st->mode, freq, pitch_freq, gain_id, 0, C); /* Compute inverse MDCTs */ compute_inv_mdcts(st->mode, shortBlocks, freq, transient_time, transient_shift, st->out_mem, C); deemphasis(st->out_mem, pcm, N, C, preemph, st->preemph_memD); st->loss_count = 0; RESTORE_STACK; return 0; } #ifdef FIXED_POINT #ifndef DISABLE_FLOAT_API int celt_decode_float(CELTDecoder * restrict st, const unsigned char *data, int len, float * restrict pcm) { int j, ret, C, N; VARDECL(celt_int16, out); SAVE_STACK; if (check_decoder(st) != CELT_OK) return CELT_INVALID_STATE; if (check_mode(st->mode) != CELT_OK) return CELT_INVALID_MODE; if (pcm==NULL) return CELT_BAD_ARG; C = CHANNELS(st->channels); N = st->block_size; ALLOC(out, C*N, celt_int16); ret=celt_decode(st, data, len, out); for (j=0;jmode) != CELT_OK) return CELT_INVALID_MODE; if (pcm==NULL) return CELT_BAD_ARG; C = CHANNELS(st->channels); N = st->block_size; ALLOC(out, C*N, celt_sig); ret=celt_decode_float(st, data, len, out); for (j=0;jmode) != CELT_OK)) goto bad_mode; switch (request) { case CELT_GET_MODE_REQUEST: { const CELTMode ** value = va_arg(ap, const CELTMode**); if (value==0) goto bad_arg; *value=st->mode; } break; case CELT_RESET_STATE: { const CELTMode *mode = st->mode; int C = st->channels; CELT_MEMSET(st->decode_mem, 0, (DECODE_BUFFER_SIZE+st->overlap)*C); CELT_MEMSET(st->oldBandE, 0, C*mode->nbEBands); CELT_MEMSET(st->preemph_memD, 0, C); st->loss_count = 0; } break; default: goto bad_request; } va_end(ap); return CELT_OK; bad_mode: va_end(ap); return CELT_INVALID_MODE; bad_arg: va_end(ap); return CELT_BAD_ARG; bad_request: va_end(ap); return CELT_UNIMPLEMENTED; } const char *celt_strerror(int error) { static const char *error_strings[8] = { "success", "invalid argument", "invalid mode", "internal error", "corrupted stream", "request not implemented", "invalid state", "memory allocation failed" }; if (error > 0 || error < -7) return "unknown error"; else return error_strings[-error]; } mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/vq.h0000664000175000017500000000670514010707311021003 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /** @file vq.h @brief Vector quantisation of the residual */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef VQ_H #define VQ_H #include "entenc.h" #include "entdec.h" #include "modes.h" /** Algebraic pulse-vector quantiser. The signal x is replaced by the sum of * the pitch and a combination of pulses such that its norm is still equal * to 1. This is the function that will typically require the most CPU. * @param x Residual signal to quantise/encode (returns quantised version) * @param W Perceptual weight to use when optimising (currently unused) * @param N Number of samples to encode * @param K Number of pulses to use * @param p Pitch vector (it is assumed that p+x is a unit vector) * @param enc Entropy encoder state */ void alg_quant(celt_norm *X, int N, int K, int spread, ec_enc *enc); /** Algebraic pulse decoder * @param x Decoded normalised spectrum (returned) * @param N Number of samples to decode * @param K Number of pulses to use * @param p Pitch vector (automatically added to x) * @param dec Entropy decoder state */ void alg_unquant(celt_norm *X, int N, int K, int spread, ec_dec *dec); celt_word16 renormalise_vector(celt_norm *X, celt_word16 value, int N, int stride); /** Intra-frame predictor that matches a section of the current frame (at lower * frequencies) to encode the current band. * @param x Residual signal to quantise/encode (returns quantised version) * @param W Perceptual weight * @param N Number of samples to encode * @param K Number of pulses to use * @param Y Lower frequency spectrum to use, normalised to the same standard deviation * @param P Pitch vector (it is assumed that p+x is a unit vector) * @param B Stride (number of channels multiplied by the number of MDCTs per frame) * @param N0 Number of valid offsets */ void intra_fold(const CELTMode *m, int N, const celt_norm * restrict Y, celt_norm * restrict P, int N0, int B); #endif /* VQ_H */ mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/mathops.h0000664000175000017500000002704514010707311022030 0ustar builderbuilder/* Copyright (c) 2002-2008 Jean-Marc Valin Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /** @file mathops.h @brief Various math functions */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef MATHOPS_H #define MATHOPS_H #include "arch.h" #include "entcode.h" #include "os_support.h" #ifndef OVERRIDE_FIND_MAX16 static inline int find_max16(celt_word16 *x, int len) { celt_word16 max_corr=-VERY_LARGE16; int i, id = 0; for (i=0;i max_corr) { id = i; max_corr = x[i]; } } return id; } #endif #ifndef OVERRIDE_FIND_MAX32 static inline int find_max32(celt_word32 *x, int len) { celt_word32 max_corr=-VERY_LARGE32; int i, id = 0; for (i=0;i max_corr) { id = i; max_corr = x[i]; } } return id; } #endif #define FRAC_MUL16(a,b) ((16384+((celt_int32)(celt_int16)(a)*(celt_int16)(b)))>>15) static inline celt_int16 bitexact_cos(celt_int16 x) { celt_int32 tmp; celt_int16 x2; tmp = (4096+((celt_int32)(x)*(x)))>>13; if (tmp > 32767) tmp = 32767; x2 = tmp; x2 = (32767-x2) + FRAC_MUL16(x2, (-7651 + FRAC_MUL16(x2, (8277 + FRAC_MUL16(-626, x2))))); if (x2 > 32766) x2 = 32766; return 1+x2; } #ifndef FIXED_POINT #define celt_sqrt(x) ((float)sqrt(x)) #define celt_psqrt(x) ((float)sqrt(x)) #define celt_rsqrt(x) (1.f/celt_sqrt(x)) #define celt_rsqrt_norm(x) (celt_rsqrt(x)) #define celt_acos acos #define celt_exp exp #define celt_cos_norm(x) (cos((.5f*M_PI)*(x))) #define celt_atan atan #define celt_rcp(x) (1.f/(x)) #define celt_div(a,b) ((a)/(b)) #ifdef FLOAT_APPROX /* Note: This assumes radix-2 floating point with the exponent at bits 23..30 and an offset of 127 denorm, +/- inf and NaN are *not* handled */ /** Base-2 log approximation (log2(x)). */ static inline float celt_log2(float x) { int integer; float frac; union { float f; celt_uint32 i; } in; in.f = x; integer = (in.i>>23)-127; in.i -= integer<<23; frac = in.f - 1.5f; frac = -0.41445418f + frac*(0.95909232f + frac*(-0.33951290f + frac*0.16541097f)); return 1+integer+frac; } /** Base-2 exponential approximation (2^x). */ static inline float celt_exp2(float x) { int integer; float frac; union { float f; celt_uint32 i; } res; integer = floor(x); if (integer < -50) return 0; frac = x-integer; /* K0 = 1, K1 = log(2), K2 = 3-4*log(2), K3 = 3*log(2) - 2 */ res.f = 0.99992522f + frac * (0.69583354f + frac * (0.22606716f + 0.078024523f*frac)); res.i = (res.i + (integer<<23)) & 0x7fffffff; return res.f; } #else #define celt_log2(x) (1.442695040888963387*log(x)) #define celt_exp2(x) (exp(0.6931471805599453094*(x))) #endif #endif #ifdef FIXED_POINT #include "os_support.h" #ifndef OVERRIDE_CELT_ILOG2 /** Integer log in base2. Undefined for zero and negative numbers */ static inline celt_int16 celt_ilog2(celt_int32 x) { celt_assert2(x>0, "celt_ilog2() only defined for strictly positive numbers"); return EC_ILOG(x)-1; } #endif #ifndef OVERRIDE_CELT_MAXABS16 static inline celt_word16 celt_maxabs16(celt_word16 *x, int len) { int i; celt_word16 maxval = 0; for (i=0;i>1; x = VSHR32(x, (k-7)<<1); return PSHR32(celt_rsqrt_norm(x), k); } /** Sqrt approximation (QX input, QX/2 output) */ static inline celt_word32 celt_sqrt(celt_word32 x) { int k; celt_word16 n; celt_word32 rt; const celt_word16 C[5] = {23175, 11561, -3011, 1699, -664}; if (x==0) return 0; k = (celt_ilog2(x)>>1)-7; x = VSHR32(x, (k<<1)); n = x-32768; rt = ADD16(C[0], MULT16_16_Q15(n, ADD16(C[1], MULT16_16_Q15(n, ADD16(C[2], MULT16_16_Q15(n, ADD16(C[3], MULT16_16_Q15(n, (C[4]))))))))); rt = VSHR32(rt,7-k); return rt; } /** Sqrt approximation (QX input, QX/2 output) that assumes that the input is strictly positive */ static inline celt_word32 celt_psqrt(celt_word32 x) { int k; celt_word16 n; celt_word32 rt; const celt_word16 C[5] = {23175, 11561, -3011, 1699, -664}; k = (celt_ilog2(x)>>1)-7; x = VSHR32(x, (k<<1)); n = x-32768; rt = ADD16(C[0], MULT16_16_Q15(n, ADD16(C[1], MULT16_16_Q15(n, ADD16(C[2], MULT16_16_Q15(n, ADD16(C[3], MULT16_16_Q15(n, (C[4]))))))))); rt = VSHR32(rt,7-k); return rt; } #define L1 32767 #define L2 -7651 #define L3 8277 #define L4 -626 static inline celt_word16 _celt_cos_pi_2(celt_word16 x) { celt_word16 x2; x2 = MULT16_16_P15(x,x); return ADD16(1,MIN16(32766,ADD32(SUB16(L1,x2), MULT16_16_P15(x2, ADD32(L2, MULT16_16_P15(x2, ADD32(L3, MULT16_16_P15(L4, x2 )))))))); } #undef L1 #undef L2 #undef L3 #undef L4 static inline celt_word16 celt_cos_norm(celt_word32 x) { x = x&0x0001ffff; if (x>SHL32(EXTEND32(1), 16)) x = SUB32(SHL32(EXTEND32(1), 17),x); if (x&0x00007fff) { if (x14) return 0x7f000000; else if (integer < -15) return 0; frac = SHL16(x-SHL16(integer,11),3); frac = ADD16(D0, MULT16_16_Q15(frac, ADD16(D1, MULT16_16_Q15(frac, ADD16(D2 , MULT16_16_Q15(D3,frac)))))); return VSHR32(EXTEND32(frac), -integer-2); } /** Reciprocal approximation (Q15 input, Q16 output) */ static inline celt_word32 celt_rcp(celt_word32 x) { int i; celt_word16 n; celt_word16 r; celt_assert2(x>0, "celt_rcp() only defined for positive values"); i = celt_ilog2(x); /* n is Q15 with range [0,1). */ n = VSHR32(x,i-15)-32768; /* Start with a linear approximation: r = 1.8823529411764706-0.9411764705882353*n. The coefficients and the result are Q14 in the range [15420,30840].*/ r = ADD16(30840, MULT16_16_Q15(-15420, n)); /* Perform two Newton iterations: r -= r*((r*n)-1.Q15) = r*((r*n)+(r-1.Q15)). */ r = SUB16(r, MULT16_16_Q15(r, ADD16(MULT16_16_Q15(r, n), ADD16(r, -32768)))); /* We subtract an extra 1 in the second iteration to avoid overflow; it also neatly compensates for truncation error in the rest of the process. */ r = SUB16(r, ADD16(1, MULT16_16_Q15(r, ADD16(MULT16_16_Q15(r, n), ADD16(r, -32768))))); /* r is now the Q15 solution to 2/(n+1), with a maximum relative error of 7.05346E-5, a (relative) RMSE of 2.14418E-5, and a peak absolute error of 1.24665/32768. */ return VSHR32(EXTEND32(r),i-16); } #define celt_div(a,b) MULT32_32_Q31((celt_word32)(a),celt_rcp(b)) #define M1 32767 #define M2 -21 #define M3 -11943 #define M4 4936 static inline celt_word16 celt_atan01(celt_word16 x) { return MULT16_16_P15(x, ADD32(M1, MULT16_16_P15(x, ADD32(M2, MULT16_16_P15(x, ADD32(M3, MULT16_16_P15(M4, x))))))); } #undef M1 #undef M2 #undef M3 #undef M4 static inline celt_word16 celt_atan2p(celt_word16 y, celt_word16 x) { if (y < x) { celt_word32 arg; arg = celt_div(SHL32(EXTEND32(y),15),x); if (arg >= 32767) arg = 32767; return SHR16(celt_atan01(EXTRACT16(arg)),1); } else { celt_word32 arg; arg = celt_div(SHL32(EXTEND32(x),15),y); if (arg >= 32767) arg = 32767; return 25736-SHR16(celt_atan01(EXTRACT16(arg)),1); } } #endif /* FIXED_POINT */ #endif /* MATHOPS_H */ mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/entdec.h0000664000175000017500000001302614010707311021611 0ustar builderbuilder/* Copyright (c) 2001-2008 Timothy B. Terriberry Copyright (c) 2008-2009 Xiph.Org Foundation */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if !defined(_entdec_H) # define _entdec_H (1) # include "entcode.h" typedef struct ec_dec ec_dec; /*The entropy decoder.*/ struct ec_dec{ /*The buffer to decode.*/ ec_byte_buffer *buf; /*The remainder of a buffered input symbol.*/ int rem; /*The number of values in the current range.*/ ec_uint32 rng; /*The difference between the input value and the lowest value in the current range.*/ ec_uint32 dif; /*Normalization factor.*/ ec_uint32 nrm; /*Byte that will be written at the end*/ unsigned char end_byte; /*Number of valid bits in end_byte*/ int end_bits_left; int nb_end_bits; }; /*Initializes the decoder. _buf: The input buffer to use. Return: 0 on success, or a negative value on error.*/ void ec_dec_init(ec_dec *_this,ec_byte_buffer *_buf); /*Calculates the cumulative frequency for the next symbol. This can then be fed into the probability model to determine what that symbol is, and the additional frequency information required to advance to the next symbol. This function cannot be called more than once without a corresponding call to ec_dec_update(), or decoding will not proceed correctly. _ft: The total frequency of the symbols in the alphabet the next symbol was encoded with. Return: A cumulative frequency representing the encoded symbol. If the cumulative frequency of all the symbols before the one that was encoded was fl, and the cumulative frequency of all the symbols up to and including the one encoded is fh, then the returned value will fall in the range [fl,fh).*/ unsigned ec_decode(ec_dec *_this,unsigned _ft); unsigned ec_decode_bin(ec_dec *_this,unsigned _bits); unsigned ec_decode_raw(ec_dec *_this,unsigned bits); /*Advance the decoder past the next symbol using the frequency information the symbol was encoded with. Exactly one call to ec_decode() must have been made so that all necessary intermediate calculations are performed. _fl: The cumulative frequency of all symbols that come before the symbol decoded. _fh: The cumulative frequency of all symbols up to and including the symbol decoded. Together with _fl, this defines the range [_fl,_fh) in which the value returned above must fall. _ft: The total frequency of the symbols in the alphabet the symbol decoded was encoded in. This must be the same as passed to the preceding call to ec_decode().*/ void ec_dec_update(ec_dec *_this,unsigned _fl,unsigned _fh, unsigned _ft); /*Extracts a sequence of raw bits from the stream. The bits must have been encoded with ec_enc_bits(). No call to ec_dec_update() is necessary after this call. _ftb: The number of bits to extract. This must be at least one, and no more than 32. Return: The decoded bits.*/ ec_uint32 ec_dec_bits(ec_dec *_this,int _ftb); /*Extracts a raw unsigned integer with a non-power-of-2 range from the stream. The bits must have been encoded with ec_enc_uint(). No call to ec_dec_update() is necessary after this call. _ft: The number of integers that can be decoded (one more than the max). This must be at least one, and no more than 2**32-1. Return: The decoded bits.*/ ec_uint32 ec_dec_uint(ec_dec *_this,ec_uint32 _ft); /*Returns the number of bits "used" by the decoded symbols so far. The actual number of bits may be larger, due to rounding to whole bytes, or smaller, due to trailing zeros that were be stripped, so this is not an estimate of the true packet size. This same number can be computed by the encoder, and is suitable for making coding decisions. _b: The number of extra bits of precision to include. At most 16 will be accurate. Return: The number of bits scaled by 2**_b. This will always be slightly larger than the exact value (e.g., all rounding error is in the positive direction).*/ long ec_dec_tell(ec_dec *_this,int _b); #endif mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/fixed_generic.h0000664000175000017500000002056414010707311023147 0ustar builderbuilder/* Copyright (C) 2007-2009 Xiph.Org Foundation Copyright (C) 2003-2008 Jean-Marc Valin Copyright (C) 2007-2008 CSIRO */ /** @file fixed_generic.h @brief Generic fixed-point operations */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef FIXED_GENERIC_H #define FIXED_GENERIC_H /** Multiply a 16-bit signed value by a 16-bit unsigned value. The result is a 32-bit signed value */ #define MULT16_16SU(a,b) ((celt_word32)(celt_word16)(a)*(celt_word32)(celt_uint16)(b)) /** 16x32 multiplication, followed by a 16-bit shift right. Results fits in 32 bits */ #define MULT16_32_Q16(a,b) ADD32(MULT16_16((a),SHR((b),16)), SHR(MULT16_16SU((a),((b)&0x0000ffff)),16)) /** 16x32 multiplication, followed by a 15-bit shift right. Results fits in 32 bits */ #define MULT16_32_Q15(a,b) ADD32(SHL(MULT16_16((a),SHR((b),16)),1), SHR(MULT16_16SU((a),((b)&0x0000ffff)),15)) /** 32x32 multiplication, followed by a 31-bit shift right. Results fits in 32 bits */ #define MULT32_32_Q31(a,b) ADD32(ADD32(SHL(MULT16_16(SHR((a),16),SHR((b),16)),1), SHR(MULT16_16SU(SHR((a),16),((b)&0x0000ffff)),15)), SHR(MULT16_16SU(SHR((b),16),((a)&0x0000ffff)),15)) /** 32x32 multiplication, followed by a 32-bit shift right. Results fits in 32 bits */ #define MULT32_32_Q32(a,b) ADD32(ADD32(MULT16_16(SHR((a),16),SHR((b),16)), SHR(MULT16_16SU(SHR((a),16),((b)&0x0000ffff)),16)), SHR(MULT16_16SU(SHR((b),16),((a)&0x0000ffff)),16)) /** Compile-time conversion of float constant to 16-bit value */ #define QCONST16(x,bits) ((celt_word16)(.5+(x)*(((celt_word32)1)<<(bits)))) /** Compile-time conversion of float constant to 32-bit value */ #define QCONST32(x,bits) ((celt_word32)(.5+(x)*(((celt_word32)1)<<(bits)))) /** Negate a 16-bit value */ #define NEG16(x) (-(x)) /** Negate a 32-bit value */ #define NEG32(x) (-(x)) /** Change a 32-bit value into a 16-bit value. The value is assumed to fit in 16-bit, otherwise the result is undefined */ #define EXTRACT16(x) ((celt_word16)(x)) /** Change a 16-bit value into a 32-bit value */ #define EXTEND32(x) ((celt_word32)(x)) /** Arithmetic shift-right of a 16-bit value */ #define SHR16(a,shift) ((a) >> (shift)) /** Arithmetic shift-left of a 16-bit value */ #define SHL16(a,shift) ((a) << (shift)) /** Arithmetic shift-right of a 32-bit value */ #define SHR32(a,shift) ((a) >> (shift)) /** Arithmetic shift-left of a 32-bit value */ #define SHL32(a,shift) ((celt_word32)(a) << (shift)) /** 16-bit arithmetic shift right with rounding-to-nearest instead of rounding down */ #define PSHR16(a,shift) (SHR16((a)+((1<<((shift))>>1)),shift)) /** 32-bit arithmetic shift right with rounding-to-nearest instead of rounding down */ #define PSHR32(a,shift) (SHR32((a)+((EXTEND32(1)<<((shift))>>1)),shift)) /** 32-bit arithmetic shift right where the argument can be negative */ #define VSHR32(a, shift) (((shift)>0) ? SHR32(a, shift) : SHL32(a, -(shift))) /** Saturates 16-bit value to +/- a */ #define SATURATE16(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) /** Saturates 32-bit value to +/- a */ #define SATURATE32(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) /** "RAW" macros, should not be used outside of this header file */ #define SHR(a,shift) ((a) >> (shift)) #define SHL(a,shift) ((celt_word32)(a) << (shift)) #define PSHR(a,shift) (SHR((a)+((EXTEND32(1)<<((shift))>>1)),shift)) #define SATURATE(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) /** Shift by a and round-to-neareast 32-bit value. Result is a 16-bit value */ #define ROUND16(x,a) (EXTRACT16(PSHR32((x),(a)))) /** Divide by two */ #define HALF32(x) (SHR32(x,1)) /** Add two 16-bit values */ #define ADD16(a,b) ((celt_word16)((celt_word16)(a)+(celt_word16)(b))) /** Subtract two 16-bit values */ #define SUB16(a,b) ((celt_word16)(a)-(celt_word16)(b)) /** Add two 32-bit values */ #define ADD32(a,b) ((celt_word32)(a)+(celt_word32)(b)) /** Subtract two 32-bit values */ #define SUB32(a,b) ((celt_word32)(a)-(celt_word32)(b)) /** 16x16 multiplication where the result fits in 16 bits */ #define MULT16_16_16(a,b) ((((celt_word16)(a))*((celt_word16)(b)))) /* (celt_word32)(celt_word16) gives TI compiler a hint that it's 16x16->32 multiply */ /** 16x16 multiplication where the result fits in 32 bits */ #define MULT16_16(a,b) (((celt_word32)(celt_word16)(a))*((celt_word32)(celt_word16)(b))) /** 16x16 multiply-add where the result fits in 32 bits */ #define MAC16_16(c,a,b) (ADD32((c),MULT16_16((a),(b)))) /** 16x32 multiplication, followed by a 12-bit shift right. Results fits in 32 bits */ #define MULT16_32_Q12(a,b) ADD32(MULT16_16((a),SHR((b),12)), SHR(MULT16_16((a),((b)&0x00000fff)),12)) /** 16x32 multiplication, followed by a 13-bit shift right. Results fits in 32 bits */ #define MULT16_32_Q13(a,b) ADD32(MULT16_16((a),SHR((b),13)), SHR(MULT16_16((a),((b)&0x00001fff)),13)) /** 16x32 multiplication, followed by a 14-bit shift right. Results fits in 32 bits */ #define MULT16_32_Q14(a,b) ADD32(MULT16_16((a),SHR((b),14)), SHR(MULT16_16((a),((b)&0x00003fff)),14)) /** 16x32 multiplication, followed by an 11-bit shift right. Results fits in 32 bits */ #define MULT16_32_Q11(a,b) ADD32(MULT16_16((a),SHR((b),11)), SHR(MULT16_16((a),((b)&0x000007ff)),11)) /** 16x32 multiply-add, followed by an 11-bit shift right. Results fits in 32 bits */ #define MAC16_32_Q11(c,a,b) ADD32(c,ADD32(MULT16_16((a),SHR((b),11)), SHR(MULT16_16((a),((b)&0x000007ff)),11))) /** 16x32 multiplication, followed by a 15-bit shift right (round-to-nearest). Results fits in 32 bits */ #define MULT16_32_P15(a,b) ADD32(MULT16_16((a),SHR((b),15)), PSHR(MULT16_16((a),((b)&0x00007fff)),15)) /** 16x32 multiply-add, followed by a 15-bit shift right. Results fits in 32 bits */ #define MAC16_32_Q15(c,a,b) ADD32(c,ADD32(MULT16_16((a),SHR((b),15)), SHR(MULT16_16((a),((b)&0x00007fff)),15))) #define MAC16_16_Q11(c,a,b) (ADD32((c),SHR(MULT16_16((a),(b)),11))) #define MAC16_16_Q13(c,a,b) (ADD32((c),SHR(MULT16_16((a),(b)),13))) #define MAC16_16_P13(c,a,b) (ADD32((c),SHR(ADD32(4096,MULT16_16((a),(b))),13))) #define MULT16_16_Q11_32(a,b) (SHR(MULT16_16((a),(b)),11)) #define MULT16_16_Q13(a,b) (SHR(MULT16_16((a),(b)),13)) #define MULT16_16_Q14(a,b) (SHR(MULT16_16((a),(b)),14)) #define MULT16_16_Q15(a,b) (SHR(MULT16_16((a),(b)),15)) #define MULT16_16_P13(a,b) (SHR(ADD32(4096,MULT16_16((a),(b))),13)) #define MULT16_16_P14(a,b) (SHR(ADD32(8192,MULT16_16((a),(b))),14)) #define MULT16_16_P15(a,b) (SHR(ADD32(16384,MULT16_16((a),(b))),15)) /** Divide a 32-bit value by a 16-bit value. Result fits in 16 bits */ #define DIV32_16(a,b) ((celt_word16)(((celt_word32)(a))/((celt_word16)(b)))) /** Divide a 32-bit value by a 16-bit value and round to nearest. Result fits in 16 bits */ #define PDIV32_16(a,b) ((celt_word16)(((celt_word32)(a)+((celt_word16)(b)>>1))/((celt_word16)(b)))) /** Divide a 32-bit value by a 32-bit value. Result fits in 32 bits */ #define DIV32(a,b) (((celt_word32)(a))/((celt_word32)(b))) /** Divide a 32-bit value by a 32-bit value and round to nearest. Result fits in 32 bits */ #define PDIV32(a,b) (((celt_word32)(a)+((celt_word16)(b)>>1))/((celt_word32)(b))) #endif mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/kiss_fft.c0000664000175000017500000005053614010707311022161 0ustar builderbuilder/* Copyright (c) 2003-2004, Mark Borgerding Lots of modifications by Jean-Marc Valin Copyright (c) 2005-2007, Xiph.Org Foundation Copyright (c) 2008, Xiph.Org Foundation, CSIRO All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the author nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef SKIP_CONFIG_H # ifdef HAVE_CONFIG_H # include "config.h" # endif #endif #include "_kiss_fft_guts.h" #include "arch.h" #include "os_support.h" #include "mathops.h" #include "stack_alloc.h" /* The guts header contains all the multiplication and addition macros that are defined for complex numbers. It also delares the kf_ internal functions. */ static void kf_bfly2( kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_cfg st, int m, int N, int mm ) { kiss_fft_cpx * Fout2; kiss_twiddle_cpx * tw1; int i,j; kiss_fft_cpx * Fout_beg = Fout; for (i=0;itwiddles; for(j=0;jr = SHR(Fout->r, 1);Fout->i = SHR(Fout->i, 1); Fout2->r = SHR(Fout2->r, 1);Fout2->i = SHR(Fout2->i, 1); C_MUL (t, *Fout2 , *tw1); tw1 += fstride; C_SUB( *Fout2 , *Fout , t ); C_ADDTO( *Fout , t ); ++Fout2; ++Fout; } } } static void ki_bfly2( kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_cfg st, int m, int N, int mm ) { kiss_fft_cpx * Fout2; kiss_twiddle_cpx * tw1; kiss_fft_cpx t; int i,j; kiss_fft_cpx * Fout_beg = Fout; for (i=0;itwiddles; for(j=0;jtwiddles; for (j=0;jr = PSHR(Fout->r, 2); Fout->i = PSHR(Fout->i, 2); C_SUB( scratch[5] , *Fout, scratch[1] ); C_ADDTO(*Fout, scratch[1]); C_ADD( scratch[3] , scratch[0] , scratch[2] ); C_SUB( scratch[4] , scratch[0] , scratch[2] ); Fout[m2].r = PSHR(Fout[m2].r, 2); Fout[m2].i = PSHR(Fout[m2].i, 2); C_SUB( Fout[m2], *Fout, scratch[3] ); tw1 += fstride; tw2 += fstride*2; tw3 += fstride*3; C_ADDTO( *Fout , scratch[3] ); Fout[m].r = scratch[5].r + scratch[4].i; Fout[m].i = scratch[5].i - scratch[4].r; Fout[m3].r = scratch[5].r - scratch[4].i; Fout[m3].i = scratch[5].i + scratch[4].r; ++Fout; } } } static void ki_bfly4( kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_cfg st, int m, int N, int mm ) { kiss_twiddle_cpx *tw1,*tw2,*tw3; kiss_fft_cpx scratch[6]; const size_t m2=2*m; const size_t m3=3*m; int i, j; kiss_fft_cpx * Fout_beg = Fout; for (i=0;itwiddles; for (j=0;jtwiddles[fstride*m]; tw1=tw2=st->twiddles; do{ C_FIXDIV(*Fout,3); C_FIXDIV(Fout[m],3); C_FIXDIV(Fout[m2],3); C_MUL(scratch[1],Fout[m] , *tw1); C_MUL(scratch[2],Fout[m2] , *tw2); C_ADD(scratch[3],scratch[1],scratch[2]); C_SUB(scratch[0],scratch[1],scratch[2]); tw1 += fstride; tw2 += fstride*2; Fout[m].r = Fout->r - HALF_OF(scratch[3].r); Fout[m].i = Fout->i - HALF_OF(scratch[3].i); C_MULBYSCALAR( scratch[0] , epi3.i ); C_ADDTO(*Fout,scratch[3]); Fout[m2].r = Fout[m].r + scratch[0].i; Fout[m2].i = Fout[m].i - scratch[0].r; Fout[m].r -= scratch[0].i; Fout[m].i += scratch[0].r; ++Fout; }while(--k); } static void ki_bfly3( kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_cfg st, size_t m ) { size_t k=m; const size_t m2 = 2*m; kiss_twiddle_cpx *tw1,*tw2; kiss_fft_cpx scratch[5]; kiss_twiddle_cpx epi3; epi3 = st->twiddles[fstride*m]; tw1=tw2=st->twiddles; do{ C_MULC(scratch[1],Fout[m] , *tw1); C_MULC(scratch[2],Fout[m2] , *tw2); C_ADD(scratch[3],scratch[1],scratch[2]); C_SUB(scratch[0],scratch[1],scratch[2]); tw1 += fstride; tw2 += fstride*2; Fout[m].r = Fout->r - HALF_OF(scratch[3].r); Fout[m].i = Fout->i - HALF_OF(scratch[3].i); C_MULBYSCALAR( scratch[0] , -epi3.i ); C_ADDTO(*Fout,scratch[3]); Fout[m2].r = Fout[m].r + scratch[0].i; Fout[m2].i = Fout[m].i - scratch[0].r; Fout[m].r -= scratch[0].i; Fout[m].i += scratch[0].r; ++Fout; }while(--k); } static void kf_bfly5( kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_cfg st, int m ) { kiss_fft_cpx *Fout0,*Fout1,*Fout2,*Fout3,*Fout4; int u; kiss_fft_cpx scratch[13]; kiss_twiddle_cpx * twiddles = st->twiddles; kiss_twiddle_cpx *tw; kiss_twiddle_cpx ya,yb; ya = twiddles[fstride*m]; yb = twiddles[fstride*2*m]; Fout0=Fout; Fout1=Fout0+m; Fout2=Fout0+2*m; Fout3=Fout0+3*m; Fout4=Fout0+4*m; tw=st->twiddles; for ( u=0; ur += scratch[7].r + scratch[8].r; Fout0->i += scratch[7].i + scratch[8].i; scratch[5].r = scratch[0].r + S_MUL(scratch[7].r,ya.r) + S_MUL(scratch[8].r,yb.r); scratch[5].i = scratch[0].i + S_MUL(scratch[7].i,ya.r) + S_MUL(scratch[8].i,yb.r); scratch[6].r = S_MUL(scratch[10].i,ya.i) + S_MUL(scratch[9].i,yb.i); scratch[6].i = -S_MUL(scratch[10].r,ya.i) - S_MUL(scratch[9].r,yb.i); C_SUB(*Fout1,scratch[5],scratch[6]); C_ADD(*Fout4,scratch[5],scratch[6]); scratch[11].r = scratch[0].r + S_MUL(scratch[7].r,yb.r) + S_MUL(scratch[8].r,ya.r); scratch[11].i = scratch[0].i + S_MUL(scratch[7].i,yb.r) + S_MUL(scratch[8].i,ya.r); scratch[12].r = - S_MUL(scratch[10].i,yb.i) + S_MUL(scratch[9].i,ya.i); scratch[12].i = S_MUL(scratch[10].r,yb.i) - S_MUL(scratch[9].r,ya.i); C_ADD(*Fout2,scratch[11],scratch[12]); C_SUB(*Fout3,scratch[11],scratch[12]); ++Fout0;++Fout1;++Fout2;++Fout3;++Fout4; } } static void ki_bfly5( kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_cfg st, int m ) { kiss_fft_cpx *Fout0,*Fout1,*Fout2,*Fout3,*Fout4; int u; kiss_fft_cpx scratch[13]; kiss_twiddle_cpx * twiddles = st->twiddles; kiss_twiddle_cpx *tw; kiss_twiddle_cpx ya,yb; ya = twiddles[fstride*m]; yb = twiddles[fstride*2*m]; Fout0=Fout; Fout1=Fout0+m; Fout2=Fout0+2*m; Fout3=Fout0+3*m; Fout4=Fout0+4*m; tw=st->twiddles; for ( u=0; ur += scratch[7].r + scratch[8].r; Fout0->i += scratch[7].i + scratch[8].i; scratch[5].r = scratch[0].r + S_MUL(scratch[7].r,ya.r) + S_MUL(scratch[8].r,yb.r); scratch[5].i = scratch[0].i + S_MUL(scratch[7].i,ya.r) + S_MUL(scratch[8].i,yb.r); scratch[6].r = -S_MUL(scratch[10].i,ya.i) - S_MUL(scratch[9].i,yb.i); scratch[6].i = S_MUL(scratch[10].r,ya.i) + S_MUL(scratch[9].r,yb.i); C_SUB(*Fout1,scratch[5],scratch[6]); C_ADD(*Fout4,scratch[5],scratch[6]); scratch[11].r = scratch[0].r + S_MUL(scratch[7].r,yb.r) + S_MUL(scratch[8].r,ya.r); scratch[11].i = scratch[0].i + S_MUL(scratch[7].i,yb.r) + S_MUL(scratch[8].i,ya.r); scratch[12].r = S_MUL(scratch[10].i,yb.i) - S_MUL(scratch[9].i,ya.i); scratch[12].i = -S_MUL(scratch[10].r,yb.i) + S_MUL(scratch[9].r,ya.i); C_ADD(*Fout2,scratch[11],scratch[12]); C_SUB(*Fout3,scratch[11],scratch[12]); ++Fout0;++Fout1;++Fout2;++Fout3;++Fout4; } } /* perform the butterfly for one stage of a mixed radix FFT */ static void kf_bfly_generic( kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_cfg st, int m, int p ) { int u,k,q1,q; kiss_twiddle_cpx * twiddles = st->twiddles; kiss_fft_cpx t; VARDECL(kiss_fft_cpx, scratchbuf); int Norig = st->nfft; ALLOC(scratchbuf, p, kiss_fft_cpx); for ( u=0; u=Norig) twidx-=Norig; C_MUL(t,scratchbuf[q] , twiddles[twidx] ); C_ADDTO( Fout[ k ] ,t); } k += m; } } } static void ki_bfly_generic( kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_cfg st, int m, int p ) { int u,k,q1,q; kiss_twiddle_cpx * twiddles = st->twiddles; kiss_fft_cpx t; VARDECL(kiss_fft_cpx, scratchbuf); int Norig = st->nfft; ALLOC(scratchbuf, p, kiss_fft_cpx); for ( u=0; u=Norig) twidx-=Norig; C_MULC(t,scratchbuf[q] , twiddles[twidx] ); C_ADDTO( Fout[ k ] ,t); } k += m; } } } #endif static void compute_bitrev_table( int Fout, int *f, const size_t fstride, int in_stride, int * factors, const kiss_fft_cfg st ) { const int p=*factors++; /* the radix */ const int m=*factors++; /* stage's fft length/p */ /*printf ("fft %d %d %d %d %d %d\n", p*m, m, p, s2, fstride*in_stride, N);*/ if (m==1) { int j; for (j=0;j32000 || (celt_int32)p*(celt_int32)p > n) p = n; /* no more factors, skip to end */ } n /= p; *facbuf++ = p; *facbuf++ = n; } while (n > 1); } /* * * User-callable function to allocate all necessary storage space for the fft. * * The return value is a contiguous block of memory, allocated with malloc. As such, * It can be freed with free(), rather than a kiss_fft-specific function. * */ kiss_fft_cfg kiss_fft_alloc(int nfft,void * mem,size_t * lenmem ) { kiss_fft_cfg st=NULL; size_t memneeded = sizeof(struct kiss_fft_state) + sizeof(kiss_twiddle_cpx)*(nfft-1) + sizeof(int)*nfft; /* twiddle factors*/ if ( lenmem==NULL ) { st = ( kiss_fft_cfg)KISS_FFT_MALLOC( memneeded ); }else{ if (mem != NULL && *lenmem >= memneeded) st = (kiss_fft_cfg)mem; *lenmem = memneeded; } if (st) { int i; st->nfft=nfft; #ifndef FIXED_POINT st->scale = 1./nfft; #endif #if defined(FIXED_POINT) && (!defined(DOUBLE_PRECISION) || defined(MIXED_PRECISION)) for (i=0;itwiddles+i, DIV32(SHL32(phase,17),nfft)); } #else for (i=0;itwiddles+i, phase ); } #endif kf_factor(nfft,st->factors); /* bitrev */ st->bitrev = (int*)((char*)st + memneeded - sizeof(int)*nfft); compute_bitrev_table(0, st->bitrev, 1,1, st->factors,st); } return st; } void kiss_fft_stride(kiss_fft_cfg st,const kiss_fft_cpx *fin,kiss_fft_cpx *fout,int in_stride) { if (fin == fout) { celt_fatal("In-place FFT not supported"); } else { /* Bit-reverse the input */ int i; for (i=0;infft;i++) { fout[st->bitrev[i]] = fin[i]; #ifndef FIXED_POINT fout[st->bitrev[i]].r *= st->scale; fout[st->bitrev[i]].i *= st->scale; #endif } kf_work( fout, fin, 1,in_stride, st->factors,st, 1, in_stride, 1); } } void kiss_fft(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout) { kiss_fft_stride(cfg,fin,fout,1); } void kiss_ifft_stride(kiss_fft_cfg st,const kiss_fft_cpx *fin,kiss_fft_cpx *fout,int in_stride) { if (fin == fout) { celt_fatal("In-place FFT not supported"); } else { /* Bit-reverse the input */ int i; for (i=0;infft;i++) fout[st->bitrev[i]] = fin[i]; ki_work( fout, fin, 1,in_stride, st->factors,st, 1, in_stride, 1); } } void kiss_ifft(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout) { kiss_ifft_stride(cfg,fin,fout,1); } mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/kiss_fftr.c0000664000175000017500000001413314010707311022334 0ustar builderbuilder/* Original version: Copyright (c) 2003-2004, Mark Borgerding Followed by heavy modifications: Copyright (c) 2007-2008, Jean-Marc Valin All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the author nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef SKIP_CONFIG_H # ifdef HAVE_CONFIG_H # include "config.h" # endif #endif #include "os_support.h" #include "mathops.h" #include "kiss_fftr.h" #include "_kiss_fft_guts.h" kiss_fftr_cfg kiss_fftr_alloc(int nfft,void * mem,size_t * lenmem) { int i; int twiddle_size; kiss_fftr_cfg st = NULL; size_t subsize, memneeded; if (nfft & 1) { celt_warning("Real FFT optimization must be even.\n"); return NULL; } nfft >>= 1; twiddle_size = nfft/2+1; kiss_fft_alloc (nfft, NULL, &subsize); memneeded = sizeof(struct kiss_fftr_state) + subsize + sizeof(kiss_twiddle_cpx)*twiddle_size; if (lenmem == NULL) { st = (kiss_fftr_cfg) KISS_FFT_MALLOC (memneeded); } else { if (*lenmem >= memneeded) st = (kiss_fftr_cfg) mem; *lenmem = memneeded; } if (!st) return NULL; st->substate = (kiss_fft_cfg) (st + 1); /*just beyond kiss_fftr_state struct */ st->super_twiddles = (kiss_twiddle_cpx*) (((char *) st->substate) + subsize); kiss_fft_alloc(nfft, st->substate, &subsize); #ifndef FIXED_POINT st->substate->scale *= .5; #endif #if defined (FIXED_POINT) && (!defined(DOUBLE_PRECISION) || defined(MIXED_PRECISION)) for (i=0;i>1); kf_cexp2(st->super_twiddles+i, DIV32(SHL32(phase,16),nfft)); } #else for (i=0;isuper_twiddles+i, phase ); } #endif return st; } void kiss_fftr_twiddles(kiss_fftr_cfg st,kiss_fft_scalar *freqdata) { /* input buffer timedata is stored row-wise */ int k,ncfft; kiss_fft_cpx f2k,f1k,tdc,tw; ncfft = st->substate->nfft; /* The real part of the DC element of the frequency spectrum in st->tmpbuf * contains the sum of the even-numbered elements of the input time sequence * The imag part is the sum of the odd-numbered elements * * The sum of tdc.r and tdc.i is the sum of the input time sequence. * yielding DC of input time sequence * The difference of tdc.r - tdc.i is the sum of the input (dot product) [1,-1,1,-1... * yielding Nyquist bin of input time sequence */ tdc.r = freqdata[0]; tdc.i = freqdata[1]; C_FIXDIV(tdc,2); CHECK_OVERFLOW_OP(tdc.r ,+, tdc.i); CHECK_OVERFLOW_OP(tdc.r ,-, tdc.i); freqdata[0] = tdc.r + tdc.i; freqdata[1] = tdc.r - tdc.i; for ( k=1;k <= ncfft/2 ; ++k ) { f2k.r = SHR32(SUB32(EXT32(freqdata[2*k]), EXT32(freqdata[2*(ncfft-k)])),1); f2k.i = PSHR32(ADD32(EXT32(freqdata[2*k+1]), EXT32(freqdata[2*(ncfft-k)+1])),1); f1k.r = SHR32(ADD32(EXT32(freqdata[2*k]), EXT32(freqdata[2*(ncfft-k)])),1); f1k.i = SHR32(SUB32(EXT32(freqdata[2*k+1]), EXT32(freqdata[2*(ncfft-k)+1])),1); C_MULC( tw , f2k , st->super_twiddles[k]); freqdata[2*k] = HALF_OF(f1k.r + tw.r); freqdata[2*k+1] = HALF_OF(f1k.i + tw.i); freqdata[2*(ncfft-k)] = HALF_OF(f1k.r - tw.r); freqdata[2*(ncfft-k)+1] = HALF_OF(tw.i - f1k.i); } } void kiss_fftr(kiss_fftr_cfg st,const kiss_fft_scalar *timedata,kiss_fft_scalar *freqdata) { /*perform the parallel fft of two real signals packed in real,imag*/ kiss_fft( st->substate , (const kiss_fft_cpx*)timedata, (kiss_fft_cpx *)freqdata ); kiss_fftr_twiddles(st,freqdata); } void kiss_fftr_inplace(kiss_fftr_cfg st, kiss_fft_scalar *X) { kf_work((kiss_fft_cpx*)X, NULL, 1,1, st->substate->factors,st->substate, 1, 1, 1); kiss_fftr_twiddles(st,X); } void kiss_fftri(kiss_fftr_cfg st,const kiss_fft_scalar *freqdata,kiss_fft_scalar *timedata) { /* input buffer timedata is stored row-wise */ int k, ncfft; ncfft = st->substate->nfft; timedata[2*st->substate->bitrev[0]] = freqdata[0] + freqdata[1]; timedata[2*st->substate->bitrev[0]+1] = freqdata[0] - freqdata[1]; for (k = 1; k <= ncfft / 2; ++k) { kiss_fft_cpx fk, fnkc, fek, fok, tmp; int k1, k2; k1 = st->substate->bitrev[k]; k2 = st->substate->bitrev[ncfft-k]; fk.r = freqdata[2*k]; fk.i = freqdata[2*k+1]; fnkc.r = freqdata[2*(ncfft-k)]; fnkc.i = -freqdata[2*(ncfft-k)+1]; C_ADD (fek, fk, fnkc); C_SUB (tmp, fk, fnkc); C_MUL (fok, tmp, st->super_twiddles[k]); timedata[2*k1] = fek.r + fok.r; timedata[2*k1+1] = fek.i + fok.i; timedata[2*k2] = fek.r - fok.r; timedata[2*k2+1] = fok.i - fek.i; } ki_work((kiss_fft_cpx*)timedata, NULL, 1,1, st->substate->factors,st->substate, 1, 1, 1); } mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/quant_bands.c0000664000175000017500000002350714010707311022646 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "quant_bands.h" #include "laplace.h" #include #include "os_support.h" #include "arch.h" #include "mathops.h" #include "stack_alloc.h" #define E_MEANS_SIZE (5) #ifdef FIXED_POINT const celt_word16 eMeans[E_MEANS_SIZE] = {1920, -341, -512, -107, 43}; #else const celt_word16 eMeans[E_MEANS_SIZE] = {7.5f, -1.33f, -2.f, -0.42f, 0.17f}; #endif /* FIXME: Implement for stereo */ int intra_decision(celt_word16 *eBands, celt_word16 *oldEBands, int len) { int i; celt_word32 dist = 0; for (i=0;i 2*len; } int *quant_prob_alloc(const CELTMode *m) { int i; int *prob; prob = (int *) celt_alloc(4*m->nbEBands*sizeof(int)); if (prob==NULL) return NULL; for (i=0;inbEBands;i++) { prob[2*i] = 6000-i*200; prob[2*i+1] = ec_laplace_get_start_freq(prob[2*i]); } for (i=0;inbEBands;i++) { prob[2*m->nbEBands+2*i] = 9000-i*240; prob[2*m->nbEBands+2*i+1] = ec_laplace_get_start_freq(prob[2*m->nbEBands+2*i]); } return prob; } void quant_prob_free(int *freq) { celt_free(freq); } unsigned quant_coarse_energy(const CELTMode *m, celt_word16 *eBands, celt_word16 *oldEBands, int budget, int intra, int *prob, celt_word16 *error, ec_enc *enc, int _C) { int i, c; unsigned bits_used = 0; celt_word16 prev[2] = {0,0}; celt_word16 coef = m->ePredCoef; celt_word16 beta; const int C = CHANNELS(_C); if (intra) { coef = 0; prob += 2*m->nbEBands; } /* The .8 is a heuristic */ beta = MULT16_16_Q15(QCONST16(.8f,15),coef); /* Encode at a fixed coarse resolution */ for (i=0;inbEBands;i++) { c=0; do { int qi; celt_word16 q; /* dB */ celt_word16 x; /* dB */ celt_word16 f; /* Q8 */ celt_word16 mean = (i < E_MEANS_SIZE) ? MULT16_16_Q15(Q15ONE-coef,eMeans[i]) : 0; x = eBands[i+c*m->nbEBands]; #ifdef FIXED_POINT f = x-mean -MULT16_16_Q15(coef,oldEBands[i+c*m->nbEBands])-prev[c]; /* Rounding to nearest integer here is really important! */ qi = (f+128)>>8; #else f = x-mean-coef*oldEBands[i+c*m->nbEBands]-prev[c]; /* Rounding to nearest integer here is really important! */ qi = (int)floor(.5f+f); #endif /* If we don't have enough bits to encode all the energy, just assume something safe. We allow slightly busting the budget here */ bits_used=ec_enc_tell(enc, 0); if (bits_used > budget) { qi = -1; error[i+c*m->nbEBands] = 128; } else { ec_laplace_encode_start(enc, &qi, prob[2*i], prob[2*i+1]); error[i+c*m->nbEBands] = f - SHL16(qi,8); } q = SHL16(qi,DB_SHIFT); oldEBands[i+c*m->nbEBands] = MULT16_16_Q15(coef,oldEBands[i+c*m->nbEBands])+(mean+prev[c]+q); prev[c] = mean+prev[c]+MULT16_16_Q15(Q15ONE-beta,q); } while (++c < C); } return bits_used; } void quant_fine_energy(const CELTMode *m, celt_ener *eBands, celt_word16 *oldEBands, celt_word16 *error, int *fine_quant, ec_enc *enc, int _C) { int i, c; const int C = CHANNELS(_C); /* Encode finer resolution */ for (i=0;inbEBands;i++) { celt_int16 frac = 1<nbEBands]+QCONST16(.5f,8))>>(8-fine_quant[i]); #else q2 = (int)floor((error[i+c*m->nbEBands]+.5f)*frac); #endif if (q2 > frac-1) q2 = frac-1; ec_enc_bits(enc, q2, fine_quant[i]); #ifdef FIXED_POINT offset = SUB16(SHR16(SHL16(q2,8)+QCONST16(.5,8),fine_quant[i]),QCONST16(.5f,8)); #else offset = (q2+.5f)*(1<<(14-fine_quant[i]))*(1.f/16384) - .5f; #endif oldEBands[i+c*m->nbEBands] += offset; error[i+c*m->nbEBands] -= offset; eBands[i+c*m->nbEBands] = log2Amp(oldEBands[i+c*m->nbEBands]); /*printf ("%f ", error[i] - offset);*/ } while (++c < C); } for (i=0;inbEBands;i++) eBands[i] = log2Amp(oldEBands[i]); } void quant_energy_finalise(const CELTMode *m, celt_ener *eBands, celt_word16 *oldEBands, celt_word16 *error, int *fine_quant, int *fine_priority, int bits_left, ec_enc *enc, int _C) { int i, prio, c; const int C = CHANNELS(_C); /* Use up the remaining bits */ for (prio=0;prio<2;prio++) { for (i=0;inbEBands && bits_left>=C ;i++) { if (fine_quant[i] >= 7 || fine_priority[i]!=prio) continue; c=0; do { int q2; celt_word16 offset; q2 = error[i+c*m->nbEBands]<0 ? 0 : 1; ec_enc_bits(enc, q2, 1); #ifdef FIXED_POINT offset = SHR16(SHL16(q2,8)-QCONST16(.5,8),fine_quant[i]+1); #else offset = (q2-.5f)*(1<<(14-fine_quant[i]-1))*(1.f/16384); #endif oldEBands[i+c*m->nbEBands] += offset; bits_left--; } while (++c < C); } } for (i=0;inbEBands;i++) { eBands[i] = log2Amp(oldEBands[i]); if (oldEBands[i] < -QCONST16(7.f,8)) oldEBands[i] = -QCONST16(7.f,8); } } void unquant_coarse_energy(const CELTMode *m, celt_ener *eBands, celt_word16 *oldEBands, int budget, int intra, int *prob, ec_dec *dec, int _C) { int i, c; celt_word16 prev[2] = {0, 0}; celt_word16 coef = m->ePredCoef; celt_word16 beta; const int C = CHANNELS(_C); if (intra) { coef = 0; prob += 2*m->nbEBands; } /* The .8 is a heuristic */ beta = MULT16_16_Q15(QCONST16(.8f,15),coef); /* Decode at a fixed coarse resolution */ for (i=0;inbEBands;i++) { c=0; do { int qi; celt_word16 q; celt_word16 mean = (i < E_MEANS_SIZE) ? MULT16_16_Q15(Q15ONE-coef,eMeans[i]) : 0; /* If we didn't have enough bits to encode all the energy, just assume something safe. We allow slightly busting the budget here */ if (ec_dec_tell(dec, 0) > budget) qi = -1; else qi = ec_laplace_decode_start(dec, prob[2*i], prob[2*i+1]); q = SHL16(qi,DB_SHIFT); oldEBands[i+c*m->nbEBands] = MULT16_16_Q15(coef,oldEBands[i+c*m->nbEBands])+(mean+prev[c]+q); prev[c] = mean+prev[c]+MULT16_16_Q15(Q15ONE-beta,q); } while (++c < C); } } void unquant_fine_energy(const CELTMode *m, celt_ener *eBands, celt_word16 *oldEBands, int *fine_quant, ec_dec *dec, int _C) { int i, c; const int C = CHANNELS(_C); /* Decode finer resolution */ for (i=0;inbEBands;i++) { if (fine_quant[i] <= 0) continue; c=0; do { int q2; celt_word16 offset; q2 = ec_dec_bits(dec, fine_quant[i]); #ifdef FIXED_POINT offset = SUB16(SHR16(SHL16(q2,8)+QCONST16(.5,8),fine_quant[i]),QCONST16(.5f,8)); #else offset = (q2+.5f)*(1<<(14-fine_quant[i]))*(1.f/16384) - .5f; #endif oldEBands[i+c*m->nbEBands] += offset; } while (++c < C); } for (i=0;inbEBands;i++) eBands[i] = log2Amp(oldEBands[i]); } void unquant_energy_finalise(const CELTMode *m, celt_ener *eBands, celt_word16 *oldEBands, int *fine_quant, int *fine_priority, int bits_left, ec_dec *dec, int _C) { int i, prio, c; const int C = CHANNELS(_C); /* Use up the remaining bits */ for (prio=0;prio<2;prio++) { for (i=0;inbEBands && bits_left>=C ;i++) { if (fine_quant[i] >= 7 || fine_priority[i]!=prio) continue; c=0; do { int q2; celt_word16 offset; q2 = ec_dec_bits(dec, 1); #ifdef FIXED_POINT offset = SHR16(SHL16(q2,8)-QCONST16(.5,8),fine_quant[i]+1); #else offset = (q2-.5f)*(1<<(14-fine_quant[i]-1))*(1.f/16384); #endif oldEBands[i+c*m->nbEBands] += offset; bits_left--; } while (++c < C); } } for (i=0;inbEBands;i++) { eBands[i] = log2Amp(oldEBands[i]); if (oldEBands[i] < -QCONST16(7.f,8)) oldEBands[i] = -QCONST16(7.f,8); } } mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/rate.c0000664000175000017500000001410714010707311021276 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "modes.h" #include "cwrs.h" #include "arch.h" #include "os_support.h" #include "entcode.h" #include "rate.h" #ifndef STATIC_MODES celt_int16 **compute_alloc_cache(CELTMode *m, int C) { int i, prevN; int error = 0; celt_int16 **bits; const celt_int16 *eBands = m->eBands; bits = (celt_int16 **) celt_alloc(m->nbEBands*sizeof(celt_int16*)); if (bits==NULL) return NULL; prevN = -1; for (i=0;inbEBands;i++) { int N = C*(eBands[i+1]-eBands[i]); if (N == prevN && eBands[i] < m->pitchEnd) { bits[i] = bits[i-1]; } else { bits[i] = (celt_int16 *) celt_alloc(MAX_PSEUDO*sizeof(celt_int16)); if (bits[i]!=NULL) { int j; celt_int16 tmp[MAX_PULSES]; get_required_bits(tmp, N, MAX_PULSES, BITRES); for (j=0;jnbEBands;i++) { if (bits[i] != prevPtr) { prevPtr = bits[i]; celt_free((int*)bits[i]); } } free(bits); bits=NULL; } } return bits; } #endif /* !STATIC_MODES */ static void interp_bits2pulses(const CELTMode *m, int *bits1, int *bits2, int total, int *bits, int *ebits, int *fine_priority, int len, int _C) { int psum; int lo, hi; int j; const int C = CHANNELS(_C); SAVE_STACK; lo = 0; hi = 1<>1; psum = 0; for (j=0;j (total<eBands[j+1]-m->eBands[j]; /* Compensate for the extra DoF in stereo */ d=(C*N+ ((C==2 && N>2) ? 1 : 0))<= offset; /* Make sure not to bust */ if (C*ebits[j] > (bits[j]>>BITRES)) ebits[j] = bits[j]/C >> BITRES; if (ebits[j]>7) ebits[j]=7; /* The bits used for fine allocation can't be used for pulses */ bits[j] -= C*ebits[j]<nbEBands; ALLOC(bits1, len, int); ALLOC(bits2, len, int); lo = 0; hi = m->nbAllocVectors - 1; while (hi-lo != 1) { int psum = 0; int mid = (lo+hi) >> 1; for (j=0;jallocVectors[mid*len+j] + offsets[j])< (total<allocVectors[lo*len+j] + offsets[j]; bits2[j] = C*m->allocVectors[hi*len+j] + offsets[j]; if (bits1[j] < 0) bits1[j] = 0; if (bits2[j] < 0) bits2[j] = 0; } interp_bits2pulses(m, bits1, bits2, total, pulses, ebits, fine_priority, len, C); RESTORE_STACK; } mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/_kiss_fft_guts.h0000664000175000017500000001771614010707311023372 0ustar builderbuilder/* Copyright (c) 2003-2004, Mark Borgerding All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the author nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef KISS_FFT_GUTS_H #define KISS_FFT_GUTS_H #define MIN(a,b) ((a)<(b) ? (a):(b)) #define MAX(a,b) ((a)>(b) ? (a):(b)) /* kiss_fft.h defines kiss_fft_scalar as either short or a float type and defines typedef struct { kiss_fft_scalar r; kiss_fft_scalar i; }kiss_fft_cpx; */ #include "kiss_fft.h" #define MAXFACTORS 32 /* e.g. an fft of length 128 has 4 factors as far as kissfft is concerned 4*4*4*2 */ struct kiss_fft_state{ int nfft; #ifndef FIXED_POINT kiss_fft_scalar scale; #endif int factors[2*MAXFACTORS]; int *bitrev; kiss_twiddle_cpx twiddles[1]; }; /* Explanation of macros dealing with complex math: C_MUL(m,a,b) : m = a*b C_FIXDIV( c , div ) : if a fixed point impl., c /= div. noop otherwise C_SUB( res, a,b) : res = a - b C_SUBFROM( res , a) : res -= a C_ADDTO( res , a) : res += a * */ #ifdef FIXED_POINT #include "arch.h" #ifdef DOUBLE_PRECISION # define FRACBITS 31 # define SAMPPROD long long #define SAMP_MAX 2147483647 #ifdef MIXED_PRECISION #define TWID_MAX 32767 #define TRIG_UPSCALE 1 #else #define TRIG_UPSCALE 65536 #define TWID_MAX 2147483647 #endif #define EXT32(a) (a) #else /* DOUBLE_PRECISION */ # define FRACBITS 15 # define SAMPPROD celt_int32 #define SAMP_MAX 32767 #define TRIG_UPSCALE 1 #define EXT32(a) EXTEND32(a) #endif /* !DOUBLE_PRECISION */ #define SAMP_MIN -SAMP_MAX #if defined(CHECK_OVERFLOW) # define CHECK_OVERFLOW_OP(a,op,b) \ if ( (SAMPPROD)(a) op (SAMPPROD)(b) > SAMP_MAX || (SAMPPROD)(a) op (SAMPPROD)(b) < SAMP_MIN ) { \ fprintf(stderr,"WARNING:overflow @ " __FILE__ "(%d): (%d " #op" %d) = %ld\n",__LINE__,(a),(b),(SAMPPROD)(a) op (SAMPPROD)(b) ); } #endif # define smul(a,b) ( (SAMPPROD)(a)*(b) ) # define sround( x ) (kiss_fft_scalar)( ( (x) + ((SAMPPROD)1<<(FRACBITS-1)) ) >> FRACBITS ) #ifdef MIXED_PRECISION # define S_MUL(a,b) MULT16_32_Q15(b, a) # define C_MUL(m,a,b) \ do{ (m).r = SUB32(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)); \ (m).i = ADD32(S_MUL((a).r,(b).i) , S_MUL((a).i,(b).r)); }while(0) # define C_MULC(m,a,b) \ do{ (m).r = ADD32(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)); \ (m).i = SUB32(S_MUL((a).i,(b).r) , S_MUL((a).r,(b).i)); }while(0) # define C_MUL4(m,a,b) \ do{ (m).r = SHR(SUB32(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)),2); \ (m).i = SHR(ADD32(S_MUL((a).r,(b).i) , S_MUL((a).i,(b).r)),2); }while(0) # define C_MULBYSCALAR( c, s ) \ do{ (c).r = S_MUL( (c).r , s ) ;\ (c).i = S_MUL( (c).i , s ) ; }while(0) # define DIVSCALAR(x,k) \ (x) = S_MUL( x, (TWID_MAX-((k)>>1))/(k)+1 ) # define C_FIXDIV(c,div) \ do { DIVSCALAR( (c).r , div); \ DIVSCALAR( (c).i , div); }while (0) #define C_ADD( res, a,b)\ do {(res).r=ADD32((a).r,(b).r); (res).i=ADD32((a).i,(b).i); \ }while(0) #define C_SUB( res, a,b)\ do {(res).r=SUB32((a).r,(b).r); (res).i=SUB32((a).i,(b).i); \ }while(0) #define C_ADDTO( res , a)\ do {(res).r = ADD32((res).r, (a).r); (res).i = ADD32((res).i,(a).i);\ }while(0) #define C_SUBFROM( res , a)\ do {(res).r = ADD32((res).r,(a).r); (res).i = SUB32((res).i,(a).i); \ }while(0) #else /* MIXED_PRECISION */ # define sround4( x ) (kiss_fft_scalar)( ( (x) + ((SAMPPROD)1<<(FRACBITS-1)) ) >> (FRACBITS+2) ) # define S_MUL(a,b) sround( smul(a,b) ) # define C_MUL(m,a,b) \ do{ (m).r = sround( smul((a).r,(b).r) - smul((a).i,(b).i) ); \ (m).i = sround( smul((a).r,(b).i) + smul((a).i,(b).r) ); }while(0) # define C_MULC(m,a,b) \ do{ (m).r = sround( smul((a).r,(b).r) + smul((a).i,(b).i) ); \ (m).i = sround( smul((a).i,(b).r) - smul((a).r,(b).i) ); }while(0) # define C_MUL4(m,a,b) \ do{ (m).r = sround4( smul((a).r,(b).r) - smul((a).i,(b).i) ); \ (m).i = sround4( smul((a).r,(b).i) + smul((a).i,(b).r) ); }while(0) # define C_MULBYSCALAR( c, s ) \ do{ (c).r = sround( smul( (c).r , s ) ) ;\ (c).i = sround( smul( (c).i , s ) ) ; }while(0) # define DIVSCALAR(x,k) \ (x) = sround( smul( x, SAMP_MAX/k ) ) # define C_FIXDIV(c,div) \ do { DIVSCALAR( (c).r , div); \ DIVSCALAR( (c).i , div); }while (0) #endif /* !MIXED_PRECISION */ #else /* not FIXED_POINT*/ #define EXT32(a) (a) # define S_MUL(a,b) ( (a)*(b) ) #define C_MUL(m,a,b) \ do{ (m).r = (a).r*(b).r - (a).i*(b).i;\ (m).i = (a).r*(b).i + (a).i*(b).r; }while(0) #define C_MULC(m,a,b) \ do{ (m).r = (a).r*(b).r + (a).i*(b).i;\ (m).i = (a).i*(b).r - (a).r*(b).i; }while(0) #define C_MUL4(m,a,b) C_MUL(m,a,b) # define C_FIXDIV(c,div) /* NOOP */ # define C_MULBYSCALAR( c, s ) \ do{ (c).r *= (s);\ (c).i *= (s); }while(0) #endif #ifndef CHECK_OVERFLOW_OP # define CHECK_OVERFLOW_OP(a,op,b) /* noop */ #endif #ifndef C_ADD #define C_ADD( res, a,b)\ do { \ CHECK_OVERFLOW_OP((a).r,+,(b).r)\ CHECK_OVERFLOW_OP((a).i,+,(b).i)\ (res).r=(a).r+(b).r; (res).i=(a).i+(b).i; \ }while(0) #define C_SUB( res, a,b)\ do { \ CHECK_OVERFLOW_OP((a).r,-,(b).r)\ CHECK_OVERFLOW_OP((a).i,-,(b).i)\ (res).r=(a).r-(b).r; (res).i=(a).i-(b).i; \ }while(0) #define C_ADDTO( res , a)\ do { \ CHECK_OVERFLOW_OP((res).r,+,(a).r)\ CHECK_OVERFLOW_OP((res).i,+,(a).i)\ (res).r += (a).r; (res).i += (a).i;\ }while(0) #define C_SUBFROM( res , a)\ do {\ CHECK_OVERFLOW_OP((res).r,-,(a).r)\ CHECK_OVERFLOW_OP((res).i,-,(a).i)\ (res).r -= (a).r; (res).i -= (a).i; \ }while(0) #endif /* C_ADD defined */ #ifdef FIXED_POINT /*# define KISS_FFT_COS(phase) TRIG_UPSCALE*floor(MIN(32767,MAX(-32767,.5+32768 * cos (phase)))) # define KISS_FFT_SIN(phase) TRIG_UPSCALE*floor(MIN(32767,MAX(-32767,.5+32768 * sin (phase))))*/ # define KISS_FFT_COS(phase) floor(.5+TWID_MAX*cos (phase)) # define KISS_FFT_SIN(phase) floor(.5+TWID_MAX*sin (phase)) # define HALF_OF(x) ((x)>>1) #elif defined(USE_SIMD) # define KISS_FFT_COS(phase) _mm_set1_ps( cos(phase) ) # define KISS_FFT_SIN(phase) _mm_set1_ps( sin(phase) ) # define HALF_OF(x) ((x)*_mm_set1_ps(.5)) #else # define KISS_FFT_COS(phase) (kiss_fft_scalar) cos(phase) # define KISS_FFT_SIN(phase) (kiss_fft_scalar) sin(phase) # define HALF_OF(x) ((x)*.5) #endif #define kf_cexp(x,phase) \ do{ \ (x)->r = KISS_FFT_COS(phase);\ (x)->i = KISS_FFT_SIN(phase);\ }while(0) #define kf_cexp2(x,phase) \ do{ \ (x)->r = TRIG_UPSCALE*celt_cos_norm((phase));\ (x)->i = TRIG_UPSCALE*celt_cos_norm((phase)-32768);\ }while(0) #endif /* KISS_FFT_GUTS_H */ mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/mdct.h0000664000175000017500000000545014010707311021300 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2008 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* This is a simple MDCT implementation that uses a N/4 complex FFT to do most of the work. It should be relatively straightforward to plug in pretty much and FFT here. This replaces the Vorbis FFT (and uses the exact same API), which was a bit too messy and that was ending up duplicating code (might as well use the same FFT everywhere). The algorithm is similar to (and inspired from) Fabrice Bellard's MDCT implementation in FFMPEG, but has differences in signs, ordering and scaling in many places. */ #ifndef MDCT_H #define MDCT_H #include "kiss_fft.h" #include "arch.h" typedef struct { int n; kiss_fft_cfg kfft; kiss_twiddle_scalar * restrict trig; } mdct_lookup; void clt_mdct_init(mdct_lookup *l,int N); void clt_mdct_clear(mdct_lookup *l); /** Compute a forward MDCT and scale by 4/N */ void clt_mdct_forward(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar *out, const celt_word16 *window, int overlap); /** Compute a backward MDCT (no scaling) and performs weighted overlap-add (scales implicitly by 1/2) */ void clt_mdct_backward(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar *out, const celt_word16 * restrict window, int overlap); #endif mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/Makefile.am0000664000175000017500000000241114010707311022226 0ustar builderbuilder# Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies pkginclude_HEADERS = celt.h celt_types.h celt_header.h EXTRA_DIST= match-test.sh #INCLUDES = -I$(top_srcdir)/include -I$(top_builddir)/include -I$(top_builddir) @OGG_CFLAGS@ TESTS = match-test.sh noinst_SCRIPTS = match-test.sh lib_LTLIBRARIES = libcelt@LIBCELT_SUFFIX@.la # Sources for compilation in the library libcelt@LIBCELT_SUFFIX@_la_SOURCES = bands.c celt.c cwrs.c ecintrin.h entcode.c \ entdec.c entenc.c header.c kiss_fft.c laplace.c mdct.c \ modes.c pitch.c quant_bands.c rangedec.c rangeenc.c rate.c \ vq.c libcelt@LIBCELT_SUFFIX@_la_LDFLAGS = -version-info @CELT_LT_CURRENT@:@CELT_LT_REVISION@:@CELT_LT_AGE@ noinst_HEADERS = _kiss_fft_guts.h arch.h bands.h fixed_c5x.h fixed_c6x.h \ cwrs.h ecintrin.h entcode.h entdec.h entenc.h fixed_generic.h float_cast.h \ kfft_double.h kiss_fft.h laplace.h mdct.h mfrngcod.h \ mathops.h modes.h os_support.h pitch.h \ quant_bands.h rate.h stack_alloc.h vq.h plc.c noinst_PROGRAMS = testcelt dump_modes testcelt_SOURCES = testcelt.c testcelt_LDADD = libcelt@LIBCELT_SUFFIX@.la INCLUDES = #libcelt@LIBCELT_SUFFIX@_la_LIBADD = dump_modes_SOURCES = dump_modes.c dump_modes_LDADD = libcelt@LIBCELT_SUFFIX@.la mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/celt_types.h0000664000175000017500000001004014010707311022513 0ustar builderbuilder/* celt_types.h taken from libogg */ /******************************************************************** * * * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 * * by the Xiph.Org Foundation http://www.xiph.org/ * * * ******************************************************************** function: #ifdef jail to whip a few platforms into the UNIX ideal. last mod: $Id: os_types.h 7524 2004-08-11 04:20:36Z conrad $ ********************************************************************/ /** @file celt_types.h @brief CELT types */ #ifndef _CELT_TYPES_H #define _CELT_TYPES_H /* Use the real stdint.h if it's there (taken from Paul Hsieh's pstdint.h) */ #if (defined(__STDC__) && __STDC__ && __STDC_VERSION__ >= 199901L) || (defined(__GNUC__) && (defined(_STDINT_H) || defined(_STDINT_H_)) || defined (HAVE_STDINT_H)) #include typedef int16_t celt_int16; typedef uint16_t celt_uint16; typedef int32_t celt_int32; typedef uint32_t celt_uint32; #elif defined(_WIN32) # if defined(__CYGWIN__) # include <_G_config.h> typedef _G_int32_t celt_int32; typedef _G_uint32_t celt_uint32; typedef _G_int16 celt_int16; typedef _G_uint16 celt_uint16; # elif defined(__MINGW32__) typedef short celt_int16; typedef unsigned short celt_uint16; typedef int celt_int32; typedef unsigned int celt_uint32; # elif defined(__MWERKS__) typedef int celt_int32; typedef unsigned int celt_uint32; typedef short celt_int16; typedef unsigned short celt_uint16; # else /* MSVC/Borland */ typedef __int32 celt_int32; typedef unsigned __int32 celt_uint32; typedef __int16 celt_int16; typedef unsigned __int16 celt_uint16; # endif #elif defined(__MACOS__) # include typedef SInt16 celt_int16; typedef UInt16 celt_uint16; typedef SInt32 celt_int32; typedef UInt32 celt_uint32; #elif (defined(__APPLE__) && defined(__MACH__)) /* MacOS X Framework build */ # include typedef int16 celt_int16; typedef u_int16 celt_uint16; typedef int32_t celt_int32; typedef u_int32_t celt_uint32; #elif defined(__BEOS__) /* Be */ # include typedef int16 celt_int16; typedef u_int16 celt_uint16; typedef int32_t celt_int32; typedef u_int32_t celt_uint32; #elif defined (__EMX__) /* OS/2 GCC */ typedef short celt_int16; typedef unsigned short celt_uint16; typedef int celt_int32; typedef unsigned int celt_uint32; #elif defined (DJGPP) /* DJGPP */ typedef short celt_int16; typedef unsigned short celt_uint16; typedef int celt_int32; typedef unsigned int celt_uint32; #elif defined(R5900) /* PS2 EE */ typedef int celt_int32; typedef unsigned celt_uint32; typedef short celt_int16; typedef unsigned short celt_uint16; #elif defined(__SYMBIAN32__) /* Symbian GCC */ typedef signed short celt_int16; typedef unsigned short celt_uint16; typedef signed int celt_int32; typedef unsigned int celt_uint32; #elif defined(CONFIG_TI_C54X) || defined (CONFIG_TI_C55X) typedef short celt_int16; typedef unsigned short celt_uint16; typedef long celt_int32; typedef unsigned long celt_uint32; #elif defined(CONFIG_TI_C6X) typedef short celt_int16; typedef unsigned short celt_uint16; typedef int celt_int32; typedef unsigned int celt_uint32; #else /* Give up, take a reasonable guess */ typedef short celt_int16; typedef unsigned short celt_uint16; typedef int celt_int32; typedef unsigned int celt_uint32; #endif #endif /* _CELT_TYPES_H */ mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/fixed_c5x.h0000664000175000017500000000555614010707311022236 0ustar builderbuilder/* Copyright (C) 2003 Jean-Marc Valin */ /** @file fixed_c5x.h @brief Fixed-point operations for the TI C5x DSP family */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef FIXED_C5X_H #define FIXED_C5X_H #include "dsplib.h" #undef IMUL32 static inline long IMUL32(long i, long j) { long ac0, ac1; ac0 = _lmpy(i>>16,j); ac1 = ac0 + _lmpy(i,j>>16); return _lmpyu(i,j) + (ac1<<16); } #undef MAX16 #define MAX16(a,b) _max(a,b) #undef MIN16 #define MIN16(a,b) _min(a,b) #undef MAX32 #define MAX32(a,b) _lmax(a,b) #undef MIN32 #define MIN32(a,b) _lmin(a,b) #undef VSHR32 #define VSHR32(a, shift) _lshl(a,-(shift)) #undef MULT16_16_Q15 #define MULT16_16_Q15(a,b) (_smpy(a,b)) #undef MULT16_16SU #define MULT16_16SU(a,b) _lmpysu(a,b) #undef MULT_16_16 #define MULT_16_16(a,b) _lmpy(a,b) /* FIXME: This is technically incorrect and is bound to cause problems. Is there any cleaner solution? */ #undef MULT16_32_Q15 #define MULT16_32_Q15(a,b) ADD32(SHL(MULT16_16((a),SHR((b),16)),1), SHR(MULT16_16SU((a),(b)),15)) #define celt_ilog2(x) (30 - _lnorm(x)) #define OVERRIDE_CELT_ILOG2 #define celt_maxabs16(x, len) MAX16(maxval((DATA *)x, len),-minval((DATA *)x, len)) #define OVERRIDE_CELT_MAXABS16 #define OVERRIDE_FIND_MAX16 static inline int find_max16(celt_word16 *x, int len) { DATA max_corr16 = -VERY_LARGE16; DATA pitch16 = 0; maxvec((DATA *)x, len, &max_corr16, &pitch16); return pitch16; } #endif /* FIXED_C5X_H */ mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/mfrngdec.c0000664000175000017500000002113414010707311022126 0ustar builderbuilder/* Copyright (c) 2001-2008 Timothy B. Terriberry Copyright (c) 2008-2009 Xiph.Org Foundation */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "arch.h" #include "entdec.h" #include "mfrngcod.h" /*A multiply-free range decoder. This is an entropy decoder based upon \cite{Mar79}, which is itself a rediscovery of the FIFO arithmetic code introduced by \cite{Pas76}. It is very similar to arithmetic encoding, except that encoding is done with digits in any base, instead of with bits, and so it is faster when using larger bases (i.e.: a byte). The author claims an average waste of $\frac{1}{2}\log_b(2b)$ bits, where $b$ is the base, longer than the theoretical optimum, but to my knowledge there is no published justification for this claim. This only seems true when using near-infinite precision arithmetic so that the process is carried out with no rounding errors. IBM (the author's employer) never sought to patent the idea, and to my knowledge the algorithm is unencumbered by any patents, though its performance is very competitive with proprietary arithmetic coding. The two are based on very similar ideas, however. An excellent description of implementation details is available at http://www.arturocampos.com/ac_range.html A recent work \cite{MNW98} which proposes several changes to arithmetic encoding for efficiency actually re-discovers many of the principles behind range encoding, and presents a good theoretical analysis of them. The coder is made multiply-free by replacing the standard multiply/divide used to partition the current interval according to the total frequency count. The new partition function scales the count so that it differs from the size of the interval by no more than a factor of two and then assigns each symbol one or two code words in the interval. For details see \cite{SM98}. End of stream is handled by writing out the smallest number of bits that ensures that the stream will be correctly decoded regardless of the value of any subsequent bits. ec_dec_tell() can be used to determine how many bits were needed to decode all the symbols thus far; other data can be packed in the remaining bits of the input buffer. @PHDTHESIS{Pas76, author="Richard Clark Pasco", title="Source coding algorithms for fast data compression", school="Dept. of Electrical Engineering, Stanford University", address="Stanford, CA", month=May, year=1976 } @INPROCEEDINGS{Mar79, author="Martin, G.N.N.", title="Range encoding: an algorithm for removing redundancy from a digitised message", booktitle="Video & Data Recording Conference", year=1979, address="Southampton", month=Jul } @ARTICLE{MNW98, author="Alistair Moffat and Radford Neal and Ian H. Witten", title="Arithmetic Coding Revisited", journal="{ACM} Transactions on Information Systems", year=1998, volume=16, number=3, pages="256--294", month=Jul, URL="http://www.stanford.edu/class/ee398/handouts/papers/Moffat98ArithmCoding.pdf" } @INPROCEEDINGS{SM98, author="Lang Stuiver and Alistair Moffat", title="Piecewise Integer Mapping for Arithmetic Coding", booktitle="Proceedings of the {IEEE} Data Compression Conference", pages="1--10", address="Snowbird, UT", month="Mar./Apr.", year=1998 }*/ /*Gets the next byte of input. After all the bytes in the current packet have been consumed, and the extra end code returned if needed, this function will continue to return zero each time it is called. Return: The next byte of input.*/ static int ec_dec_in(ec_dec *_this){ int ret; ret=ec_byte_read1(_this->buf); if(ret<0){ ret=0; /*Needed to keep oc_dec_tell() operating correctly.*/ ec_byte_adv1(_this->buf); } return ret; } /*Normalizes the contents of dif and rng so that rng lies entirely in the high-order symbol.*/ static inline void ec_dec_normalize(ec_dec *_this){ /*If the range is too small, rescale it and input some bits.*/ while(_this->rng<=EC_CODE_BOT){ int sym; _this->rng<<=EC_SYM_BITS; /*Use up the remaining bits from our last symbol.*/ sym=_this->rem<rem=ec_dec_in(_this); /*Take the rest of the bits we need from this new symbol.*/ sym|=_this->rem>>EC_SYM_BITS-EC_CODE_EXTRA; _this->dif=(_this->dif<dif>EC_CODE_TOP)_this->dif-=EC_CODE_TOP;*/ _this->dif^=_this->dif&_this->dif-1&EC_CODE_TOP; } } void ec_dec_init(ec_dec *_this,ec_byte_buffer *_buf){ _this->buf=_buf; _this->rem=ec_dec_in(_this); _this->rng=1U<dif=_this->rem>>EC_SYM_BITS-EC_CODE_EXTRA; /*Normalize the interval.*/ ec_dec_normalize(_this); _this->end_bits_left=0; _this->nb_end_bits=0; } unsigned ec_decode(ec_dec *_this,unsigned _ft){ ec_uint32 ft; ec_uint32 d; unsigned e; /*Step 1: Compute the normalization factor for the frequency counts.*/ _this->nrm=EC_ILOG(_this->rng)-EC_ILOG(_ft); ft=(ec_uint32)_ft<<_this->nrm; e=ft>_this->rng; ft>>=e; _this->nrm-=e; /*Step 2: invert the partition function.*/ d=_this->rng-ft; return EC_MAXI((ec_int32)(_this->dif>>1),(ec_int32)(_this->dif-d))>> _this->nrm; /*Step 3: The caller locates the range [fl,fh) containing the return value and calls ec_dec_update().*/ } unsigned ec_decode_bin(ec_dec *_this,unsigned bits){ #if 0 return ec_decode(_this, 1U<nb_end_bits += bits; while (bits>=_this->end_bits_left) { value |= _this->end_byte>>(8-_this->end_bits_left)<end_bits_left; bits -= _this->end_bits_left; _this->end_byte=ec_byte_look_at_end(_this->buf); _this->end_bits_left = 8; } value |= ((_this->end_byte>>(8-_this->end_bits_left))&((1<end_bits_left -= bits; return value; #endif } void ec_dec_update(ec_dec *_this,unsigned _fl,unsigned _fh,unsigned _ft){ ec_uint32 fl; ec_uint32 fh; ec_uint32 ft; ec_uint32 r; ec_uint32 s; ec_uint32 d; /*Step 4: Evaluate the two partition function values.*/ fl=(ec_uint32)_fl<<_this->nrm; fh=(ec_uint32)_fh<<_this->nrm; ft=(ec_uint32)_ft<<_this->nrm; d=_this->rng-ft; r=fh+EC_MINI(fh,d); s=fl+EC_MINI(fl,d); /*Step 5: Update the interval.*/ _this->rng=r-s; _this->dif-=s; /*Step 6: Normalize the interval.*/ ec_dec_normalize(_this); } long ec_dec_tell(ec_dec *_this,int _b){ ec_uint32 r; int l; long nbits; nbits=(ec_byte_bytes(_this->buf)-(EC_CODE_BITS+EC_SYM_BITS-1)/EC_SYM_BITS)* EC_SYM_BITS; /*To handle the non-integral number of bits still left in the decoder state, we compute the number of bits of low that must be encoded to ensure that the value is inside the range for any possible subsequent bits.*/ nbits+=EC_CODE_BITS+1+_this->nb_end_bits; nbits<<=_b; l=EC_ILOG(_this->rng); r=_this->rng>>l-16; while(_b-->0){ int b; r=r*r>>15; b=(int)(r>>16); l=l<<1|b; r>>=b; } return nbits-l; } mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/c64_fft.c0000664000175000017500000002503014010707311021573 0ustar builderbuilder/* (c) Copyright 2008/2009 Xiph.Org Foundation */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "c64_fft.h" #include "dsp_fft16x16t.h" #include "dsp_fft32x32s.h" #include "dsp_ifft32x32.h" #ifndef PI # ifdef M_PI # define PI M_PI # else # define PI 3.14159265358979323846 # endif #endif /* ======================================================================== */ /* D2S -- Truncate a 'double' to a 'short', with clamping. */ /* ======================================================================== */ static short d2s(double d) { if (d >= 32767.0) return 32767; if (d <= -32768.0) return -32768; return (short)d; } /* ======================================================================== */ /* D2S -- Truncate a 'double' to a 'int', with clamping. */ /* ======================================================================== */ static int d2i(double d) { if (d >= 2147483647.0) return (int)0x7FFFFFFF; if (d <= -2147483648.0) return (int)0x80000000; return (int)d; } /* ======================================================================== */ /* GEN_TWIDDLE -- Generate twiddle factors for TI's custom FFTs. */ /* */ /* USAGE */ /* This routine is called as follows: */ /* */ /* int gen_twiddle(short *w, int n, double scale) */ /* */ /* short *w Pointer to twiddle-factor array */ /* int n Size of FFT */ /* double scale Scale factor to apply to values. */ /* */ /* The routine will generate the twiddle-factors directly into the */ /* array you specify. The array needs to be approximately 2*N */ /* elements long. (The actual size, which is slightly smaller, is */ /* returned by the function.) */ /* ======================================================================== */ int gen_twiddle16(short *w, int n, double scale) { int i, j, k; for (j = 1, k = 0; j < n >> 2; j = j << 2) { for (i = 0; i < n >> 2; i += j << 1) { w[k + 11] = d2s(scale * cos(6.0 * PI * (i + j) / n)); w[k + 10] = d2s(scale * sin(6.0 * PI * (i + j) / n)); w[k + 9] = d2s(scale * cos(6.0 * PI * (i ) / n)); w[k + 8] = d2s(scale * sin(6.0 * PI * (i ) / n)); w[k + 7] = d2s(scale * cos(4.0 * PI * (i + j) / n)); w[k + 6] = d2s(scale * sin(4.0 * PI * (i + j) / n)); w[k + 5] = d2s(scale * cos(4.0 * PI * (i ) / n)); w[k + 4] = d2s(scale * sin(4.0 * PI * (i ) / n)); w[k + 3] = d2s(scale * cos(2.0 * PI * (i + j) / n)); w[k + 2] = d2s(scale * sin(2.0 * PI * (i + j) / n)); w[k + 1] = d2s(scale * cos(2.0 * PI * (i ) / n)); w[k + 0] = d2s(scale * sin(2.0 * PI * (i ) / n)); k += 12; } } return k; } /* ======================================================================== */ /* GEN_TWIDDLE -- Generate twiddle factors for TI's custom FFTs. */ /* */ /* USAGE */ /* This routine is called as follows: */ /* */ /* int gen_twiddle(int *w, int n, double scale) */ /* */ /* int *w Pointer to twiddle-factor array */ /* int n Size of FFT */ /* double scale Scale factor to apply to values. */ /* */ /* The routine will generate the twiddle-factors directly into the */ /* array you specify. The array needs to be approximately 2*N */ /* elements long. (The actual size, which is slightly smaller, is */ /* returned by the function.) */ /* ======================================================================== */ int gen_twiddle32(int *w, int n, double scale) { int i, j, k, s=0, t; for (j = 1, k = 0; j < n >> 2; j = j << 2, s++) { for (i = t=0; i < n >> 2; i += j, t++) { w[k + 5] = d2i(scale * cos(6.0 * PI * i / n)); w[k + 4] = d2i(scale * sin(6.0 * PI * i / n)); w[k + 3] = d2i(scale * cos(4.0 * PI * i / n)); w[k + 2] = d2i(scale * sin(4.0 * PI * i / n)); w[k + 1] = d2i(scale * cos(2.0 * PI * i / n)); w[k + 0] = d2i(scale * sin(2.0 * PI * i / n)); k += 6; } } return k; } #define NBCACHE 3 static c64_fft_t *cache16[NBCACHE] = {NULL,}; static c64_fft_t *cache32[NBCACHE] = {NULL,}; c64_fft_t *c64_fft16_alloc(int length, int x, int y) { c64_fft_t *state; celt_int16 *w, *iw; int i, c; for (c = 0; c < NBCACHE; c++) { if (cache16[c] == NULL) break; if (cache16[c]->nfft == length) return cache16[c]; } state = (c64_fft_t *)celt_alloc(sizeof(c64_fft_t)); state->shift = log(length)/log(2) - ceil(log(length)/log(4)-1); state->nfft = length; state->twiddle = celt_alloc(length*2*sizeof(celt_int16)); state->itwiddle = celt_alloc(length*2*sizeof(celt_int16)); gen_twiddle16((celt_int16 *)state->twiddle, length, 32767.0); w = (celt_int16 *)state->twiddle; iw = (celt_int16 *)state->itwiddle; for (i = 0; i < length; i++) { iw[2*i+0] = w[2*i+0]; iw[2*i+1] = - w[2*i+1]; } if (c < NBCACHE) cache16[c++] = state; if (c < NBCACHE) cache16[c] = NULL; return state; } c64_fft_t *c64_fft32_alloc(int length, int x, int y) { c64_fft_t *state; int i, c; for (c = 0; c < NBCACHE; c++) { if (cache32[c] == NULL) break; if (cache32[c]->nfft == length) return cache32[c]; } state = (c64_fft_t *)celt_alloc(sizeof(c64_fft_t)); state->shift = log(length)/log(2) - ceil(log(length)/log(4)-1); state->nfft = length; state->twiddle = celt_alloc(length*2*sizeof(celt_int32)); state->itwiddle = celt_alloc(length*2*sizeof(celt_int32)); // Generate the inverse twiddle first because it does not need scaling gen_twiddle32(state->itwiddle, length, 2147483647.000000000); for (i = 0; i < length; i++) { state->twiddle[2*i+0] = state->itwiddle[2*i+0] >> 1; state->twiddle[2*i+1] = state->itwiddle[2*i+1] >> 1; } if (c < NBCACHE) cache32[c++] = state; if (c < NBCACHE) cache32[c] = NULL; return state; } void c64_fft16_free(c64_fft_t *state) { c64_fft32_free(state); } void c64_fft32_free(c64_fft_t *state) { } void c64_fft16_inplace(c64_fft_t * restrict state, celt_int16 *X) { int i; VARDECL(celt_int16, cin); VARDECL(celt_int16, cout); SAVE_STACK; ALLOC(cin, state->nfft*2, celt_int16); ALLOC(cout, state->nfft*2, celt_int16); for (i = 0; i < state->nfft; i++) { cin[2*i+0] = X[2*i+0]; cin[2*i+1] = X[2*i+1]; } DSP_fft16x16t((celt_int16 *)state->twiddle, state->nfft, cin, cout); for (i = 0; i < state->nfft; i++) { X[2*i+0] = cout[2*i+0]; X[2*i+1] = cout[2*i+1]; } RESTORE_STACK; } void c64_fft32(c64_fft_t * restrict state, const celt_int32 *X, celt_int32 *Y) { int i; VARDECL(celt_int32, cin); SAVE_STACK; ALLOC(cin, state->nfft*2, celt_int32); for (i = 0; i < state->nfft; i++) { cin[2*i+0] = X[2*i+0] >> state->shift; cin[2*i+1] = X[2*i+1] >> state->shift; } DSP_fft32x32s(state->twiddle, state->nfft, cin, Y); RESTORE_STACK; } void c64_ifft16(c64_fft_t * restrict state, const celt_int16 *X, celt_int16 *Y) { int i; VARDECL(celt_int16, cin); VARDECL(celt_int16, cout); SAVE_STACK; ALLOC(cin, state->nfft*2, celt_int16); if ((celt_int32)Y & 7) ALLOC(cout, state->nfft*2, celt_int16); else cout = Y; for (i = 0; i < state->nfft; i++) { // No need to scale for this one but still need to save the input // because the fft is going to change it! cin[2*i+0] = X[2*i+0]; cin[2*i+1] = X[2*i+1]; } DSP_fft16x16t((celt_int16 *)state->itwiddle, state->nfft, cin, cout); if ((celt_int32)Y & 7) for (i = 0; i < state->nfft; i++) { Y[2*i+0] = cout[2*i+0]; Y[2*i+1] = cout[2*i+1]; } RESTORE_STACK; } void c64_ifft32(c64_fft_t * restrict state, const celt_int32 *X, celt_int32 *Y) { int i; VARDECL(celt_int32, cin); SAVE_STACK; ALLOC(cin, state->nfft*2, celt_int32); celt_assert(Y & 7 == 0); for (i = 0; i < state->nfft; i++) { // No need to scale for this one but still need to save the input // because the fft is going to change it! cin[2*i+0] = X[2*i+0]; cin[2*i+1] = X[2*i+1]; } DSP_ifft32x32(state->itwiddle, state->nfft, cin, Y); RESTORE_STACK; } mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/header.c0000664000175000017500000001032114010707311021565 0ustar builderbuilder/* Copyright (c) 2007 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "celt_header.h" #include "os_support.h" #include "modes.h" static celt_uint32 _le_32 (celt_uint32 i) { celt_uint32 ret=i; #if !defined(__LITTLE_ENDIAN__) && ( defined(WORDS_BIGENDIAN) || defined(__BIG_ENDIAN__) ) ret = (i>>24); ret += (i>>8) & 0x0000ff00; ret += (i<<8) & 0x00ff0000; ret += (i<<24); #endif return ret; } int celt_header_init(CELTHeader *header, const CELTMode *m, int channels) { if (check_mode(m) != CELT_OK) return CELT_INVALID_MODE; if (header==NULL) return CELT_BAD_ARG; CELT_COPY(header->codec_id, "CELT ", 8); CELT_COPY(header->codec_version, "experimental ", 20); celt_mode_info(m, CELT_GET_BITSTREAM_VERSION, &header->version_id); header->header_size = 56; header->sample_rate = m->Fs; header->nb_channels = channels; header->frame_size = m->mdctSize; header->overlap = m->overlap; header->bytes_per_packet = -1; header->extra_headers = 0; return CELT_OK; } int celt_header_to_packet(const CELTHeader *header, unsigned char *packet, celt_uint32 size) { celt_int32 * h; if ((size < 56) || (header==NULL) || (packet==NULL)) return CELT_BAD_ARG; /* FAIL */ CELT_MEMSET(packet, 0, sizeof(*header)); /* FIXME: Do it in an alignment-safe manner */ /* Copy ident and version */ CELT_COPY(packet, (unsigned char*)header, 28); /* Copy the int32 fields */ h = (celt_int32*)(packet+28); *h++ = _le_32 (header->version_id); *h++ = _le_32 (header->header_size); *h++ = _le_32 (header->sample_rate); *h++ = _le_32 (header->nb_channels); *h++ = _le_32 (header->frame_size); *h++ = _le_32 (header->overlap); *h++ = _le_32 (header->bytes_per_packet); *h = _le_32 (header->extra_headers); return sizeof(*header); } int celt_header_from_packet(const unsigned char *packet, celt_uint32 size, CELTHeader *header) { celt_int32 * h; if ((size < 56) || (header==NULL) || (packet==NULL)) return CELT_BAD_ARG; /* FAIL */ CELT_MEMSET((unsigned char*)header, 0, sizeof(*header)); /* FIXME: Do it in an alignment-safe manner */ /* Copy ident and version */ CELT_COPY((unsigned char*)header, packet, 28); /* Copy the int32 fields */ h = (celt_int32*)(packet+28); header->version_id = _le_32(*h++); header->header_size = _le_32(*h++); header->sample_rate = _le_32(*h++); header->nb_channels = _le_32(*h++); header->frame_size = _le_32(*h++); header->overlap = _le_32(*h++); header->bytes_per_packet = _le_32(*h++); header->extra_headers = _le_32(*h); return sizeof(*header); } mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/plc.c0000664000175000017500000000541714010707311021125 0ustar builderbuilder #ifndef NEW_PLC #define NEW_PLC #endif float _celt_lpc( celt_word16 *_lpc, /* out: [0...p-1] LPC coefficients */ const float *ac, /* in: [0...p] autocorrelation values */ int p ) { int i, j; float r; float error = ac[0]; #ifdef FIXED_POINT float lpc[LPC_ORDER]; #else float *lpc = _lpc; #endif if (ac[0] == 0) { for (i = 0; i < p; i++) lpc[i] = 0; return 0; } for (i = 0; i < p; i++) { /* Sum up this iteration's reflection coefficient */ float rr = -ac[i + 1]; for (j = 0; j < i; j++) rr = rr - lpc[j]*ac[i - j]; r = rr/(error+1e-15); /* Update LPC coefficients and total error */ lpc[i] = r; for (j = 0; j < i>>1; j++) { float tmp = lpc[j]; lpc[j] = lpc[j ] + r*lpc[i-1-j]; lpc[i-1-j] = lpc[i-1-j] + r*tmp; } if (i & 1) lpc[j] = lpc[j] + lpc[j]*r; error = error - r*r*error; if (error<.00001*ac[0]) break; } #ifdef FIXED_POINT for (i=0;i=1;j--) { mem[j]=mem[j-1]; } mem[0] = x[i]; y[i] = ROUND16(sum, SIG_SHIFT); } } void iir(const celt_word32 *x, const celt_word16 *den, celt_word32 *y, int N, int ord, celt_word16 *mem) { int i,j; for (i=0;i=1;j--) { mem[j]=mem[j-1]; } mem[0] = ROUND16(sum,SIG_SHIFT); y[i] = sum; } } void _celt_autocorr( const celt_word16 *x, /* in: [0...n-1] samples x */ float *ac, /* out: [0...lag-1] ac values */ const celt_word16 *window, int overlap, int lag, int n ) { float d; int i; VARDECL(float, xx); SAVE_STACK; ALLOC(xx, n, float); for (i=0;i=0) { for (i = lag, d = 0; i < n; i++) d += x[i] * x[i-lag]; ac[lag] = d; lag--; } ac[0] += 10; RESTORE_STACK; } mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/pitch.h0000664000175000017500000000401014010707311021447 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /** @file pitch.h @brief Pitch analysis */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _PITCH_H #define _PITCH_H #include "modes.h" void pitch_downsample(const celt_sig * restrict x, celt_word16 * restrict x_lp, int len, int end, int _C, celt_sig * restrict xmem, celt_word16 * restrict filt_mem); void pitch_search(const CELTMode *m, const celt_word16 * restrict x_lp, celt_word16 * restrict y, int len, int max_pitch, int *pitch, celt_sig *xmem); #endif mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/kfft_double.h0000664000175000017500000000551314010707311022635 0ustar builderbuilder/* Copyright (c) 2008 Xiph.Org Foundation, CSIRO */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef KFFT_DOUBLE_H #define KFFT_DOUBLE_H #ifdef ENABLE_TI_DSPLIB55 #include "dsplib.h" #include "_kiss_fft_guts.h" #define cpx32_fft_alloc(length) NULL #define cpx32_fft_free(state) #define cpx32_fft(state, X, Y, nx)\ (\ cfft32_SCALE(X,nx),\ cbrev32(X,Y,nx)\ ) #define cpx32_ifft(state, X, Y, nx) \ (\ cifft32_NOSCALE(X,nx),\ cbrev32(X,Y,nx)\ ) #elif defined(ENABLE_TI_DSPLIB64) #include "kiss_fft.h" #include "_kiss_fft_guts.h" #include "c64_fft.h" #define cpx32_fft_alloc(length) (kiss_fft_cfg)(c64_fft32_alloc(length, 0, 0)) #define cpx32_fft_free(state) c64_fft32_free((c64_fft_t *)state) #define cpx32_fft(state, X, Y, nx) c64_fft32 ((c64_fft_t *)state, (const celt_int32 *)(X), (celt_int32 *)(Y)) #define cpx32_ifft(state, X, Y, nx) c64_ifft32((c64_fft_t *)state, (const celt_int32 *)(X), (celt_int32 *)(Y)) #else /* ENABLE_TI_DSPLIB55/64 */ #include "kiss_fft.h" #include "_kiss_fft_guts.h" #define cpx32_fft_alloc(length) kiss_fft_alloc(length, 0, 0); #define cpx32_fft_free(state) kiss_fft_free(state) #define cpx32_fft(state, X, Y, nx) kiss_fft(state,(const kiss_fft_cpx *)(X), (kiss_fft_cpx *)(Y)) #define cpx32_ifft(state, X, Y, nx) kiss_ifft(state,(const kiss_fft_cpx *)(X), (kiss_fft_cpx *)(Y)) #endif /* !ENABLE_TI_DSPLIB */ #endif /* KFFT_DOUBLE_H */ mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/rangedec.c0000664000175000017500000001671314010707311022120 0ustar builderbuilder/* Copyright (c) 2001-2008 Timothy B. Terriberry Copyright (c) 2008-2009 Xiph.Org Foundation */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "arch.h" #include "entdec.h" #include "mfrngcod.h" /*A range decoder. This is an entropy decoder based upon \cite{Mar79}, which is itself a rediscovery of the FIFO arithmetic code introduced by \cite{Pas76}. It is very similar to arithmetic encoding, except that encoding is done with digits in any base, instead of with bits, and so it is faster when using larger bases (i.e.: a byte). The author claims an average waste of $\frac{1}{2}\log_b(2b)$ bits, where $b$ is the base, longer than the theoretical optimum, but to my knowledge there is no published justification for this claim. This only seems true when using near-infinite precision arithmetic so that the process is carried out with no rounding errors. IBM (the author's employer) never sought to patent the idea, and to my knowledge the algorithm is unencumbered by any patents, though its performance is very competitive with proprietary arithmetic coding. The two are based on very similar ideas, however. An excellent description of implementation details is available at http://www.arturocampos.com/ac_range.html A recent work \cite{MNW98} which proposes several changes to arithmetic encoding for efficiency actually re-discovers many of the principles behind range encoding, and presents a good theoretical analysis of them. End of stream is handled by writing out the smallest number of bits that ensures that the stream will be correctly decoded regardless of the value of any subsequent bits. ec_dec_tell() can be used to determine how many bits were needed to decode all the symbols thus far; other data can be packed in the remaining bits of the input buffer. @PHDTHESIS{Pas76, author="Richard Clark Pasco", title="Source coding algorithms for fast data compression", school="Dept. of Electrical Engineering, Stanford University", address="Stanford, CA", month=May, year=1976 } @INPROCEEDINGS{Mar79, author="Martin, G.N.N.", title="Range encoding: an algorithm for removing redundancy from a digitised message", booktitle="Video & Data Recording Conference", year=1979, address="Southampton", month=Jul } @ARTICLE{MNW98, author="Alistair Moffat and Radford Neal and Ian H. Witten", title="Arithmetic Coding Revisited", journal="{ACM} Transactions on Information Systems", year=1998, volume=16, number=3, pages="256--294", month=Jul, URL="http://www.stanford.edu/class/ee398/handouts/papers/Moffat98ArithmCoding.pdf" }*/ /*Gets the next byte of input. After all the bytes in the current packet have been consumed, and the extra end code returned if needed, this function will continue to return zero each time it is called. Return: The next byte of input.*/ static int ec_dec_in(ec_dec *_this){ int ret; ret=ec_byte_read1(_this->buf); if(ret<0){ ret=0; /*Needed to keep oc_dec_tell() operating correctly.*/ ec_byte_adv1(_this->buf); } return ret; } /*Normalizes the contents of dif and rng so that rng lies entirely in the high-order symbol.*/ static inline void ec_dec_normalize(ec_dec *_this){ /*If the range is too small, rescale it and input some bits.*/ while(_this->rng<=EC_CODE_BOT){ int sym; _this->rng<<=EC_SYM_BITS; /*Use up the remaining bits from our last symbol.*/ sym=_this->rem<rem=ec_dec_in(_this); /*Take the rest of the bits we need from this new symbol.*/ sym|=_this->rem>>EC_SYM_BITS-EC_CODE_EXTRA; _this->dif=(_this->dif<dif>EC_CODE_TOP)_this->dif-=EC_CODE_TOP;*/ _this->dif^=_this->dif&_this->dif-1&EC_CODE_TOP; } } void ec_dec_init(ec_dec *_this,ec_byte_buffer *_buf){ _this->buf=_buf; _this->rem=ec_dec_in(_this); _this->rng=1U<dif=_this->rng-(_this->rem>>EC_SYM_BITS-EC_CODE_EXTRA); /*Normalize the interval.*/ ec_dec_normalize(_this); /*_this->end_byte=ec_byte_look_at_end(_this->buf);*/ _this->end_bits_left=0; _this->nb_end_bits=0; } unsigned ec_decode(ec_dec *_this,unsigned _ft){ unsigned s; _this->nrm=_this->rng/_ft; s=(unsigned)((_this->dif-1)/_this->nrm); return _ft-EC_MINI(s+1,_ft); } unsigned ec_decode_bin(ec_dec *_this,unsigned _bits){ unsigned s; _this->nrm=_this->rng>>_bits; s=(unsigned)((_this->dif-1)/_this->nrm); return (1<<_bits)-EC_MINI(s+1,1<<_bits); } unsigned ec_decode_raw(ec_dec *_this,unsigned bits){ unsigned value=0; int count=0; _this->nb_end_bits += bits; while (bits>=_this->end_bits_left) { value |= _this->end_byte>>(8-_this->end_bits_left)<end_bits_left; bits -= _this->end_bits_left; _this->end_byte=ec_byte_look_at_end(_this->buf); _this->end_bits_left = 8; } value |= ((_this->end_byte>>(8-_this->end_bits_left))&((1<end_bits_left -= bits; return value; } void ec_dec_update(ec_dec *_this,unsigned _fl,unsigned _fh,unsigned _ft){ ec_uint32 s; s=IMUL32(_this->nrm,(_ft-_fh)); _this->dif-=s; _this->rng=_fl>0?IMUL32(_this->nrm,(_fh-_fl)):_this->rng-s; ec_dec_normalize(_this); } long ec_dec_tell(ec_dec *_this,int _b){ ec_uint32 r; int l; long nbits; nbits=(ec_byte_bytes(_this->buf)-(EC_CODE_BITS+EC_SYM_BITS-1)/EC_SYM_BITS)* EC_SYM_BITS; /*To handle the non-integral number of bits still left in the decoder state, we compute the number of bits of low that must be encoded to ensure that the value is inside the range for any possible subsequent bits.*/ nbits+=EC_CODE_BITS+1+_this->nb_end_bits; nbits<<=_b; l=EC_ILOG(_this->rng); r=_this->rng>>l-16; while(_b-->0){ int b; r=r*r>>15; b=(int)(r>>16); l=l<<1|b; r>>=b; } return nbits-l; } mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/pitch.c0000664000175000017500000001604314010707311021453 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /** @file pitch.c @brief Pitch analysis */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "pitch.h" #include "os_support.h" #include "modes.h" #include "stack_alloc.h" #include "mathops.h" void find_best_pitch(celt_word32 *xcorr, celt_word32 maxcorr, celt_word16 *y, int yshift, int len, int max_pitch, int best_pitch[2]) { int i, j; celt_word32 Syy=1; celt_word16 best_num[2]; celt_word32 best_den[2]; #ifdef FIXED_POINT int xshift; xshift = celt_ilog2(maxcorr)-14; #endif best_num[0] = -1; best_num[1] = -1; best_den[0] = 0; best_den[1] = 0; best_pitch[0] = 0; best_pitch[1] = 1; for (j=0;j0) { celt_word16 num; celt_word32 xcorr16; xcorr16 = EXTRACT16(VSHR32(xcorr[i], xshift)); num = MULT16_16_Q15(xcorr16,xcorr16); score = num*1./Syy; if (MULT16_32_Q15(num,best_den[1]) > MULT16_32_Q15(best_num[1],Syy)) { if (MULT16_32_Q15(num,best_den[0]) > MULT16_32_Q15(best_num[0],Syy)) { best_num[1] = best_num[0]; best_den[1] = best_den[0]; best_pitch[1] = best_pitch[0]; best_num[0] = num; best_den[0] = Syy; best_pitch[0] = i; } else { best_num[1] = num; best_den[1] = Syy; best_pitch[1] = i; } } } Syy += SHR32(MULT16_16(y[i+len],y[i+len]),yshift) - SHR32(MULT16_16(y[i],y[i]),yshift); Syy = MAX32(1, Syy); } } void pitch_downsample(const celt_sig * restrict x, celt_word16 * restrict x_lp, int len, int end, int _C, celt_sig * restrict xmem, celt_word16 * restrict filt_mem) { int i; const int C = CHANNELS(_C); for (i=1;i>1;i++) x_lp[i] = SHR32(HALF32(HALF32(x[(2*i-1)*C]+x[(2*i+1)*C])+x[2*i*C]), SIG_SHIFT); x_lp[0] = SHR32(HALF32(HALF32(*xmem+x[C])+x[0]), SIG_SHIFT); *xmem = x[end-C]; if (C==2) { for (i=1;i>1;i++) x_lp[i] = SHR32(HALF32(HALF32(x[(2*i-1)*C+1]+x[(2*i+1)*C+1])+x[2*i*C+1]), SIG_SHIFT); x_lp[0] += SHR32(HALF32(HALF32(x[C+1])+x[1]), SIG_SHIFT); *xmem += x[end-C+1]; } #if 0 { int j; float ac[3]={0,0,0}; float ak[2]; float det; celt_word16 mem[2]; for (i=0;i<3;i++) { for (j=0;j<(len>>1)-i;j++) { ac[i] += x_lp[j]*x_lp[j+i]; } } det = 1./(.1+ac[0]*ac[0]-ac[1]*ac[1]); ak[0] = .9*det*(ac[0]*ac[1] - ac[1]*ac[2]); ak[1] = .81*det*(-ac[1]*ac[1] + ac[0]*ac[2]); /*printf ("%f %f %f\n", 1., -ak[0], -ak[1]);*/ mem[0]=filt_mem[0]; mem[1]=filt_mem[1]; filt_mem[0]=x_lp[(end>>1)-1]; filt_mem[1]=x_lp[(end>>1)-2]; for (j=0;j>1;j++) { float tmp = x_lp[j]; x_lp[j] = x_lp[j] - ak[0]*mem[0] - ak[1]*mem[1]; mem[1]=mem[0]; mem[0]=tmp; } } #endif } void pitch_search(const CELTMode *m, const celt_word16 * restrict x_lp, celt_word16 * restrict y, int len, int max_pitch, int *pitch, celt_sig *xmem) { int i, j; const int lag = MAX_PERIOD; const int N = FRAMESIZE(m); int best_pitch[2]={0}; VARDECL(celt_word16, x_lp4); VARDECL(celt_word16, y_lp4); VARDECL(celt_word32, xcorr); celt_word32 maxcorr=1; int offset; int shift=0; SAVE_STACK; ALLOC(x_lp4, len>>2, celt_word16); ALLOC(y_lp4, lag>>2, celt_word16); ALLOC(xcorr, max_pitch>>1, celt_word32); /* Downsample by 2 again */ for (j=0;j>2;j++) x_lp4[j] = x_lp[2*j]; for (j=0;j>2;j++) y_lp4[j] = y[2*j]; #ifdef FIXED_POINT shift = celt_ilog2(MAX16(celt_maxabs16(x_lp4, len>>2), celt_maxabs16(y_lp4, lag>>2)))-11; if (shift>0) { for (j=0;j>2;j++) x_lp4[j] = SHR16(x_lp4[j], shift); for (j=0;j>2;j++) y_lp4[j] = SHR16(y_lp4[j], shift); /* Use double the shift for a MAC */ shift *= 2; } else { shift = 0; } #endif /* Coarse search with 4x decimation */ for (i=0;i>2;i++) { celt_word32 sum = 0; for (j=0;j>2;j++) sum = MAC16_16(sum, x_lp4[j],y_lp4[i+j]); xcorr[i] = MAX32(-1, sum); maxcorr = MAX32(maxcorr, sum); } find_best_pitch(xcorr, maxcorr, y_lp4, 0, len>>2, max_pitch>>2, best_pitch); /* Finer search with 2x decimation */ maxcorr=1; for (i=0;i>1;i++) { celt_word32 sum=0; xcorr[i] = 0; if (abs(i-2*best_pitch[0])>2 && abs(i-2*best_pitch[1])>2) continue; for (j=0;j>1;j++) sum += SHR32(MULT16_16(x_lp[j],y[i+j]), shift); xcorr[i] = MAX32(-1, sum); maxcorr = MAX32(maxcorr, sum); } find_best_pitch(xcorr, maxcorr, y, shift, len>>1, max_pitch>>1, best_pitch); /* Refine by pseudo-interpolation */ if (best_pitch[0]>0 && best_pitch[0]<(max_pitch>>1)-1) { celt_word32 a, b, c; a = xcorr[best_pitch[0]-1]; b = xcorr[best_pitch[0]]; c = xcorr[best_pitch[0]+1]; if ((c-a) > MULT16_32_Q15(QCONST16(.7f,15),b-a)) offset = 1; else if ((a-c) > MULT16_32_Q15(QCONST16(.7f,15),b-c)) offset = -1; else offset = 0; } else { offset = 0; } *pitch = 2*best_pitch[0]-offset; CELT_MOVE(y, y+(N>>1), (lag-N)>>1); CELT_MOVE(y+((lag-N)>>1), x_lp, N>>1); RESTORE_STACK; /*printf ("%d\n", *pitch);*/ } mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/rangeenc.c0000664000175000017500000001512014010707311022121 0ustar builderbuilder/* Copyright (c) 2001-2008 Timothy B. Terriberry Copyright (c) 2008-2009 Xiph.Org Foundation */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "arch.h" #include "entenc.h" #include "mfrngcod.h" /*A range encoder. See rangedec.c and the references for implementation details \cite{Mar79,MNW98}. @INPROCEEDINGS{Mar79, author="Martin, G.N.N.", title="Range encoding: an algorithm for removing redundancy from a digitised message", booktitle="Video \& Data Recording Conference", year=1979, address="Southampton", month=Jul } @ARTICLE{MNW98, author="Alistair Moffat and Radford Neal and Ian H. Witten", title="Arithmetic Coding Revisited", journal="{ACM} Transactions on Information Systems", year=1998, volume=16, number=3, pages="256--294", month=Jul, URL="http://www.stanford.edu/class/ee398/handouts/papers/Moffat98ArithmCoding.pdf" }*/ /*Outputs a symbol, with a carry bit. If there is a potential to propagate a carry over several symbols, they are buffered until it can be determined whether or not an actual carry will occur. If the counter for the buffered symbols overflows, then the stream becomes undecodable. This gives a theoretical limit of a few billion symbols in a single packet on 32-bit systems. The alternative is to truncate the range in order to force a carry, but requires similar carry tracking in the decoder, needlessly slowing it down.*/ static void ec_enc_carry_out(ec_enc *_this,int _c){ if(_c!=EC_SYM_MAX){ /*No further carry propagation possible, flush buffer.*/ int carry; carry=_c>>EC_SYM_BITS; /*Don't output a byte on the first write. This compare should be taken care of by branch-prediction thereafter.*/ if(_this->rem>=0)ec_byte_write1(_this->buf,_this->rem+carry); if(_this->ext>0){ unsigned sym; sym=EC_SYM_MAX+carry&EC_SYM_MAX; do ec_byte_write1(_this->buf,sym); while(--(_this->ext)>0); } _this->rem=_c&EC_SYM_MAX; } else _this->ext++; } static inline void ec_enc_normalize(ec_enc *_this){ /*If the range is too small, output some bits and rescale it.*/ while(_this->rng<=EC_CODE_BOT){ ec_enc_carry_out(_this,(int)(_this->low>>EC_CODE_SHIFT)); /*Move the next-to-high-order symbol into the high-order position.*/ _this->low=_this->low<rng<<=EC_SYM_BITS; } } void ec_enc_init(ec_enc *_this,ec_byte_buffer *_buf){ _this->buf=_buf; _this->rem=-1; _this->ext=0; _this->low=0; _this->rng=EC_CODE_TOP; _this->end_byte=0; _this->end_bits_left=8; _this->nb_end_bits=0; } void ec_encode(ec_enc *_this,unsigned _fl,unsigned _fh,unsigned _ft){ ec_uint32 r; r=_this->rng/_ft; if(_fl>0){ _this->low+=_this->rng-IMUL32(r,(_ft-_fl)); _this->rng=IMUL32(r,(_fh-_fl)); } else _this->rng-=IMUL32(r,(_ft-_fh)); ec_enc_normalize(_this); } void ec_encode_bin(ec_enc *_this,unsigned _fl,unsigned _fh,unsigned _bits){ ec_uint32 r; r=_this->rng>>_bits; if(_fl>0){ _this->low+=_this->rng-IMUL32(r,((1<<_bits)-_fl)); _this->rng=IMUL32(r,(_fh-_fl)); } else _this->rng-=IMUL32(r,((1<<_bits)-_fh)); ec_enc_normalize(_this); } void ec_encode_raw(ec_enc *_this,unsigned _fl,unsigned _fh,unsigned bits){ _this->nb_end_bits += bits; while (bits >= _this->end_bits_left) { _this->end_byte |= (_fl<<(8-_this->end_bits_left)) & 0xff; _fl >>= _this->end_bits_left; ec_byte_write_at_end(_this->buf, _this->end_byte); _this->end_byte = 0; bits -= _this->end_bits_left; _this->end_bits_left = 8; } _this->end_byte |= (_fl<<(8-_this->end_bits_left)) & 0xff; _this->end_bits_left -= bits; } long ec_enc_tell(ec_enc *_this,int _b){ ec_uint32 r; int l; long nbits; nbits=(ec_byte_bytes(_this->buf)+(_this->rem>=0)+_this->ext)*EC_SYM_BITS; /*To handle the non-integral number of bits still left in the encoder state, we compute the number of bits of low that must be encoded to ensure that the value is inside the range for any possible subsequent bits.*/ nbits+=EC_CODE_BITS+1+_this->nb_end_bits; nbits<<=_b; l=EC_ILOG(_this->rng); r=_this->rng>>l-16; while(_b-->0){ int b; r=r*r>>15; b=(int)(r>>16); l=l<<1|b; r>>=b; } return nbits-l; } void ec_enc_done(ec_enc *_this){ ec_uint32 msk; ec_uint32 end; int l; /*We output the minimum number of bits that ensures that the symbols encoded thus far will be decoded correctly regardless of the bits that follow.*/ l=EC_CODE_BITS-EC_ILOG(_this->rng); msk=EC_CODE_TOP-1>>l; end=_this->low+msk&~msk; if((end|msk)>=_this->low+_this->rng){ l++; msk>>=1; end=_this->low+msk&~msk; } while(l>0){ ec_enc_carry_out(_this,(int)(end>>EC_CODE_SHIFT)); end=end<rem>=0||_this->ext>0){ ec_enc_carry_out(_this,0); _this->rem=-1; } { unsigned char *ptr = _this->buf->ptr; while (ptr<= _this->buf->end_ptr) *ptr++ = 0; if (_this->end_bits_left != 8) *_this->buf->end_ptr |= _this->end_byte; } } mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/entenc.c0000664000175000017500000000616414010707311021623 0ustar builderbuilder/* Copyright (c) 2001-2008 Timothy B. Terriberry Copyright (c) 2008-2009 Xiph.Org Foundation */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "os_support.h" #include "entenc.h" #include "arch.h" #define EC_BUFFER_INCREMENT (256) void ec_byte_writeinit_buffer(ec_byte_buffer *_b, unsigned char *_buf, long _size){ _b->ptr=_b->buf=_buf; _b->end_ptr=_b->buf+_size-1; _b->storage=_size; } void ec_byte_shrink(ec_byte_buffer *_b, long _size){ _b->end_ptr=_b->buf+_size-1; _b->storage=_size; } void ec_byte_write1(ec_byte_buffer *_b,unsigned _value){ ptrdiff_t endbyte; endbyte=_b->ptr-_b->buf; if(endbyte>=_b->storage){ celt_fatal("range encoder overflow\n"); } *(_b->ptr++)=(unsigned char)_value; } void ec_byte_write_at_end(ec_byte_buffer *_b,unsigned _value){ if (_b->end_ptr < _b->ptr) { celt_fatal("byte buffer collision"); } *(_b->end_ptr--)=(unsigned char)_value; } void ec_enc_bits(ec_enc *_this,ec_uint32 _fl,int _ftb){ unsigned fl; unsigned ft; while(_ftb>EC_UNIT_BITS){ _ftb-=EC_UNIT_BITS; fl=(unsigned)(_fl>>_ftb)&EC_UNIT_MASK; ec_encode_raw(_this,fl,fl+1,EC_UNIT_BITS); } ft=1<<_ftb; fl=(unsigned)_fl&ft-1; ec_encode_raw(_this,fl,fl+1,_ftb); } void ec_enc_uint(ec_enc *_this,ec_uint32 _fl,ec_uint32 _ft){ unsigned ft; unsigned fl; int ftb; /*In order to optimize EC_ILOG(), it is undefined for the value 0.*/ celt_assert(_ft>1); _ft--; ftb=EC_ILOG(_ft); if(ftb>EC_UNIT_BITS){ ftb-=EC_UNIT_BITS; ft=(_ft>>ftb)+1; fl=(unsigned)(_fl>>ftb); ec_encode(_this,fl,fl+1,ft); ec_enc_bits(_this,_fl,ftb); } else { ec_encode(_this,_fl,_fl+1,_ft+1); } } mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/ecintrin.h0000664000175000017500000001367514010707311022174 0ustar builderbuilder/* Copyright (c) 2003-2008 Timothy B. Terriberry Copyright (c) 2008 Xiph.Org Foundation */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /*Some common macros for potential platform-specific optimization.*/ #include #include #if !defined(_ecintrin_H) # define _ecintrin_H (1) /*Some specific platforms may have optimized intrinsic or inline assembly versions of these functions which can substantially improve performance. We define macros for them to allow easy incorporation of these non-ANSI features.*/ /*Note that we do not provide a macro for abs(), because it is provided as a library function, which we assume is translated into an intrinsic to avoid the function call overhead and then implemented in the smartest way for the target platform. With modern gcc (4.x), this is true: it uses cmov instructions if the architecture supports it and branchless bit-twiddling if it does not (the speed difference between the two approaches is not measurable). Interestingly, the bit-twiddling method was patented in 2000 (US 6,073,150) by Sun Microsystems, despite prior art dating back to at least 1996: http://web.archive.org/web/19961201174141/www.x86.org/ftp/articles/pentopt/PENTOPT.TXT On gcc 3.x, however, our assumption is not true, as abs() is translated to a conditional jump, which is horrible on deeply piplined architectures (e.g., all consumer architectures for the past decade or more) when the sign cannot be reliably predicted.*/ /*Modern gcc (4.x) can compile the naive versions of min and max with cmov if given an appropriate architecture, but the branchless bit-twiddling versions are just as fast, and do not require any special target architecture. Earlier gcc versions (3.x) compiled both code to the same assembly instructions, because of the way they represented ((_b)>(_a)) internally.*/ #define EC_MAXI(_a,_b) ((_a)-((_a)-(_b)&-((_b)>(_a)))) #define EC_MINI(_a,_b) ((_a)+((_b)-(_a)&-((_b)<(_a)))) /*This has a chance of compiling branchless, and is just as fast as the bit-twiddling method, which is slightly less portable, since it relies on a sign-extended rightshift, which is not guaranteed by ANSI (but present on every relevant platform).*/ #define EC_SIGNI(_a) (((_a)>0)-((_a)<0)) /*Slightly more portable than relying on a sign-extended right-shift (which is not guaranteed by ANSI), and just as fast, since gcc (3.x and 4.x both) compile it into the right-shift anyway.*/ #define EC_SIGNMASK(_a) (-((_a)<0)) /*Clamps an integer into the given range. If _a>_c, then the lower bound _a is respected over the upper bound _c (this behavior is required to meet our documented API behavior). _a: The lower bound. _b: The value to clamp. _c: The upper boud.*/ #define EC_CLAMPI(_a,_b,_c) (EC_MAXI(_a,EC_MINI(_b,_c))) /*Count leading zeros. This macro should only be used for implementing ec_ilog(), if it is defined. All other code should use EC_ILOG() instead.*/ #ifdef __GNUC_PREREQ #if __GNUC_PREREQ(3,4) # if INT_MAX>=2147483647 # define EC_CLZ0 sizeof(unsigned)*CHAR_BIT # define EC_CLZ(_x) (__builtin_clz(_x)) # elif LONG_MAX>=2147483647L # define EC_CLZ0 sizeof(unsigned long)*CHAR_BIT # define EC_CLZ(_x) (__builtin_clzl(_x)) # endif #endif #endif #if defined(EC_CLZ) /*Note that __builtin_clz is not defined when _x==0, according to the gcc documentation (and that of the BSR instruction that implements it on x86). The majority of the time we can never pass it zero. When we need to, it can be special cased.*/ # define EC_ILOG(_x) (EC_CLZ0-EC_CLZ(_x)) #elif defined(ENABLE_TI_DSPLIB) #include "dsplib.h" #define EC_ILOG(x) (31 - _lnorm(x)) #else # define EC_ILOG(_x) (ec_ilog(_x)) #endif #ifdef __GNUC_PREREQ #if __GNUC_PREREQ(3,4) # if INT_MAX>=9223372036854775807 # define EC_CLZ64_0 sizeof(unsigned)*CHAR_BIT # define EC_CLZ64(_x) (__builtin_clz(_x)) # elif LONG_MAX>=9223372036854775807L # define EC_CLZ64_0 sizeof(unsigned long)*CHAR_BIT # define EC_CLZ64(_x) (__builtin_clzl(_x)) # elif LLONG_MAX>=9223372036854775807LL # define EC_CLZ64_0 sizeof(unsigned long long)*CHAR_BIT # define EC_CLZ64(_x) (__builtin_clzll(_x)) # endif #endif #endif #if defined(EC_CLZ64) /*Note that __builtin_clz is not defined when _x==0, according to the gcc documentation (and that of the BSR instruction that implements it on x86). The majority of the time we can never pass it zero. When we need to, it can be special cased.*/ # define EC_ILOG64(_x) (EC_CLZ64_0-EC_CLZ64(_x)) #else # define EC_ILOG64(_x) (ec_ilog64(_x)) #endif #endif mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/mfrngcod.h0000664000175000017500000000535614010707311022155 0ustar builderbuilder/* Copyright (c) 2001-2008 Timothy B. Terriberry Copyright (c) 2008-2009 Xiph.Org Foundation */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if !defined(_mfrngcode_H) # define _mfrngcode_H (1) # include "entcode.h" /*Constants used by the entropy encoder/decoder.*/ /*The number of bits to output at a time.*/ # define EC_SYM_BITS (8) /*The total number of bits in each of the state registers.*/ # define EC_CODE_BITS (32) /*The maximum symbol value.*/ # define EC_SYM_MAX ((1U<>EC_SYM_BITS) /*Code for which propagating carries are possible.*/ # define EC_CODE_CARRY (((ec_uint32)EC_SYM_MAX)< */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* Version 1.1 */ #ifndef FLOAT_CAST_H #define FLOAT_CAST_H #include "arch.h" /*============================================================================ ** On Intel Pentium processors (especially PIII and probably P4), converting ** from float to int is very slow. To meet the C specs, the code produced by ** most C compilers targeting Pentium needs to change the FPU rounding mode ** before the float to int conversion is performed. ** ** Changing the FPU rounding mode causes the FPU pipeline to be flushed. It ** is this flushing of the pipeline which is so slow. ** ** Fortunately the ISO C99 specifications define the functions lrint, lrintf, ** llrint and llrintf which fix this problem as a side effect. ** ** On Unix-like systems, the configure process should have detected the ** presence of these functions. If they weren't found we have to replace them ** here with a standard C cast. */ /* ** The C99 prototypes for lrint and lrintf are as follows: ** ** long int lrintf (float x) ; ** long int lrint (double x) ; */ /* The presence of the required functions are detected during the configure ** process and the values HAVE_LRINT and HAVE_LRINTF are set accordingly in ** the config.h file. */ #if (HAVE_LRINTF) /* These defines enable functionality introduced with the 1999 ISO C ** standard. They must be defined before the inclusion of math.h to ** engage them. If optimisation is enabled, these functions will be ** inlined. With optimisation switched off, you have to link in the ** maths library using -lm. */ #define _ISOC9X_SOURCE 1 #define _ISOC99_SOURCE 1 #define __USE_ISOC9X 1 #define __USE_ISOC99 1 #include #define float2int(x) lrintf(x) #elif (defined(HAVE_LRINT)) #define _ISOC9X_SOURCE 1 #define _ISOC99_SOURCE 1 #define __USE_ISOC9X 1 #define __USE_ISOC99 1 #include #define float2int(x) lrint(x) #elif (defined(_MSC_VER) && _MSC_VER >= 1400) && (defined (WIN64) || defined (_WIN64)) #include __inline long int float2int(float value) { return _mm_cvtss_si32(_mm_load_ss(&value)); } #elif (defined(_MSC_VER) && _MSC_VER >= 1400) && (defined (WIN32) || defined (_WIN32)) #include /* Win32 doesn't seem to have these functions. ** Therefore implement OPUS_INLINE versions of these functions here. */ __inline long int float2int (float flt) { int intgr; _asm { fld flt fistp intgr } ; return intgr ; } #else #if (defined(__GNUC__) && defined(__STDC__) && __STDC__ && __STDC_VERSION__ >= 199901L) /* supported by gcc in C99 mode, but not by all other compilers */ #warning "Don't have the functions lrint() and lrintf ()." #warning "Replacing these functions with a standard C cast." #endif /* __STDC_VERSION__ >= 199901L */ #include #define float2int(flt) ((int)(floor(.5+flt))) #endif #endif /* FLOAT_CAST_H */ mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/os_support.h0000664000175000017500000001133114010707311022561 0ustar builderbuilder/* Copyright (C) 2007 Jean-Marc Valin File: os_support.h This is the (tiny) OS abstraction layer. Aside from math.h, this is the only place where system headers are allowed. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef OS_SUPPORT_H #define OS_SUPPORT_H #ifdef CUSTOM_SUPPORT # include "custom_support.h" #endif #include #include #include /** CELT wrapper for calloc(). To do your own dynamic allocation, all you need to do is replace this function, celt_realloc and celt_free NOTE: celt_alloc needs to CLEAR THE MEMORY */ #ifndef OVERRIDE_CELT_ALLOC static inline void *celt_alloc (int size) { /* WARNING: this is not equivalent to malloc(). If you want to use malloc() or your own allocator, YOU NEED TO CLEAR THE MEMORY ALLOCATED. Otherwise you will experience strange bugs */ return calloc(size,1); } #endif /** Same as celt_alloc(), except that the area is only needed inside a CELT call (might cause problem with wideband though) */ #ifndef OVERRIDE_CELT_ALLOC_SCRATCH static inline void *celt_alloc_scratch (int size) { /* Scratch space doesn't need to be cleared */ return calloc(size,1); } #endif /** CELT wrapper for realloc(). To do your own dynamic allocation, all you need to do is replace this function, celt_alloc and celt_free */ #ifndef OVERRIDE_CELT_REALLOC static inline void *celt_realloc (void *ptr, int size) { return realloc(ptr, size); } #endif /** CELT wrapper for free(). To do your own dynamic allocation, all you need to do is replace this function, celt_realloc and celt_alloc */ #ifndef OVERRIDE_CELT_FREE static inline void celt_free (void *ptr) { free(ptr); } #endif /** Same as celt_free(), except that the area is only needed inside a CELT call (might cause problem with wideband though) */ #ifndef OVERRIDE_CELT_FREE_SCRATCH static inline void celt_free_scratch (void *ptr) { free(ptr); } #endif /** Copy n bytes of memory from src to dst. The 0* term provides compile-time type checking */ #ifndef OVERRIDE_CELT_COPY #define CELT_COPY(dst, src, n) (memcpy((dst), (src), (n)*sizeof(*(dst)) + 0*((dst)-(src)) )) #endif /** Copy n bytes of memory from src to dst, allowing overlapping regions. The 0* term provides compile-time type checking */ #ifndef OVERRIDE_CELT_MOVE #define CELT_MOVE(dst, src, n) (memmove((dst), (src), (n)*sizeof(*(dst)) + 0*((dst)-(src)) )) #endif /** Set n bytes of memory to value of c, starting at address s */ #ifndef OVERRIDE_CELT_MEMSET #define CELT_MEMSET(dst, c, n) (memset((dst), (c), (n)*sizeof(*(dst)))) #endif #ifndef OVERRIDE_CELT_FATAL static inline void _celt_fatal(const char *str, const char *file, int line) { fprintf (stderr, "Fatal (internal) error in %s, line %d: %s\n", file, line, str); abort(); } #endif #ifndef OVERRIDE_CELT_WARNING static inline void celt_warning(const char *str) { #ifndef DISABLE_WARNINGS fprintf (stderr, "warning: %s\n", str); #endif } #endif #ifndef OVERRIDE_CELT_WARNING_INT static inline void celt_warning_int(const char *str, int val) { #ifndef DISABLE_WARNINGS fprintf (stderr, "warning: %s %d\n", str, val); #endif } #endif #ifndef OVERRIDE_CELT_NOTIFY static inline void celt_notify(const char *str) { #ifndef DISABLE_NOTIFICATIONS fprintf (stderr, "notification: %s\n", str); #endif } #endif /*#ifdef __GNUC__ #pragma GCC poison printf sprintf #pragma GCC poison malloc free realloc calloc #endif*/ #endif /* OS_SUPPORT_H */ mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/cwrs.h0000664000175000017500000000413514010707311021326 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Copyright (c) 2007-2009 Timothy B. Terriberry Written by Timothy B. Terriberry and Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef CWRS_H #define CWRS_H #include "arch.h" #include "stack_alloc.h" #include "entenc.h" #include "entdec.h" int log2_frac(ec_uint32 val, int frac); /* Whether the CWRS codebook will fit into 32 bits */ int fits_in32(int _n, int _m); void get_required_bits(celt_int16 *bits, int N, int K, int frac); void encode_pulses(int *_y, int N, int K, ec_enc *enc); void decode_pulses(int *_y, int N, int K, ec_dec *dec); #endif /* CWRS_H */ mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/psy.c0000664000175000017500000001534614010707311021164 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "psy.h" #include #include "os_support.h" #include "arch.h" #include "stack_alloc.h" #include "mathops.h" /* The Vorbis freq<->Bark mapping */ #define toBARK(n) (13.1f*atan(.00074f*(n))+2.24f*atan((n)*(n)*1.85e-8f)+1e-4f*(n)) #define fromBARK(z) (102.f*(z)-2.f*pow(z,2.f)+.4f*pow(z,3.f)+pow(1.46f,z)-1.f) #ifndef STATIC_MODES /* Psychoacoustic spreading function. The idea here is compute a first order recursive filter. The filter coefficient is frequency dependent and chosen such that we have a -10dB/Bark slope on the right side and a -25dB/Bark slope on the left side. */ void psydecay_init(struct PsyDecay *decay, int len, celt_int32 Fs) { int i; celt_word16 *decayR = (celt_word16*)celt_alloc(sizeof(celt_word16)*len); decay->decayR = decayR; if (decayR==NULL) return; for (i=0;iBark function (see above) */ deriv = (8.288e-8 * f)/(3.4225e-16 *f*f*f*f + 1) + .009694/(5.476e-7 *f*f + 1) + 1e-4; /* Back to FFT bin units */ deriv *= Fs*(1/(2.f*len)); /* decay corresponding to -10dB/Bark */ decayR[i] = Q15ONE*pow(.1f, deriv); /* decay corresponding to -25dB/Bark */ /*decay->decayL[i] = Q15ONE*pow(0.0031623f, deriv);*/ /*printf ("%f %f\n", decayL[i], decayR[i]);*/ } } void psydecay_clear(struct PsyDecay *decay) { celt_free((celt_word16 *)decay->decayR); /*celt_free(decay->decayL);*/ } #endif static void spreading_func(const struct PsyDecay *d, celt_word32 * restrict psd, int len) { int i; celt_word32 mem; /* Compute right slope (-10 dB/Bark) */ mem=psd[0]; for (i=0;idecayR[i],mem-psd[i]); mem = psd[i]; } /* Compute left slope (-25 dB/Bark) */ mem=psd[len-1]; for (i=len-1;i>=0;i--) { /* Left side has around twice the slope as the right side, so we just square the coef instead of storing two sets of decay coefs */ celt_word16 decayL = MULT16_16_Q15(d->decayR[i], d->decayR[i]); /* psd = (1-decay)*psd + decay*mem */ psd[i] = EPSILON + psd[i] + MULT16_32_Q15(decayL,mem-psd[i]); mem = psd[i]; } #if 0 /* Prints signal and mask energy per critical band */ for (i=0;i<25;i++) { int start,end; int j; celt_word32 Esig=0, Emask=0; start = (int)floor(fromBARK((float)i)*(2*len)/Fs); if (start<0) start = 0; end = (int)ceil(fromBARK((float)(i+1))*(2*len)/Fs); if (end<=start) end = start+1; if (end>len-1) end = len-1; for (j=start;j>1; mask[0] = MULT16_16(X[0], X[0]); for (i=1;i>2; mem2 = mem+2*N; X[0] = 0; X[1] = 0; tonality[0] = 1; for (i=1;i1) tonality[i] = 1; if (tonality[i]<.02) tonality[i]=.02; } } #endif mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/bands.h0000664000175000017500000001131014010707311021430 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Copyright (c) 2008-2009 Gregory Maxwell Written by Jean-Marc Valin and Gregory Maxwell */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef BANDS_H #define BANDS_H #include "arch.h" #include "modes.h" #include "entenc.h" #include "entdec.h" #include "rate.h" /** Compute the amplitude (sqrt energy) in each of the bands * @param m Mode data * @param X Spectrum * @param bands Square root of the energy for each band (returned) */ void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *bands, int _C); /*void compute_noise_energies(const CELTMode *m, const celt_sig *X, const celt_word16 *tonality, celt_ener *bank);*/ /** Normalise each band of X such that the energy in each band is equal to 1 * @param m Mode data * @param X Spectrum (returned normalised) * @param bands Square root of the energy for each band */ void normalise_bands(const CELTMode *m, const celt_sig * restrict freq, celt_norm * restrict X, const celt_ener *bands, int _C); void renormalise_bands(const CELTMode *m, celt_norm * restrict X, int _C); /** Denormalise each band of X to restore full amplitude * @param m Mode data * @param X Spectrum (returned de-normalised) * @param bands Square root of the energy for each band */ void denormalise_bands(const CELTMode *m, const celt_norm * restrict X, celt_sig * restrict freq, const celt_ener *bands, int _C); /** Compute the pitch predictor gain for each pitch band * @param m Mode data * @param X Spectrum to predict * @param P Pitch vector (normalised) * @param gains Gain computed for each pitch band (returned) * @param bank Square root of the energy for each band */ int compute_pitch_gain(const CELTMode *m, const celt_sig *X, const celt_sig *P, int norm_rate, int *gain_id, int _C, celt_word16 *gain_prod); void apply_pitch(const CELTMode *m, celt_sig *X, const celt_sig *P, int gain_id, int pred, int _C); int folding_decision(const CELTMode *m, celt_norm *X, celt_word16 *average, int *last_decision, int _C); /** Quantisation/encoding of the residual spectrum * @param m Mode data * @param X Residual (normalised) * @param total_bits Total number of bits that can be used for the frame (including the ones already spent) * @param enc Entropy encoder */ void quant_bands(const CELTMode *m, celt_norm * restrict X, const celt_ener *bandE, int *pulses, int time_domain, int fold, int total_bits, int encode, void *enc_dec); void quant_bands_stereo(const CELTMode *m, celt_norm * restrict X, const celt_ener *bandE, int *pulses, int time_domain, int fold, int total_bits, ec_enc *enc); /** Decoding of the residual spectrum * @param m Mode data * @param X Residual (normalised) * @param total_bits Total number of bits that can be used for the frame (including the ones already spent) * @param dec Entropy decoder */ void unquant_bands(const CELTMode *m, celt_norm * restrict X, const celt_ener *bandE, int *pulses, int time_domain, int fold, int total_bits, ec_dec *dec); void unquant_bands_stereo(const CELTMode *m, celt_norm * restrict X, const celt_ener *bandE, int *pulses, int time_domain, int fold, int total_bits, ec_dec *dec); void stereo_decision(const CELTMode *m, celt_norm * restrict X, int *stereo_mode, int len); #endif /* BANDS_H */ mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/testcelt.c0000664000175000017500000001374614010707311022202 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "celt.h" #include "arch.h" #include #include #include #include #define MAX_PACKET 1024 int main(int argc, char *argv[]) { int err; char *inFile, *outFile; FILE *fin, *fout; CELTMode *mode=NULL; CELTEncoder *enc; CELTDecoder *dec; int len; celt_int32 frame_size, channels; int bytes_per_packet; unsigned char data[MAX_PACKET]; int rate; int complexity; #if !(defined (FIXED_POINT) && defined(STATIC_MODES)) int i; double rmsd = 0; #endif int count = 0; celt_int32 skip; celt_int16 *in, *out; if (argc != 9 && argc != 8 && argc != 7) { fprintf (stderr, "Usage: testcelt " " [ [packet loss rate]] " " \n"); return 1; } rate = atoi(argv[1]); channels = atoi(argv[2]); frame_size = atoi(argv[3]); mode = celt_mode_create(rate, frame_size, NULL); celt_mode_info(mode, CELT_GET_LOOKAHEAD, &skip); if (mode == NULL) { fprintf(stderr, "failed to create a mode\n"); return 1; } bytes_per_packet = atoi(argv[4]); if (bytes_per_packet < 0 || bytes_per_packet > MAX_PACKET) { fprintf (stderr, "bytes per packet must be between 0 and %d\n", MAX_PACKET); return 1; } inFile = argv[argc-2]; fin = fopen(inFile, "rb"); if (!fin) { fprintf (stderr, "Could not open input file %s\n", argv[argc-2]); return 1; } outFile = argv[argc-1]; fout = fopen(outFile, "wb+"); if (!fout) { fprintf (stderr, "Could not open output file %s\n", argv[argc-1]); return 1; } enc = celt_encoder_create(mode, channels, &err); if (err != 0) { fprintf(stderr, "Failed to create the encoder: %s\n", celt_strerror(err)); return 1; } dec = celt_decoder_create(mode, channels, &err); if (err != 0) { fprintf(stderr, "Failed to create the decoder: %s\n", celt_strerror(err)); return 1; } if (argc>7) { complexity=atoi(argv[5]); celt_encoder_ctl(enc,CELT_SET_COMPLEXITY(complexity)); } celt_mode_info(mode, CELT_GET_FRAME_SIZE, &frame_size); in = (celt_int16*)malloc(frame_size*channels*sizeof(celt_int16)); out = (celt_int16*)malloc(frame_size*channels*sizeof(celt_int16)); while (!feof(fin)) { err = fread(in, sizeof(short), frame_size*channels, fin); if (feof(fin)) break; len = celt_encode(enc, in, in, data, bytes_per_packet); if (len <= 0) { fprintf (stderr, "celt_encode() returned %d\n", len); return 1; } /* This is for simulating bit errors */ #if 0 int errors = 0; int eid = 0; /* This simulates random bit error */ for (i=0;i 0) { rmsd = sqrt(rmsd/(1.0*frame_size*channels*count)); fprintf (stderr, "Error: encoder doesn't match decoder\n"); fprintf (stderr, "RMS mismatch is %f\n", rmsd); return 1; } else { fprintf (stderr, "Encoder matches decoder!!\n"); } #endif celt_mode_destroy(mode); free(in); free(out); return 0; } mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt/laplace.h0000664000175000017500000000455114010707311021753 0ustar builderbuilder/* Copyright (c) 2007 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "entenc.h" #include "entdec.h" int ec_laplace_get_start_freq(int decay); /** Encode a value that is assumed to be the realisation of a Laplace-distributed random process @param enc Entropy encoder state @param value Value to encode @param decay Probability of the value +/- 1, multiplied by 16384 */ void ec_laplace_encode(ec_enc *enc, int *value, int decay); void ec_laplace_encode_start(ec_enc *enc, int *value, int decay, int fs); /** Decode a value that is assumed to be the realisation of a Laplace-distributed random process @param dec Entropy decoder state @param decay Probability of the value +/- 1, multiplied by 16384 @return Value decoded */ int ec_laplace_decode(ec_dec *dec, int decay); int ec_laplace_decode_start(ec_dec *dec, int decay, int fs); mumble-1.3.4/3rdparty/celt-0.7.0-src/README0000664000175000017500000001024714010707311017442 0ustar builderbuilderCELT is a very low delay audio codec designed for high-quality communications. Traditional full-bandwidth codecs such as Vorbis and AAC can offer high quality but they require codec delays of hundreds of milliseconds, which makes them unsuitable for real-time interactive applications like tele- conferencing. Speech targeted codecs, such as Speex or G.722, have lower 20-40ms delays but their speech focus and limited sampling rates restricts their quality, especially for music. Additionally, the other mandatory components of a full network audio system— audio interfaces, routers, jitter buffers— each add their own delay. For lower speed networks the time it takes to serialize a packet onto the network cable takes considerable time, and over the long distances the speed of light imposes a significant delay. In teleconferencing— it is important to keep delay low so that the participants can communicate fluidly without talking on top of each other and so that their own voices don't return after a round trip as an annoying echo. For network music performance— research has show that the total one way delay must be kept under 25ms to avoid degrading the musicians performance. Since many of the sources of delay in a complete system are outside of the user's control (such as the speed of light) it is often only possible to reduce the total delay by reducing the codec delay. Low delay has traditionally been considered a challenging area in audio codec design, because as a codec is forced to work on the smaller chunks of audio required for low delay it has access to less redundancy and less perceptual information which it can use to reduce the size of the transmitted audio. CELT is designed to bridge the gap between "music" and "speech" codecs, permitting new very high quality teleconferencing applications, and to go further, permitting latencies much lower than speech codecs normally provide to enable applications such as remote musical collaboration even over long distances. In keeping with the Xiph.Org mission— CELT is also designed to accomplish this without copyright or patent encumbrance. Only by keeping the formats that drive our Internet communication free and unencumbered can we maximize innovation, collaboration, and interoperability. Fortunately, CELT is ahead of the adoption curve in its target application space, so there should be no reason for someone who needs what CELT provides to go with a proprietary codec. CELT has been tested on x86, x86_64, ARM, and the TI C55x DSPs, and should be portable to any platform with a working C compiler and on the order of 100 MIPS of processing power. The code is still in early stage, so it may be broken from time to time, and the bit-stream is not frozen yet, so it is different from one version to another. Oh, and don't complain if it sets your house on fire. Complaints and accolades can be directed to the CELT mailing list: http://lists.xiph.org/mailman/listinfo/celt-dev/ To compile: % ./configure % make For platforms without fast floating point support (such as ARM) use the --enable-fixed argument to configure to build a fixed-point version of CELT. There are Ogg-based encode/decode tools in tools/. These are quite similar to the speexenc/speexdec tools. Use the --help option for details. There is also a basic tool for testing the encoder and decoder called "testcelt" located in libcelt/: % testcelt input.sw output.sw where input.sw is a 16-bit (machine endian) audio file sampled at 32000 Hz to 96000 Hz. The output file is already decompressed. For example, for a 44.1 kHz mono stream at ~64kbit/sec and with 256 sample frames: % testcelt 44100 1 256 46 intput.sw output.sw Since 44100/256*46*8 = 63393.74 bits/sec. All even frame sizes from 64 to 512 are currently supported, although power-of-two sizes are recommended and most CELT development is done using a size of 256. The delay imposed by CELT is 1.25x - 1.5x the frame duration depending on the frame size and some details of CELT's internal operation. For 256 sample frames the delay is 1.5x or 384 samples, so the total codec delay in the above example is 8.70ms (1000/(44100/384)). mumble-1.3.4/3rdparty/celt-0.7.0-src/TODO0000664000175000017500000000122614010707311017247 0ustar builderbuilder- Check minimum width of bands - Revisit energy resolution based on the bit-rate - Revisit static bit allocation (as a function of frame size and channels) - Dynamic adjustment of energy quantisation - Psychacoustics * Error shaping within each band * Decisions on the rate - Intensity stereo decisions - Dynamic (intra-frame) bit allocation - Joint encoding of stereo energy - Encode band shape (or just tilt)? - Make energy encoding more robust to losses? Misc: Detect uint decoding and flag them in the decoder directly If we attempt to write too many bits on the encoder side, set a flag instead of aborting Save "raw bytes" at the end of the stream mumble-1.3.4/3rdparty/celt-0.7.0-src/COPYING0000664000175000017500000000300014010707311017602 0ustar builderbuilderCopyright 2001-2009 Jean-Marc Valin, Timothy B. Terriberry, CSIRO, and other contributors Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. mumble-1.3.4/3rdparty/celt-0.7.0-src/INSTALL0000664000175000017500000000003714010707311017607 0ustar builderbuilderTo compile: ./configure make mumble-1.3.4/3rdparty/celt-0.7.0-src/libcelt.spec.in0000664000175000017500000000360114010707311021455 0ustar builderbuilderSummary: The CELT Low-Latency Audio Compression Codec. Name: libcelt Version: @CELT_VERSION@ Release: 0%{?dist} Epoch: 0 Group: System Environment/Libraries License: BSD URL: http://www.xiph.org/ Source: http://downloads.xiph.org/releases/celt/celt-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: libogg-devel >= 2:1.1 Requires: pkg-config %description CELT is a fully open, non-proprietary, patent- and royalty-free, low-latency compressed audio format for voice and music. The libcelt package contains runtime libraries for use in programs that support Ogg CELT. %package devel Summary: Files for CELT application development. Group: Development/Libraries Requires: libogg-devel >= 2:1.1 Requires: libcelt = %{epoch}:%{version}-%{release} %description devel The libcelt-devel package contains the header files and documentation needed to develop applications with Ogg CELT. %package utils Summary: CELT codec utilities. Group: Applications/Multimedia Requires: libcelt = %{epoch}:%{version}-%{release} %description utils Basic utilities for encoding, decoding and manipulating Ogg CELT streams. %prep %setup -q -n celt-%{version} %build %configure --with-ogg-libraries=%{_libdir} make %check make check %install rm -rf $RPM_BUILD_ROOT make DESTDIR=$RPM_BUILD_ROOT install # remove unpackaged files from the buildroot rm -f $RPM_BUILD_ROOT%{_libdir}/*.la rm -f $RPM_BUILD_ROOT%{_libdir}/*.a %files %defattr(-,root,root) %doc AUTHORS COPYING README %{_libdir}/libcelt.so.* %files devel %defattr(-,root,root) %{_includedir}/celt %{_libdir}/libcelt.so %{_libdir}/pkgconfig/*.pc %files utils %defattr(-,root,root) %{_bindir}/celtenc %{_bindir}/celtdec %clean rm -rf $RPM_BUILD_ROOT %post -p /sbin/ldconfig %postun -p /sbin/ldconfig %changelog * Mon Dec 22 2008 Monty Montgomery 0.5.1-0 - initial spec file created mumble-1.3.4/3rdparty/celt-0.7.0-src/autogen.sh0000775000175000017500000000642214010707311020563 0ustar builderbuilder#!/bin/sh # Run this to set up the build system: configure, makefiles, etc. # (based on the version in enlightenment's cvs) package="celt" olddir=`pwd` srcdir=`dirname $0` test -z "$srcdir" && srcdir=. cd "$srcdir" DIE=0 echo "checking for autoconf... " (autoconf --version) < /dev/null > /dev/null 2>&1 || { echo echo "You must have autoconf installed to compile $package." echo "Download the appropriate package for your distribution," echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" DIE=1 } VERSIONGREP="sed -e s/.*[^0-9\.]\([0-9]\.[0-9]*\).*/\1/" VERSIONMKINT="sed -e s/[^0-9]//" # do we need automake? if test -r Makefile.am; then AM_NEEDED=`fgrep AUTOMAKE_OPTIONS Makefile.am | $VERSIONGREP` if test -z $AM_NEEDED; then echo -n "checking for automake... " AUTOMAKE=automake ACLOCAL=aclocal if ($AUTOMAKE --version < /dev/null > /dev/null 2>&1); then echo "no" AUTOMAKE= else echo "yes" fi else echo -n "checking for automake $AM_NEEDED or later... " for am in automake-$AM_NEEDED automake$AM_NEEDED automake; do ($am --version < /dev/null > /dev/null 2>&1) || continue ver=`$am --version < /dev/null | head -n 1 | $VERSIONGREP | $VERSIONMKINT` verneeded=`echo $AM_NEEDED | $VERSIONMKINT` if test $ver -ge $verneeded; then AUTOMAKE=$am echo $AUTOMAKE break fi done test -z $AUTOMAKE && echo "no" echo -n "checking for aclocal $AM_NEEDED or later... " for ac in aclocal-$AM_NEEDED aclocal$AM_NEEDED aclocal; do ($ac --version < /dev/null > /dev/null 2>&1) || continue ver=`$ac --version < /dev/null | head -n 1 | $VERSIONGREP | $VERSIONMKINT` verneeded=`echo $AM_NEEDED | $VERSIONMKINT` if test $ver -ge $verneeded; then ACLOCAL=$ac echo $ACLOCAL break fi done test -z $ACLOCAL && echo "no" fi test -z $AUTOMAKE || test -z $ACLOCAL && { echo echo "You must have automake installed to compile $package." echo "Download the appropriate package for your distribution," echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" exit 1 } fi echo -n "checking for libtool... " for LIBTOOLIZE in libtoolize glibtoolize nope; do ($LIBTOOLIZE --version) < /dev/null > /dev/null 2>&1 && break done if test x$LIBTOOLIZE = xnope; then echo "nope." LIBTOOLIZE=libtoolize else echo $LIBTOOLIZE fi ($LIBTOOLIZE --version) < /dev/null > /dev/null 2>&1 || { echo echo "You must have libtool installed to compile $package." echo "Download the appropriate package for your system," echo "or get the source from one of the GNU ftp sites" echo "listed in http://www.gnu.org/order/ftp.html" DIE=1 } if test "$DIE" -eq 1; then exit 1 fi echo "Generating configuration files for $package, please wait...." echo " $ACLOCAL $ACLOCAL_FLAGS" $ACLOCAL $ACLOCAL_FLAGS || exit 1 echo " autoheader" autoheader || exit 1 echo " $LIBTOOLIZE --automake" $LIBTOOLIZE --automake || exit 1 echo " $AUTOMAKE --add-missing $AUTOMAKE_FLAGS" $AUTOMAKE --add-missing $AUTOMAKE_FLAGS || exit 1 echo " autoconf" autoconf || exit 1 cd $olddir #$srcdir/configure "$@" && echo mumble-1.3.4/3rdparty/celt-0.7.0-src/celt.kdevelop0000664000175000017500000001465714010707311021255 0ustar builderbuilder Jean-Marc Valin Jean-Marc.Valin@USherbrooke.ca $VERSION KDevAutoProject C celt . false default libcelt/libcelt.la true false false false false optimized GccOptions GppOptions G77Options -O2 -g0 --enable-debug=full debug GccOptions GppOptions G77Options -O0 -g3 true true 4 false 0 libtool true false false false false true 10 ada ada_bugs_gcc bash bash_bugs clanlib fortran_bugs_gcc gnome1 gnustep gtk gtk_bugs haskell haskell_bugs_ghc java_bugs_gcc java_bugs_sun kde2book libstdc++ opengl pascal_bugs_fp php php_bugs perl perl_bugs python python_bugs qt-kdev3 ruby ruby_bugs sdl stl sw w3c-dom-level2-html w3c-svg w3c-uaag10 wxwidgets_bugs Guide to the Qt Translation Tools Qt Assistant Manual Qt Designer Manual Qt Reference Documentation qmake User Guide KDE Libraries (Doxygen) false 3 3 EmbeddedKDevDesigner false true true 250 400 250 false 0 true true false std=_GLIBCXX_STD;__gnu_cxx=std true false false false false true true false .; set m_,_ theValue true true true true Horizontal .h .cpp *.o,*.lo,CVS false mumble-1.3.4/3rdparty/celt-0.7.0-src/tests/0000775000175000017500000000000014010707311017720 5ustar builderbuildermumble-1.3.4/3rdparty/celt-0.7.0-src/tests/laplace-test.c0000664000175000017500000000245114010707311022444 0ustar builderbuilder#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "laplace.h" #define CELT_C #include "../libcelt/stack_alloc.h" #include "../libcelt/rangeenc.c" #include "../libcelt/rangedec.c" #include "../libcelt/entenc.c" #include "../libcelt/entdec.c" #include "../libcelt/entcode.c" #include "../libcelt/laplace.c" #define DATA_SIZE 40000 int main(void) { int i; int ret = 0; ec_enc enc; ec_dec dec; ec_byte_buffer buf; unsigned char *ptr; int val[10000], decay[10000]; ALLOC_STACK; ptr = malloc(DATA_SIZE); ec_byte_writeinit_buffer(&buf, ptr, DATA_SIZE); //ec_byte_writeinit(&buf); ec_enc_init(&enc,&buf); val[0] = 3; decay[0] = 6000; val[1] = 0; decay[1] = 5800; val[2] = -1; decay[2] = 5600; for (i=3;i<10000;i++) { val[i] = rand()%15-7; decay[i] = rand()%11000+5000; } for (i=0;i<10000;i++) ec_laplace_encode(&enc, &val[i], decay[i]); ec_enc_done(&enc); ec_byte_readinit(&buf,ec_byte_get_buffer(&buf),ec_byte_bytes(&buf)); ec_dec_init(&dec,&buf); for (i=0;i<10000;i++) { int d = ec_laplace_decode(&dec, decay[i]); if (d != val[i]) { fprintf (stderr, "Got %d instead of %d\n", d, val[i]); ret = 1; } } return ret; } mumble-1.3.4/3rdparty/celt-0.7.0-src/tests/type-test.c0000664000175000017500000000056514010707311022030 0ustar builderbuilder#ifdef HAVE_CONFIG_H #include "config.h" #endif #include "celt_types.h" #include int main(void) { celt_int16 i = 1; i <<= 14; if (i>>14 != 1) { fprintf(stderr, "celt_int16 isn't 16 bits\n"); return 1; } if (sizeof(celt_int16)*2 != sizeof(celt_int32)) { fprintf(stderr, "16*2 != 32\n"); return 1; } return 0; } mumble-1.3.4/3rdparty/celt-0.7.0-src/tests/mathops-test.c0000664000175000017500000000765214010707311022526 0ustar builderbuilder#ifdef HAVE_CONFIG_H #include "config.h" #endif #include "mathops.h" #include #include #ifdef FIXED_POINT #define WORD "%d" #else #define WORD "%f" #endif #ifdef FIXED_DEBUG long long celt_mips=0; #endif int ret = 0; void testdiv(void) { celt_int32 i; for (i=1;i<=327670;i++) { double prod; celt_word32 val; val = celt_rcp(i); #ifdef FIXED_POINT prod = (1./32768./65526.)*val*i; #else prod = val*i; #endif if (fabs(prod-1) > .00025) { fprintf (stderr, "div failed: 1/%d="WORD" (product = %f)\n", i, val, prod); ret = 1; } } } void testsqrt(void) { celt_int32 i; for (i=1;i<=1000000000;i++) { double ratio; celt_word16 val; val = celt_sqrt(i); ratio = val/sqrt(i); if (fabs(ratio - 1) > .0005 && fabs(val-sqrt(i)) > 2) { fprintf (stderr, "sqrt failed: sqrt(%d)="WORD" (ratio = %f)\n", i, val, ratio); ret = 1; } i+= i>>10; } } void testrsqrt(void) { celt_int32 i; for (i=1;i<=2000000;i++) { double ratio; celt_word16 val; val = celt_rsqrt(i); ratio = val*sqrt(i)/Q15ONE; if (fabs(ratio - 1) > .05) { fprintf (stderr, "rsqrt failed: rsqrt(%d)="WORD" (ratio = %f)\n", i, val, ratio); ret = 1; } i+= i>>10; } } #ifndef FIXED_POINT void testlog2(void) { float x; for (x=0.001;x<1677700.0;x+=(x/8.0)) { float error = fabs((1.442695040888963387*log(x))-celt_log2(x)); if (error>0.0009) { fprintf (stderr, "celt_log2 failed: fabs((1.442695040888963387*log(x))-celt_log2(x))>0.001 (x = %f, error = %f)\n", x,error); ret = 1; } } } void testexp2(void) { float x; for (x=-11.0;x<24.0;x+=0.0007) { float error = fabs(x-(1.442695040888963387*log(celt_exp2(x)))); if (error>0.0002) { fprintf (stderr, "celt_exp2 failed: fabs(x-(1.442695040888963387*log(celt_exp2(x))))>0.0005 (x = %f, error = %f)\n", x,error); ret = 1; } } } void testexp2log2(void) { float x; for (x=-11.0;x<24.0;x+=0.0007) { float error = fabs(x-(celt_log2(celt_exp2(x)))); if (error>0.001) { fprintf (stderr, "celt_log2/celt_exp2 failed: fabs(x-(celt_log2(celt_exp2(x))))>0.001 (x = %f, error = %f)\n", x,error); ret = 1; } } } #else void testlog2(void) { celt_word32 x; for (x=8;x<1073741824;x+=(x>>3)) { float error = fabs((1.442695040888963387*log(x/16384.0))-celt_log2(x)/256.0); if (error>0.003) { fprintf (stderr, "celt_log2 failed: x = %ld, error = %f\n", (long)x,error); ret = 1; } } } void testexp2(void) { celt_word16 x; for (x=-32768;x<-30720;x++) { float error1 = fabs(x/2048.0-(1.442695040888963387*log(celt_exp2(x)/65536.0))); float error2 = fabs(exp(0.6931471805599453094*x/2048.0)-celt_exp2(x)/65536.0); if (error1>0.0002&&error2>0.00004) { fprintf (stderr, "celt_exp2 failed: x = "WORD", error1 = %f, error2 = %f\n", x,error1,error2); ret = 1; } } } void testexp2log2(void) { celt_word32 x; for (x=8;x<65536;x+=(x>>3)) { float error = fabs(x-0.25*celt_exp2(celt_log2(x)<<3))/16384; if (error>0.004) { fprintf (stderr, "celt_log2/celt_exp2 failed: fabs(x-(celt_log2(celt_exp2(x))))>0.001 (x = %ld, error = %f)\n", (long)x,error); ret = 1; } } } void testilog2(void) { celt_word32 x; for (x=1;x<=268435455;x+=127) { celt_word32 error = abs(celt_ilog2(x)-(int)floor(log2(x))); if (error!=0) { printf("celt_ilog2 failed: celt_ilog2(x)!=floor(log2(x)) (x = %d, error = %d)\n",x,error); ret = 1; } } } #endif int main(void) { testdiv(); testsqrt(); testrsqrt(); testlog2(); testexp2(); testexp2log2(); #ifdef FIXED_POINT testilog2(); #endif return ret; } mumble-1.3.4/3rdparty/celt-0.7.0-src/tests/rotation-test.c0000664000175000017500000000213314010707311022677 0ustar builderbuilder#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "celt_types.h" #include "bands.h" #include #define MAX_SIZE 100 int ret=0; void test_rotation(int N, int K) { int i; double err = 0, ener = 0, snr, snr0; celt_word16 x0[MAX_SIZE]; celt_word16 x1[MAX_SIZE]; int nb_rotations = (N+4*K)/(8*K); for (i=0;i 20) ret = 1; } int main(void) { test_rotation(15, 3); test_rotation(23, 5); test_rotation(50, 3); test_rotation(80, 1); return ret; } mumble-1.3.4/3rdparty/celt-0.7.0-src/tests/tandem-test.c0000664000175000017500000001461114010707311022314 0ustar builderbuilder/* (C) 2009 Gregory Maxwell This test runs pink noise through the encoder and decoder many times while feeding the output back into the input. It checks that after a number of cycles the energy has not increased or decreased by too large an amount. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "celt.h" #include "arch.h" #include #include #include #include #include #include #include int async_tandem(int rate, int frame_size, int channels, int bitrate_min, int bitrate_max) { unsigned char data[250]; CELTMode *mode = NULL; CELTEncoder *enc; short carry[2]; short pcm[512 * 2]; CELTDecoder *dec; int bmin, bmax; float ms; int ret, i, j, bytes_per_frame; int increment = 1; bmin = floor((bitrate_min / (rate / (float) frame_size)) / 8.0); bmax = ceil((bitrate_max / (rate / (float) frame_size)) / 8.0); if (bmin < 12) bmin = 12; if (bmax > 250) bmax = 250; if (bmin >= bmax) bmax = bmin + 8; /*increment += (bmax - bmin) / 64; */ printf ("Testing asynchronous tandeming (%dHz, %dch, %d samples, %d - %d bytes).\n", rate, channels, frame_size, bmin, bmax); mode = celt_mode_create(rate, frame_size, NULL); if (mode == NULL) { fprintf(stderr, "Error: failed to create a mode\n"); exit(1); } dec = celt_decoder_create(mode, channels, NULL); enc = celt_encoder_create(mode, channels, NULL); for (j = 0; j < frame_size * channels; j++) pcm[j] = 0; for (bytes_per_frame = bmin; bytes_per_frame <= bmax; bytes_per_frame += increment) { /*Prime the encoder and decoder */ for (i = 0; i < (1024 + (frame_size >> 1)) / frame_size + 2; i++) { for (j = 0; j < channels; j++) pcm[j] = pcm[frame_size * channels - (channels - j + 1)]; for (j = channels; j < frame_size * channels - 1; j++) pcm[j] = ((rand() % 4096) - 2048) + .9 * pcm[j - channels]; ret = celt_encode(enc, pcm, NULL, data, bytes_per_frame); if (ret != bytes_per_frame) { fprintf(stderr, "Error: during init celt_encode returned %d\n", ret); exit(1); } ret = celt_decode(dec, data, ret, pcm); if (ret != CELT_OK) { fprintf(stderr, "Error: during init celt_decode returned %d\n", ret); } } for (j = 0; j < channels; j++) pcm[j] = pcm[frame_size * channels - (channels - j)]; for (j = channels; j < frame_size * channels - 1; j++) pcm[j] = ((rand() % 4096) - 2048) + .9 * pcm[j - channels]; for (i = 0; i < 8; i++) { for (j = 0; j < channels; j++) carry[j] = pcm[frame_size * channels - (channels - j)]; memmove(pcm + channels, pcm, sizeof(short) * frame_size * channels); for (j = 0; j < channels; j++) pcm[j] = carry[j]; ret = celt_encode(enc, pcm, NULL, data, bytes_per_frame); if (ret != bytes_per_frame) { fprintf(stderr, "Error: at %d bytes_per_frame celt_encode returned %d\n", bytes_per_frame, ret); exit(1); } ret = celt_decode(dec, data, ret, pcm); if (ret != CELT_OK) { fprintf(stderr, "Error: at %d bytes_per_frame celt_decode returned %d\n", bytes_per_frame, ret); exit(1); } } ms = 0; for (j = 0; j < frame_size * channels; j++) ms += pcm[j] * pcm[j]; ms = sqrt(ms / (frame_size * channels)); if (ms > 7000 || ms < 1000) { fprintf(stderr, "Error: Signal out of expected range. %d %d %d %d %f\n", rate, channels, frame_size, bytes_per_frame, ms); exit(1); } } celt_encoder_destroy(enc); celt_decoder_destroy(dec); celt_mode_destroy(mode); return 0; } int main(int argc, char *argv[]) { unsigned int seed; int ch, n; if (argc > 2) { fprintf(stderr, "Usage: %s []\n", argv[0]); return 1; } if (argc > 1) seed = atoi(argv[1]); else seed = (time(NULL) ^ ((getpid() % 65536) << 16)); srand(seed); printf("CELT codec tests. Random seed: %u (%.4X)\n", seed, rand() % 65536); for (n = 6; n < 10; n++) { for (ch = 1; ch <= 2; ch++) { async_tandem(44100, 1 << n, ch, 47000 * ch, 77000 * ch); async_tandem(48000, 1 << n, ch, 47000 * ch, 77000 * ch); async_tandem(32000, 1 << n, ch, 31000 * ch, 65000 * ch); } } for (ch = 1; ch <= 2; ch++) async_tandem(32000, 320, ch, 31000 * ch, 65000 * ch); for (ch = 1; ch <= 2; ch++) async_tandem(48000, 480, ch, 31000 * ch, 77000 * ch); return 0; } mumble-1.3.4/3rdparty/celt-0.7.0-src/tests/cwrs32-test.c0000664000175000017500000001153214010707311022166 0ustar builderbuilder#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #define CELT_C #include "../libcelt/stack_alloc.h" #include "../libcelt/rangeenc.c" #include "../libcelt/rangedec.c" #include "../libcelt/entenc.c" #include "../libcelt/entdec.c" #include "../libcelt/entcode.c" #include "../libcelt/cwrs.c" #define NMAX (14) #define KMAX (32767) static const int kmax[15]={ 32767,32767,32767,32767, 1172, 238, 95, 53, 36, 27, 22, 18, 16, 15, 13 }; int main(int _argc,char **_argv){ int n; ALLOC_STACK; for(n=2;n<=NMAX;n++){ int dk; int k; dk=kmax[n]>7?kmax[n]/7:1; k=1-dk; do{ celt_uint32 uu[KMAX+2U]; celt_uint32 inc; celt_uint32 nc; celt_uint32 i; k=kmax[n]-dk");*/ ii=icwrs(n,k,&v,y,u); if(ii!=i){ fprintf(stderr,"Combination-index mismatch (%lu!=%lu).\n", (long)ii,(long)i); return 1; } if(v!=nc){ fprintf(stderr,"Combination count mismatch (%lu!=%lu).\n", (long)v,(long)nc); return 2; } #ifndef SMALL_FOOTPRINT if(n==2){ cwrsi2(k,i,yy); for(j=0;j<2;j++)if(yy[j]!=y[j]){ fprintf(stderr,"N=2 pulse vector mismatch ({%i,%i}!={%i,%i}).\n", yy[0],yy[1],y[0],y[1]); return 3; } ii=icwrs2(yy,&kk); if(ii!=i){ fprintf(stderr,"N=2 combination-index mismatch (%lu!=%lu).\n", (long)ii,(long)i); return 4; } if(kk!=k){ fprintf(stderr,"N=2 pulse count mismatch (%i,%i).\n",kk,k); return 5; } v=ncwrs2(k); if(v!=nc){ fprintf(stderr,"N=2 combination count mismatch (%lu,%lu).\n", (long)v,(long)nc); return 6; } } else if(n==3){ cwrsi3(k,i,yy); for(j=0;j<3;j++)if(yy[j]!=y[j]){ fprintf(stderr,"N=3 pulse vector mismatch " "({%i,%i,%i}!={%i,%i,%i}).\n",yy[0],yy[1],yy[2],y[0],y[1],y[2]); return 7; } ii=icwrs3(yy,&kk); if(ii!=i){ fprintf(stderr,"N=3 combination-index mismatch (%lu!=%lu).\n", (long)ii,(long)i); return 8; } if(kk!=k){ fprintf(stderr,"N=3 pulse count mismatch (%i!=%i).\n",kk,k); return 9; } v=ncwrs3(k); if(v!=nc){ fprintf(stderr,"N=3 combination count mismatch (%lu!=%lu).\n", (long)v,(long)nc); return 10; } } else if(n==4){ cwrsi4(k,i,yy); for(j=0;j<4;j++)if(yy[j]!=y[j]){ fprintf(stderr,"N=4 pulse vector mismatch " "({%i,%i,%i,%i}!={%i,%i,%i,%i}.\n", yy[0],yy[1],yy[2],yy[3],y[0],y[1],y[2],y[3]); return 11; } ii=icwrs4(yy,&kk); if(ii!=i){ fprintf(stderr,"N=4 combination-index mismatch (%lu!=%lu).\n", (long)ii,(long)i); return 12; } if(kk!=k){ fprintf(stderr,"N=4 pulse count mismatch (%i!=%i).\n",kk,k); return 13; } v=ncwrs4(k); if(v!=nc){ fprintf(stderr,"N=4 combination count mismatch (%lu!=%lu).\n", (long)v,(long)nc); return 14; } } else if(n==5){ cwrsi5(k,i,yy); for(j=0;j<5;j++)if(yy[j]!=y[j]){ fprintf(stderr,"N=5 pulse vector mismatch " "({%i,%i,%i,%i,%i}!={%i,%i,%i,%i,%i}).\n", yy[0],yy[1],yy[2],yy[3],yy[4],y[0],y[1],y[2],y[3],y[4]); return 15; } ii=icwrs5(yy,&kk); if(ii!=i){ fprintf(stderr,"N=5 combination-index mismatch (%lu!=%lu).\n", (long)ii,(long)i); return 16; } if(kk!=k){ fprintf(stderr,"N=5 pulse count mismatch (%i!=%i).\n",kk,k); return 17; } v=ncwrs5(k); if(v!=nc){ fprintf(stderr,"N=5 combination count mismatch (%lu!=%lu).\n", (long)v,(long)nc); return 18; } } #endif /* SMALL_FOOTPRINT */ /*printf(" %6u\n",i);*/ } /*printf("\n");*/ } while(k #include "kiss_fft.h" #define CELT_C #include "../libcelt/stack_alloc.h" #include "../libcelt/kiss_fft.c" #include "../libcelt/entcode.c" #ifndef M_PI #define M_PI 3.141592653 #endif #ifdef FIXED_DEBUG long long celt_mips=0; #endif int ret = 0; void check(kiss_fft_cpx * in,kiss_fft_cpx * out,int nfft,int isinverse) { int bin,k; double errpow=0,sigpow=0, snr; for (bin=0;bin1) { int k; for (k=1;k #include #define CELT_C #include "../libcelt/stack_alloc.h" #include "../libcelt/kiss_fft.c" #include "../libcelt/kiss_fftr.c" #ifdef FIXED_DEBUG long long celt_mips=0; #endif int ret=0; static kiss_fft_scalar rand_scalar(void) { return (rand()%32767)-16384; } static double snr_compare( kiss_fft_cpx * vec1,kiss_fft_scalar * vec2, int n) { int k; double sigpow=1e-10, noisepow=1e-10, err,snr; vec1[0].i = vec1[n].r; for (k=0;k #include "mdct.h" #define CELT_C #include "../libcelt/stack_alloc.h" #include "../libcelt/kiss_fft.c" #include "../libcelt/mdct.c" #ifndef M_PI #define M_PI 3.141592653 #endif #ifdef FIXED_DEBUG long long celt_mips=0; #endif int ret = 0; void check(kiss_fft_scalar * in,kiss_fft_scalar * out,int nfft,int isinverse) { int bin,k; double errpow=0,sigpow=0; double snr; for (bin=0;bin1) { int k; for (k=1;k #include #include #include #include "entcode.h" #include "entenc.h" #include "entdec.h" #include #include "../libcelt/rangeenc.c" #include "../libcelt/rangedec.c" #include "../libcelt/entenc.c" #include "../libcelt/entdec.c" #include "../libcelt/entcode.c" #ifndef M_LOG2E # define M_LOG2E 1.4426950408889634074 #endif #define DATA_SIZE 10000000 #define DATA_SIZE2 10000 int main(int _argc,char **_argv){ ec_byte_buffer buf; ec_enc enc; ec_dec dec; long nbits; long nbits2; double entropy; int ft; int ftb; int sym; int sz; int i; int ret; unsigned int seed; ret=0; entropy=0; unsigned char *ptr; if (_argc > 2) { fprintf(stderr, "Usage: %s []\n", _argv[0]); return 1; } if (_argc > 1) seed = atoi(_argv[1]); else seed = time(NULL); /*Testing encoding of raw bit values.*/ ptr = malloc(DATA_SIZE); ec_byte_writeinit_buffer(&buf, ptr, DATA_SIZE); ec_enc_init(&enc,&buf); for(ft=2;ft<1024;ft++){ for(i=0;i>(rand()%11))+1)+10; sz=rand()/((RAND_MAX>>(rand()%9))+1); data=(unsigned *)malloc(sz*sizeof(*data)); ec_byte_writeinit_buffer(&buf, ptr, DATA_SIZE2); ec_enc_init(&enc,&buf); zeros = rand()%13==0; for(j=0;j dnl dnl Permission to use, copy, modify, distribute, and sell this file for any dnl purpose is hereby granted without fee, provided that the above copyright dnl and this permission notice appear in all copies. No representations are dnl made about the suitability of this software for any purpose. It is dnl provided "as is" without express or implied warranty. dnl AC_DEFUN([AC_C99_FUNC_LRINTF], [AC_CACHE_CHECK(for lrintf, ac_cv_c99_lrintf, [AC_TRY_COMPILE([ #define _ISOC9X_SOURCE 1 #define _ISOC99_SOURCE 1 #define __USE_ISOC99 1 #define __USE_ISOC9X 1 #include ], [ int value = lrintf (0.432) ; ], ac_cv_c99_lrintf=yes, ac_cv_c99_lrintf=no)]) if test $ac_cv_c99_lrintf = yes; then AC_DEFINE(HAVE_LRINTF, 1, [Define if you have C99's lrintf function.]) fi ])# AC_C99_LRINTF AC_DEFUN([AC_C99_FUNC_LRINT], [AC_CACHE_CHECK(for lrint, ac_cv_c99_lrint, [AC_TRY_COMPILE([ #define _ISOC9X_SOURCE 1 #define _ISOC99_SOURCE 1 #define __USE_ISOC99 1 #define __USE_ISOC9X 1 #include ], [ int value = lrint (0.432) ; ], ac_cv_c99_lrint=yes, ac_cv_c99_lrint=no)]) if test $ac_cv_c99_lrint = yes; then AC_DEFINE(HAVE_LRINT, 1, [Define if you have C99's lrint function.]) fi ])# AC_C99_LRINT mumble-1.3.4/3rdparty/celt-0.7.0-src/celt.pc.in0000664000175000017500000000045514010707311020442 0ustar builderbuilder# libcelt pkg-config source file prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: celt Description: CELT is a low-delay audio codec Version: @CELT_VERSION@ Requires: Conflicts: Libs: -L${libdir} -lcelt@LIBCELT_SUFFIX@ Libs.private: -lm Cflags: -I${includedir} mumble-1.3.4/3rdparty/celt-0.7.0-src/Makefile.am0000664000175000017500000000075414010707311020620 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # To disable automatic dependency tracking if using other tools than # gcc and gmake, add the option 'no-dependencies' AUTOMAKE_OPTIONS = 1.6 #Fools KDevelop into including all files SUBDIRS = libcelt tests @tools@ DIST_SUBDIRS = libcelt tests tools pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = celt.pc EXTRA_DIST = celt.pc.in Doxyfile Doxyfile.devel rpm: dist rpmbuild -ta ${PACKAGE}-${VERSION}.tar.gz mumble-1.3.4/3rdparty/celt-0.7.0-src/tools/0000775000175000017500000000000014010707311017716 5ustar builderbuildermumble-1.3.4/3rdparty/celt-0.7.0-src/tools/wave_out.c0000664000175000017500000001540114010707311021714 0ustar builderbuilder/* Copyright (c) 2002, John Edwards Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif /* Set TABS = 4 */ /******************************************************************** function: To provide playback of 16 bit PCM wave data in Win32 environments from decoded compressed files. ********************************************************************/ #if defined WIN32 || defined _WIN32 #include #include #include "wave_out.h" #define MAXWAVESIZE 4294967040LU #define MAX_WAVEBLOCKS 32 // This is modified for USE_WIN_AUDIO - ONLY 2002-02-27 static CRITICAL_SECTION cs; static HWAVEOUT dev = NULL; static int ScheduledBlocks = 0; static int PlayedWaveHeadersCount = 0; // free index static WAVEHDR* PlayedWaveHeaders [MAX_WAVEBLOCKS]; static int Box ( const char* msg ) { MessageBox ( NULL, msg, " "VERSION_STRING": Error Message . . .", MB_OK | MB_ICONEXCLAMATION ); return -1; } /* * This function registers already played WAVE chunks. Freeing is done by free_memory(), */ static void CALLBACK wave_callback ( HWAVE hWave, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2 ) { if ( uMsg == WOM_DONE ) { EnterCriticalSection ( &cs ); PlayedWaveHeaders [PlayedWaveHeadersCount++] = (WAVEHDR*) dwParam1; LeaveCriticalSection ( &cs ); } } static void free_memory ( void ) { WAVEHDR* wh; HGLOBAL hg; EnterCriticalSection ( &cs ); wh = PlayedWaveHeaders [--PlayedWaveHeadersCount]; ScheduledBlocks--; // decrease the number of USED blocks LeaveCriticalSection ( &cs ); waveOutUnprepareHeader ( dev, wh, sizeof (WAVEHDR) ); hg = GlobalHandle ( wh -> lpData ); // Deallocate the buffer memory GlobalUnlock (hg); GlobalFree (hg); hg = GlobalHandle ( wh ); // Deallocate the header memory GlobalUnlock (hg); GlobalFree (hg); } Int Set_WIN_Params ( FILE_T dummyFile , Ldouble SampleFreq, Uint BitsPerSample, Uint Channels ) { WAVEFORMATEX outFormat; UINT deviceID = WAVE_MAPPER; (void) dummyFile; if ( waveOutGetNumDevs () == 0 ) return Box ( "No audio device present." ); outFormat.wFormatTag = WAVE_FORMAT_PCM; outFormat.wBitsPerSample = BitsPerSample; outFormat.nChannels = Channels; outFormat.nSamplesPerSec = (unsigned long)(SampleFreq + 0.5); outFormat.nBlockAlign = (outFormat.wBitsPerSample + 7) / 8 * outFormat.nChannels; outFormat.nAvgBytesPerSec = outFormat.nSamplesPerSec * outFormat.nBlockAlign; switch ( waveOutOpen ( &dev, deviceID, &outFormat, (DWORD)wave_callback, 0, CALLBACK_FUNCTION ) ) { case MMSYSERR_ALLOCATED: return Box ( "Device is already open." ); case MMSYSERR_BADDEVICEID: return Box ( "The specified device is out of range." ); case MMSYSERR_NODRIVER: return Box ( "There is no audio driver in this system." ); case MMSYSERR_NOMEM: return Box ( "Unable to allocate sound memory." ); case WAVERR_BADFORMAT: return Box ( "This audio format is not supported." ); case WAVERR_SYNC: return Box ( "The device is synchronous." ); default: return Box ( "Unknown media error." ); case MMSYSERR_NOERROR: break; } waveOutReset ( dev ); InitializeCriticalSection ( &cs ); SetPriorityClass ( GetCurrentProcess (), HIGH_PRIORITY_CLASS ); return 0; } int WIN_Play_Samples ( const void* data, size_t len ) { HGLOBAL hg; HGLOBAL hg2; LPWAVEHDR wh; void* allocptr; do { while ( PlayedWaveHeadersCount > 0 ) // free used blocks ... free_memory (); if ( ScheduledBlocks < sizeof(PlayedWaveHeaders)/sizeof(*PlayedWaveHeaders) ) // wait for a free block ... break; Sleep (26); } while (1); if ( (hg2 = GlobalAlloc ( GMEM_MOVEABLE, len )) == NULL ) // allocate some memory for a copy of the buffer return Box ( "GlobalAlloc failed." ); allocptr = GlobalLock (hg2); CopyMemory ( allocptr, data, len ); // Here we can call any modification output functions we want.... if ( (hg = GlobalAlloc (GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof (WAVEHDR))) == NULL ) // now make a header and WRITE IT! return -1; wh = GlobalLock (hg); wh -> dwBufferLength = len; wh -> lpData = allocptr; if ( waveOutPrepareHeader ( dev, wh, sizeof (WAVEHDR)) != MMSYSERR_NOERROR ) { GlobalUnlock (hg); GlobalFree (hg); return -1; } if ( waveOutWrite ( dev, wh, sizeof (WAVEHDR)) != MMSYSERR_NOERROR ) { GlobalUnlock (hg); GlobalFree (hg); return -1; } EnterCriticalSection ( &cs ); ScheduledBlocks++; LeaveCriticalSection ( &cs ); return len; } int WIN_Audio_close ( void ) { if ( dev != NULL ) { while ( ScheduledBlocks > 0 ) { Sleep (ScheduledBlocks); while ( PlayedWaveHeadersCount > 0 ) // free used blocks ... free_memory (); } waveOutReset (dev); // reset the device waveOutClose (dev); // close the device dev = NULL; } DeleteCriticalSection ( &cs ); ScheduledBlocks = 0; return 0; } #endif /* end of wave_out.c */ mumble-1.3.4/3rdparty/celt-0.7.0-src/tools/wave_out.h0000664000175000017500000000555314010707311021730 0ustar builderbuilder/* Copyright (c) 2002, John Edwards Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ // WAVE_OUT.H - Necessary stuff for WIN_AUDIO #ifndef WAVE_OUT_H #define WAVE_OUT_H #include #include #ifdef __MINGW32__ #include #endif #define VERSION_STRING "\n 0.7.0\n" #define Cdecl __cdecl #define __attribute__(x) #define sleep(__sec) Sleep ((__sec) * 1000) #define inline __inline #define restrict //// constants ///////////////////////////////////////////////////// #define CD_SAMPLE_FREQ 44.1e3 #define SAMPLE_SIZE 16 #define SAMPLE_SIZE_STRING "" #define WINAUDIO_FD ((FILE_T)-128) #define FILE_T FILE* #define INVALID_FILEDESC NULL //// Simple types ////////////////////////////////////////////////// typedef signed int Int; // at least -32767...+32767, fast type typedef unsigned int Uint; // at least 0...65535, fast type typedef long double Ldouble; // most exact floating point format //// procedures/functions ////////////////////////////////////////// // wave_out.c Int Set_WIN_Params ( FILE_T dummyFile , Ldouble SampleFreq, Uint BitsPerSample, Uint Channels); int WIN_Play_Samples ( const void* buff, size_t len ); int WIN_Audio_close ( void ); #endif /* WAVE_OUT_H */ mumble-1.3.4/3rdparty/celt-0.7.0-src/tools/getopt1.c0000664000175000017500000001120514010707311021444 0ustar builderbuilder/* getopt_long and getopt_long_only entry points for GNU getopt. Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with the GNU C Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "getopt_win.h" #if !defined __STDC__ || !__STDC__ /* This is a separate conditional since some stdc systems reject `defined (const)'. */ #ifndef const #define const #endif #endif #include /* Comment out all this code if we are using the GNU C Library, and are not actually compiling the library itself. This code is part of the GNU C Library, but also included in many other GNU distributions. Compiling and linking in this code is a waste when using the GNU C library (especially if it is a shared library). Rather than having every GNU program understand `configure --with-gnu-libc' and omit the object files, it is simpler to just do this in the source for each such file. */ #define GETOPT_INTERFACE_VERSION 2 #if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 #include #if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION #define ELIDE_CODE #endif #endif #ifndef ELIDE_CODE /* This needs to come after some library #include to get __GNU_LIBRARY__ defined. */ #ifdef __GNU_LIBRARY__ #include #endif #ifndef NULL #define NULL 0 #endif int getopt_long (argc, argv, options, long_options, opt_index) int argc; char *const *argv; const char *options; const struct option *long_options; int *opt_index; { return _getopt_internal (argc, argv, options, long_options, opt_index, 0); } /* Like getopt_long, but '-' as well as '--' can indicate a long option. If an option that starts with '-' (not '--') doesn't match a long option, but does match a short option, it is parsed as a short option instead. */ int getopt_long_only (argc, argv, options, long_options, opt_index) int argc; char *const *argv; const char *options; const struct option *long_options; int *opt_index; { return _getopt_internal (argc, argv, options, long_options, opt_index, 1); } #endif /* Not ELIDE_CODE. */ #ifdef TEST #include int main (argc, argv) int argc; char **argv; { int c; int digit_optind = 0; while (1) { int this_option_optind = optind ? optind : 1; int option_index = 0; static struct option long_options[] = { {"add", 1, 0, 0}, {"append", 0, 0, 0}, {"delete", 1, 0, 0}, {"verbose", 0, 0, 0}, {"create", 0, 0, 0}, {"file", 1, 0, 0}, {0, 0, 0, 0} }; c = getopt_long (argc, argv, "abc:d:0123456789", long_options, &option_index); if (c == -1) break; switch (c) { case 0: printf ("option %s", long_options[option_index].name); if (optarg) printf (" with arg %s", optarg); printf ("\n"); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (digit_optind != 0 && digit_optind != this_option_optind) printf ("digits occur in two different argv-elements.\n"); digit_optind = this_option_optind; printf ("option %c\n", c); break; case 'a': printf ("option a\n"); break; case 'b': printf ("option b\n"); break; case 'c': printf ("option c with value `%s'\n", optarg); break; case 'd': printf ("option d with value `%s'\n", optarg); break; case '?': break; default: printf ("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); printf ("\n"); } exit (0); } #endif /* TEST */ mumble-1.3.4/3rdparty/celt-0.7.0-src/tools/skeleton.c0000664000175000017500000001421214010707311021706 0ustar builderbuilder/* * skeleton.c * author: Tahseen Mohammad */ /* This file depends on WORDS_BIGENDIAN being defined to 1 if the host * processor stores words with the most significant byte first (like Motorola * and SPARC, unlike Intel and VAX). * On little endian systems, WORDS_BIGENDIAN should be undefined. * * When using GNU Autotools, the correct value will be written into config.h * if the autoconf macro AC_C_BIGENDIAN is called in configure.ac. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include "skeleton.h" #ifdef WIN32 #define snprintf _snprintf #endif static unsigned short _le_16 (unsigned short s) { unsigned short ret=s; #ifdef WORDS_BIGENDIAN ret = (s>>8) & 0x00ffU; ret += (s<<8) & 0xff00U; #endif return ret; } static ogg_uint32_t _le_32 (ogg_uint32_t i) { ogg_uint32_t ret=i; #ifdef WORDS_BIGENDIAN ret = (i>>24); ret += (i>>8) & 0x0000ff00; ret += (i<<8) & 0x00ff0000; ret += (i<<24); #endif return ret; } static ogg_int64_t _le_64 (ogg_int64_t l) { ogg_int64_t ret=l; unsigned char *ucptr = (unsigned char *)&ret; #ifdef WORDS_BIGENDIAN unsigned char temp; temp = ucptr [0] ; ucptr [0] = ucptr [7] ; ucptr [7] = temp ; temp = ucptr [1] ; ucptr [1] = ucptr [6] ; ucptr [6] = temp ; temp = ucptr [2] ; ucptr [2] = ucptr [5] ; ucptr [5] = temp ; temp = ucptr [3] ; ucptr [3] = ucptr [4] ; ucptr [4] = temp ; #endif return (*(ogg_int64_t *)ucptr); } /* write an ogg_page to a file pointer */ int write_ogg_page_to_file(ogg_page *og, FILE *out) { int written; written = fwrite(og->header,1, og->header_len, out); written += fwrite(og->body,1, og->body_len, out); return written; } int add_message_header_field(fisbone_packet *fp, char *header_key, char *header_value) { /* size of both key and value + ': ' + CRLF */ int this_message_size = strlen(header_key) + strlen(header_value) + 4; if (fp->message_header_fields == NULL) { fp->message_header_fields = _ogg_calloc(this_message_size+1, sizeof(char)); } else { int new_size = (fp->current_header_size + this_message_size+1) * sizeof(char); fp->message_header_fields = _ogg_realloc(fp->message_header_fields, new_size); } snprintf(fp->message_header_fields + fp->current_header_size, this_message_size+1, "%s: %s\r\n", header_key, header_value); fp->current_header_size += this_message_size; return 0; } /* create a ogg_packet from a fishead_packet structure */ ogg_packet ogg_from_fishead(fishead_packet *fp) { ogg_packet op; memset(&op, 0, sizeof(op)); op.packet = _ogg_calloc(FISHEAD_SIZE, sizeof(unsigned char)); memset(op.packet, 0, FISHEAD_SIZE); memcpy (op.packet, FISHEAD_IDENTIFIER, 8); /* identifier */ *((ogg_uint16_t*)(op.packet+8)) = _le_16 (SKELETON_VERSION_MAJOR); /* version major */ *((ogg_uint16_t*)(op.packet+10)) = _le_16 (SKELETON_VERSION_MINOR); /* version minor */ *((ogg_int64_t*)(op.packet+12)) = _le_64 (fp->ptime_n); /* presentationtime numerator */ *((ogg_int64_t*)(op.packet+20)) = _le_64 (fp->ptime_d); /* presentationtime denominator */ *((ogg_int64_t*)(op.packet+28)) = _le_64 (fp->btime_n); /* basetime numerator */ *((ogg_int64_t*)(op.packet+36)) = _le_64 (fp->btime_d); /* basetime denominator */ /* TODO: UTC time, set to zero for now */ op.b_o_s = 1; /* its the first packet of the stream */ op.e_o_s = 0; /* its not the last packet of the stream */ op.bytes = FISHEAD_SIZE; /* length of the packet in bytes */ return op; } /* create a ogg_packet from a fisbone_packet structure. * call this method after the fisbone_packet is filled and all message header fields are added * by calling add_message_header_field method. */ ogg_packet ogg_from_fisbone(fisbone_packet *fp) { ogg_packet op; int packet_size = FISBONE_SIZE + fp->current_header_size; memset (&op, 0, sizeof (op)); op.packet = _ogg_calloc (packet_size, sizeof(unsigned char)); memset (op.packet, 0, packet_size); memcpy (op.packet, FISBONE_IDENTIFIER, 8); /* identifier */ *((ogg_uint32_t*)(op.packet+8)) = _le_32 (FISBONE_MESSAGE_HEADER_OFFSET); /* offset of the message header fields */ *((ogg_uint32_t*)(op.packet+12)) = _le_32 (fp->serial_no); /* serialno of the respective stream */ *((ogg_uint32_t*)(op.packet+16)) = _le_32 (fp->nr_header_packet); /* number of header packets */ *((ogg_int64_t*)(op.packet+20)) = _le_64 (fp->granule_rate_n); /* granulrate numerator */ *((ogg_int64_t*)(op.packet+28)) = _le_64 (fp->granule_rate_d); /* granulrate denominator */ *((ogg_int64_t*)(op.packet+36)) = _le_64 (fp->start_granule); /* start granule */ *((ogg_uint32_t*)(op.packet+44)) = _le_32 (fp->preroll); /* preroll, for theora its 0 */ *(op.packet+48) = fp->granule_shift; /* granule shift */ memcpy((op.packet+FISBONE_SIZE), fp->message_header_fields, fp->current_header_size); op.b_o_s = 0; op.e_o_s = 0; op.bytes = packet_size; /* size of the packet in bytes */ return op; } int add_fishead_to_stream(ogg_stream_state *os, fishead_packet *fp) { ogg_packet op; op = ogg_from_fishead(fp); ogg_stream_packetin(os, &op); _ogg_free(op.packet); return 0; } int add_fisbone_to_stream(ogg_stream_state *os, fisbone_packet *fp) { ogg_packet op; op = ogg_from_fisbone(fp); ogg_stream_packetin(os, &op); _ogg_free(op.packet); return 0; } int add_eos_packet_to_stream(ogg_stream_state *os) { ogg_packet op; memset (&op, 0, sizeof(op)); op.e_o_s = 1; ogg_stream_packetin(os, &op); return 0; } int flush_ogg_stream_to_file(ogg_stream_state *os, FILE *out) { ogg_page og; int result; while((result = ogg_stream_flush(os, &og))) { if(!result) break; result = write_ogg_page_to_file(&og, out); if(result != og.header_len + og.body_len) return 1; } return 0; } mumble-1.3.4/3rdparty/celt-0.7.0-src/tools/skeleton.h0000664000175000017500000000571614010707311021724 0ustar builderbuilder/* * skeleton.h * author: Tahseen Mohammad */ #ifndef _SKELETON_H #define _SKELETON_H #ifdef __cplusplus extern "C" { #endif #ifdef WIN32 #define snprintf _snprintf #endif #include #define SKELETON_VERSION_MAJOR 3 #define SKELETON_VERSION_MINOR 0 #define FISHEAD_IDENTIFIER "fishead\0" #define FISBONE_IDENTIFIER "fisbone\0" #define FISHEAD_SIZE 64 #define FISBONE_SIZE 52 #define FISBONE_MESSAGE_HEADER_OFFSET 44 /* fishead_packet holds a fishead header packet. */ typedef struct { ogg_uint16_t version_major; /* skeleton version major */ ogg_uint16_t version_minor; /* skeleton version minor */ /* Start time of the presentation * For a new stream presentationtime & basetime is same. */ ogg_int64_t ptime_n; /* presentation time numerator */ ogg_int64_t ptime_d; /* presentation time denominator */ ogg_int64_t btime_n; /* basetime numerator */ ogg_int64_t btime_d; /* basetime denominator */ /* will holds the time of origin of the stream, a 20 bit field. */ unsigned char UTC[20]; } fishead_packet; /* fisbone_packet holds a fisbone header packet. */ typedef struct { ogg_uint32_t serial_no; /* serial no of the corresponding stream */ ogg_uint32_t nr_header_packet; /* number of header packets */ /* granule rate is the temporal resolution of the logical bitstream */ ogg_int64_t granule_rate_n; /* granule rate numerator */ ogg_int64_t granule_rate_d; /* granule rate denominator */ ogg_int64_t start_granule; /* start granule value */ ogg_uint32_t preroll; /* preroll */ unsigned char granule_shift; /* 1 byte value holding the granule shift */ char *message_header_fields; /* holds all the message header fields */ /* current total size of the message header fields, for realloc purpose, initially zero */ ogg_uint32_t current_header_size; } fisbone_packet; extern int write_ogg_page_to_file(ogg_page *og, FILE *out); extern int add_message_header_field(fisbone_packet *fp, char *header_key, char *header_value); /* remember to deallocate the returned ogg_packet properly */ extern ogg_packet ogg_from_fishead(fishead_packet *fp); extern ogg_packet ogg_from_fisbone(fisbone_packet *fp); extern fishead_packet fishead_from_ogg(ogg_packet *op); extern fisbone_packet fisbone_from_ogg(ogg_packet *op); extern int add_fishead_to_stream(ogg_stream_state *os, fishead_packet *fp); extern int add_fisbone_to_stream(ogg_stream_state *os, fisbone_packet *fp); extern int add_eos_packet_to_stream(ogg_stream_state *os); extern int flush_ogg_stream_to_file(ogg_stream_state *os, FILE *out); #ifdef __cplusplus } #endif #endif /* _SKELETON_H */ mumble-1.3.4/3rdparty/celt-0.7.0-src/tools/wav_io.h0000664000175000017500000000472714010707311021365 0ustar builderbuilder/* Copyright (C) 2002 Jean-Marc Valin File: wav_io.h Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef WAV_IO_H #define WAV_IO_H #include #include "celt_types.h" #if !defined(__LITTLE_ENDIAN__) && ( defined(WORDS_BIGENDIAN) || defined(__BIG_ENDIAN__) ) #define le_short(s) ((short) ((unsigned short) (s) << 8) | ((unsigned short) (s) >> 8)) #define be_short(s) ((short) (s)) #else #define le_short(s) ((short) (s)) #define be_short(s) ((short) ((unsigned short) (s) << 8) | ((unsigned short) (s) >> 8)) #endif /** Convert little endian */ static inline celt_int32 le_int(celt_int32 i) { #if !defined(__LITTLE_ENDIAN__) && ( defined(WORDS_BIGENDIAN) || defined(__BIG_ENDIAN__) ) celt_uint32 ui, ret; ui = i; ret = ui>>24; ret |= (ui>>8)&0x0000ff00; ret |= (ui<<8)&0x00ff0000; ret |= (ui<<24); return ret; #else return i; #endif } int read_wav_header(FILE *file, int *rate, int *channels, int *format, celt_int32 *size); void write_wav_header(FILE *file, int rate, int channels, int format, int size); #endif mumble-1.3.4/3rdparty/celt-0.7.0-src/tools/getopt.c0000664000175000017500000007451614010707311021401 0ustar builderbuilder/* Getopt for GNU. NOTE: getopt is now part of the C library, so if you don't know what "Keep this file name-space clean" means, talk to drepper@gnu.org before changing it! Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99 Free Software Foundation, Inc. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with the GNU C Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* This tells Alpha OSF/1 not to define a getopt prototype in . Ditto for AIX 3.2 and . */ #ifndef _NO_PROTO # define _NO_PROTO #endif #ifdef HAVE_CONFIG_H # include "config.h" #endif #if !defined __STDC__ || !__STDC__ /* This is a separate conditional since some stdc systems reject `defined (const)'. */ # ifndef const # define const # endif #endif #include /* Comment out all this code if we are using the GNU C Library, and are not actually compiling the library itself. This code is part of the GNU C Library, but also included in many other GNU distributions. Compiling and linking in this code is a waste when using the GNU C library (especially if it is a shared library). Rather than having every GNU program understand `configure --with-gnu-libc' and omit the object files, it is simpler to just do this in the source for each such file. */ #define GETOPT_INTERFACE_VERSION 2 #if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 # include # if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION # define ELIDE_CODE # endif #endif #ifndef ELIDE_CODE /* This needs to come after some library #include to get __GNU_LIBRARY__ defined. */ #ifdef __GNU_LIBRARY__ /* Don't include stdlib.h for non-GNU C libraries because some of them contain conflicting prototypes for getopt. */ # include # include #endif /* GNU C library. */ #ifdef VMS # include # if HAVE_STRING_H - 0 # include # endif #endif #ifndef _ /* This is for other GNU distributions with internationalized messages. When compiling libc, the _ macro is predefined. */ # ifdef HAVE_LIBINTL_H # include # define _(msgid) gettext (msgid) # else # define _(msgid) (msgid) # endif #endif /* This version of `getopt' appears to the caller like standard Unix `getopt' but it behaves differently for the user, since it allows the user to intersperse the options with the other arguments. As `getopt' works, it permutes the elements of ARGV so that, when it is done, all the options precede everything else. Thus all application programs are extended to handle flexible argument order. Setting the environment variable POSIXLY_CORRECT disables permutation. Then the behavior is completely standard. GNU application programs can use a third alternative mode in which they can distinguish the relative order of options and other arguments. */ #include "getopt_win.h" /* For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, the argument value is returned here. Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ char *optarg; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to `getopt'. On entry to `getopt', zero means this is the first call; initialize. When `getopt' returns -1, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, `optind' communicates from one call to the next how much of ARGV has been scanned so far. */ /* 1003.2 says this must be 1 before any call. */ int optind = 1; /* Formerly, initialization of getopt depended on optind==0, which causes problems with re-calling getopt as programs generally don't know that. */ int __getopt_initialized; /* The next char to be scanned in the option-element in which the last option character we returned was found. This allows us to pick up the scan where we left off. If this is zero, or a null string, it means resume the scan by advancing to the next ARGV-element. */ static char *nextchar; /* Callers store zero here to inhibit the error message for unrecognized options. */ int opterr = 1; /* Set to an option character which was unrecognized. This must be initialized on some systems to avoid linking in the system's own getopt implementation. */ int optopt = '?'; /* Describe how to deal with options that follow non-option ARGV-elements. If the caller did not specify anything, the default is REQUIRE_ORDER if the environment variable POSIXLY_CORRECT is defined, PERMUTE otherwise. REQUIRE_ORDER means don't recognize them as options; stop option processing when the first non-option is seen. This is what Unix does. This mode of operation is selected by either setting the environment variable POSIXLY_CORRECT, or using `+' as the first character of the list of option characters. PERMUTE is the default. We permute the contents of ARGV as we scan, so that eventually all the non-options are at the end. This allows options to be given in any order, even with programs that were not written to expect this. RETURN_IN_ORDER is an option available to programs that were written to expect options and other ARGV-elements in any order and that care about the ordering of the two. We describe each non-option ARGV-element as if it were the argument of an option with character code 1. Using `-' as the first character of the list of option characters selects this mode of operation. The special argument `--' forces an end of option-scanning regardless of the value of `ordering'. In the case of RETURN_IN_ORDER, only `--' can cause `getopt' to return -1 with `optind' != ARGC. */ static enum { REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER } ordering; /* Value of POSIXLY_CORRECT environment variable. */ static char *posixly_correct; #ifdef __GNU_LIBRARY__ /* We want to avoid inclusion of string.h with non-GNU libraries because there are many ways it can cause trouble. On some systems, it contains special magic macros that don't work in GCC. */ # include # define my_index strchr #else #include /* Avoid depending on library functions or files whose names are inconsistent. */ #ifndef getenv extern char *getenv (); #endif static char * my_index (str, chr) const char *str; int chr; { while (*str) { if (*str == chr) return (char *) str; str++; } return 0; } /* If using GCC, we can safely declare strlen this way. If not using GCC, it is ok not to declare it. */ #ifdef __GNUC__ /* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h. That was relevant to code that was here before. */ # if (!defined __STDC__ || !__STDC__) && !defined strlen /* gcc with -traditional declares the built-in strlen to return int, and has done so at least since version 2.4.5. -- rms. */ extern int strlen (const char *); # endif /* not __STDC__ */ #endif /* __GNUC__ */ #endif /* not __GNU_LIBRARY__ */ /* Handle permutation of arguments. */ /* Describe the part of ARGV that contains non-options that have been skipped. `first_nonopt' is the index in ARGV of the first of them; `last_nonopt' is the index after the last of them. */ static int first_nonopt; static int last_nonopt; #ifdef _LIBC /* Bash 2.0 gives us an environment variable containing flags indicating ARGV elements that should not be considered arguments. */ /* Defined in getopt_init.c */ extern char *__getopt_nonoption_flags; static int nonoption_flags_max_len; static int nonoption_flags_len; static int original_argc; static char *const *original_argv; /* Make sure the environment variable bash 2.0 puts in the environment is valid for the getopt call we must make sure that the ARGV passed to getopt is that one passed to the process. */ static void __attribute__ ((unused)) store_args_and_env (int argc, char *const *argv) { /* XXX This is no good solution. We should rather copy the args so that we can compare them later. But we must not use malloc(3). */ original_argc = argc; original_argv = argv; } # ifdef text_set_element text_set_element (__libc_subinit, store_args_and_env); # endif /* text_set_element */ # define SWAP_FLAGS(ch1, ch2) \ if (nonoption_flags_len > 0) \ { \ char __tmp = __getopt_nonoption_flags[ch1]; \ __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ __getopt_nonoption_flags[ch2] = __tmp; \ } #else /* !_LIBC */ # define SWAP_FLAGS(ch1, ch2) #endif /* _LIBC */ /* Exchange two adjacent subsequences of ARGV. One subsequence is elements [first_nonopt,last_nonopt) which contains all the non-options that have been skipped so far. The other is elements [last_nonopt,optind), which contains all the options processed since those non-options were skipped. `first_nonopt' and `last_nonopt' are relocated so that they describe the new indices of the non-options in ARGV after they are moved. */ #if defined __STDC__ && __STDC__ static void exchange (char **); #endif static void exchange (argv) char **argv; { int bottom = first_nonopt; int middle = last_nonopt; int top = optind; char *tem; /* Exchange the shorter segment with the far end of the longer segment. That puts the shorter segment into the right place. It leaves the longer segment in the right place overall, but it consists of two parts that need to be swapped next. */ #ifdef _LIBC /* First make sure the handling of the `__getopt_nonoption_flags' string can work normally. Our top argument must be in the range of the string. */ if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len) { /* We must extend the array. The user plays games with us and presents new arguments. */ char *new_str = malloc (top + 1); if (new_str == NULL) nonoption_flags_len = nonoption_flags_max_len = 0; else { memset (__mempcpy (new_str, __getopt_nonoption_flags, nonoption_flags_max_len), '\0', top + 1 - nonoption_flags_max_len); nonoption_flags_max_len = top + 1; __getopt_nonoption_flags = new_str; } } #endif while (top > middle && middle > bottom) { if (top - middle > middle - bottom) { /* Bottom segment is the short one. */ int len = middle - bottom; register int i; /* Swap it with the top part of the top segment. */ for (i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[top - (middle - bottom) + i]; argv[top - (middle - bottom) + i] = tem; SWAP_FLAGS (bottom + i, top - (middle - bottom) + i); } /* Exclude the moved bottom segment from further swapping. */ top -= len; } else { /* Top segment is the short one. */ int len = top - middle; register int i; /* Swap it with the bottom part of the bottom segment. */ for (i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[middle + i]; argv[middle + i] = tem; SWAP_FLAGS (bottom + i, middle + i); } /* Exclude the moved top segment from further swapping. */ bottom += len; } } /* Update records for the slots the non-options now occupy. */ first_nonopt += (optind - last_nonopt); last_nonopt = optind; } /* Initialize the internal data when the first call is made. */ #if defined __STDC__ && __STDC__ static const char *_getopt_initialize (int, char *const *, const char *); #endif static const char * _getopt_initialize (argc, argv, optstring) int argc; char *const *argv; const char *optstring; { /* Start processing options with ARGV-element 1 (since ARGV-element 0 is the program name); the sequence of previously skipped non-option ARGV-elements is empty. */ first_nonopt = last_nonopt = optind; nextchar = NULL; posixly_correct = getenv ("POSIXLY_CORRECT"); /* Determine how to handle the ordering of options and nonoptions. */ if (optstring[0] == '-') { ordering = RETURN_IN_ORDER; ++optstring; } else if (optstring[0] == '+') { ordering = REQUIRE_ORDER; ++optstring; } else if (posixly_correct != NULL) ordering = REQUIRE_ORDER; else ordering = PERMUTE; #ifdef _LIBC if (posixly_correct == NULL && argc == original_argc && argv == original_argv) { if (nonoption_flags_max_len == 0) { if (__getopt_nonoption_flags == NULL || __getopt_nonoption_flags[0] == '\0') nonoption_flags_max_len = -1; else { const char *orig_str = __getopt_nonoption_flags; int len = nonoption_flags_max_len = strlen (orig_str); if (nonoption_flags_max_len < argc) nonoption_flags_max_len = argc; __getopt_nonoption_flags = (char *) malloc (nonoption_flags_max_len); if (__getopt_nonoption_flags == NULL) nonoption_flags_max_len = -1; else memset (__mempcpy (__getopt_nonoption_flags, orig_str, len), '\0', nonoption_flags_max_len - len); } } nonoption_flags_len = nonoption_flags_max_len; } else nonoption_flags_len = 0; #endif return optstring; } /* Scan elements of ARGV (whose length is ARGC) for option characters given in OPTSTRING. If an element of ARGV starts with '-', and is not exactly "-" or "--", then it is an option element. The characters of this element (aside from the initial '-') are option characters. If `getopt' is called repeatedly, it returns successively each of the option characters from each of the option elements. If `getopt' finds another option character, it returns that character, updating `optind' and `nextchar' so that the next call to `getopt' can resume the scan with the following option character or ARGV-element. If there are no more option characters, `getopt' returns -1. Then `optind' is the index in ARGV of the first ARGV-element that is not an option. (The ARGV-elements have been permuted so that those that are not options now come last.) OPTSTRING is a string containing the legitimate option characters. If an option character is seen that is not listed in OPTSTRING, return '?' after printing an error message. If you set `opterr' to zero, the error message is suppressed but we still return '?'. If a char in OPTSTRING is followed by a colon, that means it wants an arg, so the following text in the same ARGV-element, or the text of the following ARGV-element, is returned in `optarg'. Two colons mean an option that wants an optional arg; if there is text in the current ARGV-element, it is returned in `optarg', otherwise `optarg' is set to zero. If OPTSTRING starts with `-' or `+', it requests different methods of handling the non-option ARGV-elements. See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. Long-named options begin with `--' instead of `-'. Their names may be abbreviated as long as the abbreviation is unique or is an exact match for some defined option. If they have an argument, it follows the option name in the same ARGV-element, separated from the option name by a `=', or else the in next ARGV-element. When `getopt' finds a long-named option, it returns 0 if that option's `flag' field is nonzero, the value of the option's `val' field if the `flag' field is zero. The elements of ARGV aren't really const, because we permute them. But we pretend they're const in the prototype to be compatible with other systems. LONGOPTS is a vector of `struct option' terminated by an element containing a name which is zero. LONGIND returns the index in LONGOPT of the long-named option found. It is only valid when a long-named option has been found by the most recent call. If LONG_ONLY is nonzero, '-' as well as '--' can introduce long-named options. */ int _getopt_internal (argc, argv, optstring, longopts, longind, long_only) int argc; char *const *argv; const char *optstring; const struct option *longopts; int *longind; int long_only; { optarg = NULL; if (optind == 0 || !__getopt_initialized) { if (optind == 0) optind = 1; /* Don't scan ARGV[0], the program name. */ optstring = _getopt_initialize (argc, argv, optstring); __getopt_initialized = 1; } /* Test whether ARGV[optind] points to a non-option argument. Either it does not have option syntax, or there is an environment flag from the shell indicating it is not an option. The later information is only used when the used in the GNU libc. */ #ifdef _LIBC # define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \ || (optind < nonoption_flags_len \ && __getopt_nonoption_flags[optind] == '1')) #else # define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0') #endif if (nextchar == NULL || *nextchar == '\0') { /* Advance to the next ARGV-element. */ /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been moved back by the user (who may also have changed the arguments). */ if (last_nonopt > optind) last_nonopt = optind; if (first_nonopt > optind) first_nonopt = optind; if (ordering == PERMUTE) { /* If we have just processed some options following some non-options, exchange them so that the options come first. */ if (first_nonopt != last_nonopt && last_nonopt != optind) exchange ((char **) argv); else if (last_nonopt != optind) first_nonopt = optind; /* Skip any additional non-options and extend the range of non-options previously skipped. */ while (optind < argc && NONOPTION_P) optind++; last_nonopt = optind; } /* The special ARGV-element `--' means premature end of options. Skip it like a null option, then exchange with previous non-options as if it were an option, then skip everything else like a non-option. */ if (optind != argc && !strcmp (argv[optind], "--")) { optind++; if (first_nonopt != last_nonopt && last_nonopt != optind) exchange ((char **) argv); else if (first_nonopt == last_nonopt) first_nonopt = optind; last_nonopt = argc; optind = argc; } /* If we have done all the ARGV-elements, stop the scan and back over any non-options that we skipped and permuted. */ if (optind == argc) { /* Set the next-arg-index to point at the non-options that we previously skipped, so the caller will digest them. */ if (first_nonopt != last_nonopt) optind = first_nonopt; return -1; } /* If we have come to a non-option and did not permute it, either stop the scan or describe it to the caller and pass it by. */ if (NONOPTION_P) { if (ordering == REQUIRE_ORDER) return -1; optarg = argv[optind++]; return 1; } /* We have found another option-ARGV-element. Skip the initial punctuation. */ nextchar = (argv[optind] + 1 + (longopts != NULL && argv[optind][1] == '-')); } /* Decode the current option-ARGV-element. */ /* Check whether the ARGV-element is a long option. If long_only and the ARGV-element has the form "-f", where f is a valid short option, don't consider it an abbreviated form of a long option that starts with f. Otherwise there would be no way to give the -f short option. On the other hand, if there's a long option "fubar" and the ARGV-element is "-fu", do consider that an abbreviation of the long option, just like "--fu", and not "-f" with arg "u". This distinction seems to be the most useful approach. */ if (longopts != NULL && (argv[optind][1] == '-' || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1]))))) { char *nameend; const struct option *p; const struct option *pfound = NULL; int exact = 0; int ambig = 0; int indfound = -1; int option_index; for (nameend = nextchar; *nameend && *nameend != '='; nameend++) /* Do nothing. */ ; /* Test all long options for either exact match or abbreviated matches. */ for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!strncmp (p->name, nextchar, nameend - nextchar)) { if ((unsigned int) (nameend - nextchar) == (unsigned int) strlen (p->name)) { /* Exact match found. */ pfound = p; indfound = option_index; exact = 1; break; } else if (pfound == NULL) { /* First nonexact match found. */ pfound = p; indfound = option_index; } else /* Second or later nonexact match found. */ ambig = 1; } if (ambig && !exact) { if (opterr) fprintf (stderr, _("%s: option `%s' is ambiguous\n"), argv[0], argv[optind]); nextchar += strlen (nextchar); optind++; optopt = 0; return '?'; } if (pfound != NULL) { option_index = indfound; optind++; if (*nameend) { /* Don't test has_arg with >, because some C compilers don't allow it to be used on enums. */ if (pfound->has_arg) optarg = nameend + 1; else { if (opterr) { if (argv[optind - 1][1] == '-') /* --option */ fprintf (stderr, _("%s: option `--%s' doesn't allow an argument\n"), argv[0], pfound->name); else /* +option or -option */ fprintf (stderr, _("%s: option `%c%s' doesn't allow an argument\n"), argv[0], argv[optind - 1][0], pfound->name); } nextchar += strlen (nextchar); optopt = pfound->val; return '?'; } } else if (pfound->has_arg == 1) { if (optind < argc) optarg = argv[optind++]; else { if (opterr) fprintf (stderr, _("%s: option `%s' requires an argument\n"), argv[0], argv[optind - 1]); nextchar += strlen (nextchar); optopt = pfound->val; return optstring[0] == ':' ? ':' : '?'; } } nextchar += strlen (nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) { *(pfound->flag) = pfound->val; return 0; } return pfound->val; } /* Can't find it as a long option. If this is not getopt_long_only, or the option starts with '--' or is not a valid short option, then it's an error. Otherwise interpret it as a short option. */ if (!long_only || argv[optind][1] == '-' || my_index (optstring, *nextchar) == NULL) { if (opterr) { if (argv[optind][1] == '-') /* --option */ fprintf (stderr, _("%s: unrecognized option `--%s'\n"), argv[0], nextchar); else /* +option or -option */ fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), argv[0], argv[optind][0], nextchar); } nextchar = (char *) ""; optind++; optopt = 0; return '?'; } } /* Look at and handle the next short option-character. */ { char c = *nextchar++; char *temp = my_index (optstring, c); /* Increment `optind' when we start to process its last character. */ if (*nextchar == '\0') ++optind; if (temp == NULL || c == ':') { if (opterr) { if (posixly_correct) /* 1003.2 specifies the format of this message. */ fprintf (stderr, _("%s: illegal option -- %c\n"), argv[0], c); else fprintf (stderr, _("%s: invalid option -- %c\n"), argv[0], c); } optopt = c; return '?'; } /* Convenience. Treat POSIX -W foo same as long option --foo */ if (temp[0] == 'W' && temp[1] == ';') { char *nameend; const struct option *p; const struct option *pfound = NULL; int exact = 0; int ambig = 0; int indfound = 0; int option_index; /* This is an option that requires an argument. */ if (*nextchar != '\0') { optarg = nextchar; /* If we end this ARGV-element by taking the rest as an arg, we must advance to the next element now. */ optind++; } else if (optind == argc) { if (opterr) { /* 1003.2 specifies the format of this message. */ fprintf (stderr, _("%s: option requires an argument -- %c\n"), argv[0], c); } optopt = c; if (optstring[0] == ':') c = ':'; else c = '?'; return c; } else /* We already incremented `optind' once; increment it again when taking next ARGV-elt as argument. */ optarg = argv[optind++]; /* optarg is now the argument, see if it's in the table of longopts. */ for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++) /* Do nothing. */ ; /* Test all long options for either exact match or abbreviated matches. */ for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!strncmp (p->name, nextchar, nameend - nextchar)) { if ((unsigned int) (nameend - nextchar) == strlen (p->name)) { /* Exact match found. */ pfound = p; indfound = option_index; exact = 1; break; } else if (pfound == NULL) { /* First nonexact match found. */ pfound = p; indfound = option_index; } else /* Second or later nonexact match found. */ ambig = 1; } if (ambig && !exact) { if (opterr) fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), argv[0], argv[optind]); nextchar += strlen (nextchar); optind++; return '?'; } if (pfound != NULL) { option_index = indfound; if (*nameend) { /* Don't test has_arg with >, because some C compilers don't allow it to be used on enums. */ if (pfound->has_arg) optarg = nameend + 1; else { if (opterr) fprintf (stderr, _("\ %s: option `-W %s' doesn't allow an argument\n"), argv[0], pfound->name); nextchar += strlen (nextchar); return '?'; } } else if (pfound->has_arg == 1) { if (optind < argc) optarg = argv[optind++]; else { if (opterr) fprintf (stderr, _("%s: option `%s' requires an argument\n"), argv[0], argv[optind - 1]); nextchar += strlen (nextchar); return optstring[0] == ':' ? ':' : '?'; } } nextchar += strlen (nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) { *(pfound->flag) = pfound->val; return 0; } return pfound->val; } nextchar = NULL; return 'W'; /* Let the application handle it. */ } if (temp[1] == ':') { if (temp[2] == ':') { /* This is an option that accepts an argument optionally. */ if (*nextchar != '\0') { optarg = nextchar; optind++; } else optarg = NULL; nextchar = NULL; } else { /* This is an option that requires an argument. */ if (*nextchar != '\0') { optarg = nextchar; /* If we end this ARGV-element by taking the rest as an arg, we must advance to the next element now. */ optind++; } else if (optind == argc) { if (opterr) { /* 1003.2 specifies the format of this message. */ fprintf (stderr, _("%s: option requires an argument -- %c\n"), argv[0], c); } optopt = c; if (optstring[0] == ':') c = ':'; else c = '?'; } else /* We already incremented `optind' once; increment it again when taking next ARGV-elt as argument. */ optarg = argv[optind++]; nextchar = NULL; } } return c; } } int getopt (argc, argv, optstring) int argc; char *const *argv; const char *optstring; { return _getopt_internal (argc, argv, optstring, (const struct option *) 0, (int *) 0, 0); } #endif /* Not ELIDE_CODE. */ #ifdef TEST /* Compile with -DTEST to make an executable for use in testing the above definition of `getopt'. */ int main (argc, argv) int argc; char **argv; { int c; int digit_optind = 0; while (1) { int this_option_optind = optind ? optind : 1; c = getopt (argc, argv, "abc:d:0123456789"); if (c == -1) break; switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (digit_optind != 0 && digit_optind != this_option_optind) printf ("digits occur in two different argv-elements.\n"); digit_optind = this_option_optind; printf ("option %c\n", c); break; case 'a': printf ("option a\n"); break; case 'b': printf ("option b\n"); break; case 'c': printf ("option c with value `%s'\n", optarg); break; case '?': break; default: printf ("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); printf ("\n"); } exit (0); } #endif /* TEST */ mumble-1.3.4/3rdparty/celt-0.7.0-src/tools/celtclient.c0000664000175000017500000002015514010707311022213 0ustar builderbuilder/*************************************************************************** Copyright (C) 2004-2006 by Jean-Marc Valin Copyright (C) 2006 Commonwealth Scientific and Industrial Research Organisation (CSIRO) Australia Copyright (C) 2008-2009 Gregory Maxwell Copyright (c) 2007-2009 Xiph.Org Foundation Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************************************************************/ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include #include /* close() */ #include /* memset() */ #include "alsa_device.h" #include #include #include #define MAX_MSG 1500 #define SAMPLING_RATE 48000 #define FRAME_SIZE 256 #define PACKETSIZE 43 #define CHANNELS 1 #define HAS_SPEEX_AEC #if CHANNELS == 2 /* FIXME: The Speex AEC has multichannel support; but that API isn't being used here yet. */ #undef HAS_SPEEX_AEC #endif #ifdef HAS_SPEEX_AEC #include #endif int main(int argc, char *argv[]) { int sd, rc, n; int i; struct sockaddr_in cliAddr, remoteAddr; char msg[MAX_MSG]; struct hostent *h; int local_port, remote_port; int nfds; struct pollfd *pfds; AlsaDevice *audio_dev; int tmp; if (argc != 5) { fprintf(stderr, "Usage %s plughw:0,0 remote_host local_udp_port remote_udp_port\n",argv[0]); exit(1); } h = gethostbyname(argv[2]); if(h==NULL) { fprintf(stderr, "%s: unknown host '%s' \n", argv[0], argv[2]); exit(1); } local_port = atoi(argv[3]); remote_port = atoi(argv[4]); printf("%s: sending data to '%s' (IP : %s) \n", argv[0], h->h_name, inet_ntoa(*(struct in_addr *)h->h_addr_list[0])); { remoteAddr.sin_family = h->h_addrtype; memcpy((char *) &remoteAddr.sin_addr.s_addr, h->h_addr_list[0], h->h_length); remoteAddr.sin_port = htons(remote_port); } /* socket creation */ sd=socket(AF_INET, SOCK_DGRAM, 0); if(sd<0) { printf("%s: cannot open socket \n",argv[0]); exit(1); } /* bind any port */ cliAddr.sin_family = AF_INET; cliAddr.sin_addr.s_addr = htonl(INADDR_ANY); cliAddr.sin_port = htons(local_port); rc = bind(sd, (struct sockaddr *) &cliAddr, sizeof(cliAddr)); if(rc<0) { printf("%s: cannot bind port\n", argv[0]); exit(1); } /* Setup audio device */ audio_dev = alsa_device_open(argv[1], SAMPLING_RATE, CHANNELS, FRAME_SIZE); /* Setup the encoder and decoder in wideband */ CELTEncoder *enc_state; CELTDecoder *dec_state; CELTMode *mode = celt_mode_create(SAMPLING_RATE, FRAME_SIZE, NULL); enc_state = celt_encoder_create(mode, CHANNELS, NULL); dec_state = celt_decoder_create(mode, CHANNELS, NULL); struct sched_param param; /*param.sched_priority = 40; */ param.sched_priority = sched_get_priority_min(SCHED_FIFO); if (sched_setscheduler(0,SCHED_FIFO,¶m)) perror("sched_setscheduler"); int send_timestamp = 0; int recv_started=0; /* Setup all file descriptors for poll()ing */ nfds = alsa_device_nfds(audio_dev); pfds = malloc(sizeof(*pfds)*(nfds+1)); alsa_device_getfds(audio_dev, pfds, nfds); pfds[nfds].fd = sd; pfds[nfds].events = POLLIN; /* Setup jitter buffer using decoder */ JitterBuffer *jitter; jitter = jitter_buffer_init(FRAME_SIZE); tmp = FRAME_SIZE; jitter_buffer_ctl(jitter, JITTER_BUFFER_SET_MARGIN, &tmp); #ifdef HAS_SPEEX_AEC /* Echo canceller with 200 ms tail length */ SpeexEchoState *echo_state = speex_echo_state_init(FRAME_SIZE, 10*FRAME_SIZE); tmp = SAMPLING_RATE; speex_echo_ctl(echo_state, SPEEX_ECHO_SET_SAMPLING_RATE, &tmp); #endif alsa_device_start(audio_dev); /* Infinite loop on capture, playback and receiving packets */ while (1) { /* Wait for either 1) capture 2) playback 3) socket data */ poll(pfds, nfds+1, -1); /* Received packets */ if (pfds[nfds].revents & POLLIN) { n = recv(sd, msg, MAX_MSG, 0); int recv_timestamp = ((int*)msg)[0]; JitterBufferPacket packet; packet.data = msg+4; packet.len = n-4; packet.timestamp = recv_timestamp; packet.span = FRAME_SIZE; packet.sequence = 0; /* Put content of the packet into the jitter buffer, except for the pseudo-header */ jitter_buffer_put(jitter, &packet); recv_started = 1; } /* Ready to play a frame (playback) */ if (alsa_device_playback_ready(audio_dev, pfds, nfds)) { short pcm[FRAME_SIZE*CHANNELS]; if (recv_started) { JitterBufferPacket packet; /* Get audio from the jitter buffer */ packet.data = msg; packet.len = MAX_MSG; jitter_buffer_tick(jitter); jitter_buffer_get(jitter, &packet, FRAME_SIZE, NULL); if (packet.len==0) packet.data=NULL; celt_decode(dec_state, packet.data, packet.len, pcm); } else { for (i=0;i #include struct AlsaDevice_ { char *device_name; int channels; int period; snd_pcm_t *capture_handle; snd_pcm_t *playback_handle; int readN, writeN; struct pollfd *read_fd, *write_fd; }; #define PERIODS 3 AlsaDevice *alsa_device_open(char *device_name, unsigned int rate, int channels, int period) { int dir; int err; snd_pcm_hw_params_t *hw_params; snd_pcm_sw_params_t *sw_params; snd_pcm_uframes_t period_size = period; snd_pcm_uframes_t buffer_size = PERIODS*period; static snd_output_t *jcd_out; AlsaDevice *dev = malloc(sizeof(*dev)); if (!dev) return NULL; dev->device_name = malloc(1+strlen(device_name)); if (!dev->device_name) { free(dev); return NULL; } strcpy(dev->device_name, device_name); dev->channels = channels; dev->period = period; err = snd_output_stdio_attach(&jcd_out, stdout, 0); if ((err = snd_pcm_open (&dev->capture_handle, dev->device_name, SND_PCM_STREAM_CAPTURE, 0)) < 0) { fprintf (stderr, "cannot open audio device %s (%s)\n", dev->device_name, snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params_malloc (&hw_params)) < 0) { fprintf (stderr, "cannot allocate hardware parameter structure (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params_any (dev->capture_handle, hw_params)) < 0) { fprintf (stderr, "cannot initialize hardware parameter structure (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params_set_access (dev->capture_handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) { fprintf (stderr, "cannot set access type (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params_set_format (dev->capture_handle, hw_params, SND_PCM_FORMAT_S16_LE)) < 0) { fprintf (stderr, "cannot set sample format (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params_set_rate_near (dev->capture_handle, hw_params, &rate, 0)) < 0) { fprintf (stderr, "cannot set sample rate (%s)\n", snd_strerror (err)); assert(0); } /*fprintf (stderr, "rate = %d\n", rate);*/ if ((err = snd_pcm_hw_params_set_channels (dev->capture_handle, hw_params, channels)) < 0) { fprintf (stderr, "cannot set channel count (%s)\n", snd_strerror (err)); assert(0); } period_size = period; dir = 0; if ((err = snd_pcm_hw_params_set_period_size_near (dev->capture_handle, hw_params, &period_size, &dir)) < 0) { fprintf (stderr, "cannot set period size (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params_set_periods (dev->capture_handle, hw_params, PERIODS, 0)) < 0) { fprintf (stderr, "cannot set number of periods (%s)\n", snd_strerror (err)); assert(0); } buffer_size = period_size * PERIODS; dir=0; if ((err = snd_pcm_hw_params_set_buffer_size_near (dev->capture_handle, hw_params, &buffer_size)) < 0) { fprintf (stderr, "cannot set buffer time (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params (dev->capture_handle, hw_params)) < 0) { fprintf (stderr, "cannot set capture parameters (%s)\n", snd_strerror (err)); assert(0); } /*snd_pcm_dump_setup(dev->capture_handle, jcd_out);*/ snd_pcm_hw_params_free (hw_params); if ((err = snd_pcm_sw_params_malloc (&sw_params)) < 0) { fprintf (stderr, "cannot allocate software parameters structure (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_sw_params_current (dev->capture_handle, sw_params)) < 0) { fprintf (stderr, "cannot initialize software parameters structure (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_sw_params_set_avail_min (dev->capture_handle, sw_params, period)) < 0) { fprintf (stderr, "cannot set minimum available count (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_sw_params (dev->capture_handle, sw_params)) < 0) { fprintf (stderr, "cannot set software parameters (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_open (&dev->playback_handle, dev->device_name, SND_PCM_STREAM_PLAYBACK, 0)) < 0) { fprintf (stderr, "cannot open audio device %s (%s)\n", dev->device_name, snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params_malloc (&hw_params)) < 0) { fprintf (stderr, "cannot allocate hardware parameter structure (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params_any (dev->playback_handle, hw_params)) < 0) { fprintf (stderr, "cannot initialize hardware parameter structure (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params_set_access (dev->playback_handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) { fprintf (stderr, "cannot set access type (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params_set_format (dev->playback_handle, hw_params, SND_PCM_FORMAT_S16_LE)) < 0) { fprintf (stderr, "cannot set sample format (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params_set_rate_near (dev->playback_handle, hw_params, &rate, 0)) < 0) { fprintf (stderr, "cannot set sample rate (%s)\n", snd_strerror (err)); assert(0); } /*fprintf (stderr, "rate = %d\n", rate);*/ if ((err = snd_pcm_hw_params_set_channels (dev->playback_handle, hw_params, channels)) < 0) { fprintf (stderr, "cannot set channel count (%s)\n", snd_strerror (err)); assert(0); } period_size = period; dir = 0; if ((err = snd_pcm_hw_params_set_period_size_near (dev->playback_handle, hw_params, &period_size, &dir)) < 0) { fprintf (stderr, "cannot set period size (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params_set_periods (dev->playback_handle, hw_params, PERIODS, 0)) < 0) { fprintf (stderr, "cannot set number of periods (%s)\n", snd_strerror (err)); assert(0); } buffer_size = period_size * PERIODS; dir=0; if ((err = snd_pcm_hw_params_set_buffer_size_near (dev->playback_handle, hw_params, &buffer_size)) < 0) { fprintf (stderr, "cannot set buffer time (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params (dev->playback_handle, hw_params)) < 0) { fprintf (stderr, "cannot set playback parameters (%s)\n", snd_strerror (err)); assert(0); } /*snd_pcm_dump_setup(dev->playback_handle, jcd_out);*/ snd_pcm_hw_params_free (hw_params); if ((err = snd_pcm_sw_params_malloc (&sw_params)) < 0) { fprintf (stderr, "cannot allocate software parameters structure (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_sw_params_current (dev->playback_handle, sw_params)) < 0) { fprintf (stderr, "cannot initialize software parameters structure (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_sw_params_set_avail_min (dev->playback_handle, sw_params, period)) < 0) { fprintf (stderr, "cannot set minimum available count (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_sw_params_set_start_threshold (dev->playback_handle, sw_params, period)) < 0) { fprintf (stderr, "cannot set start mode (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_sw_params (dev->playback_handle, sw_params)) < 0) { fprintf (stderr, "cannot set software parameters (%s)\n", snd_strerror (err)); assert(0); } snd_pcm_link(dev->capture_handle, dev->playback_handle); if ((err = snd_pcm_prepare (dev->capture_handle)) < 0) { fprintf (stderr, "cannot prepare audio interface for use (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_prepare (dev->playback_handle)) < 0) { fprintf (stderr, "cannot prepare audio interface for use (%s)\n", snd_strerror (err)); assert(0); } dev->readN = snd_pcm_poll_descriptors_count(dev->capture_handle); dev->writeN = snd_pcm_poll_descriptors_count(dev->playback_handle); dev->read_fd = malloc(dev->readN*sizeof(*dev->read_fd)); /*printf ("descriptors: %d %d\n", dev->readN, dev->writeN);*/ if (snd_pcm_poll_descriptors(dev->capture_handle, dev->read_fd, dev->readN) != dev->readN) { fprintf (stderr, "cannot obtain capture file descriptors (%s)\n", snd_strerror (err)); assert(0); } dev->write_fd = malloc(dev->writeN*sizeof(*dev->read_fd)); if (snd_pcm_poll_descriptors(dev->playback_handle, dev->write_fd, dev->writeN) != dev->writeN) { fprintf (stderr, "cannot obtain playback file descriptors (%s)\n", snd_strerror (err)); assert(0); } return dev; } void alsa_device_close(AlsaDevice *dev) { snd_pcm_close(dev->capture_handle); snd_pcm_close(dev->playback_handle); free(dev->device_name); free(dev); } int alsa_device_read(AlsaDevice *dev, short *pcm, int len) { int err; /*fprintf (stderr, "-");*/ if ((err = snd_pcm_readi (dev->capture_handle, pcm, len)) != len) { if (err<0) { //fprintf(stderr, "error %d, EPIPE = %d\n", err, EPIPE); if (err == -EPIPE) { fprintf (stderr, "An overrun has occured, reseting capture\n"); } else { fprintf (stderr, "read from audio interface failed (%s)\n", snd_strerror (err)); } if ((err = snd_pcm_prepare (dev->capture_handle)) < 0) { fprintf (stderr, "cannot prepare audio interface for use (%s)\n", snd_strerror (err)); } if ((err = snd_pcm_start (dev->capture_handle)) < 0) { fprintf (stderr, "cannot prepare audio interface for use (%s)\n", snd_strerror (err)); } /*alsa_device_read(dev,pcm,len);*/ } else { fprintf (stderr, "Couldn't read as many samples as I wanted (%d instead of %d)\n", err, len); } return 1; } return 0; } int alsa_device_write(AlsaDevice *dev, const short *pcm, int len) { int err; /*fprintf (stderr, "+");*/ if ((err = snd_pcm_writei (dev->playback_handle, pcm, len)) != len) { if (err<0) { if (err == -EPIPE) { fprintf (stderr, "An underrun has occured, reseting playback, len=%d\n", len); } else { fprintf (stderr, "write to audio interface failed (%s)\n", snd_strerror (err)); } if ((err = snd_pcm_prepare (dev->playback_handle)) < 0) { fprintf (stderr, "cannot prepare audio interface for use (%s)\n", snd_strerror (err)); } } else { fprintf (stderr, "Couldn't write as many samples as I wanted (%d instead of %d)\n", err, len); } /*alsa_device_write(dev,pcm,len);*/ return 1; } return 0; } int alsa_device_capture_ready(AlsaDevice *dev, struct pollfd *pfds, unsigned int nfds) { unsigned short revents=0; int err; if ((err = snd_pcm_poll_descriptors_revents(dev->capture_handle, pfds, dev->readN, &revents)) < 0) { //cerr << "error in snd_pcm_poll_descriptors_revents for capture: " << snd_strerror (err) << endl; //FIXME: This is a kludge fprintf (stderr, "error in alsa_device_capture_ready: %s\n", snd_strerror (err)); return pfds[0].revents & POLLIN; } //cerr << (revents & POLLERR) << endl; return revents & POLLIN; } int alsa_device_playback_ready(AlsaDevice *dev, struct pollfd *pfds, unsigned int nfds) { unsigned short revents=0; int err; if ((err = snd_pcm_poll_descriptors_revents(dev->playback_handle, pfds+dev->readN, dev->writeN, &revents)) < 0) { //cerr << "error in snd_pcm_poll_descriptors_revents for playback: " << snd_strerror (err) << endl; //FIXME: This is a kludge fprintf (stderr, "error in alsa_device_playback_ready: %s\n", snd_strerror (err)); return pfds[1].revents & POLLOUT; } //cerr << (revents & POLLERR) << endl; return revents & POLLOUT; } void alsa_device_start(AlsaDevice *dev) { int i; short pcm[dev->period*dev->channels]; for (i=0;iperiod*dev->channels;i++) pcm[i] = 0; alsa_device_write(dev, pcm, dev->period); alsa_device_write(dev, pcm, dev->period); snd_pcm_start(dev->capture_handle); snd_pcm_start(dev->playback_handle); } int alsa_device_nfds(AlsaDevice *dev) { return dev->writeN+dev->readN; } void alsa_device_getfds(AlsaDevice *dev, struct pollfd *pfds, unsigned int nfds) { int i; assert (nfds >= dev->writeN+dev->readN); for (i=0;ireadN;i++) pfds[i] = dev->read_fd[i]; for (i=0;iwriteN;i++) pfds[i+dev->readN] = dev->write_fd[i]; } mumble-1.3.4/3rdparty/celt-0.7.0-src/tools/celtdec.c0000664000175000017500000004566714010707311021507 0ustar builderbuilder/* Copyright (c) 2002-2007 Jean-Marc Valin Copyright (c) 2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation File: celtdec.c Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #if !defined WIN32 && !defined _WIN32 #include #endif #ifdef HAVE_GETOPT_H #include #endif #ifndef HAVE_GETOPT_LONG #include "getopt_win.h" #endif #include #include #include #include #if defined WIN32 || defined _WIN32 #include "wave_out.h" /* We need the following two to set stdout to binary */ #include #include #endif #include #ifdef __MINGW32__ #include "wave_out.c" #endif #ifdef HAVE_SYS_SOUNDCARD_H #include #include #include #include #include #elif defined HAVE_SYS_AUDIOIO_H #include #include #include #include #ifndef AUDIO_ENCODING_SLINEAR #define AUDIO_ENCODING_SLINEAR AUDIO_ENCODING_LINEAR /* Solaris */ #endif #endif #include #include "wav_io.h" #include #define MAX_FRAME_SIZE 2048 #define readint(buf, base) (((buf[base+3]<<24)&0xff000000)| \ ((buf[base+2]<<16)&0xff0000)| \ ((buf[base+1]<<8)&0xff00)| \ (buf[base]&0xff)) static void print_comments(char *comments, int length) { char *c=comments; int len, i, nb_fields; char *end; if (length<8) { fprintf (stderr, "Invalid/corrupted comments\n"); return; } end = c+length; len=readint(c, 0); c+=4; if (len < 0 || c+len>end) { fprintf (stderr, "Invalid/corrupted comments\n"); return; } fwrite(c, 1, len, stderr); c+=len; fprintf (stderr, "\n"); if (c+4>end) { fprintf (stderr, "Invalid/corrupted comments\n"); return; } nb_fields=readint(c, 0); c+=4; for (i=0;iend) { fprintf (stderr, "Invalid/corrupted comments\n"); return; } len=readint(c, 0); c+=4; if (len < 0 || c+len>end) { fprintf (stderr, "Invalid/corrupted comments\n"); return; } fwrite(c, 1, len, stderr); c+=len; fprintf (stderr, "\n"); } } FILE *out_file_open(char *outFile, int rate, int *channels) { FILE *fout=NULL; /*Open output file*/ if (strlen(outFile)==0) { #if defined HAVE_SYS_SOUNDCARD_H int audio_fd, format, stereo; audio_fd=open("/dev/dsp", O_WRONLY); if (audio_fd<0) { perror("Cannot open /dev/dsp"); exit(1); } format=AFMT_S16_NE; if (ioctl(audio_fd, SNDCTL_DSP_SETFMT, &format)==-1) { perror("SNDCTL_DSP_SETFMT"); close(audio_fd); exit(1); } stereo=0; if (*channels==2) stereo=1; if (ioctl(audio_fd, SNDCTL_DSP_STEREO, &stereo)==-1) { perror("SNDCTL_DSP_STEREO"); close(audio_fd); exit(1); } if (stereo!=0) { if (*channels==1) fprintf (stderr, "Cannot set mono mode, will decode in stereo\n"); *channels=2; } if (ioctl(audio_fd, SNDCTL_DSP_SPEED, &rate)==-1) { perror("SNDCTL_DSP_SPEED"); close(audio_fd); exit(1); } fout = fdopen(audio_fd, "w"); #elif defined HAVE_SYS_AUDIOIO_H audio_info_t info; int audio_fd; audio_fd = open("/dev/audio", O_WRONLY); if (audio_fd<0) { perror("Cannot open /dev/audio"); exit(1); } AUDIO_INITINFO(&info); #ifdef AUMODE_PLAY /* NetBSD/OpenBSD */ info.mode = AUMODE_PLAY; #endif info.play.encoding = AUDIO_ENCODING_SLINEAR; info.play.precision = 16; info.play.sample_rate = rate; info.play.channels = *channels; if (ioctl(audio_fd, AUDIO_SETINFO, &info) < 0) { perror ("AUDIO_SETINFO"); exit(1); } fout = fdopen(audio_fd, "w"); #elif defined WIN32 || defined _WIN32 { unsigned int celt_channels = *channels; if (Set_WIN_Params (INVALID_FILEDESC, rate, SAMPLE_SIZE, celt_channels)) { fprintf (stderr, "Can't access %s\n", "WAVE OUT"); exit(1); } } #else fprintf (stderr, "No soundcard support\n"); exit(1); #endif } else { if (strcmp(outFile,"-")==0) { #if defined WIN32 || defined _WIN32 _setmode(_fileno(stdout), _O_BINARY); #endif fout=stdout; } else { fout = fopen(outFile, "wb"); if (!fout) { perror(outFile); exit(1); } if (strcmp(outFile+strlen(outFile)-4,".wav")==0 || strcmp(outFile+strlen(outFile)-4,".WAV")==0) write_wav_header(fout, rate, *channels, 0, 0); } } return fout; } void usage(void) { printf ("Usage: celtdec [options] input_file.oga [output_file]\n"); printf ("\n"); printf ("Decodes a CELT file and produce a WAV file or raw file\n"); printf ("\n"); printf ("input_file can be:\n"); printf (" filename.oga regular CELT file\n"); printf (" - stdin\n"); printf ("\n"); printf ("output_file can be:\n"); printf (" filename.wav Wav file\n"); printf (" filename.* Raw PCM file (any extension other that .wav)\n"); printf (" - stdout\n"); printf (" (nothing) Will be played to soundcard\n"); printf ("\n"); printf ("Options:\n"); printf (" --mono Force decoding in mono\n"); printf (" --stereo Force decoding in stereo\n"); printf (" --rate n Force decoding at sampling rate n Hz\n"); printf (" --packet-loss n Simulate n %% random packet loss\n"); printf (" -V Verbose mode (show bit-rate)\n"); printf (" -h, --help This help\n"); printf (" -v, --version Version information\n"); printf ("\n"); } void version(void) { printf ("celtenc (CELT %s encoder)\n",CELT_VERSION); printf ("Copyright (C) 2008 Jean-Marc Valin\n"); } void version_short(void) { printf ("celtenc (CELT %s encoder)\n",CELT_VERSION); printf ("Copyright (C) 2008 Jean-Marc Valin\n"); } static CELTDecoder *process_header(ogg_packet *op, celt_int32 enh_enabled, celt_int32 *frame_size, int *granule_frame_size, celt_int32 *rate, int *nframes, int forceMode, int *channels, int *overlap, int *extra_headers, int quiet, CELTMode **mode) { CELTDecoder *st; CELTHeader header; int bitstream; celt_header_from_packet(op->packet, op->bytes, &header); if (header.nb_channels>2 || header.nb_channels<1) { fprintf (stderr, "Unsupported number of channels: %d\n", header.nb_channels); return NULL; } *mode = celt_mode_create(header.sample_rate, header.frame_size, NULL); if (*mode == NULL) { fprintf (stderr, "Mode initialization failed.\n"); return NULL; } celt_mode_info(*mode, CELT_GET_BITSTREAM_VERSION, &bitstream); if (bitstream!=header.version_id) fprintf(stderr, "WARNING: Input was encoded with a CELT bitstream version %d. This decoder uses %d. Output will probably be corrupted.\n",header.version_id,bitstream); *channels = header.nb_channels; *overlap=header.overlap; st = celt_decoder_create(*mode, header.nb_channels, NULL); if (!st) { fprintf (stderr, "Decoder initialization failed.\n"); return NULL; } celt_mode_info(*mode, CELT_GET_FRAME_SIZE, frame_size); *granule_frame_size = *frame_size; if (!*rate) *rate = header.sample_rate; *nframes = 1; if (!quiet) { fprintf (stderr, "Decoding %d Hz audio in", *rate); if (*channels==1) fprintf (stderr, " (mono"); else fprintf (stderr, " (stereo"); fprintf(stderr, ")\n"); } *extra_headers = header.extra_headers; return st; } int main(int argc, char **argv) { int c; int option_index = 0; char *inFile, *outFile; FILE *fin, *fout=NULL; short out[MAX_FRAME_SIZE]; short output[MAX_FRAME_SIZE]; int frame_size=0, granule_frame_size=0; void *st=NULL; CELTMode *mode=NULL; int packet_count=0; int stream_init = 0; int quiet = 0; ogg_int64_t page_granule=0, last_granule=0; int skip_samples=0, page_nb_packets; struct option long_options[] = { {"help", no_argument, NULL, 0}, {"quiet", no_argument, NULL, 0}, {"version", no_argument, NULL, 0}, {"version-short", no_argument, NULL, 0}, {"rate", required_argument, NULL, 0}, {"mono", no_argument, NULL, 0}, {"stereo", no_argument, NULL, 0}, {"packet-loss", required_argument, NULL, 0}, {0, 0, 0, 0} }; ogg_sync_state oy; ogg_page og; ogg_packet op; ogg_stream_state os; int enh_enabled; int nframes=2; int print_bitrate=0; int close_in=0; int eos=0; int forceMode=-1; int audio_size=0; float loss_percent=-1; int channels=-1; int rate=0; int extra_headers=0; int wav_format=0; int lookahead=0; int celt_serialno = -1; int firstpacket = 1; enh_enabled = 1; /*Process options*/ while(1) { c = getopt_long (argc, argv, "hvV", long_options, &option_index); if (c==-1) break; switch(c) { case 0: if (strcmp(long_options[option_index].name,"help")==0) { usage(); exit(0); } else if (strcmp(long_options[option_index].name,"quiet")==0) { quiet = 1; } else if (strcmp(long_options[option_index].name,"version")==0) { version(); exit(0); } else if (strcmp(long_options[option_index].name,"version-short")==0) { version_short(); exit(0); } else if (strcmp(long_options[option_index].name,"mono")==0) { channels=1; } else if (strcmp(long_options[option_index].name,"stereo")==0) { channels=2; } else if (strcmp(long_options[option_index].name,"rate")==0) { rate=atoi (optarg); } else if (strcmp(long_options[option_index].name,"packet-loss")==0) { loss_percent = atof(optarg); } break; case 'h': usage(); exit(0); break; case 'v': version(); exit(0); break; case 'V': print_bitrate=1; break; case '?': usage(); exit(1); break; } } if (argc-optind!=2 && argc-optind!=1) { usage(); exit(1); } inFile=argv[optind]; if (argc-optind==2) outFile=argv[optind+1]; else outFile = ""; wav_format = strlen(outFile)>=4 && ( strcmp(outFile+strlen(outFile)-4,".wav")==0 || strcmp(outFile+strlen(outFile)-4,".WAV")==0); /*Open input file*/ if (strcmp(inFile, "-")==0) { #if defined WIN32 || defined _WIN32 _setmode(_fileno(stdin), _O_BINARY); #endif fin=stdin; } else { fin = fopen(inFile, "rb"); if (!fin) { perror(inFile); exit(1); } close_in=1; } /*Init Ogg data struct*/ ogg_sync_init(&oy); /*Main decoding loop*/ while (1) { char *data; int i, nb_read; /*Get the ogg buffer for writing*/ data = ogg_sync_buffer(&oy, 200); /*Read bitstream from input file*/ nb_read = fread(data, sizeof(char), 200, fin); ogg_sync_wrote(&oy, nb_read); /*Loop for all complete pages we got (most likely only one)*/ while (ogg_sync_pageout(&oy, &og)==1) { if (stream_init == 0) { ogg_stream_init(&os, ogg_page_serialno(&og)); stream_init = 1; } if (ogg_page_serialno(&og) != os.serialno) { /* so all streams are read. */ ogg_stream_reset_serialno(&os, ogg_page_serialno(&og)); } /*Add page to the bitstream*/ ogg_stream_pagein(&os, &og); page_granule = ogg_page_granulepos(&og); page_nb_packets = ogg_page_packets(&og); if (page_granule>0 && frame_size) { /* FIXME: shift the granule values if --force-* is specified */ skip_samples = frame_size*(page_nb_packets*granule_frame_size*nframes - (page_granule-last_granule))/granule_frame_size; if (ogg_page_eos(&og)) skip_samples = -skip_samples; /*else if (!ogg_page_bos(&og)) skip_samples = 0;*/ } else { skip_samples = 0; } /*printf ("page granulepos: %d %d %d\n", skip_samples, page_nb_packets, (int)page_granule);*/ last_granule = page_granule; /*Extract all available packets*/ while (!eos && ogg_stream_packetout(&os, &op) == 1 && op.bytes>=8) { if (!memcmp(op.packet, "CELT ", 8)) { celt_serialno = os.serialno; } if (celt_serialno == -1 || os.serialno != celt_serialno) break; /*If first packet, process as CELT header*/ if (packet_count==0) { st = process_header(&op, enh_enabled, &frame_size, &granule_frame_size, &rate, &nframes, forceMode, &channels, &lookahead, &extra_headers, quiet, &mode); if (!st) exit(1); if (!nframes) nframes=1; fout = out_file_open(outFile, rate, &channels); } else if (packet_count==1) { if (!quiet) print_comments((char*)op.packet, op.bytes); } else if (packet_count<=1+extra_headers) { /* Ignore extra headers */ } else { int lost=0; if (loss_percent>0 && 100*((float)rand())/RAND_MAX0) { #if defined WIN32 || defined _WIN32 if (strlen(outFile)==0) WIN_Play_Samples (out+frame_offset*channels, sizeof(short) * new_frame_size*channels); else #endif fwrite(out+frame_offset*channels, sizeof(short), new_frame_size*channels, fout); audio_size+=sizeof(short)*new_frame_size*channels; } } } } packet_count++; } } if (feof(fin)) break; } if (fout && wav_format) { if (fseek(fout,4,SEEK_SET)==0) { int tmp; tmp = le_int(audio_size+36); fwrite(&tmp,4,1,fout); if (fseek(fout,32,SEEK_CUR)==0) { tmp = le_int(audio_size); fwrite(&tmp,4,1,fout); } else { fprintf (stderr, "First seek worked, second didn't\n"); } } else { fprintf (stderr, "Cannot seek on wave file, size will be incorrect\n"); } } if (st) { celt_decoder_destroy(st); celt_mode_destroy(mode); } else { fprintf (stderr, "This doesn't look like a CELT file\n"); } if (stream_init) ogg_stream_clear(&os); ogg_sync_clear(&oy); #if defined WIN32 || defined _WIN32 if (strlen(outFile)==0) WIN_Audio_close (); #endif if (close_in) fclose(fin); if (fout != NULL) fclose(fout); return 0; } mumble-1.3.4/3rdparty/celt-0.7.0-src/tools/alsa_device.h0000664000175000017500000000452114010707311022330 0ustar builderbuilder/* Copyright (C) 2004-2006 Jean-Marc Valin Copyright (C) 2006 Commonwealth Scientific and Industrial Research Organisation (CSIRO) Australia Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef ALSA_DEVICE_H #define ALSA_DEVICE_H #include #ifdef __cplusplus extern "C" { #endif struct AlsaDevice_; typedef struct AlsaDevice_ AlsaDevice; AlsaDevice *alsa_device_open(char *device_name, unsigned int rate, int channels, int period); void alsa_device_close(AlsaDevice *dev); int alsa_device_read(AlsaDevice *dev, short *pcm, int len); int alsa_device_write(AlsaDevice *dev, const short *pcm, int len); int alsa_device_capture_ready(AlsaDevice *dev, struct pollfd *pfds, unsigned int nfds); int alsa_device_playback_ready(AlsaDevice *dev, struct pollfd *pfds, unsigned int nfds); void alsa_device_start(AlsaDevice *dev); int alsa_device_nfds(AlsaDevice *dev); void alsa_device_getfds(AlsaDevice *dev, struct pollfd *pfds, unsigned int nfds); #ifdef __cplusplus } #endif #endif mumble-1.3.4/3rdparty/celt-0.7.0-src/tools/Makefile.am0000664000175000017500000000131514010707311021752 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # $Id: Makefile.am,v 1.11 2004/02/18 06:59:40 jm Exp $ # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies INCLUDES = -I$(top_srcdir)/libcelt -I$(top_builddir)/ @OGG_CFLAGS@ EXTRA_DIST = getopt_win.h getopt.c getopt1.c wave_out.c wave_out.h skeleton.h include_HEADERS = noinst_HEADERS = wav_io.h bin_PROGRAMS = celtenc celtdec celtenc_SOURCES = celtenc.c wav_io.c skeleton.c celtenc_LDADD = $(top_builddir)/libcelt/libcelt@LIBCELT_SUFFIX@.la $(OGG_LIBS) celtdec_SOURCES = celtdec.c wav_io.c celtdec_LDADD = $(top_builddir)/libcelt/libcelt@LIBCELT_SUFFIX@.la $(OGG_LIBS) mumble-1.3.4/3rdparty/celt-0.7.0-src/tools/getopt_win.h0000664000175000017500000001361614010707311022255 0ustar builderbuilder/* Declarations for getopt. Copyright (C) 1989,90,91,92,93,94,96,97,98 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with the GNU C Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _GETOPT_H #ifndef __need_getopt # define _GETOPT_H 1 #endif #ifdef __cplusplus extern "C" { #endif /* For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, the argument value is returned here. Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ extern char *optarg; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to `getopt'. On entry to `getopt', zero means this is the first call; initialize. When `getopt' returns -1, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, `optind' communicates from one call to the next how much of ARGV has been scanned so far. */ extern int optind; /* Callers store zero here to inhibit the error message `getopt' prints for unrecognized options. */ extern int opterr; /* Set to an option character which was unrecognized. */ extern int optopt; #ifndef __need_getopt /* Describe the long-named options requested by the application. The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector of `struct option' terminated by an element containing a name which is zero. The field `has_arg' is: no_argument (or 0) if the option does not take an argument, required_argument (or 1) if the option requires an argument, optional_argument (or 2) if the option takes an optional argument. If the field `flag' is not NULL, it points to a variable that is set to the value given in the field `val' when the option is found, but left unchanged if the option is not found. To have a long-named option do something other than set an `int' to a compiled-in constant, such as set a value from `optarg', set the option's `flag' field to zero and its `val' field to a nonzero value (the equivalent single-letter option character, if there is one). For long options that have a zero `flag' field, `getopt' returns the contents of the `val' field. */ struct option { # if defined __STDC__ && __STDC__ const char *name; # else char *name; # endif /* has_arg can't be an enum because some compilers complain about type mismatches in all the code that assumes it is an int. */ int has_arg; int *flag; int val; }; /* Names for the values of the `has_arg' field of `struct option'. */ # define no_argument 0 # define required_argument 1 # define optional_argument 2 #endif /* need getopt */ /* Get definitions and prototypes for functions to process the arguments in ARGV (ARGC of them, minus the program name) for options given in OPTS. Return the option character from OPTS just read. Return -1 when there are no more options. For unrecognized options, or options missing arguments, `optopt' is set to the option letter, and '?' is returned. The OPTS string is a list of characters which are recognized option letters, optionally followed by colons, specifying that that letter takes an argument, to be placed in `optarg'. If a letter in OPTS is followed by two colons, its argument is optional. This behavior is specific to the GNU `getopt'. The argument `--' causes premature termination of argument scanning, explicitly telling `getopt' that there are no more options. If OPTS begins with `--', then non-option arguments are treated as arguments to the option '\0'. This behavior is specific to the GNU `getopt'. */ #if defined __STDC__ && __STDC__ # ifdef __GNU_LIBRARY__ /* Many other libraries have conflicting prototypes for getopt, with differences in the consts, in stdlib.h. To avoid compilation errors, only prototype getopt for the GNU C library. */ extern int getopt (int __argc, char *const *__argv, const char *__shortopts); # else /* not __GNU_LIBRARY__ */ extern int getopt (); # endif /* __GNU_LIBRARY__ */ # ifndef __need_getopt extern int getopt_long (int __argc, char *const *__argv, const char *__shortopts, const struct option *__longopts, int *__longind); extern int getopt_long_only (int __argc, char *const *__argv, const char *__shortopts, const struct option *__longopts, int *__longind); /* Internal only. Users should not call this directly. */ extern int _getopt_internal (int __argc, char *const *__argv, const char *__shortopts, const struct option *__longopts, int *__longind, int __long_only); # endif #else /* not __STDC__ */ extern int getopt (); # ifndef __need_getopt extern int getopt_long (); extern int getopt_long_only (); extern int _getopt_internal (); # endif #endif /* __STDC__ */ #ifdef __cplusplus } #endif /* Make sure we later can get all the definitions and declarations. */ #undef __need_getopt #endif /* getopt.h */ mumble-1.3.4/3rdparty/celt-0.7.0-src/tools/celtenc.c0000664000175000017500000005731114010707311021506 0ustar builderbuilder/* Copyright (c) 2002-2007 Jean-Marc Valin Copyright (c) 2007-2009 Xiph.Org Foundation Copyright (c) 2008-2009 Gregory Maxwell File: celtenc.c Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #if !defined WIN32 && !defined _WIN32 #include #endif #ifdef HAVE_GETOPT_H #include #endif #ifndef HAVE_GETOPT_LONG #include "getopt_win.h" #endif #include #include #include #include "celt.h" #include "celt_header.h" #include #include "wav_io.h" #if defined WIN32 || defined _WIN32 /* We need the following two to set stdout to binary */ #include #include #endif #include "skeleton.h" void comment_init(char **comments, int* length, char *vendor_string); void comment_add(char **comments, int* length, char *tag, char *val); /*Write an Ogg page to a file pointer*/ int oe_write_page(ogg_page *page, FILE *fp) { int written; written = fwrite(page->header,1,page->header_len, fp); written += fwrite(page->body,1,page->body_len, fp); return written; } #define MAX_FRAME_SIZE 2048 #define MAX_FRAME_BYTES 1024 #define IMIN(a,b) ((a) < (b) ? (a) : (b)) /**< Minimum int value. */ #define IMAX(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum int value. */ /* Convert input audio bits, endians and channels */ static int read_samples(FILE *fin,int frame_size, int bits, int channels, int lsb, short * input, char *buff, celt_int32 *size) { unsigned char in[MAX_FRAME_SIZE*2]; int i; short *s; int nb_read; if (size && *size<=0) { return 0; } /*Read input audio*/ if (size) *size -= bits/8*channels*frame_size; if (buff) { for (i=0;i<12;i++) in[i]=buff[i]; nb_read = fread(in+12,1,bits/8*channels*frame_size-12, fin) + 12; if (size) *size += 12; } else { nb_read = fread(in,1,bits/8*channels* frame_size, fin); } nb_read /= bits/8*channels; /*fprintf (stderr, "%d\n", nb_read);*/ if (nb_read==0) return 0; s=(short*)in; if(bits==8) { /* Convert 8->16 bits */ for(i=frame_size*channels-1;i>=0;i--) { s[i]=(in[i]<<8)^0x8000; } } else { /* convert to our endian format */ for(i=0;iextra_headers; fp.granule_rate_n = header->sample_rate; fp.granule_rate_d = 1; fp.start_granule = 0; fp.preroll = 3; fp.granule_shift = 0; add_message_header_field(&fp, "Content-Type", "audio/x-celt"); add_fisbone_to_stream(os, &fp); } void version(void) { printf ("celtenc (CELT %s encoder)\n",CELT_VERSION); printf ("Copyright (C) 2008 Jean-Marc Valin\n"); } void version_short(void) { printf ("celtenc (CELT %s encoder)\n",CELT_VERSION); printf ("Copyright (C) 2008 Jean-Marc Valin\n"); } void usage(void) { printf ("Usage: celtenc [options] input_file output_file.oga\n"); printf ("\n"); printf ("Encodes input_file using CELT. It can read the WAV or raw files.\n"); printf ("\n"); printf ("input_file can be:\n"); printf (" filename.wav wav file\n"); printf (" filename.* Raw PCM file (any extension other than .wav)\n"); printf (" - stdin\n"); printf ("\n"); printf ("output_file can be:\n"); printf (" filename.oga compressed file\n"); printf (" - stdout\n"); printf ("\n"); printf ("Options:\n"); printf (" --bitrate n Encoding bit-rate in kbit/sec\n"); printf (" --vbr Use variable bitrate encoding\n"); printf (" --comp n Encoding complexity (0-10)\n"); printf (" --framesize n Frame size (Default: 256)\n"); printf (" --noltp Do not use long-term prediction\n"); printf (" --independent Encode frames independently (implies noltp)\n"); printf (" --skeleton Outputs ogg skeleton metadata (may cause incompatibilities)\n"); printf (" --comment Add the given string as an extra comment. This may be\n"); printf (" used multiple times\n"); printf (" --author Author of this track\n"); printf (" --title Title for this track\n"); printf (" -h, --help This help\n"); printf (" -v, --version Version information\n"); printf (" -V Verbose mode (show bit-rate)\n"); printf ("Raw input options:\n"); printf (" --rate n Sampling rate for raw input\n"); printf (" --mono Consider raw input as mono\n"); printf (" --stereo Consider raw input as stereo\n"); printf (" --le Raw input is little-endian\n"); printf (" --be Raw input is big-endian\n"); printf (" --8bit Raw input is 8-bit unsigned\n"); printf (" --16bit Raw input is 16-bit signed\n"); printf ("Default raw PCM input is 16-bit, little-endian, mono\n"); } int main(int argc, char **argv) { int nb_samples, total_samples=0, nb_encoded; int c; int option_index = 0; char *inFile, *outFile; FILE *fin, *fout; short input[MAX_FRAME_SIZE]; celt_int32 frame_size = 256; int quiet=0; int nbBytes; CELTMode *mode; void *st; unsigned char bits[MAX_FRAME_BYTES]; int with_vbr = 0; int with_skeleton = 0; int total_bytes = 0; int peak_bytes = 0; struct option long_options[] = { {"bitrate", required_argument, NULL, 0}, {"vbr",no_argument,NULL, 0}, {"comp", required_argument, NULL, 0}, {"noltp", no_argument, NULL, 0}, {"independent", no_argument, NULL, 0}, {"framesize", required_argument, NULL, 0}, {"skeleton",no_argument,NULL, 0}, {"help", no_argument, NULL, 0}, {"quiet", no_argument, NULL, 0}, {"le", no_argument, NULL, 0}, {"be", no_argument, NULL, 0}, {"8bit", no_argument, NULL, 0}, {"16bit", no_argument, NULL, 0}, {"mono", no_argument, NULL, 0}, {"stereo", no_argument, NULL, 0}, {"rate", required_argument, NULL, 0}, {"version", no_argument, NULL, 0}, {"version-short", no_argument, NULL, 0}, {"comment", required_argument, NULL, 0}, {"author", required_argument, NULL, 0}, {"title", required_argument, NULL, 0}, {0, 0, 0, 0} }; int print_bitrate=0; celt_int32 rate=44100; celt_int32 size; int chan=1; int fmt=16; int lsb=1; ogg_stream_state os; ogg_stream_state so; /* ogg stream for skeleton bitstream */ ogg_page og; ogg_packet op; int bytes_written=0, ret, result; int id=-1; CELTHeader header; char vendor_string[64]; char *comments; int comments_length; int close_in=0, close_out=0; int eos=0; float bitrate=-1; char first_bytes[12]; int wave_input=0; celt_int32 lookahead = 0; int bytes_per_packet=48; int complexity=-127; int prediction=2; int bitstream; /*Process command-line options*/ while(1) { c = getopt_long (argc, argv, "hvV", long_options, &option_index); if (c==-1) break; switch(c) { case 0: if (strcmp(long_options[option_index].name,"bitrate")==0) { bitrate = atof (optarg); } else if (strcmp(long_options[option_index].name,"vbr")==0) { with_vbr=1; } else if (strcmp(long_options[option_index].name,"skeleton")==0) { with_skeleton=1; } else if (strcmp(long_options[option_index].name,"help")==0) { usage(); exit(0); } else if (strcmp(long_options[option_index].name,"quiet")==0) { quiet = 1; } else if (strcmp(long_options[option_index].name,"version")==0) { version(); exit(0); } else if (strcmp(long_options[option_index].name,"version-short")==0) { version_short(); exit(0); } else if (strcmp(long_options[option_index].name,"le")==0) { lsb=1; } else if (strcmp(long_options[option_index].name,"be")==0) { lsb=0; } else if (strcmp(long_options[option_index].name,"8bit")==0) { fmt=8; } else if (strcmp(long_options[option_index].name,"16bit")==0) { fmt=16; } else if (strcmp(long_options[option_index].name,"stereo")==0) { chan=2; } else if (strcmp(long_options[option_index].name,"mono")==0) { chan=1; } else if (strcmp(long_options[option_index].name,"rate")==0) { rate=atoi (optarg); } else if (strcmp(long_options[option_index].name,"comp")==0) { complexity=atoi (optarg); } else if (strcmp(long_options[option_index].name,"framesize")==0) { frame_size=atoi (optarg); } else if (strcmp(long_options[option_index].name,"noltp")==0) { if (prediction>1) prediction=1; } else if (strcmp(long_options[option_index].name,"independent")==0) { prediction=0; } else if (strcmp(long_options[option_index].name,"comment")==0) { if (!strchr(optarg, '=')) { fprintf (stderr, "Invalid comment: %s\n", optarg); fprintf (stderr, "Comments must be of the form name=value\n"); exit(1); } comment_add(&comments, &comments_length, NULL, optarg); } else if (strcmp(long_options[option_index].name,"author")==0) { comment_add(&comments, &comments_length, "author=", optarg); } else if (strcmp(long_options[option_index].name,"title")==0) { comment_add(&comments, &comments_length, "title=", optarg); } break; case 'h': usage(); exit(0); break; case 'v': version(); exit(0); break; case 'V': print_bitrate=1; break; case '?': usage(); exit(1); break; } } if (argc-optind!=2) { usage(); exit(1); } inFile=argv[optind]; outFile=argv[optind+1]; /*Initialize Ogg stream struct*/ srand(time(NULL)); if (ogg_stream_init(&os, rand())==-1) { fprintf(stderr,"Error: stream init failed\n"); exit(1); } if (with_skeleton && ogg_stream_init(&so, rand())==-1) { fprintf(stderr,"Error: stream init failed\n"); exit(1); } if (strcmp(inFile, "-")==0) { #if defined WIN32 || defined _WIN32 _setmode(_fileno(stdin), _O_BINARY); #elif defined OS2 _fsetmode(stdin,"b"); #endif fin=stdin; } else { fin = fopen(inFile, "rb"); if (!fin) { perror(inFile); exit(1); } close_in=1; } { fread(first_bytes, 1, 12, fin); if (strncmp(first_bytes,"RIFF",4)==0 && strncmp(first_bytes,"RIFF",4)==0) { if (read_wav_header(fin, &rate, &chan, &fmt, &size)==-1) exit(1); wave_input=1; lsb=1; /* CHECK: exists big-endian .wav ?? */ } } if (bitrate<=0.005) if (chan==1) bitrate=64.0; else bitrate=128.0; bytes_per_packet = (bitrate*1000*frame_size/rate+4)/8; if (bytes_per_packet < 8) { bytes_per_packet=8; fprintf (stderr, "Warning: Requested bitrate (%0.3fkbit/sec) is too low. Setting CELT to 8 bytes/frame.\n",bitrate); } else if (bytes_per_packet > MAX_FRAME_BYTES) { bytes_per_packet=MAX_FRAME_BYTES; fprintf (stderr, "Warning: Requested bitrate (%0.3fkbit/sec) is too high. Setting CELT to %d bytes/frame.\n",bitrate,MAX_FRAME_BYTES); } if (with_vbr) { /*In VBR mode the bytes_per_packet argument becomes a hard maximum. 3x the average rate is just a random choice.*/ bytes_per_packet=IMIN(bytes_per_packet*3,MAX_FRAME_BYTES); } else { bitrate = ((rate/(float)frame_size)*8*bytes_per_packet)/1000.0; } mode = celt_mode_create(rate, frame_size, NULL); if (!mode) return 1; celt_mode_info(mode,CELT_GET_BITSTREAM_VERSION,&bitstream); snprintf(vendor_string, sizeof(vendor_string), "Encoded with CELT %s (bitstream: %d)\n",CELT_VERSION,bitstream); comment_init(&comments, &comments_length, vendor_string); celt_mode_info(mode, CELT_GET_FRAME_SIZE, &frame_size); celt_header_init(&header, mode, chan); header.nb_channels = chan; { char *st_string="mono"; if (chan==2) st_string="stereo"; if (!quiet) if (with_vbr) fprintf (stderr, "Encoding %d Hz %s audio in %d sample packets at %0.3fkbit/sec (%d maximum bytes per packet) with bitstream version %d\n", header.sample_rate, st_string, frame_size, bitrate, bytes_per_packet,bitstream); else fprintf (stderr, "Encoding %d Hz %s audio in %d sample packets at %0.3fkbit/sec (%d bytes per packet) with bitstream version %d\n", header.sample_rate, st_string, frame_size, bitrate, bytes_per_packet,bitstream); } /*Initialize CELT encoder*/ st = celt_encoder_create(mode, chan, NULL); if (with_vbr) { int tmp = (bitrate*1000); if (celt_encoder_ctl(st, CELT_SET_VBR_RATE(tmp)) != CELT_OK) { fprintf (stderr, "VBR request failed\n"); return 1; } } if (celt_encoder_ctl(st, CELT_SET_PREDICTION(prediction)) != CELT_OK) { fprintf (stderr, "Prediction request failed\n"); return 1; } if (complexity!=-127) { if (celt_encoder_ctl(st, CELT_SET_COMPLEXITY(complexity)) != CELT_OK) { fprintf (stderr, "Only complexity 0 through 10 is supported\n"); return 1; } } if (strcmp(outFile,"-")==0) { #if defined WIN32 || defined _WIN32 _setmode(_fileno(stdout), _O_BINARY); #endif fout=stdout; } else { fout = fopen(outFile, "wb"); if (!fout) { perror(outFile); exit(1); } close_out=1; } if (with_skeleton) { fprintf (stderr, "Warning: Enabling skeleton output may cause some decoders to fail.\n"); } /* first packet should be the skeleton header. */ if (with_skeleton) { add_fishead_packet(&so); if ((ret = flush_ogg_stream_to_file(&so, fout))) { fprintf (stderr,"Error: failed skeleton (fishead) header to output stream\n"); exit(1); } else bytes_written += ret; } /*Write header*/ { unsigned char header_data[100]; int packet_size = celt_header_to_packet(&header, header_data, 100); op.packet = header_data; op.bytes = packet_size; op.b_o_s = 1; op.e_o_s = 0; op.granulepos = 0; op.packetno = 0; ogg_stream_packetin(&os, &op); while((result = ogg_stream_flush(&os, &og))) { if(!result) break; ret = oe_write_page(&og, fout); if(ret != og.header_len + og.body_len) { fprintf (stderr,"Error: failed writing header to output stream\n"); exit(1); } else bytes_written += ret; } op.packet = (unsigned char *)comments; op.bytes = comments_length; op.b_o_s = 0; op.e_o_s = 0; op.granulepos = 0; op.packetno = 1; ogg_stream_packetin(&os, &op); } /* fisbone packet should be write after all bos pages */ if (with_skeleton) { add_fisbone_packet(&so, os.serialno, &header); if ((ret = flush_ogg_stream_to_file(&so, fout))) { fprintf (stderr,"Error: failed writing skeleton (fisbone )header to output stream\n"); exit(1); } else bytes_written += ret; } /* writing the rest of the celt header packets */ while((result = ogg_stream_flush(&os, &og))) { if(!result) break; ret = oe_write_page(&og, fout); if(ret != og.header_len + og.body_len) { fprintf (stderr,"Error: failed writing header to output stream\n"); exit(1); } else bytes_written += ret; } free(comments); /* write the skeleton eos packet */ if (with_skeleton) { add_eos_packet_to_stream(&so); if ((ret = flush_ogg_stream_to_file(&so, fout))) { fprintf (stderr,"Error: failed writing skeleton header to output stream\n"); exit(1); } else bytes_written += ret; } if (!wave_input) { nb_samples = read_samples(fin,frame_size,fmt,chan,lsb,input, first_bytes, NULL); } else { nb_samples = read_samples(fin,frame_size,fmt,chan,lsb,input, NULL, &size); } if (nb_samples==0) eos=1; total_samples += nb_samples; nb_encoded = -lookahead; /*Main encoding loop (one frame per iteration)*/ while (!eos || total_samples>nb_encoded) { id++; /*Encode current frame*/ nbBytes = celt_encode(st, input, NULL, bits, bytes_per_packet); if (nbBytes<0) { fprintf(stderr, "Got error %d while encoding. Aborting.\n", nbBytes); break; } nb_encoded += frame_size; total_bytes += nbBytes; peak_bytes=IMAX(nbBytes,peak_bytes); if (wave_input) { nb_samples = read_samples(fin,frame_size,fmt,chan,lsb,input, NULL, &size); } else { nb_samples = read_samples(fin,frame_size,fmt,chan,lsb,input, NULL, NULL); } if (nb_samples==0) { eos=1; } if (eos && total_samples<=nb_encoded) op.e_o_s = 1; else op.e_o_s = 0; total_samples += nb_samples; op.packet = (unsigned char *)bits; op.bytes = nbBytes; op.b_o_s = 0; /*Is this redundent?*/ if (eos && total_samples<=nb_encoded) op.e_o_s = 1; else op.e_o_s = 0; op.granulepos = (id+1)*frame_size-lookahead; if (op.granulepos>total_samples) op.granulepos = total_samples; /*printf ("granulepos: %d %d %d %d %d %d\n", (int)op.granulepos, id, nframes, lookahead, 5, 6);*/ op.packetno = 2+id; ogg_stream_packetin(&os, &op); /*Write all new pages (most likely 0 or 1)*/ while (ogg_stream_pageout(&os,&og)) { ret = oe_write_page(&og, fout); if(ret != og.header_len + og.body_len) { fprintf (stderr,"Error: failed writing header to output stream\n"); exit(1); } else bytes_written += ret; } } /*Flush all pages left to be written*/ while (ogg_stream_flush(&os, &og)) { ret = oe_write_page(&og, fout); if(ret != og.header_len + og.body_len) { fprintf (stderr,"Error: failed writing header to output stream\n"); exit(1); } else bytes_written += ret; } if (with_vbr && !quiet) fprintf (stderr, "Average rate %0.3fkbit/sec, %d peak bytes per packet\n", (total_bytes*8.0/((float)nb_encoded/header.sample_rate))/1000.0, peak_bytes); celt_encoder_destroy(st); celt_mode_destroy(mode); ogg_stream_clear(&os); if (close_in) fclose(fin); if (close_out) fclose(fout); return 0; } /* Comments will be stored in the Vorbis style. It is describled in the "Structure" section of http://www.xiph.org/ogg/vorbis/doc/v-comment.html The comment header is decoded as follows: 1) [vendor_length] = read an unsigned integer of 32 bits 2) [vendor_string] = read a UTF-8 vector as [vendor_length] octets 3) [user_comment_list_length] = read an unsigned integer of 32 bits 4) iterate [user_comment_list_length] times { 5) [length] = read an unsigned integer of 32 bits 6) this iteration's user comment = read a UTF-8 vector as [length] octets } 7) [framing_bit] = read a single bit as boolean 8) if ( [framing_bit] unset or end of packet ) then ERROR 9) done. If you have troubles, please write to ymnk@jcraft.com. */ #define readint(buf, base) (((buf[base+3]<<24)&0xff000000)| \ ((buf[base+2]<<16)&0xff0000)| \ ((buf[base+1]<<8)&0xff00)| \ (buf[base]&0xff)) #define writeint(buf, base, val) do{ buf[base+3]=((val)>>24)&0xff; \ buf[base+2]=((val)>>16)&0xff; \ buf[base+1]=((val)>>8)&0xff; \ buf[base]=(val)&0xff; \ }while(0) void comment_init(char **comments, int* length, char *vendor_string) { int vendor_length=strlen(vendor_string); int user_comment_list_length=0; int len=4+vendor_length+4; char *p=(char*)malloc(len); if(p==NULL){ fprintf (stderr, "malloc failed in comment_init()\n"); exit(1); } writeint(p, 0, vendor_length); memcpy(p+4, vendor_string, vendor_length); writeint(p, 4+vendor_length, user_comment_list_length); *length=len; *comments=p; } void comment_add(char **comments, int* length, char *tag, char *val) { char* p=*comments; int vendor_length=readint(p, 0); int user_comment_list_length=readint(p, 4+vendor_length); int tag_len=(tag?strlen(tag):0); int val_len=strlen(val); int len=(*length)+4+tag_len+val_len; p=(char*)realloc(p, len); if(p==NULL){ fprintf (stderr, "realloc failed in comment_add()\n"); exit(1); } writeint(p, *length, tag_len+val_len); /* length of comment */ if(tag) memcpy(p+*length+4, tag, tag_len); /* comment */ memcpy(p+*length+4+tag_len, val, val_len); /* comment */ writeint(p, 4+vendor_length, user_comment_list_length+1); *comments=p; *length=len; } #undef readint #undef writeint mumble-1.3.4/3rdparty/celt-0.7.0-src/tools/wav_io.c0000664000175000017500000001261714010707311021355 0ustar builderbuilder/* Copyright (C) 2002 Jean-Marc Valin File: wav_io.c Routines to handle wav (RIFF) headers Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include "celt_types.h" #include "wav_io.h" int read_wav_header(FILE *file, int *rate, int *channels, int *format, celt_int32 *size) { char ch[5]; celt_int32 itmp; celt_int16 stmp; celt_int32 bpersec; celt_int16 balign; int skip_bytes; int i; ch[4]=0; #if 0 fread(ch, 1, 4, file); if (strcmp(ch, "RIFF")!=0) { fseek(file, 0, SEEK_SET); return 0; } fread(&itmp, 4, 1, file); *size = le_int(itmp-36); fread(ch, 1, 4, file); if (strcmp(ch, "WAVE")!=0) { fprintf (stderr, "RIFF file is not a WAVE file\n"); return -1; } #endif fread(ch, 1, 4, file); while (strcmp(ch, "fmt ")!=0) { fread(&itmp, 4, 1, file); itmp = le_int(itmp); /*fprintf (stderr, "skip=%d\n", itmp);*/ /*strange way of seeking, but it works even for pipes*/ for (i=0;i2) { fprintf (stderr, "Only mono and (intensity) stereo supported\n"); return -1; } fread(&itmp, 4, 1, file); itmp = le_int(itmp); *rate = itmp; fread(&itmp, 4, 1, file); bpersec = le_int(itmp); fread(&stmp, 2, 1, file); balign = le_short(stmp); fread(&stmp, 2, 1, file); stmp = le_short(stmp); if (stmp!=16 && stmp!=8) { fprintf (stderr, "Only 8/16-bit linear supported\n"); return -1; } *format=stmp; if (bpersec!=*rate**channels*stmp/8) { fprintf (stderr, "Corrupted header: ByteRate mismatch\n"); return -1; } if (balign!=*channels*stmp/8) { fprintf (stderr, "Corrupted header: BlockAlign mismatch\n"); return -1; } /*strange way of seeking, but it works even for pipes*/ if (skip_bytes>0) for (i=0;i Constrained-Energy Lapped Transform (CELT) Codec Octasic Semiconductor
    4101, Molson Street, suite 300 Montreal Quebec H1Y 3L1 Canada jean-marc.valin@octasic.com
    Xiph.Org Foundation
    tterribe@xiph.org
    Juniper Networks
    2251 Corporate Park Drive, Suite 100 Herndon VA 20171-1817 USA gmaxwell@juniper.net
    Xiph.Org Foundation
    xiphmont@xiph.org
    General AVT Working Group audio codec low delay Internet-Draft CELT CELT is an open-source voice codec suitable for use in very low delay Voice over IP (VoIP) type applications. This document describes the encoding and decoding process.
    This document describes the CELT codec, which is designed for transmitting full-bandwidth audio with very low delay. It is suitable for encoding both speech and music at rates starting at 32 kbit/s. It is primarily designed for transmission over the Internet and protocols such as RTP , but also includes a certain amount of robustness to bit errors, where this could be done at no significant cost. The novel aspect of CELT compared to most other codecs is its very low delay, below 10 ms. There are two main advantages to having a very low delay audio link. The lower delay itself is important for some interactions, such as playing music remotely. Another advantage is its behavior in the presence of acoustic echo. When the round-trip audio delay is sufficiently low, acoustic echo is no longer perceived as a distinct repetition, but rather as extra reverberation. Applications of CELT include: Collaborative network music performance High-quality teleconferencing Wireless audio equipment Low-delay links for broadcast applications The source code for the reference implementation of the CELT codec is provided in . This source code is the normative specification of the codec. The corresponding text description in this document is provided for informative purposes. The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119 .
    CELT stands for Constrained Energy Lapped Transform. This is the fundamental principle of the codec: the quantization process is designed in such a way as to preserve the energy in a certain number of bands. The theoretical aspects of the codec are described in greater detail and . Although these papers describe slightly older versions of the codec (version 0.3.2 and 0.5.1, respectively), the principles remain the same. CELT is a transform codec, based on the Modified Discrete Cosine Transform (MDCT). The MDCT is derived from the DCT-IV by adding an overlap with time-domain aliasing cancellation . The main characteristics of CELT are as follows: Ultra-low algorithmic delay (scalable, typically 4 to 9 ms) Sampling rates from 32 kHz to 48 kHz and above (full audio bandwidth) Applicability to both speech and music Support for mono and stereo Adaptive bit-rate from 32 kbit/s to 128 kbit/s per channel and above Scalable complexity Robustness to packet loss (scalable trade-off between quality and loss-robustness) Open source implementation (floating-point and fixed-point) No known intellectual property issues
    This document contains a detailed description of both the encoder and the decoder, along with a reference implementation. In most circumstances, and unless otherwise stated, the calculations do not need to produce results that are bit-identical with the reference implementation, so alternate algorithms can sometimes be used. However, there are a few (clearly identified) cases, such as the bit allocation, where bit-exactness with the reference implementation is required. An implementation is considered to be compatible if, for any valid bit-stream, the decoder's output is perceptually indistinguishable from the output produced by the reference decoder. The CELT codec does not use a standard bit-packer, but rather uses a range coder to pack both integers and entropy-coded symbols. In mono mode, the bit-stream generated by the encoder contains the following parameters (in order): Feature flags I, P, S, F (2-4 bits) if P=1 Pitch period if S=1 Transient scalefactor if scalefactor=(1 or 2) AND more than 2 short MDCTs ID of block before transient if scalefactor=3 Transient time Coarse energy encoding (for each band) Fine energy encoding (for each band) For each band if P=1 and band is at the beginning of a pitch band Pitch gain bit PVQ indices More fine energy (using all remaining bits) Note that due to the use of a range coder, all of the parameters have to be encoded and decoded in order. The CELT bit-stream is "octet-based" in the sense that the encoder always produces an integer number of octets when encoding a frame. Also, the bit-rate used by the CELT encoder can only be determined by the number of octets produced. In many cases (e.g. UDP/RTP), the transport layer already encodes the data length, so no extra information is necessary to signal the bit-rate. In cases where this is not true, or when there are multiple compressed frames per packet, the size of each compressed frame MUST be signalled in some way.
    The operation of both the encoder and decoder depends on the mode data. A mode definition can be created by celt_create_mode() (modes.c) based on three parameters: frame size (number of samples) sampling rate (samples per second) number of channels (1 or 2) The frame size can be any even number of samples from 64 to 1024, inclusively. The sampling rate must be between 32000 Hz and 96000 Hz. The mode data that is created defines how the encoder and the decoder operate. More specifically, the following information is contained in the mode object: Frame size Sampling rate Windowing overlap Number of channels Definition of the bands Definition of the pitch bands Decay coefficients of the Laplace distributions for coarse energy Bit allocation matrix The windowing overlap is the amount of overlap between the frames. CELT uses a low-overlap window that is typically half of the frame size. For a frame size of 256 samples, the overlap is 128 samples, so the total algorithmic delay is 256+128=384. CELT divides the audio into frequency bands, for which the energy is preserved. These bands are chosen to follow the ear's critical bands, with the exception that each band has to contain at least 3 frequency bins. The energy bands are based on the Bark scale. The Bark band edges (in Hz) are defined as [0, 100, 200, 300, 400, 510, 630, 770, 920, 1080, 1270, 1480, 1720, 2000, 2320, 2700, 3150, 3700, 4400, 5300, 6400, 7700, 9500, 12000, 15500, 20000]. The actual bands used by the codec depend on the sampling rate and the frame size being used. The mapping from Hz to MDCT bins is done by multiplying by sampling_rate/(2*frame_size) and rounding to the nearest value. An exception is made for the lower frequencies to ensure that all bands contain at least 3 MDCT bins. The definition of the Bark bands is computed in compute_ebands() (modes.c). CELT includes a pitch predictor for which the gains are defined over a set of pitch bands. The pitch bands are defined (in Hz) as [0, 345, 689, 1034, 1378, 2067, 3273, 5340, 6374]. The Hz values are mapped to MDCT bins in the same was as the energy bands. The pitch band boundaries are aligned to energy band boundaries. The definition of the pitch bands is computed in compute_pbands() (modes.c). The mode contains a bit allocation table that is derived from a prototype allocation table, specified in the band_allocation matrix (modes.c). Each row of the table is a single prototype allocation, in bits per Bark band, and assuming 256-sample frames. These rows must be projected onto the actual band layout in use at the current frame size and sample rate, using exact integer calculations. The reference implementation pre-computes these projections in compute_allocation_table() (modes.c) and any other implementation MUST produces bit-identical allocation results. Every entry in the allocation table is multiplied by the current number of channels and the current frame size. Each prototype allocation is projected independently using the following process: the upper band frequencies (in Hz) from the current Bark band and current CELT band are compared. (When the process begins, these will each be the first band, but will increment independently.) If the current Bark band's upper edge frequency is less than the current CELT band's upper edge frequency, the entire value of the Bark band plus any carried remainder is assigned to the current CELT band, and the process continues with the next Bark band in sequence and zero remainder. If the current Bark band's upper edge frequency is equal to or greater than that of the current CELT band, the CELT band will receive only part of this Bark band's allocation. This portion allocated to the CELT band is then calculated by multiplying the Bark band's allocation by the difference in Hz between the Bark band's upper frequency and the current CELT band's lower frequency, adding the width of the current Bark band divided by two, and then dividing this total by the width of the current Bark band in Hz. The partial value plus any carried remainder is added to the current CELT band, and the difference between the partial value and the Bark target is taken as the new carried remainder. The process begins then again starting at the next CELT band and next Bark band. Once all bands in a prototype allocation have been considered, any remainder is added to the last CELT band. All of the resulting values are rescaled by adding 128 and dividing by 256.
    The top-level function for encoding a CELT frame in the reference implementation is celt_encode() (celt.c). The basic block diagram of the CELT encoder is illustrated in . The encoder contains most of the building blocks of the decoder and can, with very little extra computation, compute the signal that would be decoded by the decoder. CELT has three main quantizers denoted Q1, Q2 and Q3. These apply to band energies (), pitch gains () and normalized MDCT bins (), respectively.
    |Q1|-------------+ | |computation| | +--+ | | +-----------+ | | | +-----+ | | v v +------+ +-+--+ +---+ +---+ +--+ +-----+ +---+ +-----+ -->|Window|->|MDCT|---->| / |-+>| - |->|Q3|->| Mix |->| * |->|IMDCT|-+ +---+--+ +----+ +---+ | +---+ +--+ +-----+ +---+ +-----+ | | | ^ ^ ^ | | | +------+------+ | +-+ v | | | +-----------+ +--+ +-+-+ | | |pitch gains|->|Q2|-->| * | | | +-----------+ +--+ +---+ | | ^ ^ | | +-----------------+ | v | | +------------+ +------+-----+ | |Pitch period| |Delay, MDCT,| | |estimation |----------------------->| Normalize | | +------------+ +------------+ | ^ ^ | +--------------------------------------+--------------------+ ]]> Block diagram of the CELT encoder
    The input audio first goes through a pre-emphasis filter (just before the windowing in ), which attenuates the spectral tilt. The filter is has the transfer function A(z)=1-alpha_p*z^-1, with alpha_p=0.8. The inverse of the pre-emphasis is applied at the decoder.
    CELT uses an entropy coder based upon , which is itself a rediscovery of the FIFO arithmetic code introduced by . It is very similar to arithmetic encoding, except that encoding is done with digits in any base instead of with bits, so it is faster when using larger bases (i.e.: an octet). All of the calculations in the range coder must use bit-exact integer arithmetic. The range coder also acts as the bit-packer for CELT. It is used in three different ways, to encode: entropy-coded symbols with a fixed probability model using ec_encode(), (rangeenc.c) integers from 0 to 2^M-1 using ec_enc_uint() or ec_enc_bits(), (entenc.c) integers from 0 to N-1 (where N is not a power of two) using ec_enc_uint(). (entenc.c) The range encoder maintains an internal state vector composed of the four-tuple (low,rng,rem,ext), representing the low end of the current range, the size of the current range, a single buffered output octet, and a count of additional carry-propagating output octets. Both rng and low are 32-bit unsigned integer values, rem is an octet value or the special value -1, and ext is an integer with at least 16 bits. This state vector is initialized at the start of each each frame to the value (0,2^31,-1,0). Each symbol is drawn from a finite alphabet and coded in a separate context which describes the size of the alphabet and the relative frequency of each symbol in that alphabet. CELT only uses static contexts; they are not adapted to the statistics of the data that is coded.
    The main encoding function is ec_encode() (rangeenc.c), which takes as an argument a three-tuple (fl,fh,ft) describing the range of the symbol to be encoded in the current context, with 0 <= fl < fh <= ft <= 65535. The values of this tuple are derived from the probability model for the symbol. Let f(i) be the frequency of the ith symbol in the current context. Then the three-tuple corresponding to the kth symbol is given by ec_encode() updates the state of the encoder as follows. If fl is greater than zero, then low = low + rng - (rng/ft)*(ft-fl) and rng = (rng/ft)*(fh-fl). Otherwise, low is unchanged and rng = rng - (rng/ft)*(fh-fl). The divisions here are exact integer division. After this update, the range is normalized. To normalize the range, the following process is repeated until rng > 2^23. First, the top 9 bits of low, (low>>23), are placed into a carry buffer. Then, low is set to . This process is carried out by ec_enc_normalize() (rangeenc.c). The 9 bits produced in each iteration of the normalization loop consist of 8 data bits and a carry flag. The final value of the output bits is not determined until carry propagation is accounted for. Therefore the reference implementation buffers a single (non-propagating) output octet and keeps a count of additional propagating (0xFF) output octets. An implementation MAY choose to use any mathematically equivalent scheme to perform carry propagation. The function ec_enc_carry_out() (rangeenc.c) performs this buffering. It takes a 9-bit input value, c, from the normalization 8-bit output and a carry bit. If c is 0xFF, then ext is incremented and no octets are output. Otherwise, if rem is not the special value -1, then the octet (rem+(c>>8)) is output. Then ext octets are output with the value 0 if the carry bit is set, or 0xFF if it is not, and rem is set to the lower 8 bits of c. After this, ext is set to zero. In the reference implementation, a special version of ec_encode() called ec_encode_bin() (rangeenc.c) is defined to take a two-tuple (fl,ftb), where , but avoids using division.
    Functions ec_enc_uint() or ec_enc_bits() are based on ec_encode() and encode one of N equiprobable symbols, each with a frequency of 1, where N may be as large as 2^32-1. Because ec_encode() is limited to a total frequency of 2^16-1, this is done by encoding a series of symbols in smaller contexts. ec_enc_bits() (entenc.c) is defined, like ec_encode_bin(), to take a two-tuple (fl,ftb), with >ftb-8&0xFF) using ec_encode_bin() and subtracts 8 from ftb. Then, it encodes the remaining bits of fl, e.g., (fl&(1<, again using ec_encode_bin(). ec_enc_uint() (entenc.c) takes a two-tuple (fl,ft), where ft is not necessarily a power of two. Let ftb be the location of the highest 1 bit in the two's-complement representation of (ft-1), or -1 if no bits are set. If ftb>8, then the top 8 bits of fl are encoded using ec_encode() with the three-tuple (fl>>ftb-8,(fl>>ftb-8)+1,(ft-1>>ftb-8)+1), and the remaining bits are encoded with ec_enc_bits using the two-tuple .
    After all symbols are encoded, the stream must be finalized by outputting a value inside the current range. Let end be the integer in the interval [low,low+rng) with the largest number of trailing zero bits. Then while end is not zero, the top 9 bits of end, e.g., >23), are sent to the carry buffer, and end is replaced by (end<<8&0x7FFFFFFF). Finally, if the value in carry buffer, rem, is]]> neither zero nor the special value -1, or the carry count, ext, is greater than zero, then 9 zero bits are sent to the carry buffer. After the carry buffer is finished outputting octets, the rest of the output buffer is padded with zero octets. Finally, rem is set to the special value -1. This process is implemented by ec_enc_done() (rangeenc.c).
    The bit allocation routines in CELT need to be able to determine a conservative upper bound on the number of bits that have been used to encode the current frame thus far. This drives allocation decisions and ensures that the range code will not overflow the output buffer. This is computed in the reference implementation to fractional bit precision by the function ec_enc_tell() (rangeenc.c). Like all operations in the range encoder, it must be implemented in a bit-exact manner.
    The CELT codec has several optional features that can be switched on or off in each frame, some of which are mutually exclusive. The four main flags are intra-frame energy (I), pitch (P), short blocks (S), and folding (F). Those are described in more detail below. There are eight valid combinations of these four features, and they are encoded into the stream first using a variable length code (). It is left to the implementor to choose when to enable each of the flags, with the only restriction that the combination of the four flags MUST correspond to a valid entry in . Encoding of the feature flags I P S F Encoding 000100 010101 1001110 1011111 00001000 00111001 01001010 10001011
    CELT uses prediction to encode the energy in each frequency band. In order to make frames independent, however, it is possible to disable the part of the prediction that depends on previous frames. This is called intra-frame energy and requires around 12 more bits per frame. It is enabled with the I bit (Table. flags-encoding). The use of intra energy is OPTIONAL and the decision method is left to the implementor. The reference code describes one way of deciding which frames would benefit most from having their energy encoded without prediction. The intra_decision() (quant_bands.c) function looks for frames where the log-spectral distance between consecutive frames is more than 9 dB. When such a difference is found between two frames, the next frame (not the one for which the difference is detected) is marked encoded with intra energy. The one-frame delay is to ensure that when a frame containing a transient is lost, then the next frame will be decoded without accumulating error from the lost frame.
    CELT can use a pitch predictor (also known as long-term predictor) to improve the voice quality at lower bit-rates. While the pitch period can be estimated in any way, it is RECOMMENDED for performance reasons to estimate it using a frequency-domain correlation between the current frame and the history buffer, as implemented in find_spectral_pitch() (pitch.c). When the P bit is set, the pitch period is encoded after the flag bits. The value encoded is an integer in the range [0, 1024-N-overlap-1].
    To improve audio quality during transients, CELT can use a short block multiple-MDCT transform. Unlike other transform codecs, the multiple MDCTs are jointly quantized as if the coefficients were obtained from a single MDCT. For that reason, it is better to consider the short block case as using a different transform of the same length rather than as multiple independent MDCTs. In the reference implementation, the decision to use short blocks is made by transient_analysis() (celt.c) based on the pre-emphasized signal's peak values, but other methods can be used. When the S bit is set, a 2-bit transient scalefactor is encoded directly after the flag bits. If the scalefactor is 0, then the multiple-MDCT output is unmodified. If the scalefactor is 1 or 2, then the output of the MDCTs that follow the transient is scaled down by 2^scalefactor. If the scalefactor is equal to 3, then a time-domain pre-emphasis window is applied before computing the MDCTs and no further scaling is applied to the MDCTs output. The window value is 1 from the beginning of the frame to 16 samples before the transient time. It is a Hanning window from there to the transient time, and then the value is 1/8 up to the end of the frame. The Hanning window part is defined as: static const float transientWindow[16] = { 0.0085135, 0.0337639, 0.0748914, 0.1304955, 0.1986827, 0.2771308, 0.3631685, 0.4538658, 0.5461342, 0.6368315, 0.7228692, 0.8013173, 0.8695045, 0.9251086, 0.9662361, 0.9914865}; When the scalefactor is 3, the transient time is the exact time of the transient determined by the encoder and encoded as an integer number of samples with the range [0, N+overlap-1] directly after the scalefactor. In the case where the scalefactor is 1 or 2 and the mode is defined to use more than 2 MDCTs, the last MDCT to which the scaling is not applied is encoded using an integer in the range [0, B-2], where B is the number of short MDCTs used for the mode.
    The last encoding feature in CELT is spectral folding. It is designed to prevent birdie artifacts caused by the sparse spectra often generated by low-bitrate transform codecs. When folding is enabled, a copy of the low-frequency spectrum is added to the higher-frequency bands (above ~6400 Hz). The folding operation is described in more detail in .
    The MDCT implementation has no special characteristics. The input is a windowed signal (after pre-emphasis) of 2*N samples and the output is N frequency-domain samples. A low-overlap window is used to reduce the algorithmic delay. It is derived from a basic (full overlap) window that is the same as the one used in the Vorbis codec: W(n)=[sin(pi/2*sin(pi/2*(n+.5)/L))]^2. The low-overlap window is created by zero-padding the basic window and inserting ones in the middle, such that the resulting window still satisfies power complementarity. The MDCT is computed in mdct_forward() (mdct.c), which includes the windowing operation and a scaling of 2/N.
    The MDCT output is divided into bands that are designed to match the ear's critical bands, with the exception that each band has to be at least 3 bins wide. For each band, the encoder computes the energy that will later be encoded. Each band is then normalized by the square root of the non-quantized energy, such that each band now forms a unit vector X. The energy and the normalization are computed by compute_band_energies() and normalise_bands() (bands.c), respectively.
    It is important to quantize the energy with sufficient resolution because any energy quantization error cannot be compensated for at a later stage. Regardless of the resolution used for encoding the shape of a band, it is perceptually important to preserve the energy in each band. CELT uses a coarse-fine strategy for encoding the energy in the base-2 log domain, as implemented in quant_bands.c
    The coarse quantization of the energy uses a fixed resolution of 6 dB and is the only place where entropy coding is used. To minimize the bitrate, prediction is applied both in time (using the previous frame) and in frequency (using the previous bands). The 2-D z-transform of the prediction filter is: A(z_l, z_b)=(1-a*z_l^-1)*(1-z_b^-1)/(1-b*z_b^-1) where b is the band index and l is the frame index. The prediction coefficients are a=0.8 and b=0.7 when not using intra energy and a=b=0 when using intra energy. The time-domain prediction is based on the final fine quantization of the previous frame, while the frequency domain (within the current frame) prediction is based on coarse quantization only (because the fine quantization has not been computed yet). We approximate the ideal probability distribution of the prediction error using a Laplace distribution. The coarse energy quantization is performed by quant_coarse_energy() and quant_coarse_energy() (quant_bands.c). The Laplace distribution for each band is defined by a 16-bit (Q15) decay parameter. Thus, the value 0 has a frequency count of p[0]=2*(16384*(16384-decay)/(16384+decay)). The values +/- i each have a frequency count p[i] = (p[i-1]*decay)>>14. The value of p[i] is always rounded down (to avoid exceeding 32768 as the sum of all frequency counts), so it is possible for the sum to be less than 32768. In that case additional values with a frequency count of 1 are encoded. The signed values corresponding to symbols 0, 1, 2, 3, 4, ... are [0, +1, -1, +2, -2, ...]. The encoding of the Laplace-distributed values is implemented in ec_laplace_encode() (laplace.c).
    After the coarse energy quantization and encoding, the bit allocation is computed () and the number of bits to use for refining the energy quantization is determined for each band. Let B_i be the number of fine energy bits for band i; the refinement is an integer f in the range [0,2^B_i-1]. The mapping between f and the correction applied to the coarse energy is equal to (f+1/2)/2^B_i - 1/2. Fine energy quantization is implemented in quant_fine_energy() (quant_bands.c). If any bits are unused at the end of the encoding process, these bits are used to increase the resolution of the fine energy encoding in some bands. Priority is given to the bands for which the allocation () was rounded down. At the same level of priority, lower bands are encoded first. Refinement bits are added until there are no unused bits. This is implemented in quant_energy_finalise() (quant_bands.c).
    Bit allocation is performed based only on information available to both the encoder and decoder. The same calculations are performed in a bit-exact manner in both the encoder and decoder to ensure that the result is always exactly the same. Any mismatch would cause an error in the decoded output. The allocation is computed by compute_allocation() (rate.c), which is used in both the encoder and the decoder. For a given band, the bit allocation is nearly constant across frames that use the same number of bits for Q1, yielding a pre-defined signal-to-mask ratio (SMR) for each band. Because the bands each have a width of one Bark, this is equivalent to modeling the masking occurring within each critical band, while ignoring inter-band masking and tone-vs-noise characteristics. While this is not an optimal bit allocation, it provides good results without requiring the transmission of any allocation information. For every encoded or decoded frame, a target allocation must be computed using the projected allocation. In the reference implementation this is performed by compute_allocation() (rate.c). The target computation begins by calculating the available space as the number of whole bits which can be fit in the frame after Q1 is stored according to the range coder (ec_[enc/dec]_tell()), and iff the frame has pitch prediction, subtracting the number of pitch bands and then multiplying by 16. Then the two projected prototype allocations whose sums multiplied by 16 are nearest to that value are determined. These two projected prototype allocations are then interpolated by finding the highest integer interpolation coefficient in the range 0-16 such that the sum of the higher prototype times the coefficient, plus the sum of the lower prototype multiplied by the difference of 16 and the coefficient, is less than or equal to the available sixteenth-bits. The reference implementation performs this step using a binary search in interp_bits2pulses() (rate.c). The target allocation is the interpolation coefficient times the higher prototype, plus the lower prototype multiplied by the difference of 16 and the coefficient, for each of the CELT bands. Because the computed target will sometimes be somewhat smaller than the available space, the excess space is divided by the number of bands, and this amount is added equally to each band. Any remaining space is added to the target one sixteenth-bit at a time, starting from the first band. The new target now matches the available space, in sixteenth-bits, exactly. The allocation target is separated into a portion used for fine energy and a portion used for the Spherical Vector Quantizer (PVQ). The fine energy quantizer operates in whole-bit steps. For each band the number of bits per channel used for fine energy is calculated by 50 minus the log2_frac(), with 1/16 bit precision, of the number of MDCT bins in the band. That result is multiplied by the number of bins in the band and again by twice the number of channels, and then the value is set to zero if it is less than zero. Added to that result is 16 times the number of MDCT bins times the number of channels, and it is finally divided by 32 times the number of MDCT bins times the number of channels. If the result times the number of channels is greater than than the target divided by 16, the result is set to the target divided by the number of channels divided by 16. Then if the value is greater than 7 it is reset to 7 because a larger amount of fine energy resolution was determined not to be make an improvement in perceived quality. The resulting number of fine energy bits per channel is then multiplied by the number of channels and then by 16, and subtracted from the target allocation. This final target allocation is what is used for the PVQ.
    The pitch period T is computed in the frequency domain using a generalized cross-correlation, as implemented in find_spectral_pitch() (pitch.c). An MDCT is then computed on the synthesis signal memory using the offset T. If there is sufficient energy in this part of the signal, the pitch gain for each pitch band is computed as g_a = X^T*p, where X is the normalized (non-quantized) signal and p is the normalized pitch MDCT. The gain is computed by compute_pitch_gain() (bands.c), and if a sufficient number of bands have a high enough gain, then the pitch bit is set. Otherwise, no use of pitch is made. For frequencies above the highest pitch band (~6374 Hz), the pitch prediction is replaced by spectral folding if and only if the folding bit is set. Spectral folding is implemented in intra_fold() (vq.c). If the folding bit is not set, then the prediction is simply set to zero. The folding prediction uses the quantized spectrum at lower frequencies with a gain that depends both on the width of the band, N, and the number of pulses allocated, K: g_a = N / (N + 2*K*(K+1)), When the short block bit is not set, the spectral copy is performed starting with bin 0 (DC) and going up. When the short block bit is set, then the starting point is chosen between 0 and B-1 in such a way that the source and destination bins belong to the same MDCT (i.e., to prevent the folding from causing pre-echo). Before the folding operation, each band of the source spectrum is multiplied by sqrt(N) so that the expected value of the squared value for each bin is equal to 1. The copied spectrum is then renormalized to have norm (||p|| = g_a). For stereo streams, the folding is performed independently for each channel.
    CELT uses a Pyramid Vector Quantization (PVQ) codebook for quantizing the details of the spectrum in each band that have not been predicted by the pitch predictor. The PVQ codebook consists of all sums of K signed pulses in a vector of N samples, where two pulses at the same position are required to have the same sign. Thus the codebook includes all integer codevectors y of N dimensions that satisfy sum(abs(y(j))) = K. In bands where neither pitch nor folding is used, the PVQ is used to encode the unit vector that results from the normalization in directly. Given a PVQ codevector y, the unit vector X is obtained as X = y/||y||, where ||.|| denotes the L2 norm. In the case where a pitch prediction or a folding vector p is used, the quantized unit vector X' becomes: X' = p' + g_f * y, where g_f = ( sqrt( (y^T*p')^2 + ||y||^2*(1-||p'||^2) ) - y^T*p' ) / ||y||^2, and p' = g_a * p. The combination of the pitch with the PVQ codeword is described in mix_pitch_and_residual() (vq.c) and is used in both the encoder and the decoder.
    Although the allocation is performed in 1/16 bit units, the quantization requires an integer number of pulses K. To do this, the encoder searches for the value of K that produces the number of bits that is the nearest to the allocated value (rounding down if exactly half-way between two values), subject to not exceeding the total number of bits available. The computation is performed in 1/16 of bits using log2_frac() and ec_enc_tell(). The number of codebooks entries can be computed as explained in . The difference between the number of bits allocated and the number of bits used is accumulated to a balance (initialised to zero) that helps adjusting the allocation for the next bands. One third of the balance is subtracted from the bit allocation of the next band to help achieving the target allocation. The only exceptions are the band before the last and the last band, for which half the balance and the whole balance are subtracted, respectively.
    The search for the best codevector y is performed by alg_quant() (vq.c). There are several possible approaches to the search with a tradeoff between quality and complexity. The method used in the reference implementation computes an initial codeword y1 by projecting the residual signal R = X - p' onto the codebook pyramid of K-1 pulses: y0 = round_towards_zero( (K-1) * R / sum(abs(R))) Depending on N, K and the input data, the initial codeword y0 may contain from 0 to K-1 non-zero values. All the remaining pulses, with the exception of the last one, are found iteratively with a greedy search that minimizes the normalized correlation between y and R: J = -R^T*y / ||y|| The last pulse is the only one considering the pitch and minimizes the cost function : J = -g_f * R^T*y + (g_f)^2 * ||y||^2 The search described above is considered to be a good trade-off between quality and computational cost. However, there are other possible ways to search the PVQ codebook and the implementors MAY use any other search methods.
    The best PVQ codeword is encoded as a uniformly-distributed integer value by encode_pulses() (cwrs.c). The codeword is converted to a unique index in the same way as specified in . The indexing is based on the calculation of V(N,K) (denoted N(L,K) in ), which is the number of possible combinations of K pulses in N samples. The number of combinations can be computed recursively as V(N,K) = V(N+1,K) + V(N,K+1) + V(N+1,K+1), with V(N,0) = 1 and V(0,K) = 0, K != 0. There are many different ways to compute V(N,K), including pre-computed tables and direct use of the recursive formulation. The reference implementation applies the recursive formulation one line (or column) at a time to save on memory use, along with an alternate, univariate recurrence to initialise an arbitrary line, and direct polynomial solutions for small N. All of these methods are equivalent, and have different trade-offs in speed, memory usage, and code size. Implementations MAY use any methods they like, as long as they are equivalent to the mathematical definition. The indexing computations are performed using 32-bit unsigned integers. For large codebooks, 32-bit integers are not sufficient. Instead of using 64-bit integers (or more), the encoding is made slightly sub-optimal by splitting each band into two equal (or near-equal) vectors of size (N+1)/2 and N/2, respectively. The number of pulses in the first half, K1, is first encoded as an integer in the range [0,K]. Then, two codebooks are encoded with V((N+1)/2, K1) and V(N/2, K-K1). The split operation is performed recursively, in case one (or both) of the split vectors still requires more than 32 bits. For compatibility reasons, the handling of codebooks of more than 32 bits MUST be implemented with the splitting method, even if 64-bit arithmetic is available.
    When encoding a stereo stream, some parameters are shared across the left and right channels, while others are transmitted separately for each channel, or jointly encoded. Only one copy of the flags for the features, transients and pitch (pitch period and gains) are transmitted. The coarse and fine energy parameters are transmitted separately for each channel. Both the coarse energy and fine energy (including the remaining fine bits at the end of the stream) have the left and right bands interleaved in the stream, with the left band encoded first. The main difference between mono and stereo coding is the PVQ coding of the normalized vectors. In stereo mode, a normalized mid-side (M-S) encoding is used. Let L and R be the normalized vector of a certain band for the left and right channels, respectively. The mid and side vectors are computed as M=L+R and S=L-R and no longer have unit norm. From M and S, an angular parameter theta=2/pi*atan2(||S||, ||M||) is computed. The theta parameter is converted to a Q14 fixed-point parameter itheta, which is quantized on a scale from 0 to 1 with an interval of 2^-qb, where qb = (b-2*(N-1)*(40-log2_frac(N,4)))/(32*(N-1)), b is the number of bits allocated to the band, and log2_frac() is defined in cwrs.c. From here on, the value of itheta MUST be treated in a bit-exact manner since both the encoder and decoder rely on it to infer the bit allocation. Let m=M/||M|| and s=S/||S||; m and s are separately encoded with the PVQ encoder described in . The number of bits allocated to m and s depends on the value of itheta. The number of bits allocated to coding m is obtained by: imid = bitexact_cos(itheta); iside = bitexact_cos(16384-itheta); delta = (N-1)*(log2_frac(iside,6)-log2_frac(imid,6))>>2; qalloc = log2_frac((1<<qb)+1,4); mbits = (b-qalloc/2-delta)/2; where bitexact_cos() is a fixed-point cosine approximation that MUST be bit-exact with the reference implementation in mathops.h. The spectral folding operation is performed independently for the mid and side vectors.
    After all the quantization is completed, the quantized energy is used along with the quantized normalized band data to resynthesize the MDCT spectrum. The inverse MDCT () and the weighted overlap-add are applied and the signal is stored in the synthesis buffer so it can be used for pitch prediction. The encoder MAY omit this step of the processing if it knows that it will not be using the pitch predictor for the next few frames. If the de-emphasis filter () is applied to this resynthesized signal, then the output will be the same (within numerical precision) as the decoder's output.
    Each CELT frame can be encoded in a different number of octets, making it possible to vary the bitrate at will. This property can be used to implement source-controlled variable bitrate (VBR). Support for VBR is OPTIONAL for the encoder, but a decoder MUST be prepared to decode a stream that changes its bit-rate dynamically. The method used to vary the bit-rate in VBR mode is left to the implementor, as long as each frame can be decoded by the reference decoder.
    Like most audio codecs, the CELT decoder is less complex than the encoder, as can be observed in the decoder block diagram in . In fact, most of the operations performed by the decoder are also performed by the encoder.
    | Mix |->| * |->|IMDCT|-+-> output +--+ +-----+ +---+ +-----+ | ^ ^ | +------+ | | | +--+ +-+-+ | |Q2|-->| * | | +--+ +---+ | ^ | | | +------+-----+ | +------------+ |Delay, MDCT,| | |Pitch period|->| Normalize | | +------------+ +------------+ | ^ | +--------------------+ ]]> Block diagram of the CELT decoder
    The decoder extracts information from the range-coded bit-stream in the same order as it was encoded by the encoder. In some circumstances, it is possible for a decoded value to be out of range due to a very small amount of redundancy in the encoding of large integers by the range coder. In that case, the decoder should assume there has been an error in the coding, decoding, or transmission and SHOULD take measures to conceal the error and/or report to the application that a problem has occurred.
    The range decoder extracts the symbols and integers encoded using the range encoder in . The range decoder maintains an internal state vector composed of the two-tuple (dif,rng), representing the difference between the high end of the current range and the actual coded value, and the size of the current range, respectively. Both dif and rng are 32-bit unsigned integer values. rng is initialized to 2^7. dif is initialized to rng minus the top 7 bits of the first input octet. Then the range is immediately normalized, using the procedure described in the following section.
    Decoding symbols is a two-step process. The first step determines a value fs that lies within the range of some symbol in the current context. The second step updates the range decoder state with the three-tuple (fl,fh,ft) corresponding to that symbol, as defined in . The first step is implemented by ec_decode() (rangedec.c), and computes fs = ft-min((dif-1)/(rng/ft)+1,ft), where ft is the sum of the frequency counts in the current context, as described in . The divisions here are exact integer division. In the reference implementation, a special version of ec_decode() called ec_decode_bin() (rangeenc.c) is defined using the parameter ftb instead of ft. It is mathematically equivalent to calling ec_decode() with ft = (1<<ftb), but avoids one of the divisions. The decoder then identifies the symbol in the current context corresponding to fs; i.e., the one whose three-tuple (fl,fh,ft) satisfies fl <= fs < fh. This tuple is used to update the decoder state according to dif = dif - (rng/ft)*(ft-fh), and if fl is greater than zero, rng = (rng/ft)*(fh-fl), or otherwise rng = rng - (rng/ft)*(ft-fh). After this update, the range is normalized. To normalize the range, the following process is repeated until rng > 2^23. First, rng is set to (rng<8)&0xFFFFFFFF. Then the next 8 bits of input are read into sym, using the remaining bit from the previous input octet as the high bit of sym, and the top 7 bits of the next octet for the remaining bits of sym. If no more input octets remain, zero bits are used instead. Then, dif is set to (dif<<8)-sym&0xFFFFFFFF (i.e., using wrap-around if the subtraction overflows a 32-bit register). Finally, if dif is larger than 2^31, dif is then set to dif - 2^31. This process is carried out by ec_dec_normalize() (rangedec.c).
    Functions ec_dec_uint() or ec_dec_bits() are based on ec_decode() and decode one of N equiprobable symbols, each with a frequency of 1, where N may be as large as 2^32-1. Because ec_decode() is limited to a total frequency of 2^16-1, this is done by decoding a series of symbols in smaller contexts. ec_dec_bits() (entdec.c) is defined, like ec_decode_bin(), to take a single parameter ftb, with ftb < 32. and ftb < 32, and produces an ftb-bit decoded integer value, t, initialized to zero. While ftb is greater than 8, it decodes the next 8 most significant bits of the integer, s = ec_decode_bin(8), updates the decoder state with the 3-tuple (s,s+1,256), adds those bits to the current value of t, t = t<<8 | s, and subtracts 8 from ftb. Then it decodes the remaining bits of the integer, s = ec_decode_bin(ftb), updates the decoder state with the 3 tuple (s,s+1,1<<ftb), and adds those bits to the final values of t, t = t<<ftb | s. ec_dec_uint() (entdec.c) takes a single parameter, ft, which is not necessarily a power of two, and returns an integer, t, with a value between 0 and ft-1, inclusive, which is initialized to zero. Let ftb be the location of the highest 1 bit in the two's-complement representation of (ft-1), or -1 if no bits are set. If ftb>8, then the top 8 bits of t are decoded using t = ec_decode((ft-1>>ftb-8)+1), the decoder state is updated with the three-tuple (s,s+1,(ft-1>>ftb-8)+1), and the remaining bits are decoded with t = t<<ftb-8|ec_dec_bits(ftb-8). If, at this point, t >= ft, then the current frame is corrupt, and decoding should stop. If the original value of ftb was not greater than 8, then t is decoded with t = ec_decode(ft), and the decoder state is updated with the three-tuple (t,t+1,ft).
    The bit allocation routines in CELT need to be able to determine a conservative upper bound on the number of bits that have been used to decode from the current frame thus far. This drives allocation decisions which must match those made in the encoder. This is computed in the reference implementation to fractional bit precision by the function ec_dec_tell() (rangedec.c). Like all operations in the range decoder, it must be implemented in a bit-exact manner, and must produce exactly the same value returned by ec_enc_tell() after encoding the same symbols.
    The energy of each band is extracted from the bit-stream in two steps according to the same coarse-fine strategy used in the encoder. First, the coarse energy is decoded in unquant_coarse_energy() (quant_bands.c) based on the probability of the Laplace model used by the encoder. After the coarse energy is decoded, the same allocation function as used in the encoder is called (). This determines the number of bits to decode for the fine energy quantization. The decoding of the fine energy bits is performed by unquant_fine_energy() (quant_bands.c). Finally, like the encoder, the remaining bits in the stream (that would otherwise go unused) are decoded using unquant_energy_finalise() (quant_bands.c).
    If the pitch bit is set, then the pitch period is extracted from the bit-stream. The pitch gain bits are extracted within the PVQ decoding as encoded by the encoder. When the folding bit is set, the folding prediction is computed in exactly the same way as the encoder, with the same gain, by the function intra_fold() (vq.c).
    In order to correctly decode the PVQ codewords, the decoder must perform exactly the same bits to pulses conversion as the encoder (see ).
    The decoding of the codeword from the index is performed as specified in , as implemented in function decode_pulses() (cwrs.c).
    The spherical codebook is decoded by alg_unquant() (vq.c). The index of the PVQ entry is obtained from the range coder and converted to a pulse vector by decode_pulses() (cwrs.c). The decoded normalized vector for each band is equal to X' = p' + g_f * y, where g_f = ( sqrt( (y^T*p')^2 + ||y||^2*(1-||p'||^2) ) - y^T*p' ) / ||y||^2, and p' = g_a * p. This operation is implemented in mix_pitch_and_residual() (vq.c), which is the same function as used in the encoder.
    Just like each band was normalized in the encoder, the last step of the decoder before the inverse MDCT is to denormalize the bands. Each decoded normalized band is multiplied by the square root of the decoded energy. This is done by denormalise_bands() (bands.c).
    The inverse MDCT implementation has no special characteristics. The input is N frequency-domain samples and the output is 2*N time-domain samples, while scaling by 1/2. The output is windowed using the same low-overlap window as the encoder. The IMDCT and windowing are performed by mdct_backward (mdct.c). If a time-domain pre-emphasis window was applied in the encoder, the (inverse) time-domain de-emphasis window is applied on the IMDCT result. After the overlap-add process, the signal is de-emphasized using the inverse of the pre-emphasis filter used in the encoder: 1/A(z)=1/(1-alpha_p*z^-1).
    Packet loss concealment (PLC) is an optional decoder-side feature which SHOULD be included when transmitting over an unreliable channel. Because PLC is not part of the bit-stream, there are several possible ways to implement PLC with different complexity/quality trade-offs. The PLC in the reference implementation finds a periodicity in the decoded signal and repeats the windowed waveform using the pitch offset. The windowed waveform is overlapped in such a way as to preserve the time-domain aliasing cancellation with the previous frame and the next frame. This is implemented in celt_decode_lost() (mdct.c).
    A potential denial-of-service threat exists for data encodings using compression techniques that have non-uniform receiver-end computational load. The attacker can inject pathological datagrams into the stream which are complex to decode and cause the receiver to become overloaded. However, this encoding does not exhibit any significant non-uniformity. With the exception of the first four bits, the bit-stream produced by CELT for an unknown audio stream is not easily predictable, due to the use of entropy coding. This should make CELT less vulnerable to attacks based on plaintext guessing when encryption is used. Also, since almost all possible bit combinations can be interpreted as a valid bit-stream, it is likely more difficult to determine from the decrypted bit-stream whether a guessed decryption key is valid. When operating CELT in variable-bitrate (VBR) mode, some of the properties described above no longer hold. More specifically, the size of the packet leaks a very small, but non-zero, amount of information about both the original signal and the bit-stream plaintext.
    This document has no actions for IANA.
    The authors would also like to thank the CELT users who contributed patches, bug reports, feature requests, suggestions or comments.
    Key words for use in RFCs to Indicate Requirement Levels RTP: A Transport Protocol for real-time applications A High-Quality Speech and Audio Codec With Less Than 10 ms delay A Full-Bandwidth Audio Codec with Low Complexity and Very Low Delay The CELT ultra-low delay audio codec Modified Discrete Cosine Transform Range encoding: An algorithm for removing redundancy from a digitised message Source coding algorithms for fast data compression A Pyramid Vector Quantizer
    This appendix contains the complete source code for a floating-point reference implementation of the CELT codec written in C. This implementation is derived from version 0.6.1 of the implementation available on the , which can be compiled for either floating-point or fixed-point architectures. The implementation can be compiled with either a C89 or a C99 compiler. It is reasonably optimized for most platforms such that only architecture-specific optimizations are likely to be useful. The FFT used is a slightly modified version of the KISS-FFT package, but it is easy to substitute any other FFT library. The testcelt executable can be used to test the encoding and decoding process: [ [packet loss rate]] ]]> where "rate" is the sampling rate in Hz, "channels" is the number of channels (1 or 2), "frame size" is the number of samples in a frame (64 to 1024) and "octets per packet" is the number of octets desired for each compressed frame. The input and output files are assumed to be a 16-bit PCM file in the machine native endianness. The optional "complexity" argument can select the quality vs complexity tradeoff (0-10) and the "packet loss rate" argument simulates random packet loss (argument is in tenths or a percent).
    mumble-1.3.4/3rdparty/celt-0.7.0-src/doc/ietf/build_drafts.sh0000775000175000017500000000055714010707311023262 0ustar builderbuilder#!/bin/sh ./convert_source.sh ./ietf_source.sh #codec draft xml2rfc.tcl draft-valin-celt-codec.xml draft-valin-celt-codec.html xml2rfc.tcl draft-valin-celt-codec.xml draft-valin-celt-codec.txt #RTP draft xml2rfc.tcl draft-valin-celt-rtp-profile.xml draft-valin-celt-rtp-profile.html xml2rfc.tcl draft-valin-celt-rtp-profile.xml draft-valin-celt-rtp-profile.txt mumble-1.3.4/3rdparty/celt-0.7.0-src/doc/ietf/convert_source.sh0000775000175000017500000000337114010707311023655 0ustar builderbuilder#!/bin/sh mkdir -p source for i in `ls ../../libcelt | grep '\.[ch]$'` do #echo "
    " > source/$i #echo '' >> source/$i #echo '
    > source/$i echo '#include "substitutions.h"' > tata.c echo 'SOURCE_CODE_BEGIN' >> tata.c if echo $i | grep '\.h' > /dev/null; then cat ../../libcelt/$i | sed -e 's/=\*/= \*/' -e 's/=-/= -/' -e 's/\t/ /g' -e 's/^#/\/\/PREPROCESS_REMOVE#/' >> tata.c else cat ../../libcelt/$i | sed -e 's/=\*/= \*/' -e 's/=-/= -/' -e 's/\t/ /g' -e 's/^#include/\/\/PREPROCESS_REMOVE#include/' | sed 's/^#define/\/\/PREPROCESS_REMOVE#define/'>> tata.c fi #cat ../../libcelt/$i | sed 's/^#/\/\/PREPROCESS_REMOVE#/' >> tata.c #cat ../../libcelt/$i | sed 's/^#include/\/\/PREPROCESS_REMOVE#include/' | sed 's/^#define/\/\/PREPROCESS_REMOVE#define/'>> tata.c gcc -DHAVE_CONFIG_H -C -E -nostdinc tata.c | grep -v '^#' | sed 's/\/\/PREPROCESS_REMOVE//' | perl -ne 'if ($begin) {print $_} if (/SOURCE_CODE_BEGIN/) {$begin=1}' > tata2.c #cat ../../libcelt/$i >> tata.c #gcc -C -E -nostdinc tata.c -fdirectives-only | perl -ne 'if ($begin) {print $_} if (/SOURCE_CODE_BEGIN/) {$begin=1}' > tata2.c indent -nsc -ncdb -original -sob -i2 -bl -bli0 --no-tabs -l69 --format-all-comments tata2.c -o tata.c cat tata.c | grep -v 'include.*float_cast' | ./wrap_lines > source/$i #cat tata.c > source/$i #indent --no-tabs -l72 --format-all-comments ../../libcelt/$i -o tata.c #cat tata.c >> source/$i #echo ']]>
    ' >> source/$i #echo '
    ' >> source/$i #echo '
    ' >> source/$i done cp arch.h source/arch.h cp celt_types.h source/celt_types.h cp config.h source/config.h cp Makefile.ietf source/Makefile rm source/mfrng*.c rm source/dump_modes* rm source/header* rm source/fixed* mumble-1.3.4/3rdparty/celt-0.7.0-src/doc/ietf/wrap_lines.c0000664000175000017500000000073014010707311022561 0ustar builderbuilder#include #include int main() { int comment = 0; int col = 0; char c0, c1; c0 = getchar(); while (!feof(stdin)) { c1 = getchar(); if (c1==9) c1 = 32; if (col < 71 || c0 == 10) { putchar(c0); } else { if (c1 == 10 || c1 == 13) { putchar(c0); } else { putchar ('\\'); /*printf ("%d %d %d", col, c0, c1);*/ putchar (10); putchar (c0); col=0; } } col++; if (c0 == 10) col=0; c0 = c1; } }mumble-1.3.4/3rdparty/celt-0.7.0-src/doc/ietf/ietf_source.sh0000775000175000017500000000056414010707311023125 0ustar builderbuilder#!/bin/sh mkdir -p xml_source for i in `ls source/ | grep '\.[ch]$'` Makefile do echo "
    " > xml_source/$i echo '' >> xml_source/$i echo '
    > xml_source/$i cat source/$i >> xml_source/$i echo ']]>
    ' >> xml_source/$i echo '
    ' >> xml_source/$i echo '
    ' >> xml_source/$i donemumble-1.3.4/3rdparty/celt-0.7.0-src/doc/ietf/Makefile.ietf0000664000175000017500000000050714010707311022642 0ustar builderbuilderCC = gcc CFLAGS = -c -O2 -g LIBS = -lm OBJS = bands.o celt.o cwrs.o entcode.o entdec.o entenc.o kiss_fft.o \ kiss_fftr.o laplace.o mdct.o modes.o pitch.o psy.o \ quant_bands.o rangedec.o rangeenc.o rate.o testcelt.o vq.o .c.o: $(CC) $(CFLAGS) $< testcelt: $(OBJS) $(CC) -o $@ $(OBJS) $(LIBS) clean: rm -f testcelt *.o mumble-1.3.4/3rdparty/celt-0.7.0-src/doc/ietf/arch.h0000664000175000017500000000516514010707311021347 0ustar builderbuilder/* Copyright (C) 2003-2008 Jean-Marc Valin */ /** @file arch.h @brief Various architecture definitions for CELT */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef ARCH_H #define ARCH_H #include "celt_types.h" #define CELT_SIG_SCALE 32768. #define celt_fatal(str) _celt_fatal(str, __FILE__, __LINE__); #ifdef ENABLE_ASSERTIONS #define celt_assert(cond) {if (!(cond)) \ {celt_fatal("assertion failed: " #cond);}} #define celt_assert2(cond, message) {if (!(cond)) \ {celt_fatal("assertion failed: " #cond "\n" message);}} #else #define celt_assert(cond) #define celt_assert2(cond, message) #endif #define ABS(x) ((x) < 0 ? (-(x)) : (x)) #define ABS16(x) ((x) < 0 ? (-(x)) : (x)) #define MIN16(a,b) ((a) < (b) ? (a) : (b)) #define MAX16(a,b) ((a) > (b) ? (a) : (b)) #define ABS32(x) ((x) < 0 ? (-(x)) : (x)) #define MIN32(a,b) ((a) < (b) ? (a) : (b)) #define MAX32(a,b) ((a) > (b) ? (a) : (b)) #define IMIN(a,b) ((a) < (b) ? (a) : (b)) #define IMAX(a,b) ((a) > (b) ? (a) : (b)) #define float2int(flt) ((int)(floor(.5+flt))) #define SCALEIN(a) ((a)*CELT_SIG_SCALE) #define SCALEOUT(a) ((a)*(1/CELT_SIG_SCALE)) #ifndef GLOBAL_STACK_SIZE #ifdef FIXED_POINT #define GLOBAL_STACK_SIZE 25000 #else #define GLOBAL_STACK_SIZE 40000 #endif #endif #endif /* ARCH_H */ mumble-1.3.4/3rdparty/celt-0.7.0-src/doc/ietf/draft-valin-celt-rtp-profile.xml0000664000175000017500000007664314010707311026411 0ustar builderbuilder draft-valin-celt-rtp-profile-02 Octasic Semiconductor
    4101, Molson Street, suite 300 Montreal Quebec H1Y 3L1 Canada jean-marc.valin@octasic.com
    Juniper Networks
    2251 Corporate Park Drive, Suite 100 Herndon VA 20171-1817 USA gmaxwell@juniper.net
    General AVT Working Group I-D Internet-Draft CELT RTP CELT is an open-source voice codec suitable for use in very low delay audio communication applications, including Voice over IP (VoIP). This document describes the payload format for CELT generated bit streams within an RTP packet. Also included here are the necessary details for the use of CELT with the Session Description Protocol (SDP). At the time of this writing, the CELT bit-stream has NOT been finalized yet, and compatibility is usually broken with every new release of the codec.
    The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119 .
    CELT stands for "Constrained Energy Lapped Transform". It applies some of the CELP principles, but does everything in the frequency domain, which removes some of the limitations of CELP. CELT is suitable for both speech and music and currently features: Ultra-low algorithmic delay (as low as 2 ms) Full audio bandwidth (up to 20 kHz audio bandwidth) Support for both voice and music Stereo support Packet loss concealment Constant bitrates from under 32 kbps to 128 kbps and above Free software/open-source
    For RTP based transportation of CELT encoded audio the standard RTP header is followed by one or more payload data blocks. An optional padding terminator may also be used.
    The RTP header is defined in the RTP specification . This section defines how fields in the RTP header are used. Padding (P): 1 bit If the padding bit is set, the packet contains one or more additional padding octets at the end which are not part of the payload. The last octet of the padding contains a count of how many padding octets should be ignored, including itself. Padding may be needed by some encryption algorithms with fixed block sizes or for carrying several RTP packets in a lower-layer protocol data unit. Extension (X): 1 bit If the extension, X, bit is set, the fixed header MUST be followed by exactly one header extension, with a format defined in Section 5.3.1. of . Marker (M): 1 bit The M bit MUST be set to zero in all packets. The receiver MUST ignore the M bit. Payload Type (PT): 7 bits Payload Type (PT): The assignment of an RTP payload type for this packet format is outside the scope of this document; it is specified by the RTP profile under which this payload format is used, or signaled dynamically out-of-band (e.g., using SDP). Timestamp: 32 bits A timestamp representing the sampling time of the first sample of the first CELT frame in the RTP payload. The clock frequency MUST be set to the sample rate of the encoded audio data and is conveyed out-of-band (e.g., as an SDP parameter).
    For the purposes of packetizing the bit stream in RTP, it is only necessary to consider the sequence of bits as output by the CELT encoder , and present the same sequence to the decoder. The payload format described here maintains this sequence. A typical CELT frame, encoded at a high bitrate, is approx. 128 octets and the total size of the CELT frames SHOULD be kept below the path MTU to prevent fragmentation. CELT frames MUST NOT be split across multiple RTP packets, An RTP packet MAY contain CELT frames of the same bit rate or of varying bit rates, since the bitrate for the frames is explicitly conveyed in band with the signal. The encoding and decoding algorithm can change the bit rate at any frame boundary, with the bit rate change notification provided in-band. No out-of-band notification is required for the decoder to process changes in the bit rate sent by the encoder. More than one frame may be encoded in the same RTP packet, and for the decoder it is not possible to determine the compressed size (bit-rate) of each encoded frame. Thus the compressed size information MUST be explicitly transmitted. There are two modes for conveying this information: either the compressed size(s) are encoded for each frame at the beginning of the RTP payload , or it is conveyed in the signaling and then fixed for the duration of the session (Low-Overhead Mode, ). Note that the compressed frame size information must be present either way even if only single frames are transmitted per RTP packet. It is RECOMMENDED that sampling rates 32000, 44100, or 48000 Hz be used for most applications, unless a specific reason exists -- such as requirements for a very specific packetization time. For example, 51200 Hz sampling may be useful to obtain a 5 ms packetization time with 256-sample frames. For compatibility reasons, the sender and receiver MUST support 48000 Hz sampling rate. The CELT codec always produces an integer number of bytes and can produce any integer number of bytes, so no padding is ever required. Bitrate adjustment SHOULD be used instead of padding.
    The bitrate used by CELT is implicitly determined by the size of the compressed data. When more than one frame is encoded in the same packet, it is not possible to determine the size of each encoded frame, so the information MUST be explicitly encoded. If N frames are present in a packet, N compressed frame sizes need to be encoded at the beginning of the packet. Each size that is less than 255 bytes is encoded in one byte (unsigned 8-bit integer). For sizes greater or equal to 255, a 0xff byte is encoded, followed by the size-255. Multiple 0xff bytes are allowed if there are more than 510 bytes transmitted. The length is always the size of the CELT frame excluding the length byte itself. The payload MUST NOT be padded, except in accordance with the padding bit definition in the RTP header. Below is an example of two CELT frames contained within one RTP packet.
    The following is an example of C code that interprets the length bytes:
    CELT supports both mono streams and stereo streams. If more than two channels are desired, it is possible to use transmit multiple streams in the same packet. In this case, the number of streams S and the pairing must be agreed with out-of-band negotiation such as SDP. Each stream can be either mono or stereo, depending on whether the channels are assumed to be correlated. For example, a 5.1 surround could have the front-left and front-right channels in a stereo stream, the rear-left and rear-right channels in a separate stereo stream, while the center and low-frequency channels would be in separate mono streams. In that example, the RTP packet would be:
    In the case where streams for multiple channels are used with multiple frames of the same streams per packet, then all streams for a certain timestamp are encoded before all streams for the following timestamp. In the case of the 5.1 example above with two frames per packet, the number of compressed length fields would be S*N = 8.
    Full definition of the MIME type for CELT will be part of the Ogg Vorbis MIME type definition application . MIME media type name: audio MIME subtype: celt Optional parameters: Required parameters: to be included in the Ogg MIME specification. Encoding considerations: Security Considerations: See Section 6 of RFC 3047. Interoperability considerations: none Published specification: Applications which use this media type: Additional information: none Person & email address to contact for further information: Jean-Marc Valin <jean-marc.valin@octasic.com> Intended usage: COMMON Author/Change controller: Author: Jean-Marc Valin <jean-marc.valin@octasic.com> Change controller: Jean-Marc Valin <jean-marc.valin@octasic.com> Change controller: IETF AVT Working Group This transport type signifies that the content is to be interpreted according to this document if the contents are transmitted over RTP. Should this transport type appear over a lossless streaming protocol such as TCP, the content encapsulation should be interpreted as an Ogg Stream in accordance with , with the exception that the content of the Ogg Stream may be assumed to be CELT audio and CELT audio only.
    When conveying information by SDP , the encoding name MUST be set to "CELT". The sampling frequency is typically between 32000 and 48000 Hz. Implementations MUST support 48000 Hz and SHOULD also support 44100 Hz. The SDP parameters have the following interpretation with respect to CELT: ptime: The desired packetization time. The sender SHOULD choose a number of frames per packet that corresponds to the smallest packetization time greater or equal to the specified ptime for the selected frame size. The default is 20 ms as specified in maxptime: The maximum packetization time desired. As specified in , if the maximum is lower than the smallest packetization time determined from the chosen frame size (as described above), then that packtization time SHOULD be used despite the maxptime value. The default is "no maximum". CELT-specific parameters can be given via the "a=fmtp:" directive. Several parameters can be given in a single a=fmtp line provided that they are separated by a semi-colon. The following parameters are defined for use in this way: bitrate: The desired bit-rate in kbit/s for the codec only (excluding headers and the length bytes). The value MUST be rounded to an integer number of bytes per frame. The round-to-nearest method is RECOMMENDED. The default bit-rate value is 64 kbit/s per channel. frame-size: The frame size is the duration of each frame in samples and has to be even. The default is 480. mapping: Optional string describing the multi-channel mapping. The selected frame-size values MUST be even. For quality and complexity reasons, they SHOULD also be divisible by 8 and have a prime factorization which consists only of 2, 3, or 5 factors. For example, powers-of-two and values such as 160, 320, 240, and 480 are recommended. Implementations MUST support receiving and sending the default value of 480. Implementations SHOULD also support frame sizes of 256 and 512 since these are the ones that lead to the lowest complexity. When frame sizes that are powers-of-two are supported, they SHOULD be listed first in the offer and chosen over non-powers-of-two in the answer. Care must be taken when setting the value of ptime: and bitrate: so that the RTP packet size does not exceed the path MTU. An example of the media representation in SDP for offering a single channel of CELT at 48000 samples per second might be: m=audio 8088 RTP/AVP 97 a=rtpmap:97 CELT/48000/1 Note that the RTP payload type code of 97 is defined in this media definition to be 'mapped' to the CELT codec at a 48 kHz sampling frequency using the 'a=rtpmap' line. Any number from 96 to 127 could have been chosen (the allowed range for dynamic types). If there is more than one channel being encoded the rtpmap MUST specify the channel count. When no channel count is included, the default is one channel. The following example demonstrates the use of the a=fmtp: parameters: m=audio 8008 RTP/AVP 97 a=ptime: 25 a=rtpmap:97 CELT/44100 a=fmtp:97 frame-size=512;bitrate=48 This examples illustrate an offerer that wishes to receive a CELT stream at 44100 Hz, by packing two 512-sample frames in each packet (less than 25 ms) at around 48 kbps (70 bytes per frame).
    When more than two channels are used, a mapping parameter MUST be provided. The mapping parameter is defined as comma separated list of integers which specify the number of channels contained in each CELT stream, OPTIONALLY followed by a '/' and a comma separated list of channel identifiers, then OPTIONALLY another '/' and a string which provides an application specific elaboration on any speaker-feed definitions. The channels per stream entries MUST be either 1 or 2. The total number of channels is indicated by the sum of the channels per stream entries. The sum of the channel counts MUST be equal to the total number of channels. Channel identifiers are short alphanumeric strings. Each identifier MUST begin with a letter indicating the type of channel. 'A' MUST be used to indicate an ambisonic channel, 'S' to indicate a speaker-feed channel, or 'O' indicating other usage. A channel identifier MAY be repeated, but the meaning of such repetition is application specific. Applications SHOULD attempt to utilize channel identifiers such that mixing all identical identifiers would produce a reasonable result. Non-surround usage such as individual performer tracks, effect send, "order wire", or other administrative channels may be given application specific identifiers which MUST not conflict with the identifiers defined in this draft. These identifiers SHOULD begin with S if it would be sensible to include them in a mono-downmix, or O if it would be most sensible to exclude them from a mono-downmix. An example usage might be mapping=2,1,2,1,1/SLguitar,SRguitar,OheadsetG,SLkeyboard,SRkeyboard,OheadsetK,SMbass,OheadsetB" Ambisonic channels MUST follow the Furse-Malham naming and weighing conventions for up to third order spherical. Higher order ambisonic support is application defined but MUST NOT reuse any of WXYZRSTUVKLMNOPQ for higher order components. For example, second order spherical ambisonics SHOULD use the mapping "mapping=1,1,1,1,1,1,1,1,1/AW,AX,AY,AZ,AR,AS,AT,AU,AV". Any set of Ambisonic channels MUST contain at least one "AW" channel. Speaker-feed identifiers are named based on the intended speaker locations. "L", "R" for the left and right speakers, respectively, in conventional stereo or the front left and right in 4, 5, 5.1, or 7.1 channel surround. "LR", "RR" for the left and right rear speakers in 4,5 or 5.1 channel surround. C" is used for a center channel, "MLFE" for a low frequency extension channel. "LS", "RS" for the side channels in 7.1 channel surround. Additional speaker-feeds are application specific but should not reuse the prior identifiers. For 5.1 surround in non-ambisonic form the mapping SHOULD be "mapping=2,2,1,1/L,R,LR,RR,C,MLFE/ITU-RBS.775-1". When only one or two channels are used, the mapping parameter MAY be omitted, in which case the default mapping is used. For one channel, the default is "mapping=1/C", while for two channels, the default is "mapping=2/L,R". For example a stereo configuration might signal: m=audio 8008 RTP/AVP 97 a=ptime: 5 a=rtpmap:97 CELT/44100/2 a=fmtp:97 frame-size=256 Which specifies a single two-channel CELT stream according to the default mapping.
    A low-overhead mode is defined to make more efficient use of bandwidth when transmitting CELT frames. In that mode none of the length values need to be transmitted. One the a=fmtp: parameter low-overhead: is defined and contains a single frame size, followed by a '/', followed by a comma-separated list of the number of bytes per frame for each stream defined in the channel mapping. The number of frames per channel can thus be computed as the payload size divided by the sum of the bytes-per-frame values. The frame-size: parameter MUST not be specified and SHOULD be ignored if encountered in an SDP offer or answer. The bitrate: parameter MUST also be ignored since the low-overhead: parameter makes it redundant. When the low-overhead: parameter is specified, the length of each frame MUST NOT be encoded in the payload and the bit-rate MUST NOT be changed during the session. For example a low-overhead 64 kbit/s mono stream could be signaled as: m=audio 8008 RTP/AVP 97 a=ptime: 5 a=rtpmap:97 CELT/48000/1 a=fmtp:97 low-overhead=256/43 and a low-overhead 360 kbit/s 5.1 surround configuration could be signaled as: m=audio 8008 RTP/AVP 97 a=ptime: 5 a=rtpmap:97 CELT/48000/6 a=fmtp:97 low-overhead=256/86,86,43,25;mapping=2,2,1,1/L,R,LR,RR,C,MLFE/ITU-RBS.775-1 In this last example, 4 bytes per packet would be saved. This corresponds to a 6 kbit/s reduction in the overhead, although the 60 kbit/s overhead of the IP, UDP and RTP headers is still present.
    CELT allows any bitrate, with a one byte per frame resolution, without any signaling requirement or overhead. Applications SHOULD utilize congestion control to regulate the transmitted bitrate. In some applications it may make sense to increase the packetization interval rather than decreasing the codec bitrate. Congestion control implementations should consider the users differential tolerance for high latency and low quality.
    RTP packets using the payload format defined in this specification are subject to the security considerations discussed in the RTP specification , and in any applicable RTP profile. The main security considerations for the RTP packet carrying the RTP payload format defined within this memo are confidentiality, integrity and source authenticity. Confidentiality is achieved by encryption of the RTP payload. Integrity of the RTP packets through suitable cryptographic integrity protection mechanism. Cryptographic system may also allow the authentication of the source of the payload. A suitable security mechanism for this RTP payload format should provide confidentiality, integrity protection and at least source authentication capable of determining if an RTP packet is from a member of the RTP session or not. Note that the appropriate mechanism to provide security to RTP and payloads following this memo may vary. It is dependent on the application, the transport, and the signalling protocol employed. Therefore a single mechanism is not sufficient, although if suitable the usage of SRTP is recommended. Other mechanism that may be used are IPsec and TLS (RTP over TCP), but also other alternatives may exist. This RTP payload format and its media decoder do not exhibit any significant non-uniformity in the receiver-side computational complexity for packet processing, and thus are unlikely to pose a denial-of-service threat due to the receipt of pathological data. Nor does the RTP payload format contain any active content. Because this format supports VBR operation small amounts of information about the transmitted audio may be leaked by a length preserving cryptographic transport. Accordingly, when CELT is used inside a secure transport the sender SHOULD restrict the use of VBR to congestion control purposes. CELT implementations will typically exhibit tiny content-sensitive encoding time variances. Since transmission is usually triggered by an accurate hardware clock and the encoded data is typically transmitted as soon as encoding is complete this variance may result in a small amount of additional frame to frame jitter which could be measured by a third-party. Encrypted implementations SHOULD transmit packets at fixed intervals to avoid the possible information leak.
    The authors would also like to thank the following people for their input: Timothy B. Terriberry, Ben Schwartz, Alexander Carot, Thorvald Natvig, Brian West, Steve Underwood, and Anthony Minessale.
    Key words for use in RFCs to Indicate Requirement Levels RTP: A Transport Protocol for real-time applications Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies SDP: Session Description Protocol RTP Profile for Audio and Video Conferences with Minimal Control. The application/ogg Media Type The Secure Real-time Transport Protocol (SRTP) Security Architecture for the Internet Protocol The Transport Layer Security (TLS) Protocol Version 1.2 The CELT ultra-low delay audio codec Higher order Ambisonic systems
    mumble-1.3.4/3rdparty/celt-0.7.0-src/doc/ietf/celt_types.h0000664000175000017500000000042314010707311022575 0ustar builderbuilder#ifndef _CELT_TYPES_H #define _CELT_TYPES_H typedef short celt_int16_t; typedef unsigned short celt_uint16_t; typedef int celt_int32_t; typedef unsigned int celt_uint32_t; typedef long long celt_int64_t; typedef unsigned long long celt_uint64_t; #endif /* _CELT_TYPES_H */ mumble-1.3.4/3rdparty/celt-0.7.0-src/doc/ietf/substitutions.h0000664000175000017500000000474314010707311023372 0ustar builderbuilder#define IMUL32(a,b) ((a)*(b)) #define UMUL32(a,b) ((a)*(b)) #define UMUL16_16(a,b) ((a)*(b)) #define celt_word16_t float #define celt_word32_t float #define celt_sig_t float #define celt_norm_t float #define celt_ener_t float #define celt_pgain_t float #define celt_mask_t float #define UADD32(a,b) ((a)+(b)) #define USUB32(a,b) ((a)-(b)) #define Q15ONE 1.0f #define Q30ONE 1.0f #define NORM_SCALING 1.f #define NORM_SCALING_1 1.f #define ENER_SCALING 1.f #define ENER_SCALING_1 1.f #define PGAIN_SCALING 1.f #define PGAIN_SCALING_1 1.f #define DB_SCALING 1.f #define DB_SCALING_1 1.f #define EPSILON 1e-15f #define VERY_SMALL 1e-15f #define VERY_LARGE32 1e15f #define VERY_LARGE16 1e15f #define Q15_ONE 1.f #define Q15_ONE_1 1.f #define QCONST16(x,bits) (x) #define QCONST32(x,bits) (x) #define NEG16(x) (-(x)) #define NEG32(x) (-(x)) #define EXTRACT16(x) (x) #define EXTEND32(x) (x) #define SHR16(a,shift) (a) #define SHL16(a,shift) (a) #define SHR32(a,shift) (a) #define SHL32(a,shift) (a) #define PSHR16(a,shift) (a) #define PSHR32(a,shift) (a) #define VSHR32(a,shift) (a) #define SATURATE16(x,a) (x) #define SATURATE32(x,a) (x) #define PSHR(a,shift) (a) #define SHR(a,shift) (a) #define SHL(a,shift) (a) #define SATURATE(x,a) (x) #define ROUND16(a,shift) (a) #define HALF32(x) (.5f*(x)) #define ADD16(a,b) ((a)+(b)) #define SUB16(a,b) ((a)-(b)) #define ADD32(a,b) ((a)+(b)) #define SUB32(a,b) ((a)-(b)) #define MULT16_16_16(a,b) ((a)*(b)) #define MULT16_16(a,b) ((a)*(b)) #define MAC16_16(c,a,b) ((c)+(a)*(b)) #define MULT16_32_Q11(a,b) ((a)*(b)) #define MULT16_32_Q13(a,b) ((a)*(b)) #define MULT16_32_Q14(a,b) ((a)*(b)) #define MULT16_32_Q15(a,b) ((a)*(b)) #define MULT16_32_Q16(a,b) ((a)*(b)) #define MULT16_32_P15(a,b) ((a)*(b)) #define MULT32_32_Q31(a,b) ((a)*(b)) #define MAC16_32_Q11(c,a,b) ((c)+(a)*(b)) #define MAC16_32_Q15(c,a,b) ((c)+(a)*(b)) #define MAC16_16_Q11(c,a,b) ((c)+(a)*(b)) #define MAC16_16_Q13(c,a,b) ((c)+(a)*(b)) #define MAC16_16_P13(c,a,b) ((c)+(a)*(b)) #define MULT16_16_Q11_32(a,b) ((a)*(b)) #define MULT16_16_Q13(a,b) ((a)*(b)) #define MULT16_16_Q14(a,b) ((a)*(b)) #define MULT16_16_Q15(a,b) ((a)*(b)) #define MULT16_16_P15(a,b) ((a)*(b)) #define MULT16_16_P13(a,b) ((a)*(b)) #define MULT16_16_P14(a,b) ((a)*(b)) #define DIV32_16(a,b) ((a)/(b)) #define PDIV32_16(a,b) ((a)/(b)) #define DIV32(a,b) ((a)/(b)) #define PDIV32(a,b) ((a)/(b)) #define PRINT_MIPS(x)mumble-1.3.4/3rdparty/celt-0.7.0-src/doc/ietf/config.h0000664000175000017500000000071314010707311021671 0ustar builderbuilder/* config.h. Generated from config.h.in by configure. */ /* config.h.in. Generated from configure.ac by autoheader. */ /* This is a build of CELT */ #define CELT_BUILD /**/ /* Version extra */ #define CELT_EXTRA_VERSION "" /* Version major */ #define CELT_MAJOR_VERSION 0 /* Version micro */ #define CELT_MICRO_VERSION 2 /* Version minor */ #define CELT_MINOR_VERSION 5 /* Complete version string */ #define CELT_VERSION "0.6.0" #define restrict mumble-1.3.4/3rdparty/celt-0.7.0-src/configure.ac0000664000175000017500000001546514010707311021057 0ustar builderbuilderdnl Process this file with autoconf to produce a configure script. -*-m4-*- AC_INIT(libcelt/arch.h) AM_CONFIG_HEADER([config.h]) CELT_MAJOR_VERSION=0 CELT_MINOR_VERSION=7 CELT_MICRO_VERSION=1 CELT_EXTRA_VERSION= CELT_VERSION=$CELT_MAJOR_VERSION.$CELT_MINOR_VERSION.$CELT_MICRO_VERSION$CELT_EXTRA_VERSION LIBCELT_SUFFIX=0 CELT_LT_CURRENT=0 CELT_LT_REVISION=0 CELT_LT_AGE=0 AC_SUBST(CELT_LT_CURRENT) AC_SUBST(CELT_LT_REVISION) AC_SUBST(CELT_LT_AGE) AC_SUBST(LIBCELT_SUFFIX) # For automake. VERSION=$CELT_VERSION PACKAGE=celt AC_SUBST(CELT_VERSION) AM_INIT_AUTOMAKE($PACKAGE, $VERSION, no-define) AM_MAINTAINER_MODE AC_CANONICAL_HOST AM_PROG_LIBTOOL AC_PROG_CC_C99 AC_C_BIGENDIAN AC_C_CONST AC_C_INLINE AC_C_RESTRICT AC_DEFINE([CELT_BUILD], [], [This is a build of CELT]) AC_MSG_CHECKING(for C99 variable-size arrays) AC_TRY_COMPILE( , [ int foo=10; int array[foo]; ], [has_var_arrays=yes;AC_DEFINE([VAR_ARRAYS], [], [Use C99 variable-size arrays]) ], has_var_arrays=no ) AC_MSG_RESULT($has_var_arrays) AC_CHECK_HEADERS([alloca.h getopt.h]) AC_MSG_CHECKING(for alloca) AC_TRY_COMPILE( [#include ], [ int foo=10; int *array = alloca(foo); ], [ has_alloca=yes; if test x$has_var_arrays = "xno" ; then AC_DEFINE([USE_ALLOCA], [], [Make use of alloca]) fi ], has_alloca=no ) AC_MSG_RESULT($has_alloca) AC_CHECK_HEADERS(sys/soundcard.h sys/audioio.h) AS_IF([test "x$with_ogg" != xno], [XIPH_PATH_OGG([tools="tools"], [tools=""])], [tools=""]) AC_SUBST(tools) AC_CHECK_LIB(m, sin) # Check for getopt_long; if not found, use included source. AC_CHECK_FUNCS([getopt_long],, [# FreeBSD has a gnugetopt library. AC_CHECK_LIB([gnugetopt],[getopt_long], [AC_DEFINE([HAVE_GETOPT_LONG])], [# Use the GNU replacement. AC_LIBOBJ(getopt) AC_LIBOBJ(getopt1)])]) AC_CHECK_LIB(winmm, main) AC_DEFINE_UNQUOTED(CELT_VERSION, "${CELT_VERSION}", [Complete version string]) AC_DEFINE_UNQUOTED(CELT_MAJOR_VERSION, ${CELT_MAJOR_VERSION}, [Version major]) AC_DEFINE_UNQUOTED(CELT_MINOR_VERSION, ${CELT_MINOR_VERSION}, [Version minor]) AC_DEFINE_UNQUOTED(CELT_MICRO_VERSION, ${CELT_MICRO_VERSION}, [Version micro]) AC_DEFINE_UNQUOTED(CELT_EXTRA_VERSION, "${CELT_EXTRA_VERSION}", [Version extra]) has_float_approx=no #case "$host_cpu" in #i[[3456]]86 | x86_64 | powerpc64 | powerpc32 | ia64) # has_float_approx=yes # ;; #esac ac_enable_fixed="no"; AC_ARG_ENABLE(fixed-point, [ --enable-fixed-point compile as fixed-point], [if test "$enableval" = yes; then ac_enable_fixed="yes"; AC_DEFINE([FIXED_POINT], , [Compile as fixed-point]) AC_DEFINE([DOUBLE_PRECISION], , [Compile as fixed-point]) AC_DEFINE([MIXED_PRECISION], , [Compile as fixed-point]) else AC_DEFINE([FLOATING_POINT], , [Compile as floating-point]) fi], AC_DEFINE([FLOATING_POINT], , [Compile as floating-point])) ac_enable_fixed_debug="no" AC_ARG_ENABLE(fixed-point-debug, [ --enable-fixed-point-debug debug fixed-point implementation], [if test "$enableval" = yes; then ac_enable_fixed_debug="yes" AC_DEFINE([FIXED_DEBUG], , [Debug fixed-point implementation]) fi]) float_approx=$has_float_approx AC_ARG_ENABLE(float-approx, [ --disable-float-approx do not use fast approximations for floating point], [ if test "$enableval" = yes; then AC_WARN([Floating point approximations are not supported on all platforms.]) float_approx=yes else float_approx=no fi], [ float_approx=$has_float_approx ]) if test "x${float_approx}" = "xyes"; then AC_DEFINE([FLOAT_APPROX], , [Float approximations]) fi ac_enable_static_modes="no" AC_ARG_ENABLE(static-modes, [ --enable-static-modes use pre-computed codec configurations], [if test "$enableval" = yes; then ac_enable_static_modes="yes" AC_DEFINE([STATIC_MODES], , [Static modes]) fi]) ac_enable_assertions="no" AC_ARG_ENABLE(assertions, [ --enable-assertions enable additional software error checking], [if test "$enableval" = yes; then ac_enable_assertions="yes" AC_DEFINE([ENABLE_ASSERTIONS], , [Assertions]) fi]) ac_enable_new_plc="no" AC_ARG_ENABLE(new-plc, [ --enable-new-plc enable the new loss concealment code], [if test "$enableval" = yes; then ac_enable_new_plc="yes" AC_DEFINE([NEW_PLC], , [Use new PLC code]) fi]) saved_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -fvisibility=hidden" AC_MSG_CHECKING([if ${CXX} supports -fvisibility=hidden]) AC_COMPILE_IFELSE([char foo;], [ AC_MSG_RESULT([yes]) SYMBOL_VISIBILITY="-fvisibility=hidden" ], AC_MSG_RESULT([no])) CFLAGS="$saved_CFLAGS $SYMBOL_VISIBILITY" AC_SUBST(SYMBOL_VISIBILITY) if test $ac_cv_c_compiler_gnu = yes ; then CFLAGS="$CFLAGS -W -Wstrict-prototypes -Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wno-parentheses -Wno-unused-parameter -Wno-sign-compare" fi AC_C99_FUNC_LRINTF AC_C99_FUNC_LRINT AC_CHECK_SIZEOF(short) AC_CHECK_SIZEOF(int) AC_CHECK_SIZEOF(long) AC_CHECK_SIZEOF(long long) if test x$has_char16 = "xyes" ; then case 1 in $ac_cv_sizeof_short) SIZE16="short";; $ac_cv_sizeof_int) SIZE16="int";; esac else case 2 in $ac_cv_sizeof_short) SIZE16="short";; $ac_cv_sizeof_int) SIZE16="int";; esac fi if test x$has_char16 = "xyes" ; then case 2 in $ac_cv_sizeof_int) SIZE32="int";; $ac_cv_sizeof_long) SIZE32="long";; $ac_cv_sizeof_short) SIZE32="short";; esac else case 4 in $ac_cv_sizeof_int) SIZE32="int";; $ac_cv_sizeof_long) SIZE32="long";; $ac_cv_sizeof_short) SIZE32="short";; esac fi AC_SUBST(SIZE16) AC_SUBST(SIZE32) AC_OUTPUT([Makefile libcelt/Makefile tests/Makefile celt.pc tools/Makefile libcelt.spec ]) AC_MSG_RESULT([ ------------------------------------------------------------------------ $PACKAGE $VERSION: Automatic configuration OK. Compiler support: C99 var arrays: ................ ${has_var_arrays} C99 lrintf: .................... ${ac_cv_c99_lrintf} Alloca: ........................ ${has_alloca} General configuration: Fast float approximations: ..... ${float_approx} Fixed point support: ........... ${ac_enable_fixed} Fixed point debugging: ......... ${ac_enable_fixed_debug} Static modes: .................. ${ac_enable_static_modes} Assertion checking: ............ ${ac_enable_assertions} New PLC: ....................... ${ac_enable_new_plc} ------------------------------------------------------------------------ ]) if test "x$tools" = "x"; then echo "**IMPORTANT**" echo "You don't seem to have the development package for libogg (libogg-devel) available. Only the library will be built (no encoder/decoder executable)" echo "You can download libogg from http://www.vorbis.com/download.psp" fi echo "Type \"make; make install\" to compile and install"; echo "Type \"make check\" to run the test suite"; mumble-1.3.4/3rdparty/celt-0.7.0-src/NEWS0000664000175000017500000000000014010707311017243 0ustar builderbuildermumble-1.3.4/3rdparty/speexdsp-src/0000775000175000017500000000000014010707343017027 5ustar builderbuildermumble-1.3.4/3rdparty/speexdsp-src/AUTHORS0000664000175000017500000000076614010707343020110 0ustar builderbuilderJean-Marc Valin All the code except the following David Rowe lsp.c lsp.h Also ideas and feedback John Francis Edwards wave_out.[ch], some #ifdefs for windows port and MSVC project files Segher Boessenkool Misc. optimizations (for QMF in particular) Atsuhiko Yamanaka : Patch to speexenc.c to add Vorbis comment format Radim Kolar : Patch to speexenc.c for supporting more input formats mumble-1.3.4/3rdparty/speexdsp-src/SpeexDSP.spec.in0000664000175000017500000000326114010707343021745 0ustar builderbuilder%define name @PACKAGE@ %define ver @VERSION@ %define rel 1 Summary: An open-source, patent-free speech codec Name: %name Version: %ver Release: %rel License: BSD Group: Application/Devel Source: http://www.speex.org/download/%{name}-%{ver}.tar.gz URL: http://www.speex.org/ Vendor: Speex Packager: Jean-Marc Valin (jean-marc.valin@usherbrooke.ca) BuildRoot: /var/tmp/%{name}-build-root Docdir: /usr/share/doc %description Speex is a patent-free audio codec designed especially for voice (unlike Vorbis which targets general audio) signals and providing good narrowband and wideband quality. This project aims to be complementary to the Vorbis codec. %package devel Summary: Speex development files Group: Development/Libraries Requires: %{name} = %{version} %description devel Speex development files. %changelog * Thu Oct 03 2002 Jean-Marc Valin - Added devel package inspired from PLD spec file * Tue Jul 30 2002 Fredrik Rambris 0.5.2 - Added buildroot and docdir and ldconfig. Makes it builadble by non-roots and also doesn't write to actual library paths when building. %prep %setup %build export CFLAGS='-O3' ./configure --prefix=/usr --enable-shared --enable-static make %install rm -rf $RPM_BUILD_ROOT make DESTDIR=$RPM_BUILD_ROOT install %post -p /sbin/ldconfig %postun -p /sbin/ldconfig %files %defattr(644,root,root,755) %doc COPYING AUTHORS ChangeLog NEWS README %doc doc/manual.pdf %attr(755,root,root) %{_bindir}/speex* %attr(755,root,root) %{_libdir}/libspeex*.so* %files devel %defattr(644,root,root,755) %attr(755,root,root) %{_libdir}/libspeex*.la %{_includedir}/speex/speex*.h %{_libdir}/pkgconfig/speexdsp.pc %{_libdir}/libspeex*.a mumble-1.3.4/3rdparty/speexdsp-src/SpeexDSP.kdevelop0000664000175000017500000001464514010707343022227 0ustar builderbuilder Jean-Marc Valin jean-marc.valin@usherbrooke.ca $VERSION$ KDevAutoProject C . false kdevsubversion Speex libspeex/libspeex.la float src/Speex executable / false true false false float kdevgccoptions kdevgppoptions kdevpgf77options -O2 -g -Wall --disable-shared --enable-fixed-point --disable-shared fixed kdevgccoptions kdevgppoptions kdevpgf77options -O2 -g -Wall false 4 false true 0 libtool true false false false true 10 true true true false true true true 350 400 250 false 0 true true false std=_GLIBCXX_STD;__gnu_cxx=std true true false false true true true true .; false false false 3 /usr/share/qt3 3 EmbeddedKDevDesigner /usr/share/qt3/bin/qmake /usr/bin/designer-qt3 set m_,_ theValue true true true true Horizontal false false *.o,*.lo,CVS true false html/ html/ .h .cpp mumble-1.3.4/3rdparty/speexdsp-src/README0000664000175000017500000000020114010707343017700 0ustar builderbuilderSee INSTALL file for instructions on how to install SpeexDSP. SpeexDSP is a patent-free, Open Source/Free Software DSP library. mumble-1.3.4/3rdparty/speexdsp-src/TODO0000664000175000017500000000143014010707343017515 0ustar builderbuilderFor 1.2: Major points: - Make documentation match the actual code (especially jitter buffer, AEC and preprocessor) - Get AGC to work in fixed-point even if not totally converted - Stabilise all APIs (need feedback) - Short-term estimate in jitter buffer - Control delay in new AEC API. - NaN checks? - Better error reporting - Make kiss-fft 32-bit safe Post 1.2: improve float<->int conversion split encoder and decoder? Merge TriMedia stuff packet dump Do VAD properly --enable-{aec,preprocessor,jitter,resampler} Optimisations - Add restrict in a few places? - use __builtin_expect() (likely()/unlikely()) Allocator override (speex_lib_ctl?) Fixed-point: - VBR - Jitter buffer - AGC Denoiser: - Better noise adaptation AGC: - Use median filtering instead of "non-linear mean"? mumble-1.3.4/3rdparty/speexdsp-src/macosx/0000775000175000017500000000000014010707343020321 5ustar builderbuildermumble-1.3.4/3rdparty/speexdsp-src/macosx/Speex_UB.xcodeproj/0000775000175000017500000000000014010707343023767 5ustar builderbuildermumble-1.3.4/3rdparty/speexdsp-src/macosx/Speex_UB.xcodeproj/project.pbxproj0000664000175000017500000005022114010707343027043 0ustar builderbuilder// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 42; objects = { /* Begin PBXBuildFile section */ 73814AFF0907FB8200C478FC /* speex_echo.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF30907FB8200C478FC /* speex_echo.h */; settings = {ATTRIBUTES = (Public, ); }; }; 73814B000907FB8200C478FC /* speex_header.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF40907FB8200C478FC /* speex_header.h */; settings = {ATTRIBUTES = (Public, ); }; }; 73814B010907FB8200C478FC /* speex_jitter.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF50907FB8200C478FC /* speex_jitter.h */; settings = {ATTRIBUTES = (Public, ); }; }; 73814B020907FB8200C478FC /* speex_preprocess.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF60907FB8200C478FC /* speex_preprocess.h */; settings = {ATTRIBUTES = (Public, ); }; }; 73814B030907FB8200C478FC /* speex_stereo.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF70907FB8200C478FC /* speex_stereo.h */; settings = {ATTRIBUTES = (Public, ); }; }; 73814B040907FB8200C478FC /* speex_types.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF80907FB8200C478FC /* speex_types.h */; settings = {ATTRIBUTES = (Public, ); }; }; 73814B060907FBAB00C478FC /* speex_callbacks.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF10907FB8200C478FC /* speex_callbacks.h */; settings = {ATTRIBUTES = (Public, ); }; }; 73814B070907FBAD00C478FC /* speex_bits.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF00907FB8200C478FC /* speex_bits.h */; settings = {ATTRIBUTES = (Public, ); }; }; 73814B080907FBAE00C478FC /* speex.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AEF0907FB8200C478FC /* speex.h */; settings = {ATTRIBUTES = (Public, ); }; }; 73814B750907FC9900C478FC /* jitter.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B280907FC9900C478FC /* jitter.c */; }; 73814B840907FC9900C478FC /* math_approx.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B370907FC9900C478FC /* math_approx.c */; }; 73814B880907FC9900C478FC /* misc.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B3B0907FC9900C478FC /* misc.c */; }; 73814B8E0907FC9900C478FC /* preprocess.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B410907FC9900C478FC /* preprocess.c */; }; 73814B930907FC9900C478FC /* smallft.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B460907FC9900C478FC /* smallft.c */; }; 8D07F2C00486CC7A007CD1D0 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C1666FE841158C02AAC07 /* InfoPlist.strings */; }; /* End PBXBuildFile section */ /* Begin PBXBuildStyle section */ 4F0BB7EC011F40E904CA0E50 /* Development */ = { isa = PBXBuildStyle; buildSettings = { COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; GCC_OPTIMIZATION_LEVEL = 0; ZERO_LINK = YES; }; name = Development; }; 4F0BB7ED011F40E904CA0E50 /* Deployment */ = { isa = PBXBuildStyle; buildSettings = { COPY_PHASE_STRIP = YES; GCC_ENABLE_FIX_AND_CONTINUE = NO; ZERO_LINK = NO; }; name = Deployment; }; /* End PBXBuildStyle section */ /* Begin PBXFileReference section */ 089C1667FE841158C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; 32BAE0B70371A74B00C91783 /* Speex_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Speex_Prefix.pch; sourceTree = ""; }; 73814AEF0907FB8200C478FC /* speex.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex.h; sourceTree = ""; }; 73814AF00907FB8200C478FC /* speex_bits.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_bits.h; sourceTree = ""; }; 73814AF10907FB8200C478FC /* speex_callbacks.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_callbacks.h; sourceTree = ""; }; 73814AF30907FB8200C478FC /* speex_echo.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_echo.h; sourceTree = ""; }; 73814AF40907FB8200C478FC /* speex_header.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_header.h; sourceTree = ""; }; 73814AF50907FB8200C478FC /* speex_jitter.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_jitter.h; sourceTree = ""; }; 73814AF60907FB8200C478FC /* speex_preprocess.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_preprocess.h; sourceTree = ""; }; 73814AF70907FB8200C478FC /* speex_stereo.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_stereo.h; sourceTree = ""; }; 73814AF80907FB8200C478FC /* speex_types.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_types.h; sourceTree = ""; }; 73814B0C0907FC9900C478FC /* arch.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = arch.h; path = ../libspeex/arch.h; sourceTree = SOURCE_ROOT; }; 73814B1E0907FC9900C478FC /* fixed_arm4.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = fixed_arm4.h; path = ../libspeex/fixed_arm4.h; sourceTree = SOURCE_ROOT; }; 73814B1F0907FC9900C478FC /* fixed_arm5e.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = fixed_arm5e.h; path = ../libspeex/fixed_arm5e.h; sourceTree = SOURCE_ROOT; }; 73814B200907FC9900C478FC /* fixed_bfin.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = fixed_bfin.h; path = ../libspeex/fixed_bfin.h; sourceTree = SOURCE_ROOT; }; 73814B210907FC9900C478FC /* fixed_debug.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = fixed_debug.h; path = ../libspeex/fixed_debug.h; sourceTree = SOURCE_ROOT; }; 73814B220907FC9900C478FC /* fixed_generic.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = fixed_generic.h; path = ../libspeex/fixed_generic.h; sourceTree = SOURCE_ROOT; }; 73814B280907FC9900C478FC /* jitter.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jitter.c; path = ../libspeex/jitter.c; sourceTree = SOURCE_ROOT; }; 73814B370907FC9900C478FC /* math_approx.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = math_approx.c; path = ../libspeex/math_approx.c; sourceTree = SOURCE_ROOT; }; 73814B380907FC9900C478FC /* math_approx.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = math_approx.h; path = ../libspeex/math_approx.h; sourceTree = SOURCE_ROOT; }; 73814B390907FC9900C478FC /* mdf.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = mdf.c; path = ../libspeex/mdf.c; sourceTree = SOURCE_ROOT; }; 73814B3A0907FC9900C478FC /* misc_bfin.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = misc_bfin.h; path = ../libspeex/misc_bfin.h; sourceTree = SOURCE_ROOT; }; 73814B3B0907FC9900C478FC /* misc.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = misc.c; path = ../libspeex/misc.c; sourceTree = SOURCE_ROOT; }; 73814B3C0907FC9900C478FC /* misc.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = misc.h; path = ../libspeex/misc.h; sourceTree = SOURCE_ROOT; }; 73814B3E0907FC9900C478FC /* modes.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = modes.h; path = ../libspeex/modes.h; sourceTree = SOURCE_ROOT; }; 73814B410907FC9900C478FC /* preprocess.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = preprocess.c; path = ../libspeex/preprocess.c; sourceTree = SOURCE_ROOT; }; 73814B460907FC9900C478FC /* smallft.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = smallft.c; path = ../libspeex/smallft.c; sourceTree = SOURCE_ROOT; }; 73814B470907FC9900C478FC /* smallft.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = smallft.h; path = ../libspeex/smallft.h; sourceTree = SOURCE_ROOT; }; 73814B4B0907FC9900C478FC /* stack_alloc.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = stack_alloc.h; path = ../libspeex/stack_alloc.h; sourceTree = SOURCE_ROOT; }; 73814B4D0907FC9900C478FC /* testdenoise.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = testdenoise.c; path = ../libspeex/testdenoise.c; sourceTree = SOURCE_ROOT; }; 73814B4E0907FC9900C478FC /* testecho.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = testecho.c; path = ../libspeex/testecho.c; sourceTree = SOURCE_ROOT; }; 8D07F2C70486CC7A007CD1D0 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 8D07F2C80486CC7A007CD1D0 /* Speex.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Speex.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 8D07F2C30486CC7A007CD1D0 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 034768DDFF38A45A11DB9C8B /* Products */ = { isa = PBXGroup; children = ( 8D07F2C80486CC7A007CD1D0 /* Speex.framework */, ); name = Products; sourceTree = ""; }; 0867D691FE84028FC02AAC07 /* Speex */ = { isa = PBXGroup; children = ( 08FB77ACFE841707C02AAC07 /* Source */, 73814AEB0907FB6400C478FC /* Headers */, 089C1665FE841158C02AAC07 /* Resources */, 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */, 034768DDFF38A45A11DB9C8B /* Products */, ); name = Speex; sourceTree = ""; }; 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */ = { isa = PBXGroup; children = ( ); name = "External Frameworks and Libraries"; sourceTree = ""; }; 089C1665FE841158C02AAC07 /* Resources */ = { isa = PBXGroup; children = ( 8D07F2C70486CC7A007CD1D0 /* Info.plist */, 089C1666FE841158C02AAC07 /* InfoPlist.strings */, ); name = Resources; sourceTree = ""; }; 08FB77ACFE841707C02AAC07 /* Source */ = { isa = PBXGroup; children = ( 73814B0C0907FC9900C478FC /* arch.h */, 73814B1E0907FC9900C478FC /* fixed_arm4.h */, 73814B1F0907FC9900C478FC /* fixed_arm5e.h */, 73814B200907FC9900C478FC /* fixed_bfin.h */, 73814B210907FC9900C478FC /* fixed_debug.h */, 73814B220907FC9900C478FC /* fixed_generic.h */, 73814B280907FC9900C478FC /* jitter.c */, 73814B370907FC9900C478FC /* math_approx.c */, 73814B380907FC9900C478FC /* math_approx.h */, 73814B390907FC9900C478FC /* mdf.c */, 73814B3A0907FC9900C478FC /* misc_bfin.h */, 73814B3B0907FC9900C478FC /* misc.c */, 73814B3C0907FC9900C478FC /* misc.h */, 73814B410907FC9900C478FC /* preprocess.c */, 73814B460907FC9900C478FC /* smallft.c */, 73814B470907FC9900C478FC /* smallft.h */, 73814B4B0907FC9900C478FC /* stack_alloc.h */, 73814B4D0907FC9900C478FC /* testdenoise.c */, 73814B4E0907FC9900C478FC /* testecho.c */, 32BAE0B70371A74B00C91783 /* Speex_Prefix.pch */, ); name = Source; sourceTree = ""; }; 73814AEB0907FB6400C478FC /* Headers */ = { isa = PBXGroup; children = ( 73814AEC0907FB8200C478FC /* speex */, ); name = Headers; sourceTree = ""; }; 73814AEC0907FB8200C478FC /* speex */ = { isa = PBXGroup; children = ( 73814AEF0907FB8200C478FC /* speex.h */, 73814AF00907FB8200C478FC /* speex_bits.h */, 73814AF10907FB8200C478FC /* speex_callbacks.h */, 73814AF30907FB8200C478FC /* speex_echo.h */, 73814AF40907FB8200C478FC /* speex_header.h */, 73814AF50907FB8200C478FC /* speex_jitter.h */, 73814AF60907FB8200C478FC /* speex_preprocess.h */, 73814AF70907FB8200C478FC /* speex_stereo.h */, 73814AF80907FB8200C478FC /* speex_types.h */, ); name = speex; path = ../include/speex; sourceTree = SOURCE_ROOT; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ 8D07F2BD0486CC7A007CD1D0 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 73814AFF0907FB8200C478FC /* speex_echo.h in Headers */, 73814B000907FB8200C478FC /* speex_header.h in Headers */, 73814B010907FB8200C478FC /* speex_jitter.h in Headers */, 73814B020907FB8200C478FC /* speex_preprocess.h in Headers */, 73814B030907FB8200C478FC /* speex_stereo.h in Headers */, 73814B040907FB8200C478FC /* speex_types.h in Headers */, 73814B060907FBAB00C478FC /* speex_callbacks.h in Headers */, 73814B070907FBAD00C478FC /* speex_bits.h in Headers */, 73814B080907FBAE00C478FC /* speex.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ 8D07F2BC0486CC7A007CD1D0 /* Speex */ = { isa = PBXNativeTarget; buildConfigurationList = 73814ADF0907FB1E00C478FC /* Build configuration list for PBXNativeTarget "Speex" */; buildPhases = ( 8D07F2BD0486CC7A007CD1D0 /* Headers */, 8D07F2BF0486CC7A007CD1D0 /* Resources */, 8D07F2C10486CC7A007CD1D0 /* Sources */, 8D07F2C30486CC7A007CD1D0 /* Frameworks */, 8D07F2C50486CC7A007CD1D0 /* Rez */, ); buildRules = ( ); buildSettings = { DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; FRAMEWORK_VERSION = A; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = Speex_Prefix.pch; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Library/Frameworks"; LIBRARY_STYLE = DYNAMIC; PRODUCT_NAME = Speex; WRAPPER_EXTENSION = framework; }; dependencies = ( ); name = Speex; productInstallPath = "$(HOME)/Library/Frameworks"; productName = Speex; productReference = 8D07F2C80486CC7A007CD1D0 /* Speex.framework */; productType = "com.apple.product-type.framework"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 0867D690FE84028FC02AAC07 /* Project object */ = { isa = PBXProject; buildConfigurationList = 73814AE30907FB1E00C478FC /* Build configuration list for PBXProject "Speex_UB" */; buildSettings = { }; buildStyles = ( 4F0BB7EC011F40E904CA0E50 /* Development */, 4F0BB7ED011F40E904CA0E50 /* Deployment */, ); hasScannedForEncodings = 1; mainGroup = 0867D691FE84028FC02AAC07 /* Speex */; productRefGroup = 034768DDFF38A45A11DB9C8B /* Products */; projectDirPath = ""; targets = ( 8D07F2BC0486CC7A007CD1D0 /* Speex */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 8D07F2BF0486CC7A007CD1D0 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 8D07F2C00486CC7A007CD1D0 /* InfoPlist.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXRezBuildPhase section */ 8D07F2C50486CC7A007CD1D0 /* Rez */ = { isa = PBXRezBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXRezBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 8D07F2C10486CC7A007CD1D0 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 73814B750907FC9900C478FC /* jitter.c in Sources */, 73814B840907FC9900C478FC /* math_approx.c in Sources */, 73814B880907FC9900C478FC /* misc.c in Sources */, 73814B8E0907FC9900C478FC /* preprocess.c in Sources */, 73814B930907FC9900C478FC /* smallft.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ 089C1666FE841158C02AAC07 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( 089C1667FE841158C02AAC07 /* English */, ); name = InfoPlist.strings; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 73814AE00907FB1E00C478FC /* Development */ = { isa = XCBuildConfiguration; buildSettings = { COPY_PHASE_STRIP = NO; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; FRAMEWORK_VERSION = A; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = Speex_Prefix.pch; INFOPLIST_FILE = Info.plist; INSTALL_PATH = /Library/Frameworks; LIBRARY_STYLE = DYNAMIC; MACH_O_TYPE = mh_dylib; PRODUCT_NAME = Speex; WRAPPER_EXTENSION = framework; ZERO_LINK = YES; }; name = Development; }; 73814AE10907FB1E00C478FC /* Deployment */ = { isa = XCBuildConfiguration; buildSettings = { COPY_PHASE_STRIP = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; FRAMEWORK_VERSION = A; GCC_ENABLE_FIX_AND_CONTINUE = NO; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = Speex_Prefix.pch; INFOPLIST_FILE = Info.plist; INSTALL_PATH = /Library/Frameworks; LIBRARY_STYLE = DYNAMIC; MACH_O_TYPE = mh_dylib; PRODUCT_NAME = Speex; WRAPPER_EXTENSION = framework; ZERO_LINK = NO; }; name = Deployment; }; 73814AE20907FB1E00C478FC /* Default */ = { isa = XCBuildConfiguration; buildSettings = { DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; FRAMEWORK_VERSION = A; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = Speex_Prefix.pch; INFOPLIST_FILE = Info.plist; INSTALL_PATH = /Library/Frameworks; LIBRARY_STYLE = DYNAMIC; MACH_O_TYPE = mh_dylib; PRODUCT_NAME = Speex; WRAPPER_EXTENSION = framework; }; name = Default; }; 73814AE40907FB1E00C478FC /* Development */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ( ppc, i386, ); GCC_PREPROCESSOR_DEFINITIONS = __MACOSX__; SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; }; name = Development; }; 73814AE50907FB1E00C478FC /* Deployment */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ( ppc, i386, ); GCC_PREPROCESSOR_DEFINITIONS = __MACOSX__; SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; }; name = Deployment; }; 73814AE60907FB1E00C478FC /* Default */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ( ppc, i386, ); GCC_PREPROCESSOR_DEFINITIONS = __MACOSX__; SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; }; name = Default; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 73814ADF0907FB1E00C478FC /* Build configuration list for PBXNativeTarget "Speex" */ = { isa = XCConfigurationList; buildConfigurations = ( 73814AE00907FB1E00C478FC /* Development */, 73814AE10907FB1E00C478FC /* Deployment */, 73814AE20907FB1E00C478FC /* Default */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Default; }; 73814AE30907FB1E00C478FC /* Build configuration list for PBXProject "Speex_UB" */ = { isa = XCConfigurationList; buildConfigurations = ( 73814AE40907FB1E00C478FC /* Development */, 73814AE50907FB1E00C478FC /* Deployment */, 73814AE60907FB1E00C478FC /* Default */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Default; }; /* End XCConfigurationList section */ }; rootObject = 0867D690FE84028FC02AAC07 /* Project object */; } mumble-1.3.4/3rdparty/speexdsp-src/macosx/Speex.xcodeproj/0000775000175000017500000000000014010707343023401 5ustar builderbuildermumble-1.3.4/3rdparty/speexdsp-src/macosx/Speex.xcodeproj/project.pbxproj0000664000175000017500000007423614010707343026471 0ustar builderbuilder// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 42; objects = { /* Begin PBXBuildFile section */ 37CA8DF00DD73408005C8CB6 /* buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = 37CA8DED0DD73408005C8CB6 /* buffer.c */; }; 37CA8DF10DD73408005C8CB6 /* resample.c in Sources */ = {isa = PBXBuildFile; fileRef = 37CA8DEE0DD73408005C8CB6 /* resample.c */; }; 37CA8DF30DD73408005C8CB6 /* buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = 37CA8DED0DD73408005C8CB6 /* buffer.c */; }; 37CA8DF40DD73408005C8CB6 /* resample.c in Sources */ = {isa = PBXBuildFile; fileRef = 37CA8DEE0DD73408005C8CB6 /* resample.c */; }; 37CA8DF60DD73424005C8CB6 /* resample_sse.h in Headers */ = {isa = PBXBuildFile; fileRef = 37CA8DEF0DD73408005C8CB6 /* resample_sse.h */; }; 37CA8DF90DD7347D005C8CB6 /* speex_buffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 37CA8DF70DD7347D005C8CB6 /* speex_buffer.h */; settings = {ATTRIBUTES = (Public, ); }; }; 37CA8DFA0DD7347D005C8CB6 /* speex_resampler.h in Headers */ = {isa = PBXBuildFile; fileRef = 37CA8DF80DD7347D005C8CB6 /* speex_resampler.h */; settings = {ATTRIBUTES = (Public, ); }; }; 37CA8E000DD7352A005C8CB6 /* os_support.h in Headers */ = {isa = PBXBuildFile; fileRef = 37CA8DFF0DD7352A005C8CB6 /* os_support.h */; }; 73814AFF0907FB8200C478FC /* speex_echo.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF30907FB8200C478FC /* speex_echo.h */; settings = {ATTRIBUTES = (Public, ); }; }; 73814B000907FB8200C478FC /* speex_header.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF40907FB8200C478FC /* speex_header.h */; settings = {ATTRIBUTES = (Public, ); }; }; 73814B010907FB8200C478FC /* speex_jitter.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF50907FB8200C478FC /* speex_jitter.h */; settings = {ATTRIBUTES = (Public, ); }; }; 73814B020907FB8200C478FC /* speex_preprocess.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF60907FB8200C478FC /* speex_preprocess.h */; settings = {ATTRIBUTES = (Public, ); }; }; 73814B030907FB8200C478FC /* speex_stereo.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF70907FB8200C478FC /* speex_stereo.h */; settings = {ATTRIBUTES = (Public, ); }; }; 73814B040907FB8200C478FC /* speex_types.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF80907FB8200C478FC /* speex_types.h */; settings = {ATTRIBUTES = (Public, ); }; }; 73814B060907FBAB00C478FC /* speex_callbacks.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF10907FB8200C478FC /* speex_callbacks.h */; settings = {ATTRIBUTES = (Public, ); }; }; 73814B750907FC9900C478FC /* jitter.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B280907FC9900C478FC /* jitter.c */; }; 73814B8E0907FC9900C478FC /* preprocess.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B410907FC9900C478FC /* preprocess.c */; }; 73814B930907FC9900C478FC /* smallft.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B460907FC9900C478FC /* smallft.c */; }; 738837440B1934D0005C7A69 /* mdf.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B390907FC9900C478FC /* mdf.c */; }; 738837540B193581005C7A69 /* _kiss_fft_guts.h in Headers */ = {isa = PBXBuildFile; fileRef = 738837460B193581005C7A69 /* _kiss_fft_guts.h */; }; 738837550B193581005C7A69 /* fftwrap.c in Sources */ = {isa = PBXBuildFile; fileRef = 738837470B193581005C7A69 /* fftwrap.c */; }; 738837560B193581005C7A69 /* fftwrap.h in Headers */ = {isa = PBXBuildFile; fileRef = 738837480B193581005C7A69 /* fftwrap.h */; }; 738837570B193581005C7A69 /* filterbank.c in Sources */ = {isa = PBXBuildFile; fileRef = 738837490B193581005C7A69 /* filterbank.c */; }; 738837580B193581005C7A69 /* filterbank.h in Headers */ = {isa = PBXBuildFile; fileRef = 7388374A0B193581005C7A69 /* filterbank.h */; }; 738837590B193581005C7A69 /* kiss_fft.c in Sources */ = {isa = PBXBuildFile; fileRef = 7388374B0B193581005C7A69 /* kiss_fft.c */; }; 7388375A0B193581005C7A69 /* kiss_fft.h in Headers */ = {isa = PBXBuildFile; fileRef = 7388374C0B193581005C7A69 /* kiss_fft.h */; }; 7388375B0B193581005C7A69 /* kiss_fftr.c in Sources */ = {isa = PBXBuildFile; fileRef = 7388374D0B193581005C7A69 /* kiss_fftr.c */; }; 7388375C0B193581005C7A69 /* kiss_fftr.h in Headers */ = {isa = PBXBuildFile; fileRef = 7388374E0B193581005C7A69 /* kiss_fftr.h */; }; 7388375D0B193581005C7A69 /* lsp_bfin.h in Headers */ = {isa = PBXBuildFile; fileRef = 7388374F0B193581005C7A69 /* lsp_bfin.h */; }; 7388375E0B193581005C7A69 /* pseudofloat.h in Headers */ = {isa = PBXBuildFile; fileRef = 738837500B193581005C7A69 /* pseudofloat.h */; }; 7388375F0B193581005C7A69 /* quant_lsp_bfin.h in Headers */ = {isa = PBXBuildFile; fileRef = 738837510B193581005C7A69 /* quant_lsp_bfin.h */; }; 738837600B193581005C7A69 /* vorbis_psy.c in Sources */ = {isa = PBXBuildFile; fileRef = 738837520B193581005C7A69 /* vorbis_psy.c */; }; 738837610B193581005C7A69 /* vorbis_psy.h in Headers */ = {isa = PBXBuildFile; fileRef = 738837530B193581005C7A69 /* vorbis_psy.h */; }; 738837830B193791005C7A69 /* fftwrap.c in Sources */ = {isa = PBXBuildFile; fileRef = 738837470B193581005C7A69 /* fftwrap.c */; }; 738837840B193792005C7A69 /* filterbank.c in Sources */ = {isa = PBXBuildFile; fileRef = 738837490B193581005C7A69 /* filterbank.c */; }; 7388378B0B1937A0005C7A69 /* jitter.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B280907FC9900C478FC /* jitter.c */; }; 7388378C0B1937A4005C7A69 /* kiss_fft.c in Sources */ = {isa = PBXBuildFile; fileRef = 7388374B0B193581005C7A69 /* kiss_fft.c */; }; 7388378D0B1937A9005C7A69 /* kiss_fftr.c in Sources */ = {isa = PBXBuildFile; fileRef = 7388374D0B193581005C7A69 /* kiss_fftr.c */; }; 738837940B1937BB005C7A69 /* mdf.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B390907FC9900C478FC /* mdf.c */; }; 738837980B1937C2005C7A69 /* preprocess.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B410907FC9900C478FC /* preprocess.c */; }; 7388379B0B1937C9005C7A69 /* smallft.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B460907FC9900C478FC /* smallft.c */; }; 738837A10B1937DD005C7A69 /* vorbis_psy.c in Sources */ = {isa = PBXBuildFile; fileRef = 738837520B193581005C7A69 /* vorbis_psy.c */; }; 8D07F2C00486CC7A007CD1D0 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C1666FE841158C02AAC07 /* InfoPlist.strings */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 089C1667FE841158C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; 32BAE0B70371A74B00C91783 /* Speex_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Speex_Prefix.pch; sourceTree = ""; }; 37CA8DED0DD73408005C8CB6 /* buffer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = buffer.c; path = ../libspeex/buffer.c; sourceTree = SOURCE_ROOT; }; 37CA8DEE0DD73408005C8CB6 /* resample.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = resample.c; path = ../libspeex/resample.c; sourceTree = SOURCE_ROOT; }; 37CA8DEF0DD73408005C8CB6 /* resample_sse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = resample_sse.h; path = ../libspeex/resample_sse.h; sourceTree = SOURCE_ROOT; }; 37CA8DF70DD7347D005C8CB6 /* speex_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = speex_buffer.h; sourceTree = ""; }; 37CA8DF80DD7347D005C8CB6 /* speex_resampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = speex_resampler.h; sourceTree = ""; }; 37CA8DFF0DD7352A005C8CB6 /* os_support.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = os_support.h; path = ../libspeex/os_support.h; sourceTree = SOURCE_ROOT; }; 73814AEF0907FB8200C478FC /* speex.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex.h; sourceTree = ""; }; 73814AF10907FB8200C478FC /* speex_callbacks.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_callbacks.h; sourceTree = ""; }; 73814AF30907FB8200C478FC /* speex_echo.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_echo.h; sourceTree = ""; }; 73814AF40907FB8200C478FC /* speex_header.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_header.h; sourceTree = ""; }; 73814AF50907FB8200C478FC /* speex_jitter.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_jitter.h; sourceTree = ""; }; 73814AF60907FB8200C478FC /* speex_preprocess.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_preprocess.h; sourceTree = ""; }; 73814AF70907FB8200C478FC /* speex_stereo.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_stereo.h; sourceTree = ""; }; 73814AF80907FB8200C478FC /* speex_types.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_types.h; sourceTree = ""; }; 73814B0C0907FC9900C478FC /* arch.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = arch.h; path = ../libspeex/arch.h; sourceTree = SOURCE_ROOT; }; 73814B1E0907FC9900C478FC /* fixed_arm4.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = fixed_arm4.h; path = ../libspeex/fixed_arm4.h; sourceTree = SOURCE_ROOT; }; 73814B1F0907FC9900C478FC /* fixed_arm5e.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = fixed_arm5e.h; path = ../libspeex/fixed_arm5e.h; sourceTree = SOURCE_ROOT; }; 73814B200907FC9900C478FC /* fixed_bfin.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = fixed_bfin.h; path = ../libspeex/fixed_bfin.h; sourceTree = SOURCE_ROOT; }; 73814B210907FC9900C478FC /* fixed_debug.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = fixed_debug.h; path = ../libspeex/fixed_debug.h; sourceTree = SOURCE_ROOT; }; 73814B220907FC9900C478FC /* fixed_generic.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = fixed_generic.h; path = ../libspeex/fixed_generic.h; sourceTree = SOURCE_ROOT; }; 73814B280907FC9900C478FC /* jitter.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jitter.c; path = ../libspeex/jitter.c; sourceTree = SOURCE_ROOT; }; 73814B380907FC9900C478FC /* math_approx.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = math_approx.h; path = ../libspeex/math_approx.h; sourceTree = SOURCE_ROOT; }; 73814B390907FC9900C478FC /* mdf.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = mdf.c; path = ../libspeex/mdf.c; sourceTree = SOURCE_ROOT; }; 73814B3A0907FC9900C478FC /* misc_bfin.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = misc_bfin.h; path = ../libspeex/misc_bfin.h; sourceTree = SOURCE_ROOT; }; 73814B410907FC9900C478FC /* preprocess.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = preprocess.c; path = ../libspeex/preprocess.c; sourceTree = SOURCE_ROOT; }; 73814B460907FC9900C478FC /* smallft.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = smallft.c; path = ../libspeex/smallft.c; sourceTree = SOURCE_ROOT; }; 73814B470907FC9900C478FC /* smallft.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = smallft.h; path = ../libspeex/smallft.h; sourceTree = SOURCE_ROOT; }; 73814B4B0907FC9900C478FC /* stack_alloc.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = stack_alloc.h; path = ../libspeex/stack_alloc.h; sourceTree = SOURCE_ROOT; }; 73814B4D0907FC9900C478FC /* testdenoise.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = testdenoise.c; path = ../libspeex/testdenoise.c; sourceTree = SOURCE_ROOT; }; 73814B4E0907FC9900C478FC /* testecho.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = testecho.c; path = ../libspeex/testecho.c; sourceTree = SOURCE_ROOT; }; 738837460B193581005C7A69 /* _kiss_fft_guts.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = _kiss_fft_guts.h; path = ../libspeex/_kiss_fft_guts.h; sourceTree = SOURCE_ROOT; }; 738837470B193581005C7A69 /* fftwrap.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = fftwrap.c; path = ../libspeex/fftwrap.c; sourceTree = SOURCE_ROOT; }; 738837480B193581005C7A69 /* fftwrap.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = fftwrap.h; path = ../libspeex/fftwrap.h; sourceTree = SOURCE_ROOT; }; 738837490B193581005C7A69 /* filterbank.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = filterbank.c; path = ../libspeex/filterbank.c; sourceTree = SOURCE_ROOT; }; 7388374A0B193581005C7A69 /* filterbank.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = filterbank.h; path = ../libspeex/filterbank.h; sourceTree = SOURCE_ROOT; }; 7388374B0B193581005C7A69 /* kiss_fft.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = kiss_fft.c; path = ../libspeex/kiss_fft.c; sourceTree = SOURCE_ROOT; }; 7388374C0B193581005C7A69 /* kiss_fft.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = kiss_fft.h; path = ../libspeex/kiss_fft.h; sourceTree = SOURCE_ROOT; }; 7388374D0B193581005C7A69 /* kiss_fftr.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = kiss_fftr.c; path = ../libspeex/kiss_fftr.c; sourceTree = SOURCE_ROOT; }; 7388374E0B193581005C7A69 /* kiss_fftr.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = kiss_fftr.h; path = ../libspeex/kiss_fftr.h; sourceTree = SOURCE_ROOT; }; 7388374F0B193581005C7A69 /* lsp_bfin.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = lsp_bfin.h; path = ../libspeex/lsp_bfin.h; sourceTree = SOURCE_ROOT; }; 738837500B193581005C7A69 /* pseudofloat.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = pseudofloat.h; path = ../libspeex/pseudofloat.h; sourceTree = SOURCE_ROOT; }; 738837510B193581005C7A69 /* quant_lsp_bfin.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = quant_lsp_bfin.h; path = ../libspeex/quant_lsp_bfin.h; sourceTree = SOURCE_ROOT; }; 738837520B193581005C7A69 /* vorbis_psy.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = vorbis_psy.c; path = ../libspeex/vorbis_psy.c; sourceTree = SOURCE_ROOT; }; 738837530B193581005C7A69 /* vorbis_psy.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = vorbis_psy.h; path = ../libspeex/vorbis_psy.h; sourceTree = SOURCE_ROOT; }; 738837770B193667005C7A69 /* libspeex.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libspeex.a; sourceTree = BUILT_PRODUCTS_DIR; }; 8D07F2C70486CC7A007CD1D0 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 8D07F2C80486CC7A007CD1D0 /* Speex.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Speex.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 738837750B193667005C7A69 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 8D07F2C30486CC7A007CD1D0 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 034768DDFF38A45A11DB9C8B /* Products */ = { isa = PBXGroup; children = ( 8D07F2C80486CC7A007CD1D0 /* Speex.framework */, 738837770B193667005C7A69 /* libspeex.a */, ); name = Products; sourceTree = ""; }; 0867D691FE84028FC02AAC07 /* Speex */ = { isa = PBXGroup; children = ( 08FB77ACFE841707C02AAC07 /* Source */, 73814AEB0907FB6400C478FC /* Headers */, 089C1665FE841158C02AAC07 /* Resources */, 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */, 034768DDFF38A45A11DB9C8B /* Products */, ); name = Speex; sourceTree = ""; }; 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */ = { isa = PBXGroup; children = ( ); name = "External Frameworks and Libraries"; sourceTree = ""; }; 089C1665FE841158C02AAC07 /* Resources */ = { isa = PBXGroup; children = ( 8D07F2C70486CC7A007CD1D0 /* Info.plist */, 089C1666FE841158C02AAC07 /* InfoPlist.strings */, ); name = Resources; sourceTree = ""; }; 08FB77ACFE841707C02AAC07 /* Source */ = { isa = PBXGroup; children = ( 37CA8DFF0DD7352A005C8CB6 /* os_support.h */, 37CA8DED0DD73408005C8CB6 /* buffer.c */, 37CA8DEE0DD73408005C8CB6 /* resample.c */, 37CA8DEF0DD73408005C8CB6 /* resample_sse.h */, 738837460B193581005C7A69 /* _kiss_fft_guts.h */, 738837470B193581005C7A69 /* fftwrap.c */, 738837480B193581005C7A69 /* fftwrap.h */, 738837490B193581005C7A69 /* filterbank.c */, 7388374A0B193581005C7A69 /* filterbank.h */, 7388374B0B193581005C7A69 /* kiss_fft.c */, 7388374C0B193581005C7A69 /* kiss_fft.h */, 7388374D0B193581005C7A69 /* kiss_fftr.c */, 7388374E0B193581005C7A69 /* kiss_fftr.h */, 738837500B193581005C7A69 /* pseudofloat.h */, 738837520B193581005C7A69 /* vorbis_psy.c */, 738837530B193581005C7A69 /* vorbis_psy.h */, 73814B0C0907FC9900C478FC /* arch.h */, 73814B1E0907FC9900C478FC /* fixed_arm4.h */, 73814B1F0907FC9900C478FC /* fixed_arm5e.h */, 73814B200907FC9900C478FC /* fixed_bfin.h */, 73814B210907FC9900C478FC /* fixed_debug.h */, 73814B220907FC9900C478FC /* fixed_generic.h */, 73814B280907FC9900C478FC /* jitter.c */, 73814B380907FC9900C478FC /* math_approx.h */, 73814B390907FC9900C478FC /* mdf.c */, 73814B3A0907FC9900C478FC /* misc_bfin.h */, 73814B410907FC9900C478FC /* preprocess.c */, 73814B460907FC9900C478FC /* smallft.c */, 73814B470907FC9900C478FC /* smallft.h */, 73814B4B0907FC9900C478FC /* stack_alloc.h */, 73814B4D0907FC9900C478FC /* testdenoise.c */, 73814B4E0907FC9900C478FC /* testecho.c */, 32BAE0B70371A74B00C91783 /* Speex_Prefix.pch */, ); name = Source; sourceTree = ""; }; 73814AEB0907FB6400C478FC /* Headers */ = { isa = PBXGroup; children = ( 73814AEC0907FB8200C478FC /* speex */, ); name = Headers; sourceTree = ""; }; 73814AEC0907FB8200C478FC /* speex */ = { isa = PBXGroup; children = ( 73814AEF0907FB8200C478FC /* speex.h */, 37CA8DF70DD7347D005C8CB6 /* speex_buffer.h */, 73814AF30907FB8200C478FC /* speex_echo.h */, 73814AF40907FB8200C478FC /* speex_header.h */, 73814AF50907FB8200C478FC /* speex_jitter.h */, 73814AF60907FB8200C478FC /* speex_preprocess.h */, 37CA8DF80DD7347D005C8CB6 /* speex_resampler.h */, 73814AF80907FB8200C478FC /* speex_types.h */, ); name = speex; path = ../include/speex; sourceTree = SOURCE_ROOT; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ 738837730B193667005C7A69 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 8D07F2BD0486CC7A007CD1D0 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 73814AFF0907FB8200C478FC /* speex_echo.h in Headers */, 73814B000907FB8200C478FC /* speex_header.h in Headers */, 73814B010907FB8200C478FC /* speex_jitter.h in Headers */, 73814B020907FB8200C478FC /* speex_preprocess.h in Headers */, 73814B030907FB8200C478FC /* speex_stereo.h in Headers */, 73814B040907FB8200C478FC /* speex_types.h in Headers */, 73814B060907FBAB00C478FC /* speex_callbacks.h in Headers */, 73814B080907FBAE00C478FC /* speex.h in Headers */, 738837540B193581005C7A69 /* _kiss_fft_guts.h in Headers */, 738837560B193581005C7A69 /* fftwrap.h in Headers */, 738837580B193581005C7A69 /* filterbank.h in Headers */, 7388375A0B193581005C7A69 /* kiss_fft.h in Headers */, 7388375C0B193581005C7A69 /* kiss_fftr.h in Headers */, 7388375D0B193581005C7A69 /* lsp_bfin.h in Headers */, 7388375E0B193581005C7A69 /* pseudofloat.h in Headers */, 7388375F0B193581005C7A69 /* quant_lsp_bfin.h in Headers */, 738837610B193581005C7A69 /* vorbis_psy.h in Headers */, 37CA8DF60DD73424005C8CB6 /* resample_sse.h in Headers */, 37CA8DF90DD7347D005C8CB6 /* speex_buffer.h in Headers */, 37CA8DFA0DD7347D005C8CB6 /* speex_resampler.h in Headers */, 37CA8E000DD7352A005C8CB6 /* os_support.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ 738837760B193667005C7A69 /* libspeex (static) */ = { isa = PBXNativeTarget; buildConfigurationList = 738837780B193687005C7A69 /* Build configuration list for PBXNativeTarget "libspeex (static)" */; buildPhases = ( 738837730B193667005C7A69 /* Headers */, 738837740B193667005C7A69 /* Sources */, 738837750B193667005C7A69 /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = "libspeex (static)"; productName = speex; productReference = 738837770B193667005C7A69 /* libspeex.a */; productType = "com.apple.product-type.library.static"; }; 8D07F2BC0486CC7A007CD1D0 /* Speex */ = { isa = PBXNativeTarget; buildConfigurationList = 73814ADF0907FB1E00C478FC /* Build configuration list for PBXNativeTarget "Speex" */; buildPhases = ( 8D07F2BD0486CC7A007CD1D0 /* Headers */, 8D07F2BF0486CC7A007CD1D0 /* Resources */, 8D07F2C10486CC7A007CD1D0 /* Sources */, 8D07F2C30486CC7A007CD1D0 /* Frameworks */, 8D07F2C50486CC7A007CD1D0 /* Rez */, ); buildRules = ( ); dependencies = ( ); name = Speex; productInstallPath = "$(HOME)/Library/Frameworks"; productName = Speex; productReference = 8D07F2C80486CC7A007CD1D0 /* Speex.framework */; productType = "com.apple.product-type.framework"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 0867D690FE84028FC02AAC07 /* Project object */ = { isa = PBXProject; buildConfigurationList = 73814AE30907FB1E00C478FC /* Build configuration list for PBXProject "Speex" */; compatibilityVersion = "Xcode 2.4"; hasScannedForEncodings = 1; mainGroup = 0867D691FE84028FC02AAC07 /* Speex */; productRefGroup = 034768DDFF38A45A11DB9C8B /* Products */; projectDirPath = ""; projectRoot = ..; targets = ( 8D07F2BC0486CC7A007CD1D0 /* Speex */, 738837760B193667005C7A69 /* libspeex (static) */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 8D07F2BF0486CC7A007CD1D0 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 8D07F2C00486CC7A007CD1D0 /* InfoPlist.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXRezBuildPhase section */ 8D07F2C50486CC7A007CD1D0 /* Rez */ = { isa = PBXRezBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXRezBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 738837740B193667005C7A69 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 738837830B193791005C7A69 /* fftwrap.c in Sources */, 738837840B193792005C7A69 /* filterbank.c in Sources */, 7388378B0B1937A0005C7A69 /* jitter.c in Sources */, 7388378C0B1937A4005C7A69 /* kiss_fft.c in Sources */, 7388378D0B1937A9005C7A69 /* kiss_fftr.c in Sources */, 738837940B1937BB005C7A69 /* mdf.c in Sources */, 738837980B1937C2005C7A69 /* preprocess.c in Sources */, 7388379B0B1937C9005C7A69 /* smallft.c in Sources */, 738837A10B1937DD005C7A69 /* vorbis_psy.c in Sources */, 37CA8DF30DD73408005C8CB6 /* buffer.c in Sources */, 37CA8DF40DD73408005C8CB6 /* resample.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 8D07F2C10486CC7A007CD1D0 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 73814B750907FC9900C478FC /* jitter.c in Sources */, 73814B8E0907FC9900C478FC /* preprocess.c in Sources */, 73814B930907FC9900C478FC /* smallft.c in Sources */, 738837440B1934D0005C7A69 /* mdf.c in Sources */, 738837550B193581005C7A69 /* fftwrap.c in Sources */, 738837570B193581005C7A69 /* filterbank.c in Sources */, 738837590B193581005C7A69 /* kiss_fft.c in Sources */, 7388375B0B193581005C7A69 /* kiss_fftr.c in Sources */, 738837600B193581005C7A69 /* vorbis_psy.c in Sources */, 37CA8DF00DD73408005C8CB6 /* buffer.c in Sources */, 37CA8DF10DD73408005C8CB6 /* resample.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ 089C1666FE841158C02AAC07 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( 089C1667FE841158C02AAC07 /* English */, ); name = InfoPlist.strings; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 73814AE00907FB1E00C478FC /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { COPY_PHASE_STRIP = NO; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; FRAMEWORK_VERSION = A; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = Speex_Prefix.pch; INFOPLIST_FILE = Info.plist; INSTALL_PATH = /Library/Frameworks; LIBRARY_STYLE = DYNAMIC; MACH_O_TYPE = mh_dylib; PRODUCT_NAME = Speex; WRAPPER_EXTENSION = framework; ZERO_LINK = YES; }; name = Debug; }; 73814AE10907FB1E00C478FC /* Release */ = { isa = XCBuildConfiguration; buildSettings = { COPY_PHASE_STRIP = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; FRAMEWORK_VERSION = A; GCC_ENABLE_FIX_AND_CONTINUE = NO; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = Speex_Prefix.pch; INFOPLIST_FILE = Info.plist; INSTALL_PATH = /Library/Frameworks; LIBRARY_STYLE = DYNAMIC; MACH_O_TYPE = mh_dylib; PRODUCT_NAME = Speex; WRAPPER_EXTENSION = framework; ZERO_LINK = NO; }; name = Release; }; 73814AE40907FB1E00C478FC /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", __MACOSX__, FLOATING_POINT, "$(GCC_PREPROCESSOR_DEFINITIONS_QUOTED_FOR_PROJECT_1)", ); GCC_PREPROCESSOR_DEFINITIONS_QUOTED_FOR_PROJECT_1 = "EXPORT=__attribute__((visibility(\\\"default\\\")))"; SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; }; name = Debug; }; 73814AE50907FB1E00C478FC /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ( ppc, i386, ); GCC_OPTIMIZATION_LEVEL = 3; GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", __MACOSX__, FLOATING_POINT, "$(GCC_PREPROCESSOR_DEFINITIONS_QUOTED_FOR_PROJECT_1)", ); GCC_PREPROCESSOR_DEFINITIONS_QUOTED_FOR_PROJECT_1 = "EXPORT=__attribute__((visibility(\\\"default\\\")))"; OTHER_CFLAGS = ( "$(OTHER_CFLAGS)", "-falign-loops=16", ); SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; }; name = Release; }; 738837790B193687005C7A69 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; GCC_OPTIMIZATION_LEVEL = 0; INSTALL_PATH = /usr/local/lib; PREBINDING = NO; PRODUCT_NAME = speex; ZERO_LINK = YES; }; name = Debug; }; 7388377A0B193687005C7A69 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { COPY_PHASE_STRIP = YES; GCC_ENABLE_FIX_AND_CONTINUE = NO; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; INSTALL_PATH = /usr/local/lib; PREBINDING = NO; PRODUCT_NAME = speex; ZERO_LINK = NO; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 73814ADF0907FB1E00C478FC /* Build configuration list for PBXNativeTarget "Speex" */ = { isa = XCConfigurationList; buildConfigurations = ( 73814AE00907FB1E00C478FC /* Debug */, 73814AE10907FB1E00C478FC /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 73814AE30907FB1E00C478FC /* Build configuration list for PBXProject "Speex" */ = { isa = XCConfigurationList; buildConfigurations = ( 73814AE40907FB1E00C478FC /* Debug */, 73814AE50907FB1E00C478FC /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 738837780B193687005C7A69 /* Build configuration list for PBXNativeTarget "libspeex (static)" */ = { isa = XCConfigurationList; buildConfigurations = ( 738837790B193687005C7A69 /* Debug */, 7388377A0B193687005C7A69 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 0867D690FE84028FC02AAC07 /* Project object */; } mumble-1.3.4/3rdparty/speexdsp-src/macosx/Speex_Prefix.pch0000664000175000017500000000016614010707343023421 0ustar builderbuilder// // Prefix header for all source files of the 'Speex' target in the 'Speex' project. // #include mumble-1.3.4/3rdparty/speexdsp-src/macosx/English.lproj/0000775000175000017500000000000014010707343023037 5ustar builderbuildermumble-1.3.4/3rdparty/speexdsp-src/macosx/English.lproj/InfoPlist.strings0000664000175000017500000000021414010707343026356 0ustar builderbuilder/* Localized versions of Info.plist keys */ CFBundleName = "Speex"; mumble-1.3.4/3rdparty/speexdsp-src/macosx/Info.plist0000664000175000017500000000176414010707343022301 0ustar builderbuilder CFBundleDevelopmentRegion English CFBundleExecutable Speex CFBundleGetInfoString Speex framework 1.1.12svn, Copyright © 2002-2006 Xiph.Org Foundation CFBundleIconFile CFBundleIdentifier org.xiph.speex CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType FMWK CFBundleShortVersionString 1.1.12svn CFBundleSignature ???? CFBundleVersion 1.1.12d1 NSHumanReadableCopyright Speex framework 1.1.12svn, Copyright © 2002-2006 Xiph.Org Foundation CSResourcesFileMapped mumble-1.3.4/3rdparty/speexdsp-src/README.blackfin0000664000175000017500000000132614010707343021461 0ustar builderbuilderSpeexDSP has been ported to the Blackfin DSP, for the STAMP development board. This port has been tested on the STAMP development board and requires the toolchain available at http://blackfin.uclinux.org/ 1/ In order to cross-compile for uClinux from the SpeexDSP tarball: ./configure --enable-blackfin-asm --enable-fixed-point --host=bfin-uclinux cd libspeexdsp make The --enable-blackfin-asm option is not required, but it speeds up Speex by approximately a factor of two. 2/ In order to cross-compile for uClinux from the SpeexDSP git: git clone git://git.xiph.org/speexdsp.git cd speexdsp ./autogen.sh ./configure --enable-blackfin-asm --enable-fixed-point --host=bfin-uclinux cd libspeexdsp make mumble-1.3.4/3rdparty/speexdsp-src/libspeexdsp/0000775000175000017500000000000014010707343021351 5ustar builderbuildermumble-1.3.4/3rdparty/speexdsp-src/libspeexdsp/kiss_fftr.h0000664000175000017500000000202614010707343023514 0ustar builderbuilder#ifndef KISS_FTR_H #define KISS_FTR_H #include "kiss_fft.h" #ifdef __cplusplus extern "C" { #endif /* Real optimized version can save about 45% cpu time vs. complex fft of a real seq. */ typedef struct kiss_fftr_state *kiss_fftr_cfg; kiss_fftr_cfg kiss_fftr_alloc(int nfft,int inverse_fft,void * mem, size_t * lenmem); /* nfft must be even If you don't care to allocate space, use mem = lenmem = NULL */ void kiss_fftr(kiss_fftr_cfg cfg,const kiss_fft_scalar *timedata,kiss_fft_cpx *freqdata); /* input timedata has nfft scalar points output freqdata has nfft/2+1 complex points */ void kiss_fftr2(kiss_fftr_cfg st,const kiss_fft_scalar *timedata,kiss_fft_scalar *freqdata); void kiss_fftri(kiss_fftr_cfg cfg,const kiss_fft_cpx *freqdata,kiss_fft_scalar *timedata); void kiss_fftri2(kiss_fftr_cfg st,const kiss_fft_scalar *freqdata, kiss_fft_scalar *timedata); /* input freqdata has nfft/2+1 complex points output timedata has nfft scalar points */ #define kiss_fftr_free speex_free #ifdef __cplusplus } #endif #endif mumble-1.3.4/3rdparty/speexdsp-src/libspeexdsp/stack_alloc.h0000664000175000017500000000644014010707343024005 0ustar builderbuilder/* Copyright (C) 2002 Jean-Marc Valin */ /** @file stack_alloc.h @brief Temporary memory allocation on stack */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef STACK_ALLOC_H #define STACK_ALLOC_H #ifdef USE_ALLOCA # ifdef WIN32 # include # else # ifdef HAVE_ALLOCA_H # include # else # include # endif # endif #endif /** * @def ALIGN(stack, size) * * Aligns the stack to a 'size' boundary * * @param stack Stack * @param size New size boundary */ /** * @def PUSH(stack, size, type) * * Allocates 'size' elements of type 'type' on the stack * * @param stack Stack * @param size Number of elements * @param type Type of element */ /** * @def VARDECL(var) * * Declare variable on stack * * @param var Variable to declare */ /** * @def ALLOC(var, size, type) * * Allocate 'size' elements of 'type' on stack * * @param var Name of variable to allocate * @param size Number of elements * @param type Type of element */ #ifdef ENABLE_VALGRIND #include #define ALIGN(stack, size) ((stack) += ((size) - (long)(stack)) & ((size) - 1)) #define PUSH(stack, size, type) (VALGRIND_MAKE_NOACCESS(stack, 1000),ALIGN((stack),sizeof(type)),VALGRIND_MAKE_WRITABLE(stack, ((size)*sizeof(type))),(stack)+=((size)*sizeof(type)),(type*)((stack)-((size)*sizeof(type)))) #else #define ALIGN(stack, size) ((stack) += ((size) - (long)(stack)) & ((size) - 1)) #define PUSH(stack, size, type) (ALIGN((stack),sizeof(type)),(stack)+=((size)*sizeof(type)),(type*)((stack)-((size)*sizeof(type)))) #endif #if defined(VAR_ARRAYS) #define VARDECL(var) #define ALLOC(var, size, type) type var[size] #elif defined(USE_ALLOCA) #define VARDECL(var) var #define ALLOC(var, size, type) var = alloca(sizeof(type)*(size)) #else #define VARDECL(var) var #define ALLOC(var, size, type) var = PUSH(stack, size, type) #endif #endif mumble-1.3.4/3rdparty/speexdsp-src/libspeexdsp/testresample.c0000664000175000017500000000525214010707343024231 0ustar builderbuilder/* Copyright (C) 2007 Jean-Marc Valin File: testresample.c Testing the resampling code Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "speex/speex_resampler.h" #include #include #include #define NN 256 int main() { spx_uint32_t i; short *in; short *out; float *fin, *fout; int count = 0; SpeexResamplerState *st = speex_resampler_init(1, 8000, 12000, 10, NULL); speex_resampler_set_rate(st, 96000, 44100); speex_resampler_skip_zeros(st); in = malloc(NN*sizeof(short)); out = malloc(2*NN*sizeof(short)); fin = malloc(NN*sizeof(float)); fout = malloc(2*NN*sizeof(float)); while (1) { spx_uint32_t in_len; spx_uint32_t out_len; fread(in, sizeof(short), NN, stdin); if (feof(stdin)) break; for (i=0;i static void *speex_alloc (int size) {return calloc(size,1);} static void *speex_realloc (void *ptr, int size) {return realloc(ptr, size);} static void speex_free (void *ptr) {free(ptr);} #include "speex_resampler.h" #include "arch.h" #else /* OUTSIDE_SPEEX */ #include "speex/speex_resampler.h" #include "arch.h" #include "os_support.h" #endif /* OUTSIDE_SPEEX */ #include "stack_alloc.h" #include #include #ifndef M_PI #define M_PI 3.14159265358979323846 #endif #define IMAX(a,b) ((a) > (b) ? (a) : (b)) #define IMIN(a,b) ((a) < (b) ? (a) : (b)) #ifndef NULL #define NULL 0 #endif #ifdef _USE_SSE #include "resample_sse.h" #endif #ifdef _USE_NEON #include "resample_neon.h" #endif /* Numer of elements to allocate on the stack */ #ifdef VAR_ARRAYS #define FIXED_STACK_ALLOC 8192 #else #define FIXED_STACK_ALLOC 1024 #endif typedef int (*resampler_basic_func)(SpeexResamplerState *, spx_uint32_t , const spx_word16_t *, spx_uint32_t *, spx_word16_t *, spx_uint32_t *); struct SpeexResamplerState_ { spx_uint32_t in_rate; spx_uint32_t out_rate; spx_uint32_t num_rate; spx_uint32_t den_rate; int quality; spx_uint32_t nb_channels; spx_uint32_t filt_len; spx_uint32_t mem_alloc_size; spx_uint32_t buffer_size; int int_advance; int frac_advance; float cutoff; spx_uint32_t oversample; int initialised; int started; /* These are per-channel */ spx_int32_t *last_sample; spx_uint32_t *samp_frac_num; spx_uint32_t *magic_samples; spx_word16_t *mem; spx_word16_t *sinc_table; spx_uint32_t sinc_table_length; resampler_basic_func resampler_ptr; int in_stride; int out_stride; } ; static const double kaiser12_table[68] = { 0.99859849, 1.00000000, 0.99859849, 0.99440475, 0.98745105, 0.97779076, 0.96549770, 0.95066529, 0.93340547, 0.91384741, 0.89213598, 0.86843014, 0.84290116, 0.81573067, 0.78710866, 0.75723148, 0.72629970, 0.69451601, 0.66208321, 0.62920216, 0.59606986, 0.56287762, 0.52980938, 0.49704014, 0.46473455, 0.43304576, 0.40211431, 0.37206735, 0.34301800, 0.31506490, 0.28829195, 0.26276832, 0.23854851, 0.21567274, 0.19416736, 0.17404546, 0.15530766, 0.13794294, 0.12192957, 0.10723616, 0.09382272, 0.08164178, 0.07063950, 0.06075685, 0.05193064, 0.04409466, 0.03718069, 0.03111947, 0.02584161, 0.02127838, 0.01736250, 0.01402878, 0.01121463, 0.00886058, 0.00691064, 0.00531256, 0.00401805, 0.00298291, 0.00216702, 0.00153438, 0.00105297, 0.00069463, 0.00043489, 0.00025272, 0.00013031, 0.0000527734, 0.00001000, 0.00000000}; /* static const double kaiser12_table[36] = { 0.99440475, 1.00000000, 0.99440475, 0.97779076, 0.95066529, 0.91384741, 0.86843014, 0.81573067, 0.75723148, 0.69451601, 0.62920216, 0.56287762, 0.49704014, 0.43304576, 0.37206735, 0.31506490, 0.26276832, 0.21567274, 0.17404546, 0.13794294, 0.10723616, 0.08164178, 0.06075685, 0.04409466, 0.03111947, 0.02127838, 0.01402878, 0.00886058, 0.00531256, 0.00298291, 0.00153438, 0.00069463, 0.00025272, 0.0000527734, 0.00000500, 0.00000000}; */ static const double kaiser10_table[36] = { 0.99537781, 1.00000000, 0.99537781, 0.98162644, 0.95908712, 0.92831446, 0.89005583, 0.84522401, 0.79486424, 0.74011713, 0.68217934, 0.62226347, 0.56155915, 0.50119680, 0.44221549, 0.38553619, 0.33194107, 0.28205962, 0.23636152, 0.19515633, 0.15859932, 0.12670280, 0.09935205, 0.07632451, 0.05731132, 0.04193980, 0.02979584, 0.02044510, 0.01345224, 0.00839739, 0.00488951, 0.00257636, 0.00115101, 0.00035515, 0.00000000, 0.00000000}; static const double kaiser8_table[36] = { 0.99635258, 1.00000000, 0.99635258, 0.98548012, 0.96759014, 0.94302200, 0.91223751, 0.87580811, 0.83439927, 0.78875245, 0.73966538, 0.68797126, 0.63451750, 0.58014482, 0.52566725, 0.47185369, 0.41941150, 0.36897272, 0.32108304, 0.27619388, 0.23465776, 0.19672670, 0.16255380, 0.13219758, 0.10562887, 0.08273982, 0.06335451, 0.04724088, 0.03412321, 0.02369490, 0.01563093, 0.00959968, 0.00527363, 0.00233883, 0.00050000, 0.00000000}; static const double kaiser6_table[36] = { 0.99733006, 1.00000000, 0.99733006, 0.98935595, 0.97618418, 0.95799003, 0.93501423, 0.90755855, 0.87598009, 0.84068475, 0.80211977, 0.76076565, 0.71712752, 0.67172623, 0.62508937, 0.57774224, 0.53019925, 0.48295561, 0.43647969, 0.39120616, 0.34752997, 0.30580127, 0.26632152, 0.22934058, 0.19505503, 0.16360756, 0.13508755, 0.10953262, 0.08693120, 0.06722600, 0.05031820, 0.03607231, 0.02432151, 0.01487334, 0.00752000, 0.00000000}; struct FuncDef { const double *table; int oversample; }; static const struct FuncDef _KAISER12 = {kaiser12_table, 64}; #define KAISER12 (&_KAISER12) /*static struct FuncDef _KAISER12 = {kaiser12_table, 32}; #define KAISER12 (&_KAISER12)*/ static const struct FuncDef _KAISER10 = {kaiser10_table, 32}; #define KAISER10 (&_KAISER10) static const struct FuncDef _KAISER8 = {kaiser8_table, 32}; #define KAISER8 (&_KAISER8) static const struct FuncDef _KAISER6 = {kaiser6_table, 32}; #define KAISER6 (&_KAISER6) struct QualityMapping { int base_length; int oversample; float downsample_bandwidth; float upsample_bandwidth; const struct FuncDef *window_func; }; /* This table maps conversion quality to internal parameters. There are two reasons that explain why the up-sampling bandwidth is larger than the down-sampling bandwidth: 1) When up-sampling, we can assume that the spectrum is already attenuated close to the Nyquist rate (from an A/D or a previous resampling filter) 2) Any aliasing that occurs very close to the Nyquist rate will be masked by the sinusoids/noise just below the Nyquist rate (guaranteed only for up-sampling). */ static const struct QualityMapping quality_map[11] = { { 8, 4, 0.830f, 0.860f, KAISER6 }, /* Q0 */ { 16, 4, 0.850f, 0.880f, KAISER6 }, /* Q1 */ { 32, 4, 0.882f, 0.910f, KAISER6 }, /* Q2 */ /* 82.3% cutoff ( ~60 dB stop) 6 */ { 48, 8, 0.895f, 0.917f, KAISER8 }, /* Q3 */ /* 84.9% cutoff ( ~80 dB stop) 8 */ { 64, 8, 0.921f, 0.940f, KAISER8 }, /* Q4 */ /* 88.7% cutoff ( ~80 dB stop) 8 */ { 80, 16, 0.922f, 0.940f, KAISER10}, /* Q5 */ /* 89.1% cutoff (~100 dB stop) 10 */ { 96, 16, 0.940f, 0.945f, KAISER10}, /* Q6 */ /* 91.5% cutoff (~100 dB stop) 10 */ {128, 16, 0.950f, 0.950f, KAISER10}, /* Q7 */ /* 93.1% cutoff (~100 dB stop) 10 */ {160, 16, 0.960f, 0.960f, KAISER10}, /* Q8 */ /* 94.5% cutoff (~100 dB stop) 10 */ {192, 32, 0.968f, 0.968f, KAISER12}, /* Q9 */ /* 95.5% cutoff (~100 dB stop) 10 */ {256, 32, 0.975f, 0.975f, KAISER12}, /* Q10 */ /* 96.6% cutoff (~100 dB stop) 10 */ }; /*8,24,40,56,80,104,128,160,200,256,320*/ static double compute_func(float x, const struct FuncDef *func) { float y, frac; double interp[4]; int ind; y = x*func->oversample; ind = (int)floor(y); frac = (y-ind); /* CSE with handle the repeated powers */ interp[3] = -0.1666666667*frac + 0.1666666667*(frac*frac*frac); interp[2] = frac + 0.5*(frac*frac) - 0.5*(frac*frac*frac); /*interp[2] = 1.f - 0.5f*frac - frac*frac + 0.5f*frac*frac*frac;*/ interp[0] = -0.3333333333*frac + 0.5*(frac*frac) - 0.1666666667*(frac*frac*frac); /* Just to make sure we don't have rounding problems */ interp[1] = 1.f-interp[3]-interp[2]-interp[0]; /*sum = frac*accum[1] + (1-frac)*accum[2];*/ return interp[0]*func->table[ind] + interp[1]*func->table[ind+1] + interp[2]*func->table[ind+2] + interp[3]*func->table[ind+3]; } #if 0 #include int main(int argc, char **argv) { int i; for (i=0;i<256;i++) { printf ("%f\n", compute_func(i/256., KAISER12)); } return 0; } #endif #ifdef FIXED_POINT /* The slow way of computing a sinc for the table. Should improve that some day */ static spx_word16_t sinc(float cutoff, float x, int N, const struct FuncDef *window_func) { /*fprintf (stderr, "%f ", x);*/ float xx = x * cutoff; if (fabs(x)<1e-6f) return WORD2INT(32768.*cutoff); else if (fabs(x) > .5f*N) return 0; /*FIXME: Can it really be any slower than this? */ return WORD2INT(32768.*cutoff*sin(M_PI*xx)/(M_PI*xx) * compute_func(fabs(2.*x/N), window_func)); } #else /* The slow way of computing a sinc for the table. Should improve that some day */ static spx_word16_t sinc(float cutoff, float x, int N, const struct FuncDef *window_func) { /*fprintf (stderr, "%f ", x);*/ float xx = x * cutoff; if (fabs(x)<1e-6) return cutoff; else if (fabs(x) > .5*N) return 0; /*FIXME: Can it really be any slower than this? */ return cutoff*sin(M_PI*xx)/(M_PI*xx) * compute_func(fabs(2.*x/N), window_func); } #endif #ifdef FIXED_POINT static void cubic_coef(spx_word16_t x, spx_word16_t interp[4]) { /* Compute interpolation coefficients. I'm not sure whether this corresponds to cubic interpolation but I know it's MMSE-optimal on a sinc */ spx_word16_t x2, x3; x2 = MULT16_16_P15(x, x); x3 = MULT16_16_P15(x, x2); interp[0] = PSHR32(MULT16_16(QCONST16(-0.16667f, 15),x) + MULT16_16(QCONST16(0.16667f, 15),x3),15); interp[1] = EXTRACT16(EXTEND32(x) + SHR32(SUB32(EXTEND32(x2),EXTEND32(x3)),1)); interp[3] = PSHR32(MULT16_16(QCONST16(-0.33333f, 15),x) + MULT16_16(QCONST16(.5f,15),x2) - MULT16_16(QCONST16(0.16667f, 15),x3),15); /* Just to make sure we don't have rounding problems */ interp[2] = Q15_ONE-interp[0]-interp[1]-interp[3]; if (interp[2]<32767) interp[2]+=1; } #else static void cubic_coef(spx_word16_t frac, spx_word16_t interp[4]) { /* Compute interpolation coefficients. I'm not sure whether this corresponds to cubic interpolation but I know it's MMSE-optimal on a sinc */ interp[0] = -0.16667f*frac + 0.16667f*frac*frac*frac; interp[1] = frac + 0.5f*frac*frac - 0.5f*frac*frac*frac; /*interp[2] = 1.f - 0.5f*frac - frac*frac + 0.5f*frac*frac*frac;*/ interp[3] = -0.33333f*frac + 0.5f*frac*frac - 0.16667f*frac*frac*frac; /* Just to make sure we don't have rounding problems */ interp[2] = 1.-interp[0]-interp[1]-interp[3]; } #endif static int resampler_basic_direct_single(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_word16_t *in, spx_uint32_t *in_len, spx_word16_t *out, spx_uint32_t *out_len) { const int N = st->filt_len; int out_sample = 0; int last_sample = st->last_sample[channel_index]; spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index]; const spx_word16_t *sinc_table = st->sinc_table; const int out_stride = st->out_stride; const int int_advance = st->int_advance; const int frac_advance = st->frac_advance; const spx_uint32_t den_rate = st->den_rate; spx_word32_t sum; while (!(last_sample >= (spx_int32_t)*in_len || out_sample >= (spx_int32_t)*out_len)) { const spx_word16_t *sinct = & sinc_table[samp_frac_num*N]; const spx_word16_t *iptr = & in[last_sample]; #ifndef OVERRIDE_INNER_PRODUCT_SINGLE int j; sum = 0; for(j=0;j= den_rate) { samp_frac_num -= den_rate; last_sample++; } } st->last_sample[channel_index] = last_sample; st->samp_frac_num[channel_index] = samp_frac_num; return out_sample; } #ifdef FIXED_POINT #else /* This is the same as the previous function, except with a double-precision accumulator */ static int resampler_basic_direct_double(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_word16_t *in, spx_uint32_t *in_len, spx_word16_t *out, spx_uint32_t *out_len) { const int N = st->filt_len; int out_sample = 0; int last_sample = st->last_sample[channel_index]; spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index]; const spx_word16_t *sinc_table = st->sinc_table; const int out_stride = st->out_stride; const int int_advance = st->int_advance; const int frac_advance = st->frac_advance; const spx_uint32_t den_rate = st->den_rate; double sum; while (!(last_sample >= (spx_int32_t)*in_len || out_sample >= (spx_int32_t)*out_len)) { const spx_word16_t *sinct = & sinc_table[samp_frac_num*N]; const spx_word16_t *iptr = & in[last_sample]; #ifndef OVERRIDE_INNER_PRODUCT_DOUBLE int j; double accum[4] = {0,0,0,0}; for(j=0;j= den_rate) { samp_frac_num -= den_rate; last_sample++; } } st->last_sample[channel_index] = last_sample; st->samp_frac_num[channel_index] = samp_frac_num; return out_sample; } #endif static int resampler_basic_interpolate_single(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_word16_t *in, spx_uint32_t *in_len, spx_word16_t *out, spx_uint32_t *out_len) { const int N = st->filt_len; int out_sample = 0; int last_sample = st->last_sample[channel_index]; spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index]; const int out_stride = st->out_stride; const int int_advance = st->int_advance; const int frac_advance = st->frac_advance; const spx_uint32_t den_rate = st->den_rate; spx_word32_t sum; while (!(last_sample >= (spx_int32_t)*in_len || out_sample >= (spx_int32_t)*out_len)) { const spx_word16_t *iptr = & in[last_sample]; const int offset = samp_frac_num*st->oversample/st->den_rate; #ifdef FIXED_POINT const spx_word16_t frac = PDIV32(SHL32((samp_frac_num*st->oversample) % st->den_rate,15),st->den_rate); #else const spx_word16_t frac = ((float)((samp_frac_num*st->oversample) % st->den_rate))/st->den_rate; #endif spx_word16_t interp[4]; #ifndef OVERRIDE_INTERPOLATE_PRODUCT_SINGLE int j; spx_word32_t accum[4] = {0,0,0,0}; for(j=0;jsinc_table[4+(j+1)*st->oversample-offset-2]); accum[1] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset-1]); accum[2] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset]); accum[3] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset+1]); } cubic_coef(frac, interp); sum = MULT16_32_Q15(interp[0],SHR32(accum[0], 1)) + MULT16_32_Q15(interp[1],SHR32(accum[1], 1)) + MULT16_32_Q15(interp[2],SHR32(accum[2], 1)) + MULT16_32_Q15(interp[3],SHR32(accum[3], 1)); sum = SATURATE32PSHR(sum, 15, 32767); #else cubic_coef(frac, interp); sum = interpolate_product_single(iptr, st->sinc_table + st->oversample + 4 - offset - 2, N, st->oversample, interp); #endif out[out_stride * out_sample++] = sum; last_sample += int_advance; samp_frac_num += frac_advance; if (samp_frac_num >= den_rate) { samp_frac_num -= den_rate; last_sample++; } } st->last_sample[channel_index] = last_sample; st->samp_frac_num[channel_index] = samp_frac_num; return out_sample; } #ifdef FIXED_POINT #else /* This is the same as the previous function, except with a double-precision accumulator */ static int resampler_basic_interpolate_double(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_word16_t *in, spx_uint32_t *in_len, spx_word16_t *out, spx_uint32_t *out_len) { const int N = st->filt_len; int out_sample = 0; int last_sample = st->last_sample[channel_index]; spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index]; const int out_stride = st->out_stride; const int int_advance = st->int_advance; const int frac_advance = st->frac_advance; const spx_uint32_t den_rate = st->den_rate; spx_word32_t sum; while (!(last_sample >= (spx_int32_t)*in_len || out_sample >= (spx_int32_t)*out_len)) { const spx_word16_t *iptr = & in[last_sample]; const int offset = samp_frac_num*st->oversample/st->den_rate; #ifdef FIXED_POINT const spx_word16_t frac = PDIV32(SHL32((samp_frac_num*st->oversample) % st->den_rate,15),st->den_rate); #else const spx_word16_t frac = ((float)((samp_frac_num*st->oversample) % st->den_rate))/st->den_rate; #endif spx_word16_t interp[4]; #ifndef OVERRIDE_INTERPOLATE_PRODUCT_DOUBLE int j; double accum[4] = {0,0,0,0}; for(j=0;jsinc_table[4+(j+1)*st->oversample-offset-2]); accum[1] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset-1]); accum[2] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset]); accum[3] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset+1]); } cubic_coef(frac, interp); sum = MULT16_32_Q15(interp[0],accum[0]) + MULT16_32_Q15(interp[1],accum[1]) + MULT16_32_Q15(interp[2],accum[2]) + MULT16_32_Q15(interp[3],accum[3]); #else cubic_coef(frac, interp); sum = interpolate_product_double(iptr, st->sinc_table + st->oversample + 4 - offset - 2, N, st->oversample, interp); #endif out[out_stride * out_sample++] = PSHR32(sum,15); last_sample += int_advance; samp_frac_num += frac_advance; if (samp_frac_num >= den_rate) { samp_frac_num -= den_rate; last_sample++; } } st->last_sample[channel_index] = last_sample; st->samp_frac_num[channel_index] = samp_frac_num; return out_sample; } #endif /* This resampler is used to produce zero output in situations where memory for the filter could not be allocated. The expected numbers of input and output samples are still processed so that callers failing to check error codes are not surprised, possibly getting into infinite loops. */ static int resampler_basic_zero(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_word16_t *in, spx_uint32_t *in_len, spx_word16_t *out, spx_uint32_t *out_len) { int out_sample = 0; int last_sample = st->last_sample[channel_index]; spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index]; const int out_stride = st->out_stride; const int int_advance = st->int_advance; const int frac_advance = st->frac_advance; const spx_uint32_t den_rate = st->den_rate; while (!(last_sample >= (spx_int32_t)*in_len || out_sample >= (spx_int32_t)*out_len)) { out[out_stride * out_sample++] = 0; last_sample += int_advance; samp_frac_num += frac_advance; if (samp_frac_num >= den_rate) { samp_frac_num -= den_rate; last_sample++; } } st->last_sample[channel_index] = last_sample; st->samp_frac_num[channel_index] = samp_frac_num; return out_sample; } static int update_filter(SpeexResamplerState *st) { spx_uint32_t old_length = st->filt_len; spx_uint32_t old_alloc_size = st->mem_alloc_size; int use_direct; spx_uint32_t min_sinc_table_length; spx_uint32_t min_alloc_size; st->int_advance = st->num_rate/st->den_rate; st->frac_advance = st->num_rate%st->den_rate; st->oversample = quality_map[st->quality].oversample; st->filt_len = quality_map[st->quality].base_length; if (st->num_rate > st->den_rate) { /* down-sampling */ st->cutoff = quality_map[st->quality].downsample_bandwidth * st->den_rate / st->num_rate; /* FIXME: divide the numerator and denominator by a certain amount if they're too large */ st->filt_len = st->filt_len*st->num_rate / st->den_rate; /* Round up to make sure we have a multiple of 8 for SSE */ st->filt_len = ((st->filt_len-1)&(~0x7))+8; if (2*st->den_rate < st->num_rate) st->oversample >>= 1; if (4*st->den_rate < st->num_rate) st->oversample >>= 1; if (8*st->den_rate < st->num_rate) st->oversample >>= 1; if (16*st->den_rate < st->num_rate) st->oversample >>= 1; if (st->oversample < 1) st->oversample = 1; } else { /* up-sampling */ st->cutoff = quality_map[st->quality].upsample_bandwidth; } /* Choose the resampling type that requires the least amount of memory */ #ifdef RESAMPLE_FULL_SINC_TABLE use_direct = 1; if (INT_MAX/sizeof(spx_word16_t)/st->den_rate < st->filt_len) goto fail; #else use_direct = st->filt_len*st->den_rate <= st->filt_len*st->oversample+8 && INT_MAX/sizeof(spx_word16_t)/st->den_rate >= st->filt_len; #endif if (use_direct) { min_sinc_table_length = st->filt_len*st->den_rate; } else { if ((INT_MAX/sizeof(spx_word16_t)-8)/st->oversample < st->filt_len) goto fail; min_sinc_table_length = st->filt_len*st->oversample+8; } if (st->sinc_table_length < min_sinc_table_length) { spx_word16_t *sinc_table = (spx_word16_t *)speex_realloc(st->sinc_table,min_sinc_table_length*sizeof(spx_word16_t)); if (!sinc_table) goto fail; st->sinc_table = sinc_table; st->sinc_table_length = min_sinc_table_length; } if (use_direct) { spx_uint32_t i; for (i=0;iden_rate;i++) { spx_int32_t j; for (j=0;jfilt_len;j++) { st->sinc_table[i*st->filt_len+j] = sinc(st->cutoff,((j-(spx_int32_t)st->filt_len/2+1)-((float)i)/st->den_rate), st->filt_len, quality_map[st->quality].window_func); } } #ifdef FIXED_POINT st->resampler_ptr = resampler_basic_direct_single; #else if (st->quality>8) st->resampler_ptr = resampler_basic_direct_double; else st->resampler_ptr = resampler_basic_direct_single; #endif /*fprintf (stderr, "resampler uses direct sinc table and normalised cutoff %f\n", cutoff);*/ } else { spx_int32_t i; for (i=-4;i<(spx_int32_t)(st->oversample*st->filt_len+4);i++) st->sinc_table[i+4] = sinc(st->cutoff,(i/(float)st->oversample - st->filt_len/2), st->filt_len, quality_map[st->quality].window_func); #ifdef FIXED_POINT st->resampler_ptr = resampler_basic_interpolate_single; #else if (st->quality>8) st->resampler_ptr = resampler_basic_interpolate_double; else st->resampler_ptr = resampler_basic_interpolate_single; #endif /*fprintf (stderr, "resampler uses interpolated sinc table and normalised cutoff %f\n", cutoff);*/ } /* Here's the place where we update the filter memory to take into account the change in filter length. It's probably the messiest part of the code due to handling of lots of corner cases. */ /* Adding buffer_size to filt_len won't overflow here because filt_len could be multiplied by sizeof(spx_word16_t) above. */ min_alloc_size = st->filt_len-1 + st->buffer_size; if (min_alloc_size > st->mem_alloc_size) { spx_word16_t *mem; if (INT_MAX/sizeof(spx_word16_t)/st->nb_channels < min_alloc_size) goto fail; else if (!(mem = (spx_word16_t*)speex_realloc(st->mem, st->nb_channels*min_alloc_size * sizeof(*mem)))) goto fail; st->mem = mem; st->mem_alloc_size = min_alloc_size; } if (!st->started) { spx_uint32_t i; for (i=0;inb_channels*st->mem_alloc_size;i++) st->mem[i] = 0; /*speex_warning("reinit filter");*/ } else if (st->filt_len > old_length) { spx_uint32_t i; /* Increase the filter length */ /*speex_warning("increase filter size");*/ for (i=st->nb_channels;i--;) { spx_uint32_t j; spx_uint32_t olen = old_length; /*if (st->magic_samples[i])*/ { /* Try and remove the magic samples as if nothing had happened */ /* FIXME: This is wrong but for now we need it to avoid going over the array bounds */ olen = old_length + 2*st->magic_samples[i]; for (j=old_length-1+st->magic_samples[i];j--;) st->mem[i*st->mem_alloc_size+j+st->magic_samples[i]] = st->mem[i*old_alloc_size+j]; for (j=0;jmagic_samples[i];j++) st->mem[i*st->mem_alloc_size+j] = 0; st->magic_samples[i] = 0; } if (st->filt_len > olen) { /* If the new filter length is still bigger than the "augmented" length */ /* Copy data going backward */ for (j=0;jmem[i*st->mem_alloc_size+(st->filt_len-2-j)] = st->mem[i*st->mem_alloc_size+(olen-2-j)]; /* Then put zeros for lack of anything better */ for (;jfilt_len-1;j++) st->mem[i*st->mem_alloc_size+(st->filt_len-2-j)] = 0; /* Adjust last_sample */ st->last_sample[i] += (st->filt_len - olen)/2; } else { /* Put back some of the magic! */ st->magic_samples[i] = (olen - st->filt_len)/2; for (j=0;jfilt_len-1+st->magic_samples[i];j++) st->mem[i*st->mem_alloc_size+j] = st->mem[i*st->mem_alloc_size+j+st->magic_samples[i]]; } } } else if (st->filt_len < old_length) { spx_uint32_t i; /* Reduce filter length, this a bit tricky. We need to store some of the memory as "magic" samples so they can be used directly as input the next time(s) */ for (i=0;inb_channels;i++) { spx_uint32_t j; spx_uint32_t old_magic = st->magic_samples[i]; st->magic_samples[i] = (old_length - st->filt_len)/2; /* We must copy some of the memory that's no longer used */ /* Copy data going backward */ for (j=0;jfilt_len-1+st->magic_samples[i]+old_magic;j++) st->mem[i*st->mem_alloc_size+j] = st->mem[i*st->mem_alloc_size+j+st->magic_samples[i]]; st->magic_samples[i] += old_magic; } } return RESAMPLER_ERR_SUCCESS; fail: st->resampler_ptr = resampler_basic_zero; /* st->mem may still contain consumed input samples for the filter. Restore filt_len so that filt_len - 1 still points to the position after the last of these samples. */ st->filt_len = old_length; return RESAMPLER_ERR_ALLOC_FAILED; } EXPORT SpeexResamplerState *speex_resampler_init(spx_uint32_t nb_channels, spx_uint32_t in_rate, spx_uint32_t out_rate, int quality, int *err) { return speex_resampler_init_frac(nb_channels, in_rate, out_rate, in_rate, out_rate, quality, err); } EXPORT SpeexResamplerState *speex_resampler_init_frac(spx_uint32_t nb_channels, spx_uint32_t ratio_num, spx_uint32_t ratio_den, spx_uint32_t in_rate, spx_uint32_t out_rate, int quality, int *err) { spx_uint32_t i; SpeexResamplerState *st; int filter_err; if (quality > 10 || quality < 0) { if (err) *err = RESAMPLER_ERR_INVALID_ARG; return NULL; } st = (SpeexResamplerState *)speex_alloc(sizeof(SpeexResamplerState)); st->initialised = 0; st->started = 0; st->in_rate = 0; st->out_rate = 0; st->num_rate = 0; st->den_rate = 0; st->quality = -1; st->sinc_table_length = 0; st->mem_alloc_size = 0; st->filt_len = 0; st->mem = 0; st->resampler_ptr = 0; st->cutoff = 1.f; st->nb_channels = nb_channels; st->in_stride = 1; st->out_stride = 1; st->buffer_size = 160; /* Per channel data */ st->last_sample = (spx_int32_t*)speex_alloc(nb_channels*sizeof(spx_int32_t)); st->magic_samples = (spx_uint32_t*)speex_alloc(nb_channels*sizeof(spx_uint32_t)); st->samp_frac_num = (spx_uint32_t*)speex_alloc(nb_channels*sizeof(spx_uint32_t)); for (i=0;ilast_sample[i] = 0; st->magic_samples[i] = 0; st->samp_frac_num[i] = 0; } speex_resampler_set_quality(st, quality); speex_resampler_set_rate_frac(st, ratio_num, ratio_den, in_rate, out_rate); filter_err = update_filter(st); if (filter_err == RESAMPLER_ERR_SUCCESS) { st->initialised = 1; } else { speex_resampler_destroy(st); st = NULL; } if (err) *err = filter_err; return st; } EXPORT void speex_resampler_destroy(SpeexResamplerState *st) { speex_free(st->mem); speex_free(st->sinc_table); speex_free(st->last_sample); speex_free(st->magic_samples); speex_free(st->samp_frac_num); speex_free(st); } static int speex_resampler_process_native(SpeexResamplerState *st, spx_uint32_t channel_index, spx_uint32_t *in_len, spx_word16_t *out, spx_uint32_t *out_len) { int j=0; const int N = st->filt_len; int out_sample = 0; spx_word16_t *mem = st->mem + channel_index * st->mem_alloc_size; spx_uint32_t ilen; st->started = 1; /* Call the right resampler through the function ptr */ out_sample = st->resampler_ptr(st, channel_index, mem, in_len, out, out_len); if (st->last_sample[channel_index] < (spx_int32_t)*in_len) *in_len = st->last_sample[channel_index]; *out_len = out_sample; st->last_sample[channel_index] -= *in_len; ilen = *in_len; for(j=0;jmagic_samples[channel_index]; spx_word16_t *mem = st->mem + channel_index * st->mem_alloc_size; const int N = st->filt_len; speex_resampler_process_native(st, channel_index, &tmp_in_len, *out, &out_len); st->magic_samples[channel_index] -= tmp_in_len; /* If we couldn't process all "magic" input samples, save the rest for next time */ if (st->magic_samples[channel_index]) { spx_uint32_t i; for (i=0;imagic_samples[channel_index];i++) mem[N-1+i]=mem[N-1+i+tmp_in_len]; } *out += out_len*st->out_stride; return out_len; } #ifdef FIXED_POINT EXPORT int speex_resampler_process_int(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_int16_t *in, spx_uint32_t *in_len, spx_int16_t *out, spx_uint32_t *out_len) #else EXPORT int speex_resampler_process_float(SpeexResamplerState *st, spx_uint32_t channel_index, const float *in, spx_uint32_t *in_len, float *out, spx_uint32_t *out_len) #endif { int j; spx_uint32_t ilen = *in_len; spx_uint32_t olen = *out_len; spx_word16_t *x = st->mem + channel_index * st->mem_alloc_size; const int filt_offs = st->filt_len - 1; const spx_uint32_t xlen = st->mem_alloc_size - filt_offs; const int istride = st->in_stride; if (st->magic_samples[channel_index]) olen -= speex_resampler_magic(st, channel_index, &out, olen); if (! st->magic_samples[channel_index]) { while (ilen && olen) { spx_uint32_t ichunk = (ilen > xlen) ? xlen : ilen; spx_uint32_t ochunk = olen; if (in) { for(j=0;jout_stride; if (in) in += ichunk * istride; } } *in_len -= ilen; *out_len -= olen; return st->resampler_ptr == resampler_basic_zero ? RESAMPLER_ERR_ALLOC_FAILED : RESAMPLER_ERR_SUCCESS; } #ifdef FIXED_POINT EXPORT int speex_resampler_process_float(SpeexResamplerState *st, spx_uint32_t channel_index, const float *in, spx_uint32_t *in_len, float *out, spx_uint32_t *out_len) #else EXPORT int speex_resampler_process_int(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_int16_t *in, spx_uint32_t *in_len, spx_int16_t *out, spx_uint32_t *out_len) #endif { int j; const int istride_save = st->in_stride; const int ostride_save = st->out_stride; spx_uint32_t ilen = *in_len; spx_uint32_t olen = *out_len; spx_word16_t *x = st->mem + channel_index * st->mem_alloc_size; const spx_uint32_t xlen = st->mem_alloc_size - (st->filt_len - 1); #ifdef VAR_ARRAYS const unsigned int ylen = (olen < FIXED_STACK_ALLOC) ? olen : FIXED_STACK_ALLOC; VARDECL(spx_word16_t *ystack); ALLOC(ystack, ylen, spx_word16_t); #else const unsigned int ylen = FIXED_STACK_ALLOC; spx_word16_t ystack[FIXED_STACK_ALLOC]; #endif st->out_stride = 1; while (ilen && olen) { spx_word16_t *y = ystack; spx_uint32_t ichunk = (ilen > xlen) ? xlen : ilen; spx_uint32_t ochunk = (olen > ylen) ? ylen : olen; spx_uint32_t omagic = 0; if (st->magic_samples[channel_index]) { omagic = speex_resampler_magic(st, channel_index, &y, ochunk); ochunk -= omagic; olen -= omagic; } if (! st->magic_samples[channel_index]) { if (in) { for(j=0;jfilt_len-1]=WORD2INT(in[j*istride_save]); #else x[j+st->filt_len-1]=in[j*istride_save]; #endif } else { for(j=0;jfilt_len-1]=0; } speex_resampler_process_native(st, channel_index, &ichunk, y, &ochunk); } else { ichunk = 0; ochunk = 0; } for (j=0;jout_stride = ostride_save; *in_len -= ilen; *out_len -= olen; return st->resampler_ptr == resampler_basic_zero ? RESAMPLER_ERR_ALLOC_FAILED : RESAMPLER_ERR_SUCCESS; } EXPORT int speex_resampler_process_interleaved_float(SpeexResamplerState *st, const float *in, spx_uint32_t *in_len, float *out, spx_uint32_t *out_len) { spx_uint32_t i; int istride_save, ostride_save; spx_uint32_t bak_out_len = *out_len; spx_uint32_t bak_in_len = *in_len; istride_save = st->in_stride; ostride_save = st->out_stride; st->in_stride = st->out_stride = st->nb_channels; for (i=0;inb_channels;i++) { *out_len = bak_out_len; *in_len = bak_in_len; if (in != NULL) speex_resampler_process_float(st, i, in+i, in_len, out+i, out_len); else speex_resampler_process_float(st, i, NULL, in_len, out+i, out_len); } st->in_stride = istride_save; st->out_stride = ostride_save; return st->resampler_ptr == resampler_basic_zero ? RESAMPLER_ERR_ALLOC_FAILED : RESAMPLER_ERR_SUCCESS; } EXPORT int speex_resampler_process_interleaved_int(SpeexResamplerState *st, const spx_int16_t *in, spx_uint32_t *in_len, spx_int16_t *out, spx_uint32_t *out_len) { spx_uint32_t i; int istride_save, ostride_save; spx_uint32_t bak_out_len = *out_len; spx_uint32_t bak_in_len = *in_len; istride_save = st->in_stride; ostride_save = st->out_stride; st->in_stride = st->out_stride = st->nb_channels; for (i=0;inb_channels;i++) { *out_len = bak_out_len; *in_len = bak_in_len; if (in != NULL) speex_resampler_process_int(st, i, in+i, in_len, out+i, out_len); else speex_resampler_process_int(st, i, NULL, in_len, out+i, out_len); } st->in_stride = istride_save; st->out_stride = ostride_save; return st->resampler_ptr == resampler_basic_zero ? RESAMPLER_ERR_ALLOC_FAILED : RESAMPLER_ERR_SUCCESS; } EXPORT int speex_resampler_set_rate(SpeexResamplerState *st, spx_uint32_t in_rate, spx_uint32_t out_rate) { return speex_resampler_set_rate_frac(st, in_rate, out_rate, in_rate, out_rate); } EXPORT void speex_resampler_get_rate(SpeexResamplerState *st, spx_uint32_t *in_rate, spx_uint32_t *out_rate) { *in_rate = st->in_rate; *out_rate = st->out_rate; } EXPORT int speex_resampler_set_rate_frac(SpeexResamplerState *st, spx_uint32_t ratio_num, spx_uint32_t ratio_den, spx_uint32_t in_rate, spx_uint32_t out_rate) { spx_uint32_t fact; spx_uint32_t old_den; spx_uint32_t i; if (st->in_rate == in_rate && st->out_rate == out_rate && st->num_rate == ratio_num && st->den_rate == ratio_den) return RESAMPLER_ERR_SUCCESS; old_den = st->den_rate; st->in_rate = in_rate; st->out_rate = out_rate; st->num_rate = ratio_num; st->den_rate = ratio_den; /* FIXME: This is terribly inefficient, but who cares (at least for now)? */ for (fact=2;fact<=IMIN(st->num_rate, st->den_rate);fact++) { while ((st->num_rate % fact == 0) && (st->den_rate % fact == 0)) { st->num_rate /= fact; st->den_rate /= fact; } } if (old_den > 0) { for (i=0;inb_channels;i++) { st->samp_frac_num[i]=st->samp_frac_num[i]*st->den_rate/old_den; /* Safety net */ if (st->samp_frac_num[i] >= st->den_rate) st->samp_frac_num[i] = st->den_rate-1; } } if (st->initialised) return update_filter(st); return RESAMPLER_ERR_SUCCESS; } EXPORT void speex_resampler_get_ratio(SpeexResamplerState *st, spx_uint32_t *ratio_num, spx_uint32_t *ratio_den) { *ratio_num = st->num_rate; *ratio_den = st->den_rate; } EXPORT int speex_resampler_set_quality(SpeexResamplerState *st, int quality) { if (quality > 10 || quality < 0) return RESAMPLER_ERR_INVALID_ARG; if (st->quality == quality) return RESAMPLER_ERR_SUCCESS; st->quality = quality; if (st->initialised) return update_filter(st); return RESAMPLER_ERR_SUCCESS; } EXPORT void speex_resampler_get_quality(SpeexResamplerState *st, int *quality) { *quality = st->quality; } EXPORT void speex_resampler_set_input_stride(SpeexResamplerState *st, spx_uint32_t stride) { st->in_stride = stride; } EXPORT void speex_resampler_get_input_stride(SpeexResamplerState *st, spx_uint32_t *stride) { *stride = st->in_stride; } EXPORT void speex_resampler_set_output_stride(SpeexResamplerState *st, spx_uint32_t stride) { st->out_stride = stride; } EXPORT void speex_resampler_get_output_stride(SpeexResamplerState *st, spx_uint32_t *stride) { *stride = st->out_stride; } EXPORT int speex_resampler_get_input_latency(SpeexResamplerState *st) { return st->filt_len / 2; } EXPORT int speex_resampler_get_output_latency(SpeexResamplerState *st) { return ((st->filt_len / 2) * st->den_rate + (st->num_rate >> 1)) / st->num_rate; } EXPORT int speex_resampler_skip_zeros(SpeexResamplerState *st) { spx_uint32_t i; for (i=0;inb_channels;i++) st->last_sample[i] = st->filt_len/2; return RESAMPLER_ERR_SUCCESS; } EXPORT int speex_resampler_reset_mem(SpeexResamplerState *st) { spx_uint32_t i; for (i=0;inb_channels;i++) { st->last_sample[i] = 0; st->magic_samples[i] = 0; st->samp_frac_num[i] = 0; } for (i=0;inb_channels*(st->filt_len-1);i++) st->mem[i] = 0; return RESAMPLER_ERR_SUCCESS; } EXPORT const char *speex_resampler_strerror(int err) { switch (err) { case RESAMPLER_ERR_SUCCESS: return "Success."; case RESAMPLER_ERR_ALLOC_FAILED: return "Memory allocation failed."; case RESAMPLER_ERR_BAD_STATE: return "Bad resampler state."; case RESAMPLER_ERR_INVALID_ARG: return "Invalid argument."; case RESAMPLER_ERR_PTR_OVERLAP: return "Input and output buffers overlap."; default: return "Unknown error. Bad error code or strange version mismatch."; } } mumble-1.3.4/3rdparty/speexdsp-src/libspeexdsp/preprocess.c0000664000175000017500000012067514010707343023715 0ustar builderbuilder/* Copyright (C) 2003 Epic Games (written by Jean-Marc Valin) Copyright (C) 2004-2006 Epic Games File: preprocess.c Preprocessor with denoising based on the algorithm by Ephraim and Malah Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* Recommended papers: Y. Ephraim and D. Malah, "Speech enhancement using minimum mean-square error short-time spectral amplitude estimator". IEEE Transactions on Acoustics, Speech and Signal Processing, vol. ASSP-32, no. 6, pp. 1109-1121, 1984. Y. Ephraim and D. Malah, "Speech enhancement using minimum mean-square error log-spectral amplitude estimator". IEEE Transactions on Acoustics, Speech and Signal Processing, vol. ASSP-33, no. 2, pp. 443-445, 1985. I. Cohen and B. Berdugo, "Speech enhancement for non-stationary noise environments". Signal Processing, vol. 81, no. 2, pp. 2403-2418, 2001. Stefan Gustafsson, Rainer Martin, Peter Jax, and Peter Vary. "A psychoacoustic approach to combined acoustic echo cancellation and noise reduction". IEEE Transactions on Speech and Audio Processing, 2002. J.-M. Valin, J. Rouat, and F. Michaud, "Microphone array post-filter for separation of simultaneous non-stationary sources". In Proceedings IEEE International Conference on Acoustics, Speech, and Signal Processing, 2004. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "speex/speex_preprocess.h" #include "speex/speex_echo.h" #include "arch.h" #include "fftwrap.h" #include "filterbank.h" #include "math_approx.h" #include "os_support.h" #define LOUDNESS_EXP 5.f #define AMP_SCALE .001f #define AMP_SCALE_1 1000.f #define NB_BANDS 24 #define SPEECH_PROB_START_DEFAULT QCONST16(0.35f,15) #define SPEECH_PROB_CONTINUE_DEFAULT QCONST16(0.20f,15) #define NOISE_SUPPRESS_DEFAULT -15 #define ECHO_SUPPRESS_DEFAULT -40 #define ECHO_SUPPRESS_ACTIVE_DEFAULT -15 #ifndef NULL #define NULL 0 #endif #define SQR(x) ((x)*(x)) #define SQR16(x) (MULT16_16((x),(x))) #define SQR16_Q15(x) (MULT16_16_Q15((x),(x))) #ifdef FIXED_POINT static inline spx_word16_t DIV32_16_Q8(spx_word32_t a, spx_word32_t b) { if (SHR32(a,7) >= b) { return 32767; } else { if (b>=QCONST32(1,23)) { a = SHR32(a,8); b = SHR32(b,8); } if (b>=QCONST32(1,19)) { a = SHR32(a,4); b = SHR32(b,4); } if (b>=QCONST32(1,15)) { a = SHR32(a,4); b = SHR32(b,4); } a = SHL32(a,8); return PDIV32_16(a,b); } } static inline spx_word16_t DIV32_16_Q15(spx_word32_t a, spx_word32_t b) { if (SHR32(a,15) >= b) { return 32767; } else { if (b>=QCONST32(1,23)) { a = SHR32(a,8); b = SHR32(b,8); } if (b>=QCONST32(1,19)) { a = SHR32(a,4); b = SHR32(b,4); } if (b>=QCONST32(1,15)) { a = SHR32(a,4); b = SHR32(b,4); } a = SHL32(a,15)-a; return DIV32_16(a,b); } } #define SNR_SCALING 256.f #define SNR_SCALING_1 0.0039062f #define SNR_SHIFT 8 #define FRAC_SCALING 32767.f #define FRAC_SCALING_1 3.0518e-05 #define FRAC_SHIFT 1 #define EXPIN_SCALING 2048.f #define EXPIN_SCALING_1 0.00048828f #define EXPIN_SHIFT 11 #define EXPOUT_SCALING_1 1.5259e-05 #define NOISE_SHIFT 7 #else #define DIV32_16_Q8(a,b) ((a)/(b)) #define DIV32_16_Q15(a,b) ((a)/(b)) #define SNR_SCALING 1.f #define SNR_SCALING_1 1.f #define SNR_SHIFT 0 #define FRAC_SCALING 1.f #define FRAC_SCALING_1 1.f #define FRAC_SHIFT 0 #define NOISE_SHIFT 0 #define EXPIN_SCALING 1.f #define EXPIN_SCALING_1 1.f #define EXPOUT_SCALING_1 1.f #endif /** Speex pre-processor state. */ struct SpeexPreprocessState_ { /* Basic info */ int frame_size; /**< Number of samples processed each time */ int ps_size; /**< Number of points in the power spectrum */ int sampling_rate; /**< Sampling rate of the input/output */ int nbands; FilterBank *bank; /* Parameters */ int denoise_enabled; int vad_enabled; int dereverb_enabled; spx_word16_t reverb_decay; spx_word16_t reverb_level; spx_word16_t speech_prob_start; spx_word16_t speech_prob_continue; int noise_suppress; int echo_suppress; int echo_suppress_active; SpeexEchoState *echo_state; spx_word16_t speech_prob; /**< Probability last frame was speech */ /* DSP-related arrays */ spx_word16_t *frame; /**< Processing frame (2*ps_size) */ spx_word16_t *ft; /**< Processing frame in freq domain (2*ps_size) */ spx_word32_t *ps; /**< Current power spectrum */ spx_word16_t *gain2; /**< Adjusted gains */ spx_word16_t *gain_floor; /**< Minimum gain allowed */ spx_word16_t *window; /**< Analysis/Synthesis window */ spx_word32_t *noise; /**< Noise estimate */ spx_word32_t *reverb_estimate; /**< Estimate of reverb energy */ spx_word32_t *old_ps; /**< Power spectrum for last frame */ spx_word16_t *gain; /**< Ephraim Malah gain */ spx_word16_t *prior; /**< A-priori SNR */ spx_word16_t *post; /**< A-posteriori SNR */ spx_word32_t *S; /**< Smoothed power spectrum */ spx_word32_t *Smin; /**< See Cohen paper */ spx_word32_t *Stmp; /**< See Cohen paper */ int *update_prob; /**< Probability of speech presence for noise update */ spx_word16_t *zeta; /**< Smoothed a priori SNR */ spx_word32_t *echo_noise; spx_word32_t *residual_echo; /* Misc */ spx_word16_t *inbuf; /**< Input buffer (overlapped analysis) */ spx_word16_t *outbuf; /**< Output buffer (for overlap and add) */ /* AGC stuff, only for floating point for now */ #ifndef FIXED_POINT int agc_enabled; float agc_level; float loudness_accum; float *loudness_weight; /**< Perceptual loudness curve */ float loudness; /**< Loudness estimate */ float agc_gain; /**< Current AGC gain */ float max_gain; /**< Maximum gain allowed */ float max_increase_step; /**< Maximum increase in gain from one frame to another */ float max_decrease_step; /**< Maximum decrease in gain from one frame to another */ float prev_loudness; /**< Loudness of previous frame */ float init_max; /**< Current gain limit during initialisation */ #endif int nb_adapt; /**< Number of frames used for adaptation so far */ int was_speech; int min_count; /**< Number of frames processed so far */ void *fft_lookup; /**< Lookup table for the FFT */ #ifdef FIXED_POINT int frame_shift; #endif }; static void conj_window(spx_word16_t *w, int len) { int i; for (i=0;i19) return ADD32(EXTEND32(Q15_ONE),EXTEND32(DIV32_16(QCONST32(.1296,23), SHR32(xx,EXPIN_SHIFT-SNR_SHIFT)))); frac = SHL32(xx-SHL32(ind,10),5); return SHL32(DIV32_16(PSHR32(MULT16_16(Q15_ONE-frac,table[ind]) + MULT16_16(frac,table[ind+1]),7),(spx_sqrt(SHL32(xx,15)+6711))),7); } static inline spx_word16_t qcurve(spx_word16_t x) { x = MAX16(x, 1); return DIV32_16(SHL32(EXTEND32(32767),9),ADD16(512,MULT16_16_Q15(QCONST16(.60f,15),DIV32_16(32767,x)))); } /* Compute the gain floor based on different floors for the background noise and residual echo */ static void compute_gain_floor(int noise_suppress, int effective_echo_suppress, spx_word32_t *noise, spx_word32_t *echo, spx_word16_t *gain_floor, int len) { int i; if (noise_suppress > effective_echo_suppress) { spx_word16_t noise_gain, gain_ratio; noise_gain = EXTRACT16(MIN32(Q15_ONE,SHR32(spx_exp(MULT16_16(QCONST16(0.11513,11),noise_suppress)),1))); gain_ratio = EXTRACT16(MIN32(Q15_ONE,SHR32(spx_exp(MULT16_16(QCONST16(.2302585f,11),effective_echo_suppress-noise_suppress)),1))); /* gain_floor = sqrt [ (noise*noise_floor + echo*echo_floor) / (noise+echo) ] */ for (i=0;i19) return FRAC_SCALING*(1+.1296/x); frac = 2*x-integer; return FRAC_SCALING*((1-frac)*table[ind] + frac*table[ind+1])/sqrt(x+.0001f); } static inline spx_word16_t qcurve(spx_word16_t x) { return 1.f/(1.f+.15f/(SNR_SCALING_1*x)); } static void compute_gain_floor(int noise_suppress, int effective_echo_suppress, spx_word32_t *noise, spx_word32_t *echo, spx_word16_t *gain_floor, int len) { int i; float echo_floor; float noise_floor; noise_floor = exp(.2302585f*noise_suppress); echo_floor = exp(.2302585f*effective_echo_suppress); /* Compute the gain floor based on different floors for the background noise and residual echo */ for (i=0;iframe_size = frame_size; /* Round ps_size down to the nearest power of two */ #if 0 i=1; st->ps_size = st->frame_size; while(1) { if (st->ps_size & ~i) { st->ps_size &= ~i; i<<=1; } else { break; } } if (st->ps_size < 3*st->frame_size/4) st->ps_size = st->ps_size * 3 / 2; #else st->ps_size = st->frame_size; #endif N = st->ps_size; N3 = 2*N - st->frame_size; N4 = st->frame_size - N3; st->sampling_rate = sampling_rate; st->denoise_enabled = 1; st->vad_enabled = 0; st->dereverb_enabled = 0; st->reverb_decay = 0; st->reverb_level = 0; st->noise_suppress = NOISE_SUPPRESS_DEFAULT; st->echo_suppress = ECHO_SUPPRESS_DEFAULT; st->echo_suppress_active = ECHO_SUPPRESS_ACTIVE_DEFAULT; st->speech_prob_start = SPEECH_PROB_START_DEFAULT; st->speech_prob_continue = SPEECH_PROB_CONTINUE_DEFAULT; st->echo_state = NULL; st->nbands = NB_BANDS; M = st->nbands; st->bank = filterbank_new(M, sampling_rate, N, 1); st->frame = (spx_word16_t*)speex_alloc(2*N*sizeof(spx_word16_t)); st->window = (spx_word16_t*)speex_alloc(2*N*sizeof(spx_word16_t)); st->ft = (spx_word16_t*)speex_alloc(2*N*sizeof(spx_word16_t)); st->ps = (spx_word32_t*)speex_alloc((N+M)*sizeof(spx_word32_t)); st->noise = (spx_word32_t*)speex_alloc((N+M)*sizeof(spx_word32_t)); st->echo_noise = (spx_word32_t*)speex_alloc((N+M)*sizeof(spx_word32_t)); st->residual_echo = (spx_word32_t*)speex_alloc((N+M)*sizeof(spx_word32_t)); st->reverb_estimate = (spx_word32_t*)speex_alloc((N+M)*sizeof(spx_word32_t)); st->old_ps = (spx_word32_t*)speex_alloc((N+M)*sizeof(spx_word32_t)); st->prior = (spx_word16_t*)speex_alloc((N+M)*sizeof(spx_word16_t)); st->post = (spx_word16_t*)speex_alloc((N+M)*sizeof(spx_word16_t)); st->gain = (spx_word16_t*)speex_alloc((N+M)*sizeof(spx_word16_t)); st->gain2 = (spx_word16_t*)speex_alloc((N+M)*sizeof(spx_word16_t)); st->gain_floor = (spx_word16_t*)speex_alloc((N+M)*sizeof(spx_word16_t)); st->zeta = (spx_word16_t*)speex_alloc((N+M)*sizeof(spx_word16_t)); st->S = (spx_word32_t*)speex_alloc(N*sizeof(spx_word32_t)); st->Smin = (spx_word32_t*)speex_alloc(N*sizeof(spx_word32_t)); st->Stmp = (spx_word32_t*)speex_alloc(N*sizeof(spx_word32_t)); st->update_prob = (int*)speex_alloc(N*sizeof(int)); st->inbuf = (spx_word16_t*)speex_alloc(N3*sizeof(spx_word16_t)); st->outbuf = (spx_word16_t*)speex_alloc(N3*sizeof(spx_word16_t)); conj_window(st->window, 2*N3); for (i=2*N3;i<2*st->ps_size;i++) st->window[i]=Q15_ONE; if (N4>0) { for (i=N3-1;i>=0;i--) { st->window[i+N3+N4]=st->window[i+N3]; st->window[i+N3]=1; } } for (i=0;inoise[i]=QCONST32(1.f,NOISE_SHIFT); st->reverb_estimate[i]=0; st->old_ps[i]=1; st->gain[i]=Q15_ONE; st->post[i]=SHL16(1, SNR_SHIFT); st->prior[i]=SHL16(1, SNR_SHIFT); } for (i=0;iupdate_prob[i] = 1; for (i=0;iinbuf[i]=0; st->outbuf[i]=0; } #ifndef FIXED_POINT st->agc_enabled = 0; st->agc_level = 8000; st->loudness_weight = (float*)speex_alloc(N*sizeof(float)); for (i=0;iloudness_weight[i] = .5f*(1.f/(1.f+ff/8000.f))+1.f*exp(-.5f*(ff-3800.f)*(ff-3800.f)/9e5f);*/ st->loudness_weight[i] = .35f-.35f*ff/16000.f+.73f*exp(-.5f*(ff-3800)*(ff-3800)/9e5f); if (st->loudness_weight[i]<.01f) st->loudness_weight[i]=.01f; st->loudness_weight[i] *= st->loudness_weight[i]; } /*st->loudness = pow(AMP_SCALE*st->agc_level,LOUDNESS_EXP);*/ st->loudness = 1e-15; st->agc_gain = 1; st->max_gain = 30; st->max_increase_step = exp(0.11513f * 12.*st->frame_size / st->sampling_rate); st->max_decrease_step = exp(-0.11513f * 40.*st->frame_size / st->sampling_rate); st->prev_loudness = 1; st->init_max = 1; #endif st->was_speech = 0; st->fft_lookup = spx_fft_init(2*N); st->nb_adapt=0; st->min_count=0; return st; } EXPORT void speex_preprocess_state_destroy(SpeexPreprocessState *st) { speex_free(st->frame); speex_free(st->ft); speex_free(st->ps); speex_free(st->gain2); speex_free(st->gain_floor); speex_free(st->window); speex_free(st->noise); speex_free(st->reverb_estimate); speex_free(st->old_ps); speex_free(st->gain); speex_free(st->prior); speex_free(st->post); #ifndef FIXED_POINT speex_free(st->loudness_weight); #endif speex_free(st->echo_noise); speex_free(st->residual_echo); speex_free(st->S); speex_free(st->Smin); speex_free(st->Stmp); speex_free(st->update_prob); speex_free(st->zeta); speex_free(st->inbuf); speex_free(st->outbuf); spx_fft_destroy(st->fft_lookup); filterbank_destroy(st->bank); speex_free(st); } /* FIXME: The AGC doesn't work yet with fixed-point*/ #ifndef FIXED_POINT static void speex_compute_agc(SpeexPreprocessState *st, spx_word16_t Pframe, spx_word16_t *ft) { int i; int N = st->ps_size; float target_gain; float loudness=1.f; float rate; for (i=2;ips[i]* st->loudness_weight[i]; } loudness=sqrt(loudness); /*if (loudness < 2*pow(st->loudness, 1.0/LOUDNESS_EXP) && loudness*2 > pow(st->loudness, 1.0/LOUDNESS_EXP))*/ if (Pframe>.3f) { /*rate=2.0f*Pframe*Pframe/(1+st->nb_loudness_adapt);*/ rate = .03*Pframe*Pframe; st->loudness = (1-rate)*st->loudness + (rate)*pow(AMP_SCALE*loudness, LOUDNESS_EXP); st->loudness_accum = (1-rate)*st->loudness_accum + rate; if (st->init_max < st->max_gain && st->nb_adapt > 20) st->init_max *= 1.f + .1f*Pframe*Pframe; } /*printf ("%f %f %f %f\n", Pframe, loudness, pow(st->loudness, 1.0f/LOUDNESS_EXP), st->loudness2);*/ target_gain = AMP_SCALE*st->agc_level*pow(st->loudness/(1e-4+st->loudness_accum), -1.0f/LOUDNESS_EXP); if ((Pframe>.5 && st->nb_adapt > 20) || target_gain < st->agc_gain) { if (target_gain > st->max_increase_step*st->agc_gain) target_gain = st->max_increase_step*st->agc_gain; if (target_gain < st->max_decrease_step*st->agc_gain && loudness < 10*st->prev_loudness) target_gain = st->max_decrease_step*st->agc_gain; if (target_gain > st->max_gain) target_gain = st->max_gain; if (target_gain > st->init_max) target_gain = st->init_max; st->agc_gain = target_gain; } /*fprintf (stderr, "%f %f %f\n", loudness, (float)AMP_SCALE_1*pow(st->loudness, 1.0f/LOUDNESS_EXP), st->agc_gain);*/ for (i=0;i<2*N;i++) ft[i] *= st->agc_gain; st->prev_loudness = loudness; } #endif static void preprocess_analysis(SpeexPreprocessState *st, spx_int16_t *x) { int i; int N = st->ps_size; int N3 = 2*N - st->frame_size; int N4 = st->frame_size - N3; spx_word32_t *ps=st->ps; /* 'Build' input frame */ for (i=0;iframe[i]=st->inbuf[i]; for (i=0;iframe_size;i++) st->frame[N3+i]=x[i]; /* Update inbuf */ for (i=0;iinbuf[i]=x[N4+i]; /* Windowing */ for (i=0;i<2*N;i++) st->frame[i] = MULT16_16_Q15(st->frame[i], st->window[i]); #ifdef FIXED_POINT { spx_word16_t max_val=0; for (i=0;i<2*N;i++) max_val = MAX16(max_val, ABS16(st->frame[i])); st->frame_shift = 14-spx_ilog2(EXTEND32(max_val)); for (i=0;i<2*N;i++) st->frame[i] = SHL16(st->frame[i], st->frame_shift); } #endif /* Perform FFT */ spx_fft(st->fft_lookup, st->frame, st->ft); /* Power spectrum */ ps[0]=MULT16_16(st->ft[0],st->ft[0]); for (i=1;ift[2*i-1],st->ft[2*i-1]) + MULT16_16(st->ft[2*i],st->ft[2*i]); for (i=0;ips[i] = PSHR32(st->ps[i], 2*st->frame_shift); filterbank_compute_bank32(st->bank, ps, ps+N); } static void update_noise_prob(SpeexPreprocessState *st) { int i; int min_range; int N = st->ps_size; for (i=1;iS[i] = MULT16_32_Q15(QCONST16(.8f,15),st->S[i]) + MULT16_32_Q15(QCONST16(.05f,15),st->ps[i-1]) + MULT16_32_Q15(QCONST16(.1f,15),st->ps[i]) + MULT16_32_Q15(QCONST16(.05f,15),st->ps[i+1]); st->S[0] = MULT16_32_Q15(QCONST16(.8f,15),st->S[0]) + MULT16_32_Q15(QCONST16(.2f,15),st->ps[0]); st->S[N-1] = MULT16_32_Q15(QCONST16(.8f,15),st->S[N-1]) + MULT16_32_Q15(QCONST16(.2f,15),st->ps[N-1]); if (st->nb_adapt==1) { for (i=0;iSmin[i] = st->Stmp[i] = 0; } if (st->nb_adapt < 100) min_range = 15; else if (st->nb_adapt < 1000) min_range = 50; else if (st->nb_adapt < 10000) min_range = 150; else min_range = 300; if (st->min_count > min_range) { st->min_count = 0; for (i=0;iSmin[i] = MIN32(st->Stmp[i], st->S[i]); st->Stmp[i] = st->S[i]; } } else { for (i=0;iSmin[i] = MIN32(st->Smin[i], st->S[i]); st->Stmp[i] = MIN32(st->Stmp[i], st->S[i]); } } for (i=0;iS[i]) > st->Smin[i]) st->update_prob[i] = 1; else st->update_prob[i] = 0; /*fprintf (stderr, "%f ", st->S[i]/st->Smin[i]);*/ /*fprintf (stderr, "%f ", st->update_prob[i]);*/ } } #define NOISE_OVERCOMPENS 1. void speex_echo_get_residual(SpeexEchoState *st, spx_word32_t *Yout, int len); EXPORT int speex_preprocess(SpeexPreprocessState *st, spx_int16_t *x, spx_int32_t *echo) { return speex_preprocess_run(st, x); } EXPORT int speex_preprocess_run(SpeexPreprocessState *st, spx_int16_t *x) { int i; int M; int N = st->ps_size; int N3 = 2*N - st->frame_size; int N4 = st->frame_size - N3; spx_word32_t *ps=st->ps; spx_word32_t Zframe; spx_word16_t Pframe; spx_word16_t beta, beta_1; spx_word16_t effective_echo_suppress; st->nb_adapt++; if (st->nb_adapt>20000) st->nb_adapt = 20000; st->min_count++; beta = MAX16(QCONST16(.03,15),DIV32_16(Q15_ONE,st->nb_adapt)); beta_1 = Q15_ONE-beta; M = st->nbands; /* Deal with residual echo if provided */ if (st->echo_state) { speex_echo_get_residual(st->echo_state, st->residual_echo, N); #ifndef FIXED_POINT /* If there are NaNs or ridiculous values, it'll show up in the DC and we just reset everything to zero */ if (!(st->residual_echo[0] >=0 && st->residual_echo[0]residual_echo[i] = 0; } #endif for (i=0;iecho_noise[i] = MAX32(MULT16_32_Q15(QCONST16(.6f,15),st->echo_noise[i]), st->residual_echo[i]); filterbank_compute_bank32(st->bank, st->echo_noise, st->echo_noise+N); } else { for (i=0;iecho_noise[i] = 0; } preprocess_analysis(st, x); update_noise_prob(st); /* Noise estimation always updated for the 10 first frames */ /*if (st->nb_adapt<10) { for (i=1;iupdate_prob[i] = 0; } */ /* Update the noise estimate for the frequencies where it can be */ for (i=0;iupdate_prob[i] || st->ps[i] < PSHR32(st->noise[i], NOISE_SHIFT)) st->noise[i] = MAX32(EXTEND32(0),MULT16_32_Q15(beta_1,st->noise[i]) + MULT16_32_Q15(beta,SHL32(st->ps[i],NOISE_SHIFT))); } filterbank_compute_bank32(st->bank, st->noise, st->noise+N); /* Special case for first frame */ if (st->nb_adapt==1) for (i=0;iold_ps[i] = ps[i]; /* Compute a posteriori SNR */ for (i=0;inoise[i],NOISE_SHIFT)) , st->echo_noise[i]) , st->reverb_estimate[i]); /* A posteriori SNR = ps/noise - 1*/ st->post[i] = SUB16(DIV32_16_Q8(ps[i],tot_noise), QCONST16(1.f,SNR_SHIFT)); st->post[i]=MIN16(st->post[i], QCONST16(100.f,SNR_SHIFT)); /* Computing update gamma = .1 + .9*(old/(old+noise))^2 */ gamma = QCONST16(.1f,15)+MULT16_16_Q15(QCONST16(.89f,15),SQR16_Q15(DIV32_16_Q15(st->old_ps[i],ADD32(st->old_ps[i],tot_noise)))); /* A priori SNR update = gamma*max(0,post) + (1-gamma)*old/noise */ st->prior[i] = EXTRACT16(PSHR32(ADD32(MULT16_16(gamma,MAX16(0,st->post[i])), MULT16_16(Q15_ONE-gamma,DIV32_16_Q8(st->old_ps[i],tot_noise))), 15)); st->prior[i]=MIN16(st->prior[i], QCONST16(100.f,SNR_SHIFT)); } /*print_vec(st->post, N+M, "");*/ /* Recursive average of the a priori SNR. A bit smoothed for the psd components */ st->zeta[0] = PSHR32(ADD32(MULT16_16(QCONST16(.7f,15),st->zeta[0]), MULT16_16(QCONST16(.3f,15),st->prior[0])),15); for (i=1;izeta[i] = PSHR32(ADD32(ADD32(ADD32(MULT16_16(QCONST16(.7f,15),st->zeta[i]), MULT16_16(QCONST16(.15f,15),st->prior[i])), MULT16_16(QCONST16(.075f,15),st->prior[i-1])), MULT16_16(QCONST16(.075f,15),st->prior[i+1])),15); for (i=N-1;izeta[i] = PSHR32(ADD32(MULT16_16(QCONST16(.7f,15),st->zeta[i]), MULT16_16(QCONST16(.3f,15),st->prior[i])),15); /* Speech probability of presence for the entire frame is based on the average filterbank a priori SNR */ Zframe = 0; for (i=N;izeta[i])); Pframe = QCONST16(.1f,15)+MULT16_16_Q15(QCONST16(.899f,15),qcurve(DIV32_16(Zframe,st->nbands))); effective_echo_suppress = EXTRACT16(PSHR32(ADD32(MULT16_16(SUB16(Q15_ONE,Pframe), st->echo_suppress), MULT16_16(Pframe, st->echo_suppress_active)),15)); compute_gain_floor(st->noise_suppress, effective_echo_suppress, st->noise+N, st->echo_noise+N, st->gain_floor+N, M); /* Compute Ephraim & Malah gain speech probability of presence for each critical band (Bark scale) Technically this is actually wrong because the EM gaim assumes a slightly different probability distribution */ for (i=N;iprior[i]), 15), ADD16(st->prior[i], SHL32(1,SNR_SHIFT))); theta = MULT16_32_P15(prior_ratio, QCONST32(1.f,EXPIN_SHIFT)+SHL32(EXTEND32(st->post[i]),EXPIN_SHIFT-SNR_SHIFT)); MM = hypergeom_gain(theta); /* Gain with bound */ st->gain[i] = EXTRACT16(MIN32(Q15_ONE, MULT16_32_Q15(prior_ratio, MM))); /* Save old Bark power spectrum */ st->old_ps[i] = MULT16_32_P15(QCONST16(.2f,15),st->old_ps[i]) + MULT16_32_P15(MULT16_16_P15(QCONST16(.8f,15),SQR16_Q15(st->gain[i])),ps[i]); P1 = QCONST16(.199f,15)+MULT16_16_Q15(QCONST16(.8f,15),qcurve (st->zeta[i])); q = Q15_ONE-MULT16_16_Q15(Pframe,P1); #ifdef FIXED_POINT theta = MIN32(theta, EXTEND32(32767)); /*Q8*/tmp = MULT16_16_Q15((SHL32(1,SNR_SHIFT)+st->prior[i]),EXTRACT16(MIN32(Q15ONE,SHR32(spx_exp(-EXTRACT16(theta)),1)))); tmp = MIN16(QCONST16(3.,SNR_SHIFT), tmp); /* Prevent overflows in the next line*/ /*Q8*/tmp = EXTRACT16(PSHR32(MULT16_16(PDIV32_16(SHL32(EXTEND32(q),8),(Q15_ONE-q)),tmp),8)); st->gain2[i]=DIV32_16(SHL32(EXTEND32(32767),SNR_SHIFT), ADD16(256,tmp)); #else st->gain2[i]=1/(1.f + (q/(1.f-q))*(1+st->prior[i])*exp(-theta)); #endif } /* Convert the EM gains and speech prob to linear frequency */ filterbank_compute_psd16(st->bank,st->gain2+N, st->gain2); filterbank_compute_psd16(st->bank,st->gain+N, st->gain); /* Use 1 for linear gain resolution (best) or 0 for Bark gain resolution (faster) */ if (1) { filterbank_compute_psd16(st->bank,st->gain_floor+N, st->gain_floor); /* Compute gain according to the Ephraim-Malah algorithm -- linear frequency */ for (i=0;iprior[i]), 15), ADD16(st->prior[i], SHL32(1,SNR_SHIFT))); theta = MULT16_32_P15(prior_ratio, QCONST32(1.f,EXPIN_SHIFT)+SHL32(EXTEND32(st->post[i]),EXPIN_SHIFT-SNR_SHIFT)); /* Optimal estimator for loudness domain */ MM = hypergeom_gain(theta); /* EM gain with bound */ g = EXTRACT16(MIN32(Q15_ONE, MULT16_32_Q15(prior_ratio, MM))); /* Interpolated speech probability of presence */ p = st->gain2[i]; /* Constrain the gain to be close to the Bark scale gain */ if (MULT16_16_Q15(QCONST16(.333f,15),g) > st->gain[i]) g = MULT16_16(3,st->gain[i]); st->gain[i] = g; /* Save old power spectrum */ st->old_ps[i] = MULT16_32_P15(QCONST16(.2f,15),st->old_ps[i]) + MULT16_32_P15(MULT16_16_P15(QCONST16(.8f,15),SQR16_Q15(st->gain[i])),ps[i]); /* Apply gain floor */ if (st->gain[i] < st->gain_floor[i]) st->gain[i] = st->gain_floor[i]; /* Exponential decay model for reverberation (unused) */ /*st->reverb_estimate[i] = st->reverb_decay*st->reverb_estimate[i] + st->reverb_decay*st->reverb_level*st->gain[i]*st->gain[i]*st->ps[i];*/ /* Take into account speech probability of presence (loudness domain MMSE estimator) */ /* gain2 = [p*sqrt(gain)+(1-p)*sqrt(gain _floor) ]^2 */ tmp = MULT16_16_P15(p,spx_sqrt(SHL32(EXTEND32(st->gain[i]),15))) + MULT16_16_P15(SUB16(Q15_ONE,p),spx_sqrt(SHL32(EXTEND32(st->gain_floor[i]),15))); st->gain2[i]=SQR16_Q15(tmp); /* Use this if you want a log-domain MMSE estimator instead */ /*st->gain2[i] = pow(st->gain[i], p) * pow(st->gain_floor[i],1.f-p);*/ } } else { for (i=N;igain2[i]; st->gain[i] = MAX16(st->gain[i], st->gain_floor[i]); tmp = MULT16_16_P15(p,spx_sqrt(SHL32(EXTEND32(st->gain[i]),15))) + MULT16_16_P15(SUB16(Q15_ONE,p),spx_sqrt(SHL32(EXTEND32(st->gain_floor[i]),15))); st->gain2[i]=SQR16_Q15(tmp); } filterbank_compute_psd16(st->bank,st->gain2+N, st->gain2); } /* If noise suppression is off, don't apply the gain (but then why call this in the first place!) */ if (!st->denoise_enabled) { for (i=0;igain2[i]=Q15_ONE; } /* Apply computed gain */ for (i=1;ift[2*i-1] = MULT16_16_P15(st->gain2[i],st->ft[2*i-1]); st->ft[2*i] = MULT16_16_P15(st->gain2[i],st->ft[2*i]); } st->ft[0] = MULT16_16_P15(st->gain2[0],st->ft[0]); st->ft[2*N-1] = MULT16_16_P15(st->gain2[N-1],st->ft[2*N-1]); /*FIXME: This *will* not work for fixed-point */ #ifndef FIXED_POINT if (st->agc_enabled) speex_compute_agc(st, Pframe, st->ft); #endif /* Inverse FFT with 1/N scaling */ spx_ifft(st->fft_lookup, st->ft, st->frame); /* Scale back to original (lower) amplitude */ for (i=0;i<2*N;i++) st->frame[i] = PSHR16(st->frame[i], st->frame_shift); /*FIXME: This *will* not work for fixed-point */ #ifndef FIXED_POINT if (st->agc_enabled) { float max_sample=0; for (i=0;i<2*N;i++) if (fabs(st->frame[i])>max_sample) max_sample = fabs(st->frame[i]); if (max_sample>28000.f) { float damp = 28000.f/max_sample; for (i=0;i<2*N;i++) st->frame[i] *= damp; } } #endif /* Synthesis window (for WOLA) */ for (i=0;i<2*N;i++) st->frame[i] = MULT16_16_Q15(st->frame[i], st->window[i]); /* Perform overlap and add */ for (i=0;ioutbuf[i]), EXTEND32(st->frame[i]))); for (i=0;iframe[N3+i]; /* Update outbuf */ for (i=0;ioutbuf[i] = st->frame[st->frame_size+i]; /* FIXME: This VAD is a kludge */ st->speech_prob = Pframe; if (st->vad_enabled) { if (st->speech_prob > st->speech_prob_start || (st->was_speech && st->speech_prob > st->speech_prob_continue)) { st->was_speech=1; return 1; } else { st->was_speech=0; return 0; } } else { return 1; } } EXPORT void speex_preprocess_estimate_update(SpeexPreprocessState *st, spx_int16_t *x) { int i; int N = st->ps_size; int N3 = 2*N - st->frame_size; int M; spx_word32_t *ps=st->ps; M = st->nbands; st->min_count++; preprocess_analysis(st, x); update_noise_prob(st); for (i=1;iupdate_prob[i] || st->ps[i] < PSHR32(st->noise[i],NOISE_SHIFT)) { st->noise[i] = MULT16_32_Q15(QCONST16(.95f,15),st->noise[i]) + MULT16_32_Q15(QCONST16(.05f,15),SHL32(st->ps[i],NOISE_SHIFT)); } } for (i=0;ioutbuf[i] = MULT16_16_Q15(x[st->frame_size-N3+i],st->window[st->frame_size+i]); /* Save old power spectrum */ for (i=0;iold_ps[i] = ps[i]; for (i=0;ireverb_estimate[i] = MULT16_32_Q15(st->reverb_decay, st->reverb_estimate[i]); } EXPORT int speex_preprocess_ctl(SpeexPreprocessState *state, int request, void *ptr) { int i; SpeexPreprocessState *st; st=(SpeexPreprocessState*)state; switch(request) { case SPEEX_PREPROCESS_SET_DENOISE: st->denoise_enabled = (*(spx_int32_t*)ptr); break; case SPEEX_PREPROCESS_GET_DENOISE: (*(spx_int32_t*)ptr) = st->denoise_enabled; break; #ifndef FIXED_POINT case SPEEX_PREPROCESS_SET_AGC: st->agc_enabled = (*(spx_int32_t*)ptr); break; case SPEEX_PREPROCESS_GET_AGC: (*(spx_int32_t*)ptr) = st->agc_enabled; break; #ifndef DISABLE_FLOAT_API case SPEEX_PREPROCESS_SET_AGC_LEVEL: st->agc_level = (*(float*)ptr); if (st->agc_level<1) st->agc_level=1; if (st->agc_level>32768) st->agc_level=32768; break; case SPEEX_PREPROCESS_GET_AGC_LEVEL: (*(float*)ptr) = st->agc_level; break; #endif /* #ifndef DISABLE_FLOAT_API */ case SPEEX_PREPROCESS_SET_AGC_INCREMENT: st->max_increase_step = exp(0.11513f * (*(spx_int32_t*)ptr)*st->frame_size / st->sampling_rate); break; case SPEEX_PREPROCESS_GET_AGC_INCREMENT: (*(spx_int32_t*)ptr) = floor(.5+8.6858*log(st->max_increase_step)*st->sampling_rate/st->frame_size); break; case SPEEX_PREPROCESS_SET_AGC_DECREMENT: st->max_decrease_step = exp(0.11513f * (*(spx_int32_t*)ptr)*st->frame_size / st->sampling_rate); break; case SPEEX_PREPROCESS_GET_AGC_DECREMENT: (*(spx_int32_t*)ptr) = floor(.5+8.6858*log(st->max_decrease_step)*st->sampling_rate/st->frame_size); break; case SPEEX_PREPROCESS_SET_AGC_MAX_GAIN: st->max_gain = exp(0.11513f * (*(spx_int32_t*)ptr)); break; case SPEEX_PREPROCESS_GET_AGC_MAX_GAIN: (*(spx_int32_t*)ptr) = floor(.5+8.6858*log(st->max_gain)); break; #endif case SPEEX_PREPROCESS_SET_VAD: speex_warning("The VAD has been replaced by a hack pending a complete rewrite"); st->vad_enabled = (*(spx_int32_t*)ptr); break; case SPEEX_PREPROCESS_GET_VAD: (*(spx_int32_t*)ptr) = st->vad_enabled; break; case SPEEX_PREPROCESS_SET_DEREVERB: st->dereverb_enabled = (*(spx_int32_t*)ptr); for (i=0;ips_size;i++) st->reverb_estimate[i]=0; break; case SPEEX_PREPROCESS_GET_DEREVERB: (*(spx_int32_t*)ptr) = st->dereverb_enabled; break; case SPEEX_PREPROCESS_SET_DEREVERB_LEVEL: /* FIXME: Re-enable when de-reverberation is actually enabled again */ /*st->reverb_level = (*(float*)ptr);*/ break; case SPEEX_PREPROCESS_GET_DEREVERB_LEVEL: /* FIXME: Re-enable when de-reverberation is actually enabled again */ /*(*(float*)ptr) = st->reverb_level;*/ break; case SPEEX_PREPROCESS_SET_DEREVERB_DECAY: /* FIXME: Re-enable when de-reverberation is actually enabled again */ /*st->reverb_decay = (*(float*)ptr);*/ break; case SPEEX_PREPROCESS_GET_DEREVERB_DECAY: /* FIXME: Re-enable when de-reverberation is actually enabled again */ /*(*(float*)ptr) = st->reverb_decay;*/ break; case SPEEX_PREPROCESS_SET_PROB_START: *(spx_int32_t*)ptr = MIN32(100,MAX32(0, *(spx_int32_t*)ptr)); st->speech_prob_start = DIV32_16(MULT16_16(Q15ONE,*(spx_int32_t*)ptr), 100); break; case SPEEX_PREPROCESS_GET_PROB_START: (*(spx_int32_t*)ptr) = MULT16_16_Q15(st->speech_prob_start, 100); break; case SPEEX_PREPROCESS_SET_PROB_CONTINUE: *(spx_int32_t*)ptr = MIN32(100,MAX32(0, *(spx_int32_t*)ptr)); st->speech_prob_continue = DIV32_16(MULT16_16(Q15ONE,*(spx_int32_t*)ptr), 100); break; case SPEEX_PREPROCESS_GET_PROB_CONTINUE: (*(spx_int32_t*)ptr) = MULT16_16_Q15(st->speech_prob_continue, 100); break; case SPEEX_PREPROCESS_SET_NOISE_SUPPRESS: st->noise_suppress = -ABS(*(spx_int32_t*)ptr); break; case SPEEX_PREPROCESS_GET_NOISE_SUPPRESS: (*(spx_int32_t*)ptr) = st->noise_suppress; break; case SPEEX_PREPROCESS_SET_ECHO_SUPPRESS: st->echo_suppress = -ABS(*(spx_int32_t*)ptr); break; case SPEEX_PREPROCESS_GET_ECHO_SUPPRESS: (*(spx_int32_t*)ptr) = st->echo_suppress; break; case SPEEX_PREPROCESS_SET_ECHO_SUPPRESS_ACTIVE: st->echo_suppress_active = -ABS(*(spx_int32_t*)ptr); break; case SPEEX_PREPROCESS_GET_ECHO_SUPPRESS_ACTIVE: (*(spx_int32_t*)ptr) = st->echo_suppress_active; break; case SPEEX_PREPROCESS_SET_ECHO_STATE: st->echo_state = (SpeexEchoState*)ptr; break; case SPEEX_PREPROCESS_GET_ECHO_STATE: (*(SpeexEchoState**)ptr) = (SpeexEchoState*)st->echo_state; break; #ifndef FIXED_POINT case SPEEX_PREPROCESS_GET_AGC_LOUDNESS: (*(spx_int32_t*)ptr) = pow(st->loudness, 1.0/LOUDNESS_EXP); break; case SPEEX_PREPROCESS_GET_AGC_GAIN: (*(spx_int32_t*)ptr) = floor(.5+8.6858*log(st->agc_gain)); break; #endif case SPEEX_PREPROCESS_GET_PSD_SIZE: case SPEEX_PREPROCESS_GET_NOISE_PSD_SIZE: (*(spx_int32_t*)ptr) = st->ps_size; break; case SPEEX_PREPROCESS_GET_PSD: for(i=0;ips_size;i++) ((spx_int32_t *)ptr)[i] = (spx_int32_t) st->ps[i]; break; case SPEEX_PREPROCESS_GET_NOISE_PSD: for(i=0;ips_size;i++) ((spx_int32_t *)ptr)[i] = (spx_int32_t) PSHR32(st->noise[i], NOISE_SHIFT); break; case SPEEX_PREPROCESS_GET_PROB: (*(spx_int32_t*)ptr) = MULT16_16_Q15(st->speech_prob, 100); break; #ifndef FIXED_POINT case SPEEX_PREPROCESS_SET_AGC_TARGET: st->agc_level = (*(spx_int32_t*)ptr); if (st->agc_level<1) st->agc_level=1; if (st->agc_level>32768) st->agc_level=32768; break; case SPEEX_PREPROCESS_GET_AGC_TARGET: (*(spx_int32_t*)ptr) = st->agc_level; break; #endif default: speex_warning_int("Unknown speex_preprocess_ctl request: ", request); return -1; } return 0; } #ifdef FIXED_DEBUG long long spx_mips=0; #endif mumble-1.3.4/3rdparty/speexdsp-src/libspeexdsp/kiss_fft.h0000664000175000017500000000546714010707343023346 0ustar builderbuilder#ifndef KISS_FFT_H #define KISS_FFT_H #include #include #include "arch.h" #ifdef __cplusplus extern "C" { #endif /* ATTENTION! If you would like a : -- a utility that will handle the caching of fft objects -- real-only (no imaginary time component ) FFT -- a multi-dimensional FFT -- a command-line utility to perform ffts -- a command-line utility to perform fast-convolution filtering Then see kfc.h kiss_fftr.h kiss_fftnd.h fftutil.c kiss_fastfir.c in the tools/ directory. */ #ifdef USE_SIMD # include # define kiss_fft_scalar __m128 #define KISS_FFT_MALLOC(nbytes) memalign(16,nbytes) #else #define KISS_FFT_MALLOC speex_alloc #endif #ifdef FIXED_POINT #include "arch.h" # define kiss_fft_scalar spx_int16_t #else # ifndef kiss_fft_scalar /* default is float */ # define kiss_fft_scalar float # endif #endif typedef struct { kiss_fft_scalar r; kiss_fft_scalar i; }kiss_fft_cpx; typedef struct kiss_fft_state* kiss_fft_cfg; /* * kiss_fft_alloc * * Initialize a FFT (or IFFT) algorithm's cfg/state buffer. * * typical usage: kiss_fft_cfg mycfg=kiss_fft_alloc(1024,0,NULL,NULL); * * The return value from fft_alloc is a cfg buffer used internally * by the fft routine or NULL. * * If lenmem is NULL, then kiss_fft_alloc will allocate a cfg buffer using malloc. * The returned value should be free()d when done to avoid memory leaks. * * The state can be placed in a user supplied buffer 'mem': * If lenmem is not NULL and mem is not NULL and *lenmem is large enough, * then the function places the cfg in mem and the size used in *lenmem * and returns mem. * * If lenmem is not NULL and ( mem is NULL or *lenmem is not large enough), * then the function returns NULL and places the minimum cfg * buffer size in *lenmem. * */ kiss_fft_cfg kiss_fft_alloc(int nfft,int inverse_fft,void * mem,size_t * lenmem); /* * kiss_fft(cfg,in_out_buf) * * Perform an FFT on a complex input buffer. * for a forward FFT, * fin should be f[0] , f[1] , ... ,f[nfft-1] * fout will be F[0] , F[1] , ... ,F[nfft-1] * Note that each element is complex and can be accessed like f[k].r and f[k].i * */ void kiss_fft(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout); /* A more generic version of the above function. It reads its input from every Nth sample. * */ void kiss_fft_stride(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout,int fin_stride); /* If kiss_fft_alloc allocated a buffer, it is one contiguous buffer and can be simply free()d when no longer needed*/ #define kiss_fft_free speex_free /* Cleans up some memory that gets managed internally. Not necessary to call, but it might clean up your compiler output to call this before you exit. */ void kiss_fft_cleanup(void); #ifdef __cplusplus } #endif #endif mumble-1.3.4/3rdparty/speexdsp-src/libspeexdsp/pseudofloat.h0000664000175000017500000002054514010707343024055 0ustar builderbuilder/* Copyright (C) 2005 Jean-Marc Valin */ /** @file pseudofloat.h @brief Pseudo-floating point * This header file provides a lightweight floating point type for * use on fixed-point platforms when a large dynamic range is * required. The new type is not compatible with the 32-bit IEEE format, * it is not even remotely as accurate as 32-bit floats, and is not * even guaranteed to produce even remotely correct results for code * other than Speex. It makes all kinds of shortcuts that are acceptable * for Speex, but may not be acceptable for your application. You're * quite welcome to reuse this code and improve it, but don't assume * it works out of the box. Most likely, it doesn't. */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef PSEUDOFLOAT_H #define PSEUDOFLOAT_H #include "arch.h" #include "os_support.h" #include "math_approx.h" #include #ifdef FIXED_POINT typedef struct { spx_int16_t m; spx_int16_t e; } spx_float_t; static const spx_float_t FLOAT_ZERO = {0,0}; static const spx_float_t FLOAT_ONE = {16384,-14}; static const spx_float_t FLOAT_HALF = {16384,-15}; #define MIN(a,b) ((a)<(b)?(a):(b)) static inline spx_float_t PSEUDOFLOAT(spx_int32_t x) { int e=0; int sign=0; if (x<0) { sign = 1; x = -x; } if (x==0) { spx_float_t r = {0,0}; return r; } e = spx_ilog2(ABS32(x))-14; x = VSHR32(x, e); if (sign) { spx_float_t r; r.m = -x; r.e = e; return r; } else { spx_float_t r; r.m = x; r.e = e; return r; } } static inline spx_float_t FLOAT_ADD(spx_float_t a, spx_float_t b) { spx_float_t r; if (a.m==0) return b; else if (b.m==0) return a; if ((a).e > (b).e) { r.m = ((a).m>>1) + ((b).m>>MIN(15,(a).e-(b).e+1)); r.e = (a).e+1; } else { r.m = ((b).m>>1) + ((a).m>>MIN(15,(b).e-(a).e+1)); r.e = (b).e+1; } if (r.m>0) { if (r.m<16384) { r.m<<=1; r.e-=1; } } else { if (r.m>-16384) { r.m<<=1; r.e-=1; } } /*printf ("%f + %f = %f\n", REALFLOAT(a), REALFLOAT(b), REALFLOAT(r));*/ return r; } static inline spx_float_t FLOAT_SUB(spx_float_t a, spx_float_t b) { spx_float_t r; if (a.m==0) return b; else if (b.m==0) return a; if ((a).e > (b).e) { r.m = ((a).m>>1) - ((b).m>>MIN(15,(a).e-(b).e+1)); r.e = (a).e+1; } else { r.m = ((a).m>>MIN(15,(b).e-(a).e+1)) - ((b).m>>1); r.e = (b).e+1; } if (r.m>0) { if (r.m<16384) { r.m<<=1; r.e-=1; } } else { if (r.m>-16384) { r.m<<=1; r.e-=1; } } /*printf ("%f + %f = %f\n", REALFLOAT(a), REALFLOAT(b), REALFLOAT(r));*/ return r; } static inline int FLOAT_LT(spx_float_t a, spx_float_t b) { if (a.m==0) return b.m>0; else if (b.m==0) return a.m<0; if ((a).e > (b).e) return ((a).m>>1) < ((b).m>>MIN(15,(a).e-(b).e+1)); else return ((b).m>>1) > ((a).m>>MIN(15,(b).e-(a).e+1)); } static inline int FLOAT_GT(spx_float_t a, spx_float_t b) { return FLOAT_LT(b,a); } static inline spx_float_t FLOAT_MULT(spx_float_t a, spx_float_t b) { spx_float_t r; r.m = (spx_int16_t)((spx_int32_t)(a).m*(b).m>>15); r.e = (a).e+(b).e+15; if (r.m>0) { if (r.m<16384) { r.m<<=1; r.e-=1; } } else { if (r.m>-16384) { r.m<<=1; r.e-=1; } } /*printf ("%f * %f = %f\n", REALFLOAT(a), REALFLOAT(b), REALFLOAT(r));*/ return r; } static inline spx_float_t FLOAT_AMULT(spx_float_t a, spx_float_t b) { spx_float_t r; r.m = (spx_int16_t)((spx_int32_t)(a).m*(b).m>>15); r.e = (a).e+(b).e+15; return r; } static inline spx_float_t FLOAT_SHL(spx_float_t a, int b) { spx_float_t r; r.m = a.m; r.e = a.e+b; return r; } static inline spx_int16_t FLOAT_EXTRACT16(spx_float_t a) { if (a.e<0) return EXTRACT16((EXTEND32(a.m)+(EXTEND32(1)<<(-a.e-1)))>>-a.e); else return a.m<>-a.e; else return EXTEND32(a.m)<=SHL32(EXTEND32(b.m-1),15)) { a >>= 1; e++; } r.m = DIV32_16(a,b.m); r.e = e-b.e; return r; } /* Do NOT attempt to divide by a negative number */ static inline spx_float_t FLOAT_DIV32(spx_word32_t a, spx_word32_t b) { int e0=0,e=0; spx_float_t r; if (a==0) { return FLOAT_ZERO; } if (b>32767) { e0 = spx_ilog2(b)-14; b = VSHR32(b, e0); e0 = -e0; } e = spx_ilog2(ABS32(a))-spx_ilog2(b-1)-15; a = VSHR32(a, e); if (ABS32(a)>=SHL32(EXTEND32(b-1),15)) { a >>= 1; e++; } e += e0; r.m = DIV32_16(a,b); r.e = e; return r; } /* Do NOT attempt to divide by a negative number */ static inline spx_float_t FLOAT_DIVU(spx_float_t a, spx_float_t b) { int e=0; spx_int32_t num; spx_float_t r; if (b.m<=0) { speex_warning_int("Attempted to divide by", b.m); return FLOAT_ONE; } num = a.m; a.m = ABS16(a.m); while (a.m >= b.m) { e++; a.m >>= 1; } num = num << (15-e); r.m = DIV32_16(num,b.m); r.e = a.e-b.e-15+e; return r; } static inline spx_float_t FLOAT_SQRT(spx_float_t a) { spx_float_t r; spx_int32_t m; m = SHL32(EXTEND32(a.m), 14); r.e = a.e - 14; if (r.e & 1) { r.e -= 1; m <<= 1; } r.e >>= 1; r.m = spx_sqrt(m); return r; } #else #define spx_float_t float #define FLOAT_ZERO 0.f #define FLOAT_ONE 1.f #define FLOAT_HALF 0.5f #define PSEUDOFLOAT(x) (x) #define FLOAT_MULT(a,b) ((a)*(b)) #define FLOAT_AMULT(a,b) ((a)*(b)) #define FLOAT_MUL32(a,b) ((a)*(b)) #define FLOAT_DIV32(a,b) ((a)/(b)) #define FLOAT_EXTRACT16(a) (a) #define FLOAT_EXTRACT32(a) (a) #define FLOAT_ADD(a,b) ((a)+(b)) #define FLOAT_SUB(a,b) ((a)-(b)) #define REALFLOAT(x) (x) #define FLOAT_DIV32_FLOAT(a,b) ((a)/(b)) #define FLOAT_MUL32U(a,b) ((a)*(b)) #define FLOAT_SHL(a,b) (a) #define FLOAT_LT(a,b) ((a)<(b)) #define FLOAT_GT(a,b) ((a)>(b)) #define FLOAT_DIVU(a,b) ((a)/(b)) #define FLOAT_SQRT(a) (spx_sqrt(a)) #endif #endif mumble-1.3.4/3rdparty/speexdsp-src/libspeexdsp/fftwrap.h0000664000175000017500000000430714010707343023177 0ustar builderbuilder/* Copyright (C) 2005 Jean-Marc Valin File: fftwrap.h Wrapper for various FFTs Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef FFTWRAP_H #define FFTWRAP_H #include "arch.h" /** Compute tables for an FFT */ void *spx_fft_init(int size); /** Destroy tables for an FFT */ void spx_fft_destroy(void *table); /** Forward (real to half-complex) transform */ void spx_fft(void *table, spx_word16_t *in, spx_word16_t *out); /** Backward (half-complex to real) transform */ void spx_ifft(void *table, spx_word16_t *in, spx_word16_t *out); /** Forward (real to half-complex) transform of float data */ void spx_fft_float(void *table, float *in, float *out); /** Backward (half-complex to real) transform of float data */ void spx_ifft_float(void *table, float *in, float *out); #endif mumble-1.3.4/3rdparty/speexdsp-src/libspeexdsp/resample_neon.h0000664000175000017500000001410314010707343024350 0ustar builderbuilder/* Copyright (C) 2007-2008 Jean-Marc Valin * Copyright (C) 2008 Thorvald Natvig * Copyright (C) 2011 Texas Instruments * author Jyri Sarha */ /** @file resample_neon.h @brief Resampler functions (NEON version) */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #ifdef FIXED_POINT #ifdef __thumb2__ static inline int32_t saturate_32bit_to_16bit(int32_t a) { int32_t ret; asm ("ssat %[ret], #16, %[a]" : [ret] "=&r" (ret) : [a] "r" (a) : ); return ret; } #else static inline int32_t saturate_32bit_to_16bit(int32_t a) { int32_t ret; asm ("vmov.s32 d0[0], %[a]\n" "vqmovn.s32 d0, q0\n" "vmov.s16 %[ret], d0[0]\n" : [ret] "=&r" (ret) : [a] "r" (a) : "q0"); return ret; } #endif #undef WORD2INT #define WORD2INT(x) (saturate_32bit_to_16bit(x)) #define OVERRIDE_INNER_PRODUCT_SINGLE /* Only works when len % 4 == 0 */ static inline int32_t inner_product_single(const int16_t *a, const int16_t *b, unsigned int len) { int32_t ret; uint32_t remainder = len % 16; len = len - remainder; asm volatile (" cmp %[len], #0\n" " bne 1f\n" " vld1.16 {d16}, [%[b]]!\n" " vld1.16 {d20}, [%[a]]!\n" " subs %[remainder], %[remainder], #4\n" " vmull.s16 q0, d16, d20\n" " beq 5f\n" " b 4f\n" "1:" " vld1.16 {d16, d17, d18, d19}, [%[b]]!\n" " vld1.16 {d20, d21, d22, d23}, [%[a]]!\n" " subs %[len], %[len], #16\n" " vmull.s16 q0, d16, d20\n" " vmlal.s16 q0, d17, d21\n" " vmlal.s16 q0, d18, d22\n" " vmlal.s16 q0, d19, d23\n" " beq 3f\n" "2:" " vld1.16 {d16, d17, d18, d19}, [%[b]]!\n" " vld1.16 {d20, d21, d22, d23}, [%[a]]!\n" " subs %[len], %[len], #16\n" " vmlal.s16 q0, d16, d20\n" " vmlal.s16 q0, d17, d21\n" " vmlal.s16 q0, d18, d22\n" " vmlal.s16 q0, d19, d23\n" " bne 2b\n" "3:" " cmp %[remainder], #0\n" " beq 5f\n" "4:" " vld1.16 {d16}, [%[b]]!\n" " vld1.16 {d20}, [%[a]]!\n" " subs %[remainder], %[remainder], #4\n" " vmlal.s16 q0, d16, d20\n" " bne 4b\n" "5:" " vaddl.s32 q0, d0, d1\n" " vadd.s64 d0, d0, d1\n" " vqmovn.s64 d0, q0\n" " vqrshrn.s32 d0, q0, #15\n" " vmov.s16 %[ret], d0[0]\n" : [ret] "=&r" (ret), [a] "+r" (a), [b] "+r" (b), [len] "+r" (len), [remainder] "+r" (remainder) : : "cc", "q0", "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23"); return ret; } #elif defined(FLOATING_POINT) static inline int32_t saturate_float_to_16bit(float a) { int32_t ret; asm ("vmov.f32 d0[0], %[a]\n" "vcvt.s32.f32 d0, d0, #15\n" "vqrshrn.s32 d0, q0, #15\n" "vmov.s16 %[ret], d0[0]\n" : [ret] "=&r" (ret) : [a] "r" (a) : "q0"); return ret; } #undef WORD2INT #define WORD2INT(x) (saturate_float_to_16bit(x)) #define OVERRIDE_INNER_PRODUCT_SINGLE /* Only works when len % 4 == 0 */ static inline float inner_product_single(const float *a, const float *b, unsigned int len) { float ret; uint32_t remainder = len % 16; len = len - remainder; asm volatile (" cmp %[len], #0\n" " bne 1f\n" " vld1.32 {q4}, [%[b]]!\n" " vld1.32 {q8}, [%[a]]!\n" " subs %[remainder], %[remainder], #4\n" " vmul.f32 q0, q4, q8\n" " bne 4f\n" " b 5f\n" "1:" " vld1.32 {q4, q5}, [%[b]]!\n" " vld1.32 {q8, q9}, [%[a]]!\n" " vld1.32 {q6, q7}, [%[b]]!\n" " vld1.32 {q10, q11}, [%[a]]!\n" " subs %[len], %[len], #16\n" " vmul.f32 q0, q4, q8\n" " vmul.f32 q1, q5, q9\n" " vmul.f32 q2, q6, q10\n" " vmul.f32 q3, q7, q11\n" " beq 3f\n" "2:" " vld1.32 {q4, q5}, [%[b]]!\n" " vld1.32 {q8, q9}, [%[a]]!\n" " vld1.32 {q6, q7}, [%[b]]!\n" " vld1.32 {q10, q11}, [%[a]]!\n" " subs %[len], %[len], #16\n" " vmla.f32 q0, q4, q8\n" " vmla.f32 q1, q5, q9\n" " vmla.f32 q2, q6, q10\n" " vmla.f32 q3, q7, q11\n" " bne 2b\n" "3:" " vadd.f32 q4, q0, q1\n" " vadd.f32 q5, q2, q3\n" " cmp %[remainder], #0\n" " vadd.f32 q0, q4, q5\n" " beq 5f\n" "4:" " vld1.32 {q6}, [%[b]]!\n" " vld1.32 {q10}, [%[a]]!\n" " subs %[remainder], %[remainder], #4\n" " vmla.f32 q0, q6, q10\n" " bne 4b\n" "5:" " vadd.f32 d0, d0, d1\n" " vpadd.f32 d0, d0, d0\n" " vmov.f32 %[ret], d0[0]\n" : [ret] "=&r" (ret), [a] "+r" (a), [b] "+r" (b), [len] "+l" (len), [remainder] "+l" (remainder) : : "cc", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", "q8", "q9", "q10", "q11"); return ret; } #endif mumble-1.3.4/3rdparty/speexdsp-src/libspeexdsp/math_approx.h0000664000175000017500000001664314010707343024056 0ustar builderbuilder/* Copyright (C) 2002 Jean-Marc Valin */ /** @file math_approx.h @brief Various math approximation functions for Speex */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef MATH_APPROX_H #define MATH_APPROX_H #include "arch.h" #ifndef FIXED_POINT #define spx_sqrt sqrt #define spx_acos acos #define spx_exp exp #define spx_cos_norm(x) (cos((.5f*M_PI)*(x))) #define spx_atan atan /** Generate a pseudo-random number */ static inline spx_word16_t speex_rand(spx_word16_t std, spx_int32_t *seed) { const unsigned int jflone = 0x3f800000; const unsigned int jflmsk = 0x007fffff; union {int i; float f;} ran; *seed = 1664525 * *seed + 1013904223; ran.i = jflone | (jflmsk & *seed); ran.f -= 1.5; return 3.4642*std*ran.f; } #endif static inline spx_int16_t spx_ilog2(spx_uint32_t x) { int r=0; if (x>=(spx_int32_t)65536) { x >>= 16; r += 16; } if (x>=256) { x >>= 8; r += 8; } if (x>=16) { x >>= 4; r += 4; } if (x>=4) { x >>= 2; r += 2; } if (x>=2) { r += 1; } return r; } static inline spx_int16_t spx_ilog4(spx_uint32_t x) { int r=0; if (x>=(spx_int32_t)65536) { x >>= 16; r += 8; } if (x>=256) { x >>= 8; r += 4; } if (x>=16) { x >>= 4; r += 2; } if (x>=4) { r += 1; } return r; } #ifdef FIXED_POINT /** Generate a pseudo-random number */ static inline spx_word16_t speex_rand(spx_word16_t std, spx_int32_t *seed) { spx_word32_t res; *seed = 1664525 * *seed + 1013904223; res = MULT16_16(EXTRACT16(SHR32(*seed,16)),std); return EXTRACT16(PSHR32(SUB32(res, SHR32(res, 3)),14)); } /* sqrt(x) ~= 0.22178 + 1.29227*x - 0.77070*x^2 + 0.25723*x^3 (for .25 < x < 1) */ /*#define C0 3634 #define C1 21173 #define C2 -12627 #define C3 4215*/ /* sqrt(x) ~= 0.22178 + 1.29227*x - 0.77070*x^2 + 0.25659*x^3 (for .25 < x < 1) */ #define C0 3634 #define C1 21173 #define C2 -12627 #define C3 4204 static inline spx_word16_t spx_sqrt(spx_word32_t x) { int k; spx_word32_t rt; k = spx_ilog4(x)-6; x = VSHR32(x, (k<<1)); rt = ADD16(C0, MULT16_16_Q14(x, ADD16(C1, MULT16_16_Q14(x, ADD16(C2, MULT16_16_Q14(x, (C3))))))); rt = VSHR32(rt,7-k); return rt; } /* log(x) ~= -2.18151 + 4.20592*x - 2.88938*x^2 + 0.86535*x^3 (for .5 < x < 1) */ #define A1 16469 #define A2 2242 #define A3 1486 static inline spx_word16_t spx_acos(spx_word16_t x) { int s=0; spx_word16_t ret; spx_word16_t sq; if (x<0) { s=1; x = NEG16(x); } x = SUB16(16384,x); x = x >> 1; sq = MULT16_16_Q13(x, ADD16(A1, MULT16_16_Q13(x, ADD16(A2, MULT16_16_Q13(x, (A3)))))); ret = spx_sqrt(SHL32(EXTEND32(sq),13)); /*ret = spx_sqrt(67108864*(-1.6129e-04 + 2.0104e+00*f + 2.7373e-01*f*f + 1.8136e-01*f*f*f));*/ if (s) ret = SUB16(25736,ret); return ret; } #define K1 8192 #define K2 -4096 #define K3 340 #define K4 -10 static inline spx_word16_t spx_cos(spx_word16_t x) { spx_word16_t x2; if (x<12868) { x2 = MULT16_16_P13(x,x); return ADD32(K1, MULT16_16_P13(x2, ADD32(K2, MULT16_16_P13(x2, ADD32(K3, MULT16_16_P13(K4, x2)))))); } else { x = SUB16(25736,x); x2 = MULT16_16_P13(x,x); return SUB32(-K1, MULT16_16_P13(x2, ADD32(K2, MULT16_16_P13(x2, ADD32(K3, MULT16_16_P13(K4, x2)))))); } } #define L1 32767 #define L2 -7651 #define L3 8277 #define L4 -626 static inline spx_word16_t _spx_cos_pi_2(spx_word16_t x) { spx_word16_t x2; x2 = MULT16_16_P15(x,x); return ADD16(1,MIN16(32766,ADD32(SUB16(L1,x2), MULT16_16_P15(x2, ADD32(L2, MULT16_16_P15(x2, ADD32(L3, MULT16_16_P15(L4, x2)))))))); } static inline spx_word16_t spx_cos_norm(spx_word32_t x) { x = x&0x0001ffff; if (x>SHL32(EXTEND32(1), 16)) x = SUB32(SHL32(EXTEND32(1), 17),x); if (x&0x00007fff) { if (x14) return 0x7fffffff; else if (integer < -15) return 0; frac = SHL16(x-SHL16(integer,11),3); frac = ADD16(D0, MULT16_16_Q14(frac, ADD16(D1, MULT16_16_Q14(frac, ADD16(D2 , MULT16_16_Q14(D3,frac)))))); return VSHR32(EXTEND32(frac), -integer-2); } /* Input in Q11 format, output in Q16 */ static inline spx_word32_t spx_exp(spx_word16_t x) { if (x>21290) return 0x7fffffff; else if (x<-21290) return 0; else return spx_exp2(MULT16_16_P14(23637,x)); } #define M1 32767 #define M2 -21 #define M3 -11943 #define M4 4936 static inline spx_word16_t spx_atan01(spx_word16_t x) { return MULT16_16_P15(x, ADD32(M1, MULT16_16_P15(x, ADD32(M2, MULT16_16_P15(x, ADD32(M3, MULT16_16_P15(M4, x))))))); } #undef M1 #undef M2 #undef M3 #undef M4 /* Input in Q15, output in Q14 */ static inline spx_word16_t spx_atan(spx_word32_t x) { if (x <= 32767) { return SHR16(spx_atan01(x),1); } else { int e = spx_ilog2(x); if (e>=29) return 25736; x = DIV32_16(SHL32(EXTEND32(32767),29-e), EXTRACT16(SHR32(x, e-14))); return SUB16(25736, SHR16(spx_atan01(x),1)); } } #else #ifndef M_PI #define M_PI 3.14159265358979323846 /* pi */ #endif #define C1 0.9999932946f #define C2 -0.4999124376f #define C3 0.0414877472f #define C4 -0.0012712095f #define SPX_PI_2 1.5707963268 static inline spx_word16_t spx_cos(spx_word16_t x) { if (x 32766 ? 32767 : (x))) #else #define WORD2INT(x) ((x) < -32767.5f ? -32768 : ((x) > 32766.5f ? 32767 : floor(.5+(x)))) #endif /* If enabled, the AEC will use a foreground filter and a background filter to be more robust to double-talk and difficult signals in general. The cost is an extra FFT and a matrix-vector multiply */ #define TWO_PATH #ifdef FIXED_POINT static const spx_float_t MIN_LEAK = {20972, -22}; /* Constants for the two-path filter */ static const spx_float_t VAR1_SMOOTH = {23593, -16}; static const spx_float_t VAR2_SMOOTH = {23675, -15}; static const spx_float_t VAR1_UPDATE = {16384, -15}; static const spx_float_t VAR2_UPDATE = {16384, -16}; static const spx_float_t VAR_BACKTRACK = {16384, -12}; #define TOP16(x) ((x)>>16) #else static const spx_float_t MIN_LEAK = .005f; /* Constants for the two-path filter */ static const spx_float_t VAR1_SMOOTH = .36f; static const spx_float_t VAR2_SMOOTH = .7225f; static const spx_float_t VAR1_UPDATE = .5f; static const spx_float_t VAR2_UPDATE = .25f; static const spx_float_t VAR_BACKTRACK = 4.f; #define TOP16(x) (x) #endif #define PLAYBACK_DELAY 2 void speex_echo_get_residual(SpeexEchoState *st, spx_word32_t *Yout, int len); /** Speex echo cancellation state. */ struct SpeexEchoState_ { int frame_size; /**< Number of samples processed each time */ int window_size; int M; int cancel_count; int adapted; int saturated; int screwed_up; int C; /** Number of input channels (microphones) */ int K; /** Number of output channels (loudspeakers) */ spx_int32_t sampling_rate; spx_word16_t spec_average; spx_word16_t beta0; spx_word16_t beta_max; spx_word32_t sum_adapt; spx_word16_t leak_estimate; spx_word16_t *e; /* scratch */ spx_word16_t *x; /* Far-end input buffer (2N) */ spx_word16_t *X; /* Far-end buffer (M+1 frames) in frequency domain */ spx_word16_t *input; /* scratch */ spx_word16_t *y; /* scratch */ spx_word16_t *last_y; spx_word16_t *Y; /* scratch */ spx_word16_t *E; spx_word32_t *PHI; /* scratch */ spx_word32_t *W; /* (Background) filter weights */ #ifdef TWO_PATH spx_word16_t *foreground; /* Foreground filter weights */ spx_word32_t Davg1; /* 1st recursive average of the residual power difference */ spx_word32_t Davg2; /* 2nd recursive average of the residual power difference */ spx_float_t Dvar1; /* Estimated variance of 1st estimator */ spx_float_t Dvar2; /* Estimated variance of 2nd estimator */ #endif spx_word32_t *power; /* Power of the far-end signal */ spx_float_t *power_1;/* Inverse power of far-end */ spx_word16_t *wtmp; /* scratch */ #ifdef FIXED_POINT spx_word16_t *wtmp2; /* scratch */ #endif spx_word32_t *Rf; /* scratch */ spx_word32_t *Yf; /* scratch */ spx_word32_t *Xf; /* scratch */ spx_word32_t *Eh; spx_word32_t *Yh; spx_float_t Pey; spx_float_t Pyy; spx_word16_t *window; spx_word16_t *prop; void *fft_table; spx_word16_t *memX, *memD, *memE; spx_word16_t preemph; spx_word16_t notch_radius; spx_mem_t *notch_mem; /* NOTE: If you only use speex_echo_cancel() and want to save some memory, remove this */ spx_int16_t *play_buf; int play_buf_pos; int play_buf_started; }; static inline void filter_dc_notch16(const spx_int16_t *in, spx_word16_t radius, spx_word16_t *out, int len, spx_mem_t *mem, int stride) { int i; spx_word16_t den2; #ifdef FIXED_POINT den2 = MULT16_16_Q15(radius,radius) + MULT16_16_Q15(QCONST16(.7,15),MULT16_16_Q15(32767-radius,32767-radius)); #else den2 = radius*radius + .7*(1-radius)*(1-radius); #endif /*printf ("%d %d %d %d %d %d\n", num[0], num[1], num[2], den[0], den[1], den[2]);*/ for (i=0;i>= 1; while(len--) { spx_word32_t part=0; part = MAC16_16(part,*x++,*y++); part = MAC16_16(part,*x++,*y++); /* HINT: If you had a 40-bit accumulator, you could shift only at the end */ sum = ADD32(sum,SHR32(part,6)); } return sum; } /** Compute power spectrum of a half-complex (packed) vector */ static inline void power_spectrum(const spx_word16_t *X, spx_word32_t *ps, int N) { int i, j; ps[0]=MULT16_16(X[0],X[0]); for (i=1,j=1;i max_sum) max_sum = prop[i]; } for (i=0;i static FILE *rFile=NULL, *pFile=NULL, *oFile=NULL; static void dump_audio(const spx_int16_t *rec, const spx_int16_t *play, const spx_int16_t *out, int len) { if (!(rFile && pFile && oFile)) { speex_fatal("Dump files not open"); } fwrite(rec, sizeof(spx_int16_t), len, rFile); fwrite(play, sizeof(spx_int16_t), len, pFile); fwrite(out, sizeof(spx_int16_t), len, oFile); } #endif /** Creates a new echo canceller state */ EXPORT SpeexEchoState *speex_echo_state_init(int frame_size, int filter_length) { return speex_echo_state_init_mc(frame_size, filter_length, 1, 1); } EXPORT SpeexEchoState *speex_echo_state_init_mc(int frame_size, int filter_length, int nb_mic, int nb_speakers) { int i,N,M, C, K; SpeexEchoState *st = (SpeexEchoState *)speex_alloc(sizeof(SpeexEchoState)); st->K = nb_speakers; st->C = nb_mic; C=st->C; K=st->K; #ifdef DUMP_ECHO_CANCEL_DATA if (rFile || pFile || oFile) speex_fatal("Opening dump files twice"); rFile = fopen("aec_rec.sw", "wb"); pFile = fopen("aec_play.sw", "wb"); oFile = fopen("aec_out.sw", "wb"); #endif st->frame_size = frame_size; st->window_size = 2*frame_size; N = st->window_size; M = st->M = (filter_length+st->frame_size-1)/frame_size; st->cancel_count=0; st->sum_adapt = 0; st->saturated = 0; st->screwed_up = 0; /* This is the default sampling rate */ st->sampling_rate = 8000; st->spec_average = DIV32_16(SHL32(EXTEND32(st->frame_size), 15), st->sampling_rate); #ifdef FIXED_POINT st->beta0 = DIV32_16(SHL32(EXTEND32(st->frame_size), 16), st->sampling_rate); st->beta_max = DIV32_16(SHL32(EXTEND32(st->frame_size), 14), st->sampling_rate); #else st->beta0 = (2.0f*st->frame_size)/st->sampling_rate; st->beta_max = (.5f*st->frame_size)/st->sampling_rate; #endif st->leak_estimate = 0; st->fft_table = spx_fft_init(N); st->e = (spx_word16_t*)speex_alloc(C*N*sizeof(spx_word16_t)); st->x = (spx_word16_t*)speex_alloc(K*N*sizeof(spx_word16_t)); st->input = (spx_word16_t*)speex_alloc(C*st->frame_size*sizeof(spx_word16_t)); st->y = (spx_word16_t*)speex_alloc(C*N*sizeof(spx_word16_t)); st->last_y = (spx_word16_t*)speex_alloc(C*N*sizeof(spx_word16_t)); st->Yf = (spx_word32_t*)speex_alloc((st->frame_size+1)*sizeof(spx_word32_t)); st->Rf = (spx_word32_t*)speex_alloc((st->frame_size+1)*sizeof(spx_word32_t)); st->Xf = (spx_word32_t*)speex_alloc((st->frame_size+1)*sizeof(spx_word32_t)); st->Yh = (spx_word32_t*)speex_alloc((st->frame_size+1)*sizeof(spx_word32_t)); st->Eh = (spx_word32_t*)speex_alloc((st->frame_size+1)*sizeof(spx_word32_t)); st->X = (spx_word16_t*)speex_alloc(K*(M+1)*N*sizeof(spx_word16_t)); st->Y = (spx_word16_t*)speex_alloc(C*N*sizeof(spx_word16_t)); st->E = (spx_word16_t*)speex_alloc(C*N*sizeof(spx_word16_t)); st->W = (spx_word32_t*)speex_alloc(C*K*M*N*sizeof(spx_word32_t)); #ifdef TWO_PATH st->foreground = (spx_word16_t*)speex_alloc(M*N*C*K*sizeof(spx_word16_t)); #endif st->PHI = (spx_word32_t*)speex_alloc(N*sizeof(spx_word32_t)); st->power = (spx_word32_t*)speex_alloc((frame_size+1)*sizeof(spx_word32_t)); st->power_1 = (spx_float_t*)speex_alloc((frame_size+1)*sizeof(spx_float_t)); st->window = (spx_word16_t*)speex_alloc(N*sizeof(spx_word16_t)); st->prop = (spx_word16_t*)speex_alloc(M*sizeof(spx_word16_t)); st->wtmp = (spx_word16_t*)speex_alloc(N*sizeof(spx_word16_t)); #ifdef FIXED_POINT st->wtmp2 = (spx_word16_t*)speex_alloc(N*sizeof(spx_word16_t)); for (i=0;i>1;i++) { st->window[i] = (16383-SHL16(spx_cos(DIV32_16(MULT16_16(25736,i<<1),N)),1)); st->window[N-i-1] = st->window[i]; } #else for (i=0;iwindow[i] = .5-.5*cos(2*M_PI*i/N); #endif for (i=0;i<=st->frame_size;i++) st->power_1[i] = FLOAT_ONE; for (i=0;iW[i] = 0; { spx_word32_t sum = 0; /* Ratio of ~10 between adaptation rate of first and last block */ spx_word16_t decay = SHR32(spx_exp(NEG16(DIV32_16(QCONST16(2.4,11),M))),1); st->prop[0] = QCONST16(.7, 15); sum = EXTEND32(st->prop[0]); for (i=1;iprop[i] = MULT16_16_Q15(st->prop[i-1], decay); sum = ADD32(sum, EXTEND32(st->prop[i])); } for (i=M-1;i>=0;i--) { st->prop[i] = DIV32(MULT16_16(QCONST16(.8f,15), st->prop[i]),sum); } } st->memX = (spx_word16_t*)speex_alloc(K*sizeof(spx_word16_t)); st->memD = (spx_word16_t*)speex_alloc(C*sizeof(spx_word16_t)); st->memE = (spx_word16_t*)speex_alloc(C*sizeof(spx_word16_t)); st->preemph = QCONST16(.9,15); if (st->sampling_rate<12000) st->notch_radius = QCONST16(.9, 15); else if (st->sampling_rate<24000) st->notch_radius = QCONST16(.982, 15); else st->notch_radius = QCONST16(.992, 15); st->notch_mem = (spx_mem_t*)speex_alloc(2*C*sizeof(spx_mem_t)); st->adapted = 0; st->Pey = st->Pyy = FLOAT_ONE; #ifdef TWO_PATH st->Davg1 = st->Davg2 = 0; st->Dvar1 = st->Dvar2 = FLOAT_ZERO; #endif st->play_buf = (spx_int16_t*)speex_alloc(K*(PLAYBACK_DELAY+1)*st->frame_size*sizeof(spx_int16_t)); st->play_buf_pos = PLAYBACK_DELAY*st->frame_size; st->play_buf_started = 0; return st; } /** Resets echo canceller state */ EXPORT void speex_echo_state_reset(SpeexEchoState *st) { int i, M, N, C, K; st->cancel_count=0; st->screwed_up = 0; N = st->window_size; M = st->M; C=st->C; K=st->K; for (i=0;iW[i] = 0; #ifdef TWO_PATH for (i=0;iforeground[i] = 0; #endif for (i=0;iX[i] = 0; for (i=0;i<=st->frame_size;i++) { st->power[i] = 0; st->power_1[i] = FLOAT_ONE; st->Eh[i] = 0; st->Yh[i] = 0; } for (i=0;iframe_size;i++) { st->last_y[i] = 0; } for (i=0;iE[i] = 0; } for (i=0;ix[i] = 0; } for (i=0;i<2*C;i++) st->notch_mem[i] = 0; for (i=0;imemD[i]=st->memE[i]=0; for (i=0;imemX[i]=0; st->saturated = 0; st->adapted = 0; st->sum_adapt = 0; st->Pey = st->Pyy = FLOAT_ONE; #ifdef TWO_PATH st->Davg1 = st->Davg2 = 0; st->Dvar1 = st->Dvar2 = FLOAT_ZERO; #endif for (i=0;i<3*st->frame_size;i++) st->play_buf[i] = 0; st->play_buf_pos = PLAYBACK_DELAY*st->frame_size; st->play_buf_started = 0; } /** Destroys an echo canceller state */ EXPORT void speex_echo_state_destroy(SpeexEchoState *st) { spx_fft_destroy(st->fft_table); speex_free(st->e); speex_free(st->x); speex_free(st->input); speex_free(st->y); speex_free(st->last_y); speex_free(st->Yf); speex_free(st->Rf); speex_free(st->Xf); speex_free(st->Yh); speex_free(st->Eh); speex_free(st->X); speex_free(st->Y); speex_free(st->E); speex_free(st->W); #ifdef TWO_PATH speex_free(st->foreground); #endif speex_free(st->PHI); speex_free(st->power); speex_free(st->power_1); speex_free(st->window); speex_free(st->prop); speex_free(st->wtmp); #ifdef FIXED_POINT speex_free(st->wtmp2); #endif speex_free(st->memX); speex_free(st->memD); speex_free(st->memE); speex_free(st->notch_mem); speex_free(st->play_buf); speex_free(st); #ifdef DUMP_ECHO_CANCEL_DATA fclose(rFile); fclose(pFile); fclose(oFile); rFile = pFile = oFile = NULL; #endif } EXPORT void speex_echo_capture(SpeexEchoState *st, const spx_int16_t *rec, spx_int16_t *out) { int i; /*speex_warning_int("capture with fill level ", st->play_buf_pos/st->frame_size);*/ st->play_buf_started = 1; if (st->play_buf_pos>=st->frame_size) { speex_echo_cancellation(st, rec, st->play_buf, out); st->play_buf_pos -= st->frame_size; for (i=0;iplay_buf_pos;i++) st->play_buf[i] = st->play_buf[i+st->frame_size]; } else { speex_warning("No playback frame available (your application is buggy and/or got xruns)"); if (st->play_buf_pos!=0) { speex_warning("internal playback buffer corruption?"); st->play_buf_pos = 0; } for (i=0;iframe_size;i++) out[i] = rec[i]; } } EXPORT void speex_echo_playback(SpeexEchoState *st, const spx_int16_t *play) { /*speex_warning_int("playback with fill level ", st->play_buf_pos/st->frame_size);*/ if (!st->play_buf_started) { speex_warning("discarded first playback frame"); return; } if (st->play_buf_pos<=PLAYBACK_DELAY*st->frame_size) { int i; for (i=0;iframe_size;i++) st->play_buf[st->play_buf_pos+i] = play[i]; st->play_buf_pos += st->frame_size; if (st->play_buf_pos <= (PLAYBACK_DELAY-1)*st->frame_size) { speex_warning("Auto-filling the buffer (your application is buggy and/or got xruns)"); for (i=0;iframe_size;i++) st->play_buf[st->play_buf_pos+i] = play[i]; st->play_buf_pos += st->frame_size; } } else { speex_warning("Had to discard a playback frame (your application is buggy and/or got xruns)"); } } /** Performs echo cancellation on a frame (deprecated, last arg now ignored) */ EXPORT void speex_echo_cancel(SpeexEchoState *st, const spx_int16_t *in, const spx_int16_t *far_end, spx_int16_t *out, spx_int32_t *Yout) { speex_echo_cancellation(st, in, far_end, out); } /** Performs echo cancellation on a frame */ EXPORT void speex_echo_cancellation(SpeexEchoState *st, const spx_int16_t *in, const spx_int16_t *far_end, spx_int16_t *out) { int i,j, chan, speak; int N,M, C, K; spx_word32_t Syy,See,Sxx,Sdd, Sff; #ifdef TWO_PATH spx_word32_t Dbf; int update_foreground; #endif spx_word32_t Sey; spx_word16_t ss, ss_1; spx_float_t Pey = FLOAT_ONE, Pyy=FLOAT_ONE; spx_float_t alpha, alpha_1; spx_word16_t RER; spx_word32_t tmp32; N = st->window_size; M = st->M; C = st->C; K = st->K; st->cancel_count++; #ifdef FIXED_POINT ss=DIV32_16(11469,M); ss_1 = SUB16(32767,ss); #else ss=.35/M; ss_1 = 1-ss; #endif for (chan = 0; chan < C; chan++) { /* Apply a notch filter to make sure DC doesn't end up causing problems */ filter_dc_notch16(in+chan, st->notch_radius, st->input+chan*st->frame_size, st->frame_size, st->notch_mem+2*chan, C); /* Copy input data to buffer and apply pre-emphasis */ /* Copy input data to buffer */ for (i=0;iframe_size;i++) { spx_word32_t tmp32; /* FIXME: This core has changed a bit, need to merge properly */ tmp32 = SUB32(EXTEND32(st->input[chan*st->frame_size+i]), EXTEND32(MULT16_16_P15(st->preemph, st->memD[chan]))); #ifdef FIXED_POINT if (tmp32 > 32767) { tmp32 = 32767; if (st->saturated == 0) st->saturated = 1; } if (tmp32 < -32767) { tmp32 = -32767; if (st->saturated == 0) st->saturated = 1; } #endif st->memD[chan] = st->input[chan*st->frame_size+i]; st->input[chan*st->frame_size+i] = EXTRACT16(tmp32); } } for (speak = 0; speak < K; speak++) { for (i=0;iframe_size;i++) { spx_word32_t tmp32; st->x[speak*N+i] = st->x[speak*N+i+st->frame_size]; tmp32 = SUB32(EXTEND32(far_end[i*K+speak]), EXTEND32(MULT16_16_P15(st->preemph, st->memX[speak]))); #ifdef FIXED_POINT /*FIXME: If saturation occurs here, we need to freeze adaptation for M frames (not just one) */ if (tmp32 > 32767) { tmp32 = 32767; st->saturated = M+1; } if (tmp32 < -32767) { tmp32 = -32767; st->saturated = M+1; } #endif st->x[speak*N+i+st->frame_size] = EXTRACT16(tmp32); st->memX[speak] = far_end[i*K+speak]; } } for (speak = 0; speak < K; speak++) { /* Shift memory: this could be optimized eventually*/ for (j=M-1;j>=0;j--) { for (i=0;iX[(j+1)*N*K+speak*N+i] = st->X[j*N*K+speak*N+i]; } /* Convert x (echo input) to frequency domain */ spx_fft(st->fft_table, st->x+speak*N, &st->X[speak*N]); } Sxx = 0; for (speak = 0; speak < K; speak++) { Sxx += mdf_inner_prod(st->x+speak*N+st->frame_size, st->x+speak*N+st->frame_size, st->frame_size); power_spectrum_accum(st->X+speak*N, st->Xf, N); } Sff = 0; for (chan = 0; chan < C; chan++) { #ifdef TWO_PATH /* Compute foreground filter */ spectral_mul_accum16(st->X, st->foreground+chan*N*K*M, st->Y+chan*N, N, M*K); spx_ifft(st->fft_table, st->Y+chan*N, st->e+chan*N); for (i=0;iframe_size;i++) st->e[chan*N+i] = SUB16(st->input[chan*st->frame_size+i], st->e[chan*N+i+st->frame_size]); Sff += mdf_inner_prod(st->e+chan*N, st->e+chan*N, st->frame_size); #endif } /* Adjust proportional adaption rate */ /* FIXME: Adjust that for C, K*/ if (st->adapted) mdf_adjust_prop (st->W, N, M, C*K, st->prop); /* Compute weight gradient */ if (st->saturated == 0) { for (chan = 0; chan < C; chan++) { for (speak = 0; speak < K; speak++) { for (j=M-1;j>=0;j--) { weighted_spectral_mul_conj(st->power_1, FLOAT_SHL(PSEUDOFLOAT(st->prop[j]),-15), &st->X[(j+1)*N*K+speak*N], st->E+chan*N, st->PHI, N); for (i=0;iW[chan*N*K*M + j*N*K + speak*N + i] += st->PHI[i]; } } } } else { st->saturated--; } /* FIXME: MC conversion required */ /* Update weight to prevent circular convolution (MDF / AUMDF) */ for (chan = 0; chan < C; chan++) { for (speak = 0; speak < K; speak++) { for (j=0;jcancel_count%(M-1) == j-1) { #ifdef FIXED_POINT for (i=0;iwtmp2[i] = EXTRACT16(PSHR32(st->W[chan*N*K*M + j*N*K + speak*N + i],NORMALIZE_SCALEDOWN+16)); spx_ifft(st->fft_table, st->wtmp2, st->wtmp); for (i=0;iframe_size;i++) { st->wtmp[i]=0; } for (i=st->frame_size;iwtmp[i]=SHL16(st->wtmp[i],NORMALIZE_SCALEUP); } spx_fft(st->fft_table, st->wtmp, st->wtmp2); /* The "-1" in the shift is a sort of kludge that trades less efficient update speed for decrease noise */ for (i=0;iW[chan*N*K*M + j*N*K + speak*N + i] -= SHL32(EXTEND32(st->wtmp2[i]),16+NORMALIZE_SCALEDOWN-NORMALIZE_SCALEUP-1); #else spx_ifft(st->fft_table, &st->W[chan*N*K*M + j*N*K + speak*N], st->wtmp); for (i=st->frame_size;iwtmp[i]=0; } spx_fft(st->fft_table, st->wtmp, &st->W[chan*N*K*M + j*N*K + speak*N]); #endif } } } } /* So we can use power_spectrum_accum */ for (i=0;i<=st->frame_size;i++) st->Rf[i] = st->Yf[i] = st->Xf[i] = 0; Dbf = 0; See = 0; #ifdef TWO_PATH /* Difference in response, this is used to estimate the variance of our residual power estimate */ for (chan = 0; chan < C; chan++) { spectral_mul_accum(st->X, st->W+chan*N*K*M, st->Y+chan*N, N, M*K); spx_ifft(st->fft_table, st->Y+chan*N, st->y+chan*N); for (i=0;iframe_size;i++) st->e[chan*N+i] = SUB16(st->e[chan*N+i+st->frame_size], st->y[chan*N+i+st->frame_size]); Dbf += 10+mdf_inner_prod(st->e+chan*N, st->e+chan*N, st->frame_size); for (i=0;iframe_size;i++) st->e[chan*N+i] = SUB16(st->input[chan*st->frame_size+i], st->y[chan*N+i+st->frame_size]); See += mdf_inner_prod(st->e+chan*N, st->e+chan*N, st->frame_size); } #endif #ifndef TWO_PATH Sff = See; #endif #ifdef TWO_PATH /* Logic for updating the foreground filter */ /* For two time windows, compute the mean of the energy difference, as well as the variance */ st->Davg1 = ADD32(MULT16_32_Q15(QCONST16(.6f,15),st->Davg1), MULT16_32_Q15(QCONST16(.4f,15),SUB32(Sff,See))); st->Davg2 = ADD32(MULT16_32_Q15(QCONST16(.85f,15),st->Davg2), MULT16_32_Q15(QCONST16(.15f,15),SUB32(Sff,See))); st->Dvar1 = FLOAT_ADD(FLOAT_MULT(VAR1_SMOOTH, st->Dvar1), FLOAT_MUL32U(MULT16_32_Q15(QCONST16(.4f,15),Sff), MULT16_32_Q15(QCONST16(.4f,15),Dbf))); st->Dvar2 = FLOAT_ADD(FLOAT_MULT(VAR2_SMOOTH, st->Dvar2), FLOAT_MUL32U(MULT16_32_Q15(QCONST16(.15f,15),Sff), MULT16_32_Q15(QCONST16(.15f,15),Dbf))); /* Equivalent float code: st->Davg1 = .6*st->Davg1 + .4*(Sff-See); st->Davg2 = .85*st->Davg2 + .15*(Sff-See); st->Dvar1 = .36*st->Dvar1 + .16*Sff*Dbf; st->Dvar2 = .7225*st->Dvar2 + .0225*Sff*Dbf; */ update_foreground = 0; /* Check if we have a statistically significant reduction in the residual echo */ /* Note that this is *not* Gaussian, so we need to be careful about the longer tail */ if (FLOAT_GT(FLOAT_MUL32U(SUB32(Sff,See),ABS32(SUB32(Sff,See))), FLOAT_MUL32U(Sff,Dbf))) update_foreground = 1; else if (FLOAT_GT(FLOAT_MUL32U(st->Davg1, ABS32(st->Davg1)), FLOAT_MULT(VAR1_UPDATE,(st->Dvar1)))) update_foreground = 1; else if (FLOAT_GT(FLOAT_MUL32U(st->Davg2, ABS32(st->Davg2)), FLOAT_MULT(VAR2_UPDATE,(st->Dvar2)))) update_foreground = 1; /* Do we update? */ if (update_foreground) { st->Davg1 = st->Davg2 = 0; st->Dvar1 = st->Dvar2 = FLOAT_ZERO; /* Copy background filter to foreground filter */ for (i=0;iforeground[i] = EXTRACT16(PSHR32(st->W[i],16)); /* Apply a smooth transition so as to not introduce blocking artifacts */ for (chan = 0; chan < C; chan++) for (i=0;iframe_size;i++) st->e[chan*N+i+st->frame_size] = MULT16_16_Q15(st->window[i+st->frame_size],st->e[chan*N+i+st->frame_size]) + MULT16_16_Q15(st->window[i],st->y[chan*N+i+st->frame_size]); } else { int reset_background=0; /* Otherwise, check if the background filter is significantly worse */ if (FLOAT_GT(FLOAT_MUL32U(NEG32(SUB32(Sff,See)),ABS32(SUB32(Sff,See))), FLOAT_MULT(VAR_BACKTRACK,FLOAT_MUL32U(Sff,Dbf)))) reset_background = 1; if (FLOAT_GT(FLOAT_MUL32U(NEG32(st->Davg1), ABS32(st->Davg1)), FLOAT_MULT(VAR_BACKTRACK,st->Dvar1))) reset_background = 1; if (FLOAT_GT(FLOAT_MUL32U(NEG32(st->Davg2), ABS32(st->Davg2)), FLOAT_MULT(VAR_BACKTRACK,st->Dvar2))) reset_background = 1; if (reset_background) { /* Copy foreground filter to background filter */ for (i=0;iW[i] = SHL32(EXTEND32(st->foreground[i]),16); /* We also need to copy the output so as to get correct adaptation */ for (chan = 0; chan < C; chan++) { for (i=0;iframe_size;i++) st->y[chan*N+i+st->frame_size] = st->e[chan*N+i+st->frame_size]; for (i=0;iframe_size;i++) st->e[chan*N+i] = SUB16(st->input[chan*st->frame_size+i], st->y[chan*N+i+st->frame_size]); } See = Sff; st->Davg1 = st->Davg2 = 0; st->Dvar1 = st->Dvar2 = FLOAT_ZERO; } } #endif Sey = Syy = Sdd = 0; for (chan = 0; chan < C; chan++) { /* Compute error signal (for the output with de-emphasis) */ for (i=0;iframe_size;i++) { spx_word32_t tmp_out; #ifdef TWO_PATH tmp_out = SUB32(EXTEND32(st->input[chan*st->frame_size+i]), EXTEND32(st->e[chan*N+i+st->frame_size])); #else tmp_out = SUB32(EXTEND32(st->input[chan*st->frame_size+i]), EXTEND32(st->y[chan*N+i+st->frame_size])); #endif tmp_out = ADD32(tmp_out, EXTEND32(MULT16_16_P15(st->preemph, st->memE[chan]))); /* This is an arbitrary test for saturation in the microphone signal */ if (in[i*C+chan] <= -32000 || in[i*C+chan] >= 32000) { if (st->saturated == 0) st->saturated = 1; } out[i*C+chan] = WORD2INT(tmp_out); st->memE[chan] = tmp_out; } #ifdef DUMP_ECHO_CANCEL_DATA dump_audio(in, far_end, out, st->frame_size); #endif /* Compute error signal (filter update version) */ for (i=0;iframe_size;i++) { st->e[chan*N+i+st->frame_size] = st->e[chan*N+i]; st->e[chan*N+i] = 0; } /* Compute a bunch of correlations */ /* FIXME: bad merge */ Sey += mdf_inner_prod(st->e+chan*N+st->frame_size, st->y+chan*N+st->frame_size, st->frame_size); Syy += mdf_inner_prod(st->y+chan*N+st->frame_size, st->y+chan*N+st->frame_size, st->frame_size); Sdd += mdf_inner_prod(st->input+chan*st->frame_size, st->input+chan*st->frame_size, st->frame_size); /* Convert error to frequency domain */ spx_fft(st->fft_table, st->e+chan*N, st->E+chan*N); for (i=0;iframe_size;i++) st->y[i+chan*N] = 0; spx_fft(st->fft_table, st->y+chan*N, st->Y+chan*N); /* Compute power spectrum of echo (X), error (E) and filter response (Y) */ power_spectrum_accum(st->E+chan*N, st->Rf, N); power_spectrum_accum(st->Y+chan*N, st->Yf, N); } /*printf ("%f %f %f %f\n", Sff, See, Syy, Sdd, st->update_cond);*/ /* Do some sanity check */ if (!(Syy>=0 && Sxx>=0 && See >= 0) #ifndef FIXED_POINT || !(Sff < N*1e9 && Syy < N*1e9 && Sxx < N*1e9) #endif ) { /* Things have gone really bad */ st->screwed_up += 50; for (i=0;iframe_size*C;i++) out[i] = 0; } else if (SHR32(Sff, 2) > ADD32(Sdd, SHR32(MULT16_16(N, 10000),6))) { /* AEC seems to add lots of echo instead of removing it, let's see if it will improve */ st->screwed_up++; } else { /* Everything's fine */ st->screwed_up=0; } if (st->screwed_up>=50) { speex_warning("The echo canceller started acting funny and got slapped (reset). It swears it will behave now."); speex_echo_state_reset(st); return; } /* Add a small noise floor to make sure not to have problems when dividing */ See = MAX32(See, SHR32(MULT16_16(N, 100),6)); for (speak = 0; speak < K; speak++) { Sxx += mdf_inner_prod(st->x+speak*N+st->frame_size, st->x+speak*N+st->frame_size, st->frame_size); power_spectrum_accum(st->X+speak*N, st->Xf, N); } /* Smooth far end energy estimate over time */ for (j=0;j<=st->frame_size;j++) st->power[j] = MULT16_32_Q15(ss_1,st->power[j]) + 1 + MULT16_32_Q15(ss,st->Xf[j]); /* Compute filtered spectra and (cross-)correlations */ for (j=st->frame_size;j>=0;j--) { spx_float_t Eh, Yh; Eh = PSEUDOFLOAT(st->Rf[j] - st->Eh[j]); Yh = PSEUDOFLOAT(st->Yf[j] - st->Yh[j]); Pey = FLOAT_ADD(Pey,FLOAT_MULT(Eh,Yh)); Pyy = FLOAT_ADD(Pyy,FLOAT_MULT(Yh,Yh)); #ifdef FIXED_POINT st->Eh[j] = MAC16_32_Q15(MULT16_32_Q15(SUB16(32767,st->spec_average),st->Eh[j]), st->spec_average, st->Rf[j]); st->Yh[j] = MAC16_32_Q15(MULT16_32_Q15(SUB16(32767,st->spec_average),st->Yh[j]), st->spec_average, st->Yf[j]); #else st->Eh[j] = (1-st->spec_average)*st->Eh[j] + st->spec_average*st->Rf[j]; st->Yh[j] = (1-st->spec_average)*st->Yh[j] + st->spec_average*st->Yf[j]; #endif } Pyy = FLOAT_SQRT(Pyy); Pey = FLOAT_DIVU(Pey,Pyy); /* Compute correlation updatete rate */ tmp32 = MULT16_32_Q15(st->beta0,Syy); if (tmp32 > MULT16_32_Q15(st->beta_max,See)) tmp32 = MULT16_32_Q15(st->beta_max,See); alpha = FLOAT_DIV32(tmp32, See); alpha_1 = FLOAT_SUB(FLOAT_ONE, alpha); /* Update correlations (recursive average) */ st->Pey = FLOAT_ADD(FLOAT_MULT(alpha_1,st->Pey) , FLOAT_MULT(alpha,Pey)); st->Pyy = FLOAT_ADD(FLOAT_MULT(alpha_1,st->Pyy) , FLOAT_MULT(alpha,Pyy)); if (FLOAT_LT(st->Pyy, FLOAT_ONE)) st->Pyy = FLOAT_ONE; /* We don't really hope to get better than 33 dB (MIN_LEAK-3dB) attenuation anyway */ if (FLOAT_LT(st->Pey, FLOAT_MULT(MIN_LEAK,st->Pyy))) st->Pey = FLOAT_MULT(MIN_LEAK,st->Pyy); if (FLOAT_GT(st->Pey, st->Pyy)) st->Pey = st->Pyy; /* leak_estimate is the linear regression result */ st->leak_estimate = FLOAT_EXTRACT16(FLOAT_SHL(FLOAT_DIVU(st->Pey, st->Pyy),14)); /* This looks like a stupid bug, but it's right (because we convert from Q14 to Q15) */ if (st->leak_estimate > 16383) st->leak_estimate = 32767; else st->leak_estimate = SHL16(st->leak_estimate,1); /*printf ("%f\n", st->leak_estimate);*/ /* Compute Residual to Error Ratio */ #ifdef FIXED_POINT tmp32 = MULT16_32_Q15(st->leak_estimate,Syy); tmp32 = ADD32(SHR32(Sxx,13), ADD32(tmp32, SHL32(tmp32,1))); /* Check for y in e (lower bound on RER) */ { spx_float_t bound = PSEUDOFLOAT(Sey); bound = FLOAT_DIVU(FLOAT_MULT(bound, bound), PSEUDOFLOAT(ADD32(1,Syy))); if (FLOAT_GT(bound, PSEUDOFLOAT(See))) tmp32 = See; else if (tmp32 < FLOAT_EXTRACT32(bound)) tmp32 = FLOAT_EXTRACT32(bound); } if (tmp32 > SHR32(See,1)) tmp32 = SHR32(See,1); RER = FLOAT_EXTRACT16(FLOAT_SHL(FLOAT_DIV32(tmp32,See),15)); #else RER = (.0001*Sxx + 3.*MULT16_32_Q15(st->leak_estimate,Syy)) / See; /* Check for y in e (lower bound on RER) */ if (RER < Sey*Sey/(1+See*Syy)) RER = Sey*Sey/(1+See*Syy); if (RER > .5) RER = .5; #endif /* We consider that the filter has had minimal adaptation if the following is true*/ if (!st->adapted && st->sum_adapt > SHL32(EXTEND32(M),15) && MULT16_32_Q15(st->leak_estimate,Syy) > MULT16_32_Q15(QCONST16(.03f,15),Syy)) { st->adapted = 1; } if (st->adapted) { /* Normal learning rate calculation once we're past the minimal adaptation phase */ for (i=0;i<=st->frame_size;i++) { spx_word32_t r, e; /* Compute frequency-domain adaptation mask */ r = MULT16_32_Q15(st->leak_estimate,SHL32(st->Yf[i],3)); e = SHL32(st->Rf[i],3)+1; #ifdef FIXED_POINT if (r>SHR32(e,1)) r = SHR32(e,1); #else if (r>.5*e) r = .5*e; #endif r = MULT16_32_Q15(QCONST16(.7,15),r) + MULT16_32_Q15(QCONST16(.3,15),(spx_word32_t)(MULT16_32_Q15(RER,e))); /*st->power_1[i] = adapt_rate*r/(e*(1+st->power[i]));*/ st->power_1[i] = FLOAT_SHL(FLOAT_DIV32_FLOAT(r,FLOAT_MUL32U(e,st->power[i]+10)),WEIGHT_SHIFT+16); } } else { /* Temporary adaption rate if filter is not yet adapted enough */ spx_word16_t adapt_rate=0; if (Sxx > SHR32(MULT16_16(N, 1000),6)) { tmp32 = MULT16_32_Q15(QCONST16(.25f, 15), Sxx); #ifdef FIXED_POINT if (tmp32 > SHR32(See,2)) tmp32 = SHR32(See,2); #else if (tmp32 > .25*See) tmp32 = .25*See; #endif adapt_rate = FLOAT_EXTRACT16(FLOAT_SHL(FLOAT_DIV32(tmp32, See),15)); } for (i=0;i<=st->frame_size;i++) st->power_1[i] = FLOAT_SHL(FLOAT_DIV32(EXTEND32(adapt_rate),ADD32(st->power[i],10)),WEIGHT_SHIFT+1); /* How much have we adapted so far? */ st->sum_adapt = ADD32(st->sum_adapt,adapt_rate); } /* FIXME: MC conversion required */ for (i=0;iframe_size;i++) st->last_y[i] = st->last_y[st->frame_size+i]; if (st->adapted) { /* If the filter is adapted, take the filtered echo */ for (i=0;iframe_size;i++) st->last_y[st->frame_size+i] = in[i]-out[i]; } else { /* If filter isn't adapted yet, all we can do is take the far end signal directly */ /* moved earlier: for (i=0;ilast_y[i] = st->x[i];*/ } } /* Compute spectrum of estimated echo for use in an echo post-filter */ void speex_echo_get_residual(SpeexEchoState *st, spx_word32_t *residual_echo, int len) { int i; spx_word16_t leak2; int N; N = st->window_size; /* Apply hanning window (should pre-compute it)*/ for (i=0;iy[i] = MULT16_16_Q15(st->window[i],st->last_y[i]); /* Compute power spectrum of the echo */ spx_fft(st->fft_table, st->y, st->Y); power_spectrum(st->Y, residual_echo, N); #ifdef FIXED_POINT if (st->leak_estimate > 16383) leak2 = 32767; else leak2 = SHL16(st->leak_estimate, 1); #else if (st->leak_estimate>.5) leak2 = 1; else leak2 = 2*st->leak_estimate; #endif /* Estimate residual echo */ for (i=0;i<=st->frame_size;i++) residual_echo[i] = (spx_int32_t)MULT16_32_Q15(leak2,residual_echo[i]); } EXPORT int speex_echo_ctl(SpeexEchoState *st, int request, void *ptr) { switch(request) { case SPEEX_ECHO_GET_FRAME_SIZE: (*(int*)ptr) = st->frame_size; break; case SPEEX_ECHO_SET_SAMPLING_RATE: st->sampling_rate = (*(int*)ptr); st->spec_average = DIV32_16(SHL32(EXTEND32(st->frame_size), 15), st->sampling_rate); #ifdef FIXED_POINT st->beta0 = DIV32_16(SHL32(EXTEND32(st->frame_size), 16), st->sampling_rate); st->beta_max = DIV32_16(SHL32(EXTEND32(st->frame_size), 14), st->sampling_rate); #else st->beta0 = (2.0f*st->frame_size)/st->sampling_rate; st->beta_max = (.5f*st->frame_size)/st->sampling_rate; #endif if (st->sampling_rate<12000) st->notch_radius = QCONST16(.9, 15); else if (st->sampling_rate<24000) st->notch_radius = QCONST16(.982, 15); else st->notch_radius = QCONST16(.992, 15); break; case SPEEX_ECHO_GET_SAMPLING_RATE: (*(int*)ptr) = st->sampling_rate; break; case SPEEX_ECHO_GET_IMPULSE_RESPONSE_SIZE: /*FIXME: Implement this for multiple channels */ *((spx_int32_t *)ptr) = st->M * st->frame_size; break; case SPEEX_ECHO_GET_IMPULSE_RESPONSE: { int M = st->M, N = st->window_size, n = st->frame_size, i, j; spx_int32_t *filt = (spx_int32_t *) ptr; for(j=0;jwtmp2[i] = EXTRACT16(PSHR32(st->W[j*N+i],16+NORMALIZE_SCALEDOWN)); spx_ifft(st->fft_table, st->wtmp2, st->wtmp); #else spx_ifft(st->fft_table, &st->W[j*N], st->wtmp); #endif for(i=0;iwtmp[i]), WEIGHT_SHIFT-NORMALIZE_SCALEDOWN); } } break; default: speex_warning_int("Unknown speex_echo_ctl request: ", request); return -1; } return 0; } mumble-1.3.4/3rdparty/speexdsp-src/libspeexdsp/fixed_arm4.h0000664000175000017500000001063114010707343023545 0ustar builderbuilder/* Copyright (C) 2004 Jean-Marc Valin */ /** @file fixed_arm4.h @brief ARM4 fixed-point operations */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef FIXED_ARM4_H #define FIXED_ARM4_H #undef MULT16_32_Q14 static inline spx_word32_t MULT16_32_Q14(spx_word16_t x, spx_word32_t y) { int res; int dummy; asm ( "smull %0,%1,%2,%3 \n\t" "mov %0, %0, lsr #14 \n\t" "add %0, %0, %1, lsl #18 \n\t" : "=&r"(res), "=&r" (dummy) : "r"(y),"r"((int)x)); return(res); } #undef MULT16_32_Q15 static inline spx_word32_t MULT16_32_Q15(spx_word16_t x, spx_word32_t y) { int res; int dummy; asm ( "smull %0,%1,%2,%3 \n\t" "mov %0, %0, lsr #15 \n\t" "add %0, %0, %1, lsl #17 \n\t" : "=&r"(res), "=&r" (dummy) : "r"(y),"r"((int)x)); return(res); } #undef DIV32_16 static inline short DIV32_16(int a, int b) { int res=0; int dead1, dead2, dead3, dead4, dead5; __asm__ __volatile__ ( "\teor %5, %0, %1\n" "\tmovs %4, %0\n" "\trsbmi %0, %0, #0 \n" "\tmovs %4, %1\n" "\trsbmi %1, %1, #0 \n" "\tmov %4, #1\n" "\tsubs %3, %0, %1, asl #14 \n" "\tmovpl %0, %3 \n" "\torrpl %2, %2, %4, asl #14 \n" "\tsubs %3, %0, %1, asl #13 \n" "\tmovpl %0, %3 \n" "\torrpl %2, %2, %4, asl #13 \n" "\tsubs %3, %0, %1, asl #12 \n" "\tmovpl %0, %3 \n" "\torrpl %2, %2, %4, asl #12 \n" "\tsubs %3, %0, %1, asl #11 \n" "\tmovpl %0, %3 \n" "\torrpl %2, %2, %4, asl #11 \n" "\tsubs %3, %0, %1, asl #10 \n" "\tmovpl %0, %3 \n" "\torrpl %2, %2, %4, asl #10 \n" "\tsubs %3, %0, %1, asl #9 \n" "\tmovpl %0, %3 \n" "\torrpl %2, %2, %4, asl #9 \n" "\tsubs %3, %0, %1, asl #8 \n" "\tmovpl %0, %3 \n" "\torrpl %2, %2, %4, asl #8 \n" "\tsubs %3, %0, %1, asl #7 \n" "\tmovpl %0, %3 \n" "\torrpl %2, %2, %4, asl #7 \n" "\tsubs %3, %0, %1, asl #6 \n" "\tmovpl %0, %3 \n" "\torrpl %2, %2, %4, asl #6 \n" "\tsubs %3, %0, %1, asl #5 \n" "\tmovpl %0, %3 \n" "\torrpl %2, %2, %4, asl #5 \n" "\tsubs %3, %0, %1, asl #4 \n" "\tmovpl %0, %3 \n" "\torrpl %2, %2, %4, asl #4 \n" "\tsubs %3, %0, %1, asl #3 \n" "\tmovpl %0, %3 \n" "\torrpl %2, %2, %4, asl #3 \n" "\tsubs %3, %0, %1, asl #2 \n" "\tmovpl %0, %3 \n" "\torrpl %2, %2, %4, asl #2 \n" "\tsubs %3, %0, %1, asl #1 \n" "\tmovpl %0, %3 \n" "\torrpl %2, %2, %4, asl #1 \n" "\tsubs %3, %0, %1 \n" "\tmovpl %0, %3 \n" "\torrpl %2, %2, %4 \n" "\tmovs %5, %5, lsr #31 \n" "\trsbne %2, %2, #0 \n" : "=r" (dead1), "=r" (dead2), "=r" (res), "=r" (dead3), "=r" (dead4), "=r" (dead5) : "0" (a), "1" (b), "2" (res) : "cc" ); return res; } #endif mumble-1.3.4/3rdparty/speexdsp-src/libspeexdsp/fixed_bfin.h0000664000175000017500000001127514010707343023625 0ustar builderbuilder/* Copyright (C) 2005 Analog Devices Author: Jean-Marc Valin */ /** @file fixed_bfin.h @brief Blackfin fixed-point operations */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef FIXED_BFIN_H #define FIXED_BFIN_H #include "bfin.h" #undef PDIV32_16 static inline spx_word16_t PDIV32_16(spx_word32_t a, spx_word16_t b) { spx_word32_t res, bb; bb = b; a += b>>1; __asm__ ( "P0 = 15;\n\t" "R0 = %1;\n\t" "R1 = %2;\n\t" //"R0 = R0 + R1;\n\t" "R0 <<= 1;\n\t" "DIVS (R0, R1);\n\t" "LOOP divide%= LC0 = P0;\n\t" "LOOP_BEGIN divide%=;\n\t" "DIVQ (R0, R1);\n\t" "LOOP_END divide%=;\n\t" "R0 = R0.L;\n\t" "%0 = R0;\n\t" : "=m" (res) : "m" (a), "m" (bb) : "P0", "R0", "R1", "ASTAT" BFIN_HWLOOP0_REGS); return res; } #undef DIV32_16 static inline spx_word16_t DIV32_16(spx_word32_t a, spx_word16_t b) { spx_word32_t res, bb; bb = b; /* Make the roundinf consistent with the C version (do we need to do that?)*/ if (a<0) a += (b-1); __asm__ ( "P0 = 15;\n\t" "R0 = %1;\n\t" "R1 = %2;\n\t" "R0 <<= 1;\n\t" "DIVS (R0, R1);\n\t" "LOOP divide%= LC0 = P0;\n\t" "LOOP_BEGIN divide%=;\n\t" "DIVQ (R0, R1);\n\t" "LOOP_END divide%=;\n\t" "R0 = R0.L;\n\t" "%0 = R0;\n\t" : "=m" (res) : "m" (a), "m" (bb) : "P0", "R0", "R1", "ASTAT" BFIN_HWLOOP0_REGS); return res; } #undef MAX16 static inline spx_word16_t MAX16(spx_word16_t a, spx_word16_t b) { spx_word32_t res; __asm__ ( "%1 = %1.L (X);\n\t" "%2 = %2.L (X);\n\t" "%0 = MAX(%1,%2);" : "=d" (res) : "%d" (a), "d" (b) : "ASTAT" ); return res; } #undef MULT16_32_Q15 static inline spx_word32_t MULT16_32_Q15(spx_word16_t a, spx_word32_t b) { spx_word32_t res; __asm__ ( "A1 = %2.L*%1.L (M);\n\t" "A1 = A1 >>> 15;\n\t" "%0 = (A1 += %2.L*%1.H) ;\n\t" : "=&W" (res), "=&d" (b) : "d" (a), "1" (b) : "A1", "ASTAT" ); return res; } #undef MAC16_32_Q15 static inline spx_word32_t MAC16_32_Q15(spx_word32_t c, spx_word16_t a, spx_word32_t b) { spx_word32_t res; __asm__ ( "A1 = %2.L*%1.L (M);\n\t" "A1 = A1 >>> 15;\n\t" "%0 = (A1 += %2.L*%1.H);\n\t" "%0 = %0 + %4;\n\t" : "=&W" (res), "=&d" (b) : "d" (a), "1" (b), "d" (c) : "A1", "ASTAT" ); return res; } #undef MULT16_32_Q14 static inline spx_word32_t MULT16_32_Q14(spx_word16_t a, spx_word32_t b) { spx_word32_t res; __asm__ ( "%2 <<= 1;\n\t" "A1 = %1.L*%2.L (M);\n\t" "A1 = A1 >>> 15;\n\t" "%0 = (A1 += %1.L*%2.H);\n\t" : "=W" (res), "=d" (a), "=d" (b) : "1" (a), "2" (b) : "A1", "ASTAT" ); return res; } #undef MAC16_32_Q14 static inline spx_word32_t MAC16_32_Q14(spx_word32_t c, spx_word16_t a, spx_word32_t b) { spx_word32_t res; __asm__ ( "%1 <<= 1;\n\t" "A1 = %2.L*%1.L (M);\n\t" "A1 = A1 >>> 15;\n\t" "%0 = (A1 += %2.L*%1.H);\n\t" "%0 = %0 + %4;\n\t" : "=&W" (res), "=&d" (b) : "d" (a), "1" (b), "d" (c) : "A1", "ASTAT" ); return res; } #endif mumble-1.3.4/3rdparty/speexdsp-src/libspeexdsp/testdenoise.c0000664000175000017500000000200314010707343024036 0ustar builderbuilder#ifdef HAVE_CONFIG_H #include "config.h" #endif #include "speex/speex_preprocess.h" #include #define NN 160 int main() { short in[NN]; int i; SpeexPreprocessState *st; int count=0; float f; st = speex_preprocess_state_init(NN, 8000); i=1; speex_preprocess_ctl(st, SPEEX_PREPROCESS_SET_DENOISE, &i); i=0; speex_preprocess_ctl(st, SPEEX_PREPROCESS_SET_AGC, &i); i=8000; speex_preprocess_ctl(st, SPEEX_PREPROCESS_SET_AGC_LEVEL, &i); i=0; speex_preprocess_ctl(st, SPEEX_PREPROCESS_SET_DEREVERB, &i); f=.0; speex_preprocess_ctl(st, SPEEX_PREPROCESS_SET_DEREVERB_DECAY, &f); f=.0; speex_preprocess_ctl(st, SPEEX_PREPROCESS_SET_DEREVERB_LEVEL, &f); while (1) { int vad; fread(in, sizeof(short), NN, stdin); if (feof(stdin)) break; vad = speex_preprocess_run(st, in); /*fprintf (stderr, "%d\n", vad);*/ fwrite(in, sizeof(short), NN, stdout); count++; } speex_preprocess_state_destroy(st); return 0; } mumble-1.3.4/3rdparty/speexdsp-src/libspeexdsp/arch.h0000664000175000017500000001526014010707343022443 0ustar builderbuilder/* Copyright (C) 2003 Jean-Marc Valin */ /** @file arch.h @brief Various architecture definitions Speex */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef ARCH_H #define ARCH_H /* A couple test to catch stupid option combinations */ #ifdef FIXED_POINT #ifdef FLOATING_POINT #error You cannot compile as floating point and fixed point at the same time #endif #ifdef _USE_SSE #error SSE is only for floating-point #endif #if ((defined (ARM4_ASM)||defined (ARM4_ASM)) && defined(BFIN_ASM)) || (defined (ARM4_ASM)&&defined(ARM5E_ASM)) #error Make up your mind. What CPU do you have? #endif #ifdef VORBIS_PSYCHO #error Vorbis-psy model currently not implemented in fixed-point #endif #else #ifndef FLOATING_POINT #error You now need to define either FIXED_POINT or FLOATING_POINT #endif #if defined (ARM4_ASM) || defined(ARM5E_ASM) || defined(BFIN_ASM) #error I suppose you can have a [ARM4/ARM5E/Blackfin] that has float instructions? #endif #ifdef FIXED_POINT_DEBUG #error "Don't you think enabling fixed-point is a good thing to do if you want to debug that?" #endif #endif #ifndef OUTSIDE_SPEEX #include "speex/speexdsp_types.h" #endif #define ABS(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute integer value. */ #define ABS16(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute 16-bit value. */ #define MIN16(a,b) ((a) < (b) ? (a) : (b)) /**< Maximum 16-bit value. */ #define MAX16(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 16-bit value. */ #define ABS32(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute 32-bit value. */ #define MIN32(a,b) ((a) < (b) ? (a) : (b)) /**< Maximum 32-bit value. */ #define MAX32(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 32-bit value. */ #ifdef FIXED_POINT typedef spx_int16_t spx_word16_t; typedef spx_int32_t spx_word32_t; typedef spx_word32_t spx_mem_t; typedef spx_word16_t spx_coef_t; typedef spx_word16_t spx_lsp_t; typedef spx_word32_t spx_sig_t; #define Q15ONE 32767 #define LPC_SCALING 8192 #define SIG_SCALING 16384 #define LSP_SCALING 8192. #define GAMMA_SCALING 32768. #define GAIN_SCALING 64 #define GAIN_SCALING_1 0.015625 #define LPC_SHIFT 13 #define LSP_SHIFT 13 #define SIG_SHIFT 14 #define GAIN_SHIFT 6 #define WORD2INT(x) ((x) < -32767 ? -32768 : ((x) > 32766 ? 32767 : (x))) #define VERY_SMALL 0 #define VERY_LARGE32 ((spx_word32_t)2147483647) #define VERY_LARGE16 ((spx_word16_t)32767) #define Q15_ONE ((spx_word16_t)32767) #ifdef FIXED_DEBUG #include "fixed_debug.h" #else #include "fixed_generic.h" #ifdef ARM5E_ASM #include "fixed_arm5e.h" #elif defined (ARM4_ASM) #include "fixed_arm4.h" #elif defined (BFIN_ASM) #include "fixed_bfin.h" #endif #endif #else typedef float spx_mem_t; typedef float spx_coef_t; typedef float spx_lsp_t; typedef float spx_sig_t; typedef float spx_word16_t; typedef float spx_word32_t; #define Q15ONE 1.0f #define LPC_SCALING 1.f #define SIG_SCALING 1.f #define LSP_SCALING 1.f #define GAMMA_SCALING 1.f #define GAIN_SCALING 1.f #define GAIN_SCALING_1 1.f #define VERY_SMALL 1e-15f #define VERY_LARGE32 1e15f #define VERY_LARGE16 1e15f #define Q15_ONE ((spx_word16_t)1.f) #define QCONST16(x,bits) (x) #define QCONST32(x,bits) (x) #define NEG16(x) (-(x)) #define NEG32(x) (-(x)) #define EXTRACT16(x) (x) #define EXTEND32(x) (x) #define SHR16(a,shift) (a) #define SHL16(a,shift) (a) #define SHR32(a,shift) (a) #define SHL32(a,shift) (a) #define PSHR16(a,shift) (a) #define PSHR32(a,shift) (a) #define VSHR32(a,shift) (a) #define SATURATE16(x,a) (x) #define SATURATE32(x,a) (x) #define SATURATE32PSHR(x,shift,a) (x) #define PSHR(a,shift) (a) #define SHR(a,shift) (a) #define SHL(a,shift) (a) #define SATURATE(x,a) (x) #define ADD16(a,b) ((a)+(b)) #define SUB16(a,b) ((a)-(b)) #define ADD32(a,b) ((a)+(b)) #define SUB32(a,b) ((a)-(b)) #define MULT16_16_16(a,b) ((a)*(b)) #define MULT16_16(a,b) ((spx_word32_t)(a)*(spx_word32_t)(b)) #define MAC16_16(c,a,b) ((c)+(spx_word32_t)(a)*(spx_word32_t)(b)) #define MULT16_32_Q11(a,b) ((a)*(b)) #define MULT16_32_Q13(a,b) ((a)*(b)) #define MULT16_32_Q14(a,b) ((a)*(b)) #define MULT16_32_Q15(a,b) ((a)*(b)) #define MULT16_32_P15(a,b) ((a)*(b)) #define MAC16_32_Q11(c,a,b) ((c)+(a)*(b)) #define MAC16_32_Q15(c,a,b) ((c)+(a)*(b)) #define MAC16_16_Q11(c,a,b) ((c)+(a)*(b)) #define MAC16_16_Q13(c,a,b) ((c)+(a)*(b)) #define MAC16_16_P13(c,a,b) ((c)+(a)*(b)) #define MULT16_16_Q11_32(a,b) ((a)*(b)) #define MULT16_16_Q13(a,b) ((a)*(b)) #define MULT16_16_Q14(a,b) ((a)*(b)) #define MULT16_16_Q15(a,b) ((a)*(b)) #define MULT16_16_P15(a,b) ((a)*(b)) #define MULT16_16_P13(a,b) ((a)*(b)) #define MULT16_16_P14(a,b) ((a)*(b)) #define DIV32_16(a,b) (((spx_word32_t)(a))/(spx_word16_t)(b)) #define PDIV32_16(a,b) (((spx_word32_t)(a))/(spx_word16_t)(b)) #define DIV32(a,b) (((spx_word32_t)(a))/(spx_word32_t)(b)) #define PDIV32(a,b) (((spx_word32_t)(a))/(spx_word32_t)(b)) #define WORD2INT(x) ((x) < -32767.5f ? -32768 : ((x) > 32766.5f ? 32767 : floor(.5+(x)))) #endif #if defined (CONFIG_TI_C54X) || defined (CONFIG_TI_C55X) /* 2 on TI C5x DSP */ #define BYTES_PER_CHAR 2 #define BITS_PER_CHAR 16 #define LOG2_BITS_PER_CHAR 4 #else #define BYTES_PER_CHAR 1 #define BITS_PER_CHAR 8 #define LOG2_BITS_PER_CHAR 3 #endif #ifdef FIXED_DEBUG extern long long spx_mips; #endif #endif mumble-1.3.4/3rdparty/speexdsp-src/libspeexdsp/fixed_arm5e.h0000664000175000017500000001221414010707343023712 0ustar builderbuilder/* Copyright (C) 2003 Jean-Marc Valin */ /** @file fixed_arm5e.h @brief ARM-tuned fixed-point operations */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef FIXED_ARM5E_H #define FIXED_ARM5E_H #undef MULT16_16 static inline spx_word32_t MULT16_16(spx_word16_t x, spx_word16_t y) { int res; asm ("smulbb %0,%1,%2;\n" : "=&r"(res) : "%r"(x),"r"(y)); return(res); } #undef MAC16_16 static inline spx_word32_t MAC16_16(spx_word32_t a, spx_word16_t x, spx_word32_t y) { int res; asm ("smlabb %0,%1,%2,%3;\n" : "=&r"(res) : "%r"(x),"r"(y),"r"(a)); return(res); } #undef MULT16_32_Q15 static inline spx_word32_t MULT16_32_Q15(spx_word16_t x, spx_word32_t y) { int res; asm ("smulwb %0,%1,%2;\n" : "=&r"(res) : "%r"(y<<1),"r"(x)); return(res); } #undef MAC16_32_Q15 static inline spx_word32_t MAC16_32_Q15(spx_word32_t a, spx_word16_t x, spx_word32_t y) { int res; asm ("smlawb %0,%1,%2,%3;\n" : "=&r"(res) : "%r"(y<<1),"r"(x),"r"(a)); return(res); } #undef MULT16_32_Q11 static inline spx_word32_t MULT16_32_Q11(spx_word16_t x, spx_word32_t y) { int res; asm ("smulwb %0,%1,%2;\n" : "=&r"(res) : "%r"(y<<5),"r"(x)); return(res); } #undef MAC16_32_Q11 static inline spx_word32_t MAC16_32_Q11(spx_word32_t a, spx_word16_t x, spx_word32_t y) { int res; asm ("smlawb %0,%1,%2,%3;\n" : "=&r"(res) : "%r"(y<<5),"r"(x),"r"(a)); return(res); } #undef DIV32_16 static inline short DIV32_16(int a, int b) { int res=0; int dead1, dead2, dead3, dead4, dead5; __asm__ __volatile__ ( "\teor %5, %0, %1\n" "\tmovs %4, %0\n" "\trsbmi %0, %0, #0 \n" "\tmovs %4, %1\n" "\trsbmi %1, %1, #0 \n" "\tmov %4, #1\n" "\tsubs %3, %0, %1, asl #14 \n" "\torrpl %2, %2, %4, asl #14 \n" "\tmovpl %0, %3 \n" "\tsubs %3, %0, %1, asl #13 \n" "\torrpl %2, %2, %4, asl #13 \n" "\tmovpl %0, %3 \n" "\tsubs %3, %0, %1, asl #12 \n" "\torrpl %2, %2, %4, asl #12 \n" "\tmovpl %0, %3 \n" "\tsubs %3, %0, %1, asl #11 \n" "\torrpl %2, %2, %4, asl #11 \n" "\tmovpl %0, %3 \n" "\tsubs %3, %0, %1, asl #10 \n" "\torrpl %2, %2, %4, asl #10 \n" "\tmovpl %0, %3 \n" "\tsubs %3, %0, %1, asl #9 \n" "\torrpl %2, %2, %4, asl #9 \n" "\tmovpl %0, %3 \n" "\tsubs %3, %0, %1, asl #8 \n" "\torrpl %2, %2, %4, asl #8 \n" "\tmovpl %0, %3 \n" "\tsubs %3, %0, %1, asl #7 \n" "\torrpl %2, %2, %4, asl #7 \n" "\tmovpl %0, %3 \n" "\tsubs %3, %0, %1, asl #6 \n" "\torrpl %2, %2, %4, asl #6 \n" "\tmovpl %0, %3 \n" "\tsubs %3, %0, %1, asl #5 \n" "\torrpl %2, %2, %4, asl #5 \n" "\tmovpl %0, %3 \n" "\tsubs %3, %0, %1, asl #4 \n" "\torrpl %2, %2, %4, asl #4 \n" "\tmovpl %0, %3 \n" "\tsubs %3, %0, %1, asl #3 \n" "\torrpl %2, %2, %4, asl #3 \n" "\tmovpl %0, %3 \n" "\tsubs %3, %0, %1, asl #2 \n" "\torrpl %2, %2, %4, asl #2 \n" "\tmovpl %0, %3 \n" "\tsubs %3, %0, %1, asl #1 \n" "\torrpl %2, %2, %4, asl #1 \n" "\tmovpl %0, %3 \n" "\tsubs %3, %0, %1 \n" "\torrpl %2, %2, %4 \n" "\tmovpl %0, %3 \n" "\tmovs %5, %5, lsr #31 \n" "\trsbne %2, %2, #0 \n" : "=r" (dead1), "=r" (dead2), "=r" (res), "=r" (dead3), "=r" (dead4), "=r" (dead5) : "0" (a), "1" (b), "2" (res) : "memory", "cc" ); return res; } #endif mumble-1.3.4/3rdparty/speexdsp-src/libspeexdsp/.cvsignore0000664000175000017500000000013214010707343023345 0ustar builderbuilder.deps .libs *.la *.lo *.o Makefile Makefile.in testdenoise testenc testenc_uwb testenc_wb mumble-1.3.4/3rdparty/speexdsp-src/libspeexdsp/echo_diagnostic.m0000664000175000017500000000403414010707343024652 0ustar builderbuilder% Attempts to diagnose AEC problems from recorded samples % % out = echo_diagnostic(rec_file, play_file, out_file, tail_length) % % Computes the full matrix inversion to cancel echo from the % recording 'rec_file' using the far end signal 'play_file' using % a filter length of 'tail_length'. The output is saved to 'out_file'. function out = echo_diagnostic(rec_file, play_file, out_file, tail_length) F=fopen(rec_file,'rb'); rec=fread(F,Inf,'short'); fclose (F); F=fopen(play_file,'rb'); play=fread(F,Inf,'short'); fclose (F); rec = [rec; zeros(1024,1)]; play = [play; zeros(1024,1)]; N = length(rec); corr = real(ifft(fft(rec).*conj(fft(play)))); acorr = real(ifft(fft(play).*conj(fft(play)))); [a,b] = max(corr); if b > N/2 b = b-N; end printf ("Far end to near end delay is %d samples\n", b); if (b > .3*tail_length) printf ('This is too much delay, try delaying the far-end signal a bit\n'); else if (b < 0) printf ('You have a negative delay, the echo canceller has no chance to cancel anything!\n'); else printf ('Delay looks OK.\n'); end end end N2 = round(N/2); corr1 = real(ifft(fft(rec(1:N2)).*conj(fft(play(1:N2))))); corr2 = real(ifft(fft(rec(N2+1:end)).*conj(fft(play(N2+1:end))))); [a,b1] = max(corr1); if b1 > N2/2 b1 = b1-N2; end [a,b2] = max(corr2); if b2 > N2/2 b2 = b2-N2; end drift = (b1-b2)/N2; printf ('Drift estimate is %f%% (%d samples)\n', 100*drift, b1-b2); if abs(b1-b2) < 10 printf ('A drift of a few (+-10) samples is normal.\n'); else if abs(b1-b2) < 30 printf ('There may be (not sure) excessive clock drift. Is the capture and playback done on the same soundcard?\n'); else printf ('Your clock is drifting! No way the AEC will be able to do anything with that. Most likely, you''re doing capture and playback from two different cards.\n'); end end end acorr(1) = .001+1.00001*acorr(1); AtA = toeplitz(acorr(1:tail_length)); bb = corr(1:tail_length); h = AtA\bb; out = (rec - filter(h, 1, play)); F=fopen(out_file,'w'); fwrite(F,out,'short'); fclose (F); mumble-1.3.4/3rdparty/speexdsp-src/libspeexdsp/fixed_debug.h0000664000175000017500000003462214010707343023776 0ustar builderbuilder/* Copyright (C) 2003 Jean-Marc Valin */ /** @file fixed_debug.h @brief Fixed-point operations with debugging */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef FIXED_DEBUG_H #define FIXED_DEBUG_H #include extern long long spx_mips; #define MIPS_INC spx_mips++, #define QCONST16(x,bits) ((spx_word16_t)(.5+(x)*(((spx_word32_t)1)<<(bits)))) #define QCONST32(x,bits) ((spx_word32_t)(.5+(x)*(((spx_word32_t)1)<<(bits)))) #define VERIFY_SHORT(x) ((x)<=32767&&(x)>=-32768) #define VERIFY_INT(x) ((x)<=2147483647LL&&(x)>=-2147483648LL) static inline short NEG16(int x) { int res; if (!VERIFY_SHORT(x)) { fprintf (stderr, "NEG16: input is not short: %d\n", (int)x); } res = -x; if (!VERIFY_SHORT(res)) fprintf (stderr, "NEG16: output is not short: %d\n", (int)res); spx_mips++; return res; } static inline int NEG32(long long x) { long long res; if (!VERIFY_INT(x)) { fprintf (stderr, "NEG16: input is not int: %d\n", (int)x); } res = -x; if (!VERIFY_INT(res)) fprintf (stderr, "NEG16: output is not int: %d\n", (int)res); spx_mips++; return res; } #define EXTRACT16(x) _EXTRACT16(x, __FILE__, __LINE__) static inline short _EXTRACT16(int x, char *file, int line) { int res; if (!VERIFY_SHORT(x)) { fprintf (stderr, "EXTRACT16: input is not short: %d in %s: line %d\n", x, file, line); } res = x; spx_mips++; return res; } #define EXTEND32(x) _EXTEND32(x, __FILE__, __LINE__) static inline int _EXTEND32(int x, char *file, int line) { int res; if (!VERIFY_SHORT(x)) { fprintf (stderr, "EXTEND32: input is not short: %d in %s: line %d\n", x, file, line); } res = x; spx_mips++; return res; } #define SHR16(a, shift) _SHR16(a, shift, __FILE__, __LINE__) static inline short _SHR16(int a, int shift, char *file, int line) { int res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(shift)) { fprintf (stderr, "SHR16: inputs are not short: %d >> %d in %s: line %d\n", a, shift, file, line); } res = a>>shift; if (!VERIFY_SHORT(res)) fprintf (stderr, "SHR16: output is not short: %d in %s: line %d\n", res, file, line); spx_mips++; return res; } #define SHL16(a, shift) _SHL16(a, shift, __FILE__, __LINE__) static inline short _SHL16(int a, int shift, char *file, int line) { int res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(shift)) { fprintf (stderr, "SHL16: inputs are not short: %d %d in %s: line %d\n", a, shift, file, line); } res = a<>shift; if (!VERIFY_INT(res)) { fprintf (stderr, "SHR32: output is not int: %d\n", (int)res); } spx_mips++; return res; } static inline int SHL32(long long a, int shift) { long long res; if (!VERIFY_INT(a) || !VERIFY_SHORT(shift)) { fprintf (stderr, "SHL32: inputs are not int: %d %d\n", (int)a, shift); } res = a<>1))),shift)) #define PSHR32(a,shift) (SHR32(ADD32((a),((EXTEND32(1)<<((shift))>>1))),shift)) #define VSHR32(a, shift) (((shift)>0) ? SHR32(a, shift) : SHL32(a, -(shift))) #define SATURATE16(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) #define SATURATE32(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) //#define SHR(a,shift) ((a) >> (shift)) //#define SHL(a,shift) ((a) << (shift)) #define ADD16(a, b) _ADD16(a, b, __FILE__, __LINE__) static inline short _ADD16(int a, int b, char *file, int line) { int res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "ADD16: inputs are not short: %d %d in %s: line %d\n", a, b, file, line); } res = a+b; if (!VERIFY_SHORT(res)) { fprintf (stderr, "ADD16: output is not short: %d+%d=%d in %s: line %d\n", a,b,res, file, line); } spx_mips++; return res; } #define SUB16(a, b) _SUB16(a, b, __FILE__, __LINE__) static inline short _SUB16(int a, int b, char *file, int line) { int res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "SUB16: inputs are not short: %d %d in %s: line %d\n", a, b, file, line); } res = a-b; if (!VERIFY_SHORT(res)) fprintf (stderr, "SUB16: output is not short: %d in %s: line %d\n", res, file, line); spx_mips++; return res; } #define ADD32(a, b) _ADD32(a, b, __FILE__, __LINE__) static inline int _ADD32(long long a, long long b, char *file, int line) { long long res; if (!VERIFY_INT(a) || !VERIFY_INT(b)) { fprintf (stderr, "ADD32: inputs are not int: %d %d in %s: line %d\n", (int)a, (int)b, file, line); } res = a+b; if (!VERIFY_INT(res)) { fprintf (stderr, "ADD32: output is not int: %d in %s: line %d\n", (int)res, file, line); } spx_mips++; return res; } static inline int SUB32(long long a, long long b) { long long res; if (!VERIFY_INT(a) || !VERIFY_INT(b)) { fprintf (stderr, "SUB32: inputs are not int: %d %d\n", (int)a, (int)b); } res = a-b; if (!VERIFY_INT(res)) fprintf (stderr, "SUB32: output is not int: %d\n", (int)res); spx_mips++; return res; } #define ADD64(a,b) (MIPS_INC(a)+(b)) /* result fits in 16 bits */ static inline short MULT16_16_16(int a, int b) { int res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16_16: inputs are not short: %d %d\n", a, b); } res = a*b; if (!VERIFY_SHORT(res)) fprintf (stderr, "MULT16_16_16: output is not short: %d\n", res); spx_mips++; return res; } #define MULT16_16(a, b) _MULT16_16(a, b, __FILE__, __LINE__) static inline int _MULT16_16(int a, int b, char *file, int line) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16: inputs are not short: %d %d in %s: line %d\n", a, b, file, line); } res = ((long long)a)*b; if (!VERIFY_INT(res)) fprintf (stderr, "MULT16_16: output is not int: %d in %s: line %d\n", (int)res, file, line); spx_mips++; return res; } #define MAC16_16(c,a,b) (spx_mips--,ADD32((c),MULT16_16((a),(b)))) #define MAC16_16_Q11(c,a,b) (EXTRACT16(ADD16((c),EXTRACT16(SHR32(MULT16_16((a),(b)),11))))) #define MAC16_16_Q13(c,a,b) (EXTRACT16(ADD16((c),EXTRACT16(SHR32(MULT16_16((a),(b)),13))))) #define MAC16_16_P13(c,a,b) (EXTRACT16(ADD32((c),SHR32(ADD32(4096,MULT16_16((a),(b))),13)))) #define MULT16_32_QX(a, b, Q) _MULT16_32_QX(a, b, Q, __FILE__, __LINE__) static inline int _MULT16_32_QX(int a, long long b, int Q, char *file, int line) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_INT(b)) { fprintf (stderr, "MULT16_32_Q%d: inputs are not short+int: %d %d in %s: line %d\n", Q, (int)a, (int)b, file, line); } if (ABS32(b)>=(EXTEND32(1)<<(15+Q))) fprintf (stderr, "MULT16_32_Q%d: second operand too large: %d %d in %s: line %d\n", Q, (int)a, (int)b, file, line); res = (((long long)a)*(long long)b) >> Q; if (!VERIFY_INT(res)) fprintf (stderr, "MULT16_32_Q%d: output is not int: %d*%d=%d in %s: line %d\n", Q, (int)a, (int)b,(int)res, file, line); spx_mips+=5; return res; } static inline int MULT16_32_PX(int a, long long b, int Q) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_INT(b)) { fprintf (stderr, "MULT16_32_P%d: inputs are not short+int: %d %d\n", Q, (int)a, (int)b); } if (ABS32(b)>=(EXTEND32(1)<<(15+Q))) fprintf (stderr, "MULT16_32_Q%d: second operand too large: %d %d\n", Q, (int)a, (int)b); res = ((((long long)a)*(long long)b) + ((EXTEND32(1)<>1))>> Q; if (!VERIFY_INT(res)) fprintf (stderr, "MULT16_32_P%d: output is not int: %d*%d=%d\n", Q, (int)a, (int)b,(int)res); spx_mips+=5; return res; } #define MULT16_32_Q11(a,b) MULT16_32_QX(a,b,11) #define MAC16_32_Q11(c,a,b) ADD32((c),MULT16_32_Q11((a),(b))) #define MULT16_32_Q12(a,b) MULT16_32_QX(a,b,12) #define MULT16_32_Q13(a,b) MULT16_32_QX(a,b,13) #define MULT16_32_Q14(a,b) MULT16_32_QX(a,b,14) #define MULT16_32_Q15(a,b) MULT16_32_QX(a,b,15) #define MULT16_32_P15(a,b) MULT16_32_PX(a,b,15) #define MAC16_32_Q15(c,a,b) ADD32((c),MULT16_32_Q15((a),(b))) static inline int SATURATE(int a, int b) { if (a>b) a=b; if (a<-b) a = -b; return a; } static inline int MULT16_16_Q11_32(int a, int b) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16_Q11: inputs are not short: %d %d\n", a, b); } res = ((long long)a)*b; res >>= 11; if (!VERIFY_INT(res)) fprintf (stderr, "MULT16_16_Q11: output is not short: %d*%d=%d\n", (int)a, (int)b, (int)res); spx_mips+=3; return res; } static inline short MULT16_16_Q13(int a, int b) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16_Q13: inputs are not short: %d %d\n", a, b); } res = ((long long)a)*b; res >>= 13; if (!VERIFY_SHORT(res)) fprintf (stderr, "MULT16_16_Q13: output is not short: %d*%d=%d\n", a, b, (int)res); spx_mips+=3; return res; } static inline short MULT16_16_Q14(int a, int b) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16_Q14: inputs are not short: %d %d\n", a, b); } res = ((long long)a)*b; res >>= 14; if (!VERIFY_SHORT(res)) fprintf (stderr, "MULT16_16_Q14: output is not short: %d\n", (int)res); spx_mips+=3; return res; } static inline short MULT16_16_Q15(int a, int b) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16_Q15: inputs are not short: %d %d\n", a, b); } res = ((long long)a)*b; res >>= 15; if (!VERIFY_SHORT(res)) { fprintf (stderr, "MULT16_16_Q15: output is not short: %d\n", (int)res); } spx_mips+=3; return res; } static inline short MULT16_16_P13(int a, int b) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16_P13: inputs are not short: %d %d\n", a, b); } res = ((long long)a)*b; res += 4096; if (!VERIFY_INT(res)) fprintf (stderr, "MULT16_16_P13: overflow: %d*%d=%d\n", a, b, (int)res); res >>= 13; if (!VERIFY_SHORT(res)) fprintf (stderr, "MULT16_16_P13: output is not short: %d*%d=%d\n", a, b, (int)res); spx_mips+=4; return res; } static inline short MULT16_16_P14(int a, int b) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16_P14: inputs are not short: %d %d\n", a, b); } res = ((long long)a)*b; res += 8192; if (!VERIFY_INT(res)) fprintf (stderr, "MULT16_16_P14: overflow: %d*%d=%d\n", a, b, (int)res); res >>= 14; if (!VERIFY_SHORT(res)) fprintf (stderr, "MULT16_16_P14: output is not short: %d*%d=%d\n", a, b, (int)res); spx_mips+=4; return res; } static inline short MULT16_16_P15(int a, int b) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16_P15: inputs are not short: %d %d\n", a, b); } res = ((long long)a)*b; res += 16384; if (!VERIFY_INT(res)) fprintf (stderr, "MULT16_16_P15: overflow: %d*%d=%d\n", a, b, (int)res); res >>= 15; if (!VERIFY_SHORT(res)) fprintf (stderr, "MULT16_16_P15: output is not short: %d*%d=%d\n", a, b, (int)res); spx_mips+=4; return res; } #define DIV32_16(a, b) _DIV32_16(a, b, __FILE__, __LINE__) static inline int _DIV32_16(long long a, long long b, char *file, int line) { long long res; if (b==0) { fprintf(stderr, "DIV32_16: divide by zero: %d/%d in %s: line %d\n", (int)a, (int)b, file, line); return 0; } if (!VERIFY_INT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "DIV32_16: inputs are not int/short: %d %d in %s: line %d\n", (int)a, (int)b, file, line); } res = a/b; if (!VERIFY_SHORT(res)) { fprintf (stderr, "DIV32_16: output is not short: %d / %d = %d in %s: line %d\n", (int)a,(int)b,(int)res, file, line); if (res>32767) res = 32767; if (res<-32768) res = -32768; } spx_mips+=20; return res; } #define DIV32(a, b) _DIV32(a, b, __FILE__, __LINE__) static inline int _DIV32(long long a, long long b, char *file, int line) { long long res; if (b==0) { fprintf(stderr, "DIV32: divide by zero: %d/%d in %s: line %d\n", (int)a, (int)b, file, line); return 0; } if (!VERIFY_INT(a) || !VERIFY_INT(b)) { fprintf (stderr, "DIV32: inputs are not int/short: %d %d in %s: line %d\n", (int)a, (int)b, file, line); } res = a/b; if (!VERIFY_INT(res)) fprintf (stderr, "DIV32: output is not int: %d in %s: line %d\n", (int)res, file, line); spx_mips+=36; return res; } #define PDIV32(a,b) DIV32(ADD32((a),(b)>>1),b) #define PDIV32_16(a,b) DIV32_16(ADD32((a),(b)>>1),b) #endif mumble-1.3.4/3rdparty/speexdsp-src/libspeexdsp/filterbank.h0000664000175000017500000000433414010707343023647 0ustar builderbuilder/* Copyright (C) 2006 Jean-Marc Valin */ /** @file filterbank.h @brief Converting between psd and filterbank */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef FILTERBANK_H #define FILTERBANK_H #include "arch.h" typedef struct { int *bank_left; int *bank_right; spx_word16_t *filter_left; spx_word16_t *filter_right; #ifndef FIXED_POINT float *scaling; #endif int nb_banks; int len; } FilterBank; FilterBank *filterbank_new(int banks, spx_word32_t sampling, int len, int type); void filterbank_destroy(FilterBank *bank); void filterbank_compute_bank32(FilterBank *bank, spx_word32_t *ps, spx_word32_t *mel); void filterbank_compute_psd16(FilterBank *bank, spx_word16_t *mel, spx_word16_t *psd); #ifndef FIXED_POINT void filterbank_compute_bank(FilterBank *bank, float *psd, float *mel); void filterbank_compute_psd(FilterBank *bank, float *mel, float *psd); #endif #endif mumble-1.3.4/3rdparty/speexdsp-src/libspeexdsp/fixed_generic.h0000664000175000017500000001242414010707343024320 0ustar builderbuilder/* Copyright (C) 2003 Jean-Marc Valin */ /** @file fixed_generic.h @brief Generic fixed-point operations */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef FIXED_GENERIC_H #define FIXED_GENERIC_H #define QCONST16(x,bits) ((spx_word16_t)(.5+(x)*(((spx_word32_t)1)<<(bits)))) #define QCONST32(x,bits) ((spx_word32_t)(.5+(x)*(((spx_word32_t)1)<<(bits)))) #define NEG16(x) (-(x)) #define NEG32(x) (-(x)) #define EXTRACT16(x) ((spx_word16_t)(x)) #define EXTEND32(x) ((spx_word32_t)(x)) #define SHR16(a,shift) ((a) >> (shift)) #define SHL16(a,shift) ((a) << (shift)) #define SHR32(a,shift) ((a) >> (shift)) #define SHL32(a,shift) ((a) << (shift)) #define PSHR16(a,shift) (SHR16((a)+((1<<((shift))>>1)),shift)) #define PSHR32(a,shift) (SHR32((a)+((EXTEND32(1)<<((shift))>>1)),shift)) #define VSHR32(a, shift) (((shift)>0) ? SHR32(a, shift) : SHL32(a, -(shift))) #define SATURATE16(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) #define SATURATE32(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) #define SATURATE32PSHR(x,shift,a) (((x)>=(SHL32(a,shift))) ? (a) : \ (x)<=-(SHL32(a,shift)) ? -(a) : \ (PSHR32(x, shift))) #define SHR(a,shift) ((a) >> (shift)) #define SHL(a,shift) ((spx_word32_t)(a) << (shift)) #define PSHR(a,shift) (SHR((a)+((EXTEND32(1)<<((shift))>>1)),shift)) #define SATURATE(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) #define ADD16(a,b) ((spx_word16_t)((spx_word16_t)(a)+(spx_word16_t)(b))) #define SUB16(a,b) ((spx_word16_t)(a)-(spx_word16_t)(b)) #define ADD32(a,b) ((spx_word32_t)(a)+(spx_word32_t)(b)) #define SUB32(a,b) ((spx_word32_t)(a)-(spx_word32_t)(b)) /* result fits in 16 bits */ #define MULT16_16_16(a,b) ((((spx_word16_t)(a))*((spx_word16_t)(b)))) /* (spx_word32_t)(spx_word16_t) gives TI compiler a hint that it's 16x16->32 multiply */ #define MULT16_16(a,b) (((spx_word32_t)(spx_word16_t)(a))*((spx_word32_t)(spx_word16_t)(b))) #define MAC16_16(c,a,b) (ADD32((c),MULT16_16((a),(b)))) #define MULT16_32_Q12(a,b) ADD32(MULT16_16((a),SHR((b),12)), SHR(MULT16_16((a),((b)&0x00000fff)),12)) #define MULT16_32_Q13(a,b) ADD32(MULT16_16((a),SHR((b),13)), SHR(MULT16_16((a),((b)&0x00001fff)),13)) #define MULT16_32_Q14(a,b) ADD32(MULT16_16((a),SHR((b),14)), SHR(MULT16_16((a),((b)&0x00003fff)),14)) #define MULT16_32_Q11(a,b) ADD32(MULT16_16((a),SHR((b),11)), SHR(MULT16_16((a),((b)&0x000007ff)),11)) #define MAC16_32_Q11(c,a,b) ADD32(c,ADD32(MULT16_16((a),SHR((b),11)), SHR(MULT16_16((a),((b)&0x000007ff)),11))) #define MULT16_32_P15(a,b) ADD32(MULT16_16((a),SHR((b),15)), PSHR(MULT16_16((a),((b)&0x00007fff)),15)) #define MULT16_32_Q15(a,b) ADD32(MULT16_16((a),SHR((b),15)), SHR(MULT16_16((a),((b)&0x00007fff)),15)) #define MAC16_32_Q15(c,a,b) ADD32(c,ADD32(MULT16_16((a),SHR((b),15)), SHR(MULT16_16((a),((b)&0x00007fff)),15))) #define MAC16_16_Q11(c,a,b) (ADD32((c),SHR(MULT16_16((a),(b)),11))) #define MAC16_16_Q13(c,a,b) (ADD32((c),SHR(MULT16_16((a),(b)),13))) #define MAC16_16_P13(c,a,b) (ADD32((c),SHR(ADD32(4096,MULT16_16((a),(b))),13))) #define MULT16_16_Q11_32(a,b) (SHR(MULT16_16((a),(b)),11)) #define MULT16_16_Q13(a,b) (SHR(MULT16_16((a),(b)),13)) #define MULT16_16_Q14(a,b) (SHR(MULT16_16((a),(b)),14)) #define MULT16_16_Q15(a,b) (SHR(MULT16_16((a),(b)),15)) #define MULT16_16_P13(a,b) (SHR(ADD32(4096,MULT16_16((a),(b))),13)) #define MULT16_16_P14(a,b) (SHR(ADD32(8192,MULT16_16((a),(b))),14)) #define MULT16_16_P15(a,b) (SHR(ADD32(16384,MULT16_16((a),(b))),15)) #define MUL_16_32_R15(a,bh,bl) ADD32(MULT16_16((a),(bh)), SHR(MULT16_16((a),(bl)),15)) #define DIV32_16(a,b) ((spx_word16_t)(((spx_word32_t)(a))/((spx_word16_t)(b)))) #define PDIV32_16(a,b) ((spx_word16_t)(((spx_word32_t)(a)+((spx_word16_t)(b)>>1))/((spx_word16_t)(b)))) #define DIV32(a,b) (((spx_word32_t)(a))/((spx_word32_t)(b))) #define PDIV32(a,b) (((spx_word32_t)(a)+((spx_word16_t)(b)>>1))/((spx_word32_t)(b))) #endif mumble-1.3.4/3rdparty/speexdsp-src/libspeexdsp/kiss_fft.c0000664000175000017500000003662514010707343023341 0ustar builderbuilder/* Copyright (c) 2003-2004, Mark Borgerding Copyright (c) 2005-2007, Jean-Marc Valin All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the author nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "_kiss_fft_guts.h" #include "arch.h" #include "os_support.h" /* The guts header contains all the multiplication and addition macros that are defined for fixed or floating point complex numbers. It also delares the kf_ internal functions. */ static void kf_bfly2( kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_cfg st, int m, int N, int mm ) { kiss_fft_cpx * Fout2; kiss_fft_cpx * tw1; kiss_fft_cpx t; if (!st->inverse) { int i,j; kiss_fft_cpx * Fout_beg = Fout; for (i=0;itwiddles; for(j=0;jr , tw1->r),MULT16_16(Fout2->i , tw1->i)), 1); ti = SHR32(ADD32(MULT16_16(Fout2->i , tw1->r),MULT16_16(Fout2->r , tw1->i)), 1); tw1 += fstride; Fout2->r = PSHR32(SUB32(SHL32(EXTEND32(Fout->r), 14), tr), 15); Fout2->i = PSHR32(SUB32(SHL32(EXTEND32(Fout->i), 14), ti), 15); Fout->r = PSHR32(ADD32(SHL32(EXTEND32(Fout->r), 14), tr), 15); Fout->i = PSHR32(ADD32(SHL32(EXTEND32(Fout->i), 14), ti), 15); ++Fout2; ++Fout; } } } else { int i,j; kiss_fft_cpx * Fout_beg = Fout; for (i=0;itwiddles; for(j=0;jinverse) { kiss_fft_cpx * Fout_beg = Fout; for (i=0;itwiddles; for (j=0;jtwiddles; for (j=0;jr = PSHR16(Fout->r, 2); Fout->i = PSHR16(Fout->i, 2); C_SUB( scratch[5] , *Fout, scratch[1] ); C_ADDTO(*Fout, scratch[1]); C_ADD( scratch[3] , scratch[0] , scratch[2] ); C_SUB( scratch[4] , scratch[0] , scratch[2] ); Fout[m2].r = PSHR16(Fout[m2].r, 2); Fout[m2].i = PSHR16(Fout[m2].i, 2); C_SUB( Fout[m2], *Fout, scratch[3] ); tw1 += fstride; tw2 += fstride*2; tw3 += fstride*3; C_ADDTO( *Fout , scratch[3] ); Fout[m].r = scratch[5].r + scratch[4].i; Fout[m].i = scratch[5].i - scratch[4].r; Fout[m3].r = scratch[5].r - scratch[4].i; Fout[m3].i = scratch[5].i + scratch[4].r; ++Fout; } } } } static void kf_bfly3( kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_cfg st, size_t m ) { size_t k=m; const size_t m2 = 2*m; kiss_fft_cpx *tw1,*tw2; kiss_fft_cpx scratch[5]; kiss_fft_cpx epi3; epi3 = st->twiddles[fstride*m]; tw1=tw2=st->twiddles; do{ if (!st->inverse) { C_FIXDIV(*Fout,3); C_FIXDIV(Fout[m],3); C_FIXDIV(Fout[m2],3); } C_MUL(scratch[1],Fout[m] , *tw1); C_MUL(scratch[2],Fout[m2] , *tw2); C_ADD(scratch[3],scratch[1],scratch[2]); C_SUB(scratch[0],scratch[1],scratch[2]); tw1 += fstride; tw2 += fstride*2; Fout[m].r = Fout->r - HALF_OF(scratch[3].r); Fout[m].i = Fout->i - HALF_OF(scratch[3].i); C_MULBYSCALAR( scratch[0] , epi3.i ); C_ADDTO(*Fout,scratch[3]); Fout[m2].r = Fout[m].r + scratch[0].i; Fout[m2].i = Fout[m].i - scratch[0].r; Fout[m].r -= scratch[0].i; Fout[m].i += scratch[0].r; ++Fout; }while(--k); } static void kf_bfly5( kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_cfg st, int m ) { kiss_fft_cpx *Fout0,*Fout1,*Fout2,*Fout3,*Fout4; int u; kiss_fft_cpx scratch[13]; kiss_fft_cpx * twiddles = st->twiddles; kiss_fft_cpx *tw; kiss_fft_cpx ya,yb; ya = twiddles[fstride*m]; yb = twiddles[fstride*2*m]; Fout0=Fout; Fout1=Fout0+m; Fout2=Fout0+2*m; Fout3=Fout0+3*m; Fout4=Fout0+4*m; tw=st->twiddles; for ( u=0; uinverse) { C_FIXDIV( *Fout0,5); C_FIXDIV( *Fout1,5); C_FIXDIV( *Fout2,5); C_FIXDIV( *Fout3,5); C_FIXDIV( *Fout4,5); } scratch[0] = *Fout0; C_MUL(scratch[1] ,*Fout1, tw[u*fstride]); C_MUL(scratch[2] ,*Fout2, tw[2*u*fstride]); C_MUL(scratch[3] ,*Fout3, tw[3*u*fstride]); C_MUL(scratch[4] ,*Fout4, tw[4*u*fstride]); C_ADD( scratch[7],scratch[1],scratch[4]); C_SUB( scratch[10],scratch[1],scratch[4]); C_ADD( scratch[8],scratch[2],scratch[3]); C_SUB( scratch[9],scratch[2],scratch[3]); Fout0->r += scratch[7].r + scratch[8].r; Fout0->i += scratch[7].i + scratch[8].i; scratch[5].r = scratch[0].r + S_MUL(scratch[7].r,ya.r) + S_MUL(scratch[8].r,yb.r); scratch[5].i = scratch[0].i + S_MUL(scratch[7].i,ya.r) + S_MUL(scratch[8].i,yb.r); scratch[6].r = S_MUL(scratch[10].i,ya.i) + S_MUL(scratch[9].i,yb.i); scratch[6].i = -S_MUL(scratch[10].r,ya.i) - S_MUL(scratch[9].r,yb.i); C_SUB(*Fout1,scratch[5],scratch[6]); C_ADD(*Fout4,scratch[5],scratch[6]); scratch[11].r = scratch[0].r + S_MUL(scratch[7].r,yb.r) + S_MUL(scratch[8].r,ya.r); scratch[11].i = scratch[0].i + S_MUL(scratch[7].i,yb.r) + S_MUL(scratch[8].i,ya.r); scratch[12].r = - S_MUL(scratch[10].i,yb.i) + S_MUL(scratch[9].i,ya.i); scratch[12].i = S_MUL(scratch[10].r,yb.i) - S_MUL(scratch[9].r,ya.i); C_ADD(*Fout2,scratch[11],scratch[12]); C_SUB(*Fout3,scratch[11],scratch[12]); ++Fout0;++Fout1;++Fout2;++Fout3;++Fout4; } } /* perform the butterfly for one stage of a mixed radix FFT */ static void kf_bfly_generic( kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_cfg st, int m, int p ) { int u,k,q1,q; kiss_fft_cpx * twiddles = st->twiddles; kiss_fft_cpx t; kiss_fft_cpx scratchbuf[17]; int Norig = st->nfft; /*CHECKBUF(scratchbuf,nscratchbuf,p);*/ if (p>17) speex_fatal("KissFFT: max radix supported is 17"); for ( u=0; uinverse) { C_FIXDIV(scratchbuf[q1],p); } k += m; } k=u; for ( q1=0 ; q1

    (Z+L:?fE}6.p1rA (Xq vEp3S"j`kWB z ]nP,b`2( dĠfbcBvn s?XItP,iibqf턎eE"Pk.B lo,#5t %7K .P $ ~I~˜ʎ'|<.Q%Gﮈ\9\XbLinɶ|]7ZϵV.9WHɴ7 n^m\@> Dt92;-`$bKo'tHƹO'm@<$yH7!TrUX,(:06'5w[fJa纭N &B:~˸tDzaoh͖Gf_*hp*]'is,}(MܺAqo Iȱ-7͙{gnhh5Zcnu\6;i܃f#8mj; 2](pgń2EfJp rCbgp6s+vM\`0EoR-rHI=\rM0S~A.eeS6\},3*J_Z/[c7QЗ6EЛeЗrY,a,+ĄJI7Ksso߾ X>:iܥwoKuvu]okkm Jyfnd$$$2Ace\ޏxԄyWQ<}dH Z4RRlZo9MP(rw31/R]T*^M?Ř ن3kOE{\1Fޫ U@l͹Sfgcc&N/ϥ(XSTZCw~b$#,<%w?TnCև*K^Z"uelIAL2@ph_f}Bwxd%_r}rp`/&$)]]O^|DE*xFD8Jk}`#͟Vy (L@j_xuPexTjMO/+%_JMee$7ʕr\@$953(*r|3 PjsN&F1"Zn!’3.s2n_xGyjʢRfZ(m2kXfӘ#9,gwPA;;qrr@¼}ㅦw_q3QebtYr FDC$٭@mQ,@AzD ٳgul~9׷Um:fApΗ7-,ui︽*׃*K:Y>HԌPCfBEW^'~I5&ps]x2-u>{gPxj jo>:=&K\%LGp8ܫȚg Ж* oT e3|SKpO=Whp+UXq?E\'ݫHSww Ȅvxtvvz͹0]=ƛ , !8e!t4/Fƈ@d87{k68JJKk hqg )) y&wS[P9.1yW_Bn|^y(yS'Bmtv??pU +#tX|WE9&LWQڝ׳m.:}Ae%Q2W<6atoq||4,-rУ|G[ha%whFrHw5FWD\c ħ!ױ* z'6me-p"B?كӨO~ M^Զ`W$grGhV^HIHu`+sQ@iÈ8jM&O .KW.ЇcKPF {0a<ϤR~ʗA9RcWMכo6-*mˠ r1Ќ{fE c!n\(3=t= { NqIS<̓n붶\_ N+9@r0﹛l}[h'^ nuv}{O1(6}Ҁ%ײ"|Y5"AM.r ] f?uVHă<ɔ77YOs9s,3nS摋ա2Sٜpu[N j!~ E&{l%[mڡm}P[W_ n59#?PKeH2 } PK 4i4 settings.xmlZW:~{up=YE&B4MIja"+ۚ{\&7Lf\~]q*ۅ#D=1]ƣf%{z@>(j8Rөn_BN+ ,*HTWaiѕlueA0}*̥ *Eqtz:)V|w34H(( c#ܞM1gFog ' ^3k{3Zʥ=Jf?FZZ]vcz">Z_|W+Fћ'潟s^),TONK'>owГLB/vn < t嬔=?胠)D wPlxr KuՔ|YZ.W!R?E^Xcs X/b~g 8uUI9g\mfhjOn PE[l' {/#yV[3$"GE6>ޕZR]όCzF@3gjaabrj$K/:\TO쬉ſCo8U 9]\:6m mJobOz8Sͤ(sduG3h4TunO(7iBt %i-ûm !i9A@cxH Q KБ]'# :e|d=vi |kzK3cl2!:uW;GJOMкl"5f=H%P$X l2b}3}gGaB$Y&)a| p ka~)@ mY6ړg-_!dhmUc 3m^L|rDf1zˌρ7qFLgA0RѬF؈: l(dxdy."hLz}.c#vwWڌ JPfaBog,w՞"Vg:m;`ߒaQQߌz(~CxVZIHIG2o^̽r۝`m8kpr? ^}vu`ò.j3P 2k5ǡb:JCs9-pj>܇aG#(WU^N[lwɔjxȹ7k׃R9Xl4Tb_2 #$[fڵ5dGPKD-e&PK 4i4META-INF/manifest.xml՘]o0+/v]IhH%T])C<Ͱi?4Mfmhd<6EX$38X<,vdi2~^X)f4"Bzu{jliF4h@ c&uS]|LP@Tx"gǂ OWB)a7+X[&VrRleF|, z`!\傻)`lN Q$vAU,( 8h\?gVE75U Q.F㐦DGx>_S,˥?)<:QA*h=7 w%8 ӆuYv[ͲnNve,fuewP˧}~E]I]^}ղȲG6qG3"jzőrg ~τ9rs2kb’h-Z|;ntmеF1]G nt]uF3]O nt}sus @jA7Ѝn`Acy[AՋT/ZZf"g&f,[޳ۋWd"O_PK GPPK 4i4.++mimetypePK 4i4QConfigurations2/PK 4i4 VersionList.xmlPK 4i4iObjectReplacements/Object 10PK 4i4nukObjectReplacements/Object 11PK 4i4CFObjectReplacements/Object 1PK 4i4CFtObjectReplacements/Object 2PK 4i4 ^AObjectReplacements/Object 3PK 4i4,5Z}ObjectReplacements/Object 4PK 4i47&ҵU0 ObjectReplacements/Object 5PK 4i4CF ObjectReplacements/Object 6PK 4i4] ObjectReplacements/Object 7PK 4i4ObjectReplacements/Object 8PK 4i40ObjectReplacements/Object 9PK 4i4#,{  content.xmlPK 4i4{rXObject 10/content.xmlPK 4i4I]qW2Object 10/settings.xmlPK 4i4>S&#Object 11/content.xmlPK 4i4;y6%Object 11/settings.xmlPK 4i4#rDG )styles.xmlPK 4i4@c=o2Object 1/content.xmlPK 4i4YjZ3Object 1/settings.xmlPK 4i4@c=8Object 2/content.xmlPK 4i4YjZ :Object 2/settings.xmlPK 4i4 @>Object 3/content.xmlPK 4i4YjZ)@Object 3/settings.xmlPK 4i4KPmDObject 4/content.xmlPK 4i4ZuFObject 4/settings.xmlPK 4i478SKObject 5/content.xmlPK 4i4LxXLObject 5/settings.xmlPK 4i4@c=BQObject 6/content.xmlPK 4i4YjZRObject 6/settings.xmlPK 4i4v^WObject 7/content.xmlPK 4i4GVXObject 7/settings.xmlPK 4i4vW]Object 8/content.xmlPK 4i4GV^Object 8/settings.xmlPK 4i4tz PcObject 9/content.xmlPK 4i4{ZdObject 9/settings.xmlPK 4i47mm9imeta.xmlPK 4i4h0EmVersions/Version1PK 4i42AmОVersions/Version2PK 4i4ID-MVersions/Version3PK 4i4eH2 } %.Thumbnails/thumbnail.pngPK 4i4D-e& ;settings.xmlPK 4i4 GPAMETA-INF/manifest.xmlPK-- jDmumble-1.3.4/3rdparty/speexdsp-src/doc/echo_path.eps0000664000175000017500000023253414010707343022250 0ustar builderbuilder%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 415 235 %%Pages: 0 %%Creator: Sun Microsystems, Inc. %%Title: none %%CreationDate: none %%LanguageLevel: 2 %%EndComments %%BeginProlog %%BeginResource: procset SDRes-Prolog 1.0 0 /b4_inc_state save def /dict_count countdictstack def /op_count count 1 sub def userdict begin 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit[] 0 setdash newpath /languagelevel where {pop languagelevel 1 ne {false setstrokeadjust false setoverprint} if} if /bdef {bind def} bind def /c {setgray} bdef /l {neg lineto} bdef /rl {neg rlineto} bdef /lc {setlinecap} bdef /lj {setlinejoin} bdef /lw {setlinewidth} bdef /ml {setmiterlimit} bdef /ld {setdash} bdef /m {neg moveto} bdef /ct {6 2 roll neg 6 2 roll neg 6 2 roll neg curveto} bdef /r {rotate} bdef /t {neg translate} bdef /s {scale} bdef /sw {show} bdef /gs {gsave} bdef /gr {grestore} bdef /f {findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding ISOLatin1Encoding def currentdict end /NFont exch definefont pop /NFont findfont} bdef /p {closepath} bdef /sf {scalefont setfont} bdef /ef {eofill}bdef /pc {closepath stroke}bdef /ps {stroke}bdef /pum {matrix currentmatrix}bdef /pom {setmatrix}bdef /bs {/aString exch def /nXOfs exch def /nWidth exch def currentpoint nXOfs 0 rmoveto pum nWidth aString stringwidth pop div 1 scale aString show pom moveto} bdef %%EndResource %%EndProlog %%BeginSetup %%EndSetup %%Page: 1 1 %%BeginPageSetup %%EndPageSetup pum 0.02836 0.02836 s 0 -8286 t /tm matrix currentmatrix def tm setmatrix -3900 -8857 t 1 1 s 0.000 c 10000 12000 m 9581 12419 l 9413 12084 l 10000 12000 l p ef 6989 13478 m 9586 12179 l 9609 12224 l 7011 13522 l 6989 13478 l p ef 0.996 c 8500 13800 m 7500 13800 l 7500 11800 l 9500 11800 l 9500 13800 l 8500 13800 l p ef 50 lw 1 lj 0.000 c 8500 13800 m 7500 13800 l 7500 11800 l 9500 11800 l 9500 13800 l 8500 13800 l pc gs gs pum 8080 12960 t 103 -334 m 103 -334 103 -334 8 -334 ct 8 -334 8 -334 8 -323 ct 31 -318 34 -314 34 -294 ct 34 -294 34 -294 34 -42 ct 34 -21 30 -16 8 -12 ct 8 -12 8 -12 8 0 ct 8 0 8 0 127 0 ct 127 0 127 0 127 -12 ct 109 -14 103 -22 103 -40 ct 103 -40 103 -40 103 -172 ct 103 -174 106 -179 111 -184 ct 122 -195 134 -201 145 -201 ct 163 -201 171 -188 171 -160 ct 171 -160 171 -160 171 -40 ct 171 -22 165 -14 148 -12 ct 148 -12 148 -12 148 0 ct 148 0 148 0 264 0 ct 264 0 264 0 264 -12 ct 246 -13 240 -21 240 -42 ct 240 -42 240 -42 240 -164 ct 240 -207 213 -234 173 -234 ct 147 -234 128 -224 103 -195 ct 103 -195 103 -195 103 -334 ct p ef pom gr gs pum 8351 12960 t 143 -334 m 107 -310 92 -297 75 -274 ct 40 -231 23 -182 23 -124 ct 23 -62 41 -13 84 37 ct 104 61 116 72 141 87 ct 141 87 141 87 147 79 ct 108 48 95 31 82 -6 ct 70 -39 65 -76 65 -126 ct 65 -178 71 -218 84 -249 ct 98 -279 112 -297 147 -326 ct 147 -326 147 -326 143 -334 ct p ef pom gr gs pum 8516 12960 t 227 -58 m 227 -58 227 -58 217 -45 ct 203 -27 194 -19 187 -19 ct 183 -19 179 -23 179 -27 ct 179 -31 179 -31 186 -58 ct 186 -58 186 -58 214 -160 ct 216 -170 218 -181 218 -188 ct 218 -206 205 -218 186 -218 ct 154 -218 123 -189 72 -110 ct 72 -110 72 -110 105 -217 ct 105 -217 105 -217 104 -218 ct 77 -213 67 -211 24 -203 ct 24 -203 24 -203 24 -195 ct 49 -195 55 -192 55 -182 ct 55 -179 55 -176 54 -173 ct 54 -173 54 -173 7 0 ct 7 0 7 0 44 0 ct 67 -78 72 -89 93 -123 ct 123 -168 148 -193 166 -193 ct 174 -193 178 -188 178 -179 ct 178 -173 175 -156 171 -141 ct 171 -141 171 -141 150 -60 ct 143 -35 142 -28 142 -23 ct 142 -4 149 4 165 4 ct 187 4 200 -6 234 -52 ct 234 -52 234 -52 227 -58 ct p ef pom gr gs pum 8766 12960 t 18 87 m 54 64 69 51 87 28 ct 121 -15 138 -64 138 -122 ct 138 -185 120 -233 77 -283 ct 58 -307 45 -318 20 -334 ct 20 -334 20 -334 14 -326 ct 53 -295 66 -277 79 -240 ct 91 -207 96 -170 96 -120 ct 96 -69 90 -28 77 2 ct 63 33 49 51 14 79 ct 14 79 14 79 18 87 ct p ef pom gr gr 14100 16000 m 13824 16000 13600 15776 13600 15500 ct 13600 15224 13824 15000 14100 15000 ct 14376 15000 14600 15224 14600 15500 ct 14600 15776 14376 16000 14100 16000 ct pc gs gs pum 13954 15668 t 121 -141 m 15 -141 l 15 -108 l 121 -108 l 121 0 l 153 0 l 153 -108 l 259 -108 l 259 -141 l 153 -141 l 153 -250 l 121 -250 l 121 -141 l p ef pom gr gr 8500 16000 m 8224 16000 8000 15776 8000 15500 ct 8000 15224 8224 15000 8500 15000 ct 8776 15000 9000 15224 9000 15500 ct 9000 15776 8776 16000 8500 16000 ct pc 8500 15000 m 8313 14438 l 8688 14438 l 8500 15000 l p ef 8525 13800 m 8525 14550 l 8475 14550 l 8475 13800 l 8525 13800 l p ef 9000 15500 m 9563 15313 l 9563 15688 l 9000 15500 l p ef 13600 15525 m 9450 15525 l 9450 15475 l 13600 15475 l 13600 15525 l p ef 14100 13800 m 13100 13800 l 13100 11800 l 15100 11800 l 15100 13800 l 14100 13800 l pc gs gs pum 13663 12960 t 103 -334 m 103 -334 103 -334 8 -334 ct 8 -334 8 -334 8 -323 ct 31 -318 34 -314 34 -294 ct 34 -294 34 -294 34 -42 ct 34 -21 30 -16 8 -12 ct 8 -12 8 -12 8 0 ct 8 0 8 0 127 0 ct 127 0 127 0 127 -12 ct 109 -14 103 -22 103 -40 ct 103 -40 103 -40 103 -172 ct 103 -174 106 -179 111 -184 ct 122 -195 134 -201 145 -201 ct 163 -201 171 -188 171 -160 ct 171 -160 171 -160 171 -40 ct 171 -22 165 -14 148 -12 ct 148 -12 148 -12 148 0 ct 148 0 148 0 264 0 ct 264 0 264 0 264 -12 ct 246 -13 240 -21 240 -42 ct 240 -42 240 -42 240 -164 ct 240 -207 213 -234 173 -234 ct 147 -234 128 -224 103 -195 ct 103 -195 103 -195 103 -334 ct p ef pom gr gs pum 13934 12960 t 143 -334 m 107 -310 92 -297 75 -274 ct 40 -231 23 -182 23 -124 ct 23 -62 41 -13 84 37 ct 104 61 116 72 141 87 ct 141 87 141 87 147 79 ct 108 48 95 31 82 -6 ct 70 -39 65 -76 65 -126 ct 65 -178 71 -218 84 -249 ct 98 -279 112 -297 147 -326 ct 147 -326 147 -326 143 -334 ct p ef pom gr gs pum 14099 12960 t 227 -58 m 227 -58 227 -58 217 -45 ct 203 -27 194 -19 187 -19 ct 183 -19 179 -23 179 -27 ct 179 -31 179 -31 186 -58 ct 186 -58 186 -58 214 -160 ct 216 -170 218 -181 218 -188 ct 218 -206 205 -218 186 -218 ct 154 -218 123 -189 72 -110 ct 72 -110 72 -110 105 -217 ct 105 -217 105 -217 104 -218 ct 77 -213 67 -211 24 -203 ct 24 -203 24 -203 24 -195 ct 49 -195 55 -192 55 -182 ct 55 -179 55 -176 54 -173 ct 54 -173 54 -173 7 0 ct 7 0 7 0 44 0 ct 67 -78 72 -89 93 -123 ct 123 -168 148 -193 166 -193 ct 174 -193 178 -188 178 -179 ct 178 -173 175 -156 171 -141 ct 171 -141 171 -141 150 -60 ct 143 -35 142 -28 142 -23 ct 142 -4 149 4 165 4 ct 187 4 200 -6 234 -52 ct 234 -52 234 -52 227 -58 ct p ef pom gr gs pum 14349 12960 t 18 87 m 54 64 69 51 87 28 ct 121 -15 138 -64 138 -122 ct 138 -185 120 -233 77 -283 ct 58 -307 45 -318 20 -334 ct 20 -334 20 -334 14 -326 ct 53 -295 66 -277 79 -240 ct 91 -207 96 -170 96 -120 ct 96 -69 90 -28 77 2 ct 63 33 49 51 14 79 ct 14 79 14 79 18 87 ct p ef pom gr gr 14100 15000 m 13913 14438 l 14288 14438 l 14100 15000 l p ef 14125 13800 m 14125 14550 l 14075 14550 l 14075 13800 l 14125 13800 l p ef 5900 15500 m 6463 15313 l 6463 15688 l 5900 15500 l p ef 8000 15525 m 6350 15525 l 6350 15475 l 8000 15475 l 8000 15525 l p ef 8500 11800 m 8313 11238 l 8688 11238 l 8500 11800 l p ef 5600 10575 m 8500 10575 l 8500 10600 l 8500 10625 l 5600 10625 l 5600 10600 l 5600 10575 l p ef 8500 10600 m 8500 10575 l 8504 10575 l 8509 10577 l 8512 10578 l 8516 10581 l 8519 10584 l 8522 10587 l 8523 10591 l 8525 10596 l 8525 10600 l 8525 10600 l 8500 10600 l p ef 8525 10600 m 8525 11350 l 8500 11350 l 8475 11350 l 8475 10600 l 8500 10600 l 8525 10600 l p ef 14600 15500 m 15163 15313 l 15163 15688 l 14600 15500 l p ef 15900 15525 m 15050 15525 l 15050 15475 l 15900 15475 l 15900 15525 l p ef 14100 11800 m 13913 11238 l 14288 11238 l 14100 11800 l p ef 5600 10575 m 14100 10575 l 14100 10600 l 14100 10625 l 5600 10625 l 5600 10600 l 5600 10575 l p ef 14100 10600 m 14100 10575 l 14104 10575 l 14109 10577 l 14112 10578 l 14116 10581 l 14119 10584 l 14122 10587 l 14123 10591 l 14125 10596 l 14125 10600 l 14125 10600 l 14100 10600 l p ef 14125 10600 m 14125 11350 l 14100 11350 l 14075 11350 l 14075 10600 l 14100 10600 l 14125 10600 l p ef 7000 15500 m 7000 13500 l ps gs gs pum 16150 15536 t 10 -200 m 16 -200 20 -200 25 -200 ct 44 -200 49 -192 56 -146 ct 61 -112 67 -37 67 -8 ct 67 6 68 9 72 9 ct 84 9 130 -43 180 -114 ct 198 -138 210 -170 210 -189 ct 210 -205 198 -218 183 -218 ct 172 -218 165 -212 165 -201 ct 165 -193 167 -188 176 -180 ct 183 -174 185 -170 185 -165 ct 185 -142 153 -87 118 -50 ct 118 -50 118 -50 102 -35 ct 99 -104 96 -130 89 -167 ct 80 -217 80 -218 75 -218 ct 73 -218 69 -217 65 -216 ct 56 -214 29 -209 10 -206 ct 10 -206 10 -206 10 -200 ct p ef pom gr gs pum 16370 15536 t 143 -334 m 107 -310 92 -297 75 -274 ct 40 -231 23 -182 23 -124 ct 23 -62 41 -13 84 37 ct 104 61 116 72 141 87 ct 141 87 141 87 147 79 ct 108 48 95 31 82 -6 ct 70 -39 65 -76 65 -126 ct 65 -178 71 -218 84 -249 ct 98 -279 112 -297 147 -326 ct 147 -326 147 -326 143 -334 ct p ef pom gr gs pum 16535 15536 t 227 -58 m 227 -58 227 -58 217 -45 ct 203 -27 194 -19 187 -19 ct 183 -19 179 -23 179 -27 ct 179 -31 179 -31 186 -58 ct 186 -58 186 -58 214 -160 ct 216 -170 218 -181 218 -188 ct 218 -206 205 -218 186 -218 ct 154 -218 123 -189 72 -110 ct 72 -110 72 -110 105 -217 ct 105 -217 105 -217 104 -218 ct 77 -213 67 -211 24 -203 ct 24 -203 24 -203 24 -195 ct 49 -195 55 -192 55 -182 ct 55 -179 55 -176 54 -173 ct 54 -173 54 -173 7 0 ct 7 0 7 0 44 0 ct 67 -78 72 -89 93 -123 ct 123 -168 148 -193 166 -193 ct 174 -193 178 -188 178 -179 ct 178 -173 175 -156 171 -141 ct 171 -141 171 -141 150 -60 ct 143 -35 142 -28 142 -23 ct 142 -4 149 4 165 4 ct 187 4 200 -6 234 -52 ct 234 -52 234 -52 227 -58 ct p ef pom gr gs pum 16785 15536 t 18 87 m 54 64 69 51 87 28 ct 121 -15 138 -64 138 -122 ct 138 -185 120 -233 77 -283 ct 58 -307 45 -318 20 -334 ct 20 -334 20 -334 14 -326 ct 53 -295 66 -277 79 -240 ct 91 -207 96 -170 96 -120 ct 96 -69 90 -28 77 2 ct 63 33 49 51 14 79 ct 14 79 14 79 18 87 ct p ef pom gr gr gs gs pum 9747 15298 t 229 -55 m 202 -24 197 -20 188 -20 ct 183 -20 179 -24 179 -30 ct 179 -37 195 -97 211 -152 ct 225 -197 235 -237 260 -336 ct 260 -336 260 -336 258 -338 ct 232 -333 214 -330 182 -327 ct 182 -327 182 -327 182 -318 ct 209 -318 213 -316 213 -306 ct 213 -299 212 -296 206 -271 ct 206 -271 206 -271 184 -190 ct 180 -210 171 -218 152 -218 ct 87 -218 7 -125 7 -51 ct 7 -16 27 5 59 5 ct 93 5 115 -11 148 -60 ct 143 -35 142 -27 142 -16 ct 142 -3 150 6 163 6 ct 183 6 209 -14 235 -50 ct 235 -50 235 -50 229 -55 ct p 154 -207 m 168 -207 176 -198 176 -180 ct 176 -104 124 -19 79 -19 ct 62 -19 50 -32 50 -51 ct 50 -92 75 -149 108 -183 ct 122 -198 140 -207 154 -207 ct p ef pom gr gs pum 9997 15298 t 143 -334 m 107 -310 92 -297 75 -274 ct 40 -231 23 -182 23 -124 ct 23 -62 41 -13 84 37 ct 104 61 116 72 141 87 ct 141 87 141 87 147 79 ct 108 48 95 31 82 -6 ct 70 -39 65 -76 65 -126 ct 65 -178 71 -218 84 -249 ct 98 -279 112 -297 147 -326 ct 147 -326 147 -326 143 -334 ct p ef pom gr gs pum 10162 15298 t 227 -58 m 227 -58 227 -58 217 -45 ct 203 -27 194 -19 187 -19 ct 183 -19 179 -23 179 -27 ct 179 -31 179 -31 186 -58 ct 186 -58 186 -58 214 -160 ct 216 -170 218 -181 218 -188 ct 218 -206 205 -218 186 -218 ct 154 -218 123 -189 72 -110 ct 72 -110 72 -110 105 -217 ct 105 -217 105 -217 104 -218 ct 77 -213 67 -211 24 -203 ct 24 -203 24 -203 24 -195 ct 49 -195 55 -192 55 -182 ct 55 -179 55 -176 54 -173 ct 54 -173 54 -173 7 0 ct 7 0 7 0 44 0 ct 67 -78 72 -89 93 -123 ct 123 -168 148 -193 166 -193 ct 174 -193 178 -188 178 -179 ct 178 -173 175 -156 171 -141 ct 171 -141 171 -141 150 -60 ct 143 -35 142 -28 142 -23 ct 142 -4 149 4 165 4 ct 187 4 200 -6 234 -52 ct 234 -52 234 -52 227 -58 ct p ef pom gr gs pum 10412 15298 t 18 87 m 54 64 69 51 87 28 ct 121 -15 138 -64 138 -122 ct 138 -185 120 -233 77 -283 ct 58 -307 45 -318 20 -334 ct 20 -334 20 -334 14 -326 ct 53 -295 66 -277 79 -240 ct 91 -207 96 -170 96 -120 ct 96 -69 90 -28 77 2 ct 63 33 49 51 14 79 ct 14 79 14 79 18 87 ct p ef pom gr gr gs gs pum 4561 10747 t 199 -55 m 195 -51 192 -48 188 -42 ct 176 -27 170 -22 165 -22 ct 158 -22 153 -29 150 -42 ct 149 -46 148 -49 148 -51 ct 135 -101 130 -123 130 -131 ct 152 -169 169 -190 178 -190 ct 181 -190 185 -189 190 -186 ct 196 -183 200 -182 204 -182 ct 214 -182 221 -189 221 -200 ct 221 -210 212 -218 201 -218 ct 179 -218 160 -200 126 -147 ct 126 -147 126 -147 121 -175 ct 114 -208 108 -218 95 -218 ct 84 -218 67 -214 37 -204 ct 37 -204 37 -204 32 -202 ct 32 -202 32 -202 34 -194 ct 52 -199 57 -200 61 -200 ct 74 -200 77 -195 83 -166 ct 83 -166 83 -166 98 -105 ct 98 -105 98 -105 57 -47 ct 47 -33 38 -24 32 -24 ct 29 -24 24 -25 19 -28 ct 13 -32 7 -33 3 -33 ct -6 -33 -13 -26 -13 -16 ct -13 -3 -3 5 11 5 ct 27 5 33 1 57 -30 ct 71 -45 81 -59 102 -87 ct 102 -87 102 -87 117 -28 ct 123 -3 129 5 145 5 ct 164 5 177 -7 206 -51 ct 206 -51 206 -51 199 -55 ct p ef pom gr gs pum 4781 10747 t 143 -334 m 107 -310 92 -297 75 -274 ct 40 -231 23 -182 23 -124 ct 23 -62 41 -13 84 37 ct 104 61 116 72 141 87 ct 141 87 141 87 147 79 ct 108 48 95 31 82 -6 ct 70 -39 65 -76 65 -126 ct 65 -178 71 -218 84 -249 ct 98 -279 112 -297 147 -326 ct 147 -326 147 -326 143 -334 ct p ef pom gr gs pum 4946 10747 t 227 -58 m 227 -58 227 -58 217 -45 ct 203 -27 194 -19 187 -19 ct 183 -19 179 -23 179 -27 ct 179 -31 179 -31 186 -58 ct 186 -58 186 -58 214 -160 ct 216 -170 218 -181 218 -188 ct 218 -206 205 -218 186 -218 ct 154 -218 123 -189 72 -110 ct 72 -110 72 -110 105 -217 ct 105 -217 105 -217 104 -218 ct 77 -213 67 -211 24 -203 ct 24 -203 24 -203 24 -195 ct 49 -195 55 -192 55 -182 ct 55 -179 55 -176 54 -173 ct 54 -173 54 -173 7 0 ct 7 0 7 0 44 0 ct 67 -78 72 -89 93 -123 ct 123 -168 148 -193 166 -193 ct 174 -193 178 -188 178 -179 ct 178 -173 175 -156 171 -141 ct 171 -141 171 -141 150 -60 ct 143 -35 142 -28 142 -23 ct 142 -4 149 4 165 4 ct 187 4 200 -6 234 -52 ct 234 -52 234 -52 227 -58 ct p ef pom gr gs pum 5196 10747 t 18 87 m 54 64 69 51 87 28 ct 121 -15 138 -64 138 -122 ct 138 -185 120 -233 77 -283 ct 58 -307 45 -318 20 -334 ct 20 -334 20 -334 14 -326 ct 53 -295 66 -277 79 -240 ct 91 -207 96 -170 96 -120 ct 96 -69 90 -28 77 2 ct 63 33 49 51 14 79 ct 14 79 14 79 18 87 ct p ef pom gr gr gs gs pum 4932 15694 t 177 -54 m 141 -25 126 -17 105 -17 ct 77 -17 58 -35 58 -62 ct 58 -69 59 -77 63 -92 ct 63 -92 63 -92 77 -94 ct 151 -105 204 -142 204 -185 ct 204 -206 189 -218 164 -218 ct 93 -218 15 -137 15 -63 ct 15 -23 42 5 81 5 ct 116 5 154 -15 183 -48 ct 183 -48 183 -48 177 -54 ct p 75 -125 m 92 -169 128 -207 154 -207 ct 164 -207 171 -199 171 -188 ct 171 -172 162 -155 146 -140 ct 128 -123 109 -114 67 -103 ct 67 -103 67 -103 75 -125 ct p ef pom gr gs pum 5152 15694 t 143 -334 m 107 -310 92 -297 75 -274 ct 40 -231 23 -182 23 -124 ct 23 -62 41 -13 84 37 ct 104 61 116 72 141 87 ct 141 87 141 87 147 79 ct 108 48 95 31 82 -6 ct 70 -39 65 -76 65 -126 ct 65 -178 71 -218 84 -249 ct 98 -279 112 -297 147 -326 ct 147 -326 147 -326 143 -334 ct p ef pom gr gs pum 5317 15694 t 227 -58 m 227 -58 227 -58 217 -45 ct 203 -27 194 -19 187 -19 ct 183 -19 179 -23 179 -27 ct 179 -31 179 -31 186 -58 ct 186 -58 186 -58 214 -160 ct 216 -170 218 -181 218 -188 ct 218 -206 205 -218 186 -218 ct 154 -218 123 -189 72 -110 ct 72 -110 72 -110 105 -217 ct 105 -217 105 -217 104 -218 ct 77 -213 67 -211 24 -203 ct 24 -203 24 -203 24 -195 ct 49 -195 55 -192 55 -182 ct 55 -179 55 -176 54 -173 ct 54 -173 54 -173 7 0 ct 7 0 7 0 44 0 ct 67 -78 72 -89 93 -123 ct 123 -168 148 -193 166 -193 ct 174 -193 178 -188 178 -179 ct 178 -173 175 -156 171 -141 ct 171 -141 171 -141 150 -60 ct 143 -35 142 -28 142 -23 ct 142 -4 149 4 165 4 ct 187 4 200 -6 234 -52 ct 234 -52 234 -52 227 -58 ct p ef pom gr gs pum 5567 15694 t 18 87 m 54 64 69 51 87 28 ct 121 -15 138 -64 138 -122 ct 138 -185 120 -233 77 -283 ct 58 -307 45 -318 20 -334 ct 20 -334 20 -334 14 -326 ct 53 -295 66 -277 79 -240 ct 91 -207 96 -170 96 -120 ct 96 -69 90 -28 77 2 ct 63 33 49 51 14 79 ct 14 79 14 79 18 87 ct p ef pom gr gr gs gs pum 8954 15959 t 121 -141 m 15 -141 l 15 -108 l 121 -108 l 121 0 l 153 0 l 153 -108 l 259 -108 l 259 -141 l 153 -141 l 153 -250 l 121 -250 l 121 -141 l p ef pom gr gr gs gs pum 8848 15033 t 19 -127 m 19 -96 l 138 -96 l 138 -127 l 19 -127 l p ef pom gr gr gs gs pum 8080 12705 t 45 -147 m 114 -290 l 183 -147 l 216 -147 l 128 -327 l 99 -327 l 12 -147 l 45 -147 l p ef pom gr gr 0.996 c 12400 9601 m 12394 11602 l 11895 11099 l 11897 10099 l 12400 9601 l p ef 0.000 c 12400 9601 m 12394 11602 l 11895 11099 l 11897 10099 l 12400 9601 l pc 0.996 c 11397 10599 m 11398 10099 l 11898 10100 l 11895 11100 l 11395 11099 l 11397 10599 l p ef 0.000 c 11397 10599 m 11398 10099 l 11898 10100 l 11895 11100 l 11395 11099 l 11397 10599 l pc 0.996 c 11900 16000 m 11624 16000 11400 15776 11400 15500 ct 11400 15224 11624 15000 11900 15000 ct 12176 15000 12400 15224 12400 15500 ct 12400 15776 12176 16000 11900 16000 ct p ef 0.000 c 11900 16000 m 11624 16000 11400 15776 11400 15500 ct 11400 15224 11624 15000 11900 15000 ct 12176 15000 12400 15224 12400 15500 ct 12400 15776 12176 16000 11900 16000 ct pc 12400 15000 m 12400 16000 l ps gs gs pum 14880 16144 t 8 -196 m 11 -198 15 -198 21 -198 ct 34 -198 39 -191 39 -166 ct 39 -166 39 -166 39 -44 ct 39 -15 33 -8 9 -8 ct 9 -8 9 -8 9 0 ct 9 0 9 0 111 0 ct 111 0 111 0 111 -8 ct 87 -8 79 -14 79 -32 ct 79 -32 79 -32 79 -171 ct 103 -194 113 -200 129 -200 ct 153 -200 165 -184 165 -152 ct 165 -152 165 -152 165 -48 ct 165 -17 158 -8 134 -8 ct 134 -8 134 -8 134 0 ct 134 0 134 0 235 0 ct 235 0 235 0 235 -7 ct 211 -10 205 -16 205 -40 ct 205 -40 205 -40 205 -153 ct 205 -199 184 -227 148 -227 ct 126 -227 111 -219 78 -187 ct 78 -187 78 -187 78 -226 ct 78 -226 78 -226 75 -227 ct 51 -218 34 -213 8 -205 ct 8 -205 8 -205 8 -196 ct p ef 448 -81 m 424 -43 403 -29 372 -29 ct 345 -29 324 -43 310 -72 ct 301 -90 298 -107 297 -137 ct 297 -137 297 -137 446 -137 ct 442 -169 437 -183 425 -199 ct 411 -217 388 -227 363 -227 ct 339 -227 316 -218 298 -201 ct 275 -181 262 -146 262 -106 ct 262 -37 297 5 353 5 ct 399 5 435 -24 455 -78 ct 455 -78 455 -78 448 -81 ct p 298 -153 m 303 -191 320 -209 349 -209 ct 379 -209 390 -196 397 -153 ct 397 -153 397 -153 298 -153 ct p ef 684 -32 m 676 -26 670 -23 663 -23 ct 652 -23 648 -30 648 -52 ct 648 -52 648 -52 648 -148 ct 648 -173 646 -188 638 -200 ct 628 -218 607 -227 578 -227 ct 533 -227 497 -203 497 -171 ct 497 -160 507 -150 518 -150 ct 530 -150 540 -160 540 -171 ct 540 -173 539 -175 539 -179 ct 538 -183 537 -187 537 -191 ct 537 -204 553 -215 572 -215 ct 596 -215 609 -201 609 -174 ct 609 -174 609 -174 609 -144 ct 534 -113 526 -109 505 -90 ct 495 -81 488 -64 488 -48 ct 488 -17 509 5 539 5 ct 560 5 580 -5 609 -31 ct 612 -5 621 5 640 5 ct 657 5 667 -1 684 -20 ct 684 -20 684 -20 684 -32 ct p 609 -61 m 609 -45 607 -41 596 -35 ct 585 -28 571 -24 561 -24 ct 544 -24 531 -40 531 -62 ct 531 -62 531 -62 531 -63 ct 531 -92 550 -110 609 -132 ct 609 -132 609 -132 609 -61 ct p ef 693 -192 m 700 -194 705 -194 710 -194 ct 722 -194 727 -186 727 -164 ct 727 -164 727 -164 727 -41 ct 727 -17 723 -13 692 -7 ct 692 -7 692 -7 692 0 ct 692 0 692 0 809 0 ct 809 0 809 0 809 -8 ct 776 -8 767 -15 767 -44 ct 767 -44 767 -44 767 -155 ct 767 -171 788 -196 801 -196 ct 804 -196 809 -193 814 -188 ct 822 -182 827 -179 833 -179 ct 845 -179 852 -187 852 -201 ct 852 -217 842 -227 826 -227 ct 805 -227 791 -216 767 -181 ct 767 -181 767 -181 767 -226 ct 767 -226 767 -226 765 -227 ct 739 -216 722 -210 693 -200 ct 693 -200 693 -200 693 -192 ct p ef 1176 -81 m 1152 -43 1131 -29 1100 -29 ct 1073 -29 1052 -43 1038 -72 ct 1029 -90 1026 -107 1025 -137 ct 1025 -137 1025 -137 1174 -137 ct 1170 -169 1165 -183 1153 -199 ct 1139 -217 1116 -227 1091 -227 ct 1067 -227 1044 -218 1026 -201 ct 1003 -181 990 -146 990 -106 ct 990 -37 1025 5 1081 5 ct 1127 5 1163 -24 1183 -78 ct 1183 -78 1183 -78 1176 -81 ct p 1026 -153 m 1031 -191 1048 -209 1077 -209 ct 1107 -209 1118 -196 1125 -153 ct 1125 -153 1125 -153 1026 -153 ct p ef 1206 -196 m 1209 -198 1213 -198 1219 -198 ct 1232 -198 1237 -191 1237 -166 ct 1237 -166 1237 -166 1237 -44 ct 1237 -15 1231 -8 1207 -8 ct 1207 -8 1207 -8 1207 0 ct 1207 0 1207 0 1309 0 ct 1309 0 1309 0 1309 -8 ct 1285 -8 1277 -14 1277 -32 ct 1277 -32 1277 -32 1277 -171 ct 1301 -194 1311 -200 1327 -200 ct 1351 -200 1363 -184 1363 -152 ct 1363 -152 1363 -152 1363 -48 ct 1363 -17 1356 -8 1332 -8 ct 1332 -8 1332 -8 1332 0 ct 1332 0 1332 0 1433 0 ct 1433 0 1433 0 1433 -7 ct 1409 -10 1403 -16 1403 -40 ct 1403 -40 1403 -40 1403 -153 ct 1403 -199 1382 -227 1346 -227 ct 1324 -227 1309 -219 1276 -187 ct 1276 -187 1276 -187 1276 -226 ct 1276 -226 1276 -226 1273 -227 ct 1249 -218 1232 -213 1206 -205 ct 1206 -205 1206 -205 1206 -196 ct p ef 1615 5 m 1615 5 1615 5 1686 -21 ct 1686 -21 1686 -21 1686 -28 ct 1677 -28 1676 -28 1675 -28 ct 1657 -28 1653 -33 1653 -56 ct 1653 -56 1653 -56 1653 -336 ct 1653 -336 1653 -336 1651 -337 ct 1628 -329 1611 -324 1580 -315 ct 1580 -315 1580 -315 1580 -308 ct 1584 -308 1586 -308 1590 -308 ct 1608 -308 1613 -303 1613 -283 ct 1613 -283 1613 -283 1613 -206 ct 1594 -222 1581 -227 1562 -227 ct 1506 -227 1461 -171 1461 -101 ct 1461 -38 1497 5 1551 5 ct 1578 5 1596 -5 1613 -28 ct 1613 -28 1613 -28 1613 4 ct 1613 4 1613 4 1615 5 ct p 1613 -50 m 1613 -47 1609 -41 1604 -35 ct 1596 -26 1584 -21 1570 -21 ct 1529 -21 1503 -60 1503 -121 ct 1503 -177 1526 -213 1563 -213 ct 1589 -213 1613 -190 1613 -164 ct 1613 -164 1613 -164 1613 -50 ct p ef 1973 -155 m 1973 -155 1973 -155 1971 -222 ct 1971 -222 1971 -222 1965 -222 ct 1965 -222 1965 -222 1964 -221 ct 1960 -218 1959 -217 1957 -217 ct 1955 -217 1950 -218 1944 -221 ct 1934 -225 1923 -227 1911 -227 ct 1872 -227 1845 -202 1845 -166 ct 1845 -138 1860 -118 1901 -95 ct 1901 -95 1901 -95 1929 -78 ct 1946 -69 1955 -57 1955 -41 ct 1955 -20 1939 -6 1914 -6 ct 1898 -6 1883 -12 1874 -23 ct 1864 -35 1859 -47 1853 -75 ct 1853 -75 1853 -75 1845 -75 ct 1845 -75 1845 -75 1845 2 ct 1845 2 1845 2 1851 2 ct 1855 -3 1857 -4 1863 -4 ct 1867 -4 1874 -3 1885 0 ct 1898 3 1912 5 1920 5 ct 1957 5 1988 -24 1988 -58 ct 1988 -83 1977 -99 1948 -117 ct 1948 -117 1948 -117 1896 -148 ct 1882 -156 1875 -169 1875 -182 ct 1875 -202 1890 -216 1912 -216 ct 1940 -216 1954 -199 1965 -155 ct 1965 -155 1965 -155 1973 -155 ct p ef 2019 -195 m 2024 -195 2027 -195 2031 -195 ct 2048 -195 2051 -190 2051 -167 ct 2051 -167 2051 -167 2051 65 ct 2051 90 2046 96 2017 99 ct 2017 99 2017 99 2017 107 ct 2017 107 2017 107 2135 107 ct 2135 107 2135 107 2135 98 ct 2098 98 2092 93 2092 61 ct 2092 61 2092 61 2092 -16 ct 2109 0 2121 5 2141 5 ct 2198 5 2243 -50 2243 -122 ct 2243 -183 2209 -227 2162 -227 ct 2135 -227 2113 -215 2092 -189 ct 2092 -189 2092 -189 2092 -226 ct 2092 -226 2092 -226 2089 -227 ct 2063 -217 2046 -210 2019 -202 ct 2019 -202 2019 -202 2019 -195 ct p 2092 -165 m 2092 -180 2119 -197 2141 -197 ct 2177 -197 2201 -160 2201 -103 ct 2201 -48 2177 -11 2142 -11 ct 2120 -11 2092 -29 2092 -44 ct 2092 -44 2092 -44 2092 -165 ct p ef 2463 -81 m 2439 -43 2418 -29 2387 -29 ct 2360 -29 2339 -43 2325 -72 ct 2316 -90 2313 -107 2312 -137 ct 2312 -137 2312 -137 2461 -137 ct 2457 -169 2452 -183 2440 -199 ct 2426 -217 2403 -227 2378 -227 ct 2354 -227 2331 -218 2313 -201 ct 2290 -181 2277 -146 2277 -106 ct 2277 -37 2312 5 2368 5 ct 2414 5 2450 -24 2470 -78 ct 2470 -78 2470 -78 2463 -81 ct p 2313 -153 m 2318 -191 2335 -209 2364 -209 ct 2394 -209 2405 -196 2412 -153 ct 2412 -153 2412 -153 2313 -153 ct p ef 2683 -81 m 2659 -43 2638 -29 2607 -29 ct 2580 -29 2559 -43 2545 -72 ct 2536 -90 2533 -107 2532 -137 ct 2532 -137 2532 -137 2681 -137 ct 2677 -169 2672 -183 2660 -199 ct 2646 -217 2623 -227 2598 -227 ct 2574 -227 2551 -218 2533 -201 ct 2510 -181 2497 -146 2497 -106 ct 2497 -37 2532 5 2588 5 ct 2634 5 2670 -24 2690 -78 ct 2690 -78 2690 -78 2683 -81 ct p 2533 -153 m 2538 -191 2555 -209 2584 -209 ct 2614 -209 2625 -196 2632 -153 ct 2632 -153 2632 -153 2533 -153 ct p ef 2898 -77 m 2874 -42 2857 -31 2829 -31 ct 2785 -31 2754 -70 2754 -127 ct 2754 -178 2781 -213 2820 -213 ct 2838 -213 2844 -207 2849 -189 ct 2849 -189 2849 -189 2852 -178 ct 2856 -164 2864 -155 2874 -155 ct 2887 -155 2898 -164 2898 -176 ct 2898 -204 2864 -227 2823 -227 ct 2799 -227 2775 -217 2755 -199 ct 2731 -178 2717 -144 2717 -105 ct 2717 -41 2755 5 2809 5 ct 2831 5 2850 -3 2868 -18 ct 2881 -30 2890 -43 2904 -72 ct 2904 -72 2904 -72 2898 -77 ct p ef 3001 -169 m 3021 -192 3036 -200 3055 -200 ct 3079 -200 3091 -182 3091 -148 ct 3091 -148 3091 -148 3091 -50 ct 3091 -16 3086 -10 3058 -7 ct 3058 -7 3058 -7 3058 0 ct 3058 0 3058 0 3161 0 ct 3161 0 3161 0 3161 -7 ct 3135 -12 3132 -16 3132 -50 ct 3132 -50 3132 -50 3132 -148 ct 3132 -200 3111 -227 3072 -227 ct 3044 -227 3023 -215 3001 -185 ct 3001 -185 3001 -185 3001 -336 ct 3001 -336 3001 -336 2999 -337 ct 2982 -331 2970 -327 2943 -319 ct 2943 -319 2943 -319 2930 -315 ct 2930 -315 2930 -315 2930 -308 ct 2932 -308 2933 -308 2936 -308 ct 2956 -308 2960 -304 2960 -283 ct 2960 -283 2960 -283 2960 -50 ct 2960 -15 2957 -11 2929 -7 ct 2929 -7 2929 -7 2929 0 ct 2929 0 2929 0 3034 0 ct 3034 0 3034 0 3034 -7 ct 3006 -10 3001 -16 3001 -50 ct 3001 -50 3001 -50 3001 -169 ct p ef pom gr gs pum 15519 16745 t 214 -32 m 206 -26 200 -23 193 -23 ct 182 -23 178 -30 178 -52 ct 178 -52 178 -52 178 -148 ct 178 -173 176 -188 168 -200 ct 158 -218 137 -227 108 -227 ct 63 -227 27 -203 27 -171 ct 27 -160 37 -150 48 -150 ct 60 -150 70 -160 70 -171 ct 70 -173 69 -175 69 -179 ct 68 -183 67 -187 67 -191 ct 67 -204 83 -215 102 -215 ct 126 -215 139 -201 139 -174 ct 139 -174 139 -174 139 -144 ct 64 -113 56 -109 35 -90 ct 25 -81 18 -64 18 -48 ct 18 -17 39 5 69 5 ct 90 5 110 -5 139 -31 ct 142 -5 151 5 170 5 ct 187 5 197 -1 214 -20 ct 214 -20 214 -20 214 -32 ct p 139 -61 m 139 -45 137 -41 126 -35 ct 115 -28 101 -24 91 -24 ct 74 -24 61 -40 61 -62 ct 61 -62 61 -62 61 -63 ct 61 -92 80 -110 139 -132 ct 139 -132 139 -132 139 -61 ct p ef 228 -196 m 231 -198 235 -198 241 -198 ct 254 -198 259 -191 259 -166 ct 259 -166 259 -166 259 -44 ct 259 -15 253 -8 229 -8 ct 229 -8 229 -8 229 0 ct 229 0 229 0 331 0 ct 331 0 331 0 331 -8 ct 307 -8 299 -14 299 -32 ct 299 -32 299 -32 299 -171 ct 323 -194 333 -200 349 -200 ct 373 -200 385 -184 385 -152 ct 385 -152 385 -152 385 -48 ct 385 -17 378 -8 354 -8 ct 354 -8 354 -8 354 0 ct 354 0 354 0 455 0 ct 455 0 455 0 455 -7 ct 431 -10 425 -16 425 -40 ct 425 -40 425 -40 425 -153 ct 425 -199 404 -227 368 -227 ct 346 -227 331 -219 298 -187 ct 298 -187 298 -187 298 -226 ct 298 -226 298 -226 295 -227 ct 271 -218 254 -213 228 -205 ct 228 -205 228 -205 228 -196 ct p ef 637 5 m 637 5 637 5 708 -21 ct 708 -21 708 -21 708 -28 ct 699 -28 698 -28 697 -28 ct 679 -28 675 -33 675 -56 ct 675 -56 675 -56 675 -336 ct 675 -336 675 -336 673 -337 ct 650 -329 633 -324 602 -315 ct 602 -315 602 -315 602 -308 ct 606 -308 608 -308 612 -308 ct 630 -308 635 -303 635 -283 ct 635 -283 635 -283 635 -206 ct 616 -222 603 -227 584 -227 ct 528 -227 483 -171 483 -101 ct 483 -38 519 5 573 5 ct 600 5 618 -5 635 -28 ct 635 -28 635 -28 635 4 ct 635 4 635 4 637 5 ct p 635 -50 m 635 -47 631 -41 626 -35 ct 618 -26 606 -21 592 -21 ct 551 -21 525 -60 525 -121 ct 525 -177 548 -213 585 -213 ct 611 -213 635 -190 635 -164 ct 635 -164 635 -164 635 -50 ct p ef 850 -196 m 853 -198 857 -198 863 -198 ct 876 -198 881 -191 881 -166 ct 881 -166 881 -166 881 -44 ct 881 -15 875 -8 851 -8 ct 851 -8 851 -8 851 0 ct 851 0 851 0 953 0 ct 953 0 953 0 953 -8 ct 929 -8 921 -14 921 -32 ct 921 -32 921 -32 921 -171 ct 945 -194 955 -200 971 -200 ct 995 -200 1007 -184 1007 -152 ct 1007 -152 1007 -152 1007 -48 ct 1007 -17 1000 -8 976 -8 ct 976 -8 976 -8 976 0 ct 976 0 976 0 1077 0 ct 1077 0 1077 0 1077 -7 ct 1053 -10 1047 -16 1047 -40 ct 1047 -40 1047 -40 1047 -153 ct 1047 -199 1026 -227 990 -227 ct 968 -227 953 -219 920 -187 ct 920 -187 920 -187 920 -226 ct 920 -226 920 -226 917 -227 ct 893 -218 876 -213 850 -205 ct 850 -205 850 -205 850 -196 ct p ef 1213 -227 m 1150 -227 1106 -180 1106 -112 ct 1106 -45 1151 5 1212 5 ct 1273 5 1320 -47 1320 -115 ct 1320 -180 1275 -227 1213 -227 ct p 1207 -213 m 1247 -213 1276 -166 1276 -98 ct 1276 -42 1254 -9 1218 -9 ct 1199 -9 1181 -21 1171 -40 ct 1157 -66 1150 -101 1150 -136 ct 1150 -183 1172 -213 1207 -213 ct p ef 1427 -227 m 1427 -227 1427 -227 1352 -200 ct 1352 -200 1352 -200 1352 -192 ct 1352 -192 1352 -192 1356 -193 ct 1361 -194 1368 -194 1372 -194 ct 1384 -194 1388 -186 1388 -164 ct 1388 -164 1388 -164 1388 -49 ct 1388 -14 1383 -8 1350 -8 ct 1350 -8 1350 -8 1350 0 ct 1350 0 1350 0 1464 0 ct 1464 0 1464 0 1464 -8 ct 1433 -8 1429 -15 1429 -50 ct 1429 -50 1429 -50 1429 -225 ct 1429 -225 1429 -225 1427 -227 ct p 1404 -337 m 1391 -337 1380 -326 1380 -312 ct 1380 -298 1390 -287 1404 -287 ct 1418 -287 1429 -298 1429 -312 ct 1429 -326 1418 -337 1404 -337 ct p ef 1635 -155 m 1635 -155 1635 -155 1633 -222 ct 1633 -222 1633 -222 1627 -222 ct 1627 -222 1627 -222 1626 -221 ct 1622 -218 1621 -217 1619 -217 ct 1617 -217 1612 -218 1606 -221 ct 1596 -225 1585 -227 1573 -227 ct 1534 -227 1507 -202 1507 -166 ct 1507 -138 1522 -118 1563 -95 ct 1563 -95 1563 -95 1591 -78 ct 1608 -69 1617 -57 1617 -41 ct 1617 -20 1601 -6 1576 -6 ct 1560 -6 1545 -12 1536 -23 ct 1526 -35 1521 -47 1515 -75 ct 1515 -75 1515 -75 1507 -75 ct 1507 -75 1507 -75 1507 2 ct 1507 2 1507 2 1513 2 ct 1517 -3 1519 -4 1525 -4 ct 1529 -4 1536 -3 1547 0 ct 1560 3 1574 5 1582 5 ct 1619 5 1650 -24 1650 -58 ct 1650 -83 1639 -99 1610 -117 ct 1610 -117 1610 -117 1558 -148 ct 1544 -156 1537 -169 1537 -182 ct 1537 -202 1552 -216 1574 -216 ct 1602 -216 1616 -199 1627 -155 ct 1627 -155 1627 -155 1635 -155 ct p ef 1874 -81 m 1850 -43 1829 -29 1798 -29 ct 1771 -29 1750 -43 1736 -72 ct 1727 -90 1724 -107 1723 -137 ct 1723 -137 1723 -137 1872 -137 ct 1868 -169 1863 -183 1851 -199 ct 1837 -217 1814 -227 1789 -227 ct 1765 -227 1742 -218 1724 -201 ct 1701 -181 1688 -146 1688 -106 ct 1688 -37 1723 5 1779 5 ct 1825 5 1861 -24 1881 -78 ct 1881 -78 1881 -78 1874 -81 ct p 1724 -153 m 1729 -191 1746 -209 1775 -209 ct 1805 -209 1816 -196 1823 -153 ct 1823 -153 1823 -153 1724 -153 ct p ef pom gr gr gs gs pum 5435 10350 t 150 -222 m 150 -222 150 -222 90 -222 ct 90 -222 90 -222 90 -279 ct 90 -308 99 -323 118 -323 ct 128 -323 135 -318 143 -304 ct 151 -291 157 -286 165 -286 ct 176 -286 185 -295 185 -306 ct 185 -324 164 -337 135 -337 ct 105 -337 79 -324 67 -301 ct 54 -279 50 -261 50 -222 ct 50 -222 50 -222 10 -222 ct 10 -222 10 -222 10 -206 ct 10 -206 10 -206 50 -206 ct 50 -206 50 -206 50 -51 ct 50 -14 45 -8 10 -8 ct 10 -8 10 -8 10 0 ct 10 0 10 0 136 0 ct 136 0 136 0 136 -8 ct 96 -8 91 -13 91 -51 ct 91 -51 91 -51 91 -206 ct 91 -206 91 -206 150 -206 ct 150 -206 150 -206 150 -222 ct p ef 375 -32 m 367 -26 361 -23 354 -23 ct 343 -23 339 -30 339 -52 ct 339 -52 339 -52 339 -148 ct 339 -173 337 -188 329 -200 ct 319 -218 298 -227 269 -227 ct 224 -227 188 -203 188 -171 ct 188 -160 198 -150 209 -150 ct 221 -150 231 -160 231 -171 ct 231 -173 230 -175 230 -179 ct 229 -183 228 -187 228 -191 ct 228 -204 244 -215 263 -215 ct 287 -215 300 -201 300 -174 ct 300 -174 300 -174 300 -144 ct 225 -113 217 -109 196 -90 ct 186 -81 179 -64 179 -48 ct 179 -17 200 5 230 5 ct 251 5 271 -5 300 -31 ct 303 -5 312 5 331 5 ct 348 5 358 -1 375 -20 ct 375 -20 375 -20 375 -32 ct p 300 -61 m 300 -45 298 -41 287 -35 ct 276 -28 262 -24 252 -24 ct 235 -24 222 -40 222 -62 ct 222 -62 222 -62 222 -63 ct 222 -92 241 -110 300 -132 ct 300 -132 300 -132 300 -61 ct p ef 384 -192 m 391 -194 396 -194 401 -194 ct 413 -194 418 -186 418 -164 ct 418 -164 418 -164 418 -41 ct 418 -17 414 -13 383 -7 ct 383 -7 383 -7 383 0 ct 383 0 383 0 500 0 ct 500 0 500 0 500 -8 ct 467 -8 458 -15 458 -44 ct 458 -44 458 -44 458 -155 ct 458 -171 479 -196 492 -196 ct 495 -196 500 -193 505 -188 ct 513 -182 518 -179 524 -179 ct 536 -179 543 -187 543 -201 ct 543 -217 533 -227 517 -227 ct 496 -227 482 -216 458 -181 ct 458 -181 458 -181 458 -226 ct 458 -226 458 -226 456 -227 ct 430 -216 413 -210 384 -200 ct 384 -200 384 -200 384 -192 ct p ef 867 -81 m 843 -43 822 -29 791 -29 ct 764 -29 743 -43 729 -72 ct 720 -90 717 -107 716 -137 ct 716 -137 716 -137 865 -137 ct 861 -169 856 -183 844 -199 ct 830 -217 807 -227 782 -227 ct 758 -227 735 -218 717 -201 ct 694 -181 681 -146 681 -106 ct 681 -37 716 5 772 5 ct 818 5 854 -24 874 -78 ct 874 -78 874 -78 867 -81 ct p 717 -153 m 722 -191 739 -209 768 -209 ct 798 -209 809 -196 816 -153 ct 816 -153 816 -153 717 -153 ct p ef 897 -196 m 900 -198 904 -198 910 -198 ct 923 -198 928 -191 928 -166 ct 928 -166 928 -166 928 -44 ct 928 -15 922 -8 898 -8 ct 898 -8 898 -8 898 0 ct 898 0 898 0 1000 0 ct 1000 0 1000 0 1000 -8 ct 976 -8 968 -14 968 -32 ct 968 -32 968 -32 968 -171 ct 992 -194 1002 -200 1018 -200 ct 1042 -200 1054 -184 1054 -152 ct 1054 -152 1054 -152 1054 -48 ct 1054 -17 1047 -8 1023 -8 ct 1023 -8 1023 -8 1023 0 ct 1023 0 1023 0 1124 0 ct 1124 0 1124 0 1124 -7 ct 1100 -10 1094 -16 1094 -40 ct 1094 -40 1094 -40 1094 -153 ct 1094 -199 1073 -227 1037 -227 ct 1015 -227 1000 -219 967 -187 ct 967 -187 967 -187 967 -226 ct 967 -226 967 -226 964 -227 ct 940 -218 923 -213 897 -205 ct 897 -205 897 -205 897 -196 ct p ef 1306 5 m 1306 5 1306 5 1377 -21 ct 1377 -21 1377 -21 1377 -28 ct 1368 -28 1367 -28 1366 -28 ct 1348 -28 1344 -33 1344 -56 ct 1344 -56 1344 -56 1344 -336 ct 1344 -336 1344 -336 1342 -337 ct 1319 -329 1302 -324 1271 -315 ct 1271 -315 1271 -315 1271 -308 ct 1275 -308 1277 -308 1281 -308 ct 1299 -308 1304 -303 1304 -283 ct 1304 -283 1304 -283 1304 -206 ct 1285 -222 1272 -227 1253 -227 ct 1197 -227 1152 -171 1152 -101 ct 1152 -38 1188 5 1242 5 ct 1269 5 1287 -5 1304 -28 ct 1304 -28 1304 -28 1304 4 ct 1304 4 1304 4 1306 5 ct p 1304 -50 m 1304 -47 1300 -41 1295 -35 ct 1287 -26 1275 -21 1261 -21 ct 1220 -21 1194 -60 1194 -121 ct 1194 -177 1217 -213 1254 -213 ct 1280 -213 1304 -190 1304 -164 ct 1304 -164 1304 -164 1304 -50 ct p ef 1664 -155 m 1664 -155 1664 -155 1662 -222 ct 1662 -222 1662 -222 1656 -222 ct 1656 -222 1656 -222 1655 -221 ct 1651 -218 1650 -217 1648 -217 ct 1646 -217 1641 -218 1635 -221 ct 1625 -225 1614 -227 1602 -227 ct 1563 -227 1536 -202 1536 -166 ct 1536 -138 1551 -118 1592 -95 ct 1592 -95 1592 -95 1620 -78 ct 1637 -69 1646 -57 1646 -41 ct 1646 -20 1630 -6 1605 -6 ct 1589 -6 1574 -12 1565 -23 ct 1555 -35 1550 -47 1544 -75 ct 1544 -75 1544 -75 1536 -75 ct 1536 -75 1536 -75 1536 2 ct 1536 2 1536 2 1542 2 ct 1546 -3 1548 -4 1554 -4 ct 1558 -4 1565 -3 1576 0 ct 1589 3 1603 5 1611 5 ct 1648 5 1679 -24 1679 -58 ct 1679 -83 1668 -99 1639 -117 ct 1639 -117 1639 -117 1587 -148 ct 1573 -156 1566 -169 1566 -182 ct 1566 -202 1581 -216 1603 -216 ct 1631 -216 1645 -199 1656 -155 ct 1656 -155 1656 -155 1664 -155 ct p ef 1710 -195 m 1715 -195 1718 -195 1722 -195 ct 1739 -195 1742 -190 1742 -167 ct 1742 -167 1742 -167 1742 65 ct 1742 90 1737 96 1708 99 ct 1708 99 1708 99 1708 107 ct 1708 107 1708 107 1826 107 ct 1826 107 1826 107 1826 98 ct 1789 98 1783 93 1783 61 ct 1783 61 1783 61 1783 -16 ct 1800 0 1812 5 1832 5 ct 1889 5 1934 -50 1934 -122 ct 1934 -183 1900 -227 1853 -227 ct 1826 -227 1804 -215 1783 -189 ct 1783 -189 1783 -189 1783 -226 ct 1783 -226 1783 -226 1780 -227 ct 1754 -217 1737 -210 1710 -202 ct 1710 -202 1710 -202 1710 -195 ct p 1783 -165 m 1783 -180 1810 -197 1832 -197 ct 1868 -197 1892 -160 1892 -103 ct 1892 -48 1868 -11 1833 -11 ct 1811 -11 1783 -29 1783 -44 ct 1783 -44 1783 -44 1783 -165 ct p ef 2154 -81 m 2130 -43 2109 -29 2078 -29 ct 2051 -29 2030 -43 2016 -72 ct 2007 -90 2004 -107 2003 -137 ct 2003 -137 2003 -137 2152 -137 ct 2148 -169 2143 -183 2131 -199 ct 2117 -217 2094 -227 2069 -227 ct 2045 -227 2022 -218 2004 -201 ct 1981 -181 1968 -146 1968 -106 ct 1968 -37 2003 5 2059 5 ct 2105 5 2141 -24 2161 -78 ct 2161 -78 2161 -78 2154 -81 ct p 2004 -153 m 2009 -191 2026 -209 2055 -209 ct 2085 -209 2096 -196 2103 -153 ct 2103 -153 2103 -153 2004 -153 ct p ef 2374 -81 m 2350 -43 2329 -29 2298 -29 ct 2271 -29 2250 -43 2236 -72 ct 2227 -90 2224 -107 2223 -137 ct 2223 -137 2223 -137 2372 -137 ct 2368 -169 2363 -183 2351 -199 ct 2337 -217 2314 -227 2289 -227 ct 2265 -227 2242 -218 2224 -201 ct 2201 -181 2188 -146 2188 -106 ct 2188 -37 2223 5 2279 5 ct 2325 5 2361 -24 2381 -78 ct 2381 -78 2381 -78 2374 -81 ct p 2224 -153 m 2229 -191 2246 -209 2275 -209 ct 2305 -209 2316 -196 2323 -153 ct 2323 -153 2323 -153 2224 -153 ct p ef 2589 -77 m 2565 -42 2548 -31 2520 -31 ct 2476 -31 2445 -70 2445 -127 ct 2445 -178 2472 -213 2511 -213 ct 2529 -213 2535 -207 2540 -189 ct 2540 -189 2540 -189 2543 -178 ct 2547 -164 2555 -155 2565 -155 ct 2578 -155 2589 -164 2589 -176 ct 2589 -204 2555 -227 2514 -227 ct 2490 -227 2466 -217 2446 -199 ct 2422 -178 2408 -144 2408 -105 ct 2408 -41 2446 5 2500 5 ct 2522 5 2541 -3 2559 -18 ct 2572 -30 2581 -43 2595 -72 ct 2595 -72 2595 -72 2589 -77 ct p ef 2692 -169 m 2712 -192 2727 -200 2746 -200 ct 2770 -200 2782 -182 2782 -148 ct 2782 -148 2782 -148 2782 -50 ct 2782 -16 2777 -10 2749 -7 ct 2749 -7 2749 -7 2749 0 ct 2749 0 2749 0 2852 0 ct 2852 0 2852 0 2852 -7 ct 2826 -12 2823 -16 2823 -50 ct 2823 -50 2823 -50 2823 -148 ct 2823 -200 2802 -227 2763 -227 ct 2735 -227 2714 -215 2692 -185 ct 2692 -185 2692 -185 2692 -336 ct 2692 -336 2692 -336 2690 -337 ct 2673 -331 2661 -327 2634 -319 ct 2634 -319 2634 -319 2621 -315 ct 2621 -315 2621 -315 2621 -308 ct 2623 -308 2624 -308 2627 -308 ct 2647 -308 2651 -304 2651 -283 ct 2651 -283 2651 -283 2651 -50 ct 2651 -15 2648 -11 2620 -7 ct 2620 -7 2620 -7 2620 0 ct 2620 0 2620 0 2725 0 ct 2725 0 2725 0 2725 -7 ct 2697 -10 2692 -16 2692 -50 ct 2692 -50 2692 -50 2692 -169 ct p ef pom gr gr gs gs pum 10779 16488 t 9 -196 m 15 -198 19 -198 25 -198 ct 37 -198 42 -190 42 -166 ct 42 -166 42 -166 42 -41 ct 42 -15 35 -7 8 -7 ct 8 -7 8 -7 8 0 ct 8 0 8 0 115 0 ct 115 0 115 0 115 -8 ct 90 -8 82 -13 82 -33 ct 82 -33 82 -33 82 -172 ct 82 -173 86 -178 90 -181 ct 102 -193 122 -201 139 -201 ct 161 -201 171 -184 171 -149 ct 171 -149 171 -149 171 -42 ct 171 -14 166 -8 138 -8 ct 138 -8 138 -8 138 0 ct 138 0 138 0 247 0 ct 247 0 247 0 247 -7 ct 219 -7 212 -16 212 -46 ct 212 -46 212 -46 212 -171 ct 227 -192 243 -201 265 -201 ct 292 -201 301 -188 301 -147 ct 301 -147 301 -147 301 -43 ct 301 -15 297 -11 269 -7 ct 269 -7 269 -7 269 0 ct 269 0 269 0 375 0 ct 375 0 375 0 375 -8 ct 375 -8 375 -8 363 -8 ct 348 -8 342 -18 342 -37 ct 342 -37 342 -37 342 -139 ct 342 -197 323 -227 286 -227 ct 258 -227 233 -214 207 -185 ct 198 -214 182 -227 155 -227 ct 134 -227 121 -220 80 -189 ct 80 -189 80 -189 80 -226 ct 80 -226 80 -226 77 -227 ct 52 -218 36 -212 9 -205 ct 9 -205 9 -205 9 -196 ct p ef 470 -227 m 470 -227 470 -227 395 -200 ct 395 -200 395 -200 395 -192 ct 395 -192 395 -192 399 -193 ct 404 -194 411 -194 415 -194 ct 427 -194 431 -186 431 -164 ct 431 -164 431 -164 431 -49 ct 431 -14 426 -8 393 -8 ct 393 -8 393 -8 393 0 ct 393 0 393 0 507 0 ct 507 0 507 0 507 -8 ct 476 -8 472 -15 472 -50 ct 472 -50 472 -50 472 -225 ct 472 -225 472 -225 470 -227 ct p 447 -337 m 434 -337 423 -326 423 -312 ct 423 -298 433 -287 447 -287 ct 461 -287 472 -298 472 -312 ct 472 -326 461 -337 447 -337 ct p ef 718 -77 m 694 -42 677 -31 649 -31 ct 605 -31 574 -70 574 -127 ct 574 -178 601 -213 640 -213 ct 658 -213 664 -207 669 -189 ct 669 -189 669 -189 672 -178 ct 676 -164 684 -155 694 -155 ct 707 -155 718 -164 718 -176 ct 718 -204 684 -227 643 -227 ct 619 -227 595 -217 575 -199 ct 551 -178 537 -144 537 -105 ct 537 -41 575 5 629 5 ct 651 5 670 -3 688 -18 ct 701 -30 710 -43 724 -72 ct 724 -72 724 -72 718 -77 ct p ef 748 -192 m 755 -194 760 -194 765 -194 ct 777 -194 782 -186 782 -164 ct 782 -164 782 -164 782 -41 ct 782 -17 778 -13 747 -7 ct 747 -7 747 -7 747 0 ct 747 0 747 0 864 0 ct 864 0 864 0 864 -8 ct 831 -8 822 -15 822 -44 ct 822 -44 822 -44 822 -155 ct 822 -171 843 -196 856 -196 ct 859 -196 864 -193 869 -188 ct 877 -182 882 -179 888 -179 ct 900 -179 907 -187 907 -201 ct 907 -217 897 -227 881 -227 ct 860 -227 846 -216 822 -181 ct 822 -181 822 -181 822 -226 ct 822 -226 822 -226 820 -227 ct 794 -216 777 -210 748 -200 ct 748 -200 748 -200 748 -192 ct p ef 1031 -227 m 968 -227 924 -180 924 -112 ct 924 -45 969 5 1030 5 ct 1091 5 1138 -47 1138 -115 ct 1138 -180 1093 -227 1031 -227 ct p 1025 -213 m 1065 -213 1094 -166 1094 -98 ct 1094 -42 1072 -9 1036 -9 ct 1017 -9 999 -21 989 -40 ct 975 -66 968 -101 968 -136 ct 968 -183 990 -213 1025 -213 ct p ef 1164 -195 m 1169 -195 1172 -195 1176 -195 ct 1193 -195 1196 -190 1196 -167 ct 1196 -167 1196 -167 1196 65 ct 1196 90 1191 96 1162 99 ct 1162 99 1162 99 1162 107 ct 1162 107 1162 107 1280 107 ct 1280 107 1280 107 1280 98 ct 1243 98 1237 93 1237 61 ct 1237 61 1237 61 1237 -16 ct 1254 0 1266 5 1286 5 ct 1343 5 1388 -50 1388 -122 ct 1388 -183 1354 -227 1307 -227 ct 1280 -227 1258 -215 1237 -189 ct 1237 -189 1237 -189 1237 -226 ct 1237 -226 1237 -226 1234 -227 ct 1208 -217 1191 -210 1164 -202 ct 1164 -202 1164 -202 1164 -195 ct p 1237 -165 m 1237 -180 1264 -197 1286 -197 ct 1322 -197 1346 -160 1346 -103 ct 1346 -48 1322 -11 1287 -11 ct 1265 -11 1237 -29 1237 -44 ct 1237 -44 1237 -44 1237 -165 ct p ef 1486 -169 m 1506 -192 1521 -200 1540 -200 ct 1564 -200 1576 -182 1576 -148 ct 1576 -148 1576 -148 1576 -50 ct 1576 -16 1571 -10 1543 -7 ct 1543 -7 1543 -7 1543 0 ct 1543 0 1543 0 1646 0 ct 1646 0 1646 0 1646 -7 ct 1620 -12 1617 -16 1617 -50 ct 1617 -50 1617 -50 1617 -148 ct 1617 -200 1596 -227 1557 -227 ct 1529 -227 1508 -215 1486 -185 ct 1486 -185 1486 -185 1486 -336 ct 1486 -336 1486 -336 1484 -337 ct 1467 -331 1455 -327 1428 -319 ct 1428 -319 1428 -319 1415 -315 ct 1415 -315 1415 -315 1415 -308 ct 1417 -308 1418 -308 1421 -308 ct 1441 -308 1445 -304 1445 -283 ct 1445 -283 1445 -283 1445 -50 ct 1445 -15 1442 -11 1414 -7 ct 1414 -7 1414 -7 1414 0 ct 1414 0 1414 0 1519 0 ct 1519 0 1519 0 1519 -7 ct 1491 -10 1486 -16 1486 -50 ct 1486 -50 1486 -50 1486 -169 ct p ef 1780 -227 m 1717 -227 1673 -180 1673 -112 ct 1673 -45 1718 5 1779 5 ct 1840 5 1887 -47 1887 -115 ct 1887 -180 1842 -227 1780 -227 ct p 1774 -213 m 1814 -213 1843 -166 1843 -98 ct 1843 -42 1821 -9 1785 -9 ct 1766 -9 1748 -21 1738 -40 ct 1724 -66 1717 -101 1717 -136 ct 1717 -183 1739 -213 1774 -213 ct p ef 1917 -196 m 1920 -198 1924 -198 1930 -198 ct 1943 -198 1948 -191 1948 -166 ct 1948 -166 1948 -166 1948 -44 ct 1948 -15 1942 -8 1918 -8 ct 1918 -8 1918 -8 1918 0 ct 1918 0 1918 0 2020 0 ct 2020 0 2020 0 2020 -8 ct 1996 -8 1988 -14 1988 -32 ct 1988 -32 1988 -32 1988 -171 ct 2012 -194 2022 -200 2038 -200 ct 2062 -200 2074 -184 2074 -152 ct 2074 -152 2074 -152 2074 -48 ct 2074 -17 2067 -8 2043 -8 ct 2043 -8 2043 -8 2043 0 ct 2043 0 2043 0 2144 0 ct 2144 0 2144 0 2144 -7 ct 2120 -10 2114 -16 2114 -40 ct 2114 -40 2114 -40 2114 -153 ct 2114 -199 2093 -227 2057 -227 ct 2035 -227 2020 -219 1987 -187 ct 1987 -187 1987 -187 1987 -226 ct 1987 -226 1987 -226 1984 -227 ct 1960 -218 1943 -213 1917 -205 ct 1917 -205 1917 -205 1917 -196 ct p ef 2357 -81 m 2333 -43 2312 -29 2281 -29 ct 2254 -29 2233 -43 2219 -72 ct 2210 -90 2207 -107 2206 -137 ct 2206 -137 2206 -137 2355 -137 ct 2351 -169 2346 -183 2334 -199 ct 2320 -217 2297 -227 2272 -227 ct 2248 -227 2225 -218 2207 -201 ct 2184 -181 2171 -146 2171 -106 ct 2171 -37 2206 5 2262 5 ct 2308 5 2344 -24 2364 -78 ct 2364 -78 2364 -78 2357 -81 ct p 2207 -153 m 2212 -191 2229 -209 2258 -209 ct 2288 -209 2299 -196 2306 -153 ct 2306 -153 2306 -153 2207 -153 ct p ef pom gr gr gs gs pum 15356 12996 t 3 -192 m 10 -194 15 -194 20 -194 ct 32 -194 37 -186 37 -164 ct 37 -164 37 -164 37 -41 ct 37 -17 33 -13 2 -7 ct 2 -7 2 -7 2 0 ct 2 0 2 0 119 0 ct 119 0 119 0 119 -8 ct 86 -8 77 -15 77 -44 ct 77 -44 77 -44 77 -155 ct 77 -171 98 -196 111 -196 ct 114 -196 119 -193 124 -188 ct 132 -182 137 -179 143 -179 ct 155 -179 162 -187 162 -201 ct 162 -217 152 -227 136 -227 ct 115 -227 101 -216 77 -181 ct 77 -181 77 -181 77 -226 ct 77 -226 77 -226 75 -227 ct 49 -216 32 -210 3 -200 ct 3 -200 3 -200 3 -192 ct p ef 363 -81 m 339 -43 318 -29 287 -29 ct 260 -29 239 -43 225 -72 ct 216 -90 213 -107 212 -137 ct 212 -137 212 -137 361 -137 ct 357 -169 352 -183 340 -199 ct 326 -217 303 -227 278 -227 ct 254 -227 231 -218 213 -201 ct 190 -181 177 -146 177 -106 ct 177 -37 212 5 268 5 ct 314 5 350 -24 370 -78 ct 370 -78 370 -78 363 -81 ct p 213 -153 m 218 -191 235 -209 264 -209 ct 294 -209 305 -196 312 -153 ct 312 -153 312 -153 213 -153 ct p ef 616 -222 m 616 -222 616 -222 549 -222 ct 549 -222 549 -222 549 -215 ct 564 -213 571 -208 571 -199 ct 571 -194 570 -189 568 -184 ct 568 -184 568 -184 521 -56 ct 521 -56 521 -56 471 -182 ct 468 -189 467 -196 467 -201 ct 467 -210 472 -213 489 -215 ct 489 -215 489 -215 489 -222 ct 489 -222 489 -222 394 -222 ct 394 -222 394 -222 394 -214 ct 413 -214 416 -209 438 -158 ct 438 -158 438 -158 496 -16 ct 497 -13 499 -10 500 -6 ct 503 3 506 7 509 7 ct 512 7 515 1 522 -18 ct 522 -18 522 -18 584 -176 ct 599 -210 601 -213 616 -215 ct 616 -215 616 -215 616 -222 ct p ef 829 -81 m 805 -43 784 -29 753 -29 ct 726 -29 705 -43 691 -72 ct 682 -90 679 -107 678 -137 ct 678 -137 678 -137 827 -137 ct 823 -169 818 -183 806 -199 ct 792 -217 769 -227 744 -227 ct 720 -227 697 -218 679 -201 ct 656 -181 643 -146 643 -106 ct 643 -37 678 5 734 5 ct 780 5 816 -24 836 -78 ct 836 -78 836 -78 829 -81 ct p 679 -153 m 684 -191 701 -209 730 -209 ct 760 -209 771 -196 778 -153 ct 778 -153 778 -153 679 -153 ct p ef 854 -192 m 861 -194 866 -194 871 -194 ct 883 -194 888 -186 888 -164 ct 888 -164 888 -164 888 -41 ct 888 -17 884 -13 853 -7 ct 853 -7 853 -7 853 0 ct 853 0 853 0 970 0 ct 970 0 970 0 970 -8 ct 937 -8 928 -15 928 -44 ct 928 -44 928 -44 928 -155 ct 928 -171 949 -196 962 -196 ct 965 -196 970 -193 975 -188 ct 983 -182 988 -179 994 -179 ct 1006 -179 1013 -187 1013 -201 ct 1013 -217 1003 -227 987 -227 ct 966 -227 952 -216 928 -181 ct 928 -181 928 -181 928 -226 ct 928 -226 928 -226 926 -227 ct 900 -216 883 -210 854 -200 ct 854 -200 854 -200 854 -192 ct p ef 1090 -336 m 1090 -336 1090 -336 1088 -337 ct 1067 -330 1054 -326 1031 -319 ct 1031 -319 1031 -319 1017 -315 ct 1017 -315 1017 -315 1017 -308 ct 1020 -308 1022 -308 1026 -308 ct 1045 -308 1049 -304 1049 -283 ct 1049 -283 1049 -283 1049 -27 ct 1049 -11 1091 5 1129 5 ct 1193 5 1243 -49 1243 -120 ct 1243 -181 1206 -227 1157 -227 ct 1128 -227 1100 -209 1090 -185 ct 1090 -185 1090 -185 1090 -336 ct p 1090 -159 m 1090 -178 1113 -196 1138 -196 ct 1176 -196 1200 -157 1200 -97 ct 1200 -42 1177 -11 1137 -11 ct 1112 -11 1090 -22 1090 -35 ct 1090 -35 1090 -35 1090 -159 ct p ef 1464 -81 m 1440 -43 1419 -29 1388 -29 ct 1361 -29 1340 -43 1326 -72 ct 1317 -90 1314 -107 1313 -137 ct 1313 -137 1313 -137 1462 -137 ct 1458 -169 1453 -183 1441 -199 ct 1427 -217 1404 -227 1379 -227 ct 1355 -227 1332 -218 1314 -201 ct 1291 -181 1278 -146 1278 -106 ct 1278 -37 1313 5 1369 5 ct 1415 5 1451 -24 1471 -78 ct 1471 -78 1471 -78 1464 -81 ct p 1314 -153 m 1319 -191 1336 -209 1365 -209 ct 1395 -209 1406 -196 1413 -153 ct 1413 -153 1413 -153 1314 -153 ct p ef 1489 -192 m 1496 -194 1501 -194 1506 -194 ct 1518 -194 1523 -186 1523 -164 ct 1523 -164 1523 -164 1523 -41 ct 1523 -17 1519 -13 1488 -7 ct 1488 -7 1488 -7 1488 0 ct 1488 0 1488 0 1605 0 ct 1605 0 1605 0 1605 -8 ct 1572 -8 1563 -15 1563 -44 ct 1563 -44 1563 -44 1563 -155 ct 1563 -171 1584 -196 1597 -196 ct 1600 -196 1605 -193 1610 -188 ct 1618 -182 1623 -179 1629 -179 ct 1641 -179 1648 -187 1648 -201 ct 1648 -217 1638 -227 1622 -227 ct 1601 -227 1587 -216 1563 -181 ct 1563 -181 1563 -181 1563 -226 ct 1563 -226 1563 -226 1561 -227 ct 1535 -216 1518 -210 1489 -200 ct 1489 -200 1489 -200 1489 -192 ct p ef 1865 -32 m 1857 -26 1851 -23 1844 -23 ct 1833 -23 1829 -30 1829 -52 ct 1829 -52 1829 -52 1829 -148 ct 1829 -173 1827 -188 1819 -200 ct 1809 -218 1788 -227 1759 -227 ct 1714 -227 1678 -203 1678 -171 ct 1678 -160 1688 -150 1699 -150 ct 1711 -150 1721 -160 1721 -171 ct 1721 -173 1720 -175 1720 -179 ct 1719 -183 1718 -187 1718 -191 ct 1718 -204 1734 -215 1753 -215 ct 1777 -215 1790 -201 1790 -174 ct 1790 -174 1790 -174 1790 -144 ct 1715 -113 1707 -109 1686 -90 ct 1676 -81 1669 -64 1669 -48 ct 1669 -17 1690 5 1720 5 ct 1741 5 1761 -5 1790 -31 ct 1793 -5 1802 5 1821 5 ct 1838 5 1848 -1 1865 -20 ct 1865 -20 1865 -20 1865 -32 ct p 1790 -61 m 1790 -45 1788 -41 1777 -35 ct 1766 -28 1752 -24 1742 -24 ct 1725 -24 1712 -40 1712 -62 ct 1712 -62 1712 -62 1712 -63 ct 1712 -92 1731 -110 1790 -132 ct 1790 -132 1790 -132 1790 -61 ct p ef 1994 -222 m 1994 -222 1994 -222 1946 -222 ct 1946 -222 1946 -222 1946 -279 ct 1946 -284 1945 -286 1942 -286 ct 1939 -281 1936 -277 1932 -272 ct 1914 -245 1893 -221 1886 -219 ct 1880 -216 1877 -212 1877 -210 ct 1877 -208 1878 -207 1879 -206 ct 1879 -206 1879 -206 1905 -206 ct 1905 -206 1905 -206 1905 -58 ct 1905 -16 1919 5 1948 5 ct 1972 5 1990 -7 2006 -33 ct 2006 -33 2006 -33 2000 -38 ct 1990 -26 1981 -21 1971 -21 ct 1953 -21 1946 -34 1946 -65 ct 1946 -65 1946 -65 1946 -206 ct 1946 -206 1946 -206 1994 -206 ct 1994 -206 1994 -206 1994 -222 ct p ef 2096 -227 m 2096 -227 2096 -227 2021 -200 ct 2021 -200 2021 -200 2021 -192 ct 2021 -192 2021 -192 2025 -193 ct 2030 -194 2037 -194 2041 -194 ct 2053 -194 2057 -186 2057 -164 ct 2057 -164 2057 -164 2057 -49 ct 2057 -14 2052 -8 2019 -8 ct 2019 -8 2019 -8 2019 0 ct 2019 0 2019 0 2133 0 ct 2133 0 2133 0 2133 -8 ct 2102 -8 2098 -15 2098 -50 ct 2098 -50 2098 -50 2098 -225 ct 2098 -225 2098 -225 2096 -227 ct p 2073 -337 m 2060 -337 2049 -326 2049 -312 ct 2049 -298 2059 -287 2073 -287 ct 2087 -287 2098 -298 2098 -312 ct 2098 -326 2087 -337 2073 -337 ct p ef 2272 -227 m 2209 -227 2165 -180 2165 -112 ct 2165 -45 2210 5 2271 5 ct 2332 5 2379 -47 2379 -115 ct 2379 -180 2334 -227 2272 -227 ct p 2266 -213 m 2306 -213 2335 -166 2335 -98 ct 2335 -42 2313 -9 2277 -9 ct 2258 -9 2240 -21 2230 -40 ct 2216 -66 2209 -101 2209 -136 ct 2209 -183 2231 -213 2266 -213 ct p ef 2408 -196 m 2411 -198 2415 -198 2421 -198 ct 2434 -198 2439 -191 2439 -166 ct 2439 -166 2439 -166 2439 -44 ct 2439 -15 2433 -8 2409 -8 ct 2409 -8 2409 -8 2409 0 ct 2409 0 2409 0 2511 0 ct 2511 0 2511 0 2511 -8 ct 2487 -8 2479 -14 2479 -32 ct 2479 -32 2479 -32 2479 -171 ct 2503 -194 2513 -200 2529 -200 ct 2553 -200 2565 -184 2565 -152 ct 2565 -152 2565 -152 2565 -48 ct 2565 -17 2558 -8 2534 -8 ct 2534 -8 2534 -8 2534 0 ct 2534 0 2534 0 2635 0 ct 2635 0 2635 0 2635 -7 ct 2611 -10 2605 -16 2605 -40 ct 2605 -40 2605 -40 2605 -153 ct 2605 -199 2584 -227 2548 -227 ct 2526 -227 2511 -219 2478 -187 ct 2478 -187 2478 -187 2478 -226 ct 2478 -226 2478 -226 2475 -227 ct 2451 -218 2434 -213 2408 -205 ct 2408 -205 2408 -205 2408 -196 ct p ef pom gr gr gs gs pum 4561 12996 t 214 -32 m 206 -26 200 -23 193 -23 ct 182 -23 178 -30 178 -52 ct 178 -52 178 -52 178 -148 ct 178 -173 176 -188 168 -200 ct 158 -218 137 -227 108 -227 ct 63 -227 27 -203 27 -171 ct 27 -160 37 -150 48 -150 ct 60 -150 70 -160 70 -171 ct 70 -173 69 -175 69 -179 ct 68 -183 67 -187 67 -191 ct 67 -204 83 -215 102 -215 ct 126 -215 139 -201 139 -174 ct 139 -174 139 -174 139 -144 ct 64 -113 56 -109 35 -90 ct 25 -81 18 -64 18 -48 ct 18 -17 39 5 69 5 ct 90 5 110 -5 139 -31 ct 142 -5 151 5 170 5 ct 187 5 197 -1 214 -20 ct 214 -20 214 -20 214 -32 ct p 139 -61 m 139 -45 137 -41 126 -35 ct 115 -28 101 -24 91 -24 ct 74 -24 61 -40 61 -62 ct 61 -62 61 -62 61 -63 ct 61 -92 80 -110 139 -132 ct 139 -132 139 -132 139 -61 ct p ef 387 5 m 387 5 387 5 458 -21 ct 458 -21 458 -21 458 -28 ct 449 -28 448 -28 447 -28 ct 429 -28 425 -33 425 -56 ct 425 -56 425 -56 425 -336 ct 425 -336 425 -336 423 -337 ct 400 -329 383 -324 352 -315 ct 352 -315 352 -315 352 -308 ct 356 -308 358 -308 362 -308 ct 380 -308 385 -303 385 -283 ct 385 -283 385 -283 385 -206 ct 366 -222 353 -227 334 -227 ct 278 -227 233 -171 233 -101 ct 233 -38 269 5 323 5 ct 350 5 368 -5 385 -28 ct 385 -28 385 -28 385 4 ct 385 4 385 4 387 5 ct p 385 -50 m 385 -47 381 -41 376 -35 ct 368 -26 356 -21 342 -21 ct 301 -21 275 -60 275 -121 ct 275 -177 298 -213 335 -213 ct 361 -213 385 -190 385 -164 ct 385 -164 385 -164 385 -50 ct p ef 684 -32 m 676 -26 670 -23 663 -23 ct 652 -23 648 -30 648 -52 ct 648 -52 648 -52 648 -148 ct 648 -173 646 -188 638 -200 ct 628 -218 607 -227 578 -227 ct 533 -227 497 -203 497 -171 ct 497 -160 507 -150 518 -150 ct 530 -150 540 -160 540 -171 ct 540 -173 539 -175 539 -179 ct 538 -183 537 -187 537 -191 ct 537 -204 553 -215 572 -215 ct 596 -215 609 -201 609 -174 ct 609 -174 609 -174 609 -144 ct 534 -113 526 -109 505 -90 ct 495 -81 488 -64 488 -48 ct 488 -17 509 5 539 5 ct 560 5 580 -5 609 -31 ct 612 -5 621 5 640 5 ct 657 5 667 -1 684 -20 ct 684 -20 684 -20 684 -32 ct p 609 -61 m 609 -45 607 -41 596 -35 ct 585 -28 571 -24 561 -24 ct 544 -24 531 -40 531 -62 ct 531 -62 531 -62 531 -63 ct 531 -92 550 -110 609 -132 ct 609 -132 609 -132 609 -61 ct p ef 694 -195 m 699 -195 702 -195 706 -195 ct 723 -195 726 -190 726 -167 ct 726 -167 726 -167 726 65 ct 726 90 721 96 692 99 ct 692 99 692 99 692 107 ct 692 107 692 107 810 107 ct 810 107 810 107 810 98 ct 773 98 767 93 767 61 ct 767 61 767 61 767 -16 ct 784 0 796 5 816 5 ct 873 5 918 -50 918 -122 ct 918 -183 884 -227 837 -227 ct 810 -227 788 -215 767 -189 ct 767 -189 767 -189 767 -226 ct 767 -226 767 -226 764 -227 ct 738 -217 721 -210 694 -202 ct 694 -202 694 -202 694 -195 ct p 767 -165 m 767 -180 794 -197 816 -197 ct 852 -197 876 -160 876 -103 ct 876 -48 852 -11 817 -11 ct 795 -11 767 -29 767 -44 ct 767 -44 767 -44 767 -165 ct p ef 1063 -222 m 1063 -222 1063 -222 1015 -222 ct 1015 -222 1015 -222 1015 -279 ct 1015 -284 1014 -286 1011 -286 ct 1008 -281 1005 -277 1001 -272 ct 983 -245 962 -221 955 -219 ct 949 -216 946 -212 946 -210 ct 946 -208 947 -207 948 -206 ct 948 -206 948 -206 974 -206 ct 974 -206 974 -206 974 -58 ct 974 -16 988 5 1017 5 ct 1041 5 1059 -7 1075 -33 ct 1075 -33 1075 -33 1069 -38 ct 1059 -26 1050 -21 1040 -21 ct 1022 -21 1015 -34 1015 -65 ct 1015 -65 1015 -65 1015 -206 ct 1015 -206 1015 -206 1063 -206 ct 1063 -206 1063 -206 1063 -222 ct p ef 1165 -227 m 1165 -227 1165 -227 1090 -200 ct 1090 -200 1090 -200 1090 -192 ct 1090 -192 1090 -192 1094 -193 ct 1099 -194 1106 -194 1110 -194 ct 1122 -194 1126 -186 1126 -164 ct 1126 -164 1126 -164 1126 -49 ct 1126 -14 1121 -8 1088 -8 ct 1088 -8 1088 -8 1088 0 ct 1088 0 1088 0 1202 0 ct 1202 0 1202 0 1202 -8 ct 1171 -8 1167 -15 1167 -50 ct 1167 -50 1167 -50 1167 -225 ct 1167 -225 1167 -225 1165 -227 ct p 1142 -337 m 1129 -337 1118 -326 1118 -312 ct 1118 -298 1128 -287 1142 -287 ct 1156 -287 1167 -298 1167 -312 ct 1167 -326 1156 -337 1142 -337 ct p ef 1450 -222 m 1450 -222 1450 -222 1383 -222 ct 1383 -222 1383 -222 1383 -215 ct 1398 -213 1405 -208 1405 -199 ct 1405 -194 1404 -189 1402 -184 ct 1402 -184 1402 -184 1355 -56 ct 1355 -56 1355 -56 1305 -182 ct 1302 -189 1301 -196 1301 -201 ct 1301 -210 1306 -213 1323 -215 ct 1323 -215 1323 -215 1323 -222 ct 1323 -222 1323 -222 1228 -222 ct 1228 -222 1228 -222 1228 -214 ct 1247 -214 1250 -209 1272 -158 ct 1272 -158 1272 -158 1330 -16 ct 1331 -13 1333 -10 1334 -6 ct 1337 3 1340 7 1343 7 ct 1346 7 1349 1 1356 -18 ct 1356 -18 1356 -18 1418 -176 ct 1433 -210 1435 -213 1450 -215 ct 1450 -215 1450 -215 1450 -222 ct p ef 1663 -81 m 1639 -43 1618 -29 1587 -29 ct 1560 -29 1539 -43 1525 -72 ct 1516 -90 1513 -107 1512 -137 ct 1512 -137 1512 -137 1661 -137 ct 1657 -169 1652 -183 1640 -199 ct 1626 -217 1603 -227 1578 -227 ct 1554 -227 1531 -218 1513 -201 ct 1490 -181 1477 -146 1477 -106 ct 1477 -37 1512 5 1568 5 ct 1614 5 1650 -24 1670 -78 ct 1670 -78 1670 -78 1663 -81 ct p 1513 -153 m 1518 -191 1535 -209 1564 -209 ct 1594 -209 1605 -196 1612 -153 ct 1612 -153 1612 -153 1513 -153 ct p ef 1958 -222 m 1958 -222 1958 -222 1898 -222 ct 1898 -222 1898 -222 1898 -279 ct 1898 -308 1907 -323 1926 -323 ct 1936 -323 1943 -318 1951 -304 ct 1959 -291 1965 -286 1973 -286 ct 1984 -286 1993 -295 1993 -306 ct 1993 -324 1972 -337 1943 -337 ct 1913 -337 1887 -324 1875 -301 ct 1862 -279 1858 -261 1858 -222 ct 1858 -222 1858 -222 1818 -222 ct 1818 -222 1818 -222 1818 -206 ct 1818 -206 1818 -206 1858 -206 ct 1858 -206 1858 -206 1858 -51 ct 1858 -14 1853 -8 1818 -8 ct 1818 -8 1818 -8 1818 0 ct 1818 0 1818 0 1944 0 ct 1944 0 1944 0 1944 -8 ct 1904 -8 1899 -13 1899 -51 ct 1899 -51 1899 -51 1899 -206 ct 1899 -206 1899 -206 1958 -206 ct 1958 -206 1958 -206 1958 -222 ct p ef 2054 -227 m 2054 -227 2054 -227 1979 -200 ct 1979 -200 1979 -200 1979 -192 ct 1979 -192 1979 -192 1983 -193 ct 1988 -194 1995 -194 1999 -194 ct 2011 -194 2015 -186 2015 -164 ct 2015 -164 2015 -164 2015 -49 ct 2015 -14 2010 -8 1977 -8 ct 1977 -8 1977 -8 1977 0 ct 1977 0 1977 0 2091 0 ct 2091 0 2091 0 2091 -8 ct 2060 -8 2056 -15 2056 -50 ct 2056 -50 2056 -50 2056 -225 ct 2056 -225 2056 -225 2054 -227 ct p 2031 -337 m 2018 -337 2007 -326 2007 -312 ct 2007 -298 2017 -287 2031 -287 ct 2045 -287 2056 -298 2056 -312 ct 2056 -326 2045 -337 2031 -337 ct p ef 2117 -307 m 2117 -307 2117 -307 2120 -307 ct 2125 -308 2131 -308 2135 -308 ct 2151 -308 2155 -301 2155 -278 ct 2155 -278 2155 -278 2155 -42 ct 2155 -15 2149 -8 2118 -8 ct 2118 -8 2118 -8 2118 0 ct 2118 0 2118 0 2232 0 ct 2232 0 2232 0 2232 -8 ct 2202 -8 2196 -14 2196 -41 ct 2196 -41 2196 -41 2196 -336 ct 2196 -336 2196 -336 2194 -337 ct 2169 -328 2151 -323 2117 -315 ct 2117 -315 2117 -315 2117 -307 ct p ef 2367 -222 m 2367 -222 2367 -222 2319 -222 ct 2319 -222 2319 -222 2319 -279 ct 2319 -284 2318 -286 2315 -286 ct 2312 -281 2309 -277 2305 -272 ct 2287 -245 2266 -221 2259 -219 ct 2253 -216 2250 -212 2250 -210 ct 2250 -208 2251 -207 2252 -206 ct 2252 -206 2252 -206 2278 -206 ct 2278 -206 2278 -206 2278 -58 ct 2278 -16 2292 5 2321 5 ct 2345 5 2363 -7 2379 -33 ct 2379 -33 2379 -33 2373 -38 ct 2363 -26 2354 -21 2344 -21 ct 2326 -21 2319 -34 2319 -65 ct 2319 -65 2319 -65 2319 -206 ct 2319 -206 2319 -206 2367 -206 ct 2367 -206 2367 -206 2367 -222 ct p ef 2581 -81 m 2557 -43 2536 -29 2505 -29 ct 2478 -29 2457 -43 2443 -72 ct 2434 -90 2431 -107 2430 -137 ct 2430 -137 2430 -137 2579 -137 ct 2575 -169 2570 -183 2558 -199 ct 2544 -217 2521 -227 2496 -227 ct 2472 -227 2449 -218 2431 -201 ct 2408 -181 2395 -146 2395 -106 ct 2395 -37 2430 5 2486 5 ct 2532 5 2568 -24 2588 -78 ct 2588 -78 2588 -78 2581 -81 ct p 2431 -153 m 2436 -191 2453 -209 2482 -209 ct 2512 -209 2523 -196 2530 -153 ct 2530 -153 2530 -153 2431 -153 ct p ef 2607 -192 m 2614 -194 2619 -194 2624 -194 ct 2636 -194 2641 -186 2641 -164 ct 2641 -164 2641 -164 2641 -41 ct 2641 -17 2637 -13 2606 -7 ct 2606 -7 2606 -7 2606 0 ct 2606 0 2606 0 2723 0 ct 2723 0 2723 0 2723 -8 ct 2690 -8 2681 -15 2681 -44 ct 2681 -44 2681 -44 2681 -155 ct 2681 -171 2702 -196 2715 -196 ct 2718 -196 2723 -193 2728 -188 ct 2736 -182 2741 -179 2747 -179 ct 2759 -179 2766 -187 2766 -201 ct 2766 -217 2756 -227 2740 -227 ct 2719 -227 2705 -216 2681 -181 ct 2681 -181 2681 -181 2681 -226 ct 2681 -226 2681 -226 2679 -227 ct 2653 -216 2636 -210 2607 -200 ct 2607 -200 2607 -200 2607 -192 ct p ef pom gr gr gs gs pum 10753 9450 t 9 -307 m 9 -307 9 -307 12 -307 ct 17 -308 23 -308 27 -308 ct 43 -308 47 -301 47 -278 ct 47 -278 47 -278 47 -42 ct 47 -15 41 -8 10 -8 ct 10 -8 10 -8 10 0 ct 10 0 10 0 124 0 ct 124 0 124 0 124 -8 ct 94 -8 88 -14 88 -41 ct 88 -41 88 -41 88 -336 ct 88 -336 88 -336 86 -337 ct 61 -328 43 -323 9 -315 ct 9 -315 9 -315 9 -307 ct p ef 256 -227 m 193 -227 149 -180 149 -112 ct 149 -45 194 5 255 5 ct 316 5 363 -47 363 -115 ct 363 -180 318 -227 256 -227 ct p 250 -213 m 290 -213 319 -166 319 -98 ct 319 -42 297 -9 261 -9 ct 242 -9 224 -21 214 -40 ct 200 -66 193 -101 193 -136 ct 193 -183 215 -213 250 -213 ct p ef 617 -25 m 617 -25 617 -25 614 -25 ct 592 -25 587 -30 587 -53 ct 587 -53 587 -53 587 -222 ct 587 -222 587 -222 510 -222 ct 510 -222 510 -222 510 -213 ct 540 -213 546 -208 546 -183 ct 546 -183 546 -183 546 -67 ct 546 -53 544 -46 537 -41 ct 524 -30 509 -24 494 -24 ct 476 -24 460 -41 460 -61 ct 460 -61 460 -61 460 -222 ct 460 -222 460 -222 389 -222 ct 389 -222 389 -222 389 -214 ct 413 -214 419 -206 419 -184 ct 419 -184 419 -184 419 -59 ct 419 -20 443 5 478 5 ct 496 5 515 -3 528 -16 ct 528 -16 528 -16 549 -38 ct 549 -38 549 -38 549 4 ct 549 4 549 4 551 5 ct 575 -5 592 -11 617 -18 ct 617 -18 617 -18 617 -25 ct p ef 798 5 m 798 5 798 5 869 -21 ct 869 -21 869 -21 869 -28 ct 860 -28 859 -28 858 -28 ct 840 -28 836 -33 836 -56 ct 836 -56 836 -56 836 -336 ct 836 -336 836 -336 834 -337 ct 811 -329 794 -324 763 -315 ct 763 -315 763 -315 763 -308 ct 767 -308 769 -308 773 -308 ct 791 -308 796 -303 796 -283 ct 796 -283 796 -283 796 -206 ct 777 -222 764 -227 745 -227 ct 689 -227 644 -171 644 -101 ct 644 -38 680 5 734 5 ct 761 5 779 -5 796 -28 ct 796 -28 796 -28 796 4 ct 796 4 796 4 798 5 ct p 796 -50 m 796 -47 792 -41 787 -35 ct 779 -26 767 -21 753 -21 ct 712 -21 686 -60 686 -121 ct 686 -177 709 -213 746 -213 ct 772 -213 796 -190 796 -164 ct 796 -164 796 -164 796 -50 ct p ef 1034 -155 m 1034 -155 1034 -155 1032 -222 ct 1032 -222 1032 -222 1026 -222 ct 1026 -222 1026 -222 1025 -221 ct 1021 -218 1020 -217 1018 -217 ct 1016 -217 1011 -218 1005 -221 ct 995 -225 984 -227 972 -227 ct 933 -227 906 -202 906 -166 ct 906 -138 921 -118 962 -95 ct 962 -95 962 -95 990 -78 ct 1007 -69 1016 -57 1016 -41 ct 1016 -20 1000 -6 975 -6 ct 959 -6 944 -12 935 -23 ct 925 -35 920 -47 914 -75 ct 914 -75 914 -75 906 -75 ct 906 -75 906 -75 906 2 ct 906 2 906 2 912 2 ct 916 -3 918 -4 924 -4 ct 928 -4 935 -3 946 0 ct 959 3 973 5 981 5 ct 1018 5 1049 -24 1049 -58 ct 1049 -83 1038 -99 1009 -117 ct 1009 -117 1009 -117 957 -148 ct 943 -156 936 -169 936 -182 ct 936 -202 951 -216 973 -216 ct 1001 -216 1015 -199 1026 -155 ct 1026 -155 1026 -155 1034 -155 ct p ef 1079 -195 m 1084 -195 1087 -195 1091 -195 ct 1108 -195 1111 -190 1111 -167 ct 1111 -167 1111 -167 1111 65 ct 1111 90 1106 96 1077 99 ct 1077 99 1077 99 1077 107 ct 1077 107 1077 107 1195 107 ct 1195 107 1195 107 1195 98 ct 1158 98 1152 93 1152 61 ct 1152 61 1152 61 1152 -16 ct 1169 0 1181 5 1201 5 ct 1258 5 1303 -50 1303 -122 ct 1303 -183 1269 -227 1222 -227 ct 1195 -227 1173 -215 1152 -189 ct 1152 -189 1152 -189 1152 -226 ct 1152 -226 1152 -226 1149 -227 ct 1123 -217 1106 -210 1079 -202 ct 1079 -202 1079 -202 1079 -195 ct p 1152 -165 m 1152 -180 1179 -197 1201 -197 ct 1237 -197 1261 -160 1261 -103 ct 1261 -48 1237 -11 1202 -11 ct 1180 -11 1152 -29 1152 -44 ct 1152 -44 1152 -44 1152 -165 ct p ef 1523 -81 m 1499 -43 1478 -29 1447 -29 ct 1420 -29 1399 -43 1385 -72 ct 1376 -90 1373 -107 1372 -137 ct 1372 -137 1372 -137 1521 -137 ct 1517 -169 1512 -183 1500 -199 ct 1486 -217 1463 -227 1438 -227 ct 1414 -227 1391 -218 1373 -201 ct 1350 -181 1337 -146 1337 -106 ct 1337 -37 1372 5 1428 5 ct 1474 5 1510 -24 1530 -78 ct 1530 -78 1530 -78 1523 -81 ct p 1373 -153 m 1378 -191 1395 -209 1424 -209 ct 1454 -209 1465 -196 1472 -153 ct 1472 -153 1472 -153 1373 -153 ct p ef 1759 -32 m 1751 -26 1745 -23 1738 -23 ct 1727 -23 1723 -30 1723 -52 ct 1723 -52 1723 -52 1723 -148 ct 1723 -173 1721 -188 1713 -200 ct 1703 -218 1682 -227 1653 -227 ct 1608 -227 1572 -203 1572 -171 ct 1572 -160 1582 -150 1593 -150 ct 1605 -150 1615 -160 1615 -171 ct 1615 -173 1614 -175 1614 -179 ct 1613 -183 1612 -187 1612 -191 ct 1612 -204 1628 -215 1647 -215 ct 1671 -215 1684 -201 1684 -174 ct 1684 -174 1684 -174 1684 -144 ct 1609 -113 1601 -109 1580 -90 ct 1570 -81 1563 -64 1563 -48 ct 1563 -17 1584 5 1614 5 ct 1635 5 1655 -5 1684 -31 ct 1687 -5 1696 5 1715 5 ct 1732 5 1742 -1 1759 -20 ct 1759 -20 1759 -20 1759 -32 ct p 1684 -61 m 1684 -45 1682 -41 1671 -35 ct 1660 -28 1646 -24 1636 -24 ct 1619 -24 1606 -40 1606 -62 ct 1606 -62 1606 -62 1606 -63 ct 1606 -92 1625 -110 1684 -132 ct 1684 -132 1684 -132 1684 -61 ct p ef 1768 -307 m 1775 -307 1779 -308 1784 -308 ct 1800 -308 1805 -302 1805 -278 ct 1805 -278 1805 -278 1805 -40 ct 1805 -15 1803 -13 1768 -7 ct 1768 -7 1768 -7 1768 0 ct 1768 0 1768 0 1882 0 ct 1882 0 1882 0 1882 -8 ct 1882 -8 1882 -8 1872 -8 ct 1853 -8 1845 -15 1845 -32 ct 1845 -32 1845 -32 1845 -124 ct 1845 -124 1845 -124 1913 -32 ct 1913 -32 1913 -32 1915 -30 ct 1916 -28 1917 -27 1918 -25 ct 1922 -20 1923 -17 1923 -15 ct 1923 -10 1919 -7 1913 -7 ct 1913 -7 1913 -7 1904 -7 ct 1904 -7 1904 -7 1904 0 ct 1904 0 1904 0 2009 0 ct 2009 0 2009 0 2009 -8 ct 1988 -8 1973 -18 1953 -43 ct 1953 -43 1953 -43 1879 -139 ct 1879 -139 1879 -139 1893 -152 ct 1927 -185 1957 -208 1971 -212 ct 1979 -214 1985 -215 1994 -215 ct 1994 -215 1994 -215 1997 -215 ct 1997 -215 1997 -215 1997 -222 ct 1997 -222 1997 -222 1899 -222 ct 1899 -222 1899 -222 1899 -215 ct 1918 -215 1923 -213 1923 -206 ct 1923 -202 1918 -195 1912 -189 ct 1912 -189 1912 -189 1845 -129 ct 1845 -129 1845 -129 1845 -336 ct 1845 -336 1845 -336 1843 -337 ct 1825 -331 1811 -327 1783 -319 ct 1783 -319 1783 -319 1768 -315 ct 1768 -315 1768 -315 1768 -307 ct p ef 2217 -81 m 2193 -43 2172 -29 2141 -29 ct 2114 -29 2093 -43 2079 -72 ct 2070 -90 2067 -107 2066 -137 ct 2066 -137 2066 -137 2215 -137 ct 2211 -169 2206 -183 2194 -199 ct 2180 -217 2157 -227 2132 -227 ct 2108 -227 2085 -218 2067 -201 ct 2044 -181 2031 -146 2031 -106 ct 2031 -37 2066 5 2122 5 ct 2168 5 2204 -24 2224 -78 ct 2224 -78 2224 -78 2217 -81 ct p 2067 -153 m 2072 -191 2089 -209 2118 -209 ct 2148 -209 2159 -196 2166 -153 ct 2166 -153 2166 -153 2067 -153 ct p ef 2242 -192 m 2249 -194 2254 -194 2259 -194 ct 2271 -194 2276 -186 2276 -164 ct 2276 -164 2276 -164 2276 -41 ct 2276 -17 2272 -13 2241 -7 ct 2241 -7 2241 -7 2241 0 ct 2241 0 2241 0 2358 0 ct 2358 0 2358 0 2358 -8 ct 2325 -8 2316 -15 2316 -44 ct 2316 -44 2316 -44 2316 -155 ct 2316 -171 2337 -196 2350 -196 ct 2353 -196 2358 -193 2363 -188 ct 2371 -182 2376 -179 2382 -179 ct 2394 -179 2401 -187 2401 -201 ct 2401 -217 2391 -227 2375 -227 ct 2354 -227 2340 -216 2316 -181 ct 2316 -181 2316 -181 2316 -226 ct 2316 -226 2316 -226 2314 -227 ct 2288 -216 2271 -210 2242 -200 ct 2242 -200 2242 -200 2242 -192 ct p ef pom gr gr gs gs pum 4619 16250 t 121 -227 m 58 -227 14 -180 14 -112 ct 14 -45 59 5 120 5 ct 181 5 228 -47 228 -115 ct 228 -180 183 -227 121 -227 ct p 115 -213 m 155 -213 184 -166 184 -98 ct 184 -42 162 -9 126 -9 ct 107 -9 89 -21 79 -40 ct 65 -66 58 -101 58 -136 ct 58 -183 80 -213 115 -213 ct p ef 482 -25 m 482 -25 482 -25 479 -25 ct 457 -25 452 -30 452 -53 ct 452 -53 452 -53 452 -222 ct 452 -222 452 -222 375 -222 ct 375 -222 375 -222 375 -213 ct 405 -213 411 -208 411 -183 ct 411 -183 411 -183 411 -67 ct 411 -53 409 -46 402 -41 ct 389 -30 374 -24 359 -24 ct 341 -24 325 -41 325 -61 ct 325 -61 325 -61 325 -222 ct 325 -222 325 -222 254 -222 ct 254 -222 254 -222 254 -214 ct 278 -214 284 -206 284 -184 ct 284 -184 284 -184 284 -59 ct 284 -20 308 5 343 5 ct 361 5 380 -3 393 -16 ct 393 -16 393 -16 414 -38 ct 414 -38 414 -38 414 4 ct 414 4 414 4 416 5 ct 440 -5 457 -11 482 -18 ct 482 -18 482 -18 482 -25 ct p ef 618 -222 m 618 -222 618 -222 570 -222 ct 570 -222 570 -222 570 -279 ct 570 -284 569 -286 566 -286 ct 563 -281 560 -277 556 -272 ct 538 -245 517 -221 510 -219 ct 504 -216 501 -212 501 -210 ct 501 -208 502 -207 503 -206 ct 503 -206 503 -206 529 -206 ct 529 -206 529 -206 529 -58 ct 529 -16 543 5 572 5 ct 596 5 614 -7 630 -33 ct 630 -33 630 -33 624 -38 ct 614 -26 605 -21 595 -21 ct 577 -21 570 -34 570 -65 ct 570 -65 570 -65 570 -206 ct 570 -206 570 -206 618 -206 ct 618 -206 618 -206 618 -222 ct p ef 639 -195 m 644 -195 647 -195 651 -195 ct 668 -195 671 -190 671 -167 ct 671 -167 671 -167 671 65 ct 671 90 666 96 637 99 ct 637 99 637 99 637 107 ct 637 107 637 107 755 107 ct 755 107 755 107 755 98 ct 718 98 712 93 712 61 ct 712 61 712 61 712 -16 ct 729 0 741 5 761 5 ct 818 5 863 -50 863 -122 ct 863 -183 829 -227 782 -227 ct 755 -227 733 -215 712 -189 ct 712 -189 712 -189 712 -226 ct 712 -226 712 -226 709 -227 ct 683 -217 666 -210 639 -202 ct 639 -202 639 -202 639 -195 ct p 712 -165 m 712 -180 739 -197 761 -197 ct 797 -197 821 -160 821 -103 ct 821 -48 797 -11 762 -11 ct 740 -11 712 -29 712 -44 ct 712 -44 712 -44 712 -165 ct p ef 1117 -25 m 1117 -25 1117 -25 1114 -25 ct 1092 -25 1087 -30 1087 -53 ct 1087 -53 1087 -53 1087 -222 ct 1087 -222 1087 -222 1010 -222 ct 1010 -222 1010 -222 1010 -213 ct 1040 -213 1046 -208 1046 -183 ct 1046 -183 1046 -183 1046 -67 ct 1046 -53 1044 -46 1037 -41 ct 1024 -30 1009 -24 994 -24 ct 976 -24 960 -41 960 -61 ct 960 -61 960 -61 960 -222 ct 960 -222 960 -222 889 -222 ct 889 -222 889 -222 889 -214 ct 913 -214 919 -206 919 -184 ct 919 -184 919 -184 919 -59 ct 919 -20 943 5 978 5 ct 996 5 1015 -3 1028 -16 ct 1028 -16 1028 -16 1049 -38 ct 1049 -38 1049 -38 1049 4 ct 1049 4 1049 4 1051 5 ct 1075 -5 1092 -11 1117 -18 ct 1117 -18 1117 -18 1117 -25 ct p ef 1253 -222 m 1253 -222 1253 -222 1205 -222 ct 1205 -222 1205 -222 1205 -279 ct 1205 -284 1204 -286 1201 -286 ct 1198 -281 1195 -277 1191 -272 ct 1173 -245 1152 -221 1145 -219 ct 1139 -216 1136 -212 1136 -210 ct 1136 -208 1137 -207 1138 -206 ct 1138 -206 1138 -206 1164 -206 ct 1164 -206 1164 -206 1164 -58 ct 1164 -16 1178 5 1207 5 ct 1231 5 1249 -7 1265 -33 ct 1265 -33 1265 -33 1259 -38 ct 1249 -26 1240 -21 1230 -21 ct 1212 -21 1205 -34 1205 -65 ct 1205 -65 1205 -65 1205 -206 ct 1205 -206 1205 -206 1253 -206 ct 1253 -206 1253 -206 1253 -222 ct p ef pom gr gs pum 4138 16851 t 143 -334 m 107 -310 92 -297 75 -274 ct 40 -231 23 -182 23 -124 ct 23 -62 41 -13 84 37 ct 104 61 116 72 141 87 ct 141 87 141 87 147 79 ct 108 48 95 31 82 -6 ct 70 -39 65 -76 65 -126 ct 65 -178 71 -218 84 -249 ct 98 -279 112 -297 147 -326 ct 147 -326 147 -326 143 -334 ct p ef 288 -222 m 288 -222 288 -222 240 -222 ct 240 -222 240 -222 240 -279 ct 240 -284 239 -286 236 -286 ct 233 -281 230 -277 226 -272 ct 208 -245 187 -221 180 -219 ct 174 -216 171 -212 171 -210 ct 171 -208 172 -207 173 -206 ct 173 -206 173 -206 199 -206 ct 199 -206 199 -206 199 -58 ct 199 -16 213 5 242 5 ct 266 5 284 -7 300 -33 ct 300 -33 300 -33 294 -38 ct 284 -26 275 -21 265 -21 ct 247 -21 240 -34 240 -65 ct 240 -65 240 -65 240 -206 ct 240 -206 240 -206 288 -206 ct 288 -206 288 -206 288 -222 ct p ef 426 -227 m 363 -227 319 -180 319 -112 ct 319 -45 364 5 425 5 ct 486 5 533 -47 533 -115 ct 533 -180 488 -227 426 -227 ct p 420 -213 m 460 -213 489 -166 489 -98 ct 489 -42 467 -9 431 -9 ct 412 -9 394 -21 384 -40 ct 370 -66 363 -101 363 -136 ct 363 -183 385 -213 420 -213 ct p ef 827 -222 m 827 -222 827 -222 767 -222 ct 767 -222 767 -222 767 -279 ct 767 -308 776 -323 795 -323 ct 805 -323 812 -318 820 -304 ct 828 -291 834 -286 842 -286 ct 853 -286 862 -295 862 -306 ct 862 -324 841 -337 812 -337 ct 782 -337 756 -324 744 -301 ct 731 -279 727 -261 727 -222 ct 727 -222 727 -222 687 -222 ct 687 -222 687 -222 687 -206 ct 687 -206 687 -206 727 -206 ct 727 -206 727 -206 727 -51 ct 727 -14 722 -8 687 -8 ct 687 -8 687 -8 687 0 ct 687 0 687 0 813 0 ct 813 0 813 0 813 -8 ct 773 -8 768 -13 768 -51 ct 768 -51 768 -51 768 -206 ct 768 -206 768 -206 827 -206 ct 827 -206 827 -206 827 -222 ct p ef 1052 -32 m 1044 -26 1038 -23 1031 -23 ct 1020 -23 1016 -30 1016 -52 ct 1016 -52 1016 -52 1016 -148 ct 1016 -173 1014 -188 1006 -200 ct 996 -218 975 -227 946 -227 ct 901 -227 865 -203 865 -171 ct 865 -160 875 -150 886 -150 ct 898 -150 908 -160 908 -171 ct 908 -173 907 -175 907 -179 ct 906 -183 905 -187 905 -191 ct 905 -204 921 -215 940 -215 ct 964 -215 977 -201 977 -174 ct 977 -174 977 -174 977 -144 ct 902 -113 894 -109 873 -90 ct 863 -81 856 -64 856 -48 ct 856 -17 877 5 907 5 ct 928 5 948 -5 977 -31 ct 980 -5 989 5 1008 5 ct 1025 5 1035 -1 1052 -20 ct 1052 -20 1052 -20 1052 -32 ct p 977 -61 m 977 -45 975 -41 964 -35 ct 953 -28 939 -24 929 -24 ct 912 -24 899 -40 899 -62 ct 899 -62 899 -62 899 -63 ct 899 -92 918 -110 977 -132 ct 977 -132 977 -132 977 -61 ct p ef 1061 -192 m 1068 -194 1073 -194 1078 -194 ct 1090 -194 1095 -186 1095 -164 ct 1095 -164 1095 -164 1095 -41 ct 1095 -17 1091 -13 1060 -7 ct 1060 -7 1060 -7 1060 0 ct 1060 0 1060 0 1177 0 ct 1177 0 1177 0 1177 -8 ct 1144 -8 1135 -15 1135 -44 ct 1135 -44 1135 -44 1135 -155 ct 1135 -171 1156 -196 1169 -196 ct 1172 -196 1177 -193 1182 -188 ct 1190 -182 1195 -179 1201 -179 ct 1213 -179 1220 -187 1220 -201 ct 1220 -217 1210 -227 1194 -227 ct 1173 -227 1159 -216 1135 -181 ct 1135 -181 1135 -181 1135 -226 ct 1135 -226 1135 -226 1133 -227 ct 1107 -216 1090 -210 1061 -200 ct 1061 -200 1061 -200 1061 -192 ct p ef 1544 -81 m 1520 -43 1499 -29 1468 -29 ct 1441 -29 1420 -43 1406 -72 ct 1397 -90 1394 -107 1393 -137 ct 1393 -137 1393 -137 1542 -137 ct 1538 -169 1533 -183 1521 -199 ct 1507 -217 1484 -227 1459 -227 ct 1435 -227 1412 -218 1394 -201 ct 1371 -181 1358 -146 1358 -106 ct 1358 -37 1393 5 1449 5 ct 1495 5 1531 -24 1551 -78 ct 1551 -78 1551 -78 1544 -81 ct p 1394 -153 m 1399 -191 1416 -209 1445 -209 ct 1475 -209 1486 -196 1493 -153 ct 1493 -153 1493 -153 1394 -153 ct p ef 1574 -196 m 1577 -198 1581 -198 1587 -198 ct 1600 -198 1605 -191 1605 -166 ct 1605 -166 1605 -166 1605 -44 ct 1605 -15 1599 -8 1575 -8 ct 1575 -8 1575 -8 1575 0 ct 1575 0 1575 0 1677 0 ct 1677 0 1677 0 1677 -8 ct 1653 -8 1645 -14 1645 -32 ct 1645 -32 1645 -32 1645 -171 ct 1669 -194 1679 -200 1695 -200 ct 1719 -200 1731 -184 1731 -152 ct 1731 -152 1731 -152 1731 -48 ct 1731 -17 1724 -8 1700 -8 ct 1700 -8 1700 -8 1700 0 ct 1700 0 1700 0 1801 0 ct 1801 0 1801 0 1801 -7 ct 1777 -10 1771 -16 1771 -40 ct 1771 -40 1771 -40 1771 -153 ct 1771 -199 1750 -227 1714 -227 ct 1692 -227 1677 -219 1644 -187 ct 1644 -187 1644 -187 1644 -226 ct 1644 -226 1644 -226 1641 -227 ct 1617 -218 1600 -213 1574 -205 ct 1574 -205 1574 -205 1574 -196 ct p ef 1983 5 m 1983 5 1983 5 2054 -21 ct 2054 -21 2054 -21 2054 -28 ct 2045 -28 2044 -28 2043 -28 ct 2025 -28 2021 -33 2021 -56 ct 2021 -56 2021 -56 2021 -336 ct 2021 -336 2021 -336 2019 -337 ct 1996 -329 1979 -324 1948 -315 ct 1948 -315 1948 -315 1948 -308 ct 1952 -308 1954 -308 1958 -308 ct 1976 -308 1981 -303 1981 -283 ct 1981 -283 1981 -283 1981 -206 ct 1962 -222 1949 -227 1930 -227 ct 1874 -227 1829 -171 1829 -101 ct 1829 -38 1865 5 1919 5 ct 1946 5 1964 -5 1981 -28 ct 1981 -28 1981 -28 1981 4 ct 1981 4 1981 4 1983 5 ct p 1981 -50 m 1981 -47 1977 -41 1972 -35 ct 1964 -26 1952 -21 1938 -21 ct 1897 -21 1871 -60 1871 -121 ct 1871 -177 1894 -213 1931 -213 ct 1957 -213 1981 -190 1981 -164 ct 1981 -164 1981 -164 1981 -50 ct p ef 2084 87 m 2120 64 2135 51 2153 28 ct 2187 -15 2204 -64 2204 -122 ct 2204 -185 2186 -233 2143 -283 ct 2124 -307 2111 -318 2086 -334 ct 2086 -334 2086 -334 2080 -326 ct 2119 -295 2132 -277 2145 -240 ct 2157 -207 2162 -170 2162 -120 ct 2162 -69 2156 -28 2143 2 ct 2129 33 2115 51 2080 79 ct 2080 79 2080 79 2084 87 ct p ef pom gr gr gs gs pum 8742 14319 t 7 -199 m 14 -200 17 -201 23 -201 ct 51 -201 58 -188 81 -103 ct 89 -71 101 -13 101 -4 ct 101 4 98 11 91 20 ct 76 41 66 54 60 59 ct 50 70 44 74 38 74 ct 35 74 31 73 26 69 ct 18 63 13 60 7 60 ct -3 60 -12 69 -12 80 ct -12 92 -1 102 13 102 ct 45 102 110 27 163 -71 ct 197 -131 210 -167 210 -191 ct 210 -206 198 -219 183 -219 ct 172 -219 164 -211 164 -200 ct 164 -193 168 -188 178 -181 ct 187 -176 191 -171 191 -164 ct 191 -145 172 -106 130 -36 ct 130 -36 130 -36 121 -94 ct 113 -137 85 -219 78 -219 ct 78 -219 78 -219 76 -219 ct 76 -218 74 -218 72 -218 ct 67 -217 49 -214 23 -209 ct 21 -209 14 -208 7 -207 ct 7 -207 7 -207 7 -199 ct p ef pom gr gs pum 8962 14319 t 143 -334 m 107 -310 92 -297 75 -274 ct 40 -231 23 -182 23 -124 ct 23 -62 41 -13 84 37 ct 104 61 116 72 141 87 ct 141 87 141 87 147 79 ct 108 48 95 31 82 -6 ct 70 -39 65 -76 65 -126 ct 65 -178 71 -218 84 -249 ct 98 -279 112 -297 147 -326 ct 147 -326 147 -326 143 -334 ct p ef pom gr gs pum 9127 14319 t 227 -58 m 227 -58 227 -58 217 -45 ct 203 -27 194 -19 187 -19 ct 183 -19 179 -23 179 -27 ct 179 -31 179 -31 186 -58 ct 186 -58 186 -58 214 -160 ct 216 -170 218 -181 218 -188 ct 218 -206 205 -218 186 -218 ct 154 -218 123 -189 72 -110 ct 72 -110 72 -110 105 -217 ct 105 -217 105 -217 104 -218 ct 77 -213 67 -211 24 -203 ct 24 -203 24 -203 24 -195 ct 49 -195 55 -192 55 -182 ct 55 -179 55 -176 54 -173 ct 54 -173 54 -173 7 0 ct 7 0 7 0 44 0 ct 67 -78 72 -89 93 -123 ct 123 -168 148 -193 166 -193 ct 174 -193 178 -188 178 -179 ct 178 -173 175 -156 171 -141 ct 171 -141 171 -141 150 -60 ct 143 -35 142 -28 142 -23 ct 142 -4 149 4 165 4 ct 187 4 200 -6 234 -52 ct 234 -52 234 -52 227 -58 ct p ef pom gr gs pum 9377 14319 t 18 87 m 54 64 69 51 87 28 ct 121 -15 138 -64 138 -122 ct 138 -185 120 -233 77 -283 ct 58 -307 45 -318 20 -334 ct 20 -334 20 -334 14 -326 ct 53 -295 66 -277 79 -240 ct 91 -207 96 -170 96 -120 ct 96 -69 90 -28 77 2 ct 63 33 49 51 14 79 ct 14 79 14 79 18 87 ct p ef pom gr gr gs gs pum 8742 14186 t 45 -147 m 114 -290 l 183 -147 l 216 -147 l 128 -327 l 99 -327 l 12 -147 l 45 -147 l p ef pom gr gr gs gs pum 14351 14292 t 7 -199 m 14 -200 17 -201 23 -201 ct 51 -201 58 -188 81 -103 ct 89 -71 101 -13 101 -4 ct 101 4 98 11 91 20 ct 76 41 66 54 60 59 ct 50 70 44 74 38 74 ct 35 74 31 73 26 69 ct 18 63 13 60 7 60 ct -3 60 -12 69 -12 80 ct -12 92 -1 102 13 102 ct 45 102 110 27 163 -71 ct 197 -131 210 -167 210 -191 ct 210 -206 198 -219 183 -219 ct 172 -219 164 -211 164 -200 ct 164 -193 168 -188 178 -181 ct 187 -176 191 -171 191 -164 ct 191 -145 172 -106 130 -36 ct 130 -36 130 -36 121 -94 ct 113 -137 85 -219 78 -219 ct 78 -219 78 -219 76 -219 ct 76 -218 74 -218 72 -218 ct 67 -217 49 -214 23 -209 ct 21 -209 14 -208 7 -207 ct 7 -207 7 -207 7 -199 ct p ef pom gr gs pum 14571 14292 t 143 -334 m 107 -310 92 -297 75 -274 ct 40 -231 23 -182 23 -124 ct 23 -62 41 -13 84 37 ct 104 61 116 72 141 87 ct 141 87 141 87 147 79 ct 108 48 95 31 82 -6 ct 70 -39 65 -76 65 -126 ct 65 -178 71 -218 84 -249 ct 98 -279 112 -297 147 -326 ct 147 -326 147 -326 143 -334 ct p ef pom gr gs pum 14736 14292 t 227 -58 m 227 -58 227 -58 217 -45 ct 203 -27 194 -19 187 -19 ct 183 -19 179 -23 179 -27 ct 179 -31 179 -31 186 -58 ct 186 -58 186 -58 214 -160 ct 216 -170 218 -181 218 -188 ct 218 -206 205 -218 186 -218 ct 154 -218 123 -189 72 -110 ct 72 -110 72 -110 105 -217 ct 105 -217 105 -217 104 -218 ct 77 -213 67 -211 24 -203 ct 24 -203 24 -203 24 -195 ct 49 -195 55 -192 55 -182 ct 55 -179 55 -176 54 -173 ct 54 -173 54 -173 7 0 ct 7 0 7 0 44 0 ct 67 -78 72 -89 93 -123 ct 123 -168 148 -193 166 -193 ct 174 -193 178 -188 178 -179 ct 178 -173 175 -156 171 -141 ct 171 -141 171 -141 150 -60 ct 143 -35 142 -28 142 -23 ct 142 -4 149 4 165 4 ct 187 4 200 -6 234 -52 ct 234 -52 234 -52 227 -58 ct p ef pom gr gs pum 14986 14292 t 18 87 m 54 64 69 51 87 28 ct 121 -15 138 -64 138 -122 ct 138 -185 120 -233 77 -283 ct 58 -307 45 -318 20 -334 ct 20 -334 20 -334 14 -326 ct 53 -295 66 -277 79 -240 ct 91 -207 96 -170 96 -120 ct 96 -69 90 -28 77 2 ct 63 33 49 51 14 79 ct 14 79 14 79 18 87 ct p ef pom gr gr tm setmatrix 0 0 t 1 1 s 0 8286 t pom count op_count sub {pop} repeat countdictstack dict_count sub {end} repeat b4_inc_state restore %%PageTrailer %%Trailer %%EOF mumble-1.3.4/3rdparty/speexdsp-src/doc/components.odg0000664000175000017500000003025614010707343022462 0ustar builderbuilderPK"8.++mimetypeapplication/vnd.oasis.opendocument.graphicsPK"8 content.xml\ێ}WBdu-c܍C0 7@[l%Qv{~"|Ixх%K̸вU")GDsLҥ&4 !NWKl߽ۛ#QIIPZI 14_ҥ&(_d(*B%)yG fU@OXaے[̪tHv0e+FDI SӇ.lavu&L)Jk/XpbM0fśՏ*X5(g,1Uʴq5ڻW=0kHG`nw'TeX{;7?B+m (FwSrZU. P׶,ה (Q=88'Ih@Aā{lSy[?> ( 3f6p0mqZѮySNӭpSiܬ pS.b$7OM~/0zI |Hrn42B/+ 5*r)OŐBP-E2hQQϚ[fM,/Ht }@u`89SkB'Malv\נaKpUu~cEX#Z8gY$8רU <ɸۣߓC(FQX)ee/ci45;udp {7GFB##K{?"w}yr/To<1dFPC^,:& h{rB1#οBf+xqߖ5/G>q0x ]JUDچ?Vd"y}bw2튭h*CQ\MBU|v5U[{W]|!BJ (9tu?SCQ*Q$d RNo>Hbxd1=rΆW{FWw6{Mφs·ϕ!^<뜧u65Q+el͖$/;'ry%l5e620gi8-ukن8DĕF\Y,wFr 0,cL0CJczZKJpqXpǯ)䚸4FZFWx47ff>JgJj}  KceeoPGB$A݉1@Xfi6Z.cuR0Wb*wF>h\})ުFk>-߄;o{$ ݈ hȿ/owoAoD?Rf9W؉?aY0xx{φLI(^O8[N|~f'_q*OYI|0o~DKIS]fpz`bqd:mW@R~"TTSRI^ddxP6BTڪ UϿ(8ǠhX8a^\faXa]{Ca5fBcڋӅƬ hYИ^þaO-'r  {Aģ܅iyVsVTJ^Jt~6Ƕ 7*(LsJ X ,uY3әNO,ʄƢ,yN0*"m1 .l|7_T֜U/kQ-L~BH:s_X3҇8ˆ21ϭ;1Q(qpFE|u61'3~oi`ؗ;$,̏9r<븜3n^}\fט4lГߙSX !-6(Vx2d'Y.ܯWOL?-'}HNlh:_n,{Xtf9˻P Qf'Û 5Q5gLZ! i s] Kx uGڒz$cɣIotd.b jk[Y60klfz$N7}>uPK0KPK"8 styles.xml\_6O!hq}gڍSh9M-Q6J(jΗ}$7$%%YNB Gq8h>9a'm4dIKw?:71 "baT8Q[ \O $_(B RZ 5 UW¦bm𑕰q,eSS=fCs Y!A$7Bd nՄsWqkZ.+8URQb`O|M@C퓲Ii0 hV3swe\{ӈ[wngJ*WPLM޸oy>x2t,)ۀ*$즖6cRA/venySW6[Nx+"ֈ 4]p ^lG ^ZF*~U]n_YR,לmA./mG85+"yFًX ~9ED;Gt-ڛ̼01xAS4%@t*Y7wSYo?E~ъ8b&D/&qpit,r Q/M9|eYnү#o;p`Q2/i*A˿{G Y[wThygS CTHDFDs ˍ~|Pi&t]5b!+Rn1~,ޢ4ﱫwɱyo!!崗W4,mbpstviu8R+(l,*U3\}b5sHòyq.n*?vii^@v;۫E;;_λC~C6i-w绩6dkK6X/ӓtڹ拿vJۺc[wl>ƶۺc[qۺc[iu} FVYUt :xrf'k1T׫c)ħt Kwy_FC'p:{\5B\݈]97PՕ҉<@N/(8Sq.S܀?g*<CST"Z:* :YlOقYVlNWd5N^Ɨ4ŤXыy]zM{WC[~ۤ[:\C=A}qىYѾ+{QgZe }XH?B';c4nMpBu+l, n`F"]h4NTه-o173>ȗBDZ]Q[6Aכ}foNQ6IAZ\ ZXymxBƜ!Nֹ'LsL}䍖_hƫ>TpZgDžuȢ&'c1cvq_~wړT/2]=6GHG( yyjJf mK."v~fCS7*ֿ5x)sZKZv%ғqgg.,j jҎ8-kcZ3c ):{>4,5hm\KWHD.ʚ!w5)O ۅŕХԄ#2فLӥ1D=eT܅E^ss"9Ϧ?u{ Ao1FK $zDtoɽLw#¶$K3t7X{K5l>'c#=|=JXߧg&ęuL`afEAKޘN}Ӎp?A6XVYIf|}C2F[wiN[Nbyl,N|[[ұwV!vcpj;g+ I8M/Jys]9r>IA,%(cokiQ4MQ/5|)SvH{=HbT t@/ٮ2{2.H*6Lj@+zBf'[-zS?uh|umvN@nZ?c]p_b6[=e䘀)o{gG%اD;==j~=L~215=Loz0ngm[MLdJ* (_]6դ+S+|Vխ5jr]{38컂|rO8uk34R_i91_<:{PkUG~iVf%G kh`ze{6V d8)iT7Ag}?n]SBMW+LbeR#?2Swj-:ˑx~`c3owlJ/4(O$ )!$$97 YSi:R;VBXgL@W#k_R]ׅ~Щ%l%/e-oգaFVc'+7OҴaUу4 倠ԧ`.ڐx.(fi,nٳ$Fzz2`/,9)fI9 02W;{YCKo& Z5 SJ#\/xC.oɠ?֖yY׳.6ux*0/[ K&.Oy~$؞/urH?k,iU-Z%Wj T4/6C88q;\*(/ tTa&w-j2EQxҷ2"It؋,{N\ޑpqij\4Ob4kqȤ6>z&MKL8 sS)r+ęc9 }%⳻``i1W.+B8_7K= q2D1}[LfQ5\{ȩ9pΘ5\{QߕX#{ "27Tklpp'[ݱ *E'pkBoQ?lp_o`_oWPdNjUe@ҿ{ t56OSOψ8GPB`he~ Ӱ #j!ܒQ~ʸti`,,ꦞ6.K{+hSrM}JeI{ ?&mZѱyc7l{.n4шlq n#F+OO*Fl3'4SEKb( A2[Xv!,Fow@"ڒQPs &D#9>8< 5SFx54ҡih bv;vDz ߊWTk!W6\Ǎr%)EXlKr傱jy,K QC]#D~SA!hyN0܃k?(PjœAtz~Ԗ8m&z#$ {apW4Qiλ3Y"Zo: uD:}腚7FW~kyHV?e*"?e)$;J:[$GPI\*ZWʝZ_($},ALZF~#_ˋyj=1Ͽ{>01yBv= rLL;9pog>{UBW- FJu2˝tdQGW; E*=U|T>zT:ͯP+s/)~<&A{SZ ʇnZ:tc̴o).A眔H &ܶw}pұrŘnk^ޭ/ݑ ߟ &Hmq&nqHIzu:Ɩǩ#cVIE?3}_sU<*^s!Ej>jֻ[]0aTfl;rrPI[VS6їQ+Z18\)w1863u \|]{]VVr|+ 9Pޠ%OA/Jf(Gg~g91i)nUykݪ<ʯ@+է3&Q9t#yZ'aX}3[2^!9ea {_[dezSeo3!7ݟ;sӮ6]v0gd3}̘,5|@R|gR^< w"N+F TQX4U!,}u:-D:<z$U5bKΏ,ZWo;ozE}"gKәW)S2,1_gcĪK\8F=뾈YE ?BNUkBs`g#[خtHGxo S9V*RDzͨyYz%9+,伢'7y Rv%6^trNk3Rrj 1/W`YYRV;hĊ=?z*aPK6zPK"8'Configurations2/accelerator/current.xmlPKPK"8Configurations2/progressbar/PK"8Configurations2/floater/PK"8Configurations2/popupmenu/PK"8Configurations2/menubar/PK"8Configurations2/toolbar/PK"8Configurations2/images/Bitmaps/PK"8Configurations2/statusbar/PK"8 settings.xmlZ[s6~x>C.'L !aIh =}jdGCI ؉#NyŖoo]-9'"oyúw(՛EhaX*Q~^eeZQeW"Fea 3ÿrw{۵K癢5 2>Uo>QXDoTe:coR-cr嵏]a`kGPNN@g\'gůE$Q3\wVGǎXpKLmag_ 2^{J*=|@' KIE! 3ʥ;}@9RLw P=:g>DnD^2 KkBWr)l+v}\1QN -S 1ty:. e.|D§ -Xzm疝,C"H3E߇ŎE"Vx\UJ9G BWLCC :xaq *5)AwN qupΈ=.}lvۑtYCߢq>pM`Wn7yFbi!w 7}?o^ ;B5rԕM; m CKv,/=ѣ/~\qm19Gsn^gTA"U'A$쿱J+:6p?(S9#eV%NXu#%E#3%5sk[6֚vDέ9CKN)M;RD:+Sb̎ސsHJ0J\}^/ n\ŝdfe RUu$5 CHkiao]4S1eNcD~3Qu:E nD8du~x[ ,C]gQEkI%Qm*D_O]d;XGEMw6f%ʜSf#PvkY<ՇwP80psI߼Y?ġOFcbF*7 r"PK}JX!PK"8META-INF/manifest.xmlj0 }{m6t:Jj\ڷ_R֟m=! -y>XS1Փ()j7sQjt9(}.Fjv`jVZEz4iU!:޵U*>BiEJ1e5B r>MyǣsLK|4Hc-2LއmvnhCa\?7|޻wS<z>JbvB}D-dtc}Haܔ? {oIi2# 8My<%76gtn+cçxKO\}PK2BNPK"8.++mimetypePK"80K Qcontent.xmlPK"8hr1H z styles.xmlPK"8 $meta.xmlPK"86z Thumbnails/thumbnail.pngPK"8'H$Configurations2/accelerator/current.xmlPK"8$Configurations2/progressbar/PK"8$Configurations2/floater/PK"8%Configurations2/popupmenu/PK"8G%Configurations2/menubar/PK"8}%Configurations2/toolbar/PK"8%Configurations2/images/Bitmaps/PK"8%Configurations2/statusbar/PK"8}JX! (&settings.xmlPK"82BN%+META-INF/manifest.xmlPK,mumble-1.3.4/3rdparty/speexdsp-src/doc/echo_path.odg0000664000175000017500000007062614010707343022234 0ustar builderbuilderPKd{6.++mimetypeapplication/vnd.oasis.opendocument.graphicsPKd{6VersionList.xmlN0E|5{DZbEUX}dO%?"8m,s޽#AoZ t46<tf;ZB*diRf|NČfc(3Xg x/ Ѷ|C]XQԠPx9,~q)?\SI b}]UKGoe*-G|#OO?RI-R'PKPKd{6ϣ[[-Pictures/10000000000000200000002000309F1C.pngPNG  IHDR DPLTE3f333f3333f3ffffff3f̙3f3f333f333333333f33333333f33f3ff3f3f3f3333f33̙33333f3333333f3333f3ffffff3f33ff3f3f3f3fff3ffffffffffff3ffff̙fff3fffffff3ffffff3f333f3333f3ffffff3f̙̙3̙f̙̙̙̙3f3f̙333f3̙333f3fff̙fff3f̙̙3f̙3f̙3f333f3333f3ffffff3f̙3f3fOIDATxc'F*U0RU<4IENDB`PKd{6 content.xml]nߧNۅd]}I'3b]Š3 #6w$QKKg߯OR^t!-ɒl9I$1ϡD~9!~ۙ3.Pj^n0U]Bj β8 AMܤ `XԺoؽxIՙX;OiTW ߙ)7+WQ& v1GѦk36 UɠeM`z;KZyUxD o$_>]jm[i|b5LѰ81]{tL4|I. mw39FyT57'#/>2|L"7g}8/#{9r.T 63)P$4ŸMHF};,/P)Y]$tLg_sq'(][2اqk¼1\F PXVsiYgF[O]^gC ^(w1xtиPFc"4Mc5srY8]AtIa9Xus|z;?5{9jD\QRBdT|#bF1BO2~W%tRIgs6?R6^0"BjEv uw~F]]FIQ=}DPBRyY^~iX2iTqӍa)?UbQ#H>z);BȧBz[o6 { nOKhﻲjqI"'5$%`㬲xSݓ2`)wu!=oF)۵#P* d6Y}+;(?/7P%<ȹCaǚ:Tq}@tCapbDsSŮ0 KNaj S0Tæv=1S bæ6Ű)}vTRv-{Z\ $p:yuEښn=70"-meY4WWD [sl{ +"LawG&N g蓜zl"ēC{_~-()KDv]i7&L&ojq?'Y T~k厗m[4G%.}ǬϫvJX U>.ç\Z(&-1ϪVt7_Ѓa:0?wP'6(s89gavr,6kSkgZF"V%} ~L0 4j @&\톒ޓ':E$L7Э}f Yv=8j,yi9eHw ;>*,v +k}qn9onwWJI>LS:A#•RmCC ؞eLZzEzO XQ :jrkd(pѦwC箂s;;V*k_T ,́/~zlB!Be.@¤gV{dzػRZ_)ja)mc ĭf )q)\6>FwhGeZ:cmE<ޠ>z}ya?VYWೀR[]9(fR2q (Vj狆ͥ}_>ɜY9~>1" ٮ b;1:#\D=L'=*%4{RL.,E !k4 |#"z9!djDh1B֋g9>/OFC~~z="B/Oh9_y\p}p5.|M?; oϷ'%tMh~r_:`OQ!?p O9=`XZynɤPJ'r3r;9 ಙy-r }yG_)Y&dzDOՑNqX$k]n&T2WٛpȕQAE='E7ՓCcmsDͱvvn-u<= O:Wc%}Qlm/O+%;Aq⭟:zzT Ee/2GYّ=ZFkEjEq":m޷зF_{u_{} Wk<| D@j69hGP}s HsqS]ۓ<3' 8AѫMA8 6hhy_͉`>-r9BS =lBVmqHJ[XqK{ʹ*riqq֖ AF=dhe~fhKm%ljȈT~}'7KRz#Lٿnb&O98)TR YZa[XZ `'9Nkȗ;gɺo1}/+yӪ5Jr;{Y("*;WqR)GgYMKmEW 1eCGOdSh{&FT1X?"+n3h5RaT8Yl'Czo7tQWt:7Y̩nF Β{ǜf1-T(Ȃzr*W+ #iwZXdksm;# fƩ)W)焎4%LaF/SB~^ L} M~Ed2eU)S9 gP8B+0$_),Mbg笰p:IdV-4"i'fڳDlkeuDcǶ1v8ߎsV凎9 ymmC1|=l`|Y8nwBdkօR SQI#mE0@Z0_c8.Picp;:Xk" W)V1~lN4Xzgzk-mk$~JTg4\iϙd%;=]-E\:S^oSPKJRobPKd{6 styles.xml\_o6O!p&OطzE[Eѽ}.hؕD_' ?-9ٸR sfęg1wܵ~%ұs!oP|۔7vnysW6GٷI* ({HA}CSxdl4kj;}wu}r#H9S?TcޯomMX'dt9\e]f lK8D_=W@VIL@s!O!g"Œt23&2M45P-k]pj.x$n_ ´=^њ%Z2+V1j*/cA׷,%d,̿[|kgZTreUUz1(ܨ"h"gwD)0|k[n`Yg]yzWØXx7+Rg#V]'ACY3sY+G'`gt9E~ĀOd Vm) a:ݨkU&iV5)f5a $Yh׼9D9D%$&!ENpQYIĮ2SlܺcqV8 qN#LF‘效bCz *kg`+ @6aG- )-[GM^% )Jd͵F5'9/KWeaSY?u;FhgC3 c w#gn{"2 ;sț%$ L ̤u>}v!dEJZU@mjSZ56UՄ~-q3M(d2d`b װj Kr P  üY0""wFE:Vyi"pFsZpv$=xVQaqu ƽ-kM0xlN".VqR᭏еDAMlP41E.1y%zI7Rq'@D;2I4UW5k.]>%2V-'UCi2HJM ^nb(e<{1X? TM=Vk$R50ٲ֣~#>,urֿ֙DG-gkn Ї`Q D<&zS& {֊Go4[&!.so{j@ͲXyze_DiG+oWt|:ƞ*YV'|.>i~[G哴\h?Tn'[[Yk׳n0JIv Ԗw /f6;O^ҙwjNMҩIz1MMҩI:5I&"45I&e5I]FSBkM_¦{2n؆ amnl]g9:^{Su._u ..,MNuTWOu 4S]=S]=՗TWֱtXYo5 \Aj=Ei\iLIWq^ y0gjE/RW}+ B6:g/y8&!ç"RRkīٙ:2Th/;u.AR_pW$ iw#Ɗo܇NMaPv=<<:j -n&,fo=TZ p_ȹ0%ÖaW 0SHy#x ˭K?;f!%Tkl!<׺V1 OpenOffice.org/2.0$Unix OpenOffice.org_project/680m5$Build-90732005-12-02T15:17:44Jean-Marc Valin2007-03-27T22:32:47en-US28PKd{6Versions/Version1yT6 ]" 14 - "H 1Cw "twwt ҂ zuϬ<{缳GE"!]#;ފ-n6L 0( 3q8`v` l :,L,! GpoE5X8;Ph[QPo?0n:ݹfkUlgj~)'dY1Jήr' Qq&<4[?j]#ņ@ QOݑG!2,  }㒫#͗(A]=a +t3,$ L3󟯱-Ct4Ĥ'LTz ndNE=[ i& dz1Uʡ=*cbDڡԟ$ m/|cSB6,MG Rk $o {DDOBg̬T= Ɇ#.KvU#0z7v\O1H'0d~R/snՖzB&8f$ľ{d?)Ji6:_fezb#zELM%a)^2r9`$Z@ ֋Y-lt a<3TBLђ 7?}|]bXZ,&!y;*|!a -p6?5Vyȣ:hk?iST$IN;.֚(.kpDsHDe!!Kq`J>b6DQwFyڐA7% 7 uCJ[*#F[lcj2}'[Kwx.VD {\DdF GױNCQa$p:[1-Wql_X60*S lQI[3 LbWUJ8TvhJPMV8fwxCЋ# a4E1ѡ6ٴRsO%_?2Dj}GwJM@G{*k }ާWo#av sJՈ|O7ޡj,45q?3`F4$z)(֑] 691_4Dڿ)o#;l5 >Ըr6=88. S0mNY(SG󁋱Z)tǯ~y=3ŜU+Op&/je7n#U]-{3@&ʷPDQg@Z2E>4WH4QKX=V_uU-Or6_YFj[ cfvisTKY8xlyNTLSS458kݫJn0bZQp ^-V0LcY 3ljd]Tcl@`(|*R`k@B>?0F pYPQK!c3yGzCw|NsVL~q[(Qd>-\b8te]a_6׾m+:|vE2ށd$&0%C񔰓Z֦Mח^9K>ޚ֍PL}Ƥ=qmwTbq95="mQqLOk䔑pvVbDcPGz.,21뉓kƨ O*5oya6rX(KOg[}(&^ r8LEL]T_X,{~'([[聵JUI&[vDNT|WNѳ Wo=<֣ Zja!Fz4/݂-ODh[+XYY.6 lqYP(S|eKGD_F3@`r=aBOqX#Ŵ㭌$) ȒM>ГaIShW*lOOYjQ(y(MN/^A(|0`-]5}Wƞt `>.HDr[T[Bmj>cyPA:ӝbbx1͵r~ Z~A)r<-wYh#5Zx>XIfBSx1;%,2pD?̄m2dmt4u>hOJf:EиjbVl NĽ$:7fm y5 |Z3ad.R.T7k :Z7,Ae!HfyNux(Q&kbQyD!6DS<؊ԛ\qѸPYaر}@fxђGB-5٦YzQ:rFkrSmJkNj_[y"58ʴ}RN"SfC޾H{bsޛ[$-^uSfAj J45Iq8qYO[{RkǼƖ(>lX(x_-uh$dtJjK nGYCds0n#L5,J|4|qc v5c%؛LkV6q"{Eϒ;^gMR Kjh<RSOq=QX+IMMFTYcI}T$gƼ8]*8.{9N|<0G>+ܸkHQ++R5@&R]mf!VOYыi<e~k9Z-LrN!&]4˲fyñ}ʦ4-RϧVz3hr7#3//STlYgrrp"TY]3;a} 5uH9Ƹ.b6Ml7;ÚJ17yyA^V噜(+rf}=:YFQJ5"hL&q ßƓ^[-$2F[ug /d+mxtFMzPKC,\v=_7ED]]& 3WqHsbP(o+Ǘŗ_s 1׃x:=bxfaPfW~xyu(BC@V:2,p]T46w(Lb۴ۤ&37 j8n5K$E U_w篝[բtɈ2=ǀRo!, Hpdbtl\{bv{U"ӕf oK1E›-+/aJCcXNȶ 7۰էS(ƓlJ.Vb-/uhCؐC6ɱj$q0*{X=Y:dE'VهR8U/7I:yCW(0O jl:b/_$29S=e'p OmΙCC|W9ډK܁7а(QA~$"V_e BU$c gzYD,C!' SF^9; JK99>c{D;x[>SA|~iWܓ<_ɮ0+u%0$qA]4i6*⻃R-mCtvI L51YOx:.n:<}?Π/|Sr-]UZܘ DLm=u"+KI⡭>SFam.1 =x[',yodͥ[XNd4aT^N0 *k՘s1y wɒ] 3jfD(!&$n{ȘD+Xwr;'Z`!c lvA5֔}LI" Zv`R'/rV`Ѕg^viX1gСC0dfXoJYN1v u%.fG1Xc658&M#s s&* )젗> ſTg}ݿ1j]MECvmjǒZ+{Å9v/YS[%fp4_>V=4~J*տhl2KلeJmwχ]!܅Yۄ彻0#Ac?YgFYOk +o$aBXk9O?Nos_5H~O~d:OD1+ cPFnPK, ,!PKd{6Versions/Version2zT6! () ) J 0 1t) Hw "9"H#݂1H = āMl*5f+zĊ8!T#dǦoxTَG/;?Xmf+9XT&2'9阖g$:B.D"՜nc繧+T8AiDTCѰU̯n1>N6o3}3_Ffq&BVf;j; Fώk%,1 KS "X2{-ꊀZėRbH4(}Uq{7 Xqr=zB667Ra %֡f/^89m| 5.SȪ`!b'\$f;.9IC "|j8%GL*o'|`ߟQ:$I(B_c$8z.zyNJ Ly+]Žv4f87 *9sLtr923DrAfp@EQT˺BВޝ83㑱(#דr,a>Ld"^VPv۾FB 7D4?Qjޗ: 5ңkDP2z l|+M+j7Vݯ`_PY߰-i+-9oqh(]$3vEs3NmbG~Z |U&18d{W4ӻ:5P@DRMk`"]|h@ZGYx3(Q07L fփ[,ReqE C!)s).8qvy:Lw{s]'rGmΙ}n|MC.\m""`0DCgn3fvLR![پMƬ%wyJ^(A|X͸TRY!~͔SwfpwDf ՗$AkTau8r *LtI\;ڐ3}߇>"UuQAJqq ZPKLb -#P!JЌMa?<-3WPd ot&?6tc_H2'jYyl>UIYzwa@:}F}Ȇ4i=A1efxr>sDJ,7n_>TvFDQ0u{1<+a&JqVҚWW4cx`v0ZڑlSp ]-v&=D4IKW텎 Av|W a#6hek[d÷5F 0V$n砈Bk"J[u0;nKosRcՊlj an}n|%U1jVɏEo_ X5` jy4žEH !nzNɎ[0u$hO5phUkx@ )A+HmW:m"k[ g7XV\ǴIWHoRvC]UQ)4qmiBܺ58R`,-;YqoZmg3jWf7nx4Mn=oW©WGڿ~;b9/̻[mB@ѝʹ0qV;X1c?gSs̛2iAi^#ƍ 1v+`$kRrLɸ,ˀ'|ǒ2iE Nɍx]4n ]H:-hIBYJJRY_1|#Ϙ0t(8-MYγJuRՓm̜u9pk^}4fK%g$oF*.ΩabGbB>2oRhYS<'"&DM9QǞsYvgO%Z^ٵЬFbJj!YeLM`o(VF9-,F|l: eNT0Y!]\q9l/"] n|u_ :/ \‘`SG8Z^r*畹Gn9^zHiZ=-Mt֐t^Kǿ/LFkOTxЩ3UGj`D! Ib;c4eBC"^Y1w?; 7RyL~r3ڂb/G=D@g0q>"qx雂^:&qf%Vjj' =Ah0S|.`ӛS>37m2@9WwaYH^(:$Ɠop9{OHWMEA0(}%rVe Qɴ:a^_~t39{bawz̧"dZub[&ޛxԴ7Pi̴\;"5*[ *GD#e&P3h!nA7k=o>: phmr 7g+I`.I r?i~duyi#+8rfӰ|:%6F諉į*uAqKx)ݾ|kZ\ooA!i EQ~^B6.k O '.5LUN#-d̽ǘBbCS 5Er_7Uc*U)Buft![_. K4|rq]ZJ] [Y"X~^jCTVyyF !8%.A֬H|ȴXgl+둢 u~M PyBIQ;+ HC U6"A Huy38I2[M䊐N<.KbLM͕忁|D ,l%V))& b P{҃SŅ5]9L$kɱ0䋓27c,9fˈ,3g)^-<8>\xxBkJ:/AȾ,rV1mSxHy:WC{ژ8Y5w'E+=Tg TĄU,B?2r5ÇǙ90) iVVBx T۶!k3D]xZ^,Eu5ӝNk@Ղ@LAڞx^gɇ4y) VmAw_/@F1'bj%/1FU69K{SEfOo)7ҡUywvjW@ږs,QCX߰T cYymJn+_# Flߑ Ą0((#[\Wz7 dcC0j-ɨ `•YYA`|+*Eg$3TG:Q jv~+g=j'h;򺻻 yEEEy 9:@`{^~~޿W vj}/ ״a. 98^鴴ͧP oSBvwY`g 8YJO=?((A{3 d]! n@@X.: %/'/,OLH/8 Pw.Zߍ({ 5X OO Mzs)~4Q;WV\JK_O_T?DW37lA?jKQjg/0o0`.S,jBᒌB|f ͐ vЏ%Ќ"wTy^aD Ȣcž&9)̬bsRu^xG k?S*.m`wǷ R/ΌO¤%o%K(ZqkɿlN|\&- ^N|>ie eyd4P"Vdդǖ@]PL:4*xQV82} Z*i^ -)==Hz9z%NԳ`m)m*j}XV\Y;4֛LF/Y]j+|]+p"3uI5/KL>m$gYrRCMG,9jɊіpcObt|WeE x 0 Mx)z8u ,1ael ú΢dgv׭)MY gjO;J3Hٿz,X}&*:qN'#.1ytARn.IJ#&Xz2Z )Ҝhi=\TSQ=:"hQ[e·OmbUSbE obx>86ސeZY2HjP.kY>Te%1<¢ ZH`5ߴ6hrH(hsFJ)uVR&k4.[b;Ogqv23ǦSu1<[|`2dp0C>̯y/vEc M)⭢dWe& R5r|Rq8:Z 1`9Bp55dhfȧ [g:Ω$Rp!yeC;S)1"$QD4n^$%%4E.]M9f큒'fJfmY}/JHAxS"i!,sFlZ6QM Y fHM'Q%q6wcpAw3tô۹cpܹtEov@*I~.)u9xZ%DM(mXrtvB=erHݝY\NVSt |j73_r֜|ni$AEZUa0I oK&d>ݪu޿m<csAE6GKtKybiJ)wMYϱtƥһ= ¹{ժVW| B]1Ȥ.|b0 wnථV1lrͽAiH(&A=vg l}Tq;h:3=@AdȯD]AW[EC*8^ծ(yB1]-IN5,"BF (WO7>-sSi~@?c$B3XaXw:Hϸhe3Ӳְ =x^HwF3â[[E Is-> Td#ud-crTMTKMipKHNQ"{׆-n٤!cx}>g;U? Sw & PjL,ȑ69j1/|}xgc!z|ﬦ)\J.><7x(L~]d4s&<*L((nFE#C-7ssq~c'9k7Z $`k:O;\Nd[\I A{'q"9E/*&ʏF_?PK6Y>&"PKd{6Thumbnails/thumbnail.pngՕ; =uԃz% sK"6pTȽH[G(GF )9"(16fѶ>y}.NT|e37U}ۦ?lk/'}u<`[P{d=yzF6#K/Y͖G WJ+WɢS~,R"veh(c2?LOJ R‹;Ym>2|ua[jm)5 .ر&&&hJRt%94I wRtØ7DO᧧>Yc}}FpL ߟT>v:pfQݏ)d%I* Zq5g8l> -C/I$:N#$EAkL!$M~. }BHUТ6^,jq{9!,txhfPjqW Gi0q}yp0Oq0/}!rNe#^LdL+ : AN v,52QsA6 M=lS0izR)vƆ^\#E3-Ǝ*;U瞱޼Gc ~Ae{1p+Iu*GP+=ۈմvIX Sߨt"689;ãtg e=›+ $ӳ?kko;Yc06KχY^.&\]9V ~N!l!aVZ9"__!eAD?YU]],UK W@G1ts  ղ*1j3@aubH;Q#r!6X5cqXxxxY#,0|>0sa{Gi~ѝK|j[,L7539zoݫF}W">c:]7}kS)3#j V>8| l-=b6S{P͢#fjJxfeH.vdl5w9Ο8߁V*%i+ȶvOzoG'pw$*R,&$F?:ytMaǏH$q-QRPEdQ68! DjJYN=AsY5ʊX_a/EY|I}hۈzQIC,|LS. sM7v];QZԟi桬kƁ{Ѕ!Q@ƑV7qD 8 -YM]JïOTj;Ӳ+Sڱ+|ss|%Dx!uYŚ 8DA8:޶ %%Qܺ~|M 㘝1whԉ =A!~2)/.=,0sU ,Dk10'bM±z縖ېf`u`޹gШ(HR x=EP plpC7zl q\OPKVjPKd{6'Configurations2/accelerator/current.xmlPKPKd{6Configurations2/progressbar/PKd{6Configurations2/floater/PKd{6Configurations2/popupmenu/PKd{6Configurations2/menubar/PKd{6Configurations2/toolbar/PKd{6Configurations2/images/Bitmaps/PKd{6Configurations2/statusbar/PKd{6 settings.xmlZ[s6~0}hC0$lcn \M h%$ǰIX9.}fcn\|GܥF:RI}-vK }P9_7w)"".EanYqv1$\YaDw^1 2l L81%٧)yFsQ6SJ_V 6 :]Rs6u=)  =Fzk7.|siv#t/]J^|A0xTԺk+eLEnP=9H_cng)|F /]q :\0UF[#1 ΁\0 M/343J1$Uz8uFɡ?xU,cw#“#QMDIO0ӷwh:gPy%LCn _Ky_j{#C:4[S^ޗ CWc$\Gw8r]Bu9us'KGn*4Ǣd>jSS۴B1=1~| ه>ګ9|xR.(}ӇXhQ a()}2J} F҂+Qs3>!Ae覤H@>Fz4ٹ.͢FfkMő?W؉ pAYBnZ/;BԱU6tR~{]Ȁ,9ӌ0#fQվrL=&ahjD%'8'DOؘR~#)92G\6`'p(m.,L7~fz^8dU Ce$Ay-Ao3KNgz2b@fB]ULKR~j2ښzUڜ&'|>/l.Ow͐@}ȦL2hk+Ht}+fVG-%vQM9mq]w`!>׳}=- #&>~Rb]2K kLxCDtgC:iƙ.8yr(vRB&k' %"AFR p(ghՂ QlF]w@e3L.5[YF}u\H#qh8=<9S{y&6&LLt)(#K#BΨCfomL2F94w7t}uW۬\j#lܔMsї_k|Իt(?ab[Պ[cCߑsw֓6*nžaHh;V-h\NF^־ꉩX&oUY5&]=.ƺmz[ar9oo|Mrj,\&ޢ7rϮ5*,WݺT3/|շ.Bw[/ϑLX\ K-N62Gɜ+VPK|k%PKd{6META-INF/manifest.xmlMo0 *w` ;CpK4b_6VRGJv8<*kr6NG,#F2ggi%*);I2g TQf$3l ~ aXo*%tp3VRP'ߙMzJi*J(C'h3x'۔T)#SULy$ǣ3iF/"m}sQH#oIPC'>{V@A~2Q~VPP9 Pe'\H \+ZQeԸ mA, >C|CVGWEp$(&"8>Versions/Version2PKd{6VjT\Thumbnails/thumbnail.pngPKd{6'bConfigurations2/accelerator/current.xmlPKd{6bConfigurations2/progressbar/PKd{61cConfigurations2/floater/PKd{6gcConfigurations2/popupmenu/PKd{6cConfigurations2/menubar/PKd{6cConfigurations2/toolbar/PKd{6 dConfigurations2/images/Bitmaps/PKd{6HdConfigurations2/statusbar/PKd{6|k% dsettings.xmlPKd{6r %e jMETA-INF/manifest.xmlPK|lmumble-1.3.4/3rdparty/speexdsp-src/doc/Makefile.am0000664000175000017500000000006014010707343021624 0ustar builderbuilderdoc_DATA = manual.pdf EXTRA_DIST = $(doc_DATA) mumble-1.3.4/3rdparty/speexdsp-src/doc/sampleenc.c0000664000175000017500000000342014010707343021706 0ustar builderbuilder#include #include /*The frame size in hardcoded for this sample code but it doesn't have to be*/ #define FRAME_SIZE 160 int main(int argc, char **argv) { char *inFile; FILE *fin; short in[FRAME_SIZE]; float input[FRAME_SIZE]; char cbits[200]; int nbBytes; /*Holds the state of the encoder*/ void *state; /*Holds bits so they can be read and written to by the Speex routines*/ SpeexBits bits; int i, tmp; /*Create a new encoder state in narrowband mode*/ state = speex_encoder_init(&speex_nb_mode); /*Set the quality to 8 (15 kbps)*/ tmp=8; speex_encoder_ctl(state, SPEEX_SET_QUALITY, &tmp); inFile = argv[1]; fin = fopen(inFile, "r"); /*Initialization of the structure that holds the bits*/ speex_bits_init(&bits); while (1) { /*Read a 16 bits/sample audio frame*/ fread(in, sizeof(short), FRAME_SIZE, fin); if (feof(fin)) break; /*Copy the 16 bits values to float so Speex can work on them*/ for (i=0;i Speex Programming

    Speex Programming

    Encoding

    In order to encode speech using Speex, you first need to:
    #include <speex.h>
    You then need to declare a Speex bit-packing struct
    SpeexBits bits;
    and a Speex encoder state
    void *enc_state;
    The two are initialized by:
    speex_bits_init(&bits);
    enc_state = speex_encoder_init(&speex_nb_mode);
    For wideband coding, speex_nb_mode will be replaced by speex_wb_mode . In most cases, you will need to know the frame size used by the mode you are using. You can get that value in the frame_size variable with:
    speex_encoder_ctl(enc_state, SPEEX_GET_FRAME_SIZE, &frame_size);
    For every input frame:
    speex_bits_reset(&bits);
    speex_encode(enc_state, input_frame, &bits);
    nbBytes = speex_bits_write(&bits, byte_ptr, MAX_NB_BYTES);
    where input_frame is a (float *) pointing to the beginning of a speech frame, byte_ptr is a (char *) where the encoded frame will be written, MAX_NB_BYTES is the maximum number of bytes that can be written to byte_ptr without causing an overflow and nbBytes is the number of bytes actually written to byte_ptr (the encoded size in bytes).

    After you're done with the encoding, free all resources with:
    speex_bits_destroy(&bits);
    speex_encoder_destroy(&enc_state);
    That's about it for the encoder.

    Decoding

    In order to encode speech using Speex, you first need to:
    #include <speex.h>
    You then need to declare a Speex bit-packing struct
    SpeexBits bits;
    and a Speex encoder state
    void *dec_state;
    The two are initialized by:
    speex_bits_init(&bits);
    dec_state = speex_decoder_init(&speex_nb_mode);
    For wideband decoding, speex_nb_mode will be replaced by speex_wb_mode . You can get that value in the frame_size variable with:
    speex_decoder_ctl(dec_state, SPEEX_GET_FRAME_SIZE, &frame_size);
    There is also a parameter that can be set for the decoder: whether or not to use a perceptual post-filter. This can be set by:
    speex_decoder_ctl(dec_state, SPEEX_SET_PF, &pf);
    where pf is an int that with value 0 to have the post-filter disabled and 1 to have it enabled.

    For every input frame:
    speex_bits_read_from(&bits, input_bytes, nbBytes);
    speex_decode(st, &bits, output_frame, 0);
    where input_bytes is a (char *) containing the bit-stream data received for a frame, nbBytes is the size (in bytes) of that bit-stream, and output_frame is a (float *) and points to the area where the decoded speech frame will be written. The last argument indicates whether the frame we'd like to decode was lost. A value of 0 indicates the normal case where bits points to the bit of the current frame. A value of 1 indicates that we don't have the bits for the current frame, in which case the bits argument should be the same as the bits for the last correctly received frame. When a frame is lost, the Speex decoder will do its best to "guess" the sorrect signal.

    mumble-1.3.4/3rdparty/speexdsp-src/doc/speex_analysis.odg0000664000175000017500000004030514010707343023320 0ustar builderbuilderPK .i4.++mimetypeapplication/vnd.oasis.opendocument.graphicsPK .i4Configurations2/PK .i4ObjectReplacements/Object 1 s qcd0dFid209@!& #%+PT8 R5 O Ȳ[I~brPU6PT8 R5 O Ȳ˛I.Ģܤ9 A,VᖀPځ6 PT )Jfg{b $8 )=8sؼ,Gr|;H3d++&A e9B׉*l#H~ӌ`NPK 9PK .i4ObjectReplacements/Object 3 s qcd0dFiddDn@f T% T5(TMg@!$37X/\!(?71bX5XV0n5YN j;@Rn6?NeӔt"P)&QiE@% pgNE W,PKrPK .i4ObjectReplacements/Object 4 s qcd0dFidd 1,$mf@U@US,@>H4jN>y. ,o$K+ss T3LX&g[fv@bdhbVk:ڠ@P:LL|pbF ,ƀ0{,$?CHfnj_jBP~nbuqKc9-L2Ri@:ȨJf\D\T3"iE8\PK~nPK .i4 content.xml[[s6~`i߸c8;Ltt&lD}/$n€!RQJ%*%lt&I4 A4!L71 =ke$9(累0ɂy9(+x)~Ne)a RsǙJxiFX*&K͘L&-JxM{ [, ~WT)ZsHzCRаjL`BYvcHӲw=-;`V3\w*/ʆ ]uA+]֠{o31ƥL v붖= ܛRHvo/DmQ>C |b._"0ldNΩ`*ftYAQB& Q iAzB'Oӵp[V:LSx$'7YDO)->ؐsPͷF%K(kݢK]Wc@XyJ&pb\D &zP E#/% @ u` 9# (+LgZMA-)-OLWb t ~eIFYA\^ < QTRuQN+I1YWR3}ӔTPcaCԶ`}6ciVf=.@Gg]|EbOX'GwE?\g]&Lp =X>c]G%aϹxK;8U_TiĞ|s7o&gR_nAͨZ~b| ˴nerC?FG zr9;+G86N/]AԈ$|:u<3d!O0s|0AFc6nL{歇m8AuN O+p)Y7vgۧ1mFDIbIȒ2a*s*Sf|qIY!dU"d{CTD !*ϕiw0+ӓ#\un['T%Y6'/7˶@q_ &#̟e?_xʼu$CgAi r'sW{wCpoF+W0%[>1]Bt4=,z)e*?ux/1\6T} t{nvn7nVcp 7E:Y5V9WQt P1b)ƯElUQVg?6atEb&3HP3hɊZs$kRNa36dm0h~6ܪZl3:rY9liff 1k/ .pۮ^T[x2>uއʵΩjQ%"׊ȵfg5ruz݋t$l zd@jY֤6 N 6  q. 8E# @ F/OFڡO2헷\ϭnXm'"{ Yy\sߤqUw,;羉gʹoUwsŬ.U|ۂAjN~g ~goQ7ok;E ) S:f_k[?;(q:~*5r'*5Uk>|DYRXY:zϓ*0'3ZuZEW[z@[; xy:Xؓ%eI|oě.`=q$\=mUٓ.}nE(#WZPKNt@PK .i4 styles.xml\n64td^bð C3 kDl$Q8KoO#?T$9R$n(jQ821MV;sL'> HY?j/;aH| 8Vo#09ɖJ2s,)HLP%4I9ik/RjD>lt,tszRY0:Y|EVH-)7IVtiۻn;QbaKie_9V8bvg]Ƙ ]ݤ$ט qՔ T]ifpt]oz` 3 `xmٗ \~C |Fn*m}>2ULP.gnϚnUQWӸ 4smаDݞ A  B(R|Q]Un/Ex`Wbctgkw?ӛ9Ɖ!b,Wm=i_ p( xy27 [⛥ncV) J$rN*U[dji<[;̌iK9,lFP2ΈKVLx|,.E!C$8J>E"E|B4~*uW<T,O# %< DOi5@[`p|e2H \#FqT/7OPp"|'-?v- IEKq!V.F&&š.nȲC4} %YqVyJĦF֔͌$@,0Ih2!xHrY A`p1\cZ[\&NԶ܇ǷʚdמB59$QTyPT.2JSWO Szb M%pȅ%`d$ - C@6hA0nN6ҥ3G͕oɪ8"8"5l(PB1>*%^)VcեE#lxMTT!x9=DsIΑljoRĊT1)rgޫDh~@^%BCț_%Boɫyu`_i^Y]`~[Zv_qK_ /QT4Ǫ~)ʼnh,-lj#q%wPE|DsaN&f-fkj^nj4$+WgXģZ r)z]}^B'f\Rヘg0wPFpTRQx22T3GEn-R;e[\=]>uN1TQ%|#&xd枎%L*un?r{/4U=%E_P|Ci8qq.[e壬\%-BR3oKAh^{qQ?'N a- oǻ^7^'%6Gr~;!:GDNDN"4!z\h,A؁RG;zG>މq520-a޸*bkvx{bVPcg݃c髽#+S_=S_}4M}WO}WO}q#4U.;7zUjܝ&:'~h(Wq^͹h\7Zb"ˁԼUʂ CDB7G8$XDc=GP5Q_v׸Uz]+;_->見V)(a`8niu:"i%L\[9.(/zlqڔ4+T(9s?q`Py B2!hg],1Fl%WFsykq?"W (/! Y 8Xf7;UBJ=*r@ח;ıʼn}zs F%<YǷ3<\jy`Y@, wTA "Oq@d  E IuJ!,:HZ&u];u6$lqZI-ʢ%VKzhTlY(vJ\'O28֦:WϏ'to&LZpՃfes6Rf#ZrpPKpPK .i4Object 1/settings.xmln0)P@OF@Vڄ:v ݧ_ڒC$+Db7x<'M $EqZM9ˎ8?tq>xs:"z:^|D{H$'HOi_0_:Jsz}>?Et[n2GcQ(D܃ؙ̄-ټpNct8$ 9 qhJa5'='L1t;-w(WNv:`*nuQOUϭ˳lhHS_V蒛4tIL(¨oql#iW;Ūm.', ``Q0ӏ&U\lpކ3Eűx{մ35ͪ`WvE*&*"Xհ߀V|Q"*ȉO ⿀:,)uhH$#!/jZ͒| dY. )Un_avwT*8<` Cyos{˚& \Ls8Wa4U;WЅ~e5;uAt2u>j )#bޑc@Y;t$KWqF}+$I_0qVCMɀIH|Sm XW1"EPy-/v^/>$B-USl o#UQE2[0C6Q`xݎDY<խoO1,v3}#PK}tzMePK .i4Object 2/content.xmlJ@>ź'=4cZ$[0 4`xdMn"^/˰7?[lX)Ҝ4.0b<̣m c<#'֩;r2*ijq < 8NCf \)FݏobkC*/\4))@UUF5jd2-N Q.PhTW[BLɋc {֊mgH  /?;=-DʚqΓ@fZ ʤkv촅ӭ`! }\em] t{錋zN_BĉT/,yHzPKЩLdPK .i4Object 3/content.xml]J0{xc6 l'!^Il.ЦVݴ]&?X|VF{7BeM.Ua?[]q_v9vC8#JOBE!35mIcHQH<$[OyDr# &C<sZu]uբL;J(YnD(W%BW2CVǕj 7јz2ׂ[[!+_LLsX `PK ]PK .i4Object 3/settings.xmlo0WvFTЮt$XM|_?ڒeI'Db߻tn6x.(:oZ `.z-ułxF0y&@J5D4t&v׊8s*Ft %Ӝ,){Z+)CǶnm{w7"[婨x{"@zBj~\KuJozi]K!W ׬y<}dܑPݡLZfN[8ҀgUU@5k_gθ#pz 'Re%Yx^BQ"tEb{I(%c—e[.H(z=݀wl_rVw5%Lpą̏JZLcapP ?¬ނ*5ň0bT.а('@`*.&8ODmùEž3xѴ5ͨ`VfE*&1*"p؀F<*K|qICP萌u?^|%ۯoCo *.U|`>vwTHܔWyqA)c֤Ú& 90#+utS۲ *t6L`#X5;`Ptad*ΈoEAFsr .a6I0 2D=C6G+sY S]V$EӇOE5 PK B@EħuUTuy )A,^1Gc[0443 K}l>yHzPK,LdPK .i4Object 4/content.xml]j0Y@0u0)L],M@Hs\'`/gX.Uvs.;pYCV~pGJn{C:a7l5ݼBۇӔj/*I)SfF(`Jΰ\̟)5"1, .62~ PUUP l4BMV\֣KNkwBH !x-mRȎMxn)`11-sQ OpenOffice.org/2.0$Linux OpenOffice.org_project/680$Build-88252006-02-03T15:36:552006-03-09T16:48:21en-US5PT27M38SPK .i4Thumbnails/thumbnail.png; W ,ǤҚXR[N[e4tA6׹2GLCq +Nr:/΋y{~/vsVcρ=@1*SUޞH8@>X\CXsufjݛo3+i;[V[bΩA%C|"{ߎ5J伥Q5N㘎ZR⎷JG)/|SRCSǶ_}Ji Ǫ>Х0zItxsM. [o2MlRT;#fG-,,jT'oRQQYH\!nfLлDyb(Ϝ;)]Q(=QQNFyq"lAOZEVID8? #Zo…L<< 50% kA_0X1}۔7kbTZK`]:-8 NB)pX9q##3pkV[{;BOO#ְbpxCpEb8^e7DqIJjIbfwyRxkfh"i M]CC}'%}n6(@) =M=e5E>2ᜏOGIpq?bb7c%)F5v[ugEMA9YNH]###SmCd(۶RBU+ cLƐ)Irr{v]u22fk@VL`e ݃66.Y[/C :'}"L*zcHlgtuu5pU0} `˥eaU-Rj&E `kKxt߿5UZX8~IqЕ:eg҄+f wUjU YwbzE\仠amp9A7:7PKE \rtPK .i4 settings.xmlZr8}߯HEl *a@ $pɖ%W6%`fmM@N%o }*si.ut~_wl6*@.2-jP۩(oߧ|N , HS`mՅHʒ`zZH # wy#]q$0:SQ֫w3I֊EijyeoW Seks=&l(vO h1wݺxQt'%rC_l.SJF{$}3"Tޔ+OTL8-XܗGE|̟O"~ּ}9?/)DKe [<|u cM! T1 L2K8uA3@:ݷgEB)%Do9j>T70EGE|/ȑU.jf!ңLPHHV7 ]5r=#`S QUd P\\^\fRmep R'>>檤HUhOƥR s^5P-fIml2# [. 0x[',7--C–6y!^f t}LZX ~yUU% "g}tXkv-EHf\AE5i3w@="B14,c} ]C1eFcS8\ܝ/H>m[_yTp<+@/JX*Ea, #&sǥYW6 L.qRBepW>XZMz;(UXhb2B3Hd|^'wbix#.',&gĩ%0m:մE4(1J뮀p^utx2~:*>[JzƄz˄݉1(:QL#!zKׄ8WO^;|BM&))`(Yiй9Ѓ4%ԩFʸ bۘ*FxﺺRog,~%Em fkiUo1j%2JiOHI{~Uqo6W=wh6UbNfq8elXAґe5-b%ZznwkUsҳeZZѵ9Zt<wdR渄ش5fd:vtܪ-Ε鸙ovlULRUW,w8nhÊ4*hZ~5 X/g%)պY0jvzTKlއUĽu&#HYr3{Uzi)-a:7Н"7atO TUk>r=9?'1xPK~~$PK .i4META-INF/manifest.xmlVN0n"BP9ie'5r?CEDjo373? =J|H`$47y'>G*t{zu9D8t\ =21UNh2B5sSzvH )9(m*f5+J w`}gRJ fe$gC:%Zd+VN%!sJE%i)*h&qp3jru2v~S|fhQB HLU0'Oڃ=mbãp'JŸ Z6wKngvwKnoCko b~OB8I^ s%lFm~/`o?ƙ~74vt-nƱnu n+ڎ.YM6A3,zHJ7Ml}B=xPK7z5 PK .i4.++mimetypePK .i4QConfigurations2/PK .i46?ObjectReplacements/Object 1PK .i4 9ObjectReplacements/Object 2PK .i4r"ObjectReplacements/Object 3PK .i4~n3ObjectReplacements/Object 4PK .i4Nt@ mcontent.xmlPK .i4[z:5F  styles.xmlPK .i4pObject 1/content.xmlPK .i4}tzMeObject 1/settings.xmlPK .i4vObject 2/content.xmlPK .i4ЩLdObject 2/settings.xmlPK .i4 ]xObject 3/content.xmlPK .i4,Ld Object 3/settings.xmlPK .i4VNf'>$Object 4/content.xmlPK .i41Ld%Object 4/settings.xmlPK .i4!!pjj6)meta.xmlPK .i4E \rt-Thumbnails/thumbnail.pngPK .i4~~$ ~3settings.xmlPK .i47z5 9META-INF/manifest.xmlPK;mumble-1.3.4/3rdparty/speexdsp-src/doc/celp_decoder.eps0000664000175000017500000011602614010707343022723 0ustar builderbuilder%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 442 315 %%Pages: 0 %%Creator: Sun Microsystems, Inc. %%Title: none %%CreationDate: none %%LanguageLevel: 2 %%EndComments %%BeginProlog %%BeginResource: SDRes /b4_inc_state save def /dict_count countdictstack def /op_count count 1 sub def userdict begin 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit[] 0 setdash newpath /languagelevel where {pop languagelevel 1 ne {false setstrokeadjust false setoverprint} if} if /bdef {bind def} bind def /c {setgray} bdef /l {neg lineto} bdef /rl {neg rlineto} bdef /lc {setlinecap} bdef /lj {setlinejoin} bdef /lw {setlinewidth} bdef /ml {setmiterlimit} bdef /ld {setdash} bdef /m {neg moveto} bdef /ct {6 2 roll neg 6 2 roll neg 6 2 roll neg curveto} bdef /r {rotate} bdef /t {neg translate} bdef /s {scale} bdef /sw {show} bdef /gs {gsave} bdef /gr {grestore} bdef /f {findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding ISOLatin1Encoding def currentdict end /NFont exch definefont pop /NFont findfont} bdef /p {closepath} bdef /sf {scalefont setfont} bdef /ef {eofill}bdef /pc {closepath stroke}bdef /ps {stroke}bdef /pum {matrix currentmatrix}bdef /pom {setmatrix}bdef /bs {/aString exch def /nXOfs exch def /nWidth exch def currentpoint nXOfs 0 rmoveto pum nWidth aString stringwidth pop div 1 scale aString show pom moveto} bdef %%EndResource %%EndProlog %%BeginSetup %%EndSetup %%Page: 1 1 %%BeginPageSetup %%EndPageSetup pum 0.02836 0.02834 s 0 -11113 t /tm matrix currentmatrix def tm setmatrix -5152 -9418 t 1 1 s 0 lw 1 lj 0.000 c 6935 14318 m 5435 14318 l 5435 10318 l 8435 10318 l 8435 14318 l 6935 14318 l pc 11436 12317 m 10934 12818 l 10936 11817 l 11436 12317 l pc 5831 11966 m 8109 11966 l ps 6425 11966 m 6425 11636 l ps 6123 11966 m 6123 12366 l ps 6727 11966 m 6727 11707 l ps 7719 11966 m 7719 11872 l ps 7070 11966 m 7070 12248 l ps 7439 11966 m 7439 11636 l ps 5830 10920 m 8108 10920 l ps 6163 10920 m 6163 10590 l ps 6470 10920 m 6470 11320 l ps 6726 10920 m 6726 10661 l ps 7109 10920 m 7109 10826 l ps 7417 10920 m 7417 11202 l ps 7699 10920 m 7699 10590 l ps 5831 10921 m 8109 10921 l ps 6164 10921 m 6164 10591 l ps 6471 10921 m 6471 11321 l ps 6727 10921 m 6727 10662 l ps 7110 10921 m 7110 10827 l ps 7418 10921 m 7418 11203 l ps 7700 10921 m 7700 10591 l ps 5857 12918 m 8135 12918 l ps 6190 12918 m 6188 12729 l ps 6497 12918 m 6497 13318 l ps 6753 12918 m 6751 13247 l ps 7136 12918 m 7136 12824 l ps 7444 12918 m 7442 12611 l ps 7796 12919 m 7794 13248 l ps 6935 17818 m 5435 17818 l 5435 15818 l 8435 15818 l 8435 17818 l 6935 17818 l pc gs pum 6263 17039 t 219 -104 m 214 -66 184 -39 147 -39 ct 120 -39 99 -51 85 -74 ct 74 -92 71 -110 69 -147 ct 268 -147 l 266 -213 260 -244 245 -277 ct 224 -321 193 -341 149 -341 ct 71 -341 20 -271 20 -160 ct 20 -55 68 9 146 9 ct 208 9 252 -32 264 -104 ct 219 -104 l p 69 -192 m 72 -252 104 -292 147 -292 ct 171 -292 191 -280 203 -260 ct 214 -243 218 -226 220 -192 ct 69 -192 l p ef 362 -412 m 418 -412 l 418 -458 l 321 -458 l 321 124 l 418 124 l 418 78 l 362 78 l 362 -412 l p ef 508 -332 m 465 -332 l 465 0 l 511 0 l 511 -180 l 511 -250 539 -292 586 -292 ct 625 -292 642 -265 642 -204 ct 642 0 l 687 0 l 687 -226 l 687 -299 653 -341 595 -341 ct 558 -341 532 -324 508 -283 ct 508 -332 l p ef 870 -204 m 742 -204 l 742 -147 l 870 -147 l 870 -204 l p ef 899 -400 m 1026 -400 l 1026 0 l 1077 0 l 1077 -400 l 1204 -400 l 1204 -455 l 899 -455 l 899 -400 l p ef 1281 78 m 1225 78 l 1225 124 l 1322 124 l 1322 -458 l 1225 -458 l 1225 -412 l 1281 -412 l 1281 78 l p ef pom gr 10410 12492 m 10410 12142 l 10935 12317 l 10410 12492 l p ef 1 lw 0 lj 8435 12318 m 9685 12318 l 9685 12317 l 10515 12317 l ps 0 lw 1 lj 11434 16817 m 10932 17318 l 10934 16317 l 11434 16817 l pc 10483 16967 m 10483 16667 l 10933 16817 l 10483 16967 l p ef 1 lw 0 lj 8435 16818 m 9684 16818 l 9684 16817 l 10573 16817 l ps 0 lw 1 lj 13085 14818 m 12947 14818 12835 14706 12835 14568 ct 12835 14430 12947 14318 13085 14318 ct 13223 14318 13335 14430 13335 14568 ct 13335 14706 13223 14818 13085 14818 ct pc gs pum 12931 14791 t 133 -183 m 20 -183 l 20 -137 l 133 -137 l 133 0 l 171 0 l 171 -137 l 283 -137 l 283 -183 l 171 -183 l 171 -320 l 133 -320 l 133 -183 l p ef pom gr 13234 15268 m 12934 15268 l 13084 14818 l 13234 15268 l p ef 1 lw 0 lj 11435 16817 m 13084 16817 l 13084 15178 l ps 12934 13868 m 13234 13868 l 13084 14318 l 12934 13868 l p ef 11437 12317 m 13084 12317 l 13084 13958 l ps 0 lw 1 lj 17835 15318 m 16335 15318 l 16335 13818 l 19335 13818 l 19335 15318 l 17835 15318 l pc 16668 15023 m 16778 14801 16891 14569 16925 14316 ct 16997 13766 17307 14273 17221 14551 ct 17165 14731 17523 15058 17694 14622 ct 17856 14213 18050 14912 18286 15000 ct 18489 15075 18680 14999 18878 15000 ct 18878 15000 18878 15000 19076 15047 ct 19076 15047 19076 15047 19135 15118 ct ps 15885 14718 m 15885 14418 l 16335 14568 l 15885 14718 l p ef 1 lw 0 lj 13335 14567 m 14935 14567 l 14935 14568 l 15975 14568 l ps gs pum 17085 13052 t 208 -214 m 206 -241 203 -254 195 -269 ct 180 -296 151 -311 114 -311 ct 84 -311 61 -302 46 -283 ct 33 -266 25 -243 25 -219 ct 25 -180 43 -156 78 -146 ct 129 -131 l 170 -120 182 -108 182 -79 ct 182 -46 158 -27 118 -27 ct 90 -27 69 -37 58 -56 ct 51 -68 49 -78 48 -98 ct 16 -98 l 17 -65 22 -48 35 -30 ct 54 -3 78 8 116 8 ct 177 8 214 -26 214 -83 ct 214 -126 195 -154 158 -164 ct 87 -184 l 67 -190 57 -202 57 -224 ct 57 -257 78 -276 114 -276 ct 137 -276 156 -267 166 -250 ct 172 -240 175 -231 176 -214 ct 208 -214 l p ef 319 -39 m 271 -221 l 236 -221 l 304 5 l 300 16 297 25 296 28 ct 289 51 284 57 271 57 ct 265 57 259 55 253 53 ct 253 87 l 255 87 l 261 90 263 90 268 90 ct 304 90 309 83 337 -4 ct 402 -221 l 368 -221 l 319 -39 l p ef 457 -221 m 428 -221 l 428 0 l 458 0 l 458 -120 l 458 -166 477 -194 508 -194 ct 534 -194 546 -176 546 -136 ct 546 0 l 576 0 l 576 -150 l 576 -199 553 -227 515 -227 ct 490 -227 472 -216 457 -188 ct 457 -221 l p ef 690 -190 m 690 -221 l 660 -221 l 660 -282 l 630 -282 l 630 -221 l 605 -221 l 605 -190 l 630 -190 l 630 -44 l 630 -12 641 2 665 2 ct 667 2 669 2 676 1 ct 678 1 683 0 689 0 ct 689 -29 l 679 -29 l 665 -29 660 -34 660 -46 ct 660 -190 l 690 -190 l p ef 751 -303 m 721 -303 l 721 0 l 751 0 l 751 -120 l 751 -167 770 -194 803 -194 ct 828 -194 839 -179 839 -144 ct 839 0 l 869 0 l 869 -150 l 869 -199 846 -227 808 -227 ct 784 -227 769 -218 751 -190 ct 751 -303 l p ef 1038 -69 m 1035 -44 1015 -26 991 -26 ct 973 -26 958 -34 950 -49 ct 942 -61 940 -73 939 -98 ct 1071 -98 l 1070 -142 1066 -162 1056 -184 ct 1042 -214 1022 -227 992 -227 ct 940 -227 906 -180 906 -106 ct 906 -36 938 6 990 6 ct 1032 6 1061 -21 1069 -69 ct 1038 -69 l p 939 -128 m 941 -167 962 -194 991 -194 ct 1007 -194 1020 -186 1028 -173 ct 1035 -162 1038 -151 1040 -128 ct 939 -128 l p ef 1242 -158 m 1240 -202 1215 -227 1174 -227 ct 1132 -227 1104 -200 1104 -157 ct 1104 -129 1118 -111 1146 -103 ct 1182 -92 l 1210 -84 1218 -77 1218 -60 ct 1218 -39 1202 -26 1175 -26 ct 1144 -26 1130 -39 1128 -71 ct 1099 -71 l 1100 -49 1102 -38 1108 -27 ct 1120 -5 1143 6 1173 6 ct 1219 6 1248 -22 1248 -66 ct 1248 -97 1234 -113 1197 -125 ct 1167 -134 l 1140 -142 1134 -148 1134 -163 ct 1134 -183 1148 -195 1172 -195 ct 1198 -195 1211 -183 1213 -158 ct 1242 -158 l p ef 1315 -221 m 1285 -221 l 1285 0 l 1315 0 l 1315 -221 l p 1315 -261 m 1315 -303 l 1285 -303 l 1285 -261 l 1315 -261 l p ef 1492 -158 m 1490 -202 1465 -227 1424 -227 ct 1382 -227 1354 -200 1354 -157 ct 1354 -129 1368 -111 1396 -103 ct 1432 -92 l 1460 -84 1468 -77 1468 -60 ct 1468 -39 1452 -26 1425 -26 ct 1394 -26 1380 -39 1378 -71 ct 1349 -71 l 1350 -49 1352 -38 1358 -27 ct 1370 -5 1393 6 1423 6 ct 1469 6 1498 -22 1498 -66 ct 1498 -97 1484 -113 1447 -125 ct 1417 -134 l 1390 -142 1384 -148 1384 -163 ct 1384 -183 1398 -195 1422 -195 ct 1448 -195 1461 -183 1463 -158 ct 1492 -158 l p ef pom pum 17085 13581 t 90 -190 m 90 -221 l 60 -221 l 60 -248 l 60 -266 65 -274 78 -274 ct 81 -274 85 -274 90 -273 ct 90 -307 l 81 -307 79 -307 76 -307 ct 46 -307 30 -291 30 -259 ct 30 -221 l 4 -221 l 4 -190 l 30 -190 l 30 0 l 60 0 l 60 -190 l 90 -190 l p ef 150 -221 m 120 -221 l 120 0 l 150 0 l 150 -221 l p 150 -261 m 150 -303 l 120 -303 l 120 -261 l 150 -261 l p ef 227 -303 m 197 -303 l 197 0 l 227 0 l 227 -303 l p ef 339 -190 m 339 -221 l 309 -221 l 309 -282 l 279 -282 l 279 -221 l 254 -221 l 254 -190 l 279 -190 l 279 -44 l 279 -12 290 2 314 2 ct 316 2 318 2 325 1 ct 327 1 332 0 338 0 ct 338 -29 l 328 -29 l 314 -29 309 -34 309 -46 ct 309 -190 l 339 -190 l p ef 492 -69 m 489 -44 469 -26 445 -26 ct 427 -26 412 -34 404 -49 ct 396 -61 394 -73 393 -98 ct 525 -98 l 524 -142 520 -162 510 -184 ct 496 -214 476 -227 446 -227 ct 394 -227 360 -180 360 -106 ct 360 -36 392 6 444 6 ct 486 6 515 -21 523 -69 ct 492 -69 l p 393 -128 m 395 -167 416 -194 445 -194 ct 461 -194 474 -186 482 -173 ct 489 -162 492 -151 494 -128 ct 393 -128 l p ef 657 -188 m 657 -226 l 654 -227 651 -227 649 -227 ct 627 -227 613 -215 597 -183 ct 597 -221 l 568 -221 l 568 0 l 599 0 l 599 -129 l 599 -163 618 -188 645 -188 ct 657 -188 l p ef 878 -297 m 854 -297 l 844 -253 834 -244 789 -240 ct 789 -211 l 845 -211 l 845 0 l 878 0 l 878 -297 l p ef 1050 -311 m 1027 -311 l 943 8 l 965 8 l 1050 -311 l p ef 1211 -88 m 1235 0 l 1272 0 l 1182 -303 l 1144 -303 l 1050 0 l 1085 0 l 1111 -88 l 1211 -88 l p 1121 -125 m 1161 -259 l 1199 -125 l 1121 -125 l p ef 1360 -310 m 1316 -231 1301 -179 1301 -110 ct 1301 -42 1314 1 1361 87 ct 1381 87 l 1343 -5 1334 -42 1334 -107 ct 1334 -182 1344 -225 1381 -310 ct 1360 -310 l p ef 1552 -190 m 1552 -221 l 1412 -221 l 1412 -190 l 1513 -190 l 1403 -29 l 1403 0 l 1555 0 l 1555 -30 l 1444 -30 l 1552 -190 l p ef 1599 87 m 1642 8 1657 -43 1657 -111 ct 1657 -179 1644 -223 1598 -310 ct 1577 -310 l 1616 -217 1625 -179 1625 -115 ct 1625 -40 1615 2 1578 87 ct 1599 87 l p ef pom gr gs pum 5708 9956 t 63 -137 m 185 -137 l 185 -174 l 63 -174 l 63 -266 l 202 -266 l 202 -303 l 30 -303 l 30 0 l 63 0 l 63 -137 l p ef 265 -221 m 235 -221 l 235 0 l 265 0 l 265 -221 l p 265 -261 m 265 -303 l 235 -303 l 235 -261 l 265 -261 l p ef 394 -113 m 455 -221 l 418 -221 l 375 -143 l 334 -221 l 294 -221 l 355 -113 l 291 0 l 330 0 l 373 -83 l 419 0 l 458 0 l 394 -113 l p ef 606 -69 m 603 -44 583 -26 559 -26 ct 541 -26 526 -34 518 -49 ct 510 -61 508 -73 507 -98 ct 639 -98 l 638 -142 634 -162 624 -184 ct 610 -214 590 -227 560 -227 ct 508 -227 474 -180 474 -106 ct 474 -36 506 6 558 6 ct 600 6 629 -21 637 -69 ct 606 -69 l p 507 -128 m 509 -167 530 -194 559 -194 ct 575 -194 588 -186 596 -173 ct 603 -162 606 -151 608 -128 ct 507 -128 l p ef 829 -303 m 798 -303 l 798 -187 l 784 -216 768 -227 743 -227 ct 698 -227 668 -182 668 -115 ct 668 -41 699 6 747 6 ct 772 6 787 -4 800 -31 ct 800 0 l 829 0 l 829 -303 l p 749 -194 m 780 -194 798 -162 798 -104 ct 798 -76 793 -57 782 -43 ct 773 -32 761 -26 748 -26 ct 717 -26 699 -58 699 -113 ct 699 -167 716 -194 749 -194 ct p ef 1113 -146 m 1107 -200 1085 -227 1044 -227 ct 991 -227 958 -180 958 -106 ct 958 -37 990 6 1039 6 ct 1081 6 1106 -22 1113 -78 ct 1083 -78 l 1077 -43 1062 -26 1039 -26 ct 1008 -26 991 -56 991 -109 ct 991 -163 1009 -194 1041 -194 ct 1065 -194 1078 -180 1083 -146 ct 1113 -146 l p ef 1219 -227 m 1168 -227 1134 -180 1134 -110 ct 1134 -41 1168 5 1218 5 ct 1268 5 1302 -41 1302 -110 ct 1302 -178 1268 -227 1219 -227 ct p 1219 -195 m 1250 -195 1270 -161 1270 -110 ct 1270 -59 1250 -26 1218 -26 ct 1186 -26 1165 -59 1165 -110 ct 1165 -162 1186 -195 1219 -195 ct p ef 1490 -303 m 1459 -303 l 1459 -187 l 1445 -216 1429 -227 1404 -227 ct 1359 -227 1329 -182 1329 -115 ct 1329 -41 1360 6 1408 6 ct 1433 6 1448 -4 1461 -31 ct 1461 0 l 1490 0 l 1490 -303 l p 1410 -194 m 1441 -194 1459 -162 1459 -104 ct 1459 -76 1454 -57 1443 -43 ct 1434 -32 1422 -26 1409 -26 ct 1378 -26 1360 -58 1360 -113 ct 1360 -167 1377 -194 1410 -194 ct p ef 1656 -69 m 1653 -44 1633 -26 1609 -26 ct 1591 -26 1576 -34 1568 -49 ct 1560 -61 1558 -73 1557 -98 ct 1689 -98 l 1688 -142 1684 -162 1674 -184 ct 1660 -214 1640 -227 1610 -227 ct 1558 -227 1524 -180 1524 -106 ct 1524 -36 1556 6 1608 6 ct 1650 6 1679 -21 1687 -69 ct 1656 -69 l p 1557 -128 m 1559 -167 1580 -194 1609 -194 ct 1625 -194 1638 -186 1646 -173 ct 1653 -162 1656 -151 1658 -128 ct 1557 -128 l p ef 1755 0 m 1755 -28 l 1768 -3 1782 6 1806 6 ct 1854 6 1885 -41 1885 -115 ct 1885 -182 1855 -227 1810 -227 ct 1788 -227 1772 -217 1756 -192 ct 1756 -303 l 1726 -303 l 1726 0 l 1755 0 l p 1805 -194 m 1837 -194 1853 -167 1853 -113 ct 1853 -58 1835 -26 1804 -26 ct 1792 -26 1780 -32 1771 -43 ct 1760 -57 1755 -76 1755 -105 ct 1755 -163 1772 -194 1805 -194 ct p ef 1998 -227 m 1947 -227 1913 -180 1913 -110 ct 1913 -41 1947 5 1997 5 ct 2047 5 2081 -41 2081 -110 ct 2081 -178 2047 -227 1998 -227 ct p 1998 -195 m 2029 -195 2049 -161 2049 -110 ct 2049 -59 2029 -26 1997 -26 ct 1965 -26 1944 -59 1944 -110 ct 1944 -162 1965 -195 1998 -195 ct p ef 2193 -227 m 2142 -227 2108 -180 2108 -110 ct 2108 -41 2142 5 2192 5 ct 2242 5 2276 -41 2276 -110 ct 2276 -178 2242 -227 2193 -227 ct p 2193 -195 m 2224 -195 2244 -161 2244 -110 ct 2244 -59 2224 -26 2192 -26 ct 2160 -26 2139 -59 2139 -110 ct 2139 -162 2160 -195 2193 -195 ct p ef 2390 -138 m 2459 -221 l 2421 -221 l 2342 -127 l 2342 -303 l 2313 -303 l 2313 0 l 2342 0 l 2342 -83 l 2368 -111 l 2424 0 l 2463 0 l 2390 -138 l p ef pom gr gs pum 5390 15539 t 165 -88 m 189 0 l 226 0 l 136 -303 l 98 -303 l 4 0 l 39 0 l 65 -88 l 165 -88 l p 75 -125 m 115 -259 l 153 -125 l 75 -125 l p ef 406 -303 m 375 -303 l 375 -187 l 361 -216 345 -227 320 -227 ct 275 -227 245 -182 245 -115 ct 245 -41 276 6 324 6 ct 349 6 364 -4 377 -31 ct 377 0 l 406 0 l 406 -303 l p 326 -194 m 357 -194 375 -162 375 -104 ct 375 -76 370 -57 359 -43 ct 350 -32 338 -26 325 -26 ct 294 -26 276 -58 276 -113 ct 276 -167 293 -194 326 -194 ct p ef 477 -153 m 481 -184 493 -196 520 -196 ct 547 -196 562 -184 562 -159 ct 562 -143 557 -136 546 -134 ct 495 -126 l 460 -121 440 -96 440 -58 ct 440 -19 463 6 498 6 ct 524 6 543 -4 562 -29 ct 565 -5 573 4 594 4 ct 598 4 602 3 608 1 ct 610 0 610 0 612 0 ct 612 -27 l 605 -25 603 -25 601 -25 ct 595 -25 591 -30 591 -38 ct 591 -165 l 591 -204 565 -227 522 -227 ct 493 -227 472 -217 460 -198 ct 453 -186 450 -175 449 -153 ct 477 -153 l p 561 -76 m 561 -48 535 -24 504 -24 ct 484 -24 472 -38 472 -61 ct 472 -83 483 -94 511 -98 ct 546 -104 554 -107 561 -112 ct 561 -76 l p ef 642 87 m 672 87 l 672 -24 l 685 -2 699 6 722 6 ct 770 6 801 -42 801 -115 ct 801 -182 771 -227 726 -227 ct 701 -227 687 -217 671 -188 ct 671 -221 l 642 -221 l 642 87 l p 721 -194 m 752 -194 769 -166 769 -114 ct 769 -58 751 -26 720 -26 ct 690 -26 671 -55 671 -103 ct 671 -163 688 -194 721 -194 ct p ef 906 -190 m 906 -221 l 876 -221 l 876 -282 l 846 -282 l 846 -221 l 821 -221 l 821 -190 l 846 -190 l 846 -44 l 846 -12 857 2 881 2 ct 883 2 885 2 892 1 ct 894 1 899 0 905 0 ct 905 -29 l 895 -29 l 881 -29 876 -34 876 -46 ct 876 -190 l 906 -190 l p ef 967 -221 m 937 -221 l 937 0 l 967 0 l 967 -221 l p 967 -261 m 967 -303 l 937 -303 l 937 -261 l 967 -261 l p ef 1076 -39 m 1029 -221 l 993 -221 l 1059 0 l 1092 0 l 1161 -221 l 1128 -221 l 1076 -39 l p ef 1309 -69 m 1306 -44 1286 -26 1262 -26 ct 1244 -26 1229 -34 1221 -49 ct 1213 -61 1211 -73 1210 -98 ct 1342 -98 l 1341 -142 1337 -162 1327 -184 ct 1313 -214 1293 -227 1263 -227 ct 1211 -227 1177 -180 1177 -106 ct 1177 -36 1209 6 1261 6 ct 1303 6 1332 -21 1340 -69 ct 1309 -69 l p 1210 -128 m 1212 -167 1233 -194 1262 -194 ct 1278 -194 1291 -186 1299 -173 ct 1306 -162 1309 -151 1311 -128 ct 1210 -128 l p ef 1621 -146 m 1615 -200 1593 -227 1552 -227 ct 1499 -227 1466 -180 1466 -106 ct 1466 -37 1498 6 1547 6 ct 1589 6 1614 -22 1621 -78 ct 1591 -78 l 1585 -43 1570 -26 1547 -26 ct 1516 -26 1499 -56 1499 -109 ct 1499 -163 1517 -194 1549 -194 ct 1573 -194 1586 -180 1591 -146 ct 1621 -146 l p ef 1727 -227 m 1676 -227 1642 -180 1642 -110 ct 1642 -41 1676 5 1726 5 ct 1776 5 1810 -41 1810 -110 ct 1810 -178 1776 -227 1727 -227 ct p 1727 -195 m 1758 -195 1778 -161 1778 -110 ct 1778 -59 1758 -26 1726 -26 ct 1694 -26 1673 -59 1673 -110 ct 1673 -162 1694 -195 1727 -195 ct p ef 1998 -303 m 1967 -303 l 1967 -187 l 1953 -216 1937 -227 1912 -227 ct 1867 -227 1837 -182 1837 -115 ct 1837 -41 1868 6 1916 6 ct 1941 6 1956 -4 1969 -31 ct 1969 0 l 1998 0 l 1998 -303 l p 1918 -194 m 1949 -194 1967 -162 1967 -104 ct 1967 -76 1962 -57 1951 -43 ct 1942 -32 1930 -26 1917 -26 ct 1886 -26 1868 -58 1868 -113 ct 1868 -167 1885 -194 1918 -194 ct p ef 2164 -69 m 2161 -44 2141 -26 2117 -26 ct 2099 -26 2084 -34 2076 -49 ct 2068 -61 2066 -73 2065 -98 ct 2197 -98 l 2196 -142 2192 -162 2182 -184 ct 2168 -214 2148 -227 2118 -227 ct 2066 -227 2032 -180 2032 -106 ct 2032 -36 2064 6 2116 6 ct 2158 6 2187 -21 2195 -69 ct 2164 -69 l p 2065 -128 m 2067 -167 2088 -194 2117 -194 ct 2133 -194 2146 -186 2154 -173 ct 2161 -162 2164 -151 2166 -128 ct 2065 -128 l p ef 2263 0 m 2263 -28 l 2276 -3 2290 6 2314 6 ct 2362 6 2393 -41 2393 -115 ct 2393 -182 2363 -227 2318 -227 ct 2296 -227 2280 -217 2264 -192 ct 2264 -303 l 2234 -303 l 2234 0 l 2263 0 l p 2313 -194 m 2345 -194 2361 -167 2361 -113 ct 2361 -58 2343 -26 2312 -26 ct 2300 -26 2288 -32 2279 -43 ct 2268 -57 2263 -76 2263 -105 ct 2263 -163 2280 -194 2313 -194 ct p ef 2506 -227 m 2455 -227 2421 -180 2421 -110 ct 2421 -41 2455 5 2505 5 ct 2555 5 2589 -41 2589 -110 ct 2589 -178 2555 -227 2506 -227 ct p 2506 -195 m 2537 -195 2557 -161 2557 -110 ct 2557 -59 2537 -26 2505 -26 ct 2473 -26 2452 -59 2452 -110 ct 2452 -162 2473 -195 2506 -195 ct p ef 2701 -227 m 2650 -227 2616 -180 2616 -110 ct 2616 -41 2650 5 2700 5 ct 2750 5 2784 -41 2784 -110 ct 2784 -178 2750 -227 2701 -227 ct p 2701 -195 m 2732 -195 2752 -161 2752 -110 ct 2752 -59 2732 -26 2700 -26 ct 2668 -26 2647 -59 2647 -110 ct 2647 -162 2668 -195 2701 -195 ct p ef 2898 -138 m 2967 -221 l 2929 -221 l 2850 -127 l 2850 -303 l 2821 -303 l 2821 0 l 2850 0 l 2850 -83 l 2876 -111 l 2932 0 l 2971 0 l 2898 -138 l p ef pom gr gs pum 14016 13846 t 213 -36 m 63 -36 l 63 -137 l 199 -137 l 199 -174 l 63 -174 l 63 -266 l 211 -266 l 211 -303 l 30 -303 l 30 0 l 213 0 l 213 -36 l p ef 339 -113 m 400 -221 l 363 -221 l 320 -143 l 279 -221 l 239 -221 l 300 -113 l 236 0 l 275 0 l 318 -83 l 364 0 l 403 0 l 339 -113 l p ef 571 -146 m 565 -200 543 -227 502 -227 ct 449 -227 416 -180 416 -106 ct 416 -37 448 6 497 6 ct 539 6 564 -22 571 -78 ct 541 -78 l 535 -43 520 -26 497 -26 ct 466 -26 449 -56 449 -109 ct 449 -163 467 -194 499 -194 ct 523 -194 536 -180 541 -146 ct 571 -146 l p ef 633 -221 m 603 -221 l 603 0 l 633 0 l 633 -221 l p 633 -261 m 633 -303 l 603 -303 l 603 -261 l 633 -261 l p ef 745 -190 m 745 -221 l 715 -221 l 715 -282 l 685 -282 l 685 -221 l 660 -221 l 660 -190 l 685 -190 l 685 -44 l 685 -12 696 2 720 2 ct 722 2 724 2 731 1 ct 733 1 738 0 744 0 ct 744 -29 l 734 -29 l 720 -29 715 -34 715 -46 ct 715 -190 l 745 -190 l p ef 803 -153 m 807 -184 819 -196 846 -196 ct 873 -196 888 -184 888 -159 ct 888 -143 883 -136 872 -134 ct 821 -126 l 786 -121 766 -96 766 -58 ct 766 -19 789 6 824 6 ct 850 6 869 -4 888 -29 ct 891 -5 899 4 920 4 ct 924 4 928 3 934 1 ct 936 0 936 0 938 0 ct 938 -27 l 931 -25 929 -25 927 -25 ct 921 -25 917 -30 917 -38 ct 917 -165 l 917 -204 891 -227 848 -227 ct 819 -227 798 -217 786 -198 ct 779 -186 776 -175 775 -153 ct 803 -153 l p 887 -76 m 887 -48 861 -24 830 -24 ct 810 -24 798 -38 798 -61 ct 798 -83 809 -94 837 -98 ct 872 -104 880 -107 887 -112 ct 887 -76 l p ef 1037 -190 m 1037 -221 l 1007 -221 l 1007 -282 l 977 -282 l 977 -221 l 952 -221 l 952 -190 l 977 -190 l 977 -44 l 977 -12 988 2 1012 2 ct 1014 2 1016 2 1023 1 ct 1025 1 1030 0 1036 0 ct 1036 -29 l 1026 -29 l 1012 -29 1007 -34 1007 -46 ct 1007 -190 l 1037 -190 l p ef 1099 -221 m 1069 -221 l 1069 0 l 1099 0 l 1099 -221 l p 1099 -261 m 1099 -303 l 1069 -303 l 1069 -261 l 1099 -261 l p ef 1219 -227 m 1168 -227 1134 -180 1134 -110 ct 1134 -41 1168 5 1218 5 ct 1268 5 1302 -41 1302 -110 ct 1302 -178 1268 -227 1219 -227 ct p 1219 -195 m 1250 -195 1270 -161 1270 -110 ct 1270 -59 1250 -26 1218 -26 ct 1186 -26 1165 -59 1165 -110 ct 1165 -162 1186 -195 1219 -195 ct p ef 1368 -221 m 1339 -221 l 1339 0 l 1369 0 l 1369 -120 l 1369 -166 1388 -194 1419 -194 ct 1445 -194 1457 -176 1457 -136 ct 1457 0 l 1487 0 l 1487 -150 l 1487 -199 1464 -227 1426 -227 ct 1401 -227 1383 -216 1368 -188 ct 1368 -221 l p ef pom pum 14480 14375 t 145 -69 m 142 -44 122 -26 98 -26 ct 80 -26 65 -34 57 -49 ct 49 -61 47 -73 46 -98 ct 178 -98 l 177 -142 173 -162 163 -184 ct 149 -214 129 -227 99 -227 ct 47 -227 13 -180 13 -106 ct 13 -36 45 6 97 6 ct 139 6 168 -21 176 -69 ct 145 -69 l p 46 -128 m 48 -167 69 -194 98 -194 ct 114 -194 127 -186 135 -173 ct 142 -162 145 -151 147 -128 ct 46 -128 l p ef 244 -274 m 281 -274 l 281 -305 l 217 -305 l 217 82 l 281 82 l 281 52 l 244 52 l 244 -274 l p ef 343 -221 m 314 -221 l 314 0 l 344 0 l 344 -120 l 344 -166 363 -194 394 -194 ct 420 -194 432 -176 432 -136 ct 432 0 l 462 0 l 462 -150 l 462 -199 439 -227 401 -227 ct 376 -227 358 -216 343 -188 ct 343 -221 l p ef 533 52 m 496 52 l 496 82 l 561 82 l 561 -305 l 496 -305 l 496 -274 l 533 -274 l 533 52 l p ef pom gr gs pum 9491 13237 t 63 -137 m 185 -137 l 185 -174 l 63 -174 l 63 -266 l 202 -266 l 202 -303 l 30 -303 l 30 0 l 63 0 l 63 -137 l p ef 265 -221 m 235 -221 l 235 0 l 265 0 l 265 -221 l p 265 -261 m 265 -303 l 235 -303 l 235 -261 l 265 -261 l p ef 394 -113 m 455 -221 l 418 -221 l 375 -143 l 334 -221 l 294 -221 l 355 -113 l 291 0 l 330 0 l 373 -83 l 419 0 l 458 0 l 394 -113 l p ef 606 -69 m 603 -44 583 -26 559 -26 ct 541 -26 526 -34 518 -49 ct 510 -61 508 -73 507 -98 ct 639 -98 l 638 -142 634 -162 624 -184 ct 610 -214 590 -227 560 -227 ct 508 -227 474 -180 474 -106 ct 474 -36 506 6 558 6 ct 600 6 629 -21 637 -69 ct 606 -69 l p 507 -128 m 509 -167 530 -194 559 -194 ct 575 -194 588 -186 596 -173 ct 603 -162 606 -151 608 -128 ct 507 -128 l p ef 829 -303 m 798 -303 l 798 -187 l 784 -216 768 -227 743 -227 ct 698 -227 668 -182 668 -115 ct 668 -41 699 6 747 6 ct 772 6 787 -4 800 -31 ct 800 0 l 829 0 l 829 -303 l p 749 -194 m 780 -194 798 -162 798 -104 ct 798 -76 793 -57 782 -43 ct 773 -32 761 -26 748 -26 ct 717 -26 699 -58 699 -113 ct 699 -167 716 -194 749 -194 ct p ef 1113 -146 m 1107 -200 1085 -227 1044 -227 ct 991 -227 958 -180 958 -106 ct 958 -37 990 6 1039 6 ct 1081 6 1106 -22 1113 -78 ct 1083 -78 l 1077 -43 1062 -26 1039 -26 ct 1008 -26 991 -56 991 -109 ct 991 -163 1009 -194 1041 -194 ct 1065 -194 1078 -180 1083 -146 ct 1113 -146 l p ef 1219 -227 m 1168 -227 1134 -180 1134 -110 ct 1134 -41 1168 5 1218 5 ct 1268 5 1302 -41 1302 -110 ct 1302 -178 1268 -227 1219 -227 ct p 1219 -195 m 1250 -195 1270 -161 1270 -110 ct 1270 -59 1250 -26 1218 -26 ct 1186 -26 1165 -59 1165 -110 ct 1165 -162 1186 -195 1219 -195 ct p ef 1490 -303 m 1459 -303 l 1459 -187 l 1445 -216 1429 -227 1404 -227 ct 1359 -227 1329 -182 1329 -115 ct 1329 -41 1360 6 1408 6 ct 1433 6 1448 -4 1461 -31 ct 1461 0 l 1490 0 l 1490 -303 l p 1410 -194 m 1441 -194 1459 -162 1459 -104 ct 1459 -76 1454 -57 1443 -43 ct 1434 -32 1422 -26 1409 -26 ct 1378 -26 1360 -58 1360 -113 ct 1360 -167 1377 -194 1410 -194 ct p ef 1656 -69 m 1653 -44 1633 -26 1609 -26 ct 1591 -26 1576 -34 1568 -49 ct 1560 -61 1558 -73 1557 -98 ct 1689 -98 l 1688 -142 1684 -162 1674 -184 ct 1660 -214 1640 -227 1610 -227 ct 1558 -227 1524 -180 1524 -106 ct 1524 -36 1556 6 1608 6 ct 1650 6 1679 -21 1687 -69 ct 1656 -69 l p 1557 -128 m 1559 -167 1580 -194 1609 -194 ct 1625 -194 1638 -186 1646 -173 ct 1653 -162 1656 -151 1658 -128 ct 1557 -128 l p ef 1755 0 m 1755 -28 l 1768 -3 1782 6 1806 6 ct 1854 6 1885 -41 1885 -115 ct 1885 -182 1855 -227 1810 -227 ct 1788 -227 1772 -217 1756 -192 ct 1756 -303 l 1726 -303 l 1726 0 l 1755 0 l p 1805 -194 m 1837 -194 1853 -167 1853 -113 ct 1853 -58 1835 -26 1804 -26 ct 1792 -26 1780 -32 1771 -43 ct 1760 -57 1755 -76 1755 -105 ct 1755 -163 1772 -194 1805 -194 ct p ef 1998 -227 m 1947 -227 1913 -180 1913 -110 ct 1913 -41 1947 5 1997 5 ct 2047 5 2081 -41 2081 -110 ct 2081 -178 2047 -227 1998 -227 ct p 1998 -195 m 2029 -195 2049 -161 2049 -110 ct 2049 -59 2029 -26 1997 -26 ct 1965 -26 1944 -59 1944 -110 ct 1944 -162 1965 -195 1998 -195 ct p ef 2193 -227 m 2142 -227 2108 -180 2108 -110 ct 2108 -41 2142 5 2192 5 ct 2242 5 2276 -41 2276 -110 ct 2276 -178 2242 -227 2193 -227 ct p 2193 -195 m 2224 -195 2244 -161 2244 -110 ct 2244 -59 2224 -26 2192 -26 ct 2160 -26 2139 -59 2139 -110 ct 2139 -162 2160 -195 2193 -195 ct p ef 2390 -138 m 2459 -221 l 2421 -221 l 2342 -127 l 2342 -303 l 2313 -303 l 2313 0 l 2342 0 l 2342 -83 l 2368 -111 l 2424 0 l 2463 0 l 2390 -138 l p ef 2734 -221 m 2705 -221 l 2705 -188 l 2688 -217 2674 -227 2649 -227 ct 2604 -227 2574 -182 2574 -115 ct 2574 -42 2606 6 2654 6 ct 2676 6 2691 -2 2703 -24 ct 2703 -15 l 2703 11 2701 25 2695 37 ct 2687 54 2673 62 2651 62 ct 2628 62 2616 52 2610 27 ct 2580 27 l 2585 55 2591 68 2605 79 ct 2617 88 2632 93 2650 93 ct 2681 93 2705 80 2719 57 ct 2729 39 2734 17 2734 -18 ct 2734 -221 l p 2656 -194 m 2687 -194 2704 -162 2704 -104 ct 2704 -55 2686 -26 2654 -26 ct 2624 -26 2606 -58 2606 -113 ct 2606 -167 2623 -194 2656 -194 ct p ef 2805 -153 m 2809 -184 2821 -196 2848 -196 ct 2875 -196 2890 -184 2890 -159 ct 2890 -143 2885 -136 2874 -134 ct 2823 -126 l 2788 -121 2768 -96 2768 -58 ct 2768 -19 2791 6 2826 6 ct 2852 6 2871 -4 2890 -29 ct 2893 -5 2901 4 2922 4 ct 2926 4 2930 3 2936 1 ct 2938 0 2938 0 2940 0 ct 2940 -27 l 2933 -25 2931 -25 2929 -25 ct 2923 -25 2919 -30 2919 -38 ct 2919 -165 l 2919 -204 2893 -227 2850 -227 ct 2821 -227 2800 -217 2788 -198 ct 2781 -186 2778 -175 2777 -153 ct 2805 -153 l p 2889 -76 m 2889 -48 2863 -24 2832 -24 ct 2812 -24 2800 -38 2800 -61 ct 2800 -83 2811 -94 2839 -98 ct 2874 -104 2882 -107 2889 -112 ct 2889 -76 l p ef 3004 -221 m 2974 -221 l 2974 0 l 3004 0 l 3004 -221 l p 3004 -261 m 3004 -303 l 2974 -303 l 2974 -261 l 3004 -261 l p ef 3078 -221 m 3049 -221 l 3049 0 l 3079 0 l 3079 -120 l 3079 -166 3098 -194 3129 -194 ct 3155 -194 3167 -176 3167 -136 ct 3167 0 l 3197 0 l 3197 -150 l 3197 -199 3174 -227 3136 -227 ct 3111 -227 3093 -216 3078 -188 ct 3078 -221 l p ef pom gr gs pum 9174 17762 t 165 -88 m 189 0 l 226 0 l 136 -303 l 98 -303 l 4 0 l 39 0 l 65 -88 l 165 -88 l p 75 -125 m 115 -259 l 153 -125 l 75 -125 l p ef 406 -303 m 375 -303 l 375 -187 l 361 -216 345 -227 320 -227 ct 275 -227 245 -182 245 -115 ct 245 -41 276 6 324 6 ct 349 6 364 -4 377 -31 ct 377 0 l 406 0 l 406 -303 l p 326 -194 m 357 -194 375 -162 375 -104 ct 375 -76 370 -57 359 -43 ct 350 -32 338 -26 325 -26 ct 294 -26 276 -58 276 -113 ct 276 -167 293 -194 326 -194 ct p ef 477 -153 m 481 -184 493 -196 520 -196 ct 547 -196 562 -184 562 -159 ct 562 -143 557 -136 546 -134 ct 495 -126 l 460 -121 440 -96 440 -58 ct 440 -19 463 6 498 6 ct 524 6 543 -4 562 -29 ct 565 -5 573 4 594 4 ct 598 4 602 3 608 1 ct 610 0 610 0 612 0 ct 612 -27 l 605 -25 603 -25 601 -25 ct 595 -25 591 -30 591 -38 ct 591 -165 l 591 -204 565 -227 522 -227 ct 493 -227 472 -217 460 -198 ct 453 -186 450 -175 449 -153 ct 477 -153 l p 561 -76 m 561 -48 535 -24 504 -24 ct 484 -24 472 -38 472 -61 ct 472 -83 483 -94 511 -98 ct 546 -104 554 -107 561 -112 ct 561 -76 l p ef 642 87 m 672 87 l 672 -24 l 685 -2 699 6 722 6 ct 770 6 801 -42 801 -115 ct 801 -182 771 -227 726 -227 ct 701 -227 687 -217 671 -188 ct 671 -221 l 642 -221 l 642 87 l p 721 -194 m 752 -194 769 -166 769 -114 ct 769 -58 751 -26 720 -26 ct 690 -26 671 -55 671 -103 ct 671 -163 688 -194 721 -194 ct p ef 906 -190 m 906 -221 l 876 -221 l 876 -282 l 846 -282 l 846 -221 l 821 -221 l 821 -190 l 846 -190 l 846 -44 l 846 -12 857 2 881 2 ct 883 2 885 2 892 1 ct 894 1 899 0 905 0 ct 905 -29 l 895 -29 l 881 -29 876 -34 876 -46 ct 876 -190 l 906 -190 l p ef 967 -221 m 937 -221 l 937 0 l 967 0 l 967 -221 l p 967 -261 m 967 -303 l 937 -303 l 937 -261 l 967 -261 l p ef 1076 -39 m 1029 -221 l 993 -221 l 1059 0 l 1092 0 l 1161 -221 l 1128 -221 l 1076 -39 l p ef 1309 -69 m 1306 -44 1286 -26 1262 -26 ct 1244 -26 1229 -34 1221 -49 ct 1213 -61 1211 -73 1210 -98 ct 1342 -98 l 1341 -142 1337 -162 1327 -184 ct 1313 -214 1293 -227 1263 -227 ct 1211 -227 1177 -180 1177 -106 ct 1177 -36 1209 6 1261 6 ct 1303 6 1332 -21 1340 -69 ct 1309 -69 l p 1210 -128 m 1212 -167 1233 -194 1262 -194 ct 1278 -194 1291 -186 1299 -173 ct 1306 -162 1309 -151 1311 -128 ct 1210 -128 l p ef 1621 -146 m 1615 -200 1593 -227 1552 -227 ct 1499 -227 1466 -180 1466 -106 ct 1466 -37 1498 6 1547 6 ct 1589 6 1614 -22 1621 -78 ct 1591 -78 l 1585 -43 1570 -26 1547 -26 ct 1516 -26 1499 -56 1499 -109 ct 1499 -163 1517 -194 1549 -194 ct 1573 -194 1586 -180 1591 -146 ct 1621 -146 l p ef 1727 -227 m 1676 -227 1642 -180 1642 -110 ct 1642 -41 1676 5 1726 5 ct 1776 5 1810 -41 1810 -110 ct 1810 -178 1776 -227 1727 -227 ct p 1727 -195 m 1758 -195 1778 -161 1778 -110 ct 1778 -59 1758 -26 1726 -26 ct 1694 -26 1673 -59 1673 -110 ct 1673 -162 1694 -195 1727 -195 ct p ef 1998 -303 m 1967 -303 l 1967 -187 l 1953 -216 1937 -227 1912 -227 ct 1867 -227 1837 -182 1837 -115 ct 1837 -41 1868 6 1916 6 ct 1941 6 1956 -4 1969 -31 ct 1969 0 l 1998 0 l 1998 -303 l p 1918 -194 m 1949 -194 1967 -162 1967 -104 ct 1967 -76 1962 -57 1951 -43 ct 1942 -32 1930 -26 1917 -26 ct 1886 -26 1868 -58 1868 -113 ct 1868 -167 1885 -194 1918 -194 ct p ef 2164 -69 m 2161 -44 2141 -26 2117 -26 ct 2099 -26 2084 -34 2076 -49 ct 2068 -61 2066 -73 2065 -98 ct 2197 -98 l 2196 -142 2192 -162 2182 -184 ct 2168 -214 2148 -227 2118 -227 ct 2066 -227 2032 -180 2032 -106 ct 2032 -36 2064 6 2116 6 ct 2158 6 2187 -21 2195 -69 ct 2164 -69 l p 2065 -128 m 2067 -167 2088 -194 2117 -194 ct 2133 -194 2146 -186 2154 -173 ct 2161 -162 2164 -151 2166 -128 ct 2065 -128 l p ef 2263 0 m 2263 -28 l 2276 -3 2290 6 2314 6 ct 2362 6 2393 -41 2393 -115 ct 2393 -182 2363 -227 2318 -227 ct 2296 -227 2280 -217 2264 -192 ct 2264 -303 l 2234 -303 l 2234 0 l 2263 0 l p 2313 -194 m 2345 -194 2361 -167 2361 -113 ct 2361 -58 2343 -26 2312 -26 ct 2300 -26 2288 -32 2279 -43 ct 2268 -57 2263 -76 2263 -105 ct 2263 -163 2280 -194 2313 -194 ct p ef 2506 -227 m 2455 -227 2421 -180 2421 -110 ct 2421 -41 2455 5 2505 5 ct 2555 5 2589 -41 2589 -110 ct 2589 -178 2555 -227 2506 -227 ct p 2506 -195 m 2537 -195 2557 -161 2557 -110 ct 2557 -59 2537 -26 2505 -26 ct 2473 -26 2452 -59 2452 -110 ct 2452 -162 2473 -195 2506 -195 ct p ef 2701 -227 m 2650 -227 2616 -180 2616 -110 ct 2616 -41 2650 5 2700 5 ct 2750 5 2784 -41 2784 -110 ct 2784 -178 2750 -227 2701 -227 ct p 2701 -195 m 2732 -195 2752 -161 2752 -110 ct 2752 -59 2732 -26 2700 -26 ct 2668 -26 2647 -59 2647 -110 ct 2647 -162 2668 -195 2701 -195 ct p ef 2898 -138 m 2967 -221 l 2929 -221 l 2850 -127 l 2850 -303 l 2821 -303 l 2821 0 l 2850 0 l 2850 -83 l 2876 -111 l 2932 0 l 2971 0 l 2898 -138 l p ef 3242 -221 m 3213 -221 l 3213 -188 l 3196 -217 3182 -227 3157 -227 ct 3112 -227 3082 -182 3082 -115 ct 3082 -42 3114 6 3162 6 ct 3184 6 3199 -2 3211 -24 ct 3211 -15 l 3211 11 3209 25 3203 37 ct 3195 54 3181 62 3159 62 ct 3136 62 3124 52 3118 27 ct 3088 27 l 3093 55 3099 68 3113 79 ct 3125 88 3140 93 3158 93 ct 3189 93 3213 80 3227 57 ct 3237 39 3242 17 3242 -18 ct 3242 -221 l p 3164 -194 m 3195 -194 3212 -162 3212 -104 ct 3212 -55 3194 -26 3162 -26 ct 3132 -26 3114 -58 3114 -113 ct 3114 -167 3131 -194 3164 -194 ct p ef 3313 -153 m 3317 -184 3329 -196 3356 -196 ct 3383 -196 3398 -184 3398 -159 ct 3398 -143 3393 -136 3382 -134 ct 3331 -126 l 3296 -121 3276 -96 3276 -58 ct 3276 -19 3299 6 3334 6 ct 3360 6 3379 -4 3398 -29 ct 3401 -5 3409 4 3430 4 ct 3434 4 3438 3 3444 1 ct 3446 0 3446 0 3448 0 ct 3448 -27 l 3441 -25 3439 -25 3437 -25 ct 3431 -25 3427 -30 3427 -38 ct 3427 -165 l 3427 -204 3401 -227 3358 -227 ct 3329 -227 3308 -217 3296 -198 ct 3289 -186 3286 -175 3285 -153 ct 3313 -153 l p 3397 -76 m 3397 -48 3371 -24 3340 -24 ct 3320 -24 3308 -38 3308 -61 ct 3308 -83 3319 -94 3347 -98 ct 3382 -104 3390 -107 3397 -112 ct 3397 -76 l p ef 3512 -221 m 3482 -221 l 3482 0 l 3512 0 l 3512 -221 l p 3512 -261 m 3512 -303 l 3482 -303 l 3482 -261 l 3512 -261 l p ef 3586 -221 m 3557 -221 l 3557 0 l 3587 0 l 3587 -120 l 3587 -166 3606 -194 3637 -194 ct 3663 -194 3675 -176 3675 -136 ct 3675 0 l 3705 0 l 3705 -150 l 3705 -199 3682 -227 3644 -227 ct 3619 -227 3601 -216 3586 -188 ct 3586 -221 l p ef pom gr 0 lw 1 lj 11185 19818 m 9435 19818 l 9435 18318 l 12935 18318 l 12935 19818 l 11185 19818 l pc gs pum 10523 19288 t 41 0 m 191 0 l 234 0 272 -17 297 -48 ct 332 -92 351 -157 351 -233 ct 351 -368 289 -455 193 -455 ct 41 -455 l 41 0 l p 92 -403 m 187 -403 l 259 -403 299 -341 299 -227 ct 299 -119 257 -52 190 -52 ct 92 -52 l 92 -403 l p ef 596 -104 m 591 -66 561 -39 524 -39 ct 497 -39 476 -51 462 -74 ct 451 -92 448 -110 446 -147 ct 645 -147 l 643 -213 637 -244 622 -277 ct 601 -321 570 -341 526 -341 ct 448 -341 397 -271 397 -160 ct 397 -55 445 9 523 9 ct 585 9 629 -32 641 -104 ct 596 -104 l p 446 -192 m 449 -252 481 -292 524 -292 ct 548 -292 568 -280 580 -260 ct 591 -243 595 -226 597 -192 ct 446 -192 l p ef 745 -455 m 699 -455 l 699 0 l 745 0 l 745 -455 l p ef 853 -231 m 859 -277 877 -295 917 -295 ct 958 -295 980 -276 980 -240 ct 980 -215 973 -204 956 -201 ct 880 -190 l 827 -182 798 -145 798 -87 ct 798 -29 832 9 885 9 ct 923 9 951 -6 981 -44 ct 984 -8 997 6 1028 6 ct 1035 6 1040 5 1049 1 ct 1052 0 1053 0 1055 0 ct 1055 -40 l 1045 -38 1043 -38 1039 -38 ct 1029 -38 1024 -45 1024 -57 ct 1024 -248 l 1024 -306 985 -341 920 -341 ct 878 -341 845 -326 827 -297 ct 817 -280 813 -264 811 -231 ct 853 -231 l p 979 -114 m 979 -73 940 -36 894 -36 ct 863 -36 845 -57 845 -92 ct 845 -125 862 -141 904 -148 ct 956 -157 969 -160 979 -169 ct 979 -114 l p ef 1197 -59 m 1124 -332 l 1072 -332 l 1173 8 l 1168 24 1164 38 1162 43 ct 1152 76 1144 85 1125 85 ct 1115 85 1106 83 1097 80 ct 1097 130 l 1101 132 l 1109 135 1113 135 1119 135 ct 1174 135 1182 125 1223 -6 ct 1321 -332 l 1270 -332 l 1197 -59 l p ef pom gr 13385 18918 m 13385 19218 l 12935 19068 l 13385 18918 l p ef 1 lw 0 lj 14935 14567 m 14935 19068 l 13295 19068 l ps 7085 18268 m 6785 18268 l 6935 17818 l 7085 18268 l p ef 9435 19068 m 6935 19068 l 6935 18178 l ps 20025 14718 m 20031 14418 l 20478 14577 l 20025 14718 l p ef 19335 14568 m 20127 14568 l ps gs pum 10179 20249 t 63 -128 m 141 -128 l 186 -128 215 -163 215 -217 ct 215 -269 186 -303 141 -303 ct 30 -303 l 30 0 l 63 0 l 63 -128 l p 63 -268 m 131 -268 l 164 -268 181 -251 181 -216 ct 181 -181 164 -163 130 -163 ct 63 -163 l 63 -268 l p ef 282 -153 m 286 -184 298 -196 325 -196 ct 352 -196 367 -184 367 -159 ct 367 -143 362 -136 351 -134 ct 300 -126 l 265 -121 245 -96 245 -58 ct 245 -19 268 6 303 6 ct 329 6 348 -4 367 -29 ct 370 -5 378 4 399 4 ct 403 4 407 3 413 1 ct 415 0 415 0 417 0 ct 417 -27 l 410 -25 408 -25 406 -25 ct 400 -25 396 -30 396 -38 ct 396 -165 l 396 -204 370 -227 327 -227 ct 298 -227 277 -217 265 -198 ct 258 -186 255 -175 254 -153 ct 282 -153 l p 366 -76 m 366 -48 340 -24 309 -24 ct 289 -24 277 -38 277 -61 ct 277 -83 288 -94 316 -98 ct 351 -104 359 -107 366 -112 ct 366 -76 l p ef 582 -158 m 580 -202 555 -227 514 -227 ct 472 -227 444 -200 444 -157 ct 444 -129 458 -111 486 -103 ct 522 -92 l 550 -84 558 -77 558 -60 ct 558 -39 542 -26 515 -26 ct 484 -26 470 -39 468 -71 ct 439 -71 l 440 -49 442 -38 448 -27 ct 460 -5 483 6 513 6 ct 559 6 588 -22 588 -66 ct 588 -97 574 -113 537 -125 ct 507 -134 l 480 -142 474 -148 474 -163 ct 474 -183 488 -195 512 -195 ct 538 -195 551 -183 553 -158 ct 582 -158 l p ef 690 -190 m 690 -221 l 660 -221 l 660 -282 l 630 -282 l 630 -221 l 605 -221 l 605 -190 l 630 -190 l 630 -44 l 630 -12 641 2 665 2 ct 667 2 669 2 676 1 ct 678 1 683 0 689 0 ct 689 -29 l 679 -29 l 665 -29 660 -34 660 -46 ct 660 -190 l 690 -190 l p ef 950 -158 m 948 -202 923 -227 882 -227 ct 840 -227 812 -200 812 -157 ct 812 -129 826 -111 854 -103 ct 890 -92 l 918 -84 926 -77 926 -60 ct 926 -39 910 -26 883 -26 ct 852 -26 838 -39 836 -71 ct 807 -71 l 808 -49 810 -38 816 -27 ct 828 -5 851 6 881 6 ct 927 6 956 -22 956 -66 ct 956 -97 942 -113 905 -125 ct 875 -134 l 848 -142 842 -148 842 -163 ct 842 -183 856 -195 880 -195 ct 906 -195 919 -183 921 -158 ct 950 -158 l p ef 1138 0 m 1138 -221 l 1108 -221 l 1108 -99 l 1108 -54 1088 -26 1058 -26 ct 1034 -26 1023 -42 1023 -74 ct 1023 -221 l 992 -221 l 992 -62 l 992 -19 1015 6 1052 6 ct 1079 6 1093 -3 1109 -34 ct 1109 0 l 1138 0 l p ef 1213 0 m 1213 -28 l 1226 -3 1240 6 1264 6 ct 1312 6 1343 -41 1343 -115 ct 1343 -182 1313 -227 1268 -227 ct 1246 -227 1230 -217 1214 -192 ct 1214 -303 l 1184 -303 l 1184 0 l 1213 0 l p 1263 -194 m 1295 -194 1311 -167 1311 -113 ct 1311 -58 1293 -26 1262 -26 ct 1250 -26 1238 -32 1229 -43 ct 1218 -57 1213 -76 1213 -105 ct 1213 -163 1230 -194 1263 -194 ct p ef 1449 -190 m 1449 -221 l 1419 -221 l 1419 -248 l 1419 -266 1424 -274 1437 -274 ct 1440 -274 1444 -274 1449 -273 ct 1449 -307 l 1440 -307 1438 -307 1435 -307 ct 1405 -307 1389 -291 1389 -259 ct 1389 -221 l 1363 -221 l 1363 -190 l 1389 -190 l 1389 0 l 1419 0 l 1419 -190 l 1449 -190 l p ef 1571 -188 m 1571 -226 l 1568 -227 1565 -227 1563 -227 ct 1541 -227 1527 -215 1511 -183 ct 1511 -221 l 1482 -221 l 1482 0 l 1513 0 l 1513 -129 l 1513 -163 1532 -188 1559 -188 ct 1571 -188 l p ef 1620 -153 m 1624 -184 1636 -196 1663 -196 ct 1690 -196 1705 -184 1705 -159 ct 1705 -143 1700 -136 1689 -134 ct 1638 -126 l 1603 -121 1583 -96 1583 -58 ct 1583 -19 1606 6 1641 6 ct 1667 6 1686 -4 1705 -29 ct 1708 -5 1716 4 1737 4 ct 1741 4 1745 3 1751 1 ct 1753 0 1753 0 1755 0 ct 1755 -27 l 1748 -25 1746 -25 1744 -25 ct 1738 -25 1734 -30 1734 -38 ct 1734 -165 l 1734 -204 1708 -227 1665 -227 ct 1636 -227 1615 -217 1603 -198 ct 1596 -186 1593 -175 1592 -153 ct 1620 -153 l p 1704 -76 m 1704 -48 1678 -24 1647 -24 ct 1627 -24 1615 -38 1615 -61 ct 1615 -83 1626 -94 1654 -98 ct 1689 -104 1697 -107 1704 -112 ct 1704 -76 l p ef 1787 0 m 1817 0 l 1817 -120 l 1817 -165 1836 -194 1866 -194 ct 1883 -194 1894 -179 1894 -153 ct 1894 0 l 1924 0 l 1924 -134 l 1924 -168 1943 -194 1968 -194 ct 1990 -194 2001 -177 2001 -142 ct 2001 0 l 2031 0 l 2031 -153 l 2031 -199 2009 -227 1974 -227 ct 1952 -227 1940 -219 1920 -191 ct 1908 -217 1894 -227 1872 -227 ct 1848 -227 1831 -216 1816 -188 ct 1816 -221 l 1787 -221 l 1787 0 l p ef 2198 -69 m 2195 -44 2175 -26 2151 -26 ct 2133 -26 2118 -34 2110 -49 ct 2102 -61 2100 -73 2099 -98 ct 2231 -98 l 2230 -142 2226 -162 2216 -184 ct 2202 -214 2182 -227 2152 -227 ct 2100 -227 2066 -180 2066 -106 ct 2066 -36 2098 6 2150 6 ct 2192 6 2221 -21 2229 -69 ct 2198 -69 l p 2099 -128 m 2101 -167 2122 -194 2151 -194 ct 2167 -194 2180 -186 2188 -173 ct 2195 -162 2198 -151 2200 -128 ct 2099 -128 l p ef pom gr tm setmatrix 0 0 t 1 1 s 0 11113 t pom count op_count sub {pop} repeat countdictstack dict_count sub {end} repeat b4_inc_state restore %%PageTrailer %%Trailer %%EOF mumble-1.3.4/3rdparty/speexdsp-src/symbian/0000775000175000017500000000000014010707343020471 5ustar builderbuildermumble-1.3.4/3rdparty/speexdsp-src/symbian/Makefile.am0000664000175000017500000000035214010707343022525 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies EXTRA_DIST = bld.inf config.h speex.mmp mumble-1.3.4/3rdparty/speexdsp-src/symbian/speex.mmp0000664000175000017500000000366214010707343022337 0ustar builderbuilder/* Copyright (C) 2003 Commonwealth Scientific and Industrial Research Organisation (CSIRO) Australia Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of CSIRO Australia nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ORGANISATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ TARGET speex.lib TARGETTYPE lib UID 0 MACRO HAVE_CONFIG_H SOURCEPATH ..\libspeex SOURCE buffer.c fftwrap.c filterbank.c jitter.c kiss_fft.c kiss_fftr.c mdf.c preprocess.c resample.c scal.c smallft.c USERINCLUDE . ..\include\speex SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\include mumble-1.3.4/3rdparty/speexdsp-src/symbian/bld.inf0000664000175000017500000000461614010707343021737 0ustar builderbuilder/* Copyright (C) 2003 Commonwealth Scientific and Industrial Research Organisation (CSIRO) Australia Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of CSIRO Australia nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ORGANISATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ PRJ_EXPORTS ..\include\speex\speex_bits.h \epoc32\include\speex\speex_bits.h ..\include\speex\speex_callbacks.h \epoc32\include\speex\speex_callbacks.h ..\include\speex\speex_config_types.h \epoc32\include\speex\speex_config_types.h ..\include\speex\speex_echo.h \epoc32\include\speex\speex_echo.h ..\include\speex\speex.h \epoc32\include\speex\speex.h ..\include\speex\speex_header.h \epoc32\include\speex\speex_header.h ..\include\speex\speex_jitter.h \epoc32\include\speex\speex_jitter.h ..\include\speex\speex_preprocess.h \epoc32\include\speex\speex_preprocess.h ..\include\speex\speex_stereo.h \epoc32\include\speex\speex_stereo.h ..\include\speex\speex_types.h \epoc32\include\speex\speex_types.h PRJ_MMPFILES speex.mmp mumble-1.3.4/3rdparty/speexdsp-src/symbian/config.h0000664000175000017500000000457714010707343022124 0ustar builderbuilder/* Copyright (C) 2003 Commonwealth Scientific and Industrial Research Organisation (CSIRO) Australia Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of CSIRO Australia nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ORGANISATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef CONFIG_H #define CONFIG_H /* An inline macro is required for use of the inline keyword as not all C compilers support */ /* inline. It is officially C99 and C++ only */ #ifdef __WINS__ #define inline __inline /* Disable some pointless/stupid warnings */ #pragma warning(disable: 4100) /* unreferenced formal parameter */ #pragma warning(disable: 4127) /* conditional expression is constant */ #pragma warning(disable: 4305) /* truncation from '...' to '...' */ #pragma warning(disable: 4244) /* conversion from '...' to '...', possible loss of data */ #pragma warning(disable: 4701) /* local variable may be be used without having been initialized */ #endif /* ! __WINS__ */ /* Use only fixed point arithmetic */ #define FIXED_POINT 1 #endif /* ! CONFIG_H */ mumble-1.3.4/3rdparty/speexdsp-src/configure.ac0000664000175000017500000002213714010707343021322 0ustar builderbuilderdnl Process this file with autoconf to produce a configure script. -*-m4-*- AC_INIT([speexdsp],[1.2rc3],[speex-dev@xiph.org]) AC_CONFIG_SRCDIR([libspeexdsp/preprocess.c]) AC_CONFIG_MACRO_DIR([m4]) dnl enable silent rules on automake 1.11 and later m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) SPEEXDSP_LT_CURRENT=6 SPEEXDSP_LT_REVISION=0 SPEEXDSP_LT_AGE=5 AC_SUBST(SPEEXDSP_LT_CURRENT) AC_SUBST(SPEEXDSP_LT_REVISION) AC_SUBST(SPEEXDSP_LT_AGE) AM_INIT_AUTOMAKE([foreign no-define]) AM_MAINTAINER_MODE([enable]) AC_CANONICAL_HOST AC_LIBTOOL_WIN32_DLL AM_PROG_LIBTOOL AC_C_BIGENDIAN AC_C_CONST AC_C_INLINE AC_C_RESTRICT AC_MSG_CHECKING(for C99 variable-size arrays) AC_TRY_COMPILE( , [ int foo; foo = 10; int array[foo]; ], [has_var_arrays=yes;AC_DEFINE([VAR_ARRAYS], [], [Use C99 variable-size arrays]) ], has_var_arrays=no ) AC_MSG_RESULT($has_var_arrays) AC_CHECK_HEADERS([alloca.h getopt.h]) AC_MSG_CHECKING(for alloca) AC_TRY_COMPILE( [ #ifdef HAVE_ALLOCA_H # include #endif #include ], [ int foo=10; int *array = alloca(foo); ], [ has_alloca=yes; if test x$has_var_arrays = "xno" ; then AC_DEFINE([USE_ALLOCA], [], [Make use of alloca]) fi ], has_alloca=no ) AC_MSG_RESULT($has_alloca) AC_MSG_CHECKING(for SSE in current arch/CFLAGS) AC_LINK_IFELSE([ AC_LANG_PROGRAM([[ #include __m128 testfunc(float *a, float *b) { return _mm_add_ps(_mm_loadu_ps(a), _mm_loadu_ps(b)); } ]])], [ has_sse=yes ], [ has_sse=no ] ) AC_MSG_RESULT($has_sse) AC_MSG_CHECKING(for SSE2 in current arch/CFLAGS) AC_LINK_IFELSE([ AC_LANG_PROGRAM([[ #include __m128d testfunc(double *a, double *b) { return _mm_add_pd(_mm_loadu_pd(a), _mm_loadu_pd(b)); } ]])], [ has_sse2=yes ], [ has_sse2=no ] ) AC_MSG_RESULT($has_sse2) AC_MSG_CHECKING(for NEON in current arch/CFLAGS) AC_LINK_IFELSE([ AC_LANG_PROGRAM([[ #include int32x4_t testfunc(int16_t *a, int16_t *b) { return vmull_s16(vld1_s16(a), vld1_s16(b)); } ]])], [ has_neon=yes ], [ has_neon=no ] ) AC_MSG_RESULT($has_neon) SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -fvisibility=hidden" AC_MSG_CHECKING(for ELF visibility) AC_COMPILE_IFELSE([ AC_LANG_PROGRAM([[ #pragma GCC visibility push(hidden) __attribute__((visibility("default"))) int var=10; ]])], [ has_visibility=yes AC_DEFINE([EXPORT], [__attribute__((visibility("default")))], [Symbol visibility prefix]) ], [ has_visibility=no AC_DEFINE([EXPORT], [], [Symbol visibility prefix]) CFLAGS="$SAVE_CFLAGS" ] ) AC_MSG_RESULT($has_visibility) AC_CHECK_HEADERS(sys/soundcard.h sys/audioio.h) AC_SUBST(src) LT_LIB_M AC_ARG_ENABLE(valgrind, [ --enable-valgrind Enable valgrind extra checks], [if test "$enableval" = yes; then AC_DEFINE([ENABLE_VALGRIND], , [Enable valgrind extra checks]) fi]) AC_ARG_ENABLE(sse, [ --enable-sse Enable SSE support], [ if test "x$enableval" != xno; then has_sse=yes has_sse2=yes CFLAGS="$CFLAGS -O3 -msse -msse2" else has_sse=no has_sse2=no fi ]) AC_ARG_ENABLE(neon, [ --enable-neon Enable NEON support], [ if test "x$enableval" != xno; then has_neon=yes CFLAGS="$CFLAGS -O3 -march=armv7-a -mfpu=neon" else has_neon=no fi ]) FFT=smallft AC_ARG_ENABLE(fixed-point, [ --enable-fixed-point Compile as fixed-point], [if test "$enableval" = yes; then FFT=kiss has_sse=no AC_DEFINE([FIXED_POINT], , [Compile as fixed-point]) else AC_DEFINE([FLOATING_POINT], , [Compile as floating-point]) fi], AC_DEFINE([FLOATING_POINT], , [Compile as floating-point])) if test "$has_sse" = yes; then AC_DEFINE([_USE_SSE], , [Enable SSE support]) fi if test "$has_neon" = yes; then AC_DEFINE([_USE_NEON], , [Enable NEON support]) fi if test "$has_sse2" = yes; then AC_DEFINE([_USE_SSE2], , [Enable SSE2 support]) fi AC_ARG_ENABLE(float-api, [ --disable-float-api Disable the floating-point API], [if test "$enableval" = no; then AC_DEFINE([DISABLE_FLOAT_API], , [Disable all parts of the API that are using floats]) fi]) AC_ARG_ENABLE(examples, [ --disable-examples Do not build example programs, only the library]) if test "$enableval" != no; then AM_CONDITIONAL([BUILD_EXAMPLES], true) else AM_CONDITIONAL([BUILD_EXAMPLES], false) fi AC_ARG_ENABLE(arm4-asm, [ --enable-arm4-asm Make use of ARM4 assembly optimizations], [if test "$enableval" = yes; then AC_DEFINE([ARM4_ASM], , [Make use of ARM4 assembly optimizations]) fi]) AC_ARG_ENABLE(arm5e-asm, [ --enable-arm5e-asm Make use of ARM5E assembly optimizations], [if test "$enableval" = yes; then AC_DEFINE([ARM5E_ASM], , [Make use of ARM5E assembly optimizations]) fi]) AC_ARG_ENABLE(blackfin-asm, [ --enable-blackfin-asm Make use of Blackfin assembly optimizations], [if test "$enableval" = yes; then AC_DEFINE([BFIN_ASM], , [Make use of Blackfin assembly optimizations]) fi]) case $host_os in uclinux) LDFLAGS="-Wl,-elf2flt=-s100000 $LDFLAGS";; esac AC_ARG_ENABLE(fixed-point-debug, [ --enable-fixed-point-debug Debug fixed-point implementation], [if test "$enableval" = yes; then AC_DEFINE([FIXED_DEBUG], , [Debug fixed-point implementation]) fi]) AC_ARG_ENABLE(resample-full-sinc-table, [ --enable-resample-full-sinc-table Resample full SINC table (no interpolation)], [if test "$enableval" = yes; then AC_DEFINE([RESAMPLE_FULL_SINC_TABLE], , [Resample with full SINC table (no interpolation)]) fi]) AC_ARG_ENABLE(ti-c55x, [ --enable-ti-c55x Enable support for TI C55X DSP], [if test "$enableval" = yes; then has_char16=yes; AC_DEFINE([TI_C55X], , [Enable support for TI C55X DSP]) fi]) AC_ARG_WITH([fft], [AS_HELP_STRING([--with-fft=choice],[use an alternate FFT implementation. The available choices are kiss (default fixed point), smallft (default floating point), gpl-fftw3 and proprietary-intel-mkl])], [FFT=$withval] ) FFT_PKGCONFIG= AS_CASE([$FFT], [kiss], [ AC_DEFINE([USE_KISS_FFT], [], [Use KISS Fast Fourier Transform]) ], [smallft], [ AC_DEFINE([USE_SMALLFT], [], [Use FFT from OggVorbis]) ], [gpl-fftw3], [ AC_DEFINE([USE_GPL_FFTW3], [], [Use FFTW3 for FFT]) PKG_CHECK_MODULES([FFT], [fftw3f]) ], [proprietary-intel-mkl], [ AC_DEFINE([USE_INTEL_MKL], [], [Use Intel Math Kernel Library for FFT]) AC_MSG_CHECKING(for valid MKL) AC_LINK_IFELSE([ AC_LANG_PROGRAM([[ #include void func() { DFTI_DESCRIPTOR_HANDLE h; MKL_LONG result=DftiCreateDescriptor(&h, DFTI_SINGLE, DFTI_REAL, 0); }]])], [AC_MSG_RESULT(yes)], [AC_MSG_FAILURE([Failed to compile MKL test program. Make sure you set CFLAGS to include the include directory and set LDFLAGS to include the library directory and all necesarry libraries.])] ) ], [AC_MSG_FAILURE([Unknown FFT $FFT specified for --with-fft])] ) AM_CONDITIONAL(BUILD_KISS_FFT, [test "$FFT" = "kiss"]) AM_CONDITIONAL(BUILD_SMALLFT, [test "$FFT" = "smallft"]) AC_SUBST(FFT_PKGCONFIG) AC_CHECK_SIZEOF([int16_t]) AC_CHECK_SIZEOF([uint16_t]) AC_CHECK_SIZEOF([u_int16_t]) AC_CHECK_SIZEOF([int32_t]) AC_CHECK_SIZEOF([uint32_t]) AC_CHECK_SIZEOF([u_int32_t]) AC_CHECK_SIZEOF([short]) AC_CHECK_SIZEOF([int]) AC_CHECK_SIZEOF([long]) AS_IF([test "$has_char16" = "yes"], [ SIZEOF16=1 SIZEOF32=2 ],[ SIZEOF16=2 SIZEOF32=4 ]) case $SIZEOF16 in $ac_cv_sizeof_int16_t) SIZE16="int16_t";; $ac_cv_sizeof_short) SIZE16="short";; $ac_cv_sizeof_int) SIZE16="int";; esac case $SIZEOF16 in $ac_cv_sizeof_uint16_t) USIZE16="uint16_t";; $ac_cv_sizeof_u_int16_t) USIZE16="u_int16_t";; $ac_cv_sizeof_short) USIZE16="unsigned short";; $ac_cv_sizeof_int) USIZE16="unsigned int";; esac case $SIZEOF32 in $ac_cv_sizeof_int32_t) SIZE32="int32_t";; $ac_cv_sizeof_int) SIZE32="int";; $ac_cv_sizeof_long) SIZE32="long";; $ac_cv_sizeof_short) SIZE32="short";; esac case $SIZEOF32 in $ac_cv_sizeof_uint32_t) USIZE32="uint32_t";; $ac_cv_sizeof_u_int32_t) USIZE32="u_int32_t";; $ac_cv_sizeof_short) USIZE32="unsigned short";; $ac_cv_sizeof_int) USIZE32="unsigned int";; $ac_cv_sizeof_long) USIZE32="unsigned long";; esac AS_IF([test -z "$SIZE16"],[AC_MSG_ERROR([No 16 bit type found on this platform!])]) AS_IF([test -z "$SIZE32"],[AC_MSG_ERROR([No 32 bit type found on this platform!])]) AS_IF([test -z "$USIZE16"],[AC_MSG_ERROR([No unsigned 16 bit type found on this platform!])]) AS_IF([test -z "$USIZE32"],[AC_MSG_ERROR([No unsigned 32 bit type found on this platform!])]) AC_SUBST([SIZE16]) AC_SUBST([USIZE16]) AC_SUBST([SIZE32]) AC_SUBST([USIZE32]) AC_CONFIG_FILES([ Makefile libspeexdsp/Makefile doc/Makefile SpeexDSP.spec include/Makefile include/speex/Makefile speexdsp.pc win32/Makefile win32/libspeexdsp/Makefile symbian/Makefile win32/VS2003/Makefile win32/VS2003/libspeexdsp/Makefile win32/VS2003/tests/Makefile win32/VS2005/Makefile win32/VS2005/libspeexdsp/Makefile win32/VS2005/tests/Makefile win32/VS2008/Makefile win32/VS2008/libspeexdsp/Makefile win32/VS2008/tests/Makefile include/speex/speexdsp_config_types.h ti/Makefile ti/speex_C54_test/Makefile ti/speex_C55_test/Makefile ti/speex_C64_test/Makefile ]) AC_CONFIG_HEADERS([config.h]) AC_OUTPUT echo "Type \"make; make install\" to compile and install Speex"; mumble-1.3.4/3rdparty/speexdsp-src/NEWS0000664000175000017500000000005414010707343017525 0ustar builderbuilder2002/02/13: Creation of the "Speex" project mumble-1.3.4/3rdparty/speex-build/0000775000175000017500000000000014010707273016632 5ustar builderbuildermumble-1.3.4/3rdparty/speex-build/speex_config_types.h0000664000175000017500000000034114010707273022676 0ustar builderbuilder#ifndef __SPEEX_TYPES_H__ #define __SPEEX_TYPES_H__ /* these are filled in by configure */ typedef short spx_int16_t; typedef unsigned short spx_uint16_t; typedef int spx_int32_t; typedef unsigned int spx_uint32_t; #endif mumble-1.3.4/3rdparty/speex-build/SpeexMark.pro0000664000175000017500000000040414010707273021251 0ustar builderbuilderinclude(../../qmake/compiler.pri) TEMPLATE =app CONFIG += qt warn_on release console QT -= gui TARGET = SpeexMark SOURCES = SpeexMark.cpp HEADERS = Timer.h INCLUDEPATH = ../src ../speex-src/include LIBS += -lspeex QMAKE_LIBDIR = ../../release $$QMAKE_LIBDIR mumble-1.3.4/3rdparty/speex-build/speexdsp_config_types.h0000664000175000017500000000034114010707273023405 0ustar builderbuilder#ifndef __SPEEX_TYPES_H__ #define __SPEEX_TYPES_H__ /* these are filled in by configure */ typedef short spx_int16_t; typedef unsigned short spx_uint16_t; typedef int spx_int32_t; typedef unsigned int spx_uint32_t; #endif mumble-1.3.4/3rdparty/speex-build/AGC.pro0000664000175000017500000000037014010707273017746 0ustar builderbuilderinclude(../../qmake/compiler.pri) TEMPLATE =app CONFIG += qt warn_on release console QT -= gui TARGET = AGC SOURCES = AGC.cpp HEADERS = Timer.h INCLUDEPATH = ../src ../speex-src/include LIBS += -lspeex QMAKE_LIBDIR = ../../release $$QMAKE_LIBDIR mumble-1.3.4/3rdparty/speex-build/mumble_speex_init.c0000664000175000017500000000065714010707273022516 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef USE_INTEL_IPP #include #endif EXPORT void mumble_speex_init() { #ifdef USE_INTEL_IPP ippStaticInit(); #endif } mumble-1.3.4/3rdparty/speex-build/speex.def0000664000175000017500000000457614010707273020452 0ustar builderbuilder; ; speex.def ; LIBRARY speex EXPORTS ; ; ; speex.h ; speex_encoder_init speex_encoder_destroy speex_encode speex_encode_int speex_encoder_ctl speex_decoder_init speex_decoder_destroy speex_decode speex_decode_int speex_decoder_ctl speex_mode_query speex_lib_ctl speex_lib_get_mode ; ; speex_bits.h ; speex_bits_init speex_bits_init_buffer speex_bits_set_bit_buffer speex_bits_destroy speex_bits_reset speex_bits_rewind speex_bits_read_from speex_bits_read_whole_bytes speex_bits_write speex_bits_write_whole_bytes speex_bits_pack speex_bits_unpack_signed speex_bits_unpack_unsigned speex_bits_nbytes speex_bits_peek_unsigned speex_bits_peek speex_bits_advance speex_bits_remaining speex_bits_insert_terminator ; ; speex_callbacks.h ; speex_inband_handler speex_std_mode_request_handler speex_std_high_mode_request_handler speex_std_char_handler speex_default_user_handler speex_std_low_mode_request_handler speex_std_vbr_request_handler speex_std_enh_request_handler speex_std_vbr_quality_request_handler ; ; speex_header.h ; speex_init_header speex_header_to_packet speex_packet_to_header ; ; speex_echo.h ; speex_echo_state_init speex_echo_state_init_mc speex_echo_state_destroy speex_echo_cancellation speex_echo_cancel speex_echo_capture speex_echo_playback speex_echo_state_reset speex_echo_ctl speex_decorrelate_new speex_decorrelate speex_decorrelate_destroy ; ; speex_jitter.h ; jitter_buffer_init jitter_buffer_reset jitter_buffer_destroy jitter_buffer_put jitter_buffer_get jitter_buffer_get_pointer_timestamp jitter_buffer_tick jitter_buffer_update_delay jitter_buffer_ctl ; ; speex_preprocess.h ; speex_preprocess_state_init speex_preprocess_state_destroy speex_preprocess_run speex_preprocess speex_preprocess_estimate_update speex_preprocess_ctl ; ; speex_resampler.h ; speex_resampler_init speex_resampler_init_frac speex_resampler_destroy speex_resampler_process_float speex_resampler_process_int speex_resampler_process_interleaved_float speex_resampler_process_interleaved_int speex_resampler_set_rate speex_resampler_get_rate speex_resampler_set_rate_frac speex_resampler_get_ratio speex_resampler_set_quality speex_resampler_get_quality speex_resampler_set_input_stride speex_resampler_get_input_stride speex_resampler_set_output_stride speex_resampler_get_output_stride speex_resampler_skip_zeros speex_resampler_reset_mem speex_resampler_strerror speex_resampler_get_input_latency mumble_speex_init mumble-1.3.4/3rdparty/speex-build/speex-build.pro0000664000175000017500000000425014010707273021576 0ustar builderbuilderinclude(../../qmake/compiler.pri) !exists(../speex-src/COPYING) | !exists(../speexdsp-src/COPYING) { message("The speex-src/ or speexdsp-src/ directories were not found. You need to do one of the following:") message("") message("Option 1: Use Speex Git:") message("git submodule init") message("git submodule update") message("") message("Option 2: Use system speex and speex-dsp (v 1.2 or later):") message("qmake CONFIG+=no-bundled-speex -recursive") message("") error("Aborting configuration") } TEMPLATE = lib CONFIG -= qt CONFIG += debug_and_release CONFIG -= warn_on CONFIG += warn_off CONFIG += no_include_pwd # Enable no_batch, which disables nmake's inference rules. # We have to do this because we use files from two VPATHs # below, and nmake is unable to figure out how to handle # that. CONFIG += no_batch VPATH = ../speex-src/libspeex ../speexdsp-src/libspeexdsp TARGET = speex DEFINES += NDEBUG HAVE_CONFIG_H INCLUDEPATH = ../speex-src/include ../speex-src/libspeex ../speexdsp-src/include ../speexdsp-src/libspeexdsp win32 { INCLUDEPATH += ../speex-build/win32 DEFINES+=WIN32 _WINDOWS _USE_SSE _USE_MATH_DEFINES win32-g++ { # MinGW uses the config.h for Unix-like systems. INCLUDEPATH += ../speex-build } win32-msvc* { INCLUDEPATH += ../speex-build/win32 CONFIG(sse2) { TARGET = speex.sse2 DEFINES += _USE_SSE2 } else { QMAKE_CFLAGS_RELEASE -= -arch:SSE QMAKE_CFLAGS_DEBUG -= -arch:SSE } } SOURCES *= mumble_speex_init.c CONFIG -= static CONFIG += shared DEFINES+=USE_SMALLFT } else { CONFIG += staticlib INCLUDEPATH += ../speex-build } DEF_FILE = speex.def # libspeexdsp SOURCES *= mdf.c resample.c preprocess.c jitter.c filterbank.c fftwrap.c smallft.c # libspeex SOURCES *= bits.c cb_search.c exc_10_16_table.c exc_10_32_table.c exc_20_32_table.c exc_5_256_table.c exc_5_64_table.c exc_8_128_table.c filters.c gain_table.c gain_table_lbr.c hexc_10_32_table.c hexc_table.c high_lsp_tables.c lpc.c lsp.c lsp_tables_nb.c ltp.c modes.c modes_wb.c nb_celp.c quant_lsp.c sb_celp.c scal.c speex.c speex_callbacks.c speex_header.c stereo.c vbr.c vq.c kiss_fft.c kiss_fftr.c vorbis_psy.c window.c mumble-1.3.4/3rdparty/speex-build/AGC.cpp0000664000175000017500000000656214010707273017741 0ustar builderbuilder#include #ifdef Q_OS_WIN #define _WIN32_IE 0x0600 #include #include #define CALLGRIND_START_INSTRUMENTATION #define CALLGRIND_STOP_INSTRUMENTATION #define CALLGRIND_ZERO_STATS #else #include #endif #include #include #include #include "Timer.h" template static inline double veccomp(const QVector &a, const QVector &b, const char *n) { long double gdiff = 0.0; if (a.size() != b.size()) { qFatal("%s: %d <=> %d", n, a.size(), b.size()); } for (int i=0;i gdiff) gdiff = diff; #ifdef EXACT if (a[i] != b[i]) { #else union { T tv; uint32_t uv; } v1, v2; v1.uv = v2.uv = 0; v1.tv = a[i]; v2.tv = b[i]; if (fabsf(a[i] - b[i]) > 1000) { qWarning("%08x %08x %08x", v1.uv, v2.uv, v1.uv ^ v2.uv); #endif qFatal("%s: Offset %d: %.10g <=> %.10g", n, i, static_cast(a[i]), static_cast(b[i])); } } return gdiff; } int main(int argc, char **argv) { CALLGRIND_STOP_INSTRUMENTATION; CALLGRIND_ZERO_STATS; QCoreApplication a(argc, argv); QFile f((argc >= 2) ? argv[1] : "wb_male.wav"); if (! f.open(QIODevice::ReadOnly)) { qFatal("Failed to open file!"); } f.seek(36 + 8); QFile o("output.agc"); if (! o.open(QIODevice::WriteOnly)) qFatal("Failed to open out file!"); QFile vf("verify.agc"); if (! vf.open(QIODevice::ReadOnly)) qWarning("No verify!"); QDataStream out(&o); QDataStream verify(&vf); static const int iFrameSize = 320; int iarg; SpeexPreprocessState *spp = speex_preprocess_state_init(iFrameSize, 16000); iarg = 0; speex_preprocess_ctl(spp, SPEEX_PREPROCESS_SET_VAD, &iarg); speex_preprocess_ctl(spp, SPEEX_PREPROCESS_SET_DENOISE, &iarg); speex_preprocess_ctl(spp, SPEEX_PREPROCESS_SET_DEREVERB, &iarg); iarg = 1; speex_preprocess_ctl(spp, SPEEX_PREPROCESS_SET_AGC, &iarg); iarg = 21747; speex_preprocess_ctl(spp, SPEEX_PREPROCESS_SET_AGC_TARGET, &iarg); QVector v; while (1) { QByteArray qba = f.read(iFrameSize * sizeof(short)); if (qba.size() != iFrameSize * sizeof(short)) break; v.append(qba); } int nframes = v.size(); qWarning("Ready to process %d frames of %d samples", nframes, iFrameSize); QVector qvIn; QVector sIn(nframes * iFrameSize); for (int i=0;i(v[i].constData()); short *s = sIn.data() + i * iFrameSize; for (int j=0;j vIn; verify >> vIn; veccomp(vIn, sIn, "AGC"); } } return 0; } mumble-1.3.4/3rdparty/speex-build/win32/0000775000175000017500000000000014010707273017574 5ustar builderbuildermumble-1.3.4/3rdparty/speex-build/win32/config.h0000664000175000017500000000127614010707273021220 0ustar builderbuilder// Microsoft version of 'inline' #define inline __inline // In Visual Studio, _M_IX86_FP=1 means /arch:SSE was used, likewise // _M_IX86_FP=2 means /arch:SSE2 was used. // Also, enable both _USE_SSE and _USE_SSE2 if we're compiling for x86-64 #if _M_IX86_FP >= 1 || defined(_M_X64) #define _USE_SSE #endif #if _M_IX86_FP >= 2 || defined(_M_X64) #define _USE_SSE2 #endif // Visual Studio support alloca(), but it always align variables to 16-bit // boundary, while SSE need 128-bit alignment. So we disable alloca() when // SSE is enabled. #ifndef _USE_SSE # define USE_ALLOCA #endif /* Default to floating point */ #define FLOATING_POINT /* We don't support visibility on Win32 */ #define EXPORT mumble-1.3.4/3rdparty/speex-build/ResampMark.cpp0000664000175000017500000002410314010707273021400 0ustar builderbuilder#include static const float tfreq1 = 48000.f; static const float tfreq2 = 44100.f; static const int qual = 3; static const int loops = 2000 / qual; // static const int loops = 1; #define SM_VERIFY // #define EXACT #ifdef Q_OS_WIN #define _WIN32_IE 0x0600 #include #include #include #define CALLGRIND_START_INSTRUMENTATION #define CALLGRIND_STOP_INSTRUMENTATION #define CALLGRIND_ZERO_STATS #define RUNNING_ON_VALGRIND 0 #else #include #include #include #endif #include #include #include #include "Timer.h" template static inline double veccomp(const QVector &a, const QVector &b, const char *n) { long double gdiff = 0.0; if (a.size() != b.size()) { qFatal("%s: %d <=> %d", n, a.size(), b.size()); } for (int i=0;i gdiff) gdiff = diff; #ifdef EXACT if (a[i] != b[i]) { #else union { T tv; quint32 uv; } v1, v2; v1.uv = v2.uv = 0; v1.tv = a[i]; v2.tv = b[i]; if (fabsf(a[i] - b[i]) > 1) { qWarning("%08x %08x %08x", v1.uv, v2.uv, v1.uv ^ v2.uv); #endif qFatal("%s: Offset %d: %.10g <=> %.10g", n, i, static_cast(a[i]), static_cast(b[i])); } } return gdiff; } template QPair confint(const QVector &vecin) { long double avg = 0.0; long double stddev = 0.0; QVector vec = vecin; qSort(vec.begin(), vec.end()); for (int i=0;i(static_cast(avg), static_cast(1.96 * stddev)); } int main(int argc, char **argv) { CALLGRIND_STOP_INSTRUMENTATION; CALLGRIND_ZERO_STATS; QCoreApplication a(argc, argv); QFile f((argc >= 2) ? argv[1] : "wb_male.wav"); if (! f.open(QIODevice::ReadOnly)) { qFatal("Failed to open file!"); } f.seek(36 + 8); QFile o("output.raw"); if (!(RUNNING_ON_VALGRIND)) if (! o.open(QIODevice::WriteOnly)) qFatal("Failed to open output!"); QFile vf((argc >= 3) ? argv[2] : "verify.raw"); if (! vf.open(QIODevice::ReadOnly)) { qWarning("Failed to open validate file!"); } QDataStream out(&o); QDataStream verify(&vf); const int iFrameSize = 320; QVector v; while (1) { QByteArray qba = f.read(iFrameSize * 2); if (qba.size() != iFrameSize * 2) break; v.append(qba); } int nframes = v.size(); qWarning("Ready to process %d frames of %d samples", nframes, iFrameSize); QVector qvInShort; QVector qvIn; QVector qvDirect; QVector qvInterpolate; QVector qvInterpolateMC; QVector qvInterpolateShort; QVector qv8; QVector qv96; const float sfraq1 = tfreq1 / 16000.0f; float fOutSize1 = iFrameSize * sfraq1; int iOutSize1 = lroundf(fOutSize1); const float sfraq2 = tfreq2 / 16000.0f; float fOutSize2 = iFrameSize * sfraq2; int iOutSize2 = lroundf(fOutSize2); int iOutSize8 = iFrameSize / 2; int iOutSize96 = iFrameSize * 6; if (RUNNING_ON_VALGRIND) nframes = qMin(nframes, 10); QVector fInput(nframes * iFrameSize); QVector fDirect(nframes * iOutSize1); QVector fInterpolate(nframes * iOutSize2); QVector fInterpolateMC(nframes * iOutSize2); QVector sInterpolate(nframes * iOutSize2); QVector f96(nframes * iOutSize96); QVector f8(nframes *iOutSize8); for (int i=0;i(v[i].data()); float *f = fInput.data() + i * iFrameSize; for (int j=0;j qvTimes; QPair ci; for (int j=0;j 8: %8llu +/- %3llu usec (%d)", ci.first, ci.second, qvTimes.count()); qvTimes.clear(); t.restart(); for (int j=0;j 96: %8llu +/- %3llu usec (%d)", ci.first, ci.second, qvTimes.count()); speex_resampler_reset_mem(srs1); speex_resampler_reset_mem(srs2); } t.restart(); CALLGRIND_START_INSTRUMENTATION; for (int i=0;i fMagic; for (int f=0;f<10;f++) { float fbuff[32767]; speex_resampler_set_rate(srs1, 16000, freq[f]); for (int q = 0;q < 10;q++) { speex_resampler_set_quality(srs1, (3*q) % 7); inlen = iFrameSize; outlen = 32767; speex_resampler_process_float(srs1, 0, qvIn[(f*10+q) % nframes], &inlen, fbuff, &outlen); for (int j=0;j vDirect; QVector vInterpolate; QVector vsInterpolate; QVector vMagic; QVector vInterpolateMC; out << fDirect << fInterpolate << sInterpolate << fMagic << fInterpolateMC; if (vf.isOpen()) { verify >> vDirect >> vInterpolate >> vsInterpolate >> vMagic >> vInterpolateMC; double rmsd = veccomp(vDirect, fDirect, "SRS1"); double rmsi = veccomp(vInterpolate, fInterpolate, "SRS2"); veccomp(vsInterpolate, sInterpolate, "SRS2i"); veccomp(vMagic, fMagic, "Magic"); veccomp(vInterpolateMC, fInterpolateMC, "MC"); qWarning("Direct: %g", rmsd); qWarning("Interp: %g", rmsi); } else { qWarning("No verification!"); } } return 0; } mumble-1.3.4/3rdparty/speex-build/ResampMark.pro0000664000175000017500000000041114010707273021412 0ustar builderbuilderinclude(../../qmake/compiler.pri) TEMPLATE =app CONFIG += qt warn_on release console QT -= gui TARGET = ResampMark SOURCES = ResampMark.cpp HEADERS = Timer.h INCLUDEPATH = ../../src ../speex-src/include LIBS += -lspeex QMAKE_LIBDIR = ../../release $$QMAKE_LIBDIR mumble-1.3.4/3rdparty/speex-build/config.h0000664000175000017500000000743214010707273020256 0ustar builderbuilder/* config.h. Generated from config.h.in by configure. */ /* config.h.in. Generated from configure.ac by autoheader. */ /* Make use of ARM4 assembly optimizations */ /* #undef ARM4_ASM */ /* Make use of ARM5E assembly optimizations */ /* #undef ARM5E_ASM */ /* Make use of Blackfin assembly optimizations */ /* #undef BFIN_ASM */ /* Enable valgrind extra checks */ /* #undef ENABLE_VALGRIND */ /* Debug fixed-point implementation */ /* #undef FIXED_DEBUG */ /* Compile as fixed-point */ /* #undef FIXED_POINT */ /* Compile as floating-point */ #define FLOATING_POINT /* Define to 1 if you have the header file. */ #define HAVE_ALLOCA_H 1 /* Define to 1 if you have the header file. */ #define HAVE_DLFCN_H 1 /* Define to 1 if you have the `getopt_long' function. */ #define HAVE_GETOPT_LONG 1 /* Define to 1 if you have the header file. */ #define HAVE_INTTYPES_H 1 /* Define to 1 if you have the `m' library (-lm). */ #define HAVE_LIBM 1 /* Define to 1 if you have the `winmm' library (-lwinmm). */ /* #undef HAVE_LIBWINMM */ /* Define to 1 if you have the header file. */ #define HAVE_MEMORY_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STDINT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STDLIB_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STRINGS_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STRING_H 1 /* Define to 1 if you have the header file. */ /* #undef HAVE_SYS_AUDIOIO_H */ /* Define to 1 if you have the header file. */ #define HAVE_SYS_SOUNDCARD_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_STAT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_TYPES_H 1 /* Define to 1 if you have the header file. */ #define HAVE_UNISTD_H 1 /* Define to the address where bug reports for this package should be sent. */ #define PACKAGE_BUGREPORT "" /* Define to the full name of this package. */ #define PACKAGE_NAME "" /* Define to the full name and version of this package. */ #define PACKAGE_STRING "" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "" /* Define to the version of this package. */ #define PACKAGE_VERSION "" /* The size of `int', as computed by sizeof. */ #define SIZEOF_INT 4 /* The size of `long', as computed by sizeof. */ #define SIZEOF_LONG 4 /* The size of `short', as computed by sizeof. */ #define SIZEOF_SHORT 2 /* Version extra */ #define SPEEX_EXTRA_VERSION "-git" /* Version major */ #define SPEEX_MAJOR_VERSION 1 /* Version micro */ #define SPEEX_MICRO_VERSION 15 /* Version minor */ #define SPEEX_MINOR_VERSION 1 /* Complete version string */ #define SPEEX_VERSION "1.2beta3" /* Define to 1 if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* Enable support for TI C55X DSP */ /* #undef TI_C55X */ /* Make use of alloca */ /* #undef USE_ALLOCA */ /* Use C99 variable-size arrays */ #define VAR_ARRAYS /* Define to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel and VAX). */ /* #undef WORDS_BIGENDIAN */ /* Enable SSE support */ #ifdef __SSE__ #define _USE_SSE #endif #ifdef __SSE2__ #define _USE_SSE2 #endif #define EXPORT #define USE_SMALLFT /* Define to empty if `const' does not conform to ANSI C. */ /* #undef const */ /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus /* #undef inline */ #endif /* Define to equivalent of C99 restrict keyword, or to nothing if this is not supported. Do not define if restrict is supported directly. */ #define restrict __restrict mumble-1.3.4/3rdparty/speex-build/SpeexMark.cpp0000664000175000017500000001062314010707273021237 0ustar builderbuilder #if defined(__INTEL_COMPILER) #include #else #include #endif #include static const float tfreq1 = 48000.f; static const float tfreq2 = 44100.f; #ifdef Q_OS_WIN #define _WIN32_IE 0x0600 #include #include #define CALLGRIND_START_INSTRUMENTATION #define CALLGRIND_STOP_INSTRUMENTATION #define CALLGRIND_ZERO_STATS #define lroundf(x) ( static_cast( (x) + ((x) >= 0.0f ? 0.5f : -0.5f) ) ) #define lround(x) ( static_cast( (x) + ((x) >= 0.0 ? 0.5 : -0.5) ) ) #else #include #endif #include #include #include #include #include #include #include "Timer.h" int main(int argc, char **argv) { CALLGRIND_STOP_INSTRUMENTATION; CALLGRIND_ZERO_STATS; QCoreApplication a(argc, argv); QFile f((argc >= 2) ? argv[1] : "wb_male.wav"); if (! f.open(QIODevice::ReadOnly)) { qFatal("Failed to open file!"); } f.seek(36 + 8); void *enc = speex_encoder_init(&speex_wb_mode); int iarg = 1; speex_encoder_ctl(enc, SPEEX_SET_VBR, &iarg); iarg = 0; speex_encoder_ctl(enc, SPEEX_SET_VAD, &iarg); speex_encoder_ctl(enc, SPEEX_SET_DTX, &iarg); float farg = 6.0; speex_encoder_ctl(enc, SPEEX_SET_VBR_QUALITY, &farg); speex_encoder_ctl(enc, SPEEX_GET_BITRATE, &iarg); speex_encoder_ctl(enc, SPEEX_SET_VBR_MAX_BITRATE, &iarg); iarg = 4; speex_encoder_ctl(enc, SPEEX_SET_COMPLEXITY, &iarg); int iFrameSize; speex_encoder_ctl(enc, SPEEX_GET_FRAME_SIZE, &iFrameSize); void *dec = speex_decoder_init(&speex_wb_mode); iarg = 1; speex_decoder_ctl(dec, SPEEX_SET_ENH, &iarg); SpeexPreprocessState *spp = speex_preprocess_state_init(iFrameSize, 16000); iarg = 1; speex_preprocess_ctl(spp, SPEEX_PREPROCESS_SET_VAD, &iarg); speex_preprocess_ctl(spp, SPEEX_PREPROCESS_SET_DENOISE, &iarg); speex_preprocess_ctl(spp, SPEEX_PREPROCESS_SET_AGC, &iarg); speex_preprocess_ctl(spp, SPEEX_PREPROCESS_SET_DEREVERB, &iarg); SpeexEchoState *ses = speex_echo_state_init(iFrameSize, iFrameSize * 10); iarg = 16000; speex_echo_ctl(ses, SPEEX_SET_SAMPLING_RATE, &iarg); speex_preprocess_ctl(spp, SPEEX_PREPROCESS_SET_ECHO_STATE, ses); QVector v; while (1) { QByteArray qba = f.read(iFrameSize * 2); if (qba.size() != iFrameSize * 2) break; v.append(qba); } int nframes = v.size(); qWarning("Ready to process %d frames of %d samples", nframes, iFrameSize); QVector sv; short tframe[2048]; for (int i=0;i(v[i].data())); } float oframe[2048]; float resampframe[32768]; const float sfraq1 = tfreq1 / 16000.0f; float fOutSize1 = iFrameSize * sfraq1; int iOutSize1 = lroundf(fOutSize1); const float sfraq2 = tfreq2 / 16000.0f; float fOutSize2 = iFrameSize * sfraq2; int iOutSize2 = lroundf(fOutSize2); int err; SpeexResamplerState *srs1 = speex_resampler_init(1, 16000, lroundf(tfreq1), 3, &err); SpeexResamplerState *srs2 = speex_resampler_init(1, 16000, lroundf(tfreq2), 3, &err); SpeexBits sb; speex_bits_init(&sb); #ifdef Q_OS_WIN if (!SetPriorityClass(GetCurrentProcess(),REALTIME_PRIORITY_CLASS)) qWarning("Application: Failed to set priority!"); #endif int len; char data[4096]; spx_uint32_t inlen; spx_uint32_t outlen; Timer t; t.restart(); nframes = qMin(nframes, 10); int iter = 100; CALLGRIND_START_INSTRUMENTATION; for (int j=0;j Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef MUMBLE_BONJOURSERVICERESOLVER_H_ #define MUMBLE_BONJOURSERVICERESOLVER_H_ #include #include #include #include "BonjourRecord.h" class QSocketNotifier; class BonjourServiceResolver : public QObject { Q_OBJECT protected: struct ResolveRecord { BonjourRecord record; BonjourServiceResolver *bsr; DNSServiceRef dnssref; QSocketNotifier *bonjourSocket; int bonjourPort; ResolveRecord(const BonjourRecord &, BonjourServiceResolver *); ~ResolveRecord(); }; QMap qmResolvers; public: BonjourServiceResolver(QObject *parent); ~BonjourServiceResolver(); void resolveBonjourRecord(const BonjourRecord &record); signals: void bonjourRecordResolved(BonjourRecord record, QString hostname, int port); void error(BonjourRecord record, DNSServiceErrorType error); private slots: void bonjourSocketReadyRead(int); private: static void DNSSD_API bonjourResolveReply(DNSServiceRef sdRef, DNSServiceFlags flags, quint32 interfaceIndex, DNSServiceErrorType errorCode, const char *fullName, const char *hosttarget, quint16 port, quint16 txtLen, const unsigned char *txtRecord, void *context); }; #endif mumble-1.3.4/3rdparty/qqbonjour-src/README0000664000175000017500000000062414010707273020100 0ustar builderbuilderThe files in this directory are originally from an article in Qt Quarterly 23: https://doc.qt.io/archives/qq/qq23-bonjour.html The files in this directory are used directly in the Mumble and Murmur build. Because of this, there is no "qqbonjour-build" directory. These files are modified and are now de facto maintained by the Mumble project. For information about the license, see the LICENSE file. mumble-1.3.4/3rdparty/qqbonjour-src/BonjourServiceBrowser.h0000664000175000017500000000455514010707273023703 0ustar builderbuilder/* Copyright (c) 2007, Trenton Schulz Copyright (c) 2009-2011, Stefan Hacker Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef MUMBLE_BONJOURSERVICEBROWSER_H_ #define MUMBLE_BONJOURSERVICEBROWSER_H_ #include #include #include "BonjourRecord.h" class QSocketNotifier; class BonjourServiceBrowser : public QObject { Q_OBJECT public: BonjourServiceBrowser(QObject *parent = 0); ~BonjourServiceBrowser(); void browseForServiceType(const QString &serviceType); inline QList currentRecords() const { return bonjourRecords; } signals: void currentBonjourRecordsChanged(const QList &list); void error(DNSServiceErrorType err); private slots: void bonjourSocketReadyRead(); private: static void DNSSD_API bonjourBrowseReply(DNSServiceRef , DNSServiceFlags flags, quint32, DNSServiceErrorType errorCode, const char *serviceName, const char *regType, const char *replyDomain, void *context); DNSServiceRef dnssref; QSocketNotifier *bonjourSocket; QList bonjourRecords; }; #endif mumble-1.3.4/3rdparty/qqbonjour-src/BonjourServiceRegister.h0000664000175000017500000000455314010707273024042 0ustar builderbuilder/* Copyright (c) 2007, Trenton Schulz Copyright (c) 2009-2011, Stefan Hacker Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef MUMBLE_BONJOUR_SERVICE_REGISTER_H_ #define MUMBLE_BONJOUR_SERVICE_REGISTER_H_ // Bonjour flags #include #include #include "BonjourRecord.h" class QSocketNotifier; class BonjourServiceRegister : public QObject { Q_OBJECT public: BonjourServiceRegister(QObject *p = 0); ~BonjourServiceRegister(); void registerService(const BonjourRecord &record, quint16 servicePort); inline BonjourRecord registeredRecord() const { return finalRecord; } signals: void error(DNSServiceErrorType error); void serviceRegistered(const BonjourRecord &record); private slots: void bonjourSocketReadyRead(); private: static void DNSSD_API bonjourRegisterService(DNSServiceRef sdRef, DNSServiceFlags, DNSServiceErrorType errorCode, const char *name, const char *regtype, const char *domain, void *context); DNSServiceRef dnssref; QSocketNotifier *bonjourSocket; BonjourRecord finalRecord; }; #endif mumble-1.3.4/3rdparty/qqbonjour-src/BonjourRecord.h0000664000175000017500000000431614010707273022150 0ustar builderbuilder/* Copyright (c) 2007, Trenton Schulz Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef MUMBLE_BONJOUR_RECORD_H_ #define MUMBLE_BONJOUR_RECORD_H_ #include #include class BonjourRecord { public: BonjourRecord() {} BonjourRecord(const QString &name, const QString ®Type, const QString &domain) : serviceName(name), registeredType(regType), replyDomain(domain) {} BonjourRecord(const char *name, const char *regType, const char *domain) { serviceName = QString::fromUtf8(name); registeredType = QString::fromUtf8(regType); replyDomain = QString::fromUtf8(domain); } QString serviceName; QString registeredType; QString replyDomain; bool operator==(const BonjourRecord &other) const { return serviceName == other.serviceName && registeredType == other.registeredType && replyDomain == other.replyDomain; } }; Q_DECLARE_METATYPE(BonjourRecord) #endif mumble-1.3.4/3rdparty/qqbonjour-src/BonjourServiceResolver.cpp0000664000175000017500000000763414010707273024415 0ustar builderbuilder/* Copyright (c) 2007, Trenton Schulz Copyright (C) 2009-2011, Thorvald Natvig Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef MUMBLE #include "mumble_pch.hpp" #else #include "murmur_pch.h" #endif #include "BonjourServiceResolver.h" BonjourServiceResolver::ResolveRecord::ResolveRecord(const BonjourRecord &r, BonjourServiceResolver *p) : record(r), bsr(p), dnssref(NULL), bonjourSocket(NULL), bonjourPort(-1) { } BonjourServiceResolver::ResolveRecord::~ResolveRecord() { delete bonjourSocket; if (dnssref) DNSServiceRefDeallocate(dnssref); } BonjourServiceResolver::BonjourServiceResolver(QObject *p) : QObject(p) { } BonjourServiceResolver::~BonjourServiceResolver() { foreach(ResolveRecord *rr, qmResolvers) delete rr; } void BonjourServiceResolver::resolveBonjourRecord(const BonjourRecord &record) { ResolveRecord *rr = new ResolveRecord(record, this); DNSServiceErrorType err = DNSServiceResolve(& rr->dnssref, 0, 0, record.serviceName.toUtf8().constData(), record.registeredType.toUtf8().constData(), record.replyDomain.toUtf8().constData(), static_cast(bonjourResolveReply), rr); if (err == kDNSServiceErr_NoError) { int sockfd = DNSServiceRefSockFD(rr->dnssref); if (sockfd == -1) { err = kDNSServiceErr_Invalid; } else { rr->bonjourSocket = new QSocketNotifier(sockfd, QSocketNotifier::Read, this); connect(rr->bonjourSocket, SIGNAL(activated(int)), this, SLOT(bonjourSocketReadyRead(int))); qmResolvers.insert(sockfd, rr); return; } } emit error(record, err); delete rr; } void BonjourServiceResolver::bonjourSocketReadyRead(int sockfd) { ResolveRecord *rr = qmResolvers.value(sockfd); if (! rr) return; DNSServiceErrorType err = DNSServiceProcessResult(rr->dnssref); if (err != kDNSServiceErr_NoError) { emit error(rr->record, err); qmResolvers.remove(DNSServiceRefSockFD(rr->dnssref)); delete rr; } } void BonjourServiceResolver::bonjourResolveReply(DNSServiceRef, DNSServiceFlags , quint32 , DNSServiceErrorType errorCode, const char *, const char *hosttarget, quint16 port, quint16 , const unsigned char *, void *context) { ResolveRecord *rr = static_cast(context); rr->bsr->qmResolvers.remove(DNSServiceRefSockFD(rr->dnssref)); if (errorCode != kDNSServiceErr_NoError) { emit rr->bsr->error(rr->record, errorCode); delete rr; return; } rr->bonjourPort = qFromBigEndian(port); emit rr->bsr->bonjourRecordResolved(rr->record, QString::fromUtf8(hosttarget), rr->bonjourPort); delete rr; } mumble-1.3.4/3rdparty/qqbonjour-src/BonjourServiceRegister.cpp0000664000175000017500000000736114010707273024375 0ustar builderbuilder/* Copyright (c) 2007, Trenton Schulz Copyright (c) 2009-2011, Stefan Hacker Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "murmur_pch.h" #include "BonjourServiceRegister.h" BonjourServiceRegister::BonjourServiceRegister(QObject *p) : QObject(p), dnssref(0), bonjourSocket(0) { } BonjourServiceRegister::~BonjourServiceRegister() { if (dnssref) { DNSServiceRefDeallocate(dnssref); dnssref = 0; } } void BonjourServiceRegister::registerService(const BonjourRecord &record, quint16 servicePort) { if (dnssref) { qWarning("Warning: Already registered a service for this object, aborting new register"); return; } quint16 bigEndianPort = servicePort; #if Q_BYTE_ORDER == Q_LITTLE_ENDIAN { bigEndianPort = static_cast(((servicePort & 0x00ff) << 8) | ((servicePort & 0xff00) >> 8)); } #endif DNSServiceErrorType err = DNSServiceRegister(&dnssref, 0, 0, record.serviceName.isEmpty() ? 0 : record.serviceName.toUtf8().constData(), record.registeredType.toUtf8().constData(), record.replyDomain.isEmpty() ? 0 : record.replyDomain.toUtf8().constData(), 0, bigEndianPort, 0, 0, bonjourRegisterService, this); if (err != kDNSServiceErr_NoError) { emit error(err); } else { int sockfd = DNSServiceRefSockFD(dnssref); if (sockfd == -1) { emit error(kDNSServiceErr_Invalid); } else { bonjourSocket = new QSocketNotifier(sockfd, QSocketNotifier::Read, this); connect(bonjourSocket, SIGNAL(activated(int)), this, SLOT(bonjourSocketReadyRead())); } } } void BonjourServiceRegister::bonjourSocketReadyRead() { DNSServiceErrorType err = DNSServiceProcessResult(dnssref); if (err != kDNSServiceErr_NoError) emit error(err); } void DNSSD_API BonjourServiceRegister::bonjourRegisterService(DNSServiceRef, DNSServiceFlags, DNSServiceErrorType errorCode, const char *name, const char *regtype, const char *domain, void *data) { BonjourServiceRegister *serviceRegister = static_cast(data); if (errorCode != kDNSServiceErr_NoError) { emit serviceRegister->error(errorCode); } else { serviceRegister->finalRecord = BonjourRecord(QString::fromUtf8(name), QString::fromUtf8(regtype), QString::fromUtf8(domain)); emit serviceRegister->serviceRegistered(serviceRegister->finalRecord); } } mumble-1.3.4/3rdparty/qqbonjour-src/LICENSE0000664000175000017500000000254714010707273020233 0ustar builderbuilderCopyright (c) 2007, Trenton Schulz Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. mumble-1.3.4/3rdparty/qqbonjour-src/BonjourServiceBrowser.cpp0000664000175000017500000000644414010707273024235 0ustar builderbuilder/* Copyright (c) 2007, Trenton Schulz Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef MUMBLE #include "mumble_pch.hpp" #else #include "murmur_pch.h" #endif #include "BonjourServiceBrowser.h" BonjourServiceBrowser::BonjourServiceBrowser(QObject *p) : QObject(p), dnssref(0), bonjourSocket(0) { } BonjourServiceBrowser::~BonjourServiceBrowser() { if (dnssref) { DNSServiceRefDeallocate(dnssref); dnssref = 0; } } void BonjourServiceBrowser::browseForServiceType(const QString &serviceType) { DNSServiceErrorType err = DNSServiceBrowse(&dnssref, 0, 0, serviceType.toUtf8().constData(), 0, bonjourBrowseReply, this); if (err != kDNSServiceErr_NoError) { emit error(err); } else { int sockfd = DNSServiceRefSockFD(dnssref); if (sockfd == -1) { emit error(kDNSServiceErr_Invalid); } else { bonjourSocket = new QSocketNotifier(sockfd, QSocketNotifier::Read, this); connect(bonjourSocket, SIGNAL(activated(int)), this, SLOT(bonjourSocketReadyRead())); } } } void BonjourServiceBrowser::bonjourSocketReadyRead() { DNSServiceErrorType err = DNSServiceProcessResult(dnssref); if (err != kDNSServiceErr_NoError) emit error(err); } void BonjourServiceBrowser::bonjourBrowseReply(DNSServiceRef , DNSServiceFlags flags, quint32 , DNSServiceErrorType errorCode, const char *serviceName, const char *regType, const char *replyDomain, void *context) { BonjourServiceBrowser *serviceBrowser = static_cast(context); if (errorCode != kDNSServiceErr_NoError) { emit serviceBrowser->error(errorCode); } else { BonjourRecord bonjourRecord(serviceName, regType, replyDomain); if (flags & kDNSServiceFlagsAdd) { if (!serviceBrowser->bonjourRecords.contains(bonjourRecord)) serviceBrowser->bonjourRecords.append(bonjourRecord); } else { serviceBrowser->bonjourRecords.removeAll(bonjourRecord); } if (!(flags & kDNSServiceFlagsMoreComing)) { emit serviceBrowser->currentBonjourRecordsChanged(serviceBrowser->bonjourRecords); } } } mumble-1.3.4/3rdparty/celt-0.11.0-build/0000775000175000017500000000000014010707273017150 5ustar builderbuildermumble-1.3.4/3rdparty/celt-0.11.0-build/celt-0.11.0-build.pro0000664000175000017500000000347714010707273022444 0ustar builderbuilderinclude(../../qmake/compiler.pri) BUILDDIR=$$basename(PWD) SOURCEDIR=$$replace(BUILDDIR,-build,-src) VERSION=$$replace(BUILDDIR,-build,) VERSION=$$replace(VERSION,celt-,) !exists(../$$SOURCEDIR/COPYING) { message("The $$SOURCEDIR/ directory was not found. Please update your submodules (git submodule update --init) or build with CONFIG+=no-bundled-celt.") error("Aborting configuration") } TEMPLATE = lib CONFIG -= qt CONFIG += debug_and_release CONFIG += no_include_pwd VPATH = ../$$SOURCEDIR/libcelt TARGET = celt0 RC_FILE = celt-0.11.0.rc DEFINES += HAVE_CONFIG_H TARGET_VERSION_EXT = .$$VERSION CONFIG(static) { CONFIG -= static CONFIG += shared } !CONFIG(third-party-warnings) { # We ignore warnings in third party builds. We won't actually look # at them and they clutter out our warnings. CONFIG -= warn_on CONFIG += warn_off } QMAKE_CFLAGS -= -fPIE -pie win32 { DEFINES += WIN32 _WIN32 win32-g++ { # MinGW uses the config.h for Unix-like systems. INCLUDEPATH += ../$$BUILDDIR } win32-msvc* { INCLUDEPATH += ../$$BUILDDIR/win32 CONFIG(sse2) { TARGET_VERSION_EXT = .$${VERSION}.sse2 } else { QMAKE_CFLAGS_RELEASE -= -arch:SSE QMAKE_CFLAGS_DEBUG -= -arch:SSE } } } unix { contains(QMAKE_CFLAGS, -ffast-math) { DEFINES += FLOAT_APPROX } INCLUDEPATH += ../$$BUILDDIR } SOURCES *= bands.c celt.c cwrs.c entcode.c entdec.c entenc.c header.c kiss_fft.c laplace.c mathops.c mdct.c modes.c pitch.c plc.c quant_bands.c rate.c vq.c # TARGET is the same in both versions of CELT, thus we have to specify # a separated folder to prevent objects collision between the two. OBJECTS_DIR = $$OBJECTS_ROOT/celt-0.11.0-build MOC_DIR = $$MOC_ROOT/celt-0.11.0-build RCC_DIR = $$RCC_ROOT/celt-0.11.0-build UI_DIR = $$UI_ROOT/celt-0.11.0-build include(../../qmake/symbols.pri) mumble-1.3.4/3rdparty/celt-0.11.0-build/celt-0.11.0.rc0000664000175000017500000000161714010707273021145 0ustar builderbuilder#include #ifndef DEBUG #define VER_DEBUG 0L #else #define VER_DEBUG VS_FF_DEBUG #endif #ifdef SNAPSHOT_BUILD #define VER_RELEASE VS_FF_SPECIALBUILD|VS_FF_PRERELEASE #else #define VER_RELEASE 0L #endif VS_VERSION_INFO VERSIONINFO FILEVERSION 1,3,0,0 PRODUCTVERSION 1,3,0,0 FILEFLAGSMASK VS_FFI_FILEFLAGSMASK FILEFLAGS (VER_DEBUG|VER_RELEASE) FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_DLL FILESUBTYPE 0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904E4" BEGIN VALUE "FileDescription", "Mumble CELT 0.11.0 DLL" VALUE "FileVersion", "1.3.0" VALUE "ProductVersion", "1.3.0" VALUE "OriginalFilename", "celt0.0.11.0.dll" VALUE "ProductName", "Mumble" #ifdef SNAPSHOT_BUILD VALUE "SpecialBuild", "Snapshot development release" #endif END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1252 END END mumble-1.3.4/3rdparty/celt-0.11.0-build/win32/0000775000175000017500000000000014010707273020112 5ustar builderbuildermumble-1.3.4/3rdparty/celt-0.11.0-build/win32/config.h0000664000175000017500000001040114010707273021524 0ustar builderbuilder/* config.h. Generated from config.h.in by configure. */ /* config.h.in. Generated from configure.ac by autoheader. */ /* Define if building universal (internal helper macro) */ /* #undef AC_APPLE_UNIVERSAL_BUILD */ /* This is a build of CELT */ #define CELT_BUILD /**/ /* Version extra */ #define CELT_EXTRA_VERSION "" /* Version major */ #define CELT_MAJOR_VERSION 0 /* Version micro */ #define CELT_MICRO_VERSION 0 /* Version minor */ #define CELT_MINOR_VERSION 11 /* Complete version string */ #define CELT_VERSION "0.11.0" /* Assertions */ /* #undef ENABLE_ASSERTIONS */ /* Postfilter */ /* #undef ENABLE_POSTFILTER */ /* Debug fixed-point implementation */ /* #undef FIXED_DEBUG */ /* Compile as fixed-point */ /* #undef FIXED_POINT */ /* Compile as floating-point */ #define FLOATING_POINT /**/ /* Float approximations */ /* #undef FLOAT_APPROX */ /* Define to 1 if you have the header file. */ #define HAVE_ALLOCA_H 1 /* Define to 1 if you have the header file. */ #define HAVE_DLFCN_H 1 /* Define to 1 if you have the header file. */ #define HAVE_GETOPT_H 1 /* Define to 1 if you have the `getopt_long' function. */ #define HAVE_GETOPT_LONG 1 /* Define to 1 if you have the header file. */ // #define HAVE_INTTYPES_H 1 /* Define to 1 if you have the `m' library (-lm). */ #define HAVE_LIBM 1 /* Define to 1 if you have the `winmm' library (-lwinmm). */ /* #undef HAVE_LIBWINMM */ /* Define if you have C99's lrint function. */ // #define HAVE_LRINT 1 /* Define if you have C99's lrintf function. */ // #define HAVE_LRINTF 1 /* Define to 1 if you have the header file. */ #define HAVE_MEMORY_H 1 /* Define to 1 if you have the header file. */ // #define HAVE_STDINT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STDLIB_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STRINGS_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STRING_H 1 /* Define to 1 if you have the header file. */ /* #undef HAVE_SYS_AUDIOIO_H */ /* Define to 1 if you have the header file. */ #define HAVE_SYS_SOUNDCARD_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_STAT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_TYPES_H 1 /* Define to 1 if you have the header file. */ #define HAVE_UNISTD_H 1 /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #define LT_OBJDIR ".libs/" /* Define to the address where bug reports for this package should be sent. */ #define PACKAGE_BUGREPORT "" /* Define to the full name of this package. */ #define PACKAGE_NAME "" /* Define to the full name and version of this package. */ #define PACKAGE_STRING "" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "" /* Define to the version of this package. */ #define PACKAGE_VERSION "" /* The size of `int', as computed by sizeof. */ #define SIZEOF_INT 4 /* The size of `long', as computed by sizeof. */ #define SIZEOF_LONG 4 /* The size of `long long', as computed by sizeof. */ #define SIZEOF_LONG_LONG 8 /* The size of `short', as computed by sizeof. */ #define SIZEOF_SHORT 2 /* Custom modes */ /* #undef CUSTOM_MODES */ /* Define to 1 if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* Make use of alloca */ /* #undef USE_ALLOCA */ #define USE_ALLOCA 1 /* Use C99 variable-size arrays */ // #define VAR_ARRAYS /**/ /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */ #if defined AC_APPLE_UNIVERSAL_BUILD # if defined __BIG_ENDIAN__ # define WORDS_BIGENDIAN 1 # endif #else # ifndef WORDS_BIGENDIAN /* # undef WORDS_BIGENDIAN */ # endif #endif /* Define to empty if `const' does not conform to ANSI C. */ /* #undef const */ /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #define inline __inline #endif /* Define to the equivalent of the C99 'restrict' keyword, or to nothing if this is not supported. Do not define if restrict is supported directly. */ #define restrict mumble-1.3.4/3rdparty/celt-0.11.0-build/config.h0000664000175000017500000001134614010707273020573 0ustar builderbuilder/* config.h. Generated from config.h.in by configure. */ /* config.h.in. Generated from configure.ac by autoheader. */ /* Define if building universal (internal helper macro) */ /* #undef AC_APPLE_UNIVERSAL_BUILD */ /* This is a build of CELT */ #define CELT_BUILD /**/ /* Version extra */ #define CELT_EXTRA_VERSION "" /* Version major */ #define CELT_MAJOR_VERSION 0 /* Version micro */ #define CELT_MICRO_VERSION 0 /* Version minor */ #define CELT_MINOR_VERSION 11 /* Complete version string */ #define CELT_VERSION "0.11.0" /* Compile as fixed-point */ /* #undef DOUBLE_PRECISION */ /* Assertions */ /* #undef ENABLE_ASSERTIONS */ /* Postfilter */ /* #undef ENABLE_POSTFILTER */ /* Debug fixed-point implementation */ /* #undef FIXED_DEBUG */ /* Compile as fixed-point */ /* #undef FIXED_POINT */ /* Compile as floating-point */ #define FLOATING_POINT /**/ /* Float approximations */ /* #undef FLOAT_APPROX */ /* Define to 1 if you have the header file. */ #define HAVE_ALLOCA_H 1 /* Define to 1 if you have the header file. */ #define HAVE_DLFCN_H 1 /* Define to 1 if you have the header file. */ #define HAVE_GETOPT_H 1 /* Define to 1 if you have the `getopt_long' function. */ #define HAVE_GETOPT_LONG 1 /* Define to 1 if you have the header file. */ #define HAVE_INTTYPES_H 1 /* Define to 1 if you have the `m' library (-lm). */ #define HAVE_LIBM 1 /* Define to 1 if you have the `winmm' library (-lwinmm). */ /* #undef HAVE_LIBWINMM */ /* Define if you have C99's lrint function. */ #define HAVE_LRINT 1 /* Define if you have C99's lrintf function. */ #define HAVE_LRINTF 1 /* Define to 1 if you have the header file. */ #define HAVE_MEMORY_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STDINT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STDLIB_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STRINGS_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STRING_H 1 /* Define to 1 if you have the header file. */ /* #undef HAVE_SYS_AUDIOIO_H */ /* Define to 1 if you have the header file. */ #define HAVE_SYS_SOUNDCARD_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_STAT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_TYPES_H 1 /* Define to 1 if you have the header file. */ #define HAVE_UNISTD_H 1 /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #define LT_OBJDIR ".libs/" /* Compile as fixed-point */ /* #undef MIXED_PRECISION */ /* Define to the address where bug reports for this package should be sent. */ #define PACKAGE_BUGREPORT "" /* Define to the full name of this package. */ #define PACKAGE_NAME "" /* Define to the full name and version of this package. */ #define PACKAGE_STRING "" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "" /* Define to the version of this package. */ #define PACKAGE_VERSION "" /* The size of `int', as computed by sizeof. */ #define SIZEOF_INT 4 /* The size of `long', as computed by sizeof. */ #define SIZEOF_LONG 8 /* The size of `long long', as computed by sizeof. */ #define SIZEOF_LONG_LONG 8 /* The size of `short', as computed by sizeof. */ #define SIZEOF_SHORT 2 /* Custom modes */ /* #undef CUSTOM_MODES */ /* Define to 1 if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* Make use of alloca */ /* #undef USE_ALLOCA */ /* Use C99 variable-size arrays */ #define VAR_ARRAYS /**/ /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */ #if defined AC_APPLE_UNIVERSAL_BUILD # if defined __BIG_ENDIAN__ # define WORDS_BIGENDIAN 1 # endif #else # ifndef WORDS_BIGENDIAN /* # undef WORDS_BIGENDIAN */ # endif #endif /* Define to empty if `const' does not conform to ANSI C. */ /* #undef const */ /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus /* #undef inline */ #endif /* Define to the equivalent of the C99 'restrict' keyword, or to nothing if this is not supported. Do not define if restrict is supported directly. */ #define restrict __restrict /* Work around a bug in Sun C++: it does not support _Restrict, even though the corresponding Sun C compiler does, which causes "#define restrict _Restrict" in the previous line. Perhaps some future version of Sun C++ will work with _Restrict; if so, it'll probably define __RESTRICT, just as Sun C does. */ #if defined __SUNPRO_CC && !defined __RESTRICT # define _Restrict #endif mumble-1.3.4/3rdparty/opus-src/0000775000175000017500000000000014010707327016164 5ustar builderbuildermumble-1.3.4/3rdparty/opus-src/AUTHORS0000664000175000017500000000035714010707326017240 0ustar builderbuilderJean-Marc Valin (jmvalin@jmvalin.ca) Koen Vos (koenvos74@gmail.com) Timothy Terriberry (tterribe@xiph.org) Karsten Vandborg Sorensen (karsten.vandborg.sorensen@skype.net) Soren Skak Jensen (ssjensen@gn.com) Gregory Maxwell (greg@xiph.org) mumble-1.3.4/3rdparty/opus-src/celt_headers.mk0000664000175000017500000000216714010707327021145 0ustar builderbuilderCELT_HEAD = \ celt/arch.h \ celt/bands.h \ celt/celt.h \ celt/cpu_support.h \ include/opus_types.h \ include/opus_defines.h \ include/opus_custom.h \ celt/cwrs.h \ celt/ecintrin.h \ celt/entcode.h \ celt/entdec.h \ celt/entenc.h \ celt/fixed_debug.h \ celt/fixed_generic.h \ celt/float_cast.h \ celt/_kiss_fft_guts.h \ celt/kiss_fft.h \ celt/laplace.h \ celt/mathops.h \ celt/mdct.h \ celt/mfrngcod.h \ celt/modes.h \ celt/os_support.h \ celt/pitch.h \ celt/celt_lpc.h \ celt/x86/celt_lpc_sse.h \ celt/quant_bands.h \ celt/rate.h \ celt/stack_alloc.h \ celt/vq.h \ celt/static_modes_float.h \ celt/static_modes_fixed.h \ celt/static_modes_float_arm_ne10.h \ celt/static_modes_fixed_arm_ne10.h \ celt/arm/armcpu.h \ celt/arm/fixed_armv4.h \ celt/arm/fixed_armv5e.h \ celt/arm/fixed_arm64.h \ celt/arm/kiss_fft_armv4.h \ celt/arm/kiss_fft_armv5e.h \ celt/arm/pitch_arm.h \ celt/arm/fft_arm.h \ celt/arm/mdct_arm.h \ celt/mips/celt_mipsr1.h \ celt/mips/fixed_generic_mipsr1.h \ celt/mips/kiss_fft_mipsr1.h \ celt/mips/mdct_mipsr1.h \ celt/mips/pitch_mipsr1.h \ celt/mips/vq_mipsr1.h \ celt/x86/pitch_sse.h \ celt/x86/vq_sse.h \ celt/x86/x86cpu.h mumble-1.3.4/3rdparty/opus-src/update_version0000775000175000017500000000443614010707327021150 0ustar builderbuilder#!/bin/bash # Creates and updates the package_version information used by configure.ac # (or other makefiles). When run inside a git repository it will use the # version information that can be queried from it unless AUTO_UPDATE is set # to 'no'. If no version is currently known it will be set to 'unknown'. # # If called with the argument 'release', the PACKAGE_VERSION will be updated # even if AUTO_UPDATE=no, but the value of AUTO_UPDATE shall be preserved. # This is used to force a version update whenever `make dist` is run. # # The exit status is 1 if package_version is not modified, else 0 is returned. # # This script should NOT be included in distributed tarballs, because if a # parent directory contains a git repository we do not want to accidentally # retrieve the version information from it instead. Tarballs should ship # with only the package_version file. # # Ron , 2012. SRCDIR=$(dirname $0) if [ -e "$SRCDIR/package_version" ]; then . "$SRCDIR/package_version" fi if [ "$AUTO_UPDATE" = no ]; then [ "$1" = release ] || exit 1 else AUTO_UPDATE=yes fi # We run `git status` before describe here to ensure that we don't get a false # -dirty from files that have been touched but are not actually altered in the # working dir. GIT_VERSION=$(cd "$SRCDIR" && git status > /dev/null 2>&1 \ && git describe --tags --match 'v*' --dirty 2> /dev/null) GIT_VERSION=${GIT_VERSION#v} if [ -n "$GIT_VERSION" ]; then [ "$GIT_VERSION" != "$PACKAGE_VERSION" ] || exit 1 PACKAGE_VERSION="$GIT_VERSION" elif [ -z "$PACKAGE_VERSION" ]; then # No current package_version and no git ... # We really shouldn't ever get here, because this script should only be # included in the git repository, and should usually be export-ignored. PACKAGE_VERSION="unknown" else exit 1 fi cat > "$SRCDIR/package_version" <<-EOF # Automatically generated by update_version. # This file may be sourced into a shell script or makefile. # Set this to 'no' if you do not wish the version information # to be checked and updated for every build. Most people will # never want to change this, it is an option for developers # making frequent changes that they know will not be released. AUTO_UPDATE=$AUTO_UPDATE PACKAGE_VERSION="$PACKAGE_VERSION" EOF mumble-1.3.4/3rdparty/opus-src/celt_sources.mk0000664000175000017500000000156214010707327021213 0ustar builderbuilderCELT_SOURCES = celt/bands.c \ celt/celt.c \ celt/celt_encoder.c \ celt/celt_decoder.c \ celt/cwrs.c \ celt/entcode.c \ celt/entdec.c \ celt/entenc.c \ celt/kiss_fft.c \ celt/laplace.c \ celt/mathops.c \ celt/mdct.c \ celt/modes.c \ celt/pitch.c \ celt/celt_lpc.c \ celt/quant_bands.c \ celt/rate.c \ celt/vq.c CELT_SOURCES_SSE = \ celt/x86/x86cpu.c \ celt/x86/x86_celt_map.c \ celt/x86/pitch_sse.c CELT_SOURCES_SSE2 = \ celt/x86/pitch_sse2.c \ celt/x86/vq_sse2.c CELT_SOURCES_SSE4_1 = \ celt/x86/celt_lpc_sse.c \ celt/x86/pitch_sse4_1.c CELT_SOURCES_ARM = \ celt/arm/armcpu.c \ celt/arm/arm_celt_map.c CELT_SOURCES_ARM_ASM = \ celt/arm/celt_pitch_xcorr_arm.s CELT_AM_SOURCES_ARM_ASM = \ celt/arm/armopts.s.in CELT_SOURCES_ARM_NEON_INTR = \ celt/arm/celt_neon_intr.c \ celt/arm/pitch_neon_intr.c CELT_SOURCES_ARM_NE10 = \ celt/arm/celt_ne10_fft.c \ celt/arm/celt_ne10_mdct.c mumble-1.3.4/3rdparty/opus-src/README0000664000175000017500000001331514010707326017046 0ustar builderbuilder== Opus audio codec == Opus is a codec for interactive speech and audio transmission over the Internet. Opus can handle a wide range of interactive audio applications, including Voice over IP, videoconferencing, in-game chat, and even remote live music performances. It can scale from low bit-rate narrowband speech to very high quality stereo music. Opus, when coupled with an appropriate container format, is also suitable for non-realtime stored-file applications such as music distribution, game soundtracks, portable music players, jukeboxes, and other applications that have historically used high latency formats such as MP3, AAC, or Vorbis. Opus is specified by IETF RFC 6716: https://tools.ietf.org/html/rfc6716 The Opus format and this implementation of it are subject to the royalty- free patent and copyright licenses specified in the file COPYING. This package implements a shared library for encoding and decoding raw Opus bitstreams. Raw Opus bitstreams should be used over RTP according to https://tools.ietf.org/html/rfc7587 The package also includes a number of test tools used for testing the correct operation of the library. The bitstreams read/written by these tools should not be used for Opus file distribution: They include additional debugging data and cannot support seeking. Opus stored in files should use the Ogg encapsulation for Opus which is described at: https://wiki.xiph.org/OggOpus An opus-tools package is available which provides encoding and decoding of Ogg encapsulated Opus files and includes a number of useful features. Opus-tools can be found at: https://git.xiph.org/?p=opus-tools.git or on the main Opus website: https://opus-codec.org/ == Compiling libopus == To build from a distribution tarball, you only need to do the following: % ./configure % make To build from the git repository, the following steps are necessary: 0) Set up a development environment: On an Ubuntu or Debian family Linux distribution: % sudo apt-get install git autoconf automake libtool gcc make On a Fedora/Redhat based Linux: % sudo dnf install git autoconf automake libtool gcc make Or for older Redhat/Centos Linux releases: % sudo yum install git autoconf automake libtool gcc make On Apple macOS, install Xcode and brew.sh, then in the Terminal enter: % brew install autoconf automake libtool 1) Clone the repository: % git clone https://git.xiph.org/opus.git % cd opus 2) Compiling the source % ./autogen.sh % ./configure % make 3) Install the codec libraries (optional) % sudo make install Once you have compiled the codec, there will be a opus_demo executable in the top directory. Usage: opus_demo [-e] [options] opus_demo -d [options] mode: voip | audio | restricted-lowdelay options: -e : only runs the encoder (output the bit-stream) -d : only runs the decoder (reads the bit-stream as input) -cbr : enable constant bitrate; default: variable bitrate -cvbr : enable constrained variable bitrate; default: unconstrained -bandwidth : audio bandwidth (from narrowband to fullband); default: sampling rate -framesize <2.5|5|10|20|40|60> : frame size in ms; default: 20 -max_payload : maximum payload size in bytes, default: 1024 -complexity : complexity, 0 (lowest) ... 10 (highest); default: 10 -inbandfec : enable SILK inband FEC -forcemono : force mono encoding, even for stereo input -dtx : enable SILK DTX -loss : simulate packet loss, in percent (0-100); default: 0 input and output are little-endian signed 16-bit PCM files or opus bitstreams with simple opus_demo proprietary framing. == Testing == This package includes a collection of automated unit and system tests which SHOULD be run after compiling the package especially the first time it is run on a new platform. To run the integrated tests: % make check There is also collection of standard test vectors which are not included in this package for size reasons but can be obtained from: https://opus-codec.org/testvectors/opus_testvectors.tar.gz To run compare the code to these test vectors: % curl -O https://opus-codec.org/testvectors/opus_testvectors.tar.gz % tar -zxf opus_testvectors.tar.gz % ./tests/run_vectors.sh ./ opus_testvectors 48000 == Portability notes == This implementation uses floating-point by default but can be compiled to use only fixed-point arithmetic by setting --enable-fixed-point (if using autoconf) or by defining the FIXED_POINT macro (if building manually). The fixed point implementation has somewhat lower audio quality and is slower on platforms with fast FPUs, it is normally only used in embedded environments. The implementation can be compiled with either a C89 or a C99 compiler. While it does not rely on any _undefined behavior_ as defined by C89 or C99, it relies on common _implementation-defined behavior_ for two's complement architectures: o Right shifts of negative values are consistent with two's complement arithmetic, so that a>>b is equivalent to floor(a/(2^b)), o For conversion to a signed integer of N bits, the value is reduced modulo 2^N to be within range of the type, o The result of integer division of a negative value is truncated towards zero, and o The compiler provides a 64-bit integer type (a C99 requirement which is supported by most C89 compilers). mumble-1.3.4/3rdparty/opus-src/.appveyor.yml0000664000175000017500000000141214010707326020627 0ustar builderbuilderimage: Visual Studio 2015 configuration: - Debug - DebugDLL - DebugDLL_fixed - Release - ReleaseDLL - ReleaseDLL_fixed platform: - Win32 - x64 environment: api_key: secure: kR3Ac0NjGwFnTmXdFrR8d6VXjdk5F7L4F/BilC4nvaM= build: project: win32\VS2015\opus.sln parallel: true verbosity: minimal after_build: - cd %APPVEYOR_BUILD_FOLDER% - 7z a opus.zip win32\VS2015\%PLATFORM%\%CONFIGURATION%\opus.??? include\*.h test_script: - cd %APPVEYOR_BUILD_FOLDER%\win32\VS2015\%PLATFORM%\%CONFIGURATION% - test_opus_api.exe - test_opus_decode.exe - test_opus_encode.exe artifacts: - path: opus.zip on_success: - ps: if ($env:api_key -and "$env:configuration/$env:platform" -eq "ReleaseDLL_fixed/x64") { Start-AppveyorBuild -ApiKey $env:api_key -ProjectSlug 'opus-tools' } mumble-1.3.4/3rdparty/opus-src/opus.m40000664000175000017500000000775714010707327017434 0ustar builderbuilder# Configure paths for libopus # Gregory Maxwell 08-30-2012 # Shamelessly stolen from Jack Moffitt (libogg) who # Shamelessly stole from Owen Taylor and Manish Singh dnl XIPH_PATH_OPUS([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) dnl Test for libopus, and define OPUS_CFLAGS and OPUS_LIBS dnl AC_DEFUN([XIPH_PATH_OPUS], [dnl dnl Get the cflags and libraries dnl AC_ARG_WITH(opus,AC_HELP_STRING([--with-opus=PFX],[Prefix where opus is installed (optional)]), opus_prefix="$withval", opus_prefix="") AC_ARG_WITH(opus-libraries,AC_HELP_STRING([--with-opus-libraries=DIR],[Directory where the opus library is installed (optional)]), opus_libraries="$withval", opus_libraries="") AC_ARG_WITH(opus-includes,AC_HELP_STRING([--with-opus-includes=DIR],[Directory where the opus header files are installed (optional)]), opus_includes="$withval", opus_includes="") AC_ARG_ENABLE(opustest,AC_HELP_STRING([--disable-opustest],[Do not try to compile and run a test opus program]),, enable_opustest=yes) if test "x$opus_libraries" != "x" ; then OPUS_LIBS="-L$opus_libraries" elif test "x$opus_prefix" = "xno" || test "x$opus_prefix" = "xyes" ; then OPUS_LIBS="" elif test "x$opus_prefix" != "x" ; then OPUS_LIBS="-L$opus_prefix/lib" elif test "x$prefix" != "xNONE" ; then OPUS_LIBS="-L$prefix/lib" fi if test "x$opus_prefix" != "xno" ; then OPUS_LIBS="$OPUS_LIBS -lopus" fi if test "x$opus_includes" != "x" ; then OPUS_CFLAGS="-I$opus_includes" elif test "x$opus_prefix" = "xno" || test "x$opus_prefix" = "xyes" ; then OPUS_CFLAGS="" elif test "x$opus_prefix" != "x" ; then OPUS_CFLAGS="-I$opus_prefix/include" elif test "x$prefix" != "xNONE"; then OPUS_CFLAGS="-I$prefix/include" fi AC_MSG_CHECKING(for Opus) if test "x$opus_prefix" = "xno" ; then no_opus="disabled" enable_opustest="no" else no_opus="" fi if test "x$enable_opustest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $OPUS_CFLAGS" LIBS="$LIBS $OPUS_LIBS" dnl dnl Now check if the installed Opus is sufficiently new. dnl rm -f conf.opustest AC_TRY_RUN([ #include #include #include #include int main () { system("touch conf.opustest"); return 0; } ],, no_opus=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi if test "x$no_opus" = "xdisabled" ; then AC_MSG_RESULT(no) ifelse([$2], , :, [$2]) elif test "x$no_opus" = "x" ; then AC_MSG_RESULT(yes) ifelse([$1], , :, [$1]) else AC_MSG_RESULT(no) if test -f conf.opustest ; then : else echo "*** Could not run Opus test program, checking why..." CFLAGS="$CFLAGS $OPUS_CFLAGS" LIBS="$LIBS $OPUS_LIBS" AC_TRY_LINK([ #include #include ], [ return 0; ], [ echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding Opus or finding the wrong" echo "*** version of Opus. If it is not finding Opus, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], [ echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occurred. This usually means Opus was incorrectly installed" echo "*** or that you have moved Opus since it was installed." ]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi OPUS_CFLAGS="" OPUS_LIBS="" ifelse([$2], , :, [$2]) fi AC_SUBST(OPUS_CFLAGS) AC_SUBST(OPUS_LIBS) rm -f conf.opustest ]) mumble-1.3.4/3rdparty/opus-src/opus_sources.mk0000664000175000017500000000037014010707327021246 0ustar builderbuilderOPUS_SOURCES = src/opus.c \ src/opus_decoder.c \ src/opus_encoder.c \ src/opus_multistream.c \ src/opus_multistream_encoder.c \ src/opus_multistream_decoder.c \ src/repacketizer.c OPUS_SOURCES_FLOAT = \ src/analysis.c \ src/mlp.c \ src/mlp_data.c mumble-1.3.4/3rdparty/opus-src/silk_sources.mk0000664000175000017500000000774314010707327021235 0ustar builderbuilderSILK_SOURCES = \ silk/CNG.c \ silk/code_signs.c \ silk/init_decoder.c \ silk/decode_core.c \ silk/decode_frame.c \ silk/decode_parameters.c \ silk/decode_indices.c \ silk/decode_pulses.c \ silk/decoder_set_fs.c \ silk/dec_API.c \ silk/enc_API.c \ silk/encode_indices.c \ silk/encode_pulses.c \ silk/gain_quant.c \ silk/interpolate.c \ silk/LP_variable_cutoff.c \ silk/NLSF_decode.c \ silk/NSQ.c \ silk/NSQ_del_dec.c \ silk/PLC.c \ silk/shell_coder.c \ silk/tables_gain.c \ silk/tables_LTP.c \ silk/tables_NLSF_CB_NB_MB.c \ silk/tables_NLSF_CB_WB.c \ silk/tables_other.c \ silk/tables_pitch_lag.c \ silk/tables_pulses_per_block.c \ silk/VAD.c \ silk/control_audio_bandwidth.c \ silk/quant_LTP_gains.c \ silk/VQ_WMat_EC.c \ silk/HP_variable_cutoff.c \ silk/NLSF_encode.c \ silk/NLSF_VQ.c \ silk/NLSF_unpack.c \ silk/NLSF_del_dec_quant.c \ silk/process_NLSFs.c \ silk/stereo_LR_to_MS.c \ silk/stereo_MS_to_LR.c \ silk/check_control_input.c \ silk/control_SNR.c \ silk/init_encoder.c \ silk/control_codec.c \ silk/A2NLSF.c \ silk/ana_filt_bank_1.c \ silk/biquad_alt.c \ silk/bwexpander_32.c \ silk/bwexpander.c \ silk/debug.c \ silk/decode_pitch.c \ silk/inner_prod_aligned.c \ silk/lin2log.c \ silk/log2lin.c \ silk/LPC_analysis_filter.c \ silk/LPC_inv_pred_gain.c \ silk/table_LSF_cos.c \ silk/NLSF2A.c \ silk/NLSF_stabilize.c \ silk/NLSF_VQ_weights_laroia.c \ silk/pitch_est_tables.c \ silk/resampler.c \ silk/resampler_down2_3.c \ silk/resampler_down2.c \ silk/resampler_private_AR2.c \ silk/resampler_private_down_FIR.c \ silk/resampler_private_IIR_FIR.c \ silk/resampler_private_up2_HQ.c \ silk/resampler_rom.c \ silk/sigm_Q15.c \ silk/sort.c \ silk/sum_sqr_shift.c \ silk/stereo_decode_pred.c \ silk/stereo_encode_pred.c \ silk/stereo_find_predictor.c \ silk/stereo_quant_pred.c \ silk/LPC_fit.c SILK_SOURCES_SSE4_1 = silk/x86/NSQ_sse.c \ silk/x86/NSQ_del_dec_sse.c \ silk/x86/x86_silk_map.c \ silk/x86/VAD_sse.c \ silk/x86/VQ_WMat_EC_sse.c SILK_SOURCES_ARM_NEON_INTR = \ silk/arm/arm_silk_map.c \ silk/arm/biquad_alt_neon_intr.c \ silk/arm/LPC_inv_pred_gain_neon_intr.c \ silk/arm/NSQ_del_dec_neon_intr.c \ silk/arm/NSQ_neon.c SILK_SOURCES_FIXED = \ silk/fixed/LTP_analysis_filter_FIX.c \ silk/fixed/LTP_scale_ctrl_FIX.c \ silk/fixed/corrMatrix_FIX.c \ silk/fixed/encode_frame_FIX.c \ silk/fixed/find_LPC_FIX.c \ silk/fixed/find_LTP_FIX.c \ silk/fixed/find_pitch_lags_FIX.c \ silk/fixed/find_pred_coefs_FIX.c \ silk/fixed/noise_shape_analysis_FIX.c \ silk/fixed/process_gains_FIX.c \ silk/fixed/regularize_correlations_FIX.c \ silk/fixed/residual_energy16_FIX.c \ silk/fixed/residual_energy_FIX.c \ silk/fixed/warped_autocorrelation_FIX.c \ silk/fixed/apply_sine_window_FIX.c \ silk/fixed/autocorr_FIX.c \ silk/fixed/burg_modified_FIX.c \ silk/fixed/k2a_FIX.c \ silk/fixed/k2a_Q16_FIX.c \ silk/fixed/pitch_analysis_core_FIX.c \ silk/fixed/vector_ops_FIX.c \ silk/fixed/schur64_FIX.c \ silk/fixed/schur_FIX.c SILK_SOURCES_FIXED_SSE4_1 = silk/fixed/x86/vector_ops_FIX_sse.c \ silk/fixed/x86/burg_modified_FIX_sse.c SILK_SOURCES_FIXED_ARM_NEON_INTR = \ silk/fixed/arm/warped_autocorrelation_FIX_neon_intr.c SILK_SOURCES_FLOAT = \ silk/float/apply_sine_window_FLP.c \ silk/float/corrMatrix_FLP.c \ silk/float/encode_frame_FLP.c \ silk/float/find_LPC_FLP.c \ silk/float/find_LTP_FLP.c \ silk/float/find_pitch_lags_FLP.c \ silk/float/find_pred_coefs_FLP.c \ silk/float/LPC_analysis_filter_FLP.c \ silk/float/LTP_analysis_filter_FLP.c \ silk/float/LTP_scale_ctrl_FLP.c \ silk/float/noise_shape_analysis_FLP.c \ silk/float/process_gains_FLP.c \ silk/float/regularize_correlations_FLP.c \ silk/float/residual_energy_FLP.c \ silk/float/warped_autocorrelation_FLP.c \ silk/float/wrappers_FLP.c \ silk/float/autocorrelation_FLP.c \ silk/float/burg_modified_FLP.c \ silk/float/bwexpander_FLP.c \ silk/float/energy_FLP.c \ silk/float/inner_product_FLP.c \ silk/float/k2a_FLP.c \ silk/float/LPC_inv_pred_gain_FLP.c \ silk/float/pitch_analysis_core_FLP.c \ silk/float/scale_copy_vector_FLP.c \ silk/float/scale_vector_FLP.c \ silk/float/schur_FLP.c \ silk/float/sort_FLP.c mumble-1.3.4/3rdparty/opus-src/opus-uninstalled.pc.in0000664000175000017500000000050114010707327022417 0ustar builderbuilder# Opus codec reference implementation uninstalled pkg-config file libdir=${pcfiledir}/.libs includedir=${pcfiledir} Name: opus uninstalled Description: Opus IETF audio codec (not installed, @PC_BUILD@) Version: @VERSION@ Requires: Conflicts: Libs: ${libdir}/libopus.a @LIBM@ Cflags: -I${pcfiledir}/@top_srcdir@/include mumble-1.3.4/3rdparty/opus-src/COPYING0000664000175000017500000000361014010707326017216 0ustar builderbuilderCopyright 2001-2011 Xiph.Org, Skype Limited, Octasic, Jean-Marc Valin, Timothy B. Terriberry, CSIRO, Gregory Maxwell, Mark Borgerding, Erik de Castro Lopo Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Opus is subject to the royalty-free patent licenses which are specified at: Xiph.Org Foundation: https://datatracker.ietf.org/ipr/1524/ Microsoft Corporation: https://datatracker.ietf.org/ipr/1914/ Broadcom Corporation: https://datatracker.ietf.org/ipr/1526/ mumble-1.3.4/3rdparty/opus-src/silk_headers.mk0000664000175000017500000000210214010707327021145 0ustar builderbuilderSILK_HEAD = \ silk/debug.h \ silk/control.h \ silk/errors.h \ silk/API.h \ silk/typedef.h \ silk/define.h \ silk/main.h \ silk/x86/main_sse.h \ silk/PLC.h \ silk/structs.h \ silk/tables.h \ silk/tuning_parameters.h \ silk/Inlines.h \ silk/MacroCount.h \ silk/MacroDebug.h \ silk/macros.h \ silk/NSQ.h \ silk/pitch_est_defines.h \ silk/resampler_private.h \ silk/resampler_rom.h \ silk/resampler_structs.h \ silk/SigProc_FIX.h \ silk/x86/SigProc_FIX_sse.h \ silk/arm/biquad_alt_arm.h \ silk/arm/LPC_inv_pred_gain_arm.h \ silk/arm/macros_armv4.h \ silk/arm/macros_armv5e.h \ silk/arm/macros_arm64.h \ silk/arm/SigProc_FIX_armv4.h \ silk/arm/SigProc_FIX_armv5e.h \ silk/arm/NSQ_del_dec_arm.h \ silk/arm/NSQ_neon.h \ silk/fixed/main_FIX.h \ silk/fixed/structs_FIX.h \ silk/fixed/arm/warped_autocorrelation_FIX_arm.h \ silk/fixed/mips/noise_shape_analysis_FIX_mipsr1.h \ silk/fixed/mips/warped_autocorrelation_FIX_mipsr1.h \ silk/float/main_FLP.h \ silk/float/structs_FLP.h \ silk/float/SigProc_FLP.h \ silk/mips/macros_mipsr1.h \ silk/mips/NSQ_del_dec_mipsr1.h \ silk/mips/sigproc_fix_mipsr1.h mumble-1.3.4/3rdparty/opus-src/opus_headers.mk0000664000175000017500000000020114010707327021167 0ustar builderbuilderOPUS_HEAD = \ include/opus.h \ include/opus_multistream.h \ src/opus_private.h \ src/analysis.h \ src/mlp.h \ src/tansig_table.h mumble-1.3.4/3rdparty/opus-src/src/0000775000175000017500000000000014010707327016753 5ustar builderbuildermumble-1.3.4/3rdparty/opus-src/src/opus_decoder.c0000664000175000017500000007130614010707327021601 0ustar builderbuilder/* Copyright (c) 2010 Xiph.Org Foundation, Skype Limited Written by Jean-Marc Valin and Koen Vos */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #ifndef OPUS_BUILD # error "OPUS_BUILD _MUST_ be defined to build Opus. This probably means you need other defines as well, as in a config.h. See the included build files for details." #endif #if defined(__GNUC__) && (__GNUC__ >= 2) && !defined(__OPTIMIZE__) && !defined(OPUS_WILL_BE_SLOW) # pragma message "You appear to be compiling without optimization, if so opus will be very slow." #endif #include #include "celt.h" #include "opus.h" #include "entdec.h" #include "modes.h" #include "API.h" #include "stack_alloc.h" #include "float_cast.h" #include "opus_private.h" #include "os_support.h" #include "structs.h" #include "define.h" #include "mathops.h" #include "cpu_support.h" struct OpusDecoder { int celt_dec_offset; int silk_dec_offset; int channels; opus_int32 Fs; /** Sampling rate (at the API level) */ silk_DecControlStruct DecControl; int decode_gain; int arch; /* Everything beyond this point gets cleared on a reset */ #define OPUS_DECODER_RESET_START stream_channels int stream_channels; int bandwidth; int mode; int prev_mode; int frame_size; int prev_redundancy; int last_packet_duration; #ifndef FIXED_POINT opus_val16 softclip_mem[2]; #endif opus_uint32 rangeFinal; }; int opus_decoder_get_size(int channels) { int silkDecSizeBytes, celtDecSizeBytes; int ret; if (channels<1 || channels > 2) return 0; ret = silk_Get_Decoder_Size( &silkDecSizeBytes ); if(ret) return 0; silkDecSizeBytes = align(silkDecSizeBytes); celtDecSizeBytes = celt_decoder_get_size(channels); return align(sizeof(OpusDecoder))+silkDecSizeBytes+celtDecSizeBytes; } int opus_decoder_init(OpusDecoder *st, opus_int32 Fs, int channels) { void *silk_dec; CELTDecoder *celt_dec; int ret, silkDecSizeBytes; if ((Fs!=48000&&Fs!=24000&&Fs!=16000&&Fs!=12000&&Fs!=8000) || (channels!=1&&channels!=2)) return OPUS_BAD_ARG; OPUS_CLEAR((char*)st, opus_decoder_get_size(channels)); /* Initialize SILK encoder */ ret = silk_Get_Decoder_Size(&silkDecSizeBytes); if (ret) return OPUS_INTERNAL_ERROR; silkDecSizeBytes = align(silkDecSizeBytes); st->silk_dec_offset = align(sizeof(OpusDecoder)); st->celt_dec_offset = st->silk_dec_offset+silkDecSizeBytes; silk_dec = (char*)st+st->silk_dec_offset; celt_dec = (CELTDecoder*)((char*)st+st->celt_dec_offset); st->stream_channels = st->channels = channels; st->Fs = Fs; st->DecControl.API_sampleRate = st->Fs; st->DecControl.nChannelsAPI = st->channels; /* Reset decoder */ ret = silk_InitDecoder( silk_dec ); if(ret)return OPUS_INTERNAL_ERROR; /* Initialize CELT decoder */ ret = celt_decoder_init(celt_dec, Fs, channels); if(ret!=OPUS_OK)return OPUS_INTERNAL_ERROR; celt_decoder_ctl(celt_dec, CELT_SET_SIGNALLING(0)); st->prev_mode = 0; st->frame_size = Fs/400; st->arch = opus_select_arch(); return OPUS_OK; } OpusDecoder *opus_decoder_create(opus_int32 Fs, int channels, int *error) { int ret; OpusDecoder *st; if ((Fs!=48000&&Fs!=24000&&Fs!=16000&&Fs!=12000&&Fs!=8000) || (channels!=1&&channels!=2)) { if (error) *error = OPUS_BAD_ARG; return NULL; } st = (OpusDecoder *)opus_alloc(opus_decoder_get_size(channels)); if (st == NULL) { if (error) *error = OPUS_ALLOC_FAIL; return NULL; } ret = opus_decoder_init(st, Fs, channels); if (error) *error = ret; if (ret != OPUS_OK) { opus_free(st); st = NULL; } return st; } static void smooth_fade(const opus_val16 *in1, const opus_val16 *in2, opus_val16 *out, int overlap, int channels, const opus_val16 *window, opus_int32 Fs) { int i, c; int inc = 48000/Fs; for (c=0;csilk_dec_offset; celt_dec = (CELTDecoder*)((char*)st+st->celt_dec_offset); F20 = st->Fs/50; F10 = F20>>1; F5 = F10>>1; F2_5 = F5>>1; if (frame_size < F2_5) { RESTORE_STACK; return OPUS_BUFFER_TOO_SMALL; } /* Limit frame_size to avoid excessive stack allocations. */ frame_size = IMIN(frame_size, st->Fs/25*3); /* Payloads of 1 (2 including ToC) or 0 trigger the PLC/DTX */ if (len<=1) { data = NULL; /* In that case, don't conceal more than what the ToC says */ frame_size = IMIN(frame_size, st->frame_size); } if (data != NULL) { audiosize = st->frame_size; mode = st->mode; ec_dec_init(&dec,(unsigned char*)data,len); } else { audiosize = frame_size; mode = st->prev_mode; if (mode == 0) { /* If we haven't got any packet yet, all we can do is return zeros */ for (i=0;ichannels;i++) pcm[i] = 0; RESTORE_STACK; return audiosize; } /* Avoids trying to run the PLC on sizes other than 2.5 (CELT), 5 (CELT), 10, or 20 (e.g. 12.5 or 30 ms). */ if (audiosize > F20) { do { int ret = opus_decode_frame(st, NULL, 0, pcm, IMIN(audiosize, F20), 0); if (ret<0) { RESTORE_STACK; return ret; } pcm += ret*st->channels; audiosize -= ret; } while (audiosize > 0); RESTORE_STACK; return frame_size; } else if (audiosize < F20) { if (audiosize > F10) audiosize = F10; else if (mode != MODE_SILK_ONLY && audiosize > F5 && audiosize < F10) audiosize = F5; } } /* In fixed-point, we can tell CELT to do the accumulation on top of the SILK PCM buffer. This saves some stack space. */ #ifdef FIXED_POINT celt_accum = (mode != MODE_CELT_ONLY) && (frame_size >= F10); #else celt_accum = 0; #endif pcm_transition_silk_size = ALLOC_NONE; pcm_transition_celt_size = ALLOC_NONE; if (data!=NULL && st->prev_mode > 0 && ( (mode == MODE_CELT_ONLY && st->prev_mode != MODE_CELT_ONLY && !st->prev_redundancy) || (mode != MODE_CELT_ONLY && st->prev_mode == MODE_CELT_ONLY) ) ) { transition = 1; /* Decide where to allocate the stack memory for pcm_transition */ if (mode == MODE_CELT_ONLY) pcm_transition_celt_size = F5*st->channels; else pcm_transition_silk_size = F5*st->channels; } ALLOC(pcm_transition_celt, pcm_transition_celt_size, opus_val16); if (transition && mode == MODE_CELT_ONLY) { pcm_transition = pcm_transition_celt; opus_decode_frame(st, NULL, 0, pcm_transition, IMIN(F5, audiosize), 0); } if (audiosize > frame_size) { /*fprintf(stderr, "PCM buffer too small: %d vs %d (mode = %d)\n", audiosize, frame_size, mode);*/ RESTORE_STACK; return OPUS_BAD_ARG; } else { frame_size = audiosize; } /* Don't allocate any memory when in CELT-only mode */ pcm_silk_size = (mode != MODE_CELT_ONLY && !celt_accum) ? IMAX(F10, frame_size)*st->channels : ALLOC_NONE; ALLOC(pcm_silk, pcm_silk_size, opus_int16); /* SILK processing */ if (mode != MODE_CELT_ONLY) { int lost_flag, decoded_samples; opus_int16 *pcm_ptr; #ifdef FIXED_POINT if (celt_accum) pcm_ptr = pcm; else #endif pcm_ptr = pcm_silk; if (st->prev_mode==MODE_CELT_ONLY) silk_InitDecoder( silk_dec ); /* The SILK PLC cannot produce frames of less than 10 ms */ st->DecControl.payloadSize_ms = IMAX(10, 1000 * audiosize / st->Fs); if (data != NULL) { st->DecControl.nChannelsInternal = st->stream_channels; if( mode == MODE_SILK_ONLY ) { if( st->bandwidth == OPUS_BANDWIDTH_NARROWBAND ) { st->DecControl.internalSampleRate = 8000; } else if( st->bandwidth == OPUS_BANDWIDTH_MEDIUMBAND ) { st->DecControl.internalSampleRate = 12000; } else if( st->bandwidth == OPUS_BANDWIDTH_WIDEBAND ) { st->DecControl.internalSampleRate = 16000; } else { st->DecControl.internalSampleRate = 16000; silk_assert( 0 ); } } else { /* Hybrid mode */ st->DecControl.internalSampleRate = 16000; } } lost_flag = data == NULL ? 1 : 2 * decode_fec; decoded_samples = 0; do { /* Call SILK decoder */ int first_frame = decoded_samples == 0; silk_ret = silk_Decode( silk_dec, &st->DecControl, lost_flag, first_frame, &dec, pcm_ptr, &silk_frame_size, st->arch ); if( silk_ret ) { if (lost_flag) { /* PLC failure should not be fatal */ silk_frame_size = frame_size; for (i=0;ichannels;i++) pcm_ptr[i] = 0; } else { RESTORE_STACK; return OPUS_INTERNAL_ERROR; } } pcm_ptr += silk_frame_size * st->channels; decoded_samples += silk_frame_size; } while( decoded_samples < frame_size ); } start_band = 0; if (!decode_fec && mode != MODE_CELT_ONLY && data != NULL && ec_tell(&dec)+17+20*(st->mode == MODE_HYBRID) <= 8*len) { /* Check if we have a redundant 0-8 kHz band */ if (mode == MODE_HYBRID) redundancy = ec_dec_bit_logp(&dec, 12); else redundancy = 1; if (redundancy) { celt_to_silk = ec_dec_bit_logp(&dec, 1); /* redundancy_bytes will be at least two, in the non-hybrid case due to the ec_tell() check above */ redundancy_bytes = mode==MODE_HYBRID ? (opus_int32)ec_dec_uint(&dec, 256)+2 : len-((ec_tell(&dec)+7)>>3); len -= redundancy_bytes; /* This is a sanity check. It should never happen for a valid packet, so the exact behaviour is not normative. */ if (len*8 < ec_tell(&dec)) { len = 0; redundancy_bytes = 0; redundancy = 0; } /* Shrink decoder because of raw bits */ dec.storage -= redundancy_bytes; } } if (mode != MODE_CELT_ONLY) start_band = 17; { int endband=21; switch(st->bandwidth) { case OPUS_BANDWIDTH_NARROWBAND: endband = 13; break; case OPUS_BANDWIDTH_MEDIUMBAND: case OPUS_BANDWIDTH_WIDEBAND: endband = 17; break; case OPUS_BANDWIDTH_SUPERWIDEBAND: endband = 19; break; case OPUS_BANDWIDTH_FULLBAND: endband = 21; break; } celt_decoder_ctl(celt_dec, CELT_SET_END_BAND(endband)); celt_decoder_ctl(celt_dec, CELT_SET_CHANNELS(st->stream_channels)); } if (redundancy) { transition = 0; pcm_transition_silk_size=ALLOC_NONE; } ALLOC(pcm_transition_silk, pcm_transition_silk_size, opus_val16); if (transition && mode != MODE_CELT_ONLY) { pcm_transition = pcm_transition_silk; opus_decode_frame(st, NULL, 0, pcm_transition, IMIN(F5, audiosize), 0); } /* Only allocation memory for redundancy if/when needed */ redundant_audio_size = redundancy ? F5*st->channels : ALLOC_NONE; ALLOC(redundant_audio, redundant_audio_size, opus_val16); /* 5 ms redundant frame for CELT->SILK*/ if (redundancy && celt_to_silk) { celt_decoder_ctl(celt_dec, CELT_SET_START_BAND(0)); celt_decode_with_ec(celt_dec, data+len, redundancy_bytes, redundant_audio, F5, NULL, 0); celt_decoder_ctl(celt_dec, OPUS_GET_FINAL_RANGE(&redundant_rng)); } /* MUST be after PLC */ celt_decoder_ctl(celt_dec, CELT_SET_START_BAND(start_band)); if (mode != MODE_SILK_ONLY) { int celt_frame_size = IMIN(F20, frame_size); /* Make sure to discard any previous CELT state */ if (mode != st->prev_mode && st->prev_mode > 0 && !st->prev_redundancy) celt_decoder_ctl(celt_dec, OPUS_RESET_STATE); /* Decode CELT */ celt_ret = celt_decode_with_ec(celt_dec, decode_fec ? NULL : data, len, pcm, celt_frame_size, &dec, celt_accum); } else { unsigned char silence[2] = {0xFF, 0xFF}; if (!celt_accum) { for (i=0;ichannels;i++) pcm[i] = 0; } /* For hybrid -> SILK transitions, we let the CELT MDCT do a fade-out by decoding a silence frame */ if (st->prev_mode == MODE_HYBRID && !(redundancy && celt_to_silk && st->prev_redundancy) ) { celt_decoder_ctl(celt_dec, CELT_SET_START_BAND(0)); celt_decode_with_ec(celt_dec, silence, 2, pcm, F2_5, NULL, celt_accum); } } if (mode != MODE_CELT_ONLY && !celt_accum) { #ifdef FIXED_POINT for (i=0;ichannels;i++) pcm[i] = SAT16(ADD32(pcm[i], pcm_silk[i])); #else for (i=0;ichannels;i++) pcm[i] = pcm[i] + (opus_val16)((1.f/32768.f)*pcm_silk[i]); #endif } { const CELTMode *celt_mode; celt_decoder_ctl(celt_dec, CELT_GET_MODE(&celt_mode)); window = celt_mode->window; } /* 5 ms redundant frame for SILK->CELT */ if (redundancy && !celt_to_silk) { celt_decoder_ctl(celt_dec, OPUS_RESET_STATE); celt_decoder_ctl(celt_dec, CELT_SET_START_BAND(0)); celt_decode_with_ec(celt_dec, data+len, redundancy_bytes, redundant_audio, F5, NULL, 0); celt_decoder_ctl(celt_dec, OPUS_GET_FINAL_RANGE(&redundant_rng)); smooth_fade(pcm+st->channels*(frame_size-F2_5), redundant_audio+st->channels*F2_5, pcm+st->channels*(frame_size-F2_5), F2_5, st->channels, window, st->Fs); } if (redundancy && celt_to_silk) { for (c=0;cchannels;c++) { for (i=0;ichannels*i+c] = redundant_audio[st->channels*i+c]; } smooth_fade(redundant_audio+st->channels*F2_5, pcm+st->channels*F2_5, pcm+st->channels*F2_5, F2_5, st->channels, window, st->Fs); } if (transition) { if (audiosize >= F5) { for (i=0;ichannels*F2_5;i++) pcm[i] = pcm_transition[i]; smooth_fade(pcm_transition+st->channels*F2_5, pcm+st->channels*F2_5, pcm+st->channels*F2_5, F2_5, st->channels, window, st->Fs); } else { /* Not enough time to do a clean transition, but we do it anyway This will not preserve amplitude perfectly and may introduce a bit of temporal aliasing, but it shouldn't be too bad and that's pretty much the best we can do. In any case, generating this transition it pretty silly in the first place */ smooth_fade(pcm_transition, pcm, pcm, F2_5, st->channels, window, st->Fs); } } if(st->decode_gain) { opus_val32 gain; gain = celt_exp2(MULT16_16_P15(QCONST16(6.48814081e-4f, 25), st->decode_gain)); for (i=0;ichannels;i++) { opus_val32 x; x = MULT16_32_P16(pcm[i],gain); pcm[i] = SATURATE(x, 32767); } } if (len <= 1) st->rangeFinal = 0; else st->rangeFinal = dec.rng ^ redundant_rng; st->prev_mode = mode; st->prev_redundancy = redundancy && !celt_to_silk; if (celt_ret>=0) { if (OPUS_CHECK_ARRAY(pcm, audiosize*st->channels)) OPUS_PRINT_INT(audiosize); } RESTORE_STACK; return celt_ret < 0 ? celt_ret : audiosize; } int opus_decode_native(OpusDecoder *st, const unsigned char *data, opus_int32 len, opus_val16 *pcm, int frame_size, int decode_fec, int self_delimited, opus_int32 *packet_offset, int soft_clip) { int i, nb_samples; int count, offset; unsigned char toc; int packet_frame_size, packet_bandwidth, packet_mode, packet_stream_channels; /* 48 x 2.5 ms = 120 ms */ opus_int16 size[48]; if (decode_fec<0 || decode_fec>1) return OPUS_BAD_ARG; /* For FEC/PLC, frame_size has to be to have a multiple of 2.5 ms */ if ((decode_fec || len==0 || data==NULL) && frame_size%(st->Fs/400)!=0) return OPUS_BAD_ARG; if (len==0 || data==NULL) { int pcm_count=0; do { int ret; ret = opus_decode_frame(st, NULL, 0, pcm+pcm_count*st->channels, frame_size-pcm_count, 0); if (ret<0) return ret; pcm_count += ret; } while (pcm_count < frame_size); celt_assert(pcm_count == frame_size); if (OPUS_CHECK_ARRAY(pcm, pcm_count*st->channels)) OPUS_PRINT_INT(pcm_count); st->last_packet_duration = pcm_count; return pcm_count; } else if (len<0) return OPUS_BAD_ARG; packet_mode = opus_packet_get_mode(data); packet_bandwidth = opus_packet_get_bandwidth(data); packet_frame_size = opus_packet_get_samples_per_frame(data, st->Fs); packet_stream_channels = opus_packet_get_nb_channels(data); count = opus_packet_parse_impl(data, len, self_delimited, &toc, NULL, size, &offset, packet_offset); if (count<0) return count; data += offset; if (decode_fec) { int duration_copy; int ret; /* If no FEC can be present, run the PLC (recursive call) */ if (frame_size < packet_frame_size || packet_mode == MODE_CELT_ONLY || st->mode == MODE_CELT_ONLY) return opus_decode_native(st, NULL, 0, pcm, frame_size, 0, 0, NULL, soft_clip); /* Otherwise, run the PLC on everything except the size for which we might have FEC */ duration_copy = st->last_packet_duration; if (frame_size-packet_frame_size!=0) { ret = opus_decode_native(st, NULL, 0, pcm, frame_size-packet_frame_size, 0, 0, NULL, soft_clip); if (ret<0) { st->last_packet_duration = duration_copy; return ret; } celt_assert(ret==frame_size-packet_frame_size); } /* Complete with FEC */ st->mode = packet_mode; st->bandwidth = packet_bandwidth; st->frame_size = packet_frame_size; st->stream_channels = packet_stream_channels; ret = opus_decode_frame(st, data, size[0], pcm+st->channels*(frame_size-packet_frame_size), packet_frame_size, 1); if (ret<0) return ret; else { if (OPUS_CHECK_ARRAY(pcm, frame_size*st->channels)) OPUS_PRINT_INT(frame_size); st->last_packet_duration = frame_size; return frame_size; } } if (count*packet_frame_size > frame_size) return OPUS_BUFFER_TOO_SMALL; /* Update the state as the last step to avoid updating it on an invalid packet */ st->mode = packet_mode; st->bandwidth = packet_bandwidth; st->frame_size = packet_frame_size; st->stream_channels = packet_stream_channels; nb_samples=0; for (i=0;ichannels, frame_size-nb_samples, 0); if (ret<0) return ret; celt_assert(ret==packet_frame_size); data += size[i]; nb_samples += ret; } st->last_packet_duration = nb_samples; if (OPUS_CHECK_ARRAY(pcm, nb_samples*st->channels)) OPUS_PRINT_INT(nb_samples); #ifndef FIXED_POINT if (soft_clip) opus_pcm_soft_clip(pcm, nb_samples, st->channels, st->softclip_mem); else st->softclip_mem[0]=st->softclip_mem[1]=0; #endif return nb_samples; } #ifdef FIXED_POINT int opus_decode(OpusDecoder *st, const unsigned char *data, opus_int32 len, opus_val16 *pcm, int frame_size, int decode_fec) { if(frame_size<=0) return OPUS_BAD_ARG; return opus_decode_native(st, data, len, pcm, frame_size, decode_fec, 0, NULL, 0); } #ifndef DISABLE_FLOAT_API int opus_decode_float(OpusDecoder *st, const unsigned char *data, opus_int32 len, float *pcm, int frame_size, int decode_fec) { VARDECL(opus_int16, out); int ret, i; int nb_samples; ALLOC_STACK; if(frame_size<=0) { RESTORE_STACK; return OPUS_BAD_ARG; } if (data != NULL && len > 0 && !decode_fec) { nb_samples = opus_decoder_get_nb_samples(st, data, len); if (nb_samples>0) frame_size = IMIN(frame_size, nb_samples); else return OPUS_INVALID_PACKET; } ALLOC(out, frame_size*st->channels, opus_int16); ret = opus_decode_native(st, data, len, out, frame_size, decode_fec, 0, NULL, 0); if (ret > 0) { for (i=0;ichannels;i++) pcm[i] = (1.f/32768.f)*(out[i]); } RESTORE_STACK; return ret; } #endif #else int opus_decode(OpusDecoder *st, const unsigned char *data, opus_int32 len, opus_int16 *pcm, int frame_size, int decode_fec) { VARDECL(float, out); int ret, i; int nb_samples; ALLOC_STACK; if(frame_size<=0) { RESTORE_STACK; return OPUS_BAD_ARG; } if (data != NULL && len > 0 && !decode_fec) { nb_samples = opus_decoder_get_nb_samples(st, data, len); if (nb_samples>0) frame_size = IMIN(frame_size, nb_samples); else return OPUS_INVALID_PACKET; } ALLOC(out, frame_size*st->channels, float); ret = opus_decode_native(st, data, len, out, frame_size, decode_fec, 0, NULL, 1); if (ret > 0) { for (i=0;ichannels;i++) pcm[i] = FLOAT2INT16(out[i]); } RESTORE_STACK; return ret; } int opus_decode_float(OpusDecoder *st, const unsigned char *data, opus_int32 len, opus_val16 *pcm, int frame_size, int decode_fec) { if(frame_size<=0) return OPUS_BAD_ARG; return opus_decode_native(st, data, len, pcm, frame_size, decode_fec, 0, NULL, 0); } #endif int opus_decoder_ctl(OpusDecoder *st, int request, ...) { int ret = OPUS_OK; va_list ap; void *silk_dec; CELTDecoder *celt_dec; silk_dec = (char*)st+st->silk_dec_offset; celt_dec = (CELTDecoder*)((char*)st+st->celt_dec_offset); va_start(ap, request); switch (request) { case OPUS_GET_BANDWIDTH_REQUEST: { opus_int32 *value = va_arg(ap, opus_int32*); if (!value) { goto bad_arg; } *value = st->bandwidth; } break; case OPUS_GET_FINAL_RANGE_REQUEST: { opus_uint32 *value = va_arg(ap, opus_uint32*); if (!value) { goto bad_arg; } *value = st->rangeFinal; } break; case OPUS_RESET_STATE: { OPUS_CLEAR((char*)&st->OPUS_DECODER_RESET_START, sizeof(OpusDecoder)- ((char*)&st->OPUS_DECODER_RESET_START - (char*)st)); celt_decoder_ctl(celt_dec, OPUS_RESET_STATE); silk_InitDecoder( silk_dec ); st->stream_channels = st->channels; st->frame_size = st->Fs/400; } break; case OPUS_GET_SAMPLE_RATE_REQUEST: { opus_int32 *value = va_arg(ap, opus_int32*); if (!value) { goto bad_arg; } *value = st->Fs; } break; case OPUS_GET_PITCH_REQUEST: { opus_int32 *value = va_arg(ap, opus_int32*); if (!value) { goto bad_arg; } if (st->prev_mode == MODE_CELT_ONLY) celt_decoder_ctl(celt_dec, OPUS_GET_PITCH(value)); else *value = st->DecControl.prevPitchLag; } break; case OPUS_GET_GAIN_REQUEST: { opus_int32 *value = va_arg(ap, opus_int32*); if (!value) { goto bad_arg; } *value = st->decode_gain; } break; case OPUS_SET_GAIN_REQUEST: { opus_int32 value = va_arg(ap, opus_int32); if (value<-32768 || value>32767) { goto bad_arg; } st->decode_gain = value; } break; case OPUS_GET_LAST_PACKET_DURATION_REQUEST: { opus_int32 *value = va_arg(ap, opus_int32*); if (!value) { goto bad_arg; } *value = st->last_packet_duration; } break; case OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST: { opus_int32 value = va_arg(ap, opus_int32); if(value<0 || value>1) { goto bad_arg; } celt_decoder_ctl(celt_dec, OPUS_SET_PHASE_INVERSION_DISABLED(value)); } break; case OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST: { opus_int32 *value = va_arg(ap, opus_int32*); if (!value) { goto bad_arg; } celt_decoder_ctl(celt_dec, OPUS_GET_PHASE_INVERSION_DISABLED(value)); } break; default: /*fprintf(stderr, "unknown opus_decoder_ctl() request: %d", request);*/ ret = OPUS_UNIMPLEMENTED; break; } va_end(ap); return ret; bad_arg: va_end(ap); return OPUS_BAD_ARG; } void opus_decoder_destroy(OpusDecoder *st) { opus_free(st); } int opus_packet_get_bandwidth(const unsigned char *data) { int bandwidth; if (data[0]&0x80) { bandwidth = OPUS_BANDWIDTH_MEDIUMBAND + ((data[0]>>5)&0x3); if (bandwidth == OPUS_BANDWIDTH_MEDIUMBAND) bandwidth = OPUS_BANDWIDTH_NARROWBAND; } else if ((data[0]&0x60) == 0x60) { bandwidth = (data[0]&0x10) ? OPUS_BANDWIDTH_FULLBAND : OPUS_BANDWIDTH_SUPERWIDEBAND; } else { bandwidth = OPUS_BANDWIDTH_NARROWBAND + ((data[0]>>5)&0x3); } return bandwidth; } int opus_packet_get_nb_channels(const unsigned char *data) { return (data[0]&0x4) ? 2 : 1; } int opus_packet_get_nb_frames(const unsigned char packet[], opus_int32 len) { int count; if (len<1) return OPUS_BAD_ARG; count = packet[0]&0x3; if (count==0) return 1; else if (count!=3) return 2; else if (len<2) return OPUS_INVALID_PACKET; else return packet[1]&0x3F; } int opus_packet_get_nb_samples(const unsigned char packet[], opus_int32 len, opus_int32 Fs) { int samples; int count = opus_packet_get_nb_frames(packet, len); if (count<0) return count; samples = count*opus_packet_get_samples_per_frame(packet, Fs); /* Can't have more than 120 ms */ if (samples*25 > Fs*3) return OPUS_INVALID_PACKET; else return samples; } int opus_decoder_get_nb_samples(const OpusDecoder *dec, const unsigned char packet[], opus_int32 len) { return opus_packet_get_nb_samples(packet, len, dec->Fs); } mumble-1.3.4/3rdparty/opus-src/src/opus_multistream_decoder.c0000664000175000017500000003421314010707327024223 0ustar builderbuilder/* Copyright (c) 2011 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "opus_multistream.h" #include "opus.h" #include "opus_private.h" #include "stack_alloc.h" #include #include "float_cast.h" #include "os_support.h" struct OpusMSDecoder { ChannelLayout layout; /* Decoder states go here */ }; /* DECODER */ opus_int32 opus_multistream_decoder_get_size(int nb_streams, int nb_coupled_streams) { int coupled_size; int mono_size; if(nb_streams<1||nb_coupled_streams>nb_streams||nb_coupled_streams<0)return 0; coupled_size = opus_decoder_get_size(2); mono_size = opus_decoder_get_size(1); return align(sizeof(OpusMSDecoder)) + nb_coupled_streams * align(coupled_size) + (nb_streams-nb_coupled_streams) * align(mono_size); } int opus_multistream_decoder_init( OpusMSDecoder *st, opus_int32 Fs, int channels, int streams, int coupled_streams, const unsigned char *mapping ) { int coupled_size; int mono_size; int i, ret; char *ptr; if ((channels>255) || (channels<1) || (coupled_streams>streams) || (streams<1) || (coupled_streams<0) || (streams>255-coupled_streams)) return OPUS_BAD_ARG; st->layout.nb_channels = channels; st->layout.nb_streams = streams; st->layout.nb_coupled_streams = coupled_streams; for (i=0;ilayout.nb_channels;i++) st->layout.mapping[i] = mapping[i]; if (!validate_layout(&st->layout)) return OPUS_BAD_ARG; ptr = (char*)st + align(sizeof(OpusMSDecoder)); coupled_size = opus_decoder_get_size(2); mono_size = opus_decoder_get_size(1); for (i=0;ilayout.nb_coupled_streams;i++) { ret=opus_decoder_init((OpusDecoder*)ptr, Fs, 2); if(ret!=OPUS_OK)return ret; ptr += align(coupled_size); } for (;ilayout.nb_streams;i++) { ret=opus_decoder_init((OpusDecoder*)ptr, Fs, 1); if(ret!=OPUS_OK)return ret; ptr += align(mono_size); } return OPUS_OK; } OpusMSDecoder *opus_multistream_decoder_create( opus_int32 Fs, int channels, int streams, int coupled_streams, const unsigned char *mapping, int *error ) { int ret; OpusMSDecoder *st; if ((channels>255) || (channels<1) || (coupled_streams>streams) || (streams<1) || (coupled_streams<0) || (streams>255-coupled_streams)) { if (error) *error = OPUS_BAD_ARG; return NULL; } st = (OpusMSDecoder *)opus_alloc(opus_multistream_decoder_get_size(streams, coupled_streams)); if (st==NULL) { if (error) *error = OPUS_ALLOC_FAIL; return NULL; } ret = opus_multistream_decoder_init(st, Fs, channels, streams, coupled_streams, mapping); if (error) *error = ret; if (ret != OPUS_OK) { opus_free(st); st = NULL; } return st; } typedef void (*opus_copy_channel_out_func)( void *dst, int dst_stride, int dst_channel, const opus_val16 *src, int src_stride, int frame_size ); static int opus_multistream_packet_validate(const unsigned char *data, opus_int32 len, int nb_streams, opus_int32 Fs) { int s; int count; unsigned char toc; opus_int16 size[48]; int samples=0; opus_int32 packet_offset; for (s=0;slayout.nb_streams-1) { RESTORE_STACK; return OPUS_INVALID_PACKET; } if (!do_plc) { int ret = opus_multistream_packet_validate(data, len, st->layout.nb_streams, Fs); if (ret < 0) { RESTORE_STACK; return ret; } else if (ret > frame_size) { RESTORE_STACK; return OPUS_BUFFER_TOO_SMALL; } } for (s=0;slayout.nb_streams;s++) { OpusDecoder *dec; opus_int32 packet_offset; int ret; dec = (OpusDecoder*)ptr; ptr += (s < st->layout.nb_coupled_streams) ? align(coupled_size) : align(mono_size); if (!do_plc && len<=0) { RESTORE_STACK; return OPUS_INTERNAL_ERROR; } packet_offset = 0; ret = opus_decode_native(dec, data, len, buf, frame_size, decode_fec, s!=st->layout.nb_streams-1, &packet_offset, soft_clip); data += packet_offset; len -= packet_offset; if (ret <= 0) { RESTORE_STACK; return ret; } frame_size = ret; if (s < st->layout.nb_coupled_streams) { int chan, prev; prev = -1; /* Copy "left" audio to the channel(s) where it belongs */ while ( (chan = get_left_channel(&st->layout, s, prev)) != -1) { (*copy_channel_out)(pcm, st->layout.nb_channels, chan, buf, 2, frame_size); prev = chan; } prev = -1; /* Copy "right" audio to the channel(s) where it belongs */ while ( (chan = get_right_channel(&st->layout, s, prev)) != -1) { (*copy_channel_out)(pcm, st->layout.nb_channels, chan, buf+1, 2, frame_size); prev = chan; } } else { int chan, prev; prev = -1; /* Copy audio to the channel(s) where it belongs */ while ( (chan = get_mono_channel(&st->layout, s, prev)) != -1) { (*copy_channel_out)(pcm, st->layout.nb_channels, chan, buf, 1, frame_size); prev = chan; } } } /* Handle muted channels */ for (c=0;clayout.nb_channels;c++) { if (st->layout.mapping[c] == 255) { (*copy_channel_out)(pcm, st->layout.nb_channels, c, NULL, 0, frame_size); } } RESTORE_STACK; return frame_size; } #if !defined(DISABLE_FLOAT_API) static void opus_copy_channel_out_float( void *dst, int dst_stride, int dst_channel, const opus_val16 *src, int src_stride, int frame_size ) { float *float_dst; opus_int32 i; float_dst = (float*)dst; if (src != NULL) { for (i=0;ilayout.nb_streams;s++) { OpusDecoder *dec; dec = (OpusDecoder*)ptr; if (s < st->layout.nb_coupled_streams) ptr += align(coupled_size); else ptr += align(mono_size); ret = opus_decoder_ctl(dec, request, &tmp); if (ret != OPUS_OK) break; *value ^= tmp; } } break; case OPUS_RESET_STATE: { int s; for (s=0;slayout.nb_streams;s++) { OpusDecoder *dec; dec = (OpusDecoder*)ptr; if (s < st->layout.nb_coupled_streams) ptr += align(coupled_size); else ptr += align(mono_size); ret = opus_decoder_ctl(dec, OPUS_RESET_STATE); if (ret != OPUS_OK) break; } } break; case OPUS_MULTISTREAM_GET_DECODER_STATE_REQUEST: { int s; opus_int32 stream_id; OpusDecoder **value; stream_id = va_arg(ap, opus_int32); if (stream_id<0 || stream_id >= st->layout.nb_streams) ret = OPUS_BAD_ARG; value = va_arg(ap, OpusDecoder**); if (!value) { goto bad_arg; } for (s=0;slayout.nb_coupled_streams) ptr += align(coupled_size); else ptr += align(mono_size); } *value = (OpusDecoder*)ptr; } break; case OPUS_SET_GAIN_REQUEST: case OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST: { int s; /* This works for int32 params */ opus_int32 value = va_arg(ap, opus_int32); for (s=0;slayout.nb_streams;s++) { OpusDecoder *dec; dec = (OpusDecoder*)ptr; if (s < st->layout.nb_coupled_streams) ptr += align(coupled_size); else ptr += align(mono_size); ret = opus_decoder_ctl(dec, request, value); if (ret != OPUS_OK) break; } } break; default: ret = OPUS_UNIMPLEMENTED; break; } va_end(ap); return ret; bad_arg: va_end(ap); return OPUS_BAD_ARG; } void opus_multistream_decoder_destroy(OpusMSDecoder *st) { opus_free(st); } mumble-1.3.4/3rdparty/opus-src/src/repacketizer.c0000664000175000017500000002316214010707327021613 0ustar builderbuilder/* Copyright (c) 2011 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "opus.h" #include "opus_private.h" #include "os_support.h" int opus_repacketizer_get_size(void) { return sizeof(OpusRepacketizer); } OpusRepacketizer *opus_repacketizer_init(OpusRepacketizer *rp) { rp->nb_frames = 0; return rp; } OpusRepacketizer *opus_repacketizer_create(void) { OpusRepacketizer *rp; rp=(OpusRepacketizer *)opus_alloc(opus_repacketizer_get_size()); if(rp==NULL)return NULL; return opus_repacketizer_init(rp); } void opus_repacketizer_destroy(OpusRepacketizer *rp) { opus_free(rp); } static int opus_repacketizer_cat_impl(OpusRepacketizer *rp, const unsigned char *data, opus_int32 len, int self_delimited) { unsigned char tmp_toc; int curr_nb_frames,ret; /* Set of check ToC */ if (len<1) return OPUS_INVALID_PACKET; if (rp->nb_frames == 0) { rp->toc = data[0]; rp->framesize = opus_packet_get_samples_per_frame(data, 8000); } else if ((rp->toc&0xFC) != (data[0]&0xFC)) { /*fprintf(stderr, "toc mismatch: 0x%x vs 0x%x\n", rp->toc, data[0]);*/ return OPUS_INVALID_PACKET; } curr_nb_frames = opus_packet_get_nb_frames(data, len); if(curr_nb_frames<1) return OPUS_INVALID_PACKET; /* Check the 120 ms maximum packet size */ if ((curr_nb_frames+rp->nb_frames)*rp->framesize > 960) { return OPUS_INVALID_PACKET; } ret=opus_packet_parse_impl(data, len, self_delimited, &tmp_toc, &rp->frames[rp->nb_frames], &rp->len[rp->nb_frames], NULL, NULL); if(ret<1)return ret; rp->nb_frames += curr_nb_frames; return OPUS_OK; } int opus_repacketizer_cat(OpusRepacketizer *rp, const unsigned char *data, opus_int32 len) { return opus_repacketizer_cat_impl(rp, data, len, 0); } int opus_repacketizer_get_nb_frames(OpusRepacketizer *rp) { return rp->nb_frames; } opus_int32 opus_repacketizer_out_range_impl(OpusRepacketizer *rp, int begin, int end, unsigned char *data, opus_int32 maxlen, int self_delimited, int pad) { int i, count; opus_int32 tot_size; opus_int16 *len; const unsigned char **frames; unsigned char * ptr; if (begin<0 || begin>=end || end>rp->nb_frames) { /*fprintf(stderr, "%d %d %d\n", begin, end, rp->nb_frames);*/ return OPUS_BAD_ARG; } count = end-begin; len = rp->len+begin; frames = rp->frames+begin; if (self_delimited) tot_size = 1 + (len[count-1]>=252); else tot_size = 0; ptr = data; if (count==1) { /* Code 0 */ tot_size += len[0]+1; if (tot_size > maxlen) return OPUS_BUFFER_TOO_SMALL; *ptr++ = rp->toc&0xFC; } else if (count==2) { if (len[1] == len[0]) { /* Code 1 */ tot_size += 2*len[0]+1; if (tot_size > maxlen) return OPUS_BUFFER_TOO_SMALL; *ptr++ = (rp->toc&0xFC) | 0x1; } else { /* Code 2 */ tot_size += len[0]+len[1]+2+(len[0]>=252); if (tot_size > maxlen) return OPUS_BUFFER_TOO_SMALL; *ptr++ = (rp->toc&0xFC) | 0x2; ptr += encode_size(len[0], ptr); } } if (count > 2 || (pad && tot_size < maxlen)) { /* Code 3 */ int vbr; int pad_amount=0; /* Restart the process for the padding case */ ptr = data; if (self_delimited) tot_size = 1 + (len[count-1]>=252); else tot_size = 0; vbr = 0; for (i=1;i=252) + len[i]; tot_size += len[count-1]; if (tot_size > maxlen) return OPUS_BUFFER_TOO_SMALL; *ptr++ = (rp->toc&0xFC) | 0x3; *ptr++ = count | 0x80; } else { tot_size += count*len[0]+2; if (tot_size > maxlen) return OPUS_BUFFER_TOO_SMALL; *ptr++ = (rp->toc&0xFC) | 0x3; *ptr++ = count; } pad_amount = pad ? (maxlen-tot_size) : 0; if (pad_amount != 0) { int nb_255s; data[1] |= 0x40; nb_255s = (pad_amount-1)/255; for (i=0;inb_frames, data, maxlen, 0, 0); } int opus_packet_pad(unsigned char *data, opus_int32 len, opus_int32 new_len) { OpusRepacketizer rp; opus_int32 ret; if (len < 1) return OPUS_BAD_ARG; if (len==new_len) return OPUS_OK; else if (len > new_len) return OPUS_BAD_ARG; opus_repacketizer_init(&rp); /* Moving payload to the end of the packet so we can do in-place padding */ OPUS_MOVE(data+new_len-len, data, len); ret = opus_repacketizer_cat(&rp, data+new_len-len, len); if (ret != OPUS_OK) return ret; ret = opus_repacketizer_out_range_impl(&rp, 0, rp.nb_frames, data, new_len, 0, 1); if (ret > 0) return OPUS_OK; else return ret; } opus_int32 opus_packet_unpad(unsigned char *data, opus_int32 len) { OpusRepacketizer rp; opus_int32 ret; if (len < 1) return OPUS_BAD_ARG; opus_repacketizer_init(&rp); ret = opus_repacketizer_cat(&rp, data, len); if (ret < 0) return ret; ret = opus_repacketizer_out_range_impl(&rp, 0, rp.nb_frames, data, len, 0, 0); celt_assert(ret > 0 && ret <= len); return ret; } int opus_multistream_packet_pad(unsigned char *data, opus_int32 len, opus_int32 new_len, int nb_streams) { int s; int count; unsigned char toc; opus_int16 size[48]; opus_int32 packet_offset; opus_int32 amount; if (len < 1) return OPUS_BAD_ARG; if (len==new_len) return OPUS_OK; else if (len > new_len) return OPUS_BAD_ARG; amount = new_len - len; /* Seek to last stream */ for (s=0;s #include "celt.h" #include "entenc.h" #include "modes.h" #include "API.h" #include "stack_alloc.h" #include "float_cast.h" #include "opus.h" #include "arch.h" #include "pitch.h" #include "opus_private.h" #include "os_support.h" #include "cpu_support.h" #include "analysis.h" #include "mathops.h" #include "tuning_parameters.h" #ifdef FIXED_POINT #include "fixed/structs_FIX.h" #else #include "float/structs_FLP.h" #endif #define MAX_ENCODER_BUFFER 480 #ifndef DISABLE_FLOAT_API #define PSEUDO_SNR_THRESHOLD 316.23f /* 10^(25/10) */ #endif typedef struct { opus_val32 XX, XY, YY; opus_val16 smoothed_width; opus_val16 max_follower; } StereoWidthState; struct OpusEncoder { int celt_enc_offset; int silk_enc_offset; silk_EncControlStruct silk_mode; int application; int channels; int delay_compensation; int force_channels; int signal_type; int user_bandwidth; int max_bandwidth; int user_forced_mode; int voice_ratio; opus_int32 Fs; int use_vbr; int vbr_constraint; int variable_duration; opus_int32 bitrate_bps; opus_int32 user_bitrate_bps; int lsb_depth; int encoder_buffer; int lfe; int arch; int use_dtx; /* general DTX for both SILK and CELT */ #ifndef DISABLE_FLOAT_API TonalityAnalysisState analysis; #endif #define OPUS_ENCODER_RESET_START stream_channels int stream_channels; opus_int16 hybrid_stereo_width_Q14; opus_int32 variable_HP_smth2_Q15; opus_val16 prev_HB_gain; opus_val32 hp_mem[4]; int mode; int prev_mode; int prev_channels; int prev_framesize; int bandwidth; /* Bandwidth determined automatically from the rate (before any other adjustment) */ int auto_bandwidth; int silk_bw_switch; /* Sampling rate (at the API level) */ int first; opus_val16 * energy_masking; StereoWidthState width_mem; opus_val16 delay_buffer[MAX_ENCODER_BUFFER*2]; #ifndef DISABLE_FLOAT_API int detected_bandwidth; int nb_no_activity_frames; opus_val32 peak_signal_energy; #endif int nonfinal_frame; /* current frame is not the final in a packet */ opus_uint32 rangeFinal; }; /* Transition tables for the voice and music. First column is the middle (memoriless) threshold. The second column is the hysteresis (difference with the middle) */ static const opus_int32 mono_voice_bandwidth_thresholds[8] = { 10000, 1000, /* NB<->MB */ 11000, 1000, /* MB<->WB */ 13500, 1000, /* WB<->SWB */ 14000, 2000, /* SWB<->FB */ }; static const opus_int32 mono_music_bandwidth_thresholds[8] = { 10000, 1000, /* NB<->MB */ 11000, 1000, /* MB<->WB */ 13500, 1000, /* WB<->SWB */ 14000, 2000, /* SWB<->FB */ }; static const opus_int32 stereo_voice_bandwidth_thresholds[8] = { 10000, 1000, /* NB<->MB */ 11000, 1000, /* MB<->WB */ 13500, 1000, /* WB<->SWB */ 14000, 2000, /* SWB<->FB */ }; static const opus_int32 stereo_music_bandwidth_thresholds[8] = { 10000, 1000, /* NB<->MB */ 11000, 1000, /* MB<->WB */ 13500, 1000, /* WB<->SWB */ 14000, 2000, /* SWB<->FB */ }; /* Threshold bit-rates for switching between mono and stereo */ static const opus_int32 stereo_voice_threshold = 24000; static const opus_int32 stereo_music_threshold = 24000; /* Threshold bit-rate for switching between SILK/hybrid and CELT-only */ static const opus_int32 mode_thresholds[2][2] = { /* voice */ /* music */ { 64000, 16000}, /* mono */ { 36000, 16000}, /* stereo */ }; static const opus_int32 fec_thresholds[] = { 12000, 1000, /* NB */ 14000, 1000, /* MB */ 16000, 1000, /* WB */ 20000, 1000, /* SWB */ 22000, 1000, /* FB */ }; int opus_encoder_get_size(int channels) { int silkEncSizeBytes, celtEncSizeBytes; int ret; if (channels<1 || channels > 2) return 0; ret = silk_Get_Encoder_Size( &silkEncSizeBytes ); if (ret) return 0; silkEncSizeBytes = align(silkEncSizeBytes); celtEncSizeBytes = celt_encoder_get_size(channels); return align(sizeof(OpusEncoder))+silkEncSizeBytes+celtEncSizeBytes; } int opus_encoder_init(OpusEncoder* st, opus_int32 Fs, int channels, int application) { void *silk_enc; CELTEncoder *celt_enc; int err; int ret, silkEncSizeBytes; if((Fs!=48000&&Fs!=24000&&Fs!=16000&&Fs!=12000&&Fs!=8000)||(channels!=1&&channels!=2)|| (application != OPUS_APPLICATION_VOIP && application != OPUS_APPLICATION_AUDIO && application != OPUS_APPLICATION_RESTRICTED_LOWDELAY)) return OPUS_BAD_ARG; OPUS_CLEAR((char*)st, opus_encoder_get_size(channels)); /* Create SILK encoder */ ret = silk_Get_Encoder_Size( &silkEncSizeBytes ); if (ret) return OPUS_BAD_ARG; silkEncSizeBytes = align(silkEncSizeBytes); st->silk_enc_offset = align(sizeof(OpusEncoder)); st->celt_enc_offset = st->silk_enc_offset+silkEncSizeBytes; silk_enc = (char*)st+st->silk_enc_offset; celt_enc = (CELTEncoder*)((char*)st+st->celt_enc_offset); st->stream_channels = st->channels = channels; st->Fs = Fs; st->arch = opus_select_arch(); ret = silk_InitEncoder( silk_enc, st->arch, &st->silk_mode ); if(ret)return OPUS_INTERNAL_ERROR; /* default SILK parameters */ st->silk_mode.nChannelsAPI = channels; st->silk_mode.nChannelsInternal = channels; st->silk_mode.API_sampleRate = st->Fs; st->silk_mode.maxInternalSampleRate = 16000; st->silk_mode.minInternalSampleRate = 8000; st->silk_mode.desiredInternalSampleRate = 16000; st->silk_mode.payloadSize_ms = 20; st->silk_mode.bitRate = 25000; st->silk_mode.packetLossPercentage = 0; st->silk_mode.complexity = 9; st->silk_mode.useInBandFEC = 0; st->silk_mode.useDTX = 0; st->silk_mode.useCBR = 0; st->silk_mode.reducedDependency = 0; /* Create CELT encoder */ /* Initialize CELT encoder */ err = celt_encoder_init(celt_enc, Fs, channels, st->arch); if(err!=OPUS_OK)return OPUS_INTERNAL_ERROR; celt_encoder_ctl(celt_enc, CELT_SET_SIGNALLING(0)); celt_encoder_ctl(celt_enc, OPUS_SET_COMPLEXITY(st->silk_mode.complexity)); st->use_vbr = 1; /* Makes constrained VBR the default (safer for real-time use) */ st->vbr_constraint = 1; st->user_bitrate_bps = OPUS_AUTO; st->bitrate_bps = 3000+Fs*channels; st->application = application; st->signal_type = OPUS_AUTO; st->user_bandwidth = OPUS_AUTO; st->max_bandwidth = OPUS_BANDWIDTH_FULLBAND; st->force_channels = OPUS_AUTO; st->user_forced_mode = OPUS_AUTO; st->voice_ratio = -1; st->encoder_buffer = st->Fs/100; st->lsb_depth = 24; st->variable_duration = OPUS_FRAMESIZE_ARG; /* Delay compensation of 4 ms (2.5 ms for SILK's extra look-ahead + 1.5 ms for SILK resamplers and stereo prediction) */ st->delay_compensation = st->Fs/250; st->hybrid_stereo_width_Q14 = 1 << 14; st->prev_HB_gain = Q15ONE; st->variable_HP_smth2_Q15 = silk_LSHIFT( silk_lin2log( VARIABLE_HP_MIN_CUTOFF_HZ ), 8 ); st->first = 1; st->mode = MODE_HYBRID; st->bandwidth = OPUS_BANDWIDTH_FULLBAND; #ifndef DISABLE_FLOAT_API tonality_analysis_init(&st->analysis, st->Fs); st->analysis.application = st->application; #endif return OPUS_OK; } static unsigned char gen_toc(int mode, int framerate, int bandwidth, int channels) { int period; unsigned char toc; period = 0; while (framerate < 400) { framerate <<= 1; period++; } if (mode == MODE_SILK_ONLY) { toc = (bandwidth-OPUS_BANDWIDTH_NARROWBAND)<<5; toc |= (period-2)<<3; } else if (mode == MODE_CELT_ONLY) { int tmp = bandwidth-OPUS_BANDWIDTH_MEDIUMBAND; if (tmp < 0) tmp = 0; toc = 0x80; toc |= tmp << 5; toc |= period<<3; } else /* Hybrid */ { toc = 0x60; toc |= (bandwidth-OPUS_BANDWIDTH_SUPERWIDEBAND)<<4; toc |= (period-2)<<3; } toc |= (channels==2)<<2; return toc; } #ifndef FIXED_POINT static void silk_biquad_float( const opus_val16 *in, /* I: Input signal */ const opus_int32 *B_Q28, /* I: MA coefficients [3] */ const opus_int32 *A_Q28, /* I: AR coefficients [2] */ opus_val32 *S, /* I/O: State vector [2] */ opus_val16 *out, /* O: Output signal */ const opus_int32 len, /* I: Signal length (must be even) */ int stride ) { /* DIRECT FORM II TRANSPOSED (uses 2 element state vector) */ opus_int k; opus_val32 vout; opus_val32 inval; opus_val32 A[2], B[3]; A[0] = (opus_val32)(A_Q28[0] * (1.f/((opus_int32)1<<28))); A[1] = (opus_val32)(A_Q28[1] * (1.f/((opus_int32)1<<28))); B[0] = (opus_val32)(B_Q28[0] * (1.f/((opus_int32)1<<28))); B[1] = (opus_val32)(B_Q28[1] * (1.f/((opus_int32)1<<28))); B[2] = (opus_val32)(B_Q28[2] * (1.f/((opus_int32)1<<28))); /* Negate A_Q28 values and split in two parts */ for( k = 0; k < len; k++ ) { /* S[ 0 ], S[ 1 ]: Q12 */ inval = in[ k*stride ]; vout = S[ 0 ] + B[0]*inval; S[ 0 ] = S[1] - vout*A[0] + B[1]*inval; S[ 1 ] = - vout*A[1] + B[2]*inval + VERY_SMALL; /* Scale back to Q0 and saturate */ out[ k*stride ] = vout; } } #endif static void hp_cutoff(const opus_val16 *in, opus_int32 cutoff_Hz, opus_val16 *out, opus_val32 *hp_mem, int len, int channels, opus_int32 Fs, int arch) { opus_int32 B_Q28[ 3 ], A_Q28[ 2 ]; opus_int32 Fc_Q19, r_Q28, r_Q22; (void)arch; silk_assert( cutoff_Hz <= silk_int32_MAX / SILK_FIX_CONST( 1.5 * 3.14159 / 1000, 19 ) ); Fc_Q19 = silk_DIV32_16( silk_SMULBB( SILK_FIX_CONST( 1.5 * 3.14159 / 1000, 19 ), cutoff_Hz ), Fs/1000 ); silk_assert( Fc_Q19 > 0 && Fc_Q19 < 32768 ); r_Q28 = SILK_FIX_CONST( 1.0, 28 ) - silk_MUL( SILK_FIX_CONST( 0.92, 9 ), Fc_Q19 ); /* b = r * [ 1; -2; 1 ]; */ /* a = [ 1; -2 * r * ( 1 - 0.5 * Fc^2 ); r^2 ]; */ B_Q28[ 0 ] = r_Q28; B_Q28[ 1 ] = silk_LSHIFT( -r_Q28, 1 ); B_Q28[ 2 ] = r_Q28; /* -r * ( 2 - Fc * Fc ); */ r_Q22 = silk_RSHIFT( r_Q28, 6 ); A_Q28[ 0 ] = silk_SMULWW( r_Q22, silk_SMULWW( Fc_Q19, Fc_Q19 ) - SILK_FIX_CONST( 2.0, 22 ) ); A_Q28[ 1 ] = silk_SMULWW( r_Q22, r_Q22 ); #ifdef FIXED_POINT if( channels == 1 ) { silk_biquad_alt_stride1( in, B_Q28, A_Q28, hp_mem, out, len ); } else { silk_biquad_alt_stride2( in, B_Q28, A_Q28, hp_mem, out, len, arch ); } #else silk_biquad_float( in, B_Q28, A_Q28, hp_mem, out, len, channels ); if( channels == 2 ) { silk_biquad_float( in+1, B_Q28, A_Q28, hp_mem+2, out+1, len, channels ); } #endif } #ifdef FIXED_POINT static void dc_reject(const opus_val16 *in, opus_int32 cutoff_Hz, opus_val16 *out, opus_val32 *hp_mem, int len, int channels, opus_int32 Fs) { int c, i; int shift; /* Approximates -round(log2(4.*cutoff_Hz/Fs)) */ shift=celt_ilog2(Fs/(cutoff_Hz*3)); for (c=0;cFs/400; if (st->user_bitrate_bps==OPUS_AUTO) return 60*st->Fs/frame_size + st->Fs*st->channels; else if (st->user_bitrate_bps==OPUS_BITRATE_MAX) return max_data_bytes*8*st->Fs/frame_size; else return st->user_bitrate_bps; } #ifndef DISABLE_FLOAT_API #ifdef FIXED_POINT #define PCM2VAL(x) FLOAT2INT16(x) #else #define PCM2VAL(x) SCALEIN(x) #endif void downmix_float(const void *_x, opus_val32 *y, int subframe, int offset, int c1, int c2, int C) { const float *x; int j; x = (const float *)_x; for (j=0;j-1) { for (j=0;j-1) { for (j=0;j= OPUS_FRAMESIZE_2_5_MS && variable_duration <= OPUS_FRAMESIZE_120_MS) { if (variable_duration <= OPUS_FRAMESIZE_40_MS) new_size = (Fs/400)<<(variable_duration-OPUS_FRAMESIZE_2_5_MS); else new_size = (variable_duration-OPUS_FRAMESIZE_2_5_MS-2)*Fs/50; } else return -1; if (new_size>frame_size) return -1; if (400*new_size!=Fs && 200*new_size!=Fs && 100*new_size!=Fs && 50*new_size!=Fs && 25*new_size!=Fs && 50*new_size!=3*Fs && 50*new_size!=4*Fs && 50*new_size!=5*Fs && 50*new_size!=6*Fs) return -1; return new_size; } opus_val16 compute_stereo_width(const opus_val16 *pcm, int frame_size, opus_int32 Fs, StereoWidthState *mem) { opus_val32 xx, xy, yy; opus_val16 sqrt_xx, sqrt_yy; opus_val16 qrrt_xx, qrrt_yy; int frame_rate; int i; opus_val16 short_alpha; frame_rate = Fs/frame_size; short_alpha = Q15ONE - MULT16_16(25, Q15ONE)/IMAX(50,frame_rate); xx=xy=yy=0; /* Unroll by 4. The frame size is always a multiple of 4 *except* for 2.5 ms frames at 12 kHz. Since this setting is very rare (and very stupid), we just discard the last two samples. */ for (i=0;iXX += MULT16_32_Q15(short_alpha, xx-mem->XX); mem->XY += MULT16_32_Q15(short_alpha, xy-mem->XY); mem->YY += MULT16_32_Q15(short_alpha, yy-mem->YY); mem->XX = MAX32(0, mem->XX); mem->XY = MAX32(0, mem->XY); mem->YY = MAX32(0, mem->YY); if (MAX32(mem->XX, mem->YY)>QCONST16(8e-4f, 18)) { opus_val16 corr; opus_val16 ldiff; opus_val16 width; sqrt_xx = celt_sqrt(mem->XX); sqrt_yy = celt_sqrt(mem->YY); qrrt_xx = celt_sqrt(sqrt_xx); qrrt_yy = celt_sqrt(sqrt_yy); /* Inter-channel correlation */ mem->XY = MIN32(mem->XY, sqrt_xx*sqrt_yy); corr = SHR32(frac_div32(mem->XY,EPSILON+MULT16_16(sqrt_xx,sqrt_yy)),16); /* Approximate loudness difference */ ldiff = MULT16_16(Q15ONE, ABS16(qrrt_xx-qrrt_yy))/(EPSILON+qrrt_xx+qrrt_yy); width = MULT16_16_Q15(celt_sqrt(QCONST32(1.f,30)-MULT16_16(corr,corr)), ldiff); /* Smoothing over one second */ mem->smoothed_width += (width-mem->smoothed_width)/frame_rate; /* Peak follower */ mem->max_follower = MAX16(mem->max_follower-QCONST16(.02f,15)/frame_rate, mem->smoothed_width); } /*printf("%f %f %f %f %f ", corr/(float)Q15ONE, ldiff/(float)Q15ONE, width/(float)Q15ONE, mem->smoothed_width/(float)Q15ONE, mem->max_follower/(float)Q15ONE);*/ return EXTRACT16(MIN32(Q15ONE, MULT16_16(20, mem->max_follower))); } static int decide_fec(int useInBandFEC, int PacketLoss_perc, int last_fec, int mode, int *bandwidth, opus_int32 rate) { int orig_bandwidth; if (!useInBandFEC || PacketLoss_perc == 0 || mode == MODE_CELT_ONLY) return 0; orig_bandwidth = *bandwidth; for (;;) { opus_int32 hysteresis; opus_int32 LBRR_rate_thres_bps; /* Compute threshold for using FEC at the current bandwidth setting */ LBRR_rate_thres_bps = fec_thresholds[2*(*bandwidth - OPUS_BANDWIDTH_NARROWBAND)]; hysteresis = fec_thresholds[2*(*bandwidth - OPUS_BANDWIDTH_NARROWBAND) + 1]; if (last_fec == 1) LBRR_rate_thres_bps -= hysteresis; if (last_fec == 0) LBRR_rate_thres_bps += hysteresis; LBRR_rate_thres_bps = silk_SMULWB( silk_MUL( LBRR_rate_thres_bps, 125 - silk_min( PacketLoss_perc, 25 ) ), SILK_FIX_CONST( 0.01, 16 ) ); /* If loss <= 5%, we look at whether we have enough rate to enable FEC. If loss > 5%, we decrease the bandwidth until we can enable FEC. */ if (rate > LBRR_rate_thres_bps) return 1; else if (PacketLoss_perc <= 5) return 0; else if (*bandwidth > OPUS_BANDWIDTH_NARROWBAND) (*bandwidth)--; else break; } /* Couldn't find any bandwidth to enable FEC, keep original bandwidth. */ *bandwidth = orig_bandwidth; return 0; } static int compute_silk_rate_for_hybrid(int rate, int bandwidth, int frame20ms, int vbr, int fec) { int entry; int i; int N; int silk_rate; static int rate_table[][5] = { /* |total| |-------- SILK------------| |-- No FEC -| |--- FEC ---| 10ms 20ms 10ms 20ms */ { 0, 0, 0, 0, 0}, {12000, 10000, 10000, 11000, 11000}, {16000, 13500, 13500, 15000, 15000}, {20000, 16000, 16000, 18000, 18000}, {24000, 18000, 18000, 21000, 21000}, {32000, 22000, 22000, 28000, 28000}, {64000, 38000, 38000, 50000, 50000} }; entry = 1 + frame20ms + 2*fec; N = sizeof(rate_table)/sizeof(rate_table[0]); for (i=1;i rate) break; } if (i == N) { silk_rate = rate_table[i-1][entry]; /* For now, just give 50% of the extra bits to SILK. */ silk_rate += (rate-rate_table[i-1][0])/2; } else { opus_int32 lo, hi, x0, x1; lo = rate_table[i-1][entry]; hi = rate_table[i][entry]; x0 = rate_table[i-1][0]; x1 = rate_table[i][0]; silk_rate = (lo*(x1-rate) + hi*(rate-x0))/(x1-x0); } if (!vbr) { /* Tiny boost to SILK for CBR. We should probably tune this better. */ silk_rate += 100; } if (bandwidth==OPUS_BANDWIDTH_SUPERWIDEBAND) silk_rate += 300; return silk_rate; } /* Returns the equivalent bitrate corresponding to 20 ms frames, complexity 10 VBR operation. */ static opus_int32 compute_equiv_rate(opus_int32 bitrate, int channels, int frame_rate, int vbr, int mode, int complexity, int loss) { opus_int32 equiv; equiv = bitrate; /* Take into account overhead from smaller frames. */ equiv -= (40*channels+20)*(frame_rate - 50); /* CBR is about a 8% penalty for both SILK and CELT. */ if (!vbr) equiv -= equiv/12; /* Complexity makes about 10% difference (from 0 to 10) in general. */ equiv = equiv * (90+complexity)/100; if (mode == MODE_SILK_ONLY || mode == MODE_HYBRID) { /* SILK complexity 0-1 uses the non-delayed-decision NSQ, which costs about 20%. */ if (complexity<2) equiv = equiv*4/5; equiv -= equiv*loss/(6*loss + 10); } else if (mode == MODE_CELT_ONLY) { /* CELT complexity 0-4 doesn't have the pitch filter, which costs about 10%. */ if (complexity<5) equiv = equiv*9/10; } else { /* Mode not known yet */ /* Half the SILK loss*/ equiv -= equiv*loss/(12*loss + 20); } return equiv; } #ifndef DISABLE_FLOAT_API static int is_digital_silence(const opus_val16* pcm, int frame_size, int channels, int lsb_depth) { int silence = 0; opus_val32 sample_max = 0; #ifdef MLP_TRAINING return 0; #endif sample_max = celt_maxabs16(pcm, frame_size*channels); #ifdef FIXED_POINT silence = (sample_max == 0); (void)lsb_depth; #else silence = (sample_max <= (opus_val16) 1 / (1 << lsb_depth)); #endif return silence; } #ifdef FIXED_POINT static opus_val32 compute_frame_energy(const opus_val16 *pcm, int frame_size, int channels, int arch) { int i; opus_val32 sample_max; int max_shift; int shift; opus_val32 energy = 0; int len = frame_size*channels; (void)arch; /* Max amplitude in the signal */ sample_max = celt_maxabs16(pcm, len); /* Compute the right shift required in the MAC to avoid an overflow */ max_shift = celt_ilog2(len); shift = IMAX(0, (celt_ilog2(sample_max) << 1) + max_shift - 28); /* Compute the energy */ for (i=0; i= (PSEUDO_SNR_THRESHOLD * noise_energy); } } if (is_silence || (is_noise && is_sufficiently_quiet)) { /* The number of consecutive DTX frames should be within the allowed bounds */ (*nb_no_activity_frames)++; if (*nb_no_activity_frames > NB_SPEECH_FRAMES_BEFORE_DTX) { if (*nb_no_activity_frames <= (NB_SPEECH_FRAMES_BEFORE_DTX + MAX_CONSECUTIVE_DTX)) /* Valid frame for DTX! */ return 1; else (*nb_no_activity_frames) = NB_SPEECH_FRAMES_BEFORE_DTX; } } else (*nb_no_activity_frames) = 0; return 0; } #endif static opus_int32 encode_multiframe_packet(OpusEncoder *st, const opus_val16 *pcm, int nb_frames, int frame_size, unsigned char *data, opus_int32 out_data_bytes, int to_celt, int lsb_depth, int float_api) { int i; int ret = 0; VARDECL(unsigned char, tmp_data); int bak_mode, bak_bandwidth, bak_channels, bak_to_mono; VARDECL(OpusRepacketizer, rp); int max_header_bytes; opus_int32 bytes_per_frame; opus_int32 cbr_bytes; opus_int32 repacketize_len; int tmp_len; ALLOC_STACK; /* Worst cases: * 2 frames: Code 2 with different compressed sizes * >2 frames: Code 3 VBR */ max_header_bytes = nb_frames == 2 ? 3 : (2+(nb_frames-1)*2); if (st->use_vbr || st->user_bitrate_bps==OPUS_BITRATE_MAX) repacketize_len = out_data_bytes; else { cbr_bytes = 3*st->bitrate_bps/(3*8*st->Fs/(frame_size*nb_frames)); repacketize_len = IMIN(cbr_bytes, out_data_bytes); } bytes_per_frame = IMIN(1276, 1+(repacketize_len-max_header_bytes)/nb_frames); ALLOC(tmp_data, nb_frames*bytes_per_frame, unsigned char); ALLOC(rp, 1, OpusRepacketizer); opus_repacketizer_init(rp); bak_mode = st->user_forced_mode; bak_bandwidth = st->user_bandwidth; bak_channels = st->force_channels; st->user_forced_mode = st->mode; st->user_bandwidth = st->bandwidth; st->force_channels = st->stream_channels; bak_to_mono = st->silk_mode.toMono; if (bak_to_mono) st->force_channels = 1; else st->prev_channels = st->stream_channels; for (i=0;isilk_mode.toMono = 0; st->nonfinal_frame = i<(nb_frames-1); /* When switching from SILK/Hybrid to CELT, only ask for a switch at the last frame */ if (to_celt && i==nb_frames-1) st->user_forced_mode = MODE_CELT_ONLY; tmp_len = opus_encode_native(st, pcm+i*(st->channels*frame_size), frame_size, tmp_data+i*bytes_per_frame, bytes_per_frame, lsb_depth, NULL, 0, 0, 0, 0, NULL, float_api); if (tmp_len<0) { RESTORE_STACK; return OPUS_INTERNAL_ERROR; } ret = opus_repacketizer_cat(rp, tmp_data+i*bytes_per_frame, tmp_len); if (ret<0) { RESTORE_STACK; return OPUS_INTERNAL_ERROR; } } ret = opus_repacketizer_out_range_impl(rp, 0, nb_frames, data, repacketize_len, 0, !st->use_vbr); if (ret<0) { RESTORE_STACK; return OPUS_INTERNAL_ERROR; } /* Discard configs that were forced locally for the purpose of repacketization */ st->user_forced_mode = bak_mode; st->user_bandwidth = bak_bandwidth; st->force_channels = bak_channels; st->silk_mode.toMono = bak_to_mono; RESTORE_STACK; return ret; } static int compute_redundancy_bytes(opus_int32 max_data_bytes, opus_int32 bitrate_bps, int frame_rate, int channels) { int redundancy_bytes_cap; int redundancy_bytes; opus_int32 redundancy_rate; int base_bits; opus_int32 available_bits; base_bits = (40*channels+20); /* Equivalent rate for 5 ms frames. */ redundancy_rate = bitrate_bps + base_bits*(200 - frame_rate); /* For VBR, further increase the bitrate if we can afford it. It's pretty short and we'll avoid artefacts. */ redundancy_rate = 3*redundancy_rate/2; redundancy_bytes = redundancy_rate/1600; /* Compute the max rate we can use given CBR or VBR with cap. */ available_bits = max_data_bytes*8 - 2*base_bits; redundancy_bytes_cap = (available_bits*240/(240+48000/frame_rate) + base_bits)/8; redundancy_bytes = IMIN(redundancy_bytes, redundancy_bytes_cap); /* It we can't get enough bits for redundancy to be worth it, rely on the decoder PLC. */ if (redundancy_bytes > 4 + 8*channels) redundancy_bytes = IMIN(257, redundancy_bytes); else redundancy_bytes = 0; return redundancy_bytes; } opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_size, unsigned char *data, opus_int32 out_data_bytes, int lsb_depth, const void *analysis_pcm, opus_int32 analysis_size, int c1, int c2, int analysis_channels, downmix_func downmix, int float_api) { void *silk_enc; CELTEncoder *celt_enc; int i; int ret=0; opus_int32 nBytes; ec_enc enc; int bytes_target; int prefill=0; int start_band = 0; int redundancy = 0; int redundancy_bytes = 0; /* Number of bytes to use for redundancy frame */ int celt_to_silk = 0; VARDECL(opus_val16, pcm_buf); int nb_compr_bytes; int to_celt = 0; opus_uint32 redundant_rng = 0; int cutoff_Hz, hp_freq_smth1; int voice_est; /* Probability of voice in Q7 */ opus_int32 equiv_rate; int delay_compensation; int frame_rate; opus_int32 max_rate; /* Max bitrate we're allowed to use */ int curr_bandwidth; opus_val16 HB_gain; opus_int32 max_data_bytes; /* Max number of bytes we're allowed to use */ int total_buffer; opus_val16 stereo_width; const CELTMode *celt_mode; #ifndef DISABLE_FLOAT_API AnalysisInfo analysis_info; int analysis_read_pos_bak=-1; int analysis_read_subframe_bak=-1; int is_silence = 0; #endif VARDECL(opus_val16, tmp_prefill); ALLOC_STACK; max_data_bytes = IMIN(1276, out_data_bytes); st->rangeFinal = 0; if (frame_size <= 0 || max_data_bytes <= 0) { RESTORE_STACK; return OPUS_BAD_ARG; } /* Cannot encode 100 ms in 1 byte */ if (max_data_bytes==1 && st->Fs==(frame_size*10)) { RESTORE_STACK; return OPUS_BUFFER_TOO_SMALL; } silk_enc = (char*)st+st->silk_enc_offset; celt_enc = (CELTEncoder*)((char*)st+st->celt_enc_offset); if (st->application == OPUS_APPLICATION_RESTRICTED_LOWDELAY) delay_compensation = 0; else delay_compensation = st->delay_compensation; lsb_depth = IMIN(lsb_depth, st->lsb_depth); celt_encoder_ctl(celt_enc, CELT_GET_MODE(&celt_mode)); #ifndef DISABLE_FLOAT_API analysis_info.valid = 0; #ifdef FIXED_POINT if (st->silk_mode.complexity >= 10 && st->Fs>=16000) #else if (st->silk_mode.complexity >= 7 && st->Fs>=16000) #endif { if (is_digital_silence(pcm, frame_size, st->channels, lsb_depth)) { is_silence = 1; } else { analysis_read_pos_bak = st->analysis.read_pos; analysis_read_subframe_bak = st->analysis.read_subframe; run_analysis(&st->analysis, celt_mode, analysis_pcm, analysis_size, frame_size, c1, c2, analysis_channels, st->Fs, lsb_depth, downmix, &analysis_info); } /* Track the peak signal energy */ if (!is_silence && analysis_info.activity_probability > DTX_ACTIVITY_THRESHOLD) st->peak_signal_energy = MAX32(MULT16_32_Q15(QCONST16(0.999f, 15), st->peak_signal_energy), compute_frame_energy(pcm, frame_size, st->channels, st->arch)); } #else (void)analysis_pcm; (void)analysis_size; (void)c1; (void)c2; (void)analysis_channels; (void)downmix; #endif #ifndef DISABLE_FLOAT_API /* Reset voice_ratio if this frame is not silent or if analysis is disabled. * Otherwise, preserve voice_ratio from the last non-silent frame */ if (!is_silence) st->voice_ratio = -1; st->detected_bandwidth = 0; if (analysis_info.valid) { int analysis_bandwidth; if (st->signal_type == OPUS_AUTO) st->voice_ratio = (int)floor(.5+100*(1-analysis_info.music_prob)); analysis_bandwidth = analysis_info.bandwidth; if (analysis_bandwidth<=12) st->detected_bandwidth = OPUS_BANDWIDTH_NARROWBAND; else if (analysis_bandwidth<=14) st->detected_bandwidth = OPUS_BANDWIDTH_MEDIUMBAND; else if (analysis_bandwidth<=16) st->detected_bandwidth = OPUS_BANDWIDTH_WIDEBAND; else if (analysis_bandwidth<=18) st->detected_bandwidth = OPUS_BANDWIDTH_SUPERWIDEBAND; else st->detected_bandwidth = OPUS_BANDWIDTH_FULLBAND; } #else st->voice_ratio = -1; #endif if (st->channels==2 && st->force_channels!=1) stereo_width = compute_stereo_width(pcm, frame_size, st->Fs, &st->width_mem); else stereo_width = 0; total_buffer = delay_compensation; st->bitrate_bps = user_bitrate_to_bitrate(st, frame_size, max_data_bytes); frame_rate = st->Fs/frame_size; if (!st->use_vbr) { int cbrBytes; /* Multiply by 12 to make sure the division is exact. */ int frame_rate12 = 12*st->Fs/frame_size; /* We need to make sure that "int" values always fit in 16 bits. */ cbrBytes = IMIN( (12*st->bitrate_bps/8 + frame_rate12/2)/frame_rate12, max_data_bytes); st->bitrate_bps = cbrBytes*(opus_int32)frame_rate12*8/12; /* Make sure we provide at least one byte to avoid failing. */ max_data_bytes = IMAX(1, cbrBytes); } if (max_data_bytes<3 || st->bitrate_bps < 3*frame_rate*8 || (frame_rate<50 && (max_data_bytes*frame_rate<300 || st->bitrate_bps < 2400))) { /*If the space is too low to do something useful, emit 'PLC' frames.*/ int tocmode = st->mode; int bw = st->bandwidth == 0 ? OPUS_BANDWIDTH_NARROWBAND : st->bandwidth; int packet_code = 0; int num_multiframes = 0; if (tocmode==0) tocmode = MODE_SILK_ONLY; if (frame_rate>100) tocmode = MODE_CELT_ONLY; /* 40 ms -> 2 x 20 ms if in CELT_ONLY or HYBRID mode */ if (frame_rate==25 && tocmode!=MODE_SILK_ONLY) { frame_rate = 50; packet_code = 1; } /* >= 60 ms frames */ if (frame_rate<=16) { /* 1 x 60 ms, 2 x 40 ms, 2 x 60 ms */ if (out_data_bytes==1 || (tocmode==MODE_SILK_ONLY && frame_rate!=10)) { tocmode = MODE_SILK_ONLY; packet_code = frame_rate <= 12; frame_rate = frame_rate == 12 ? 25 : 16; } else { num_multiframes = 50/frame_rate; frame_rate = 50; packet_code = 3; } } if(tocmode==MODE_SILK_ONLY&&bw>OPUS_BANDWIDTH_WIDEBAND) bw=OPUS_BANDWIDTH_WIDEBAND; else if (tocmode==MODE_CELT_ONLY&&bw==OPUS_BANDWIDTH_MEDIUMBAND) bw=OPUS_BANDWIDTH_NARROWBAND; else if (tocmode==MODE_HYBRID&&bw<=OPUS_BANDWIDTH_SUPERWIDEBAND) bw=OPUS_BANDWIDTH_SUPERWIDEBAND; data[0] = gen_toc(tocmode, frame_rate, bw, st->stream_channels); data[0] |= packet_code; ret = packet_code <= 1 ? 1 : 2; max_data_bytes = IMAX(max_data_bytes, ret); if (packet_code==3) data[1] = num_multiframes; if (!st->use_vbr) { ret = opus_packet_pad(data, ret, max_data_bytes); if (ret == OPUS_OK) ret = max_data_bytes; else ret = OPUS_INTERNAL_ERROR; } RESTORE_STACK; return ret; } max_rate = frame_rate*max_data_bytes*8; /* Equivalent 20-ms rate for mode/channel/bandwidth decisions */ equiv_rate = compute_equiv_rate(st->bitrate_bps, st->channels, st->Fs/frame_size, st->use_vbr, 0, st->silk_mode.complexity, st->silk_mode.packetLossPercentage); if (st->signal_type == OPUS_SIGNAL_VOICE) voice_est = 127; else if (st->signal_type == OPUS_SIGNAL_MUSIC) voice_est = 0; else if (st->voice_ratio >= 0) { voice_est = st->voice_ratio*327>>8; /* For AUDIO, never be more than 90% confident of having speech */ if (st->application == OPUS_APPLICATION_AUDIO) voice_est = IMIN(voice_est, 115); } else if (st->application == OPUS_APPLICATION_VOIP) voice_est = 115; else voice_est = 48; if (st->force_channels!=OPUS_AUTO && st->channels == 2) { st->stream_channels = st->force_channels; } else { #ifdef FUZZING /* Random mono/stereo decision */ if (st->channels == 2 && (rand()&0x1F)==0) st->stream_channels = 3-st->stream_channels; #else /* Rate-dependent mono-stereo decision */ if (st->channels == 2) { opus_int32 stereo_threshold; stereo_threshold = stereo_music_threshold + ((voice_est*voice_est*(stereo_voice_threshold-stereo_music_threshold))>>14); if (st->stream_channels == 2) stereo_threshold -= 1000; else stereo_threshold += 1000; st->stream_channels = (equiv_rate > stereo_threshold) ? 2 : 1; } else { st->stream_channels = st->channels; } #endif } /* Update equivalent rate for channels decision. */ equiv_rate = compute_equiv_rate(st->bitrate_bps, st->stream_channels, st->Fs/frame_size, st->use_vbr, 0, st->silk_mode.complexity, st->silk_mode.packetLossPercentage); /* Mode selection depending on application and signal type */ if (st->application == OPUS_APPLICATION_RESTRICTED_LOWDELAY) { st->mode = MODE_CELT_ONLY; } else if (st->user_forced_mode == OPUS_AUTO) { #ifdef FUZZING /* Random mode switching */ if ((rand()&0xF)==0) { if ((rand()&0x1)==0) st->mode = MODE_CELT_ONLY; else st->mode = MODE_SILK_ONLY; } else { if (st->prev_mode==MODE_CELT_ONLY) st->mode = MODE_CELT_ONLY; else st->mode = MODE_SILK_ONLY; } #else opus_int32 mode_voice, mode_music; opus_int32 threshold; /* Interpolate based on stereo width */ mode_voice = (opus_int32)(MULT16_32_Q15(Q15ONE-stereo_width,mode_thresholds[0][0]) + MULT16_32_Q15(stereo_width,mode_thresholds[1][0])); mode_music = (opus_int32)(MULT16_32_Q15(Q15ONE-stereo_width,mode_thresholds[1][1]) + MULT16_32_Q15(stereo_width,mode_thresholds[1][1])); /* Interpolate based on speech/music probability */ threshold = mode_music + ((voice_est*voice_est*(mode_voice-mode_music))>>14); /* Bias towards SILK for VoIP because of some useful features */ if (st->application == OPUS_APPLICATION_VOIP) threshold += 8000; /*printf("%f %d\n", stereo_width/(float)Q15ONE, threshold);*/ /* Hysteresis */ if (st->prev_mode == MODE_CELT_ONLY) threshold -= 4000; else if (st->prev_mode>0) threshold += 4000; st->mode = (equiv_rate >= threshold) ? MODE_CELT_ONLY: MODE_SILK_ONLY; /* When FEC is enabled and there's enough packet loss, use SILK */ if (st->silk_mode.useInBandFEC && st->silk_mode.packetLossPercentage > (128-voice_est)>>4) st->mode = MODE_SILK_ONLY; /* When encoding voice and DTX is enabled but the generalized DTX cannot be used, because of complexity and sampling frequency settings, switch to SILK DTX and set the encoder to SILK mode */ #ifndef DISABLE_FLOAT_API st->silk_mode.useDTX = st->use_dtx && !(analysis_info.valid || is_silence); #else st->silk_mode.useDTX = st->use_dtx; #endif if (st->silk_mode.useDTX && voice_est > 100) st->mode = MODE_SILK_ONLY; #endif /* If max_data_bytes represents less than 6 kb/s, switch to CELT-only mode */ if (max_data_bytes < (frame_rate > 50 ? 9000 : 6000)*frame_size / (st->Fs * 8)) st->mode = MODE_CELT_ONLY; } else { st->mode = st->user_forced_mode; } /* Override the chosen mode to make sure we meet the requested frame size */ if (st->mode != MODE_CELT_ONLY && frame_size < st->Fs/100) st->mode = MODE_CELT_ONLY; if (st->lfe) st->mode = MODE_CELT_ONLY; if (st->prev_mode > 0 && ((st->mode != MODE_CELT_ONLY && st->prev_mode == MODE_CELT_ONLY) || (st->mode == MODE_CELT_ONLY && st->prev_mode != MODE_CELT_ONLY))) { redundancy = 1; celt_to_silk = (st->mode != MODE_CELT_ONLY); if (!celt_to_silk) { /* Switch to SILK/hybrid if frame size is 10 ms or more*/ if (frame_size >= st->Fs/100) { st->mode = st->prev_mode; to_celt = 1; } else { redundancy=0; } } } /* When encoding multiframes, we can ask for a switch to CELT only in the last frame. This switch * is processed above as the requested mode shouldn't interrupt stereo->mono transition. */ if (st->stream_channels == 1 && st->prev_channels ==2 && st->silk_mode.toMono==0 && st->mode != MODE_CELT_ONLY && st->prev_mode != MODE_CELT_ONLY) { /* Delay stereo->mono transition by two frames so that SILK can do a smooth downmix */ st->silk_mode.toMono = 1; st->stream_channels = 2; } else { st->silk_mode.toMono = 0; } /* Update equivalent rate with mode decision. */ equiv_rate = compute_equiv_rate(st->bitrate_bps, st->stream_channels, st->Fs/frame_size, st->use_vbr, st->mode, st->silk_mode.complexity, st->silk_mode.packetLossPercentage); if (st->mode != MODE_CELT_ONLY && st->prev_mode == MODE_CELT_ONLY) { silk_EncControlStruct dummy; silk_InitEncoder( silk_enc, st->arch, &dummy); prefill=1; } /* Automatic (rate-dependent) bandwidth selection */ if (st->mode == MODE_CELT_ONLY || st->first || st->silk_mode.allowBandwidthSwitch) { const opus_int32 *voice_bandwidth_thresholds, *music_bandwidth_thresholds; opus_int32 bandwidth_thresholds[8]; int bandwidth = OPUS_BANDWIDTH_FULLBAND; if (st->channels==2 && st->force_channels!=1) { voice_bandwidth_thresholds = stereo_voice_bandwidth_thresholds; music_bandwidth_thresholds = stereo_music_bandwidth_thresholds; } else { voice_bandwidth_thresholds = mono_voice_bandwidth_thresholds; music_bandwidth_thresholds = mono_music_bandwidth_thresholds; } /* Interpolate bandwidth thresholds depending on voice estimation */ for (i=0;i<8;i++) { bandwidth_thresholds[i] = music_bandwidth_thresholds[i] + ((voice_est*voice_est*(voice_bandwidth_thresholds[i]-music_bandwidth_thresholds[i]))>>14); } do { int threshold, hysteresis; threshold = bandwidth_thresholds[2*(bandwidth-OPUS_BANDWIDTH_MEDIUMBAND)]; hysteresis = bandwidth_thresholds[2*(bandwidth-OPUS_BANDWIDTH_MEDIUMBAND)+1]; if (!st->first) { if (st->auto_bandwidth >= bandwidth) threshold -= hysteresis; else threshold += hysteresis; } if (equiv_rate >= threshold) break; } while (--bandwidth>OPUS_BANDWIDTH_NARROWBAND); st->bandwidth = st->auto_bandwidth = bandwidth; /* Prevents any transition to SWB/FB until the SILK layer has fully switched to WB mode and turned the variable LP filter off */ if (!st->first && st->mode != MODE_CELT_ONLY && !st->silk_mode.inWBmodeWithoutVariableLP && st->bandwidth > OPUS_BANDWIDTH_WIDEBAND) st->bandwidth = OPUS_BANDWIDTH_WIDEBAND; } if (st->bandwidth>st->max_bandwidth) st->bandwidth = st->max_bandwidth; if (st->user_bandwidth != OPUS_AUTO) st->bandwidth = st->user_bandwidth; /* This prevents us from using hybrid at unsafe CBR/max rates */ if (st->mode != MODE_CELT_ONLY && max_rate < 15000) { st->bandwidth = IMIN(st->bandwidth, OPUS_BANDWIDTH_WIDEBAND); } /* Prevents Opus from wasting bits on frequencies that are above the Nyquist rate of the input signal */ if (st->Fs <= 24000 && st->bandwidth > OPUS_BANDWIDTH_SUPERWIDEBAND) st->bandwidth = OPUS_BANDWIDTH_SUPERWIDEBAND; if (st->Fs <= 16000 && st->bandwidth > OPUS_BANDWIDTH_WIDEBAND) st->bandwidth = OPUS_BANDWIDTH_WIDEBAND; if (st->Fs <= 12000 && st->bandwidth > OPUS_BANDWIDTH_MEDIUMBAND) st->bandwidth = OPUS_BANDWIDTH_MEDIUMBAND; if (st->Fs <= 8000 && st->bandwidth > OPUS_BANDWIDTH_NARROWBAND) st->bandwidth = OPUS_BANDWIDTH_NARROWBAND; #ifndef DISABLE_FLOAT_API /* Use detected bandwidth to reduce the encoded bandwidth. */ if (st->detected_bandwidth && st->user_bandwidth == OPUS_AUTO) { int min_detected_bandwidth; /* Makes bandwidth detection more conservative just in case the detector gets it wrong when we could have coded a high bandwidth transparently. When operating in SILK/hybrid mode, we don't go below wideband to avoid more complicated switches that require redundancy. */ if (equiv_rate <= 18000*st->stream_channels && st->mode == MODE_CELT_ONLY) min_detected_bandwidth = OPUS_BANDWIDTH_NARROWBAND; else if (equiv_rate <= 24000*st->stream_channels && st->mode == MODE_CELT_ONLY) min_detected_bandwidth = OPUS_BANDWIDTH_MEDIUMBAND; else if (equiv_rate <= 30000*st->stream_channels) min_detected_bandwidth = OPUS_BANDWIDTH_WIDEBAND; else if (equiv_rate <= 44000*st->stream_channels) min_detected_bandwidth = OPUS_BANDWIDTH_SUPERWIDEBAND; else min_detected_bandwidth = OPUS_BANDWIDTH_FULLBAND; st->detected_bandwidth = IMAX(st->detected_bandwidth, min_detected_bandwidth); st->bandwidth = IMIN(st->bandwidth, st->detected_bandwidth); } #endif st->silk_mode.LBRR_coded = decide_fec(st->silk_mode.useInBandFEC, st->silk_mode.packetLossPercentage, st->silk_mode.LBRR_coded, st->mode, &st->bandwidth, equiv_rate); celt_encoder_ctl(celt_enc, OPUS_SET_LSB_DEPTH(lsb_depth)); /* CELT mode doesn't support mediumband, use wideband instead */ if (st->mode == MODE_CELT_ONLY && st->bandwidth == OPUS_BANDWIDTH_MEDIUMBAND) st->bandwidth = OPUS_BANDWIDTH_WIDEBAND; if (st->lfe) st->bandwidth = OPUS_BANDWIDTH_NARROWBAND; curr_bandwidth = st->bandwidth; /* Chooses the appropriate mode for speech *NEVER* switch to/from CELT-only mode here as this will invalidate some assumptions */ if (st->mode == MODE_SILK_ONLY && curr_bandwidth > OPUS_BANDWIDTH_WIDEBAND) st->mode = MODE_HYBRID; if (st->mode == MODE_HYBRID && curr_bandwidth <= OPUS_BANDWIDTH_WIDEBAND) st->mode = MODE_SILK_ONLY; /* Can't support higher than >60 ms frames, and >20 ms when in Hybrid or CELT-only modes */ if ((frame_size > st->Fs/50 && (st->mode != MODE_SILK_ONLY)) || frame_size > 3*st->Fs/50) { int enc_frame_size; int nb_frames; if (st->mode == MODE_SILK_ONLY) { if (frame_size == 2*st->Fs/25) /* 80 ms -> 2x 40 ms */ enc_frame_size = st->Fs/25; else if (frame_size == 3*st->Fs/25) /* 120 ms -> 2x 60 ms */ enc_frame_size = 3*st->Fs/50; else /* 100 ms -> 5x 20 ms */ enc_frame_size = st->Fs/50; } else enc_frame_size = st->Fs/50; nb_frames = frame_size/enc_frame_size; #ifndef DISABLE_FLOAT_API if (analysis_read_pos_bak!= -1) { st->analysis.read_pos = analysis_read_pos_bak; st->analysis.read_subframe = analysis_read_subframe_bak; } #endif ret = encode_multiframe_packet(st, pcm, nb_frames, enc_frame_size, data, out_data_bytes, to_celt, lsb_depth, float_api); RESTORE_STACK; return ret; } /* For the first frame at a new SILK bandwidth */ if (st->silk_bw_switch) { redundancy = 1; celt_to_silk = 1; st->silk_bw_switch = 0; prefill=1; } /* If we decided to go with CELT, make sure redundancy is off, no matter what we decided earlier. */ if (st->mode == MODE_CELT_ONLY) redundancy = 0; if (redundancy) { redundancy_bytes = compute_redundancy_bytes(max_data_bytes, st->bitrate_bps, frame_rate, st->stream_channels); if (redundancy_bytes == 0) redundancy = 0; } /* printf("%d %d %d %d\n", st->bitrate_bps, st->stream_channels, st->mode, curr_bandwidth); */ bytes_target = IMIN(max_data_bytes-redundancy_bytes, st->bitrate_bps * frame_size / (st->Fs * 8)) - 1; data += 1; ec_enc_init(&enc, data, max_data_bytes-1); ALLOC(pcm_buf, (total_buffer+frame_size)*st->channels, opus_val16); OPUS_COPY(pcm_buf, &st->delay_buffer[(st->encoder_buffer-total_buffer)*st->channels], total_buffer*st->channels); if (st->mode == MODE_CELT_ONLY) hp_freq_smth1 = silk_LSHIFT( silk_lin2log( VARIABLE_HP_MIN_CUTOFF_HZ ), 8 ); else hp_freq_smth1 = ((silk_encoder*)silk_enc)->state_Fxx[0].sCmn.variable_HP_smth1_Q15; st->variable_HP_smth2_Q15 = silk_SMLAWB( st->variable_HP_smth2_Q15, hp_freq_smth1 - st->variable_HP_smth2_Q15, SILK_FIX_CONST( VARIABLE_HP_SMTH_COEF2, 16 ) ); /* convert from log scale to Hertz */ cutoff_Hz = silk_log2lin( silk_RSHIFT( st->variable_HP_smth2_Q15, 8 ) ); if (st->application == OPUS_APPLICATION_VOIP) { hp_cutoff(pcm, cutoff_Hz, &pcm_buf[total_buffer*st->channels], st->hp_mem, frame_size, st->channels, st->Fs, st->arch); } else { dc_reject(pcm, 3, &pcm_buf[total_buffer*st->channels], st->hp_mem, frame_size, st->channels, st->Fs); } #ifndef FIXED_POINT if (float_api) { opus_val32 sum; sum = celt_inner_prod(&pcm_buf[total_buffer*st->channels], &pcm_buf[total_buffer*st->channels], frame_size*st->channels, st->arch); /* This should filter out both NaNs and ridiculous signals that could cause NaNs further down. */ if (!(sum < 1e9f) || celt_isnan(sum)) { OPUS_CLEAR(&pcm_buf[total_buffer*st->channels], frame_size*st->channels); st->hp_mem[0] = st->hp_mem[1] = st->hp_mem[2] = st->hp_mem[3] = 0; } } #endif /* SILK processing */ HB_gain = Q15ONE; if (st->mode != MODE_CELT_ONLY) { opus_int32 total_bitRate, celt_rate; #ifdef FIXED_POINT const opus_int16 *pcm_silk; #else VARDECL(opus_int16, pcm_silk); ALLOC(pcm_silk, st->channels*frame_size, opus_int16); #endif /* Distribute bits between SILK and CELT */ total_bitRate = 8 * bytes_target * frame_rate; if( st->mode == MODE_HYBRID ) { /* Base rate for SILK */ st->silk_mode.bitRate = compute_silk_rate_for_hybrid(total_bitRate, curr_bandwidth, st->Fs == 50 * frame_size, st->use_vbr, st->silk_mode.LBRR_coded); if (!st->energy_masking) { /* Increasingly attenuate high band when it gets allocated fewer bits */ celt_rate = total_bitRate - st->silk_mode.bitRate; HB_gain = Q15ONE - SHR32(celt_exp2(-celt_rate * QCONST16(1.f/1024, 10)), 1); } } else { /* SILK gets all bits */ st->silk_mode.bitRate = total_bitRate; } /* Surround masking for SILK */ if (st->energy_masking && st->use_vbr && !st->lfe) { opus_val32 mask_sum=0; opus_val16 masking_depth; opus_int32 rate_offset; int c; int end = 17; opus_int16 srate = 16000; if (st->bandwidth == OPUS_BANDWIDTH_NARROWBAND) { end = 13; srate = 8000; } else if (st->bandwidth == OPUS_BANDWIDTH_MEDIUMBAND) { end = 15; srate = 12000; } for (c=0;cchannels;c++) { for(i=0;ienergy_masking[21*c+i], QCONST16(.5f, DB_SHIFT)), -QCONST16(2.0f, DB_SHIFT)); if (mask > 0) mask = HALF16(mask); mask_sum += mask; } } /* Conservative rate reduction, we cut the masking in half */ masking_depth = mask_sum / end*st->channels; masking_depth += QCONST16(.2f, DB_SHIFT); rate_offset = (opus_int32)PSHR32(MULT16_16(srate, masking_depth), DB_SHIFT); rate_offset = MAX32(rate_offset, -2*st->silk_mode.bitRate/3); /* Split the rate change between the SILK and CELT part for hybrid. */ if (st->bandwidth==OPUS_BANDWIDTH_SUPERWIDEBAND || st->bandwidth==OPUS_BANDWIDTH_FULLBAND) st->silk_mode.bitRate += 3*rate_offset/5; else st->silk_mode.bitRate += rate_offset; } st->silk_mode.payloadSize_ms = 1000 * frame_size / st->Fs; st->silk_mode.nChannelsAPI = st->channels; st->silk_mode.nChannelsInternal = st->stream_channels; if (curr_bandwidth == OPUS_BANDWIDTH_NARROWBAND) { st->silk_mode.desiredInternalSampleRate = 8000; } else if (curr_bandwidth == OPUS_BANDWIDTH_MEDIUMBAND) { st->silk_mode.desiredInternalSampleRate = 12000; } else { silk_assert( st->mode == MODE_HYBRID || curr_bandwidth == OPUS_BANDWIDTH_WIDEBAND ); st->silk_mode.desiredInternalSampleRate = 16000; } if( st->mode == MODE_HYBRID ) { /* Don't allow bandwidth reduction at lowest bitrates in hybrid mode */ st->silk_mode.minInternalSampleRate = 16000; } else { st->silk_mode.minInternalSampleRate = 8000; } st->silk_mode.maxInternalSampleRate = 16000; if (st->mode == MODE_SILK_ONLY) { opus_int32 effective_max_rate = max_rate; if (frame_rate > 50) effective_max_rate = effective_max_rate*2/3; if (effective_max_rate < 8000) { st->silk_mode.maxInternalSampleRate = 12000; st->silk_mode.desiredInternalSampleRate = IMIN(12000, st->silk_mode.desiredInternalSampleRate); } if (effective_max_rate < 7000) { st->silk_mode.maxInternalSampleRate = 8000; st->silk_mode.desiredInternalSampleRate = IMIN(8000, st->silk_mode.desiredInternalSampleRate); } } st->silk_mode.useCBR = !st->use_vbr; /* Call SILK encoder for the low band */ /* Max bits for SILK, counting ToC, redundancy bytes, and optionally redundancy. */ st->silk_mode.maxBits = (max_data_bytes-1)*8; if (redundancy && redundancy_bytes >= 2) { /* Counting 1 bit for redundancy position and 20 bits for flag+size (only for hybrid). */ st->silk_mode.maxBits -= redundancy_bytes*8 + 1; if (st->mode == MODE_HYBRID) st->silk_mode.maxBits -= 20; } if (st->silk_mode.useCBR) { if (st->mode == MODE_HYBRID) { st->silk_mode.maxBits = IMIN(st->silk_mode.maxBits, st->silk_mode.bitRate * frame_size / st->Fs); } } else { /* Constrained VBR. */ if (st->mode == MODE_HYBRID) { /* Compute SILK bitrate corresponding to the max total bits available */ opus_int32 maxBitRate = compute_silk_rate_for_hybrid(st->silk_mode.maxBits*st->Fs / frame_size, curr_bandwidth, st->Fs == 50 * frame_size, st->use_vbr, st->silk_mode.LBRR_coded); st->silk_mode.maxBits = maxBitRate * frame_size / st->Fs; } } if (prefill) { opus_int32 zero=0; int prefill_offset; /* Use a smooth onset for the SILK prefill to avoid the encoder trying to encode a discontinuity. The exact location is what we need to avoid leaving any "gap" in the audio when mixing with the redundant CELT frame. Here we can afford to overwrite st->delay_buffer because the only thing that uses it before it gets rewritten is tmp_prefill[] and even then only the part after the ramp really gets used (rather than sent to the encoder and discarded) */ prefill_offset = st->channels*(st->encoder_buffer-st->delay_compensation-st->Fs/400); gain_fade(st->delay_buffer+prefill_offset, st->delay_buffer+prefill_offset, 0, Q15ONE, celt_mode->overlap, st->Fs/400, st->channels, celt_mode->window, st->Fs); OPUS_CLEAR(st->delay_buffer, prefill_offset); #ifdef FIXED_POINT pcm_silk = st->delay_buffer; #else for (i=0;iencoder_buffer*st->channels;i++) pcm_silk[i] = FLOAT2INT16(st->delay_buffer[i]); #endif silk_Encode( silk_enc, &st->silk_mode, pcm_silk, st->encoder_buffer, NULL, &zero, 1 ); } #ifdef FIXED_POINT pcm_silk = pcm_buf+total_buffer*st->channels; #else for (i=0;ichannels;i++) pcm_silk[i] = FLOAT2INT16(pcm_buf[total_buffer*st->channels + i]); #endif ret = silk_Encode( silk_enc, &st->silk_mode, pcm_silk, frame_size, &enc, &nBytes, 0 ); if( ret ) { /*fprintf (stderr, "SILK encode error: %d\n", ret);*/ /* Handle error */ RESTORE_STACK; return OPUS_INTERNAL_ERROR; } /* Extract SILK internal bandwidth for signaling in first byte */ if( st->mode == MODE_SILK_ONLY ) { if( st->silk_mode.internalSampleRate == 8000 ) { curr_bandwidth = OPUS_BANDWIDTH_NARROWBAND; } else if( st->silk_mode.internalSampleRate == 12000 ) { curr_bandwidth = OPUS_BANDWIDTH_MEDIUMBAND; } else if( st->silk_mode.internalSampleRate == 16000 ) { curr_bandwidth = OPUS_BANDWIDTH_WIDEBAND; } } else { silk_assert( st->silk_mode.internalSampleRate == 16000 ); } st->silk_mode.opusCanSwitch = st->silk_mode.switchReady && !st->nonfinal_frame; if (nBytes==0) { st->rangeFinal = 0; data[-1] = gen_toc(st->mode, st->Fs/frame_size, curr_bandwidth, st->stream_channels); RESTORE_STACK; return 1; } /* FIXME: How do we allocate the redundancy for CBR? */ if (st->silk_mode.opusCanSwitch) { redundancy_bytes = compute_redundancy_bytes(max_data_bytes, st->bitrate_bps, frame_rate, st->stream_channels); redundancy = (redundancy_bytes != 0); celt_to_silk = 0; st->silk_bw_switch = 1; } } /* CELT processing */ { int endband=21; switch(curr_bandwidth) { case OPUS_BANDWIDTH_NARROWBAND: endband = 13; break; case OPUS_BANDWIDTH_MEDIUMBAND: case OPUS_BANDWIDTH_WIDEBAND: endband = 17; break; case OPUS_BANDWIDTH_SUPERWIDEBAND: endband = 19; break; case OPUS_BANDWIDTH_FULLBAND: endband = 21; break; } celt_encoder_ctl(celt_enc, CELT_SET_END_BAND(endband)); celt_encoder_ctl(celt_enc, CELT_SET_CHANNELS(st->stream_channels)); } celt_encoder_ctl(celt_enc, OPUS_SET_BITRATE(OPUS_BITRATE_MAX)); if (st->mode != MODE_SILK_ONLY) { opus_val32 celt_pred=2; celt_encoder_ctl(celt_enc, OPUS_SET_VBR(0)); /* We may still decide to disable prediction later */ if (st->silk_mode.reducedDependency) celt_pred = 0; celt_encoder_ctl(celt_enc, CELT_SET_PREDICTION(celt_pred)); if (st->mode == MODE_HYBRID) { if( st->use_vbr ) { celt_encoder_ctl(celt_enc, OPUS_SET_BITRATE(st->bitrate_bps-st->silk_mode.bitRate)); celt_encoder_ctl(celt_enc, OPUS_SET_VBR_CONSTRAINT(0)); } } else { if (st->use_vbr) { celt_encoder_ctl(celt_enc, OPUS_SET_VBR(1)); celt_encoder_ctl(celt_enc, OPUS_SET_VBR_CONSTRAINT(st->vbr_constraint)); celt_encoder_ctl(celt_enc, OPUS_SET_BITRATE(st->bitrate_bps)); } } } ALLOC(tmp_prefill, st->channels*st->Fs/400, opus_val16); if (st->mode != MODE_SILK_ONLY && st->mode != st->prev_mode && st->prev_mode > 0) { OPUS_COPY(tmp_prefill, &st->delay_buffer[(st->encoder_buffer-total_buffer-st->Fs/400)*st->channels], st->channels*st->Fs/400); } if (st->channels*(st->encoder_buffer-(frame_size+total_buffer)) > 0) { OPUS_MOVE(st->delay_buffer, &st->delay_buffer[st->channels*frame_size], st->channels*(st->encoder_buffer-frame_size-total_buffer)); OPUS_COPY(&st->delay_buffer[st->channels*(st->encoder_buffer-frame_size-total_buffer)], &pcm_buf[0], (frame_size+total_buffer)*st->channels); } else { OPUS_COPY(st->delay_buffer, &pcm_buf[(frame_size+total_buffer-st->encoder_buffer)*st->channels], st->encoder_buffer*st->channels); } /* gain_fade() and stereo_fade() need to be after the buffer copying because we don't want any of this to affect the SILK part */ if( st->prev_HB_gain < Q15ONE || HB_gain < Q15ONE ) { gain_fade(pcm_buf, pcm_buf, st->prev_HB_gain, HB_gain, celt_mode->overlap, frame_size, st->channels, celt_mode->window, st->Fs); } st->prev_HB_gain = HB_gain; if (st->mode != MODE_HYBRID || st->stream_channels==1) st->silk_mode.stereoWidth_Q14 = IMIN((1<<14),2*IMAX(0,equiv_rate-24000)); if( !st->energy_masking && st->channels == 2 ) { /* Apply stereo width reduction (at low bitrates) */ if( st->hybrid_stereo_width_Q14 < (1 << 14) || st->silk_mode.stereoWidth_Q14 < (1 << 14) ) { opus_val16 g1, g2; g1 = st->hybrid_stereo_width_Q14; g2 = (opus_val16)(st->silk_mode.stereoWidth_Q14); #ifdef FIXED_POINT g1 = g1==16384 ? Q15ONE : SHL16(g1,1); g2 = g2==16384 ? Q15ONE : SHL16(g2,1); #else g1 *= (1.f/16384); g2 *= (1.f/16384); #endif stereo_fade(pcm_buf, pcm_buf, g1, g2, celt_mode->overlap, frame_size, st->channels, celt_mode->window, st->Fs); st->hybrid_stereo_width_Q14 = st->silk_mode.stereoWidth_Q14; } } if ( st->mode != MODE_CELT_ONLY && ec_tell(&enc)+17+20*(st->mode == MODE_HYBRID) <= 8*(max_data_bytes-1)) { /* For SILK mode, the redundancy is inferred from the length */ if (st->mode == MODE_HYBRID) ec_enc_bit_logp(&enc, redundancy, 12); if (redundancy) { int max_redundancy; ec_enc_bit_logp(&enc, celt_to_silk, 1); if (st->mode == MODE_HYBRID) { /* Reserve the 8 bits needed for the redundancy length, and at least a few bits for CELT if possible */ max_redundancy = (max_data_bytes-1)-((ec_tell(&enc)+8+3+7)>>3); } else max_redundancy = (max_data_bytes-1)-((ec_tell(&enc)+7)>>3); /* Target the same bit-rate for redundancy as for the rest, up to a max of 257 bytes */ redundancy_bytes = IMIN(max_redundancy, redundancy_bytes); redundancy_bytes = IMIN(257, IMAX(2, redundancy_bytes)); if (st->mode == MODE_HYBRID) ec_enc_uint(&enc, redundancy_bytes-2, 256); } } else { redundancy = 0; } if (!redundancy) { st->silk_bw_switch = 0; redundancy_bytes = 0; } if (st->mode != MODE_CELT_ONLY)start_band=17; if (st->mode == MODE_SILK_ONLY) { ret = (ec_tell(&enc)+7)>>3; ec_enc_done(&enc); nb_compr_bytes = ret; } else { nb_compr_bytes = (max_data_bytes-1)-redundancy_bytes; ec_enc_shrink(&enc, nb_compr_bytes); } #ifndef DISABLE_FLOAT_API if (redundancy || st->mode != MODE_SILK_ONLY) celt_encoder_ctl(celt_enc, CELT_SET_ANALYSIS(&analysis_info)); #endif if (st->mode == MODE_HYBRID) { SILKInfo info; info.signalType = st->silk_mode.signalType; info.offset = st->silk_mode.offset; celt_encoder_ctl(celt_enc, CELT_SET_SILK_INFO(&info)); } else { celt_encoder_ctl(celt_enc, CELT_SET_SILK_INFO((SILKInfo*)NULL)); } /* 5 ms redundant frame for CELT->SILK */ if (redundancy && celt_to_silk) { int err; celt_encoder_ctl(celt_enc, CELT_SET_START_BAND(0)); celt_encoder_ctl(celt_enc, OPUS_SET_VBR(0)); celt_encoder_ctl(celt_enc, OPUS_SET_BITRATE(OPUS_BITRATE_MAX)); err = celt_encode_with_ec(celt_enc, pcm_buf, st->Fs/200, data+nb_compr_bytes, redundancy_bytes, NULL); if (err < 0) { RESTORE_STACK; return OPUS_INTERNAL_ERROR; } celt_encoder_ctl(celt_enc, OPUS_GET_FINAL_RANGE(&redundant_rng)); celt_encoder_ctl(celt_enc, OPUS_RESET_STATE); } celt_encoder_ctl(celt_enc, CELT_SET_START_BAND(start_band)); if (st->mode != MODE_SILK_ONLY) { if (st->mode != st->prev_mode && st->prev_mode > 0) { unsigned char dummy[2]; celt_encoder_ctl(celt_enc, OPUS_RESET_STATE); /* Prefilling */ celt_encode_with_ec(celt_enc, tmp_prefill, st->Fs/400, dummy, 2, NULL); celt_encoder_ctl(celt_enc, CELT_SET_PREDICTION(0)); } /* If false, we already busted the budget and we'll end up with a "PLC frame" */ if (ec_tell(&enc) <= 8*nb_compr_bytes) { /* Set the bitrate again if it was overridden in the redundancy code above*/ if (redundancy && celt_to_silk && st->mode==MODE_HYBRID && st->use_vbr) celt_encoder_ctl(celt_enc, OPUS_SET_BITRATE(st->bitrate_bps-st->silk_mode.bitRate)); celt_encoder_ctl(celt_enc, OPUS_SET_VBR(st->use_vbr)); ret = celt_encode_with_ec(celt_enc, pcm_buf, frame_size, NULL, nb_compr_bytes, &enc); if (ret < 0) { RESTORE_STACK; return OPUS_INTERNAL_ERROR; } /* Put CELT->SILK redundancy data in the right place. */ if (redundancy && celt_to_silk && st->mode==MODE_HYBRID && st->use_vbr) { OPUS_MOVE(data+ret, data+nb_compr_bytes, redundancy_bytes); nb_compr_bytes = nb_compr_bytes+redundancy_bytes; } } } /* 5 ms redundant frame for SILK->CELT */ if (redundancy && !celt_to_silk) { int err; unsigned char dummy[2]; int N2, N4; N2 = st->Fs/200; N4 = st->Fs/400; celt_encoder_ctl(celt_enc, OPUS_RESET_STATE); celt_encoder_ctl(celt_enc, CELT_SET_START_BAND(0)); celt_encoder_ctl(celt_enc, CELT_SET_PREDICTION(0)); celt_encoder_ctl(celt_enc, OPUS_SET_VBR(0)); celt_encoder_ctl(celt_enc, OPUS_SET_BITRATE(OPUS_BITRATE_MAX)); if (st->mode == MODE_HYBRID) { /* Shrink packet to what the encoder actually used. */ nb_compr_bytes = ret; ec_enc_shrink(&enc, nb_compr_bytes); } /* NOTE: We could speed this up slightly (at the expense of code size) by just adding a function that prefills the buffer */ celt_encode_with_ec(celt_enc, pcm_buf+st->channels*(frame_size-N2-N4), N4, dummy, 2, NULL); err = celt_encode_with_ec(celt_enc, pcm_buf+st->channels*(frame_size-N2), N2, data+nb_compr_bytes, redundancy_bytes, NULL); if (err < 0) { RESTORE_STACK; return OPUS_INTERNAL_ERROR; } celt_encoder_ctl(celt_enc, OPUS_GET_FINAL_RANGE(&redundant_rng)); } /* Signalling the mode in the first byte */ data--; data[0] = gen_toc(st->mode, st->Fs/frame_size, curr_bandwidth, st->stream_channels); st->rangeFinal = enc.rng ^ redundant_rng; if (to_celt) st->prev_mode = MODE_CELT_ONLY; else st->prev_mode = st->mode; st->prev_channels = st->stream_channels; st->prev_framesize = frame_size; st->first = 0; /* DTX decision */ #ifndef DISABLE_FLOAT_API if (st->use_dtx && (analysis_info.valid || is_silence)) { if (decide_dtx_mode(analysis_info.activity_probability, &st->nb_no_activity_frames, st->peak_signal_energy, pcm, frame_size, st->channels, is_silence, st->arch)) { st->rangeFinal = 0; data[0] = gen_toc(st->mode, st->Fs/frame_size, curr_bandwidth, st->stream_channels); RESTORE_STACK; return 1; } } #endif /* In the unlikely case that the SILK encoder busted its target, tell the decoder to call the PLC */ if (ec_tell(&enc) > (max_data_bytes-1)*8) { if (max_data_bytes < 2) { RESTORE_STACK; return OPUS_BUFFER_TOO_SMALL; } data[1] = 0; ret = 1; st->rangeFinal = 0; } else if (st->mode==MODE_SILK_ONLY&&!redundancy) { /*When in LPC only mode it's perfectly reasonable to strip off trailing zero bytes as the required range decoder behavior is to fill these in. This can't be done when the MDCT modes are used because the decoder needs to know the actual length for allocation purposes.*/ while(ret>2&&data[ret]==0)ret--; } /* Count ToC and redundancy */ ret += 1+redundancy_bytes; if (!st->use_vbr) { if (opus_packet_pad(data, ret, max_data_bytes) != OPUS_OK) { RESTORE_STACK; return OPUS_INTERNAL_ERROR; } ret = max_data_bytes; } RESTORE_STACK; return ret; } #ifdef FIXED_POINT #ifndef DISABLE_FLOAT_API opus_int32 opus_encode_float(OpusEncoder *st, const float *pcm, int analysis_frame_size, unsigned char *data, opus_int32 max_data_bytes) { int i, ret; int frame_size; VARDECL(opus_int16, in); ALLOC_STACK; frame_size = frame_size_select(analysis_frame_size, st->variable_duration, st->Fs); if (frame_size <= 0) { RESTORE_STACK; return OPUS_BAD_ARG; } ALLOC(in, frame_size*st->channels, opus_int16); for (i=0;ichannels;i++) in[i] = FLOAT2INT16(pcm[i]); ret = opus_encode_native(st, in, frame_size, data, max_data_bytes, 16, pcm, analysis_frame_size, 0, -2, st->channels, downmix_float, 1); RESTORE_STACK; return ret; } #endif opus_int32 opus_encode(OpusEncoder *st, const opus_int16 *pcm, int analysis_frame_size, unsigned char *data, opus_int32 out_data_bytes) { int frame_size; frame_size = frame_size_select(analysis_frame_size, st->variable_duration, st->Fs); return opus_encode_native(st, pcm, frame_size, data, out_data_bytes, 16, pcm, analysis_frame_size, 0, -2, st->channels, downmix_int, 0); } #else opus_int32 opus_encode(OpusEncoder *st, const opus_int16 *pcm, int analysis_frame_size, unsigned char *data, opus_int32 max_data_bytes) { int i, ret; int frame_size; VARDECL(float, in); ALLOC_STACK; frame_size = frame_size_select(analysis_frame_size, st->variable_duration, st->Fs); if (frame_size <= 0) { RESTORE_STACK; return OPUS_BAD_ARG; } ALLOC(in, frame_size*st->channels, float); for (i=0;ichannels;i++) in[i] = (1.0f/32768)*pcm[i]; ret = opus_encode_native(st, in, frame_size, data, max_data_bytes, 16, pcm, analysis_frame_size, 0, -2, st->channels, downmix_int, 0); RESTORE_STACK; return ret; } opus_int32 opus_encode_float(OpusEncoder *st, const float *pcm, int analysis_frame_size, unsigned char *data, opus_int32 out_data_bytes) { int frame_size; frame_size = frame_size_select(analysis_frame_size, st->variable_duration, st->Fs); return opus_encode_native(st, pcm, frame_size, data, out_data_bytes, 24, pcm, analysis_frame_size, 0, -2, st->channels, downmix_float, 1); } #endif int opus_encoder_ctl(OpusEncoder *st, int request, ...) { int ret; CELTEncoder *celt_enc; va_list ap; ret = OPUS_OK; va_start(ap, request); celt_enc = (CELTEncoder*)((char*)st+st->celt_enc_offset); switch (request) { case OPUS_SET_APPLICATION_REQUEST: { opus_int32 value = va_arg(ap, opus_int32); if ( (value != OPUS_APPLICATION_VOIP && value != OPUS_APPLICATION_AUDIO && value != OPUS_APPLICATION_RESTRICTED_LOWDELAY) || (!st->first && st->application != value)) { ret = OPUS_BAD_ARG; break; } st->application = value; #ifndef DISABLE_FLOAT_API st->analysis.application = value; #endif } break; case OPUS_GET_APPLICATION_REQUEST: { opus_int32 *value = va_arg(ap, opus_int32*); if (!value) { goto bad_arg; } *value = st->application; } break; case OPUS_SET_BITRATE_REQUEST: { opus_int32 value = va_arg(ap, opus_int32); if (value != OPUS_AUTO && value != OPUS_BITRATE_MAX) { if (value <= 0) goto bad_arg; else if (value <= 500) value = 500; else if (value > (opus_int32)300000*st->channels) value = (opus_int32)300000*st->channels; } st->user_bitrate_bps = value; } break; case OPUS_GET_BITRATE_REQUEST: { opus_int32 *value = va_arg(ap, opus_int32*); if (!value) { goto bad_arg; } *value = user_bitrate_to_bitrate(st, st->prev_framesize, 1276); } break; case OPUS_SET_FORCE_CHANNELS_REQUEST: { opus_int32 value = va_arg(ap, opus_int32); if((value<1 || value>st->channels) && value != OPUS_AUTO) { goto bad_arg; } st->force_channels = value; } break; case OPUS_GET_FORCE_CHANNELS_REQUEST: { opus_int32 *value = va_arg(ap, opus_int32*); if (!value) { goto bad_arg; } *value = st->force_channels; } break; case OPUS_SET_MAX_BANDWIDTH_REQUEST: { opus_int32 value = va_arg(ap, opus_int32); if (value < OPUS_BANDWIDTH_NARROWBAND || value > OPUS_BANDWIDTH_FULLBAND) { goto bad_arg; } st->max_bandwidth = value; if (st->max_bandwidth == OPUS_BANDWIDTH_NARROWBAND) { st->silk_mode.maxInternalSampleRate = 8000; } else if (st->max_bandwidth == OPUS_BANDWIDTH_MEDIUMBAND) { st->silk_mode.maxInternalSampleRate = 12000; } else { st->silk_mode.maxInternalSampleRate = 16000; } } break; case OPUS_GET_MAX_BANDWIDTH_REQUEST: { opus_int32 *value = va_arg(ap, opus_int32*); if (!value) { goto bad_arg; } *value = st->max_bandwidth; } break; case OPUS_SET_BANDWIDTH_REQUEST: { opus_int32 value = va_arg(ap, opus_int32); if ((value < OPUS_BANDWIDTH_NARROWBAND || value > OPUS_BANDWIDTH_FULLBAND) && value != OPUS_AUTO) { goto bad_arg; } st->user_bandwidth = value; if (st->user_bandwidth == OPUS_BANDWIDTH_NARROWBAND) { st->silk_mode.maxInternalSampleRate = 8000; } else if (st->user_bandwidth == OPUS_BANDWIDTH_MEDIUMBAND) { st->silk_mode.maxInternalSampleRate = 12000; } else { st->silk_mode.maxInternalSampleRate = 16000; } } break; case OPUS_GET_BANDWIDTH_REQUEST: { opus_int32 *value = va_arg(ap, opus_int32*); if (!value) { goto bad_arg; } *value = st->bandwidth; } break; case OPUS_SET_DTX_REQUEST: { opus_int32 value = va_arg(ap, opus_int32); if(value<0 || value>1) { goto bad_arg; } st->use_dtx = value; } break; case OPUS_GET_DTX_REQUEST: { opus_int32 *value = va_arg(ap, opus_int32*); if (!value) { goto bad_arg; } *value = st->use_dtx; } break; case OPUS_SET_COMPLEXITY_REQUEST: { opus_int32 value = va_arg(ap, opus_int32); if(value<0 || value>10) { goto bad_arg; } st->silk_mode.complexity = value; celt_encoder_ctl(celt_enc, OPUS_SET_COMPLEXITY(value)); } break; case OPUS_GET_COMPLEXITY_REQUEST: { opus_int32 *value = va_arg(ap, opus_int32*); if (!value) { goto bad_arg; } *value = st->silk_mode.complexity; } break; case OPUS_SET_INBAND_FEC_REQUEST: { opus_int32 value = va_arg(ap, opus_int32); if(value<0 || value>1) { goto bad_arg; } st->silk_mode.useInBandFEC = value; } break; case OPUS_GET_INBAND_FEC_REQUEST: { opus_int32 *value = va_arg(ap, opus_int32*); if (!value) { goto bad_arg; } *value = st->silk_mode.useInBandFEC; } break; case OPUS_SET_PACKET_LOSS_PERC_REQUEST: { opus_int32 value = va_arg(ap, opus_int32); if (value < 0 || value > 100) { goto bad_arg; } st->silk_mode.packetLossPercentage = value; celt_encoder_ctl(celt_enc, OPUS_SET_PACKET_LOSS_PERC(value)); } break; case OPUS_GET_PACKET_LOSS_PERC_REQUEST: { opus_int32 *value = va_arg(ap, opus_int32*); if (!value) { goto bad_arg; } *value = st->silk_mode.packetLossPercentage; } break; case OPUS_SET_VBR_REQUEST: { opus_int32 value = va_arg(ap, opus_int32); if(value<0 || value>1) { goto bad_arg; } st->use_vbr = value; st->silk_mode.useCBR = 1-value; } break; case OPUS_GET_VBR_REQUEST: { opus_int32 *value = va_arg(ap, opus_int32*); if (!value) { goto bad_arg; } *value = st->use_vbr; } break; case OPUS_SET_VOICE_RATIO_REQUEST: { opus_int32 value = va_arg(ap, opus_int32); if (value<-1 || value>100) { goto bad_arg; } st->voice_ratio = value; } break; case OPUS_GET_VOICE_RATIO_REQUEST: { opus_int32 *value = va_arg(ap, opus_int32*); if (!value) { goto bad_arg; } *value = st->voice_ratio; } break; case OPUS_SET_VBR_CONSTRAINT_REQUEST: { opus_int32 value = va_arg(ap, opus_int32); if(value<0 || value>1) { goto bad_arg; } st->vbr_constraint = value; } break; case OPUS_GET_VBR_CONSTRAINT_REQUEST: { opus_int32 *value = va_arg(ap, opus_int32*); if (!value) { goto bad_arg; } *value = st->vbr_constraint; } break; case OPUS_SET_SIGNAL_REQUEST: { opus_int32 value = va_arg(ap, opus_int32); if(value!=OPUS_AUTO && value!=OPUS_SIGNAL_VOICE && value!=OPUS_SIGNAL_MUSIC) { goto bad_arg; } st->signal_type = value; } break; case OPUS_GET_SIGNAL_REQUEST: { opus_int32 *value = va_arg(ap, opus_int32*); if (!value) { goto bad_arg; } *value = st->signal_type; } break; case OPUS_GET_LOOKAHEAD_REQUEST: { opus_int32 *value = va_arg(ap, opus_int32*); if (!value) { goto bad_arg; } *value = st->Fs/400; if (st->application != OPUS_APPLICATION_RESTRICTED_LOWDELAY) *value += st->delay_compensation; } break; case OPUS_GET_SAMPLE_RATE_REQUEST: { opus_int32 *value = va_arg(ap, opus_int32*); if (!value) { goto bad_arg; } *value = st->Fs; } break; case OPUS_GET_FINAL_RANGE_REQUEST: { opus_uint32 *value = va_arg(ap, opus_uint32*); if (!value) { goto bad_arg; } *value = st->rangeFinal; } break; case OPUS_SET_LSB_DEPTH_REQUEST: { opus_int32 value = va_arg(ap, opus_int32); if (value<8 || value>24) { goto bad_arg; } st->lsb_depth=value; } break; case OPUS_GET_LSB_DEPTH_REQUEST: { opus_int32 *value = va_arg(ap, opus_int32*); if (!value) { goto bad_arg; } *value = st->lsb_depth; } break; case OPUS_SET_EXPERT_FRAME_DURATION_REQUEST: { opus_int32 value = va_arg(ap, opus_int32); if (value != OPUS_FRAMESIZE_ARG && value != OPUS_FRAMESIZE_2_5_MS && value != OPUS_FRAMESIZE_5_MS && value != OPUS_FRAMESIZE_10_MS && value != OPUS_FRAMESIZE_20_MS && value != OPUS_FRAMESIZE_40_MS && value != OPUS_FRAMESIZE_60_MS && value != OPUS_FRAMESIZE_80_MS && value != OPUS_FRAMESIZE_100_MS && value != OPUS_FRAMESIZE_120_MS) { goto bad_arg; } st->variable_duration = value; celt_encoder_ctl(celt_enc, OPUS_SET_EXPERT_FRAME_DURATION(value)); } break; case OPUS_GET_EXPERT_FRAME_DURATION_REQUEST: { opus_int32 *value = va_arg(ap, opus_int32*); if (!value) { goto bad_arg; } *value = st->variable_duration; } break; case OPUS_SET_PREDICTION_DISABLED_REQUEST: { opus_int32 value = va_arg(ap, opus_int32); if (value > 1 || value < 0) goto bad_arg; st->silk_mode.reducedDependency = value; } break; case OPUS_GET_PREDICTION_DISABLED_REQUEST: { opus_int32 *value = va_arg(ap, opus_int32*); if (!value) goto bad_arg; *value = st->silk_mode.reducedDependency; } break; case OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST: { opus_int32 value = va_arg(ap, opus_int32); if(value<0 || value>1) { goto bad_arg; } celt_encoder_ctl(celt_enc, OPUS_SET_PHASE_INVERSION_DISABLED(value)); } break; case OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST: { opus_int32 *value = va_arg(ap, opus_int32*); if (!value) { goto bad_arg; } celt_encoder_ctl(celt_enc, OPUS_GET_PHASE_INVERSION_DISABLED(value)); } break; case OPUS_RESET_STATE: { void *silk_enc; silk_EncControlStruct dummy; char *start; silk_enc = (char*)st+st->silk_enc_offset; #ifndef DISABLE_FLOAT_API tonality_analysis_reset(&st->analysis); #endif start = (char*)&st->OPUS_ENCODER_RESET_START; OPUS_CLEAR(start, sizeof(OpusEncoder) - (start - (char*)st)); celt_encoder_ctl(celt_enc, OPUS_RESET_STATE); silk_InitEncoder( silk_enc, st->arch, &dummy ); st->stream_channels = st->channels; st->hybrid_stereo_width_Q14 = 1 << 14; st->prev_HB_gain = Q15ONE; st->first = 1; st->mode = MODE_HYBRID; st->bandwidth = OPUS_BANDWIDTH_FULLBAND; st->variable_HP_smth2_Q15 = silk_LSHIFT( silk_lin2log( VARIABLE_HP_MIN_CUTOFF_HZ ), 8 ); } break; case OPUS_SET_FORCE_MODE_REQUEST: { opus_int32 value = va_arg(ap, opus_int32); if ((value < MODE_SILK_ONLY || value > MODE_CELT_ONLY) && value != OPUS_AUTO) { goto bad_arg; } st->user_forced_mode = value; } break; case OPUS_SET_LFE_REQUEST: { opus_int32 value = va_arg(ap, opus_int32); st->lfe = value; ret = celt_encoder_ctl(celt_enc, OPUS_SET_LFE(value)); } break; case OPUS_SET_ENERGY_MASK_REQUEST: { opus_val16 *value = va_arg(ap, opus_val16*); st->energy_masking = value; ret = celt_encoder_ctl(celt_enc, OPUS_SET_ENERGY_MASK(value)); } break; case CELT_GET_MODE_REQUEST: { const CELTMode ** value = va_arg(ap, const CELTMode**); if (!value) { goto bad_arg; } ret = celt_encoder_ctl(celt_enc, CELT_GET_MODE(value)); } break; default: /* fprintf(stderr, "unknown opus_encoder_ctl() request: %d", request);*/ ret = OPUS_UNIMPLEMENTED; break; } va_end(ap); return ret; bad_arg: va_end(ap); return OPUS_BAD_ARG; } void opus_encoder_destroy(OpusEncoder *st) { opus_free(st); } mumble-1.3.4/3rdparty/opus-src/src/opus_private.h0000664000175000017500000001167414010707327021655 0ustar builderbuilder/* Copyright (c) 2012 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef OPUS_PRIVATE_H #define OPUS_PRIVATE_H #include "arch.h" #include "opus.h" #include "celt.h" #include /* offsetof */ struct OpusRepacketizer { unsigned char toc; int nb_frames; const unsigned char *frames[48]; opus_int16 len[48]; int framesize; }; typedef struct ChannelLayout { int nb_channels; int nb_streams; int nb_coupled_streams; unsigned char mapping[256]; } ChannelLayout; int validate_layout(const ChannelLayout *layout); int get_left_channel(const ChannelLayout *layout, int stream_id, int prev); int get_right_channel(const ChannelLayout *layout, int stream_id, int prev); int get_mono_channel(const ChannelLayout *layout, int stream_id, int prev); #define MODE_SILK_ONLY 1000 #define MODE_HYBRID 1001 #define MODE_CELT_ONLY 1002 #define OPUS_SET_VOICE_RATIO_REQUEST 11018 #define OPUS_GET_VOICE_RATIO_REQUEST 11019 /** Configures the encoder's expected percentage of voice * opposed to music or other signals. * * @note This interface is currently more aspiration than actuality. It's * ultimately expected to bias an automatic signal classifier, but it currently * just shifts the static bitrate to mode mapping around a little bit. * * @param[in] x int: Voice percentage in the range 0-100, inclusive. * @hideinitializer */ #define OPUS_SET_VOICE_RATIO(x) OPUS_SET_VOICE_RATIO_REQUEST, __opus_check_int(x) /** Gets the encoder's configured voice ratio value, @see OPUS_SET_VOICE_RATIO * * @param[out] x int*: Voice percentage in the range 0-100, inclusive. * @hideinitializer */ #define OPUS_GET_VOICE_RATIO(x) OPUS_GET_VOICE_RATIO_REQUEST, __opus_check_int_ptr(x) #define OPUS_SET_FORCE_MODE_REQUEST 11002 #define OPUS_SET_FORCE_MODE(x) OPUS_SET_FORCE_MODE_REQUEST, __opus_check_int(x) typedef void (*downmix_func)(const void *, opus_val32 *, int, int, int, int, int); void downmix_float(const void *_x, opus_val32 *sub, int subframe, int offset, int c1, int c2, int C); void downmix_int(const void *_x, opus_val32 *sub, int subframe, int offset, int c1, int c2, int C); int encode_size(int size, unsigned char *data); opus_int32 frame_size_select(opus_int32 frame_size, int variable_duration, opus_int32 Fs); opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_size, unsigned char *data, opus_int32 out_data_bytes, int lsb_depth, const void *analysis_pcm, opus_int32 analysis_size, int c1, int c2, int analysis_channels, downmix_func downmix, int float_api); int opus_decode_native(OpusDecoder *st, const unsigned char *data, opus_int32 len, opus_val16 *pcm, int frame_size, int decode_fec, int self_delimited, opus_int32 *packet_offset, int soft_clip); /* Make sure everything is properly aligned. */ static OPUS_INLINE int align(int i) { struct foo {char c; union { void* p; opus_int32 i; opus_val32 v; } u;}; unsigned int alignment = offsetof(struct foo, u); /* Optimizing compilers should optimize div and multiply into and for all sensible alignment values. */ return ((i + alignment - 1) / alignment) * alignment; } int opus_packet_parse_impl(const unsigned char *data, opus_int32 len, int self_delimited, unsigned char *out_toc, const unsigned char *frames[48], opus_int16 size[48], int *payload_offset, opus_int32 *packet_offset); opus_int32 opus_repacketizer_out_range_impl(OpusRepacketizer *rp, int begin, int end, unsigned char *data, opus_int32 maxlen, int self_delimited, int pad); int pad_frame(unsigned char *data, opus_int32 len, opus_int32 new_len); #endif /* OPUS_PRIVATE_H */ mumble-1.3.4/3rdparty/opus-src/src/mlp_train.h0000664000175000017500000000457214010707327021121 0ustar builderbuilder/* Copyright (c) 2008-2011 Octasic Inc. Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _MLP_TRAIN_H_ #define _MLP_TRAIN_H_ #include #include double tansig_table[501]; static inline double tansig_double(double x) { return 2./(1.+exp(-2.*x)) - 1.; } static inline void build_tansig_table(void) { int i; for (i=0;i<501;i++) tansig_table[i] = tansig_double(.04*(i-250)); } static inline double tansig_approx(double x) { int i; double y, dy; if (x>=10) return 1; if (x<=-10) return -1; i = lrint(25*x); x -= .04*i; y = tansig_table[250+i]; dy = 1-y*y; y = y + x*dy*(1 - y*x); return y; } static inline float randn(float sd) { float U1, U2, S, x; do { U1 = ((float)rand())/RAND_MAX; U2 = ((float)rand())/RAND_MAX; U1 = 2*U1-1; U2 = 2*U2-1; S = U1*U1 + U2*U2; } while (S >= 1 || S == 0.0f); x = sd*sqrt(-2 * log(S) / S) * U1; return x; } typedef struct { int layers; int *topo; double **weights; double **best_weights; double *in_rate; } MLPTrain; #endif /* _MLP_TRAIN_H_ */ mumble-1.3.4/3rdparty/opus-src/src/analysis.h0000664000175000017500000000776014010707327020761 0ustar builderbuilder/* Copyright (c) 2011 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef ANALYSIS_H #define ANALYSIS_H #include "celt.h" #include "opus_private.h" #define NB_FRAMES 8 #define NB_TBANDS 18 #define ANALYSIS_BUF_SIZE 720 /* 30 ms at 24 kHz */ /* At that point we can stop counting frames because it no longer matters. */ #define ANALYSIS_COUNT_MAX 10000 #define DETECT_SIZE 100 /* Uncomment this to print the MLP features on stdout. */ /*#define MLP_TRAINING*/ typedef struct { int arch; int application; opus_int32 Fs; #define TONALITY_ANALYSIS_RESET_START angle float angle[240]; float d_angle[240]; float d2_angle[240]; opus_val32 inmem[ANALYSIS_BUF_SIZE]; int mem_fill; /* number of usable samples in the buffer */ float prev_band_tonality[NB_TBANDS]; float prev_tonality; int prev_bandwidth; float E[NB_FRAMES][NB_TBANDS]; float logE[NB_FRAMES][NB_TBANDS]; float lowE[NB_TBANDS]; float highE[NB_TBANDS]; float meanE[NB_TBANDS+1]; float mem[32]; float cmean[8]; float std[9]; float music_prob; float vad_prob; float Etracker; float lowECount; int E_count; int last_music; int count; int analysis_offset; /** Probability of having speech for time i to DETECT_SIZE-1 (and music before). pspeech[0] is the probability that all frames in the window are speech. */ float pspeech[DETECT_SIZE]; /** Probability of having music for time i to DETECT_SIZE-1 (and speech before). pmusic[0] is the probability that all frames in the window are music. */ float pmusic[DETECT_SIZE]; float speech_confidence; float music_confidence; int speech_confidence_count; int music_confidence_count; int write_pos; int read_pos; int read_subframe; float hp_ener_accum; opus_val32 downmix_state[3]; AnalysisInfo info[DETECT_SIZE]; } TonalityAnalysisState; /** Initialize a TonalityAnalysisState struct. * * This performs some possibly slow initialization steps which should * not be repeated every analysis step. No allocated memory is retained * by the state struct, so no cleanup call is required. */ void tonality_analysis_init(TonalityAnalysisState *analysis, opus_int32 Fs); /** Reset a TonalityAnalysisState stuct. * * Call this when there's a discontinuity in the data. */ void tonality_analysis_reset(TonalityAnalysisState *analysis); void tonality_get_info(TonalityAnalysisState *tonal, AnalysisInfo *info_out, int len); void run_analysis(TonalityAnalysisState *analysis, const CELTMode *celt_mode, const void *analysis_pcm, int analysis_frame_size, int frame_size, int c1, int c2, int C, opus_int32 Fs, int lsb_depth, downmix_func downmix, AnalysisInfo *analysis_info); #endif mumble-1.3.4/3rdparty/opus-src/src/mlp_train.c0000664000175000017500000003636614010707327021122 0ustar builderbuilder/* Copyright (c) 2008-2011 Octasic Inc. Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "mlp_train.h" #include #include #include #include #include #include #include int stopped = 0; void handler(int sig) { stopped = 1; signal(sig, handler); } MLPTrain * mlp_init(int *topo, int nbLayers, float *inputs, float *outputs, int nbSamples) { int i, j, k; MLPTrain *net; int inDim, outDim; net = malloc(sizeof(*net)); net->topo = malloc(nbLayers*sizeof(net->topo[0])); for (i=0;itopo[i] = topo[i]; inDim = topo[0]; outDim = topo[nbLayers-1]; net->in_rate = malloc((inDim+1)*sizeof(net->in_rate[0])); net->weights = malloc((nbLayers-1)*sizeof(net->weights)); net->best_weights = malloc((nbLayers-1)*sizeof(net->weights)); for (i=0;iweights[i] = malloc((topo[i]+1)*topo[i+1]*sizeof(net->weights[0][0])); net->best_weights[i] = malloc((topo[i]+1)*topo[i+1]*sizeof(net->weights[0][0])); } double inMean[inDim]; for (j=0;jin_rate[1+j] = .5/(.0001+std); std = std-inMean[j]*inMean[j]; if (std<.001) std = .001; std = 1/sqrt(inDim*std); for (k=0;kweights[0][k*(topo[0]+1)+j+1] = randn(std); } net->in_rate[0] = 1; for (j=0;jweights[0][j*(topo[0]+1)+k+1]; net->weights[0][j*(topo[0]+1)] = -sum; } for (j=0;jweights[nbLayers-2][j*(topo[nbLayers-2]+1)] = mean; for (k=0;kweights[nbLayers-2][j*(topo[nbLayers-2]+1)+k+1] = randn(std); } return net; } #define MAX_NEURONS 100 #define MAX_OUT 10 double compute_gradient(MLPTrain *net, float *inputs, float *outputs, int nbSamples, double *W0_grad, double *W1_grad, double *error_rate) { int i,j; int s; int inDim, outDim, hiddenDim; int *topo; double *W0, *W1; double rms=0; int W0_size, W1_size; double hidden[MAX_NEURONS]; double netOut[MAX_NEURONS]; double error[MAX_NEURONS]; topo = net->topo; inDim = net->topo[0]; hiddenDim = net->topo[1]; outDim = net->topo[2]; W0_size = (topo[0]+1)*topo[1]; W1_size = (topo[1]+1)*topo[2]; W0 = net->weights[0]; W1 = net->weights[1]; memset(W0_grad, 0, W0_size*sizeof(double)); memset(W1_grad, 0, W1_size*sizeof(double)); for (i=0;i1; if (i==0) error[i] *= 5; rms += error[i]*error[i]; /*error[i] = error[i]/(1+fabs(error[i]));*/ } /* Back-propagate error */ for (i=0;inet->topo; W0_size = (topo[0]+1)*topo[1]; W1_size = (topo[1]+1)*topo[2]; double W0_grad[W0_size]; double W1_grad[W1_size]; arg->W0_grad = W0_grad; arg->W1_grad = W1_grad; while (1) { sem_wait(&sem_begin[arg->id]); if (arg->done) break; arg->rms = compute_gradient(arg->net, arg->inputs, arg->outputs, arg->nbSamples, arg->W0_grad, arg->W1_grad, arg->error_rate); sem_post(&sem_end[arg->id]); } fprintf(stderr, "done\n"); return NULL; } float mlp_train_backprop(MLPTrain *net, float *inputs, float *outputs, int nbSamples, int nbEpoch, float rate) { int i, j; int e; float best_rms = 1e10; int inDim, outDim, hiddenDim; int *topo; double *W0, *W1, *best_W0, *best_W1; double *W0_grad, *W1_grad; double *W0_oldgrad, *W1_oldgrad; double *W0_rate, *W1_rate; double *best_W0_rate, *best_W1_rate; int W0_size, W1_size; topo = net->topo; W0_size = (topo[0]+1)*topo[1]; W1_size = (topo[1]+1)*topo[2]; struct GradientArg args[NB_THREADS]; pthread_t thread[NB_THREADS]; int samplePerPart = nbSamples/NB_THREADS; int count_worse=0; int count_retries=0; topo = net->topo; inDim = net->topo[0]; hiddenDim = net->topo[1]; outDim = net->topo[2]; W0 = net->weights[0]; W1 = net->weights[1]; best_W0 = net->best_weights[0]; best_W1 = net->best_weights[1]; W0_grad = malloc(W0_size*sizeof(double)); W1_grad = malloc(W1_size*sizeof(double)); W0_oldgrad = malloc(W0_size*sizeof(double)); W1_oldgrad = malloc(W1_size*sizeof(double)); W0_rate = malloc(W0_size*sizeof(double)); W1_rate = malloc(W1_size*sizeof(double)); best_W0_rate = malloc(W0_size*sizeof(double)); best_W1_rate = malloc(W1_size*sizeof(double)); memset(W0_grad, 0, W0_size*sizeof(double)); memset(W0_oldgrad, 0, W0_size*sizeof(double)); memset(W1_grad, 0, W1_size*sizeof(double)); memset(W1_oldgrad, 0, W1_size*sizeof(double)); rate /= nbSamples; for (i=0;iin_rate[j]; for (i=0;i30) { count_retries++; count_worse=0; for (i=0;i10) break; for (i=0;i 0) W0_rate[i] *= 1.01; else if (W0_oldgrad[i]*W0_grad[i] < 0) W0_rate[i] *= .9; mean_rate += W0_rate[i]; if (W0_rate[i] < min_rate) min_rate = W0_rate[i]; if (W0_rate[i] < 1e-15) W0_rate[i] = 1e-15; /*if (W0_rate[i] > .01) W0_rate[i] = .01;*/ W0_oldgrad[i] = W0_grad[i]; W0[i] += W0_grad[i]*W0_rate[i]; } for (i=0;i 0) W1_rate[i] *= 1.01; else if (W1_oldgrad[i]*W1_grad[i] < 0) W1_rate[i] *= .9; mean_rate += W1_rate[i]; if (W1_rate[i] < min_rate) min_rate = W1_rate[i]; if (W1_rate[i] < 1e-15) W1_rate[i] = 1e-15; W1_oldgrad[i] = W1_grad[i]; W1[i] += W1_grad[i]*W1_rate[i]; } mean_rate /= (topo[0]+1)*topo[1] + (topo[1]+1)*topo[2]; fprintf (stderr, "%g %d", mean_rate, e); if (count_retries) fprintf(stderr, " %d", count_retries); fprintf(stderr, "\n"); if (stopped) break; } for (i=0;i \n"); return 1; } nbInputs = atoi(argv[1]); nbHidden = atoi(argv[2]); nbOutputs = atoi(argv[3]); nbSamples = atoi(argv[4]); nbEpoch = atoi(argv[5]); nbRealInputs = nbInputs; inputs = malloc(nbInputs*nbSamples*sizeof(*inputs)); outputs = malloc(nbOutputs*nbSamples*sizeof(*outputs)); seed = time(NULL); /*seed = 1452209040;*/ fprintf (stderr, "Seed is %u\n", seed); srand(seed); build_tansig_table(); signal(SIGTERM, handler); signal(SIGINT, handler); signal(SIGHUP, handler); for (i=0;iRFC 7845 * and is based on the self-delimited Opus framing described in Appendix B of * RFC 6716. * Normal Opus packets are just a degenerate case of multistream Opus packets, * and can be encoded or decoded with the multistream API by setting * streams to 1 when initializing the encoder or * decoder. * * Multistream Opus streams can contain up to 255 elementary Opus streams. * These may be either "uncoupled" or "coupled", indicating that the decoder * is configured to decode them to either 1 or 2 channels, respectively. * The streams are ordered so that all coupled streams appear at the * beginning. * * A mapping table defines which decoded channel i * should be used for each input/output (I/O) channel j. This table is * typically provided as an unsigned char array. * Let i = mapping[j] be the index for I/O channel j. * If i < 2*coupled_streams, then I/O channel j is * encoded as the left channel of stream (i/2) if i * is even, or as the right channel of stream (i/2) if * i is odd. Otherwise, I/O channel j is encoded as * mono in stream (i - coupled_streams), unless it has the special * value 255, in which case it is omitted from the encoding entirely (the * decoder will reproduce it as silence). Each value i must either * be the special value 255 or be less than streams + coupled_streams. * * The output channels specified by the encoder * should use the * Vorbis * channel ordering. A decoder may wish to apply an additional permutation * to the mapping the encoder used to achieve a different output channel * order (e.g. for outputing in WAV order). * * Each multistream packet contains an Opus packet for each stream, and all of * the Opus packets in a single multistream packet must have the same * duration. Therefore the duration of a multistream packet can be extracted * from the TOC sequence of the first stream, which is located at the * beginning of the packet, just like an elementary Opus stream: * * @code * int nb_samples; * int nb_frames; * nb_frames = opus_packet_get_nb_frames(data, len); * if (nb_frames < 1) * return nb_frames; * nb_samples = opus_packet_get_samples_per_frame(data, 48000) * nb_frames; * @endcode * * The general encoding and decoding process proceeds exactly the same as in * the normal @ref opus_encoder and @ref opus_decoder APIs. * See their documentation for an overview of how to use the corresponding * multistream functions. */ /** Opus multistream encoder state. * This contains the complete state of a multistream Opus encoder. * It is position independent and can be freely copied. * @see opus_multistream_encoder_create * @see opus_multistream_encoder_init */ typedef struct OpusMSEncoder OpusMSEncoder; /** Opus multistream decoder state. * This contains the complete state of a multistream Opus decoder. * It is position independent and can be freely copied. * @see opus_multistream_decoder_create * @see opus_multistream_decoder_init */ typedef struct OpusMSDecoder OpusMSDecoder; /**\name Multistream encoder functions */ /**@{*/ /** Gets the size of an OpusMSEncoder structure. * @param streams int: The total number of streams to encode from the * input. * This must be no more than 255. * @param coupled_streams int: Number of coupled (2 channel) streams * to encode. * This must be no larger than the total * number of streams. * Additionally, The total number of * encoded channels (streams + * coupled_streams) must be no * more than 255. * @returns The size in bytes on success, or a negative error code * (see @ref opus_errorcodes) on error. */ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_multistream_encoder_get_size( int streams, int coupled_streams ); OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_multistream_surround_encoder_get_size( int channels, int mapping_family ); /** Allocates and initializes a multistream encoder state. * Call opus_multistream_encoder_destroy() to release * this object when finished. * @param Fs opus_int32: Sampling rate of the input signal (in Hz). * This must be one of 8000, 12000, 16000, * 24000, or 48000. * @param channels int: Number of channels in the input signal. * This must be at most 255. * It may be greater than the number of * coded channels (streams + * coupled_streams). * @param streams int: The total number of streams to encode from the * input. * This must be no more than the number of channels. * @param coupled_streams int: Number of coupled (2 channel) streams * to encode. * This must be no larger than the total * number of streams. * Additionally, The total number of * encoded channels (streams + * coupled_streams) must be no * more than the number of input channels. * @param[in] mapping const unsigned char[channels]: Mapping from * encoded channels to input channels, as described in * @ref opus_multistream. As an extra constraint, the * multistream encoder does not allow encoding coupled * streams for which one channel is unused since this * is never a good idea. * @param application int: The target encoder application. * This must be one of the following: *
    *
    #OPUS_APPLICATION_VOIP
    *
    Process signal for improved speech intelligibility.
    *
    #OPUS_APPLICATION_AUDIO
    *
    Favor faithfulness to the original input.
    *
    #OPUS_APPLICATION_RESTRICTED_LOWDELAY
    *
    Configure the minimum possible coding delay by disabling certain modes * of operation.
    *
    * @param[out] error int *: Returns #OPUS_OK on success, or an error * code (see @ref opus_errorcodes) on * failure. */ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusMSEncoder *opus_multistream_encoder_create( opus_int32 Fs, int channels, int streams, int coupled_streams, const unsigned char *mapping, int application, int *error ) OPUS_ARG_NONNULL(5); OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusMSEncoder *opus_multistream_surround_encoder_create( opus_int32 Fs, int channels, int mapping_family, int *streams, int *coupled_streams, unsigned char *mapping, int application, int *error ) OPUS_ARG_NONNULL(4) OPUS_ARG_NONNULL(5) OPUS_ARG_NONNULL(6); /** Initialize a previously allocated multistream encoder state. * The memory pointed to by \a st must be at least the size returned by * opus_multistream_encoder_get_size(). * This is intended for applications which use their own allocator instead of * malloc. * To reset a previously initialized state, use the #OPUS_RESET_STATE CTL. * @see opus_multistream_encoder_create * @see opus_multistream_encoder_get_size * @param st OpusMSEncoder*: Multistream encoder state to initialize. * @param Fs opus_int32: Sampling rate of the input signal (in Hz). * This must be one of 8000, 12000, 16000, * 24000, or 48000. * @param channels int: Number of channels in the input signal. * This must be at most 255. * It may be greater than the number of * coded channels (streams + * coupled_streams). * @param streams int: The total number of streams to encode from the * input. * This must be no more than the number of channels. * @param coupled_streams int: Number of coupled (2 channel) streams * to encode. * This must be no larger than the total * number of streams. * Additionally, The total number of * encoded channels (streams + * coupled_streams) must be no * more than the number of input channels. * @param[in] mapping const unsigned char[channels]: Mapping from * encoded channels to input channels, as described in * @ref opus_multistream. As an extra constraint, the * multistream encoder does not allow encoding coupled * streams for which one channel is unused since this * is never a good idea. * @param application int: The target encoder application. * This must be one of the following: *
    *
    #OPUS_APPLICATION_VOIP
    *
    Process signal for improved speech intelligibility.
    *
    #OPUS_APPLICATION_AUDIO
    *
    Favor faithfulness to the original input.
    *
    #OPUS_APPLICATION_RESTRICTED_LOWDELAY
    *
    Configure the minimum possible coding delay by disabling certain modes * of operation.
    *
    * @returns #OPUS_OK on success, or an error code (see @ref opus_errorcodes) * on failure. */ OPUS_EXPORT int opus_multistream_encoder_init( OpusMSEncoder *st, opus_int32 Fs, int channels, int streams, int coupled_streams, const unsigned char *mapping, int application ) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(6); OPUS_EXPORT int opus_multistream_surround_encoder_init( OpusMSEncoder *st, opus_int32 Fs, int channels, int mapping_family, int *streams, int *coupled_streams, unsigned char *mapping, int application ) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(5) OPUS_ARG_NONNULL(6) OPUS_ARG_NONNULL(7); /** Encodes a multistream Opus frame. * @param st OpusMSEncoder*: Multistream encoder state. * @param[in] pcm const opus_int16*: The input signal as interleaved * samples. * This must contain * frame_size*channels * samples. * @param frame_size int: Number of samples per channel in the input * signal. * This must be an Opus frame size for the * encoder's sampling rate. * For example, at 48 kHz the permitted values * are 120, 240, 480, 960, 1920, and 2880. * Passing in a duration of less than 10 ms * (480 samples at 48 kHz) will prevent the * encoder from using the LPC or hybrid modes. * @param[out] data unsigned char*: Output payload. * This must contain storage for at * least \a max_data_bytes. * @param [in] max_data_bytes opus_int32: Size of the allocated * memory for the output * payload. This may be * used to impose an upper limit on * the instant bitrate, but should * not be used as the only bitrate * control. Use #OPUS_SET_BITRATE to * control the bitrate. * @returns The length of the encoded packet (in bytes) on success or a * negative error code (see @ref opus_errorcodes) on failure. */ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_multistream_encode( OpusMSEncoder *st, const opus_int16 *pcm, int frame_size, unsigned char *data, opus_int32 max_data_bytes ) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4); /** Encodes a multistream Opus frame from floating point input. * @param st OpusMSEncoder*: Multistream encoder state. * @param[in] pcm const float*: The input signal as interleaved * samples with a normal range of * +/-1.0. * Samples with a range beyond +/-1.0 * are supported but will be clipped by * decoders using the integer API and * should only be used if it is known * that the far end supports extended * dynamic range. * This must contain * frame_size*channels * samples. * @param frame_size int: Number of samples per channel in the input * signal. * This must be an Opus frame size for the * encoder's sampling rate. * For example, at 48 kHz the permitted values * are 120, 240, 480, 960, 1920, and 2880. * Passing in a duration of less than 10 ms * (480 samples at 48 kHz) will prevent the * encoder from using the LPC or hybrid modes. * @param[out] data unsigned char*: Output payload. * This must contain storage for at * least \a max_data_bytes. * @param [in] max_data_bytes opus_int32: Size of the allocated * memory for the output * payload. This may be * used to impose an upper limit on * the instant bitrate, but should * not be used as the only bitrate * control. Use #OPUS_SET_BITRATE to * control the bitrate. * @returns The length of the encoded packet (in bytes) on success or a * negative error code (see @ref opus_errorcodes) on failure. */ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_multistream_encode_float( OpusMSEncoder *st, const float *pcm, int frame_size, unsigned char *data, opus_int32 max_data_bytes ) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4); /** Frees an OpusMSEncoder allocated by * opus_multistream_encoder_create(). * @param st OpusMSEncoder*: Multistream encoder state to be freed. */ OPUS_EXPORT void opus_multistream_encoder_destroy(OpusMSEncoder *st); /** Perform a CTL function on a multistream Opus encoder. * * Generally the request and subsequent arguments are generated by a * convenience macro. * @param st OpusMSEncoder*: Multistream encoder state. * @param request This and all remaining parameters should be replaced by one * of the convenience macros in @ref opus_genericctls, * @ref opus_encoderctls, or @ref opus_multistream_ctls. * @see opus_genericctls * @see opus_encoderctls * @see opus_multistream_ctls */ OPUS_EXPORT int opus_multistream_encoder_ctl(OpusMSEncoder *st, int request, ...) OPUS_ARG_NONNULL(1); /**@}*/ /**\name Multistream decoder functions */ /**@{*/ /** Gets the size of an OpusMSDecoder structure. * @param streams int: The total number of streams coded in the * input. * This must be no more than 255. * @param coupled_streams int: Number streams to decode as coupled * (2 channel) streams. * This must be no larger than the total * number of streams. * Additionally, The total number of * coded channels (streams + * coupled_streams) must be no * more than 255. * @returns The size in bytes on success, or a negative error code * (see @ref opus_errorcodes) on error. */ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_multistream_decoder_get_size( int streams, int coupled_streams ); /** Allocates and initializes a multistream decoder state. * Call opus_multistream_decoder_destroy() to release * this object when finished. * @param Fs opus_int32: Sampling rate to decode at (in Hz). * This must be one of 8000, 12000, 16000, * 24000, or 48000. * @param channels int: Number of channels to output. * This must be at most 255. * It may be different from the number of coded * channels (streams + * coupled_streams). * @param streams int: The total number of streams coded in the * input. * This must be no more than 255. * @param coupled_streams int: Number of streams to decode as coupled * (2 channel) streams. * This must be no larger than the total * number of streams. * Additionally, The total number of * coded channels (streams + * coupled_streams) must be no * more than 255. * @param[in] mapping const unsigned char[channels]: Mapping from * coded channels to output channels, as described in * @ref opus_multistream. * @param[out] error int *: Returns #OPUS_OK on success, or an error * code (see @ref opus_errorcodes) on * failure. */ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusMSDecoder *opus_multistream_decoder_create( opus_int32 Fs, int channels, int streams, int coupled_streams, const unsigned char *mapping, int *error ) OPUS_ARG_NONNULL(5); /** Intialize a previously allocated decoder state object. * The memory pointed to by \a st must be at least the size returned by * opus_multistream_encoder_get_size(). * This is intended for applications which use their own allocator instead of * malloc. * To reset a previously initialized state, use the #OPUS_RESET_STATE CTL. * @see opus_multistream_decoder_create * @see opus_multistream_deocder_get_size * @param st OpusMSEncoder*: Multistream encoder state to initialize. * @param Fs opus_int32: Sampling rate to decode at (in Hz). * This must be one of 8000, 12000, 16000, * 24000, or 48000. * @param channels int: Number of channels to output. * This must be at most 255. * It may be different from the number of coded * channels (streams + * coupled_streams). * @param streams int: The total number of streams coded in the * input. * This must be no more than 255. * @param coupled_streams int: Number of streams to decode as coupled * (2 channel) streams. * This must be no larger than the total * number of streams. * Additionally, The total number of * coded channels (streams + * coupled_streams) must be no * more than 255. * @param[in] mapping const unsigned char[channels]: Mapping from * coded channels to output channels, as described in * @ref opus_multistream. * @returns #OPUS_OK on success, or an error code (see @ref opus_errorcodes) * on failure. */ OPUS_EXPORT int opus_multistream_decoder_init( OpusMSDecoder *st, opus_int32 Fs, int channels, int streams, int coupled_streams, const unsigned char *mapping ) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(6); /** Decode a multistream Opus packet. * @param st OpusMSDecoder*: Multistream decoder state. * @param[in] data const unsigned char*: Input payload. * Use a NULL * pointer to indicate packet * loss. * @param len opus_int32: Number of bytes in payload. * @param[out] pcm opus_int16*: Output signal, with interleaved * samples. * This must contain room for * frame_size*channels * samples. * @param frame_size int: The number of samples per channel of * available space in \a pcm. * If this is less than the maximum packet duration * (120 ms; 5760 for 48kHz), this function will not be capable * of decoding some packets. In the case of PLC (data==NULL) * or FEC (decode_fec=1), then frame_size needs to be exactly * the duration of audio that is missing, otherwise the * decoder will not be in the optimal state to decode the * next incoming packet. For the PLC and FEC cases, frame_size * must be a multiple of 2.5 ms. * @param decode_fec int: Flag (0 or 1) to request that any in-band * forward error correction data be decoded. * If no such data is available, the frame is * decoded as if it were lost. * @returns Number of samples decoded on success or a negative error code * (see @ref opus_errorcodes) on failure. */ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_multistream_decode( OpusMSDecoder *st, const unsigned char *data, opus_int32 len, opus_int16 *pcm, int frame_size, int decode_fec ) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); /** Decode a multistream Opus packet with floating point output. * @param st OpusMSDecoder*: Multistream decoder state. * @param[in] data const unsigned char*: Input payload. * Use a NULL * pointer to indicate packet * loss. * @param len opus_int32: Number of bytes in payload. * @param[out] pcm opus_int16*: Output signal, with interleaved * samples. * This must contain room for * frame_size*channels * samples. * @param frame_size int: The number of samples per channel of * available space in \a pcm. * If this is less than the maximum packet duration * (120 ms; 5760 for 48kHz), this function will not be capable * of decoding some packets. In the case of PLC (data==NULL) * or FEC (decode_fec=1), then frame_size needs to be exactly * the duration of audio that is missing, otherwise the * decoder will not be in the optimal state to decode the * next incoming packet. For the PLC and FEC cases, frame_size * must be a multiple of 2.5 ms. * @param decode_fec int: Flag (0 or 1) to request that any in-band * forward error correction data be decoded. * If no such data is available, the frame is * decoded as if it were lost. * @returns Number of samples decoded on success or a negative error code * (see @ref opus_errorcodes) on failure. */ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_multistream_decode_float( OpusMSDecoder *st, const unsigned char *data, opus_int32 len, float *pcm, int frame_size, int decode_fec ) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); /** Perform a CTL function on a multistream Opus decoder. * * Generally the request and subsequent arguments are generated by a * convenience macro. * @param st OpusMSDecoder*: Multistream decoder state. * @param request This and all remaining parameters should be replaced by one * of the convenience macros in @ref opus_genericctls, * @ref opus_decoderctls, or @ref opus_multistream_ctls. * @see opus_genericctls * @see opus_decoderctls * @see opus_multistream_ctls */ OPUS_EXPORT int opus_multistream_decoder_ctl(OpusMSDecoder *st, int request, ...) OPUS_ARG_NONNULL(1); /** Frees an OpusMSDecoder allocated by * opus_multistream_decoder_create(). * @param st OpusMSDecoder: Multistream decoder state to be freed. */ OPUS_EXPORT void opus_multistream_decoder_destroy(OpusMSDecoder *st); /**@}*/ /**@}*/ #ifdef __cplusplus } #endif #endif /* OPUS_MULTISTREAM_H */ mumble-1.3.4/3rdparty/opus-src/include/opus.h0000664000175000017500000013645514010707327020764 0ustar builderbuilder/* Copyright (c) 2010-2011 Xiph.Org Foundation, Skype Limited Written by Jean-Marc Valin and Koen Vos */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @file opus.h * @brief Opus reference implementation API */ #ifndef OPUS_H #define OPUS_H #include "opus_types.h" #include "opus_defines.h" #ifdef __cplusplus extern "C" { #endif /** * @mainpage Opus * * The Opus codec is designed for interactive speech and audio transmission over the Internet. * It is designed by the IETF Codec Working Group and incorporates technology from * Skype's SILK codec and Xiph.Org's CELT codec. * * The Opus codec is designed to handle a wide range of interactive audio applications, * including Voice over IP, videoconferencing, in-game chat, and even remote live music * performances. It can scale from low bit-rate narrowband speech to very high quality * stereo music. Its main features are: * @li Sampling rates from 8 to 48 kHz * @li Bit-rates from 6 kb/s to 510 kb/s * @li Support for both constant bit-rate (CBR) and variable bit-rate (VBR) * @li Audio bandwidth from narrowband to full-band * @li Support for speech and music * @li Support for mono and stereo * @li Support for multichannel (up to 255 channels) * @li Frame sizes from 2.5 ms to 60 ms * @li Good loss robustness and packet loss concealment (PLC) * @li Floating point and fixed-point implementation * * Documentation sections: * @li @ref opus_encoder * @li @ref opus_decoder * @li @ref opus_repacketizer * @li @ref opus_multistream * @li @ref opus_libinfo * @li @ref opus_custom */ /** @defgroup opus_encoder Opus Encoder * @{ * * @brief This page describes the process and functions used to encode Opus. * * Since Opus is a stateful codec, the encoding process starts with creating an encoder * state. This can be done with: * * @code * int error; * OpusEncoder *enc; * enc = opus_encoder_create(Fs, channels, application, &error); * @endcode * * From this point, @c enc can be used for encoding an audio stream. An encoder state * @b must @b not be used for more than one stream at the same time. Similarly, the encoder * state @b must @b not be re-initialized for each frame. * * While opus_encoder_create() allocates memory for the state, it's also possible * to initialize pre-allocated memory: * * @code * int size; * int error; * OpusEncoder *enc; * size = opus_encoder_get_size(channels); * enc = malloc(size); * error = opus_encoder_init(enc, Fs, channels, application); * @endcode * * where opus_encoder_get_size() returns the required size for the encoder state. Note that * future versions of this code may change the size, so no assuptions should be made about it. * * The encoder state is always continuous in memory and only a shallow copy is sufficient * to copy it (e.g. memcpy()) * * It is possible to change some of the encoder's settings using the opus_encoder_ctl() * interface. All these settings already default to the recommended value, so they should * only be changed when necessary. The most common settings one may want to change are: * * @code * opus_encoder_ctl(enc, OPUS_SET_BITRATE(bitrate)); * opus_encoder_ctl(enc, OPUS_SET_COMPLEXITY(complexity)); * opus_encoder_ctl(enc, OPUS_SET_SIGNAL(signal_type)); * @endcode * * where * * @arg bitrate is in bits per second (b/s) * @arg complexity is a value from 1 to 10, where 1 is the lowest complexity and 10 is the highest * @arg signal_type is either OPUS_AUTO (default), OPUS_SIGNAL_VOICE, or OPUS_SIGNAL_MUSIC * * See @ref opus_encoderctls and @ref opus_genericctls for a complete list of parameters that can be set or queried. Most parameters can be set or changed at any time during a stream. * * To encode a frame, opus_encode() or opus_encode_float() must be called with exactly one frame (2.5, 5, 10, 20, 40 or 60 ms) of audio data: * @code * len = opus_encode(enc, audio_frame, frame_size, packet, max_packet); * @endcode * * where *
      *
    • audio_frame is the audio data in opus_int16 (or float for opus_encode_float())
    • *
    • frame_size is the duration of the frame in samples (per channel)
    • *
    • packet is the byte array to which the compressed data is written
    • *
    • max_packet is the maximum number of bytes that can be written in the packet (4000 bytes is recommended). * Do not use max_packet to control VBR target bitrate, instead use the #OPUS_SET_BITRATE CTL.
    • *
    * * opus_encode() and opus_encode_float() return the number of bytes actually written to the packet. * The return value can be negative, which indicates that an error has occurred. If the return value * is 2 bytes or less, then the packet does not need to be transmitted (DTX). * * Once the encoder state if no longer needed, it can be destroyed with * * @code * opus_encoder_destroy(enc); * @endcode * * If the encoder was created with opus_encoder_init() rather than opus_encoder_create(), * then no action is required aside from potentially freeing the memory that was manually * allocated for it (calling free(enc) for the example above) * */ /** Opus encoder state. * This contains the complete state of an Opus encoder. * It is position independent and can be freely copied. * @see opus_encoder_create,opus_encoder_init */ typedef struct OpusEncoder OpusEncoder; /** Gets the size of an OpusEncoder structure. * @param[in] channels int: Number of channels. * This must be 1 or 2. * @returns The size in bytes. */ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_encoder_get_size(int channels); /** */ /** Allocates and initializes an encoder state. * There are three coding modes: * * @ref OPUS_APPLICATION_VOIP gives best quality at a given bitrate for voice * signals. It enhances the input signal by high-pass filtering and * emphasizing formants and harmonics. Optionally it includes in-band * forward error correction to protect against packet loss. Use this * mode for typical VoIP applications. Because of the enhancement, * even at high bitrates the output may sound different from the input. * * @ref OPUS_APPLICATION_AUDIO gives best quality at a given bitrate for most * non-voice signals like music. Use this mode for music and mixed * (music/voice) content, broadcast, and applications requiring less * than 15 ms of coding delay. * * @ref OPUS_APPLICATION_RESTRICTED_LOWDELAY configures low-delay mode that * disables the speech-optimized mode in exchange for slightly reduced delay. * This mode can only be set on an newly initialized or freshly reset encoder * because it changes the codec delay. * * This is useful when the caller knows that the speech-optimized modes will not be needed (use with caution). * @param [in] Fs opus_int32: Sampling rate of input signal (Hz) * This must be one of 8000, 12000, 16000, * 24000, or 48000. * @param [in] channels int: Number of channels (1 or 2) in input signal * @param [in] application int: Coding mode (@ref OPUS_APPLICATION_VOIP/@ref OPUS_APPLICATION_AUDIO/@ref OPUS_APPLICATION_RESTRICTED_LOWDELAY) * @param [out] error int*: @ref opus_errorcodes * @note Regardless of the sampling rate and number channels selected, the Opus encoder * can switch to a lower audio bandwidth or number of channels if the bitrate * selected is too low. This also means that it is safe to always use 48 kHz stereo input * and let the encoder optimize the encoding. */ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusEncoder *opus_encoder_create( opus_int32 Fs, int channels, int application, int *error ); /** Initializes a previously allocated encoder state * The memory pointed to by st must be at least the size returned by opus_encoder_get_size(). * This is intended for applications which use their own allocator instead of malloc. * @see opus_encoder_create(),opus_encoder_get_size() * To reset a previously initialized state, use the #OPUS_RESET_STATE CTL. * @param [in] st OpusEncoder*: Encoder state * @param [in] Fs opus_int32: Sampling rate of input signal (Hz) * This must be one of 8000, 12000, 16000, * 24000, or 48000. * @param [in] channels int: Number of channels (1 or 2) in input signal * @param [in] application int: Coding mode (OPUS_APPLICATION_VOIP/OPUS_APPLICATION_AUDIO/OPUS_APPLICATION_RESTRICTED_LOWDELAY) * @retval #OPUS_OK Success or @ref opus_errorcodes */ OPUS_EXPORT int opus_encoder_init( OpusEncoder *st, opus_int32 Fs, int channels, int application ) OPUS_ARG_NONNULL(1); /** Encodes an Opus frame. * @param [in] st OpusEncoder*: Encoder state * @param [in] pcm opus_int16*: Input signal (interleaved if 2 channels). length is frame_size*channels*sizeof(opus_int16) * @param [in] frame_size int: Number of samples per channel in the * input signal. * This must be an Opus frame size for * the encoder's sampling rate. * For example, at 48 kHz the permitted * values are 120, 240, 480, 960, 1920, * and 2880. * Passing in a duration of less than * 10 ms (480 samples at 48 kHz) will * prevent the encoder from using the LPC * or hybrid modes. * @param [out] data unsigned char*: Output payload. * This must contain storage for at * least \a max_data_bytes. * @param [in] max_data_bytes opus_int32: Size of the allocated * memory for the output * payload. This may be * used to impose an upper limit on * the instant bitrate, but should * not be used as the only bitrate * control. Use #OPUS_SET_BITRATE to * control the bitrate. * @returns The length of the encoded packet (in bytes) on success or a * negative error code (see @ref opus_errorcodes) on failure. */ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_encode( OpusEncoder *st, const opus_int16 *pcm, int frame_size, unsigned char *data, opus_int32 max_data_bytes ) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4); /** Encodes an Opus frame from floating point input. * @param [in] st OpusEncoder*: Encoder state * @param [in] pcm float*: Input in float format (interleaved if 2 channels), with a normal range of +/-1.0. * Samples with a range beyond +/-1.0 are supported but will * be clipped by decoders using the integer API and should * only be used if it is known that the far end supports * extended dynamic range. * length is frame_size*channels*sizeof(float) * @param [in] frame_size int: Number of samples per channel in the * input signal. * This must be an Opus frame size for * the encoder's sampling rate. * For example, at 48 kHz the permitted * values are 120, 240, 480, 960, 1920, * and 2880. * Passing in a duration of less than * 10 ms (480 samples at 48 kHz) will * prevent the encoder from using the LPC * or hybrid modes. * @param [out] data unsigned char*: Output payload. * This must contain storage for at * least \a max_data_bytes. * @param [in] max_data_bytes opus_int32: Size of the allocated * memory for the output * payload. This may be * used to impose an upper limit on * the instant bitrate, but should * not be used as the only bitrate * control. Use #OPUS_SET_BITRATE to * control the bitrate. * @returns The length of the encoded packet (in bytes) on success or a * negative error code (see @ref opus_errorcodes) on failure. */ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_encode_float( OpusEncoder *st, const float *pcm, int frame_size, unsigned char *data, opus_int32 max_data_bytes ) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4); /** Frees an OpusEncoder allocated by opus_encoder_create(). * @param[in] st OpusEncoder*: State to be freed. */ OPUS_EXPORT void opus_encoder_destroy(OpusEncoder *st); /** Perform a CTL function on an Opus encoder. * * Generally the request and subsequent arguments are generated * by a convenience macro. * @param st OpusEncoder*: Encoder state. * @param request This and all remaining parameters should be replaced by one * of the convenience macros in @ref opus_genericctls or * @ref opus_encoderctls. * @see opus_genericctls * @see opus_encoderctls */ OPUS_EXPORT int opus_encoder_ctl(OpusEncoder *st, int request, ...) OPUS_ARG_NONNULL(1); /**@}*/ /** @defgroup opus_decoder Opus Decoder * @{ * * @brief This page describes the process and functions used to decode Opus. * * The decoding process also starts with creating a decoder * state. This can be done with: * @code * int error; * OpusDecoder *dec; * dec = opus_decoder_create(Fs, channels, &error); * @endcode * where * @li Fs is the sampling rate and must be 8000, 12000, 16000, 24000, or 48000 * @li channels is the number of channels (1 or 2) * @li error will hold the error code in case of failure (or #OPUS_OK on success) * @li the return value is a newly created decoder state to be used for decoding * * While opus_decoder_create() allocates memory for the state, it's also possible * to initialize pre-allocated memory: * @code * int size; * int error; * OpusDecoder *dec; * size = opus_decoder_get_size(channels); * dec = malloc(size); * error = opus_decoder_init(dec, Fs, channels); * @endcode * where opus_decoder_get_size() returns the required size for the decoder state. Note that * future versions of this code may change the size, so no assuptions should be made about it. * * The decoder state is always continuous in memory and only a shallow copy is sufficient * to copy it (e.g. memcpy()) * * To decode a frame, opus_decode() or opus_decode_float() must be called with a packet of compressed audio data: * @code * frame_size = opus_decode(dec, packet, len, decoded, max_size, 0); * @endcode * where * * @li packet is the byte array containing the compressed data * @li len is the exact number of bytes contained in the packet * @li decoded is the decoded audio data in opus_int16 (or float for opus_decode_float()) * @li max_size is the max duration of the frame in samples (per channel) that can fit into the decoded_frame array * * opus_decode() and opus_decode_float() return the number of samples (per channel) decoded from the packet. * If that value is negative, then an error has occurred. This can occur if the packet is corrupted or if the audio * buffer is too small to hold the decoded audio. * * Opus is a stateful codec with overlapping blocks and as a result Opus * packets are not coded independently of each other. Packets must be * passed into the decoder serially and in the correct order for a correct * decode. Lost packets can be replaced with loss concealment by calling * the decoder with a null pointer and zero length for the missing packet. * * A single codec state may only be accessed from a single thread at * a time and any required locking must be performed by the caller. Separate * streams must be decoded with separate decoder states and can be decoded * in parallel unless the library was compiled with NONTHREADSAFE_PSEUDOSTACK * defined. * */ /** Opus decoder state. * This contains the complete state of an Opus decoder. * It is position independent and can be freely copied. * @see opus_decoder_create,opus_decoder_init */ typedef struct OpusDecoder OpusDecoder; /** Gets the size of an OpusDecoder structure. * @param [in] channels int: Number of channels. * This must be 1 or 2. * @returns The size in bytes. */ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decoder_get_size(int channels); /** Allocates and initializes a decoder state. * @param [in] Fs opus_int32: Sample rate to decode at (Hz). * This must be one of 8000, 12000, 16000, * 24000, or 48000. * @param [in] channels int: Number of channels (1 or 2) to decode * @param [out] error int*: #OPUS_OK Success or @ref opus_errorcodes * * Internally Opus stores data at 48000 Hz, so that should be the default * value for Fs. However, the decoder can efficiently decode to buffers * at 8, 12, 16, and 24 kHz so if for some reason the caller cannot use * data at the full sample rate, or knows the compressed data doesn't * use the full frequency range, it can request decoding at a reduced * rate. Likewise, the decoder is capable of filling in either mono or * interleaved stereo pcm buffers, at the caller's request. */ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusDecoder *opus_decoder_create( opus_int32 Fs, int channels, int *error ); /** Initializes a previously allocated decoder state. * The state must be at least the size returned by opus_decoder_get_size(). * This is intended for applications which use their own allocator instead of malloc. @see opus_decoder_create,opus_decoder_get_size * To reset a previously initialized state, use the #OPUS_RESET_STATE CTL. * @param [in] st OpusDecoder*: Decoder state. * @param [in] Fs opus_int32: Sampling rate to decode to (Hz). * This must be one of 8000, 12000, 16000, * 24000, or 48000. * @param [in] channels int: Number of channels (1 or 2) to decode * @retval #OPUS_OK Success or @ref opus_errorcodes */ OPUS_EXPORT int opus_decoder_init( OpusDecoder *st, opus_int32 Fs, int channels ) OPUS_ARG_NONNULL(1); /** Decode an Opus packet. * @param [in] st OpusDecoder*: Decoder state * @param [in] data char*: Input payload. Use a NULL pointer to indicate packet loss * @param [in] len opus_int32: Number of bytes in payload* * @param [out] pcm opus_int16*: Output signal (interleaved if 2 channels). length * is frame_size*channels*sizeof(opus_int16) * @param [in] frame_size Number of samples per channel of available space in \a pcm. * If this is less than the maximum packet duration (120ms; 5760 for 48kHz), this function will * not be capable of decoding some packets. In the case of PLC (data==NULL) or FEC (decode_fec=1), * then frame_size needs to be exactly the duration of audio that is missing, otherwise the * decoder will not be in the optimal state to decode the next incoming packet. For the PLC and * FEC cases, frame_size must be a multiple of 2.5 ms. * @param [in] decode_fec int: Flag (0 or 1) to request that any in-band forward error correction data be * decoded. If no such data is available, the frame is decoded as if it were lost. * @returns Number of decoded samples or @ref opus_errorcodes */ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decode( OpusDecoder *st, const unsigned char *data, opus_int32 len, opus_int16 *pcm, int frame_size, int decode_fec ) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); /** Decode an Opus packet with floating point output. * @param [in] st OpusDecoder*: Decoder state * @param [in] data char*: Input payload. Use a NULL pointer to indicate packet loss * @param [in] len opus_int32: Number of bytes in payload * @param [out] pcm float*: Output signal (interleaved if 2 channels). length * is frame_size*channels*sizeof(float) * @param [in] frame_size Number of samples per channel of available space in \a pcm. * If this is less than the maximum packet duration (120ms; 5760 for 48kHz), this function will * not be capable of decoding some packets. In the case of PLC (data==NULL) or FEC (decode_fec=1), * then frame_size needs to be exactly the duration of audio that is missing, otherwise the * decoder will not be in the optimal state to decode the next incoming packet. For the PLC and * FEC cases, frame_size must be a multiple of 2.5 ms. * @param [in] decode_fec int: Flag (0 or 1) to request that any in-band forward error correction data be * decoded. If no such data is available the frame is decoded as if it were lost. * @returns Number of decoded samples or @ref opus_errorcodes */ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decode_float( OpusDecoder *st, const unsigned char *data, opus_int32 len, float *pcm, int frame_size, int decode_fec ) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); /** Perform a CTL function on an Opus decoder. * * Generally the request and subsequent arguments are generated * by a convenience macro. * @param st OpusDecoder*: Decoder state. * @param request This and all remaining parameters should be replaced by one * of the convenience macros in @ref opus_genericctls or * @ref opus_decoderctls. * @see opus_genericctls * @see opus_decoderctls */ OPUS_EXPORT int opus_decoder_ctl(OpusDecoder *st, int request, ...) OPUS_ARG_NONNULL(1); /** Frees an OpusDecoder allocated by opus_decoder_create(). * @param[in] st OpusDecoder*: State to be freed. */ OPUS_EXPORT void opus_decoder_destroy(OpusDecoder *st); /** Parse an opus packet into one or more frames. * Opus_decode will perform this operation internally so most applications do * not need to use this function. * This function does not copy the frames, the returned pointers are pointers into * the input packet. * @param [in] data char*: Opus packet to be parsed * @param [in] len opus_int32: size of data * @param [out] out_toc char*: TOC pointer * @param [out] frames char*[48] encapsulated frames * @param [out] size opus_int16[48] sizes of the encapsulated frames * @param [out] payload_offset int*: returns the position of the payload within the packet (in bytes) * @returns number of frames */ OPUS_EXPORT int opus_packet_parse( const unsigned char *data, opus_int32 len, unsigned char *out_toc, const unsigned char *frames[48], opus_int16 size[48], int *payload_offset ) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); /** Gets the bandwidth of an Opus packet. * @param [in] data char*: Opus packet * @retval OPUS_BANDWIDTH_NARROWBAND Narrowband (4kHz bandpass) * @retval OPUS_BANDWIDTH_MEDIUMBAND Mediumband (6kHz bandpass) * @retval OPUS_BANDWIDTH_WIDEBAND Wideband (8kHz bandpass) * @retval OPUS_BANDWIDTH_SUPERWIDEBAND Superwideband (12kHz bandpass) * @retval OPUS_BANDWIDTH_FULLBAND Fullband (20kHz bandpass) * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type */ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_bandwidth(const unsigned char *data) OPUS_ARG_NONNULL(1); /** Gets the number of samples per frame from an Opus packet. * @param [in] data char*: Opus packet. * This must contain at least one byte of * data. * @param [in] Fs opus_int32: Sampling rate in Hz. * This must be a multiple of 400, or * inaccurate results will be returned. * @returns Number of samples per frame. */ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_samples_per_frame(const unsigned char *data, opus_int32 Fs) OPUS_ARG_NONNULL(1); /** Gets the number of channels from an Opus packet. * @param [in] data char*: Opus packet * @returns Number of channels * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type */ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_nb_channels(const unsigned char *data) OPUS_ARG_NONNULL(1); /** Gets the number of frames in an Opus packet. * @param [in] packet char*: Opus packet * @param [in] len opus_int32: Length of packet * @returns Number of frames * @retval OPUS_BAD_ARG Insufficient data was passed to the function * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type */ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_nb_frames(const unsigned char packet[], opus_int32 len) OPUS_ARG_NONNULL(1); /** Gets the number of samples of an Opus packet. * @param [in] packet char*: Opus packet * @param [in] len opus_int32: Length of packet * @param [in] Fs opus_int32: Sampling rate in Hz. * This must be a multiple of 400, or * inaccurate results will be returned. * @returns Number of samples * @retval OPUS_BAD_ARG Insufficient data was passed to the function * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type */ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_nb_samples(const unsigned char packet[], opus_int32 len, opus_int32 Fs) OPUS_ARG_NONNULL(1); /** Gets the number of samples of an Opus packet. * @param [in] dec OpusDecoder*: Decoder state * @param [in] packet char*: Opus packet * @param [in] len opus_int32: Length of packet * @returns Number of samples * @retval OPUS_BAD_ARG Insufficient data was passed to the function * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type */ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decoder_get_nb_samples(const OpusDecoder *dec, const unsigned char packet[], opus_int32 len) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2); /** Applies soft-clipping to bring a float signal within the [-1,1] range. If * the signal is already in that range, nothing is done. If there are values * outside of [-1,1], then the signal is clipped as smoothly as possible to * both fit in the range and avoid creating excessive distortion in the * process. * @param [in,out] pcm float*: Input PCM and modified PCM * @param [in] frame_size int Number of samples per channel to process * @param [in] channels int: Number of channels * @param [in,out] softclip_mem float*: State memory for the soft clipping process (one float per channel, initialized to zero) */ OPUS_EXPORT void opus_pcm_soft_clip(float *pcm, int frame_size, int channels, float *softclip_mem); /**@}*/ /** @defgroup opus_repacketizer Repacketizer * @{ * * The repacketizer can be used to merge multiple Opus packets into a single * packet or alternatively to split Opus packets that have previously been * merged. Splitting valid Opus packets is always guaranteed to succeed, * whereas merging valid packets only succeeds if all frames have the same * mode, bandwidth, and frame size, and when the total duration of the merged * packet is no more than 120 ms. The 120 ms limit comes from the * specification and limits decoder memory requirements at a point where * framing overhead becomes negligible. * * The repacketizer currently only operates on elementary Opus * streams. It will not manipualte multistream packets successfully, except in * the degenerate case where they consist of data from a single stream. * * The repacketizing process starts with creating a repacketizer state, either * by calling opus_repacketizer_create() or by allocating the memory yourself, * e.g., * @code * OpusRepacketizer *rp; * rp = (OpusRepacketizer*)malloc(opus_repacketizer_get_size()); * if (rp != NULL) * opus_repacketizer_init(rp); * @endcode * * Then the application should submit packets with opus_repacketizer_cat(), * extract new packets with opus_repacketizer_out() or * opus_repacketizer_out_range(), and then reset the state for the next set of * input packets via opus_repacketizer_init(). * * For example, to split a sequence of packets into individual frames: * @code * unsigned char *data; * int len; * while (get_next_packet(&data, &len)) * { * unsigned char out[1276]; * opus_int32 out_len; * int nb_frames; * int err; * int i; * err = opus_repacketizer_cat(rp, data, len); * if (err != OPUS_OK) * { * release_packet(data); * return err; * } * nb_frames = opus_repacketizer_get_nb_frames(rp); * for (i = 0; i < nb_frames; i++) * { * out_len = opus_repacketizer_out_range(rp, i, i+1, out, sizeof(out)); * if (out_len < 0) * { * release_packet(data); * return (int)out_len; * } * output_next_packet(out, out_len); * } * opus_repacketizer_init(rp); * release_packet(data); * } * @endcode * * Alternatively, to combine a sequence of frames into packets that each * contain up to TARGET_DURATION_MS milliseconds of data: * @code * // The maximum number of packets with duration TARGET_DURATION_MS occurs * // when the frame size is 2.5 ms, for a total of (TARGET_DURATION_MS*2/5) * // packets. * unsigned char *data[(TARGET_DURATION_MS*2/5)+1]; * opus_int32 len[(TARGET_DURATION_MS*2/5)+1]; * int nb_packets; * unsigned char out[1277*(TARGET_DURATION_MS*2/2)]; * opus_int32 out_len; * int prev_toc; * nb_packets = 0; * while (get_next_packet(data+nb_packets, len+nb_packets)) * { * int nb_frames; * int err; * nb_frames = opus_packet_get_nb_frames(data[nb_packets], len[nb_packets]); * if (nb_frames < 1) * { * release_packets(data, nb_packets+1); * return nb_frames; * } * nb_frames += opus_repacketizer_get_nb_frames(rp); * // If adding the next packet would exceed our target, or it has an * // incompatible TOC sequence, output the packets we already have before * // submitting it. * // N.B., The nb_packets > 0 check ensures we've submitted at least one * // packet since the last call to opus_repacketizer_init(). Otherwise a * // single packet longer than TARGET_DURATION_MS would cause us to try to * // output an (invalid) empty packet. It also ensures that prev_toc has * // been set to a valid value. Additionally, len[nb_packets] > 0 is * // guaranteed by the call to opus_packet_get_nb_frames() above, so the * // reference to data[nb_packets][0] should be valid. * if (nb_packets > 0 && ( * ((prev_toc & 0xFC) != (data[nb_packets][0] & 0xFC)) || * opus_packet_get_samples_per_frame(data[nb_packets], 48000)*nb_frames > * TARGET_DURATION_MS*48)) * { * out_len = opus_repacketizer_out(rp, out, sizeof(out)); * if (out_len < 0) * { * release_packets(data, nb_packets+1); * return (int)out_len; * } * output_next_packet(out, out_len); * opus_repacketizer_init(rp); * release_packets(data, nb_packets); * data[0] = data[nb_packets]; * len[0] = len[nb_packets]; * nb_packets = 0; * } * err = opus_repacketizer_cat(rp, data[nb_packets], len[nb_packets]); * if (err != OPUS_OK) * { * release_packets(data, nb_packets+1); * return err; * } * prev_toc = data[nb_packets][0]; * nb_packets++; * } * // Output the final, partial packet. * if (nb_packets > 0) * { * out_len = opus_repacketizer_out(rp, out, sizeof(out)); * release_packets(data, nb_packets); * if (out_len < 0) * return (int)out_len; * output_next_packet(out, out_len); * } * @endcode * * An alternate way of merging packets is to simply call opus_repacketizer_cat() * unconditionally until it fails. At that point, the merged packet can be * obtained with opus_repacketizer_out() and the input packet for which * opus_repacketizer_cat() needs to be re-added to a newly reinitialized * repacketizer state. */ typedef struct OpusRepacketizer OpusRepacketizer; /** Gets the size of an OpusRepacketizer structure. * @returns The size in bytes. */ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_repacketizer_get_size(void); /** (Re)initializes a previously allocated repacketizer state. * The state must be at least the size returned by opus_repacketizer_get_size(). * This can be used for applications which use their own allocator instead of * malloc(). * It must also be called to reset the queue of packets waiting to be * repacketized, which is necessary if the maximum packet duration of 120 ms * is reached or if you wish to submit packets with a different Opus * configuration (coding mode, audio bandwidth, frame size, or channel count). * Failure to do so will prevent a new packet from being added with * opus_repacketizer_cat(). * @see opus_repacketizer_create * @see opus_repacketizer_get_size * @see opus_repacketizer_cat * @param rp OpusRepacketizer*: The repacketizer state to * (re)initialize. * @returns A pointer to the same repacketizer state that was passed in. */ OPUS_EXPORT OpusRepacketizer *opus_repacketizer_init(OpusRepacketizer *rp) OPUS_ARG_NONNULL(1); /** Allocates memory and initializes the new repacketizer with * opus_repacketizer_init(). */ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusRepacketizer *opus_repacketizer_create(void); /** Frees an OpusRepacketizer allocated by * opus_repacketizer_create(). * @param[in] rp OpusRepacketizer*: State to be freed. */ OPUS_EXPORT void opus_repacketizer_destroy(OpusRepacketizer *rp); /** Add a packet to the current repacketizer state. * This packet must match the configuration of any packets already submitted * for repacketization since the last call to opus_repacketizer_init(). * This means that it must have the same coding mode, audio bandwidth, frame * size, and channel count. * This can be checked in advance by examining the top 6 bits of the first * byte of the packet, and ensuring they match the top 6 bits of the first * byte of any previously submitted packet. * The total duration of audio in the repacketizer state also must not exceed * 120 ms, the maximum duration of a single packet, after adding this packet. * * The contents of the current repacketizer state can be extracted into new * packets using opus_repacketizer_out() or opus_repacketizer_out_range(). * * In order to add a packet with a different configuration or to add more * audio beyond 120 ms, you must clear the repacketizer state by calling * opus_repacketizer_init(). * If a packet is too large to add to the current repacketizer state, no part * of it is added, even if it contains multiple frames, some of which might * fit. * If you wish to be able to add parts of such packets, you should first use * another repacketizer to split the packet into pieces and add them * individually. * @see opus_repacketizer_out_range * @see opus_repacketizer_out * @see opus_repacketizer_init * @param rp OpusRepacketizer*: The repacketizer state to which to * add the packet. * @param[in] data const unsigned char*: The packet data. * The application must ensure * this pointer remains valid * until the next call to * opus_repacketizer_init() or * opus_repacketizer_destroy(). * @param len opus_int32: The number of bytes in the packet data. * @returns An error code indicating whether or not the operation succeeded. * @retval #OPUS_OK The packet's contents have been added to the repacketizer * state. * @retval #OPUS_INVALID_PACKET The packet did not have a valid TOC sequence, * the packet's TOC sequence was not compatible * with previously submitted packets (because * the coding mode, audio bandwidth, frame size, * or channel count did not match), or adding * this packet would increase the total amount of * audio stored in the repacketizer state to more * than 120 ms. */ OPUS_EXPORT int opus_repacketizer_cat(OpusRepacketizer *rp, const unsigned char *data, opus_int32 len) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2); /** Construct a new packet from data previously submitted to the repacketizer * state via opus_repacketizer_cat(). * @param rp OpusRepacketizer*: The repacketizer state from which to * construct the new packet. * @param begin int: The index of the first frame in the current * repacketizer state to include in the output. * @param end int: One past the index of the last frame in the * current repacketizer state to include in the * output. * @param[out] data const unsigned char*: The buffer in which to * store the output packet. * @param maxlen opus_int32: The maximum number of bytes to store in * the output buffer. In order to guarantee * success, this should be at least * 1276 for a single frame, * or for multiple frames, * 1277*(end-begin). * However, 1*(end-begin) plus * the size of all packet data submitted to * the repacketizer since the last call to * opus_repacketizer_init() or * opus_repacketizer_create() is also * sufficient, and possibly much smaller. * @returns The total size of the output packet on success, or an error code * on failure. * @retval #OPUS_BAD_ARG [begin,end) was an invalid range of * frames (begin < 0, begin >= end, or end > * opus_repacketizer_get_nb_frames()). * @retval #OPUS_BUFFER_TOO_SMALL \a maxlen was insufficient to contain the * complete output packet. */ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_repacketizer_out_range(OpusRepacketizer *rp, int begin, int end, unsigned char *data, opus_int32 maxlen) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); /** Return the total number of frames contained in packet data submitted to * the repacketizer state so far via opus_repacketizer_cat() since the last * call to opus_repacketizer_init() or opus_repacketizer_create(). * This defines the valid range of packets that can be extracted with * opus_repacketizer_out_range() or opus_repacketizer_out(). * @param rp OpusRepacketizer*: The repacketizer state containing the * frames. * @returns The total number of frames contained in the packet data submitted * to the repacketizer state. */ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_repacketizer_get_nb_frames(OpusRepacketizer *rp) OPUS_ARG_NONNULL(1); /** Construct a new packet from data previously submitted to the repacketizer * state via opus_repacketizer_cat(). * This is a convenience routine that returns all the data submitted so far * in a single packet. * It is equivalent to calling * @code * opus_repacketizer_out_range(rp, 0, opus_repacketizer_get_nb_frames(rp), * data, maxlen) * @endcode * @param rp OpusRepacketizer*: The repacketizer state from which to * construct the new packet. * @param[out] data const unsigned char*: The buffer in which to * store the output packet. * @param maxlen opus_int32: The maximum number of bytes to store in * the output buffer. In order to guarantee * success, this should be at least * 1277*opus_repacketizer_get_nb_frames(rp). * However, * 1*opus_repacketizer_get_nb_frames(rp) * plus the size of all packet data * submitted to the repacketizer since the * last call to opus_repacketizer_init() or * opus_repacketizer_create() is also * sufficient, and possibly much smaller. * @returns The total size of the output packet on success, or an error code * on failure. * @retval #OPUS_BUFFER_TOO_SMALL \a maxlen was insufficient to contain the * complete output packet. */ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_repacketizer_out(OpusRepacketizer *rp, unsigned char *data, opus_int32 maxlen) OPUS_ARG_NONNULL(1); /** Pads a given Opus packet to a larger size (possibly changing the TOC sequence). * @param[in,out] data const unsigned char*: The buffer containing the * packet to pad. * @param len opus_int32: The size of the packet. * This must be at least 1. * @param new_len opus_int32: The desired size of the packet after padding. * This must be at least as large as len. * @returns an error code * @retval #OPUS_OK \a on success. * @retval #OPUS_BAD_ARG \a len was less than 1 or new_len was less than len. * @retval #OPUS_INVALID_PACKET \a data did not contain a valid Opus packet. */ OPUS_EXPORT int opus_packet_pad(unsigned char *data, opus_int32 len, opus_int32 new_len); /** Remove all padding from a given Opus packet and rewrite the TOC sequence to * minimize space usage. * @param[in,out] data const unsigned char*: The buffer containing the * packet to strip. * @param len opus_int32: The size of the packet. * This must be at least 1. * @returns The new size of the output packet on success, or an error code * on failure. * @retval #OPUS_BAD_ARG \a len was less than 1. * @retval #OPUS_INVALID_PACKET \a data did not contain a valid Opus packet. */ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_packet_unpad(unsigned char *data, opus_int32 len); /** Pads a given Opus multi-stream packet to a larger size (possibly changing the TOC sequence). * @param[in,out] data const unsigned char*: The buffer containing the * packet to pad. * @param len opus_int32: The size of the packet. * This must be at least 1. * @param new_len opus_int32: The desired size of the packet after padding. * This must be at least 1. * @param nb_streams opus_int32: The number of streams (not channels) in the packet. * This must be at least as large as len. * @returns an error code * @retval #OPUS_OK \a on success. * @retval #OPUS_BAD_ARG \a len was less than 1. * @retval #OPUS_INVALID_PACKET \a data did not contain a valid Opus packet. */ OPUS_EXPORT int opus_multistream_packet_pad(unsigned char *data, opus_int32 len, opus_int32 new_len, int nb_streams); /** Remove all padding from a given Opus multi-stream packet and rewrite the TOC sequence to * minimize space usage. * @param[in,out] data const unsigned char*: The buffer containing the * packet to strip. * @param len opus_int32: The size of the packet. * This must be at least 1. * @param nb_streams opus_int32: The number of streams (not channels) in the packet. * This must be at least 1. * @returns The new size of the output packet on success, or an error code * on failure. * @retval #OPUS_BAD_ARG \a len was less than 1 or new_len was less than len. * @retval #OPUS_INVALID_PACKET \a data did not contain a valid Opus packet. */ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_multistream_packet_unpad(unsigned char *data, opus_int32 len, int nb_streams); /**@}*/ #ifdef __cplusplus } #endif #endif /* OPUS_H */ mumble-1.3.4/3rdparty/opus-src/tests/0000775000175000017500000000000014010707327017326 5ustar builderbuildermumble-1.3.4/3rdparty/opus-src/tests/test_opus_padding.c0000664000175000017500000000525714010707327023216 0ustar builderbuilder/* Copyright (c) 2012 Xiph.Org Foundation Written by Jüri Aedla and Ralph Giles */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* Check for overflow in reading the padding length. * http://lists.xiph.org/pipermail/opus/2012-November/001834.html */ #include #include #include #include "opus.h" #include "test_opus_common.h" #define PACKETSIZE 16909318 #define CHANNELS 2 #define FRAMESIZE 5760 int test_overflow(void) { OpusDecoder *decoder; int result; int error; unsigned char *in = malloc(PACKETSIZE); opus_int16 *out = malloc(FRAMESIZE*CHANNELS*sizeof(*out)); fprintf(stderr, " Checking for padding overflow... "); if (!in || !out) { fprintf(stderr, "FAIL (out of memory)\n"); return -1; } in[0] = 0xff; in[1] = 0x41; memset(in + 2, 0xff, PACKETSIZE - 3); in[PACKETSIZE-1] = 0x0b; decoder = opus_decoder_create(48000, CHANNELS, &error); result = opus_decode(decoder, in, PACKETSIZE, out, FRAMESIZE, 0); opus_decoder_destroy(decoder); free(in); free(out); if (result != OPUS_INVALID_PACKET) { fprintf(stderr, "FAIL!\n"); test_failed(); } fprintf(stderr, "OK.\n"); return 1; } int main(void) { const char *oversion; int tests = 0;; iseed = 0; oversion = opus_get_version_string(); if (!oversion) test_failed(); fprintf(stderr, "Testing %s padding.\n", oversion); tests += test_overflow(); fprintf(stderr, "All padding tests passed.\n"); return 0; } mumble-1.3.4/3rdparty/opus-src/tests/test_opus_decode.c0000664000175000017500000003725114010707327023032 0ustar builderbuilder/* Copyright (c) 2011-2013 Xiph.Org Foundation Written by Gregory Maxwell */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #if (!defined WIN32 && !defined _WIN32) || defined(__MINGW32__) #include #else #include #define getpid _getpid #endif #include "opus.h" #include "test_opus_common.h" #define MAX_PACKET (1500) #define MAX_FRAME_SAMP (5760) int test_decoder_code0(int no_fuzz) { static const opus_int32 fsv[5]={48000,24000,16000,12000,8000}; int err,skip,plen; int out_samples,fec; int t; opus_int32 i; OpusDecoder *dec[5*2]; opus_int32 decsize; OpusDecoder *decbak; opus_uint32 dec_final_range1,dec_final_range2,dec_final_acc; unsigned char *packet; unsigned char modes[4096]; short *outbuf_int; short *outbuf; dec_final_range1=dec_final_range2=2; packet=malloc(sizeof(unsigned char)*MAX_PACKET); if(packet==NULL)test_failed(); outbuf_int=malloc(sizeof(short)*(MAX_FRAME_SAMP+16)*2); for(i=0;i<(MAX_FRAME_SAMP+16)*2;i++)outbuf_int[i]=32749; outbuf=&outbuf_int[8*2]; fprintf(stdout," Starting %d decoders...\n",5*2); for(t=0;t<5*2;t++) { int fs=fsv[t>>1]; int c=(t&1)+1; err=OPUS_INTERNAL_ERROR; dec[t] = opus_decoder_create(fs, c, &err); if(err!=OPUS_OK || dec[t]==NULL)test_failed(); fprintf(stdout," opus_decoder_create(%5d,%d) OK. Copy ",fs,c); { OpusDecoder *dec2; /*The opus state structures contain no pointers and can be freely copied*/ dec2=(OpusDecoder *)malloc(opus_decoder_get_size(c)); if(dec2==NULL)test_failed(); memcpy(dec2,dec[t],opus_decoder_get_size(c)); memset(dec[t],255,opus_decoder_get_size(c)); opus_decoder_destroy(dec[t]); printf("OK.\n"); dec[t]=dec2; } } decsize=opus_decoder_get_size(1); decbak=(OpusDecoder *)malloc(decsize); if(decbak==NULL)test_failed(); for(t=0;t<5*2;t++) { int factor=48000/fsv[t>>1]; for(fec=0;fec<2;fec++) { opus_int32 dur; /*Test PLC on a fresh decoder*/ out_samples = opus_decode(dec[t], 0, 0, outbuf, 120/factor, fec); if(out_samples!=120/factor)test_failed(); if(opus_decoder_ctl(dec[t], OPUS_GET_LAST_PACKET_DURATION(&dur))!=OPUS_OK)test_failed(); if(dur!=120/factor)test_failed(); /*Test on a size which isn't a multiple of 2.5ms*/ out_samples = opus_decode(dec[t], 0, 0, outbuf, 120/factor+2, fec); if(out_samples!=OPUS_BAD_ARG)test_failed(); /*Test null pointer input*/ out_samples = opus_decode(dec[t], 0, -1, outbuf, 120/factor, fec); if(out_samples!=120/factor)test_failed(); out_samples = opus_decode(dec[t], 0, 1, outbuf, 120/factor, fec); if(out_samples!=120/factor)test_failed(); out_samples = opus_decode(dec[t], 0, 10, outbuf, 120/factor, fec); if(out_samples!=120/factor)test_failed(); out_samples = opus_decode(dec[t], 0, fast_rand(), outbuf, 120/factor, fec); if(out_samples!=120/factor)test_failed(); if(opus_decoder_ctl(dec[t], OPUS_GET_LAST_PACKET_DURATION(&dur))!=OPUS_OK)test_failed(); if(dur!=120/factor)test_failed(); /*Zero lengths*/ out_samples = opus_decode(dec[t], packet, 0, outbuf, 120/factor, fec); if(out_samples!=120/factor)test_failed(); /*Zero buffer*/ outbuf[0]=32749; out_samples = opus_decode(dec[t], packet, 0, outbuf, 0, fec); if(out_samples>0)test_failed(); #if !defined(OPUS_BUILD) && (OPUS_GNUC_PREREQ(4, 6) || (defined(__clang_major__) && __clang_major__ >= 3)) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wnonnull" #endif out_samples = opus_decode(dec[t], packet, 0, 0, 0, fec); #if !defined(OPUS_BUILD) && (OPUS_GNUC_PREREQ(4, 6) || (defined(__clang_major__) && __clang_major__ >= 3)) #pragma GCC diagnostic pop #endif if(out_samples>0)test_failed(); if(outbuf[0]!=32749)test_failed(); /*Invalid lengths*/ out_samples = opus_decode(dec[t], packet, -1, outbuf, MAX_FRAME_SAMP, fec); if(out_samples>=0)test_failed(); out_samples = opus_decode(dec[t], packet, INT_MIN, outbuf, MAX_FRAME_SAMP, fec); if(out_samples>=0)test_failed(); out_samples = opus_decode(dec[t], packet, -1, outbuf, -1, fec); if(out_samples>=0)test_failed(); /*Crazy FEC values*/ out_samples = opus_decode(dec[t], packet, 1, outbuf, MAX_FRAME_SAMP, fec?-1:2); if(out_samples>=0)test_failed(); /*Reset the decoder*/ if(opus_decoder_ctl(dec[t], OPUS_RESET_STATE)!=OPUS_OK)test_failed(); } } fprintf(stdout," dec[all] initial frame PLC OK.\n"); /*Count code 0 tests*/ for(i=0;i<64;i++) { opus_int32 dur; int j,expected[5*2]; packet[0]=i<<2; packet[1]=255; packet[2]=255; err=opus_packet_get_nb_channels(packet); if(err!=(i&1)+1)test_failed(); for(t=0;t<5*2;t++){ expected[t]=opus_decoder_get_nb_samples(dec[t],packet,1); if(expected[t]>2880)test_failed(); } for(j=0;j<256;j++) { packet[1]=j; for(t=0;t<5*2;t++) { out_samples = opus_decode(dec[t], packet, 3, outbuf, MAX_FRAME_SAMP, 0); if(out_samples!=expected[t])test_failed(); if(opus_decoder_ctl(dec[t], OPUS_GET_LAST_PACKET_DURATION(&dur))!=OPUS_OK)test_failed(); if(dur!=out_samples)test_failed(); opus_decoder_ctl(dec[t], OPUS_GET_FINAL_RANGE(&dec_final_range1)); if(t==0)dec_final_range2=dec_final_range1; else if(dec_final_range1!=dec_final_range2)test_failed(); } } for(t=0;t<5*2;t++){ int factor=48000/fsv[t>>1]; /* The PLC is run for 6 frames in order to get better PLC coverage. */ for(j=0;j<6;j++) { out_samples = opus_decode(dec[t], 0, 0, outbuf, expected[t], 0); if(out_samples!=expected[t])test_failed(); if(opus_decoder_ctl(dec[t], OPUS_GET_LAST_PACKET_DURATION(&dur))!=OPUS_OK)test_failed(); if(dur!=out_samples)test_failed(); } /* Run the PLC once at 2.5ms, as a simulation of someone trying to do small drift corrections. */ if(expected[t]!=120/factor) { out_samples = opus_decode(dec[t], 0, 0, outbuf, 120/factor, 0); if(out_samples!=120/factor)test_failed(); if(opus_decoder_ctl(dec[t], OPUS_GET_LAST_PACKET_DURATION(&dur))!=OPUS_OK)test_failed(); if(dur!=out_samples)test_failed(); } out_samples = opus_decode(dec[t], packet, 2, outbuf, expected[t]-1, 0); if(out_samples>0)test_failed(); } } fprintf(stdout," dec[all] all 2-byte prefix for length 3 and PLC, all modes (64) OK.\n"); if(no_fuzz) { fprintf(stdout," Skipping many tests which fuzz the decoder as requested.\n"); free(decbak); for(t=0;t<5*2;t++)opus_decoder_destroy(dec[t]); printf(" Decoders stopped.\n"); err=0; for(i=0;i<8*2;i++)err|=outbuf_int[i]!=32749; for(i=MAX_FRAME_SAMP*2;i<(MAX_FRAME_SAMP+8)*2;i++)err|=outbuf[i]!=32749; if(err)test_failed(); free(outbuf_int); free(packet); return 0; } { /*We only test a subset of the modes here simply because the longer durations end up taking a long time.*/ static const int cmodes[4]={16,20,24,28}; static const opus_uint32 cres[4]={116290185,2172123586u,2172123586u,2172123586u}; static const opus_uint32 lres[3]={3285687739u,1481572662,694350475}; static const int lmodes[3]={0,4,8}; int mode=fast_rand()%4; packet[0]=cmodes[mode]<<3; dec_final_acc=0; t=fast_rand()%10; for(i=0;i<65536;i++) { int factor=48000/fsv[t>>1]; packet[1]=i>>8; packet[2]=i&255; packet[3]=255; out_samples = opus_decode(dec[t], packet, 4, outbuf, MAX_FRAME_SAMP, 0); if(out_samples!=120/factor)test_failed(); opus_decoder_ctl(dec[t], OPUS_GET_FINAL_RANGE(&dec_final_range1)); dec_final_acc+=dec_final_range1; } if(dec_final_acc!=cres[mode])test_failed(); fprintf(stdout," dec[%3d] all 3-byte prefix for length 4, mode %2d OK.\n",t,cmodes[mode]); mode=fast_rand()%3; packet[0]=lmodes[mode]<<3; dec_final_acc=0; t=fast_rand()%10; for(i=0;i<65536;i++) { int factor=48000/fsv[t>>1]; packet[1]=i>>8; packet[2]=i&255; packet[3]=255; out_samples = opus_decode(dec[t], packet, 4, outbuf, MAX_FRAME_SAMP, 0); if(out_samples!=480/factor)test_failed(); opus_decoder_ctl(dec[t], OPUS_GET_FINAL_RANGE(&dec_final_range1)); dec_final_acc+=dec_final_range1; } if(dec_final_acc!=lres[mode])test_failed(); fprintf(stdout," dec[%3d] all 3-byte prefix for length 4, mode %2d OK.\n",t,lmodes[mode]); } skip=fast_rand()%7; for(i=0;i<64;i++) { int j,expected[5*2]; packet[0]=i<<2; for(t=0;t<5*2;t++)expected[t]=opus_decoder_get_nb_samples(dec[t],packet,1); for(j=2+skip;j<1275;j+=4) { int jj; for(jj=0;jj1.f)test_failed(); if(x[j]<-1.f)test_failed(); } } for(i=1;i<9;i++) { for (j=0;j<1024;j++) { x[j]=(j&255)*(1/32.f)-4.f; } opus_pcm_soft_clip(x,1024/i,i,s); for (j=0;j<(1024/i)*i;j++) { if(x[j]>1.f)test_failed(); if(x[j]<-1.f)test_failed(); } } opus_pcm_soft_clip(x,0,1,s); opus_pcm_soft_clip(x,1,0,s); opus_pcm_soft_clip(x,1,1,0); opus_pcm_soft_clip(x,1,-1,s); opus_pcm_soft_clip(x,-1,1,s); opus_pcm_soft_clip(0,1,1,s); printf("OK.\n"); } #endif int main(int _argc, char **_argv) { const char * oversion; const char * env_seed; int env_used; if(_argc>2) { fprintf(stderr,"Usage: %s []\n",_argv[0]); return 1; } env_used=0; env_seed=getenv("SEED"); if(_argc>1)iseed=atoi(_argv[1]); else if(env_seed) { iseed=atoi(env_seed); env_used=1; } else iseed=(opus_uint32)time(NULL)^(((opus_uint32)getpid()&65535)<<16); Rw=Rz=iseed; oversion=opus_get_version_string(); if(!oversion)test_failed(); fprintf(stderr,"Testing %s decoder. Random seed: %u (%.4X)\n", oversion, iseed, fast_rand() % 65535); if(env_used)fprintf(stderr," Random seed set from the environment (SEED=%s).\n", env_seed); /*Setting TEST_OPUS_NOFUZZ tells the tool not to send garbage data into the decoders. This is helpful because garbage data may cause the decoders to clip, which angers CLANG IOC.*/ test_decoder_code0(getenv("TEST_OPUS_NOFUZZ")!=NULL); #ifndef DISABLE_FLOAT_API test_soft_clip(); #endif return 0; } mumble-1.3.4/3rdparty/opus-src/tests/opus_encode_regressions.c0000664000175000017500000017455414010707327024440 0ustar builderbuilder/* Copyright (c) 2016 Mark Harris, Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #include "opus_multistream.h" #include "opus.h" #include "test_opus_common.h" static int celt_ec_internal_error(void) { OpusMSEncoder *enc; int err; unsigned char data[2460]; int streams; int coupled_streams; unsigned char mapping[1]; enc = opus_multistream_surround_encoder_create(16000, 1, 1, &streams, &coupled_streams, mapping, OPUS_APPLICATION_VOIP, &err); opus_multistream_encoder_ctl(enc, OPUS_SET_SIGNAL(OPUS_SIGNAL_MUSIC)); opus_multistream_encoder_ctl(enc, OPUS_SET_VBR(0)); opus_multistream_encoder_ctl(enc, OPUS_SET_VBR_CONSTRAINT(0)); opus_multistream_encoder_ctl(enc, OPUS_SET_PREDICTION_DISABLED(1)); opus_multistream_encoder_ctl(enc, OPUS_SET_PHASE_INVERSION_DISABLED(0)); opus_multistream_encoder_ctl(enc, OPUS_SET_DTX(0)); opus_multistream_encoder_ctl(enc, OPUS_SET_COMPLEXITY(0)); opus_multistream_encoder_ctl(enc, OPUS_SET_MAX_BANDWIDTH(OPUS_BANDWIDTH_NARROWBAND)); opus_multistream_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_AUTO)); opus_multistream_encoder_ctl(enc, OPUS_SET_LSB_DEPTH(8)); opus_multistream_encoder_ctl(enc, OPUS_SET_INBAND_FEC(0)); opus_multistream_encoder_ctl(enc, OPUS_SET_PACKET_LOSS_PERC(0)); opus_multistream_encoder_ctl(enc, OPUS_SET_BITRATE(OPUS_AUTO)); { static const short pcm[320] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1792, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 0, 25600, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 7, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32767, -1, 0, 0, 0, 100, 0, 16384, 0, 0, 0, 0, 0, 0, 4, 0, 0, -256, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-32768, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, -256, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 4352, 4, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5632, 0, 0, 0, 0,-32768, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3944, 10500, 4285, 10459, -6474, 10204, -6539, 11601, -6824, 13385, -7142, 13872,-11553, 13670, -7725, 13463, -6887, 7874, -5580, 12600, -4964, 12480, 3254, 11741, -4210, 9741, -3155, 7558, -5468, 5431, -1073, 3641, -1304, 0, -1, 343, 26, 0, 0, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1799, 1799, 1799, 1799, 1799, -2553, 7, 1792, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, -9721 }; err = opus_multistream_encode(enc, pcm, 320, data, 2460); assert(err > 0); } opus_multistream_encoder_ctl(enc, OPUS_SET_SIGNAL(OPUS_SIGNAL_MUSIC)); opus_multistream_encoder_ctl(enc, OPUS_SET_VBR(0)); opus_multistream_encoder_ctl(enc, OPUS_SET_VBR_CONSTRAINT(1)); opus_multistream_encoder_ctl(enc, OPUS_SET_PREDICTION_DISABLED(1)); opus_multistream_encoder_ctl(enc, OPUS_SET_PHASE_INVERSION_DISABLED(0)); opus_multistream_encoder_ctl(enc, OPUS_SET_DTX(1)); opus_multistream_encoder_ctl(enc, OPUS_SET_COMPLEXITY(10)); opus_multistream_encoder_ctl(enc, OPUS_SET_MAX_BANDWIDTH(OPUS_BANDWIDTH_FULLBAND)); opus_multistream_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_BANDWIDTH_FULLBAND)); opus_multistream_encoder_ctl(enc, OPUS_SET_LSB_DEPTH(18)); opus_multistream_encoder_ctl(enc, OPUS_SET_INBAND_FEC(1)); opus_multistream_encoder_ctl(enc, OPUS_SET_PACKET_LOSS_PERC(90)); opus_multistream_encoder_ctl(enc, OPUS_SET_BITRATE(280130)); { static const short pcm[160] = { -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9526, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, 25600, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510 }; err = opus_multistream_encode(enc, pcm, 160, data, 2460); assert(err > 0); } opus_multistream_encoder_ctl(enc, OPUS_SET_SIGNAL(OPUS_SIGNAL_MUSIC)); opus_multistream_encoder_ctl(enc, OPUS_SET_VBR(0)); opus_multistream_encoder_ctl(enc, OPUS_SET_VBR_CONSTRAINT(1)); opus_multistream_encoder_ctl(enc, OPUS_SET_PREDICTION_DISABLED(1)); opus_multistream_encoder_ctl(enc, OPUS_SET_PHASE_INVERSION_DISABLED(0)); opus_multistream_encoder_ctl(enc, OPUS_SET_DTX(1)); opus_multistream_encoder_ctl(enc, OPUS_SET_COMPLEXITY(10)); opus_multistream_encoder_ctl(enc, OPUS_SET_MAX_BANDWIDTH(OPUS_BANDWIDTH_FULLBAND)); opus_multistream_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_BANDWIDTH_FULLBAND)); opus_multistream_encoder_ctl(enc, OPUS_SET_LSB_DEPTH(18)); opus_multistream_encoder_ctl(enc, OPUS_SET_INBAND_FEC(1)); opus_multistream_encoder_ctl(enc, OPUS_SET_PACKET_LOSS_PERC(90)); opus_multistream_encoder_ctl(enc, OPUS_SET_BITRATE(280130)); { static const short pcm[160] = { -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9494, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510 }; err = opus_multistream_encode(enc, pcm, 160, data, 2460); assert(err > 0); } opus_multistream_encoder_ctl(enc, OPUS_SET_SIGNAL(OPUS_SIGNAL_MUSIC)); opus_multistream_encoder_ctl(enc, OPUS_SET_VBR(0)); opus_multistream_encoder_ctl(enc, OPUS_SET_VBR_CONSTRAINT(1)); opus_multistream_encoder_ctl(enc, OPUS_SET_PREDICTION_DISABLED(1)); opus_multistream_encoder_ctl(enc, OPUS_SET_PHASE_INVERSION_DISABLED(0)); opus_multistream_encoder_ctl(enc, OPUS_SET_DTX(1)); opus_multistream_encoder_ctl(enc, OPUS_SET_COMPLEXITY(10)); opus_multistream_encoder_ctl(enc, OPUS_SET_MAX_BANDWIDTH(OPUS_BANDWIDTH_FULLBAND)); opus_multistream_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_BANDWIDTH_FULLBAND)); opus_multistream_encoder_ctl(enc, OPUS_SET_LSB_DEPTH(18)); opus_multistream_encoder_ctl(enc, OPUS_SET_INBAND_FEC(1)); opus_multistream_encoder_ctl(enc, OPUS_SET_PACKET_LOSS_PERC(90)); opus_multistream_encoder_ctl(enc, OPUS_SET_BITRATE(280130)); { static const short pcm[160] = { -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9479, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510, -9510 }; err = opus_multistream_encode(enc, pcm, 160, data, 2460); assert(err > 0); } opus_multistream_encoder_ctl(enc, OPUS_SET_SIGNAL(OPUS_SIGNAL_MUSIC)); opus_multistream_encoder_ctl(enc, OPUS_SET_VBR(0)); opus_multistream_encoder_ctl(enc, OPUS_SET_VBR_CONSTRAINT(1)); opus_multistream_encoder_ctl(enc, OPUS_SET_PREDICTION_DISABLED(1)); opus_multistream_encoder_ctl(enc, OPUS_SET_PHASE_INVERSION_DISABLED(0)); opus_multistream_encoder_ctl(enc, OPUS_SET_DTX(1)); opus_multistream_encoder_ctl(enc, OPUS_SET_COMPLEXITY(10)); opus_multistream_encoder_ctl(enc, OPUS_SET_MAX_BANDWIDTH(OPUS_BANDWIDTH_FULLBAND)); opus_multistream_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_BANDWIDTH_FULLBAND)); opus_multistream_encoder_ctl(enc, OPUS_SET_LSB_DEPTH(18)); opus_multistream_encoder_ctl(enc, OPUS_SET_INBAND_FEC(1)); opus_multistream_encoder_ctl(enc, OPUS_SET_PACKET_LOSS_PERC(90)); opus_multistream_encoder_ctl(enc, OPUS_SET_BITRATE(280130)); { static const short pcm[160] = { -9510, -9510, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -256, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 4352, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 148, 0, 0, 0, 0, 5632 }; err = opus_multistream_encode(enc, pcm, 160, data, 2460); assert(err > 0); } opus_multistream_encoder_ctl(enc, OPUS_SET_SIGNAL(OPUS_SIGNAL_VOICE)); opus_multistream_encoder_ctl(enc, OPUS_SET_VBR(0)); opus_multistream_encoder_ctl(enc, OPUS_SET_VBR_CONSTRAINT(1)); opus_multistream_encoder_ctl(enc, OPUS_SET_PREDICTION_DISABLED(1)); opus_multistream_encoder_ctl(enc, OPUS_SET_PHASE_INVERSION_DISABLED(1)); opus_multistream_encoder_ctl(enc, OPUS_SET_DTX(1)); opus_multistream_encoder_ctl(enc, OPUS_SET_COMPLEXITY(0)); opus_multistream_encoder_ctl(enc, OPUS_SET_MAX_BANDWIDTH(OPUS_BANDWIDTH_NARROWBAND)); opus_multistream_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_AUTO)); opus_multistream_encoder_ctl(enc, OPUS_SET_LSB_DEPTH(12)); opus_multistream_encoder_ctl(enc, OPUS_SET_INBAND_FEC(0)); opus_multistream_encoder_ctl(enc, OPUS_SET_PACKET_LOSS_PERC(41)); opus_multistream_encoder_ctl(enc, OPUS_SET_BITRATE(21425)); { static const short pcm[40] = { 10459, -6474, 10204, -6539, 11601, -6824, 13385, -7142, 13872, -11553, 13670, -7725, 13463, -6887, 12482, -5580, 12600, -4964, 12480, 3254, 11741, -4210, 9741, -3155, 7558, -5468, 5431, -1073, 3641, -1304, 0, -1, 343, 26, 0, 0, 0, 0, -256, 226 }; err = opus_multistream_encode(enc, pcm, 40, data, 2460); assert(err > 0); /* returns -3 */ } opus_multistream_encoder_destroy(enc); return 0; } static int mscbr_encode_fail10(void) { OpusMSEncoder *enc; int err; unsigned char data[627300]; static const unsigned char mapping[255] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101, 102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118, 119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135, 136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152, 153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169, 170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186, 187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203, 204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, 221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237, 238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254 }; enc = opus_multistream_encoder_create(8000, 255, 254, 1, mapping, OPUS_APPLICATION_RESTRICTED_LOWDELAY, &err); opus_multistream_encoder_ctl(enc, OPUS_SET_SIGNAL(OPUS_SIGNAL_VOICE)); opus_multistream_encoder_ctl(enc, OPUS_SET_VBR(0)); opus_multistream_encoder_ctl(enc, OPUS_SET_VBR_CONSTRAINT(0)); opus_multistream_encoder_ctl(enc, OPUS_SET_PREDICTION_DISABLED(0)); opus_multistream_encoder_ctl(enc, OPUS_SET_FORCE_CHANNELS(2)); opus_multistream_encoder_ctl(enc, OPUS_SET_PHASE_INVERSION_DISABLED(1)); opus_multistream_encoder_ctl(enc, OPUS_SET_DTX(1)); opus_multistream_encoder_ctl(enc, OPUS_SET_COMPLEXITY(2)); opus_multistream_encoder_ctl(enc, OPUS_SET_MAX_BANDWIDTH(OPUS_BANDWIDTH_NARROWBAND)); opus_multistream_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_AUTO)); opus_multistream_encoder_ctl(enc, OPUS_SET_LSB_DEPTH(14)); opus_multistream_encoder_ctl(enc, OPUS_SET_INBAND_FEC(0)); opus_multistream_encoder_ctl(enc, OPUS_SET_PACKET_LOSS_PERC(57)); opus_multistream_encoder_ctl(enc, OPUS_SET_BITRATE(3642675)); { static const short pcm[20*255] = { 0 }; err = opus_multistream_encode(enc, pcm, 20, data, 627300); assert(err > 0); /* returns -1 */ } opus_multistream_encoder_destroy(enc); return 0; } static int mscbr_encode_fail(void) { OpusMSEncoder *enc; int err; unsigned char data[472320]; static const unsigned char mapping[192] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101, 102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118, 119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135, 136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152, 153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169, 170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186, 187,188,189,190,191 }; enc = opus_multistream_encoder_create(8000, 192, 189, 3, mapping, OPUS_APPLICATION_RESTRICTED_LOWDELAY, &err); opus_multistream_encoder_ctl(enc, OPUS_SET_SIGNAL(OPUS_SIGNAL_MUSIC)); opus_multistream_encoder_ctl(enc, OPUS_SET_VBR(0)); opus_multistream_encoder_ctl(enc, OPUS_SET_VBR_CONSTRAINT(0)); opus_multistream_encoder_ctl(enc, OPUS_SET_PREDICTION_DISABLED(0)); opus_multistream_encoder_ctl(enc, OPUS_SET_FORCE_CHANNELS(OPUS_AUTO)); opus_multistream_encoder_ctl(enc, OPUS_SET_PHASE_INVERSION_DISABLED(0)); opus_multistream_encoder_ctl(enc, OPUS_SET_DTX(0)); opus_multistream_encoder_ctl(enc, OPUS_SET_COMPLEXITY(0)); opus_multistream_encoder_ctl(enc, OPUS_SET_MAX_BANDWIDTH(OPUS_BANDWIDTH_MEDIUMBAND)); opus_multistream_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_AUTO)); opus_multistream_encoder_ctl(enc, OPUS_SET_LSB_DEPTH(8)); opus_multistream_encoder_ctl(enc, OPUS_SET_INBAND_FEC(0)); opus_multistream_encoder_ctl(enc, OPUS_SET_PACKET_LOSS_PERC(0)); opus_multistream_encoder_ctl(enc, OPUS_SET_BITRATE(15360)); { static const short pcm[20*192] = { 0 }; err = opus_multistream_encode(enc, pcm, 20, data, 472320); assert(err > 0); /* returns -1 */ } opus_multistream_encoder_destroy(enc); return 0; } static int surround_analysis_uninit(void) { OpusMSEncoder *enc; int err; unsigned char data[7380]; int streams; int coupled_streams; unsigned char mapping[3]; enc = opus_multistream_surround_encoder_create(24000, 3, 1, &streams, &coupled_streams, mapping, OPUS_APPLICATION_AUDIO, &err); opus_multistream_encoder_ctl(enc, OPUS_SET_SIGNAL(OPUS_SIGNAL_VOICE)); opus_multistream_encoder_ctl(enc, OPUS_SET_VBR(1)); opus_multistream_encoder_ctl(enc, OPUS_SET_VBR_CONSTRAINT(1)); opus_multistream_encoder_ctl(enc, OPUS_SET_PREDICTION_DISABLED(0)); opus_multistream_encoder_ctl(enc, OPUS_SET_FORCE_CHANNELS(OPUS_AUTO)); opus_multistream_encoder_ctl(enc, OPUS_SET_PHASE_INVERSION_DISABLED(0)); opus_multistream_encoder_ctl(enc, OPUS_SET_DTX(0)); opus_multistream_encoder_ctl(enc, OPUS_SET_COMPLEXITY(0)); opus_multistream_encoder_ctl(enc, OPUS_SET_MAX_BANDWIDTH(OPUS_BANDWIDTH_NARROWBAND)); opus_multistream_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_BANDWIDTH_NARROWBAND)); opus_multistream_encoder_ctl(enc, OPUS_SET_LSB_DEPTH(8)); opus_multistream_encoder_ctl(enc, OPUS_SET_INBAND_FEC(1)); opus_multistream_encoder_ctl(enc, OPUS_SET_BITRATE(84315)); { static const short pcm[960*3] = { -6896, 4901, -6158, 4120, -5164, 3631, -4442, 3153, -4070, 3349, -4577, 4474, -5541, 5058, -6701, 3881, -7933, 1863, -8041, 697, -6738,-31464, 14330,-12523, 4096, -6130, 29178, -250,-21252, 10467, 16907, -3359, -6644, 31965, 14607,-21544, -32497, 24020, 12557,-26926,-18421, -1842, 24587, 19659, 4878, 10954, 23060, 8907,-10215,-16179, 31772,-11825,-15590,-23089, 17173,-25903,-17387, 11733, 4884, 10204,-16476,-14367, 516, 20453,-16898, 20967,-23813, -20, 22011,-17167, 9459, 32499, -25855, -523, -3883, -390, -4206, 634, -3767, 2325, -2751, 3115, -2392, 2746, -2173, 2317, -1147, 2326, 23142, 11314, -15350,-24529, 3026, 6146, 2150, 2476, 1105, -830, 1775, -3425, 3674,-14907,-14907,-14907,-14907,-14907,-14907,-14907, 4293,-14023, 3879,-15553, 3158,-16161, 2629, 18433,-12535, -6645,-20735,-32763,-13824,-20992, 25859, 13052, -8731, 2292, -3860, 24049, 10225,-19220, 10478,-22294, 22773, 28137, 13816, 30953,-25863,-24598, 16888,-14612,-28942, 20974,-27397,-18944, -18690, 20991,-16638, 5632,-14330, 28911,-25594, 17408, 29958, -517,-20984, -1800, 11281, 9977,-21221,-14854, 23840, -9477, 3362,-12805,-22493, 32507, 156, 16384, -1163, 2301, -1874, 4600, -1748, 6950, 16557, 8192, -7372, -1033, -3278, 2806, 20275, 3317, -717, 9792, -767, 9099, -613, 8362, 5027, 7774, 2597, 8549, 5278, 8743, 9343, 6940, 13038, 4826, 14086, 2964, 13215, 1355, 11596, 455, 9850, -519, 10680, -2287, 12551, -3736, 13639, -4291, 13790, -2722, 14544, -866, 15050, -304, 22833, -1196, 13520, -2063, 13051, -2317, 13066, -2737, 13773, -2664, 14105, -3447, 13854, 24589, 24672, -5280, 10388, -4933, 7543, -4149, 3654, -1552, 1726, 661, 57, 2922, -751, 3917, 8419, 3840, -5218, 3435, 5540, -1073, 4153, -6656, 1649, -769, -7276,-13072, 6380, -7948, 20717, 18425, 17392, 14335,-18190, -1842, 24587, 19659, 11790, 10954, 23060, 8907,-10215,-16179, 31772,-11825,-15590,-23101, 17173, -25903,-17387, 11733, 4884, 10192,-16627,-14367, 516, 20453, -16898, 20967,-23813, -20, 22011,-17167, 9468, 32499,-25607, -523, -3883, -390, -4206, 634, -3767, 2325, -2751, 3115, -2392, 2746, -2161, 2317, -1147, 2326, 23142, 11314,-15350, -29137, 3026,-15056, -491,-15170, -386,-16015, -641,-16505, -930,-16206, -717,-16175, -2839,-16374, -4558,-16237, -5207, -15903, -6421, 6373, -1403, 5431, -1073, 3641, -1304, -4495, -769, -7276, 2856, -7870, 3314, -8730, 3964,-10183, 4011, -11135, 3421,-11727, 2966,-12360, 2818,-13472, 3660,-13805, 5162,-13478, 6434,-12840, 7335,-12420, 6865,-12349, 5541, -11965, 5530,-10820, 5132, -9197, 3367, -7745, 1223, -6910, -433, -6211, -1711, -4958, -1025, -3755, -836, -3292, -1666, -2661,-10755, 31472,-27906, 31471, 18690, 5617, 16649, 11253, -22516,-17674,-31990, 3575,-31479, 5883, 26121, 12890, -6612, 12228,-11634, 523, 26136,-21496, 20745,-15868, -4100,-24826, 23282, 22798, 491, -1774, 15075,-27373,-13094, 6417,-29487, 14608, 10185, 16143, 22211, -8436, 4288, -8694, 2375, 3023, 486, 1455, 128, 202, 942, -923, 2068, -1233, -717, -1042, -2167, 32255, -4632, 310, -4458, -3639, -5258, 2106, -6857, 2681, -7497, 2765, -6601, 1945, -5219, 19154, -4877, 619, -5719, -1928, -6208, -121, 593, 188, 1558, -4152, 1648, 156, 1604, -3664, -6862, -2851, -5112, -3600, -3747, -5081, -4428, -5592, 20974,-27397,-18944,-18690, 20991,-17406, 5632,-14330, 28911, 15934, 15934, 15934, 15934, 15934, 15934, 15934, 15934, 15934, 15934, 15934, 15934,-25594, 17408, 29958, -7173,-16888, 9098, -613, 8362, 675, 7774, 2597, 8549, 5278, 8743, 9375, 6940, 13038, 4826, 14598, 7721,-24308, -29905,-19703,-17106,-16124, -3287,-26118,-19709,-10769, 24353, 28648, 6946, -1363, 12485, -1187, 26074,-25055, 10004,-24798, 7204, -4581, -9678, 1554, 10553, 3102, 12193, 2443, 11955, 1213, 10689, -1293, 921, -4173, 10709, -6049, 8815, -7128, 8147, -8308, 6847, -2977, 4920,-11447,-22426,-11794, 3514, -10220, 3430, -7993, 1926, -7072, 327, -7569, -608, -7605, 3695, -6271, -1579, -4877, -1419, -3103, -2197, 128, -3904, 3760, -5401, 4906, -6051, 4250, -6272, 3492, -6343, 3197, -6397, 4041, -6341, 6255, -6381, 7905, 16504, 0, -6144, 8062, -5606, 8622, -5555, -9, -1, 7423, 0, 1, 238, 5148, 1309, 4700, 2218, 4403, 2573, 3568, 28303, 1758, 3454, -1247, 3434, -4912, 2862, -7844, 1718,-10095, 369,-12631, 128, -3904, 3632, -5401, 4906, -6051, 4250, -6272, 3492, -6343, 3197, -6397, 4041, -6341, 6255, -6381, 7905, 16504, 0, -6144, 8062, -5606, 8622, -5555, 8439, -3382, 7398, -1170, 6132, 238, 5148, 1309, 4700, 2218, 4403, 2573, 3568, 2703, 1758, 3454, -1247, 3434, -4912, 2862, -7844, 1718,-10095, 369,-12631, -259,-14632, 234, -15056, -521,-15170, -386,-16015, -641,-16505, -930,-16206, -1209,-16146, -2839,-16374, -4558,-16218, -5207,-15903, -6421, -15615, -6925,-14871, -6149,-13759, -5233,-12844, 18313, -4357, -5696, 2804, 12992,-22802, -6720, -9770, -7088, -8998, 14330, -12523, 14843, -6130, 29178, -250,-27396, 10467, 16907, -3359, -6644, 31965, 14607,-21544,-32497, 24020, 12557,-26926, -173, -129, -6401, -130,-25089, -3841, -4916, -3048, 224, -237, -3969, -189, -3529, -535, -3464,-14863,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14395,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907, 0, 32512,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907, 9925, -718, 9753, -767, 9099, -613, 8362, 675, 7774, 2597, 8549, 5278, 8743, 9375, 6940, 13038, 4826, 14598, 7721,-24308,-29905,-19703, -17106,-16124, -3287,-26118,-19709, 0, 24353, 28648, 10274, -11292,-29665,-16417, 24346, 14553, 18707, 26323, -4596,-17711, 5133, 26328, 13,-31168, 24583, 18404,-28927,-24350, 19453, 28642, 1019,-10777, -3079, 30188, -7686, 27635,-32521,-16384, 12528, -6386, 10986, 23827,-25880,-32752,-23321, 14605, 32231, 780,-13849, 15119, 28647, 4888, -7705, 30750, 64, 0, 32488, 6687,-20758, 19745, -2070,-13792, -6414, 28188, -2821, -4585, 7168, 7444, 23557,-21998, 13064, 3345, -4086,-28915, -8694, 32262, 8461, 27387,-12275, 12012, 23563,-18719,-28410, 29144,-22271, -562, -9986, -5434, 12288, 5573,-16642, 32448, 29182, 32705,-30723, 24255,-19716, 18368, -4357, -5696, 2804, 12992,-22802,-22080, -7701, -5183, 486, -3133, -5660, -1083, 16871,-28726,-11029,-30259, -1209,-16146, -2839,-16374, -4558, -16218,-10523, 20697, -9500, -1316, 5431, -1073, 3641, -1304, 1649, -769, -7276, 2856, -7870, 3314, -8730, 3964,-10183, 4011,-11135, 3421,-11727, 21398, 32767, -1, 32486, -1, 6301,-13071, 6380, -7948, -1, 32767, 240, 14081, -5646, 30973, -3598,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907, 32767,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907, 8901, 9375, 6940, 13038, 4826, 14598, 7721,-24308, -29905,-19703,-17106,-16124, -3287,-26118,-19709,-10769, 24361, 28648, 10274,-11292,-29665,-16417, 24346, 14580, 18707, 26323, -4440,-17711, 5133, 26328,-14579,-31008, 24583, 18404, 28417, -24350, 19453, 28642,-32513,-10777, -3079, 30188, -7686, 27635, -32521,-16384,-20240, -6386, 10986, 23827,-25880,-32752,-23321, 14605, 32231, 780,-13849, 15119, 28647, 4888, -7705,-15074, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907, 8192,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14897,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -15931,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907, 26121, 12890, 2604, 12228,-11634, 12299, 5573,-16642, 32452, 29182, 32705,-30723, 24255,-19716, 13248,-11779, -5696, 2804, 12992,-27666,-22080, -7701, -5183, -6682,-31464, 14330,-12523, 14843, -6130, 29178, -18,-27396, 10467, 16907, -3359, -6644, 31965, 14607,-21544, -32497, 24020, 12557,-26926,-18421, 706, 24587, 19659, 4878, 10954, 23060, 8907,-10215,-22579, 31772,-11825,-15590,-23089, 17173,-25903,-17387, 3285, 4884, 10204,-16627,-14367, 516, 20453,-16898, 20967,-23815, -20, 22011,-17167, 9468, 32499, -25607, -523, -3883, -390, -4206, 634, -3767, 2325, -2751, 3115, -2392, 2746, -2173, 2317, -1147, 2326, 23142, 11314, -15130,-29137, 3026, 6146, 2150, 2476, 1105, -830, 1775, -3425, 3674, -5287, 4609, -7175, 4922, -9579, 4556,-12007, 4236,-14023, 3879,-15553, 3158,-16161, 2576, 18398,-12535, -6645,-20735,-32763,-13824,-20992, 25859, 5372, 12040, 13307, -4355,-30213, -9, -6019, 14061,-31487,-13842, 30449, 15083, 14088, 31205,-18678,-12830, 14090,-26138,-25337,-11541, -3254, 27628,-22270, 30953,-16136,-30745, 20991,-17406, 5632,-14330, 28911,-25594, 17408,-20474, 13041, -8731, 2292, -3860, 24049, 10225,-19220, 10478, -4374, -1199, 148, -330, -74, 593, 188, 1558, -4152, 15984, 15934, 15934, 15934, 15934, 15934, 15934, 15934, 15934, 15934, 15934, 15934, 1598, 156, 1604, -1163, 2278,-30018,-25821,-21763,-23776, 24066, 9502, 25866, -25055, 10004,-24798, 7204, -4581, -9678, 1554, 10553, 3102, 12193, 2443, 11955, 1213, 10689, -1293, 921, -4173, 8661, -6049, 8815,-21221,-14854, 23840, -9477, 8549, 5278, 8743, 9375, 6940, 13038, 4826, 14598, 7721,-24308,-29905,-19703, -17106,-16124, -3287,-26118,-19709,-10769, 24361, 28648, 10274, -11292,-29665,-16417, 24346, 14580, 18707, 26323, -4410,-17711, 5133, 26328,-14579,-31008, 24583, 18404, 28417,-24350, 19453, 28642,-32513,-10777, -3079, 30188, -7686, 27635,-32521,-16384, -20240, -6386, 10986, 23827,-25880,-32752,-23321, 14605, 32231, 780,-13849, 15119, 28647, 4888, -7705, 30750, 64, 0, 32488, 6687,-20758, 19745, -2070, -1, -1, 28, 256, -4608, 7168, 7444, 23557,-21998, 13064, 3345, -4086,-28915, -8594, 32262, 8461, 27387,-12275, 12012, 23563,-18719,-28410, 29144,-22271,-32562,-16384, 12528, -6386, 10986, 23827,-25880, -32752,-23321, 14605, 32231, 780,-13849, 15119, 28647, 4888, -7705, 30750, 64, 0, 32488, 6687,-20758, 19745, -2070, -13792, -6414, 28188, -2821, -4585, 7168, 7444, 23557,-21998, 13064, 3345, -4086,-28915, -8694, 32262, 8461, 27387,-12275, 12012, 23563,-18719,-28410, 29144,-22271, -562, -9986, -5434, 12288, -2107,-16643, 32452, 29182, 32705,-30723, 24255,-19716, 18368, -4357, -5696, 2804, 12992,-22802,-22080, -7701, -5183, 486, -3133, -5660, -1083, 16871,-28726,-11029,-30259, -1209, -16146, -2839,-16374, -4558,-16218,-10523, 20697, -9500, -1316, 5431, -1073, 3641, -1304, 1649, -769, -7276, 2856, -7870, 3314, -8730, 3964,-10183, 4011,-11135, 3421,-11727, 21398, 32767, -1, 32486, -1, -99,-13072, 6380, -7948, 4864, 32767, 17392, 14335, -5646, 30973, -3598,-10299,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14905,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-19771,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-16443,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-15931,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907, -1,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907, 7877, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, -994, -7276, 2856, -7870, 3314, -8730, 3964,-10183, 4011,-11135, 3421,-11727, 21398, 32767, -1, 32486, -1, -99,-13072, 6380, -7948, 4864, 32767, 17392, 14335, -5646, 30973, -3598,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14905,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907, 197, 0,-14977,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907, 12838, 6653, 294, -29699,-25821,-21763,-23776, 24066, 9502, 25866,-25055, 10004, -24798, 7204, -4581, -9678, 1554, 10553, 3102, 12193, 2443, 11955, 1213, 10689, -1293, 921, 179, 8448, -6049, 8815, -7128, 8147, -8308, 6847, -9889, 4920,-11447, 3174,-11794, 3514,-10220, 3430, 16384, 1926, -7072, 327, -7537, -608, -7605, -1169, -6397, -1579, -4877, -1419, -3103, -2197, 128, -3904, 3632, -5401, 4906, -6051, 4250, -6272, 3492, -6343, 3197, -6397, 4041, -6341, 6255, -6381, 7905, 16504, 0, -6144, 8062, -5606, 8622, -5555, 8439, -3382, 7398, -1170, 6132, 238, 5148, 1309, 4700, 2218, 4403, 2573, 3568, 2703, 1758, 3454, -1247, 3434, -4912, 2862, -7844, 1718, -10095, 369,-12631, -259,-14632, 234,-15056, -491,-16194, -386,-16015, -641,-16505, -930,-16206, -1209,-16146, -2839, -16374, -4558,-16218, -5207,-15903, -6421,-15615, -6925,-14871, -6149,-13759, -5233,-12844, 18313, -4357, -5696, 2804, 12992, -22802, -6720, -9770, -7088, -8998, 14330,-12523, 14843, -6130, 29178, -250,-27396, 10467, 16907, -3359, -6644, 31965, 14607, -21544,-32497, 24020, 12557,-26926, -173, -129, -6401, -130, -25089, -3816, -4916, -3048, -32, -1, -3969, 256, -3529, -535, -3464,-14863,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -1209,-16146, -2839,-16374, -4558,-16218,-10523, 20697, -9500, -1316, 5431, -1073, 3641, -1304, 1649, -769, -7276, 2856, -7870, 3314, -8730, 3964,-10183, 4011,-11135, 3421,-11727, 21398, 32767, -1, 32486, -1, 6301,-13071, 6380, -7948, -1, 32767, 240, 14081, -5646, 30973, -3598,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, 32767,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907, 8901, 9375, 6940, 13038, 4826, 14598, 7721,-24308,-29905,-19703,-17106,-16124, -3287,-26118,-19709,-10769, 24361, 28648, 10274,-11292,-29665, -16417, 24346, 14580, 18707, 26323, -4440,-17711, 5133, 26328, -14579,-31008, 24583, 18404, 28417,-24350, 19453, 28642,-32513, -10777, -3079, 30188, -7686, 27635,-32521,-16384,-20240, -6386, 10986, 23827,-25880,-32752,-23321, 14605, 32231, 780,-13849, 15119, 28647, 4888, -7705,-15074,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, 8192, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14897, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-15931,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907, 26121, 12890, 2604, 12228,-11634, 12299, 5573, -16642, 32452, 29182, 32705,-30723, 24255,-19716, 13248,-11779, -5696, 2804, 12992,-27666,-22080, -7701, -5183, -6682,-31464, 14330,-12523, 14843, -6130, 29178, -18,-27396, 10467, 16907, -3359, -6644, 31965, 14607,-21544,-32497, 24020, 12557,-26926, -18421, 706, 24587, 19659, 4878, 10954, 23060, 8907,-10215, -22579, 31772,-11825,-15590,-23089, 17173,-25903,-17387, 3285, 4884, 10204,-16627,-14367, 516, 20453,-16898, 20967,-23815, -20, 22011,-17167, 9468, 32499,-25607, -523, -3883, -390, -4206, 634, -3767, 2325, -2751, 3115, -2392, 2746, -2173, 2317, -1147, 2326, 23142, 11314,-15130,-29137, 3026, 6146, 2150, 2476, 1105, -830, 1775, -3425, 3674, -5287, 4609, -7175, 4922, -9579, 4556,-12007, 4236,-14023, 3879,-15553, 3158,-16161, 2576, 18398,-12535, -6645,-20735,-32763,-13824, -20992, 25859, 5372, 12040, 13307, -4355,-30213, -9, -6019 }; err = opus_multistream_encode(enc, pcm, 960, data, 7380); assert(err > 0); } opus_multistream_encoder_ctl(enc, OPUS_SET_SIGNAL(OPUS_SIGNAL_MUSIC)); opus_multistream_encoder_ctl(enc, OPUS_SET_VBR(1)); opus_multistream_encoder_ctl(enc, OPUS_SET_VBR_CONSTRAINT(0)); opus_multistream_encoder_ctl(enc, OPUS_SET_PREDICTION_DISABLED(1)); opus_multistream_encoder_ctl(enc, OPUS_SET_FORCE_CHANNELS(OPUS_AUTO)); opus_multistream_encoder_ctl(enc, OPUS_SET_PHASE_INVERSION_DISABLED(1)); opus_multistream_encoder_ctl(enc, OPUS_SET_DTX(1)); opus_multistream_encoder_ctl(enc, OPUS_SET_COMPLEXITY(6)); opus_multistream_encoder_ctl(enc, OPUS_SET_MAX_BANDWIDTH(OPUS_BANDWIDTH_NARROWBAND)); opus_multistream_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_AUTO)); opus_multistream_encoder_ctl(enc, OPUS_SET_LSB_DEPTH(9)); opus_multistream_encoder_ctl(enc, OPUS_SET_INBAND_FEC(1)); opus_multistream_encoder_ctl(enc, OPUS_SET_PACKET_LOSS_PERC(5)); opus_multistream_encoder_ctl(enc, OPUS_SET_BITRATE(775410)); { static const short pcm[1440*3] = { 30449, 15083, 14088, 31205,-18678,-12830, 14090,-26138,-25337, -11541, -3254, 27628,-22270, 30953,-16136,-30745, 20991,-17406, 5632,-14330, 28911,-25594, 17408,-20474, 13041, -8731, 2292, -3860, 24049, 10225,-19220, 10478, -4374, -1199, 148, -330, -74, 593, 188, 1558, -4152, 15984, 15934, 15934, 15934, 15934, 15934, 15934, 15934, 15934, 15934, 15934, 15934, 1598, 156, 1604, -1163, 2278,-30018,-25821,-21763,-23776, 24066, 9502, 25866,-25055, 10004,-24798, 7204, -4581, -9678, 1554, 10553, 3102, 12193, 2443, 11955, 1213, 10689, -1293, 921, -4173, 8661, -6049, 8815,-21221,-14854, 23840, -9477, 8549, 5278, 8743, 9375, 6940, 13038, 4826, 14598, 7721,-24308, -29905,-19703,-17106,-16124, -3287,-26118,-19709,-10769, 24361, 28648, 10274,-11292,-29665,-16417, 24346, 14580, 18707, 26323, -4410,-17711, 5133, 26328,-14579,-31008, 24583, 18404, 28417, -24350, 19453, 28642,-32513,-10777, -3079, 30188, -7686, 27635, -32521,-16384,-20240, -6386, 10986, 23827,-25880,-32752,-23321, 14605, 32231, 780,-13849, 15119, 28647, 4888, -7705, 30750, 64, 0, 32488, 6687,-20758, 19745, -2070, -1, -1, 28, 256, -4608, 7168, 7444, 23557,-21998, 13064, 3345, -4086,-28915, -8594, 32262, 8461, 27387,-12275, 12012, 23563, -18719,-28410, 29144,-22271,-32562,-16384, 12528, -6386, 10986, 23827,-25880,-32752,-23321, 14605, 32231, 780,-13849, 15119, 28647, 4888, -7705, 30750, 64, 0, 32488, 6687,-20758, 19745, -2070,-13792, -6414, 28188, -2821, -4585, 7168, 7444, 23557,-21998, 13064, 3345, -4086,-28915, -8694, 32262, 8461, -14853,-14907,-14907,-14907,-14907, 32767,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14891,-14907,-14907,-14907, -14907,-14907, 8901, 9375, 6940, 13038, 4826, 14598, 7721, -24308,-29905,-19703,-17106,-16124, -3287,-26118,-19709,-10769, 24361, 28648, 10274,-11292,-29665,-16417, 24346, 14580, 18707, 26323, -4440,-17711, 5133, 26328,-14579,-31008, 24583, 18404, 28417,-24350, 19453, 28642,-32513,-10777, -3079, 30188, -7686, 27635,-32521,-16384,-20240, -6386, 10986, 23827,-25880,-32752, -23321, 14605, 32231, 780,-13849, 15119, 28647, 4888, -7705, -15074,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907, 8192,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14897,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-15931,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907, 26121, 12890, 2604, 12228,-11634, 12299, 5573,-16642, 32452, 29182, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710, 7710,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-10811,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14917,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14938,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907,-14907, -14907,-14907,-14907,-14907, -571, -9986, -58, 12542,-18491, 32507, 12838, 6653, 294, -1, 0,-19968, 18368, -4357, -5696, 2804, 12998,-22802,-22080, -7701, -5183, 486, -3133, -5660, -1083, 13799,-28726,-11029, 205,-14848, 32464, -1, -129,-13072, 6380, -7948, 20717, 18425, 17392, 14335, -5646, 30973, -3598, 7188, -3867, 3055, -4247, 5597, -4011,-26427, -11,-30418, 7922, 2614, 237, -5839,-27413,-17624,-29716, -13539, 239, 20991, 18164, -4082,-16647,-27386, 19458, 20224, 4619, 19728, -7409,-18186,-25073, 27627,-23539, -7945,-31464, 14330,-12523,-22021, -7701, -5183, 486, -3133, -5660, -1083, 13799,-28726,-11029, 205,-14848, 32464, -1, -129,-13072, 6380, -7948, 20717, 18425, 17392, 14093, -5646, 30973, -3598, 7188, -3867, 3055, 3689, -5401, 4906, -6051, 4250, -6272, 3492, -6343, 3197, -6397, 4041, -6341, 6255, -6381, 239, 20991, 18164, -4082,-16647,-27386, 19458, 20224, 4619, 19728, -7409,-18186,-25073, 27627,-23539, -7945,-31464, 14330,-12523, 14843, -6130, 30202, -250,-28420, 10467, 16907, -3359, -6644, 31965, 3343,-11727, 2966,-12616, 3064,-13472, 6732,-12349, 5541,-11965, 5530,-10820, -1912, -3637, 32285, -4607, 310, -32768, 0, -5258, 2106, -6857, 2681, -5449, -3606, -6717, -5482, -3606, -1853, 4082, -7631, -9808, -1742, -2851, -5112, 64, -868,-13546,-13365,-13365,-13365,-13365,-13365,-13365, -13365,-13365,-13365,-13365,-13365,-13365,-13365,-13365,-13365, -13365,-13365,-13365,-13365,-13365,-13365,-13365,-13365,-13365, -13365,-13365,-13365,-13365,-13365,-13365,-13365,-13365,-13365, -13365,-13365,-13365,-13365,-13365,-13365,-13365, 7883, -2316, 9086, -3944, 10500, 4285, 10459, -6474, 10204, -6539, 11601, -6824, 13385, -7142, 13872, -7457, 13670, -7725, 13463, -6887, 12482, -5580, 12600, -4964, 12480, 3254, 11741, -4210,-24819, 23282, 22798, 491, -1774, -1073, 3641, -1304, 28928, -250, -27396, 6657, -8961, 22524, 19987, 10231, 1791, 8947,-32763, -26385,-31227, -792,-30461, 8926, 4866, 27863, 27756, 27756, 27756, 27756, 27756, 27756, 27756, 27756, 5630,-11070,-16136, 20671,-11530, 27328, 8179, 5059,-31503,-24379,-19472, 17863, -29202, 22986, -23, 8909, 8422, 10450 }; err = opus_multistream_encode(enc, pcm, 1440, data, 7380); /* reads uninitialized data at src/opus_multistream_encoder.c:293 */ assert(err > 0); } opus_multistream_encoder_destroy(enc); return 0; } static int ec_enc_shrink_assert(void) { OpusEncoder *enc; int err; int data_len; unsigned char data[2000]; static const short pcm1[960] = { 5140 }; static const short pcm2[2880] = { -256,-12033, 0, -2817, 6912, 0, -5359, 5200, 3061, 0, -2903, 5652, -1281,-24656,-14433,-24678, 32,-29793, 2870, 0, 4096, 5120, 5140, -234,-20230,-24673,-24633, -24673,-24705, 0,-32768,-25444,-25444, 0,-25444,-25444, 156,-20480, -7948, -5920, -7968, -7968, 224, 0, 20480, 11, 20496, 13, 20496, 11,-20480, 2292,-20240, 244, 20480, 11, 20496, 11,-20480, 244,-20240, 7156, 20456, -246,-20243, 244, 128, 244, 20480, 11, 20496, 11, -20480, 244,-20256, 244, 20480, 256, 0, -246, 16609, -176, 0, 29872, -4096, -2888, 516, 2896, 4096, 2896, -20480, -3852, -2896, -1025,-31056,-14433, 244, 1792, -256, -12033, 0, -2817, 0, 0, -5359, 5200, 3061, 16, -2903, 5652, -1281,-24656,-14433,-24678, 32,-29793, 2870, 0, 4096, 5120, 5140, -234,-20230,-24673,-24633,-24673, -24705, 0,-32768,-25444,-25444, 0,-25444,-25444, 156, -20480, -7973, -5920, -7968, -7968, 224, 0, 20480, 11, 20496, 11, 20496, 11,-20480, 2292,-20213, 244, 20480, 11, 20496, 11,-24698, -2873, 0, 7, -1, 208, -256, 244, 0, 4352, 20715, -2796, 11,-22272, 5364, -234,-20230,-24673,-25913, 8351,-24832, 13963, 11, 0, 16, 5140, 5652, -1281,-24656,-14433,-24673, 32671, 159, 0,-25472,-25444, 156,-25600,-25444,-25444, 0, -2896, -7968, -7960, -7968, -7968, 0, 0, 2896, 4096, 2896, 4096, 2896, 0, -2896, -4088, -2896, 0, 2896, 0, -2896, -4096, -2896, 11, 2640, -4609, -2896,-32768, -3072, 0, 2896, 4096, 2896, 0, -2896, -4096, -2896, 0, 80, 1, 2816, 0, 20656, 255,-20480, 116,-18192 }; static const short pcm3[2880] = { 0 }; enc = opus_encoder_create(48000, 1, OPUS_APPLICATION_AUDIO, &err); opus_encoder_ctl(enc, OPUS_SET_COMPLEXITY(10)); opus_encoder_ctl(enc, OPUS_SET_PACKET_LOSS_PERC(6)); opus_encoder_ctl(enc, OPUS_SET_BITRATE(6000)); data_len = opus_encode(enc, pcm1, 960, data, 2000); assert(data_len > 0); opus_encoder_ctl(enc, OPUS_SET_SIGNAL(OPUS_SIGNAL_VOICE)); opus_encoder_ctl(enc, OPUS_SET_PREDICTION_DISABLED(1)); opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_BANDWIDTH_SUPERWIDEBAND)); opus_encoder_ctl(enc, OPUS_SET_INBAND_FEC(1)); opus_encoder_ctl(enc, OPUS_SET_BITRATE(15600)); data_len = opus_encode(enc, pcm2, 2880, data, 122); assert(data_len > 0); opus_encoder_ctl(enc, OPUS_SET_SIGNAL(OPUS_SIGNAL_MUSIC)); opus_encoder_ctl(enc, OPUS_SET_BITRATE(27000)); data_len = opus_encode(enc, pcm3, 2880, data, 122); /* assertion failure */ assert(data_len > 0); opus_encoder_destroy(enc); return 0; } static int ec_enc_shrink_assert2(void) { OpusEncoder *enc; int err; int data_len; unsigned char data[2000]; enc = opus_encoder_create(48000, 1, OPUS_APPLICATION_AUDIO, &err); opus_encoder_ctl(enc, OPUS_SET_COMPLEXITY(6)); opus_encoder_ctl(enc, OPUS_SET_SIGNAL(OPUS_SIGNAL_VOICE)); opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_BANDWIDTH_FULLBAND)); opus_encoder_ctl(enc, OPUS_SET_PACKET_LOSS_PERC(26)); opus_encoder_ctl(enc, OPUS_SET_BITRATE(27000)); { static const short pcm[960] = { 0 }; data_len = opus_encode(enc, pcm, 960, data, 2000); assert(data_len > 0); } opus_encoder_ctl(enc, OPUS_SET_SIGNAL(OPUS_SIGNAL_MUSIC)); { static const short pcm[480] = { 32767, 32767, 0, 0, 32767, 32767, 0, 0, 32767, 32767, -32768, -32768, 0, 0, -32768, -32768, 0, 0, -32768, -32768 }; data_len = opus_encode(enc, pcm, 480, data, 19); assert(data_len > 0); } opus_encoder_destroy(enc); return 0; } static int silk_gain_assert(void) { OpusEncoder *enc; int err; int data_len; unsigned char data[1000]; static const short pcm1[160] = { 0 }; static const short pcm2[960] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32767, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32767 }; enc = opus_encoder_create(8000, 1, OPUS_APPLICATION_AUDIO, &err); opus_encoder_ctl(enc, OPUS_SET_COMPLEXITY(3)); opus_encoder_ctl(enc, OPUS_SET_MAX_BANDWIDTH(OPUS_BANDWIDTH_NARROWBAND)); opus_encoder_ctl(enc, OPUS_SET_BITRATE(6000)); data_len = opus_encode(enc, pcm1, 160, data, 1000); assert(data_len > 0); opus_encoder_ctl(enc, OPUS_SET_VBR(0)); opus_encoder_ctl(enc, OPUS_SET_COMPLEXITY(0)); opus_encoder_ctl(enc, OPUS_SET_MAX_BANDWIDTH(OPUS_BANDWIDTH_MEDIUMBAND)); opus_encoder_ctl(enc, OPUS_SET_BITRATE(2867)); data_len = opus_encode(enc, pcm2, 960, data, 1000); assert(data_len > 0); opus_encoder_destroy(enc); return 0; } void regression_test(void) { fprintf(stderr, "Running simple tests for bugs that have been fixed previously\n"); celt_ec_internal_error(); mscbr_encode_fail10(); mscbr_encode_fail(); surround_analysis_uninit(); ec_enc_shrink_assert(); ec_enc_shrink_assert2(); silk_gain_assert(); } mumble-1.3.4/3rdparty/opus-src/tests/opus_decode_fuzzer.c0000664000175000017500000000766414010707327023405 0ustar builderbuilder/* Copyright (c) 2017 Google Inc. */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "opus.h" #include "opus_types.h" #define MAX_FRAME_SAMP 5760 #define MAX_PACKET 1500 /* 4 bytes: packet length, 4 bytes: encoder final range */ #define SETUP_BYTE_COUNT 8 typedef struct { int fs; int channels; } TocInfo; static void ParseToc(const uint8_t *toc, TocInfo *const info) { const int samp_freqs[5] = {8000, 12000, 16000, 24000, 48000}; const int bandwidth = opus_packet_get_bandwidth(toc); info->fs = samp_freqs[bandwidth - OPUS_BANDWIDTH_NARROWBAND]; info->channels = opus_packet_get_nb_channels(toc); } /* Treats the input data as concatenated packets encoded by opus_demo, * structured as * bytes 0..3: packet length * bytes 4..7: encoder final range * bytes 8+ : Opus packet, including ToC */ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { OpusDecoder *dec; opus_int16 *pcm; uint8_t *packet; TocInfo toc; int i, err; /* Not enough data to setup the decoder (+1 for the ToC) */ if (size < SETUP_BYTE_COUNT + 1) { return 0; } /* Create decoder based on info from the first ToC available */ ParseToc(&data[SETUP_BYTE_COUNT], &toc); dec = opus_decoder_create(toc.fs, toc.channels, &err); if (err != OPUS_OK | dec == NULL) { return 0; } pcm = (opus_int16*) malloc(sizeof(*pcm) * MAX_FRAME_SAMP * toc.channels); packet = (uint8_t*) calloc(MAX_PACKET, sizeof(*packet)); i = 0; while (1) { int len, fec; if (i + SETUP_BYTE_COUNT >= size) { break; } len = (opus_uint32) data[i ] << 24 | (opus_uint32) data[i + 1] << 16 | (opus_uint32) data[i + 2] << 8 | (opus_uint32) data[i + 3]; if (len > MAX_PACKET || len < 0) { break; } /* Bytes 4..7 represent encoder final range, but are unused here. * Instead, byte 4 is repurposed to determine if FEC is used. */ fec = data[i + 4] & 1; /* Lost packet */ if (len == 0) { int frame_size; opus_decoder_ctl(dec, OPUS_GET_LAST_PACKET_DURATION(&frame_size)); (void) opus_decode(dec, NULL, size, pcm, frame_size, fec); } else { if (i + SETUP_BYTE_COUNT + len > size) { break; } memcpy(pcm, &data[i + SETUP_BYTE_COUNT], len); (void) opus_decode(dec, data, size, pcm, MAX_FRAME_SAMP, fec); } i += SETUP_BYTE_COUNT + len; } opus_decoder_destroy(dec); free(pcm); free(packet); return 0; } mumble-1.3.4/3rdparty/opus-src/tests/test_opus_encode.c0000664000175000017500000007152314010707327023044 0ustar builderbuilder/* Copyright (c) 2011-2013 Xiph.Org Foundation Written by Gregory Maxwell */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #if (!defined WIN32 && !defined _WIN32) || defined(__MINGW32__) #include #else #include #define getpid _getpid #endif #include "opus_multistream.h" #include "opus.h" #include "../src/opus_private.h" #include "test_opus_common.h" #define MAX_PACKET (1500) #define SAMPLES (48000*30) #define SSAMPLES (SAMPLES/3) #define MAX_FRAME_SAMP (5760) #define PI (3.141592653589793238462643f) #define RAND_SAMPLE(a) (a[fast_rand() % sizeof(a)/sizeof(a[0])]) void generate_music(short *buf, opus_int32 len) { opus_int32 a1,b1,a2,b2; opus_int32 c1,c2,d1,d2; opus_int32 i,j; a1=b1=a2=b2=0; c1=c2=d1=d2=0; j=0; /*60ms silence*/ for(i=0;i<2880;i++)buf[i*2]=buf[i*2+1]=0; for(i=2880;i>12)^((j>>10|j>>12)&26&j>>7)))&128)+128)<<15; r=fast_rand();v1+=r&65535;v1-=r>>16; r=fast_rand();v2+=r&65535;v2-=r>>16; b1=v1-a1+((b1*61+32)>>6);a1=v1; b2=v2-a2+((b2*61+32)>>6);a2=v2; c1=(30*(c1+b1+d1)+32)>>6;d1=b1; c2=(30*(c2+b2+d2)+32)>>6;d2=b2; v1=(c1+128)>>8; v2=(c2+128)>>8; buf[i*2]=v1>32767?32767:(v1<-32768?-32768:v1); buf[i*2+1]=v2>32767?32767:(v2<-32768?-32768:v2); if(i%6==0)j++; } } #if 0 static int save_ctr = 0; static void int_to_char(opus_uint32 i, unsigned char ch[4]) { ch[0] = i>>24; ch[1] = (i>>16)&0xFF; ch[2] = (i>>8)&0xFF; ch[3] = i&0xFF; } static OPUS_INLINE void save_packet(unsigned char* p, int len, opus_uint32 rng) { FILE *fout; unsigned char int_field[4]; char name[256]; snprintf(name,255,"test_opus_encode.%llu.%d.bit",(unsigned long long)iseed,save_ctr); fprintf(stdout,"writing %d byte packet to %s\n",len,name); fout=fopen(name, "wb+"); if(fout==NULL)test_failed(); int_to_char(len, int_field); fwrite(int_field, 1, 4, fout); int_to_char(rng, int_field); fwrite(int_field, 1, 4, fout); fwrite(p, 1, len, fout); fclose(fout); save_ctr++; } #endif int get_frame_size_enum(int frame_size, int sampling_rate) { int frame_size_enum; if(frame_size==sampling_rate/400) frame_size_enum = OPUS_FRAMESIZE_2_5_MS; else if(frame_size==sampling_rate/200) frame_size_enum = OPUS_FRAMESIZE_5_MS; else if(frame_size==sampling_rate/100) frame_size_enum = OPUS_FRAMESIZE_10_MS; else if(frame_size==sampling_rate/50) frame_size_enum = OPUS_FRAMESIZE_20_MS; else if(frame_size==sampling_rate/25) frame_size_enum = OPUS_FRAMESIZE_40_MS; else if(frame_size==3*sampling_rate/50) frame_size_enum = OPUS_FRAMESIZE_60_MS; else if(frame_size==4*sampling_rate/50) frame_size_enum = OPUS_FRAMESIZE_80_MS; else if(frame_size==5*sampling_rate/50) frame_size_enum = OPUS_FRAMESIZE_100_MS; else if(frame_size==6*sampling_rate/50) frame_size_enum = OPUS_FRAMESIZE_120_MS; else test_failed(); return frame_size_enum; } void test_encode(OpusEncoder *enc, int channels, int frame_size, OpusDecoder *dec, const char* debug_info) { int samp_count = 0; opus_int16 *inbuf; unsigned char packet[MAX_PACKET+257]; int len; opus_int16 *outbuf; int out_samples; /* Generate input data */ inbuf = (opus_int16*)malloc(sizeof(*inbuf)*SSAMPLES); generate_music(inbuf, SSAMPLES/2); /* Allocate memory for output data */ outbuf = (opus_int16*)malloc(sizeof(*outbuf)*MAX_FRAME_SAMP*3); /* Encode data, then decode for sanity check */ do { len = opus_encode(enc, &inbuf[samp_count*channels], frame_size, packet, MAX_PACKET); if(len<0 || len>MAX_PACKET) { fprintf(stderr,"%s\n",debug_info); fprintf(stderr,"opus_encode() returned %d\n",len); test_failed(); } out_samples = opus_decode(dec, packet, len, outbuf, MAX_FRAME_SAMP, 0); if(out_samples!=frame_size) { fprintf(stderr,"%s\n",debug_info); fprintf(stderr,"opus_decode() returned %d\n",out_samples); test_failed(); } samp_count += frame_size; } while (samp_count < ((SSAMPLES/2)-MAX_FRAME_SAMP)); /* Clean up */ free(inbuf); free(outbuf); } void fuzz_encoder_settings(const int num_encoders, const int num_setting_changes) { OpusEncoder *enc; OpusDecoder *dec; int i,j,err; /* Parameters to fuzz. Some values are duplicated to increase their probability of being tested. */ int sampling_rates[5] = {8000, 12000, 16000, 24000, 48000}; int channels[2] = {1, 2}; int applications[3] = {OPUS_APPLICATION_AUDIO, OPUS_APPLICATION_VOIP, OPUS_APPLICATION_RESTRICTED_LOWDELAY}; int bitrates[11] = {6000, 12000, 16000, 24000, 32000, 48000, 64000, 96000, 510000, OPUS_AUTO, OPUS_BITRATE_MAX}; int force_channels[4] = {OPUS_AUTO, OPUS_AUTO, 1, 2}; int use_vbr[3] = {0, 1, 1}; int vbr_constraints[3] = {0, 1, 1}; int complexities[11] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int max_bandwidths[6] = {OPUS_BANDWIDTH_NARROWBAND, OPUS_BANDWIDTH_MEDIUMBAND, OPUS_BANDWIDTH_WIDEBAND, OPUS_BANDWIDTH_SUPERWIDEBAND, OPUS_BANDWIDTH_FULLBAND, OPUS_BANDWIDTH_FULLBAND}; int signals[4] = {OPUS_AUTO, OPUS_AUTO, OPUS_SIGNAL_VOICE, OPUS_SIGNAL_MUSIC}; int inband_fecs[3] = {0, 0, 1}; int packet_loss_perc[4] = {0, 1, 2, 5}; int lsb_depths[2] = {8, 24}; int prediction_disabled[3] = {0, 0, 1}; int use_dtx[2] = {0, 1}; int frame_sizes_ms_x2[9] = {5, 10, 20, 40, 80, 120, 160, 200, 240}; /* x2 to avoid 2.5 ms */ char debug_info[512]; for (i=0; i=64000?2:1)))!=OPUS_OK)test_failed(); if(opus_encoder_ctl(enc, OPUS_SET_COMPLEXITY((count>>2)%11))!=OPUS_OK)test_failed(); if(opus_encoder_ctl(enc, OPUS_SET_PACKET_LOSS_PERC((fast_rand()&15)&(fast_rand()%15)))!=OPUS_OK)test_failed(); bw=modes[j]==0?OPUS_BANDWIDTH_NARROWBAND+(fast_rand()%3): modes[j]==1?OPUS_BANDWIDTH_SUPERWIDEBAND+(fast_rand()&1): OPUS_BANDWIDTH_NARROWBAND+(fast_rand()%5); if(modes[j]==2&&bw==OPUS_BANDWIDTH_MEDIUMBAND)bw+=3; if(opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(bw))!=OPUS_OK)test_failed(); len = opus_encode(enc, &inbuf[i<<1], frame_size, packet, MAX_PACKET); if(len<0 || len>MAX_PACKET)test_failed(); if(opus_encoder_ctl(enc, OPUS_GET_FINAL_RANGE(&enc_final_range))!=OPUS_OK)test_failed(); if((fast_rand()&3)==0) { if(opus_packet_pad(packet,len,len+1)!=OPUS_OK)test_failed(); len++; } if((fast_rand()&7)==0) { if(opus_packet_pad(packet,len,len+256)!=OPUS_OK)test_failed(); len+=256; } if((fast_rand()&3)==0) { len=opus_packet_unpad(packet,len); if(len<1)test_failed(); } out_samples = opus_decode(dec, packet, len, &outbuf[i<<1], MAX_FRAME_SAMP, 0); if(out_samples!=frame_size)test_failed(); if(opus_decoder_ctl(dec, OPUS_GET_FINAL_RANGE(&dec_final_range))!=OPUS_OK)test_failed(); if(enc_final_range!=dec_final_range)test_failed(); /*LBRR decode*/ out_samples = opus_decode(dec_err[0], packet, len, out2buf, frame_size, (fast_rand()&3)!=0); if(out_samples!=frame_size)test_failed(); out_samples = opus_decode(dec_err[1], packet, (fast_rand()&3)==0?0:len, out2buf, MAX_FRAME_SAMP, (fast_rand()&7)!=0); if(out_samples<120)test_failed(); i+=frame_size; count++; }while(i<(SSAMPLES-MAX_FRAME_SAMP)); fprintf(stdout," Mode %s FB encode %s, %6d bps OK.\n",mstrings[modes[j]],rc==0?" VBR":rc==1?"CVBR":" CBR",rate); } } if(opus_encoder_ctl(enc, OPUS_SET_FORCE_MODE(OPUS_AUTO))!=OPUS_OK)test_failed(); if(opus_encoder_ctl(enc, OPUS_SET_FORCE_CHANNELS(OPUS_AUTO))!=OPUS_OK)test_failed(); if(opus_encoder_ctl(enc, OPUS_SET_INBAND_FEC(0))!=OPUS_OK)test_failed(); if(opus_encoder_ctl(enc, OPUS_SET_DTX(0))!=OPUS_OK)test_failed(); for(rc=0;rc<3;rc++) { if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_VBR(rc<2))!=OPUS_OK)test_failed(); if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_VBR_CONSTRAINT(rc==1))!=OPUS_OK)test_failed(); if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_VBR_CONSTRAINT(rc==1))!=OPUS_OK)test_failed(); if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_INBAND_FEC(rc==0))!=OPUS_OK)test_failed(); for(j=0;j<16;j++) { int rate; int modes[16]={0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2}; int rates[16]={4000,12000,32000,8000,16000,32000,48000,88000,4000,12000,32000,8000,16000,32000,48000,88000}; int frame[16]={160*1,160,80,160,160,80,40,20,160*1,160,80,160,160,80,40,20}; if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_INBAND_FEC(rc==0&&j==1))!=OPUS_OK)test_failed(); if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_FORCE_MODE(MODE_SILK_ONLY+modes[j]))!=OPUS_OK)test_failed(); rate=rates[j]+fast_rand()%rates[j]; if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_DTX(fast_rand()&1))!=OPUS_OK)test_failed(); if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_BITRATE(rate))!=OPUS_OK)test_failed(); count=i=0; do { int len,out_samples,frame_size,loss; opus_int32 pred; if(opus_multistream_encoder_ctl(MSenc, OPUS_GET_PREDICTION_DISABLED(&pred))!=OPUS_OK)test_failed(); if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_PREDICTION_DISABLED((int)(fast_rand()&15)<(pred?11:4)))!=OPUS_OK)test_failed(); frame_size=frame[j]; if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_COMPLEXITY((count>>2)%11))!=OPUS_OK)test_failed(); if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_PACKET_LOSS_PERC((fast_rand()&15)&(fast_rand()%15)))!=OPUS_OK)test_failed(); if((fast_rand()&255)==0) { if(opus_multistream_encoder_ctl(MSenc, OPUS_RESET_STATE)!=OPUS_OK)test_failed(); if(opus_multistream_decoder_ctl(MSdec, OPUS_RESET_STATE)!=OPUS_OK)test_failed(); if((fast_rand()&3)!=0) { if(opus_multistream_decoder_ctl(MSdec_err, OPUS_RESET_STATE)!=OPUS_OK)test_failed(); } } if((fast_rand()&255)==0) { if(opus_multistream_decoder_ctl(MSdec_err, OPUS_RESET_STATE)!=OPUS_OK)test_failed(); } len = opus_multistream_encode(MSenc, &inbuf[i<<1], frame_size, packet, MAX_PACKET); if(len<0 || len>MAX_PACKET)test_failed(); if(opus_multistream_encoder_ctl(MSenc, OPUS_GET_FINAL_RANGE(&enc_final_range))!=OPUS_OK)test_failed(); if((fast_rand()&3)==0) { if(opus_multistream_packet_pad(packet,len,len+1,2)!=OPUS_OK)test_failed(); len++; } if((fast_rand()&7)==0) { if(opus_multistream_packet_pad(packet,len,len+256,2)!=OPUS_OK)test_failed(); len+=256; } if((fast_rand()&3)==0) { len=opus_multistream_packet_unpad(packet,len,2); if(len<1)test_failed(); } out_samples = opus_multistream_decode(MSdec, packet, len, out2buf, MAX_FRAME_SAMP, 0); if(out_samples!=frame_size*6)test_failed(); if(opus_multistream_decoder_ctl(MSdec, OPUS_GET_FINAL_RANGE(&dec_final_range))!=OPUS_OK)test_failed(); if(enc_final_range!=dec_final_range)test_failed(); /*LBRR decode*/ loss=(fast_rand()&63)==0; out_samples = opus_multistream_decode(MSdec_err, packet, loss?0:len, out2buf, frame_size*6, (fast_rand()&3)!=0); if(out_samples!=(frame_size*6))test_failed(); i+=frame_size; count++; }while(i<(SSAMPLES/12-MAX_FRAME_SAMP)); fprintf(stdout," Mode %s NB dual-mono MS encode %s, %6d bps OK.\n",mstrings[modes[j]],rc==0?" VBR":rc==1?"CVBR":" CBR",rate); } } bitrate_bps=512000; fsize=fast_rand()%31; fswitch=100; debruijn2(6,db62); count=i=0; do { unsigned char toc; const unsigned char *frames[48]; short size[48]; int payload_offset; opus_uint32 dec_final_range2; int jj,dec2; int len,out_samples; int frame_size=fsizes[db62[fsize]]; opus_int32 offset=i%(SAMPLES-MAX_FRAME_SAMP); opus_encoder_ctl(enc, OPUS_SET_BITRATE(bitrate_bps)); len = opus_encode(enc, &inbuf[offset<<1], frame_size, packet, MAX_PACKET); if(len<0 || len>MAX_PACKET)test_failed(); count++; opus_encoder_ctl(enc, OPUS_GET_FINAL_RANGE(&enc_final_range)); out_samples = opus_decode(dec, packet, len, &outbuf[offset<<1], MAX_FRAME_SAMP, 0); if(out_samples!=frame_size)test_failed(); opus_decoder_ctl(dec, OPUS_GET_FINAL_RANGE(&dec_final_range)); /* compare final range encoder rng values of encoder and decoder */ if(dec_final_range!=enc_final_range)test_failed(); /* We fuzz the packet, but take care not to only corrupt the payload Corrupted headers are tested elsewhere and we need to actually run the decoders in order to compare them. */ if(opus_packet_parse(packet,len,&toc,frames,size,&payload_offset)<=0)test_failed(); if((fast_rand()&1023)==0)len=0; for(j=(opus_int32)(frames[0]-packet);j0?packet:NULL, len, out2buf, MAX_FRAME_SAMP, 0); if(out_samples<0||out_samples>MAX_FRAME_SAMP)test_failed(); if((len>0&&out_samples!=frame_size))test_failed(); /*FIXME use lastframe*/ opus_decoder_ctl(dec_err[0], OPUS_GET_FINAL_RANGE(&dec_final_range)); /*randomly select one of the decoders to compare with*/ dec2=fast_rand()%9+1; out_samples = opus_decode(dec_err[dec2], len>0?packet:NULL, len, out2buf, MAX_FRAME_SAMP, 0); if(out_samples<0||out_samples>MAX_FRAME_SAMP)test_failed(); /*FIXME, use factor, lastframe for loss*/ opus_decoder_ctl(dec_err[dec2], OPUS_GET_FINAL_RANGE(&dec_final_range2)); if(len>0&&dec_final_range!=dec_final_range2)test_failed(); fswitch--; if(fswitch<1) { int new_size; fsize=(fsize+1)%36; new_size=fsizes[db62[fsize]]; if(new_size==960||new_size==480)fswitch=2880/new_size*(fast_rand()%19+1); else fswitch=(fast_rand()%(2880/new_size))+1; } bitrate_bps=((fast_rand()%508000+4000)+bitrate_bps)>>1; i+=frame_size; }while(i] [-fuzz ]\n",_argv[0]); } int main(int _argc, char **_argv) { int args=1; char * strtol_str=NULL; const char * oversion; const char * env_seed; int env_used; int num_encoders_to_fuzz=5; int num_setting_changes=40; env_used=0; env_seed=getenv("SEED"); if(_argc>1) iseed=strtol(_argv[1], &strtol_str, 10); /* the first input argument might be the seed */ if(strtol_str!=NULL && strtol_str[0]=='\0') /* iseed is a valid number */ args++; else if(env_seed) { iseed=atoi(env_seed); env_used=1; } else iseed=(opus_uint32)time(NULL)^(((opus_uint32)getpid()&65535)<<16); Rw=Rz=iseed; while(args<_argc) { if(strcmp(_argv[args], "-fuzz")==0 && _argc==(args+3)) { num_encoders_to_fuzz=strtol(_argv[args+1], &strtol_str, 10); if(strtol_str[0]!='\0' || num_encoders_to_fuzz<=0) { print_usage(_argv); return EXIT_FAILURE; } num_setting_changes=strtol(_argv[args+2], &strtol_str, 10); if(strtol_str[0]!='\0' || num_setting_changes<=0) { print_usage(_argv); return EXIT_FAILURE; } args+=3; } else { print_usage(_argv); return EXIT_FAILURE; } } oversion=opus_get_version_string(); if(!oversion)test_failed(); fprintf(stderr,"Testing %s encoder. Random seed: %u (%.4X)\n", oversion, iseed, fast_rand() % 65535); if(env_used)fprintf(stderr," Random seed set from the environment (SEED=%s).\n", env_seed); regression_test(); /*Setting TEST_OPUS_NOFUZZ tells the tool not to send garbage data into the decoders. This is helpful because garbage data may cause the decoders to clip, which angers CLANG IOC.*/ run_test1(getenv("TEST_OPUS_NOFUZZ")!=NULL); /* Fuzz encoder settings online */ if(getenv("TEST_OPUS_NOFUZZ")==NULL) { fprintf(stderr,"Running fuzz_encoder_settings with %d encoder(s) and %d setting change(s) each.\n", num_encoders_to_fuzz, num_setting_changes); fuzz_encoder_settings(num_encoders_to_fuzz, num_setting_changes); } fprintf(stderr,"Tests completed successfully.\n"); return 0; } mumble-1.3.4/3rdparty/opus-src/tests/opus_decode_fuzzer.options0000664000175000017500000000003614010707327024640 0ustar builderbuilder[libfuzzer] max_len = 1000000 mumble-1.3.4/3rdparty/opus-src/tests/run_vectors.sh0000775000175000017500000001160214010707327022236 0ustar builderbuilder#!/bin/sh # Copyright (c) 2011-2012 Jean-Marc Valin # # This file is extracted from RFC6716. Please see that RFC for additional # information. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # - Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # - Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # - Neither the name of Internet Society, IETF or IETF Trust, nor the # names of specific contributors, may be used to endorse or promote # products derived from this software without specific prior written # permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER # OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. rm -f logs_mono.txt logs_mono2.txt rm -f logs_stereo.txt logs_stereo2.txt if [ "$#" -ne "3" ]; then echo "usage: run_vectors.sh " exit 1 fi CMD_PATH=$1 VECTOR_PATH=$2 RATE=$3 : ${OPUS_DEMO:=$CMD_PATH/opus_demo} : ${OPUS_COMPARE:=$CMD_PATH/opus_compare} if [ -d "$VECTOR_PATH" ]; then echo "Test vectors found in $VECTOR_PATH" else echo "No test vectors found" #Don't make the test fail here because the test vectors #will be distributed separately exit 0 fi if [ ! -x "$OPUS_COMPARE" ]; then echo "ERROR: Compare program not found: $OPUS_COMPARE" exit 1 fi if [ -x "$OPUS_DEMO" ]; then echo "Decoding with $OPUS_DEMO" else echo "ERROR: Decoder not found: $OPUS_DEMO" exit 1 fi echo "==============" echo "Testing mono" echo "==============" echo for file in 01 02 03 04 05 06 07 08 09 10 11 12 do if [ -e "$VECTOR_PATH/testvector$file.bit" ]; then echo "Testing testvector$file" else echo "Bitstream file not found: testvector$file.bit" fi if "$OPUS_DEMO" -d "$RATE" 1 "$VECTOR_PATH/testvector$file.bit" tmp.out >> logs_mono.txt 2>&1; then echo "successfully decoded" else echo "ERROR: decoding failed" exit 1 fi "$OPUS_COMPARE" -r "$RATE" "$VECTOR_PATH/testvector${file}.dec" tmp.out >> logs_mono.txt 2>&1 float_ret=$? "$OPUS_COMPARE" -r "$RATE" "$VECTOR_PATH/testvector${file}m.dec" tmp.out >> logs_mono2.txt 2>&1 float_ret2=$? if [ "$float_ret" -eq "0" ] || [ "$float_ret2" -eq "0" ]; then echo "output matches reference" else echo "ERROR: output does not match reference" exit 1 fi echo done echo "==============" echo Testing stereo echo "==============" echo for file in 01 02 03 04 05 06 07 08 09 10 11 12 do if [ -e "$VECTOR_PATH/testvector$file.bit" ]; then echo "Testing testvector$file" else echo "Bitstream file not found: testvector$file" fi if "$OPUS_DEMO" -d "$RATE" 2 "$VECTOR_PATH/testvector$file.bit" tmp.out >> logs_stereo.txt 2>&1; then echo "successfully decoded" else echo "ERROR: decoding failed" exit 1 fi "$OPUS_COMPARE" -s -r "$RATE" "$VECTOR_PATH/testvector${file}.dec" tmp.out >> logs_stereo.txt 2>&1 float_ret=$? "$OPUS_COMPARE" -s -r "$RATE" "$VECTOR_PATH/testvector${file}m.dec" tmp.out >> logs_stereo2.txt 2>&1 float_ret2=$? if [ "$float_ret" -eq "0" ] || [ "$float_ret2" -eq "0" ]; then echo "output matches reference" else echo "ERROR: output does not match reference" exit 1 fi echo done echo "All tests have passed successfully" mono1=`grep quality logs_mono.txt | awk '{sum+=$4}END{if (NR == 12) sum /= 12; else sum = 0; print sum}'` mono2=`grep quality logs_mono2.txt | awk '{sum+=$4}END{if (NR == 12) sum /= 12; else sum = 0; print sum}'` echo $mono1 $mono2 | awk '{if ($2 > $1) $1 = $2; print "Average mono quality is", $1, "%"}' stereo1=`grep quality logs_stereo.txt | awk '{sum+=$4}END{if (NR == 12) sum /= 12; else sum = 0; print sum}'` stereo2=`grep quality logs_stereo2.txt | awk '{sum+=$4}END{if (NR == 12) sum /= 12; else sum = 0; print sum}'` echo $stereo1 $stereo2 | awk '{if ($2 > $1) $1 = $2; print "Average stereo quality is", $1, "%"}' mumble-1.3.4/3rdparty/opus-src/tests/test_opus_common.h0000664000175000017500000000555514010707327023106 0ustar builderbuilder/* Copyright (c) 2011 Xiph.Org Foundation Written by Gregory Maxwell */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ static OPUS_INLINE void deb2_impl(unsigned char *_t,unsigned char **_p,int _k,int _x,int _y) { int i; if(_x>2){ if(_y<3)for(i=0;i<_y;i++)*(--*_p)=_t[i+1]; }else{ _t[_x]=_t[_x-_y]; deb2_impl(_t,_p,_k,_x+1,_y); for(i=_t[_x-_y]+1;i<_k;i++){ _t[_x]=i; deb2_impl(_t,_p,_k,_x+1,_x); } } } /*Generates a De Bruijn sequence (k,2) with length k^2*/ static OPUS_INLINE void debruijn2(int _k, unsigned char *_res) { unsigned char *p; unsigned char *t; t=malloc(sizeof(unsigned char)*_k*2); memset(t,0,sizeof(unsigned char)*_k*2); p=&_res[_k*_k]; deb2_impl(t,&p,_k,1,1); free(t); } /*MWC RNG of George Marsaglia*/ static opus_uint32 Rz, Rw; static OPUS_INLINE opus_uint32 fast_rand(void) { Rz=36969*(Rz&65535)+(Rz>>16); Rw=18000*(Rw&65535)+(Rw>>16); return (Rz<<16)+Rw; } static opus_uint32 iseed; #ifdef __GNUC__ __attribute__((noreturn)) #endif static OPUS_INLINE void _test_failed(const char *file, int line) { fprintf(stderr,"\n ***************************************************\n"); fprintf(stderr," *** A fatal error was detected. ***\n"); fprintf(stderr," ***************************************************\n"); fprintf(stderr,"Please report this failure and include\n"); fprintf(stderr,"'make check SEED=%u fails %s at line %d for %s'\n",iseed,file,line,opus_get_version_string()); fprintf(stderr,"and any relevant details about your system.\n\n"); abort(); } #define test_failed() _test_failed(__FILE__, __LINE__); void regression_test(void); mumble-1.3.4/3rdparty/opus-src/tests/test_opus_api.c0000664000175000017500000021172414010707327022357 0ustar builderbuilder/* Copyright (c) 2011-2013 Xiph.Org Foundation Written by Gregory Maxwell */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* This tests the API presented by the libopus system. It does not attempt to extensively exercise the codec internals. The strategy here is to simply the API interface invariants: That sane options are accepted, insane options are rejected, and that nothing blows up. In particular we don't actually test that settings are heeded by the codec (though we do check that get after set returns a sane value when it should). Other tests check the actual codec behavior. In cases where its reasonable to do so we test exhaustively, but its not reasonable to do so in all cases. Although these tests are simple they found several library bugs when they were initially developed. */ /* These tests are more sensitive if compiled with -DVALGRIND and run inside valgrind. Malloc failure testing requires glibc. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include "arch.h" #include "opus_multistream.h" #include "opus.h" #include "test_opus_common.h" #ifdef VALGRIND #include #define VG_UNDEF(x,y) VALGRIND_MAKE_MEM_UNDEFINED((x),(y)) #define VG_CHECK(x,y) VALGRIND_CHECK_MEM_IS_DEFINED((x),(y)) #else #define VG_UNDEF(x,y) #define VG_CHECK(x,y) #endif #if defined(HAVE___MALLOC_HOOK) #define MALLOC_FAIL #include "os_support.h" #include static const opus_int32 opus_apps[3] = {OPUS_APPLICATION_VOIP, OPUS_APPLICATION_AUDIO,OPUS_APPLICATION_RESTRICTED_LOWDELAY}; void *malloc_hook(__attribute__((unused)) size_t size, __attribute__((unused)) const void *caller) { return 0; } #endif static const opus_int32 opus_rates[5] = {48000,24000,16000,12000,8000}; opus_int32 test_dec_api(void) { opus_uint32 dec_final_range; OpusDecoder *dec; OpusDecoder *dec2; opus_int32 i,j,cfgs; unsigned char packet[1276]; #ifndef DISABLE_FLOAT_API float fbuf[960*2]; #endif short sbuf[960*2]; int c,err; opus_int32 *nullvalue; nullvalue=0; cfgs=0; /*First test invalid configurations which should fail*/ fprintf(stdout,"\n Decoder basic API tests\n"); fprintf(stdout," ---------------------------------------------------\n"); for(c=0;c<4;c++) { i=opus_decoder_get_size(c); if(((c==1||c==2)&&(i<=2048||i>1<<16))||((c!=1&&c!=2)&&i!=0))test_failed(); fprintf(stdout," opus_decoder_get_size(%d)=%d ...............%s OK.\n",c,i,i>0?"":"...."); cfgs++; } /*Test with unsupported sample rates*/ for(c=0;c<4;c++) { for(i=-7;i<=96000;i++) { int fs; if((i==8000||i==12000||i==16000||i==24000||i==48000)&&(c==1||c==2))continue; switch(i) { case(-5):fs=-8000;break; case(-6):fs=INT32_MAX;break; case(-7):fs=INT32_MIN;break; default:fs=i; } err = OPUS_OK; VG_UNDEF(&err,sizeof(err)); dec = opus_decoder_create(fs, c, &err); if(err!=OPUS_BAD_ARG || dec!=NULL)test_failed(); cfgs++; dec = opus_decoder_create(fs, c, 0); if(dec!=NULL)test_failed(); cfgs++; dec=malloc(opus_decoder_get_size(2)); if(dec==NULL)test_failed(); err = opus_decoder_init(dec,fs,c); if(err!=OPUS_BAD_ARG)test_failed(); cfgs++; free(dec); } } VG_UNDEF(&err,sizeof(err)); dec = opus_decoder_create(48000, 2, &err); if(err!=OPUS_OK || dec==NULL)test_failed(); VG_CHECK(dec,opus_decoder_get_size(2)); cfgs++; fprintf(stdout," opus_decoder_create() ........................ OK.\n"); fprintf(stdout," opus_decoder_init() .......................... OK.\n"); err=opus_decoder_ctl(dec, OPUS_GET_FINAL_RANGE((opus_uint32 *)NULL)); if(err != OPUS_BAD_ARG)test_failed(); VG_UNDEF(&dec_final_range,sizeof(dec_final_range)); err=opus_decoder_ctl(dec, OPUS_GET_FINAL_RANGE(&dec_final_range)); if(err!=OPUS_OK)test_failed(); VG_CHECK(&dec_final_range,sizeof(dec_final_range)); fprintf(stdout," OPUS_GET_FINAL_RANGE ......................... OK.\n"); cfgs++; err=opus_decoder_ctl(dec,OPUS_UNIMPLEMENTED); if(err!=OPUS_UNIMPLEMENTED)test_failed(); fprintf(stdout," OPUS_UNIMPLEMENTED ........................... OK.\n"); cfgs++; err=opus_decoder_ctl(dec, OPUS_GET_BANDWIDTH((opus_int32 *)NULL)); if(err != OPUS_BAD_ARG)test_failed(); VG_UNDEF(&i,sizeof(i)); err=opus_decoder_ctl(dec, OPUS_GET_BANDWIDTH(&i)); if(err != OPUS_OK || i!=0)test_failed(); fprintf(stdout," OPUS_GET_BANDWIDTH ........................... OK.\n"); cfgs++; err=opus_decoder_ctl(dec, OPUS_GET_SAMPLE_RATE((opus_int32 *)NULL)); if(err != OPUS_BAD_ARG)test_failed(); VG_UNDEF(&i,sizeof(i)); err=opus_decoder_ctl(dec, OPUS_GET_SAMPLE_RATE(&i)); if(err != OPUS_OK || i!=48000)test_failed(); fprintf(stdout," OPUS_GET_SAMPLE_RATE ......................... OK.\n"); cfgs++; /*GET_PITCH has different execution paths depending on the previously decoded frame.*/ err=opus_decoder_ctl(dec, OPUS_GET_PITCH(nullvalue)); if(err!=OPUS_BAD_ARG)test_failed(); cfgs++; VG_UNDEF(&i,sizeof(i)); err=opus_decoder_ctl(dec, OPUS_GET_PITCH(&i)); if(err != OPUS_OK || i>0 || i<-1)test_failed(); cfgs++; VG_UNDEF(packet,sizeof(packet)); packet[0]=63<<2;packet[1]=packet[2]=0; if(opus_decode(dec, packet, 3, sbuf, 960, 0)!=960)test_failed(); cfgs++; VG_UNDEF(&i,sizeof(i)); err=opus_decoder_ctl(dec, OPUS_GET_PITCH(&i)); if(err != OPUS_OK || i>0 || i<-1)test_failed(); cfgs++; packet[0]=1; if(opus_decode(dec, packet, 1, sbuf, 960, 0)!=960)test_failed(); cfgs++; VG_UNDEF(&i,sizeof(i)); err=opus_decoder_ctl(dec, OPUS_GET_PITCH(&i)); if(err != OPUS_OK || i>0 || i<-1)test_failed(); cfgs++; fprintf(stdout," OPUS_GET_PITCH ............................... OK.\n"); err=opus_decoder_ctl(dec, OPUS_GET_LAST_PACKET_DURATION((opus_int32 *)NULL)); if(err != OPUS_BAD_ARG)test_failed(); VG_UNDEF(&i,sizeof(i)); err=opus_decoder_ctl(dec, OPUS_GET_LAST_PACKET_DURATION(&i)); if(err != OPUS_OK || i!=960)test_failed(); cfgs++; fprintf(stdout," OPUS_GET_LAST_PACKET_DURATION ................ OK.\n"); VG_UNDEF(&i,sizeof(i)); err=opus_decoder_ctl(dec, OPUS_GET_GAIN(&i)); VG_CHECK(&i,sizeof(i)); if(err != OPUS_OK || i!=0)test_failed(); cfgs++; err=opus_decoder_ctl(dec, OPUS_GET_GAIN(nullvalue)); if(err != OPUS_BAD_ARG)test_failed(); cfgs++; err=opus_decoder_ctl(dec, OPUS_SET_GAIN(-32769)); if(err != OPUS_BAD_ARG)test_failed(); cfgs++; err=opus_decoder_ctl(dec, OPUS_SET_GAIN(32768)); if(err != OPUS_BAD_ARG)test_failed(); cfgs++; err=opus_decoder_ctl(dec, OPUS_SET_GAIN(-15)); if(err != OPUS_OK)test_failed(); cfgs++; VG_UNDEF(&i,sizeof(i)); err=opus_decoder_ctl(dec, OPUS_GET_GAIN(&i)); VG_CHECK(&i,sizeof(i)); if(err != OPUS_OK || i!=-15)test_failed(); cfgs++; fprintf(stdout," OPUS_SET_GAIN ................................ OK.\n"); fprintf(stdout," OPUS_GET_GAIN ................................ OK.\n"); /*Reset the decoder*/ dec2=malloc(opus_decoder_get_size(2)); memcpy(dec2,dec,opus_decoder_get_size(2)); if(opus_decoder_ctl(dec, OPUS_RESET_STATE)!=OPUS_OK)test_failed(); if(memcmp(dec2,dec,opus_decoder_get_size(2))==0)test_failed(); free(dec2); fprintf(stdout," OPUS_RESET_STATE ............................. OK.\n"); cfgs++; VG_UNDEF(packet,sizeof(packet)); packet[0]=0; if(opus_decoder_get_nb_samples(dec,packet,1)!=480)test_failed(); if(opus_packet_get_nb_samples(packet,1,48000)!=480)test_failed(); if(opus_packet_get_nb_samples(packet,1,96000)!=960)test_failed(); if(opus_packet_get_nb_samples(packet,1,32000)!=320)test_failed(); if(opus_packet_get_nb_samples(packet,1,8000)!=80)test_failed(); packet[0]=3; if(opus_packet_get_nb_samples(packet,1,24000)!=OPUS_INVALID_PACKET)test_failed(); packet[0]=(63<<2)|3; packet[1]=63; if(opus_packet_get_nb_samples(packet,0,24000)!=OPUS_BAD_ARG)test_failed(); if(opus_packet_get_nb_samples(packet,2,48000)!=OPUS_INVALID_PACKET)test_failed(); if(opus_decoder_get_nb_samples(dec,packet,2)!=OPUS_INVALID_PACKET)test_failed(); fprintf(stdout," opus_{packet,decoder}_get_nb_samples() ....... OK.\n"); cfgs+=9; if(OPUS_BAD_ARG!=opus_packet_get_nb_frames(packet,0))test_failed(); for(i=0;i<256;i++) { int l1res[4]={1,2,2,OPUS_INVALID_PACKET}; packet[0]=i; if(l1res[packet[0]&3]!=opus_packet_get_nb_frames(packet,1))test_failed(); cfgs++; for(j=0;j<256;j++) { packet[1]=j; if(((packet[0]&3)!=3?l1res[packet[0]&3]:packet[1]&63)!=opus_packet_get_nb_frames(packet,2))test_failed(); cfgs++; } } fprintf(stdout," opus_packet_get_nb_frames() .................. OK.\n"); for(i=0;i<256;i++) { int bw; packet[0]=i; bw=packet[0]>>4; bw=OPUS_BANDWIDTH_NARROWBAND+(((((bw&7)*9)&(63-(bw&8)))+2+12*((bw&8)!=0))>>4); if(bw!=opus_packet_get_bandwidth(packet))test_failed(); cfgs++; } fprintf(stdout," opus_packet_get_bandwidth() .................. OK.\n"); for(i=0;i<256;i++) { int fp3s,rate; packet[0]=i; fp3s=packet[0]>>3; fp3s=((((3-(fp3s&3))*13&119)+9)>>2)*((fp3s>13)*(3-((fp3s&3)==3))+1)*25; for(rate=0;rate<5;rate++) { if((opus_rates[rate]*3/fp3s)!=opus_packet_get_samples_per_frame(packet,opus_rates[rate]))test_failed(); cfgs++; } } fprintf(stdout," opus_packet_get_samples_per_frame() .......... OK.\n"); packet[0]=(63<<2)+3; packet[1]=49; for(j=2;j<51;j++)packet[j]=0; VG_UNDEF(sbuf,sizeof(sbuf)); if(opus_decode(dec, packet, 51, sbuf, 960, 0)!=OPUS_INVALID_PACKET)test_failed(); cfgs++; packet[0]=(63<<2); packet[1]=packet[2]=0; if(opus_decode(dec, packet, -1, sbuf, 960, 0)!=OPUS_BAD_ARG)test_failed(); cfgs++; if(opus_decode(dec, packet, 3, sbuf, 60, 0)!=OPUS_BUFFER_TOO_SMALL)test_failed(); cfgs++; if(opus_decode(dec, packet, 3, sbuf, 480, 0)!=OPUS_BUFFER_TOO_SMALL)test_failed(); cfgs++; if(opus_decode(dec, packet, 3, sbuf, 960, 0)!=960)test_failed(); cfgs++; fprintf(stdout," opus_decode() ................................ OK.\n"); #ifndef DISABLE_FLOAT_API VG_UNDEF(fbuf,sizeof(fbuf)); if(opus_decode_float(dec, packet, 3, fbuf, 960, 0)!=960)test_failed(); cfgs++; fprintf(stdout," opus_decode_float() .......................... OK.\n"); #endif #if 0 /*These tests are disabled because the library crashes with null states*/ if(opus_decoder_ctl(0,OPUS_RESET_STATE) !=OPUS_INVALID_STATE)test_failed(); if(opus_decoder_init(0,48000,1) !=OPUS_INVALID_STATE)test_failed(); if(opus_decode(0,packet,1,outbuf,2880,0) !=OPUS_INVALID_STATE)test_failed(); if(opus_decode_float(0,packet,1,0,2880,0) !=OPUS_INVALID_STATE)test_failed(); if(opus_decoder_get_nb_samples(0,packet,1) !=OPUS_INVALID_STATE)test_failed(); if(opus_packet_get_nb_frames(NULL,1) !=OPUS_BAD_ARG)test_failed(); if(opus_packet_get_bandwidth(NULL) !=OPUS_BAD_ARG)test_failed(); if(opus_packet_get_samples_per_frame(NULL,48000)!=OPUS_BAD_ARG)test_failed(); #endif opus_decoder_destroy(dec); cfgs++; fprintf(stdout," All decoder interface tests passed\n"); fprintf(stdout," (%6d API invocations)\n",cfgs); return cfgs; } opus_int32 test_msdec_api(void) { opus_uint32 dec_final_range; OpusMSDecoder *dec; OpusDecoder *streamdec; opus_int32 i,j,cfgs; unsigned char packet[1276]; unsigned char mapping[256]; #ifndef DISABLE_FLOAT_API float fbuf[960*2]; #endif short sbuf[960*2]; int a,b,c,err; #if 0 /*Relevant test not enabled for multistream*/ int *nullvalue; nullvalue=0; #endif mapping[0]=0; mapping[1]=1; for(i=2;i<256;i++)VG_UNDEF(&mapping[i],sizeof(unsigned char)); cfgs=0; /*First test invalid configurations which should fail*/ fprintf(stdout,"\n Multistream decoder basic API tests\n"); fprintf(stdout," ---------------------------------------------------\n"); for(a=-1;a<4;a++) { for(b=-1;b<4;b++) { i=opus_multistream_decoder_get_size(a,b); if(((a>0&&b<=a&&b>=0)&&(i<=2048||i>((1<<16)*a)))||((a<1||b>a||b<0)&&i!=0))test_failed(); fprintf(stdout," opus_multistream_decoder_get_size(%2d,%2d)=%d %sOK.\n",a,b,i,i>0?"":"... "); cfgs++; } } /*Test with unsupported sample rates*/ for(c=1;c<3;c++) { for(i=-7;i<=96000;i++) { int fs; if((i==8000||i==12000||i==16000||i==24000||i==48000)&&(c==1||c==2))continue; switch(i) { case(-5):fs=-8000;break; case(-6):fs=INT32_MAX;break; case(-7):fs=INT32_MIN;break; default:fs=i; } err = OPUS_OK; VG_UNDEF(&err,sizeof(err)); dec = opus_multistream_decoder_create(fs, c, 1, c-1, mapping, &err); if(err!=OPUS_BAD_ARG || dec!=NULL)test_failed(); cfgs++; dec = opus_multistream_decoder_create(fs, c, 1, c-1, mapping, 0); if(dec!=NULL)test_failed(); cfgs++; dec=malloc(opus_multistream_decoder_get_size(1,1)); if(dec==NULL)test_failed(); err = opus_multistream_decoder_init(dec,fs,c,1,c-1, mapping); if(err!=OPUS_BAD_ARG)test_failed(); cfgs++; free(dec); } } for(c=0;c<2;c++) { int *ret_err; ret_err = c?0:&err; mapping[0]=0; mapping[1]=1; for(i=2;i<256;i++)VG_UNDEF(&mapping[i],sizeof(unsigned char)); VG_UNDEF(ret_err,sizeof(*ret_err)); dec = opus_multistream_decoder_create(48000, 2, 1, 0, mapping, ret_err); if(ret_err){VG_CHECK(ret_err,sizeof(*ret_err));} if((ret_err && *ret_err!=OPUS_BAD_ARG) || dec!=NULL)test_failed(); cfgs++; VG_UNDEF(ret_err,sizeof(*ret_err)); mapping[0]=mapping[1]=0; dec = opus_multistream_decoder_create(48000, 2, 1, 0, mapping, ret_err); if(ret_err){VG_CHECK(ret_err,sizeof(*ret_err));} if((ret_err && *ret_err!=OPUS_OK) || dec==NULL)test_failed(); cfgs++; opus_multistream_decoder_destroy(dec); cfgs++; VG_UNDEF(ret_err,sizeof(*ret_err)); dec = opus_multistream_decoder_create(48000, 1, 4, 1, mapping, ret_err); if(ret_err){VG_CHECK(ret_err,sizeof(*ret_err));} if((ret_err && *ret_err!=OPUS_OK) || dec==NULL)test_failed(); cfgs++; err = opus_multistream_decoder_init(dec,48000, 1, 0, 0, mapping); if(err!=OPUS_BAD_ARG)test_failed(); cfgs++; err = opus_multistream_decoder_init(dec,48000, 1, 1, -1, mapping); if(err!=OPUS_BAD_ARG)test_failed(); cfgs++; opus_multistream_decoder_destroy(dec); cfgs++; VG_UNDEF(ret_err,sizeof(*ret_err)); dec = opus_multistream_decoder_create(48000, 2, 1, 1, mapping, ret_err); if(ret_err){VG_CHECK(ret_err,sizeof(*ret_err));} if((ret_err && *ret_err!=OPUS_OK) || dec==NULL)test_failed(); cfgs++; opus_multistream_decoder_destroy(dec); cfgs++; VG_UNDEF(ret_err,sizeof(*ret_err)); dec = opus_multistream_decoder_create(48000, 255, 255, 1, mapping, ret_err); if(ret_err){VG_CHECK(ret_err,sizeof(*ret_err));} if((ret_err && *ret_err!=OPUS_BAD_ARG) || dec!=NULL)test_failed(); cfgs++; VG_UNDEF(ret_err,sizeof(*ret_err)); dec = opus_multistream_decoder_create(48000, -1, 1, 1, mapping, ret_err); if(ret_err){VG_CHECK(ret_err,sizeof(*ret_err));} if((ret_err && *ret_err!=OPUS_BAD_ARG) || dec!=NULL)test_failed(); cfgs++; VG_UNDEF(ret_err,sizeof(*ret_err)); dec = opus_multistream_decoder_create(48000, 0, 1, 1, mapping, ret_err); if(ret_err){VG_CHECK(ret_err,sizeof(*ret_err));} if((ret_err && *ret_err!=OPUS_BAD_ARG) || dec!=NULL)test_failed(); cfgs++; VG_UNDEF(ret_err,sizeof(*ret_err)); dec = opus_multistream_decoder_create(48000, 1, -1, 2, mapping, ret_err); if(ret_err){VG_CHECK(ret_err,sizeof(*ret_err));} if((ret_err && *ret_err!=OPUS_BAD_ARG) || dec!=NULL)test_failed(); cfgs++; VG_UNDEF(ret_err,sizeof(*ret_err)); dec = opus_multistream_decoder_create(48000, 1, -1, -1, mapping, ret_err); if(ret_err){VG_CHECK(ret_err,sizeof(*ret_err));} if((ret_err && *ret_err!=OPUS_BAD_ARG) || dec!=NULL)test_failed(); cfgs++; VG_UNDEF(ret_err,sizeof(*ret_err)); dec = opus_multistream_decoder_create(48000, 256, 255, 1, mapping, ret_err); if(ret_err){VG_CHECK(ret_err,sizeof(*ret_err));} if((ret_err && *ret_err!=OPUS_BAD_ARG) || dec!=NULL)test_failed(); cfgs++; VG_UNDEF(ret_err,sizeof(*ret_err)); dec = opus_multistream_decoder_create(48000, 256, 255, 0, mapping, ret_err); if(ret_err){VG_CHECK(ret_err,sizeof(*ret_err));} if((ret_err && *ret_err!=OPUS_BAD_ARG) || dec!=NULL)test_failed(); cfgs++; VG_UNDEF(ret_err,sizeof(*ret_err)); mapping[0]=255; mapping[1]=1; mapping[2]=2; dec = opus_multistream_decoder_create(48000, 3, 2, 0, mapping, ret_err); if(ret_err){VG_CHECK(ret_err,sizeof(*ret_err));} if((ret_err && *ret_err!=OPUS_BAD_ARG) || dec!=NULL)test_failed(); cfgs++; VG_UNDEF(ret_err,sizeof(*ret_err)); mapping[0]=0; mapping[1]=0; mapping[2]=0; dec = opus_multistream_decoder_create(48000, 3, 2, 1, mapping, ret_err); if(ret_err){VG_CHECK(ret_err,sizeof(*ret_err));} if((ret_err && *ret_err!=OPUS_OK) || dec==NULL)test_failed(); cfgs++; opus_multistream_decoder_destroy(dec); cfgs++; VG_UNDEF(ret_err,sizeof(*ret_err)); mapping[0]=0; mapping[1]=255; mapping[2]=1; mapping[3]=2; mapping[4]=3; dec = opus_multistream_decoder_create(48001, 5, 4, 1, mapping, ret_err); if(ret_err){VG_CHECK(ret_err,sizeof(*ret_err));} if((ret_err && *ret_err!=OPUS_BAD_ARG) || dec!=NULL)test_failed(); cfgs++; } VG_UNDEF(&err,sizeof(err)); mapping[0]=0; mapping[1]=255; mapping[2]=1; mapping[3]=2; dec = opus_multistream_decoder_create(48000, 4, 2, 1, mapping, &err); VG_CHECK(&err,sizeof(err)); if(err!=OPUS_OK || dec==NULL)test_failed(); cfgs++; fprintf(stdout," opus_multistream_decoder_create() ............ OK.\n"); fprintf(stdout," opus_multistream_decoder_init() .............. OK.\n"); VG_UNDEF(&dec_final_range,sizeof(dec_final_range)); err=opus_multistream_decoder_ctl(dec, OPUS_GET_FINAL_RANGE(&dec_final_range)); if(err!=OPUS_OK)test_failed(); VG_CHECK(&dec_final_range,sizeof(dec_final_range)); fprintf(stdout," OPUS_GET_FINAL_RANGE ......................... OK.\n"); cfgs++; streamdec=0; VG_UNDEF(&streamdec,sizeof(streamdec)); err=opus_multistream_decoder_ctl(dec, OPUS_MULTISTREAM_GET_DECODER_STATE(-1,&streamdec)); if(err!=OPUS_BAD_ARG)test_failed(); cfgs++; err=opus_multistream_decoder_ctl(dec, OPUS_MULTISTREAM_GET_DECODER_STATE(1,&streamdec)); if(err!=OPUS_OK||streamdec==NULL)test_failed(); VG_CHECK(streamdec,opus_decoder_get_size(1)); cfgs++; err=opus_multistream_decoder_ctl(dec, OPUS_MULTISTREAM_GET_DECODER_STATE(2,&streamdec)); if(err!=OPUS_BAD_ARG)test_failed(); cfgs++; err=opus_multistream_decoder_ctl(dec, OPUS_MULTISTREAM_GET_DECODER_STATE(0,&streamdec)); if(err!=OPUS_OK||streamdec==NULL)test_failed(); VG_CHECK(streamdec,opus_decoder_get_size(1)); fprintf(stdout," OPUS_MULTISTREAM_GET_DECODER_STATE ........... OK.\n"); cfgs++; for(j=0;j<2;j++) { OpusDecoder *od; err=opus_multistream_decoder_ctl(dec,OPUS_MULTISTREAM_GET_DECODER_STATE(j,&od)); if(err != OPUS_OK)test_failed(); VG_UNDEF(&i,sizeof(i)); err=opus_decoder_ctl(od, OPUS_GET_GAIN(&i)); VG_CHECK(&i,sizeof(i)); if(err != OPUS_OK || i!=0)test_failed(); cfgs++; } err=opus_multistream_decoder_ctl(dec,OPUS_SET_GAIN(15)); if(err!=OPUS_OK)test_failed(); fprintf(stdout," OPUS_SET_GAIN ................................ OK.\n"); for(j=0;j<2;j++) { OpusDecoder *od; err=opus_multistream_decoder_ctl(dec,OPUS_MULTISTREAM_GET_DECODER_STATE(j,&od)); if(err != OPUS_OK)test_failed(); VG_UNDEF(&i,sizeof(i)); err=opus_decoder_ctl(od, OPUS_GET_GAIN(&i)); VG_CHECK(&i,sizeof(i)); if(err != OPUS_OK || i!=15)test_failed(); cfgs++; } fprintf(stdout," OPUS_GET_GAIN ................................ OK.\n"); VG_UNDEF(&i,sizeof(i)); err=opus_multistream_decoder_ctl(dec, OPUS_GET_BANDWIDTH(&i)); if(err != OPUS_OK || i!=0)test_failed(); fprintf(stdout," OPUS_GET_BANDWIDTH ........................... OK.\n"); cfgs++; err=opus_multistream_decoder_ctl(dec,OPUS_UNIMPLEMENTED); if(err!=OPUS_UNIMPLEMENTED)test_failed(); fprintf(stdout," OPUS_UNIMPLEMENTED ........................... OK.\n"); cfgs++; #if 0 /*Currently unimplemented for multistream*/ /*GET_PITCH has different execution paths depending on the previously decoded frame.*/ err=opus_multistream_decoder_ctl(dec, OPUS_GET_PITCH(nullvalue)); if(err!=OPUS_BAD_ARG)test_failed(); cfgs++; VG_UNDEF(&i,sizeof(i)); err=opus_multistream_decoder_ctl(dec, OPUS_GET_PITCH(&i)); if(err != OPUS_OK || i>0 || i<-1)test_failed(); cfgs++; VG_UNDEF(packet,sizeof(packet)); packet[0]=63<<2;packet[1]=packet[2]=0; if(opus_multistream_decode(dec, packet, 3, sbuf, 960, 0)!=960)test_failed(); cfgs++; VG_UNDEF(&i,sizeof(i)); err=opus_multistream_decoder_ctl(dec, OPUS_GET_PITCH(&i)); if(err != OPUS_OK || i>0 || i<-1)test_failed(); cfgs++; packet[0]=1; if(opus_multistream_decode(dec, packet, 1, sbuf, 960, 0)!=960)test_failed(); cfgs++; VG_UNDEF(&i,sizeof(i)); err=opus_multistream_decoder_ctl(dec, OPUS_GET_PITCH(&i)); if(err != OPUS_OK || i>0 || i<-1)test_failed(); cfgs++; fprintf(stdout," OPUS_GET_PITCH ............................... OK.\n"); #endif /*Reset the decoder*/ if(opus_multistream_decoder_ctl(dec, OPUS_RESET_STATE)!=OPUS_OK)test_failed(); fprintf(stdout," OPUS_RESET_STATE ............................. OK.\n"); cfgs++; opus_multistream_decoder_destroy(dec); cfgs++; VG_UNDEF(&err,sizeof(err)); dec = opus_multistream_decoder_create(48000, 2, 1, 1, mapping, &err); if(err!=OPUS_OK || dec==NULL)test_failed(); cfgs++; packet[0]=(63<<2)+3; packet[1]=49; for(j=2;j<51;j++)packet[j]=0; VG_UNDEF(sbuf,sizeof(sbuf)); if(opus_multistream_decode(dec, packet, 51, sbuf, 960, 0)!=OPUS_INVALID_PACKET)test_failed(); cfgs++; packet[0]=(63<<2); packet[1]=packet[2]=0; if(opus_multistream_decode(dec, packet, -1, sbuf, 960, 0)!=OPUS_BAD_ARG){printf("%d\n",opus_multistream_decode(dec, packet, -1, sbuf, 960, 0));test_failed();} cfgs++; if(opus_multistream_decode(dec, packet, 3, sbuf, 60, 0)!=OPUS_BUFFER_TOO_SMALL)test_failed(); cfgs++; if(opus_multistream_decode(dec, packet, 3, sbuf, 480, 0)!=OPUS_BUFFER_TOO_SMALL)test_failed(); cfgs++; if(opus_multistream_decode(dec, packet, 3, sbuf, 960, 0)!=960)test_failed(); cfgs++; fprintf(stdout," opus_multistream_decode() .................... OK.\n"); #ifndef DISABLE_FLOAT_API VG_UNDEF(fbuf,sizeof(fbuf)); if(opus_multistream_decode_float(dec, packet, 3, fbuf, 960, 0)!=960)test_failed(); cfgs++; fprintf(stdout," opus_multistream_decode_float() .............. OK.\n"); #endif #if 0 /*These tests are disabled because the library crashes with null states*/ if(opus_multistream_decoder_ctl(0,OPUS_RESET_STATE) !=OPUS_INVALID_STATE)test_failed(); if(opus_multistream_decoder_init(0,48000,1) !=OPUS_INVALID_STATE)test_failed(); if(opus_multistream_decode(0,packet,1,outbuf,2880,0) !=OPUS_INVALID_STATE)test_failed(); if(opus_multistream_decode_float(0,packet,1,0,2880,0) !=OPUS_INVALID_STATE)test_failed(); if(opus_multistream_decoder_get_nb_samples(0,packet,1) !=OPUS_INVALID_STATE)test_failed(); #endif opus_multistream_decoder_destroy(dec); cfgs++; fprintf(stdout," All multistream decoder interface tests passed\n"); fprintf(stdout," (%6d API invocations)\n",cfgs); return cfgs; } #ifdef VALGRIND #define UNDEFINE_FOR_PARSE toc=-1; \ frames[0]=(unsigned char *)0; \ frames[1]=(unsigned char *)0; \ payload_offset=-1; \ VG_UNDEF(&toc,sizeof(toc)); \ VG_UNDEF(frames,sizeof(frames));\ VG_UNDEF(&payload_offset,sizeof(payload_offset)); #else #define UNDEFINE_FOR_PARSE toc=-1; \ frames[0]=(unsigned char *)0; \ frames[1]=(unsigned char *)0; \ payload_offset=-1; #endif /* This test exercises the heck out of the libopus parser. It is much larger than the parser itself in part because it tries to hit a lot of corner cases that could never fail with the libopus code, but might be problematic for other implementations. */ opus_int32 test_parse(void) { opus_int32 i,j,jj,sz; unsigned char packet[1276]; opus_int32 cfgs,cfgs_total; unsigned char toc; const unsigned char *frames[48]; short size[48]; int payload_offset, ret; fprintf(stdout,"\n Packet header parsing tests\n"); fprintf(stdout," ---------------------------------------------------\n"); memset(packet,0,sizeof(char)*1276); packet[0]=63<<2; if(opus_packet_parse(packet,1,&toc,frames,0,&payload_offset)!=OPUS_BAD_ARG)test_failed(); cfgs_total=cfgs=1; /*code 0*/ for(i=0;i<64;i++) { packet[0]=i<<2; UNDEFINE_FOR_PARSE ret=opus_packet_parse(packet,4,&toc,frames,size,&payload_offset); cfgs++; if(ret!=1)test_failed(); if(size[0]!=3)test_failed(); if(frames[0]!=packet+1)test_failed(); } fprintf(stdout," code 0 (%2d cases) ............................ OK.\n",cfgs); cfgs_total+=cfgs;cfgs=0; /*code 1, two frames of the same size*/ for(i=0;i<64;i++) { packet[0]=(i<<2)+1; for(jj=0;jj<=1275*2+3;jj++) { UNDEFINE_FOR_PARSE ret=opus_packet_parse(packet,jj,&toc,frames,size,&payload_offset); cfgs++; if((jj&1)==1 && jj<=2551) { /* Must pass if payload length even (packet length odd) and size<=2551, must fail otherwise. */ if(ret!=2)test_failed(); if(size[0]!=size[1] || size[0]!=((jj-1)>>1))test_failed(); if(frames[0]!=packet+1)test_failed(); if(frames[1]!=frames[0]+size[0])test_failed(); if((toc>>2)!=i)test_failed(); } else if(ret!=OPUS_INVALID_PACKET)test_failed(); } } fprintf(stdout," code 1 (%6d cases) ........................ OK.\n",cfgs); cfgs_total+=cfgs;cfgs=0; for(i=0;i<64;i++) { /*code 2, length code overflow*/ packet[0]=(i<<2)+2; UNDEFINE_FOR_PARSE ret=opus_packet_parse(packet,1,&toc,frames,size,&payload_offset); cfgs++; if(ret!=OPUS_INVALID_PACKET)test_failed(); packet[1]=252; UNDEFINE_FOR_PARSE ret=opus_packet_parse(packet,2,&toc,frames,size,&payload_offset); cfgs++; if(ret!=OPUS_INVALID_PACKET)test_failed(); for(j=0;j<1275;j++) { if(j<252)packet[1]=j; else{packet[1]=252+(j&3);packet[2]=(j-252)>>2;} /*Code 2, one too short*/ UNDEFINE_FOR_PARSE ret=opus_packet_parse(packet,j+(j<252?2:3)-1,&toc,frames,size,&payload_offset); cfgs++; if(ret!=OPUS_INVALID_PACKET)test_failed(); /*Code 2, one too long*/ UNDEFINE_FOR_PARSE ret=opus_packet_parse(packet,j+(j<252?2:3)+1276,&toc,frames,size,&payload_offset); cfgs++; if(ret!=OPUS_INVALID_PACKET)test_failed(); /*Code 2, second zero*/ UNDEFINE_FOR_PARSE ret=opus_packet_parse(packet,j+(j<252?2:3),&toc,frames,size,&payload_offset); cfgs++; if(ret!=2)test_failed(); if(size[0]!=j||size[1]!=0)test_failed(); if(frames[1]!=frames[0]+size[0])test_failed(); if((toc>>2)!=i)test_failed(); /*Code 2, normal*/ UNDEFINE_FOR_PARSE ret=opus_packet_parse(packet,(j<<1)+4,&toc,frames,size,&payload_offset); cfgs++; if(ret!=2)test_failed(); if(size[0]!=j||size[1]!=(j<<1)+3-j-(j<252?1:2))test_failed(); if(frames[1]!=frames[0]+size[0])test_failed(); if((toc>>2)!=i)test_failed(); } } fprintf(stdout," code 2 (%6d cases) ........................ OK.\n",cfgs); cfgs_total+=cfgs;cfgs=0; for(i=0;i<64;i++) { packet[0]=(i<<2)+3; /*code 3, length code overflow*/ UNDEFINE_FOR_PARSE ret=opus_packet_parse(packet,1,&toc,frames,size,&payload_offset); cfgs++; if(ret!=OPUS_INVALID_PACKET)test_failed(); } fprintf(stdout," code 3 m-truncation (%2d cases) ............... OK.\n",cfgs); cfgs_total+=cfgs;cfgs=0; for(i=0;i<64;i++) { /*code 3, m is zero or 49-63*/ packet[0]=(i<<2)+3; for(jj=49;jj<=64;jj++) { packet[1]=0+(jj&63); /*CBR, no padding*/ UNDEFINE_FOR_PARSE ret=opus_packet_parse(packet,1275,&toc,frames,size,&payload_offset); cfgs++; if(ret!=OPUS_INVALID_PACKET)test_failed(); packet[1]=128+(jj&63); /*VBR, no padding*/ UNDEFINE_FOR_PARSE ret=opus_packet_parse(packet,1275,&toc,frames,size,&payload_offset); cfgs++; if(ret!=OPUS_INVALID_PACKET)test_failed(); packet[1]=64+(jj&63); /*CBR, padding*/ UNDEFINE_FOR_PARSE ret=opus_packet_parse(packet,1275,&toc,frames,size,&payload_offset); cfgs++; if(ret!=OPUS_INVALID_PACKET)test_failed(); packet[1]=128+64+(jj&63); /*VBR, padding*/ UNDEFINE_FOR_PARSE ret=opus_packet_parse(packet,1275,&toc,frames,size,&payload_offset); cfgs++; if(ret!=OPUS_INVALID_PACKET)test_failed(); } } fprintf(stdout," code 3 m=0,49-64 (%2d cases) ................ OK.\n",cfgs); cfgs_total+=cfgs;cfgs=0; for(i=0;i<64;i++) { packet[0]=(i<<2)+3; /*code 3, m is one, cbr*/ packet[1]=1; for(j=0;j<1276;j++) { UNDEFINE_FOR_PARSE ret=opus_packet_parse(packet,j+2,&toc,frames,size,&payload_offset); cfgs++; if(ret!=1)test_failed(); if(size[0]!=j)test_failed(); if((toc>>2)!=i)test_failed(); } UNDEFINE_FOR_PARSE ret=opus_packet_parse(packet,1276+2,&toc,frames,size,&payload_offset); cfgs++; if(ret!=OPUS_INVALID_PACKET)test_failed(); } fprintf(stdout," code 3 m=1 CBR (%2d cases) ................. OK.\n",cfgs); cfgs_total+=cfgs;cfgs=0; for(i=0;i<64;i++) { int frame_samp; /*code 3, m>1 CBR*/ packet[0]=(i<<2)+3; frame_samp=opus_packet_get_samples_per_frame(packet,48000); for(j=2;j<49;j++) { packet[1]=j; for(sz=2;sz<((j+2)*1275);sz++) { UNDEFINE_FOR_PARSE ret=opus_packet_parse(packet,sz,&toc,frames,size,&payload_offset); cfgs++; /*Must be <=120ms, must be evenly divisible, can't have frames>1275 bytes*/ if(frame_samp*j<=5760 && (sz-2)%j==0 && (sz-2)/j<1276) { if(ret!=j)test_failed(); for(jj=1;jj>2)!=i)test_failed(); } else if(ret!=OPUS_INVALID_PACKET)test_failed(); } } /*Super jumbo packets*/ packet[1]=5760/frame_samp; UNDEFINE_FOR_PARSE ret=opus_packet_parse(packet,1275*packet[1]+2,&toc,frames,size,&payload_offset); cfgs++; if(ret!=packet[1])test_failed(); for(jj=0;jj>2)!=i)test_failed(); } UNDEFINE_FOR_PARSE ret=opus_packet_parse(packet,2+1276,&toc,frames,size,&payload_offset); cfgs++; if(ret!=OPUS_INVALID_PACKET)test_failed(); for(j=2;j<49;j++) { packet[1]=128+j; /*Length code overflow*/ UNDEFINE_FOR_PARSE ret=opus_packet_parse(packet,2+j-2,&toc,frames,size,&payload_offset); cfgs++; if(ret!=OPUS_INVALID_PACKET)test_failed(); packet[2]=252; packet[3]=0; for(jj=4;jj<2+j;jj++)packet[jj]=0; UNDEFINE_FOR_PARSE ret=opus_packet_parse(packet,2+j,&toc,frames,size,&payload_offset); cfgs++; if(ret!=OPUS_INVALID_PACKET)test_failed(); /*One byte too short*/ for(jj=2;jj<2+j;jj++)packet[jj]=0; UNDEFINE_FOR_PARSE ret=opus_packet_parse(packet,2+j-2,&toc,frames,size,&payload_offset); cfgs++; if(ret!=OPUS_INVALID_PACKET)test_failed(); /*One byte too short thanks to length coding*/ packet[2]=252; packet[3]=0; for(jj=4;jj<2+j;jj++)packet[jj]=0; UNDEFINE_FOR_PARSE ret=opus_packet_parse(packet,2+j+252-1,&toc,frames,size,&payload_offset); cfgs++; if(ret!=OPUS_INVALID_PACKET)test_failed(); /*Most expensive way of coding zeros*/ for(jj=2;jj<2+j;jj++)packet[jj]=0; UNDEFINE_FOR_PARSE ret=opus_packet_parse(packet,2+j-1,&toc,frames,size,&payload_offset); cfgs++; if(frame_samp*j<=5760){ if(ret!=j)test_failed(); for(jj=0;jj>2)!=i)test_failed(); } else if(ret!=OPUS_INVALID_PACKET)test_failed(); /*Quasi-CBR use of mode 3*/ for(sz=0;sz<8;sz++) { const int tsz[8]={50,201,403,700,1472,5110,20400,61298}; int pos=0; int as=(tsz[sz]+i-j-2)/j; for(jj=0;jj>2;pos+=2;} } UNDEFINE_FOR_PARSE ret=opus_packet_parse(packet,tsz[sz]+i,&toc,frames,size,&payload_offset); cfgs++; if(frame_samp*j<=5760 && as<1276 && (tsz[sz]+i-2-pos-as*(j-1))<1276){ if(ret!=j)test_failed(); for(jj=0;jj>2)!=i)test_failed(); } else if(ret!=OPUS_INVALID_PACKET)test_failed(); } } } fprintf(stdout," code 3 m=1-48 VBR (%2d cases) ............. OK.\n",cfgs); cfgs_total+=cfgs;cfgs=0; for(i=0;i<64;i++) { packet[0]=(i<<2)+3; /*Padding*/ packet[1]=128+1+64; /*Overflow the length coding*/ for(jj=2;jj<127;jj++)packet[jj]=255; UNDEFINE_FOR_PARSE ret=opus_packet_parse(packet,127,&toc,frames,size,&payload_offset); cfgs++; if(ret!=OPUS_INVALID_PACKET)test_failed(); for(sz=0;sz<4;sz++) { const int tsz[4]={0,72,512,1275}; for(jj=sz;jj<65025;jj+=11) { int pos; for(pos=0;pos>2)!=i)test_failed(); } else if (ret!=OPUS_INVALID_PACKET)test_failed(); } } } fprintf(stdout," code 3 padding (%2d cases) ............... OK.\n",cfgs); cfgs_total+=cfgs; fprintf(stdout," opus_packet_parse ............................ OK.\n"); fprintf(stdout," All packet parsing tests passed\n"); fprintf(stdout," (%d API invocations)\n",cfgs_total); return cfgs_total; } /* This is a helper macro for the encoder tests. The encoder api tests all have a pattern of set-must-fail, set-must-fail, set-must-pass, get-and-compare, set-must-pass, get-and-compare. */ #define CHECK_SETGET(setcall,getcall,badv,badv2,goodv,goodv2,sok,gok) \ i=(badv);\ if(opus_encoder_ctl(enc,setcall)==OPUS_OK)test_failed();\ i=(badv2);\ if(opus_encoder_ctl(enc,setcall)==OPUS_OK)test_failed();\ j=i=(goodv);\ if(opus_encoder_ctl(enc,setcall)!=OPUS_OK)test_failed();\ i=-12345;\ VG_UNDEF(&i,sizeof(i)); \ err=opus_encoder_ctl(enc,getcall);\ if(err!=OPUS_OK || i!=j)test_failed();\ j=i=(goodv2);\ if(opus_encoder_ctl(enc,setcall)!=OPUS_OK)test_failed();\ fprintf(stdout,sok);\ i=-12345;\ VG_UNDEF(&i,sizeof(i)); \ err=opus_encoder_ctl(enc,getcall);\ if(err!=OPUS_OK || i!=j)test_failed();\ fprintf(stdout,gok);\ cfgs+=6; opus_int32 test_enc_api(void) { opus_uint32 enc_final_range; OpusEncoder *enc; opus_int32 i,j; unsigned char packet[1276]; #ifndef DISABLE_FLOAT_API float fbuf[960*2]; #endif short sbuf[960*2]; int c,err,cfgs; cfgs=0; /*First test invalid configurations which should fail*/ fprintf(stdout,"\n Encoder basic API tests\n"); fprintf(stdout," ---------------------------------------------------\n"); for(c=0;c<4;c++) { i=opus_encoder_get_size(c); if(((c==1||c==2)&&(i<=2048||i>1<<17))||((c!=1&&c!=2)&&i!=0))test_failed(); fprintf(stdout," opus_encoder_get_size(%d)=%d ...............%s OK.\n",c,i,i>0?"":"...."); cfgs++; } /*Test with unsupported sample rates, channel counts*/ for(c=0;c<4;c++) { for(i=-7;i<=96000;i++) { int fs; if((i==8000||i==12000||i==16000||i==24000||i==48000)&&(c==1||c==2))continue; switch(i) { case(-5):fs=-8000;break; case(-6):fs=INT32_MAX;break; case(-7):fs=INT32_MIN;break; default:fs=i; } err = OPUS_OK; VG_UNDEF(&err,sizeof(err)); enc = opus_encoder_create(fs, c, OPUS_APPLICATION_VOIP, &err); if(err!=OPUS_BAD_ARG || enc!=NULL)test_failed(); cfgs++; enc = opus_encoder_create(fs, c, OPUS_APPLICATION_VOIP, 0); if(enc!=NULL)test_failed(); cfgs++; opus_encoder_destroy(enc); enc=malloc(opus_encoder_get_size(2)); if(enc==NULL)test_failed(); err = opus_encoder_init(enc, fs, c, OPUS_APPLICATION_VOIP); if(err!=OPUS_BAD_ARG)test_failed(); cfgs++; free(enc); } } enc = opus_encoder_create(48000, 2, OPUS_AUTO, NULL); if(enc!=NULL)test_failed(); cfgs++; VG_UNDEF(&err,sizeof(err)); enc = opus_encoder_create(48000, 2, OPUS_AUTO, &err); if(err!=OPUS_BAD_ARG || enc!=NULL)test_failed(); cfgs++; VG_UNDEF(&err,sizeof(err)); enc = opus_encoder_create(48000, 2, OPUS_APPLICATION_VOIP, NULL); if(enc==NULL)test_failed(); opus_encoder_destroy(enc); cfgs++; VG_UNDEF(&err,sizeof(err)); enc = opus_encoder_create(48000, 2, OPUS_APPLICATION_RESTRICTED_LOWDELAY, &err); if(err!=OPUS_OK || enc==NULL)test_failed(); cfgs++; err=opus_encoder_ctl(enc,OPUS_GET_LOOKAHEAD(&i)); if(err!=OPUS_OK || i<0 || i>32766)test_failed(); cfgs++; opus_encoder_destroy(enc); VG_UNDEF(&err,sizeof(err)); enc = opus_encoder_create(48000, 2, OPUS_APPLICATION_AUDIO, &err); if(err!=OPUS_OK || enc==NULL)test_failed(); cfgs++; err=opus_encoder_ctl(enc,OPUS_GET_LOOKAHEAD(&i)); if(err!=OPUS_OK || i<0 || i>32766)test_failed(); opus_encoder_destroy(enc); cfgs++; VG_UNDEF(&err,sizeof(err)); enc = opus_encoder_create(48000, 2, OPUS_APPLICATION_VOIP, &err); if(err!=OPUS_OK || enc==NULL)test_failed(); cfgs++; fprintf(stdout," opus_encoder_create() ........................ OK.\n"); fprintf(stdout," opus_encoder_init() .......................... OK.\n"); i=-12345; VG_UNDEF(&i,sizeof(i)); err=opus_encoder_ctl(enc,OPUS_GET_LOOKAHEAD(&i)); if(err!=OPUS_OK || i<0 || i>32766)test_failed(); cfgs++; err=opus_encoder_ctl(enc,OPUS_GET_LOOKAHEAD((opus_int32 *)NULL)); if(err!=OPUS_BAD_ARG)test_failed(); cfgs++; fprintf(stdout," OPUS_GET_LOOKAHEAD ........................... OK.\n"); err=opus_encoder_ctl(enc,OPUS_GET_SAMPLE_RATE(&i)); if(err!=OPUS_OK || i!=48000)test_failed(); cfgs++; err=opus_encoder_ctl(enc,OPUS_GET_SAMPLE_RATE((opus_int32 *)NULL)); if(err!=OPUS_BAD_ARG)test_failed(); cfgs++; fprintf(stdout," OPUS_GET_SAMPLE_RATE ......................... OK.\n"); if(opus_encoder_ctl(enc,OPUS_UNIMPLEMENTED)!=OPUS_UNIMPLEMENTED)test_failed(); fprintf(stdout," OPUS_UNIMPLEMENTED ........................... OK.\n"); cfgs++; err=opus_encoder_ctl(enc,OPUS_GET_APPLICATION((opus_int32 *)NULL)); if(err!=OPUS_BAD_ARG)test_failed(); cfgs++; CHECK_SETGET(OPUS_SET_APPLICATION(i),OPUS_GET_APPLICATION(&i),-1,OPUS_AUTO, OPUS_APPLICATION_AUDIO,OPUS_APPLICATION_RESTRICTED_LOWDELAY, " OPUS_SET_APPLICATION ......................... OK.\n", " OPUS_GET_APPLICATION ......................... OK.\n") err=opus_encoder_ctl(enc,OPUS_GET_BITRATE((opus_int32 *)NULL)); if(err!=OPUS_BAD_ARG)test_failed(); cfgs++; if(opus_encoder_ctl(enc,OPUS_SET_BITRATE(1073741832))!=OPUS_OK)test_failed(); cfgs++; VG_UNDEF(&i,sizeof(i)); if(opus_encoder_ctl(enc,OPUS_GET_BITRATE(&i))!=OPUS_OK)test_failed(); if(i>700000||i<256000)test_failed(); cfgs++; CHECK_SETGET(OPUS_SET_BITRATE(i),OPUS_GET_BITRATE(&i),-12345,0, 500,256000, " OPUS_SET_BITRATE ............................. OK.\n", " OPUS_GET_BITRATE ............................. OK.\n") err=opus_encoder_ctl(enc,OPUS_GET_FORCE_CHANNELS((opus_int32 *)NULL)); if(err!=OPUS_BAD_ARG)test_failed(); cfgs++; CHECK_SETGET(OPUS_SET_FORCE_CHANNELS(i),OPUS_GET_FORCE_CHANNELS(&i),-1,3, 1,OPUS_AUTO, " OPUS_SET_FORCE_CHANNELS ...................... OK.\n", " OPUS_GET_FORCE_CHANNELS ...................... OK.\n") i=-2; if(opus_encoder_ctl(enc,OPUS_SET_BANDWIDTH(i))==OPUS_OK)test_failed(); cfgs++; i=OPUS_BANDWIDTH_FULLBAND+1; if(opus_encoder_ctl(enc,OPUS_SET_BANDWIDTH(i))==OPUS_OK)test_failed(); cfgs++; i=OPUS_BANDWIDTH_NARROWBAND; if(opus_encoder_ctl(enc,OPUS_SET_BANDWIDTH(i))!=OPUS_OK)test_failed(); cfgs++; i=OPUS_BANDWIDTH_FULLBAND; if(opus_encoder_ctl(enc,OPUS_SET_BANDWIDTH(i))!=OPUS_OK)test_failed(); cfgs++; i=OPUS_BANDWIDTH_WIDEBAND; if(opus_encoder_ctl(enc,OPUS_SET_BANDWIDTH(i))!=OPUS_OK)test_failed(); cfgs++; i=OPUS_BANDWIDTH_MEDIUMBAND; if(opus_encoder_ctl(enc,OPUS_SET_BANDWIDTH(i))!=OPUS_OK)test_failed(); cfgs++; fprintf(stdout," OPUS_SET_BANDWIDTH ........................... OK.\n"); /*We don't test if the bandwidth has actually changed. because the change may be delayed until the encoder is advanced.*/ i=-12345; VG_UNDEF(&i,sizeof(i)); err=opus_encoder_ctl(enc,OPUS_GET_BANDWIDTH(&i)); if(err!=OPUS_OK || (i!=OPUS_BANDWIDTH_NARROWBAND&& i!=OPUS_BANDWIDTH_MEDIUMBAND&&i!=OPUS_BANDWIDTH_WIDEBAND&& i!=OPUS_BANDWIDTH_FULLBAND&&i!=OPUS_AUTO))test_failed(); cfgs++; if(opus_encoder_ctl(enc,OPUS_SET_BANDWIDTH(OPUS_AUTO))!=OPUS_OK)test_failed(); cfgs++; err=opus_encoder_ctl(enc,OPUS_GET_BANDWIDTH((opus_int32 *)NULL)); if(err!=OPUS_BAD_ARG)test_failed(); cfgs++; fprintf(stdout," OPUS_GET_BANDWIDTH ........................... OK.\n"); i=-2; if(opus_encoder_ctl(enc,OPUS_SET_MAX_BANDWIDTH(i))==OPUS_OK)test_failed(); cfgs++; i=OPUS_BANDWIDTH_FULLBAND+1; if(opus_encoder_ctl(enc,OPUS_SET_MAX_BANDWIDTH(i))==OPUS_OK)test_failed(); cfgs++; i=OPUS_BANDWIDTH_NARROWBAND; if(opus_encoder_ctl(enc,OPUS_SET_MAX_BANDWIDTH(i))!=OPUS_OK)test_failed(); cfgs++; i=OPUS_BANDWIDTH_FULLBAND; if(opus_encoder_ctl(enc,OPUS_SET_MAX_BANDWIDTH(i))!=OPUS_OK)test_failed(); cfgs++; i=OPUS_BANDWIDTH_WIDEBAND; if(opus_encoder_ctl(enc,OPUS_SET_MAX_BANDWIDTH(i))!=OPUS_OK)test_failed(); cfgs++; i=OPUS_BANDWIDTH_MEDIUMBAND; if(opus_encoder_ctl(enc,OPUS_SET_MAX_BANDWIDTH(i))!=OPUS_OK)test_failed(); cfgs++; fprintf(stdout," OPUS_SET_MAX_BANDWIDTH ....................... OK.\n"); /*We don't test if the bandwidth has actually changed. because the change may be delayed until the encoder is advanced.*/ i=-12345; VG_UNDEF(&i,sizeof(i)); err=opus_encoder_ctl(enc,OPUS_GET_MAX_BANDWIDTH(&i)); if(err!=OPUS_OK || (i!=OPUS_BANDWIDTH_NARROWBAND&& i!=OPUS_BANDWIDTH_MEDIUMBAND&&i!=OPUS_BANDWIDTH_WIDEBAND&& i!=OPUS_BANDWIDTH_FULLBAND))test_failed(); cfgs++; err=opus_encoder_ctl(enc,OPUS_GET_MAX_BANDWIDTH((opus_int32 *)NULL)); if(err!=OPUS_BAD_ARG)test_failed(); cfgs++; fprintf(stdout," OPUS_GET_MAX_BANDWIDTH ....................... OK.\n"); err=opus_encoder_ctl(enc,OPUS_GET_DTX((opus_int32 *)NULL)); if(err!=OPUS_BAD_ARG)test_failed(); cfgs++; CHECK_SETGET(OPUS_SET_DTX(i),OPUS_GET_DTX(&i),-1,2, 1,0, " OPUS_SET_DTX ................................. OK.\n", " OPUS_GET_DTX ................................. OK.\n") err=opus_encoder_ctl(enc,OPUS_GET_COMPLEXITY((opus_int32 *)NULL)); if(err!=OPUS_BAD_ARG)test_failed(); cfgs++; CHECK_SETGET(OPUS_SET_COMPLEXITY(i),OPUS_GET_COMPLEXITY(&i),-1,11, 0,10, " OPUS_SET_COMPLEXITY .......................... OK.\n", " OPUS_GET_COMPLEXITY .......................... OK.\n") err=opus_encoder_ctl(enc,OPUS_GET_INBAND_FEC((opus_int32 *)NULL)); if(err!=OPUS_BAD_ARG)test_failed(); cfgs++; CHECK_SETGET(OPUS_SET_INBAND_FEC(i),OPUS_GET_INBAND_FEC(&i),-1,2, 1,0, " OPUS_SET_INBAND_FEC .......................... OK.\n", " OPUS_GET_INBAND_FEC .......................... OK.\n") err=opus_encoder_ctl(enc,OPUS_GET_PACKET_LOSS_PERC((opus_int32 *)NULL)); if(err!=OPUS_BAD_ARG)test_failed(); cfgs++; CHECK_SETGET(OPUS_SET_PACKET_LOSS_PERC(i),OPUS_GET_PACKET_LOSS_PERC(&i),-1,101, 100,0, " OPUS_SET_PACKET_LOSS_PERC .................... OK.\n", " OPUS_GET_PACKET_LOSS_PERC .................... OK.\n") err=opus_encoder_ctl(enc,OPUS_GET_VBR((opus_int32 *)NULL)); if(err!=OPUS_BAD_ARG)test_failed(); cfgs++; CHECK_SETGET(OPUS_SET_VBR(i),OPUS_GET_VBR(&i),-1,2, 1,0, " OPUS_SET_VBR ................................. OK.\n", " OPUS_GET_VBR ................................. OK.\n") /* err=opus_encoder_ctl(enc,OPUS_GET_VOICE_RATIO((opus_int32 *)NULL)); if(err!=OPUS_BAD_ARG)test_failed(); cfgs++; CHECK_SETGET(OPUS_SET_VOICE_RATIO(i),OPUS_GET_VOICE_RATIO(&i),-2,101, 0,50, " OPUS_SET_VOICE_RATIO ......................... OK.\n", " OPUS_GET_VOICE_RATIO ......................... OK.\n")*/ err=opus_encoder_ctl(enc,OPUS_GET_VBR_CONSTRAINT((opus_int32 *)NULL)); if(err!=OPUS_BAD_ARG)test_failed(); cfgs++; CHECK_SETGET(OPUS_SET_VBR_CONSTRAINT(i),OPUS_GET_VBR_CONSTRAINT(&i),-1,2, 1,0, " OPUS_SET_VBR_CONSTRAINT ...................... OK.\n", " OPUS_GET_VBR_CONSTRAINT ...................... OK.\n") err=opus_encoder_ctl(enc,OPUS_GET_SIGNAL((opus_int32 *)NULL)); if(err!=OPUS_BAD_ARG)test_failed(); cfgs++; CHECK_SETGET(OPUS_SET_SIGNAL(i),OPUS_GET_SIGNAL(&i),-12345,0x7FFFFFFF, OPUS_SIGNAL_MUSIC,OPUS_AUTO, " OPUS_SET_SIGNAL .............................. OK.\n", " OPUS_GET_SIGNAL .............................. OK.\n") err=opus_encoder_ctl(enc,OPUS_GET_LSB_DEPTH((opus_int32 *)NULL)); if(err!=OPUS_BAD_ARG)test_failed(); cfgs++; CHECK_SETGET(OPUS_SET_LSB_DEPTH(i),OPUS_GET_LSB_DEPTH(&i),7,25,16,24, " OPUS_SET_LSB_DEPTH ........................... OK.\n", " OPUS_GET_LSB_DEPTH ........................... OK.\n") err=opus_encoder_ctl(enc,OPUS_GET_PREDICTION_DISABLED(&i)); if(i!=0)test_failed(); cfgs++; err=opus_encoder_ctl(enc,OPUS_GET_PREDICTION_DISABLED((opus_int32 *)NULL)); if(err!=OPUS_BAD_ARG)test_failed(); cfgs++; CHECK_SETGET(OPUS_SET_PREDICTION_DISABLED(i),OPUS_GET_PREDICTION_DISABLED(&i),-1,2,1,0, " OPUS_SET_PREDICTION_DISABLED ................. OK.\n", " OPUS_GET_PREDICTION_DISABLED ................. OK.\n") err=opus_encoder_ctl(enc,OPUS_GET_EXPERT_FRAME_DURATION((opus_int32 *)NULL)); if(err!=OPUS_BAD_ARG)test_failed(); cfgs++; err=opus_encoder_ctl(enc,OPUS_SET_EXPERT_FRAME_DURATION(OPUS_FRAMESIZE_2_5_MS)); if(err!=OPUS_OK)test_failed(); cfgs++; err=opus_encoder_ctl(enc,OPUS_SET_EXPERT_FRAME_DURATION(OPUS_FRAMESIZE_5_MS)); if(err!=OPUS_OK)test_failed(); cfgs++; err=opus_encoder_ctl(enc,OPUS_SET_EXPERT_FRAME_DURATION(OPUS_FRAMESIZE_10_MS)); if(err!=OPUS_OK)test_failed(); cfgs++; err=opus_encoder_ctl(enc,OPUS_SET_EXPERT_FRAME_DURATION(OPUS_FRAMESIZE_20_MS)); if(err!=OPUS_OK)test_failed(); cfgs++; err=opus_encoder_ctl(enc,OPUS_SET_EXPERT_FRAME_DURATION(OPUS_FRAMESIZE_40_MS)); if(err!=OPUS_OK)test_failed(); cfgs++; err=opus_encoder_ctl(enc,OPUS_SET_EXPERT_FRAME_DURATION(OPUS_FRAMESIZE_60_MS)); if(err!=OPUS_OK)test_failed(); cfgs++; err=opus_encoder_ctl(enc,OPUS_SET_EXPERT_FRAME_DURATION(OPUS_FRAMESIZE_80_MS)); if(err!=OPUS_OK)test_failed(); cfgs++; err=opus_encoder_ctl(enc,OPUS_SET_EXPERT_FRAME_DURATION(OPUS_FRAMESIZE_100_MS)); if(err!=OPUS_OK)test_failed(); cfgs++; err=opus_encoder_ctl(enc,OPUS_SET_EXPERT_FRAME_DURATION(OPUS_FRAMESIZE_120_MS)); if(err!=OPUS_OK)test_failed(); cfgs++; CHECK_SETGET(OPUS_SET_EXPERT_FRAME_DURATION(i),OPUS_GET_EXPERT_FRAME_DURATION(&i),0,-1, OPUS_FRAMESIZE_60_MS,OPUS_FRAMESIZE_ARG, " OPUS_SET_EXPERT_FRAME_DURATION ............... OK.\n", " OPUS_GET_EXPERT_FRAME_DURATION ............... OK.\n") /*OPUS_SET_FORCE_MODE is not tested here because it's not a public API, however the encoder tests use it*/ err=opus_encoder_ctl(enc,OPUS_GET_FINAL_RANGE((opus_uint32 *)NULL)); if(err!=OPUS_BAD_ARG)test_failed(); cfgs++; if(opus_encoder_ctl(enc,OPUS_GET_FINAL_RANGE(&enc_final_range))!=OPUS_OK)test_failed(); cfgs++; fprintf(stdout," OPUS_GET_FINAL_RANGE ......................... OK.\n"); /*Reset the encoder*/ if(opus_encoder_ctl(enc, OPUS_RESET_STATE)!=OPUS_OK)test_failed(); cfgs++; fprintf(stdout," OPUS_RESET_STATE ............................. OK.\n"); memset(sbuf,0,sizeof(short)*2*960); VG_UNDEF(packet,sizeof(packet)); i=opus_encode(enc, sbuf, 960, packet, sizeof(packet)); if(i<1 || (i>(opus_int32)sizeof(packet)))test_failed(); VG_CHECK(packet,i); cfgs++; fprintf(stdout," opus_encode() ................................ OK.\n"); #ifndef DISABLE_FLOAT_API memset(fbuf,0,sizeof(float)*2*960); VG_UNDEF(packet,sizeof(packet)); i=opus_encode_float(enc, fbuf, 960, packet, sizeof(packet)); if(i<1 || (i>(opus_int32)sizeof(packet)))test_failed(); VG_CHECK(packet,i); cfgs++; fprintf(stdout," opus_encode_float() .......................... OK.\n"); #endif #if 0 /*These tests are disabled because the library crashes with null states*/ if(opus_encoder_ctl(0,OPUS_RESET_STATE) !=OPUS_INVALID_STATE)test_failed(); if(opus_encoder_init(0,48000,1,OPUS_APPLICATION_VOIP) !=OPUS_INVALID_STATE)test_failed(); if(opus_encode(0,sbuf,960,packet,sizeof(packet)) !=OPUS_INVALID_STATE)test_failed(); if(opus_encode_float(0,fbuf,960,packet,sizeof(packet))!=OPUS_INVALID_STATE)test_failed(); #endif opus_encoder_destroy(enc); cfgs++; fprintf(stdout," All encoder interface tests passed\n"); fprintf(stdout," (%d API invocations)\n",cfgs); return cfgs; } #define max_out (1276*48+48*2+2) int test_repacketizer_api(void) { int ret,cfgs,i,j,k; OpusRepacketizer *rp; unsigned char *packet; unsigned char *po; cfgs=0; fprintf(stdout,"\n Repacketizer tests\n"); fprintf(stdout," ---------------------------------------------------\n"); packet=malloc(max_out); if(packet==NULL)test_failed(); memset(packet,0,max_out); po=malloc(max_out+256); if(po==NULL)test_failed(); i=opus_repacketizer_get_size(); if(i<=0)test_failed(); cfgs++; fprintf(stdout," opus_repacketizer_get_size()=%d ............. OK.\n",i); rp=malloc(i); rp=opus_repacketizer_init(rp); if(rp==NULL)test_failed(); cfgs++; free(rp); fprintf(stdout," opus_repacketizer_init ....................... OK.\n"); rp=opus_repacketizer_create(); if(rp==NULL)test_failed(); cfgs++; fprintf(stdout," opus_repacketizer_create ..................... OK.\n"); if(opus_repacketizer_get_nb_frames(rp)!=0)test_failed(); cfgs++; fprintf(stdout," opus_repacketizer_get_nb_frames .............. OK.\n"); /*Length overflows*/ VG_UNDEF(packet,4); if(opus_repacketizer_cat(rp,packet,0)!=OPUS_INVALID_PACKET)test_failed(); /* Zero len */ cfgs++; packet[0]=1; if(opus_repacketizer_cat(rp,packet,2)!=OPUS_INVALID_PACKET)test_failed(); /* Odd payload code 1 */ cfgs++; packet[0]=2; if(opus_repacketizer_cat(rp,packet,1)!=OPUS_INVALID_PACKET)test_failed(); /* Code 2 overflow one */ cfgs++; packet[0]=3; if(opus_repacketizer_cat(rp,packet,1)!=OPUS_INVALID_PACKET)test_failed(); /* Code 3 no count */ cfgs++; packet[0]=2; packet[1]=255; if(opus_repacketizer_cat(rp,packet,2)!=OPUS_INVALID_PACKET)test_failed(); /* Code 2 overflow two */ cfgs++; packet[0]=2; packet[1]=250; if(opus_repacketizer_cat(rp,packet,251)!=OPUS_INVALID_PACKET)test_failed(); /* Code 2 overflow three */ cfgs++; packet[0]=3; packet[1]=0; if(opus_repacketizer_cat(rp,packet,2)!=OPUS_INVALID_PACKET)test_failed(); /* Code 3 m=0 */ cfgs++; packet[1]=49; if(opus_repacketizer_cat(rp,packet,100)!=OPUS_INVALID_PACKET)test_failed(); /* Code 3 m=49 */ cfgs++; packet[0]=0; if(opus_repacketizer_cat(rp,packet,3)!=OPUS_OK)test_failed(); cfgs++; packet[0]=1<<2; if(opus_repacketizer_cat(rp,packet,3)!=OPUS_INVALID_PACKET)test_failed(); /* Change in TOC */ cfgs++; /* Code 0,1,3 CBR -> Code 0,1,3 CBR */ opus_repacketizer_init(rp); for(j=0;j<32;j++) { /* TOC types, test half with stereo */ int maxi; packet[0]=((j<<1)+(j&1))<<2; maxi=960/opus_packet_get_samples_per_frame(packet,8000); for(i=1;i<=maxi;i++) { /* Number of CBR frames in the input packets */ int maxp; packet[0]=((j<<1)+(j&1))<<2; if(i>1)packet[0]+=i==2?1:3; packet[1]=i>2?i:0; maxp=960/(i*opus_packet_get_samples_per_frame(packet,8000)); for(k=0;k<=(1275+75);k+=3) { /*Payload size*/ opus_int32 cnt,rcnt; if(k%i!=0)continue; /* Only testing CBR here, payload must be a multiple of the count */ for(cnt=0;cnt0) { ret=opus_repacketizer_cat(rp,packet,k+(i>2?2:1)); if((cnt<=maxp&&k<=(1275*i))?ret!=OPUS_OK:ret!=OPUS_INVALID_PACKET)test_failed(); cfgs++; } rcnt=k<=(1275*i)?(cnt0) { int len; len=k*rcnt+((rcnt*i)>2?2:1); if(ret!=len)test_failed(); if((rcnt*i)<2&&(po[0]&3)!=0)test_failed(); /* Code 0 */ if((rcnt*i)==2&&(po[0]&3)!=1)test_failed(); /* Code 1 */ if((rcnt*i)>2&&(((po[0]&3)!=3)||(po[1]!=rcnt*i)))test_failed(); /* Code 3 CBR */ cfgs++; if(opus_repacketizer_out(rp,po,len)!=len)test_failed(); cfgs++; if(opus_packet_unpad(po,len)!=len)test_failed(); cfgs++; if(opus_packet_pad(po,len,len+1)!=OPUS_OK)test_failed(); cfgs++; if(opus_packet_pad(po,len+1,len+256)!=OPUS_OK)test_failed(); cfgs++; if(opus_packet_unpad(po,len+256)!=len)test_failed(); cfgs++; if(opus_multistream_packet_unpad(po,len,1)!=len)test_failed(); cfgs++; if(opus_multistream_packet_pad(po,len,len+1,1)!=OPUS_OK)test_failed(); cfgs++; if(opus_multistream_packet_pad(po,len+1,len+256,1)!=OPUS_OK)test_failed(); cfgs++; if(opus_multistream_packet_unpad(po,len+256,1)!=len)test_failed(); cfgs++; if(opus_repacketizer_out(rp,po,len-1)!=OPUS_BUFFER_TOO_SMALL)test_failed(); cfgs++; if(len>1) { if(opus_repacketizer_out(rp,po,1)!=OPUS_BUFFER_TOO_SMALL)test_failed(); cfgs++; } if(opus_repacketizer_out(rp,po,0)!=OPUS_BUFFER_TOO_SMALL)test_failed(); cfgs++; } else if (ret!=OPUS_BAD_ARG)test_failed(); /* M must not be 0 */ } opus_repacketizer_init(rp); } } } /*Change in input count code, CBR out*/ opus_repacketizer_init(rp); packet[0]=0; if(opus_repacketizer_cat(rp,packet,5)!=OPUS_OK)test_failed(); cfgs++; packet[0]+=1; if(opus_repacketizer_cat(rp,packet,9)!=OPUS_OK)test_failed(); cfgs++; i=opus_repacketizer_out(rp,po,max_out); if((i!=(4+8+2))||((po[0]&3)!=3)||((po[1]&63)!=3)||((po[1]>>7)!=0))test_failed(); cfgs++; i=opus_repacketizer_out_range(rp,0,1,po,max_out); if(i!=5||(po[0]&3)!=0)test_failed(); cfgs++; i=opus_repacketizer_out_range(rp,1,2,po,max_out); if(i!=5||(po[0]&3)!=0)test_failed(); cfgs++; /*Change in input count code, VBR out*/ opus_repacketizer_init(rp); packet[0]=1; if(opus_repacketizer_cat(rp,packet,9)!=OPUS_OK)test_failed(); cfgs++; packet[0]=0; if(opus_repacketizer_cat(rp,packet,3)!=OPUS_OK)test_failed(); cfgs++; i=opus_repacketizer_out(rp,po,max_out); if((i!=(2+8+2+2))||((po[0]&3)!=3)||((po[1]&63)!=3)||((po[1]>>7)!=1))test_failed(); cfgs++; /*VBR in, VBR out*/ opus_repacketizer_init(rp); packet[0]=2; packet[1]=4; if(opus_repacketizer_cat(rp,packet,8)!=OPUS_OK)test_failed(); cfgs++; if(opus_repacketizer_cat(rp,packet,8)!=OPUS_OK)test_failed(); cfgs++; i=opus_repacketizer_out(rp,po,max_out); if((i!=(2+1+1+1+4+2+4+2))||((po[0]&3)!=3)||((po[1]&63)!=4)||((po[1]>>7)!=1))test_failed(); cfgs++; /*VBR in, CBR out*/ opus_repacketizer_init(rp); packet[0]=2; packet[1]=4; if(opus_repacketizer_cat(rp,packet,10)!=OPUS_OK)test_failed(); cfgs++; if(opus_repacketizer_cat(rp,packet,10)!=OPUS_OK)test_failed(); cfgs++; i=opus_repacketizer_out(rp,po,max_out); if((i!=(2+4+4+4+4))||((po[0]&3)!=3)||((po[1]&63)!=4)||((po[1]>>7)!=0))test_failed(); cfgs++; /*Count 0 in, VBR out*/ for(j=0;j<32;j++) { /* TOC types, test half with stereo */ int maxi,sum,rcnt; packet[0]=((j<<1)+(j&1))<<2; maxi=960/opus_packet_get_samples_per_frame(packet,8000); sum=0; rcnt=0; opus_repacketizer_init(rp); for(i=1;i<=maxi+2;i++) { int len; ret=opus_repacketizer_cat(rp,packet,i); if(rcnt2&&(po[1]&63)!=rcnt)test_failed(); if(rcnt==2&&(po[0]&3)!=2)test_failed(); if(rcnt==1&&(po[0]&3)!=0)test_failed(); cfgs++; if(opus_repacketizer_out(rp,po,len)!=len)test_failed(); cfgs++; if(opus_packet_unpad(po,len)!=len)test_failed(); cfgs++; if(opus_packet_pad(po,len,len+1)!=OPUS_OK)test_failed(); cfgs++; if(opus_packet_pad(po,len+1,len+256)!=OPUS_OK)test_failed(); cfgs++; if(opus_packet_unpad(po,len+256)!=len)test_failed(); cfgs++; if(opus_multistream_packet_unpad(po,len,1)!=len)test_failed(); cfgs++; if(opus_multistream_packet_pad(po,len,len+1,1)!=OPUS_OK)test_failed(); cfgs++; if(opus_multistream_packet_pad(po,len+1,len+256,1)!=OPUS_OK)test_failed(); cfgs++; if(opus_multistream_packet_unpad(po,len+256,1)!=len)test_failed(); cfgs++; if(opus_repacketizer_out(rp,po,len-1)!=OPUS_BUFFER_TOO_SMALL)test_failed(); cfgs++; if(len>1) { if(opus_repacketizer_out(rp,po,1)!=OPUS_BUFFER_TOO_SMALL)test_failed(); cfgs++; } if(opus_repacketizer_out(rp,po,0)!=OPUS_BUFFER_TOO_SMALL)test_failed(); cfgs++; } } po[0]='O'; po[1]='p'; if(opus_packet_pad(po,4,4)!=OPUS_OK)test_failed(); cfgs++; if(opus_multistream_packet_pad(po,4,4,1)!=OPUS_OK)test_failed(); cfgs++; if(opus_packet_pad(po,4,5)!=OPUS_INVALID_PACKET)test_failed(); cfgs++; if(opus_multistream_packet_pad(po,4,5,1)!=OPUS_INVALID_PACKET)test_failed(); cfgs++; if(opus_packet_pad(po,0,5)!=OPUS_BAD_ARG)test_failed(); cfgs++; if(opus_multistream_packet_pad(po,0,5,1)!=OPUS_BAD_ARG)test_failed(); cfgs++; if(opus_packet_unpad(po,0)!=OPUS_BAD_ARG)test_failed(); cfgs++; if(opus_multistream_packet_unpad(po,0,1)!=OPUS_BAD_ARG)test_failed(); cfgs++; if(opus_packet_unpad(po,4)!=OPUS_INVALID_PACKET)test_failed(); cfgs++; if(opus_multistream_packet_unpad(po,4,1)!=OPUS_INVALID_PACKET)test_failed(); cfgs++; po[0]=0; po[1]=0; po[2]=0; if(opus_packet_pad(po,5,4)!=OPUS_BAD_ARG)test_failed(); cfgs++; if(opus_multistream_packet_pad(po,5,4,1)!=OPUS_BAD_ARG)test_failed(); cfgs++; fprintf(stdout," opus_repacketizer_cat ........................ OK.\n"); fprintf(stdout," opus_repacketizer_out ........................ OK.\n"); fprintf(stdout," opus_repacketizer_out_range .................. OK.\n"); fprintf(stdout," opus_packet_pad .............................. OK.\n"); fprintf(stdout," opus_packet_unpad ............................ OK.\n"); fprintf(stdout," opus_multistream_packet_pad .................. OK.\n"); fprintf(stdout," opus_multistream_packet_unpad ................ OK.\n"); opus_repacketizer_destroy(rp); cfgs++; free(packet); free(po); fprintf(stdout," All repacketizer tests passed\n"); fprintf(stdout," (%7d API invocations)\n",cfgs); return cfgs; } #ifdef MALLOC_FAIL /* GLIBC 2.14 declares __malloc_hook as deprecated, generating a warning * under GCC. However, this is the cleanest way to test malloc failure * handling in our codebase, and the lack of thread safety isn't an * issue here. We therefore disable the warning for this function. */ #if OPUS_GNUC_PREREQ(4,6) /* Save the current warning settings */ #pragma GCC diagnostic push #endif #pragma GCC diagnostic ignored "-Wdeprecated-declarations" typedef void *(*mhook)(size_t __size, __const void *); #endif int test_malloc_fail(void) { #ifdef MALLOC_FAIL OpusDecoder *dec; OpusEncoder *enc; OpusRepacketizer *rp; unsigned char mapping[256] = {0,1}; OpusMSDecoder *msdec; OpusMSEncoder *msenc; int rate,c,app,cfgs,err,useerr; int *ep; mhook orig_malloc; cfgs=0; #endif fprintf(stdout,"\n malloc() failure tests\n"); fprintf(stdout," ---------------------------------------------------\n"); #ifdef MALLOC_FAIL orig_malloc=__malloc_hook; __malloc_hook=malloc_hook; ep=(int *)opus_alloc(sizeof(int)); if(ep!=NULL) { if(ep)free(ep); __malloc_hook=orig_malloc; #endif fprintf(stdout," opus_decoder_create() ................... SKIPPED.\n"); fprintf(stdout," opus_encoder_create() ................... SKIPPED.\n"); fprintf(stdout," opus_repacketizer_create() .............. SKIPPED.\n"); fprintf(stdout," opus_multistream_decoder_create() ....... SKIPPED.\n"); fprintf(stdout," opus_multistream_encoder_create() ....... SKIPPED.\n"); fprintf(stdout,"(Test only supported with GLIBC and without valgrind)\n"); return 0; #ifdef MALLOC_FAIL } for(useerr=0;useerr<2;useerr++) { ep=useerr?&err:0; for(rate=0;rate<5;rate++) { for(c=1;c<3;c++) { err=1; if(useerr) { VG_UNDEF(&err,sizeof(err)); } dec=opus_decoder_create(opus_rates[rate], c, ep); if(dec!=NULL||(useerr&&err!=OPUS_ALLOC_FAIL)) { __malloc_hook=orig_malloc; test_failed(); } cfgs++; msdec=opus_multistream_decoder_create(opus_rates[rate], c, 1, c-1, mapping, ep); if(msdec!=NULL||(useerr&&err!=OPUS_ALLOC_FAIL)) { __malloc_hook=orig_malloc; test_failed(); } cfgs++; for(app=0;app<3;app++) { if(useerr) { VG_UNDEF(&err,sizeof(err)); } enc=opus_encoder_create(opus_rates[rate], c, opus_apps[app],ep); if(enc!=NULL||(useerr&&err!=OPUS_ALLOC_FAIL)) { __malloc_hook=orig_malloc; test_failed(); } cfgs++; msenc=opus_multistream_encoder_create(opus_rates[rate], c, 1, c-1, mapping, opus_apps[app],ep); if(msenc!=NULL||(useerr&&err!=OPUS_ALLOC_FAIL)) { __malloc_hook=orig_malloc; test_failed(); } cfgs++; } } } } rp=opus_repacketizer_create(); if(rp!=NULL) { __malloc_hook=orig_malloc; test_failed(); } cfgs++; __malloc_hook=orig_malloc; fprintf(stdout," opus_decoder_create() ........................ OK.\n"); fprintf(stdout," opus_encoder_create() ........................ OK.\n"); fprintf(stdout," opus_repacketizer_create() ................... OK.\n"); fprintf(stdout," opus_multistream_decoder_create() ............ OK.\n"); fprintf(stdout," opus_multistream_encoder_create() ............ OK.\n"); fprintf(stdout," All malloc failure tests passed\n"); fprintf(stdout," (%2d API invocations)\n",cfgs); return cfgs; #endif } #ifdef MALLOC_FAIL #if __GNUC_PREREQ(4,6) #pragma GCC diagnostic pop /* restore -Wdeprecated-declarations */ #endif #endif int main(int _argc, char **_argv) { opus_int32 total; const char * oversion; if(_argc>1) { fprintf(stderr,"Usage: %s\n",_argv[0]); return 1; } iseed=0; oversion=opus_get_version_string(); if(!oversion)test_failed(); fprintf(stderr,"Testing the %s API deterministically\n", oversion); if(opus_strerror(-32768)==NULL)test_failed(); if(opus_strerror(32767)==NULL)test_failed(); if(strlen(opus_strerror(0))<1)test_failed(); total=4; total+=test_dec_api(); total+=test_msdec_api(); total+=test_parse(); total+=test_enc_api(); total+=test_repacketizer_api(); total+=test_malloc_fail(); fprintf(stderr,"\nAll API tests passed.\nThe libopus API was invoked %d times.\n",total); return 0; } mumble-1.3.4/3rdparty/opus-src/opus.pc.in0000664000175000017500000000053314010707327020104 0ustar builderbuilder# Opus codec reference implementation pkg-config file prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: Opus Description: Opus IETF audio codec (@PC_BUILD@ build) URL: https://opus-codec.org/ Version: @VERSION@ Requires: Conflicts: Libs: -L${libdir} -lopus Libs.private: @LIBM@ Cflags: -I${includedir}/opus mumble-1.3.4/3rdparty/opus-src/README.draft0000664000175000017500000000416314010707326020146 0ustar builderbuilderTo build this source code, simply type: % make If this does not work, or if you want to change the default configuration (e.g., to compile for a fixed-point architecture), simply edit the options in the Makefile. An up-to-date implementation conforming to this standard is available in a Git repository at https://git.xiph.org/opus.git or on a website at: https://opus-codec.org/ However, although that implementation is expected to remain conformant with the standard, it is the code in this RFC that shall remain normative. To build from the git repository instead of using this RFC, follow these steps: 1) Clone the repository (latest implementation of this standard at the time of publication) % git clone https://git.xiph.org/opus.git % cd opus 2) Compile % ./autogen.sh % ./configure % make Once you have compiled the codec, there will be a opus_demo executable in the top directory. Usage: opus_demo [-e] [options] opus_demo -d [options] mode: voip | audio | restricted-lowdelay options: -e : only runs the encoder (output the bit-stream) -d : only runs the decoder (reads the bit-stream as input) -cbr : enable constant bitrate; default: variable bitrate -cvbr : enable constrained variable bitrate; default: unconstrained -bandwidth : audio bandwidth (from narrowband to fullband); default: sampling rate -framesize <2.5|5|10|20|40|60> : frame size in ms; default: 20 -max_payload : maximum payload size in bytes, default: 1024 -complexity : complexity, 0 (lowest) ... 10 (highest); default: 10 -inbandfec : enable SILK inband FEC -forcemono : force mono encoding, even for stereo input -dtx : enable SILK DTX -loss : simulate packet loss, in percent (0-100); default: 0 input and output are little endian signed 16-bit PCM files or opus bitstreams with simple opus_demo proprietary framing. mumble-1.3.4/3rdparty/opus-src/.travis.yml0000664000175000017500000000051014010707326020270 0ustar builderbuilderlanguage: c compiler: - gcc - clang os: - linux - osx env: - CONFIG="" - CONFIG="--enable-assertions" - CONFIG="--enable-fixed-point" - CONFIG="--enable-fixed-point --disable-float-api" - CONFIG="--enable-fixed-point --enable-assertions" script: - ./autogen.sh - ./configure $CONFIG - make distcheck mumble-1.3.4/3rdparty/opus-src/Makefile.am0000664000175000017500000002552314010707326020226 0ustar builderbuilder# Provide the full test output for failed tests when using the parallel # test suite (which is enabled by default with automake 1.13+). export VERBOSE = yes AUTOMAKE_OPTIONS = subdir-objects ACLOCAL_AMFLAGS = -I m4 lib_LTLIBRARIES = libopus.la DIST_SUBDIRS = doc AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/celt -I$(top_srcdir)/silk \ -I$(top_srcdir)/silk/float -I$(top_srcdir)/silk/fixed $(NE10_CFLAGS) include celt_sources.mk include silk_sources.mk include opus_sources.mk if FIXED_POINT SILK_SOURCES += $(SILK_SOURCES_FIXED) if HAVE_SSE4_1 SILK_SOURCES += $(SILK_SOURCES_SSE4_1) $(SILK_SOURCES_FIXED_SSE4_1) endif if HAVE_ARM_NEON_INTR SILK_SOURCES += $(SILK_SOURCES_FIXED_ARM_NEON_INTR) endif else SILK_SOURCES += $(SILK_SOURCES_FLOAT) if HAVE_SSE4_1 SILK_SOURCES += $(SILK_SOURCES_SSE4_1) endif endif if DISABLE_FLOAT_API else OPUS_SOURCES += $(OPUS_SOURCES_FLOAT) endif if HAVE_SSE CELT_SOURCES += $(CELT_SOURCES_SSE) endif if HAVE_SSE2 CELT_SOURCES += $(CELT_SOURCES_SSE2) endif if HAVE_SSE4_1 CELT_SOURCES += $(CELT_SOURCES_SSE4_1) endif if CPU_ARM CELT_SOURCES += $(CELT_SOURCES_ARM) SILK_SOURCES += $(SILK_SOURCES_ARM) if HAVE_ARM_NEON_INTR CELT_SOURCES += $(CELT_SOURCES_ARM_NEON_INTR) SILK_SOURCES += $(SILK_SOURCES_ARM_NEON_INTR) endif if HAVE_ARM_NE10 CELT_SOURCES += $(CELT_SOURCES_ARM_NE10) endif if OPUS_ARM_EXTERNAL_ASM noinst_LTLIBRARIES = libarmasm.la libarmasm_la_SOURCES = $(CELT_SOURCES_ARM_ASM:.s=-gnu.S) BUILT_SOURCES = $(CELT_SOURCES_ARM_ASM:.s=-gnu.S) \ $(CELT_AM_SOURCES_ARM_ASM:.s.in=.s) \ $(CELT_AM_SOURCES_ARM_ASM:.s.in=-gnu.S) endif endif CLEANFILES = $(CELT_SOURCES_ARM_ASM:.s=-gnu.S) \ $(CELT_AM_SOURCES_ARM_ASM:.s.in=-gnu.S) include celt_headers.mk include silk_headers.mk include opus_headers.mk libopus_la_SOURCES = $(CELT_SOURCES) $(SILK_SOURCES) $(OPUS_SOURCES) libopus_la_LDFLAGS = -no-undefined -version-info @OPUS_LT_CURRENT@:@OPUS_LT_REVISION@:@OPUS_LT_AGE@ libopus_la_LIBADD = $(NE10_LIBS) $(LIBM) if OPUS_ARM_EXTERNAL_ASM libopus_la_LIBADD += libarmasm.la endif pkginclude_HEADERS = include/opus.h include/opus_multistream.h include/opus_types.h include/opus_defines.h noinst_HEADERS = $(OPUS_HEAD) $(SILK_HEAD) $(CELT_HEAD) if EXTRA_PROGRAMS noinst_PROGRAMS = celt/tests/test_unit_cwrs32 \ celt/tests/test_unit_dft \ celt/tests/test_unit_entropy \ celt/tests/test_unit_laplace \ celt/tests/test_unit_mathops \ celt/tests/test_unit_mdct \ celt/tests/test_unit_rotation \ celt/tests/test_unit_types \ opus_compare \ opus_demo \ repacketizer_demo \ silk/tests/test_unit_LPC_inv_pred_gain \ tests/test_opus_api \ tests/test_opus_decode \ tests/test_opus_encode \ tests/test_opus_padding TESTS = celt/tests/test_unit_cwrs32 \ celt/tests/test_unit_dft \ celt/tests/test_unit_entropy \ celt/tests/test_unit_laplace \ celt/tests/test_unit_mathops \ celt/tests/test_unit_mdct \ celt/tests/test_unit_rotation \ celt/tests/test_unit_types \ silk/tests/test_unit_LPC_inv_pred_gain \ tests/test_opus_api \ tests/test_opus_decode \ tests/test_opus_encode \ tests/test_opus_padding opus_demo_SOURCES = src/opus_demo.c opus_demo_LDADD = libopus.la $(NE10_LIBS) $(LIBM) repacketizer_demo_SOURCES = src/repacketizer_demo.c repacketizer_demo_LDADD = libopus.la $(NE10_LIBS) $(LIBM) opus_compare_SOURCES = src/opus_compare.c opus_compare_LDADD = $(LIBM) tests_test_opus_api_SOURCES = tests/test_opus_api.c tests/test_opus_common.h tests_test_opus_api_LDADD = libopus.la $(NE10_LIBS) $(LIBM) tests_test_opus_encode_SOURCES = tests/test_opus_encode.c tests/opus_encode_regressions.c tests/test_opus_common.h tests_test_opus_encode_LDADD = libopus.la $(NE10_LIBS) $(LIBM) tests_test_opus_decode_SOURCES = tests/test_opus_decode.c tests/test_opus_common.h tests_test_opus_decode_LDADD = libopus.la $(NE10_LIBS) $(LIBM) tests_test_opus_padding_SOURCES = tests/test_opus_padding.c tests/test_opus_common.h tests_test_opus_padding_LDADD = libopus.la $(NE10_LIBS) $(LIBM) CELT_OBJ = $(CELT_SOURCES:.c=.lo) SILK_OBJ = $(SILK_SOURCES:.c=.lo) silk_tests_test_unit_LPC_inv_pred_gain_SOURCES = silk/tests/test_unit_LPC_inv_pred_gain.c silk_tests_test_unit_LPC_inv_pred_gain_LDADD = $(SILK_OBJ) $(CELT_OBJ) $(NE10_LIBS) $(LIBM) if OPUS_ARM_EXTERNAL_ASM silk_tests_test_unit_LPC_inv_pred_gain_LDADD += libarmasm.la endif celt_tests_test_unit_cwrs32_SOURCES = celt/tests/test_unit_cwrs32.c celt_tests_test_unit_cwrs32_LDADD = $(LIBM) celt_tests_test_unit_dft_SOURCES = celt/tests/test_unit_dft.c celt_tests_test_unit_dft_LDADD = $(CELT_OBJ) $(NE10_LIBS) $(LIBM) if OPUS_ARM_EXTERNAL_ASM celt_tests_test_unit_dft_LDADD += libarmasm.la endif celt_tests_test_unit_entropy_SOURCES = celt/tests/test_unit_entropy.c celt_tests_test_unit_entropy_LDADD = $(LIBM) celt_tests_test_unit_laplace_SOURCES = celt/tests/test_unit_laplace.c celt_tests_test_unit_laplace_LDADD = $(LIBM) celt_tests_test_unit_mathops_SOURCES = celt/tests/test_unit_mathops.c celt_tests_test_unit_mathops_LDADD = $(CELT_OBJ) $(NE10_LIBS) $(LIBM) if OPUS_ARM_EXTERNAL_ASM celt_tests_test_unit_mathops_LDADD += libarmasm.la endif celt_tests_test_unit_mdct_SOURCES = celt/tests/test_unit_mdct.c celt_tests_test_unit_mdct_LDADD = $(CELT_OBJ) $(NE10_LIBS) $(LIBM) if OPUS_ARM_EXTERNAL_ASM celt_tests_test_unit_mdct_LDADD += libarmasm.la endif celt_tests_test_unit_rotation_SOURCES = celt/tests/test_unit_rotation.c celt_tests_test_unit_rotation_LDADD = $(CELT_OBJ) $(NE10_LIBS) $(LIBM) if OPUS_ARM_EXTERNAL_ASM celt_tests_test_unit_rotation_LDADD += libarmasm.la endif celt_tests_test_unit_types_SOURCES = celt/tests/test_unit_types.c celt_tests_test_unit_types_LDADD = $(LIBM) endif if CUSTOM_MODES pkginclude_HEADERS += include/opus_custom.h if EXTRA_PROGRAMS noinst_PROGRAMS += opus_custom_demo opus_custom_demo_SOURCES = celt/opus_custom_demo.c opus_custom_demo_LDADD = libopus.la $(LIBM) endif endif EXTRA_DIST = opus.pc.in \ opus-uninstalled.pc.in \ opus.m4 \ Makefile.mips \ Makefile.unix \ tests/run_vectors.sh \ celt/arm/arm2gnu.pl \ celt/arm/celt_pitch_xcorr_arm.s \ win32/VS2015/opus.vcxproj \ win32/VS2015/test_opus_encode.vcxproj.filters \ win32/VS2015/test_opus_encode.vcxproj \ win32/VS2015/opus_demo.vcxproj \ win32/VS2015/test_opus_api.vcxproj.filters \ win32/VS2015/test_opus_api.vcxproj \ win32/VS2015/test_opus_decode.vcxproj.filters \ win32/VS2015/opus_demo.vcxproj.filters \ win32/VS2015/opus.vcxproj.filters \ win32/VS2015/test_opus_decode.vcxproj \ win32/VS2015/opus.sln \ win32/VS2015/common.props \ win32/genversion.bat \ win32/config.h pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = opus.pc m4datadir = $(datadir)/aclocal m4data_DATA = opus.m4 # Targets to build and install just the library without the docs opus check-opus install-opus: export NO_DOXYGEN = 1 opus: all check-opus: check install-opus: install # Or just the docs docs: ( cd doc && $(MAKE) $(AM_MAKEFLAGS) ) install-docs: ( cd doc && $(MAKE) $(AM_MAKEFLAGS) install ) # Or everything (by default) all-local: @[ -n "$(NO_DOXYGEN)" ] || ( cd doc && $(MAKE) $(AM_MAKEFLAGS) ) install-data-local: @[ -n "$(NO_DOXYGEN)" ] || ( cd doc && $(MAKE) $(AM_MAKEFLAGS) install ) clean-local: -( cd doc && $(MAKE) $(AM_MAKEFLAGS) clean ) uninstall-local: ( cd doc && $(MAKE) $(AM_MAKEFLAGS) uninstall ) # We check this every time make is run, with configure.ac being touched to # trigger an update of the build system files if update_version changes the # current PACKAGE_VERSION (or if package_version was modified manually by a # user with either AUTO_UPDATE=no or no update_version script present - the # latter being the normal case for tarball releases). # # We can't just add the package_version file to CONFIGURE_DEPENDENCIES since # simply running autoconf will not actually regenerate configure for us when # the content of that file changes (due to autoconf dependency checking not # knowing about that without us creating yet another file for it to include). # # The MAKECMDGOALS check is a gnu-make'ism, but will degrade 'gracefully' for # makes that don't support it. The only loss of functionality is not forcing # an update of package_version for `make dist` if AUTO_UPDATE=no, but that is # unlikely to be a real problem for any real user. $(top_srcdir)/configure.ac: force @case "$(MAKECMDGOALS)" in \ dist-hook) exit 0 ;; \ dist-* | dist | distcheck | distclean) _arg=release ;; \ esac; \ if ! $(top_srcdir)/update_version $$_arg 2> /dev/null; then \ if [ ! -e $(top_srcdir)/package_version ]; then \ echo 'PACKAGE_VERSION="unknown"' > $(top_srcdir)/package_version; \ fi; \ . $(top_srcdir)/package_version || exit 1; \ [ "$(PACKAGE_VERSION)" != "$$PACKAGE_VERSION" ] || exit 0; \ fi; \ touch $@ force: # Create a minimal package_version file when make dist is run. dist-hook: echo 'PACKAGE_VERSION="$(PACKAGE_VERSION)"' > $(top_distdir)/package_version .PHONY: opus check-opus install-opus docs install-docs # automake doesn't do dependency tracking for asm files, that I can tell $(CELT_SOURCES_ARM_ASM:%.s=%-gnu.S): celt/arm/armopts-gnu.S $(CELT_SOURCES_ARM_ASM:%.s=%-gnu.S): $(top_srcdir)/celt/arm/arm2gnu.pl # convert ARM asm to GNU as format %-gnu.S: $(top_srcdir)/%.s $(top_srcdir)/celt/arm/arm2gnu.pl @ARM2GNU_PARAMS@ < $< > $@ # For autoconf-modified sources (e.g., armopts.s) %-gnu.S: %.s $(top_srcdir)/celt/arm/arm2gnu.pl @ARM2GNU_PARAMS@ < $< > $@ OPT_UNIT_TEST_OBJ = $(celt_tests_test_unit_mathops_SOURCES:.c=.o) \ $(celt_tests_test_unit_rotation_SOURCES:.c=.o) \ $(celt_tests_test_unit_mdct_SOURCES:.c=.o) \ $(celt_tests_test_unit_dft_SOURCES:.c=.o) \ $(silk_tests_test_unit_LPC_inv_pred_gain_SOURCES:.c=.o) if HAVE_SSE SSE_OBJ = $(CELT_SOURCES_SSE:.c=.lo) $(SSE_OBJ): CFLAGS += $(OPUS_X86_SSE_CFLAGS) endif if HAVE_SSE2 SSE2_OBJ = $(CELT_SOURCES_SSE2:.c=.lo) $(SSE2_OBJ): CFLAGS += $(OPUS_X86_SSE2_CFLAGS) endif if HAVE_SSE4_1 SSE4_1_OBJ = $(CELT_SOURCES_SSE4_1:.c=.lo) \ $(SILK_SOURCES_SSE4_1:.c=.lo) \ $(SILK_SOURCES_FIXED_SSE4_1:.c=.lo) $(SSE4_1_OBJ): CFLAGS += $(OPUS_X86_SSE4_1_CFLAGS) endif if HAVE_ARM_NEON_INTR ARM_NEON_INTR_OBJ = $(CELT_SOURCES_ARM_NEON_INTR:.c=.lo) \ $(SILK_SOURCES_ARM_NEON_INTR:.c=.lo) \ $(SILK_SOURCES_FIXED_ARM_NEON_INTR:.c=.lo) $(ARM_NEON_INTR_OBJ): CFLAGS += \ $(OPUS_ARM_NEON_INTR_CFLAGS) $(NE10_CFLAGS) endif mumble-1.3.4/3rdparty/opus-src/Makefile.mips0000664000175000017500000001074214010707326020576 0ustar builderbuilder#################### COMPILE OPTIONS ####################### # Uncomment this for fixed-point build FIXED_POINT=1 # It is strongly recommended to uncomment one of these # VAR_ARRAYS: Use C99 variable-length arrays for stack allocation # USE_ALLOCA: Use alloca() for stack allocation # If none is defined, then the fallback is a non-threadsafe global array CFLAGS := -DUSE_ALLOCA $(CFLAGS) #CFLAGS := -DVAR_ARRAYS $(CFLAGS) # These options affect performance # HAVE_LRINTF: Use C99 intrinsics to speed up float-to-int conversion #CFLAGS := -DHAVE_LRINTF $(CFLAGS) ###################### END OF OPTIONS ###################### -include package_version include silk_sources.mk include celt_sources.mk include opus_sources.mk ifdef FIXED_POINT SILK_SOURCES += $(SILK_SOURCES_FIXED) else SILK_SOURCES += $(SILK_SOURCES_FLOAT) OPUS_SOURCES += $(OPUS_SOURCES_FLOAT) endif EXESUFFIX = LIBPREFIX = lib LIBSUFFIX = .a OBJSUFFIX = .o CC = $(TOOLCHAIN_PREFIX)cc$(TOOLCHAIN_SUFFIX) AR = $(TOOLCHAIN_PREFIX)ar RANLIB = $(TOOLCHAIN_PREFIX)ranlib CP = $(TOOLCHAIN_PREFIX)cp cppflags-from-defines = $(addprefix -D,$(1)) cppflags-from-includes = $(addprefix -I,$(1)) ldflags-from-ldlibdirs = $(addprefix -L,$(1)) ldlibs-from-libs = $(addprefix -l,$(1)) WARNINGS = -Wall -W -Wstrict-prototypes -Wextra -Wcast-align -Wnested-externs -Wshadow CFLAGS += -mips32r2 -mno-mips16 -std=gnu99 -O2 -g $(WARNINGS) -DENABLE_ASSERTIONS -DMIPSr1_ASM -DOPUS_BUILD -mdspr2 -march=74kc -mtune=74kc -mmt -mgp32 CINCLUDES = include silk celt ifdef FIXED_POINT CFLAGS += -DFIXED_POINT=1 -DDISABLE_FLOAT_API CINCLUDES += silk/fixed else CINCLUDES += silk/float endif LIBS = m LDLIBDIRS = ./ CFLAGS += $(call cppflags-from-defines,$(CDEFINES)) CFLAGS += $(call cppflags-from-includes,$(CINCLUDES)) LDFLAGS += $(call ldflags-from-ldlibdirs,$(LDLIBDIRS)) LDLIBS += $(call ldlibs-from-libs,$(LIBS)) COMPILE.c.cmdline = $(CC) -c $(CFLAGS) -o $@ $< LINK.o = $(CC) $(LDPREFLAGS) $(LDFLAGS) LINK.o.cmdline = $(LINK.o) $^ $(LDLIBS) -o $@$(EXESUFFIX) ARCHIVE.cmdline = $(AR) $(ARFLAGS) $@ $^ && $(RANLIB) $@ %$(OBJSUFFIX):%.c $(COMPILE.c.cmdline) %$(OBJSUFFIX):%.cpp $(COMPILE.cpp.cmdline) # Directives # Variable definitions LIB_NAME = opus TARGET = $(LIBPREFIX)$(LIB_NAME)$(LIBSUFFIX) SRCS_C = $(SILK_SOURCES) $(CELT_SOURCES) $(OPUS_SOURCES) OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(SRCS_C)) OPUSDEMO_SRCS_C = src/opus_demo.c OPUSDEMO_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(OPUSDEMO_SRCS_C)) TESTOPUSAPI_SRCS_C = tests/test_opus_api.c TESTOPUSAPI_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(TESTOPUSAPI_SRCS_C)) TESTOPUSDECODE_SRCS_C = tests/test_opus_decode.c TESTOPUSDECODE_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(TESTOPUSDECODE_SRCS_C)) TESTOPUSENCODE_SRCS_C = tests/test_opus_encode.c tests/opus_encode_regressions.c TESTOPUSENCODE_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(TESTOPUSENCODE_SRCS_C)) TESTOPUSPADDING_SRCS_C = tests/test_opus_padding.c TESTOPUSPADDING_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(TESTOPUSPADDING_SRCS_C)) OPUSCOMPARE_SRCS_C = src/opus_compare.c OPUSCOMPARE_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(OPUSCOMPARE_SRCS_C)) TESTS := test_opus_api test_opus_decode test_opus_encode test_opus_padding # Rules all: lib opus_demo opus_compare $(TESTS) lib: $(TARGET) check: all for test in $(TESTS); do ./$$test; done $(TARGET): $(OBJS) $(ARCHIVE.cmdline) opus_demo$(EXESUFFIX): $(OPUSDEMO_OBJS) $(TARGET) $(LINK.o.cmdline) test_opus_api$(EXESUFFIX): $(TESTOPUSAPI_OBJS) $(TARGET) $(LINK.o.cmdline) test_opus_decode$(EXESUFFIX): $(TESTOPUSDECODE_OBJS) $(TARGET) $(LINK.o.cmdline) test_opus_encode$(EXESUFFIX): $(TESTOPUSENCODE_OBJS) $(TARGET) $(LINK.o.cmdline) test_opus_padding$(EXESUFFIX): $(TESTOPUSPADDING_OBJS) $(TARGET) $(LINK.o.cmdline) opus_compare$(EXESUFFIX): $(OPUSCOMPARE_OBJS) $(LINK.o.cmdline) celt/celt.o: CFLAGS += -DPACKAGE_VERSION='$(PACKAGE_VERSION)' celt/celt.o: package_version package_version: force @if [ -x ./update_version ]; then \ ./update_version || true; \ elif [ ! -e ./package_version ]; then \ echo 'PACKAGE_VERSION="unknown"' > ./package_version; \ fi force: clean: rm -f opus_demo$(EXESUFFIX) opus_compare$(EXESUFFIX) $(TARGET) \ test_opus_api$(EXESUFFIX) test_opus_decode$(EXESUFFIX) \ test_opus_encode$(EXESUFFIX) test_opus_padding$(EXESUFFIX) \ $(OBJS) $(OPUSDEMO_OBJS) $(OPUSCOMPARE_OBJS) $(TESTOPUSAPI_OBJS) \ $(TESTOPUSDECODE_OBJS) $(TESTOPUSENCODE_OBJS) $(TESTOPUSPADDING_OBJS) .PHONY: all lib clean force check mumble-1.3.4/3rdparty/opus-src/Makefile.unix0000664000175000017500000001056314010707326020612 0ustar builderbuilder#################### COMPILE OPTIONS ####################### # Uncomment this for fixed-point build #FIXED_POINT=1 # It is strongly recommended to uncomment one of these # VAR_ARRAYS: Use C99 variable-length arrays for stack allocation # USE_ALLOCA: Use alloca() for stack allocation # If none is defined, then the fallback is a non-threadsafe global array CFLAGS := -DUSE_ALLOCA $(CFLAGS) #CFLAGS := -DVAR_ARRAYS $(CFLAGS) # These options affect performance # HAVE_LRINTF: Use C99 intrinsics to speed up float-to-int conversion #CFLAGS := -DHAVE_LRINTF $(CFLAGS) ###################### END OF OPTIONS ###################### -include package_version include silk_sources.mk include celt_sources.mk include opus_sources.mk ifdef FIXED_POINT SILK_SOURCES += $(SILK_SOURCES_FIXED) else SILK_SOURCES += $(SILK_SOURCES_FLOAT) OPUS_SOURCES += $(OPUS_SOURCES_FLOAT) endif EXESUFFIX = LIBPREFIX = lib LIBSUFFIX = .a OBJSUFFIX = .o CC = $(TOOLCHAIN_PREFIX)cc$(TOOLCHAIN_SUFFIX) AR = $(TOOLCHAIN_PREFIX)ar RANLIB = $(TOOLCHAIN_PREFIX)ranlib CP = $(TOOLCHAIN_PREFIX)cp cppflags-from-defines = $(addprefix -D,$(1)) cppflags-from-includes = $(addprefix -I,$(1)) ldflags-from-ldlibdirs = $(addprefix -L,$(1)) ldlibs-from-libs = $(addprefix -l,$(1)) WARNINGS = -Wall -W -Wstrict-prototypes -Wextra -Wcast-align -Wnested-externs -Wshadow CFLAGS += -O2 -g $(WARNINGS) -DOPUS_BUILD CINCLUDES = include silk celt ifdef FIXED_POINT CFLAGS += -DFIXED_POINT=1 -DDISABLE_FLOAT_API CINCLUDES += silk/fixed else CINCLUDES += silk/float endif LIBS = m LDLIBDIRS = ./ CFLAGS += $(call cppflags-from-defines,$(CDEFINES)) CFLAGS += $(call cppflags-from-includes,$(CINCLUDES)) LDFLAGS += $(call ldflags-from-ldlibdirs,$(LDLIBDIRS)) LDLIBS += $(call ldlibs-from-libs,$(LIBS)) COMPILE.c.cmdline = $(CC) -c $(CFLAGS) -o $@ $< LINK.o = $(CC) $(LDPREFLAGS) $(LDFLAGS) LINK.o.cmdline = $(LINK.o) $^ $(LDLIBS) -o $@$(EXESUFFIX) ARCHIVE.cmdline = $(AR) $(ARFLAGS) $@ $^ && $(RANLIB) $@ %$(OBJSUFFIX):%.c $(COMPILE.c.cmdline) %$(OBJSUFFIX):%.cpp $(COMPILE.cpp.cmdline) # Directives # Variable definitions LIB_NAME = opus TARGET = $(LIBPREFIX)$(LIB_NAME)$(LIBSUFFIX) SRCS_C = $(SILK_SOURCES) $(CELT_SOURCES) $(OPUS_SOURCES) OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(SRCS_C)) OPUSDEMO_SRCS_C = src/opus_demo.c OPUSDEMO_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(OPUSDEMO_SRCS_C)) TESTOPUSAPI_SRCS_C = tests/test_opus_api.c TESTOPUSAPI_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(TESTOPUSAPI_SRCS_C)) TESTOPUSDECODE_SRCS_C = tests/test_opus_decode.c TESTOPUSDECODE_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(TESTOPUSDECODE_SRCS_C)) TESTOPUSENCODE_SRCS_C = tests/test_opus_encode.c tests/opus_encode_regressions.c TESTOPUSENCODE_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(TESTOPUSENCODE_SRCS_C)) TESTOPUSPADDING_SRCS_C = tests/test_opus_padding.c TESTOPUSPADDING_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(TESTOPUSPADDING_SRCS_C)) OPUSCOMPARE_SRCS_C = src/opus_compare.c OPUSCOMPARE_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(OPUSCOMPARE_SRCS_C)) TESTS := test_opus_api test_opus_decode test_opus_encode test_opus_padding # Rules all: lib opus_demo opus_compare $(TESTS) lib: $(TARGET) check: all for test in $(TESTS); do ./$$test; done $(TARGET): $(OBJS) $(ARCHIVE.cmdline) opus_demo$(EXESUFFIX): $(OPUSDEMO_OBJS) $(TARGET) $(LINK.o.cmdline) test_opus_api$(EXESUFFIX): $(TESTOPUSAPI_OBJS) $(TARGET) $(LINK.o.cmdline) test_opus_decode$(EXESUFFIX): $(TESTOPUSDECODE_OBJS) $(TARGET) $(LINK.o.cmdline) test_opus_encode$(EXESUFFIX): $(TESTOPUSENCODE_OBJS) $(TARGET) $(LINK.o.cmdline) test_opus_padding$(EXESUFFIX): $(TESTOPUSPADDING_OBJS) $(TARGET) $(LINK.o.cmdline) opus_compare$(EXESUFFIX): $(OPUSCOMPARE_OBJS) $(LINK.o.cmdline) celt/celt.o: CFLAGS += -DPACKAGE_VERSION='$(PACKAGE_VERSION)' celt/celt.o: package_version package_version: force @if [ -x ./update_version ]; then \ ./update_version || true; \ elif [ ! -e ./package_version ]; then \ echo 'PACKAGE_VERSION="unknown"' > ./package_version; \ fi force: clean: rm -f opus_demo$(EXESUFFIX) opus_compare$(EXESUFFIX) $(TARGET) \ test_opus_api$(EXESUFFIX) test_opus_decode$(EXESUFFIX) \ test_opus_encode$(EXESUFFIX) test_opus_padding$(EXESUFFIX) \ $(OBJS) $(OPUSDEMO_OBJS) $(OPUSCOMPARE_OBJS) $(TESTOPUSAPI_OBJS) \ $(TESTOPUSDECODE_OBJS) $(TESTOPUSENCODE_OBJS) $(TESTOPUSPADDING_OBJS) .PHONY: all lib clean force check mumble-1.3.4/3rdparty/opus-src/m4/0000775000175000017500000000000014010707327016504 5ustar builderbuildermumble-1.3.4/3rdparty/opus-src/m4/as-gcc-inline-assembly.m40000664000175000017500000000535714010707327023206 0ustar builderbuilderdnl as-gcc-inline-assembly.m4 0.1.0 dnl autostars m4 macro for detection of gcc inline assembly dnl David Schleef dnl AS_COMPILER_FLAG(ACTION-IF-ACCEPTED, [ACTION-IF-NOT-ACCEPTED]) dnl Tries to compile with the given CFLAGS. dnl Runs ACTION-IF-ACCEPTED if the compiler can compile with the flags, dnl and ACTION-IF-NOT-ACCEPTED otherwise. AC_DEFUN([AS_GCC_INLINE_ASSEMBLY], [ AC_MSG_CHECKING([if compiler supports gcc-style inline assembly]) AC_TRY_COMPILE([], [ #ifdef __GNUC_MINOR__ #if (__GNUC__ * 1000 + __GNUC_MINOR__) < 3004 #error GCC before 3.4 has critical bugs compiling inline assembly #endif #endif __asm__ (""::) ], [flag_ok=yes], [flag_ok=no]) if test "X$flag_ok" = Xyes ; then $1 true else $2 true fi AC_MSG_RESULT([$flag_ok]) ]) AC_DEFUN([AS_ASM_ARM_NEON], [ AC_MSG_CHECKING([if assembler supports NEON instructions on ARM]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[__asm__("vorr d0,d0,d0")])], [AC_MSG_RESULT([yes]) $1], [AC_MSG_RESULT([no]) $2]) ]) AC_DEFUN([AS_ASM_ARM_NEON_FORCE], [ AC_MSG_CHECKING([if assembler supports NEON instructions on ARM]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[__asm__(".arch armv7-a\n.fpu neon\n.object_arch armv4t\nvorr d0,d0,d0")])], [AC_MSG_RESULT([yes]) $1], [AC_MSG_RESULT([no]) $2]) ]) AC_DEFUN([AS_ASM_ARM_MEDIA], [ AC_MSG_CHECKING([if assembler supports ARMv6 media instructions on ARM]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[__asm__("shadd8 r3,r3,r3")])], [AC_MSG_RESULT([yes]) $1], [AC_MSG_RESULT([no]) $2]) ]) AC_DEFUN([AS_ASM_ARM_MEDIA_FORCE], [ AC_MSG_CHECKING([if assembler supports ARMv6 media instructions on ARM]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[__asm__(".arch armv6\n.object_arch armv4t\nshadd8 r3,r3,r3")])], [AC_MSG_RESULT([yes]) $1], [AC_MSG_RESULT([no]) $2]) ]) AC_DEFUN([AS_ASM_ARM_EDSP], [ AC_MSG_CHECKING([if assembler supports EDSP instructions on ARM]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[__asm__("qadd r3,r3,r3")])], [AC_MSG_RESULT([yes]) $1], [AC_MSG_RESULT([no]) $2]) ]) AC_DEFUN([AS_ASM_ARM_EDSP_FORCE], [ AC_MSG_CHECKING([if assembler supports EDSP instructions on ARM]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[__asm__(".arch armv5te\n.object_arch armv4t\nqadd r3,r3,r3")])], [AC_MSG_RESULT([yes]) $1], [AC_MSG_RESULT([no]) $2]) ]) mumble-1.3.4/3rdparty/opus-src/m4/opus-intrinsics.m40000664000175000017500000000154614010707327022125 0ustar builderbuilderdnl opus-intrinsics.m4 dnl macro for testing for support for compiler intrinsics, either by default or with a compiler flag dnl OPUS_CHECK_INTRINSICS(NAME-OF-INTRINSICS, COMPILER-FLAG-FOR-INTRINSICS, VAR-IF-PRESENT, VAR-IF-DEFAULT, TEST-PROGRAM-HEADER, TEST-PROGRAM-BODY) AC_DEFUN([OPUS_CHECK_INTRINSICS], [ AC_MSG_CHECKING([if compiler supports $1 intrinsics]) AC_LINK_IFELSE( [AC_LANG_PROGRAM($5, $6)], [ $3=1 $4=1 AC_MSG_RESULT([yes]) ],[ $4=0 AC_MSG_RESULT([no]) AC_MSG_CHECKING([if compiler supports $1 intrinsics with $2]) save_CFLAGS="$CFLAGS"; CFLAGS="$CFLAGS $2" AC_LINK_IFELSE([AC_LANG_PROGRAM($5, $6)], [ AC_MSG_RESULT([yes]) $3=1 ],[ AC_MSG_RESULT([no]) $3=0 ]) CFLAGS="$save_CFLAGS" ]) ]) mumble-1.3.4/3rdparty/opus-src/win32/0000775000175000017500000000000014010707327017126 5ustar builderbuildermumble-1.3.4/3rdparty/opus-src/win32/VS2015/0000775000175000017500000000000014010707327017766 5ustar builderbuildermumble-1.3.4/3rdparty/opus-src/win32/VS2015/test_opus_decode.vcxproj.filters0000664000175000017500000000100214010707327026373 0ustar builderbuilder {4a0dd677-931f-4728-afe5-b761149fc7eb} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files mumble-1.3.4/3rdparty/opus-src/win32/VS2015/test_opus_api.vcxproj.filters0000664000175000017500000000077714010707327025743 0ustar builderbuilder {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files mumble-1.3.4/3rdparty/opus-src/win32/VS2015/test_opus_decode.vcxproj0000664000175000017500000002266714010707327024750 0ustar builderbuilder DebugDLL_fixed Win32 DebugDLL_fixed x64 DebugDLL Win32 DebugDLL x64 Debug Win32 Debug x64 ReleaseDLL_fixed Win32 ReleaseDLL_fixed x64 ReleaseDLL Win32 ReleaseDLL x64 Release Win32 Release x64 {219ec965-228a-1824-174d-96449d05f88a} {8578322A-1883-486B-B6FA-E0094B65C9F2} Win32Proj test_opus_api Application v140 Application v140 Application v140 Application v140 Application v140 Application v140 Application v140 Application v140 Application v140 Application v140 Application v140 Application v140 mumble-1.3.4/3rdparty/opus-src/win32/VS2015/opus_demo.vcxproj0000664000175000017500000002265214010707327023404 0ustar builderbuilder DebugDLL_fixed Win32 DebugDLL_fixed x64 DebugDLL Win32 DebugDLL x64 Debug Win32 Debug x64 ReleaseDLL_fixed Win32 ReleaseDLL_fixed x64 ReleaseDLL Win32 ReleaseDLL x64 Release Win32 Release x64 {219ec965-228a-1824-174d-96449d05f88a} {016C739D-6389-43BF-8D88-24B2BF6F620F} Win32Proj opus_demo Application v140 Application v140 Application v140 Application v140 Application v140 Application v140 Application v140 Application v140 Application v140 Application v140 Application v140 Application v140 mumble-1.3.4/3rdparty/opus-src/win32/VS2015/opus.sln0000664000175000017500000002775114010707327021506 0ustar builderbuilder Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 VisualStudioVersion = 14.0.25420.1 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opus", "opus.vcxproj", "{219EC965-228A-1824-174D-96449D05F88A}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opus_demo", "opus_demo.vcxproj", "{016C739D-6389-43BF-8D88-24B2BF6F620F}" ProjectSection(ProjectDependencies) = postProject {219EC965-228A-1824-174D-96449D05F88A} = {219EC965-228A-1824-174D-96449D05F88A} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_opus_api", "test_opus_api.vcxproj", "{1D257A17-D254-42E5-82D6-1C87A6EC775A}" ProjectSection(ProjectDependencies) = postProject {219EC965-228A-1824-174D-96449D05F88A} = {219EC965-228A-1824-174D-96449D05F88A} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_opus_decode", "test_opus_decode.vcxproj", "{8578322A-1883-486B-B6FA-E0094B65C9F2}" ProjectSection(ProjectDependencies) = postProject {219EC965-228A-1824-174D-96449D05F88A} = {219EC965-228A-1824-174D-96449D05F88A} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_opus_encode", "test_opus_encode.vcxproj", "{84DAA768-1A38-4312-BB61-4C78BB59E5B8}" ProjectSection(ProjectDependencies) = postProject {219EC965-228A-1824-174D-96449D05F88A} = {219EC965-228A-1824-174D-96449D05F88A} EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 DebugDLL_fixed|Win32 = DebugDLL_fixed|Win32 DebugDLL_fixed|x64 = DebugDLL_fixed|x64 DebugDLL|Win32 = DebugDLL|Win32 DebugDLL|x64 = DebugDLL|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 ReleaseDLL_fixed|Win32 = ReleaseDLL_fixed|Win32 ReleaseDLL_fixed|x64 = ReleaseDLL_fixed|x64 ReleaseDLL|Win32 = ReleaseDLL|Win32 ReleaseDLL|x64 = ReleaseDLL|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {219EC965-228A-1824-174D-96449D05F88A}.Debug|Win32.ActiveCfg = Debug|Win32 {219EC965-228A-1824-174D-96449D05F88A}.Debug|Win32.Build.0 = Debug|Win32 {219EC965-228A-1824-174D-96449D05F88A}.Debug|x64.ActiveCfg = Debug|x64 {219EC965-228A-1824-174D-96449D05F88A}.Debug|x64.Build.0 = Debug|x64 {219EC965-228A-1824-174D-96449D05F88A}.DebugDLL_fixed|Win32.ActiveCfg = DebugDLL_fixed|Win32 {219EC965-228A-1824-174D-96449D05F88A}.DebugDLL_fixed|Win32.Build.0 = DebugDLL_fixed|Win32 {219EC965-228A-1824-174D-96449D05F88A}.DebugDLL_fixed|x64.ActiveCfg = DebugDLL_fixed|x64 {219EC965-228A-1824-174D-96449D05F88A}.DebugDLL_fixed|x64.Build.0 = DebugDLL_fixed|x64 {219EC965-228A-1824-174D-96449D05F88A}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32 {219EC965-228A-1824-174D-96449D05F88A}.DebugDLL|Win32.Build.0 = DebugDLL|Win32 {219EC965-228A-1824-174D-96449D05F88A}.DebugDLL|x64.ActiveCfg = DebugDLL|x64 {219EC965-228A-1824-174D-96449D05F88A}.DebugDLL|x64.Build.0 = DebugDLL|x64 {219EC965-228A-1824-174D-96449D05F88A}.Release|Win32.ActiveCfg = Release|Win32 {219EC965-228A-1824-174D-96449D05F88A}.Release|Win32.Build.0 = Release|Win32 {219EC965-228A-1824-174D-96449D05F88A}.Release|x64.ActiveCfg = Release|x64 {219EC965-228A-1824-174D-96449D05F88A}.Release|x64.Build.0 = Release|x64 {219EC965-228A-1824-174D-96449D05F88A}.ReleaseDLL_fixed|Win32.ActiveCfg = ReleaseDLL_fixed|Win32 {219EC965-228A-1824-174D-96449D05F88A}.ReleaseDLL_fixed|Win32.Build.0 = ReleaseDLL_fixed|Win32 {219EC965-228A-1824-174D-96449D05F88A}.ReleaseDLL_fixed|x64.ActiveCfg = ReleaseDLL_fixed|x64 {219EC965-228A-1824-174D-96449D05F88A}.ReleaseDLL_fixed|x64.Build.0 = ReleaseDLL_fixed|x64 {219EC965-228A-1824-174D-96449D05F88A}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32 {219EC965-228A-1824-174D-96449D05F88A}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32 {219EC965-228A-1824-174D-96449D05F88A}.ReleaseDLL|x64.ActiveCfg = ReleaseDLL|x64 {219EC965-228A-1824-174D-96449D05F88A}.ReleaseDLL|x64.Build.0 = ReleaseDLL|x64 {016C739D-6389-43BF-8D88-24B2BF6F620F}.Debug|Win32.ActiveCfg = Debug|Win32 {016C739D-6389-43BF-8D88-24B2BF6F620F}.Debug|Win32.Build.0 = Debug|Win32 {016C739D-6389-43BF-8D88-24B2BF6F620F}.Debug|x64.ActiveCfg = Debug|x64 {016C739D-6389-43BF-8D88-24B2BF6F620F}.Debug|x64.Build.0 = Debug|x64 {016C739D-6389-43BF-8D88-24B2BF6F620F}.DebugDLL_fixed|Win32.ActiveCfg = DebugDLL_fixed|Win32 {016C739D-6389-43BF-8D88-24B2BF6F620F}.DebugDLL_fixed|Win32.Build.0 = DebugDLL_fixed|Win32 {016C739D-6389-43BF-8D88-24B2BF6F620F}.DebugDLL_fixed|x64.ActiveCfg = DebugDLL_fixed|x64 {016C739D-6389-43BF-8D88-24B2BF6F620F}.DebugDLL_fixed|x64.Build.0 = DebugDLL_fixed|x64 {016C739D-6389-43BF-8D88-24B2BF6F620F}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32 {016C739D-6389-43BF-8D88-24B2BF6F620F}.DebugDLL|Win32.Build.0 = DebugDLL|Win32 {016C739D-6389-43BF-8D88-24B2BF6F620F}.DebugDLL|x64.ActiveCfg = DebugDLL|x64 {016C739D-6389-43BF-8D88-24B2BF6F620F}.DebugDLL|x64.Build.0 = DebugDLL|x64 {016C739D-6389-43BF-8D88-24B2BF6F620F}.Release|Win32.ActiveCfg = Release|Win32 {016C739D-6389-43BF-8D88-24B2BF6F620F}.Release|Win32.Build.0 = Release|Win32 {016C739D-6389-43BF-8D88-24B2BF6F620F}.Release|x64.ActiveCfg = Release|x64 {016C739D-6389-43BF-8D88-24B2BF6F620F}.Release|x64.Build.0 = Release|x64 {016C739D-6389-43BF-8D88-24B2BF6F620F}.ReleaseDLL_fixed|Win32.ActiveCfg = ReleaseDLL_fixed|Win32 {016C739D-6389-43BF-8D88-24B2BF6F620F}.ReleaseDLL_fixed|Win32.Build.0 = ReleaseDLL_fixed|Win32 {016C739D-6389-43BF-8D88-24B2BF6F620F}.ReleaseDLL_fixed|x64.ActiveCfg = ReleaseDLL_fixed|x64 {016C739D-6389-43BF-8D88-24B2BF6F620F}.ReleaseDLL_fixed|x64.Build.0 = ReleaseDLL_fixed|x64 {016C739D-6389-43BF-8D88-24B2BF6F620F}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32 {016C739D-6389-43BF-8D88-24B2BF6F620F}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32 {016C739D-6389-43BF-8D88-24B2BF6F620F}.ReleaseDLL|x64.ActiveCfg = ReleaseDLL|x64 {016C739D-6389-43BF-8D88-24B2BF6F620F}.ReleaseDLL|x64.Build.0 = ReleaseDLL|x64 {1D257A17-D254-42E5-82D6-1C87A6EC775A}.Debug|Win32.ActiveCfg = Debug|Win32 {1D257A17-D254-42E5-82D6-1C87A6EC775A}.Debug|Win32.Build.0 = Debug|Win32 {1D257A17-D254-42E5-82D6-1C87A6EC775A}.Debug|x64.ActiveCfg = Debug|x64 {1D257A17-D254-42E5-82D6-1C87A6EC775A}.Debug|x64.Build.0 = Debug|x64 {1D257A17-D254-42E5-82D6-1C87A6EC775A}.DebugDLL_fixed|Win32.ActiveCfg = DebugDLL_fixed|Win32 {1D257A17-D254-42E5-82D6-1C87A6EC775A}.DebugDLL_fixed|Win32.Build.0 = DebugDLL_fixed|Win32 {1D257A17-D254-42E5-82D6-1C87A6EC775A}.DebugDLL_fixed|x64.ActiveCfg = DebugDLL_fixed|x64 {1D257A17-D254-42E5-82D6-1C87A6EC775A}.DebugDLL_fixed|x64.Build.0 = DebugDLL_fixed|x64 {1D257A17-D254-42E5-82D6-1C87A6EC775A}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32 {1D257A17-D254-42E5-82D6-1C87A6EC775A}.DebugDLL|Win32.Build.0 = DebugDLL|Win32 {1D257A17-D254-42E5-82D6-1C87A6EC775A}.DebugDLL|x64.ActiveCfg = DebugDLL|x64 {1D257A17-D254-42E5-82D6-1C87A6EC775A}.DebugDLL|x64.Build.0 = DebugDLL|x64 {1D257A17-D254-42E5-82D6-1C87A6EC775A}.Release|Win32.ActiveCfg = Release|Win32 {1D257A17-D254-42E5-82D6-1C87A6EC775A}.Release|Win32.Build.0 = Release|Win32 {1D257A17-D254-42E5-82D6-1C87A6EC775A}.Release|x64.ActiveCfg = Release|x64 {1D257A17-D254-42E5-82D6-1C87A6EC775A}.Release|x64.Build.0 = Release|x64 {1D257A17-D254-42E5-82D6-1C87A6EC775A}.ReleaseDLL_fixed|Win32.ActiveCfg = ReleaseDLL_fixed|Win32 {1D257A17-D254-42E5-82D6-1C87A6EC775A}.ReleaseDLL_fixed|Win32.Build.0 = ReleaseDLL_fixed|Win32 {1D257A17-D254-42E5-82D6-1C87A6EC775A}.ReleaseDLL_fixed|x64.ActiveCfg = ReleaseDLL_fixed|x64 {1D257A17-D254-42E5-82D6-1C87A6EC775A}.ReleaseDLL_fixed|x64.Build.0 = ReleaseDLL_fixed|x64 {1D257A17-D254-42E5-82D6-1C87A6EC775A}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32 {1D257A17-D254-42E5-82D6-1C87A6EC775A}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32 {1D257A17-D254-42E5-82D6-1C87A6EC775A}.ReleaseDLL|x64.ActiveCfg = ReleaseDLL|x64 {1D257A17-D254-42E5-82D6-1C87A6EC775A}.ReleaseDLL|x64.Build.0 = ReleaseDLL|x64 {8578322A-1883-486B-B6FA-E0094B65C9F2}.Debug|Win32.ActiveCfg = Debug|Win32 {8578322A-1883-486B-B6FA-E0094B65C9F2}.Debug|Win32.Build.0 = Debug|Win32 {8578322A-1883-486B-B6FA-E0094B65C9F2}.Debug|x64.ActiveCfg = Debug|x64 {8578322A-1883-486B-B6FA-E0094B65C9F2}.Debug|x64.Build.0 = Debug|x64 {8578322A-1883-486B-B6FA-E0094B65C9F2}.DebugDLL_fixed|Win32.ActiveCfg = DebugDLL_fixed|Win32 {8578322A-1883-486B-B6FA-E0094B65C9F2}.DebugDLL_fixed|Win32.Build.0 = DebugDLL_fixed|Win32 {8578322A-1883-486B-B6FA-E0094B65C9F2}.DebugDLL_fixed|x64.ActiveCfg = DebugDLL_fixed|x64 {8578322A-1883-486B-B6FA-E0094B65C9F2}.DebugDLL_fixed|x64.Build.0 = DebugDLL_fixed|x64 {8578322A-1883-486B-B6FA-E0094B65C9F2}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32 {8578322A-1883-486B-B6FA-E0094B65C9F2}.DebugDLL|Win32.Build.0 = DebugDLL|Win32 {8578322A-1883-486B-B6FA-E0094B65C9F2}.DebugDLL|x64.ActiveCfg = DebugDLL|x64 {8578322A-1883-486B-B6FA-E0094B65C9F2}.DebugDLL|x64.Build.0 = DebugDLL|x64 {8578322A-1883-486B-B6FA-E0094B65C9F2}.Release|Win32.ActiveCfg = Release|Win32 {8578322A-1883-486B-B6FA-E0094B65C9F2}.Release|Win32.Build.0 = Release|Win32 {8578322A-1883-486B-B6FA-E0094B65C9F2}.Release|x64.ActiveCfg = Release|x64 {8578322A-1883-486B-B6FA-E0094B65C9F2}.Release|x64.Build.0 = Release|x64 {8578322A-1883-486B-B6FA-E0094B65C9F2}.ReleaseDLL_fixed|Win32.ActiveCfg = ReleaseDLL_fixed|Win32 {8578322A-1883-486B-B6FA-E0094B65C9F2}.ReleaseDLL_fixed|Win32.Build.0 = ReleaseDLL_fixed|Win32 {8578322A-1883-486B-B6FA-E0094B65C9F2}.ReleaseDLL_fixed|x64.ActiveCfg = ReleaseDLL_fixed|x64 {8578322A-1883-486B-B6FA-E0094B65C9F2}.ReleaseDLL_fixed|x64.Build.0 = ReleaseDLL_fixed|x64 {8578322A-1883-486B-B6FA-E0094B65C9F2}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32 {8578322A-1883-486B-B6FA-E0094B65C9F2}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32 {8578322A-1883-486B-B6FA-E0094B65C9F2}.ReleaseDLL|x64.ActiveCfg = ReleaseDLL|x64 {8578322A-1883-486B-B6FA-E0094B65C9F2}.ReleaseDLL|x64.Build.0 = ReleaseDLL|x64 {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.Debug|Win32.ActiveCfg = Debug|Win32 {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.Debug|Win32.Build.0 = Debug|Win32 {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.Debug|x64.ActiveCfg = Debug|x64 {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.Debug|x64.Build.0 = Debug|x64 {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.DebugDLL_fixed|Win32.ActiveCfg = DebugDLL_fixed|Win32 {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.DebugDLL_fixed|Win32.Build.0 = DebugDLL_fixed|Win32 {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.DebugDLL_fixed|x64.ActiveCfg = DebugDLL_fixed|x64 {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.DebugDLL_fixed|x64.Build.0 = DebugDLL_fixed|x64 {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32 {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.DebugDLL|Win32.Build.0 = DebugDLL|Win32 {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.DebugDLL|x64.ActiveCfg = DebugDLL|x64 {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.DebugDLL|x64.Build.0 = DebugDLL|x64 {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.Release|Win32.ActiveCfg = Release|Win32 {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.Release|Win32.Build.0 = Release|Win32 {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.Release|x64.ActiveCfg = Release|x64 {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.Release|x64.Build.0 = Release|x64 {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.ReleaseDLL_fixed|Win32.ActiveCfg = ReleaseDLL_fixed|Win32 {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.ReleaseDLL_fixed|Win32.Build.0 = ReleaseDLL_fixed|Win32 {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.ReleaseDLL_fixed|x64.ActiveCfg = ReleaseDLL_fixed|x64 {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.ReleaseDLL_fixed|x64.Build.0 = ReleaseDLL_fixed|x64 {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32 {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32 {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.ReleaseDLL|x64.ActiveCfg = ReleaseDLL|x64 {84DAA768-1A38-4312-BB61-4C78BB59E5B8}.ReleaseDLL|x64.Build.0 = ReleaseDLL|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal mumble-1.3.4/3rdparty/opus-src/win32/VS2015/opus.vcxproj.filters0000664000175000017500000004670614010707327024055 0ustar builderbuilder {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files mumble-1.3.4/3rdparty/opus-src/win32/VS2015/test_opus_encode.vcxproj0000664000175000017500000002277114010707327024756 0ustar builderbuilder DebugDLL_fixed Win32 DebugDLL_fixed x64 DebugDLL Win32 DebugDLL x64 Debug Win32 Debug x64 ReleaseDLL_fixed Win32 ReleaseDLL_fixed x64 ReleaseDLL Win32 ReleaseDLL x64 Release Win32 Release x64 {219ec965-228a-1824-174d-96449d05f88a} {84DAA768-1A38-4312-BB61-4C78BB59E5B8} Win32Proj test_opus_api Application v140 Application v140 Application v140 Application v140 Application v140 Application v140 Application v140 Application v140 Application v140 Application v140 Application v140 Application v140 mumble-1.3.4/3rdparty/opus-src/win32/VS2015/test_opus_api.vcxproj0000664000175000017500000002266414010707327024273 0ustar builderbuilder DebugDLL_fixed Win32 DebugDLL_fixed x64 DebugDLL Win32 DebugDLL x64 Debug Win32 Debug x64 ReleaseDLL_fixed Win32 ReleaseDLL_fixed x64 ReleaseDLL Win32 ReleaseDLL x64 Release Win32 Release x64 {219ec965-228a-1824-174d-96449d05f88a} {1D257A17-D254-42E5-82D6-1C87A6EC775A} Win32Proj test_opus_api Application v140 Application v140 Application v140 Application v140 Application v140 Application v140 Application v140 Application v140 Application v140 Application v140 Application v140 Application v140 mumble-1.3.4/3rdparty/opus-src/win32/VS2015/opus_demo.vcxproj.filters0000664000175000017500000000166114010707327025050 0ustar builderbuilder {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files mumble-1.3.4/3rdparty/opus-src/win32/VS2015/opus.vcxproj0000664000175000017500000005147614010707327022406 0ustar builderbuilder DebugDLL_fixed Win32 DebugDLL_fixed x64 DebugDLL Win32 DebugDLL x64 Debug Win32 Debug x64 ReleaseDLL_fixed Win32 ReleaseDLL_fixed x64 ReleaseDLL Win32 ReleaseDLL x64 Release Win32 Release x64 Win32Proj opus {219EC965-228A-1824-174D-96449D05F88A} StaticLibrary v140 DynamicLibrary v140 DynamicLibrary v140 StaticLibrary v140 DynamicLibrary v140 DynamicLibrary v140 StaticLibrary v140 DynamicLibrary v140 DynamicLibrary v140 StaticLibrary v140 DynamicLibrary v140 DynamicLibrary v140 ..\..\silk\fixed;..\..\silk\float;%(AdditionalIncludeDirectories) DLL_EXPORT;%(PreprocessorDefinitions) FIXED_POINT;%(PreprocessorDefinitions) /arch:IA32 %(AdditionalOptions) /ignore:4221 %(AdditionalOptions) "$(ProjectDir)..\..\win32\genversion.bat" "$(ProjectDir)..\..\win32\version.h" PACKAGE_VERSION Generating version.h 4244;%(DisableSpecificWarnings) false false true true true false mumble-1.3.4/3rdparty/opus-src/win32/VS2015/test_opus_encode.vcxproj.filters0000664000175000017500000000116714010707327026421 0ustar builderbuilder {546c8d9a-103e-4f78-972b-b44e8d3c8aba} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files mumble-1.3.4/3rdparty/opus-src/win32/VS2015/common.props0000664000175000017500000001043014010707327022341 0ustar builderbuilder $(Platform)\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ Unicode true true false false false true Level3 false false ..\..;..\..\include;..\..\silk;..\..\celt;..\..\win32;%(AdditionalIncludeDirectories) HAVE_CONFIG_H;WIN32;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) false false Console true Console Guard ProgramDatabase NoExtensions false true false Disabled false false Disabled MultiThreadedDebug MultiThreadedDebugDLL true false true false None true true false Speed Fast Precise true true true MaxSpeed MultiThreaded MultiThreadedDLL 16Bytes false mumble-1.3.4/3rdparty/opus-src/win32/genversion.bat0000664000175000017500000000142514010707327021777 0ustar builderbuilder@echo off setlocal enableextensions enabledelayedexpansion for /f %%v in ('cd "%~dp0.." ^&^& git status ^>NUL 2^>NUL ^&^& git describe --tags --match "v*" --dirty 2^>NUL') do set version=%%v if not "%version%"=="" set version=!version:~1! && goto :gotversion if exist "%~dp0..\package_version" goto :getversion echo Git cannot be found, nor can package_version. Generating unknown version. set version=unknown goto :gotversion :getversion for /f "delims== tokens=2" %%v in (%~dps0..\package_version) do set version=%%v set version=!version:"=! :gotversion set version=!version: =! set version_out=#define %~2 "%version%" echo %version_out%> "%~1_temp" echo n | comp "%~1_temp" "%~1" > NUL 2> NUL if not errorlevel 1 goto exit copy /y "%~1_temp" "%~1" :exit del "%~1_temp" mumble-1.3.4/3rdparty/opus-src/win32/config.h0000664000175000017500000000516514010707327020553 0ustar builderbuilder/*********************************************************************** Copyright (c) 2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef CONFIG_H #define CONFIG_H #define USE_ALLOCA 1 /* Comment out the next line for floating-point code */ /*#define FIXED_POINT 1 */ #define OPUS_BUILD 1 #if defined(_M_IX86) || defined(_M_X64) /* Can always compile SSE intrinsics (no special compiler flags necessary) */ #define OPUS_X86_MAY_HAVE_SSE #define OPUS_X86_MAY_HAVE_SSE2 #define OPUS_X86_MAY_HAVE_SSE4_1 /* Presume SSE functions, if compiled to use SSE/SSE2/AVX (note that AMD64 implies SSE2, and AVX implies SSE4.1) */ #if defined(_M_X64) || (defined(_M_IX86_FP) && (_M_IX86_FP >= 1)) || defined(__AVX__) #define OPUS_X86_PRESUME_SSE 1 #endif #if defined(_M_X64) || (defined(_M_IX86_FP) && (_M_IX86_FP >= 2)) || defined(__AVX__) #define OPUS_X86_PRESUME_SSE2 1 #endif #if defined(__AVX__) #define OPUS_X86_PRESUME_SSE4_1 1 #endif #if !defined(OPUS_X86_PRESUME_SSE4_1) || !defined(OPUS_X86_PRESUME_SSE2) || !defined(OPUS_X86_PRESUME_SSE) #define OPUS_HAVE_RTCD 1 #endif #endif #include "version.h" #endif /* CONFIG_H */ mumble-1.3.4/3rdparty/opus-src/silk/0000775000175000017500000000000014010707327017126 5ustar builderbuildermumble-1.3.4/3rdparty/opus-src/silk/tables_NLSF_CB_NB_MB.c0000664000175000017500000002504114010707327022671 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "tables.h" static const opus_uint8 silk_NLSF_CB1_NB_MB_Q8[ 320 ] = { 12, 35, 60, 83, 108, 132, 157, 180, 206, 228, 15, 32, 55, 77, 101, 125, 151, 175, 201, 225, 19, 42, 66, 89, 114, 137, 162, 184, 209, 230, 12, 25, 50, 72, 97, 120, 147, 172, 200, 223, 26, 44, 69, 90, 114, 135, 159, 180, 205, 225, 13, 22, 53, 80, 106, 130, 156, 180, 205, 228, 15, 25, 44, 64, 90, 115, 142, 168, 196, 222, 19, 24, 62, 82, 100, 120, 145, 168, 190, 214, 22, 31, 50, 79, 103, 120, 151, 170, 203, 227, 21, 29, 45, 65, 106, 124, 150, 171, 196, 224, 30, 49, 75, 97, 121, 142, 165, 186, 209, 229, 19, 25, 52, 70, 93, 116, 143, 166, 192, 219, 26, 34, 62, 75, 97, 118, 145, 167, 194, 217, 25, 33, 56, 70, 91, 113, 143, 165, 196, 223, 21, 34, 51, 72, 97, 117, 145, 171, 196, 222, 20, 29, 50, 67, 90, 117, 144, 168, 197, 221, 22, 31, 48, 66, 95, 117, 146, 168, 196, 222, 24, 33, 51, 77, 116, 134, 158, 180, 200, 224, 21, 28, 70, 87, 106, 124, 149, 170, 194, 217, 26, 33, 53, 64, 83, 117, 152, 173, 204, 225, 27, 34, 65, 95, 108, 129, 155, 174, 210, 225, 20, 26, 72, 99, 113, 131, 154, 176, 200, 219, 34, 43, 61, 78, 93, 114, 155, 177, 205, 229, 23, 29, 54, 97, 124, 138, 163, 179, 209, 229, 30, 38, 56, 89, 118, 129, 158, 178, 200, 231, 21, 29, 49, 63, 85, 111, 142, 163, 193, 222, 27, 48, 77, 103, 133, 158, 179, 196, 215, 232, 29, 47, 74, 99, 124, 151, 176, 198, 220, 237, 33, 42, 61, 76, 93, 121, 155, 174, 207, 225, 29, 53, 87, 112, 136, 154, 170, 188, 208, 227, 24, 30, 52, 84, 131, 150, 166, 186, 203, 229, 37, 48, 64, 84, 104, 118, 156, 177, 201, 230 }; static const opus_int16 silk_NLSF_CB1_Wght_Q9[ 320 ] = { 2897, 2314, 2314, 2314, 2287, 2287, 2314, 2300, 2327, 2287, 2888, 2580, 2394, 2367, 2314, 2274, 2274, 2274, 2274, 2194, 2487, 2340, 2340, 2314, 2314, 2314, 2340, 2340, 2367, 2354, 3216, 2766, 2340, 2340, 2314, 2274, 2221, 2207, 2261, 2194, 2460, 2474, 2367, 2394, 2394, 2394, 2394, 2367, 2407, 2314, 3479, 3056, 2127, 2207, 2274, 2274, 2274, 2287, 2314, 2261, 3282, 3141, 2580, 2394, 2247, 2221, 2207, 2194, 2194, 2114, 4096, 3845, 2221, 2620, 2620, 2407, 2314, 2394, 2367, 2074, 3178, 3244, 2367, 2221, 2553, 2434, 2340, 2314, 2167, 2221, 3338, 3488, 2726, 2194, 2261, 2460, 2354, 2367, 2207, 2101, 2354, 2420, 2327, 2367, 2394, 2420, 2420, 2420, 2460, 2367, 3779, 3629, 2434, 2527, 2367, 2274, 2274, 2300, 2207, 2048, 3254, 3225, 2713, 2846, 2447, 2327, 2300, 2300, 2274, 2127, 3263, 3300, 2753, 2806, 2447, 2261, 2261, 2247, 2127, 2101, 2873, 2981, 2633, 2367, 2407, 2354, 2194, 2247, 2247, 2114, 3225, 3197, 2633, 2580, 2274, 2181, 2247, 2221, 2221, 2141, 3178, 3310, 2740, 2407, 2274, 2274, 2274, 2287, 2194, 2114, 3141, 3272, 2460, 2061, 2287, 2500, 2367, 2487, 2434, 2181, 3507, 3282, 2314, 2700, 2647, 2474, 2367, 2394, 2340, 2127, 3423, 3535, 3038, 3056, 2300, 1950, 2221, 2274, 2274, 2274, 3404, 3366, 2087, 2687, 2873, 2354, 2420, 2274, 2474, 2540, 3760, 3488, 1950, 2660, 2897, 2527, 2394, 2367, 2460, 2261, 3028, 3272, 2740, 2888, 2740, 2154, 2127, 2287, 2234, 2247, 3695, 3657, 2025, 1969, 2660, 2700, 2580, 2500, 2327, 2367, 3207, 3413, 2354, 2074, 2888, 2888, 2340, 2487, 2247, 2167, 3338, 3366, 2846, 2780, 2327, 2154, 2274, 2287, 2114, 2061, 2327, 2300, 2181, 2167, 2181, 2367, 2633, 2700, 2700, 2553, 2407, 2434, 2221, 2261, 2221, 2221, 2340, 2420, 2607, 2700, 3038, 3244, 2806, 2888, 2474, 2074, 2300, 2314, 2354, 2380, 2221, 2154, 2127, 2287, 2500, 2793, 2793, 2620, 2580, 2367, 3676, 3713, 2234, 1838, 2181, 2753, 2726, 2673, 2513, 2207, 2793, 3160, 2726, 2553, 2846, 2513, 2181, 2394, 2221, 2181 }; static const opus_uint8 silk_NLSF_CB1_iCDF_NB_MB[ 64 ] = { 212, 178, 148, 129, 108, 96, 85, 82, 79, 77, 61, 59, 57, 56, 51, 49, 48, 45, 42, 41, 40, 38, 36, 34, 31, 30, 21, 12, 10, 3, 1, 0, 255, 245, 244, 236, 233, 225, 217, 203, 190, 176, 175, 161, 149, 136, 125, 114, 102, 91, 81, 71, 60, 52, 43, 35, 28, 20, 19, 18, 12, 11, 5, 0 }; static const opus_uint8 silk_NLSF_CB2_SELECT_NB_MB[ 160 ] = { 16, 0, 0, 0, 0, 99, 66, 36, 36, 34, 36, 34, 34, 34, 34, 83, 69, 36, 52, 34, 116, 102, 70, 68, 68, 176, 102, 68, 68, 34, 65, 85, 68, 84, 36, 116, 141, 152, 139, 170, 132, 187, 184, 216, 137, 132, 249, 168, 185, 139, 104, 102, 100, 68, 68, 178, 218, 185, 185, 170, 244, 216, 187, 187, 170, 244, 187, 187, 219, 138, 103, 155, 184, 185, 137, 116, 183, 155, 152, 136, 132, 217, 184, 184, 170, 164, 217, 171, 155, 139, 244, 169, 184, 185, 170, 164, 216, 223, 218, 138, 214, 143, 188, 218, 168, 244, 141, 136, 155, 170, 168, 138, 220, 219, 139, 164, 219, 202, 216, 137, 168, 186, 246, 185, 139, 116, 185, 219, 185, 138, 100, 100, 134, 100, 102, 34, 68, 68, 100, 68, 168, 203, 221, 218, 168, 167, 154, 136, 104, 70, 164, 246, 171, 137, 139, 137, 155, 218, 219, 139 }; static const opus_uint8 silk_NLSF_CB2_iCDF_NB_MB[ 72 ] = { 255, 254, 253, 238, 14, 3, 2, 1, 0, 255, 254, 252, 218, 35, 3, 2, 1, 0, 255, 254, 250, 208, 59, 4, 2, 1, 0, 255, 254, 246, 194, 71, 10, 2, 1, 0, 255, 252, 236, 183, 82, 8, 2, 1, 0, 255, 252, 235, 180, 90, 17, 2, 1, 0, 255, 248, 224, 171, 97, 30, 4, 1, 0, 255, 254, 236, 173, 95, 37, 7, 1, 0 }; static const opus_uint8 silk_NLSF_CB2_BITS_NB_MB_Q5[ 72 ] = { 255, 255, 255, 131, 6, 145, 255, 255, 255, 255, 255, 236, 93, 15, 96, 255, 255, 255, 255, 255, 194, 83, 25, 71, 221, 255, 255, 255, 255, 162, 73, 34, 66, 162, 255, 255, 255, 210, 126, 73, 43, 57, 173, 255, 255, 255, 201, 125, 71, 48, 58, 130, 255, 255, 255, 166, 110, 73, 57, 62, 104, 210, 255, 255, 251, 123, 65, 55, 68, 100, 171, 255 }; static const opus_uint8 silk_NLSF_PRED_NB_MB_Q8[ 18 ] = { 179, 138, 140, 148, 151, 149, 153, 151, 163, 116, 67, 82, 59, 92, 72, 100, 89, 92 }; static const opus_int16 silk_NLSF_DELTA_MIN_NB_MB_Q15[ 11 ] = { 250, 3, 6, 3, 3, 3, 4, 3, 3, 3, 461 }; const silk_NLSF_CB_struct silk_NLSF_CB_NB_MB = { 32, 10, SILK_FIX_CONST( 0.18, 16 ), SILK_FIX_CONST( 1.0 / 0.18, 6 ), silk_NLSF_CB1_NB_MB_Q8, silk_NLSF_CB1_Wght_Q9, silk_NLSF_CB1_iCDF_NB_MB, silk_NLSF_PRED_NB_MB_Q8, silk_NLSF_CB2_SELECT_NB_MB, silk_NLSF_CB2_iCDF_NB_MB, silk_NLSF_CB2_BITS_NB_MB_Q5, silk_NLSF_DELTA_MIN_NB_MB_Q15, }; mumble-1.3.4/3rdparty/opus-src/silk/tables_NLSF_CB_WB.c0000664000175000017500000003424314010707327022330 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "tables.h" static const opus_uint8 silk_NLSF_CB1_WB_Q8[ 512 ] = { 7, 23, 38, 54, 69, 85, 100, 116, 131, 147, 162, 178, 193, 208, 223, 239, 13, 25, 41, 55, 69, 83, 98, 112, 127, 142, 157, 171, 187, 203, 220, 236, 15, 21, 34, 51, 61, 78, 92, 106, 126, 136, 152, 167, 185, 205, 225, 240, 10, 21, 36, 50, 63, 79, 95, 110, 126, 141, 157, 173, 189, 205, 221, 237, 17, 20, 37, 51, 59, 78, 89, 107, 123, 134, 150, 164, 184, 205, 224, 240, 10, 15, 32, 51, 67, 81, 96, 112, 129, 142, 158, 173, 189, 204, 220, 236, 8, 21, 37, 51, 65, 79, 98, 113, 126, 138, 155, 168, 179, 192, 209, 218, 12, 15, 34, 55, 63, 78, 87, 108, 118, 131, 148, 167, 185, 203, 219, 236, 16, 19, 32, 36, 56, 79, 91, 108, 118, 136, 154, 171, 186, 204, 220, 237, 11, 28, 43, 58, 74, 89, 105, 120, 135, 150, 165, 180, 196, 211, 226, 241, 6, 16, 33, 46, 60, 75, 92, 107, 123, 137, 156, 169, 185, 199, 214, 225, 11, 19, 30, 44, 57, 74, 89, 105, 121, 135, 152, 169, 186, 202, 218, 234, 12, 19, 29, 46, 57, 71, 88, 100, 120, 132, 148, 165, 182, 199, 216, 233, 17, 23, 35, 46, 56, 77, 92, 106, 123, 134, 152, 167, 185, 204, 222, 237, 14, 17, 45, 53, 63, 75, 89, 107, 115, 132, 151, 171, 188, 206, 221, 240, 9, 16, 29, 40, 56, 71, 88, 103, 119, 137, 154, 171, 189, 205, 222, 237, 16, 19, 36, 48, 57, 76, 87, 105, 118, 132, 150, 167, 185, 202, 218, 236, 12, 17, 29, 54, 71, 81, 94, 104, 126, 136, 149, 164, 182, 201, 221, 237, 15, 28, 47, 62, 79, 97, 115, 129, 142, 155, 168, 180, 194, 208, 223, 238, 8, 14, 30, 45, 62, 78, 94, 111, 127, 143, 159, 175, 192, 207, 223, 239, 17, 30, 49, 62, 79, 92, 107, 119, 132, 145, 160, 174, 190, 204, 220, 235, 14, 19, 36, 45, 61, 76, 91, 108, 121, 138, 154, 172, 189, 205, 222, 238, 12, 18, 31, 45, 60, 76, 91, 107, 123, 138, 154, 171, 187, 204, 221, 236, 13, 17, 31, 43, 53, 70, 83, 103, 114, 131, 149, 167, 185, 203, 220, 237, 17, 22, 35, 42, 58, 78, 93, 110, 125, 139, 155, 170, 188, 206, 224, 240, 8, 15, 34, 50, 67, 83, 99, 115, 131, 146, 162, 178, 193, 209, 224, 239, 13, 16, 41, 66, 73, 86, 95, 111, 128, 137, 150, 163, 183, 206, 225, 241, 17, 25, 37, 52, 63, 75, 92, 102, 119, 132, 144, 160, 175, 191, 212, 231, 19, 31, 49, 65, 83, 100, 117, 133, 147, 161, 174, 187, 200, 213, 227, 242, 18, 31, 52, 68, 88, 103, 117, 126, 138, 149, 163, 177, 192, 207, 223, 239, 16, 29, 47, 61, 76, 90, 106, 119, 133, 147, 161, 176, 193, 209, 224, 240, 15, 21, 35, 50, 61, 73, 86, 97, 110, 119, 129, 141, 175, 198, 218, 237 }; static const opus_int16 silk_NLSF_CB1_WB_Wght_Q9[ 512 ] = { 3657, 2925, 2925, 2925, 2925, 2925, 2925, 2925, 2925, 2925, 2925, 2925, 2963, 2963, 2925, 2846, 3216, 3085, 2972, 3056, 3056, 3010, 3010, 3010, 2963, 2963, 3010, 2972, 2888, 2846, 2846, 2726, 3920, 4014, 2981, 3207, 3207, 2934, 3056, 2846, 3122, 3244, 2925, 2846, 2620, 2553, 2780, 2925, 3516, 3197, 3010, 3103, 3019, 2888, 2925, 2925, 2925, 2925, 2888, 2888, 2888, 2888, 2888, 2753, 5054, 5054, 2934, 3573, 3385, 3056, 3085, 2793, 3160, 3160, 2972, 2846, 2513, 2540, 2753, 2888, 4428, 4149, 2700, 2753, 2972, 3010, 2925, 2846, 2981, 3019, 2925, 2925, 2925, 2925, 2888, 2726, 3620, 3019, 2972, 3056, 3056, 2873, 2806, 3056, 3216, 3047, 2981, 3291, 3291, 2981, 3310, 2991, 5227, 5014, 2540, 3338, 3526, 3385, 3197, 3094, 3376, 2981, 2700, 2647, 2687, 2793, 2846, 2673, 5081, 5174, 4615, 4428, 2460, 2897, 3047, 3207, 3169, 2687, 2740, 2888, 2846, 2793, 2846, 2700, 3122, 2888, 2963, 2925, 2925, 2925, 2925, 2963, 2963, 2963, 2963, 2925, 2925, 2963, 2963, 2963, 4202, 3207, 2981, 3103, 3010, 2888, 2888, 2925, 2972, 2873, 2916, 3019, 2972, 3010, 3197, 2873, 3760, 3760, 3244, 3103, 2981, 2888, 2925, 2888, 2972, 2934, 2793, 2793, 2846, 2888, 2888, 2660, 3854, 4014, 3207, 3122, 3244, 2934, 3047, 2963, 2963, 3085, 2846, 2793, 2793, 2793, 2793, 2580, 3845, 4080, 3357, 3516, 3094, 2740, 3010, 2934, 3122, 3085, 2846, 2846, 2647, 2647, 2846, 2806, 5147, 4894, 3225, 3845, 3441, 3169, 2897, 3413, 3451, 2700, 2580, 2673, 2740, 2846, 2806, 2753, 4109, 3789, 3291, 3160, 2925, 2888, 2888, 2925, 2793, 2740, 2793, 2740, 2793, 2846, 2888, 2806, 5081, 5054, 3047, 3545, 3244, 3056, 3085, 2944, 3103, 2897, 2740, 2740, 2740, 2846, 2793, 2620, 4309, 4309, 2860, 2527, 3207, 3376, 3376, 3075, 3075, 3376, 3056, 2846, 2647, 2580, 2726, 2753, 3056, 2916, 2806, 2888, 2740, 2687, 2897, 3103, 3150, 3150, 3216, 3169, 3056, 3010, 2963, 2846, 4375, 3882, 2925, 2888, 2846, 2888, 2846, 2846, 2888, 2888, 2888, 2846, 2888, 2925, 2888, 2846, 2981, 2916, 2916, 2981, 2981, 3056, 3122, 3216, 3150, 3056, 3010, 2972, 2972, 2972, 2925, 2740, 4229, 4149, 3310, 3347, 2925, 2963, 2888, 2981, 2981, 2846, 2793, 2740, 2846, 2846, 2846, 2793, 4080, 4014, 3103, 3010, 2925, 2925, 2925, 2888, 2925, 2925, 2846, 2846, 2846, 2793, 2888, 2780, 4615, 4575, 3169, 3441, 3207, 2981, 2897, 3038, 3122, 2740, 2687, 2687, 2687, 2740, 2793, 2700, 4149, 4269, 3789, 3657, 2726, 2780, 2888, 2888, 3010, 2972, 2925, 2846, 2687, 2687, 2793, 2888, 4215, 3554, 2753, 2846, 2846, 2888, 2888, 2888, 2925, 2925, 2888, 2925, 2925, 2925, 2963, 2888, 5174, 4921, 2261, 3432, 3789, 3479, 3347, 2846, 3310, 3479, 3150, 2897, 2460, 2487, 2753, 2925, 3451, 3685, 3122, 3197, 3357, 3047, 3207, 3207, 2981, 3216, 3085, 2925, 2925, 2687, 2540, 2434, 2981, 3010, 2793, 2793, 2740, 2793, 2846, 2972, 3056, 3103, 3150, 3150, 3150, 3103, 3010, 3010, 2944, 2873, 2687, 2726, 2780, 3010, 3432, 3545, 3357, 3244, 3056, 3010, 2963, 2925, 2888, 2846, 3019, 2944, 2897, 3010, 3010, 2972, 3019, 3103, 3056, 3056, 3010, 2888, 2846, 2925, 2925, 2888, 3920, 3967, 3010, 3197, 3357, 3216, 3291, 3291, 3479, 3704, 3441, 2726, 2181, 2460, 2580, 2607 }; static const opus_uint8 silk_NLSF_CB1_iCDF_WB[ 64 ] = { 225, 204, 201, 184, 183, 175, 158, 154, 153, 135, 119, 115, 113, 110, 109, 99, 98, 95, 79, 68, 52, 50, 48, 45, 43, 32, 31, 27, 18, 10, 3, 0, 255, 251, 235, 230, 212, 201, 196, 182, 167, 166, 163, 151, 138, 124, 110, 104, 90, 78, 76, 70, 69, 57, 45, 34, 24, 21, 11, 6, 5, 4, 3, 0 }; static const opus_uint8 silk_NLSF_CB2_SELECT_WB[ 256 ] = { 0, 0, 0, 0, 0, 0, 0, 1, 100, 102, 102, 68, 68, 36, 34, 96, 164, 107, 158, 185, 180, 185, 139, 102, 64, 66, 36, 34, 34, 0, 1, 32, 208, 139, 141, 191, 152, 185, 155, 104, 96, 171, 104, 166, 102, 102, 102, 132, 1, 0, 0, 0, 0, 16, 16, 0, 80, 109, 78, 107, 185, 139, 103, 101, 208, 212, 141, 139, 173, 153, 123, 103, 36, 0, 0, 0, 0, 0, 0, 1, 48, 0, 0, 0, 0, 0, 0, 32, 68, 135, 123, 119, 119, 103, 69, 98, 68, 103, 120, 118, 118, 102, 71, 98, 134, 136, 157, 184, 182, 153, 139, 134, 208, 168, 248, 75, 189, 143, 121, 107, 32, 49, 34, 34, 34, 0, 17, 2, 210, 235, 139, 123, 185, 137, 105, 134, 98, 135, 104, 182, 100, 183, 171, 134, 100, 70, 68, 70, 66, 66, 34, 131, 64, 166, 102, 68, 36, 2, 1, 0, 134, 166, 102, 68, 34, 34, 66, 132, 212, 246, 158, 139, 107, 107, 87, 102, 100, 219, 125, 122, 137, 118, 103, 132, 114, 135, 137, 105, 171, 106, 50, 34, 164, 214, 141, 143, 185, 151, 121, 103, 192, 34, 0, 0, 0, 0, 0, 1, 208, 109, 74, 187, 134, 249, 159, 137, 102, 110, 154, 118, 87, 101, 119, 101, 0, 2, 0, 36, 36, 66, 68, 35, 96, 164, 102, 100, 36, 0, 2, 33, 167, 138, 174, 102, 100, 84, 2, 2, 100, 107, 120, 119, 36, 197, 24, 0 }; static const opus_uint8 silk_NLSF_CB2_iCDF_WB[ 72 ] = { 255, 254, 253, 244, 12, 3, 2, 1, 0, 255, 254, 252, 224, 38, 3, 2, 1, 0, 255, 254, 251, 209, 57, 4, 2, 1, 0, 255, 254, 244, 195, 69, 4, 2, 1, 0, 255, 251, 232, 184, 84, 7, 2, 1, 0, 255, 254, 240, 186, 86, 14, 2, 1, 0, 255, 254, 239, 178, 91, 30, 5, 1, 0, 255, 248, 227, 177, 100, 19, 2, 1, 0 }; static const opus_uint8 silk_NLSF_CB2_BITS_WB_Q5[ 72 ] = { 255, 255, 255, 156, 4, 154, 255, 255, 255, 255, 255, 227, 102, 15, 92, 255, 255, 255, 255, 255, 213, 83, 24, 72, 236, 255, 255, 255, 255, 150, 76, 33, 63, 214, 255, 255, 255, 190, 121, 77, 43, 55, 185, 255, 255, 255, 245, 137, 71, 43, 59, 139, 255, 255, 255, 255, 131, 66, 50, 66, 107, 194, 255, 255, 166, 116, 76, 55, 53, 125, 255, 255 }; static const opus_uint8 silk_NLSF_PRED_WB_Q8[ 30 ] = { 175, 148, 160, 176, 178, 173, 174, 164, 177, 174, 196, 182, 198, 192, 182, 68, 62, 66, 60, 72, 117, 85, 90, 118, 136, 151, 142, 160, 142, 155 }; static const opus_int16 silk_NLSF_DELTA_MIN_WB_Q15[ 17 ] = { 100, 3, 40, 3, 3, 3, 5, 14, 14, 10, 11, 3, 8, 9, 7, 3, 347 }; const silk_NLSF_CB_struct silk_NLSF_CB_WB = { 32, 16, SILK_FIX_CONST( 0.15, 16 ), SILK_FIX_CONST( 1.0 / 0.15, 6 ), silk_NLSF_CB1_WB_Q8, silk_NLSF_CB1_WB_Wght_Q9, silk_NLSF_CB1_iCDF_WB, silk_NLSF_PRED_WB_Q8, silk_NLSF_CB2_SELECT_WB, silk_NLSF_CB2_iCDF_WB, silk_NLSF_CB2_BITS_WB_Q5, silk_NLSF_DELTA_MIN_WB_Q15, }; mumble-1.3.4/3rdparty/opus-src/silk/NSQ.c0000664000175000017500000005440314010707327017741 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main.h" #include "stack_alloc.h" #include "NSQ.h" static OPUS_INLINE void silk_nsq_scale_states( const silk_encoder_state *psEncC, /* I Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ const opus_int16 x16[], /* I input */ opus_int32 x_sc_Q10[], /* O input scaled with 1/Gain */ const opus_int16 sLTP[], /* I re-whitened LTP state in Q0 */ opus_int32 sLTP_Q15[], /* O LTP state matching scaled input */ opus_int subfr, /* I subframe number */ const opus_int LTP_scale_Q14, /* I */ const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I */ const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag */ const opus_int signal_type /* I Signal type */ ); #if !defined(OPUS_X86_MAY_HAVE_SSE4_1) static OPUS_INLINE void silk_noise_shape_quantizer( silk_nsq_state *NSQ, /* I/O NSQ state */ opus_int signalType, /* I Signal type */ const opus_int32 x_sc_Q10[], /* I */ opus_int8 pulses[], /* O */ opus_int16 xq[], /* O */ opus_int32 sLTP_Q15[], /* I/O LTP state */ const opus_int16 a_Q12[], /* I Short term prediction coefs */ const opus_int16 b_Q14[], /* I Long term prediction coefs */ const opus_int16 AR_shp_Q13[], /* I Noise shaping AR coefs */ opus_int lag, /* I Pitch lag */ opus_int32 HarmShapeFIRPacked_Q14, /* I */ opus_int Tilt_Q14, /* I Spectral tilt */ opus_int32 LF_shp_Q14, /* I */ opus_int32 Gain_Q16, /* I */ opus_int Lambda_Q10, /* I */ opus_int offset_Q10, /* I */ opus_int length, /* I Input length */ opus_int shapingLPCOrder, /* I Noise shaping AR filter order */ opus_int predictLPCOrder, /* I Prediction filter order */ int arch /* I Architecture */ ); #endif void silk_NSQ_c ( const silk_encoder_state *psEncC, /* I Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ SideInfoIndices *psIndices, /* I/O Quantization Indices */ const opus_int16 x16[], /* I Input */ opus_int8 pulses[], /* O Quantized pulse signal */ const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */ const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */ const opus_int16 AR_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */ const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */ const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */ const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I Quantization step sizes */ const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */ const opus_int Lambda_Q10, /* I Rate/distortion tradeoff */ const opus_int LTP_scale_Q14 /* I LTP state scaling */ ) { opus_int k, lag, start_idx, LSF_interpolation_flag; const opus_int16 *A_Q12, *B_Q14, *AR_shp_Q13; opus_int16 *pxq; VARDECL( opus_int32, sLTP_Q15 ); VARDECL( opus_int16, sLTP ); opus_int32 HarmShapeFIRPacked_Q14; opus_int offset_Q10; VARDECL( opus_int32, x_sc_Q10 ); SAVE_STACK; NSQ->rand_seed = psIndices->Seed; /* Set unvoiced lag to the previous one, overwrite later for voiced */ lag = NSQ->lagPrev; silk_assert( NSQ->prev_gain_Q16 != 0 ); offset_Q10 = silk_Quantization_Offsets_Q10[ psIndices->signalType >> 1 ][ psIndices->quantOffsetType ]; if( psIndices->NLSFInterpCoef_Q2 == 4 ) { LSF_interpolation_flag = 0; } else { LSF_interpolation_flag = 1; } ALLOC( sLTP_Q15, psEncC->ltp_mem_length + psEncC->frame_length, opus_int32 ); ALLOC( sLTP, psEncC->ltp_mem_length + psEncC->frame_length, opus_int16 ); ALLOC( x_sc_Q10, psEncC->subfr_length, opus_int32 ); /* Set up pointers to start of sub frame */ NSQ->sLTP_shp_buf_idx = psEncC->ltp_mem_length; NSQ->sLTP_buf_idx = psEncC->ltp_mem_length; pxq = &NSQ->xq[ psEncC->ltp_mem_length ]; for( k = 0; k < psEncC->nb_subfr; k++ ) { A_Q12 = &PredCoef_Q12[ (( k >> 1 ) | ( 1 - LSF_interpolation_flag )) * MAX_LPC_ORDER ]; B_Q14 = <PCoef_Q14[ k * LTP_ORDER ]; AR_shp_Q13 = &AR_Q13[ k * MAX_SHAPE_LPC_ORDER ]; /* Noise shape parameters */ silk_assert( HarmShapeGain_Q14[ k ] >= 0 ); HarmShapeFIRPacked_Q14 = silk_RSHIFT( HarmShapeGain_Q14[ k ], 2 ); HarmShapeFIRPacked_Q14 |= silk_LSHIFT( (opus_int32)silk_RSHIFT( HarmShapeGain_Q14[ k ], 1 ), 16 ); NSQ->rewhite_flag = 0; if( psIndices->signalType == TYPE_VOICED ) { /* Voiced */ lag = pitchL[ k ]; /* Re-whitening */ if( ( k & ( 3 - silk_LSHIFT( LSF_interpolation_flag, 1 ) ) ) == 0 ) { /* Rewhiten with new A coefs */ start_idx = psEncC->ltp_mem_length - lag - psEncC->predictLPCOrder - LTP_ORDER / 2; silk_assert( start_idx > 0 ); silk_LPC_analysis_filter( &sLTP[ start_idx ], &NSQ->xq[ start_idx + k * psEncC->subfr_length ], A_Q12, psEncC->ltp_mem_length - start_idx, psEncC->predictLPCOrder, psEncC->arch ); NSQ->rewhite_flag = 1; NSQ->sLTP_buf_idx = psEncC->ltp_mem_length; } } silk_nsq_scale_states( psEncC, NSQ, x16, x_sc_Q10, sLTP, sLTP_Q15, k, LTP_scale_Q14, Gains_Q16, pitchL, psIndices->signalType ); silk_noise_shape_quantizer( NSQ, psIndices->signalType, x_sc_Q10, pulses, pxq, sLTP_Q15, A_Q12, B_Q14, AR_shp_Q13, lag, HarmShapeFIRPacked_Q14, Tilt_Q14[ k ], LF_shp_Q14[ k ], Gains_Q16[ k ], Lambda_Q10, offset_Q10, psEncC->subfr_length, psEncC->shapingLPCOrder, psEncC->predictLPCOrder, psEncC->arch ); x16 += psEncC->subfr_length; pulses += psEncC->subfr_length; pxq += psEncC->subfr_length; } /* Update lagPrev for next frame */ NSQ->lagPrev = pitchL[ psEncC->nb_subfr - 1 ]; /* Save quantized speech and noise shaping signals */ silk_memmove( NSQ->xq, &NSQ->xq[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int16 ) ); silk_memmove( NSQ->sLTP_shp_Q14, &NSQ->sLTP_shp_Q14[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int32 ) ); RESTORE_STACK; } /***********************************/ /* silk_noise_shape_quantizer */ /***********************************/ #if !defined(OPUS_X86_MAY_HAVE_SSE4_1) static OPUS_INLINE #endif void silk_noise_shape_quantizer( silk_nsq_state *NSQ, /* I/O NSQ state */ opus_int signalType, /* I Signal type */ const opus_int32 x_sc_Q10[], /* I */ opus_int8 pulses[], /* O */ opus_int16 xq[], /* O */ opus_int32 sLTP_Q15[], /* I/O LTP state */ const opus_int16 a_Q12[], /* I Short term prediction coefs */ const opus_int16 b_Q14[], /* I Long term prediction coefs */ const opus_int16 AR_shp_Q13[], /* I Noise shaping AR coefs */ opus_int lag, /* I Pitch lag */ opus_int32 HarmShapeFIRPacked_Q14, /* I */ opus_int Tilt_Q14, /* I Spectral tilt */ opus_int32 LF_shp_Q14, /* I */ opus_int32 Gain_Q16, /* I */ opus_int Lambda_Q10, /* I */ opus_int offset_Q10, /* I */ opus_int length, /* I Input length */ opus_int shapingLPCOrder, /* I Noise shaping AR filter order */ opus_int predictLPCOrder, /* I Prediction filter order */ int arch /* I Architecture */ ) { opus_int i; opus_int32 LTP_pred_Q13, LPC_pred_Q10, n_AR_Q12, n_LTP_Q13; opus_int32 n_LF_Q12, r_Q10, rr_Q10, q1_Q0, q1_Q10, q2_Q10, rd1_Q20, rd2_Q20; opus_int32 exc_Q14, LPC_exc_Q14, xq_Q14, Gain_Q10; opus_int32 tmp1, tmp2, sLF_AR_shp_Q14; opus_int32 *psLPC_Q14, *shp_lag_ptr, *pred_lag_ptr; #ifdef silk_short_prediction_create_arch_coef opus_int32 a_Q12_arch[MAX_LPC_ORDER]; #endif shp_lag_ptr = &NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - lag + HARM_SHAPE_FIR_TAPS / 2 ]; pred_lag_ptr = &sLTP_Q15[ NSQ->sLTP_buf_idx - lag + LTP_ORDER / 2 ]; Gain_Q10 = silk_RSHIFT( Gain_Q16, 6 ); /* Set up short term AR state */ psLPC_Q14 = &NSQ->sLPC_Q14[ NSQ_LPC_BUF_LENGTH - 1 ]; #ifdef silk_short_prediction_create_arch_coef silk_short_prediction_create_arch_coef(a_Q12_arch, a_Q12, predictLPCOrder); #endif for( i = 0; i < length; i++ ) { /* Generate dither */ NSQ->rand_seed = silk_RAND( NSQ->rand_seed ); /* Short-term prediction */ LPC_pred_Q10 = silk_noise_shape_quantizer_short_prediction(psLPC_Q14, a_Q12, a_Q12_arch, predictLPCOrder, arch); /* Long-term prediction */ if( signalType == TYPE_VOICED ) { /* Unrolled loop */ /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ LTP_pred_Q13 = 2; LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ 0 ], b_Q14[ 0 ] ); LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -1 ], b_Q14[ 1 ] ); LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -2 ], b_Q14[ 2 ] ); LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -3 ], b_Q14[ 3 ] ); LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -4 ], b_Q14[ 4 ] ); pred_lag_ptr++; } else { LTP_pred_Q13 = 0; } /* Noise shape feedback */ silk_assert( ( shapingLPCOrder & 1 ) == 0 ); /* check that order is even */ n_AR_Q12 = silk_NSQ_noise_shape_feedback_loop(&NSQ->sDiff_shp_Q14, NSQ->sAR2_Q14, AR_shp_Q13, shapingLPCOrder, arch); n_AR_Q12 = silk_SMLAWB( n_AR_Q12, NSQ->sLF_AR_shp_Q14, Tilt_Q14 ); n_LF_Q12 = silk_SMULWB( NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - 1 ], LF_shp_Q14 ); n_LF_Q12 = silk_SMLAWT( n_LF_Q12, NSQ->sLF_AR_shp_Q14, LF_shp_Q14 ); silk_assert( lag > 0 || signalType != TYPE_VOICED ); /* Combine prediction and noise shaping signals */ tmp1 = silk_SUB32( silk_LSHIFT32( LPC_pred_Q10, 2 ), n_AR_Q12 ); /* Q12 */ tmp1 = silk_SUB32( tmp1, n_LF_Q12 ); /* Q12 */ if( lag > 0 ) { /* Symmetric, packed FIR coefficients */ n_LTP_Q13 = silk_SMULWB( silk_ADD32( shp_lag_ptr[ 0 ], shp_lag_ptr[ -2 ] ), HarmShapeFIRPacked_Q14 ); n_LTP_Q13 = silk_SMLAWT( n_LTP_Q13, shp_lag_ptr[ -1 ], HarmShapeFIRPacked_Q14 ); n_LTP_Q13 = silk_LSHIFT( n_LTP_Q13, 1 ); shp_lag_ptr++; tmp2 = silk_SUB32( LTP_pred_Q13, n_LTP_Q13 ); /* Q13 */ tmp1 = silk_ADD_LSHIFT32( tmp2, tmp1, 1 ); /* Q13 */ tmp1 = silk_RSHIFT_ROUND( tmp1, 3 ); /* Q10 */ } else { tmp1 = silk_RSHIFT_ROUND( tmp1, 2 ); /* Q10 */ } r_Q10 = silk_SUB32( x_sc_Q10[ i ], tmp1 ); /* residual error Q10 */ /* Flip sign depending on dither */ if( NSQ->rand_seed < 0 ) { r_Q10 = -r_Q10; } r_Q10 = silk_LIMIT_32( r_Q10, -(31 << 10), 30 << 10 ); /* Find two quantization level candidates and measure their rate-distortion */ q1_Q10 = silk_SUB32( r_Q10, offset_Q10 ); q1_Q0 = silk_RSHIFT( q1_Q10, 10 ); if (Lambda_Q10 > 2048) { /* For aggressive RDO, the bias becomes more than one pulse. */ int rdo_offset = Lambda_Q10/2 - 512; if (q1_Q10 > rdo_offset) { q1_Q0 = silk_RSHIFT( q1_Q10 - rdo_offset, 10 ); } else if (q1_Q10 < -rdo_offset) { q1_Q0 = silk_RSHIFT( q1_Q10 + rdo_offset, 10 ); } else if (q1_Q10 < 0) { q1_Q0 = -1; } else { q1_Q0 = 0; } } if( q1_Q0 > 0 ) { q1_Q10 = silk_SUB32( silk_LSHIFT( q1_Q0, 10 ), QUANT_LEVEL_ADJUST_Q10 ); q1_Q10 = silk_ADD32( q1_Q10, offset_Q10 ); q2_Q10 = silk_ADD32( q1_Q10, 1024 ); rd1_Q20 = silk_SMULBB( q1_Q10, Lambda_Q10 ); rd2_Q20 = silk_SMULBB( q2_Q10, Lambda_Q10 ); } else if( q1_Q0 == 0 ) { q1_Q10 = offset_Q10; q2_Q10 = silk_ADD32( q1_Q10, 1024 - QUANT_LEVEL_ADJUST_Q10 ); rd1_Q20 = silk_SMULBB( q1_Q10, Lambda_Q10 ); rd2_Q20 = silk_SMULBB( q2_Q10, Lambda_Q10 ); } else if( q1_Q0 == -1 ) { q2_Q10 = offset_Q10; q1_Q10 = silk_SUB32( q2_Q10, 1024 - QUANT_LEVEL_ADJUST_Q10 ); rd1_Q20 = silk_SMULBB( -q1_Q10, Lambda_Q10 ); rd2_Q20 = silk_SMULBB( q2_Q10, Lambda_Q10 ); } else { /* Q1_Q0 < -1 */ q1_Q10 = silk_ADD32( silk_LSHIFT( q1_Q0, 10 ), QUANT_LEVEL_ADJUST_Q10 ); q1_Q10 = silk_ADD32( q1_Q10, offset_Q10 ); q2_Q10 = silk_ADD32( q1_Q10, 1024 ); rd1_Q20 = silk_SMULBB( -q1_Q10, Lambda_Q10 ); rd2_Q20 = silk_SMULBB( -q2_Q10, Lambda_Q10 ); } rr_Q10 = silk_SUB32( r_Q10, q1_Q10 ); rd1_Q20 = silk_SMLABB( rd1_Q20, rr_Q10, rr_Q10 ); rr_Q10 = silk_SUB32( r_Q10, q2_Q10 ); rd2_Q20 = silk_SMLABB( rd2_Q20, rr_Q10, rr_Q10 ); if( rd2_Q20 < rd1_Q20 ) { q1_Q10 = q2_Q10; } pulses[ i ] = (opus_int8)silk_RSHIFT_ROUND( q1_Q10, 10 ); /* Excitation */ exc_Q14 = silk_LSHIFT( q1_Q10, 4 ); if ( NSQ->rand_seed < 0 ) { exc_Q14 = -exc_Q14; } /* Add predictions */ LPC_exc_Q14 = silk_ADD_LSHIFT32( exc_Q14, LTP_pred_Q13, 1 ); xq_Q14 = silk_ADD_LSHIFT32( LPC_exc_Q14, LPC_pred_Q10, 4 ); /* Scale XQ back to normal level before saving */ xq[ i ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( xq_Q14, Gain_Q10 ), 8 ) ); /* Update states */ psLPC_Q14++; *psLPC_Q14 = xq_Q14; NSQ->sDiff_shp_Q14 = silk_SUB_LSHIFT32( xq_Q14, x_sc_Q10[ i ], 4 ); sLF_AR_shp_Q14 = silk_SUB_LSHIFT32( NSQ->sDiff_shp_Q14, n_AR_Q12, 2 ); NSQ->sLF_AR_shp_Q14 = sLF_AR_shp_Q14; NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx ] = silk_SUB_LSHIFT32( sLF_AR_shp_Q14, n_LF_Q12, 2 ); sLTP_Q15[ NSQ->sLTP_buf_idx ] = silk_LSHIFT( LPC_exc_Q14, 1 ); NSQ->sLTP_shp_buf_idx++; NSQ->sLTP_buf_idx++; /* Make dither dependent on quantized signal */ NSQ->rand_seed = silk_ADD32_ovflw( NSQ->rand_seed, pulses[ i ] ); } /* Update LPC synth buffer */ silk_memcpy( NSQ->sLPC_Q14, &NSQ->sLPC_Q14[ length ], NSQ_LPC_BUF_LENGTH * sizeof( opus_int32 ) ); } static OPUS_INLINE void silk_nsq_scale_states( const silk_encoder_state *psEncC, /* I Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ const opus_int16 x16[], /* I input */ opus_int32 x_sc_Q10[], /* O input scaled with 1/Gain */ const opus_int16 sLTP[], /* I re-whitened LTP state in Q0 */ opus_int32 sLTP_Q15[], /* O LTP state matching scaled input */ opus_int subfr, /* I subframe number */ const opus_int LTP_scale_Q14, /* I */ const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I */ const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag */ const opus_int signal_type /* I Signal type */ ) { opus_int i, lag; opus_int32 gain_adj_Q16, inv_gain_Q31, inv_gain_Q26; lag = pitchL[ subfr ]; inv_gain_Q31 = silk_INVERSE32_varQ( silk_max( Gains_Q16[ subfr ], 1 ), 47 ); silk_assert( inv_gain_Q31 != 0 ); /* Scale input */ inv_gain_Q26 = silk_RSHIFT_ROUND( inv_gain_Q31, 5 ); for( i = 0; i < psEncC->subfr_length; i++ ) { x_sc_Q10[ i ] = silk_SMULWW( x16[ i ], inv_gain_Q26 ); } /* After rewhitening the LTP state is un-scaled, so scale with inv_gain_Q16 */ if( NSQ->rewhite_flag ) { if( subfr == 0 ) { /* Do LTP downscaling */ inv_gain_Q31 = silk_LSHIFT( silk_SMULWB( inv_gain_Q31, LTP_scale_Q14 ), 2 ); } for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx; i++ ) { silk_assert( i < MAX_FRAME_LENGTH ); sLTP_Q15[ i ] = silk_SMULWB( inv_gain_Q31, sLTP[ i ] ); } } /* Adjust for changing gain */ if( Gains_Q16[ subfr ] != NSQ->prev_gain_Q16 ) { gain_adj_Q16 = silk_DIV32_varQ( NSQ->prev_gain_Q16, Gains_Q16[ subfr ], 16 ); /* Scale long-term shaping state */ for( i = NSQ->sLTP_shp_buf_idx - psEncC->ltp_mem_length; i < NSQ->sLTP_shp_buf_idx; i++ ) { NSQ->sLTP_shp_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sLTP_shp_Q14[ i ] ); } /* Scale long-term prediction state */ if( signal_type == TYPE_VOICED && NSQ->rewhite_flag == 0 ) { for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx; i++ ) { sLTP_Q15[ i ] = silk_SMULWW( gain_adj_Q16, sLTP_Q15[ i ] ); } } NSQ->sLF_AR_shp_Q14 = silk_SMULWW( gain_adj_Q16, NSQ->sLF_AR_shp_Q14 ); NSQ->sDiff_shp_Q14 = silk_SMULWW( gain_adj_Q16, NSQ->sDiff_shp_Q14 ); /* Scale short-term prediction and shaping states */ for( i = 0; i < NSQ_LPC_BUF_LENGTH; i++ ) { NSQ->sLPC_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sLPC_Q14[ i ] ); } for( i = 0; i < MAX_SHAPE_LPC_ORDER; i++ ) { NSQ->sAR2_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sAR2_Q14[ i ] ); } /* Save inverse gain */ NSQ->prev_gain_Q16 = Gains_Q16[ subfr ]; } } mumble-1.3.4/3rdparty/opus-src/silk/control.h0000664000175000017500000001402514010707327020761 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef SILK_CONTROL_H #define SILK_CONTROL_H #include "typedef.h" #ifdef __cplusplus extern "C" { #endif /* Decoder API flags */ #define FLAG_DECODE_NORMAL 0 #define FLAG_PACKET_LOST 1 #define FLAG_DECODE_LBRR 2 /***********************************************/ /* Structure for controlling encoder operation */ /***********************************************/ typedef struct { /* I: Number of channels; 1/2 */ opus_int32 nChannelsAPI; /* I: Number of channels; 1/2 */ opus_int32 nChannelsInternal; /* I: Input signal sampling rate in Hertz; 8000/12000/16000/24000/32000/44100/48000 */ opus_int32 API_sampleRate; /* I: Maximum internal sampling rate in Hertz; 8000/12000/16000 */ opus_int32 maxInternalSampleRate; /* I: Minimum internal sampling rate in Hertz; 8000/12000/16000 */ opus_int32 minInternalSampleRate; /* I: Soft request for internal sampling rate in Hertz; 8000/12000/16000 */ opus_int32 desiredInternalSampleRate; /* I: Number of samples per packet in milliseconds; 10/20/40/60 */ opus_int payloadSize_ms; /* I: Bitrate during active speech in bits/second; internally limited */ opus_int32 bitRate; /* I: Uplink packet loss in percent (0-100) */ opus_int packetLossPercentage; /* I: Complexity mode; 0 is lowest, 10 is highest complexity */ opus_int complexity; /* I: Flag to enable in-band Forward Error Correction (FEC); 0/1 */ opus_int useInBandFEC; /* I: Flag to actually code in-band Forward Error Correction (FEC) in the current packet; 0/1 */ opus_int LBRR_coded; /* I: Flag to enable discontinuous transmission (DTX); 0/1 */ opus_int useDTX; /* I: Flag to use constant bitrate */ opus_int useCBR; /* I: Maximum number of bits allowed for the frame */ opus_int maxBits; /* I: Causes a smooth downmix to mono */ opus_int toMono; /* I: Opus encoder is allowing us to switch bandwidth */ opus_int opusCanSwitch; /* I: Make frames as independent as possible (but still use LPC) */ opus_int reducedDependency; /* O: Internal sampling rate used, in Hertz; 8000/12000/16000 */ opus_int32 internalSampleRate; /* O: Flag that bandwidth switching is allowed (because low voice activity) */ opus_int allowBandwidthSwitch; /* O: Flag that SILK runs in WB mode without variable LP filter (use for switching between WB/SWB/FB) */ opus_int inWBmodeWithoutVariableLP; /* O: Stereo width */ opus_int stereoWidth_Q14; /* O: Tells the Opus encoder we're ready to switch */ opus_int switchReady; /* O: SILK Signal type */ opus_int signalType; /* O: SILK offset (dithering) */ opus_int offset; } silk_EncControlStruct; /**************************************************************************/ /* Structure for controlling decoder operation and reading decoder status */ /**************************************************************************/ typedef struct { /* I: Number of channels; 1/2 */ opus_int32 nChannelsAPI; /* I: Number of channels; 1/2 */ opus_int32 nChannelsInternal; /* I: Output signal sampling rate in Hertz; 8000/12000/16000/24000/32000/44100/48000 */ opus_int32 API_sampleRate; /* I: Internal sampling rate used, in Hertz; 8000/12000/16000 */ opus_int32 internalSampleRate; /* I: Number of samples per packet in milliseconds; 10/20/40/60 */ opus_int payloadSize_ms; /* O: Pitch lag of previous frame (0 if unvoiced), measured in samples at 48 kHz */ opus_int prevPitchLag; } silk_DecControlStruct; #ifdef __cplusplus } #endif #endif mumble-1.3.4/3rdparty/opus-src/silk/resampler_private_up2_HQ.c0000664000175000017500000001236714010707327024205 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "SigProc_FIX.h" #include "resampler_private.h" /* Upsample by a factor 2, high quality */ /* Uses 2nd order allpass filters for the 2x upsampling, followed by a */ /* notch filter just above Nyquist. */ void silk_resampler_private_up2_HQ( opus_int32 *S, /* I/O Resampler state [ 6 ] */ opus_int16 *out, /* O Output signal [ 2 * len ] */ const opus_int16 *in, /* I Input signal [ len ] */ opus_int32 len /* I Number of input samples */ ) { opus_int32 k; opus_int32 in32, out32_1, out32_2, Y, X; silk_assert( silk_resampler_up2_hq_0[ 0 ] > 0 ); silk_assert( silk_resampler_up2_hq_0[ 1 ] > 0 ); silk_assert( silk_resampler_up2_hq_0[ 2 ] < 0 ); silk_assert( silk_resampler_up2_hq_1[ 0 ] > 0 ); silk_assert( silk_resampler_up2_hq_1[ 1 ] > 0 ); silk_assert( silk_resampler_up2_hq_1[ 2 ] < 0 ); /* Internal variables and state are in Q10 format */ for( k = 0; k < len; k++ ) { /* Convert to Q10 */ in32 = silk_LSHIFT( (opus_int32)in[ k ], 10 ); /* First all-pass section for even output sample */ Y = silk_SUB32( in32, S[ 0 ] ); X = silk_SMULWB( Y, silk_resampler_up2_hq_0[ 0 ] ); out32_1 = silk_ADD32( S[ 0 ], X ); S[ 0 ] = silk_ADD32( in32, X ); /* Second all-pass section for even output sample */ Y = silk_SUB32( out32_1, S[ 1 ] ); X = silk_SMULWB( Y, silk_resampler_up2_hq_0[ 1 ] ); out32_2 = silk_ADD32( S[ 1 ], X ); S[ 1 ] = silk_ADD32( out32_1, X ); /* Third all-pass section for even output sample */ Y = silk_SUB32( out32_2, S[ 2 ] ); X = silk_SMLAWB( Y, Y, silk_resampler_up2_hq_0[ 2 ] ); out32_1 = silk_ADD32( S[ 2 ], X ); S[ 2 ] = silk_ADD32( out32_2, X ); /* Apply gain in Q15, convert back to int16 and store to output */ out[ 2 * k ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( out32_1, 10 ) ); /* First all-pass section for odd output sample */ Y = silk_SUB32( in32, S[ 3 ] ); X = silk_SMULWB( Y, silk_resampler_up2_hq_1[ 0 ] ); out32_1 = silk_ADD32( S[ 3 ], X ); S[ 3 ] = silk_ADD32( in32, X ); /* Second all-pass section for odd output sample */ Y = silk_SUB32( out32_1, S[ 4 ] ); X = silk_SMULWB( Y, silk_resampler_up2_hq_1[ 1 ] ); out32_2 = silk_ADD32( S[ 4 ], X ); S[ 4 ] = silk_ADD32( out32_1, X ); /* Third all-pass section for odd output sample */ Y = silk_SUB32( out32_2, S[ 5 ] ); X = silk_SMLAWB( Y, Y, silk_resampler_up2_hq_1[ 2 ] ); out32_1 = silk_ADD32( S[ 5 ], X ); S[ 5 ] = silk_ADD32( out32_2, X ); /* Apply gain in Q15, convert back to int16 and store to output */ out[ 2 * k + 1 ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( out32_1, 10 ) ); } } void silk_resampler_private_up2_HQ_wrapper( void *SS, /* I/O Resampler state (unused) */ opus_int16 *out, /* O Output signal [ 2 * len ] */ const opus_int16 *in, /* I Input signal [ len ] */ opus_int32 len /* I Number of input samples */ ) { silk_resampler_state_struct *S = (silk_resampler_state_struct *)SS; silk_resampler_private_up2_HQ( S->sIIR, out, in, len ); } mumble-1.3.4/3rdparty/opus-src/silk/define.h0000664000175000017500000002275214010707327020541 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef SILK_DEFINE_H #define SILK_DEFINE_H #include "errors.h" #include "typedef.h" #ifdef __cplusplus extern "C" { #endif /* Max number of encoder channels (1/2) */ #define ENCODER_NUM_CHANNELS 2 /* Number of decoder channels (1/2) */ #define DECODER_NUM_CHANNELS 2 #define MAX_FRAMES_PER_PACKET 3 /* Limits on bitrate */ #define MIN_TARGET_RATE_BPS 5000 #define MAX_TARGET_RATE_BPS 80000 #define TARGET_RATE_TAB_SZ 8 /* LBRR thresholds */ #define LBRR_NB_MIN_RATE_BPS 12000 #define LBRR_MB_MIN_RATE_BPS 14000 #define LBRR_WB_MIN_RATE_BPS 16000 /* DTX settings */ #define NB_SPEECH_FRAMES_BEFORE_DTX 10 /* eq 200 ms */ #define MAX_CONSECUTIVE_DTX 20 /* eq 400 ms */ #define DTX_ACTIVITY_THRESHOLD 0.1f /* Maximum sampling frequency */ #define MAX_FS_KHZ 16 #define MAX_API_FS_KHZ 48 /* Signal types */ #define TYPE_NO_VOICE_ACTIVITY 0 #define TYPE_UNVOICED 1 #define TYPE_VOICED 2 /* Conditional coding types */ #define CODE_INDEPENDENTLY 0 #define CODE_INDEPENDENTLY_NO_LTP_SCALING 1 #define CODE_CONDITIONALLY 2 /* Settings for stereo processing */ #define STEREO_QUANT_TAB_SIZE 16 #define STEREO_QUANT_SUB_STEPS 5 #define STEREO_INTERP_LEN_MS 8 /* must be even */ #define STEREO_RATIO_SMOOTH_COEF 0.01 /* smoothing coef for signal norms and stereo width */ /* Range of pitch lag estimates */ #define PITCH_EST_MIN_LAG_MS 2 /* 2 ms -> 500 Hz */ #define PITCH_EST_MAX_LAG_MS 18 /* 18 ms -> 56 Hz */ /* Maximum number of subframes */ #define MAX_NB_SUBFR 4 /* Number of samples per frame */ #define LTP_MEM_LENGTH_MS 20 #define SUB_FRAME_LENGTH_MS 5 #define MAX_SUB_FRAME_LENGTH ( SUB_FRAME_LENGTH_MS * MAX_FS_KHZ ) #define MAX_FRAME_LENGTH_MS ( SUB_FRAME_LENGTH_MS * MAX_NB_SUBFR ) #define MAX_FRAME_LENGTH ( MAX_FRAME_LENGTH_MS * MAX_FS_KHZ ) /* Milliseconds of lookahead for pitch analysis */ #define LA_PITCH_MS 2 #define LA_PITCH_MAX ( LA_PITCH_MS * MAX_FS_KHZ ) /* Order of LPC used in find pitch */ #define MAX_FIND_PITCH_LPC_ORDER 16 /* Length of LPC window used in find pitch */ #define FIND_PITCH_LPC_WIN_MS ( 20 + (LA_PITCH_MS << 1) ) #define FIND_PITCH_LPC_WIN_MS_2_SF ( 10 + (LA_PITCH_MS << 1) ) #define FIND_PITCH_LPC_WIN_MAX ( FIND_PITCH_LPC_WIN_MS * MAX_FS_KHZ ) /* Milliseconds of lookahead for noise shape analysis */ #define LA_SHAPE_MS 5 #define LA_SHAPE_MAX ( LA_SHAPE_MS * MAX_FS_KHZ ) /* Maximum length of LPC window used in noise shape analysis */ #define SHAPE_LPC_WIN_MAX ( 15 * MAX_FS_KHZ ) /* dB level of lowest gain quantization level */ #define MIN_QGAIN_DB 2 /* dB level of highest gain quantization level */ #define MAX_QGAIN_DB 88 /* Number of gain quantization levels */ #define N_LEVELS_QGAIN 64 /* Max increase in gain quantization index */ #define MAX_DELTA_GAIN_QUANT 36 /* Max decrease in gain quantization index */ #define MIN_DELTA_GAIN_QUANT -4 /* Quantization offsets (multiples of 4) */ #define OFFSET_VL_Q10 32 #define OFFSET_VH_Q10 100 #define OFFSET_UVL_Q10 100 #define OFFSET_UVH_Q10 240 #define QUANT_LEVEL_ADJUST_Q10 80 /* Maximum numbers of iterations used to stabilize an LPC vector */ #define MAX_LPC_STABILIZE_ITERATIONS 16 #define MAX_PREDICTION_POWER_GAIN 1e4f #define MAX_PREDICTION_POWER_GAIN_AFTER_RESET 1e2f #define MAX_LPC_ORDER 16 #define MIN_LPC_ORDER 10 /* Find Pred Coef defines */ #define LTP_ORDER 5 /* LTP quantization settings */ #define NB_LTP_CBKS 3 /* Flag to use harmonic noise shaping */ #define USE_HARM_SHAPING 1 /* Max LPC order of noise shaping filters */ #define MAX_SHAPE_LPC_ORDER 24 #define HARM_SHAPE_FIR_TAPS 3 /* Maximum number of delayed decision states */ #define MAX_DEL_DEC_STATES 4 #define LTP_BUF_LENGTH 512 #define LTP_MASK ( LTP_BUF_LENGTH - 1 ) #define DECISION_DELAY 40 /* Number of subframes for excitation entropy coding */ #define SHELL_CODEC_FRAME_LENGTH 16 #define LOG2_SHELL_CODEC_FRAME_LENGTH 4 #define MAX_NB_SHELL_BLOCKS ( MAX_FRAME_LENGTH / SHELL_CODEC_FRAME_LENGTH ) /* Number of rate levels, for entropy coding of excitation */ #define N_RATE_LEVELS 10 /* Maximum sum of pulses per shell coding frame */ #define SILK_MAX_PULSES 16 #define MAX_MATRIX_SIZE MAX_LPC_ORDER /* Max of LPC Order and LTP order */ # define NSQ_LPC_BUF_LENGTH MAX_LPC_ORDER /***************************/ /* Voice activity detector */ /***************************/ #define VAD_N_BANDS 4 #define VAD_INTERNAL_SUBFRAMES_LOG2 2 #define VAD_INTERNAL_SUBFRAMES ( 1 << VAD_INTERNAL_SUBFRAMES_LOG2 ) #define VAD_NOISE_LEVEL_SMOOTH_COEF_Q16 1024 /* Must be < 4096 */ #define VAD_NOISE_LEVELS_BIAS 50 /* Sigmoid settings */ #define VAD_NEGATIVE_OFFSET_Q5 128 /* sigmoid is 0 at -128 */ #define VAD_SNR_FACTOR_Q16 45000 /* smoothing for SNR measurement */ #define VAD_SNR_SMOOTH_COEF_Q18 4096 /* Size of the piecewise linear cosine approximation table for the LSFs */ #define LSF_COS_TAB_SZ_FIX 128 /******************/ /* NLSF quantizer */ /******************/ #define NLSF_W_Q 2 #define NLSF_VQ_MAX_VECTORS 32 #define NLSF_QUANT_MAX_AMPLITUDE 4 #define NLSF_QUANT_MAX_AMPLITUDE_EXT 10 #define NLSF_QUANT_LEVEL_ADJ 0.1 #define NLSF_QUANT_DEL_DEC_STATES_LOG2 2 #define NLSF_QUANT_DEL_DEC_STATES ( 1 << NLSF_QUANT_DEL_DEC_STATES_LOG2 ) /* Transition filtering for mode switching */ #define TRANSITION_TIME_MS 5120 /* 5120 = 64 * FRAME_LENGTH_MS * ( TRANSITION_INT_NUM - 1 ) = 64*(20*4)*/ #define TRANSITION_NB 3 /* Hardcoded in tables */ #define TRANSITION_NA 2 /* Hardcoded in tables */ #define TRANSITION_INT_NUM 5 /* Hardcoded in tables */ #define TRANSITION_FRAMES ( TRANSITION_TIME_MS / MAX_FRAME_LENGTH_MS ) #define TRANSITION_INT_STEPS ( TRANSITION_FRAMES / ( TRANSITION_INT_NUM - 1 ) ) /* BWE factors to apply after packet loss */ #define BWE_AFTER_LOSS_Q16 63570 /* Defines for CN generation */ #define CNG_BUF_MASK_MAX 255 /* 2^floor(log2(MAX_FRAME_LENGTH))-1 */ #define CNG_GAIN_SMTH_Q16 4634 /* 0.25^(1/4) */ #define CNG_NLSF_SMTH_Q16 16348 /* 0.25 */ #ifdef __cplusplus } #endif #endif mumble-1.3.4/3rdparty/opus-src/silk/tables_pulses_per_block.c0000664000175000017500000002623714010707327024171 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "tables.h" const opus_uint8 silk_max_pulses_table[ 4 ] = { 8, 10, 12, 16 }; const opus_uint8 silk_pulses_per_block_iCDF[ 10 ][ 18 ] = { { 125, 51, 26, 18, 15, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }, { 198, 105, 45, 22, 15, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }, { 213, 162, 116, 83, 59, 43, 32, 24, 18, 15, 12, 9, 7, 6, 5, 3, 2, 0 }, { 239, 187, 116, 59, 28, 16, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }, { 250, 229, 188, 135, 86, 51, 30, 19, 13, 10, 8, 6, 5, 4, 3, 2, 1, 0 }, { 249, 235, 213, 185, 156, 128, 103, 83, 66, 53, 42, 33, 26, 21, 17, 13, 10, 0 }, { 254, 249, 235, 206, 164, 118, 77, 46, 27, 16, 10, 7, 5, 4, 3, 2, 1, 0 }, { 255, 253, 249, 239, 220, 191, 156, 119, 85, 57, 37, 23, 15, 10, 6, 4, 2, 0 }, { 255, 253, 251, 246, 237, 223, 203, 179, 152, 124, 98, 75, 55, 40, 29, 21, 15, 0 }, { 255, 254, 253, 247, 220, 162, 106, 67, 42, 28, 18, 12, 9, 6, 4, 3, 2, 0 } }; const opus_uint8 silk_pulses_per_block_BITS_Q5[ 9 ][ 18 ] = { { 31, 57, 107, 160, 205, 205, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 69, 47, 67, 111, 166, 205, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 82, 74, 79, 95, 109, 128, 145, 160, 173, 205, 205, 205, 224, 255, 255, 224, 255, 224 }, { 125, 74, 59, 69, 97, 141, 182, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 173, 115, 85, 73, 76, 92, 115, 145, 173, 205, 224, 224, 255, 255, 255, 255, 255, 255 }, { 166, 134, 113, 102, 101, 102, 107, 118, 125, 138, 145, 155, 166, 182, 192, 192, 205, 150 }, { 224, 182, 134, 101, 83, 79, 85, 97, 120, 145, 173, 205, 224, 255, 255, 255, 255, 255 }, { 255, 224, 192, 150, 120, 101, 92, 89, 93, 102, 118, 134, 160, 182, 192, 224, 224, 224 }, { 255, 224, 224, 182, 155, 134, 118, 109, 104, 102, 106, 111, 118, 131, 145, 160, 173, 131 } }; const opus_uint8 silk_rate_levels_iCDF[ 2 ][ 9 ] = { { 241, 190, 178, 132, 87, 74, 41, 14, 0 }, { 223, 193, 157, 140, 106, 57, 39, 18, 0 } }; const opus_uint8 silk_rate_levels_BITS_Q5[ 2 ][ 9 ] = { { 131, 74, 141, 79, 80, 138, 95, 104, 134 }, { 95, 99, 91, 125, 93, 76, 123, 115, 123 } }; const opus_uint8 silk_shell_code_table0[ 152 ] = { 128, 0, 214, 42, 0, 235, 128, 21, 0, 244, 184, 72, 11, 0, 248, 214, 128, 42, 7, 0, 248, 225, 170, 80, 25, 5, 0, 251, 236, 198, 126, 54, 18, 3, 0, 250, 238, 211, 159, 82, 35, 15, 5, 0, 250, 231, 203, 168, 128, 88, 53, 25, 6, 0, 252, 238, 216, 185, 148, 108, 71, 40, 18, 4, 0, 253, 243, 225, 199, 166, 128, 90, 57, 31, 13, 3, 0, 254, 246, 233, 212, 183, 147, 109, 73, 44, 23, 10, 2, 0, 255, 250, 240, 223, 198, 166, 128, 90, 58, 33, 16, 6, 1, 0, 255, 251, 244, 231, 210, 181, 146, 110, 75, 46, 25, 12, 5, 1, 0, 255, 253, 248, 238, 221, 196, 164, 128, 92, 60, 35, 18, 8, 3, 1, 0, 255, 253, 249, 242, 229, 208, 180, 146, 110, 76, 48, 27, 14, 7, 3, 1, 0 }; const opus_uint8 silk_shell_code_table1[ 152 ] = { 129, 0, 207, 50, 0, 236, 129, 20, 0, 245, 185, 72, 10, 0, 249, 213, 129, 42, 6, 0, 250, 226, 169, 87, 27, 4, 0, 251, 233, 194, 130, 62, 20, 4, 0, 250, 236, 207, 160, 99, 47, 17, 3, 0, 255, 240, 217, 182, 131, 81, 41, 11, 1, 0, 255, 254, 233, 201, 159, 107, 61, 20, 2, 1, 0, 255, 249, 233, 206, 170, 128, 86, 50, 23, 7, 1, 0, 255, 250, 238, 217, 186, 148, 108, 70, 39, 18, 6, 1, 0, 255, 252, 243, 226, 200, 166, 128, 90, 56, 30, 13, 4, 1, 0, 255, 252, 245, 231, 209, 180, 146, 110, 76, 47, 25, 11, 4, 1, 0, 255, 253, 248, 237, 219, 194, 163, 128, 93, 62, 37, 19, 8, 3, 1, 0, 255, 254, 250, 241, 226, 205, 177, 145, 111, 79, 51, 30, 15, 6, 2, 1, 0 }; const opus_uint8 silk_shell_code_table2[ 152 ] = { 129, 0, 203, 54, 0, 234, 129, 23, 0, 245, 184, 73, 10, 0, 250, 215, 129, 41, 5, 0, 252, 232, 173, 86, 24, 3, 0, 253, 240, 200, 129, 56, 15, 2, 0, 253, 244, 217, 164, 94, 38, 10, 1, 0, 253, 245, 226, 189, 132, 71, 27, 7, 1, 0, 253, 246, 231, 203, 159, 105, 56, 23, 6, 1, 0, 255, 248, 235, 213, 179, 133, 85, 47, 19, 5, 1, 0, 255, 254, 243, 221, 194, 159, 117, 70, 37, 12, 2, 1, 0, 255, 254, 248, 234, 208, 171, 128, 85, 48, 22, 8, 2, 1, 0, 255, 254, 250, 240, 220, 189, 149, 107, 67, 36, 16, 6, 2, 1, 0, 255, 254, 251, 243, 227, 201, 166, 128, 90, 55, 29, 13, 5, 2, 1, 0, 255, 254, 252, 246, 234, 213, 183, 147, 109, 73, 43, 22, 10, 4, 2, 1, 0 }; const opus_uint8 silk_shell_code_table3[ 152 ] = { 130, 0, 200, 58, 0, 231, 130, 26, 0, 244, 184, 76, 12, 0, 249, 214, 130, 43, 6, 0, 252, 232, 173, 87, 24, 3, 0, 253, 241, 203, 131, 56, 14, 2, 0, 254, 246, 221, 167, 94, 35, 8, 1, 0, 254, 249, 232, 193, 130, 65, 23, 5, 1, 0, 255, 251, 239, 211, 162, 99, 45, 15, 4, 1, 0, 255, 251, 243, 223, 186, 131, 74, 33, 11, 3, 1, 0, 255, 252, 245, 230, 202, 158, 105, 57, 24, 8, 2, 1, 0, 255, 253, 247, 235, 214, 179, 132, 84, 44, 19, 7, 2, 1, 0, 255, 254, 250, 240, 223, 196, 159, 112, 69, 36, 15, 6, 2, 1, 0, 255, 254, 253, 245, 231, 209, 176, 136, 93, 55, 27, 11, 3, 2, 1, 0, 255, 254, 253, 252, 239, 221, 194, 158, 117, 76, 42, 18, 4, 3, 2, 1, 0 }; const opus_uint8 silk_shell_code_table_offsets[ 17 ] = { 0, 0, 2, 5, 9, 14, 20, 27, 35, 44, 54, 65, 77, 90, 104, 119, 135 }; const opus_uint8 silk_sign_iCDF[ 42 ] = { 254, 49, 67, 77, 82, 93, 99, 198, 11, 18, 24, 31, 36, 45, 255, 46, 66, 78, 87, 94, 104, 208, 14, 21, 32, 42, 51, 66, 255, 94, 104, 109, 112, 115, 118, 248, 53, 69, 80, 88, 95, 102 }; mumble-1.3.4/3rdparty/opus-src/silk/init_encoder.c0000664000175000017500000000547514010707327021747 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef FIXED_POINT #include "main_FIX.h" #else #include "main_FLP.h" #endif #include "tuning_parameters.h" #include "cpu_support.h" /*********************************/ /* Initialize Silk Encoder state */ /*********************************/ opus_int silk_init_encoder( silk_encoder_state_Fxx *psEnc, /* I/O Pointer to Silk FIX encoder state */ int arch /* I Run-time architecture */ ) { opus_int ret = 0; /* Clear the entire encoder state */ silk_memset( psEnc, 0, sizeof( silk_encoder_state_Fxx ) ); psEnc->sCmn.arch = arch; psEnc->sCmn.variable_HP_smth1_Q15 = silk_LSHIFT( silk_lin2log( SILK_FIX_CONST( VARIABLE_HP_MIN_CUTOFF_HZ, 16 ) ) - ( 16 << 7 ), 8 ); psEnc->sCmn.variable_HP_smth2_Q15 = psEnc->sCmn.variable_HP_smth1_Q15; /* Used to deactivate LSF interpolation, pitch prediction */ psEnc->sCmn.first_frame_after_reset = 1; /* Initialize Silk VAD */ ret += silk_VAD_Init( &psEnc->sCmn.sVAD ); return ret; } mumble-1.3.4/3rdparty/opus-src/silk/tables_gain.c0000664000175000017500000000472714010707327021554 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "tables.h" #ifdef __cplusplus extern "C" { #endif const opus_uint8 silk_gain_iCDF[ 3 ][ N_LEVELS_QGAIN / 8 ] = { { 224, 112, 44, 15, 3, 2, 1, 0 }, { 254, 237, 192, 132, 70, 23, 4, 0 }, { 255, 252, 226, 155, 61, 11, 2, 0 } }; const opus_uint8 silk_delta_gain_iCDF[ MAX_DELTA_GAIN_QUANT - MIN_DELTA_GAIN_QUANT + 1 ] = { 250, 245, 234, 203, 71, 50, 42, 38, 35, 33, 31, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }; #ifdef __cplusplus } #endif mumble-1.3.4/3rdparty/opus-src/silk/stereo_quant_pred.c0000664000175000017500000000651414010707327023023 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main.h" /* Quantize mid/side predictors */ void silk_stereo_quant_pred( opus_int32 pred_Q13[], /* I/O Predictors (out: quantized) */ opus_int8 ix[ 2 ][ 3 ] /* O Quantization indices */ ) { opus_int i, j, n; opus_int32 low_Q13, step_Q13, lvl_Q13, err_min_Q13, err_Q13, quant_pred_Q13 = 0; /* Quantize */ for( n = 0; n < 2; n++ ) { /* Brute-force search over quantization levels */ err_min_Q13 = silk_int32_MAX; for( i = 0; i < STEREO_QUANT_TAB_SIZE - 1; i++ ) { low_Q13 = silk_stereo_pred_quant_Q13[ i ]; step_Q13 = silk_SMULWB( silk_stereo_pred_quant_Q13[ i + 1 ] - low_Q13, SILK_FIX_CONST( 0.5 / STEREO_QUANT_SUB_STEPS, 16 ) ); for( j = 0; j < STEREO_QUANT_SUB_STEPS; j++ ) { lvl_Q13 = silk_SMLABB( low_Q13, step_Q13, 2 * j + 1 ); err_Q13 = silk_abs( pred_Q13[ n ] - lvl_Q13 ); if( err_Q13 < err_min_Q13 ) { err_min_Q13 = err_Q13; quant_pred_Q13 = lvl_Q13; ix[ n ][ 0 ] = i; ix[ n ][ 1 ] = j; } else { /* Error increasing, so we're past the optimum */ goto done; } } } done: ix[ n ][ 2 ] = silk_DIV32_16( ix[ n ][ 0 ], 3 ); ix[ n ][ 0 ] -= ix[ n ][ 2 ] * 3; pred_Q13[ n ] = quant_pred_Q13; } /* Subtract second from first predictor (helps when actually applying these) */ pred_Q13[ 0 ] -= pred_Q13[ 1 ]; } mumble-1.3.4/3rdparty/opus-src/silk/API.h0000664000175000017500000001600714010707327017714 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef SILK_API_H #define SILK_API_H #include "control.h" #include "typedef.h" #include "errors.h" #include "entenc.h" #include "entdec.h" #ifdef __cplusplus extern "C" { #endif #define SILK_MAX_FRAMES_PER_PACKET 3 /* Struct for TOC (Table of Contents) */ typedef struct { opus_int VADFlag; /* Voice activity for packet */ opus_int VADFlags[ SILK_MAX_FRAMES_PER_PACKET ]; /* Voice activity for each frame in packet */ opus_int inbandFECFlag; /* Flag indicating if packet contains in-band FEC */ } silk_TOC_struct; /****************************************/ /* Encoder functions */ /****************************************/ /***********************************************/ /* Get size in bytes of the Silk encoder state */ /***********************************************/ opus_int silk_Get_Encoder_Size( /* O Returns error code */ opus_int *encSizeBytes /* O Number of bytes in SILK encoder state */ ); /*************************/ /* Init or reset encoder */ /*************************/ opus_int silk_InitEncoder( /* O Returns error code */ void *encState, /* I/O State */ int arch, /* I Run-time architecture */ silk_EncControlStruct *encStatus /* O Encoder Status */ ); /**************************/ /* Encode frame with Silk */ /**************************/ /* Note: if prefillFlag is set, the input must contain 10 ms of audio, irrespective of what */ /* encControl->payloadSize_ms is set to */ opus_int silk_Encode( /* O Returns error code */ void *encState, /* I/O State */ silk_EncControlStruct *encControl, /* I Control status */ const opus_int16 *samplesIn, /* I Speech sample input vector */ opus_int nSamplesIn, /* I Number of samples in input vector */ ec_enc *psRangeEnc, /* I/O Compressor data structure */ opus_int32 *nBytesOut, /* I/O Number of bytes in payload (input: Max bytes) */ const opus_int prefillFlag /* I Flag to indicate prefilling buffers no coding */ ); /****************************************/ /* Decoder functions */ /****************************************/ /***********************************************/ /* Get size in bytes of the Silk decoder state */ /***********************************************/ opus_int silk_Get_Decoder_Size( /* O Returns error code */ opus_int *decSizeBytes /* O Number of bytes in SILK decoder state */ ); /*************************/ /* Init or Reset decoder */ /*************************/ opus_int silk_InitDecoder( /* O Returns error code */ void *decState /* I/O State */ ); /******************/ /* Decode a frame */ /******************/ opus_int silk_Decode( /* O Returns error code */ void* decState, /* I/O State */ silk_DecControlStruct* decControl, /* I/O Control Structure */ opus_int lostFlag, /* I 0: no loss, 1 loss, 2 decode fec */ opus_int newPacketFlag, /* I Indicates first decoder call for this packet */ ec_dec *psRangeDec, /* I/O Compressor data structure */ opus_int16 *samplesOut, /* O Decoded output speech vector */ opus_int32 *nSamplesOut, /* O Number of samples decoded */ int arch /* I Run-time architecture */ ); #if 0 /**************************************/ /* Get table of contents for a packet */ /**************************************/ opus_int silk_get_TOC( const opus_uint8 *payload, /* I Payload data */ const opus_int nBytesIn, /* I Number of input bytes */ const opus_int nFramesPerPayload, /* I Number of SILK frames per payload */ silk_TOC_struct *Silk_TOC /* O Type of content */ ); #endif #ifdef __cplusplus } #endif #endif mumble-1.3.4/3rdparty/opus-src/silk/A2NLSF.c0000664000175000017500000002500714010707327020223 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ /* Conversion between prediction filter coefficients and NLSFs */ /* Requires the order to be an even number */ /* A piecewise linear approximation maps LSF <-> cos(LSF) */ /* Therefore the result is not accurate NLSFs, but the two */ /* functions are accurate inverses of each other */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "SigProc_FIX.h" #include "tables.h" /* Number of binary divisions, when not in low complexity mode */ #define BIN_DIV_STEPS_A2NLSF_FIX 3 /* must be no higher than 16 - log2( LSF_COS_TAB_SZ_FIX ) */ #define MAX_ITERATIONS_A2NLSF_FIX 16 /* Helper function for A2NLSF(..) */ /* Transforms polynomials from cos(n*f) to cos(f)^n */ static OPUS_INLINE void silk_A2NLSF_trans_poly( opus_int32 *p, /* I/O Polynomial */ const opus_int dd /* I Polynomial order (= filter order / 2 ) */ ) { opus_int k, n; for( k = 2; k <= dd; k++ ) { for( n = dd; n > k; n-- ) { p[ n - 2 ] -= p[ n ]; } p[ k - 2 ] -= silk_LSHIFT( p[ k ], 1 ); } } /* Helper function for A2NLSF(..) */ /* Polynomial evaluation */ static OPUS_INLINE opus_int32 silk_A2NLSF_eval_poly( /* return the polynomial evaluation, in Q16 */ opus_int32 *p, /* I Polynomial, Q16 */ const opus_int32 x, /* I Evaluation point, Q12 */ const opus_int dd /* I Order */ ) { opus_int n; opus_int32 x_Q16, y32; y32 = p[ dd ]; /* Q16 */ x_Q16 = silk_LSHIFT( x, 4 ); if ( opus_likely( 8 == dd ) ) { y32 = silk_SMLAWW( p[ 7 ], y32, x_Q16 ); y32 = silk_SMLAWW( p[ 6 ], y32, x_Q16 ); y32 = silk_SMLAWW( p[ 5 ], y32, x_Q16 ); y32 = silk_SMLAWW( p[ 4 ], y32, x_Q16 ); y32 = silk_SMLAWW( p[ 3 ], y32, x_Q16 ); y32 = silk_SMLAWW( p[ 2 ], y32, x_Q16 ); y32 = silk_SMLAWW( p[ 1 ], y32, x_Q16 ); y32 = silk_SMLAWW( p[ 0 ], y32, x_Q16 ); } else { for( n = dd - 1; n >= 0; n-- ) { y32 = silk_SMLAWW( p[ n ], y32, x_Q16 ); /* Q16 */ } } return y32; } static OPUS_INLINE void silk_A2NLSF_init( const opus_int32 *a_Q16, opus_int32 *P, opus_int32 *Q, const opus_int dd ) { opus_int k; /* Convert filter coefs to even and odd polynomials */ P[dd] = silk_LSHIFT( 1, 16 ); Q[dd] = silk_LSHIFT( 1, 16 ); for( k = 0; k < dd; k++ ) { P[ k ] = -a_Q16[ dd - k - 1 ] - a_Q16[ dd + k ]; /* Q16 */ Q[ k ] = -a_Q16[ dd - k - 1 ] + a_Q16[ dd + k ]; /* Q16 */ } /* Divide out zeros as we have that for even filter orders, */ /* z = 1 is always a root in Q, and */ /* z = -1 is always a root in P */ for( k = dd; k > 0; k-- ) { P[ k - 1 ] -= P[ k ]; Q[ k - 1 ] += Q[ k ]; } /* Transform polynomials from cos(n*f) to cos(f)^n */ silk_A2NLSF_trans_poly( P, dd ); silk_A2NLSF_trans_poly( Q, dd ); } /* Compute Normalized Line Spectral Frequencies (NLSFs) from whitening filter coefficients */ /* If not all roots are found, the a_Q16 coefficients are bandwidth expanded until convergence. */ void silk_A2NLSF( opus_int16 *NLSF, /* O Normalized Line Spectral Frequencies in Q15 (0..2^15-1) [d] */ opus_int32 *a_Q16, /* I/O Monic whitening filter coefficients in Q16 [d] */ const opus_int d /* I Filter order (must be even) */ ) { opus_int i, k, m, dd, root_ix, ffrac; opus_int32 xlo, xhi, xmid; opus_int32 ylo, yhi, ymid, thr; opus_int32 nom, den; opus_int32 P[ SILK_MAX_ORDER_LPC / 2 + 1 ]; opus_int32 Q[ SILK_MAX_ORDER_LPC / 2 + 1 ]; opus_int32 *PQ[ 2 ]; opus_int32 *p; /* Store pointers to array */ PQ[ 0 ] = P; PQ[ 1 ] = Q; dd = silk_RSHIFT( d, 1 ); silk_A2NLSF_init( a_Q16, P, Q, dd ); /* Find roots, alternating between P and Q */ p = P; /* Pointer to polynomial */ xlo = silk_LSFCosTab_FIX_Q12[ 0 ]; /* Q12*/ ylo = silk_A2NLSF_eval_poly( p, xlo, dd ); if( ylo < 0 ) { /* Set the first NLSF to zero and move on to the next */ NLSF[ 0 ] = 0; p = Q; /* Pointer to polynomial */ ylo = silk_A2NLSF_eval_poly( p, xlo, dd ); root_ix = 1; /* Index of current root */ } else { root_ix = 0; /* Index of current root */ } k = 1; /* Loop counter */ i = 0; /* Counter for bandwidth expansions applied */ thr = 0; while( 1 ) { /* Evaluate polynomial */ xhi = silk_LSFCosTab_FIX_Q12[ k ]; /* Q12 */ yhi = silk_A2NLSF_eval_poly( p, xhi, dd ); /* Detect zero crossing */ if( ( ylo <= 0 && yhi >= thr ) || ( ylo >= 0 && yhi <= -thr ) ) { if( yhi == 0 ) { /* If the root lies exactly at the end of the current */ /* interval, look for the next root in the next interval */ thr = 1; } else { thr = 0; } /* Binary division */ ffrac = -256; for( m = 0; m < BIN_DIV_STEPS_A2NLSF_FIX; m++ ) { /* Evaluate polynomial */ xmid = silk_RSHIFT_ROUND( xlo + xhi, 1 ); ymid = silk_A2NLSF_eval_poly( p, xmid, dd ); /* Detect zero crossing */ if( ( ylo <= 0 && ymid >= 0 ) || ( ylo >= 0 && ymid <= 0 ) ) { /* Reduce frequency */ xhi = xmid; yhi = ymid; } else { /* Increase frequency */ xlo = xmid; ylo = ymid; ffrac = silk_ADD_RSHIFT( ffrac, 128, m ); } } /* Interpolate */ if( silk_abs( ylo ) < 65536 ) { /* Avoid dividing by zero */ den = ylo - yhi; nom = silk_LSHIFT( ylo, 8 - BIN_DIV_STEPS_A2NLSF_FIX ) + silk_RSHIFT( den, 1 ); if( den != 0 ) { ffrac += silk_DIV32( nom, den ); } } else { /* No risk of dividing by zero because abs(ylo - yhi) >= abs(ylo) >= 65536 */ ffrac += silk_DIV32( ylo, silk_RSHIFT( ylo - yhi, 8 - BIN_DIV_STEPS_A2NLSF_FIX ) ); } NLSF[ root_ix ] = (opus_int16)silk_min_32( silk_LSHIFT( (opus_int32)k, 8 ) + ffrac, silk_int16_MAX ); silk_assert( NLSF[ root_ix ] >= 0 ); root_ix++; /* Next root */ if( root_ix >= d ) { /* Found all roots */ break; } /* Alternate pointer to polynomial */ p = PQ[ root_ix & 1 ]; /* Evaluate polynomial */ xlo = silk_LSFCosTab_FIX_Q12[ k - 1 ]; /* Q12*/ ylo = silk_LSHIFT( 1 - ( root_ix & 2 ), 12 ); } else { /* Increment loop counter */ k++; xlo = xhi; ylo = yhi; thr = 0; if( k > LSF_COS_TAB_SZ_FIX ) { i++; if( i > MAX_ITERATIONS_A2NLSF_FIX ) { /* Set NLSFs to white spectrum and exit */ NLSF[ 0 ] = (opus_int16)silk_DIV32_16( 1 << 15, d + 1 ); for( k = 1; k < d; k++ ) { NLSF[ k ] = (opus_int16)silk_ADD16( NLSF[ k-1 ], NLSF[ 0 ] ); } return; } /* Error: Apply progressively more bandwidth expansion and run again */ silk_bwexpander_32( a_Q16, d, 65536 - silk_LSHIFT( 1, i ) ); silk_A2NLSF_init( a_Q16, P, Q, dd ); p = P; /* Pointer to polynomial */ xlo = silk_LSFCosTab_FIX_Q12[ 0 ]; /* Q12*/ ylo = silk_A2NLSF_eval_poly( p, xlo, dd ); if( ylo < 0 ) { /* Set the first NLSF to zero and move on to the next */ NLSF[ 0 ] = 0; p = Q; /* Pointer to polynomial */ ylo = silk_A2NLSF_eval_poly( p, xlo, dd ); root_ix = 1; /* Index of current root */ } else { root_ix = 0; /* Index of current root */ } k = 1; /* Reset loop counter */ } } } } mumble-1.3.4/3rdparty/opus-src/silk/NLSF2A.c0000664000175000017500000001433214010707327020222 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif /* conversion between prediction filter coefficients and LSFs */ /* order should be even */ /* a piecewise linear approximation maps LSF <-> cos(LSF) */ /* therefore the result is not accurate LSFs, but the two */ /* functions are accurate inverses of each other */ #include "SigProc_FIX.h" #include "tables.h" #define QA 16 /* helper function for NLSF2A(..) */ static OPUS_INLINE void silk_NLSF2A_find_poly( opus_int32 *out, /* O intermediate polynomial, QA [dd+1] */ const opus_int32 *cLSF, /* I vector of interleaved 2*cos(LSFs), QA [d] */ opus_int dd /* I polynomial order (= 1/2 * filter order) */ ) { opus_int k, n; opus_int32 ftmp; out[0] = silk_LSHIFT( 1, QA ); out[1] = -cLSF[0]; for( k = 1; k < dd; k++ ) { ftmp = cLSF[2*k]; /* QA*/ out[k+1] = silk_LSHIFT( out[k-1], 1 ) - (opus_int32)silk_RSHIFT_ROUND64( silk_SMULL( ftmp, out[k] ), QA ); for( n = k; n > 1; n-- ) { out[n] += out[n-2] - (opus_int32)silk_RSHIFT_ROUND64( silk_SMULL( ftmp, out[n-1] ), QA ); } out[1] -= ftmp; } } /* compute whitening filter coefficients from normalized line spectral frequencies */ void silk_NLSF2A( opus_int16 *a_Q12, /* O monic whitening filter coefficients in Q12, [ d ] */ const opus_int16 *NLSF, /* I normalized line spectral frequencies in Q15, [ d ] */ const opus_int d, /* I filter order (should be even) */ int arch /* I Run-time architecture */ ) { /* This ordering was found to maximize quality. It improves numerical accuracy of silk_NLSF2A_find_poly() compared to "standard" ordering. */ static const unsigned char ordering16[16] = { 0, 15, 8, 7, 4, 11, 12, 3, 2, 13, 10, 5, 6, 9, 14, 1 }; static const unsigned char ordering10[10] = { 0, 9, 6, 3, 4, 5, 8, 1, 2, 7 }; const unsigned char *ordering; opus_int k, i, dd; opus_int32 cos_LSF_QA[ SILK_MAX_ORDER_LPC ]; opus_int32 P[ SILK_MAX_ORDER_LPC / 2 + 1 ], Q[ SILK_MAX_ORDER_LPC / 2 + 1 ]; opus_int32 Ptmp, Qtmp, f_int, f_frac, cos_val, delta; opus_int32 a32_QA1[ SILK_MAX_ORDER_LPC ]; silk_assert( LSF_COS_TAB_SZ_FIX == 128 ); silk_assert( d==10 || d==16 ); /* convert LSFs to 2*cos(LSF), using piecewise linear curve from table */ ordering = d == 16 ? ordering16 : ordering10; for( k = 0; k < d; k++ ) { silk_assert( NLSF[k] >= 0 ); /* f_int on a scale 0-127 (rounded down) */ f_int = silk_RSHIFT( NLSF[k], 15 - 7 ); /* f_frac, range: 0..255 */ f_frac = NLSF[k] - silk_LSHIFT( f_int, 15 - 7 ); silk_assert(f_int >= 0); silk_assert(f_int < LSF_COS_TAB_SZ_FIX ); /* Read start and end value from table */ cos_val = silk_LSFCosTab_FIX_Q12[ f_int ]; /* Q12 */ delta = silk_LSFCosTab_FIX_Q12[ f_int + 1 ] - cos_val; /* Q12, with a range of 0..200 */ /* Linear interpolation */ cos_LSF_QA[ordering[k]] = silk_RSHIFT_ROUND( silk_LSHIFT( cos_val, 8 ) + silk_MUL( delta, f_frac ), 20 - QA ); /* QA */ } dd = silk_RSHIFT( d, 1 ); /* generate even and odd polynomials using convolution */ silk_NLSF2A_find_poly( P, &cos_LSF_QA[ 0 ], dd ); silk_NLSF2A_find_poly( Q, &cos_LSF_QA[ 1 ], dd ); /* convert even and odd polynomials to opus_int32 Q12 filter coefs */ for( k = 0; k < dd; k++ ) { Ptmp = P[ k+1 ] + P[ k ]; Qtmp = Q[ k+1 ] - Q[ k ]; /* the Ptmp and Qtmp values at this stage need to fit in int32 */ a32_QA1[ k ] = -Qtmp - Ptmp; /* QA+1 */ a32_QA1[ d-k-1 ] = Qtmp - Ptmp; /* QA+1 */ } /* Convert int32 coefficients to Q12 int16 coefs */ silk_LPC_fit( a_Q12, a32_QA1, 12, QA + 1, d ); for( i = 0; silk_LPC_inverse_pred_gain( a_Q12, d, arch ) == 0 && i < MAX_LPC_STABILIZE_ITERATIONS; i++ ) { /* Prediction coefficients are (too close to) unstable; apply bandwidth expansion */ /* on the unscaled coefficients, convert to Q12 and measure again */ silk_bwexpander_32( a32_QA1, d, 65536 - silk_LSHIFT( 2, i ) ); for( k = 0; k < d; k++ ) { a_Q12[ k ] = (opus_int16)silk_RSHIFT_ROUND( a32_QA1[ k ], QA + 1 - 12 ); /* QA+1 -> Q12 */ } } } mumble-1.3.4/3rdparty/opus-src/silk/arm/0000775000175000017500000000000014010707327017705 5ustar builderbuildermumble-1.3.4/3rdparty/opus-src/silk/arm/NSQ_neon.h0000664000175000017500000001157714010707327021551 0ustar builderbuilder/*********************************************************************** Copyright (C) 2014 Vidyo Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef SILK_NSQ_NEON_H #define SILK_NSQ_NEON_H #include "cpu_support.h" #include "SigProc_FIX.h" #undef silk_short_prediction_create_arch_coef /* For vectorized calc, reverse a_Q12 coefs, convert to 32-bit, and shift for vqdmulhq_s32. */ static OPUS_INLINE void silk_short_prediction_create_arch_coef_neon(opus_int32 *out, const opus_int16 *in, opus_int order) { out[15] = silk_LSHIFT32(in[0], 15); out[14] = silk_LSHIFT32(in[1], 15); out[13] = silk_LSHIFT32(in[2], 15); out[12] = silk_LSHIFT32(in[3], 15); out[11] = silk_LSHIFT32(in[4], 15); out[10] = silk_LSHIFT32(in[5], 15); out[9] = silk_LSHIFT32(in[6], 15); out[8] = silk_LSHIFT32(in[7], 15); out[7] = silk_LSHIFT32(in[8], 15); out[6] = silk_LSHIFT32(in[9], 15); if (order == 16) { out[5] = silk_LSHIFT32(in[10], 15); out[4] = silk_LSHIFT32(in[11], 15); out[3] = silk_LSHIFT32(in[12], 15); out[2] = silk_LSHIFT32(in[13], 15); out[1] = silk_LSHIFT32(in[14], 15); out[0] = silk_LSHIFT32(in[15], 15); } else { out[5] = 0; out[4] = 0; out[3] = 0; out[2] = 0; out[1] = 0; out[0] = 0; } } #if defined(OPUS_ARM_PRESUME_NEON_INTR) #define silk_short_prediction_create_arch_coef(out, in, order) \ (silk_short_prediction_create_arch_coef_neon(out, in, order)) #elif defined(OPUS_HAVE_RTCD) && defined(OPUS_ARM_MAY_HAVE_NEON_INTR) #define silk_short_prediction_create_arch_coef(out, in, order) \ do { if (arch == OPUS_ARCH_ARM_NEON) { silk_short_prediction_create_arch_coef_neon(out, in, order); } } while (0) #endif opus_int32 silk_noise_shape_quantizer_short_prediction_neon(const opus_int32 *buf32, const opus_int32 *coef32, opus_int order); opus_int32 silk_NSQ_noise_shape_feedback_loop_neon(const opus_int32 *data0, opus_int32 *data1, const opus_int16 *coef, opus_int order); #if defined(OPUS_ARM_PRESUME_NEON_INTR) #undef silk_noise_shape_quantizer_short_prediction #define silk_noise_shape_quantizer_short_prediction(in, coef, coefRev, order, arch) \ ((void)arch,silk_noise_shape_quantizer_short_prediction_neon(in, coefRev, order)) #undef silk_NSQ_noise_shape_feedback_loop #define silk_NSQ_noise_shape_feedback_loop(data0, data1, coef, order, arch) ((void)arch,silk_NSQ_noise_shape_feedback_loop_neon(data0, data1, coef, order)) #elif defined(OPUS_HAVE_RTCD) && defined(OPUS_ARM_MAY_HAVE_NEON_INTR) /* silk_noise_shape_quantizer_short_prediction implementations take different parameters based on arch (coef vs. coefRev) so can't use the usual IMPL table implementation */ #undef silk_noise_shape_quantizer_short_prediction #define silk_noise_shape_quantizer_short_prediction(in, coef, coefRev, order, arch) \ (arch == OPUS_ARCH_ARM_NEON ? \ silk_noise_shape_quantizer_short_prediction_neon(in, coefRev, order) : \ silk_noise_shape_quantizer_short_prediction_c(in, coef, order)) extern opus_int32 (*const SILK_NSQ_NOISE_SHAPE_FEEDBACK_LOOP_IMPL[OPUS_ARCHMASK+1])( const opus_int32 *data0, opus_int32 *data1, const opus_int16 *coef, opus_int order); #undef silk_NSQ_noise_shape_feedback_loop #define silk_NSQ_noise_shape_feedback_loop(data0, data1, coef, order, arch) \ (SILK_NSQ_NOISE_SHAPE_FEEDBACK_LOOP_IMPL[(arch)&OPUS_ARCHMASK](data0, data1, \ coef, order)) #endif #endif /* SILK_NSQ_NEON_H */ mumble-1.3.4/3rdparty/opus-src/silk/arm/macros_armv5e.h0000664000175000017500000001416714010707327022632 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Copyright (c) 2013 Parrot Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef SILK_MACROS_ARMv5E_H #define SILK_MACROS_ARMv5E_H /* This macro only avoids the undefined behaviour from a left shift of a negative value. It should only be used in macros that can't include SigProc_FIX.h. In other cases, use silk_LSHIFT32(). */ #define SAFE_SHL(a,b) ((opus_int32)((opus_uint32)(a) << (b))) /* (a32 * (opus_int32)((opus_int16)(b32))) >> 16 output have to be 32bit int */ #undef silk_SMULWB static OPUS_INLINE opus_int32 silk_SMULWB_armv5e(opus_int32 a, opus_int16 b) { int res; __asm__( "#silk_SMULWB\n\t" "smulwb %0, %1, %2\n\t" : "=r"(res) : "r"(a), "r"(b) ); return res; } #define silk_SMULWB(a, b) (silk_SMULWB_armv5e(a, b)) /* a32 + (b32 * (opus_int32)((opus_int16)(c32))) >> 16 output have to be 32bit int */ #undef silk_SMLAWB static OPUS_INLINE opus_int32 silk_SMLAWB_armv5e(opus_int32 a, opus_int32 b, opus_int16 c) { int res; __asm__( "#silk_SMLAWB\n\t" "smlawb %0, %1, %2, %3\n\t" : "=r"(res) : "r"(b), "r"(c), "r"(a) ); return res; } #define silk_SMLAWB(a, b, c) (silk_SMLAWB_armv5e(a, b, c)) /* (a32 * (b32 >> 16)) >> 16 */ #undef silk_SMULWT static OPUS_INLINE opus_int32 silk_SMULWT_armv5e(opus_int32 a, opus_int32 b) { int res; __asm__( "#silk_SMULWT\n\t" "smulwt %0, %1, %2\n\t" : "=r"(res) : "r"(a), "r"(b) ); return res; } #define silk_SMULWT(a, b) (silk_SMULWT_armv5e(a, b)) /* a32 + (b32 * (c32 >> 16)) >> 16 */ #undef silk_SMLAWT static OPUS_INLINE opus_int32 silk_SMLAWT_armv5e(opus_int32 a, opus_int32 b, opus_int32 c) { int res; __asm__( "#silk_SMLAWT\n\t" "smlawt %0, %1, %2, %3\n\t" : "=r"(res) : "r"(b), "r"(c), "r"(a) ); return res; } #define silk_SMLAWT(a, b, c) (silk_SMLAWT_armv5e(a, b, c)) /* (opus_int32)((opus_int16)(a3))) * (opus_int32)((opus_int16)(b32)) output have to be 32bit int */ #undef silk_SMULBB static OPUS_INLINE opus_int32 silk_SMULBB_armv5e(opus_int32 a, opus_int32 b) { int res; __asm__( "#silk_SMULBB\n\t" "smulbb %0, %1, %2\n\t" : "=r"(res) : "%r"(a), "r"(b) ); return res; } #define silk_SMULBB(a, b) (silk_SMULBB_armv5e(a, b)) /* a32 + (opus_int32)((opus_int16)(b32)) * (opus_int32)((opus_int16)(c32)) output have to be 32bit int */ #undef silk_SMLABB static OPUS_INLINE opus_int32 silk_SMLABB_armv5e(opus_int32 a, opus_int32 b, opus_int32 c) { int res; __asm__( "#silk_SMLABB\n\t" "smlabb %0, %1, %2, %3\n\t" : "=r"(res) : "%r"(b), "r"(c), "r"(a) ); return res; } #define silk_SMLABB(a, b, c) (silk_SMLABB_armv5e(a, b, c)) /* (opus_int32)((opus_int16)(a32)) * (b32 >> 16) */ #undef silk_SMULBT static OPUS_INLINE opus_int32 silk_SMULBT_armv5e(opus_int32 a, opus_int32 b) { int res; __asm__( "#silk_SMULBT\n\t" "smulbt %0, %1, %2\n\t" : "=r"(res) : "r"(a), "r"(b) ); return res; } #define silk_SMULBT(a, b) (silk_SMULBT_armv5e(a, b)) /* a32 + (opus_int32)((opus_int16)(b32)) * (c32 >> 16) */ #undef silk_SMLABT static OPUS_INLINE opus_int32 silk_SMLABT_armv5e(opus_int32 a, opus_int32 b, opus_int32 c) { int res; __asm__( "#silk_SMLABT\n\t" "smlabt %0, %1, %2, %3\n\t" : "=r"(res) : "r"(b), "r"(c), "r"(a) ); return res; } #define silk_SMLABT(a, b, c) (silk_SMLABT_armv5e(a, b, c)) /* add/subtract with output saturated */ #undef silk_ADD_SAT32 static OPUS_INLINE opus_int32 silk_ADD_SAT32_armv5e(opus_int32 a, opus_int32 b) { int res; __asm__( "#silk_ADD_SAT32\n\t" "qadd %0, %1, %2\n\t" : "=r"(res) : "%r"(a), "r"(b) ); return res; } #define silk_ADD_SAT32(a, b) (silk_ADD_SAT32_armv5e(a, b)) #undef silk_SUB_SAT32 static OPUS_INLINE opus_int32 silk_SUB_SAT32_armv5e(opus_int32 a, opus_int32 b) { int res; __asm__( "#silk_SUB_SAT32\n\t" "qsub %0, %1, %2\n\t" : "=r"(res) : "r"(a), "r"(b) ); return res; } #define silk_SUB_SAT32(a, b) (silk_SUB_SAT32_armv5e(a, b)) #undef silk_CLZ16 static OPUS_INLINE opus_int32 silk_CLZ16_armv5(opus_int16 in16) { int res; __asm__( "#silk_CLZ16\n\t" "clz %0, %1;\n" : "=r"(res) : "r"(SAFE_SHL(in16,16)|0x8000) ); return res; } #define silk_CLZ16(in16) (silk_CLZ16_armv5(in16)) #undef silk_CLZ32 static OPUS_INLINE opus_int32 silk_CLZ32_armv5(opus_int32 in32) { int res; __asm__( "#silk_CLZ32\n\t" "clz %0, %1\n\t" : "=r"(res) : "r"(in32) ); return res; } #define silk_CLZ32(in32) (silk_CLZ32_armv5(in32)) #undef SAFE_SHL #endif /* SILK_MACROS_ARMv5E_H */ mumble-1.3.4/3rdparty/opus-src/silk/arm/NSQ_del_dec_neon_intr.c0000664000175000017500000017672414010707327024245 0ustar builderbuilder/*********************************************************************** Copyright (c) 2017 Google Inc. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #ifdef OPUS_CHECK_ASM # include #endif #include "main.h" #include "stack_alloc.h" /* NEON intrinsics optimization now can only parallelize up to 4 delay decision states. */ /* If there are more states, C function is called, and this optimization must be expanded. */ #define NEON_MAX_DEL_DEC_STATES 4 typedef struct { opus_int32 sLPC_Q14[ MAX_SUB_FRAME_LENGTH + NSQ_LPC_BUF_LENGTH ][ NEON_MAX_DEL_DEC_STATES ]; opus_int32 RandState[ DECISION_DELAY ][ NEON_MAX_DEL_DEC_STATES ]; opus_int32 Q_Q10[ DECISION_DELAY ][ NEON_MAX_DEL_DEC_STATES ]; opus_int32 Xq_Q14[ DECISION_DELAY ][ NEON_MAX_DEL_DEC_STATES ]; opus_int32 Pred_Q15[ DECISION_DELAY ][ NEON_MAX_DEL_DEC_STATES ]; opus_int32 Shape_Q14[ DECISION_DELAY ][ NEON_MAX_DEL_DEC_STATES ]; opus_int32 sAR2_Q14[ MAX_SHAPE_LPC_ORDER ][ NEON_MAX_DEL_DEC_STATES ]; opus_int32 LF_AR_Q14[ NEON_MAX_DEL_DEC_STATES ]; opus_int32 Diff_Q14[ NEON_MAX_DEL_DEC_STATES ]; opus_int32 Seed[ NEON_MAX_DEL_DEC_STATES ]; opus_int32 SeedInit[ NEON_MAX_DEL_DEC_STATES ]; opus_int32 RD_Q10[ NEON_MAX_DEL_DEC_STATES ]; } NSQ_del_decs_struct; typedef struct { opus_int32 Q_Q10[ NEON_MAX_DEL_DEC_STATES ]; opus_int32 RD_Q10[ NEON_MAX_DEL_DEC_STATES ]; opus_int32 xq_Q14[ NEON_MAX_DEL_DEC_STATES ]; opus_int32 LF_AR_Q14[ NEON_MAX_DEL_DEC_STATES ]; opus_int32 Diff_Q14[ NEON_MAX_DEL_DEC_STATES ]; opus_int32 sLTP_shp_Q14[ NEON_MAX_DEL_DEC_STATES ]; opus_int32 LPC_exc_Q14[ NEON_MAX_DEL_DEC_STATES ]; } NSQ_samples_struct; static OPUS_INLINE void silk_nsq_del_dec_scale_states_neon( const silk_encoder_state *psEncC, /* I Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ NSQ_del_decs_struct psDelDec[], /* I/O Delayed decision states */ const opus_int16 x16[], /* I Input */ opus_int32 x_sc_Q10[], /* O Input scaled with 1/Gain in Q10 */ const opus_int16 sLTP[], /* I Re-whitened LTP state in Q0 */ opus_int32 sLTP_Q15[], /* O LTP state matching scaled input */ opus_int subfr, /* I Subframe number */ const opus_int LTP_scale_Q14, /* I LTP state scaling */ const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I */ const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag */ const opus_int signal_type, /* I Signal type */ const opus_int decisionDelay /* I Decision delay */ ); /******************************************/ /* Noise shape quantizer for one subframe */ /******************************************/ static OPUS_INLINE void silk_noise_shape_quantizer_del_dec_neon( silk_nsq_state *NSQ, /* I/O NSQ state */ NSQ_del_decs_struct psDelDec[], /* I/O Delayed decision states */ opus_int signalType, /* I Signal type */ const opus_int32 x_Q10[], /* I */ opus_int8 pulses[], /* O */ opus_int16 xq[], /* O */ opus_int32 sLTP_Q15[], /* I/O LTP filter state */ opus_int32 delayedGain_Q10[], /* I/O Gain delay buffer */ const opus_int16 a_Q12[], /* I Short term prediction coefs */ const opus_int16 b_Q14[], /* I Long term prediction coefs */ const opus_int16 AR_shp_Q13[], /* I Noise shaping coefs */ opus_int lag, /* I Pitch lag */ opus_int32 HarmShapeFIRPacked_Q14, /* I */ opus_int Tilt_Q14, /* I Spectral tilt */ opus_int32 LF_shp_Q14, /* I */ opus_int32 Gain_Q16, /* I */ opus_int Lambda_Q10, /* I */ opus_int offset_Q10, /* I */ opus_int length, /* I Input length */ opus_int subfr, /* I Subframe number */ opus_int shapingLPCOrder, /* I Shaping LPC filter order */ opus_int predictLPCOrder, /* I Prediction filter order */ opus_int warping_Q16, /* I */ opus_int nStatesDelayedDecision, /* I Number of states in decision tree */ opus_int *smpl_buf_idx, /* I/O Index to newest samples in buffers */ opus_int decisionDelay /* I */ ); static OPUS_INLINE void copy_winner_state_kernel( const NSQ_del_decs_struct *psDelDec, const opus_int offset, const opus_int last_smple_idx, const opus_int Winner_ind, const int32x2_t gain_lo_s32x2, const int32x2_t gain_hi_s32x2, const int32x4_t shift_s32x4, int32x4_t t0_s32x4, int32x4_t t1_s32x4, opus_int8 *const pulses, opus_int16 *pxq, silk_nsq_state *NSQ ) { int16x8_t t_s16x8; int32x4_t o0_s32x4, o1_s32x4; t0_s32x4 = vld1q_lane_s32( &psDelDec->Q_Q10[ last_smple_idx - 0 ][ Winner_ind ], t0_s32x4, 0 ); t0_s32x4 = vld1q_lane_s32( &psDelDec->Q_Q10[ last_smple_idx - 1 ][ Winner_ind ], t0_s32x4, 1 ); t0_s32x4 = vld1q_lane_s32( &psDelDec->Q_Q10[ last_smple_idx - 2 ][ Winner_ind ], t0_s32x4, 2 ); t0_s32x4 = vld1q_lane_s32( &psDelDec->Q_Q10[ last_smple_idx - 3 ][ Winner_ind ], t0_s32x4, 3 ); t1_s32x4 = vld1q_lane_s32( &psDelDec->Q_Q10[ last_smple_idx - 4 ][ Winner_ind ], t1_s32x4, 0 ); t1_s32x4 = vld1q_lane_s32( &psDelDec->Q_Q10[ last_smple_idx - 5 ][ Winner_ind ], t1_s32x4, 1 ); t1_s32x4 = vld1q_lane_s32( &psDelDec->Q_Q10[ last_smple_idx - 6 ][ Winner_ind ], t1_s32x4, 2 ); t1_s32x4 = vld1q_lane_s32( &psDelDec->Q_Q10[ last_smple_idx - 7 ][ Winner_ind ], t1_s32x4, 3 ); t_s16x8 = vcombine_s16( vrshrn_n_s32( t0_s32x4, 10 ), vrshrn_n_s32( t1_s32x4, 10 ) ); vst1_s8( &pulses[ offset ], vmovn_s16( t_s16x8 ) ); t0_s32x4 = vld1q_lane_s32( &psDelDec->Xq_Q14[ last_smple_idx - 0 ][ Winner_ind ], t0_s32x4, 0 ); t0_s32x4 = vld1q_lane_s32( &psDelDec->Xq_Q14[ last_smple_idx - 1 ][ Winner_ind ], t0_s32x4, 1 ); t0_s32x4 = vld1q_lane_s32( &psDelDec->Xq_Q14[ last_smple_idx - 2 ][ Winner_ind ], t0_s32x4, 2 ); t0_s32x4 = vld1q_lane_s32( &psDelDec->Xq_Q14[ last_smple_idx - 3 ][ Winner_ind ], t0_s32x4, 3 ); t1_s32x4 = vld1q_lane_s32( &psDelDec->Xq_Q14[ last_smple_idx - 4 ][ Winner_ind ], t1_s32x4, 0 ); t1_s32x4 = vld1q_lane_s32( &psDelDec->Xq_Q14[ last_smple_idx - 5 ][ Winner_ind ], t1_s32x4, 1 ); t1_s32x4 = vld1q_lane_s32( &psDelDec->Xq_Q14[ last_smple_idx - 6 ][ Winner_ind ], t1_s32x4, 2 ); t1_s32x4 = vld1q_lane_s32( &psDelDec->Xq_Q14[ last_smple_idx - 7 ][ Winner_ind ], t1_s32x4, 3 ); o0_s32x4 = vqdmulhq_lane_s32( t0_s32x4, gain_lo_s32x2, 0 ); o1_s32x4 = vqdmulhq_lane_s32( t1_s32x4, gain_lo_s32x2, 0 ); o0_s32x4 = vmlaq_lane_s32( o0_s32x4, t0_s32x4, gain_hi_s32x2, 0 ); o1_s32x4 = vmlaq_lane_s32( o1_s32x4, t1_s32x4, gain_hi_s32x2, 0 ); o0_s32x4 = vrshlq_s32( o0_s32x4, shift_s32x4 ); o1_s32x4 = vrshlq_s32( o1_s32x4, shift_s32x4 ); vst1_s16( &pxq[ offset + 0 ], vqmovn_s32( o0_s32x4 ) ); vst1_s16( &pxq[ offset + 4 ], vqmovn_s32( o1_s32x4 ) ); t0_s32x4 = vld1q_lane_s32( &psDelDec->Shape_Q14[ last_smple_idx - 0 ][ Winner_ind ], t0_s32x4, 0 ); t0_s32x4 = vld1q_lane_s32( &psDelDec->Shape_Q14[ last_smple_idx - 1 ][ Winner_ind ], t0_s32x4, 1 ); t0_s32x4 = vld1q_lane_s32( &psDelDec->Shape_Q14[ last_smple_idx - 2 ][ Winner_ind ], t0_s32x4, 2 ); t0_s32x4 = vld1q_lane_s32( &psDelDec->Shape_Q14[ last_smple_idx - 3 ][ Winner_ind ], t0_s32x4, 3 ); t1_s32x4 = vld1q_lane_s32( &psDelDec->Shape_Q14[ last_smple_idx - 4 ][ Winner_ind ], t1_s32x4, 0 ); t1_s32x4 = vld1q_lane_s32( &psDelDec->Shape_Q14[ last_smple_idx - 5 ][ Winner_ind ], t1_s32x4, 1 ); t1_s32x4 = vld1q_lane_s32( &psDelDec->Shape_Q14[ last_smple_idx - 6 ][ Winner_ind ], t1_s32x4, 2 ); t1_s32x4 = vld1q_lane_s32( &psDelDec->Shape_Q14[ last_smple_idx - 7 ][ Winner_ind ], t1_s32x4, 3 ); vst1q_s32( &NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx + offset + 0 ], t0_s32x4 ); vst1q_s32( &NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx + offset + 4 ], t1_s32x4 ); } static OPUS_INLINE void copy_winner_state( const NSQ_del_decs_struct *psDelDec, const opus_int decisionDelay, const opus_int smpl_buf_idx, const opus_int Winner_ind, const opus_int32 gain, const opus_int32 shift, opus_int8 *const pulses, opus_int16 *pxq, silk_nsq_state *NSQ ) { opus_int i, last_smple_idx; const int32x2_t gain_lo_s32x2 = vdup_n_s32( silk_LSHIFT32( gain & 0x0000FFFF, 15 ) ); const int32x2_t gain_hi_s32x2 = vdup_n_s32( gain >> 16 ); const int32x4_t shift_s32x4 = vdupq_n_s32( -shift ); int32x4_t t0_s32x4, t1_s32x4; t0_s32x4 = t1_s32x4 = vdupq_n_s32( 0 ); /* initialization */ last_smple_idx = smpl_buf_idx + decisionDelay - 1 + DECISION_DELAY; if( last_smple_idx >= DECISION_DELAY ) last_smple_idx -= DECISION_DELAY; if( last_smple_idx >= DECISION_DELAY ) last_smple_idx -= DECISION_DELAY; for( i = 0; ( i < ( decisionDelay - 7 ) ) && ( last_smple_idx >= 7 ); i += 8, last_smple_idx -= 8 ) { copy_winner_state_kernel( psDelDec, i - decisionDelay, last_smple_idx, Winner_ind, gain_lo_s32x2, gain_hi_s32x2, shift_s32x4, t0_s32x4, t1_s32x4, pulses, pxq, NSQ ); } for( ; ( i < decisionDelay ) && ( last_smple_idx >= 0 ); i++, last_smple_idx-- ) { pulses[ i - decisionDelay ] = (opus_int8)silk_RSHIFT_ROUND( psDelDec->Q_Q10[ last_smple_idx ][ Winner_ind ], 10 ); pxq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( psDelDec->Xq_Q14[ last_smple_idx ][ Winner_ind ], gain ), shift ) ); NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - decisionDelay + i ] = psDelDec->Shape_Q14[ last_smple_idx ][ Winner_ind ]; } last_smple_idx += DECISION_DELAY; for( ; i < ( decisionDelay - 7 ); i++, last_smple_idx-- ) { copy_winner_state_kernel( psDelDec, i - decisionDelay, last_smple_idx, Winner_ind, gain_lo_s32x2, gain_hi_s32x2, shift_s32x4, t0_s32x4, t1_s32x4, pulses, pxq, NSQ ); } for( ; i < decisionDelay; i++, last_smple_idx-- ) { pulses[ i - decisionDelay ] = (opus_int8)silk_RSHIFT_ROUND( psDelDec->Q_Q10[ last_smple_idx ][ Winner_ind ], 10 ); pxq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( psDelDec->Xq_Q14[ last_smple_idx ][ Winner_ind ], gain ), shift ) ); NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - decisionDelay + i ] = psDelDec->Shape_Q14[ last_smple_idx ][ Winner_ind ]; } } void silk_NSQ_del_dec_neon( const silk_encoder_state *psEncC, /* I Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ SideInfoIndices *psIndices, /* I/O Quantization Indices */ const opus_int16 x16[], /* I Input */ opus_int8 pulses[], /* O Quantized pulse signal */ const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */ const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */ const opus_int16 AR_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */ const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */ const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */ const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I Quantization step sizes */ const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */ const opus_int Lambda_Q10, /* I Rate/distortion tradeoff */ const opus_int LTP_scale_Q14 /* I LTP state scaling */ ) { #ifdef OPUS_CHECK_ASM silk_nsq_state NSQ_c; SideInfoIndices psIndices_c; opus_int8 pulses_c[ MAX_FRAME_LENGTH ]; const opus_int8 *const pulses_a = pulses; ( void )pulses_a; silk_memcpy( &NSQ_c, NSQ, sizeof( NSQ_c ) ); silk_memcpy( &psIndices_c, psIndices, sizeof( psIndices_c ) ); silk_memcpy( pulses_c, pulses, sizeof( pulses_c ) ); silk_NSQ_del_dec_c( psEncC, &NSQ_c, &psIndices_c, x16, pulses_c, PredCoef_Q12, LTPCoef_Q14, AR_Q13, HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14 ); #endif /* The optimization parallelizes the different delay decision states. */ if(( psEncC->nStatesDelayedDecision > NEON_MAX_DEL_DEC_STATES ) || ( psEncC->nStatesDelayedDecision <= 2 )) { /* NEON intrinsics optimization now can only parallelize up to 4 delay decision states. */ /* If there are more states, C function is called, and this optimization must be expanded. */ /* When the number of delay decision states is less than 3, there are penalties using this */ /* optimization, and C function is called. */ /* When the number of delay decision states is 2, it's better to specialize another */ /* structure NSQ_del_dec2_struct and optimize with shorter NEON registers. (Low priority) */ silk_NSQ_del_dec_c( psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, LTPCoef_Q14, AR_Q13, HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14 ); } else { opus_int i, k, lag, start_idx, LSF_interpolation_flag, Winner_ind, subfr; opus_int smpl_buf_idx, decisionDelay; const opus_int16 *A_Q12, *B_Q14, *AR_shp_Q13; opus_int16 *pxq; VARDECL( opus_int32, sLTP_Q15 ); VARDECL( opus_int16, sLTP ); opus_int32 HarmShapeFIRPacked_Q14; opus_int offset_Q10; opus_int32 RDmin_Q10, Gain_Q10; VARDECL( opus_int32, x_sc_Q10 ); VARDECL( opus_int32, delayedGain_Q10 ); VARDECL( NSQ_del_decs_struct, psDelDec ); int32x4_t t_s32x4; SAVE_STACK; /* Set unvoiced lag to the previous one, overwrite later for voiced */ lag = NSQ->lagPrev; silk_assert( NSQ->prev_gain_Q16 != 0 ); /* Initialize delayed decision states */ ALLOC( psDelDec, 1, NSQ_del_decs_struct ); /* Only RandState and RD_Q10 need to be initialized to 0. */ silk_memset( psDelDec->RandState, 0, sizeof( psDelDec->RandState ) ); vst1q_s32( psDelDec->RD_Q10, vdupq_n_s32( 0 ) ); for( k = 0; k < psEncC->nStatesDelayedDecision; k++ ) { psDelDec->SeedInit[ k ] = psDelDec->Seed[ k ] = ( k + psIndices->Seed ) & 3; } vst1q_s32( psDelDec->LF_AR_Q14, vld1q_dup_s32( &NSQ->sLF_AR_shp_Q14 ) ); vst1q_s32( psDelDec->Diff_Q14, vld1q_dup_s32( &NSQ->sDiff_shp_Q14 ) ); vst1q_s32( psDelDec->Shape_Q14[ 0 ], vld1q_dup_s32( &NSQ->sLTP_shp_Q14[ psEncC->ltp_mem_length - 1 ] ) ); for( i = 0; i < NSQ_LPC_BUF_LENGTH; i++ ) { vst1q_s32( psDelDec->sLPC_Q14[ i ], vld1q_dup_s32( &NSQ->sLPC_Q14[ i ] ) ); } for( i = 0; i < (opus_int)( sizeof( NSQ->sAR2_Q14 ) / sizeof( NSQ->sAR2_Q14[ 0 ] ) ); i++ ) { vst1q_s32( psDelDec->sAR2_Q14[ i ], vld1q_dup_s32( &NSQ->sAR2_Q14[ i ] ) ); } offset_Q10 = silk_Quantization_Offsets_Q10[ psIndices->signalType >> 1 ][ psIndices->quantOffsetType ]; smpl_buf_idx = 0; /* index of oldest samples */ decisionDelay = silk_min_int( DECISION_DELAY, psEncC->subfr_length ); /* For voiced frames limit the decision delay to lower than the pitch lag */ if( psIndices->signalType == TYPE_VOICED ) { opus_int pitch_min = pitchL[ 0 ]; for( k = 1; k < psEncC->nb_subfr; k++ ) { pitch_min = silk_min_int( pitch_min, pitchL[ k ] ); } decisionDelay = silk_min_int( decisionDelay, pitch_min - LTP_ORDER / 2 - 1 ); } else { if( lag > 0 ) { decisionDelay = silk_min_int( decisionDelay, lag - LTP_ORDER / 2 - 1 ); } } if( psIndices->NLSFInterpCoef_Q2 == 4 ) { LSF_interpolation_flag = 0; } else { LSF_interpolation_flag = 1; } ALLOC( sLTP_Q15, psEncC->ltp_mem_length + psEncC->frame_length, opus_int32 ); ALLOC( sLTP, psEncC->ltp_mem_length + psEncC->frame_length, opus_int16 ); ALLOC( x_sc_Q10, psEncC->subfr_length, opus_int32 ); ALLOC( delayedGain_Q10, DECISION_DELAY, opus_int32 ); /* Set up pointers to start of sub frame */ pxq = &NSQ->xq[ psEncC->ltp_mem_length ]; NSQ->sLTP_shp_buf_idx = psEncC->ltp_mem_length; NSQ->sLTP_buf_idx = psEncC->ltp_mem_length; subfr = 0; for( k = 0; k < psEncC->nb_subfr; k++ ) { A_Q12 = &PredCoef_Q12[ ( ( k >> 1 ) | ( 1 - LSF_interpolation_flag ) ) * MAX_LPC_ORDER ]; B_Q14 = <PCoef_Q14[ k * LTP_ORDER ]; AR_shp_Q13 = &AR_Q13[ k * MAX_SHAPE_LPC_ORDER ]; /* Noise shape parameters */ silk_assert( HarmShapeGain_Q14[ k ] >= 0 ); HarmShapeFIRPacked_Q14 = silk_RSHIFT( HarmShapeGain_Q14[ k ], 2 ); HarmShapeFIRPacked_Q14 |= silk_LSHIFT( (opus_int32)silk_RSHIFT( HarmShapeGain_Q14[ k ], 1 ), 16 ); NSQ->rewhite_flag = 0; if( psIndices->signalType == TYPE_VOICED ) { /* Voiced */ lag = pitchL[ k ]; /* Re-whitening */ if( ( k & ( 3 - silk_LSHIFT( LSF_interpolation_flag, 1 ) ) ) == 0 ) { if( k == 2 ) { /* RESET DELAYED DECISIONS */ /* Find winner */ int32x4_t RD_Q10_s32x4; RDmin_Q10 = psDelDec->RD_Q10[ 0 ]; Winner_ind = 0; for( i = 1; i < psEncC->nStatesDelayedDecision; i++ ) { if( psDelDec->RD_Q10[ i ] < RDmin_Q10 ) { RDmin_Q10 = psDelDec->RD_Q10[ i ]; Winner_ind = i; } } psDelDec->RD_Q10[ Winner_ind ] -= ( silk_int32_MAX >> 4 ); RD_Q10_s32x4 = vld1q_s32( psDelDec->RD_Q10 ); RD_Q10_s32x4 = vaddq_s32( RD_Q10_s32x4, vdupq_n_s32( silk_int32_MAX >> 4 ) ); vst1q_s32( psDelDec->RD_Q10, RD_Q10_s32x4 ); /* Copy final part of signals from winner state to output and long-term filter states */ copy_winner_state( psDelDec, decisionDelay, smpl_buf_idx, Winner_ind, Gains_Q16[ 1 ], 14, pulses, pxq, NSQ ); subfr = 0; } /* Rewhiten with new A coefs */ start_idx = psEncC->ltp_mem_length - lag - psEncC->predictLPCOrder - LTP_ORDER / 2; silk_assert( start_idx > 0 ); silk_LPC_analysis_filter( &sLTP[ start_idx ], &NSQ->xq[ start_idx + k * psEncC->subfr_length ], A_Q12, psEncC->ltp_mem_length - start_idx, psEncC->predictLPCOrder, psEncC->arch ); NSQ->sLTP_buf_idx = psEncC->ltp_mem_length; NSQ->rewhite_flag = 1; } } silk_nsq_del_dec_scale_states_neon( psEncC, NSQ, psDelDec, x16, x_sc_Q10, sLTP, sLTP_Q15, k, LTP_scale_Q14, Gains_Q16, pitchL, psIndices->signalType, decisionDelay ); silk_noise_shape_quantizer_del_dec_neon( NSQ, psDelDec, psIndices->signalType, x_sc_Q10, pulses, pxq, sLTP_Q15, delayedGain_Q10, A_Q12, B_Q14, AR_shp_Q13, lag, HarmShapeFIRPacked_Q14, Tilt_Q14[ k ], LF_shp_Q14[ k ], Gains_Q16[ k ], Lambda_Q10, offset_Q10, psEncC->subfr_length, subfr++, psEncC->shapingLPCOrder, psEncC->predictLPCOrder, psEncC->warping_Q16, psEncC->nStatesDelayedDecision, &smpl_buf_idx, decisionDelay ); x16 += psEncC->subfr_length; pulses += psEncC->subfr_length; pxq += psEncC->subfr_length; } /* Find winner */ RDmin_Q10 = psDelDec->RD_Q10[ 0 ]; Winner_ind = 0; for( k = 1; k < psEncC->nStatesDelayedDecision; k++ ) { if( psDelDec->RD_Q10[ k ] < RDmin_Q10 ) { RDmin_Q10 = psDelDec->RD_Q10[ k ]; Winner_ind = k; } } /* Copy final part of signals from winner state to output and long-term filter states */ psIndices->Seed = psDelDec->SeedInit[ Winner_ind ]; Gain_Q10 = silk_RSHIFT32( Gains_Q16[ psEncC->nb_subfr - 1 ], 6 ); copy_winner_state( psDelDec, decisionDelay, smpl_buf_idx, Winner_ind, Gain_Q10, 8, pulses, pxq, NSQ ); t_s32x4 = vdupq_n_s32( 0 ); /* initialization */ for( i = 0; i < ( NSQ_LPC_BUF_LENGTH - 3 ); i += 4 ) { t_s32x4 = vld1q_lane_s32( &psDelDec->sLPC_Q14[ i + 0 ][ Winner_ind ], t_s32x4, 0 ); t_s32x4 = vld1q_lane_s32( &psDelDec->sLPC_Q14[ i + 1 ][ Winner_ind ], t_s32x4, 1 ); t_s32x4 = vld1q_lane_s32( &psDelDec->sLPC_Q14[ i + 2 ][ Winner_ind ], t_s32x4, 2 ); t_s32x4 = vld1q_lane_s32( &psDelDec->sLPC_Q14[ i + 3 ][ Winner_ind ], t_s32x4, 3 ); vst1q_s32( &NSQ->sLPC_Q14[ i ], t_s32x4 ); } for( ; i < NSQ_LPC_BUF_LENGTH; i++ ) { NSQ->sLPC_Q14[ i ] = psDelDec->sLPC_Q14[ i ][ Winner_ind ]; } for( i = 0; i < (opus_int)( sizeof( NSQ->sAR2_Q14 ) / sizeof( NSQ->sAR2_Q14[ 0 ] ) - 3 ); i += 4 ) { t_s32x4 = vld1q_lane_s32( &psDelDec->sAR2_Q14[ i + 0 ][ Winner_ind ], t_s32x4, 0 ); t_s32x4 = vld1q_lane_s32( &psDelDec->sAR2_Q14[ i + 1 ][ Winner_ind ], t_s32x4, 1 ); t_s32x4 = vld1q_lane_s32( &psDelDec->sAR2_Q14[ i + 2 ][ Winner_ind ], t_s32x4, 2 ); t_s32x4 = vld1q_lane_s32( &psDelDec->sAR2_Q14[ i + 3 ][ Winner_ind ], t_s32x4, 3 ); vst1q_s32( &NSQ->sAR2_Q14[ i ], t_s32x4 ); } for( ; i < (opus_int)( sizeof( NSQ->sAR2_Q14 ) / sizeof( NSQ->sAR2_Q14[ 0 ] ) ); i++ ) { NSQ->sAR2_Q14[ i ] = psDelDec->sAR2_Q14[ i ][ Winner_ind ]; } /* Update states */ NSQ->sLF_AR_shp_Q14 = psDelDec->LF_AR_Q14[ Winner_ind ]; NSQ->sDiff_shp_Q14 = psDelDec->Diff_Q14[ Winner_ind ]; NSQ->lagPrev = pitchL[ psEncC->nb_subfr - 1 ]; /* Save quantized speech signal */ silk_memmove( NSQ->xq, &NSQ->xq[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int16 ) ); silk_memmove( NSQ->sLTP_shp_Q14, &NSQ->sLTP_shp_Q14[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int32 ) ); RESTORE_STACK; } #ifdef OPUS_CHECK_ASM silk_assert( !memcmp( &NSQ_c, NSQ, sizeof( NSQ_c ) ) ); silk_assert( !memcmp( &psIndices_c, psIndices, sizeof( psIndices_c ) ) ); silk_assert( !memcmp( pulses_c, pulses_a, sizeof( pulses_c ) ) ); #endif } /******************************************/ /* Noise shape quantizer for one subframe */ /******************************************/ /* Note: Function silk_short_prediction_create_arch_coef_neon() defined in NSQ_neon.h is actually a hacking C function. */ /* Therefore here we append "_local" to the NEON function name to avoid confusion. */ static OPUS_INLINE void silk_short_prediction_create_arch_coef_neon_local(opus_int32 *out, const opus_int16 *in, opus_int order) { int16x8_t t_s16x8; int32x4_t t0_s32x4, t1_s32x4, t2_s32x4, t3_s32x4; silk_assert( order == 10 || order == 16 ); t_s16x8 = vld1q_s16( in + 0 ); /* 7 6 5 4 3 2 1 0 */ t_s16x8 = vrev64q_s16( t_s16x8 ); /* 4 5 6 7 0 1 2 3 */ t2_s32x4 = vshll_n_s16( vget_high_s16( t_s16x8 ), 15 ); /* 4 5 6 7 */ t3_s32x4 = vshll_n_s16( vget_low_s16( t_s16x8 ), 15 ); /* 0 1 2 3 */ if( order == 16 ) { t_s16x8 = vld1q_s16( in + 8 ); /* F E D C B A 9 8 */ t_s16x8 = vrev64q_s16( t_s16x8 ); /* C D E F 8 9 A B */ t0_s32x4 = vshll_n_s16( vget_high_s16( t_s16x8 ), 15 ); /* C D E F */ t1_s32x4 = vshll_n_s16( vget_low_s16( t_s16x8 ), 15 ); /* 8 9 A B */ } else { int16x4_t t_s16x4; t0_s32x4 = vdupq_n_s32( 0 ); /* zero zero zero zero */ t_s16x4 = vld1_s16( in + 6 ); /* 9 8 7 6 */ t_s16x4 = vrev64_s16( t_s16x4 ); /* 6 7 8 9 */ t1_s32x4 = vshll_n_s16( t_s16x4, 15 ); t1_s32x4 = vcombine_s32( vget_low_s32(t0_s32x4), vget_low_s32( t1_s32x4 ) ); /* 8 9 zero zero */ } vst1q_s32( out + 0, t0_s32x4 ); vst1q_s32( out + 4, t1_s32x4 ); vst1q_s32( out + 8, t2_s32x4 ); vst1q_s32( out + 12, t3_s32x4 ); } static OPUS_INLINE int32x4_t silk_SMLAWB_lane0_neon( const int32x4_t out_s32x4, const int32x4_t in_s32x4, const int32x2_t coef_s32x2 ) { return vaddq_s32( out_s32x4, vqdmulhq_lane_s32( in_s32x4, coef_s32x2, 0 ) ); } static OPUS_INLINE int32x4_t silk_SMLAWB_lane1_neon( const int32x4_t out_s32x4, const int32x4_t in_s32x4, const int32x2_t coef_s32x2 ) { return vaddq_s32( out_s32x4, vqdmulhq_lane_s32( in_s32x4, coef_s32x2, 1 ) ); } /* Note: This function has different return value than silk_noise_shape_quantizer_short_prediction_neon(). */ /* Therefore here we append "_local" to the function name to avoid confusion. */ static OPUS_INLINE int32x4_t silk_noise_shape_quantizer_short_prediction_neon_local(const opus_int32 *buf32, const opus_int32 *a_Q12_arch, opus_int order) { const int32x4_t a_Q12_arch0_s32x4 = vld1q_s32( a_Q12_arch + 0 ); const int32x4_t a_Q12_arch1_s32x4 = vld1q_s32( a_Q12_arch + 4 ); const int32x4_t a_Q12_arch2_s32x4 = vld1q_s32( a_Q12_arch + 8 ); const int32x4_t a_Q12_arch3_s32x4 = vld1q_s32( a_Q12_arch + 12 ); int32x4_t LPC_pred_Q14_s32x4; silk_assert( order == 10 || order == 16 ); /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ LPC_pred_Q14_s32x4 = vdupq_n_s32( silk_RSHIFT( order, 1 ) ); LPC_pred_Q14_s32x4 = silk_SMLAWB_lane0_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 0 * NEON_MAX_DEL_DEC_STATES ), vget_low_s32( a_Q12_arch0_s32x4 ) ); LPC_pred_Q14_s32x4 = silk_SMLAWB_lane1_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 1 * NEON_MAX_DEL_DEC_STATES ), vget_low_s32( a_Q12_arch0_s32x4 ) ); LPC_pred_Q14_s32x4 = silk_SMLAWB_lane0_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 2 * NEON_MAX_DEL_DEC_STATES ), vget_high_s32( a_Q12_arch0_s32x4 ) ); LPC_pred_Q14_s32x4 = silk_SMLAWB_lane1_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 3 * NEON_MAX_DEL_DEC_STATES ), vget_high_s32( a_Q12_arch0_s32x4 ) ); LPC_pred_Q14_s32x4 = silk_SMLAWB_lane0_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 4 * NEON_MAX_DEL_DEC_STATES ), vget_low_s32( a_Q12_arch1_s32x4 ) ); LPC_pred_Q14_s32x4 = silk_SMLAWB_lane1_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 5 * NEON_MAX_DEL_DEC_STATES ), vget_low_s32( a_Q12_arch1_s32x4 ) ); LPC_pred_Q14_s32x4 = silk_SMLAWB_lane0_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 6 * NEON_MAX_DEL_DEC_STATES ), vget_high_s32( a_Q12_arch1_s32x4 ) ); LPC_pred_Q14_s32x4 = silk_SMLAWB_lane1_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 7 * NEON_MAX_DEL_DEC_STATES ), vget_high_s32( a_Q12_arch1_s32x4 ) ); LPC_pred_Q14_s32x4 = silk_SMLAWB_lane0_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 8 * NEON_MAX_DEL_DEC_STATES ), vget_low_s32( a_Q12_arch2_s32x4 ) ); LPC_pred_Q14_s32x4 = silk_SMLAWB_lane1_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 9 * NEON_MAX_DEL_DEC_STATES ), vget_low_s32( a_Q12_arch2_s32x4 ) ); LPC_pred_Q14_s32x4 = silk_SMLAWB_lane0_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 10 * NEON_MAX_DEL_DEC_STATES ), vget_high_s32( a_Q12_arch2_s32x4 ) ); LPC_pred_Q14_s32x4 = silk_SMLAWB_lane1_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 11 * NEON_MAX_DEL_DEC_STATES ), vget_high_s32( a_Q12_arch2_s32x4 ) ); LPC_pred_Q14_s32x4 = silk_SMLAWB_lane0_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 12 * NEON_MAX_DEL_DEC_STATES ), vget_low_s32( a_Q12_arch3_s32x4 ) ); LPC_pred_Q14_s32x4 = silk_SMLAWB_lane1_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 13 * NEON_MAX_DEL_DEC_STATES ), vget_low_s32( a_Q12_arch3_s32x4 ) ); LPC_pred_Q14_s32x4 = silk_SMLAWB_lane0_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 14 * NEON_MAX_DEL_DEC_STATES ), vget_high_s32( a_Q12_arch3_s32x4 ) ); LPC_pred_Q14_s32x4 = silk_SMLAWB_lane1_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 15 * NEON_MAX_DEL_DEC_STATES ), vget_high_s32( a_Q12_arch3_s32x4 ) ); return LPC_pred_Q14_s32x4; } static OPUS_INLINE void silk_noise_shape_quantizer_del_dec_neon( silk_nsq_state *NSQ, /* I/O NSQ state */ NSQ_del_decs_struct psDelDec[], /* I/O Delayed decision states */ opus_int signalType, /* I Signal type */ const opus_int32 x_Q10[], /* I */ opus_int8 pulses[], /* O */ opus_int16 xq[], /* O */ opus_int32 sLTP_Q15[], /* I/O LTP filter state */ opus_int32 delayedGain_Q10[], /* I/O Gain delay buffer */ const opus_int16 a_Q12[], /* I Short term prediction coefs */ const opus_int16 b_Q14[], /* I Long term prediction coefs */ const opus_int16 AR_shp_Q13[], /* I Noise shaping coefs */ opus_int lag, /* I Pitch lag */ opus_int32 HarmShapeFIRPacked_Q14, /* I */ opus_int Tilt_Q14, /* I Spectral tilt */ opus_int32 LF_shp_Q14, /* I */ opus_int32 Gain_Q16, /* I */ opus_int Lambda_Q10, /* I */ opus_int offset_Q10, /* I */ opus_int length, /* I Input length */ opus_int subfr, /* I Subframe number */ opus_int shapingLPCOrder, /* I Shaping LPC filter order */ opus_int predictLPCOrder, /* I Prediction filter order */ opus_int warping_Q16, /* I */ opus_int nStatesDelayedDecision, /* I Number of states in decision tree */ opus_int *smpl_buf_idx, /* I/O Index to newest samples in buffers */ opus_int decisionDelay /* I */ ) { opus_int i, j, k, Winner_ind, RDmin_ind, RDmax_ind, last_smple_idx; opus_int32 Winner_rand_state; opus_int32 LTP_pred_Q14, n_LTP_Q14; opus_int32 RDmin_Q10, RDmax_Q10; opus_int32 Gain_Q10; opus_int32 *pred_lag_ptr, *shp_lag_ptr; opus_int32 a_Q12_arch[MAX_LPC_ORDER]; const int32x2_t warping_Q16_s32x2 = vdup_n_s32( silk_LSHIFT32( warping_Q16, 16 ) >> 1 ); const opus_int32 LF_shp_Q29 = silk_LSHIFT32( LF_shp_Q14, 16 ) >> 1; opus_int32 AR_shp_Q28[ MAX_SHAPE_LPC_ORDER ]; const uint32x4_t rand_multiplier_u32x4 = vdupq_n_u32( RAND_MULTIPLIER ); const uint32x4_t rand_increment_u32x4 = vdupq_n_u32( RAND_INCREMENT ); VARDECL( NSQ_samples_struct, psSampleState ); SAVE_STACK; silk_assert( nStatesDelayedDecision > 0 ); silk_assert( ( shapingLPCOrder & 1 ) == 0 ); /* check that order is even */ ALLOC( psSampleState, 2, NSQ_samples_struct ); shp_lag_ptr = &NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - lag + HARM_SHAPE_FIR_TAPS / 2 ]; pred_lag_ptr = &sLTP_Q15[ NSQ->sLTP_buf_idx - lag + LTP_ORDER / 2 ]; Gain_Q10 = silk_RSHIFT( Gain_Q16, 6 ); for( i = 0; i < ( MAX_SHAPE_LPC_ORDER - 7 ); i += 8 ) { const int16x8_t t_s16x8 = vld1q_s16( AR_shp_Q13 + i ); vst1q_s32( AR_shp_Q28 + i + 0, vshll_n_s16( vget_low_s16( t_s16x8 ), 15 ) ); vst1q_s32( AR_shp_Q28 + i + 4, vshll_n_s16( vget_high_s16( t_s16x8 ), 15 ) ); } for( ; i < MAX_SHAPE_LPC_ORDER; i++ ) { AR_shp_Q28[i] = silk_LSHIFT32( AR_shp_Q13[i], 15 ); } silk_short_prediction_create_arch_coef_neon_local( a_Q12_arch, a_Q12, predictLPCOrder ); for( i = 0; i < length; i++ ) { int32x4_t Seed_s32x4, LPC_pred_Q14_s32x4; int32x4_t sign_s32x4, tmp1_s32x4, tmp2_s32x4; int32x4_t n_AR_Q14_s32x4, n_LF_Q14_s32x4; int32x2_t AR_shp_Q28_s32x2; int16x4_t r_Q10_s16x4, rr_Q10_s16x4; /* Perform common calculations used in all states */ /* Long-term prediction */ if( signalType == TYPE_VOICED ) { /* Unrolled loop */ /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ LTP_pred_Q14 = 2; LTP_pred_Q14 = silk_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ 0 ], b_Q14[ 0 ] ); LTP_pred_Q14 = silk_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -1 ], b_Q14[ 1 ] ); LTP_pred_Q14 = silk_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -2 ], b_Q14[ 2 ] ); LTP_pred_Q14 = silk_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -3 ], b_Q14[ 3 ] ); LTP_pred_Q14 = silk_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -4 ], b_Q14[ 4 ] ); LTP_pred_Q14 = silk_LSHIFT( LTP_pred_Q14, 1 ); /* Q13 -> Q14 */ pred_lag_ptr++; } else { LTP_pred_Q14 = 0; } /* Long-term shaping */ if( lag > 0 ) { /* Symmetric, packed FIR coefficients */ n_LTP_Q14 = silk_SMULWB( silk_ADD32( shp_lag_ptr[ 0 ], shp_lag_ptr[ -2 ] ), HarmShapeFIRPacked_Q14 ); n_LTP_Q14 = silk_SMLAWT( n_LTP_Q14, shp_lag_ptr[ -1 ], HarmShapeFIRPacked_Q14 ); n_LTP_Q14 = silk_SUB_LSHIFT32( LTP_pred_Q14, n_LTP_Q14, 2 ); /* Q12 -> Q14 */ shp_lag_ptr++; } else { n_LTP_Q14 = 0; } /* Generate dither */ Seed_s32x4 = vld1q_s32( psDelDec->Seed ); Seed_s32x4 = vreinterpretq_s32_u32( vmlaq_u32( rand_increment_u32x4, vreinterpretq_u32_s32( Seed_s32x4 ), rand_multiplier_u32x4 ) ); vst1q_s32( psDelDec->Seed, Seed_s32x4 ); /* Short-term prediction */ LPC_pred_Q14_s32x4 = silk_noise_shape_quantizer_short_prediction_neon_local(psDelDec->sLPC_Q14[ NSQ_LPC_BUF_LENGTH - 16 + i ], a_Q12_arch, predictLPCOrder); LPC_pred_Q14_s32x4 = vshlq_n_s32( LPC_pred_Q14_s32x4, 4 ); /* Q10 -> Q14 */ /* Noise shape feedback */ /* Output of lowpass section */ tmp2_s32x4 = silk_SMLAWB_lane0_neon( vld1q_s32( psDelDec->Diff_Q14 ), vld1q_s32( psDelDec->sAR2_Q14[ 0 ] ), warping_Q16_s32x2 ); /* Output of allpass section */ tmp1_s32x4 = vsubq_s32( vld1q_s32( psDelDec->sAR2_Q14[ 1 ] ), tmp2_s32x4 ); tmp1_s32x4 = silk_SMLAWB_lane0_neon( vld1q_s32( psDelDec->sAR2_Q14[ 0 ] ), tmp1_s32x4, warping_Q16_s32x2 ); vst1q_s32( psDelDec->sAR2_Q14[ 0 ], tmp2_s32x4 ); AR_shp_Q28_s32x2 = vld1_s32( AR_shp_Q28 ); n_AR_Q14_s32x4 = vaddq_s32( vdupq_n_s32( silk_RSHIFT( shapingLPCOrder, 1 ) ), vqdmulhq_lane_s32( tmp2_s32x4, AR_shp_Q28_s32x2, 0 ) ); /* Loop over allpass sections */ for( j = 2; j < shapingLPCOrder; j += 2 ) { /* Output of allpass section */ tmp2_s32x4 = vsubq_s32( vld1q_s32( psDelDec->sAR2_Q14[ j + 0 ] ), tmp1_s32x4 ); tmp2_s32x4 = silk_SMLAWB_lane0_neon( vld1q_s32( psDelDec->sAR2_Q14[ j - 1 ] ), tmp2_s32x4, warping_Q16_s32x2 ); vst1q_s32( psDelDec->sAR2_Q14[ j - 1 ], tmp1_s32x4 ); n_AR_Q14_s32x4 = vaddq_s32( n_AR_Q14_s32x4, vqdmulhq_lane_s32( tmp1_s32x4, AR_shp_Q28_s32x2, 1 ) ); /* Output of allpass section */ tmp1_s32x4 = vsubq_s32( vld1q_s32( psDelDec->sAR2_Q14[ j + 1 ] ), tmp2_s32x4 ); tmp1_s32x4 = silk_SMLAWB_lane0_neon( vld1q_s32( psDelDec->sAR2_Q14[ j + 0 ] ), tmp1_s32x4, warping_Q16_s32x2 ); vst1q_s32( psDelDec->sAR2_Q14[ j + 0 ], tmp2_s32x4 ); AR_shp_Q28_s32x2 = vld1_s32( &AR_shp_Q28[ j ] ); n_AR_Q14_s32x4 = vaddq_s32( n_AR_Q14_s32x4, vqdmulhq_lane_s32( tmp2_s32x4, AR_shp_Q28_s32x2, 0 ) ); } vst1q_s32( psDelDec->sAR2_Q14[ shapingLPCOrder - 1 ], tmp1_s32x4 ); n_AR_Q14_s32x4 = vaddq_s32( n_AR_Q14_s32x4, vqdmulhq_lane_s32( tmp1_s32x4, AR_shp_Q28_s32x2, 1 ) ); n_AR_Q14_s32x4 = vshlq_n_s32( n_AR_Q14_s32x4, 1 ); /* Q11 -> Q12 */ n_AR_Q14_s32x4 = vaddq_s32( n_AR_Q14_s32x4, vqdmulhq_n_s32( vld1q_s32( psDelDec->LF_AR_Q14 ), silk_LSHIFT32( Tilt_Q14, 16 ) >> 1 ) ); /* Q12 */ n_AR_Q14_s32x4 = vshlq_n_s32( n_AR_Q14_s32x4, 2 ); /* Q12 -> Q14 */ n_LF_Q14_s32x4 = vqdmulhq_n_s32( vld1q_s32( psDelDec->Shape_Q14[ *smpl_buf_idx ] ), LF_shp_Q29 ); /* Q12 */ n_LF_Q14_s32x4 = vaddq_s32( n_LF_Q14_s32x4, vqdmulhq_n_s32( vld1q_s32( psDelDec->LF_AR_Q14 ), silk_LSHIFT32( LF_shp_Q14 >> 16 , 15 ) ) ); /* Q12 */ n_LF_Q14_s32x4 = vshlq_n_s32( n_LF_Q14_s32x4, 2 ); /* Q12 -> Q14 */ /* Input minus prediction plus noise feedback */ /* r = x[ i ] - LTP_pred - LPC_pred + n_AR + n_Tilt + n_LF + n_LTP */ tmp1_s32x4 = vaddq_s32( n_AR_Q14_s32x4, n_LF_Q14_s32x4 ); /* Q14 */ tmp2_s32x4 = vaddq_s32( vdupq_n_s32( n_LTP_Q14 ), LPC_pred_Q14_s32x4 ); /* Q13 */ tmp1_s32x4 = vsubq_s32( tmp2_s32x4, tmp1_s32x4 ); /* Q13 */ tmp1_s32x4 = vrshrq_n_s32( tmp1_s32x4, 4 ); /* Q10 */ tmp1_s32x4 = vsubq_s32( vdupq_n_s32( x_Q10[ i ] ), tmp1_s32x4 ); /* residual error Q10 */ /* Flip sign depending on dither */ sign_s32x4 = vreinterpretq_s32_u32( vcltq_s32( Seed_s32x4, vdupq_n_s32( 0 ) ) ); tmp1_s32x4 = veorq_s32( tmp1_s32x4, sign_s32x4 ); tmp1_s32x4 = vsubq_s32( tmp1_s32x4, sign_s32x4 ); tmp1_s32x4 = vmaxq_s32( tmp1_s32x4, vdupq_n_s32( -( 31 << 10 ) ) ); tmp1_s32x4 = vminq_s32( tmp1_s32x4, vdupq_n_s32( 30 << 10 ) ); r_Q10_s16x4 = vmovn_s32( tmp1_s32x4 ); /* Find two quantization level candidates and measure their rate-distortion */ { int16x4_t q1_Q10_s16x4 = vsub_s16( r_Q10_s16x4, vdup_n_s16( offset_Q10 ) ); int16x4_t q1_Q0_s16x4 = vshr_n_s16( q1_Q10_s16x4, 10 ); int16x4_t q2_Q10_s16x4; int32x4_t rd1_Q10_s32x4, rd2_Q10_s32x4; uint32x4_t t_u32x4; if( Lambda_Q10 > 2048 ) { /* For aggressive RDO, the bias becomes more than one pulse. */ const int rdo_offset = Lambda_Q10/2 - 512; const uint16x4_t greaterThanRdo = vcgt_s16( q1_Q10_s16x4, vdup_n_s16( rdo_offset ) ); const uint16x4_t lessThanMinusRdo = vclt_s16( q1_Q10_s16x4, vdup_n_s16( -rdo_offset ) ); /* If Lambda_Q10 > 32767, then q1_Q0, q1_Q10 and q2_Q10 must change to 32-bit. */ silk_assert( Lambda_Q10 <= 32767 ); q1_Q0_s16x4 = vreinterpret_s16_u16( vclt_s16( q1_Q10_s16x4, vdup_n_s16( 0 ) ) ); q1_Q0_s16x4 = vbsl_s16( greaterThanRdo, vsub_s16( q1_Q10_s16x4, vdup_n_s16( rdo_offset ) ), q1_Q0_s16x4 ); q1_Q0_s16x4 = vbsl_s16( lessThanMinusRdo, vadd_s16( q1_Q10_s16x4, vdup_n_s16( rdo_offset ) ), q1_Q0_s16x4 ); q1_Q0_s16x4 = vshr_n_s16( q1_Q0_s16x4, 10 ); } { const uint16x4_t equal0_u16x4 = vceq_s16( q1_Q0_s16x4, vdup_n_s16( 0 ) ); const uint16x4_t equalMinus1_u16x4 = vceq_s16( q1_Q0_s16x4, vdup_n_s16( -1 ) ); const uint16x4_t lessThanMinus1_u16x4 = vclt_s16( q1_Q0_s16x4, vdup_n_s16( -1 ) ); int16x4_t tmp1_s16x4, tmp2_s16x4; q1_Q10_s16x4 = vshl_n_s16( q1_Q0_s16x4, 10 ); tmp1_s16x4 = vadd_s16( q1_Q10_s16x4, vdup_n_s16( offset_Q10 - QUANT_LEVEL_ADJUST_Q10 ) ); q1_Q10_s16x4 = vadd_s16( q1_Q10_s16x4, vdup_n_s16( offset_Q10 + QUANT_LEVEL_ADJUST_Q10 ) ); q1_Q10_s16x4 = vbsl_s16( lessThanMinus1_u16x4, q1_Q10_s16x4, tmp1_s16x4 ); q1_Q10_s16x4 = vbsl_s16( equal0_u16x4, vdup_n_s16( offset_Q10 ), q1_Q10_s16x4 ); q1_Q10_s16x4 = vbsl_s16( equalMinus1_u16x4, vdup_n_s16( offset_Q10 - ( 1024 - QUANT_LEVEL_ADJUST_Q10 ) ), q1_Q10_s16x4 ); q2_Q10_s16x4 = vadd_s16( q1_Q10_s16x4, vdup_n_s16( 1024 ) ); q2_Q10_s16x4 = vbsl_s16( equal0_u16x4, vdup_n_s16( offset_Q10 + 1024 - QUANT_LEVEL_ADJUST_Q10 ), q2_Q10_s16x4 ); q2_Q10_s16x4 = vbsl_s16( equalMinus1_u16x4, vdup_n_s16( offset_Q10 ), q2_Q10_s16x4 ); tmp1_s16x4 = q1_Q10_s16x4; tmp2_s16x4 = q2_Q10_s16x4; tmp1_s16x4 = vbsl_s16( vorr_u16( equalMinus1_u16x4, lessThanMinus1_u16x4 ), vneg_s16( tmp1_s16x4 ), tmp1_s16x4 ); tmp2_s16x4 = vbsl_s16( lessThanMinus1_u16x4, vneg_s16( tmp2_s16x4 ), tmp2_s16x4 ); rd1_Q10_s32x4 = vmull_s16( tmp1_s16x4, vdup_n_s16( Lambda_Q10 ) ); rd2_Q10_s32x4 = vmull_s16( tmp2_s16x4, vdup_n_s16( Lambda_Q10 ) ); } rr_Q10_s16x4 = vsub_s16( r_Q10_s16x4, q1_Q10_s16x4 ); rd1_Q10_s32x4 = vmlal_s16( rd1_Q10_s32x4, rr_Q10_s16x4, rr_Q10_s16x4 ); rd1_Q10_s32x4 = vshrq_n_s32( rd1_Q10_s32x4, 10 ); rr_Q10_s16x4 = vsub_s16( r_Q10_s16x4, q2_Q10_s16x4 ); rd2_Q10_s32x4 = vmlal_s16( rd2_Q10_s32x4, rr_Q10_s16x4, rr_Q10_s16x4 ); rd2_Q10_s32x4 = vshrq_n_s32( rd2_Q10_s32x4, 10 ); tmp2_s32x4 = vld1q_s32( psDelDec->RD_Q10 ); tmp1_s32x4 = vaddq_s32( tmp2_s32x4, vminq_s32( rd1_Q10_s32x4, rd2_Q10_s32x4 ) ); tmp2_s32x4 = vaddq_s32( tmp2_s32x4, vmaxq_s32( rd1_Q10_s32x4, rd2_Q10_s32x4 ) ); vst1q_s32( psSampleState[ 0 ].RD_Q10, tmp1_s32x4 ); vst1q_s32( psSampleState[ 1 ].RD_Q10, tmp2_s32x4 ); t_u32x4 = vcltq_s32( rd1_Q10_s32x4, rd2_Q10_s32x4 ); tmp1_s32x4 = vbslq_s32( t_u32x4, vmovl_s16( q1_Q10_s16x4 ), vmovl_s16( q2_Q10_s16x4 ) ); tmp2_s32x4 = vbslq_s32( t_u32x4, vmovl_s16( q2_Q10_s16x4 ), vmovl_s16( q1_Q10_s16x4 ) ); vst1q_s32( psSampleState[ 0 ].Q_Q10, tmp1_s32x4 ); vst1q_s32( psSampleState[ 1 ].Q_Q10, tmp2_s32x4 ); } { /* Update states for best quantization */ int32x4_t exc_Q14_s32x4, LPC_exc_Q14_s32x4, xq_Q14_s32x4, sLF_AR_shp_Q14_s32x4; /* Quantized excitation */ exc_Q14_s32x4 = vshlq_n_s32( tmp1_s32x4, 4 ); exc_Q14_s32x4 = veorq_s32( exc_Q14_s32x4, sign_s32x4 ); exc_Q14_s32x4 = vsubq_s32( exc_Q14_s32x4, sign_s32x4 ); /* Add predictions */ LPC_exc_Q14_s32x4 = vaddq_s32( exc_Q14_s32x4, vdupq_n_s32( LTP_pred_Q14 ) ); xq_Q14_s32x4 = vaddq_s32( LPC_exc_Q14_s32x4, LPC_pred_Q14_s32x4 ); /* Update states */ tmp1_s32x4 = vsubq_s32( xq_Q14_s32x4, vshlq_n_s32( vdupq_n_s32( x_Q10[ i ] ), 4 ) ); vst1q_s32( psSampleState[ 0 ].Diff_Q14, tmp1_s32x4 ); sLF_AR_shp_Q14_s32x4 = vsubq_s32( tmp1_s32x4, n_AR_Q14_s32x4 ); vst1q_s32( psSampleState[ 0 ].sLTP_shp_Q14, vsubq_s32( sLF_AR_shp_Q14_s32x4, n_LF_Q14_s32x4 ) ); vst1q_s32( psSampleState[ 0 ].LF_AR_Q14, sLF_AR_shp_Q14_s32x4 ); vst1q_s32( psSampleState[ 0 ].LPC_exc_Q14, LPC_exc_Q14_s32x4 ); vst1q_s32( psSampleState[ 0 ].xq_Q14, xq_Q14_s32x4 ); /* Quantized excitation */ exc_Q14_s32x4 = vshlq_n_s32( tmp2_s32x4, 4 ); exc_Q14_s32x4 = veorq_s32( exc_Q14_s32x4, sign_s32x4 ); exc_Q14_s32x4 = vsubq_s32( exc_Q14_s32x4, sign_s32x4 ); /* Add predictions */ LPC_exc_Q14_s32x4 = vaddq_s32( exc_Q14_s32x4, vdupq_n_s32( LTP_pred_Q14 ) ); xq_Q14_s32x4 = vaddq_s32( LPC_exc_Q14_s32x4, LPC_pred_Q14_s32x4 ); /* Update states */ tmp1_s32x4 = vsubq_s32( xq_Q14_s32x4, vshlq_n_s32( vdupq_n_s32( x_Q10[ i ] ), 4 ) ); vst1q_s32( psSampleState[ 1 ].Diff_Q14, tmp1_s32x4 ); sLF_AR_shp_Q14_s32x4 = vsubq_s32( tmp1_s32x4, n_AR_Q14_s32x4 ); vst1q_s32( psSampleState[ 1 ].sLTP_shp_Q14, vsubq_s32( sLF_AR_shp_Q14_s32x4, n_LF_Q14_s32x4 ) ); vst1q_s32( psSampleState[ 1 ].LF_AR_Q14, sLF_AR_shp_Q14_s32x4 ); vst1q_s32( psSampleState[ 1 ].LPC_exc_Q14, LPC_exc_Q14_s32x4 ); vst1q_s32( psSampleState[ 1 ].xq_Q14, xq_Q14_s32x4 ); } *smpl_buf_idx = *smpl_buf_idx ? ( *smpl_buf_idx - 1 ) : ( DECISION_DELAY - 1); last_smple_idx = *smpl_buf_idx + decisionDelay + DECISION_DELAY; if( last_smple_idx >= DECISION_DELAY ) last_smple_idx -= DECISION_DELAY; if( last_smple_idx >= DECISION_DELAY ) last_smple_idx -= DECISION_DELAY; /* Find winner */ RDmin_Q10 = psSampleState[ 0 ].RD_Q10[ 0 ]; Winner_ind = 0; for( k = 1; k < nStatesDelayedDecision; k++ ) { if( psSampleState[ 0 ].RD_Q10[ k ] < RDmin_Q10 ) { RDmin_Q10 = psSampleState[ 0 ].RD_Q10[ k ]; Winner_ind = k; } } /* Increase RD values of expired states */ { uint32x4_t t_u32x4; Winner_rand_state = psDelDec->RandState[ last_smple_idx ][ Winner_ind ]; t_u32x4 = vceqq_s32( vld1q_s32( psDelDec->RandState[ last_smple_idx ] ), vdupq_n_s32( Winner_rand_state ) ); t_u32x4 = vmvnq_u32( t_u32x4 ); t_u32x4 = vshrq_n_u32( t_u32x4, 5 ); tmp1_s32x4 = vld1q_s32( psSampleState[ 0 ].RD_Q10 ); tmp2_s32x4 = vld1q_s32( psSampleState[ 1 ].RD_Q10 ); tmp1_s32x4 = vaddq_s32( tmp1_s32x4, vreinterpretq_s32_u32( t_u32x4 ) ); tmp2_s32x4 = vaddq_s32( tmp2_s32x4, vreinterpretq_s32_u32( t_u32x4 ) ); vst1q_s32( psSampleState[ 0 ].RD_Q10, tmp1_s32x4 ); vst1q_s32( psSampleState[ 1 ].RD_Q10, tmp2_s32x4 ); /* Find worst in first set and best in second set */ RDmax_Q10 = psSampleState[ 0 ].RD_Q10[ 0 ]; RDmin_Q10 = psSampleState[ 1 ].RD_Q10[ 0 ]; RDmax_ind = 0; RDmin_ind = 0; for( k = 1; k < nStatesDelayedDecision; k++ ) { /* find worst in first set */ if( psSampleState[ 0 ].RD_Q10[ k ] > RDmax_Q10 ) { RDmax_Q10 = psSampleState[ 0 ].RD_Q10[ k ]; RDmax_ind = k; } /* find best in second set */ if( psSampleState[ 1 ].RD_Q10[ k ] < RDmin_Q10 ) { RDmin_Q10 = psSampleState[ 1 ].RD_Q10[ k ]; RDmin_ind = k; } } } /* Replace a state if best from second set outperforms worst in first set */ if( RDmin_Q10 < RDmax_Q10 ) { opus_int32 (*ptr)[NEON_MAX_DEL_DEC_STATES] = psDelDec->RandState; const int numOthers = (int)( ( sizeof( NSQ_del_decs_struct ) - sizeof( ( (NSQ_del_decs_struct *)0 )->sLPC_Q14 ) ) / ( NEON_MAX_DEL_DEC_STATES * sizeof( opus_int32 ) ) ); /* Only ( predictLPCOrder - 1 ) of sLPC_Q14 buffer need to be updated, though the first several */ /* useless sLPC_Q14[] will be different comparing with C when predictLPCOrder < NSQ_LPC_BUF_LENGTH. */ /* Here just update constant ( NSQ_LPC_BUF_LENGTH - 1 ) for simplicity. */ for( j = i + 1; j < i + NSQ_LPC_BUF_LENGTH; j++ ) { psDelDec->sLPC_Q14[ j ][ RDmax_ind ] = psDelDec->sLPC_Q14[ j ][ RDmin_ind ]; } for( j = 0; j < numOthers; j++ ) { ptr[ j ][ RDmax_ind ] = ptr[ j ][ RDmin_ind ]; } psSampleState[ 0 ].Q_Q10[ RDmax_ind ] = psSampleState[ 1 ].Q_Q10[ RDmin_ind ]; psSampleState[ 0 ].RD_Q10[ RDmax_ind ] = psSampleState[ 1 ].RD_Q10[ RDmin_ind ]; psSampleState[ 0 ].xq_Q14[ RDmax_ind ] = psSampleState[ 1 ].xq_Q14[ RDmin_ind ]; psSampleState[ 0 ].LF_AR_Q14[ RDmax_ind ] = psSampleState[ 1 ].LF_AR_Q14[ RDmin_ind ]; psSampleState[ 0 ].Diff_Q14[ RDmax_ind ] = psSampleState[ 1 ].Diff_Q14[ RDmin_ind ]; psSampleState[ 0 ].sLTP_shp_Q14[ RDmax_ind ] = psSampleState[ 1 ].sLTP_shp_Q14[ RDmin_ind ]; psSampleState[ 0 ].LPC_exc_Q14[ RDmax_ind ] = psSampleState[ 1 ].LPC_exc_Q14[ RDmin_ind ]; } /* Write samples from winner to output and long-term filter states */ if( subfr > 0 || i >= decisionDelay ) { pulses[ i - decisionDelay ] = (opus_int8)silk_RSHIFT_ROUND( psDelDec->Q_Q10[ last_smple_idx ][ Winner_ind ], 10 ); xq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( psDelDec->Xq_Q14[ last_smple_idx ][ Winner_ind ], delayedGain_Q10[ last_smple_idx ] ), 8 ) ); NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - decisionDelay ] = psDelDec->Shape_Q14[ last_smple_idx ][ Winner_ind ]; sLTP_Q15[ NSQ->sLTP_buf_idx - decisionDelay ] = psDelDec->Pred_Q15[ last_smple_idx ][ Winner_ind ]; } NSQ->sLTP_shp_buf_idx++; NSQ->sLTP_buf_idx++; /* Update states */ vst1q_s32( psDelDec->LF_AR_Q14, vld1q_s32( psSampleState[ 0 ].LF_AR_Q14 ) ); vst1q_s32( psDelDec->Diff_Q14, vld1q_s32( psSampleState[ 0 ].Diff_Q14 ) ); vst1q_s32( psDelDec->sLPC_Q14[ NSQ_LPC_BUF_LENGTH + i ], vld1q_s32( psSampleState[ 0 ].xq_Q14 ) ); vst1q_s32( psDelDec->Xq_Q14[ *smpl_buf_idx ], vld1q_s32( psSampleState[ 0 ].xq_Q14 ) ); tmp1_s32x4 = vld1q_s32( psSampleState[ 0 ].Q_Q10 ); vst1q_s32( psDelDec->Q_Q10[ *smpl_buf_idx ], tmp1_s32x4 ); vst1q_s32( psDelDec->Pred_Q15[ *smpl_buf_idx ], vshlq_n_s32( vld1q_s32( psSampleState[ 0 ].LPC_exc_Q14 ), 1 ) ); vst1q_s32( psDelDec->Shape_Q14[ *smpl_buf_idx ], vld1q_s32( psSampleState[ 0 ].sLTP_shp_Q14 ) ); tmp1_s32x4 = vrshrq_n_s32( tmp1_s32x4, 10 ); tmp1_s32x4 = vaddq_s32( vld1q_s32( psDelDec->Seed ), tmp1_s32x4 ); vst1q_s32( psDelDec->Seed, tmp1_s32x4 ); vst1q_s32( psDelDec->RandState[ *smpl_buf_idx ], tmp1_s32x4 ); vst1q_s32( psDelDec->RD_Q10, vld1q_s32( psSampleState[ 0 ].RD_Q10 ) ); delayedGain_Q10[ *smpl_buf_idx ] = Gain_Q10; } /* Update LPC states */ silk_memcpy( psDelDec->sLPC_Q14[ 0 ], psDelDec->sLPC_Q14[ length ], NEON_MAX_DEL_DEC_STATES * NSQ_LPC_BUF_LENGTH * sizeof( opus_int32 ) ); RESTORE_STACK; } static OPUS_INLINE void silk_SMULWB_8_neon( const opus_int16 *a, const int32x2_t b, opus_int32 *o ) { const int16x8_t a_s16x8 = vld1q_s16( a ); int32x4_t o0_s32x4, o1_s32x4; o0_s32x4 = vshll_n_s16( vget_low_s16( a_s16x8 ), 15 ); o1_s32x4 = vshll_n_s16( vget_high_s16( a_s16x8 ), 15 ); o0_s32x4 = vqdmulhq_lane_s32( o0_s32x4, b, 0 ); o1_s32x4 = vqdmulhq_lane_s32( o1_s32x4, b, 0 ); vst1q_s32( o, o0_s32x4 ); vst1q_s32( o + 4, o1_s32x4 ); } /* Only works when ( b >= -65536 ) && ( b < 65536 ). */ static OPUS_INLINE void silk_SMULWW_small_b_4_neon( opus_int32 *a, const int32x2_t b_s32x2) { int32x4_t o_s32x4; o_s32x4 = vld1q_s32( a ); o_s32x4 = vqdmulhq_lane_s32( o_s32x4, b_s32x2, 0 ); vst1q_s32( a, o_s32x4 ); } /* Only works when ( b >= -65536 ) && ( b < 65536 ). */ static OPUS_INLINE void silk_SMULWW_small_b_8_neon( opus_int32 *a, const int32x2_t b_s32x2 ) { int32x4_t o0_s32x4, o1_s32x4; o0_s32x4 = vld1q_s32( a ); o1_s32x4 = vld1q_s32( a + 4 ); o0_s32x4 = vqdmulhq_lane_s32( o0_s32x4, b_s32x2, 0 ); o1_s32x4 = vqdmulhq_lane_s32( o1_s32x4, b_s32x2, 0 ); vst1q_s32( a, o0_s32x4 ); vst1q_s32( a + 4, o1_s32x4 ); } static OPUS_INLINE void silk_SMULWW_4_neon( opus_int32 *a, const int32x2_t b_s32x2) { int32x4_t a_s32x4, o_s32x4; a_s32x4 = vld1q_s32( a ); o_s32x4 = vqdmulhq_lane_s32( a_s32x4, b_s32x2, 0 ); o_s32x4 = vmlaq_lane_s32( o_s32x4, a_s32x4, b_s32x2, 1 ); vst1q_s32( a, o_s32x4 ); } static OPUS_INLINE void silk_SMULWW_8_neon( opus_int32 *a, const int32x2_t b_s32x2 ) { int32x4_t a0_s32x4, a1_s32x4, o0_s32x4, o1_s32x4; a0_s32x4 = vld1q_s32( a ); a1_s32x4 = vld1q_s32( a + 4 ); o0_s32x4 = vqdmulhq_lane_s32( a0_s32x4, b_s32x2, 0 ); o1_s32x4 = vqdmulhq_lane_s32( a1_s32x4, b_s32x2, 0 ); o0_s32x4 = vmlaq_lane_s32( o0_s32x4, a0_s32x4, b_s32x2, 1 ); o1_s32x4 = vmlaq_lane_s32( o1_s32x4, a1_s32x4, b_s32x2, 1 ); vst1q_s32( a, o0_s32x4 ); vst1q_s32( a + 4, o1_s32x4 ); } static OPUS_INLINE void silk_SMULWW_loop_neon( const opus_int16 *a, const opus_int32 b, opus_int32 *o, const opus_int loop_num ) { opus_int i; int32x2_t b_s32x2; b_s32x2 = vdup_n_s32( b ); for( i = 0; i < loop_num - 7; i += 8 ) { silk_SMULWB_8_neon( a + i, b_s32x2, o + i ); } for( ; i < loop_num; i++ ) { o[ i ] = silk_SMULWW( a[ i ], b ); } } static OPUS_INLINE void silk_nsq_del_dec_scale_states_neon( const silk_encoder_state *psEncC, /* I Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ NSQ_del_decs_struct psDelDec[], /* I/O Delayed decision states */ const opus_int16 x16[], /* I Input */ opus_int32 x_sc_Q10[], /* O Input scaled with 1/Gain in Q10 */ const opus_int16 sLTP[], /* I Re-whitened LTP state in Q0 */ opus_int32 sLTP_Q15[], /* O LTP state matching scaled input */ opus_int subfr, /* I Subframe number */ const opus_int LTP_scale_Q14, /* I LTP state scaling */ const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I */ const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag */ const opus_int signal_type, /* I Signal type */ const opus_int decisionDelay /* I Decision delay */ ) { opus_int i, lag; opus_int32 gain_adj_Q16, inv_gain_Q31, inv_gain_Q26; lag = pitchL[ subfr ]; inv_gain_Q31 = silk_INVERSE32_varQ( silk_max( Gains_Q16[ subfr ], 1 ), 47 ); silk_assert( inv_gain_Q31 != 0 ); /* Scale input */ inv_gain_Q26 = silk_RSHIFT_ROUND( inv_gain_Q31, 5 ); silk_SMULWW_loop_neon( x16, inv_gain_Q26, x_sc_Q10, psEncC->subfr_length ); /* After rewhitening the LTP state is un-scaled, so scale with inv_gain_Q16 */ if( NSQ->rewhite_flag ) { if( subfr == 0 ) { /* Do LTP downscaling */ inv_gain_Q31 = silk_LSHIFT( silk_SMULWB( inv_gain_Q31, LTP_scale_Q14 ), 2 ); } silk_SMULWW_loop_neon( sLTP + NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2, inv_gain_Q31, sLTP_Q15 + NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2, lag + LTP_ORDER / 2 ); } /* Adjust for changing gain */ if( Gains_Q16[ subfr ] != NSQ->prev_gain_Q16 ) { int32x2_t gain_adj_Q16_s32x2; gain_adj_Q16 = silk_DIV32_varQ( NSQ->prev_gain_Q16, Gains_Q16[ subfr ], 16 ); /* Scale long-term shaping state */ if( ( gain_adj_Q16 >= -65536 ) && ( gain_adj_Q16 < 65536 ) ) { gain_adj_Q16_s32x2 = vdup_n_s32( silk_LSHIFT32( gain_adj_Q16, 15 ) ); for( i = NSQ->sLTP_shp_buf_idx - psEncC->ltp_mem_length; i < NSQ->sLTP_shp_buf_idx - 7; i += 8 ) { silk_SMULWW_small_b_8_neon( NSQ->sLTP_shp_Q14 + i, gain_adj_Q16_s32x2 ); } for( ; i < NSQ->sLTP_shp_buf_idx; i++ ) { NSQ->sLTP_shp_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sLTP_shp_Q14[ i ] ); } /* Scale long-term prediction state */ if( signal_type == TYPE_VOICED && NSQ->rewhite_flag == 0 ) { for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx - decisionDelay - 7; i += 8 ) { silk_SMULWW_small_b_8_neon( sLTP_Q15 + i, gain_adj_Q16_s32x2 ); } for( ; i < NSQ->sLTP_buf_idx - decisionDelay; i++ ) { sLTP_Q15[ i ] = silk_SMULWW( gain_adj_Q16, sLTP_Q15[ i ] ); } } /* Scale scalar states */ silk_SMULWW_small_b_4_neon( psDelDec->LF_AR_Q14, gain_adj_Q16_s32x2 ); silk_SMULWW_small_b_4_neon( psDelDec->Diff_Q14, gain_adj_Q16_s32x2 ); /* Scale short-term prediction and shaping states */ for( i = 0; i < NSQ_LPC_BUF_LENGTH; i++ ) { silk_SMULWW_small_b_4_neon( psDelDec->sLPC_Q14[ i ], gain_adj_Q16_s32x2 ); } for( i = 0; i < MAX_SHAPE_LPC_ORDER; i++ ) { silk_SMULWW_small_b_4_neon( psDelDec->sAR2_Q14[ i ], gain_adj_Q16_s32x2 ); } for( i = 0; i < DECISION_DELAY; i++ ) { silk_SMULWW_small_b_4_neon( psDelDec->Pred_Q15[ i ], gain_adj_Q16_s32x2 ); silk_SMULWW_small_b_4_neon( psDelDec->Shape_Q14[ i ], gain_adj_Q16_s32x2 ); } } else { gain_adj_Q16_s32x2 = vdup_n_s32( silk_LSHIFT32( gain_adj_Q16 & 0x0000FFFF, 15 ) ); gain_adj_Q16_s32x2 = vset_lane_s32( gain_adj_Q16 >> 16, gain_adj_Q16_s32x2, 1 ); for( i = NSQ->sLTP_shp_buf_idx - psEncC->ltp_mem_length; i < NSQ->sLTP_shp_buf_idx - 7; i += 8 ) { silk_SMULWW_8_neon( NSQ->sLTP_shp_Q14 + i, gain_adj_Q16_s32x2 ); } for( ; i < NSQ->sLTP_shp_buf_idx; i++ ) { NSQ->sLTP_shp_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sLTP_shp_Q14[ i ] ); } /* Scale long-term prediction state */ if( signal_type == TYPE_VOICED && NSQ->rewhite_flag == 0 ) { for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx - decisionDelay - 7; i += 8 ) { silk_SMULWW_8_neon( sLTP_Q15 + i, gain_adj_Q16_s32x2 ); } for( ; i < NSQ->sLTP_buf_idx - decisionDelay; i++ ) { sLTP_Q15[ i ] = silk_SMULWW( gain_adj_Q16, sLTP_Q15[ i ] ); } } /* Scale scalar states */ silk_SMULWW_4_neon( psDelDec->LF_AR_Q14, gain_adj_Q16_s32x2 ); silk_SMULWW_4_neon( psDelDec->Diff_Q14, gain_adj_Q16_s32x2 ); /* Scale short-term prediction and shaping states */ for( i = 0; i < NSQ_LPC_BUF_LENGTH; i++ ) { silk_SMULWW_4_neon( psDelDec->sLPC_Q14[ i ], gain_adj_Q16_s32x2 ); } for( i = 0; i < MAX_SHAPE_LPC_ORDER; i++ ) { silk_SMULWW_4_neon( psDelDec->sAR2_Q14[ i ], gain_adj_Q16_s32x2 ); } for( i = 0; i < DECISION_DELAY; i++ ) { silk_SMULWW_4_neon( psDelDec->Pred_Q15[ i ], gain_adj_Q16_s32x2 ); silk_SMULWW_4_neon( psDelDec->Shape_Q14[ i ], gain_adj_Q16_s32x2 ); } } /* Save inverse gain */ NSQ->prev_gain_Q16 = Gains_Q16[ subfr ]; } } mumble-1.3.4/3rdparty/opus-src/silk/arm/arm_silk_map.c0000664000175000017500000001674214010707327022521 0ustar builderbuilder/*********************************************************************** Copyright (C) 2014 Vidyo Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "main_FIX.h" #include "NSQ.h" #include "SigProc_FIX.h" #if defined(OPUS_HAVE_RTCD) # if (defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && \ !defined(OPUS_ARM_PRESUME_NEON_INTR)) void (*const SILK_BIQUAD_ALT_STRIDE2_IMPL[OPUS_ARCHMASK + 1])( const opus_int16 *in, /* I input signal */ const opus_int32 *B_Q28, /* I MA coefficients [3] */ const opus_int32 *A_Q28, /* I AR coefficients [2] */ opus_int32 *S, /* I/O State vector [4] */ opus_int16 *out, /* O output signal */ const opus_int32 len /* I signal length (must be even) */ ) = { silk_biquad_alt_stride2_c, /* ARMv4 */ silk_biquad_alt_stride2_c, /* EDSP */ silk_biquad_alt_stride2_c, /* Media */ silk_biquad_alt_stride2_neon, /* Neon */ }; opus_int32 (*const SILK_LPC_INVERSE_PRED_GAIN_IMPL[OPUS_ARCHMASK + 1])( /* O Returns inverse prediction gain in energy domain, Q30 */ const opus_int16 *A_Q12, /* I Prediction coefficients, Q12 [order] */ const opus_int order /* I Prediction order */ ) = { silk_LPC_inverse_pred_gain_c, /* ARMv4 */ silk_LPC_inverse_pred_gain_c, /* EDSP */ silk_LPC_inverse_pred_gain_c, /* Media */ silk_LPC_inverse_pred_gain_neon, /* Neon */ }; void (*const SILK_NSQ_DEL_DEC_IMPL[OPUS_ARCHMASK + 1])( const silk_encoder_state *psEncC, /* I Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ SideInfoIndices *psIndices, /* I/O Quantization Indices */ const opus_int16 x16[], /* I Input */ opus_int8 pulses[], /* O Quantized pulse signal */ const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */ const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */ const opus_int16 AR_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */ const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */ const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */ const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I Quantization step sizes */ const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */ const opus_int Lambda_Q10, /* I Rate/distortion tradeoff */ const opus_int LTP_scale_Q14 /* I LTP state scaling */ ) = { silk_NSQ_del_dec_c, /* ARMv4 */ silk_NSQ_del_dec_c, /* EDSP */ silk_NSQ_del_dec_c, /* Media */ silk_NSQ_del_dec_neon, /* Neon */ }; /*There is no table for silk_noise_shape_quantizer_short_prediction because the NEON version takes different parameters than the C version. Instead RTCD is done via if statements at the call sites. See NSQ_neon.h for details.*/ opus_int32 (*const SILK_NSQ_NOISE_SHAPE_FEEDBACK_LOOP_IMPL[OPUS_ARCHMASK+1])( const opus_int32 *data0, opus_int32 *data1, const opus_int16 *coef, opus_int order) = { silk_NSQ_noise_shape_feedback_loop_c, /* ARMv4 */ silk_NSQ_noise_shape_feedback_loop_c, /* EDSP */ silk_NSQ_noise_shape_feedback_loop_c, /* Media */ silk_NSQ_noise_shape_feedback_loop_neon, /* NEON */ }; # endif # if defined(FIXED_POINT) && \ defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR) void (*const SILK_WARPED_AUTOCORRELATION_FIX_IMPL[OPUS_ARCHMASK + 1])( opus_int32 *corr, /* O Result [order + 1] */ opus_int *scale, /* O Scaling of the correlation vector */ const opus_int16 *input, /* I Input data to correlate */ const opus_int warping_Q16, /* I Warping coefficient */ const opus_int length, /* I Length of input */ const opus_int order /* I Correlation order (even) */ ) = { silk_warped_autocorrelation_FIX_c, /* ARMv4 */ silk_warped_autocorrelation_FIX_c, /* EDSP */ silk_warped_autocorrelation_FIX_c, /* Media */ silk_warped_autocorrelation_FIX_neon, /* Neon */ }; # endif #endif /* OPUS_HAVE_RTCD */ mumble-1.3.4/3rdparty/opus-src/silk/arm/NSQ_neon.c0000664000175000017500000001130014010707327021524 0ustar builderbuilder/*********************************************************************** Copyright (C) 2014 Vidyo Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "main.h" #include "stack_alloc.h" #include "NSQ.h" #include "celt/cpu_support.h" #include "celt/arm/armcpu.h" opus_int32 silk_noise_shape_quantizer_short_prediction_neon(const opus_int32 *buf32, const opus_int32 *coef32, opus_int order) { int32x4_t coef0 = vld1q_s32(coef32); int32x4_t coef1 = vld1q_s32(coef32 + 4); int32x4_t coef2 = vld1q_s32(coef32 + 8); int32x4_t coef3 = vld1q_s32(coef32 + 12); int32x4_t a0 = vld1q_s32(buf32 - 15); int32x4_t a1 = vld1q_s32(buf32 - 11); int32x4_t a2 = vld1q_s32(buf32 - 7); int32x4_t a3 = vld1q_s32(buf32 - 3); int32x4_t b0 = vqdmulhq_s32(coef0, a0); int32x4_t b1 = vqdmulhq_s32(coef1, a1); int32x4_t b2 = vqdmulhq_s32(coef2, a2); int32x4_t b3 = vqdmulhq_s32(coef3, a3); int32x4_t c0 = vaddq_s32(b0, b1); int32x4_t c1 = vaddq_s32(b2, b3); int32x4_t d = vaddq_s32(c0, c1); int64x2_t e = vpaddlq_s32(d); int64x1_t f = vadd_s64(vget_low_s64(e), vget_high_s64(e)); opus_int32 out = vget_lane_s32(vreinterpret_s32_s64(f), 0); out += silk_RSHIFT( order, 1 ); return out; } opus_int32 silk_NSQ_noise_shape_feedback_loop_neon(const opus_int32 *data0, opus_int32 *data1, const opus_int16 *coef, opus_int order) { opus_int32 out; if (order == 8) { int32x4_t a00 = vdupq_n_s32(data0[0]); int32x4_t a01 = vld1q_s32(data1); /* data1[0] ... [3] */ int32x4_t a0 = vextq_s32 (a00, a01, 3); /* data0[0] data1[0] ...[2] */ int32x4_t a1 = vld1q_s32(data1 + 3); /* data1[3] ... [6] */ /*TODO: Convert these once in advance instead of once per sample, like silk_noise_shape_quantizer_short_prediction_neon() does.*/ int16x8_t coef16 = vld1q_s16(coef); int32x4_t coef0 = vmovl_s16(vget_low_s16(coef16)); int32x4_t coef1 = vmovl_s16(vget_high_s16(coef16)); /*This is not bit-exact with the C version, since we do not drop the lower 16 bits of each multiply, but wait until the end to truncate precision. This is an encoder-specific calculation (and unlike silk_noise_shape_quantizer_short_prediction_neon(), is not meant to simulate what the decoder will do). We still could use vqdmulhq_s32() like silk_noise_shape_quantizer_short_prediction_neon() and save half the multiplies, but the speed difference is not large, since we then need two extra adds.*/ int64x2_t b0 = vmull_s32(vget_low_s32(a0), vget_low_s32(coef0)); int64x2_t b1 = vmlal_s32(b0, vget_high_s32(a0), vget_high_s32(coef0)); int64x2_t b2 = vmlal_s32(b1, vget_low_s32(a1), vget_low_s32(coef1)); int64x2_t b3 = vmlal_s32(b2, vget_high_s32(a1), vget_high_s32(coef1)); int64x1_t c = vadd_s64(vget_low_s64(b3), vget_high_s64(b3)); int64x1_t cS = vrshr_n_s64(c, 15); int32x2_t d = vreinterpret_s32_s64(cS); out = vget_lane_s32(d, 0); vst1q_s32(data1, a0); vst1q_s32(data1 + 4, a1); return out; } return silk_NSQ_noise_shape_feedback_loop_c(data0, data1, coef, order); } mumble-1.3.4/3rdparty/opus-src/silk/arm/macros_armv4.h0000664000175000017500000000737314010707327022465 0ustar builderbuilder/*********************************************************************** Copyright (C) 2013 Xiph.Org Foundation and contributors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef SILK_MACROS_ARMv4_H #define SILK_MACROS_ARMv4_H /* This macro only avoids the undefined behaviour from a left shift of a negative value. It should only be used in macros that can't include SigProc_FIX.h. In other cases, use silk_LSHIFT32(). */ #define SAFE_SHL(a,b) ((opus_int32)((opus_uint32)(a) << (b))) /* (a32 * (opus_int32)((opus_int16)(b32))) >> 16 output have to be 32bit int */ #undef silk_SMULWB static OPUS_INLINE opus_int32 silk_SMULWB_armv4(opus_int32 a, opus_int16 b) { unsigned rd_lo; int rd_hi; __asm__( "#silk_SMULWB\n\t" "smull %0, %1, %2, %3\n\t" : "=&r"(rd_lo), "=&r"(rd_hi) : "%r"(a), "r"(SAFE_SHL(b,16)) ); return rd_hi; } #define silk_SMULWB(a, b) (silk_SMULWB_armv4(a, b)) /* a32 + (b32 * (opus_int32)((opus_int16)(c32))) >> 16 output have to be 32bit int */ #undef silk_SMLAWB #define silk_SMLAWB(a, b, c) ((a) + silk_SMULWB(b, c)) /* (a32 * (b32 >> 16)) >> 16 */ #undef silk_SMULWT static OPUS_INLINE opus_int32 silk_SMULWT_armv4(opus_int32 a, opus_int32 b) { unsigned rd_lo; int rd_hi; __asm__( "#silk_SMULWT\n\t" "smull %0, %1, %2, %3\n\t" : "=&r"(rd_lo), "=&r"(rd_hi) : "%r"(a), "r"(b&~0xFFFF) ); return rd_hi; } #define silk_SMULWT(a, b) (silk_SMULWT_armv4(a, b)) /* a32 + (b32 * (c32 >> 16)) >> 16 */ #undef silk_SMLAWT #define silk_SMLAWT(a, b, c) ((a) + silk_SMULWT(b, c)) /* (a32 * b32) >> 16 */ #undef silk_SMULWW static OPUS_INLINE opus_int32 silk_SMULWW_armv4(opus_int32 a, opus_int32 b) { unsigned rd_lo; int rd_hi; __asm__( "#silk_SMULWW\n\t" "smull %0, %1, %2, %3\n\t" : "=&r"(rd_lo), "=&r"(rd_hi) : "%r"(a), "r"(b) ); return SAFE_SHL(rd_hi,16)+(rd_lo>>16); } #define silk_SMULWW(a, b) (silk_SMULWW_armv4(a, b)) #undef silk_SMLAWW static OPUS_INLINE opus_int32 silk_SMLAWW_armv4(opus_int32 a, opus_int32 b, opus_int32 c) { unsigned rd_lo; int rd_hi; __asm__( "#silk_SMLAWW\n\t" "smull %0, %1, %2, %3\n\t" : "=&r"(rd_lo), "=&r"(rd_hi) : "%r"(b), "r"(c) ); return a+SAFE_SHL(rd_hi,16)+(rd_lo>>16); } #define silk_SMLAWW(a, b, c) (silk_SMLAWW_armv4(a, b, c)) #undef SAFE_SHL #endif /* SILK_MACROS_ARMv4_H */ mumble-1.3.4/3rdparty/opus-src/silk/arm/macros_arm64.h0000664000175000017500000000352614010707327022361 0ustar builderbuilder/*********************************************************************** Copyright (C) 2015 Vidyo Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef SILK_MACROS_ARM64_H #define SILK_MACROS_ARM64_H #include #undef silk_ADD_SAT32 #define silk_ADD_SAT32(a, b) (vqadds_s32((a), (b))) #undef silk_SUB_SAT32 #define silk_SUB_SAT32(a, b) (vqsubs_s32((a), (b))) #endif /* SILK_MACROS_ARM64_H */ mumble-1.3.4/3rdparty/opus-src/silk/arm/LPC_inv_pred_gain_arm.h0000664000175000017500000000625314010707327024225 0ustar builderbuilder/*********************************************************************** Copyright (c) 2017 Google Inc. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef SILK_LPC_INV_PRED_GAIN_ARM_H # define SILK_LPC_INV_PRED_GAIN_ARM_H # include "celt/arm/armcpu.h" # if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) opus_int32 silk_LPC_inverse_pred_gain_neon( /* O Returns inverse prediction gain in energy domain, Q30 */ const opus_int16 *A_Q12, /* I Prediction coefficients, Q12 [order] */ const opus_int order /* I Prediction order */ ); # if !defined(OPUS_HAVE_RTCD) && defined(OPUS_ARM_PRESUME_NEON) # define OVERRIDE_silk_LPC_inverse_pred_gain (1) # define silk_LPC_inverse_pred_gain(A_Q12, order, arch) ((void)(arch), PRESUME_NEON(silk_LPC_inverse_pred_gain)(A_Q12, order)) # endif # endif # if !defined(OVERRIDE_silk_LPC_inverse_pred_gain) /*Is run-time CPU detection enabled on this platform?*/ # if defined(OPUS_HAVE_RTCD) && (defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR)) extern opus_int32 (*const SILK_LPC_INVERSE_PRED_GAIN_IMPL[OPUS_ARCHMASK+1])(const opus_int16 *A_Q12, const opus_int order); # define OVERRIDE_silk_LPC_inverse_pred_gain (1) # define silk_LPC_inverse_pred_gain(A_Q12, order, arch) ((*SILK_LPC_INVERSE_PRED_GAIN_IMPL[(arch)&OPUS_ARCHMASK])(A_Q12, order)) # elif defined(OPUS_ARM_PRESUME_NEON_INTR) # define OVERRIDE_silk_LPC_inverse_pred_gain (1) # define silk_LPC_inverse_pred_gain(A_Q12, order, arch) ((void)(arch), silk_LPC_inverse_pred_gain_neon(A_Q12, order)) # endif # endif #endif /* end SILK_LPC_INV_PRED_GAIN_ARM_H */ mumble-1.3.4/3rdparty/opus-src/silk/arm/SigProc_FIX_armv5e.h0000664000175000017500000000452614010707327023420 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Copyright (c) 2013 Parrot Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef SILK_SIGPROC_FIX_ARMv5E_H #define SILK_SIGPROC_FIX_ARMv5E_H #undef silk_SMULTT static OPUS_INLINE opus_int32 silk_SMULTT_armv5e(opus_int32 a, opus_int32 b) { opus_int32 res; __asm__( "#silk_SMULTT\n\t" "smultt %0, %1, %2\n\t" : "=r"(res) : "%r"(a), "r"(b) ); return res; } #define silk_SMULTT(a, b) (silk_SMULTT_armv5e(a, b)) #undef silk_SMLATT static OPUS_INLINE opus_int32 silk_SMLATT_armv5e(opus_int32 a, opus_int32 b, opus_int32 c) { opus_int32 res; __asm__( "#silk_SMLATT\n\t" "smlatt %0, %1, %2, %3\n\t" : "=r"(res) : "%r"(b), "r"(c), "r"(a) ); return res; } #define silk_SMLATT(a, b, c) (silk_SMLATT_armv5e(a, b, c)) #endif mumble-1.3.4/3rdparty/opus-src/silk/arm/NSQ_del_dec_arm.h0000664000175000017500000001255614010707327023026 0ustar builderbuilder/*********************************************************************** Copyright (c) 2017 Google Inc. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef SILK_NSQ_DEL_DEC_ARM_H #define SILK_NSQ_DEL_DEC_ARM_H #include "celt/arm/armcpu.h" #if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) void silk_NSQ_del_dec_neon( const silk_encoder_state *psEncC, silk_nsq_state *NSQ, SideInfoIndices *psIndices, const opus_int16 x16[], opus_int8 pulses[], const opus_int16 PredCoef_Q12[2 * MAX_LPC_ORDER], const opus_int16 LTPCoef_Q14[LTP_ORDER * MAX_NB_SUBFR], const opus_int16 AR_Q13[MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER], const opus_int HarmShapeGain_Q14[MAX_NB_SUBFR], const opus_int Tilt_Q14[MAX_NB_SUBFR], const opus_int32 LF_shp_Q14[MAX_NB_SUBFR], const opus_int32 Gains_Q16[MAX_NB_SUBFR], const opus_int pitchL[MAX_NB_SUBFR], const opus_int Lambda_Q10, const opus_int LTP_scale_Q14); #if !defined(OPUS_HAVE_RTCD) #define OVERRIDE_silk_NSQ_del_dec (1) #define silk_NSQ_del_dec(psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, \ LTPCoef_Q14, AR_Q13, HarmShapeGain_Q14, Tilt_Q14, \ LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, \ LTP_scale_Q14, arch) \ ((void)(arch), \ PRESUME_NEON(silk_NSQ_del_dec)( \ psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, LTPCoef_Q14, \ AR_Q13, HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, \ Lambda_Q10, LTP_scale_Q14)) #endif #endif #if !defined(OVERRIDE_silk_NSQ_del_dec) /*Is run-time CPU detection enabled on this platform?*/ #if defined(OPUS_HAVE_RTCD) && (defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && \ !defined(OPUS_ARM_PRESUME_NEON_INTR)) extern void (*const SILK_NSQ_DEL_DEC_IMPL[OPUS_ARCHMASK + 1])( const silk_encoder_state *psEncC, silk_nsq_state *NSQ, SideInfoIndices *psIndices, const opus_int16 x16[], opus_int8 pulses[], const opus_int16 PredCoef_Q12[2 * MAX_LPC_ORDER], const opus_int16 LTPCoef_Q14[LTP_ORDER * MAX_NB_SUBFR], const opus_int16 AR_Q13[MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER], const opus_int HarmShapeGain_Q14[MAX_NB_SUBFR], const opus_int Tilt_Q14[MAX_NB_SUBFR], const opus_int32 LF_shp_Q14[MAX_NB_SUBFR], const opus_int32 Gains_Q16[MAX_NB_SUBFR], const opus_int pitchL[MAX_NB_SUBFR], const opus_int Lambda_Q10, const opus_int LTP_scale_Q14); #define OVERRIDE_silk_NSQ_del_dec (1) #define silk_NSQ_del_dec(psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, \ LTPCoef_Q14, AR_Q13, HarmShapeGain_Q14, Tilt_Q14, \ LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, \ LTP_scale_Q14, arch) \ ((*SILK_NSQ_DEL_DEC_IMPL[(arch)&OPUS_ARCHMASK])( \ psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, LTPCoef_Q14, \ AR_Q13, HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, \ Lambda_Q10, LTP_scale_Q14)) #elif defined(OPUS_ARM_PRESUME_NEON_INTR) #define OVERRIDE_silk_NSQ_del_dec (1) #define silk_NSQ_del_dec(psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, \ LTPCoef_Q14, AR_Q13, HarmShapeGain_Q14, Tilt_Q14, \ LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, \ LTP_scale_Q14, arch) \ ((void)(arch), \ silk_NSQ_del_dec_neon(psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, \ LTPCoef_Q14, AR_Q13, HarmShapeGain_Q14, Tilt_Q14, \ LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, \ LTP_scale_Q14)) #endif #endif #endif /* end SILK_NSQ_DEL_DEC_ARM_H */ mumble-1.3.4/3rdparty/opus-src/silk/arm/biquad_alt_neon_intr.c0000664000175000017500000003007614010707327024237 0ustar builderbuilder/*********************************************************************** Copyright (c) 2017 Google Inc. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #ifdef OPUS_CHECK_ASM # include # include "stack_alloc.h" #endif #include "SigProc_FIX.h" static inline void silk_biquad_alt_stride2_kernel( const int32x4_t A_L_s32x4, const int32x4_t A_U_s32x4, const int32x4_t B_Q28_s32x4, const int32x2_t t_s32x2, const int32x4_t in_s32x4, int32x4_t *S_s32x4, int32x2_t *out32_Q14_s32x2 ) { int32x4_t t_s32x4, out32_Q14_s32x4; *out32_Q14_s32x2 = vadd_s32( vget_low_s32( *S_s32x4 ), t_s32x2 ); /* silk_SMLAWB( S{0,1}, B_Q28[ 0 ], in{0,1} ) */ *S_s32x4 = vcombine_s32( vget_high_s32( *S_s32x4 ), vdup_n_s32( 0 ) ); /* S{0,1} = S{2,3}; S{2,3} = 0; */ *out32_Q14_s32x2 = vshl_n_s32( *out32_Q14_s32x2, 2 ); /* out32_Q14_{0,1} = silk_LSHIFT( silk_SMLAWB( S{0,1}, B_Q28[ 0 ], in{0,1} ), 2 ); */ out32_Q14_s32x4 = vcombine_s32( *out32_Q14_s32x2, *out32_Q14_s32x2 ); /* out32_Q14_{0,1,0,1} */ t_s32x4 = vqdmulhq_s32( out32_Q14_s32x4, A_L_s32x4 ); /* silk_SMULWB( out32_Q14_{0,1,0,1}, A{0,0,1,1}_L_Q28 ) */ *S_s32x4 = vrsraq_n_s32( *S_s32x4, t_s32x4, 14 ); /* S{0,1} = S{2,3} + silk_RSHIFT_ROUND(); S{2,3} = silk_RSHIFT_ROUND(); */ t_s32x4 = vqdmulhq_s32( out32_Q14_s32x4, A_U_s32x4 ); /* silk_SMULWB( out32_Q14_{0,1,0,1}, A{0,0,1,1}_U_Q28 ) */ *S_s32x4 = vaddq_s32( *S_s32x4, t_s32x4 ); /* S0 = silk_SMLAWB( S{0,1,2,3}, out32_Q14_{0,1,0,1}, A{0,0,1,1}_U_Q28 ); */ t_s32x4 = vqdmulhq_s32( in_s32x4, B_Q28_s32x4 ); /* silk_SMULWB( B_Q28[ {1,1,2,2} ], in{0,1,0,1} ) */ *S_s32x4 = vaddq_s32( *S_s32x4, t_s32x4 ); /* S0 = silk_SMLAWB( S0, B_Q28[ {1,1,2,2} ], in{0,1,0,1} ); */ } void silk_biquad_alt_stride2_neon( const opus_int16 *in, /* I input signal */ const opus_int32 *B_Q28, /* I MA coefficients [3] */ const opus_int32 *A_Q28, /* I AR coefficients [2] */ opus_int32 *S, /* I/O State vector [4] */ opus_int16 *out, /* O output signal */ const opus_int32 len /* I signal length (must be even) */ ) { /* DIRECT FORM II TRANSPOSED (uses 2 element state vector) */ opus_int k = 0; const int32x2_t offset_s32x2 = vdup_n_s32( (1<<14) - 1 ); const int32x4_t offset_s32x4 = vcombine_s32( offset_s32x2, offset_s32x2 ); int16x4_t in_s16x4 = vdup_n_s16( 0 ); int16x4_t out_s16x4; int32x2_t A_Q28_s32x2, A_L_s32x2, A_U_s32x2, B_Q28_s32x2, t_s32x2; int32x4_t A_L_s32x4, A_U_s32x4, B_Q28_s32x4, S_s32x4, out32_Q14_s32x4; int32x2x2_t t0_s32x2x2, t1_s32x2x2, t2_s32x2x2, S_s32x2x2; #ifdef OPUS_CHECK_ASM opus_int32 S_c[ 4 ]; VARDECL( opus_int16, out_c ); SAVE_STACK; ALLOC( out_c, 2 * len, opus_int16 ); silk_memcpy( &S_c, S, sizeof( S_c ) ); silk_biquad_alt_stride2_c( in, B_Q28, A_Q28, S_c, out_c, len ); #endif /* Negate A_Q28 values and split in two parts */ A_Q28_s32x2 = vld1_s32( A_Q28 ); A_Q28_s32x2 = vneg_s32( A_Q28_s32x2 ); A_L_s32x2 = vshl_n_s32( A_Q28_s32x2, 18 ); /* ( -A_Q28[] & 0x00003FFF ) << 18 */ A_L_s32x2 = vreinterpret_s32_u32( vshr_n_u32( vreinterpret_u32_s32( A_L_s32x2 ), 3 ) ); /* ( -A_Q28[] & 0x00003FFF ) << 15 */ A_U_s32x2 = vshr_n_s32( A_Q28_s32x2, 14 ); /* silk_RSHIFT( -A_Q28[], 14 ) */ A_U_s32x2 = vshl_n_s32( A_U_s32x2, 16 ); /* silk_RSHIFT( -A_Q28[], 14 ) << 16 (Clip two leading bits to conform to C function.) */ A_U_s32x2 = vshr_n_s32( A_U_s32x2, 1 ); /* silk_RSHIFT( -A_Q28[], 14 ) << 15 */ B_Q28_s32x2 = vld1_s32( B_Q28 ); t_s32x2 = vld1_s32( B_Q28 + 1 ); t0_s32x2x2 = vzip_s32( A_L_s32x2, A_L_s32x2 ); t1_s32x2x2 = vzip_s32( A_U_s32x2, A_U_s32x2 ); t2_s32x2x2 = vzip_s32( t_s32x2, t_s32x2 ); A_L_s32x4 = vcombine_s32( t0_s32x2x2.val[ 0 ], t0_s32x2x2.val[ 1 ] ); /* A{0,0,1,1}_L_Q28 */ A_U_s32x4 = vcombine_s32( t1_s32x2x2.val[ 0 ], t1_s32x2x2.val[ 1 ] ); /* A{0,0,1,1}_U_Q28 */ B_Q28_s32x4 = vcombine_s32( t2_s32x2x2.val[ 0 ], t2_s32x2x2.val[ 1 ] ); /* B_Q28[ {1,1,2,2} ] */ S_s32x4 = vld1q_s32( S ); /* S0 = S[ 0 ]; S3 = S[ 3 ]; */ S_s32x2x2 = vtrn_s32( vget_low_s32( S_s32x4 ), vget_high_s32( S_s32x4 ) ); /* S2 = S[ 1 ]; S1 = S[ 2 ]; */ S_s32x4 = vcombine_s32( S_s32x2x2.val[ 0 ], S_s32x2x2.val[ 1 ] ); for( ; k < len - 1; k += 2 ) { int32x4_t in_s32x4[ 2 ], t_s32x4; int32x2_t out32_Q14_s32x2[ 2 ]; /* S[ 2 * i + 0 ], S[ 2 * i + 1 ], S[ 2 * i + 2 ], S[ 2 * i + 3 ]: Q12 */ in_s16x4 = vld1_s16( &in[ 2 * k ] ); /* in{0,1,2,3} = in[ 2 * k + {0,1,2,3} ]; */ in_s32x4[ 0 ] = vshll_n_s16( in_s16x4, 15 ); /* in{0,1,2,3} << 15 */ t_s32x4 = vqdmulhq_lane_s32( in_s32x4[ 0 ], B_Q28_s32x2, 0 ); /* silk_SMULWB( B_Q28[ 0 ], in{0,1,2,3} ) */ in_s32x4[ 1 ] = vcombine_s32( vget_high_s32( in_s32x4[ 0 ] ), vget_high_s32( in_s32x4[ 0 ] ) ); /* in{2,3,2,3} << 15 */ in_s32x4[ 0 ] = vcombine_s32( vget_low_s32 ( in_s32x4[ 0 ] ), vget_low_s32 ( in_s32x4[ 0 ] ) ); /* in{0,1,0,1} << 15 */ silk_biquad_alt_stride2_kernel( A_L_s32x4, A_U_s32x4, B_Q28_s32x4, vget_low_s32 ( t_s32x4 ), in_s32x4[ 0 ], &S_s32x4, &out32_Q14_s32x2[ 0 ] ); silk_biquad_alt_stride2_kernel( A_L_s32x4, A_U_s32x4, B_Q28_s32x4, vget_high_s32( t_s32x4 ), in_s32x4[ 1 ], &S_s32x4, &out32_Q14_s32x2[ 1 ] ); /* Scale back to Q0 and saturate */ out32_Q14_s32x4 = vcombine_s32( out32_Q14_s32x2[ 0 ], out32_Q14_s32x2[ 1 ] ); /* out32_Q14_{0,1,2,3} */ out32_Q14_s32x4 = vaddq_s32( out32_Q14_s32x4, offset_s32x4 ); /* out32_Q14_{0,1,2,3} + (1<<14) - 1 */ out_s16x4 = vqshrn_n_s32( out32_Q14_s32x4, 14 ); /* (opus_int16)silk_SAT16( silk_RSHIFT( out32_Q14_{0,1,2,3} + (1<<14) - 1, 14 ) ) */ vst1_s16( &out[ 2 * k ], out_s16x4 ); /* out[ 2 * k + {0,1,2,3} ] = (opus_int16)silk_SAT16( silk_RSHIFT( out32_Q14_{0,1,2,3} + (1<<14) - 1, 14 ) ); */ } /* Process leftover. */ if( k < len ) { int32x4_t in_s32x4; int32x2_t out32_Q14_s32x2; /* S[ 2 * i + 0 ], S[ 2 * i + 1 ]: Q12 */ in_s16x4 = vld1_lane_s16( &in[ 2 * k + 0 ], in_s16x4, 0 ); /* in{0,1} = in[ 2 * k + {0,1} ]; */ in_s16x4 = vld1_lane_s16( &in[ 2 * k + 1 ], in_s16x4, 1 ); /* in{0,1} = in[ 2 * k + {0,1} ]; */ in_s32x4 = vshll_n_s16( in_s16x4, 15 ); /* in{0,1} << 15 */ t_s32x2 = vqdmulh_lane_s32( vget_low_s32( in_s32x4 ), B_Q28_s32x2, 0 ); /* silk_SMULWB( B_Q28[ 0 ], in{0,1} ) */ in_s32x4 = vcombine_s32( vget_low_s32( in_s32x4 ), vget_low_s32( in_s32x4 ) ); /* in{0,1,0,1} << 15 */ silk_biquad_alt_stride2_kernel( A_L_s32x4, A_U_s32x4, B_Q28_s32x4, t_s32x2, in_s32x4, &S_s32x4, &out32_Q14_s32x2 ); /* Scale back to Q0 and saturate */ out32_Q14_s32x2 = vadd_s32( out32_Q14_s32x2, offset_s32x2 ); /* out32_Q14_{0,1} + (1<<14) - 1 */ out32_Q14_s32x4 = vcombine_s32( out32_Q14_s32x2, out32_Q14_s32x2 ); /* out32_Q14_{0,1,0,1} + (1<<14) - 1 */ out_s16x4 = vqshrn_n_s32( out32_Q14_s32x4, 14 ); /* (opus_int16)silk_SAT16( silk_RSHIFT( out32_Q14_{0,1,0,1} + (1<<14) - 1, 14 ) ) */ vst1_lane_s16( &out[ 2 * k + 0 ], out_s16x4, 0 ); /* out[ 2 * k + 0 ] = (opus_int16)silk_SAT16( silk_RSHIFT( out32_Q14_0 + (1<<14) - 1, 14 ) ); */ vst1_lane_s16( &out[ 2 * k + 1 ], out_s16x4, 1 ); /* out[ 2 * k + 1 ] = (opus_int16)silk_SAT16( silk_RSHIFT( out32_Q14_1 + (1<<14) - 1, 14 ) ); */ } vst1q_lane_s32( &S[ 0 ], S_s32x4, 0 ); /* S[ 0 ] = S0; */ vst1q_lane_s32( &S[ 1 ], S_s32x4, 2 ); /* S[ 1 ] = S2; */ vst1q_lane_s32( &S[ 2 ], S_s32x4, 1 ); /* S[ 2 ] = S1; */ vst1q_lane_s32( &S[ 3 ], S_s32x4, 3 ); /* S[ 3 ] = S3; */ #ifdef OPUS_CHECK_ASM silk_assert( !memcmp( S_c, S, sizeof( S_c ) ) ); silk_assert( !memcmp( out_c, out, 2 * len * sizeof( opus_int16 ) ) ); RESTORE_STACK; #endif } mumble-1.3.4/3rdparty/opus-src/silk/arm/LPC_inv_pred_gain_neon_intr.c0000664000175000017500000003072114010707327025431 0ustar builderbuilder/*********************************************************************** Copyright (c) 2017 Google Inc. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "SigProc_FIX.h" #include "define.h" #define QA 24 #define A_LIMIT SILK_FIX_CONST( 0.99975, QA ) #define MUL32_FRAC_Q(a32, b32, Q) ((opus_int32)(silk_RSHIFT_ROUND64(silk_SMULL(a32, b32), Q))) /* The difficulty is how to judge a 64-bit signed integer tmp64 is 32-bit overflowed, * since NEON has no 64-bit min, max or comparison instructions. * A failed idea is to compare the results of vmovn(tmp64) and vqmovn(tmp64) whether they are equal or not. * However, this idea fails when the tmp64 is something like 0xFFFFFFF980000000. * Here we know that mult2Q >= 1, so the highest bit (bit 63, sign bit) of tmp64 must equal to bit 62. * tmp64 was shifted left by 1 and we got tmp64'. If high_half(tmp64') != 0 and high_half(tmp64') != -1, * then we know that bit 31 to bit 63 of tmp64 can not all be the sign bit, and therefore tmp64 is 32-bit overflowed. * That is, we judge if tmp64' > 0x00000000FFFFFFFF, or tmp64' <= 0xFFFFFFFF00000000. * We use narrowing shift right 31 bits to tmp32' to save data bandwidth and instructions. * That is, we judge if tmp32' > 0x00000000, or tmp32' <= 0xFFFFFFFF. */ /* Compute inverse of LPC prediction gain, and */ /* test if LPC coefficients are stable (all poles within unit circle) */ static OPUS_INLINE opus_int32 LPC_inverse_pred_gain_QA_neon( /* O Returns inverse prediction gain in energy domain, Q30 */ opus_int32 A_QA[ SILK_MAX_ORDER_LPC ], /* I Prediction coefficients */ const opus_int order /* I Prediction order */ ) { opus_int k, n, mult2Q; opus_int32 invGain_Q30, rc_Q31, rc_mult1_Q30, rc_mult2, tmp1, tmp2; opus_int32 max, min; int32x4_t max_s32x4, min_s32x4; int32x2_t max_s32x2, min_s32x2; max_s32x4 = vdupq_n_s32( silk_int32_MIN ); min_s32x4 = vdupq_n_s32( silk_int32_MAX ); invGain_Q30 = SILK_FIX_CONST( 1, 30 ); for( k = order - 1; k > 0; k-- ) { int32x2_t rc_Q31_s32x2, rc_mult2_s32x2; int64x2_t mult2Q_s64x2; /* Check for stability */ if( ( A_QA[ k ] > A_LIMIT ) || ( A_QA[ k ] < -A_LIMIT ) ) { return 0; } /* Set RC equal to negated AR coef */ rc_Q31 = -silk_LSHIFT( A_QA[ k ], 31 - QA ); /* rc_mult1_Q30 range: [ 1 : 2^30 ] */ rc_mult1_Q30 = silk_SUB32( SILK_FIX_CONST( 1, 30 ), silk_SMMUL( rc_Q31, rc_Q31 ) ); silk_assert( rc_mult1_Q30 > ( 1 << 15 ) ); /* reduce A_LIMIT if fails */ silk_assert( rc_mult1_Q30 <= ( 1 << 30 ) ); /* Update inverse gain */ /* invGain_Q30 range: [ 0 : 2^30 ] */ invGain_Q30 = silk_LSHIFT( silk_SMMUL( invGain_Q30, rc_mult1_Q30 ), 2 ); silk_assert( invGain_Q30 >= 0 ); silk_assert( invGain_Q30 <= ( 1 << 30 ) ); if( invGain_Q30 < SILK_FIX_CONST( 1.0f / MAX_PREDICTION_POWER_GAIN, 30 ) ) { return 0; } /* rc_mult2 range: [ 2^30 : silk_int32_MAX ] */ mult2Q = 32 - silk_CLZ32( silk_abs( rc_mult1_Q30 ) ); rc_mult2 = silk_INVERSE32_varQ( rc_mult1_Q30, mult2Q + 30 ); /* Update AR coefficient */ rc_Q31_s32x2 = vdup_n_s32( rc_Q31 ); mult2Q_s64x2 = vdupq_n_s64( -mult2Q ); rc_mult2_s32x2 = vdup_n_s32( rc_mult2 ); for( n = 0; n < ( ( k + 1 ) >> 1 ) - 3; n += 4 ) { /* We always calculate extra elements of A_QA buffer when ( k % 4 ) != 0, to take the advantage of SIMD parallelization. */ int32x4_t tmp1_s32x4, tmp2_s32x4, t0_s32x4, t1_s32x4, s0_s32x4, s1_s32x4, t_QA0_s32x4, t_QA1_s32x4; int64x2_t t0_s64x2, t1_s64x2, t2_s64x2, t3_s64x2; tmp1_s32x4 = vld1q_s32( A_QA + n ); tmp2_s32x4 = vld1q_s32( A_QA + k - n - 4 ); tmp2_s32x4 = vrev64q_s32( tmp2_s32x4 ); tmp2_s32x4 = vcombine_s32( vget_high_s32( tmp2_s32x4 ), vget_low_s32( tmp2_s32x4 ) ); t0_s32x4 = vqrdmulhq_lane_s32( tmp2_s32x4, rc_Q31_s32x2, 0 ); t1_s32x4 = vqrdmulhq_lane_s32( tmp1_s32x4, rc_Q31_s32x2, 0 ); t_QA0_s32x4 = vqsubq_s32( tmp1_s32x4, t0_s32x4 ); t_QA1_s32x4 = vqsubq_s32( tmp2_s32x4, t1_s32x4 ); t0_s64x2 = vmull_s32( vget_low_s32 ( t_QA0_s32x4 ), rc_mult2_s32x2 ); t1_s64x2 = vmull_s32( vget_high_s32( t_QA0_s32x4 ), rc_mult2_s32x2 ); t2_s64x2 = vmull_s32( vget_low_s32 ( t_QA1_s32x4 ), rc_mult2_s32x2 ); t3_s64x2 = vmull_s32( vget_high_s32( t_QA1_s32x4 ), rc_mult2_s32x2 ); t0_s64x2 = vrshlq_s64( t0_s64x2, mult2Q_s64x2 ); t1_s64x2 = vrshlq_s64( t1_s64x2, mult2Q_s64x2 ); t2_s64x2 = vrshlq_s64( t2_s64x2, mult2Q_s64x2 ); t3_s64x2 = vrshlq_s64( t3_s64x2, mult2Q_s64x2 ); t0_s32x4 = vcombine_s32( vmovn_s64( t0_s64x2 ), vmovn_s64( t1_s64x2 ) ); t1_s32x4 = vcombine_s32( vmovn_s64( t2_s64x2 ), vmovn_s64( t3_s64x2 ) ); s0_s32x4 = vcombine_s32( vshrn_n_s64( t0_s64x2, 31 ), vshrn_n_s64( t1_s64x2, 31 ) ); s1_s32x4 = vcombine_s32( vshrn_n_s64( t2_s64x2, 31 ), vshrn_n_s64( t3_s64x2, 31 ) ); max_s32x4 = vmaxq_s32( max_s32x4, s0_s32x4 ); min_s32x4 = vminq_s32( min_s32x4, s0_s32x4 ); max_s32x4 = vmaxq_s32( max_s32x4, s1_s32x4 ); min_s32x4 = vminq_s32( min_s32x4, s1_s32x4 ); t1_s32x4 = vrev64q_s32( t1_s32x4 ); t1_s32x4 = vcombine_s32( vget_high_s32( t1_s32x4 ), vget_low_s32( t1_s32x4 ) ); vst1q_s32( A_QA + n, t0_s32x4 ); vst1q_s32( A_QA + k - n - 4, t1_s32x4 ); } for( ; n < (k + 1) >> 1; n++ ) { opus_int64 tmp64; tmp1 = A_QA[ n ]; tmp2 = A_QA[ k - n - 1 ]; tmp64 = silk_RSHIFT_ROUND64( silk_SMULL( silk_SUB_SAT32(tmp1, MUL32_FRAC_Q( tmp2, rc_Q31, 31 ) ), rc_mult2 ), mult2Q); if( tmp64 > silk_int32_MAX || tmp64 < silk_int32_MIN ) { return 0; } A_QA[ n ] = ( opus_int32 )tmp64; tmp64 = silk_RSHIFT_ROUND64( silk_SMULL( silk_SUB_SAT32(tmp2, MUL32_FRAC_Q( tmp1, rc_Q31, 31 ) ), rc_mult2), mult2Q); if( tmp64 > silk_int32_MAX || tmp64 < silk_int32_MIN ) { return 0; } A_QA[ k - n - 1 ] = ( opus_int32 )tmp64; } } /* Check for stability */ if( ( A_QA[ k ] > A_LIMIT ) || ( A_QA[ k ] < -A_LIMIT ) ) { return 0; } max_s32x2 = vmax_s32( vget_low_s32( max_s32x4 ), vget_high_s32( max_s32x4 ) ); min_s32x2 = vmin_s32( vget_low_s32( min_s32x4 ), vget_high_s32( min_s32x4 ) ); max_s32x2 = vmax_s32( max_s32x2, vreinterpret_s32_s64( vshr_n_s64( vreinterpret_s64_s32( max_s32x2 ), 32 ) ) ); min_s32x2 = vmin_s32( min_s32x2, vreinterpret_s32_s64( vshr_n_s64( vreinterpret_s64_s32( min_s32x2 ), 32 ) ) ); max = vget_lane_s32( max_s32x2, 0 ); min = vget_lane_s32( min_s32x2, 0 ); if( ( max > 0 ) || ( min < -1 ) ) { return 0; } /* Set RC equal to negated AR coef */ rc_Q31 = -silk_LSHIFT( A_QA[ 0 ], 31 - QA ); /* Range: [ 1 : 2^30 ] */ rc_mult1_Q30 = silk_SUB32( SILK_FIX_CONST( 1, 30 ), silk_SMMUL( rc_Q31, rc_Q31 ) ); /* Update inverse gain */ /* Range: [ 0 : 2^30 ] */ invGain_Q30 = silk_LSHIFT( silk_SMMUL( invGain_Q30, rc_mult1_Q30 ), 2 ); silk_assert( invGain_Q30 >= 0 ); silk_assert( invGain_Q30 <= ( 1 << 30 ) ); if( invGain_Q30 < SILK_FIX_CONST( 1.0f / MAX_PREDICTION_POWER_GAIN, 30 ) ) { return 0; } return invGain_Q30; } /* For input in Q12 domain */ opus_int32 silk_LPC_inverse_pred_gain_neon( /* O Returns inverse prediction gain in energy domain, Q30 */ const opus_int16 *A_Q12, /* I Prediction coefficients, Q12 [order] */ const opus_int order /* I Prediction order */ ) { #ifdef OPUS_CHECK_ASM const opus_int32 invGain_Q30_c = silk_LPC_inverse_pred_gain_c( A_Q12, order ); #endif opus_int32 invGain_Q30; if( ( SILK_MAX_ORDER_LPC != 24 ) || ( order & 1 )) { invGain_Q30 = silk_LPC_inverse_pred_gain_c( A_Q12, order ); } else { opus_int32 Atmp_QA[ SILK_MAX_ORDER_LPC ]; opus_int32 DC_resp; int16x8_t t0_s16x8, t1_s16x8, t2_s16x8; int32x4_t t0_s32x4; const opus_int leftover = order & 7; /* Increase Q domain of the AR coefficients */ t0_s16x8 = vld1q_s16( A_Q12 + 0 ); t1_s16x8 = vld1q_s16( A_Q12 + 8 ); t2_s16x8 = vld1q_s16( A_Q12 + 16 ); t0_s32x4 = vpaddlq_s16( t0_s16x8 ); switch( order - leftover ) { case 24: t0_s32x4 = vpadalq_s16( t0_s32x4, t2_s16x8 ); /* Intend to fall through */ case 16: t0_s32x4 = vpadalq_s16( t0_s32x4, t1_s16x8 ); vst1q_s32( Atmp_QA + 16, vshll_n_s16( vget_low_s16 ( t2_s16x8 ), QA - 12 ) ); vst1q_s32( Atmp_QA + 20, vshll_n_s16( vget_high_s16( t2_s16x8 ), QA - 12 ) ); /* Intend to fall through */ case 8: { const int32x2_t t_s32x2 = vpadd_s32( vget_low_s32( t0_s32x4 ), vget_high_s32( t0_s32x4 ) ); const int64x1_t t_s64x1 = vpaddl_s32( t_s32x2 ); DC_resp = vget_lane_s32( vreinterpret_s32_s64( t_s64x1 ), 0 ); vst1q_s32( Atmp_QA + 8, vshll_n_s16( vget_low_s16 ( t1_s16x8 ), QA - 12 ) ); vst1q_s32( Atmp_QA + 12, vshll_n_s16( vget_high_s16( t1_s16x8 ), QA - 12 ) ); } break; default: DC_resp = 0; break; } A_Q12 += order - leftover; switch( leftover ) { case 6: DC_resp += (opus_int32)A_Q12[ 5 ]; DC_resp += (opus_int32)A_Q12[ 4 ]; /* Intend to fall through */ case 4: DC_resp += (opus_int32)A_Q12[ 3 ]; DC_resp += (opus_int32)A_Q12[ 2 ]; /* Intend to fall through */ case 2: DC_resp += (opus_int32)A_Q12[ 1 ]; DC_resp += (opus_int32)A_Q12[ 0 ]; /* Intend to fall through */ default: break; } /* If the DC is unstable, we don't even need to do the full calculations */ if( DC_resp >= 4096 ) { invGain_Q30 = 0; } else { vst1q_s32( Atmp_QA + 0, vshll_n_s16( vget_low_s16 ( t0_s16x8 ), QA - 12 ) ); vst1q_s32( Atmp_QA + 4, vshll_n_s16( vget_high_s16( t0_s16x8 ), QA - 12 ) ); invGain_Q30 = LPC_inverse_pred_gain_QA_neon( Atmp_QA, order ); } } #ifdef OPUS_CHECK_ASM silk_assert( invGain_Q30_c == invGain_Q30 ); #endif return invGain_Q30; } mumble-1.3.4/3rdparty/opus-src/silk/arm/biquad_alt_arm.h0000664000175000017500000001051614010707327023025 0ustar builderbuilder/*********************************************************************** Copyright (c) 2017 Google Inc. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef SILK_BIQUAD_ALT_ARM_H # define SILK_BIQUAD_ALT_ARM_H # include "celt/arm/armcpu.h" # if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) void silk_biquad_alt_stride2_neon( const opus_int16 *in, /* I input signal */ const opus_int32 *B_Q28, /* I MA coefficients [3] */ const opus_int32 *A_Q28, /* I AR coefficients [2] */ opus_int32 *S, /* I/O State vector [4] */ opus_int16 *out, /* O output signal */ const opus_int32 len /* I signal length (must be even) */ ); # if !defined(OPUS_HAVE_RTCD) && defined(OPUS_ARM_PRESUME_NEON) # define OVERRIDE_silk_biquad_alt_stride2 (1) # define silk_biquad_alt_stride2(in, B_Q28, A_Q28, S, out, len, arch) ((void)(arch), PRESUME_NEON(silk_biquad_alt_stride2)(in, B_Q28, A_Q28, S, out, len)) # endif # endif # if !defined(OVERRIDE_silk_biquad_alt_stride2) /*Is run-time CPU detection enabled on this platform?*/ # if defined(OPUS_HAVE_RTCD) && (defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR)) extern void (*const SILK_BIQUAD_ALT_STRIDE2_IMPL[OPUS_ARCHMASK+1])( const opus_int16 *in, /* I input signal */ const opus_int32 *B_Q28, /* I MA coefficients [3] */ const opus_int32 *A_Q28, /* I AR coefficients [2] */ opus_int32 *S, /* I/O State vector [4] */ opus_int16 *out, /* O output signal */ const opus_int32 len /* I signal length (must be even) */ ); # define OVERRIDE_silk_biquad_alt_stride2 (1) # define silk_biquad_alt_stride2(in, B_Q28, A_Q28, S, out, len, arch) ((*SILK_BIQUAD_ALT_STRIDE2_IMPL[(arch)&OPUS_ARCHMASK])(in, B_Q28, A_Q28, S, out, len)) # elif defined(OPUS_ARM_PRESUME_NEON_INTR) # define OVERRIDE_silk_biquad_alt_stride2 (1) # define silk_biquad_alt_stride2(in, B_Q28, A_Q28, S, out, len, arch) ((void)(arch), silk_biquad_alt_stride2_neon(in, B_Q28, A_Q28, S, out, len)) # endif # endif #endif /* end SILK_BIQUAD_ALT_ARM_H */ mumble-1.3.4/3rdparty/opus-src/silk/arm/SigProc_FIX_armv4.h0000664000175000017500000000402014010707327023237 0ustar builderbuilder/*********************************************************************** Copyright (C) 2013 Xiph.Org Foundation and contributors Copyright (c) 2013 Parrot Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef SILK_SIGPROC_FIX_ARMv4_H #define SILK_SIGPROC_FIX_ARMv4_H #undef silk_MLA static OPUS_INLINE opus_int32 silk_MLA_armv4(opus_int32 a, opus_int32 b, opus_int32 c) { opus_int32 res; __asm__( "#silk_MLA\n\t" "mla %0, %1, %2, %3\n\t" : "=&r"(res) : "r"(b), "r"(c), "r"(a) ); return res; } #define silk_MLA(a, b, c) (silk_MLA_armv4(a, b, c)) #endif mumble-1.3.4/3rdparty/opus-src/silk/ana_filt_bank_1.c0000664000175000017500000000727214010707327022272 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "SigProc_FIX.h" /* Coefficients for 2-band filter bank based on first-order allpass filters */ static opus_int16 A_fb1_20 = 5394 << 1; static opus_int16 A_fb1_21 = -24290; /* (opus_int16)(20623 << 1) */ /* Split signal into two decimated bands using first-order allpass filters */ void silk_ana_filt_bank_1( const opus_int16 *in, /* I Input signal [N] */ opus_int32 *S, /* I/O State vector [2] */ opus_int16 *outL, /* O Low band [N/2] */ opus_int16 *outH, /* O High band [N/2] */ const opus_int32 N /* I Number of input samples */ ) { opus_int k, N2 = silk_RSHIFT( N, 1 ); opus_int32 in32, X, Y, out_1, out_2; /* Internal variables and state are in Q10 format */ for( k = 0; k < N2; k++ ) { /* Convert to Q10 */ in32 = silk_LSHIFT( (opus_int32)in[ 2 * k ], 10 ); /* All-pass section for even input sample */ Y = silk_SUB32( in32, S[ 0 ] ); X = silk_SMLAWB( Y, Y, A_fb1_21 ); out_1 = silk_ADD32( S[ 0 ], X ); S[ 0 ] = silk_ADD32( in32, X ); /* Convert to Q10 */ in32 = silk_LSHIFT( (opus_int32)in[ 2 * k + 1 ], 10 ); /* All-pass section for odd input sample, and add to output of previous section */ Y = silk_SUB32( in32, S[ 1 ] ); X = silk_SMULWB( Y, A_fb1_20 ); out_2 = silk_ADD32( S[ 1 ], X ); S[ 1 ] = silk_ADD32( in32, X ); /* Add/subtract, convert back to int16 and store to output */ outL[ k ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_ADD32( out_2, out_1 ), 11 ) ); outH[ k ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SUB32( out_2, out_1 ), 11 ) ); } } mumble-1.3.4/3rdparty/opus-src/silk/stereo_find_predictor.c0000664000175000017500000001042614010707327023651 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main.h" /* Find least-squares prediction gain for one signal based on another and quantize it */ opus_int32 silk_stereo_find_predictor( /* O Returns predictor in Q13 */ opus_int32 *ratio_Q14, /* O Ratio of residual and mid energies */ const opus_int16 x[], /* I Basis signal */ const opus_int16 y[], /* I Target signal */ opus_int32 mid_res_amp_Q0[], /* I/O Smoothed mid, residual norms */ opus_int length, /* I Number of samples */ opus_int smooth_coef_Q16 /* I Smoothing coefficient */ ) { opus_int scale, scale1, scale2; opus_int32 nrgx, nrgy, corr, pred_Q13, pred2_Q10; /* Find predictor */ silk_sum_sqr_shift( &nrgx, &scale1, x, length ); silk_sum_sqr_shift( &nrgy, &scale2, y, length ); scale = silk_max_int( scale1, scale2 ); scale = scale + ( scale & 1 ); /* make even */ nrgy = silk_RSHIFT32( nrgy, scale - scale2 ); nrgx = silk_RSHIFT32( nrgx, scale - scale1 ); nrgx = silk_max_int( nrgx, 1 ); corr = silk_inner_prod_aligned_scale( x, y, scale, length ); pred_Q13 = silk_DIV32_varQ( corr, nrgx, 13 ); pred_Q13 = silk_LIMIT( pred_Q13, -(1 << 14), 1 << 14 ); pred2_Q10 = silk_SMULWB( pred_Q13, pred_Q13 ); /* Faster update for signals with large prediction parameters */ smooth_coef_Q16 = (opus_int)silk_max_int( smooth_coef_Q16, silk_abs( pred2_Q10 ) ); /* Smoothed mid and residual norms */ silk_assert( smooth_coef_Q16 < 32768 ); scale = silk_RSHIFT( scale, 1 ); mid_res_amp_Q0[ 0 ] = silk_SMLAWB( mid_res_amp_Q0[ 0 ], silk_LSHIFT( silk_SQRT_APPROX( nrgx ), scale ) - mid_res_amp_Q0[ 0 ], smooth_coef_Q16 ); /* Residual energy = nrgy - 2 * pred * corr + pred^2 * nrgx */ nrgy = silk_SUB_LSHIFT32( nrgy, silk_SMULWB( corr, pred_Q13 ), 3 + 1 ); nrgy = silk_ADD_LSHIFT32( nrgy, silk_SMULWB( nrgx, pred2_Q10 ), 6 ); mid_res_amp_Q0[ 1 ] = silk_SMLAWB( mid_res_amp_Q0[ 1 ], silk_LSHIFT( silk_SQRT_APPROX( nrgy ), scale ) - mid_res_amp_Q0[ 1 ], smooth_coef_Q16 ); /* Ratio of smoothed residual and mid norms */ *ratio_Q14 = silk_DIV32_varQ( mid_res_amp_Q0[ 1 ], silk_max( mid_res_amp_Q0[ 0 ], 1 ), 14 ); *ratio_Q14 = silk_LIMIT( *ratio_Q14, 0, 32767 ); return pred_Q13; } mumble-1.3.4/3rdparty/opus-src/silk/log2lin.c0000664000175000017500000000511414010707327020641 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "SigProc_FIX.h" /* Approximation of 2^() (very close inverse of silk_lin2log()) */ /* Convert input to a linear scale */ opus_int32 silk_log2lin( const opus_int32 inLog_Q7 /* I input on log scale */ ) { opus_int32 out, frac_Q7; if( inLog_Q7 < 0 ) { return 0; } else if ( inLog_Q7 >= 3967 ) { return silk_int32_MAX; } out = silk_LSHIFT( 1, silk_RSHIFT( inLog_Q7, 7 ) ); frac_Q7 = inLog_Q7 & 0x7F; if( inLog_Q7 < 2048 ) { /* Piece-wise parabolic approximation */ out = silk_ADD_RSHIFT32( out, silk_MUL( out, silk_SMLAWB( frac_Q7, silk_SMULBB( frac_Q7, 128 - frac_Q7 ), -174 ) ), 7 ); } else { /* Piece-wise parabolic approximation */ out = silk_MLA( out, silk_RSHIFT( out, 7 ), silk_SMLAWB( frac_Q7, silk_SMULBB( frac_Q7, 128 - frac_Q7 ), -174 ) ); } return out; } mumble-1.3.4/3rdparty/opus-src/silk/fixed/0000775000175000017500000000000014010707327020225 5ustar builderbuildermumble-1.3.4/3rdparty/opus-src/silk/fixed/find_pitch_lags_FIX.c0000664000175000017500000001624214010707327024221 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main_FIX.h" #include "stack_alloc.h" #include "tuning_parameters.h" /* Find pitch lags */ void silk_find_pitch_lags_FIX( silk_encoder_state_FIX *psEnc, /* I/O encoder state */ silk_encoder_control_FIX *psEncCtrl, /* I/O encoder control */ opus_int16 res[], /* O residual */ const opus_int16 x[], /* I Speech signal */ int arch /* I Run-time architecture */ ) { opus_int buf_len, i, scale; opus_int32 thrhld_Q13, res_nrg; const opus_int16 *x_ptr; VARDECL( opus_int16, Wsig ); opus_int16 *Wsig_ptr; opus_int32 auto_corr[ MAX_FIND_PITCH_LPC_ORDER + 1 ]; opus_int16 rc_Q15[ MAX_FIND_PITCH_LPC_ORDER ]; opus_int32 A_Q24[ MAX_FIND_PITCH_LPC_ORDER ]; opus_int16 A_Q12[ MAX_FIND_PITCH_LPC_ORDER ]; SAVE_STACK; /******************************************/ /* Set up buffer lengths etc based on Fs */ /******************************************/ buf_len = psEnc->sCmn.la_pitch + psEnc->sCmn.frame_length + psEnc->sCmn.ltp_mem_length; /* Safety check */ silk_assert( buf_len >= psEnc->sCmn.pitch_LPC_win_length ); /*************************************/ /* Estimate LPC AR coefficients */ /*************************************/ /* Calculate windowed signal */ ALLOC( Wsig, psEnc->sCmn.pitch_LPC_win_length, opus_int16 ); /* First LA_LTP samples */ x_ptr = x + buf_len - psEnc->sCmn.pitch_LPC_win_length; Wsig_ptr = Wsig; silk_apply_sine_window( Wsig_ptr, x_ptr, 1, psEnc->sCmn.la_pitch ); /* Middle un - windowed samples */ Wsig_ptr += psEnc->sCmn.la_pitch; x_ptr += psEnc->sCmn.la_pitch; silk_memcpy( Wsig_ptr, x_ptr, ( psEnc->sCmn.pitch_LPC_win_length - silk_LSHIFT( psEnc->sCmn.la_pitch, 1 ) ) * sizeof( opus_int16 ) ); /* Last LA_LTP samples */ Wsig_ptr += psEnc->sCmn.pitch_LPC_win_length - silk_LSHIFT( psEnc->sCmn.la_pitch, 1 ); x_ptr += psEnc->sCmn.pitch_LPC_win_length - silk_LSHIFT( psEnc->sCmn.la_pitch, 1 ); silk_apply_sine_window( Wsig_ptr, x_ptr, 2, psEnc->sCmn.la_pitch ); /* Calculate autocorrelation sequence */ silk_autocorr( auto_corr, &scale, Wsig, psEnc->sCmn.pitch_LPC_win_length, psEnc->sCmn.pitchEstimationLPCOrder + 1, arch ); /* Add white noise, as fraction of energy */ auto_corr[ 0 ] = silk_SMLAWB( auto_corr[ 0 ], auto_corr[ 0 ], SILK_FIX_CONST( FIND_PITCH_WHITE_NOISE_FRACTION, 16 ) ) + 1; /* Calculate the reflection coefficients using schur */ res_nrg = silk_schur( rc_Q15, auto_corr, psEnc->sCmn.pitchEstimationLPCOrder ); /* Prediction gain */ psEncCtrl->predGain_Q16 = silk_DIV32_varQ( auto_corr[ 0 ], silk_max_int( res_nrg, 1 ), 16 ); /* Convert reflection coefficients to prediction coefficients */ silk_k2a( A_Q24, rc_Q15, psEnc->sCmn.pitchEstimationLPCOrder ); /* Convert From 32 bit Q24 to 16 bit Q12 coefs */ for( i = 0; i < psEnc->sCmn.pitchEstimationLPCOrder; i++ ) { A_Q12[ i ] = (opus_int16)silk_SAT16( silk_RSHIFT( A_Q24[ i ], 12 ) ); } /* Do BWE */ silk_bwexpander( A_Q12, psEnc->sCmn.pitchEstimationLPCOrder, SILK_FIX_CONST( FIND_PITCH_BANDWIDTH_EXPANSION, 16 ) ); /*****************************************/ /* LPC analysis filtering */ /*****************************************/ silk_LPC_analysis_filter( res, x, A_Q12, buf_len, psEnc->sCmn.pitchEstimationLPCOrder, psEnc->sCmn.arch ); if( psEnc->sCmn.indices.signalType != TYPE_NO_VOICE_ACTIVITY && psEnc->sCmn.first_frame_after_reset == 0 ) { /* Threshold for pitch estimator */ thrhld_Q13 = SILK_FIX_CONST( 0.6, 13 ); thrhld_Q13 = silk_SMLABB( thrhld_Q13, SILK_FIX_CONST( -0.004, 13 ), psEnc->sCmn.pitchEstimationLPCOrder ); thrhld_Q13 = silk_SMLAWB( thrhld_Q13, SILK_FIX_CONST( -0.1, 21 ), psEnc->sCmn.speech_activity_Q8 ); thrhld_Q13 = silk_SMLABB( thrhld_Q13, SILK_FIX_CONST( -0.15, 13 ), silk_RSHIFT( psEnc->sCmn.prevSignalType, 1 ) ); thrhld_Q13 = silk_SMLAWB( thrhld_Q13, SILK_FIX_CONST( -0.1, 14 ), psEnc->sCmn.input_tilt_Q15 ); thrhld_Q13 = silk_SAT16( thrhld_Q13 ); /*****************************************/ /* Call pitch estimator */ /*****************************************/ if( silk_pitch_analysis_core( res, psEncCtrl->pitchL, &psEnc->sCmn.indices.lagIndex, &psEnc->sCmn.indices.contourIndex, &psEnc->LTPCorr_Q15, psEnc->sCmn.prevLag, psEnc->sCmn.pitchEstimationThreshold_Q16, (opus_int)thrhld_Q13, psEnc->sCmn.fs_kHz, psEnc->sCmn.pitchEstimationComplexity, psEnc->sCmn.nb_subfr, psEnc->sCmn.arch) == 0 ) { psEnc->sCmn.indices.signalType = TYPE_VOICED; } else { psEnc->sCmn.indices.signalType = TYPE_UNVOICED; } } else { silk_memset( psEncCtrl->pitchL, 0, sizeof( psEncCtrl->pitchL ) ); psEnc->sCmn.indices.lagIndex = 0; psEnc->sCmn.indices.contourIndex = 0; psEnc->LTPCorr_Q15 = 0; } RESTORE_STACK; } mumble-1.3.4/3rdparty/opus-src/silk/fixed/find_pred_coefs_FIX.c0000664000175000017500000001656714010707327024227 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main_FIX.h" #include "stack_alloc.h" void silk_find_pred_coefs_FIX( silk_encoder_state_FIX *psEnc, /* I/O encoder state */ silk_encoder_control_FIX *psEncCtrl, /* I/O encoder control */ const opus_int16 res_pitch[], /* I Residual from pitch analysis */ const opus_int16 x[], /* I Speech signal */ opus_int condCoding /* I The type of conditional coding to use */ ) { opus_int i; opus_int32 invGains_Q16[ MAX_NB_SUBFR ], local_gains[ MAX_NB_SUBFR ]; opus_int16 NLSF_Q15[ MAX_LPC_ORDER ]; const opus_int16 *x_ptr; opus_int16 *x_pre_ptr; VARDECL( opus_int16, LPC_in_pre ); opus_int32 min_gain_Q16, minInvGain_Q30; SAVE_STACK; /* weighting for weighted least squares */ min_gain_Q16 = silk_int32_MAX >> 6; for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { min_gain_Q16 = silk_min( min_gain_Q16, psEncCtrl->Gains_Q16[ i ] ); } for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { /* Divide to Q16 */ silk_assert( psEncCtrl->Gains_Q16[ i ] > 0 ); /* Invert and normalize gains, and ensure that maximum invGains_Q16 is within range of a 16 bit int */ invGains_Q16[ i ] = silk_DIV32_varQ( min_gain_Q16, psEncCtrl->Gains_Q16[ i ], 16 - 2 ); /* Limit inverse */ invGains_Q16[ i ] = silk_max( invGains_Q16[ i ], 100 ); /* Square the inverted gains */ silk_assert( invGains_Q16[ i ] == silk_SAT16( invGains_Q16[ i ] ) ); /* Invert the inverted and normalized gains */ local_gains[ i ] = silk_DIV32( ( (opus_int32)1 << 16 ), invGains_Q16[ i ] ); } ALLOC( LPC_in_pre, psEnc->sCmn.nb_subfr * psEnc->sCmn.predictLPCOrder + psEnc->sCmn.frame_length, opus_int16 ); if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { VARDECL( opus_int32, xXLTP_Q17 ); VARDECL( opus_int32, XXLTP_Q17 ); /**********/ /* VOICED */ /**********/ silk_assert( psEnc->sCmn.ltp_mem_length - psEnc->sCmn.predictLPCOrder >= psEncCtrl->pitchL[ 0 ] + LTP_ORDER / 2 ); ALLOC( xXLTP_Q17, psEnc->sCmn.nb_subfr * LTP_ORDER, opus_int32 ); ALLOC( XXLTP_Q17, psEnc->sCmn.nb_subfr * LTP_ORDER * LTP_ORDER, opus_int32 ); /* LTP analysis */ silk_find_LTP_FIX( XXLTP_Q17, xXLTP_Q17, res_pitch, psEncCtrl->pitchL, psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr, psEnc->sCmn.arch ); /* Quantize LTP gain parameters */ silk_quant_LTP_gains( psEncCtrl->LTPCoef_Q14, psEnc->sCmn.indices.LTPIndex, &psEnc->sCmn.indices.PERIndex, &psEnc->sCmn.sum_log_gain_Q7, &psEncCtrl->LTPredCodGain_Q7, XXLTP_Q17, xXLTP_Q17, psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr, psEnc->sCmn.arch ); /* Control LTP scaling */ silk_LTP_scale_ctrl_FIX( psEnc, psEncCtrl, condCoding ); /* Create LTP residual */ silk_LTP_analysis_filter_FIX( LPC_in_pre, x - psEnc->sCmn.predictLPCOrder, psEncCtrl->LTPCoef_Q14, psEncCtrl->pitchL, invGains_Q16, psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr, psEnc->sCmn.predictLPCOrder ); } else { /************/ /* UNVOICED */ /************/ /* Create signal with prepended subframes, scaled by inverse gains */ x_ptr = x - psEnc->sCmn.predictLPCOrder; x_pre_ptr = LPC_in_pre; for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { silk_scale_copy_vector16( x_pre_ptr, x_ptr, invGains_Q16[ i ], psEnc->sCmn.subfr_length + psEnc->sCmn.predictLPCOrder ); x_pre_ptr += psEnc->sCmn.subfr_length + psEnc->sCmn.predictLPCOrder; x_ptr += psEnc->sCmn.subfr_length; } silk_memset( psEncCtrl->LTPCoef_Q14, 0, psEnc->sCmn.nb_subfr * LTP_ORDER * sizeof( opus_int16 ) ); psEncCtrl->LTPredCodGain_Q7 = 0; psEnc->sCmn.sum_log_gain_Q7 = 0; } /* Limit on total predictive coding gain */ if( psEnc->sCmn.first_frame_after_reset ) { minInvGain_Q30 = SILK_FIX_CONST( 1.0f / MAX_PREDICTION_POWER_GAIN_AFTER_RESET, 30 ); } else { minInvGain_Q30 = silk_log2lin( silk_SMLAWB( 16 << 7, (opus_int32)psEncCtrl->LTPredCodGain_Q7, SILK_FIX_CONST( 1.0 / 3, 16 ) ) ); /* Q16 */ minInvGain_Q30 = silk_DIV32_varQ( minInvGain_Q30, silk_SMULWW( SILK_FIX_CONST( MAX_PREDICTION_POWER_GAIN, 0 ), silk_SMLAWB( SILK_FIX_CONST( 0.25, 18 ), SILK_FIX_CONST( 0.75, 18 ), psEncCtrl->coding_quality_Q14 ) ), 14 ); } /* LPC_in_pre contains the LTP-filtered input for voiced, and the unfiltered input for unvoiced */ silk_find_LPC_FIX( &psEnc->sCmn, NLSF_Q15, LPC_in_pre, minInvGain_Q30 ); /* Quantize LSFs */ silk_process_NLSFs( &psEnc->sCmn, psEncCtrl->PredCoef_Q12, NLSF_Q15, psEnc->sCmn.prev_NLSFq_Q15 ); /* Calculate residual energy using quantized LPC coefficients */ silk_residual_energy_FIX( psEncCtrl->ResNrg, psEncCtrl->ResNrgQ, LPC_in_pre, psEncCtrl->PredCoef_Q12, local_gains, psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr, psEnc->sCmn.predictLPCOrder, psEnc->sCmn.arch ); /* Copy to prediction struct for use in next frame for interpolation */ silk_memcpy( psEnc->sCmn.prev_NLSFq_Q15, NLSF_Q15, sizeof( psEnc->sCmn.prev_NLSFq_Q15 ) ); RESTORE_STACK; } mumble-1.3.4/3rdparty/opus-src/silk/fixed/arm/0000775000175000017500000000000014010707327021004 5ustar builderbuildermumble-1.3.4/3rdparty/opus-src/silk/fixed/arm/warped_autocorrelation_FIX_neon_intr.c0000664000175000017500000003156414010707327030516 0ustar builderbuilder/*********************************************************************** Copyright (c) 2017 Google Inc., Jean-Marc Valin Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #ifdef OPUS_CHECK_ASM # include #endif #include "stack_alloc.h" #include "main_FIX.h" static OPUS_INLINE void calc_corr( const opus_int32 *const input_QS, opus_int64 *const corr_QC, const opus_int offset, const int32x4_t state_QS_s32x4 ) { int64x2_t corr_QC_s64x2[ 2 ], t_s64x2[ 2 ]; const int32x4_t input_QS_s32x4 = vld1q_s32( input_QS + offset ); corr_QC_s64x2[ 0 ] = vld1q_s64( corr_QC + offset + 0 ); corr_QC_s64x2[ 1 ] = vld1q_s64( corr_QC + offset + 2 ); t_s64x2[ 0 ] = vmull_s32( vget_low_s32( state_QS_s32x4 ), vget_low_s32( input_QS_s32x4 ) ); t_s64x2[ 1 ] = vmull_s32( vget_high_s32( state_QS_s32x4 ), vget_high_s32( input_QS_s32x4 ) ); corr_QC_s64x2[ 0 ] = vsraq_n_s64( corr_QC_s64x2[ 0 ], t_s64x2[ 0 ], 2 * QS - QC ); corr_QC_s64x2[ 1 ] = vsraq_n_s64( corr_QC_s64x2[ 1 ], t_s64x2[ 1 ], 2 * QS - QC ); vst1q_s64( corr_QC + offset + 0, corr_QC_s64x2[ 0 ] ); vst1q_s64( corr_QC + offset + 2, corr_QC_s64x2[ 1 ] ); } static OPUS_INLINE int32x4_t calc_state( const int32x4_t state_QS0_s32x4, const int32x4_t state_QS0_1_s32x4, const int32x4_t state_QS1_1_s32x4, const int32x4_t warping_Q16_s32x4 ) { int32x4_t t_s32x4 = vsubq_s32( state_QS0_s32x4, state_QS0_1_s32x4 ); t_s32x4 = vqdmulhq_s32( t_s32x4, warping_Q16_s32x4 ); return vaddq_s32( state_QS1_1_s32x4, t_s32x4 ); } void silk_warped_autocorrelation_FIX_neon( opus_int32 *corr, /* O Result [order + 1] */ opus_int *scale, /* O Scaling of the correlation vector */ const opus_int16 *input, /* I Input data to correlate */ const opus_int warping_Q16, /* I Warping coefficient */ const opus_int length, /* I Length of input */ const opus_int order /* I Correlation order (even) */ ) { if( ( MAX_SHAPE_LPC_ORDER > 24 ) || ( order < 6 ) ) { silk_warped_autocorrelation_FIX_c( corr, scale, input, warping_Q16, length, order ); } else { opus_int n, i, lsh; opus_int64 corr_QC[ MAX_SHAPE_LPC_ORDER + 1 ] = { 0 }; /* In reverse order */ opus_int64 corr_QC_orderT; int64x2_t lsh_s64x2; const opus_int orderT = ( order + 3 ) & ~3; opus_int64 *corr_QCT; opus_int32 *input_QS; VARDECL( opus_int32, input_QST ); VARDECL( opus_int32, state ); SAVE_STACK; /* Order must be even */ silk_assert( ( order & 1 ) == 0 ); silk_assert( 2 * QS - QC >= 0 ); ALLOC( input_QST, length + 2 * MAX_SHAPE_LPC_ORDER, opus_int32 ); input_QS = input_QST; /* input_QS has zero paddings in the beginning and end. */ vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); input_QS += 4; vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); input_QS += 4; vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); input_QS += 4; vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); input_QS += 4; vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); input_QS += 4; vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); input_QS += 4; /* Loop over samples */ for( n = 0; n < length - 7; n += 8, input_QS += 8 ) { const int16x8_t t0_s16x4 = vld1q_s16( input + n ); vst1q_s32( input_QS + 0, vshll_n_s16( vget_low_s16( t0_s16x4 ), QS ) ); vst1q_s32( input_QS + 4, vshll_n_s16( vget_high_s16( t0_s16x4 ), QS ) ); } for( ; n < length; n++, input_QS++ ) { input_QS[ 0 ] = silk_LSHIFT32( (opus_int32)input[ n ], QS ); } vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); input_QS += 4; vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); input_QS += 4; vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); input_QS += 4; vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); input_QS += 4; vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); input_QS += 4; vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); input_QS = input_QST + MAX_SHAPE_LPC_ORDER - orderT; /* The following loop runs ( length + order ) times, with ( order ) extra epilogues. */ /* The zero paddings in input_QS guarantee corr_QC's correctness even with the extra epilogues. */ /* The values of state_QS will be polluted by the extra epilogues, however they are temporary values. */ /* Keep the C code here to help understand the intrinsics optimization. */ /* { opus_int32 state_QS[ 2 ][ MAX_SHAPE_LPC_ORDER + 1 ] = { 0 }; opus_int32 *state_QST[ 3 ]; state_QST[ 0 ] = state_QS[ 0 ]; state_QST[ 1 ] = state_QS[ 1 ]; for( n = 0; n < length + order; n++, input_QS++ ) { state_QST[ 0 ][ orderT ] = input_QS[ orderT ]; for( i = 0; i < orderT; i++ ) { corr_QC[ i ] += silk_RSHIFT64( silk_SMULL( state_QST[ 0 ][ i ], input_QS[ i ] ), 2 * QS - QC ); state_QST[ 1 ][ i ] = silk_SMLAWB( state_QST[ 1 ][ i + 1 ], state_QST[ 0 ][ i ] - state_QST[ 0 ][ i + 1 ], warping_Q16 ); } state_QST[ 2 ] = state_QST[ 0 ]; state_QST[ 0 ] = state_QST[ 1 ]; state_QST[ 1 ] = state_QST[ 2 ]; } } */ { const int32x4_t warping_Q16_s32x4 = vdupq_n_s32( warping_Q16 << 15 ); const opus_int32 *in = input_QS + orderT; opus_int o = orderT; int32x4_t state_QS_s32x4[ 3 ][ 2 ]; ALLOC( state, length + orderT, opus_int32 ); state_QS_s32x4[ 2 ][ 1 ] = vdupq_n_s32( 0 ); /* Calculate 8 taps of all inputs in each loop. */ do { state_QS_s32x4[ 0 ][ 0 ] = state_QS_s32x4[ 0 ][ 1 ] = state_QS_s32x4[ 1 ][ 0 ] = state_QS_s32x4[ 1 ][ 1 ] = vdupq_n_s32( 0 ); n = 0; do { calc_corr( input_QS + n, corr_QC, o - 8, state_QS_s32x4[ 0 ][ 0 ] ); calc_corr( input_QS + n, corr_QC, o - 4, state_QS_s32x4[ 0 ][ 1 ] ); state_QS_s32x4[ 2 ][ 1 ] = vld1q_s32( in + n ); vst1q_lane_s32( state + n, state_QS_s32x4[ 0 ][ 0 ], 0 ); state_QS_s32x4[ 2 ][ 0 ] = vextq_s32( state_QS_s32x4[ 0 ][ 0 ], state_QS_s32x4[ 0 ][ 1 ], 1 ); state_QS_s32x4[ 2 ][ 1 ] = vextq_s32( state_QS_s32x4[ 0 ][ 1 ], state_QS_s32x4[ 2 ][ 1 ], 1 ); state_QS_s32x4[ 0 ][ 0 ] = calc_state( state_QS_s32x4[ 0 ][ 0 ], state_QS_s32x4[ 2 ][ 0 ], state_QS_s32x4[ 1 ][ 0 ], warping_Q16_s32x4 ); state_QS_s32x4[ 0 ][ 1 ] = calc_state( state_QS_s32x4[ 0 ][ 1 ], state_QS_s32x4[ 2 ][ 1 ], state_QS_s32x4[ 1 ][ 1 ], warping_Q16_s32x4 ); state_QS_s32x4[ 1 ][ 0 ] = state_QS_s32x4[ 2 ][ 0 ]; state_QS_s32x4[ 1 ][ 1 ] = state_QS_s32x4[ 2 ][ 1 ]; } while( ++n < ( length + order ) ); in = state; o -= 8; } while( o > 4 ); if( o ) { /* Calculate the last 4 taps of all inputs. */ opus_int32 *stateT = state; silk_assert( o == 4 ); state_QS_s32x4[ 0 ][ 0 ] = state_QS_s32x4[ 1 ][ 0 ] = vdupq_n_s32( 0 ); n = length + order; do { calc_corr( input_QS, corr_QC, 0, state_QS_s32x4[ 0 ][ 0 ] ); state_QS_s32x4[ 2 ][ 0 ] = vld1q_s32( stateT ); vst1q_lane_s32( stateT, state_QS_s32x4[ 0 ][ 0 ], 0 ); state_QS_s32x4[ 2 ][ 0 ] = vextq_s32( state_QS_s32x4[ 0 ][ 0 ], state_QS_s32x4[ 2 ][ 0 ], 1 ); state_QS_s32x4[ 0 ][ 0 ] = calc_state( state_QS_s32x4[ 0 ][ 0 ], state_QS_s32x4[ 2 ][ 0 ], state_QS_s32x4[ 1 ][ 0 ], warping_Q16_s32x4 ); state_QS_s32x4[ 1 ][ 0 ] = state_QS_s32x4[ 2 ][ 0 ]; input_QS++; stateT++; } while( --n ); } } { const opus_int16 *inputT = input; int32x4_t t_s32x4; int64x1_t t_s64x1; int64x2_t t_s64x2 = vdupq_n_s64( 0 ); for( n = 0; n <= length - 8; n += 8 ) { int16x8_t input_s16x8 = vld1q_s16( inputT ); t_s32x4 = vmull_s16( vget_low_s16( input_s16x8 ), vget_low_s16( input_s16x8 ) ); t_s32x4 = vmlal_s16( t_s32x4, vget_high_s16( input_s16x8 ), vget_high_s16( input_s16x8 ) ); t_s64x2 = vaddw_s32( t_s64x2, vget_low_s32( t_s32x4 ) ); t_s64x2 = vaddw_s32( t_s64x2, vget_high_s32( t_s32x4 ) ); inputT += 8; } t_s64x1 = vadd_s64( vget_low_s64( t_s64x2 ), vget_high_s64( t_s64x2 ) ); corr_QC_orderT = vget_lane_s64( t_s64x1, 0 ); for( ; n < length; n++ ) { corr_QC_orderT += silk_SMULL( input[ n ], input[ n ] ); } corr_QC_orderT = silk_LSHIFT64( corr_QC_orderT, QC ); corr_QC[ orderT ] = corr_QC_orderT; } corr_QCT = corr_QC + orderT - order; lsh = silk_CLZ64( corr_QC_orderT ) - 35; lsh = silk_LIMIT( lsh, -12 - QC, 30 - QC ); *scale = -( QC + lsh ); silk_assert( *scale >= -30 && *scale <= 12 ); lsh_s64x2 = vdupq_n_s64( lsh ); for( i = 0; i <= order - 3; i += 4 ) { int32x4_t corr_s32x4; int64x2_t corr_QC0_s64x2, corr_QC1_s64x2; corr_QC0_s64x2 = vld1q_s64( corr_QCT + i ); corr_QC1_s64x2 = vld1q_s64( corr_QCT + i + 2 ); corr_QC0_s64x2 = vshlq_s64( corr_QC0_s64x2, lsh_s64x2 ); corr_QC1_s64x2 = vshlq_s64( corr_QC1_s64x2, lsh_s64x2 ); corr_s32x4 = vcombine_s32( vmovn_s64( corr_QC1_s64x2 ), vmovn_s64( corr_QC0_s64x2 ) ); corr_s32x4 = vrev64q_s32( corr_s32x4 ); vst1q_s32( corr + order - i - 3, corr_s32x4 ); } if( lsh >= 0 ) { for( ; i < order + 1; i++ ) { corr[ order - i ] = (opus_int32)silk_CHECK_FIT32( silk_LSHIFT64( corr_QCT[ i ], lsh ) ); } } else { for( ; i < order + 1; i++ ) { corr[ order - i ] = (opus_int32)silk_CHECK_FIT32( silk_RSHIFT64( corr_QCT[ i ], -lsh ) ); } } silk_assert( corr_QCT[ order ] >= 0 ); /* If breaking, decrease QC*/ RESTORE_STACK; } #ifdef OPUS_CHECK_ASM { opus_int32 corr_c[ MAX_SHAPE_LPC_ORDER + 1 ]; opus_int scale_c; silk_warped_autocorrelation_FIX_c( corr_c, &scale_c, input, warping_Q16, length, order ); silk_assert( !memcmp( corr_c, corr, sizeof( corr_c[ 0 ] ) * ( order + 1 ) ) ); silk_assert( scale_c == *scale ); } #endif } mumble-1.3.4/3rdparty/opus-src/silk/fixed/arm/warped_autocorrelation_FIX_arm.h0000664000175000017500000001026114010707327027276 0ustar builderbuilder/*********************************************************************** Copyright (c) 2017 Google Inc. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef SILK_WARPED_AUTOCORRELATION_FIX_ARM_H # define SILK_WARPED_AUTOCORRELATION_FIX_ARM_H # include "celt/arm/armcpu.h" # if defined(FIXED_POINT) # if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) void silk_warped_autocorrelation_FIX_neon( opus_int32 *corr, /* O Result [order + 1] */ opus_int *scale, /* O Scaling of the correlation vector */ const opus_int16 *input, /* I Input data to correlate */ const opus_int warping_Q16, /* I Warping coefficient */ const opus_int length, /* I Length of input */ const opus_int order /* I Correlation order (even) */ ); # if !defined(OPUS_HAVE_RTCD) && defined(OPUS_ARM_PRESUME_NEON) # define OVERRIDE_silk_warped_autocorrelation_FIX (1) # define silk_warped_autocorrelation_FIX(corr, scale, input, warping_Q16, length, order, arch) \ ((void)(arch), PRESUME_NEON(silk_warped_autocorrelation_FIX)(corr, scale, input, warping_Q16, length, order)) # endif # endif # if !defined(OVERRIDE_silk_warped_autocorrelation_FIX) /*Is run-time CPU detection enabled on this platform?*/ # if defined(OPUS_HAVE_RTCD) && (defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR)) extern void (*const SILK_WARPED_AUTOCORRELATION_FIX_IMPL[OPUS_ARCHMASK+1])(opus_int32*, opus_int*, const opus_int16*, const opus_int, const opus_int, const opus_int); # define OVERRIDE_silk_warped_autocorrelation_FIX (1) # define silk_warped_autocorrelation_FIX(corr, scale, input, warping_Q16, length, order, arch) \ ((*SILK_WARPED_AUTOCORRELATION_FIX_IMPL[(arch)&OPUS_ARCHMASK])(corr, scale, input, warping_Q16, length, order)) # elif defined(OPUS_ARM_PRESUME_NEON_INTR) # define OVERRIDE_silk_warped_autocorrelation_FIX (1) # define silk_warped_autocorrelation_FIX(corr, scale, input, warping_Q16, length, order, arch) \ ((void)(arch), silk_warped_autocorrelation_FIX_neon(corr, scale, input, warping_Q16, length, order)) # endif # endif # endif /* end FIXED_POINT */ #endif /* end SILK_WARPED_AUTOCORRELATION_FIX_ARM_H */ mumble-1.3.4/3rdparty/opus-src/silk/fixed/k2a_Q16_FIX.c0000664000175000017500000000507614010707327022213 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "SigProc_FIX.h" /* Step up function, converts reflection coefficients to prediction coefficients */ void silk_k2a_Q16( opus_int32 *A_Q24, /* O Prediction coefficients [order] Q24 */ const opus_int32 *rc_Q16, /* I Reflection coefficients [order] Q16 */ const opus_int32 order /* I Prediction order */ ) { opus_int k, n; opus_int32 rc, tmp1, tmp2; for( k = 0; k < order; k++ ) { rc = rc_Q16[ k ]; for( n = 0; n < (k + 1) >> 1; n++ ) { tmp1 = A_Q24[ n ]; tmp2 = A_Q24[ k - n - 1 ]; A_Q24[ n ] = silk_SMLAWW( tmp1, tmp2, rc ); A_Q24[ k - n - 1 ] = silk_SMLAWW( tmp2, tmp1, rc ); } A_Q24[ k ] = -silk_LSHIFT( rc, 8 ); } } mumble-1.3.4/3rdparty/opus-src/silk/fixed/residual_energy16_FIX.c0000664000175000017500000001134514010707327024433 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main_FIX.h" /* Residual energy: nrg = wxx - 2 * wXx * c + c' * wXX * c */ opus_int32 silk_residual_energy16_covar_FIX( const opus_int16 *c, /* I Prediction vector */ const opus_int32 *wXX, /* I Correlation matrix */ const opus_int32 *wXx, /* I Correlation vector */ opus_int32 wxx, /* I Signal energy */ opus_int D, /* I Dimension */ opus_int cQ /* I Q value for c vector 0 - 15 */ ) { opus_int i, j, lshifts, Qxtra; opus_int32 c_max, w_max, tmp, tmp2, nrg; opus_int cn[ MAX_MATRIX_SIZE ]; const opus_int32 *pRow; /* Safety checks */ silk_assert( D >= 0 ); silk_assert( D <= 16 ); silk_assert( cQ > 0 ); silk_assert( cQ < 16 ); lshifts = 16 - cQ; Qxtra = lshifts; c_max = 0; for( i = 0; i < D; i++ ) { c_max = silk_max_32( c_max, silk_abs( (opus_int32)c[ i ] ) ); } Qxtra = silk_min_int( Qxtra, silk_CLZ32( c_max ) - 17 ); w_max = silk_max_32( wXX[ 0 ], wXX[ D * D - 1 ] ); Qxtra = silk_min_int( Qxtra, silk_CLZ32( silk_MUL( D, silk_RSHIFT( silk_SMULWB( w_max, c_max ), 4 ) ) ) - 5 ); Qxtra = silk_max_int( Qxtra, 0 ); for( i = 0; i < D; i++ ) { cn[ i ] = silk_LSHIFT( ( opus_int )c[ i ], Qxtra ); silk_assert( silk_abs(cn[i]) <= ( silk_int16_MAX + 1 ) ); /* Check that silk_SMLAWB can be used */ } lshifts -= Qxtra; /* Compute wxx - 2 * wXx * c */ tmp = 0; for( i = 0; i < D; i++ ) { tmp = silk_SMLAWB( tmp, wXx[ i ], cn[ i ] ); } nrg = silk_RSHIFT( wxx, 1 + lshifts ) - tmp; /* Q: -lshifts - 1 */ /* Add c' * wXX * c, assuming wXX is symmetric */ tmp2 = 0; for( i = 0; i < D; i++ ) { tmp = 0; pRow = &wXX[ i * D ]; for( j = i + 1; j < D; j++ ) { tmp = silk_SMLAWB( tmp, pRow[ j ], cn[ j ] ); } tmp = silk_SMLAWB( tmp, silk_RSHIFT( pRow[ i ], 1 ), cn[ i ] ); tmp2 = silk_SMLAWB( tmp2, tmp, cn[ i ] ); } nrg = silk_ADD_LSHIFT32( nrg, tmp2, lshifts ); /* Q: -lshifts - 1 */ /* Keep one bit free always, because we add them for LSF interpolation */ if( nrg < 1 ) { nrg = 1; } else if( nrg > silk_RSHIFT( silk_int32_MAX, lshifts + 2 ) ) { nrg = silk_int32_MAX >> 1; } else { nrg = silk_LSHIFT( nrg, lshifts + 1 ); /* Q0 */ } return nrg; } mumble-1.3.4/3rdparty/opus-src/silk/fixed/burg_modified_FIX.c0000664000175000017500000004063014010707327023701 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "SigProc_FIX.h" #include "define.h" #include "tuning_parameters.h" #include "pitch.h" #define MAX_FRAME_SIZE 384 /* subfr_length * nb_subfr = ( 0.005 * 16000 + 16 ) * 4 = 384 */ #define QA 25 #define N_BITS_HEAD_ROOM 3 #define MIN_RSHIFTS -16 #define MAX_RSHIFTS (32 - QA) /* Compute reflection coefficients from input signal */ void silk_burg_modified_c( opus_int32 *res_nrg, /* O Residual energy */ opus_int *res_nrg_Q, /* O Residual energy Q value */ opus_int32 A_Q16[], /* O Prediction coefficients (length order) */ const opus_int16 x[], /* I Input signal, length: nb_subfr * ( D + subfr_length ) */ const opus_int32 minInvGain_Q30, /* I Inverse of max prediction gain */ const opus_int subfr_length, /* I Input signal subframe length (incl. D preceding samples) */ const opus_int nb_subfr, /* I Number of subframes stacked in x */ const opus_int D, /* I Order */ int arch /* I Run-time architecture */ ) { opus_int k, n, s, lz, rshifts, reached_max_gain; opus_int32 C0, num, nrg, rc_Q31, invGain_Q30, Atmp_QA, Atmp1, tmp1, tmp2, x1, x2; const opus_int16 *x_ptr; opus_int32 C_first_row[ SILK_MAX_ORDER_LPC ]; opus_int32 C_last_row[ SILK_MAX_ORDER_LPC ]; opus_int32 Af_QA[ SILK_MAX_ORDER_LPC ]; opus_int32 CAf[ SILK_MAX_ORDER_LPC + 1 ]; opus_int32 CAb[ SILK_MAX_ORDER_LPC + 1 ]; opus_int32 xcorr[ SILK_MAX_ORDER_LPC ]; opus_int64 C0_64; silk_assert( subfr_length * nb_subfr <= MAX_FRAME_SIZE ); /* Compute autocorrelations, added over subframes */ C0_64 = silk_inner_prod16_aligned_64( x, x, subfr_length*nb_subfr, arch ); lz = silk_CLZ64(C0_64); rshifts = 32 + 1 + N_BITS_HEAD_ROOM - lz; if (rshifts > MAX_RSHIFTS) rshifts = MAX_RSHIFTS; if (rshifts < MIN_RSHIFTS) rshifts = MIN_RSHIFTS; if (rshifts > 0) { C0 = (opus_int32)silk_RSHIFT64(C0_64, rshifts ); } else { C0 = silk_LSHIFT32((opus_int32)C0_64, -rshifts ); } CAb[ 0 ] = CAf[ 0 ] = C0 + silk_SMMUL( SILK_FIX_CONST( FIND_LPC_COND_FAC, 32 ), C0 ) + 1; /* Q(-rshifts) */ silk_memset( C_first_row, 0, SILK_MAX_ORDER_LPC * sizeof( opus_int32 ) ); if( rshifts > 0 ) { for( s = 0; s < nb_subfr; s++ ) { x_ptr = x + s * subfr_length; for( n = 1; n < D + 1; n++ ) { C_first_row[ n - 1 ] += (opus_int32)silk_RSHIFT64( silk_inner_prod16_aligned_64( x_ptr, x_ptr + n, subfr_length - n, arch ), rshifts ); } } } else { for( s = 0; s < nb_subfr; s++ ) { int i; opus_int32 d; x_ptr = x + s * subfr_length; celt_pitch_xcorr(x_ptr, x_ptr + 1, xcorr, subfr_length - D, D, arch ); for( n = 1; n < D + 1; n++ ) { for ( i = n + subfr_length - D, d = 0; i < subfr_length; i++ ) d = MAC16_16( d, x_ptr[ i ], x_ptr[ i - n ] ); xcorr[ n - 1 ] += d; } for( n = 1; n < D + 1; n++ ) { C_first_row[ n - 1 ] += silk_LSHIFT32( xcorr[ n - 1 ], -rshifts ); } } } silk_memcpy( C_last_row, C_first_row, SILK_MAX_ORDER_LPC * sizeof( opus_int32 ) ); /* Initialize */ CAb[ 0 ] = CAf[ 0 ] = C0 + silk_SMMUL( SILK_FIX_CONST( FIND_LPC_COND_FAC, 32 ), C0 ) + 1; /* Q(-rshifts) */ invGain_Q30 = (opus_int32)1 << 30; reached_max_gain = 0; for( n = 0; n < D; n++ ) { /* Update first row of correlation matrix (without first element) */ /* Update last row of correlation matrix (without last element, stored in reversed order) */ /* Update C * Af */ /* Update C * flipud(Af) (stored in reversed order) */ if( rshifts > -2 ) { for( s = 0; s < nb_subfr; s++ ) { x_ptr = x + s * subfr_length; x1 = -silk_LSHIFT32( (opus_int32)x_ptr[ n ], 16 - rshifts ); /* Q(16-rshifts) */ x2 = -silk_LSHIFT32( (opus_int32)x_ptr[ subfr_length - n - 1 ], 16 - rshifts ); /* Q(16-rshifts) */ tmp1 = silk_LSHIFT32( (opus_int32)x_ptr[ n ], QA - 16 ); /* Q(QA-16) */ tmp2 = silk_LSHIFT32( (opus_int32)x_ptr[ subfr_length - n - 1 ], QA - 16 ); /* Q(QA-16) */ for( k = 0; k < n; k++ ) { C_first_row[ k ] = silk_SMLAWB( C_first_row[ k ], x1, x_ptr[ n - k - 1 ] ); /* Q( -rshifts ) */ C_last_row[ k ] = silk_SMLAWB( C_last_row[ k ], x2, x_ptr[ subfr_length - n + k ] ); /* Q( -rshifts ) */ Atmp_QA = Af_QA[ k ]; tmp1 = silk_SMLAWB( tmp1, Atmp_QA, x_ptr[ n - k - 1 ] ); /* Q(QA-16) */ tmp2 = silk_SMLAWB( tmp2, Atmp_QA, x_ptr[ subfr_length - n + k ] ); /* Q(QA-16) */ } tmp1 = silk_LSHIFT32( -tmp1, 32 - QA - rshifts ); /* Q(16-rshifts) */ tmp2 = silk_LSHIFT32( -tmp2, 32 - QA - rshifts ); /* Q(16-rshifts) */ for( k = 0; k <= n; k++ ) { CAf[ k ] = silk_SMLAWB( CAf[ k ], tmp1, x_ptr[ n - k ] ); /* Q( -rshift ) */ CAb[ k ] = silk_SMLAWB( CAb[ k ], tmp2, x_ptr[ subfr_length - n + k - 1 ] ); /* Q( -rshift ) */ } } } else { for( s = 0; s < nb_subfr; s++ ) { x_ptr = x + s * subfr_length; x1 = -silk_LSHIFT32( (opus_int32)x_ptr[ n ], -rshifts ); /* Q( -rshifts ) */ x2 = -silk_LSHIFT32( (opus_int32)x_ptr[ subfr_length - n - 1 ], -rshifts ); /* Q( -rshifts ) */ tmp1 = silk_LSHIFT32( (opus_int32)x_ptr[ n ], 17 ); /* Q17 */ tmp2 = silk_LSHIFT32( (opus_int32)x_ptr[ subfr_length - n - 1 ], 17 ); /* Q17 */ for( k = 0; k < n; k++ ) { C_first_row[ k ] = silk_MLA( C_first_row[ k ], x1, x_ptr[ n - k - 1 ] ); /* Q( -rshifts ) */ C_last_row[ k ] = silk_MLA( C_last_row[ k ], x2, x_ptr[ subfr_length - n + k ] ); /* Q( -rshifts ) */ Atmp1 = silk_RSHIFT_ROUND( Af_QA[ k ], QA - 17 ); /* Q17 */ /* We sometimes have get overflows in the multiplications (even beyond +/- 2^32), but they cancel each other and the real result seems to always fit in a 32-bit signed integer. This was determined experimentally, not theoretically (unfortunately). */ tmp1 = silk_MLA_ovflw( tmp1, x_ptr[ n - k - 1 ], Atmp1 ); /* Q17 */ tmp2 = silk_MLA_ovflw( tmp2, x_ptr[ subfr_length - n + k ], Atmp1 ); /* Q17 */ } tmp1 = -tmp1; /* Q17 */ tmp2 = -tmp2; /* Q17 */ for( k = 0; k <= n; k++ ) { CAf[ k ] = silk_SMLAWW( CAf[ k ], tmp1, silk_LSHIFT32( (opus_int32)x_ptr[ n - k ], -rshifts - 1 ) ); /* Q( -rshift ) */ CAb[ k ] = silk_SMLAWW( CAb[ k ], tmp2, silk_LSHIFT32( (opus_int32)x_ptr[ subfr_length - n + k - 1 ], -rshifts - 1 ) ); /* Q( -rshift ) */ } } } /* Calculate nominator and denominator for the next order reflection (parcor) coefficient */ tmp1 = C_first_row[ n ]; /* Q( -rshifts ) */ tmp2 = C_last_row[ n ]; /* Q( -rshifts ) */ num = 0; /* Q( -rshifts ) */ nrg = silk_ADD32( CAb[ 0 ], CAf[ 0 ] ); /* Q( 1-rshifts ) */ for( k = 0; k < n; k++ ) { Atmp_QA = Af_QA[ k ]; lz = silk_CLZ32( silk_abs( Atmp_QA ) ) - 1; lz = silk_min( 32 - QA, lz ); Atmp1 = silk_LSHIFT32( Atmp_QA, lz ); /* Q( QA + lz ) */ tmp1 = silk_ADD_LSHIFT32( tmp1, silk_SMMUL( C_last_row[ n - k - 1 ], Atmp1 ), 32 - QA - lz ); /* Q( -rshifts ) */ tmp2 = silk_ADD_LSHIFT32( tmp2, silk_SMMUL( C_first_row[ n - k - 1 ], Atmp1 ), 32 - QA - lz ); /* Q( -rshifts ) */ num = silk_ADD_LSHIFT32( num, silk_SMMUL( CAb[ n - k ], Atmp1 ), 32 - QA - lz ); /* Q( -rshifts ) */ nrg = silk_ADD_LSHIFT32( nrg, silk_SMMUL( silk_ADD32( CAb[ k + 1 ], CAf[ k + 1 ] ), Atmp1 ), 32 - QA - lz ); /* Q( 1-rshifts ) */ } CAf[ n + 1 ] = tmp1; /* Q( -rshifts ) */ CAb[ n + 1 ] = tmp2; /* Q( -rshifts ) */ num = silk_ADD32( num, tmp2 ); /* Q( -rshifts ) */ num = silk_LSHIFT32( -num, 1 ); /* Q( 1-rshifts ) */ /* Calculate the next order reflection (parcor) coefficient */ if( silk_abs( num ) < nrg ) { rc_Q31 = silk_DIV32_varQ( num, nrg, 31 ); } else { rc_Q31 = ( num > 0 ) ? silk_int32_MAX : silk_int32_MIN; } /* Update inverse prediction gain */ tmp1 = ( (opus_int32)1 << 30 ) - silk_SMMUL( rc_Q31, rc_Q31 ); tmp1 = silk_LSHIFT( silk_SMMUL( invGain_Q30, tmp1 ), 2 ); if( tmp1 <= minInvGain_Q30 ) { /* Max prediction gain exceeded; set reflection coefficient such that max prediction gain is exactly hit */ tmp2 = ( (opus_int32)1 << 30 ) - silk_DIV32_varQ( minInvGain_Q30, invGain_Q30, 30 ); /* Q30 */ rc_Q31 = silk_SQRT_APPROX( tmp2 ); /* Q15 */ if( rc_Q31 > 0 ) { /* Newton-Raphson iteration */ rc_Q31 = silk_RSHIFT32( rc_Q31 + silk_DIV32( tmp2, rc_Q31 ), 1 ); /* Q15 */ rc_Q31 = silk_LSHIFT32( rc_Q31, 16 ); /* Q31 */ if( num < 0 ) { /* Ensure adjusted reflection coefficients has the original sign */ rc_Q31 = -rc_Q31; } } invGain_Q30 = minInvGain_Q30; reached_max_gain = 1; } else { invGain_Q30 = tmp1; } /* Update the AR coefficients */ for( k = 0; k < (n + 1) >> 1; k++ ) { tmp1 = Af_QA[ k ]; /* QA */ tmp2 = Af_QA[ n - k - 1 ]; /* QA */ Af_QA[ k ] = silk_ADD_LSHIFT32( tmp1, silk_SMMUL( tmp2, rc_Q31 ), 1 ); /* QA */ Af_QA[ n - k - 1 ] = silk_ADD_LSHIFT32( tmp2, silk_SMMUL( tmp1, rc_Q31 ), 1 ); /* QA */ } Af_QA[ n ] = silk_RSHIFT32( rc_Q31, 31 - QA ); /* QA */ if( reached_max_gain ) { /* Reached max prediction gain; set remaining coefficients to zero and exit loop */ for( k = n + 1; k < D; k++ ) { Af_QA[ k ] = 0; } break; } /* Update C * Af and C * Ab */ for( k = 0; k <= n + 1; k++ ) { tmp1 = CAf[ k ]; /* Q( -rshifts ) */ tmp2 = CAb[ n - k + 1 ]; /* Q( -rshifts ) */ CAf[ k ] = silk_ADD_LSHIFT32( tmp1, silk_SMMUL( tmp2, rc_Q31 ), 1 ); /* Q( -rshifts ) */ CAb[ n - k + 1 ] = silk_ADD_LSHIFT32( tmp2, silk_SMMUL( tmp1, rc_Q31 ), 1 ); /* Q( -rshifts ) */ } } if( reached_max_gain ) { for( k = 0; k < D; k++ ) { /* Scale coefficients */ A_Q16[ k ] = -silk_RSHIFT_ROUND( Af_QA[ k ], QA - 16 ); } /* Subtract energy of preceding samples from C0 */ if( rshifts > 0 ) { for( s = 0; s < nb_subfr; s++ ) { x_ptr = x + s * subfr_length; C0 -= (opus_int32)silk_RSHIFT64( silk_inner_prod16_aligned_64( x_ptr, x_ptr, D, arch ), rshifts ); } } else { for( s = 0; s < nb_subfr; s++ ) { x_ptr = x + s * subfr_length; C0 -= silk_LSHIFT32( silk_inner_prod_aligned( x_ptr, x_ptr, D, arch), -rshifts); } } /* Approximate residual energy */ *res_nrg = silk_LSHIFT( silk_SMMUL( invGain_Q30, C0 ), 2 ); *res_nrg_Q = -rshifts; } else { /* Return residual energy */ nrg = CAf[ 0 ]; /* Q( -rshifts ) */ tmp1 = (opus_int32)1 << 16; /* Q16 */ for( k = 0; k < D; k++ ) { Atmp1 = silk_RSHIFT_ROUND( Af_QA[ k ], QA - 16 ); /* Q16 */ nrg = silk_SMLAWW( nrg, CAf[ k + 1 ], Atmp1 ); /* Q( -rshifts ) */ tmp1 = silk_SMLAWW( tmp1, Atmp1, Atmp1 ); /* Q16 */ A_Q16[ k ] = -Atmp1; } *res_nrg = silk_SMLAWW( nrg, silk_SMMUL( SILK_FIX_CONST( FIND_LPC_COND_FAC, 32 ), C0 ), -tmp1 );/* Q( -rshifts ) */ *res_nrg_Q = -rshifts; } } mumble-1.3.4/3rdparty/opus-src/silk/fixed/pitch_analysis_core_FIX.c0000664000175000017500000010305114010707327025121 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif /*********************************************************** * Pitch analyser function ********************************************************** */ #include "SigProc_FIX.h" #include "pitch_est_defines.h" #include "stack_alloc.h" #include "debug.h" #include "pitch.h" #define SCRATCH_SIZE 22 #define SF_LENGTH_4KHZ ( PE_SUBFR_LENGTH_MS * 4 ) #define SF_LENGTH_8KHZ ( PE_SUBFR_LENGTH_MS * 8 ) #define MIN_LAG_4KHZ ( PE_MIN_LAG_MS * 4 ) #define MIN_LAG_8KHZ ( PE_MIN_LAG_MS * 8 ) #define MAX_LAG_4KHZ ( PE_MAX_LAG_MS * 4 ) #define MAX_LAG_8KHZ ( PE_MAX_LAG_MS * 8 - 1 ) #define CSTRIDE_4KHZ ( MAX_LAG_4KHZ + 1 - MIN_LAG_4KHZ ) #define CSTRIDE_8KHZ ( MAX_LAG_8KHZ + 3 - ( MIN_LAG_8KHZ - 2 ) ) #define D_COMP_MIN ( MIN_LAG_8KHZ - 3 ) #define D_COMP_MAX ( MAX_LAG_8KHZ + 4 ) #define D_COMP_STRIDE ( D_COMP_MAX - D_COMP_MIN ) typedef opus_int32 silk_pe_stage3_vals[ PE_NB_STAGE3_LAGS ]; /************************************************************/ /* Internally used functions */ /************************************************************/ static void silk_P_Ana_calc_corr_st3( silk_pe_stage3_vals cross_corr_st3[], /* O 3 DIM correlation array */ const opus_int16 frame[], /* I vector to correlate */ opus_int start_lag, /* I lag offset to search around */ opus_int sf_length, /* I length of a 5 ms subframe */ opus_int nb_subfr, /* I number of subframes */ opus_int complexity, /* I Complexity setting */ int arch /* I Run-time architecture */ ); static void silk_P_Ana_calc_energy_st3( silk_pe_stage3_vals energies_st3[], /* O 3 DIM energy array */ const opus_int16 frame[], /* I vector to calc energy in */ opus_int start_lag, /* I lag offset to search around */ opus_int sf_length, /* I length of one 5 ms subframe */ opus_int nb_subfr, /* I number of subframes */ opus_int complexity, /* I Complexity setting */ int arch /* I Run-time architecture */ ); /*************************************************************/ /* FIXED POINT CORE PITCH ANALYSIS FUNCTION */ /*************************************************************/ opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0 voiced, 1 unvoiced */ const opus_int16 *frame_unscaled, /* I Signal of length PE_FRAME_LENGTH_MS*Fs_kHz */ opus_int *pitch_out, /* O 4 pitch lag values */ opus_int16 *lagIndex, /* O Lag Index */ opus_int8 *contourIndex, /* O Pitch contour Index */ opus_int *LTPCorr_Q15, /* I/O Normalized correlation; input: value from previous frame */ opus_int prevLag, /* I Last lag of previous frame; set to zero is unvoiced */ const opus_int32 search_thres1_Q16, /* I First stage threshold for lag candidates 0 - 1 */ const opus_int search_thres2_Q13, /* I Final threshold for lag candidates 0 - 1 */ const opus_int Fs_kHz, /* I Sample frequency (kHz) */ const opus_int complexity, /* I Complexity setting, 0-2, where 2 is highest */ const opus_int nb_subfr, /* I number of 5 ms subframes */ int arch /* I Run-time architecture */ ) { VARDECL( opus_int16, frame_8kHz_buf ); VARDECL( opus_int16, frame_4kHz ); VARDECL( opus_int16, frame_scaled ); opus_int32 filt_state[ 6 ]; const opus_int16 *frame, *frame_8kHz; opus_int i, k, d, j; VARDECL( opus_int16, C ); VARDECL( opus_int32, xcorr32 ); const opus_int16 *target_ptr, *basis_ptr; opus_int32 cross_corr, normalizer, energy, energy_basis, energy_target; opus_int d_srch[ PE_D_SRCH_LENGTH ], Cmax, length_d_srch, length_d_comp, shift; VARDECL( opus_int16, d_comp ); opus_int32 sum, threshold, lag_counter; opus_int CBimax, CBimax_new, CBimax_old, lag, start_lag, end_lag, lag_new; opus_int32 CC[ PE_NB_CBKS_STAGE2_EXT ], CCmax, CCmax_b, CCmax_new_b, CCmax_new; VARDECL( silk_pe_stage3_vals, energies_st3 ); VARDECL( silk_pe_stage3_vals, cross_corr_st3 ); opus_int frame_length, frame_length_8kHz, frame_length_4kHz; opus_int sf_length; opus_int min_lag; opus_int max_lag; opus_int32 contour_bias_Q15, diff; opus_int nb_cbk_search, cbk_size; opus_int32 delta_lag_log2_sqr_Q7, lag_log2_Q7, prevLag_log2_Q7, prev_lag_bias_Q13; const opus_int8 *Lag_CB_ptr; SAVE_STACK; /* Check for valid sampling frequency */ silk_assert( Fs_kHz == 8 || Fs_kHz == 12 || Fs_kHz == 16 ); /* Check for valid complexity setting */ silk_assert( complexity >= SILK_PE_MIN_COMPLEX ); silk_assert( complexity <= SILK_PE_MAX_COMPLEX ); silk_assert( search_thres1_Q16 >= 0 && search_thres1_Q16 <= (1<<16) ); silk_assert( search_thres2_Q13 >= 0 && search_thres2_Q13 <= (1<<13) ); /* Set up frame lengths max / min lag for the sampling frequency */ frame_length = ( PE_LTP_MEM_LENGTH_MS + nb_subfr * PE_SUBFR_LENGTH_MS ) * Fs_kHz; frame_length_4kHz = ( PE_LTP_MEM_LENGTH_MS + nb_subfr * PE_SUBFR_LENGTH_MS ) * 4; frame_length_8kHz = ( PE_LTP_MEM_LENGTH_MS + nb_subfr * PE_SUBFR_LENGTH_MS ) * 8; sf_length = PE_SUBFR_LENGTH_MS * Fs_kHz; min_lag = PE_MIN_LAG_MS * Fs_kHz; max_lag = PE_MAX_LAG_MS * Fs_kHz - 1; /* Downscale input if necessary */ silk_sum_sqr_shift( &energy, &shift, frame_unscaled, frame_length ); shift += 3 - silk_CLZ32( energy ); /* at least two bits headroom */ ALLOC( frame_scaled, frame_length, opus_int16 ); if( shift > 0 ) { shift = silk_RSHIFT( shift + 1, 1 ); for( i = 0; i < frame_length; i++ ) { frame_scaled[ i ] = silk_RSHIFT( frame_unscaled[ i ], shift ); } frame = frame_scaled; } else { frame = frame_unscaled; } ALLOC( frame_8kHz_buf, ( Fs_kHz == 8 ) ? 1 : frame_length_8kHz, opus_int16 ); /* Resample from input sampled at Fs_kHz to 8 kHz */ if( Fs_kHz == 16 ) { silk_memset( filt_state, 0, 2 * sizeof( opus_int32 ) ); silk_resampler_down2( filt_state, frame_8kHz_buf, frame, frame_length ); frame_8kHz = frame_8kHz_buf; } else if( Fs_kHz == 12 ) { silk_memset( filt_state, 0, 6 * sizeof( opus_int32 ) ); silk_resampler_down2_3( filt_state, frame_8kHz_buf, frame, frame_length ); frame_8kHz = frame_8kHz_buf; } else { silk_assert( Fs_kHz == 8 ); frame_8kHz = frame; } /* Decimate again to 4 kHz */ silk_memset( filt_state, 0, 2 * sizeof( opus_int32 ) );/* Set state to zero */ ALLOC( frame_4kHz, frame_length_4kHz, opus_int16 ); silk_resampler_down2( filt_state, frame_4kHz, frame_8kHz, frame_length_8kHz ); /* Low-pass filter */ for( i = frame_length_4kHz - 1; i > 0; i-- ) { frame_4kHz[ i ] = silk_ADD_SAT16( frame_4kHz[ i ], frame_4kHz[ i - 1 ] ); } /****************************************************************************** * FIRST STAGE, operating in 4 khz ******************************************************************************/ ALLOC( C, nb_subfr * CSTRIDE_8KHZ, opus_int16 ); ALLOC( xcorr32, MAX_LAG_4KHZ-MIN_LAG_4KHZ+1, opus_int32 ); silk_memset( C, 0, (nb_subfr >> 1) * CSTRIDE_4KHZ * sizeof( opus_int16 ) ); target_ptr = &frame_4kHz[ silk_LSHIFT( SF_LENGTH_4KHZ, 2 ) ]; for( k = 0; k < nb_subfr >> 1; k++ ) { /* Check that we are within range of the array */ silk_assert( target_ptr >= frame_4kHz ); silk_assert( target_ptr + SF_LENGTH_8KHZ <= frame_4kHz + frame_length_4kHz ); basis_ptr = target_ptr - MIN_LAG_4KHZ; /* Check that we are within range of the array */ silk_assert( basis_ptr >= frame_4kHz ); silk_assert( basis_ptr + SF_LENGTH_8KHZ <= frame_4kHz + frame_length_4kHz ); celt_pitch_xcorr( target_ptr, target_ptr - MAX_LAG_4KHZ, xcorr32, SF_LENGTH_8KHZ, MAX_LAG_4KHZ - MIN_LAG_4KHZ + 1, arch ); /* Calculate first vector products before loop */ cross_corr = xcorr32[ MAX_LAG_4KHZ - MIN_LAG_4KHZ ]; normalizer = silk_inner_prod_aligned( target_ptr, target_ptr, SF_LENGTH_8KHZ, arch ); normalizer = silk_ADD32( normalizer, silk_inner_prod_aligned( basis_ptr, basis_ptr, SF_LENGTH_8KHZ, arch ) ); normalizer = silk_ADD32( normalizer, silk_SMULBB( SF_LENGTH_8KHZ, 4000 ) ); matrix_ptr( C, k, 0, CSTRIDE_4KHZ ) = (opus_int16)silk_DIV32_varQ( cross_corr, normalizer, 13 + 1 ); /* Q13 */ /* From now on normalizer is computed recursively */ for( d = MIN_LAG_4KHZ + 1; d <= MAX_LAG_4KHZ; d++ ) { basis_ptr--; /* Check that we are within range of the array */ silk_assert( basis_ptr >= frame_4kHz ); silk_assert( basis_ptr + SF_LENGTH_8KHZ <= frame_4kHz + frame_length_4kHz ); cross_corr = xcorr32[ MAX_LAG_4KHZ - d ]; /* Add contribution of new sample and remove contribution from oldest sample */ normalizer = silk_ADD32( normalizer, silk_SMULBB( basis_ptr[ 0 ], basis_ptr[ 0 ] ) - silk_SMULBB( basis_ptr[ SF_LENGTH_8KHZ ], basis_ptr[ SF_LENGTH_8KHZ ] ) ); matrix_ptr( C, k, d - MIN_LAG_4KHZ, CSTRIDE_4KHZ) = (opus_int16)silk_DIV32_varQ( cross_corr, normalizer, 13 + 1 ); /* Q13 */ } /* Update target pointer */ target_ptr += SF_LENGTH_8KHZ; } /* Combine two subframes into single correlation measure and apply short-lag bias */ if( nb_subfr == PE_MAX_NB_SUBFR ) { for( i = MAX_LAG_4KHZ; i >= MIN_LAG_4KHZ; i-- ) { sum = (opus_int32)matrix_ptr( C, 0, i - MIN_LAG_4KHZ, CSTRIDE_4KHZ ) + (opus_int32)matrix_ptr( C, 1, i - MIN_LAG_4KHZ, CSTRIDE_4KHZ ); /* Q14 */ sum = silk_SMLAWB( sum, sum, silk_LSHIFT( -i, 4 ) ); /* Q14 */ C[ i - MIN_LAG_4KHZ ] = (opus_int16)sum; /* Q14 */ } } else { /* Only short-lag bias */ for( i = MAX_LAG_4KHZ; i >= MIN_LAG_4KHZ; i-- ) { sum = silk_LSHIFT( (opus_int32)C[ i - MIN_LAG_4KHZ ], 1 ); /* Q14 */ sum = silk_SMLAWB( sum, sum, silk_LSHIFT( -i, 4 ) ); /* Q14 */ C[ i - MIN_LAG_4KHZ ] = (opus_int16)sum; /* Q14 */ } } /* Sort */ length_d_srch = silk_ADD_LSHIFT32( 4, complexity, 1 ); silk_assert( 3 * length_d_srch <= PE_D_SRCH_LENGTH ); silk_insertion_sort_decreasing_int16( C, d_srch, CSTRIDE_4KHZ, length_d_srch ); /* Escape if correlation is very low already here */ Cmax = (opus_int)C[ 0 ]; /* Q14 */ if( Cmax < SILK_FIX_CONST( 0.2, 14 ) ) { silk_memset( pitch_out, 0, nb_subfr * sizeof( opus_int ) ); *LTPCorr_Q15 = 0; *lagIndex = 0; *contourIndex = 0; RESTORE_STACK; return 1; } threshold = silk_SMULWB( search_thres1_Q16, Cmax ); for( i = 0; i < length_d_srch; i++ ) { /* Convert to 8 kHz indices for the sorted correlation that exceeds the threshold */ if( C[ i ] > threshold ) { d_srch[ i ] = silk_LSHIFT( d_srch[ i ] + MIN_LAG_4KHZ, 1 ); } else { length_d_srch = i; break; } } silk_assert( length_d_srch > 0 ); ALLOC( d_comp, D_COMP_STRIDE, opus_int16 ); for( i = D_COMP_MIN; i < D_COMP_MAX; i++ ) { d_comp[ i - D_COMP_MIN ] = 0; } for( i = 0; i < length_d_srch; i++ ) { d_comp[ d_srch[ i ] - D_COMP_MIN ] = 1; } /* Convolution */ for( i = D_COMP_MAX - 1; i >= MIN_LAG_8KHZ; i-- ) { d_comp[ i - D_COMP_MIN ] += d_comp[ i - 1 - D_COMP_MIN ] + d_comp[ i - 2 - D_COMP_MIN ]; } length_d_srch = 0; for( i = MIN_LAG_8KHZ; i < MAX_LAG_8KHZ + 1; i++ ) { if( d_comp[ i + 1 - D_COMP_MIN ] > 0 ) { d_srch[ length_d_srch ] = i; length_d_srch++; } } /* Convolution */ for( i = D_COMP_MAX - 1; i >= MIN_LAG_8KHZ; i-- ) { d_comp[ i - D_COMP_MIN ] += d_comp[ i - 1 - D_COMP_MIN ] + d_comp[ i - 2 - D_COMP_MIN ] + d_comp[ i - 3 - D_COMP_MIN ]; } length_d_comp = 0; for( i = MIN_LAG_8KHZ; i < D_COMP_MAX; i++ ) { if( d_comp[ i - D_COMP_MIN ] > 0 ) { d_comp[ length_d_comp ] = i - 2; length_d_comp++; } } /********************************************************************************** ** SECOND STAGE, operating at 8 kHz, on lag sections with high correlation *************************************************************************************/ /********************************************************************************* * Find energy of each subframe projected onto its history, for a range of delays *********************************************************************************/ silk_memset( C, 0, nb_subfr * CSTRIDE_8KHZ * sizeof( opus_int16 ) ); target_ptr = &frame_8kHz[ PE_LTP_MEM_LENGTH_MS * 8 ]; for( k = 0; k < nb_subfr; k++ ) { /* Check that we are within range of the array */ silk_assert( target_ptr >= frame_8kHz ); silk_assert( target_ptr + SF_LENGTH_8KHZ <= frame_8kHz + frame_length_8kHz ); energy_target = silk_ADD32( silk_inner_prod_aligned( target_ptr, target_ptr, SF_LENGTH_8KHZ, arch ), 1 ); for( j = 0; j < length_d_comp; j++ ) { d = d_comp[ j ]; basis_ptr = target_ptr - d; /* Check that we are within range of the array */ silk_assert( basis_ptr >= frame_8kHz ); silk_assert( basis_ptr + SF_LENGTH_8KHZ <= frame_8kHz + frame_length_8kHz ); cross_corr = silk_inner_prod_aligned( target_ptr, basis_ptr, SF_LENGTH_8KHZ, arch ); if( cross_corr > 0 ) { energy_basis = silk_inner_prod_aligned( basis_ptr, basis_ptr, SF_LENGTH_8KHZ, arch ); matrix_ptr( C, k, d - ( MIN_LAG_8KHZ - 2 ), CSTRIDE_8KHZ ) = (opus_int16)silk_DIV32_varQ( cross_corr, silk_ADD32( energy_target, energy_basis ), 13 + 1 ); /* Q13 */ } else { matrix_ptr( C, k, d - ( MIN_LAG_8KHZ - 2 ), CSTRIDE_8KHZ ) = 0; } } target_ptr += SF_LENGTH_8KHZ; } /* search over lag range and lags codebook */ /* scale factor for lag codebook, as a function of center lag */ CCmax = silk_int32_MIN; CCmax_b = silk_int32_MIN; CBimax = 0; /* To avoid returning undefined lag values */ lag = -1; /* To check if lag with strong enough correlation has been found */ if( prevLag > 0 ) { if( Fs_kHz == 12 ) { prevLag = silk_DIV32_16( silk_LSHIFT( prevLag, 1 ), 3 ); } else if( Fs_kHz == 16 ) { prevLag = silk_RSHIFT( prevLag, 1 ); } prevLag_log2_Q7 = silk_lin2log( (opus_int32)prevLag ); } else { prevLag_log2_Q7 = 0; } silk_assert( search_thres2_Q13 == silk_SAT16( search_thres2_Q13 ) ); /* Set up stage 2 codebook based on number of subframes */ if( nb_subfr == PE_MAX_NB_SUBFR ) { cbk_size = PE_NB_CBKS_STAGE2_EXT; Lag_CB_ptr = &silk_CB_lags_stage2[ 0 ][ 0 ]; if( Fs_kHz == 8 && complexity > SILK_PE_MIN_COMPLEX ) { /* If input is 8 khz use a larger codebook here because it is last stage */ nb_cbk_search = PE_NB_CBKS_STAGE2_EXT; } else { nb_cbk_search = PE_NB_CBKS_STAGE2; } } else { cbk_size = PE_NB_CBKS_STAGE2_10MS; Lag_CB_ptr = &silk_CB_lags_stage2_10_ms[ 0 ][ 0 ]; nb_cbk_search = PE_NB_CBKS_STAGE2_10MS; } for( k = 0; k < length_d_srch; k++ ) { d = d_srch[ k ]; for( j = 0; j < nb_cbk_search; j++ ) { CC[ j ] = 0; for( i = 0; i < nb_subfr; i++ ) { opus_int d_subfr; /* Try all codebooks */ d_subfr = d + matrix_ptr( Lag_CB_ptr, i, j, cbk_size ); CC[ j ] = CC[ j ] + (opus_int32)matrix_ptr( C, i, d_subfr - ( MIN_LAG_8KHZ - 2 ), CSTRIDE_8KHZ ); } } /* Find best codebook */ CCmax_new = silk_int32_MIN; CBimax_new = 0; for( i = 0; i < nb_cbk_search; i++ ) { if( CC[ i ] > CCmax_new ) { CCmax_new = CC[ i ]; CBimax_new = i; } } /* Bias towards shorter lags */ lag_log2_Q7 = silk_lin2log( d ); /* Q7 */ silk_assert( lag_log2_Q7 == silk_SAT16( lag_log2_Q7 ) ); silk_assert( nb_subfr * SILK_FIX_CONST( PE_SHORTLAG_BIAS, 13 ) == silk_SAT16( nb_subfr * SILK_FIX_CONST( PE_SHORTLAG_BIAS, 13 ) ) ); CCmax_new_b = CCmax_new - silk_RSHIFT( silk_SMULBB( nb_subfr * SILK_FIX_CONST( PE_SHORTLAG_BIAS, 13 ), lag_log2_Q7 ), 7 ); /* Q13 */ /* Bias towards previous lag */ silk_assert( nb_subfr * SILK_FIX_CONST( PE_PREVLAG_BIAS, 13 ) == silk_SAT16( nb_subfr * SILK_FIX_CONST( PE_PREVLAG_BIAS, 13 ) ) ); if( prevLag > 0 ) { delta_lag_log2_sqr_Q7 = lag_log2_Q7 - prevLag_log2_Q7; silk_assert( delta_lag_log2_sqr_Q7 == silk_SAT16( delta_lag_log2_sqr_Q7 ) ); delta_lag_log2_sqr_Q7 = silk_RSHIFT( silk_SMULBB( delta_lag_log2_sqr_Q7, delta_lag_log2_sqr_Q7 ), 7 ); prev_lag_bias_Q13 = silk_RSHIFT( silk_SMULBB( nb_subfr * SILK_FIX_CONST( PE_PREVLAG_BIAS, 13 ), *LTPCorr_Q15 ), 15 ); /* Q13 */ prev_lag_bias_Q13 = silk_DIV32( silk_MUL( prev_lag_bias_Q13, delta_lag_log2_sqr_Q7 ), delta_lag_log2_sqr_Q7 + SILK_FIX_CONST( 0.5, 7 ) ); CCmax_new_b -= prev_lag_bias_Q13; /* Q13 */ } if( CCmax_new_b > CCmax_b && /* Find maximum biased correlation */ CCmax_new > silk_SMULBB( nb_subfr, search_thres2_Q13 ) && /* Correlation needs to be high enough to be voiced */ silk_CB_lags_stage2[ 0 ][ CBimax_new ] <= MIN_LAG_8KHZ /* Lag must be in range */ ) { CCmax_b = CCmax_new_b; CCmax = CCmax_new; lag = d; CBimax = CBimax_new; } } if( lag == -1 ) { /* No suitable candidate found */ silk_memset( pitch_out, 0, nb_subfr * sizeof( opus_int ) ); *LTPCorr_Q15 = 0; *lagIndex = 0; *contourIndex = 0; RESTORE_STACK; return 1; } /* Output normalized correlation */ *LTPCorr_Q15 = (opus_int)silk_LSHIFT( silk_DIV32_16( CCmax, nb_subfr ), 2 ); silk_assert( *LTPCorr_Q15 >= 0 ); if( Fs_kHz > 8 ) { /* Search in original signal */ CBimax_old = CBimax; /* Compensate for decimation */ silk_assert( lag == silk_SAT16( lag ) ); if( Fs_kHz == 12 ) { lag = silk_RSHIFT( silk_SMULBB( lag, 3 ), 1 ); } else if( Fs_kHz == 16 ) { lag = silk_LSHIFT( lag, 1 ); } else { lag = silk_SMULBB( lag, 3 ); } lag = silk_LIMIT_int( lag, min_lag, max_lag ); start_lag = silk_max_int( lag - 2, min_lag ); end_lag = silk_min_int( lag + 2, max_lag ); lag_new = lag; /* to avoid undefined lag */ CBimax = 0; /* to avoid undefined lag */ CCmax = silk_int32_MIN; /* pitch lags according to second stage */ for( k = 0; k < nb_subfr; k++ ) { pitch_out[ k ] = lag + 2 * silk_CB_lags_stage2[ k ][ CBimax_old ]; } /* Set up codebook parameters according to complexity setting and frame length */ if( nb_subfr == PE_MAX_NB_SUBFR ) { nb_cbk_search = (opus_int)silk_nb_cbk_searchs_stage3[ complexity ]; cbk_size = PE_NB_CBKS_STAGE3_MAX; Lag_CB_ptr = &silk_CB_lags_stage3[ 0 ][ 0 ]; } else { nb_cbk_search = PE_NB_CBKS_STAGE3_10MS; cbk_size = PE_NB_CBKS_STAGE3_10MS; Lag_CB_ptr = &silk_CB_lags_stage3_10_ms[ 0 ][ 0 ]; } /* Calculate the correlations and energies needed in stage 3 */ ALLOC( energies_st3, nb_subfr * nb_cbk_search, silk_pe_stage3_vals ); ALLOC( cross_corr_st3, nb_subfr * nb_cbk_search, silk_pe_stage3_vals ); silk_P_Ana_calc_corr_st3( cross_corr_st3, frame, start_lag, sf_length, nb_subfr, complexity, arch ); silk_P_Ana_calc_energy_st3( energies_st3, frame, start_lag, sf_length, nb_subfr, complexity, arch ); lag_counter = 0; silk_assert( lag == silk_SAT16( lag ) ); contour_bias_Q15 = silk_DIV32_16( SILK_FIX_CONST( PE_FLATCONTOUR_BIAS, 15 ), lag ); target_ptr = &frame[ PE_LTP_MEM_LENGTH_MS * Fs_kHz ]; energy_target = silk_ADD32( silk_inner_prod_aligned( target_ptr, target_ptr, nb_subfr * sf_length, arch ), 1 ); for( d = start_lag; d <= end_lag; d++ ) { for( j = 0; j < nb_cbk_search; j++ ) { cross_corr = 0; energy = energy_target; for( k = 0; k < nb_subfr; k++ ) { cross_corr = silk_ADD32( cross_corr, matrix_ptr( cross_corr_st3, k, j, nb_cbk_search )[ lag_counter ] ); energy = silk_ADD32( energy, matrix_ptr( energies_st3, k, j, nb_cbk_search )[ lag_counter ] ); silk_assert( energy >= 0 ); } if( cross_corr > 0 ) { CCmax_new = silk_DIV32_varQ( cross_corr, energy, 13 + 1 ); /* Q13 */ /* Reduce depending on flatness of contour */ diff = silk_int16_MAX - silk_MUL( contour_bias_Q15, j ); /* Q15 */ silk_assert( diff == silk_SAT16( diff ) ); CCmax_new = silk_SMULWB( CCmax_new, diff ); /* Q14 */ } else { CCmax_new = 0; } if( CCmax_new > CCmax && ( d + silk_CB_lags_stage3[ 0 ][ j ] ) <= max_lag ) { CCmax = CCmax_new; lag_new = d; CBimax = j; } } lag_counter++; } for( k = 0; k < nb_subfr; k++ ) { pitch_out[ k ] = lag_new + matrix_ptr( Lag_CB_ptr, k, CBimax, cbk_size ); pitch_out[ k ] = silk_LIMIT( pitch_out[ k ], min_lag, PE_MAX_LAG_MS * Fs_kHz ); } *lagIndex = (opus_int16)( lag_new - min_lag); *contourIndex = (opus_int8)CBimax; } else { /* Fs_kHz == 8 */ /* Save Lags */ for( k = 0; k < nb_subfr; k++ ) { pitch_out[ k ] = lag + matrix_ptr( Lag_CB_ptr, k, CBimax, cbk_size ); pitch_out[ k ] = silk_LIMIT( pitch_out[ k ], MIN_LAG_8KHZ, PE_MAX_LAG_MS * 8 ); } *lagIndex = (opus_int16)( lag - MIN_LAG_8KHZ ); *contourIndex = (opus_int8)CBimax; } silk_assert( *lagIndex >= 0 ); /* return as voiced */ RESTORE_STACK; return 0; } /*********************************************************************** * Calculates the correlations used in stage 3 search. In order to cover * the whole lag codebook for all the searched offset lags (lag +- 2), * the following correlations are needed in each sub frame: * * sf1: lag range [-8,...,7] total 16 correlations * sf2: lag range [-4,...,4] total 9 correlations * sf3: lag range [-3,....4] total 8 correltions * sf4: lag range [-6,....8] total 15 correlations * * In total 48 correlations. The direct implementation computed in worst * case 4*12*5 = 240 correlations, but more likely around 120. ***********************************************************************/ static void silk_P_Ana_calc_corr_st3( silk_pe_stage3_vals cross_corr_st3[], /* O 3 DIM correlation array */ const opus_int16 frame[], /* I vector to correlate */ opus_int start_lag, /* I lag offset to search around */ opus_int sf_length, /* I length of a 5 ms subframe */ opus_int nb_subfr, /* I number of subframes */ opus_int complexity, /* I Complexity setting */ int arch /* I Run-time architecture */ ) { const opus_int16 *target_ptr; opus_int i, j, k, lag_counter, lag_low, lag_high; opus_int nb_cbk_search, delta, idx, cbk_size; VARDECL( opus_int32, scratch_mem ); VARDECL( opus_int32, xcorr32 ); const opus_int8 *Lag_range_ptr, *Lag_CB_ptr; SAVE_STACK; silk_assert( complexity >= SILK_PE_MIN_COMPLEX ); silk_assert( complexity <= SILK_PE_MAX_COMPLEX ); if( nb_subfr == PE_MAX_NB_SUBFR ) { Lag_range_ptr = &silk_Lag_range_stage3[ complexity ][ 0 ][ 0 ]; Lag_CB_ptr = &silk_CB_lags_stage3[ 0 ][ 0 ]; nb_cbk_search = silk_nb_cbk_searchs_stage3[ complexity ]; cbk_size = PE_NB_CBKS_STAGE3_MAX; } else { silk_assert( nb_subfr == PE_MAX_NB_SUBFR >> 1); Lag_range_ptr = &silk_Lag_range_stage3_10_ms[ 0 ][ 0 ]; Lag_CB_ptr = &silk_CB_lags_stage3_10_ms[ 0 ][ 0 ]; nb_cbk_search = PE_NB_CBKS_STAGE3_10MS; cbk_size = PE_NB_CBKS_STAGE3_10MS; } ALLOC( scratch_mem, SCRATCH_SIZE, opus_int32 ); ALLOC( xcorr32, SCRATCH_SIZE, opus_int32 ); target_ptr = &frame[ silk_LSHIFT( sf_length, 2 ) ]; /* Pointer to middle of frame */ for( k = 0; k < nb_subfr; k++ ) { lag_counter = 0; /* Calculate the correlations for each subframe */ lag_low = matrix_ptr( Lag_range_ptr, k, 0, 2 ); lag_high = matrix_ptr( Lag_range_ptr, k, 1, 2 ); silk_assert(lag_high-lag_low+1 <= SCRATCH_SIZE); celt_pitch_xcorr( target_ptr, target_ptr - start_lag - lag_high, xcorr32, sf_length, lag_high - lag_low + 1, arch ); for( j = lag_low; j <= lag_high; j++ ) { silk_assert( lag_counter < SCRATCH_SIZE ); scratch_mem[ lag_counter ] = xcorr32[ lag_high - j ]; lag_counter++; } delta = matrix_ptr( Lag_range_ptr, k, 0, 2 ); for( i = 0; i < nb_cbk_search; i++ ) { /* Fill out the 3 dim array that stores the correlations for */ /* each code_book vector for each start lag */ idx = matrix_ptr( Lag_CB_ptr, k, i, cbk_size ) - delta; for( j = 0; j < PE_NB_STAGE3_LAGS; j++ ) { silk_assert( idx + j < SCRATCH_SIZE ); silk_assert( idx + j < lag_counter ); matrix_ptr( cross_corr_st3, k, i, nb_cbk_search )[ j ] = scratch_mem[ idx + j ]; } } target_ptr += sf_length; } RESTORE_STACK; } /********************************************************************/ /* Calculate the energies for first two subframes. The energies are */ /* calculated recursively. */ /********************************************************************/ static void silk_P_Ana_calc_energy_st3( silk_pe_stage3_vals energies_st3[], /* O 3 DIM energy array */ const opus_int16 frame[], /* I vector to calc energy in */ opus_int start_lag, /* I lag offset to search around */ opus_int sf_length, /* I length of one 5 ms subframe */ opus_int nb_subfr, /* I number of subframes */ opus_int complexity, /* I Complexity setting */ int arch /* I Run-time architecture */ ) { const opus_int16 *target_ptr, *basis_ptr; opus_int32 energy; opus_int k, i, j, lag_counter; opus_int nb_cbk_search, delta, idx, cbk_size, lag_diff; VARDECL( opus_int32, scratch_mem ); const opus_int8 *Lag_range_ptr, *Lag_CB_ptr; SAVE_STACK; silk_assert( complexity >= SILK_PE_MIN_COMPLEX ); silk_assert( complexity <= SILK_PE_MAX_COMPLEX ); if( nb_subfr == PE_MAX_NB_SUBFR ) { Lag_range_ptr = &silk_Lag_range_stage3[ complexity ][ 0 ][ 0 ]; Lag_CB_ptr = &silk_CB_lags_stage3[ 0 ][ 0 ]; nb_cbk_search = silk_nb_cbk_searchs_stage3[ complexity ]; cbk_size = PE_NB_CBKS_STAGE3_MAX; } else { silk_assert( nb_subfr == PE_MAX_NB_SUBFR >> 1); Lag_range_ptr = &silk_Lag_range_stage3_10_ms[ 0 ][ 0 ]; Lag_CB_ptr = &silk_CB_lags_stage3_10_ms[ 0 ][ 0 ]; nb_cbk_search = PE_NB_CBKS_STAGE3_10MS; cbk_size = PE_NB_CBKS_STAGE3_10MS; } ALLOC( scratch_mem, SCRATCH_SIZE, opus_int32 ); target_ptr = &frame[ silk_LSHIFT( sf_length, 2 ) ]; for( k = 0; k < nb_subfr; k++ ) { lag_counter = 0; /* Calculate the energy for first lag */ basis_ptr = target_ptr - ( start_lag + matrix_ptr( Lag_range_ptr, k, 0, 2 ) ); energy = silk_inner_prod_aligned( basis_ptr, basis_ptr, sf_length, arch ); silk_assert( energy >= 0 ); scratch_mem[ lag_counter ] = energy; lag_counter++; lag_diff = ( matrix_ptr( Lag_range_ptr, k, 1, 2 ) - matrix_ptr( Lag_range_ptr, k, 0, 2 ) + 1 ); for( i = 1; i < lag_diff; i++ ) { /* remove part outside new window */ energy -= silk_SMULBB( basis_ptr[ sf_length - i ], basis_ptr[ sf_length - i ] ); silk_assert( energy >= 0 ); /* add part that comes into window */ energy = silk_ADD_SAT32( energy, silk_SMULBB( basis_ptr[ -i ], basis_ptr[ -i ] ) ); silk_assert( energy >= 0 ); silk_assert( lag_counter < SCRATCH_SIZE ); scratch_mem[ lag_counter ] = energy; lag_counter++; } delta = matrix_ptr( Lag_range_ptr, k, 0, 2 ); for( i = 0; i < nb_cbk_search; i++ ) { /* Fill out the 3 dim array that stores the correlations for */ /* each code_book vector for each start lag */ idx = matrix_ptr( Lag_CB_ptr, k, i, cbk_size ) - delta; for( j = 0; j < PE_NB_STAGE3_LAGS; j++ ) { silk_assert( idx + j < SCRATCH_SIZE ); silk_assert( idx + j < lag_counter ); matrix_ptr( energies_st3, k, i, nb_cbk_search )[ j ] = scratch_mem[ idx + j ]; silk_assert( matrix_ptr( energies_st3, k, i, nb_cbk_search )[ j ] >= 0 ); } } target_ptr += sf_length; } RESTORE_STACK; } mumble-1.3.4/3rdparty/opus-src/silk/fixed/residual_energy_FIX.c0000664000175000017500000001241514010707327024263 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main_FIX.h" #include "stack_alloc.h" /* Calculates residual energies of input subframes where all subframes have LPC_order */ /* of preceding samples */ void silk_residual_energy_FIX( opus_int32 nrgs[ MAX_NB_SUBFR ], /* O Residual energy per subframe */ opus_int nrgsQ[ MAX_NB_SUBFR ], /* O Q value per subframe */ const opus_int16 x[], /* I Input signal */ opus_int16 a_Q12[ 2 ][ MAX_LPC_ORDER ], /* I AR coefs for each frame half */ const opus_int32 gains[ MAX_NB_SUBFR ], /* I Quantization gains */ const opus_int subfr_length, /* I Subframe length */ const opus_int nb_subfr, /* I Number of subframes */ const opus_int LPC_order, /* I LPC order */ int arch /* I Run-time architecture */ ) { opus_int offset, i, j, rshift, lz1, lz2; opus_int16 *LPC_res_ptr; VARDECL( opus_int16, LPC_res ); const opus_int16 *x_ptr; opus_int32 tmp32; SAVE_STACK; x_ptr = x; offset = LPC_order + subfr_length; /* Filter input to create the LPC residual for each frame half, and measure subframe energies */ ALLOC( LPC_res, ( MAX_NB_SUBFR >> 1 ) * offset, opus_int16 ); silk_assert( ( nb_subfr >> 1 ) * ( MAX_NB_SUBFR >> 1 ) == nb_subfr ); for( i = 0; i < nb_subfr >> 1; i++ ) { /* Calculate half frame LPC residual signal including preceding samples */ silk_LPC_analysis_filter( LPC_res, x_ptr, a_Q12[ i ], ( MAX_NB_SUBFR >> 1 ) * offset, LPC_order, arch ); /* Point to first subframe of the just calculated LPC residual signal */ LPC_res_ptr = LPC_res + LPC_order; for( j = 0; j < ( MAX_NB_SUBFR >> 1 ); j++ ) { /* Measure subframe energy */ silk_sum_sqr_shift( &nrgs[ i * ( MAX_NB_SUBFR >> 1 ) + j ], &rshift, LPC_res_ptr, subfr_length ); /* Set Q values for the measured energy */ nrgsQ[ i * ( MAX_NB_SUBFR >> 1 ) + j ] = -rshift; /* Move to next subframe */ LPC_res_ptr += offset; } /* Move to next frame half */ x_ptr += ( MAX_NB_SUBFR >> 1 ) * offset; } /* Apply the squared subframe gains */ for( i = 0; i < nb_subfr; i++ ) { /* Fully upscale gains and energies */ lz1 = silk_CLZ32( nrgs[ i ] ) - 1; lz2 = silk_CLZ32( gains[ i ] ) - 1; tmp32 = silk_LSHIFT32( gains[ i ], lz2 ); /* Find squared gains */ tmp32 = silk_SMMUL( tmp32, tmp32 ); /* Q( 2 * lz2 - 32 )*/ /* Scale energies */ nrgs[ i ] = silk_SMMUL( tmp32, silk_LSHIFT32( nrgs[ i ], lz1 ) ); /* Q( nrgsQ[ i ] + lz1 + 2 * lz2 - 32 - 32 )*/ nrgsQ[ i ] += lz1 + 2 * lz2 - 32 - 32; } RESTORE_STACK; } mumble-1.3.4/3rdparty/opus-src/silk/fixed/LTP_scale_ctrl_FIX.c0000664000175000017500000000547514010707327023744 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main_FIX.h" /* Calculation of LTP state scaling */ void silk_LTP_scale_ctrl_FIX( silk_encoder_state_FIX *psEnc, /* I/O encoder state */ silk_encoder_control_FIX *psEncCtrl, /* I/O encoder control */ opus_int condCoding /* I The type of conditional coding to use */ ) { opus_int round_loss; if( condCoding == CODE_INDEPENDENTLY ) { /* Only scale if first frame in packet */ round_loss = psEnc->sCmn.PacketLoss_perc + psEnc->sCmn.nFramesPerPacket; psEnc->sCmn.indices.LTP_scaleIndex = (opus_int8)silk_LIMIT( silk_SMULWB( silk_SMULBB( round_loss, psEncCtrl->LTPredCodGain_Q7 ), SILK_FIX_CONST( 0.1, 9 ) ), 0, 2 ); } else { /* Default is minimum scaling */ psEnc->sCmn.indices.LTP_scaleIndex = 0; } psEncCtrl->LTP_scale_Q14 = silk_LTPScales_table_Q14[ psEnc->sCmn.indices.LTP_scaleIndex ]; } mumble-1.3.4/3rdparty/opus-src/silk/fixed/regularize_correlations_FIX.c0000664000175000017500000000510214010707327026032 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main_FIX.h" /* Add noise to matrix diagonal */ void silk_regularize_correlations_FIX( opus_int32 *XX, /* I/O Correlation matrices */ opus_int32 *xx, /* I/O Correlation values */ opus_int32 noise, /* I Noise to add */ opus_int D /* I Dimension of XX */ ) { opus_int i; for( i = 0; i < D; i++ ) { matrix_ptr( &XX[ 0 ], i, i, D ) = silk_ADD32( matrix_ptr( &XX[ 0 ], i, i, D ), noise ); } xx[ 0 ] += noise; } mumble-1.3.4/3rdparty/opus-src/silk/fixed/k2a_FIX.c0000664000175000017500000000516314010707327021561 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "SigProc_FIX.h" /* Step up function, converts reflection coefficients to prediction coefficients */ void silk_k2a( opus_int32 *A_Q24, /* O Prediction coefficients [order] Q24 */ const opus_int16 *rc_Q15, /* I Reflection coefficients [order] Q15 */ const opus_int32 order /* I Prediction order */ ) { opus_int k, n; opus_int32 rc, tmp1, tmp2; for( k = 0; k < order; k++ ) { rc = rc_Q15[ k ]; for( n = 0; n < (k + 1) >> 1; n++ ) { tmp1 = A_Q24[ n ]; tmp2 = A_Q24[ k - n - 1 ]; A_Q24[ n ] = silk_SMLAWB( tmp1, silk_LSHIFT( tmp2, 1 ), rc ); A_Q24[ k - n - 1 ] = silk_SMLAWB( tmp2, silk_LSHIFT( tmp1, 1 ), rc ); } A_Q24[ k ] = -silk_LSHIFT( (opus_int32)rc_Q15[ k ], 9 ); } } mumble-1.3.4/3rdparty/opus-src/silk/fixed/schur_FIX.c0000664000175000017500000001053714010707327022231 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "SigProc_FIX.h" /* Faster than schur64(), but much less accurate. */ /* uses SMLAWB(), requiring armv5E and higher. */ opus_int32 silk_schur( /* O Returns residual energy */ opus_int16 *rc_Q15, /* O reflection coefficients [order] Q15 */ const opus_int32 *c, /* I correlations [order+1] */ const opus_int32 order /* I prediction order */ ) { opus_int k, n, lz; opus_int32 C[ SILK_MAX_ORDER_LPC + 1 ][ 2 ]; opus_int32 Ctmp1, Ctmp2, rc_tmp_Q15; silk_assert( order >= 0 && order <= SILK_MAX_ORDER_LPC ); /* Get number of leading zeros */ lz = silk_CLZ32( c[ 0 ] ); /* Copy correlations and adjust level to Q30 */ k = 0; if( lz < 2 ) { /* lz must be 1, so shift one to the right */ do { C[ k ][ 0 ] = C[ k ][ 1 ] = silk_RSHIFT( c[ k ], 1 ); } while( ++k <= order ); } else if( lz > 2 ) { /* Shift to the left */ lz -= 2; do { C[ k ][ 0 ] = C[ k ][ 1 ] = silk_LSHIFT( c[ k ], lz ); } while( ++k <= order ); } else { /* No need to shift */ do { C[ k ][ 0 ] = C[ k ][ 1 ] = c[ k ]; } while( ++k <= order ); } for( k = 0; k < order; k++ ) { /* Check that we won't be getting an unstable rc, otherwise stop here. */ if (silk_abs_int32(C[ k + 1 ][ 0 ]) >= C[ 0 ][ 1 ]) { if ( C[ k + 1 ][ 0 ] > 0 ) { rc_Q15[ k ] = -SILK_FIX_CONST( .99f, 15 ); } else { rc_Q15[ k ] = SILK_FIX_CONST( .99f, 15 ); } k++; break; } /* Get reflection coefficient */ rc_tmp_Q15 = -silk_DIV32_16( C[ k + 1 ][ 0 ], silk_max_32( silk_RSHIFT( C[ 0 ][ 1 ], 15 ), 1 ) ); /* Clip (shouldn't happen for properly conditioned inputs) */ rc_tmp_Q15 = silk_SAT16( rc_tmp_Q15 ); /* Store */ rc_Q15[ k ] = (opus_int16)rc_tmp_Q15; /* Update correlations */ for( n = 0; n < order - k; n++ ) { Ctmp1 = C[ n + k + 1 ][ 0 ]; Ctmp2 = C[ n ][ 1 ]; C[ n + k + 1 ][ 0 ] = silk_SMLAWB( Ctmp1, silk_LSHIFT( Ctmp2, 1 ), rc_tmp_Q15 ); C[ n ][ 1 ] = silk_SMLAWB( Ctmp2, silk_LSHIFT( Ctmp1, 1 ), rc_tmp_Q15 ); } } for(; k < order; k++ ) { rc_Q15[ k ] = 0; } /* return residual energy */ return silk_max_32( 1, C[ 0 ][ 1 ] ); } mumble-1.3.4/3rdparty/opus-src/silk/fixed/x86/0000775000175000017500000000000014010707327020652 5ustar builderbuildermumble-1.3.4/3rdparty/opus-src/silk/fixed/x86/prefilter_FIX_sse.c0000664000175000017500000001611514010707327024376 0ustar builderbuilder/* Copyright (c) 2014, Cisco Systems, INC Written by XiangMingZhu WeiZhou MinPeng YanWang Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include "main.h" #include "celt/x86/x86cpu.h" void silk_warped_LPC_analysis_filter_FIX_sse4_1( opus_int32 state[], /* I/O State [order + 1] */ opus_int32 res_Q2[], /* O Residual signal [length] */ const opus_int16 coef_Q13[], /* I Coefficients [order] */ const opus_int16 input[], /* I Input signal [length] */ const opus_int16 lambda_Q16, /* I Warping factor */ const opus_int length, /* I Length of input signal */ const opus_int order /* I Filter order (even) */ ) { opus_int n, i; opus_int32 acc_Q11, tmp1, tmp2; /* Order must be even */ silk_assert( ( order & 1 ) == 0 ); if (order == 10) { if (0 == lambda_Q16) { __m128i coef_Q13_3210, coef_Q13_7654; __m128i coef_Q13_0123, coef_Q13_4567; __m128i state_0123, state_4567; __m128i xmm_product1, xmm_product2; __m128i xmm_tempa, xmm_tempb; register opus_int32 sum; register opus_int32 state_8, state_9, state_a; register opus_int64 coef_Q13_8, coef_Q13_9; silk_assert( length > 0 ); coef_Q13_3210 = OP_CVTEPI16_EPI32_M64( &coef_Q13[ 0 ] ); coef_Q13_7654 = OP_CVTEPI16_EPI32_M64( &coef_Q13[ 4 ] ); coef_Q13_0123 = _mm_shuffle_epi32( coef_Q13_3210, _MM_SHUFFLE( 0, 1, 2, 3 ) ); coef_Q13_4567 = _mm_shuffle_epi32( coef_Q13_7654, _MM_SHUFFLE( 0, 1, 2, 3 ) ); coef_Q13_8 = (opus_int64) coef_Q13[ 8 ]; coef_Q13_9 = (opus_int64) coef_Q13[ 9 ]; state_0123 = _mm_loadu_si128( (__m128i *)(&state[ 0 ] ) ); state_4567 = _mm_loadu_si128( (__m128i *)(&state[ 4 ] ) ); state_0123 = _mm_shuffle_epi32( state_0123, _MM_SHUFFLE( 0, 1, 2, 3 ) ); state_4567 = _mm_shuffle_epi32( state_4567, _MM_SHUFFLE( 0, 1, 2, 3 ) ); state_8 = state[ 8 ]; state_9 = state[ 9 ]; state_a = 0; for( n = 0; n < length; n++ ) { xmm_product1 = _mm_mul_epi32( coef_Q13_0123, state_0123 ); /* 64-bit multiply, only 2 pairs */ xmm_product2 = _mm_mul_epi32( coef_Q13_4567, state_4567 ); xmm_tempa = _mm_shuffle_epi32( state_0123, _MM_SHUFFLE( 0, 1, 2, 3 ) ); xmm_tempb = _mm_shuffle_epi32( state_4567, _MM_SHUFFLE( 0, 1, 2, 3 ) ); xmm_product1 = _mm_srli_epi64( xmm_product1, 16 ); /* >> 16, zero extending works */ xmm_product2 = _mm_srli_epi64( xmm_product2, 16 ); xmm_tempa = _mm_mul_epi32( coef_Q13_3210, xmm_tempa ); xmm_tempb = _mm_mul_epi32( coef_Q13_7654, xmm_tempb ); xmm_tempa = _mm_srli_epi64( xmm_tempa, 16 ); xmm_tempb = _mm_srli_epi64( xmm_tempb, 16 ); xmm_tempa = _mm_add_epi32( xmm_tempa, xmm_product1 ); xmm_tempb = _mm_add_epi32( xmm_tempb, xmm_product2 ); xmm_tempa = _mm_add_epi32( xmm_tempa, xmm_tempb ); sum = (opus_int32)((coef_Q13_8 * state_8) >> 16); sum += (opus_int32)((coef_Q13_9 * state_9) >> 16); xmm_tempa = _mm_add_epi32( xmm_tempa, _mm_shuffle_epi32( xmm_tempa, _MM_SHUFFLE( 0, 0, 0, 2 ) ) ); sum += _mm_cvtsi128_si32( xmm_tempa); res_Q2[ n ] = silk_LSHIFT( (opus_int32)input[ n ], 2 ) - silk_RSHIFT_ROUND( ( 5 + sum ), 9); /* move right */ state_a = state_9; state_9 = state_8; state_8 = _mm_cvtsi128_si32( state_4567 ); state_4567 = _mm_alignr_epi8( state_0123, state_4567, 4 ); state_0123 = _mm_alignr_epi8( _mm_cvtsi32_si128( silk_LSHIFT( input[ n ], 14 ) ), state_0123, 4 ); } _mm_storeu_si128( (__m128i *)( &state[ 0 ] ), _mm_shuffle_epi32( state_0123, _MM_SHUFFLE( 0, 1, 2, 3 ) ) ); _mm_storeu_si128( (__m128i *)( &state[ 4 ] ), _mm_shuffle_epi32( state_4567, _MM_SHUFFLE( 0, 1, 2, 3 ) ) ); state[ 8 ] = state_8; state[ 9 ] = state_9; state[ 10 ] = state_a; return; } } for( n = 0; n < length; n++ ) { /* Output of lowpass section */ tmp2 = silk_SMLAWB( state[ 0 ], state[ 1 ], lambda_Q16 ); state[ 0 ] = silk_LSHIFT( input[ n ], 14 ); /* Output of allpass section */ tmp1 = silk_SMLAWB( state[ 1 ], state[ 2 ] - tmp2, lambda_Q16 ); state[ 1 ] = tmp2; acc_Q11 = silk_RSHIFT( order, 1 ); acc_Q11 = silk_SMLAWB( acc_Q11, tmp2, coef_Q13[ 0 ] ); /* Loop over allpass sections */ for( i = 2; i < order; i += 2 ) { /* Output of allpass section */ tmp2 = silk_SMLAWB( state[ i ], state[ i + 1 ] - tmp1, lambda_Q16 ); state[ i ] = tmp1; acc_Q11 = silk_SMLAWB( acc_Q11, tmp1, coef_Q13[ i - 1 ] ); /* Output of allpass section */ tmp1 = silk_SMLAWB( state[ i + 1 ], state[ i + 2 ] - tmp2, lambda_Q16 ); state[ i + 1 ] = tmp2; acc_Q11 = silk_SMLAWB( acc_Q11, tmp2, coef_Q13[ i ] ); } state[ order ] = tmp1; acc_Q11 = silk_SMLAWB( acc_Q11, tmp1, coef_Q13[ order - 1 ] ); res_Q2[ n ] = silk_LSHIFT( (opus_int32)input[ n ], 2 ) - silk_RSHIFT_ROUND( acc_Q11, 9 ); } } mumble-1.3.4/3rdparty/opus-src/silk/fixed/x86/burg_modified_FIX_sse.c0000664000175000017500000005175414010707327025211 0ustar builderbuilder/* Copyright (c) 2014, Cisco Systems, INC Written by XiangMingZhu WeiZhou MinPeng YanWang Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include "SigProc_FIX.h" #include "define.h" #include "tuning_parameters.h" #include "pitch.h" #include "celt/x86/x86cpu.h" #define MAX_FRAME_SIZE 384 /* subfr_length * nb_subfr = ( 0.005 * 16000 + 16 ) * 4 = 384 */ #define QA 25 #define N_BITS_HEAD_ROOM 2 #define MIN_RSHIFTS -16 #define MAX_RSHIFTS (32 - QA) /* Compute reflection coefficients from input signal */ void silk_burg_modified_sse4_1( opus_int32 *res_nrg, /* O Residual energy */ opus_int *res_nrg_Q, /* O Residual energy Q value */ opus_int32 A_Q16[], /* O Prediction coefficients (length order) */ const opus_int16 x[], /* I Input signal, length: nb_subfr * ( D + subfr_length ) */ const opus_int32 minInvGain_Q30, /* I Inverse of max prediction gain */ const opus_int subfr_length, /* I Input signal subframe length (incl. D preceding samples) */ const opus_int nb_subfr, /* I Number of subframes stacked in x */ const opus_int D, /* I Order */ int arch /* I Run-time architecture */ ) { opus_int k, n, s, lz, rshifts, rshifts_extra, reached_max_gain; opus_int32 C0, num, nrg, rc_Q31, invGain_Q30, Atmp_QA, Atmp1, tmp1, tmp2, x1, x2; const opus_int16 *x_ptr; opus_int32 C_first_row[ SILK_MAX_ORDER_LPC ]; opus_int32 C_last_row[ SILK_MAX_ORDER_LPC ]; opus_int32 Af_QA[ SILK_MAX_ORDER_LPC ]; opus_int32 CAf[ SILK_MAX_ORDER_LPC + 1 ]; opus_int32 CAb[ SILK_MAX_ORDER_LPC + 1 ]; opus_int32 xcorr[ SILK_MAX_ORDER_LPC ]; __m128i FIRST_3210, LAST_3210, ATMP_3210, TMP1_3210, TMP2_3210, T1_3210, T2_3210, PTR_3210, SUBFR_3210, X1_3210, X2_3210; __m128i CONST1 = _mm_set1_epi32(1); silk_assert( subfr_length * nb_subfr <= MAX_FRAME_SIZE ); /* Compute autocorrelations, added over subframes */ silk_sum_sqr_shift( &C0, &rshifts, x, nb_subfr * subfr_length ); if( rshifts > MAX_RSHIFTS ) { C0 = silk_LSHIFT32( C0, rshifts - MAX_RSHIFTS ); silk_assert( C0 > 0 ); rshifts = MAX_RSHIFTS; } else { lz = silk_CLZ32( C0 ) - 1; rshifts_extra = N_BITS_HEAD_ROOM - lz; if( rshifts_extra > 0 ) { rshifts_extra = silk_min( rshifts_extra, MAX_RSHIFTS - rshifts ); C0 = silk_RSHIFT32( C0, rshifts_extra ); } else { rshifts_extra = silk_max( rshifts_extra, MIN_RSHIFTS - rshifts ); C0 = silk_LSHIFT32( C0, -rshifts_extra ); } rshifts += rshifts_extra; } CAb[ 0 ] = CAf[ 0 ] = C0 + silk_SMMUL( SILK_FIX_CONST( FIND_LPC_COND_FAC, 32 ), C0 ) + 1; /* Q(-rshifts) */ silk_memset( C_first_row, 0, SILK_MAX_ORDER_LPC * sizeof( opus_int32 ) ); if( rshifts > 0 ) { for( s = 0; s < nb_subfr; s++ ) { x_ptr = x + s * subfr_length; for( n = 1; n < D + 1; n++ ) { C_first_row[ n - 1 ] += (opus_int32)silk_RSHIFT64( silk_inner_prod16_aligned_64( x_ptr, x_ptr + n, subfr_length - n, arch ), rshifts ); } } } else { for( s = 0; s < nb_subfr; s++ ) { int i; opus_int32 d; x_ptr = x + s * subfr_length; celt_pitch_xcorr(x_ptr, x_ptr + 1, xcorr, subfr_length - D, D, arch ); for( n = 1; n < D + 1; n++ ) { for ( i = n + subfr_length - D, d = 0; i < subfr_length; i++ ) d = MAC16_16( d, x_ptr[ i ], x_ptr[ i - n ] ); xcorr[ n - 1 ] += d; } for( n = 1; n < D + 1; n++ ) { C_first_row[ n - 1 ] += silk_LSHIFT32( xcorr[ n - 1 ], -rshifts ); } } } silk_memcpy( C_last_row, C_first_row, SILK_MAX_ORDER_LPC * sizeof( opus_int32 ) ); /* Initialize */ CAb[ 0 ] = CAf[ 0 ] = C0 + silk_SMMUL( SILK_FIX_CONST( FIND_LPC_COND_FAC, 32 ), C0 ) + 1; /* Q(-rshifts) */ invGain_Q30 = (opus_int32)1 << 30; reached_max_gain = 0; for( n = 0; n < D; n++ ) { /* Update first row of correlation matrix (without first element) */ /* Update last row of correlation matrix (without last element, stored in reversed order) */ /* Update C * Af */ /* Update C * flipud(Af) (stored in reversed order) */ if( rshifts > -2 ) { for( s = 0; s < nb_subfr; s++ ) { x_ptr = x + s * subfr_length; x1 = -silk_LSHIFT32( (opus_int32)x_ptr[ n ], 16 - rshifts ); /* Q(16-rshifts) */ x2 = -silk_LSHIFT32( (opus_int32)x_ptr[ subfr_length - n - 1 ], 16 - rshifts ); /* Q(16-rshifts) */ tmp1 = silk_LSHIFT32( (opus_int32)x_ptr[ n ], QA - 16 ); /* Q(QA-16) */ tmp2 = silk_LSHIFT32( (opus_int32)x_ptr[ subfr_length - n - 1 ], QA - 16 ); /* Q(QA-16) */ for( k = 0; k < n; k++ ) { C_first_row[ k ] = silk_SMLAWB( C_first_row[ k ], x1, x_ptr[ n - k - 1 ] ); /* Q( -rshifts ) */ C_last_row[ k ] = silk_SMLAWB( C_last_row[ k ], x2, x_ptr[ subfr_length - n + k ] ); /* Q( -rshifts ) */ Atmp_QA = Af_QA[ k ]; tmp1 = silk_SMLAWB( tmp1, Atmp_QA, x_ptr[ n - k - 1 ] ); /* Q(QA-16) */ tmp2 = silk_SMLAWB( tmp2, Atmp_QA, x_ptr[ subfr_length - n + k ] ); /* Q(QA-16) */ } tmp1 = silk_LSHIFT32( -tmp1, 32 - QA - rshifts ); /* Q(16-rshifts) */ tmp2 = silk_LSHIFT32( -tmp2, 32 - QA - rshifts ); /* Q(16-rshifts) */ for( k = 0; k <= n; k++ ) { CAf[ k ] = silk_SMLAWB( CAf[ k ], tmp1, x_ptr[ n - k ] ); /* Q( -rshift ) */ CAb[ k ] = silk_SMLAWB( CAb[ k ], tmp2, x_ptr[ subfr_length - n + k - 1 ] ); /* Q( -rshift ) */ } } } else { for( s = 0; s < nb_subfr; s++ ) { x_ptr = x + s * subfr_length; x1 = -silk_LSHIFT32( (opus_int32)x_ptr[ n ], -rshifts ); /* Q( -rshifts ) */ x2 = -silk_LSHIFT32( (opus_int32)x_ptr[ subfr_length - n - 1 ], -rshifts ); /* Q( -rshifts ) */ tmp1 = silk_LSHIFT32( (opus_int32)x_ptr[ n ], 17 ); /* Q17 */ tmp2 = silk_LSHIFT32( (opus_int32)x_ptr[ subfr_length - n - 1 ], 17 ); /* Q17 */ X1_3210 = _mm_set1_epi32( x1 ); X2_3210 = _mm_set1_epi32( x2 ); TMP1_3210 = _mm_setzero_si128(); TMP2_3210 = _mm_setzero_si128(); for( k = 0; k < n - 3; k += 4 ) { PTR_3210 = OP_CVTEPI16_EPI32_M64( &x_ptr[ n - k - 1 - 3 ] ); SUBFR_3210 = OP_CVTEPI16_EPI32_M64( &x_ptr[ subfr_length - n + k ] ); FIRST_3210 = _mm_loadu_si128( (__m128i *)&C_first_row[ k ] ); PTR_3210 = _mm_shuffle_epi32( PTR_3210, _MM_SHUFFLE( 0, 1, 2, 3 ) ); LAST_3210 = _mm_loadu_si128( (__m128i *)&C_last_row[ k ] ); ATMP_3210 = _mm_loadu_si128( (__m128i *)&Af_QA[ k ] ); T1_3210 = _mm_mullo_epi32( PTR_3210, X1_3210 ); T2_3210 = _mm_mullo_epi32( SUBFR_3210, X2_3210 ); ATMP_3210 = _mm_srai_epi32( ATMP_3210, 7 ); ATMP_3210 = _mm_add_epi32( ATMP_3210, CONST1 ); ATMP_3210 = _mm_srai_epi32( ATMP_3210, 1 ); FIRST_3210 = _mm_add_epi32( FIRST_3210, T1_3210 ); LAST_3210 = _mm_add_epi32( LAST_3210, T2_3210 ); PTR_3210 = _mm_mullo_epi32( ATMP_3210, PTR_3210 ); SUBFR_3210 = _mm_mullo_epi32( ATMP_3210, SUBFR_3210 ); _mm_storeu_si128( (__m128i *)&C_first_row[ k ], FIRST_3210 ); _mm_storeu_si128( (__m128i *)&C_last_row[ k ], LAST_3210 ); TMP1_3210 = _mm_add_epi32( TMP1_3210, PTR_3210 ); TMP2_3210 = _mm_add_epi32( TMP2_3210, SUBFR_3210 ); } TMP1_3210 = _mm_add_epi32( TMP1_3210, _mm_unpackhi_epi64(TMP1_3210, TMP1_3210 ) ); TMP2_3210 = _mm_add_epi32( TMP2_3210, _mm_unpackhi_epi64(TMP2_3210, TMP2_3210 ) ); TMP1_3210 = _mm_add_epi32( TMP1_3210, _mm_shufflelo_epi16(TMP1_3210, 0x0E ) ); TMP2_3210 = _mm_add_epi32( TMP2_3210, _mm_shufflelo_epi16(TMP2_3210, 0x0E ) ); tmp1 += _mm_cvtsi128_si32( TMP1_3210 ); tmp2 += _mm_cvtsi128_si32( TMP2_3210 ); for( ; k < n; k++ ) { C_first_row[ k ] = silk_MLA( C_first_row[ k ], x1, x_ptr[ n - k - 1 ] ); /* Q( -rshifts ) */ C_last_row[ k ] = silk_MLA( C_last_row[ k ], x2, x_ptr[ subfr_length - n + k ] ); /* Q( -rshifts ) */ Atmp1 = silk_RSHIFT_ROUND( Af_QA[ k ], QA - 17 ); /* Q17 */ tmp1 = silk_MLA( tmp1, x_ptr[ n - k - 1 ], Atmp1 ); /* Q17 */ tmp2 = silk_MLA( tmp2, x_ptr[ subfr_length - n + k ], Atmp1 ); /* Q17 */ } tmp1 = -tmp1; /* Q17 */ tmp2 = -tmp2; /* Q17 */ { __m128i xmm_tmp1, xmm_tmp2; __m128i xmm_x_ptr_n_k_x2x0, xmm_x_ptr_n_k_x3x1; __m128i xmm_x_ptr_sub_x2x0, xmm_x_ptr_sub_x3x1; xmm_tmp1 = _mm_set1_epi32( tmp1 ); xmm_tmp2 = _mm_set1_epi32( tmp2 ); for( k = 0; k <= n - 3; k += 4 ) { xmm_x_ptr_n_k_x2x0 = OP_CVTEPI16_EPI32_M64( &x_ptr[ n - k - 3 ] ); xmm_x_ptr_sub_x2x0 = OP_CVTEPI16_EPI32_M64( &x_ptr[ subfr_length - n + k - 1 ] ); xmm_x_ptr_n_k_x2x0 = _mm_shuffle_epi32( xmm_x_ptr_n_k_x2x0, _MM_SHUFFLE( 0, 1, 2, 3 ) ); xmm_x_ptr_n_k_x2x0 = _mm_slli_epi32( xmm_x_ptr_n_k_x2x0, -rshifts - 1 ); xmm_x_ptr_sub_x2x0 = _mm_slli_epi32( xmm_x_ptr_sub_x2x0, -rshifts - 1 ); /* equal shift right 4 bytes, xmm_x_ptr_n_k_x3x1 = _mm_srli_si128(xmm_x_ptr_n_k_x2x0, 4)*/ xmm_x_ptr_n_k_x3x1 = _mm_shuffle_epi32( xmm_x_ptr_n_k_x2x0, _MM_SHUFFLE( 0, 3, 2, 1 ) ); xmm_x_ptr_sub_x3x1 = _mm_shuffle_epi32( xmm_x_ptr_sub_x2x0, _MM_SHUFFLE( 0, 3, 2, 1 ) ); xmm_x_ptr_n_k_x2x0 = _mm_mul_epi32( xmm_x_ptr_n_k_x2x0, xmm_tmp1 ); xmm_x_ptr_n_k_x3x1 = _mm_mul_epi32( xmm_x_ptr_n_k_x3x1, xmm_tmp1 ); xmm_x_ptr_sub_x2x0 = _mm_mul_epi32( xmm_x_ptr_sub_x2x0, xmm_tmp2 ); xmm_x_ptr_sub_x3x1 = _mm_mul_epi32( xmm_x_ptr_sub_x3x1, xmm_tmp2 ); xmm_x_ptr_n_k_x2x0 = _mm_srli_epi64( xmm_x_ptr_n_k_x2x0, 16 ); xmm_x_ptr_n_k_x3x1 = _mm_slli_epi64( xmm_x_ptr_n_k_x3x1, 16 ); xmm_x_ptr_sub_x2x0 = _mm_srli_epi64( xmm_x_ptr_sub_x2x0, 16 ); xmm_x_ptr_sub_x3x1 = _mm_slli_epi64( xmm_x_ptr_sub_x3x1, 16 ); xmm_x_ptr_n_k_x2x0 = _mm_blend_epi16( xmm_x_ptr_n_k_x2x0, xmm_x_ptr_n_k_x3x1, 0xCC ); xmm_x_ptr_sub_x2x0 = _mm_blend_epi16( xmm_x_ptr_sub_x2x0, xmm_x_ptr_sub_x3x1, 0xCC ); X1_3210 = _mm_loadu_si128( (__m128i *)&CAf[ k ] ); PTR_3210 = _mm_loadu_si128( (__m128i *)&CAb[ k ] ); X1_3210 = _mm_add_epi32( X1_3210, xmm_x_ptr_n_k_x2x0 ); PTR_3210 = _mm_add_epi32( PTR_3210, xmm_x_ptr_sub_x2x0 ); _mm_storeu_si128( (__m128i *)&CAf[ k ], X1_3210 ); _mm_storeu_si128( (__m128i *)&CAb[ k ], PTR_3210 ); } for( ; k <= n; k++ ) { CAf[ k ] = silk_SMLAWW( CAf[ k ], tmp1, silk_LSHIFT32( (opus_int32)x_ptr[ n - k ], -rshifts - 1 ) ); /* Q( -rshift ) */ CAb[ k ] = silk_SMLAWW( CAb[ k ], tmp2, silk_LSHIFT32( (opus_int32)x_ptr[ subfr_length - n + k - 1 ], -rshifts - 1 ) ); /* Q( -rshift ) */ } } } } /* Calculate nominator and denominator for the next order reflection (parcor) coefficient */ tmp1 = C_first_row[ n ]; /* Q( -rshifts ) */ tmp2 = C_last_row[ n ]; /* Q( -rshifts ) */ num = 0; /* Q( -rshifts ) */ nrg = silk_ADD32( CAb[ 0 ], CAf[ 0 ] ); /* Q( 1-rshifts ) */ for( k = 0; k < n; k++ ) { Atmp_QA = Af_QA[ k ]; lz = silk_CLZ32( silk_abs( Atmp_QA ) ) - 1; lz = silk_min( 32 - QA, lz ); Atmp1 = silk_LSHIFT32( Atmp_QA, lz ); /* Q( QA + lz ) */ tmp1 = silk_ADD_LSHIFT32( tmp1, silk_SMMUL( C_last_row[ n - k - 1 ], Atmp1 ), 32 - QA - lz ); /* Q( -rshifts ) */ tmp2 = silk_ADD_LSHIFT32( tmp2, silk_SMMUL( C_first_row[ n - k - 1 ], Atmp1 ), 32 - QA - lz ); /* Q( -rshifts ) */ num = silk_ADD_LSHIFT32( num, silk_SMMUL( CAb[ n - k ], Atmp1 ), 32 - QA - lz ); /* Q( -rshifts ) */ nrg = silk_ADD_LSHIFT32( nrg, silk_SMMUL( silk_ADD32( CAb[ k + 1 ], CAf[ k + 1 ] ), Atmp1 ), 32 - QA - lz ); /* Q( 1-rshifts ) */ } CAf[ n + 1 ] = tmp1; /* Q( -rshifts ) */ CAb[ n + 1 ] = tmp2; /* Q( -rshifts ) */ num = silk_ADD32( num, tmp2 ); /* Q( -rshifts ) */ num = silk_LSHIFT32( -num, 1 ); /* Q( 1-rshifts ) */ /* Calculate the next order reflection (parcor) coefficient */ if( silk_abs( num ) < nrg ) { rc_Q31 = silk_DIV32_varQ( num, nrg, 31 ); } else { rc_Q31 = ( num > 0 ) ? silk_int32_MAX : silk_int32_MIN; } /* Update inverse prediction gain */ tmp1 = ( (opus_int32)1 << 30 ) - silk_SMMUL( rc_Q31, rc_Q31 ); tmp1 = silk_LSHIFT( silk_SMMUL( invGain_Q30, tmp1 ), 2 ); if( tmp1 <= minInvGain_Q30 ) { /* Max prediction gain exceeded; set reflection coefficient such that max prediction gain is exactly hit */ tmp2 = ( (opus_int32)1 << 30 ) - silk_DIV32_varQ( minInvGain_Q30, invGain_Q30, 30 ); /* Q30 */ rc_Q31 = silk_SQRT_APPROX( tmp2 ); /* Q15 */ if( rc_Q31 > 0 ) { /* Newton-Raphson iteration */ rc_Q31 = silk_RSHIFT32( rc_Q31 + silk_DIV32( tmp2, rc_Q31 ), 1 ); /* Q15 */ rc_Q31 = silk_LSHIFT32( rc_Q31, 16 ); /* Q31 */ if( num < 0 ) { /* Ensure adjusted reflection coefficients has the original sign */ rc_Q31 = -rc_Q31; } } invGain_Q30 = minInvGain_Q30; reached_max_gain = 1; } else { invGain_Q30 = tmp1; } /* Update the AR coefficients */ for( k = 0; k < (n + 1) >> 1; k++ ) { tmp1 = Af_QA[ k ]; /* QA */ tmp2 = Af_QA[ n - k - 1 ]; /* QA */ Af_QA[ k ] = silk_ADD_LSHIFT32( tmp1, silk_SMMUL( tmp2, rc_Q31 ), 1 ); /* QA */ Af_QA[ n - k - 1 ] = silk_ADD_LSHIFT32( tmp2, silk_SMMUL( tmp1, rc_Q31 ), 1 ); /* QA */ } Af_QA[ n ] = silk_RSHIFT32( rc_Q31, 31 - QA ); /* QA */ if( reached_max_gain ) { /* Reached max prediction gain; set remaining coefficients to zero and exit loop */ for( k = n + 1; k < D; k++ ) { Af_QA[ k ] = 0; } break; } /* Update C * Af and C * Ab */ for( k = 0; k <= n + 1; k++ ) { tmp1 = CAf[ k ]; /* Q( -rshifts ) */ tmp2 = CAb[ n - k + 1 ]; /* Q( -rshifts ) */ CAf[ k ] = silk_ADD_LSHIFT32( tmp1, silk_SMMUL( tmp2, rc_Q31 ), 1 ); /* Q( -rshifts ) */ CAb[ n - k + 1 ] = silk_ADD_LSHIFT32( tmp2, silk_SMMUL( tmp1, rc_Q31 ), 1 ); /* Q( -rshifts ) */ } } if( reached_max_gain ) { for( k = 0; k < D; k++ ) { /* Scale coefficients */ A_Q16[ k ] = -silk_RSHIFT_ROUND( Af_QA[ k ], QA - 16 ); } /* Subtract energy of preceding samples from C0 */ if( rshifts > 0 ) { for( s = 0; s < nb_subfr; s++ ) { x_ptr = x + s * subfr_length; C0 -= (opus_int32)silk_RSHIFT64( silk_inner_prod16_aligned_64( x_ptr, x_ptr, D, arch ), rshifts ); } } else { for( s = 0; s < nb_subfr; s++ ) { x_ptr = x + s * subfr_length; C0 -= silk_LSHIFT32( silk_inner_prod_aligned( x_ptr, x_ptr, D, arch ), -rshifts ); } } /* Approximate residual energy */ *res_nrg = silk_LSHIFT( silk_SMMUL( invGain_Q30, C0 ), 2 ); *res_nrg_Q = -rshifts; } else { /* Return residual energy */ nrg = CAf[ 0 ]; /* Q( -rshifts ) */ tmp1 = (opus_int32)1 << 16; /* Q16 */ for( k = 0; k < D; k++ ) { Atmp1 = silk_RSHIFT_ROUND( Af_QA[ k ], QA - 16 ); /* Q16 */ nrg = silk_SMLAWW( nrg, CAf[ k + 1 ], Atmp1 ); /* Q( -rshifts ) */ tmp1 = silk_SMLAWW( tmp1, Atmp1, Atmp1 ); /* Q16 */ A_Q16[ k ] = -Atmp1; } *res_nrg = silk_SMLAWW( nrg, silk_SMMUL( SILK_FIX_CONST( FIND_LPC_COND_FAC, 32 ), C0 ), -tmp1 );/* Q( -rshifts ) */ *res_nrg_Q = -rshifts; } } mumble-1.3.4/3rdparty/opus-src/silk/fixed/x86/vector_ops_FIX_sse.c0000664000175000017500000000636614010707327024574 0ustar builderbuilder/* Copyright (c) 2014, Cisco Systems, INC Written by XiangMingZhu WeiZhou MinPeng YanWang Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include "main.h" #include "SigProc_FIX.h" #include "pitch.h" opus_int64 silk_inner_prod16_aligned_64_sse4_1( const opus_int16 *inVec1, /* I input vector 1 */ const opus_int16 *inVec2, /* I input vector 2 */ const opus_int len /* I vector lengths */ ) { opus_int i, dataSize8; opus_int64 sum; __m128i xmm_tempa; __m128i inVec1_76543210, acc1; __m128i inVec2_76543210, acc2; sum = 0; dataSize8 = len & ~7; acc1 = _mm_setzero_si128(); acc2 = _mm_setzero_si128(); for( i = 0; i < dataSize8; i += 8 ) { inVec1_76543210 = _mm_loadu_si128( (__m128i *)(&inVec1[i + 0] ) ); inVec2_76543210 = _mm_loadu_si128( (__m128i *)(&inVec2[i + 0] ) ); /* only when all 4 operands are -32768 (0x8000), this results in wrap around */ inVec1_76543210 = _mm_madd_epi16( inVec1_76543210, inVec2_76543210 ); xmm_tempa = _mm_cvtepi32_epi64( inVec1_76543210 ); /* equal shift right 8 bytes */ inVec1_76543210 = _mm_shuffle_epi32( inVec1_76543210, _MM_SHUFFLE( 0, 0, 3, 2 ) ); inVec1_76543210 = _mm_cvtepi32_epi64( inVec1_76543210 ); acc1 = _mm_add_epi64( acc1, xmm_tempa ); acc2 = _mm_add_epi64( acc2, inVec1_76543210 ); } acc1 = _mm_add_epi64( acc1, acc2 ); /* equal shift right 8 bytes */ acc2 = _mm_shuffle_epi32( acc1, _MM_SHUFFLE( 0, 0, 3, 2 ) ); acc1 = _mm_add_epi64( acc1, acc2 ); _mm_storel_epi64( (__m128i *)&sum, acc1 ); for( ; i < len; i++ ) { sum = silk_SMLABB( sum, inVec1[ i ], inVec2[ i ] ); } return sum; } mumble-1.3.4/3rdparty/opus-src/silk/fixed/structs_FIX.h0000664000175000017500000001204014010707327022610 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef SILK_STRUCTS_FIX_H #define SILK_STRUCTS_FIX_H #include "typedef.h" #include "main.h" #include "structs.h" #ifdef __cplusplus extern "C" { #endif /********************************/ /* Noise shaping analysis state */ /********************************/ typedef struct { opus_int8 LastGainIndex; opus_int32 HarmBoost_smth_Q16; opus_int32 HarmShapeGain_smth_Q16; opus_int32 Tilt_smth_Q16; } silk_shape_state_FIX; /********************************/ /* Encoder state FIX */ /********************************/ typedef struct { silk_encoder_state sCmn; /* Common struct, shared with floating-point code */ silk_shape_state_FIX sShape; /* Shape state */ /* Buffer for find pitch and noise shape analysis */ silk_DWORD_ALIGN opus_int16 x_buf[ 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ];/* Buffer for find pitch and noise shape analysis */ opus_int LTPCorr_Q15; /* Normalized correlation from pitch lag estimator */ opus_int32 resNrgSmth; } silk_encoder_state_FIX; /************************/ /* Encoder control FIX */ /************************/ typedef struct { /* Prediction and coding parameters */ opus_int32 Gains_Q16[ MAX_NB_SUBFR ]; silk_DWORD_ALIGN opus_int16 PredCoef_Q12[ 2 ][ MAX_LPC_ORDER ]; opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ]; opus_int LTP_scale_Q14; opus_int pitchL[ MAX_NB_SUBFR ]; /* Noise shaping parameters */ /* Testing */ silk_DWORD_ALIGN opus_int16 AR_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ]; opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ]; /* Packs two int16 coefficients per int32 value */ opus_int Tilt_Q14[ MAX_NB_SUBFR ]; opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ]; opus_int Lambda_Q10; opus_int input_quality_Q14; opus_int coding_quality_Q14; /* measures */ opus_int32 predGain_Q16; opus_int LTPredCodGain_Q7; opus_int32 ResNrg[ MAX_NB_SUBFR ]; /* Residual energy per subframe */ opus_int ResNrgQ[ MAX_NB_SUBFR ]; /* Q domain for the residual energy > 0 */ /* Parameters for CBR mode */ opus_int32 GainsUnq_Q16[ MAX_NB_SUBFR ]; opus_int8 lastGainIndexPrev; } silk_encoder_control_FIX; /************************/ /* Encoder Super Struct */ /************************/ typedef struct { silk_encoder_state_FIX state_Fxx[ ENCODER_NUM_CHANNELS ]; stereo_enc_state sStereo; opus_int32 nBitsUsedLBRR; opus_int32 nBitsExceeded; opus_int nChannelsAPI; opus_int nChannelsInternal; opus_int nPrevChannelsInternal; opus_int timeSinceSwitchAllowed_ms; opus_int allowBandwidthSwitch; opus_int prev_decode_only_middle; } silk_encoder; #ifdef __cplusplus } #endif #endif mumble-1.3.4/3rdparty/opus-src/silk/fixed/schur64_FIX.c0000664000175000017500000000763214010707327022405 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "SigProc_FIX.h" /* Slower than schur(), but more accurate. */ /* Uses SMULL(), available on armv4 */ opus_int32 silk_schur64( /* O returns residual energy */ opus_int32 rc_Q16[], /* O Reflection coefficients [order] Q16 */ const opus_int32 c[], /* I Correlations [order+1] */ opus_int32 order /* I Prediction order */ ) { opus_int k, n; opus_int32 C[ SILK_MAX_ORDER_LPC + 1 ][ 2 ]; opus_int32 Ctmp1_Q30, Ctmp2_Q30, rc_tmp_Q31; silk_assert( order >= 0 && order <= SILK_MAX_ORDER_LPC ); /* Check for invalid input */ if( c[ 0 ] <= 0 ) { silk_memset( rc_Q16, 0, order * sizeof( opus_int32 ) ); return 0; } k = 0; do { C[ k ][ 0 ] = C[ k ][ 1 ] = c[ k ]; } while( ++k <= order ); for( k = 0; k < order; k++ ) { /* Check that we won't be getting an unstable rc, otherwise stop here. */ if (silk_abs_int32(C[ k + 1 ][ 0 ]) >= C[ 0 ][ 1 ]) { if ( C[ k + 1 ][ 0 ] > 0 ) { rc_Q16[ k ] = -SILK_FIX_CONST( .99f, 16 ); } else { rc_Q16[ k ] = SILK_FIX_CONST( .99f, 16 ); } k++; break; } /* Get reflection coefficient: divide two Q30 values and get result in Q31 */ rc_tmp_Q31 = silk_DIV32_varQ( -C[ k + 1 ][ 0 ], C[ 0 ][ 1 ], 31 ); /* Save the output */ rc_Q16[ k ] = silk_RSHIFT_ROUND( rc_tmp_Q31, 15 ); /* Update correlations */ for( n = 0; n < order - k; n++ ) { Ctmp1_Q30 = C[ n + k + 1 ][ 0 ]; Ctmp2_Q30 = C[ n ][ 1 ]; /* Multiply and add the highest int32 */ C[ n + k + 1 ][ 0 ] = Ctmp1_Q30 + silk_SMMUL( silk_LSHIFT( Ctmp2_Q30, 1 ), rc_tmp_Q31 ); C[ n ][ 1 ] = Ctmp2_Q30 + silk_SMMUL( silk_LSHIFT( Ctmp1_Q30, 1 ), rc_tmp_Q31 ); } } for(; k < order; k++ ) { rc_Q16[ k ] = 0; } return silk_max_32( 1, C[ 0 ][ 1 ] ); } mumble-1.3.4/3rdparty/opus-src/silk/fixed/vector_ops_FIX.c0000664000175000017500000001125214010707327023263 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "SigProc_FIX.h" #include "pitch.h" /* Copy and multiply a vector by a constant */ void silk_scale_copy_vector16( opus_int16 *data_out, const opus_int16 *data_in, opus_int32 gain_Q16, /* I Gain in Q16 */ const opus_int dataSize /* I Length */ ) { opus_int i; opus_int32 tmp32; for( i = 0; i < dataSize; i++ ) { tmp32 = silk_SMULWB( gain_Q16, data_in[ i ] ); data_out[ i ] = (opus_int16)silk_CHECK_FIT16( tmp32 ); } } /* Multiply a vector by a constant */ void silk_scale_vector32_Q26_lshift_18( opus_int32 *data1, /* I/O Q0/Q18 */ opus_int32 gain_Q26, /* I Q26 */ opus_int dataSize /* I length */ ) { opus_int i; for( i = 0; i < dataSize; i++ ) { data1[ i ] = (opus_int32)silk_CHECK_FIT32( silk_RSHIFT64( silk_SMULL( data1[ i ], gain_Q26 ), 8 ) ); /* OUTPUT: Q18 */ } } /* sum = for(i=0;i6, memory access can be reduced by half. */ opus_int32 silk_inner_prod_aligned( const opus_int16 *const inVec1, /* I input vector 1 */ const opus_int16 *const inVec2, /* I input vector 2 */ const opus_int len, /* I vector lengths */ int arch /* I Run-time architecture */ ) { #ifdef FIXED_POINT return celt_inner_prod(inVec1, inVec2, len, arch); #else opus_int i; opus_int32 sum = 0; for( i = 0; i < len; i++ ) { sum = silk_SMLABB( sum, inVec1[ i ], inVec2[ i ] ); } return sum; #endif } opus_int64 silk_inner_prod16_aligned_64_c( const opus_int16 *inVec1, /* I input vector 1 */ const opus_int16 *inVec2, /* I input vector 2 */ const opus_int len /* I vector lengths */ ) { opus_int i; opus_int64 sum = 0; for( i = 0; i < len; i++ ) { sum = silk_SMLALBB( sum, inVec1[ i ], inVec2[ i ] ); } return sum; } mumble-1.3.4/3rdparty/opus-src/silk/fixed/apply_sine_window_FIX.c0000664000175000017500000001147114010707327024635 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "SigProc_FIX.h" /* Apply sine window to signal vector. */ /* Window types: */ /* 1 -> sine window from 0 to pi/2 */ /* 2 -> sine window from pi/2 to pi */ /* Every other sample is linearly interpolated, for speed. */ /* Window length must be between 16 and 120 (incl) and a multiple of 4. */ /* Matlab code for table: for k=16:9*4:16+2*9*4, fprintf(' %7.d,', -round(65536*pi ./ (k:4:k+8*4))); fprintf('\n'); end */ static const opus_int16 freq_table_Q16[ 27 ] = { 12111, 9804, 8235, 7100, 6239, 5565, 5022, 4575, 4202, 3885, 3612, 3375, 3167, 2984, 2820, 2674, 2542, 2422, 2313, 2214, 2123, 2038, 1961, 1889, 1822, 1760, 1702, }; void silk_apply_sine_window( opus_int16 px_win[], /* O Pointer to windowed signal */ const opus_int16 px[], /* I Pointer to input signal */ const opus_int win_type, /* I Selects a window type */ const opus_int length /* I Window length, multiple of 4 */ ) { opus_int k, f_Q16, c_Q16; opus_int32 S0_Q16, S1_Q16; silk_assert( win_type == 1 || win_type == 2 ); /* Length must be in a range from 16 to 120 and a multiple of 4 */ silk_assert( length >= 16 && length <= 120 ); silk_assert( ( length & 3 ) == 0 ); /* Frequency */ k = ( length >> 2 ) - 4; silk_assert( k >= 0 && k <= 26 ); f_Q16 = (opus_int)freq_table_Q16[ k ]; /* Factor used for cosine approximation */ c_Q16 = silk_SMULWB( (opus_int32)f_Q16, -f_Q16 ); silk_assert( c_Q16 >= -32768 ); /* initialize state */ if( win_type == 1 ) { /* start from 0 */ S0_Q16 = 0; /* approximation of sin(f) */ S1_Q16 = f_Q16 + silk_RSHIFT( length, 3 ); } else { /* start from 1 */ S0_Q16 = ( (opus_int32)1 << 16 ); /* approximation of cos(f) */ S1_Q16 = ( (opus_int32)1 << 16 ) + silk_RSHIFT( c_Q16, 1 ) + silk_RSHIFT( length, 4 ); } /* Uses the recursive equation: sin(n*f) = 2 * cos(f) * sin((n-1)*f) - sin((n-2)*f) */ /* 4 samples at a time */ for( k = 0; k < length; k += 4 ) { px_win[ k ] = (opus_int16)silk_SMULWB( silk_RSHIFT( S0_Q16 + S1_Q16, 1 ), px[ k ] ); px_win[ k + 1 ] = (opus_int16)silk_SMULWB( S1_Q16, px[ k + 1] ); S0_Q16 = silk_SMULWB( S1_Q16, c_Q16 ) + silk_LSHIFT( S1_Q16, 1 ) - S0_Q16 + 1; S0_Q16 = silk_min( S0_Q16, ( (opus_int32)1 << 16 ) ); px_win[ k + 2 ] = (opus_int16)silk_SMULWB( silk_RSHIFT( S0_Q16 + S1_Q16, 1 ), px[ k + 2] ); px_win[ k + 3 ] = (opus_int16)silk_SMULWB( S0_Q16, px[ k + 3 ] ); S1_Q16 = silk_SMULWB( S0_Q16, c_Q16 ) + silk_LSHIFT( S0_Q16, 1 ) - S1_Q16; S1_Q16 = silk_min( S1_Q16, ( (opus_int32)1 << 16 ) ); } } mumble-1.3.4/3rdparty/opus-src/silk/fixed/find_LPC_FIX.c0000664000175000017500000001630114010707327022516 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main_FIX.h" #include "stack_alloc.h" #include "tuning_parameters.h" /* Finds LPC vector from correlations, and converts to NLSF */ void silk_find_LPC_FIX( silk_encoder_state *psEncC, /* I/O Encoder state */ opus_int16 NLSF_Q15[], /* O NLSFs */ const opus_int16 x[], /* I Input signal */ const opus_int32 minInvGain_Q30 /* I Inverse of max prediction gain */ ) { opus_int k, subfr_length; opus_int32 a_Q16[ MAX_LPC_ORDER ]; opus_int isInterpLower, shift; opus_int32 res_nrg0, res_nrg1; opus_int rshift0, rshift1; /* Used only for LSF interpolation */ opus_int32 a_tmp_Q16[ MAX_LPC_ORDER ], res_nrg_interp, res_nrg, res_tmp_nrg; opus_int res_nrg_interp_Q, res_nrg_Q, res_tmp_nrg_Q; opus_int16 a_tmp_Q12[ MAX_LPC_ORDER ]; opus_int16 NLSF0_Q15[ MAX_LPC_ORDER ]; SAVE_STACK; subfr_length = psEncC->subfr_length + psEncC->predictLPCOrder; /* Default: no interpolation */ psEncC->indices.NLSFInterpCoef_Q2 = 4; /* Burg AR analysis for the full frame */ silk_burg_modified( &res_nrg, &res_nrg_Q, a_Q16, x, minInvGain_Q30, subfr_length, psEncC->nb_subfr, psEncC->predictLPCOrder, psEncC->arch ); if( psEncC->useInterpolatedNLSFs && !psEncC->first_frame_after_reset && psEncC->nb_subfr == MAX_NB_SUBFR ) { VARDECL( opus_int16, LPC_res ); /* Optimal solution for last 10 ms */ silk_burg_modified( &res_tmp_nrg, &res_tmp_nrg_Q, a_tmp_Q16, x + 2 * subfr_length, minInvGain_Q30, subfr_length, 2, psEncC->predictLPCOrder, psEncC->arch ); /* subtract residual energy here, as that's easier than adding it to the */ /* residual energy of the first 10 ms in each iteration of the search below */ shift = res_tmp_nrg_Q - res_nrg_Q; if( shift >= 0 ) { if( shift < 32 ) { res_nrg = res_nrg - silk_RSHIFT( res_tmp_nrg, shift ); } } else { silk_assert( shift > -32 ); res_nrg = silk_RSHIFT( res_nrg, -shift ) - res_tmp_nrg; res_nrg_Q = res_tmp_nrg_Q; } /* Convert to NLSFs */ silk_A2NLSF( NLSF_Q15, a_tmp_Q16, psEncC->predictLPCOrder ); ALLOC( LPC_res, 2 * subfr_length, opus_int16 ); /* Search over interpolation indices to find the one with lowest residual energy */ for( k = 3; k >= 0; k-- ) { /* Interpolate NLSFs for first half */ silk_interpolate( NLSF0_Q15, psEncC->prev_NLSFq_Q15, NLSF_Q15, k, psEncC->predictLPCOrder ); /* Convert to LPC for residual energy evaluation */ silk_NLSF2A( a_tmp_Q12, NLSF0_Q15, psEncC->predictLPCOrder, psEncC->arch ); /* Calculate residual energy with NLSF interpolation */ silk_LPC_analysis_filter( LPC_res, x, a_tmp_Q12, 2 * subfr_length, psEncC->predictLPCOrder, psEncC->arch ); silk_sum_sqr_shift( &res_nrg0, &rshift0, LPC_res + psEncC->predictLPCOrder, subfr_length - psEncC->predictLPCOrder ); silk_sum_sqr_shift( &res_nrg1, &rshift1, LPC_res + psEncC->predictLPCOrder + subfr_length, subfr_length - psEncC->predictLPCOrder ); /* Add subframe energies from first half frame */ shift = rshift0 - rshift1; if( shift >= 0 ) { res_nrg1 = silk_RSHIFT( res_nrg1, shift ); res_nrg_interp_Q = -rshift0; } else { res_nrg0 = silk_RSHIFT( res_nrg0, -shift ); res_nrg_interp_Q = -rshift1; } res_nrg_interp = silk_ADD32( res_nrg0, res_nrg1 ); /* Compare with first half energy without NLSF interpolation, or best interpolated value so far */ shift = res_nrg_interp_Q - res_nrg_Q; if( shift >= 0 ) { if( silk_RSHIFT( res_nrg_interp, shift ) < res_nrg ) { isInterpLower = silk_TRUE; } else { isInterpLower = silk_FALSE; } } else { if( -shift < 32 ) { if( res_nrg_interp < silk_RSHIFT( res_nrg, -shift ) ) { isInterpLower = silk_TRUE; } else { isInterpLower = silk_FALSE; } } else { isInterpLower = silk_FALSE; } } /* Determine whether current interpolated NLSFs are best so far */ if( isInterpLower == silk_TRUE ) { /* Interpolation has lower residual energy */ res_nrg = res_nrg_interp; res_nrg_Q = res_nrg_interp_Q; psEncC->indices.NLSFInterpCoef_Q2 = (opus_int8)k; } } } if( psEncC->indices.NLSFInterpCoef_Q2 == 4 ) { /* NLSF interpolation is currently inactive, calculate NLSFs from full frame AR coefficients */ silk_A2NLSF( NLSF_Q15, a_Q16, psEncC->predictLPCOrder ); } silk_assert( psEncC->indices.NLSFInterpCoef_Q2 == 4 || ( psEncC->useInterpolatedNLSFs && !psEncC->first_frame_after_reset && psEncC->nb_subfr == MAX_NB_SUBFR ) ); RESTORE_STACK; } mumble-1.3.4/3rdparty/opus-src/silk/fixed/process_gains_FIX.c0000664000175000017500000001470314010707327023743 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main_FIX.h" #include "tuning_parameters.h" /* Processing of gains */ void silk_process_gains_FIX( silk_encoder_state_FIX *psEnc, /* I/O Encoder state */ silk_encoder_control_FIX *psEncCtrl, /* I/O Encoder control */ opus_int condCoding /* I The type of conditional coding to use */ ) { silk_shape_state_FIX *psShapeSt = &psEnc->sShape; opus_int k; opus_int32 s_Q16, InvMaxSqrVal_Q16, gain, gain_squared, ResNrg, ResNrgPart, quant_offset_Q10; /* Gain reduction when LTP coding gain is high */ if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { /*s = -0.5f * silk_sigmoid( 0.25f * ( psEncCtrl->LTPredCodGain - 12.0f ) ); */ s_Q16 = -silk_sigm_Q15( silk_RSHIFT_ROUND( psEncCtrl->LTPredCodGain_Q7 - SILK_FIX_CONST( 12.0, 7 ), 4 ) ); for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { psEncCtrl->Gains_Q16[ k ] = silk_SMLAWB( psEncCtrl->Gains_Q16[ k ], psEncCtrl->Gains_Q16[ k ], s_Q16 ); } } /* Limit the quantized signal */ /* InvMaxSqrVal = pow( 2.0f, 0.33f * ( 21.0f - SNR_dB ) ) / subfr_length; */ InvMaxSqrVal_Q16 = silk_DIV32_16( silk_log2lin( silk_SMULWB( SILK_FIX_CONST( 21 + 16 / 0.33, 7 ) - psEnc->sCmn.SNR_dB_Q7, SILK_FIX_CONST( 0.33, 16 ) ) ), psEnc->sCmn.subfr_length ); for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { /* Soft limit on ratio residual energy and squared gains */ ResNrg = psEncCtrl->ResNrg[ k ]; ResNrgPart = silk_SMULWW( ResNrg, InvMaxSqrVal_Q16 ); if( psEncCtrl->ResNrgQ[ k ] > 0 ) { ResNrgPart = silk_RSHIFT_ROUND( ResNrgPart, psEncCtrl->ResNrgQ[ k ] ); } else { if( ResNrgPart >= silk_RSHIFT( silk_int32_MAX, -psEncCtrl->ResNrgQ[ k ] ) ) { ResNrgPart = silk_int32_MAX; } else { ResNrgPart = silk_LSHIFT( ResNrgPart, -psEncCtrl->ResNrgQ[ k ] ); } } gain = psEncCtrl->Gains_Q16[ k ]; gain_squared = silk_ADD_SAT32( ResNrgPart, silk_SMMUL( gain, gain ) ); if( gain_squared < silk_int16_MAX ) { /* recalculate with higher precision */ gain_squared = silk_SMLAWW( silk_LSHIFT( ResNrgPart, 16 ), gain, gain ); silk_assert( gain_squared > 0 ); gain = silk_SQRT_APPROX( gain_squared ); /* Q8 */ gain = silk_min( gain, silk_int32_MAX >> 8 ); psEncCtrl->Gains_Q16[ k ] = silk_LSHIFT_SAT32( gain, 8 ); /* Q16 */ } else { gain = silk_SQRT_APPROX( gain_squared ); /* Q0 */ gain = silk_min( gain, silk_int32_MAX >> 16 ); psEncCtrl->Gains_Q16[ k ] = silk_LSHIFT_SAT32( gain, 16 ); /* Q16 */ } } /* Save unquantized gains and gain Index */ silk_memcpy( psEncCtrl->GainsUnq_Q16, psEncCtrl->Gains_Q16, psEnc->sCmn.nb_subfr * sizeof( opus_int32 ) ); psEncCtrl->lastGainIndexPrev = psShapeSt->LastGainIndex; /* Quantize gains */ silk_gains_quant( psEnc->sCmn.indices.GainsIndices, psEncCtrl->Gains_Q16, &psShapeSt->LastGainIndex, condCoding == CODE_CONDITIONALLY, psEnc->sCmn.nb_subfr ); /* Set quantizer offset for voiced signals. Larger offset when LTP coding gain is low or tilt is high (ie low-pass) */ if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { if( psEncCtrl->LTPredCodGain_Q7 + silk_RSHIFT( psEnc->sCmn.input_tilt_Q15, 8 ) > SILK_FIX_CONST( 1.0, 7 ) ) { psEnc->sCmn.indices.quantOffsetType = 0; } else { psEnc->sCmn.indices.quantOffsetType = 1; } } /* Quantizer boundary adjustment */ quant_offset_Q10 = silk_Quantization_Offsets_Q10[ psEnc->sCmn.indices.signalType >> 1 ][ psEnc->sCmn.indices.quantOffsetType ]; psEncCtrl->Lambda_Q10 = SILK_FIX_CONST( LAMBDA_OFFSET, 10 ) + silk_SMULBB( SILK_FIX_CONST( LAMBDA_DELAYED_DECISIONS, 10 ), psEnc->sCmn.nStatesDelayedDecision ) + silk_SMULWB( SILK_FIX_CONST( LAMBDA_SPEECH_ACT, 18 ), psEnc->sCmn.speech_activity_Q8 ) + silk_SMULWB( SILK_FIX_CONST( LAMBDA_INPUT_QUALITY, 12 ), psEncCtrl->input_quality_Q14 ) + silk_SMULWB( SILK_FIX_CONST( LAMBDA_CODING_QUALITY, 12 ), psEncCtrl->coding_quality_Q14 ) + silk_SMULWB( SILK_FIX_CONST( LAMBDA_QUANT_OFFSET, 16 ), quant_offset_Q10 ); silk_assert( psEncCtrl->Lambda_Q10 > 0 ); silk_assert( psEncCtrl->Lambda_Q10 < SILK_FIX_CONST( 2, 10 ) ); } mumble-1.3.4/3rdparty/opus-src/silk/fixed/warped_autocorrelation_FIX.c0000664000175000017500000001106014010707327025651 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main_FIX.h" #if defined(MIPSr1_ASM) #include "mips/warped_autocorrelation_FIX_mipsr1.h" #endif /* Autocorrelations for a warped frequency axis */ void silk_warped_autocorrelation_FIX_c( opus_int32 *corr, /* O Result [order + 1] */ opus_int *scale, /* O Scaling of the correlation vector */ const opus_int16 *input, /* I Input data to correlate */ const opus_int warping_Q16, /* I Warping coefficient */ const opus_int length, /* I Length of input */ const opus_int order /* I Correlation order (even) */ ) { opus_int n, i, lsh; opus_int32 tmp1_QS, tmp2_QS; opus_int32 state_QS[ MAX_SHAPE_LPC_ORDER + 1 ] = { 0 }; opus_int64 corr_QC[ MAX_SHAPE_LPC_ORDER + 1 ] = { 0 }; /* Order must be even */ silk_assert( ( order & 1 ) == 0 ); silk_assert( 2 * QS - QC >= 0 ); /* Loop over samples */ for( n = 0; n < length; n++ ) { tmp1_QS = silk_LSHIFT32( (opus_int32)input[ n ], QS ); /* Loop over allpass sections */ for( i = 0; i < order; i += 2 ) { /* Output of allpass section */ tmp2_QS = silk_SMLAWB( state_QS[ i ], state_QS[ i + 1 ] - tmp1_QS, warping_Q16 ); state_QS[ i ] = tmp1_QS; corr_QC[ i ] += silk_RSHIFT64( silk_SMULL( tmp1_QS, state_QS[ 0 ] ), 2 * QS - QC ); /* Output of allpass section */ tmp1_QS = silk_SMLAWB( state_QS[ i + 1 ], state_QS[ i + 2 ] - tmp2_QS, warping_Q16 ); state_QS[ i + 1 ] = tmp2_QS; corr_QC[ i + 1 ] += silk_RSHIFT64( silk_SMULL( tmp2_QS, state_QS[ 0 ] ), 2 * QS - QC ); } state_QS[ order ] = tmp1_QS; corr_QC[ order ] += silk_RSHIFT64( silk_SMULL( tmp1_QS, state_QS[ 0 ] ), 2 * QS - QC ); } lsh = silk_CLZ64( corr_QC[ 0 ] ) - 35; lsh = silk_LIMIT( lsh, -12 - QC, 30 - QC ); *scale = -( QC + lsh ); silk_assert( *scale >= -30 && *scale <= 12 ); if( lsh >= 0 ) { for( i = 0; i < order + 1; i++ ) { corr[ i ] = (opus_int32)silk_CHECK_FIT32( silk_LSHIFT64( corr_QC[ i ], lsh ) ); } } else { for( i = 0; i < order + 1; i++ ) { corr[ i ] = (opus_int32)silk_CHECK_FIT32( silk_RSHIFT64( corr_QC[ i ], -lsh ) ); } } silk_assert( corr_QC[ 0 ] >= 0 ); /* If breaking, decrease QC*/ } mumble-1.3.4/3rdparty/opus-src/silk/fixed/LTP_analysis_filter_FIX.c0000664000175000017500000001117214010707327025010 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main_FIX.h" void silk_LTP_analysis_filter_FIX( opus_int16 *LTP_res, /* O LTP residual signal of length MAX_NB_SUBFR * ( pre_length + subfr_length ) */ const opus_int16 *x, /* I Pointer to input signal with at least max( pitchL ) preceding samples */ const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ],/* I LTP_ORDER LTP coefficients for each MAX_NB_SUBFR subframe */ const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag, one for each subframe */ const opus_int32 invGains_Q16[ MAX_NB_SUBFR ], /* I Inverse quantization gains, one for each subframe */ const opus_int subfr_length, /* I Length of each subframe */ const opus_int nb_subfr, /* I Number of subframes */ const opus_int pre_length /* I Length of the preceding samples starting at &x[0] for each subframe */ ) { const opus_int16 *x_ptr, *x_lag_ptr; opus_int16 Btmp_Q14[ LTP_ORDER ]; opus_int16 *LTP_res_ptr; opus_int k, i; opus_int32 LTP_est; x_ptr = x; LTP_res_ptr = LTP_res; for( k = 0; k < nb_subfr; k++ ) { x_lag_ptr = x_ptr - pitchL[ k ]; Btmp_Q14[ 0 ] = LTPCoef_Q14[ k * LTP_ORDER ]; Btmp_Q14[ 1 ] = LTPCoef_Q14[ k * LTP_ORDER + 1 ]; Btmp_Q14[ 2 ] = LTPCoef_Q14[ k * LTP_ORDER + 2 ]; Btmp_Q14[ 3 ] = LTPCoef_Q14[ k * LTP_ORDER + 3 ]; Btmp_Q14[ 4 ] = LTPCoef_Q14[ k * LTP_ORDER + 4 ]; /* LTP analysis FIR filter */ for( i = 0; i < subfr_length + pre_length; i++ ) { LTP_res_ptr[ i ] = x_ptr[ i ]; /* Long-term prediction */ LTP_est = silk_SMULBB( x_lag_ptr[ LTP_ORDER / 2 ], Btmp_Q14[ 0 ] ); LTP_est = silk_SMLABB_ovflw( LTP_est, x_lag_ptr[ 1 ], Btmp_Q14[ 1 ] ); LTP_est = silk_SMLABB_ovflw( LTP_est, x_lag_ptr[ 0 ], Btmp_Q14[ 2 ] ); LTP_est = silk_SMLABB_ovflw( LTP_est, x_lag_ptr[ -1 ], Btmp_Q14[ 3 ] ); LTP_est = silk_SMLABB_ovflw( LTP_est, x_lag_ptr[ -2 ], Btmp_Q14[ 4 ] ); LTP_est = silk_RSHIFT_ROUND( LTP_est, 14 ); /* round and -> Q0*/ /* Subtract long-term prediction */ LTP_res_ptr[ i ] = (opus_int16)silk_SAT16( (opus_int32)x_ptr[ i ] - LTP_est ); /* Scale residual */ LTP_res_ptr[ i ] = silk_SMULWB( invGains_Q16[ k ], LTP_res_ptr[ i ] ); x_lag_ptr++; } /* Update pointers */ LTP_res_ptr += subfr_length + pre_length; x_ptr += subfr_length; } } mumble-1.3.4/3rdparty/opus-src/silk/fixed/corrMatrix_FIX.c0000664000175000017500000002021714010707327023233 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif /********************************************************************** * Correlation Matrix Computations for LS estimate. **********************************************************************/ #include "main_FIX.h" /* Calculates correlation vector X'*t */ void silk_corrVector_FIX( const opus_int16 *x, /* I x vector [L + order - 1] used to form data matrix X */ const opus_int16 *t, /* I Target vector [L] */ const opus_int L, /* I Length of vectors */ const opus_int order, /* I Max lag for correlation */ opus_int32 *Xt, /* O Pointer to X'*t correlation vector [order] */ const opus_int rshifts, /* I Right shifts of correlations */ int arch /* I Run-time architecture */ ) { opus_int lag, i; const opus_int16 *ptr1, *ptr2; opus_int32 inner_prod; ptr1 = &x[ order - 1 ]; /* Points to first sample of column 0 of X: X[:,0] */ ptr2 = t; /* Calculate X'*t */ if( rshifts > 0 ) { /* Right shifting used */ for( lag = 0; lag < order; lag++ ) { inner_prod = 0; for( i = 0; i < L; i++ ) { inner_prod = silk_ADD_RSHIFT32( inner_prod, silk_SMULBB( ptr1[ i ], ptr2[i] ), rshifts ); } Xt[ lag ] = inner_prod; /* X[:,lag]'*t */ ptr1--; /* Go to next column of X */ } } else { silk_assert( rshifts == 0 ); for( lag = 0; lag < order; lag++ ) { Xt[ lag ] = silk_inner_prod_aligned( ptr1, ptr2, L, arch ); /* X[:,lag]'*t */ ptr1--; /* Go to next column of X */ } } } /* Calculates correlation matrix X'*X */ void silk_corrMatrix_FIX( const opus_int16 *x, /* I x vector [L + order - 1] used to form data matrix X */ const opus_int L, /* I Length of vectors */ const opus_int order, /* I Max lag for correlation */ opus_int32 *XX, /* O Pointer to X'*X correlation matrix [ order x order ] */ opus_int32 *nrg, /* O Energy of x vector */ opus_int *rshifts, /* O Right shifts of correlations and energy */ int arch /* I Run-time architecture */ ) { opus_int i, j, lag; opus_int32 energy; const opus_int16 *ptr1, *ptr2; /* Calculate energy to find shift used to fit in 32 bits */ silk_sum_sqr_shift( nrg, rshifts, x, L + order - 1 ); energy = *nrg; /* Calculate energy of first column (0) of X: X[:,0]'*X[:,0] */ /* Remove contribution of first order - 1 samples */ for( i = 0; i < order - 1; i++ ) { energy -= silk_RSHIFT32( silk_SMULBB( x[ i ], x[ i ] ), *rshifts ); } /* Calculate energy of remaining columns of X: X[:,j]'*X[:,j] */ /* Fill out the diagonal of the correlation matrix */ matrix_ptr( XX, 0, 0, order ) = energy; silk_assert( energy >= 0 ); ptr1 = &x[ order - 1 ]; /* First sample of column 0 of X */ for( j = 1; j < order; j++ ) { energy = silk_SUB32( energy, silk_RSHIFT32( silk_SMULBB( ptr1[ L - j ], ptr1[ L - j ] ), *rshifts ) ); energy = silk_ADD32( energy, silk_RSHIFT32( silk_SMULBB( ptr1[ -j ], ptr1[ -j ] ), *rshifts ) ); matrix_ptr( XX, j, j, order ) = energy; silk_assert( energy >= 0 ); } ptr2 = &x[ order - 2 ]; /* First sample of column 1 of X */ /* Calculate the remaining elements of the correlation matrix */ if( *rshifts > 0 ) { /* Right shifting used */ for( lag = 1; lag < order; lag++ ) { /* Inner product of column 0 and column lag: X[:,0]'*X[:,lag] */ energy = 0; for( i = 0; i < L; i++ ) { energy += silk_RSHIFT32( silk_SMULBB( ptr1[ i ], ptr2[i] ), *rshifts ); } /* Calculate remaining off diagonal: X[:,j]'*X[:,j + lag] */ matrix_ptr( XX, lag, 0, order ) = energy; matrix_ptr( XX, 0, lag, order ) = energy; for( j = 1; j < ( order - lag ); j++ ) { energy = silk_SUB32( energy, silk_RSHIFT32( silk_SMULBB( ptr1[ L - j ], ptr2[ L - j ] ), *rshifts ) ); energy = silk_ADD32( energy, silk_RSHIFT32( silk_SMULBB( ptr1[ -j ], ptr2[ -j ] ), *rshifts ) ); matrix_ptr( XX, lag + j, j, order ) = energy; matrix_ptr( XX, j, lag + j, order ) = energy; } ptr2--; /* Update pointer to first sample of next column (lag) in X */ } } else { for( lag = 1; lag < order; lag++ ) { /* Inner product of column 0 and column lag: X[:,0]'*X[:,lag] */ energy = silk_inner_prod_aligned( ptr1, ptr2, L, arch ); matrix_ptr( XX, lag, 0, order ) = energy; matrix_ptr( XX, 0, lag, order ) = energy; /* Calculate remaining off diagonal: X[:,j]'*X[:,j + lag] */ for( j = 1; j < ( order - lag ); j++ ) { energy = silk_SUB32( energy, silk_SMULBB( ptr1[ L - j ], ptr2[ L - j ] ) ); energy = silk_SMLABB( energy, ptr1[ -j ], ptr2[ -j ] ); matrix_ptr( XX, lag + j, j, order ) = energy; matrix_ptr( XX, j, lag + j, order ) = energy; } ptr2--;/* Update pointer to first sample of next column (lag) in X */ } } } mumble-1.3.4/3rdparty/opus-src/silk/fixed/noise_shape_analysis_FIX.c0000664000175000017500000005027714010707327025312 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main_FIX.h" #include "stack_alloc.h" #include "tuning_parameters.h" /* Compute gain to make warped filter coefficients have a zero mean log frequency response on a */ /* non-warped frequency scale. (So that it can be implemented with a minimum-phase monic filter.) */ /* Note: A monic filter is one with the first coefficient equal to 1.0. In Silk we omit the first */ /* coefficient in an array of coefficients, for monic filters. */ static OPUS_INLINE opus_int32 warped_gain( /* gain in Q16*/ const opus_int32 *coefs_Q24, opus_int lambda_Q16, opus_int order ) { opus_int i; opus_int32 gain_Q24; lambda_Q16 = -lambda_Q16; gain_Q24 = coefs_Q24[ order - 1 ]; for( i = order - 2; i >= 0; i-- ) { gain_Q24 = silk_SMLAWB( coefs_Q24[ i ], gain_Q24, lambda_Q16 ); } gain_Q24 = silk_SMLAWB( SILK_FIX_CONST( 1.0, 24 ), gain_Q24, -lambda_Q16 ); return silk_INVERSE32_varQ( gain_Q24, 40 ); } /* Convert warped filter coefficients to monic pseudo-warped coefficients and limit maximum */ /* amplitude of monic warped coefficients by using bandwidth expansion on the true coefficients */ static OPUS_INLINE void limit_warped_coefs( opus_int32 *coefs_Q24, opus_int lambda_Q16, opus_int32 limit_Q24, opus_int order ) { opus_int i, iter, ind = 0; opus_int32 tmp, maxabs_Q24, chirp_Q16, gain_Q16; opus_int32 nom_Q16, den_Q24; opus_int32 limit_Q20, maxabs_Q20; /* Convert to monic coefficients */ lambda_Q16 = -lambda_Q16; for( i = order - 1; i > 0; i-- ) { coefs_Q24[ i - 1 ] = silk_SMLAWB( coefs_Q24[ i - 1 ], coefs_Q24[ i ], lambda_Q16 ); } lambda_Q16 = -lambda_Q16; nom_Q16 = silk_SMLAWB( SILK_FIX_CONST( 1.0, 16 ), -(opus_int32)lambda_Q16, lambda_Q16 ); den_Q24 = silk_SMLAWB( SILK_FIX_CONST( 1.0, 24 ), coefs_Q24[ 0 ], lambda_Q16 ); gain_Q16 = silk_DIV32_varQ( nom_Q16, den_Q24, 24 ); for( i = 0; i < order; i++ ) { coefs_Q24[ i ] = silk_SMULWW( gain_Q16, coefs_Q24[ i ] ); } limit_Q20 = silk_RSHIFT(limit_Q24, 4); for( iter = 0; iter < 10; iter++ ) { /* Find maximum absolute value */ maxabs_Q24 = -1; for( i = 0; i < order; i++ ) { tmp = silk_abs_int32( coefs_Q24[ i ] ); if( tmp > maxabs_Q24 ) { maxabs_Q24 = tmp; ind = i; } } /* Use Q20 to avoid any overflow when multiplying by (ind + 1) later. */ maxabs_Q20 = silk_RSHIFT(maxabs_Q24, 4); if( maxabs_Q20 <= limit_Q20 ) { /* Coefficients are within range - done */ return; } /* Convert back to true warped coefficients */ for( i = 1; i < order; i++ ) { coefs_Q24[ i - 1 ] = silk_SMLAWB( coefs_Q24[ i - 1 ], coefs_Q24[ i ], lambda_Q16 ); } gain_Q16 = silk_INVERSE32_varQ( gain_Q16, 32 ); for( i = 0; i < order; i++ ) { coefs_Q24[ i ] = silk_SMULWW( gain_Q16, coefs_Q24[ i ] ); } /* Apply bandwidth expansion */ chirp_Q16 = SILK_FIX_CONST( 0.99, 16 ) - silk_DIV32_varQ( silk_SMULWB( maxabs_Q20 - limit_Q20, silk_SMLABB( SILK_FIX_CONST( 0.8, 10 ), SILK_FIX_CONST( 0.1, 10 ), iter ) ), silk_MUL( maxabs_Q20, ind + 1 ), 22 ); silk_bwexpander_32( coefs_Q24, order, chirp_Q16 ); /* Convert to monic warped coefficients */ lambda_Q16 = -lambda_Q16; for( i = order - 1; i > 0; i-- ) { coefs_Q24[ i - 1 ] = silk_SMLAWB( coefs_Q24[ i - 1 ], coefs_Q24[ i ], lambda_Q16 ); } lambda_Q16 = -lambda_Q16; nom_Q16 = silk_SMLAWB( SILK_FIX_CONST( 1.0, 16 ), -(opus_int32)lambda_Q16, lambda_Q16 ); den_Q24 = silk_SMLAWB( SILK_FIX_CONST( 1.0, 24 ), coefs_Q24[ 0 ], lambda_Q16 ); gain_Q16 = silk_DIV32_varQ( nom_Q16, den_Q24, 24 ); for( i = 0; i < order; i++ ) { coefs_Q24[ i ] = silk_SMULWW( gain_Q16, coefs_Q24[ i ] ); } } silk_assert( 0 ); } /* Disable MIPS version until it's updated. */ #if 0 && defined(MIPSr1_ASM) #include "mips/noise_shape_analysis_FIX_mipsr1.h" #endif /**************************************************************/ /* Compute noise shaping coefficients and initial gain values */ /**************************************************************/ #ifndef OVERRIDE_silk_noise_shape_analysis_FIX void silk_noise_shape_analysis_FIX( silk_encoder_state_FIX *psEnc, /* I/O Encoder state FIX */ silk_encoder_control_FIX *psEncCtrl, /* I/O Encoder control FIX */ const opus_int16 *pitch_res, /* I LPC residual from pitch analysis */ const opus_int16 *x, /* I Input signal [ frame_length + la_shape ] */ int arch /* I Run-time architecture */ ) { silk_shape_state_FIX *psShapeSt = &psEnc->sShape; opus_int k, i, nSamples, nSegs, Qnrg, b_Q14, warping_Q16, scale = 0; opus_int32 SNR_adj_dB_Q7, HarmShapeGain_Q16, Tilt_Q16, tmp32; opus_int32 nrg, log_energy_Q7, log_energy_prev_Q7, energy_variation_Q7; opus_int32 BWExp_Q16, gain_mult_Q16, gain_add_Q16, strength_Q16, b_Q8; opus_int32 auto_corr[ MAX_SHAPE_LPC_ORDER + 1 ]; opus_int32 refl_coef_Q16[ MAX_SHAPE_LPC_ORDER ]; opus_int32 AR_Q24[ MAX_SHAPE_LPC_ORDER ]; VARDECL( opus_int16, x_windowed ); const opus_int16 *x_ptr, *pitch_res_ptr; SAVE_STACK; /* Point to start of first LPC analysis block */ x_ptr = x - psEnc->sCmn.la_shape; /****************/ /* GAIN CONTROL */ /****************/ SNR_adj_dB_Q7 = psEnc->sCmn.SNR_dB_Q7; /* Input quality is the average of the quality in the lowest two VAD bands */ psEncCtrl->input_quality_Q14 = ( opus_int )silk_RSHIFT( (opus_int32)psEnc->sCmn.input_quality_bands_Q15[ 0 ] + psEnc->sCmn.input_quality_bands_Q15[ 1 ], 2 ); /* Coding quality level, between 0.0_Q0 and 1.0_Q0, but in Q14 */ psEncCtrl->coding_quality_Q14 = silk_RSHIFT( silk_sigm_Q15( silk_RSHIFT_ROUND( SNR_adj_dB_Q7 - SILK_FIX_CONST( 20.0, 7 ), 4 ) ), 1 ); /* Reduce coding SNR during low speech activity */ if( psEnc->sCmn.useCBR == 0 ) { b_Q8 = SILK_FIX_CONST( 1.0, 8 ) - psEnc->sCmn.speech_activity_Q8; b_Q8 = silk_SMULWB( silk_LSHIFT( b_Q8, 8 ), b_Q8 ); SNR_adj_dB_Q7 = silk_SMLAWB( SNR_adj_dB_Q7, silk_SMULBB( SILK_FIX_CONST( -BG_SNR_DECR_dB, 7 ) >> ( 4 + 1 ), b_Q8 ), /* Q11*/ silk_SMULWB( SILK_FIX_CONST( 1.0, 14 ) + psEncCtrl->input_quality_Q14, psEncCtrl->coding_quality_Q14 ) ); /* Q12*/ } if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { /* Reduce gains for periodic signals */ SNR_adj_dB_Q7 = silk_SMLAWB( SNR_adj_dB_Q7, SILK_FIX_CONST( HARM_SNR_INCR_dB, 8 ), psEnc->LTPCorr_Q15 ); } else { /* For unvoiced signals and low-quality input, adjust the quality slower than SNR_dB setting */ SNR_adj_dB_Q7 = silk_SMLAWB( SNR_adj_dB_Q7, silk_SMLAWB( SILK_FIX_CONST( 6.0, 9 ), -SILK_FIX_CONST( 0.4, 18 ), psEnc->sCmn.SNR_dB_Q7 ), SILK_FIX_CONST( 1.0, 14 ) - psEncCtrl->input_quality_Q14 ); } /*************************/ /* SPARSENESS PROCESSING */ /*************************/ /* Set quantizer offset */ if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { /* Initially set to 0; may be overruled in process_gains(..) */ psEnc->sCmn.indices.quantOffsetType = 0; } else { /* Sparseness measure, based on relative fluctuations of energy per 2 milliseconds */ nSamples = silk_LSHIFT( psEnc->sCmn.fs_kHz, 1 ); energy_variation_Q7 = 0; log_energy_prev_Q7 = 0; pitch_res_ptr = pitch_res; nSegs = silk_SMULBB( SUB_FRAME_LENGTH_MS, psEnc->sCmn.nb_subfr ) / 2; for( k = 0; k < nSegs; k++ ) { silk_sum_sqr_shift( &nrg, &scale, pitch_res_ptr, nSamples ); nrg += silk_RSHIFT( nSamples, scale ); /* Q(-scale)*/ log_energy_Q7 = silk_lin2log( nrg ); if( k > 0 ) { energy_variation_Q7 += silk_abs( log_energy_Q7 - log_energy_prev_Q7 ); } log_energy_prev_Q7 = log_energy_Q7; pitch_res_ptr += nSamples; } /* Set quantization offset depending on sparseness measure */ if( energy_variation_Q7 > SILK_FIX_CONST( ENERGY_VARIATION_THRESHOLD_QNT_OFFSET, 7 ) * (nSegs-1) ) { psEnc->sCmn.indices.quantOffsetType = 0; } else { psEnc->sCmn.indices.quantOffsetType = 1; } } /*******************************/ /* Control bandwidth expansion */ /*******************************/ /* More BWE for signals with high prediction gain */ strength_Q16 = silk_SMULWB( psEncCtrl->predGain_Q16, SILK_FIX_CONST( FIND_PITCH_WHITE_NOISE_FRACTION, 16 ) ); BWExp_Q16 = silk_DIV32_varQ( SILK_FIX_CONST( BANDWIDTH_EXPANSION, 16 ), silk_SMLAWW( SILK_FIX_CONST( 1.0, 16 ), strength_Q16, strength_Q16 ), 16 ); if( psEnc->sCmn.warping_Q16 > 0 ) { /* Slightly more warping in analysis will move quantization noise up in frequency, where it's better masked */ warping_Q16 = silk_SMLAWB( psEnc->sCmn.warping_Q16, (opus_int32)psEncCtrl->coding_quality_Q14, SILK_FIX_CONST( 0.01, 18 ) ); } else { warping_Q16 = 0; } /********************************************/ /* Compute noise shaping AR coefs and gains */ /********************************************/ ALLOC( x_windowed, psEnc->sCmn.shapeWinLength, opus_int16 ); for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { /* Apply window: sine slope followed by flat part followed by cosine slope */ opus_int shift, slope_part, flat_part; flat_part = psEnc->sCmn.fs_kHz * 3; slope_part = silk_RSHIFT( psEnc->sCmn.shapeWinLength - flat_part, 1 ); silk_apply_sine_window( x_windowed, x_ptr, 1, slope_part ); shift = slope_part; silk_memcpy( x_windowed + shift, x_ptr + shift, flat_part * sizeof(opus_int16) ); shift += flat_part; silk_apply_sine_window( x_windowed + shift, x_ptr + shift, 2, slope_part ); /* Update pointer: next LPC analysis block */ x_ptr += psEnc->sCmn.subfr_length; if( psEnc->sCmn.warping_Q16 > 0 ) { /* Calculate warped auto correlation */ silk_warped_autocorrelation_FIX( auto_corr, &scale, x_windowed, warping_Q16, psEnc->sCmn.shapeWinLength, psEnc->sCmn.shapingLPCOrder, arch ); } else { /* Calculate regular auto correlation */ silk_autocorr( auto_corr, &scale, x_windowed, psEnc->sCmn.shapeWinLength, psEnc->sCmn.shapingLPCOrder + 1, arch ); } /* Add white noise, as a fraction of energy */ auto_corr[0] = silk_ADD32( auto_corr[0], silk_max_32( silk_SMULWB( silk_RSHIFT( auto_corr[ 0 ], 4 ), SILK_FIX_CONST( SHAPE_WHITE_NOISE_FRACTION, 20 ) ), 1 ) ); /* Calculate the reflection coefficients using schur */ nrg = silk_schur64( refl_coef_Q16, auto_corr, psEnc->sCmn.shapingLPCOrder ); silk_assert( nrg >= 0 ); /* Convert reflection coefficients to prediction coefficients */ silk_k2a_Q16( AR_Q24, refl_coef_Q16, psEnc->sCmn.shapingLPCOrder ); Qnrg = -scale; /* range: -12...30*/ silk_assert( Qnrg >= -12 ); silk_assert( Qnrg <= 30 ); /* Make sure that Qnrg is an even number */ if( Qnrg & 1 ) { Qnrg -= 1; nrg >>= 1; } tmp32 = silk_SQRT_APPROX( nrg ); Qnrg >>= 1; /* range: -6...15*/ psEncCtrl->Gains_Q16[ k ] = silk_LSHIFT_SAT32( tmp32, 16 - Qnrg ); if( psEnc->sCmn.warping_Q16 > 0 ) { /* Adjust gain for warping */ gain_mult_Q16 = warped_gain( AR_Q24, warping_Q16, psEnc->sCmn.shapingLPCOrder ); silk_assert( psEncCtrl->Gains_Q16[ k ] > 0 ); if( psEncCtrl->Gains_Q16[ k ] < SILK_FIX_CONST( 0.25, 16 ) ) { psEncCtrl->Gains_Q16[ k ] = silk_SMULWW( psEncCtrl->Gains_Q16[ k ], gain_mult_Q16 ); } else { psEncCtrl->Gains_Q16[ k ] = silk_SMULWW( silk_RSHIFT_ROUND( psEncCtrl->Gains_Q16[ k ], 1 ), gain_mult_Q16 ); if ( psEncCtrl->Gains_Q16[ k ] >= ( silk_int32_MAX >> 1 ) ) { psEncCtrl->Gains_Q16[ k ] = silk_int32_MAX; } else { psEncCtrl->Gains_Q16[ k ] = silk_LSHIFT32( psEncCtrl->Gains_Q16[ k ], 1 ); } } silk_assert( psEncCtrl->Gains_Q16[ k ] > 0 ); } /* Bandwidth expansion */ silk_bwexpander_32( AR_Q24, psEnc->sCmn.shapingLPCOrder, BWExp_Q16 ); if( psEnc->sCmn.warping_Q16 > 0 ) { /* Convert to monic warped prediction coefficients and limit absolute values */ limit_warped_coefs( AR_Q24, warping_Q16, SILK_FIX_CONST( 3.999, 24 ), psEnc->sCmn.shapingLPCOrder ); /* Convert from Q24 to Q13 and store in int16 */ for( i = 0; i < psEnc->sCmn.shapingLPCOrder; i++ ) { psEncCtrl->AR_Q13[ k * MAX_SHAPE_LPC_ORDER + i ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( AR_Q24[ i ], 11 ) ); } } else { silk_LPC_fit( &psEncCtrl->AR_Q13[ k * MAX_SHAPE_LPC_ORDER ], AR_Q24, 13, 24, psEnc->sCmn.shapingLPCOrder ); } } /*****************/ /* Gain tweaking */ /*****************/ /* Increase gains during low speech activity and put lower limit on gains */ gain_mult_Q16 = silk_log2lin( -silk_SMLAWB( -SILK_FIX_CONST( 16.0, 7 ), SNR_adj_dB_Q7, SILK_FIX_CONST( 0.16, 16 ) ) ); gain_add_Q16 = silk_log2lin( silk_SMLAWB( SILK_FIX_CONST( 16.0, 7 ), SILK_FIX_CONST( MIN_QGAIN_DB, 7 ), SILK_FIX_CONST( 0.16, 16 ) ) ); silk_assert( gain_mult_Q16 > 0 ); for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { psEncCtrl->Gains_Q16[ k ] = silk_SMULWW( psEncCtrl->Gains_Q16[ k ], gain_mult_Q16 ); silk_assert( psEncCtrl->Gains_Q16[ k ] >= 0 ); psEncCtrl->Gains_Q16[ k ] = silk_ADD_POS_SAT32( psEncCtrl->Gains_Q16[ k ], gain_add_Q16 ); } /************************************************/ /* Control low-frequency shaping and noise tilt */ /************************************************/ /* Less low frequency shaping for noisy inputs */ strength_Q16 = silk_MUL( SILK_FIX_CONST( LOW_FREQ_SHAPING, 4 ), silk_SMLAWB( SILK_FIX_CONST( 1.0, 12 ), SILK_FIX_CONST( LOW_QUALITY_LOW_FREQ_SHAPING_DECR, 13 ), psEnc->sCmn.input_quality_bands_Q15[ 0 ] - SILK_FIX_CONST( 1.0, 15 ) ) ); strength_Q16 = silk_RSHIFT( silk_MUL( strength_Q16, psEnc->sCmn.speech_activity_Q8 ), 8 ); if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { /* Reduce low frequencies quantization noise for periodic signals, depending on pitch lag */ /*f = 400; freqz([1, -0.98 + 2e-4 * f], [1, -0.97 + 7e-4 * f], 2^12, Fs); axis([0, 1000, -10, 1])*/ opus_int fs_kHz_inv = silk_DIV32_16( SILK_FIX_CONST( 0.2, 14 ), psEnc->sCmn.fs_kHz ); for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { b_Q14 = fs_kHz_inv + silk_DIV32_16( SILK_FIX_CONST( 3.0, 14 ), psEncCtrl->pitchL[ k ] ); /* Pack two coefficients in one int32 */ psEncCtrl->LF_shp_Q14[ k ] = silk_LSHIFT( SILK_FIX_CONST( 1.0, 14 ) - b_Q14 - silk_SMULWB( strength_Q16, b_Q14 ), 16 ); psEncCtrl->LF_shp_Q14[ k ] |= (opus_uint16)( b_Q14 - SILK_FIX_CONST( 1.0, 14 ) ); } silk_assert( SILK_FIX_CONST( HARM_HP_NOISE_COEF, 24 ) < SILK_FIX_CONST( 0.5, 24 ) ); /* Guarantees that second argument to SMULWB() is within range of an opus_int16*/ Tilt_Q16 = - SILK_FIX_CONST( HP_NOISE_COEF, 16 ) - silk_SMULWB( SILK_FIX_CONST( 1.0, 16 ) - SILK_FIX_CONST( HP_NOISE_COEF, 16 ), silk_SMULWB( SILK_FIX_CONST( HARM_HP_NOISE_COEF, 24 ), psEnc->sCmn.speech_activity_Q8 ) ); } else { b_Q14 = silk_DIV32_16( 21299, psEnc->sCmn.fs_kHz ); /* 1.3_Q0 = 21299_Q14*/ /* Pack two coefficients in one int32 */ psEncCtrl->LF_shp_Q14[ 0 ] = silk_LSHIFT( SILK_FIX_CONST( 1.0, 14 ) - b_Q14 - silk_SMULWB( strength_Q16, silk_SMULWB( SILK_FIX_CONST( 0.6, 16 ), b_Q14 ) ), 16 ); psEncCtrl->LF_shp_Q14[ 0 ] |= (opus_uint16)( b_Q14 - SILK_FIX_CONST( 1.0, 14 ) ); for( k = 1; k < psEnc->sCmn.nb_subfr; k++ ) { psEncCtrl->LF_shp_Q14[ k ] = psEncCtrl->LF_shp_Q14[ 0 ]; } Tilt_Q16 = -SILK_FIX_CONST( HP_NOISE_COEF, 16 ); } /****************************/ /* HARMONIC SHAPING CONTROL */ /****************************/ if( USE_HARM_SHAPING && psEnc->sCmn.indices.signalType == TYPE_VOICED ) { /* More harmonic noise shaping for high bitrates or noisy input */ HarmShapeGain_Q16 = silk_SMLAWB( SILK_FIX_CONST( HARMONIC_SHAPING, 16 ), SILK_FIX_CONST( 1.0, 16 ) - silk_SMULWB( SILK_FIX_CONST( 1.0, 18 ) - silk_LSHIFT( psEncCtrl->coding_quality_Q14, 4 ), psEncCtrl->input_quality_Q14 ), SILK_FIX_CONST( HIGH_RATE_OR_LOW_QUALITY_HARMONIC_SHAPING, 16 ) ); /* Less harmonic noise shaping for less periodic signals */ HarmShapeGain_Q16 = silk_SMULWB( silk_LSHIFT( HarmShapeGain_Q16, 1 ), silk_SQRT_APPROX( silk_LSHIFT( psEnc->LTPCorr_Q15, 15 ) ) ); } else { HarmShapeGain_Q16 = 0; } /*************************/ /* Smooth over subframes */ /*************************/ for( k = 0; k < MAX_NB_SUBFR; k++ ) { psShapeSt->HarmShapeGain_smth_Q16 = silk_SMLAWB( psShapeSt->HarmShapeGain_smth_Q16, HarmShapeGain_Q16 - psShapeSt->HarmShapeGain_smth_Q16, SILK_FIX_CONST( SUBFR_SMTH_COEF, 16 ) ); psShapeSt->Tilt_smth_Q16 = silk_SMLAWB( psShapeSt->Tilt_smth_Q16, Tilt_Q16 - psShapeSt->Tilt_smth_Q16, SILK_FIX_CONST( SUBFR_SMTH_COEF, 16 ) ); psEncCtrl->HarmShapeGain_Q14[ k ] = ( opus_int )silk_RSHIFT_ROUND( psShapeSt->HarmShapeGain_smth_Q16, 2 ); psEncCtrl->Tilt_Q14[ k ] = ( opus_int )silk_RSHIFT_ROUND( psShapeSt->Tilt_smth_Q16, 2 ); } RESTORE_STACK; } #endif /* OVERRIDE_silk_noise_shape_analysis_FIX */ mumble-1.3.4/3rdparty/opus-src/silk/fixed/mips/0000775000175000017500000000000014010707327021175 5ustar builderbuildermumble-1.3.4/3rdparty/opus-src/silk/fixed/mips/prefilter_FIX_mipsr1.h0000664000175000017500000002107314010707327025346 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef __PREFILTER_FIX_MIPSR1_H__ #define __PREFILTER_FIX_MIPSR1_H__ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main_FIX.h" #include "stack_alloc.h" #include "tuning_parameters.h" #define OVERRIDE_silk_warped_LPC_analysis_filter_FIX void silk_warped_LPC_analysis_filter_FIX( opus_int32 state[], /* I/O State [order + 1] */ opus_int32 res_Q2[], /* O Residual signal [length] */ const opus_int16 coef_Q13[], /* I Coefficients [order] */ const opus_int16 input[], /* I Input signal [length] */ const opus_int16 lambda_Q16, /* I Warping factor */ const opus_int length, /* I Length of input signal */ const opus_int order, /* I Filter order (even) */ int arch ) { opus_int n, i; opus_int32 acc_Q11, acc_Q22, tmp1, tmp2, tmp3, tmp4; opus_int32 state_cur, state_next; (void)arch; /* Order must be even */ /* Length must be even */ silk_assert( ( order & 1 ) == 0 ); silk_assert( ( length & 1 ) == 0 ); for( n = 0; n < length; n+=2 ) { /* Output of lowpass section */ tmp2 = silk_SMLAWB( state[ 0 ], state[ 1 ], lambda_Q16 ); state_cur = silk_LSHIFT( input[ n ], 14 ); /* Output of allpass section */ tmp1 = silk_SMLAWB( state[ 1 ], state[ 2 ] - tmp2, lambda_Q16 ); state_next = tmp2; acc_Q11 = silk_RSHIFT( order, 1 ); acc_Q11 = silk_SMLAWB( acc_Q11, tmp2, coef_Q13[ 0 ] ); /* Output of lowpass section */ tmp4 = silk_SMLAWB( state_cur, state_next, lambda_Q16 ); state[ 0 ] = silk_LSHIFT( input[ n+1 ], 14 ); /* Output of allpass section */ tmp3 = silk_SMLAWB( state_next, tmp1 - tmp4, lambda_Q16 ); state[ 1 ] = tmp4; acc_Q22 = silk_RSHIFT( order, 1 ); acc_Q22 = silk_SMLAWB( acc_Q22, tmp4, coef_Q13[ 0 ] ); /* Loop over allpass sections */ for( i = 2; i < order; i += 2 ) { /* Output of allpass section */ tmp2 = silk_SMLAWB( state[ i ], state[ i + 1 ] - tmp1, lambda_Q16 ); state_cur = tmp1; acc_Q11 = silk_SMLAWB( acc_Q11, tmp1, coef_Q13[ i - 1 ] ); /* Output of allpass section */ tmp1 = silk_SMLAWB( state[ i + 1 ], state[ i + 2 ] - tmp2, lambda_Q16 ); state_next = tmp2; acc_Q11 = silk_SMLAWB( acc_Q11, tmp2, coef_Q13[ i ] ); /* Output of allpass section */ tmp4 = silk_SMLAWB( state_cur, state_next - tmp3, lambda_Q16 ); state[ i ] = tmp3; acc_Q22 = silk_SMLAWB( acc_Q22, tmp3, coef_Q13[ i - 1 ] ); /* Output of allpass section */ tmp3 = silk_SMLAWB( state_next, tmp1 - tmp4, lambda_Q16 ); state[ i + 1 ] = tmp4; acc_Q22 = silk_SMLAWB( acc_Q22, tmp4, coef_Q13[ i ] ); } acc_Q11 = silk_SMLAWB( acc_Q11, tmp1, coef_Q13[ order - 1 ] ); res_Q2[ n ] = silk_LSHIFT( (opus_int32)input[ n ], 2 ) - silk_RSHIFT_ROUND( acc_Q11, 9 ); state[ order ] = tmp3; acc_Q22 = silk_SMLAWB( acc_Q22, tmp3, coef_Q13[ order - 1 ] ); res_Q2[ n+1 ] = silk_LSHIFT( (opus_int32)input[ n+1 ], 2 ) - silk_RSHIFT_ROUND( acc_Q22, 9 ); } } /* Prefilter for finding Quantizer input signal */ #define OVERRIDE_silk_prefilt_FIX static inline void silk_prefilt_FIX( silk_prefilter_state_FIX *P, /* I/O state */ opus_int32 st_res_Q12[], /* I short term residual signal */ opus_int32 xw_Q3[], /* O prefiltered signal */ opus_int32 HarmShapeFIRPacked_Q12, /* I Harmonic shaping coeficients */ opus_int Tilt_Q14, /* I Tilt shaping coeficient */ opus_int32 LF_shp_Q14, /* I Low-frequancy shaping coeficients */ opus_int lag, /* I Lag for harmonic shaping */ opus_int length /* I Length of signals */ ) { opus_int i, idx, LTP_shp_buf_idx; opus_int32 n_LTP_Q12, n_Tilt_Q10, n_LF_Q10; opus_int32 sLF_MA_shp_Q12, sLF_AR_shp_Q12; opus_int16 *LTP_shp_buf; /* To speed up use temp variables instead of using the struct */ LTP_shp_buf = P->sLTP_shp; LTP_shp_buf_idx = P->sLTP_shp_buf_idx; sLF_AR_shp_Q12 = P->sLF_AR_shp_Q12; sLF_MA_shp_Q12 = P->sLF_MA_shp_Q12; if( lag > 0 ) { for( i = 0; i < length; i++ ) { /* unrolled loop */ silk_assert( HARM_SHAPE_FIR_TAPS == 3 ); idx = lag + LTP_shp_buf_idx; n_LTP_Q12 = silk_SMULBB( LTP_shp_buf[ ( idx - HARM_SHAPE_FIR_TAPS / 2 - 1) & LTP_MASK ], HarmShapeFIRPacked_Q12 ); n_LTP_Q12 = silk_SMLABT( n_LTP_Q12, LTP_shp_buf[ ( idx - HARM_SHAPE_FIR_TAPS / 2 ) & LTP_MASK ], HarmShapeFIRPacked_Q12 ); n_LTP_Q12 = silk_SMLABB( n_LTP_Q12, LTP_shp_buf[ ( idx - HARM_SHAPE_FIR_TAPS / 2 + 1) & LTP_MASK ], HarmShapeFIRPacked_Q12 ); n_Tilt_Q10 = silk_SMULWB( sLF_AR_shp_Q12, Tilt_Q14 ); n_LF_Q10 = silk_SMLAWB( silk_SMULWT( sLF_AR_shp_Q12, LF_shp_Q14 ), sLF_MA_shp_Q12, LF_shp_Q14 ); sLF_AR_shp_Q12 = silk_SUB32( st_res_Q12[ i ], silk_LSHIFT( n_Tilt_Q10, 2 ) ); sLF_MA_shp_Q12 = silk_SUB32( sLF_AR_shp_Q12, silk_LSHIFT( n_LF_Q10, 2 ) ); LTP_shp_buf_idx = ( LTP_shp_buf_idx - 1 ) & LTP_MASK; LTP_shp_buf[ LTP_shp_buf_idx ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( sLF_MA_shp_Q12, 12 ) ); xw_Q3[i] = silk_RSHIFT_ROUND( silk_SUB32( sLF_MA_shp_Q12, n_LTP_Q12 ), 9 ); } } else { for( i = 0; i < length; i++ ) { n_LTP_Q12 = 0; n_Tilt_Q10 = silk_SMULWB( sLF_AR_shp_Q12, Tilt_Q14 ); n_LF_Q10 = silk_SMLAWB( silk_SMULWT( sLF_AR_shp_Q12, LF_shp_Q14 ), sLF_MA_shp_Q12, LF_shp_Q14 ); sLF_AR_shp_Q12 = silk_SUB32( st_res_Q12[ i ], silk_LSHIFT( n_Tilt_Q10, 2 ) ); sLF_MA_shp_Q12 = silk_SUB32( sLF_AR_shp_Q12, silk_LSHIFT( n_LF_Q10, 2 ) ); LTP_shp_buf_idx = ( LTP_shp_buf_idx - 1 ) & LTP_MASK; LTP_shp_buf[ LTP_shp_buf_idx ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( sLF_MA_shp_Q12, 12 ) ); xw_Q3[i] = silk_RSHIFT_ROUND( sLF_MA_shp_Q12, 9 ); } } /* Copy temp variable back to state */ P->sLF_AR_shp_Q12 = sLF_AR_shp_Q12; P->sLF_MA_shp_Q12 = sLF_MA_shp_Q12; P->sLTP_shp_buf_idx = LTP_shp_buf_idx; } #endif /* __PREFILTER_FIX_MIPSR1_H__ */ mumble-1.3.4/3rdparty/opus-src/silk/fixed/mips/warped_autocorrelation_FIX_mipsr1.h0000664000175000017500000001750314010707327030131 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef __WARPED_AUTOCORRELATION_FIX_MIPSR1_H__ #define __WARPED_AUTOCORRELATION_FIX_MIPSR1_H__ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main_FIX.h" #undef QC #define QC 10 #undef QS #define QS 14 /* Autocorrelations for a warped frequency axis */ #define OVERRIDE_silk_warped_autocorrelation_FIX void silk_warped_autocorrelation_FIX( opus_int32 *corr, /* O Result [order + 1] */ opus_int *scale, /* O Scaling of the correlation vector */ const opus_int16 *input, /* I Input data to correlate */ const opus_int warping_Q16, /* I Warping coefficient */ const opus_int length, /* I Length of input */ const opus_int order, /* I Correlation order (even) */ int arch /* I Run-time architecture */ ) { opus_int n, i, lsh; opus_int32 tmp1_QS=0, tmp2_QS=0, tmp3_QS=0, tmp4_QS=0, tmp5_QS=0, tmp6_QS=0, tmp7_QS=0, tmp8_QS=0, start_1=0, start_2=0, start_3=0; opus_int32 state_QS[ MAX_SHAPE_LPC_ORDER + 1 ] = { 0 }; opus_int64 corr_QC[ MAX_SHAPE_LPC_ORDER + 1 ] = { 0 }; opus_int64 temp64; opus_int32 val; val = 2 * QS - QC; /* Order must be even */ silk_assert( ( order & 1 ) == 0 ); silk_assert( 2 * QS - QC >= 0 ); /* Loop over samples */ for( n = 0; n < length; n=n+4 ) { tmp1_QS = silk_LSHIFT32( (opus_int32)input[ n ], QS ); start_1 = tmp1_QS; tmp3_QS = silk_LSHIFT32( (opus_int32)input[ n+1], QS ); start_2 = tmp3_QS; tmp5_QS = silk_LSHIFT32( (opus_int32)input[ n+2], QS ); start_3 = tmp5_QS; tmp7_QS = silk_LSHIFT32( (opus_int32)input[ n+3], QS ); /* Loop over allpass sections */ for( i = 0; i < order; i += 2 ) { /* Output of allpass section */ tmp2_QS = silk_SMLAWB( state_QS[ i ], state_QS[ i + 1 ] - tmp1_QS, warping_Q16 ); corr_QC[ i ] = __builtin_mips_madd( corr_QC[ i ], tmp1_QS, start_1); tmp4_QS = silk_SMLAWB( tmp1_QS, tmp2_QS - tmp3_QS, warping_Q16 ); corr_QC[ i ] = __builtin_mips_madd( corr_QC[ i ], tmp3_QS, start_2); tmp6_QS = silk_SMLAWB( tmp3_QS, tmp4_QS - tmp5_QS, warping_Q16 ); corr_QC[ i ] = __builtin_mips_madd( corr_QC[ i ], tmp5_QS, start_3); tmp8_QS = silk_SMLAWB( tmp5_QS, tmp6_QS - tmp7_QS, warping_Q16 ); state_QS[ i ] = tmp7_QS; corr_QC[ i ] = __builtin_mips_madd( corr_QC[ i ], tmp7_QS, state_QS[0]); /* Output of allpass section */ tmp1_QS = silk_SMLAWB( state_QS[ i + 1 ], state_QS[ i + 2 ] - tmp2_QS, warping_Q16 ); corr_QC[ i+1 ] = __builtin_mips_madd( corr_QC[ i+1 ], tmp2_QS, start_1); tmp3_QS = silk_SMLAWB( tmp2_QS, tmp1_QS - tmp4_QS, warping_Q16 ); corr_QC[ i+1 ] = __builtin_mips_madd( corr_QC[ i+1 ], tmp4_QS, start_2); tmp5_QS = silk_SMLAWB( tmp4_QS, tmp3_QS - tmp6_QS, warping_Q16 ); corr_QC[ i+1 ] = __builtin_mips_madd( corr_QC[ i+1 ], tmp6_QS, start_3); tmp7_QS = silk_SMLAWB( tmp6_QS, tmp5_QS - tmp8_QS, warping_Q16 ); state_QS[ i + 1 ] = tmp8_QS; corr_QC[ i+1 ] = __builtin_mips_madd( corr_QC[ i+1 ], tmp8_QS, state_QS[ 0 ]); } state_QS[ order ] = tmp7_QS; corr_QC[ order ] = __builtin_mips_madd( corr_QC[ order ], tmp1_QS, start_1); corr_QC[ order ] = __builtin_mips_madd( corr_QC[ order ], tmp3_QS, start_2); corr_QC[ order ] = __builtin_mips_madd( corr_QC[ order ], tmp5_QS, start_3); corr_QC[ order ] = __builtin_mips_madd( corr_QC[ order ], tmp7_QS, state_QS[ 0 ]); } for(;n< length; n++ ) { tmp1_QS = silk_LSHIFT32( (opus_int32)input[ n ], QS ); /* Loop over allpass sections */ for( i = 0; i < order; i += 2 ) { /* Output of allpass section */ tmp2_QS = silk_SMLAWB( state_QS[ i ], state_QS[ i + 1 ] - tmp1_QS, warping_Q16 ); state_QS[ i ] = tmp1_QS; corr_QC[ i ] = __builtin_mips_madd( corr_QC[ i ], tmp1_QS, state_QS[ 0 ]); /* Output of allpass section */ tmp1_QS = silk_SMLAWB( state_QS[ i + 1 ], state_QS[ i + 2 ] - tmp2_QS, warping_Q16 ); state_QS[ i + 1 ] = tmp2_QS; corr_QC[ i+1 ] = __builtin_mips_madd( corr_QC[ i+1 ], tmp2_QS, state_QS[ 0 ]); } state_QS[ order ] = tmp1_QS; corr_QC[ order ] = __builtin_mips_madd( corr_QC[ order ], tmp1_QS, state_QS[ 0 ]); } temp64 = corr_QC[ 0 ]; temp64 = __builtin_mips_shilo(temp64, val); lsh = silk_CLZ64( temp64 ) - 35; lsh = silk_LIMIT( lsh, -12 - QC, 30 - QC ); *scale = -( QC + lsh ); silk_assert( *scale >= -30 && *scale <= 12 ); if( lsh >= 0 ) { for( i = 0; i < order + 1; i++ ) { temp64 = corr_QC[ i ]; //temp64 = __builtin_mips_shilo(temp64, val); temp64 = (val >= 0) ? (temp64 >> val) : (temp64 << -val); corr[ i ] = (opus_int32)silk_CHECK_FIT32( __builtin_mips_shilo( temp64, -lsh ) ); } } else { for( i = 0; i < order + 1; i++ ) { temp64 = corr_QC[ i ]; //temp64 = __builtin_mips_shilo(temp64, val); temp64 = (val >= 0) ? (temp64 >> val) : (temp64 << -val); corr[ i ] = (opus_int32)silk_CHECK_FIT32( __builtin_mips_shilo( temp64, -lsh ) ); } } corr_QC[ 0 ] = __builtin_mips_shilo(corr_QC[ 0 ], val); silk_assert( corr_QC[ 0 ] >= 0 ); /* If breaking, decrease QC*/ } #endif /* __WARPED_AUTOCORRELATION_FIX_MIPSR1_H__ */ mumble-1.3.4/3rdparty/opus-src/silk/fixed/mips/noise_shape_analysis_FIX_mipsr1.h0000664000175000017500000004521514010707327027556 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ /**************************************************************/ /* Compute noise shaping coefficients and initial gain values */ /**************************************************************/ #define OVERRIDE_silk_noise_shape_analysis_FIX void silk_noise_shape_analysis_FIX( silk_encoder_state_FIX *psEnc, /* I/O Encoder state FIX */ silk_encoder_control_FIX *psEncCtrl, /* I/O Encoder control FIX */ const opus_int16 *pitch_res, /* I LPC residual from pitch analysis */ const opus_int16 *x, /* I Input signal [ frame_length + la_shape ] */ int arch /* I Run-time architecture */ ) { silk_shape_state_FIX *psShapeSt = &psEnc->sShape; opus_int k, i, nSamples, Qnrg, b_Q14, warping_Q16, scale = 0; opus_int32 SNR_adj_dB_Q7, HarmBoost_Q16, HarmShapeGain_Q16, Tilt_Q16, tmp32; opus_int32 nrg, pre_nrg_Q30, log_energy_Q7, log_energy_prev_Q7, energy_variation_Q7; opus_int32 delta_Q16, BWExp1_Q16, BWExp2_Q16, gain_mult_Q16, gain_add_Q16, strength_Q16, b_Q8; opus_int32 auto_corr[ MAX_SHAPE_LPC_ORDER + 1 ]; opus_int32 refl_coef_Q16[ MAX_SHAPE_LPC_ORDER ]; opus_int32 AR1_Q24[ MAX_SHAPE_LPC_ORDER ]; opus_int32 AR2_Q24[ MAX_SHAPE_LPC_ORDER ]; VARDECL( opus_int16, x_windowed ); const opus_int16 *x_ptr, *pitch_res_ptr; SAVE_STACK; /* Point to start of first LPC analysis block */ x_ptr = x - psEnc->sCmn.la_shape; /****************/ /* GAIN CONTROL */ /****************/ SNR_adj_dB_Q7 = psEnc->sCmn.SNR_dB_Q7; /* Input quality is the average of the quality in the lowest two VAD bands */ psEncCtrl->input_quality_Q14 = ( opus_int )silk_RSHIFT( (opus_int32)psEnc->sCmn.input_quality_bands_Q15[ 0 ] + psEnc->sCmn.input_quality_bands_Q15[ 1 ], 2 ); /* Coding quality level, between 0.0_Q0 and 1.0_Q0, but in Q14 */ psEncCtrl->coding_quality_Q14 = silk_RSHIFT( silk_sigm_Q15( silk_RSHIFT_ROUND( SNR_adj_dB_Q7 - SILK_FIX_CONST( 20.0, 7 ), 4 ) ), 1 ); /* Reduce coding SNR during low speech activity */ if( psEnc->sCmn.useCBR == 0 ) { b_Q8 = SILK_FIX_CONST( 1.0, 8 ) - psEnc->sCmn.speech_activity_Q8; b_Q8 = silk_SMULWB( silk_LSHIFT( b_Q8, 8 ), b_Q8 ); SNR_adj_dB_Q7 = silk_SMLAWB( SNR_adj_dB_Q7, silk_SMULBB( SILK_FIX_CONST( -BG_SNR_DECR_dB, 7 ) >> ( 4 + 1 ), b_Q8 ), /* Q11*/ silk_SMULWB( SILK_FIX_CONST( 1.0, 14 ) + psEncCtrl->input_quality_Q14, psEncCtrl->coding_quality_Q14 ) ); /* Q12*/ } if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { /* Reduce gains for periodic signals */ SNR_adj_dB_Q7 = silk_SMLAWB( SNR_adj_dB_Q7, SILK_FIX_CONST( HARM_SNR_INCR_dB, 8 ), psEnc->LTPCorr_Q15 ); } else { /* For unvoiced signals and low-quality input, adjust the quality slower than SNR_dB setting */ SNR_adj_dB_Q7 = silk_SMLAWB( SNR_adj_dB_Q7, silk_SMLAWB( SILK_FIX_CONST( 6.0, 9 ), -SILK_FIX_CONST( 0.4, 18 ), psEnc->sCmn.SNR_dB_Q7 ), SILK_FIX_CONST( 1.0, 14 ) - psEncCtrl->input_quality_Q14 ); } /*************************/ /* SPARSENESS PROCESSING */ /*************************/ /* Set quantizer offset */ if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { /* Initially set to 0; may be overruled in process_gains(..) */ psEnc->sCmn.indices.quantOffsetType = 0; psEncCtrl->sparseness_Q8 = 0; } else { /* Sparseness measure, based on relative fluctuations of energy per 2 milliseconds */ nSamples = silk_LSHIFT( psEnc->sCmn.fs_kHz, 1 ); energy_variation_Q7 = 0; log_energy_prev_Q7 = 0; pitch_res_ptr = pitch_res; for( k = 0; k < silk_SMULBB( SUB_FRAME_LENGTH_MS, psEnc->sCmn.nb_subfr ) / 2; k++ ) { silk_sum_sqr_shift( &nrg, &scale, pitch_res_ptr, nSamples ); nrg += silk_RSHIFT( nSamples, scale ); /* Q(-scale)*/ log_energy_Q7 = silk_lin2log( nrg ); if( k > 0 ) { energy_variation_Q7 += silk_abs( log_energy_Q7 - log_energy_prev_Q7 ); } log_energy_prev_Q7 = log_energy_Q7; pitch_res_ptr += nSamples; } psEncCtrl->sparseness_Q8 = silk_RSHIFT( silk_sigm_Q15( silk_SMULWB( energy_variation_Q7 - SILK_FIX_CONST( 5.0, 7 ), SILK_FIX_CONST( 0.1, 16 ) ) ), 7 ); /* Set quantization offset depending on sparseness measure */ if( psEncCtrl->sparseness_Q8 > SILK_FIX_CONST( SPARSENESS_THRESHOLD_QNT_OFFSET, 8 ) ) { psEnc->sCmn.indices.quantOffsetType = 0; } else { psEnc->sCmn.indices.quantOffsetType = 1; } /* Increase coding SNR for sparse signals */ SNR_adj_dB_Q7 = silk_SMLAWB( SNR_adj_dB_Q7, SILK_FIX_CONST( SPARSE_SNR_INCR_dB, 15 ), psEncCtrl->sparseness_Q8 - SILK_FIX_CONST( 0.5, 8 ) ); } /*******************************/ /* Control bandwidth expansion */ /*******************************/ /* More BWE for signals with high prediction gain */ strength_Q16 = silk_SMULWB( psEncCtrl->predGain_Q16, SILK_FIX_CONST( FIND_PITCH_WHITE_NOISE_FRACTION, 16 ) ); BWExp1_Q16 = BWExp2_Q16 = silk_DIV32_varQ( SILK_FIX_CONST( BANDWIDTH_EXPANSION, 16 ), silk_SMLAWW( SILK_FIX_CONST( 1.0, 16 ), strength_Q16, strength_Q16 ), 16 ); delta_Q16 = silk_SMULWB( SILK_FIX_CONST( 1.0, 16 ) - silk_SMULBB( 3, psEncCtrl->coding_quality_Q14 ), SILK_FIX_CONST( LOW_RATE_BANDWIDTH_EXPANSION_DELTA, 16 ) ); BWExp1_Q16 = silk_SUB32( BWExp1_Q16, delta_Q16 ); BWExp2_Q16 = silk_ADD32( BWExp2_Q16, delta_Q16 ); /* BWExp1 will be applied after BWExp2, so make it relative */ BWExp1_Q16 = silk_DIV32_16( silk_LSHIFT( BWExp1_Q16, 14 ), silk_RSHIFT( BWExp2_Q16, 2 ) ); if( psEnc->sCmn.warping_Q16 > 0 ) { /* Slightly more warping in analysis will move quantization noise up in frequency, where it's better masked */ warping_Q16 = silk_SMLAWB( psEnc->sCmn.warping_Q16, (opus_int32)psEncCtrl->coding_quality_Q14, SILK_FIX_CONST( 0.01, 18 ) ); } else { warping_Q16 = 0; } /********************************************/ /* Compute noise shaping AR coefs and gains */ /********************************************/ ALLOC( x_windowed, psEnc->sCmn.shapeWinLength, opus_int16 ); for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { /* Apply window: sine slope followed by flat part followed by cosine slope */ opus_int shift, slope_part, flat_part; flat_part = psEnc->sCmn.fs_kHz * 3; slope_part = silk_RSHIFT( psEnc->sCmn.shapeWinLength - flat_part, 1 ); silk_apply_sine_window( x_windowed, x_ptr, 1, slope_part ); shift = slope_part; silk_memcpy( x_windowed + shift, x_ptr + shift, flat_part * sizeof(opus_int16) ); shift += flat_part; silk_apply_sine_window( x_windowed + shift, x_ptr + shift, 2, slope_part ); /* Update pointer: next LPC analysis block */ x_ptr += psEnc->sCmn.subfr_length; if( psEnc->sCmn.warping_Q16 > 0 ) { /* Calculate warped auto correlation */ silk_warped_autocorrelation_FIX( auto_corr, &scale, x_windowed, warping_Q16, psEnc->sCmn.shapeWinLength, psEnc->sCmn.shapingLPCOrder, arch ); } else { /* Calculate regular auto correlation */ silk_autocorr( auto_corr, &scale, x_windowed, psEnc->sCmn.shapeWinLength, psEnc->sCmn.shapingLPCOrder + 1, arch ); } /* Add white noise, as a fraction of energy */ auto_corr[0] = silk_ADD32( auto_corr[0], silk_max_32( silk_SMULWB( silk_RSHIFT( auto_corr[ 0 ], 4 ), SILK_FIX_CONST( SHAPE_WHITE_NOISE_FRACTION, 20 ) ), 1 ) ); /* Calculate the reflection coefficients using schur */ nrg = silk_schur64( refl_coef_Q16, auto_corr, psEnc->sCmn.shapingLPCOrder ); silk_assert( nrg >= 0 ); /* Convert reflection coefficients to prediction coefficients */ silk_k2a_Q16( AR2_Q24, refl_coef_Q16, psEnc->sCmn.shapingLPCOrder ); Qnrg = -scale; /* range: -12...30*/ silk_assert( Qnrg >= -12 ); silk_assert( Qnrg <= 30 ); /* Make sure that Qnrg is an even number */ if( Qnrg & 1 ) { Qnrg -= 1; nrg >>= 1; } tmp32 = silk_SQRT_APPROX( nrg ); Qnrg >>= 1; /* range: -6...15*/ psEncCtrl->Gains_Q16[ k ] = (silk_LSHIFT32( silk_LIMIT( (tmp32), silk_RSHIFT32( silk_int32_MIN, (16 - Qnrg) ), \ silk_RSHIFT32( silk_int32_MAX, (16 - Qnrg) ) ), (16 - Qnrg) )); if( psEnc->sCmn.warping_Q16 > 0 ) { /* Adjust gain for warping */ gain_mult_Q16 = warped_gain( AR2_Q24, warping_Q16, psEnc->sCmn.shapingLPCOrder ); silk_assert( psEncCtrl->Gains_Q16[ k ] >= 0 ); if ( silk_SMULWW( silk_RSHIFT_ROUND( psEncCtrl->Gains_Q16[ k ], 1 ), gain_mult_Q16 ) >= ( silk_int32_MAX >> 1 ) ) { psEncCtrl->Gains_Q16[ k ] = silk_int32_MAX; } else { psEncCtrl->Gains_Q16[ k ] = silk_SMULWW( psEncCtrl->Gains_Q16[ k ], gain_mult_Q16 ); } } /* Bandwidth expansion for synthesis filter shaping */ silk_bwexpander_32( AR2_Q24, psEnc->sCmn.shapingLPCOrder, BWExp2_Q16 ); /* Compute noise shaping filter coefficients */ silk_memcpy( AR1_Q24, AR2_Q24, psEnc->sCmn.shapingLPCOrder * sizeof( opus_int32 ) ); /* Bandwidth expansion for analysis filter shaping */ silk_assert( BWExp1_Q16 <= SILK_FIX_CONST( 1.0, 16 ) ); silk_bwexpander_32( AR1_Q24, psEnc->sCmn.shapingLPCOrder, BWExp1_Q16 ); /* Ratio of prediction gains, in energy domain */ pre_nrg_Q30 = silk_LPC_inverse_pred_gain_Q24( AR2_Q24, psEnc->sCmn.shapingLPCOrder, arch ); nrg = silk_LPC_inverse_pred_gain_Q24( AR1_Q24, psEnc->sCmn.shapingLPCOrder, arch ); /*psEncCtrl->GainsPre[ k ] = 1.0f - 0.7f * ( 1.0f - pre_nrg / nrg ) = 0.3f + 0.7f * pre_nrg / nrg;*/ pre_nrg_Q30 = silk_LSHIFT32( silk_SMULWB( pre_nrg_Q30, SILK_FIX_CONST( 0.7, 15 ) ), 1 ); psEncCtrl->GainsPre_Q14[ k ] = ( opus_int ) SILK_FIX_CONST( 0.3, 14 ) + silk_DIV32_varQ( pre_nrg_Q30, nrg, 14 ); /* Convert to monic warped prediction coefficients and limit absolute values */ limit_warped_coefs( AR2_Q24, AR1_Q24, warping_Q16, SILK_FIX_CONST( 3.999, 24 ), psEnc->sCmn.shapingLPCOrder ); /* Convert from Q24 to Q13 and store in int16 */ for( i = 0; i < psEnc->sCmn.shapingLPCOrder; i++ ) { psEncCtrl->AR1_Q13[ k * MAX_SHAPE_LPC_ORDER + i ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( AR1_Q24[ i ], 11 ) ); psEncCtrl->AR2_Q13[ k * MAX_SHAPE_LPC_ORDER + i ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( AR2_Q24[ i ], 11 ) ); } } /*****************/ /* Gain tweaking */ /*****************/ /* Increase gains during low speech activity and put lower limit on gains */ gain_mult_Q16 = silk_log2lin( -silk_SMLAWB( -SILK_FIX_CONST( 16.0, 7 ), SNR_adj_dB_Q7, SILK_FIX_CONST( 0.16, 16 ) ) ); gain_add_Q16 = silk_log2lin( silk_SMLAWB( SILK_FIX_CONST( 16.0, 7 ), SILK_FIX_CONST( MIN_QGAIN_DB, 7 ), SILK_FIX_CONST( 0.16, 16 ) ) ); silk_assert( gain_mult_Q16 > 0 ); for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { psEncCtrl->Gains_Q16[ k ] = silk_SMULWW( psEncCtrl->Gains_Q16[ k ], gain_mult_Q16 ); silk_assert( psEncCtrl->Gains_Q16[ k ] >= 0 ); psEncCtrl->Gains_Q16[ k ] = silk_ADD_POS_SAT32( psEncCtrl->Gains_Q16[ k ], gain_add_Q16 ); } gain_mult_Q16 = SILK_FIX_CONST( 1.0, 16 ) + silk_RSHIFT_ROUND( silk_MLA( SILK_FIX_CONST( INPUT_TILT, 26 ), psEncCtrl->coding_quality_Q14, SILK_FIX_CONST( HIGH_RATE_INPUT_TILT, 12 ) ), 10 ); for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { psEncCtrl->GainsPre_Q14[ k ] = silk_SMULWB( gain_mult_Q16, psEncCtrl->GainsPre_Q14[ k ] ); } /************************************************/ /* Control low-frequency shaping and noise tilt */ /************************************************/ /* Less low frequency shaping for noisy inputs */ strength_Q16 = silk_MUL( SILK_FIX_CONST( LOW_FREQ_SHAPING, 4 ), silk_SMLAWB( SILK_FIX_CONST( 1.0, 12 ), SILK_FIX_CONST( LOW_QUALITY_LOW_FREQ_SHAPING_DECR, 13 ), psEnc->sCmn.input_quality_bands_Q15[ 0 ] - SILK_FIX_CONST( 1.0, 15 ) ) ); strength_Q16 = silk_RSHIFT( silk_MUL( strength_Q16, psEnc->sCmn.speech_activity_Q8 ), 8 ); if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { /* Reduce low frequencies quantization noise for periodic signals, depending on pitch lag */ /*f = 400; freqz([1, -0.98 + 2e-4 * f], [1, -0.97 + 7e-4 * f], 2^12, Fs); axis([0, 1000, -10, 1])*/ opus_int fs_kHz_inv = silk_DIV32_16( SILK_FIX_CONST( 0.2, 14 ), psEnc->sCmn.fs_kHz ); for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { b_Q14 = fs_kHz_inv + silk_DIV32_16( SILK_FIX_CONST( 3.0, 14 ), psEncCtrl->pitchL[ k ] ); /* Pack two coefficients in one int32 */ psEncCtrl->LF_shp_Q14[ k ] = silk_LSHIFT( SILK_FIX_CONST( 1.0, 14 ) - b_Q14 - silk_SMULWB( strength_Q16, b_Q14 ), 16 ); psEncCtrl->LF_shp_Q14[ k ] |= (opus_uint16)( b_Q14 - SILK_FIX_CONST( 1.0, 14 ) ); } silk_assert( SILK_FIX_CONST( HARM_HP_NOISE_COEF, 24 ) < SILK_FIX_CONST( 0.5, 24 ) ); /* Guarantees that second argument to SMULWB() is within range of an opus_int16*/ Tilt_Q16 = - SILK_FIX_CONST( HP_NOISE_COEF, 16 ) - silk_SMULWB( SILK_FIX_CONST( 1.0, 16 ) - SILK_FIX_CONST( HP_NOISE_COEF, 16 ), silk_SMULWB( SILK_FIX_CONST( HARM_HP_NOISE_COEF, 24 ), psEnc->sCmn.speech_activity_Q8 ) ); } else { b_Q14 = silk_DIV32_16( 21299, psEnc->sCmn.fs_kHz ); /* 1.3_Q0 = 21299_Q14*/ /* Pack two coefficients in one int32 */ psEncCtrl->LF_shp_Q14[ 0 ] = silk_LSHIFT( SILK_FIX_CONST( 1.0, 14 ) - b_Q14 - silk_SMULWB( strength_Q16, silk_SMULWB( SILK_FIX_CONST( 0.6, 16 ), b_Q14 ) ), 16 ); psEncCtrl->LF_shp_Q14[ 0 ] |= (opus_uint16)( b_Q14 - SILK_FIX_CONST( 1.0, 14 ) ); for( k = 1; k < psEnc->sCmn.nb_subfr; k++ ) { psEncCtrl->LF_shp_Q14[ k ] = psEncCtrl->LF_shp_Q14[ 0 ]; } Tilt_Q16 = -SILK_FIX_CONST( HP_NOISE_COEF, 16 ); } /****************************/ /* HARMONIC SHAPING CONTROL */ /****************************/ /* Control boosting of harmonic frequencies */ HarmBoost_Q16 = silk_SMULWB( silk_SMULWB( SILK_FIX_CONST( 1.0, 17 ) - silk_LSHIFT( psEncCtrl->coding_quality_Q14, 3 ), psEnc->LTPCorr_Q15 ), SILK_FIX_CONST( LOW_RATE_HARMONIC_BOOST, 16 ) ); /* More harmonic boost for noisy input signals */ HarmBoost_Q16 = silk_SMLAWB( HarmBoost_Q16, SILK_FIX_CONST( 1.0, 16 ) - silk_LSHIFT( psEncCtrl->input_quality_Q14, 2 ), SILK_FIX_CONST( LOW_INPUT_QUALITY_HARMONIC_BOOST, 16 ) ); if( USE_HARM_SHAPING && psEnc->sCmn.indices.signalType == TYPE_VOICED ) { /* More harmonic noise shaping for high bitrates or noisy input */ HarmShapeGain_Q16 = silk_SMLAWB( SILK_FIX_CONST( HARMONIC_SHAPING, 16 ), SILK_FIX_CONST( 1.0, 16 ) - silk_SMULWB( SILK_FIX_CONST( 1.0, 18 ) - silk_LSHIFT( psEncCtrl->coding_quality_Q14, 4 ), psEncCtrl->input_quality_Q14 ), SILK_FIX_CONST( HIGH_RATE_OR_LOW_QUALITY_HARMONIC_SHAPING, 16 ) ); /* Less harmonic noise shaping for less periodic signals */ HarmShapeGain_Q16 = silk_SMULWB( silk_LSHIFT( HarmShapeGain_Q16, 1 ), silk_SQRT_APPROX( silk_LSHIFT( psEnc->LTPCorr_Q15, 15 ) ) ); } else { HarmShapeGain_Q16 = 0; } /*************************/ /* Smooth over subframes */ /*************************/ for( k = 0; k < MAX_NB_SUBFR; k++ ) { psShapeSt->HarmBoost_smth_Q16 = silk_SMLAWB( psShapeSt->HarmBoost_smth_Q16, HarmBoost_Q16 - psShapeSt->HarmBoost_smth_Q16, SILK_FIX_CONST( SUBFR_SMTH_COEF, 16 ) ); psShapeSt->HarmShapeGain_smth_Q16 = silk_SMLAWB( psShapeSt->HarmShapeGain_smth_Q16, HarmShapeGain_Q16 - psShapeSt->HarmShapeGain_smth_Q16, SILK_FIX_CONST( SUBFR_SMTH_COEF, 16 ) ); psShapeSt->Tilt_smth_Q16 = silk_SMLAWB( psShapeSt->Tilt_smth_Q16, Tilt_Q16 - psShapeSt->Tilt_smth_Q16, SILK_FIX_CONST( SUBFR_SMTH_COEF, 16 ) ); psEncCtrl->HarmBoost_Q14[ k ] = ( opus_int )silk_RSHIFT_ROUND( psShapeSt->HarmBoost_smth_Q16, 2 ); psEncCtrl->HarmShapeGain_Q14[ k ] = ( opus_int )silk_RSHIFT_ROUND( psShapeSt->HarmShapeGain_smth_Q16, 2 ); psEncCtrl->Tilt_Q14[ k ] = ( opus_int )silk_RSHIFT_ROUND( psShapeSt->Tilt_smth_Q16, 2 ); } RESTORE_STACK; } mumble-1.3.4/3rdparty/opus-src/silk/fixed/find_LTP_FIX.c0000664000175000017500000001245614010707327022546 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main_FIX.h" #include "tuning_parameters.h" void silk_find_LTP_FIX( opus_int32 XXLTP_Q17[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* O Correlation matrix */ opus_int32 xXLTP_Q17[ MAX_NB_SUBFR * LTP_ORDER ], /* O Correlation vector */ const opus_int16 r_ptr[], /* I Residual signal after LPC */ const opus_int lag[ MAX_NB_SUBFR ], /* I LTP lags */ const opus_int subfr_length, /* I Subframe length */ const opus_int nb_subfr, /* I Number of subframes */ int arch /* I Run-time architecture */ ) { opus_int i, k, extra_shifts; opus_int xx_shifts, xX_shifts, XX_shifts; const opus_int16 *lag_ptr; opus_int32 *XXLTP_Q17_ptr, *xXLTP_Q17_ptr; opus_int32 xx, nrg, temp; xXLTP_Q17_ptr = xXLTP_Q17; XXLTP_Q17_ptr = XXLTP_Q17; for( k = 0; k < nb_subfr; k++ ) { lag_ptr = r_ptr - ( lag[ k ] + LTP_ORDER / 2 ); silk_sum_sqr_shift( &xx, &xx_shifts, r_ptr, subfr_length + LTP_ORDER ); /* xx in Q( -xx_shifts ) */ silk_corrMatrix_FIX( lag_ptr, subfr_length, LTP_ORDER, XXLTP_Q17_ptr, &nrg, &XX_shifts, arch ); /* XXLTP_Q17_ptr and nrg in Q( -XX_shifts ) */ extra_shifts = xx_shifts - XX_shifts; if( extra_shifts > 0 ) { /* Shift XX */ xX_shifts = xx_shifts; for( i = 0; i < LTP_ORDER * LTP_ORDER; i++ ) { XXLTP_Q17_ptr[ i ] = silk_RSHIFT32( XXLTP_Q17_ptr[ i ], extra_shifts ); /* Q( -xX_shifts ) */ } nrg = silk_RSHIFT32( nrg, extra_shifts ); /* Q( -xX_shifts ) */ } else if( extra_shifts < 0 ) { /* Shift xx */ xX_shifts = XX_shifts; xx = silk_RSHIFT32( xx, -extra_shifts ); /* Q( -xX_shifts ) */ } else { xX_shifts = xx_shifts; } silk_corrVector_FIX( lag_ptr, r_ptr, subfr_length, LTP_ORDER, xXLTP_Q17_ptr, xX_shifts, arch ); /* xXLTP_Q17_ptr in Q( -xX_shifts ) */ /* At this point all correlations are in Q(-xX_shifts) */ temp = silk_SMLAWB( 1, nrg, SILK_FIX_CONST( LTP_CORR_INV_MAX, 16 ) ); temp = silk_max( temp, xx ); TIC(div) #if 0 for( i = 0; i < LTP_ORDER * LTP_ORDER; i++ ) { XXLTP_Q17_ptr[ i ] = silk_DIV32_varQ( XXLTP_Q17_ptr[ i ], temp, 17 ); } for( i = 0; i < LTP_ORDER; i++ ) { xXLTP_Q17_ptr[ i ] = silk_DIV32_varQ( xXLTP_Q17_ptr[ i ], temp, 17 ); } #else for( i = 0; i < LTP_ORDER * LTP_ORDER; i++ ) { XXLTP_Q17_ptr[ i ] = (opus_int32)( silk_LSHIFT64( (opus_int64)XXLTP_Q17_ptr[ i ], 17 ) / temp ); } for( i = 0; i < LTP_ORDER; i++ ) { xXLTP_Q17_ptr[ i ] = (opus_int32)( silk_LSHIFT64( (opus_int64)xXLTP_Q17_ptr[ i ], 17 ) / temp ); } #endif TOC(div) r_ptr += subfr_length; XXLTP_Q17_ptr += LTP_ORDER * LTP_ORDER; xXLTP_Q17_ptr += LTP_ORDER; } } mumble-1.3.4/3rdparty/opus-src/silk/fixed/encode_frame_FIX.c0000664000175000017500000005564214010707327023522 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "main_FIX.h" #include "stack_alloc.h" #include "tuning_parameters.h" /* Low Bitrate Redundancy (LBRR) encoding. Reuse all parameters but encode with lower bitrate */ static OPUS_INLINE void silk_LBRR_encode_FIX( silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk FIX encoder state */ silk_encoder_control_FIX *psEncCtrl, /* I/O Pointer to Silk FIX encoder control struct */ const opus_int16 x16[], /* I Input signal */ opus_int condCoding /* I The type of conditional coding used so far for this frame */ ); void silk_encode_do_VAD_FIX( silk_encoder_state_FIX *psEnc /* I/O Pointer to Silk FIX encoder state */ ) { /****************************/ /* Voice Activity Detection */ /****************************/ silk_VAD_GetSA_Q8( &psEnc->sCmn, psEnc->sCmn.inputBuf + 1, psEnc->sCmn.arch ); /**************************************************/ /* Convert speech activity into VAD and DTX flags */ /**************************************************/ if( psEnc->sCmn.speech_activity_Q8 < SILK_FIX_CONST( SPEECH_ACTIVITY_DTX_THRES, 8 ) ) { psEnc->sCmn.indices.signalType = TYPE_NO_VOICE_ACTIVITY; psEnc->sCmn.noSpeechCounter++; if( psEnc->sCmn.noSpeechCounter < NB_SPEECH_FRAMES_BEFORE_DTX ) { psEnc->sCmn.inDTX = 0; } else if( psEnc->sCmn.noSpeechCounter > MAX_CONSECUTIVE_DTX + NB_SPEECH_FRAMES_BEFORE_DTX ) { psEnc->sCmn.noSpeechCounter = NB_SPEECH_FRAMES_BEFORE_DTX; psEnc->sCmn.inDTX = 0; } psEnc->sCmn.VAD_flags[ psEnc->sCmn.nFramesEncoded ] = 0; } else { psEnc->sCmn.noSpeechCounter = 0; psEnc->sCmn.inDTX = 0; psEnc->sCmn.indices.signalType = TYPE_UNVOICED; psEnc->sCmn.VAD_flags[ psEnc->sCmn.nFramesEncoded ] = 1; } } /****************/ /* Encode frame */ /****************/ opus_int silk_encode_frame_FIX( silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk FIX encoder state */ opus_int32 *pnBytesOut, /* O Pointer to number of payload bytes; */ ec_enc *psRangeEnc, /* I/O compressor data structure */ opus_int condCoding, /* I The type of conditional coding to use */ opus_int maxBits, /* I If > 0: maximum number of output bits */ opus_int useCBR /* I Flag to force constant-bitrate operation */ ) { silk_encoder_control_FIX sEncCtrl; opus_int i, iter, maxIter, found_upper, found_lower, ret = 0; opus_int16 *x_frame; ec_enc sRangeEnc_copy, sRangeEnc_copy2; silk_nsq_state sNSQ_copy, sNSQ_copy2; opus_int32 seed_copy, nBits, nBits_lower, nBits_upper, gainMult_lower, gainMult_upper; opus_int32 gainsID, gainsID_lower, gainsID_upper; opus_int16 gainMult_Q8; opus_int16 ec_prevLagIndex_copy; opus_int ec_prevSignalType_copy; opus_int8 LastGainIndex_copy2; opus_int gain_lock[ MAX_NB_SUBFR ] = {0}; opus_int16 best_gain_mult[ MAX_NB_SUBFR ]; opus_int best_sum[ MAX_NB_SUBFR ]; SAVE_STACK; /* This is totally unnecessary but many compilers (including gcc) are too dumb to realise it */ LastGainIndex_copy2 = nBits_lower = nBits_upper = gainMult_lower = gainMult_upper = 0; psEnc->sCmn.indices.Seed = psEnc->sCmn.frameCounter++ & 3; /**************************************************************/ /* Set up Input Pointers, and insert frame in input buffer */ /*************************************************************/ /* start of frame to encode */ x_frame = psEnc->x_buf + psEnc->sCmn.ltp_mem_length; /***************************************/ /* Ensure smooth bandwidth transitions */ /***************************************/ silk_LP_variable_cutoff( &psEnc->sCmn.sLP, psEnc->sCmn.inputBuf + 1, psEnc->sCmn.frame_length ); /*******************************************/ /* Copy new frame to front of input buffer */ /*******************************************/ silk_memcpy( x_frame + LA_SHAPE_MS * psEnc->sCmn.fs_kHz, psEnc->sCmn.inputBuf + 1, psEnc->sCmn.frame_length * sizeof( opus_int16 ) ); if( !psEnc->sCmn.prefillFlag ) { VARDECL( opus_int16, res_pitch ); VARDECL( opus_uint8, ec_buf_copy ); opus_int16 *res_pitch_frame; ALLOC( res_pitch, psEnc->sCmn.la_pitch + psEnc->sCmn.frame_length + psEnc->sCmn.ltp_mem_length, opus_int16 ); /* start of pitch LPC residual frame */ res_pitch_frame = res_pitch + psEnc->sCmn.ltp_mem_length; /*****************************************/ /* Find pitch lags, initial LPC analysis */ /*****************************************/ silk_find_pitch_lags_FIX( psEnc, &sEncCtrl, res_pitch, x_frame - psEnc->sCmn.ltp_mem_length, psEnc->sCmn.arch ); /************************/ /* Noise shape analysis */ /************************/ silk_noise_shape_analysis_FIX( psEnc, &sEncCtrl, res_pitch_frame, x_frame, psEnc->sCmn.arch ); /***************************************************/ /* Find linear prediction coefficients (LPC + LTP) */ /***************************************************/ silk_find_pred_coefs_FIX( psEnc, &sEncCtrl, res_pitch_frame, x_frame, condCoding ); /****************************************/ /* Process gains */ /****************************************/ silk_process_gains_FIX( psEnc, &sEncCtrl, condCoding ); /****************************************/ /* Low Bitrate Redundant Encoding */ /****************************************/ silk_LBRR_encode_FIX( psEnc, &sEncCtrl, x_frame, condCoding ); /* Loop over quantizer and entropy coding to control bitrate */ maxIter = 6; gainMult_Q8 = SILK_FIX_CONST( 1, 8 ); found_lower = 0; found_upper = 0; gainsID = silk_gains_ID( psEnc->sCmn.indices.GainsIndices, psEnc->sCmn.nb_subfr ); gainsID_lower = -1; gainsID_upper = -1; /* Copy part of the input state */ silk_memcpy( &sRangeEnc_copy, psRangeEnc, sizeof( ec_enc ) ); silk_memcpy( &sNSQ_copy, &psEnc->sCmn.sNSQ, sizeof( silk_nsq_state ) ); seed_copy = psEnc->sCmn.indices.Seed; ec_prevLagIndex_copy = psEnc->sCmn.ec_prevLagIndex; ec_prevSignalType_copy = psEnc->sCmn.ec_prevSignalType; ALLOC( ec_buf_copy, 1275, opus_uint8 ); for( iter = 0; ; iter++ ) { if( gainsID == gainsID_lower ) { nBits = nBits_lower; } else if( gainsID == gainsID_upper ) { nBits = nBits_upper; } else { /* Restore part of the input state */ if( iter > 0 ) { silk_memcpy( psRangeEnc, &sRangeEnc_copy, sizeof( ec_enc ) ); silk_memcpy( &psEnc->sCmn.sNSQ, &sNSQ_copy, sizeof( silk_nsq_state ) ); psEnc->sCmn.indices.Seed = seed_copy; psEnc->sCmn.ec_prevLagIndex = ec_prevLagIndex_copy; psEnc->sCmn.ec_prevSignalType = ec_prevSignalType_copy; } /*****************************************/ /* Noise shaping quantization */ /*****************************************/ if( psEnc->sCmn.nStatesDelayedDecision > 1 || psEnc->sCmn.warping_Q16 > 0 ) { silk_NSQ_del_dec( &psEnc->sCmn, &psEnc->sCmn.sNSQ, &psEnc->sCmn.indices, x_frame, psEnc->sCmn.pulses, sEncCtrl.PredCoef_Q12[ 0 ], sEncCtrl.LTPCoef_Q14, sEncCtrl.AR_Q13, sEncCtrl.HarmShapeGain_Q14, sEncCtrl.Tilt_Q14, sEncCtrl.LF_shp_Q14, sEncCtrl.Gains_Q16, sEncCtrl.pitchL, sEncCtrl.Lambda_Q10, sEncCtrl.LTP_scale_Q14, psEnc->sCmn.arch ); } else { silk_NSQ( &psEnc->sCmn, &psEnc->sCmn.sNSQ, &psEnc->sCmn.indices, x_frame, psEnc->sCmn.pulses, sEncCtrl.PredCoef_Q12[ 0 ], sEncCtrl.LTPCoef_Q14, sEncCtrl.AR_Q13, sEncCtrl.HarmShapeGain_Q14, sEncCtrl.Tilt_Q14, sEncCtrl.LF_shp_Q14, sEncCtrl.Gains_Q16, sEncCtrl.pitchL, sEncCtrl.Lambda_Q10, sEncCtrl.LTP_scale_Q14, psEnc->sCmn.arch); } if ( iter == maxIter && !found_lower ) { silk_memcpy( &sRangeEnc_copy2, psRangeEnc, sizeof( ec_enc ) ); } /****************************************/ /* Encode Parameters */ /****************************************/ silk_encode_indices( &psEnc->sCmn, psRangeEnc, psEnc->sCmn.nFramesEncoded, 0, condCoding ); /****************************************/ /* Encode Excitation Signal */ /****************************************/ silk_encode_pulses( psRangeEnc, psEnc->sCmn.indices.signalType, psEnc->sCmn.indices.quantOffsetType, psEnc->sCmn.pulses, psEnc->sCmn.frame_length ); nBits = ec_tell( psRangeEnc ); /* If we still bust after the last iteration, do some damage control. */ if ( iter == maxIter && !found_lower && nBits > maxBits ) { silk_memcpy( psRangeEnc, &sRangeEnc_copy2, sizeof( ec_enc ) ); /* Keep gains the same as the last frame. */ psEnc->sShape.LastGainIndex = sEncCtrl.lastGainIndexPrev; for ( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { psEnc->sCmn.indices.GainsIndices[ i ] = 4; } if (condCoding != CODE_CONDITIONALLY) { psEnc->sCmn.indices.GainsIndices[ 0 ] = sEncCtrl.lastGainIndexPrev; } psEnc->sCmn.ec_prevLagIndex = ec_prevLagIndex_copy; psEnc->sCmn.ec_prevSignalType = ec_prevSignalType_copy; /* Clear all pulses. */ for ( i = 0; i < psEnc->sCmn.frame_length; i++ ) { psEnc->sCmn.pulses[ i ] = 0; } silk_encode_indices( &psEnc->sCmn, psRangeEnc, psEnc->sCmn.nFramesEncoded, 0, condCoding ); silk_encode_pulses( psRangeEnc, psEnc->sCmn.indices.signalType, psEnc->sCmn.indices.quantOffsetType, psEnc->sCmn.pulses, psEnc->sCmn.frame_length ); nBits = ec_tell( psRangeEnc ); } if( useCBR == 0 && iter == 0 && nBits <= maxBits ) { break; } } if( iter == maxIter ) { if( found_lower && ( gainsID == gainsID_lower || nBits > maxBits ) ) { /* Restore output state from earlier iteration that did meet the bitrate budget */ silk_memcpy( psRangeEnc, &sRangeEnc_copy2, sizeof( ec_enc ) ); silk_assert( sRangeEnc_copy2.offs <= 1275 ); silk_memcpy( psRangeEnc->buf, ec_buf_copy, sRangeEnc_copy2.offs ); silk_memcpy( &psEnc->sCmn.sNSQ, &sNSQ_copy2, sizeof( silk_nsq_state ) ); psEnc->sShape.LastGainIndex = LastGainIndex_copy2; } break; } if( nBits > maxBits ) { if( found_lower == 0 && iter >= 2 ) { /* Adjust the quantizer's rate/distortion tradeoff and discard previous "upper" results */ sEncCtrl.Lambda_Q10 = silk_ADD_RSHIFT32( sEncCtrl.Lambda_Q10, sEncCtrl.Lambda_Q10, 1 ); found_upper = 0; gainsID_upper = -1; } else { found_upper = 1; nBits_upper = nBits; gainMult_upper = gainMult_Q8; gainsID_upper = gainsID; } } else if( nBits < maxBits - 5 ) { found_lower = 1; nBits_lower = nBits; gainMult_lower = gainMult_Q8; if( gainsID != gainsID_lower ) { gainsID_lower = gainsID; /* Copy part of the output state */ silk_memcpy( &sRangeEnc_copy2, psRangeEnc, sizeof( ec_enc ) ); silk_assert( psRangeEnc->offs <= 1275 ); silk_memcpy( ec_buf_copy, psRangeEnc->buf, psRangeEnc->offs ); silk_memcpy( &sNSQ_copy2, &psEnc->sCmn.sNSQ, sizeof( silk_nsq_state ) ); LastGainIndex_copy2 = psEnc->sShape.LastGainIndex; } } else { /* Within 5 bits of budget: close enough */ break; } if ( !found_lower && nBits > maxBits ) { int j; for ( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { int sum=0; for ( j = i*psEnc->sCmn.subfr_length; j < (i+1)*psEnc->sCmn.subfr_length; j++ ) { sum += abs( psEnc->sCmn.pulses[j] ); } if ( iter == 0 || (sum < best_sum[i] && !gain_lock[i]) ) { best_sum[i] = sum; best_gain_mult[i] = gainMult_Q8; } else { gain_lock[i] = 1; } } } if( ( found_lower & found_upper ) == 0 ) { /* Adjust gain according to high-rate rate/distortion curve */ if( nBits > maxBits ) { if (gainMult_Q8 < 16384) { gainMult_Q8 *= 2; } else { gainMult_Q8 = 32767; } } else { opus_int32 gain_factor_Q16; gain_factor_Q16 = silk_log2lin( silk_LSHIFT( nBits - maxBits, 7 ) / psEnc->sCmn.frame_length + SILK_FIX_CONST( 16, 7 ) ); gainMult_Q8 = silk_SMULWB( gain_factor_Q16, gainMult_Q8 ); } } else { /* Adjust gain by interpolating */ gainMult_Q8 = gainMult_lower + silk_DIV32_16( silk_MUL( gainMult_upper - gainMult_lower, maxBits - nBits_lower ), nBits_upper - nBits_lower ); /* New gain multplier must be between 25% and 75% of old range (note that gainMult_upper < gainMult_lower) */ if( gainMult_Q8 > silk_ADD_RSHIFT32( gainMult_lower, gainMult_upper - gainMult_lower, 2 ) ) { gainMult_Q8 = silk_ADD_RSHIFT32( gainMult_lower, gainMult_upper - gainMult_lower, 2 ); } else if( gainMult_Q8 < silk_SUB_RSHIFT32( gainMult_upper, gainMult_upper - gainMult_lower, 2 ) ) { gainMult_Q8 = silk_SUB_RSHIFT32( gainMult_upper, gainMult_upper - gainMult_lower, 2 ); } } for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { opus_int16 tmp; if ( gain_lock[i] ) { tmp = best_gain_mult[i]; } else { tmp = gainMult_Q8; } sEncCtrl.Gains_Q16[ i ] = silk_LSHIFT_SAT32( silk_SMULWB( sEncCtrl.GainsUnq_Q16[ i ], tmp ), 8 ); } /* Quantize gains */ psEnc->sShape.LastGainIndex = sEncCtrl.lastGainIndexPrev; silk_gains_quant( psEnc->sCmn.indices.GainsIndices, sEncCtrl.Gains_Q16, &psEnc->sShape.LastGainIndex, condCoding == CODE_CONDITIONALLY, psEnc->sCmn.nb_subfr ); /* Unique identifier of gains vector */ gainsID = silk_gains_ID( psEnc->sCmn.indices.GainsIndices, psEnc->sCmn.nb_subfr ); } } /* Update input buffer */ silk_memmove( psEnc->x_buf, &psEnc->x_buf[ psEnc->sCmn.frame_length ], ( psEnc->sCmn.ltp_mem_length + LA_SHAPE_MS * psEnc->sCmn.fs_kHz ) * sizeof( opus_int16 ) ); /* Exit without entropy coding */ if( psEnc->sCmn.prefillFlag ) { /* No payload */ *pnBytesOut = 0; RESTORE_STACK; return ret; } /* Parameters needed for next frame */ psEnc->sCmn.prevLag = sEncCtrl.pitchL[ psEnc->sCmn.nb_subfr - 1 ]; psEnc->sCmn.prevSignalType = psEnc->sCmn.indices.signalType; /****************************************/ /* Finalize payload */ /****************************************/ psEnc->sCmn.first_frame_after_reset = 0; /* Payload size */ *pnBytesOut = silk_RSHIFT( ec_tell( psRangeEnc ) + 7, 3 ); RESTORE_STACK; return ret; } /* Low-Bitrate Redundancy (LBRR) encoding. Reuse all parameters but encode excitation at lower bitrate */ static OPUS_INLINE void silk_LBRR_encode_FIX( silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk FIX encoder state */ silk_encoder_control_FIX *psEncCtrl, /* I/O Pointer to Silk FIX encoder control struct */ const opus_int16 x16[], /* I Input signal */ opus_int condCoding /* I The type of conditional coding used so far for this frame */ ) { opus_int32 TempGains_Q16[ MAX_NB_SUBFR ]; SideInfoIndices *psIndices_LBRR = &psEnc->sCmn.indices_LBRR[ psEnc->sCmn.nFramesEncoded ]; silk_nsq_state sNSQ_LBRR; /*******************************************/ /* Control use of inband LBRR */ /*******************************************/ if( psEnc->sCmn.LBRR_enabled && psEnc->sCmn.speech_activity_Q8 > SILK_FIX_CONST( LBRR_SPEECH_ACTIVITY_THRES, 8 ) ) { psEnc->sCmn.LBRR_flags[ psEnc->sCmn.nFramesEncoded ] = 1; /* Copy noise shaping quantizer state and quantization indices from regular encoding */ silk_memcpy( &sNSQ_LBRR, &psEnc->sCmn.sNSQ, sizeof( silk_nsq_state ) ); silk_memcpy( psIndices_LBRR, &psEnc->sCmn.indices, sizeof( SideInfoIndices ) ); /* Save original gains */ silk_memcpy( TempGains_Q16, psEncCtrl->Gains_Q16, psEnc->sCmn.nb_subfr * sizeof( opus_int32 ) ); if( psEnc->sCmn.nFramesEncoded == 0 || psEnc->sCmn.LBRR_flags[ psEnc->sCmn.nFramesEncoded - 1 ] == 0 ) { /* First frame in packet or previous frame not LBRR coded */ psEnc->sCmn.LBRRprevLastGainIndex = psEnc->sShape.LastGainIndex; /* Increase Gains to get target LBRR rate */ psIndices_LBRR->GainsIndices[ 0 ] = psIndices_LBRR->GainsIndices[ 0 ] + psEnc->sCmn.LBRR_GainIncreases; psIndices_LBRR->GainsIndices[ 0 ] = silk_min_int( psIndices_LBRR->GainsIndices[ 0 ], N_LEVELS_QGAIN - 1 ); } /* Decode to get gains in sync with decoder */ /* Overwrite unquantized gains with quantized gains */ silk_gains_dequant( psEncCtrl->Gains_Q16, psIndices_LBRR->GainsIndices, &psEnc->sCmn.LBRRprevLastGainIndex, condCoding == CODE_CONDITIONALLY, psEnc->sCmn.nb_subfr ); /*****************************************/ /* Noise shaping quantization */ /*****************************************/ if( psEnc->sCmn.nStatesDelayedDecision > 1 || psEnc->sCmn.warping_Q16 > 0 ) { silk_NSQ_del_dec( &psEnc->sCmn, &sNSQ_LBRR, psIndices_LBRR, x16, psEnc->sCmn.pulses_LBRR[ psEnc->sCmn.nFramesEncoded ], psEncCtrl->PredCoef_Q12[ 0 ], psEncCtrl->LTPCoef_Q14, psEncCtrl->AR_Q13, psEncCtrl->HarmShapeGain_Q14, psEncCtrl->Tilt_Q14, psEncCtrl->LF_shp_Q14, psEncCtrl->Gains_Q16, psEncCtrl->pitchL, psEncCtrl->Lambda_Q10, psEncCtrl->LTP_scale_Q14, psEnc->sCmn.arch ); } else { silk_NSQ( &psEnc->sCmn, &sNSQ_LBRR, psIndices_LBRR, x16, psEnc->sCmn.pulses_LBRR[ psEnc->sCmn.nFramesEncoded ], psEncCtrl->PredCoef_Q12[ 0 ], psEncCtrl->LTPCoef_Q14, psEncCtrl->AR_Q13, psEncCtrl->HarmShapeGain_Q14, psEncCtrl->Tilt_Q14, psEncCtrl->LF_shp_Q14, psEncCtrl->Gains_Q16, psEncCtrl->pitchL, psEncCtrl->Lambda_Q10, psEncCtrl->LTP_scale_Q14, psEnc->sCmn.arch ); } /* Restore original gains */ silk_memcpy( psEncCtrl->Gains_Q16, TempGains_Q16, psEnc->sCmn.nb_subfr * sizeof( opus_int32 ) ); } } mumble-1.3.4/3rdparty/opus-src/silk/fixed/main_FIX.h0000664000175000017500000004515414010707327022041 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef SILK_MAIN_FIX_H #define SILK_MAIN_FIX_H #include "SigProc_FIX.h" #include "structs_FIX.h" #include "control.h" #include "main.h" #include "PLC.h" #include "debug.h" #include "entenc.h" #if ((defined(OPUS_ARM_ASM) && defined(FIXED_POINT)) \ || defined(OPUS_ARM_MAY_HAVE_NEON_INTR)) #include "fixed/arm/warped_autocorrelation_FIX_arm.h" #endif #ifndef FORCE_CPP_BUILD #ifdef __cplusplus extern "C" { #endif #endif #define silk_encoder_state_Fxx silk_encoder_state_FIX #define silk_encode_do_VAD_Fxx silk_encode_do_VAD_FIX #define silk_encode_frame_Fxx silk_encode_frame_FIX #define QC 10 #define QS 13 /*********************/ /* Encoder Functions */ /*********************/ /* High-pass filter with cutoff frequency adaptation based on pitch lag statistics */ void silk_HP_variable_cutoff( silk_encoder_state_Fxx state_Fxx[] /* I/O Encoder states */ ); /* Encoder main function */ void silk_encode_do_VAD_FIX( silk_encoder_state_FIX *psEnc /* I/O Pointer to Silk FIX encoder state */ ); /* Encoder main function */ opus_int silk_encode_frame_FIX( silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk FIX encoder state */ opus_int32 *pnBytesOut, /* O Pointer to number of payload bytes; */ ec_enc *psRangeEnc, /* I/O compressor data structure */ opus_int condCoding, /* I The type of conditional coding to use */ opus_int maxBits, /* I If > 0: maximum number of output bits */ opus_int useCBR /* I Flag to force constant-bitrate operation */ ); /* Initializes the Silk encoder state */ opus_int silk_init_encoder( silk_encoder_state_Fxx *psEnc, /* I/O Pointer to Silk FIX encoder state */ int arch /* I Run-time architecture */ ); /* Control the Silk encoder */ opus_int silk_control_encoder( silk_encoder_state_Fxx *psEnc, /* I/O Pointer to Silk encoder state */ silk_EncControlStruct *encControl, /* I Control structure */ const opus_int allow_bw_switch, /* I Flag to allow switching audio bandwidth */ const opus_int channelNb, /* I Channel number */ const opus_int force_fs_kHz ); /**************************/ /* Noise shaping analysis */ /**************************/ /* Compute noise shaping coefficients and initial gain values */ void silk_noise_shape_analysis_FIX( silk_encoder_state_FIX *psEnc, /* I/O Encoder state FIX */ silk_encoder_control_FIX *psEncCtrl, /* I/O Encoder control FIX */ const opus_int16 *pitch_res, /* I LPC residual from pitch analysis */ const opus_int16 *x, /* I Input signal [ frame_length + la_shape ] */ int arch /* I Run-time architecture */ ); /* Autocorrelations for a warped frequency axis */ void silk_warped_autocorrelation_FIX_c( opus_int32 *corr, /* O Result [order + 1] */ opus_int *scale, /* O Scaling of the correlation vector */ const opus_int16 *input, /* I Input data to correlate */ const opus_int warping_Q16, /* I Warping coefficient */ const opus_int length, /* I Length of input */ const opus_int order /* I Correlation order (even) */ ); #if !defined(OVERRIDE_silk_warped_autocorrelation_FIX) #define silk_warped_autocorrelation_FIX(corr, scale, input, warping_Q16, length, order, arch) \ ((void)(arch), silk_warped_autocorrelation_FIX_c(corr, scale, input, warping_Q16, length, order)) #endif /* Calculation of LTP state scaling */ void silk_LTP_scale_ctrl_FIX( silk_encoder_state_FIX *psEnc, /* I/O encoder state */ silk_encoder_control_FIX *psEncCtrl, /* I/O encoder control */ opus_int condCoding /* I The type of conditional coding to use */ ); /**********************************************/ /* Prediction Analysis */ /**********************************************/ /* Find pitch lags */ void silk_find_pitch_lags_FIX( silk_encoder_state_FIX *psEnc, /* I/O encoder state */ silk_encoder_control_FIX *psEncCtrl, /* I/O encoder control */ opus_int16 res[], /* O residual */ const opus_int16 x[], /* I Speech signal */ int arch /* I Run-time architecture */ ); /* Find LPC and LTP coefficients */ void silk_find_pred_coefs_FIX( silk_encoder_state_FIX *psEnc, /* I/O encoder state */ silk_encoder_control_FIX *psEncCtrl, /* I/O encoder control */ const opus_int16 res_pitch[], /* I Residual from pitch analysis */ const opus_int16 x[], /* I Speech signal */ opus_int condCoding /* I The type of conditional coding to use */ ); /* LPC analysis */ void silk_find_LPC_FIX( silk_encoder_state *psEncC, /* I/O Encoder state */ opus_int16 NLSF_Q15[], /* O NLSFs */ const opus_int16 x[], /* I Input signal */ const opus_int32 minInvGain_Q30 /* I Inverse of max prediction gain */ ); /* LTP analysis */ void silk_find_LTP_FIX( opus_int32 XXLTP_Q17[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* O Correlation matrix */ opus_int32 xXLTP_Q17[ MAX_NB_SUBFR * LTP_ORDER ], /* O Correlation vector */ const opus_int16 r_lpc[], /* I Residual signal after LPC */ const opus_int lag[ MAX_NB_SUBFR ], /* I LTP lags */ const opus_int subfr_length, /* I Subframe length */ const opus_int nb_subfr, /* I Number of subframes */ int arch /* I Run-time architecture */ ); void silk_LTP_analysis_filter_FIX( opus_int16 *LTP_res, /* O LTP residual signal of length MAX_NB_SUBFR * ( pre_length + subfr_length ) */ const opus_int16 *x, /* I Pointer to input signal with at least max( pitchL ) preceding samples */ const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ],/* I LTP_ORDER LTP coefficients for each MAX_NB_SUBFR subframe */ const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag, one for each subframe */ const opus_int32 invGains_Q16[ MAX_NB_SUBFR ], /* I Inverse quantization gains, one for each subframe */ const opus_int subfr_length, /* I Length of each subframe */ const opus_int nb_subfr, /* I Number of subframes */ const opus_int pre_length /* I Length of the preceding samples starting at &x[0] for each subframe */ ); /* Calculates residual energies of input subframes where all subframes have LPC_order */ /* of preceding samples */ void silk_residual_energy_FIX( opus_int32 nrgs[ MAX_NB_SUBFR ], /* O Residual energy per subframe */ opus_int nrgsQ[ MAX_NB_SUBFR ], /* O Q value per subframe */ const opus_int16 x[], /* I Input signal */ opus_int16 a_Q12[ 2 ][ MAX_LPC_ORDER ], /* I AR coefs for each frame half */ const opus_int32 gains[ MAX_NB_SUBFR ], /* I Quantization gains */ const opus_int subfr_length, /* I Subframe length */ const opus_int nb_subfr, /* I Number of subframes */ const opus_int LPC_order, /* I LPC order */ int arch /* I Run-time architecture */ ); /* Residual energy: nrg = wxx - 2 * wXx * c + c' * wXX * c */ opus_int32 silk_residual_energy16_covar_FIX( const opus_int16 *c, /* I Prediction vector */ const opus_int32 *wXX, /* I Correlation matrix */ const opus_int32 *wXx, /* I Correlation vector */ opus_int32 wxx, /* I Signal energy */ opus_int D, /* I Dimension */ opus_int cQ /* I Q value for c vector 0 - 15 */ ); /* Processing of gains */ void silk_process_gains_FIX( silk_encoder_state_FIX *psEnc, /* I/O Encoder state */ silk_encoder_control_FIX *psEncCtrl, /* I/O Encoder control */ opus_int condCoding /* I The type of conditional coding to use */ ); /******************/ /* Linear Algebra */ /******************/ /* Calculates correlation matrix X'*X */ void silk_corrMatrix_FIX( const opus_int16 *x, /* I x vector [L + order - 1] used to form data matrix X */ const opus_int L, /* I Length of vectors */ const opus_int order, /* I Max lag for correlation */ opus_int32 *XX, /* O Pointer to X'*X correlation matrix [ order x order ] */ opus_int32 *nrg, /* O Energy of x vector */ opus_int *rshifts, /* O Right shifts of correlations */ int arch /* I Run-time architecture */ ); /* Calculates correlation vector X'*t */ void silk_corrVector_FIX( const opus_int16 *x, /* I x vector [L + order - 1] used to form data matrix X */ const opus_int16 *t, /* I Target vector [L] */ const opus_int L, /* I Length of vectors */ const opus_int order, /* I Max lag for correlation */ opus_int32 *Xt, /* O Pointer to X'*t correlation vector [order] */ const opus_int rshifts, /* I Right shifts of correlations */ int arch /* I Run-time architecture */ ); #ifndef FORCE_CPP_BUILD #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* FORCE_CPP_BUILD */ #endif /* SILK_MAIN_FIX_H */ mumble-1.3.4/3rdparty/opus-src/silk/fixed/autocorr_FIX.c0000664000175000017500000000524514010707327022743 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "SigProc_FIX.h" #include "celt_lpc.h" /* Compute autocorrelation */ void silk_autocorr( opus_int32 *results, /* O Result (length correlationCount) */ opus_int *scale, /* O Scaling of the correlation vector */ const opus_int16 *inputData, /* I Input data to correlate */ const opus_int inputDataSize, /* I Length of input */ const opus_int correlationCount, /* I Number of correlation taps to compute */ int arch /* I Run-time architecture */ ) { opus_int corrCount; corrCount = silk_min_int( inputDataSize, correlationCount ); *scale = _celt_autocorr(inputData, results, NULL, 0, corrCount-1, inputDataSize, arch); } mumble-1.3.4/3rdparty/opus-src/silk/VAD.c0000664000175000017500000003530214010707327017707 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main.h" #include "stack_alloc.h" /* Silk VAD noise level estimation */ # if !defined(OPUS_X86_MAY_HAVE_SSE4_1) static OPUS_INLINE void silk_VAD_GetNoiseLevels( const opus_int32 pX[ VAD_N_BANDS ], /* I subband energies */ silk_VAD_state *psSilk_VAD /* I/O Pointer to Silk VAD state */ ); #endif /**********************************/ /* Initialization of the Silk VAD */ /**********************************/ opus_int silk_VAD_Init( /* O Return value, 0 if success */ silk_VAD_state *psSilk_VAD /* I/O Pointer to Silk VAD state */ ) { opus_int b, ret = 0; /* reset state memory */ silk_memset( psSilk_VAD, 0, sizeof( silk_VAD_state ) ); /* init noise levels */ /* Initialize array with approx pink noise levels (psd proportional to inverse of frequency) */ for( b = 0; b < VAD_N_BANDS; b++ ) { psSilk_VAD->NoiseLevelBias[ b ] = silk_max_32( silk_DIV32_16( VAD_NOISE_LEVELS_BIAS, b + 1 ), 1 ); } /* Initialize state */ for( b = 0; b < VAD_N_BANDS; b++ ) { psSilk_VAD->NL[ b ] = silk_MUL( 100, psSilk_VAD->NoiseLevelBias[ b ] ); psSilk_VAD->inv_NL[ b ] = silk_DIV32( silk_int32_MAX, psSilk_VAD->NL[ b ] ); } psSilk_VAD->counter = 15; /* init smoothed energy-to-noise ratio*/ for( b = 0; b < VAD_N_BANDS; b++ ) { psSilk_VAD->NrgRatioSmth_Q8[ b ] = 100 * 256; /* 100 * 256 --> 20 dB SNR */ } return( ret ); } /* Weighting factors for tilt measure */ static const opus_int32 tiltWeights[ VAD_N_BANDS ] = { 30000, 6000, -12000, -12000 }; /***************************************/ /* Get the speech activity level in Q8 */ /***************************************/ opus_int silk_VAD_GetSA_Q8_c( /* O Return value, 0 if success */ silk_encoder_state *psEncC, /* I/O Encoder state */ const opus_int16 pIn[] /* I PCM input */ ) { opus_int SA_Q15, pSNR_dB_Q7, input_tilt; opus_int decimated_framelength1, decimated_framelength2; opus_int decimated_framelength; opus_int dec_subframe_length, dec_subframe_offset, SNR_Q7, i, b, s; opus_int32 sumSquared, smooth_coef_Q16; opus_int16 HPstateTmp; VARDECL( opus_int16, X ); opus_int32 Xnrg[ VAD_N_BANDS ]; opus_int32 NrgToNoiseRatio_Q8[ VAD_N_BANDS ]; opus_int32 speech_nrg, x_tmp; opus_int X_offset[ VAD_N_BANDS ]; opus_int ret = 0; silk_VAD_state *psSilk_VAD = &psEncC->sVAD; SAVE_STACK; /* Safety checks */ silk_assert( VAD_N_BANDS == 4 ); silk_assert( MAX_FRAME_LENGTH >= psEncC->frame_length ); silk_assert( psEncC->frame_length <= 512 ); silk_assert( psEncC->frame_length == 8 * silk_RSHIFT( psEncC->frame_length, 3 ) ); /***********************/ /* Filter and Decimate */ /***********************/ decimated_framelength1 = silk_RSHIFT( psEncC->frame_length, 1 ); decimated_framelength2 = silk_RSHIFT( psEncC->frame_length, 2 ); decimated_framelength = silk_RSHIFT( psEncC->frame_length, 3 ); /* Decimate into 4 bands: 0 L 3L L 3L 5L - -- - -- -- 8 8 2 4 4 [0-1 kHz| temp. |1-2 kHz| 2-4 kHz | 4-8 kHz | They're arranged to allow the minimal ( frame_length / 4 ) extra scratch space during the downsampling process */ X_offset[ 0 ] = 0; X_offset[ 1 ] = decimated_framelength + decimated_framelength2; X_offset[ 2 ] = X_offset[ 1 ] + decimated_framelength; X_offset[ 3 ] = X_offset[ 2 ] + decimated_framelength2; ALLOC( X, X_offset[ 3 ] + decimated_framelength1, opus_int16 ); /* 0-8 kHz to 0-4 kHz and 4-8 kHz */ silk_ana_filt_bank_1( pIn, &psSilk_VAD->AnaState[ 0 ], X, &X[ X_offset[ 3 ] ], psEncC->frame_length ); /* 0-4 kHz to 0-2 kHz and 2-4 kHz */ silk_ana_filt_bank_1( X, &psSilk_VAD->AnaState1[ 0 ], X, &X[ X_offset[ 2 ] ], decimated_framelength1 ); /* 0-2 kHz to 0-1 kHz and 1-2 kHz */ silk_ana_filt_bank_1( X, &psSilk_VAD->AnaState2[ 0 ], X, &X[ X_offset[ 1 ] ], decimated_framelength2 ); /*********************************************/ /* HP filter on lowest band (differentiator) */ /*********************************************/ X[ decimated_framelength - 1 ] = silk_RSHIFT( X[ decimated_framelength - 1 ], 1 ); HPstateTmp = X[ decimated_framelength - 1 ]; for( i = decimated_framelength - 1; i > 0; i-- ) { X[ i - 1 ] = silk_RSHIFT( X[ i - 1 ], 1 ); X[ i ] -= X[ i - 1 ]; } X[ 0 ] -= psSilk_VAD->HPstate; psSilk_VAD->HPstate = HPstateTmp; /*************************************/ /* Calculate the energy in each band */ /*************************************/ for( b = 0; b < VAD_N_BANDS; b++ ) { /* Find the decimated framelength in the non-uniformly divided bands */ decimated_framelength = silk_RSHIFT( psEncC->frame_length, silk_min_int( VAD_N_BANDS - b, VAD_N_BANDS - 1 ) ); /* Split length into subframe lengths */ dec_subframe_length = silk_RSHIFT( decimated_framelength, VAD_INTERNAL_SUBFRAMES_LOG2 ); dec_subframe_offset = 0; /* Compute energy per sub-frame */ /* initialize with summed energy of last subframe */ Xnrg[ b ] = psSilk_VAD->XnrgSubfr[ b ]; for( s = 0; s < VAD_INTERNAL_SUBFRAMES; s++ ) { sumSquared = 0; for( i = 0; i < dec_subframe_length; i++ ) { /* The energy will be less than dec_subframe_length * ( silk_int16_MIN / 8 ) ^ 2. */ /* Therefore we can accumulate with no risk of overflow (unless dec_subframe_length > 128) */ x_tmp = silk_RSHIFT( X[ X_offset[ b ] + i + dec_subframe_offset ], 3 ); sumSquared = silk_SMLABB( sumSquared, x_tmp, x_tmp ); /* Safety check */ silk_assert( sumSquared >= 0 ); } /* Add/saturate summed energy of current subframe */ if( s < VAD_INTERNAL_SUBFRAMES - 1 ) { Xnrg[ b ] = silk_ADD_POS_SAT32( Xnrg[ b ], sumSquared ); } else { /* Look-ahead subframe */ Xnrg[ b ] = silk_ADD_POS_SAT32( Xnrg[ b ], silk_RSHIFT( sumSquared, 1 ) ); } dec_subframe_offset += dec_subframe_length; } psSilk_VAD->XnrgSubfr[ b ] = sumSquared; } /********************/ /* Noise estimation */ /********************/ silk_VAD_GetNoiseLevels( &Xnrg[ 0 ], psSilk_VAD ); /***********************************************/ /* Signal-plus-noise to noise ratio estimation */ /***********************************************/ sumSquared = 0; input_tilt = 0; for( b = 0; b < VAD_N_BANDS; b++ ) { speech_nrg = Xnrg[ b ] - psSilk_VAD->NL[ b ]; if( speech_nrg > 0 ) { /* Divide, with sufficient resolution */ if( ( Xnrg[ b ] & 0xFF800000 ) == 0 ) { NrgToNoiseRatio_Q8[ b ] = silk_DIV32( silk_LSHIFT( Xnrg[ b ], 8 ), psSilk_VAD->NL[ b ] + 1 ); } else { NrgToNoiseRatio_Q8[ b ] = silk_DIV32( Xnrg[ b ], silk_RSHIFT( psSilk_VAD->NL[ b ], 8 ) + 1 ); } /* Convert to log domain */ SNR_Q7 = silk_lin2log( NrgToNoiseRatio_Q8[ b ] ) - 8 * 128; /* Sum-of-squares */ sumSquared = silk_SMLABB( sumSquared, SNR_Q7, SNR_Q7 ); /* Q14 */ /* Tilt measure */ if( speech_nrg < ( (opus_int32)1 << 20 ) ) { /* Scale down SNR value for small subband speech energies */ SNR_Q7 = silk_SMULWB( silk_LSHIFT( silk_SQRT_APPROX( speech_nrg ), 6 ), SNR_Q7 ); } input_tilt = silk_SMLAWB( input_tilt, tiltWeights[ b ], SNR_Q7 ); } else { NrgToNoiseRatio_Q8[ b ] = 256; } } /* Mean-of-squares */ sumSquared = silk_DIV32_16( sumSquared, VAD_N_BANDS ); /* Q14 */ /* Root-mean-square approximation, scale to dBs, and write to output pointer */ pSNR_dB_Q7 = (opus_int16)( 3 * silk_SQRT_APPROX( sumSquared ) ); /* Q7 */ /*********************************/ /* Speech Probability Estimation */ /*********************************/ SA_Q15 = silk_sigm_Q15( silk_SMULWB( VAD_SNR_FACTOR_Q16, pSNR_dB_Q7 ) - VAD_NEGATIVE_OFFSET_Q5 ); /**************************/ /* Frequency Tilt Measure */ /**************************/ psEncC->input_tilt_Q15 = silk_LSHIFT( silk_sigm_Q15( input_tilt ) - 16384, 1 ); /**************************************************/ /* Scale the sigmoid output based on power levels */ /**************************************************/ speech_nrg = 0; for( b = 0; b < VAD_N_BANDS; b++ ) { /* Accumulate signal-without-noise energies, higher frequency bands have more weight */ speech_nrg += ( b + 1 ) * silk_RSHIFT( Xnrg[ b ] - psSilk_VAD->NL[ b ], 4 ); } /* Power scaling */ if( speech_nrg <= 0 ) { SA_Q15 = silk_RSHIFT( SA_Q15, 1 ); } else if( speech_nrg < 32768 ) { if( psEncC->frame_length == 10 * psEncC->fs_kHz ) { speech_nrg = silk_LSHIFT_SAT32( speech_nrg, 16 ); } else { speech_nrg = silk_LSHIFT_SAT32( speech_nrg, 15 ); } /* square-root */ speech_nrg = silk_SQRT_APPROX( speech_nrg ); SA_Q15 = silk_SMULWB( 32768 + speech_nrg, SA_Q15 ); } /* Copy the resulting speech activity in Q8 */ psEncC->speech_activity_Q8 = silk_min_int( silk_RSHIFT( SA_Q15, 7 ), silk_uint8_MAX ); /***********************************/ /* Energy Level and SNR estimation */ /***********************************/ /* Smoothing coefficient */ smooth_coef_Q16 = silk_SMULWB( VAD_SNR_SMOOTH_COEF_Q18, silk_SMULWB( (opus_int32)SA_Q15, SA_Q15 ) ); if( psEncC->frame_length == 10 * psEncC->fs_kHz ) { smooth_coef_Q16 >>= 1; } for( b = 0; b < VAD_N_BANDS; b++ ) { /* compute smoothed energy-to-noise ratio per band */ psSilk_VAD->NrgRatioSmth_Q8[ b ] = silk_SMLAWB( psSilk_VAD->NrgRatioSmth_Q8[ b ], NrgToNoiseRatio_Q8[ b ] - psSilk_VAD->NrgRatioSmth_Q8[ b ], smooth_coef_Q16 ); /* signal to noise ratio in dB per band */ SNR_Q7 = 3 * ( silk_lin2log( psSilk_VAD->NrgRatioSmth_Q8[b] ) - 8 * 128 ); /* quality = sigmoid( 0.25 * ( SNR_dB - 16 ) ); */ psEncC->input_quality_bands_Q15[ b ] = silk_sigm_Q15( silk_RSHIFT( SNR_Q7 - 16 * 128, 4 ) ); } RESTORE_STACK; return( ret ); } /**************************/ /* Noise level estimation */ /**************************/ # if !defined(OPUS_X86_MAY_HAVE_SSE4_1) static OPUS_INLINE #endif void silk_VAD_GetNoiseLevels( const opus_int32 pX[ VAD_N_BANDS ], /* I subband energies */ silk_VAD_state *psSilk_VAD /* I/O Pointer to Silk VAD state */ ) { opus_int k; opus_int32 nl, nrg, inv_nrg; opus_int coef, min_coef; /* Initially faster smoothing */ if( psSilk_VAD->counter < 1000 ) { /* 1000 = 20 sec */ min_coef = silk_DIV32_16( silk_int16_MAX, silk_RSHIFT( psSilk_VAD->counter, 4 ) + 1 ); } else { min_coef = 0; } for( k = 0; k < VAD_N_BANDS; k++ ) { /* Get old noise level estimate for current band */ nl = psSilk_VAD->NL[ k ]; silk_assert( nl >= 0 ); /* Add bias */ nrg = silk_ADD_POS_SAT32( pX[ k ], psSilk_VAD->NoiseLevelBias[ k ] ); silk_assert( nrg > 0 ); /* Invert energies */ inv_nrg = silk_DIV32( silk_int32_MAX, nrg ); silk_assert( inv_nrg >= 0 ); /* Less update when subband energy is high */ if( nrg > silk_LSHIFT( nl, 3 ) ) { coef = VAD_NOISE_LEVEL_SMOOTH_COEF_Q16 >> 3; } else if( nrg < nl ) { coef = VAD_NOISE_LEVEL_SMOOTH_COEF_Q16; } else { coef = silk_SMULWB( silk_SMULWW( inv_nrg, nl ), VAD_NOISE_LEVEL_SMOOTH_COEF_Q16 << 1 ); } /* Initially faster smoothing */ coef = silk_max_int( coef, min_coef ); /* Smooth inverse energies */ psSilk_VAD->inv_NL[ k ] = silk_SMLAWB( psSilk_VAD->inv_NL[ k ], inv_nrg - psSilk_VAD->inv_NL[ k ], coef ); silk_assert( psSilk_VAD->inv_NL[ k ] >= 0 ); /* Compute noise level by inverting again */ nl = silk_DIV32( silk_int32_MAX, psSilk_VAD->inv_NL[ k ] ); silk_assert( nl >= 0 ); /* Limit noise levels (guarantee 7 bits of head room) */ nl = silk_min( nl, 0x00FFFFFF ); /* Store as part of state */ psSilk_VAD->NL[ k ] = nl; } /* Increment frame counter */ psSilk_VAD->counter++; } mumble-1.3.4/3rdparty/opus-src/silk/encode_indices.c0000664000175000017500000002222014010707327022223 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main.h" /* Encode side-information parameters to payload */ void silk_encode_indices( silk_encoder_state *psEncC, /* I/O Encoder state */ ec_enc *psRangeEnc, /* I/O Compressor data structure */ opus_int FrameIndex, /* I Frame number */ opus_int encode_LBRR, /* I Flag indicating LBRR data is being encoded */ opus_int condCoding /* I The type of conditional coding to use */ ) { opus_int i, k, typeOffset; opus_int encode_absolute_lagIndex, delta_lagIndex; opus_int16 ec_ix[ MAX_LPC_ORDER ]; opus_uint8 pred_Q8[ MAX_LPC_ORDER ]; const SideInfoIndices *psIndices; if( encode_LBRR ) { psIndices = &psEncC->indices_LBRR[ FrameIndex ]; } else { psIndices = &psEncC->indices; } /*******************************************/ /* Encode signal type and quantizer offset */ /*******************************************/ typeOffset = 2 * psIndices->signalType + psIndices->quantOffsetType; silk_assert( typeOffset >= 0 && typeOffset < 6 ); silk_assert( encode_LBRR == 0 || typeOffset >= 2 ); if( encode_LBRR || typeOffset >= 2 ) { ec_enc_icdf( psRangeEnc, typeOffset - 2, silk_type_offset_VAD_iCDF, 8 ); } else { ec_enc_icdf( psRangeEnc, typeOffset, silk_type_offset_no_VAD_iCDF, 8 ); } /****************/ /* Encode gains */ /****************/ /* first subframe */ if( condCoding == CODE_CONDITIONALLY ) { /* conditional coding */ silk_assert( psIndices->GainsIndices[ 0 ] >= 0 && psIndices->GainsIndices[ 0 ] < MAX_DELTA_GAIN_QUANT - MIN_DELTA_GAIN_QUANT + 1 ); ec_enc_icdf( psRangeEnc, psIndices->GainsIndices[ 0 ], silk_delta_gain_iCDF, 8 ); } else { /* independent coding, in two stages: MSB bits followed by 3 LSBs */ silk_assert( psIndices->GainsIndices[ 0 ] >= 0 && psIndices->GainsIndices[ 0 ] < N_LEVELS_QGAIN ); ec_enc_icdf( psRangeEnc, silk_RSHIFT( psIndices->GainsIndices[ 0 ], 3 ), silk_gain_iCDF[ psIndices->signalType ], 8 ); ec_enc_icdf( psRangeEnc, psIndices->GainsIndices[ 0 ] & 7, silk_uniform8_iCDF, 8 ); } /* remaining subframes */ for( i = 1; i < psEncC->nb_subfr; i++ ) { silk_assert( psIndices->GainsIndices[ i ] >= 0 && psIndices->GainsIndices[ i ] < MAX_DELTA_GAIN_QUANT - MIN_DELTA_GAIN_QUANT + 1 ); ec_enc_icdf( psRangeEnc, psIndices->GainsIndices[ i ], silk_delta_gain_iCDF, 8 ); } /****************/ /* Encode NLSFs */ /****************/ ec_enc_icdf( psRangeEnc, psIndices->NLSFIndices[ 0 ], &psEncC->psNLSF_CB->CB1_iCDF[ ( psIndices->signalType >> 1 ) * psEncC->psNLSF_CB->nVectors ], 8 ); silk_NLSF_unpack( ec_ix, pred_Q8, psEncC->psNLSF_CB, psIndices->NLSFIndices[ 0 ] ); silk_assert( psEncC->psNLSF_CB->order == psEncC->predictLPCOrder ); for( i = 0; i < psEncC->psNLSF_CB->order; i++ ) { if( psIndices->NLSFIndices[ i+1 ] >= NLSF_QUANT_MAX_AMPLITUDE ) { ec_enc_icdf( psRangeEnc, 2 * NLSF_QUANT_MAX_AMPLITUDE, &psEncC->psNLSF_CB->ec_iCDF[ ec_ix[ i ] ], 8 ); ec_enc_icdf( psRangeEnc, psIndices->NLSFIndices[ i+1 ] - NLSF_QUANT_MAX_AMPLITUDE, silk_NLSF_EXT_iCDF, 8 ); } else if( psIndices->NLSFIndices[ i+1 ] <= -NLSF_QUANT_MAX_AMPLITUDE ) { ec_enc_icdf( psRangeEnc, 0, &psEncC->psNLSF_CB->ec_iCDF[ ec_ix[ i ] ], 8 ); ec_enc_icdf( psRangeEnc, -psIndices->NLSFIndices[ i+1 ] - NLSF_QUANT_MAX_AMPLITUDE, silk_NLSF_EXT_iCDF, 8 ); } else { ec_enc_icdf( psRangeEnc, psIndices->NLSFIndices[ i+1 ] + NLSF_QUANT_MAX_AMPLITUDE, &psEncC->psNLSF_CB->ec_iCDF[ ec_ix[ i ] ], 8 ); } } /* Encode NLSF interpolation factor */ if( psEncC->nb_subfr == MAX_NB_SUBFR ) { silk_assert( psIndices->NLSFInterpCoef_Q2 >= 0 && psIndices->NLSFInterpCoef_Q2 < 5 ); ec_enc_icdf( psRangeEnc, psIndices->NLSFInterpCoef_Q2, silk_NLSF_interpolation_factor_iCDF, 8 ); } if( psIndices->signalType == TYPE_VOICED ) { /*********************/ /* Encode pitch lags */ /*********************/ /* lag index */ encode_absolute_lagIndex = 1; if( condCoding == CODE_CONDITIONALLY && psEncC->ec_prevSignalType == TYPE_VOICED ) { /* Delta Encoding */ delta_lagIndex = psIndices->lagIndex - psEncC->ec_prevLagIndex; if( delta_lagIndex < -8 || delta_lagIndex > 11 ) { delta_lagIndex = 0; } else { delta_lagIndex = delta_lagIndex + 9; encode_absolute_lagIndex = 0; /* Only use delta */ } silk_assert( delta_lagIndex >= 0 && delta_lagIndex < 21 ); ec_enc_icdf( psRangeEnc, delta_lagIndex, silk_pitch_delta_iCDF, 8 ); } if( encode_absolute_lagIndex ) { /* Absolute encoding */ opus_int32 pitch_high_bits, pitch_low_bits; pitch_high_bits = silk_DIV32_16( psIndices->lagIndex, silk_RSHIFT( psEncC->fs_kHz, 1 ) ); pitch_low_bits = psIndices->lagIndex - silk_SMULBB( pitch_high_bits, silk_RSHIFT( psEncC->fs_kHz, 1 ) ); silk_assert( pitch_low_bits < psEncC->fs_kHz / 2 ); silk_assert( pitch_high_bits < 32 ); ec_enc_icdf( psRangeEnc, pitch_high_bits, silk_pitch_lag_iCDF, 8 ); ec_enc_icdf( psRangeEnc, pitch_low_bits, psEncC->pitch_lag_low_bits_iCDF, 8 ); } psEncC->ec_prevLagIndex = psIndices->lagIndex; /* Countour index */ silk_assert( psIndices->contourIndex >= 0 ); silk_assert( ( psIndices->contourIndex < 34 && psEncC->fs_kHz > 8 && psEncC->nb_subfr == 4 ) || ( psIndices->contourIndex < 11 && psEncC->fs_kHz == 8 && psEncC->nb_subfr == 4 ) || ( psIndices->contourIndex < 12 && psEncC->fs_kHz > 8 && psEncC->nb_subfr == 2 ) || ( psIndices->contourIndex < 3 && psEncC->fs_kHz == 8 && psEncC->nb_subfr == 2 ) ); ec_enc_icdf( psRangeEnc, psIndices->contourIndex, psEncC->pitch_contour_iCDF, 8 ); /********************/ /* Encode LTP gains */ /********************/ /* PERIndex value */ silk_assert( psIndices->PERIndex >= 0 && psIndices->PERIndex < 3 ); ec_enc_icdf( psRangeEnc, psIndices->PERIndex, silk_LTP_per_index_iCDF, 8 ); /* Codebook Indices */ for( k = 0; k < psEncC->nb_subfr; k++ ) { silk_assert( psIndices->LTPIndex[ k ] >= 0 && psIndices->LTPIndex[ k ] < ( 8 << psIndices->PERIndex ) ); ec_enc_icdf( psRangeEnc, psIndices->LTPIndex[ k ], silk_LTP_gain_iCDF_ptrs[ psIndices->PERIndex ], 8 ); } /**********************/ /* Encode LTP scaling */ /**********************/ if( condCoding == CODE_INDEPENDENTLY ) { silk_assert( psIndices->LTP_scaleIndex >= 0 && psIndices->LTP_scaleIndex < 3 ); ec_enc_icdf( psRangeEnc, psIndices->LTP_scaleIndex, silk_LTPscale_iCDF, 8 ); } silk_assert( !condCoding || psIndices->LTP_scaleIndex == 0 ); } psEncC->ec_prevSignalType = psIndices->signalType; /***************/ /* Encode seed */ /***************/ silk_assert( psIndices->Seed >= 0 && psIndices->Seed < 4 ); ec_enc_icdf( psRangeEnc, psIndices->Seed, silk_uniform4_iCDF, 8 ); } mumble-1.3.4/3rdparty/opus-src/silk/NLSF_unpack.c0000664000175000017500000000560514010707327021403 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main.h" /* Unpack predictor values and indices for entropy coding tables */ void silk_NLSF_unpack( opus_int16 ec_ix[], /* O Indices to entropy tables [ LPC_ORDER ] */ opus_uint8 pred_Q8[], /* O LSF predictor [ LPC_ORDER ] */ const silk_NLSF_CB_struct *psNLSF_CB, /* I Codebook object */ const opus_int CB1_index /* I Index of vector in first LSF codebook */ ) { opus_int i; opus_uint8 entry; const opus_uint8 *ec_sel_ptr; ec_sel_ptr = &psNLSF_CB->ec_sel[ CB1_index * psNLSF_CB->order / 2 ]; for( i = 0; i < psNLSF_CB->order; i += 2 ) { entry = *ec_sel_ptr++; ec_ix [ i ] = silk_SMULBB( silk_RSHIFT( entry, 1 ) & 7, 2 * NLSF_QUANT_MAX_AMPLITUDE + 1 ); pred_Q8[ i ] = psNLSF_CB->pred_Q8[ i + ( entry & 1 ) * ( psNLSF_CB->order - 1 ) ]; ec_ix [ i + 1 ] = silk_SMULBB( silk_RSHIFT( entry, 5 ) & 7, 2 * NLSF_QUANT_MAX_AMPLITUDE + 1 ); pred_Q8[ i + 1 ] = psNLSF_CB->pred_Q8[ i + ( silk_RSHIFT( entry, 4 ) & 1 ) * ( psNLSF_CB->order - 1 ) + 1 ]; } } mumble-1.3.4/3rdparty/opus-src/silk/resampler_down2.c0000664000175000017500000000662314010707327022404 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "SigProc_FIX.h" #include "resampler_rom.h" /* Downsample by a factor 2 */ void silk_resampler_down2( opus_int32 *S, /* I/O State vector [ 2 ] */ opus_int16 *out, /* O Output signal [ floor(len/2) ] */ const opus_int16 *in, /* I Input signal [ len ] */ opus_int32 inLen /* I Number of input samples */ ) { opus_int32 k, len2 = silk_RSHIFT32( inLen, 1 ); opus_int32 in32, out32, Y, X; silk_assert( silk_resampler_down2_0 > 0 ); silk_assert( silk_resampler_down2_1 < 0 ); /* Internal variables and state are in Q10 format */ for( k = 0; k < len2; k++ ) { /* Convert to Q10 */ in32 = silk_LSHIFT( (opus_int32)in[ 2 * k ], 10 ); /* All-pass section for even input sample */ Y = silk_SUB32( in32, S[ 0 ] ); X = silk_SMLAWB( Y, Y, silk_resampler_down2_1 ); out32 = silk_ADD32( S[ 0 ], X ); S[ 0 ] = silk_ADD32( in32, X ); /* Convert to Q10 */ in32 = silk_LSHIFT( (opus_int32)in[ 2 * k + 1 ], 10 ); /* All-pass section for odd input sample, and add to output of previous section */ Y = silk_SUB32( in32, S[ 1 ] ); X = silk_SMULWB( Y, silk_resampler_down2_0 ); out32 = silk_ADD32( out32, S[ 1 ] ); out32 = silk_ADD32( out32, X ); S[ 1 ] = silk_ADD32( in32, X ); /* Add, convert back to int16 and store to output */ out[ k ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( out32, 11 ) ); } } mumble-1.3.4/3rdparty/opus-src/silk/PLC.h0000664000175000017500000000627514010707327017727 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef SILK_PLC_H #define SILK_PLC_H #include "main.h" #define BWE_COEF 0.99 #define V_PITCH_GAIN_START_MIN_Q14 11469 /* 0.7 in Q14 */ #define V_PITCH_GAIN_START_MAX_Q14 15565 /* 0.95 in Q14 */ #define MAX_PITCH_LAG_MS 18 #define RAND_BUF_SIZE 128 #define RAND_BUF_MASK ( RAND_BUF_SIZE - 1 ) #define LOG2_INV_LPC_GAIN_HIGH_THRES 3 /* 2^3 = 8 dB LPC gain */ #define LOG2_INV_LPC_GAIN_LOW_THRES 8 /* 2^8 = 24 dB LPC gain */ #define PITCH_DRIFT_FAC_Q16 655 /* 0.01 in Q16 */ void silk_PLC_Reset( silk_decoder_state *psDec /* I/O Decoder state */ ); void silk_PLC( silk_decoder_state *psDec, /* I/O Decoder state */ silk_decoder_control *psDecCtrl, /* I/O Decoder control */ opus_int16 frame[], /* I/O signal */ opus_int lost, /* I Loss flag */ int arch /* I Run-time architecture */ ); void silk_PLC_glue_frames( silk_decoder_state *psDec, /* I/O decoder state */ opus_int16 frame[], /* I/O signal */ opus_int length /* I length of signal */ ); #endif mumble-1.3.4/3rdparty/opus-src/silk/decode_frame.c0000664000175000017500000001401014010707327021663 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main.h" #include "stack_alloc.h" #include "PLC.h" /****************/ /* Decode frame */ /****************/ opus_int silk_decode_frame( silk_decoder_state *psDec, /* I/O Pointer to Silk decoder state */ ec_dec *psRangeDec, /* I/O Compressor data structure */ opus_int16 pOut[], /* O Pointer to output speech frame */ opus_int32 *pN, /* O Pointer to size of output frame */ opus_int lostFlag, /* I 0: no loss, 1 loss, 2 decode fec */ opus_int condCoding, /* I The type of conditional coding to use */ int arch /* I Run-time architecture */ ) { VARDECL( silk_decoder_control, psDecCtrl ); opus_int L, mv_len, ret = 0; SAVE_STACK; L = psDec->frame_length; ALLOC( psDecCtrl, 1, silk_decoder_control ); psDecCtrl->LTP_scale_Q14 = 0; /* Safety checks */ silk_assert( L > 0 && L <= MAX_FRAME_LENGTH ); if( lostFlag == FLAG_DECODE_NORMAL || ( lostFlag == FLAG_DECODE_LBRR && psDec->LBRR_flags[ psDec->nFramesDecoded ] == 1 ) ) { VARDECL( opus_int16, pulses ); ALLOC( pulses, (L + SHELL_CODEC_FRAME_LENGTH - 1) & ~(SHELL_CODEC_FRAME_LENGTH - 1), opus_int16 ); /*********************************************/ /* Decode quantization indices of side info */ /*********************************************/ silk_decode_indices( psDec, psRangeDec, psDec->nFramesDecoded, lostFlag, condCoding ); /*********************************************/ /* Decode quantization indices of excitation */ /*********************************************/ silk_decode_pulses( psRangeDec, pulses, psDec->indices.signalType, psDec->indices.quantOffsetType, psDec->frame_length ); /********************************************/ /* Decode parameters and pulse signal */ /********************************************/ silk_decode_parameters( psDec, psDecCtrl, condCoding ); /********************************************************/ /* Run inverse NSQ */ /********************************************************/ silk_decode_core( psDec, psDecCtrl, pOut, pulses, arch ); /********************************************************/ /* Update PLC state */ /********************************************************/ silk_PLC( psDec, psDecCtrl, pOut, 0, arch ); psDec->lossCnt = 0; psDec->prevSignalType = psDec->indices.signalType; silk_assert( psDec->prevSignalType >= 0 && psDec->prevSignalType <= 2 ); /* A frame has been decoded without errors */ psDec->first_frame_after_reset = 0; } else { /* Handle packet loss by extrapolation */ psDec->indices.signalType = psDec->prevSignalType; silk_PLC( psDec, psDecCtrl, pOut, 1, arch ); } /*************************/ /* Update output buffer. */ /*************************/ silk_assert( psDec->ltp_mem_length >= psDec->frame_length ); mv_len = psDec->ltp_mem_length - psDec->frame_length; silk_memmove( psDec->outBuf, &psDec->outBuf[ psDec->frame_length ], mv_len * sizeof(opus_int16) ); silk_memcpy( &psDec->outBuf[ mv_len ], pOut, psDec->frame_length * sizeof( opus_int16 ) ); /************************************************/ /* Comfort noise generation / estimation */ /************************************************/ silk_CNG( psDec, psDecCtrl, pOut, L ); /****************************************************************/ /* Ensure smooth connection of extrapolated and good frames */ /****************************************************************/ silk_PLC_glue_frames( psDec, pOut, L ); /* Update some decoder state variables */ psDec->lagPrev = psDecCtrl->pitchL[ psDec->nb_subfr - 1 ]; /* Set output frame length */ *pN = L; RESTORE_STACK; return ret; } mumble-1.3.4/3rdparty/opus-src/silk/NLSF_stabilize.c0000664000175000017500000001431314010707327022104 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif /* NLSF stabilizer: */ /* */ /* - Moves NLSFs further apart if they are too close */ /* - Moves NLSFs away from borders if they are too close */ /* - High effort to achieve a modification with minimum */ /* Euclidean distance to input vector */ /* - Output are sorted NLSF coefficients */ /* */ #include "SigProc_FIX.h" /* Constant Definitions */ #define MAX_LOOPS 20 /* NLSF stabilizer, for a single input data vector */ void silk_NLSF_stabilize( opus_int16 *NLSF_Q15, /* I/O Unstable/stabilized normalized LSF vector in Q15 [L] */ const opus_int16 *NDeltaMin_Q15, /* I Min distance vector, NDeltaMin_Q15[L] must be >= 1 [L+1] */ const opus_int L /* I Number of NLSF parameters in the input vector */ ) { opus_int i, I=0, k, loops; opus_int16 center_freq_Q15; opus_int32 diff_Q15, min_diff_Q15, min_center_Q15, max_center_Q15; /* This is necessary to ensure an output within range of a opus_int16 */ silk_assert( NDeltaMin_Q15[L] >= 1 ); for( loops = 0; loops < MAX_LOOPS; loops++ ) { /**************************/ /* Find smallest distance */ /**************************/ /* First element */ min_diff_Q15 = NLSF_Q15[0] - NDeltaMin_Q15[0]; I = 0; /* Middle elements */ for( i = 1; i <= L-1; i++ ) { diff_Q15 = NLSF_Q15[i] - ( NLSF_Q15[i-1] + NDeltaMin_Q15[i] ); if( diff_Q15 < min_diff_Q15 ) { min_diff_Q15 = diff_Q15; I = i; } } /* Last element */ diff_Q15 = ( 1 << 15 ) - ( NLSF_Q15[L-1] + NDeltaMin_Q15[L] ); if( diff_Q15 < min_diff_Q15 ) { min_diff_Q15 = diff_Q15; I = L; } /***************************************************/ /* Now check if the smallest distance non-negative */ /***************************************************/ if( min_diff_Q15 >= 0 ) { return; } if( I == 0 ) { /* Move away from lower limit */ NLSF_Q15[0] = NDeltaMin_Q15[0]; } else if( I == L) { /* Move away from higher limit */ NLSF_Q15[L-1] = ( 1 << 15 ) - NDeltaMin_Q15[L]; } else { /* Find the lower extreme for the location of the current center frequency */ min_center_Q15 = 0; for( k = 0; k < I; k++ ) { min_center_Q15 += NDeltaMin_Q15[k]; } min_center_Q15 += silk_RSHIFT( NDeltaMin_Q15[I], 1 ); /* Find the upper extreme for the location of the current center frequency */ max_center_Q15 = 1 << 15; for( k = L; k > I; k-- ) { max_center_Q15 -= NDeltaMin_Q15[k]; } max_center_Q15 -= silk_RSHIFT( NDeltaMin_Q15[I], 1 ); /* Move apart, sorted by value, keeping the same center frequency */ center_freq_Q15 = (opus_int16)silk_LIMIT_32( silk_RSHIFT_ROUND( (opus_int32)NLSF_Q15[I-1] + (opus_int32)NLSF_Q15[I], 1 ), min_center_Q15, max_center_Q15 ); NLSF_Q15[I-1] = center_freq_Q15 - silk_RSHIFT( NDeltaMin_Q15[I], 1 ); NLSF_Q15[I] = NLSF_Q15[I-1] + NDeltaMin_Q15[I]; } } /* Safe and simple fall back method, which is less ideal than the above */ if( loops == MAX_LOOPS ) { /* Insertion sort (fast for already almost sorted arrays): */ /* Best case: O(n) for an already sorted array */ /* Worst case: O(n^2) for an inversely sorted array */ silk_insertion_sort_increasing_all_values_int16( &NLSF_Q15[0], L ); /* First NLSF should be no less than NDeltaMin[0] */ NLSF_Q15[0] = silk_max_int( NLSF_Q15[0], NDeltaMin_Q15[0] ); /* Keep delta_min distance between the NLSFs */ for( i = 1; i < L; i++ ) NLSF_Q15[i] = silk_max_int( NLSF_Q15[i], silk_ADD_SAT16( NLSF_Q15[i-1], NDeltaMin_Q15[i] ) ); /* Last NLSF should be no higher than 1 - NDeltaMin[L] */ NLSF_Q15[L-1] = silk_min_int( NLSF_Q15[L-1], (1<<15) - NDeltaMin_Q15[L] ); /* Keep NDeltaMin distance between the NLSFs */ for( i = L-2; i >= 0; i-- ) NLSF_Q15[i] = silk_min_int( NLSF_Q15[i], NLSF_Q15[i+1] - NDeltaMin_Q15[i+1] ); } } mumble-1.3.4/3rdparty/opus-src/silk/resampler_private.h0000664000175000017500000001071114010707327023023 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef SILK_RESAMPLER_PRIVATE_H #define SILK_RESAMPLER_PRIVATE_H #ifdef __cplusplus extern "C" { #endif #include "SigProc_FIX.h" #include "resampler_structs.h" #include "resampler_rom.h" /* Number of input samples to process in the inner loop */ #define RESAMPLER_MAX_BATCH_SIZE_MS 10 #define RESAMPLER_MAX_FS_KHZ 48 #define RESAMPLER_MAX_BATCH_SIZE_IN ( RESAMPLER_MAX_BATCH_SIZE_MS * RESAMPLER_MAX_FS_KHZ ) /* Description: Hybrid IIR/FIR polyphase implementation of resampling */ void silk_resampler_private_IIR_FIR( void *SS, /* I/O Resampler state */ opus_int16 out[], /* O Output signal */ const opus_int16 in[], /* I Input signal */ opus_int32 inLen /* I Number of input samples */ ); /* Description: Hybrid IIR/FIR polyphase implementation of resampling */ void silk_resampler_private_down_FIR( void *SS, /* I/O Resampler state */ opus_int16 out[], /* O Output signal */ const opus_int16 in[], /* I Input signal */ opus_int32 inLen /* I Number of input samples */ ); /* Upsample by a factor 2, high quality */ void silk_resampler_private_up2_HQ_wrapper( void *SS, /* I/O Resampler state (unused) */ opus_int16 *out, /* O Output signal [ 2 * len ] */ const opus_int16 *in, /* I Input signal [ len ] */ opus_int32 len /* I Number of input samples */ ); /* Upsample by a factor 2, high quality */ void silk_resampler_private_up2_HQ( opus_int32 *S, /* I/O Resampler state [ 6 ] */ opus_int16 *out, /* O Output signal [ 2 * len ] */ const opus_int16 *in, /* I Input signal [ len ] */ opus_int32 len /* I Number of input samples */ ); /* Second order AR filter */ void silk_resampler_private_AR2( opus_int32 S[], /* I/O State vector [ 2 ] */ opus_int32 out_Q8[], /* O Output signal */ const opus_int16 in[], /* I Input signal */ const opus_int16 A_Q14[], /* I AR coefficients, Q14 */ opus_int32 len /* I Signal length */ ); #ifdef __cplusplus } #endif #endif /* SILK_RESAMPLER_PRIVATE_H */ mumble-1.3.4/3rdparty/opus-src/silk/decode_core.c0000664000175000017500000002717414010707327021540 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main.h" #include "stack_alloc.h" /**********************************************************/ /* Core decoder. Performs inverse NSQ operation LTP + LPC */ /**********************************************************/ void silk_decode_core( silk_decoder_state *psDec, /* I/O Decoder state */ silk_decoder_control *psDecCtrl, /* I Decoder control */ opus_int16 xq[], /* O Decoded speech */ const opus_int16 pulses[ MAX_FRAME_LENGTH ], /* I Pulse signal */ int arch /* I Run-time architecture */ ) { opus_int i, k, lag = 0, start_idx, sLTP_buf_idx, NLSF_interpolation_flag, signalType; opus_int16 *A_Q12, *B_Q14, *pxq, A_Q12_tmp[ MAX_LPC_ORDER ]; VARDECL( opus_int16, sLTP ); VARDECL( opus_int32, sLTP_Q15 ); opus_int32 LTP_pred_Q13, LPC_pred_Q10, Gain_Q10, inv_gain_Q31, gain_adj_Q16, rand_seed, offset_Q10; opus_int32 *pred_lag_ptr, *pexc_Q14, *pres_Q14; VARDECL( opus_int32, res_Q14 ); VARDECL( opus_int32, sLPC_Q14 ); SAVE_STACK; silk_assert( psDec->prev_gain_Q16 != 0 ); ALLOC( sLTP, psDec->ltp_mem_length, opus_int16 ); ALLOC( sLTP_Q15, psDec->ltp_mem_length + psDec->frame_length, opus_int32 ); ALLOC( res_Q14, psDec->subfr_length, opus_int32 ); ALLOC( sLPC_Q14, psDec->subfr_length + MAX_LPC_ORDER, opus_int32 ); offset_Q10 = silk_Quantization_Offsets_Q10[ psDec->indices.signalType >> 1 ][ psDec->indices.quantOffsetType ]; if( psDec->indices.NLSFInterpCoef_Q2 < 1 << 2 ) { NLSF_interpolation_flag = 1; } else { NLSF_interpolation_flag = 0; } /* Decode excitation */ rand_seed = psDec->indices.Seed; for( i = 0; i < psDec->frame_length; i++ ) { rand_seed = silk_RAND( rand_seed ); psDec->exc_Q14[ i ] = silk_LSHIFT( (opus_int32)pulses[ i ], 14 ); if( psDec->exc_Q14[ i ] > 0 ) { psDec->exc_Q14[ i ] -= QUANT_LEVEL_ADJUST_Q10 << 4; } else if( psDec->exc_Q14[ i ] < 0 ) { psDec->exc_Q14[ i ] += QUANT_LEVEL_ADJUST_Q10 << 4; } psDec->exc_Q14[ i ] += offset_Q10 << 4; if( rand_seed < 0 ) { psDec->exc_Q14[ i ] = -psDec->exc_Q14[ i ]; } rand_seed = silk_ADD32_ovflw( rand_seed, pulses[ i ] ); } /* Copy LPC state */ silk_memcpy( sLPC_Q14, psDec->sLPC_Q14_buf, MAX_LPC_ORDER * sizeof( opus_int32 ) ); pexc_Q14 = psDec->exc_Q14; pxq = xq; sLTP_buf_idx = psDec->ltp_mem_length; /* Loop over subframes */ for( k = 0; k < psDec->nb_subfr; k++ ) { pres_Q14 = res_Q14; A_Q12 = psDecCtrl->PredCoef_Q12[ k >> 1 ]; /* Preload LPC coeficients to array on stack. Gives small performance gain */ silk_memcpy( A_Q12_tmp, A_Q12, psDec->LPC_order * sizeof( opus_int16 ) ); B_Q14 = &psDecCtrl->LTPCoef_Q14[ k * LTP_ORDER ]; signalType = psDec->indices.signalType; Gain_Q10 = silk_RSHIFT( psDecCtrl->Gains_Q16[ k ], 6 ); inv_gain_Q31 = silk_INVERSE32_varQ( psDecCtrl->Gains_Q16[ k ], 47 ); /* Calculate gain adjustment factor */ if( psDecCtrl->Gains_Q16[ k ] != psDec->prev_gain_Q16 ) { gain_adj_Q16 = silk_DIV32_varQ( psDec->prev_gain_Q16, psDecCtrl->Gains_Q16[ k ], 16 ); /* Scale short term state */ for( i = 0; i < MAX_LPC_ORDER; i++ ) { sLPC_Q14[ i ] = silk_SMULWW( gain_adj_Q16, sLPC_Q14[ i ] ); } } else { gain_adj_Q16 = (opus_int32)1 << 16; } /* Save inv_gain */ silk_assert( inv_gain_Q31 != 0 ); psDec->prev_gain_Q16 = psDecCtrl->Gains_Q16[ k ]; /* Avoid abrupt transition from voiced PLC to unvoiced normal decoding */ if( psDec->lossCnt && psDec->prevSignalType == TYPE_VOICED && psDec->indices.signalType != TYPE_VOICED && k < MAX_NB_SUBFR/2 ) { silk_memset( B_Q14, 0, LTP_ORDER * sizeof( opus_int16 ) ); B_Q14[ LTP_ORDER/2 ] = SILK_FIX_CONST( 0.25, 14 ); signalType = TYPE_VOICED; psDecCtrl->pitchL[ k ] = psDec->lagPrev; } if( signalType == TYPE_VOICED ) { /* Voiced */ lag = psDecCtrl->pitchL[ k ]; /* Re-whitening */ if( k == 0 || ( k == 2 && NLSF_interpolation_flag ) ) { /* Rewhiten with new A coefs */ start_idx = psDec->ltp_mem_length - lag - psDec->LPC_order - LTP_ORDER / 2; silk_assert( start_idx > 0 ); if( k == 2 ) { silk_memcpy( &psDec->outBuf[ psDec->ltp_mem_length ], xq, 2 * psDec->subfr_length * sizeof( opus_int16 ) ); } silk_LPC_analysis_filter( &sLTP[ start_idx ], &psDec->outBuf[ start_idx + k * psDec->subfr_length ], A_Q12, psDec->ltp_mem_length - start_idx, psDec->LPC_order, arch ); /* After rewhitening the LTP state is unscaled */ if( k == 0 ) { /* Do LTP downscaling to reduce inter-packet dependency */ inv_gain_Q31 = silk_LSHIFT( silk_SMULWB( inv_gain_Q31, psDecCtrl->LTP_scale_Q14 ), 2 ); } for( i = 0; i < lag + LTP_ORDER/2; i++ ) { sLTP_Q15[ sLTP_buf_idx - i - 1 ] = silk_SMULWB( inv_gain_Q31, sLTP[ psDec->ltp_mem_length - i - 1 ] ); } } else { /* Update LTP state when Gain changes */ if( gain_adj_Q16 != (opus_int32)1 << 16 ) { for( i = 0; i < lag + LTP_ORDER/2; i++ ) { sLTP_Q15[ sLTP_buf_idx - i - 1 ] = silk_SMULWW( gain_adj_Q16, sLTP_Q15[ sLTP_buf_idx - i - 1 ] ); } } } } /* Long-term prediction */ if( signalType == TYPE_VOICED ) { /* Set up pointer */ pred_lag_ptr = &sLTP_Q15[ sLTP_buf_idx - lag + LTP_ORDER / 2 ]; for( i = 0; i < psDec->subfr_length; i++ ) { /* Unrolled loop */ /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ LTP_pred_Q13 = 2; LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ 0 ], B_Q14[ 0 ] ); LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -1 ], B_Q14[ 1 ] ); LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -2 ], B_Q14[ 2 ] ); LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -3 ], B_Q14[ 3 ] ); LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -4 ], B_Q14[ 4 ] ); pred_lag_ptr++; /* Generate LPC excitation */ pres_Q14[ i ] = silk_ADD_LSHIFT32( pexc_Q14[ i ], LTP_pred_Q13, 1 ); /* Update states */ sLTP_Q15[ sLTP_buf_idx ] = silk_LSHIFT( pres_Q14[ i ], 1 ); sLTP_buf_idx++; } } else { pres_Q14 = pexc_Q14; } for( i = 0; i < psDec->subfr_length; i++ ) { /* Short-term prediction */ silk_assert( psDec->LPC_order == 10 || psDec->LPC_order == 16 ); /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ LPC_pred_Q10 = silk_RSHIFT( psDec->LPC_order, 1 ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 1 ], A_Q12_tmp[ 0 ] ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 2 ], A_Q12_tmp[ 1 ] ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 3 ], A_Q12_tmp[ 2 ] ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 4 ], A_Q12_tmp[ 3 ] ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 5 ], A_Q12_tmp[ 4 ] ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 6 ], A_Q12_tmp[ 5 ] ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 7 ], A_Q12_tmp[ 6 ] ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 8 ], A_Q12_tmp[ 7 ] ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 9 ], A_Q12_tmp[ 8 ] ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 10 ], A_Q12_tmp[ 9 ] ); if( psDec->LPC_order == 16 ) { LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 11 ], A_Q12_tmp[ 10 ] ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 12 ], A_Q12_tmp[ 11 ] ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 13 ], A_Q12_tmp[ 12 ] ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 14 ], A_Q12_tmp[ 13 ] ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 15 ], A_Q12_tmp[ 14 ] ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 16 ], A_Q12_tmp[ 15 ] ); } /* Add prediction to LPC excitation */ sLPC_Q14[ MAX_LPC_ORDER + i ] = silk_ADD_SAT32( pres_Q14[ i ], silk_LSHIFT_SAT32( LPC_pred_Q10, 4 ) ); /* Scale with gain */ pxq[ i ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( sLPC_Q14[ MAX_LPC_ORDER + i ], Gain_Q10 ), 8 ) ); } /* Update LPC filter state */ silk_memcpy( sLPC_Q14, &sLPC_Q14[ psDec->subfr_length ], MAX_LPC_ORDER * sizeof( opus_int32 ) ); pexc_Q14 += psDec->subfr_length; pxq += psDec->subfr_length; } /* Save LPC state */ silk_memcpy( psDec->sLPC_Q14_buf, sLPC_Q14, MAX_LPC_ORDER * sizeof( opus_int32 ) ); RESTORE_STACK; } mumble-1.3.4/3rdparty/opus-src/silk/inner_prod_aligned.c0000664000175000017500000000462314010707327023121 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "SigProc_FIX.h" opus_int32 silk_inner_prod_aligned_scale( const opus_int16 *const inVec1, /* I input vector 1 */ const opus_int16 *const inVec2, /* I input vector 2 */ const opus_int scale, /* I number of bits to shift */ const opus_int len /* I vector lengths */ ) { opus_int i; opus_int32 sum = 0; for( i = 0; i < len; i++ ) { sum = silk_ADD_RSHIFT32( sum, silk_SMULBB( inVec1[ i ], inVec2[ i ] ), scale ); } return sum; } mumble-1.3.4/3rdparty/opus-src/silk/sum_sqr_shift.c0000664000175000017500000000731614010707327022167 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "SigProc_FIX.h" /* Compute number of bits to right shift the sum of squares of a vector */ /* of int16s to make it fit in an int32 */ void silk_sum_sqr_shift( opus_int32 *energy, /* O Energy of x, after shifting to the right */ opus_int *shift, /* O Number of bits right shift applied to energy */ const opus_int16 *x, /* I Input vector */ opus_int len /* I Length of input vector */ ) { opus_int i, shft; opus_uint32 nrg_tmp; opus_int32 nrg; /* Do a first run with the maximum shift we could have. */ shft = 31-silk_CLZ32(len); /* Let's be conservative with rounding and start with nrg=len. */ nrg = len; for( i = 0; i < len - 1; i += 2 ) { nrg_tmp = silk_SMULBB( x[ i ], x[ i ] ); nrg_tmp = silk_SMLABB_ovflw( nrg_tmp, x[ i + 1 ], x[ i + 1 ] ); nrg = (opus_int32)silk_ADD_RSHIFT_uint( nrg, nrg_tmp, shft ); } if( i < len ) { /* One sample left to process */ nrg_tmp = silk_SMULBB( x[ i ], x[ i ] ); nrg = (opus_int32)silk_ADD_RSHIFT_uint( nrg, nrg_tmp, shft ); } silk_assert( nrg >= 0 ); /* Make sure the result will fit in a 32-bit signed integer with two bits of headroom. */ shft = silk_max_32(0, shft+3 - silk_CLZ32(nrg)); nrg = 0; for( i = 0 ; i < len - 1; i += 2 ) { nrg_tmp = silk_SMULBB( x[ i ], x[ i ] ); nrg_tmp = silk_SMLABB_ovflw( nrg_tmp, x[ i + 1 ], x[ i + 1 ] ); nrg = (opus_int32)silk_ADD_RSHIFT_uint( nrg, nrg_tmp, shft ); } if( i < len ) { /* One sample left to process */ nrg_tmp = silk_SMULBB( x[ i ], x[ i ] ); nrg = (opus_int32)silk_ADD_RSHIFT_uint( nrg, nrg_tmp, shft ); } silk_assert( nrg >= 0 ); /* Output arguments */ *shift = shft; *energy = nrg; } mumble-1.3.4/3rdparty/opus-src/silk/shell_coder.c0000664000175000017500000001704614010707327021565 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main.h" /* shell coder; pulse-subframe length is hardcoded */ static OPUS_INLINE void combine_pulses( opus_int *out, /* O combined pulses vector [len] */ const opus_int *in, /* I input vector [2 * len] */ const opus_int len /* I number of OUTPUT samples */ ) { opus_int k; for( k = 0; k < len; k++ ) { out[ k ] = in[ 2 * k ] + in[ 2 * k + 1 ]; } } static OPUS_INLINE void encode_split( ec_enc *psRangeEnc, /* I/O compressor data structure */ const opus_int p_child1, /* I pulse amplitude of first child subframe */ const opus_int p, /* I pulse amplitude of current subframe */ const opus_uint8 *shell_table /* I table of shell cdfs */ ) { if( p > 0 ) { ec_enc_icdf( psRangeEnc, p_child1, &shell_table[ silk_shell_code_table_offsets[ p ] ], 8 ); } } static OPUS_INLINE void decode_split( opus_int16 *p_child1, /* O pulse amplitude of first child subframe */ opus_int16 *p_child2, /* O pulse amplitude of second child subframe */ ec_dec *psRangeDec, /* I/O Compressor data structure */ const opus_int p, /* I pulse amplitude of current subframe */ const opus_uint8 *shell_table /* I table of shell cdfs */ ) { if( p > 0 ) { p_child1[ 0 ] = ec_dec_icdf( psRangeDec, &shell_table[ silk_shell_code_table_offsets[ p ] ], 8 ); p_child2[ 0 ] = p - p_child1[ 0 ]; } else { p_child1[ 0 ] = 0; p_child2[ 0 ] = 0; } } /* Shell encoder, operates on one shell code frame of 16 pulses */ void silk_shell_encoder( ec_enc *psRangeEnc, /* I/O compressor data structure */ const opus_int *pulses0 /* I data: nonnegative pulse amplitudes */ ) { opus_int pulses1[ 8 ], pulses2[ 4 ], pulses3[ 2 ], pulses4[ 1 ]; /* this function operates on one shell code frame of 16 pulses */ silk_assert( SHELL_CODEC_FRAME_LENGTH == 16 ); /* tree representation per pulse-subframe */ combine_pulses( pulses1, pulses0, 8 ); combine_pulses( pulses2, pulses1, 4 ); combine_pulses( pulses3, pulses2, 2 ); combine_pulses( pulses4, pulses3, 1 ); encode_split( psRangeEnc, pulses3[ 0 ], pulses4[ 0 ], silk_shell_code_table3 ); encode_split( psRangeEnc, pulses2[ 0 ], pulses3[ 0 ], silk_shell_code_table2 ); encode_split( psRangeEnc, pulses1[ 0 ], pulses2[ 0 ], silk_shell_code_table1 ); encode_split( psRangeEnc, pulses0[ 0 ], pulses1[ 0 ], silk_shell_code_table0 ); encode_split( psRangeEnc, pulses0[ 2 ], pulses1[ 1 ], silk_shell_code_table0 ); encode_split( psRangeEnc, pulses1[ 2 ], pulses2[ 1 ], silk_shell_code_table1 ); encode_split( psRangeEnc, pulses0[ 4 ], pulses1[ 2 ], silk_shell_code_table0 ); encode_split( psRangeEnc, pulses0[ 6 ], pulses1[ 3 ], silk_shell_code_table0 ); encode_split( psRangeEnc, pulses2[ 2 ], pulses3[ 1 ], silk_shell_code_table2 ); encode_split( psRangeEnc, pulses1[ 4 ], pulses2[ 2 ], silk_shell_code_table1 ); encode_split( psRangeEnc, pulses0[ 8 ], pulses1[ 4 ], silk_shell_code_table0 ); encode_split( psRangeEnc, pulses0[ 10 ], pulses1[ 5 ], silk_shell_code_table0 ); encode_split( psRangeEnc, pulses1[ 6 ], pulses2[ 3 ], silk_shell_code_table1 ); encode_split( psRangeEnc, pulses0[ 12 ], pulses1[ 6 ], silk_shell_code_table0 ); encode_split( psRangeEnc, pulses0[ 14 ], pulses1[ 7 ], silk_shell_code_table0 ); } /* Shell decoder, operates on one shell code frame of 16 pulses */ void silk_shell_decoder( opus_int16 *pulses0, /* O data: nonnegative pulse amplitudes */ ec_dec *psRangeDec, /* I/O Compressor data structure */ const opus_int pulses4 /* I number of pulses per pulse-subframe */ ) { opus_int16 pulses3[ 2 ], pulses2[ 4 ], pulses1[ 8 ]; /* this function operates on one shell code frame of 16 pulses */ silk_assert( SHELL_CODEC_FRAME_LENGTH == 16 ); decode_split( &pulses3[ 0 ], &pulses3[ 1 ], psRangeDec, pulses4, silk_shell_code_table3 ); decode_split( &pulses2[ 0 ], &pulses2[ 1 ], psRangeDec, pulses3[ 0 ], silk_shell_code_table2 ); decode_split( &pulses1[ 0 ], &pulses1[ 1 ], psRangeDec, pulses2[ 0 ], silk_shell_code_table1 ); decode_split( &pulses0[ 0 ], &pulses0[ 1 ], psRangeDec, pulses1[ 0 ], silk_shell_code_table0 ); decode_split( &pulses0[ 2 ], &pulses0[ 3 ], psRangeDec, pulses1[ 1 ], silk_shell_code_table0 ); decode_split( &pulses1[ 2 ], &pulses1[ 3 ], psRangeDec, pulses2[ 1 ], silk_shell_code_table1 ); decode_split( &pulses0[ 4 ], &pulses0[ 5 ], psRangeDec, pulses1[ 2 ], silk_shell_code_table0 ); decode_split( &pulses0[ 6 ], &pulses0[ 7 ], psRangeDec, pulses1[ 3 ], silk_shell_code_table0 ); decode_split( &pulses2[ 2 ], &pulses2[ 3 ], psRangeDec, pulses3[ 1 ], silk_shell_code_table2 ); decode_split( &pulses1[ 4 ], &pulses1[ 5 ], psRangeDec, pulses2[ 2 ], silk_shell_code_table1 ); decode_split( &pulses0[ 8 ], &pulses0[ 9 ], psRangeDec, pulses1[ 4 ], silk_shell_code_table0 ); decode_split( &pulses0[ 10 ], &pulses0[ 11 ], psRangeDec, pulses1[ 5 ], silk_shell_code_table0 ); decode_split( &pulses1[ 6 ], &pulses1[ 7 ], psRangeDec, pulses2[ 3 ], silk_shell_code_table1 ); decode_split( &pulses0[ 12 ], &pulses0[ 13 ], psRangeDec, pulses1[ 6 ], silk_shell_code_table0 ); decode_split( &pulses0[ 14 ], &pulses0[ 15 ], psRangeDec, pulses1[ 7 ], silk_shell_code_table0 ); } mumble-1.3.4/3rdparty/opus-src/silk/resampler_private_IIR_FIR.c0000664000175000017500000001215714010707327024227 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "SigProc_FIX.h" #include "resampler_private.h" #include "stack_alloc.h" static OPUS_INLINE opus_int16 *silk_resampler_private_IIR_FIR_INTERPOL( opus_int16 *out, opus_int16 *buf, opus_int32 max_index_Q16, opus_int32 index_increment_Q16 ) { opus_int32 index_Q16, res_Q15; opus_int16 *buf_ptr; opus_int32 table_index; /* Interpolate upsampled signal and store in output array */ for( index_Q16 = 0; index_Q16 < max_index_Q16; index_Q16 += index_increment_Q16 ) { table_index = silk_SMULWB( index_Q16 & 0xFFFF, 12 ); buf_ptr = &buf[ index_Q16 >> 16 ]; res_Q15 = silk_SMULBB( buf_ptr[ 0 ], silk_resampler_frac_FIR_12[ table_index ][ 0 ] ); res_Q15 = silk_SMLABB( res_Q15, buf_ptr[ 1 ], silk_resampler_frac_FIR_12[ table_index ][ 1 ] ); res_Q15 = silk_SMLABB( res_Q15, buf_ptr[ 2 ], silk_resampler_frac_FIR_12[ table_index ][ 2 ] ); res_Q15 = silk_SMLABB( res_Q15, buf_ptr[ 3 ], silk_resampler_frac_FIR_12[ table_index ][ 3 ] ); res_Q15 = silk_SMLABB( res_Q15, buf_ptr[ 4 ], silk_resampler_frac_FIR_12[ 11 - table_index ][ 3 ] ); res_Q15 = silk_SMLABB( res_Q15, buf_ptr[ 5 ], silk_resampler_frac_FIR_12[ 11 - table_index ][ 2 ] ); res_Q15 = silk_SMLABB( res_Q15, buf_ptr[ 6 ], silk_resampler_frac_FIR_12[ 11 - table_index ][ 1 ] ); res_Q15 = silk_SMLABB( res_Q15, buf_ptr[ 7 ], silk_resampler_frac_FIR_12[ 11 - table_index ][ 0 ] ); *out++ = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( res_Q15, 15 ) ); } return out; } /* Upsample using a combination of allpass-based 2x upsampling and FIR interpolation */ void silk_resampler_private_IIR_FIR( void *SS, /* I/O Resampler state */ opus_int16 out[], /* O Output signal */ const opus_int16 in[], /* I Input signal */ opus_int32 inLen /* I Number of input samples */ ) { silk_resampler_state_struct *S = (silk_resampler_state_struct *)SS; opus_int32 nSamplesIn; opus_int32 max_index_Q16, index_increment_Q16; VARDECL( opus_int16, buf ); SAVE_STACK; ALLOC( buf, 2 * S->batchSize + RESAMPLER_ORDER_FIR_12, opus_int16 ); /* Copy buffered samples to start of buffer */ silk_memcpy( buf, S->sFIR.i16, RESAMPLER_ORDER_FIR_12 * sizeof( opus_int16 ) ); /* Iterate over blocks of frameSizeIn input samples */ index_increment_Q16 = S->invRatio_Q16; while( 1 ) { nSamplesIn = silk_min( inLen, S->batchSize ); /* Upsample 2x */ silk_resampler_private_up2_HQ( S->sIIR, &buf[ RESAMPLER_ORDER_FIR_12 ], in, nSamplesIn ); max_index_Q16 = silk_LSHIFT32( nSamplesIn, 16 + 1 ); /* + 1 because 2x upsampling */ out = silk_resampler_private_IIR_FIR_INTERPOL( out, buf, max_index_Q16, index_increment_Q16 ); in += nSamplesIn; inLen -= nSamplesIn; if( inLen > 0 ) { /* More iterations to do; copy last part of filtered signal to beginning of buffer */ silk_memcpy( buf, &buf[ nSamplesIn << 1 ], RESAMPLER_ORDER_FIR_12 * sizeof( opus_int16 ) ); } else { break; } } /* Copy last part of filtered signal to the state for the next call */ silk_memcpy( S->sFIR.i16, &buf[ nSamplesIn << 1 ], RESAMPLER_ORDER_FIR_12 * sizeof( opus_int16 ) ); RESTORE_STACK; } mumble-1.3.4/3rdparty/opus-src/silk/decode_pulses.c0000664000175000017500000001273614010707327022121 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main.h" /*********************************************/ /* Decode quantization indices of excitation */ /*********************************************/ void silk_decode_pulses( ec_dec *psRangeDec, /* I/O Compressor data structure */ opus_int16 pulses[], /* O Excitation signal */ const opus_int signalType, /* I Sigtype */ const opus_int quantOffsetType, /* I quantOffsetType */ const opus_int frame_length /* I Frame length */ ) { opus_int i, j, k, iter, abs_q, nLS, RateLevelIndex; opus_int sum_pulses[ MAX_NB_SHELL_BLOCKS ], nLshifts[ MAX_NB_SHELL_BLOCKS ]; opus_int16 *pulses_ptr; const opus_uint8 *cdf_ptr; /*********************/ /* Decode rate level */ /*********************/ RateLevelIndex = ec_dec_icdf( psRangeDec, silk_rate_levels_iCDF[ signalType >> 1 ], 8 ); /* Calculate number of shell blocks */ silk_assert( 1 << LOG2_SHELL_CODEC_FRAME_LENGTH == SHELL_CODEC_FRAME_LENGTH ); iter = silk_RSHIFT( frame_length, LOG2_SHELL_CODEC_FRAME_LENGTH ); if( iter * SHELL_CODEC_FRAME_LENGTH < frame_length ) { silk_assert( frame_length == 12 * 10 ); /* Make sure only happens for 10 ms @ 12 kHz */ iter++; } /***************************************************/ /* Sum-Weighted-Pulses Decoding */ /***************************************************/ cdf_ptr = silk_pulses_per_block_iCDF[ RateLevelIndex ]; for( i = 0; i < iter; i++ ) { nLshifts[ i ] = 0; sum_pulses[ i ] = ec_dec_icdf( psRangeDec, cdf_ptr, 8 ); /* LSB indication */ while( sum_pulses[ i ] == SILK_MAX_PULSES + 1 ) { nLshifts[ i ]++; /* When we've already got 10 LSBs, we shift the table to not allow (SILK_MAX_PULSES + 1) */ sum_pulses[ i ] = ec_dec_icdf( psRangeDec, silk_pulses_per_block_iCDF[ N_RATE_LEVELS - 1] + ( nLshifts[ i ] == 10 ), 8 ); } } /***************************************************/ /* Shell decoding */ /***************************************************/ for( i = 0; i < iter; i++ ) { if( sum_pulses[ i ] > 0 ) { silk_shell_decoder( &pulses[ silk_SMULBB( i, SHELL_CODEC_FRAME_LENGTH ) ], psRangeDec, sum_pulses[ i ] ); } else { silk_memset( &pulses[ silk_SMULBB( i, SHELL_CODEC_FRAME_LENGTH ) ], 0, SHELL_CODEC_FRAME_LENGTH * sizeof( pulses[0] ) ); } } /***************************************************/ /* LSB Decoding */ /***************************************************/ for( i = 0; i < iter; i++ ) { if( nLshifts[ i ] > 0 ) { nLS = nLshifts[ i ]; pulses_ptr = &pulses[ silk_SMULBB( i, SHELL_CODEC_FRAME_LENGTH ) ]; for( k = 0; k < SHELL_CODEC_FRAME_LENGTH; k++ ) { abs_q = pulses_ptr[ k ]; for( j = 0; j < nLS; j++ ) { abs_q = silk_LSHIFT( abs_q, 1 ); abs_q += ec_dec_icdf( psRangeDec, silk_lsb_iCDF, 8 ); } pulses_ptr[ k ] = abs_q; } /* Mark the number of pulses non-zero for sign decoding. */ sum_pulses[ i ] |= nLS << 5; } } /****************************************/ /* Decode and add signs to pulse signal */ /****************************************/ silk_decode_signs( psRangeDec, pulses, frame_length, signalType, quantOffsetType, sum_pulses ); } mumble-1.3.4/3rdparty/opus-src/silk/stereo_encode_pred.c0000664000175000017500000000550514010707327023127 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main.h" /* Entropy code the mid/side quantization indices */ void silk_stereo_encode_pred( ec_enc *psRangeEnc, /* I/O Compressor data structure */ opus_int8 ix[ 2 ][ 3 ] /* I Quantization indices */ ) { opus_int n; /* Entropy coding */ n = 5 * ix[ 0 ][ 2 ] + ix[ 1 ][ 2 ]; silk_assert( n < 25 ); ec_enc_icdf( psRangeEnc, n, silk_stereo_pred_joint_iCDF, 8 ); for( n = 0; n < 2; n++ ) { silk_assert( ix[ n ][ 0 ] < 3 ); silk_assert( ix[ n ][ 1 ] < STEREO_QUANT_SUB_STEPS ); ec_enc_icdf( psRangeEnc, ix[ n ][ 0 ], silk_uniform3_iCDF, 8 ); ec_enc_icdf( psRangeEnc, ix[ n ][ 1 ], silk_uniform5_iCDF, 8 ); } } /* Entropy code the mid-only flag */ void silk_stereo_encode_mid_only( ec_enc *psRangeEnc, /* I/O Compressor data structure */ opus_int8 mid_only_flag ) { /* Encode flag that only mid channel is coded */ ec_enc_icdf( psRangeEnc, mid_only_flag, silk_stereo_only_code_mid_iCDF, 8 ); } mumble-1.3.4/3rdparty/opus-src/silk/interpolate.c0000664000175000017500000000505114010707327021621 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main.h" /* Interpolate two vectors */ void silk_interpolate( opus_int16 xi[ MAX_LPC_ORDER ], /* O interpolated vector */ const opus_int16 x0[ MAX_LPC_ORDER ], /* I first vector */ const opus_int16 x1[ MAX_LPC_ORDER ], /* I second vector */ const opus_int ifact_Q2, /* I interp. factor, weight on 2nd vector */ const opus_int d /* I number of parameters */ ) { opus_int i; silk_assert( ifact_Q2 >= 0 ); silk_assert( ifact_Q2 <= 4 ); for( i = 0; i < d; i++ ) { xi[ i ] = (opus_int16)silk_ADD_RSHIFT( x0[ i ], silk_SMULBB( x1[ i ] - x0[ i ], ifact_Q2 ), 2 ); } } mumble-1.3.4/3rdparty/opus-src/silk/PLC.c0000664000175000017500000004774314010707327017727 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main.h" #include "stack_alloc.h" #include "PLC.h" #define NB_ATT 2 static const opus_int16 HARM_ATT_Q15[NB_ATT] = { 32440, 31130 }; /* 0.99, 0.95 */ static const opus_int16 PLC_RAND_ATTENUATE_V_Q15[NB_ATT] = { 31130, 26214 }; /* 0.95, 0.8 */ static const opus_int16 PLC_RAND_ATTENUATE_UV_Q15[NB_ATT] = { 32440, 29491 }; /* 0.99, 0.9 */ static OPUS_INLINE void silk_PLC_update( silk_decoder_state *psDec, /* I/O Decoder state */ silk_decoder_control *psDecCtrl /* I/O Decoder control */ ); static OPUS_INLINE void silk_PLC_conceal( silk_decoder_state *psDec, /* I/O Decoder state */ silk_decoder_control *psDecCtrl, /* I/O Decoder control */ opus_int16 frame[], /* O LPC residual signal */ int arch /* I Run-time architecture */ ); void silk_PLC_Reset( silk_decoder_state *psDec /* I/O Decoder state */ ) { psDec->sPLC.pitchL_Q8 = silk_LSHIFT( psDec->frame_length, 8 - 1 ); psDec->sPLC.prevGain_Q16[ 0 ] = SILK_FIX_CONST( 1, 16 ); psDec->sPLC.prevGain_Q16[ 1 ] = SILK_FIX_CONST( 1, 16 ); psDec->sPLC.subfr_length = 20; psDec->sPLC.nb_subfr = 2; } void silk_PLC( silk_decoder_state *psDec, /* I/O Decoder state */ silk_decoder_control *psDecCtrl, /* I/O Decoder control */ opus_int16 frame[], /* I/O signal */ opus_int lost, /* I Loss flag */ int arch /* I Run-time architecture */ ) { /* PLC control function */ if( psDec->fs_kHz != psDec->sPLC.fs_kHz ) { silk_PLC_Reset( psDec ); psDec->sPLC.fs_kHz = psDec->fs_kHz; } if( lost ) { /****************************/ /* Generate Signal */ /****************************/ silk_PLC_conceal( psDec, psDecCtrl, frame, arch ); psDec->lossCnt++; } else { /****************************/ /* Update state */ /****************************/ silk_PLC_update( psDec, psDecCtrl ); } } /**************************************************/ /* Update state of PLC */ /**************************************************/ static OPUS_INLINE void silk_PLC_update( silk_decoder_state *psDec, /* I/O Decoder state */ silk_decoder_control *psDecCtrl /* I/O Decoder control */ ) { opus_int32 LTP_Gain_Q14, temp_LTP_Gain_Q14; opus_int i, j; silk_PLC_struct *psPLC; psPLC = &psDec->sPLC; /* Update parameters used in case of packet loss */ psDec->prevSignalType = psDec->indices.signalType; LTP_Gain_Q14 = 0; if( psDec->indices.signalType == TYPE_VOICED ) { /* Find the parameters for the last subframe which contains a pitch pulse */ for( j = 0; j * psDec->subfr_length < psDecCtrl->pitchL[ psDec->nb_subfr - 1 ]; j++ ) { if( j == psDec->nb_subfr ) { break; } temp_LTP_Gain_Q14 = 0; for( i = 0; i < LTP_ORDER; i++ ) { temp_LTP_Gain_Q14 += psDecCtrl->LTPCoef_Q14[ ( psDec->nb_subfr - 1 - j ) * LTP_ORDER + i ]; } if( temp_LTP_Gain_Q14 > LTP_Gain_Q14 ) { LTP_Gain_Q14 = temp_LTP_Gain_Q14; silk_memcpy( psPLC->LTPCoef_Q14, &psDecCtrl->LTPCoef_Q14[ silk_SMULBB( psDec->nb_subfr - 1 - j, LTP_ORDER ) ], LTP_ORDER * sizeof( opus_int16 ) ); psPLC->pitchL_Q8 = silk_LSHIFT( psDecCtrl->pitchL[ psDec->nb_subfr - 1 - j ], 8 ); } } silk_memset( psPLC->LTPCoef_Q14, 0, LTP_ORDER * sizeof( opus_int16 ) ); psPLC->LTPCoef_Q14[ LTP_ORDER / 2 ] = LTP_Gain_Q14; /* Limit LT coefs */ if( LTP_Gain_Q14 < V_PITCH_GAIN_START_MIN_Q14 ) { opus_int scale_Q10; opus_int32 tmp; tmp = silk_LSHIFT( V_PITCH_GAIN_START_MIN_Q14, 10 ); scale_Q10 = silk_DIV32( tmp, silk_max( LTP_Gain_Q14, 1 ) ); for( i = 0; i < LTP_ORDER; i++ ) { psPLC->LTPCoef_Q14[ i ] = silk_RSHIFT( silk_SMULBB( psPLC->LTPCoef_Q14[ i ], scale_Q10 ), 10 ); } } else if( LTP_Gain_Q14 > V_PITCH_GAIN_START_MAX_Q14 ) { opus_int scale_Q14; opus_int32 tmp; tmp = silk_LSHIFT( V_PITCH_GAIN_START_MAX_Q14, 14 ); scale_Q14 = silk_DIV32( tmp, silk_max( LTP_Gain_Q14, 1 ) ); for( i = 0; i < LTP_ORDER; i++ ) { psPLC->LTPCoef_Q14[ i ] = silk_RSHIFT( silk_SMULBB( psPLC->LTPCoef_Q14[ i ], scale_Q14 ), 14 ); } } } else { psPLC->pitchL_Q8 = silk_LSHIFT( silk_SMULBB( psDec->fs_kHz, 18 ), 8 ); silk_memset( psPLC->LTPCoef_Q14, 0, LTP_ORDER * sizeof( opus_int16 )); } /* Save LPC coeficients */ silk_memcpy( psPLC->prevLPC_Q12, psDecCtrl->PredCoef_Q12[ 1 ], psDec->LPC_order * sizeof( opus_int16 ) ); psPLC->prevLTP_scale_Q14 = psDecCtrl->LTP_scale_Q14; /* Save last two gains */ silk_memcpy( psPLC->prevGain_Q16, &psDecCtrl->Gains_Q16[ psDec->nb_subfr - 2 ], 2 * sizeof( opus_int32 ) ); psPLC->subfr_length = psDec->subfr_length; psPLC->nb_subfr = psDec->nb_subfr; } static OPUS_INLINE void silk_PLC_energy(opus_int32 *energy1, opus_int *shift1, opus_int32 *energy2, opus_int *shift2, const opus_int32 *exc_Q14, const opus_int32 *prevGain_Q10, int subfr_length, int nb_subfr) { int i, k; VARDECL( opus_int16, exc_buf ); opus_int16 *exc_buf_ptr; SAVE_STACK; ALLOC( exc_buf, 2*subfr_length, opus_int16 ); /* Find random noise component */ /* Scale previous excitation signal */ exc_buf_ptr = exc_buf; for( k = 0; k < 2; k++ ) { for( i = 0; i < subfr_length; i++ ) { exc_buf_ptr[ i ] = (opus_int16)silk_SAT16( silk_RSHIFT( silk_SMULWW( exc_Q14[ i + ( k + nb_subfr - 2 ) * subfr_length ], prevGain_Q10[ k ] ), 8 ) ); } exc_buf_ptr += subfr_length; } /* Find the subframe with lowest energy of the last two and use that as random noise generator */ silk_sum_sqr_shift( energy1, shift1, exc_buf, subfr_length ); silk_sum_sqr_shift( energy2, shift2, &exc_buf[ subfr_length ], subfr_length ); RESTORE_STACK; } static OPUS_INLINE void silk_PLC_conceal( silk_decoder_state *psDec, /* I/O Decoder state */ silk_decoder_control *psDecCtrl, /* I/O Decoder control */ opus_int16 frame[], /* O LPC residual signal */ int arch /* I Run-time architecture */ ) { opus_int i, j, k; opus_int lag, idx, sLTP_buf_idx, shift1, shift2; opus_int32 rand_seed, harm_Gain_Q15, rand_Gain_Q15, inv_gain_Q30; opus_int32 energy1, energy2, *rand_ptr, *pred_lag_ptr; opus_int32 LPC_pred_Q10, LTP_pred_Q12; opus_int16 rand_scale_Q14; opus_int16 *B_Q14; opus_int32 *sLPC_Q14_ptr; opus_int16 A_Q12[ MAX_LPC_ORDER ]; #ifdef SMALL_FOOTPRINT opus_int16 *sLTP; #else VARDECL( opus_int16, sLTP ); #endif VARDECL( opus_int32, sLTP_Q14 ); silk_PLC_struct *psPLC = &psDec->sPLC; opus_int32 prevGain_Q10[2]; SAVE_STACK; ALLOC( sLTP_Q14, psDec->ltp_mem_length + psDec->frame_length, opus_int32 ); #ifdef SMALL_FOOTPRINT /* Ugly hack that breaks aliasing rules to save stack: put sLTP at the very end of sLTP_Q14. */ sLTP = ((opus_int16*)&sLTP_Q14[psDec->ltp_mem_length + psDec->frame_length])-psDec->ltp_mem_length; #else ALLOC( sLTP, psDec->ltp_mem_length, opus_int16 ); #endif prevGain_Q10[0] = silk_RSHIFT( psPLC->prevGain_Q16[ 0 ], 6); prevGain_Q10[1] = silk_RSHIFT( psPLC->prevGain_Q16[ 1 ], 6); if( psDec->first_frame_after_reset ) { silk_memset( psPLC->prevLPC_Q12, 0, sizeof( psPLC->prevLPC_Q12 ) ); } silk_PLC_energy(&energy1, &shift1, &energy2, &shift2, psDec->exc_Q14, prevGain_Q10, psDec->subfr_length, psDec->nb_subfr); if( silk_RSHIFT( energy1, shift2 ) < silk_RSHIFT( energy2, shift1 ) ) { /* First sub-frame has lowest energy */ rand_ptr = &psDec->exc_Q14[ silk_max_int( 0, ( psPLC->nb_subfr - 1 ) * psPLC->subfr_length - RAND_BUF_SIZE ) ]; } else { /* Second sub-frame has lowest energy */ rand_ptr = &psDec->exc_Q14[ silk_max_int( 0, psPLC->nb_subfr * psPLC->subfr_length - RAND_BUF_SIZE ) ]; } /* Set up Gain to random noise component */ B_Q14 = psPLC->LTPCoef_Q14; rand_scale_Q14 = psPLC->randScale_Q14; /* Set up attenuation gains */ harm_Gain_Q15 = HARM_ATT_Q15[ silk_min_int( NB_ATT - 1, psDec->lossCnt ) ]; if( psDec->prevSignalType == TYPE_VOICED ) { rand_Gain_Q15 = PLC_RAND_ATTENUATE_V_Q15[ silk_min_int( NB_ATT - 1, psDec->lossCnt ) ]; } else { rand_Gain_Q15 = PLC_RAND_ATTENUATE_UV_Q15[ silk_min_int( NB_ATT - 1, psDec->lossCnt ) ]; } /* LPC concealment. Apply BWE to previous LPC */ silk_bwexpander( psPLC->prevLPC_Q12, psDec->LPC_order, SILK_FIX_CONST( BWE_COEF, 16 ) ); /* Preload LPC coeficients to array on stack. Gives small performance gain */ silk_memcpy( A_Q12, psPLC->prevLPC_Q12, psDec->LPC_order * sizeof( opus_int16 ) ); /* First Lost frame */ if( psDec->lossCnt == 0 ) { rand_scale_Q14 = 1 << 14; /* Reduce random noise Gain for voiced frames */ if( psDec->prevSignalType == TYPE_VOICED ) { for( i = 0; i < LTP_ORDER; i++ ) { rand_scale_Q14 -= B_Q14[ i ]; } rand_scale_Q14 = silk_max_16( 3277, rand_scale_Q14 ); /* 0.2 */ rand_scale_Q14 = (opus_int16)silk_RSHIFT( silk_SMULBB( rand_scale_Q14, psPLC->prevLTP_scale_Q14 ), 14 ); } else { /* Reduce random noise for unvoiced frames with high LPC gain */ opus_int32 invGain_Q30, down_scale_Q30; invGain_Q30 = silk_LPC_inverse_pred_gain( psPLC->prevLPC_Q12, psDec->LPC_order, arch ); down_scale_Q30 = silk_min_32( silk_RSHIFT( (opus_int32)1 << 30, LOG2_INV_LPC_GAIN_HIGH_THRES ), invGain_Q30 ); down_scale_Q30 = silk_max_32( silk_RSHIFT( (opus_int32)1 << 30, LOG2_INV_LPC_GAIN_LOW_THRES ), down_scale_Q30 ); down_scale_Q30 = silk_LSHIFT( down_scale_Q30, LOG2_INV_LPC_GAIN_HIGH_THRES ); rand_Gain_Q15 = silk_RSHIFT( silk_SMULWB( down_scale_Q30, rand_Gain_Q15 ), 14 ); } } rand_seed = psPLC->rand_seed; lag = silk_RSHIFT_ROUND( psPLC->pitchL_Q8, 8 ); sLTP_buf_idx = psDec->ltp_mem_length; /* Rewhiten LTP state */ idx = psDec->ltp_mem_length - lag - psDec->LPC_order - LTP_ORDER / 2; silk_assert( idx > 0 ); silk_LPC_analysis_filter( &sLTP[ idx ], &psDec->outBuf[ idx ], A_Q12, psDec->ltp_mem_length - idx, psDec->LPC_order, arch ); /* Scale LTP state */ inv_gain_Q30 = silk_INVERSE32_varQ( psPLC->prevGain_Q16[ 1 ], 46 ); inv_gain_Q30 = silk_min( inv_gain_Q30, silk_int32_MAX >> 1 ); for( i = idx + psDec->LPC_order; i < psDec->ltp_mem_length; i++ ) { sLTP_Q14[ i ] = silk_SMULWB( inv_gain_Q30, sLTP[ i ] ); } /***************************/ /* LTP synthesis filtering */ /***************************/ for( k = 0; k < psDec->nb_subfr; k++ ) { /* Set up pointer */ pred_lag_ptr = &sLTP_Q14[ sLTP_buf_idx - lag + LTP_ORDER / 2 ]; for( i = 0; i < psDec->subfr_length; i++ ) { /* Unrolled loop */ /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ LTP_pred_Q12 = 2; LTP_pred_Q12 = silk_SMLAWB( LTP_pred_Q12, pred_lag_ptr[ 0 ], B_Q14[ 0 ] ); LTP_pred_Q12 = silk_SMLAWB( LTP_pred_Q12, pred_lag_ptr[ -1 ], B_Q14[ 1 ] ); LTP_pred_Q12 = silk_SMLAWB( LTP_pred_Q12, pred_lag_ptr[ -2 ], B_Q14[ 2 ] ); LTP_pred_Q12 = silk_SMLAWB( LTP_pred_Q12, pred_lag_ptr[ -3 ], B_Q14[ 3 ] ); LTP_pred_Q12 = silk_SMLAWB( LTP_pred_Q12, pred_lag_ptr[ -4 ], B_Q14[ 4 ] ); pred_lag_ptr++; /* Generate LPC excitation */ rand_seed = silk_RAND( rand_seed ); idx = silk_RSHIFT( rand_seed, 25 ) & RAND_BUF_MASK; sLTP_Q14[ sLTP_buf_idx ] = silk_LSHIFT32( silk_SMLAWB( LTP_pred_Q12, rand_ptr[ idx ], rand_scale_Q14 ), 2 ); sLTP_buf_idx++; } /* Gradually reduce LTP gain */ for( j = 0; j < LTP_ORDER; j++ ) { B_Q14[ j ] = silk_RSHIFT( silk_SMULBB( harm_Gain_Q15, B_Q14[ j ] ), 15 ); } if ( psDec->indices.signalType != TYPE_NO_VOICE_ACTIVITY ) { /* Gradually reduce excitation gain */ rand_scale_Q14 = silk_RSHIFT( silk_SMULBB( rand_scale_Q14, rand_Gain_Q15 ), 15 ); } /* Slowly increase pitch lag */ psPLC->pitchL_Q8 = silk_SMLAWB( psPLC->pitchL_Q8, psPLC->pitchL_Q8, PITCH_DRIFT_FAC_Q16 ); psPLC->pitchL_Q8 = silk_min_32( psPLC->pitchL_Q8, silk_LSHIFT( silk_SMULBB( MAX_PITCH_LAG_MS, psDec->fs_kHz ), 8 ) ); lag = silk_RSHIFT_ROUND( psPLC->pitchL_Q8, 8 ); } /***************************/ /* LPC synthesis filtering */ /***************************/ sLPC_Q14_ptr = &sLTP_Q14[ psDec->ltp_mem_length - MAX_LPC_ORDER ]; /* Copy LPC state */ silk_memcpy( sLPC_Q14_ptr, psDec->sLPC_Q14_buf, MAX_LPC_ORDER * sizeof( opus_int32 ) ); silk_assert( psDec->LPC_order >= 10 ); /* check that unrolling works */ for( i = 0; i < psDec->frame_length; i++ ) { /* partly unrolled */ /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ LPC_pred_Q10 = silk_RSHIFT( psDec->LPC_order, 1 ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14_ptr[ MAX_LPC_ORDER + i - 1 ], A_Q12[ 0 ] ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14_ptr[ MAX_LPC_ORDER + i - 2 ], A_Q12[ 1 ] ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14_ptr[ MAX_LPC_ORDER + i - 3 ], A_Q12[ 2 ] ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14_ptr[ MAX_LPC_ORDER + i - 4 ], A_Q12[ 3 ] ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14_ptr[ MAX_LPC_ORDER + i - 5 ], A_Q12[ 4 ] ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14_ptr[ MAX_LPC_ORDER + i - 6 ], A_Q12[ 5 ] ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14_ptr[ MAX_LPC_ORDER + i - 7 ], A_Q12[ 6 ] ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14_ptr[ MAX_LPC_ORDER + i - 8 ], A_Q12[ 7 ] ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14_ptr[ MAX_LPC_ORDER + i - 9 ], A_Q12[ 8 ] ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14_ptr[ MAX_LPC_ORDER + i - 10 ], A_Q12[ 9 ] ); for( j = 10; j < psDec->LPC_order; j++ ) { LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14_ptr[ MAX_LPC_ORDER + i - j - 1 ], A_Q12[ j ] ); } /* Add prediction to LPC excitation */ sLPC_Q14_ptr[ MAX_LPC_ORDER + i ] = silk_ADD_SAT32( sLPC_Q14_ptr[ MAX_LPC_ORDER + i ], silk_LSHIFT_SAT32( LPC_pred_Q10, 4 )); /* Scale with Gain */ frame[ i ] = (opus_int16)silk_SAT16( silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( sLPC_Q14_ptr[ MAX_LPC_ORDER + i ], prevGain_Q10[ 1 ] ), 8 ) ) ); } /* Save LPC state */ silk_memcpy( psDec->sLPC_Q14_buf, &sLPC_Q14_ptr[ psDec->frame_length ], MAX_LPC_ORDER * sizeof( opus_int32 ) ); /**************************************/ /* Update states */ /**************************************/ psPLC->rand_seed = rand_seed; psPLC->randScale_Q14 = rand_scale_Q14; for( i = 0; i < MAX_NB_SUBFR; i++ ) { psDecCtrl->pitchL[ i ] = lag; } RESTORE_STACK; } /* Glues concealed frames with new good received frames */ void silk_PLC_glue_frames( silk_decoder_state *psDec, /* I/O decoder state */ opus_int16 frame[], /* I/O signal */ opus_int length /* I length of signal */ ) { opus_int i, energy_shift; opus_int32 energy; silk_PLC_struct *psPLC; psPLC = &psDec->sPLC; if( psDec->lossCnt ) { /* Calculate energy in concealed residual */ silk_sum_sqr_shift( &psPLC->conc_energy, &psPLC->conc_energy_shift, frame, length ); psPLC->last_frame_lost = 1; } else { if( psDec->sPLC.last_frame_lost ) { /* Calculate residual in decoded signal if last frame was lost */ silk_sum_sqr_shift( &energy, &energy_shift, frame, length ); /* Normalize energies */ if( energy_shift > psPLC->conc_energy_shift ) { psPLC->conc_energy = silk_RSHIFT( psPLC->conc_energy, energy_shift - psPLC->conc_energy_shift ); } else if( energy_shift < psPLC->conc_energy_shift ) { energy = silk_RSHIFT( energy, psPLC->conc_energy_shift - energy_shift ); } /* Fade in the energy difference */ if( energy > psPLC->conc_energy ) { opus_int32 frac_Q24, LZ; opus_int32 gain_Q16, slope_Q16; LZ = silk_CLZ32( psPLC->conc_energy ); LZ = LZ - 1; psPLC->conc_energy = silk_LSHIFT( psPLC->conc_energy, LZ ); energy = silk_RSHIFT( energy, silk_max_32( 24 - LZ, 0 ) ); frac_Q24 = silk_DIV32( psPLC->conc_energy, silk_max( energy, 1 ) ); gain_Q16 = silk_LSHIFT( silk_SQRT_APPROX( frac_Q24 ), 4 ); slope_Q16 = silk_DIV32_16( ( (opus_int32)1 << 16 ) - gain_Q16, length ); /* Make slope 4x steeper to avoid missing onsets after DTX */ slope_Q16 = silk_LSHIFT( slope_Q16, 2 ); for( i = 0; i < length; i++ ) { frame[ i ] = silk_SMULWB( gain_Q16, frame[ i ] ); gain_Q16 += slope_Q16; if( gain_Q16 > (opus_int32)1 << 16 ) { break; } } } } psPLC->last_frame_lost = 0; } } mumble-1.3.4/3rdparty/opus-src/silk/CNG.c0000664000175000017500000002257714010707327017716 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main.h" #include "stack_alloc.h" /* Generates excitation for CNG LPC synthesis */ static OPUS_INLINE void silk_CNG_exc( opus_int32 exc_Q14[], /* O CNG excitation signal Q10 */ opus_int32 exc_buf_Q14[], /* I Random samples buffer Q10 */ opus_int length, /* I Length */ opus_int32 *rand_seed /* I/O Seed to random index generator */ ) { opus_int32 seed; opus_int i, idx, exc_mask; exc_mask = CNG_BUF_MASK_MAX; while( exc_mask > length ) { exc_mask = silk_RSHIFT( exc_mask, 1 ); } seed = *rand_seed; for( i = 0; i < length; i++ ) { seed = silk_RAND( seed ); idx = (opus_int)( silk_RSHIFT( seed, 24 ) & exc_mask ); silk_assert( idx >= 0 ); silk_assert( idx <= CNG_BUF_MASK_MAX ); exc_Q14[ i ] = exc_buf_Q14[ idx ]; } *rand_seed = seed; } void silk_CNG_Reset( silk_decoder_state *psDec /* I/O Decoder state */ ) { opus_int i, NLSF_step_Q15, NLSF_acc_Q15; NLSF_step_Q15 = silk_DIV32_16( silk_int16_MAX, psDec->LPC_order + 1 ); NLSF_acc_Q15 = 0; for( i = 0; i < psDec->LPC_order; i++ ) { NLSF_acc_Q15 += NLSF_step_Q15; psDec->sCNG.CNG_smth_NLSF_Q15[ i ] = NLSF_acc_Q15; } psDec->sCNG.CNG_smth_Gain_Q16 = 0; psDec->sCNG.rand_seed = 3176576; } /* Updates CNG estimate, and applies the CNG when packet was lost */ void silk_CNG( silk_decoder_state *psDec, /* I/O Decoder state */ silk_decoder_control *psDecCtrl, /* I/O Decoder control */ opus_int16 frame[], /* I/O Signal */ opus_int length /* I Length of residual */ ) { opus_int i, subfr; opus_int32 LPC_pred_Q10, max_Gain_Q16, gain_Q16, gain_Q10; opus_int16 A_Q12[ MAX_LPC_ORDER ]; silk_CNG_struct *psCNG = &psDec->sCNG; SAVE_STACK; if( psDec->fs_kHz != psCNG->fs_kHz ) { /* Reset state */ silk_CNG_Reset( psDec ); psCNG->fs_kHz = psDec->fs_kHz; } if( psDec->lossCnt == 0 && psDec->prevSignalType == TYPE_NO_VOICE_ACTIVITY ) { /* Update CNG parameters */ /* Smoothing of LSF's */ for( i = 0; i < psDec->LPC_order; i++ ) { psCNG->CNG_smth_NLSF_Q15[ i ] += silk_SMULWB( (opus_int32)psDec->prevNLSF_Q15[ i ] - (opus_int32)psCNG->CNG_smth_NLSF_Q15[ i ], CNG_NLSF_SMTH_Q16 ); } /* Find the subframe with the highest gain */ max_Gain_Q16 = 0; subfr = 0; for( i = 0; i < psDec->nb_subfr; i++ ) { if( psDecCtrl->Gains_Q16[ i ] > max_Gain_Q16 ) { max_Gain_Q16 = psDecCtrl->Gains_Q16[ i ]; subfr = i; } } /* Update CNG excitation buffer with excitation from this subframe */ silk_memmove( &psCNG->CNG_exc_buf_Q14[ psDec->subfr_length ], psCNG->CNG_exc_buf_Q14, ( psDec->nb_subfr - 1 ) * psDec->subfr_length * sizeof( opus_int32 ) ); silk_memcpy( psCNG->CNG_exc_buf_Q14, &psDec->exc_Q14[ subfr * psDec->subfr_length ], psDec->subfr_length * sizeof( opus_int32 ) ); /* Smooth gains */ for( i = 0; i < psDec->nb_subfr; i++ ) { psCNG->CNG_smth_Gain_Q16 += silk_SMULWB( psDecCtrl->Gains_Q16[ i ] - psCNG->CNG_smth_Gain_Q16, CNG_GAIN_SMTH_Q16 ); } } /* Add CNG when packet is lost or during DTX */ if( psDec->lossCnt ) { VARDECL( opus_int32, CNG_sig_Q14 ); ALLOC( CNG_sig_Q14, length + MAX_LPC_ORDER, opus_int32 ); /* Generate CNG excitation */ gain_Q16 = silk_SMULWW( psDec->sPLC.randScale_Q14, psDec->sPLC.prevGain_Q16[1] ); if( gain_Q16 >= (1 << 21) || psCNG->CNG_smth_Gain_Q16 > (1 << 23) ) { gain_Q16 = silk_SMULTT( gain_Q16, gain_Q16 ); gain_Q16 = silk_SUB_LSHIFT32(silk_SMULTT( psCNG->CNG_smth_Gain_Q16, psCNG->CNG_smth_Gain_Q16 ), gain_Q16, 5 ); gain_Q16 = silk_LSHIFT32( silk_SQRT_APPROX( gain_Q16 ), 16 ); } else { gain_Q16 = silk_SMULWW( gain_Q16, gain_Q16 ); gain_Q16 = silk_SUB_LSHIFT32(silk_SMULWW( psCNG->CNG_smth_Gain_Q16, psCNG->CNG_smth_Gain_Q16 ), gain_Q16, 5 ); gain_Q16 = silk_LSHIFT32( silk_SQRT_APPROX( gain_Q16 ), 8 ); } gain_Q10 = silk_RSHIFT( gain_Q16, 6 ); silk_CNG_exc( CNG_sig_Q14 + MAX_LPC_ORDER, psCNG->CNG_exc_buf_Q14, length, &psCNG->rand_seed ); /* Convert CNG NLSF to filter representation */ silk_NLSF2A( A_Q12, psCNG->CNG_smth_NLSF_Q15, psDec->LPC_order, psDec->arch ); /* Generate CNG signal, by synthesis filtering */ silk_memcpy( CNG_sig_Q14, psCNG->CNG_synth_state, MAX_LPC_ORDER * sizeof( opus_int32 ) ); for( i = 0; i < length; i++ ) { silk_assert( psDec->LPC_order == 10 || psDec->LPC_order == 16 ); /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ LPC_pred_Q10 = silk_RSHIFT( psDec->LPC_order, 1 ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 1 ], A_Q12[ 0 ] ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 2 ], A_Q12[ 1 ] ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 3 ], A_Q12[ 2 ] ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 4 ], A_Q12[ 3 ] ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 5 ], A_Q12[ 4 ] ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 6 ], A_Q12[ 5 ] ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 7 ], A_Q12[ 6 ] ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 8 ], A_Q12[ 7 ] ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 9 ], A_Q12[ 8 ] ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 10 ], A_Q12[ 9 ] ); if( psDec->LPC_order == 16 ) { LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 11 ], A_Q12[ 10 ] ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 12 ], A_Q12[ 11 ] ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 13 ], A_Q12[ 12 ] ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 14 ], A_Q12[ 13 ] ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 15 ], A_Q12[ 14 ] ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 16 ], A_Q12[ 15 ] ); } /* Update states */ CNG_sig_Q14[ MAX_LPC_ORDER + i ] = silk_ADD_SAT32( CNG_sig_Q14[ MAX_LPC_ORDER + i ], silk_LSHIFT_SAT32( LPC_pred_Q10, 4 ) ); /* Scale with Gain and add to input signal */ frame[ i ] = (opus_int16)silk_ADD_SAT16( frame[ i ], silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( CNG_sig_Q14[ MAX_LPC_ORDER + i ], gain_Q10 ), 8 ) ) ); } silk_memcpy( psCNG->CNG_synth_state, &CNG_sig_Q14[ length ], MAX_LPC_ORDER * sizeof( opus_int32 ) ); } else { silk_memset( psCNG->CNG_synth_state, 0, psDec->LPC_order * sizeof( opus_int32 ) ); } RESTORE_STACK; } mumble-1.3.4/3rdparty/opus-src/silk/init_decoder.c0000664000175000017500000000447614010707327021735 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main.h" /************************/ /* Init Decoder State */ /************************/ opus_int silk_init_decoder( silk_decoder_state *psDec /* I/O Decoder state pointer */ ) { /* Clear the entire encoder state, except anything copied */ silk_memset( psDec, 0, sizeof( silk_decoder_state ) ); /* Used to deactivate LSF interpolation */ psDec->first_frame_after_reset = 1; psDec->prev_gain_Q16 = 65536; psDec->arch = opus_select_arch(); /* Reset CNG state */ silk_CNG_Reset( psDec ); /* Reset PLC state */ silk_PLC_Reset( psDec ); return(0); } mumble-1.3.4/3rdparty/opus-src/silk/debug.c0000664000175000017500000001530114010707327020360 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "debug.h" #include "SigProc_FIX.h" #if SILK_TIC_TOC #ifdef _WIN32 #if (defined(_WIN32) || defined(_WINCE)) #include /* timer */ #else /* Linux or Mac*/ #include #endif unsigned long silk_GetHighResolutionTime(void) /* O time in usec*/ { /* Returns a time counter in microsec */ /* the resolution is platform dependent */ /* but is typically 1.62 us resolution */ LARGE_INTEGER lpPerformanceCount; LARGE_INTEGER lpFrequency; QueryPerformanceCounter(&lpPerformanceCount); QueryPerformanceFrequency(&lpFrequency); return (unsigned long)((1000000*(lpPerformanceCount.QuadPart)) / lpFrequency.QuadPart); } #else /* Linux or Mac*/ unsigned long GetHighResolutionTime(void) /* O time in usec*/ { struct timeval tv; gettimeofday(&tv, 0); return((tv.tv_sec*1000000)+(tv.tv_usec)); } #endif int silk_Timer_nTimers = 0; int silk_Timer_depth_ctr = 0; char silk_Timer_tags[silk_NUM_TIMERS_MAX][silk_NUM_TIMERS_MAX_TAG_LEN]; #ifdef WIN32 LARGE_INTEGER silk_Timer_start[silk_NUM_TIMERS_MAX]; #else unsigned long silk_Timer_start[silk_NUM_TIMERS_MAX]; #endif unsigned int silk_Timer_cnt[silk_NUM_TIMERS_MAX]; opus_int64 silk_Timer_min[silk_NUM_TIMERS_MAX]; opus_int64 silk_Timer_sum[silk_NUM_TIMERS_MAX]; opus_int64 silk_Timer_max[silk_NUM_TIMERS_MAX]; opus_int64 silk_Timer_depth[silk_NUM_TIMERS_MAX]; #ifdef WIN32 void silk_TimerSave(char *file_name) { if( silk_Timer_nTimers > 0 ) { int k; FILE *fp; LARGE_INTEGER lpFrequency; LARGE_INTEGER lpPerformanceCount1, lpPerformanceCount2; int del = 0x7FFFFFFF; double avg, sum_avg; /* estimate overhead of calling performance counters */ for( k = 0; k < 1000; k++ ) { QueryPerformanceCounter(&lpPerformanceCount1); QueryPerformanceCounter(&lpPerformanceCount2); lpPerformanceCount2.QuadPart -= lpPerformanceCount1.QuadPart; if( (int)lpPerformanceCount2.LowPart < del ) del = lpPerformanceCount2.LowPart; } QueryPerformanceFrequency(&lpFrequency); /* print results to file */ sum_avg = 0.0f; for( k = 0; k < silk_Timer_nTimers; k++ ) { if (silk_Timer_depth[k] == 0) { sum_avg += (1e6 * silk_Timer_sum[k] / silk_Timer_cnt[k] - del) / lpFrequency.QuadPart * silk_Timer_cnt[k]; } } fp = fopen(file_name, "w"); fprintf(fp, " min avg %% max count\n"); for( k = 0; k < silk_Timer_nTimers; k++ ) { if (silk_Timer_depth[k] == 0) { fprintf(fp, "%-28s", silk_Timer_tags[k]); } else if (silk_Timer_depth[k] == 1) { fprintf(fp, " %-27s", silk_Timer_tags[k]); } else if (silk_Timer_depth[k] == 2) { fprintf(fp, " %-26s", silk_Timer_tags[k]); } else if (silk_Timer_depth[k] == 3) { fprintf(fp, " %-25s", silk_Timer_tags[k]); } else { fprintf(fp, " %-24s", silk_Timer_tags[k]); } avg = (1e6 * silk_Timer_sum[k] / silk_Timer_cnt[k] - del) / lpFrequency.QuadPart; fprintf(fp, "%8.2f", (1e6 * (silk_max_64(silk_Timer_min[k] - del, 0))) / lpFrequency.QuadPart); fprintf(fp, "%12.2f %6.2f", avg, 100.0 * avg / sum_avg * silk_Timer_cnt[k]); fprintf(fp, "%12.2f", (1e6 * (silk_max_64(silk_Timer_max[k] - del, 0))) / lpFrequency.QuadPart); fprintf(fp, "%10d\n", silk_Timer_cnt[k]); } fprintf(fp, " microseconds\n"); fclose(fp); } } #else void silk_TimerSave(char *file_name) { if( silk_Timer_nTimers > 0 ) { int k; FILE *fp; /* print results to file */ fp = fopen(file_name, "w"); fprintf(fp, " min avg max count\n"); for( k = 0; k < silk_Timer_nTimers; k++ ) { if (silk_Timer_depth[k] == 0) { fprintf(fp, "%-28s", silk_Timer_tags[k]); } else if (silk_Timer_depth[k] == 1) { fprintf(fp, " %-27s", silk_Timer_tags[k]); } else if (silk_Timer_depth[k] == 2) { fprintf(fp, " %-26s", silk_Timer_tags[k]); } else if (silk_Timer_depth[k] == 3) { fprintf(fp, " %-25s", silk_Timer_tags[k]); } else { fprintf(fp, " %-24s", silk_Timer_tags[k]); } fprintf(fp, "%d ", silk_Timer_min[k]); fprintf(fp, "%f ", (double)silk_Timer_sum[k] / (double)silk_Timer_cnt[k]); fprintf(fp, "%d ", silk_Timer_max[k]); fprintf(fp, "%10d\n", silk_Timer_cnt[k]); } fprintf(fp, " microseconds\n"); fclose(fp); } } #endif #endif /* SILK_TIC_TOC */ #if SILK_DEBUG FILE *silk_debug_store_fp[ silk_NUM_STORES_MAX ]; int silk_debug_store_count = 0; #endif /* SILK_DEBUG */ mumble-1.3.4/3rdparty/opus-src/silk/check_control_input.c0000664000175000017500000001151314010707327023327 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main.h" #include "control.h" #include "errors.h" /* Check encoder control struct */ opus_int check_control_input( silk_EncControlStruct *encControl /* I Control structure */ ) { silk_assert( encControl != NULL ); if( ( ( encControl->API_sampleRate != 8000 ) && ( encControl->API_sampleRate != 12000 ) && ( encControl->API_sampleRate != 16000 ) && ( encControl->API_sampleRate != 24000 ) && ( encControl->API_sampleRate != 32000 ) && ( encControl->API_sampleRate != 44100 ) && ( encControl->API_sampleRate != 48000 ) ) || ( ( encControl->desiredInternalSampleRate != 8000 ) && ( encControl->desiredInternalSampleRate != 12000 ) && ( encControl->desiredInternalSampleRate != 16000 ) ) || ( ( encControl->maxInternalSampleRate != 8000 ) && ( encControl->maxInternalSampleRate != 12000 ) && ( encControl->maxInternalSampleRate != 16000 ) ) || ( ( encControl->minInternalSampleRate != 8000 ) && ( encControl->minInternalSampleRate != 12000 ) && ( encControl->minInternalSampleRate != 16000 ) ) || ( encControl->minInternalSampleRate > encControl->desiredInternalSampleRate ) || ( encControl->maxInternalSampleRate < encControl->desiredInternalSampleRate ) || ( encControl->minInternalSampleRate > encControl->maxInternalSampleRate ) ) { silk_assert( 0 ); return SILK_ENC_FS_NOT_SUPPORTED; } if( encControl->payloadSize_ms != 10 && encControl->payloadSize_ms != 20 && encControl->payloadSize_ms != 40 && encControl->payloadSize_ms != 60 ) { silk_assert( 0 ); return SILK_ENC_PACKET_SIZE_NOT_SUPPORTED; } if( encControl->packetLossPercentage < 0 || encControl->packetLossPercentage > 100 ) { silk_assert( 0 ); return SILK_ENC_INVALID_LOSS_RATE; } if( encControl->useDTX < 0 || encControl->useDTX > 1 ) { silk_assert( 0 ); return SILK_ENC_INVALID_DTX_SETTING; } if( encControl->useCBR < 0 || encControl->useCBR > 1 ) { silk_assert( 0 ); return SILK_ENC_INVALID_CBR_SETTING; } if( encControl->useInBandFEC < 0 || encControl->useInBandFEC > 1 ) { silk_assert( 0 ); return SILK_ENC_INVALID_INBAND_FEC_SETTING; } if( encControl->nChannelsAPI < 1 || encControl->nChannelsAPI > ENCODER_NUM_CHANNELS ) { silk_assert( 0 ); return SILK_ENC_INVALID_NUMBER_OF_CHANNELS_ERROR; } if( encControl->nChannelsInternal < 1 || encControl->nChannelsInternal > ENCODER_NUM_CHANNELS ) { silk_assert( 0 ); return SILK_ENC_INVALID_NUMBER_OF_CHANNELS_ERROR; } if( encControl->nChannelsInternal > encControl->nChannelsAPI ) { silk_assert( 0 ); return SILK_ENC_INVALID_NUMBER_OF_CHANNELS_ERROR; } if( encControl->complexity < 0 || encControl->complexity > 10 ) { silk_assert( 0 ); return SILK_ENC_INVALID_COMPLEXITY_SETTING; } return SILK_NO_ERROR; } mumble-1.3.4/3rdparty/opus-src/silk/decode_parameters.c0000664000175000017500000001262714010707327022750 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main.h" /* Decode parameters from payload */ void silk_decode_parameters( silk_decoder_state *psDec, /* I/O State */ silk_decoder_control *psDecCtrl, /* I/O Decoder control */ opus_int condCoding /* I The type of conditional coding to use */ ) { opus_int i, k, Ix; opus_int16 pNLSF_Q15[ MAX_LPC_ORDER ], pNLSF0_Q15[ MAX_LPC_ORDER ]; const opus_int8 *cbk_ptr_Q7; /* Dequant Gains */ silk_gains_dequant( psDecCtrl->Gains_Q16, psDec->indices.GainsIndices, &psDec->LastGainIndex, condCoding == CODE_CONDITIONALLY, psDec->nb_subfr ); /****************/ /* Decode NLSFs */ /****************/ silk_NLSF_decode( pNLSF_Q15, psDec->indices.NLSFIndices, psDec->psNLSF_CB ); /* Convert NLSF parameters to AR prediction filter coefficients */ silk_NLSF2A( psDecCtrl->PredCoef_Q12[ 1 ], pNLSF_Q15, psDec->LPC_order, psDec->arch ); /* If just reset, e.g., because internal Fs changed, do not allow interpolation */ /* improves the case of packet loss in the first frame after a switch */ if( psDec->first_frame_after_reset == 1 ) { psDec->indices.NLSFInterpCoef_Q2 = 4; } if( psDec->indices.NLSFInterpCoef_Q2 < 4 ) { /* Calculation of the interpolated NLSF0 vector from the interpolation factor, */ /* the previous NLSF1, and the current NLSF1 */ for( i = 0; i < psDec->LPC_order; i++ ) { pNLSF0_Q15[ i ] = psDec->prevNLSF_Q15[ i ] + silk_RSHIFT( silk_MUL( psDec->indices.NLSFInterpCoef_Q2, pNLSF_Q15[ i ] - psDec->prevNLSF_Q15[ i ] ), 2 ); } /* Convert NLSF parameters to AR prediction filter coefficients */ silk_NLSF2A( psDecCtrl->PredCoef_Q12[ 0 ], pNLSF0_Q15, psDec->LPC_order, psDec->arch ); } else { /* Copy LPC coefficients for first half from second half */ silk_memcpy( psDecCtrl->PredCoef_Q12[ 0 ], psDecCtrl->PredCoef_Q12[ 1 ], psDec->LPC_order * sizeof( opus_int16 ) ); } silk_memcpy( psDec->prevNLSF_Q15, pNLSF_Q15, psDec->LPC_order * sizeof( opus_int16 ) ); /* After a packet loss do BWE of LPC coefs */ if( psDec->lossCnt ) { silk_bwexpander( psDecCtrl->PredCoef_Q12[ 0 ], psDec->LPC_order, BWE_AFTER_LOSS_Q16 ); silk_bwexpander( psDecCtrl->PredCoef_Q12[ 1 ], psDec->LPC_order, BWE_AFTER_LOSS_Q16 ); } if( psDec->indices.signalType == TYPE_VOICED ) { /*********************/ /* Decode pitch lags */ /*********************/ /* Decode pitch values */ silk_decode_pitch( psDec->indices.lagIndex, psDec->indices.contourIndex, psDecCtrl->pitchL, psDec->fs_kHz, psDec->nb_subfr ); /* Decode Codebook Index */ cbk_ptr_Q7 = silk_LTP_vq_ptrs_Q7[ psDec->indices.PERIndex ]; /* set pointer to start of codebook */ for( k = 0; k < psDec->nb_subfr; k++ ) { Ix = psDec->indices.LTPIndex[ k ]; for( i = 0; i < LTP_ORDER; i++ ) { psDecCtrl->LTPCoef_Q14[ k * LTP_ORDER + i ] = silk_LSHIFT( cbk_ptr_Q7[ Ix * LTP_ORDER + i ], 7 ); } } /**********************/ /* Decode LTP scaling */ /**********************/ Ix = psDec->indices.LTP_scaleIndex; psDecCtrl->LTP_scale_Q14 = silk_LTPScales_table_Q14[ Ix ]; } else { silk_memset( psDecCtrl->pitchL, 0, psDec->nb_subfr * sizeof( opus_int ) ); silk_memset( psDecCtrl->LTPCoef_Q14, 0, LTP_ORDER * psDec->nb_subfr * sizeof( opus_int16 ) ); psDec->indices.PERIndex = 0; psDecCtrl->LTP_scale_Q14 = 0; } } mumble-1.3.4/3rdparty/opus-src/silk/tables_other.c0000664000175000017500000001250514010707327021750 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "structs.h" #include "define.h" #include "tables.h" #ifdef __cplusplus extern "C" { #endif /* Piece-wise linear mapping from bitrate in kbps to coding quality in dB SNR */ const opus_int32 silk_TargetRate_table_NB[ TARGET_RATE_TAB_SZ ] = { 0, 8000, 9400, 11500, 13500, 17500, 25000, MAX_TARGET_RATE_BPS }; const opus_int32 silk_TargetRate_table_MB[ TARGET_RATE_TAB_SZ ] = { 0, 9000, 12000, 14500, 18500, 24500, 35500, MAX_TARGET_RATE_BPS }; const opus_int32 silk_TargetRate_table_WB[ TARGET_RATE_TAB_SZ ] = { 0, 10500, 14000, 17000, 21500, 28500, 42000, MAX_TARGET_RATE_BPS }; const opus_int16 silk_SNR_table_Q1[ TARGET_RATE_TAB_SZ ] = { 18, 29, 38, 40, 46, 52, 62, 84 }; /* Tables for stereo predictor coding */ const opus_int16 silk_stereo_pred_quant_Q13[ STEREO_QUANT_TAB_SIZE ] = { -13732, -10050, -8266, -7526, -6500, -5000, -2950, -820, 820, 2950, 5000, 6500, 7526, 8266, 10050, 13732 }; const opus_uint8 silk_stereo_pred_joint_iCDF[ 25 ] = { 249, 247, 246, 245, 244, 234, 210, 202, 201, 200, 197, 174, 82, 59, 56, 55, 54, 46, 22, 12, 11, 10, 9, 7, 0 }; const opus_uint8 silk_stereo_only_code_mid_iCDF[ 2 ] = { 64, 0 }; /* Tables for LBRR flags */ static const opus_uint8 silk_LBRR_flags_2_iCDF[ 3 ] = { 203, 150, 0 }; static const opus_uint8 silk_LBRR_flags_3_iCDF[ 7 ] = { 215, 195, 166, 125, 110, 82, 0 }; const opus_uint8 * const silk_LBRR_flags_iCDF_ptr[ 2 ] = { silk_LBRR_flags_2_iCDF, silk_LBRR_flags_3_iCDF }; /* Table for LSB coding */ const opus_uint8 silk_lsb_iCDF[ 2 ] = { 120, 0 }; /* Tables for LTPScale */ const opus_uint8 silk_LTPscale_iCDF[ 3 ] = { 128, 64, 0 }; /* Tables for signal type and offset coding */ const opus_uint8 silk_type_offset_VAD_iCDF[ 4 ] = { 232, 158, 10, 0 }; const opus_uint8 silk_type_offset_no_VAD_iCDF[ 2 ] = { 230, 0 }; /* Tables for NLSF interpolation factor */ const opus_uint8 silk_NLSF_interpolation_factor_iCDF[ 5 ] = { 243, 221, 192, 181, 0 }; /* Quantization offsets */ const opus_int16 silk_Quantization_Offsets_Q10[ 2 ][ 2 ] = { { OFFSET_UVL_Q10, OFFSET_UVH_Q10 }, { OFFSET_VL_Q10, OFFSET_VH_Q10 } }; /* Table for LTPScale */ const opus_int16 silk_LTPScales_table_Q14[ 3 ] = { 15565, 12288, 8192 }; /* Uniform entropy tables */ const opus_uint8 silk_uniform3_iCDF[ 3 ] = { 171, 85, 0 }; const opus_uint8 silk_uniform4_iCDF[ 4 ] = { 192, 128, 64, 0 }; const opus_uint8 silk_uniform5_iCDF[ 5 ] = { 205, 154, 102, 51, 0 }; const opus_uint8 silk_uniform6_iCDF[ 6 ] = { 213, 171, 128, 85, 43, 0 }; const opus_uint8 silk_uniform8_iCDF[ 8 ] = { 224, 192, 160, 128, 96, 64, 32, 0 }; const opus_uint8 silk_NLSF_EXT_iCDF[ 7 ] = { 100, 40, 16, 7, 3, 1, 0 }; /* Elliptic/Cauer filters designed with 0.1 dB passband ripple, 80 dB minimum stopband attenuation, and [0.95 : 0.15 : 0.35] normalized cut off frequencies. */ /* Interpolation points for filter coefficients used in the bandwidth transition smoother */ const opus_int32 silk_Transition_LP_B_Q28[ TRANSITION_INT_NUM ][ TRANSITION_NB ] = { { 250767114, 501534038, 250767114 }, { 209867381, 419732057, 209867381 }, { 170987846, 341967853, 170987846 }, { 131531482, 263046905, 131531482 }, { 89306658, 178584282, 89306658 } }; /* Interpolation points for filter coefficients used in the bandwidth transition smoother */ const opus_int32 silk_Transition_LP_A_Q28[ TRANSITION_INT_NUM ][ TRANSITION_NA ] = { { 506393414, 239854379 }, { 411067935, 169683996 }, { 306733530, 116694253 }, { 185807084, 77959395 }, { 35497197, 57401098 } }; #ifdef __cplusplus } #endif mumble-1.3.4/3rdparty/opus-src/silk/tables.h0000664000175000017500000001702414010707327020555 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef SILK_TABLES_H #define SILK_TABLES_H #include "define.h" #include "structs.h" #ifdef __cplusplus extern "C" { #endif /* Entropy coding tables (with size in bytes indicated) */ extern const opus_uint8 silk_gain_iCDF[ 3 ][ N_LEVELS_QGAIN / 8 ]; /* 24 */ extern const opus_uint8 silk_delta_gain_iCDF[ MAX_DELTA_GAIN_QUANT - MIN_DELTA_GAIN_QUANT + 1 ]; /* 41 */ extern const opus_uint8 silk_pitch_lag_iCDF[ 2 * ( PITCH_EST_MAX_LAG_MS - PITCH_EST_MIN_LAG_MS ) ];/* 32 */ extern const opus_uint8 silk_pitch_delta_iCDF[ 21 ]; /* 21 */ extern const opus_uint8 silk_pitch_contour_iCDF[ 34 ]; /* 34 */ extern const opus_uint8 silk_pitch_contour_NB_iCDF[ 11 ]; /* 11 */ extern const opus_uint8 silk_pitch_contour_10_ms_iCDF[ 12 ]; /* 12 */ extern const opus_uint8 silk_pitch_contour_10_ms_NB_iCDF[ 3 ]; /* 3 */ extern const opus_uint8 silk_pulses_per_block_iCDF[ N_RATE_LEVELS ][ SILK_MAX_PULSES + 2 ]; /* 180 */ extern const opus_uint8 silk_pulses_per_block_BITS_Q5[ N_RATE_LEVELS - 1 ][ SILK_MAX_PULSES + 2 ]; /* 162 */ extern const opus_uint8 silk_rate_levels_iCDF[ 2 ][ N_RATE_LEVELS - 1 ]; /* 18 */ extern const opus_uint8 silk_rate_levels_BITS_Q5[ 2 ][ N_RATE_LEVELS - 1 ]; /* 18 */ extern const opus_uint8 silk_max_pulses_table[ 4 ]; /* 4 */ extern const opus_uint8 silk_shell_code_table0[ 152 ]; /* 152 */ extern const opus_uint8 silk_shell_code_table1[ 152 ]; /* 152 */ extern const opus_uint8 silk_shell_code_table2[ 152 ]; /* 152 */ extern const opus_uint8 silk_shell_code_table3[ 152 ]; /* 152 */ extern const opus_uint8 silk_shell_code_table_offsets[ SILK_MAX_PULSES + 1 ]; /* 17 */ extern const opus_uint8 silk_lsb_iCDF[ 2 ]; /* 2 */ extern const opus_uint8 silk_sign_iCDF[ 42 ]; /* 42 */ extern const opus_uint8 silk_uniform3_iCDF[ 3 ]; /* 3 */ extern const opus_uint8 silk_uniform4_iCDF[ 4 ]; /* 4 */ extern const opus_uint8 silk_uniform5_iCDF[ 5 ]; /* 5 */ extern const opus_uint8 silk_uniform6_iCDF[ 6 ]; /* 6 */ extern const opus_uint8 silk_uniform8_iCDF[ 8 ]; /* 8 */ extern const opus_uint8 silk_NLSF_EXT_iCDF[ 7 ]; /* 7 */ extern const opus_uint8 silk_LTP_per_index_iCDF[ 3 ]; /* 3 */ extern const opus_uint8 * const silk_LTP_gain_iCDF_ptrs[ NB_LTP_CBKS ]; /* 3 */ extern const opus_uint8 * const silk_LTP_gain_BITS_Q5_ptrs[ NB_LTP_CBKS ]; /* 3 */ extern const opus_int8 * const silk_LTP_vq_ptrs_Q7[ NB_LTP_CBKS ]; /* 168 */ extern const opus_uint8 * const silk_LTP_vq_gain_ptrs_Q7[NB_LTP_CBKS]; extern const opus_int8 silk_LTP_vq_sizes[ NB_LTP_CBKS ]; /* 3 */ extern const opus_uint8 silk_LTPscale_iCDF[ 3 ]; /* 4 */ extern const opus_int16 silk_LTPScales_table_Q14[ 3 ]; /* 6 */ extern const opus_uint8 silk_type_offset_VAD_iCDF[ 4 ]; /* 4 */ extern const opus_uint8 silk_type_offset_no_VAD_iCDF[ 2 ]; /* 2 */ extern const opus_int16 silk_stereo_pred_quant_Q13[ STEREO_QUANT_TAB_SIZE ]; /* 32 */ extern const opus_uint8 silk_stereo_pred_joint_iCDF[ 25 ]; /* 25 */ extern const opus_uint8 silk_stereo_only_code_mid_iCDF[ 2 ]; /* 2 */ extern const opus_uint8 * const silk_LBRR_flags_iCDF_ptr[ 2 ]; /* 10 */ extern const opus_uint8 silk_NLSF_interpolation_factor_iCDF[ 5 ]; /* 5 */ extern const silk_NLSF_CB_struct silk_NLSF_CB_WB; /* 1040 */ extern const silk_NLSF_CB_struct silk_NLSF_CB_NB_MB; /* 728 */ /* Piece-wise linear mapping from bitrate in kbps to coding quality in dB SNR */ extern const opus_int32 silk_TargetRate_table_NB[ TARGET_RATE_TAB_SZ ]; /* 32 */ extern const opus_int32 silk_TargetRate_table_MB[ TARGET_RATE_TAB_SZ ]; /* 32 */ extern const opus_int32 silk_TargetRate_table_WB[ TARGET_RATE_TAB_SZ ]; /* 32 */ extern const opus_int16 silk_SNR_table_Q1[ TARGET_RATE_TAB_SZ ]; /* 32 */ /* Quantization offsets */ extern const opus_int16 silk_Quantization_Offsets_Q10[ 2 ][ 2 ]; /* 8 */ /* Interpolation points for filter coefficients used in the bandwidth transition smoother */ extern const opus_int32 silk_Transition_LP_B_Q28[ TRANSITION_INT_NUM ][ TRANSITION_NB ]; /* 60 */ extern const opus_int32 silk_Transition_LP_A_Q28[ TRANSITION_INT_NUM ][ TRANSITION_NA ]; /* 60 */ /* Rom table with cosine values */ extern const opus_int16 silk_LSFCosTab_FIX_Q12[ LSF_COS_TAB_SZ_FIX + 1 ]; /* 258 */ #ifdef __cplusplus } #endif #endif mumble-1.3.4/3rdparty/opus-src/silk/dec_API.c0000664000175000017500000004654714010707327020536 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "API.h" #include "main.h" #include "stack_alloc.h" #include "os_support.h" /************************/ /* Decoder Super Struct */ /************************/ typedef struct { silk_decoder_state channel_state[ DECODER_NUM_CHANNELS ]; stereo_dec_state sStereo; opus_int nChannelsAPI; opus_int nChannelsInternal; opus_int prev_decode_only_middle; } silk_decoder; /*********************/ /* Decoder functions */ /*********************/ opus_int silk_Get_Decoder_Size( /* O Returns error code */ opus_int *decSizeBytes /* O Number of bytes in SILK decoder state */ ) { opus_int ret = SILK_NO_ERROR; *decSizeBytes = sizeof( silk_decoder ); return ret; } /* Reset decoder state */ opus_int silk_InitDecoder( /* O Returns error code */ void *decState /* I/O State */ ) { opus_int n, ret = SILK_NO_ERROR; silk_decoder_state *channel_state = ((silk_decoder *)decState)->channel_state; for( n = 0; n < DECODER_NUM_CHANNELS; n++ ) { ret = silk_init_decoder( &channel_state[ n ] ); } silk_memset(&((silk_decoder *)decState)->sStereo, 0, sizeof(((silk_decoder *)decState)->sStereo)); /* Not strictly needed, but it's cleaner that way */ ((silk_decoder *)decState)->prev_decode_only_middle = 0; return ret; } /* Decode a frame */ opus_int silk_Decode( /* O Returns error code */ void* decState, /* I/O State */ silk_DecControlStruct* decControl, /* I/O Control Structure */ opus_int lostFlag, /* I 0: no loss, 1 loss, 2 decode fec */ opus_int newPacketFlag, /* I Indicates first decoder call for this packet */ ec_dec *psRangeDec, /* I/O Compressor data structure */ opus_int16 *samplesOut, /* O Decoded output speech vector */ opus_int32 *nSamplesOut, /* O Number of samples decoded */ int arch /* I Run-time architecture */ ) { opus_int i, n, decode_only_middle = 0, ret = SILK_NO_ERROR; opus_int32 nSamplesOutDec, LBRR_symbol; opus_int16 *samplesOut1_tmp[ 2 ]; VARDECL( opus_int16, samplesOut1_tmp_storage1 ); VARDECL( opus_int16, samplesOut1_tmp_storage2 ); VARDECL( opus_int16, samplesOut2_tmp ); opus_int32 MS_pred_Q13[ 2 ] = { 0 }; opus_int16 *resample_out_ptr; silk_decoder *psDec = ( silk_decoder * )decState; silk_decoder_state *channel_state = psDec->channel_state; opus_int has_side; opus_int stereo_to_mono; int delay_stack_alloc; SAVE_STACK; silk_assert( decControl->nChannelsInternal == 1 || decControl->nChannelsInternal == 2 ); /**********************************/ /* Test if first frame in payload */ /**********************************/ if( newPacketFlag ) { for( n = 0; n < decControl->nChannelsInternal; n++ ) { channel_state[ n ].nFramesDecoded = 0; /* Used to count frames in packet */ } } /* If Mono -> Stereo transition in bitstream: init state of second channel */ if( decControl->nChannelsInternal > psDec->nChannelsInternal ) { ret += silk_init_decoder( &channel_state[ 1 ] ); } stereo_to_mono = decControl->nChannelsInternal == 1 && psDec->nChannelsInternal == 2 && ( decControl->internalSampleRate == 1000*channel_state[ 0 ].fs_kHz ); if( channel_state[ 0 ].nFramesDecoded == 0 ) { for( n = 0; n < decControl->nChannelsInternal; n++ ) { opus_int fs_kHz_dec; if( decControl->payloadSize_ms == 0 ) { /* Assuming packet loss, use 10 ms */ channel_state[ n ].nFramesPerPacket = 1; channel_state[ n ].nb_subfr = 2; } else if( decControl->payloadSize_ms == 10 ) { channel_state[ n ].nFramesPerPacket = 1; channel_state[ n ].nb_subfr = 2; } else if( decControl->payloadSize_ms == 20 ) { channel_state[ n ].nFramesPerPacket = 1; channel_state[ n ].nb_subfr = 4; } else if( decControl->payloadSize_ms == 40 ) { channel_state[ n ].nFramesPerPacket = 2; channel_state[ n ].nb_subfr = 4; } else if( decControl->payloadSize_ms == 60 ) { channel_state[ n ].nFramesPerPacket = 3; channel_state[ n ].nb_subfr = 4; } else { silk_assert( 0 ); RESTORE_STACK; return SILK_DEC_INVALID_FRAME_SIZE; } fs_kHz_dec = ( decControl->internalSampleRate >> 10 ) + 1; if( fs_kHz_dec != 8 && fs_kHz_dec != 12 && fs_kHz_dec != 16 ) { silk_assert( 0 ); RESTORE_STACK; return SILK_DEC_INVALID_SAMPLING_FREQUENCY; } ret += silk_decoder_set_fs( &channel_state[ n ], fs_kHz_dec, decControl->API_sampleRate ); } } if( decControl->nChannelsAPI == 2 && decControl->nChannelsInternal == 2 && ( psDec->nChannelsAPI == 1 || psDec->nChannelsInternal == 1 ) ) { silk_memset( psDec->sStereo.pred_prev_Q13, 0, sizeof( psDec->sStereo.pred_prev_Q13 ) ); silk_memset( psDec->sStereo.sSide, 0, sizeof( psDec->sStereo.sSide ) ); silk_memcpy( &channel_state[ 1 ].resampler_state, &channel_state[ 0 ].resampler_state, sizeof( silk_resampler_state_struct ) ); } psDec->nChannelsAPI = decControl->nChannelsAPI; psDec->nChannelsInternal = decControl->nChannelsInternal; if( decControl->API_sampleRate > (opus_int32)MAX_API_FS_KHZ * 1000 || decControl->API_sampleRate < 8000 ) { ret = SILK_DEC_INVALID_SAMPLING_FREQUENCY; RESTORE_STACK; return( ret ); } if( lostFlag != FLAG_PACKET_LOST && channel_state[ 0 ].nFramesDecoded == 0 ) { /* First decoder call for this payload */ /* Decode VAD flags and LBRR flag */ for( n = 0; n < decControl->nChannelsInternal; n++ ) { for( i = 0; i < channel_state[ n ].nFramesPerPacket; i++ ) { channel_state[ n ].VAD_flags[ i ] = ec_dec_bit_logp(psRangeDec, 1); } channel_state[ n ].LBRR_flag = ec_dec_bit_logp(psRangeDec, 1); } /* Decode LBRR flags */ for( n = 0; n < decControl->nChannelsInternal; n++ ) { silk_memset( channel_state[ n ].LBRR_flags, 0, sizeof( channel_state[ n ].LBRR_flags ) ); if( channel_state[ n ].LBRR_flag ) { if( channel_state[ n ].nFramesPerPacket == 1 ) { channel_state[ n ].LBRR_flags[ 0 ] = 1; } else { LBRR_symbol = ec_dec_icdf( psRangeDec, silk_LBRR_flags_iCDF_ptr[ channel_state[ n ].nFramesPerPacket - 2 ], 8 ) + 1; for( i = 0; i < channel_state[ n ].nFramesPerPacket; i++ ) { channel_state[ n ].LBRR_flags[ i ] = silk_RSHIFT( LBRR_symbol, i ) & 1; } } } } if( lostFlag == FLAG_DECODE_NORMAL ) { /* Regular decoding: skip all LBRR data */ for( i = 0; i < channel_state[ 0 ].nFramesPerPacket; i++ ) { for( n = 0; n < decControl->nChannelsInternal; n++ ) { if( channel_state[ n ].LBRR_flags[ i ] ) { opus_int16 pulses[ MAX_FRAME_LENGTH ]; opus_int condCoding; if( decControl->nChannelsInternal == 2 && n == 0 ) { silk_stereo_decode_pred( psRangeDec, MS_pred_Q13 ); if( channel_state[ 1 ].LBRR_flags[ i ] == 0 ) { silk_stereo_decode_mid_only( psRangeDec, &decode_only_middle ); } } /* Use conditional coding if previous frame available */ if( i > 0 && channel_state[ n ].LBRR_flags[ i - 1 ] ) { condCoding = CODE_CONDITIONALLY; } else { condCoding = CODE_INDEPENDENTLY; } silk_decode_indices( &channel_state[ n ], psRangeDec, i, 1, condCoding ); silk_decode_pulses( psRangeDec, pulses, channel_state[ n ].indices.signalType, channel_state[ n ].indices.quantOffsetType, channel_state[ n ].frame_length ); } } } } } /* Get MS predictor index */ if( decControl->nChannelsInternal == 2 ) { if( lostFlag == FLAG_DECODE_NORMAL || ( lostFlag == FLAG_DECODE_LBRR && channel_state[ 0 ].LBRR_flags[ channel_state[ 0 ].nFramesDecoded ] == 1 ) ) { silk_stereo_decode_pred( psRangeDec, MS_pred_Q13 ); /* For LBRR data, decode mid-only flag only if side-channel's LBRR flag is false */ if( ( lostFlag == FLAG_DECODE_NORMAL && channel_state[ 1 ].VAD_flags[ channel_state[ 0 ].nFramesDecoded ] == 0 ) || ( lostFlag == FLAG_DECODE_LBRR && channel_state[ 1 ].LBRR_flags[ channel_state[ 0 ].nFramesDecoded ] == 0 ) ) { silk_stereo_decode_mid_only( psRangeDec, &decode_only_middle ); } else { decode_only_middle = 0; } } else { for( n = 0; n < 2; n++ ) { MS_pred_Q13[ n ] = psDec->sStereo.pred_prev_Q13[ n ]; } } } /* Reset side channel decoder prediction memory for first frame with side coding */ if( decControl->nChannelsInternal == 2 && decode_only_middle == 0 && psDec->prev_decode_only_middle == 1 ) { silk_memset( psDec->channel_state[ 1 ].outBuf, 0, sizeof(psDec->channel_state[ 1 ].outBuf) ); silk_memset( psDec->channel_state[ 1 ].sLPC_Q14_buf, 0, sizeof(psDec->channel_state[ 1 ].sLPC_Q14_buf) ); psDec->channel_state[ 1 ].lagPrev = 100; psDec->channel_state[ 1 ].LastGainIndex = 10; psDec->channel_state[ 1 ].prevSignalType = TYPE_NO_VOICE_ACTIVITY; psDec->channel_state[ 1 ].first_frame_after_reset = 1; } /* Check if the temp buffer fits into the output PCM buffer. If it fits, we can delay allocating the temp buffer until after the SILK peak stack usage. We need to use a < and not a <= because of the two extra samples. */ delay_stack_alloc = decControl->internalSampleRate*decControl->nChannelsInternal < decControl->API_sampleRate*decControl->nChannelsAPI; ALLOC( samplesOut1_tmp_storage1, delay_stack_alloc ? ALLOC_NONE : decControl->nChannelsInternal*(channel_state[ 0 ].frame_length + 2 ), opus_int16 ); if ( delay_stack_alloc ) { samplesOut1_tmp[ 0 ] = samplesOut; samplesOut1_tmp[ 1 ] = samplesOut + channel_state[ 0 ].frame_length + 2; } else { samplesOut1_tmp[ 0 ] = samplesOut1_tmp_storage1; samplesOut1_tmp[ 1 ] = samplesOut1_tmp_storage1 + channel_state[ 0 ].frame_length + 2; } if( lostFlag == FLAG_DECODE_NORMAL ) { has_side = !decode_only_middle; } else { has_side = !psDec->prev_decode_only_middle || (decControl->nChannelsInternal == 2 && lostFlag == FLAG_DECODE_LBRR && channel_state[1].LBRR_flags[ channel_state[1].nFramesDecoded ] == 1 ); } /* Call decoder for one frame */ for( n = 0; n < decControl->nChannelsInternal; n++ ) { if( n == 0 || has_side ) { opus_int FrameIndex; opus_int condCoding; FrameIndex = channel_state[ 0 ].nFramesDecoded - n; /* Use independent coding if no previous frame available */ if( FrameIndex <= 0 ) { condCoding = CODE_INDEPENDENTLY; } else if( lostFlag == FLAG_DECODE_LBRR ) { condCoding = channel_state[ n ].LBRR_flags[ FrameIndex - 1 ] ? CODE_CONDITIONALLY : CODE_INDEPENDENTLY; } else if( n > 0 && psDec->prev_decode_only_middle ) { /* If we skipped a side frame in this packet, we don't need LTP scaling; the LTP state is well-defined. */ condCoding = CODE_INDEPENDENTLY_NO_LTP_SCALING; } else { condCoding = CODE_CONDITIONALLY; } ret += silk_decode_frame( &channel_state[ n ], psRangeDec, &samplesOut1_tmp[ n ][ 2 ], &nSamplesOutDec, lostFlag, condCoding, arch); } else { silk_memset( &samplesOut1_tmp[ n ][ 2 ], 0, nSamplesOutDec * sizeof( opus_int16 ) ); } channel_state[ n ].nFramesDecoded++; } if( decControl->nChannelsAPI == 2 && decControl->nChannelsInternal == 2 ) { /* Convert Mid/Side to Left/Right */ silk_stereo_MS_to_LR( &psDec->sStereo, samplesOut1_tmp[ 0 ], samplesOut1_tmp[ 1 ], MS_pred_Q13, channel_state[ 0 ].fs_kHz, nSamplesOutDec ); } else { /* Buffering */ silk_memcpy( samplesOut1_tmp[ 0 ], psDec->sStereo.sMid, 2 * sizeof( opus_int16 ) ); silk_memcpy( psDec->sStereo.sMid, &samplesOut1_tmp[ 0 ][ nSamplesOutDec ], 2 * sizeof( opus_int16 ) ); } /* Number of output samples */ *nSamplesOut = silk_DIV32( nSamplesOutDec * decControl->API_sampleRate, silk_SMULBB( channel_state[ 0 ].fs_kHz, 1000 ) ); /* Set up pointers to temp buffers */ ALLOC( samplesOut2_tmp, decControl->nChannelsAPI == 2 ? *nSamplesOut : ALLOC_NONE, opus_int16 ); if( decControl->nChannelsAPI == 2 ) { resample_out_ptr = samplesOut2_tmp; } else { resample_out_ptr = samplesOut; } ALLOC( samplesOut1_tmp_storage2, delay_stack_alloc ? decControl->nChannelsInternal*(channel_state[ 0 ].frame_length + 2 ) : ALLOC_NONE, opus_int16 ); if ( delay_stack_alloc ) { OPUS_COPY(samplesOut1_tmp_storage2, samplesOut, decControl->nChannelsInternal*(channel_state[ 0 ].frame_length + 2)); samplesOut1_tmp[ 0 ] = samplesOut1_tmp_storage2; samplesOut1_tmp[ 1 ] = samplesOut1_tmp_storage2 + channel_state[ 0 ].frame_length + 2; } for( n = 0; n < silk_min( decControl->nChannelsAPI, decControl->nChannelsInternal ); n++ ) { /* Resample decoded signal to API_sampleRate */ ret += silk_resampler( &channel_state[ n ].resampler_state, resample_out_ptr, &samplesOut1_tmp[ n ][ 1 ], nSamplesOutDec ); /* Interleave if stereo output and stereo stream */ if( decControl->nChannelsAPI == 2 ) { for( i = 0; i < *nSamplesOut; i++ ) { samplesOut[ n + 2 * i ] = resample_out_ptr[ i ]; } } } /* Create two channel output from mono stream */ if( decControl->nChannelsAPI == 2 && decControl->nChannelsInternal == 1 ) { if ( stereo_to_mono ){ /* Resample right channel for newly collapsed stereo just in case we weren't doing collapsing when switching to mono */ ret += silk_resampler( &channel_state[ 1 ].resampler_state, resample_out_ptr, &samplesOut1_tmp[ 0 ][ 1 ], nSamplesOutDec ); for( i = 0; i < *nSamplesOut; i++ ) { samplesOut[ 1 + 2 * i ] = resample_out_ptr[ i ]; } } else { for( i = 0; i < *nSamplesOut; i++ ) { samplesOut[ 1 + 2 * i ] = samplesOut[ 0 + 2 * i ]; } } } /* Export pitch lag, measured at 48 kHz sampling rate */ if( channel_state[ 0 ].prevSignalType == TYPE_VOICED ) { int mult_tab[ 3 ] = { 6, 4, 3 }; decControl->prevPitchLag = channel_state[ 0 ].lagPrev * mult_tab[ ( channel_state[ 0 ].fs_kHz - 8 ) >> 2 ]; } else { decControl->prevPitchLag = 0; } if( lostFlag == FLAG_PACKET_LOST ) { /* On packet loss, remove the gain clamping to prevent having the energy "bounce back" if we lose packets when the energy is going down */ for ( i = 0; i < psDec->nChannelsInternal; i++ ) psDec->channel_state[ i ].LastGainIndex = 10; } else { psDec->prev_decode_only_middle = decode_only_middle; } RESTORE_STACK; return ret; } #if 0 /* Getting table of contents for a packet */ opus_int silk_get_TOC( const opus_uint8 *payload, /* I Payload data */ const opus_int nBytesIn, /* I Number of input bytes */ const opus_int nFramesPerPayload, /* I Number of SILK frames per payload */ silk_TOC_struct *Silk_TOC /* O Type of content */ ) { opus_int i, flags, ret = SILK_NO_ERROR; if( nBytesIn < 1 ) { return -1; } if( nFramesPerPayload < 0 || nFramesPerPayload > 3 ) { return -1; } silk_memset( Silk_TOC, 0, sizeof( *Silk_TOC ) ); /* For stereo, extract the flags for the mid channel */ flags = silk_RSHIFT( payload[ 0 ], 7 - nFramesPerPayload ) & ( silk_LSHIFT( 1, nFramesPerPayload + 1 ) - 1 ); Silk_TOC->inbandFECFlag = flags & 1; for( i = nFramesPerPayload - 1; i >= 0 ; i-- ) { flags = silk_RSHIFT( flags, 1 ); Silk_TOC->VADFlags[ i ] = flags & 1; Silk_TOC->VADFlag |= flags & 1; } return ret; } #endif mumble-1.3.4/3rdparty/opus-src/silk/LPC_fit.c0000664000175000017500000000756514010707327020567 0ustar builderbuilder/*********************************************************************** Copyright (c) 2013, Koen Vos. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "SigProc_FIX.h" /* Convert int32 coefficients to int16 coefs and make sure there's no wrap-around */ void silk_LPC_fit( opus_int16 *a_QOUT, /* O Output signal */ opus_int32 *a_QIN, /* I/O Input signal */ const opus_int QOUT, /* I Input Q domain */ const opus_int QIN, /* I Input Q domain */ const opus_int d /* I Filter order */ ) { opus_int i, k, idx = 0; opus_int32 maxabs, absval, chirp_Q16; /* Limit the maximum absolute value of the prediction coefficients, so that they'll fit in int16 */ for( i = 0; i < 10; i++ ) { /* Find maximum absolute value and its index */ maxabs = 0; for( k = 0; k < d; k++ ) { absval = silk_abs( a_QIN[k] ); if( absval > maxabs ) { maxabs = absval; idx = k; } } maxabs = silk_RSHIFT_ROUND( maxabs, QIN - QOUT ); if( maxabs > silk_int16_MAX ) { /* Reduce magnitude of prediction coefficients */ maxabs = silk_min( maxabs, 163838 ); /* ( silk_int32_MAX >> 14 ) + silk_int16_MAX = 163838 */ chirp_Q16 = SILK_FIX_CONST( 0.999, 16 ) - silk_DIV32( silk_LSHIFT( maxabs - silk_int16_MAX, 14 ), silk_RSHIFT32( silk_MUL( maxabs, idx + 1), 2 ) ); silk_bwexpander_32( a_QIN, d, chirp_Q16 ); } else { break; } } if( i == 10 ) { /* Reached the last iteration, clip the coefficients */ for( k = 0; k < d; k++ ) { a_QOUT[ k ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( a_QIN[ k ], QIN - QOUT ) ); a_QIN[ k ] = silk_LSHIFT( (opus_int32)a_QOUT[ k ], QIN - QOUT ); } } else { for( k = 0; k < d; k++ ) { a_QOUT[ k ] = (opus_int16)silk_RSHIFT_ROUND( a_QIN[ k ], QIN - QOUT ); } } } mumble-1.3.4/3rdparty/opus-src/silk/resampler_structs.h0000664000175000017500000000506714010707327023070 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef SILK_RESAMPLER_STRUCTS_H #define SILK_RESAMPLER_STRUCTS_H #ifdef __cplusplus extern "C" { #endif #define SILK_RESAMPLER_MAX_FIR_ORDER 36 #define SILK_RESAMPLER_MAX_IIR_ORDER 6 typedef struct _silk_resampler_state_struct{ opus_int32 sIIR[ SILK_RESAMPLER_MAX_IIR_ORDER ]; /* this must be the first element of this struct */ union{ opus_int32 i32[ SILK_RESAMPLER_MAX_FIR_ORDER ]; opus_int16 i16[ SILK_RESAMPLER_MAX_FIR_ORDER ]; } sFIR; opus_int16 delayBuf[ 48 ]; opus_int resampler_function; opus_int batchSize; opus_int32 invRatio_Q16; opus_int FIR_Order; opus_int FIR_Fracs; opus_int Fs_in_kHz; opus_int Fs_out_kHz; opus_int inputDelay; const opus_int16 *Coefs; } silk_resampler_state_struct; #ifdef __cplusplus } #endif #endif /* SILK_RESAMPLER_STRUCTS_H */ mumble-1.3.4/3rdparty/opus-src/silk/resampler_private_down_FIR.c0000664000175000017500000002522114010707327024547 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "SigProc_FIX.h" #include "resampler_private.h" #include "stack_alloc.h" static OPUS_INLINE opus_int16 *silk_resampler_private_down_FIR_INTERPOL( opus_int16 *out, opus_int32 *buf, const opus_int16 *FIR_Coefs, opus_int FIR_Order, opus_int FIR_Fracs, opus_int32 max_index_Q16, opus_int32 index_increment_Q16 ) { opus_int32 index_Q16, res_Q6; opus_int32 *buf_ptr; opus_int32 interpol_ind; const opus_int16 *interpol_ptr; switch( FIR_Order ) { case RESAMPLER_DOWN_ORDER_FIR0: for( index_Q16 = 0; index_Q16 < max_index_Q16; index_Q16 += index_increment_Q16 ) { /* Integer part gives pointer to buffered input */ buf_ptr = buf + silk_RSHIFT( index_Q16, 16 ); /* Fractional part gives interpolation coefficients */ interpol_ind = silk_SMULWB( index_Q16 & 0xFFFF, FIR_Fracs ); /* Inner product */ interpol_ptr = &FIR_Coefs[ RESAMPLER_DOWN_ORDER_FIR0 / 2 * interpol_ind ]; res_Q6 = silk_SMULWB( buf_ptr[ 0 ], interpol_ptr[ 0 ] ); res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 1 ], interpol_ptr[ 1 ] ); res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 2 ], interpol_ptr[ 2 ] ); res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 3 ], interpol_ptr[ 3 ] ); res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 4 ], interpol_ptr[ 4 ] ); res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 5 ], interpol_ptr[ 5 ] ); res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 6 ], interpol_ptr[ 6 ] ); res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 7 ], interpol_ptr[ 7 ] ); res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 8 ], interpol_ptr[ 8 ] ); interpol_ptr = &FIR_Coefs[ RESAMPLER_DOWN_ORDER_FIR0 / 2 * ( FIR_Fracs - 1 - interpol_ind ) ]; res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 17 ], interpol_ptr[ 0 ] ); res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 16 ], interpol_ptr[ 1 ] ); res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 15 ], interpol_ptr[ 2 ] ); res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 14 ], interpol_ptr[ 3 ] ); res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 13 ], interpol_ptr[ 4 ] ); res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 12 ], interpol_ptr[ 5 ] ); res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 11 ], interpol_ptr[ 6 ] ); res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 10 ], interpol_ptr[ 7 ] ); res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 9 ], interpol_ptr[ 8 ] ); /* Scale down, saturate and store in output array */ *out++ = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( res_Q6, 6 ) ); } break; case RESAMPLER_DOWN_ORDER_FIR1: for( index_Q16 = 0; index_Q16 < max_index_Q16; index_Q16 += index_increment_Q16 ) { /* Integer part gives pointer to buffered input */ buf_ptr = buf + silk_RSHIFT( index_Q16, 16 ); /* Inner product */ res_Q6 = silk_SMULWB( silk_ADD32( buf_ptr[ 0 ], buf_ptr[ 23 ] ), FIR_Coefs[ 0 ] ); res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 1 ], buf_ptr[ 22 ] ), FIR_Coefs[ 1 ] ); res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 2 ], buf_ptr[ 21 ] ), FIR_Coefs[ 2 ] ); res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 3 ], buf_ptr[ 20 ] ), FIR_Coefs[ 3 ] ); res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 4 ], buf_ptr[ 19 ] ), FIR_Coefs[ 4 ] ); res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 5 ], buf_ptr[ 18 ] ), FIR_Coefs[ 5 ] ); res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 6 ], buf_ptr[ 17 ] ), FIR_Coefs[ 6 ] ); res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 7 ], buf_ptr[ 16 ] ), FIR_Coefs[ 7 ] ); res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 8 ], buf_ptr[ 15 ] ), FIR_Coefs[ 8 ] ); res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 9 ], buf_ptr[ 14 ] ), FIR_Coefs[ 9 ] ); res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 10 ], buf_ptr[ 13 ] ), FIR_Coefs[ 10 ] ); res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 11 ], buf_ptr[ 12 ] ), FIR_Coefs[ 11 ] ); /* Scale down, saturate and store in output array */ *out++ = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( res_Q6, 6 ) ); } break; case RESAMPLER_DOWN_ORDER_FIR2: for( index_Q16 = 0; index_Q16 < max_index_Q16; index_Q16 += index_increment_Q16 ) { /* Integer part gives pointer to buffered input */ buf_ptr = buf + silk_RSHIFT( index_Q16, 16 ); /* Inner product */ res_Q6 = silk_SMULWB( silk_ADD32( buf_ptr[ 0 ], buf_ptr[ 35 ] ), FIR_Coefs[ 0 ] ); res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 1 ], buf_ptr[ 34 ] ), FIR_Coefs[ 1 ] ); res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 2 ], buf_ptr[ 33 ] ), FIR_Coefs[ 2 ] ); res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 3 ], buf_ptr[ 32 ] ), FIR_Coefs[ 3 ] ); res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 4 ], buf_ptr[ 31 ] ), FIR_Coefs[ 4 ] ); res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 5 ], buf_ptr[ 30 ] ), FIR_Coefs[ 5 ] ); res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 6 ], buf_ptr[ 29 ] ), FIR_Coefs[ 6 ] ); res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 7 ], buf_ptr[ 28 ] ), FIR_Coefs[ 7 ] ); res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 8 ], buf_ptr[ 27 ] ), FIR_Coefs[ 8 ] ); res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 9 ], buf_ptr[ 26 ] ), FIR_Coefs[ 9 ] ); res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 10 ], buf_ptr[ 25 ] ), FIR_Coefs[ 10 ] ); res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 11 ], buf_ptr[ 24 ] ), FIR_Coefs[ 11 ] ); res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 12 ], buf_ptr[ 23 ] ), FIR_Coefs[ 12 ] ); res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 13 ], buf_ptr[ 22 ] ), FIR_Coefs[ 13 ] ); res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 14 ], buf_ptr[ 21 ] ), FIR_Coefs[ 14 ] ); res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 15 ], buf_ptr[ 20 ] ), FIR_Coefs[ 15 ] ); res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 16 ], buf_ptr[ 19 ] ), FIR_Coefs[ 16 ] ); res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 17 ], buf_ptr[ 18 ] ), FIR_Coefs[ 17 ] ); /* Scale down, saturate and store in output array */ *out++ = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( res_Q6, 6 ) ); } break; default: silk_assert( 0 ); } return out; } /* Resample with a 2nd order AR filter followed by FIR interpolation */ void silk_resampler_private_down_FIR( void *SS, /* I/O Resampler state */ opus_int16 out[], /* O Output signal */ const opus_int16 in[], /* I Input signal */ opus_int32 inLen /* I Number of input samples */ ) { silk_resampler_state_struct *S = (silk_resampler_state_struct *)SS; opus_int32 nSamplesIn; opus_int32 max_index_Q16, index_increment_Q16; VARDECL( opus_int32, buf ); const opus_int16 *FIR_Coefs; SAVE_STACK; ALLOC( buf, S->batchSize + S->FIR_Order, opus_int32 ); /* Copy buffered samples to start of buffer */ silk_memcpy( buf, S->sFIR.i32, S->FIR_Order * sizeof( opus_int32 ) ); FIR_Coefs = &S->Coefs[ 2 ]; /* Iterate over blocks of frameSizeIn input samples */ index_increment_Q16 = S->invRatio_Q16; while( 1 ) { nSamplesIn = silk_min( inLen, S->batchSize ); /* Second-order AR filter (output in Q8) */ silk_resampler_private_AR2( S->sIIR, &buf[ S->FIR_Order ], in, S->Coefs, nSamplesIn ); max_index_Q16 = silk_LSHIFT32( nSamplesIn, 16 ); /* Interpolate filtered signal */ out = silk_resampler_private_down_FIR_INTERPOL( out, buf, FIR_Coefs, S->FIR_Order, S->FIR_Fracs, max_index_Q16, index_increment_Q16 ); in += nSamplesIn; inLen -= nSamplesIn; if( inLen > 1 ) { /* More iterations to do; copy last part of filtered signal to beginning of buffer */ silk_memcpy( buf, &buf[ nSamplesIn ], S->FIR_Order * sizeof( opus_int32 ) ); } else { break; } } /* Copy last part of filtered signal to the state for the next call */ silk_memcpy( S->sFIR.i32, &buf[ nSamplesIn ], S->FIR_Order * sizeof( opus_int32 ) ); RESTORE_STACK; } mumble-1.3.4/3rdparty/opus-src/silk/tables_LTP.c0000664000175000017500000001641014010707327021265 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "tables.h" const opus_uint8 silk_LTP_per_index_iCDF[3] = { 179, 99, 0 }; static const opus_uint8 silk_LTP_gain_iCDF_0[8] = { 71, 56, 43, 30, 21, 12, 6, 0 }; static const opus_uint8 silk_LTP_gain_iCDF_1[16] = { 199, 165, 144, 124, 109, 96, 84, 71, 61, 51, 42, 32, 23, 15, 8, 0 }; static const opus_uint8 silk_LTP_gain_iCDF_2[32] = { 241, 225, 211, 199, 187, 175, 164, 153, 142, 132, 123, 114, 105, 96, 88, 80, 72, 64, 57, 50, 44, 38, 33, 29, 24, 20, 16, 12, 9, 5, 2, 0 }; static const opus_uint8 silk_LTP_gain_BITS_Q5_0[8] = { 15, 131, 138, 138, 155, 155, 173, 173 }; static const opus_uint8 silk_LTP_gain_BITS_Q5_1[16] = { 69, 93, 115, 118, 131, 138, 141, 138, 150, 150, 155, 150, 155, 160, 166, 160 }; static const opus_uint8 silk_LTP_gain_BITS_Q5_2[32] = { 131, 128, 134, 141, 141, 141, 145, 145, 145, 150, 155, 155, 155, 155, 160, 160, 160, 160, 166, 166, 173, 173, 182, 192, 182, 192, 192, 192, 205, 192, 205, 224 }; const opus_uint8 * const silk_LTP_gain_iCDF_ptrs[NB_LTP_CBKS] = { silk_LTP_gain_iCDF_0, silk_LTP_gain_iCDF_1, silk_LTP_gain_iCDF_2 }; const opus_uint8 * const silk_LTP_gain_BITS_Q5_ptrs[NB_LTP_CBKS] = { silk_LTP_gain_BITS_Q5_0, silk_LTP_gain_BITS_Q5_1, silk_LTP_gain_BITS_Q5_2 }; static const opus_int8 silk_LTP_gain_vq_0[8][5] = { { 4, 6, 24, 7, 5 }, { 0, 0, 2, 0, 0 }, { 12, 28, 41, 13, -4 }, { -9, 15, 42, 25, 14 }, { 1, -2, 62, 41, -9 }, { -10, 37, 65, -4, 3 }, { -6, 4, 66, 7, -8 }, { 16, 14, 38, -3, 33 } }; static const opus_int8 silk_LTP_gain_vq_1[16][5] = { { 13, 22, 39, 23, 12 }, { -1, 36, 64, 27, -6 }, { -7, 10, 55, 43, 17 }, { 1, 1, 8, 1, 1 }, { 6, -11, 74, 53, -9 }, { -12, 55, 76, -12, 8 }, { -3, 3, 93, 27, -4 }, { 26, 39, 59, 3, -8 }, { 2, 0, 77, 11, 9 }, { -8, 22, 44, -6, 7 }, { 40, 9, 26, 3, 9 }, { -7, 20, 101, -7, 4 }, { 3, -8, 42, 26, 0 }, { -15, 33, 68, 2, 23 }, { -2, 55, 46, -2, 15 }, { 3, -1, 21, 16, 41 } }; static const opus_int8 silk_LTP_gain_vq_2[32][5] = { { -6, 27, 61, 39, 5 }, { -11, 42, 88, 4, 1 }, { -2, 60, 65, 6, -4 }, { -1, -5, 73, 56, 1 }, { -9, 19, 94, 29, -9 }, { 0, 12, 99, 6, 4 }, { 8, -19, 102, 46, -13 }, { 3, 2, 13, 3, 2 }, { 9, -21, 84, 72, -18 }, { -11, 46, 104, -22, 8 }, { 18, 38, 48, 23, 0 }, { -16, 70, 83, -21, 11 }, { 5, -11, 117, 22, -8 }, { -6, 23, 117, -12, 3 }, { 3, -8, 95, 28, 4 }, { -10, 15, 77, 60, -15 }, { -1, 4, 124, 2, -4 }, { 3, 38, 84, 24, -25 }, { 2, 13, 42, 13, 31 }, { 21, -4, 56, 46, -1 }, { -1, 35, 79, -13, 19 }, { -7, 65, 88, -9, -14 }, { 20, 4, 81, 49, -29 }, { 20, 0, 75, 3, -17 }, { 5, -9, 44, 92, -8 }, { 1, -3, 22, 69, 31 }, { -6, 95, 41, -12, 5 }, { 39, 67, 16, -4, 1 }, { 0, -6, 120, 55, -36 }, { -13, 44, 122, 4, -24 }, { 81, 5, 11, 3, 7 }, { 2, 0, 9, 10, 88 } }; const opus_int8 * const silk_LTP_vq_ptrs_Q7[NB_LTP_CBKS] = { (opus_int8 *)&silk_LTP_gain_vq_0[0][0], (opus_int8 *)&silk_LTP_gain_vq_1[0][0], (opus_int8 *)&silk_LTP_gain_vq_2[0][0] }; /* Maximum frequency-dependent response of the pitch taps above, computed as max(abs(freqz(taps))) */ static const opus_uint8 silk_LTP_gain_vq_0_gain[8] = { 46, 2, 90, 87, 93, 91, 82, 98 }; static const opus_uint8 silk_LTP_gain_vq_1_gain[16] = { 109, 120, 118, 12, 113, 115, 117, 119, 99, 59, 87, 111, 63, 111, 112, 80 }; static const opus_uint8 silk_LTP_gain_vq_2_gain[32] = { 126, 124, 125, 124, 129, 121, 126, 23, 132, 127, 127, 127, 126, 127, 122, 133, 130, 134, 101, 118, 119, 145, 126, 86, 124, 120, 123, 119, 170, 173, 107, 109 }; const opus_uint8 * const silk_LTP_vq_gain_ptrs_Q7[NB_LTP_CBKS] = { &silk_LTP_gain_vq_0_gain[0], &silk_LTP_gain_vq_1_gain[0], &silk_LTP_gain_vq_2_gain[0] }; const opus_int8 silk_LTP_vq_sizes[NB_LTP_CBKS] = { 8, 16, 32 }; mumble-1.3.4/3rdparty/opus-src/silk/stereo_MS_to_LR.c0000664000175000017500000001140714010707327022274 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main.h" /* Convert adaptive Mid/Side representation to Left/Right stereo signal */ void silk_stereo_MS_to_LR( stereo_dec_state *state, /* I/O State */ opus_int16 x1[], /* I/O Left input signal, becomes mid signal */ opus_int16 x2[], /* I/O Right input signal, becomes side signal */ const opus_int32 pred_Q13[], /* I Predictors */ opus_int fs_kHz, /* I Samples rate (kHz) */ opus_int frame_length /* I Number of samples */ ) { opus_int n, denom_Q16, delta0_Q13, delta1_Q13; opus_int32 sum, diff, pred0_Q13, pred1_Q13; /* Buffering */ silk_memcpy( x1, state->sMid, 2 * sizeof( opus_int16 ) ); silk_memcpy( x2, state->sSide, 2 * sizeof( opus_int16 ) ); silk_memcpy( state->sMid, &x1[ frame_length ], 2 * sizeof( opus_int16 ) ); silk_memcpy( state->sSide, &x2[ frame_length ], 2 * sizeof( opus_int16 ) ); /* Interpolate predictors and add prediction to side channel */ pred0_Q13 = state->pred_prev_Q13[ 0 ]; pred1_Q13 = state->pred_prev_Q13[ 1 ]; denom_Q16 = silk_DIV32_16( (opus_int32)1 << 16, STEREO_INTERP_LEN_MS * fs_kHz ); delta0_Q13 = silk_RSHIFT_ROUND( silk_SMULBB( pred_Q13[ 0 ] - state->pred_prev_Q13[ 0 ], denom_Q16 ), 16 ); delta1_Q13 = silk_RSHIFT_ROUND( silk_SMULBB( pred_Q13[ 1 ] - state->pred_prev_Q13[ 1 ], denom_Q16 ), 16 ); for( n = 0; n < STEREO_INTERP_LEN_MS * fs_kHz; n++ ) { pred0_Q13 += delta0_Q13; pred1_Q13 += delta1_Q13; sum = silk_LSHIFT( silk_ADD_LSHIFT( x1[ n ] + x1[ n + 2 ], x1[ n + 1 ], 1 ), 9 ); /* Q11 */ sum = silk_SMLAWB( silk_LSHIFT( (opus_int32)x2[ n + 1 ], 8 ), sum, pred0_Q13 ); /* Q8 */ sum = silk_SMLAWB( sum, silk_LSHIFT( (opus_int32)x1[ n + 1 ], 11 ), pred1_Q13 ); /* Q8 */ x2[ n + 1 ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( sum, 8 ) ); } pred0_Q13 = pred_Q13[ 0 ]; pred1_Q13 = pred_Q13[ 1 ]; for( n = STEREO_INTERP_LEN_MS * fs_kHz; n < frame_length; n++ ) { sum = silk_LSHIFT( silk_ADD_LSHIFT( x1[ n ] + x1[ n + 2 ], x1[ n + 1 ], 1 ), 9 ); /* Q11 */ sum = silk_SMLAWB( silk_LSHIFT( (opus_int32)x2[ n + 1 ], 8 ), sum, pred0_Q13 ); /* Q8 */ sum = silk_SMLAWB( sum, silk_LSHIFT( (opus_int32)x1[ n + 1 ], 11 ), pred1_Q13 ); /* Q8 */ x2[ n + 1 ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( sum, 8 ) ); } state->pred_prev_Q13[ 0 ] = pred_Q13[ 0 ]; state->pred_prev_Q13[ 1 ] = pred_Q13[ 1 ]; /* Convert to left/right signals */ for( n = 0; n < frame_length; n++ ) { sum = x1[ n + 1 ] + (opus_int32)x2[ n + 1 ]; diff = x1[ n + 1 ] - (opus_int32)x2[ n + 1 ]; x1[ n + 1 ] = (opus_int16)silk_SAT16( sum ); x2[ n + 1 ] = (opus_int16)silk_SAT16( diff ); } } mumble-1.3.4/3rdparty/opus-src/silk/tables_pitch_lag.c0000664000175000017500000000577414010707327022573 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "tables.h" const opus_uint8 silk_pitch_lag_iCDF[ 2 * ( PITCH_EST_MAX_LAG_MS - PITCH_EST_MIN_LAG_MS ) ] = { 253, 250, 244, 233, 212, 182, 150, 131, 120, 110, 98, 85, 72, 60, 49, 40, 32, 25, 19, 15, 13, 11, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }; const opus_uint8 silk_pitch_delta_iCDF[21] = { 210, 208, 206, 203, 199, 193, 183, 168, 142, 104, 74, 52, 37, 27, 20, 14, 10, 6, 4, 2, 0 }; const opus_uint8 silk_pitch_contour_iCDF[34] = { 223, 201, 183, 167, 152, 138, 124, 111, 98, 88, 79, 70, 62, 56, 50, 44, 39, 35, 31, 27, 24, 21, 18, 16, 14, 12, 10, 8, 6, 4, 3, 2, 1, 0 }; const opus_uint8 silk_pitch_contour_NB_iCDF[11] = { 188, 176, 155, 138, 119, 97, 67, 43, 26, 10, 0 }; const opus_uint8 silk_pitch_contour_10_ms_iCDF[12] = { 165, 119, 80, 61, 47, 35, 27, 20, 14, 9, 4, 0 }; const opus_uint8 silk_pitch_contour_10_ms_NB_iCDF[3] = { 113, 63, 0 }; mumble-1.3.4/3rdparty/opus-src/silk/pitch_est_tables.c0000664000175000017500000000700514010707327022610 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "typedef.h" #include "pitch_est_defines.h" const opus_int8 silk_CB_lags_stage2_10_ms[ PE_MAX_NB_SUBFR >> 1][ PE_NB_CBKS_STAGE2_10MS ] = { {0, 1, 0}, {0, 0, 1} }; const opus_int8 silk_CB_lags_stage3_10_ms[ PE_MAX_NB_SUBFR >> 1 ][ PE_NB_CBKS_STAGE3_10MS ] = { { 0, 0, 1,-1, 1,-1, 2,-2, 2,-2, 3,-3}, { 0, 1, 0, 1,-1, 2,-1, 2,-2, 3,-2, 3} }; const opus_int8 silk_Lag_range_stage3_10_ms[ PE_MAX_NB_SUBFR >> 1 ][ 2 ] = { {-3, 7}, {-2, 7} }; const opus_int8 silk_CB_lags_stage2[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE2_EXT ] = { {0, 2,-1,-1,-1, 0, 0, 1, 1, 0, 1}, {0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0}, {0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0}, {0,-1, 2, 1, 0, 1, 1, 0, 0,-1,-1} }; const opus_int8 silk_CB_lags_stage3[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE3_MAX ] = { {0, 0, 1,-1, 0, 1,-1, 0,-1, 1,-2, 2,-2,-2, 2,-3, 2, 3,-3,-4, 3,-4, 4, 4,-5, 5,-6,-5, 6,-7, 6, 5, 8,-9}, {0, 0, 1, 0, 0, 0, 0, 0, 0, 0,-1, 1, 0, 0, 1,-1, 0, 1,-1,-1, 1,-1, 2, 1,-1, 2,-2,-2, 2,-2, 2, 2, 3,-3}, {0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1,-1, 1, 0, 0, 2, 1,-1, 2,-1,-1, 2,-1, 2, 2,-1, 3,-2,-2,-2, 3}, {0, 1, 0, 0, 1, 0, 1,-1, 2,-1, 2,-1, 2, 3,-2, 3,-2,-2, 4, 4,-3, 5,-3,-4, 6,-4, 6, 5,-5, 8,-6,-5,-7, 9} }; const opus_int8 silk_Lag_range_stage3[ SILK_PE_MAX_COMPLEX + 1 ] [ PE_MAX_NB_SUBFR ][ 2 ] = { /* Lags to search for low number of stage3 cbks */ { {-5,8}, {-1,6}, {-1,6}, {-4,10} }, /* Lags to search for middle number of stage3 cbks */ { {-6,10}, {-2,6}, {-1,6}, {-5,10} }, /* Lags to search for max number of stage3 cbks */ { {-9,12}, {-3,7}, {-2,7}, {-7,13} } }; const opus_int8 silk_nb_cbk_searchs_stage3[ SILK_PE_MAX_COMPLEX + 1 ] = { PE_NB_CBKS_STAGE3_MIN, PE_NB_CBKS_STAGE3_MID, PE_NB_CBKS_STAGE3_MAX }; mumble-1.3.4/3rdparty/opus-src/silk/stereo_LR_to_MS.c0000664000175000017500000003027114010707327022274 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main.h" #include "stack_alloc.h" /* Convert Left/Right stereo signal to adaptive Mid/Side representation */ void silk_stereo_LR_to_MS( stereo_enc_state *state, /* I/O State */ opus_int16 x1[], /* I/O Left input signal, becomes mid signal */ opus_int16 x2[], /* I/O Right input signal, becomes side signal */ opus_int8 ix[ 2 ][ 3 ], /* O Quantization indices */ opus_int8 *mid_only_flag, /* O Flag: only mid signal coded */ opus_int32 mid_side_rates_bps[], /* O Bitrates for mid and side signals */ opus_int32 total_rate_bps, /* I Total bitrate */ opus_int prev_speech_act_Q8, /* I Speech activity level in previous frame */ opus_int toMono, /* I Last frame before a stereo->mono transition */ opus_int fs_kHz, /* I Sample rate (kHz) */ opus_int frame_length /* I Number of samples */ ) { opus_int n, is10msFrame, denom_Q16, delta0_Q13, delta1_Q13; opus_int32 sum, diff, smooth_coef_Q16, pred_Q13[ 2 ], pred0_Q13, pred1_Q13; opus_int32 LP_ratio_Q14, HP_ratio_Q14, frac_Q16, frac_3_Q16, min_mid_rate_bps, width_Q14, w_Q24, deltaw_Q24; VARDECL( opus_int16, side ); VARDECL( opus_int16, LP_mid ); VARDECL( opus_int16, HP_mid ); VARDECL( opus_int16, LP_side ); VARDECL( opus_int16, HP_side ); opus_int16 *mid = &x1[ -2 ]; SAVE_STACK; ALLOC( side, frame_length + 2, opus_int16 ); /* Convert to basic mid/side signals */ for( n = 0; n < frame_length + 2; n++ ) { sum = x1[ n - 2 ] + (opus_int32)x2[ n - 2 ]; diff = x1[ n - 2 ] - (opus_int32)x2[ n - 2 ]; mid[ n ] = (opus_int16)silk_RSHIFT_ROUND( sum, 1 ); side[ n ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( diff, 1 ) ); } /* Buffering */ silk_memcpy( mid, state->sMid, 2 * sizeof( opus_int16 ) ); silk_memcpy( side, state->sSide, 2 * sizeof( opus_int16 ) ); silk_memcpy( state->sMid, &mid[ frame_length ], 2 * sizeof( opus_int16 ) ); silk_memcpy( state->sSide, &side[ frame_length ], 2 * sizeof( opus_int16 ) ); /* LP and HP filter mid signal */ ALLOC( LP_mid, frame_length, opus_int16 ); ALLOC( HP_mid, frame_length, opus_int16 ); for( n = 0; n < frame_length; n++ ) { sum = silk_RSHIFT_ROUND( silk_ADD_LSHIFT( mid[ n ] + (opus_int32)mid[ n + 2 ], mid[ n + 1 ], 1 ), 2 ); LP_mid[ n ] = sum; HP_mid[ n ] = mid[ n + 1 ] - sum; } /* LP and HP filter side signal */ ALLOC( LP_side, frame_length, opus_int16 ); ALLOC( HP_side, frame_length, opus_int16 ); for( n = 0; n < frame_length; n++ ) { sum = silk_RSHIFT_ROUND( silk_ADD_LSHIFT( side[ n ] + (opus_int32)side[ n + 2 ], side[ n + 1 ], 1 ), 2 ); LP_side[ n ] = sum; HP_side[ n ] = side[ n + 1 ] - sum; } /* Find energies and predictors */ is10msFrame = frame_length == 10 * fs_kHz; smooth_coef_Q16 = is10msFrame ? SILK_FIX_CONST( STEREO_RATIO_SMOOTH_COEF / 2, 16 ) : SILK_FIX_CONST( STEREO_RATIO_SMOOTH_COEF, 16 ); smooth_coef_Q16 = silk_SMULWB( silk_SMULBB( prev_speech_act_Q8, prev_speech_act_Q8 ), smooth_coef_Q16 ); pred_Q13[ 0 ] = silk_stereo_find_predictor( &LP_ratio_Q14, LP_mid, LP_side, &state->mid_side_amp_Q0[ 0 ], frame_length, smooth_coef_Q16 ); pred_Q13[ 1 ] = silk_stereo_find_predictor( &HP_ratio_Q14, HP_mid, HP_side, &state->mid_side_amp_Q0[ 2 ], frame_length, smooth_coef_Q16 ); /* Ratio of the norms of residual and mid signals */ frac_Q16 = silk_SMLABB( HP_ratio_Q14, LP_ratio_Q14, 3 ); frac_Q16 = silk_min( frac_Q16, SILK_FIX_CONST( 1, 16 ) ); /* Determine bitrate distribution between mid and side, and possibly reduce stereo width */ total_rate_bps -= is10msFrame ? 1200 : 600; /* Subtract approximate bitrate for coding stereo parameters */ if( total_rate_bps < 1 ) { total_rate_bps = 1; } min_mid_rate_bps = silk_SMLABB( 2000, fs_kHz, 900 ); silk_assert( min_mid_rate_bps < 32767 ); /* Default bitrate distribution: 8 parts for Mid and (5+3*frac) parts for Side. so: mid_rate = ( 8 / ( 13 + 3 * frac ) ) * total_ rate */ frac_3_Q16 = silk_MUL( 3, frac_Q16 ); mid_side_rates_bps[ 0 ] = silk_DIV32_varQ( total_rate_bps, SILK_FIX_CONST( 8 + 5, 16 ) + frac_3_Q16, 16+3 ); /* If Mid bitrate below minimum, reduce stereo width */ if( mid_side_rates_bps[ 0 ] < min_mid_rate_bps ) { mid_side_rates_bps[ 0 ] = min_mid_rate_bps; mid_side_rates_bps[ 1 ] = total_rate_bps - mid_side_rates_bps[ 0 ]; /* width = 4 * ( 2 * side_rate - min_rate ) / ( ( 1 + 3 * frac ) * min_rate ) */ width_Q14 = silk_DIV32_varQ( silk_LSHIFT( mid_side_rates_bps[ 1 ], 1 ) - min_mid_rate_bps, silk_SMULWB( SILK_FIX_CONST( 1, 16 ) + frac_3_Q16, min_mid_rate_bps ), 14+2 ); width_Q14 = silk_LIMIT( width_Q14, 0, SILK_FIX_CONST( 1, 14 ) ); } else { mid_side_rates_bps[ 1 ] = total_rate_bps - mid_side_rates_bps[ 0 ]; width_Q14 = SILK_FIX_CONST( 1, 14 ); } /* Smoother */ state->smth_width_Q14 = (opus_int16)silk_SMLAWB( state->smth_width_Q14, width_Q14 - state->smth_width_Q14, smooth_coef_Q16 ); /* At very low bitrates or for inputs that are nearly amplitude panned, switch to panned-mono coding */ *mid_only_flag = 0; if( toMono ) { /* Last frame before stereo->mono transition; collapse stereo width */ width_Q14 = 0; pred_Q13[ 0 ] = 0; pred_Q13[ 1 ] = 0; silk_stereo_quant_pred( pred_Q13, ix ); } else if( state->width_prev_Q14 == 0 && ( 8 * total_rate_bps < 13 * min_mid_rate_bps || silk_SMULWB( frac_Q16, state->smth_width_Q14 ) < SILK_FIX_CONST( 0.05, 14 ) ) ) { /* Code as panned-mono; previous frame already had zero width */ /* Scale down and quantize predictors */ pred_Q13[ 0 ] = silk_RSHIFT( silk_SMULBB( state->smth_width_Q14, pred_Q13[ 0 ] ), 14 ); pred_Q13[ 1 ] = silk_RSHIFT( silk_SMULBB( state->smth_width_Q14, pred_Q13[ 1 ] ), 14 ); silk_stereo_quant_pred( pred_Q13, ix ); /* Collapse stereo width */ width_Q14 = 0; pred_Q13[ 0 ] = 0; pred_Q13[ 1 ] = 0; mid_side_rates_bps[ 0 ] = total_rate_bps; mid_side_rates_bps[ 1 ] = 0; *mid_only_flag = 1; } else if( state->width_prev_Q14 != 0 && ( 8 * total_rate_bps < 11 * min_mid_rate_bps || silk_SMULWB( frac_Q16, state->smth_width_Q14 ) < SILK_FIX_CONST( 0.02, 14 ) ) ) { /* Transition to zero-width stereo */ /* Scale down and quantize predictors */ pred_Q13[ 0 ] = silk_RSHIFT( silk_SMULBB( state->smth_width_Q14, pred_Q13[ 0 ] ), 14 ); pred_Q13[ 1 ] = silk_RSHIFT( silk_SMULBB( state->smth_width_Q14, pred_Q13[ 1 ] ), 14 ); silk_stereo_quant_pred( pred_Q13, ix ); /* Collapse stereo width */ width_Q14 = 0; pred_Q13[ 0 ] = 0; pred_Q13[ 1 ] = 0; } else if( state->smth_width_Q14 > SILK_FIX_CONST( 0.95, 14 ) ) { /* Full-width stereo coding */ silk_stereo_quant_pred( pred_Q13, ix ); width_Q14 = SILK_FIX_CONST( 1, 14 ); } else { /* Reduced-width stereo coding; scale down and quantize predictors */ pred_Q13[ 0 ] = silk_RSHIFT( silk_SMULBB( state->smth_width_Q14, pred_Q13[ 0 ] ), 14 ); pred_Q13[ 1 ] = silk_RSHIFT( silk_SMULBB( state->smth_width_Q14, pred_Q13[ 1 ] ), 14 ); silk_stereo_quant_pred( pred_Q13, ix ); width_Q14 = state->smth_width_Q14; } /* Make sure to keep on encoding until the tapered output has been transmitted */ if( *mid_only_flag == 1 ) { state->silent_side_len += frame_length - STEREO_INTERP_LEN_MS * fs_kHz; if( state->silent_side_len < LA_SHAPE_MS * fs_kHz ) { *mid_only_flag = 0; } else { /* Limit to avoid wrapping around */ state->silent_side_len = 10000; } } else { state->silent_side_len = 0; } if( *mid_only_flag == 0 && mid_side_rates_bps[ 1 ] < 1 ) { mid_side_rates_bps[ 1 ] = 1; mid_side_rates_bps[ 0 ] = silk_max_int( 1, total_rate_bps - mid_side_rates_bps[ 1 ]); } /* Interpolate predictors and subtract prediction from side channel */ pred0_Q13 = -state->pred_prev_Q13[ 0 ]; pred1_Q13 = -state->pred_prev_Q13[ 1 ]; w_Q24 = silk_LSHIFT( state->width_prev_Q14, 10 ); denom_Q16 = silk_DIV32_16( (opus_int32)1 << 16, STEREO_INTERP_LEN_MS * fs_kHz ); delta0_Q13 = -silk_RSHIFT_ROUND( silk_SMULBB( pred_Q13[ 0 ] - state->pred_prev_Q13[ 0 ], denom_Q16 ), 16 ); delta1_Q13 = -silk_RSHIFT_ROUND( silk_SMULBB( pred_Q13[ 1 ] - state->pred_prev_Q13[ 1 ], denom_Q16 ), 16 ); deltaw_Q24 = silk_LSHIFT( silk_SMULWB( width_Q14 - state->width_prev_Q14, denom_Q16 ), 10 ); for( n = 0; n < STEREO_INTERP_LEN_MS * fs_kHz; n++ ) { pred0_Q13 += delta0_Q13; pred1_Q13 += delta1_Q13; w_Q24 += deltaw_Q24; sum = silk_LSHIFT( silk_ADD_LSHIFT( mid[ n ] + (opus_int32)mid[ n + 2 ], mid[ n + 1 ], 1 ), 9 ); /* Q11 */ sum = silk_SMLAWB( silk_SMULWB( w_Q24, side[ n + 1 ] ), sum, pred0_Q13 ); /* Q8 */ sum = silk_SMLAWB( sum, silk_LSHIFT( (opus_int32)mid[ n + 1 ], 11 ), pred1_Q13 ); /* Q8 */ x2[ n - 1 ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( sum, 8 ) ); } pred0_Q13 = -pred_Q13[ 0 ]; pred1_Q13 = -pred_Q13[ 1 ]; w_Q24 = silk_LSHIFT( width_Q14, 10 ); for( n = STEREO_INTERP_LEN_MS * fs_kHz; n < frame_length; n++ ) { sum = silk_LSHIFT( silk_ADD_LSHIFT( mid[ n ] + (opus_int32)mid[ n + 2 ], mid[ n + 1 ], 1 ), 9 ); /* Q11 */ sum = silk_SMLAWB( silk_SMULWB( w_Q24, side[ n + 1 ] ), sum, pred0_Q13 ); /* Q8 */ sum = silk_SMLAWB( sum, silk_LSHIFT( (opus_int32)mid[ n + 1 ], 11 ), pred1_Q13 ); /* Q8 */ x2[ n - 1 ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( sum, 8 ) ); } state->pred_prev_Q13[ 0 ] = (opus_int16)pred_Q13[ 0 ]; state->pred_prev_Q13[ 1 ] = (opus_int16)pred_Q13[ 1 ]; state->width_prev_Q14 = (opus_int16)width_Q14; RESTORE_STACK; } mumble-1.3.4/3rdparty/opus-src/silk/control_SNR.c0000664000175000017500000000651714010707327021505 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main.h" #include "tuning_parameters.h" /* Control SNR of redidual quantizer */ opus_int silk_control_SNR( silk_encoder_state *psEncC, /* I/O Pointer to Silk encoder state */ opus_int32 TargetRate_bps /* I Target max bitrate (bps) */ ) { opus_int k, ret = SILK_NO_ERROR; opus_int32 frac_Q6; const opus_int32 *rateTable; /* Set bitrate/coding quality */ TargetRate_bps = silk_LIMIT( TargetRate_bps, MIN_TARGET_RATE_BPS, MAX_TARGET_RATE_BPS ); if( TargetRate_bps != psEncC->TargetRate_bps ) { psEncC->TargetRate_bps = TargetRate_bps; /* If new TargetRate_bps, translate to SNR_dB value */ if( psEncC->fs_kHz == 8 ) { rateTable = silk_TargetRate_table_NB; } else if( psEncC->fs_kHz == 12 ) { rateTable = silk_TargetRate_table_MB; } else { rateTable = silk_TargetRate_table_WB; } /* Reduce bitrate for 10 ms modes in these calculations */ if( psEncC->nb_subfr == 2 ) { TargetRate_bps -= REDUCE_BITRATE_10_MS_BPS; } /* Find bitrate interval in table and interpolate */ for( k = 1; k < TARGET_RATE_TAB_SZ; k++ ) { if( TargetRate_bps <= rateTable[ k ] ) { frac_Q6 = silk_DIV32( silk_LSHIFT( TargetRate_bps - rateTable[ k - 1 ], 6 ), rateTable[ k ] - rateTable[ k - 1 ] ); psEncC->SNR_dB_Q7 = silk_LSHIFT( silk_SNR_table_Q1[ k - 1 ], 6 ) + silk_MUL( frac_Q6, silk_SNR_table_Q1[ k ] - silk_SNR_table_Q1[ k - 1 ] ); break; } } } return ret; } mumble-1.3.4/3rdparty/opus-src/silk/bwexpander.c0000664000175000017500000000531014010707327021430 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "SigProc_FIX.h" /* Chirp (bandwidth expand) LP AR filter */ void silk_bwexpander( opus_int16 *ar, /* I/O AR filter to be expanded (without leading 1) */ const opus_int d, /* I Length of ar */ opus_int32 chirp_Q16 /* I Chirp factor (typically in the range 0 to 1) */ ) { opus_int i; opus_int32 chirp_minus_one_Q16 = chirp_Q16 - 65536; /* NB: Dont use silk_SMULWB, instead of silk_RSHIFT_ROUND( silk_MUL(), 16 ), below. */ /* Bias in silk_SMULWB can lead to unstable filters */ for( i = 0; i < d - 1; i++ ) { ar[ i ] = (opus_int16)silk_RSHIFT_ROUND( silk_MUL( chirp_Q16, ar[ i ] ), 16 ); chirp_Q16 += silk_RSHIFT_ROUND( silk_MUL( chirp_Q16, chirp_minus_one_Q16 ), 16 ); } ar[ d - 1 ] = (opus_int16)silk_RSHIFT_ROUND( silk_MUL( chirp_Q16, ar[ d - 1 ] ), 16 ); } mumble-1.3.4/3rdparty/opus-src/silk/gain_quant.c0000664000175000017500000001542014010707327021422 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main.h" #define OFFSET ( ( MIN_QGAIN_DB * 128 ) / 6 + 16 * 128 ) #define SCALE_Q16 ( ( 65536 * ( N_LEVELS_QGAIN - 1 ) ) / ( ( ( MAX_QGAIN_DB - MIN_QGAIN_DB ) * 128 ) / 6 ) ) #define INV_SCALE_Q16 ( ( 65536 * ( ( ( MAX_QGAIN_DB - MIN_QGAIN_DB ) * 128 ) / 6 ) ) / ( N_LEVELS_QGAIN - 1 ) ) /* Gain scalar quantization with hysteresis, uniform on log scale */ void silk_gains_quant( opus_int8 ind[ MAX_NB_SUBFR ], /* O gain indices */ opus_int32 gain_Q16[ MAX_NB_SUBFR ], /* I/O gains (quantized out) */ opus_int8 *prev_ind, /* I/O last index in previous frame */ const opus_int conditional, /* I first gain is delta coded if 1 */ const opus_int nb_subfr /* I number of subframes */ ) { opus_int k, double_step_size_threshold; for( k = 0; k < nb_subfr; k++ ) { /* Convert to log scale, scale, floor() */ ind[ k ] = silk_SMULWB( SCALE_Q16, silk_lin2log( gain_Q16[ k ] ) - OFFSET ); /* Round towards previous quantized gain (hysteresis) */ if( ind[ k ] < *prev_ind ) { ind[ k ]++; } ind[ k ] = silk_LIMIT_int( ind[ k ], 0, N_LEVELS_QGAIN - 1 ); /* Compute delta indices and limit */ if( k == 0 && conditional == 0 ) { /* Full index */ ind[ k ] = silk_LIMIT_int( ind[ k ], *prev_ind + MIN_DELTA_GAIN_QUANT, N_LEVELS_QGAIN - 1 ); *prev_ind = ind[ k ]; } else { /* Delta index */ ind[ k ] = ind[ k ] - *prev_ind; /* Double the quantization step size for large gain increases, so that the max gain level can be reached */ double_step_size_threshold = 2 * MAX_DELTA_GAIN_QUANT - N_LEVELS_QGAIN + *prev_ind; if( ind[ k ] > double_step_size_threshold ) { ind[ k ] = double_step_size_threshold + silk_RSHIFT( ind[ k ] - double_step_size_threshold + 1, 1 ); } ind[ k ] = silk_LIMIT_int( ind[ k ], MIN_DELTA_GAIN_QUANT, MAX_DELTA_GAIN_QUANT ); /* Accumulate deltas */ if( ind[ k ] > double_step_size_threshold ) { *prev_ind += silk_LSHIFT( ind[ k ], 1 ) - double_step_size_threshold; *prev_ind = silk_min_int( *prev_ind, N_LEVELS_QGAIN - 1 ); } else { *prev_ind += ind[ k ]; } /* Shift to make non-negative */ ind[ k ] -= MIN_DELTA_GAIN_QUANT; } /* Scale and convert to linear scale */ gain_Q16[ k ] = silk_log2lin( silk_min_32( silk_SMULWB( INV_SCALE_Q16, *prev_ind ) + OFFSET, 3967 ) ); /* 3967 = 31 in Q7 */ } } /* Gains scalar dequantization, uniform on log scale */ void silk_gains_dequant( opus_int32 gain_Q16[ MAX_NB_SUBFR ], /* O quantized gains */ const opus_int8 ind[ MAX_NB_SUBFR ], /* I gain indices */ opus_int8 *prev_ind, /* I/O last index in previous frame */ const opus_int conditional, /* I first gain is delta coded if 1 */ const opus_int nb_subfr /* I number of subframes */ ) { opus_int k, ind_tmp, double_step_size_threshold; for( k = 0; k < nb_subfr; k++ ) { if( k == 0 && conditional == 0 ) { /* Gain index is not allowed to go down more than 16 steps (~21.8 dB) */ *prev_ind = silk_max_int( ind[ k ], *prev_ind - 16 ); } else { /* Delta index */ ind_tmp = ind[ k ] + MIN_DELTA_GAIN_QUANT; /* Accumulate deltas */ double_step_size_threshold = 2 * MAX_DELTA_GAIN_QUANT - N_LEVELS_QGAIN + *prev_ind; if( ind_tmp > double_step_size_threshold ) { *prev_ind += silk_LSHIFT( ind_tmp, 1 ) - double_step_size_threshold; } else { *prev_ind += ind_tmp; } } *prev_ind = silk_LIMIT_int( *prev_ind, 0, N_LEVELS_QGAIN - 1 ); /* Scale and convert to linear scale */ gain_Q16[ k ] = silk_log2lin( silk_min_32( silk_SMULWB( INV_SCALE_Q16, *prev_ind ) + OFFSET, 3967 ) ); /* 3967 = 31 in Q7 */ } } /* Compute unique identifier of gain indices vector */ opus_int32 silk_gains_ID( /* O returns unique identifier of gains */ const opus_int8 ind[ MAX_NB_SUBFR ], /* I gain indices */ const opus_int nb_subfr /* I number of subframes */ ) { opus_int k; opus_int32 gainsID; gainsID = 0; for( k = 0; k < nb_subfr; k++ ) { gainsID = silk_ADD_LSHIFT32( ind[ k ], gainsID, 8 ); } return gainsID; } mumble-1.3.4/3rdparty/opus-src/silk/x86/0000775000175000017500000000000014010707327017553 5ustar builderbuildermumble-1.3.4/3rdparty/opus-src/silk/x86/SigProc_FIX_sse.h0000664000175000017500000001175614010707327022664 0ustar builderbuilder/* Copyright (c) 2014, Cisco Systems, INC Written by XiangMingZhu WeiZhou MinPeng YanWang Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef SIGPROC_FIX_SSE_H #define SIGPROC_FIX_SSE_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #if defined(OPUS_X86_MAY_HAVE_SSE4_1) void silk_burg_modified_sse4_1( opus_int32 *res_nrg, /* O Residual energy */ opus_int *res_nrg_Q, /* O Residual energy Q value */ opus_int32 A_Q16[], /* O Prediction coefficients (length order) */ const opus_int16 x[], /* I Input signal, length: nb_subfr * ( D + subfr_length ) */ const opus_int32 minInvGain_Q30, /* I Inverse of max prediction gain */ const opus_int subfr_length, /* I Input signal subframe length (incl. D preceding samples) */ const opus_int nb_subfr, /* I Number of subframes stacked in x */ const opus_int D, /* I Order */ int arch /* I Run-time architecture */ ); #if defined(OPUS_X86_PRESUME_SSE4_1) #define silk_burg_modified(res_nrg, res_nrg_Q, A_Q16, x, minInvGain_Q30, subfr_length, nb_subfr, D, arch) \ ((void)(arch), silk_burg_modified_sse4_1(res_nrg, res_nrg_Q, A_Q16, x, minInvGain_Q30, subfr_length, nb_subfr, D, arch)) #else extern void (*const SILK_BURG_MODIFIED_IMPL[OPUS_ARCHMASK + 1])( opus_int32 *res_nrg, /* O Residual energy */ opus_int *res_nrg_Q, /* O Residual energy Q value */ opus_int32 A_Q16[], /* O Prediction coefficients (length order) */ const opus_int16 x[], /* I Input signal, length: nb_subfr * ( D + subfr_length ) */ const opus_int32 minInvGain_Q30, /* I Inverse of max prediction gain */ const opus_int subfr_length, /* I Input signal subframe length (incl. D preceding samples) */ const opus_int nb_subfr, /* I Number of subframes stacked in x */ const opus_int D, /* I Order */ int arch /* I Run-time architecture */); # define silk_burg_modified(res_nrg, res_nrg_Q, A_Q16, x, minInvGain_Q30, subfr_length, nb_subfr, D, arch) \ ((*SILK_BURG_MODIFIED_IMPL[(arch) & OPUS_ARCHMASK])(res_nrg, res_nrg_Q, A_Q16, x, minInvGain_Q30, subfr_length, nb_subfr, D, arch)) #endif opus_int64 silk_inner_prod16_aligned_64_sse4_1( const opus_int16 *inVec1, const opus_int16 *inVec2, const opus_int len ); #if defined(OPUS_X86_PRESUME_SSE4_1) #define silk_inner_prod16_aligned_64(inVec1, inVec2, len, arch) \ ((void)(arch),silk_inner_prod16_aligned_64_sse4_1(inVec1, inVec2, len)) #else extern opus_int64 (*const SILK_INNER_PROD16_ALIGNED_64_IMPL[OPUS_ARCHMASK + 1])( const opus_int16 *inVec1, const opus_int16 *inVec2, const opus_int len); # define silk_inner_prod16_aligned_64(inVec1, inVec2, len, arch) \ ((*SILK_INNER_PROD16_ALIGNED_64_IMPL[(arch) & OPUS_ARCHMASK])(inVec1, inVec2, len)) #endif #endif #endif mumble-1.3.4/3rdparty/opus-src/silk/x86/VQ_WMat_EC_sse.c0000664000175000017500000001470014010707327022420 0ustar builderbuilder/* Copyright (c) 2014, Cisco Systems, INC Written by XiangMingZhu WeiZhou MinPeng YanWang Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include "main.h" #include "celt/x86/x86cpu.h" /* Entropy constrained matrix-weighted VQ, hard-coded to 5-element vectors, for a single input data vector */ void silk_VQ_WMat_EC_sse4_1( opus_int8 *ind, /* O index of best codebook vector */ opus_int32 *rate_dist_Q14, /* O best weighted quant error + mu * rate */ opus_int *gain_Q7, /* O sum of absolute LTP coefficients */ const opus_int16 *in_Q14, /* I input vector to be quantized */ const opus_int32 *W_Q18, /* I weighting matrix */ const opus_int8 *cb_Q7, /* I codebook */ const opus_uint8 *cb_gain_Q7, /* I codebook effective gain */ const opus_uint8 *cl_Q5, /* I code length for each codebook vector */ const opus_int mu_Q9, /* I tradeoff betw. weighted error and rate */ const opus_int32 max_gain_Q7, /* I maximum sum of absolute LTP coefficients */ opus_int L /* I number of vectors in codebook */ ) { opus_int k, gain_tmp_Q7; const opus_int8 *cb_row_Q7; opus_int16 diff_Q14[ 5 ]; opus_int32 sum1_Q14, sum2_Q16; __m128i C_tmp1, C_tmp2, C_tmp3, C_tmp4, C_tmp5; /* Loop over codebook */ *rate_dist_Q14 = silk_int32_MAX; cb_row_Q7 = cb_Q7; for( k = 0; k < L; k++ ) { gain_tmp_Q7 = cb_gain_Q7[k]; diff_Q14[ 0 ] = in_Q14[ 0 ] - silk_LSHIFT( cb_row_Q7[ 0 ], 7 ); C_tmp1 = OP_CVTEPI16_EPI32_M64( &in_Q14[ 1 ] ); C_tmp2 = OP_CVTEPI8_EPI32_M32( &cb_row_Q7[ 1 ] ); C_tmp2 = _mm_slli_epi32( C_tmp2, 7 ); C_tmp1 = _mm_sub_epi32( C_tmp1, C_tmp2 ); diff_Q14[ 1 ] = _mm_extract_epi16( C_tmp1, 0 ); diff_Q14[ 2 ] = _mm_extract_epi16( C_tmp1, 2 ); diff_Q14[ 3 ] = _mm_extract_epi16( C_tmp1, 4 ); diff_Q14[ 4 ] = _mm_extract_epi16( C_tmp1, 6 ); /* Weighted rate */ sum1_Q14 = silk_SMULBB( mu_Q9, cl_Q5[ k ] ); /* Penalty for too large gain */ sum1_Q14 = silk_ADD_LSHIFT32( sum1_Q14, silk_max( silk_SUB32( gain_tmp_Q7, max_gain_Q7 ), 0 ), 10 ); silk_assert( sum1_Q14 >= 0 ); /* first row of W_Q18 */ C_tmp3 = _mm_loadu_si128( (__m128i *)(&W_Q18[ 1 ] ) ); C_tmp4 = _mm_mul_epi32( C_tmp3, C_tmp1 ); C_tmp4 = _mm_srli_si128( C_tmp4, 2 ); C_tmp1 = _mm_shuffle_epi32( C_tmp1, _MM_SHUFFLE( 0, 3, 2, 1 ) ); /* shift right 4 bytes */ C_tmp3 = _mm_shuffle_epi32( C_tmp3, _MM_SHUFFLE( 0, 3, 2, 1 ) ); /* shift right 4 bytes */ C_tmp5 = _mm_mul_epi32( C_tmp3, C_tmp1 ); C_tmp5 = _mm_srli_si128( C_tmp5, 2 ); C_tmp5 = _mm_add_epi32( C_tmp4, C_tmp5 ); C_tmp5 = _mm_slli_epi32( C_tmp5, 1 ); C_tmp5 = _mm_add_epi32( C_tmp5, _mm_shuffle_epi32( C_tmp5, _MM_SHUFFLE( 0, 0, 0, 2 ) ) ); sum2_Q16 = _mm_cvtsi128_si32( C_tmp5 ); sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 0 ], diff_Q14[ 0 ] ); sum1_Q14 = silk_SMLAWB( sum1_Q14, sum2_Q16, diff_Q14[ 0 ] ); /* second row of W_Q18 */ sum2_Q16 = silk_SMULWB( W_Q18[ 7 ], diff_Q14[ 2 ] ); sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 8 ], diff_Q14[ 3 ] ); sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 9 ], diff_Q14[ 4 ] ); sum2_Q16 = silk_LSHIFT( sum2_Q16, 1 ); sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 6 ], diff_Q14[ 1 ] ); sum1_Q14 = silk_SMLAWB( sum1_Q14, sum2_Q16, diff_Q14[ 1 ] ); /* third row of W_Q18 */ sum2_Q16 = silk_SMULWB( W_Q18[ 13 ], diff_Q14[ 3 ] ); sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 14 ], diff_Q14[ 4 ] ); sum2_Q16 = silk_LSHIFT( sum2_Q16, 1 ); sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 12 ], diff_Q14[ 2 ] ); sum1_Q14 = silk_SMLAWB( sum1_Q14, sum2_Q16, diff_Q14[ 2 ] ); /* fourth row of W_Q18 */ sum2_Q16 = silk_SMULWB( W_Q18[ 19 ], diff_Q14[ 4 ] ); sum2_Q16 = silk_LSHIFT( sum2_Q16, 1 ); sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 18 ], diff_Q14[ 3 ] ); sum1_Q14 = silk_SMLAWB( sum1_Q14, sum2_Q16, diff_Q14[ 3 ] ); /* last row of W_Q18 */ sum2_Q16 = silk_SMULWB( W_Q18[ 24 ], diff_Q14[ 4 ] ); sum1_Q14 = silk_SMLAWB( sum1_Q14, sum2_Q16, diff_Q14[ 4 ] ); silk_assert( sum1_Q14 >= 0 ); /* find best */ if( sum1_Q14 < *rate_dist_Q14 ) { *rate_dist_Q14 = sum1_Q14; *ind = (opus_int8)k; *gain_Q7 = gain_tmp_Q7; } /* Go to next cbk vector */ cb_row_Q7 += LTP_ORDER; } } mumble-1.3.4/3rdparty/opus-src/silk/x86/NSQ_del_dec_sse.c0000664000175000017500000013266314010707327022704 0ustar builderbuilder/* Copyright (c) 2014, Cisco Systems, INC Written by XiangMingZhu WeiZhou MinPeng YanWang Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include "main.h" #include "celt/x86/x86cpu.h" #include "stack_alloc.h" typedef struct { opus_int32 sLPC_Q14[ MAX_SUB_FRAME_LENGTH + NSQ_LPC_BUF_LENGTH ]; opus_int32 RandState[ DECISION_DELAY ]; opus_int32 Q_Q10[ DECISION_DELAY ]; opus_int32 Xq_Q14[ DECISION_DELAY ]; opus_int32 Pred_Q15[ DECISION_DELAY ]; opus_int32 Shape_Q14[ DECISION_DELAY ]; opus_int32 sAR2_Q14[ MAX_SHAPE_LPC_ORDER ]; opus_int32 LF_AR_Q14; opus_int32 Seed; opus_int32 SeedInit; opus_int32 RD_Q10; } NSQ_del_dec_struct; typedef struct { opus_int32 Q_Q10; opus_int32 RD_Q10; opus_int32 xq_Q14; opus_int32 LF_AR_Q14; opus_int32 sLTP_shp_Q14; opus_int32 LPC_exc_Q14; } NSQ_sample_struct; typedef NSQ_sample_struct NSQ_sample_pair[ 2 ]; static OPUS_INLINE void silk_nsq_del_dec_scale_states_sse4_1( const silk_encoder_state *psEncC, /* I Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */ const opus_int32 x_Q3[], /* I Input in Q3 */ opus_int32 x_sc_Q10[], /* O Input scaled with 1/Gain in Q10 */ const opus_int16 sLTP[], /* I Re-whitened LTP state in Q0 */ opus_int32 sLTP_Q15[], /* O LTP state matching scaled input */ opus_int subfr, /* I Subframe number */ opus_int nStatesDelayedDecision, /* I Number of del dec states */ const opus_int LTP_scale_Q14, /* I LTP state scaling */ const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I */ const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag */ const opus_int signal_type, /* I Signal type */ const opus_int decisionDelay /* I Decision delay */ ); /******************************************/ /* Noise shape quantizer for one subframe */ /******************************************/ static OPUS_INLINE void silk_noise_shape_quantizer_del_dec_sse4_1( silk_nsq_state *NSQ, /* I/O NSQ state */ NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */ opus_int signalType, /* I Signal type */ const opus_int32 x_Q10[], /* I */ opus_int8 pulses[], /* O */ opus_int16 xq[], /* O */ opus_int32 sLTP_Q15[], /* I/O LTP filter state */ opus_int32 delayedGain_Q10[], /* I/O Gain delay buffer */ const opus_int16 a_Q12[], /* I Short term prediction coefs */ const opus_int16 b_Q14[], /* I Long term prediction coefs */ const opus_int16 AR_shp_Q13[], /* I Noise shaping coefs */ opus_int lag, /* I Pitch lag */ opus_int32 HarmShapeFIRPacked_Q14, /* I */ opus_int Tilt_Q14, /* I Spectral tilt */ opus_int32 LF_shp_Q14, /* I */ opus_int32 Gain_Q16, /* I */ opus_int Lambda_Q10, /* I */ opus_int offset_Q10, /* I */ opus_int length, /* I Input length */ opus_int subfr, /* I Subframe number */ opus_int shapingLPCOrder, /* I Shaping LPC filter order */ opus_int predictLPCOrder, /* I Prediction filter order */ opus_int warping_Q16, /* I */ opus_int nStatesDelayedDecision, /* I Number of states in decision tree */ opus_int *smpl_buf_idx, /* I/O Index to newest samples in buffers */ opus_int decisionDelay /* I */ ); void silk_NSQ_del_dec_sse4_1( const silk_encoder_state *psEncC, /* I Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ SideInfoIndices *psIndices, /* I/O Quantization Indices */ const opus_int32 x_Q3[], /* I Prefiltered input signal */ opus_int8 pulses[], /* O Quantized pulse signal */ const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */ const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */ const opus_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */ const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */ const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */ const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I Quantization step sizes */ const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */ const opus_int Lambda_Q10, /* I Rate/distortion tradeoff */ const opus_int LTP_scale_Q14 /* I LTP state scaling */ ) { opus_int i, k, lag, start_idx, LSF_interpolation_flag, Winner_ind, subfr; opus_int last_smple_idx, smpl_buf_idx, decisionDelay; const opus_int16 *A_Q12, *B_Q14, *AR_shp_Q13; opus_int16 *pxq; VARDECL( opus_int32, sLTP_Q15 ); VARDECL( opus_int16, sLTP ); opus_int32 HarmShapeFIRPacked_Q14; opus_int offset_Q10; opus_int32 RDmin_Q10, Gain_Q10; VARDECL( opus_int32, x_sc_Q10 ); VARDECL( opus_int32, delayedGain_Q10 ); VARDECL( NSQ_del_dec_struct, psDelDec ); NSQ_del_dec_struct *psDD; SAVE_STACK; /* Set unvoiced lag to the previous one, overwrite later for voiced */ lag = NSQ->lagPrev; silk_assert( NSQ->prev_gain_Q16 != 0 ); /* Initialize delayed decision states */ ALLOC( psDelDec, psEncC->nStatesDelayedDecision, NSQ_del_dec_struct ); silk_memset( psDelDec, 0, psEncC->nStatesDelayedDecision * sizeof( NSQ_del_dec_struct ) ); for( k = 0; k < psEncC->nStatesDelayedDecision; k++ ) { psDD = &psDelDec[ k ]; psDD->Seed = ( k + psIndices->Seed ) & 3; psDD->SeedInit = psDD->Seed; psDD->RD_Q10 = 0; psDD->LF_AR_Q14 = NSQ->sLF_AR_shp_Q14; psDD->Shape_Q14[ 0 ] = NSQ->sLTP_shp_Q14[ psEncC->ltp_mem_length - 1 ]; silk_memcpy( psDD->sLPC_Q14, NSQ->sLPC_Q14, NSQ_LPC_BUF_LENGTH * sizeof( opus_int32 ) ); silk_memcpy( psDD->sAR2_Q14, NSQ->sAR2_Q14, sizeof( NSQ->sAR2_Q14 ) ); } offset_Q10 = silk_Quantization_Offsets_Q10[ psIndices->signalType >> 1 ][ psIndices->quantOffsetType ]; smpl_buf_idx = 0; /* index of oldest samples */ decisionDelay = silk_min_int( DECISION_DELAY, psEncC->subfr_length ); /* For voiced frames limit the decision delay to lower than the pitch lag */ if( psIndices->signalType == TYPE_VOICED ) { for( k = 0; k < psEncC->nb_subfr; k++ ) { decisionDelay = silk_min_int( decisionDelay, pitchL[ k ] - LTP_ORDER / 2 - 1 ); } } else { if( lag > 0 ) { decisionDelay = silk_min_int( decisionDelay, lag - LTP_ORDER / 2 - 1 ); } } if( psIndices->NLSFInterpCoef_Q2 == 4 ) { LSF_interpolation_flag = 0; } else { LSF_interpolation_flag = 1; } ALLOC( sLTP_Q15, psEncC->ltp_mem_length + psEncC->frame_length, opus_int32 ); ALLOC( sLTP, psEncC->ltp_mem_length + psEncC->frame_length, opus_int16 ); ALLOC( x_sc_Q10, psEncC->subfr_length, opus_int32 ); ALLOC( delayedGain_Q10, DECISION_DELAY, opus_int32 ); /* Set up pointers to start of sub frame */ pxq = &NSQ->xq[ psEncC->ltp_mem_length ]; NSQ->sLTP_shp_buf_idx = psEncC->ltp_mem_length; NSQ->sLTP_buf_idx = psEncC->ltp_mem_length; subfr = 0; for( k = 0; k < psEncC->nb_subfr; k++ ) { A_Q12 = &PredCoef_Q12[ ( ( k >> 1 ) | ( 1 - LSF_interpolation_flag ) ) * MAX_LPC_ORDER ]; B_Q14 = <PCoef_Q14[ k * LTP_ORDER ]; AR_shp_Q13 = &AR2_Q13[ k * MAX_SHAPE_LPC_ORDER ]; /* Noise shape parameters */ silk_assert( HarmShapeGain_Q14[ k ] >= 0 ); HarmShapeFIRPacked_Q14 = silk_RSHIFT( HarmShapeGain_Q14[ k ], 2 ); HarmShapeFIRPacked_Q14 |= silk_LSHIFT( (opus_int32)silk_RSHIFT( HarmShapeGain_Q14[ k ], 1 ), 16 ); NSQ->rewhite_flag = 0; if( psIndices->signalType == TYPE_VOICED ) { /* Voiced */ lag = pitchL[ k ]; /* Re-whitening */ if( ( k & ( 3 - silk_LSHIFT( LSF_interpolation_flag, 1 ) ) ) == 0 ) { if( k == 2 ) { /* RESET DELAYED DECISIONS */ /* Find winner */ RDmin_Q10 = psDelDec[ 0 ].RD_Q10; Winner_ind = 0; for( i = 1; i < psEncC->nStatesDelayedDecision; i++ ) { if( psDelDec[ i ].RD_Q10 < RDmin_Q10 ) { RDmin_Q10 = psDelDec[ i ].RD_Q10; Winner_ind = i; } } for( i = 0; i < psEncC->nStatesDelayedDecision; i++ ) { if( i != Winner_ind ) { psDelDec[ i ].RD_Q10 += ( silk_int32_MAX >> 4 ); silk_assert( psDelDec[ i ].RD_Q10 >= 0 ); } } /* Copy final part of signals from winner state to output and long-term filter states */ psDD = &psDelDec[ Winner_ind ]; last_smple_idx = smpl_buf_idx + decisionDelay; for( i = 0; i < decisionDelay; i++ ) { last_smple_idx = ( last_smple_idx - 1 ) % DECISION_DELAY; if( last_smple_idx < 0 ) last_smple_idx += DECISION_DELAY; pulses[ i - decisionDelay ] = (opus_int8)silk_RSHIFT_ROUND( psDD->Q_Q10[ last_smple_idx ], 10 ); pxq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( psDD->Xq_Q14[ last_smple_idx ], Gains_Q16[ 1 ] ), 14 ) ); NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - decisionDelay + i ] = psDD->Shape_Q14[ last_smple_idx ]; } subfr = 0; } /* Rewhiten with new A coefs */ start_idx = psEncC->ltp_mem_length - lag - psEncC->predictLPCOrder - LTP_ORDER / 2; silk_assert( start_idx > 0 ); silk_LPC_analysis_filter( &sLTP[ start_idx ], &NSQ->xq[ start_idx + k * psEncC->subfr_length ], A_Q12, psEncC->ltp_mem_length - start_idx, psEncC->predictLPCOrder, psEncC->arch ); NSQ->sLTP_buf_idx = psEncC->ltp_mem_length; NSQ->rewhite_flag = 1; } } silk_nsq_del_dec_scale_states_sse4_1( psEncC, NSQ, psDelDec, x_Q3, x_sc_Q10, sLTP, sLTP_Q15, k, psEncC->nStatesDelayedDecision, LTP_scale_Q14, Gains_Q16, pitchL, psIndices->signalType, decisionDelay ); silk_noise_shape_quantizer_del_dec_sse4_1( NSQ, psDelDec, psIndices->signalType, x_sc_Q10, pulses, pxq, sLTP_Q15, delayedGain_Q10, A_Q12, B_Q14, AR_shp_Q13, lag, HarmShapeFIRPacked_Q14, Tilt_Q14[ k ], LF_shp_Q14[ k ], Gains_Q16[ k ], Lambda_Q10, offset_Q10, psEncC->subfr_length, subfr++, psEncC->shapingLPCOrder, psEncC->predictLPCOrder, psEncC->warping_Q16, psEncC->nStatesDelayedDecision, &smpl_buf_idx, decisionDelay ); x_Q3 += psEncC->subfr_length; pulses += psEncC->subfr_length; pxq += psEncC->subfr_length; } /* Find winner */ RDmin_Q10 = psDelDec[ 0 ].RD_Q10; Winner_ind = 0; for( k = 1; k < psEncC->nStatesDelayedDecision; k++ ) { if( psDelDec[ k ].RD_Q10 < RDmin_Q10 ) { RDmin_Q10 = psDelDec[ k ].RD_Q10; Winner_ind = k; } } /* Copy final part of signals from winner state to output and long-term filter states */ psDD = &psDelDec[ Winner_ind ]; psIndices->Seed = psDD->SeedInit; last_smple_idx = smpl_buf_idx + decisionDelay; Gain_Q10 = silk_RSHIFT32( Gains_Q16[ psEncC->nb_subfr - 1 ], 6 ); for( i = 0; i < decisionDelay; i++ ) { last_smple_idx = ( last_smple_idx - 1 ) % DECISION_DELAY; if( last_smple_idx < 0 ) last_smple_idx += DECISION_DELAY; pulses[ i - decisionDelay ] = (opus_int8)silk_RSHIFT_ROUND( psDD->Q_Q10[ last_smple_idx ], 10 ); pxq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( psDD->Xq_Q14[ last_smple_idx ], Gain_Q10 ), 8 ) ); NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - decisionDelay + i ] = psDD->Shape_Q14[ last_smple_idx ]; } silk_memcpy( NSQ->sLPC_Q14, &psDD->sLPC_Q14[ psEncC->subfr_length ], NSQ_LPC_BUF_LENGTH * sizeof( opus_int32 ) ); silk_memcpy( NSQ->sAR2_Q14, psDD->sAR2_Q14, sizeof( psDD->sAR2_Q14 ) ); /* Update states */ NSQ->sLF_AR_shp_Q14 = psDD->LF_AR_Q14; NSQ->lagPrev = pitchL[ psEncC->nb_subfr - 1 ]; /* Save quantized speech signal */ silk_memmove( NSQ->xq, &NSQ->xq[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int16 ) ); silk_memmove( NSQ->sLTP_shp_Q14, &NSQ->sLTP_shp_Q14[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int32 ) ); RESTORE_STACK; } /******************************************/ /* Noise shape quantizer for one subframe */ /******************************************/ static OPUS_INLINE void silk_noise_shape_quantizer_del_dec_sse4_1( silk_nsq_state *NSQ, /* I/O NSQ state */ NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */ opus_int signalType, /* I Signal type */ const opus_int32 x_Q10[], /* I */ opus_int8 pulses[], /* O */ opus_int16 xq[], /* O */ opus_int32 sLTP_Q15[], /* I/O LTP filter state */ opus_int32 delayedGain_Q10[], /* I/O Gain delay buffer */ const opus_int16 a_Q12[], /* I Short term prediction coefs */ const opus_int16 b_Q14[], /* I Long term prediction coefs */ const opus_int16 AR_shp_Q13[], /* I Noise shaping coefs */ opus_int lag, /* I Pitch lag */ opus_int32 HarmShapeFIRPacked_Q14, /* I */ opus_int Tilt_Q14, /* I Spectral tilt */ opus_int32 LF_shp_Q14, /* I */ opus_int32 Gain_Q16, /* I */ opus_int Lambda_Q10, /* I */ opus_int offset_Q10, /* I */ opus_int length, /* I Input length */ opus_int subfr, /* I Subframe number */ opus_int shapingLPCOrder, /* I Shaping LPC filter order */ opus_int predictLPCOrder, /* I Prediction filter order */ opus_int warping_Q16, /* I */ opus_int nStatesDelayedDecision, /* I Number of states in decision tree */ opus_int *smpl_buf_idx, /* I/O Index to newest samples in buffers */ opus_int decisionDelay /* I */ ) { opus_int i, j, k, Winner_ind, RDmin_ind, RDmax_ind, last_smple_idx; opus_int32 Winner_rand_state; opus_int32 LTP_pred_Q14, LPC_pred_Q14, n_AR_Q14, n_LTP_Q14; opus_int32 n_LF_Q14, r_Q10, rr_Q10, rd1_Q10, rd2_Q10, RDmin_Q10, RDmax_Q10; opus_int32 q1_Q0, q1_Q10, q2_Q10, exc_Q14, LPC_exc_Q14, xq_Q14, Gain_Q10; opus_int32 tmp1, tmp2, sLF_AR_shp_Q14; opus_int32 *pred_lag_ptr, *shp_lag_ptr, *psLPC_Q14; VARDECL( NSQ_sample_pair, psSampleState ); NSQ_del_dec_struct *psDD; NSQ_sample_struct *psSS; __m128i a_Q12_0123, a_Q12_4567, a_Q12_89AB, a_Q12_CDEF; __m128i b_Q12_0123, b_sr_Q12_0123; SAVE_STACK; silk_assert( nStatesDelayedDecision > 0 ); ALLOC( psSampleState, nStatesDelayedDecision, NSQ_sample_pair ); shp_lag_ptr = &NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - lag + HARM_SHAPE_FIR_TAPS / 2 ]; pred_lag_ptr = &sLTP_Q15[ NSQ->sLTP_buf_idx - lag + LTP_ORDER / 2 ]; Gain_Q10 = silk_RSHIFT( Gain_Q16, 6 ); a_Q12_0123 = OP_CVTEPI16_EPI32_M64( a_Q12 ); a_Q12_4567 = OP_CVTEPI16_EPI32_M64( a_Q12 + 4 ); if( opus_likely( predictLPCOrder == 16 ) ) { a_Q12_89AB = OP_CVTEPI16_EPI32_M64( a_Q12 + 8 ); a_Q12_CDEF = OP_CVTEPI16_EPI32_M64( a_Q12 + 12 ); } if( signalType == TYPE_VOICED ){ b_Q12_0123 = OP_CVTEPI16_EPI32_M64( b_Q14 ); b_sr_Q12_0123 = _mm_shuffle_epi32( b_Q12_0123, _MM_SHUFFLE( 0, 3, 2, 1 ) ); /* equal shift right 4 bytes */ } for( i = 0; i < length; i++ ) { /* Perform common calculations used in all states */ /* Long-term prediction */ if( signalType == TYPE_VOICED ) { /* Unrolled loop */ /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ LTP_pred_Q14 = 2; { __m128i tmpa, tmpb, pred_lag_ptr_tmp; pred_lag_ptr_tmp = _mm_loadu_si128( (__m128i *)(&pred_lag_ptr[ -3 ] ) ); pred_lag_ptr_tmp = _mm_shuffle_epi32( pred_lag_ptr_tmp, 0x1B ); tmpa = _mm_mul_epi32( pred_lag_ptr_tmp, b_Q12_0123 ); tmpa = _mm_srli_si128( tmpa, 2 ); pred_lag_ptr_tmp = _mm_shuffle_epi32( pred_lag_ptr_tmp, _MM_SHUFFLE( 0, 3, 2, 1 ) );/* equal shift right 4 bytes */ pred_lag_ptr_tmp = _mm_mul_epi32( pred_lag_ptr_tmp, b_sr_Q12_0123 ); pred_lag_ptr_tmp = _mm_srli_si128( pred_lag_ptr_tmp, 2 ); pred_lag_ptr_tmp = _mm_add_epi32( pred_lag_ptr_tmp, tmpa ); tmpb = _mm_shuffle_epi32( pred_lag_ptr_tmp, _MM_SHUFFLE( 0, 0, 3, 2 ) );/* equal shift right 8 bytes */ pred_lag_ptr_tmp = _mm_add_epi32( pred_lag_ptr_tmp, tmpb ); LTP_pred_Q14 += _mm_cvtsi128_si32( pred_lag_ptr_tmp ); LTP_pred_Q14 = silk_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -4 ], b_Q14[ 4 ] ); LTP_pred_Q14 = silk_LSHIFT( LTP_pred_Q14, 1 ); /* Q13 -> Q14 */ pred_lag_ptr++; } } else { LTP_pred_Q14 = 0; } /* Long-term shaping */ if( lag > 0 ) { /* Symmetric, packed FIR coefficients */ n_LTP_Q14 = silk_SMULWB( silk_ADD32( shp_lag_ptr[ 0 ], shp_lag_ptr[ -2 ] ), HarmShapeFIRPacked_Q14 ); n_LTP_Q14 = silk_SMLAWT( n_LTP_Q14, shp_lag_ptr[ -1 ], HarmShapeFIRPacked_Q14 ); n_LTP_Q14 = silk_SUB_LSHIFT32( LTP_pred_Q14, n_LTP_Q14, 2 ); /* Q12 -> Q14 */ shp_lag_ptr++; } else { n_LTP_Q14 = 0; } { __m128i tmpa, tmpb, psLPC_Q14_tmp, a_Q12_tmp; for( k = 0; k < nStatesDelayedDecision; k++ ) { /* Delayed decision state */ psDD = &psDelDec[ k ]; /* Sample state */ psSS = psSampleState[ k ]; /* Generate dither */ psDD->Seed = silk_RAND( psDD->Seed ); /* Pointer used in short term prediction and shaping */ psLPC_Q14 = &psDD->sLPC_Q14[ NSQ_LPC_BUF_LENGTH - 1 + i ]; /* Short-term prediction */ silk_assert( predictLPCOrder == 10 || predictLPCOrder == 16 ); /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ LPC_pred_Q14 = silk_RSHIFT( predictLPCOrder, 1 ); tmpb = _mm_setzero_si128(); /* step 1 */ psLPC_Q14_tmp = _mm_loadu_si128( (__m128i *)(&psLPC_Q14[ -3 ] ) ); /* -3, -2 , -1, 0 */ psLPC_Q14_tmp = _mm_shuffle_epi32( psLPC_Q14_tmp, 0x1B ); /* 0, -1, -2, -3 */ tmpa = _mm_mul_epi32( psLPC_Q14_tmp, a_Q12_0123 ); /* 0, -1, -2, -3 * 0123 -> 0*0, 2*-2 */ tmpa = _mm_srli_epi64( tmpa, 16 ); tmpb = _mm_add_epi32( tmpb, tmpa ); psLPC_Q14_tmp = _mm_shuffle_epi32( psLPC_Q14_tmp, _MM_SHUFFLE( 0, 3, 2, 1 ) ); /* equal shift right 4 bytes */ a_Q12_tmp = _mm_shuffle_epi32( a_Q12_0123, _MM_SHUFFLE(0, 3, 2, 1 ) ); /* equal shift right 4 bytes */ psLPC_Q14_tmp = _mm_mul_epi32( psLPC_Q14_tmp, a_Q12_tmp ); /* 1*-1, 3*-3 */ psLPC_Q14_tmp = _mm_srli_epi64( psLPC_Q14_tmp, 16 ); tmpb = _mm_add_epi32( tmpb, psLPC_Q14_tmp ); /* step 2 */ psLPC_Q14_tmp = _mm_loadu_si128( (__m128i *)(&psLPC_Q14[ -7 ] ) ); psLPC_Q14_tmp = _mm_shuffle_epi32( psLPC_Q14_tmp, 0x1B ); tmpa = _mm_mul_epi32( psLPC_Q14_tmp, a_Q12_4567 ); tmpa = _mm_srli_epi64( tmpa, 16 ); tmpb = _mm_add_epi32( tmpb, tmpa ); psLPC_Q14_tmp = _mm_shuffle_epi32( psLPC_Q14_tmp, _MM_SHUFFLE( 0, 3, 2, 1 ) ); /* equal shift right 4 bytes */ a_Q12_tmp = _mm_shuffle_epi32( a_Q12_4567, _MM_SHUFFLE(0, 3, 2, 1 ) ); /* equal shift right 4 bytes */ psLPC_Q14_tmp = _mm_mul_epi32( psLPC_Q14_tmp, a_Q12_tmp ); psLPC_Q14_tmp = _mm_srli_epi64( psLPC_Q14_tmp, 16 ); tmpb = _mm_add_epi32( tmpb, psLPC_Q14_tmp ); if ( opus_likely( predictLPCOrder == 16 ) ) { /* step 3 */ psLPC_Q14_tmp = _mm_loadu_si128( (__m128i *)(&psLPC_Q14[ -11 ] ) ); psLPC_Q14_tmp = _mm_shuffle_epi32( psLPC_Q14_tmp, 0x1B ); tmpa = _mm_mul_epi32( psLPC_Q14_tmp, a_Q12_89AB ); tmpa = _mm_srli_epi64( tmpa, 16 ); tmpb = _mm_add_epi32( tmpb, tmpa ); psLPC_Q14_tmp = _mm_shuffle_epi32( psLPC_Q14_tmp, _MM_SHUFFLE( 0, 3, 2, 1 ) ); /* equal shift right 4 bytes */ a_Q12_tmp = _mm_shuffle_epi32( a_Q12_89AB, _MM_SHUFFLE(0, 3, 2, 1 ) );/* equal shift right 4 bytes */ psLPC_Q14_tmp = _mm_mul_epi32( psLPC_Q14_tmp, a_Q12_tmp ); psLPC_Q14_tmp = _mm_srli_epi64( psLPC_Q14_tmp, 16 ); tmpb = _mm_add_epi32( tmpb, psLPC_Q14_tmp ); /* setp 4 */ psLPC_Q14_tmp = _mm_loadu_si128( (__m128i *)(&psLPC_Q14[ -15 ] ) ); psLPC_Q14_tmp = _mm_shuffle_epi32( psLPC_Q14_tmp, 0x1B ); tmpa = _mm_mul_epi32( psLPC_Q14_tmp, a_Q12_CDEF ); tmpa = _mm_srli_epi64( tmpa, 16 ); tmpb = _mm_add_epi32( tmpb, tmpa ); psLPC_Q14_tmp = _mm_shuffle_epi32( psLPC_Q14_tmp, _MM_SHUFFLE( 0, 3, 2, 1 ) ); /* equal shift right 4 bytes */ a_Q12_tmp = _mm_shuffle_epi32( a_Q12_CDEF, _MM_SHUFFLE(0, 3, 2, 1 ) ); /* equal shift right 4 bytes */ psLPC_Q14_tmp = _mm_mul_epi32( psLPC_Q14_tmp, a_Q12_tmp ); psLPC_Q14_tmp = _mm_srli_epi64( psLPC_Q14_tmp, 16 ); tmpb = _mm_add_epi32( tmpb, psLPC_Q14_tmp ); /* add at last */ /* equal shift right 8 bytes*/ tmpa = _mm_shuffle_epi32( tmpb, _MM_SHUFFLE( 0, 0, 3, 2 ) ); tmpb = _mm_add_epi32( tmpb, tmpa ); LPC_pred_Q14 += _mm_cvtsi128_si32( tmpb ); } else { /* add at last */ tmpa = _mm_shuffle_epi32( tmpb, _MM_SHUFFLE( 0, 0, 3, 2 ) ); /* equal shift right 8 bytes*/ tmpb = _mm_add_epi32( tmpb, tmpa ); LPC_pred_Q14 += _mm_cvtsi128_si32( tmpb ); LPC_pred_Q14 = silk_SMLAWB( LPC_pred_Q14, psLPC_Q14[ -8 ], a_Q12[ 8 ] ); LPC_pred_Q14 = silk_SMLAWB( LPC_pred_Q14, psLPC_Q14[ -9 ], a_Q12[ 9 ] ); } LPC_pred_Q14 = silk_LSHIFT( LPC_pred_Q14, 4 ); /* Q10 -> Q14 */ /* Noise shape feedback */ silk_assert( ( shapingLPCOrder & 1 ) == 0 ); /* check that order is even */ /* Output of lowpass section */ tmp2 = silk_SMLAWB( psLPC_Q14[ 0 ], psDD->sAR2_Q14[ 0 ], warping_Q16 ); /* Output of allpass section */ tmp1 = silk_SMLAWB( psDD->sAR2_Q14[ 0 ], psDD->sAR2_Q14[ 1 ] - tmp2, warping_Q16 ); psDD->sAR2_Q14[ 0 ] = tmp2; n_AR_Q14 = silk_RSHIFT( shapingLPCOrder, 1 ); n_AR_Q14 = silk_SMLAWB( n_AR_Q14, tmp2, AR_shp_Q13[ 0 ] ); /* Loop over allpass sections */ for( j = 2; j < shapingLPCOrder; j += 2 ) { /* Output of allpass section */ tmp2 = silk_SMLAWB( psDD->sAR2_Q14[ j - 1 ], psDD->sAR2_Q14[ j + 0 ] - tmp1, warping_Q16 ); psDD->sAR2_Q14[ j - 1 ] = tmp1; n_AR_Q14 = silk_SMLAWB( n_AR_Q14, tmp1, AR_shp_Q13[ j - 1 ] ); /* Output of allpass section */ tmp1 = silk_SMLAWB( psDD->sAR2_Q14[ j + 0 ], psDD->sAR2_Q14[ j + 1 ] - tmp2, warping_Q16 ); psDD->sAR2_Q14[ j + 0 ] = tmp2; n_AR_Q14 = silk_SMLAWB( n_AR_Q14, tmp2, AR_shp_Q13[ j ] ); } psDD->sAR2_Q14[ shapingLPCOrder - 1 ] = tmp1; n_AR_Q14 = silk_SMLAWB( n_AR_Q14, tmp1, AR_shp_Q13[ shapingLPCOrder - 1 ] ); n_AR_Q14 = silk_LSHIFT( n_AR_Q14, 1 ); /* Q11 -> Q12 */ n_AR_Q14 = silk_SMLAWB( n_AR_Q14, psDD->LF_AR_Q14, Tilt_Q14 ); /* Q12 */ n_AR_Q14 = silk_LSHIFT( n_AR_Q14, 2 ); /* Q12 -> Q14 */ n_LF_Q14 = silk_SMULWB( psDD->Shape_Q14[ *smpl_buf_idx ], LF_shp_Q14 ); /* Q12 */ n_LF_Q14 = silk_SMLAWT( n_LF_Q14, psDD->LF_AR_Q14, LF_shp_Q14 ); /* Q12 */ n_LF_Q14 = silk_LSHIFT( n_LF_Q14, 2 ); /* Q12 -> Q14 */ /* Input minus prediction plus noise feedback */ /* r = x[ i ] - LTP_pred - LPC_pred + n_AR + n_Tilt + n_LF + n_LTP */ tmp1 = silk_ADD32( n_AR_Q14, n_LF_Q14 ); /* Q14 */ tmp2 = silk_ADD32( n_LTP_Q14, LPC_pred_Q14 ); /* Q13 */ tmp1 = silk_SUB32( tmp2, tmp1 ); /* Q13 */ tmp1 = silk_RSHIFT_ROUND( tmp1, 4 ); /* Q10 */ r_Q10 = silk_SUB32( x_Q10[ i ], tmp1 ); /* residual error Q10 */ /* Flip sign depending on dither */ if ( psDD->Seed < 0 ) { r_Q10 = -r_Q10; } r_Q10 = silk_LIMIT_32( r_Q10, -(31 << 10), 30 << 10 ); /* Find two quantization level candidates and measure their rate-distortion */ q1_Q10 = silk_SUB32( r_Q10, offset_Q10 ); q1_Q0 = silk_RSHIFT( q1_Q10, 10 ); if( q1_Q0 > 0 ) { q1_Q10 = silk_SUB32( silk_LSHIFT( q1_Q0, 10 ), QUANT_LEVEL_ADJUST_Q10 ); q1_Q10 = silk_ADD32( q1_Q10, offset_Q10 ); q2_Q10 = silk_ADD32( q1_Q10, 1024 ); rd1_Q10 = silk_SMULBB( q1_Q10, Lambda_Q10 ); rd2_Q10 = silk_SMULBB( q2_Q10, Lambda_Q10 ); } else if( q1_Q0 == 0 ) { q1_Q10 = offset_Q10; q2_Q10 = silk_ADD32( q1_Q10, 1024 - QUANT_LEVEL_ADJUST_Q10 ); rd1_Q10 = silk_SMULBB( q1_Q10, Lambda_Q10 ); rd2_Q10 = silk_SMULBB( q2_Q10, Lambda_Q10 ); } else if( q1_Q0 == -1 ) { q2_Q10 = offset_Q10; q1_Q10 = silk_SUB32( q2_Q10, 1024 - QUANT_LEVEL_ADJUST_Q10 ); rd1_Q10 = silk_SMULBB( -q1_Q10, Lambda_Q10 ); rd2_Q10 = silk_SMULBB( q2_Q10, Lambda_Q10 ); } else { /* q1_Q0 < -1 */ q1_Q10 = silk_ADD32( silk_LSHIFT( q1_Q0, 10 ), QUANT_LEVEL_ADJUST_Q10 ); q1_Q10 = silk_ADD32( q1_Q10, offset_Q10 ); q2_Q10 = silk_ADD32( q1_Q10, 1024 ); rd1_Q10 = silk_SMULBB( -q1_Q10, Lambda_Q10 ); rd2_Q10 = silk_SMULBB( -q2_Q10, Lambda_Q10 ); } rr_Q10 = silk_SUB32( r_Q10, q1_Q10 ); rd1_Q10 = silk_RSHIFT( silk_SMLABB( rd1_Q10, rr_Q10, rr_Q10 ), 10 ); rr_Q10 = silk_SUB32( r_Q10, q2_Q10 ); rd2_Q10 = silk_RSHIFT( silk_SMLABB( rd2_Q10, rr_Q10, rr_Q10 ), 10 ); if( rd1_Q10 < rd2_Q10 ) { psSS[ 0 ].RD_Q10 = silk_ADD32( psDD->RD_Q10, rd1_Q10 ); psSS[ 1 ].RD_Q10 = silk_ADD32( psDD->RD_Q10, rd2_Q10 ); psSS[ 0 ].Q_Q10 = q1_Q10; psSS[ 1 ].Q_Q10 = q2_Q10; } else { psSS[ 0 ].RD_Q10 = silk_ADD32( psDD->RD_Q10, rd2_Q10 ); psSS[ 1 ].RD_Q10 = silk_ADD32( psDD->RD_Q10, rd1_Q10 ); psSS[ 0 ].Q_Q10 = q2_Q10; psSS[ 1 ].Q_Q10 = q1_Q10; } /* Update states for best quantization */ /* Quantized excitation */ exc_Q14 = silk_LSHIFT32( psSS[ 0 ].Q_Q10, 4 ); if ( psDD->Seed < 0 ) { exc_Q14 = -exc_Q14; } /* Add predictions */ LPC_exc_Q14 = silk_ADD32( exc_Q14, LTP_pred_Q14 ); xq_Q14 = silk_ADD32( LPC_exc_Q14, LPC_pred_Q14 ); /* Update states */ sLF_AR_shp_Q14 = silk_SUB32( xq_Q14, n_AR_Q14 ); psSS[ 0 ].sLTP_shp_Q14 = silk_SUB32( sLF_AR_shp_Q14, n_LF_Q14 ); psSS[ 0 ].LF_AR_Q14 = sLF_AR_shp_Q14; psSS[ 0 ].LPC_exc_Q14 = LPC_exc_Q14; psSS[ 0 ].xq_Q14 = xq_Q14; /* Update states for second best quantization */ /* Quantized excitation */ exc_Q14 = silk_LSHIFT32( psSS[ 1 ].Q_Q10, 4 ); if ( psDD->Seed < 0 ) { exc_Q14 = -exc_Q14; } /* Add predictions */ LPC_exc_Q14 = silk_ADD32( exc_Q14, LTP_pred_Q14 ); xq_Q14 = silk_ADD32( LPC_exc_Q14, LPC_pred_Q14 ); /* Update states */ sLF_AR_shp_Q14 = silk_SUB32( xq_Q14, n_AR_Q14 ); psSS[ 1 ].sLTP_shp_Q14 = silk_SUB32( sLF_AR_shp_Q14, n_LF_Q14 ); psSS[ 1 ].LF_AR_Q14 = sLF_AR_shp_Q14; psSS[ 1 ].LPC_exc_Q14 = LPC_exc_Q14; psSS[ 1 ].xq_Q14 = xq_Q14; } } *smpl_buf_idx = ( *smpl_buf_idx - 1 ) % DECISION_DELAY; if( *smpl_buf_idx < 0 ) *smpl_buf_idx += DECISION_DELAY; last_smple_idx = ( *smpl_buf_idx + decisionDelay ) % DECISION_DELAY; /* Find winner */ RDmin_Q10 = psSampleState[ 0 ][ 0 ].RD_Q10; Winner_ind = 0; for( k = 1; k < nStatesDelayedDecision; k++ ) { if( psSampleState[ k ][ 0 ].RD_Q10 < RDmin_Q10 ) { RDmin_Q10 = psSampleState[ k ][ 0 ].RD_Q10; Winner_ind = k; } } /* Increase RD values of expired states */ Winner_rand_state = psDelDec[ Winner_ind ].RandState[ last_smple_idx ]; for( k = 0; k < nStatesDelayedDecision; k++ ) { if( psDelDec[ k ].RandState[ last_smple_idx ] != Winner_rand_state ) { psSampleState[ k ][ 0 ].RD_Q10 = silk_ADD32( psSampleState[ k ][ 0 ].RD_Q10, silk_int32_MAX >> 4 ); psSampleState[ k ][ 1 ].RD_Q10 = silk_ADD32( psSampleState[ k ][ 1 ].RD_Q10, silk_int32_MAX >> 4 ); silk_assert( psSampleState[ k ][ 0 ].RD_Q10 >= 0 ); } } /* Find worst in first set and best in second set */ RDmax_Q10 = psSampleState[ 0 ][ 0 ].RD_Q10; RDmin_Q10 = psSampleState[ 0 ][ 1 ].RD_Q10; RDmax_ind = 0; RDmin_ind = 0; for( k = 1; k < nStatesDelayedDecision; k++ ) { /* find worst in first set */ if( psSampleState[ k ][ 0 ].RD_Q10 > RDmax_Q10 ) { RDmax_Q10 = psSampleState[ k ][ 0 ].RD_Q10; RDmax_ind = k; } /* find best in second set */ if( psSampleState[ k ][ 1 ].RD_Q10 < RDmin_Q10 ) { RDmin_Q10 = psSampleState[ k ][ 1 ].RD_Q10; RDmin_ind = k; } } /* Replace a state if best from second set outperforms worst in first set */ if( RDmin_Q10 < RDmax_Q10 ) { silk_memcpy( ( (opus_int32 *)&psDelDec[ RDmax_ind ] ) + i, ( (opus_int32 *)&psDelDec[ RDmin_ind ] ) + i, sizeof( NSQ_del_dec_struct ) - i * sizeof( opus_int32) ); silk_memcpy( &psSampleState[ RDmax_ind ][ 0 ], &psSampleState[ RDmin_ind ][ 1 ], sizeof( NSQ_sample_struct ) ); } /* Write samples from winner to output and long-term filter states */ psDD = &psDelDec[ Winner_ind ]; if( subfr > 0 || i >= decisionDelay ) { pulses[ i - decisionDelay ] = (opus_int8)silk_RSHIFT_ROUND( psDD->Q_Q10[ last_smple_idx ], 10 ); xq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( psDD->Xq_Q14[ last_smple_idx ], delayedGain_Q10[ last_smple_idx ] ), 8 ) ); NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - decisionDelay ] = psDD->Shape_Q14[ last_smple_idx ]; sLTP_Q15[ NSQ->sLTP_buf_idx - decisionDelay ] = psDD->Pred_Q15[ last_smple_idx ]; } NSQ->sLTP_shp_buf_idx++; NSQ->sLTP_buf_idx++; /* Update states */ for( k = 0; k < nStatesDelayedDecision; k++ ) { psDD = &psDelDec[ k ]; psSS = &psSampleState[ k ][ 0 ]; psDD->LF_AR_Q14 = psSS->LF_AR_Q14; psDD->sLPC_Q14[ NSQ_LPC_BUF_LENGTH + i ] = psSS->xq_Q14; psDD->Xq_Q14[ *smpl_buf_idx ] = psSS->xq_Q14; psDD->Q_Q10[ *smpl_buf_idx ] = psSS->Q_Q10; psDD->Pred_Q15[ *smpl_buf_idx ] = silk_LSHIFT32( psSS->LPC_exc_Q14, 1 ); psDD->Shape_Q14[ *smpl_buf_idx ] = psSS->sLTP_shp_Q14; psDD->Seed = silk_ADD32_ovflw( psDD->Seed, silk_RSHIFT_ROUND( psSS->Q_Q10, 10 ) ); psDD->RandState[ *smpl_buf_idx ] = psDD->Seed; psDD->RD_Q10 = psSS->RD_Q10; } delayedGain_Q10[ *smpl_buf_idx ] = Gain_Q10; } /* Update LPC states */ for( k = 0; k < nStatesDelayedDecision; k++ ) { psDD = &psDelDec[ k ]; silk_memcpy( psDD->sLPC_Q14, &psDD->sLPC_Q14[ length ], NSQ_LPC_BUF_LENGTH * sizeof( opus_int32 ) ); } RESTORE_STACK; } static OPUS_INLINE void silk_nsq_del_dec_scale_states_sse4_1( const silk_encoder_state *psEncC, /* I Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */ const opus_int32 x_Q3[], /* I Input in Q3 */ opus_int32 x_sc_Q10[], /* O Input scaled with 1/Gain in Q10 */ const opus_int16 sLTP[], /* I Re-whitened LTP state in Q0 */ opus_int32 sLTP_Q15[], /* O LTP state matching scaled input */ opus_int subfr, /* I Subframe number */ opus_int nStatesDelayedDecision, /* I Number of del dec states */ const opus_int LTP_scale_Q14, /* I LTP state scaling */ const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I */ const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag */ const opus_int signal_type, /* I Signal type */ const opus_int decisionDelay /* I Decision delay */ ) { opus_int i, k, lag; opus_int32 gain_adj_Q16, inv_gain_Q31, inv_gain_Q23; NSQ_del_dec_struct *psDD; __m128i xmm_inv_gain_Q23, xmm_x_Q3_x2x0, xmm_x_Q3_x3x1; lag = pitchL[ subfr ]; inv_gain_Q31 = silk_INVERSE32_varQ( silk_max( Gains_Q16[ subfr ], 1 ), 47 ); silk_assert( inv_gain_Q31 != 0 ); /* Calculate gain adjustment factor */ if( Gains_Q16[ subfr ] != NSQ->prev_gain_Q16 ) { gain_adj_Q16 = silk_DIV32_varQ( NSQ->prev_gain_Q16, Gains_Q16[ subfr ], 16 ); } else { gain_adj_Q16 = (opus_int32)1 << 16; } /* Scale input */ inv_gain_Q23 = silk_RSHIFT_ROUND( inv_gain_Q31, 8 ); /* prepare inv_gain_Q23 in packed 4 32-bits */ xmm_inv_gain_Q23 = _mm_set1_epi32(inv_gain_Q23); for( i = 0; i < psEncC->subfr_length - 3; i += 4 ) { xmm_x_Q3_x2x0 = _mm_loadu_si128( (__m128i *)(&(x_Q3[ i ] ) ) ); /* equal shift right 4 bytes*/ xmm_x_Q3_x3x1 = _mm_shuffle_epi32( xmm_x_Q3_x2x0, _MM_SHUFFLE( 0, 3, 2, 1 ) ); xmm_x_Q3_x2x0 = _mm_mul_epi32( xmm_x_Q3_x2x0, xmm_inv_gain_Q23 ); xmm_x_Q3_x3x1 = _mm_mul_epi32( xmm_x_Q3_x3x1, xmm_inv_gain_Q23 ); xmm_x_Q3_x2x0 = _mm_srli_epi64( xmm_x_Q3_x2x0, 16 ); xmm_x_Q3_x3x1 = _mm_slli_epi64( xmm_x_Q3_x3x1, 16 ); xmm_x_Q3_x2x0 = _mm_blend_epi16( xmm_x_Q3_x2x0, xmm_x_Q3_x3x1, 0xCC ); _mm_storeu_si128( (__m128i *)(&(x_sc_Q10[ i ])), xmm_x_Q3_x2x0 ); } for( ; i < psEncC->subfr_length; i++ ) { x_sc_Q10[ i ] = silk_SMULWW( x_Q3[ i ], inv_gain_Q23 ); } /* Save inverse gain */ NSQ->prev_gain_Q16 = Gains_Q16[ subfr ]; /* After rewhitening the LTP state is un-scaled, so scale with inv_gain_Q16 */ if( NSQ->rewhite_flag ) { if( subfr == 0 ) { /* Do LTP downscaling */ inv_gain_Q31 = silk_LSHIFT( silk_SMULWB( inv_gain_Q31, LTP_scale_Q14 ), 2 ); } for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx; i++ ) { silk_assert( i < MAX_FRAME_LENGTH ); sLTP_Q15[ i ] = silk_SMULWB( inv_gain_Q31, sLTP[ i ] ); } } /* Adjust for changing gain */ if( gain_adj_Q16 != (opus_int32)1 << 16 ) { /* Scale long-term shaping state */ { __m128i xmm_gain_adj_Q16, xmm_sLTP_shp_Q14_x2x0, xmm_sLTP_shp_Q14_x3x1; /* prepare gain_adj_Q16 in packed 4 32-bits */ xmm_gain_adj_Q16 = _mm_set1_epi32( gain_adj_Q16 ); for( i = NSQ->sLTP_shp_buf_idx - psEncC->ltp_mem_length; i < NSQ->sLTP_shp_buf_idx - 3; i += 4 ) { xmm_sLTP_shp_Q14_x2x0 = _mm_loadu_si128( (__m128i *)(&(NSQ->sLTP_shp_Q14[ i ] ) ) ); /* equal shift right 4 bytes*/ xmm_sLTP_shp_Q14_x3x1 = _mm_shuffle_epi32( xmm_sLTP_shp_Q14_x2x0, _MM_SHUFFLE( 0, 3, 2, 1 ) ); xmm_sLTP_shp_Q14_x2x0 = _mm_mul_epi32( xmm_sLTP_shp_Q14_x2x0, xmm_gain_adj_Q16 ); xmm_sLTP_shp_Q14_x3x1 = _mm_mul_epi32( xmm_sLTP_shp_Q14_x3x1, xmm_gain_adj_Q16 ); xmm_sLTP_shp_Q14_x2x0 = _mm_srli_epi64( xmm_sLTP_shp_Q14_x2x0, 16 ); xmm_sLTP_shp_Q14_x3x1 = _mm_slli_epi64( xmm_sLTP_shp_Q14_x3x1, 16 ); xmm_sLTP_shp_Q14_x2x0 = _mm_blend_epi16( xmm_sLTP_shp_Q14_x2x0, xmm_sLTP_shp_Q14_x3x1, 0xCC ); _mm_storeu_si128( (__m128i *)(&(NSQ->sLTP_shp_Q14[ i ] ) ), xmm_sLTP_shp_Q14_x2x0 ); } for( ; i < NSQ->sLTP_shp_buf_idx; i++ ) { NSQ->sLTP_shp_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sLTP_shp_Q14[ i ] ); } /* Scale long-term prediction state */ if( signal_type == TYPE_VOICED && NSQ->rewhite_flag == 0 ) { for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx - decisionDelay; i++ ) { sLTP_Q15[ i ] = silk_SMULWW( gain_adj_Q16, sLTP_Q15[ i ] ); } } for( k = 0; k < nStatesDelayedDecision; k++ ) { psDD = &psDelDec[ k ]; /* Scale scalar states */ psDD->LF_AR_Q14 = silk_SMULWW( gain_adj_Q16, psDD->LF_AR_Q14 ); /* Scale short-term prediction and shaping states */ for( i = 0; i < NSQ_LPC_BUF_LENGTH; i++ ) { psDD->sLPC_Q14[ i ] = silk_SMULWW( gain_adj_Q16, psDD->sLPC_Q14[ i ] ); } for( i = 0; i < MAX_SHAPE_LPC_ORDER; i++ ) { psDD->sAR2_Q14[ i ] = silk_SMULWW( gain_adj_Q16, psDD->sAR2_Q14[ i ] ); } for( i = 0; i < DECISION_DELAY; i++ ) { psDD->Pred_Q15[ i ] = silk_SMULWW( gain_adj_Q16, psDD->Pred_Q15[ i ] ); psDD->Shape_Q14[ i ] = silk_SMULWW( gain_adj_Q16, psDD->Shape_Q14[ i ] ); } } } } } mumble-1.3.4/3rdparty/opus-src/silk/x86/VAD_sse.c0000664000175000017500000002666714010707327021224 0ustar builderbuilder/* Copyright (c) 2014, Cisco Systems, INC Written by XiangMingZhu WeiZhou MinPeng YanWang Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include "main.h" #include "stack_alloc.h" /* Weighting factors for tilt measure */ static const opus_int32 tiltWeights[ VAD_N_BANDS ] = { 30000, 6000, -12000, -12000 }; /***************************************/ /* Get the speech activity level in Q8 */ /***************************************/ opus_int silk_VAD_GetSA_Q8_sse4_1( /* O Return value, 0 if success */ silk_encoder_state *psEncC, /* I/O Encoder state */ const opus_int16 pIn[] /* I PCM input */ ) { opus_int SA_Q15, pSNR_dB_Q7, input_tilt; opus_int decimated_framelength1, decimated_framelength2; opus_int decimated_framelength; opus_int dec_subframe_length, dec_subframe_offset, SNR_Q7, i, b, s; opus_int32 sumSquared, smooth_coef_Q16; opus_int16 HPstateTmp; VARDECL( opus_int16, X ); opus_int32 Xnrg[ VAD_N_BANDS ]; opus_int32 NrgToNoiseRatio_Q8[ VAD_N_BANDS ]; opus_int32 speech_nrg, x_tmp; opus_int X_offset[ VAD_N_BANDS ]; opus_int ret = 0; silk_VAD_state *psSilk_VAD = &psEncC->sVAD; SAVE_STACK; /* Safety checks */ silk_assert( VAD_N_BANDS == 4 ); silk_assert( MAX_FRAME_LENGTH >= psEncC->frame_length ); silk_assert( psEncC->frame_length <= 512 ); silk_assert( psEncC->frame_length == 8 * silk_RSHIFT( psEncC->frame_length, 3 ) ); /***********************/ /* Filter and Decimate */ /***********************/ decimated_framelength1 = silk_RSHIFT( psEncC->frame_length, 1 ); decimated_framelength2 = silk_RSHIFT( psEncC->frame_length, 2 ); decimated_framelength = silk_RSHIFT( psEncC->frame_length, 3 ); /* Decimate into 4 bands: 0 L 3L L 3L 5L - -- - -- -- 8 8 2 4 4 [0-1 kHz| temp. |1-2 kHz| 2-4 kHz | 4-8 kHz | They're arranged to allow the minimal ( frame_length / 4 ) extra scratch space during the downsampling process */ X_offset[ 0 ] = 0; X_offset[ 1 ] = decimated_framelength + decimated_framelength2; X_offset[ 2 ] = X_offset[ 1 ] + decimated_framelength; X_offset[ 3 ] = X_offset[ 2 ] + decimated_framelength2; ALLOC( X, X_offset[ 3 ] + decimated_framelength1, opus_int16 ); /* 0-8 kHz to 0-4 kHz and 4-8 kHz */ silk_ana_filt_bank_1( pIn, &psSilk_VAD->AnaState[ 0 ], X, &X[ X_offset[ 3 ] ], psEncC->frame_length ); /* 0-4 kHz to 0-2 kHz and 2-4 kHz */ silk_ana_filt_bank_1( X, &psSilk_VAD->AnaState1[ 0 ], X, &X[ X_offset[ 2 ] ], decimated_framelength1 ); /* 0-2 kHz to 0-1 kHz and 1-2 kHz */ silk_ana_filt_bank_1( X, &psSilk_VAD->AnaState2[ 0 ], X, &X[ X_offset[ 1 ] ], decimated_framelength2 ); /*********************************************/ /* HP filter on lowest band (differentiator) */ /*********************************************/ X[ decimated_framelength - 1 ] = silk_RSHIFT( X[ decimated_framelength - 1 ], 1 ); HPstateTmp = X[ decimated_framelength - 1 ]; for( i = decimated_framelength - 1; i > 0; i-- ) { X[ i - 1 ] = silk_RSHIFT( X[ i - 1 ], 1 ); X[ i ] -= X[ i - 1 ]; } X[ 0 ] -= psSilk_VAD->HPstate; psSilk_VAD->HPstate = HPstateTmp; /*************************************/ /* Calculate the energy in each band */ /*************************************/ for( b = 0; b < VAD_N_BANDS; b++ ) { /* Find the decimated framelength in the non-uniformly divided bands */ decimated_framelength = silk_RSHIFT( psEncC->frame_length, silk_min_int( VAD_N_BANDS - b, VAD_N_BANDS - 1 ) ); /* Split length into subframe lengths */ dec_subframe_length = silk_RSHIFT( decimated_framelength, VAD_INTERNAL_SUBFRAMES_LOG2 ); dec_subframe_offset = 0; /* Compute energy per sub-frame */ /* initialize with summed energy of last subframe */ Xnrg[ b ] = psSilk_VAD->XnrgSubfr[ b ]; for( s = 0; s < VAD_INTERNAL_SUBFRAMES; s++ ) { __m128i xmm_X, xmm_acc; sumSquared = 0; xmm_acc = _mm_setzero_si128(); for( i = 0; i < dec_subframe_length - 7; i += 8 ) { xmm_X = _mm_loadu_si128( (__m128i *)&(X[ X_offset[ b ] + i + dec_subframe_offset ] ) ); xmm_X = _mm_srai_epi16( xmm_X, 3 ); xmm_X = _mm_madd_epi16( xmm_X, xmm_X ); xmm_acc = _mm_add_epi32( xmm_acc, xmm_X ); } xmm_acc = _mm_add_epi32( xmm_acc, _mm_unpackhi_epi64( xmm_acc, xmm_acc ) ); xmm_acc = _mm_add_epi32( xmm_acc, _mm_shufflelo_epi16( xmm_acc, 0x0E ) ); sumSquared += _mm_cvtsi128_si32( xmm_acc ); for( ; i < dec_subframe_length; i++ ) { /* The energy will be less than dec_subframe_length * ( silk_int16_MIN / 8 ) ^ 2. */ /* Therefore we can accumulate with no risk of overflow (unless dec_subframe_length > 128) */ x_tmp = silk_RSHIFT( X[ X_offset[ b ] + i + dec_subframe_offset ], 3 ); sumSquared = silk_SMLABB( sumSquared, x_tmp, x_tmp ); /* Safety check */ silk_assert( sumSquared >= 0 ); } /* Add/saturate summed energy of current subframe */ if( s < VAD_INTERNAL_SUBFRAMES - 1 ) { Xnrg[ b ] = silk_ADD_POS_SAT32( Xnrg[ b ], sumSquared ); } else { /* Look-ahead subframe */ Xnrg[ b ] = silk_ADD_POS_SAT32( Xnrg[ b ], silk_RSHIFT( sumSquared, 1 ) ); } dec_subframe_offset += dec_subframe_length; } psSilk_VAD->XnrgSubfr[ b ] = sumSquared; } /********************/ /* Noise estimation */ /********************/ silk_VAD_GetNoiseLevels( &Xnrg[ 0 ], psSilk_VAD ); /***********************************************/ /* Signal-plus-noise to noise ratio estimation */ /***********************************************/ sumSquared = 0; input_tilt = 0; for( b = 0; b < VAD_N_BANDS; b++ ) { speech_nrg = Xnrg[ b ] - psSilk_VAD->NL[ b ]; if( speech_nrg > 0 ) { /* Divide, with sufficient resolution */ if( ( Xnrg[ b ] & 0xFF800000 ) == 0 ) { NrgToNoiseRatio_Q8[ b ] = silk_DIV32( silk_LSHIFT( Xnrg[ b ], 8 ), psSilk_VAD->NL[ b ] + 1 ); } else { NrgToNoiseRatio_Q8[ b ] = silk_DIV32( Xnrg[ b ], silk_RSHIFT( psSilk_VAD->NL[ b ], 8 ) + 1 ); } /* Convert to log domain */ SNR_Q7 = silk_lin2log( NrgToNoiseRatio_Q8[ b ] ) - 8 * 128; /* Sum-of-squares */ sumSquared = silk_SMLABB( sumSquared, SNR_Q7, SNR_Q7 ); /* Q14 */ /* Tilt measure */ if( speech_nrg < ( (opus_int32)1 << 20 ) ) { /* Scale down SNR value for small subband speech energies */ SNR_Q7 = silk_SMULWB( silk_LSHIFT( silk_SQRT_APPROX( speech_nrg ), 6 ), SNR_Q7 ); } input_tilt = silk_SMLAWB( input_tilt, tiltWeights[ b ], SNR_Q7 ); } else { NrgToNoiseRatio_Q8[ b ] = 256; } } /* Mean-of-squares */ sumSquared = silk_DIV32_16( sumSquared, VAD_N_BANDS ); /* Q14 */ /* Root-mean-square approximation, scale to dBs, and write to output pointer */ pSNR_dB_Q7 = (opus_int16)( 3 * silk_SQRT_APPROX( sumSquared ) ); /* Q7 */ /*********************************/ /* Speech Probability Estimation */ /*********************************/ SA_Q15 = silk_sigm_Q15( silk_SMULWB( VAD_SNR_FACTOR_Q16, pSNR_dB_Q7 ) - VAD_NEGATIVE_OFFSET_Q5 ); /**************************/ /* Frequency Tilt Measure */ /**************************/ psEncC->input_tilt_Q15 = silk_LSHIFT( silk_sigm_Q15( input_tilt ) - 16384, 1 ); /**************************************************/ /* Scale the sigmoid output based on power levels */ /**************************************************/ speech_nrg = 0; for( b = 0; b < VAD_N_BANDS; b++ ) { /* Accumulate signal-without-noise energies, higher frequency bands have more weight */ speech_nrg += ( b + 1 ) * silk_RSHIFT( Xnrg[ b ] - psSilk_VAD->NL[ b ], 4 ); } /* Power scaling */ if( speech_nrg <= 0 ) { SA_Q15 = silk_RSHIFT( SA_Q15, 1 ); } else if( speech_nrg < 32768 ) { if( psEncC->frame_length == 10 * psEncC->fs_kHz ) { speech_nrg = silk_LSHIFT_SAT32( speech_nrg, 16 ); } else { speech_nrg = silk_LSHIFT_SAT32( speech_nrg, 15 ); } /* square-root */ speech_nrg = silk_SQRT_APPROX( speech_nrg ); SA_Q15 = silk_SMULWB( 32768 + speech_nrg, SA_Q15 ); } /* Copy the resulting speech activity in Q8 */ psEncC->speech_activity_Q8 = silk_min_int( silk_RSHIFT( SA_Q15, 7 ), silk_uint8_MAX ); /***********************************/ /* Energy Level and SNR estimation */ /***********************************/ /* Smoothing coefficient */ smooth_coef_Q16 = silk_SMULWB( VAD_SNR_SMOOTH_COEF_Q18, silk_SMULWB( (opus_int32)SA_Q15, SA_Q15 ) ); if( psEncC->frame_length == 10 * psEncC->fs_kHz ) { smooth_coef_Q16 >>= 1; } for( b = 0; b < VAD_N_BANDS; b++ ) { /* compute smoothed energy-to-noise ratio per band */ psSilk_VAD->NrgRatioSmth_Q8[ b ] = silk_SMLAWB( psSilk_VAD->NrgRatioSmth_Q8[ b ], NrgToNoiseRatio_Q8[ b ] - psSilk_VAD->NrgRatioSmth_Q8[ b ], smooth_coef_Q16 ); /* signal to noise ratio in dB per band */ SNR_Q7 = 3 * ( silk_lin2log( psSilk_VAD->NrgRatioSmth_Q8[b] ) - 8 * 128 ); /* quality = sigmoid( 0.25 * ( SNR_dB - 16 ) ); */ psEncC->input_quality_bands_Q15[ b ] = silk_sigm_Q15( silk_RSHIFT( SNR_Q7 - 16 * 128, 4 ) ); } RESTORE_STACK; return( ret ); } mumble-1.3.4/3rdparty/opus-src/silk/x86/NSQ_sse.c0000664000175000017500000010215514010707327021236 0ustar builderbuilder/* Copyright (c) 2014, Cisco Systems, INC Written by XiangMingZhu WeiZhou MinPeng YanWang Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include "main.h" #include "celt/x86/x86cpu.h" #include "stack_alloc.h" static OPUS_INLINE void silk_nsq_scale_states_sse4_1( const silk_encoder_state *psEncC, /* I Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ const opus_int32 x_Q3[], /* I input in Q3 */ opus_int32 x_sc_Q10[], /* O input scaled with 1/Gain */ const opus_int16 sLTP[], /* I re-whitened LTP state in Q0 */ opus_int32 sLTP_Q15[], /* O LTP state matching scaled input */ opus_int subfr, /* I subframe number */ const opus_int LTP_scale_Q14, /* I */ const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I */ const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag */ const opus_int signal_type /* I Signal type */ ); static OPUS_INLINE void silk_noise_shape_quantizer_10_16_sse4_1( silk_nsq_state *NSQ, /* I/O NSQ state */ opus_int signalType, /* I Signal type */ const opus_int32 x_sc_Q10[], /* I */ opus_int8 pulses[], /* O */ opus_int16 xq[], /* O */ opus_int32 sLTP_Q15[], /* I/O LTP state */ const opus_int16 a_Q12[], /* I Short term prediction coefs */ const opus_int16 b_Q14[], /* I Long term prediction coefs */ const opus_int16 AR_shp_Q13[], /* I Noise shaping AR coefs */ opus_int lag, /* I Pitch lag */ opus_int32 HarmShapeFIRPacked_Q14, /* I */ opus_int Tilt_Q14, /* I Spectral tilt */ opus_int32 LF_shp_Q14, /* I */ opus_int32 Gain_Q16, /* I */ opus_int offset_Q10, /* I */ opus_int length, /* I Input length */ opus_int32 table[][4] /* I */ ); void silk_NSQ_sse4_1( const silk_encoder_state *psEncC, /* I Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ SideInfoIndices *psIndices, /* I/O Quantization Indices */ const opus_int32 x_Q3[], /* I Prefiltered input signal */ opus_int8 pulses[], /* O Quantized pulse signal */ const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */ const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */ const opus_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */ const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */ const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */ const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I Quantization step sizes */ const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */ const opus_int Lambda_Q10, /* I Rate/distortion tradeoff */ const opus_int LTP_scale_Q14 /* I LTP state scaling */ ) { opus_int k, lag, start_idx, LSF_interpolation_flag; const opus_int16 *A_Q12, *B_Q14, *AR_shp_Q13; opus_int16 *pxq; VARDECL( opus_int32, sLTP_Q15 ); VARDECL( opus_int16, sLTP ); opus_int32 HarmShapeFIRPacked_Q14; opus_int offset_Q10; VARDECL( opus_int32, x_sc_Q10 ); opus_int32 table[ 64 ][ 4 ]; opus_int32 tmp1; opus_int32 q1_Q10, q2_Q10, rd1_Q20, rd2_Q20; SAVE_STACK; NSQ->rand_seed = psIndices->Seed; /* Set unvoiced lag to the previous one, overwrite later for voiced */ lag = NSQ->lagPrev; silk_assert( NSQ->prev_gain_Q16 != 0 ); offset_Q10 = silk_Quantization_Offsets_Q10[ psIndices->signalType >> 1 ][ psIndices->quantOffsetType ]; /* 0 */ q1_Q10 = offset_Q10; q2_Q10 = offset_Q10 + ( 1024 - QUANT_LEVEL_ADJUST_Q10 ); rd1_Q20 = q1_Q10 * Lambda_Q10; rd2_Q20 = q2_Q10 * Lambda_Q10; table[ 32 ][ 0 ] = q1_Q10; table[ 32 ][ 1 ] = q2_Q10; table[ 32 ][ 2 ] = 2 * (q1_Q10 - q2_Q10); table[ 32 ][ 3 ] = (rd1_Q20 - rd2_Q20) + (q1_Q10 * q1_Q10 - q2_Q10 * q2_Q10); /* -1 */ q1_Q10 = offset_Q10 - ( 1024 - QUANT_LEVEL_ADJUST_Q10 ); q2_Q10 = offset_Q10; rd1_Q20 = - q1_Q10 * Lambda_Q10; rd2_Q20 = q2_Q10 * Lambda_Q10; table[ 31 ][ 0 ] = q1_Q10; table[ 31 ][ 1 ] = q2_Q10; table[ 31 ][ 2 ] = 2 * (q1_Q10 - q2_Q10); table[ 31 ][ 3 ] = (rd1_Q20 - rd2_Q20) + (q1_Q10 * q1_Q10 - q2_Q10 * q2_Q10); /* > 0 */ for (k = 1; k <= 31; k++) { tmp1 = offset_Q10 + silk_LSHIFT( k, 10 ); q1_Q10 = tmp1 - QUANT_LEVEL_ADJUST_Q10; q2_Q10 = tmp1 - QUANT_LEVEL_ADJUST_Q10 + 1024; rd1_Q20 = q1_Q10 * Lambda_Q10; rd2_Q20 = q2_Q10 * Lambda_Q10; table[ 32 + k ][ 0 ] = q1_Q10; table[ 32 + k ][ 1 ] = q2_Q10; table[ 32 + k ][ 2 ] = 2 * (q1_Q10 - q2_Q10); table[ 32 + k ][ 3 ] = (rd1_Q20 - rd2_Q20) + (q1_Q10 * q1_Q10 - q2_Q10 * q2_Q10); } /* < -1 */ for (k = -32; k <= -2; k++) { tmp1 = offset_Q10 + silk_LSHIFT( k, 10 ); q1_Q10 = tmp1 + QUANT_LEVEL_ADJUST_Q10; q2_Q10 = tmp1 + QUANT_LEVEL_ADJUST_Q10 + 1024; rd1_Q20 = - q1_Q10 * Lambda_Q10; rd2_Q20 = - q2_Q10 * Lambda_Q10; table[ 32 + k ][ 0 ] = q1_Q10; table[ 32 + k ][ 1 ] = q2_Q10; table[ 32 + k ][ 2 ] = 2 * (q1_Q10 - q2_Q10); table[ 32 + k ][ 3 ] = (rd1_Q20 - rd2_Q20) + (q1_Q10 * q1_Q10 - q2_Q10 * q2_Q10); } if( psIndices->NLSFInterpCoef_Q2 == 4 ) { LSF_interpolation_flag = 0; } else { LSF_interpolation_flag = 1; } ALLOC( sLTP_Q15, psEncC->ltp_mem_length + psEncC->frame_length, opus_int32 ); ALLOC( sLTP, psEncC->ltp_mem_length + psEncC->frame_length, opus_int16 ); ALLOC( x_sc_Q10, psEncC->subfr_length, opus_int32 ); /* Set up pointers to start of sub frame */ NSQ->sLTP_shp_buf_idx = psEncC->ltp_mem_length; NSQ->sLTP_buf_idx = psEncC->ltp_mem_length; pxq = &NSQ->xq[ psEncC->ltp_mem_length ]; for( k = 0; k < psEncC->nb_subfr; k++ ) { A_Q12 = &PredCoef_Q12[ (( k >> 1 ) | ( 1 - LSF_interpolation_flag )) * MAX_LPC_ORDER ]; B_Q14 = <PCoef_Q14[ k * LTP_ORDER ]; AR_shp_Q13 = &AR2_Q13[ k * MAX_SHAPE_LPC_ORDER ]; /* Noise shape parameters */ silk_assert( HarmShapeGain_Q14[ k ] >= 0 ); HarmShapeFIRPacked_Q14 = silk_RSHIFT( HarmShapeGain_Q14[ k ], 2 ); HarmShapeFIRPacked_Q14 |= silk_LSHIFT( (opus_int32)silk_RSHIFT( HarmShapeGain_Q14[ k ], 1 ), 16 ); NSQ->rewhite_flag = 0; if( psIndices->signalType == TYPE_VOICED ) { /* Voiced */ lag = pitchL[ k ]; /* Re-whitening */ if( ( k & ( 3 - silk_LSHIFT( LSF_interpolation_flag, 1 ) ) ) == 0 ) { /* Rewhiten with new A coefs */ start_idx = psEncC->ltp_mem_length - lag - psEncC->predictLPCOrder - LTP_ORDER / 2; silk_assert( start_idx > 0 ); silk_LPC_analysis_filter( &sLTP[ start_idx ], &NSQ->xq[ start_idx + k * psEncC->subfr_length ], A_Q12, psEncC->ltp_mem_length - start_idx, psEncC->predictLPCOrder, psEncC->arch ); NSQ->rewhite_flag = 1; NSQ->sLTP_buf_idx = psEncC->ltp_mem_length; } } silk_nsq_scale_states_sse4_1( psEncC, NSQ, x_Q3, x_sc_Q10, sLTP, sLTP_Q15, k, LTP_scale_Q14, Gains_Q16, pitchL, psIndices->signalType ); if ( opus_likely( ( 10 == psEncC->shapingLPCOrder ) && ( 16 == psEncC->predictLPCOrder) ) ) { silk_noise_shape_quantizer_10_16_sse4_1( NSQ, psIndices->signalType, x_sc_Q10, pulses, pxq, sLTP_Q15, A_Q12, B_Q14, AR_shp_Q13, lag, HarmShapeFIRPacked_Q14, Tilt_Q14[ k ], LF_shp_Q14[ k ], Gains_Q16[ k ], offset_Q10, psEncC->subfr_length, &(table[32]) ); } else { silk_noise_shape_quantizer( NSQ, psIndices->signalType, x_sc_Q10, pulses, pxq, sLTP_Q15, A_Q12, B_Q14, AR_shp_Q13, lag, HarmShapeFIRPacked_Q14, Tilt_Q14[ k ], LF_shp_Q14[ k ], Gains_Q16[ k ], Lambda_Q10, offset_Q10, psEncC->subfr_length, psEncC->shapingLPCOrder, psEncC->predictLPCOrder, psEncC->arch ); } x_Q3 += psEncC->subfr_length; pulses += psEncC->subfr_length; pxq += psEncC->subfr_length; } /* Update lagPrev for next frame */ NSQ->lagPrev = pitchL[ psEncC->nb_subfr - 1 ]; /* Save quantized speech and noise shaping signals */ silk_memmove( NSQ->xq, &NSQ->xq[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int16 ) ); silk_memmove( NSQ->sLTP_shp_Q14, &NSQ->sLTP_shp_Q14[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int32 ) ); RESTORE_STACK; } /***********************************/ /* silk_noise_shape_quantizer_10_16 */ /***********************************/ static OPUS_INLINE void silk_noise_shape_quantizer_10_16_sse4_1( silk_nsq_state *NSQ, /* I/O NSQ state */ opus_int signalType, /* I Signal type */ const opus_int32 x_sc_Q10[], /* I */ opus_int8 pulses[], /* O */ opus_int16 xq[], /* O */ opus_int32 sLTP_Q15[], /* I/O LTP state */ const opus_int16 a_Q12[], /* I Short term prediction coefs */ const opus_int16 b_Q14[], /* I Long term prediction coefs */ const opus_int16 AR_shp_Q13[], /* I Noise shaping AR coefs */ opus_int lag, /* I Pitch lag */ opus_int32 HarmShapeFIRPacked_Q14, /* I */ opus_int Tilt_Q14, /* I Spectral tilt */ opus_int32 LF_shp_Q14, /* I */ opus_int32 Gain_Q16, /* I */ opus_int offset_Q10, /* I */ opus_int length, /* I Input length */ opus_int32 table[][4] /* I */ ) { opus_int i; opus_int32 LTP_pred_Q13, LPC_pred_Q10, n_AR_Q12, n_LTP_Q13; opus_int32 n_LF_Q12, r_Q10, q1_Q0, q1_Q10, q2_Q10; opus_int32 exc_Q14, LPC_exc_Q14, xq_Q14, Gain_Q10; opus_int32 tmp1, tmp2, sLF_AR_shp_Q14; opus_int32 *psLPC_Q14, *shp_lag_ptr, *pred_lag_ptr; __m128i xmm_tempa, xmm_tempb; __m128i xmm_one; __m128i psLPC_Q14_hi_01234567, psLPC_Q14_hi_89ABCDEF; __m128i psLPC_Q14_lo_01234567, psLPC_Q14_lo_89ABCDEF; __m128i a_Q12_01234567, a_Q12_89ABCDEF; __m128i sAR2_Q14_hi_76543210, sAR2_Q14_lo_76543210; __m128i AR_shp_Q13_76543210; shp_lag_ptr = &NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - lag + HARM_SHAPE_FIR_TAPS / 2 ]; pred_lag_ptr = &sLTP_Q15[ NSQ->sLTP_buf_idx - lag + LTP_ORDER / 2 ]; Gain_Q10 = silk_RSHIFT( Gain_Q16, 6 ); /* Set up short term AR state */ psLPC_Q14 = &NSQ->sLPC_Q14[ NSQ_LPC_BUF_LENGTH - 1 ]; sLF_AR_shp_Q14 = NSQ->sLF_AR_shp_Q14; xq_Q14 = psLPC_Q14[ 0 ]; LTP_pred_Q13 = 0; /* load a_Q12 */ xmm_one = _mm_set_epi8( 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14 ); /* load a_Q12[0] - a_Q12[7] */ a_Q12_01234567 = _mm_loadu_si128( (__m128i *)(&a_Q12[ 0 ] ) ); /* load a_Q12[ 8 ] - a_Q12[ 15 ] */ a_Q12_89ABCDEF = _mm_loadu_si128( (__m128i *)(&a_Q12[ 8 ] ) ); a_Q12_01234567 = _mm_shuffle_epi8( a_Q12_01234567, xmm_one ); a_Q12_89ABCDEF = _mm_shuffle_epi8( a_Q12_89ABCDEF, xmm_one ); /* load AR_shp_Q13 */ AR_shp_Q13_76543210 = _mm_loadu_si128( (__m128i *)(&AR_shp_Q13[0] ) ); /* load psLPC_Q14 */ xmm_one = _mm_set_epi8(15, 14, 11, 10, 7, 6, 3, 2, 13, 12, 9, 8, 5, 4, 1, 0 ); xmm_tempa = _mm_loadu_si128( (__m128i *)(&psLPC_Q14[-16]) ); xmm_tempb = _mm_loadu_si128( (__m128i *)(&psLPC_Q14[-12]) ); xmm_tempa = _mm_shuffle_epi8( xmm_tempa, xmm_one ); xmm_tempb = _mm_shuffle_epi8( xmm_tempb, xmm_one ); psLPC_Q14_hi_89ABCDEF = _mm_unpackhi_epi64( xmm_tempa, xmm_tempb ); psLPC_Q14_lo_89ABCDEF = _mm_unpacklo_epi64( xmm_tempa, xmm_tempb ); xmm_tempa = _mm_loadu_si128( (__m128i *)(&psLPC_Q14[ -8 ]) ); xmm_tempb = _mm_loadu_si128( (__m128i *)(&psLPC_Q14[ -4 ]) ); xmm_tempa = _mm_shuffle_epi8( xmm_tempa, xmm_one ); xmm_tempb = _mm_shuffle_epi8( xmm_tempb, xmm_one ); psLPC_Q14_hi_01234567 = _mm_unpackhi_epi64( xmm_tempa, xmm_tempb ); psLPC_Q14_lo_01234567 = _mm_unpacklo_epi64( xmm_tempa, xmm_tempb ); /* load sAR2_Q14 */ xmm_tempa = _mm_loadu_si128( (__m128i *)(&(NSQ->sAR2_Q14[ 0 ]) ) ); xmm_tempb = _mm_loadu_si128( (__m128i *)(&(NSQ->sAR2_Q14[ 4 ]) ) ); xmm_tempa = _mm_shuffle_epi8( xmm_tempa, xmm_one ); xmm_tempb = _mm_shuffle_epi8( xmm_tempb, xmm_one ); sAR2_Q14_hi_76543210 = _mm_unpackhi_epi64( xmm_tempa, xmm_tempb ); sAR2_Q14_lo_76543210 = _mm_unpacklo_epi64( xmm_tempa, xmm_tempb ); /* prepare 1 in 8 * 16bit */ xmm_one = _mm_set1_epi16(1); for( i = 0; i < length; i++ ) { /* Short-term prediction */ __m128i xmm_hi_07, xmm_hi_8F, xmm_lo_07, xmm_lo_8F; /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ LPC_pred_Q10 = 8; /* silk_RSHIFT( predictLPCOrder, 1 ); */ /* shift psLPC_Q14 */ psLPC_Q14_hi_89ABCDEF = _mm_alignr_epi8( psLPC_Q14_hi_01234567, psLPC_Q14_hi_89ABCDEF, 2 ); psLPC_Q14_lo_89ABCDEF = _mm_alignr_epi8( psLPC_Q14_lo_01234567, psLPC_Q14_lo_89ABCDEF, 2 ); psLPC_Q14_hi_01234567 = _mm_srli_si128( psLPC_Q14_hi_01234567, 2 ); psLPC_Q14_lo_01234567 = _mm_srli_si128( psLPC_Q14_lo_01234567, 2 ); psLPC_Q14_hi_01234567 = _mm_insert_epi16( psLPC_Q14_hi_01234567, (xq_Q14 >> 16), 7 ); psLPC_Q14_lo_01234567 = _mm_insert_epi16( psLPC_Q14_lo_01234567, (xq_Q14), 7 ); /* high part, use pmaddwd, results in 4 32-bit */ xmm_hi_07 = _mm_madd_epi16( psLPC_Q14_hi_01234567, a_Q12_01234567 ); xmm_hi_8F = _mm_madd_epi16( psLPC_Q14_hi_89ABCDEF, a_Q12_89ABCDEF ); /* low part, use pmulhw, results in 8 16-bit, note we need simulate unsigned * signed, _mm_srai_epi16(psLPC_Q14_lo_01234567, 15) */ xmm_tempa = _mm_cmpgt_epi16( _mm_setzero_si128(), psLPC_Q14_lo_01234567 ); xmm_tempb = _mm_cmpgt_epi16( _mm_setzero_si128(), psLPC_Q14_lo_89ABCDEF ); xmm_tempa = _mm_and_si128( xmm_tempa, a_Q12_01234567 ); xmm_tempb = _mm_and_si128( xmm_tempb, a_Q12_89ABCDEF ); xmm_lo_07 = _mm_mulhi_epi16( psLPC_Q14_lo_01234567, a_Q12_01234567 ); xmm_lo_8F = _mm_mulhi_epi16( psLPC_Q14_lo_89ABCDEF, a_Q12_89ABCDEF ); xmm_lo_07 = _mm_add_epi16( xmm_lo_07, xmm_tempa ); xmm_lo_8F = _mm_add_epi16( xmm_lo_8F, xmm_tempb ); xmm_lo_07 = _mm_madd_epi16( xmm_lo_07, xmm_one ); xmm_lo_8F = _mm_madd_epi16( xmm_lo_8F, xmm_one ); /* accumulate */ xmm_hi_07 = _mm_add_epi32( xmm_hi_07, xmm_hi_8F ); xmm_lo_07 = _mm_add_epi32( xmm_lo_07, xmm_lo_8F ); xmm_hi_07 = _mm_add_epi32( xmm_hi_07, xmm_lo_07 ); xmm_hi_07 = _mm_add_epi32( xmm_hi_07, _mm_unpackhi_epi64(xmm_hi_07, xmm_hi_07 ) ); xmm_hi_07 = _mm_add_epi32( xmm_hi_07, _mm_shufflelo_epi16(xmm_hi_07, 0x0E ) ); LPC_pred_Q10 += _mm_cvtsi128_si32( xmm_hi_07 ); /* Long-term prediction */ if ( opus_likely( signalType == TYPE_VOICED ) ) { /* Unrolled loop */ /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ LTP_pred_Q13 = 2; { __m128i b_Q14_3210, b_Q14_0123, pred_lag_ptr_0123; b_Q14_3210 = OP_CVTEPI16_EPI32_M64( b_Q14 ); b_Q14_0123 = _mm_shuffle_epi32( b_Q14_3210, 0x1B ); /* loaded: [0] [-1] [-2] [-3] */ pred_lag_ptr_0123 = _mm_loadu_si128( (__m128i *)(&pred_lag_ptr[ -3 ] ) ); /* shuffle to [-3] [-2] [-1] [0] and to new xmm */ xmm_tempa = _mm_shuffle_epi32( pred_lag_ptr_0123, 0x1B ); /*64-bit multiply, a[2] * b[-2], a[0] * b[0] */ xmm_tempa = _mm_mul_epi32( xmm_tempa, b_Q14_3210 ); /* right shift 2 bytes (16 bits), zero extended */ xmm_tempa = _mm_srli_si128( xmm_tempa, 2 ); /* a[1] * b[-1], a[3] * b[-3] */ pred_lag_ptr_0123 = _mm_mul_epi32( pred_lag_ptr_0123, b_Q14_0123 ); pred_lag_ptr_0123 = _mm_srli_si128( pred_lag_ptr_0123, 2 ); pred_lag_ptr_0123 = _mm_add_epi32( pred_lag_ptr_0123, xmm_tempa ); /* equal shift right 8 bytes*/ xmm_tempa = _mm_shuffle_epi32( pred_lag_ptr_0123, _MM_SHUFFLE( 0, 0, 3, 2 ) ); xmm_tempa = _mm_add_epi32( xmm_tempa, pred_lag_ptr_0123 ); LTP_pred_Q13 += _mm_cvtsi128_si32( xmm_tempa ); LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -4 ], b_Q14[ 4 ] ); pred_lag_ptr++; } } /* Noise shape feedback */ NSQ->sAR2_Q14[ 9 ] = NSQ->sAR2_Q14[ 8 ]; NSQ->sAR2_Q14[ 8 ] = _mm_cvtsi128_si32( _mm_srli_si128(_mm_unpackhi_epi16( sAR2_Q14_lo_76543210, sAR2_Q14_hi_76543210 ), 12 ) ); sAR2_Q14_hi_76543210 = _mm_slli_si128( sAR2_Q14_hi_76543210, 2 ); sAR2_Q14_lo_76543210 = _mm_slli_si128( sAR2_Q14_lo_76543210, 2 ); sAR2_Q14_hi_76543210 = _mm_insert_epi16( sAR2_Q14_hi_76543210, (xq_Q14 >> 16), 0 ); sAR2_Q14_lo_76543210 = _mm_insert_epi16( sAR2_Q14_lo_76543210, (xq_Q14), 0 ); /* high part, use pmaddwd, results in 4 32-bit */ xmm_hi_07 = _mm_madd_epi16( sAR2_Q14_hi_76543210, AR_shp_Q13_76543210 ); /* low part, use pmulhw, results in 8 16-bit, note we need simulate unsigned * signed,_mm_srai_epi16(sAR2_Q14_lo_76543210, 15) */ xmm_tempa = _mm_cmpgt_epi16( _mm_setzero_si128(), sAR2_Q14_lo_76543210 ); xmm_tempa = _mm_and_si128( xmm_tempa, AR_shp_Q13_76543210 ); xmm_lo_07 = _mm_mulhi_epi16( sAR2_Q14_lo_76543210, AR_shp_Q13_76543210 ); xmm_lo_07 = _mm_add_epi16( xmm_lo_07, xmm_tempa ); xmm_lo_07 = _mm_madd_epi16( xmm_lo_07, xmm_one ); /* accumulate */ xmm_hi_07 = _mm_add_epi32( xmm_hi_07, xmm_lo_07 ); xmm_hi_07 = _mm_add_epi32( xmm_hi_07, _mm_unpackhi_epi64(xmm_hi_07, xmm_hi_07 ) ); xmm_hi_07 = _mm_add_epi32( xmm_hi_07, _mm_shufflelo_epi16(xmm_hi_07, 0x0E ) ); n_AR_Q12 = 5 + _mm_cvtsi128_si32( xmm_hi_07 ); n_AR_Q12 = silk_SMLAWB( n_AR_Q12, NSQ->sAR2_Q14[ 8 ], AR_shp_Q13[ 8 ] ); n_AR_Q12 = silk_SMLAWB( n_AR_Q12, NSQ->sAR2_Q14[ 9 ], AR_shp_Q13[ 9 ] ); n_AR_Q12 = silk_LSHIFT32( n_AR_Q12, 1 ); /* Q11 -> Q12 */ n_AR_Q12 = silk_SMLAWB( n_AR_Q12, sLF_AR_shp_Q14, Tilt_Q14 ); n_LF_Q12 = silk_SMULWB( NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - 1 ], LF_shp_Q14 ); n_LF_Q12 = silk_SMLAWT( n_LF_Q12, sLF_AR_shp_Q14, LF_shp_Q14 ); silk_assert( lag > 0 || signalType != TYPE_VOICED ); /* Combine prediction and noise shaping signals */ tmp1 = silk_SUB32( silk_LSHIFT32( LPC_pred_Q10, 2 ), n_AR_Q12 ); /* Q12 */ tmp1 = silk_SUB32( tmp1, n_LF_Q12 ); /* Q12 */ if( lag > 0 ) { /* Symmetric, packed FIR coefficients */ n_LTP_Q13 = silk_SMULWB( silk_ADD32( shp_lag_ptr[ 0 ], shp_lag_ptr[ -2 ] ), HarmShapeFIRPacked_Q14 ); n_LTP_Q13 = silk_SMLAWT( n_LTP_Q13, shp_lag_ptr[ -1 ], HarmShapeFIRPacked_Q14 ); n_LTP_Q13 = silk_LSHIFT( n_LTP_Q13, 1 ); shp_lag_ptr++; tmp2 = silk_SUB32( LTP_pred_Q13, n_LTP_Q13 ); /* Q13 */ tmp1 = silk_ADD_LSHIFT32( tmp2, tmp1, 1 ); /* Q13 */ tmp1 = silk_RSHIFT_ROUND( tmp1, 3 ); /* Q10 */ } else { tmp1 = silk_RSHIFT_ROUND( tmp1, 2 ); /* Q10 */ } r_Q10 = silk_SUB32( x_sc_Q10[ i ], tmp1 ); /* residual error Q10 */ /* Generate dither */ NSQ->rand_seed = silk_RAND( NSQ->rand_seed ); /* Flip sign depending on dither */ tmp2 = -r_Q10; if ( NSQ->rand_seed < 0 ) r_Q10 = tmp2; r_Q10 = silk_LIMIT_32( r_Q10, -(31 << 10), 30 << 10 ); /* Find two quantization level candidates and measure their rate-distortion */ q1_Q10 = silk_SUB32( r_Q10, offset_Q10 ); q1_Q0 = silk_RSHIFT( q1_Q10, 10 ); q1_Q10 = table[q1_Q0][0]; q2_Q10 = table[q1_Q0][1]; if (r_Q10 * table[q1_Q0][2] - table[q1_Q0][3] < 0) { q1_Q10 = q2_Q10; } pulses[ i ] = (opus_int8)silk_RSHIFT_ROUND( q1_Q10, 10 ); /* Excitation */ exc_Q14 = silk_LSHIFT( q1_Q10, 4 ); tmp2 = -exc_Q14; if ( NSQ->rand_seed < 0 ) exc_Q14 = tmp2; /* Add predictions */ LPC_exc_Q14 = silk_ADD_LSHIFT32( exc_Q14, LTP_pred_Q13, 1 ); xq_Q14 = silk_ADD_LSHIFT32( LPC_exc_Q14, LPC_pred_Q10, 4 ); /* Update states */ psLPC_Q14++; *psLPC_Q14 = xq_Q14; sLF_AR_shp_Q14 = silk_SUB_LSHIFT32( xq_Q14, n_AR_Q12, 2 ); NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx ] = silk_SUB_LSHIFT32( sLF_AR_shp_Q14, n_LF_Q12, 2 ); sLTP_Q15[ NSQ->sLTP_buf_idx ] = silk_LSHIFT( LPC_exc_Q14, 1 ); NSQ->sLTP_shp_buf_idx++; NSQ->sLTP_buf_idx++; /* Make dither dependent on quantized signal */ NSQ->rand_seed = silk_ADD32_ovflw( NSQ->rand_seed, pulses[ i ] ); } NSQ->sLF_AR_shp_Q14 = sLF_AR_shp_Q14; /* Scale XQ back to normal level before saving */ psLPC_Q14 = &NSQ->sLPC_Q14[ NSQ_LPC_BUF_LENGTH ]; /* write back sAR2_Q14 */ xmm_tempa = _mm_unpackhi_epi16( sAR2_Q14_lo_76543210, sAR2_Q14_hi_76543210 ); xmm_tempb = _mm_unpacklo_epi16( sAR2_Q14_lo_76543210, sAR2_Q14_hi_76543210 ); _mm_storeu_si128( (__m128i *)(&NSQ->sAR2_Q14[ 4 ]), xmm_tempa ); _mm_storeu_si128( (__m128i *)(&NSQ->sAR2_Q14[ 0 ]), xmm_tempb ); /* xq[ i ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( psLPC_Q14[ i ], Gain_Q10 ), 8 ) ); */ { __m128i xmm_Gain_Q10; __m128i xmm_xq_Q14_3210, xmm_xq_Q14_x3x1, xmm_xq_Q14_7654, xmm_xq_Q14_x7x5; /* prepare (1 << 7) in packed 4 32-bits */ xmm_tempa = _mm_set1_epi32( (1 << 7) ); /* prepare Gain_Q10 in packed 4 32-bits */ xmm_Gain_Q10 = _mm_set1_epi32( Gain_Q10 ); /* process xq */ for (i = 0; i < length - 7; i += 8) { xmm_xq_Q14_3210 = _mm_loadu_si128( (__m128i *)(&(psLPC_Q14[ i + 0 ] ) ) ); xmm_xq_Q14_7654 = _mm_loadu_si128( (__m128i *)(&(psLPC_Q14[ i + 4 ] ) ) ); /* equal shift right 4 bytes*/ xmm_xq_Q14_x3x1 = _mm_shuffle_epi32( xmm_xq_Q14_3210, _MM_SHUFFLE( 0, 3, 2, 1 ) ); /* equal shift right 4 bytes*/ xmm_xq_Q14_x7x5 = _mm_shuffle_epi32( xmm_xq_Q14_7654, _MM_SHUFFLE( 0, 3, 2, 1 ) ); xmm_xq_Q14_3210 = _mm_mul_epi32( xmm_xq_Q14_3210, xmm_Gain_Q10 ); xmm_xq_Q14_x3x1 = _mm_mul_epi32( xmm_xq_Q14_x3x1, xmm_Gain_Q10 ); xmm_xq_Q14_7654 = _mm_mul_epi32( xmm_xq_Q14_7654, xmm_Gain_Q10 ); xmm_xq_Q14_x7x5 = _mm_mul_epi32( xmm_xq_Q14_x7x5, xmm_Gain_Q10 ); xmm_xq_Q14_3210 = _mm_srli_epi64( xmm_xq_Q14_3210, 16 ); xmm_xq_Q14_x3x1 = _mm_slli_epi64( xmm_xq_Q14_x3x1, 16 ); xmm_xq_Q14_7654 = _mm_srli_epi64( xmm_xq_Q14_7654, 16 ); xmm_xq_Q14_x7x5 = _mm_slli_epi64( xmm_xq_Q14_x7x5, 16 ); xmm_xq_Q14_3210 = _mm_blend_epi16( xmm_xq_Q14_3210, xmm_xq_Q14_x3x1, 0xCC ); xmm_xq_Q14_7654 = _mm_blend_epi16( xmm_xq_Q14_7654, xmm_xq_Q14_x7x5, 0xCC ); /* silk_RSHIFT_ROUND(xq, 8) */ xmm_xq_Q14_3210 = _mm_add_epi32( xmm_xq_Q14_3210, xmm_tempa ); xmm_xq_Q14_7654 = _mm_add_epi32( xmm_xq_Q14_7654, xmm_tempa ); xmm_xq_Q14_3210 = _mm_srai_epi32( xmm_xq_Q14_3210, 8 ); xmm_xq_Q14_7654 = _mm_srai_epi32( xmm_xq_Q14_7654, 8 ); /* silk_SAT16 */ xmm_xq_Q14_3210 = _mm_packs_epi32( xmm_xq_Q14_3210, xmm_xq_Q14_7654 ); /* save to xq */ _mm_storeu_si128( (__m128i *)(&xq[ i ] ), xmm_xq_Q14_3210 ); } } for ( ; i < length; i++) { xq[i] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( psLPC_Q14[ i ], Gain_Q10 ), 8 ) ); } /* Update LPC synth buffer */ silk_memcpy( NSQ->sLPC_Q14, &NSQ->sLPC_Q14[ length ], NSQ_LPC_BUF_LENGTH * sizeof( opus_int32 ) ); } static OPUS_INLINE void silk_nsq_scale_states_sse4_1( const silk_encoder_state *psEncC, /* I Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ const opus_int32 x_Q3[], /* I input in Q3 */ opus_int32 x_sc_Q10[], /* O input scaled with 1/Gain */ const opus_int16 sLTP[], /* I re-whitened LTP state in Q0 */ opus_int32 sLTP_Q15[], /* O LTP state matching scaled input */ opus_int subfr, /* I subframe number */ const opus_int LTP_scale_Q14, /* I */ const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I */ const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag */ const opus_int signal_type /* I Signal type */ ) { opus_int i, lag; opus_int32 gain_adj_Q16, inv_gain_Q31, inv_gain_Q23; __m128i xmm_inv_gain_Q23, xmm_x_Q3_x2x0, xmm_x_Q3_x3x1; lag = pitchL[ subfr ]; inv_gain_Q31 = silk_INVERSE32_varQ( silk_max( Gains_Q16[ subfr ], 1 ), 47 ); silk_assert( inv_gain_Q31 != 0 ); /* Calculate gain adjustment factor */ if( Gains_Q16[ subfr ] != NSQ->prev_gain_Q16 ) { gain_adj_Q16 = silk_DIV32_varQ( NSQ->prev_gain_Q16, Gains_Q16[ subfr ], 16 ); } else { gain_adj_Q16 = (opus_int32)1 << 16; } /* Scale input */ inv_gain_Q23 = silk_RSHIFT_ROUND( inv_gain_Q31, 8 ); /* prepare inv_gain_Q23 in packed 4 32-bits */ xmm_inv_gain_Q23 = _mm_set1_epi32(inv_gain_Q23); for( i = 0; i < psEncC->subfr_length - 3; i += 4 ) { xmm_x_Q3_x2x0 = _mm_loadu_si128( (__m128i *)(&(x_Q3[ i ] ) ) ); /* equal shift right 4 bytes*/ xmm_x_Q3_x3x1 = _mm_shuffle_epi32( xmm_x_Q3_x2x0, _MM_SHUFFLE( 0, 3, 2, 1 ) ); xmm_x_Q3_x2x0 = _mm_mul_epi32( xmm_x_Q3_x2x0, xmm_inv_gain_Q23 ); xmm_x_Q3_x3x1 = _mm_mul_epi32( xmm_x_Q3_x3x1, xmm_inv_gain_Q23 ); xmm_x_Q3_x2x0 = _mm_srli_epi64( xmm_x_Q3_x2x0, 16 ); xmm_x_Q3_x3x1 = _mm_slli_epi64( xmm_x_Q3_x3x1, 16 ); xmm_x_Q3_x2x0 = _mm_blend_epi16( xmm_x_Q3_x2x0, xmm_x_Q3_x3x1, 0xCC ); _mm_storeu_si128( (__m128i *)(&(x_sc_Q10[ i ] ) ), xmm_x_Q3_x2x0 ); } for( ; i < psEncC->subfr_length; i++ ) { x_sc_Q10[ i ] = silk_SMULWW( x_Q3[ i ], inv_gain_Q23 ); } /* Save inverse gain */ NSQ->prev_gain_Q16 = Gains_Q16[ subfr ]; /* After rewhitening the LTP state is un-scaled, so scale with inv_gain_Q16 */ if( NSQ->rewhite_flag ) { if( subfr == 0 ) { /* Do LTP downscaling */ inv_gain_Q31 = silk_LSHIFT( silk_SMULWB( inv_gain_Q31, LTP_scale_Q14 ), 2 ); } for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx; i++ ) { silk_assert( i < MAX_FRAME_LENGTH ); sLTP_Q15[ i ] = silk_SMULWB( inv_gain_Q31, sLTP[ i ] ); } } /* Adjust for changing gain */ if( gain_adj_Q16 != (opus_int32)1 << 16 ) { /* Scale long-term shaping state */ __m128i xmm_gain_adj_Q16, xmm_sLTP_shp_Q14_x2x0, xmm_sLTP_shp_Q14_x3x1; /* prepare gain_adj_Q16 in packed 4 32-bits */ xmm_gain_adj_Q16 = _mm_set1_epi32(gain_adj_Q16); for( i = NSQ->sLTP_shp_buf_idx - psEncC->ltp_mem_length; i < NSQ->sLTP_shp_buf_idx - 3; i += 4 ) { xmm_sLTP_shp_Q14_x2x0 = _mm_loadu_si128( (__m128i *)(&(NSQ->sLTP_shp_Q14[ i ] ) ) ); /* equal shift right 4 bytes*/ xmm_sLTP_shp_Q14_x3x1 = _mm_shuffle_epi32( xmm_sLTP_shp_Q14_x2x0, _MM_SHUFFLE( 0, 3, 2, 1 ) ); xmm_sLTP_shp_Q14_x2x0 = _mm_mul_epi32( xmm_sLTP_shp_Q14_x2x0, xmm_gain_adj_Q16 ); xmm_sLTP_shp_Q14_x3x1 = _mm_mul_epi32( xmm_sLTP_shp_Q14_x3x1, xmm_gain_adj_Q16 ); xmm_sLTP_shp_Q14_x2x0 = _mm_srli_epi64( xmm_sLTP_shp_Q14_x2x0, 16 ); xmm_sLTP_shp_Q14_x3x1 = _mm_slli_epi64( xmm_sLTP_shp_Q14_x3x1, 16 ); xmm_sLTP_shp_Q14_x2x0 = _mm_blend_epi16( xmm_sLTP_shp_Q14_x2x0, xmm_sLTP_shp_Q14_x3x1, 0xCC ); _mm_storeu_si128( (__m128i *)(&(NSQ->sLTP_shp_Q14[ i ] ) ), xmm_sLTP_shp_Q14_x2x0 ); } for( ; i < NSQ->sLTP_shp_buf_idx; i++ ) { NSQ->sLTP_shp_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sLTP_shp_Q14[ i ] ); } /* Scale long-term prediction state */ if( signal_type == TYPE_VOICED && NSQ->rewhite_flag == 0 ) { for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx; i++ ) { sLTP_Q15[ i ] = silk_SMULWW( gain_adj_Q16, sLTP_Q15[ i ] ); } } NSQ->sLF_AR_shp_Q14 = silk_SMULWW( gain_adj_Q16, NSQ->sLF_AR_shp_Q14 ); /* Scale short-term prediction and shaping states */ for( i = 0; i < NSQ_LPC_BUF_LENGTH; i++ ) { NSQ->sLPC_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sLPC_Q14[ i ] ); } for( i = 0; i < MAX_SHAPE_LPC_ORDER; i++ ) { NSQ->sAR2_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sAR2_Q14[ i ] ); } } } mumble-1.3.4/3rdparty/opus-src/silk/x86/x86_silk_map.c0000664000175000017500000002275414010707327022235 0ustar builderbuilder/* Copyright (c) 2014, Cisco Systems, INC Written by XiangMingZhu WeiZhou MinPeng YanWang Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include "celt/x86/x86cpu.h" #include "structs.h" #include "SigProc_FIX.h" #include "pitch.h" #include "main.h" #if !defined(OPUS_X86_PRESUME_SSE4_1) #if defined(FIXED_POINT) #include "fixed/main_FIX.h" opus_int64 (*const SILK_INNER_PROD16_ALIGNED_64_IMPL[ OPUS_ARCHMASK + 1 ] )( const opus_int16 *inVec1, const opus_int16 *inVec2, const opus_int len ) = { silk_inner_prod16_aligned_64_c, /* non-sse */ silk_inner_prod16_aligned_64_c, silk_inner_prod16_aligned_64_c, MAY_HAVE_SSE4_1( silk_inner_prod16_aligned_64 ), /* sse4.1 */ MAY_HAVE_SSE4_1( silk_inner_prod16_aligned_64 ) /* avx */ }; #endif opus_int (*const SILK_VAD_GETSA_Q8_IMPL[ OPUS_ARCHMASK + 1 ] )( silk_encoder_state *psEncC, const opus_int16 pIn[] ) = { silk_VAD_GetSA_Q8_c, /* non-sse */ silk_VAD_GetSA_Q8_c, silk_VAD_GetSA_Q8_c, MAY_HAVE_SSE4_1( silk_VAD_GetSA_Q8 ), /* sse4.1 */ MAY_HAVE_SSE4_1( silk_VAD_GetSA_Q8 ) /* avx */ }; #if 0 /* FIXME: SSE disabled until the NSQ code gets updated. */ void (*const SILK_NSQ_IMPL[ OPUS_ARCHMASK + 1 ] )( const silk_encoder_state *psEncC, /* I Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ SideInfoIndices *psIndices, /* I/O Quantization Indices */ const opus_int32 x_Q3[], /* I Prefiltered input signal */ opus_int8 pulses[], /* O Quantized pulse signal */ const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */ const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */ const opus_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */ const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */ const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */ const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I Quantization step sizes */ const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */ const opus_int Lambda_Q10, /* I Rate/distortion tradeoff */ const opus_int LTP_scale_Q14 /* I LTP state scaling */ ) = { silk_NSQ_c, /* non-sse */ silk_NSQ_c, silk_NSQ_c, MAY_HAVE_SSE4_1( silk_NSQ ), /* sse4.1 */ MAY_HAVE_SSE4_1( silk_NSQ ) /* avx */ }; #endif #if 0 /* FIXME: SSE disabled until silk_VQ_WMat_EC_sse4_1() gets updated. */ void (*const SILK_VQ_WMAT_EC_IMPL[ OPUS_ARCHMASK + 1 ] )( opus_int8 *ind, /* O index of best codebook vector */ opus_int32 *rate_dist_Q14, /* O best weighted quant error + mu * rate */ opus_int *gain_Q7, /* O sum of absolute LTP coefficients */ const opus_int16 *in_Q14, /* I input vector to be quantized */ const opus_int32 *W_Q18, /* I weighting matrix */ const opus_int8 *cb_Q7, /* I codebook */ const opus_uint8 *cb_gain_Q7, /* I codebook effective gain */ const opus_uint8 *cl_Q5, /* I code length for each codebook vector */ const opus_int mu_Q9, /* I tradeoff betw. weighted error and rate */ const opus_int32 max_gain_Q7, /* I maximum sum of absolute LTP coefficients */ opus_int L /* I number of vectors in codebook */ ) = { silk_VQ_WMat_EC_c, /* non-sse */ silk_VQ_WMat_EC_c, silk_VQ_WMat_EC_c, MAY_HAVE_SSE4_1( silk_VQ_WMat_EC ), /* sse4.1 */ MAY_HAVE_SSE4_1( silk_VQ_WMat_EC ) /* avx */ }; #endif #if 0 /* FIXME: SSE disabled until the NSQ code gets updated. */ void (*const SILK_NSQ_DEL_DEC_IMPL[ OPUS_ARCHMASK + 1 ] )( const silk_encoder_state *psEncC, /* I Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ SideInfoIndices *psIndices, /* I/O Quantization Indices */ const opus_int32 x_Q3[], /* I Prefiltered input signal */ opus_int8 pulses[], /* O Quantized pulse signal */ const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */ const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */ const opus_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */ const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */ const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */ const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I Quantization step sizes */ const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */ const opus_int Lambda_Q10, /* I Rate/distortion tradeoff */ const opus_int LTP_scale_Q14 /* I LTP state scaling */ ) = { silk_NSQ_del_dec_c, /* non-sse */ silk_NSQ_del_dec_c, silk_NSQ_del_dec_c, MAY_HAVE_SSE4_1( silk_NSQ_del_dec ), /* sse4.1 */ MAY_HAVE_SSE4_1( silk_NSQ_del_dec ) /* avx */ }; #endif #if defined(FIXED_POINT) void (*const SILK_BURG_MODIFIED_IMPL[ OPUS_ARCHMASK + 1 ] )( opus_int32 *res_nrg, /* O Residual energy */ opus_int *res_nrg_Q, /* O Residual energy Q value */ opus_int32 A_Q16[], /* O Prediction coefficients (length order) */ const opus_int16 x[], /* I Input signal, length: nb_subfr * ( D + subfr_length ) */ const opus_int32 minInvGain_Q30, /* I Inverse of max prediction gain */ const opus_int subfr_length, /* I Input signal subframe length (incl. D preceding samples) */ const opus_int nb_subfr, /* I Number of subframes stacked in x */ const opus_int D, /* I Order */ int arch /* I Run-time architecture */ ) = { silk_burg_modified_c, /* non-sse */ silk_burg_modified_c, silk_burg_modified_c, MAY_HAVE_SSE4_1( silk_burg_modified ), /* sse4.1 */ MAY_HAVE_SSE4_1( silk_burg_modified ) /* avx */ }; #endif #endif mumble-1.3.4/3rdparty/opus-src/silk/x86/main_sse.h0000664000175000017500000004140714010707327021530 0ustar builderbuilder/* Copyright (c) 2014, Cisco Systems, INC Written by XiangMingZhu WeiZhou MinPeng YanWang Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef MAIN_SSE_H #define MAIN_SSE_H #ifdef HAVE_CONFIG_H #include "config.h" #endif # if defined(OPUS_X86_MAY_HAVE_SSE4_1) #if 0 /* FIXME: SSE disabled until silk_VQ_WMat_EC_sse4_1() gets updated. */ # define OVERRIDE_silk_VQ_WMat_EC void silk_VQ_WMat_EC_sse4_1( opus_int8 *ind, /* O index of best codebook vector */ opus_int32 *rate_dist_Q14, /* O best weighted quant error + mu * rate */ opus_int *gain_Q7, /* O sum of absolute LTP coefficients */ const opus_int16 *in_Q14, /* I input vector to be quantized */ const opus_int32 *W_Q18, /* I weighting matrix */ const opus_int8 *cb_Q7, /* I codebook */ const opus_uint8 *cb_gain_Q7, /* I codebook effective gain */ const opus_uint8 *cl_Q5, /* I code length for each codebook vector */ const opus_int mu_Q9, /* I tradeoff betw. weighted error and rate */ const opus_int32 max_gain_Q7, /* I maximum sum of absolute LTP coefficients */ opus_int L /* I number of vectors in codebook */ ); #if defined OPUS_X86_PRESUME_SSE4_1 #define silk_VQ_WMat_EC(ind, rate_dist_Q14, gain_Q7, in_Q14, W_Q18, cb_Q7, cb_gain_Q7, cl_Q5, \ mu_Q9, max_gain_Q7, L, arch) \ ((void)(arch),silk_VQ_WMat_EC_sse4_1(ind, rate_dist_Q14, gain_Q7, in_Q14, W_Q18, cb_Q7, cb_gain_Q7, cl_Q5, \ mu_Q9, max_gain_Q7, L)) #else extern void (*const SILK_VQ_WMAT_EC_IMPL[OPUS_ARCHMASK + 1])( opus_int8 *ind, /* O index of best codebook vector */ opus_int32 *rate_dist_Q14, /* O best weighted quant error + mu * rate */ opus_int *gain_Q7, /* O sum of absolute LTP coefficients */ const opus_int16 *in_Q14, /* I input vector to be quantized */ const opus_int32 *W_Q18, /* I weighting matrix */ const opus_int8 *cb_Q7, /* I codebook */ const opus_uint8 *cb_gain_Q7, /* I codebook effective gain */ const opus_uint8 *cl_Q5, /* I code length for each codebook vector */ const opus_int mu_Q9, /* I tradeoff betw. weighted error and rate */ const opus_int32 max_gain_Q7, /* I maximum sum of absolute LTP coefficients */ opus_int L /* I number of vectors in codebook */ ); # define silk_VQ_WMat_EC(ind, rate_dist_Q14, gain_Q7, in_Q14, W_Q18, cb_Q7, cb_gain_Q7, cl_Q5, \ mu_Q9, max_gain_Q7, L, arch) \ ((*SILK_VQ_WMAT_EC_IMPL[(arch) & OPUS_ARCHMASK])(ind, rate_dist_Q14, gain_Q7, in_Q14, W_Q18, cb_Q7, cb_gain_Q7, cl_Q5, \ mu_Q9, max_gain_Q7, L)) #endif #endif #if 0 /* FIXME: SSE disabled until the NSQ code gets updated. */ # define OVERRIDE_silk_NSQ void silk_NSQ_sse4_1( const silk_encoder_state *psEncC, /* I Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ SideInfoIndices *psIndices, /* I/O Quantization Indices */ const opus_int32 x_Q3[], /* I Prefiltered input signal */ opus_int8 pulses[], /* O Quantized pulse signal */ const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */ const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */ const opus_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */ const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */ const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */ const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I Quantization step sizes */ const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */ const opus_int Lambda_Q10, /* I Rate/distortion tradeoff */ const opus_int LTP_scale_Q14 /* I LTP state scaling */ ); #if defined OPUS_X86_PRESUME_SSE4_1 #define silk_NSQ(psEncC, NSQ, psIndices, x_Q3, pulses, PredCoef_Q12, LTPCoef_Q14, AR2_Q13, \ HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14, arch) \ ((void)(arch),silk_NSQ_sse4_1(psEncC, NSQ, psIndices, x_Q3, pulses, PredCoef_Q12, LTPCoef_Q14, AR2_Q13, \ HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14)) #else extern void (*const SILK_NSQ_IMPL[OPUS_ARCHMASK + 1])( const silk_encoder_state *psEncC, /* I Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ SideInfoIndices *psIndices, /* I/O Quantization Indices */ const opus_int32 x_Q3[], /* I Prefiltered input signal */ opus_int8 pulses[], /* O Quantized pulse signal */ const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */ const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */ const opus_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */ const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */ const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */ const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I Quantization step sizes */ const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */ const opus_int Lambda_Q10, /* I Rate/distortion tradeoff */ const opus_int LTP_scale_Q14 /* I LTP state scaling */ ); # define silk_NSQ(psEncC, NSQ, psIndices, x_Q3, pulses, PredCoef_Q12, LTPCoef_Q14, AR2_Q13, \ HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14, arch) \ ((*SILK_NSQ_IMPL[(arch) & OPUS_ARCHMASK])(psEncC, NSQ, psIndices, x_Q3, pulses, PredCoef_Q12, LTPCoef_Q14, AR2_Q13, \ HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14)) #endif # define OVERRIDE_silk_NSQ_del_dec void silk_NSQ_del_dec_sse4_1( const silk_encoder_state *psEncC, /* I Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ SideInfoIndices *psIndices, /* I/O Quantization Indices */ const opus_int32 x_Q3[], /* I Prefiltered input signal */ opus_int8 pulses[], /* O Quantized pulse signal */ const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */ const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */ const opus_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */ const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */ const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */ const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I Quantization step sizes */ const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */ const opus_int Lambda_Q10, /* I Rate/distortion tradeoff */ const opus_int LTP_scale_Q14 /* I LTP state scaling */ ); #if defined OPUS_X86_PRESUME_SSE4_1 #define silk_NSQ_del_dec(psEncC, NSQ, psIndices, x_Q3, pulses, PredCoef_Q12, LTPCoef_Q14, AR2_Q13, \ HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14, arch) \ ((void)(arch),silk_NSQ_del_dec_sse4_1(psEncC, NSQ, psIndices, x_Q3, pulses, PredCoef_Q12, LTPCoef_Q14, AR2_Q13, \ HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14)) #else extern void (*const SILK_NSQ_DEL_DEC_IMPL[OPUS_ARCHMASK + 1])( const silk_encoder_state *psEncC, /* I Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ SideInfoIndices *psIndices, /* I/O Quantization Indices */ const opus_int32 x_Q3[], /* I Prefiltered input signal */ opus_int8 pulses[], /* O Quantized pulse signal */ const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */ const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */ const opus_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */ const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */ const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */ const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I Quantization step sizes */ const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */ const opus_int Lambda_Q10, /* I Rate/distortion tradeoff */ const opus_int LTP_scale_Q14 /* I LTP state scaling */ ); # define silk_NSQ_del_dec(psEncC, NSQ, psIndices, x_Q3, pulses, PredCoef_Q12, LTPCoef_Q14, AR2_Q13, \ HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14, arch) \ ((*SILK_NSQ_DEL_DEC_IMPL[(arch) & OPUS_ARCHMASK])(psEncC, NSQ, psIndices, x_Q3, pulses, PredCoef_Q12, LTPCoef_Q14, AR2_Q13, \ HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14)) #endif #endif void silk_noise_shape_quantizer( silk_nsq_state *NSQ, /* I/O NSQ state */ opus_int signalType, /* I Signal type */ const opus_int32 x_sc_Q10[], /* I */ opus_int8 pulses[], /* O */ opus_int16 xq[], /* O */ opus_int32 sLTP_Q15[], /* I/O LTP state */ const opus_int16 a_Q12[], /* I Short term prediction coefs */ const opus_int16 b_Q14[], /* I Long term prediction coefs */ const opus_int16 AR_shp_Q13[], /* I Noise shaping AR coefs */ opus_int lag, /* I Pitch lag */ opus_int32 HarmShapeFIRPacked_Q14, /* I */ opus_int Tilt_Q14, /* I Spectral tilt */ opus_int32 LF_shp_Q14, /* I */ opus_int32 Gain_Q16, /* I */ opus_int Lambda_Q10, /* I */ opus_int offset_Q10, /* I */ opus_int length, /* I Input length */ opus_int shapingLPCOrder, /* I Noise shaping AR filter order */ opus_int predictLPCOrder, /* I Prediction filter order */ int arch /* I Architecture */ ); /**************************/ /* Noise level estimation */ /**************************/ void silk_VAD_GetNoiseLevels( const opus_int32 pX[ VAD_N_BANDS ], /* I subband energies */ silk_VAD_state *psSilk_VAD /* I/O Pointer to Silk VAD state */ ); # define OVERRIDE_silk_VAD_GetSA_Q8 opus_int silk_VAD_GetSA_Q8_sse4_1( silk_encoder_state *psEnC, const opus_int16 pIn[] ); #if defined(OPUS_X86_PRESUME_SSE4_1) #define silk_VAD_GetSA_Q8(psEnC, pIn, arch) ((void)(arch),silk_VAD_GetSA_Q8_sse4_1(psEnC, pIn)) #else # define silk_VAD_GetSA_Q8(psEnC, pIn, arch) \ ((*SILK_VAD_GETSA_Q8_IMPL[(arch) & OPUS_ARCHMASK])(psEnC, pIn)) extern opus_int (*const SILK_VAD_GETSA_Q8_IMPL[OPUS_ARCHMASK + 1])( silk_encoder_state *psEnC, const opus_int16 pIn[]); #endif # endif #endif mumble-1.3.4/3rdparty/opus-src/silk/pitch_est_defines.h0000664000175000017500000000773514010707327022772 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef SILK_PE_DEFINES_H #define SILK_PE_DEFINES_H #include "SigProc_FIX.h" /********************************************************/ /* Definitions for pitch estimator */ /********************************************************/ #define PE_MAX_FS_KHZ 16 /* Maximum sampling frequency used */ #define PE_MAX_NB_SUBFR 4 #define PE_SUBFR_LENGTH_MS 5 /* 5 ms */ #define PE_LTP_MEM_LENGTH_MS ( 4 * PE_SUBFR_LENGTH_MS ) #define PE_MAX_FRAME_LENGTH_MS ( PE_LTP_MEM_LENGTH_MS + PE_MAX_NB_SUBFR * PE_SUBFR_LENGTH_MS ) #define PE_MAX_FRAME_LENGTH ( PE_MAX_FRAME_LENGTH_MS * PE_MAX_FS_KHZ ) #define PE_MAX_FRAME_LENGTH_ST_1 ( PE_MAX_FRAME_LENGTH >> 2 ) #define PE_MAX_FRAME_LENGTH_ST_2 ( PE_MAX_FRAME_LENGTH >> 1 ) #define PE_MAX_LAG_MS 18 /* 18 ms -> 56 Hz */ #define PE_MIN_LAG_MS 2 /* 2 ms -> 500 Hz */ #define PE_MAX_LAG ( PE_MAX_LAG_MS * PE_MAX_FS_KHZ ) #define PE_MIN_LAG ( PE_MIN_LAG_MS * PE_MAX_FS_KHZ ) #define PE_D_SRCH_LENGTH 24 #define PE_NB_STAGE3_LAGS 5 #define PE_NB_CBKS_STAGE2 3 #define PE_NB_CBKS_STAGE2_EXT 11 #define PE_NB_CBKS_STAGE3_MAX 34 #define PE_NB_CBKS_STAGE3_MID 24 #define PE_NB_CBKS_STAGE3_MIN 16 #define PE_NB_CBKS_STAGE3_10MS 12 #define PE_NB_CBKS_STAGE2_10MS 3 #define PE_SHORTLAG_BIAS 0.2f /* for logarithmic weighting */ #define PE_PREVLAG_BIAS 0.2f /* for logarithmic weighting */ #define PE_FLATCONTOUR_BIAS 0.05f #define SILK_PE_MIN_COMPLEX 0 #define SILK_PE_MID_COMPLEX 1 #define SILK_PE_MAX_COMPLEX 2 /* Tables for 20 ms frames */ extern const opus_int8 silk_CB_lags_stage2[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE2_EXT ]; extern const opus_int8 silk_CB_lags_stage3[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE3_MAX ]; extern const opus_int8 silk_Lag_range_stage3[ SILK_PE_MAX_COMPLEX + 1 ] [ PE_MAX_NB_SUBFR ][ 2 ]; extern const opus_int8 silk_nb_cbk_searchs_stage3[ SILK_PE_MAX_COMPLEX + 1 ]; /* Tables for 10 ms frames */ extern const opus_int8 silk_CB_lags_stage2_10_ms[ PE_MAX_NB_SUBFR >> 1][ 3 ]; extern const opus_int8 silk_CB_lags_stage3_10_ms[ PE_MAX_NB_SUBFR >> 1 ][ 12 ]; extern const opus_int8 silk_Lag_range_stage3_10_ms[ PE_MAX_NB_SUBFR >> 1 ][ 2 ]; #endif mumble-1.3.4/3rdparty/opus-src/silk/code_signs.c0000664000175000017500000001266214010707327021416 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main.h" /*#define silk_enc_map(a) ((a) > 0 ? 1 : 0)*/ /*#define silk_dec_map(a) ((a) > 0 ? 1 : -1)*/ /* shifting avoids if-statement */ #define silk_enc_map(a) ( silk_RSHIFT( (a), 15 ) + 1 ) #define silk_dec_map(a) ( silk_LSHIFT( (a), 1 ) - 1 ) /* Encodes signs of excitation */ void silk_encode_signs( ec_enc *psRangeEnc, /* I/O Compressor data structure */ const opus_int8 pulses[], /* I pulse signal */ opus_int length, /* I length of input */ const opus_int signalType, /* I Signal type */ const opus_int quantOffsetType, /* I Quantization offset type */ const opus_int sum_pulses[ MAX_NB_SHELL_BLOCKS ] /* I Sum of absolute pulses per block */ ) { opus_int i, j, p; opus_uint8 icdf[ 2 ]; const opus_int8 *q_ptr; const opus_uint8 *icdf_ptr; icdf[ 1 ] = 0; q_ptr = pulses; i = silk_SMULBB( 7, silk_ADD_LSHIFT( quantOffsetType, signalType, 1 ) ); icdf_ptr = &silk_sign_iCDF[ i ]; length = silk_RSHIFT( length + SHELL_CODEC_FRAME_LENGTH/2, LOG2_SHELL_CODEC_FRAME_LENGTH ); for( i = 0; i < length; i++ ) { p = sum_pulses[ i ]; if( p > 0 ) { icdf[ 0 ] = icdf_ptr[ silk_min( p & 0x1F, 6 ) ]; for( j = 0; j < SHELL_CODEC_FRAME_LENGTH; j++ ) { if( q_ptr[ j ] != 0 ) { ec_enc_icdf( psRangeEnc, silk_enc_map( q_ptr[ j ]), icdf, 8 ); } } } q_ptr += SHELL_CODEC_FRAME_LENGTH; } } /* Decodes signs of excitation */ void silk_decode_signs( ec_dec *psRangeDec, /* I/O Compressor data structure */ opus_int16 pulses[], /* I/O pulse signal */ opus_int length, /* I length of input */ const opus_int signalType, /* I Signal type */ const opus_int quantOffsetType, /* I Quantization offset type */ const opus_int sum_pulses[ MAX_NB_SHELL_BLOCKS ] /* I Sum of absolute pulses per block */ ) { opus_int i, j, p; opus_uint8 icdf[ 2 ]; opus_int16 *q_ptr; const opus_uint8 *icdf_ptr; icdf[ 1 ] = 0; q_ptr = pulses; i = silk_SMULBB( 7, silk_ADD_LSHIFT( quantOffsetType, signalType, 1 ) ); icdf_ptr = &silk_sign_iCDF[ i ]; length = silk_RSHIFT( length + SHELL_CODEC_FRAME_LENGTH/2, LOG2_SHELL_CODEC_FRAME_LENGTH ); for( i = 0; i < length; i++ ) { p = sum_pulses[ i ]; if( p > 0 ) { icdf[ 0 ] = icdf_ptr[ silk_min( p & 0x1F, 6 ) ]; for( j = 0; j < SHELL_CODEC_FRAME_LENGTH; j++ ) { if( q_ptr[ j ] > 0 ) { /* attach sign */ #if 0 /* conditional implementation */ if( ec_dec_icdf( psRangeDec, icdf, 8 ) == 0 ) { q_ptr[ j ] = -q_ptr[ j ]; } #else /* implementation with shift, subtraction, multiplication */ q_ptr[ j ] *= silk_dec_map( ec_dec_icdf( psRangeDec, icdf, 8 ) ); #endif } } } q_ptr += SHELL_CODEC_FRAME_LENGTH; } } mumble-1.3.4/3rdparty/opus-src/silk/decoder_set_fs.c0000664000175000017500000001155014010707327022244 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main.h" /* Set decoder sampling rate */ opus_int silk_decoder_set_fs( silk_decoder_state *psDec, /* I/O Decoder state pointer */ opus_int fs_kHz, /* I Sampling frequency (kHz) */ opus_int32 fs_API_Hz /* I API Sampling frequency (Hz) */ ) { opus_int frame_length, ret = 0; silk_assert( fs_kHz == 8 || fs_kHz == 12 || fs_kHz == 16 ); silk_assert( psDec->nb_subfr == MAX_NB_SUBFR || psDec->nb_subfr == MAX_NB_SUBFR/2 ); /* New (sub)frame length */ psDec->subfr_length = silk_SMULBB( SUB_FRAME_LENGTH_MS, fs_kHz ); frame_length = silk_SMULBB( psDec->nb_subfr, psDec->subfr_length ); /* Initialize resampler when switching internal or external sampling frequency */ if( psDec->fs_kHz != fs_kHz || psDec->fs_API_hz != fs_API_Hz ) { /* Initialize the resampler for dec_API.c preparing resampling from fs_kHz to API_fs_Hz */ ret += silk_resampler_init( &psDec->resampler_state, silk_SMULBB( fs_kHz, 1000 ), fs_API_Hz, 0 ); psDec->fs_API_hz = fs_API_Hz; } if( psDec->fs_kHz != fs_kHz || frame_length != psDec->frame_length ) { if( fs_kHz == 8 ) { if( psDec->nb_subfr == MAX_NB_SUBFR ) { psDec->pitch_contour_iCDF = silk_pitch_contour_NB_iCDF; } else { psDec->pitch_contour_iCDF = silk_pitch_contour_10_ms_NB_iCDF; } } else { if( psDec->nb_subfr == MAX_NB_SUBFR ) { psDec->pitch_contour_iCDF = silk_pitch_contour_iCDF; } else { psDec->pitch_contour_iCDF = silk_pitch_contour_10_ms_iCDF; } } if( psDec->fs_kHz != fs_kHz ) { psDec->ltp_mem_length = silk_SMULBB( LTP_MEM_LENGTH_MS, fs_kHz ); if( fs_kHz == 8 || fs_kHz == 12 ) { psDec->LPC_order = MIN_LPC_ORDER; psDec->psNLSF_CB = &silk_NLSF_CB_NB_MB; } else { psDec->LPC_order = MAX_LPC_ORDER; psDec->psNLSF_CB = &silk_NLSF_CB_WB; } if( fs_kHz == 16 ) { psDec->pitch_lag_low_bits_iCDF = silk_uniform8_iCDF; } else if( fs_kHz == 12 ) { psDec->pitch_lag_low_bits_iCDF = silk_uniform6_iCDF; } else if( fs_kHz == 8 ) { psDec->pitch_lag_low_bits_iCDF = silk_uniform4_iCDF; } else { /* unsupported sampling rate */ silk_assert( 0 ); } psDec->first_frame_after_reset = 1; psDec->lagPrev = 100; psDec->LastGainIndex = 10; psDec->prevSignalType = TYPE_NO_VOICE_ACTIVITY; silk_memset( psDec->outBuf, 0, sizeof(psDec->outBuf)); silk_memset( psDec->sLPC_Q14_buf, 0, sizeof(psDec->sLPC_Q14_buf) ); } psDec->fs_kHz = fs_kHz; psDec->frame_length = frame_length; } /* Check that settings are valid */ silk_assert( psDec->frame_length > 0 && psDec->frame_length <= MAX_FRAME_LENGTH ); return ret; } mumble-1.3.4/3rdparty/opus-src/silk/HP_variable_cutoff.c0000664000175000017500000000762514010707327023026 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef FIXED_POINT #include "main_FIX.h" #else #include "main_FLP.h" #endif #include "tuning_parameters.h" /* High-pass filter with cutoff frequency adaptation based on pitch lag statistics */ void silk_HP_variable_cutoff( silk_encoder_state_Fxx state_Fxx[] /* I/O Encoder states */ ) { opus_int quality_Q15; opus_int32 pitch_freq_Hz_Q16, pitch_freq_log_Q7, delta_freq_Q7; silk_encoder_state *psEncC1 = &state_Fxx[ 0 ].sCmn; /* Adaptive cutoff frequency: estimate low end of pitch frequency range */ if( psEncC1->prevSignalType == TYPE_VOICED ) { /* difference, in log domain */ pitch_freq_Hz_Q16 = silk_DIV32_16( silk_LSHIFT( silk_MUL( psEncC1->fs_kHz, 1000 ), 16 ), psEncC1->prevLag ); pitch_freq_log_Q7 = silk_lin2log( pitch_freq_Hz_Q16 ) - ( 16 << 7 ); /* adjustment based on quality */ quality_Q15 = psEncC1->input_quality_bands_Q15[ 0 ]; pitch_freq_log_Q7 = silk_SMLAWB( pitch_freq_log_Q7, silk_SMULWB( silk_LSHIFT( -quality_Q15, 2 ), quality_Q15 ), pitch_freq_log_Q7 - ( silk_lin2log( SILK_FIX_CONST( VARIABLE_HP_MIN_CUTOFF_HZ, 16 ) ) - ( 16 << 7 ) ) ); /* delta_freq = pitch_freq_log - psEnc->variable_HP_smth1; */ delta_freq_Q7 = pitch_freq_log_Q7 - silk_RSHIFT( psEncC1->variable_HP_smth1_Q15, 8 ); if( delta_freq_Q7 < 0 ) { /* less smoothing for decreasing pitch frequency, to track something close to the minimum */ delta_freq_Q7 = silk_MUL( delta_freq_Q7, 3 ); } /* limit delta, to reduce impact of outliers in pitch estimation */ delta_freq_Q7 = silk_LIMIT_32( delta_freq_Q7, -SILK_FIX_CONST( VARIABLE_HP_MAX_DELTA_FREQ, 7 ), SILK_FIX_CONST( VARIABLE_HP_MAX_DELTA_FREQ, 7 ) ); /* update smoother */ psEncC1->variable_HP_smth1_Q15 = silk_SMLAWB( psEncC1->variable_HP_smth1_Q15, silk_SMULBB( psEncC1->speech_activity_Q8, delta_freq_Q7 ), SILK_FIX_CONST( VARIABLE_HP_SMTH_COEF1, 16 ) ); /* limit frequency range */ psEncC1->variable_HP_smth1_Q15 = silk_LIMIT_32( psEncC1->variable_HP_smth1_Q15, silk_LSHIFT( silk_lin2log( VARIABLE_HP_MIN_CUTOFF_HZ ), 8 ), silk_LSHIFT( silk_lin2log( VARIABLE_HP_MAX_CUTOFF_HZ ), 8 ) ); } } mumble-1.3.4/3rdparty/opus-src/silk/bwexpander_32.c0000664000175000017500000000467214010707327021746 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "SigProc_FIX.h" /* Chirp (bandwidth expand) LP AR filter */ void silk_bwexpander_32( opus_int32 *ar, /* I/O AR filter to be expanded (without leading 1) */ const opus_int d, /* I Length of ar */ opus_int32 chirp_Q16 /* I Chirp factor in Q16 */ ) { opus_int i; opus_int32 chirp_minus_one_Q16 = chirp_Q16 - 65536; for( i = 0; i < d - 1; i++ ) { ar[ i ] = silk_SMULWW( chirp_Q16, ar[ i ] ); chirp_Q16 += silk_RSHIFT_ROUND( silk_MUL( chirp_Q16, chirp_minus_one_Q16 ), 16 ); } ar[ d - 1 ] = silk_SMULWW( chirp_Q16, ar[ d - 1 ] ); } mumble-1.3.4/3rdparty/opus-src/silk/tests/0000775000175000017500000000000014010707327020270 5ustar builderbuildermumble-1.3.4/3rdparty/opus-src/silk/tests/test_unit_LPC_inv_pred_gain.c0000664000175000017500000001125714010707327026042 0ustar builderbuilder/*********************************************************************** Copyright (c) 2017 Google Inc., Jean-Marc Valin Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "celt/stack_alloc.h" #include "cpu_support.h" #include "SigProc_FIX.h" /* Computes the impulse response of the filter so we can catch filters that are definitely unstable. Some unstable filters may be classified as stable, but not the other way around. */ int check_stability(opus_int16 *A_Q12, int order) { int i; int j; int sum_a, sum_abs_a; sum_a = sum_abs_a = 0; for( j = 0; j < order; j++ ) { sum_a += A_Q12[ j ]; sum_abs_a += silk_abs( A_Q12[ j ] ); } /* Check DC stability. */ if( sum_a >= 4096 ) { return 0; } /* If the sum of absolute values is less than 1, the filter has to be stable. */ if( sum_abs_a < 4096 ) { return 1; } double y[SILK_MAX_ORDER_LPC] = {0}; y[0] = 1; for( i = 0; i < 10000; i++ ) { double sum = 0; for( j = 0; j < order; j++ ) { sum += y[ j ]*A_Q12[ j ]; } for( j = order - 1; j > 0; j-- ) { y[ j ] = y[ j - 1 ]; } y[ 0 ] = sum*(1./4096); /* If impulse response reaches +/- 10000, the filter is definitely unstable. */ if( !(y[ 0 ] < 10000 && y[ 0 ] > -10000) ) { return 0; } /* Test every 8 sample for low amplitude. */ if( ( i & 0x7 ) == 0 ) { double amp = 0; for( j = 0; j < order; j++ ) { amp += fabs(y[j]); } if( amp < 0.00001 ) { return 1; } } } return 1; } int main(void) { const int arch = opus_select_arch(); /* Set to 10000 so all branches in C function are triggered */ const int loop_num = 10000; int count = 0; ALLOC_STACK; /* FIXME: Make the seed random (with option to set it explicitly) so we get wider coverage. */ srand(0); printf("Testing silk_LPC_inverse_pred_gain() optimization ...\n"); for( count = 0; count < loop_num; count++ ) { unsigned int i; opus_int order; unsigned int shift; opus_int16 A_Q12[ SILK_MAX_ORDER_LPC ]; opus_int32 gain; for( order = 2; order <= SILK_MAX_ORDER_LPC; order += 2 ) { /* order must be even. */ for( shift = 0; shift < 16; shift++ ) { /* Different dynamic range. */ for( i = 0; i < SILK_MAX_ORDER_LPC; i++ ) { A_Q12[i] = ((opus_int16)rand()) >> shift; } gain = silk_LPC_inverse_pred_gain(A_Q12, order, arch); /* Look for filters that silk_LPC_inverse_pred_gain() thinks are stable but definitely aren't. */ if( gain != 0 && !check_stability(A_Q12, order) ) { fprintf(stderr, "**Loop %4d failed!**\n", count); return 1; } } } if( !(count % 500) ) { printf("Loop %4d passed\n", count); } } printf("silk_LPC_inverse_pred_gain() optimization passed\n"); return 0; } mumble-1.3.4/3rdparty/opus-src/silk/resampler.c0000664000175000017500000002331314010707327021266 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif /* * Matrix of resampling methods used: * Fs_out (kHz) * 8 12 16 24 48 * * 8 C UF U UF UF * 12 AF C UF U UF * Fs_in (kHz) 16 D AF C UF UF * 24 AF D AF C U * 48 AF AF AF D C * * C -> Copy (no resampling) * D -> Allpass-based 2x downsampling * U -> Allpass-based 2x upsampling * UF -> Allpass-based 2x upsampling followed by FIR interpolation * AF -> AR2 filter followed by FIR interpolation */ #include "resampler_private.h" /* Tables with delay compensation values to equalize total delay for different modes */ static const opus_int8 delay_matrix_enc[ 5 ][ 3 ] = { /* in \ out 8 12 16 */ /* 8 */ { 6, 0, 3 }, /* 12 */ { 0, 7, 3 }, /* 16 */ { 0, 1, 10 }, /* 24 */ { 0, 2, 6 }, /* 48 */ { 18, 10, 12 } }; static const opus_int8 delay_matrix_dec[ 3 ][ 5 ] = { /* in \ out 8 12 16 24 48 */ /* 8 */ { 4, 0, 2, 0, 0 }, /* 12 */ { 0, 9, 4, 7, 4 }, /* 16 */ { 0, 3, 12, 7, 7 } }; /* Simple way to make [8000, 12000, 16000, 24000, 48000] to [0, 1, 2, 3, 4] */ #define rateID(R) ( ( ( ((R)>>12) - ((R)>16000) ) >> ((R)>24000) ) - 1 ) #define USE_silk_resampler_copy (0) #define USE_silk_resampler_private_up2_HQ_wrapper (1) #define USE_silk_resampler_private_IIR_FIR (2) #define USE_silk_resampler_private_down_FIR (3) /* Initialize/reset the resampler state for a given pair of input/output sampling rates */ opus_int silk_resampler_init( silk_resampler_state_struct *S, /* I/O Resampler state */ opus_int32 Fs_Hz_in, /* I Input sampling rate (Hz) */ opus_int32 Fs_Hz_out, /* I Output sampling rate (Hz) */ opus_int forEnc /* I If 1: encoder; if 0: decoder */ ) { opus_int up2x; /* Clear state */ silk_memset( S, 0, sizeof( silk_resampler_state_struct ) ); /* Input checking */ if( forEnc ) { if( ( Fs_Hz_in != 8000 && Fs_Hz_in != 12000 && Fs_Hz_in != 16000 && Fs_Hz_in != 24000 && Fs_Hz_in != 48000 ) || ( Fs_Hz_out != 8000 && Fs_Hz_out != 12000 && Fs_Hz_out != 16000 ) ) { silk_assert( 0 ); return -1; } S->inputDelay = delay_matrix_enc[ rateID( Fs_Hz_in ) ][ rateID( Fs_Hz_out ) ]; } else { if( ( Fs_Hz_in != 8000 && Fs_Hz_in != 12000 && Fs_Hz_in != 16000 ) || ( Fs_Hz_out != 8000 && Fs_Hz_out != 12000 && Fs_Hz_out != 16000 && Fs_Hz_out != 24000 && Fs_Hz_out != 48000 ) ) { silk_assert( 0 ); return -1; } S->inputDelay = delay_matrix_dec[ rateID( Fs_Hz_in ) ][ rateID( Fs_Hz_out ) ]; } S->Fs_in_kHz = silk_DIV32_16( Fs_Hz_in, 1000 ); S->Fs_out_kHz = silk_DIV32_16( Fs_Hz_out, 1000 ); /* Number of samples processed per batch */ S->batchSize = S->Fs_in_kHz * RESAMPLER_MAX_BATCH_SIZE_MS; /* Find resampler with the right sampling ratio */ up2x = 0; if( Fs_Hz_out > Fs_Hz_in ) { /* Upsample */ if( Fs_Hz_out == silk_MUL( Fs_Hz_in, 2 ) ) { /* Fs_out : Fs_in = 2 : 1 */ /* Special case: directly use 2x upsampler */ S->resampler_function = USE_silk_resampler_private_up2_HQ_wrapper; } else { /* Default resampler */ S->resampler_function = USE_silk_resampler_private_IIR_FIR; up2x = 1; } } else if ( Fs_Hz_out < Fs_Hz_in ) { /* Downsample */ S->resampler_function = USE_silk_resampler_private_down_FIR; if( silk_MUL( Fs_Hz_out, 4 ) == silk_MUL( Fs_Hz_in, 3 ) ) { /* Fs_out : Fs_in = 3 : 4 */ S->FIR_Fracs = 3; S->FIR_Order = RESAMPLER_DOWN_ORDER_FIR0; S->Coefs = silk_Resampler_3_4_COEFS; } else if( silk_MUL( Fs_Hz_out, 3 ) == silk_MUL( Fs_Hz_in, 2 ) ) { /* Fs_out : Fs_in = 2 : 3 */ S->FIR_Fracs = 2; S->FIR_Order = RESAMPLER_DOWN_ORDER_FIR0; S->Coefs = silk_Resampler_2_3_COEFS; } else if( silk_MUL( Fs_Hz_out, 2 ) == Fs_Hz_in ) { /* Fs_out : Fs_in = 1 : 2 */ S->FIR_Fracs = 1; S->FIR_Order = RESAMPLER_DOWN_ORDER_FIR1; S->Coefs = silk_Resampler_1_2_COEFS; } else if( silk_MUL( Fs_Hz_out, 3 ) == Fs_Hz_in ) { /* Fs_out : Fs_in = 1 : 3 */ S->FIR_Fracs = 1; S->FIR_Order = RESAMPLER_DOWN_ORDER_FIR2; S->Coefs = silk_Resampler_1_3_COEFS; } else if( silk_MUL( Fs_Hz_out, 4 ) == Fs_Hz_in ) { /* Fs_out : Fs_in = 1 : 4 */ S->FIR_Fracs = 1; S->FIR_Order = RESAMPLER_DOWN_ORDER_FIR2; S->Coefs = silk_Resampler_1_4_COEFS; } else if( silk_MUL( Fs_Hz_out, 6 ) == Fs_Hz_in ) { /* Fs_out : Fs_in = 1 : 6 */ S->FIR_Fracs = 1; S->FIR_Order = RESAMPLER_DOWN_ORDER_FIR2; S->Coefs = silk_Resampler_1_6_COEFS; } else { /* None available */ silk_assert( 0 ); return -1; } } else { /* Input and output sampling rates are equal: copy */ S->resampler_function = USE_silk_resampler_copy; } /* Ratio of input/output samples */ S->invRatio_Q16 = silk_LSHIFT32( silk_DIV32( silk_LSHIFT32( Fs_Hz_in, 14 + up2x ), Fs_Hz_out ), 2 ); /* Make sure the ratio is rounded up */ while( silk_SMULWW( S->invRatio_Q16, Fs_Hz_out ) < silk_LSHIFT32( Fs_Hz_in, up2x ) ) { S->invRatio_Q16++; } return 0; } /* Resampler: convert from one sampling rate to another */ /* Input and output sampling rate are at most 48000 Hz */ opus_int silk_resampler( silk_resampler_state_struct *S, /* I/O Resampler state */ opus_int16 out[], /* O Output signal */ const opus_int16 in[], /* I Input signal */ opus_int32 inLen /* I Number of input samples */ ) { opus_int nSamples; /* Need at least 1 ms of input data */ silk_assert( inLen >= S->Fs_in_kHz ); /* Delay can't exceed the 1 ms of buffering */ silk_assert( S->inputDelay <= S->Fs_in_kHz ); nSamples = S->Fs_in_kHz - S->inputDelay; /* Copy to delay buffer */ silk_memcpy( &S->delayBuf[ S->inputDelay ], in, nSamples * sizeof( opus_int16 ) ); switch( S->resampler_function ) { case USE_silk_resampler_private_up2_HQ_wrapper: silk_resampler_private_up2_HQ_wrapper( S, out, S->delayBuf, S->Fs_in_kHz ); silk_resampler_private_up2_HQ_wrapper( S, &out[ S->Fs_out_kHz ], &in[ nSamples ], inLen - S->Fs_in_kHz ); break; case USE_silk_resampler_private_IIR_FIR: silk_resampler_private_IIR_FIR( S, out, S->delayBuf, S->Fs_in_kHz ); silk_resampler_private_IIR_FIR( S, &out[ S->Fs_out_kHz ], &in[ nSamples ], inLen - S->Fs_in_kHz ); break; case USE_silk_resampler_private_down_FIR: silk_resampler_private_down_FIR( S, out, S->delayBuf, S->Fs_in_kHz ); silk_resampler_private_down_FIR( S, &out[ S->Fs_out_kHz ], &in[ nSamples ], inLen - S->Fs_in_kHz ); break; default: silk_memcpy( out, S->delayBuf, S->Fs_in_kHz * sizeof( opus_int16 ) ); silk_memcpy( &out[ S->Fs_out_kHz ], &in[ nSamples ], ( inLen - S->Fs_in_kHz ) * sizeof( opus_int16 ) ); } /* Copy to delay buffer */ silk_memcpy( S->delayBuf, &in[ inLen - S->inputDelay ], S->inputDelay * sizeof( opus_int16 ) ); return 0; } mumble-1.3.4/3rdparty/opus-src/silk/resampler_down2_3.c0000664000175000017500000001123514010707327022621 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "SigProc_FIX.h" #include "resampler_private.h" #include "stack_alloc.h" #define ORDER_FIR 4 /* Downsample by a factor 2/3, low quality */ void silk_resampler_down2_3( opus_int32 *S, /* I/O State vector [ 6 ] */ opus_int16 *out, /* O Output signal [ floor(2*inLen/3) ] */ const opus_int16 *in, /* I Input signal [ inLen ] */ opus_int32 inLen /* I Number of input samples */ ) { opus_int32 nSamplesIn, counter, res_Q6; VARDECL( opus_int32, buf ); opus_int32 *buf_ptr; SAVE_STACK; ALLOC( buf, RESAMPLER_MAX_BATCH_SIZE_IN + ORDER_FIR, opus_int32 ); /* Copy buffered samples to start of buffer */ silk_memcpy( buf, S, ORDER_FIR * sizeof( opus_int32 ) ); /* Iterate over blocks of frameSizeIn input samples */ while( 1 ) { nSamplesIn = silk_min( inLen, RESAMPLER_MAX_BATCH_SIZE_IN ); /* Second-order AR filter (output in Q8) */ silk_resampler_private_AR2( &S[ ORDER_FIR ], &buf[ ORDER_FIR ], in, silk_Resampler_2_3_COEFS_LQ, nSamplesIn ); /* Interpolate filtered signal */ buf_ptr = buf; counter = nSamplesIn; while( counter > 2 ) { /* Inner product */ res_Q6 = silk_SMULWB( buf_ptr[ 0 ], silk_Resampler_2_3_COEFS_LQ[ 2 ] ); res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 1 ], silk_Resampler_2_3_COEFS_LQ[ 3 ] ); res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 2 ], silk_Resampler_2_3_COEFS_LQ[ 5 ] ); res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 3 ], silk_Resampler_2_3_COEFS_LQ[ 4 ] ); /* Scale down, saturate and store in output array */ *out++ = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( res_Q6, 6 ) ); res_Q6 = silk_SMULWB( buf_ptr[ 1 ], silk_Resampler_2_3_COEFS_LQ[ 4 ] ); res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 2 ], silk_Resampler_2_3_COEFS_LQ[ 5 ] ); res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 3 ], silk_Resampler_2_3_COEFS_LQ[ 3 ] ); res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 4 ], silk_Resampler_2_3_COEFS_LQ[ 2 ] ); /* Scale down, saturate and store in output array */ *out++ = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( res_Q6, 6 ) ); buf_ptr += 3; counter -= 3; } in += nSamplesIn; inLen -= nSamplesIn; if( inLen > 0 ) { /* More iterations to do; copy last part of filtered signal to beginning of buffer */ silk_memcpy( buf, &buf[ nSamplesIn ], ORDER_FIR * sizeof( opus_int32 ) ); } else { break; } } /* Copy last part of filtered signal to the state for the next call */ silk_memcpy( S, &buf[ nSamplesIn ], ORDER_FIR * sizeof( opus_int32 ) ); RESTORE_STACK; } mumble-1.3.4/3rdparty/opus-src/silk/resampler_rom.c0000664000175000017500000001121314010707327022137 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif /* Filter coefficients for IIR/FIR polyphase resampling * * Total size: 179 Words (358 Bytes) */ #include "resampler_private.h" /* Matlab code for the notch filter coefficients: */ /* B = [1, 0.147, 1]; A = [1, 0.107, 0.89]; G = 0.93; freqz(G * B, A, 2^14, 16e3); axis([0, 8000, -10, 1]) */ /* fprintf('\t%6d, %6d, %6d, %6d\n', round(B(2)*2^16), round(-A(2)*2^16), round((1-A(3))*2^16), round(G*2^15)) */ /* const opus_int16 silk_resampler_up2_hq_notch[ 4 ] = { 9634, -7012, 7209, 30474 }; */ /* Tables with IIR and FIR coefficients for fractional downsamplers (123 Words) */ silk_DWORD_ALIGN const opus_int16 silk_Resampler_3_4_COEFS[ 2 + 3 * RESAMPLER_DOWN_ORDER_FIR0 / 2 ] = { -20694, -13867, -49, 64, 17, -157, 353, -496, 163, 11047, 22205, -39, 6, 91, -170, 186, 23, -896, 6336, 19928, -19, -36, 102, -89, -24, 328, -951, 2568, 15909, }; silk_DWORD_ALIGN const opus_int16 silk_Resampler_2_3_COEFS[ 2 + 2 * RESAMPLER_DOWN_ORDER_FIR0 / 2 ] = { -14457, -14019, 64, 128, -122, 36, 310, -768, 584, 9267, 17733, 12, 128, 18, -142, 288, -117, -865, 4123, 14459, }; silk_DWORD_ALIGN const opus_int16 silk_Resampler_1_2_COEFS[ 2 + RESAMPLER_DOWN_ORDER_FIR1 / 2 ] = { 616, -14323, -10, 39, 58, -46, -84, 120, 184, -315, -541, 1284, 5380, 9024, }; silk_DWORD_ALIGN const opus_int16 silk_Resampler_1_3_COEFS[ 2 + RESAMPLER_DOWN_ORDER_FIR2 / 2 ] = { 16102, -15162, -13, 0, 20, 26, 5, -31, -43, -4, 65, 90, 7, -157, -248, -44, 593, 1583, 2612, 3271, }; silk_DWORD_ALIGN const opus_int16 silk_Resampler_1_4_COEFS[ 2 + RESAMPLER_DOWN_ORDER_FIR2 / 2 ] = { 22500, -15099, 3, -14, -20, -15, 2, 25, 37, 25, -16, -71, -107, -79, 50, 292, 623, 982, 1288, 1464, }; silk_DWORD_ALIGN const opus_int16 silk_Resampler_1_6_COEFS[ 2 + RESAMPLER_DOWN_ORDER_FIR2 / 2 ] = { 27540, -15257, 17, 12, 8, 1, -10, -22, -30, -32, -22, 3, 44, 100, 168, 243, 317, 381, 429, 455, }; silk_DWORD_ALIGN const opus_int16 silk_Resampler_2_3_COEFS_LQ[ 2 + 2 * 2 ] = { -2797, -6507, 4697, 10739, 1567, 8276, }; /* Table with interplation fractions of 1/24, 3/24, 5/24, ... , 23/24 : 23/24 (46 Words) */ silk_DWORD_ALIGN const opus_int16 silk_resampler_frac_FIR_12[ 12 ][ RESAMPLER_ORDER_FIR_12 / 2 ] = { { 189, -600, 617, 30567 }, { 117, -159, -1070, 29704 }, { 52, 221, -2392, 28276 }, { -4, 529, -3350, 26341 }, { -48, 758, -3956, 23973 }, { -80, 905, -4235, 21254 }, { -99, 972, -4222, 18278 }, { -107, 967, -3957, 15143 }, { -103, 896, -3487, 11950 }, { -91, 773, -2865, 8798 }, { -71, 611, -2143, 5784 }, { -46, 425, -1375, 2996 }, }; mumble-1.3.4/3rdparty/opus-src/silk/typedef.h0000664000175000017500000000655014010707327020745 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef SILK_TYPEDEF_H #define SILK_TYPEDEF_H #include "opus_types.h" #include "opus_defines.h" #ifndef FIXED_POINT # include # define silk_float float # define silk_float_MAX FLT_MAX #endif #define silk_int64_MAX ((opus_int64)0x7FFFFFFFFFFFFFFFLL) /* 2^63 - 1 */ #define silk_int64_MIN ((opus_int64)0x8000000000000000LL) /* -2^63 */ #define silk_int32_MAX 0x7FFFFFFF /* 2^31 - 1 = 2147483647 */ #define silk_int32_MIN ((opus_int32)0x80000000) /* -2^31 = -2147483648 */ #define silk_int16_MAX 0x7FFF /* 2^15 - 1 = 32767 */ #define silk_int16_MIN ((opus_int16)0x8000) /* -2^15 = -32768 */ #define silk_int8_MAX 0x7F /* 2^7 - 1 = 127 */ #define silk_int8_MIN ((opus_int8)0x80) /* -2^7 = -128 */ #define silk_uint8_MAX 0xFF /* 2^8 - 1 = 255 */ #define silk_TRUE 1 #define silk_FALSE 0 /* assertions */ #if (defined _WIN32 && !defined _WINCE && !defined(__GNUC__) && !defined(NO_ASSERTS)) # ifndef silk_assert # include /* ASSERTE() */ # define silk_assert(COND) _ASSERTE(COND) # endif #else # ifdef ENABLE_ASSERTIONS # include # include #define silk_fatal(str) _silk_fatal(str, __FILE__, __LINE__); #ifdef __GNUC__ __attribute__((noreturn)) #endif static OPUS_INLINE void _silk_fatal(const char *str, const char *file, int line) { fprintf (stderr, "Fatal (internal) error in %s, line %d: %s\n", file, line, str); abort(); } # define silk_assert(COND) {if (!(COND)) {silk_fatal("assertion failed: " #COND);}} # else # define silk_assert(COND) # endif #endif #endif /* SILK_TYPEDEF_H */ mumble-1.3.4/3rdparty/opus-src/silk/main.h0000664000175000017500000007765014010707327020242 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef SILK_MAIN_H #define SILK_MAIN_H #include "SigProc_FIX.h" #include "define.h" #include "structs.h" #include "tables.h" #include "PLC.h" #include "control.h" #include "debug.h" #include "entenc.h" #include "entdec.h" #if defined(OPUS_X86_MAY_HAVE_SSE4_1) #include "x86/main_sse.h" #endif #if (defined(OPUS_ARM_ASM) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR)) #include "arm/NSQ_del_dec_arm.h" #endif /* Convert Left/Right stereo signal to adaptive Mid/Side representation */ void silk_stereo_LR_to_MS( stereo_enc_state *state, /* I/O State */ opus_int16 x1[], /* I/O Left input signal, becomes mid signal */ opus_int16 x2[], /* I/O Right input signal, becomes side signal */ opus_int8 ix[ 2 ][ 3 ], /* O Quantization indices */ opus_int8 *mid_only_flag, /* O Flag: only mid signal coded */ opus_int32 mid_side_rates_bps[], /* O Bitrates for mid and side signals */ opus_int32 total_rate_bps, /* I Total bitrate */ opus_int prev_speech_act_Q8, /* I Speech activity level in previous frame */ opus_int toMono, /* I Last frame before a stereo->mono transition */ opus_int fs_kHz, /* I Sample rate (kHz) */ opus_int frame_length /* I Number of samples */ ); /* Convert adaptive Mid/Side representation to Left/Right stereo signal */ void silk_stereo_MS_to_LR( stereo_dec_state *state, /* I/O State */ opus_int16 x1[], /* I/O Left input signal, becomes mid signal */ opus_int16 x2[], /* I/O Right input signal, becomes side signal */ const opus_int32 pred_Q13[], /* I Predictors */ opus_int fs_kHz, /* I Samples rate (kHz) */ opus_int frame_length /* I Number of samples */ ); /* Find least-squares prediction gain for one signal based on another and quantize it */ opus_int32 silk_stereo_find_predictor( /* O Returns predictor in Q13 */ opus_int32 *ratio_Q14, /* O Ratio of residual and mid energies */ const opus_int16 x[], /* I Basis signal */ const opus_int16 y[], /* I Target signal */ opus_int32 mid_res_amp_Q0[], /* I/O Smoothed mid, residual norms */ opus_int length, /* I Number of samples */ opus_int smooth_coef_Q16 /* I Smoothing coefficient */ ); /* Quantize mid/side predictors */ void silk_stereo_quant_pred( opus_int32 pred_Q13[], /* I/O Predictors (out: quantized) */ opus_int8 ix[ 2 ][ 3 ] /* O Quantization indices */ ); /* Entropy code the mid/side quantization indices */ void silk_stereo_encode_pred( ec_enc *psRangeEnc, /* I/O Compressor data structure */ opus_int8 ix[ 2 ][ 3 ] /* I Quantization indices */ ); /* Entropy code the mid-only flag */ void silk_stereo_encode_mid_only( ec_enc *psRangeEnc, /* I/O Compressor data structure */ opus_int8 mid_only_flag ); /* Decode mid/side predictors */ void silk_stereo_decode_pred( ec_dec *psRangeDec, /* I/O Compressor data structure */ opus_int32 pred_Q13[] /* O Predictors */ ); /* Decode mid-only flag */ void silk_stereo_decode_mid_only( ec_dec *psRangeDec, /* I/O Compressor data structure */ opus_int *decode_only_mid /* O Flag that only mid channel has been coded */ ); /* Encodes signs of excitation */ void silk_encode_signs( ec_enc *psRangeEnc, /* I/O Compressor data structure */ const opus_int8 pulses[], /* I pulse signal */ opus_int length, /* I length of input */ const opus_int signalType, /* I Signal type */ const opus_int quantOffsetType, /* I Quantization offset type */ const opus_int sum_pulses[ MAX_NB_SHELL_BLOCKS ] /* I Sum of absolute pulses per block */ ); /* Decodes signs of excitation */ void silk_decode_signs( ec_dec *psRangeDec, /* I/O Compressor data structure */ opus_int16 pulses[], /* I/O pulse signal */ opus_int length, /* I length of input */ const opus_int signalType, /* I Signal type */ const opus_int quantOffsetType, /* I Quantization offset type */ const opus_int sum_pulses[ MAX_NB_SHELL_BLOCKS ] /* I Sum of absolute pulses per block */ ); /* Check encoder control struct */ opus_int check_control_input( silk_EncControlStruct *encControl /* I Control structure */ ); /* Control internal sampling rate */ opus_int silk_control_audio_bandwidth( silk_encoder_state *psEncC, /* I/O Pointer to Silk encoder state */ silk_EncControlStruct *encControl /* I Control structure */ ); /* Control SNR of redidual quantizer */ opus_int silk_control_SNR( silk_encoder_state *psEncC, /* I/O Pointer to Silk encoder state */ opus_int32 TargetRate_bps /* I Target max bitrate (bps) */ ); /***************/ /* Shell coder */ /***************/ /* Encode quantization indices of excitation */ void silk_encode_pulses( ec_enc *psRangeEnc, /* I/O compressor data structure */ const opus_int signalType, /* I Signal type */ const opus_int quantOffsetType, /* I quantOffsetType */ opus_int8 pulses[], /* I quantization indices */ const opus_int frame_length /* I Frame length */ ); /* Shell encoder, operates on one shell code frame of 16 pulses */ void silk_shell_encoder( ec_enc *psRangeEnc, /* I/O compressor data structure */ const opus_int *pulses0 /* I data: nonnegative pulse amplitudes */ ); /* Shell decoder, operates on one shell code frame of 16 pulses */ void silk_shell_decoder( opus_int16 *pulses0, /* O data: nonnegative pulse amplitudes */ ec_dec *psRangeDec, /* I/O Compressor data structure */ const opus_int pulses4 /* I number of pulses per pulse-subframe */ ); /* Gain scalar quantization with hysteresis, uniform on log scale */ void silk_gains_quant( opus_int8 ind[ MAX_NB_SUBFR ], /* O gain indices */ opus_int32 gain_Q16[ MAX_NB_SUBFR ], /* I/O gains (quantized out) */ opus_int8 *prev_ind, /* I/O last index in previous frame */ const opus_int conditional, /* I first gain is delta coded if 1 */ const opus_int nb_subfr /* I number of subframes */ ); /* Gains scalar dequantization, uniform on log scale */ void silk_gains_dequant( opus_int32 gain_Q16[ MAX_NB_SUBFR ], /* O quantized gains */ const opus_int8 ind[ MAX_NB_SUBFR ], /* I gain indices */ opus_int8 *prev_ind, /* I/O last index in previous frame */ const opus_int conditional, /* I first gain is delta coded if 1 */ const opus_int nb_subfr /* I number of subframes */ ); /* Compute unique identifier of gain indices vector */ opus_int32 silk_gains_ID( /* O returns unique identifier of gains */ const opus_int8 ind[ MAX_NB_SUBFR ], /* I gain indices */ const opus_int nb_subfr /* I number of subframes */ ); /* Interpolate two vectors */ void silk_interpolate( opus_int16 xi[ MAX_LPC_ORDER ], /* O interpolated vector */ const opus_int16 x0[ MAX_LPC_ORDER ], /* I first vector */ const opus_int16 x1[ MAX_LPC_ORDER ], /* I second vector */ const opus_int ifact_Q2, /* I interp. factor, weight on 2nd vector */ const opus_int d /* I number of parameters */ ); /* LTP tap quantizer */ void silk_quant_LTP_gains( opus_int16 B_Q14[ MAX_NB_SUBFR * LTP_ORDER ], /* O Quantized LTP gains */ opus_int8 cbk_index[ MAX_NB_SUBFR ], /* O Codebook Index */ opus_int8 *periodicity_index, /* O Periodicity Index */ opus_int32 *sum_gain_dB_Q7, /* I/O Cumulative max prediction gain */ opus_int *pred_gain_dB_Q7, /* O LTP prediction gain */ const opus_int32 XX_Q17[ MAX_NB_SUBFR*LTP_ORDER*LTP_ORDER ], /* I Correlation matrix in Q18 */ const opus_int32 xX_Q17[ MAX_NB_SUBFR*LTP_ORDER ], /* I Correlation vector in Q18 */ const opus_int subfr_len, /* I Number of samples per subframe */ const opus_int nb_subfr, /* I Number of subframes */ int arch /* I Run-time architecture */ ); /* Entropy constrained matrix-weighted VQ, for a single input data vector */ void silk_VQ_WMat_EC_c( opus_int8 *ind, /* O index of best codebook vector */ opus_int32 *res_nrg_Q15, /* O best residual energy */ opus_int32 *rate_dist_Q8, /* O best total bitrate */ opus_int *gain_Q7, /* O sum of absolute LTP coefficients */ const opus_int32 *XX_Q17, /* I correlation matrix */ const opus_int32 *xX_Q17, /* I correlation vector */ const opus_int8 *cb_Q7, /* I codebook */ const opus_uint8 *cb_gain_Q7, /* I codebook effective gain */ const opus_uint8 *cl_Q5, /* I code length for each codebook vector */ const opus_int subfr_len, /* I number of samples per subframe */ const opus_int32 max_gain_Q7, /* I maximum sum of absolute LTP coefficients */ const opus_int L /* I number of vectors in codebook */ ); #if !defined(OVERRIDE_silk_VQ_WMat_EC) #define silk_VQ_WMat_EC(ind, res_nrg_Q15, rate_dist_Q8, gain_Q7, XX_Q17, xX_Q17, cb_Q7, cb_gain_Q7, cl_Q5, subfr_len, max_gain_Q7, L, arch) \ ((void)(arch),silk_VQ_WMat_EC_c(ind, res_nrg_Q15, rate_dist_Q8, gain_Q7, XX_Q17, xX_Q17, cb_Q7, cb_gain_Q7, cl_Q5, subfr_len, max_gain_Q7, L)) #endif /************************************/ /* Noise shaping quantization (NSQ) */ /************************************/ void silk_NSQ_c( const silk_encoder_state *psEncC, /* I Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ SideInfoIndices *psIndices, /* I/O Quantization Indices */ const opus_int16 x16[], /* I Input */ opus_int8 pulses[], /* O Quantized pulse signal */ const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */ const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */ const opus_int16 AR_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */ const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */ const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */ const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I Quantization step sizes */ const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */ const opus_int Lambda_Q10, /* I Rate/distortion tradeoff */ const opus_int LTP_scale_Q14 /* I LTP state scaling */ ); #if !defined(OVERRIDE_silk_NSQ) #define silk_NSQ(psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, LTPCoef_Q14, AR_Q13, \ HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14, arch) \ ((void)(arch),silk_NSQ_c(psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, LTPCoef_Q14, AR_Q13, \ HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14)) #endif /* Noise shaping using delayed decision */ void silk_NSQ_del_dec_c( const silk_encoder_state *psEncC, /* I Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ SideInfoIndices *psIndices, /* I/O Quantization Indices */ const opus_int16 x16[], /* I Input */ opus_int8 pulses[], /* O Quantized pulse signal */ const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */ const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */ const opus_int16 AR_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */ const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */ const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */ const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I Quantization step sizes */ const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */ const opus_int Lambda_Q10, /* I Rate/distortion tradeoff */ const opus_int LTP_scale_Q14 /* I LTP state scaling */ ); #if !defined(OVERRIDE_silk_NSQ_del_dec) #define silk_NSQ_del_dec(psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, LTPCoef_Q14, AR_Q13, \ HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14, arch) \ ((void)(arch),silk_NSQ_del_dec_c(psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, LTPCoef_Q14, AR_Q13, \ HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14)) #endif /************/ /* Silk VAD */ /************/ /* Initialize the Silk VAD */ opus_int silk_VAD_Init( /* O Return value, 0 if success */ silk_VAD_state *psSilk_VAD /* I/O Pointer to Silk VAD state */ ); /* Get speech activity level in Q8 */ opus_int silk_VAD_GetSA_Q8_c( /* O Return value, 0 if success */ silk_encoder_state *psEncC, /* I/O Encoder state */ const opus_int16 pIn[] /* I PCM input */ ); #if !defined(OVERRIDE_silk_VAD_GetSA_Q8) #define silk_VAD_GetSA_Q8(psEnC, pIn, arch) ((void)(arch),silk_VAD_GetSA_Q8_c(psEnC, pIn)) #endif /* Low-pass filter with variable cutoff frequency based on */ /* piece-wise linear interpolation between elliptic filters */ /* Start by setting transition_frame_no = 1; */ void silk_LP_variable_cutoff( silk_LP_state *psLP, /* I/O LP filter state */ opus_int16 *frame, /* I/O Low-pass filtered output signal */ const opus_int frame_length /* I Frame length */ ); /******************/ /* NLSF Quantizer */ /******************/ /* Limit, stabilize, convert and quantize NLSFs */ void silk_process_NLSFs( silk_encoder_state *psEncC, /* I/O Encoder state */ opus_int16 PredCoef_Q12[ 2 ][ MAX_LPC_ORDER ], /* O Prediction coefficients */ opus_int16 pNLSF_Q15[ MAX_LPC_ORDER ], /* I/O Normalized LSFs (quant out) (0 - (2^15-1)) */ const opus_int16 prev_NLSFq_Q15[ MAX_LPC_ORDER ] /* I Previous Normalized LSFs (0 - (2^15-1)) */ ); opus_int32 silk_NLSF_encode( /* O Returns RD value in Q25 */ opus_int8 *NLSFIndices, /* I Codebook path vector [ LPC_ORDER + 1 ] */ opus_int16 *pNLSF_Q15, /* I/O Quantized NLSF vector [ LPC_ORDER ] */ const silk_NLSF_CB_struct *psNLSF_CB, /* I Codebook object */ const opus_int16 *pW_QW, /* I NLSF weight vector [ LPC_ORDER ] */ const opus_int NLSF_mu_Q20, /* I Rate weight for the RD optimization */ const opus_int nSurvivors, /* I Max survivors after first stage */ const opus_int signalType /* I Signal type: 0/1/2 */ ); /* Compute quantization errors for an LPC_order element input vector for a VQ codebook */ void silk_NLSF_VQ( opus_int32 err_Q26[], /* O Quantization errors [K] */ const opus_int16 in_Q15[], /* I Input vectors to be quantized [LPC_order] */ const opus_uint8 pCB_Q8[], /* I Codebook vectors [K*LPC_order] */ const opus_int16 pWght_Q9[], /* I Codebook weights [K*LPC_order] */ const opus_int K, /* I Number of codebook vectors */ const opus_int LPC_order /* I Number of LPCs */ ); /* Delayed-decision quantizer for NLSF residuals */ opus_int32 silk_NLSF_del_dec_quant( /* O Returns RD value in Q25 */ opus_int8 indices[], /* O Quantization indices [ order ] */ const opus_int16 x_Q10[], /* I Input [ order ] */ const opus_int16 w_Q5[], /* I Weights [ order ] */ const opus_uint8 pred_coef_Q8[], /* I Backward predictor coefs [ order ] */ const opus_int16 ec_ix[], /* I Indices to entropy coding tables [ order ] */ const opus_uint8 ec_rates_Q5[], /* I Rates [] */ const opus_int quant_step_size_Q16, /* I Quantization step size */ const opus_int16 inv_quant_step_size_Q6, /* I Inverse quantization step size */ const opus_int32 mu_Q20, /* I R/D tradeoff */ const opus_int16 order /* I Number of input values */ ); /* Unpack predictor values and indices for entropy coding tables */ void silk_NLSF_unpack( opus_int16 ec_ix[], /* O Indices to entropy tables [ LPC_ORDER ] */ opus_uint8 pred_Q8[], /* O LSF predictor [ LPC_ORDER ] */ const silk_NLSF_CB_struct *psNLSF_CB, /* I Codebook object */ const opus_int CB1_index /* I Index of vector in first LSF codebook */ ); /***********************/ /* NLSF vector decoder */ /***********************/ void silk_NLSF_decode( opus_int16 *pNLSF_Q15, /* O Quantized NLSF vector [ LPC_ORDER ] */ opus_int8 *NLSFIndices, /* I Codebook path vector [ LPC_ORDER + 1 ] */ const silk_NLSF_CB_struct *psNLSF_CB /* I Codebook object */ ); /****************************************************/ /* Decoder Functions */ /****************************************************/ opus_int silk_init_decoder( silk_decoder_state *psDec /* I/O Decoder state pointer */ ); /* Set decoder sampling rate */ opus_int silk_decoder_set_fs( silk_decoder_state *psDec, /* I/O Decoder state pointer */ opus_int fs_kHz, /* I Sampling frequency (kHz) */ opus_int32 fs_API_Hz /* I API Sampling frequency (Hz) */ ); /****************/ /* Decode frame */ /****************/ opus_int silk_decode_frame( silk_decoder_state *psDec, /* I/O Pointer to Silk decoder state */ ec_dec *psRangeDec, /* I/O Compressor data structure */ opus_int16 pOut[], /* O Pointer to output speech frame */ opus_int32 *pN, /* O Pointer to size of output frame */ opus_int lostFlag, /* I 0: no loss, 1 loss, 2 decode fec */ opus_int condCoding, /* I The type of conditional coding to use */ int arch /* I Run-time architecture */ ); /* Decode indices from bitstream */ void silk_decode_indices( silk_decoder_state *psDec, /* I/O State */ ec_dec *psRangeDec, /* I/O Compressor data structure */ opus_int FrameIndex, /* I Frame number */ opus_int decode_LBRR, /* I Flag indicating LBRR data is being decoded */ opus_int condCoding /* I The type of conditional coding to use */ ); /* Decode parameters from payload */ void silk_decode_parameters( silk_decoder_state *psDec, /* I/O State */ silk_decoder_control *psDecCtrl, /* I/O Decoder control */ opus_int condCoding /* I The type of conditional coding to use */ ); /* Core decoder. Performs inverse NSQ operation LTP + LPC */ void silk_decode_core( silk_decoder_state *psDec, /* I/O Decoder state */ silk_decoder_control *psDecCtrl, /* I Decoder control */ opus_int16 xq[], /* O Decoded speech */ const opus_int16 pulses[ MAX_FRAME_LENGTH ], /* I Pulse signal */ int arch /* I Run-time architecture */ ); /* Decode quantization indices of excitation (Shell coding) */ void silk_decode_pulses( ec_dec *psRangeDec, /* I/O Compressor data structure */ opus_int16 pulses[], /* O Excitation signal */ const opus_int signalType, /* I Sigtype */ const opus_int quantOffsetType, /* I quantOffsetType */ const opus_int frame_length /* I Frame length */ ); /******************/ /* CNG */ /******************/ /* Reset CNG */ void silk_CNG_Reset( silk_decoder_state *psDec /* I/O Decoder state */ ); /* Updates CNG estimate, and applies the CNG when packet was lost */ void silk_CNG( silk_decoder_state *psDec, /* I/O Decoder state */ silk_decoder_control *psDecCtrl, /* I/O Decoder control */ opus_int16 frame[], /* I/O Signal */ opus_int length /* I Length of residual */ ); /* Encoding of various parameters */ void silk_encode_indices( silk_encoder_state *psEncC, /* I/O Encoder state */ ec_enc *psRangeEnc, /* I/O Compressor data structure */ opus_int FrameIndex, /* I Frame number */ opus_int encode_LBRR, /* I Flag indicating LBRR data is being encoded */ opus_int condCoding /* I The type of conditional coding to use */ ); #endif mumble-1.3.4/3rdparty/opus-src/silk/encode_pulses.c0000664000175000017500000002120714010707327022124 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main.h" #include "stack_alloc.h" /*********************************************/ /* Encode quantization indices of excitation */ /*********************************************/ static OPUS_INLINE opus_int combine_and_check( /* return ok */ opus_int *pulses_comb, /* O */ const opus_int *pulses_in, /* I */ opus_int max_pulses, /* I max value for sum of pulses */ opus_int len /* I number of output values */ ) { opus_int k, sum; for( k = 0; k < len; k++ ) { sum = pulses_in[ 2 * k ] + pulses_in[ 2 * k + 1 ]; if( sum > max_pulses ) { return 1; } pulses_comb[ k ] = sum; } return 0; } /* Encode quantization indices of excitation */ void silk_encode_pulses( ec_enc *psRangeEnc, /* I/O compressor data structure */ const opus_int signalType, /* I Signal type */ const opus_int quantOffsetType, /* I quantOffsetType */ opus_int8 pulses[], /* I quantization indices */ const opus_int frame_length /* I Frame length */ ) { opus_int i, k, j, iter, bit, nLS, scale_down, RateLevelIndex = 0; opus_int32 abs_q, minSumBits_Q5, sumBits_Q5; VARDECL( opus_int, abs_pulses ); VARDECL( opus_int, sum_pulses ); VARDECL( opus_int, nRshifts ); opus_int pulses_comb[ 8 ]; opus_int *abs_pulses_ptr; const opus_int8 *pulses_ptr; const opus_uint8 *cdf_ptr; const opus_uint8 *nBits_ptr; SAVE_STACK; silk_memset( pulses_comb, 0, 8 * sizeof( opus_int ) ); /* Fixing Valgrind reported problem*/ /****************************/ /* Prepare for shell coding */ /****************************/ /* Calculate number of shell blocks */ silk_assert( 1 << LOG2_SHELL_CODEC_FRAME_LENGTH == SHELL_CODEC_FRAME_LENGTH ); iter = silk_RSHIFT( frame_length, LOG2_SHELL_CODEC_FRAME_LENGTH ); if( iter * SHELL_CODEC_FRAME_LENGTH < frame_length ) { silk_assert( frame_length == 12 * 10 ); /* Make sure only happens for 10 ms @ 12 kHz */ iter++; silk_memset( &pulses[ frame_length ], 0, SHELL_CODEC_FRAME_LENGTH * sizeof(opus_int8)); } /* Take the absolute value of the pulses */ ALLOC( abs_pulses, iter * SHELL_CODEC_FRAME_LENGTH, opus_int ); silk_assert( !( SHELL_CODEC_FRAME_LENGTH & 3 ) ); for( i = 0; i < iter * SHELL_CODEC_FRAME_LENGTH; i+=4 ) { abs_pulses[i+0] = ( opus_int )silk_abs( pulses[ i + 0 ] ); abs_pulses[i+1] = ( opus_int )silk_abs( pulses[ i + 1 ] ); abs_pulses[i+2] = ( opus_int )silk_abs( pulses[ i + 2 ] ); abs_pulses[i+3] = ( opus_int )silk_abs( pulses[ i + 3 ] ); } /* Calc sum pulses per shell code frame */ ALLOC( sum_pulses, iter, opus_int ); ALLOC( nRshifts, iter, opus_int ); abs_pulses_ptr = abs_pulses; for( i = 0; i < iter; i++ ) { nRshifts[ i ] = 0; while( 1 ) { /* 1+1 -> 2 */ scale_down = combine_and_check( pulses_comb, abs_pulses_ptr, silk_max_pulses_table[ 0 ], 8 ); /* 2+2 -> 4 */ scale_down += combine_and_check( pulses_comb, pulses_comb, silk_max_pulses_table[ 1 ], 4 ); /* 4+4 -> 8 */ scale_down += combine_and_check( pulses_comb, pulses_comb, silk_max_pulses_table[ 2 ], 2 ); /* 8+8 -> 16 */ scale_down += combine_and_check( &sum_pulses[ i ], pulses_comb, silk_max_pulses_table[ 3 ], 1 ); if( scale_down ) { /* We need to downscale the quantization signal */ nRshifts[ i ]++; for( k = 0; k < SHELL_CODEC_FRAME_LENGTH; k++ ) { abs_pulses_ptr[ k ] = silk_RSHIFT( abs_pulses_ptr[ k ], 1 ); } } else { /* Jump out of while(1) loop and go to next shell coding frame */ break; } } abs_pulses_ptr += SHELL_CODEC_FRAME_LENGTH; } /**************/ /* Rate level */ /**************/ /* find rate level that leads to fewest bits for coding of pulses per block info */ minSumBits_Q5 = silk_int32_MAX; for( k = 0; k < N_RATE_LEVELS - 1; k++ ) { nBits_ptr = silk_pulses_per_block_BITS_Q5[ k ]; sumBits_Q5 = silk_rate_levels_BITS_Q5[ signalType >> 1 ][ k ]; for( i = 0; i < iter; i++ ) { if( nRshifts[ i ] > 0 ) { sumBits_Q5 += nBits_ptr[ SILK_MAX_PULSES + 1 ]; } else { sumBits_Q5 += nBits_ptr[ sum_pulses[ i ] ]; } } if( sumBits_Q5 < minSumBits_Q5 ) { minSumBits_Q5 = sumBits_Q5; RateLevelIndex = k; } } ec_enc_icdf( psRangeEnc, RateLevelIndex, silk_rate_levels_iCDF[ signalType >> 1 ], 8 ); /***************************************************/ /* Sum-Weighted-Pulses Encoding */ /***************************************************/ cdf_ptr = silk_pulses_per_block_iCDF[ RateLevelIndex ]; for( i = 0; i < iter; i++ ) { if( nRshifts[ i ] == 0 ) { ec_enc_icdf( psRangeEnc, sum_pulses[ i ], cdf_ptr, 8 ); } else { ec_enc_icdf( psRangeEnc, SILK_MAX_PULSES + 1, cdf_ptr, 8 ); for( k = 0; k < nRshifts[ i ] - 1; k++ ) { ec_enc_icdf( psRangeEnc, SILK_MAX_PULSES + 1, silk_pulses_per_block_iCDF[ N_RATE_LEVELS - 1 ], 8 ); } ec_enc_icdf( psRangeEnc, sum_pulses[ i ], silk_pulses_per_block_iCDF[ N_RATE_LEVELS - 1 ], 8 ); } } /******************/ /* Shell Encoding */ /******************/ for( i = 0; i < iter; i++ ) { if( sum_pulses[ i ] > 0 ) { silk_shell_encoder( psRangeEnc, &abs_pulses[ i * SHELL_CODEC_FRAME_LENGTH ] ); } } /****************/ /* LSB Encoding */ /****************/ for( i = 0; i < iter; i++ ) { if( nRshifts[ i ] > 0 ) { pulses_ptr = &pulses[ i * SHELL_CODEC_FRAME_LENGTH ]; nLS = nRshifts[ i ] - 1; for( k = 0; k < SHELL_CODEC_FRAME_LENGTH; k++ ) { abs_q = (opus_int8)silk_abs( pulses_ptr[ k ] ); for( j = nLS; j > 0; j-- ) { bit = silk_RSHIFT( abs_q, j ) & 1; ec_enc_icdf( psRangeEnc, bit, silk_lsb_iCDF, 8 ); } bit = abs_q & 1; ec_enc_icdf( psRangeEnc, bit, silk_lsb_iCDF, 8 ); } } } /****************/ /* Encode signs */ /****************/ silk_encode_signs( psRangeEnc, pulses, frame_length, signalType, quantOffsetType, sum_pulses ); RESTORE_STACK; } mumble-1.3.4/3rdparty/opus-src/silk/resampler_private_AR2.c0000664000175000017500000000515114010707327023464 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "SigProc_FIX.h" #include "resampler_private.h" /* Second order AR filter with single delay elements */ void silk_resampler_private_AR2( opus_int32 S[], /* I/O State vector [ 2 ] */ opus_int32 out_Q8[], /* O Output signal */ const opus_int16 in[], /* I Input signal */ const opus_int16 A_Q14[], /* I AR coefficients, Q14 */ opus_int32 len /* I Signal length */ ) { opus_int32 k; opus_int32 out32; for( k = 0; k < len; k++ ) { out32 = silk_ADD_LSHIFT32( S[ 0 ], (opus_int32)in[ k ], 8 ); out_Q8[ k ] = out32; out32 = silk_LSHIFT( out32, 2 ); S[ 0 ] = silk_SMLAWB( S[ 1 ], out32, A_Q14[ 0 ] ); S[ 1 ] = silk_SMULWB( out32, A_Q14[ 1 ] ); } } mumble-1.3.4/3rdparty/opus-src/silk/quant_LTP_gains.c0000664000175000017500000001626214010707327022331 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main.h" #include "tuning_parameters.h" void silk_quant_LTP_gains( opus_int16 B_Q14[ MAX_NB_SUBFR * LTP_ORDER ], /* O Quantized LTP gains */ opus_int8 cbk_index[ MAX_NB_SUBFR ], /* O Codebook Index */ opus_int8 *periodicity_index, /* O Periodicity Index */ opus_int32 *sum_log_gain_Q7, /* I/O Cumulative max prediction gain */ opus_int *pred_gain_dB_Q7, /* O LTP prediction gain */ const opus_int32 XX_Q17[ MAX_NB_SUBFR*LTP_ORDER*LTP_ORDER ], /* I Correlation matrix in Q18 */ const opus_int32 xX_Q17[ MAX_NB_SUBFR*LTP_ORDER ], /* I Correlation vector in Q18 */ const opus_int subfr_len, /* I Number of samples per subframe */ const opus_int nb_subfr, /* I Number of subframes */ int arch /* I Run-time architecture */ ) { opus_int j, k, cbk_size; opus_int8 temp_idx[ MAX_NB_SUBFR ]; const opus_uint8 *cl_ptr_Q5; const opus_int8 *cbk_ptr_Q7; const opus_uint8 *cbk_gain_ptr_Q7; const opus_int32 *XX_Q17_ptr, *xX_Q17_ptr; opus_int32 res_nrg_Q15_subfr, res_nrg_Q15, rate_dist_Q7_subfr, rate_dist_Q7, min_rate_dist_Q7; opus_int32 sum_log_gain_tmp_Q7, best_sum_log_gain_Q7, max_gain_Q7; opus_int gain_Q7; /***************************************************/ /* iterate over different codebooks with different */ /* rates/distortions, and choose best */ /***************************************************/ min_rate_dist_Q7 = silk_int32_MAX; best_sum_log_gain_Q7 = 0; for( k = 0; k < 3; k++ ) { /* Safety margin for pitch gain control, to take into account factors such as state rescaling/rewhitening. */ opus_int32 gain_safety = SILK_FIX_CONST( 0.4, 7 ); cl_ptr_Q5 = silk_LTP_gain_BITS_Q5_ptrs[ k ]; cbk_ptr_Q7 = silk_LTP_vq_ptrs_Q7[ k ]; cbk_gain_ptr_Q7 = silk_LTP_vq_gain_ptrs_Q7[ k ]; cbk_size = silk_LTP_vq_sizes[ k ]; /* Set up pointers to first subframe */ XX_Q17_ptr = XX_Q17; xX_Q17_ptr = xX_Q17; res_nrg_Q15 = 0; rate_dist_Q7 = 0; sum_log_gain_tmp_Q7 = *sum_log_gain_Q7; for( j = 0; j < nb_subfr; j++ ) { max_gain_Q7 = silk_log2lin( ( SILK_FIX_CONST( MAX_SUM_LOG_GAIN_DB / 6.0, 7 ) - sum_log_gain_tmp_Q7 ) + SILK_FIX_CONST( 7, 7 ) ) - gain_safety; silk_VQ_WMat_EC( &temp_idx[ j ], /* O index of best codebook vector */ &res_nrg_Q15_subfr, /* O residual energy */ &rate_dist_Q7_subfr, /* O best weighted quantization error + mu * rate */ &gain_Q7, /* O sum of absolute LTP coefficients */ XX_Q17_ptr, /* I correlation matrix */ xX_Q17_ptr, /* I correlation vector */ cbk_ptr_Q7, /* I codebook */ cbk_gain_ptr_Q7, /* I codebook effective gains */ cl_ptr_Q5, /* I code length for each codebook vector */ subfr_len, /* I number of samples per subframe */ max_gain_Q7, /* I maximum sum of absolute LTP coefficients */ cbk_size, /* I number of vectors in codebook */ arch /* I Run-time architecture */ ); res_nrg_Q15 = silk_ADD_POS_SAT32( res_nrg_Q15, res_nrg_Q15_subfr ); rate_dist_Q7 = silk_ADD_POS_SAT32( rate_dist_Q7, rate_dist_Q7_subfr ); sum_log_gain_tmp_Q7 = silk_max(0, sum_log_gain_tmp_Q7 + silk_lin2log( gain_safety + gain_Q7 ) - SILK_FIX_CONST( 7, 7 )); XX_Q17_ptr += LTP_ORDER * LTP_ORDER; xX_Q17_ptr += LTP_ORDER; } if( rate_dist_Q7 <= min_rate_dist_Q7 ) { min_rate_dist_Q7 = rate_dist_Q7; *periodicity_index = (opus_int8)k; silk_memcpy( cbk_index, temp_idx, nb_subfr * sizeof( opus_int8 ) ); best_sum_log_gain_Q7 = sum_log_gain_tmp_Q7; } } cbk_ptr_Q7 = silk_LTP_vq_ptrs_Q7[ *periodicity_index ]; for( j = 0; j < nb_subfr; j++ ) { for( k = 0; k < LTP_ORDER; k++ ) { B_Q14[ j * LTP_ORDER + k ] = silk_LSHIFT( cbk_ptr_Q7[ cbk_index[ j ] * LTP_ORDER + k ], 7 ); } } if( nb_subfr == 2 ) { res_nrg_Q15 = silk_RSHIFT32( res_nrg_Q15, 1 ); } else { res_nrg_Q15 = silk_RSHIFT32( res_nrg_Q15, 2 ); } *sum_log_gain_Q7 = best_sum_log_gain_Q7; *pred_gain_dB_Q7 = (opus_int)silk_SMULBB( -3, silk_lin2log( res_nrg_Q15 ) - ( 15 << 7 ) ); } mumble-1.3.4/3rdparty/opus-src/silk/NLSF_VQ.c0000664000175000017500000000760714010707327020454 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main.h" /* Compute quantization errors for an LPC_order element input vector for a VQ codebook */ void silk_NLSF_VQ( opus_int32 err_Q24[], /* O Quantization errors [K] */ const opus_int16 in_Q15[], /* I Input vectors to be quantized [LPC_order] */ const opus_uint8 pCB_Q8[], /* I Codebook vectors [K*LPC_order] */ const opus_int16 pWght_Q9[], /* I Codebook weights [K*LPC_order] */ const opus_int K, /* I Number of codebook vectors */ const opus_int LPC_order /* I Number of LPCs */ ) { opus_int i, m; opus_int32 diff_Q15, diffw_Q24, sum_error_Q24, pred_Q24; const opus_int16 *w_Q9_ptr; const opus_uint8 *cb_Q8_ptr; silk_assert( ( LPC_order & 1 ) == 0 ); /* Loop over codebook */ cb_Q8_ptr = pCB_Q8; w_Q9_ptr = pWght_Q9; for( i = 0; i < K; i++ ) { sum_error_Q24 = 0; pred_Q24 = 0; for( m = LPC_order-2; m >= 0; m -= 2 ) { /* Compute weighted absolute predictive quantization error for index m + 1 */ diff_Q15 = silk_SUB_LSHIFT32( in_Q15[ m + 1 ], (opus_int32)cb_Q8_ptr[ m + 1 ], 7 ); /* range: [ -32767 : 32767 ]*/ diffw_Q24 = silk_SMULBB( diff_Q15, w_Q9_ptr[ m + 1 ] ); sum_error_Q24 = silk_ADD32( sum_error_Q24, silk_abs( silk_SUB_RSHIFT32( diffw_Q24, pred_Q24, 1 ) ) ); pred_Q24 = diffw_Q24; /* Compute weighted absolute predictive quantization error for index m */ diff_Q15 = silk_SUB_LSHIFT32( in_Q15[ m ], (opus_int32)cb_Q8_ptr[ m ], 7 ); /* range: [ -32767 : 32767 ]*/ diffw_Q24 = silk_SMULBB( diff_Q15, w_Q9_ptr[ m ] ); sum_error_Q24 = silk_ADD32( sum_error_Q24, silk_abs( silk_SUB_RSHIFT32( diffw_Q24, pred_Q24, 1 ) ) ); pred_Q24 = diffw_Q24; silk_assert( sum_error_Q24 >= 0 ); } err_Q24[ i ] = sum_error_Q24; cb_Q8_ptr += LPC_order; w_Q9_ptr += LPC_order; } } mumble-1.3.4/3rdparty/opus-src/silk/Inlines.h0000664000175000017500000001622214010707327020703 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ /*! \file silk_Inlines.h * \brief silk_Inlines.h defines OPUS_INLINE signal processing functions. */ #ifndef SILK_FIX_INLINES_H #define SILK_FIX_INLINES_H #ifdef __cplusplus extern "C" { #endif /* count leading zeros of opus_int64 */ static OPUS_INLINE opus_int32 silk_CLZ64( opus_int64 in ) { opus_int32 in_upper; in_upper = (opus_int32)silk_RSHIFT64(in, 32); if (in_upper == 0) { /* Search in the lower 32 bits */ return 32 + silk_CLZ32( (opus_int32) in ); } else { /* Search in the upper 32 bits */ return silk_CLZ32( in_upper ); } } /* get number of leading zeros and fractional part (the bits right after the leading one */ static OPUS_INLINE void silk_CLZ_FRAC( opus_int32 in, /* I input */ opus_int32 *lz, /* O number of leading zeros */ opus_int32 *frac_Q7 /* O the 7 bits right after the leading one */ ) { opus_int32 lzeros = silk_CLZ32(in); * lz = lzeros; * frac_Q7 = silk_ROR32(in, 24 - lzeros) & 0x7f; } /* Approximation of square root */ /* Accuracy: < +/- 10% for output values > 15 */ /* < +/- 2.5% for output values > 120 */ static OPUS_INLINE opus_int32 silk_SQRT_APPROX( opus_int32 x ) { opus_int32 y, lz, frac_Q7; if( x <= 0 ) { return 0; } silk_CLZ_FRAC(x, &lz, &frac_Q7); if( lz & 1 ) { y = 32768; } else { y = 46214; /* 46214 = sqrt(2) * 32768 */ } /* get scaling right */ y >>= silk_RSHIFT(lz, 1); /* increment using fractional part of input */ y = silk_SMLAWB(y, y, silk_SMULBB(213, frac_Q7)); return y; } /* Divide two int32 values and return result as int32 in a given Q-domain */ static OPUS_INLINE opus_int32 silk_DIV32_varQ( /* O returns a good approximation of "(a32 << Qres) / b32" */ const opus_int32 a32, /* I numerator (Q0) */ const opus_int32 b32, /* I denominator (Q0) */ const opus_int Qres /* I Q-domain of result (>= 0) */ ) { opus_int a_headrm, b_headrm, lshift; opus_int32 b32_inv, a32_nrm, b32_nrm, result; silk_assert( b32 != 0 ); silk_assert( Qres >= 0 ); /* Compute number of bits head room and normalize inputs */ a_headrm = silk_CLZ32( silk_abs(a32) ) - 1; a32_nrm = silk_LSHIFT(a32, a_headrm); /* Q: a_headrm */ b_headrm = silk_CLZ32( silk_abs(b32) ) - 1; b32_nrm = silk_LSHIFT(b32, b_headrm); /* Q: b_headrm */ /* Inverse of b32, with 14 bits of precision */ b32_inv = silk_DIV32_16( silk_int32_MAX >> 2, silk_RSHIFT(b32_nrm, 16) ); /* Q: 29 + 16 - b_headrm */ /* First approximation */ result = silk_SMULWB(a32_nrm, b32_inv); /* Q: 29 + a_headrm - b_headrm */ /* Compute residual by subtracting product of denominator and first approximation */ /* It's OK to overflow because the final value of a32_nrm should always be small */ a32_nrm = silk_SUB32_ovflw(a32_nrm, silk_LSHIFT_ovflw( silk_SMMUL(b32_nrm, result), 3 )); /* Q: a_headrm */ /* Refinement */ result = silk_SMLAWB(result, a32_nrm, b32_inv); /* Q: 29 + a_headrm - b_headrm */ /* Convert to Qres domain */ lshift = 29 + a_headrm - b_headrm - Qres; if( lshift < 0 ) { return silk_LSHIFT_SAT32(result, -lshift); } else { if( lshift < 32){ return silk_RSHIFT(result, lshift); } else { /* Avoid undefined result */ return 0; } } } /* Invert int32 value and return result as int32 in a given Q-domain */ static OPUS_INLINE opus_int32 silk_INVERSE32_varQ( /* O returns a good approximation of "(1 << Qres) / b32" */ const opus_int32 b32, /* I denominator (Q0) */ const opus_int Qres /* I Q-domain of result (> 0) */ ) { opus_int b_headrm, lshift; opus_int32 b32_inv, b32_nrm, err_Q32, result; silk_assert( b32 != 0 ); silk_assert( Qres > 0 ); /* Compute number of bits head room and normalize input */ b_headrm = silk_CLZ32( silk_abs(b32) ) - 1; b32_nrm = silk_LSHIFT(b32, b_headrm); /* Q: b_headrm */ /* Inverse of b32, with 14 bits of precision */ b32_inv = silk_DIV32_16( silk_int32_MAX >> 2, silk_RSHIFT(b32_nrm, 16) ); /* Q: 29 + 16 - b_headrm */ /* First approximation */ result = silk_LSHIFT(b32_inv, 16); /* Q: 61 - b_headrm */ /* Compute residual by subtracting product of denominator and first approximation from one */ err_Q32 = silk_LSHIFT( ((opus_int32)1<<29) - silk_SMULWB(b32_nrm, b32_inv), 3 ); /* Q32 */ /* Refinement */ result = silk_SMLAWW(result, err_Q32, b32_inv); /* Q: 61 - b_headrm */ /* Convert to Qres domain */ lshift = 61 - b_headrm - Qres; if( lshift <= 0 ) { return silk_LSHIFT_SAT32(result, -lshift); } else { if( lshift < 32){ return silk_RSHIFT(result, lshift); }else{ /* Avoid undefined result */ return 0; } } } #ifdef __cplusplus } #endif #endif /* SILK_FIX_INLINES_H */ mumble-1.3.4/3rdparty/opus-src/silk/decode_pitch.c0000664000175000017500000000720514010707327021710 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif /*********************************************************** * Pitch analyser function ********************************************************** */ #include "SigProc_FIX.h" #include "pitch_est_defines.h" void silk_decode_pitch( opus_int16 lagIndex, /* I */ opus_int8 contourIndex, /* O */ opus_int pitch_lags[], /* O 4 pitch values */ const opus_int Fs_kHz, /* I sampling frequency (kHz) */ const opus_int nb_subfr /* I number of sub frames */ ) { opus_int lag, k, min_lag, max_lag, cbk_size; const opus_int8 *Lag_CB_ptr; if( Fs_kHz == 8 ) { if( nb_subfr == PE_MAX_NB_SUBFR ) { Lag_CB_ptr = &silk_CB_lags_stage2[ 0 ][ 0 ]; cbk_size = PE_NB_CBKS_STAGE2_EXT; } else { silk_assert( nb_subfr == PE_MAX_NB_SUBFR >> 1 ); Lag_CB_ptr = &silk_CB_lags_stage2_10_ms[ 0 ][ 0 ]; cbk_size = PE_NB_CBKS_STAGE2_10MS; } } else { if( nb_subfr == PE_MAX_NB_SUBFR ) { Lag_CB_ptr = &silk_CB_lags_stage3[ 0 ][ 0 ]; cbk_size = PE_NB_CBKS_STAGE3_MAX; } else { silk_assert( nb_subfr == PE_MAX_NB_SUBFR >> 1 ); Lag_CB_ptr = &silk_CB_lags_stage3_10_ms[ 0 ][ 0 ]; cbk_size = PE_NB_CBKS_STAGE3_10MS; } } min_lag = silk_SMULBB( PE_MIN_LAG_MS, Fs_kHz ); max_lag = silk_SMULBB( PE_MAX_LAG_MS, Fs_kHz ); lag = min_lag + lagIndex; for( k = 0; k < nb_subfr; k++ ) { pitch_lags[ k ] = lag + matrix_ptr( Lag_CB_ptr, k, contourIndex, cbk_size ); pitch_lags[ k ] = silk_LIMIT( pitch_lags[ k ], min_lag, max_lag ); } } mumble-1.3.4/3rdparty/opus-src/silk/SigProc_FIX.h0000664000175000017500000011451114010707327021356 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef SILK_SIGPROC_FIX_H #define SILK_SIGPROC_FIX_H #ifdef __cplusplus extern "C" { #endif /*#define silk_MACRO_COUNT */ /* Used to enable WMOPS counting */ #define SILK_MAX_ORDER_LPC 24 /* max order of the LPC analysis in schur() and k2a() */ #include /* for memset(), memcpy(), memmove() */ #include "typedef.h" #include "resampler_structs.h" #include "macros.h" #include "cpu_support.h" #if defined(OPUS_X86_MAY_HAVE_SSE4_1) #include "x86/SigProc_FIX_sse.h" #endif #if (defined(OPUS_ARM_ASM) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR)) #include "arm/biquad_alt_arm.h" #include "arm/LPC_inv_pred_gain_arm.h" #endif /********************************************************************/ /* SIGNAL PROCESSING FUNCTIONS */ /********************************************************************/ /*! * Initialize/reset the resampler state for a given pair of input/output sampling rates */ opus_int silk_resampler_init( silk_resampler_state_struct *S, /* I/O Resampler state */ opus_int32 Fs_Hz_in, /* I Input sampling rate (Hz) */ opus_int32 Fs_Hz_out, /* I Output sampling rate (Hz) */ opus_int forEnc /* I If 1: encoder; if 0: decoder */ ); /*! * Resampler: convert from one sampling rate to another */ opus_int silk_resampler( silk_resampler_state_struct *S, /* I/O Resampler state */ opus_int16 out[], /* O Output signal */ const opus_int16 in[], /* I Input signal */ opus_int32 inLen /* I Number of input samples */ ); /*! * Downsample 2x, mediocre quality */ void silk_resampler_down2( opus_int32 *S, /* I/O State vector [ 2 ] */ opus_int16 *out, /* O Output signal [ len ] */ const opus_int16 *in, /* I Input signal [ floor(len/2) ] */ opus_int32 inLen /* I Number of input samples */ ); /*! * Downsample by a factor 2/3, low quality */ void silk_resampler_down2_3( opus_int32 *S, /* I/O State vector [ 6 ] */ opus_int16 *out, /* O Output signal [ floor(2*inLen/3) ] */ const opus_int16 *in, /* I Input signal [ inLen ] */ opus_int32 inLen /* I Number of input samples */ ); /*! * second order ARMA filter; * slower than biquad() but uses more precise coefficients * can handle (slowly) varying coefficients */ void silk_biquad_alt_stride1( const opus_int16 *in, /* I input signal */ const opus_int32 *B_Q28, /* I MA coefficients [3] */ const opus_int32 *A_Q28, /* I AR coefficients [2] */ opus_int32 *S, /* I/O State vector [2] */ opus_int16 *out, /* O output signal */ const opus_int32 len /* I signal length (must be even) */ ); void silk_biquad_alt_stride2_c( const opus_int16 *in, /* I input signal */ const opus_int32 *B_Q28, /* I MA coefficients [3] */ const opus_int32 *A_Q28, /* I AR coefficients [2] */ opus_int32 *S, /* I/O State vector [4] */ opus_int16 *out, /* O output signal */ const opus_int32 len /* I signal length (must be even) */ ); /* Variable order MA prediction error filter. */ void silk_LPC_analysis_filter( opus_int16 *out, /* O Output signal */ const opus_int16 *in, /* I Input signal */ const opus_int16 *B, /* I MA prediction coefficients, Q12 [order] */ const opus_int32 len, /* I Signal length */ const opus_int32 d, /* I Filter order */ int arch /* I Run-time architecture */ ); /* Chirp (bandwidth expand) LP AR filter */ void silk_bwexpander( opus_int16 *ar, /* I/O AR filter to be expanded (without leading 1) */ const opus_int d, /* I Length of ar */ opus_int32 chirp_Q16 /* I Chirp factor (typically in the range 0 to 1) */ ); /* Chirp (bandwidth expand) LP AR filter */ void silk_bwexpander_32( opus_int32 *ar, /* I/O AR filter to be expanded (without leading 1) */ const opus_int d, /* I Length of ar */ opus_int32 chirp_Q16 /* I Chirp factor in Q16 */ ); /* Compute inverse of LPC prediction gain, and */ /* test if LPC coefficients are stable (all poles within unit circle) */ opus_int32 silk_LPC_inverse_pred_gain_c( /* O Returns inverse prediction gain in energy domain, Q30 */ const opus_int16 *A_Q12, /* I Prediction coefficients, Q12 [order] */ const opus_int order /* I Prediction order */ ); /* Split signal in two decimated bands using first-order allpass filters */ void silk_ana_filt_bank_1( const opus_int16 *in, /* I Input signal [N] */ opus_int32 *S, /* I/O State vector [2] */ opus_int16 *outL, /* O Low band [N/2] */ opus_int16 *outH, /* O High band [N/2] */ const opus_int32 N /* I Number of input samples */ ); #if !defined(OVERRIDE_silk_biquad_alt_stride2) #define silk_biquad_alt_stride2(in, B_Q28, A_Q28, S, out, len, arch) ((void)(arch), silk_biquad_alt_stride2_c(in, B_Q28, A_Q28, S, out, len)) #endif #if !defined(OVERRIDE_silk_LPC_inverse_pred_gain) #define silk_LPC_inverse_pred_gain(A_Q12, order, arch) ((void)(arch), silk_LPC_inverse_pred_gain_c(A_Q12, order)) #endif /********************************************************************/ /* SCALAR FUNCTIONS */ /********************************************************************/ /* Approximation of 128 * log2() (exact inverse of approx 2^() below) */ /* Convert input to a log scale */ opus_int32 silk_lin2log( const opus_int32 inLin /* I input in linear scale */ ); /* Approximation of a sigmoid function */ opus_int silk_sigm_Q15( opus_int in_Q5 /* I */ ); /* Approximation of 2^() (exact inverse of approx log2() above) */ /* Convert input to a linear scale */ opus_int32 silk_log2lin( const opus_int32 inLog_Q7 /* I input on log scale */ ); /* Compute number of bits to right shift the sum of squares of a vector */ /* of int16s to make it fit in an int32 */ void silk_sum_sqr_shift( opus_int32 *energy, /* O Energy of x, after shifting to the right */ opus_int *shift, /* O Number of bits right shift applied to energy */ const opus_int16 *x, /* I Input vector */ opus_int len /* I Length of input vector */ ); /* Calculates the reflection coefficients from the correlation sequence */ /* Faster than schur64(), but much less accurate. */ /* uses SMLAWB(), requiring armv5E and higher. */ opus_int32 silk_schur( /* O Returns residual energy */ opus_int16 *rc_Q15, /* O reflection coefficients [order] Q15 */ const opus_int32 *c, /* I correlations [order+1] */ const opus_int32 order /* I prediction order */ ); /* Calculates the reflection coefficients from the correlation sequence */ /* Slower than schur(), but more accurate. */ /* Uses SMULL(), available on armv4 */ opus_int32 silk_schur64( /* O returns residual energy */ opus_int32 rc_Q16[], /* O Reflection coefficients [order] Q16 */ const opus_int32 c[], /* I Correlations [order+1] */ opus_int32 order /* I Prediction order */ ); /* Step up function, converts reflection coefficients to prediction coefficients */ void silk_k2a( opus_int32 *A_Q24, /* O Prediction coefficients [order] Q24 */ const opus_int16 *rc_Q15, /* I Reflection coefficients [order] Q15 */ const opus_int32 order /* I Prediction order */ ); /* Step up function, converts reflection coefficients to prediction coefficients */ void silk_k2a_Q16( opus_int32 *A_Q24, /* O Prediction coefficients [order] Q24 */ const opus_int32 *rc_Q16, /* I Reflection coefficients [order] Q16 */ const opus_int32 order /* I Prediction order */ ); /* Apply sine window to signal vector. */ /* Window types: */ /* 1 -> sine window from 0 to pi/2 */ /* 2 -> sine window from pi/2 to pi */ /* every other sample of window is linearly interpolated, for speed */ void silk_apply_sine_window( opus_int16 px_win[], /* O Pointer to windowed signal */ const opus_int16 px[], /* I Pointer to input signal */ const opus_int win_type, /* I Selects a window type */ const opus_int length /* I Window length, multiple of 4 */ ); /* Compute autocorrelation */ void silk_autocorr( opus_int32 *results, /* O Result (length correlationCount) */ opus_int *scale, /* O Scaling of the correlation vector */ const opus_int16 *inputData, /* I Input data to correlate */ const opus_int inputDataSize, /* I Length of input */ const opus_int correlationCount, /* I Number of correlation taps to compute */ int arch /* I Run-time architecture */ ); void silk_decode_pitch( opus_int16 lagIndex, /* I */ opus_int8 contourIndex, /* O */ opus_int pitch_lags[], /* O 4 pitch values */ const opus_int Fs_kHz, /* I sampling frequency (kHz) */ const opus_int nb_subfr /* I number of sub frames */ ); opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0 voiced, 1 unvoiced */ const opus_int16 *frame, /* I Signal of length PE_FRAME_LENGTH_MS*Fs_kHz */ opus_int *pitch_out, /* O 4 pitch lag values */ opus_int16 *lagIndex, /* O Lag Index */ opus_int8 *contourIndex, /* O Pitch contour Index */ opus_int *LTPCorr_Q15, /* I/O Normalized correlation; input: value from previous frame */ opus_int prevLag, /* I Last lag of previous frame; set to zero is unvoiced */ const opus_int32 search_thres1_Q16, /* I First stage threshold for lag candidates 0 - 1 */ const opus_int search_thres2_Q13, /* I Final threshold for lag candidates 0 - 1 */ const opus_int Fs_kHz, /* I Sample frequency (kHz) */ const opus_int complexity, /* I Complexity setting, 0-2, where 2 is highest */ const opus_int nb_subfr, /* I number of 5 ms subframes */ int arch /* I Run-time architecture */ ); /* Compute Normalized Line Spectral Frequencies (NLSFs) from whitening filter coefficients */ /* If not all roots are found, the a_Q16 coefficients are bandwidth expanded until convergence. */ void silk_A2NLSF( opus_int16 *NLSF, /* O Normalized Line Spectral Frequencies in Q15 (0..2^15-1) [d] */ opus_int32 *a_Q16, /* I/O Monic whitening filter coefficients in Q16 [d] */ const opus_int d /* I Filter order (must be even) */ ); /* compute whitening filter coefficients from normalized line spectral frequencies */ void silk_NLSF2A( opus_int16 *a_Q12, /* O monic whitening filter coefficients in Q12, [ d ] */ const opus_int16 *NLSF, /* I normalized line spectral frequencies in Q15, [ d ] */ const opus_int d, /* I filter order (should be even) */ int arch /* I Run-time architecture */ ); /* Convert int32 coefficients to int16 coefs and make sure there's no wrap-around */ void silk_LPC_fit( opus_int16 *a_QOUT, /* O Output signal */ opus_int32 *a_QIN, /* I/O Input signal */ const opus_int QOUT, /* I Input Q domain */ const opus_int QIN, /* I Input Q domain */ const opus_int d /* I Filter order */ ); void silk_insertion_sort_increasing( opus_int32 *a, /* I/O Unsorted / Sorted vector */ opus_int *idx, /* O Index vector for the sorted elements */ const opus_int L, /* I Vector length */ const opus_int K /* I Number of correctly sorted positions */ ); void silk_insertion_sort_decreasing_int16( opus_int16 *a, /* I/O Unsorted / Sorted vector */ opus_int *idx, /* O Index vector for the sorted elements */ const opus_int L, /* I Vector length */ const opus_int K /* I Number of correctly sorted positions */ ); void silk_insertion_sort_increasing_all_values_int16( opus_int16 *a, /* I/O Unsorted / Sorted vector */ const opus_int L /* I Vector length */ ); /* NLSF stabilizer, for a single input data vector */ void silk_NLSF_stabilize( opus_int16 *NLSF_Q15, /* I/O Unstable/stabilized normalized LSF vector in Q15 [L] */ const opus_int16 *NDeltaMin_Q15, /* I Min distance vector, NDeltaMin_Q15[L] must be >= 1 [L+1] */ const opus_int L /* I Number of NLSF parameters in the input vector */ ); /* Laroia low complexity NLSF weights */ void silk_NLSF_VQ_weights_laroia( opus_int16 *pNLSFW_Q_OUT, /* O Pointer to input vector weights [D] */ const opus_int16 *pNLSF_Q15, /* I Pointer to input vector [D] */ const opus_int D /* I Input vector dimension (even) */ ); /* Compute reflection coefficients from input signal */ void silk_burg_modified_c( opus_int32 *res_nrg, /* O Residual energy */ opus_int *res_nrg_Q, /* O Residual energy Q value */ opus_int32 A_Q16[], /* O Prediction coefficients (length order) */ const opus_int16 x[], /* I Input signal, length: nb_subfr * ( D + subfr_length ) */ const opus_int32 minInvGain_Q30, /* I Inverse of max prediction gain */ const opus_int subfr_length, /* I Input signal subframe length (incl. D preceding samples) */ const opus_int nb_subfr, /* I Number of subframes stacked in x */ const opus_int D, /* I Order */ int arch /* I Run-time architecture */ ); /* Copy and multiply a vector by a constant */ void silk_scale_copy_vector16( opus_int16 *data_out, const opus_int16 *data_in, opus_int32 gain_Q16, /* I Gain in Q16 */ const opus_int dataSize /* I Length */ ); /* Some for the LTP related function requires Q26 to work.*/ void silk_scale_vector32_Q26_lshift_18( opus_int32 *data1, /* I/O Q0/Q18 */ opus_int32 gain_Q26, /* I Q26 */ opus_int dataSize /* I length */ ); /********************************************************************/ /* INLINE ARM MATH */ /********************************************************************/ /* return sum( inVec1[i] * inVec2[i] ) */ opus_int32 silk_inner_prod_aligned( const opus_int16 *const inVec1, /* I input vector 1 */ const opus_int16 *const inVec2, /* I input vector 2 */ const opus_int len, /* I vector lengths */ int arch /* I Run-time architecture */ ); opus_int32 silk_inner_prod_aligned_scale( const opus_int16 *const inVec1, /* I input vector 1 */ const opus_int16 *const inVec2, /* I input vector 2 */ const opus_int scale, /* I number of bits to shift */ const opus_int len /* I vector lengths */ ); opus_int64 silk_inner_prod16_aligned_64_c( const opus_int16 *inVec1, /* I input vector 1 */ const opus_int16 *inVec2, /* I input vector 2 */ const opus_int len /* I vector lengths */ ); /********************************************************************/ /* MACROS */ /********************************************************************/ /* Rotate a32 right by 'rot' bits. Negative rot values result in rotating left. Output is 32bit int. Note: contemporary compilers recognize the C expression below and compile it into a 'ror' instruction if available. No need for OPUS_INLINE ASM! */ static OPUS_INLINE opus_int32 silk_ROR32( opus_int32 a32, opus_int rot ) { opus_uint32 x = (opus_uint32) a32; opus_uint32 r = (opus_uint32) rot; opus_uint32 m = (opus_uint32) -rot; if( rot == 0 ) { return a32; } else if( rot < 0 ) { return (opus_int32) ((x << m) | (x >> (32 - m))); } else { return (opus_int32) ((x << (32 - r)) | (x >> r)); } } /* Allocate opus_int16 aligned to 4-byte memory address */ #if EMBEDDED_ARM #define silk_DWORD_ALIGN __attribute__((aligned(4))) #else #define silk_DWORD_ALIGN #endif /* Useful Macros that can be adjusted to other platforms */ #define silk_memcpy(dest, src, size) memcpy((dest), (src), (size)) #define silk_memset(dest, src, size) memset((dest), (src), (size)) #define silk_memmove(dest, src, size) memmove((dest), (src), (size)) /* Fixed point macros */ /* (a32 * b32) output have to be 32bit int */ #define silk_MUL(a32, b32) ((a32) * (b32)) /* (a32 * b32) output have to be 32bit uint */ #define silk_MUL_uint(a32, b32) silk_MUL(a32, b32) /* a32 + (b32 * c32) output have to be 32bit int */ #define silk_MLA(a32, b32, c32) silk_ADD32((a32),((b32) * (c32))) /* a32 + (b32 * c32) output have to be 32bit uint */ #define silk_MLA_uint(a32, b32, c32) silk_MLA(a32, b32, c32) /* ((a32 >> 16) * (b32 >> 16)) output have to be 32bit int */ #define silk_SMULTT(a32, b32) (((a32) >> 16) * ((b32) >> 16)) /* a32 + ((a32 >> 16) * (b32 >> 16)) output have to be 32bit int */ #define silk_SMLATT(a32, b32, c32) silk_ADD32((a32),((b32) >> 16) * ((c32) >> 16)) #define silk_SMLALBB(a64, b16, c16) silk_ADD64((a64),(opus_int64)((opus_int32)(b16) * (opus_int32)(c16))) /* (a32 * b32) */ #define silk_SMULL(a32, b32) ((opus_int64)(a32) * /*(opus_int64)*/(b32)) /* Adds two signed 32-bit values in a way that can overflow, while not relying on undefined behaviour (just standard two's complement implementation-specific behaviour) */ #define silk_ADD32_ovflw(a, b) ((opus_int32)((opus_uint32)(a) + (opus_uint32)(b))) /* Subtractss two signed 32-bit values in a way that can overflow, while not relying on undefined behaviour (just standard two's complement implementation-specific behaviour) */ #define silk_SUB32_ovflw(a, b) ((opus_int32)((opus_uint32)(a) - (opus_uint32)(b))) /* Multiply-accumulate macros that allow overflow in the addition (ie, no asserts in debug mode) */ #define silk_MLA_ovflw(a32, b32, c32) silk_ADD32_ovflw((a32), (opus_uint32)(b32) * (opus_uint32)(c32)) #define silk_SMLABB_ovflw(a32, b32, c32) (silk_ADD32_ovflw((a32) , ((opus_int32)((opus_int16)(b32))) * (opus_int32)((opus_int16)(c32)))) #define silk_DIV32_16(a32, b16) ((opus_int32)((a32) / (b16))) #define silk_DIV32(a32, b32) ((opus_int32)((a32) / (b32))) /* These macros enables checking for overflow in silk_API_Debug.h*/ #define silk_ADD16(a, b) ((a) + (b)) #define silk_ADD32(a, b) ((a) + (b)) #define silk_ADD64(a, b) ((a) + (b)) #define silk_SUB16(a, b) ((a) - (b)) #define silk_SUB32(a, b) ((a) - (b)) #define silk_SUB64(a, b) ((a) - (b)) #define silk_SAT8(a) ((a) > silk_int8_MAX ? silk_int8_MAX : \ ((a) < silk_int8_MIN ? silk_int8_MIN : (a))) #define silk_SAT16(a) ((a) > silk_int16_MAX ? silk_int16_MAX : \ ((a) < silk_int16_MIN ? silk_int16_MIN : (a))) #define silk_SAT32(a) ((a) > silk_int32_MAX ? silk_int32_MAX : \ ((a) < silk_int32_MIN ? silk_int32_MIN : (a))) #define silk_CHECK_FIT8(a) (a) #define silk_CHECK_FIT16(a) (a) #define silk_CHECK_FIT32(a) (a) #define silk_ADD_SAT16(a, b) (opus_int16)silk_SAT16( silk_ADD32( (opus_int32)(a), (b) ) ) #define silk_ADD_SAT64(a, b) ((((a) + (b)) & 0x8000000000000000LL) == 0 ? \ ((((a) & (b)) & 0x8000000000000000LL) != 0 ? silk_int64_MIN : (a)+(b)) : \ ((((a) | (b)) & 0x8000000000000000LL) == 0 ? silk_int64_MAX : (a)+(b)) ) #define silk_SUB_SAT16(a, b) (opus_int16)silk_SAT16( silk_SUB32( (opus_int32)(a), (b) ) ) #define silk_SUB_SAT64(a, b) ((((a)-(b)) & 0x8000000000000000LL) == 0 ? \ (( (a) & ((b)^0x8000000000000000LL) & 0x8000000000000000LL) ? silk_int64_MIN : (a)-(b)) : \ ((((a)^0x8000000000000000LL) & (b) & 0x8000000000000000LL) ? silk_int64_MAX : (a)-(b)) ) /* Saturation for positive input values */ #define silk_POS_SAT32(a) ((a) > silk_int32_MAX ? silk_int32_MAX : (a)) /* Add with saturation for positive input values */ #define silk_ADD_POS_SAT8(a, b) ((((a)+(b)) & 0x80) ? silk_int8_MAX : ((a)+(b))) #define silk_ADD_POS_SAT16(a, b) ((((a)+(b)) & 0x8000) ? silk_int16_MAX : ((a)+(b))) #define silk_ADD_POS_SAT32(a, b) ((((opus_uint32)(a)+(opus_uint32)(b)) & 0x80000000) ? silk_int32_MAX : ((a)+(b))) #define silk_LSHIFT8(a, shift) ((opus_int8)((opus_uint8)(a)<<(shift))) /* shift >= 0, shift < 8 */ #define silk_LSHIFT16(a, shift) ((opus_int16)((opus_uint16)(a)<<(shift))) /* shift >= 0, shift < 16 */ #define silk_LSHIFT32(a, shift) ((opus_int32)((opus_uint32)(a)<<(shift))) /* shift >= 0, shift < 32 */ #define silk_LSHIFT64(a, shift) ((opus_int64)((opus_uint64)(a)<<(shift))) /* shift >= 0, shift < 64 */ #define silk_LSHIFT(a, shift) silk_LSHIFT32(a, shift) /* shift >= 0, shift < 32 */ #define silk_RSHIFT8(a, shift) ((a)>>(shift)) /* shift >= 0, shift < 8 */ #define silk_RSHIFT16(a, shift) ((a)>>(shift)) /* shift >= 0, shift < 16 */ #define silk_RSHIFT32(a, shift) ((a)>>(shift)) /* shift >= 0, shift < 32 */ #define silk_RSHIFT64(a, shift) ((a)>>(shift)) /* shift >= 0, shift < 64 */ #define silk_RSHIFT(a, shift) silk_RSHIFT32(a, shift) /* shift >= 0, shift < 32 */ /* saturates before shifting */ #define silk_LSHIFT_SAT32(a, shift) (silk_LSHIFT32( silk_LIMIT( (a), silk_RSHIFT32( silk_int32_MIN, (shift) ), \ silk_RSHIFT32( silk_int32_MAX, (shift) ) ), (shift) )) #define silk_LSHIFT_ovflw(a, shift) ((opus_int32)((opus_uint32)(a) << (shift))) /* shift >= 0, allowed to overflow */ #define silk_LSHIFT_uint(a, shift) ((a) << (shift)) /* shift >= 0 */ #define silk_RSHIFT_uint(a, shift) ((a) >> (shift)) /* shift >= 0 */ #define silk_ADD_LSHIFT(a, b, shift) ((a) + silk_LSHIFT((b), (shift))) /* shift >= 0 */ #define silk_ADD_LSHIFT32(a, b, shift) silk_ADD32((a), silk_LSHIFT32((b), (shift))) /* shift >= 0 */ #define silk_ADD_LSHIFT_uint(a, b, shift) ((a) + silk_LSHIFT_uint((b), (shift))) /* shift >= 0 */ #define silk_ADD_RSHIFT(a, b, shift) ((a) + silk_RSHIFT((b), (shift))) /* shift >= 0 */ #define silk_ADD_RSHIFT32(a, b, shift) silk_ADD32((a), silk_RSHIFT32((b), (shift))) /* shift >= 0 */ #define silk_ADD_RSHIFT_uint(a, b, shift) ((a) + silk_RSHIFT_uint((b), (shift))) /* shift >= 0 */ #define silk_SUB_LSHIFT32(a, b, shift) silk_SUB32((a), silk_LSHIFT32((b), (shift))) /* shift >= 0 */ #define silk_SUB_RSHIFT32(a, b, shift) silk_SUB32((a), silk_RSHIFT32((b), (shift))) /* shift >= 0 */ /* Requires that shift > 0 */ #define silk_RSHIFT_ROUND(a, shift) ((shift) == 1 ? ((a) >> 1) + ((a) & 1) : (((a) >> ((shift) - 1)) + 1) >> 1) #define silk_RSHIFT_ROUND64(a, shift) ((shift) == 1 ? ((a) >> 1) + ((a) & 1) : (((a) >> ((shift) - 1)) + 1) >> 1) /* Number of rightshift required to fit the multiplication */ #define silk_NSHIFT_MUL_32_32(a, b) ( -(31- (32-silk_CLZ32(silk_abs(a)) + (32-silk_CLZ32(silk_abs(b))))) ) #define silk_NSHIFT_MUL_16_16(a, b) ( -(15- (16-silk_CLZ16(silk_abs(a)) + (16-silk_CLZ16(silk_abs(b))))) ) #define silk_min(a, b) (((a) < (b)) ? (a) : (b)) #define silk_max(a, b) (((a) > (b)) ? (a) : (b)) /* Macro to convert floating-point constants to fixed-point */ #define SILK_FIX_CONST( C, Q ) ((opus_int32)((C) * ((opus_int64)1 << (Q)) + 0.5)) /* silk_min() versions with typecast in the function call */ static OPUS_INLINE opus_int silk_min_int(opus_int a, opus_int b) { return (((a) < (b)) ? (a) : (b)); } static OPUS_INLINE opus_int16 silk_min_16(opus_int16 a, opus_int16 b) { return (((a) < (b)) ? (a) : (b)); } static OPUS_INLINE opus_int32 silk_min_32(opus_int32 a, opus_int32 b) { return (((a) < (b)) ? (a) : (b)); } static OPUS_INLINE opus_int64 silk_min_64(opus_int64 a, opus_int64 b) { return (((a) < (b)) ? (a) : (b)); } /* silk_min() versions with typecast in the function call */ static OPUS_INLINE opus_int silk_max_int(opus_int a, opus_int b) { return (((a) > (b)) ? (a) : (b)); } static OPUS_INLINE opus_int16 silk_max_16(opus_int16 a, opus_int16 b) { return (((a) > (b)) ? (a) : (b)); } static OPUS_INLINE opus_int32 silk_max_32(opus_int32 a, opus_int32 b) { return (((a) > (b)) ? (a) : (b)); } static OPUS_INLINE opus_int64 silk_max_64(opus_int64 a, opus_int64 b) { return (((a) > (b)) ? (a) : (b)); } #define silk_LIMIT( a, limit1, limit2) ((limit1) > (limit2) ? ((a) > (limit1) ? (limit1) : ((a) < (limit2) ? (limit2) : (a))) \ : ((a) > (limit2) ? (limit2) : ((a) < (limit1) ? (limit1) : (a)))) #define silk_LIMIT_int silk_LIMIT #define silk_LIMIT_16 silk_LIMIT #define silk_LIMIT_32 silk_LIMIT #define silk_abs(a) (((a) > 0) ? (a) : -(a)) /* Be careful, silk_abs returns wrong when input equals to silk_intXX_MIN */ #define silk_abs_int(a) (((a) ^ ((a) >> (8 * sizeof(a) - 1))) - ((a) >> (8 * sizeof(a) - 1))) #define silk_abs_int32(a) (((a) ^ ((a) >> 31)) - ((a) >> 31)) #define silk_abs_int64(a) (((a) > 0) ? (a) : -(a)) #define silk_sign(a) ((a) > 0 ? 1 : ( (a) < 0 ? -1 : 0 )) /* PSEUDO-RANDOM GENERATOR */ /* Make sure to store the result as the seed for the next call (also in between */ /* frames), otherwise result won't be random at all. When only using some of the */ /* bits, take the most significant bits by right-shifting. */ #define RAND_MULTIPLIER 196314165 #define RAND_INCREMENT 907633515 #define silk_RAND(seed) (silk_MLA_ovflw((RAND_INCREMENT), (seed), (RAND_MULTIPLIER))) /* Add some multiplication functions that can be easily mapped to ARM. */ /* silk_SMMUL: Signed top word multiply. ARMv6 2 instruction cycles. ARMv3M+ 3 instruction cycles. use SMULL and ignore LSB registers.(except xM)*/ /*#define silk_SMMUL(a32, b32) (opus_int32)silk_RSHIFT(silk_SMLAL(silk_SMULWB((a32), (b32)), (a32), silk_RSHIFT_ROUND((b32), 16)), 16)*/ /* the following seems faster on x86 */ #define silk_SMMUL(a32, b32) (opus_int32)silk_RSHIFT64(silk_SMULL((a32), (b32)), 32) #if !defined(OPUS_X86_MAY_HAVE_SSE4_1) #define silk_burg_modified(res_nrg, res_nrg_Q, A_Q16, x, minInvGain_Q30, subfr_length, nb_subfr, D, arch) \ ((void)(arch), silk_burg_modified_c(res_nrg, res_nrg_Q, A_Q16, x, minInvGain_Q30, subfr_length, nb_subfr, D, arch)) #define silk_inner_prod16_aligned_64(inVec1, inVec2, len, arch) \ ((void)(arch),silk_inner_prod16_aligned_64_c(inVec1, inVec2, len)) #endif #include "Inlines.h" #include "MacroCount.h" #include "MacroDebug.h" #ifdef OPUS_ARM_INLINE_ASM #include "arm/SigProc_FIX_armv4.h" #endif #ifdef OPUS_ARM_INLINE_EDSP #include "arm/SigProc_FIX_armv5e.h" #endif #if defined(MIPSr1_ASM) #include "mips/sigproc_fix_mipsr1.h" #endif #ifdef __cplusplus } #endif #endif /* SILK_SIGPROC_FIX_H */ mumble-1.3.4/3rdparty/opus-src/silk/sort.c0000664000175000017500000001417114010707327020265 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif /* Insertion sort (fast for already almost sorted arrays): */ /* Best case: O(n) for an already sorted array */ /* Worst case: O(n^2) for an inversely sorted array */ /* */ /* Shell short: https://en.wikipedia.org/wiki/Shell_sort */ #include "SigProc_FIX.h" void silk_insertion_sort_increasing( opus_int32 *a, /* I/O Unsorted / Sorted vector */ opus_int *idx, /* O Index vector for the sorted elements */ const opus_int L, /* I Vector length */ const opus_int K /* I Number of correctly sorted positions */ ) { opus_int32 value; opus_int i, j; /* Safety checks */ silk_assert( K > 0 ); silk_assert( L > 0 ); silk_assert( L >= K ); /* Write start indices in index vector */ for( i = 0; i < K; i++ ) { idx[ i ] = i; } /* Sort vector elements by value, increasing order */ for( i = 1; i < K; i++ ) { value = a[ i ]; for( j = i - 1; ( j >= 0 ) && ( value < a[ j ] ); j-- ) { a[ j + 1 ] = a[ j ]; /* Shift value */ idx[ j + 1 ] = idx[ j ]; /* Shift index */ } a[ j + 1 ] = value; /* Write value */ idx[ j + 1 ] = i; /* Write index */ } /* If less than L values are asked for, check the remaining values, */ /* but only spend CPU to ensure that the K first values are correct */ for( i = K; i < L; i++ ) { value = a[ i ]; if( value < a[ K - 1 ] ) { for( j = K - 2; ( j >= 0 ) && ( value < a[ j ] ); j-- ) { a[ j + 1 ] = a[ j ]; /* Shift value */ idx[ j + 1 ] = idx[ j ]; /* Shift index */ } a[ j + 1 ] = value; /* Write value */ idx[ j + 1 ] = i; /* Write index */ } } } #ifdef FIXED_POINT /* This function is only used by the fixed-point build */ void silk_insertion_sort_decreasing_int16( opus_int16 *a, /* I/O Unsorted / Sorted vector */ opus_int *idx, /* O Index vector for the sorted elements */ const opus_int L, /* I Vector length */ const opus_int K /* I Number of correctly sorted positions */ ) { opus_int i, j; opus_int value; /* Safety checks */ silk_assert( K > 0 ); silk_assert( L > 0 ); silk_assert( L >= K ); /* Write start indices in index vector */ for( i = 0; i < K; i++ ) { idx[ i ] = i; } /* Sort vector elements by value, decreasing order */ for( i = 1; i < K; i++ ) { value = a[ i ]; for( j = i - 1; ( j >= 0 ) && ( value > a[ j ] ); j-- ) { a[ j + 1 ] = a[ j ]; /* Shift value */ idx[ j + 1 ] = idx[ j ]; /* Shift index */ } a[ j + 1 ] = value; /* Write value */ idx[ j + 1 ] = i; /* Write index */ } /* If less than L values are asked for, check the remaining values, */ /* but only spend CPU to ensure that the K first values are correct */ for( i = K; i < L; i++ ) { value = a[ i ]; if( value > a[ K - 1 ] ) { for( j = K - 2; ( j >= 0 ) && ( value > a[ j ] ); j-- ) { a[ j + 1 ] = a[ j ]; /* Shift value */ idx[ j + 1 ] = idx[ j ]; /* Shift index */ } a[ j + 1 ] = value; /* Write value */ idx[ j + 1 ] = i; /* Write index */ } } } #endif void silk_insertion_sort_increasing_all_values_int16( opus_int16 *a, /* I/O Unsorted / Sorted vector */ const opus_int L /* I Vector length */ ) { opus_int value; opus_int i, j; /* Safety checks */ silk_assert( L > 0 ); /* Sort vector elements by value, increasing order */ for( i = 1; i < L; i++ ) { value = a[ i ]; for( j = i - 1; ( j >= 0 ) && ( value < a[ j ] ); j-- ) { a[ j + 1 ] = a[ j ]; /* Shift value */ } a[ j + 1 ] = value; /* Write value */ } } mumble-1.3.4/3rdparty/opus-src/silk/resampler_rom.h0000664000175000017500000000633614010707327022156 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef SILK_FIX_RESAMPLER_ROM_H #define SILK_FIX_RESAMPLER_ROM_H #ifdef __cplusplus extern "C" { #endif #include "typedef.h" #include "resampler_structs.h" #define RESAMPLER_DOWN_ORDER_FIR0 18 #define RESAMPLER_DOWN_ORDER_FIR1 24 #define RESAMPLER_DOWN_ORDER_FIR2 36 #define RESAMPLER_ORDER_FIR_12 8 /* Tables for 2x downsampler */ static const opus_int16 silk_resampler_down2_0 = 9872; static const opus_int16 silk_resampler_down2_1 = 39809 - 65536; /* Tables for 2x upsampler, high quality */ static const opus_int16 silk_resampler_up2_hq_0[ 3 ] = { 1746, 14986, 39083 - 65536 }; static const opus_int16 silk_resampler_up2_hq_1[ 3 ] = { 6854, 25769, 55542 - 65536 }; /* Tables with IIR and FIR coefficients for fractional downsamplers */ extern const opus_int16 silk_Resampler_3_4_COEFS[ 2 + 3 * RESAMPLER_DOWN_ORDER_FIR0 / 2 ]; extern const opus_int16 silk_Resampler_2_3_COEFS[ 2 + 2 * RESAMPLER_DOWN_ORDER_FIR0 / 2 ]; extern const opus_int16 silk_Resampler_1_2_COEFS[ 2 + RESAMPLER_DOWN_ORDER_FIR1 / 2 ]; extern const opus_int16 silk_Resampler_1_3_COEFS[ 2 + RESAMPLER_DOWN_ORDER_FIR2 / 2 ]; extern const opus_int16 silk_Resampler_1_4_COEFS[ 2 + RESAMPLER_DOWN_ORDER_FIR2 / 2 ]; extern const opus_int16 silk_Resampler_1_6_COEFS[ 2 + RESAMPLER_DOWN_ORDER_FIR2 / 2 ]; extern const opus_int16 silk_Resampler_2_3_COEFS_LQ[ 2 + 2 * 2 ]; /* Table with interplation fractions of 1/24, 3/24, ..., 23/24 */ extern const opus_int16 silk_resampler_frac_FIR_12[ 12 ][ RESAMPLER_ORDER_FIR_12 / 2 ]; #ifdef __cplusplus } #endif #endif /* SILK_FIX_RESAMPLER_ROM_H */ mumble-1.3.4/3rdparty/opus-src/silk/NSQ.h0000664000175000017500000001030014010707327017732 0ustar builderbuilder/*********************************************************************** Copyright (c) 2014 Vidyo. Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef SILK_NSQ_H #define SILK_NSQ_H #include "SigProc_FIX.h" #undef silk_short_prediction_create_arch_coef static OPUS_INLINE opus_int32 silk_noise_shape_quantizer_short_prediction_c(const opus_int32 *buf32, const opus_int16 *coef16, opus_int order) { opus_int32 out; silk_assert( order == 10 || order == 16 ); /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ out = silk_RSHIFT( order, 1 ); out = silk_SMLAWB( out, buf32[ 0 ], coef16[ 0 ] ); out = silk_SMLAWB( out, buf32[ -1 ], coef16[ 1 ] ); out = silk_SMLAWB( out, buf32[ -2 ], coef16[ 2 ] ); out = silk_SMLAWB( out, buf32[ -3 ], coef16[ 3 ] ); out = silk_SMLAWB( out, buf32[ -4 ], coef16[ 4 ] ); out = silk_SMLAWB( out, buf32[ -5 ], coef16[ 5 ] ); out = silk_SMLAWB( out, buf32[ -6 ], coef16[ 6 ] ); out = silk_SMLAWB( out, buf32[ -7 ], coef16[ 7 ] ); out = silk_SMLAWB( out, buf32[ -8 ], coef16[ 8 ] ); out = silk_SMLAWB( out, buf32[ -9 ], coef16[ 9 ] ); if( order == 16 ) { out = silk_SMLAWB( out, buf32[ -10 ], coef16[ 10 ] ); out = silk_SMLAWB( out, buf32[ -11 ], coef16[ 11 ] ); out = silk_SMLAWB( out, buf32[ -12 ], coef16[ 12 ] ); out = silk_SMLAWB( out, buf32[ -13 ], coef16[ 13 ] ); out = silk_SMLAWB( out, buf32[ -14 ], coef16[ 14 ] ); out = silk_SMLAWB( out, buf32[ -15 ], coef16[ 15 ] ); } return out; } #define silk_noise_shape_quantizer_short_prediction(in, coef, coefRev, order, arch) ((void)arch,silk_noise_shape_quantizer_short_prediction_c(in, coef, order)) static OPUS_INLINE opus_int32 silk_NSQ_noise_shape_feedback_loop_c(const opus_int32 *data0, opus_int32 *data1, const opus_int16 *coef, opus_int order) { opus_int32 out; opus_int32 tmp1, tmp2; opus_int j; tmp2 = data0[0]; tmp1 = data1[0]; data1[0] = tmp2; out = silk_RSHIFT(order, 1); out = silk_SMLAWB(out, tmp2, coef[0]); for (j = 2; j < order; j += 2) { tmp2 = data1[j - 1]; data1[j - 1] = tmp1; out = silk_SMLAWB(out, tmp1, coef[j - 1]); tmp1 = data1[j + 0]; data1[j + 0] = tmp2; out = silk_SMLAWB(out, tmp2, coef[j]); } data1[order - 1] = tmp1; out = silk_SMLAWB(out, tmp1, coef[order - 1]); /* Q11 -> Q12 */ out = silk_LSHIFT32( out, 1 ); return out; } #define silk_NSQ_noise_shape_feedback_loop(data0, data1, coef, order, arch) ((void)arch,silk_NSQ_noise_shape_feedback_loop_c(data0, data1, coef, order)) #if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) #include "arm/NSQ_neon.h" #endif #endif /* SILK_NSQ_H */ mumble-1.3.4/3rdparty/opus-src/silk/decode_indices.c0000664000175000017500000001611614010707327022220 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main.h" /* Decode side-information parameters from payload */ void silk_decode_indices( silk_decoder_state *psDec, /* I/O State */ ec_dec *psRangeDec, /* I/O Compressor data structure */ opus_int FrameIndex, /* I Frame number */ opus_int decode_LBRR, /* I Flag indicating LBRR data is being decoded */ opus_int condCoding /* I The type of conditional coding to use */ ) { opus_int i, k, Ix; opus_int decode_absolute_lagIndex, delta_lagIndex; opus_int16 ec_ix[ MAX_LPC_ORDER ]; opus_uint8 pred_Q8[ MAX_LPC_ORDER ]; /*******************************************/ /* Decode signal type and quantizer offset */ /*******************************************/ if( decode_LBRR || psDec->VAD_flags[ FrameIndex ] ) { Ix = ec_dec_icdf( psRangeDec, silk_type_offset_VAD_iCDF, 8 ) + 2; } else { Ix = ec_dec_icdf( psRangeDec, silk_type_offset_no_VAD_iCDF, 8 ); } psDec->indices.signalType = (opus_int8)silk_RSHIFT( Ix, 1 ); psDec->indices.quantOffsetType = (opus_int8)( Ix & 1 ); /****************/ /* Decode gains */ /****************/ /* First subframe */ if( condCoding == CODE_CONDITIONALLY ) { /* Conditional coding */ psDec->indices.GainsIndices[ 0 ] = (opus_int8)ec_dec_icdf( psRangeDec, silk_delta_gain_iCDF, 8 ); } else { /* Independent coding, in two stages: MSB bits followed by 3 LSBs */ psDec->indices.GainsIndices[ 0 ] = (opus_int8)silk_LSHIFT( ec_dec_icdf( psRangeDec, silk_gain_iCDF[ psDec->indices.signalType ], 8 ), 3 ); psDec->indices.GainsIndices[ 0 ] += (opus_int8)ec_dec_icdf( psRangeDec, silk_uniform8_iCDF, 8 ); } /* Remaining subframes */ for( i = 1; i < psDec->nb_subfr; i++ ) { psDec->indices.GainsIndices[ i ] = (opus_int8)ec_dec_icdf( psRangeDec, silk_delta_gain_iCDF, 8 ); } /**********************/ /* Decode LSF Indices */ /**********************/ psDec->indices.NLSFIndices[ 0 ] = (opus_int8)ec_dec_icdf( psRangeDec, &psDec->psNLSF_CB->CB1_iCDF[ ( psDec->indices.signalType >> 1 ) * psDec->psNLSF_CB->nVectors ], 8 ); silk_NLSF_unpack( ec_ix, pred_Q8, psDec->psNLSF_CB, psDec->indices.NLSFIndices[ 0 ] ); silk_assert( psDec->psNLSF_CB->order == psDec->LPC_order ); for( i = 0; i < psDec->psNLSF_CB->order; i++ ) { Ix = ec_dec_icdf( psRangeDec, &psDec->psNLSF_CB->ec_iCDF[ ec_ix[ i ] ], 8 ); if( Ix == 0 ) { Ix -= ec_dec_icdf( psRangeDec, silk_NLSF_EXT_iCDF, 8 ); } else if( Ix == 2 * NLSF_QUANT_MAX_AMPLITUDE ) { Ix += ec_dec_icdf( psRangeDec, silk_NLSF_EXT_iCDF, 8 ); } psDec->indices.NLSFIndices[ i+1 ] = (opus_int8)( Ix - NLSF_QUANT_MAX_AMPLITUDE ); } /* Decode LSF interpolation factor */ if( psDec->nb_subfr == MAX_NB_SUBFR ) { psDec->indices.NLSFInterpCoef_Q2 = (opus_int8)ec_dec_icdf( psRangeDec, silk_NLSF_interpolation_factor_iCDF, 8 ); } else { psDec->indices.NLSFInterpCoef_Q2 = 4; } if( psDec->indices.signalType == TYPE_VOICED ) { /*********************/ /* Decode pitch lags */ /*********************/ /* Get lag index */ decode_absolute_lagIndex = 1; if( condCoding == CODE_CONDITIONALLY && psDec->ec_prevSignalType == TYPE_VOICED ) { /* Decode Delta index */ delta_lagIndex = (opus_int16)ec_dec_icdf( psRangeDec, silk_pitch_delta_iCDF, 8 ); if( delta_lagIndex > 0 ) { delta_lagIndex = delta_lagIndex - 9; psDec->indices.lagIndex = (opus_int16)( psDec->ec_prevLagIndex + delta_lagIndex ); decode_absolute_lagIndex = 0; } } if( decode_absolute_lagIndex ) { /* Absolute decoding */ psDec->indices.lagIndex = (opus_int16)ec_dec_icdf( psRangeDec, silk_pitch_lag_iCDF, 8 ) * silk_RSHIFT( psDec->fs_kHz, 1 ); psDec->indices.lagIndex += (opus_int16)ec_dec_icdf( psRangeDec, psDec->pitch_lag_low_bits_iCDF, 8 ); } psDec->ec_prevLagIndex = psDec->indices.lagIndex; /* Get countour index */ psDec->indices.contourIndex = (opus_int8)ec_dec_icdf( psRangeDec, psDec->pitch_contour_iCDF, 8 ); /********************/ /* Decode LTP gains */ /********************/ /* Decode PERIndex value */ psDec->indices.PERIndex = (opus_int8)ec_dec_icdf( psRangeDec, silk_LTP_per_index_iCDF, 8 ); for( k = 0; k < psDec->nb_subfr; k++ ) { psDec->indices.LTPIndex[ k ] = (opus_int8)ec_dec_icdf( psRangeDec, silk_LTP_gain_iCDF_ptrs[ psDec->indices.PERIndex ], 8 ); } /**********************/ /* Decode LTP scaling */ /**********************/ if( condCoding == CODE_INDEPENDENTLY ) { psDec->indices.LTP_scaleIndex = (opus_int8)ec_dec_icdf( psRangeDec, silk_LTPscale_iCDF, 8 ); } else { psDec->indices.LTP_scaleIndex = 0; } } psDec->ec_prevSignalType = psDec->indices.signalType; /***************/ /* Decode seed */ /***************/ psDec->indices.Seed = (opus_int8)ec_dec_icdf( psRangeDec, silk_uniform4_iCDF, 8 ); } mumble-1.3.4/3rdparty/opus-src/silk/LPC_inv_pred_gain.c0000664000175000017500000001402114010707327022572 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "SigProc_FIX.h" #include "define.h" #define QA 24 #define A_LIMIT SILK_FIX_CONST( 0.99975, QA ) #define MUL32_FRAC_Q(a32, b32, Q) ((opus_int32)(silk_RSHIFT_ROUND64(silk_SMULL(a32, b32), Q))) /* Compute inverse of LPC prediction gain, and */ /* test if LPC coefficients are stable (all poles within unit circle) */ static opus_int32 LPC_inverse_pred_gain_QA_c( /* O Returns inverse prediction gain in energy domain, Q30 */ opus_int32 A_QA[ SILK_MAX_ORDER_LPC ], /* I Prediction coefficients */ const opus_int order /* I Prediction order */ ) { opus_int k, n, mult2Q; opus_int32 invGain_Q30, rc_Q31, rc_mult1_Q30, rc_mult2, tmp1, tmp2; invGain_Q30 = SILK_FIX_CONST( 1, 30 ); for( k = order - 1; k > 0; k-- ) { /* Check for stability */ if( ( A_QA[ k ] > A_LIMIT ) || ( A_QA[ k ] < -A_LIMIT ) ) { return 0; } /* Set RC equal to negated AR coef */ rc_Q31 = -silk_LSHIFT( A_QA[ k ], 31 - QA ); /* rc_mult1_Q30 range: [ 1 : 2^30 ] */ rc_mult1_Q30 = silk_SUB32( SILK_FIX_CONST( 1, 30 ), silk_SMMUL( rc_Q31, rc_Q31 ) ); silk_assert( rc_mult1_Q30 > ( 1 << 15 ) ); /* reduce A_LIMIT if fails */ silk_assert( rc_mult1_Q30 <= ( 1 << 30 ) ); /* Update inverse gain */ /* invGain_Q30 range: [ 0 : 2^30 ] */ invGain_Q30 = silk_LSHIFT( silk_SMMUL( invGain_Q30, rc_mult1_Q30 ), 2 ); silk_assert( invGain_Q30 >= 0 ); silk_assert( invGain_Q30 <= ( 1 << 30 ) ); if( invGain_Q30 < SILK_FIX_CONST( 1.0f / MAX_PREDICTION_POWER_GAIN, 30 ) ) { return 0; } /* rc_mult2 range: [ 2^30 : silk_int32_MAX ] */ mult2Q = 32 - silk_CLZ32( silk_abs( rc_mult1_Q30 ) ); rc_mult2 = silk_INVERSE32_varQ( rc_mult1_Q30, mult2Q + 30 ); /* Update AR coefficient */ for( n = 0; n < (k + 1) >> 1; n++ ) { opus_int64 tmp64; tmp1 = A_QA[ n ]; tmp2 = A_QA[ k - n - 1 ]; tmp64 = silk_RSHIFT_ROUND64( silk_SMULL( silk_SUB_SAT32(tmp1, MUL32_FRAC_Q( tmp2, rc_Q31, 31 ) ), rc_mult2 ), mult2Q); if( tmp64 > silk_int32_MAX || tmp64 < silk_int32_MIN ) { return 0; } A_QA[ n ] = ( opus_int32 )tmp64; tmp64 = silk_RSHIFT_ROUND64( silk_SMULL( silk_SUB_SAT32(tmp2, MUL32_FRAC_Q( tmp1, rc_Q31, 31 ) ), rc_mult2), mult2Q); if( tmp64 > silk_int32_MAX || tmp64 < silk_int32_MIN ) { return 0; } A_QA[ k - n - 1 ] = ( opus_int32 )tmp64; } } /* Check for stability */ if( ( A_QA[ k ] > A_LIMIT ) || ( A_QA[ k ] < -A_LIMIT ) ) { return 0; } /* Set RC equal to negated AR coef */ rc_Q31 = -silk_LSHIFT( A_QA[ 0 ], 31 - QA ); /* Range: [ 1 : 2^30 ] */ rc_mult1_Q30 = silk_SUB32( SILK_FIX_CONST( 1, 30 ), silk_SMMUL( rc_Q31, rc_Q31 ) ); /* Update inverse gain */ /* Range: [ 0 : 2^30 ] */ invGain_Q30 = silk_LSHIFT( silk_SMMUL( invGain_Q30, rc_mult1_Q30 ), 2 ); silk_assert( invGain_Q30 >= 0 ); silk_assert( invGain_Q30 <= ( 1 << 30 ) ); if( invGain_Q30 < SILK_FIX_CONST( 1.0f / MAX_PREDICTION_POWER_GAIN, 30 ) ) { return 0; } return invGain_Q30; } /* For input in Q12 domain */ opus_int32 silk_LPC_inverse_pred_gain_c( /* O Returns inverse prediction gain in energy domain, Q30 */ const opus_int16 *A_Q12, /* I Prediction coefficients, Q12 [order] */ const opus_int order /* I Prediction order */ ) { opus_int k; opus_int32 Atmp_QA[ SILK_MAX_ORDER_LPC ]; opus_int32 DC_resp = 0; /* Increase Q domain of the AR coefficients */ for( k = 0; k < order; k++ ) { DC_resp += (opus_int32)A_Q12[ k ]; Atmp_QA[ k ] = silk_LSHIFT32( (opus_int32)A_Q12[ k ], QA - 12 ); } /* If the DC is unstable, we don't even need to do the full calculations */ if( DC_resp >= 4096 ) { return 0; } return LPC_inverse_pred_gain_QA_c( Atmp_QA, order ); } mumble-1.3.4/3rdparty/opus-src/silk/table_LSF_cos.c0000664000175000017500000001013714010707327021733 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "tables.h" /* Cosine approximation table for LSF conversion */ /* Q12 values (even) */ const opus_int16 silk_LSFCosTab_FIX_Q12[ LSF_COS_TAB_SZ_FIX + 1 ] = { 8192, 8190, 8182, 8170, 8152, 8130, 8104, 8072, 8034, 7994, 7946, 7896, 7840, 7778, 7714, 7644, 7568, 7490, 7406, 7318, 7226, 7128, 7026, 6922, 6812, 6698, 6580, 6458, 6332, 6204, 6070, 5934, 5792, 5648, 5502, 5352, 5198, 5040, 4880, 4718, 4552, 4382, 4212, 4038, 3862, 3684, 3502, 3320, 3136, 2948, 2760, 2570, 2378, 2186, 1990, 1794, 1598, 1400, 1202, 1002, 802, 602, 402, 202, 0, -202, -402, -602, -802, -1002, -1202, -1400, -1598, -1794, -1990, -2186, -2378, -2570, -2760, -2948, -3136, -3320, -3502, -3684, -3862, -4038, -4212, -4382, -4552, -4718, -4880, -5040, -5198, -5352, -5502, -5648, -5792, -5934, -6070, -6204, -6332, -6458, -6580, -6698, -6812, -6922, -7026, -7128, -7226, -7318, -7406, -7490, -7568, -7644, -7714, -7778, -7840, -7896, -7946, -7994, -8034, -8072, -8104, -8130, -8152, -8170, -8182, -8190, -8192 }; mumble-1.3.4/3rdparty/opus-src/silk/tuning_parameters.h0000664000175000017500000001405714010707327023035 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef SILK_TUNING_PARAMETERS_H #define SILK_TUNING_PARAMETERS_H #ifdef __cplusplus extern "C" { #endif /* Decay time for bitreservoir */ #define BITRESERVOIR_DECAY_TIME_MS 500 /*******************/ /* Pitch estimator */ /*******************/ /* Level of noise floor for whitening filter LPC analysis in pitch analysis */ #define FIND_PITCH_WHITE_NOISE_FRACTION 1e-3f /* Bandwidth expansion for whitening filter in pitch analysis */ #define FIND_PITCH_BANDWIDTH_EXPANSION 0.99f /*********************/ /* Linear prediction */ /*********************/ /* LPC analysis regularization */ #define FIND_LPC_COND_FAC 1e-5f /* Max cumulative LTP gain */ #define MAX_SUM_LOG_GAIN_DB 250.0f /* LTP analysis defines */ #define LTP_CORR_INV_MAX 0.03f /***********************/ /* High pass filtering */ /***********************/ /* Smoothing parameters for low end of pitch frequency range estimation */ #define VARIABLE_HP_SMTH_COEF1 0.1f #define VARIABLE_HP_SMTH_COEF2 0.015f #define VARIABLE_HP_MAX_DELTA_FREQ 0.4f /* Min and max cut-off frequency values (-3 dB points) */ #define VARIABLE_HP_MIN_CUTOFF_HZ 60 #define VARIABLE_HP_MAX_CUTOFF_HZ 100 /***********/ /* Various */ /***********/ /* VAD threshold */ #define SPEECH_ACTIVITY_DTX_THRES 0.05f /* Speech Activity LBRR enable threshold */ #define LBRR_SPEECH_ACTIVITY_THRES 0.3f /*************************/ /* Perceptual parameters */ /*************************/ /* reduction in coding SNR during low speech activity */ #define BG_SNR_DECR_dB 2.0f /* factor for reducing quantization noise during voiced speech */ #define HARM_SNR_INCR_dB 2.0f /* factor for reducing quantization noise for unvoiced sparse signals */ #define SPARSE_SNR_INCR_dB 2.0f /* threshold for sparseness measure above which to use lower quantization offset during unvoiced */ #define ENERGY_VARIATION_THRESHOLD_QNT_OFFSET 0.6f /* warping control */ #define WARPING_MULTIPLIER 0.015f /* fraction added to first autocorrelation value */ #define SHAPE_WHITE_NOISE_FRACTION 3e-5f /* noise shaping filter chirp factor */ #define BANDWIDTH_EXPANSION 0.94f /* harmonic noise shaping */ #define HARMONIC_SHAPING 0.3f /* extra harmonic noise shaping for high bitrates or noisy input */ #define HIGH_RATE_OR_LOW_QUALITY_HARMONIC_SHAPING 0.2f /* parameter for shaping noise towards higher frequencies */ #define HP_NOISE_COEF 0.25f /* parameter for shaping noise even more towards higher frequencies during voiced speech */ #define HARM_HP_NOISE_COEF 0.35f /* parameter for applying a high-pass tilt to the input signal */ #define INPUT_TILT 0.05f /* parameter for extra high-pass tilt to the input signal at high rates */ #define HIGH_RATE_INPUT_TILT 0.1f /* parameter for reducing noise at the very low frequencies */ #define LOW_FREQ_SHAPING 4.0f /* less reduction of noise at the very low frequencies for signals with low SNR at low frequencies */ #define LOW_QUALITY_LOW_FREQ_SHAPING_DECR 0.5f /* subframe smoothing coefficient for HarmBoost, HarmShapeGain, Tilt (lower -> more smoothing) */ #define SUBFR_SMTH_COEF 0.4f /* parameters defining the R/D tradeoff in the residual quantizer */ #define LAMBDA_OFFSET 1.2f #define LAMBDA_SPEECH_ACT -0.2f #define LAMBDA_DELAYED_DECISIONS -0.05f #define LAMBDA_INPUT_QUALITY -0.1f #define LAMBDA_CODING_QUALITY -0.2f #define LAMBDA_QUANT_OFFSET 0.8f /* Compensation in bitrate calculations for 10 ms modes */ #define REDUCE_BITRATE_10_MS_BPS 2200 /* Maximum time before allowing a bandwidth transition */ #define MAX_BANDWIDTH_SWITCH_DELAY_MS 5000 #ifdef __cplusplus } #endif #endif /* SILK_TUNING_PARAMETERS_H */ mumble-1.3.4/3rdparty/opus-src/silk/macros.h0000664000175000017500000001442414010707327020570 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef SILK_MACROS_H #define SILK_MACROS_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "opus_types.h" #include "opus_defines.h" #include "arch.h" /* This is an OPUS_INLINE header file for general platform. */ /* (a32 * (opus_int32)((opus_int16)(b32))) >> 16 output have to be 32bit int */ #if OPUS_FAST_INT64 #define silk_SMULWB(a32, b32) ((opus_int32)(((a32) * (opus_int64)((opus_int16)(b32))) >> 16)) #else #define silk_SMULWB(a32, b32) ((((a32) >> 16) * (opus_int32)((opus_int16)(b32))) + ((((a32) & 0x0000FFFF) * (opus_int32)((opus_int16)(b32))) >> 16)) #endif /* a32 + (b32 * (opus_int32)((opus_int16)(c32))) >> 16 output have to be 32bit int */ #if OPUS_FAST_INT64 #define silk_SMLAWB(a32, b32, c32) ((opus_int32)((a32) + (((b32) * (opus_int64)((opus_int16)(c32))) >> 16))) #else #define silk_SMLAWB(a32, b32, c32) ((a32) + ((((b32) >> 16) * (opus_int32)((opus_int16)(c32))) + ((((b32) & 0x0000FFFF) * (opus_int32)((opus_int16)(c32))) >> 16))) #endif /* (a32 * (b32 >> 16)) >> 16 */ #if OPUS_FAST_INT64 #define silk_SMULWT(a32, b32) ((opus_int32)(((a32) * (opus_int64)((b32) >> 16)) >> 16)) #else #define silk_SMULWT(a32, b32) (((a32) >> 16) * ((b32) >> 16) + ((((a32) & 0x0000FFFF) * ((b32) >> 16)) >> 16)) #endif /* a32 + (b32 * (c32 >> 16)) >> 16 */ #if OPUS_FAST_INT64 #define silk_SMLAWT(a32, b32, c32) ((opus_int32)((a32) + (((b32) * ((opus_int64)(c32) >> 16)) >> 16))) #else #define silk_SMLAWT(a32, b32, c32) ((a32) + (((b32) >> 16) * ((c32) >> 16)) + ((((b32) & 0x0000FFFF) * ((c32) >> 16)) >> 16)) #endif /* (opus_int32)((opus_int16)(a3))) * (opus_int32)((opus_int16)(b32)) output have to be 32bit int */ #define silk_SMULBB(a32, b32) ((opus_int32)((opus_int16)(a32)) * (opus_int32)((opus_int16)(b32))) /* a32 + (opus_int32)((opus_int16)(b32)) * (opus_int32)((opus_int16)(c32)) output have to be 32bit int */ #define silk_SMLABB(a32, b32, c32) ((a32) + ((opus_int32)((opus_int16)(b32))) * (opus_int32)((opus_int16)(c32))) /* (opus_int32)((opus_int16)(a32)) * (b32 >> 16) */ #define silk_SMULBT(a32, b32) ((opus_int32)((opus_int16)(a32)) * ((b32) >> 16)) /* a32 + (opus_int32)((opus_int16)(b32)) * (c32 >> 16) */ #define silk_SMLABT(a32, b32, c32) ((a32) + ((opus_int32)((opus_int16)(b32))) * ((c32) >> 16)) /* a64 + (b32 * c32) */ #define silk_SMLAL(a64, b32, c32) (silk_ADD64((a64), ((opus_int64)(b32) * (opus_int64)(c32)))) /* (a32 * b32) >> 16 */ #if OPUS_FAST_INT64 #define silk_SMULWW(a32, b32) ((opus_int32)(((opus_int64)(a32) * (b32)) >> 16)) #else #define silk_SMULWW(a32, b32) silk_MLA(silk_SMULWB((a32), (b32)), (a32), silk_RSHIFT_ROUND((b32), 16)) #endif /* a32 + ((b32 * c32) >> 16) */ #if OPUS_FAST_INT64 #define silk_SMLAWW(a32, b32, c32) ((opus_int32)((a32) + (((opus_int64)(b32) * (c32)) >> 16))) #else #define silk_SMLAWW(a32, b32, c32) silk_MLA(silk_SMLAWB((a32), (b32), (c32)), (b32), silk_RSHIFT_ROUND((c32), 16)) #endif /* add/subtract with output saturated */ #define silk_ADD_SAT32(a, b) ((((opus_uint32)(a) + (opus_uint32)(b)) & 0x80000000) == 0 ? \ ((((a) & (b)) & 0x80000000) != 0 ? silk_int32_MIN : (a)+(b)) : \ ((((a) | (b)) & 0x80000000) == 0 ? silk_int32_MAX : (a)+(b)) ) #define silk_SUB_SAT32(a, b) ((((opus_uint32)(a)-(opus_uint32)(b)) & 0x80000000) == 0 ? \ (( (a) & ((b)^0x80000000) & 0x80000000) ? silk_int32_MIN : (a)-(b)) : \ ((((a)^0x80000000) & (b) & 0x80000000) ? silk_int32_MAX : (a)-(b)) ) #if defined(MIPSr1_ASM) #include "mips/macros_mipsr1.h" #endif #include "ecintrin.h" #ifndef OVERRIDE_silk_CLZ16 static OPUS_INLINE opus_int32 silk_CLZ16(opus_int16 in16) { return 32 - EC_ILOG(in16<<16|0x8000); } #endif #ifndef OVERRIDE_silk_CLZ32 static OPUS_INLINE opus_int32 silk_CLZ32(opus_int32 in32) { return in32 ? 32 - EC_ILOG(in32) : 32; } #endif /* Row based */ #define matrix_ptr(Matrix_base_adr, row, column, N) \ (*((Matrix_base_adr) + ((row)*(N)+(column)))) #define matrix_adr(Matrix_base_adr, row, column, N) \ ((Matrix_base_adr) + ((row)*(N)+(column))) /* Column based */ #ifndef matrix_c_ptr # define matrix_c_ptr(Matrix_base_adr, row, column, M) \ (*((Matrix_base_adr) + ((row)+(M)*(column)))) #endif #ifdef OPUS_ARM_INLINE_ASM #include "arm/macros_armv4.h" #endif #ifdef OPUS_ARM_INLINE_EDSP #include "arm/macros_armv5e.h" #endif #ifdef OPUS_ARM_PRESUME_AARCH64_NEON_INTR #include "arm/macros_arm64.h" #endif #endif /* SILK_MACROS_H */ mumble-1.3.4/3rdparty/opus-src/silk/LP_variable_cutoff.c0000664000175000017500000001463014010707327023024 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif /* Elliptic/Cauer filters designed with 0.1 dB passband ripple, 80 dB minimum stopband attenuation, and [0.95 : 0.15 : 0.35] normalized cut off frequencies. */ #include "main.h" /* Helper function, interpolates the filter taps */ static OPUS_INLINE void silk_LP_interpolate_filter_taps( opus_int32 B_Q28[ TRANSITION_NB ], opus_int32 A_Q28[ TRANSITION_NA ], const opus_int ind, const opus_int32 fac_Q16 ) { opus_int nb, na; if( ind < TRANSITION_INT_NUM - 1 ) { if( fac_Q16 > 0 ) { if( fac_Q16 < 32768 ) { /* fac_Q16 is in range of a 16-bit int */ /* Piece-wise linear interpolation of B and A */ for( nb = 0; nb < TRANSITION_NB; nb++ ) { B_Q28[ nb ] = silk_SMLAWB( silk_Transition_LP_B_Q28[ ind ][ nb ], silk_Transition_LP_B_Q28[ ind + 1 ][ nb ] - silk_Transition_LP_B_Q28[ ind ][ nb ], fac_Q16 ); } for( na = 0; na < TRANSITION_NA; na++ ) { A_Q28[ na ] = silk_SMLAWB( silk_Transition_LP_A_Q28[ ind ][ na ], silk_Transition_LP_A_Q28[ ind + 1 ][ na ] - silk_Transition_LP_A_Q28[ ind ][ na ], fac_Q16 ); } } else { /* ( fac_Q16 - ( 1 << 16 ) ) is in range of a 16-bit int */ silk_assert( fac_Q16 - ( 1 << 16 ) == silk_SAT16( fac_Q16 - ( 1 << 16 ) ) ); /* Piece-wise linear interpolation of B and A */ for( nb = 0; nb < TRANSITION_NB; nb++ ) { B_Q28[ nb ] = silk_SMLAWB( silk_Transition_LP_B_Q28[ ind + 1 ][ nb ], silk_Transition_LP_B_Q28[ ind + 1 ][ nb ] - silk_Transition_LP_B_Q28[ ind ][ nb ], fac_Q16 - ( (opus_int32)1 << 16 ) ); } for( na = 0; na < TRANSITION_NA; na++ ) { A_Q28[ na ] = silk_SMLAWB( silk_Transition_LP_A_Q28[ ind + 1 ][ na ], silk_Transition_LP_A_Q28[ ind + 1 ][ na ] - silk_Transition_LP_A_Q28[ ind ][ na ], fac_Q16 - ( (opus_int32)1 << 16 ) ); } } } else { silk_memcpy( B_Q28, silk_Transition_LP_B_Q28[ ind ], TRANSITION_NB * sizeof( opus_int32 ) ); silk_memcpy( A_Q28, silk_Transition_LP_A_Q28[ ind ], TRANSITION_NA * sizeof( opus_int32 ) ); } } else { silk_memcpy( B_Q28, silk_Transition_LP_B_Q28[ TRANSITION_INT_NUM - 1 ], TRANSITION_NB * sizeof( opus_int32 ) ); silk_memcpy( A_Q28, silk_Transition_LP_A_Q28[ TRANSITION_INT_NUM - 1 ], TRANSITION_NA * sizeof( opus_int32 ) ); } } /* Low-pass filter with variable cutoff frequency based on */ /* piece-wise linear interpolation between elliptic filters */ /* Start by setting psEncC->mode <> 0; */ /* Deactivate by setting psEncC->mode = 0; */ void silk_LP_variable_cutoff( silk_LP_state *psLP, /* I/O LP filter state */ opus_int16 *frame, /* I/O Low-pass filtered output signal */ const opus_int frame_length /* I Frame length */ ) { opus_int32 B_Q28[ TRANSITION_NB ], A_Q28[ TRANSITION_NA ], fac_Q16 = 0; opus_int ind = 0; silk_assert( psLP->transition_frame_no >= 0 && psLP->transition_frame_no <= TRANSITION_FRAMES ); /* Run filter if needed */ if( psLP->mode != 0 ) { /* Calculate index and interpolation factor for interpolation */ #if( TRANSITION_INT_STEPS == 64 ) fac_Q16 = silk_LSHIFT( TRANSITION_FRAMES - psLP->transition_frame_no, 16 - 6 ); #else fac_Q16 = silk_DIV32_16( silk_LSHIFT( TRANSITION_FRAMES - psLP->transition_frame_no, 16 ), TRANSITION_FRAMES ); #endif ind = silk_RSHIFT( fac_Q16, 16 ); fac_Q16 -= silk_LSHIFT( ind, 16 ); silk_assert( ind >= 0 ); silk_assert( ind < TRANSITION_INT_NUM ); /* Interpolate filter coefficients */ silk_LP_interpolate_filter_taps( B_Q28, A_Q28, ind, fac_Q16 ); /* Update transition frame number for next frame */ psLP->transition_frame_no = silk_LIMIT( psLP->transition_frame_no + psLP->mode, 0, TRANSITION_FRAMES ); /* ARMA low-pass filtering */ silk_assert( TRANSITION_NB == 3 && TRANSITION_NA == 2 ); silk_biquad_alt_stride1( frame, B_Q28, A_Q28, psLP->In_LP_State, frame, frame_length); } } mumble-1.3.4/3rdparty/opus-src/silk/MacroDebug.h0000664000175000017500000010137014010707327021311 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Copyright (C) 2012 Xiph.Org Foundation Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef MACRO_DEBUG_H #define MACRO_DEBUG_H /* Redefine macro functions with extensive assertion in DEBUG mode. As functions can't be undefined, this file can't work with SigProcFIX_MacroCount.h */ #if ( defined (FIXED_DEBUG) || ( 0 && defined (_DEBUG) ) ) && !defined (silk_MACRO_COUNT) #undef silk_ADD16 #define silk_ADD16(a,b) silk_ADD16_((a), (b), __FILE__, __LINE__) static OPUS_INLINE opus_int16 silk_ADD16_(opus_int16 a, opus_int16 b, char *file, int line){ opus_int16 ret; ret = a + b; if ( ret != silk_ADD_SAT16( a, b ) ) { fprintf (stderr, "silk_ADD16(%d, %d) in %s: line %d\n", a, b, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return ret; } #undef silk_ADD32 #define silk_ADD32(a,b) silk_ADD32_((a), (b), __FILE__, __LINE__) static OPUS_INLINE opus_int32 silk_ADD32_(opus_int32 a, opus_int32 b, char *file, int line){ opus_int32 ret; ret = a + b; if ( ret != silk_ADD_SAT32( a, b ) ) { fprintf (stderr, "silk_ADD32(%d, %d) in %s: line %d\n", a, b, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return ret; } #undef silk_ADD64 #define silk_ADD64(a,b) silk_ADD64_((a), (b), __FILE__, __LINE__) static OPUS_INLINE opus_int64 silk_ADD64_(opus_int64 a, opus_int64 b, char *file, int line){ opus_int64 ret; ret = a + b; if ( ret != silk_ADD_SAT64( a, b ) ) { fprintf (stderr, "silk_ADD64(%lld, %lld) in %s: line %d\n", (long long)a, (long long)b, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return ret; } #undef silk_SUB16 #define silk_SUB16(a,b) silk_SUB16_((a), (b), __FILE__, __LINE__) static OPUS_INLINE opus_int16 silk_SUB16_(opus_int16 a, opus_int16 b, char *file, int line){ opus_int16 ret; ret = a - b; if ( ret != silk_SUB_SAT16( a, b ) ) { fprintf (stderr, "silk_SUB16(%d, %d) in %s: line %d\n", a, b, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return ret; } #undef silk_SUB32 #define silk_SUB32(a,b) silk_SUB32_((a), (b), __FILE__, __LINE__) static OPUS_INLINE opus_int32 silk_SUB32_(opus_int32 a, opus_int32 b, char *file, int line){ opus_int32 ret; ret = a - b; if ( ret != silk_SUB_SAT32( a, b ) ) { fprintf (stderr, "silk_SUB32(%d, %d) in %s: line %d\n", a, b, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return ret; } #undef silk_SUB64 #define silk_SUB64(a,b) silk_SUB64_((a), (b), __FILE__, __LINE__) static OPUS_INLINE opus_int64 silk_SUB64_(opus_int64 a, opus_int64 b, char *file, int line){ opus_int64 ret; ret = a - b; if ( ret != silk_SUB_SAT64( a, b ) ) { fprintf (stderr, "silk_SUB64(%lld, %lld) in %s: line %d\n", (long long)a, (long long)b, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return ret; } #undef silk_ADD_SAT16 #define silk_ADD_SAT16(a,b) silk_ADD_SAT16_((a), (b), __FILE__, __LINE__) static OPUS_INLINE opus_int16 silk_ADD_SAT16_( opus_int16 a16, opus_int16 b16, char *file, int line) { opus_int16 res; res = (opus_int16)silk_SAT16( silk_ADD32( (opus_int32)(a16), (b16) ) ); if ( res != silk_SAT16( (opus_int32)a16 + (opus_int32)b16 ) ) { fprintf (stderr, "silk_ADD_SAT16(%d, %d) in %s: line %d\n", a16, b16, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return res; } #undef silk_ADD_SAT32 #define silk_ADD_SAT32(a,b) silk_ADD_SAT32_((a), (b), __FILE__, __LINE__) static OPUS_INLINE opus_int32 silk_ADD_SAT32_(opus_int32 a32, opus_int32 b32, char *file, int line){ opus_int32 res; res = ((((opus_uint32)(a32) + (opus_uint32)(b32)) & 0x80000000) == 0 ? \ ((((a32) & (b32)) & 0x80000000) != 0 ? silk_int32_MIN : (a32)+(b32)) : \ ((((a32) | (b32)) & 0x80000000) == 0 ? silk_int32_MAX : (a32)+(b32)) ); if ( res != silk_SAT32( (opus_int64)a32 + (opus_int64)b32 ) ) { fprintf (stderr, "silk_ADD_SAT32(%d, %d) in %s: line %d\n", a32, b32, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return res; } #undef silk_ADD_SAT64 #define silk_ADD_SAT64(a,b) silk_ADD_SAT64_((a), (b), __FILE__, __LINE__) static OPUS_INLINE opus_int64 silk_ADD_SAT64_( opus_int64 a64, opus_int64 b64, char *file, int line) { opus_int64 res; int fail = 0; res = ((((a64) + (b64)) & 0x8000000000000000LL) == 0 ? \ ((((a64) & (b64)) & 0x8000000000000000LL) != 0 ? silk_int64_MIN : (a64)+(b64)) : \ ((((a64) | (b64)) & 0x8000000000000000LL) == 0 ? silk_int64_MAX : (a64)+(b64)) ); if( res != a64 + b64 ) { /* Check that we saturated to the correct extreme value */ if ( !(( res == silk_int64_MAX && ( ( a64 >> 1 ) + ( b64 >> 1 ) > ( silk_int64_MAX >> 3 ) ) ) || ( res == silk_int64_MIN && ( ( a64 >> 1 ) + ( b64 >> 1 ) < ( silk_int64_MIN >> 3 ) ) ) ) ) { fail = 1; } } else { /* Saturation not necessary */ fail = res != a64 + b64; } if ( fail ) { fprintf (stderr, "silk_ADD_SAT64(%lld, %lld) in %s: line %d\n", (long long)a64, (long long)b64, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return res; } #undef silk_SUB_SAT16 #define silk_SUB_SAT16(a,b) silk_SUB_SAT16_((a), (b), __FILE__, __LINE__) static OPUS_INLINE opus_int16 silk_SUB_SAT16_( opus_int16 a16, opus_int16 b16, char *file, int line ) { opus_int16 res; res = (opus_int16)silk_SAT16( silk_SUB32( (opus_int32)(a16), (b16) ) ); if ( res != silk_SAT16( (opus_int32)a16 - (opus_int32)b16 ) ) { fprintf (stderr, "silk_SUB_SAT16(%d, %d) in %s: line %d\n", a16, b16, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return res; } #undef silk_SUB_SAT32 #define silk_SUB_SAT32(a,b) silk_SUB_SAT32_((a), (b), __FILE__, __LINE__) static OPUS_INLINE opus_int32 silk_SUB_SAT32_( opus_int32 a32, opus_int32 b32, char *file, int line ) { opus_int32 res; res = ((((opus_uint32)(a32)-(opus_uint32)(b32)) & 0x80000000) == 0 ? \ (( (a32) & ((b32)^0x80000000) & 0x80000000) ? silk_int32_MIN : (a32)-(b32)) : \ ((((a32)^0x80000000) & (b32) & 0x80000000) ? silk_int32_MAX : (a32)-(b32)) ); if ( res != silk_SAT32( (opus_int64)a32 - (opus_int64)b32 ) ) { fprintf (stderr, "silk_SUB_SAT32(%d, %d) in %s: line %d\n", a32, b32, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return res; } #undef silk_SUB_SAT64 #define silk_SUB_SAT64(a,b) silk_SUB_SAT64_((a), (b), __FILE__, __LINE__) static OPUS_INLINE opus_int64 silk_SUB_SAT64_( opus_int64 a64, opus_int64 b64, char *file, int line ) { opus_int64 res; int fail = 0; res = ((((a64)-(b64)) & 0x8000000000000000LL) == 0 ? \ (( (a64) & ((b64)^0x8000000000000000LL) & 0x8000000000000000LL) ? silk_int64_MIN : (a64)-(b64)) : \ ((((a64)^0x8000000000000000LL) & (b64) & 0x8000000000000000LL) ? silk_int64_MAX : (a64)-(b64)) ); if( res != a64 - b64 ) { /* Check that we saturated to the correct extreme value */ if( !(( res == silk_int64_MAX && ( ( a64 >> 1 ) + ( b64 >> 1 ) > ( silk_int64_MAX >> 3 ) ) ) || ( res == silk_int64_MIN && ( ( a64 >> 1 ) + ( b64 >> 1 ) < ( silk_int64_MIN >> 3 ) ) ) )) { fail = 1; } } else { /* Saturation not necessary */ fail = res != a64 - b64; } if ( fail ) { fprintf (stderr, "silk_SUB_SAT64(%lld, %lld) in %s: line %d\n", (long long)a64, (long long)b64, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return res; } #undef silk_MUL #define silk_MUL(a,b) silk_MUL_((a), (b), __FILE__, __LINE__) static OPUS_INLINE opus_int32 silk_MUL_(opus_int32 a32, opus_int32 b32, char *file, int line){ opus_int32 ret; opus_int64 ret64; ret = a32 * b32; ret64 = (opus_int64)a32 * (opus_int64)b32; if ( (opus_int64)ret != ret64 ) { fprintf (stderr, "silk_MUL(%d, %d) in %s: line %d\n", a32, b32, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return ret; } #undef silk_MUL_uint #define silk_MUL_uint(a,b) silk_MUL_uint_((a), (b), __FILE__, __LINE__) static OPUS_INLINE opus_uint32 silk_MUL_uint_(opus_uint32 a32, opus_uint32 b32, char *file, int line){ opus_uint32 ret; ret = a32 * b32; if ( (opus_uint64)ret != (opus_uint64)a32 * (opus_uint64)b32 ) { fprintf (stderr, "silk_MUL_uint(%u, %u) in %s: line %d\n", a32, b32, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return ret; } #undef silk_MLA #define silk_MLA(a,b,c) silk_MLA_((a), (b), (c), __FILE__, __LINE__) static OPUS_INLINE opus_int32 silk_MLA_(opus_int32 a32, opus_int32 b32, opus_int32 c32, char *file, int line){ opus_int32 ret; ret = a32 + b32 * c32; if ( (opus_int64)ret != (opus_int64)a32 + (opus_int64)b32 * (opus_int64)c32 ) { fprintf (stderr, "silk_MLA(%d, %d, %d) in %s: line %d\n", a32, b32, c32, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return ret; } #undef silk_MLA_uint #define silk_MLA_uint(a,b,c) silk_MLA_uint_((a), (b), (c), __FILE__, __LINE__) static OPUS_INLINE opus_int32 silk_MLA_uint_(opus_uint32 a32, opus_uint32 b32, opus_uint32 c32, char *file, int line){ opus_uint32 ret; ret = a32 + b32 * c32; if ( (opus_int64)ret != (opus_int64)a32 + (opus_int64)b32 * (opus_int64)c32 ) { fprintf (stderr, "silk_MLA_uint(%d, %d, %d) in %s: line %d\n", a32, b32, c32, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return ret; } #undef silk_SMULWB #define silk_SMULWB(a,b) silk_SMULWB_((a), (b), __FILE__, __LINE__) static OPUS_INLINE opus_int32 silk_SMULWB_(opus_int32 a32, opus_int32 b32, char *file, int line){ opus_int32 ret; ret = (a32 >> 16) * (opus_int32)((opus_int16)b32) + (((a32 & 0x0000FFFF) * (opus_int32)((opus_int16)b32)) >> 16); if ( (opus_int64)ret != ((opus_int64)a32 * (opus_int16)b32) >> 16 ) { fprintf (stderr, "silk_SMULWB(%d, %d) in %s: line %d\n", a32, b32, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return ret; } #undef silk_SMLAWB #define silk_SMLAWB(a,b,c) silk_SMLAWB_((a), (b), (c), __FILE__, __LINE__) static OPUS_INLINE opus_int32 silk_SMLAWB_(opus_int32 a32, opus_int32 b32, opus_int32 c32, char *file, int line){ opus_int32 ret; ret = silk_ADD32( a32, silk_SMULWB( b32, c32 ) ); if ( silk_ADD32( a32, silk_SMULWB( b32, c32 ) ) != silk_ADD_SAT32( a32, silk_SMULWB( b32, c32 ) ) ) { fprintf (stderr, "silk_SMLAWB(%d, %d, %d) in %s: line %d\n", a32, b32, c32, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return ret; } #undef silk_SMULWT #define silk_SMULWT(a,b) silk_SMULWT_((a), (b), __FILE__, __LINE__) static OPUS_INLINE opus_int32 silk_SMULWT_(opus_int32 a32, opus_int32 b32, char *file, int line){ opus_int32 ret; ret = (a32 >> 16) * (b32 >> 16) + (((a32 & 0x0000FFFF) * (b32 >> 16)) >> 16); if ( (opus_int64)ret != ((opus_int64)a32 * (b32 >> 16)) >> 16 ) { fprintf (stderr, "silk_SMULWT(%d, %d) in %s: line %d\n", a32, b32, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return ret; } #undef silk_SMLAWT #define silk_SMLAWT(a,b,c) silk_SMLAWT_((a), (b), (c), __FILE__, __LINE__) static OPUS_INLINE opus_int32 silk_SMLAWT_(opus_int32 a32, opus_int32 b32, opus_int32 c32, char *file, int line){ opus_int32 ret; ret = a32 + ((b32 >> 16) * (c32 >> 16)) + (((b32 & 0x0000FFFF) * ((c32 >> 16)) >> 16)); if ( (opus_int64)ret != (opus_int64)a32 + (((opus_int64)b32 * (c32 >> 16)) >> 16) ) { fprintf (stderr, "silk_SMLAWT(%d, %d, %d) in %s: line %d\n", a32, b32, c32, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return ret; } #undef silk_SMULL #define silk_SMULL(a,b) silk_SMULL_((a), (b), __FILE__, __LINE__) static OPUS_INLINE opus_int64 silk_SMULL_(opus_int64 a64, opus_int64 b64, char *file, int line){ opus_int64 ret64; int fail = 0; ret64 = a64 * b64; if( b64 != 0 ) { fail = a64 != (ret64 / b64); } else if( a64 != 0 ) { fail = b64 != (ret64 / a64); } if ( fail ) { fprintf (stderr, "silk_SMULL(%lld, %lld) in %s: line %d\n", (long long)a64, (long long)b64, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return ret64; } /* no checking needed for silk_SMULBB */ #undef silk_SMLABB #define silk_SMLABB(a,b,c) silk_SMLABB_((a), (b), (c), __FILE__, __LINE__) static OPUS_INLINE opus_int32 silk_SMLABB_(opus_int32 a32, opus_int32 b32, opus_int32 c32, char *file, int line){ opus_int32 ret; ret = a32 + (opus_int32)((opus_int16)b32) * (opus_int32)((opus_int16)c32); if ( (opus_int64)ret != (opus_int64)a32 + (opus_int64)b32 * (opus_int16)c32 ) { fprintf (stderr, "silk_SMLABB(%d, %d, %d) in %s: line %d\n", a32, b32, c32, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return ret; } /* no checking needed for silk_SMULBT */ #undef silk_SMLABT #define silk_SMLABT(a,b,c) silk_SMLABT_((a), (b), (c), __FILE__, __LINE__) static OPUS_INLINE opus_int32 silk_SMLABT_(opus_int32 a32, opus_int32 b32, opus_int32 c32, char *file, int line){ opus_int32 ret; ret = a32 + ((opus_int32)((opus_int16)b32)) * (c32 >> 16); if ( (opus_int64)ret != (opus_int64)a32 + (opus_int64)b32 * (c32 >> 16) ) { fprintf (stderr, "silk_SMLABT(%d, %d, %d) in %s: line %d\n", a32, b32, c32, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return ret; } /* no checking needed for silk_SMULTT */ #undef silk_SMLATT #define silk_SMLATT(a,b,c) silk_SMLATT_((a), (b), (c), __FILE__, __LINE__) static OPUS_INLINE opus_int32 silk_SMLATT_(opus_int32 a32, opus_int32 b32, opus_int32 c32, char *file, int line){ opus_int32 ret; ret = a32 + (b32 >> 16) * (c32 >> 16); if ( (opus_int64)ret != (opus_int64)a32 + (b32 >> 16) * (c32 >> 16) ) { fprintf (stderr, "silk_SMLATT(%d, %d, %d) in %s: line %d\n", a32, b32, c32, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return ret; } #undef silk_SMULWW #define silk_SMULWW(a,b) silk_SMULWW_((a), (b), __FILE__, __LINE__) static OPUS_INLINE opus_int32 silk_SMULWW_(opus_int32 a32, opus_int32 b32, char *file, int line){ opus_int32 ret, tmp1, tmp2; opus_int64 ret64; int fail = 0; ret = silk_SMULWB( a32, b32 ); tmp1 = silk_RSHIFT_ROUND( b32, 16 ); tmp2 = silk_MUL( a32, tmp1 ); fail |= (opus_int64)tmp2 != (opus_int64) a32 * (opus_int64) tmp1; tmp1 = ret; ret = silk_ADD32( tmp1, tmp2 ); fail |= silk_ADD32( tmp1, tmp2 ) != silk_ADD_SAT32( tmp1, tmp2 ); ret64 = silk_RSHIFT64( silk_SMULL( a32, b32 ), 16 ); fail |= (opus_int64)ret != ret64; if ( fail ) { fprintf (stderr, "silk_SMULWT(%d, %d) in %s: line %d\n", a32, b32, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return ret; } #undef silk_SMLAWW #define silk_SMLAWW(a,b,c) silk_SMLAWW_((a), (b), (c), __FILE__, __LINE__) static OPUS_INLINE opus_int32 silk_SMLAWW_(opus_int32 a32, opus_int32 b32, opus_int32 c32, char *file, int line){ opus_int32 ret, tmp; tmp = silk_SMULWW( b32, c32 ); ret = silk_ADD32( a32, tmp ); if ( ret != silk_ADD_SAT32( a32, tmp ) ) { fprintf (stderr, "silk_SMLAWW(%d, %d, %d) in %s: line %d\n", a32, b32, c32, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return ret; } /* Multiply-accumulate macros that allow overflow in the addition (ie, no asserts in debug mode) */ #undef silk_MLA_ovflw #define silk_MLA_ovflw(a32, b32, c32) ((a32) + ((b32) * (c32))) #undef silk_SMLABB_ovflw #define silk_SMLABB_ovflw(a32, b32, c32) ((a32) + ((opus_int32)((opus_int16)(b32))) * (opus_int32)((opus_int16)(c32))) /* no checking needed for silk_SMULL no checking needed for silk_SMLAL no checking needed for silk_SMLALBB no checking needed for SigProcFIX_CLZ16 no checking needed for SigProcFIX_CLZ32*/ #undef silk_DIV32 #define silk_DIV32(a,b) silk_DIV32_((a), (b), __FILE__, __LINE__) static OPUS_INLINE opus_int32 silk_DIV32_(opus_int32 a32, opus_int32 b32, char *file, int line){ if ( b32 == 0 ) { fprintf (stderr, "silk_DIV32(%d, %d) in %s: line %d\n", a32, b32, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return a32 / b32; } #undef silk_DIV32_16 #define silk_DIV32_16(a,b) silk_DIV32_16_((a), (b), __FILE__, __LINE__) static OPUS_INLINE opus_int32 silk_DIV32_16_(opus_int32 a32, opus_int32 b32, char *file, int line){ int fail = 0; fail |= b32 == 0; fail |= b32 > silk_int16_MAX; fail |= b32 < silk_int16_MIN; if ( fail ) { fprintf (stderr, "silk_DIV32_16(%d, %d) in %s: line %d\n", a32, b32, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return a32 / b32; } /* no checking needed for silk_SAT8 no checking needed for silk_SAT16 no checking needed for silk_SAT32 no checking needed for silk_POS_SAT32 no checking needed for silk_ADD_POS_SAT8 no checking needed for silk_ADD_POS_SAT16 no checking needed for silk_ADD_POS_SAT32 */ #undef silk_LSHIFT8 #define silk_LSHIFT8(a,b) silk_LSHIFT8_((a), (b), __FILE__, __LINE__) static OPUS_INLINE opus_int8 silk_LSHIFT8_(opus_int8 a, opus_int32 shift, char *file, int line){ opus_int8 ret; int fail = 0; ret = a << shift; fail |= shift < 0; fail |= shift >= 8; fail |= (opus_int64)ret != ((opus_int64)a) << shift; if ( fail ) { fprintf (stderr, "silk_LSHIFT8(%d, %d) in %s: line %d\n", a, shift, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return ret; } #undef silk_LSHIFT16 #define silk_LSHIFT16(a,b) silk_LSHIFT16_((a), (b), __FILE__, __LINE__) static OPUS_INLINE opus_int16 silk_LSHIFT16_(opus_int16 a, opus_int32 shift, char *file, int line){ opus_int16 ret; int fail = 0; ret = a << shift; fail |= shift < 0; fail |= shift >= 16; fail |= (opus_int64)ret != ((opus_int64)a) << shift; if ( fail ) { fprintf (stderr, "silk_LSHIFT16(%d, %d) in %s: line %d\n", a, shift, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return ret; } #undef silk_LSHIFT32 #define silk_LSHIFT32(a,b) silk_LSHIFT32_((a), (b), __FILE__, __LINE__) static OPUS_INLINE opus_int32 silk_LSHIFT32_(opus_int32 a, opus_int32 shift, char *file, int line){ opus_int32 ret; int fail = 0; ret = a << shift; fail |= shift < 0; fail |= shift >= 32; fail |= (opus_int64)ret != ((opus_int64)a) << shift; if ( fail ) { fprintf (stderr, "silk_LSHIFT32(%d, %d) in %s: line %d\n", a, shift, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return ret; } #undef silk_LSHIFT64 #define silk_LSHIFT64(a,b) silk_LSHIFT64_((a), (b), __FILE__, __LINE__) static OPUS_INLINE opus_int64 silk_LSHIFT64_(opus_int64 a, opus_int shift, char *file, int line){ opus_int64 ret; int fail = 0; ret = a << shift; fail |= shift < 0; fail |= shift >= 64; fail |= (ret>>shift) != ((opus_int64)a); if ( fail ) { fprintf (stderr, "silk_LSHIFT64(%lld, %d) in %s: line %d\n", (long long)a, shift, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return ret; } #undef silk_LSHIFT_ovflw #define silk_LSHIFT_ovflw(a,b) silk_LSHIFT_ovflw_((a), (b), __FILE__, __LINE__) static OPUS_INLINE opus_int32 silk_LSHIFT_ovflw_(opus_int32 a, opus_int32 shift, char *file, int line){ if ( (shift < 0) || (shift >= 32) ) /* no check for overflow */ { fprintf (stderr, "silk_LSHIFT_ovflw(%d, %d) in %s: line %d\n", a, shift, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return a << shift; } #undef silk_LSHIFT_uint #define silk_LSHIFT_uint(a,b) silk_LSHIFT_uint_((a), (b), __FILE__, __LINE__) static OPUS_INLINE opus_uint32 silk_LSHIFT_uint_(opus_uint32 a, opus_int32 shift, char *file, int line){ opus_uint32 ret; ret = a << shift; if ( (shift < 0) || ((opus_int64)ret != ((opus_int64)a) << shift)) { fprintf (stderr, "silk_LSHIFT_uint(%u, %d) in %s: line %d\n", a, shift, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return ret; } #undef silk_RSHIFT8 #define silk_RSHITF8(a,b) silk_RSHIFT8_((a), (b), __FILE__, __LINE__) static OPUS_INLINE opus_int8 silk_RSHIFT8_(opus_int8 a, opus_int32 shift, char *file, int line){ if ( (shift < 0) || (shift>=8) ) { fprintf (stderr, "silk_RSHITF8(%d, %d) in %s: line %d\n", a, shift, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return a >> shift; } #undef silk_RSHIFT16 #define silk_RSHITF16(a,b) silk_RSHIFT16_((a), (b), __FILE__, __LINE__) static OPUS_INLINE opus_int16 silk_RSHIFT16_(opus_int16 a, opus_int32 shift, char *file, int line){ if ( (shift < 0) || (shift>=16) ) { fprintf (stderr, "silk_RSHITF16(%d, %d) in %s: line %d\n", a, shift, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return a >> shift; } #undef silk_RSHIFT32 #define silk_RSHIFT32(a,b) silk_RSHIFT32_((a), (b), __FILE__, __LINE__) static OPUS_INLINE opus_int32 silk_RSHIFT32_(opus_int32 a, opus_int32 shift, char *file, int line){ if ( (shift < 0) || (shift>=32) ) { fprintf (stderr, "silk_RSHITF32(%d, %d) in %s: line %d\n", a, shift, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return a >> shift; } #undef silk_RSHIFT64 #define silk_RSHIFT64(a,b) silk_RSHIFT64_((a), (b), __FILE__, __LINE__) static OPUS_INLINE opus_int64 silk_RSHIFT64_(opus_int64 a, opus_int64 shift, char *file, int line){ if ( (shift < 0) || (shift>=64) ) { fprintf (stderr, "silk_RSHITF64(%lld, %lld) in %s: line %d\n", (long long)a, (long long)shift, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return a >> shift; } #undef silk_RSHIFT_uint #define silk_RSHIFT_uint(a,b) silk_RSHIFT_uint_((a), (b), __FILE__, __LINE__) static OPUS_INLINE opus_uint32 silk_RSHIFT_uint_(opus_uint32 a, opus_int32 shift, char *file, int line){ if ( (shift < 0) || (shift>32) ) { fprintf (stderr, "silk_RSHIFT_uint(%u, %d) in %s: line %d\n", a, shift, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return a >> shift; } #undef silk_ADD_LSHIFT #define silk_ADD_LSHIFT(a,b,c) silk_ADD_LSHIFT_((a), (b), (c), __FILE__, __LINE__) static OPUS_INLINE int silk_ADD_LSHIFT_(int a, int b, int shift, char *file, int line){ opus_int16 ret; ret = a + (b << shift); if ( (shift < 0) || (shift>15) || ((opus_int64)ret != (opus_int64)a + (((opus_int64)b) << shift)) ) { fprintf (stderr, "silk_ADD_LSHIFT(%d, %d, %d) in %s: line %d\n", a, b, shift, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return ret; /* shift >= 0 */ } #undef silk_ADD_LSHIFT32 #define silk_ADD_LSHIFT32(a,b,c) silk_ADD_LSHIFT32_((a), (b), (c), __FILE__, __LINE__) static OPUS_INLINE opus_int32 silk_ADD_LSHIFT32_(opus_int32 a, opus_int32 b, opus_int32 shift, char *file, int line){ opus_int32 ret; ret = a + (b << shift); if ( (shift < 0) || (shift>31) || ((opus_int64)ret != (opus_int64)a + (((opus_int64)b) << shift)) ) { fprintf (stderr, "silk_ADD_LSHIFT32(%d, %d, %d) in %s: line %d\n", a, b, shift, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return ret; /* shift >= 0 */ } #undef silk_ADD_LSHIFT_uint #define silk_ADD_LSHIFT_uint(a,b,c) silk_ADD_LSHIFT_uint_((a), (b), (c), __FILE__, __LINE__) static OPUS_INLINE opus_uint32 silk_ADD_LSHIFT_uint_(opus_uint32 a, opus_uint32 b, opus_int32 shift, char *file, int line){ opus_uint32 ret; ret = a + (b << shift); if ( (shift < 0) || (shift>32) || ((opus_int64)ret != (opus_int64)a + (((opus_int64)b) << shift)) ) { fprintf (stderr, "silk_ADD_LSHIFT_uint(%u, %u, %d) in %s: line %d\n", a, b, shift, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return ret; /* shift >= 0 */ } #undef silk_ADD_RSHIFT #define silk_ADD_RSHIFT(a,b,c) silk_ADD_RSHIFT_((a), (b), (c), __FILE__, __LINE__) static OPUS_INLINE int silk_ADD_RSHIFT_(int a, int b, int shift, char *file, int line){ opus_int16 ret; ret = a + (b >> shift); if ( (shift < 0) || (shift>15) || ((opus_int64)ret != (opus_int64)a + (((opus_int64)b) >> shift)) ) { fprintf (stderr, "silk_ADD_RSHIFT(%d, %d, %d) in %s: line %d\n", a, b, shift, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return ret; /* shift > 0 */ } #undef silk_ADD_RSHIFT32 #define silk_ADD_RSHIFT32(a,b,c) silk_ADD_RSHIFT32_((a), (b), (c), __FILE__, __LINE__) static OPUS_INLINE opus_int32 silk_ADD_RSHIFT32_(opus_int32 a, opus_int32 b, opus_int32 shift, char *file, int line){ opus_int32 ret; ret = a + (b >> shift); if ( (shift < 0) || (shift>31) || ((opus_int64)ret != (opus_int64)a + (((opus_int64)b) >> shift)) ) { fprintf (stderr, "silk_ADD_RSHIFT32(%d, %d, %d) in %s: line %d\n", a, b, shift, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return ret; /* shift > 0 */ } #undef silk_ADD_RSHIFT_uint #define silk_ADD_RSHIFT_uint(a,b,c) silk_ADD_RSHIFT_uint_((a), (b), (c), __FILE__, __LINE__) static OPUS_INLINE opus_uint32 silk_ADD_RSHIFT_uint_(opus_uint32 a, opus_uint32 b, opus_int32 shift, char *file, int line){ opus_uint32 ret; ret = a + (b >> shift); if ( (shift < 0) || (shift>32) || ((opus_int64)ret != (opus_int64)a + (((opus_int64)b) >> shift)) ) { fprintf (stderr, "silk_ADD_RSHIFT_uint(%u, %u, %d) in %s: line %d\n", a, b, shift, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return ret; /* shift > 0 */ } #undef silk_SUB_LSHIFT32 #define silk_SUB_LSHIFT32(a,b,c) silk_SUB_LSHIFT32_((a), (b), (c), __FILE__, __LINE__) static OPUS_INLINE opus_int32 silk_SUB_LSHIFT32_(opus_int32 a, opus_int32 b, opus_int32 shift, char *file, int line){ opus_int32 ret; ret = a - (b << shift); if ( (shift < 0) || (shift>31) || ((opus_int64)ret != (opus_int64)a - (((opus_int64)b) << shift)) ) { fprintf (stderr, "silk_SUB_LSHIFT32(%d, %d, %d) in %s: line %d\n", a, b, shift, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return ret; /* shift >= 0 */ } #undef silk_SUB_RSHIFT32 #define silk_SUB_RSHIFT32(a,b,c) silk_SUB_RSHIFT32_((a), (b), (c), __FILE__, __LINE__) static OPUS_INLINE opus_int32 silk_SUB_RSHIFT32_(opus_int32 a, opus_int32 b, opus_int32 shift, char *file, int line){ opus_int32 ret; ret = a - (b >> shift); if ( (shift < 0) || (shift>31) || ((opus_int64)ret != (opus_int64)a - (((opus_int64)b) >> shift)) ) { fprintf (stderr, "silk_SUB_RSHIFT32(%d, %d, %d) in %s: line %d\n", a, b, shift, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return ret; /* shift > 0 */ } #undef silk_RSHIFT_ROUND #define silk_RSHIFT_ROUND(a,b) silk_RSHIFT_ROUND_((a), (b), __FILE__, __LINE__) static OPUS_INLINE opus_int32 silk_RSHIFT_ROUND_(opus_int32 a, opus_int32 shift, char *file, int line){ opus_int32 ret; ret = shift == 1 ? (a >> 1) + (a & 1) : ((a >> (shift - 1)) + 1) >> 1; /* the marco definition can't handle a shift of zero */ if ( (shift <= 0) || (shift>31) || ((opus_int64)ret != ((opus_int64)a + ((opus_int64)1 << (shift - 1))) >> shift) ) { fprintf (stderr, "silk_RSHIFT_ROUND(%d, %d) in %s: line %d\n", a, shift, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return ret; } #undef silk_RSHIFT_ROUND64 #define silk_RSHIFT_ROUND64(a,b) silk_RSHIFT_ROUND64_((a), (b), __FILE__, __LINE__) static OPUS_INLINE opus_int64 silk_RSHIFT_ROUND64_(opus_int64 a, opus_int32 shift, char *file, int line){ opus_int64 ret; /* the marco definition can't handle a shift of zero */ if ( (shift <= 0) || (shift>=64) ) { fprintf (stderr, "silk_RSHIFT_ROUND64(%lld, %d) in %s: line %d\n", (long long)a, shift, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } ret = shift == 1 ? (a >> 1) + (a & 1) : ((a >> (shift - 1)) + 1) >> 1; return ret; } /* silk_abs is used on floats also, so doesn't work... */ /*#undef silk_abs static OPUS_INLINE opus_int32 silk_abs(opus_int32 a){ silk_assert(a != 0x80000000); return (((a) > 0) ? (a) : -(a)); // Be careful, silk_abs returns wrong when input equals to silk_intXX_MIN }*/ #undef silk_abs_int64 #define silk_abs_int64(a) silk_abs_int64_((a), __FILE__, __LINE__) static OPUS_INLINE opus_int64 silk_abs_int64_(opus_int64 a, char *file, int line){ if ( a == silk_int64_MIN ) { fprintf (stderr, "silk_abs_int64(%lld) in %s: line %d\n", (long long)a, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return (((a) > 0) ? (a) : -(a)); /* Be careful, silk_abs returns wrong when input equals to silk_intXX_MIN */ } #undef silk_abs_int32 #define silk_abs_int32(a) silk_abs_int32_((a), __FILE__, __LINE__) static OPUS_INLINE opus_int32 silk_abs_int32_(opus_int32 a, char *file, int line){ if ( a == silk_int32_MIN ) { fprintf (stderr, "silk_abs_int32(%d) in %s: line %d\n", a, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return silk_abs(a); } #undef silk_CHECK_FIT8 #define silk_CHECK_FIT8(a) silk_CHECK_FIT8_((a), __FILE__, __LINE__) static OPUS_INLINE opus_int8 silk_CHECK_FIT8_( opus_int64 a, char *file, int line ){ opus_int8 ret; ret = (opus_int8)a; if ( (opus_int64)ret != a ) { fprintf (stderr, "silk_CHECK_FIT8(%lld) in %s: line %d\n", (long long)a, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return( ret ); } #undef silk_CHECK_FIT16 #define silk_CHECK_FIT16(a) silk_CHECK_FIT16_((a), __FILE__, __LINE__) static OPUS_INLINE opus_int16 silk_CHECK_FIT16_( opus_int64 a, char *file, int line ){ opus_int16 ret; ret = (opus_int16)a; if ( (opus_int64)ret != a ) { fprintf (stderr, "silk_CHECK_FIT16(%lld) in %s: line %d\n", (long long)a, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return( ret ); } #undef silk_CHECK_FIT32 #define silk_CHECK_FIT32(a) silk_CHECK_FIT32_((a), __FILE__, __LINE__) static OPUS_INLINE opus_int32 silk_CHECK_FIT32_( opus_int64 a, char *file, int line ){ opus_int32 ret; ret = (opus_int32)a; if ( (opus_int64)ret != a ) { fprintf (stderr, "silk_CHECK_FIT32(%lld) in %s: line %d\n", (long long)a, file, line); #ifdef FIXED_DEBUG_ASSERT silk_assert( 0 ); #endif } return( ret ); } /* no checking for silk_NSHIFT_MUL_32_32 no checking for silk_NSHIFT_MUL_16_16 no checking needed for silk_min no checking needed for silk_max no checking needed for silk_sign */ #endif #endif /* MACRO_DEBUG_H */ mumble-1.3.4/3rdparty/opus-src/silk/NLSF_encode.c0000664000175000017500000001376114010707327021361 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main.h" #include "stack_alloc.h" /***********************/ /* NLSF vector encoder */ /***********************/ opus_int32 silk_NLSF_encode( /* O Returns RD value in Q25 */ opus_int8 *NLSFIndices, /* I Codebook path vector [ LPC_ORDER + 1 ] */ opus_int16 *pNLSF_Q15, /* I/O (Un)quantized NLSF vector [ LPC_ORDER ] */ const silk_NLSF_CB_struct *psNLSF_CB, /* I Codebook object */ const opus_int16 *pW_Q2, /* I NLSF weight vector [ LPC_ORDER ] */ const opus_int NLSF_mu_Q20, /* I Rate weight for the RD optimization */ const opus_int nSurvivors, /* I Max survivors after first stage */ const opus_int signalType /* I Signal type: 0/1/2 */ ) { opus_int i, s, ind1, bestIndex, prob_Q8, bits_q7; opus_int32 W_tmp_Q9, ret; VARDECL( opus_int32, err_Q24 ); VARDECL( opus_int32, RD_Q25 ); VARDECL( opus_int, tempIndices1 ); VARDECL( opus_int8, tempIndices2 ); opus_int16 res_Q10[ MAX_LPC_ORDER ]; opus_int16 NLSF_tmp_Q15[ MAX_LPC_ORDER ]; opus_int16 W_adj_Q5[ MAX_LPC_ORDER ]; opus_uint8 pred_Q8[ MAX_LPC_ORDER ]; opus_int16 ec_ix[ MAX_LPC_ORDER ]; const opus_uint8 *pCB_element, *iCDF_ptr; const opus_int16 *pCB_Wght_Q9; SAVE_STACK; silk_assert( signalType >= 0 && signalType <= 2 ); silk_assert( NLSF_mu_Q20 <= 32767 && NLSF_mu_Q20 >= 0 ); /* NLSF stabilization */ silk_NLSF_stabilize( pNLSF_Q15, psNLSF_CB->deltaMin_Q15, psNLSF_CB->order ); /* First stage: VQ */ ALLOC( err_Q24, psNLSF_CB->nVectors, opus_int32 ); silk_NLSF_VQ( err_Q24, pNLSF_Q15, psNLSF_CB->CB1_NLSF_Q8, psNLSF_CB->CB1_Wght_Q9, psNLSF_CB->nVectors, psNLSF_CB->order ); /* Sort the quantization errors */ ALLOC( tempIndices1, nSurvivors, opus_int ); silk_insertion_sort_increasing( err_Q24, tempIndices1, psNLSF_CB->nVectors, nSurvivors ); ALLOC( RD_Q25, nSurvivors, opus_int32 ); ALLOC( tempIndices2, nSurvivors * MAX_LPC_ORDER, opus_int8 ); /* Loop over survivors */ for( s = 0; s < nSurvivors; s++ ) { ind1 = tempIndices1[ s ]; /* Residual after first stage */ pCB_element = &psNLSF_CB->CB1_NLSF_Q8[ ind1 * psNLSF_CB->order ]; pCB_Wght_Q9 = &psNLSF_CB->CB1_Wght_Q9[ ind1 * psNLSF_CB->order ]; for( i = 0; i < psNLSF_CB->order; i++ ) { NLSF_tmp_Q15[ i ] = silk_LSHIFT16( (opus_int16)pCB_element[ i ], 7 ); W_tmp_Q9 = pCB_Wght_Q9[ i ]; res_Q10[ i ] = (opus_int16)silk_RSHIFT( silk_SMULBB( pNLSF_Q15[ i ] - NLSF_tmp_Q15[ i ], W_tmp_Q9 ), 14 ); W_adj_Q5[ i ] = silk_DIV32_varQ( (opus_int32)pW_Q2[ i ], silk_SMULBB( W_tmp_Q9, W_tmp_Q9 ), 21 ); } /* Unpack entropy table indices and predictor for current CB1 index */ silk_NLSF_unpack( ec_ix, pred_Q8, psNLSF_CB, ind1 ); /* Trellis quantizer */ RD_Q25[ s ] = silk_NLSF_del_dec_quant( &tempIndices2[ s * MAX_LPC_ORDER ], res_Q10, W_adj_Q5, pred_Q8, ec_ix, psNLSF_CB->ec_Rates_Q5, psNLSF_CB->quantStepSize_Q16, psNLSF_CB->invQuantStepSize_Q6, NLSF_mu_Q20, psNLSF_CB->order ); /* Add rate for first stage */ iCDF_ptr = &psNLSF_CB->CB1_iCDF[ ( signalType >> 1 ) * psNLSF_CB->nVectors ]; if( ind1 == 0 ) { prob_Q8 = 256 - iCDF_ptr[ ind1 ]; } else { prob_Q8 = iCDF_ptr[ ind1 - 1 ] - iCDF_ptr[ ind1 ]; } bits_q7 = ( 8 << 7 ) - silk_lin2log( prob_Q8 ); RD_Q25[ s ] = silk_SMLABB( RD_Q25[ s ], bits_q7, silk_RSHIFT( NLSF_mu_Q20, 2 ) ); } /* Find the lowest rate-distortion error */ silk_insertion_sort_increasing( RD_Q25, &bestIndex, nSurvivors, 1 ); NLSFIndices[ 0 ] = (opus_int8)tempIndices1[ bestIndex ]; silk_memcpy( &NLSFIndices[ 1 ], &tempIndices2[ bestIndex * MAX_LPC_ORDER ], psNLSF_CB->order * sizeof( opus_int8 ) ); /* Decode */ silk_NLSF_decode( pNLSF_Q15, NLSFIndices, psNLSF_CB ); ret = RD_Q25[ 0 ]; RESTORE_STACK; return ret; } mumble-1.3.4/3rdparty/opus-src/silk/mips/0000775000175000017500000000000014010707327020076 5ustar builderbuildermumble-1.3.4/3rdparty/opus-src/silk/mips/macros_mipsr1.h0000664000175000017500000000543614010707327023036 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef __SILK_MACROS_MIPSR1_H__ #define __SILK_MACROS_MIPSR1_H__ #define mips_clz(x) __builtin_clz(x) #undef silk_SMULWB static inline int silk_SMULWB(int a, int b) { long long ac; int c; ac = __builtin_mips_mult(a, (opus_int32)(opus_int16)b); c = __builtin_mips_extr_w(ac, 16); return c; } #undef silk_SMLAWB #define silk_SMLAWB(a32, b32, c32) ((a32) + silk_SMULWB(b32, c32)) #undef silk_SMULWW static inline int silk_SMULWW(int a, int b) { long long ac; int c; ac = __builtin_mips_mult(a, b); c = __builtin_mips_extr_w(ac, 16); return c; } #undef silk_SMLAWW static inline int silk_SMLAWW(int a, int b, int c) { long long ac; int res; ac = __builtin_mips_mult(b, c); res = __builtin_mips_extr_w(ac, 16); res += a; return res; } #define OVERRIDE_silk_CLZ16 static inline opus_int32 silk_CLZ16(opus_int16 in16) { int re32; opus_int32 in32 = (opus_int32 )in16; re32 = mips_clz(in32); re32-=16; return re32; } #define OVERRIDE_silk_CLZ32 static inline opus_int32 silk_CLZ32(opus_int32 in32) { int re32; re32 = mips_clz(in32); return re32; } #endif /* __SILK_MACROS_MIPSR1_H__ */ mumble-1.3.4/3rdparty/opus-src/silk/mips/NSQ_del_dec_mipsr1.h0000664000175000017500000005070214010707327023646 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef __NSQ_DEL_DEC_MIPSR1_H__ #define __NSQ_DEL_DEC_MIPSR1_H__ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main.h" #include "stack_alloc.h" #define OVERRIDE_silk_noise_shape_quantizer_del_dec static inline void silk_noise_shape_quantizer_del_dec( silk_nsq_state *NSQ, /* I/O NSQ state */ NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */ opus_int signalType, /* I Signal type */ const opus_int32 x_Q10[], /* I */ opus_int8 pulses[], /* O */ opus_int16 xq[], /* O */ opus_int32 sLTP_Q15[], /* I/O LTP filter state */ opus_int32 delayedGain_Q10[], /* I/O Gain delay buffer */ const opus_int16 a_Q12[], /* I Short term prediction coefs */ const opus_int16 b_Q14[], /* I Long term prediction coefs */ const opus_int16 AR_shp_Q13[], /* I Noise shaping coefs */ opus_int lag, /* I Pitch lag */ opus_int32 HarmShapeFIRPacked_Q14, /* I */ opus_int Tilt_Q14, /* I Spectral tilt */ opus_int32 LF_shp_Q14, /* I */ opus_int32 Gain_Q16, /* I */ opus_int Lambda_Q10, /* I */ opus_int offset_Q10, /* I */ opus_int length, /* I Input length */ opus_int subfr, /* I Subframe number */ opus_int shapingLPCOrder, /* I Shaping LPC filter order */ opus_int predictLPCOrder, /* I Prediction filter order */ opus_int warping_Q16, /* I */ opus_int nStatesDelayedDecision, /* I Number of states in decision tree */ opus_int *smpl_buf_idx, /* I/O Index to newest samples in buffers */ opus_int decisionDelay, /* I */ int arch /* I */ ) { opus_int i, j, k, Winner_ind, RDmin_ind, RDmax_ind, last_smple_idx; opus_int32 Winner_rand_state; opus_int32 LTP_pred_Q14, LPC_pred_Q14, n_AR_Q14, n_LTP_Q14; opus_int32 n_LF_Q14, r_Q10, rr_Q10, rd1_Q10, rd2_Q10, RDmin_Q10, RDmax_Q10; opus_int32 q1_Q0, q1_Q10, q2_Q10, exc_Q14, LPC_exc_Q14, xq_Q14, Gain_Q10; opus_int32 tmp1, tmp2, sLF_AR_shp_Q14; opus_int32 *pred_lag_ptr, *shp_lag_ptr, *psLPC_Q14; NSQ_sample_struct psSampleState[ MAX_DEL_DEC_STATES ][ 2 ]; NSQ_del_dec_struct *psDD; NSQ_sample_struct *psSS; opus_int16 b_Q14_0, b_Q14_1, b_Q14_2, b_Q14_3, b_Q14_4; opus_int16 a_Q12_0, a_Q12_1, a_Q12_2, a_Q12_3, a_Q12_4, a_Q12_5, a_Q12_6; opus_int16 a_Q12_7, a_Q12_8, a_Q12_9, a_Q12_10, a_Q12_11, a_Q12_12, a_Q12_13; opus_int16 a_Q12_14, a_Q12_15; opus_int32 cur, prev, next; /*Unused.*/ (void)arch; //Intialize b_Q14 variables b_Q14_0 = b_Q14[ 0 ]; b_Q14_1 = b_Q14[ 1 ]; b_Q14_2 = b_Q14[ 2 ]; b_Q14_3 = b_Q14[ 3 ]; b_Q14_4 = b_Q14[ 4 ]; //Intialize a_Q12 variables a_Q12_0 = a_Q12[0]; a_Q12_1 = a_Q12[1]; a_Q12_2 = a_Q12[2]; a_Q12_3 = a_Q12[3]; a_Q12_4 = a_Q12[4]; a_Q12_5 = a_Q12[5]; a_Q12_6 = a_Q12[6]; a_Q12_7 = a_Q12[7]; a_Q12_8 = a_Q12[8]; a_Q12_9 = a_Q12[9]; a_Q12_10 = a_Q12[10]; a_Q12_11 = a_Q12[11]; a_Q12_12 = a_Q12[12]; a_Q12_13 = a_Q12[13]; a_Q12_14 = a_Q12[14]; a_Q12_15 = a_Q12[15]; long long temp64; silk_assert( nStatesDelayedDecision > 0 ); shp_lag_ptr = &NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - lag + HARM_SHAPE_FIR_TAPS / 2 ]; pred_lag_ptr = &sLTP_Q15[ NSQ->sLTP_buf_idx - lag + LTP_ORDER / 2 ]; Gain_Q10 = silk_RSHIFT( Gain_Q16, 6 ); for( i = 0; i < length; i++ ) { /* Perform common calculations used in all states */ /* Long-term prediction */ if( signalType == TYPE_VOICED ) { /* Unrolled loop */ /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ temp64 = __builtin_mips_mult(pred_lag_ptr[ 0 ], b_Q14_0 ); temp64 = __builtin_mips_madd( temp64, pred_lag_ptr[ -1 ], b_Q14_1 ); temp64 = __builtin_mips_madd( temp64, pred_lag_ptr[ -2 ], b_Q14_2 ); temp64 = __builtin_mips_madd( temp64, pred_lag_ptr[ -3 ], b_Q14_3 ); temp64 = __builtin_mips_madd( temp64, pred_lag_ptr[ -4 ], b_Q14_4 ); temp64 += 32768; LTP_pred_Q14 = __builtin_mips_extr_w(temp64, 16); LTP_pred_Q14 = silk_LSHIFT( LTP_pred_Q14, 1 ); /* Q13 -> Q14 */ pred_lag_ptr++; } else { LTP_pred_Q14 = 0; } /* Long-term shaping */ if( lag > 0 ) { /* Symmetric, packed FIR coefficients */ n_LTP_Q14 = silk_SMULWB( silk_ADD32( shp_lag_ptr[ 0 ], shp_lag_ptr[ -2 ] ), HarmShapeFIRPacked_Q14 ); n_LTP_Q14 = silk_SMLAWT( n_LTP_Q14, shp_lag_ptr[ -1 ], HarmShapeFIRPacked_Q14 ); n_LTP_Q14 = silk_SUB_LSHIFT32( LTP_pred_Q14, n_LTP_Q14, 2 ); /* Q12 -> Q14 */ shp_lag_ptr++; } else { n_LTP_Q14 = 0; } for( k = 0; k < nStatesDelayedDecision; k++ ) { /* Delayed decision state */ psDD = &psDelDec[ k ]; /* Sample state */ psSS = psSampleState[ k ]; /* Generate dither */ psDD->Seed = silk_RAND( psDD->Seed ); /* Pointer used in short term prediction and shaping */ psLPC_Q14 = &psDD->sLPC_Q14[ NSQ_LPC_BUF_LENGTH - 1 + i ]; /* Short-term prediction */ silk_assert( predictLPCOrder == 10 || predictLPCOrder == 16 ); temp64 = __builtin_mips_mult(psLPC_Q14[ 0 ], a_Q12_0 ); temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -1 ], a_Q12_1 ); temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -2 ], a_Q12_2 ); temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -3 ], a_Q12_3 ); temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -4 ], a_Q12_4 ); temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -5 ], a_Q12_5 ); temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -6 ], a_Q12_6 ); temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -7 ], a_Q12_7 ); temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -8 ], a_Q12_8 ); temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -9 ], a_Q12_9 ); if( predictLPCOrder == 16 ) { temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -10 ], a_Q12_10 ); temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -11 ], a_Q12_11 ); temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -12 ], a_Q12_12 ); temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -13 ], a_Q12_13 ); temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -14 ], a_Q12_14 ); temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -15 ], a_Q12_15 ); } temp64 += 32768; LPC_pred_Q14 = __builtin_mips_extr_w(temp64, 16); LPC_pred_Q14 = silk_LSHIFT( LPC_pred_Q14, 4 ); /* Q10 -> Q14 */ /* Noise shape feedback */ silk_assert( ( shapingLPCOrder & 1 ) == 0 ); /* check that order is even */ /* Output of lowpass section */ tmp2 = silk_SMLAWB( psLPC_Q14[ 0 ], psDD->sAR2_Q14[ 0 ], warping_Q16 ); /* Output of allpass section */ tmp1 = silk_SMLAWB( psDD->sAR2_Q14[ 0 ], psDD->sAR2_Q14[ 1 ] - tmp2, warping_Q16 ); psDD->sAR2_Q14[ 0 ] = tmp2; temp64 = __builtin_mips_mult(tmp2, AR_shp_Q13[ 0 ] ); prev = psDD->sAR2_Q14[ 1 ]; /* Loop over allpass sections */ for( j = 2; j < shapingLPCOrder; j += 2 ) { cur = psDD->sAR2_Q14[ j ]; next = psDD->sAR2_Q14[ j+1 ]; /* Output of allpass section */ tmp2 = silk_SMLAWB( prev, cur - tmp1, warping_Q16 ); psDD->sAR2_Q14[ j - 1 ] = tmp1; temp64 = __builtin_mips_madd( temp64, tmp1, AR_shp_Q13[ j - 1 ] ); temp64 = __builtin_mips_madd( temp64, tmp2, AR_shp_Q13[ j ] ); /* Output of allpass section */ tmp1 = silk_SMLAWB( cur, next - tmp2, warping_Q16 ); psDD->sAR2_Q14[ j + 0 ] = tmp2; prev = next; } psDD->sAR2_Q14[ shapingLPCOrder - 1 ] = tmp1; temp64 = __builtin_mips_madd( temp64, tmp1, AR_shp_Q13[ shapingLPCOrder - 1 ] ); temp64 += 32768; n_AR_Q14 = __builtin_mips_extr_w(temp64, 16); n_AR_Q14 = silk_LSHIFT( n_AR_Q14, 1 ); /* Q11 -> Q12 */ n_AR_Q14 = silk_SMLAWB( n_AR_Q14, psDD->LF_AR_Q14, Tilt_Q14 ); /* Q12 */ n_AR_Q14 = silk_LSHIFT( n_AR_Q14, 2 ); /* Q12 -> Q14 */ n_LF_Q14 = silk_SMULWB( psDD->Shape_Q14[ *smpl_buf_idx ], LF_shp_Q14 ); /* Q12 */ n_LF_Q14 = silk_SMLAWT( n_LF_Q14, psDD->LF_AR_Q14, LF_shp_Q14 ); /* Q12 */ n_LF_Q14 = silk_LSHIFT( n_LF_Q14, 2 ); /* Q12 -> Q14 */ /* Input minus prediction plus noise feedback */ /* r = x[ i ] - LTP_pred - LPC_pred + n_AR + n_Tilt + n_LF + n_LTP */ tmp1 = silk_ADD32( n_AR_Q14, n_LF_Q14 ); /* Q14 */ tmp2 = silk_ADD32( n_LTP_Q14, LPC_pred_Q14 ); /* Q13 */ tmp1 = silk_SUB32( tmp2, tmp1 ); /* Q13 */ tmp1 = silk_RSHIFT_ROUND( tmp1, 4 ); /* Q10 */ r_Q10 = silk_SUB32( x_Q10[ i ], tmp1 ); /* residual error Q10 */ /* Flip sign depending on dither */ if ( psDD->Seed < 0 ) { r_Q10 = -r_Q10; } r_Q10 = silk_LIMIT_32( r_Q10, -(31 << 10), 30 << 10 ); /* Find two quantization level candidates and measure their rate-distortion */ q1_Q10 = silk_SUB32( r_Q10, offset_Q10 ); q1_Q0 = silk_RSHIFT( q1_Q10, 10 ); if( q1_Q0 > 0 ) { q1_Q10 = silk_SUB32( silk_LSHIFT( q1_Q0, 10 ), QUANT_LEVEL_ADJUST_Q10 ); q1_Q10 = silk_ADD32( q1_Q10, offset_Q10 ); q2_Q10 = silk_ADD32( q1_Q10, 1024 ); rd1_Q10 = silk_SMULBB( q1_Q10, Lambda_Q10 ); rd2_Q10 = silk_SMULBB( q2_Q10, Lambda_Q10 ); } else if( q1_Q0 == 0 ) { q1_Q10 = offset_Q10; q2_Q10 = silk_ADD32( q1_Q10, 1024 - QUANT_LEVEL_ADJUST_Q10 ); rd1_Q10 = silk_SMULBB( q1_Q10, Lambda_Q10 ); rd2_Q10 = silk_SMULBB( q2_Q10, Lambda_Q10 ); } else if( q1_Q0 == -1 ) { q2_Q10 = offset_Q10; q1_Q10 = silk_SUB32( q2_Q10, 1024 - QUANT_LEVEL_ADJUST_Q10 ); rd1_Q10 = silk_SMULBB( -q1_Q10, Lambda_Q10 ); rd2_Q10 = silk_SMULBB( q2_Q10, Lambda_Q10 ); } else { /* q1_Q0 < -1 */ q1_Q10 = silk_ADD32( silk_LSHIFT( q1_Q0, 10 ), QUANT_LEVEL_ADJUST_Q10 ); q1_Q10 = silk_ADD32( q1_Q10, offset_Q10 ); q2_Q10 = silk_ADD32( q1_Q10, 1024 ); rd1_Q10 = silk_SMULBB( -q1_Q10, Lambda_Q10 ); rd2_Q10 = silk_SMULBB( -q2_Q10, Lambda_Q10 ); } rr_Q10 = silk_SUB32( r_Q10, q1_Q10 ); rd1_Q10 = silk_RSHIFT( silk_SMLABB( rd1_Q10, rr_Q10, rr_Q10 ), 10 ); rr_Q10 = silk_SUB32( r_Q10, q2_Q10 ); rd2_Q10 = silk_RSHIFT( silk_SMLABB( rd2_Q10, rr_Q10, rr_Q10 ), 10 ); if( rd1_Q10 < rd2_Q10 ) { psSS[ 0 ].RD_Q10 = silk_ADD32( psDD->RD_Q10, rd1_Q10 ); psSS[ 1 ].RD_Q10 = silk_ADD32( psDD->RD_Q10, rd2_Q10 ); psSS[ 0 ].Q_Q10 = q1_Q10; psSS[ 1 ].Q_Q10 = q2_Q10; } else { psSS[ 0 ].RD_Q10 = silk_ADD32( psDD->RD_Q10, rd2_Q10 ); psSS[ 1 ].RD_Q10 = silk_ADD32( psDD->RD_Q10, rd1_Q10 ); psSS[ 0 ].Q_Q10 = q2_Q10; psSS[ 1 ].Q_Q10 = q1_Q10; } /* Update states for best quantization */ /* Quantized excitation */ exc_Q14 = silk_LSHIFT32( psSS[ 0 ].Q_Q10, 4 ); if ( psDD->Seed < 0 ) { exc_Q14 = -exc_Q14; } /* Add predictions */ LPC_exc_Q14 = silk_ADD32( exc_Q14, LTP_pred_Q14 ); xq_Q14 = silk_ADD32( LPC_exc_Q14, LPC_pred_Q14 ); /* Update states */ sLF_AR_shp_Q14 = silk_SUB32( xq_Q14, n_AR_Q14 ); psSS[ 0 ].sLTP_shp_Q14 = silk_SUB32( sLF_AR_shp_Q14, n_LF_Q14 ); psSS[ 0 ].LF_AR_Q14 = sLF_AR_shp_Q14; psSS[ 0 ].LPC_exc_Q14 = LPC_exc_Q14; psSS[ 0 ].xq_Q14 = xq_Q14; /* Update states for second best quantization */ /* Quantized excitation */ exc_Q14 = silk_LSHIFT32( psSS[ 1 ].Q_Q10, 4 ); if ( psDD->Seed < 0 ) { exc_Q14 = -exc_Q14; } /* Add predictions */ LPC_exc_Q14 = silk_ADD32( exc_Q14, LTP_pred_Q14 ); xq_Q14 = silk_ADD32( LPC_exc_Q14, LPC_pred_Q14 ); /* Update states */ sLF_AR_shp_Q14 = silk_SUB32( xq_Q14, n_AR_Q14 ); psSS[ 1 ].sLTP_shp_Q14 = silk_SUB32( sLF_AR_shp_Q14, n_LF_Q14 ); psSS[ 1 ].LF_AR_Q14 = sLF_AR_shp_Q14; psSS[ 1 ].LPC_exc_Q14 = LPC_exc_Q14; psSS[ 1 ].xq_Q14 = xq_Q14; } *smpl_buf_idx = ( *smpl_buf_idx - 1 ) % DECISION_DELAY; if( *smpl_buf_idx < 0 ) *smpl_buf_idx += DECISION_DELAY; last_smple_idx = ( *smpl_buf_idx + decisionDelay ) % DECISION_DELAY; /* Find winner */ RDmin_Q10 = psSampleState[ 0 ][ 0 ].RD_Q10; Winner_ind = 0; for( k = 1; k < nStatesDelayedDecision; k++ ) { if( psSampleState[ k ][ 0 ].RD_Q10 < RDmin_Q10 ) { RDmin_Q10 = psSampleState[ k ][ 0 ].RD_Q10; Winner_ind = k; } } /* Increase RD values of expired states */ Winner_rand_state = psDelDec[ Winner_ind ].RandState[ last_smple_idx ]; for( k = 0; k < nStatesDelayedDecision; k++ ) { if( psDelDec[ k ].RandState[ last_smple_idx ] != Winner_rand_state ) { psSampleState[ k ][ 0 ].RD_Q10 = silk_ADD32( psSampleState[ k ][ 0 ].RD_Q10, silk_int32_MAX >> 4 ); psSampleState[ k ][ 1 ].RD_Q10 = silk_ADD32( psSampleState[ k ][ 1 ].RD_Q10, silk_int32_MAX >> 4 ); silk_assert( psSampleState[ k ][ 0 ].RD_Q10 >= 0 ); } } /* Find worst in first set and best in second set */ RDmax_Q10 = psSampleState[ 0 ][ 0 ].RD_Q10; RDmin_Q10 = psSampleState[ 0 ][ 1 ].RD_Q10; RDmax_ind = 0; RDmin_ind = 0; for( k = 1; k < nStatesDelayedDecision; k++ ) { /* find worst in first set */ if( psSampleState[ k ][ 0 ].RD_Q10 > RDmax_Q10 ) { RDmax_Q10 = psSampleState[ k ][ 0 ].RD_Q10; RDmax_ind = k; } /* find best in second set */ if( psSampleState[ k ][ 1 ].RD_Q10 < RDmin_Q10 ) { RDmin_Q10 = psSampleState[ k ][ 1 ].RD_Q10; RDmin_ind = k; } } /* Replace a state if best from second set outperforms worst in first set */ if( RDmin_Q10 < RDmax_Q10 ) { silk_memcpy( ( (opus_int32 *)&psDelDec[ RDmax_ind ] ) + i, ( (opus_int32 *)&psDelDec[ RDmin_ind ] ) + i, sizeof( NSQ_del_dec_struct ) - i * sizeof( opus_int32) ); silk_memcpy( &psSampleState[ RDmax_ind ][ 0 ], &psSampleState[ RDmin_ind ][ 1 ], sizeof( NSQ_sample_struct ) ); } /* Write samples from winner to output and long-term filter states */ psDD = &psDelDec[ Winner_ind ]; if( subfr > 0 || i >= decisionDelay ) { pulses[ i - decisionDelay ] = (opus_int8)silk_RSHIFT_ROUND( psDD->Q_Q10[ last_smple_idx ], 10 ); xq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( psDD->Xq_Q14[ last_smple_idx ], delayedGain_Q10[ last_smple_idx ] ), 8 ) ); NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - decisionDelay ] = psDD->Shape_Q14[ last_smple_idx ]; sLTP_Q15[ NSQ->sLTP_buf_idx - decisionDelay ] = psDD->Pred_Q15[ last_smple_idx ]; } NSQ->sLTP_shp_buf_idx++; NSQ->sLTP_buf_idx++; /* Update states */ for( k = 0; k < nStatesDelayedDecision; k++ ) { psDD = &psDelDec[ k ]; psSS = &psSampleState[ k ][ 0 ]; psDD->LF_AR_Q14 = psSS->LF_AR_Q14; psDD->sLPC_Q14[ NSQ_LPC_BUF_LENGTH + i ] = psSS->xq_Q14; psDD->Xq_Q14[ *smpl_buf_idx ] = psSS->xq_Q14; psDD->Q_Q10[ *smpl_buf_idx ] = psSS->Q_Q10; psDD->Pred_Q15[ *smpl_buf_idx ] = silk_LSHIFT32( psSS->LPC_exc_Q14, 1 ); psDD->Shape_Q14[ *smpl_buf_idx ] = psSS->sLTP_shp_Q14; psDD->Seed = silk_ADD32_ovflw( psDD->Seed, silk_RSHIFT_ROUND( psSS->Q_Q10, 10 ) ); psDD->RandState[ *smpl_buf_idx ] = psDD->Seed; psDD->RD_Q10 = psSS->RD_Q10; } delayedGain_Q10[ *smpl_buf_idx ] = Gain_Q10; } /* Update LPC states */ for( k = 0; k < nStatesDelayedDecision; k++ ) { psDD = &psDelDec[ k ]; silk_memcpy( psDD->sLPC_Q14, &psDD->sLPC_Q14[ length ], NSQ_LPC_BUF_LENGTH * sizeof( opus_int32 ) ); } } #endif /* __NSQ_DEL_DEC_MIPSR1_H__ */ mumble-1.3.4/3rdparty/opus-src/silk/mips/sigproc_fix_mipsr1.h0000664000175000017500000000424414010707327024062 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef SILK_SIGPROC_FIX_MIPSR1_H #define SILK_SIGPROC_FIX_MIPSR1_H #undef silk_SAT16 static inline short int silk_SAT16(int a) { int c; c = __builtin_mips_shll_s_w(a, 16); c = c>>16; return c; } #undef silk_LSHIFT_SAT32 static inline int silk_LSHIFT_SAT32(int a, int shift) { int r; r = __builtin_mips_shll_s_w(a, shift); return r; } #undef silk_RSHIFT_ROUND static inline int silk_RSHIFT_ROUND(int a, int shift) { int r; r = __builtin_mips_shra_r_w(a, shift); return r; } #endif /* SILK_SIGPROC_FIX_MIPSR1_H */ mumble-1.3.4/3rdparty/opus-src/silk/biquad_alt.c0000664000175000017500000001534614010707327021410 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ /* * * silk_biquad_alt.c * * * * Second order ARMA filter * * Can handle slowly varying filter coefficients * * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "SigProc_FIX.h" /* Second order ARMA filter, alternative implementation */ void silk_biquad_alt_stride1( const opus_int16 *in, /* I input signal */ const opus_int32 *B_Q28, /* I MA coefficients [3] */ const opus_int32 *A_Q28, /* I AR coefficients [2] */ opus_int32 *S, /* I/O State vector [2] */ opus_int16 *out, /* O output signal */ const opus_int32 len /* I signal length (must be even) */ ) { /* DIRECT FORM II TRANSPOSED (uses 2 element state vector) */ opus_int k; opus_int32 inval, A0_U_Q28, A0_L_Q28, A1_U_Q28, A1_L_Q28, out32_Q14; /* Negate A_Q28 values and split in two parts */ A0_L_Q28 = ( -A_Q28[ 0 ] ) & 0x00003FFF; /* lower part */ A0_U_Q28 = silk_RSHIFT( -A_Q28[ 0 ], 14 ); /* upper part */ A1_L_Q28 = ( -A_Q28[ 1 ] ) & 0x00003FFF; /* lower part */ A1_U_Q28 = silk_RSHIFT( -A_Q28[ 1 ], 14 ); /* upper part */ for( k = 0; k < len; k++ ) { /* S[ 0 ], S[ 1 ]: Q12 */ inval = in[ k ]; out32_Q14 = silk_LSHIFT( silk_SMLAWB( S[ 0 ], B_Q28[ 0 ], inval ), 2 ); S[ 0 ] = S[1] + silk_RSHIFT_ROUND( silk_SMULWB( out32_Q14, A0_L_Q28 ), 14 ); S[ 0 ] = silk_SMLAWB( S[ 0 ], out32_Q14, A0_U_Q28 ); S[ 0 ] = silk_SMLAWB( S[ 0 ], B_Q28[ 1 ], inval); S[ 1 ] = silk_RSHIFT_ROUND( silk_SMULWB( out32_Q14, A1_L_Q28 ), 14 ); S[ 1 ] = silk_SMLAWB( S[ 1 ], out32_Q14, A1_U_Q28 ); S[ 1 ] = silk_SMLAWB( S[ 1 ], B_Q28[ 2 ], inval ); /* Scale back to Q0 and saturate */ out[ k ] = (opus_int16)silk_SAT16( silk_RSHIFT( out32_Q14 + (1<<14) - 1, 14 ) ); } } void silk_biquad_alt_stride2_c( const opus_int16 *in, /* I input signal */ const opus_int32 *B_Q28, /* I MA coefficients [3] */ const opus_int32 *A_Q28, /* I AR coefficients [2] */ opus_int32 *S, /* I/O State vector [4] */ opus_int16 *out, /* O output signal */ const opus_int32 len /* I signal length (must be even) */ ) { /* DIRECT FORM II TRANSPOSED (uses 2 element state vector) */ opus_int k; opus_int32 A0_U_Q28, A0_L_Q28, A1_U_Q28, A1_L_Q28, out32_Q14[ 2 ]; /* Negate A_Q28 values and split in two parts */ A0_L_Q28 = ( -A_Q28[ 0 ] ) & 0x00003FFF; /* lower part */ A0_U_Q28 = silk_RSHIFT( -A_Q28[ 0 ], 14 ); /* upper part */ A1_L_Q28 = ( -A_Q28[ 1 ] ) & 0x00003FFF; /* lower part */ A1_U_Q28 = silk_RSHIFT( -A_Q28[ 1 ], 14 ); /* upper part */ for( k = 0; k < len; k++ ) { /* S[ 0 ], S[ 1 ], S[ 2 ], S[ 3 ]: Q12 */ out32_Q14[ 0 ] = silk_LSHIFT( silk_SMLAWB( S[ 0 ], B_Q28[ 0 ], in[ 2 * k + 0 ] ), 2 ); out32_Q14[ 1 ] = silk_LSHIFT( silk_SMLAWB( S[ 2 ], B_Q28[ 0 ], in[ 2 * k + 1 ] ), 2 ); S[ 0 ] = S[ 1 ] + silk_RSHIFT_ROUND( silk_SMULWB( out32_Q14[ 0 ], A0_L_Q28 ), 14 ); S[ 2 ] = S[ 3 ] + silk_RSHIFT_ROUND( silk_SMULWB( out32_Q14[ 1 ], A0_L_Q28 ), 14 ); S[ 0 ] = silk_SMLAWB( S[ 0 ], out32_Q14[ 0 ], A0_U_Q28 ); S[ 2 ] = silk_SMLAWB( S[ 2 ], out32_Q14[ 1 ], A0_U_Q28 ); S[ 0 ] = silk_SMLAWB( S[ 0 ], B_Q28[ 1 ], in[ 2 * k + 0 ] ); S[ 2 ] = silk_SMLAWB( S[ 2 ], B_Q28[ 1 ], in[ 2 * k + 1 ] ); S[ 1 ] = silk_RSHIFT_ROUND( silk_SMULWB( out32_Q14[ 0 ], A1_L_Q28 ), 14 ); S[ 3 ] = silk_RSHIFT_ROUND( silk_SMULWB( out32_Q14[ 1 ], A1_L_Q28 ), 14 ); S[ 1 ] = silk_SMLAWB( S[ 1 ], out32_Q14[ 0 ], A1_U_Q28 ); S[ 3 ] = silk_SMLAWB( S[ 3 ], out32_Q14[ 1 ], A1_U_Q28 ); S[ 1 ] = silk_SMLAWB( S[ 1 ], B_Q28[ 2 ], in[ 2 * k + 0 ] ); S[ 3 ] = silk_SMLAWB( S[ 3 ], B_Q28[ 2 ], in[ 2 * k + 1 ] ); /* Scale back to Q0 and saturate */ out[ 2 * k + 0 ] = (opus_int16)silk_SAT16( silk_RSHIFT( out32_Q14[ 0 ] + (1<<14) - 1, 14 ) ); out[ 2 * k + 1 ] = (opus_int16)silk_SAT16( silk_RSHIFT( out32_Q14[ 1 ] + (1<<14) - 1, 14 ) ); } } mumble-1.3.4/3rdparty/opus-src/silk/MacroCount.h0000664000175000017500000005043414010707327021357 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef SIGPROCFIX_API_MACROCOUNT_H #define SIGPROCFIX_API_MACROCOUNT_H #include #ifdef silk_MACRO_COUNT #define varDefine opus_int64 ops_count = 0; extern opus_int64 ops_count; static OPUS_INLINE opus_int64 silk_SaveCount(){ return(ops_count); } static OPUS_INLINE opus_int64 silk_SaveResetCount(){ opus_int64 ret; ret = ops_count; ops_count = 0; return(ret); } static OPUS_INLINE silk_PrintCount(){ printf("ops_count = %d \n ", (opus_int32)ops_count); } #undef silk_MUL static OPUS_INLINE opus_int32 silk_MUL(opus_int32 a32, opus_int32 b32){ opus_int32 ret; ops_count += 4; ret = a32 * b32; return ret; } #undef silk_MUL_uint static OPUS_INLINE opus_uint32 silk_MUL_uint(opus_uint32 a32, opus_uint32 b32){ opus_uint32 ret; ops_count += 4; ret = a32 * b32; return ret; } #undef silk_MLA static OPUS_INLINE opus_int32 silk_MLA(opus_int32 a32, opus_int32 b32, opus_int32 c32){ opus_int32 ret; ops_count += 4; ret = a32 + b32 * c32; return ret; } #undef silk_MLA_uint static OPUS_INLINE opus_int32 silk_MLA_uint(opus_uint32 a32, opus_uint32 b32, opus_uint32 c32){ opus_uint32 ret; ops_count += 4; ret = a32 + b32 * c32; return ret; } #undef silk_SMULWB static OPUS_INLINE opus_int32 silk_SMULWB(opus_int32 a32, opus_int32 b32){ opus_int32 ret; ops_count += 5; ret = (a32 >> 16) * (opus_int32)((opus_int16)b32) + (((a32 & 0x0000FFFF) * (opus_int32)((opus_int16)b32)) >> 16); return ret; } #undef silk_SMLAWB static OPUS_INLINE opus_int32 silk_SMLAWB(opus_int32 a32, opus_int32 b32, opus_int32 c32){ opus_int32 ret; ops_count += 5; ret = ((a32) + ((((b32) >> 16) * (opus_int32)((opus_int16)(c32))) + ((((b32) & 0x0000FFFF) * (opus_int32)((opus_int16)(c32))) >> 16))); return ret; } #undef silk_SMULWT static OPUS_INLINE opus_int32 silk_SMULWT(opus_int32 a32, opus_int32 b32){ opus_int32 ret; ops_count += 4; ret = (a32 >> 16) * (b32 >> 16) + (((a32 & 0x0000FFFF) * (b32 >> 16)) >> 16); return ret; } #undef silk_SMLAWT static OPUS_INLINE opus_int32 silk_SMLAWT(opus_int32 a32, opus_int32 b32, opus_int32 c32){ opus_int32 ret; ops_count += 4; ret = a32 + ((b32 >> 16) * (c32 >> 16)) + (((b32 & 0x0000FFFF) * ((c32 >> 16)) >> 16)); return ret; } #undef silk_SMULBB static OPUS_INLINE opus_int32 silk_SMULBB(opus_int32 a32, opus_int32 b32){ opus_int32 ret; ops_count += 1; ret = (opus_int32)((opus_int16)a32) * (opus_int32)((opus_int16)b32); return ret; } #undef silk_SMLABB static OPUS_INLINE opus_int32 silk_SMLABB(opus_int32 a32, opus_int32 b32, opus_int32 c32){ opus_int32 ret; ops_count += 1; ret = a32 + (opus_int32)((opus_int16)b32) * (opus_int32)((opus_int16)c32); return ret; } #undef silk_SMULBT static OPUS_INLINE opus_int32 silk_SMULBT(opus_int32 a32, opus_int32 b32 ){ opus_int32 ret; ops_count += 4; ret = ((opus_int32)((opus_int16)a32)) * (b32 >> 16); return ret; } #undef silk_SMLABT static OPUS_INLINE opus_int32 silk_SMLABT(opus_int32 a32, opus_int32 b32, opus_int32 c32){ opus_int32 ret; ops_count += 1; ret = a32 + ((opus_int32)((opus_int16)b32)) * (c32 >> 16); return ret; } #undef silk_SMULTT static OPUS_INLINE opus_int32 silk_SMULTT(opus_int32 a32, opus_int32 b32){ opus_int32 ret; ops_count += 1; ret = (a32 >> 16) * (b32 >> 16); return ret; } #undef silk_SMLATT static OPUS_INLINE opus_int32 silk_SMLATT(opus_int32 a32, opus_int32 b32, opus_int32 c32){ opus_int32 ret; ops_count += 1; ret = a32 + (b32 >> 16) * (c32 >> 16); return ret; } /* multiply-accumulate macros that allow overflow in the addition (ie, no asserts in debug mode)*/ #undef silk_MLA_ovflw #define silk_MLA_ovflw silk_MLA #undef silk_SMLABB_ovflw #define silk_SMLABB_ovflw silk_SMLABB #undef silk_SMLABT_ovflw #define silk_SMLABT_ovflw silk_SMLABT #undef silk_SMLATT_ovflw #define silk_SMLATT_ovflw silk_SMLATT #undef silk_SMLAWB_ovflw #define silk_SMLAWB_ovflw silk_SMLAWB #undef silk_SMLAWT_ovflw #define silk_SMLAWT_ovflw silk_SMLAWT #undef silk_SMULL static OPUS_INLINE opus_int64 silk_SMULL(opus_int32 a32, opus_int32 b32){ opus_int64 ret; ops_count += 8; ret = ((opus_int64)(a32) * /*(opus_int64)*/(b32)); return ret; } #undef silk_SMLAL static OPUS_INLINE opus_int64 silk_SMLAL(opus_int64 a64, opus_int32 b32, opus_int32 c32){ opus_int64 ret; ops_count += 8; ret = a64 + ((opus_int64)(b32) * /*(opus_int64)*/(c32)); return ret; } #undef silk_SMLALBB static OPUS_INLINE opus_int64 silk_SMLALBB(opus_int64 a64, opus_int16 b16, opus_int16 c16){ opus_int64 ret; ops_count += 4; ret = a64 + ((opus_int64)(b16) * /*(opus_int64)*/(c16)); return ret; } #undef SigProcFIX_CLZ16 static OPUS_INLINE opus_int32 SigProcFIX_CLZ16(opus_int16 in16) { opus_int32 out32 = 0; ops_count += 10; if( in16 == 0 ) { return 16; } /* test nibbles */ if( in16 & 0xFF00 ) { if( in16 & 0xF000 ) { in16 >>= 12; } else { out32 += 4; in16 >>= 8; } } else { if( in16 & 0xFFF0 ) { out32 += 8; in16 >>= 4; } else { out32 += 12; } } /* test bits and return */ if( in16 & 0xC ) { if( in16 & 0x8 ) return out32 + 0; else return out32 + 1; } else { if( in16 & 0xE ) return out32 + 2; else return out32 + 3; } } #undef SigProcFIX_CLZ32 static OPUS_INLINE opus_int32 SigProcFIX_CLZ32(opus_int32 in32) { /* test highest 16 bits and convert to opus_int16 */ ops_count += 2; if( in32 & 0xFFFF0000 ) { return SigProcFIX_CLZ16((opus_int16)(in32 >> 16)); } else { return SigProcFIX_CLZ16((opus_int16)in32) + 16; } } #undef silk_DIV32 static OPUS_INLINE opus_int32 silk_DIV32(opus_int32 a32, opus_int32 b32){ ops_count += 64; return a32 / b32; } #undef silk_DIV32_16 static OPUS_INLINE opus_int32 silk_DIV32_16(opus_int32 a32, opus_int32 b32){ ops_count += 32; return a32 / b32; } #undef silk_SAT8 static OPUS_INLINE opus_int8 silk_SAT8(opus_int64 a){ opus_int8 tmp; ops_count += 1; tmp = (opus_int8)((a) > silk_int8_MAX ? silk_int8_MAX : \ ((a) < silk_int8_MIN ? silk_int8_MIN : (a))); return(tmp); } #undef silk_SAT16 static OPUS_INLINE opus_int16 silk_SAT16(opus_int64 a){ opus_int16 tmp; ops_count += 1; tmp = (opus_int16)((a) > silk_int16_MAX ? silk_int16_MAX : \ ((a) < silk_int16_MIN ? silk_int16_MIN : (a))); return(tmp); } #undef silk_SAT32 static OPUS_INLINE opus_int32 silk_SAT32(opus_int64 a){ opus_int32 tmp; ops_count += 1; tmp = (opus_int32)((a) > silk_int32_MAX ? silk_int32_MAX : \ ((a) < silk_int32_MIN ? silk_int32_MIN : (a))); return(tmp); } #undef silk_POS_SAT32 static OPUS_INLINE opus_int32 silk_POS_SAT32(opus_int64 a){ opus_int32 tmp; ops_count += 1; tmp = (opus_int32)((a) > silk_int32_MAX ? silk_int32_MAX : (a)); return(tmp); } #undef silk_ADD_POS_SAT8 static OPUS_INLINE opus_int8 silk_ADD_POS_SAT8(opus_int64 a, opus_int64 b){ opus_int8 tmp; ops_count += 1; tmp = (opus_int8)((((a)+(b)) & 0x80) ? silk_int8_MAX : ((a)+(b))); return(tmp); } #undef silk_ADD_POS_SAT16 static OPUS_INLINE opus_int16 silk_ADD_POS_SAT16(opus_int64 a, opus_int64 b){ opus_int16 tmp; ops_count += 1; tmp = (opus_int16)((((a)+(b)) & 0x8000) ? silk_int16_MAX : ((a)+(b))); return(tmp); } #undef silk_ADD_POS_SAT32 static OPUS_INLINE opus_int32 silk_ADD_POS_SAT32(opus_int64 a, opus_int64 b){ opus_int32 tmp; ops_count += 1; tmp = (opus_int32)((((a)+(b)) & 0x80000000) ? silk_int32_MAX : ((a)+(b))); return(tmp); } #undef silk_LSHIFT8 static OPUS_INLINE opus_int8 silk_LSHIFT8(opus_int8 a, opus_int32 shift){ opus_int8 ret; ops_count += 1; ret = a << shift; return ret; } #undef silk_LSHIFT16 static OPUS_INLINE opus_int16 silk_LSHIFT16(opus_int16 a, opus_int32 shift){ opus_int16 ret; ops_count += 1; ret = a << shift; return ret; } #undef silk_LSHIFT32 static OPUS_INLINE opus_int32 silk_LSHIFT32(opus_int32 a, opus_int32 shift){ opus_int32 ret; ops_count += 1; ret = a << shift; return ret; } #undef silk_LSHIFT64 static OPUS_INLINE opus_int64 silk_LSHIFT64(opus_int64 a, opus_int shift){ ops_count += 1; return a << shift; } #undef silk_LSHIFT_ovflw static OPUS_INLINE opus_int32 silk_LSHIFT_ovflw(opus_int32 a, opus_int32 shift){ ops_count += 1; return a << shift; } #undef silk_LSHIFT_uint static OPUS_INLINE opus_uint32 silk_LSHIFT_uint(opus_uint32 a, opus_int32 shift){ opus_uint32 ret; ops_count += 1; ret = a << shift; return ret; } #undef silk_RSHIFT8 static OPUS_INLINE opus_int8 silk_RSHIFT8(opus_int8 a, opus_int32 shift){ ops_count += 1; return a >> shift; } #undef silk_RSHIFT16 static OPUS_INLINE opus_int16 silk_RSHIFT16(opus_int16 a, opus_int32 shift){ ops_count += 1; return a >> shift; } #undef silk_RSHIFT32 static OPUS_INLINE opus_int32 silk_RSHIFT32(opus_int32 a, opus_int32 shift){ ops_count += 1; return a >> shift; } #undef silk_RSHIFT64 static OPUS_INLINE opus_int64 silk_RSHIFT64(opus_int64 a, opus_int64 shift){ ops_count += 1; return a >> shift; } #undef silk_RSHIFT_uint static OPUS_INLINE opus_uint32 silk_RSHIFT_uint(opus_uint32 a, opus_int32 shift){ ops_count += 1; return a >> shift; } #undef silk_ADD_LSHIFT static OPUS_INLINE opus_int32 silk_ADD_LSHIFT(opus_int32 a, opus_int32 b, opus_int32 shift){ opus_int32 ret; ops_count += 1; ret = a + (b << shift); return ret; /* shift >= 0*/ } #undef silk_ADD_LSHIFT32 static OPUS_INLINE opus_int32 silk_ADD_LSHIFT32(opus_int32 a, opus_int32 b, opus_int32 shift){ opus_int32 ret; ops_count += 1; ret = a + (b << shift); return ret; /* shift >= 0*/ } #undef silk_ADD_LSHIFT_uint static OPUS_INLINE opus_uint32 silk_ADD_LSHIFT_uint(opus_uint32 a, opus_uint32 b, opus_int32 shift){ opus_uint32 ret; ops_count += 1; ret = a + (b << shift); return ret; /* shift >= 0*/ } #undef silk_ADD_RSHIFT static OPUS_INLINE opus_int32 silk_ADD_RSHIFT(opus_int32 a, opus_int32 b, opus_int32 shift){ opus_int32 ret; ops_count += 1; ret = a + (b >> shift); return ret; /* shift > 0*/ } #undef silk_ADD_RSHIFT32 static OPUS_INLINE opus_int32 silk_ADD_RSHIFT32(opus_int32 a, opus_int32 b, opus_int32 shift){ opus_int32 ret; ops_count += 1; ret = a + (b >> shift); return ret; /* shift > 0*/ } #undef silk_ADD_RSHIFT_uint static OPUS_INLINE opus_uint32 silk_ADD_RSHIFT_uint(opus_uint32 a, opus_uint32 b, opus_int32 shift){ opus_uint32 ret; ops_count += 1; ret = a + (b >> shift); return ret; /* shift > 0*/ } #undef silk_SUB_LSHIFT32 static OPUS_INLINE opus_int32 silk_SUB_LSHIFT32(opus_int32 a, opus_int32 b, opus_int32 shift){ opus_int32 ret; ops_count += 1; ret = a - (b << shift); return ret; /* shift >= 0*/ } #undef silk_SUB_RSHIFT32 static OPUS_INLINE opus_int32 silk_SUB_RSHIFT32(opus_int32 a, opus_int32 b, opus_int32 shift){ opus_int32 ret; ops_count += 1; ret = a - (b >> shift); return ret; /* shift > 0*/ } #undef silk_RSHIFT_ROUND static OPUS_INLINE opus_int32 silk_RSHIFT_ROUND(opus_int32 a, opus_int32 shift){ opus_int32 ret; ops_count += 3; ret = shift == 1 ? (a >> 1) + (a & 1) : ((a >> (shift - 1)) + 1) >> 1; return ret; } #undef silk_RSHIFT_ROUND64 static OPUS_INLINE opus_int64 silk_RSHIFT_ROUND64(opus_int64 a, opus_int32 shift){ opus_int64 ret; ops_count += 6; ret = shift == 1 ? (a >> 1) + (a & 1) : ((a >> (shift - 1)) + 1) >> 1; return ret; } #undef silk_abs_int64 static OPUS_INLINE opus_int64 silk_abs_int64(opus_int64 a){ ops_count += 1; return (((a) > 0) ? (a) : -(a)); /* Be careful, silk_abs returns wrong when input equals to silk_intXX_MIN*/ } #undef silk_abs_int32 static OPUS_INLINE opus_int32 silk_abs_int32(opus_int32 a){ ops_count += 1; return silk_abs(a); } #undef silk_min static silk_min(a, b){ ops_count += 1; return (((a) < (b)) ? (a) : (b)); } #undef silk_max static silk_max(a, b){ ops_count += 1; return (((a) > (b)) ? (a) : (b)); } #undef silk_sign static silk_sign(a){ ops_count += 1; return ((a) > 0 ? 1 : ( (a) < 0 ? -1 : 0 )); } #undef silk_ADD16 static OPUS_INLINE opus_int16 silk_ADD16(opus_int16 a, opus_int16 b){ opus_int16 ret; ops_count += 1; ret = a + b; return ret; } #undef silk_ADD32 static OPUS_INLINE opus_int32 silk_ADD32(opus_int32 a, opus_int32 b){ opus_int32 ret; ops_count += 1; ret = a + b; return ret; } #undef silk_ADD64 static OPUS_INLINE opus_int64 silk_ADD64(opus_int64 a, opus_int64 b){ opus_int64 ret; ops_count += 2; ret = a + b; return ret; } #undef silk_SUB16 static OPUS_INLINE opus_int16 silk_SUB16(opus_int16 a, opus_int16 b){ opus_int16 ret; ops_count += 1; ret = a - b; return ret; } #undef silk_SUB32 static OPUS_INLINE opus_int32 silk_SUB32(opus_int32 a, opus_int32 b){ opus_int32 ret; ops_count += 1; ret = a - b; return ret; } #undef silk_SUB64 static OPUS_INLINE opus_int64 silk_SUB64(opus_int64 a, opus_int64 b){ opus_int64 ret; ops_count += 2; ret = a - b; return ret; } #undef silk_ADD_SAT16 static OPUS_INLINE opus_int16 silk_ADD_SAT16( opus_int16 a16, opus_int16 b16 ) { opus_int16 res; /* Nb will be counted in AKP_add32 and silk_SAT16*/ res = (opus_int16)silk_SAT16( silk_ADD32( (opus_int32)(a16), (b16) ) ); return res; } #undef silk_ADD_SAT32 static OPUS_INLINE opus_int32 silk_ADD_SAT32(opus_int32 a32, opus_int32 b32){ opus_int32 res; ops_count += 1; res = ((((a32) + (b32)) & 0x80000000) == 0 ? \ ((((a32) & (b32)) & 0x80000000) != 0 ? silk_int32_MIN : (a32)+(b32)) : \ ((((a32) | (b32)) & 0x80000000) == 0 ? silk_int32_MAX : (a32)+(b32)) ); return res; } #undef silk_ADD_SAT64 static OPUS_INLINE opus_int64 silk_ADD_SAT64( opus_int64 a64, opus_int64 b64 ) { opus_int64 res; ops_count += 1; res = ((((a64) + (b64)) & 0x8000000000000000LL) == 0 ? \ ((((a64) & (b64)) & 0x8000000000000000LL) != 0 ? silk_int64_MIN : (a64)+(b64)) : \ ((((a64) | (b64)) & 0x8000000000000000LL) == 0 ? silk_int64_MAX : (a64)+(b64)) ); return res; } #undef silk_SUB_SAT16 static OPUS_INLINE opus_int16 silk_SUB_SAT16( opus_int16 a16, opus_int16 b16 ) { opus_int16 res; silk_assert(0); /* Nb will be counted in sub-macros*/ res = (opus_int16)silk_SAT16( silk_SUB32( (opus_int32)(a16), (b16) ) ); return res; } #undef silk_SUB_SAT32 static OPUS_INLINE opus_int32 silk_SUB_SAT32( opus_int32 a32, opus_int32 b32 ) { opus_int32 res; ops_count += 1; res = ((((a32)-(b32)) & 0x80000000) == 0 ? \ (( (a32) & ((b32)^0x80000000) & 0x80000000) ? silk_int32_MIN : (a32)-(b32)) : \ ((((a32)^0x80000000) & (b32) & 0x80000000) ? silk_int32_MAX : (a32)-(b32)) ); return res; } #undef silk_SUB_SAT64 static OPUS_INLINE opus_int64 silk_SUB_SAT64( opus_int64 a64, opus_int64 b64 ) { opus_int64 res; ops_count += 1; res = ((((a64)-(b64)) & 0x8000000000000000LL) == 0 ? \ (( (a64) & ((b64)^0x8000000000000000LL) & 0x8000000000000000LL) ? silk_int64_MIN : (a64)-(b64)) : \ ((((a64)^0x8000000000000000LL) & (b64) & 0x8000000000000000LL) ? silk_int64_MAX : (a64)-(b64)) ); return res; } #undef silk_SMULWW static OPUS_INLINE opus_int32 silk_SMULWW(opus_int32 a32, opus_int32 b32){ opus_int32 ret; /* Nb will be counted in sub-macros*/ ret = silk_MLA(silk_SMULWB((a32), (b32)), (a32), silk_RSHIFT_ROUND((b32), 16)); return ret; } #undef silk_SMLAWW static OPUS_INLINE opus_int32 silk_SMLAWW(opus_int32 a32, opus_int32 b32, opus_int32 c32){ opus_int32 ret; /* Nb will be counted in sub-macros*/ ret = silk_MLA(silk_SMLAWB((a32), (b32), (c32)), (b32), silk_RSHIFT_ROUND((c32), 16)); return ret; } #undef silk_min_int static OPUS_INLINE opus_int silk_min_int(opus_int a, opus_int b) { ops_count += 1; return (((a) < (b)) ? (a) : (b)); } #undef silk_min_16 static OPUS_INLINE opus_int16 silk_min_16(opus_int16 a, opus_int16 b) { ops_count += 1; return (((a) < (b)) ? (a) : (b)); } #undef silk_min_32 static OPUS_INLINE opus_int32 silk_min_32(opus_int32 a, opus_int32 b) { ops_count += 1; return (((a) < (b)) ? (a) : (b)); } #undef silk_min_64 static OPUS_INLINE opus_int64 silk_min_64(opus_int64 a, opus_int64 b) { ops_count += 1; return (((a) < (b)) ? (a) : (b)); } /* silk_min() versions with typecast in the function call */ #undef silk_max_int static OPUS_INLINE opus_int silk_max_int(opus_int a, opus_int b) { ops_count += 1; return (((a) > (b)) ? (a) : (b)); } #undef silk_max_16 static OPUS_INLINE opus_int16 silk_max_16(opus_int16 a, opus_int16 b) { ops_count += 1; return (((a) > (b)) ? (a) : (b)); } #undef silk_max_32 static OPUS_INLINE opus_int32 silk_max_32(opus_int32 a, opus_int32 b) { ops_count += 1; return (((a) > (b)) ? (a) : (b)); } #undef silk_max_64 static OPUS_INLINE opus_int64 silk_max_64(opus_int64 a, opus_int64 b) { ops_count += 1; return (((a) > (b)) ? (a) : (b)); } #undef silk_LIMIT_int static OPUS_INLINE opus_int silk_LIMIT_int(opus_int a, opus_int limit1, opus_int limit2) { opus_int ret; ops_count += 6; ret = ((limit1) > (limit2) ? ((a) > (limit1) ? (limit1) : ((a) < (limit2) ? (limit2) : (a))) \ : ((a) > (limit2) ? (limit2) : ((a) < (limit1) ? (limit1) : (a)))); return(ret); } #undef silk_LIMIT_16 static OPUS_INLINE opus_int16 silk_LIMIT_16(opus_int16 a, opus_int16 limit1, opus_int16 limit2) { opus_int16 ret; ops_count += 6; ret = ((limit1) > (limit2) ? ((a) > (limit1) ? (limit1) : ((a) < (limit2) ? (limit2) : (a))) \ : ((a) > (limit2) ? (limit2) : ((a) < (limit1) ? (limit1) : (a)))); return(ret); } #undef silk_LIMIT_32 static OPUS_INLINE opus_int32 silk_LIMIT_32(opus_int32 a, opus_int32 limit1, opus_int32 limit2) { opus_int32 ret; ops_count += 6; ret = ((limit1) > (limit2) ? ((a) > (limit1) ? (limit1) : ((a) < (limit2) ? (limit2) : (a))) \ : ((a) > (limit2) ? (limit2) : ((a) < (limit1) ? (limit1) : (a)))); return(ret); } #else #define varDefine #define silk_SaveCount() #endif #endif mumble-1.3.4/3rdparty/opus-src/silk/float/0000775000175000017500000000000014010707327020233 5ustar builderbuildermumble-1.3.4/3rdparty/opus-src/silk/float/find_LPC_FLP.c0000664000175000017500000001251314010707327022520 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "define.h" #include "main_FLP.h" #include "tuning_parameters.h" /* LPC analysis */ void silk_find_LPC_FLP( silk_encoder_state *psEncC, /* I/O Encoder state */ opus_int16 NLSF_Q15[], /* O NLSFs */ const silk_float x[], /* I Input signal */ const silk_float minInvGain /* I Inverse of max prediction gain */ ) { opus_int k, subfr_length; silk_float a[ MAX_LPC_ORDER ]; /* Used only for NLSF interpolation */ silk_float res_nrg, res_nrg_2nd, res_nrg_interp; opus_int16 NLSF0_Q15[ MAX_LPC_ORDER ]; silk_float a_tmp[ MAX_LPC_ORDER ]; silk_float LPC_res[ MAX_FRAME_LENGTH + MAX_NB_SUBFR * MAX_LPC_ORDER ]; subfr_length = psEncC->subfr_length + psEncC->predictLPCOrder; /* Default: No interpolation */ psEncC->indices.NLSFInterpCoef_Q2 = 4; /* Burg AR analysis for the full frame */ res_nrg = silk_burg_modified_FLP( a, x, minInvGain, subfr_length, psEncC->nb_subfr, psEncC->predictLPCOrder ); if( psEncC->useInterpolatedNLSFs && !psEncC->first_frame_after_reset && psEncC->nb_subfr == MAX_NB_SUBFR ) { /* Optimal solution for last 10 ms; subtract residual energy here, as that's easier than */ /* adding it to the residual energy of the first 10 ms in each iteration of the search below */ res_nrg -= silk_burg_modified_FLP( a_tmp, x + ( MAX_NB_SUBFR / 2 ) * subfr_length, minInvGain, subfr_length, MAX_NB_SUBFR / 2, psEncC->predictLPCOrder ); /* Convert to NLSFs */ silk_A2NLSF_FLP( NLSF_Q15, a_tmp, psEncC->predictLPCOrder ); /* Search over interpolation indices to find the one with lowest residual energy */ res_nrg_2nd = silk_float_MAX; for( k = 3; k >= 0; k-- ) { /* Interpolate NLSFs for first half */ silk_interpolate( NLSF0_Q15, psEncC->prev_NLSFq_Q15, NLSF_Q15, k, psEncC->predictLPCOrder ); /* Convert to LPC for residual energy evaluation */ silk_NLSF2A_FLP( a_tmp, NLSF0_Q15, psEncC->predictLPCOrder, psEncC->arch ); /* Calculate residual energy with LSF interpolation */ silk_LPC_analysis_filter_FLP( LPC_res, a_tmp, x, 2 * subfr_length, psEncC->predictLPCOrder ); res_nrg_interp = (silk_float)( silk_energy_FLP( LPC_res + psEncC->predictLPCOrder, subfr_length - psEncC->predictLPCOrder ) + silk_energy_FLP( LPC_res + psEncC->predictLPCOrder + subfr_length, subfr_length - psEncC->predictLPCOrder ) ); /* Determine whether current interpolated NLSFs are best so far */ if( res_nrg_interp < res_nrg ) { /* Interpolation has lower residual energy */ res_nrg = res_nrg_interp; psEncC->indices.NLSFInterpCoef_Q2 = (opus_int8)k; } else if( res_nrg_interp > res_nrg_2nd ) { /* No reason to continue iterating - residual energies will continue to climb */ break; } res_nrg_2nd = res_nrg_interp; } } if( psEncC->indices.NLSFInterpCoef_Q2 == 4 ) { /* NLSF interpolation is currently inactive, calculate NLSFs from full frame AR coefficients */ silk_A2NLSF_FLP( NLSF_Q15, a, psEncC->predictLPCOrder ); } silk_assert( psEncC->indices.NLSFInterpCoef_Q2 == 4 || ( psEncC->useInterpolatedNLSFs && !psEncC->first_frame_after_reset && psEncC->nb_subfr == MAX_NB_SUBFR ) ); } mumble-1.3.4/3rdparty/opus-src/silk/float/wrappers_FLP.c0000664000175000017500000002442714010707327022754 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main_FLP.h" /* Wrappers. Calls flp / fix code */ /* Convert AR filter coefficients to NLSF parameters */ void silk_A2NLSF_FLP( opus_int16 *NLSF_Q15, /* O NLSF vector [ LPC_order ] */ const silk_float *pAR, /* I LPC coefficients [ LPC_order ] */ const opus_int LPC_order /* I LPC order */ ) { opus_int i; opus_int32 a_fix_Q16[ MAX_LPC_ORDER ]; for( i = 0; i < LPC_order; i++ ) { a_fix_Q16[ i ] = silk_float2int( pAR[ i ] * 65536.0f ); } silk_A2NLSF( NLSF_Q15, a_fix_Q16, LPC_order ); } /* Convert LSF parameters to AR prediction filter coefficients */ void silk_NLSF2A_FLP( silk_float *pAR, /* O LPC coefficients [ LPC_order ] */ const opus_int16 *NLSF_Q15, /* I NLSF vector [ LPC_order ] */ const opus_int LPC_order, /* I LPC order */ int arch /* I Run-time architecture */ ) { opus_int i; opus_int16 a_fix_Q12[ MAX_LPC_ORDER ]; silk_NLSF2A( a_fix_Q12, NLSF_Q15, LPC_order, arch ); for( i = 0; i < LPC_order; i++ ) { pAR[ i ] = ( silk_float )a_fix_Q12[ i ] * ( 1.0f / 4096.0f ); } } /******************************************/ /* Floating-point NLSF processing wrapper */ /******************************************/ void silk_process_NLSFs_FLP( silk_encoder_state *psEncC, /* I/O Encoder state */ silk_float PredCoef[ 2 ][ MAX_LPC_ORDER ], /* O Prediction coefficients */ opus_int16 NLSF_Q15[ MAX_LPC_ORDER ], /* I/O Normalized LSFs (quant out) (0 - (2^15-1)) */ const opus_int16 prev_NLSF_Q15[ MAX_LPC_ORDER ] /* I Previous Normalized LSFs (0 - (2^15-1)) */ ) { opus_int i, j; opus_int16 PredCoef_Q12[ 2 ][ MAX_LPC_ORDER ]; silk_process_NLSFs( psEncC, PredCoef_Q12, NLSF_Q15, prev_NLSF_Q15); for( j = 0; j < 2; j++ ) { for( i = 0; i < psEncC->predictLPCOrder; i++ ) { PredCoef[ j ][ i ] = ( silk_float )PredCoef_Q12[ j ][ i ] * ( 1.0f / 4096.0f ); } } } /****************************************/ /* Floating-point Silk NSQ wrapper */ /****************************************/ void silk_NSQ_wrapper_FLP( silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ SideInfoIndices *psIndices, /* I/O Quantization indices */ silk_nsq_state *psNSQ, /* I/O Noise Shaping Quantzation state */ opus_int8 pulses[], /* O Quantized pulse signal */ const silk_float x[] /* I Prefiltered input signal */ ) { opus_int i, j; opus_int16 x16[ MAX_FRAME_LENGTH ]; opus_int32 Gains_Q16[ MAX_NB_SUBFR ]; silk_DWORD_ALIGN opus_int16 PredCoef_Q12[ 2 ][ MAX_LPC_ORDER ]; opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ]; opus_int LTP_scale_Q14; /* Noise shaping parameters */ opus_int16 AR_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ]; opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ]; /* Packs two int16 coefficients per int32 value */ opus_int Lambda_Q10; opus_int Tilt_Q14[ MAX_NB_SUBFR ]; opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ]; /* Convert control struct to fix control struct */ /* Noise shape parameters */ for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { for( j = 0; j < psEnc->sCmn.shapingLPCOrder; j++ ) { AR_Q13[ i * MAX_SHAPE_LPC_ORDER + j ] = silk_float2int( psEncCtrl->AR[ i * MAX_SHAPE_LPC_ORDER + j ] * 8192.0f ); } } for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { LF_shp_Q14[ i ] = silk_LSHIFT32( silk_float2int( psEncCtrl->LF_AR_shp[ i ] * 16384.0f ), 16 ) | (opus_uint16)silk_float2int( psEncCtrl->LF_MA_shp[ i ] * 16384.0f ); Tilt_Q14[ i ] = (opus_int)silk_float2int( psEncCtrl->Tilt[ i ] * 16384.0f ); HarmShapeGain_Q14[ i ] = (opus_int)silk_float2int( psEncCtrl->HarmShapeGain[ i ] * 16384.0f ); } Lambda_Q10 = ( opus_int )silk_float2int( psEncCtrl->Lambda * 1024.0f ); /* prediction and coding parameters */ for( i = 0; i < psEnc->sCmn.nb_subfr * LTP_ORDER; i++ ) { LTPCoef_Q14[ i ] = (opus_int16)silk_float2int( psEncCtrl->LTPCoef[ i ] * 16384.0f ); } for( j = 0; j < 2; j++ ) { for( i = 0; i < psEnc->sCmn.predictLPCOrder; i++ ) { PredCoef_Q12[ j ][ i ] = (opus_int16)silk_float2int( psEncCtrl->PredCoef[ j ][ i ] * 4096.0f ); } } for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { Gains_Q16[ i ] = silk_float2int( psEncCtrl->Gains[ i ] * 65536.0f ); silk_assert( Gains_Q16[ i ] > 0 ); } if( psIndices->signalType == TYPE_VOICED ) { LTP_scale_Q14 = silk_LTPScales_table_Q14[ psIndices->LTP_scaleIndex ]; } else { LTP_scale_Q14 = 0; } /* Convert input to fix */ for( i = 0; i < psEnc->sCmn.frame_length; i++ ) { x16[ i ] = silk_float2int( x[ i ] ); } /* Call NSQ */ if( psEnc->sCmn.nStatesDelayedDecision > 1 || psEnc->sCmn.warping_Q16 > 0 ) { silk_NSQ_del_dec( &psEnc->sCmn, psNSQ, psIndices, x16, pulses, PredCoef_Q12[ 0 ], LTPCoef_Q14, AR_Q13, HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, psEncCtrl->pitchL, Lambda_Q10, LTP_scale_Q14, psEnc->sCmn.arch ); } else { silk_NSQ( &psEnc->sCmn, psNSQ, psIndices, x16, pulses, PredCoef_Q12[ 0 ], LTPCoef_Q14, AR_Q13, HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, psEncCtrl->pitchL, Lambda_Q10, LTP_scale_Q14, psEnc->sCmn.arch ); } } /***********************************************/ /* Floating-point Silk LTP quantiation wrapper */ /***********************************************/ void silk_quant_LTP_gains_FLP( silk_float B[ MAX_NB_SUBFR * LTP_ORDER ], /* O Quantized LTP gains */ opus_int8 cbk_index[ MAX_NB_SUBFR ], /* O Codebook index */ opus_int8 *periodicity_index, /* O Periodicity index */ opus_int32 *sum_log_gain_Q7, /* I/O Cumulative max prediction gain */ silk_float *pred_gain_dB, /* O LTP prediction gain */ const silk_float XX[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* I Correlation matrix */ const silk_float xX[ MAX_NB_SUBFR * LTP_ORDER ], /* I Correlation vector */ const opus_int subfr_len, /* I Number of samples per subframe */ const opus_int nb_subfr, /* I Number of subframes */ int arch /* I Run-time architecture */ ) { opus_int i, pred_gain_dB_Q7; opus_int16 B_Q14[ MAX_NB_SUBFR * LTP_ORDER ]; opus_int32 XX_Q17[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ]; opus_int32 xX_Q17[ MAX_NB_SUBFR * LTP_ORDER ]; for( i = 0; i < nb_subfr * LTP_ORDER * LTP_ORDER; i++ ) { XX_Q17[ i ] = (opus_int32)silk_float2int( XX[ i ] * 131072.0f ); } for( i = 0; i < nb_subfr * LTP_ORDER; i++ ) { xX_Q17[ i ] = (opus_int32)silk_float2int( xX[ i ] * 131072.0f ); } silk_quant_LTP_gains( B_Q14, cbk_index, periodicity_index, sum_log_gain_Q7, &pred_gain_dB_Q7, XX_Q17, xX_Q17, subfr_len, nb_subfr, arch ); for( i = 0; i < nb_subfr * LTP_ORDER; i++ ) { B[ i ] = (silk_float)B_Q14[ i ] * ( 1.0f / 16384.0f ); } *pred_gain_dB = (silk_float)pred_gain_dB_Q7 * ( 1.0f / 128.0f ); } mumble-1.3.4/3rdparty/opus-src/silk/float/main_FLP.h0000664000175000017500000004544114010707327022041 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef SILK_MAIN_FLP_H #define SILK_MAIN_FLP_H #include "SigProc_FLP.h" #include "SigProc_FIX.h" #include "structs_FLP.h" #include "main.h" #include "define.h" #include "debug.h" #include "entenc.h" #ifdef __cplusplus extern "C" { #endif #define silk_encoder_state_Fxx silk_encoder_state_FLP #define silk_encode_do_VAD_Fxx silk_encode_do_VAD_FLP #define silk_encode_frame_Fxx silk_encode_frame_FLP /*********************/ /* Encoder Functions */ /*********************/ /* High-pass filter with cutoff frequency adaptation based on pitch lag statistics */ void silk_HP_variable_cutoff( silk_encoder_state_Fxx state_Fxx[] /* I/O Encoder states */ ); /* Encoder main function */ void silk_encode_do_VAD_FLP( silk_encoder_state_FLP *psEnc /* I/O Encoder state FLP */ ); /* Encoder main function */ opus_int silk_encode_frame_FLP( silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ opus_int32 *pnBytesOut, /* O Number of payload bytes; */ ec_enc *psRangeEnc, /* I/O compressor data structure */ opus_int condCoding, /* I The type of conditional coding to use */ opus_int maxBits, /* I If > 0: maximum number of output bits */ opus_int useCBR /* I Flag to force constant-bitrate operation */ ); /* Initializes the Silk encoder state */ opus_int silk_init_encoder( silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ int arch /* I Run-tim architecture */ ); /* Control the Silk encoder */ opus_int silk_control_encoder( silk_encoder_state_FLP *psEnc, /* I/O Pointer to Silk encoder state FLP */ silk_EncControlStruct *encControl, /* I Control structure */ const opus_int allow_bw_switch, /* I Flag to allow switching audio bandwidth */ const opus_int channelNb, /* I Channel number */ const opus_int force_fs_kHz ); /**************************/ /* Noise shaping analysis */ /**************************/ /* Compute noise shaping coefficients and initial gain values */ void silk_noise_shape_analysis_FLP( silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ const silk_float *pitch_res, /* I LPC residual from pitch analysis */ const silk_float *x /* I Input signal [frame_length + la_shape] */ ); /* Autocorrelations for a warped frequency axis */ void silk_warped_autocorrelation_FLP( silk_float *corr, /* O Result [order + 1] */ const silk_float *input, /* I Input data to correlate */ const silk_float warping, /* I Warping coefficient */ const opus_int length, /* I Length of input */ const opus_int order /* I Correlation order (even) */ ); /* Calculation of LTP state scaling */ void silk_LTP_scale_ctrl_FLP( silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ opus_int condCoding /* I The type of conditional coding to use */ ); /**********************************************/ /* Prediction Analysis */ /**********************************************/ /* Find pitch lags */ void silk_find_pitch_lags_FLP( silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ silk_float res[], /* O Residual */ const silk_float x[], /* I Speech signal */ int arch /* I Run-time architecture */ ); /* Find LPC and LTP coefficients */ void silk_find_pred_coefs_FLP( silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ const silk_float res_pitch[], /* I Residual from pitch analysis */ const silk_float x[], /* I Speech signal */ opus_int condCoding /* I The type of conditional coding to use */ ); /* LPC analysis */ void silk_find_LPC_FLP( silk_encoder_state *psEncC, /* I/O Encoder state */ opus_int16 NLSF_Q15[], /* O NLSFs */ const silk_float x[], /* I Input signal */ const silk_float minInvGain /* I Prediction gain from LTP (dB) */ ); /* LTP analysis */ void silk_find_LTP_FLP( silk_float XX[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* O Weight for LTP quantization */ silk_float xX[ MAX_NB_SUBFR * LTP_ORDER ], /* O Weight for LTP quantization */ const silk_float r_ptr[], /* I LPC residual */ const opus_int lag[ MAX_NB_SUBFR ], /* I LTP lags */ const opus_int subfr_length, /* I Subframe length */ const opus_int nb_subfr /* I number of subframes */ ); void silk_LTP_analysis_filter_FLP( silk_float *LTP_res, /* O LTP res MAX_NB_SUBFR*(pre_lgth+subfr_lngth) */ const silk_float *x, /* I Input signal, with preceding samples */ const silk_float B[ LTP_ORDER * MAX_NB_SUBFR ], /* I LTP coefficients for each subframe */ const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */ const silk_float invGains[ MAX_NB_SUBFR ], /* I Inverse quantization gains */ const opus_int subfr_length, /* I Length of each subframe */ const opus_int nb_subfr, /* I number of subframes */ const opus_int pre_length /* I Preceding samples for each subframe */ ); /* Calculates residual energies of input subframes where all subframes have LPC_order */ /* of preceding samples */ void silk_residual_energy_FLP( silk_float nrgs[ MAX_NB_SUBFR ], /* O Residual energy per subframe */ const silk_float x[], /* I Input signal */ silk_float a[ 2 ][ MAX_LPC_ORDER ], /* I AR coefs for each frame half */ const silk_float gains[], /* I Quantization gains */ const opus_int subfr_length, /* I Subframe length */ const opus_int nb_subfr, /* I number of subframes */ const opus_int LPC_order /* I LPC order */ ); /* 16th order LPC analysis filter */ void silk_LPC_analysis_filter_FLP( silk_float r_LPC[], /* O LPC residual signal */ const silk_float PredCoef[], /* I LPC coefficients */ const silk_float s[], /* I Input signal */ const opus_int length, /* I Length of input signal */ const opus_int Order /* I LPC order */ ); /* LTP tap quantizer */ void silk_quant_LTP_gains_FLP( silk_float B[ MAX_NB_SUBFR * LTP_ORDER ], /* O Quantized LTP gains */ opus_int8 cbk_index[ MAX_NB_SUBFR ], /* O Codebook index */ opus_int8 *periodicity_index, /* O Periodicity index */ opus_int32 *sum_log_gain_Q7, /* I/O Cumulative max prediction gain */ silk_float *pred_gain_dB, /* O LTP prediction gain */ const silk_float XX[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* I Correlation matrix */ const silk_float xX[ MAX_NB_SUBFR * LTP_ORDER ], /* I Correlation vector */ const opus_int subfr_len, /* I Number of samples per subframe */ const opus_int nb_subfr, /* I Number of subframes */ int arch /* I Run-time architecture */ ); /* Residual energy: nrg = wxx - 2 * wXx * c + c' * wXX * c */ silk_float silk_residual_energy_covar_FLP( /* O Weighted residual energy */ const silk_float *c, /* I Filter coefficients */ silk_float *wXX, /* I/O Weighted correlation matrix, reg. out */ const silk_float *wXx, /* I Weighted correlation vector */ const silk_float wxx, /* I Weighted correlation value */ const opus_int D /* I Dimension */ ); /* Processing of gains */ void silk_process_gains_FLP( silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ opus_int condCoding /* I The type of conditional coding to use */ ); /******************/ /* Linear Algebra */ /******************/ /* Calculates correlation matrix X'*X */ void silk_corrMatrix_FLP( const silk_float *x, /* I x vector [ L+order-1 ] used to create X */ const opus_int L, /* I Length of vectors */ const opus_int Order, /* I Max lag for correlation */ silk_float *XX /* O X'*X correlation matrix [order x order] */ ); /* Calculates correlation vector X'*t */ void silk_corrVector_FLP( const silk_float *x, /* I x vector [L+order-1] used to create X */ const silk_float *t, /* I Target vector [L] */ const opus_int L, /* I Length of vecors */ const opus_int Order, /* I Max lag for correlation */ silk_float *Xt /* O X'*t correlation vector [order] */ ); /* Apply sine window to signal vector. */ /* Window types: */ /* 1 -> sine window from 0 to pi/2 */ /* 2 -> sine window from pi/2 to pi */ void silk_apply_sine_window_FLP( silk_float px_win[], /* O Pointer to windowed signal */ const silk_float px[], /* I Pointer to input signal */ const opus_int win_type, /* I Selects a window type */ const opus_int length /* I Window length, multiple of 4 */ ); /* Wrapper functions. Call flp / fix code */ /* Convert AR filter coefficients to NLSF parameters */ void silk_A2NLSF_FLP( opus_int16 *NLSF_Q15, /* O NLSF vector [ LPC_order ] */ const silk_float *pAR, /* I LPC coefficients [ LPC_order ] */ const opus_int LPC_order /* I LPC order */ ); /* Convert NLSF parameters to AR prediction filter coefficients */ void silk_NLSF2A_FLP( silk_float *pAR, /* O LPC coefficients [ LPC_order ] */ const opus_int16 *NLSF_Q15, /* I NLSF vector [ LPC_order ] */ const opus_int LPC_order, /* I LPC order */ int arch /* I Run-time architecture */ ); /* Limit, stabilize, and quantize NLSFs */ void silk_process_NLSFs_FLP( silk_encoder_state *psEncC, /* I/O Encoder state */ silk_float PredCoef[ 2 ][ MAX_LPC_ORDER ], /* O Prediction coefficients */ opus_int16 NLSF_Q15[ MAX_LPC_ORDER ], /* I/O Normalized LSFs (quant out) (0 - (2^15-1)) */ const opus_int16 prev_NLSF_Q15[ MAX_LPC_ORDER ] /* I Previous Normalized LSFs (0 - (2^15-1)) */ ); /* Floating-point Silk NSQ wrapper */ void silk_NSQ_wrapper_FLP( silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ SideInfoIndices *psIndices, /* I/O Quantization indices */ silk_nsq_state *psNSQ, /* I/O Noise Shaping Quantzation state */ opus_int8 pulses[], /* O Quantized pulse signal */ const silk_float x[] /* I Prefiltered input signal */ ); #ifdef __cplusplus } #endif #endif mumble-1.3.4/3rdparty/opus-src/silk/float/LTP_analysis_filter_FLP.c0000664000175000017500000000722114010707327025011 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main_FLP.h" void silk_LTP_analysis_filter_FLP( silk_float *LTP_res, /* O LTP res MAX_NB_SUBFR*(pre_lgth+subfr_lngth) */ const silk_float *x, /* I Input signal, with preceding samples */ const silk_float B[ LTP_ORDER * MAX_NB_SUBFR ], /* I LTP coefficients for each subframe */ const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */ const silk_float invGains[ MAX_NB_SUBFR ], /* I Inverse quantization gains */ const opus_int subfr_length, /* I Length of each subframe */ const opus_int nb_subfr, /* I number of subframes */ const opus_int pre_length /* I Preceding samples for each subframe */ ) { const silk_float *x_ptr, *x_lag_ptr; silk_float Btmp[ LTP_ORDER ]; silk_float *LTP_res_ptr; silk_float inv_gain; opus_int k, i, j; x_ptr = x; LTP_res_ptr = LTP_res; for( k = 0; k < nb_subfr; k++ ) { x_lag_ptr = x_ptr - pitchL[ k ]; inv_gain = invGains[ k ]; for( i = 0; i < LTP_ORDER; i++ ) { Btmp[ i ] = B[ k * LTP_ORDER + i ]; } /* LTP analysis FIR filter */ for( i = 0; i < subfr_length + pre_length; i++ ) { LTP_res_ptr[ i ] = x_ptr[ i ]; /* Subtract long-term prediction */ for( j = 0; j < LTP_ORDER; j++ ) { LTP_res_ptr[ i ] -= Btmp[ j ] * x_lag_ptr[ LTP_ORDER / 2 - j ]; } LTP_res_ptr[ i ] *= inv_gain; x_lag_ptr++; } /* Update pointers */ LTP_res_ptr += subfr_length + pre_length; x_ptr += subfr_length; } } mumble-1.3.4/3rdparty/opus-src/silk/float/k2a_FLP.c0000664000175000017500000000474714010707327021571 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "SigProc_FLP.h" /* step up function, converts reflection coefficients to prediction coefficients */ void silk_k2a_FLP( silk_float *A, /* O prediction coefficients [order] */ const silk_float *rc, /* I reflection coefficients [order] */ opus_int32 order /* I prediction order */ ) { opus_int k, n; silk_float rck, tmp1, tmp2; for( k = 0; k < order; k++ ) { rck = rc[ k ]; for( n = 0; n < (k + 1) >> 1; n++ ) { tmp1 = A[ n ]; tmp2 = A[ k - n - 1 ]; A[ n ] = tmp1 + tmp2 * rck; A[ k - n - 1 ] = tmp2 + tmp1 * rck; } A[ k ] = -rck; } } mumble-1.3.4/3rdparty/opus-src/silk/float/regularize_correlations_FLP.c0000664000175000017500000000460514010707327026042 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main_FLP.h" /* Add noise to matrix diagonal */ void silk_regularize_correlations_FLP( silk_float *XX, /* I/O Correlation matrices */ silk_float *xx, /* I/O Correlation values */ const silk_float noise, /* I Noise energy to add */ const opus_int D /* I Dimension of XX */ ) { opus_int i; for( i = 0; i < D; i++ ) { matrix_ptr( &XX[ 0 ], i, i, D ) += noise; } xx[ 0 ] += noise; } mumble-1.3.4/3rdparty/opus-src/silk/float/encode_frame_FLP.c0000664000175000017500000005232414010707327023515 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "main_FLP.h" #include "tuning_parameters.h" /* Low Bitrate Redundancy (LBRR) encoding. Reuse all parameters but encode with lower bitrate */ static OPUS_INLINE void silk_LBRR_encode_FLP( silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ const silk_float xfw[], /* I Input signal */ opus_int condCoding /* I The type of conditional coding used so far for this frame */ ); void silk_encode_do_VAD_FLP( silk_encoder_state_FLP *psEnc /* I/O Encoder state FLP */ ) { /****************************/ /* Voice Activity Detection */ /****************************/ silk_VAD_GetSA_Q8( &psEnc->sCmn, psEnc->sCmn.inputBuf + 1, psEnc->sCmn.arch ); /**************************************************/ /* Convert speech activity into VAD and DTX flags */ /**************************************************/ if( psEnc->sCmn.speech_activity_Q8 < SILK_FIX_CONST( SPEECH_ACTIVITY_DTX_THRES, 8 ) ) { psEnc->sCmn.indices.signalType = TYPE_NO_VOICE_ACTIVITY; psEnc->sCmn.noSpeechCounter++; if( psEnc->sCmn.noSpeechCounter < NB_SPEECH_FRAMES_BEFORE_DTX ) { psEnc->sCmn.inDTX = 0; } else if( psEnc->sCmn.noSpeechCounter > MAX_CONSECUTIVE_DTX + NB_SPEECH_FRAMES_BEFORE_DTX ) { psEnc->sCmn.noSpeechCounter = NB_SPEECH_FRAMES_BEFORE_DTX; psEnc->sCmn.inDTX = 0; } psEnc->sCmn.VAD_flags[ psEnc->sCmn.nFramesEncoded ] = 0; } else { psEnc->sCmn.noSpeechCounter = 0; psEnc->sCmn.inDTX = 0; psEnc->sCmn.indices.signalType = TYPE_UNVOICED; psEnc->sCmn.VAD_flags[ psEnc->sCmn.nFramesEncoded ] = 1; } } /****************/ /* Encode frame */ /****************/ opus_int silk_encode_frame_FLP( silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ opus_int32 *pnBytesOut, /* O Number of payload bytes; */ ec_enc *psRangeEnc, /* I/O compressor data structure */ opus_int condCoding, /* I The type of conditional coding to use */ opus_int maxBits, /* I If > 0: maximum number of output bits */ opus_int useCBR /* I Flag to force constant-bitrate operation */ ) { silk_encoder_control_FLP sEncCtrl; opus_int i, iter, maxIter, found_upper, found_lower, ret = 0; silk_float *x_frame, *res_pitch_frame; silk_float res_pitch[ 2 * MAX_FRAME_LENGTH + LA_PITCH_MAX ]; ec_enc sRangeEnc_copy, sRangeEnc_copy2; silk_nsq_state sNSQ_copy, sNSQ_copy2; opus_int32 seed_copy, nBits, nBits_lower, nBits_upper, gainMult_lower, gainMult_upper; opus_int32 gainsID, gainsID_lower, gainsID_upper; opus_int16 gainMult_Q8; opus_int16 ec_prevLagIndex_copy; opus_int ec_prevSignalType_copy; opus_int8 LastGainIndex_copy2; opus_int32 pGains_Q16[ MAX_NB_SUBFR ]; opus_uint8 ec_buf_copy[ 1275 ]; opus_int gain_lock[ MAX_NB_SUBFR ] = {0}; opus_int16 best_gain_mult[ MAX_NB_SUBFR ]; opus_int best_sum[ MAX_NB_SUBFR ]; /* This is totally unnecessary but many compilers (including gcc) are too dumb to realise it */ LastGainIndex_copy2 = nBits_lower = nBits_upper = gainMult_lower = gainMult_upper = 0; psEnc->sCmn.indices.Seed = psEnc->sCmn.frameCounter++ & 3; /**************************************************************/ /* Set up Input Pointers, and insert frame in input buffer */ /**************************************************************/ /* pointers aligned with start of frame to encode */ x_frame = psEnc->x_buf + psEnc->sCmn.ltp_mem_length; /* start of frame to encode */ res_pitch_frame = res_pitch + psEnc->sCmn.ltp_mem_length; /* start of pitch LPC residual frame */ /***************************************/ /* Ensure smooth bandwidth transitions */ /***************************************/ silk_LP_variable_cutoff( &psEnc->sCmn.sLP, psEnc->sCmn.inputBuf + 1, psEnc->sCmn.frame_length ); /*******************************************/ /* Copy new frame to front of input buffer */ /*******************************************/ silk_short2float_array( x_frame + LA_SHAPE_MS * psEnc->sCmn.fs_kHz, psEnc->sCmn.inputBuf + 1, psEnc->sCmn.frame_length ); /* Add tiny signal to avoid high CPU load from denormalized floating point numbers */ for( i = 0; i < 8; i++ ) { x_frame[ LA_SHAPE_MS * psEnc->sCmn.fs_kHz + i * ( psEnc->sCmn.frame_length >> 3 ) ] += ( 1 - ( i & 2 ) ) * 1e-6f; } if( !psEnc->sCmn.prefillFlag ) { /*****************************************/ /* Find pitch lags, initial LPC analysis */ /*****************************************/ silk_find_pitch_lags_FLP( psEnc, &sEncCtrl, res_pitch, x_frame, psEnc->sCmn.arch ); /************************/ /* Noise shape analysis */ /************************/ silk_noise_shape_analysis_FLP( psEnc, &sEncCtrl, res_pitch_frame, x_frame ); /***************************************************/ /* Find linear prediction coefficients (LPC + LTP) */ /***************************************************/ silk_find_pred_coefs_FLP( psEnc, &sEncCtrl, res_pitch_frame, x_frame, condCoding ); /****************************************/ /* Process gains */ /****************************************/ silk_process_gains_FLP( psEnc, &sEncCtrl, condCoding ); /****************************************/ /* Low Bitrate Redundant Encoding */ /****************************************/ silk_LBRR_encode_FLP( psEnc, &sEncCtrl, x_frame, condCoding ); /* Loop over quantizer and entroy coding to control bitrate */ maxIter = 6; gainMult_Q8 = SILK_FIX_CONST( 1, 8 ); found_lower = 0; found_upper = 0; gainsID = silk_gains_ID( psEnc->sCmn.indices.GainsIndices, psEnc->sCmn.nb_subfr ); gainsID_lower = -1; gainsID_upper = -1; /* Copy part of the input state */ silk_memcpy( &sRangeEnc_copy, psRangeEnc, sizeof( ec_enc ) ); silk_memcpy( &sNSQ_copy, &psEnc->sCmn.sNSQ, sizeof( silk_nsq_state ) ); seed_copy = psEnc->sCmn.indices.Seed; ec_prevLagIndex_copy = psEnc->sCmn.ec_prevLagIndex; ec_prevSignalType_copy = psEnc->sCmn.ec_prevSignalType; for( iter = 0; ; iter++ ) { if( gainsID == gainsID_lower ) { nBits = nBits_lower; } else if( gainsID == gainsID_upper ) { nBits = nBits_upper; } else { /* Restore part of the input state */ if( iter > 0 ) { silk_memcpy( psRangeEnc, &sRangeEnc_copy, sizeof( ec_enc ) ); silk_memcpy( &psEnc->sCmn.sNSQ, &sNSQ_copy, sizeof( silk_nsq_state ) ); psEnc->sCmn.indices.Seed = seed_copy; psEnc->sCmn.ec_prevLagIndex = ec_prevLagIndex_copy; psEnc->sCmn.ec_prevSignalType = ec_prevSignalType_copy; } /*****************************************/ /* Noise shaping quantization */ /*****************************************/ silk_NSQ_wrapper_FLP( psEnc, &sEncCtrl, &psEnc->sCmn.indices, &psEnc->sCmn.sNSQ, psEnc->sCmn.pulses, x_frame ); if ( iter == maxIter && !found_lower ) { silk_memcpy( &sRangeEnc_copy2, psRangeEnc, sizeof( ec_enc ) ); } /****************************************/ /* Encode Parameters */ /****************************************/ silk_encode_indices( &psEnc->sCmn, psRangeEnc, psEnc->sCmn.nFramesEncoded, 0, condCoding ); /****************************************/ /* Encode Excitation Signal */ /****************************************/ silk_encode_pulses( psRangeEnc, psEnc->sCmn.indices.signalType, psEnc->sCmn.indices.quantOffsetType, psEnc->sCmn.pulses, psEnc->sCmn.frame_length ); nBits = ec_tell( psRangeEnc ); /* If we still bust after the last iteration, do some damage control. */ if ( iter == maxIter && !found_lower && nBits > maxBits ) { silk_memcpy( psRangeEnc, &sRangeEnc_copy2, sizeof( ec_enc ) ); /* Keep gains the same as the last frame. */ psEnc->sShape.LastGainIndex = sEncCtrl.lastGainIndexPrev; for ( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { psEnc->sCmn.indices.GainsIndices[ i ] = 4; } if (condCoding != CODE_CONDITIONALLY) { psEnc->sCmn.indices.GainsIndices[ 0 ] = sEncCtrl.lastGainIndexPrev; } psEnc->sCmn.ec_prevLagIndex = ec_prevLagIndex_copy; psEnc->sCmn.ec_prevSignalType = ec_prevSignalType_copy; /* Clear all pulses. */ for ( i = 0; i < psEnc->sCmn.frame_length; i++ ) { psEnc->sCmn.pulses[ i ] = 0; } silk_encode_indices( &psEnc->sCmn, psRangeEnc, psEnc->sCmn.nFramesEncoded, 0, condCoding ); silk_encode_pulses( psRangeEnc, psEnc->sCmn.indices.signalType, psEnc->sCmn.indices.quantOffsetType, psEnc->sCmn.pulses, psEnc->sCmn.frame_length ); nBits = ec_tell( psRangeEnc ); } if( useCBR == 0 && iter == 0 && nBits <= maxBits ) { break; } } if( iter == maxIter ) { if( found_lower && ( gainsID == gainsID_lower || nBits > maxBits ) ) { /* Restore output state from earlier iteration that did meet the bitrate budget */ silk_memcpy( psRangeEnc, &sRangeEnc_copy2, sizeof( ec_enc ) ); silk_assert( sRangeEnc_copy2.offs <= 1275 ); silk_memcpy( psRangeEnc->buf, ec_buf_copy, sRangeEnc_copy2.offs ); silk_memcpy( &psEnc->sCmn.sNSQ, &sNSQ_copy2, sizeof( silk_nsq_state ) ); psEnc->sShape.LastGainIndex = LastGainIndex_copy2; } break; } if( nBits > maxBits ) { if( found_lower == 0 && iter >= 2 ) { /* Adjust the quantizer's rate/distortion tradeoff and discard previous "upper" results */ sEncCtrl.Lambda = silk_max_float(sEncCtrl.Lambda*1.5f, 1.5f); /* Reducing dithering can help us hit the target. */ psEnc->sCmn.indices.quantOffsetType = 0; found_upper = 0; gainsID_upper = -1; } else { found_upper = 1; nBits_upper = nBits; gainMult_upper = gainMult_Q8; gainsID_upper = gainsID; } } else if( nBits < maxBits - 5 ) { found_lower = 1; nBits_lower = nBits; gainMult_lower = gainMult_Q8; if( gainsID != gainsID_lower ) { gainsID_lower = gainsID; /* Copy part of the output state */ silk_memcpy( &sRangeEnc_copy2, psRangeEnc, sizeof( ec_enc ) ); silk_assert( psRangeEnc->offs <= 1275 ); silk_memcpy( ec_buf_copy, psRangeEnc->buf, psRangeEnc->offs ); silk_memcpy( &sNSQ_copy2, &psEnc->sCmn.sNSQ, sizeof( silk_nsq_state ) ); LastGainIndex_copy2 = psEnc->sShape.LastGainIndex; } } else { /* Within 5 bits of budget: close enough */ break; } if ( !found_lower && nBits > maxBits ) { int j; for ( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { int sum=0; for ( j = i*psEnc->sCmn.subfr_length; j < (i+1)*psEnc->sCmn.subfr_length; j++ ) { sum += abs( psEnc->sCmn.pulses[j] ); } if ( iter == 0 || (sum < best_sum[i] && !gain_lock[i]) ) { best_sum[i] = sum; best_gain_mult[i] = gainMult_Q8; } else { gain_lock[i] = 1; } } } if( ( found_lower & found_upper ) == 0 ) { /* Adjust gain according to high-rate rate/distortion curve */ if( nBits > maxBits ) { if (gainMult_Q8 < 16384) { gainMult_Q8 *= 2; } else { gainMult_Q8 = 32767; } } else { opus_int32 gain_factor_Q16; gain_factor_Q16 = silk_log2lin( silk_LSHIFT( nBits - maxBits, 7 ) / psEnc->sCmn.frame_length + SILK_FIX_CONST( 16, 7 ) ); gainMult_Q8 = silk_SMULWB( gain_factor_Q16, gainMult_Q8 ); } } else { /* Adjust gain by interpolating */ gainMult_Q8 = gainMult_lower + ( ( gainMult_upper - gainMult_lower ) * ( maxBits - nBits_lower ) ) / ( nBits_upper - nBits_lower ); /* New gain multplier must be between 25% and 75% of old range (note that gainMult_upper < gainMult_lower) */ if( gainMult_Q8 > silk_ADD_RSHIFT32( gainMult_lower, gainMult_upper - gainMult_lower, 2 ) ) { gainMult_Q8 = silk_ADD_RSHIFT32( gainMult_lower, gainMult_upper - gainMult_lower, 2 ); } else if( gainMult_Q8 < silk_SUB_RSHIFT32( gainMult_upper, gainMult_upper - gainMult_lower, 2 ) ) { gainMult_Q8 = silk_SUB_RSHIFT32( gainMult_upper, gainMult_upper - gainMult_lower, 2 ); } } for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { opus_int16 tmp; if ( gain_lock[i] ) { tmp = best_gain_mult[i]; } else { tmp = gainMult_Q8; } pGains_Q16[ i ] = silk_LSHIFT_SAT32( silk_SMULWB( sEncCtrl.GainsUnq_Q16[ i ], tmp ), 8 ); } /* Quantize gains */ psEnc->sShape.LastGainIndex = sEncCtrl.lastGainIndexPrev; silk_gains_quant( psEnc->sCmn.indices.GainsIndices, pGains_Q16, &psEnc->sShape.LastGainIndex, condCoding == CODE_CONDITIONALLY, psEnc->sCmn.nb_subfr ); /* Unique identifier of gains vector */ gainsID = silk_gains_ID( psEnc->sCmn.indices.GainsIndices, psEnc->sCmn.nb_subfr ); /* Overwrite unquantized gains with quantized gains and convert back to Q0 from Q16 */ for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { sEncCtrl.Gains[ i ] = pGains_Q16[ i ] / 65536.0f; } } } /* Update input buffer */ silk_memmove( psEnc->x_buf, &psEnc->x_buf[ psEnc->sCmn.frame_length ], ( psEnc->sCmn.ltp_mem_length + LA_SHAPE_MS * psEnc->sCmn.fs_kHz ) * sizeof( silk_float ) ); /* Exit without entropy coding */ if( psEnc->sCmn.prefillFlag ) { /* No payload */ *pnBytesOut = 0; return ret; } /* Parameters needed for next frame */ psEnc->sCmn.prevLag = sEncCtrl.pitchL[ psEnc->sCmn.nb_subfr - 1 ]; psEnc->sCmn.prevSignalType = psEnc->sCmn.indices.signalType; /****************************************/ /* Finalize payload */ /****************************************/ psEnc->sCmn.first_frame_after_reset = 0; /* Payload size */ *pnBytesOut = silk_RSHIFT( ec_tell( psRangeEnc ) + 7, 3 ); return ret; } /* Low-Bitrate Redundancy (LBRR) encoding. Reuse all parameters but encode excitation at lower bitrate */ static OPUS_INLINE void silk_LBRR_encode_FLP( silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ const silk_float xfw[], /* I Input signal */ opus_int condCoding /* I The type of conditional coding used so far for this frame */ ) { opus_int k; opus_int32 Gains_Q16[ MAX_NB_SUBFR ]; silk_float TempGains[ MAX_NB_SUBFR ]; SideInfoIndices *psIndices_LBRR = &psEnc->sCmn.indices_LBRR[ psEnc->sCmn.nFramesEncoded ]; silk_nsq_state sNSQ_LBRR; /*******************************************/ /* Control use of inband LBRR */ /*******************************************/ if( psEnc->sCmn.LBRR_enabled && psEnc->sCmn.speech_activity_Q8 > SILK_FIX_CONST( LBRR_SPEECH_ACTIVITY_THRES, 8 ) ) { psEnc->sCmn.LBRR_flags[ psEnc->sCmn.nFramesEncoded ] = 1; /* Copy noise shaping quantizer state and quantization indices from regular encoding */ silk_memcpy( &sNSQ_LBRR, &psEnc->sCmn.sNSQ, sizeof( silk_nsq_state ) ); silk_memcpy( psIndices_LBRR, &psEnc->sCmn.indices, sizeof( SideInfoIndices ) ); /* Save original gains */ silk_memcpy( TempGains, psEncCtrl->Gains, psEnc->sCmn.nb_subfr * sizeof( silk_float ) ); if( psEnc->sCmn.nFramesEncoded == 0 || psEnc->sCmn.LBRR_flags[ psEnc->sCmn.nFramesEncoded - 1 ] == 0 ) { /* First frame in packet or previous frame not LBRR coded */ psEnc->sCmn.LBRRprevLastGainIndex = psEnc->sShape.LastGainIndex; /* Increase Gains to get target LBRR rate */ psIndices_LBRR->GainsIndices[ 0 ] += psEnc->sCmn.LBRR_GainIncreases; psIndices_LBRR->GainsIndices[ 0 ] = silk_min_int( psIndices_LBRR->GainsIndices[ 0 ], N_LEVELS_QGAIN - 1 ); } /* Decode to get gains in sync with decoder */ silk_gains_dequant( Gains_Q16, psIndices_LBRR->GainsIndices, &psEnc->sCmn.LBRRprevLastGainIndex, condCoding == CODE_CONDITIONALLY, psEnc->sCmn.nb_subfr ); /* Overwrite unquantized gains with quantized gains and convert back to Q0 from Q16 */ for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { psEncCtrl->Gains[ k ] = Gains_Q16[ k ] * ( 1.0f / 65536.0f ); } /*****************************************/ /* Noise shaping quantization */ /*****************************************/ silk_NSQ_wrapper_FLP( psEnc, psEncCtrl, psIndices_LBRR, &sNSQ_LBRR, psEnc->sCmn.pulses_LBRR[ psEnc->sCmn.nFramesEncoded ], xfw ); /* Restore original gains */ silk_memcpy( psEncCtrl->Gains, TempGains, psEnc->sCmn.nb_subfr * sizeof( silk_float ) ); } } mumble-1.3.4/3rdparty/opus-src/silk/float/find_pitch_lags_FLP.c0000664000175000017500000001452014010707327024217 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "main_FLP.h" #include "tuning_parameters.h" void silk_find_pitch_lags_FLP( silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ silk_float res[], /* O Residual */ const silk_float x[], /* I Speech signal */ int arch /* I Run-time architecture */ ) { opus_int buf_len; silk_float thrhld, res_nrg; const silk_float *x_buf_ptr, *x_buf; silk_float auto_corr[ MAX_FIND_PITCH_LPC_ORDER + 1 ]; silk_float A[ MAX_FIND_PITCH_LPC_ORDER ]; silk_float refl_coef[ MAX_FIND_PITCH_LPC_ORDER ]; silk_float Wsig[ FIND_PITCH_LPC_WIN_MAX ]; silk_float *Wsig_ptr; /******************************************/ /* Set up buffer lengths etc based on Fs */ /******************************************/ buf_len = psEnc->sCmn.la_pitch + psEnc->sCmn.frame_length + psEnc->sCmn.ltp_mem_length; /* Safety check */ silk_assert( buf_len >= psEnc->sCmn.pitch_LPC_win_length ); x_buf = x - psEnc->sCmn.ltp_mem_length; /******************************************/ /* Estimate LPC AR coeficients */ /******************************************/ /* Calculate windowed signal */ /* First LA_LTP samples */ x_buf_ptr = x_buf + buf_len - psEnc->sCmn.pitch_LPC_win_length; Wsig_ptr = Wsig; silk_apply_sine_window_FLP( Wsig_ptr, x_buf_ptr, 1, psEnc->sCmn.la_pitch ); /* Middle non-windowed samples */ Wsig_ptr += psEnc->sCmn.la_pitch; x_buf_ptr += psEnc->sCmn.la_pitch; silk_memcpy( Wsig_ptr, x_buf_ptr, ( psEnc->sCmn.pitch_LPC_win_length - ( psEnc->sCmn.la_pitch << 1 ) ) * sizeof( silk_float ) ); /* Last LA_LTP samples */ Wsig_ptr += psEnc->sCmn.pitch_LPC_win_length - ( psEnc->sCmn.la_pitch << 1 ); x_buf_ptr += psEnc->sCmn.pitch_LPC_win_length - ( psEnc->sCmn.la_pitch << 1 ); silk_apply_sine_window_FLP( Wsig_ptr, x_buf_ptr, 2, psEnc->sCmn.la_pitch ); /* Calculate autocorrelation sequence */ silk_autocorrelation_FLP( auto_corr, Wsig, psEnc->sCmn.pitch_LPC_win_length, psEnc->sCmn.pitchEstimationLPCOrder + 1 ); /* Add white noise, as a fraction of the energy */ auto_corr[ 0 ] += auto_corr[ 0 ] * FIND_PITCH_WHITE_NOISE_FRACTION + 1; /* Calculate the reflection coefficients using Schur */ res_nrg = silk_schur_FLP( refl_coef, auto_corr, psEnc->sCmn.pitchEstimationLPCOrder ); /* Prediction gain */ psEncCtrl->predGain = auto_corr[ 0 ] / silk_max_float( res_nrg, 1.0f ); /* Convert reflection coefficients to prediction coefficients */ silk_k2a_FLP( A, refl_coef, psEnc->sCmn.pitchEstimationLPCOrder ); /* Bandwidth expansion */ silk_bwexpander_FLP( A, psEnc->sCmn.pitchEstimationLPCOrder, FIND_PITCH_BANDWIDTH_EXPANSION ); /*****************************************/ /* LPC analysis filtering */ /*****************************************/ silk_LPC_analysis_filter_FLP( res, A, x_buf, buf_len, psEnc->sCmn.pitchEstimationLPCOrder ); if( psEnc->sCmn.indices.signalType != TYPE_NO_VOICE_ACTIVITY && psEnc->sCmn.first_frame_after_reset == 0 ) { /* Threshold for pitch estimator */ thrhld = 0.6f; thrhld -= 0.004f * psEnc->sCmn.pitchEstimationLPCOrder; thrhld -= 0.1f * psEnc->sCmn.speech_activity_Q8 * ( 1.0f / 256.0f ); thrhld -= 0.15f * (psEnc->sCmn.prevSignalType >> 1); thrhld -= 0.1f * psEnc->sCmn.input_tilt_Q15 * ( 1.0f / 32768.0f ); /*****************************************/ /* Call Pitch estimator */ /*****************************************/ if( silk_pitch_analysis_core_FLP( res, psEncCtrl->pitchL, &psEnc->sCmn.indices.lagIndex, &psEnc->sCmn.indices.contourIndex, &psEnc->LTPCorr, psEnc->sCmn.prevLag, psEnc->sCmn.pitchEstimationThreshold_Q16 / 65536.0f, thrhld, psEnc->sCmn.fs_kHz, psEnc->sCmn.pitchEstimationComplexity, psEnc->sCmn.nb_subfr, arch ) == 0 ) { psEnc->sCmn.indices.signalType = TYPE_VOICED; } else { psEnc->sCmn.indices.signalType = TYPE_UNVOICED; } } else { silk_memset( psEncCtrl->pitchL, 0, sizeof( psEncCtrl->pitchL ) ); psEnc->sCmn.indices.lagIndex = 0; psEnc->sCmn.indices.contourIndex = 0; psEnc->LTPCorr = 0; } } mumble-1.3.4/3rdparty/opus-src/silk/float/process_gains_FLP.c0000664000175000017500000001176314010707327023747 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main_FLP.h" #include "tuning_parameters.h" /* Processing of gains */ void silk_process_gains_FLP( silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ opus_int condCoding /* I The type of conditional coding to use */ ) { silk_shape_state_FLP *psShapeSt = &psEnc->sShape; opus_int k; opus_int32 pGains_Q16[ MAX_NB_SUBFR ]; silk_float s, InvMaxSqrVal, gain, quant_offset; /* Gain reduction when LTP coding gain is high */ if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { s = 1.0f - 0.5f * silk_sigmoid( 0.25f * ( psEncCtrl->LTPredCodGain - 12.0f ) ); for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { psEncCtrl->Gains[ k ] *= s; } } /* Limit the quantized signal */ InvMaxSqrVal = ( silk_float )( pow( 2.0f, 0.33f * ( 21.0f - psEnc->sCmn.SNR_dB_Q7 * ( 1 / 128.0f ) ) ) / psEnc->sCmn.subfr_length ); for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { /* Soft limit on ratio residual energy and squared gains */ gain = psEncCtrl->Gains[ k ]; gain = ( silk_float )sqrt( gain * gain + psEncCtrl->ResNrg[ k ] * InvMaxSqrVal ); psEncCtrl->Gains[ k ] = silk_min_float( gain, 32767.0f ); } /* Prepare gains for noise shaping quantization */ for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { pGains_Q16[ k ] = (opus_int32)( psEncCtrl->Gains[ k ] * 65536.0f ); } /* Save unquantized gains and gain Index */ silk_memcpy( psEncCtrl->GainsUnq_Q16, pGains_Q16, psEnc->sCmn.nb_subfr * sizeof( opus_int32 ) ); psEncCtrl->lastGainIndexPrev = psShapeSt->LastGainIndex; /* Quantize gains */ silk_gains_quant( psEnc->sCmn.indices.GainsIndices, pGains_Q16, &psShapeSt->LastGainIndex, condCoding == CODE_CONDITIONALLY, psEnc->sCmn.nb_subfr ); /* Overwrite unquantized gains with quantized gains and convert back to Q0 from Q16 */ for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { psEncCtrl->Gains[ k ] = pGains_Q16[ k ] / 65536.0f; } /* Set quantizer offset for voiced signals. Larger offset when LTP coding gain is low or tilt is high (ie low-pass) */ if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { if( psEncCtrl->LTPredCodGain + psEnc->sCmn.input_tilt_Q15 * ( 1.0f / 32768.0f ) > 1.0f ) { psEnc->sCmn.indices.quantOffsetType = 0; } else { psEnc->sCmn.indices.quantOffsetType = 1; } } /* Quantizer boundary adjustment */ quant_offset = silk_Quantization_Offsets_Q10[ psEnc->sCmn.indices.signalType >> 1 ][ psEnc->sCmn.indices.quantOffsetType ] / 1024.0f; psEncCtrl->Lambda = LAMBDA_OFFSET + LAMBDA_DELAYED_DECISIONS * psEnc->sCmn.nStatesDelayedDecision + LAMBDA_SPEECH_ACT * psEnc->sCmn.speech_activity_Q8 * ( 1.0f / 256.0f ) + LAMBDA_INPUT_QUALITY * psEncCtrl->input_quality + LAMBDA_CODING_QUALITY * psEncCtrl->coding_quality + LAMBDA_QUANT_OFFSET * quant_offset; silk_assert( psEncCtrl->Lambda > 0.0f ); silk_assert( psEncCtrl->Lambda < 2.0f ); } mumble-1.3.4/3rdparty/opus-src/silk/float/LTP_scale_ctrl_FLP.c0000664000175000017500000000520714010707327023736 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main_FLP.h" void silk_LTP_scale_ctrl_FLP( silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ opus_int condCoding /* I The type of conditional coding to use */ ) { opus_int round_loss; if( condCoding == CODE_INDEPENDENTLY ) { /* Only scale if first frame in packet */ round_loss = psEnc->sCmn.PacketLoss_perc + psEnc->sCmn.nFramesPerPacket; psEnc->sCmn.indices.LTP_scaleIndex = (opus_int8)silk_LIMIT( round_loss * psEncCtrl->LTPredCodGain * 0.1f, 0.0f, 2.0f ); } else { /* Default is minimum scaling */ psEnc->sCmn.indices.LTP_scaleIndex = 0; } psEncCtrl->LTP_scale = (silk_float)silk_LTPScales_table_Q14[ psEnc->sCmn.indices.LTP_scaleIndex ] / 16384.0f; } mumble-1.3.4/3rdparty/opus-src/silk/float/SigProc_FLP.h0000664000175000017500000002255314010707327022462 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef SILK_SIGPROC_FLP_H #define SILK_SIGPROC_FLP_H #include "SigProc_FIX.h" #include "float_cast.h" #include #ifdef __cplusplus extern "C" { #endif /********************************************************************/ /* SIGNAL PROCESSING FUNCTIONS */ /********************************************************************/ /* Chirp (bw expand) LP AR filter */ void silk_bwexpander_FLP( silk_float *ar, /* I/O AR filter to be expanded (without leading 1) */ const opus_int d, /* I length of ar */ const silk_float chirp /* I chirp factor (typically in range (0..1) ) */ ); /* compute inverse of LPC prediction gain, and */ /* test if LPC coefficients are stable (all poles within unit circle) */ /* this code is based on silk_FLP_a2k() */ silk_float silk_LPC_inverse_pred_gain_FLP( /* O return inverse prediction gain, energy domain */ const silk_float *A, /* I prediction coefficients [order] */ opus_int32 order /* I prediction order */ ); silk_float silk_schur_FLP( /* O returns residual energy */ silk_float refl_coef[], /* O reflection coefficients (length order) */ const silk_float auto_corr[], /* I autocorrelation sequence (length order+1) */ opus_int order /* I order */ ); void silk_k2a_FLP( silk_float *A, /* O prediction coefficients [order] */ const silk_float *rc, /* I reflection coefficients [order] */ opus_int32 order /* I prediction order */ ); /* compute autocorrelation */ void silk_autocorrelation_FLP( silk_float *results, /* O result (length correlationCount) */ const silk_float *inputData, /* I input data to correlate */ opus_int inputDataSize, /* I length of input */ opus_int correlationCount /* I number of correlation taps to compute */ ); opus_int silk_pitch_analysis_core_FLP( /* O Voicing estimate: 0 voiced, 1 unvoiced */ const silk_float *frame, /* I Signal of length PE_FRAME_LENGTH_MS*Fs_kHz */ opus_int *pitch_out, /* O Pitch lag values [nb_subfr] */ opus_int16 *lagIndex, /* O Lag Index */ opus_int8 *contourIndex, /* O Pitch contour Index */ silk_float *LTPCorr, /* I/O Normalized correlation; input: value from previous frame */ opus_int prevLag, /* I Last lag of previous frame; set to zero is unvoiced */ const silk_float search_thres1, /* I First stage threshold for lag candidates 0 - 1 */ const silk_float search_thres2, /* I Final threshold for lag candidates 0 - 1 */ const opus_int Fs_kHz, /* I sample frequency (kHz) */ const opus_int complexity, /* I Complexity setting, 0-2, where 2 is highest */ const opus_int nb_subfr, /* I Number of 5 ms subframes */ int arch /* I Run-time architecture */ ); void silk_insertion_sort_decreasing_FLP( silk_float *a, /* I/O Unsorted / Sorted vector */ opus_int *idx, /* O Index vector for the sorted elements */ const opus_int L, /* I Vector length */ const opus_int K /* I Number of correctly sorted positions */ ); /* Compute reflection coefficients from input signal */ silk_float silk_burg_modified_FLP( /* O returns residual energy */ silk_float A[], /* O prediction coefficients (length order) */ const silk_float x[], /* I input signal, length: nb_subfr*(D+L_sub) */ const silk_float minInvGain, /* I minimum inverse prediction gain */ const opus_int subfr_length, /* I input signal subframe length (incl. D preceding samples) */ const opus_int nb_subfr, /* I number of subframes stacked in x */ const opus_int D /* I order */ ); /* multiply a vector by a constant */ void silk_scale_vector_FLP( silk_float *data1, silk_float gain, opus_int dataSize ); /* copy and multiply a vector by a constant */ void silk_scale_copy_vector_FLP( silk_float *data_out, const silk_float *data_in, silk_float gain, opus_int dataSize ); /* inner product of two silk_float arrays, with result as double */ double silk_inner_product_FLP( const silk_float *data1, const silk_float *data2, opus_int dataSize ); /* sum of squares of a silk_float array, with result as double */ double silk_energy_FLP( const silk_float *data, opus_int dataSize ); /********************************************************************/ /* MACROS */ /********************************************************************/ #define PI (3.1415926536f) #define silk_min_float( a, b ) (((a) < (b)) ? (a) : (b)) #define silk_max_float( a, b ) (((a) > (b)) ? (a) : (b)) #define silk_abs_float( a ) ((silk_float)fabs(a)) /* sigmoid function */ static OPUS_INLINE silk_float silk_sigmoid( silk_float x ) { return (silk_float)(1.0 / (1.0 + exp(-x))); } /* floating-point to integer conversion (rounding) */ static OPUS_INLINE opus_int32 silk_float2int( silk_float x ) { return (opus_int32)float2int( x ); } /* floating-point to integer conversion (rounding) */ static OPUS_INLINE void silk_float2short_array( opus_int16 *out, const silk_float *in, opus_int32 length ) { opus_int32 k; for( k = length - 1; k >= 0; k-- ) { out[k] = silk_SAT16( (opus_int32)float2int( in[k] ) ); } } /* integer to floating-point conversion */ static OPUS_INLINE void silk_short2float_array( silk_float *out, const opus_int16 *in, opus_int32 length ) { opus_int32 k; for( k = length - 1; k >= 0; k-- ) { out[k] = (silk_float)in[k]; } } /* using log2() helps the fixed-point conversion */ static OPUS_INLINE silk_float silk_log2( double x ) { return ( silk_float )( 3.32192809488736 * log10( x ) ); } #ifdef __cplusplus } #endif #endif /* SILK_SIGPROC_FLP_H */ mumble-1.3.4/3rdparty/opus-src/silk/float/corrMatrix_FLP.c0000664000175000017500000001135014010707327023232 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif /********************************************************************** * Correlation matrix computations for LS estimate. **********************************************************************/ #include "main_FLP.h" /* Calculates correlation vector X'*t */ void silk_corrVector_FLP( const silk_float *x, /* I x vector [L+order-1] used to create X */ const silk_float *t, /* I Target vector [L] */ const opus_int L, /* I Length of vecors */ const opus_int Order, /* I Max lag for correlation */ silk_float *Xt /* O X'*t correlation vector [order] */ ) { opus_int lag; const silk_float *ptr1; ptr1 = &x[ Order - 1 ]; /* Points to first sample of column 0 of X: X[:,0] */ for( lag = 0; lag < Order; lag++ ) { /* Calculate X[:,lag]'*t */ Xt[ lag ] = (silk_float)silk_inner_product_FLP( ptr1, t, L ); ptr1--; /* Next column of X */ } } /* Calculates correlation matrix X'*X */ void silk_corrMatrix_FLP( const silk_float *x, /* I x vector [ L+order-1 ] used to create X */ const opus_int L, /* I Length of vectors */ const opus_int Order, /* I Max lag for correlation */ silk_float *XX /* O X'*X correlation matrix [order x order] */ ) { opus_int j, lag; double energy; const silk_float *ptr1, *ptr2; ptr1 = &x[ Order - 1 ]; /* First sample of column 0 of X */ energy = silk_energy_FLP( ptr1, L ); /* X[:,0]'*X[:,0] */ matrix_ptr( XX, 0, 0, Order ) = ( silk_float )energy; for( j = 1; j < Order; j++ ) { /* Calculate X[:,j]'*X[:,j] */ energy += ptr1[ -j ] * ptr1[ -j ] - ptr1[ L - j ] * ptr1[ L - j ]; matrix_ptr( XX, j, j, Order ) = ( silk_float )energy; } ptr2 = &x[ Order - 2 ]; /* First sample of column 1 of X */ for( lag = 1; lag < Order; lag++ ) { /* Calculate X[:,0]'*X[:,lag] */ energy = silk_inner_product_FLP( ptr1, ptr2, L ); matrix_ptr( XX, lag, 0, Order ) = ( silk_float )energy; matrix_ptr( XX, 0, lag, Order ) = ( silk_float )energy; /* Calculate X[:,j]'*X[:,j + lag] */ for( j = 1; j < ( Order - lag ); j++ ) { energy += ptr1[ -j ] * ptr2[ -j ] - ptr1[ L - j ] * ptr2[ L - j ]; matrix_ptr( XX, lag + j, j, Order ) = ( silk_float )energy; matrix_ptr( XX, j, lag + j, Order ) = ( silk_float )energy; } ptr2--; /* Next column of X */ } } mumble-1.3.4/3rdparty/opus-src/silk/float/inner_product_FLP.c0000664000175000017500000000462114010707327023756 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "SigProc_FLP.h" /* inner product of two silk_float arrays, with result as double */ double silk_inner_product_FLP( const silk_float *data1, const silk_float *data2, opus_int dataSize ) { opus_int i; double result; /* 4x unrolled loop */ result = 0.0; for( i = 0; i < dataSize - 3; i += 4 ) { result += data1[ i + 0 ] * (double)data2[ i + 0 ] + data1[ i + 1 ] * (double)data2[ i + 1 ] + data1[ i + 2 ] * (double)data2[ i + 2 ] + data1[ i + 3 ] * (double)data2[ i + 3 ]; } /* add any remaining products */ for( ; i < dataSize; i++ ) { result += data1[ i ] * (double)data2[ i ]; } return result; } mumble-1.3.4/3rdparty/opus-src/silk/float/autocorrelation_FLP.c0000664000175000017500000000476014010707327024321 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "typedef.h" #include "SigProc_FLP.h" /* compute autocorrelation */ void silk_autocorrelation_FLP( silk_float *results, /* O result (length correlationCount) */ const silk_float *inputData, /* I input data to correlate */ opus_int inputDataSize, /* I length of input */ opus_int correlationCount /* I number of correlation taps to compute */ ) { opus_int i; if( correlationCount > inputDataSize ) { correlationCount = inputDataSize; } for( i = 0; i < correlationCount; i++ ) { results[ i ] = (silk_float)silk_inner_product_FLP( inputData, inputData + i, inputDataSize - i ); } } mumble-1.3.4/3rdparty/opus-src/silk/float/structs_FLP.h0000664000175000017500000001130614010707327022615 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef SILK_STRUCTS_FLP_H #define SILK_STRUCTS_FLP_H #include "typedef.h" #include "main.h" #include "structs.h" #ifdef __cplusplus extern "C" { #endif /********************************/ /* Noise shaping analysis state */ /********************************/ typedef struct { opus_int8 LastGainIndex; silk_float HarmShapeGain_smth; silk_float Tilt_smth; } silk_shape_state_FLP; /********************************/ /* Encoder state FLP */ /********************************/ typedef struct { silk_encoder_state sCmn; /* Common struct, shared with fixed-point code */ silk_shape_state_FLP sShape; /* Noise shaping state */ /* Buffer for find pitch and noise shape analysis */ silk_float x_buf[ 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ];/* Buffer for find pitch and noise shape analysis */ silk_float LTPCorr; /* Normalized correlation from pitch lag estimator */ } silk_encoder_state_FLP; /************************/ /* Encoder control FLP */ /************************/ typedef struct { /* Prediction and coding parameters */ silk_float Gains[ MAX_NB_SUBFR ]; silk_float PredCoef[ 2 ][ MAX_LPC_ORDER ]; /* holds interpolated and final coefficients */ silk_float LTPCoef[LTP_ORDER * MAX_NB_SUBFR]; silk_float LTP_scale; opus_int pitchL[ MAX_NB_SUBFR ]; /* Noise shaping parameters */ silk_float AR[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ]; silk_float LF_MA_shp[ MAX_NB_SUBFR ]; silk_float LF_AR_shp[ MAX_NB_SUBFR ]; silk_float Tilt[ MAX_NB_SUBFR ]; silk_float HarmShapeGain[ MAX_NB_SUBFR ]; silk_float Lambda; silk_float input_quality; silk_float coding_quality; /* Measures */ silk_float predGain; silk_float LTPredCodGain; silk_float ResNrg[ MAX_NB_SUBFR ]; /* Residual energy per subframe */ /* Parameters for CBR mode */ opus_int32 GainsUnq_Q16[ MAX_NB_SUBFR ]; opus_int8 lastGainIndexPrev; } silk_encoder_control_FLP; /************************/ /* Encoder Super Struct */ /************************/ typedef struct { silk_encoder_state_FLP state_Fxx[ ENCODER_NUM_CHANNELS ]; stereo_enc_state sStereo; opus_int32 nBitsUsedLBRR; opus_int32 nBitsExceeded; opus_int nChannelsAPI; opus_int nChannelsInternal; opus_int nPrevChannelsInternal; opus_int timeSinceSwitchAllowed_ms; opus_int allowBandwidthSwitch; opus_int prev_decode_only_middle; } silk_encoder; #ifdef __cplusplus } #endif #endif mumble-1.3.4/3rdparty/opus-src/silk/float/find_pred_coefs_FLP.c0000664000175000017500000001352114010707327024213 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main_FLP.h" /* Find LPC and LTP coefficients */ void silk_find_pred_coefs_FLP( silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ const silk_float res_pitch[], /* I Residual from pitch analysis */ const silk_float x[], /* I Speech signal */ opus_int condCoding /* I The type of conditional coding to use */ ) { opus_int i; silk_float XXLTP[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ]; silk_float xXLTP[ MAX_NB_SUBFR * LTP_ORDER ]; silk_float invGains[ MAX_NB_SUBFR ]; opus_int16 NLSF_Q15[ MAX_LPC_ORDER ]; const silk_float *x_ptr; silk_float *x_pre_ptr, LPC_in_pre[ MAX_NB_SUBFR * MAX_LPC_ORDER + MAX_FRAME_LENGTH ]; silk_float minInvGain; /* Weighting for weighted least squares */ for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { silk_assert( psEncCtrl->Gains[ i ] > 0.0f ); invGains[ i ] = 1.0f / psEncCtrl->Gains[ i ]; } if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { /**********/ /* VOICED */ /**********/ silk_assert( psEnc->sCmn.ltp_mem_length - psEnc->sCmn.predictLPCOrder >= psEncCtrl->pitchL[ 0 ] + LTP_ORDER / 2 ); /* LTP analysis */ silk_find_LTP_FLP( XXLTP, xXLTP, res_pitch, psEncCtrl->pitchL, psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr ); /* Quantize LTP gain parameters */ silk_quant_LTP_gains_FLP( psEncCtrl->LTPCoef, psEnc->sCmn.indices.LTPIndex, &psEnc->sCmn.indices.PERIndex, &psEnc->sCmn.sum_log_gain_Q7, &psEncCtrl->LTPredCodGain, XXLTP, xXLTP, psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr, psEnc->sCmn.arch ); /* Control LTP scaling */ silk_LTP_scale_ctrl_FLP( psEnc, psEncCtrl, condCoding ); /* Create LTP residual */ silk_LTP_analysis_filter_FLP( LPC_in_pre, x - psEnc->sCmn.predictLPCOrder, psEncCtrl->LTPCoef, psEncCtrl->pitchL, invGains, psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr, psEnc->sCmn.predictLPCOrder ); } else { /************/ /* UNVOICED */ /************/ /* Create signal with prepended subframes, scaled by inverse gains */ x_ptr = x - psEnc->sCmn.predictLPCOrder; x_pre_ptr = LPC_in_pre; for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { silk_scale_copy_vector_FLP( x_pre_ptr, x_ptr, invGains[ i ], psEnc->sCmn.subfr_length + psEnc->sCmn.predictLPCOrder ); x_pre_ptr += psEnc->sCmn.subfr_length + psEnc->sCmn.predictLPCOrder; x_ptr += psEnc->sCmn.subfr_length; } silk_memset( psEncCtrl->LTPCoef, 0, psEnc->sCmn.nb_subfr * LTP_ORDER * sizeof( silk_float ) ); psEncCtrl->LTPredCodGain = 0.0f; psEnc->sCmn.sum_log_gain_Q7 = 0; } /* Limit on total predictive coding gain */ if( psEnc->sCmn.first_frame_after_reset ) { minInvGain = 1.0f / MAX_PREDICTION_POWER_GAIN_AFTER_RESET; } else { minInvGain = (silk_float)pow( 2, psEncCtrl->LTPredCodGain / 3 ) / MAX_PREDICTION_POWER_GAIN; minInvGain /= 0.25f + 0.75f * psEncCtrl->coding_quality; } /* LPC_in_pre contains the LTP-filtered input for voiced, and the unfiltered input for unvoiced */ silk_find_LPC_FLP( &psEnc->sCmn, NLSF_Q15, LPC_in_pre, minInvGain ); /* Quantize LSFs */ silk_process_NLSFs_FLP( &psEnc->sCmn, psEncCtrl->PredCoef, NLSF_Q15, psEnc->sCmn.prev_NLSFq_Q15 ); /* Calculate residual energy using quantized LPC coefficients */ silk_residual_energy_FLP( psEncCtrl->ResNrg, LPC_in_pre, psEncCtrl->PredCoef, psEncCtrl->Gains, psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr, psEnc->sCmn.predictLPCOrder ); /* Copy to prediction struct for use in next frame for interpolation */ silk_memcpy( psEnc->sCmn.prev_NLSFq_Q15, NLSF_Q15, sizeof( psEnc->sCmn.prev_NLSFq_Q15 ) ); } mumble-1.3.4/3rdparty/opus-src/silk/float/LPC_analysis_filter_FLP.c0000664000175000017500000002445314010707327024776 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "main_FLP.h" /************************************************/ /* LPC analysis filter */ /* NB! State is kept internally and the */ /* filter always starts with zero state */ /* first Order output samples are set to zero */ /************************************************/ /* 16th order LPC analysis filter, does not write first 16 samples */ static OPUS_INLINE void silk_LPC_analysis_filter16_FLP( silk_float r_LPC[], /* O LPC residual signal */ const silk_float PredCoef[], /* I LPC coefficients */ const silk_float s[], /* I Input signal */ const opus_int length /* I Length of input signal */ ) { opus_int ix; silk_float LPC_pred; const silk_float *s_ptr; for( ix = 16; ix < length; ix++ ) { s_ptr = &s[ix - 1]; /* short-term prediction */ LPC_pred = s_ptr[ 0 ] * PredCoef[ 0 ] + s_ptr[ -1 ] * PredCoef[ 1 ] + s_ptr[ -2 ] * PredCoef[ 2 ] + s_ptr[ -3 ] * PredCoef[ 3 ] + s_ptr[ -4 ] * PredCoef[ 4 ] + s_ptr[ -5 ] * PredCoef[ 5 ] + s_ptr[ -6 ] * PredCoef[ 6 ] + s_ptr[ -7 ] * PredCoef[ 7 ] + s_ptr[ -8 ] * PredCoef[ 8 ] + s_ptr[ -9 ] * PredCoef[ 9 ] + s_ptr[ -10 ] * PredCoef[ 10 ] + s_ptr[ -11 ] * PredCoef[ 11 ] + s_ptr[ -12 ] * PredCoef[ 12 ] + s_ptr[ -13 ] * PredCoef[ 13 ] + s_ptr[ -14 ] * PredCoef[ 14 ] + s_ptr[ -15 ] * PredCoef[ 15 ]; /* prediction error */ r_LPC[ix] = s_ptr[ 1 ] - LPC_pred; } } /* 12th order LPC analysis filter, does not write first 12 samples */ static OPUS_INLINE void silk_LPC_analysis_filter12_FLP( silk_float r_LPC[], /* O LPC residual signal */ const silk_float PredCoef[], /* I LPC coefficients */ const silk_float s[], /* I Input signal */ const opus_int length /* I Length of input signal */ ) { opus_int ix; silk_float LPC_pred; const silk_float *s_ptr; for( ix = 12; ix < length; ix++ ) { s_ptr = &s[ix - 1]; /* short-term prediction */ LPC_pred = s_ptr[ 0 ] * PredCoef[ 0 ] + s_ptr[ -1 ] * PredCoef[ 1 ] + s_ptr[ -2 ] * PredCoef[ 2 ] + s_ptr[ -3 ] * PredCoef[ 3 ] + s_ptr[ -4 ] * PredCoef[ 4 ] + s_ptr[ -5 ] * PredCoef[ 5 ] + s_ptr[ -6 ] * PredCoef[ 6 ] + s_ptr[ -7 ] * PredCoef[ 7 ] + s_ptr[ -8 ] * PredCoef[ 8 ] + s_ptr[ -9 ] * PredCoef[ 9 ] + s_ptr[ -10 ] * PredCoef[ 10 ] + s_ptr[ -11 ] * PredCoef[ 11 ]; /* prediction error */ r_LPC[ix] = s_ptr[ 1 ] - LPC_pred; } } /* 10th order LPC analysis filter, does not write first 10 samples */ static OPUS_INLINE void silk_LPC_analysis_filter10_FLP( silk_float r_LPC[], /* O LPC residual signal */ const silk_float PredCoef[], /* I LPC coefficients */ const silk_float s[], /* I Input signal */ const opus_int length /* I Length of input signal */ ) { opus_int ix; silk_float LPC_pred; const silk_float *s_ptr; for( ix = 10; ix < length; ix++ ) { s_ptr = &s[ix - 1]; /* short-term prediction */ LPC_pred = s_ptr[ 0 ] * PredCoef[ 0 ] + s_ptr[ -1 ] * PredCoef[ 1 ] + s_ptr[ -2 ] * PredCoef[ 2 ] + s_ptr[ -3 ] * PredCoef[ 3 ] + s_ptr[ -4 ] * PredCoef[ 4 ] + s_ptr[ -5 ] * PredCoef[ 5 ] + s_ptr[ -6 ] * PredCoef[ 6 ] + s_ptr[ -7 ] * PredCoef[ 7 ] + s_ptr[ -8 ] * PredCoef[ 8 ] + s_ptr[ -9 ] * PredCoef[ 9 ]; /* prediction error */ r_LPC[ix] = s_ptr[ 1 ] - LPC_pred; } } /* 8th order LPC analysis filter, does not write first 8 samples */ static OPUS_INLINE void silk_LPC_analysis_filter8_FLP( silk_float r_LPC[], /* O LPC residual signal */ const silk_float PredCoef[], /* I LPC coefficients */ const silk_float s[], /* I Input signal */ const opus_int length /* I Length of input signal */ ) { opus_int ix; silk_float LPC_pred; const silk_float *s_ptr; for( ix = 8; ix < length; ix++ ) { s_ptr = &s[ix - 1]; /* short-term prediction */ LPC_pred = s_ptr[ 0 ] * PredCoef[ 0 ] + s_ptr[ -1 ] * PredCoef[ 1 ] + s_ptr[ -2 ] * PredCoef[ 2 ] + s_ptr[ -3 ] * PredCoef[ 3 ] + s_ptr[ -4 ] * PredCoef[ 4 ] + s_ptr[ -5 ] * PredCoef[ 5 ] + s_ptr[ -6 ] * PredCoef[ 6 ] + s_ptr[ -7 ] * PredCoef[ 7 ]; /* prediction error */ r_LPC[ix] = s_ptr[ 1 ] - LPC_pred; } } /* 6th order LPC analysis filter, does not write first 6 samples */ static OPUS_INLINE void silk_LPC_analysis_filter6_FLP( silk_float r_LPC[], /* O LPC residual signal */ const silk_float PredCoef[], /* I LPC coefficients */ const silk_float s[], /* I Input signal */ const opus_int length /* I Length of input signal */ ) { opus_int ix; silk_float LPC_pred; const silk_float *s_ptr; for( ix = 6; ix < length; ix++ ) { s_ptr = &s[ix - 1]; /* short-term prediction */ LPC_pred = s_ptr[ 0 ] * PredCoef[ 0 ] + s_ptr[ -1 ] * PredCoef[ 1 ] + s_ptr[ -2 ] * PredCoef[ 2 ] + s_ptr[ -3 ] * PredCoef[ 3 ] + s_ptr[ -4 ] * PredCoef[ 4 ] + s_ptr[ -5 ] * PredCoef[ 5 ]; /* prediction error */ r_LPC[ix] = s_ptr[ 1 ] - LPC_pred; } } /************************************************/ /* LPC analysis filter */ /* NB! State is kept internally and the */ /* filter always starts with zero state */ /* first Order output samples are set to zero */ /************************************************/ void silk_LPC_analysis_filter_FLP( silk_float r_LPC[], /* O LPC residual signal */ const silk_float PredCoef[], /* I LPC coefficients */ const silk_float s[], /* I Input signal */ const opus_int length, /* I Length of input signal */ const opus_int Order /* I LPC order */ ) { silk_assert( Order <= length ); switch( Order ) { case 6: silk_LPC_analysis_filter6_FLP( r_LPC, PredCoef, s, length ); break; case 8: silk_LPC_analysis_filter8_FLP( r_LPC, PredCoef, s, length ); break; case 10: silk_LPC_analysis_filter10_FLP( r_LPC, PredCoef, s, length ); break; case 12: silk_LPC_analysis_filter12_FLP( r_LPC, PredCoef, s, length ); break; case 16: silk_LPC_analysis_filter16_FLP( r_LPC, PredCoef, s, length ); break; default: silk_assert( 0 ); break; } /* Set first Order output samples to zero */ silk_memset( r_LPC, 0, Order * sizeof( silk_float ) ); } mumble-1.3.4/3rdparty/opus-src/silk/float/scale_vector_FLP.c0000664000175000017500000000432514010707327023555 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "SigProc_FLP.h" /* multiply a vector by a constant */ void silk_scale_vector_FLP( silk_float *data1, silk_float gain, opus_int dataSize ) { opus_int i, dataSize4; /* 4x unrolled loop */ dataSize4 = dataSize & 0xFFFC; for( i = 0; i < dataSize4; i += 4 ) { data1[ i + 0 ] *= gain; data1[ i + 1 ] *= gain; data1[ i + 2 ] *= gain; data1[ i + 3 ] *= gain; } /* any remaining elements */ for( ; i < dataSize; i++ ) { data1[ i ] *= gain; } } mumble-1.3.4/3rdparty/opus-src/silk/float/energy_FLP.c0000664000175000017500000000457714010707327022406 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "SigProc_FLP.h" /* sum of squares of a silk_float array, with result as double */ double silk_energy_FLP( const silk_float *data, opus_int dataSize ) { opus_int i; double result; /* 4x unrolled loop */ result = 0.0; for( i = 0; i < dataSize - 3; i += 4 ) { result += data[ i + 0 ] * (double)data[ i + 0 ] + data[ i + 1 ] * (double)data[ i + 1 ] + data[ i + 2 ] * (double)data[ i + 2 ] + data[ i + 3 ] * (double)data[ i + 3 ]; } /* add any remaining products */ for( ; i < dataSize; i++ ) { result += data[ i ] * (double)data[ i ]; } silk_assert( result >= 0.0 ); return result; } mumble-1.3.4/3rdparty/opus-src/silk/float/schur_FLP.c0000664000175000017500000000577114010707327022236 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "SigProc_FLP.h" silk_float silk_schur_FLP( /* O returns residual energy */ silk_float refl_coef[], /* O reflection coefficients (length order) */ const silk_float auto_corr[], /* I autocorrelation sequence (length order+1) */ opus_int order /* I order */ ) { opus_int k, n; double C[ SILK_MAX_ORDER_LPC + 1 ][ 2 ]; double Ctmp1, Ctmp2, rc_tmp; silk_assert( order >= 0 && order <= SILK_MAX_ORDER_LPC ); /* Copy correlations */ k = 0; do { C[ k ][ 0 ] = C[ k ][ 1 ] = auto_corr[ k ]; } while( ++k <= order ); for( k = 0; k < order; k++ ) { /* Get reflection coefficient */ rc_tmp = -C[ k + 1 ][ 0 ] / silk_max_float( C[ 0 ][ 1 ], 1e-9f ); /* Save the output */ refl_coef[ k ] = (silk_float)rc_tmp; /* Update correlations */ for( n = 0; n < order - k; n++ ) { Ctmp1 = C[ n + k + 1 ][ 0 ]; Ctmp2 = C[ n ][ 1 ]; C[ n + k + 1 ][ 0 ] = Ctmp1 + Ctmp2 * rc_tmp; C[ n ][ 1 ] = Ctmp2 + Ctmp1 * rc_tmp; } } /* Return residual energy */ return (silk_float)C[ 0 ][ 1 ]; } mumble-1.3.4/3rdparty/opus-src/silk/float/sort_FLP.c0000664000175000017500000000714414010707327022075 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif /* Insertion sort (fast for already almost sorted arrays): */ /* Best case: O(n) for an already sorted array */ /* Worst case: O(n^2) for an inversely sorted array */ #include "typedef.h" #include "SigProc_FLP.h" void silk_insertion_sort_decreasing_FLP( silk_float *a, /* I/O Unsorted / Sorted vector */ opus_int *idx, /* O Index vector for the sorted elements */ const opus_int L, /* I Vector length */ const opus_int K /* I Number of correctly sorted positions */ ) { silk_float value; opus_int i, j; /* Safety checks */ silk_assert( K > 0 ); silk_assert( L > 0 ); silk_assert( L >= K ); /* Write start indices in index vector */ for( i = 0; i < K; i++ ) { idx[ i ] = i; } /* Sort vector elements by value, decreasing order */ for( i = 1; i < K; i++ ) { value = a[ i ]; for( j = i - 1; ( j >= 0 ) && ( value > a[ j ] ); j-- ) { a[ j + 1 ] = a[ j ]; /* Shift value */ idx[ j + 1 ] = idx[ j ]; /* Shift index */ } a[ j + 1 ] = value; /* Write value */ idx[ j + 1 ] = i; /* Write index */ } /* If less than L values are asked check the remaining values, */ /* but only spend CPU to ensure that the K first values are correct */ for( i = K; i < L; i++ ) { value = a[ i ]; if( value > a[ K - 1 ] ) { for( j = K - 2; ( j >= 0 ) && ( value > a[ j ] ); j-- ) { a[ j + 1 ] = a[ j ]; /* Shift value */ idx[ j + 1 ] = idx[ j ]; /* Shift index */ } a[ j + 1 ] = value; /* Write value */ idx[ j + 1 ] = i; /* Write index */ } } } mumble-1.3.4/3rdparty/opus-src/silk/float/noise_shape_analysis_FLP.c0000664000175000017500000003572114010707327025310 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main_FLP.h" #include "tuning_parameters.h" /* Compute gain to make warped filter coefficients have a zero mean log frequency response on a */ /* non-warped frequency scale. (So that it can be implemented with a minimum-phase monic filter.) */ /* Note: A monic filter is one with the first coefficient equal to 1.0. In Silk we omit the first */ /* coefficient in an array of coefficients, for monic filters. */ static OPUS_INLINE silk_float warped_gain( const silk_float *coefs, silk_float lambda, opus_int order ) { opus_int i; silk_float gain; lambda = -lambda; gain = coefs[ order - 1 ]; for( i = order - 2; i >= 0; i-- ) { gain = lambda * gain + coefs[ i ]; } return (silk_float)( 1.0f / ( 1.0f - lambda * gain ) ); } /* Convert warped filter coefficients to monic pseudo-warped coefficients and limit maximum */ /* amplitude of monic warped coefficients by using bandwidth expansion on the true coefficients */ static OPUS_INLINE void warped_true2monic_coefs( silk_float *coefs, silk_float lambda, silk_float limit, opus_int order ) { opus_int i, iter, ind = 0; silk_float tmp, maxabs, chirp, gain; /* Convert to monic coefficients */ for( i = order - 1; i > 0; i-- ) { coefs[ i - 1 ] -= lambda * coefs[ i ]; } gain = ( 1.0f - lambda * lambda ) / ( 1.0f + lambda * coefs[ 0 ] ); for( i = 0; i < order; i++ ) { coefs[ i ] *= gain; } /* Limit */ for( iter = 0; iter < 10; iter++ ) { /* Find maximum absolute value */ maxabs = -1.0f; for( i = 0; i < order; i++ ) { tmp = silk_abs_float( coefs[ i ] ); if( tmp > maxabs ) { maxabs = tmp; ind = i; } } if( maxabs <= limit ) { /* Coefficients are within range - done */ return; } /* Convert back to true warped coefficients */ for( i = 1; i < order; i++ ) { coefs[ i - 1 ] += lambda * coefs[ i ]; } gain = 1.0f / gain; for( i = 0; i < order; i++ ) { coefs[ i ] *= gain; } /* Apply bandwidth expansion */ chirp = 0.99f - ( 0.8f + 0.1f * iter ) * ( maxabs - limit ) / ( maxabs * ( ind + 1 ) ); silk_bwexpander_FLP( coefs, order, chirp ); /* Convert to monic warped coefficients */ for( i = order - 1; i > 0; i-- ) { coefs[ i - 1 ] -= lambda * coefs[ i ]; } gain = ( 1.0f - lambda * lambda ) / ( 1.0f + lambda * coefs[ 0 ] ); for( i = 0; i < order; i++ ) { coefs[ i ] *= gain; } } silk_assert( 0 ); } static OPUS_INLINE void limit_coefs( silk_float *coefs, silk_float limit, opus_int order ) { opus_int i, iter, ind = 0; silk_float tmp, maxabs, chirp; for( iter = 0; iter < 10; iter++ ) { /* Find maximum absolute value */ maxabs = -1.0f; for( i = 0; i < order; i++ ) { tmp = silk_abs_float( coefs[ i ] ); if( tmp > maxabs ) { maxabs = tmp; ind = i; } } if( maxabs <= limit ) { /* Coefficients are within range - done */ return; } /* Apply bandwidth expansion */ chirp = 0.99f - ( 0.8f + 0.1f * iter ) * ( maxabs - limit ) / ( maxabs * ( ind + 1 ) ); silk_bwexpander_FLP( coefs, order, chirp ); } silk_assert( 0 ); } /* Compute noise shaping coefficients and initial gain values */ void silk_noise_shape_analysis_FLP( silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ const silk_float *pitch_res, /* I LPC residual from pitch analysis */ const silk_float *x /* I Input signal [frame_length + la_shape] */ ) { silk_shape_state_FLP *psShapeSt = &psEnc->sShape; opus_int k, nSamples, nSegs; silk_float SNR_adj_dB, HarmShapeGain, Tilt; silk_float nrg, log_energy, log_energy_prev, energy_variation; silk_float BWExp, gain_mult, gain_add, strength, b, warping; silk_float x_windowed[ SHAPE_LPC_WIN_MAX ]; silk_float auto_corr[ MAX_SHAPE_LPC_ORDER + 1 ]; silk_float rc[ MAX_SHAPE_LPC_ORDER + 1 ]; const silk_float *x_ptr, *pitch_res_ptr; /* Point to start of first LPC analysis block */ x_ptr = x - psEnc->sCmn.la_shape; /****************/ /* GAIN CONTROL */ /****************/ SNR_adj_dB = psEnc->sCmn.SNR_dB_Q7 * ( 1 / 128.0f ); /* Input quality is the average of the quality in the lowest two VAD bands */ psEncCtrl->input_quality = 0.5f * ( psEnc->sCmn.input_quality_bands_Q15[ 0 ] + psEnc->sCmn.input_quality_bands_Q15[ 1 ] ) * ( 1.0f / 32768.0f ); /* Coding quality level, between 0.0 and 1.0 */ psEncCtrl->coding_quality = silk_sigmoid( 0.25f * ( SNR_adj_dB - 20.0f ) ); if( psEnc->sCmn.useCBR == 0 ) { /* Reduce coding SNR during low speech activity */ b = 1.0f - psEnc->sCmn.speech_activity_Q8 * ( 1.0f / 256.0f ); SNR_adj_dB -= BG_SNR_DECR_dB * psEncCtrl->coding_quality * ( 0.5f + 0.5f * psEncCtrl->input_quality ) * b * b; } if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { /* Reduce gains for periodic signals */ SNR_adj_dB += HARM_SNR_INCR_dB * psEnc->LTPCorr; } else { /* For unvoiced signals and low-quality input, adjust the quality slower than SNR_dB setting */ SNR_adj_dB += ( -0.4f * psEnc->sCmn.SNR_dB_Q7 * ( 1 / 128.0f ) + 6.0f ) * ( 1.0f - psEncCtrl->input_quality ); } /*************************/ /* SPARSENESS PROCESSING */ /*************************/ /* Set quantizer offset */ if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { /* Initially set to 0; may be overruled in process_gains(..) */ psEnc->sCmn.indices.quantOffsetType = 0; } else { /* Sparseness measure, based on relative fluctuations of energy per 2 milliseconds */ nSamples = 2 * psEnc->sCmn.fs_kHz; energy_variation = 0.0f; log_energy_prev = 0.0f; pitch_res_ptr = pitch_res; nSegs = silk_SMULBB( SUB_FRAME_LENGTH_MS, psEnc->sCmn.nb_subfr ) / 2; for( k = 0; k < nSegs; k++ ) { nrg = ( silk_float )nSamples + ( silk_float )silk_energy_FLP( pitch_res_ptr, nSamples ); log_energy = silk_log2( nrg ); if( k > 0 ) { energy_variation += silk_abs_float( log_energy - log_energy_prev ); } log_energy_prev = log_energy; pitch_res_ptr += nSamples; } /* Set quantization offset depending on sparseness measure */ if( energy_variation > ENERGY_VARIATION_THRESHOLD_QNT_OFFSET * (nSegs-1) ) { psEnc->sCmn.indices.quantOffsetType = 0; } else { psEnc->sCmn.indices.quantOffsetType = 1; } } /*******************************/ /* Control bandwidth expansion */ /*******************************/ /* More BWE for signals with high prediction gain */ strength = FIND_PITCH_WHITE_NOISE_FRACTION * psEncCtrl->predGain; /* between 0.0 and 1.0 */ BWExp = BANDWIDTH_EXPANSION / ( 1.0f + strength * strength ); /* Slightly more warping in analysis will move quantization noise up in frequency, where it's better masked */ warping = (silk_float)psEnc->sCmn.warping_Q16 / 65536.0f + 0.01f * psEncCtrl->coding_quality; /********************************************/ /* Compute noise shaping AR coefs and gains */ /********************************************/ for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { /* Apply window: sine slope followed by flat part followed by cosine slope */ opus_int shift, slope_part, flat_part; flat_part = psEnc->sCmn.fs_kHz * 3; slope_part = ( psEnc->sCmn.shapeWinLength - flat_part ) / 2; silk_apply_sine_window_FLP( x_windowed, x_ptr, 1, slope_part ); shift = slope_part; silk_memcpy( x_windowed + shift, x_ptr + shift, flat_part * sizeof(silk_float) ); shift += flat_part; silk_apply_sine_window_FLP( x_windowed + shift, x_ptr + shift, 2, slope_part ); /* Update pointer: next LPC analysis block */ x_ptr += psEnc->sCmn.subfr_length; if( psEnc->sCmn.warping_Q16 > 0 ) { /* Calculate warped auto correlation */ silk_warped_autocorrelation_FLP( auto_corr, x_windowed, warping, psEnc->sCmn.shapeWinLength, psEnc->sCmn.shapingLPCOrder ); } else { /* Calculate regular auto correlation */ silk_autocorrelation_FLP( auto_corr, x_windowed, psEnc->sCmn.shapeWinLength, psEnc->sCmn.shapingLPCOrder + 1 ); } /* Add white noise, as a fraction of energy */ auto_corr[ 0 ] += auto_corr[ 0 ] * SHAPE_WHITE_NOISE_FRACTION + 1.0f; /* Convert correlations to prediction coefficients, and compute residual energy */ nrg = silk_schur_FLP( rc, auto_corr, psEnc->sCmn.shapingLPCOrder ); silk_k2a_FLP( &psEncCtrl->AR[ k * MAX_SHAPE_LPC_ORDER ], rc, psEnc->sCmn.shapingLPCOrder ); psEncCtrl->Gains[ k ] = ( silk_float )sqrt( nrg ); if( psEnc->sCmn.warping_Q16 > 0 ) { /* Adjust gain for warping */ psEncCtrl->Gains[ k ] *= warped_gain( &psEncCtrl->AR[ k * MAX_SHAPE_LPC_ORDER ], warping, psEnc->sCmn.shapingLPCOrder ); } /* Bandwidth expansion for synthesis filter shaping */ silk_bwexpander_FLP( &psEncCtrl->AR[ k * MAX_SHAPE_LPC_ORDER ], psEnc->sCmn.shapingLPCOrder, BWExp ); if( psEnc->sCmn.warping_Q16 > 0 ) { /* Convert to monic warped prediction coefficients and limit absolute values */ warped_true2monic_coefs( &psEncCtrl->AR[ k * MAX_SHAPE_LPC_ORDER ], warping, 3.999f, psEnc->sCmn.shapingLPCOrder ); } else { /* Limit absolute values */ limit_coefs( &psEncCtrl->AR[ k * MAX_SHAPE_LPC_ORDER ], 3.999f, psEnc->sCmn.shapingLPCOrder ); } } /*****************/ /* Gain tweaking */ /*****************/ /* Increase gains during low speech activity */ gain_mult = (silk_float)pow( 2.0f, -0.16f * SNR_adj_dB ); gain_add = (silk_float)pow( 2.0f, 0.16f * MIN_QGAIN_DB ); for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { psEncCtrl->Gains[ k ] *= gain_mult; psEncCtrl->Gains[ k ] += gain_add; } /************************************************/ /* Control low-frequency shaping and noise tilt */ /************************************************/ /* Less low frequency shaping for noisy inputs */ strength = LOW_FREQ_SHAPING * ( 1.0f + LOW_QUALITY_LOW_FREQ_SHAPING_DECR * ( psEnc->sCmn.input_quality_bands_Q15[ 0 ] * ( 1.0f / 32768.0f ) - 1.0f ) ); strength *= psEnc->sCmn.speech_activity_Q8 * ( 1.0f / 256.0f ); if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { /* Reduce low frequencies quantization noise for periodic signals, depending on pitch lag */ /*f = 400; freqz([1, -0.98 + 2e-4 * f], [1, -0.97 + 7e-4 * f], 2^12, Fs); axis([0, 1000, -10, 1])*/ for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { b = 0.2f / psEnc->sCmn.fs_kHz + 3.0f / psEncCtrl->pitchL[ k ]; psEncCtrl->LF_MA_shp[ k ] = -1.0f + b; psEncCtrl->LF_AR_shp[ k ] = 1.0f - b - b * strength; } Tilt = - HP_NOISE_COEF - (1 - HP_NOISE_COEF) * HARM_HP_NOISE_COEF * psEnc->sCmn.speech_activity_Q8 * ( 1.0f / 256.0f ); } else { b = 1.3f / psEnc->sCmn.fs_kHz; psEncCtrl->LF_MA_shp[ 0 ] = -1.0f + b; psEncCtrl->LF_AR_shp[ 0 ] = 1.0f - b - b * strength * 0.6f; for( k = 1; k < psEnc->sCmn.nb_subfr; k++ ) { psEncCtrl->LF_MA_shp[ k ] = psEncCtrl->LF_MA_shp[ 0 ]; psEncCtrl->LF_AR_shp[ k ] = psEncCtrl->LF_AR_shp[ 0 ]; } Tilt = -HP_NOISE_COEF; } /****************************/ /* HARMONIC SHAPING CONTROL */ /****************************/ if( USE_HARM_SHAPING && psEnc->sCmn.indices.signalType == TYPE_VOICED ) { /* Harmonic noise shaping */ HarmShapeGain = HARMONIC_SHAPING; /* More harmonic noise shaping for high bitrates or noisy input */ HarmShapeGain += HIGH_RATE_OR_LOW_QUALITY_HARMONIC_SHAPING * ( 1.0f - ( 1.0f - psEncCtrl->coding_quality ) * psEncCtrl->input_quality ); /* Less harmonic noise shaping for less periodic signals */ HarmShapeGain *= ( silk_float )sqrt( psEnc->LTPCorr ); } else { HarmShapeGain = 0.0f; } /*************************/ /* Smooth over subframes */ /*************************/ for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { psShapeSt->HarmShapeGain_smth += SUBFR_SMTH_COEF * ( HarmShapeGain - psShapeSt->HarmShapeGain_smth ); psEncCtrl->HarmShapeGain[ k ] = psShapeSt->HarmShapeGain_smth; psShapeSt->Tilt_smth += SUBFR_SMTH_COEF * ( Tilt - psShapeSt->Tilt_smth ); psEncCtrl->Tilt[ k ] = psShapeSt->Tilt_smth; } } mumble-1.3.4/3rdparty/opus-src/silk/float/burg_modified_FLP.c0000664000175000017500000001736014010707327023706 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "SigProc_FLP.h" #include "tuning_parameters.h" #include "define.h" #define MAX_FRAME_SIZE 384 /* subfr_length * nb_subfr = ( 0.005 * 16000 + 16 ) * 4 = 384*/ /* Compute reflection coefficients from input signal */ silk_float silk_burg_modified_FLP( /* O returns residual energy */ silk_float A[], /* O prediction coefficients (length order) */ const silk_float x[], /* I input signal, length: nb_subfr*(D+L_sub) */ const silk_float minInvGain, /* I minimum inverse prediction gain */ const opus_int subfr_length, /* I input signal subframe length (incl. D preceding samples) */ const opus_int nb_subfr, /* I number of subframes stacked in x */ const opus_int D /* I order */ ) { opus_int k, n, s, reached_max_gain; double C0, invGain, num, nrg_f, nrg_b, rc, Atmp, tmp1, tmp2; const silk_float *x_ptr; double C_first_row[ SILK_MAX_ORDER_LPC ], C_last_row[ SILK_MAX_ORDER_LPC ]; double CAf[ SILK_MAX_ORDER_LPC + 1 ], CAb[ SILK_MAX_ORDER_LPC + 1 ]; double Af[ SILK_MAX_ORDER_LPC ]; silk_assert( subfr_length * nb_subfr <= MAX_FRAME_SIZE ); /* Compute autocorrelations, added over subframes */ C0 = silk_energy_FLP( x, nb_subfr * subfr_length ); silk_memset( C_first_row, 0, SILK_MAX_ORDER_LPC * sizeof( double ) ); for( s = 0; s < nb_subfr; s++ ) { x_ptr = x + s * subfr_length; for( n = 1; n < D + 1; n++ ) { C_first_row[ n - 1 ] += silk_inner_product_FLP( x_ptr, x_ptr + n, subfr_length - n ); } } silk_memcpy( C_last_row, C_first_row, SILK_MAX_ORDER_LPC * sizeof( double ) ); /* Initialize */ CAb[ 0 ] = CAf[ 0 ] = C0 + FIND_LPC_COND_FAC * C0 + 1e-9f; invGain = 1.0f; reached_max_gain = 0; for( n = 0; n < D; n++ ) { /* Update first row of correlation matrix (without first element) */ /* Update last row of correlation matrix (without last element, stored in reversed order) */ /* Update C * Af */ /* Update C * flipud(Af) (stored in reversed order) */ for( s = 0; s < nb_subfr; s++ ) { x_ptr = x + s * subfr_length; tmp1 = x_ptr[ n ]; tmp2 = x_ptr[ subfr_length - n - 1 ]; for( k = 0; k < n; k++ ) { C_first_row[ k ] -= x_ptr[ n ] * x_ptr[ n - k - 1 ]; C_last_row[ k ] -= x_ptr[ subfr_length - n - 1 ] * x_ptr[ subfr_length - n + k ]; Atmp = Af[ k ]; tmp1 += x_ptr[ n - k - 1 ] * Atmp; tmp2 += x_ptr[ subfr_length - n + k ] * Atmp; } for( k = 0; k <= n; k++ ) { CAf[ k ] -= tmp1 * x_ptr[ n - k ]; CAb[ k ] -= tmp2 * x_ptr[ subfr_length - n + k - 1 ]; } } tmp1 = C_first_row[ n ]; tmp2 = C_last_row[ n ]; for( k = 0; k < n; k++ ) { Atmp = Af[ k ]; tmp1 += C_last_row[ n - k - 1 ] * Atmp; tmp2 += C_first_row[ n - k - 1 ] * Atmp; } CAf[ n + 1 ] = tmp1; CAb[ n + 1 ] = tmp2; /* Calculate nominator and denominator for the next order reflection (parcor) coefficient */ num = CAb[ n + 1 ]; nrg_b = CAb[ 0 ]; nrg_f = CAf[ 0 ]; for( k = 0; k < n; k++ ) { Atmp = Af[ k ]; num += CAb[ n - k ] * Atmp; nrg_b += CAb[ k + 1 ] * Atmp; nrg_f += CAf[ k + 1 ] * Atmp; } silk_assert( nrg_f > 0.0 ); silk_assert( nrg_b > 0.0 ); /* Calculate the next order reflection (parcor) coefficient */ rc = -2.0 * num / ( nrg_f + nrg_b ); silk_assert( rc > -1.0 && rc < 1.0 ); /* Update inverse prediction gain */ tmp1 = invGain * ( 1.0 - rc * rc ); if( tmp1 <= minInvGain ) { /* Max prediction gain exceeded; set reflection coefficient such that max prediction gain is exactly hit */ rc = sqrt( 1.0 - minInvGain / invGain ); if( num > 0 ) { /* Ensure adjusted reflection coefficients has the original sign */ rc = -rc; } invGain = minInvGain; reached_max_gain = 1; } else { invGain = tmp1; } /* Update the AR coefficients */ for( k = 0; k < (n + 1) >> 1; k++ ) { tmp1 = Af[ k ]; tmp2 = Af[ n - k - 1 ]; Af[ k ] = tmp1 + rc * tmp2; Af[ n - k - 1 ] = tmp2 + rc * tmp1; } Af[ n ] = rc; if( reached_max_gain ) { /* Reached max prediction gain; set remaining coefficients to zero and exit loop */ for( k = n + 1; k < D; k++ ) { Af[ k ] = 0.0; } break; } /* Update C * Af and C * Ab */ for( k = 0; k <= n + 1; k++ ) { tmp1 = CAf[ k ]; CAf[ k ] += rc * CAb[ n - k + 1 ]; CAb[ n - k + 1 ] += rc * tmp1; } } if( reached_max_gain ) { /* Convert to silk_float */ for( k = 0; k < D; k++ ) { A[ k ] = (silk_float)( -Af[ k ] ); } /* Subtract energy of preceding samples from C0 */ for( s = 0; s < nb_subfr; s++ ) { C0 -= silk_energy_FLP( x + s * subfr_length, D ); } /* Approximate residual energy */ nrg_f = C0 * invGain; } else { /* Compute residual energy and store coefficients as silk_float */ nrg_f = CAf[ 0 ]; tmp1 = 1.0; for( k = 0; k < D; k++ ) { Atmp = Af[ k ]; nrg_f += CAf[ k + 1 ] * Atmp; tmp1 += Atmp * Atmp; A[ k ] = (silk_float)(-Atmp); } nrg_f -= FIND_LPC_COND_FAC * C0 * tmp1; } /* Return residual energy */ return (silk_float)nrg_f; } mumble-1.3.4/3rdparty/opus-src/silk/float/apply_sine_window_FLP.c0000664000175000017500000000655514010707327024645 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main_FLP.h" /* Apply sine window to signal vector */ /* Window types: */ /* 1 -> sine window from 0 to pi/2 */ /* 2 -> sine window from pi/2 to pi */ void silk_apply_sine_window_FLP( silk_float px_win[], /* O Pointer to windowed signal */ const silk_float px[], /* I Pointer to input signal */ const opus_int win_type, /* I Selects a window type */ const opus_int length /* I Window length, multiple of 4 */ ) { opus_int k; silk_float freq, c, S0, S1; silk_assert( win_type == 1 || win_type == 2 ); /* Length must be multiple of 4 */ silk_assert( ( length & 3 ) == 0 ); freq = PI / ( length + 1 ); /* Approximation of 2 * cos(f) */ c = 2.0f - freq * freq; /* Initialize state */ if( win_type < 2 ) { /* Start from 0 */ S0 = 0.0f; /* Approximation of sin(f) */ S1 = freq; } else { /* Start from 1 */ S0 = 1.0f; /* Approximation of cos(f) */ S1 = 0.5f * c; } /* Uses the recursive equation: sin(n*f) = 2 * cos(f) * sin((n-1)*f) - sin((n-2)*f) */ /* 4 samples at a time */ for( k = 0; k < length; k += 4 ) { px_win[ k + 0 ] = px[ k + 0 ] * 0.5f * ( S0 + S1 ); px_win[ k + 1 ] = px[ k + 1 ] * S1; S0 = c * S1 - S0; px_win[ k + 2 ] = px[ k + 2 ] * 0.5f * ( S1 + S0 ); px_win[ k + 3 ] = px[ k + 3 ] * S0; S1 = c * S0 - S1; } } mumble-1.3.4/3rdparty/opus-src/silk/float/scale_copy_vector_FLP.c0000664000175000017500000000455514010707327024614 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "SigProc_FLP.h" /* copy and multiply a vector by a constant */ void silk_scale_copy_vector_FLP( silk_float *data_out, const silk_float *data_in, silk_float gain, opus_int dataSize ) { opus_int i, dataSize4; /* 4x unrolled loop */ dataSize4 = dataSize & 0xFFFC; for( i = 0; i < dataSize4; i += 4 ) { data_out[ i + 0 ] = gain * data_in[ i + 0 ]; data_out[ i + 1 ] = gain * data_in[ i + 1 ]; data_out[ i + 2 ] = gain * data_in[ i + 2 ]; data_out[ i + 3 ] = gain * data_in[ i + 3 ]; } /* any remaining elements */ for( ; i < dataSize; i++ ) { data_out[ i ] = gain * data_in[ i ]; } } mumble-1.3.4/3rdparty/opus-src/silk/float/pitch_analysis_core_FLP.c0000664000175000017500000007136714010707327025140 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif /***************************************************************************** * Pitch analyser function ******************************************************************************/ #include "SigProc_FLP.h" #include "SigProc_FIX.h" #include "pitch_est_defines.h" #include "pitch.h" #define SCRATCH_SIZE 22 /************************************************************/ /* Internally used functions */ /************************************************************/ static void silk_P_Ana_calc_corr_st3( silk_float cross_corr_st3[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE3_MAX ][ PE_NB_STAGE3_LAGS ], /* O 3 DIM correlation array */ const silk_float frame[], /* I vector to correlate */ opus_int start_lag, /* I start lag */ opus_int sf_length, /* I sub frame length */ opus_int nb_subfr, /* I number of subframes */ opus_int complexity, /* I Complexity setting */ int arch /* I Run-time architecture */ ); static void silk_P_Ana_calc_energy_st3( silk_float energies_st3[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE3_MAX ][ PE_NB_STAGE3_LAGS ], /* O 3 DIM correlation array */ const silk_float frame[], /* I vector to correlate */ opus_int start_lag, /* I start lag */ opus_int sf_length, /* I sub frame length */ opus_int nb_subfr, /* I number of subframes */ opus_int complexity /* I Complexity setting */ ); /************************************************************/ /* CORE PITCH ANALYSIS FUNCTION */ /************************************************************/ opus_int silk_pitch_analysis_core_FLP( /* O Voicing estimate: 0 voiced, 1 unvoiced */ const silk_float *frame, /* I Signal of length PE_FRAME_LENGTH_MS*Fs_kHz */ opus_int *pitch_out, /* O Pitch lag values [nb_subfr] */ opus_int16 *lagIndex, /* O Lag Index */ opus_int8 *contourIndex, /* O Pitch contour Index */ silk_float *LTPCorr, /* I/O Normalized correlation; input: value from previous frame */ opus_int prevLag, /* I Last lag of previous frame; set to zero is unvoiced */ const silk_float search_thres1, /* I First stage threshold for lag candidates 0 - 1 */ const silk_float search_thres2, /* I Final threshold for lag candidates 0 - 1 */ const opus_int Fs_kHz, /* I sample frequency (kHz) */ const opus_int complexity, /* I Complexity setting, 0-2, where 2 is highest */ const opus_int nb_subfr, /* I Number of 5 ms subframes */ int arch /* I Run-time architecture */ ) { opus_int i, k, d, j; silk_float frame_8kHz[ PE_MAX_FRAME_LENGTH_MS * 8 ]; silk_float frame_4kHz[ PE_MAX_FRAME_LENGTH_MS * 4 ]; opus_int16 frame_8_FIX[ PE_MAX_FRAME_LENGTH_MS * 8 ]; opus_int16 frame_4_FIX[ PE_MAX_FRAME_LENGTH_MS * 4 ]; opus_int32 filt_state[ 6 ]; silk_float threshold, contour_bias; silk_float C[ PE_MAX_NB_SUBFR][ (PE_MAX_LAG >> 1) + 5 ]; opus_val32 xcorr[ PE_MAX_LAG_MS * 4 - PE_MIN_LAG_MS * 4 + 1 ]; silk_float CC[ PE_NB_CBKS_STAGE2_EXT ]; const silk_float *target_ptr, *basis_ptr; double cross_corr, normalizer, energy, energy_tmp; opus_int d_srch[ PE_D_SRCH_LENGTH ]; opus_int16 d_comp[ (PE_MAX_LAG >> 1) + 5 ]; opus_int length_d_srch, length_d_comp; silk_float Cmax, CCmax, CCmax_b, CCmax_new_b, CCmax_new; opus_int CBimax, CBimax_new, lag, start_lag, end_lag, lag_new; opus_int cbk_size; silk_float lag_log2, prevLag_log2, delta_lag_log2_sqr; silk_float energies_st3[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE3_MAX ][ PE_NB_STAGE3_LAGS ]; silk_float cross_corr_st3[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE3_MAX ][ PE_NB_STAGE3_LAGS ]; opus_int lag_counter; opus_int frame_length, frame_length_8kHz, frame_length_4kHz; opus_int sf_length, sf_length_8kHz, sf_length_4kHz; opus_int min_lag, min_lag_8kHz, min_lag_4kHz; opus_int max_lag, max_lag_8kHz, max_lag_4kHz; opus_int nb_cbk_search; const opus_int8 *Lag_CB_ptr; /* Check for valid sampling frequency */ silk_assert( Fs_kHz == 8 || Fs_kHz == 12 || Fs_kHz == 16 ); /* Check for valid complexity setting */ silk_assert( complexity >= SILK_PE_MIN_COMPLEX ); silk_assert( complexity <= SILK_PE_MAX_COMPLEX ); silk_assert( search_thres1 >= 0.0f && search_thres1 <= 1.0f ); silk_assert( search_thres2 >= 0.0f && search_thres2 <= 1.0f ); /* Set up frame lengths max / min lag for the sampling frequency */ frame_length = ( PE_LTP_MEM_LENGTH_MS + nb_subfr * PE_SUBFR_LENGTH_MS ) * Fs_kHz; frame_length_4kHz = ( PE_LTP_MEM_LENGTH_MS + nb_subfr * PE_SUBFR_LENGTH_MS ) * 4; frame_length_8kHz = ( PE_LTP_MEM_LENGTH_MS + nb_subfr * PE_SUBFR_LENGTH_MS ) * 8; sf_length = PE_SUBFR_LENGTH_MS * Fs_kHz; sf_length_4kHz = PE_SUBFR_LENGTH_MS * 4; sf_length_8kHz = PE_SUBFR_LENGTH_MS * 8; min_lag = PE_MIN_LAG_MS * Fs_kHz; min_lag_4kHz = PE_MIN_LAG_MS * 4; min_lag_8kHz = PE_MIN_LAG_MS * 8; max_lag = PE_MAX_LAG_MS * Fs_kHz - 1; max_lag_4kHz = PE_MAX_LAG_MS * 4; max_lag_8kHz = PE_MAX_LAG_MS * 8 - 1; /* Resample from input sampled at Fs_kHz to 8 kHz */ if( Fs_kHz == 16 ) { /* Resample to 16 -> 8 khz */ opus_int16 frame_16_FIX[ 16 * PE_MAX_FRAME_LENGTH_MS ]; silk_float2short_array( frame_16_FIX, frame, frame_length ); silk_memset( filt_state, 0, 2 * sizeof( opus_int32 ) ); silk_resampler_down2( filt_state, frame_8_FIX, frame_16_FIX, frame_length ); silk_short2float_array( frame_8kHz, frame_8_FIX, frame_length_8kHz ); } else if( Fs_kHz == 12 ) { /* Resample to 12 -> 8 khz */ opus_int16 frame_12_FIX[ 12 * PE_MAX_FRAME_LENGTH_MS ]; silk_float2short_array( frame_12_FIX, frame, frame_length ); silk_memset( filt_state, 0, 6 * sizeof( opus_int32 ) ); silk_resampler_down2_3( filt_state, frame_8_FIX, frame_12_FIX, frame_length ); silk_short2float_array( frame_8kHz, frame_8_FIX, frame_length_8kHz ); } else { silk_assert( Fs_kHz == 8 ); silk_float2short_array( frame_8_FIX, frame, frame_length_8kHz ); } /* Decimate again to 4 kHz */ silk_memset( filt_state, 0, 2 * sizeof( opus_int32 ) ); silk_resampler_down2( filt_state, frame_4_FIX, frame_8_FIX, frame_length_8kHz ); silk_short2float_array( frame_4kHz, frame_4_FIX, frame_length_4kHz ); /* Low-pass filter */ for( i = frame_length_4kHz - 1; i > 0; i-- ) { frame_4kHz[ i ] = silk_ADD_SAT16( frame_4kHz[ i ], frame_4kHz[ i - 1 ] ); } /****************************************************************************** * FIRST STAGE, operating in 4 khz ******************************************************************************/ silk_memset(C, 0, sizeof(silk_float) * nb_subfr * ((PE_MAX_LAG >> 1) + 5)); target_ptr = &frame_4kHz[ silk_LSHIFT( sf_length_4kHz, 2 ) ]; for( k = 0; k < nb_subfr >> 1; k++ ) { /* Check that we are within range of the array */ silk_assert( target_ptr >= frame_4kHz ); silk_assert( target_ptr + sf_length_8kHz <= frame_4kHz + frame_length_4kHz ); basis_ptr = target_ptr - min_lag_4kHz; /* Check that we are within range of the array */ silk_assert( basis_ptr >= frame_4kHz ); silk_assert( basis_ptr + sf_length_8kHz <= frame_4kHz + frame_length_4kHz ); celt_pitch_xcorr( target_ptr, target_ptr-max_lag_4kHz, xcorr, sf_length_8kHz, max_lag_4kHz - min_lag_4kHz + 1, arch ); /* Calculate first vector products before loop */ cross_corr = xcorr[ max_lag_4kHz - min_lag_4kHz ]; normalizer = silk_energy_FLP( target_ptr, sf_length_8kHz ) + silk_energy_FLP( basis_ptr, sf_length_8kHz ) + sf_length_8kHz * 4000.0f; C[ 0 ][ min_lag_4kHz ] += (silk_float)( 2 * cross_corr / normalizer ); /* From now on normalizer is computed recursively */ for( d = min_lag_4kHz + 1; d <= max_lag_4kHz; d++ ) { basis_ptr--; /* Check that we are within range of the array */ silk_assert( basis_ptr >= frame_4kHz ); silk_assert( basis_ptr + sf_length_8kHz <= frame_4kHz + frame_length_4kHz ); cross_corr = xcorr[ max_lag_4kHz - d ]; /* Add contribution of new sample and remove contribution from oldest sample */ normalizer += basis_ptr[ 0 ] * (double)basis_ptr[ 0 ] - basis_ptr[ sf_length_8kHz ] * (double)basis_ptr[ sf_length_8kHz ]; C[ 0 ][ d ] += (silk_float)( 2 * cross_corr / normalizer ); } /* Update target pointer */ target_ptr += sf_length_8kHz; } /* Apply short-lag bias */ for( i = max_lag_4kHz; i >= min_lag_4kHz; i-- ) { C[ 0 ][ i ] -= C[ 0 ][ i ] * i / 4096.0f; } /* Sort */ length_d_srch = 4 + 2 * complexity; silk_assert( 3 * length_d_srch <= PE_D_SRCH_LENGTH ); silk_insertion_sort_decreasing_FLP( &C[ 0 ][ min_lag_4kHz ], d_srch, max_lag_4kHz - min_lag_4kHz + 1, length_d_srch ); /* Escape if correlation is very low already here */ Cmax = C[ 0 ][ min_lag_4kHz ]; if( Cmax < 0.2f ) { silk_memset( pitch_out, 0, nb_subfr * sizeof( opus_int ) ); *LTPCorr = 0.0f; *lagIndex = 0; *contourIndex = 0; return 1; } threshold = search_thres1 * Cmax; for( i = 0; i < length_d_srch; i++ ) { /* Convert to 8 kHz indices for the sorted correlation that exceeds the threshold */ if( C[ 0 ][ min_lag_4kHz + i ] > threshold ) { d_srch[ i ] = silk_LSHIFT( d_srch[ i ] + min_lag_4kHz, 1 ); } else { length_d_srch = i; break; } } silk_assert( length_d_srch > 0 ); for( i = min_lag_8kHz - 5; i < max_lag_8kHz + 5; i++ ) { d_comp[ i ] = 0; } for( i = 0; i < length_d_srch; i++ ) { d_comp[ d_srch[ i ] ] = 1; } /* Convolution */ for( i = max_lag_8kHz + 3; i >= min_lag_8kHz; i-- ) { d_comp[ i ] += d_comp[ i - 1 ] + d_comp[ i - 2 ]; } length_d_srch = 0; for( i = min_lag_8kHz; i < max_lag_8kHz + 1; i++ ) { if( d_comp[ i + 1 ] > 0 ) { d_srch[ length_d_srch ] = i; length_d_srch++; } } /* Convolution */ for( i = max_lag_8kHz + 3; i >= min_lag_8kHz; i-- ) { d_comp[ i ] += d_comp[ i - 1 ] + d_comp[ i - 2 ] + d_comp[ i - 3 ]; } length_d_comp = 0; for( i = min_lag_8kHz; i < max_lag_8kHz + 4; i++ ) { if( d_comp[ i ] > 0 ) { d_comp[ length_d_comp ] = (opus_int16)( i - 2 ); length_d_comp++; } } /********************************************************************************** ** SECOND STAGE, operating at 8 kHz, on lag sections with high correlation *************************************************************************************/ /********************************************************************************* * Find energy of each subframe projected onto its history, for a range of delays *********************************************************************************/ silk_memset( C, 0, PE_MAX_NB_SUBFR*((PE_MAX_LAG >> 1) + 5) * sizeof(silk_float)); if( Fs_kHz == 8 ) { target_ptr = &frame[ PE_LTP_MEM_LENGTH_MS * 8 ]; } else { target_ptr = &frame_8kHz[ PE_LTP_MEM_LENGTH_MS * 8 ]; } for( k = 0; k < nb_subfr; k++ ) { energy_tmp = silk_energy_FLP( target_ptr, sf_length_8kHz ) + 1.0; for( j = 0; j < length_d_comp; j++ ) { d = d_comp[ j ]; basis_ptr = target_ptr - d; cross_corr = silk_inner_product_FLP( basis_ptr, target_ptr, sf_length_8kHz ); if( cross_corr > 0.0f ) { energy = silk_energy_FLP( basis_ptr, sf_length_8kHz ); C[ k ][ d ] = (silk_float)( 2 * cross_corr / ( energy + energy_tmp ) ); } else { C[ k ][ d ] = 0.0f; } } target_ptr += sf_length_8kHz; } /* search over lag range and lags codebook */ /* scale factor for lag codebook, as a function of center lag */ CCmax = 0.0f; /* This value doesn't matter */ CCmax_b = -1000.0f; CBimax = 0; /* To avoid returning undefined lag values */ lag = -1; /* To check if lag with strong enough correlation has been found */ if( prevLag > 0 ) { if( Fs_kHz == 12 ) { prevLag = silk_LSHIFT( prevLag, 1 ) / 3; } else if( Fs_kHz == 16 ) { prevLag = silk_RSHIFT( prevLag, 1 ); } prevLag_log2 = silk_log2( (silk_float)prevLag ); } else { prevLag_log2 = 0; } /* Set up stage 2 codebook based on number of subframes */ if( nb_subfr == PE_MAX_NB_SUBFR ) { cbk_size = PE_NB_CBKS_STAGE2_EXT; Lag_CB_ptr = &silk_CB_lags_stage2[ 0 ][ 0 ]; if( Fs_kHz == 8 && complexity > SILK_PE_MIN_COMPLEX ) { /* If input is 8 khz use a larger codebook here because it is last stage */ nb_cbk_search = PE_NB_CBKS_STAGE2_EXT; } else { nb_cbk_search = PE_NB_CBKS_STAGE2; } } else { cbk_size = PE_NB_CBKS_STAGE2_10MS; Lag_CB_ptr = &silk_CB_lags_stage2_10_ms[ 0 ][ 0 ]; nb_cbk_search = PE_NB_CBKS_STAGE2_10MS; } for( k = 0; k < length_d_srch; k++ ) { d = d_srch[ k ]; for( j = 0; j < nb_cbk_search; j++ ) { CC[j] = 0.0f; for( i = 0; i < nb_subfr; i++ ) { /* Try all codebooks */ CC[ j ] += C[ i ][ d + matrix_ptr( Lag_CB_ptr, i, j, cbk_size )]; } } /* Find best codebook */ CCmax_new = -1000.0f; CBimax_new = 0; for( i = 0; i < nb_cbk_search; i++ ) { if( CC[ i ] > CCmax_new ) { CCmax_new = CC[ i ]; CBimax_new = i; } } /* Bias towards shorter lags */ lag_log2 = silk_log2( (silk_float)d ); CCmax_new_b = CCmax_new - PE_SHORTLAG_BIAS * nb_subfr * lag_log2; /* Bias towards previous lag */ if( prevLag > 0 ) { delta_lag_log2_sqr = lag_log2 - prevLag_log2; delta_lag_log2_sqr *= delta_lag_log2_sqr; CCmax_new_b -= PE_PREVLAG_BIAS * nb_subfr * (*LTPCorr) * delta_lag_log2_sqr / ( delta_lag_log2_sqr + 0.5f ); } if( CCmax_new_b > CCmax_b && /* Find maximum biased correlation */ CCmax_new > nb_subfr * search_thres2 /* Correlation needs to be high enough to be voiced */ ) { CCmax_b = CCmax_new_b; CCmax = CCmax_new; lag = d; CBimax = CBimax_new; } } if( lag == -1 ) { /* No suitable candidate found */ silk_memset( pitch_out, 0, PE_MAX_NB_SUBFR * sizeof(opus_int) ); *LTPCorr = 0.0f; *lagIndex = 0; *contourIndex = 0; return 1; } /* Output normalized correlation */ *LTPCorr = (silk_float)( CCmax / nb_subfr ); silk_assert( *LTPCorr >= 0.0f ); if( Fs_kHz > 8 ) { /* Search in original signal */ /* Compensate for decimation */ silk_assert( lag == silk_SAT16( lag ) ); if( Fs_kHz == 12 ) { lag = silk_RSHIFT_ROUND( silk_SMULBB( lag, 3 ), 1 ); } else { /* Fs_kHz == 16 */ lag = silk_LSHIFT( lag, 1 ); } lag = silk_LIMIT_int( lag, min_lag, max_lag ); start_lag = silk_max_int( lag - 2, min_lag ); end_lag = silk_min_int( lag + 2, max_lag ); lag_new = lag; /* to avoid undefined lag */ CBimax = 0; /* to avoid undefined lag */ CCmax = -1000.0f; /* Calculate the correlations and energies needed in stage 3 */ silk_P_Ana_calc_corr_st3( cross_corr_st3, frame, start_lag, sf_length, nb_subfr, complexity, arch ); silk_P_Ana_calc_energy_st3( energies_st3, frame, start_lag, sf_length, nb_subfr, complexity ); lag_counter = 0; silk_assert( lag == silk_SAT16( lag ) ); contour_bias = PE_FLATCONTOUR_BIAS / lag; /* Set up cbk parameters according to complexity setting and frame length */ if( nb_subfr == PE_MAX_NB_SUBFR ) { nb_cbk_search = (opus_int)silk_nb_cbk_searchs_stage3[ complexity ]; cbk_size = PE_NB_CBKS_STAGE3_MAX; Lag_CB_ptr = &silk_CB_lags_stage3[ 0 ][ 0 ]; } else { nb_cbk_search = PE_NB_CBKS_STAGE3_10MS; cbk_size = PE_NB_CBKS_STAGE3_10MS; Lag_CB_ptr = &silk_CB_lags_stage3_10_ms[ 0 ][ 0 ]; } target_ptr = &frame[ PE_LTP_MEM_LENGTH_MS * Fs_kHz ]; energy_tmp = silk_energy_FLP( target_ptr, nb_subfr * sf_length ) + 1.0; for( d = start_lag; d <= end_lag; d++ ) { for( j = 0; j < nb_cbk_search; j++ ) { cross_corr = 0.0; energy = energy_tmp; for( k = 0; k < nb_subfr; k++ ) { cross_corr += cross_corr_st3[ k ][ j ][ lag_counter ]; energy += energies_st3[ k ][ j ][ lag_counter ]; } if( cross_corr > 0.0 ) { CCmax_new = (silk_float)( 2 * cross_corr / energy ); /* Reduce depending on flatness of contour */ CCmax_new *= 1.0f - contour_bias * j; } else { CCmax_new = 0.0f; } if( CCmax_new > CCmax && ( d + (opus_int)silk_CB_lags_stage3[ 0 ][ j ] ) <= max_lag ) { CCmax = CCmax_new; lag_new = d; CBimax = j; } } lag_counter++; } for( k = 0; k < nb_subfr; k++ ) { pitch_out[ k ] = lag_new + matrix_ptr( Lag_CB_ptr, k, CBimax, cbk_size ); pitch_out[ k ] = silk_LIMIT( pitch_out[ k ], min_lag, PE_MAX_LAG_MS * Fs_kHz ); } *lagIndex = (opus_int16)( lag_new - min_lag ); *contourIndex = (opus_int8)CBimax; } else { /* Fs_kHz == 8 */ /* Save Lags */ for( k = 0; k < nb_subfr; k++ ) { pitch_out[ k ] = lag + matrix_ptr( Lag_CB_ptr, k, CBimax, cbk_size ); pitch_out[ k ] = silk_LIMIT( pitch_out[ k ], min_lag_8kHz, PE_MAX_LAG_MS * 8 ); } *lagIndex = (opus_int16)( lag - min_lag_8kHz ); *contourIndex = (opus_int8)CBimax; } silk_assert( *lagIndex >= 0 ); /* return as voiced */ return 0; } /*********************************************************************** * Calculates the correlations used in stage 3 search. In order to cover * the whole lag codebook for all the searched offset lags (lag +- 2), * the following correlations are needed in each sub frame: * * sf1: lag range [-8,...,7] total 16 correlations * sf2: lag range [-4,...,4] total 9 correlations * sf3: lag range [-3,....4] total 8 correltions * sf4: lag range [-6,....8] total 15 correlations * * In total 48 correlations. The direct implementation computed in worst * case 4*12*5 = 240 correlations, but more likely around 120. ***********************************************************************/ static void silk_P_Ana_calc_corr_st3( silk_float cross_corr_st3[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE3_MAX ][ PE_NB_STAGE3_LAGS ], /* O 3 DIM correlation array */ const silk_float frame[], /* I vector to correlate */ opus_int start_lag, /* I start lag */ opus_int sf_length, /* I sub frame length */ opus_int nb_subfr, /* I number of subframes */ opus_int complexity, /* I Complexity setting */ int arch /* I Run-time architecture */ ) { const silk_float *target_ptr; opus_int i, j, k, lag_counter, lag_low, lag_high; opus_int nb_cbk_search, delta, idx, cbk_size; silk_float scratch_mem[ SCRATCH_SIZE ]; opus_val32 xcorr[ SCRATCH_SIZE ]; const opus_int8 *Lag_range_ptr, *Lag_CB_ptr; silk_assert( complexity >= SILK_PE_MIN_COMPLEX ); silk_assert( complexity <= SILK_PE_MAX_COMPLEX ); if( nb_subfr == PE_MAX_NB_SUBFR ) { Lag_range_ptr = &silk_Lag_range_stage3[ complexity ][ 0 ][ 0 ]; Lag_CB_ptr = &silk_CB_lags_stage3[ 0 ][ 0 ]; nb_cbk_search = silk_nb_cbk_searchs_stage3[ complexity ]; cbk_size = PE_NB_CBKS_STAGE3_MAX; } else { silk_assert( nb_subfr == PE_MAX_NB_SUBFR >> 1); Lag_range_ptr = &silk_Lag_range_stage3_10_ms[ 0 ][ 0 ]; Lag_CB_ptr = &silk_CB_lags_stage3_10_ms[ 0 ][ 0 ]; nb_cbk_search = PE_NB_CBKS_STAGE3_10MS; cbk_size = PE_NB_CBKS_STAGE3_10MS; } target_ptr = &frame[ silk_LSHIFT( sf_length, 2 ) ]; /* Pointer to middle of frame */ for( k = 0; k < nb_subfr; k++ ) { lag_counter = 0; /* Calculate the correlations for each subframe */ lag_low = matrix_ptr( Lag_range_ptr, k, 0, 2 ); lag_high = matrix_ptr( Lag_range_ptr, k, 1, 2 ); silk_assert(lag_high-lag_low+1 <= SCRATCH_SIZE); celt_pitch_xcorr( target_ptr, target_ptr - start_lag - lag_high, xcorr, sf_length, lag_high - lag_low + 1, arch ); for( j = lag_low; j <= lag_high; j++ ) { silk_assert( lag_counter < SCRATCH_SIZE ); scratch_mem[ lag_counter ] = xcorr[ lag_high - j ]; lag_counter++; } delta = matrix_ptr( Lag_range_ptr, k, 0, 2 ); for( i = 0; i < nb_cbk_search; i++ ) { /* Fill out the 3 dim array that stores the correlations for */ /* each code_book vector for each start lag */ idx = matrix_ptr( Lag_CB_ptr, k, i, cbk_size ) - delta; for( j = 0; j < PE_NB_STAGE3_LAGS; j++ ) { silk_assert( idx + j < SCRATCH_SIZE ); silk_assert( idx + j < lag_counter ); cross_corr_st3[ k ][ i ][ j ] = scratch_mem[ idx + j ]; } } target_ptr += sf_length; } } /********************************************************************/ /* Calculate the energies for first two subframes. The energies are */ /* calculated recursively. */ /********************************************************************/ static void silk_P_Ana_calc_energy_st3( silk_float energies_st3[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE3_MAX ][ PE_NB_STAGE3_LAGS ], /* O 3 DIM correlation array */ const silk_float frame[], /* I vector to correlate */ opus_int start_lag, /* I start lag */ opus_int sf_length, /* I sub frame length */ opus_int nb_subfr, /* I number of subframes */ opus_int complexity /* I Complexity setting */ ) { const silk_float *target_ptr, *basis_ptr; double energy; opus_int k, i, j, lag_counter; opus_int nb_cbk_search, delta, idx, cbk_size, lag_diff; silk_float scratch_mem[ SCRATCH_SIZE ]; const opus_int8 *Lag_range_ptr, *Lag_CB_ptr; silk_assert( complexity >= SILK_PE_MIN_COMPLEX ); silk_assert( complexity <= SILK_PE_MAX_COMPLEX ); if( nb_subfr == PE_MAX_NB_SUBFR ) { Lag_range_ptr = &silk_Lag_range_stage3[ complexity ][ 0 ][ 0 ]; Lag_CB_ptr = &silk_CB_lags_stage3[ 0 ][ 0 ]; nb_cbk_search = silk_nb_cbk_searchs_stage3[ complexity ]; cbk_size = PE_NB_CBKS_STAGE3_MAX; } else { silk_assert( nb_subfr == PE_MAX_NB_SUBFR >> 1); Lag_range_ptr = &silk_Lag_range_stage3_10_ms[ 0 ][ 0 ]; Lag_CB_ptr = &silk_CB_lags_stage3_10_ms[ 0 ][ 0 ]; nb_cbk_search = PE_NB_CBKS_STAGE3_10MS; cbk_size = PE_NB_CBKS_STAGE3_10MS; } target_ptr = &frame[ silk_LSHIFT( sf_length, 2 ) ]; for( k = 0; k < nb_subfr; k++ ) { lag_counter = 0; /* Calculate the energy for first lag */ basis_ptr = target_ptr - ( start_lag + matrix_ptr( Lag_range_ptr, k, 0, 2 ) ); energy = silk_energy_FLP( basis_ptr, sf_length ) + 1e-3; silk_assert( energy >= 0.0 ); scratch_mem[lag_counter] = (silk_float)energy; lag_counter++; lag_diff = ( matrix_ptr( Lag_range_ptr, k, 1, 2 ) - matrix_ptr( Lag_range_ptr, k, 0, 2 ) + 1 ); for( i = 1; i < lag_diff; i++ ) { /* remove part outside new window */ energy -= basis_ptr[sf_length - i] * (double)basis_ptr[sf_length - i]; silk_assert( energy >= 0.0 ); /* add part that comes into window */ energy += basis_ptr[ -i ] * (double)basis_ptr[ -i ]; silk_assert( energy >= 0.0 ); silk_assert( lag_counter < SCRATCH_SIZE ); scratch_mem[lag_counter] = (silk_float)energy; lag_counter++; } delta = matrix_ptr( Lag_range_ptr, k, 0, 2 ); for( i = 0; i < nb_cbk_search; i++ ) { /* Fill out the 3 dim array that stores the correlations for */ /* each code_book vector for each start lag */ idx = matrix_ptr( Lag_CB_ptr, k, i, cbk_size ) - delta; for( j = 0; j < PE_NB_STAGE3_LAGS; j++ ) { silk_assert( idx + j < SCRATCH_SIZE ); silk_assert( idx + j < lag_counter ); energies_st3[ k ][ i ][ j ] = scratch_mem[ idx + j ]; silk_assert( energies_st3[ k ][ i ][ j ] >= 0.0f ); } } target_ptr += sf_length; } } mumble-1.3.4/3rdparty/opus-src/silk/float/bwexpander_FLP.c0000664000175000017500000000440414010707327023241 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "SigProc_FLP.h" /* Chirp (bw expand) LP AR filter */ void silk_bwexpander_FLP( silk_float *ar, /* I/O AR filter to be expanded (without leading 1) */ const opus_int d, /* I length of ar */ const silk_float chirp /* I chirp factor (typically in range (0..1) ) */ ) { opus_int i; silk_float cfac = chirp; for( i = 0; i < d - 1; i++ ) { ar[ i ] *= cfac; cfac *= chirp; } ar[ d - 1 ] *= cfac; } mumble-1.3.4/3rdparty/opus-src/silk/float/warped_autocorrelation_FLP.c0000664000175000017500000000672514010707327025666 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main_FLP.h" /* Autocorrelations for a warped frequency axis */ void silk_warped_autocorrelation_FLP( silk_float *corr, /* O Result [order + 1] */ const silk_float *input, /* I Input data to correlate */ const silk_float warping, /* I Warping coefficient */ const opus_int length, /* I Length of input */ const opus_int order /* I Correlation order (even) */ ) { opus_int n, i; double tmp1, tmp2; double state[ MAX_SHAPE_LPC_ORDER + 1 ] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; double C[ MAX_SHAPE_LPC_ORDER + 1 ] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; /* Order must be even */ silk_assert( ( order & 1 ) == 0 ); /* Loop over samples */ for( n = 0; n < length; n++ ) { tmp1 = input[ n ]; /* Loop over allpass sections */ for( i = 0; i < order; i += 2 ) { /* Output of allpass section */ tmp2 = state[ i ] + warping * ( state[ i + 1 ] - tmp1 ); state[ i ] = tmp1; C[ i ] += state[ 0 ] * tmp1; /* Output of allpass section */ tmp1 = state[ i + 1 ] + warping * ( state[ i + 2 ] - tmp2 ); state[ i + 1 ] = tmp2; C[ i + 1 ] += state[ 0 ] * tmp2; } state[ order ] = tmp1; C[ order ] += state[ 0 ] * tmp1; } /* Copy correlations in silk_float output format */ for( i = 0; i < order + 1; i++ ) { corr[ i ] = ( silk_float )C[ i ]; } } mumble-1.3.4/3rdparty/opus-src/silk/float/LPC_inv_pred_gain_FLP.c0000664000175000017500000000633114010707327024405 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "SigProc_FIX.h" #include "SigProc_FLP.h" #include "define.h" /* compute inverse of LPC prediction gain, and */ /* test if LPC coefficients are stable (all poles within unit circle) */ /* this code is based on silk_a2k_FLP() */ silk_float silk_LPC_inverse_pred_gain_FLP( /* O return inverse prediction gain, energy domain */ const silk_float *A, /* I prediction coefficients [order] */ opus_int32 order /* I prediction order */ ) { opus_int k, n; double invGain, rc, rc_mult1, rc_mult2, tmp1, tmp2; silk_float Atmp[ SILK_MAX_ORDER_LPC ]; silk_memcpy( Atmp, A, order * sizeof(silk_float) ); invGain = 1.0; for( k = order - 1; k > 0; k-- ) { rc = -Atmp[ k ]; rc_mult1 = 1.0f - rc * rc; invGain *= rc_mult1; if( invGain * MAX_PREDICTION_POWER_GAIN < 1.0f ) { return 0.0f; } rc_mult2 = 1.0f / rc_mult1; for( n = 0; n < (k + 1) >> 1; n++ ) { tmp1 = Atmp[ n ]; tmp2 = Atmp[ k - n - 1 ]; Atmp[ n ] = (silk_float)( ( tmp1 - tmp2 * rc ) * rc_mult2 ); Atmp[ k - n - 1 ] = (silk_float)( ( tmp2 - tmp1 * rc ) * rc_mult2 ); } } rc = -Atmp[ 0 ]; rc_mult1 = 1.0f - rc * rc; invGain *= rc_mult1; if( invGain * MAX_PREDICTION_POWER_GAIN < 1.0f ) { return 0.0f; } return (silk_float)invGain; } mumble-1.3.4/3rdparty/opus-src/silk/float/find_LTP_FLP.c0000664000175000017500000000643214010707327022544 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main_FLP.h" #include "tuning_parameters.h" void silk_find_LTP_FLP( silk_float XX[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* O Weight for LTP quantization */ silk_float xX[ MAX_NB_SUBFR * LTP_ORDER ], /* O Weight for LTP quantization */ const silk_float r_ptr[], /* I LPC residual */ const opus_int lag[ MAX_NB_SUBFR ], /* I LTP lags */ const opus_int subfr_length, /* I Subframe length */ const opus_int nb_subfr /* I number of subframes */ ) { opus_int k; silk_float *xX_ptr, *XX_ptr; const silk_float *lag_ptr; silk_float xx, temp; xX_ptr = xX; XX_ptr = XX; for( k = 0; k < nb_subfr; k++ ) { lag_ptr = r_ptr - ( lag[ k ] + LTP_ORDER / 2 ); silk_corrMatrix_FLP( lag_ptr, subfr_length, LTP_ORDER, XX_ptr ); silk_corrVector_FLP( lag_ptr, r_ptr, subfr_length, LTP_ORDER, xX_ptr ); xx = ( silk_float )silk_energy_FLP( r_ptr, subfr_length + LTP_ORDER ); temp = 1.0f / silk_max( xx, LTP_CORR_INV_MAX * 0.5f * ( XX_ptr[ 0 ] + XX_ptr[ 24 ] ) + 1.0f ); silk_scale_vector_FLP( XX_ptr, temp, LTP_ORDER * LTP_ORDER ); silk_scale_vector_FLP( xX_ptr, temp, LTP_ORDER ); r_ptr += subfr_length; XX_ptr += LTP_ORDER * LTP_ORDER; xX_ptr += LTP_ORDER; } } mumble-1.3.4/3rdparty/opus-src/silk/float/residual_energy_FLP.c0000664000175000017500000001347314010707327024271 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main_FLP.h" #define MAX_ITERATIONS_RESIDUAL_NRG 10 #define REGULARIZATION_FACTOR 1e-8f /* Residual energy: nrg = wxx - 2 * wXx * c + c' * wXX * c */ silk_float silk_residual_energy_covar_FLP( /* O Weighted residual energy */ const silk_float *c, /* I Filter coefficients */ silk_float *wXX, /* I/O Weighted correlation matrix, reg. out */ const silk_float *wXx, /* I Weighted correlation vector */ const silk_float wxx, /* I Weighted correlation value */ const opus_int D /* I Dimension */ ) { opus_int i, j, k; silk_float tmp, nrg = 0.0f, regularization; /* Safety checks */ silk_assert( D >= 0 ); regularization = REGULARIZATION_FACTOR * ( wXX[ 0 ] + wXX[ D * D - 1 ] ); for( k = 0; k < MAX_ITERATIONS_RESIDUAL_NRG; k++ ) { nrg = wxx; tmp = 0.0f; for( i = 0; i < D; i++ ) { tmp += wXx[ i ] * c[ i ]; } nrg -= 2.0f * tmp; /* compute c' * wXX * c, assuming wXX is symmetric */ for( i = 0; i < D; i++ ) { tmp = 0.0f; for( j = i + 1; j < D; j++ ) { tmp += matrix_c_ptr( wXX, i, j, D ) * c[ j ]; } nrg += c[ i ] * ( 2.0f * tmp + matrix_c_ptr( wXX, i, i, D ) * c[ i ] ); } if( nrg > 0 ) { break; } else { /* Add white noise */ for( i = 0; i < D; i++ ) { matrix_c_ptr( wXX, i, i, D ) += regularization; } /* Increase noise for next run */ regularization *= 2.0f; } } if( k == MAX_ITERATIONS_RESIDUAL_NRG ) { silk_assert( nrg == 0 ); nrg = 1.0f; } return nrg; } /* Calculates residual energies of input subframes where all subframes have LPC_order */ /* of preceding samples */ void silk_residual_energy_FLP( silk_float nrgs[ MAX_NB_SUBFR ], /* O Residual energy per subframe */ const silk_float x[], /* I Input signal */ silk_float a[ 2 ][ MAX_LPC_ORDER ], /* I AR coefs for each frame half */ const silk_float gains[], /* I Quantization gains */ const opus_int subfr_length, /* I Subframe length */ const opus_int nb_subfr, /* I number of subframes */ const opus_int LPC_order /* I LPC order */ ) { opus_int shift; silk_float *LPC_res_ptr, LPC_res[ ( MAX_FRAME_LENGTH + MAX_NB_SUBFR * MAX_LPC_ORDER ) / 2 ]; LPC_res_ptr = LPC_res + LPC_order; shift = LPC_order + subfr_length; /* Filter input to create the LPC residual for each frame half, and measure subframe energies */ silk_LPC_analysis_filter_FLP( LPC_res, a[ 0 ], x + 0 * shift, 2 * shift, LPC_order ); nrgs[ 0 ] = ( silk_float )( gains[ 0 ] * gains[ 0 ] * silk_energy_FLP( LPC_res_ptr + 0 * shift, subfr_length ) ); nrgs[ 1 ] = ( silk_float )( gains[ 1 ] * gains[ 1 ] * silk_energy_FLP( LPC_res_ptr + 1 * shift, subfr_length ) ); if( nb_subfr == MAX_NB_SUBFR ) { silk_LPC_analysis_filter_FLP( LPC_res, a[ 1 ], x + 2 * shift, 2 * shift, LPC_order ); nrgs[ 2 ] = ( silk_float )( gains[ 2 ] * gains[ 2 ] * silk_energy_FLP( LPC_res_ptr + 0 * shift, subfr_length ) ); nrgs[ 3 ] = ( silk_float )( gains[ 3 ] * gains[ 3 ] * silk_energy_FLP( LPC_res_ptr + 1 * shift, subfr_length ) ); } } mumble-1.3.4/3rdparty/opus-src/silk/NLSF_del_dec_quant.c0000664000175000017500000002717014010707327022712 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main.h" /* Delayed-decision quantizer for NLSF residuals */ opus_int32 silk_NLSF_del_dec_quant( /* O Returns RD value in Q25 */ opus_int8 indices[], /* O Quantization indices [ order ] */ const opus_int16 x_Q10[], /* I Input [ order ] */ const opus_int16 w_Q5[], /* I Weights [ order ] */ const opus_uint8 pred_coef_Q8[], /* I Backward predictor coefs [ order ] */ const opus_int16 ec_ix[], /* I Indices to entropy coding tables [ order ] */ const opus_uint8 ec_rates_Q5[], /* I Rates [] */ const opus_int quant_step_size_Q16, /* I Quantization step size */ const opus_int16 inv_quant_step_size_Q6, /* I Inverse quantization step size */ const opus_int32 mu_Q20, /* I R/D tradeoff */ const opus_int16 order /* I Number of input values */ ) { opus_int i, j, nStates, ind_tmp, ind_min_max, ind_max_min, in_Q10, res_Q10; opus_int pred_Q10, diff_Q10, rate0_Q5, rate1_Q5; opus_int16 out0_Q10, out1_Q10; opus_int32 RD_tmp_Q25, min_Q25, min_max_Q25, max_min_Q25; opus_int ind_sort[ NLSF_QUANT_DEL_DEC_STATES ]; opus_int8 ind[ NLSF_QUANT_DEL_DEC_STATES ][ MAX_LPC_ORDER ]; opus_int16 prev_out_Q10[ 2 * NLSF_QUANT_DEL_DEC_STATES ]; opus_int32 RD_Q25[ 2 * NLSF_QUANT_DEL_DEC_STATES ]; opus_int32 RD_min_Q25[ NLSF_QUANT_DEL_DEC_STATES ]; opus_int32 RD_max_Q25[ NLSF_QUANT_DEL_DEC_STATES ]; const opus_uint8 *rates_Q5; opus_int out0_Q10_table[2 * NLSF_QUANT_MAX_AMPLITUDE_EXT]; opus_int out1_Q10_table[2 * NLSF_QUANT_MAX_AMPLITUDE_EXT]; for (i = -NLSF_QUANT_MAX_AMPLITUDE_EXT; i <= NLSF_QUANT_MAX_AMPLITUDE_EXT-1; i++) { out0_Q10 = silk_LSHIFT( i, 10 ); out1_Q10 = silk_ADD16( out0_Q10, 1024 ); if( i > 0 ) { out0_Q10 = silk_SUB16( out0_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) ); out1_Q10 = silk_SUB16( out1_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) ); } else if( i == 0 ) { out1_Q10 = silk_SUB16( out1_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) ); } else if( i == -1 ) { out0_Q10 = silk_ADD16( out0_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) ); } else { out0_Q10 = silk_ADD16( out0_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) ); out1_Q10 = silk_ADD16( out1_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) ); } out0_Q10_table[ i + NLSF_QUANT_MAX_AMPLITUDE_EXT ] = silk_RSHIFT( silk_SMULBB( out0_Q10, quant_step_size_Q16 ), 16 ); out1_Q10_table[ i + NLSF_QUANT_MAX_AMPLITUDE_EXT ] = silk_RSHIFT( silk_SMULBB( out1_Q10, quant_step_size_Q16 ), 16 ); } silk_assert( (NLSF_QUANT_DEL_DEC_STATES & (NLSF_QUANT_DEL_DEC_STATES-1)) == 0 ); /* must be power of two */ nStates = 1; RD_Q25[ 0 ] = 0; prev_out_Q10[ 0 ] = 0; for( i = order - 1; i >= 0; i-- ) { rates_Q5 = &ec_rates_Q5[ ec_ix[ i ] ]; in_Q10 = x_Q10[ i ]; for( j = 0; j < nStates; j++ ) { pred_Q10 = silk_RSHIFT( silk_SMULBB( (opus_int16)pred_coef_Q8[ i ], prev_out_Q10[ j ] ), 8 ); res_Q10 = silk_SUB16( in_Q10, pred_Q10 ); ind_tmp = silk_RSHIFT( silk_SMULBB( inv_quant_step_size_Q6, res_Q10 ), 16 ); ind_tmp = silk_LIMIT( ind_tmp, -NLSF_QUANT_MAX_AMPLITUDE_EXT, NLSF_QUANT_MAX_AMPLITUDE_EXT-1 ); ind[ j ][ i ] = (opus_int8)ind_tmp; /* compute outputs for ind_tmp and ind_tmp + 1 */ out0_Q10 = out0_Q10_table[ ind_tmp + NLSF_QUANT_MAX_AMPLITUDE_EXT ]; out1_Q10 = out1_Q10_table[ ind_tmp + NLSF_QUANT_MAX_AMPLITUDE_EXT ]; out0_Q10 = silk_ADD16( out0_Q10, pred_Q10 ); out1_Q10 = silk_ADD16( out1_Q10, pred_Q10 ); prev_out_Q10[ j ] = out0_Q10; prev_out_Q10[ j + nStates ] = out1_Q10; /* compute RD for ind_tmp and ind_tmp + 1 */ if( ind_tmp + 1 >= NLSF_QUANT_MAX_AMPLITUDE ) { if( ind_tmp + 1 == NLSF_QUANT_MAX_AMPLITUDE ) { rate0_Q5 = rates_Q5[ ind_tmp + NLSF_QUANT_MAX_AMPLITUDE ]; rate1_Q5 = 280; } else { rate0_Q5 = silk_SMLABB( 280 - 43 * NLSF_QUANT_MAX_AMPLITUDE, 43, ind_tmp ); rate1_Q5 = silk_ADD16( rate0_Q5, 43 ); } } else if( ind_tmp <= -NLSF_QUANT_MAX_AMPLITUDE ) { if( ind_tmp == -NLSF_QUANT_MAX_AMPLITUDE ) { rate0_Q5 = 280; rate1_Q5 = rates_Q5[ ind_tmp + 1 + NLSF_QUANT_MAX_AMPLITUDE ]; } else { rate0_Q5 = silk_SMLABB( 280 - 43 * NLSF_QUANT_MAX_AMPLITUDE, -43, ind_tmp ); rate1_Q5 = silk_SUB16( rate0_Q5, 43 ); } } else { rate0_Q5 = rates_Q5[ ind_tmp + NLSF_QUANT_MAX_AMPLITUDE ]; rate1_Q5 = rates_Q5[ ind_tmp + 1 + NLSF_QUANT_MAX_AMPLITUDE ]; } RD_tmp_Q25 = RD_Q25[ j ]; diff_Q10 = silk_SUB16( in_Q10, out0_Q10 ); RD_Q25[ j ] = silk_SMLABB( silk_MLA( RD_tmp_Q25, silk_SMULBB( diff_Q10, diff_Q10 ), w_Q5[ i ] ), mu_Q20, rate0_Q5 ); diff_Q10 = silk_SUB16( in_Q10, out1_Q10 ); RD_Q25[ j + nStates ] = silk_SMLABB( silk_MLA( RD_tmp_Q25, silk_SMULBB( diff_Q10, diff_Q10 ), w_Q5[ i ] ), mu_Q20, rate1_Q5 ); } if( nStates <= NLSF_QUANT_DEL_DEC_STATES/2 ) { /* double number of states and copy */ for( j = 0; j < nStates; j++ ) { ind[ j + nStates ][ i ] = ind[ j ][ i ] + 1; } nStates = silk_LSHIFT( nStates, 1 ); for( j = nStates; j < NLSF_QUANT_DEL_DEC_STATES; j++ ) { ind[ j ][ i ] = ind[ j - nStates ][ i ]; } } else { /* sort lower and upper half of RD_Q25, pairwise */ for( j = 0; j < NLSF_QUANT_DEL_DEC_STATES; j++ ) { if( RD_Q25[ j ] > RD_Q25[ j + NLSF_QUANT_DEL_DEC_STATES ] ) { RD_max_Q25[ j ] = RD_Q25[ j ]; RD_min_Q25[ j ] = RD_Q25[ j + NLSF_QUANT_DEL_DEC_STATES ]; RD_Q25[ j ] = RD_min_Q25[ j ]; RD_Q25[ j + NLSF_QUANT_DEL_DEC_STATES ] = RD_max_Q25[ j ]; /* swap prev_out values */ out0_Q10 = prev_out_Q10[ j ]; prev_out_Q10[ j ] = prev_out_Q10[ j + NLSF_QUANT_DEL_DEC_STATES ]; prev_out_Q10[ j + NLSF_QUANT_DEL_DEC_STATES ] = out0_Q10; ind_sort[ j ] = j + NLSF_QUANT_DEL_DEC_STATES; } else { RD_min_Q25[ j ] = RD_Q25[ j ]; RD_max_Q25[ j ] = RD_Q25[ j + NLSF_QUANT_DEL_DEC_STATES ]; ind_sort[ j ] = j; } } /* compare the highest RD values of the winning half with the lowest one in the losing half, and copy if necessary */ /* afterwards ind_sort[] will contain the indices of the NLSF_QUANT_DEL_DEC_STATES winning RD values */ while( 1 ) { min_max_Q25 = silk_int32_MAX; max_min_Q25 = 0; ind_min_max = 0; ind_max_min = 0; for( j = 0; j < NLSF_QUANT_DEL_DEC_STATES; j++ ) { if( min_max_Q25 > RD_max_Q25[ j ] ) { min_max_Q25 = RD_max_Q25[ j ]; ind_min_max = j; } if( max_min_Q25 < RD_min_Q25[ j ] ) { max_min_Q25 = RD_min_Q25[ j ]; ind_max_min = j; } } if( min_max_Q25 >= max_min_Q25 ) { break; } /* copy ind_min_max to ind_max_min */ ind_sort[ ind_max_min ] = ind_sort[ ind_min_max ] ^ NLSF_QUANT_DEL_DEC_STATES; RD_Q25[ ind_max_min ] = RD_Q25[ ind_min_max + NLSF_QUANT_DEL_DEC_STATES ]; prev_out_Q10[ ind_max_min ] = prev_out_Q10[ ind_min_max + NLSF_QUANT_DEL_DEC_STATES ]; RD_min_Q25[ ind_max_min ] = 0; RD_max_Q25[ ind_min_max ] = silk_int32_MAX; silk_memcpy( ind[ ind_max_min ], ind[ ind_min_max ], MAX_LPC_ORDER * sizeof( opus_int8 ) ); } /* increment index if it comes from the upper half */ for( j = 0; j < NLSF_QUANT_DEL_DEC_STATES; j++ ) { ind[ j ][ i ] += silk_RSHIFT( ind_sort[ j ], NLSF_QUANT_DEL_DEC_STATES_LOG2 ); } } } /* last sample: find winner, copy indices and return RD value */ ind_tmp = 0; min_Q25 = silk_int32_MAX; for( j = 0; j < 2 * NLSF_QUANT_DEL_DEC_STATES; j++ ) { if( min_Q25 > RD_Q25[ j ] ) { min_Q25 = RD_Q25[ j ]; ind_tmp = j; } } for( j = 0; j < order; j++ ) { indices[ j ] = ind[ ind_tmp & ( NLSF_QUANT_DEL_DEC_STATES - 1 ) ][ j ]; silk_assert( indices[ j ] >= -NLSF_QUANT_MAX_AMPLITUDE_EXT ); silk_assert( indices[ j ] <= NLSF_QUANT_MAX_AMPLITUDE_EXT ); } indices[ 0 ] += silk_RSHIFT( ind_tmp, NLSF_QUANT_DEL_DEC_STATES_LOG2 ); silk_assert( indices[ 0 ] <= NLSF_QUANT_MAX_AMPLITUDE_EXT ); silk_assert( min_Q25 >= 0 ); return min_Q25; } mumble-1.3.4/3rdparty/opus-src/silk/control_codec.c0000664000175000017500000005015714010707327022117 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef FIXED_POINT #include "main_FIX.h" #define silk_encoder_state_Fxx silk_encoder_state_FIX #else #include "main_FLP.h" #define silk_encoder_state_Fxx silk_encoder_state_FLP #endif #include "stack_alloc.h" #include "tuning_parameters.h" #include "pitch_est_defines.h" static opus_int silk_setup_resamplers( silk_encoder_state_Fxx *psEnc, /* I/O */ opus_int fs_kHz /* I */ ); static opus_int silk_setup_fs( silk_encoder_state_Fxx *psEnc, /* I/O */ opus_int fs_kHz, /* I */ opus_int PacketSize_ms /* I */ ); static opus_int silk_setup_complexity( silk_encoder_state *psEncC, /* I/O */ opus_int Complexity /* I */ ); static OPUS_INLINE opus_int silk_setup_LBRR( silk_encoder_state *psEncC, /* I/O */ const silk_EncControlStruct *encControl /* I */ ); /* Control encoder */ opus_int silk_control_encoder( silk_encoder_state_Fxx *psEnc, /* I/O Pointer to Silk encoder state */ silk_EncControlStruct *encControl, /* I Control structure */ const opus_int allow_bw_switch, /* I Flag to allow switching audio bandwidth */ const opus_int channelNb, /* I Channel number */ const opus_int force_fs_kHz ) { opus_int fs_kHz, ret = 0; psEnc->sCmn.useDTX = encControl->useDTX; psEnc->sCmn.useCBR = encControl->useCBR; psEnc->sCmn.API_fs_Hz = encControl->API_sampleRate; psEnc->sCmn.maxInternal_fs_Hz = encControl->maxInternalSampleRate; psEnc->sCmn.minInternal_fs_Hz = encControl->minInternalSampleRate; psEnc->sCmn.desiredInternal_fs_Hz = encControl->desiredInternalSampleRate; psEnc->sCmn.useInBandFEC = encControl->useInBandFEC; psEnc->sCmn.nChannelsAPI = encControl->nChannelsAPI; psEnc->sCmn.nChannelsInternal = encControl->nChannelsInternal; psEnc->sCmn.allow_bandwidth_switch = allow_bw_switch; psEnc->sCmn.channelNb = channelNb; if( psEnc->sCmn.controlled_since_last_payload != 0 && psEnc->sCmn.prefillFlag == 0 ) { if( psEnc->sCmn.API_fs_Hz != psEnc->sCmn.prev_API_fs_Hz && psEnc->sCmn.fs_kHz > 0 ) { /* Change in API sampling rate in the middle of encoding a packet */ ret += silk_setup_resamplers( psEnc, psEnc->sCmn.fs_kHz ); } return ret; } /* Beyond this point we know that there are no previously coded frames in the payload buffer */ /********************************************/ /* Determine internal sampling rate */ /********************************************/ fs_kHz = silk_control_audio_bandwidth( &psEnc->sCmn, encControl ); if( force_fs_kHz ) { fs_kHz = force_fs_kHz; } /********************************************/ /* Prepare resampler and buffered data */ /********************************************/ ret += silk_setup_resamplers( psEnc, fs_kHz ); /********************************************/ /* Set internal sampling frequency */ /********************************************/ ret += silk_setup_fs( psEnc, fs_kHz, encControl->payloadSize_ms ); /********************************************/ /* Set encoding complexity */ /********************************************/ ret += silk_setup_complexity( &psEnc->sCmn, encControl->complexity ); /********************************************/ /* Set packet loss rate measured by farend */ /********************************************/ psEnc->sCmn.PacketLoss_perc = encControl->packetLossPercentage; /********************************************/ /* Set LBRR usage */ /********************************************/ ret += silk_setup_LBRR( &psEnc->sCmn, encControl ); psEnc->sCmn.controlled_since_last_payload = 1; return ret; } static opus_int silk_setup_resamplers( silk_encoder_state_Fxx *psEnc, /* I/O */ opus_int fs_kHz /* I */ ) { opus_int ret = SILK_NO_ERROR; SAVE_STACK; if( psEnc->sCmn.fs_kHz != fs_kHz || psEnc->sCmn.prev_API_fs_Hz != psEnc->sCmn.API_fs_Hz ) { if( psEnc->sCmn.fs_kHz == 0 ) { /* Initialize the resampler for enc_API.c preparing resampling from API_fs_Hz to fs_kHz */ ret += silk_resampler_init( &psEnc->sCmn.resampler_state, psEnc->sCmn.API_fs_Hz, fs_kHz * 1000, 1 ); } else { VARDECL( opus_int16, x_buf_API_fs_Hz ); VARDECL( silk_resampler_state_struct, temp_resampler_state ); #ifdef FIXED_POINT opus_int16 *x_bufFIX = psEnc->x_buf; #else VARDECL( opus_int16, x_bufFIX ); opus_int32 new_buf_samples; #endif opus_int32 api_buf_samples; opus_int32 old_buf_samples; opus_int32 buf_length_ms; buf_length_ms = silk_LSHIFT( psEnc->sCmn.nb_subfr * 5, 1 ) + LA_SHAPE_MS; old_buf_samples = buf_length_ms * psEnc->sCmn.fs_kHz; #ifndef FIXED_POINT new_buf_samples = buf_length_ms * fs_kHz; ALLOC( x_bufFIX, silk_max( old_buf_samples, new_buf_samples ), opus_int16 ); silk_float2short_array( x_bufFIX, psEnc->x_buf, old_buf_samples ); #endif /* Initialize resampler for temporary resampling of x_buf data to API_fs_Hz */ ALLOC( temp_resampler_state, 1, silk_resampler_state_struct ); ret += silk_resampler_init( temp_resampler_state, silk_SMULBB( psEnc->sCmn.fs_kHz, 1000 ), psEnc->sCmn.API_fs_Hz, 0 ); /* Calculate number of samples to temporarily upsample */ api_buf_samples = buf_length_ms * silk_DIV32_16( psEnc->sCmn.API_fs_Hz, 1000 ); /* Temporary resampling of x_buf data to API_fs_Hz */ ALLOC( x_buf_API_fs_Hz, api_buf_samples, opus_int16 ); ret += silk_resampler( temp_resampler_state, x_buf_API_fs_Hz, x_bufFIX, old_buf_samples ); /* Initialize the resampler for enc_API.c preparing resampling from API_fs_Hz to fs_kHz */ ret += silk_resampler_init( &psEnc->sCmn.resampler_state, psEnc->sCmn.API_fs_Hz, silk_SMULBB( fs_kHz, 1000 ), 1 ); /* Correct resampler state by resampling buffered data from API_fs_Hz to fs_kHz */ ret += silk_resampler( &psEnc->sCmn.resampler_state, x_bufFIX, x_buf_API_fs_Hz, api_buf_samples ); #ifndef FIXED_POINT silk_short2float_array( psEnc->x_buf, x_bufFIX, new_buf_samples); #endif } } psEnc->sCmn.prev_API_fs_Hz = psEnc->sCmn.API_fs_Hz; RESTORE_STACK; return ret; } static opus_int silk_setup_fs( silk_encoder_state_Fxx *psEnc, /* I/O */ opus_int fs_kHz, /* I */ opus_int PacketSize_ms /* I */ ) { opus_int ret = SILK_NO_ERROR; /* Set packet size */ if( PacketSize_ms != psEnc->sCmn.PacketSize_ms ) { if( ( PacketSize_ms != 10 ) && ( PacketSize_ms != 20 ) && ( PacketSize_ms != 40 ) && ( PacketSize_ms != 60 ) ) { ret = SILK_ENC_PACKET_SIZE_NOT_SUPPORTED; } if( PacketSize_ms <= 10 ) { psEnc->sCmn.nFramesPerPacket = 1; psEnc->sCmn.nb_subfr = PacketSize_ms == 10 ? 2 : 1; psEnc->sCmn.frame_length = silk_SMULBB( PacketSize_ms, fs_kHz ); psEnc->sCmn.pitch_LPC_win_length = silk_SMULBB( FIND_PITCH_LPC_WIN_MS_2_SF, fs_kHz ); if( psEnc->sCmn.fs_kHz == 8 ) { psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_10_ms_NB_iCDF; } else { psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_10_ms_iCDF; } } else { psEnc->sCmn.nFramesPerPacket = silk_DIV32_16( PacketSize_ms, MAX_FRAME_LENGTH_MS ); psEnc->sCmn.nb_subfr = MAX_NB_SUBFR; psEnc->sCmn.frame_length = silk_SMULBB( 20, fs_kHz ); psEnc->sCmn.pitch_LPC_win_length = silk_SMULBB( FIND_PITCH_LPC_WIN_MS, fs_kHz ); if( psEnc->sCmn.fs_kHz == 8 ) { psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_NB_iCDF; } else { psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_iCDF; } } psEnc->sCmn.PacketSize_ms = PacketSize_ms; psEnc->sCmn.TargetRate_bps = 0; /* trigger new SNR computation */ } /* Set internal sampling frequency */ silk_assert( fs_kHz == 8 || fs_kHz == 12 || fs_kHz == 16 ); silk_assert( psEnc->sCmn.nb_subfr == 2 || psEnc->sCmn.nb_subfr == 4 ); if( psEnc->sCmn.fs_kHz != fs_kHz ) { /* reset part of the state */ silk_memset( &psEnc->sShape, 0, sizeof( psEnc->sShape ) ); silk_memset( &psEnc->sCmn.sNSQ, 0, sizeof( psEnc->sCmn.sNSQ ) ); silk_memset( psEnc->sCmn.prev_NLSFq_Q15, 0, sizeof( psEnc->sCmn.prev_NLSFq_Q15 ) ); silk_memset( &psEnc->sCmn.sLP.In_LP_State, 0, sizeof( psEnc->sCmn.sLP.In_LP_State ) ); psEnc->sCmn.inputBufIx = 0; psEnc->sCmn.nFramesEncoded = 0; psEnc->sCmn.TargetRate_bps = 0; /* trigger new SNR computation */ /* Initialize non-zero parameters */ psEnc->sCmn.prevLag = 100; psEnc->sCmn.first_frame_after_reset = 1; psEnc->sShape.LastGainIndex = 10; psEnc->sCmn.sNSQ.lagPrev = 100; psEnc->sCmn.sNSQ.prev_gain_Q16 = 65536; psEnc->sCmn.prevSignalType = TYPE_NO_VOICE_ACTIVITY; psEnc->sCmn.fs_kHz = fs_kHz; if( psEnc->sCmn.fs_kHz == 8 ) { if( psEnc->sCmn.nb_subfr == MAX_NB_SUBFR ) { psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_NB_iCDF; } else { psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_10_ms_NB_iCDF; } } else { if( psEnc->sCmn.nb_subfr == MAX_NB_SUBFR ) { psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_iCDF; } else { psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_10_ms_iCDF; } } if( psEnc->sCmn.fs_kHz == 8 || psEnc->sCmn.fs_kHz == 12 ) { psEnc->sCmn.predictLPCOrder = MIN_LPC_ORDER; psEnc->sCmn.psNLSF_CB = &silk_NLSF_CB_NB_MB; } else { psEnc->sCmn.predictLPCOrder = MAX_LPC_ORDER; psEnc->sCmn.psNLSF_CB = &silk_NLSF_CB_WB; } psEnc->sCmn.subfr_length = SUB_FRAME_LENGTH_MS * fs_kHz; psEnc->sCmn.frame_length = silk_SMULBB( psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr ); psEnc->sCmn.ltp_mem_length = silk_SMULBB( LTP_MEM_LENGTH_MS, fs_kHz ); psEnc->sCmn.la_pitch = silk_SMULBB( LA_PITCH_MS, fs_kHz ); psEnc->sCmn.max_pitch_lag = silk_SMULBB( 18, fs_kHz ); if( psEnc->sCmn.nb_subfr == MAX_NB_SUBFR ) { psEnc->sCmn.pitch_LPC_win_length = silk_SMULBB( FIND_PITCH_LPC_WIN_MS, fs_kHz ); } else { psEnc->sCmn.pitch_LPC_win_length = silk_SMULBB( FIND_PITCH_LPC_WIN_MS_2_SF, fs_kHz ); } if( psEnc->sCmn.fs_kHz == 16 ) { psEnc->sCmn.pitch_lag_low_bits_iCDF = silk_uniform8_iCDF; } else if( psEnc->sCmn.fs_kHz == 12 ) { psEnc->sCmn.pitch_lag_low_bits_iCDF = silk_uniform6_iCDF; } else { psEnc->sCmn.pitch_lag_low_bits_iCDF = silk_uniform4_iCDF; } } /* Check that settings are valid */ silk_assert( ( psEnc->sCmn.subfr_length * psEnc->sCmn.nb_subfr ) == psEnc->sCmn.frame_length ); return ret; } static opus_int silk_setup_complexity( silk_encoder_state *psEncC, /* I/O */ opus_int Complexity /* I */ ) { opus_int ret = 0; /* Set encoding complexity */ silk_assert( Complexity >= 0 && Complexity <= 10 ); if( Complexity < 1 ) { psEncC->pitchEstimationComplexity = SILK_PE_MIN_COMPLEX; psEncC->pitchEstimationThreshold_Q16 = SILK_FIX_CONST( 0.8, 16 ); psEncC->pitchEstimationLPCOrder = 6; psEncC->shapingLPCOrder = 12; psEncC->la_shape = 3 * psEncC->fs_kHz; psEncC->nStatesDelayedDecision = 1; psEncC->useInterpolatedNLSFs = 0; psEncC->NLSF_MSVQ_Survivors = 2; psEncC->warping_Q16 = 0; } else if( Complexity < 2 ) { psEncC->pitchEstimationComplexity = SILK_PE_MID_COMPLEX; psEncC->pitchEstimationThreshold_Q16 = SILK_FIX_CONST( 0.76, 16 ); psEncC->pitchEstimationLPCOrder = 8; psEncC->shapingLPCOrder = 14; psEncC->la_shape = 5 * psEncC->fs_kHz; psEncC->nStatesDelayedDecision = 1; psEncC->useInterpolatedNLSFs = 0; psEncC->NLSF_MSVQ_Survivors = 3; psEncC->warping_Q16 = 0; } else if( Complexity < 3 ) { psEncC->pitchEstimationComplexity = SILK_PE_MIN_COMPLEX; psEncC->pitchEstimationThreshold_Q16 = SILK_FIX_CONST( 0.8, 16 ); psEncC->pitchEstimationLPCOrder = 6; psEncC->shapingLPCOrder = 12; psEncC->la_shape = 3 * psEncC->fs_kHz; psEncC->nStatesDelayedDecision = 2; psEncC->useInterpolatedNLSFs = 0; psEncC->NLSF_MSVQ_Survivors = 2; psEncC->warping_Q16 = 0; } else if( Complexity < 4 ) { psEncC->pitchEstimationComplexity = SILK_PE_MID_COMPLEX; psEncC->pitchEstimationThreshold_Q16 = SILK_FIX_CONST( 0.76, 16 ); psEncC->pitchEstimationLPCOrder = 8; psEncC->shapingLPCOrder = 14; psEncC->la_shape = 5 * psEncC->fs_kHz; psEncC->nStatesDelayedDecision = 2; psEncC->useInterpolatedNLSFs = 0; psEncC->NLSF_MSVQ_Survivors = 4; psEncC->warping_Q16 = 0; } else if( Complexity < 6 ) { psEncC->pitchEstimationComplexity = SILK_PE_MID_COMPLEX; psEncC->pitchEstimationThreshold_Q16 = SILK_FIX_CONST( 0.74, 16 ); psEncC->pitchEstimationLPCOrder = 10; psEncC->shapingLPCOrder = 16; psEncC->la_shape = 5 * psEncC->fs_kHz; psEncC->nStatesDelayedDecision = 2; psEncC->useInterpolatedNLSFs = 1; psEncC->NLSF_MSVQ_Survivors = 6; psEncC->warping_Q16 = psEncC->fs_kHz * SILK_FIX_CONST( WARPING_MULTIPLIER, 16 ); } else if( Complexity < 8 ) { psEncC->pitchEstimationComplexity = SILK_PE_MID_COMPLEX; psEncC->pitchEstimationThreshold_Q16 = SILK_FIX_CONST( 0.72, 16 ); psEncC->pitchEstimationLPCOrder = 12; psEncC->shapingLPCOrder = 20; psEncC->la_shape = 5 * psEncC->fs_kHz; psEncC->nStatesDelayedDecision = 3; psEncC->useInterpolatedNLSFs = 1; psEncC->NLSF_MSVQ_Survivors = 8; psEncC->warping_Q16 = psEncC->fs_kHz * SILK_FIX_CONST( WARPING_MULTIPLIER, 16 ); } else { psEncC->pitchEstimationComplexity = SILK_PE_MAX_COMPLEX; psEncC->pitchEstimationThreshold_Q16 = SILK_FIX_CONST( 0.7, 16 ); psEncC->pitchEstimationLPCOrder = 16; psEncC->shapingLPCOrder = 24; psEncC->la_shape = 5 * psEncC->fs_kHz; psEncC->nStatesDelayedDecision = MAX_DEL_DEC_STATES; psEncC->useInterpolatedNLSFs = 1; psEncC->NLSF_MSVQ_Survivors = 16; psEncC->warping_Q16 = psEncC->fs_kHz * SILK_FIX_CONST( WARPING_MULTIPLIER, 16 ); } /* Do not allow higher pitch estimation LPC order than predict LPC order */ psEncC->pitchEstimationLPCOrder = silk_min_int( psEncC->pitchEstimationLPCOrder, psEncC->predictLPCOrder ); psEncC->shapeWinLength = SUB_FRAME_LENGTH_MS * psEncC->fs_kHz + 2 * psEncC->la_shape; psEncC->Complexity = Complexity; silk_assert( psEncC->pitchEstimationLPCOrder <= MAX_FIND_PITCH_LPC_ORDER ); silk_assert( psEncC->shapingLPCOrder <= MAX_SHAPE_LPC_ORDER ); silk_assert( psEncC->nStatesDelayedDecision <= MAX_DEL_DEC_STATES ); silk_assert( psEncC->warping_Q16 <= 32767 ); silk_assert( psEncC->la_shape <= LA_SHAPE_MAX ); silk_assert( psEncC->shapeWinLength <= SHAPE_LPC_WIN_MAX ); return ret; } static OPUS_INLINE opus_int silk_setup_LBRR( silk_encoder_state *psEncC, /* I/O */ const silk_EncControlStruct *encControl /* I */ ) { opus_int LBRR_in_previous_packet, ret = SILK_NO_ERROR; LBRR_in_previous_packet = psEncC->LBRR_enabled; psEncC->LBRR_enabled = encControl->LBRR_coded; if( psEncC->LBRR_enabled ) { /* Set gain increase for coding LBRR excitation */ if( LBRR_in_previous_packet == 0 ) { /* Previous packet did not have LBRR, and was therefore coded at a higher bitrate */ psEncC->LBRR_GainIncreases = 7; } else { psEncC->LBRR_GainIncreases = silk_max_int( 7 - silk_SMULWB( (opus_int32)psEncC->PacketLoss_perc, SILK_FIX_CONST( 0.4, 16 ) ), 2 ); } } return ret; } mumble-1.3.4/3rdparty/opus-src/silk/lin2log.c0000664000175000017500000000425414010707327020645 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "SigProc_FIX.h" /* Approximation of 128 * log2() (very close inverse of silk_log2lin()) */ /* Convert input to a log scale */ opus_int32 silk_lin2log( const opus_int32 inLin /* I input in linear scale */ ) { opus_int32 lz, frac_Q7; silk_CLZ_FRAC( inLin, &lz, &frac_Q7 ); /* Piece-wise parabolic approximation */ return silk_ADD_LSHIFT32( silk_SMLAWB( frac_Q7, silk_MUL( frac_Q7, 128 - frac_Q7 ), 179 ), 31 - lz, 7 ); } mumble-1.3.4/3rdparty/opus-src/silk/NLSF_decode.c0000664000175000017500000001123614010707327021342 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main.h" /* Predictive dequantizer for NLSF residuals */ static OPUS_INLINE void silk_NLSF_residual_dequant( /* O Returns RD value in Q30 */ opus_int16 x_Q10[], /* O Output [ order ] */ const opus_int8 indices[], /* I Quantization indices [ order ] */ const opus_uint8 pred_coef_Q8[], /* I Backward predictor coefs [ order ] */ const opus_int quant_step_size_Q16, /* I Quantization step size */ const opus_int16 order /* I Number of input values */ ) { opus_int i, out_Q10, pred_Q10; out_Q10 = 0; for( i = order-1; i >= 0; i-- ) { pred_Q10 = silk_RSHIFT( silk_SMULBB( out_Q10, (opus_int16)pred_coef_Q8[ i ] ), 8 ); out_Q10 = silk_LSHIFT( indices[ i ], 10 ); if( out_Q10 > 0 ) { out_Q10 = silk_SUB16( out_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) ); } else if( out_Q10 < 0 ) { out_Q10 = silk_ADD16( out_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) ); } out_Q10 = silk_SMLAWB( pred_Q10, (opus_int32)out_Q10, quant_step_size_Q16 ); x_Q10[ i ] = out_Q10; } } /***********************/ /* NLSF vector decoder */ /***********************/ void silk_NLSF_decode( opus_int16 *pNLSF_Q15, /* O Quantized NLSF vector [ LPC_ORDER ] */ opus_int8 *NLSFIndices, /* I Codebook path vector [ LPC_ORDER + 1 ] */ const silk_NLSF_CB_struct *psNLSF_CB /* I Codebook object */ ) { opus_int i; opus_uint8 pred_Q8[ MAX_LPC_ORDER ]; opus_int16 ec_ix[ MAX_LPC_ORDER ]; opus_int16 res_Q10[ MAX_LPC_ORDER ]; opus_int32 NLSF_Q15_tmp; const opus_uint8 *pCB_element; const opus_int16 *pCB_Wght_Q9; /* Unpack entropy table indices and predictor for current CB1 index */ silk_NLSF_unpack( ec_ix, pred_Q8, psNLSF_CB, NLSFIndices[ 0 ] ); /* Predictive residual dequantizer */ silk_NLSF_residual_dequant( res_Q10, &NLSFIndices[ 1 ], pred_Q8, psNLSF_CB->quantStepSize_Q16, psNLSF_CB->order ); /* Apply inverse square-rooted weights to first stage and add to output */ pCB_element = &psNLSF_CB->CB1_NLSF_Q8[ NLSFIndices[ 0 ] * psNLSF_CB->order ]; pCB_Wght_Q9 = &psNLSF_CB->CB1_Wght_Q9[ NLSFIndices[ 0 ] * psNLSF_CB->order ]; for( i = 0; i < psNLSF_CB->order; i++ ) { NLSF_Q15_tmp = silk_ADD_LSHIFT32( silk_DIV32_16( silk_LSHIFT( (opus_int32)res_Q10[ i ], 14 ), pCB_Wght_Q9[ i ] ), (opus_int16)pCB_element[ i ], 7 ); pNLSF_Q15[ i ] = (opus_int16)silk_LIMIT( NLSF_Q15_tmp, 0, 32767 ); } /* NLSF stabilization */ silk_NLSF_stabilize( pNLSF_Q15, psNLSF_CB->deltaMin_Q15, psNLSF_CB->order ); } mumble-1.3.4/3rdparty/opus-src/silk/enc_API.c0000664000175000017500000007413414010707327020541 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "define.h" #include "API.h" #include "control.h" #include "typedef.h" #include "stack_alloc.h" #include "structs.h" #include "tuning_parameters.h" #ifdef FIXED_POINT #include "main_FIX.h" #else #include "main_FLP.h" #endif /***************************************/ /* Read control structure from encoder */ /***************************************/ static opus_int silk_QueryEncoder( /* O Returns error code */ const void *encState, /* I State */ silk_EncControlStruct *encStatus /* O Encoder Status */ ); /****************************************/ /* Encoder functions */ /****************************************/ opus_int silk_Get_Encoder_Size( /* O Returns error code */ opus_int *encSizeBytes /* O Number of bytes in SILK encoder state */ ) { opus_int ret = SILK_NO_ERROR; *encSizeBytes = sizeof( silk_encoder ); return ret; } /*************************/ /* Init or Reset encoder */ /*************************/ opus_int silk_InitEncoder( /* O Returns error code */ void *encState, /* I/O State */ int arch, /* I Run-time architecture */ silk_EncControlStruct *encStatus /* O Encoder Status */ ) { silk_encoder *psEnc; opus_int n, ret = SILK_NO_ERROR; psEnc = (silk_encoder *)encState; /* Reset encoder */ silk_memset( psEnc, 0, sizeof( silk_encoder ) ); for( n = 0; n < ENCODER_NUM_CHANNELS; n++ ) { if( ret += silk_init_encoder( &psEnc->state_Fxx[ n ], arch ) ) { silk_assert( 0 ); } } psEnc->nChannelsAPI = 1; psEnc->nChannelsInternal = 1; /* Read control structure */ if( ret += silk_QueryEncoder( encState, encStatus ) ) { silk_assert( 0 ); } return ret; } /***************************************/ /* Read control structure from encoder */ /***************************************/ static opus_int silk_QueryEncoder( /* O Returns error code */ const void *encState, /* I State */ silk_EncControlStruct *encStatus /* O Encoder Status */ ) { opus_int ret = SILK_NO_ERROR; silk_encoder_state_Fxx *state_Fxx; silk_encoder *psEnc = (silk_encoder *)encState; state_Fxx = psEnc->state_Fxx; encStatus->nChannelsAPI = psEnc->nChannelsAPI; encStatus->nChannelsInternal = psEnc->nChannelsInternal; encStatus->API_sampleRate = state_Fxx[ 0 ].sCmn.API_fs_Hz; encStatus->maxInternalSampleRate = state_Fxx[ 0 ].sCmn.maxInternal_fs_Hz; encStatus->minInternalSampleRate = state_Fxx[ 0 ].sCmn.minInternal_fs_Hz; encStatus->desiredInternalSampleRate = state_Fxx[ 0 ].sCmn.desiredInternal_fs_Hz; encStatus->payloadSize_ms = state_Fxx[ 0 ].sCmn.PacketSize_ms; encStatus->bitRate = state_Fxx[ 0 ].sCmn.TargetRate_bps; encStatus->packetLossPercentage = state_Fxx[ 0 ].sCmn.PacketLoss_perc; encStatus->complexity = state_Fxx[ 0 ].sCmn.Complexity; encStatus->useInBandFEC = state_Fxx[ 0 ].sCmn.useInBandFEC; encStatus->useDTX = state_Fxx[ 0 ].sCmn.useDTX; encStatus->useCBR = state_Fxx[ 0 ].sCmn.useCBR; encStatus->internalSampleRate = silk_SMULBB( state_Fxx[ 0 ].sCmn.fs_kHz, 1000 ); encStatus->allowBandwidthSwitch = state_Fxx[ 0 ].sCmn.allow_bandwidth_switch; encStatus->inWBmodeWithoutVariableLP = state_Fxx[ 0 ].sCmn.fs_kHz == 16 && state_Fxx[ 0 ].sCmn.sLP.mode == 0; return ret; } /**************************/ /* Encode frame with Silk */ /**************************/ /* Note: if prefillFlag is set, the input must contain 10 ms of audio, irrespective of what */ /* encControl->payloadSize_ms is set to */ opus_int silk_Encode( /* O Returns error code */ void *encState, /* I/O State */ silk_EncControlStruct *encControl, /* I Control status */ const opus_int16 *samplesIn, /* I Speech sample input vector */ opus_int nSamplesIn, /* I Number of samples in input vector */ ec_enc *psRangeEnc, /* I/O Compressor data structure */ opus_int32 *nBytesOut, /* I/O Number of bytes in payload (input: Max bytes) */ const opus_int prefillFlag /* I Flag to indicate prefilling buffers no coding */ ) { opus_int n, i, nBits, flags, tmp_payloadSize_ms = 0, tmp_complexity = 0, ret = 0; opus_int nSamplesToBuffer, nSamplesToBufferMax, nBlocksOf10ms; opus_int nSamplesFromInput = 0, nSamplesFromInputMax; opus_int speech_act_thr_for_switch_Q8; opus_int32 TargetRate_bps, MStargetRates_bps[ 2 ], channelRate_bps, LBRR_symbol, sum; silk_encoder *psEnc = ( silk_encoder * )encState; VARDECL( opus_int16, buf ); opus_int transition, curr_block, tot_blocks; SAVE_STACK; if (encControl->reducedDependency) { psEnc->state_Fxx[0].sCmn.first_frame_after_reset = 1; psEnc->state_Fxx[1].sCmn.first_frame_after_reset = 1; } psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded = psEnc->state_Fxx[ 1 ].sCmn.nFramesEncoded = 0; /* Check values in encoder control structure */ if( ( ret = check_control_input( encControl ) ) != 0 ) { silk_assert( 0 ); RESTORE_STACK; return ret; } encControl->switchReady = 0; if( encControl->nChannelsInternal > psEnc->nChannelsInternal ) { /* Mono -> Stereo transition: init state of second channel and stereo state */ ret += silk_init_encoder( &psEnc->state_Fxx[ 1 ], psEnc->state_Fxx[ 0 ].sCmn.arch ); silk_memset( psEnc->sStereo.pred_prev_Q13, 0, sizeof( psEnc->sStereo.pred_prev_Q13 ) ); silk_memset( psEnc->sStereo.sSide, 0, sizeof( psEnc->sStereo.sSide ) ); psEnc->sStereo.mid_side_amp_Q0[ 0 ] = 0; psEnc->sStereo.mid_side_amp_Q0[ 1 ] = 1; psEnc->sStereo.mid_side_amp_Q0[ 2 ] = 0; psEnc->sStereo.mid_side_amp_Q0[ 3 ] = 1; psEnc->sStereo.width_prev_Q14 = 0; psEnc->sStereo.smth_width_Q14 = SILK_FIX_CONST( 1, 14 ); if( psEnc->nChannelsAPI == 2 ) { silk_memcpy( &psEnc->state_Fxx[ 1 ].sCmn.resampler_state, &psEnc->state_Fxx[ 0 ].sCmn.resampler_state, sizeof( silk_resampler_state_struct ) ); silk_memcpy( &psEnc->state_Fxx[ 1 ].sCmn.In_HP_State, &psEnc->state_Fxx[ 0 ].sCmn.In_HP_State, sizeof( psEnc->state_Fxx[ 1 ].sCmn.In_HP_State ) ); } } transition = (encControl->payloadSize_ms != psEnc->state_Fxx[ 0 ].sCmn.PacketSize_ms) || (psEnc->nChannelsInternal != encControl->nChannelsInternal); psEnc->nChannelsAPI = encControl->nChannelsAPI; psEnc->nChannelsInternal = encControl->nChannelsInternal; nBlocksOf10ms = silk_DIV32( 100 * nSamplesIn, encControl->API_sampleRate ); tot_blocks = ( nBlocksOf10ms > 1 ) ? nBlocksOf10ms >> 1 : 1; curr_block = 0; if( prefillFlag ) { /* Only accept input length of 10 ms */ if( nBlocksOf10ms != 1 ) { silk_assert( 0 ); RESTORE_STACK; return SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES; } /* Reset Encoder */ for( n = 0; n < encControl->nChannelsInternal; n++ ) { ret = silk_init_encoder( &psEnc->state_Fxx[ n ], psEnc->state_Fxx[ n ].sCmn.arch ); silk_assert( !ret ); } tmp_payloadSize_ms = encControl->payloadSize_ms; encControl->payloadSize_ms = 10; tmp_complexity = encControl->complexity; encControl->complexity = 0; for( n = 0; n < encControl->nChannelsInternal; n++ ) { psEnc->state_Fxx[ n ].sCmn.controlled_since_last_payload = 0; psEnc->state_Fxx[ n ].sCmn.prefillFlag = 1; } } else { /* Only accept input lengths that are a multiple of 10 ms */ if( nBlocksOf10ms * encControl->API_sampleRate != 100 * nSamplesIn || nSamplesIn < 0 ) { silk_assert( 0 ); RESTORE_STACK; return SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES; } /* Make sure no more than one packet can be produced */ if( 1000 * (opus_int32)nSamplesIn > encControl->payloadSize_ms * encControl->API_sampleRate ) { silk_assert( 0 ); RESTORE_STACK; return SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES; } } for( n = 0; n < encControl->nChannelsInternal; n++ ) { /* Force the side channel to the same rate as the mid */ opus_int force_fs_kHz = (n==1) ? psEnc->state_Fxx[0].sCmn.fs_kHz : 0; if( ( ret = silk_control_encoder( &psEnc->state_Fxx[ n ], encControl, psEnc->allowBandwidthSwitch, n, force_fs_kHz ) ) != 0 ) { silk_assert( 0 ); RESTORE_STACK; return ret; } if( psEnc->state_Fxx[n].sCmn.first_frame_after_reset || transition ) { for( i = 0; i < psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket; i++ ) { psEnc->state_Fxx[ n ].sCmn.LBRR_flags[ i ] = 0; } } psEnc->state_Fxx[ n ].sCmn.inDTX = psEnc->state_Fxx[ n ].sCmn.useDTX; } silk_assert( encControl->nChannelsInternal == 1 || psEnc->state_Fxx[ 0 ].sCmn.fs_kHz == psEnc->state_Fxx[ 1 ].sCmn.fs_kHz ); /* Input buffering/resampling and encoding */ nSamplesToBufferMax = 10 * nBlocksOf10ms * psEnc->state_Fxx[ 0 ].sCmn.fs_kHz; nSamplesFromInputMax = silk_DIV32_16( nSamplesToBufferMax * psEnc->state_Fxx[ 0 ].sCmn.API_fs_Hz, psEnc->state_Fxx[ 0 ].sCmn.fs_kHz * 1000 ); ALLOC( buf, nSamplesFromInputMax, opus_int16 ); while( 1 ) { nSamplesToBuffer = psEnc->state_Fxx[ 0 ].sCmn.frame_length - psEnc->state_Fxx[ 0 ].sCmn.inputBufIx; nSamplesToBuffer = silk_min( nSamplesToBuffer, nSamplesToBufferMax ); nSamplesFromInput = silk_DIV32_16( nSamplesToBuffer * psEnc->state_Fxx[ 0 ].sCmn.API_fs_Hz, psEnc->state_Fxx[ 0 ].sCmn.fs_kHz * 1000 ); /* Resample and write to buffer */ if( encControl->nChannelsAPI == 2 && encControl->nChannelsInternal == 2 ) { opus_int id = psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded; for( n = 0; n < nSamplesFromInput; n++ ) { buf[ n ] = samplesIn[ 2 * n ]; } /* Making sure to start both resamplers from the same state when switching from mono to stereo */ if( psEnc->nPrevChannelsInternal == 1 && id==0 ) { silk_memcpy( &psEnc->state_Fxx[ 1 ].sCmn.resampler_state, &psEnc->state_Fxx[ 0 ].sCmn.resampler_state, sizeof(psEnc->state_Fxx[ 1 ].sCmn.resampler_state)); } ret += silk_resampler( &psEnc->state_Fxx[ 0 ].sCmn.resampler_state, &psEnc->state_Fxx[ 0 ].sCmn.inputBuf[ psEnc->state_Fxx[ 0 ].sCmn.inputBufIx + 2 ], buf, nSamplesFromInput ); psEnc->state_Fxx[ 0 ].sCmn.inputBufIx += nSamplesToBuffer; nSamplesToBuffer = psEnc->state_Fxx[ 1 ].sCmn.frame_length - psEnc->state_Fxx[ 1 ].sCmn.inputBufIx; nSamplesToBuffer = silk_min( nSamplesToBuffer, 10 * nBlocksOf10ms * psEnc->state_Fxx[ 1 ].sCmn.fs_kHz ); for( n = 0; n < nSamplesFromInput; n++ ) { buf[ n ] = samplesIn[ 2 * n + 1 ]; } ret += silk_resampler( &psEnc->state_Fxx[ 1 ].sCmn.resampler_state, &psEnc->state_Fxx[ 1 ].sCmn.inputBuf[ psEnc->state_Fxx[ 1 ].sCmn.inputBufIx + 2 ], buf, nSamplesFromInput ); psEnc->state_Fxx[ 1 ].sCmn.inputBufIx += nSamplesToBuffer; } else if( encControl->nChannelsAPI == 2 && encControl->nChannelsInternal == 1 ) { /* Combine left and right channels before resampling */ for( n = 0; n < nSamplesFromInput; n++ ) { sum = samplesIn[ 2 * n ] + samplesIn[ 2 * n + 1 ]; buf[ n ] = (opus_int16)silk_RSHIFT_ROUND( sum, 1 ); } ret += silk_resampler( &psEnc->state_Fxx[ 0 ].sCmn.resampler_state, &psEnc->state_Fxx[ 0 ].sCmn.inputBuf[ psEnc->state_Fxx[ 0 ].sCmn.inputBufIx + 2 ], buf, nSamplesFromInput ); /* On the first mono frame, average the results for the two resampler states */ if( psEnc->nPrevChannelsInternal == 2 && psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded == 0 ) { ret += silk_resampler( &psEnc->state_Fxx[ 1 ].sCmn.resampler_state, &psEnc->state_Fxx[ 1 ].sCmn.inputBuf[ psEnc->state_Fxx[ 1 ].sCmn.inputBufIx + 2 ], buf, nSamplesFromInput ); for( n = 0; n < psEnc->state_Fxx[ 0 ].sCmn.frame_length; n++ ) { psEnc->state_Fxx[ 0 ].sCmn.inputBuf[ psEnc->state_Fxx[ 0 ].sCmn.inputBufIx+n+2 ] = silk_RSHIFT(psEnc->state_Fxx[ 0 ].sCmn.inputBuf[ psEnc->state_Fxx[ 0 ].sCmn.inputBufIx+n+2 ] + psEnc->state_Fxx[ 1 ].sCmn.inputBuf[ psEnc->state_Fxx[ 1 ].sCmn.inputBufIx+n+2 ], 1); } } psEnc->state_Fxx[ 0 ].sCmn.inputBufIx += nSamplesToBuffer; } else { silk_assert( encControl->nChannelsAPI == 1 && encControl->nChannelsInternal == 1 ); silk_memcpy(buf, samplesIn, nSamplesFromInput*sizeof(opus_int16)); ret += silk_resampler( &psEnc->state_Fxx[ 0 ].sCmn.resampler_state, &psEnc->state_Fxx[ 0 ].sCmn.inputBuf[ psEnc->state_Fxx[ 0 ].sCmn.inputBufIx + 2 ], buf, nSamplesFromInput ); psEnc->state_Fxx[ 0 ].sCmn.inputBufIx += nSamplesToBuffer; } samplesIn += nSamplesFromInput * encControl->nChannelsAPI; nSamplesIn -= nSamplesFromInput; /* Default */ psEnc->allowBandwidthSwitch = 0; /* Silk encoder */ if( psEnc->state_Fxx[ 0 ].sCmn.inputBufIx >= psEnc->state_Fxx[ 0 ].sCmn.frame_length ) { /* Enough data in input buffer, so encode */ silk_assert( psEnc->state_Fxx[ 0 ].sCmn.inputBufIx == psEnc->state_Fxx[ 0 ].sCmn.frame_length ); silk_assert( encControl->nChannelsInternal == 1 || psEnc->state_Fxx[ 1 ].sCmn.inputBufIx == psEnc->state_Fxx[ 1 ].sCmn.frame_length ); /* Deal with LBRR data */ if( psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded == 0 && !prefillFlag ) { /* Create space at start of payload for VAD and FEC flags */ opus_uint8 iCDF[ 2 ] = { 0, 0 }; iCDF[ 0 ] = 256 - silk_RSHIFT( 256, ( psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket + 1 ) * encControl->nChannelsInternal ); ec_enc_icdf( psRangeEnc, 0, iCDF, 8 ); /* Encode any LBRR data from previous packet */ /* Encode LBRR flags */ for( n = 0; n < encControl->nChannelsInternal; n++ ) { LBRR_symbol = 0; for( i = 0; i < psEnc->state_Fxx[ n ].sCmn.nFramesPerPacket; i++ ) { LBRR_symbol |= silk_LSHIFT( psEnc->state_Fxx[ n ].sCmn.LBRR_flags[ i ], i ); } psEnc->state_Fxx[ n ].sCmn.LBRR_flag = LBRR_symbol > 0 ? 1 : 0; if( LBRR_symbol && psEnc->state_Fxx[ n ].sCmn.nFramesPerPacket > 1 ) { ec_enc_icdf( psRangeEnc, LBRR_symbol - 1, silk_LBRR_flags_iCDF_ptr[ psEnc->state_Fxx[ n ].sCmn.nFramesPerPacket - 2 ], 8 ); } } /* Code LBRR indices and excitation signals */ for( i = 0; i < psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket; i++ ) { for( n = 0; n < encControl->nChannelsInternal; n++ ) { if( psEnc->state_Fxx[ n ].sCmn.LBRR_flags[ i ] ) { opus_int condCoding; if( encControl->nChannelsInternal == 2 && n == 0 ) { silk_stereo_encode_pred( psRangeEnc, psEnc->sStereo.predIx[ i ] ); /* For LBRR data there's no need to code the mid-only flag if the side-channel LBRR flag is set */ if( psEnc->state_Fxx[ 1 ].sCmn.LBRR_flags[ i ] == 0 ) { silk_stereo_encode_mid_only( psRangeEnc, psEnc->sStereo.mid_only_flags[ i ] ); } } /* Use conditional coding if previous frame available */ if( i > 0 && psEnc->state_Fxx[ n ].sCmn.LBRR_flags[ i - 1 ] ) { condCoding = CODE_CONDITIONALLY; } else { condCoding = CODE_INDEPENDENTLY; } silk_encode_indices( &psEnc->state_Fxx[ n ].sCmn, psRangeEnc, i, 1, condCoding ); silk_encode_pulses( psRangeEnc, psEnc->state_Fxx[ n ].sCmn.indices_LBRR[i].signalType, psEnc->state_Fxx[ n ].sCmn.indices_LBRR[i].quantOffsetType, psEnc->state_Fxx[ n ].sCmn.pulses_LBRR[ i ], psEnc->state_Fxx[ n ].sCmn.frame_length ); } } } /* Reset LBRR flags */ for( n = 0; n < encControl->nChannelsInternal; n++ ) { silk_memset( psEnc->state_Fxx[ n ].sCmn.LBRR_flags, 0, sizeof( psEnc->state_Fxx[ n ].sCmn.LBRR_flags ) ); } psEnc->nBitsUsedLBRR = ec_tell( psRangeEnc ); } silk_HP_variable_cutoff( psEnc->state_Fxx ); /* Total target bits for packet */ nBits = silk_DIV32_16( silk_MUL( encControl->bitRate, encControl->payloadSize_ms ), 1000 ); /* Subtract bits used for LBRR */ if( !prefillFlag ) { nBits -= psEnc->nBitsUsedLBRR; } /* Divide by number of uncoded frames left in packet */ nBits = silk_DIV32_16( nBits, psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket ); /* Convert to bits/second */ if( encControl->payloadSize_ms == 10 ) { TargetRate_bps = silk_SMULBB( nBits, 100 ); } else { TargetRate_bps = silk_SMULBB( nBits, 50 ); } /* Subtract fraction of bits in excess of target in previous frames and packets */ TargetRate_bps -= silk_DIV32_16( silk_MUL( psEnc->nBitsExceeded, 1000 ), BITRESERVOIR_DECAY_TIME_MS ); if( !prefillFlag && psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded > 0 ) { /* Compare actual vs target bits so far in this packet */ opus_int32 bitsBalance = ec_tell( psRangeEnc ) - psEnc->nBitsUsedLBRR - nBits * psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded; TargetRate_bps -= silk_DIV32_16( silk_MUL( bitsBalance, 1000 ), BITRESERVOIR_DECAY_TIME_MS ); } /* Never exceed input bitrate */ TargetRate_bps = silk_LIMIT( TargetRate_bps, encControl->bitRate, 5000 ); /* Convert Left/Right to Mid/Side */ if( encControl->nChannelsInternal == 2 ) { silk_stereo_LR_to_MS( &psEnc->sStereo, &psEnc->state_Fxx[ 0 ].sCmn.inputBuf[ 2 ], &psEnc->state_Fxx[ 1 ].sCmn.inputBuf[ 2 ], psEnc->sStereo.predIx[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ], &psEnc->sStereo.mid_only_flags[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ], MStargetRates_bps, TargetRate_bps, psEnc->state_Fxx[ 0 ].sCmn.speech_activity_Q8, encControl->toMono, psEnc->state_Fxx[ 0 ].sCmn.fs_kHz, psEnc->state_Fxx[ 0 ].sCmn.frame_length ); if( psEnc->sStereo.mid_only_flags[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ] == 0 ) { /* Reset side channel encoder memory for first frame with side coding */ if( psEnc->prev_decode_only_middle == 1 ) { silk_memset( &psEnc->state_Fxx[ 1 ].sShape, 0, sizeof( psEnc->state_Fxx[ 1 ].sShape ) ); silk_memset( &psEnc->state_Fxx[ 1 ].sCmn.sNSQ, 0, sizeof( psEnc->state_Fxx[ 1 ].sCmn.sNSQ ) ); silk_memset( psEnc->state_Fxx[ 1 ].sCmn.prev_NLSFq_Q15, 0, sizeof( psEnc->state_Fxx[ 1 ].sCmn.prev_NLSFq_Q15 ) ); silk_memset( &psEnc->state_Fxx[ 1 ].sCmn.sLP.In_LP_State, 0, sizeof( psEnc->state_Fxx[ 1 ].sCmn.sLP.In_LP_State ) ); psEnc->state_Fxx[ 1 ].sCmn.prevLag = 100; psEnc->state_Fxx[ 1 ].sCmn.sNSQ.lagPrev = 100; psEnc->state_Fxx[ 1 ].sShape.LastGainIndex = 10; psEnc->state_Fxx[ 1 ].sCmn.prevSignalType = TYPE_NO_VOICE_ACTIVITY; psEnc->state_Fxx[ 1 ].sCmn.sNSQ.prev_gain_Q16 = 65536; psEnc->state_Fxx[ 1 ].sCmn.first_frame_after_reset = 1; } silk_encode_do_VAD_Fxx( &psEnc->state_Fxx[ 1 ] ); } else { psEnc->state_Fxx[ 1 ].sCmn.VAD_flags[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ] = 0; } if( !prefillFlag ) { silk_stereo_encode_pred( psRangeEnc, psEnc->sStereo.predIx[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ] ); if( psEnc->state_Fxx[ 1 ].sCmn.VAD_flags[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ] == 0 ) { silk_stereo_encode_mid_only( psRangeEnc, psEnc->sStereo.mid_only_flags[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ] ); } } } else { /* Buffering */ silk_memcpy( psEnc->state_Fxx[ 0 ].sCmn.inputBuf, psEnc->sStereo.sMid, 2 * sizeof( opus_int16 ) ); silk_memcpy( psEnc->sStereo.sMid, &psEnc->state_Fxx[ 0 ].sCmn.inputBuf[ psEnc->state_Fxx[ 0 ].sCmn.frame_length ], 2 * sizeof( opus_int16 ) ); } silk_encode_do_VAD_Fxx( &psEnc->state_Fxx[ 0 ] ); /* Encode */ for( n = 0; n < encControl->nChannelsInternal; n++ ) { opus_int maxBits, useCBR; /* Handling rate constraints */ maxBits = encControl->maxBits; if( tot_blocks == 2 && curr_block == 0 ) { maxBits = maxBits * 3 / 5; } else if( tot_blocks == 3 ) { if( curr_block == 0 ) { maxBits = maxBits * 2 / 5; } else if( curr_block == 1 ) { maxBits = maxBits * 3 / 4; } } useCBR = encControl->useCBR && curr_block == tot_blocks - 1; if( encControl->nChannelsInternal == 1 ) { channelRate_bps = TargetRate_bps; } else { channelRate_bps = MStargetRates_bps[ n ]; if( n == 0 && MStargetRates_bps[ 1 ] > 0 ) { useCBR = 0; /* Give mid up to 1/2 of the max bits for that frame */ maxBits -= encControl->maxBits / ( tot_blocks * 2 ); } } if( channelRate_bps > 0 ) { opus_int condCoding; silk_control_SNR( &psEnc->state_Fxx[ n ].sCmn, channelRate_bps ); /* Use independent coding if no previous frame available */ if( psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded - n <= 0 ) { condCoding = CODE_INDEPENDENTLY; } else if( n > 0 && psEnc->prev_decode_only_middle ) { /* If we skipped a side frame in this packet, we don't need LTP scaling; the LTP state is well-defined. */ condCoding = CODE_INDEPENDENTLY_NO_LTP_SCALING; } else { condCoding = CODE_CONDITIONALLY; } if( ( ret = silk_encode_frame_Fxx( &psEnc->state_Fxx[ n ], nBytesOut, psRangeEnc, condCoding, maxBits, useCBR ) ) != 0 ) { silk_assert( 0 ); } } psEnc->state_Fxx[ n ].sCmn.controlled_since_last_payload = 0; psEnc->state_Fxx[ n ].sCmn.inputBufIx = 0; psEnc->state_Fxx[ n ].sCmn.nFramesEncoded++; } psEnc->prev_decode_only_middle = psEnc->sStereo.mid_only_flags[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded - 1 ]; /* Insert VAD and FEC flags at beginning of bitstream */ if( *nBytesOut > 0 && psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded == psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket) { flags = 0; for( n = 0; n < encControl->nChannelsInternal; n++ ) { for( i = 0; i < psEnc->state_Fxx[ n ].sCmn.nFramesPerPacket; i++ ) { flags = silk_LSHIFT( flags, 1 ); flags |= psEnc->state_Fxx[ n ].sCmn.VAD_flags[ i ]; } flags = silk_LSHIFT( flags, 1 ); flags |= psEnc->state_Fxx[ n ].sCmn.LBRR_flag; } if( !prefillFlag ) { ec_enc_patch_initial_bits( psRangeEnc, flags, ( psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket + 1 ) * encControl->nChannelsInternal ); } /* Return zero bytes if all channels DTXed */ if( psEnc->state_Fxx[ 0 ].sCmn.inDTX && ( encControl->nChannelsInternal == 1 || psEnc->state_Fxx[ 1 ].sCmn.inDTX ) ) { *nBytesOut = 0; } psEnc->nBitsExceeded += *nBytesOut * 8; psEnc->nBitsExceeded -= silk_DIV32_16( silk_MUL( encControl->bitRate, encControl->payloadSize_ms ), 1000 ); psEnc->nBitsExceeded = silk_LIMIT( psEnc->nBitsExceeded, 0, 10000 ); /* Update flag indicating if bandwidth switching is allowed */ speech_act_thr_for_switch_Q8 = silk_SMLAWB( SILK_FIX_CONST( SPEECH_ACTIVITY_DTX_THRES, 8 ), SILK_FIX_CONST( ( 1 - SPEECH_ACTIVITY_DTX_THRES ) / MAX_BANDWIDTH_SWITCH_DELAY_MS, 16 + 8 ), psEnc->timeSinceSwitchAllowed_ms ); if( psEnc->state_Fxx[ 0 ].sCmn.speech_activity_Q8 < speech_act_thr_for_switch_Q8 ) { psEnc->allowBandwidthSwitch = 1; psEnc->timeSinceSwitchAllowed_ms = 0; } else { psEnc->allowBandwidthSwitch = 0; psEnc->timeSinceSwitchAllowed_ms += encControl->payloadSize_ms; } } if( nSamplesIn == 0 ) { break; } } else { break; } curr_block++; } psEnc->nPrevChannelsInternal = encControl->nChannelsInternal; encControl->allowBandwidthSwitch = psEnc->allowBandwidthSwitch; encControl->inWBmodeWithoutVariableLP = psEnc->state_Fxx[ 0 ].sCmn.fs_kHz == 16 && psEnc->state_Fxx[ 0 ].sCmn.sLP.mode == 0; encControl->internalSampleRate = silk_SMULBB( psEnc->state_Fxx[ 0 ].sCmn.fs_kHz, 1000 ); encControl->stereoWidth_Q14 = encControl->toMono ? 0 : psEnc->sStereo.smth_width_Q14; if( prefillFlag ) { encControl->payloadSize_ms = tmp_payloadSize_ms; encControl->complexity = tmp_complexity; for( n = 0; n < encControl->nChannelsInternal; n++ ) { psEnc->state_Fxx[ n ].sCmn.controlled_since_last_payload = 0; psEnc->state_Fxx[ n ].sCmn.prefillFlag = 0; } } encControl->signalType = psEnc->state_Fxx[0].sCmn.indices.signalType; encControl->offset = silk_Quantization_Offsets_Q10 [ psEnc->state_Fxx[0].sCmn.indices.signalType >> 1 ] [ psEnc->state_Fxx[0].sCmn.indices.quantOffsetType ]; RESTORE_STACK; return ret; } mumble-1.3.4/3rdparty/opus-src/silk/NSQ_del_dec.c0000664000175000017500000011501214010707327021372 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main.h" #include "stack_alloc.h" #include "NSQ.h" typedef struct { opus_int32 sLPC_Q14[ MAX_SUB_FRAME_LENGTH + NSQ_LPC_BUF_LENGTH ]; opus_int32 RandState[ DECISION_DELAY ]; opus_int32 Q_Q10[ DECISION_DELAY ]; opus_int32 Xq_Q14[ DECISION_DELAY ]; opus_int32 Pred_Q15[ DECISION_DELAY ]; opus_int32 Shape_Q14[ DECISION_DELAY ]; opus_int32 sAR2_Q14[ MAX_SHAPE_LPC_ORDER ]; opus_int32 LF_AR_Q14; opus_int32 Diff_Q14; opus_int32 Seed; opus_int32 SeedInit; opus_int32 RD_Q10; } NSQ_del_dec_struct; typedef struct { opus_int32 Q_Q10; opus_int32 RD_Q10; opus_int32 xq_Q14; opus_int32 LF_AR_Q14; opus_int32 Diff_Q14; opus_int32 sLTP_shp_Q14; opus_int32 LPC_exc_Q14; } NSQ_sample_struct; typedef NSQ_sample_struct NSQ_sample_pair[ 2 ]; #if defined(MIPSr1_ASM) #include "mips/NSQ_del_dec_mipsr1.h" #endif static OPUS_INLINE void silk_nsq_del_dec_scale_states( const silk_encoder_state *psEncC, /* I Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */ const opus_int16 x16[], /* I Input */ opus_int32 x_sc_Q10[], /* O Input scaled with 1/Gain in Q10 */ const opus_int16 sLTP[], /* I Re-whitened LTP state in Q0 */ opus_int32 sLTP_Q15[], /* O LTP state matching scaled input */ opus_int subfr, /* I Subframe number */ opus_int nStatesDelayedDecision, /* I Number of del dec states */ const opus_int LTP_scale_Q14, /* I LTP state scaling */ const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I */ const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag */ const opus_int signal_type, /* I Signal type */ const opus_int decisionDelay /* I Decision delay */ ); /******************************************/ /* Noise shape quantizer for one subframe */ /******************************************/ static OPUS_INLINE void silk_noise_shape_quantizer_del_dec( silk_nsq_state *NSQ, /* I/O NSQ state */ NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */ opus_int signalType, /* I Signal type */ const opus_int32 x_Q10[], /* I */ opus_int8 pulses[], /* O */ opus_int16 xq[], /* O */ opus_int32 sLTP_Q15[], /* I/O LTP filter state */ opus_int32 delayedGain_Q10[], /* I/O Gain delay buffer */ const opus_int16 a_Q12[], /* I Short term prediction coefs */ const opus_int16 b_Q14[], /* I Long term prediction coefs */ const opus_int16 AR_shp_Q13[], /* I Noise shaping coefs */ opus_int lag, /* I Pitch lag */ opus_int32 HarmShapeFIRPacked_Q14, /* I */ opus_int Tilt_Q14, /* I Spectral tilt */ opus_int32 LF_shp_Q14, /* I */ opus_int32 Gain_Q16, /* I */ opus_int Lambda_Q10, /* I */ opus_int offset_Q10, /* I */ opus_int length, /* I Input length */ opus_int subfr, /* I Subframe number */ opus_int shapingLPCOrder, /* I Shaping LPC filter order */ opus_int predictLPCOrder, /* I Prediction filter order */ opus_int warping_Q16, /* I */ opus_int nStatesDelayedDecision, /* I Number of states in decision tree */ opus_int *smpl_buf_idx, /* I/O Index to newest samples in buffers */ opus_int decisionDelay, /* I */ int arch /* I */ ); void silk_NSQ_del_dec_c( const silk_encoder_state *psEncC, /* I Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ SideInfoIndices *psIndices, /* I/O Quantization Indices */ const opus_int16 x16[], /* I Input */ opus_int8 pulses[], /* O Quantized pulse signal */ const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */ const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */ const opus_int16 AR_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */ const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */ const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */ const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I Quantization step sizes */ const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */ const opus_int Lambda_Q10, /* I Rate/distortion tradeoff */ const opus_int LTP_scale_Q14 /* I LTP state scaling */ ) { opus_int i, k, lag, start_idx, LSF_interpolation_flag, Winner_ind, subfr; opus_int last_smple_idx, smpl_buf_idx, decisionDelay; const opus_int16 *A_Q12, *B_Q14, *AR_shp_Q13; opus_int16 *pxq; VARDECL( opus_int32, sLTP_Q15 ); VARDECL( opus_int16, sLTP ); opus_int32 HarmShapeFIRPacked_Q14; opus_int offset_Q10; opus_int32 RDmin_Q10, Gain_Q10; VARDECL( opus_int32, x_sc_Q10 ); VARDECL( opus_int32, delayedGain_Q10 ); VARDECL( NSQ_del_dec_struct, psDelDec ); NSQ_del_dec_struct *psDD; SAVE_STACK; /* Set unvoiced lag to the previous one, overwrite later for voiced */ lag = NSQ->lagPrev; silk_assert( NSQ->prev_gain_Q16 != 0 ); /* Initialize delayed decision states */ ALLOC( psDelDec, psEncC->nStatesDelayedDecision, NSQ_del_dec_struct ); silk_memset( psDelDec, 0, psEncC->nStatesDelayedDecision * sizeof( NSQ_del_dec_struct ) ); for( k = 0; k < psEncC->nStatesDelayedDecision; k++ ) { psDD = &psDelDec[ k ]; psDD->Seed = ( k + psIndices->Seed ) & 3; psDD->SeedInit = psDD->Seed; psDD->RD_Q10 = 0; psDD->LF_AR_Q14 = NSQ->sLF_AR_shp_Q14; psDD->Diff_Q14 = NSQ->sDiff_shp_Q14; psDD->Shape_Q14[ 0 ] = NSQ->sLTP_shp_Q14[ psEncC->ltp_mem_length - 1 ]; silk_memcpy( psDD->sLPC_Q14, NSQ->sLPC_Q14, NSQ_LPC_BUF_LENGTH * sizeof( opus_int32 ) ); silk_memcpy( psDD->sAR2_Q14, NSQ->sAR2_Q14, sizeof( NSQ->sAR2_Q14 ) ); } offset_Q10 = silk_Quantization_Offsets_Q10[ psIndices->signalType >> 1 ][ psIndices->quantOffsetType ]; smpl_buf_idx = 0; /* index of oldest samples */ decisionDelay = silk_min_int( DECISION_DELAY, psEncC->subfr_length ); /* For voiced frames limit the decision delay to lower than the pitch lag */ if( psIndices->signalType == TYPE_VOICED ) { for( k = 0; k < psEncC->nb_subfr; k++ ) { decisionDelay = silk_min_int( decisionDelay, pitchL[ k ] - LTP_ORDER / 2 - 1 ); } } else { if( lag > 0 ) { decisionDelay = silk_min_int( decisionDelay, lag - LTP_ORDER / 2 - 1 ); } } if( psIndices->NLSFInterpCoef_Q2 == 4 ) { LSF_interpolation_flag = 0; } else { LSF_interpolation_flag = 1; } ALLOC( sLTP_Q15, psEncC->ltp_mem_length + psEncC->frame_length, opus_int32 ); ALLOC( sLTP, psEncC->ltp_mem_length + psEncC->frame_length, opus_int16 ); ALLOC( x_sc_Q10, psEncC->subfr_length, opus_int32 ); ALLOC( delayedGain_Q10, DECISION_DELAY, opus_int32 ); /* Set up pointers to start of sub frame */ pxq = &NSQ->xq[ psEncC->ltp_mem_length ]; NSQ->sLTP_shp_buf_idx = psEncC->ltp_mem_length; NSQ->sLTP_buf_idx = psEncC->ltp_mem_length; subfr = 0; for( k = 0; k < psEncC->nb_subfr; k++ ) { A_Q12 = &PredCoef_Q12[ ( ( k >> 1 ) | ( 1 - LSF_interpolation_flag ) ) * MAX_LPC_ORDER ]; B_Q14 = <PCoef_Q14[ k * LTP_ORDER ]; AR_shp_Q13 = &AR_Q13[ k * MAX_SHAPE_LPC_ORDER ]; /* Noise shape parameters */ silk_assert( HarmShapeGain_Q14[ k ] >= 0 ); HarmShapeFIRPacked_Q14 = silk_RSHIFT( HarmShapeGain_Q14[ k ], 2 ); HarmShapeFIRPacked_Q14 |= silk_LSHIFT( (opus_int32)silk_RSHIFT( HarmShapeGain_Q14[ k ], 1 ), 16 ); NSQ->rewhite_flag = 0; if( psIndices->signalType == TYPE_VOICED ) { /* Voiced */ lag = pitchL[ k ]; /* Re-whitening */ if( ( k & ( 3 - silk_LSHIFT( LSF_interpolation_flag, 1 ) ) ) == 0 ) { if( k == 2 ) { /* RESET DELAYED DECISIONS */ /* Find winner */ RDmin_Q10 = psDelDec[ 0 ].RD_Q10; Winner_ind = 0; for( i = 1; i < psEncC->nStatesDelayedDecision; i++ ) { if( psDelDec[ i ].RD_Q10 < RDmin_Q10 ) { RDmin_Q10 = psDelDec[ i ].RD_Q10; Winner_ind = i; } } for( i = 0; i < psEncC->nStatesDelayedDecision; i++ ) { if( i != Winner_ind ) { psDelDec[ i ].RD_Q10 += ( silk_int32_MAX >> 4 ); silk_assert( psDelDec[ i ].RD_Q10 >= 0 ); } } /* Copy final part of signals from winner state to output and long-term filter states */ psDD = &psDelDec[ Winner_ind ]; last_smple_idx = smpl_buf_idx + decisionDelay; for( i = 0; i < decisionDelay; i++ ) { last_smple_idx = ( last_smple_idx - 1 ) % DECISION_DELAY; if( last_smple_idx < 0 ) last_smple_idx += DECISION_DELAY; pulses[ i - decisionDelay ] = (opus_int8)silk_RSHIFT_ROUND( psDD->Q_Q10[ last_smple_idx ], 10 ); pxq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( psDD->Xq_Q14[ last_smple_idx ], Gains_Q16[ 1 ] ), 14 ) ); NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - decisionDelay + i ] = psDD->Shape_Q14[ last_smple_idx ]; } subfr = 0; } /* Rewhiten with new A coefs */ start_idx = psEncC->ltp_mem_length - lag - psEncC->predictLPCOrder - LTP_ORDER / 2; silk_assert( start_idx > 0 ); silk_LPC_analysis_filter( &sLTP[ start_idx ], &NSQ->xq[ start_idx + k * psEncC->subfr_length ], A_Q12, psEncC->ltp_mem_length - start_idx, psEncC->predictLPCOrder, psEncC->arch ); NSQ->sLTP_buf_idx = psEncC->ltp_mem_length; NSQ->rewhite_flag = 1; } } silk_nsq_del_dec_scale_states( psEncC, NSQ, psDelDec, x16, x_sc_Q10, sLTP, sLTP_Q15, k, psEncC->nStatesDelayedDecision, LTP_scale_Q14, Gains_Q16, pitchL, psIndices->signalType, decisionDelay ); silk_noise_shape_quantizer_del_dec( NSQ, psDelDec, psIndices->signalType, x_sc_Q10, pulses, pxq, sLTP_Q15, delayedGain_Q10, A_Q12, B_Q14, AR_shp_Q13, lag, HarmShapeFIRPacked_Q14, Tilt_Q14[ k ], LF_shp_Q14[ k ], Gains_Q16[ k ], Lambda_Q10, offset_Q10, psEncC->subfr_length, subfr++, psEncC->shapingLPCOrder, psEncC->predictLPCOrder, psEncC->warping_Q16, psEncC->nStatesDelayedDecision, &smpl_buf_idx, decisionDelay, psEncC->arch ); x16 += psEncC->subfr_length; pulses += psEncC->subfr_length; pxq += psEncC->subfr_length; } /* Find winner */ RDmin_Q10 = psDelDec[ 0 ].RD_Q10; Winner_ind = 0; for( k = 1; k < psEncC->nStatesDelayedDecision; k++ ) { if( psDelDec[ k ].RD_Q10 < RDmin_Q10 ) { RDmin_Q10 = psDelDec[ k ].RD_Q10; Winner_ind = k; } } /* Copy final part of signals from winner state to output and long-term filter states */ psDD = &psDelDec[ Winner_ind ]; psIndices->Seed = psDD->SeedInit; last_smple_idx = smpl_buf_idx + decisionDelay; Gain_Q10 = silk_RSHIFT32( Gains_Q16[ psEncC->nb_subfr - 1 ], 6 ); for( i = 0; i < decisionDelay; i++ ) { last_smple_idx = ( last_smple_idx - 1 ) % DECISION_DELAY; if( last_smple_idx < 0 ) last_smple_idx += DECISION_DELAY; pulses[ i - decisionDelay ] = (opus_int8)silk_RSHIFT_ROUND( psDD->Q_Q10[ last_smple_idx ], 10 ); pxq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( psDD->Xq_Q14[ last_smple_idx ], Gain_Q10 ), 8 ) ); NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - decisionDelay + i ] = psDD->Shape_Q14[ last_smple_idx ]; } silk_memcpy( NSQ->sLPC_Q14, &psDD->sLPC_Q14[ psEncC->subfr_length ], NSQ_LPC_BUF_LENGTH * sizeof( opus_int32 ) ); silk_memcpy( NSQ->sAR2_Q14, psDD->sAR2_Q14, sizeof( psDD->sAR2_Q14 ) ); /* Update states */ NSQ->sLF_AR_shp_Q14 = psDD->LF_AR_Q14; NSQ->sDiff_shp_Q14 = psDD->Diff_Q14; NSQ->lagPrev = pitchL[ psEncC->nb_subfr - 1 ]; /* Save quantized speech signal */ silk_memmove( NSQ->xq, &NSQ->xq[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int16 ) ); silk_memmove( NSQ->sLTP_shp_Q14, &NSQ->sLTP_shp_Q14[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int32 ) ); RESTORE_STACK; } /******************************************/ /* Noise shape quantizer for one subframe */ /******************************************/ #ifndef OVERRIDE_silk_noise_shape_quantizer_del_dec static OPUS_INLINE void silk_noise_shape_quantizer_del_dec( silk_nsq_state *NSQ, /* I/O NSQ state */ NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */ opus_int signalType, /* I Signal type */ const opus_int32 x_Q10[], /* I */ opus_int8 pulses[], /* O */ opus_int16 xq[], /* O */ opus_int32 sLTP_Q15[], /* I/O LTP filter state */ opus_int32 delayedGain_Q10[], /* I/O Gain delay buffer */ const opus_int16 a_Q12[], /* I Short term prediction coefs */ const opus_int16 b_Q14[], /* I Long term prediction coefs */ const opus_int16 AR_shp_Q13[], /* I Noise shaping coefs */ opus_int lag, /* I Pitch lag */ opus_int32 HarmShapeFIRPacked_Q14, /* I */ opus_int Tilt_Q14, /* I Spectral tilt */ opus_int32 LF_shp_Q14, /* I */ opus_int32 Gain_Q16, /* I */ opus_int Lambda_Q10, /* I */ opus_int offset_Q10, /* I */ opus_int length, /* I Input length */ opus_int subfr, /* I Subframe number */ opus_int shapingLPCOrder, /* I Shaping LPC filter order */ opus_int predictLPCOrder, /* I Prediction filter order */ opus_int warping_Q16, /* I */ opus_int nStatesDelayedDecision, /* I Number of states in decision tree */ opus_int *smpl_buf_idx, /* I/O Index to newest samples in buffers */ opus_int decisionDelay, /* I */ int arch /* I */ ) { opus_int i, j, k, Winner_ind, RDmin_ind, RDmax_ind, last_smple_idx; opus_int32 Winner_rand_state; opus_int32 LTP_pred_Q14, LPC_pred_Q14, n_AR_Q14, n_LTP_Q14; opus_int32 n_LF_Q14, r_Q10, rr_Q10, rd1_Q10, rd2_Q10, RDmin_Q10, RDmax_Q10; opus_int32 q1_Q0, q1_Q10, q2_Q10, exc_Q14, LPC_exc_Q14, xq_Q14, Gain_Q10; opus_int32 tmp1, tmp2, sLF_AR_shp_Q14; opus_int32 *pred_lag_ptr, *shp_lag_ptr, *psLPC_Q14; #ifdef silk_short_prediction_create_arch_coef opus_int32 a_Q12_arch[MAX_LPC_ORDER]; #endif VARDECL( NSQ_sample_pair, psSampleState ); NSQ_del_dec_struct *psDD; NSQ_sample_struct *psSS; SAVE_STACK; silk_assert( nStatesDelayedDecision > 0 ); ALLOC( psSampleState, nStatesDelayedDecision, NSQ_sample_pair ); shp_lag_ptr = &NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - lag + HARM_SHAPE_FIR_TAPS / 2 ]; pred_lag_ptr = &sLTP_Q15[ NSQ->sLTP_buf_idx - lag + LTP_ORDER / 2 ]; Gain_Q10 = silk_RSHIFT( Gain_Q16, 6 ); #ifdef silk_short_prediction_create_arch_coef silk_short_prediction_create_arch_coef(a_Q12_arch, a_Q12, predictLPCOrder); #endif for( i = 0; i < length; i++ ) { /* Perform common calculations used in all states */ /* Long-term prediction */ if( signalType == TYPE_VOICED ) { /* Unrolled loop */ /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ LTP_pred_Q14 = 2; LTP_pred_Q14 = silk_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ 0 ], b_Q14[ 0 ] ); LTP_pred_Q14 = silk_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -1 ], b_Q14[ 1 ] ); LTP_pred_Q14 = silk_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -2 ], b_Q14[ 2 ] ); LTP_pred_Q14 = silk_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -3 ], b_Q14[ 3 ] ); LTP_pred_Q14 = silk_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -4 ], b_Q14[ 4 ] ); LTP_pred_Q14 = silk_LSHIFT( LTP_pred_Q14, 1 ); /* Q13 -> Q14 */ pred_lag_ptr++; } else { LTP_pred_Q14 = 0; } /* Long-term shaping */ if( lag > 0 ) { /* Symmetric, packed FIR coefficients */ n_LTP_Q14 = silk_SMULWB( silk_ADD32( shp_lag_ptr[ 0 ], shp_lag_ptr[ -2 ] ), HarmShapeFIRPacked_Q14 ); n_LTP_Q14 = silk_SMLAWT( n_LTP_Q14, shp_lag_ptr[ -1 ], HarmShapeFIRPacked_Q14 ); n_LTP_Q14 = silk_SUB_LSHIFT32( LTP_pred_Q14, n_LTP_Q14, 2 ); /* Q12 -> Q14 */ shp_lag_ptr++; } else { n_LTP_Q14 = 0; } for( k = 0; k < nStatesDelayedDecision; k++ ) { /* Delayed decision state */ psDD = &psDelDec[ k ]; /* Sample state */ psSS = psSampleState[ k ]; /* Generate dither */ psDD->Seed = silk_RAND( psDD->Seed ); /* Pointer used in short term prediction and shaping */ psLPC_Q14 = &psDD->sLPC_Q14[ NSQ_LPC_BUF_LENGTH - 1 + i ]; /* Short-term prediction */ LPC_pred_Q14 = silk_noise_shape_quantizer_short_prediction(psLPC_Q14, a_Q12, a_Q12_arch, predictLPCOrder, arch); LPC_pred_Q14 = silk_LSHIFT( LPC_pred_Q14, 4 ); /* Q10 -> Q14 */ /* Noise shape feedback */ silk_assert( ( shapingLPCOrder & 1 ) == 0 ); /* check that order is even */ /* Output of lowpass section */ tmp2 = silk_SMLAWB( psDD->Diff_Q14, psDD->sAR2_Q14[ 0 ], warping_Q16 ); /* Output of allpass section */ tmp1 = silk_SMLAWB( psDD->sAR2_Q14[ 0 ], psDD->sAR2_Q14[ 1 ] - tmp2, warping_Q16 ); psDD->sAR2_Q14[ 0 ] = tmp2; n_AR_Q14 = silk_RSHIFT( shapingLPCOrder, 1 ); n_AR_Q14 = silk_SMLAWB( n_AR_Q14, tmp2, AR_shp_Q13[ 0 ] ); /* Loop over allpass sections */ for( j = 2; j < shapingLPCOrder; j += 2 ) { /* Output of allpass section */ tmp2 = silk_SMLAWB( psDD->sAR2_Q14[ j - 1 ], psDD->sAR2_Q14[ j + 0 ] - tmp1, warping_Q16 ); psDD->sAR2_Q14[ j - 1 ] = tmp1; n_AR_Q14 = silk_SMLAWB( n_AR_Q14, tmp1, AR_shp_Q13[ j - 1 ] ); /* Output of allpass section */ tmp1 = silk_SMLAWB( psDD->sAR2_Q14[ j + 0 ], psDD->sAR2_Q14[ j + 1 ] - tmp2, warping_Q16 ); psDD->sAR2_Q14[ j + 0 ] = tmp2; n_AR_Q14 = silk_SMLAWB( n_AR_Q14, tmp2, AR_shp_Q13[ j ] ); } psDD->sAR2_Q14[ shapingLPCOrder - 1 ] = tmp1; n_AR_Q14 = silk_SMLAWB( n_AR_Q14, tmp1, AR_shp_Q13[ shapingLPCOrder - 1 ] ); n_AR_Q14 = silk_LSHIFT( n_AR_Q14, 1 ); /* Q11 -> Q12 */ n_AR_Q14 = silk_SMLAWB( n_AR_Q14, psDD->LF_AR_Q14, Tilt_Q14 ); /* Q12 */ n_AR_Q14 = silk_LSHIFT( n_AR_Q14, 2 ); /* Q12 -> Q14 */ n_LF_Q14 = silk_SMULWB( psDD->Shape_Q14[ *smpl_buf_idx ], LF_shp_Q14 ); /* Q12 */ n_LF_Q14 = silk_SMLAWT( n_LF_Q14, psDD->LF_AR_Q14, LF_shp_Q14 ); /* Q12 */ n_LF_Q14 = silk_LSHIFT( n_LF_Q14, 2 ); /* Q12 -> Q14 */ /* Input minus prediction plus noise feedback */ /* r = x[ i ] - LTP_pred - LPC_pred + n_AR + n_Tilt + n_LF + n_LTP */ tmp1 = silk_ADD32( n_AR_Q14, n_LF_Q14 ); /* Q14 */ tmp2 = silk_ADD32( n_LTP_Q14, LPC_pred_Q14 ); /* Q13 */ tmp1 = silk_SUB32( tmp2, tmp1 ); /* Q13 */ tmp1 = silk_RSHIFT_ROUND( tmp1, 4 ); /* Q10 */ r_Q10 = silk_SUB32( x_Q10[ i ], tmp1 ); /* residual error Q10 */ /* Flip sign depending on dither */ if ( psDD->Seed < 0 ) { r_Q10 = -r_Q10; } r_Q10 = silk_LIMIT_32( r_Q10, -(31 << 10), 30 << 10 ); /* Find two quantization level candidates and measure their rate-distortion */ q1_Q10 = silk_SUB32( r_Q10, offset_Q10 ); q1_Q0 = silk_RSHIFT( q1_Q10, 10 ); if (Lambda_Q10 > 2048) { /* For aggressive RDO, the bias becomes more than one pulse. */ int rdo_offset = Lambda_Q10/2 - 512; if (q1_Q10 > rdo_offset) { q1_Q0 = silk_RSHIFT( q1_Q10 - rdo_offset, 10 ); } else if (q1_Q10 < -rdo_offset) { q1_Q0 = silk_RSHIFT( q1_Q10 + rdo_offset, 10 ); } else if (q1_Q10 < 0) { q1_Q0 = -1; } else { q1_Q0 = 0; } } if( q1_Q0 > 0 ) { q1_Q10 = silk_SUB32( silk_LSHIFT( q1_Q0, 10 ), QUANT_LEVEL_ADJUST_Q10 ); q1_Q10 = silk_ADD32( q1_Q10, offset_Q10 ); q2_Q10 = silk_ADD32( q1_Q10, 1024 ); rd1_Q10 = silk_SMULBB( q1_Q10, Lambda_Q10 ); rd2_Q10 = silk_SMULBB( q2_Q10, Lambda_Q10 ); } else if( q1_Q0 == 0 ) { q1_Q10 = offset_Q10; q2_Q10 = silk_ADD32( q1_Q10, 1024 - QUANT_LEVEL_ADJUST_Q10 ); rd1_Q10 = silk_SMULBB( q1_Q10, Lambda_Q10 ); rd2_Q10 = silk_SMULBB( q2_Q10, Lambda_Q10 ); } else if( q1_Q0 == -1 ) { q2_Q10 = offset_Q10; q1_Q10 = silk_SUB32( q2_Q10, 1024 - QUANT_LEVEL_ADJUST_Q10 ); rd1_Q10 = silk_SMULBB( -q1_Q10, Lambda_Q10 ); rd2_Q10 = silk_SMULBB( q2_Q10, Lambda_Q10 ); } else { /* q1_Q0 < -1 */ q1_Q10 = silk_ADD32( silk_LSHIFT( q1_Q0, 10 ), QUANT_LEVEL_ADJUST_Q10 ); q1_Q10 = silk_ADD32( q1_Q10, offset_Q10 ); q2_Q10 = silk_ADD32( q1_Q10, 1024 ); rd1_Q10 = silk_SMULBB( -q1_Q10, Lambda_Q10 ); rd2_Q10 = silk_SMULBB( -q2_Q10, Lambda_Q10 ); } rr_Q10 = silk_SUB32( r_Q10, q1_Q10 ); rd1_Q10 = silk_RSHIFT( silk_SMLABB( rd1_Q10, rr_Q10, rr_Q10 ), 10 ); rr_Q10 = silk_SUB32( r_Q10, q2_Q10 ); rd2_Q10 = silk_RSHIFT( silk_SMLABB( rd2_Q10, rr_Q10, rr_Q10 ), 10 ); if( rd1_Q10 < rd2_Q10 ) { psSS[ 0 ].RD_Q10 = silk_ADD32( psDD->RD_Q10, rd1_Q10 ); psSS[ 1 ].RD_Q10 = silk_ADD32( psDD->RD_Q10, rd2_Q10 ); psSS[ 0 ].Q_Q10 = q1_Q10; psSS[ 1 ].Q_Q10 = q2_Q10; } else { psSS[ 0 ].RD_Q10 = silk_ADD32( psDD->RD_Q10, rd2_Q10 ); psSS[ 1 ].RD_Q10 = silk_ADD32( psDD->RD_Q10, rd1_Q10 ); psSS[ 0 ].Q_Q10 = q2_Q10; psSS[ 1 ].Q_Q10 = q1_Q10; } /* Update states for best quantization */ /* Quantized excitation */ exc_Q14 = silk_LSHIFT32( psSS[ 0 ].Q_Q10, 4 ); if ( psDD->Seed < 0 ) { exc_Q14 = -exc_Q14; } /* Add predictions */ LPC_exc_Q14 = silk_ADD32( exc_Q14, LTP_pred_Q14 ); xq_Q14 = silk_ADD32( LPC_exc_Q14, LPC_pred_Q14 ); /* Update states */ psSS[ 0 ].Diff_Q14 = silk_SUB_LSHIFT32( xq_Q14, x_Q10[ i ], 4 ); sLF_AR_shp_Q14 = silk_SUB32( psSS[ 0 ].Diff_Q14, n_AR_Q14 ); psSS[ 0 ].sLTP_shp_Q14 = silk_SUB32( sLF_AR_shp_Q14, n_LF_Q14 ); psSS[ 0 ].LF_AR_Q14 = sLF_AR_shp_Q14; psSS[ 0 ].LPC_exc_Q14 = LPC_exc_Q14; psSS[ 0 ].xq_Q14 = xq_Q14; /* Update states for second best quantization */ /* Quantized excitation */ exc_Q14 = silk_LSHIFT32( psSS[ 1 ].Q_Q10, 4 ); if ( psDD->Seed < 0 ) { exc_Q14 = -exc_Q14; } /* Add predictions */ LPC_exc_Q14 = silk_ADD32( exc_Q14, LTP_pred_Q14 ); xq_Q14 = silk_ADD32( LPC_exc_Q14, LPC_pred_Q14 ); /* Update states */ psSS[ 1 ].Diff_Q14 = silk_SUB_LSHIFT32( xq_Q14, x_Q10[ i ], 4 ); sLF_AR_shp_Q14 = silk_SUB32( psSS[ 1 ].Diff_Q14, n_AR_Q14 ); psSS[ 1 ].sLTP_shp_Q14 = silk_SUB32( sLF_AR_shp_Q14, n_LF_Q14 ); psSS[ 1 ].LF_AR_Q14 = sLF_AR_shp_Q14; psSS[ 1 ].LPC_exc_Q14 = LPC_exc_Q14; psSS[ 1 ].xq_Q14 = xq_Q14; } *smpl_buf_idx = ( *smpl_buf_idx - 1 ) % DECISION_DELAY; if( *smpl_buf_idx < 0 ) *smpl_buf_idx += DECISION_DELAY; last_smple_idx = ( *smpl_buf_idx + decisionDelay ) % DECISION_DELAY; /* Find winner */ RDmin_Q10 = psSampleState[ 0 ][ 0 ].RD_Q10; Winner_ind = 0; for( k = 1; k < nStatesDelayedDecision; k++ ) { if( psSampleState[ k ][ 0 ].RD_Q10 < RDmin_Q10 ) { RDmin_Q10 = psSampleState[ k ][ 0 ].RD_Q10; Winner_ind = k; } } /* Increase RD values of expired states */ Winner_rand_state = psDelDec[ Winner_ind ].RandState[ last_smple_idx ]; for( k = 0; k < nStatesDelayedDecision; k++ ) { if( psDelDec[ k ].RandState[ last_smple_idx ] != Winner_rand_state ) { psSampleState[ k ][ 0 ].RD_Q10 = silk_ADD32( psSampleState[ k ][ 0 ].RD_Q10, silk_int32_MAX >> 4 ); psSampleState[ k ][ 1 ].RD_Q10 = silk_ADD32( psSampleState[ k ][ 1 ].RD_Q10, silk_int32_MAX >> 4 ); silk_assert( psSampleState[ k ][ 0 ].RD_Q10 >= 0 ); } } /* Find worst in first set and best in second set */ RDmax_Q10 = psSampleState[ 0 ][ 0 ].RD_Q10; RDmin_Q10 = psSampleState[ 0 ][ 1 ].RD_Q10; RDmax_ind = 0; RDmin_ind = 0; for( k = 1; k < nStatesDelayedDecision; k++ ) { /* find worst in first set */ if( psSampleState[ k ][ 0 ].RD_Q10 > RDmax_Q10 ) { RDmax_Q10 = psSampleState[ k ][ 0 ].RD_Q10; RDmax_ind = k; } /* find best in second set */ if( psSampleState[ k ][ 1 ].RD_Q10 < RDmin_Q10 ) { RDmin_Q10 = psSampleState[ k ][ 1 ].RD_Q10; RDmin_ind = k; } } /* Replace a state if best from second set outperforms worst in first set */ if( RDmin_Q10 < RDmax_Q10 ) { silk_memcpy( ( (opus_int32 *)&psDelDec[ RDmax_ind ] ) + i, ( (opus_int32 *)&psDelDec[ RDmin_ind ] ) + i, sizeof( NSQ_del_dec_struct ) - i * sizeof( opus_int32) ); silk_memcpy( &psSampleState[ RDmax_ind ][ 0 ], &psSampleState[ RDmin_ind ][ 1 ], sizeof( NSQ_sample_struct ) ); } /* Write samples from winner to output and long-term filter states */ psDD = &psDelDec[ Winner_ind ]; if( subfr > 0 || i >= decisionDelay ) { pulses[ i - decisionDelay ] = (opus_int8)silk_RSHIFT_ROUND( psDD->Q_Q10[ last_smple_idx ], 10 ); xq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( psDD->Xq_Q14[ last_smple_idx ], delayedGain_Q10[ last_smple_idx ] ), 8 ) ); NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - decisionDelay ] = psDD->Shape_Q14[ last_smple_idx ]; sLTP_Q15[ NSQ->sLTP_buf_idx - decisionDelay ] = psDD->Pred_Q15[ last_smple_idx ]; } NSQ->sLTP_shp_buf_idx++; NSQ->sLTP_buf_idx++; /* Update states */ for( k = 0; k < nStatesDelayedDecision; k++ ) { psDD = &psDelDec[ k ]; psSS = &psSampleState[ k ][ 0 ]; psDD->LF_AR_Q14 = psSS->LF_AR_Q14; psDD->Diff_Q14 = psSS->Diff_Q14; psDD->sLPC_Q14[ NSQ_LPC_BUF_LENGTH + i ] = psSS->xq_Q14; psDD->Xq_Q14[ *smpl_buf_idx ] = psSS->xq_Q14; psDD->Q_Q10[ *smpl_buf_idx ] = psSS->Q_Q10; psDD->Pred_Q15[ *smpl_buf_idx ] = silk_LSHIFT32( psSS->LPC_exc_Q14, 1 ); psDD->Shape_Q14[ *smpl_buf_idx ] = psSS->sLTP_shp_Q14; psDD->Seed = silk_ADD32_ovflw( psDD->Seed, silk_RSHIFT_ROUND( psSS->Q_Q10, 10 ) ); psDD->RandState[ *smpl_buf_idx ] = psDD->Seed; psDD->RD_Q10 = psSS->RD_Q10; } delayedGain_Q10[ *smpl_buf_idx ] = Gain_Q10; } /* Update LPC states */ for( k = 0; k < nStatesDelayedDecision; k++ ) { psDD = &psDelDec[ k ]; silk_memcpy( psDD->sLPC_Q14, &psDD->sLPC_Q14[ length ], NSQ_LPC_BUF_LENGTH * sizeof( opus_int32 ) ); } RESTORE_STACK; } #endif /* OVERRIDE_silk_noise_shape_quantizer_del_dec */ static OPUS_INLINE void silk_nsq_del_dec_scale_states( const silk_encoder_state *psEncC, /* I Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */ const opus_int16 x16[], /* I Input */ opus_int32 x_sc_Q10[], /* O Input scaled with 1/Gain in Q10 */ const opus_int16 sLTP[], /* I Re-whitened LTP state in Q0 */ opus_int32 sLTP_Q15[], /* O LTP state matching scaled input */ opus_int subfr, /* I Subframe number */ opus_int nStatesDelayedDecision, /* I Number of del dec states */ const opus_int LTP_scale_Q14, /* I LTP state scaling */ const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I */ const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag */ const opus_int signal_type, /* I Signal type */ const opus_int decisionDelay /* I Decision delay */ ) { opus_int i, k, lag; opus_int32 gain_adj_Q16, inv_gain_Q31, inv_gain_Q26; NSQ_del_dec_struct *psDD; lag = pitchL[ subfr ]; inv_gain_Q31 = silk_INVERSE32_varQ( silk_max( Gains_Q16[ subfr ], 1 ), 47 ); silk_assert( inv_gain_Q31 != 0 ); /* Scale input */ inv_gain_Q26 = silk_RSHIFT_ROUND( inv_gain_Q31, 5 ); for( i = 0; i < psEncC->subfr_length; i++ ) { x_sc_Q10[ i ] = silk_SMULWW( x16[ i ], inv_gain_Q26 ); } /* After rewhitening the LTP state is un-scaled, so scale with inv_gain_Q16 */ if( NSQ->rewhite_flag ) { if( subfr == 0 ) { /* Do LTP downscaling */ inv_gain_Q31 = silk_LSHIFT( silk_SMULWB( inv_gain_Q31, LTP_scale_Q14 ), 2 ); } for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx; i++ ) { silk_assert( i < MAX_FRAME_LENGTH ); sLTP_Q15[ i ] = silk_SMULWB( inv_gain_Q31, sLTP[ i ] ); } } /* Adjust for changing gain */ if( Gains_Q16[ subfr ] != NSQ->prev_gain_Q16 ) { gain_adj_Q16 = silk_DIV32_varQ( NSQ->prev_gain_Q16, Gains_Q16[ subfr ], 16 ); /* Scale long-term shaping state */ for( i = NSQ->sLTP_shp_buf_idx - psEncC->ltp_mem_length; i < NSQ->sLTP_shp_buf_idx; i++ ) { NSQ->sLTP_shp_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sLTP_shp_Q14[ i ] ); } /* Scale long-term prediction state */ if( signal_type == TYPE_VOICED && NSQ->rewhite_flag == 0 ) { for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx - decisionDelay; i++ ) { sLTP_Q15[ i ] = silk_SMULWW( gain_adj_Q16, sLTP_Q15[ i ] ); } } for( k = 0; k < nStatesDelayedDecision; k++ ) { psDD = &psDelDec[ k ]; /* Scale scalar states */ psDD->LF_AR_Q14 = silk_SMULWW( gain_adj_Q16, psDD->LF_AR_Q14 ); psDD->Diff_Q14 = silk_SMULWW( gain_adj_Q16, psDD->Diff_Q14 ); /* Scale short-term prediction and shaping states */ for( i = 0; i < NSQ_LPC_BUF_LENGTH; i++ ) { psDD->sLPC_Q14[ i ] = silk_SMULWW( gain_adj_Q16, psDD->sLPC_Q14[ i ] ); } for( i = 0; i < MAX_SHAPE_LPC_ORDER; i++ ) { psDD->sAR2_Q14[ i ] = silk_SMULWW( gain_adj_Q16, psDD->sAR2_Q14[ i ] ); } for( i = 0; i < DECISION_DELAY; i++ ) { psDD->Pred_Q15[ i ] = silk_SMULWW( gain_adj_Q16, psDD->Pred_Q15[ i ] ); psDD->Shape_Q14[ i ] = silk_SMULWW( gain_adj_Q16, psDD->Shape_Q14[ i ] ); } } /* Save inverse gain */ NSQ->prev_gain_Q16 = Gains_Q16[ subfr ]; } } mumble-1.3.4/3rdparty/opus-src/silk/LPC_analysis_filter.c0000664000175000017500000001162714010707327023167 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "SigProc_FIX.h" #include "celt_lpc.h" /*******************************************/ /* LPC analysis filter */ /* NB! State is kept internally and the */ /* filter always starts with zero state */ /* first d output samples are set to zero */ /*******************************************/ /* OPT: Using celt_fir() for this function should be faster, but it may cause integer overflows in intermediate values (not final results), which the current implementation silences by casting to unsigned. Enabling this should be safe in pretty much all cases, even though it is not technically C89-compliant. */ #define USE_CELT_FIR 0 void silk_LPC_analysis_filter( opus_int16 *out, /* O Output signal */ const opus_int16 *in, /* I Input signal */ const opus_int16 *B, /* I MA prediction coefficients, Q12 [order] */ const opus_int32 len, /* I Signal length */ const opus_int32 d, /* I Filter order */ int arch /* I Run-time architecture */ ) { opus_int j; #if defined(FIXED_POINT) && USE_CELT_FIR opus_int16 num[SILK_MAX_ORDER_LPC]; #else int ix; opus_int32 out32_Q12, out32; const opus_int16 *in_ptr; #endif silk_assert( d >= 6 ); silk_assert( (d & 1) == 0 ); silk_assert( d <= len ); #if defined(FIXED_POINT) && USE_CELT_FIR silk_assert( d <= SILK_MAX_ORDER_LPC ); for ( j = 0; j < d; j++ ) { num[ j ] = -B[ j ]; } celt_fir( in + d, num, out + d, len - d, d, arch ); for ( j = 0; j < d; j++ ) { out[ j ] = 0; } #else (void)arch; for( ix = d; ix < len; ix++ ) { in_ptr = &in[ ix - 1 ]; out32_Q12 = silk_SMULBB( in_ptr[ 0 ], B[ 0 ] ); /* Allowing wrap around so that two wraps can cancel each other. The rare cases where the result wraps around can only be triggered by invalid streams*/ out32_Q12 = silk_SMLABB_ovflw( out32_Q12, in_ptr[ -1 ], B[ 1 ] ); out32_Q12 = silk_SMLABB_ovflw( out32_Q12, in_ptr[ -2 ], B[ 2 ] ); out32_Q12 = silk_SMLABB_ovflw( out32_Q12, in_ptr[ -3 ], B[ 3 ] ); out32_Q12 = silk_SMLABB_ovflw( out32_Q12, in_ptr[ -4 ], B[ 4 ] ); out32_Q12 = silk_SMLABB_ovflw( out32_Q12, in_ptr[ -5 ], B[ 5 ] ); for( j = 6; j < d; j += 2 ) { out32_Q12 = silk_SMLABB_ovflw( out32_Q12, in_ptr[ -j ], B[ j ] ); out32_Q12 = silk_SMLABB_ovflw( out32_Q12, in_ptr[ -j - 1 ], B[ j + 1 ] ); } /* Subtract prediction */ out32_Q12 = silk_SUB32_ovflw( silk_LSHIFT( (opus_int32)in_ptr[ 1 ], 12 ), out32_Q12 ); /* Scale to Q0 */ out32 = silk_RSHIFT_ROUND( out32_Q12, 12 ); /* Saturate output */ out[ ix ] = (opus_int16)silk_SAT16( out32 ); } /* Set first d output samples to zero */ silk_memset( out, 0, d * sizeof( opus_int16 ) ); #endif } mumble-1.3.4/3rdparty/opus-src/silk/process_NLSFs.c0000664000175000017500000001250714010707327021762 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main.h" /* Limit, stabilize, convert and quantize NLSFs */ void silk_process_NLSFs( silk_encoder_state *psEncC, /* I/O Encoder state */ opus_int16 PredCoef_Q12[ 2 ][ MAX_LPC_ORDER ], /* O Prediction coefficients */ opus_int16 pNLSF_Q15[ MAX_LPC_ORDER ], /* I/O Normalized LSFs (quant out) (0 - (2^15-1)) */ const opus_int16 prev_NLSFq_Q15[ MAX_LPC_ORDER ] /* I Previous Normalized LSFs (0 - (2^15-1)) */ ) { opus_int i, doInterpolate; opus_int NLSF_mu_Q20; opus_int16 i_sqr_Q15; opus_int16 pNLSF0_temp_Q15[ MAX_LPC_ORDER ]; opus_int16 pNLSFW_QW[ MAX_LPC_ORDER ]; opus_int16 pNLSFW0_temp_QW[ MAX_LPC_ORDER ]; silk_assert( psEncC->speech_activity_Q8 >= 0 ); silk_assert( psEncC->speech_activity_Q8 <= SILK_FIX_CONST( 1.0, 8 ) ); silk_assert( psEncC->useInterpolatedNLSFs == 1 || psEncC->indices.NLSFInterpCoef_Q2 == ( 1 << 2 ) ); /***********************/ /* Calculate mu values */ /***********************/ /* NLSF_mu = 0.003 - 0.0015 * psEnc->speech_activity; */ NLSF_mu_Q20 = silk_SMLAWB( SILK_FIX_CONST( 0.003, 20 ), SILK_FIX_CONST( -0.001, 28 ), psEncC->speech_activity_Q8 ); if( psEncC->nb_subfr == 2 ) { /* Multiply by 1.5 for 10 ms packets */ NLSF_mu_Q20 = silk_ADD_RSHIFT( NLSF_mu_Q20, NLSF_mu_Q20, 1 ); } silk_assert( NLSF_mu_Q20 > 0 ); silk_assert( NLSF_mu_Q20 <= SILK_FIX_CONST( 0.005, 20 ) ); /* Calculate NLSF weights */ silk_NLSF_VQ_weights_laroia( pNLSFW_QW, pNLSF_Q15, psEncC->predictLPCOrder ); /* Update NLSF weights for interpolated NLSFs */ doInterpolate = ( psEncC->useInterpolatedNLSFs == 1 ) && ( psEncC->indices.NLSFInterpCoef_Q2 < 4 ); if( doInterpolate ) { /* Calculate the interpolated NLSF vector for the first half */ silk_interpolate( pNLSF0_temp_Q15, prev_NLSFq_Q15, pNLSF_Q15, psEncC->indices.NLSFInterpCoef_Q2, psEncC->predictLPCOrder ); /* Calculate first half NLSF weights for the interpolated NLSFs */ silk_NLSF_VQ_weights_laroia( pNLSFW0_temp_QW, pNLSF0_temp_Q15, psEncC->predictLPCOrder ); /* Update NLSF weights with contribution from first half */ i_sqr_Q15 = silk_LSHIFT( silk_SMULBB( psEncC->indices.NLSFInterpCoef_Q2, psEncC->indices.NLSFInterpCoef_Q2 ), 11 ); for( i = 0; i < psEncC->predictLPCOrder; i++ ) { pNLSFW_QW[ i ] = silk_ADD16( silk_RSHIFT( pNLSFW_QW[ i ], 1 ), silk_RSHIFT( silk_SMULBB( pNLSFW0_temp_QW[ i ], i_sqr_Q15 ), 16) ); silk_assert( pNLSFW_QW[ i ] >= 1 ); } } silk_NLSF_encode( psEncC->indices.NLSFIndices, pNLSF_Q15, psEncC->psNLSF_CB, pNLSFW_QW, NLSF_mu_Q20, psEncC->NLSF_MSVQ_Survivors, psEncC->indices.signalType ); /* Convert quantized NLSFs back to LPC coefficients */ silk_NLSF2A( PredCoef_Q12[ 1 ], pNLSF_Q15, psEncC->predictLPCOrder, psEncC->arch ); if( doInterpolate ) { /* Calculate the interpolated, quantized LSF vector for the first half */ silk_interpolate( pNLSF0_temp_Q15, prev_NLSFq_Q15, pNLSF_Q15, psEncC->indices.NLSFInterpCoef_Q2, psEncC->predictLPCOrder ); /* Convert back to LPC coefficients */ silk_NLSF2A( PredCoef_Q12[ 0 ], pNLSF0_temp_Q15, psEncC->predictLPCOrder, psEncC->arch ); } else { /* Copy LPC coefficients for first half from second half */ silk_assert( psEncC->predictLPCOrder <= MAX_LPC_ORDER ); silk_memcpy( PredCoef_Q12[ 0 ], PredCoef_Q12[ 1 ], psEncC->predictLPCOrder * sizeof( opus_int16 ) ); } } mumble-1.3.4/3rdparty/opus-src/silk/structs.h0000664000175000017500000005103214010707327021007 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef SILK_STRUCTS_H #define SILK_STRUCTS_H #include "typedef.h" #include "SigProc_FIX.h" #include "define.h" #include "entenc.h" #include "entdec.h" #ifdef __cplusplus extern "C" { #endif /************************************/ /* Noise shaping quantization state */ /************************************/ typedef struct { opus_int16 xq[ 2 * MAX_FRAME_LENGTH ]; /* Buffer for quantized output signal */ opus_int32 sLTP_shp_Q14[ 2 * MAX_FRAME_LENGTH ]; opus_int32 sLPC_Q14[ MAX_SUB_FRAME_LENGTH + NSQ_LPC_BUF_LENGTH ]; opus_int32 sAR2_Q14[ MAX_SHAPE_LPC_ORDER ]; opus_int32 sLF_AR_shp_Q14; opus_int32 sDiff_shp_Q14; opus_int lagPrev; opus_int sLTP_buf_idx; opus_int sLTP_shp_buf_idx; opus_int32 rand_seed; opus_int32 prev_gain_Q16; opus_int rewhite_flag; } silk_nsq_state; /********************************/ /* VAD state */ /********************************/ typedef struct { opus_int32 AnaState[ 2 ]; /* Analysis filterbank state: 0-8 kHz */ opus_int32 AnaState1[ 2 ]; /* Analysis filterbank state: 0-4 kHz */ opus_int32 AnaState2[ 2 ]; /* Analysis filterbank state: 0-2 kHz */ opus_int32 XnrgSubfr[ VAD_N_BANDS ]; /* Subframe energies */ opus_int32 NrgRatioSmth_Q8[ VAD_N_BANDS ]; /* Smoothed energy level in each band */ opus_int16 HPstate; /* State of differentiator in the lowest band */ opus_int32 NL[ VAD_N_BANDS ]; /* Noise energy level in each band */ opus_int32 inv_NL[ VAD_N_BANDS ]; /* Inverse noise energy level in each band */ opus_int32 NoiseLevelBias[ VAD_N_BANDS ]; /* Noise level estimator bias/offset */ opus_int32 counter; /* Frame counter used in the initial phase */ } silk_VAD_state; /* Variable cut-off low-pass filter state */ typedef struct { opus_int32 In_LP_State[ 2 ]; /* Low pass filter state */ opus_int32 transition_frame_no; /* Counter which is mapped to a cut-off frequency */ opus_int mode; /* Operating mode, <0: switch down, >0: switch up; 0: do nothing */ } silk_LP_state; /* Structure containing NLSF codebook */ typedef struct { const opus_int16 nVectors; const opus_int16 order; const opus_int16 quantStepSize_Q16; const opus_int16 invQuantStepSize_Q6; const opus_uint8 *CB1_NLSF_Q8; const opus_int16 *CB1_Wght_Q9; const opus_uint8 *CB1_iCDF; const opus_uint8 *pred_Q8; const opus_uint8 *ec_sel; const opus_uint8 *ec_iCDF; const opus_uint8 *ec_Rates_Q5; const opus_int16 *deltaMin_Q15; } silk_NLSF_CB_struct; typedef struct { opus_int16 pred_prev_Q13[ 2 ]; opus_int16 sMid[ 2 ]; opus_int16 sSide[ 2 ]; opus_int32 mid_side_amp_Q0[ 4 ]; opus_int16 smth_width_Q14; opus_int16 width_prev_Q14; opus_int16 silent_side_len; opus_int8 predIx[ MAX_FRAMES_PER_PACKET ][ 2 ][ 3 ]; opus_int8 mid_only_flags[ MAX_FRAMES_PER_PACKET ]; } stereo_enc_state; typedef struct { opus_int16 pred_prev_Q13[ 2 ]; opus_int16 sMid[ 2 ]; opus_int16 sSide[ 2 ]; } stereo_dec_state; typedef struct { opus_int8 GainsIndices[ MAX_NB_SUBFR ]; opus_int8 LTPIndex[ MAX_NB_SUBFR ]; opus_int8 NLSFIndices[ MAX_LPC_ORDER + 1 ]; opus_int16 lagIndex; opus_int8 contourIndex; opus_int8 signalType; opus_int8 quantOffsetType; opus_int8 NLSFInterpCoef_Q2; opus_int8 PERIndex; opus_int8 LTP_scaleIndex; opus_int8 Seed; } SideInfoIndices; /********************************/ /* Encoder state */ /********************************/ typedef struct { opus_int32 In_HP_State[ 2 ]; /* High pass filter state */ opus_int32 variable_HP_smth1_Q15; /* State of first smoother */ opus_int32 variable_HP_smth2_Q15; /* State of second smoother */ silk_LP_state sLP; /* Low pass filter state */ silk_VAD_state sVAD; /* Voice activity detector state */ silk_nsq_state sNSQ; /* Noise Shape Quantizer State */ opus_int16 prev_NLSFq_Q15[ MAX_LPC_ORDER ]; /* Previously quantized NLSF vector */ opus_int speech_activity_Q8; /* Speech activity */ opus_int allow_bandwidth_switch; /* Flag indicating that switching of internal bandwidth is allowed */ opus_int8 LBRRprevLastGainIndex; opus_int8 prevSignalType; opus_int prevLag; opus_int pitch_LPC_win_length; opus_int max_pitch_lag; /* Highest possible pitch lag (samples) */ opus_int32 API_fs_Hz; /* API sampling frequency (Hz) */ opus_int32 prev_API_fs_Hz; /* Previous API sampling frequency (Hz) */ opus_int maxInternal_fs_Hz; /* Maximum internal sampling frequency (Hz) */ opus_int minInternal_fs_Hz; /* Minimum internal sampling frequency (Hz) */ opus_int desiredInternal_fs_Hz; /* Soft request for internal sampling frequency (Hz) */ opus_int fs_kHz; /* Internal sampling frequency (kHz) */ opus_int nb_subfr; /* Number of 5 ms subframes in a frame */ opus_int frame_length; /* Frame length (samples) */ opus_int subfr_length; /* Subframe length (samples) */ opus_int ltp_mem_length; /* Length of LTP memory */ opus_int la_pitch; /* Look-ahead for pitch analysis (samples) */ opus_int la_shape; /* Look-ahead for noise shape analysis (samples) */ opus_int shapeWinLength; /* Window length for noise shape analysis (samples) */ opus_int32 TargetRate_bps; /* Target bitrate (bps) */ opus_int PacketSize_ms; /* Number of milliseconds to put in each packet */ opus_int PacketLoss_perc; /* Packet loss rate measured by farend */ opus_int32 frameCounter; opus_int Complexity; /* Complexity setting */ opus_int nStatesDelayedDecision; /* Number of states in delayed decision quantization */ opus_int useInterpolatedNLSFs; /* Flag for using NLSF interpolation */ opus_int shapingLPCOrder; /* Filter order for noise shaping filters */ opus_int predictLPCOrder; /* Filter order for prediction filters */ opus_int pitchEstimationComplexity; /* Complexity level for pitch estimator */ opus_int pitchEstimationLPCOrder; /* Whitening filter order for pitch estimator */ opus_int32 pitchEstimationThreshold_Q16; /* Threshold for pitch estimator */ opus_int32 sum_log_gain_Q7; /* Cumulative max prediction gain */ opus_int NLSF_MSVQ_Survivors; /* Number of survivors in NLSF MSVQ */ opus_int first_frame_after_reset; /* Flag for deactivating NLSF interpolation, pitch prediction */ opus_int controlled_since_last_payload; /* Flag for ensuring codec_control only runs once per packet */ opus_int warping_Q16; /* Warping parameter for warped noise shaping */ opus_int useCBR; /* Flag to enable constant bitrate */ opus_int prefillFlag; /* Flag to indicate that only buffers are prefilled, no coding */ const opus_uint8 *pitch_lag_low_bits_iCDF; /* Pointer to iCDF table for low bits of pitch lag index */ const opus_uint8 *pitch_contour_iCDF; /* Pointer to iCDF table for pitch contour index */ const silk_NLSF_CB_struct *psNLSF_CB; /* Pointer to NLSF codebook */ opus_int input_quality_bands_Q15[ VAD_N_BANDS ]; opus_int input_tilt_Q15; opus_int SNR_dB_Q7; /* Quality setting */ opus_int8 VAD_flags[ MAX_FRAMES_PER_PACKET ]; opus_int8 LBRR_flag; opus_int LBRR_flags[ MAX_FRAMES_PER_PACKET ]; SideInfoIndices indices; opus_int8 pulses[ MAX_FRAME_LENGTH ]; int arch; /* Input/output buffering */ opus_int16 inputBuf[ MAX_FRAME_LENGTH + 2 ]; /* Buffer containing input signal */ opus_int inputBufIx; opus_int nFramesPerPacket; opus_int nFramesEncoded; /* Number of frames analyzed in current packet */ opus_int nChannelsAPI; opus_int nChannelsInternal; opus_int channelNb; /* Parameters For LTP scaling Control */ opus_int frames_since_onset; /* Specifically for entropy coding */ opus_int ec_prevSignalType; opus_int16 ec_prevLagIndex; silk_resampler_state_struct resampler_state; /* DTX */ opus_int useDTX; /* Flag to enable DTX */ opus_int inDTX; /* Flag to signal DTX period */ opus_int noSpeechCounter; /* Counts concecutive nonactive frames, used by DTX */ /* Inband Low Bitrate Redundancy (LBRR) data */ opus_int useInBandFEC; /* Saves the API setting for query */ opus_int LBRR_enabled; /* Depends on useInBandFRC, bitrate and packet loss rate */ opus_int LBRR_GainIncreases; /* Gains increment for coding LBRR frames */ SideInfoIndices indices_LBRR[ MAX_FRAMES_PER_PACKET ]; opus_int8 pulses_LBRR[ MAX_FRAMES_PER_PACKET ][ MAX_FRAME_LENGTH ]; } silk_encoder_state; /* Struct for Packet Loss Concealment */ typedef struct { opus_int32 pitchL_Q8; /* Pitch lag to use for voiced concealment */ opus_int16 LTPCoef_Q14[ LTP_ORDER ]; /* LTP coeficients to use for voiced concealment */ opus_int16 prevLPC_Q12[ MAX_LPC_ORDER ]; opus_int last_frame_lost; /* Was previous frame lost */ opus_int32 rand_seed; /* Seed for unvoiced signal generation */ opus_int16 randScale_Q14; /* Scaling of unvoiced random signal */ opus_int32 conc_energy; opus_int conc_energy_shift; opus_int16 prevLTP_scale_Q14; opus_int32 prevGain_Q16[ 2 ]; opus_int fs_kHz; opus_int nb_subfr; opus_int subfr_length; } silk_PLC_struct; /* Struct for CNG */ typedef struct { opus_int32 CNG_exc_buf_Q14[ MAX_FRAME_LENGTH ]; opus_int16 CNG_smth_NLSF_Q15[ MAX_LPC_ORDER ]; opus_int32 CNG_synth_state[ MAX_LPC_ORDER ]; opus_int32 CNG_smth_Gain_Q16; opus_int32 rand_seed; opus_int fs_kHz; } silk_CNG_struct; /********************************/ /* Decoder state */ /********************************/ typedef struct { opus_int32 prev_gain_Q16; opus_int32 exc_Q14[ MAX_FRAME_LENGTH ]; opus_int32 sLPC_Q14_buf[ MAX_LPC_ORDER ]; opus_int16 outBuf[ MAX_FRAME_LENGTH + 2 * MAX_SUB_FRAME_LENGTH ]; /* Buffer for output signal */ opus_int lagPrev; /* Previous Lag */ opus_int8 LastGainIndex; /* Previous gain index */ opus_int fs_kHz; /* Sampling frequency in kHz */ opus_int32 fs_API_hz; /* API sample frequency (Hz) */ opus_int nb_subfr; /* Number of 5 ms subframes in a frame */ opus_int frame_length; /* Frame length (samples) */ opus_int subfr_length; /* Subframe length (samples) */ opus_int ltp_mem_length; /* Length of LTP memory */ opus_int LPC_order; /* LPC order */ opus_int16 prevNLSF_Q15[ MAX_LPC_ORDER ]; /* Used to interpolate LSFs */ opus_int first_frame_after_reset; /* Flag for deactivating NLSF interpolation */ const opus_uint8 *pitch_lag_low_bits_iCDF; /* Pointer to iCDF table for low bits of pitch lag index */ const opus_uint8 *pitch_contour_iCDF; /* Pointer to iCDF table for pitch contour index */ /* For buffering payload in case of more frames per packet */ opus_int nFramesDecoded; opus_int nFramesPerPacket; /* Specifically for entropy coding */ opus_int ec_prevSignalType; opus_int16 ec_prevLagIndex; opus_int VAD_flags[ MAX_FRAMES_PER_PACKET ]; opus_int LBRR_flag; opus_int LBRR_flags[ MAX_FRAMES_PER_PACKET ]; silk_resampler_state_struct resampler_state; const silk_NLSF_CB_struct *psNLSF_CB; /* Pointer to NLSF codebook */ /* Quantization indices */ SideInfoIndices indices; /* CNG state */ silk_CNG_struct sCNG; /* Stuff used for PLC */ opus_int lossCnt; opus_int prevSignalType; int arch; silk_PLC_struct sPLC; } silk_decoder_state; /************************/ /* Decoder control */ /************************/ typedef struct { /* Prediction and coding parameters */ opus_int pitchL[ MAX_NB_SUBFR ]; opus_int32 Gains_Q16[ MAX_NB_SUBFR ]; /* Holds interpolated and final coefficients, 4-byte aligned */ silk_DWORD_ALIGN opus_int16 PredCoef_Q12[ 2 ][ MAX_LPC_ORDER ]; opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ]; opus_int LTP_scale_Q14; } silk_decoder_control; #ifdef __cplusplus } #endif #endif mumble-1.3.4/3rdparty/opus-src/silk/errors.h0000664000175000017500000000707014010707327020617 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef SILK_ERRORS_H #define SILK_ERRORS_H #ifdef __cplusplus extern "C" { #endif /******************/ /* Error messages */ /******************/ #define SILK_NO_ERROR 0 /**************************/ /* Encoder error messages */ /**************************/ /* Input length is not a multiple of 10 ms, or length is longer than the packet length */ #define SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES -101 /* Sampling frequency not 8000, 12000 or 16000 Hertz */ #define SILK_ENC_FS_NOT_SUPPORTED -102 /* Packet size not 10, 20, 40, or 60 ms */ #define SILK_ENC_PACKET_SIZE_NOT_SUPPORTED -103 /* Allocated payload buffer too short */ #define SILK_ENC_PAYLOAD_BUF_TOO_SHORT -104 /* Loss rate not between 0 and 100 percent */ #define SILK_ENC_INVALID_LOSS_RATE -105 /* Complexity setting not valid, use 0...10 */ #define SILK_ENC_INVALID_COMPLEXITY_SETTING -106 /* Inband FEC setting not valid, use 0 or 1 */ #define SILK_ENC_INVALID_INBAND_FEC_SETTING -107 /* DTX setting not valid, use 0 or 1 */ #define SILK_ENC_INVALID_DTX_SETTING -108 /* CBR setting not valid, use 0 or 1 */ #define SILK_ENC_INVALID_CBR_SETTING -109 /* Internal encoder error */ #define SILK_ENC_INTERNAL_ERROR -110 /* Internal encoder error */ #define SILK_ENC_INVALID_NUMBER_OF_CHANNELS_ERROR -111 /**************************/ /* Decoder error messages */ /**************************/ /* Output sampling frequency lower than internal decoded sampling frequency */ #define SILK_DEC_INVALID_SAMPLING_FREQUENCY -200 /* Payload size exceeded the maximum allowed 1024 bytes */ #define SILK_DEC_PAYLOAD_TOO_LARGE -201 /* Payload has bit errors */ #define SILK_DEC_PAYLOAD_ERROR -202 /* Payload has bit errors */ #define SILK_DEC_INVALID_FRAME_SIZE -203 #ifdef __cplusplus } #endif #endif mumble-1.3.4/3rdparty/opus-src/silk/stereo_decode_pred.c0000664000175000017500000000653114010707327023115 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main.h" /* Decode mid/side predictors */ void silk_stereo_decode_pred( ec_dec *psRangeDec, /* I/O Compressor data structure */ opus_int32 pred_Q13[] /* O Predictors */ ) { opus_int n, ix[ 2 ][ 3 ]; opus_int32 low_Q13, step_Q13; /* Entropy decoding */ n = ec_dec_icdf( psRangeDec, silk_stereo_pred_joint_iCDF, 8 ); ix[ 0 ][ 2 ] = silk_DIV32_16( n, 5 ); ix[ 1 ][ 2 ] = n - 5 * ix[ 0 ][ 2 ]; for( n = 0; n < 2; n++ ) { ix[ n ][ 0 ] = ec_dec_icdf( psRangeDec, silk_uniform3_iCDF, 8 ); ix[ n ][ 1 ] = ec_dec_icdf( psRangeDec, silk_uniform5_iCDF, 8 ); } /* Dequantize */ for( n = 0; n < 2; n++ ) { ix[ n ][ 0 ] += 3 * ix[ n ][ 2 ]; low_Q13 = silk_stereo_pred_quant_Q13[ ix[ n ][ 0 ] ]; step_Q13 = silk_SMULWB( silk_stereo_pred_quant_Q13[ ix[ n ][ 0 ] + 1 ] - low_Q13, SILK_FIX_CONST( 0.5 / STEREO_QUANT_SUB_STEPS, 16 ) ); pred_Q13[ n ] = silk_SMLABB( low_Q13, step_Q13, 2 * ix[ n ][ 1 ] + 1 ); } /* Subtract second from first predictor (helps when actually applying these) */ pred_Q13[ 0 ] -= pred_Q13[ 1 ]; } /* Decode mid-only flag */ void silk_stereo_decode_mid_only( ec_dec *psRangeDec, /* I/O Compressor data structure */ opus_int *decode_only_mid /* O Flag that only mid channel has been coded */ ) { /* Decode flag that only mid channel is coded */ *decode_only_mid = ec_dec_icdf( psRangeDec, silk_stereo_only_code_mid_iCDF, 8 ); } mumble-1.3.4/3rdparty/opus-src/silk/sigm_Q15.c0000664000175000017500000000613414010707327020663 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif /* Approximate sigmoid function */ #include "SigProc_FIX.h" /* fprintf(1, '%d, ', round(1024 * ([1 ./ (1 + exp(-(1:5))), 1] - 1 ./ (1 + exp(-(0:5)))))); */ static const opus_int32 sigm_LUT_slope_Q10[ 6 ] = { 237, 153, 73, 30, 12, 7 }; /* fprintf(1, '%d, ', round(32767 * 1 ./ (1 + exp(-(0:5))))); */ static const opus_int32 sigm_LUT_pos_Q15[ 6 ] = { 16384, 23955, 28861, 31213, 32178, 32548 }; /* fprintf(1, '%d, ', round(32767 * 1 ./ (1 + exp((0:5))))); */ static const opus_int32 sigm_LUT_neg_Q15[ 6 ] = { 16384, 8812, 3906, 1554, 589, 219 }; opus_int silk_sigm_Q15( opus_int in_Q5 /* I */ ) { opus_int ind; if( in_Q5 < 0 ) { /* Negative input */ in_Q5 = -in_Q5; if( in_Q5 >= 6 * 32 ) { return 0; /* Clip */ } else { /* Linear interpolation of look up table */ ind = silk_RSHIFT( in_Q5, 5 ); return( sigm_LUT_neg_Q15[ ind ] - silk_SMULBB( sigm_LUT_slope_Q10[ ind ], in_Q5 & 0x1F ) ); } } else { /* Positive input */ if( in_Q5 >= 6 * 32 ) { return 32767; /* clip */ } else { /* Linear interpolation of look up table */ ind = silk_RSHIFT( in_Q5, 5 ); return( sigm_LUT_pos_Q15[ ind ] + silk_SMULBB( sigm_LUT_slope_Q10[ ind ], in_Q5 & 0x1F ) ); } } } mumble-1.3.4/3rdparty/opus-src/silk/NLSF_VQ_weights_laroia.c0000664000175000017500000000754114010707327023532 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "define.h" #include "SigProc_FIX.h" /* R. Laroia, N. Phamdo and N. Farvardin, "Robust and Efficient Quantization of Speech LSP Parameters Using Structured Vector Quantization", Proc. IEEE Int. Conf. Acoust., Speech, Signal Processing, pp. 641-644, 1991. */ /* Laroia low complexity NLSF weights */ void silk_NLSF_VQ_weights_laroia( opus_int16 *pNLSFW_Q_OUT, /* O Pointer to input vector weights [D] */ const opus_int16 *pNLSF_Q15, /* I Pointer to input vector [D] */ const opus_int D /* I Input vector dimension (even) */ ) { opus_int k; opus_int32 tmp1_int, tmp2_int; silk_assert( D > 0 ); silk_assert( ( D & 1 ) == 0 ); /* First value */ tmp1_int = silk_max_int( pNLSF_Q15[ 0 ], 1 ); tmp1_int = silk_DIV32_16( (opus_int32)1 << ( 15 + NLSF_W_Q ), tmp1_int ); tmp2_int = silk_max_int( pNLSF_Q15[ 1 ] - pNLSF_Q15[ 0 ], 1 ); tmp2_int = silk_DIV32_16( (opus_int32)1 << ( 15 + NLSF_W_Q ), tmp2_int ); pNLSFW_Q_OUT[ 0 ] = (opus_int16)silk_min_int( tmp1_int + tmp2_int, silk_int16_MAX ); silk_assert( pNLSFW_Q_OUT[ 0 ] > 0 ); /* Main loop */ for( k = 1; k < D - 1; k += 2 ) { tmp1_int = silk_max_int( pNLSF_Q15[ k + 1 ] - pNLSF_Q15[ k ], 1 ); tmp1_int = silk_DIV32_16( (opus_int32)1 << ( 15 + NLSF_W_Q ), tmp1_int ); pNLSFW_Q_OUT[ k ] = (opus_int16)silk_min_int( tmp1_int + tmp2_int, silk_int16_MAX ); silk_assert( pNLSFW_Q_OUT[ k ] > 0 ); tmp2_int = silk_max_int( pNLSF_Q15[ k + 2 ] - pNLSF_Q15[ k + 1 ], 1 ); tmp2_int = silk_DIV32_16( (opus_int32)1 << ( 15 + NLSF_W_Q ), tmp2_int ); pNLSFW_Q_OUT[ k + 1 ] = (opus_int16)silk_min_int( tmp1_int + tmp2_int, silk_int16_MAX ); silk_assert( pNLSFW_Q_OUT[ k + 1 ] > 0 ); } /* Last value */ tmp1_int = silk_max_int( ( 1 << 15 ) - pNLSF_Q15[ D - 1 ], 1 ); tmp1_int = silk_DIV32_16( (opus_int32)1 << ( 15 + NLSF_W_Q ), tmp1_int ); pNLSFW_Q_OUT[ D - 1 ] = (opus_int16)silk_min_int( tmp1_int + tmp2_int, silk_int16_MAX ); silk_assert( pNLSFW_Q_OUT[ D - 1 ] > 0 ); } mumble-1.3.4/3rdparty/opus-src/silk/VQ_WMat_EC.c0000664000175000017500000001574214010707327021130 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main.h" /* Entropy constrained matrix-weighted VQ, hard-coded to 5-element vectors, for a single input data vector */ void silk_VQ_WMat_EC_c( opus_int8 *ind, /* O index of best codebook vector */ opus_int32 *res_nrg_Q15, /* O best residual energy */ opus_int32 *rate_dist_Q8, /* O best total bitrate */ opus_int *gain_Q7, /* O sum of absolute LTP coefficients */ const opus_int32 *XX_Q17, /* I correlation matrix */ const opus_int32 *xX_Q17, /* I correlation vector */ const opus_int8 *cb_Q7, /* I codebook */ const opus_uint8 *cb_gain_Q7, /* I codebook effective gain */ const opus_uint8 *cl_Q5, /* I code length for each codebook vector */ const opus_int subfr_len, /* I number of samples per subframe */ const opus_int32 max_gain_Q7, /* I maximum sum of absolute LTP coefficients */ const opus_int L /* I number of vectors in codebook */ ) { opus_int k, gain_tmp_Q7; const opus_int8 *cb_row_Q7; opus_int32 neg_xX_Q24[ 5 ]; opus_int32 sum1_Q15, sum2_Q24; opus_int32 bits_res_Q8, bits_tot_Q8; /* Negate and convert to new Q domain */ neg_xX_Q24[ 0 ] = -silk_LSHIFT32( xX_Q17[ 0 ], 7 ); neg_xX_Q24[ 1 ] = -silk_LSHIFT32( xX_Q17[ 1 ], 7 ); neg_xX_Q24[ 2 ] = -silk_LSHIFT32( xX_Q17[ 2 ], 7 ); neg_xX_Q24[ 3 ] = -silk_LSHIFT32( xX_Q17[ 3 ], 7 ); neg_xX_Q24[ 4 ] = -silk_LSHIFT32( xX_Q17[ 4 ], 7 ); /* Loop over codebook */ *rate_dist_Q8 = silk_int32_MAX; *res_nrg_Q15 = silk_int32_MAX; cb_row_Q7 = cb_Q7; /* In things go really bad, at least *ind is set to something safe. */ *ind = 0; for( k = 0; k < L; k++ ) { opus_int32 penalty; gain_tmp_Q7 = cb_gain_Q7[k]; /* Weighted rate */ /* Quantization error: 1 - 2 * xX * cb + cb' * XX * cb */ sum1_Q15 = SILK_FIX_CONST( 1.001, 15 ); /* Penalty for too large gain */ penalty = silk_LSHIFT32( silk_max( silk_SUB32( gain_tmp_Q7, max_gain_Q7 ), 0 ), 11 ); /* first row of XX_Q17 */ sum2_Q24 = silk_MLA( neg_xX_Q24[ 0 ], XX_Q17[ 1 ], cb_row_Q7[ 1 ] ); sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 2 ], cb_row_Q7[ 2 ] ); sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 3 ], cb_row_Q7[ 3 ] ); sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 4 ], cb_row_Q7[ 4 ] ); sum2_Q24 = silk_LSHIFT32( sum2_Q24, 1 ); sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 0 ], cb_row_Q7[ 0 ] ); sum1_Q15 = silk_SMLAWB( sum1_Q15, sum2_Q24, cb_row_Q7[ 0 ] ); /* second row of XX_Q17 */ sum2_Q24 = silk_MLA( neg_xX_Q24[ 1 ], XX_Q17[ 7 ], cb_row_Q7[ 2 ] ); sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 8 ], cb_row_Q7[ 3 ] ); sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 9 ], cb_row_Q7[ 4 ] ); sum2_Q24 = silk_LSHIFT32( sum2_Q24, 1 ); sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 6 ], cb_row_Q7[ 1 ] ); sum1_Q15 = silk_SMLAWB( sum1_Q15, sum2_Q24, cb_row_Q7[ 1 ] ); /* third row of XX_Q17 */ sum2_Q24 = silk_MLA( neg_xX_Q24[ 2 ], XX_Q17[ 13 ], cb_row_Q7[ 3 ] ); sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 14 ], cb_row_Q7[ 4 ] ); sum2_Q24 = silk_LSHIFT32( sum2_Q24, 1 ); sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 12 ], cb_row_Q7[ 2 ] ); sum1_Q15 = silk_SMLAWB( sum1_Q15, sum2_Q24, cb_row_Q7[ 2 ] ); /* fourth row of XX_Q17 */ sum2_Q24 = silk_MLA( neg_xX_Q24[ 3 ], XX_Q17[ 19 ], cb_row_Q7[ 4 ] ); sum2_Q24 = silk_LSHIFT32( sum2_Q24, 1 ); sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 18 ], cb_row_Q7[ 3 ] ); sum1_Q15 = silk_SMLAWB( sum1_Q15, sum2_Q24, cb_row_Q7[ 3 ] ); /* last row of XX_Q17 */ sum2_Q24 = silk_LSHIFT32( neg_xX_Q24[ 4 ], 1 ); sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 24 ], cb_row_Q7[ 4 ] ); sum1_Q15 = silk_SMLAWB( sum1_Q15, sum2_Q24, cb_row_Q7[ 4 ] ); /* find best */ if( sum1_Q15 >= 0 ) { /* Translate residual energy to bits using high-rate assumption (6 dB ==> 1 bit/sample) */ bits_res_Q8 = silk_SMULBB( subfr_len, silk_lin2log( sum1_Q15 + penalty) - (15 << 7) ); /* In the following line we reduce the codelength component by half ("-1"); seems to slghtly improve quality */ bits_tot_Q8 = silk_ADD_LSHIFT32( bits_res_Q8, cl_Q5[ k ], 3-1 ); if( bits_tot_Q8 <= *rate_dist_Q8 ) { *rate_dist_Q8 = bits_tot_Q8; *res_nrg_Q15 = sum1_Q15 + penalty; *ind = (opus_int8)k; *gain_Q7 = gain_tmp_Q7; } } /* Go to next cbk vector */ cb_row_Q7 += LTP_ORDER; } } mumble-1.3.4/3rdparty/opus-src/silk/debug.h0000664000175000017500000003124014010707327020365 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef SILK_DEBUG_H #define SILK_DEBUG_H #include "typedef.h" #include /* file writing */ #include /* strcpy, strcmp */ #ifdef __cplusplus extern "C" { #endif unsigned long GetHighResolutionTime(void); /* O time in usec*/ /* Set to 1 to enable DEBUG_STORE_DATA() macros for dumping * intermediate signals from the codec. */ #define SILK_DEBUG 0 /* Flag for using timers */ #define SILK_TIC_TOC 0 #if SILK_TIC_TOC #if (defined(_WIN32) || defined(_WINCE)) #include /* timer */ #else /* Linux or Mac*/ #include #endif /*********************************/ /* timer functions for profiling */ /*********************************/ /* example: */ /* */ /* TIC(LPC) */ /* do_LPC(in_vec, order, acoef); // do LPC analysis */ /* TOC(LPC) */ /* */ /* and call the following just before exiting (from main) */ /* */ /* silk_TimerSave("silk_TimingData.txt"); */ /* */ /* results are now in silk_TimingData.txt */ void silk_TimerSave(char *file_name); /* max number of timers (in different locations) */ #define silk_NUM_TIMERS_MAX 50 /* max length of name tags in TIC(..), TOC(..) */ #define silk_NUM_TIMERS_MAX_TAG_LEN 30 extern int silk_Timer_nTimers; extern int silk_Timer_depth_ctr; extern char silk_Timer_tags[silk_NUM_TIMERS_MAX][silk_NUM_TIMERS_MAX_TAG_LEN]; #ifdef _WIN32 extern LARGE_INTEGER silk_Timer_start[silk_NUM_TIMERS_MAX]; #else extern unsigned long silk_Timer_start[silk_NUM_TIMERS_MAX]; #endif extern unsigned int silk_Timer_cnt[silk_NUM_TIMERS_MAX]; extern opus_int64 silk_Timer_sum[silk_NUM_TIMERS_MAX]; extern opus_int64 silk_Timer_max[silk_NUM_TIMERS_MAX]; extern opus_int64 silk_Timer_min[silk_NUM_TIMERS_MAX]; extern opus_int64 silk_Timer_depth[silk_NUM_TIMERS_MAX]; /* WARNING: TIC()/TOC can measure only up to 0.1 seconds at a time */ #ifdef _WIN32 #define TIC(TAG_NAME) { \ static int init = 0; \ static int ID = -1; \ if( init == 0 ) \ { \ int k; \ init = 1; \ for( k = 0; k < silk_Timer_nTimers; k++ ) { \ if( strcmp(silk_Timer_tags[k], #TAG_NAME) == 0 ) { \ ID = k; \ break; \ } \ } \ if (ID == -1) { \ ID = silk_Timer_nTimers; \ silk_Timer_nTimers++; \ silk_Timer_depth[ID] = silk_Timer_depth_ctr; \ strcpy(silk_Timer_tags[ID], #TAG_NAME); \ silk_Timer_cnt[ID] = 0; \ silk_Timer_sum[ID] = 0; \ silk_Timer_min[ID] = 0xFFFFFFFF; \ silk_Timer_max[ID] = 0; \ } \ } \ silk_Timer_depth_ctr++; \ QueryPerformanceCounter(&silk_Timer_start[ID]); \ } #else #define TIC(TAG_NAME) { \ static int init = 0; \ static int ID = -1; \ if( init == 0 ) \ { \ int k; \ init = 1; \ for( k = 0; k < silk_Timer_nTimers; k++ ) { \ if( strcmp(silk_Timer_tags[k], #TAG_NAME) == 0 ) { \ ID = k; \ break; \ } \ } \ if (ID == -1) { \ ID = silk_Timer_nTimers; \ silk_Timer_nTimers++; \ silk_Timer_depth[ID] = silk_Timer_depth_ctr; \ strcpy(silk_Timer_tags[ID], #TAG_NAME); \ silk_Timer_cnt[ID] = 0; \ silk_Timer_sum[ID] = 0; \ silk_Timer_min[ID] = 0xFFFFFFFF; \ silk_Timer_max[ID] = 0; \ } \ } \ silk_Timer_depth_ctr++; \ silk_Timer_start[ID] = GetHighResolutionTime(); \ } #endif #ifdef _WIN32 #define TOC(TAG_NAME) { \ LARGE_INTEGER lpPerformanceCount; \ static int init = 0; \ static int ID = 0; \ if( init == 0 ) \ { \ int k; \ init = 1; \ for( k = 0; k < silk_Timer_nTimers; k++ ) { \ if( strcmp(silk_Timer_tags[k], #TAG_NAME) == 0 ) { \ ID = k; \ break; \ } \ } \ } \ QueryPerformanceCounter(&lpPerformanceCount); \ lpPerformanceCount.QuadPart -= silk_Timer_start[ID].QuadPart; \ if((lpPerformanceCount.QuadPart < 100000000) && \ (lpPerformanceCount.QuadPart >= 0)) { \ silk_Timer_cnt[ID]++; \ silk_Timer_sum[ID] += lpPerformanceCount.QuadPart; \ if( lpPerformanceCount.QuadPart > silk_Timer_max[ID] ) \ silk_Timer_max[ID] = lpPerformanceCount.QuadPart; \ if( lpPerformanceCount.QuadPart < silk_Timer_min[ID] ) \ silk_Timer_min[ID] = lpPerformanceCount.QuadPart; \ } \ silk_Timer_depth_ctr--; \ } #else #define TOC(TAG_NAME) { \ unsigned long endTime; \ static int init = 0; \ static int ID = 0; \ if( init == 0 ) \ { \ int k; \ init = 1; \ for( k = 0; k < silk_Timer_nTimers; k++ ) { \ if( strcmp(silk_Timer_tags[k], #TAG_NAME) == 0 ) { \ ID = k; \ break; \ } \ } \ } \ endTime = GetHighResolutionTime(); \ endTime -= silk_Timer_start[ID]; \ if((endTime < 100000000) && \ (endTime >= 0)) { \ silk_Timer_cnt[ID]++; \ silk_Timer_sum[ID] += endTime; \ if( endTime > silk_Timer_max[ID] ) \ silk_Timer_max[ID] = endTime; \ if( endTime < silk_Timer_min[ID] ) \ silk_Timer_min[ID] = endTime; \ } \ silk_Timer_depth_ctr--; \ } #endif #else /* SILK_TIC_TOC */ /* define macros as empty strings */ #define TIC(TAG_NAME) #define TOC(TAG_NAME) #define silk_TimerSave(FILE_NAME) #endif /* SILK_TIC_TOC */ #if SILK_DEBUG /************************************/ /* write data to file for debugging */ /************************************/ /* Example: DEBUG_STORE_DATA(testfile.pcm, &RIN[0], 160*sizeof(opus_int16)); */ #define silk_NUM_STORES_MAX 100 extern FILE *silk_debug_store_fp[ silk_NUM_STORES_MAX ]; extern int silk_debug_store_count; /* Faster way of storing the data */ #define DEBUG_STORE_DATA( FILE_NAME, DATA_PTR, N_BYTES ) { \ static opus_int init = 0, cnt = 0; \ static FILE **fp; \ if (init == 0) { \ init = 1; \ cnt = silk_debug_store_count++; \ silk_debug_store_fp[ cnt ] = fopen(#FILE_NAME, "wb"); \ } \ fwrite((DATA_PTR), (N_BYTES), 1, silk_debug_store_fp[ cnt ]); \ } /* Call this at the end of main() */ #define SILK_DEBUG_STORE_CLOSE_FILES { \ opus_int i; \ for( i = 0; i < silk_debug_store_count; i++ ) { \ fclose( silk_debug_store_fp[ i ] ); \ } \ } #else /* SILK_DEBUG */ /* define macros as empty strings */ #define DEBUG_STORE_DATA(FILE_NAME, DATA_PTR, N_BYTES) #define SILK_DEBUG_STORE_CLOSE_FILES #endif /* SILK_DEBUG */ #ifdef __cplusplus } #endif #endif /* SILK_DEBUG_H */ mumble-1.3.4/3rdparty/opus-src/silk/control_audio_bandwidth.c0000664000175000017500000001312014010707327024154 0ustar builderbuilder/*********************************************************************** Copyright (c) 2006-2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "main.h" #include "tuning_parameters.h" /* Control internal sampling rate */ opus_int silk_control_audio_bandwidth( silk_encoder_state *psEncC, /* I/O Pointer to Silk encoder state */ silk_EncControlStruct *encControl /* I Control structure */ ) { opus_int fs_kHz; opus_int32 fs_Hz; fs_kHz = psEncC->fs_kHz; fs_Hz = silk_SMULBB( fs_kHz, 1000 ); if( fs_Hz == 0 ) { /* Encoder has just been initialized */ fs_Hz = silk_min( psEncC->desiredInternal_fs_Hz, psEncC->API_fs_Hz ); fs_kHz = silk_DIV32_16( fs_Hz, 1000 ); } else if( fs_Hz > psEncC->API_fs_Hz || fs_Hz > psEncC->maxInternal_fs_Hz || fs_Hz < psEncC->minInternal_fs_Hz ) { /* Make sure internal rate is not higher than external rate or maximum allowed, or lower than minimum allowed */ fs_Hz = psEncC->API_fs_Hz; fs_Hz = silk_min( fs_Hz, psEncC->maxInternal_fs_Hz ); fs_Hz = silk_max( fs_Hz, psEncC->minInternal_fs_Hz ); fs_kHz = silk_DIV32_16( fs_Hz, 1000 ); } else { /* State machine for the internal sampling rate switching */ if( psEncC->sLP.transition_frame_no >= TRANSITION_FRAMES ) { /* Stop transition phase */ psEncC->sLP.mode = 0; } if( psEncC->allow_bandwidth_switch || encControl->opusCanSwitch ) { /* Check if we should switch down */ if( silk_SMULBB( psEncC->fs_kHz, 1000 ) > psEncC->desiredInternal_fs_Hz ) { /* Switch down */ if( psEncC->sLP.mode == 0 ) { /* New transition */ psEncC->sLP.transition_frame_no = TRANSITION_FRAMES; /* Reset transition filter state */ silk_memset( psEncC->sLP.In_LP_State, 0, sizeof( psEncC->sLP.In_LP_State ) ); } if( encControl->opusCanSwitch ) { /* Stop transition phase */ psEncC->sLP.mode = 0; /* Switch to a lower sample frequency */ fs_kHz = psEncC->fs_kHz == 16 ? 12 : 8; } else { if( psEncC->sLP.transition_frame_no <= 0 ) { encControl->switchReady = 1; /* Make room for redundancy */ encControl->maxBits -= encControl->maxBits * 5 / ( encControl->payloadSize_ms + 5 ); } else { /* Direction: down (at double speed) */ psEncC->sLP.mode = -2; } } } else /* Check if we should switch up */ if( silk_SMULBB( psEncC->fs_kHz, 1000 ) < psEncC->desiredInternal_fs_Hz ) { /* Switch up */ if( encControl->opusCanSwitch ) { /* Switch to a higher sample frequency */ fs_kHz = psEncC->fs_kHz == 8 ? 12 : 16; /* New transition */ psEncC->sLP.transition_frame_no = 0; /* Reset transition filter state */ silk_memset( psEncC->sLP.In_LP_State, 0, sizeof( psEncC->sLP.In_LP_State ) ); /* Direction: up */ psEncC->sLP.mode = 1; } else { if( psEncC->sLP.mode == 0 ) { encControl->switchReady = 1; /* Make room for redundancy */ encControl->maxBits -= encControl->maxBits * 5 / ( encControl->payloadSize_ms + 5 ); } else { /* Direction: up */ psEncC->sLP.mode = 1; } } } else { if (psEncC->sLP.mode<0) psEncC->sLP.mode = 1; } } } return fs_kHz; } mumble-1.3.4/3rdparty/opus-src/releases.sha20000664000175000017500000001234014010707327020546 0ustar builderbuilderb2f75c4ac5ab837845eb028413fae2a28754bfb0a6d76416e2af1441ef447649 opus-0.9.0.tar.gz 4e379a98ba95bbbfe9087ef10fdd05c8ac9060b6d695f587ea82a7b43a0df4fe opus-0.9.10.tar.gz b1cad6846a8f819a141009fe3f8f10c946e8eff7e9c2339cd517bb136cc59eae opus-0.9.14.tar.gz 206221afc47b87496588013bd4523e1e9f556336c0813f4372773fc536dd4293 opus-0.9.1.tar.gz 6e85c1b57e1d7b7dfe2928bf92586b96b73a9067e054ede45bd8e6d24bd30582 opus-0.9.2.tar.gz d916e34c18a396eb7dffc47af754f441af52a290b761e20db9aedb65928c699e opus-0.9.3.tar.gz 53801066fa97329768e7b871fd1495740269ec46802e1c9051aa7e78c6edee5b opus-0.9.5.tar.gz 3bfaeb25f4b4a625a0bc994d6fc6f6776a05193f60099e0a99f7530c6b256309 opus-0.9.6.tar.gz 1b69772c31c5cbaa43d1dfa5b1c495fc29712e8e0ff69d6f8ad46459e5c6715f opus-0.9.7.tar.gz 4aa30d2e0652ffb4a7a22cc8a29c4ce78267626f560a2d9213b1d2d4e618cf36 opus-0.9.8.tar.gz 2f62359f09151fa3b242040dc9b4c5b6bda15557c5daea59c8420f1a2ff328b7 opus-0.9.9.tar.gz 43bcea51afa531f32a6a5fdd9cba4bd496993e26a141217db3cccce6caa7cd74 opus-1.0.0-rc.tar.gz 9250fcc74472d45c1e14745542ec9c8d09982538aefed56962495614be3e0d2d opus-1.0.0.tar.gz 76bc0a31502a51dae9ab737b4db043b9ecfcd0b5861f0bfda41b662bd5b92227 opus-1.0.1-rc2.tar.gz 3de8d6809dac38971ebb305532d4ea532519d3bed08985f25d6c557f9ce5e8ff opus-1.0.1-rc3.tar.gz 8044397a6365a07117b08cbe8f9818bf7c93746908806ba74a2917187bbdda5f opus-1.0.1-rc.tar.gz 80fa5c3caf2ac0fd68f8a22cce1564fc46b368c773a17554887d0066fe1841ef opus-1.0.1.tar.gz da615edbee5d019c1833071d69a4782c19f178cf9ca1401375036ecef25cd78a opus-1.0.2.tar.gz 191a089c92dbc403de6980463dd3604b65beb12d283c607e246c8076363cb49c opus-1.0.3.tar.gz a8d40efe87f6c3e76725391457d46277878c7a816ae1642843261463133fa5c8 opus-1.1-alpha.tar.gz ec1784287f385aef994b64734aaecae04860e61aa50fc6eef6643fa7e40dd193 opus-1.1-beta.tar.gz 8aa16360f59a94d3e38f38f28d24039f7663179682cbae82aa42f1dd9e52e6ed opus-1.1-rc.tar.gz ebc87a086d4fe677c5e42d56888b1fd25af858e4179eae4f8656270410dffac3 opus-1.1-rc2.tar.gz cbfd09c58cc10a4d3fcb727ad5d46d7bb549f8185ac922ee28b4581b52a7bee9 opus-1.1-rc3.tar.gz b9727015a58affcf3db527322bf8c4d2fcf39f5f6b8f15dbceca20206cbe1d95 opus-1.1.tar.gz 0c668639dcd16b14709fc9dc49e6686606f5a256f2eaa1ebaa2f39a66f8626cd opus-1.1.1-beta.tar.gz 66f2a5877c8803dc9a5a44b4f3d0bdc8f06bd066324222d144eb255612b68152 opus-1.1.1-rc.tar.gz 9b84ff56bd7720d5554103c557664efac2b8b18acc4bbcc234cb881ab9a3371e opus-1.1.1.tar.gz 0e290078e31211baa7b5886bcc8ab6bc048b9fc83882532da4a1a45e58e907fd opus-1.1.2.tar.gz 58b6fe802e7e30182e95d0cde890c0ace40b6f125cffc50635f0ad2eef69b633 opus-1.1.3.tar.gz 9122b6b380081dd2665189f97bfd777f04f92dc3ab6698eea1dbb27ad59d8692 opus-1.1.4.tar.gz eb84981ca0f40a3e5d5e58d2e8582cb2fee05a022825a6dfe14d14b04eb563e4 opus-1.1.5.tar.gz 654a9bebb73266271a28edcfff431e4cfd9bfcde71f42849a0cdd73bece803a7 opus-1.2-alpha.tar.gz c0e90507259cf21ce7b2c82fb9ac55367d8543dae91cc3d4d2c59afd37f44023 opus-1.2-alpha2.tar.gz 291e979a8a2fb679ed35a5dff5d761a9d9a5e22586fd07934ed94461e2636c7a opus-1.2-beta.tar.gz 85343fdaed96529d94c1e1f3a210fa51240d04ca62fa01e97ef02f88020c2ce9 opus-1.2-rc1.tar.gz 77db45a87b51578fbc49555ef1b10926179861d854eb2613207dc79d9ec0a9a9 opus-1.2.tar.gz 94ac78ca4f74c4e43bc9fe4ec1ad0aa36f38ab90f45b0727c40dd1e96096e767 opus_testvectors-draft11.tar.gz 94ac78ca4f74c4e43bc9fe4ec1ad0aa36f38ab90f45b0727c40dd1e96096e767 opus_testvectors.tar.gz 5d2b99757bcb628bab2611f3ed27af6f35276ce3abc96c0ed4399d6c6463dda5 opus-tools-0.1.2.tar.gz 008317297d6ce84f84992abf8cc948a048a4fa135e1d1caf429fafde8965a792 opus-tools-0.1.3.tar.gz de80485c5afa1fd83c0e16a0dd4860470c872997a7dd0a58e99b2ee8a93e5168 opus-tools-0.1.4.tar.gz 76678d0eb7a9b3d793bd0243f9ced9ab0ecdab263f5232ed940c8f5795fb0405 opus-tools-0.1.5.tar.gz cc86dbc2a4d76da7e1ed9afee85448c8f798c465a5412233f178783220f3a2c1 opus-tools-0.1.6.tar.gz e0f08d301555dffc417604269b5a85d2bd197f259c7d6c957f370ffd33d6d9cd opus-tools-0.1.7.tar.gz e4e188579ea1c4e4d5066460d4a7214a7eafe3539e9a4466fdc98af41ba4a2f6 opus-tools-0.1.8.tar.gz b1873dd78c7fbc98cf65d6e10cfddb5c2c03b3af93f922139a2104baedb4643a opus-tools-0.1.9.tar.gz a2357532d19471b70666e0e0ec17d514246d8b3cb2eb168f68bb0f6fd372b28c opus-tools-0.1.10.tar.gz bd6d14e8897a2f80065ef34a516c70e74f8e00060abdbc238e79e5f99bca3e96 libopusenc-0.1.tar.gz 8071b968475c1a17f54b6840d6de9d9ee20f930e827b0401abe3c4cf4f3bf30a opusfile-0.1.tar.gz b4a678b3b6c4adfb6aff1f67ef658becfe146ea7c7ff228e99543762171557f9 opusfile-0.2.tar.gz 4248927f2c4e316ea5b84fb02bd100bfec8fa4624a6910d77f0af7f0c6cb8baa opusfile-0.3.tar.gz 9836ea11706c44f36de92c4c9b1248e03a4c521e7fb2cff18a0cb4f8b0e79140 opusfile-0.4.tar.gz f187906b1b35f7f0d7de6a759b4aab512a9279d23adb35d8009e7e33bd6a922a opusfile-0.4.zip 2ce52d006aeeec9f10260dbe3073c4636954a1ab19c82b8baafefe0180aa4a39 opusfile-0.5.tar.gz b940d62beb15b5974764574b9f265481fe5b6ee16902fb705727546caf956261 opusfile-0.5.zip 2428717b356e139f18ed2fdb5ad990b5654a238907a0058200b39c46a7d03ea6 opusfile-0.6.tar.gz 753339225193df605372944889023b9b3c5378d672e8784d69fa241cd465278c opusfile-0.6.zip 9e2bed13bc729058591a0f1cab2505e8cfd8e7ac460bf10a78bcc3b125e7c301 opusfile-0.7.tar.gz 346967d7989bb83b05949483b76bd0f69a12c59bd8b4457e864902b52bb0ac34 opusfile-0.7.zip 2c231ed3cfaa1b3173f52d740e5bbd77d51b9dfecb87014b404917fba4b855a4 opusfile-0.8.tar.gz 89dff4342c3b789574cbea5c57f11b96d4ebe4d28ab90248c1783ea569b1e9e3 opusfile-0.8.zip mumble-1.3.4/3rdparty/opus-src/ChangeLog0000664000175000017500000000000014010707326017723 0ustar builderbuildermumble-1.3.4/3rdparty/opus-src/doc/0000775000175000017500000000000014010707327016731 5ustar builderbuildermumble-1.3.4/3rdparty/opus-src/doc/opus_logo.svg0000664000175000017500000002072414010707327021465 0ustar builderbuilder mumble-1.3.4/3rdparty/opus-src/doc/release.txt0000664000175000017500000000260014010707327021110 0ustar builderbuilder= Release checklist = == Source release == - Check for uncommitted changes to master. - Update OPUS_LT_* API versioning in configure.ac. - Tag the release commit with 'git tag -s vN.M'. - Include release notes in the tag annotation. - Verify 'make distcheck' produces a tarball with the desired name. - Push tag to public repo. - Upload source package 'opus-${version}.tar.gz' - Add to https://svn.xiph.org/releases/opus/ - Update checksum files - svn commit - Copy to archive.mozilla.org/pub/opus/ - Update checksum files there as well. - Add release notes to https://git.xiph.org/opus-website.git - Update links and checksums on the downloads page. - Add a copy of the documentation to and update the links. - Update /topic in #opus IRC channel. Releases are commited to https://svn.xiph.org/releases/opus/ which propagates to downloads.xiph.org, and copied manually to https://archive.mozilla.org/pub/opus/ Website updates are committed to https://git.xiph.org/opus-website.git which propagates to https://opus-codec.org/ == Binary release == We usually build opus-tools binaries for MacOS and Windows. Binary releases are copied manually to https://archive.mozilla.org/pub/opus/win32/ For Mac, submit a pull request to homebrew. == Website updates == For major releases, recreate the files on https://opus-codec.org/examples/ with the next encoder. mumble-1.3.4/3rdparty/opus-src/doc/draft-ietf-payload-rtp-opus.xml0000664000175000017500000012404214010707327024721 0ustar builderbuilder ]> RTP Payload Format for the Opus Speech and Audio Codec
    jspittka@gmail.com
    vocTone
    koenvos74@gmail.com
    Mozilla
    331 E. Evelyn Avenue Mountain View CA 94041 USA jmvalin@jmvalin.ca
    This document defines the Real-time Transport Protocol (RTP) payload format for packetization of Opus encoded speech and audio data necessary to integrate the codec in the most compatible way. It also provides an applicability statement for the use of Opus over RTP. Further, it describes media type registrations for the RTP payload format.
    Opus is a speech and audio codec developed within the IETF Internet Wideband Audio Codec working group. The codec has a very low algorithmic delay and it is highly scalable in terms of audio bandwidth, bitrate, and complexity. Further, it provides different modes to efficiently encode speech signals as well as music signals, thus making it the codec of choice for various applications using the Internet or similar networks. This document defines the Real-time Transport Protocol (RTP) payload format for packetization of Opus encoded speech and audio data necessary to integrate Opus in the most compatible way. It also provides an applicability statement for the use of Opus over RTP. Further, it describes media type registrations for the RTP payload format.
    The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in . The range of audio frequecies being coded Constant bitrate Central Processing Unit Discontinuous transmission Forward error correction Internet Protocol Speech or audio samples (per channel) Session Description Protocol Variable bitrate Throughout this document, we refer to the following definitions: Abbreviation Name Audio Bandwidth (Hz) Sampling Rate (Hz) NB Narrowband 0 - 4000 8000 MB Mediumband 0 - 6000 12000 WB Wideband 0 - 8000 16000 SWB Super-wideband 0 - 12000 24000 FB Fullband 0 - 20000 48000 Audio bandwidth naming
    Opus encodes speech signals as well as general audio signals. Two different modes can be chosen, a voice mode or an audio mode, to allow the most efficient coding depending on the type of the input signal, the sampling frequency of the input signal, and the intended application. The voice mode allows efficient encoding of voice signals at lower bit rates while the audio mode is optimized for general audio signals at medium and higher bitrates. Opus is highly scalable in terms of audio bandwidth, bitrate, and complexity. Further, Opus allows transmitting stereo signals with in-band signaling in the bit-stream.
    Opus supports bitrates from 6 kb/s to 510 kb/s. The bitrate can be changed dynamically within that range. All other parameters being equal, higher bitrates result in higher audio quality.
    For a frame size of 20 ms, these are the bitrate "sweet spots" for Opus in various configurations: 8-12 kb/s for NB speech, 16-20 kb/s for WB speech, 28-40 kb/s for FB speech, 48-64 kb/s for FB mono music, and 64-128 kb/s for FB stereo music.
    For the same average bitrate, variable bitrate (VBR) can achieve higher audio quality than constant bitrate (CBR). For the majority of voice transmission applications, VBR is the best choice. One reason for choosing CBR is the potential information leak that might occur when encrypting the compressed stream. See for guidelines on when VBR is appropriate for encrypted audio communications. In the case where an existing VBR stream needs to be converted to CBR for security reasons, then the Opus padding mechanism described in is the RECOMMENDED way to achieve padding because the RTP padding bit is unencrypted. The bitrate can be adjusted at any point in time. To avoid congestion, the average bitrate SHOULD NOT exceed the available network bandwidth. If no target bitrate is specified, the bitrates specified in are RECOMMENDED.
    Opus can, as described in , be operated with a variable bitrate. In that case, the encoder will automatically reduce the bitrate for certain input signals, like periods of silence. When using continuous transmission, it will reduce the bitrate when the characteristics of the input signal permit, but will never interrupt the transmission to the receiver. Therefore, the received signal will maintain the same high level of audio quality over the full duration of a transmission while minimizing the average bit rate over time. In cases where the bitrate of Opus needs to be reduced even further or in cases where only constant bitrate is available, the Opus encoder can use discontinuous transmission (DTX), where parts of the encoded signal that correspond to periods of silence in the input speech or audio signal are not transmitted to the receiver. A receiver can distinguish between DTX and packet loss by looking for gaps in the sequence number, as described by Section 4.1 of . On the receiving side, the non-transmitted parts will be handled by a frame loss concealment unit in the Opus decoder which generates a comfort noise signal to replace the non transmitted parts of the speech or audio signal. Use of Comfort Noise (CN) with Opus is discouraged. The transmitter MUST drop whole frames only, based on the size of the last transmitted frame, to ensure successive RTP timestamps differ by a multiple of 120 and to allow the receiver to use whole frames for concealment. DTX can be used with both variable and constant bitrate. It will have a slightly lower speech or audio quality than continuous transmission. Therefore, using continuous transmission is RECOMMENDED unless constraints on available network bandwidth are severe.
    Complexity of the encoder can be scaled to optimize for CPU resources in real-time, mostly as a trade-off between audio quality and bitrate. Also, different modes of Opus have different complexity.
    The voice mode of Opus allows for embedding "in-band" forward error correction (FEC) data into the Opus bit stream. This FEC scheme adds redundant information about the previous packet (N-1) to the current output packet N. For each frame, the encoder decides whether to use FEC based on (1) an externally-provided estimate of the channel's packet loss rate; (2) an externally-provided estimate of the channel's capacity; (3) the sensitivity of the audio or speech signal to packet loss; (4) whether the receiving decoder has indicated it can take advantage of "in-band" FEC information. The decision to send "in-band" FEC information is entirely controlled by the encoder and therefore no special precautions for the payload have to be taken. On the receiving side, the decoder can take advantage of this additional information when it loses a packet and the next packet is available. In order to use the FEC data, the jitter buffer needs to provide access to payloads with the FEC data. Instead of performing loss concealment for a missing packet, the receiver can then configure its decoder to decode the FEC data from the next packet. Any compliant Opus decoder is capable of ignoring FEC information when it is not needed, so encoding with FEC cannot cause interoperability problems. However, if FEC cannot be used on the receiving side, then FEC SHOULD NOT be used, as it leads to an inefficient usage of network resources. Decoder support for FEC SHOULD be indicated at the time a session is set up.
    Opus allows for transmission of stereo audio signals. This operation is signaled in-band in the Opus bit-stream and no special arrangement is needed in the payload format. An Opus decoder is capable of handling a stereo encoding, but an application might only be capable of consuming a single audio channel. If a decoder cannot take advantage of the benefits of a stereo signal this SHOULD be indicated at the time a session is set up. In that case the sending side SHOULD NOT send stereo signals as it leads to an inefficient usage of network resources.
    The payload format for Opus consists of the RTP header and Opus payload data.
    The format of the RTP header is specified in . The use of the fields of the RTP header by the Opus payload format is consistent with that specification. The payload length of Opus is an integer number of octets and therefore no padding is necessary. The payload MAY be padded by an integer number of octets according to , although the Opus internal padding is preferred. The timestamp, sequence number, and marker bit (M) of the RTP header are used in accordance with Section 4.1 of . The RTP payload type for Opus is to be assigned dynamically. The receiving side MUST be prepared to receive duplicate RTP packets. The receiver MUST provide at most one of those payloads to the Opus decoder for decoding, and MUST discard the others. Opus supports 5 different audio bandwidths, which can be adjusted during a stream. The RTP timestamp is incremented with a 48000 Hz clock rate for all modes of Opus and all sampling rates. The unit for the timestamp is samples per single (mono) channel. The RTP timestamp corresponds to the sample time of the first encoded sample in the encoded frame. For data encoded with sampling rates other than 48000 Hz, the sampling rate has to be adjusted to 48000 Hz.
    The Opus encoder can output encoded frames representing 2.5, 5, 10, 20, 40, or 60 ms of speech or audio data. Further, an arbitrary number of frames can be combined into a packet, up to a maximum packet duration representing 120 ms of speech or audio data. The grouping of one or more Opus frames into a single Opus packet is defined in Section 3 of . An RTP payload MUST contain exactly one Opus packet as defined by that document. shows the structure combined with the RTP header.
    shows supported frame sizes in milliseconds of encoded speech or audio data for the speech and audio modes (Mode) and sampling rates (fs) of Opus and shows how the timestamp is incremented for packetization (ts incr). If the Opus encoder outputs multiple encoded frames into a single packet, the timestamp increment is the sum of the increments for the individual frames. Mode fs 2.5 5 10 20 40 60 ts incr all 120 240 480 960 1920 2880 voice NB/MB/WB/SWB/FB x x o o o o audio NB/WB/SWB/FB o o o o x x
    The target bitrate of Opus can be adjusted at any point in time, thus allowing efficient congestion control. Furthermore, the amount of encoded speech or audio data encoded in a single packet can be used for congestion control, since the transmission rate is inversely proportional to the packet duration. A lower packet transmission rate reduces the amount of header overhead, but at the same time increases latency and loss sensitivity, so it ought to be used with care. Since UDP does not provide congestion control, applications that use RTP over UDP SHOULD implement their own congestion control above the UDP layer . Work in the rmcat working group describes the interactions and conceptual interfaces necessary between the application components that relate to congestion control, including the RTP layer, the higher-level media codec control layer, and the lower-level transport interface, as well as components dedicated to congestion control functions.
    One media subtype (audio/opus) has been defined and registered as described in the following section.
    Media type registration is done according to and . Type name: audio Subtype name: opus Required parameters: the RTP timestamp is incremented with a 48000 Hz clock rate for all modes of Opus and all sampling rates. For data encoded with sampling rates other than 48000 Hz, the sampling rate has to be adjusted to 48000 Hz. Optional parameters: a hint about the maximum output sampling rate that the receiver is capable of rendering in Hz. The decoder MUST be capable of decoding any audio bandwidth but due to hardware limitations only signals up to the specified sampling rate can be played back. Sending signals with higher audio bandwidth results in higher than necessary network usage and encoding complexity, so an encoder SHOULD NOT encode frequencies above the audio bandwidth specified by maxplaybackrate. This parameter can take any value between 8000 and 48000, although commonly the value will match one of the Opus bandwidths (). By default, the receiver is assumed to have no limitations, i.e. 48000. a hint about the maximum input sampling rate that the sender is likely to produce. This is not a guarantee that the sender will never send any higher bandwidth (e.g. it could send a pre-recorded prompt that uses a higher bandwidth), but it indicates to the receiver that frequencies above this maximum can safely be discarded. This parameter is useful to avoid wasting receiver resources by operating the audio processing pipeline (e.g. echo cancellation) at a higher rate than necessary. This parameter can take any value between 8000 and 48000, although commonly the value will match one of the Opus bandwidths (). By default, the sender is assumed to have no limitations, i.e. 48000. the maximum duration of media represented by a packet (according to Section 6 of ) that a decoder wants to receive, in milliseconds rounded up to the next full integer value. Possible values are 3, 5, 10, 20, 40, 60, or an arbitrary multiple of an Opus frame size rounded up to the next full integer value, up to a maximum value of 120, as defined in . If no value is specified, the default is 120. the preferred duration of media represented by a packet (according to Section 6 of ) that a decoder wants to receive, in milliseconds rounded up to the next full integer value. Possible values are 3, 5, 10, 20, 40, 60, or an arbitrary multiple of an Opus frame size rounded up to the next full integer value, up to a maximum value of 120, as defined in . If no value is specified, the default is 20. specifies the maximum average receive bitrate of a session in bits per second (b/s). The actual value of the bitrate can vary, as it is dependent on the characteristics of the media in a packet. Note that the maximum average bitrate MAY be modified dynamically during a session. Any positive integer is allowed, but values outside the range 6000 to 510000 SHOULD be ignored. If no value is specified, the maximum value specified in for the corresponding mode of Opus and corresponding maxplaybackrate is the default. specifies whether the decoder prefers receiving stereo or mono signals. Possible values are 1 and 0 where 1 specifies that stereo signals are preferred, and 0 specifies that only mono signals are preferred. Independent of the stereo parameter every receiver MUST be able to receive and decode stereo signals but sending stereo signals to a receiver that signaled a preference for mono signals may result in higher than necessary network utilization and encoding complexity. If no value is specified, the default is 0 (mono). specifies whether the sender is likely to produce stereo audio. Possible values are 1 and 0, where 1 specifies that stereo signals are likely to be sent, and 0 specifies that the sender will likely only send mono. This is not a guarantee that the sender will never send stereo audio (e.g. it could send a pre-recorded prompt that uses stereo), but it indicates to the receiver that the received signal can be safely downmixed to mono. This parameter is useful to avoid wasting receiver resources by operating the audio processing pipeline (e.g. echo cancellation) in stereo when not necessary. If no value is specified, the default is 0 (mono). specifies if the decoder prefers the use of a constant bitrate versus variable bitrate. Possible values are 1 and 0, where 1 specifies constant bitrate and 0 specifies variable bitrate. If no value is specified, the default is 0 (vbr). When cbr is 1, the maximum average bitrate can still change, e.g. to adapt to changing network conditions. specifies that the decoder has the capability to take advantage of the Opus in-band FEC. Possible values are 1 and 0. Providing 0 when FEC cannot be used on the receiving side is RECOMMENDED. If no value is specified, useinbandfec is assumed to be 0. This parameter is only a preference and the receiver MUST be able to process packets that include FEC information, even if it means the FEC part is discarded. specifies if the decoder prefers the use of DTX. Possible values are 1 and 0. If no value is specified, the default is 0. Encoding considerations: The Opus media type is framed and consists of binary data according to Section 4.8 in . Security considerations: See of this document. Interoperability considerations: none Published specification: RFC [XXXX] Note to the RFC Editor: Replace [XXXX] with the number of the published RFC. Applications that use this media type: Any application that requires the transport of speech or audio data can use this media type. Some examples are, but not limited to, audio and video conferencing, Voice over IP, media streaming. Fragment identifier considerations: N/A Person & email address to contact for further information: SILK Support silksupport@skype.net Jean-Marc Valin jmvalin@jmvalin.ca Intended usage: COMMON Restrictions on usage: For transfer over RTP, the RTP payload format ( of this document) SHALL be used. Author: Julian Spittka jspittka@gmail.com Koen Vos koenvos74@gmail.com Jean-Marc Valin jmvalin@jmvalin.ca Change controller: IETF Payload Working Group delegated from the IESG
    The information described in the media type specification has a specific mapping to fields in the Session Description Protocol (SDP) , which is commonly used to describe RTP sessions. When SDP is used to specify sessions employing Opus, the mapping is as follows: The media type ("audio") goes in SDP "m=" as the media name. The media subtype ("opus") goes in SDP "a=rtpmap" as the encoding name. The RTP clock rate in "a=rtpmap" MUST be 48000 and the number of channels MUST be 2. The OPTIONAL media type parameters "ptime" and "maxptime" are mapped to "a=ptime" and "a=maxptime" attributes, respectively, in the SDP. The OPTIONAL media type parameters "maxaveragebitrate", "maxplaybackrate", "stereo", "cbr", "useinbandfec", and "usedtx", when present, MUST be included in the "a=fmtp" attribute in the SDP, expressed as a media type string in the form of a semicolon-separated list of parameter=value pairs (e.g., maxplaybackrate=48000). They MUST NOT be specified in an SSRC-specific "fmtp" source-level attribute (as defined in Section 6.3 of ). The OPTIONAL media type parameters "sprop-maxcapturerate", and "sprop-stereo" MAY be mapped to the "a=fmtp" SDP attribute by copying them directly from the media type parameter string as part of the semicolon-separated list of parameter=value pairs (e.g., sprop-stereo=1). These same OPTIONAL media type parameters MAY also be specified using an SSRC-specific "fmtp" source-level attribute as described in Section 6.3 of . They MAY be specified in both places, in which case the parameter in the source-level attribute overrides the one found on the "a=fmtp" line. The value of any parameter which is not specified in a source-level source attribute MUST be taken from the "a=fmtp" line, if it is present there. Below are some examples of SDP session descriptions for Opus: Example 1: Standard mono session with 48000 Hz clock rate
    Example 2: 16000 Hz clock rate, maximum packet size of 40 ms, recommended packet size of 40 ms, maximum average bitrate of 20000 bps, prefers to receive stereo but only plans to send mono, FEC is desired, DTX is not desired
    Example 3: Two-way full-band stereo preferred
    When using the offer-answer procedure described in to negotiate the use of Opus, the following considerations apply: Opus supports several clock rates. For signaling purposes only the highest, i.e. 48000, is used. The actual clock rate of the corresponding media is signaled inside the payload and is not restricted by this payload format description. The decoder MUST be capable of decoding every received clock rate. An example is shown below:
    The "ptime" and "maxptime" parameters are unidirectional receive-only parameters and typically will not compromise interoperability; however, some values might cause application performance to suffer. defines the SDP offer-answer handling of the "ptime" parameter. The "maxptime" parameter MUST be handled in the same way. The "maxplaybackrate" parameter is a unidirectional receive-only parameter that reflects limitations of the local receiver. When sending to a single destination, a sender MUST NOT use an audio bandwidth higher than necessary to make full use of audio sampled at a sampling rate of "maxplaybackrate". Gateways or senders that are sending the same encoded audio to multiple destinations SHOULD NOT use an audio bandwidth higher than necessary to represent audio sampled at "maxplaybackrate", as this would lead to inefficient use of network resources. The "maxplaybackrate" parameter does not affect interoperability. Also, this parameter SHOULD NOT be used to adjust the audio bandwidth as a function of the bitrate, as this is the responsibility of the Opus encoder implementation. The "maxaveragebitrate" parameter is a unidirectional receive-only parameter that reflects limitations of the local receiver. The sender of the other side MUST NOT send with an average bitrate higher than "maxaveragebitrate" as it might overload the network and/or receiver. The "maxaveragebitrate" parameter typically will not compromise interoperability; however, some values might cause application performance to suffer, and ought to be set with care. The "sprop-maxcapturerate" and "sprop-stereo" parameters are unidirectional sender-only parameters that reflect limitations of the sender side. They allow the receiver to set up a reduced-complexity audio processing pipeline if the sender is not planning to use the full range of Opus's capabilities. Neither "sprop-maxcapturerate" nor "sprop-stereo" affect interoperability and the receiver MUST be capable of receiving any signal. The "stereo" parameter is a unidirectional receive-only parameter. When sending to a single destination, a sender MUST NOT use stereo when "stereo" is 0. Gateways or senders that are sending the same encoded audio to multiple destinations SHOULD NOT use stereo when "stereo" is 0, as this would lead to inefficient use of network resources. The "stereo" parameter does not affect interoperability. The "cbr" parameter is a unidirectional receive-only parameter. The "useinbandfec" parameter is a unidirectional receive-only parameter. The "usedtx" parameter is a unidirectional receive-only parameter. Any unknown parameter in an offer MUST be ignored by the receiver and MUST be removed from the answer.
    The Opus parameters in an SDP Offer/Answer exchange are completely orthogonal, and there is no relationship between the SDP Offer and the Answer.
    For declarative use of SDP such as in Session Announcement Protocol (SAP), , and RTSP, , for Opus, the following needs to be considered: The values for "maxptime", "ptime", "maxplaybackrate", and "maxaveragebitrate" ought to be selected carefully to ensure that a reasonable performance can be achieved for the participants of a session. The values for "maxptime", "ptime", and of the payload format configuration are recommendations by the decoding side to ensure the best performance for the decoder. All other parameters of the payload format configuration are declarative and a participant MUST use the configurations that are provided for the session. More than one configuration can be provided if necessary by declaring multiple RTP payload types; however, the number of types ought to be kept small.
    Use of variable bitrate (VBR) is subject to the security considerations in . RTP packets using the payload format defined in this specification are subject to the security considerations discussed in the RTP specification , and in any applicable RTP profile such as RTP/AVP , RTP/AVPF , RTP/SAVP or RTP/SAVPF . However, as "Securing the RTP Protocol Framework: Why RTP Does Not Mandate a Single Media Security Solution" discusses, it is not an RTP payload format's responsibility to discuss or mandate what solutions are used to meet the basic security goals like confidentiality, integrity and source authenticity for RTP in general. This responsibility lays on anyone using RTP in an application. They can find guidance on available security mechanisms and important considerations in Options for Securing RTP Sessions [I-D.ietf-avtcore-rtp-security-options]. Applications SHOULD use one or more appropriate strong security mechanisms. This payload format and the Opus encoding do not exhibit any significant non-uniformity in the receiver-end computational load and thus are unlikely to pose a denial-of-service threat due to the receipt of pathological datagrams.
    Many people have made useful comments and suggestions contributing to this document. In particular, we would like to thank Tina le Grand, Cullen Jennings, Jonathan Lennox, Gregory Maxwell, Colin Perkins, Jan Skoglund, Timothy B. Terriberry, Martin Thompson, Justin Uberti, Magnus Westerlund, and Mo Zanaty.
    &rfc2119; &rfc3389; &rfc3550; &rfc3711; &rfc3551; &rfc6838; &rfc4855; &rfc4566; &rfc3264; &rfc2326; &rfc5576; &rfc6562; &rfc6716; &rfc2974; &rfc4585; &rfc5124; &rfc5405; &rfc7202; rmcat documents
    mumble-1.3.4/3rdparty/opus-src/doc/draft-ietf-codec-opus-update.xml0000664000175000017500000004074114010707327025025 0ustar builderbuilder Updates to the Opus Audio Codec Mozilla Corporation
    331 E. Evelyn Avenue Mountain View CA 94041 USA +1 650 903-0800 jmvalin@jmvalin.ca
    vocTone
    koenvos74@gmail.com
    This document addresses minor issues that were found in the specification of the Opus audio codec in RFC 6716.
    This document addresses minor issues that were discovered in the reference implementation of the Opus codec that serves as the specification in RFC 6716. Only issues affecting the decoder are listed here. An up-to-date implementation of the Opus encoder can be found at https://opus-codec.org/. Some of the changes in this document update normative behaviour in a way that requires new test vectors. The English text of the specification is unaffected, only the C implementation is. The updated specification remains fully compatible with the original specification. Note: due to RFC formatting conventions, lines exceeding the column width in the patch are split using a backslash character. The backslashes at the end of a line and the white space at the beginning of the following line are not part of the patch. A properly formatted patch including all changes is available at . (EDITOR: change to an ietf.org link when ready)
    The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119.
    The reference implementation does not reinitialize the stereo state during a mode switch. The old stereo memory can produce a brief impulse (i.e. single sample) in the decoded audio. This can be fixed by changing silk/dec_API.c at line 72:
    sStereo, 0, + sizeof(((silk_decoder *)decState)->sStereo)); + /* Not strictly needed, but it's cleaner that way */ + ((silk_decoder *)decState)->prev_decode_only_middle = 0; return ret; } ]]>
    This change affects the normative part of the decoder, although the amount of change is too small to make a significant impact on testvectors.
    It was discovered that some invalid packets of very large size could trigger an out-of-bounds read in the Opus packet parsing code responsible for padding. This is due to an integer overflow if the signaled padding exceeds 2^31-1 bytes (the actual packet may be smaller). The code can be fixed by applying the following changes at line 596 of src/opus_decoder.c:
    This packet parsing issue is limited to reading memory up to about 60 kB beyond the compressed buffer. This can only be triggered by a compressed packet more than about 16 MB long, so it's not a problem for RTP. In theory, it could crash a file decoder (e.g. Opus in Ogg) if the memory just after the incoming packet is out-of-range, but our attempts to trigger such a crash in a production application built using an affected version of the Opus decoder failed.
    The SILK resampler had the following issues: The calls to memcpy() were using sizeof(opus_int32), but the type of the local buffer was opus_int16. Because the size was wrong, this potentially allowed the source and destination regions of the memcpy() to overlap. We believe that nSamplesIn is at least fs_in_khZ, which is at least 8. Since RESAMPLER_ORDER_FIR_12 is only 8, that should not be a problem once the type size is fixed. The size of the buffer used RESAMPLER_MAX_BATCH_SIZE_IN, but the data stored in it was actually _twice_ the input batch size (nSamplesIn<<1). The fact that the code never produced any error in testing (including when run under the Valgrind memory debugger), suggests that in practice the batch sizes are reasonable enough that none of the issues above was ever a problem. However, proving that is non-obvious. The code can be fixed by applying the following changes to line 78 of silk/resampler_private_IIR_FIR.c:
    sFIR, RESAMPLER_ORDER_FIR_12 \ * sizeof( opus_int32 ) ); + silk_memcpy( buf, S->sFIR, RESAMPLER_ORDER_FIR_12 \ * sizeof( opus_int16 ) ); /* Iterate over blocks of frameSizeIn input samples */ index_increment_Q16 = S->invRatio_Q16; while( 1 ) { nSamplesIn = silk_min( inLen, S->batchSize ); /* Upsample 2x */ silk_resampler_private_up2_HQ( S->sIIR, &buf[ \ RESAMPLER_ORDER_FIR_12 ], in, nSamplesIn ); max_index_Q16 = silk_LSHIFT32( nSamplesIn, 16 + 1 \ ); /* + 1 because 2x upsampling */ out = silk_resampler_private_IIR_FIR_INTERPOL( out, \ buf, max_index_Q16, index_increment_Q16 ); in += nSamplesIn; inLen -= nSamplesIn; if( inLen > 0 ) { /* More iterations to do; copy last part of \ filtered signal to beginning of buffer */ - silk_memcpy( buf, &buf[ nSamplesIn << 1 ], \ RESAMPLER_ORDER_FIR_12 * sizeof( opus_int32 ) ); + silk_memmove( buf, &buf[ nSamplesIn << 1 ], \ RESAMPLER_ORDER_FIR_12 * sizeof( opus_int16 ) ); } else { break; } } /* Copy last part of filtered signal to the state for \ the next call */ - silk_memcpy( S->sFIR, &buf[ nSamplesIn << 1 ], \ RESAMPLER_ORDER_FIR_12 * sizeof( opus_int32 ) ); + silk_memcpy( S->sFIR, &buf[ nSamplesIn << 1 ], \ RESAMPLER_ORDER_FIR_12 * sizeof( opus_int16 ) ); } ]]>
    It was discovered through decoder fuzzing that some bitstreams could produce integer values exceeding 32-bits in LPC_inverse_pred_gain_QA(), causing a wrap-around. Although the error is harmless in practice, the C standard considers the behavior as undefined, so the following patch to line 87 of silk/LPC_inv_pred_gain.c detects values that do not fit in a 32-bit integer and considers the corresponding filters unstable:
    silk_int32_MAX || tmp64 < silk_int32_MIN ) { + return 0; + } + Anew_QA[ n ] = ( opus_int32 )tmp64; } ]]>
    It was discovered -- also from decoder fuzzing -- that an integer wrap-around could occur when decoding line spectral frequency coefficients from extreme bitstreams. The end result of the wrap-around is an illegal read access on the stack, which the authors do not believe is exploitable but should nonetheless be fixed. The following patch to line 137 of silk/NLSF_stabilize.c prevents the problem:
    On extreme bit-streams, it is possible for log-domain band energy levels to exceed the maximum single-precision floating point value once converted to a linear scale. This would later cause the decoded values to be NaN, possibly causing problems in the software using the PCM values. This can be avoided with the following patch to line 552 of celt/quant_bands.c:
    nbEBands], SHL16((opus_val16)eMeans[i],6)); + lg = MIN32(QCONST32(32.f, 16), lg); eBands[i+c*m->nbEBands] = PSHR32(celt_exp2(lg),4); } for (;inbEBands;i++) ]]>
    When encoding in hybrid mode at low bitrate, we sometimes only have enough bits to code a single CELT band (8 - 9.6 kHz). When that happens, the second band (CELT band 18, from 9.6 to 12 kHz) cannot use folding because it is wider than the amount already coded, and falls back to LCG noise. Because it can also happen on transients (e.g. stops), it can cause audible pre-echo. To address the issue, we change the folding behavior so that it is never forced to fall back to LCG due to the first band not containing enough coefficients to fold onto the second band. This is achieved by simply repeating part of the first band in the folding of the second band. This changes the code in celt/bands.c around line 1237:
    = M*eBands[start] && \ (update_lowband || lowband_offset==0)) + if (resynth && (M*eBands[i]-N >= M*eBands[start] || \ i==start+1) && (update_lowband || lowband_offset==0)) lowband_offset = i; + if (i == start+1) + { + int n1, n2; + int offset; + n1 = M*(eBands[start+1]-eBands[start]); + n2 = M*(eBands[start+2]-eBands[start+1]); + offset = M*eBands[start]; + /* Duplicate enough of the first band folding data to \ be able to fold the second band. + Copies no data for CELT-only mode. */ + OPUS_COPY(&norm[offset+n1], &norm[offset+2*n1 - n2], n2-n1); + if (C==2) + OPUS_COPY(&norm2[offset+n1], &norm2[offset+2*n1 - n2], \ n2-n1); + } + tf_change = tf_res[i]; if (i>=m->effEBands) { ]]>
    as well as line 1260:
    effective_lowband); fold_end = lowband_offset-1; - while(M*eBands[++fold_end] < effective_lowband+N); + while(++fold_end < i && M*eBands[fold_end] < \ effective_lowband+N); x_cm = y_cm = 0; fold_i = fold_start; do { x_cm |= collapse_masks[fold_i*C+0]; ]]>
    The fix does not impact compatibility, because the improvement does not depend on the encoder doing anything special. There is also no reasonable way for an encoder to use the original behavior to improve quality over the proposed change.
    The last issue is not strictly a bug, but it is an issue that has been reported when downmixing an Opus decoded stream to mono, whether this is done inside the decoder or as a post-processing step on the stereo decoder output. Opus intensity stereo allows optionally coding the two channels 180-degrees out of phase on a per-band basis. This provides better stereo quality than forcing the two channels to be in phase, but when the output is downmixed to mono, the energy in the affected bands is cancelled sometimes resulting in audible artefacts. As a work-around for this issue, the decoder MAY choose not to apply the 180-degree phase shift when the output is meant to be downmixed (inside or outside of the decoder).
    Changes in and have sufficient impact on the testvectors to make them fail. For this reason, this document also updates the Opus test vectors. The new test vectors now include two decoded outputs for the same bitstream. The outputs with suffix 'm' do not apply the CELT 180-degree phase shift as allowed in , while the outputs without the suffix do. An implementation is compliant as long as it passes either set of vectors. In addition, any Opus implementation that passes the original test vectors from RFC 6716 is still compliant with the Opus specification. However, newer implementations SHOULD be based on the new test vectors rather than the old ones. The new test vectors are located at . (EDITOR: change to an ietf.org link when ready)
    This document makes no request of IANA. Note to RFC Editor: this section may be removed on publication as an RFC.
    We would like to thank Juri Aedla for reporting the issue with the parsing of the Opus padding. Also, thanks to Jonathan Lennox and Mark Harris for their feedback on this document.
    mumble-1.3.4/3rdparty/opus-src/doc/draft-ietf-codec-oggopus.xml0000664000175000017500000023267714010707327024255 0ustar builderbuilder ]> Ogg Encapsulation for the Opus Audio Codec Mozilla Corporation
    650 Castro Street Mountain View CA 94041 USA +1 650 903-0800 tterribe@xiph.org
    Voicetronix
    246 Pulteney Street, Level 1 Adelaide SA 5000 Australia +61 8 8232 9112 ron@debian.org
    Mozilla Corporation
    163 West Hastings Street Vancouver BC V6B 1H5 Canada +1 778 785 1540 giles@xiph.org
    RAI codec This document defines the Ogg encapsulation for the Opus interactive speech and audio codec. This allows data encoded in the Opus format to be stored in an Ogg logical bitstream.
    The IETF Opus codec is a low-latency audio codec optimized for both voice and general-purpose audio. See for technical details. This document defines the encapsulation of Opus in a continuous, logical Ogg bitstream . Ogg encapsulation provides Opus with a long-term storage format supporting all of the essential features, including metadata, fast and accurate seeking, corruption detection, recapture after errors, low overhead, and the ability to multiplex Opus with other codecs (including video) with minimal buffering. It also provides a live streamable format, capable of delivery over a reliable stream-oriented transport, without requiring all the data, or even the total length of the data, up-front, in a form that is identical to the on-disk storage format. Ogg bitstreams are made up of a series of 'pages', each of which contains data from one or more 'packets'. Pages are the fundamental unit of multiplexing in an Ogg stream. Each page is associated with a particular logical stream and contains a capture pattern and checksum, flags to mark the beginning and end of the logical stream, and a 'granule position' that represents an absolute position in the stream, to aid seeking. A single page can contain up to 65,025 octets of packet data from up to 255 different packets. Packets can be split arbitrarily across pages, and continued from one page to the next (allowing packets much larger than would fit on a single page). Each page contains 'lacing values' that indicate how the data is partitioned into packets, allowing a demultiplexer (demuxer) to recover the packet boundaries without examining the encoded data. A packet is said to 'complete' on a page when the page contains the final lacing value corresponding to that packet. This encapsulation defines the contents of the packet data, including the necessary headers, the organization of those packets into a logical stream, and the interpretation of the codec-specific granule position field. It does not attempt to describe or specify the existing Ogg container format. Readers unfamiliar with the basic concepts mentioned above are encouraged to review the details in .
    The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in .
    An Ogg Opus stream is organized as follows (see for an example).
    There are two mandatory header packets. The first packet in the logical Ogg bitstream MUST contain the identification (ID) header, which uniquely identifies a stream as Opus audio. The format of this header is defined in . It is placed alone (without any other packet data) on the first page of the logical Ogg bitstream, and completes on that page. This page has its 'beginning of stream' flag set. The second packet in the logical Ogg bitstream MUST contain the comment header, which contains user-supplied metadata. The format of this header is defined in . It MAY span multiple pages, beginning on the second page of the logical stream. However many pages it spans, the comment header packet MUST finish the page on which it completes. All subsequent pages are audio data pages, and the Ogg packets they contain are audio data packets. Each audio data packet contains one Opus packet for each of N different streams, where N is typically one for mono or stereo, but MAY be greater than one for multichannel audio. The value N is specified in the ID header (see ), and is fixed over the entire length of the logical Ogg bitstream. The first (N - 1) Opus packets, if any, are packed one after another into the Ogg packet, using the self-delimiting framing from Appendix B of . The remaining Opus packet is packed at the end of the Ogg packet using the regular, undelimited framing from Section 3 of . All of the Opus packets in a single Ogg packet MUST be constrained to have the same duration. An implementation of this specification SHOULD treat any Opus packet whose duration is different from that of the first Opus packet in an Ogg packet as if it were a malformed Opus packet with an invalid Table Of Contents (TOC) sequence. The TOC sequence at the beginning of each Opus packet indicates the coding mode, audio bandwidth, channel count, duration (frame size), and number of frames per packet, as described in Section 3.1 of . The coding mode is one of SILK, Hybrid, or Constrained Energy Lapped Transform (CELT). The combination of coding mode, audio bandwidth, and frame size is referred to as the configuration of an Opus packet. Packets are placed into Ogg pages in order until the end of stream. Audio data packets might span page boundaries. The first audio data page could have the 'continued packet' flag set (indicating the first audio data packet is continued from a previous page) if, for example, it was a live stream joined mid-broadcast, with the headers pasted on the front. If a page has the 'continued packet' flag set and one of the following conditions is also true: the previous page with packet data does not end in a continued packet (does not end with a lacing value of 255) OR the page sequence numbers are not consecutive, then a demuxer MUST NOT attempt to decode the data for the first packet on the page unless the demuxer has some special knowledge that would allow it to interpret this data despite the missing pieces. An implementation MUST treat a zero-octet audio data packet as if it were a malformed Opus packet as described in Section 3.4 of . A logical stream ends with a page with the 'end of stream' flag set, but implementations need to be prepared to deal with truncated streams that do not have a page marked 'end of stream'. There is no reason for the final packet on the last page to be a continued packet, i.e., for the final lacing value to be 255. However, demuxers might encounter such streams, possibly as the result of a transfer that did not complete or of corruption. If a packet continues onto a subsequent page (i.e., when the page ends with a lacing value of 255) and one of the following conditions is also true: the next page with packet data does not have the 'continued packet' flag set OR there is no next page with packet data OR the page sequence numbers are not consecutive, then a demuxer MUST NOT attempt to decode the data from that packet unless the demuxer has some special knowledge that would allow it to interpret this data despite the missing pieces. There MUST NOT be any more pages in an Opus logical bitstream after a page marked 'end of stream'.
    The granule position MUST be zero for the ID header page and the page where the comment header completes. That is, the first page in the logical stream, and the last header page before the first audio data page both have a granule position of zero. The granule position of an audio data page encodes the total number of PCM samples in the stream up to and including the last fully-decodable sample from the last packet completed on that page. The granule position of the first audio data page will usually be larger than zero, as described in . A page that is entirely spanned by a single packet (that completes on a subsequent page) has no granule position, and the granule position field is set to the special value '-1' in two's complement. The granule position of an audio data page is in units of PCM audio samples at a fixed rate of 48 kHz (per channel; a stereo stream's granule position does not increment at twice the speed of a mono stream). It is possible to run an Opus decoder at other sampling rates, but all Opus packets encode samples at a sampling rate that evenly divides 48 kHz. Therefore, the value in the granule position field always counts samples assuming a 48 kHz decoding rate, and the rest of this specification makes the same assumption. The duration of an Opus packet as defined in can be any multiple of 2.5 ms, up to a maximum of 120 ms. This duration is encoded in the TOC sequence at the beginning of each packet. The number of samples returned by a decoder corresponds to this duration exactly, even for the first few packets. For example, a 20 ms packet fed to a decoder running at 48 kHz will always return 960 samples. A demuxer can parse the TOC sequence at the beginning of each Ogg packet to work backwards or forwards from a packet with a known granule position (i.e., the last packet completed on some page) in order to assign granule positions to every packet, or even every individual sample. The one exception is the last page in the stream, as described below. All other pages with completed packets after the first MUST have a granule position equal to the number of samples contained in packets that complete on that page plus the granule position of the most recent page with completed packets. This guarantees that a demuxer can assign individual packets the same granule position when working forwards as when working backwards. For this to work, there cannot be any gaps.
    In order to support capturing a real-time stream that has lost or not transmitted packets, a multiplexer (muxer) SHOULD emit packets that explicitly request the use of Packet Loss Concealment (PLC) in place of the missing packets. Implementations that fail to do so still MUST NOT increment the granule position for a page by anything other than the number of samples contained in packets that actually complete on that page. Only gaps that are a multiple of 2.5 ms are repairable, as these are the only durations that can be created by packet loss or discontinuous transmission. Muxers need not handle other gap sizes. Creating the necessary packets involves synthesizing a TOC byte (defined in Section 3.1 of )—and whatever additional internal framing is needed—to indicate the packet duration for each stream. The actual length of each missing Opus frame inside the packet is zero bytes, as defined in Section 3.2.1 of . Zero-byte frames MAY be packed into packets using any of codes 0, 1, 2, or 3. When successive frames have the same configuration, the higher code packings reduce overhead. Likewise, if the TOC configuration matches, the muxer MAY further combine the empty frames with previous or subsequent non-zero-length frames (using code 2 or VBR code 3). does not impose any requirements on the PLC, but this section outlines choices that are expected to have a positive influence on most PLC implementations, including the reference implementation. Synthesized TOC sequences SHOULD maintain the same mode, audio bandwidth, channel count, and frame size as the previous packet (if any). This is the simplest and usually the most well-tested case for the PLC to handle and it covers all losses that do not include a configuration switch, as defined in Section 4.5 of . When a previous packet is available, keeping the audio bandwidth and channel count the same allows the PLC to provide maximum continuity in the concealment data it generates. However, if the size of the gap is not a multiple of the most recent frame size, then the frame size will have to change for at least some frames. Such changes SHOULD be delayed as long as possible to simplify things for PLC implementations. As an example, a 95 ms gap could be encoded as nineteen 5 ms frames in two bytes with a single CBR code 3 packet. If the previous frame size was 20 ms, using four 20 ms frames followed by three 5 ms frames requires 4 bytes (plus an extra byte of Ogg lacing overhead), but allows the PLC to use its well-tested steady state behavior for as long as possible. The total bitrate of the latter approach, including Ogg overhead, is about 0.4 kbps, so the impact on file size is minimal. Changing modes is discouraged, since this causes some decoder implementations to reset their PLC state. However, SILK and Hybrid mode frames cannot fill gaps that are not a multiple of 10 ms. If switching to CELT mode is needed to match the gap size, a muxer SHOULD do so at the end of the gap to allow the PLC to function for as long as possible. In the example above, if the previous frame was a 20 ms SILK mode frame, the better solution is to synthesize a packet describing four 20 ms SILK frames, followed by a packet with a single 10 ms SILK frame, and finally a packet with a 5 ms CELT frame, to fill the 95 ms gap. This also requires four bytes to describe the synthesized packet data (two bytes for a CBR code 3 and one byte each for two code 0 packets) but three bytes of Ogg lacing overhead are needed to mark the packet boundaries. At 0.6 kbps, this is still a minimal bitrate impact over a naive, low quality solution. Since medium-band audio is an option only in the SILK mode, wideband frames SHOULD be generated if switching from that configuration to CELT mode, to ensure that any PLC implementation which does try to migrate state between the modes will be able to preserve all of the available audio bandwidth.
    There is some amount of latency introduced during the decoding process, to allow for overlap in the CELT mode, stereo mixing in the SILK mode, and resampling. The encoder might have introduced additional latency through its own resampling and analysis (though the exact amount is not specified). Therefore, the first few samples produced by the decoder do not correspond to real input audio, but are instead composed of padding inserted by the encoder to compensate for this latency. These samples need to be stored and decoded, as Opus is an asymptotically convergent predictive codec, meaning the decoded contents of each frame depend on the recent history of decoder inputs. However, a player will want to skip these samples after decoding them. A 'pre-skip' field in the ID header (see ) signals the number of samples that SHOULD be skipped (decoded but discarded) at the beginning of the stream, though some specific applications might have a reason for looking at that data. This amount need not be a multiple of 2.5 ms, MAY be smaller than a single packet, or MAY span the contents of several packets. These samples are not valid audio. For example, if the first Opus frame uses the CELT mode, it will always produce 120 samples of windowed overlap-add data. However, the overlap data is initially all zeros (since there is no prior frame), meaning this cannot, in general, accurately represent the original audio. The SILK mode requires additional delay to account for its analysis and resampling latency. The encoder delays the original audio to avoid this problem. The pre-skip field MAY also be used to perform sample-accurate cropping of already encoded streams. In this case, a value of at least 3840 samples (80 ms) provides sufficient history to the decoder that it will have converged before the stream's output begins.
    The PCM sample position is determined from the granule position using the formula
    For example, if the granule position of the first audio data page is 59,971, and the pre-skip is 11,971, then the PCM sample position of the last decoded sample from that page is 48,000. This can be converted into a playback time using the formula
    The initial PCM sample position before any samples are played is normally '0'. In this case, the PCM sample position of the first audio sample to be played starts at '1', because it marks the time on the clock after that sample has been played, and a stream that is exactly one second long has a final PCM sample position of '48000', as in the example here. Vorbis streams use a granule position smaller than the number of audio samples contained in the first audio data page to indicate that some of those samples are trimmed from the output (see ). However, to do so, Vorbis requires that the first audio data page contains exactly two packets, in order to allow the decoder to perform PCM position adjustments before needing to return any PCM data. Opus uses the pre-skip mechanism for this purpose instead, since the encoder might introduce more than a single packet's worth of latency, and since very large packets in streams with a very large number of channels might not fit on a single page.
    The page with the 'end of stream' flag set MAY have a granule position that indicates the page contains less audio data than would normally be returned by decoding up through the final packet. This is used to end the stream somewhere other than an even frame boundary. The granule position of the most recent audio data page with completed packets is used to make this determination, or '0' is used if there were no previous audio data pages with a completed packet. The difference between these granule positions indicates how many samples to keep after decoding the packets that completed on the final page. The remaining samples are discarded. The number of discarded samples SHOULD be no larger than the number decoded from the last packet.
    The granule position of the first audio data page with a completed packet MAY be larger than the number of samples contained in packets that complete on that page, however it MUST NOT be smaller, unless that page has the 'end of stream' flag set. Allowing a granule position larger than the number of samples allows the beginning of a stream to be cropped or a live stream to be joined without rewriting the granule position of all the remaining pages. This means that the PCM sample position just before the first sample to be played MAY be larger than '0'. Synchronization when multiplexing with other logical streams still uses the PCM sample position relative to '0' to compute sample times. This does not affect the behavior of pre-skip: exactly 'pre-skip' samples SHOULD be skipped from the beginning of the decoded output, even if the initial PCM sample position is greater than zero. On the other hand, a granule position that is smaller than the number of decoded samples prevents a demuxer from working backwards to assign each packet or each individual sample a valid granule position, since granule positions are non-negative. An implementation MUST treat any stream as invalid if the granule position is smaller than the number of samples contained in packets that complete on the first audio data page with a completed packet, unless that page has the 'end of stream' flag set. It MAY defer this action until it decodes the last packet completed on that page. If that page has the 'end of stream' flag set, a demuxer MUST treat any stream as invalid if its granule position is smaller than the 'pre-skip' amount. This would indicate that there are more samples to be skipped from the initial decoded output than exist in the stream. If the granule position is smaller than the number of decoded samples produced by the packets that complete on that page, then a demuxer MUST use an initial granule position of '0', and can work forwards from '0' to timestamp individual packets. If the granule position is larger than the number of decoded samples available, then the demuxer MUST still work backwards as described above, even if the 'end of stream' flag is set, to determine the initial granule position, and thus the initial PCM sample position. Both of these will be greater than '0' in this case.
    Seeking in Ogg files is best performed using a bisection search for a page whose granule position corresponds to a PCM position at or before the seek target. With appropriately weighted bisection, accurate seeking can be performed in just one or two bisections on average, even in multi-gigabyte files. See for an example of general implementation guidance. When seeking within an Ogg Opus stream, an implementation SHOULD start decoding (and discarding the output) at least 3840 samples (80 ms) prior to the seek target in order to ensure that the output audio is correct by the time it reaches the seek target. This 'pre-roll' is separate from, and unrelated to, the 'pre-skip' used at the beginning of the stream. If the point 80 ms prior to the seek target comes before the initial PCM sample position, an implementation SHOULD start decoding from the beginning of the stream, applying pre-skip as normal, regardless of whether the pre-skip is larger or smaller than 80 ms, and then continue to discard samples to reach the seek target (if any).
    An Ogg Opus logical stream contains exactly two mandatory header packets: an identification header and a comment header.
    The fields in the identification (ID) header have the following meaning: Magic Signature: This is an 8-octet (64-bit) field that allows codec identification and is human-readable. It contains, in order, the magic numbers: 0x4F 'O' 0x70 'p' 0x75 'u' 0x73 's' 0x48 'H' 0x65 'e' 0x61 'a' 0x64 'd' Starting with "Op" helps distinguish it from audio data packets, as this is an invalid TOC sequence. Version (8 bits, unsigned): The version number MUST always be '1' for this version of the encapsulation specification. Implementations SHOULD treat streams where the upper four bits of the version number match that of a recognized specification as backwards-compatible with that specification. That is, the version number can be split into "major" and "minor" version sub-fields, with changes to the "minor" sub-field (in the lower four bits) signaling compatible changes. For example, an implementation of this specification SHOULD accept any stream with a version number of '15' or less, and SHOULD assume any stream with a version number '16' or greater is incompatible. The initial version '1' was chosen to keep implementations from relying on this octet as a null terminator for the "OpusHead" string. Output Channel Count 'C' (8 bits, unsigned): This is the number of output channels. This might be different than the number of encoded channels, which can change on a packet-by-packet basis. This value MUST NOT be zero. The maximum allowable value depends on the channel mapping family, and might be as large as 255. See for details. Pre-skip (16 bits, unsigned, little endian): This is the number of samples (at 48 kHz) to discard from the decoder output when starting playback, and also the number to subtract from a page's granule position to calculate its PCM sample position. When cropping the beginning of existing Ogg Opus streams, a pre-skip of at least 3,840 samples (80 ms) is RECOMMENDED to ensure complete convergence in the decoder. Input Sample Rate (32 bits, unsigned, little endian): This is the sample rate of the original input (before encoding), in Hz. This field is not the sample rate to use for playback of the encoded data. Opus can switch between internal audio bandwidths of 4, 6, 8, 12, and 20 kHz. Each packet in the stream can have a different audio bandwidth. Regardless of the audio bandwidth, the reference decoder supports decoding any stream at a sample rate of 8, 12, 16, 24, or 48 kHz. The original sample rate of the audio passed to the encoder is not preserved by the lossy compression. An Ogg Opus player SHOULD select the playback sample rate according to the following procedure: If the hardware supports 48 kHz playback, decode at 48 kHz. Otherwise, if the hardware's highest available sample rate is a supported rate, decode at this sample rate. Otherwise, if the hardware's highest available sample rate is less than 48 kHz, decode at the next higher Opus supported rate above the highest available hardware rate and resample. Otherwise, decode at 48 kHz and resample. However, the 'Input Sample Rate' field allows the muxer to pass the sample rate of the original input stream as metadata. This is useful when the user requires the output sample rate to match the input sample rate. For example, when not playing the output, an implementation writing PCM format samples to disk might choose to resample the audio back to the original input sample rate to reduce surprise to the user, who might reasonably expect to get back a file with the same sample rate. A value of zero indicates 'unspecified'. Muxers SHOULD write the actual input sample rate or zero, but implementations which do something with this field SHOULD take care to behave sanely if given crazy values (e.g., do not actually upsample the output to 10 MHz if requested). Implementations SHOULD support input sample rates between 8 kHz and 192 kHz (inclusive). Rates outside this range MAY be ignored by falling back to the default rate of 48 kHz instead. Output Gain (16 bits, signed, little endian): This is a gain to be applied when decoding. It is 20*log10 of the factor by which to scale the decoder output to achieve the desired playback volume, stored in a 16-bit, signed, two's complement fixed-point value with 8 fractional bits (i.e., Q7.8 ). To apply the gain, an implementation could use
    where output_gain is the raw 16-bit value from the header. Players and media frameworks SHOULD apply it by default. If a player chooses to apply any volume adjustment or gain modification, such as the R128_TRACK_GAIN (see ), the adjustment MUST be applied in addition to this output gain in order to achieve playback at the normalized volume. A muxer SHOULD set this field to zero, and instead apply any gain prior to encoding, when this is possible and does not conflict with the user's wishes. A nonzero output gain indicates the gain was adjusted after encoding, or that a user wished to adjust the gain for playback while preserving the ability to recover the original signal amplitude. Although the output gain has enormous range (+/- 128 dB, enough to amplify inaudible sounds to the threshold of physical pain), most applications can only reasonably use a small portion of this range around zero. The large range serves in part to ensure that gain can always be losslessly transferred between OpusHead and R128 gain tags (see below) without saturating.
    Channel Mapping Family (8 bits, unsigned): This octet indicates the order and semantic meaning of the output channels. Each currently specified value of this octet indicates a mapping family, which defines a set of allowed channel counts, and the ordered set of channel names for each allowed channel count. The details are described in . Channel Mapping Table: This table defines the mapping from encoded streams to output channels. Its contents are specified in .
    All fields in the ID headers are REQUIRED, except for the channel mapping table, which MUST be omitted when the channel mapping family is 0, but is REQUIRED otherwise. Implementations SHOULD treat a stream as invalid if it contains an ID header that does not have enough data for these fields, even if it contain a valid Magic Signature. Future versions of this specification, even backwards-compatible versions, might include additional fields in the ID header. If an ID header has a compatible major version, but a larger minor version, an implementation MUST NOT treat it as invalid for containing additional data not specified here, provided it still completes on the first page.
    An Ogg Opus stream allows mapping one number of Opus streams (N) to a possibly larger number of decoded channels (M + N) to yet another number of output channels (C), which might be larger or smaller than the number of decoded channels. The order and meaning of these channels are defined by a channel mapping, which consists of the 'channel mapping family' octet and, for channel mapping families other than family 0, a channel mapping table, as illustrated in .
    The fields in the channel mapping table have the following meaning: Stream Count 'N' (8 bits, unsigned): This is the total number of streams encoded in each Ogg packet. This value is necessary to correctly parse the packed Opus packets inside an Ogg packet, as described in . This value MUST NOT be zero, as without at least one Opus packet with a valid TOC sequence, a demuxer cannot recover the duration of an Ogg packet. For channel mapping family 0, this value defaults to 1, and is not coded. Coupled Stream Count 'M' (8 bits, unsigned): This is the number of streams whose decoders are to be configured to produce two channels (stereo). This MUST be no larger than the total number of streams, N. Each packet in an Opus stream has an internal channel count of 1 or 2, which can change from packet to packet. This is selected by the encoder depending on the bitrate and the audio being encoded. The original channel count of the audio passed to the encoder is not necessarily preserved by the lossy compression. Regardless of the internal channel count, any Opus stream can be decoded as mono (a single channel) or stereo (two channels) by appropriate initialization of the decoder. The 'coupled stream count' field indicates that the decoders for the first M Opus streams are to be initialized for stereo (two-channel) output, and the remaining (N - M) decoders are to be initialized for mono (a single channel) only. The total number of decoded channels, (M + N), MUST be no larger than 255, as there is no way to index more channels than that in the channel mapping. For channel mapping family 0, this value defaults to (C - 1) (i.e., 0 for mono and 1 for stereo), and is not coded. Channel Mapping (8*C bits): This contains one octet per output channel, indicating which decoded channel is to be used for each one. Let 'index' be the value of this octet for a particular output channel. This value MUST either be smaller than (M + N), or be the special value 255. If 'index' is less than 2*M, the output MUST be taken from decoding stream ('index'/2) as stereo and selecting the left channel if 'index' is even, and the right channel if 'index' is odd. If 'index' is 2*M or larger, but less than 255, the output MUST be taken from decoding stream ('index' - M) as mono. If 'index' is 255, the corresponding output channel MUST contain pure silence. The number of output channels, C, is not constrained to match the number of decoded channels (M + N). A single index value MAY appear multiple times, i.e., the same decoded channel might be mapped to multiple output channels. Some decoded channels might not be assigned to any output channel, as well. For channel mapping family 0, the first index defaults to 0, and if C == 2, the second index defaults to 1. Neither index is coded. After producing the output channels, the channel mapping family determines the semantic meaning of each one. There are three defined mapping families in this specification.
    Allowed numbers of channels: 1 or 2. RTP mapping. This is the same channel interpretation as . 1 channel: monophonic (mono). 2 channels: stereo (left, right). Special mapping: This channel mapping value also indicates that the contents consists of a single Opus stream that is stereo if and only if C == 2, with stream index 0 mapped to output channel 0 (mono, or left channel) and stream index 1 mapped to output channel 1 (right channel) if stereo. When the 'channel mapping family' octet has this value, the channel mapping table MUST be omitted from the ID header packet.
    Allowed numbers of channels: 1...8. Vorbis channel order (see below). Each channel is assigned to a speaker location in a conventional surround arrangement. Specific locations depend on the number of channels, and are given below in order of the corresponding channel indices. 1 channel: monophonic (mono). 2 channels: stereo (left, right). 3 channels: linear surround (left, center, right) 4 channels: quadraphonic (front left, front right, rear left, rear right). 5 channels: 5.0 surround (front left, front center, front right, rear left, rear right). 6 channels: 5.1 surround (front left, front center, front right, rear left, rear right, LFE). 7 channels: 6.1 surround (front left, front center, front right, side left, side right, rear center, LFE). 8 channels: 7.1 surround (front left, front center, front right, side left, side right, rear left, rear right, LFE) This set of surround options and speaker location orderings is the same as those used by the Vorbis codec . The ordering is different from the one used by the WAVE and Free Lossless Audio Codec (FLAC) formats, so correct ordering requires permutation of the output channels when decoding to or encoding from those formats. 'LFE' here refers to a Low Frequency Effects channel, often mapped to a subwoofer with no particular spatial position. Implementations SHOULD identify 'side' or 'rear' speaker locations with 'surround' and 'back' as appropriate when interfacing with audio formats or systems which prefer that terminology.
    Allowed numbers of channels: 1...255. No defined channel meaning. Channels are unidentified. General-purpose players SHOULD NOT attempt to play these streams. Offline implementations MAY deinterleave the output into separate PCM files, one per channel. Implementations SHOULD NOT produce output for channels mapped to stream index 255 (pure silence) unless they have no other way to indicate the index of non-silent channels.
    The remaining channel mapping families (2...254) are reserved. A demuxer implementation encountering a reserved channel mapping family value SHOULD act as though the value is 255.
    An Ogg Opus player MUST support any valid channel mapping with a channel mapping family of 0 or 1, even if the number of channels does not match the physically connected audio hardware. Players SHOULD perform channel mixing to increase or reduce the number of channels as needed. Implementations MAY use the matrices in Figures  through  to implement downmixing from multichannel files using Channel Mapping Family 1, which are known to give acceptable results for stereo. Matrices for 3 and 4 channels are normalized so each coefficient row sums to 1 to avoid clipping. For 5 or more channels they are normalized to 2 as a compromise between clipping and dynamic range reduction. In these matrices the front left and front right channels are generally passed through directly. When a surround channel is split between both the left and right stereo channels, coefficients are chosen so their squares sum to 1, which helps preserve the perceived intensity. Rear channels are mixed more diffusely or attenuated to maintain focus on the front channels.
    Exact coefficient values are 1 and 1/sqrt(2), multiplied by 1/(1 + 1/sqrt(2)) for normalization.
    Exact coefficient values are 1, sqrt(3)/2 and 1/2, multiplied by 1/(1 + sqrt(3)/2 + 1/2) for normalization.
    Exact coefficient values are 1, 1/sqrt(2), sqrt(3)/2 and 1/2, multiplied by 2/(1 + 1/sqrt(2) + sqrt(3)/2 + 1/2) for normalization.
    Exact coefficient values are 1, 1/sqrt(2), sqrt(3)/2 and 1/2, multiplied by 2/(1 + 1/sqrt(2) + sqrt(3)/2 + 1/2 + 1/sqrt(2)) for normalization.
    Exact coefficient values are 1, 1/sqrt(2), sqrt(3)/2, 1/2 and sqrt(3)/2/sqrt(2), multiplied by 2/(1 + 1/sqrt(2) + sqrt(3)/2 + 1/2 + sqrt(3)/2/sqrt(2) + 1/sqrt(2)) for normalization. The coefficients are in the same order as in , and the matrices above.
    Exact coefficient values are 1, 1/sqrt(2), sqrt(3)/2 and 1/2, multiplied by 2/(2 + 2/sqrt(2) + sqrt(3)) for normalization. The coefficients are in the same order as in , and the matrices above.
    The comment header consists of a 64-bit magic signature, followed by data in the same format as the header used in Ogg Vorbis, except (like Ogg Theora and Speex) the final "framing bit" specified in the Vorbis spec is not present. Magic Signature: This is an 8-octet (64-bit) field that allows codec identification and is human-readable. It contains, in order, the magic numbers: 0x4F 'O' 0x70 'p' 0x75 'u' 0x73 's' 0x54 'T' 0x61 'a' 0x67 'g' 0x73 's' Starting with "Op" helps distinguish it from audio data packets, as this is an invalid TOC sequence. Vendor String Length (32 bits, unsigned, little endian): This field gives the length of the following vendor string, in octets. It MUST NOT indicate that the vendor string is longer than the rest of the packet. Vendor String (variable length, UTF-8 vector): This is a simple human-readable tag for vendor information, encoded as a UTF-8 string . No terminating null octet is necessary. This tag is intended to identify the codec encoder and encapsulation implementations, for tracing differences in technical behavior. User-facing applications can use the 'ENCODER' user comment tag to identify themselves. User Comment List Length (32 bits, unsigned, little endian): This field indicates the number of user-supplied comments. It MAY indicate there are zero user-supplied comments, in which case there are no additional fields in the packet. It MUST NOT indicate that there are so many comments that the comment string lengths would require more data than is available in the rest of the packet. User Comment #i String Length (32 bits, unsigned, little endian): This field gives the length of the following user comment string, in octets. There is one for each user comment indicated by the 'user comment list length' field. It MUST NOT indicate that the string is longer than the rest of the packet. User Comment #i String (variable length, UTF-8 vector): This field contains a single user comment encoded as a UTF-8 string . There is one for each user comment indicated by the 'user comment list length' field. The vendor string length and user comment list length are REQUIRED, and implementations SHOULD treat a stream as invalid if it contains a comment header that does not have enough data for these fields, or that does not contain enough data for the corresponding vendor string or user comments they describe. Making this check before allocating the associated memory to contain the data helps prevent a possible Denial-of-Service (DoS) attack from small comment headers that claim to contain strings longer than the entire packet or more user comments than than could possibly fit in the packet. Immediately following the user comment list, the comment header MAY contain zero-padding or other binary data which is not specified here. If the least-significant bit of the first byte of this data is 1, then editors SHOULD preserve the contents of this data when updating the tags, but if this bit is 0, all such data MAY be treated as padding, and truncated or discarded as desired. This allows informal experimentation with the format of this binary data until it can be specified later. The comment header can be arbitrarily large and might be spread over a large number of Ogg pages. Implementations MUST avoid attempting to allocate excessive amounts of memory when presented with a very large comment header. To accomplish this, implementations MAY treat a stream as invalid if it has a comment header larger than 125,829,120 octets (120 MB), and MAY ignore individual comments that are not fully contained within the first 61,440 octets of the comment header.
    The user comment strings follow the NAME=value format described by with the same recommended tag names: ARTIST, TITLE, DATE, ALBUM, and so on. Two new comment tags are introduced here: First, an optional gain for track normalization:
    representing the volume shift needed to normalize the track's volume during isolated playback, in random shuffle, and so on. The gain is a Q7.8 fixed point number in dB, as in the ID header's 'output gain' field. This tag is similar to the REPLAYGAIN_TRACK_GAIN tag in Vorbis , except that the normal volume reference is the standard. Second, an optional gain for album normalization:
    representing the volume shift needed to normalize the overall volume when played as part of a particular collection of tracks. The gain is also a Q7.8 fixed point number in dB, as in the ID header's 'output gain' field. The values '-573' and '111' given here are just examples. An Ogg Opus stream MUST NOT have more than one of each of these tags, and if present their values MUST be an integer from -32768 to 32767, inclusive, represented in ASCII as a base 10 number with no whitespace. A leading '+' or '-' character is valid. Leading zeros are also permitted, but the value MUST be represented by no more than 6 characters. Other non-digit characters MUST NOT be present. If present, R128_TRACK_GAIN and R128_ALBUM_GAIN MUST correctly represent the R128 normalization gain relative to the 'output gain' field specified in the ID header. If a player chooses to make use of the R128_TRACK_GAIN tag or the R128_ALBUM_GAIN tag, it MUST apply those gains in addition to the 'output gain' value. If a tool modifies the ID header's 'output gain' field, it MUST also update or remove the R128_TRACK_GAIN and R128_ALBUM_GAIN comment tags if present. A muxer SHOULD place the gain it wants other tools to use by default into the 'output gain' field, and not the comment tag. To avoid confusion with multiple normalization schemes, an Opus comment header SHOULD NOT contain any of the REPLAYGAIN_TRACK_GAIN, REPLAYGAIN_TRACK_PEAK, REPLAYGAIN_ALBUM_GAIN, or REPLAYGAIN_ALBUM_PEAK tags, unless they are only to be used in some context where there is guaranteed to be no such confusion. normalization is preferred to the earlier REPLAYGAIN schemes because of its clear definition and adoption by industry. Peak normalizations are difficult to calculate reliably for lossy codecs because of variation in excursion heights due to decoder differences. In the authors' investigations they were not applied consistently or broadly enough to merit inclusion here.
    Technically, valid Opus packets can be arbitrarily large due to the padding format, although the amount of non-padding data they can contain is bounded. These packets might be spread over a similarly enormous number of Ogg pages. When encoding, implementations SHOULD limit the use of padding in audio data packets to no more than is necessary to make a variable bitrate (VBR) stream constant bitrate (CBR), unless they have no reasonable way to determine what is necessary. Demuxers SHOULD treat audio data packets as invalid (treat them as if they were malformed Opus packets with an invalid TOC sequence) if they are larger than 61,440 octets per Opus stream, unless they have a specific reason for allowing extra padding. Such packets necessarily contain more padding than needed to make a stream CBR. Demuxers MUST avoid attempting to allocate excessive amounts of memory when presented with a very large packet. Demuxers MAY treat audio data packets as invalid or partially process them if they are larger than 61,440 octets in an Ogg Opus stream with channel mapping families 0 or 1. Demuxers MAY treat audio data packets as invalid or partially process them in any Ogg Opus stream if the packet is larger than 61,440 octets and also larger than 7,680 octets per Opus stream. The presence of an extremely large packet in the stream could indicate a memory exhaustion attack or stream corruption. In an Ogg Opus stream, the largest possible valid packet that does not use padding has a size of (61,298*N - 2) octets. With 255 streams, this is 15,630,988 octets and can span up to 61,298 Ogg pages, all but one of which will have a granule position of -1. This is of course a very extreme packet, consisting of 255 streams, each containing 120 ms of audio encoded as 2.5 ms frames, each frame using the maximum possible number of octets (1275) and stored in the least efficient manner allowed (a VBR code 3 Opus packet). Even in such a packet, most of the data will be zeros as 2.5 ms frames cannot actually use all 1275 octets. The largest packet consisting of entirely useful data is (15,326*N - 2) octets. This corresponds to 120 ms of audio encoded as 10 ms frames in either SILK or Hybrid mode, but at a data rate of over 1 Mbps, which makes little sense for the quality achieved. A more reasonable limit is (7,664*N - 2) octets. This corresponds to 120 ms of audio encoded as 20 ms stereo CELT mode frames, with a total bitrate just under 511 kbps (not counting the Ogg encapsulation overhead). For channel mapping family 1, N=8 provides a reasonable upper bound, as it allows for each of the 8 possible output channels to be decoded from a separate stereo Opus stream. This gives a size of 61,310 octets, which is rounded up to a multiple of 1,024 octets to yield the audio data packet size of 61,440 octets that any implementation is expected to be able to process successfully.
    When encoding Opus streams, Ogg muxers SHOULD take into account the algorithmic delay of the Opus encoder. In encoders derived from the reference implementation , the number of samples can be queried with:
    To achieve good quality in the very first samples of a stream, implementations MAY use linear predictive coding (LPC) extrapolation to generate at least 120 extra samples at the beginning to avoid the Opus encoder having to encode a discontinuous signal. For more information on linear prediction, see . For an input file containing 'length' samples, the implementation SHOULD set the pre-skip header value to (delay_samples + extra_samples), encode at least (length + delay_samples + extra_samples) samples, and set the granule position of the last page to (length + delay_samples + extra_samples). This ensures that the encoded file has the same duration as the original, with no time offset. The best way to pad the end of the stream is to also use LPC extrapolation, but zero-padding is also acceptable.
    The first step in LPC extrapolation is to compute linear prediction coefficients. When extending the end of the signal, order-N (typically with N ranging from 8 to 40) LPC analysis is performed on a window near the end of the signal. The last N samples are used as memory to an infinite impulse response (IIR) filter. The filter is then applied on a zero input to extrapolate the end of the signal. Let a(k) be the kth LPC coefficient and x(n) be the nth sample of the signal, each new sample past the end of the signal is computed as:
    The process is repeated independently for each channel. It is possible to extend the beginning of the signal by applying the same process backward in time. When extending the beginning of the signal, it is best to apply a "fade in" to the extrapolated signal, e.g. by multiplying it by a half-Hanning window .
    In some applications, such as Internet radio, it is desirable to cut a long stream into smaller chains, e.g. so the comment header can be updated. This can be done simply by separating the input streams into segments and encoding each segment independently. The drawback of this approach is that it creates a small discontinuity at the boundary due to the lossy nature of Opus. A muxer MAY avoid this discontinuity by using the following procedure: Encode the last frame of the first segment as an independent frame by turning off all forms of inter-frame prediction. De-emphasis is allowed. Set the granule position of the last page to a point near the end of the last frame. Begin the second segment with a copy of the last frame of the first segment. Set the pre-skip value of the second stream in such a way as to properly join the two streams. Continue the encoding process normally from there, without any reset to the encoder. In encoders derived from the reference implementation, inter-frame prediction can be turned off by calling:
    For best results, this implementation requires that prediction be explicitly enabled again before resuming normal encoding, even after a reset.
    A brief summary of major implementations of this draft is available at , along with their status. [Note to RFC Editor: please remove this entire section before final publication per , along with its references.]
    Implementations of the Opus codec need to take appropriate security considerations into account, as outlined in . This is just as much a problem for the container as it is for the codec itself. Malicious payloads and/or input streams can be used to attack codec implementations. Implementations MUST NOT overrun their allocated memory nor consume excessive resources when decoding payloads or processing input streams. Although problems in encoding applications are typically rarer, this still applies to a muxer, as vulnerabilities would allow an attacker to attack transcoding gateways. Header parsing code contains the most likely area for potential overruns. It is important for implementations to ensure their buffers contain enough data for all of the required fields before attempting to read it (for example, for all of the channel map data in the ID header). Implementations would do well to validate the indices of the channel map, also, to ensure they meet all of the restrictions outlined in , in order to avoid attempting to read data from channels that do not exist. To avoid excessive resource usage, we advise implementations to be especially wary of streams that might cause them to process far more data than was actually transmitted. For example, a relatively small comment header may contain values for the string lengths or user comment list length that imply that it is many gigabytes in size. Even computing the size of the required buffer could overflow a 32-bit integer, and actually attempting to allocate such a buffer before verifying it would be a reasonable size is a bad idea. After reading the user comment list length, implementations might wish to verify that the header contains at least the minimum amount of data for that many comments (4 additional octets per comment, to indicate each has a length of zero) before proceeding any further, again taking care to avoid overflow in these calculations. If allocating an array of pointers to point at these strings, the size of the pointers may be larger than 4 octets, potentially requiring a separate overflow check. Another bug in this class we have observed more than once involves the handling of invalid data at the end of a stream. Often, implementations will seek to the end of a stream to locate the last timestamp in order to compute its total duration. If they do not find a valid capture pattern and Ogg page from the desired logical stream, they will back up and try again. If care is not taken to avoid re-scanning data that was already scanned, this search can quickly devolve into something with a complexity that is quadratic in the amount of invalid data. In general when seeking, implementations will wish to be cautious about the effects of invalid granule position values, and ensure all algorithms will continue to make progress and eventually terminate, even if these are missing or out-of-order. Like most other container formats, Ogg Opus streams SHOULD NOT be used with insecure ciphers or cipher modes that are vulnerable to known-plaintext attacks. Elements such as the Ogg page capture pattern and the magic signatures in the ID header and the comment header all have easily predictable values, in addition to various elements of the codec data itself.
    An "Ogg Opus file" consists of one or more sequentially multiplexed segments, each containing exactly one Ogg Opus stream. The RECOMMENDED mime-type for Ogg Opus files is "audio/ogg". If more specificity is desired, one MAY indicate the presence of Opus streams using the codecs parameter defined in and , e.g.,
    for an Ogg Opus file. The RECOMMENDED filename extension for Ogg Opus files is '.opus'. When Opus is concurrently multiplexed with other streams in an Ogg container, one SHOULD use one of the "audio/ogg", "video/ogg", or "application/ogg" mime-types, as defined in . Such streams are not strictly "Ogg Opus files" as described above, since they contain more than a single Opus stream per sequentially multiplexed segment, e.g. video or multiple audio tracks. In such cases the the '.opus' filename extension is NOT RECOMMENDED. In either case, this document updates to add 'opus' as a codecs parameter value with char[8]: 'OpusHead' as Codec Identifier.
    This document updates the IANA Media Types registry to add .opus as a file extension for "audio/ogg", and to add itself as a reference alongside for "audio/ogg", "video/ogg", and "application/ogg" Media Types. This document defines a new registry "Opus Channel Mapping Families" to indicate how the semantic meanings of the channels in a multi-channel Opus stream are described. IANA is requested to create a new name space of "Opus Channel Mapping Families". This will be a new registry on the IANA Matrix, and not a subregistry of an existing registry. Modifications to this registry follow the "Specification Required" registration policy as defined in . Each registry entry consists of a Channel Mapping Family Number, which is specified in decimal in the range 0 to 255, inclusive, and a Reference (or list of references) Each Reference must point to sufficient documentation to describe what information is coded in the Opus identification header for this channel mapping family, how a demuxer determines the Stream Count ('N') and Coupled Stream Count ('M') from this information, and how it determines the proper interpretation of each of the decoded channels. This document defines three initial assignments for this registry. ValueReference 0[RFCXXXX] 1[RFCXXXX] 255[RFCXXXX] The designated expert will determine if the Reference points to a specification that meets the requirements for permanence and ready availability laid out in  and that it specifies the information described above with sufficient clarity to allow interoperable implementations.
    Thanks to Ben Campbell, Joel M. Halpern, Mark Harris, Greg Maxwell, Christopher "Monty" Montgomery, Jean-Marc Valin, Stephan Wenger, and Mo Zanaty for their valuable contributions to this document. Additional thanks to Andrew D'Addesio, Greg Maxwell, and Vincent Penquerc'h for their feedback based on early implementations.
    In , "RFCXXXX" is to be replaced with the RFC number assigned to this draft.
    &rfc2119; &rfc3533; &rfc3629; &rfc5226; &rfc5334; &rfc6381; &rfc6716; Loudness Recommendation EBU R128 EBU Technical Committee Ogg Vorbis I Format Specification: Comment Field and Header Specification &rfc4732; &rfc6982; &rfc7587; FLAC - Free Lossless Audio Codec Format Description Hann window Wikipedia Linear Predictive Coding Wikipedia Autocorrelation LPC coeff generation algorithm (Vorbis source code) Q (number format) Wikipedia VorbisComment: Replay Gain Granulepos Encoding and How Seeking Really Works The Vorbis I Specification, Section 4.3.9 Output Channel Order The Vorbis I Specification, Appendix A: Embedding Vorbis into an Ogg stream Multiple Channel Audio Data and WAVE Files Microsoft Corporation
    mumble-1.3.4/3rdparty/opus-src/doc/build_isobmff.sh0000775000175000017500000000411014010707327022070 0ustar builderbuilder#!/bin/sh # Copyright (c) 2014 Xiph.Org Foundation and Mozilla Foundation # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # - Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # - Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER # OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #Stop on errors set -e #Set the CWD to the location of this script [ -n "${0%/*}" ] && cd "${0%/*}" HTML=opus_in_isobmff.html echo downloading updates... CSS=${HTML%%.html}.css wget -q http://vfrmaniac.fushizen.eu/contents/${HTML} -O ${HTML} wget -q http://vfrmaniac.fushizen.eu/style.css -O ${CSS} echo updating links... cat ${HTML} | sed -e "s/\\.\\.\\/style.css/${CSS}/" > ${HTML}+ && mv ${HTML}+ ${HTML} echo stripping... cat ${HTML} | sed -e 's///g' > ${HTML}+ && mv ${HTML}+ ${HTML} cat ${HTML} | sed -e 's/ *$//g' > ${HTML}+ && mv ${HTML}+ ${HTML} cat ${CSS} | sed -e 's/ *$//g' > ${CSS}+ && mv ${CSS}+ ${CSS} VERSION=$(fgrep Version ${HTML} | sed 's/.*Version \([0-9]\.[0-9]\.[0-9]\).*/\1/') echo Now at version ${VERSION} mumble-1.3.4/3rdparty/opus-src/doc/trivial_example.c0000664000175000017500000001244414010707327022267 0ustar builderbuilder/* Copyright (c) 2013 Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* This is meant to be a simple example of encoding and decoding audio using Opus. It should make it easy to understand how the Opus API works. For more information, see the full API documentation at: https://www.opus-codec.org/docs/ */ #include #include #include #include #include /*The frame size is hardcoded for this sample code but it doesn't have to be*/ #define FRAME_SIZE 960 #define SAMPLE_RATE 48000 #define CHANNELS 2 #define APPLICATION OPUS_APPLICATION_AUDIO #define BITRATE 64000 #define MAX_FRAME_SIZE 6*960 #define MAX_PACKET_SIZE (3*1276) int main(int argc, char **argv) { char *inFile; FILE *fin; char *outFile; FILE *fout; opus_int16 in[FRAME_SIZE*CHANNELS]; opus_int16 out[MAX_FRAME_SIZE*CHANNELS]; unsigned char cbits[MAX_PACKET_SIZE]; int nbBytes; /*Holds the state of the encoder and decoder */ OpusEncoder *encoder; OpusDecoder *decoder; int err; if (argc != 3) { fprintf(stderr, "usage: trivial_example input.pcm output.pcm\n"); fprintf(stderr, "input and output are 16-bit little-endian raw files\n"); return EXIT_FAILURE; } /*Create a new encoder state */ encoder = opus_encoder_create(SAMPLE_RATE, CHANNELS, APPLICATION, &err); if (err<0) { fprintf(stderr, "failed to create an encoder: %s\n", opus_strerror(err)); return EXIT_FAILURE; } /* Set the desired bit-rate. You can also set other parameters if needed. The Opus library is designed to have good defaults, so only set parameters you know you need. Doing otherwise is likely to result in worse quality, but better. */ err = opus_encoder_ctl(encoder, OPUS_SET_BITRATE(BITRATE)); if (err<0) { fprintf(stderr, "failed to set bitrate: %s\n", opus_strerror(err)); return EXIT_FAILURE; } inFile = argv[1]; fin = fopen(inFile, "r"); if (fin==NULL) { fprintf(stderr, "failed to open input file: %s\n", strerror(errno)); return EXIT_FAILURE; } /* Create a new decoder state. */ decoder = opus_decoder_create(SAMPLE_RATE, CHANNELS, &err); if (err<0) { fprintf(stderr, "failed to create decoder: %s\n", opus_strerror(err)); return EXIT_FAILURE; } outFile = argv[2]; fout = fopen(outFile, "w"); if (fout==NULL) { fprintf(stderr, "failed to open output file: %s\n", strerror(errno)); return EXIT_FAILURE; } while (1) { int i; unsigned char pcm_bytes[MAX_FRAME_SIZE*CHANNELS*2]; int frame_size; /* Read a 16 bits/sample audio frame. */ fread(pcm_bytes, sizeof(short)*CHANNELS, FRAME_SIZE, fin); if (feof(fin)) break; /* Convert from little-endian ordering. */ for (i=0;i>8)&0xFF; } /* Write the decoded audio to file. */ fwrite(pcm_bytes, sizeof(short), frame_size*CHANNELS, fout); } /*Destroy the encoder state*/ opus_encoder_destroy(encoder); opus_decoder_destroy(decoder); fclose(fin); fclose(fout); return EXIT_SUCCESS; } mumble-1.3.4/3rdparty/opus-src/doc/opus_in_isobmff.html0000664000175000017500000012055214010707327023005 0ustar builderbuilder Encapsulation of Opus in ISO Base Media File Format Encapsulation of Opus in ISO Base Media File Format
    last updated: April 28, 2016

    mumble-1.3.4/3rdparty/opus-src/doc/build_draft.sh0000775000175000017500000001007614010707327021553 0ustar builderbuilder#!/bin/sh # Copyright (c) 2011-2012 Xiph.Org Foundation and Mozilla Corporation # # This file is extracted from RFC6716. Please see that RFC for additional # information. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # - Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # - Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # - Neither the name of Internet Society, IETF or IETF Trust, nor the # names of specific contributors, may be used to endorse or promote # products derived from this software without specific prior written # permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER # OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #Stop on errors set -e #Set the CWD to the location of this script [ -n "${0%/*}" ] && cd "${0%/*}" toplevel=".." destdir="opus_source" echo packaging source code rm -rf "${destdir}" mkdir "${destdir}" mkdir "${destdir}/src" mkdir "${destdir}/silk" mkdir "${destdir}/silk/float" mkdir "${destdir}/silk/fixed" mkdir "${destdir}/celt" mkdir "${destdir}/include" for f in `cat "${toplevel}"/opus_sources.mk "${toplevel}"/celt_sources.mk \ "${toplevel}"/silk_sources.mk "${toplevel}"/opus_headers.mk \ "${toplevel}"/celt_headers.mk "${toplevel}"/silk_headers.mk \ | grep '\.[ch]' | sed -e 's/^.*=//' -e 's/\\\\//'` ; do cp -a "${toplevel}/${f}" "${destdir}/${f}" done cp -a "${toplevel}"/src/opus_demo.c "${destdir}"/src/ cp -a "${toplevel}"/src/opus_compare.c "${destdir}"/src/ cp -a "${toplevel}"/celt/opus_custom_demo.c "${destdir}"/celt/ cp -a "${toplevel}"/Makefile.unix "${destdir}"/Makefile cp -a "${toplevel}"/opus_sources.mk "${destdir}"/ cp -a "${toplevel}"/celt_sources.mk "${destdir}"/ cp -a "${toplevel}"/silk_sources.mk "${destdir}"/ cp -a "${toplevel}"/README.draft "${destdir}"/README cp -a "${toplevel}"/COPYING "${destdir}"/COPYING cp -a "${toplevel}"/tests/run_vectors.sh "${destdir}"/ GZIP=-9 tar --owner=root --group=root --format=v7 -czf opus_source.tar.gz "${destdir}" echo building base64 version cat opus_source.tar.gz| base64 | tr -d '\n' | fold -w 64 | \ sed -e 's/^/\###/' -e 's/$/\<\/spanx\>\/' > \ opus_source.base64 #echo '
    ' > opus_compare_escaped.c #echo '' >> opus_compare_escaped.c #echo '> opus_compare_escaped.c #cat opus_compare.c >> opus_compare_escaped.c #echo ']]>' >> opus_compare_escaped.c #echo '' >> opus_compare_escaped.c #echo '
    ' >> opus_compare_escaped.c if [[ ! -d ../opus_testvectors ]] ; then echo "Downloading test vectors..." wget 'http://opus-codec.org/testvectors/opus_testvectors.tar.gz' tar -C .. -xvzf opus_testvectors.tar.gz fi echo '
    ' > testvectors_sha1 echo '' >> testvectors_sha1 echo '> testvectors_sha1 (cd ../opus_testvectors; sha1sum *.bit *.dec) >> testvectors_sha1 #cd opus_testvectors #sha1sum *.bit *.dec >> ../testvectors_sha1 #cd .. echo ']]>' >> testvectors_sha1 echo '' >> testvectors_sha1 echo '
    ' >> testvectors_sha1 echo running xml2rfc xml2rfc draft-ietf-codec-opus.xml draft-ietf-codec-opus.html & xml2rfc draft-ietf-codec-opus.xml wait mumble-1.3.4/3rdparty/opus-src/doc/customdoxygen.css0000664000175000017500000004271214010707327022361 0ustar builderbuilder/* The standard CSS for doxygen */ body, table, div, p, dl { font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif; font-size: 13px; line-height: 1.3; } /* @group Heading Levels */ h1 { font-size: 150%; } .title { font-size: 150%; font-weight: bold; margin: 10px 2px; } h2 { font-size: 120%; } h3 { font-size: 100%; } dt { font-weight: bold; } div.multicol { -moz-column-gap: 1em; -webkit-column-gap: 1em; -moz-column-count: 3; -webkit-column-count: 3; } p.startli, p.startdd, p.starttd { margin-top: 2px; } p.endli { margin-bottom: 0px; } p.enddd { margin-bottom: 4px; } p.endtd { margin-bottom: 2px; } /* @end */ caption { font-weight: bold; } span.legend { font-size: 70%; text-align: center; } h3.version { font-size: 90%; text-align: center; } div.qindex, div.navtab{ background-color: #F1F1F1; border: 1px solid #BDBDBD; text-align: center; } div.qindex, div.navpath { width: 100%; line-height: 140%; } div.navtab { margin-right: 15px; } /* @group Link Styling */ a { color: #646464; font-weight: normal; text-decoration: none; } .contents a:visited { color: #747474; } a:hover { text-decoration: underline; } a.qindex { font-weight: bold; } a.qindexHL { font-weight: bold; background-color: #B8B8B8; color: #ffffff; border: 1px double #A8A8A8; } .contents a.qindexHL:visited { color: #ffffff; } a.el { font-weight: bold; } a.elRef { } a.code, a.code:visited { color: #4665A2; } a.codeRef, a.codeRef:visited { color: #4665A2; } /* @end */ dl.el { margin-left: -1cm; } .fragment { font-family: monospace, fixed; font-size: 105%; } pre.fragment { border: 1px solid #D5D5D5; background-color: #FCFCFC; padding: 4px 6px; margin: 4px 8px 4px 2px; overflow: auto; word-wrap: break-word; font-size: 9pt; line-height: 125%; } div.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px; padding: 0.2em; border: solid thin #333; border-radius: 0.5em; -webkit-border-radius: .5em; -moz-border-radius: .5em; box-shadow: 2px 2px 3px #999; -webkit-box-shadow: 2px 2px 3px #999; -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000); } div.groupHeader { margin-left: 16px; margin-top: 12px; font-weight: bold; } div.groupText { margin-left: 16px; font-style: italic; } body { background-color: white; color: black; margin: 0; } div.contents { margin-top: 10px; margin-left: 8px; margin-right: 8px; } td.indexkey { background-color: #F1F1F1; font-weight: bold; border: 1px solid #D5D5D5; margin: 2px 0px 2px 0; padding: 2px 10px; white-space: nowrap; vertical-align: top; } td.indexvalue { background-color: #F1F1F1; border: 1px solid #D5D5D5; padding: 2px 10px; margin: 2px 0px; } tr.memlist { background-color: #F2F2F2; } p.formulaDsp { text-align: center; } img.formulaDsp { } img.formulaInl { vertical-align: middle; } div.center { text-align: center; margin-top: 0px; margin-bottom: 0px; padding: 0px; } div.center img { border: 0px; } address.footer { text-align: right; padding-right: 12px; } img.footer { border: 0px; vertical-align: middle; } /* @group Code Colorization */ span.keyword { color: #008000 } span.keywordtype { color: #604020 } span.keywordflow { color: #e08000 } span.comment { color: #800000 } span.preprocessor { color: #806020 } span.stringliteral { color: #002080 } span.charliteral { color: #008080 } span.vhdldigit { color: #ff00ff } span.vhdlchar { color: #000000 } span.vhdlkeyword { color: #700070 } span.vhdllogic { color: #ff0000 } blockquote { background-color: #F9F9F9; border-left: 2px solid #B8B8B8; margin: 0 24px 0 4px; padding: 0 12px 0 16px; } /* @end */ /* .search { color: #003399; font-weight: bold; } form.search { margin-bottom: 0px; margin-top: 0px; } input.search { font-size: 75%; color: #000080; font-weight: normal; background-color: #e8eef2; } */ td.tiny { font-size: 75%; } .dirtab { padding: 4px; border-collapse: collapse; border: 1px solid #BDBDBD; } th.dirtab { background: #F1F1F1; font-weight: bold; } hr { height: 0px; border: none; border-top: 1px solid #7A7A7A; } hr.footer { height: 1px; } /* @group Member Descriptions */ table.memberdecls { border-spacing: 0px; padding: 0px; } .mdescLeft, .mdescRight, .memItemLeft, .memItemRight, .memTemplItemLeft, .memTemplItemRight, .memTemplParams { background-color: #FAFAFA; border: none; margin: 4px; padding: 1px 0 0 8px; } .mdescLeft, .mdescRight { padding: 0px 8px 4px 8px; color: #555; } .memItemLeft, .memItemRight, .memTemplParams { border-top: 1px solid #D5D5D5; } .memItemLeft, .memTemplItemLeft { white-space: nowrap; } .memItemRight { width: 100%; } .memTemplParams { color: #747474; white-space: nowrap; } /* @end */ /* @group Member Details */ /* Styles for detailed member documentation */ .memtemplate { font-size: 80%; color: #747474; font-weight: normal; margin-left: 9px; } .memnav { background-color: #F1F1F1; border: 1px solid #BDBDBD; text-align: center; margin: 2px; margin-right: 15px; padding: 2px; } .mempage { width: 100%; } .memitem { padding: 0; margin-bottom: 10px; margin-right: 5px; } .memname { white-space: nowrap; font-weight: bold; margin-left: 6px; } .memproto, dl.reflist dt { border-top: 1px solid #C0C0C0; border-left: 1px solid #C0C0C0; border-right: 1px solid #C0C0C0; padding: 6px 0px 6px 0px; color: #3D3D3D; font-weight: bold; text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); /* opera specific markup */ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); border-top-right-radius: 8px; border-top-left-radius: 8px; /* firefox specific markup */ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; -moz-border-radius-topright: 8px; -moz-border-radius-topleft: 8px; /* webkit specific markup */ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); -webkit-border-top-right-radius: 8px; -webkit-border-top-left-radius: 8px; background-image:url('nav_f.png'); background-repeat:repeat-x; background-color: #EAEAEA; } .memdoc, dl.reflist dd { border-bottom: 1px solid #C0C0C0; border-left: 1px solid #C0C0C0; border-right: 1px solid #C0C0C0; padding: 2px 5px; background-color: #FCFCFC; border-top-width: 0; /* opera specific markup */ border-bottom-left-radius: 8px; border-bottom-right-radius: 8px; box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); /* firefox specific markup */ -moz-border-radius-bottomleft: 8px; -moz-border-radius-bottomright: 8px; -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; background-image: -moz-linear-gradient(center top, #FFFFFF 0%, #FFFFFF 60%, #F9F9F9 95%, #F2F2F2); /* webkit specific markup */ -webkit-border-bottom-left-radius: 8px; -webkit-border-bottom-right-radius: 8px; -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); background-image: -webkit-gradient(linear,center top,center bottom,from(#FFFFFF), color-stop(0.6,#FFFFFF), color-stop(0.60,#FFFFFF), color-stop(0.95,#F9F9F9), to(#F2F2F2)); } dl.reflist dt { padding: 5px; } dl.reflist dd { margin: 0px 0px 10px 0px; padding: 5px; } .paramkey { text-align: right; } .paramtype { white-space: nowrap; } .paramname { color: #602020; white-space: nowrap; } .paramname em { font-style: normal; } .params, .retval, .exception, .tparams { border-spacing: 6px 2px; } .params .paramname, .retval .paramname { font-weight: bold; vertical-align: top; } .params .paramtype { font-style: italic; vertical-align: top; } .params .paramdir { font-family: "courier new",courier,monospace; vertical-align: top; } /* @end */ /* @group Directory (tree) */ /* for the tree view */ .ftvtree { font-family: sans-serif; margin: 0px; } /* these are for tree view when used as main index */ .directory { font-size: 9pt; font-weight: bold; margin: 5px; } .directory h3 { margin: 0px; margin-top: 1em; font-size: 11pt; } /* The following two styles can be used to replace the root node title with an image of your choice. Simply uncomment the next two styles, specify the name of your image and be sure to set 'height' to the proper pixel height of your image. */ /* .directory h3.swap { height: 61px; background-repeat: no-repeat; background-image: url("yourimage.gif"); } .directory h3.swap span { display: none; } */ .directory > h3 { margin-top: 0; } .directory p { margin: 0px; white-space: nowrap; } .directory div { display: none; margin: 0px; } .directory img { vertical-align: -30%; } /* these are for tree view when not used as main index */ .directory-alt { font-size: 100%; font-weight: bold; } .directory-alt h3 { margin: 0px; margin-top: 1em; font-size: 11pt; } .directory-alt > h3 { margin-top: 0; } .directory-alt p { margin: 0px; white-space: nowrap; } .directory-alt div { display: none; margin: 0px; } .directory-alt img { vertical-align: -30%; } /* @end */ div.dynheader { margin-top: 8px; } address { font-style: normal; color: #464646; } table.doxtable { border-collapse:collapse; margin-top: 4px; margin-bottom: 4px; } table.doxtable td, table.doxtable th { border: 1px solid #4A4A4A; padding: 3px 7px 2px; } table.doxtable th { background-color: #5B5B5B; color: #FFFFFF; font-size: 110%; padding-bottom: 4px; padding-top: 5px; } table.fieldtable { width: 100%; margin-bottom: 10px; border: 1px solid #C0C0C0; border-spacing: 0px; -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); } .fieldtable td, .fieldtable th { padding: 3px 7px 2px; } .fieldtable td.fieldtype, .fieldtable td.fieldname { white-space: nowrap; border-right: 1px solid #C0C0C0; border-bottom: 1px solid #C0C0C0; vertical-align: top; } .fieldtable td.fielddoc { border-bottom: 1px solid #C0C0C0; width: 100%; } .fieldtable tr:last-child td { border-bottom: none; } .fieldtable th { background-image:url('nav_f.png'); background-repeat:repeat-x; background-color: #EAEAEA; font-size: 90%; color: #3D3D3D; padding-bottom: 4px; padding-top: 5px; text-align:left; -moz-border-radius-topleft: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-left-radius: 4px; -webkit-border-top-right-radius: 4px; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom: 1px solid #C0C0C0; } .tabsearch { top: 0px; left: 10px; height: 36px; background-image: url('tab_b.png'); z-index: 101; overflow: hidden; font-size: 13px; } .navpath ul { font-size: 11px; background-image:url('tab_b.png'); background-repeat:repeat-x; height:30px; line-height:30px; color:#ABABAB; border:solid 1px #D3D3D3; overflow:hidden; margin:0px; padding:0px; } .navpath li { list-style-type:none; float:left; padding-left:10px; padding-right:15px; background-image:url('bc_s.png'); background-repeat:no-repeat; background-position:right; color:#595959; } .navpath li.navelem a { height:32px; display:block; text-decoration: none; outline: none; } .navpath li.navelem a:hover { color:#929292; } .navpath li.footer { list-style-type:none; float:right; padding-left:10px; padding-right:15px; background-image:none; background-repeat:no-repeat; background-position:right; color:#595959; font-size: 8pt; } div.summary { float: right; font-size: 8pt; padding-right: 5px; width: 50%; text-align: right; } div.summary a { white-space: nowrap; } div.ingroups { margin-left: 5px; font-size: 8pt; padding-left: 5px; width: 50%; text-align: left; } div.ingroups a { white-space: nowrap; } div.header { background-image:url('nav_h.png'); background-repeat:repeat-x; background-color: #FAFAFA; margin: 0px; border-bottom: 1px solid #D5D5D5; } div.headertitle { padding: 5px 5px 5px 7px; } dl { padding: 0 0 0 10px; } /* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug */ dl.section { border-left:4px solid; padding: 0 0 0 6px; } dl.note { border-color: #D0C000; } dl.warning, dl.attention { border-color: #FF0000; } dl.pre, dl.post, dl.invariant { border-color: #00D000; } dl.deprecated { border-color: #505050; } dl.todo { border-color: #00C0E0; } dl.test { border-color: #3030E0; } dl.bug { border-color: #C08050; } dl.section dd { margin-bottom: 6px; } #projectlogo { text-align: center; vertical-align: bottom; border-collapse: separate; } #projectlogo img { border: 0px none; } #projectname { font: 300% Tahoma, Arial,sans-serif; margin: 0px; padding: 2px 0px; } #projectbrief { font: 120% Tahoma, Arial,sans-serif; margin: 0px; padding: 0px; } #projectnumber { font: 100% Tahoma, Arial,sans-serif; margin: 0px; padding: 0px; } #titlearea { padding: 0px; margin: 0px; width: 100%; border-bottom: 1px solid #848484; } .image { text-align: center; } .dotgraph { text-align: center; } .mscgraph { text-align: center; } .caption { font-weight: bold; } div.zoom { border: 1px solid #AFAFAF; } dl.citelist { margin-bottom:50px; } dl.citelist dt { color:#545454; float:left; font-weight:bold; margin-right:10px; padding:5px; } dl.citelist dd { margin:2px 0; padding:5px 0; } div.toc { padding: 14px 25px; background-color: #F7F7F7; border: 1px solid #E3E3E3; border-radius: 7px 7px 7px 7px; float: right; height: auto; margin: 0 20px 10px 10px; width: 200px; } div.toc li { background: url("bdwn.png") no-repeat scroll 0 5px transparent; font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; margin-top: 5px; padding-left: 10px; padding-top: 2px; } div.toc h3 { font: bold 12px/1.2 Arial,FreeSans,sans-serif; color: #747474; border-bottom: 0 none; margin: 0; } div.toc ul { list-style: none outside none; border: medium none; padding: 0px; } div.toc li.level1 { margin-left: 0px; } div.toc li.level2 { margin-left: 15px; } div.toc li.level3 { margin-left: 30px; } div.toc li.level4 { margin-left: 45px; } @media print { #top { display: none; } #side-nav { display: none; } #nav-path { display: none; } body { overflow:visible; } h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } .summary { display: none; } .memitem { page-break-inside: avoid; } #doc-content { margin-left:0 !important; height:auto !important; width:auto !important; overflow:inherit; display:inline; } pre.fragment { overflow: visible; text-wrap: unrestricted; white-space: -moz-pre-wrap; /* Moz */ white-space: -pre-wrap; /* Opera 4-6 */ white-space: -o-pre-wrap; /* Opera 7 */ white-space: pre-wrap; /* CSS3 */ word-wrap: break-word; /* IE 5.5+ */ } } mumble-1.3.4/3rdparty/opus-src/doc/Makefile.am0000664000175000017500000000233414010707327020767 0ustar builderbuilder## Process this file with automake to produce Makefile.in DOCINPUTS = $(top_srcdir)/include/opus.h \ $(top_srcdir)/include/opus_multistream.h \ $(top_srcdir)/include/opus_defines.h \ $(top_srcdir)/include/opus_types.h \ $(top_srcdir)/include/opus_custom.h \ $(top_srcdir)/doc/header.html \ $(top_srcdir)/doc/footer.html \ $(top_srcdir)/doc/customdoxygen.css EXTRA_DIST = customdoxygen.css Doxyfile.in footer.html header.html \ opus_logo.svg trivial_example.c if HAVE_DOXYGEN all-local: doxygen-build.stamp doxygen-build.stamp: Doxyfile $(DOCINPUTS) doxygen touch $@ install-data-local: $(INSTALL) -d $(DESTDIR)$(docdir)/html/search for f in `find html -type f \! -name "installdox"`; do \ $(INSTALL_DATA) $$f $(DESTDIR)$(docdir)/$$f; \ done $(INSTALL) -d $(DESTDIR)$(mandir)/man3 cd man && find man3 -type f -name opus_*.3 \ -exec $(INSTALL_DATA) \{} $(DESTDIR)$(mandir)/man3 \; clean-local: $(RM) -r html $(RM) -r latex $(RM) -r man $(RM) doxygen-build.stamp $(RM) doxygen_sqlite3.db uninstall-local: $(RM) -r $(DESTDIR)$(docdir)/html $(RM) $(DESTDIR)$(mandir)/man3/opus_*.3 $(DESTDIR)$(mandir)/man3/opus.h.3 endif mumble-1.3.4/3rdparty/opus-src/doc/build_oggdraft.sh0000775000175000017500000000417614010707327022254 0ustar builderbuilder#!/bin/sh # Copyright (c) 2012 Xiph.Org Foundation and Mozilla Corporation # # This file is extracted from RFC6716. Please see that RFC for additional # information. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # - Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # - Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # - Neither the name of Internet Society, IETF or IETF Trust, nor the # names of specific contributors, may be used to endorse or promote # products derived from this software without specific prior written # permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER # OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #Stop on errors set -e #Set the CWD to the location of this script [ -n "${0%/*}" ] && cd "${0%/*}" if test -z `which xml2rfc 2> /dev/null`; then echo "Error: couldn't find xml2rfc." echo echo "Please install xml2rfc version 2 or later." echo "E.g. 'pip install xml2rfc' or follow the instructions" echo "on http://pypi.python.org/pypi/xml2rfc/ or tools.ietf.org." exit 1 fi echo running xml2rfc # version 2 syntax xml2rfc draft-ietf-codec-oggopus.xml --text --html mumble-1.3.4/3rdparty/opus-src/doc/Doxyfile.in0000664000175000017500000003545514010707327021060 0ustar builderbuilder# Doxyfile 1.8.10 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. # # All text after a double hash (##) is considered a comment and is placed in # front of the TAG it is preceding. # # All text after a single hash (#) is considered a comment and will be ignored. # The format is: # TAG = value [value, ...] # For lists, items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (\" \"). # Only non-default options are included below to improve portability # between doxygen versions. # #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # The PROJECT_NAME tag is a single word (or a sequence of words surrounded by # double-quotes, unless you are using Doxywizard) that should identify the # project for which the documentation is generated. This name is used in the # title of most generated pages and in a few other places. # The default value is: My Project. PROJECT_NAME = Opus # The PROJECT_NUMBER tag can be used to enter a project or revision number. This # could be handy for archiving the generated documentation or if some version # control system is used. PROJECT_NUMBER = @VERSION@ # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a # quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = "Opus audio codec (RFC 6716): API and operations manual" # With the PROJECT_LOGO tag one can specify a logo or an icon that is included # in the documentation. The maximum height of the logo should not exceed 55 # pixels and the maximum width should not exceed 200 pixels. Doxygen will copy # the logo to the output directory. PROJECT_LOGO = # If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path # before files name in the file list and in the header files. If set to NO the # shortest path that makes the file name unique will be used # The default value is: YES. FULL_PATH_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the # first line (until the first dot) of a Javadoc-style comment as the brief # description. If set to NO, the Javadoc-style will behave just like regular Qt- # style comments (thus requiring an explicit @brief command for a brief # description.) # The default value is: NO. JAVADOC_AUTOBRIEF = YES # The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen # uses this value to replace tabs by spaces in code fragments. # Minimum value: 1, maximum value: 16, default value: 4. TAB_SIZE = 8 # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. For # instance, some of the names that are used will be different. The list of all # members will be omitted, etc. # The default value is: NO. OPTIMIZE_OUTPUT_FOR_C = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in # documentation are documented, even if no documentation was available. Private # class members and static file members will be hidden unless the # EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. # Note: This will also disable the warnings about undocumented members that are # normally produced when WARNINGS is set to YES. # The default value is: NO. EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will # be included in the documentation. # The default value is: NO. EXTRACT_PRIVATE = NO # If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file # names in lower-case letters. If set to YES, upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. # The default value is: system dependent. CASE_SENSE_NAMES = YES # The ENABLED_SECTIONS tag can be used to enable conditional documentation # sections, marked by \if ... \endif and \cond # ... \endcond blocks. ENABLED_SECTIONS = #--------------------------------------------------------------------------- # Configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated to # standard output by doxygen. If QUIET is set to YES this implies that the # messages are off. # The default value is: NO. QUIET = YES # The WARNINGS tag can be used to turn on/off the warning messages that are # generated to standard error (stderr) by doxygen. If WARNINGS is set to YES # this implies that the warnings are on. # # Tip: Turn warnings on while writing the documentation. # The default value is: YES. WARNINGS = YES #--------------------------------------------------------------------------- # Configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag is used to specify the files and/or directories that contain # documented source files. You may enter file names like myfile.cpp or # directories like /usr/src/myproject. Separate the files or directories with # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING # Note: If this tag is empty the current directory is searched. INPUT = @top_srcdir@/include/opus.h \ @top_srcdir@/include/opus_types.h \ @top_srcdir@/include/opus_defines.h \ @top_srcdir@/include/opus_multistream.h \ @top_srcdir@/include/opus_custom.h # The EXCLUDE tag can be used to specify files and/or directories that should be # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. # # Note that relative paths are relative to the directory from which doxygen is # run. EXCLUDE = #--------------------------------------------------------------------------- # Configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all # compounds will be generated. Enable this if the project contains a lot of # classes, structs, unions or interfaces. # The default value is: YES. ALPHABETICAL_INDEX = NO #--------------------------------------------------------------------------- # Configuration options related to the HTML output #--------------------------------------------------------------------------- # The HTML_HEADER tag can be used to specify a user-defined HTML header file for # each generated HTML page. If the tag is left blank doxygen will generate a # standard header. # # To get valid HTML the header file that includes any scripts and style sheets # that doxygen needs, which is dependent on the configuration options used (e.g. # the setting GENERATE_TREEVIEW). It is highly recommended to start with a # default header using # doxygen -w html new_header.html new_footer.html new_stylesheet.css # YourConfigFile # and then modify the file new_header.html. See also section "Doxygen usage" # for information on how to generate the default header that doxygen normally # uses. # Note: The header is subject to change so you typically have to regenerate the # default header when upgrading to a newer version of doxygen. For a description # of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_HEADER = @top_srcdir@/doc/header.html # The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each # generated HTML page. If the tag is left blank doxygen will generate a standard # footer. See HTML_HEADER for more information on how to generate a default # footer and what special commands can be used inside the footer. See also # section "Doxygen usage" for information on how to generate the default footer # that doxygen normally uses. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FOOTER = @top_srcdir@/doc/footer.html # The HTML_STYLESHEET tag can be used to specify a user-defined cascading style # sheet that is used by each HTML page. It can be used to fine-tune the look of # the HTML output. If left blank doxygen will generate a default style sheet. # See also section "Doxygen usage" for information on how to generate the style # sheet that doxygen normally uses. # Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as # it is more robust and this tag (HTML_STYLESHEET) will in the future become # obsolete. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_STYLESHEET = @top_srcdir@/doc/customdoxygen.css # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note # that these files will be copied to the base HTML output directory. Use the # $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these # files. In the HTML_STYLESHEET file, use the file name only. Also note that the # files will be copied as-is; there are no commands or markers available. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_FILES = @top_srcdir@/doc/opus_logo.svg # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors # in the HTML output. For a value of 0 the output will use grayscales only. A # value of 255 will produce the most vivid colors. # Minimum value: 0, maximum value: 255, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_SAT = 0 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting this # to YES can help to show when doxygen was last run and thus if the # documentation is up to date. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_TIMESTAMP = YES # When MathJax is enabled you need to specify the location relative to the HTML # output directory using the MATHJAX_RELPATH option. The destination directory # should contain the MathJax.js script. For instance, if the mathjax directory # is located at the same level as the HTML output directory, then # MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax # Content Delivery Network so you can quickly see the result without installing # MathJax. However, it is strongly recommended to install a local copy of # MathJax from http://www.mathjax.org before deployment. # The default value is: http://cdn.mathjax.org/mathjax/latest. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_RELPATH = https://www.mathjax.org/mathjax #--------------------------------------------------------------------------- # Configuration options related to the LaTeX output #--------------------------------------------------------------------------- # The PAPER_TYPE tag can be used to set the paper type that is used by the # printer. # Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x # 14 inches) and executive (7.25 x 10.5 inches). # The default value is: a4. # This tag requires that the tag GENERATE_LATEX is set to YES. PAPER_TYPE = letter #--------------------------------------------------------------------------- # Configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for # classes and files. # The default value is: NO. GENERATE_MAN = YES #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names # in the source code. If set to NO, only conditional compilation will be # performed. Macro expansion can be done in a controlled way by setting # EXPAND_ONLY_PREDEF to YES. # The default value is: NO. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. MACRO_EXPANSION = YES # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then # the macro expansion is limited to the macros specified with the PREDEFINED and # EXPAND_AS_DEFINED tags. # The default value is: NO. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. EXPAND_ONLY_PREDEF = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by the # preprocessor. # This tag requires that the tag SEARCH_INCLUDES is set to YES. INCLUDE_PATH = # The PREDEFINED tag can be used to specify one or more macro names that are # defined before the preprocessor is started (similar to the -D option of e.g. # gcc). The argument of the tag is a list of macros of the form: name or # name=definition (no spaces). If the definition and the "=" are omitted, "=1" # is assumed. To prevent a macro definition from being undefined via #undef or # recursively expanded use the := operator instead of the = operator. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. PREDEFINED = OPUS_EXPORT= \ OPUS_CUSTOM_EXPORT= \ OPUS_CUSTOM_EXPORT_STATIC= \ OPUS_WARN_UNUSED_RESULT= \ OPUS_ARG_NONNULL(_x)= #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz (see: # http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent # Bell Labs. # Debian defaults to YES here, while Fedora and Homebrew default to NO. # So we set this based on whether the graphviz package is available at # configure time. # HAVE_DOT = @HAVE_DOT@ mumble-1.3.4/3rdparty/opus-src/doc/draft-ietf-codec-opus.xml0000664000175000017500000132653114010707327023552 0ustar builderbuilder Definition of the Opus Audio Codec Mozilla Corporation
    650 Castro Street Mountain View CA 94041 USA +1 650 903-0800 jmvalin@jmvalin.ca
    Skype Technologies S.A.
    Soder Malarstrand 43 Stockholm 11825 SE +46 73 085 7619 koen.vos@skype.net
    Mozilla Corporation
    650 Castro Street Mountain View CA 94041 USA +1 650 903-0800 tterriberry@mozilla.com
    General This document defines the Opus interactive speech and audio codec. Opus is designed to handle a wide range of interactive audio applications, including Voice over IP, videoconferencing, in-game chat, and even live, distributed music performances. It scales from low bitrate narrowband speech at 6 kb/s to very high quality stereo music at 510 kb/s. Opus uses both linear prediction (LP) and the Modified Discrete Cosine Transform (MDCT) to achieve good compression of both speech and music.
    The Opus codec is a real-time interactive audio codec designed to meet the requirements described in . It is composed of a linear prediction (LP)-based layer and a Modified Discrete Cosine Transform (MDCT)-based layer. The main idea behind using two layers is that in speech, linear prediction techniques (such as Code-Excited Linear Prediction, or CELP) code low frequencies more efficiently than transform (e.g., MDCT) domain techniques, while the situation is reversed for music and higher speech frequencies. Thus a codec with both layers available can operate over a wider range than either one alone and, by combining them, achieve better quality than either one individually. The primary normative part of this specification is provided by the source code in . Only the decoder portion of this software is normative, though a significant amount of code is shared by both the encoder and decoder. provides a decoder conformance test. The decoder contains a great deal of integer and fixed-point arithmetic which needs to be performed exactly, including all rounding considerations, so any useful specification requires domain-specific symbolic language to adequately define these operations. Additionally, any conflict between the symbolic representation and the included reference implementation must be resolved. For the practical reasons of compatibility and testability it would be advantageous to give the reference implementation priority in any disagreement. The C language is also one of the most widely understood human-readable symbolic representations for machine behavior. For these reasons this RFC uses the reference implementation as the sole symbolic representation of the codec. While the symbolic representation is unambiguous and complete it is not always the easiest way to understand the codec's operation. For this reason this document also describes significant parts of the codec in English and takes the opportunity to explain the rationale behind many of the more surprising elements of the design. These descriptions are intended to be accurate and informative, but the limitations of common English sometimes result in ambiguity, so it is expected that the reader will always read them alongside the symbolic representation. Numerous references to the implementation are provided for this purpose. The descriptions sometimes differ from the reference in ordering or through mathematical simplification wherever such deviation makes an explanation easier to understand. For example, the right shift and left shift operations in the reference implementation are often described using division and multiplication in the text. In general, the text is focused on the "what" and "why" while the symbolic representation most clearly provides the "how".
    The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119 . Various operations in the codec require bit-exact fixed-point behavior, even when writing a floating point implementation. The notation "Q<n>", where n is an integer, denotes the number of binary digits to the right of the decimal point in a fixed-point number. For example, a signed Q14 value in a 16-bit word can represent values from -2.0 to 1.99993896484375, inclusive. This notation is for informational purposes only. Arithmetic, when described, always operates on the underlying integer. E.g., the text will explicitly indicate any shifts required after a multiplication. Expressions, where included in the text, follow C operator rules and precedence, with the exception that the syntax "x**y" indicates x raised to the power y. The text also makes use of the following functions:
    The smallest of two values x and y.
    The largest of two values x and y.
    With this definition, if lo > hi, the lower bound is the one that is enforced.
    The sign of x, i.e.,
    0 . ]]>
    The absolute value of x, i.e.,
    The largest integer z such that z <= f.
    The smallest integer z such that z >= f.
    The integer z nearest to f, with ties rounded towards negative infinity, i.e.,
    The base-two logarithm of f.
    The minimum number of bits required to store a positive integer n in two's complement notation, or 0 for a non-positive integer n.
    0 ]]>
    Examples: ilog(-1) = 0 ilog(0) = 0 ilog(1) = 1 ilog(2) = 2 ilog(3) = 2 ilog(4) = 3 ilog(7) = 3
    The Opus codec scales from 6 kb/s narrowband mono speech to 510 kb/s fullband stereo music, with algorithmic delays ranging from 5 ms to 65.2 ms. At any given time, either the LP layer, the MDCT layer, or both, may be active. It can seamlessly switch between all of its various operating modes, giving it a great deal of flexibility to adapt to varying content and network conditions without renegotiating the current session. The codec allows input and output of various audio bandwidths, defined as follows: Abbreviation Audio Bandwidth Sample Rate (Effective) NB (narrowband) 4 kHz 8 kHz MB (medium-band) 6 kHz 12 kHz WB (wideband) 8 kHz 16 kHz SWB (super-wideband) 12 kHz 24 kHz FB (fullband) 20 kHz (*) 48 kHz (*) Although the sampling theorem allows a bandwidth as large as half the sampling rate, Opus never codes audio above 20 kHz, as that is the generally accepted upper limit of human hearing. Opus defines super-wideband (SWB) with an effective sample rate of 24 kHz, unlike some other audio coding standards that use 32 kHz. This was chosen for a number of reasons. The band layout in the MDCT layer naturally allows skipping coefficients for frequencies over 12 kHz, but does not allow cleanly dropping just those frequencies over 16 kHz. A sample rate of 24 kHz also makes resampling in the MDCT layer easier, as 24 evenly divides 48, and when 24 kHz is sufficient, it can save computation in other processing, such as Acoustic Echo Cancellation (AEC). Experimental changes to the band layout to allow a 16 kHz cutoff (32 kHz effective sample rate) showed potential quality degradations at other sample rates, and at typical bitrates the number of bits saved by using such a cutoff instead of coding in fullband (FB) mode is very small. Therefore, if an application wishes to process a signal sampled at 32 kHz, it should just use FB. The LP layer is based on the SILK codec . It supports NB, MB, or WB audio and frame sizes from 10 ms to 60 ms, and requires an additional 5 ms look-ahead for noise shaping estimation. A small additional delay (up to 1.5 ms) may be required for sampling rate conversion. Like Vorbis and many other modern codecs, SILK is inherently designed for variable-bitrate (VBR) coding, though the encoder can also produce constant-bitrate (CBR) streams. The version of SILK used in Opus is substantially modified from, and not compatible with, the stand-alone SILK codec previously deployed by Skype. This document does not serve to define that format, but those interested in the original SILK codec should see instead. The MDCT layer is based on the CELT codec . It supports NB, WB, SWB, or FB audio and frame sizes from 2.5 ms to 20 ms, and requires an additional 2.5 ms look-ahead due to the overlapping MDCT windows. The CELT codec is inherently designed for CBR coding, but unlike many CBR codecs it is not limited to a set of predetermined rates. It internally allocates bits to exactly fill any given target budget, and an encoder can produce a VBR stream by varying the target on a per-frame basis. The MDCT layer is not used for speech when the audio bandwidth is WB or less, as it is not useful there. On the other hand, non-speech signals are not always adequately coded using linear prediction, so for music only the MDCT layer should be used. A "Hybrid" mode allows the use of both layers simultaneously with a frame size of 10 or 20 ms and a SWB or FB audio bandwidth. The LP layer codes the low frequencies by resampling the signal down to WB. The MDCT layer follows, coding the high frequency portion of the signal. The cutoff between the two lies at 8 kHz, the maximum WB audio bandwidth. In the MDCT layer, all bands below 8 kHz are discarded, so there is no coding redundancy between the two layers. The sample rate (in contrast to the actual audio bandwidth) can be chosen independently on the encoder and decoder side, e.g., a fullband signal can be decoded as wideband, or vice versa. This approach ensures a sender and receiver can always interoperate, regardless of the capabilities of their actual audio hardware. Internally, the LP layer always operates at a sample rate of twice the audio bandwidth, up to a maximum of 16 kHz, which it continues to use for SWB and FB. The decoder simply resamples its output to support different sample rates. The MDCT layer always operates internally at a sample rate of 48 kHz. Since all the supported sample rates evenly divide this rate, and since the the decoder may easily zero out the high frequency portion of the spectrum in the frequency domain, it can simply decimate the MDCT layer output to achieve the other supported sample rates very cheaply. After conversion to the common, desired output sample rate, the decoder simply adds the output from the two layers together. To compensate for the different look-ahead required by each layer, the CELT encoder input is delayed by an additional 2.7 ms. This ensures that low frequencies and high frequencies arrive at the same time. This extra delay may be reduced by an encoder by using less look-ahead for noise shaping or using a simpler resampler in the LP layer, but this will reduce quality. However, the base 2.5 ms look-ahead in the CELT layer cannot be reduced in the encoder because it is needed for the MDCT overlap, whose size is fixed by the decoder. Both layers use the same entropy coder, avoiding any waste from "padding bits" between them. The hybrid approach makes it easy to support both CBR and VBR coding. Although the LP layer is VBR, the bit allocation of the MDCT layer can produce a final stream that is CBR by using all the bits left unused by the LP layer.
    The Opus codec includes a number of control parameters which can be changed dynamically during regular operation of the codec, without interrupting the audio stream from the encoder to the decoder. These parameters only affect the encoder since any impact they have on the bit-stream is signaled in-band such that a decoder can decode any Opus stream without any out-of-band signaling. Any Opus implementation can add or modify these control parameters without affecting interoperability. The most important encoder control parameters in the reference encoder are listed below.
    Opus supports all bitrates from 6 kb/s to 510 kb/s. All other parameters being equal, higher bitrate results in higher quality. For a frame size of 20 ms, these are the bitrate "sweet spots" for Opus in various configurations: 8-12 kb/s for NB speech, 16-20 kb/s for WB speech, 28-40 kb/s for FB speech, 48-64 kb/s for FB mono music, and 64-128 kb/s for FB stereo music.
    Opus can transmit either mono or stereo frames within a single stream. When decoding a mono frame in a stereo decoder, the left and right channels are identical, and when decoding a stereo frame in a mono decoder, the mono output is the average of the left and right channels. In some cases, it is desirable to encode a stereo input stream in mono (e.g., because the bitrate is too low to encode stereo with sufficient quality). The number of channels encoded can be selected in real-time, but by default the reference encoder attempts to make the best decision possible given the current bitrate.
    The audio bandwidths supported by Opus are listed in . Just like for the number of channels, any decoder can decode audio encoded at any bandwidth. For example, any Opus decoder operating at 8 kHz can decode a FB Opus frame, and any Opus decoder operating at 48 kHz can decode a NB frame. Similarly, the reference encoder can take a 48 kHz input signal and encode it as NB. The higher the audio bandwidth, the higher the required bitrate to achieve acceptable quality. The audio bandwidth can be explicitly specified in real-time, but by default the reference encoder attempts to make the best bandwidth decision possible given the current bitrate.
    Opus can encode frames of 2.5, 5, 10, 20, 40 or 60 ms. It can also combine multiple frames into packets of up to 120 ms. For real-time applications, sending fewer packets per second reduces the bitrate, since it reduces the overhead from IP, UDP, and RTP headers. However, it increases latency and sensitivity to packet losses, as losing one packet constitutes a loss of a bigger chunk of audio. Increasing the frame duration also slightly improves coding efficiency, but the gain becomes small for frame sizes above 20 ms. For this reason, 20 ms frames are a good choice for most applications.
    There are various aspects of the Opus encoding process where trade-offs can be made between CPU complexity and quality/bitrate. In the reference encoder, the complexity is selected using an integer from 0 to 10, where 0 is the lowest complexity and 10 is the highest. Examples of computations for which such trade-offs may occur are: The order of the pitch analysis whitening filter , The order of the short-term noise shaping filter, The number of states in delayed decision quantization of the residual signal, and The use of certain bit-stream features such as variable time-frequency resolution and the pitch post-filter.
    Audio codecs often exploit inter-frame correlations to reduce the bitrate at a cost in error propagation: after losing one packet several packets need to be received before the decoder is able to accurately reconstruct the speech signal. The extent to which Opus exploits inter-frame dependencies can be adjusted on the fly to choose a trade-off between bitrate and amount of error propagation.
    Another mechanism providing robustness against packet loss is the in-band Forward Error Correction (FEC). Packets that are determined to contain perceptually important speech information, such as onsets or transients, are encoded again at a lower bitrate and this re-encoded information is added to a subsequent packet.
    Opus is more efficient when operating with variable bitrate (VBR), which is the default. However, in some (rare) applications, constant bitrate (CBR) is required. There are two main reasons to operate in CBR mode: When the transport only supports a fixed size for each compressed frame When encryption is used for an audio stream that is either highly constrained (e.g. yes/no, recorded prompts) or highly sensitive When low-latency transmission is required over a relatively slow connection, then constrained VBR can also be used. This uses VBR in a way that simulates a "bit reservoir" and is equivalent to what MP3 (MPEG 1, Layer 3) and AAC (Advanced Audio Coding) call CBR (i.e., not true CBR due to the bit reservoir).
    Discontinuous Transmission (DTX) reduces the bitrate during silence or background noise. When DTX is enabled, only one frame is encoded every 400 milliseconds.
    The Opus encoder produces "packets", which are each a contiguous set of bytes meant to be transmitted as a single unit. The packets described here do not include such things as IP, UDP, or RTP headers which are normally found in a transport-layer packet. A single packet may contain multiple audio frames, so long as they share a common set of parameters, including the operating mode, audio bandwidth, frame size, and channel count (mono vs. stereo). This section describes the possible combinations of these parameters and the internal framing used to pack multiple frames into a single packet. This framing is not self-delimiting. Instead, it assumes that a higher layer (such as UDP or RTP or Ogg or Matroska ) will communicate the length, in bytes, of the packet, and it uses this information to reduce the framing overhead in the packet itself. A decoder implementation MUST support the framing described in this section. An alternative, self-delimiting variant of the framing is described in . Support for that variant is OPTIONAL. All bit diagrams in this document number the bits so that bit 0 is the most significant bit of the first byte, and bit 7 is the least significant. Bit 8 is thus the most significant bit of the second byte, etc. Well-formed Opus packets obey certain requirements, marked [R1] through [R7] below. These are summarized in along with appropriate means of handling malformed packets.
    A well-formed Opus packet MUST contain at least one byte [R1]. This byte forms a table-of-contents (TOC) header that signals which of the various modes and configurations a given packet uses. It is composed of a configuration number, "config", a stereo flag, "s", and a frame count code, "c", arranged as illustrated in . A description of each of these fields follows.
    The top five bits of the TOC byte, labeled "config", encode one of 32 possible configurations of operating mode, audio bandwidth, and frame size. As described, the LP (SILK) layer and MDCT (CELT) layer can be combined in three possible operating modes: A SILK-only mode for use in low bitrate connections with an audio bandwidth of WB or less, A Hybrid (SILK+CELT) mode for SWB or FB speech at medium bitrates, and A CELT-only mode for very low delay speech transmission as well as music transmission (NB to FB). The 32 possible configurations each identify which one of these operating modes the packet uses, as well as the audio bandwidth and the frame size. lists the parameters for each configuration. Configuration Number(s) Mode Bandwidth Frame Sizes 0...3 SILK-only NB 10, 20, 40, 60 ms 4...7 SILK-only MB 10, 20, 40, 60 ms 8...11 SILK-only WB 10, 20, 40, 60 ms 12...13 Hybrid SWB 10, 20 ms 14...15 Hybrid FB 10, 20 ms 16...19 CELT-only NB 2.5, 5, 10, 20 ms 20...23 CELT-only WB 2.5, 5, 10, 20 ms 24...27 CELT-only SWB 2.5, 5, 10, 20 ms 28...31 CELT-only FB 2.5, 5, 10, 20 ms The configuration numbers in each range (e.g., 0...3 for NB SILK-only) correspond to the various choices of frame size, in the same order. For example, configuration 0 has a 10 ms frame size and configuration 3 has a 60 ms frame size. One additional bit, labeled "s", signals mono vs. stereo, with 0 indicating mono and 1 indicating stereo. The remaining two bits of the TOC byte, labeled "c", code the number of frames per packet (codes 0 to 3) as follows: 0: 1 frame in the packet 1: 2 frames in the packet, each with equal compressed size 2: 2 frames in the packet, with different compressed sizes 3: an arbitrary number of frames in the packet This draft refers to a packet as a code 0 packet, code 1 packet, etc., based on the value of "c".
    This section describes how frames are packed according to each possible value of "c" in the TOC byte.
    When a packet contains multiple VBR frames (i.e., code 2 or 3), the compressed length of one or more of these frames is indicated with a one- or two-byte sequence, with the meaning of the first byte as follows: 0: No frame (discontinuous transmission (DTX) or lost packet) 1...251: Length of the frame in bytes 252...255: A second byte is needed. The total length is (second_byte*4)+first_byte The special length 0 indicates that no frame is available, either because it was dropped during transmission by some intermediary or because the encoder chose not to transmit it. Any Opus frame in any mode MAY have a length of 0. The maximum representable length is 255*4+255=1275 bytes. For 20 ms frames, this represents a bitrate of 510 kb/s, which is approximately the highest useful rate for lossily compressed fullband stereo music. Beyond this point, lossless codecs are more appropriate. It is also roughly the maximum useful rate of the MDCT layer, as shortly thereafter quality no longer improves with additional bits due to limitations on the codebook sizes. No length is transmitted for the last frame in a VBR packet, or for any of the frames in a CBR packet, as it can be inferred from the total size of the packet and the size of all other data in the packet. However, the length of any individual frame MUST NOT exceed 1275 bytes [R2], to allow for repacketization by gateways, conference bridges, or other software.
    For code 0 packets, the TOC byte is immediately followed by N-1 bytes of compressed data for a single frame (where N is the size of the packet), as illustrated in .
    For code 1 packets, the TOC byte is immediately followed by the (N-1)/2 bytes of compressed data for the first frame, followed by (N-1)/2 bytes of compressed data for the second frame, as illustrated in . The number of payload bytes available for compressed data, N-1, MUST be even for all code 1 packets [R3].
    For code 2 packets, the TOC byte is followed by a one- or two-byte sequence indicating the length of the first frame (marked N1 in ), followed by N1 bytes of compressed data for the first frame. The remaining N-N1-2 or N-N1-3 bytes are the compressed data for the second frame. This is illustrated in . A code 2 packet MUST contain enough bytes to represent a valid length. For example, a 1-byte code 2 packet is always invalid, and a 2-byte code 2 packet whose second byte is in the range 252...255 is also invalid. The length of the first frame, N1, MUST also be no larger than the size of the payload remaining after decoding that length for all code 2 packets [R4]. This makes, for example, a 2-byte code 2 packet with a second byte in the range 1...251 invalid as well (the only valid 2-byte code 2 packet is one where the length of both frames is zero).
    Code 3 packets signal the number of frames, as well as additional padding, called "Opus padding" to indicate that this padding is added at the Opus layer, rather than at the transport layer. Code 3 packets MUST have at least 2 bytes [R6,R7]. The TOC byte is followed by a byte encoding the number of frames in the packet in bits 2 to 7 (marked "M" in ), with bit 1 indicating whether or not Opus padding is inserted (marked "p" in ), and bit 0 indicating VBR (marked "v" in ). M MUST NOT be zero, and the audio duration contained within a packet MUST NOT exceed 120 ms [R5]. This limits the maximum frame count for any frame size to 48 (for 2.5 ms frames), with lower limits for longer frame sizes. illustrates the layout of the frame count byte.
    When Opus padding is used, the number of bytes of padding is encoded in the bytes following the frame count byte. Values from 0...254 indicate that 0...254 bytes of padding are included, in addition to the byte(s) used to indicate the size of the padding. If the value is 255, then the size of the additional padding is 254 bytes, plus the padding value encoded in the next byte. There MUST be at least one more byte in the packet in this case [R6,R7]. The additional padding bytes appear at the end of the packet, and MUST be set to zero by the encoder to avoid creating a covert channel. The decoder MUST accept any value for the padding bytes, however. Although this encoding provides multiple ways to indicate a given number of padding bytes, each uses a different number of bytes to indicate the padding size, and thus will increase the total packet size by a different amount. For example, to add 255 bytes to a packet, set the padding bit, p, to 1, insert a single byte after the frame count byte with a value of 254, and append 254 padding bytes with the value zero to the end of the packet. To add 256 bytes to a packet, set the padding bit to 1, insert two bytes after the frame count byte with the values 255 and 0, respectively, and append 254 padding bytes with the value zero to the end of the packet. By using the value 255 multiple times, it is possible to create a packet of any specific, desired size. Let P be the number of header bytes used to indicate the padding size plus the number of padding bytes themselves (i.e., P is the total number of bytes added to the packet). Then P MUST be no more than N-2 [R6,R7]. In the CBR case, let R=N-2-P be the number of bytes remaining in the packet after subtracting the (optional) padding. Then the compressed length of each frame in bytes is equal to R/M. The value R MUST be a non-negative integer multiple of M [R6]. The compressed data for all M frames follows, each of size R/M bytes, as illustrated in .
    In the VBR case, the (optional) padding length is followed by M-1 frame lengths (indicated by "N1" to "N[M-1]" in ), each encoded in a one- or two-byte sequence as described above. The packet MUST contain enough data for the M-1 lengths after removing the (optional) padding, and the sum of these lengths MUST be no larger than the number of bytes remaining in the packet after decoding them [R7]. The compressed data for all M frames follows, each frame consisting of the indicated number of bytes, with the final frame consuming any remaining bytes before the final padding, as illustrated in . The number of header bytes (TOC byte, frame count byte, padding length bytes, and frame length bytes), plus the signaled length of the first M-1 frames themselves, plus the signaled length of the padding MUST be no larger than N, the total size of the packet.
    Simplest case, one NB mono 20 ms SILK frame:
    Two FB mono 5 ms CELT frames of the same compressed size:
    Two FB mono 20 ms Hybrid frames of different compressed size:
    Four FB stereo 20 ms CELT frames of the same compressed size:
    A receiver MUST NOT process packets which violate any of the rules above as normal Opus packets. They are reserved for future applications, such as in-band headers (containing metadata, etc.). Packets which violate these constraints may cause implementations of this specification to treat them as malformed, and discard them. These constraints are summarized here for reference: Packets are at least one byte. No implicit frame length is larger than 1275 bytes. Code 1 packets have an odd total length, N, so that (N-1)/2 is an integer. Code 2 packets have enough bytes after the TOC for a valid frame length, and that length is no larger than the number of bytes remaining in the packet. Code 3 packets contain at least one frame, but no more than 120 ms of audio total. The length of a CBR code 3 packet, N, is at least two bytes, the number of bytes added to indicate the padding size plus the trailing padding bytes themselves, P, is no more than N-2, and the frame count, M, satisfies the constraint that (N-2-P) is a non-negative integer multiple of M. VBR code 3 packets are large enough to contain all the header bytes (TOC byte, frame count byte, any padding length bytes, and any frame length bytes), plus the length of the first M-1 frames, plus any trailing padding bytes.
    The Opus decoder consists of two main blocks: the SILK decoder and the CELT decoder. At any given time, one or both of the SILK and CELT decoders may be active. The output of the Opus decode is the sum of the outputs from the SILK and CELT decoders with proper sample rate conversion and delay compensation on the SILK side, and optional decimation (when decoding to sample rates less than 48 kHz) on the CELT side, as illustrated in the block diagram below.
    | Decoder |--->| Rate |----+ Bit- +---------+ | | | | Conversion | v stream | Range |---+ +---------+ +------------+ /---\ Audio ------->| Decoder | | + |------> | |---+ +---------+ +------------+ \---/ +---------+ | | CELT | | Decimation | ^ +->| Decoder |--->| (Optional) |----+ | | | | +---------+ +------------+ ]]>
    Opus uses an entropy coder based on range coding , which is itself a rediscovery of the FIFO arithmetic code introduced by . It is very similar to arithmetic encoding, except that encoding is done with digits in any base instead of with bits, so it is faster when using larger bases (i.e., a byte). All of the calculations in the range coder must use bit-exact integer arithmetic. Symbols may also be coded as "raw bits" packed directly into the bitstream, bypassing the range coder. These are packed backwards starting at the end of the frame, as illustrated in . This reduces complexity and makes the stream more resilient to bit errors, as corruption in the raw bits will not desynchronize the decoding process, unlike corruption in the input to the range decoder. Raw bits are only used in the CELT layer.
    : + + : : + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ : | <- Boundary occurs at an arbitrary bit position : +-+-+-+ + : <- Raw bits data (packed LSB to MSB) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ]]>
    Each symbol coded by the range coder is drawn from a finite alphabet and coded in a separate "context", which describes the size of the alphabet and the relative frequency of each symbol in that alphabet. Suppose there is a context with n symbols, identified with an index that ranges from 0 to n-1. The parameters needed to encode or decode symbol k in this context are represented by a three-tuple (fl[k], fh[k], ft), with 0 <= fl[k] < fh[k] <= ft <= 65535. The values of this tuple are derived from the probability model for the symbol, represented by traditional "frequency counts". Because Opus uses static contexts these are not updated as symbols are decoded. Let f[i] be the frequency of symbol i. Then the three-tuple corresponding to symbol k is given by
    The range decoder extracts the symbols and integers encoded using the range encoder in . The range decoder maintains an internal state vector composed of the two-tuple (val, rng), representing the difference between the high end of the current range and the actual coded value, minus one, and the size of the current range, respectively. Both val and rng are 32-bit unsigned integer values.
    Let b0 be the first input byte (or zero if there are no bytes in this Opus frame). The decoder initializes rng to 128 and initializes val to (127 - (b0>>1)), where (b0>>1) is the top 7 bits of the first input byte. It saves the remaining bit, (b0&1), for use in the renormalization procedure described in , which the decoder invokes immediately after initialization to read additional bits and establish the invariant that rng > 2**23.
    Decoding a symbol is a two-step process. The first step determines a 16-bit unsigned value fs, which lies within the range of some symbol in the current context. The second step updates the range decoder state with the three-tuple (fl[k], fh[k], ft) corresponding to that symbol. The first step is implemented by ec_decode() (entdec.c), which computes
    The divisions here are integer division.
    The decoder then identifies the symbol in the current context corresponding to fs; i.e., the value of k whose three-tuple (fl[k], fh[k], ft) satisfies fl[k] <= fs < fh[k]. It uses this tuple to update val according to
    If fl[k] is greater than zero, then the decoder updates rng using
    Otherwise, it updates rng using
    Using a special case for the first symbol (rather than the last symbol, as is commonly done in other arithmetic coders) ensures that all the truncation error from the finite precision arithmetic accumulates in symbol 0. This makes the cost of coding a 0 slightly smaller, on average, than its estimated probability indicates and makes the cost of coding any other symbol slightly larger. When contexts are designed so that 0 is the most probable symbol, which is often the case, this strategy minimizes the inefficiency introduced by the finite precision. It also makes some of the special-case decoding routines in particularly simple. After the updates, implemented by ec_dec_update() (entdec.c), the decoder normalizes the range using the procedure in the next section, and returns the index k.
    To normalize the range, the decoder repeats the following process, implemented by ec_dec_normalize() (entdec.c), until rng > 2**23. If rng is already greater than 2**23, the entire process is skipped. First, it sets rng to (rng<<8). Then it reads the next byte of the Opus frame and forms an 8-bit value sym, using the left-over bit buffered from the previous byte as the high bit and the top 7 bits of the byte just read as the other 7 bits of sym. The remaining bit in the byte just read is buffered for use in the next iteration. If no more input bytes remain, it uses zero bits instead. See for the initialization used to process the first byte. Then, it sets
    It is normal and expected that the range decoder will read several bytes into the raw bits data (if any) at the end of the packet by the time the frame is completely decoded, as illustrated in . This same data MUST also be returned as raw bits when requested. The encoder is expected to terminate the stream in such a way that the decoder will decode the intended values regardless of the data contained in the raw bits. describes a procedure for doing this. If the range decoder consumes all of the bytes belonging to the current frame, it MUST continue to use zero when any further input bytes are required, even if there is additional data in the current packet from padding or other frames.
    | : +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ^ ^ | End of data buffered by the range coder | ...-----------------------------------------------+ | | End of data consumed by raw bits +-------------------------------------------------------... ]]>
    The reference implementation uses three additional decoding methods that are exactly equivalent to the above, but make assumptions and simplifications that allow for a more efficient implementation.
    The first is ec_decode_bin() (entdec.c), defined using the parameter ftb instead of ft. It is mathematically equivalent to calling ec_decode() with ft = (1<<ftb), but avoids one of the divisions.
    The next is ec_dec_bit_logp() (entdec.c), which decodes a single binary symbol, replacing both the ec_decode() and ec_dec_update() steps. The context is described by a single parameter, logp, which is the absolute value of the base-2 logarithm of the probability of a "1". It is mathematically equivalent to calling ec_decode() with ft = (1<<logp), followed by ec_dec_update() with the 3-tuple (fl[k] = 0, fh[k] = (1<<logp) - 1, ft = (1<<logp)) if the returned value of fs is less than (1<<logp) - 1 (a "0" was decoded), and with (fl[k] = (1<<logp) - 1, fh[k] = ft = (1<<logp)) otherwise (a "1" was decoded). The implementation requires no multiplications or divisions.
    The last is ec_dec_icdf() (entdec.c), which decodes a single symbol with a table-based context of up to 8 bits, also replacing both the ec_decode() and ec_dec_update() steps, as well as the search for the decoded symbol in between. The context is described by two parameters, an icdf ("inverse" cumulative distribution function) table and ftb. As with ec_decode_bin(), (1<<ftb) is equivalent to ft. idcf[k], on the other hand, stores (1<<ftb)-fh[k], which is equal to (1<<ftb) - fl[k+1]. fl[0] is assumed to be 0, and the table is terminated by a value of 0 (where fh[k] == ft). The function is mathematically equivalent to calling ec_decode() with ft = (1<<ftb), using the returned value fs to search the table for the first entry where fs < (1<<ftb)-icdf[k], and calling ec_dec_update() with fl[k] = (1<<ftb) - icdf[k-1] (or 0 if k == 0), fh[k] = (1<<ftb) - idcf[k], and ft = (1<<ftb). Combining the search with the update allows the division to be replaced by a series of multiplications (which are usually much cheaper), and using an inverse CDF allows the use of an ftb as large as 8 in an 8-bit table without any special cases. This is the primary interface with the range decoder in the SILK layer, though it is used in a few places in the CELT layer as well. Although icdf[k] is more convenient for the code, the frequency counts, f[k], are a more natural representation of the probability distribution function (PDF) for a given symbol. Therefore this draft lists the latter, not the former, when describing the context in which a symbol is coded as a list, e.g., {4, 4, 4, 4}/16 for a uniform context with four possible values and ft = 16. The value of ft after the slash is always the sum of the entries in the PDF, but is included for convenience. Contexts with identical probabilities, f[k]/ft, but different values of ft (or equivalently, ftb) are not the same, and cannot, in general, be used in place of one another. An icdf table is also not capable of representing a PDF where the first symbol has 0 probability. In such contexts, ec_dec_icdf() can decode the symbol by using a table that drops the entries for any initial zero-probability values and adding the constant offset of the first value with a non-zero probability to its return value.
    The raw bits used by the CELT layer are packed at the end of the packet, with the least significant bit of the first value packed in the least significant bit of the last byte, filling up to the most significant bit in the last byte, continuing on to the least significant bit of the penultimate byte, and so on. The reference implementation reads them using ec_dec_bits() (entdec.c). Because the range decoder must read several bytes ahead in the stream, as described in , the input consumed by the raw bits may overlap with the input consumed by the range coder, and a decoder MUST allow this. The format should render it impossible to attempt to read more raw bits than there are actual bits in the frame, though a decoder may wish to check for this and report an error.
    The function ec_dec_uint() (entdec.c) decodes one of ft equiprobable values in the range 0 to (ft - 1), inclusive, each with a frequency of 1, where ft may be as large as (2**32 - 1). Because ec_decode() is limited to a total frequency of (2**16 - 1), it splits up the value into a range coded symbol representing up to 8 of the high bits, and, if necessary, raw bits representing the remainder of the value. The limit of 8 bits in the range coded symbol is a trade-off between implementation complexity, modeling error (since the symbols no longer truly have equal coding cost), and rounding error introduced by the range coder itself (which gets larger as more bits are included). Using raw bits reduces the maximum number of divisions required in the worst case, but means that it may be possible to decode a value outside the range 0 to (ft - 1), inclusive. ec_dec_uint() takes a single, positive parameter, ft, which is not necessarily a power of two, and returns an integer, t, whose value lies between 0 and (ft - 1), inclusive. Let ftb = ilog(ft - 1), i.e., the number of bits required to store (ft - 1) in two's complement notation. If ftb is 8 or less, then t is decoded with t = ec_decode(ft), and the range coder state is updated using the three-tuple (t, t + 1, ft). If ftb is greater than 8, then the top 8 bits of t are decoded using
    > (ftb - 8)) + 1) , ]]>
    the decoder state is updated using the three-tuple (t, t + 1, ((ft - 1) >> (ftb - 8)) + 1), and the remaining bits are decoded as raw bits, setting
    If, at this point, t >= ft, then the current frame is corrupt. In that case, the decoder should assume there has been an error in the coding, decoding, or transmission and SHOULD take measures to conceal the error and/or report to the application that the error has occurred.
    The bit allocation routines in the CELT decoder need a conservative upper bound on the number of bits that have been used from the current frame thus far, including both range coder bits and raw bits. This drives allocation decisions that must match those made in the encoder. The upper bound is computed in the reference implementation to whole-bit precision by the function ec_tell() (entcode.h) and to fractional 1/8th bit precision by the function ec_tell_frac() (entcode.c). Like all operations in the range coder, it must be implemented in a bit-exact manner, and must produce exactly the same value returned by the same functions in the encoder after encoding the same symbols. ec_tell() is guaranteed to return ceil(ec_tell_frac()/8.0). In various places the codec will check to ensure there is enough room to contain a symbol before attempting to decode it. In practice, although the number of bits used so far is an upper bound, decoding a symbol whose probability model suggests it has a worst-case cost of p 1/8th bits may actually advance the return value of ec_tell_frac() by p-1, p, or p+1 1/8th bits, due to approximation error in that upper bound, truncation error in the range coder, and for large values of ft, modeling error in ec_dec_uint(). However, this error is bounded, and periodic calls to ec_tell() or ec_tell_frac() at precisely defined points in the decoding process prevent it from accumulating. For a range coder symbol that requires a whole number of bits (i.e., for which ft/(fh[k] - fl[k]) is a power of two), where there are at least p 1/8th bits available, decoding the symbol will never cause ec_tell() or ec_tell_frac() to exceed the size of the frame ("bust the budget"). In this case the return value of ec_tell_frac() will only advance by more than p 1/8th bits if there was an additional, fractional number of bits remaining, and it will never advance beyond the next whole-bit boundary, which is safe, since frames always contain a whole number of bits. However, when p is not a whole number of bits, an extra 1/8th bit is required to ensure that decoding the symbol will not bust the budget. The reference implementation keeps track of the total number of whole bits that have been processed by the decoder so far in the variable nbits_total, including the (possibly fractional) number of bits that are currently buffered, but not consumed, inside the range coder. nbits_total is initialized to 9 just before the initial range renormalization process completes (or equivalently, it can be initialized to 33 after the first renormalization). The extra two bits over the actual amount buffered by the range coder guarantees that it is an upper bound and that there is enough room for the encoder to terminate the stream. Each iteration through the range coder's renormalization loop increases nbits_total by 8. Reading raw bits increases nbits_total by the number of raw bits read.
    The whole number of bits buffered in rng may be estimated via lg = ilog(rng). ec_tell() then becomes a simple matter of removing these bits from the total. It returns (nbits_total - lg). In a newly initialized decoder, before any symbols have been read, this reports that 1 bit has been used. This is the bit reserved for termination of the encoder.
    ec_tell_frac() estimates the number of bits buffered in rng to fractional precision. Since rng must be greater than 2**23 after renormalization, lg must be at least 24. Let
    > (lg-16) , ]]>
    so that 32768 <= r_Q15 < 65536, an unsigned Q15 value representing the fractional part of rng. Then the following procedure can be used to add one bit of precision to lg. First, update
    > 15 . ]]>
    Then add the 16th bit of r_Q15 to lg via
    > 16) . ]]>
    Finally, if this bit was a 1, reduce r_Q15 by a factor of two via
    > 1 , ]]>
    so that it once again lies in the range 32768 <= r_Q15 < 65536.
    This procedure is repeated three times to extend lg to 1/8th bit precision. ec_tell_frac() then returns (nbits_total*8 - lg).
    The decoder's LP layer uses a modified version of the SILK codec (herein simply called "SILK"), which runs a decoded excitation signal through adaptive long-term and short-term prediction synthesis filters. It runs at NB, MB, and WB sample rates internally. When used in a SWB or FB Hybrid frame, the LP layer itself still only runs in WB.
    An overview of the decoder is given in .
    | Range |--->| Decode |---------------------------+ 1 | Decoder | 2 | Parameters |----------+ 5 | +---------+ +------------+ 4 | | 3 | | | \/ \/ \/ +------------+ +------------+ +------------+ | Generate |-->| LTP |-->| LPC | | Excitation | | Synthesis | | Synthesis | +------------+ +------------+ +------------+ ^ | | | +-------------------+----------------+ | 6 | +------------+ +-------------+ +-->| Stereo |-->| Sample Rate |--> | Unmixing | 7 | Conversion | 8 +------------+ +-------------+ 1: Range encoded bitstream 2: Coded parameters 3: Pulses, LSBs, and signs 4: Pitch lags, Long-Term Prediction (LTP) coefficients 5: Linear Predictive Coding (LPC) coefficients and gains 6: Decoded signal (mono or mid-side stereo) 7: Unmixed signal (mono or left-right stereo) 8: Resampled signal ]]>
    The decoder feeds the bitstream (1) to the range decoder from , and then decodes the parameters in it (2) using the procedures detailed in Sections  through . These parameters (3, 4, 5) are used to generate an excitation signal (see ), which is fed to an optional long-term prediction (LTP) filter (voiced frames only, see ) and then a short-term prediction filter (see ), producing the decoded signal (6). For stereo streams, the mid-side representation is converted to separate left and right channels (7). The result is finally resampled to the desired output sample rate (e.g., 48 kHz) so that the resampled signal (8) can be mixed with the CELT layer.
    Internally, the LP layer of a single Opus frame is composed of either a single 10 ms regular SILK frame or between one and three 20 ms regular SILK frames. A stereo Opus frame may double the number of regular SILK frames (up to a total of six), since it includes separate frames for a mid channel and, optionally, a side channel. Optional Low Bit-Rate Redundancy (LBRR) frames, which are reduced-bitrate encodings of previous SILK frames, may be included to aid in recovery from packet loss. If present, these appear before the regular SILK frames. They are in most respects identical to regular, active SILK frames, except that they are usually encoded with a lower bitrate. This draft uses "SILK frame" to refer to either one and "regular SILK frame" if it needs to draw a distinction between the two. Logically, each SILK frame is in turn composed of either two or four 5 ms subframes. Various parameters, such as the quantization gain of the excitation and the pitch lag and filter coefficients can vary on a subframe-by-subframe basis. Physically, the parameters for each subframe are interleaved in the bitstream, as described in the relevant sections for each parameter. All of these frames and subframes are decoded from the same range coder, with no padding between them. Thus packing multiple SILK frames in a single Opus frame saves, on average, half a byte per SILK frame. It also allows some parameters to be predicted from prior SILK frames in the same Opus frame, since this does not degrade packet loss robustness (beyond any penalty for merely using fewer, larger packets to store multiple frames). Stereo support in SILK uses a variant of mid-side coding, allowing a mono decoder to simply decode the mid channel. However, the data for the two channels is interleaved, so a mono decoder must still unpack the data for the side channel. It would be required to do so anyway for Hybrid Opus frames, or to support decoding individual 20 ms frames. summarizes the overall grouping of the contents of the LP layer. Figures  and  illustrate the ordering of the various SILK frames for a 60 ms Opus frame, for both mono and stereo, respectively. Symbol(s) PDF(s) Condition Voice Activity Detection (VAD) flags {1, 1}/2 LBRR flag {1, 1}/2 Per-frame LBRR flags LBRR Frame(s) Regular SILK Frame(s)
    The LP layer begins with two to eight header bits, decoded in silk_Decode() (dec_API.c). These consist of one Voice Activity Detection (VAD) bit per frame (up to 3), followed by a single flag indicating the presence of LBRR frames. For a stereo packet, these first flags correspond to the mid channel, and a second set of flags is included for the side channel. Because these are the first symbols decoded by the range coder and because they are coded as binary values with uniform probability, they can be extracted directly from the most significant bits of the first byte of compressed data. Thus, a receiver can determine if an Opus frame contains any active SILK frames without the overhead of using the range decoder.
    For Opus frames longer than 20 ms, a set of LBRR flags is decoded for each channel that has its LBRR flag set. Each set contains one flag per 20 ms SILK frame. 40 ms Opus frames use the 2-frame LBRR flag PDF from , and 60 ms Opus frames use the 3-frame LBRR flag PDF. For each channel, the resulting 2- or 3-bit integer contains the corresponding LBRR flag for each frame, packed in order from the LSB to the MSB. Frame Size PDF 40 ms {0, 53, 53, 150}/256 60 ms {0, 41, 20, 29, 41, 15, 28, 82}/256 A 10 or 20 ms Opus frame does not contain any per-frame LBRR flags, as there may be at most one LBRR frame per channel. The global LBRR flag in the header bits (see ) is already sufficient to indicate the presence of that single LBRR frame.
    The LBRR frames, if present, contain an encoded representation of the signal immediately prior to the current Opus frame as if it were encoded with the current mode, frame size, audio bandwidth, and channel count, even if those differ from the prior Opus frame. When one of these parameters changes from one Opus frame to the next, this implies that the LBRR frames of the current Opus frame may not be simple drop-in replacements for the contents of the previous Opus frame. For example, when switching from 20 ms to 60 ms, the 60 ms Opus frame may contain LBRR frames covering up to three prior 20 ms Opus frames, even if those frames already contained LBRR frames covering some of the same time periods. When switching from 20 ms to 10 ms, the 10 ms Opus frame can contain an LBRR frame covering at most half the prior 20 ms Opus frame, potentially leaving a hole that needs to be concealed from even a single packet loss (see ). When switching from mono to stereo, the LBRR frames in the first stereo Opus frame MAY contain a non-trivial side channel. In order to properly produce LBRR frames under all conditions, an encoder might need to buffer up to 60 ms of audio and re-encode it during these transitions. However, the reference implementation opts to disable LBRR frames at the transition point for simplicity. Since transitions are relatively infrequent in normal usage, this does not have a significant impact on packet loss robustness. The LBRR frames immediately follow the LBRR flags, prior to any regular SILK frames. describes their exact contents. LBRR frames do not include their own separate VAD flags. LBRR frames are only meant to be transmitted for active speech, thus all LBRR frames are treated as active. In a stereo Opus frame longer than 20 ms, although the per-frame LBRR flags for the mid channel are coded as a unit before the per-frame LBRR flags for the side channel, the LBRR frames themselves are interleaved. The decoder parses an LBRR frame for the mid channel of a given 20 ms interval (if present) and then immediately parses the corresponding LBRR frame for the side channel (if present), before proceeding to the next 20 ms interval.
    The regular SILK frame(s) follow the LBRR frames (if any). describes their contents, as well. Unlike the LBRR frames, a regular SILK frame is coded for each time interval in an Opus frame, even if the corresponding VAD flags are unset. For stereo Opus frames longer than 20 ms, the regular mid and side SILK frames for each 20 ms interval are interleaved, just as with the LBRR frames. The side frame may be skipped by coding an appropriate flag, as detailed in .
    Each SILK frame includes a set of side information that encodes The frame type and quantization type (), Quantization gains (), Short-term prediction filter coefficients (), A Line Spectral Frequencies (LSF) interpolation weight (), Long-term prediction filter lags and gains (), and A linear congruential generator (LCG) seed (). The quantized excitation signal (see ) follows these at the end of the frame. details the overall organization of a SILK frame. Symbol(s) PDF(s) Condition Stereo Prediction Weights Mid-only Flag Frame Type Subframe Gains Normalized LSF Stage-1 Index Normalized LSF Stage-2 Residual Normalized LSF Interpolation Weight 20 ms frame Primary Pitch Lag Voiced frame Subframe Pitch Contour Voiced frame Periodicity Index Voiced frame LTP Filter Voiced frame LTP Scaling LCG Seed Excitation Rate Level Excitation Pulse Counts Excitation Pulse Locations Non-zero pulse count Excitation LSBs Excitation Signs
    A SILK frame corresponding to the mid channel of a stereo Opus frame begins with a pair of side channel prediction weights, designed such that zeros indicate normal mid-side coupling. Since these weights can change on every frame, the first portion of each frame linearly interpolates between the previous weights and the current ones, using zeros for the previous weights if none are available. These prediction weights are never included in a mono Opus frame, and the previous weights are reset to zeros on any transition from mono to stereo. They are also not included in an LBRR frame for the side channel, even if the LBRR flags indicate the corresponding mid channel was not coded. In that case, the previous weights are used, again substituting in zeros if no previous weights are available since the last decoder reset (see ). To summarize, these weights are coded if and only if This is a stereo Opus frame (), and The current SILK frame corresponds to the mid channel. The prediction weights are coded in three separate pieces, which are decoded by silk_stereo_decode_pred() (decode_stereo_pred.c). The first piece jointly codes the high-order part of a table index for both weights. The second piece codes the low-order part of each table index. The third piece codes an offset used to linearly interpolate between table indices. The details are as follows. Let n be an index decoded with the 25-element stage-1 PDF in . Then let i0 and i1 be indices decoded with the stage-2 and stage-3 PDFs in , respectively, and let i2 and i3 be two more indices decoded with the stage-2 and stage-3 PDFs, all in that order. Stage PDF Stage 1 {7, 2, 1, 1, 1, 10, 24, 8, 1, 1, 3, 23, 92, 23, 3, 1, 1, 8, 24, 10, 1, 1, 1, 2, 7}/256 Stage 2 {85, 86, 85}/256 Stage 3 {51, 51, 52, 51, 51}/256 Then use n, i0, and i2 to form two table indices, wi0 and wi1, according to
    where the division is integer division. The range of these indices is 0 to 14, inclusive. Let w[i] be the i'th weight from . Then the two prediction weights, w0_Q13 and w1_Q13, are
    > 16)*(2*i3 + 1) w0_Q13 = w_Q13[wi0] + ((w_Q13[wi0+1] - w_Q13[wi0])*6554) >> 16)*(2*i1 + 1) - w1_Q13 ]]>
    N.b., w1_Q13 is computed first here, because w0_Q13 depends on it. The constant 6554 is approximately 0.1 in Q16. Although wi0 and wi1 only have 15 possible values, contains 16 entries to allow interpolation between entry wi0 and (wi0 + 1) (and likewise for wi1).
    Index Weight (Q13) 0 -13732 1 -10050 2 -8266 3 -7526 4 -6500 5 -5000 6 -2950 7 -820 8 820 9 2950 10 5000 11 6500 12 7526 13 8266 14 10050 15 13732
    A flag appears after the stereo prediction weights that indicates if only the mid channel is coded for this time interval. It appears only when This is a stereo Opus frame (see ), The current SILK frame corresponds to the mid channel, and Either This is a regular SILK frame where the VAD flags (see ) indicate that the corresponding side channel is not active. This is an LBRR frame where the LBRR flags (see and ) indicate that the corresponding side channel is not coded. It is omitted when there are no stereo weights, for all of the same reasons. It is also omitted for a regular SILK frame when the VAD flag of the corresponding side channel frame is set (indicating it is active). The side channel must be coded in this case, making the mid-only flag redundant. It is also omitted for an LBRR frame when the corresponding LBRR flags indicate the side channel is coded. When the flag is present, the decoder reads a single value using the PDF in , as implemented in silk_stereo_decode_mid_only() (decode_stereo_pred.c). If the flag is set, then there is no corresponding SILK frame for the side channel, the entire decoding process for the side channel is skipped, and zeros are fed to the stereo unmixing process (see ) instead. As stated above, LBRR frames still include this flag when the LBRR flag indicates that the side channel is not coded. In that case, if this flag is zero (indicating that there should be a side channel), then Packet Loss Concealment (PLC, see ) SHOULD be invoked to recover a side channel signal. Otherwise, the stereo image will collapse. PDF {192, 64}/256
    Each SILK frame contains a single "frame type" symbol that jointly codes the signal type and quantization offset type of the corresponding frame. If the current frame is a regular SILK frame whose VAD bit was not set (an "inactive" frame), then the frame type symbol takes on a value of either 0 or 1 and is decoded using the first PDF in . If the frame is an LBRR frame or a regular SILK frame whose VAD flag was set (an "active" frame), then the value of the symbol may range from 2 to 5, inclusive, and is decoded using the second PDF in . translates between the value of the frame type symbol and the corresponding signal type and quantization offset type. VAD Flag PDF Inactive {26, 230, 0, 0, 0, 0}/256 Active {0, 0, 24, 74, 148, 10}/256 Frame Type Signal Type Quantization Offset Type 0 Inactive Low 1 Inactive High 2 Unvoiced Low 3 Unvoiced High 4 Voiced Low 5 Voiced High
    A separate quantization gain is coded for each 5 ms subframe. These gains control the step size between quantization levels of the excitation signal and, therefore, the quality of the reconstruction. They are independent of and unrelated to the pitch contours coded for voiced frames. The quantization gains are themselves uniformly quantized to 6 bits on a log scale, giving them a resolution of approximately 1.369 dB and a range of approximately 1.94 dB to 88.21 dB. The subframe gains are either coded independently, or relative to the gain from the most recent coded subframe in the same channel. Independent coding is used if and only if This is the first subframe in the current SILK frame, and Either This is the first SILK frame of its type (LBRR or regular) for this channel in the current Opus frame, or The previous SILK frame of the same type (LBRR or regular) for this channel in the same Opus frame was not coded. In an independently coded subframe gain, the 3 most significant bits of the quantization gain are decoded using a PDF selected from based on the decoded signal type (see ). Signal Type PDF Inactive {32, 112, 68, 29, 12, 1, 1, 1}/256 Unvoiced {2, 17, 45, 60, 62, 47, 19, 4}/256 Voiced {1, 3, 26, 71, 94, 50, 9, 2}/256 The 3 least significant bits are decoded using a uniform PDF: PDF {32, 32, 32, 32, 32, 32, 32, 32}/256 These 6 bits are combined to form a value, gain_index, between 0 and 63. When the gain for the previous subframe is available, then the current gain is limited as follows:
    This may help some implementations limit the change in precision of their internal LTP history. The indices which this clamp applies to cannot simply be removed from the codebook, because previous_log_gain will not be available after packet loss. The clamping is skipped after a decoder reset, and in the side channel if the previous frame in the side channel was not coded, since there is no value for previous_log_gain available. It MAY also be skipped after packet loss.
    For subframes which do not have an independent gain (including the first subframe of frames not listed as using independent coding above), the quantization gain is coded relative to the gain from the previous subframe (in the same channel). The PDF in yields a delta_gain_index value between 0 and 40, inclusive. PDF {6, 5, 11, 31, 132, 21, 8, 4, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}/256 The following formula translates this index into a quantization gain for the current subframe using the gain from the previous subframe:
    silk_gains_dequant() (gain_quant.c) dequantizes log_gain for the k'th subframe and converts it into a linear Q16 scale factor via
    >16) + 2090) ]]>
    The function silk_log2lin() (log2lin.c) computes an approximation of 2**(inLog_Q7/128.0), where inLog_Q7 is its Q7 input. Let i = inLog_Q7>>7 be the integer part of inLogQ7 and f = inLog_Q7&127 be the fractional part. Then
    >16)+f)*((1<>7) ]]>
    yields the approximate exponential. The final Q16 gain values lies between 81920 and 1686110208, inclusive (representing scale factors of 1.25 to 25728, respectively).
    A set of normalized Line Spectral Frequency (LSF) coefficients follow the quantization gains in the bitstream, and represent the Linear Predictive Coding (LPC) coefficients for the current SILK frame. Once decoded, the normalized LSFs form an increasing list of Q15 values between 0 and 1. These represent the interleaved zeros on the upper half of the unit circle (between 0 and pi, hence "normalized") in the standard decomposition of the LPC filter into a symmetric part and an anti-symmetric part (P and Q in ). Because of non-linear effects in the decoding process, an implementation SHOULD match the fixed-point arithmetic described in this section exactly. An encoder SHOULD also use the same process. The normalized LSFs are coded using a two-stage vector quantizer (VQ) ( and ). NB and MB frames use an order-10 predictor, while WB frames use an order-16 predictor, and thus have different sets of tables. After reconstructing the normalized LSFs (), the decoder runs them through a stabilization process (), interpolates them between frames (), converts them back into LPC coefficients (), and then runs them through further processes to limit the range of the coefficients () and the gain of the filter (). All of this is necessary to ensure the reconstruction process is stable.
    The first VQ stage uses a 32-element codebook, coded with one of the PDFs in , depending on the audio bandwidth and the signal type of the current SILK frame. This yields a single index, I1, for the entire frame, which Indexes an element in a coarse codebook, Selects the PDFs for the second stage of the VQ, and Selects the prediction weights used to remove intra-frame redundancy from the second stage. The actual codebook elements are listed in and , but they are not needed until the last stages of reconstructing the LSF coefficients. Audio Bandwidth Signal Type PDF NB or MB Inactive or unvoiced {44, 34, 30, 19, 21, 12, 11, 3, 3, 2, 16, 2, 2, 1, 5, 2, 1, 3, 3, 1, 1, 2, 2, 2, 3, 1, 9, 9, 2, 7, 2, 1}/256 NB or MB Voiced {1, 10, 1, 8, 3, 8, 8, 14, 13, 14, 1, 14, 12, 13, 11, 11, 12, 11, 10, 10, 11, 8, 9, 8, 7, 8, 1, 1, 6, 1, 6, 5}/256 WB Inactive or unvoiced {31, 21, 3, 17, 1, 8, 17, 4, 1, 18, 16, 4, 2, 3, 1, 10, 1, 3, 16, 11, 16, 2, 2, 3, 2, 11, 1, 4, 9, 8, 7, 3}/256 WB Voiced {1, 4, 16, 5, 18, 11, 5, 14, 15, 1, 3, 12, 13, 14, 14, 6, 14, 12, 2, 6, 1, 12, 12, 11, 10, 3, 10, 5, 1, 1, 1, 3}/256
    A total of 16 PDFs are available for the LSF residual in the second stage: the 8 (a...h) for NB and MB frames given in , and the 8 (i...p) for WB frames given in . Which PDF is used for which coefficient is driven by the index, I1, decoded in the first stage. lists the letter of the corresponding PDF for each normalized LSF coefficient for NB and MB, and lists the same information for WB. Codebook PDF a {1, 1, 1, 15, 224, 11, 1, 1, 1}/256 b {1, 1, 2, 34, 183, 32, 1, 1, 1}/256 c {1, 1, 4, 42, 149, 55, 2, 1, 1}/256 d {1, 1, 8, 52, 123, 61, 8, 1, 1}/256 e {1, 3, 16, 53, 101, 74, 6, 1, 1}/256 f {1, 3, 17, 55, 90, 73, 15, 1, 1}/256 g {1, 7, 24, 53, 74, 67, 26, 3, 1}/256 h {1, 1, 18, 63, 78, 58, 30, 6, 1}/256 Codebook PDF i {1, 1, 1, 9, 232, 9, 1, 1, 1}/256 j {1, 1, 2, 28, 186, 35, 1, 1, 1}/256 k {1, 1, 3, 42, 152, 53, 2, 1, 1}/256 l {1, 1, 10, 49, 126, 65, 2, 1, 1}/256 m {1, 4, 19, 48, 100, 77, 5, 1, 1}/256 n {1, 1, 14, 54, 100, 72, 12, 1, 1}/256 o {1, 1, 15, 61, 87, 61, 25, 4, 1}/256 p {1, 7, 21, 50, 77, 81, 17, 1, 1}/256 I1 Coefficient 0 1 2 3 4 5 6 7 8 9 0 a a a a a a a a a a 1 b d b c c b c b b b 2 c b b b b b b b b b 3 b c c c c b c b b b 4 c d d d d c c c c c 5 a f d d c c c c b b g a c c c c c c c c b 7 c d g e e e f e f f 8 c e f f e f e g e e 9 c e e h e f e f f e 10 e d d d c d c c c c 11 b f f g e f e f f f 12 c h e g f f f f f f 13 c h f f f f f g f e 14 d d f e e f e f e e 15 c d d f f e e e e e 16 c e e g e f e f f f 17 c f e g f f f e f e 18 c h e f e f e f f f 19 c f e g h g f g f e 20 d g h e g f f g e f 21 c h g e e e f e f f 22 e f f e g g f g f e 23 c f f g f g e g e e 24 e f f f d h e f f e 25 c d e f f g e f f e 26 c d c d d e c d d d 27 b b c c c c c d c c 28 e f f g g g f g e f 29 d f f e e e e d d c 30 c f d h f f e e f e 31 e e f e f g f g f e I1 Coefficient 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 0 i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i 1 k  l  l  l  l  l  k  k  k  k  k  j  j  j  i  l 2 k  n  n  l  p  m  m  n  k  n  m  n  n  m  l  l 3 i  k  j  k  k  j  j  j  j  j  i  i  i  i  i  j 4 i  o  n  m  o  m  p  n  m  m  m  n  n  m  m  l 5 i  l  n  n  m  l  l  n  l  l  l  l  l  l  k  m 6 i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i 7 i  k  o  l  p  k  n  l  m  n  n  m  l  l  k  l 8 i  o  k  o  o  m  n  m  o  n  m  m  n  l  l  l 9 k  j  i  i  i  i  i  i  i  i  i  i  i  i  i  i 10 i  j  i  i  i  i  i  i  i  i  i  i  i  i  i  j 11 k  k  l  m  n  l  l  l  l  l  l  l  k  k  j  l 12 k  k  l  l  m  l  l  l  l  l  l  l  l  k  j  l 13 l  m  m  m  o  m  m  n  l  n  m  m  n  m  l  m 14 i  o  m  n  m  p  n  k  o  n  p  m  m  l  n  l 15 i  j  i  j  j  j  j  j  j  j  i  i  i  i  j  i 16 j  o  n  p  n  m  n  l  m  n  m  m  m  l  l  m 17 j  l  l  m  m  l  l  n  k  l  l  n  n  n  l  m 18 k  l  l  k  k  k  l  k  j  k  j  k  j  j  j  m 19 i  k  l  n  l  l  k  k  k  j  j  i  i  i  i  i 20 l  m  l  n  l  l  k  k  j  j  j  j  j  k  k  m 21 k  o  l  p  p  m  n  m  n  l  n  l  l  k  l  l 22 k  l  n  o  o  l  n  l  m  m  l  l  l  l  k  m 23 j  l  l  m  m  m  m  l  n  n  n  l  j  j  j  j 24 k  n  l  o  o  m  p  m  m  n  l  m  m  l  l  l 25 i  o  j  j  i  i  i  i  i  i  i  i  i  i  i  i 26 i  o  o  l  n  k  n  n  l  m  m  p  p  m  m  m 27 l  l  p  l  n  m  l  l  l  k  k  l  l  l  k  l 28 i  i  j  i  i  i  k  j  k  j  j  k  k  k  j  j 29 i  l  k  n  l  l  k  l  k  j  i  i  j  i  i  j 30 l  n  n  m  p  n  l  l  k  l  k  k  j  i  j  i 31 k  l  n  l  m  l  l  l  k  j  k  o  m  i  i  i Decoding the second stage residual proceeds as follows. For each coefficient, the decoder reads a symbol using the PDF corresponding to I1 from either or , and subtracts 4 from the result to give an index in the range -4 to 4, inclusive. If the index is either -4 or 4, it reads a second symbol using the PDF in , and adds the value of this second symbol to the index, using the same sign. This gives the index, I2[k], a total range of -10 to 10, inclusive. PDF {156, 60, 24, 9, 4, 2, 1}/256 The decoded indices from both stages are translated back into normalized LSF coefficients in silk_NLSF_decode() (NLSF_decode.c). The stage-2 indices represent residuals after both the first stage of the VQ and a separate backwards-prediction step. The backwards prediction process in the encoder subtracts a prediction from each residual formed by a multiple of the coefficient that follows it. The decoder must undo this process. contains lists of prediction weights for each coefficient. There are two lists for NB and MB, and another two lists for WB, giving two possible prediction weights for each coefficient. Coefficient A B C D 0 179 116 175 68 1 138 67 148 62 2 140 82 160 66 3 148 59 176 60 4 151 92 178 72 5 149 72 173 117 6 153 100 174 85 7 151 89 164 90 8 163 92 177 118 9 174 136 10 196 151 11 182 142 12 198 160 13 192 142 14 182 155 The prediction is undone using the procedure implemented in silk_NLSF_residual_dequant() (NLSF_decode.c), which is as follows. Each coefficient selects its prediction weight from one of the two lists based on the stage-1 index, I1. gives the selections for each coefficient for NB and MB, and gives the selections for WB. Let d_LPC be the order of the codebook, i.e., 10 for NB and MB, and 16 for WB, and let pred_Q8[k] be the weight for the k'th coefficient selected by this process for 0 <= k < d_LPC-1. Then, the stage-2 residual for each coefficient is computed via
    >8 : 0) + ((((I2[k]<<10) - sign(I2[k])*102)*qstep)>>16) , ]]>
    where qstep is the Q16 quantization step size, which is 11796 for NB and MB and 9830 for WB (representing step sizes of approximately 0.18 and 0.15, respectively).
    I1 Coefficient 0 1 2 3 4 5 6 7 8 0 A B A A A A A A A 1 B A A A A A A A A 2 A A A A A A A A A 3 B B B A A A A B A 4 A B A A A A A A A 5 A B A A A A A A A 6 B A B B A A A B A 7 A B B A A B B A A 8 A A B B A B A B B 9 A A B B A A B B B 10 A A A A A A A A A 11 A B A B B B B B A 12 A B A B B B B B A 13 A B B B B B B B A 14 B A B B A B B B B 15 A B B B B B A B A 16 A A B B A B A B A 17 A A B B B A B B B 18 A B B A A B B B A 19 A A A B B B A B A 20 A B B A A B A B A 21 A B B A A A B B A 22 A A A A A B B B B 23 A A B B A A A B B 24 A A A B A B B B B 25 A B B B B B B B A 26 A A A A A A A A A 27 A A A A A A A A A 28 A A B A B B A B A 29 B A A B A A A A A 30 A A A B B A B A B 31 B A B B A B B B B I1 Coefficient 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 0 C  C  C  C  C  C  C  C  C  C  C  C  C  C  D 1 C  C  C  C  C  C  C  C  C  C  C  C  C  C  C 2 C  C  D  C  C  D  D  D  C  D  D  D  D  C  C 3 C  C  C  C  C  C  C  C  C  C  C  C  D  C  C 4 C  D  D  C  D  C  D  D  C  D  D  D  D  D  C 5 C  C  D  C  C  C  C  C  C  C  C  C  C  C  C 6 D  C  C  C  C  C  C  C  C  C  C  D  C  D  C 7 C  D  D  C  C  C  D  C  D  D  D  C  D  C  D 8 C  D  C  D  D  C  D  C  D  C  D  D  D  D  D 9 C  C  C  C  C  C  C  C  C  C  C  C  C  C  D 10 C  D  C  C  C  C  C  C  C  C  C  C  C  C  C 11 C  C  D  C  D  D  D  D  D  D  D  C  D  C  C 12 C  C  D  C  C  D  C  D  C  D  C  C  D  C  C 13 C  C  C  C  D  D  C  D  C  D  D  D  D  C  C 14 C  D  C  C  C  D  D  C  D  D  D  C  D  D  D 15 C  C  D  D  C  C  C  C  C  C  C  C  D  D  C 16 C  D  D  C  D  C  D  D  D  D  D  C  D  C  C 17 C  C  D  C  C  C  C  D  C  C  D  D  D  C  C 18 C  C  C  C  C  C  C  C  C  C  C  C  C  C  D 19 C  C  C  C  C  C  C  C  C  C  C  C  D  C  C 20 C  C  C  C  C  C  C  C  C  C  C  C  C  C  C 21 C  D  C  D  C  D  D  C  D  C  D  C  D  D  C 22 C  C  D  D  D  D  C  D  D  C  C  D  D  C  C 23 C  D  D  C  D  C  D  C  D  C  C  C  C  D  C 24 C  C  C  D  D  C  D  C  D  D  D  D  D  D  D 25 C  C  C  C  C  C  C  C  C  C  C  C  C  C  D 26 C  D  D  C  C  C  D  D  C  C  D  D  D  D  D 27 C  C  C  C  C  D  C  D  D  D  D  C  D  D  D 28 C  C  C  C  C  C  C  C  C  C  C  C  C  C  D 29 C  C  C  C  C  C  C  C  C  C  C  C  C  C  D 30 D  C  C  C  C  C  C  C  C  C  C  D  C  C  C 31 C  C  D  C  C  D  D  D  C  C  D  C  C  D  C
    Once the stage-1 index I1 and the stage-2 residual res_Q10[] have been decoded, the final normalized LSF coefficients can be reconstructed. The spectral distortion introduced by the quantization of each LSF coefficient varies, so the stage-2 residual is weighted accordingly, using the low-complexity Inverse Harmonic Mean Weighting (IHMW) function proposed in . The weights are derived directly from the stage-1 codebook vector. Let cb1_Q8[k] be the k'th entry of the stage-1 codebook vector from or . Then for 0 <= k < d_LPC the following expression computes the square of the weight as a Q18 value:
    where cb1_Q8[-1] = 0 and cb1_Q8[d_LPC] = 256, and the division is integer division. This is reduced to an unsquared, Q9 value using the following square-root approximation:
    >(i-8)) & 127 y = ((i&1) ? 32768 : 46214) >> ((32-i)>>1) w_Q9[k] = y + ((213*f*y)>>16) ]]>
    The constant 46214 here is approximately the square root of 2 in Q15. The cb1_Q8[] vector completely determines these weights, and they may be tabulated and stored as 13-bit unsigned values (with a range of 1819 to 5227, inclusive) to avoid computing them when decoding. The reference implementation already requires code to compute these weights on unquantized coefficients in the encoder, in silk_NLSF_VQ_weights_laroia() (NLSF_VQ_weights_laroia.c) and its callers, so it reuses that code in the decoder instead of using a pre-computed table to reduce the amount of ROM required.
    I1 Codebook (Q8)  0   1   2   3   4   5   6   7   8   9 0 12  35  60  83 108 132 157 180 206 228 1 15  32  55  77 101 125 151 175 201 225 2 19  42  66  89 114 137 162 184 209 230 3 12  25  50  72  97 120 147 172 200 223 4 26  44  69  90 114 135 159 180 205 225 5 13  22  53  80 106 130 156 180 205 228 6 15  25  44  64  90 115 142 168 196 222 7 19  24  62  82 100 120 145 168 190 214 8 22  31  50  79 103 120 151 170 203 227 9 21  29  45  65 106 124 150 171 196 224 10 30  49  75  97 121 142 165 186 209 229 11 19  25  52  70  93 116 143 166 192 219 12 26  34  62  75  97 118 145 167 194 217 13 25  33  56  70  91 113 143 165 196 223 14 21  34  51  72  97 117 145 171 196 222 15 20  29  50  67  90 117 144 168 197 221 16 22  31  48  66  95 117 146 168 196 222 17 24  33  51  77 116 134 158 180 200 224 18 21  28  70  87 106 124 149 170 194 217 19 26  33  53  64  83 117 152 173 204 225 20 27  34  65  95 108 129 155 174 210 225 21 20  26  72  99 113 131 154 176 200 219 22 34  43  61  78  93 114 155 177 205 229 23 23  29  54  97 124 138 163 179 209 229 24 30  38  56  89 118 129 158 178 200 231 25 21  29  49  63  85 111 142 163 193 222 26 27  48  77 103 133 158 179 196 215 232 27 29  47  74  99 124 151 176 198 220 237 28 33  42  61  76  93 121 155 174 207 225 29 29  53  87 112 136 154 170 188 208 227 30 24  30  52  84 131 150 166 186 203 229 31 37  48  64  84 104 118 156 177 201 230 I1 Codebook (Q8)  0  1  2  3  4   5   6   7   8   9  10  11  12  13  14  15 0  7 23 38 54 69  85 100 116 131 147 162 178 193 208 223 239 1 13 25 41 55 69  83  98 112 127 142 157 171 187 203 220 236 2 15 21 34 51 61  78  92 106 126 136 152 167 185 205 225 240 3 10 21 36 50 63  79  95 110 126 141 157 173 189 205 221 237 4 17 20 37 51 59  78  89 107 123 134 150 164 184 205 224 240 5 10 15 32 51 67  81  96 112 129 142 158 173 189 204 220 236 6  8 21 37 51 65  79  98 113 126 138 155 168 179 192 209 218 7 12 15 34 55 63  78  87 108 118 131 148 167 185 203 219 236 8 16 19 32 36 56  79  91 108 118 136 154 171 186 204 220 237 9 11 28 43 58 74  89 105 120 135 150 165 180 196 211 226 241 10  6 16 33 46 60  75  92 107 123 137 156 169 185 199 214 225 11 11 19 30 44 57  74  89 105 121 135 152 169 186 202 218 234 12 12 19 29 46 57  71  88 100 120 132 148 165 182 199 216 233 13 17 23 35 46 56  77  92 106 123 134 152 167 185 204 222 237 14 14 17 45 53 63  75  89 107 115 132 151 171 188 206 221 240 15  9 16 29 40 56  71  88 103 119 137 154 171 189 205 222 237 16 16 19 36 48 57  76  87 105 118 132 150 167 185 202 218 236 17 12 17 29 54 71  81  94 104 126 136 149 164 182 201 221 237 18 15 28 47 62 79  97 115 129 142 155 168 180 194 208 223 238 19  8 14 30 45 62  78  94 111 127 143 159 175 192 207 223 239 20 17 30 49 62 79  92 107 119 132 145 160 174 190 204 220 235 21 14 19 36 45 61  76  91 108 121 138 154 172 189 205 222 238 22 12 18 31 45 60  76  91 107 123 138 154 171 187 204 221 236 23 13 17 31 43 53  70  83 103 114 131 149 167 185 203 220 237 24 17 22 35 42 58  78  93 110 125 139 155 170 188 206 224 240 25  8 15 34 50 67  83  99 115 131 146 162 178 193 209 224 239 26 13 16 41 66 73  86  95 111 128 137 150 163 183 206 225 241 27 17 25 37 52 63  75  92 102 119 132 144 160 175 191 212 231 28 19 31 49 65 83 100 117 133 147 161 174 187 200 213 227 242 29 18 31 52 68 88 103 117 126 138 149 163 177 192 207 223 239 30 16 29 47 61 76  90 106 119 133 147 161 176 193 209 224 240 31 15 21 35 50 61  73  86  97 110 119 129 141 175 198 218 237 Given the stage-1 codebook entry cb1_Q8[], the stage-2 residual res_Q10[], and their corresponding weights, w_Q9[], the reconstructed normalized LSF coefficients are
    where the division is integer division. However, nothing in either the reconstruction process or the quantization process in the encoder thus far guarantees that the coefficients are monotonically increasing and separated well enough to ensure a stable filter . When using the reference encoder, roughly 2% of frames violate this constraint. The next section describes a stabilization procedure used to make these guarantees.
    The normalized LSF stabilization procedure is implemented in silk_NLSF_stabilize() (NLSF_stabilize.c). This process ensures that consecutive values of the normalized LSF coefficients, NLSF_Q15[], are spaced some minimum distance apart (predetermined to be the 0.01 percentile of a large training set). gives the minimum spacings for NB and MB and those for WB, where row k is the minimum allowed value of NLSF_Q[k]-NLSF_Q[k-1]. For the purposes of computing this spacing for the first and last coefficient, NLSF_Q15[-1] is taken to be 0, and NLSF_Q15[d_LPC] is taken to be 32768. Coefficient NB and MB WB 0 250 100 1 3 3 2 6 40 3 3 3 4 3 3 5 3 3 6 4 5 7 3 14 8 3 14 9 3 10 10 461 11 11 3 12 8 13 9 14 7 15 3 16 347 The procedure starts off by trying to make small adjustments which attempt to minimize the amount of distortion introduced. After 20 such adjustments, it falls back to a more direct method which guarantees the constraints are enforced but may require large adjustments. Let NDeltaMin_Q15[k] be the minimum required spacing for the current audio bandwidth from . First, the procedure finds the index i where NLSF_Q15[i] - NLSF_Q15[i-1] - NDeltaMin_Q15[i] is the smallest, breaking ties by using the lower value of i. If this value is non-negative, then the stabilization stops; the coefficients satisfy all the constraints. Otherwise, if i == 0, it sets NLSF_Q15[0] to NDeltaMin_Q15[0], and if i == d_LPC, it sets NLSF_Q15[d_LPC-1] to (32768 - NDeltaMin_Q15[d_LPC]). For all other values of i, both NLSF_Q15[i-1] and NLSF_Q15[i] are updated as follows:
    >1) + \ NDeltaMin_Q15[k] /_ k=0 d_LPC __ max_center_Q15 = 32768 - (NDeltaMin_Q15[i]>>1) - \ NDeltaMin_Q15[k] /_ k=i+1 center_freq_Q15 = clamp(min_center_Q15[i], (NLSF_Q15[i-1] + NLSF_Q15[i] + 1)>>1, max_center_Q15[i]) NLSF_Q15[i-1] = center_freq_Q15 - (NDeltaMin_Q15[i]>>1) NLSF_Q15[i] = NLSF_Q15[i-1] + NDeltaMin_Q15[i] . ]]>
    Then the procedure repeats again, until it has either executed 20 times or has stopped because the coefficients satisfy all the constraints.
    After the 20th repetition of the above procedure, the following fallback procedure executes once. First, the values of NLSF_Q15[k] for 0 <= k < d_LPC are sorted in ascending order. Then for each value of k from 0 to d_LPC-1, NLSF_Q15[k] is set to
    Next, for each value of k from d_LPC-1 down to 0, NLSF_Q15[k] is set to
    For 20 ms SILK frames, the first half of the frame (i.e., the first two subframes) may use normalized LSF coefficients that are interpolated between the decoded LSFs for the most recent coded frame (in the same channel) and the current frame. A Q2 interpolation factor follows the LSF coefficient indices in the bitstream, which is decoded using the PDF in . This happens in silk_decode_indices() (decode_indices.c). After either An uncoded regular SILK frame in the side channel, or A decoder reset (see ), the decoder still decodes this factor, but ignores its value and always uses 4 instead. For 10 ms SILK frames, this factor is not stored at all. PDF {13, 22, 29, 11, 181}/256 Let n2_Q15[k] be the normalized LSF coefficients decoded by the procedure in , n0_Q15[k] be the LSF coefficients decoded for the prior frame, and w_Q2 be the interpolation factor. Then the normalized LSF coefficients used for the first half of a 20 ms frame, n1_Q15[k], are
    > 2) . ]]>
    This interpolation is performed in silk_decode_parameters() (decode_parameters.c).
    Any LPC filter A(z) can be split into a symmetric part P(z) and an anti-symmetric part Q(z) such that
    with
    The even normalized LSF coefficients correspond to a pair of conjugate roots of P(z), while the odd coefficients correspond to a pair of conjugate roots of Q(z), all of which lie on the unit circle. In addition, P(z) has a root at pi and Q(z) has a root at 0. Thus, they may be reconstructed mathematically from a set of normalized LSF coefficients, n[k], as
    However, SILK performs this reconstruction using a fixed-point approximation so that all decoders can reproduce it in a bit-exact manner to avoid prediction drift. The function silk_NLSF2A() (NLSF2A.c) implements this procedure. To start, it approximates cos(pi*n[k]) using a table lookup with linear interpolation. The encoder SHOULD use the inverse of this piecewise linear approximation, rather than the true inverse of the cosine function, when deriving the normalized LSF coefficients. These values are also re-ordered to improve numerical accuracy when constructing the LPC polynomials. Coefficient NB and MB WB 0 0 0 1 9 15 2 6 8 3 3 7 4 4 4 5 5 11 6 8 12 7 1 3 8 2 2 9 7 13 10 10 11 5 12 6 13 9 14 14 15 1 The top 7 bits of each normalized LSF coefficient index a value in the table, and the next 8 bits interpolate between it and the next value. Let i = (n[k] >> 8) be the integer index and f = (n[k] & 255) be the fractional part of a given coefficient. Then the re-ordered, approximated cosine, c_Q17[ordering[k]], is
    > 3 , ]]>
    where ordering[k] is the k'th entry of the column of corresponding to the current audio bandwidth and cos_Q12[i] is the i'th entry of .
    i +0 +1 +2 +3 0 4096 4095 4091 4085 4 4076 4065 4052 4036 8 4017 3997 3973 3948 12 3920 3889 3857 3822 16 3784 3745 3703 3659 20 3613 3564 3513 3461 24 3406 3349 3290 3229 28 3166 3102 3035 2967 32 2896 2824 2751 2676 36 2599 2520 2440 2359 40 2276 2191 2106 2019 44 1931 1842 1751 1660 48 1568 1474 1380 1285 52 1189 1093 995 897 56 799 700 601 501 60 401 301 201 101 64 0 -101 -201 -301 68 -401 -501 -601 -700 72 -799 -897 -995 -1093 76 -1189-1285-1380-1474 80 -1568-1660-1751-1842 84 -1931-2019-2106-2191 88 -2276-2359-2440-2520 92 -2599-2676-2751-2824 96 -2896-2967-3035-3102 100 -3166-3229-3290-3349 104 -3406-3461-3513-3564 108 -3613-3659-3703-3745 112 -3784-3822-3857-3889 116 -3920-3948-3973-3997 120 -4017-4036-4052-4065 124 -4076-4085-4091-4095 128 -4096 Given the list of cosine values, silk_NLSF2A_find_poly() (NLSF2A.c) computes the coefficients of P and Q, described here via a simple recurrence. Let p_Q16[k][j] and q_Q16[k][j] be the coefficients of the products of the first (k+1) root pairs for P and Q, with j indexing the coefficient number. Only the first (k+2) coefficients are needed, as the products are symmetric. Let p_Q16[0][0] = q_Q16[0][0] = 1<<16, p_Q16[0][1] = -c_Q17[0], q_Q16[0][1] = -c_Q17[1], and d2 = d_LPC/2. As boundary conditions, assume p_Q16[k][j] = q_Q16[k][j] = 0 for all j < 0. Also, assume p_Q16[k][k+2] = p_Q16[k][k] and q_Q16[k][k+2] = q_Q16[k][k] (because of the symmetry). Then, for 0 < k < d2 and 0 <= j <= k+1,
    >16) , q_Q16[k][j] = q_Q16[k-1][j] + q_Q16[k-1][j-2] - ((c_Q17[2*k+1]*q_Q16[k-1][j-1] + 32768)>>16) . ]]>
    The use of Q17 values for the cosine terms in an otherwise Q16 expression implicitly scales them by a factor of 2. The multiplications in this recurrence may require up to 48 bits of precision in the result to avoid overflow. In practice, each row of the recurrence only depends on the previous row, so an implementation does not need to store all of them.
    silk_NLSF2A() uses the values from the last row of this recurrence to reconstruct a 32-bit version of the LPC filter (without the leading 1.0 coefficient), a32_Q17[k], 0 <= k < d2:
    The sum and difference of two terms from each of the p_Q16 and q_Q16 coefficient lists reflect the (1 + z**-1) and (1 - z**-1) factors of P and Q, respectively. The promotion of the expression from Q16 to Q17 implicitly scales the result by 1/2.
    The a32_Q17[] coefficients are too large to fit in a 16-bit value, which significantly increases the cost of applying this filter in fixed-point decoders. Reducing them to Q12 precision doesn't incur any significant quality loss, but still does not guarantee they will fit. silk_NLSF2A() applies up to 10 rounds of bandwidth expansion to limit the dynamic range of these coefficients. Even floating-point decoders SHOULD perform these steps, to avoid mismatch. For each round, the process first finds the index k such that abs(a32_Q17[k]) is largest, breaking ties by choosing the lowest value of k. Then, it computes the corresponding Q12 precision value, maxabs_Q12, subject to an upper bound to avoid overflow in subsequent computations:
    > 5, 163838) . ]]>
    If this is larger than 32767, the procedure derives the chirp factor, sc_Q16[0], to use in the bandwidth expansion as
    > 2 ]]>
    where the division here is integer division. This is an approximation of the chirp factor needed to reduce the target coefficient to 32767, though it is both less than 0.999 and, for k > 0 when maxabs_Q12 is much greater than 32767, still slightly too large. The upper bound on maxabs_Q12, 163838, was chosen because it is equal to ((2**31 - 1) >> 14) + 32767, i.e., the largest value of maxabs_Q12 that would not overflow the numerator in the equation above when stored in a signed 32-bit integer.
    silk_bwexpander_32() (bwexpander_32.c) performs the bandwidth expansion (again, only when maxabs_Q12 is greater than 32767) using the following recurrence:
    > 16 sc_Q16[k+1] = (sc_Q16[0]*sc_Q16[k] + 32768) >> 16 ]]>
    The first multiply may require up to 48 bits of precision in the result to avoid overflow. The second multiply must be unsigned to avoid overflow with only 32 bits of precision. The reference implementation uses a slightly more complex formulation that avoids the 32-bit overflow using signed multiplication, but is otherwise equivalent.
    After 10 rounds of bandwidth expansion are performed, they are simply saturated to 16 bits:
    > 5, 32767) << 5 . ]]>
    Because this performs the actual saturation in the Q12 domain, but converts the coefficients back to the Q17 domain for the purposes of prediction gain limiting, this step must be performed after the 10th round of bandwidth expansion, regardless of whether or not the Q12 version of any coefficient still overflows a 16-bit integer. This saturation is not performed if maxabs_Q12 drops to 32767 or less prior to the 10th round.
    The prediction gain of an LPC synthesis filter is the square-root of the output energy when the filter is excited by a unit-energy impulse. Even if the Q12 coefficients would fit, the resulting filter may still have a significant gain (especially for voiced sounds), making the filter unstable. silk_NLSF2A() applies up to 18 additional rounds of bandwidth expansion to limit the prediction gain. Instead of controlling the amount of bandwidth expansion using the prediction gain itself (which may diverge to infinity for an unstable filter), silk_NLSF2A() uses silk_LPC_inverse_pred_gain_QA() (LPC_inv_pred_gain.c) to compute the reflection coefficients associated with the filter. The filter is stable if and only if the magnitude of these coefficients is sufficiently less than one. The reflection coefficients, rc[k], can be computed using a simple Levinson recurrence, initialized with the LPC coefficients a[d_LPC-1][n] = a[n], and then updated via
    However, silk_LPC_inverse_pred_gain_QA() approximates this using fixed-point arithmetic to guarantee reproducible results across platforms and implementations. Since small changes in the coefficients can make a stable filter unstable, it takes the real Q12 coefficients that will be used during reconstruction as input. Thus, let
    > 5 ]]>
    be the Q12 version of the LPC coefficients that will eventually be used. As a simple initial check, the decoder computes the DC response as
    and if DC_resp > 4096, the filter is unstable.
    Increasing the precision of these Q12 coefficients to Q24 for intermediate computations allows more accurate computation of the reflection coefficients, so the decoder initializes the recurrence via
    Then for each k from d_LPC-1 down to 0, if abs(a32_Q24[k][k]) > 16773022, the filter is unstable and the recurrence stops. The constant 16773022 here is approximately 0.99975 in Q24. Otherwise, row k-1 of a32_Q24 is computed from row k as
    > 32) , b1[k] = ilog(div_Q30[k]) , b2[k] = b1[k] - 16 , (1<<29) - 1 inv_Qb2[k] = ----------------------- , div_Q30[k] >> (b2[k]+1) err_Q29[k] = (1<<29) - ((div_Q30[k]<<(15-b2[k]))*inv_Qb2[k] >> 16) , gain_Qb1[k] = ((inv_Qb2[k] << 16) + (err_Q29[k]*inv_Qb2[k] >> 13)) , num_Q24[k-1][n] = a32_Q24[k][n] - ((a32_Q24[k][k-n-1]*rc_Q31[k] + (1<<30)) >> 31) , a32_Q24[k-1][n] = (num_Q24[k-1][n]*gain_Qb1[k] + (1<<(b1[k]-1))) >> b1[k] , ]]>
    where 0 <= n < k. Here, rc_Q30[k] are the reflection coefficients. div_Q30[k] is the denominator for each iteration, and gain_Qb1[k] is its multiplicative inverse (with b1[k] fractional bits, where b1[k] ranges from 20 to 31). inv_Qb2[k], which ranges from 16384 to 32767, is a low-precision version of that inverse (with b2[k] fractional bits). err_Q29[k] is the residual error, ranging from -32763 to 32392, which is used to improve the accuracy. The values t_Q24[k-1][n] for each n are the numerators for the next row of coefficients in the recursion, and a32_Q24[k-1][n] is the final version of that row. Every multiply in this procedure except the one used to compute gain_Qb1[k] requires more than 32 bits of precision, but otherwise all intermediate results fit in 32 bits or less. In practice, because each row only depends on the next one, an implementation does not need to store them all.
    If abs(a32_Q24[k][k]) <= 16773022 for 0 <= k < d_LPC, then the filter is considered stable. However, the problem of determining stability is ill-conditioned when the filter contains several reflection coefficients whose magnitude is very close to one. This fixed-point algorithm is not mathematically guaranteed to correctly classify filters as stable or unstable in this case, though it does very well in practice. On round i, 1 <= i <= 18, if the filter passes these stability checks, then this procedure stops, and the final LPC coefficients to use for reconstruction in are
    > 5 . ]]>
    Otherwise, a round of bandwidth expansion is applied using the same procedure as in , with
    During the 15th round, sc_Q16[0] becomes 0 in the above equation, so a_Q12[k] is set to 0 for all k, guaranteeing a stable filter.
    After the normalized LSF indices and, for 20 ms frames, the LSF interpolation index, voiced frames (see ) include additional LTP parameters. There is one primary lag index for each SILK frame, but this is refined to produce a separate lag index per subframe using a vector quantizer. Each subframe also gets its own prediction gain coefficient.
    The primary lag index is coded either relative to the primary lag of the prior frame in the same channel, or as an absolute index. Absolute coding is used if and only if This is the first SILK frame of its type (LBRR or regular) for this channel in the current Opus frame, The previous SILK frame of the same type (LBRR or regular) for this channel in the same Opus frame was not coded, or That previous SILK frame was coded, but was not voiced (see ). With absolute coding, the primary pitch lag may range from 2 ms (inclusive) up to 18 ms (exclusive), corresponding to pitches from 500 Hz down to 55.6 Hz, respectively. It is comprised of a high part and a low part, where the decoder reads the high part using the 32-entry codebook in and the low part using the codebook corresponding to the current audio bandwidth from . The final primary pitch lag is then
    where lag_high is the high part, lag_low is the low part, and lag_scale and lag_min are the values from the "Scale" and "Minimum Lag" columns of , respectively.
    PDF {3, 3, 6, 11, 21, 30, 32, 19, 11, 10, 12, 13, 13, 12, 11, 9, 8, 7, 6, 4, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1}/256 Audio Bandwidth PDF Scale Minimum Lag Maximum Lag NB {64, 64, 64, 64}/256 4 16 144 MB {43, 42, 43, 43, 42, 43}/256 6 24 216 WB {32, 32, 32, 32, 32, 32, 32, 32}/256 8 32 288 All frames that do not use absolute coding for the primary lag index use relative coding instead. The decoder reads a single delta value using the 21-entry PDF in . If the resulting value is zero, it falls back to the absolute coding procedure from the prior paragraph. Otherwise, the final primary pitch lag is then
    where previous_lag is the primary pitch lag from the most recent frame in the same channel and delta_lag_index is the value just decoded. This allows a per-frame change in the pitch lag of -8 to +11 samples. The decoder does no clamping at this point, so this value can fall outside the range of 2 ms to 18 ms, and the decoder must use this unclamped value when using relative coding in the next SILK frame (if any). However, because an Opus frame can use relative coding for at most two consecutive SILK frames, integer overflow should not be an issue.
    PDF {46, 2, 2, 3, 4, 6, 10, 15, 26, 38, 30, 22, 15, 10, 7, 6, 4, 4, 2, 2, 2}/256 After the primary pitch lag, a "pitch contour", stored as a single entry from one of four small VQ codebooks, gives lag offsets for each subframe in the current SILK frame. The codebook index is decoded using one of the PDFs in depending on the current frame size and audio bandwidth. Tables  through  give the corresponding offsets to apply to the primary pitch lag for each subframe given the decoded codebook index. Audio Bandwidth SILK Frame Size Codebook Size PDF NB 10 ms 3 {143, 50, 63}/256 NB 20 ms 11 {68, 12, 21, 17, 19, 22, 30, 24, 17, 16, 10}/256 MB or WB 10 ms 12 {91, 46, 39, 19, 14, 12, 8, 7, 6, 5, 5, 4}/256 MB or WB 20 ms 34 {33, 22, 18, 16, 15, 14, 14, 13, 13, 10, 9, 9, 8, 6, 6, 6, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1}/256 Index Subframe Offsets 0  0  0 1  1  0 2  0  1 Index Subframe Offsets 0  0  0  0  0 1  2  1  0 -1 2 -1  0  1  2 3 -1  0  0  1 4 -1  0  0  0 5  0  0  0  1 6  0  0  1  1 7  1  1  0  0 8  1  0  0  0 9  0  0  0 -1 10  1  0  0 -1 Index Subframe Offsets 0  0  0 1  0  1 2  1  0 3 -1  1 4  1 -1 5 -1  2 6  2 -1 7 -2  2 8  2 -2 9 -2  3 10  3 -2 11 -3  3 Index Subframe Offsets 0  0  0  0  0 1  0  0  1  1 2  1  1  0  0 3 -1  0  0  0 4  0  0  0  1 5  1  0  0  0 6 -1  0  0  1 7  0  0  0 -1 8 -1  0  1  2 9  1  0  0 -1 10 -2 -1  1  2 11  2  1  0 -1 12 -2  0  0  2 13 -2  0  1  3 14  2  1 -1 -2 15 -3 -1  1  3 16  2  0  0 -2 17  3  1  0 -2 18 -3 -1  2  4 19 -4 -1  1  4 20  3  1 -1 -3 21 -4 -1  2  5 22  4  2 -1 -3 23  4  1 -1 -4 24 -5 -1  2  6 25  5  2 -1 -4 26 -6 -2  2  6 27 -5 -2  2  5 28  6  2 -1 -5 29 -7 -2  3  8 30  6  2 -2 -6 31  5  2 -2 -5 32  8  3 -2 -7 33 -9 -3  3  9 The final pitch lag for each subframe is assembled in silk_decode_pitch() (decode_pitch.c). Let lag be the primary pitch lag for the current SILK frame, contour_index be index of the VQ codebook, and lag_cb[contour_index][k] be the corresponding entry of the codebook from the appropriate table given above for the k'th subframe. Then the final pitch lag for that subframe is
    where lag_min and lag_max are the values from the "Minimum Lag" and "Maximum Lag" columns of , respectively.
    SILK uses a separate 5-tap pitch filter for each subframe, selected from one of three codebooks. The three codebooks each represent different rate-distortion trade-offs, with average rates of 1.61 bits/subframe, 3.68 bits/subframe, and 4.85 bits/subframe, respectively. The importance of the filter coefficients generally depends on two factors: the periodicity of the signal and relative energy between the current subframe and the signal from one period earlier. Greater periodicity and decaying energy both lead to more important filter coefficients, and thus should be coded with lower distortion and higher rate. These properties are relatively stable over the duration of a single SILK frame, hence all of the subframes in a SILK frame choose their filter from the same codebook. This is signaled with an explicitly-coded "periodicity index". This immediately follows the subframe pitch lags, and is coded using the 3-entry PDF from . PDF {77, 80, 99}/256 The indices of the filters for each subframe follow. They are all coded using the PDF from corresponding to the periodicity index. Tables  through  contain the corresponding filter taps as signed Q7 integers. Periodicity Index Codebook Size PDF 0 8 {185, 15, 13, 13, 9, 9, 6, 6}/256 1 16 {57, 34, 21, 20, 15, 13, 12, 13, 10, 10, 9, 10, 9, 8, 7, 8}/256 2 32 {15, 16, 14, 12, 12, 12, 11, 11, 11, 10, 9, 9, 9, 9, 8, 8, 8, 8, 7, 7, 6, 6, 5, 4, 5, 4, 4, 4, 3, 4, 3, 2}/256 Index Filter Taps (Q7) 0   4   6  24   7   5 1   0   0   2   0   0 2  12  28  41  13  -4 3  -9  15  42  25  14 4   1  -2  62  41  -9 5 -10  37  65  -4   3 6  -6   4  66   7  -8 7  16  14  38  -3  33 Index Filter Taps (Q7) 0  13  22  39  23  12 1  -1  36  64  27  -6 2  -7  10  55  43  17 3   1   1   8   1   1 4   6 -11  74  53  -9 5 -12  55  76 -12   8 6  -3   3  93  27  -4 7  26  39  59   3  -8 8   2   0  77  11   9 9  -8  22  44  -6   7 10  40   9  26   3   9 11  -7  20 101  -7   4 12   3  -8  42  26   0 13 -15  33  68   2  23 14  -2  55  46  -2  15 15   3  -1  21  16  41 Index Filter Taps (Q7) 0  -6  27  61  39   5 1 -11  42  88   4   1 2  -2  60  65   6  -4 3  -1  -5  73  56   1 4  -9  19  94  29  -9 5   0  12  99   6   4 6   8 -19 102  46 -13 7   3   2  13   3   2 8   9 -21  84  72 -18 9 -11  46 104 -22   8 10  18  38  48  23   0 11 -16  70  83 -21  11 12   5 -11 117  22  -8 13  -6  23 117 -12   3 14   3  -8  95  28   4 15 -10  15  77  60 -15 16  -1   4 124   2  -4 17   3  38  84  24 -25 18   2  13  42  13  31 19  21  -4  56  46  -1 20  -1  35  79 -13  19 21  -7  65  88  -9 -14 22  20   4  81  49 -29 23  20   0  75   3 -17 24   5  -9  44  92  -8 25   1  -3  22  69  31 26  -6  95  41 -12   5 27  39  67  16  -4   1 28   0  -6 120  55 -36 29 -13  44 122   4 -24 30  81   5  11   3   7 31   2   0   9  10  88
    An LTP scaling parameter appears after the LTP filter coefficients if and only if This is a voiced frame (see ), and Either This SILK frame corresponds to the first time interval of the current Opus frame for its type (LBRR or regular), or This is an LBRR frame where the LBRR flags (see ) indicate the previous LBRR frame in the same channel is not coded. This allows the encoder to trade off the prediction gain between packets against the recovery time after packet loss. Unlike absolute-coding for pitch lags, regular SILK frames that are not at the start of an Opus frame (i.e., that do not correspond to the first 20 ms time interval in Opus frames of 40 or 60 ms) do not include this field, even if the prior frame was not voiced, or (in the case of the side channel) not even coded. After an uncoded frame in the side channel, the LTP buffer (see ) is cleared to zero, and is thus in a known state. In contrast, LBRR frames do include this field when the prior frame was not coded, since the LTP buffer contains the output of the PLC, which is non-normative. If present, the decoder reads a value using the 3-entry PDF in . The three possible values represent Q14 scale factors of 15565, 12288, and 8192, respectively (corresponding to approximately 0.95, 0.75, and 0.5). Frames that do not code the scaling parameter use the default factor of 15565 (approximately 0.95). PDF {128, 64, 64}/256
    As described in , SILK uses a linear congruential generator (LCG) to inject pseudorandom noise into the quantized excitation. To ensure synchronization of this process between the encoder and decoder, each SILK frame stores a 2-bit seed after the LTP parameters (if any). The encoder may consider the choice of seed during quantization, and the flexibility of this choice lets it reduce distortion, helping to pay for the bit cost required to signal it. The decoder reads the seed using the uniform 4-entry PDF in , yielding a value between 0 and 3, inclusive. PDF {64, 64, 64, 64}/256
    SILK codes the excitation using a modified version of the Pyramid Vector Quantization (PVQ) codebook . The PVQ codebook is designed for Laplace-distributed values and consists of all sums of K signed, unit pulses in a vector of dimension N, where two pulses at the same position are required to have the same sign. Thus the codebook includes all integer codevectors y of dimension N that satisfy
    Unlike regular PVQ, SILK uses a variable-length, rather than fixed-length, encoding. This encoding is better suited to the more Gaussian-like distribution of the coefficient magnitudes and the non-uniform distribution of their signs (caused by the quantization offset described below). SILK also handles large codebooks by coding the least significant bits (LSBs) of each coefficient directly. This adds a small coding efficiency loss, but greatly reduces the computation time and ROM size required for decoding, as implemented in silk_decode_pulses() (decode_pulses.c).
    SILK fixes the dimension of the codebook to N = 16. The excitation is made up of a number of "shell blocks", each 16 samples in size. lists the number of shell blocks required for a SILK frame for each possible audio bandwidth and frame size. 10 ms MB frames nominally contain 120 samples (10 ms at 12 kHz), which is not a multiple of 16. This is handled by coding 8 shell blocks (128 samples) and discarding the final 8 samples of the last block. The decoder contains no special case that prevents an encoder from placing pulses in these samples, and they must be correctly parsed from the bitstream if present, but they are otherwise ignored. Audio Bandwidth Frame Size Number of Shell Blocks NB 10 ms 5 MB 10 ms 8 WB 10 ms 10 NB 20 ms 10 MB 20 ms 15 WB 20 ms 20
    The first symbol in the excitation is a "rate level", which is an index from 0 to 8, inclusive, coded using the PDF in corresponding to the signal type of the current frame (from ). The rate level selects the PDF used to decode the number of pulses in the individual shell blocks. It does not directly convey any information about the bitrate or the number of pulses itself, but merely changes the probability of the symbols in . Level 0 provides a more efficient encoding at low rates generally, and level 8 provides a more efficient encoding at high rates generally, though the most efficient level for a particular SILK frame may depend on the exact distribution of the coded symbols. An encoder should, but is not required to, use the most efficient rate level. Signal Type PDF Inactive or Unvoiced {15, 51, 12, 46, 45, 13, 33, 27, 14}/256 Voiced {33, 30, 36, 17, 34, 49, 18, 21, 18}/256
    The total number of pulses in each of the shell blocks follows the rate level. The pulse counts for all of the shell blocks are coded consecutively, before the content of any of the blocks. Each block may have anywhere from 0 to 16 pulses, inclusive, coded using the 18-entry PDF in corresponding to the rate level from . The special value 17 indicates that this block has one or more additional LSBs to decode for each coefficient. If the decoder encounters this value, it decodes another value for the actual pulse count of the block, but uses the PDF corresponding to the special rate level 9 instead of the normal rate level. This process repeats until the decoder reads a value less than 17, and it then sets the number of extra LSBs used to the number of 17's decoded for that block. If it reads the value 17 ten times, then the next iteration uses the special rate level 10 instead of 9. The probability of decoding a 17 when using the PDF for rate level 10 is zero, ensuring that the number of LSBs for a block will not exceed 10. The cumulative distribution for rate level 10 is just a shifted version of that for 9 and thus does not require any additional storage. Rate Level PDF 0 {131, 74, 25, 8, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}/256 1 {58, 93, 60, 23, 7, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}/256 2 {43, 51, 46, 33, 24, 16, 11, 8, 6, 3, 3, 3, 2, 1, 1, 2, 1, 2}/256 3 {17, 52, 71, 57, 31, 12, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}/256 4 {6, 21, 41, 53, 49, 35, 21, 11, 6, 3, 2, 2, 1, 1, 1, 1, 1, 1}/256 5 {7, 14, 22, 28, 29, 28, 25, 20, 17, 13, 11, 9, 7, 5, 4, 4, 3, 10}/256 6 {2, 5, 14, 29, 42, 46, 41, 31, 19, 11, 6, 3, 2, 1, 1, 1, 1, 1}/256 7 {1, 2, 4, 10, 19, 29, 35, 37, 34, 28, 20, 14, 8, 5, 4, 2, 2, 2}/256 8 {1, 2, 2, 5, 9, 14, 20, 24, 27, 28, 26, 23, 20, 15, 11, 8, 6, 15}/256 9 {1, 1, 1, 6, 27, 58, 56, 39, 25, 14, 10, 6, 3, 3, 2, 1, 1, 2}/256 10 {2, 1, 6, 27, 58, 56, 39, 25, 14, 10, 6, 3, 3, 2, 1, 1, 2, 0}/256
    The locations of the pulses in each shell block follow the pulse counts, as decoded by silk_shell_decoder() (shell_coder.c). As with the pulse counts, these locations are coded for all the shell blocks before any of the remaining information for each block. Unlike many other codecs, SILK places no restriction on the distribution of pulses within a shell block. All of the pulses may be placed in a single location, or each one in a unique location, or anything in between. The location of pulses is coded by recursively partitioning each block into halves, and coding how many pulses fall on the left side of the split. All remaining pulses must fall on the right side of the split. The process then recurses into the left half, and after that returns, the right half (preorder traversal). The PDF to use is chosen by the size of the current partition (16, 8, 4, or 2) and the number of pulses in the partition (1 to 16, inclusive). Tables  through  list the PDFs used for each partition size and pulse count. This process skips partitions without any pulses, i.e., where the initial pulse count from was zero, or where the split in the prior level indicated that all of the pulses fell on the other side. These partitions have nothing to code, so they require no PDF. Pulse Count PDF 1 {126, 130}/256 2 {56, 142, 58}/256 3 {25, 101, 104, 26}/256 4 {12, 60, 108, 64, 12}/256 5 {7, 35, 84, 87, 37, 6}/256 6 {4, 20, 59, 86, 63, 21, 3}/256 7 {3, 12, 38, 72, 75, 42, 12, 2}/256 8 {2, 8, 25, 54, 73, 59, 27, 7, 1}/256 9 {2, 5, 17, 39, 63, 65, 42, 18, 4, 1}/256 10 {1, 4, 12, 28, 49, 63, 54, 30, 11, 3, 1}/256 11 {1, 4, 8, 20, 37, 55, 57, 41, 22, 8, 2, 1}/256 12 {1, 3, 7, 15, 28, 44, 53, 48, 33, 16, 6, 1, 1}/256 13 {1, 2, 6, 12, 21, 35, 47, 48, 40, 25, 12, 5, 1, 1}/256 14 {1, 1, 4, 10, 17, 27, 37, 47, 43, 33, 21, 9, 4, 1, 1}/256 15 {1, 1, 1, 8, 14, 22, 33, 40, 43, 38, 28, 16, 8, 1, 1, 1}/256 16 {1, 1, 1, 1, 13, 18, 27, 36, 41, 41, 34, 24, 14, 1, 1, 1, 1}/256 Pulse Count PDF 1 {127, 129}/256 2 {53, 149, 54}/256 3 {22, 105, 106, 23}/256 4 {11, 61, 111, 63, 10}/256 5 {6, 35, 86, 88, 36, 5}/256 6 {4, 20, 59, 87, 62, 21, 3}/256 7 {3, 13, 40, 71, 73, 41, 13, 2}/256 8 {3, 9, 27, 53, 70, 56, 28, 9, 1}/256 9 {3, 8, 19, 37, 57, 61, 44, 20, 6, 1}/256 10 {3, 7, 15, 28, 44, 54, 49, 33, 17, 5, 1}/256 11 {1, 7, 13, 22, 34, 46, 48, 38, 28, 14, 4, 1}/256 12 {1, 1, 11, 22, 27, 35, 42, 47, 33, 25, 10, 1, 1}/256 13 {1, 1, 6, 14, 26, 37, 43, 43, 37, 26, 14, 6, 1, 1}/256 14 {1, 1, 4, 10, 20, 31, 40, 42, 40, 31, 20, 10, 4, 1, 1}/256 15 {1, 1, 3, 8, 16, 26, 35, 38, 38, 35, 26, 16, 8, 3, 1, 1}/256 16 {1, 1, 2, 6, 12, 21, 30, 36, 38, 36, 30, 21, 12, 6, 2, 1, 1}/256 Pulse Count PDF 1 {127, 129}/256 2 {49, 157, 50}/256 3 {20, 107, 109, 20}/256 4 {11, 60, 113, 62, 10}/256 5 {7, 36, 84, 87, 36, 6}/256 6 {6, 24, 57, 82, 60, 23, 4}/256 7 {5, 18, 39, 64, 68, 42, 16, 4}/256 8 {6, 14, 29, 47, 61, 52, 30, 14, 3}/256 9 {1, 15, 23, 35, 51, 50, 40, 30, 10, 1}/256 10 {1, 1, 21, 32, 42, 52, 46, 41, 18, 1, 1}/256 11 {1, 6, 16, 27, 36, 42, 42, 36, 27, 16, 6, 1}/256 12 {1, 5, 12, 21, 31, 38, 40, 38, 31, 21, 12, 5, 1}/256 13 {1, 3, 9, 17, 26, 34, 38, 38, 34, 26, 17, 9, 3, 1}/256 14 {1, 3, 7, 14, 22, 29, 34, 36, 34, 29, 22, 14, 7, 3, 1}/256 15 {1, 2, 5, 11, 18, 25, 31, 35, 35, 31, 25, 18, 11, 5, 2, 1}/256 16 {1, 1, 4, 9, 15, 21, 28, 32, 34, 32, 28, 21, 15, 9, 4, 1, 1}/256 Pulse Count PDF 1 {128, 128}/256 2 {42, 172, 42}/256 3 {21, 107, 107, 21}/256 4 {12, 60, 112, 61, 11}/256 5 {8, 34, 86, 86, 35, 7}/256 6 {8, 23, 55, 90, 55, 20, 5}/256 7 {5, 15, 38, 72, 72, 36, 15, 3}/256 8 {6, 12, 27, 52, 77, 47, 20, 10, 5}/256 9 {6, 19, 28, 35, 40, 40, 35, 28, 19, 6}/256 10 {4, 14, 22, 31, 37, 40, 37, 31, 22, 14, 4}/256 11 {3, 10, 18, 26, 33, 38, 38, 33, 26, 18, 10, 3}/256 12 {2, 8, 13, 21, 29, 36, 38, 36, 29, 21, 13, 8, 2}/256 13 {1, 5, 10, 17, 25, 32, 38, 38, 32, 25, 17, 10, 5, 1}/256 14 {1, 4, 7, 13, 21, 29, 35, 36, 35, 29, 21, 13, 7, 4, 1}/256 15 {1, 2, 5, 10, 17, 25, 32, 36, 36, 32, 25, 17, 10, 5, 2, 1}/256 16 {1, 2, 4, 7, 13, 21, 28, 34, 36, 34, 28, 21, 13, 7, 4, 2, 1}/256
    After the decoder reads the pulse locations for all blocks, it reads the LSBs (if any) for each block in turn. Inside each block, it reads all the LSBs for each coefficient in turn, even those where no pulses were allocated, before proceeding to the next one. For 10 ms MB frames, it reads LSBs even for the extra 8 samples in the last block. The LSBs are coded from most significant to least significant, and they all use the PDF in . PDF {136, 120}/256 The number of LSBs read for each coefficient in a block is determined in . The magnitude of the coefficient is initially equal to the number of pulses placed at that location in . As each LSB is decoded, the magnitude is doubled, and then the value of the LSB added to it, to obtain an updated magnitude.
    After decoding the pulse locations and the LSBs, the decoder knows the magnitude of each coefficient in the excitation. It then decodes a sign for all coefficients with a non-zero magnitude, using one of the PDFs from . If the value decoded is 0, then the coefficient magnitude is negated. Otherwise, it remains positive. The decoder chooses the PDF for the sign based on the signal type and quantization offset type (from ) and the number of pulses in the block (from ). The number of pulses in the block does not take into account any LSBs. Most PDFs are skewed towards negative signs because of the quantization offset, but the PDFs for zero pulses are highly skewed towards positive signs. If a block contains many positive coefficients, it is sometimes beneficial to code it solely using LSBs (i.e., with zero pulses), since the encoder may be able to save enough bits on the signs to justify the less efficient coefficient magnitude encoding. Signal Type Quantization Offset Type Pulse Count PDF Inactive Low 0 {2, 254}/256 Inactive Low 1 {207, 49}/256 Inactive Low 2 {189, 67}/256 Inactive Low 3 {179, 77}/256 Inactive Low 4 {174, 82}/256 Inactive Low 5 {163, 93}/256 Inactive Low 6 or more {157, 99}/256 Inactive High 0 {58, 198}/256 Inactive High 1 {245, 11}/256 Inactive High 2 {238, 18}/256 Inactive High 3 {232, 24}/256 Inactive High 4 {225, 31}/256 Inactive High 5 {220, 36}/256 Inactive High 6 or more {211, 45}/256 Unvoiced Low 0 {1, 255}/256 Unvoiced Low 1 {210, 46}/256 Unvoiced Low 2 {190, 66}/256 Unvoiced Low 3 {178, 78}/256 Unvoiced Low 4 {169, 87}/256 Unvoiced Low 5 {162, 94}/256 Unvoiced Low 6 or more {152, 104}/256 Unvoiced High 0 {48, 208}/256 Unvoiced High 1 {242, 14}/256 Unvoiced High 2 {235, 21}/256 Unvoiced High 3 {224, 32}/256 Unvoiced High 4 {214, 42}/256 Unvoiced High 5 {205, 51}/256 Unvoiced High 6 or more {190, 66}/256 Voiced Low 0 {1, 255}/256 Voiced Low 1 {162, 94}/256 Voiced Low 2 {152, 104}/256 Voiced Low 3 {147, 109}/256 Voiced Low 4 {144, 112}/256 Voiced Low 5 {141, 115}/256 Voiced Low 6 or more {138, 118}/256 Voiced High 0 {8, 248}/256 Voiced High 1 {203, 53}/256 Voiced High 2 {187, 69}/256 Voiced High 3 {176, 80}/256 Voiced High 4 {168, 88}/256 Voiced High 5 {161, 95}/256 Voiced High 6 or more {154, 102}/256
    After the signs have been read, there is enough information to reconstruct the complete excitation signal. This requires adding a constant quantization offset to each non-zero sample, and then pseudorandomly inverting and offsetting every sample. The constant quantization offset varies depending on the signal type and quantization offset type (see ). Signal Type Quantization Offset Type Quantization Offset (Q23) Inactive Low 25 Inactive High 60 Unvoiced Low 25 Unvoiced High 60 Voiced Low 8 Voiced High 25 Let e_raw[i] be the raw excitation value at position i, with a magnitude composed of the pulses at that location (see ) combined with any additional LSBs (see ), and with the corresponding sign decoded in . Additionally, let seed be the current pseudorandom seed, which is initialized to the value decoded from for the first sample in the current SILK frame, and updated for each subsequent sample according to the procedure below. Finally, let offset_Q23 be the quantization offset from . Then the following procedure produces the final reconstructed excitation value, e_Q23[i]:
    When e_raw[i] is zero, sign() returns 0 by the definition in , so the factor of 20 does not get added. The final e_Q23[i] value may require more than 16 bits per sample, but will not require more than 23, including the sign.
    The remainder of the reconstruction process for the frame does not need to be bit-exact, as small errors should only introduce proportionally small distortions. Although the reference implementation only includes a fixed-point version of the remaining steps, this section describes them in terms of a floating-point version for simplicity. This produces a signal with a nominal range of -1.0 to 1.0. silk_decode_core() (decode_core.c) contains the code for the main reconstruction process. It proceeds subframe-by-subframe, since quantization gains, LTP parameters, and (in 20 ms SILK frames) LPC coefficients can vary from one to the next. Let a_Q12[k] be the LPC coefficients for the current subframe. If this is the first or second subframe of a 20 ms SILK frame and the LSF interpolation factor, w_Q2 (see ), is less than 4, then these correspond to the final LPC coefficients produced by from the interpolated LSF coefficients, n1_Q15[k] (computed in ). Otherwise, they correspond to the final LPC coefficients produced from the uninterpolated LSF coefficients for the current frame, n2_Q15[k]. Also, let n be the number of samples in a subframe (40 for NB, 60 for MB, and 80 for WB), s be the index of the current subframe in this SILK frame (0 or 1 for 10 ms frames, or 0 to 3 for 20 ms frames), and j be the index of the first sample in the residual corresponding to the current subframe.
    Voiced SILK frames (see ) pass the excitation through an LTP filter using the parameters decoded in to produce an LPC residual. The LTP filter requires LPC residual values from before the current subframe as input. However, since the LPC coefficients may have changed, it obtains this residual by "rewhitening" the corresponding output signal using the LPC coefficients from the current subframe. Let out[i] for (j - pitch_lags[s] - d_LPC - 2) <= i < j be the fully reconstructed output signal from the last (pitch_lags[s] + d_LPC + 2) samples of previous subframes (see ), where pitch_lags[s] is the pitch lag for the current subframe from . During reconstruction of the first subframe for this channel after either An uncoded regular SILK frame (if this is the side channel), or A decoder reset (see ), out[] is rewhitened into an LPC residual, res[i], via
    This requires storage to buffer up to 306 values of out[i] from previous subframes. This corresponds to WB with a maximum pitch lag of 18 ms * 16 kHz samples, plus 16 samples for d_LPC, plus 2 samples for the width of the LTP filter.
    Let e_Q23[i] for j <= i < (j + n) be the excitation for the current subframe, and b_Q7[k] for 0 <= k < 5 be the coefficients of the LTP filter taken from the codebook entry in one of Tables  through  corresponding to the index decoded for the current subframe in . Then for i such that j <= i < (j + n), the LPC residual is
    For unvoiced frames, the LPC residual for j <= i < (j + n) is simply a normalized copy of the excitation signal, i.e.,
    LPC synthesis uses the short-term LPC filter to predict the next output coefficient. For i such that (j - d_LPC) <= i < j, let lpc[i] be the result of LPC synthesis from the last d_LPC samples of the previous subframe, or zeros in the first subframe for this channel after either An uncoded regular SILK frame (if this is the side channel), or A decoder reset (see ). Then for i such that j <= i < (j + n), the result of LPC synthesis for the current subframe is
    The decoder saves the final d_LPC values, i.e., lpc[i] such that (j + n - d_LPC) <= i < (j + n), to feed into the LPC synthesis of the next subframe. This requires storage for up to 16 values of lpc[i] (for WB frames).
    Then, the signal is clamped into the final nominal range:
    This clamping occurs entirely after the LPC synthesis filter has run. The decoder saves the unclamped values, lpc[i], to feed into the LPC filter for the next subframe, but saves the clamped values, out[i], for rewhitening in voiced frames.
    For stereo streams, after decoding a frame from each channel, the decoder must convert the mid-side (MS) representation into a left-right (LR) representation. The function silk_stereo_MS_to_LR (stereo_MS_to_LR.c) implements this process. In it, the decoder predicts the side channel using a) a simple low-passed version of the mid channel, and b) the unfiltered mid channel, using the prediction weights decoded in . This simple low-pass filter imposes a one-sample delay, and the unfiltered mid channel is also delayed by one sample. In order to allow seamless switching between stereo and mono, mono streams must also impose the same one-sample delay. The encoder requires an additional one-sample delay for both mono and stereo streams, though an encoder may omit the delay for mono if it knows it will never switch to stereo. The unmixing process operates in two phases. The first phase lasts for 8 ms, during which it interpolates the prediction weights from the previous frame, prev_w0_Q13 and prev_w1_Q13, to the values for the current frame, w0_Q13 and w1_Q13. The second phase simply uses these weights for the remainder of the frame. Let mid[i] and side[i] be the contents of out[i] (from ) for the current mid and side channels, respectively, and let left[i] and right[i] be the corresponding stereo output channels. If the side channel is not coded (see ), then side[i] is set to zero. Also let j be defined as in , n1 be the number of samples in phase 1 (64 for NB, 96 for MB, and 128 for WB), and n2 be the total number of samples in the frame. Then for i such that j <= i < (j + n2), the left and right channel output is
    These formulas require two samples prior to index j, the start of the frame, for the mid channel, and one prior sample for the side channel. For the first frame after a decoder reset, zeros are used instead.
    After stereo unmixing (if any), the decoder applies resampling to convert the decoded SILK output to the sample rate desired by the application. This is necessary when decoding a Hybrid frame at SWB or FB sample rates, or whenever the decoder wants the output at a different sample rate than the internal SILK sampling rate (e.g., to allow a constant sample rate when the audio bandwidth changes, or to allow mixing with audio from other applications). The resampler itself is non-normative, and a decoder can use any method it wants to perform the resampling. However, a minimum amount of delay is imposed to allow the resampler to operate, and this delay is normative, so that the corresponding delay can be applied to the MDCT layer in the encoder. A decoder is always free to use a resampler which requires more delay than allowed for here (e.g., to improve quality), but it must then delay the output of the MDCT layer by this extra amount. Keeping as much delay as possible on the encoder side allows an encoder which knows it will never use any of the SILK or Hybrid modes to skip this delay. By contrast, if it were all applied by the decoder, then a decoder which processes audio in fixed-size blocks would be forced to delay the output of CELT frames just in case of a later switch to a SILK or Hybrid mode. gives the maximum resampler delay in samples at 48 kHz for each SILK audio bandwidth. Because the actual output rate may not be 48 kHz, it may not be possible to achieve exactly these delays while using a whole number of input or output samples. The reference implementation is able to resample to any of the supported output sampling rates (8, 12, 16, 24, or 48 kHz) within or near this delay constraint. Some resampling filters (including those used by the reference implementation) may add a delay that is not an exact integer, or is not linear-phase, and so cannot be represented by a single delay at all frequencies. However, such deviations are unlikely to be perceptible, and the comparison tool described in is designed to be relatively insensitive to them. The delays listed here are the ones that should be targeted by the encoder. Audio Bandwidth Delay in millisecond NB 0.538 MB 0.692 WB 0.706 NB is given a smaller decoder delay allocation than MB and WB to allow a higher-order filter when resampling to 8 kHz in both the encoder and decoder. This implies that the audio content of two SILK frames operating at different bandwidths are not perfectly aligned in time. This is not an issue for any transitions described in , because they all involve a SILK decoder reset. When the decoder is reset, any samples remaining in the resampling buffer are discarded, and the resampler is re-initialized with silence.
    The CELT layer of Opus is based on the Modified Discrete Cosine Transform with partially overlapping windows of 5 to 22.5 ms. The main principle behind CELT is that the MDCT spectrum is divided into bands that (roughly) follow the Bark scale, i.e., the scale of the ear's critical bands . The normal CELT layer uses 21 of those bands, though Opus Custom (see ) may use a different number of bands. In Hybrid mode, the first 17 bands (up to 8 kHz) are not coded. A band can contain as little as one MDCT bin per channel, and as many as 176 bins per channel, as detailed in . In each band, the gain (energy) is coded separately from the shape of the spectrum. Coding the gain explicitly makes it easy to preserve the spectral envelope of the signal. The remaining unit-norm shape vector is encoded using a Pyramid Vector Quantizer (PVQ) . Frame Size: 2.5 ms 5 ms 10 ms 20 ms Start Frequency Stop Frequency Band Bins: 0 1 2 4 8 0 Hz 200 Hz 1 1 2 4 8 200 Hz 400 Hz 2 1 2 4 8 400 Hz 600 Hz 3 1 2 4 8 600 Hz 800 Hz 4 1 2 4 8 800 Hz 1000 Hz 5 1 2 4 8 1000 Hz 1200 Hz 6 1 2 4 8 1200 Hz 1400 Hz 7 1 2 4 8 1400 Hz 1600 Hz 8 2 4 8 16 1600 Hz 2000 Hz 9 2 4 8 16 2000 Hz 2400 Hz 10 2 4 8 16 2400 Hz 2800 Hz 11 2 4 8 16 2800 Hz 3200 Hz 12 4 8 16 32 3200 Hz 4000 Hz 13 4 8 16 32 4000 Hz 4800 Hz 14 4 8 16 32 4800 Hz 5600 Hz 15 6 12 24 48 5600 Hz 6800 Hz 16 6 12 24 48 6800 Hz 8000 Hz 17 8 16 32 64 8000 Hz 9600 Hz 18 12 24 48 96 9600 Hz 12000 Hz 19 18 36 72 144 12000 Hz 15600 Hz 20 22 44 88 176 15600 Hz 20000 Hz Transients are notoriously difficult for transform codecs to code. CELT uses two different strategies for them: Using multiple smaller MDCTs instead of a single large MDCT, and Dynamic time-frequency resolution changes (See ). To improve quality on highly tonal and periodic signals, CELT includes a prefilter/postfilter combination. The prefilter on the encoder side attenuates the signal's harmonics. The postfilter on the decoder side restores the original gain of the harmonics, while shaping the coding noise to roughly follow the harmonics. Such noise shaping reduces the perception of the noise. When coding a stereo signal, three coding methods are available: mid-side stereo: encodes the mean and the difference of the left and right channels, intensity stereo: only encodes the mean of the left and right channels (discards the difference), dual stereo: encodes the left and right channels separately. An overview of the decoder is given in .
    | decoder |----+ | +---------+ | | | | +---------+ v | | Fine | +---+ +->| decoder |->| + | | +---------+ +---+ | ^ | +---------+ | | | | Range | | +----------+ v | Decoder |-+ | Bit | +------+ +---------+ | |Allocation| | 2**x | | +----------+ +------+ | | | | v v +--------+ | +---------+ +---+ +-------+ | pitch | +->| PVQ |->| * |->| IMDCT |->| post- |---> | | decoder | +---+ +-------+ | filter | | +---------+ +--------+ | ^ +--------------------------------------+ ]]>
    The decoder is based on the following symbols and sets of symbols: Symbol(s) PDF Condition silence {32767, 1}/32768 post-filter {1, 1}/2 octave uniform (6)post-filter period raw bits (4+octave)post-filter gain raw bits (3)post-filter tapset {2, 1, 1}/4post-filter transient {7, 1}/8 intra {7, 1}/8 coarse energy tf_change tf_select {1, 1}/2 spread {7, 2, 21, 2}/32 dyn. alloc. alloc. trim {2, 2, 5, 10, 22, 46, 22, 10, 5, 2, 2}/128 skip {1, 1}/2 intensity uniform dual {1, 1}/2 fine energy residual anti-collapse{1, 1}/2 finalize The decoder extracts information from the range-coded bitstream in the order described in . In some circumstances, it is possible for a decoded value to be out of range due to a very small amount of redundancy in the encoding of large integers by the range coder. In that case, the decoder should assume there has been an error in the coding, decoding, or transmission and SHOULD take measures to conceal the error and/or report to the application that a problem has occurred. Such out of range errors cannot occur in the SILK layer.
    The "transient" flag indicates whether the frame uses a single long MDCT or several short MDCTs. When it is set, then the MDCT coefficients represent multiple short MDCTs in the frame. When not set, the coefficients represent a single long MDCT for the frame. The flag is encoded in the bitstream with a probability of 1/8. In addition to the global transient flag is a per-band binary flag to change the time-frequency (tf) resolution independently in each band. The change in tf resolution is defined in tf_select_table[][] in celt.c and depends on the frame size, whether the transient flag is set, and the value of tf_select. The tf_select flag uses a 1/2 probability, but is only decoded if it can have an impact on the result knowing the value of all per-band tf_change flags.
    It is important to quantize the energy with sufficient resolution because any energy quantization error cannot be compensated for at a later stage. Regardless of the resolution used for encoding the spectral shape of a band, it is perceptually important to preserve the energy in each band. CELT uses a three-step coarse-fine-fine strategy for encoding the energy in the base-2 log domain, as implemented in quant_bands.c
    Coarse quantization of the energy uses a fixed resolution of 6 dB (integer part of base-2 log). To minimize the bitrate, prediction is applied both in time (using the previous frame) and in frequency (using the previous bands). The part of the prediction that is based on the previous frame can be disabled, creating an "intra" frame where the energy is coded without reference to prior frames. The decoder first reads the intra flag to determine what prediction is used. The 2-D z-transform of the prediction filter is:
    where b is the band index and l is the frame index. The prediction coefficients applied depend on the frame size in use when not using intra energy and are alpha=0, beta=4915/32768 when using intra energy. The time-domain prediction is based on the final fine quantization of the previous frame, while the frequency domain (within the current frame) prediction is based on coarse quantization only (because the fine quantization has not been computed yet). The prediction is clamped internally so that fixed point implementations with limited dynamic range always remain in the same state as floating point implementations. We approximate the ideal probability distribution of the prediction error using a Laplace distribution with separate parameters for each frame size in intra- and inter-frame modes. These parameters are held in the e_prob_model table in quant_bands.c. The coarse energy quantization is performed by unquant_coarse_energy() and unquant_coarse_energy_impl() (quant_bands.c). The encoding of the Laplace-distributed values is implemented in ec_laplace_decode() (laplace.c).
    The number of bits assigned to fine energy quantization in each band is determined by the bit allocation computation described in . Let B_i be the number of fine energy bits for band i; the refinement is an integer f in the range [0,2**B_i-1]. The mapping between f and the correction applied to the coarse energy is equal to (f+1/2)/2**B_i - 1/2. Fine energy quantization is implemented in quant_fine_energy() (quant_bands.c). When some bits are left "unused" after all other flags have been decoded, these bits are assigned to a "final" step of fine allocation. In effect, these bits are used to add one extra fine energy bit per band per channel. The allocation process determines two "priorities" for the final fine bits. Any remaining bits are first assigned only to bands of priority 0, starting from band 0 and going up. If all bands of priority 0 have received one bit per channel, then bands of priority 1 are assigned an extra bit per channel, starting from band 0. If any bits are left after this, they are left unused. This is implemented in unquant_energy_finalise() (quant_bands.c).
    Because the bit allocation drives the decoding of the range-coder stream, it MUST be recovered exactly so that identical coding decisions are made in the encoder and decoder. Any deviation from the reference's resulting bit allocation will result in corrupted output, though implementers are free to implement the procedure in any way which produces identical results. The per-band gain-shape structure of the CELT layer ensures that using the same number of bits for the spectral shape of a band in every frame will result in a roughly constant signal-to-noise ratio in that band. This results in coding noise that has the same spectral envelope as the signal. The masking curve produced by a standard psychoacoustic model also closely follows the spectral envelope of the signal. This structure means that the ideal allocation is more consistent from frame to frame than it is for other codecs without an equivalent structure, and that a fixed allocation provides fairly consistent perceptual performance . Many codecs transmit significant amounts of side information to control the bit allocation within a frame. Often this control is only indirect, and must be exercised carefully to achieve the desired rate constraints. The CELT layer, however, can adapt over a very wide range of rates, and thus has a large number of codebook sizes to choose from for each band. Explicitly signaling the size of each of these codebooks would impose considerable overhead, even though the allocation is relatively static from frame to frame. This is because all of the information required to compute these codebook sizes must be derived from a single frame by itself, in order to retain robustness to packet loss, so the signaling cannot take advantage of knowledge of the allocation in neighboring frames. This problem is exacerbated in low-latency (small frame size) applications, which would include this overhead in every frame. For this reason, in the MDCT mode Opus uses a primarily implicit bit allocation. The available bitstream capacity is known in advance to both the encoder and decoder without additional signaling, ultimately from the packet sizes expressed by a higher-level protocol. Using this information, the codec interpolates an allocation from a hard-coded table. While the band-energy structure effectively models intra-band masking, it ignores the weaker inter-band masking, band-temporal masking, and other less significant perceptual effects. While these effects can often be ignored, they can become significant for particular samples. One mechanism available to encoders would be to simply increase the overall rate for these frames, but this is not possible in a constant rate mode and can be fairly inefficient. As a result three explicitly signaled mechanisms are provided to alter the implicit allocation: Band boost Allocation trim Band skipping The first of these mechanisms, band boost, allows an encoder to boost the allocation in specific bands. The second, allocation trim, works by biasing the overall allocation towards higher or lower frequency bands. The third, band skipping, selects which low-precision high frequency bands will be allocated no shape bits at all. In stereo mode there are two additional parameters potentially coded as part of the allocation procedure: a parameter to allow the selective elimination of allocation for the 'side' (i.e., intensity stereo) in jointly coded bands, and a flag to deactivate joint coding (i.e., dual stereo). These values are not signaled if they would be meaningless in the overall context of the allocation. Because every signaled adjustment increases overhead and implementation complexity, none were included speculatively: the reference encoder makes use of all of these mechanisms. While the decision logic in the reference was found to be effective enough to justify the overhead and complexity, further analysis techniques may be discovered which increase the effectiveness of these parameters. As with other signaled parameters, an encoder is free to choose the values in any manner, but unless a technique is known to deliver superior perceptual results the methods used by the reference implementation should be used. The allocation process consists of the following steps: determining the per-band maximum allocation vector, decoding the boosts, decoding the tilt, determining the remaining capacity of the frame, searching the mode table for the entry nearest but not exceeding the available space (subject to the tilt, boosts, band maximums, and band minimums), linear interpolation, reallocation of unused bits with concurrent skip decoding, determination of the fine-energy vs. shape split, and final reallocation. This process results in a per-band shape allocation (in 1/8th bit units), a per-band fine-energy allocation (in 1 bit per channel units), a set of band priorities for controlling the use of remaining bits at the end of the frame, and a remaining balance of unallocated space, which is usually zero except at very high rates. The "static" bit allocation (in 1/8 bits) for a quality q, excluding the minimums, maximums, tilt and boosts, is equal to channels*N*alloc[band][q]<<LM>>2, where alloc[][] is given in and LM=log2(frame_size/120). The allocation is obtained by linearly interpolating between two values of q (in steps of 1/64) to find the highest allocation that does not exceed the number of bits remaining. Rows indicate the MDCT bands, columns are the different quality (q) parameters. The units are 1/32 bit per MDCT bin. 0 1 2 3 4 5 6 7 8 9 10 090110118126134144152162172200 080100110119127137145155165200 07590103112120130138148158200 0698493104114124132142152200 063788695103113123133143200 05671808997107117127137200 04965758391101111121131200 0405870788595105115125200 034516572788898108118198 029455966728292102112193 02039536066768696106188 01832475460708090100183 0102640475464748494178 002031394757677787173 001223324151617181168 00015253545556575163 0004172939495969158 0000122333435363153 000011626364656148 000001015203045129 00000111120104 The maximum allocation vector is an approximation of the maximum space that can be used by each band for a given mode. The value is approximate because the shape encoding is variable rate (due to entropy coding of splitting parameters). Setting the maximum too low reduces the maximum achievable quality in a band while setting it too high may result in waste: bitstream capacity available at the end of the frame which can not be put to any use. The maximums specified by the codec reflect the average maximum. In the reference implementation, the maximums in bits/sample are precomputed in a static table (see cache_caps50[] in static_modes_float.h) for each band, for each value of LM, and for both mono and stereo. Implementations are expected to simply use the same table data, but the procedure for generating this table is included in rate.c as part of compute_pulse_cache(). To convert the values in cache.caps into the actual maximums: first set nbBands to the maximum number of bands for this mode, and stereo to zero if stereo is not in use and one otherwise. For each band set N to the number of MDCT bins covered by the band (for one channel), set LM to the shift value for the frame size, then set i to nbBands*(2*LM+stereo). Then set the maximum for the band to the i-th index of cache.caps + 64 and multiply by the number of channels in the current frame (one or two) and by N, then divide the result by 4 using integer division. The resulting vector will be called cap[]. The elements fit in signed 16-bit integers but do not fit in 8 bits. This procedure is implemented in the reference in the function init_caps() in celt.c. The band boosts are represented by a series of binary symbols which are entropy coded with very low probability. Each band can potentially be boosted multiple times, subject to the frame actually having enough room to obey the boost and having enough room to code the boost symbol. The default coding cost for a boost starts out at six bits (probability p=1/64), but subsequent boosts in a band cost only a single bit and every time a band is boosted the initial cost is reduced (down to a minimum of two bits, or p=1/4). Since the initial cost of coding a boost is 6 bits, the coding cost of the boost symbols when completely unused is 0.48 bits/frame for a 21 band mode (21*-log2(1-1/2**6)). To decode the band boosts: First set 'dynalloc_logp' to 6, the initial amount of storage required to signal a boost in bits, 'total_bits' to the size of the frame in 8th bits, 'total_boost' to zero, and 'tell' to the total number of 8th bits decoded so far. For each band from the coding start (0 normally, but 17 in Hybrid mode) to the coding end (which changes depending on the signaled bandwidth), the boost quanta in units of 1/8 bit is calculated as quanta = min(8*N, max(48, N)). This represents a boost step size of six bits, subject to a lower limit of 1/8th bit/sample and an upper limit of 1 bit/sample. Set 'boost' to zero and 'dynalloc_loop_logp' to dynalloc_logp. While dynalloc_loop_log (the current worst case symbol cost) in 8th bits plus tell is less than total_bits plus total_boost and boost is less than cap[] for this band: Decode a bit from the bitstream with a with dynalloc_loop_logp as the cost of a one, update tell to reflect the current used capacity, if the decoded value is zero break the loop otherwise add quanta to boost and total_boost, subtract quanta from total_bits, and set dynalloc_loop_log to 1. When the while loop finishes boost contains the boost for this band. If boost is non-zero and dynalloc_logp is greater than 2, decrease dynalloc_logp. Once this process has been executed on all bands, the band boosts have been decoded. This procedure is implemented around line 2474 of celt.c. At very low rates it is possible that there won't be enough available space to execute the inner loop even once. In these cases band boost is not possible but its overhead is completely eliminated. Because of the high cost of band boost when activated, a reasonable encoder should not be using it at very low rates. The reference implements its dynalloc decision logic around line 1304 of celt.c. The allocation trim is a integer value from 0-10. The default value of 5 indicates no trim. The trim parameter is entropy coded in order to lower the coding cost of less extreme adjustments. Values lower than 5 bias the allocation towards lower frequencies and values above 5 bias it towards higher frequencies. Like other signaled parameters, signaling of the trim is gated so that it is not included if there is insufficient space available in the bitstream. To decode the trim, first set the trim value to 5, then if and only if the count of decoded 8th bits so far (ec_tell_frac) plus 48 (6 bits) is less than or equal to the total frame size in 8th bits minus total_boost (a product of the above band boost procedure), decode the trim value using the PDF in . PDF {1, 1, 2, 5, 10, 22, 46, 22, 10, 5, 2, 2}/128 For 10 ms and 20 ms frames using short blocks and that have at least LM+2 bits left prior to the allocation process, then one anti-collapse bit is reserved in the allocation process so it can be decoded later. Following the the anti-collapse reservation, one bit is reserved for skip if available. For stereo frames, bits are reserved for intensity stereo and for dual stereo. Intensity stereo requires ilog2(end-start) bits. Those bits are reserved if there is enough bits left. Following this, one bit is reserved for dual stereo if available. The allocation computation begins by setting up some initial conditions. 'total' is set to the remaining available 8th bits, computed by taking the size of the coded frame times 8 and subtracting ec_tell_frac(). From this value, one (8th bit) is subtracted to ensure that the resulting allocation will be conservative. 'anti_collapse_rsv' is set to 8 (8th bits) if and only if the frame is a transient, LM is greater than 1, and total is greater than or equal to (LM+2) * 8. Total is then decremented by anti_collapse_rsv and clamped to be equal to or greater than zero. 'skip_rsv' is set to 8 (8th bits) if total is greater than 8, otherwise it is zero. Total is then decremented by skip_rsv. This reserves space for the final skipping flag. If the current frame is stereo, intensity_rsv is set to the conservative log2 in 8th bits of the number of coded bands for this frame (given by the table LOG2_FRAC_TABLE in rate.c). If intensity_rsv is greater than total then intensity_rsv is set to zero. Otherwise total is decremented by intensity_rsv, and if total is still greater than 8, dual_stereo_rsv is set to 8 and total is decremented by dual_stereo_rsv. The allocation process then computes a vector representing the hard minimum amounts allocation any band will receive for shape. This minimum is higher than the technical limit of the PVQ process, but very low rate allocations produce an excessively sparse spectrum and these bands are better served by having no allocation at all. For each coded band, set thresh[band] to twenty-four times the number of MDCT bins in the band and divide by 16. If 8 times the number of channels is greater, use that instead. This sets the minimum allocation to one bit per channel or 48 128th bits per MDCT bin, whichever is greater. The band-size dependent part of this value is not scaled by the channel count, because at the very low rates where this limit is applicable there will usually be no bits allocated to the side. The previously decoded allocation trim is used to derive a vector of per-band adjustments, 'trim_offsets[]'. For each coded band take the alloc_trim and subtract 5 and LM. Then multiply the result by the number of channels, the number of MDCT bins in the shortest frame size for this mode, the number of remaining bands, 2**LM, and 8. Then divide this value by 64. Finally, if the number of MDCT bins in the band per channel is only one, 8 times the number of channels is subtracted in order to diminish the allocation by one bit, because width 1 bands receive greater benefit from the coarse energy coding.
    In each band, the normalized "shape" is encoded using a vector quantization scheme called a "pyramid vector quantizer". In the simplest case, the number of bits allocated in is converted to a number of pulses as described by . Knowing the number of pulses and the number of samples in the band, the decoder calculates the size of the codebook as detailed in . The size is used to decode an unsigned integer (uniform probability model), which is the codeword index. This index is converted into the corresponding vector as explained in . This vector is then scaled to unit norm.
    Although the allocation is performed in 1/8th bit units, the quantization requires an integer number of pulses K. To do this, the encoder searches for the value of K that produces the number of bits nearest to the allocated value (rounding down if exactly halfway between two values), not to exceed the total number of bits available. For efficiency reasons, the search is performed against a precomputed allocation table which only permits some K values for each N. The number of codebook entries can be computed as explained in . The difference between the number of bits allocated and the number of bits used is accumulated to a "balance" (initialized to zero) that helps adjust the allocation for the next bands. One third of the balance is applied to the bit allocation of each band to help achieve the target allocation. The only exceptions are the band before the last and the last band, for which half the balance and the whole balance are applied, respectively.
    Decoding of PVQ vectors is implemented in decode_pulses() (cwrs.c). The unique codeword index is decoded as a uniformly-distributed integer value between 0 and V(N,K)-1, where V(N,K) is the number of possible combinations of K pulses in N samples. The index is then converted to a vector in the same way specified in . The indexing is based on the calculation of V(N,K) (denoted N(L,K) in ). The number of combinations can be computed recursively as V(N,K) = V(N-1,K) + V(N,K-1) + V(N-1,K-1), with V(N,0) = 1 and V(0,K) = 0, K != 0. There are many different ways to compute V(N,K), including precomputed tables and direct use of the recursive formulation. The reference implementation applies the recursive formulation one line (or column) at a time to save on memory use, along with an alternate, univariate recurrence to initialize an arbitrary line, and direct polynomial solutions for small N. All of these methods are equivalent, and have different trade-offs in speed, memory usage, and code size. Implementations MAY use any methods they like, as long as they are equivalent to the mathematical definition. The decoded vector X is recovered as follows. Let i be the index decoded with the procedure in with ft = V(N,K), so that 0 <= i < V(N,K). Let k = K. Then for j = 0 to (N - 1), inclusive, do: Let p = (V(N-j-1,k) + V(N-j,k))/2. If i < p, then let sgn = 1, else let sgn = -1 and set i = i - p. Let k0 = k and set p = p - V(N-j-1,k). While p > i, set k = k - 1 and p = p - V(N-j-1,k). Set X[j] = sgn*(k0 - k) and i = i - p. The decoded vector X is then normalized such that its L2-norm equals one.
    The normalized vector decoded in is then rotated for the purpose of avoiding tonal artifacts. The rotation gain is equal to
    where N is the number of dimensions, K is the number of pulses, and f_r depends on the value of the "spread" parameter in the bit-stream.
    Spread value f_r 0 infinite (no rotation) 1 15 2 10 3 5 The rotation angle is then calculated as
    A 2-D rotation R(i,j) between points x_i and x_j is defined as:
    An N-D rotation is then achieved by applying a series of 2-D rotations back and forth, in the following order: R(x_1, x_2), R(x_2, x_3), ..., R(x_N-2, X_N-1), R(x_N-1, X_N), R(x_N-2, X_N-1), ..., R(x_1, x_2).
    If the decoded vector represents more than one time block, then this spreading process is applied separately on each time block. Also, if each block represents 8 samples or more, then another N-D rotation, by (pi/2-theta), is applied before the rotation described above. This extra rotation is applied in an interleaved manner with a stride equal to round(sqrt(N/nb_blocks)), i.e., it is applied independently for each set of sample S_k = {stride*n + k}, n=0..N/stride-1.
    To avoid the need for multi-precision calculations when decoding PVQ codevectors, the maximum size allowed for codebooks is 32 bits. When larger codebooks are needed, the vector is instead split in two sub-vectors of size N/2. A quantized gain parameter with precision derived from the current allocation is entropy coded to represent the relative gains of each side of the split, and the entire decoding process is recursively applied. Multiple levels of splitting may be applied up to a limit of LM+1 splits. The same recursive mechanism is applied for the joint coding of stereo audio.
    The time-frequency (TF) parameters are used to control the time-frequency resolution tradeoff in each coded band. For each band, there are two possible TF choices. For the first band coded, the PDF is {3, 1}/4 for frames marked as transient and {15, 1}/16 for the other frames. For subsequent bands, the TF choice is coded relative to the previous TF choice with probability {15, 1}/15 for transient frames and {31, 1}/32 otherwise. The mapping between the decoded TF choices and the adjustment in TF resolution is shown in the tables below. Frame size (ms) 0 1 2.5 0 -1 5 0 -1 10 0 -2 20 0 -2 Frame size (ms) 0 1 2.5 0 -1 5 0 -2 10 0 -3 20 0 -3 Frame size (ms) 0 1 2.5 0 -1 5 1 0 10 2 0 20 3 0 Frame size (ms) 0 1 2.5 0 -1 5 1 -1 10 1 -1 20 1 -1 A negative TF adjustment means that the temporal resolution is increased, while a positive TF adjustment means that the frequency resolution is increased. Changes in TF resolution are implemented using the Hadamard transform . To increase the time resolution by N, N "levels" of the Hadamard transform are applied to the decoded vector for each interleaved MDCT vector. To increase the frequency resolution (assumes a transient frame), then N levels of the Hadamard transform are applied across the interleaved MDCT vector. In the case of increased time resolution the decoder uses the "sequency order" because the input vector is sorted in time.
    The anti-collapse feature is designed to avoid the situation where the use of multiple short MDCTs causes the energy in one or more of the MDCTs to be zero for some bands, causing unpleasant artifacts. When the frame has the transient bit set, an anti-collapse bit is decoded. When anti-collapse is set, the energy in each small MDCT is prevented from collapsing to zero. For each band of each MDCT where a collapse is detected, a pseudo-random signal is inserted with an energy corresponding to the minimum energy over the two previous frames. A renormalization step is then required to ensure that the anti-collapse step did not alter the energy preservation property.
    Just as each band was normalized in the encoder, the last step of the decoder before the inverse MDCT is to denormalize the bands. Each decoded normalized band is multiplied by the square root of the decoded energy. This is done by denormalise_bands() (bands.c).
    The inverse MDCT implementation has no special characteristics. The input is N frequency-domain samples and the output is 2*N time-domain samples, while scaling by 1/2. A "low-overlap" window reduces the algorithmic delay. It is derived from a basic (full overlap) 240-sample version of the window used by the Vorbis codec:
    The low-overlap window is created by zero-padding the basic window and inserting ones in the middle, such that the resulting window still satisfies power complementarity . The IMDCT and windowing are performed by mdct_backward (mdct.c).
    The output of the inverse MDCT (after weighted overlap-add) is sent to the post-filter. Although the post-filter is applied at the end, the post-filter parameters are encoded at the beginning, just after the silence flag. The post-filter can be switched on or off using one bit (logp=1). If the post-filter is enabled, then the octave is decoded as an integer value between 0 and 6 of uniform probability. Once the octave is known, the fine pitch within the octave is decoded using 4+octave raw bits. The final pitch period is equal to (16<<octave)+fine_pitch-1 so it is bounded between 15 and 1022, inclusively. Next, the gain is decoded as three raw bits and is equal to G=3*(int_gain+1)/32. The set of post-filter taps is decoded last, using a pdf equal to {2, 1, 1}/4. Tapset zero corresponds to the filter coefficients g0 = 0.3066406250, g1 = 0.2170410156, g2 = 0.1296386719. Tapset one corresponds to the filter coefficients g0 = 0.4638671875, g1 = 0.2680664062, g2 = 0, and tapset two uses filter coefficients g0 = 0.7998046875, g1 = 0.1000976562, g2 = 0. The post-filter response is thus computed as:
    During a transition between different gains, a smooth transition is calculated using the square of the MDCT window. It is important that values of y(n) be interpolated one at a time such that the past value of y(n) used is interpolated.
    After the post-filter, the signal is de-emphasized using the inverse of the pre-emphasis filter used in the encoder:
    where alpha_p=0.8500061035.
    Packet loss concealment (PLC) is an optional decoder-side feature that SHOULD be included when receiving from an unreliable channel. Because PLC is not part of the bitstream, there are many acceptable ways to implement PLC with different complexity/quality trade-offs. The PLC in the reference implementation depends on the mode of last packet received. In CELT mode, the PLC finds a periodicity in the decoded signal and repeats the windowed waveform using the pitch offset. The windowed waveform is overlapped in such a way as to preserve the time-domain aliasing cancellation with the previous frame and the next frame. This is implemented in celt_decode_lost() (mdct.c). In SILK mode, the PLC uses LPC extrapolation from the previous frame, implemented in silk_PLC() (PLC.c).
    Clock drift refers to the gradual desynchronization of two endpoints whose sample clocks run at different frequencies while they are streaming live audio. Differences in clock frequencies are generally attributable to manufacturing variation in the endpoints' clock hardware. For long-lived streams, the time difference between sender and receiver can grow without bound. When the sender's clock runs slower than the receiver's, the effect is similar to packet loss: too few packets are received. The receiver can distinguish between drift and loss if the transport provides packet timestamps. A receiver for live streams SHOULD conceal the effects of drift, and MAY do so by invoking the PLC. When the sender's clock runs faster than the receiver's, too many packets will be received. The receiver MAY respond by skipping any packet (i.e., not submitting the packet for decoding). This is likely to produce a less severe artifact than if the frame were dropped after decoding. A decoder MAY employ a more sophisticated drift compensation method. For example, the NetEQ component of the Google WebRTC codebase compensates for drift by adding or removing one period when the signal is highly periodic. The reference implementation of Opus allows a caller to learn whether the current frame's signal is highly periodic, and if so what the period is, using the OPUS_GET_PITCH() request.
    Switching between the Opus coding modes, audio bandwidths, and channel counts requires careful consideration to avoid audible glitches. Switching between any two configurations of the CELT-only mode, any two configurations of the Hybrid mode, or from WB SILK to Hybrid mode does not require any special treatment in the decoder, as the MDCT overlap will smooth the transition. Switching from Hybrid mode to WB SILK requires adding in the final contents of the CELT overlap buffer to the first SILK-only packet. This can be done by decoding a 2.5 ms silence frame with the CELT decoder using the channel count of the SILK-only packet (and any choice of audio bandwidth), which will correctly handle the cases when the channel count changes as well. When changing the channel count for SILK-only or Hybrid packets, the encoder can avoid glitches by smoothly varying the stereo width of the input signal before or after the transition, and SHOULD do so. However, other transitions between SILK-only packets or between NB or MB SILK and Hybrid packets may cause glitches, because neither the LSF coefficients nor the LTP, LPC, stereo unmixing, and resampler buffers are available at the new sample rate. These switches SHOULD be delayed by the encoder until quiet periods or transients, where the inevitable glitches will be less audible. Additionally, the bit-stream MAY include redundant side information ("redundancy"), in the form of additional CELT frames embedded in each of the Opus frames around the transition. The other transitions that cannot be easily handled are those where the lower frequencies switch between the SILK LP-based model and the CELT MDCT model. However, an encoder may not have an opportunity to delay such a switch to a convenient point. For example, if the content switches from speech to music, and the encoder does not have enough latency in its analysis to detect this in advance, there may be no convenient silence period during which to make the transition for quite some time. To avoid or reduce glitches during these problematic mode transitions, and also between audio bandwidth changes in the SILK-only modes, transitions MAY include redundant side information ("redundancy"), in the form of an additional CELT frame embedded in the Opus frame. A transition between coding the lower frequencies with the LP model and the MDCT model or a transition that involves changing the SILK bandwidth is only normatively specified when it includes redundancy. For those without redundancy, it is RECOMMENDED that the decoder use a concealment technique (e.g., make use of a PLC algorithm) to "fill in" the gap or discontinuity caused by the mode transition. Therefore, PLC MUST NOT be applied during any normative transition, i.e., when A packet includes redundancy for this transition (as described below), The transition is between any WB SILK packet and any Hybrid packet, or vice versa, The transition is between any two Hybrid mode packets, or The transition is between any two CELT mode packets, unless there is actual packet loss.
    Transitions with side information include an extra 5 ms "redundant" CELT frame within the Opus frame. This frame is designed to fill in the gap or discontinuity in the different layers without requiring the decoder to conceal it. For transitions from CELT-only to SILK-only or Hybrid, the redundant frame is inserted in the first Opus frame after the transition (i.e., the first SILK-only or Hybrid frame). For transitions from SILK-only or Hybrid to CELT-only, the redundant frame is inserted in the last Opus frame before the transition (i.e., the last SILK-only or Hybrid frame).
    The presence of redundancy is signaled in all SILK-only and Hybrid frames, not just those involved in a mode transition. This allows the frames to be decoded correctly even if an adjacent frame is lost. For SILK-only frames, this signaling is implicit, based on the size of the of the Opus frame and the number of bits consumed decoding the SILK portion of it. After decoding the SILK portion of the Opus frame, the decoder uses ec_tell() (see ) to check if there are at least 17 bits remaining. If so, then the frame contains redundancy. For Hybrid frames, this signaling is explicit. After decoding the SILK portion of the Opus frame, the decoder uses ec_tell() (see ) to ensure there are at least 37 bits remaining. If so, it reads a symbol with the PDF in , and if the value is 1, then the frame contains redundancy. Otherwise (if there were fewer than 37 bits left or the value was 0), the frame does not contain redundancy. PDF {4095, 1}/4096
    Since the current frame is a SILK-only or a Hybrid frame, it must be at least 10 ms. Therefore, it needs an additional flag to indicate whether the redundant 5 ms CELT frame should be mixed into the beginning of the current frame, or the end. After determining that a frame contains redundancy, the decoder reads a 1 bit symbol with a uniform PDF (). PDF {1, 1}/2 If the value is zero, this is the first frame in the transition, and the redundancy belongs at the end. If the value is one, this is the second frame in the transition, and the redundancy belongs at the beginning. There is no way to specify that an Opus frame contains separate redundant CELT frames at both the beginning and the end.
    Unlike the CELT portion of a Hybrid frame, the redundant CELT frame does not use the same entropy coder state as the rest of the Opus frame, because this would break the CELT bit allocation mechanism in Hybrid frames. Thus, a redundant CELT frame always starts and ends on a byte boundary, even in SILK-only frames, where this is not strictly necessary. For SILK-only frames, the number of bytes in the redundant CELT frame is simply the number of whole bytes remaining, which must be at least 2, due to the space check in . For Hybrid frames, the number of bytes is equal to 2, plus a decoded unsigned integer less than 256 (see ). This may be more than the number of whole bytes remaining in the Opus frame, in which case the frame is invalid. However, a decoder is not required to ignore the entire frame, as this may be the result of a bit error that desynchronized the range coder. There may still be useful data before the error, and a decoder MAY keep any audio decoded so far instead of invoking the PLC, but it is RECOMMENDED that the decoder stop decoding and discard the rest of the current Opus frame. It would have been possible to avoid these invalid states in the design of Opus by limiting the range of the explicit length decoded from Hybrid frames by the actual number of whole bytes remaining. However, this would require an encoder to determine the rate allocation for the MDCT layer up front, before it began encoding that layer. By allowing some invalid sizes, the encoder is able to defer that decision until much later. When encoding Hybrid frames which do not include redundancy, the encoder must still decide up-front if it wishes to use the minimum 37 bits required to trigger encoding of the redundancy flag, but this is a much looser restriction. After determining the size of the redundant CELT frame, the decoder reduces the size of the buffer currently in use by the range coder by that amount. The CELT layer read any raw bits from the end of this reduced buffer, and all calculations of the number of bits remaining in the buffer must be done using this new, reduced size, rather than the original size of the Opus frame.
    The redundant frame is decoded like any other CELT-only frame, with the exception that it does not contain a TOC byte. The frame size is fixed at 5 ms, the channel count is set to that of the current frame, and the audio bandwidth is also set to that of the current frame, with the exception that for MB SILK frames, it is set to WB. If the redundancy belongs at the beginning (in a CELT-only to SILK-only or Hybrid transition), the final reconstructed output uses the first 2.5 ms of audio output by the decoder for the redundant frame as-is, discarding the corresponding output from the SILK-only or Hybrid portion of the frame. The remaining 2.5 ms is cross-lapped with the decoded SILK/Hybrid signal using the CELT's power-complementary MDCT window to ensure a smooth transition. If the redundancy belongs at the end (in a SILK-only or Hybrid to CELT-only transition), only the second half (2.5 ms) of the audio output by the decoder for the redundant frame is used. In that case, the second half of the redundant frame is cross-lapped with the end of the SILK/Hybrid signal, again using CELT's power-complementary MDCT window to ensure a smooth transition.
    When a transition occurs, the state of the SILK or the CELT decoder (or both) may need to be reset before decoding a frame in the new mode. This avoids reusing "out of date" memory, which may not have been updated in some time or may not be in a well-defined state due to, e.g., PLC. The SILK state is reset before every SILK-only or Hybrid frame where the previous frame was CELT-only. The CELT state is reset every time the operating mode changes and the new mode is either Hybrid or CELT-only, except when the transition uses redundancy as described above. When switching from SILK-only or Hybrid to CELT-only with redundancy, the CELT state is reset before decoding the redundant CELT frame embedded in the SILK-only or Hybrid frame, but it is not reset before decoding the following CELT-only frame. When switching from CELT-only mode to SILK-only or Hybrid mode with redundancy, the CELT decoder is not reset for decoding the redundant CELT frame.
    illustrates all of the normative transitions involving a mode change, an audio bandwidth change, or both. Each one uses an S, H, or C to represent an Opus frame in the corresponding mode. In addition, an R indicates the presence of redundancy in the Opus frame it is cross-lapped with. Its location in the first or last 5 ms is assumed to correspond to whether it is the frame before or after the transition. Other uses of redundancy are non-normative. Finally, a c indicates the contents of the CELT overlap buffer after the previously decoded frame (i.e., as extracted by decoding a silence frame).
    S -> S & !R -> R & ;S -> S -> S NB or MB SILK to Hybrid with Redundancy: S -> S -> S & !R ->;H -> H -> H WB SILK to Hybrid: S -> S -> S ->!H -> H -> H SILK to CELT with Redundancy: S -> S -> S & !R -> C -> C -> C Hybrid to NB or MB SILK with Redundancy: H -> H -> H & !R -> R & ;S -> S -> S Hybrid to WB SILK: H -> H -> H -> c \ + > S -> S -> S Hybrid to CELT with Redundancy: H -> H -> H & !R -> C -> C -> C CELT to SILK with Redundancy: C -> C -> C -> R & ;S -> S -> S CELT to Hybrid with Redundancy: C -> C -> C -> R & |H -> H -> H Key: S SILK-only frame ; SILK decoder reset H Hybrid frame | CELT and SILK decoder resets C CELT-only frame ! CELT decoder reset c CELT overlap + Direct mixing R Redundant CELT frame & Windowed cross-lap ]]>
    The first two and the last two Opus frames in each example are illustrative, i.e., there is no requirement that a stream remain in the same configuration for three consecutive frames before or after a switch.
    The behavior of transitions without redundancy where PLC is allowed is non-normative. An encoder might still wish to use these transitions if, for example, it doesn't want to add the extra bitrate required for redundancy or if it makes a decision to switch after it has already transmitted the frame that would have had to contain the redundancy. illustrates the recommended cross-lapping and decoder resets for these transitions.
    S -> S ;S -> S -> S NB or MB SILK to Hybrid: S -> S -> S |H -> H -> H SILK to CELT without Redundancy: S -> S -> S -> P & !C -> C -> C Hybrid to NB or MB SILK: H -> H -> H -> c + ;S -> S -> S Hybrid to CELT without Redundancy: H -> H -> H -> P & !C -> C -> C CELT to SILK without Redundancy: C -> C -> C -> P & ;S -> S -> S CELT to Hybrid without Redundancy: C -> C -> C -> P & |H -> H -> H Key: S SILK-only frame ; SILK decoder reset H Hybrid frame | CELT and SILK decoder resets C CELT-only frame ! CELT decoder reset c CELT overlap + Direct mixing P Packet Loss Concealment & Windowed cross-lap ]]>
    Encoders SHOULD NOT use other transitions, e.g., those that involve redundancy in ways not illustrated in .
    Just like the decoder, the Opus encoder also normally consists of two main blocks: the SILK encoder and the CELT encoder. However, unlike the case of the decoder, a valid (though potentially suboptimal) Opus encoder is not required to support all modes and may thus only include a SILK encoder module or a CELT encoder module. The output bit-stream of the Opus encoding contains bits from the SILK and CELT encoders, though these are not separable due to the use of a range coder. A block diagram of the encoder is illustrated below.
    | Rate |--->| Encoder | V +-----------+ | | Conversion | | | +---------+ | Optional | | +------------+ +---------+ | Range | ->| High-pass |--+ | Encoder |----> | Filter | | +--------------+ +---------+ | | Bit- +-----------+ | | Delay | | CELT | +---------+ stream +->| Compensation |->| Encoder | ^ | | | |------+ +--------------+ +---------+ ]]>
    For a normal encoder where both the SILK and the CELT modules are included, an optimal encoder should select which coding mode to use at run-time depending on the conditions. In the reference implementation, the frame size is selected by the application, but the other configuration parameters (number of channels, bandwidth, mode) are automatically selected (unless explicitly overridden by the application) depend on the following: Requested bitrate Input sampling rate Type of signal (speech vs music) Frame size in use The type of signal currently needs to be provided by the application (though it can be changed in real-time). An Opus encoder implementation could also do automatic detection, but since Opus is an interactive codec, such an implementation would likely have to either delay the signal (for non-interactive applications) or delay the mode switching decisions (for interactive applications). When the encoder is configured for voice over IP applications, the input signal is filtered by a high-pass filter to remove the lowest part of the spectrum that contains little speech energy and may contain background noise. This is a second order Auto Regressive Moving Average (i.e., with poles and zeros) filter with a cut-off frequency around 50 Hz. In the future, a music detector may also be used to lower the cut-off frequency when the input signal is detected to be music rather than speech.
    The range coder acts as the bit-packer for Opus. It is used in three different ways: to encode Entropy-coded symbols with a fixed probability model using ec_encode() (entenc.c), Integers from 0 to (2**M - 1) using ec_enc_uint() or ec_enc_bits() (entenc.c), Integers from 0 to (ft - 1) (where ft is not a power of two) using ec_enc_uint() (entenc.c). The range encoder maintains an internal state vector composed of the four-tuple (val, rng, rem, ext) representing the low end of the current range, the size of the current range, a single buffered output byte, and a count of additional carry-propagating output bytes. Both val and rng are 32-bit unsigned integer values, rem is a byte value or less than 255 or the special value -1, and ext is an unsigned integer with at least 11 bits. This state vector is initialized at the start of each each frame to the value (0, 2**31, -1, 0). After encoding a sequence of symbols, the value of rng in the encoder should exactly match the value of rng in the decoder after decoding the same sequence of symbols. This is a powerful tool for detecting errors in either an encoder or decoder implementation. The value of val, on the other hand, represents different things in the encoder and decoder, and is not expected to match. The decoder has no analog for rem and ext. These are used to perform carry propagation in the renormalization loop below. Each iteration of this loop produces 9 bits of output, consisting of 8 data bits and a carry flag. The encoder cannot determine the final value of the output bytes until it propagates these carry flags. Therefore the reference implementation buffers a single non-propagating output byte (i.e., one less than 255) in rem and keeps a count of additional propagating (i.e., 255) output bytes in ext. An implementation may choose to use any mathematically equivalent scheme to perform carry propagation.
    The main encoding function is ec_encode() (entenc.c), which encodes symbol k in the current context using the same three-tuple (fl[k], fh[k], ft) as the decoder to describe the range of the symbol (see ). ec_encode() updates the state of the encoder as follows. If fl[k] is greater than zero, then
    Otherwise, val is unchanged and
    The divisions here are integer division.
    After this update, the range is normalized using a procedure very similar to that of , implemented by ec_enc_normalize() (entenc.c). The following process is repeated until rng > 2**23. First, the top 9 bits of val, (val>>23), are sent to the carry buffer, described in . Then, the encoder sets
    The function ec_enc_carry_out() (entenc.c) implements carry propagation and output buffering. It takes as input a 9-bit value, c, consisting of 8 data bits and an additional carry bit. If c is equal to the value 255, then ext is simply incremented, and no other state updates are performed. Otherwise, let b = (c>>8) be the carry bit. Then, If the buffered byte rem contains a value other than -1, the encoder outputs the byte (rem + b). Otherwise, if rem is -1, no byte is output. If ext is non-zero, then the encoder outputs ext bytes---all with a value of 0 if b is set, or 255 if b is unset---and sets ext to 0. rem is set to the 8 data bits:
    The reference implementation uses three additional encoding methods that are exactly equivalent to the above, but make assumptions and simplifications that allow for a more efficient implementation.
    The first is ec_encode_bin() (entenc.c), defined using the parameter ftb instead of ft. It is mathematically equivalent to calling ec_encode() with ft = (1<<ftb), but avoids using division.
    The next is ec_enc_bit_logp() (entenc.c), which encodes a single binary symbol. The context is described by a single parameter, logp, which is the absolute value of the base-2 logarithm of the probability of a "1". It is mathematically equivalent to calling ec_encode() with the 3-tuple (fl[k] = 0, fh[k] = (1<<logp) - 1, ft = (1<<logp)) if k is 0 and with (fl[k] = (1<<logp) - 1, fh[k] = ft = (1<<logp)) if k is 1. The implementation requires no multiplications or divisions.
    The last is ec_enc_icdf() (entenc.c), which encodes a single binary symbol with a table-based context of up to 8 bits. This uses the same icdf table as ec_dec_icdf() from . The function is mathematically equivalent to calling ec_encode() with fl[k] = (1<<ftb) - icdf[k-1] (or 0 if k == 0), fh[k] = (1<<ftb) - icdf[k], and ft = (1<<ftb). This only saves a few arithmetic operations over ec_encode_bin(), but allows the encoder to use the same icdf tables as the decoder.
    The raw bits used by the CELT layer are packed at the end of the buffer using ec_enc_bits() (entenc.c). Because the raw bits may continue into the last byte output by the range coder if there is room in the low-order bits, the encoder must be prepared to merge these values into a single byte. The procedure in does this in a way that ensures both the range coded data and the raw bits can be decoded successfully.
    The function ec_enc_uint() (entenc.c) encodes one of ft equiprobable symbols in the range 0 to (ft - 1), inclusive, each with a frequency of 1, where ft may be as large as (2**32 - 1). Like the decoder (see ), it splits up the value into a range coded symbol representing up to 8 of the high bits, and, if necessary, raw bits representing the remainder of the value. ec_enc_uint() takes a two-tuple (t, ft), where t is the value to be encoded, 0 <= t < ft, and ft is not necessarily a power of two. Let ftb = ilog(ft - 1), i.e., the number of bits required to store (ft - 1) in two's complement notation. If ftb is 8 or less, then t is encoded directly using ec_encode() with the three-tuple (t, t + 1, ft). If ftb is greater than 8, then the top 8 bits of t are encoded using the three-tuple (t>>(ftb - 8), (t>>(ftb - 8)) + 1, ((ft - 1)>>(ftb - 8)) + 1), and the remaining bits, (t & ((1<<(ftb - 8)) - 1), are encoded as raw bits with ec_enc_bits().
    After all symbols are encoded, the stream must be finalized by outputting a value inside the current range. Let end be the integer in the interval [val, val + rng) with the largest number of trailing zero bits, b, such that (end + (1<<b) - 1) is also in the interval [val, val + rng). This choice of end allows the maximum number of trailing bits to be set to arbitrary values while still ensuring the range coded part of the buffer can be decoded correctly. Then, while end is not zero, the top 9 bits of end, i.e., (end>>23), are passed to the carry buffer in accordance with the procedure in , and end is updated via
    Finally, if the buffered output byte, rem, is neither zero nor the special value -1, or the carry count, ext, is greater than zero, then 9 zero bits are sent to the carry buffer to flush it to the output buffer. When outputting the final byte from the range coder, if it would overlap any raw bits already packed into the end of the output buffer, they should be ORed into the same byte. The bit allocation routines in the CELT layer should ensure that this can be done without corrupting the range coder data so long as end is chosen as described above. If there is any space between the end of the range coder data and the end of the raw bits, it is padded with zero bits. This entire process is implemented by ec_enc_done() (entenc.c).
    The bit allocation routines in Opus need to be able to determine a conservative upper bound on the number of bits that have been used to encode the current frame thus far. This drives allocation decisions and ensures that the range coder and raw bits will not overflow the output buffer. This is computed in the reference implementation to whole-bit precision by the function ec_tell() (entcode.h) and to fractional 1/8th bit precision by the function ec_tell_frac() (entcode.c). Like all operations in the range coder, it must be implemented in a bit-exact manner, and must produce exactly the same value returned by the same functions in the decoder after decoding the same symbols.
    In many respects the SILK encoder mirrors the SILK decoder described in . Details such as the quantization and range coder tables can be found there, while this section describes the high-level design choices that were made. The diagram below shows the basic modules of the SILK encoder.
    | Rate |--->| Mixing |--->| Core |----------> Input |Conversion| | | | Encoder | Bitstream +----------+ +--------+ +---------+ ]]>
    The input signal's sampling rate is adjusted by a sample rate conversion module so that it matches the SILK internal sampling rate. The input to the sample rate converter is delayed by a number of samples depending on the sample rate ratio, such that the overall delay is constant for all input and output sample rates.
    The stereo mixer is only used for stereo input signals. It converts a stereo left/right signal into an adaptive mid/side representation. The first step is to compute non-adaptive mid/side signals as half the sum and difference between left and right signals. The side signal is then minimized in energy by subtracting a prediction of it based on the mid signal. This prediction works well when the left and right signals exhibit linear dependency, for instance for an amplitude-panned input signal. Like in the decoder, the prediction coefficients are linearly interpolated during the first 8 ms of the frame. The mid signal is always encoded, whereas the residual side signal is only encoded if it has sufficient energy compared to the mid signal's energy. If it has not, the "mid_only_flag" is set without encoding the side signal. The predictor coefficients are coded regardless of whether the side signal is encoded. For each frame, two predictor coefficients are computed, one that predicts between low-passed mid and side channels, and one that predicts between high-passed mid and side channels. The low-pass filter is a simple three-tap filter and creates a delay of one sample. The high-pass filtered signal is the difference between the mid signal delayed by one sample and the low-passed signal. Instead of explicitly computing the high-passed signal, it is computationally more efficient to transform the prediction coefficients before applying them to the filtered mid signal, as follows
    where w0 and w1 are the low-pass and high-pass prediction coefficients, mid(n-1) is the mid signal delayed by one sample, LP(n) and HP(n) are the low-passed and high-passed signals and pred(n) is the prediction signal that is subtracted from the side signal.
    What follows is a description of the core encoder and its components. For simplicity, the core encoder is referred to simply as the encoder in the remainder of this section. An overview of the encoder is given in .
    | | +---------+ | +---------+ | | |Voice | | |LTP |12 | | +-->|Activity |--+ +----->|Scaling |-----------+---->| | | |Detector |3 | | |Control |<--+ | | | | +---------+ | | +---------+ | | | | | | | +---------+ | | | | | | | |Gains | | | | | | | | +-->|Processor|---|---+---|---->| R | | | | | | |11 | | | | a | | \/ | | +---------+ | | | | n | | +---------+ | | +---------+ | | | | g | | |Pitch | | | |LSF | | | | | e | | +->|Analysis |---+ | |Quantizer|---|---|---|---->| | | | | |4 | | | |8 | | | | E |--> | | +---------+ | | +---------+ | | | | n | 2 | | | | 9/\ 10| | | | | c | | | | | | \/ | | | | o | | | +---------+ | | +----------+ | | | | d | | | |Noise | +--|-->|Prediction|--+---|---|---->| e | | +->|Shaping |---|--+ |Analysis |7 | | | | r | | | |Analysis |5 | | | | | | | | | | | +---------+ | | +----------+ | | | | | | | | | /\ | | | | | | | +----------|--|--------+ | | | | | | | | \/ \/ \/ \/ \/ | | | | | +---------+ +------------+ | | | | | | | |Noise | | | -+-------+-----+------>|Prefilter|--------->|Shaping |-->| | 1 | | 6 |Quantization|13 | | +---------+ +------------+ +---+ 1: Input speech signal 2: Range encoded bitstream 3: Voice activity estimate 4: Pitch lags (per 5 ms) and voicing decision (per 20 ms) 5: Noise shaping quantization coefficients - Short term synthesis and analysis noise shaping coefficients (per 5 ms) - Long term synthesis and analysis noise shaping coefficients (per 5 ms and for voiced speech only) - Noise shaping tilt (per 5 ms) - Quantizer gain/step size (per 5 ms) 6: Input signal filtered with analysis noise shaping filters 7: Short and long term prediction coefficients LTP (per 5 ms) and LPC (per 20 ms) 8: LSF quantization indices 9: LSF coefficients 10: Quantized LSF coefficients 11: Processed gains, and synthesis noise shape coefficients 12: LTP state scaling coefficient. Controlling error propagation / prediction gain trade-off 13: Quantized signal ]]>
    The input signal is processed by a Voice Activity Detector (VAD) to produce a measure of voice activity, spectral tilt, and signal-to-noise estimates for each frame. The VAD uses a sequence of half-band filterbanks to split the signal into four subbands: 0...Fs/16, Fs/16...Fs/8, Fs/8...Fs/4, and Fs/4...Fs/2, where Fs is the sampling frequency (8, 12, 16, or 24 kHz). The lowest subband, from 0 - Fs/16, is high-pass filtered with a first-order moving average (MA) filter (with transfer function H(z) = 1-z**(-1)) to reduce the energy at the lowest frequencies. For each frame, the signal energy per subband is computed. In each subband, a noise level estimator tracks the background noise level and a Signal-to-Noise Ratio (SNR) value is computed as the logarithm of the ratio of energy to noise level. Using these intermediate variables, the following parameters are calculated for use in other SILK modules: Average SNR. The average of the subband SNR values. Smoothed subband SNRs. Temporally smoothed subband SNR values. Speech activity level. Based on the average SNR and a weighted average of the subband energies. Spectral tilt. A weighted average of the subband SNRs, with positive weights for the low subbands and negative weights for the high subbands.
    The input signal is processed by the open loop pitch estimator shown in .
    |sampling|->|Correlator| | | | | | | |4 | +--------+ +----------+ \/ | | 2 +-------+ | | +-->|Speech |5 +---------+ +--------+ | \/ | |Type |-> |LPC | |Down | | +----------+ | | +->|Analysis | +->|sample |-+------------->|Time- | +-------+ | | | | |to 8 kHz| |Correlator|-----------> | +---------+ | +--------+ |__________| 6 | | | |3 | \/ | \/ | +---------+ | +----------+ | |Whitening| | |Time- | -+->|Filter |-+--------------------------->|Correlator|-----------> 1 | | | | 7 +---------+ +----------+ 1: Input signal 2: Lag candidates from stage 1 3: Lag candidates from stage 2 4: Correlation threshold 5: Voiced/unvoiced flag 6: Pitch correlation 7: Pitch lags ]]>
    The pitch analysis finds a binary voiced/unvoiced classification, and, for frames classified as voiced, four pitch lags per frame - one for each 5 ms subframe - and a pitch correlation indicating the periodicity of the signal. The input is first whitened using a Linear Prediction (LP) whitening filter, where the coefficients are computed through standard Linear Prediction Coding (LPC) analysis. The order of the whitening filter is 16 for best results, but is reduced to 12 for medium complexity and 8 for low complexity modes. The whitened signal is analyzed to find pitch lags for which the time correlation is high. The analysis consists of three stages for reducing the complexity: In the first stage, the whitened signal is downsampled to 4 kHz (from 8 kHz) and the current frame is correlated to a signal delayed by a range of lags, starting from a shortest lag corresponding to 500 Hz, to a longest lag corresponding to 56 Hz. The second stage operates on an 8 kHz signal (downsampled from 12, 16, or 24 kHz) and measures time correlations only near the lags corresponding to those that had sufficiently high correlations in the first stage. The resulting correlations are adjusted for a small bias towards short lags to avoid ending up with a multiple of the true pitch lag. The highest adjusted correlation is compared to a threshold depending on: Whether the previous frame was classified as voiced The speech activity level The spectral tilt. If the threshold is exceeded, the current frame is classified as voiced and the lag with the highest adjusted correlation is stored for a final pitch analysis of the highest precision in the third stage. The last stage operates directly on the whitened input signal to compute time correlations for each of the four subframes independently in a narrow range around the lag with highest correlation from the second stage.
    The noise shaping analysis finds gains and filter coefficients used in the prefilter and noise shaping quantizer. These parameters are chosen such that they will fulfill several requirements: Balancing quantization noise and bitrate. The quantization gains determine the step size between reconstruction levels of the excitation signal. Therefore, increasing the quantization gain amplifies quantization noise, but also reduces the bitrate by lowering the entropy of the quantization indices. Spectral shaping of the quantization noise; the noise shaping quantizer is capable of reducing quantization noise in some parts of the spectrum at the cost of increased noise in other parts without substantially changing the bitrate. By shaping the noise such that it follows the signal spectrum, it becomes less audible. In practice, best results are obtained by making the shape of the noise spectrum slightly flatter than the signal spectrum. De-emphasizing spectral valleys; by using different coefficients in the analysis and synthesis part of the prefilter and noise shaping quantizer, the levels of the spectral valleys can be decreased relative to the levels of the spectral peaks such as speech formants and harmonics. This reduces the entropy of the signal, which is the difference between the coded signal and the quantization noise, thus lowering the bitrate. Matching the levels of the decoded speech formants to the levels of the original speech formants; an adjustment gain and a first order tilt coefficient are computed to compensate for the effect of the noise shaping quantization on the level and spectral tilt.
    Frequency 1: Input signal spectrum 2: De-emphasized and level matched spectrum 3: Quantization noise spectrum ]]>
    shows an example of an input signal spectrum (1). After de-emphasis and level matching, the spectrum has deeper valleys (2). The quantization noise spectrum (3) more or less follows the input signal spectrum, while having slightly less pronounced peaks. The entropy, which provides a lower bound on the bitrate for encoding the excitation signal, is proportional to the area between the de-emphasized spectrum (2) and the quantization noise spectrum (3). Without de-emphasis, the entropy is proportional to the area between input spectrum (1) and quantization noise (3) - clearly higher.
    The transformation from input signal to de-emphasized signal can be described as a filtering operation with a filter
    having an adjustment gain G, a first order tilt adjustment filter with tilt coefficient c_tilt, and where
    is the analysis part of the de-emphasis filter, consisting of the short-term shaping filter with coefficients a_ana(k), and the long-term shaping filter with coefficients b_ana(k) and pitch lag L. The parameter d determines the number of long-term shaping filter taps.
    Similarly, but without the tilt adjustment, the synthesis part can be written as
    All noise shaping parameters are computed and applied per subframe of 5 ms. First, an LPC analysis is performed on a windowed signal block of 15 ms. The signal block has a look-ahead of 5 ms relative to the current subframe, and the window is an asymmetric sine window. The LPC analysis is done with the autocorrelation method, with an order of between 8, in lowest-complexity mode, and 16, for best quality. Optionally the LPC analysis and noise shaping filters are warped by replacing the delay elements by first-order allpass filters. This increases the frequency resolution at low frequencies and reduces it at high ones, which better matches the human auditory system and improves quality. The warped analysis and filtering comes at a cost in complexity and is therefore only done in higher complexity modes. The quantization gain is found by taking the square root of the residual energy from the LPC analysis and multiplying it by a value inversely proportional to the coding quality control parameter and the pitch correlation. Next the two sets of short-term noise shaping coefficients a_ana(k) and a_syn(k) are obtained by applying different amounts of bandwidth expansion to the coefficients found in the LPC analysis. This bandwidth expansion moves the roots of the LPC polynomial towards the origin, using the formulas
    where a(k) is the k'th LPC coefficient, and the bandwidth expansion factors g_ana and g_syn are calculated as
    where C is the coding quality control parameter between 0 and 1. Applying more bandwidth expansion to the analysis part than to the synthesis part gives the desired de-emphasis of spectral valleys in between formants.
    The long-term shaping is applied only during voiced frames. It uses three filter taps, described by
    For unvoiced frames these coefficients are set to 0. The multiplication factors F_ana and F_syn are chosen between 0 and 1, depending on the coding quality control parameter, as well as the calculated pitch correlation and smoothed subband SNR of the lowest subband. By having F_ana less than F_syn, the pitch harmonics are emphasized relative to the valleys in between the harmonics.
    The tilt coefficient c_tilt is for unvoiced frames chosen as
    and as
    for voiced frames, where V is the voice activity level between 0 and 1.
    The adjustment gain G serves to correct any level mismatch between the original and decoded signals that might arise from the noise shaping and de-emphasis. This gain is computed as the ratio of the prediction gain of the short-term analysis and synthesis filter coefficients. The prediction gain of an LPC synthesis filter is the square root of the output energy when the filter is excited by a unit-energy impulse on the input. An efficient way to compute the prediction gain is by first computing the reflection coefficients from the LPC coefficients through the step-down algorithm, and extracting the prediction gain from the reflection coefficients as
    where r_k is the k'th reflection coefficient.
    Initial values for the quantization gains are computed as the square-root of the residual energy of the LPC analysis, adjusted by the coding quality control parameter. These quantization gains are later adjusted based on the results of the prediction analysis.
    The prediction analysis is performed in one of two ways depending on how the pitch estimator classified the frame. The processing for voiced and unvoiced speech is described in and , respectively. Inputs to this function include the pre-whitened signal from the pitch estimator (see ).
    For a frame of voiced speech the pitch pulses will remain dominant in the pre-whitened input signal. Further whitening is desirable as it leads to higher quality at the same available bitrate. To achieve this, a Long-Term Prediction (LTP) analysis is carried out to estimate the coefficients of a fifth-order LTP filter for each of four subframes. The LTP coefficients are quantized using the method described in , and the quantized LTP coefficients are used to compute the LTP residual signal. This LTP residual signal is the input to an LPC analysis where the LPC coefficients are estimated using Burg's method , such that the residual energy is minimized. The estimated LPC coefficients are converted to a Line Spectral Frequency (LSF) vector and quantized as described in . After quantization, the quantized LSF vector is converted back to LPC coefficients using the full procedure in . By using quantized LTP coefficients and LPC coefficients derived from the quantized LSF coefficients, the encoder remains fully synchronized with the decoder. The quantized LPC and LTP coefficients are also used to filter the input signal and measure residual energy for each of the four subframes.
    For a speech signal that has been classified as unvoiced, there is no need for LTP filtering, as it has already been determined that the pre-whitened input signal is not periodic enough within the allowed pitch period range for LTP analysis to be worth the cost in terms of complexity and bitrate. The pre-whitened input signal is therefore discarded, and instead the input signal is used for LPC analysis using Burg's method. The resulting LPC coefficients are converted to an LSF vector and quantized as described in the following section. They are then transformed back to obtain quantized LPC coefficients, which are then used to filter the input signal and measure residual energy for each of the four subframes.
    The main purpose of linear prediction in SILK is to reduce the bitrate by minimizing the residual energy. At least at high bitrates, perceptual aspects are handled independently by the noise shaping filter. Burg's method is used because it provides higher prediction gain than the autocorrelation method and, unlike the covariance method, produces stable filters (assuming numerical errors don't spoil that). SILK's implementation of Burg's method is also computationally faster than the autocovariance method. The implementation of Burg's method differs from traditional implementations in two aspects. The first difference is that it operates on autocorrelations, similar to the Schur algorithm , but with a simple update to the autocorrelations after finding each reflection coefficient to make the result identical to Burg's method. This brings down the complexity of Burg's method to near that of the autocorrelation method. The second difference is that the signal in each subframe is scaled by the inverse of the residual quantization step size. Subframes with a small quantization step size will on average spend more bits for a given amount of residual energy than subframes with a large step size. Without scaling, Burg's method minimizes the total residual energy in all subframes, which doesn't necessarily minimize the total number of bits needed for coding the quantized residual. The residual energy of the scaled subframes is a better measure for that number of bits.
    Unlike many other speech codecs, SILK uses variable bitrate coding for the LSFs. This improves the average rate-distortion (R-D) tradeoff and reduces outliers. The variable bitrate coding minimizes a linear combination of the weighted quantization errors and the bitrate. The weights for the quantization errors are the Inverse Harmonic Mean Weighting (IHMW) function proposed by Laroia et al. (see ). These weights are referred to here as Laroia weights. The LSF quantizer consists of two stages. The first stage is an (unweighted) vector quantizer (VQ), with a codebook size of 32 vectors. The quantization errors for the codebook vector are sorted, and for the N best vectors a second stage quantizer is run. By varying the number N a tradeoff is made between R-D performance and computational efficiency. For each of the N codebook vectors the Laroia weights corresponding to that vector (and not to the input vector) are calculated. Then the residual between the input LSF vector and the codebook vector is scaled by the square roots of these Laroia weights. This scaling partially normalizes error sensitivity for the residual vector, so that a uniform quantizer with fixed step sizes can be used in the second stage without too much performance loss. And by scaling with Laroia weights determined from the first-stage codebook vector, the process can be reversed in the decoder. The second stage uses predictive delayed decision scalar quantization. The quantization error is weighted by Laroia weights determined from the LSF input vector. The predictor multiplies the previous quantized residual value by a prediction coefficient that depends on the vector index from the first stage VQ and on the location in the LSF vector. The prediction is subtracted from the LSF residual value before quantizing the result, and added back afterwards. This subtraction can be interpreted as shifting the quantization levels of the scalar quantizer, and as a result the quantization error of each value depends on the quantization decision of the previous value. This dependency is exploited by the delayed decision mechanism to search for a quantization sequency with best R-D performance with a Viterbi-like algorithm . The quantizer processes the residual LSF vector in reverse order (i.e., it starts with the highest residual LSF value). This is done because the prediction works slightly better in the reverse direction. The quantization index of the first stage is entropy coded. The quantization sequence from the second stage is also entropy coded, where for each element the probability table is chosen depending on the vector index from the first stage and the location of that element in the LSF vector.
    If the input is stable, finding the best candidate usually results in a quantized vector that is also stable. Because of the two-stage approach, however, it is possible that the best quantization candidate is unstable. The encoder applies the same stabilization procedure applied by the decoder (see to ensure the LSF parameters are within their valid range, increasingly sorted, and have minimum distances between each other and the border values.
    For voiced frames, the prediction analysis described in resulted in four sets (one set per subframe) of five LTP coefficients, plus four weighting matrices. The LTP coefficients for each subframe are quantized using entropy constrained vector quantization. A total of three vector codebooks are available for quantization, with different rate-distortion trade-offs. The three codebooks have 10, 20, and 40 vectors and average rates of about 3, 4, and 5 bits per vector, respectively. Consequently, the first codebook has larger average quantization distortion at a lower rate, whereas the last codebook has smaller average quantization distortion at a higher rate. Given the weighting matrix W_ltp and LTP vector b, the weighted rate-distortion measure for a codebook vector cb_i with rate r_i is give by
    where u is a fixed, heuristically-determined parameter balancing the distortion and rate. Which codebook gives the best performance for a given LTP vector depends on the weighting matrix for that LTP vector. For example, for a low valued W_ltp, it is advantageous to use the codebook with 10 vectors as it has a lower average rate. For a large W_ltp, on the other hand, it is often better to use the codebook with 40 vectors, as it is more likely to contain the best codebook vector. The weighting matrix W_ltp depends mostly on two aspects of the input signal. The first is the periodicity of the signal; the more periodic, the larger W_ltp. The second is the change in signal energy in the current subframe, relative to the signal one pitch lag earlier. A decaying energy leads to a larger W_ltp than an increasing energy. Both aspects fluctuate relatively slowly, which causes the W_ltp matrices for different subframes of one frame often to be similar. Because of this, one of the three codebooks typically gives good performance for all subframes, and therefore the codebook search for the subframe LTP vectors is constrained to only allow codebook vectors to be chosen from the same codebook, resulting in a rate reduction.
    To find the best codebook, each of the three vector codebooks is used to quantize all subframe LTP vectors and produce a combined weighted rate-distortion measure for each vector codebook. The vector codebook with the lowest combined rate-distortion over all subframes is chosen. The quantized LTP vectors are used in the noise shaping quantizer, and the index of the codebook plus the four indices for the four subframe codebook vectors are passed on to the range encoder.
    In the prefilter the input signal is filtered using the spectral valley de-emphasis filter coefficients from the noise shaping analysis (see ). By applying only the noise shaping analysis filter to the input signal, it provides the input to the noise shaping quantizer.
    The noise shaping quantizer independently shapes the signal and coding noise spectra to obtain a perceptually higher quality at the same bitrate. The prefilter output signal is multiplied with a compensation gain G computed in the noise shaping analysis. Then the output of a synthesis shaping filter is added, and the output of a prediction filter is subtracted to create a residual signal. The residual signal is multiplied by the inverse quantized quantization gain from the noise shaping analysis, and input to a scalar quantizer. The quantization indices of the scalar quantizer represent a signal of pulses that is input to the pyramid range encoder. The scalar quantizer also outputs a quantization signal, which is multiplied by the quantized quantization gain from the noise shaping analysis to create an excitation signal. The output of the prediction filter is added to the excitation signal to form the quantized output signal y(n). The quantized output signal y(n) is input to the synthesis shaping and prediction filters. Optionally the noise shaping quantizer operates in a delayed decision mode. In this mode it uses a Viterbi algorithm to keep track of multiple rounding choices in the quantizer and select the best one after a delay of 32 samples. This improves the rate/distortion performance of the quantizer.
    SILK was designed to run in Variable Bitrate (VBR) mode. However the reference implementation also has a Constant Bitrate (CBR) mode for SILK. In CBR mode SILK will attempt to encode each packet with no more than the allowed number of bits. The Opus wrapper code then pads the bitstream if any unused bits are left in SILK mode, or encodes the high band with the remaining number of bits in Hybrid mode. The number of payload bits is adjusted by changing the quantization gains and the rate/distortion tradeoff in the noise shaping quantizer, in an iterative loop around the noise shaping quantizer and entropy coding. Compared to the SILK VBR mode, the CBR mode has lower audio quality at a given average bitrate, and also has higher computational complexity.
    Most of the aspects of the CELT encoder can be directly derived from the description of the decoder. For example, the filters and rotations in the encoder are simply the inverse of the operation performed by the decoder. Similarly, the quantizers generally optimize for the mean square error (because noise shaping is part of the bit-stream itself), so no special search is required. For this reason, only the less straightforward aspects of the encoder are described here.
    The pitch prefilter is applied after the pre-emphasis. It is applied in such a way as to be the inverse of the decoder's post-filter. The main non-obvious aspect of the prefilter is the selection of the pitch period. The pitch search should be optimized for the following criteria: continuity: it is important that the pitch period does not change abruptly between frames; and avoidance of pitch multiples: when the period used is a multiple of the real period (lower frequency fundamental), the post-filter loses most of its ability to reduce noise
    The MDCT output is divided into bands that are designed to match the ear's critical bands for the smallest (2.5 ms) frame size. The larger frame sizes use integer multiples of the 2.5 ms layout. For each band, the encoder computes the energy that will later be encoded. Each band is then normalized by the square root of the unquantized energy, such that each band now forms a unit vector X. The energy and the normalization are computed by compute_band_energies() and normalise_bands() (bands.c), respectively.
    Energy quantization (both coarse and fine) can be easily understood from the decoding process. For all useful bitrates, the coarse quantizer always chooses the quantized log energy value that minimizes the error for each band. Only at very low rate does the encoder allow larger errors to minimize the rate and avoid using more bits than are available. When the available CPU requirements allow it, it is best to try encoding the coarse energy both with and without inter-frame prediction such that the best prediction mode can be selected. The optimal mode depends on the coding rate, the available bitrate, and the current rate of packet loss. The fine energy quantizer always chooses the quantized log energy value that minimizes the error for each band because the rate of the fine quantization depends only on the bit allocation and not on the values that are coded.
    The encoder must use exactly the same bit allocation process as used by the decoder and described in . The three mechanisms that can be used by the encoder to adjust the bitrate on a frame-by-frame basis are band boost, allocation trim, and band skipping.
    The reference encoder makes a decision to boost a band when the energy of that band is significantly higher than that of the neighboring bands. Let E_j be the log-energy of band j, we define D_j = 2*E_j - E_j-1 - E_j+1 The allocation of band j is boosted once if D_j > t1 and twice if D_j > t2. For LM>=1, t1=2 and t2=4, while for LM<1, t1=3 and t2=5.
    The allocation trim is a value between 0 and 10 (inclusively) that controls the allocation balance between the low and high frequencies. The encoder starts with a safe "default" of 5 and deviates from that default in two different ways. First the trim can deviate by +/- 2 depending on the spectral tilt of the input signal. For signals with more low frequencies, the trim is increased by up to 2, while for signals with more high frequencies, the trim is decreased by up to 2. For stereo inputs, the trim value can be decreased by up to 4 when the inter-channel correlation at low frequency (first 8 bands) is high.
    The encoder uses band skipping to ensure that the shape of the bands is only coded if there is at least 1/2 bit per sample available for the PVQ. If not, then no bit is allocated and folding is used instead. To ensure continuity in the allocation, some amount of hysteresis is added to the process, such that a band that received PVQ bits in the previous frame only needs 7/16 bit/sample to be coded for the current frame, while a band that did not receive PVQ bits in the previous frames needs at least 9/16 bit/sample to be coded.
    Because CELT applies mid-side stereo coupling in the normalized domain, it does not suffer from important stereo image problems even when the two channels are completely uncorrelated. For this reason it is always safe to use stereo coupling on any audio frame. That being said, there are some frames for which dual (independent) stereo is still more efficient. This decision is made by comparing the estimated entropy with and without coupling over the first 13 bands, taking into account the fact that all bands with more than two MDCT bins require one extra degree of freedom when coded in mid-side. Let L1_ms and L1_lr be the L1-norm of the mid-side vector and the L1-norm of the left-right vector, respectively. The decision to use mid-side is made if and only if
    where bins is the number of MDCT bins in the first 13 bands and E is the number of extra degrees of freedom for mid-side coding. For LM>1, E=13, otherwise E=5.
    The reference encoder decides on the intensity stereo threshold based on the bitrate alone. After taking into account the frame size by subtracting 80 bits per frame for coarse energy, the first band using intensity coding is as follows: bitrate (kb/s) start band <35 8 35-50 12 50-68 16 84-84 18 84-102 19 102-130 20 >130 disabled
    The choice of time-frequency resolution used in is based on R-D optimization. The distortion is the L1-norm (sum of absolute values) of each band after each TF resolution under consideration. The L1 norm is used because it represents the entropy for a Laplacian source. The number of bits required to code a change in TF resolution between two bands is higher than the cost of having those two bands use the same resolution, which is what requires the R-D optimization. The optimal decision is computed using the Viterbi algorithm. See tf_analysis() in celt/celt.c.
    The choice of the spreading value in has an impact on the nature of the coding noise introduced by CELT. The larger the f_r value, the lower the impact of the rotation, and the more tonal the coding noise. The more tonal the signal, the more tonal the noise should be, so the CELT encoder determines the optimal value for f_r by estimating how tonal the signal is. The tonality estimate is based on discrete pdf (4-bin histogram) of each band. Bands that have a large number of small values are considered more tonal and a decision is made by combining all bands with more than 8 samples. See spreading_decision() in celt/bands.c.
    CELT uses a Pyramid Vector Quantization (PVQ) codebook for quantizing the details of the spectrum in each band that have not been predicted by the pitch predictor. The PVQ codebook consists of all sums of K signed pulses in a vector of N samples, where two pulses at the same position are required to have the same sign. Thus the codebook includes all integer codevectors y of N dimensions that satisfy sum(abs(y(j))) = K. In bands where there are sufficient bits allocated PVQ is used to encode the unit vector that results from the normalization in directly. Given a PVQ codevector y, the unit vector X is obtained as X = y/||y||, where ||.|| denotes the L2 norm.
    The search for the best codevector y is performed by alg_quant() (vq.c). There are several possible approaches to the search, with a trade-off between quality and complexity. The method used in the reference implementation computes an initial codeword y1 by projecting the normalized spectrum X onto the codebook pyramid of K-1 pulses: y0 = truncate_towards_zero( (K-1) * X / sum(abs(X))) Depending on N, K and the input data, the initial codeword y0 may contain from 0 to K-1 non-zero values. All the remaining pulses, with the exception of the last one, are found iteratively with a greedy search that minimizes the normalized correlation between y and X:
    The search described above is considered to be a good trade-off between quality and computational cost. However, there are other possible ways to search the PVQ codebook and the implementers MAY use any other search methods. See alg_quant() in celt/vq.c.
    The vector to encode, X, is converted into an index i such that 0 <= i < V(N,K) as follows. Let i = 0 and k = 0. Then for j = (N - 1) down to 0, inclusive, do: If k > 0, set i = i + (V(N-j-1,k-1) + V(N-j,k-1))/2. Set k = k + abs(X[j]). If X[j] < 0, set i = i + (V(N-j-1,k) + V(N-j,k))/2. The index i is then encoded using the procedure in with ft = V(N,K).
    It is our intention to allow the greatest possible choice of freedom in implementing the specification. For this reason, outside of the exceptions noted in this section, conformance is defined through the reference implementation of the decoder provided in . Although this document includes an English description of the codec, should the description contradict the source code of the reference implementation, the latter shall take precedence. Compliance with this specification means that in addition to following the normative keywords in this document, a decoder's output MUST also be within the thresholds specified by the opus_compare.c tool (included with the code) when compared to the reference implementation for each of the test vectors provided (see ) and for each output sampling rate and channel count supported. In addition, a compliant decoder implementation MUST have the same final range decoder state as that of the reference decoder. It is therefore RECOMMENDED that the decoder implement the same functional behavior as the reference. A decoder implementation is not required to support all output sampling rates or all output channel counts.
    Using the reference code provided in , a test vector can be decoded with opus_demo -d <rate> <channels> testvectorX.bit testX.out where <rate> is the sampling rate and can be 8000, 12000, 16000, 24000, or 48000, and <channels> is 1 for mono or 2 for stereo. If the range decoder state is incorrect for one of the frames, the decoder will exit with "Error: Range coder state mismatch between encoder and decoder". If the decoder succeeds, then the output can be compared with the "reference" output with opus_compare -s -r <rate> testvectorX.dec testX.out for stereo or opus_compare -r <rate> testvectorX.dec testX.out for mono. In addition to indicating whether the test vector comparison passes, the opus_compare tool outputs an "Opus quality metric" that indicates how well the tested decoder matches the reference implementation. A quality of 0 corresponds to the passing threshold, while a quality of 100 is the highest possible value and means that the output of the tested decoder is identical to the reference implementation. The passing threshold (quality 0) was calibrated in such a way that it corresponds to additive white noise with a 48 dB SNR (similar to what can be obtained on a cassette deck). It is still possible for an implementation to sound very good with such a low quality measure (e.g. if the deviation is due to inaudible phase distortion), but unless this is verified by listening tests, it is RECOMMENDED that implementations achieve a quality above 90 for 48 kHz decoding. For other sampling rates, it is normal for the quality metric to be lower (typically as low as 50 even for a good implementation) because of harmless mismatch with the delay and phase of the internal sampling rate conversion. On POSIX environments, the run_vectors.sh script can be used to verify all test vectors. This can be done with run_vectors.sh <exec path> <vector path> <rate> where <exec path> is the directory where the opus_demo and opus_compare executables are built and <vector path> is the directory containing the test vectors.
    Opus Custom is an OPTIONAL part of the specification that is defined to handle special sample rates and frame rates that are not supported by the main Opus specification. Use of Opus Custom is discouraged for all but very special applications for which a frame size different from 2.5, 5, 10, or 20 ms is needed (for either complexity or latency reasons). Because Opus Custom is optional, streams encoded using Opus Custom cannot be expected to be decodable by all Opus implementations. Also, because no in-band mechanism exists for specifying the sampling rate and frame size of Opus Custom streams, out-of-band signaling is required. In Opus Custom operation, only the CELT layer is available, using the opus_custom_* function calls in opus_custom.h.
    Implementations of the Opus codec need to take appropriate security considerations into account, as outlined in . It is extremely important for the decoder to be robust against malicious payloads. Malicious payloads must not cause the decoder to overrun its allocated memory or to take an excessive amount of resources to decode. Although problems in encoders are typically rarer, the same applies to the encoder. Malicious audio streams must not cause the encoder to misbehave because this would allow an attacker to attack transcoding gateways. The reference implementation contains no known buffer overflow or cases where a specially crafted packet or audio segment could cause a significant increase in CPU load. However, on certain CPU architectures where denormalized floating-point operations are much slower than normal floating-point operations, it is possible for some audio content (e.g., silence or near-silence) to cause an increase in CPU load. Denormals can be introduced by reordering operations in the compiler and depend on the target architecture, so it is difficult to guarantee that an implementation avoids them. For architectures on which denormals are problematic, adding very small floating-point offsets to the affected signals to prevent significant numbers of denormalized operations is RECOMMENDED. Alternatively, it is often possible to configure the hardware to treat denormals as zero (DAZ). No such issue exists for the fixed-point reference implementation. The reference implementation was validated in the following conditions: Sending the decoder valid packets generated by the reference encoder and verifying that the decoder's final range coder state matches that of the encoder. Sending the decoder packets generated by the reference encoder and then subjected to random corruption. Sending the decoder random packets. Sending the decoder packets generated by a version of the reference encoder modified to make random coding decisions (internal fuzzing), including mode switching, and verifying that the range coder final states match. In all of the conditions above, both the encoder and the decoder were run inside the Valgrind memory debugger, which tracks reads and writes to invalid memory regions as well as the use of uninitialized memory. There were no errors reported on any of the tested conditions.
    This document has no actions for IANA.
    Thanks to all other developers, including Raymond Chen, Soeren Skak Jensen, Gregory Maxwell, Christopher Montgomery, and Karsten Vandborg Soerensen. We would also like to thank Igor Dyakonov, Jan Skoglund, and Christian Hoene for their help with subjective testing of the Opus codec. Thanks to Ralph Giles, John Ridges, Ben Schwartz, Keith Yan, Christian Hoene, Kat Walsh, and many others on the Opus and CELT mailing lists for their bug reports and feedback.
    The authors agree to grant third parties the irrevocable right to copy, use and distribute the work (excluding Code Components available under the simplified BSD license), with or without modification, in any medium, without royalty, provided that, unless separate permission is granted, redistributed modified works do not contain misleading author, version, name of work, or endorsement information.
    Key words for use in RFCs to Indicate Requirement Levels Requirements for an Internet Audio Codec IETF This document provides specific requirements for an Internet audio codec. These requirements address quality, sample rate, bitrate, and packet-loss robustness, as well as other desirable properties. SILK Speech Codec Robust and Efficient Quantization of Speech LSP Parameters Using Structured Vector Quantization Constrained-Energy Lapped Transform (CELT) Codec Guidelines for the use of Variable Bit Rate Audio with Secure RTP Internet Denial-of-Service Considerations IAB This document provides an overview of possible avenues for denial-of-service (DoS) attack on Internet systems. The aim is to encourage protocol designers and network engineers towards designs that are more robust. We discuss partial solutions that reduce the effectiveness of attacks, and how some solutions might inadvertently open up alternative vulnerabilities. This memo provides information for the Internet community. Range encoding: An algorithm for removing redundancy from a digitised message Source coding algorithms for fast data compression A Pyramid Vector Quantizer The Computation of Line Spectral Frequencies Using Chebyshev Polynomials Valgrind website Google NetEQ code Google WebRTC code Opus Git Repository Opus website Vorbis website Matroska website Opus Testvectors (webside) Opus Testvectors (proceedings) Line Spectral Pairs Wikipedia Range Coding Wikipedia Hadamard Transform Wikipedia Viterbi Algorithm Wikipedia White Noise Wikipedia Linear Prediction Wikipedia Modified Discrete Cosine Transform Wikipedia Fast Fourier Transform Wikipedia Z-transform Wikipedia Maximum Entropy Spectral Analysis A fixed point computation of partial correlation coefficients Analysis/synthesis filter bank design based on time domain aliasing cancellation A High-Quality Speech and Audio Codec With Less Than 10 ms delay Subdivision of the audible frequency range into critical bands
    This appendix contains the complete source code for the reference implementation of the Opus codec written in C. By default, this implementation relies on floating-point arithmetic, but it can be compiled to use only fixed-point arithmetic by defining the FIXED_POINT macro. Information on building and using the reference implementation is available in the README file. The implementation can be compiled with either a C89 or a C99 compiler. It is reasonably optimized for most platforms such that only architecture-specific optimizations are likely to be useful. The FFT used is a slightly modified version of the KISS-FFT library, but it is easy to substitute any other FFT library. While the reference implementation does not rely on any undefined behavior as defined by C89 or C99, it relies on common implementation-defined behavior for two's complement architectures: Right shifts of negative values are consistent with two's complement arithmetic, so that a>>b is equivalent to floor(a/(2**b)), For conversion to a signed integer of N bits, the value is reduced modulo 2**N to be within range of the type, The result of integer division of a negative value is truncated towards zero, and The compiler provides a 64-bit integer type (a C99 requirement which is supported by most C89 compilers). In its current form, the reference implementation also requires the following architectural characteristics to obtain acceptable performance: Two's complement arithmetic, At least a 16 bit by 16 bit integer multiplier (32-bit result), and At least a 32-bit adder/accumulator.
    The complete source code can be extracted from this draft, by running the following command line: opus_source.tar.gz ]]> tar xzvf opus_source.tar.gz cd opus_source make On systems where the provided Makefile does not work, the following command line may be used to compile the source code: On systems where the base64 utility is not present, the following commands can be used instead: opus.b64 ]]> openssl base64 -d -in opus.b64 > opus_source.tar.gz
    As of the time of publication of this memo, an up-to-date implementation conforming to this standard is available in a Git repository. Releases and other resources are available at . However, although that implementation is expected to remain conformant with the standard, it is the code in this document that shall remain normative.
    Because of size constraints, the Opus test vectors are not distributed in this draft. They are available in the proceedings of the 83th IETF meeting (Paris) and from the Opus codec website at . These test vectors were created specifically to exercise all aspects of the decoder and therefore the audio quality of the decoded output is significantly lower than what Opus can achieve in normal operation. The SHA1 hash of the files in the test vector package are
    To use the internal framing described in , the decoder must know the total length of the Opus packet, in bytes. This section describes a simple variation of that framing which can be used when the total length of the packet is not known. Nothing in the encoding of the packet itself allows a decoder to distinguish between the regular, undelimited framing and the self-delimiting framing described in this appendix. Which one is used and where must be established by context at the transport layer. It is RECOMMENDED that a transport layer choose exactly one framing scheme, rather than allowing an encoder to signal which one it wants to use. For example, although a regular Opus stream does not support more than two channels, a multi-channel Opus stream may be formed from several one- and two-channel streams. To pack an Opus packet from each of these streams together in a single packet at the transport layer, one could use the self-delimiting framing for all but the last stream, and then the regular, undelimited framing for the last one. Reverting to the undelimited framing for the last stream saves overhead (because the total size of the transport-layer packet will still be known), and ensures that a "multi-channel" stream which only has a single Opus stream uses the same framing as a regular Opus stream does. This avoids the need for signaling to distinguish these two cases. The self-delimiting framing is identical to the regular, undelimited framing from , except that each Opus packet contains one extra length field, encoded using the same one- or two-byte scheme from . This extra length immediately precedes the compressed data of the first Opus frame in the packet, and is interpreted in the various modes as follows: Code 0 packets: It is the length of the single Opus frame (see ). Code 1 packets: It is the length used for both of the Opus frames (see ). Code 2 packets: It is the length of the second Opus frame (see ). CBR Code 3 packets: It is the length used for all of the Opus frames (see ). VBR Code 3 packets: It is the length of the last Opus frame (see ).
    mumble-1.3.4/3rdparty/opus-src/doc/header.html0000664000175000017500000000352514010707327021054 0ustar builderbuilder $projectname: $title $title $treeview $search $mathjax
    Opus
    $projectbrief
    $projectnumber
    $projectbrief
    $searchbox
    mumble-1.3.4/3rdparty/opus-src/doc/footer.html0000664000175000017500000000133714010707327021121 0ustar builderbuilder
    For more information visit the Opus Website.
    mumble-1.3.4/3rdparty/opus-src/doc/opus_in_isobmff.css0000664000175000017500000000247014010707327022627 0ustar builderbuilder/* Normal links */ .normal_link a:link { color : yellow; } .normal_link a:visited { color : green; } /* Boxes */ .pre { white-space: pre; /* CSS 2.0 */ white-space: pre-wrap; /* CSS 2.1 */ white-space: -pre-wrap; /* Opera 4-6 */ white-space: -o-pre-wrap; /* Opera 7 */ white-space: -moz-pre-wrap; /* Mozilla */ white-space: -hp-pre-wrap; /* HP Printers */ word-wrap : break-word; /* IE 5+ */ } .title_box { width : 470px; height : 70px; margin : 2px 50px 2px 2px; padding : 10px; border : 1px solid black; background-color : #666666; white-space : pre; float : left; text-align : center; color : #C0C0C0; font-size : 50pt; font-style : italic; } .subindex_box { margin : 5px; padding : 14px 22px; border : 1px solid black; background-color : #778877; float : left; text-align : center; color : #115555; font-size : 32pt; } .frame_box { margin : 10px; padding : 10px; border : 0px; background-color : #084040; text-align : left; color : #C0C0C0; font-family : monospace; } mumble-1.3.4/3rdparty/opus-src/doc/opus_update.patch0000664000175000017500000002333414010707327022307 0ustar builderbuilderdiff --git a/celt/bands.c b/celt/bands.c index 6962587..32e1de6 100644 --- a/celt/bands.c +++ b/celt/bands.c @@ -1234,9 +1234,23 @@ void quant_all_bands(int encode, const CELTMode *m, int start, int end, b = 0; } - if (resynth && M*eBands[i]-N >= M*eBands[start] && (update_lowband || lowband_offset==0)) + if (resynth && (M*eBands[i]-N >= M*eBands[start] || i==start+1) && (update_lowband || lowband_offset==0)) lowband_offset = i; + if (i == start+1) + { + int n1, n2; + int offset; + n1 = M*(eBands[start+1]-eBands[start]); + n2 = M*(eBands[start+2]-eBands[start+1]); + offset = M*eBands[start]; + /* Duplicate enough of the first band folding data to be able to fold the second band. + Copies no data for CELT-only mode. */ + OPUS_COPY(&norm[offset+n1], &norm[offset+2*n1 - n2], n2-n1); + if (C==2) + OPUS_COPY(&norm2[offset+n1], &norm2[offset+2*n1 - n2], n2-n1); + } + tf_change = tf_res[i]; if (i>=m->effEBands) { @@ -1257,7 +1271,7 @@ void quant_all_bands(int encode, const CELTMode *m, int start, int end, fold_start = lowband_offset; while(M*eBands[--fold_start] > effective_lowband); fold_end = lowband_offset-1; - while(M*eBands[++fold_end] < effective_lowband+N); + while(++fold_end < i && M*eBands[fold_end] < effective_lowband+N); x_cm = y_cm = 0; fold_i = fold_start; do { x_cm |= collapse_masks[fold_i*C+0]; diff --git a/celt/quant_bands.c b/celt/quant_bands.c index e5ed9ef..82fb823 100644 --- a/celt/quant_bands.c +++ b/celt/quant_bands.c @@ -552,6 +552,7 @@ void log2Amp(const CELTMode *m, int start, int end, { opus_val16 lg = ADD16(oldEBands[i+c*m->nbEBands], SHL16((opus_val16)eMeans[i],6)); + lg = MIN32(QCONST32(32.f, 16), lg); eBands[i+c*m->nbEBands] = PSHR32(celt_exp2(lg),4); } for (;inbEBands;i++) diff --git a/silk/LPC_inv_pred_gain.c b/silk/LPC_inv_pred_gain.c index 60c439b..6c301da 100644 --- a/silk/LPC_inv_pred_gain.c +++ b/silk/LPC_inv_pred_gain.c @@ -84,8 +84,13 @@ static opus_int32 LPC_inverse_pred_gain_QA( /* O Returns inver /* Update AR coefficient */ for( n = 0; n < k; n++ ) { - tmp_QA = Aold_QA[ n ] - MUL32_FRAC_Q( Aold_QA[ k - n - 1 ], rc_Q31, 31 ); - Anew_QA[ n ] = MUL32_FRAC_Q( tmp_QA, rc_mult2 , mult2Q ); + opus_int64 tmp64; + tmp_QA = silk_SUB_SAT32( Aold_QA[ n ], MUL32_FRAC_Q( Aold_QA[ k - n - 1 ], rc_Q31, 31 ) ); + tmp64 = silk_RSHIFT_ROUND64( silk_SMULL( tmp_QA, rc_mult2 ), mult2Q); + if( tmp64 > silk_int32_MAX || tmp64 < silk_int32_MIN ) { + return 0; + } + Anew_QA[ n ] = ( opus_int32 )tmp64; } } diff --git a/silk/NLSF_stabilize.c b/silk/NLSF_stabilize.c index 979aaba..2ef2398 100644 --- a/silk/NLSF_stabilize.c +++ b/silk/NLSF_stabilize.c @@ -134,7 +134,7 @@ void silk_NLSF_stabilize( /* Keep delta_min distance between the NLSFs */ for( i = 1; i < L; i++ ) - NLSF_Q15[i] = silk_max_int( NLSF_Q15[i], NLSF_Q15[i-1] + NDeltaMin_Q15[i] ); + NLSF_Q15[i] = silk_max_int( NLSF_Q15[i], silk_ADD_SAT16( NLSF_Q15[i-1], NDeltaMin_Q15[i] ) ); /* Last NLSF should be no higher than 1 - NDeltaMin[L] */ NLSF_Q15[L-1] = silk_min_int( NLSF_Q15[L-1], (1<<15) - NDeltaMin_Q15[L] ); diff --git a/silk/dec_API.c b/silk/dec_API.c index efd7918..21bb7e0 100644 --- a/silk/dec_API.c +++ b/silk/dec_API.c @@ -72,6 +72,9 @@ opus_int silk_InitDecoder( /* O Returns error co for( n = 0; n < DECODER_NUM_CHANNELS; n++ ) { ret = silk_init_decoder( &channel_state[ n ] ); } + silk_memset(&((silk_decoder *)decState)->sStereo, 0, sizeof(((silk_decoder *)decState)->sStereo)); + /* Not strictly needed, but it's cleaner that way */ + ((silk_decoder *)decState)->prev_decode_only_middle = 0; return ret; } diff --git a/silk/resampler_private_IIR_FIR.c b/silk/resampler_private_IIR_FIR.c index dbd6d9a..91a43aa 100644 --- a/silk/resampler_private_IIR_FIR.c +++ b/silk/resampler_private_IIR_FIR.c @@ -75,10 +75,10 @@ void silk_resampler_private_IIR_FIR( silk_resampler_state_struct *S = (silk_resampler_state_struct *)SS; opus_int32 nSamplesIn; opus_int32 max_index_Q16, index_increment_Q16; - opus_int16 buf[ RESAMPLER_MAX_BATCH_SIZE_IN + RESAMPLER_ORDER_FIR_12 ]; + opus_int16 buf[ 2*RESAMPLER_MAX_BATCH_SIZE_IN + RESAMPLER_ORDER_FIR_12 ]; /* Copy buffered samples to start of buffer */ - silk_memcpy( buf, S->sFIR, RESAMPLER_ORDER_FIR_12 * sizeof( opus_int32 ) ); + silk_memcpy( buf, S->sFIR, RESAMPLER_ORDER_FIR_12 * sizeof( opus_int16 ) ); /* Iterate over blocks of frameSizeIn input samples */ index_increment_Q16 = S->invRatio_Q16; @@ -95,13 +95,13 @@ void silk_resampler_private_IIR_FIR( if( inLen > 0 ) { /* More iterations to do; copy last part of filtered signal to beginning of buffer */ - silk_memcpy( buf, &buf[ nSamplesIn << 1 ], RESAMPLER_ORDER_FIR_12 * sizeof( opus_int32 ) ); + silk_memmove( buf, &buf[ nSamplesIn << 1 ], RESAMPLER_ORDER_FIR_12 * sizeof( opus_int16 ) ); } else { break; } } /* Copy last part of filtered signal to the state for the next call */ - silk_memcpy( S->sFIR, &buf[ nSamplesIn << 1 ], RESAMPLER_ORDER_FIR_12 * sizeof( opus_int32 ) ); + silk_memcpy( S->sFIR, &buf[ nSamplesIn << 1 ], RESAMPLER_ORDER_FIR_12 * sizeof( opus_int16 ) ); } diff --git a/src/opus_decoder.c b/src/opus_decoder.c index 0cc56f8..8a30fbc 100644 --- a/src/opus_decoder.c +++ b/src/opus_decoder.c @@ -595,16 +595,14 @@ static int opus_packet_parse_impl(const unsigned char *data, int len, /* Padding flag is bit 6 */ if (ch&0x40) { - int padding=0; int p; do { if (len<=0) return OPUS_INVALID_PACKET; p = *data++; len--; - padding += p==255 ? 254: p; + len -= p==255 ? 254: p; } while (p==255); - len -= padding; } if (len<0) return OPUS_INVALID_PACKET; diff --git a/run_vectors.sh b/run_vectors.sh index 7cd23ed..4841b0a 100755 --- a/run_vectors.sh +++ b/run_vectors.sh @@ -1,3 +1,5 @@ +#!/bin/sh +# # Copyright (c) 2011-2012 IETF Trust, Jean-Marc Valin. All rights reserved. # # This file is extracted from RFC6716. Please see that RFC for additional @@ -31,10 +33,8 @@ # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -#!/bin/sh - -rm logs_mono.txt -rm logs_stereo.txt +rm -f logs_mono.txt logs_mono2.txt +rm -f logs_stereo.txt logs_stereo2.txt if [ "$#" -ne "3" ]; then echo "usage: run_vectors.sh " @@ -45,18 +45,23 @@ CMD_PATH=$1 VECTOR_PATH=$2 RATE=$3 -OPUS_DEMO=$CMD_PATH/opus_demo -OPUS_COMPARE=$CMD_PATH/opus_compare +: ${OPUS_DEMO:=$CMD_PATH/opus_demo} +: ${OPUS_COMPARE:=$CMD_PATH/opus_compare} if [ -d $VECTOR_PATH ]; then echo Test vectors found in $VECTOR_PATH else echo No test vectors found - #Don't make the test fail here because the test vectors will be - #distributed separately + #Don't make the test fail here because the test vectors + #will be distributed separately exit 0 fi +if [ ! -x $OPUS_COMPARE ]; then + echo ERROR: Compare program not found: $OPUS_COMPARE + exit 1 +fi + if [ -x $OPUS_DEMO ]; then echo Decoding with $OPUS_DEMO else @@ -82,9 +87,11 @@ do echo ERROR: decoding failed exit 1 fi - $OPUS_COMPARE -r $RATE $VECTOR_PATH/testvector$file.dec tmp.out >> logs_mono.txt 2>&1 + $OPUS_COMPARE -r $RATE $VECTOR_PATH/testvector${file}.dec tmp.out >> logs_mono.txt 2>&1 float_ret=$? - if [ "$float_ret" -eq "0" ]; then + $OPUS_COMPARE -r $RATE $VECTOR_PATH/testvector${file}m.dec tmp.out >> logs_mono2.txt 2>&1 + float_ret2=$? + if [ "$float_ret" -eq "0" ] || [ "$float_ret2" -eq "0" ]; then echo output matches reference else echo ERROR: output does not match reference @@ -111,9 +118,11 @@ do echo ERROR: decoding failed exit 1 fi - $OPUS_COMPARE -s -r $RATE $VECTOR_PATH/testvector$file.dec tmp.out >> logs_stereo.txt 2>&1 + $OPUS_COMPARE -s -r $RATE $VECTOR_PATH/testvector${file}.dec tmp.out >> logs_stereo.txt 2>&1 float_ret=$? - if [ "$float_ret" -eq "0" ]; then + $OPUS_COMPARE -s -r $RATE $VECTOR_PATH/testvector${file}m.dec tmp.out >> logs_stereo2.txt 2>&1 + float_ret2=$? + if [ "$float_ret" -eq "0" ] || [ "$float_ret2" -eq "0" ]; then echo output matches reference else echo ERROR: output does not match reference @@ -125,5 +134,10 @@ done echo All tests have passed successfully -grep quality logs_mono.txt | awk '{sum+=$4}END{print "Average mono quality is", sum/NR, "%"}' -grep quality logs_stereo.txt | awk '{sum+=$4}END{print "Average stereo quality is", sum/NR, "%"}' +mono1=`grep quality logs_mono.txt | awk '{sum+=$4}END{if (NR == 12) sum /= 12; else sum = 0; print sum}'` +mono2=`grep quality logs_mono2.txt | awk '{sum+=$4}END{if (NR == 12) sum /= 12; else sum = 0; print sum}'` +echo $mono1 $mono2 | awk '{if ($2 > $1) $1 = $2; print "Average mono quality is", $1, "%"}' + +stereo1=`grep quality logs_stereo.txt | awk '{sum+=$4}END{if (NR == 12) sum /= 12; else sum = 0; print sum}'` +stereo2=`grep quality logs_stereo2.txt | awk '{sum+=$4}END{if (NR == 12) sum /= 12; else sum = 0; print sum}'` +echo $stereo1 $stereo2 | awk '{if ($2 > $1) $1 = $2; print "Average stereo quality is", $1, "%"}' mumble-1.3.4/3rdparty/opus-src/configure.ac0000664000175000017500000010027214010707327020454 0ustar builderbuilderdnl Process this file with autoconf to produce a configure script. -*-m4-*- dnl The package_version file will be automatically synced to the git revision dnl by the update_version script when configured in the repository, but will dnl remain constant in tarball releases unless it is manually edited. m4_define([CURRENT_VERSION], m4_esyscmd([ ./update_version 2>/dev/null || true if test -e package_version; then . ./package_version printf "$PACKAGE_VERSION" else printf "unknown" fi ])) AC_INIT([opus],[CURRENT_VERSION],[opus@xiph.org]) AC_CONFIG_SRCDIR(src/opus_encoder.c) AC_CONFIG_MACRO_DIR([m4]) dnl enable silent rules on automake 1.11 and later m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) # For libtool. dnl Please update these for releases. OPUS_LT_CURRENT=6 OPUS_LT_REVISION=1 OPUS_LT_AGE=6 AC_SUBST(OPUS_LT_CURRENT) AC_SUBST(OPUS_LT_REVISION) AC_SUBST(OPUS_LT_AGE) AM_INIT_AUTOMAKE([no-define]) AM_MAINTAINER_MODE([enable]) AC_CANONICAL_HOST AC_MINGW32 AM_PROG_LIBTOOL AM_PROG_CC_C_O AC_PROG_CC_C99 AC_C_CONST AC_C_INLINE AM_PROG_AS AC_DEFINE([OPUS_BUILD], [], [This is a build of OPUS]) #Use a hacked up version of autoconf's AC_C_RESTRICT because it's not #strong enough a test to detect old buggy versions of GCC (e.g. 2.95.3) #Note: Both this and the test for variable-size arrays below are also # done by AC_PROG_CC_C99, but not thoroughly enough apparently. AC_CACHE_CHECK([for C/C++ restrict keyword], ac_cv_c_restrict, [ac_cv_c_restrict=no # The order here caters to the fact that C++ does not require restrict. for ac_kw in __restrict __restrict__ _Restrict restrict; do AC_COMPILE_IFELSE([AC_LANG_PROGRAM( [[typedef int * int_ptr; int foo (int_ptr $ac_kw ip, int * $ac_kw baz[]) { return ip[0]; }]], [[int s[1]; int * $ac_kw t = s; t[0] = 0; return foo(t, (void *)0)]])], [ac_cv_c_restrict=$ac_kw]) test "$ac_cv_c_restrict" != no && break done ]) AH_VERBATIM([restrict], [/* Define to the equivalent of the C99 'restrict' keyword, or to nothing if this is not supported. Do not define if restrict is supported directly. */ #undef restrict /* Work around a bug in Sun C++: it does not support _Restrict or __restrict__, even though the corresponding Sun C compiler ends up with "#define restrict _Restrict" or "#define restrict __restrict__" in the previous line. Perhaps some future version of Sun C++ will work with restrict; if so, hopefully it defines __RESTRICT like Sun C does. */ #if defined __SUNPRO_CC && !defined __RESTRICT # define _Restrict # define __restrict__ #endif]) case $ac_cv_c_restrict in restrict) ;; no) AC_DEFINE([restrict], []) ;; *) AC_DEFINE_UNQUOTED([restrict], [$ac_cv_c_restrict]) ;; esac AC_MSG_CHECKING(for C99 variable-size arrays) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [[static int x; char a[++x]; a[sizeof a - 1] = 0; int N; return a[0];]])], [ has_var_arrays=yes use_alloca="no (using var arrays)" AC_DEFINE([VAR_ARRAYS], [1], [Use C99 variable-size arrays]) ],[ has_var_arrays=no ]) AC_MSG_RESULT([$has_var_arrays]) AS_IF([test "$has_var_arrays" = "no"], [ AC_CHECK_HEADERS([alloca.h]) AC_MSG_CHECKING(for alloca) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[int foo=10; int *array = alloca(foo);]])], [ use_alloca=yes; AC_DEFINE([USE_ALLOCA], [], [Make use of alloca]) ],[ use_alloca=no ]) AC_MSG_RESULT([$use_alloca]) ]) LT_LIB_M AC_ARG_ENABLE([fixed-point], [AS_HELP_STRING([--enable-fixed-point], [compile without floating point (for machines without a fast enough FPU)])],, [enable_fixed_point=no]) AS_IF([test "$enable_fixed_point" = "yes"],[ enable_float="no" AC_DEFINE([FIXED_POINT], [1], [Compile as fixed-point (for machines without a fast enough FPU)]) PC_BUILD="fixed-point" ],[ enable_float="yes"; PC_BUILD="floating-point" ]) AM_CONDITIONAL([FIXED_POINT], [test "$enable_fixed_point" = "yes"]) AC_ARG_ENABLE([fixed-point-debug], [AS_HELP_STRING([--enable-fixed-point-debug], [debug fixed-point implementation])],, [enable_fixed_point_debug=no]) AS_IF([test "$enable_fixed_point_debug" = "yes"],[ AC_DEFINE([FIXED_DEBUG], [1], [Debug fixed-point implementation]) ]) AC_ARG_ENABLE([float_api], [AS_HELP_STRING([--disable-float-api], [compile without the floating point API (for machines with no float library)])],, [enable_float_api=yes]) AM_CONDITIONAL([DISABLE_FLOAT_API], [test "$enable_float_api" = "no"]) AS_IF([test "$enable_float_api" = "no"],[ AC_DEFINE([DISABLE_FLOAT_API], [1], [Do not build the float API]) ]) AC_ARG_ENABLE([custom-modes], [AS_HELP_STRING([--enable-custom-modes], [enable non-Opus modes, e.g. 44.1 kHz & 2^n frames])],, [enable_custom_modes=no]) AS_IF([test "$enable_custom_modes" = "yes"],[ AC_DEFINE([CUSTOM_MODES], [1], [Custom modes]) PC_BUILD="$PC_BUILD, custom modes" ]) AM_CONDITIONAL([CUSTOM_MODES], [test "$enable_custom_modes" = "yes"]) has_float_approx=no #case "$host_cpu" in #i[[3456]]86 | x86_64 | powerpc64 | powerpc32 | ia64) # has_float_approx=yes # ;; #esac AC_ARG_ENABLE([float-approx], [AS_HELP_STRING([--enable-float-approx], [enable fast approximations for floating point])], [if test "$enable_float_approx" = "yes"; then AC_WARN([Floating point approximations are not supported on all platforms.]) fi ], [enable_float_approx=$has_float_approx]) AS_IF([test "$enable_float_approx" = "yes"],[ AC_DEFINE([FLOAT_APPROX], [1], [Float approximations]) ]) AC_ARG_ENABLE([asm], [AS_HELP_STRING([--disable-asm], [Disable assembly optimizations])],, [enable_asm=yes]) AC_ARG_ENABLE([rtcd], [AS_HELP_STRING([--disable-rtcd], [Disable run-time CPU capabilities detection])],, [enable_rtcd=yes]) AC_ARG_ENABLE([intrinsics], [AS_HELP_STRING([--disable-intrinsics], [Disable intrinsics optimizations])],, [enable_intrinsics=yes]) rtcd_support=no cpu_arm=no AS_IF([test x"${enable_asm}" = x"yes"],[ inline_optimization="No inline ASM for your platform, please send patches" case $host_cpu in arm*) dnl Currently we only have asm for fixed-point AS_IF([test "$enable_float" != "yes"],[ cpu_arm=yes AC_DEFINE([OPUS_ARM_ASM], [], [Make use of ARM asm optimization]) AS_GCC_INLINE_ASSEMBLY( [inline_optimization="ARM"], [inline_optimization="disabled"] ) AS_ASM_ARM_EDSP([OPUS_ARM_INLINE_EDSP=1],[OPUS_ARM_INLINE_EDSP=0]) AS_ASM_ARM_MEDIA([OPUS_ARM_INLINE_MEDIA=1], [OPUS_ARM_INLINE_MEDIA=0]) AS_ASM_ARM_NEON([OPUS_ARM_INLINE_NEON=1],[OPUS_ARM_INLINE_NEON=0]) AS_IF([test x"$inline_optimization" = x"ARM"],[ AM_CONDITIONAL([OPUS_ARM_INLINE_ASM],[true]) AC_DEFINE([OPUS_ARM_INLINE_ASM], 1, [Use generic ARMv4 inline asm optimizations]) AS_IF([test x"$OPUS_ARM_INLINE_EDSP" = x"1"],[ AC_DEFINE([OPUS_ARM_INLINE_EDSP], [1], [Use ARMv5E inline asm optimizations]) inline_optimization="$inline_optimization (EDSP)" ]) AS_IF([test x"$OPUS_ARM_INLINE_MEDIA" = x"1"],[ AC_DEFINE([OPUS_ARM_INLINE_MEDIA], [1], [Use ARMv6 inline asm optimizations]) inline_optimization="$inline_optimization (Media)" ]) AS_IF([test x"$OPUS_ARM_INLINE_NEON" = x"1"],[ AC_DEFINE([OPUS_ARM_INLINE_NEON], 1, [Use ARM NEON inline asm optimizations]) inline_optimization="$inline_optimization (NEON)" ]) ]) dnl We need Perl to translate RVCT-syntax asm to gas syntax. AC_CHECK_PROG([HAVE_PERL], perl, yes, no) AS_IF([test x"$HAVE_PERL" = x"yes"],[ AM_CONDITIONAL([OPUS_ARM_EXTERNAL_ASM],[true]) asm_optimization="ARM" AS_IF([test x"$OPUS_ARM_INLINE_EDSP" = x"1"], [ OPUS_ARM_PRESUME_EDSP=1 OPUS_ARM_MAY_HAVE_EDSP=1 ], [ OPUS_ARM_PRESUME_EDSP=0 OPUS_ARM_MAY_HAVE_EDSP=0 ]) AS_IF([test x"$OPUS_ARM_INLINE_MEDIA" = x"1"], [ OPUS_ARM_PRESUME_MEDIA=1 OPUS_ARM_MAY_HAVE_MEDIA=1 ], [ OPUS_ARM_PRESUME_MEDIA=0 OPUS_ARM_MAY_HAVE_MEDIA=0 ]) AS_IF([test x"$OPUS_ARM_INLINE_NEON" = x"1"], [ OPUS_ARM_PRESUME_NEON=1 OPUS_ARM_MAY_HAVE_NEON=1 ], [ OPUS_ARM_PRESUME_NEON=0 OPUS_ARM_MAY_HAVE_NEON=0 ]) AS_IF([test x"$enable_rtcd" = x"yes"],[ AS_IF([test x"$OPUS_ARM_MAY_HAVE_EDSP" != x"1"],[ AC_MSG_NOTICE( [Trying to force-enable armv5e EDSP instructions...]) AS_ASM_ARM_EDSP_FORCE([OPUS_ARM_MAY_HAVE_EDSP=1]) ]) AS_IF([test x"$OPUS_ARM_MAY_HAVE_MEDIA" != x"1"],[ AC_MSG_NOTICE( [Trying to force-enable ARMv6 media instructions...]) AS_ASM_ARM_MEDIA_FORCE([OPUS_ARM_MAY_HAVE_MEDIA=1]) ]) AS_IF([test x"$OPUS_ARM_MAY_HAVE_NEON" != x"1"],[ AC_MSG_NOTICE( [Trying to force-enable NEON instructions...]) AS_ASM_ARM_NEON_FORCE([OPUS_ARM_MAY_HAVE_NEON=1]) ]) ]) rtcd_support= AS_IF([test x"$OPUS_ARM_MAY_HAVE_EDSP" = x"1"],[ AC_DEFINE(OPUS_ARM_MAY_HAVE_EDSP, 1, [Define if assembler supports EDSP instructions]) AS_IF([test x"$OPUS_ARM_PRESUME_EDSP" = x"1"],[ AC_DEFINE(OPUS_ARM_PRESUME_EDSP, 1, [Define if binary requires EDSP instruction support]) asm_optimization="$asm_optimization (EDSP)" ], [rtcd_support="$rtcd_support (EDSP)"] ) ]) AC_SUBST(OPUS_ARM_MAY_HAVE_EDSP) AS_IF([test x"$OPUS_ARM_MAY_HAVE_MEDIA" = x"1"],[ AC_DEFINE(OPUS_ARM_MAY_HAVE_MEDIA, 1, [Define if assembler supports ARMv6 media instructions]) AS_IF([test x"$OPUS_ARM_PRESUME_MEDIA" = x"1"],[ AC_DEFINE(OPUS_ARM_PRESUME_MEDIA, 1, [Define if binary requires ARMv6 media instruction support]) asm_optimization="$asm_optimization (Media)" ], [rtcd_support="$rtcd_support (Media)"] ) ]) AC_SUBST(OPUS_ARM_MAY_HAVE_MEDIA) AS_IF([test x"$OPUS_ARM_MAY_HAVE_NEON" = x"1"],[ AC_DEFINE(OPUS_ARM_MAY_HAVE_NEON, 1, [Define if compiler supports NEON instructions]) AS_IF([test x"$OPUS_ARM_PRESUME_NEON" = x"1"], [ AC_DEFINE(OPUS_ARM_PRESUME_NEON, 1, [Define if binary requires NEON instruction support]) asm_optimization="$asm_optimization (NEON)" ], [rtcd_support="$rtcd_support (NEON)"] ) ]) AC_SUBST(OPUS_ARM_MAY_HAVE_NEON) dnl Make sure turning on RTCD gets us at least one dnl instruction set. AS_IF([test x"$rtcd_support" != x""], [rtcd_support=ARM"$rtcd_support"], [rtcd_support="no"] ) AC_MSG_CHECKING([for apple style tools]) AC_PREPROC_IFELSE([AC_LANG_PROGRAM([ #ifndef __APPLE__ #error 1 #endif],[])], [AC_MSG_RESULT([yes]); ARM2GNU_PARAMS="--apple"], [AC_MSG_RESULT([no]); ARM2GNU_PARAMS=""]) AC_SUBST(ARM2GNU_PARAMS) ], [ AC_MSG_WARN( [*** ARM assembly requires perl -- disabling optimizations]) asm_optimization="(missing perl dependency for ARM)" ]) ]) ;; esac ],[ inline_optimization="disabled" asm_optimization="disabled" ]) AM_CONDITIONAL([OPUS_ARM_INLINE_ASM], [test x"${inline_optimization%% *}" = x"ARM"]) AM_CONDITIONAL([OPUS_ARM_EXTERNAL_ASM], [test x"${asm_optimization%% *}" = x"ARM"]) AM_CONDITIONAL([HAVE_SSE], [false]) AM_CONDITIONAL([HAVE_SSE2], [false]) AM_CONDITIONAL([HAVE_SSE4_1], [false]) AM_CONDITIONAL([HAVE_AVX], [false]) m4_define([DEFAULT_X86_SSE_CFLAGS], [-msse]) m4_define([DEFAULT_X86_SSE2_CFLAGS], [-msse2]) m4_define([DEFAULT_X86_SSE4_1_CFLAGS], [-msse4.1]) m4_define([DEFAULT_X86_AVX_CFLAGS], [-mavx]) m4_define([DEFAULT_ARM_NEON_INTR_CFLAGS], [-mfpu=neon]) # With GCC on ARM32 softfp architectures (e.g. Android, or older Ubuntu) you need to specify # -mfloat-abi=softfp for -mfpu=neon to work. However, on ARM32 hardfp architectures (e.g. newer Ubuntu), # this option will break things. # As a heuristic, if host matches arm*eabi* but not arm*hf*, it's probably soft-float. m4_define([DEFAULT_ARM_NEON_SOFTFP_INTR_CFLAGS], [-mfpu=neon -mfloat-abi=softfp]) AS_CASE([$host], [arm*hf*], [AS_VAR_SET([RESOLVED_DEFAULT_ARM_NEON_INTR_CFLAGS], "DEFAULT_ARM_NEON_INTR_CFLAGS")], [arm*eabi*], [AS_VAR_SET([RESOLVED_DEFAULT_ARM_NEON_INTR_CFLAGS], "DEFAULT_ARM_NEON_SOFTFP_INTR_CFLAGS")], [AS_VAR_SET([RESOLVED_DEFAULT_ARM_NEON_INTR_CFLAGS], "DEFAULT_ARM_NEON_INTR_CFLAGS")]) AC_ARG_VAR([X86_SSE_CFLAGS], [C compiler flags to compile SSE intrinsics @<:@default=]DEFAULT_X86_SSE_CFLAGS[@:>@]) AC_ARG_VAR([X86_SSE2_CFLAGS], [C compiler flags to compile SSE2 intrinsics @<:@default=]DEFAULT_X86_SSE2_CFLAGS[@:>@]) AC_ARG_VAR([X86_SSE4_1_CFLAGS], [C compiler flags to compile SSE4.1 intrinsics @<:@default=]DEFAULT_X86_SSE4_1_CFLAGS[@:>@]) AC_ARG_VAR([X86_AVX_CFLAGS], [C compiler flags to compile AVX intrinsics @<:@default=]DEFAULT_X86_AVX_CFLAGS[@:>@]) AC_ARG_VAR([ARM_NEON_INTR_CFLAGS], [C compiler flags to compile ARM NEON intrinsics @<:@default=]DEFAULT_ARM_NEON_INTR_CFLAGS / DEFAULT_ARM_NEON_SOFTFP_INTR_CFLAGS[@:>@]) AS_VAR_SET_IF([X86_SSE_CFLAGS], [], [AS_VAR_SET([X86_SSE_CFLAGS], "DEFAULT_X86_SSE_CFLAGS")]) AS_VAR_SET_IF([X86_SSE2_CFLAGS], [], [AS_VAR_SET([X86_SSE2_CFLAGS], "DEFAULT_X86_SSE2_CFLAGS")]) AS_VAR_SET_IF([X86_SSE4_1_CFLAGS], [], [AS_VAR_SET([X86_SSE4_1_CFLAGS], "DEFAULT_X86_SSE4_1_CFLAGS")]) AS_VAR_SET_IF([X86_AVX_CFLAGS], [], [AS_VAR_SET([X86_AVX_CFLAGS], "DEFAULT_X86_AVX_CFLAGS")]) AS_VAR_SET_IF([ARM_NEON_INTR_CFLAGS], [], [AS_VAR_SET([ARM_NEON_INTR_CFLAGS], ["$RESOLVED_DEFAULT_ARM_NEON_INTR_CFLAGS"])]) AC_DEFUN([OPUS_PATH_NE10], [ AC_ARG_WITH(NE10, AC_HELP_STRING([--with-NE10=PFX],[Prefix where libNE10 is installed (optional)]), NE10_prefix="$withval", NE10_prefix="") AC_ARG_WITH(NE10-libraries, AC_HELP_STRING([--with-NE10-libraries=DIR], [Directory where libNE10 library is installed (optional)]), NE10_libraries="$withval", NE10_libraries="") AC_ARG_WITH(NE10-includes, AC_HELP_STRING([--with-NE10-includes=DIR], [Directory where libNE10 header files are installed (optional)]), NE10_includes="$withval", NE10_includes="") if test "x$NE10_libraries" != "x" ; then NE10_LIBS="-L$NE10_libraries" elif test "x$NE10_prefix" = "xno" || test "x$NE10_prefix" = "xyes" ; then NE10_LIBS="" elif test "x$NE10_prefix" != "x" ; then NE10_LIBS="-L$NE10_prefix/lib" elif test "x$prefix" != "xNONE" ; then NE10_LIBS="-L$prefix/lib" fi if test "x$NE10_prefix" != "xno" ; then NE10_LIBS="$NE10_LIBS -lNE10" fi if test "x$NE10_includes" != "x" ; then NE10_CFLAGS="-I$NE10_includes" elif test "x$NE10_prefix" = "xno" || test "x$NE10_prefix" = "xyes" ; then NE10_CFLAGS="" elif test "x$ogg_prefix" != "x" ; then NE10_CFLAGS="-I$NE10_prefix/include" elif test "x$prefix" != "xNONE"; then NE10_CFLAGS="-I$prefix/include" fi AC_MSG_CHECKING(for NE10) save_CFLAGS="$CFLAGS"; CFLAGS="$CFLAGS $NE10_CFLAGS" save_LIBS="$LIBS"; LIBS="$LIBS $NE10_LIBS $LIBM" AC_LINK_IFELSE( [ AC_LANG_PROGRAM( [[#include ]], [[ ne10_fft_cfg_float32_t cfg; cfg = ne10_fft_alloc_c2c_float32_neon(480); ]] ) ],[ HAVE_ARM_NE10=1 AC_MSG_RESULT([yes]) ],[ HAVE_ARM_NE10=0 AC_MSG_RESULT([no]) NE10_CFLAGS="" NE10_LIBS="" ] ) CFLAGS="$save_CFLAGS"; LIBS="$save_LIBS" #Now we know if libNE10 is installed or not AS_IF([test x"$HAVE_ARM_NE10" = x"1"], [ AC_DEFINE([HAVE_ARM_NE10], 1, [NE10 library is installed on host. Make sure it is on target!]) AC_SUBST(HAVE_ARM_NE10) AC_SUBST(NE10_CFLAGS) AC_SUBST(NE10_LIBS) ] ) ] ) AS_IF([test x"$enable_intrinsics" = x"yes"],[ intrinsics_support="" AS_CASE([$host_cpu], [arm*|aarch64*], [ cpu_arm=yes OPUS_CHECK_INTRINSICS( [ARM Neon], [$ARM_NEON_INTR_CFLAGS], [OPUS_ARM_MAY_HAVE_NEON_INTR], [OPUS_ARM_PRESUME_NEON_INTR], [[#include ]], [[ static float32x4_t A0, A1, SUMM; SUMM = vmlaq_f32(SUMM, A0, A1); return (int)vgetq_lane_f32(SUMM, 0); ]] ) AS_IF([test x"$OPUS_ARM_MAY_HAVE_NEON_INTR" = x"1" && test x"$OPUS_ARM_PRESUME_NEON_INTR" != x"1"], [ OPUS_ARM_NEON_INTR_CFLAGS="$ARM_NEON_INTR_CFLAGS" AC_SUBST([OPUS_ARM_NEON_INTR_CFLAGS]) ] ) AS_IF([test x"$OPUS_ARM_MAY_HAVE_NEON_INTR" = x"1"], [ AC_DEFINE([OPUS_ARM_MAY_HAVE_NEON_INTR], 1, [Compiler supports ARMv7/Aarch64 Neon Intrinsics]) intrinsics_support="$intrinsics_support (NEON)" AS_IF([test x"$enable_rtcd" != x"no" && test x"$OPUS_ARM_PRESUME_NEON_INTR" != x"1"], [AS_IF([test x"$rtcd_support" = x"no"], [rtcd_support="ARM (NEON Intrinsics)"], [rtcd_support="$rtcd_support (NEON Intrinsics)"])]) AS_IF([test x"$OPUS_ARM_PRESUME_NEON_INTR" = x"1"], [AC_DEFINE([OPUS_ARM_PRESUME_NEON_INTR], 1, [Define if binary requires NEON intrinsics support])]) OPUS_PATH_NE10() AS_IF([test x"$NE10_LIBS" != x""], [ intrinsics_support="$intrinsics_support (NE10)" AS_IF([test x"enable_rtcd" != x"" \ && test x"$OPUS_ARM_PRESUME_NEON_INTR" != x"1"], [rtcd_support="$rtcd_support (NE10)"]) ]) OPUS_CHECK_INTRINSICS( [Aarch64 Neon], [$ARM_NEON_INTR_CFLAGS], [OPUS_ARM_MAY_HAVE_AARCH64_NEON_INTR], [OPUS_ARM_PRESUME_AARCH64_NEON_INTR], [[#include ]], [[ static int32_t IN; static int16_t OUT; OUT = vqmovns_s32(IN); ]] ) AS_IF([test x"$OPUS_ARM_PRESUME_AARCH64_NEON_INTR" = x"1"], [ AC_DEFINE([OPUS_ARM_PRESUME_AARCH64_NEON_INTR], 1, [Define if binary requires Aarch64 Neon Intrinsics]) intrinsics_support="$intrinsics_support (NEON [Aarch64])" ]) AS_IF([test x"$intrinsics_support" = x""], [intrinsics_support=no], [intrinsics_support="ARM$intrinsics_support"]) ], [ AC_MSG_WARN([Compiler does not support ARM intrinsics]) intrinsics_support=no ]) ], [i?86|x86_64], [ OPUS_CHECK_INTRINSICS( [SSE], [$X86_SSE_CFLAGS], [OPUS_X86_MAY_HAVE_SSE], [OPUS_X86_PRESUME_SSE], [[#include #include ]], [[ __m128 mtest; mtest = _mm_set1_ps((float)time(NULL)); mtest = _mm_mul_ps(mtest, mtest); return _mm_cvtss_si32(mtest); ]] ) AS_IF([test x"$OPUS_X86_MAY_HAVE_SSE" = x"1" && test x"$OPUS_X86_PRESUME_SSE" != x"1"], [ OPUS_X86_SSE_CFLAGS="$X86_SSE_CFLAGS" AC_SUBST([OPUS_X86_SSE_CFLAGS]) ] ) OPUS_CHECK_INTRINSICS( [SSE2], [$X86_SSE2_CFLAGS], [OPUS_X86_MAY_HAVE_SSE2], [OPUS_X86_PRESUME_SSE2], [[#include #include ]], [[ __m128i mtest; mtest = _mm_set1_epi32((int)time(NULL)); mtest = _mm_mul_epu32(mtest, mtest); return _mm_cvtsi128_si32(mtest); ]] ) AS_IF([test x"$OPUS_X86_MAY_HAVE_SSE2" = x"1" && test x"$OPUS_X86_PRESUME_SSE2" != x"1"], [ OPUS_X86_SSE2_CFLAGS="$X86_SSE2_CFLAGS" AC_SUBST([OPUS_X86_SSE2_CFLAGS]) ] ) OPUS_CHECK_INTRINSICS( [SSE4.1], [$X86_SSE4_1_CFLAGS], [OPUS_X86_MAY_HAVE_SSE4_1], [OPUS_X86_PRESUME_SSE4_1], [[#include #include ]], [[ __m128i mtest; mtest = _mm_set1_epi32((int)time(NULL)); mtest = _mm_mul_epi32(mtest, mtest); return _mm_cvtsi128_si32(mtest); ]] ) AS_IF([test x"$OPUS_X86_MAY_HAVE_SSE4_1" = x"1" && test x"$OPUS_X86_PRESUME_SSE4_1" != x"1"], [ OPUS_X86_SSE4_1_CFLAGS="$X86_SSE4_1_CFLAGS" AC_SUBST([OPUS_X86_SSE4_1_CFLAGS]) ] ) OPUS_CHECK_INTRINSICS( [AVX], [$X86_AVX_CFLAGS], [OPUS_X86_MAY_HAVE_AVX], [OPUS_X86_PRESUME_AVX], [[#include #include ]], [[ __m256 mtest; mtest = _mm256_set1_ps((float)time(NULL)); mtest = _mm256_addsub_ps(mtest, mtest); return _mm_cvtss_si32(_mm256_extractf128_ps(mtest, 0)); ]] ) AS_IF([test x"$OPUS_X86_MAY_HAVE_AVX" = x"1" && test x"$OPUS_X86_PRESUME_AVX" != x"1"], [ OPUS_X86_AVX_CFLAGS="$X86_AVX_CFLAGS" AC_SUBST([OPUS_X86_AVX_CFLAGS]) ] ) AS_IF([test x"$rtcd_support" = x"no"], [rtcd_support=""]) AS_IF([test x"$OPUS_X86_MAY_HAVE_SSE" = x"1"], [ AC_DEFINE([OPUS_X86_MAY_HAVE_SSE], 1, [Compiler supports X86 SSE Intrinsics]) intrinsics_support="$intrinsics_support SSE" AS_IF([test x"$OPUS_X86_PRESUME_SSE" = x"1"], [AC_DEFINE([OPUS_X86_PRESUME_SSE], 1, [Define if binary requires SSE intrinsics support])], [rtcd_support="$rtcd_support SSE"]) ], [ AC_MSG_WARN([Compiler does not support SSE intrinsics]) ]) AS_IF([test x"$OPUS_X86_MAY_HAVE_SSE2" = x"1"], [ AC_DEFINE([OPUS_X86_MAY_HAVE_SSE2], 1, [Compiler supports X86 SSE2 Intrinsics]) intrinsics_support="$intrinsics_support SSE2" AS_IF([test x"$OPUS_X86_PRESUME_SSE2" = x"1"], [AC_DEFINE([OPUS_X86_PRESUME_SSE2], 1, [Define if binary requires SSE2 intrinsics support])], [rtcd_support="$rtcd_support SSE2"]) ], [ AC_MSG_WARN([Compiler does not support SSE2 intrinsics]) ]) AS_IF([test x"$OPUS_X86_MAY_HAVE_SSE4_1" = x"1"], [ AC_DEFINE([OPUS_X86_MAY_HAVE_SSE4_1], 1, [Compiler supports X86 SSE4.1 Intrinsics]) intrinsics_support="$intrinsics_support SSE4.1" AS_IF([test x"$OPUS_X86_PRESUME_SSE4_1" = x"1"], [AC_DEFINE([OPUS_X86_PRESUME_SSE4_1], 1, [Define if binary requires SSE4.1 intrinsics support])], [rtcd_support="$rtcd_support SSE4.1"]) ], [ AC_MSG_WARN([Compiler does not support SSE4.1 intrinsics]) ]) AS_IF([test x"$OPUS_X86_MAY_HAVE_AVX" = x"1"], [ AC_DEFINE([OPUS_X86_MAY_HAVE_AVX], 1, [Compiler supports X86 AVX Intrinsics]) intrinsics_support="$intrinsics_support AVX" AS_IF([test x"$OPUS_X86_PRESUME_AVX" = x"1"], [AC_DEFINE([OPUS_X86_PRESUME_AVX], 1, [Define if binary requires AVX intrinsics support])], [rtcd_support="$rtcd_support AVX"]) ], [ AC_MSG_WARN([Compiler does not support AVX intrinsics]) ]) AS_IF([test x"$intrinsics_support" = x""], [intrinsics_support=no], [intrinsics_support="x86$intrinsics_support"] ) AS_IF([test x"$rtcd_support" = x""], [rtcd_support=no], [rtcd_support="x86$rtcd_support"], ) AS_IF([test x"$enable_rtcd" = x"yes" && test x"$rtcd_support" != x""],[ get_cpuid_by_asm="no" AC_MSG_CHECKING([How to get X86 CPU Info]) AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #include ]],[[ unsigned int CPUInfo0; unsigned int CPUInfo1; unsigned int CPUInfo2; unsigned int CPUInfo3; unsigned int InfoType; __asm__ __volatile__ ( "cpuid": "=a" (CPUInfo0), "=b" (CPUInfo1), "=c" (CPUInfo2), "=d" (CPUInfo3) : "a" (InfoType), "c" (0) ); ]])], [get_cpuid_by_asm="yes" AC_MSG_RESULT([Inline Assembly]) AC_DEFINE([CPU_INFO_BY_ASM], [1], [Get CPU Info by asm method])], [AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #include ]],[[ unsigned int CPUInfo0; unsigned int CPUInfo1; unsigned int CPUInfo2; unsigned int CPUInfo3; unsigned int InfoType; __get_cpuid(InfoType, &CPUInfo0, &CPUInfo1, &CPUInfo2, &CPUInfo3); ]])], [AC_MSG_RESULT([C method]) AC_DEFINE([CPU_INFO_BY_C], [1], [Get CPU Info by c method])], [AC_MSG_ERROR([no supported Get CPU Info method, please disable run-time CPU capabilities detection or intrinsics])])])]) ], [ AC_MSG_WARN([No intrinsics support for your architecture]) intrinsics_support="no" ]) ], [ intrinsics_support="no" ]) AM_CONDITIONAL([CPU_ARM], [test "$cpu_arm" = "yes"]) AM_CONDITIONAL([HAVE_ARM_NEON_INTR], [test x"$OPUS_ARM_MAY_HAVE_NEON_INTR" = x"1"]) AM_CONDITIONAL([HAVE_ARM_NE10], [test x"$HAVE_ARM_NE10" = x"1"]) AM_CONDITIONAL([HAVE_SSE], [test x"$OPUS_X86_MAY_HAVE_SSE" = x"1"]) AM_CONDITIONAL([HAVE_SSE2], [test x"$OPUS_X86_MAY_HAVE_SSE2" = x"1"]) AM_CONDITIONAL([HAVE_SSE4_1], [test x"$OPUS_X86_MAY_HAVE_SSE4_1" = x"1"]) AM_CONDITIONAL([HAVE_AVX], [test x"$OPUS_X86_MAY_HAVE_AVX" = x"1"]) AS_IF([test x"$enable_rtcd" = x"yes"],[ AS_IF([test x"$rtcd_support" != x"no"],[ AC_DEFINE([OPUS_HAVE_RTCD], [1], [Use run-time CPU capabilities detection]) OPUS_HAVE_RTCD=1 AC_SUBST(OPUS_HAVE_RTCD) ]) ],[ rtcd_support="disabled" ]) AC_ARG_ENABLE([assertions], [AS_HELP_STRING([--enable-assertions],[enable additional software error checking])],, [enable_assertions=no]) AS_IF([test "$enable_assertions" = "yes"], [ AC_DEFINE([ENABLE_ASSERTIONS], [1], [Assertions]) ]) AC_ARG_ENABLE([fuzzing], [AS_HELP_STRING([--enable-fuzzing],[causes the encoder to make random decisions])],, [enable_fuzzing=no]) AS_IF([test "$enable_fuzzing" = "yes"], [ AC_DEFINE([FUZZING], [1], [Fuzzing]) ]) AC_ARG_ENABLE([check-asm], [AS_HELP_STRING([--enable-check-asm], [enable bit-exactness checks between optimized and c implementations])],, [enable_check_asm=no]) AS_IF([test "$enable_check_asm" = "yes"], [ AC_DEFINE([OPUS_CHECK_ASM], [1], [Run bit-exactness checks between optimized and c implementations]) ]) AC_ARG_ENABLE([ambisonics], [AS_HELP_STRING([--enable-ambisonics],[enable experimental ambisonic encoding and decoding support])],, [enable_ambisonics=no]) AS_IF([test "$enable_ambisonics" = "yes"], [ AC_DEFINE([ENABLE_EXPERIMENTAL_AMBISONICS], [1], [Ambisonics Support]) ]) AC_ARG_ENABLE([doc], [AS_HELP_STRING([--disable-doc], [Do not build API documentation])],, [enable_doc=yes]) AS_IF([test "$enable_doc" = "yes"], [ AC_CHECK_PROG(HAVE_DOXYGEN, [doxygen], [yes], [no]) AC_CHECK_PROG(HAVE_DOT, [dot], [yes], [no]) ],[ HAVE_DOXYGEN=no ]) AM_CONDITIONAL([HAVE_DOXYGEN], [test "$HAVE_DOXYGEN" = "yes"]) AC_ARG_ENABLE([extra-programs], [AS_HELP_STRING([--disable-extra-programs], [Do not build extra programs (demo and tests)])],, [enable_extra_programs=yes]) AM_CONDITIONAL([EXTRA_PROGRAMS], [test "$enable_extra_programs" = "yes"]) AC_ARG_ENABLE([update-draft], AS_HELP_STRING([--enable-update-draft], [Enable bitstream changes from draft-ietf-codec-opus-update]),, [enable_update_draft=no]) AS_IF([test "$enable_update_draft" = "yes"], [ AC_DEFINE([ENABLE_UPDATE_DRAFT], [1], [Enable bitstream changes from draft-ietf-codec-opus-update]) ]) saved_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -fvisibility=hidden" AC_MSG_CHECKING([if ${CC} supports -fvisibility=hidden]) AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])], [ AC_MSG_RESULT([yes]) ], [ AC_MSG_RESULT([no]) CFLAGS="$saved_CFLAGS" ]) CFLAGS="$CFLAGS -W" warn_CFLAGS="-Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes" saved_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $warn_CFLAGS" AC_MSG_CHECKING([if ${CC} supports ${warn_CFLAGS}]) AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])], [ AC_MSG_RESULT([yes]) ], [ AC_MSG_RESULT([no]) CFLAGS="$saved_CFLAGS" ]) saved_LIBS="$LIBS" LIBS="$LIBS $LIBM" AC_CHECK_FUNCS([lrintf]) AC_CHECK_FUNCS([lrint]) LIBS="$saved_LIBS" AC_CHECK_FUNCS([__malloc_hook]) AC_SUBST([PC_BUILD]) AC_CONFIG_FILES([ Makefile opus.pc opus-uninstalled.pc celt/arm/armopts.s doc/Makefile doc/Doxyfile ]) AC_CONFIG_HEADERS([config.h]) AC_OUTPUT AC_MSG_NOTICE([ ------------------------------------------------------------------------ $PACKAGE_NAME $PACKAGE_VERSION: Automatic configuration OK. Compiler support: C99 var arrays: ................ ${has_var_arrays} C99 lrintf: .................... ${ac_cv_func_lrintf} Use alloca: .................... ${use_alloca} General configuration: Floating point support: ........ ${enable_float} Fast float approximations: ..... ${enable_float_approx} Fixed point debugging: ......... ${enable_fixed_point_debug} Inline Assembly Optimizations: . ${inline_optimization} External Assembly Optimizations: ${asm_optimization} Intrinsics Optimizations.......: ${intrinsics_support} Run-time CPU detection: ........ ${rtcd_support} Custom modes: .................. ${enable_custom_modes} Assertion checking: ............ ${enable_assertions} Fuzzing: ....................... ${enable_fuzzing} Check ASM: ..................... ${enable_check_asm} Ambisonics support: ............ ${enable_ambisonics} API documentation: ............. ${enable_doc} Extra programs: ................ ${enable_extra_programs} ------------------------------------------------------------------------ Type "make; make install" to compile and install Type "make check" to run the test suite ]) mumble-1.3.4/3rdparty/opus-src/NEWS0000664000175000017500000000000014010707326016650 0ustar builderbuildermumble-1.3.4/3rdparty/opus-src/celt/0000775000175000017500000000000014010707327017113 5ustar builderbuildermumble-1.3.4/3rdparty/opus-src/celt/entdec.c0000664000175000017500000001752014010707327020526 0ustar builderbuilder/* Copyright (c) 2001-2011 Timothy B. Terriberry Copyright (c) 2008-2009 Xiph.Org Foundation */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "os_support.h" #include "arch.h" #include "entdec.h" #include "mfrngcod.h" /*A range decoder. This is an entropy decoder based upon \cite{Mar79}, which is itself a rediscovery of the FIFO arithmetic code introduced by \cite{Pas76}. It is very similar to arithmetic encoding, except that encoding is done with digits in any base, instead of with bits, and so it is faster when using larger bases (i.e.: a byte). The author claims an average waste of $\frac{1}{2}\log_b(2b)$ bits, where $b$ is the base, longer than the theoretical optimum, but to my knowledge there is no published justification for this claim. This only seems true when using near-infinite precision arithmetic so that the process is carried out with no rounding errors. An excellent description of implementation details is available at http://www.arturocampos.com/ac_range.html A recent work \cite{MNW98} which proposes several changes to arithmetic encoding for efficiency actually re-discovers many of the principles behind range encoding, and presents a good theoretical analysis of them. End of stream is handled by writing out the smallest number of bits that ensures that the stream will be correctly decoded regardless of the value of any subsequent bits. ec_tell() can be used to determine how many bits were needed to decode all the symbols thus far; other data can be packed in the remaining bits of the input buffer. @PHDTHESIS{Pas76, author="Richard Clark Pasco", title="Source coding algorithms for fast data compression", school="Dept. of Electrical Engineering, Stanford University", address="Stanford, CA", month=May, year=1976 } @INPROCEEDINGS{Mar79, author="Martin, G.N.N.", title="Range encoding: an algorithm for removing redundancy from a digitised message", booktitle="Video & Data Recording Conference", year=1979, address="Southampton", month=Jul } @ARTICLE{MNW98, author="Alistair Moffat and Radford Neal and Ian H. Witten", title="Arithmetic Coding Revisited", journal="{ACM} Transactions on Information Systems", year=1998, volume=16, number=3, pages="256--294", month=Jul, URL="http://www.stanford.edu/class/ee398a/handouts/papers/Moffat98ArithmCoding.pdf" }*/ static int ec_read_byte(ec_dec *_this){ return _this->offs<_this->storage?_this->buf[_this->offs++]:0; } static int ec_read_byte_from_end(ec_dec *_this){ return _this->end_offs<_this->storage? _this->buf[_this->storage-++(_this->end_offs)]:0; } /*Normalizes the contents of val and rng so that rng lies entirely in the high-order symbol.*/ static void ec_dec_normalize(ec_dec *_this){ /*If the range is too small, rescale it and input some bits.*/ while(_this->rng<=EC_CODE_BOT){ int sym; _this->nbits_total+=EC_SYM_BITS; _this->rng<<=EC_SYM_BITS; /*Use up the remaining bits from our last symbol.*/ sym=_this->rem; /*Read the next value from the input.*/ _this->rem=ec_read_byte(_this); /*Take the rest of the bits we need from this new symbol.*/ sym=(sym<rem)>>(EC_SYM_BITS-EC_CODE_EXTRA); /*And subtract them from val, capped to be less than EC_CODE_TOP.*/ _this->val=((_this->val<buf=_buf; _this->storage=_storage; _this->end_offs=0; _this->end_window=0; _this->nend_bits=0; /*This is the offset from which ec_tell() will subtract partial bits. The final value after the ec_dec_normalize() call will be the same as in the encoder, but we have to compensate for the bits that are added there.*/ _this->nbits_total=EC_CODE_BITS+1 -((EC_CODE_BITS-EC_CODE_EXTRA)/EC_SYM_BITS)*EC_SYM_BITS; _this->offs=0; _this->rng=1U<rem=ec_read_byte(_this); _this->val=_this->rng-1-(_this->rem>>(EC_SYM_BITS-EC_CODE_EXTRA)); _this->error=0; /*Normalize the interval.*/ ec_dec_normalize(_this); } unsigned ec_decode(ec_dec *_this,unsigned _ft){ unsigned s; _this->ext=celt_udiv(_this->rng,_ft); s=(unsigned)(_this->val/_this->ext); return _ft-EC_MINI(s+1,_ft); } unsigned ec_decode_bin(ec_dec *_this,unsigned _bits){ unsigned s; _this->ext=_this->rng>>_bits; s=(unsigned)(_this->val/_this->ext); return (1U<<_bits)-EC_MINI(s+1U,1U<<_bits); } void ec_dec_update(ec_dec *_this,unsigned _fl,unsigned _fh,unsigned _ft){ opus_uint32 s; s=IMUL32(_this->ext,_ft-_fh); _this->val-=s; _this->rng=_fl>0?IMUL32(_this->ext,_fh-_fl):_this->rng-s; ec_dec_normalize(_this); } /*The probability of having a "one" is 1/(1<<_logp).*/ int ec_dec_bit_logp(ec_dec *_this,unsigned _logp){ opus_uint32 r; opus_uint32 d; opus_uint32 s; int ret; r=_this->rng; d=_this->val; s=r>>_logp; ret=dval=d-s; _this->rng=ret?s:r-s; ec_dec_normalize(_this); return ret; } int ec_dec_icdf(ec_dec *_this,const unsigned char *_icdf,unsigned _ftb){ opus_uint32 r; opus_uint32 d; opus_uint32 s; opus_uint32 t; int ret; s=_this->rng; d=_this->val; r=s>>_ftb; ret=-1; do{ t=s; s=IMUL32(r,_icdf[++ret]); } while(dval=d-s; _this->rng=t-s; ec_dec_normalize(_this); return ret; } opus_uint32 ec_dec_uint(ec_dec *_this,opus_uint32 _ft){ unsigned ft; unsigned s; int ftb; /*In order to optimize EC_ILOG(), it is undefined for the value 0.*/ celt_assert(_ft>1); _ft--; ftb=EC_ILOG(_ft); if(ftb>EC_UINT_BITS){ opus_uint32 t; ftb-=EC_UINT_BITS; ft=(unsigned)(_ft>>ftb)+1; s=ec_decode(_this,ft); ec_dec_update(_this,s,s+1,ft); t=(opus_uint32)s<error=1; return _ft; } else{ _ft++; s=ec_decode(_this,(unsigned)_ft); ec_dec_update(_this,s,s+1,(unsigned)_ft); return s; } } opus_uint32 ec_dec_bits(ec_dec *_this,unsigned _bits){ ec_window window; int available; opus_uint32 ret; window=_this->end_window; available=_this->nend_bits; if((unsigned)available<_bits){ do{ window|=(ec_window)ec_read_byte_from_end(_this)<>=_bits; available-=_bits; _this->end_window=window; _this->nend_bits=available; _this->nbits_total+=_bits; return ret; } mumble-1.3.4/3rdparty/opus-src/celt/entcode.c0000664000175000017500000001310414010707327020677 0ustar builderbuilder/* Copyright (c) 2001-2011 Timothy B. Terriberry */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "entcode.h" #include "arch.h" #if !defined(EC_CLZ) /*This is a fallback for systems where we don't know how to access a BSR or CLZ instruction (see ecintrin.h). If you are optimizing Opus on a new platform and it has a native CLZ or BZR (e.g. cell, MIPS, x86, etc) then making it available to Opus will be an easy performance win.*/ int ec_ilog(opus_uint32 _v){ /*On a Pentium M, this branchless version tested as the fastest on 1,000,000,000 random 32-bit integers, edging out a similar version with branches, and a 256-entry LUT version.*/ int ret; int m; ret=!!_v; m=!!(_v&0xFFFF0000)<<4; _v>>=m; ret|=m; m=!!(_v&0xFF00)<<3; _v>>=m; ret|=m; m=!!(_v&0xF0)<<2; _v>>=m; ret|=m; m=!!(_v&0xC)<<1; _v>>=m; ret|=m; ret+=!!(_v&0x2); return ret; } #endif #if 1 /* This is a faster version of ec_tell_frac() that takes advantage of the low (1/8 bit) resolution to use just a linear function followed by a lookup to determine the exact transition thresholds. */ opus_uint32 ec_tell_frac(ec_ctx *_this){ static const unsigned correction[8] = {35733, 38967, 42495, 46340, 50535, 55109, 60097, 65535}; opus_uint32 nbits; opus_uint32 r; int l; unsigned b; nbits=_this->nbits_total<rng); r=_this->rng>>(l-16); b = (r>>12)-8; b += r>correction[b]; l = (l<<3)+b; return nbits-l; } #else opus_uint32 ec_tell_frac(ec_ctx *_this){ opus_uint32 nbits; opus_uint32 r; int l; int i; /*To handle the non-integral number of bits still left in the encoder/decoder state, we compute the worst-case number of bits of val that must be encoded to ensure that the value is inside the range for any possible subsequent bits. The computation here is independent of val itself (the decoder does not even track that value), even though the real number of bits used after ec_enc_done() may be 1 smaller if rng is a power of two and the corresponding trailing bits of val are all zeros. If we did try to track that special case, then coding a value with a probability of 1/(1<nbits_total<rng); r=_this->rng>>(l-16); for(i=BITRES;i-->0;){ int b; r=r*r>>15; b=(int)(r>>16); l=l<<1|b; r>>=b; } return nbits-l; } #endif #ifdef USE_SMALL_DIV_TABLE /* Result of 2^32/(2*i+1), except for i=0. */ const opus_uint32 SMALL_DIV_TABLE[129] = { 0xFFFFFFFF, 0x55555555, 0x33333333, 0x24924924, 0x1C71C71C, 0x1745D174, 0x13B13B13, 0x11111111, 0x0F0F0F0F, 0x0D79435E, 0x0C30C30C, 0x0B21642C, 0x0A3D70A3, 0x097B425E, 0x08D3DCB0, 0x08421084, 0x07C1F07C, 0x07507507, 0x06EB3E45, 0x06906906, 0x063E7063, 0x05F417D0, 0x05B05B05, 0x0572620A, 0x05397829, 0x05050505, 0x04D4873E, 0x04A7904A, 0x047DC11F, 0x0456C797, 0x04325C53, 0x04104104, 0x03F03F03, 0x03D22635, 0x03B5CC0E, 0x039B0AD1, 0x0381C0E0, 0x0369D036, 0x03531DEC, 0x033D91D2, 0x0329161F, 0x03159721, 0x03030303, 0x02F14990, 0x02E05C0B, 0x02D02D02, 0x02C0B02C, 0x02B1DA46, 0x02A3A0FD, 0x0295FAD4, 0x0288DF0C, 0x027C4597, 0x02702702, 0x02647C69, 0x02593F69, 0x024E6A17, 0x0243F6F0, 0x0239E0D5, 0x02302302, 0x0226B902, 0x021D9EAD, 0x0214D021, 0x020C49BA, 0x02040810, 0x01FC07F0, 0x01F44659, 0x01ECC07B, 0x01E573AC, 0x01DE5D6E, 0x01D77B65, 0x01D0CB58, 0x01CA4B30, 0x01C3F8F0, 0x01BDD2B8, 0x01B7D6C3, 0x01B20364, 0x01AC5701, 0x01A6D01A, 0x01A16D3F, 0x019C2D14, 0x01970E4F, 0x01920FB4, 0x018D3018, 0x01886E5F, 0x0183C977, 0x017F405F, 0x017AD220, 0x01767DCE, 0x01724287, 0x016E1F76, 0x016A13CD, 0x01661EC6, 0x01623FA7, 0x015E75BB, 0x015AC056, 0x01571ED3, 0x01539094, 0x01501501, 0x014CAB88, 0x0149539E, 0x01460CBC, 0x0142D662, 0x013FB013, 0x013C995A, 0x013991C2, 0x013698DF, 0x0133AE45, 0x0130D190, 0x012E025C, 0x012B404A, 0x01288B01, 0x0125E227, 0x01234567, 0x0120B470, 0x011E2EF3, 0x011BB4A4, 0x01194538, 0x0116E068, 0x011485F0, 0x0112358E, 0x010FEF01, 0x010DB20A, 0x010B7E6E, 0x010953F3, 0x01073260, 0x0105197F, 0x0103091B, 0x01010101 }; #endif mumble-1.3.4/3rdparty/opus-src/celt/stack_alloc.h0000664000175000017500000001354514010707327021553 0ustar builderbuilder/* Copyright (C) 2002-2003 Jean-Marc Valin Copyright (C) 2007-2009 Xiph.Org Foundation */ /** @file stack_alloc.h @brief Temporary memory allocation on stack */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef STACK_ALLOC_H #define STACK_ALLOC_H #include "opus_types.h" #include "opus_defines.h" #if (!defined (VAR_ARRAYS) && !defined (USE_ALLOCA) && !defined (NONTHREADSAFE_PSEUDOSTACK)) #error "Opus requires one of VAR_ARRAYS, USE_ALLOCA, or NONTHREADSAFE_PSEUDOSTACK be defined to select the temporary allocation mode." #endif #ifdef USE_ALLOCA # ifdef WIN32 # include # else # ifdef HAVE_ALLOCA_H # include # else # include # endif # endif #endif /** * @def ALIGN(stack, size) * * Aligns the stack to a 'size' boundary * * @param stack Stack * @param size New size boundary */ /** * @def PUSH(stack, size, type) * * Allocates 'size' elements of type 'type' on the stack * * @param stack Stack * @param size Number of elements * @param type Type of element */ /** * @def VARDECL(var) * * Declare variable on stack * * @param var Variable to declare */ /** * @def ALLOC(var, size, type) * * Allocate 'size' elements of 'type' on stack * * @param var Name of variable to allocate * @param size Number of elements * @param type Type of element */ #if defined(VAR_ARRAYS) #define VARDECL(type, var) #define ALLOC(var, size, type) type var[size] #define SAVE_STACK #define RESTORE_STACK #define ALLOC_STACK /* C99 does not allow VLAs of size zero */ #define ALLOC_NONE 1 #elif defined(USE_ALLOCA) #define VARDECL(type, var) type *var # ifdef WIN32 # define ALLOC(var, size, type) var = ((type*)_alloca(sizeof(type)*(size))) # else # define ALLOC(var, size, type) var = ((type*)alloca(sizeof(type)*(size))) # endif #define SAVE_STACK #define RESTORE_STACK #define ALLOC_STACK #define ALLOC_NONE 0 #else #ifdef CELT_C char *scratch_ptr=0; char *global_stack=0; #else extern char *global_stack; extern char *scratch_ptr; #endif /* CELT_C */ #ifdef ENABLE_VALGRIND #include #ifdef CELT_C char *global_stack_top=0; #else extern char *global_stack_top; #endif /* CELT_C */ #define ALIGN(stack, size) ((stack) += ((size) - (long)(stack)) & ((size) - 1)) #define PUSH(stack, size, type) (VALGRIND_MAKE_MEM_NOACCESS(stack, global_stack_top-stack),ALIGN((stack),sizeof(type)/sizeof(char)),VALGRIND_MAKE_MEM_UNDEFINED(stack, ((size)*sizeof(type)/sizeof(char))),(stack)+=(2*(size)*sizeof(type)/sizeof(char)),(type*)((stack)-(2*(size)*sizeof(type)/sizeof(char)))) #define RESTORE_STACK ((global_stack = _saved_stack),VALGRIND_MAKE_MEM_NOACCESS(global_stack, global_stack_top-global_stack)) #define ALLOC_STACK char *_saved_stack; ((global_stack = (global_stack==0) ? ((global_stack_top=opus_alloc_scratch(GLOBAL_STACK_SIZE*2)+(GLOBAL_STACK_SIZE*2))-(GLOBAL_STACK_SIZE*2)) : global_stack),VALGRIND_MAKE_MEM_NOACCESS(global_stack, global_stack_top-global_stack)); _saved_stack = global_stack; #else #define ALIGN(stack, size) ((stack) += ((size) - (long)(stack)) & ((size) - 1)) #define PUSH(stack, size, type) (ALIGN((stack),sizeof(type)/sizeof(char)),(stack)+=(size)*(sizeof(type)/sizeof(char)),(type*)((stack)-(size)*(sizeof(type)/sizeof(char)))) #if 0 /* Set this to 1 to instrument pseudostack usage */ #define RESTORE_STACK (printf("%ld %s:%d\n", global_stack-scratch_ptr, __FILE__, __LINE__),global_stack = _saved_stack) #else #define RESTORE_STACK (global_stack = _saved_stack) #endif #define ALLOC_STACK char *_saved_stack; (global_stack = (global_stack==0) ? (scratch_ptr=opus_alloc_scratch(GLOBAL_STACK_SIZE)) : global_stack); _saved_stack = global_stack; #endif /* ENABLE_VALGRIND */ #include "os_support.h" #define VARDECL(type, var) type *var #define ALLOC(var, size, type) var = PUSH(global_stack, size, type) #define SAVE_STACK char *_saved_stack = global_stack; #define ALLOC_NONE 0 #endif /* VAR_ARRAYS */ #ifdef ENABLE_VALGRIND #include #define OPUS_CHECK_ARRAY(ptr, len) VALGRIND_CHECK_MEM_IS_DEFINED(ptr, len*sizeof(*ptr)) #define OPUS_CHECK_VALUE(value) VALGRIND_CHECK_VALUE_IS_DEFINED(value) #define OPUS_CHECK_ARRAY_COND(ptr, len) VALGRIND_CHECK_MEM_IS_DEFINED(ptr, len*sizeof(*ptr)) #define OPUS_CHECK_VALUE_COND(value) VALGRIND_CHECK_VALUE_IS_DEFINED(value) #define OPUS_PRINT_INT(value) do {fprintf(stderr, #value " = %d at %s:%d\n", value, __FILE__, __LINE__);}while(0) #define OPUS_FPRINTF fprintf #else static OPUS_INLINE int _opus_false(void) {return 0;} #define OPUS_CHECK_ARRAY(ptr, len) _opus_false() #define OPUS_CHECK_VALUE(value) _opus_false() #define OPUS_PRINT_INT(value) do{}while(0) #define OPUS_FPRINTF (void) #endif #endif /* STACK_ALLOC_H */ mumble-1.3.4/3rdparty/opus-src/celt/entcode.h0000664000175000017500000001244614010707327020714 0ustar builderbuilder/* Copyright (c) 2001-2011 Timothy B. Terriberry Copyright (c) 2008-2009 Xiph.Org Foundation */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "opus_types.h" #include "opus_defines.h" #if !defined(_entcode_H) # define _entcode_H (1) # include # include # include "ecintrin.h" extern const opus_uint32 SMALL_DIV_TABLE[129]; #ifdef OPUS_ARM_ASM #define USE_SMALL_DIV_TABLE #endif /*OPT: ec_window must be at least 32 bits, but if you have fast arithmetic on a larger type, you can speed up the decoder by using it here.*/ typedef opus_uint32 ec_window; typedef struct ec_ctx ec_ctx; typedef struct ec_ctx ec_enc; typedef struct ec_ctx ec_dec; # define EC_WINDOW_SIZE ((int)sizeof(ec_window)*CHAR_BIT) /*The number of bits to use for the range-coded part of unsigned integers.*/ # define EC_UINT_BITS (8) /*The resolution of fractional-precision bit usage measurements, i.e., 3 => 1/8th bits.*/ # define BITRES 3 /*The entropy encoder/decoder context. We use the same structure for both, so that common functions like ec_tell() can be used on either one.*/ struct ec_ctx{ /*Buffered input/output.*/ unsigned char *buf; /*The size of the buffer.*/ opus_uint32 storage; /*The offset at which the last byte containing raw bits was read/written.*/ opus_uint32 end_offs; /*Bits that will be read from/written at the end.*/ ec_window end_window; /*Number of valid bits in end_window.*/ int nend_bits; /*The total number of whole bits read/written. This does not include partial bits currently in the range coder.*/ int nbits_total; /*The offset at which the next range coder byte will be read/written.*/ opus_uint32 offs; /*The number of values in the current range.*/ opus_uint32 rng; /*In the decoder: the difference between the top of the current range and the input value, minus one. In the encoder: the low end of the current range.*/ opus_uint32 val; /*In the decoder: the saved normalization factor from ec_decode(). In the encoder: the number of oustanding carry propagating symbols.*/ opus_uint32 ext; /*A buffered input/output symbol, awaiting carry propagation.*/ int rem; /*Nonzero if an error occurred.*/ int error; }; static OPUS_INLINE opus_uint32 ec_range_bytes(ec_ctx *_this){ return _this->offs; } static OPUS_INLINE unsigned char *ec_get_buffer(ec_ctx *_this){ return _this->buf; } static OPUS_INLINE int ec_get_error(ec_ctx *_this){ return _this->error; } /*Returns the number of bits "used" by the encoded or decoded symbols so far. This same number can be computed in either the encoder or the decoder, and is suitable for making coding decisions. Return: The number of bits. This will always be slightly larger than the exact value (e.g., all rounding error is in the positive direction).*/ static OPUS_INLINE int ec_tell(ec_ctx *_this){ return _this->nbits_total-EC_ILOG(_this->rng); } /*Returns the number of bits "used" by the encoded or decoded symbols so far. This same number can be computed in either the encoder or the decoder, and is suitable for making coding decisions. Return: The number of bits scaled by 2**BITRES. This will always be slightly larger than the exact value (e.g., all rounding error is in the positive direction).*/ opus_uint32 ec_tell_frac(ec_ctx *_this); /* Tested exhaustively for all n and for 1<=d<=256 */ static OPUS_INLINE opus_uint32 celt_udiv(opus_uint32 n, opus_uint32 d) { celt_assert(d>0); #ifdef USE_SMALL_DIV_TABLE if (d>256) return n/d; else { opus_uint32 t, q; t = EC_ILOG(d&-d); q = (opus_uint64)SMALL_DIV_TABLE[d>>t]*(n>>(t-1))>>32; return q+(n-q*d >= d); } #else return n/d; #endif } static OPUS_INLINE opus_int32 celt_sudiv(opus_int32 n, opus_int32 d) { celt_assert(d>0); #ifdef USE_SMALL_DIV_TABLE if (n<0) return -(opus_int32)celt_udiv(-n, d); else return celt_udiv(n, d); #else return n/d; #endif } #endif mumble-1.3.4/3rdparty/opus-src/celt/arm/0000775000175000017500000000000014010707326017671 5ustar builderbuildermumble-1.3.4/3rdparty/opus-src/celt/arm/celt_ne10_mdct.c0000664000175000017500000001766614010707326022636 0ustar builderbuilder/* Copyright (c) 2015 Xiph.Org Foundation Written by Viswanath Puttagunta */ /** @file celt_ne10_mdct.c @brief ARM Neon optimizations for mdct using NE10 library */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef SKIP_CONFIG_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #endif #include "kiss_fft.h" #include "_kiss_fft_guts.h" #include "mdct.h" #include "stack_alloc.h" void clt_mdct_forward_neon(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar * OPUS_RESTRICT out, const opus_val16 *window, int overlap, int shift, int stride, int arch) { int i; int N, N2, N4; VARDECL(kiss_fft_scalar, f); VARDECL(kiss_fft_cpx, f2); const kiss_fft_state *st = l->kfft[shift]; const kiss_twiddle_scalar *trig; SAVE_STACK; N = l->n; trig = l->trig; for (i=0;i>= 1; trig += N; } N2 = N>>1; N4 = N>>2; ALLOC(f, N2, kiss_fft_scalar); ALLOC(f2, N4, kiss_fft_cpx); /* Consider the input to be composed of four blocks: [a, b, c, d] */ /* Window, shuffle, fold */ { /* Temp pointers to make it really clear to the compiler what we're doing */ const kiss_fft_scalar * OPUS_RESTRICT xp1 = in+(overlap>>1); const kiss_fft_scalar * OPUS_RESTRICT xp2 = in+N2-1+(overlap>>1); kiss_fft_scalar * OPUS_RESTRICT yp = f; const opus_val16 * OPUS_RESTRICT wp1 = window+(overlap>>1); const opus_val16 * OPUS_RESTRICT wp2 = window+(overlap>>1)-1; for(i=0;i<((overlap+3)>>2);i++) { /* Real part arranged as -d-cR, Imag part arranged as -b+aR*/ *yp++ = MULT16_32_Q15(*wp2, xp1[N2]) + MULT16_32_Q15(*wp1,*xp2); *yp++ = MULT16_32_Q15(*wp1, *xp1) - MULT16_32_Q15(*wp2, xp2[-N2]); xp1+=2; xp2-=2; wp1+=2; wp2-=2; } wp1 = window; wp2 = window+overlap-1; for(;i>2);i++) { /* Real part arranged as a-bR, Imag part arranged as -c-dR */ *yp++ = *xp2; *yp++ = *xp1; xp1+=2; xp2-=2; } for(;ii,t[N4+i]) - S_MUL(fp->r,t[i]); yi = S_MUL(fp->r,t[N4+i]) + S_MUL(fp->i,t[i]); *yp1 = yr; *yp2 = yi; fp++; yp1 += 2*stride; yp2 -= 2*stride; } } RESTORE_STACK; } void clt_mdct_backward_neon(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar * OPUS_RESTRICT out, const opus_val16 * OPUS_RESTRICT window, int overlap, int shift, int stride, int arch) { int i; int N, N2, N4; VARDECL(kiss_fft_scalar, f); const kiss_twiddle_scalar *trig; const kiss_fft_state *st = l->kfft[shift]; N = l->n; trig = l->trig; for (i=0;i>= 1; trig += N; } N2 = N>>1; N4 = N>>2; ALLOC(f, N2, kiss_fft_scalar); /* Pre-rotate */ { /* Temp pointers to make it really clear to the compiler what we're doing */ const kiss_fft_scalar * OPUS_RESTRICT xp1 = in; const kiss_fft_scalar * OPUS_RESTRICT xp2 = in+stride*(N2-1); kiss_fft_scalar * OPUS_RESTRICT yp = f; const kiss_twiddle_scalar * OPUS_RESTRICT t = &trig[0]; for(i=0;i>1)), arch); /* Post-rotate and de-shuffle from both ends of the buffer at once to make it in-place. */ { kiss_fft_scalar * yp0 = out+(overlap>>1); kiss_fft_scalar * yp1 = out+(overlap>>1)+N2-2; const kiss_twiddle_scalar *t = &trig[0]; /* Loop to (N4+1)>>1 to handle odd N4. When N4 is odd, the middle pair will be computed twice. */ for(i=0;i<(N4+1)>>1;i++) { kiss_fft_scalar re, im, yr, yi; kiss_twiddle_scalar t0, t1; re = yp0[0]; im = yp0[1]; t0 = t[i]; t1 = t[N4+i]; /* We'd scale up by 2 here, but instead it's done when mixing the windows */ yr = S_MUL(re,t0) + S_MUL(im,t1); yi = S_MUL(re,t1) - S_MUL(im,t0); re = yp1[0]; im = yp1[1]; yp0[0] = yr; yp1[1] = yi; t0 = t[(N4-i-1)]; t1 = t[(N2-i-1)]; /* We'd scale up by 2 here, but instead it's done when mixing the windows */ yr = S_MUL(re,t0) + S_MUL(im,t1); yi = S_MUL(re,t1) - S_MUL(im,t0); yp1[0] = yr; yp0[1] = yi; yp0 += 2; yp1 -= 2; } } /* Mirror on both sides for TDAC */ { kiss_fft_scalar * OPUS_RESTRICT xp1 = out+overlap-1; kiss_fft_scalar * OPUS_RESTRICT yp1 = out; const opus_val16 * OPUS_RESTRICT wp1 = window; const opus_val16 * OPUS_RESTRICT wp2 = window+overlap-1; for(i = 0; i < overlap/2; i++) { kiss_fft_scalar x1, x2; x1 = *xp1; x2 = *yp1; *yp1++ = MULT16_32_Q15(*wp2, x2) - MULT16_32_Q15(*wp1, x1); *xp1-- = MULT16_32_Q15(*wp1, x2) + MULT16_32_Q15(*wp2, x1); wp1++; wp2--; } } RESTORE_STACK; } mumble-1.3.4/3rdparty/opus-src/celt/arm/armcpu.h0000664000175000017500000000466114010707326021340 0ustar builderbuilder/* Copyright (c) 2010 Xiph.Org Foundation * Copyright (c) 2013 Parrot */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if !defined(ARMCPU_H) # define ARMCPU_H # if defined(OPUS_ARM_MAY_HAVE_EDSP) # define MAY_HAVE_EDSP(name) name ## _edsp # else # define MAY_HAVE_EDSP(name) name ## _c # endif # if defined(OPUS_ARM_MAY_HAVE_MEDIA) # define MAY_HAVE_MEDIA(name) name ## _media # else # define MAY_HAVE_MEDIA(name) MAY_HAVE_EDSP(name) # endif # if defined(OPUS_ARM_MAY_HAVE_NEON) # define MAY_HAVE_NEON(name) name ## _neon # else # define MAY_HAVE_NEON(name) MAY_HAVE_MEDIA(name) # endif # if defined(OPUS_ARM_PRESUME_EDSP) # define PRESUME_EDSP(name) name ## _edsp # else # define PRESUME_EDSP(name) name ## _c # endif # if defined(OPUS_ARM_PRESUME_MEDIA) # define PRESUME_MEDIA(name) name ## _media # else # define PRESUME_MEDIA(name) PRESUME_EDSP(name) # endif # if defined(OPUS_ARM_PRESUME_NEON) # define PRESUME_NEON(name) name ## _neon # else # define PRESUME_NEON(name) PRESUME_MEDIA(name) # endif # if defined(OPUS_HAVE_RTCD) int opus_select_arch(void); #define OPUS_ARCH_ARM_V4 (0) #define OPUS_ARCH_ARM_EDSP (1) #define OPUS_ARCH_ARM_MEDIA (2) #define OPUS_ARCH_ARM_NEON (3) # endif #endif mumble-1.3.4/3rdparty/opus-src/celt/arm/fixed_armv5e.h0000664000175000017500000001027414010707326022424 0ustar builderbuilder/* Copyright (C) 2007-2009 Xiph.Org Foundation Copyright (C) 2003-2008 Jean-Marc Valin Copyright (C) 2007-2008 CSIRO Copyright (C) 2013 Parrot */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef FIXED_ARMv5E_H #define FIXED_ARMv5E_H #include "fixed_armv4.h" /** 16x32 multiplication, followed by a 16-bit shift right. Results fits in 32 bits */ #undef MULT16_32_Q16 static OPUS_INLINE opus_val32 MULT16_32_Q16_armv5e(opus_val16 a, opus_val32 b) { int res; __asm__( "#MULT16_32_Q16\n\t" "smulwb %0, %1, %2\n\t" : "=r"(res) : "r"(b),"r"(a) ); return res; } #define MULT16_32_Q16(a, b) (MULT16_32_Q16_armv5e(a, b)) /** 16x32 multiplication, followed by a 15-bit shift right. Results fits in 32 bits */ #undef MULT16_32_Q15 static OPUS_INLINE opus_val32 MULT16_32_Q15_armv5e(opus_val16 a, opus_val32 b) { int res; __asm__( "#MULT16_32_Q15\n\t" "smulwb %0, %1, %2\n\t" : "=r"(res) : "r"(b), "r"(a) ); return SHL32(res,1); } #define MULT16_32_Q15(a, b) (MULT16_32_Q15_armv5e(a, b)) /** 16x32 multiply, followed by a 15-bit shift right and 32-bit add. b must fit in 31 bits. Result fits in 32 bits. */ #undef MAC16_32_Q15 static OPUS_INLINE opus_val32 MAC16_32_Q15_armv5e(opus_val32 c, opus_val16 a, opus_val32 b) { int res; __asm__( "#MAC16_32_Q15\n\t" "smlawb %0, %1, %2, %3;\n" : "=r"(res) : "r"(SHL32(b,1)), "r"(a), "r"(c) ); return res; } #define MAC16_32_Q15(c, a, b) (MAC16_32_Q15_armv5e(c, a, b)) /** 16x32 multiply, followed by a 16-bit shift right and 32-bit add. Result fits in 32 bits. */ #undef MAC16_32_Q16 static OPUS_INLINE opus_val32 MAC16_32_Q16_armv5e(opus_val32 c, opus_val16 a, opus_val32 b) { int res; __asm__( "#MAC16_32_Q16\n\t" "smlawb %0, %1, %2, %3;\n" : "=r"(res) : "r"(b), "r"(a), "r"(c) ); return res; } #define MAC16_32_Q16(c, a, b) (MAC16_32_Q16_armv5e(c, a, b)) /** 16x16 multiply-add where the result fits in 32 bits */ #undef MAC16_16 static OPUS_INLINE opus_val32 MAC16_16_armv5e(opus_val32 c, opus_val16 a, opus_val16 b) { int res; __asm__( "#MAC16_16\n\t" "smlabb %0, %1, %2, %3;\n" : "=r"(res) : "r"(a), "r"(b), "r"(c) ); return res; } #define MAC16_16(c, a, b) (MAC16_16_armv5e(c, a, b)) /** 16x16 multiplication where the result fits in 32 bits */ #undef MULT16_16 static OPUS_INLINE opus_val32 MULT16_16_armv5e(opus_val16 a, opus_val16 b) { int res; __asm__( "#MULT16_16\n\t" "smulbb %0, %1, %2;\n" : "=r"(res) : "r"(a), "r"(b) ); return res; } #define MULT16_16(a, b) (MULT16_16_armv5e(a, b)) #ifdef OPUS_ARM_INLINE_MEDIA #undef SIG2WORD16 static OPUS_INLINE opus_val16 SIG2WORD16_armv6(opus_val32 x) { celt_sig res; __asm__( "#SIG2WORD16\n\t" "ssat %0, #16, %1, ASR #12\n\t" : "=r"(res) : "r"(x+2048) ); return EXTRACT16(res); } #define SIG2WORD16(x) (SIG2WORD16_armv6(x)) #endif /* OPUS_ARM_INLINE_MEDIA */ #endif mumble-1.3.4/3rdparty/opus-src/celt/arm/celt_ne10_fft.c0000664000175000017500000001310714010707326022450 0ustar builderbuilder/* Copyright (c) 2015 Xiph.Org Foundation Written by Viswanath Puttagunta */ /** @file celt_ne10_fft.c @brief ARM Neon optimizations for fft using NE10 library */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef SKIP_CONFIG_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #endif #include #include "os_support.h" #include "kiss_fft.h" #include "stack_alloc.h" #if !defined(FIXED_POINT) # define NE10_FFT_ALLOC_C2C_TYPE_NEON ne10_fft_alloc_c2c_float32_neon # define NE10_FFT_CFG_TYPE_T ne10_fft_cfg_float32_t # define NE10_FFT_STATE_TYPE_T ne10_fft_state_float32_t # define NE10_FFT_DESTROY_C2C_TYPE ne10_fft_destroy_c2c_float32 # define NE10_FFT_CPX_TYPE_T ne10_fft_cpx_float32_t # define NE10_FFT_C2C_1D_TYPE_NEON ne10_fft_c2c_1d_float32_neon #else # define NE10_FFT_ALLOC_C2C_TYPE_NEON(nfft) ne10_fft_alloc_c2c_int32_neon(nfft) # define NE10_FFT_CFG_TYPE_T ne10_fft_cfg_int32_t # define NE10_FFT_STATE_TYPE_T ne10_fft_state_int32_t # define NE10_FFT_DESTROY_C2C_TYPE ne10_fft_destroy_c2c_int32 # define NE10_FFT_DESTROY_C2C_TYPE ne10_fft_destroy_c2c_int32 # define NE10_FFT_CPX_TYPE_T ne10_fft_cpx_int32_t # define NE10_FFT_C2C_1D_TYPE_NEON ne10_fft_c2c_1d_int32_neon #endif #if defined(CUSTOM_MODES) /* nfft lengths in NE10 that support scaled fft */ # define NE10_FFTSCALED_SUPPORT_MAX 4 static const int ne10_fft_scaled_support[NE10_FFTSCALED_SUPPORT_MAX] = { 480, 240, 120, 60 }; int opus_fft_alloc_arm_neon(kiss_fft_state *st) { int i; size_t memneeded = sizeof(struct arch_fft_state); st->arch_fft = (arch_fft_state *)opus_alloc(memneeded); if (!st->arch_fft) return -1; for (i = 0; i < NE10_FFTSCALED_SUPPORT_MAX; i++) { if(st->nfft == ne10_fft_scaled_support[i]) break; } if (i == NE10_FFTSCALED_SUPPORT_MAX) { /* This nfft length (scaled fft) is not supported in NE10 */ st->arch_fft->is_supported = 0; st->arch_fft->priv = NULL; } else { st->arch_fft->is_supported = 1; st->arch_fft->priv = (void *)NE10_FFT_ALLOC_C2C_TYPE_NEON(st->nfft); if (st->arch_fft->priv == NULL) { return -1; } } return 0; } void opus_fft_free_arm_neon(kiss_fft_state *st) { NE10_FFT_CFG_TYPE_T cfg; if (!st->arch_fft) return; cfg = (NE10_FFT_CFG_TYPE_T)st->arch_fft->priv; if (cfg) NE10_FFT_DESTROY_C2C_TYPE(cfg); opus_free(st->arch_fft); } #endif void opus_fft_neon(const kiss_fft_state *st, const kiss_fft_cpx *fin, kiss_fft_cpx *fout) { NE10_FFT_STATE_TYPE_T state; NE10_FFT_CFG_TYPE_T cfg = &state; VARDECL(NE10_FFT_CPX_TYPE_T, buffer); SAVE_STACK; ALLOC(buffer, st->nfft, NE10_FFT_CPX_TYPE_T); if (!st->arch_fft->is_supported) { /* This nfft length (scaled fft) not supported in NE10 */ opus_fft_c(st, fin, fout); } else { memcpy((void *)cfg, st->arch_fft->priv, sizeof(NE10_FFT_STATE_TYPE_T)); state.buffer = (NE10_FFT_CPX_TYPE_T *)&buffer[0]; #if !defined(FIXED_POINT) state.is_forward_scaled = 1; NE10_FFT_C2C_1D_TYPE_NEON((NE10_FFT_CPX_TYPE_T *)fout, (NE10_FFT_CPX_TYPE_T *)fin, cfg, 0); #else NE10_FFT_C2C_1D_TYPE_NEON((NE10_FFT_CPX_TYPE_T *)fout, (NE10_FFT_CPX_TYPE_T *)fin, cfg, 0, 1); #endif } RESTORE_STACK; } void opus_ifft_neon(const kiss_fft_state *st, const kiss_fft_cpx *fin, kiss_fft_cpx *fout) { NE10_FFT_STATE_TYPE_T state; NE10_FFT_CFG_TYPE_T cfg = &state; VARDECL(NE10_FFT_CPX_TYPE_T, buffer); SAVE_STACK; ALLOC(buffer, st->nfft, NE10_FFT_CPX_TYPE_T); if (!st->arch_fft->is_supported) { /* This nfft length (scaled fft) not supported in NE10 */ opus_ifft_c(st, fin, fout); } else { memcpy((void *)cfg, st->arch_fft->priv, sizeof(NE10_FFT_STATE_TYPE_T)); state.buffer = (NE10_FFT_CPX_TYPE_T *)&buffer[0]; #if !defined(FIXED_POINT) state.is_backward_scaled = 0; NE10_FFT_C2C_1D_TYPE_NEON((NE10_FFT_CPX_TYPE_T *)fout, (NE10_FFT_CPX_TYPE_T *)fin, cfg, 1); #else NE10_FFT_C2C_1D_TYPE_NEON((NE10_FFT_CPX_TYPE_T *)fout, (NE10_FFT_CPX_TYPE_T *)fin, cfg, 1, 0); #endif } RESTORE_STACK; } mumble-1.3.4/3rdparty/opus-src/celt/arm/pitch_neon_intr.c0000664000175000017500000002425314010707326023225 0ustar builderbuilder/*********************************************************************** Copyright (c) 2017 Google Inc. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "pitch.h" #ifdef FIXED_POINT opus_val32 celt_inner_prod_neon(const opus_val16 *x, const opus_val16 *y, int N) { int i; opus_val32 xy; int16x8_t x_s16x8, y_s16x8; int32x4_t xy_s32x4 = vdupq_n_s32(0); int64x2_t xy_s64x2; int64x1_t xy_s64x1; for (i = 0; i < N - 7; i += 8) { x_s16x8 = vld1q_s16(&x[i]); y_s16x8 = vld1q_s16(&y[i]); xy_s32x4 = vmlal_s16(xy_s32x4, vget_low_s16 (x_s16x8), vget_low_s16 (y_s16x8)); xy_s32x4 = vmlal_s16(xy_s32x4, vget_high_s16(x_s16x8), vget_high_s16(y_s16x8)); } if (N - i >= 4) { const int16x4_t x_s16x4 = vld1_s16(&x[i]); const int16x4_t y_s16x4 = vld1_s16(&y[i]); xy_s32x4 = vmlal_s16(xy_s32x4, x_s16x4, y_s16x4); i += 4; } xy_s64x2 = vpaddlq_s32(xy_s32x4); xy_s64x1 = vadd_s64(vget_low_s64(xy_s64x2), vget_high_s64(xy_s64x2)); xy = vget_lane_s32(vreinterpret_s32_s64(xy_s64x1), 0); for (; i < N; i++) { xy = MAC16_16(xy, x[i], y[i]); } #ifdef OPUS_CHECK_ASM celt_assert(celt_inner_prod_c(x, y, N) == xy); #endif return xy; } void dual_inner_prod_neon(const opus_val16 *x, const opus_val16 *y01, const opus_val16 *y02, int N, opus_val32 *xy1, opus_val32 *xy2) { int i; opus_val32 xy01, xy02; int16x8_t x_s16x8, y01_s16x8, y02_s16x8; int32x4_t xy01_s32x4 = vdupq_n_s32(0); int32x4_t xy02_s32x4 = vdupq_n_s32(0); int64x2_t xy01_s64x2, xy02_s64x2; int64x1_t xy01_s64x1, xy02_s64x1; for (i = 0; i < N - 7; i += 8) { x_s16x8 = vld1q_s16(&x[i]); y01_s16x8 = vld1q_s16(&y01[i]); y02_s16x8 = vld1q_s16(&y02[i]); xy01_s32x4 = vmlal_s16(xy01_s32x4, vget_low_s16 (x_s16x8), vget_low_s16 (y01_s16x8)); xy02_s32x4 = vmlal_s16(xy02_s32x4, vget_low_s16 (x_s16x8), vget_low_s16 (y02_s16x8)); xy01_s32x4 = vmlal_s16(xy01_s32x4, vget_high_s16(x_s16x8), vget_high_s16(y01_s16x8)); xy02_s32x4 = vmlal_s16(xy02_s32x4, vget_high_s16(x_s16x8), vget_high_s16(y02_s16x8)); } if (N - i >= 4) { const int16x4_t x_s16x4 = vld1_s16(&x[i]); const int16x4_t y01_s16x4 = vld1_s16(&y01[i]); const int16x4_t y02_s16x4 = vld1_s16(&y02[i]); xy01_s32x4 = vmlal_s16(xy01_s32x4, x_s16x4, y01_s16x4); xy02_s32x4 = vmlal_s16(xy02_s32x4, x_s16x4, y02_s16x4); i += 4; } xy01_s64x2 = vpaddlq_s32(xy01_s32x4); xy02_s64x2 = vpaddlq_s32(xy02_s32x4); xy01_s64x1 = vadd_s64(vget_low_s64(xy01_s64x2), vget_high_s64(xy01_s64x2)); xy02_s64x1 = vadd_s64(vget_low_s64(xy02_s64x2), vget_high_s64(xy02_s64x2)); xy01 = vget_lane_s32(vreinterpret_s32_s64(xy01_s64x1), 0); xy02 = vget_lane_s32(vreinterpret_s32_s64(xy02_s64x1), 0); for (; i < N; i++) { xy01 = MAC16_16(xy01, x[i], y01[i]); xy02 = MAC16_16(xy02, x[i], y02[i]); } *xy1 = xy01; *xy2 = xy02; #ifdef OPUS_CHECK_ASM { opus_val32 xy1_c, xy2_c; dual_inner_prod_c(x, y01, y02, N, &xy1_c, &xy2_c); celt_assert(xy1_c == *xy1); celt_assert(xy2_c == *xy2); } #endif } #else /* !FIXED_POINT */ /* ========================================================================== */ #ifdef OPUS_CHECK_ASM /* This part of code simulates floating-point NEON operations. */ /* celt_inner_prod_neon_float_c_simulation() simulates the floating-point */ /* operations of celt_inner_prod_neon(), and both functions should have bit */ /* exact output. */ static opus_val32 celt_inner_prod_neon_float_c_simulation(const opus_val16 *x, const opus_val16 *y, int N) { int i; opus_val32 xy, xy0 = 0, xy1 = 0, xy2 = 0, xy3 = 0; for (i = 0; i < N - 3; i += 4) { xy0 = MAC16_16(xy0, x[i + 0], y[i + 0]); xy1 = MAC16_16(xy1, x[i + 1], y[i + 1]); xy2 = MAC16_16(xy2, x[i + 2], y[i + 2]); xy3 = MAC16_16(xy3, x[i + 3], y[i + 3]); } xy0 += xy2; xy1 += xy3; xy = xy0 + xy1; for (; i < N; i++) { xy = MAC16_16(xy, x[i], y[i]); } return xy; } /* dual_inner_prod_neon_float_c_simulation() simulates the floating-point */ /* operations of dual_inner_prod_neon(), and both functions should have bit */ /* exact output. */ static void dual_inner_prod_neon_float_c_simulation(const opus_val16 *x, const opus_val16 *y01, const opus_val16 *y02, int N, opus_val32 *xy1, opus_val32 *xy2) { int i; opus_val32 xy01, xy02, xy01_0 = 0, xy01_1 = 0, xy01_2 = 0, xy01_3 = 0, xy02_0 = 0, xy02_1 = 0, xy02_2 = 0, xy02_3 = 0; for (i = 0; i < N - 3; i += 4) { xy01_0 = MAC16_16(xy01_0, x[i + 0], y01[i + 0]); xy01_1 = MAC16_16(xy01_1, x[i + 1], y01[i + 1]); xy01_2 = MAC16_16(xy01_2, x[i + 2], y01[i + 2]); xy01_3 = MAC16_16(xy01_3, x[i + 3], y01[i + 3]); xy02_0 = MAC16_16(xy02_0, x[i + 0], y02[i + 0]); xy02_1 = MAC16_16(xy02_1, x[i + 1], y02[i + 1]); xy02_2 = MAC16_16(xy02_2, x[i + 2], y02[i + 2]); xy02_3 = MAC16_16(xy02_3, x[i + 3], y02[i + 3]); } xy01_0 += xy01_2; xy02_0 += xy02_2; xy01_1 += xy01_3; xy02_1 += xy02_3; xy01 = xy01_0 + xy01_1; xy02 = xy02_0 + xy02_1; for (; i < N; i++) { xy01 = MAC16_16(xy01, x[i], y01[i]); xy02 = MAC16_16(xy02, x[i], y02[i]); } *xy1 = xy01; *xy2 = xy02; } #endif /* OPUS_CHECK_ASM */ /* ========================================================================== */ opus_val32 celt_inner_prod_neon(const opus_val16 *x, const opus_val16 *y, int N) { int i; opus_val32 xy; float32x4_t xy_f32x4 = vdupq_n_f32(0); float32x2_t xy_f32x2; for (i = 0; i < N - 7; i += 8) { float32x4_t x_f32x4, y_f32x4; x_f32x4 = vld1q_f32(&x[i]); y_f32x4 = vld1q_f32(&y[i]); xy_f32x4 = vmlaq_f32(xy_f32x4, x_f32x4, y_f32x4); x_f32x4 = vld1q_f32(&x[i + 4]); y_f32x4 = vld1q_f32(&y[i + 4]); xy_f32x4 = vmlaq_f32(xy_f32x4, x_f32x4, y_f32x4); } if (N - i >= 4) { const float32x4_t x_f32x4 = vld1q_f32(&x[i]); const float32x4_t y_f32x4 = vld1q_f32(&y[i]); xy_f32x4 = vmlaq_f32(xy_f32x4, x_f32x4, y_f32x4); i += 4; } xy_f32x2 = vadd_f32(vget_low_f32(xy_f32x4), vget_high_f32(xy_f32x4)); xy_f32x2 = vpadd_f32(xy_f32x2, xy_f32x2); xy = vget_lane_f32(xy_f32x2, 0); for (; i < N; i++) { xy = MAC16_16(xy, x[i], y[i]); } #ifdef OPUS_CHECK_ASM celt_assert(ABS32(celt_inner_prod_neon_float_c_simulation(x, y, N) - xy) <= VERY_SMALL); #endif return xy; } void dual_inner_prod_neon(const opus_val16 *x, const opus_val16 *y01, const opus_val16 *y02, int N, opus_val32 *xy1, opus_val32 *xy2) { int i; opus_val32 xy01, xy02; float32x4_t xy01_f32x4 = vdupq_n_f32(0); float32x4_t xy02_f32x4 = vdupq_n_f32(0); float32x2_t xy01_f32x2, xy02_f32x2; for (i = 0; i < N - 7; i += 8) { float32x4_t x_f32x4, y01_f32x4, y02_f32x4; x_f32x4 = vld1q_f32(&x[i]); y01_f32x4 = vld1q_f32(&y01[i]); y02_f32x4 = vld1q_f32(&y02[i]); xy01_f32x4 = vmlaq_f32(xy01_f32x4, x_f32x4, y01_f32x4); xy02_f32x4 = vmlaq_f32(xy02_f32x4, x_f32x4, y02_f32x4); x_f32x4 = vld1q_f32(&x[i + 4]); y01_f32x4 = vld1q_f32(&y01[i + 4]); y02_f32x4 = vld1q_f32(&y02[i + 4]); xy01_f32x4 = vmlaq_f32(xy01_f32x4, x_f32x4, y01_f32x4); xy02_f32x4 = vmlaq_f32(xy02_f32x4, x_f32x4, y02_f32x4); } if (N - i >= 4) { const float32x4_t x_f32x4 = vld1q_f32(&x[i]); const float32x4_t y01_f32x4 = vld1q_f32(&y01[i]); const float32x4_t y02_f32x4 = vld1q_f32(&y02[i]); xy01_f32x4 = vmlaq_f32(xy01_f32x4, x_f32x4, y01_f32x4); xy02_f32x4 = vmlaq_f32(xy02_f32x4, x_f32x4, y02_f32x4); i += 4; } xy01_f32x2 = vadd_f32(vget_low_f32(xy01_f32x4), vget_high_f32(xy01_f32x4)); xy02_f32x2 = vadd_f32(vget_low_f32(xy02_f32x4), vget_high_f32(xy02_f32x4)); xy01_f32x2 = vpadd_f32(xy01_f32x2, xy01_f32x2); xy02_f32x2 = vpadd_f32(xy02_f32x2, xy02_f32x2); xy01 = vget_lane_f32(xy01_f32x2, 0); xy02 = vget_lane_f32(xy02_f32x2, 0); for (; i < N; i++) { xy01 = MAC16_16(xy01, x[i], y01[i]); xy02 = MAC16_16(xy02, x[i], y02[i]); } *xy1 = xy01; *xy2 = xy02; #ifdef OPUS_CHECK_ASM { opus_val32 xy1_c, xy2_c; dual_inner_prod_neon_float_c_simulation(x, y01, y02, N, &xy1_c, &xy2_c); celt_assert(ABS32(xy1_c - *xy1) <= VERY_SMALL); celt_assert(ABS32(xy2_c - *xy2) <= VERY_SMALL); } #endif } #endif /* FIXED_POINT */ mumble-1.3.4/3rdparty/opus-src/celt/arm/kiss_fft_armv5e.h0000664000175000017500000001000514010707326023125 0ustar builderbuilder/*Copyright (c) 2013, Xiph.Org Foundation and contributors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.*/ #ifndef KISS_FFT_ARMv5E_H #define KISS_FFT_ARMv5E_H #if !defined(KISS_FFT_GUTS_H) #error "This file should only be included from _kiss_fft_guts.h" #endif #ifdef FIXED_POINT #if defined(__thumb__)||defined(__thumb2__) #define LDRD_CONS "Q" #else #define LDRD_CONS "Uq" #endif #undef C_MUL #define C_MUL(m,a,b) \ do{ \ int mr1__; \ int mr2__; \ int mi__; \ long long aval__; \ int bval__; \ __asm__( \ "#C_MUL\n\t" \ "ldrd %[aval], %H[aval], %[ap]\n\t" \ "ldr %[bval], %[bp]\n\t" \ "smulwb %[mi], %H[aval], %[bval]\n\t" \ "smulwb %[mr1], %[aval], %[bval]\n\t" \ "smulwt %[mr2], %H[aval], %[bval]\n\t" \ "smlawt %[mi], %[aval], %[bval], %[mi]\n\t" \ : [mr1]"=r"(mr1__), [mr2]"=r"(mr2__), [mi]"=r"(mi__), \ [aval]"=&r"(aval__), [bval]"=r"(bval__) \ : [ap]LDRD_CONS(a), [bp]"m"(b) \ ); \ (m).r = SHL32(SUB32(mr1__, mr2__), 1); \ (m).i = SHL32(mi__, 1); \ } \ while(0) #undef C_MUL4 #define C_MUL4(m,a,b) \ do{ \ int mr1__; \ int mr2__; \ int mi__; \ long long aval__; \ int bval__; \ __asm__( \ "#C_MUL4\n\t" \ "ldrd %[aval], %H[aval], %[ap]\n\t" \ "ldr %[bval], %[bp]\n\t" \ "smulwb %[mi], %H[aval], %[bval]\n\t" \ "smulwb %[mr1], %[aval], %[bval]\n\t" \ "smulwt %[mr2], %H[aval], %[bval]\n\t" \ "smlawt %[mi], %[aval], %[bval], %[mi]\n\t" \ : [mr1]"=r"(mr1__), [mr2]"=r"(mr2__), [mi]"=r"(mi__), \ [aval]"=&r"(aval__), [bval]"=r"(bval__) \ : [ap]LDRD_CONS(a), [bp]"m"(b) \ ); \ (m).r = SHR32(SUB32(mr1__, mr2__), 1); \ (m).i = SHR32(mi__, 1); \ } \ while(0) #undef C_MULC #define C_MULC(m,a,b) \ do{ \ int mr__; \ int mi1__; \ int mi2__; \ long long aval__; \ int bval__; \ __asm__( \ "#C_MULC\n\t" \ "ldrd %[aval], %H[aval], %[ap]\n\t" \ "ldr %[bval], %[bp]\n\t" \ "smulwb %[mr], %[aval], %[bval]\n\t" \ "smulwb %[mi1], %H[aval], %[bval]\n\t" \ "smulwt %[mi2], %[aval], %[bval]\n\t" \ "smlawt %[mr], %H[aval], %[bval], %[mr]\n\t" \ : [mr]"=r"(mr__), [mi1]"=r"(mi1__), [mi2]"=r"(mi2__), \ [aval]"=&r"(aval__), [bval]"=r"(bval__) \ : [ap]LDRD_CONS(a), [bp]"m"(b) \ ); \ (m).r = SHL32(mr__, 1); \ (m).i = SHL32(SUB32(mi1__, mi2__), 1); \ } \ while(0) #endif /* FIXED_POINT */ #endif /* KISS_FFT_GUTS_H */ mumble-1.3.4/3rdparty/opus-src/celt/arm/armopts.s.in0000664000175000017500000000326314010707326022153 0ustar builderbuilder/* Copyright (C) 2013 Mozilla Corporation */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ ; Set the following to 1 if we have EDSP instructions ; (LDRD/STRD, etc., ARMv5E and later). OPUS_ARM_MAY_HAVE_EDSP * @OPUS_ARM_MAY_HAVE_EDSP@ ; Set the following to 1 if we have ARMv6 media instructions. OPUS_ARM_MAY_HAVE_MEDIA * @OPUS_ARM_MAY_HAVE_MEDIA@ ; Set the following to 1 if we have NEON (some ARMv7) OPUS_ARM_MAY_HAVE_NEON * @OPUS_ARM_MAY_HAVE_NEON@ END mumble-1.3.4/3rdparty/opus-src/celt/arm/armcpu.c0000664000175000017500000001307714010707326021334 0ustar builderbuilder/* Copyright (c) 2010 Xiph.Org Foundation * Copyright (c) 2013 Parrot */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* Original code from libtheora modified to suit to Opus */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef OPUS_HAVE_RTCD #include "armcpu.h" #include "cpu_support.h" #include "os_support.h" #include "opus_types.h" #include "arch.h" #define OPUS_CPU_ARM_V4_FLAG (1< static OPUS_INLINE opus_uint32 opus_cpu_capabilities(void){ opus_uint32 flags; flags=0; /* MSVC has no OPUS_INLINE __asm support for ARM, but it does let you __emit * instructions via their assembled hex code. * All of these instructions should be essentially nops. */ # if defined(OPUS_ARM_MAY_HAVE_EDSP) || defined(OPUS_ARM_MAY_HAVE_MEDIA) \ || defined(OPUS_ARM_MAY_HAVE_NEON) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR) __try{ /*PLD [r13]*/ __emit(0xF5DDF000); flags|=OPUS_CPU_ARM_EDSP_FLAG; } __except(GetExceptionCode()==EXCEPTION_ILLEGAL_INSTRUCTION){ /*Ignore exception.*/ } # if defined(OPUS_ARM_MAY_HAVE_MEDIA) \ || defined(OPUS_ARM_MAY_HAVE_NEON) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR) __try{ /*SHADD8 r3,r3,r3*/ __emit(0xE6333F93); flags|=OPUS_CPU_ARM_MEDIA_FLAG; } __except(GetExceptionCode()==EXCEPTION_ILLEGAL_INSTRUCTION){ /*Ignore exception.*/ } # if defined(OPUS_ARM_MAY_HAVE_NEON) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR) __try{ /*VORR q0,q0,q0*/ __emit(0xF2200150); flags|=OPUS_CPU_ARM_NEON_FLAG; } __except(GetExceptionCode()==EXCEPTION_ILLEGAL_INSTRUCTION){ /*Ignore exception.*/ } # endif # endif # endif return flags; } #elif defined(__linux__) /* Linux based */ opus_uint32 opus_cpu_capabilities(void) { opus_uint32 flags = 0; FILE *cpuinfo; /* Reading /proc/self/auxv would be easier, but that doesn't work reliably on * Android */ cpuinfo = fopen("/proc/cpuinfo", "r"); if(cpuinfo != NULL) { /* 512 should be enough for anybody (it's even enough for all the flags that * x86 has accumulated... so far). */ char buf[512]; while(fgets(buf, 512, cpuinfo) != NULL) { # if defined(OPUS_ARM_MAY_HAVE_EDSP) || defined(OPUS_ARM_MAY_HAVE_MEDIA) \ || defined(OPUS_ARM_MAY_HAVE_NEON) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR) /* Search for edsp and neon flag */ if(memcmp(buf, "Features", 8) == 0) { char *p; p = strstr(buf, " edsp"); if(p != NULL && (p[5] == ' ' || p[5] == '\n')) flags |= OPUS_CPU_ARM_EDSP_FLAG; # if defined(OPUS_ARM_MAY_HAVE_NEON) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR) p = strstr(buf, " neon"); if(p != NULL && (p[5] == ' ' || p[5] == '\n')) flags |= OPUS_CPU_ARM_NEON_FLAG; # endif } # endif # if defined(OPUS_ARM_MAY_HAVE_MEDIA) \ || defined(OPUS_ARM_MAY_HAVE_NEON) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR) /* Search for media capabilities (>= ARMv6) */ if(memcmp(buf, "CPU architecture:", 17) == 0) { int version; version = atoi(buf+17); if(version >= 6) flags |= OPUS_CPU_ARM_MEDIA_FLAG; } # endif } fclose(cpuinfo); } return flags; } #else /* The feature registers which can tell us what the processor supports are * accessible in priveleged modes only, so we can't have a general user-space * detection method like on x86.*/ # error "Configured to use ARM asm but no CPU detection method available for " \ "your platform. Reconfigure with --disable-rtcd (or send patches)." #endif int opus_select_arch(void) { opus_uint32 flags = opus_cpu_capabilities(); int arch = 0; if(!(flags & OPUS_CPU_ARM_EDSP_FLAG)) { /* Asserts ensure arch values are sequential */ celt_assert(arch == OPUS_ARCH_ARM_V4); return arch; } arch++; if(!(flags & OPUS_CPU_ARM_MEDIA_FLAG)) { celt_assert(arch == OPUS_ARCH_ARM_EDSP); return arch; } arch++; if(!(flags & OPUS_CPU_ARM_NEON_FLAG)) { celt_assert(arch == OPUS_ARCH_ARM_MEDIA); return arch; } arch++; celt_assert(arch == OPUS_ARCH_ARM_NEON); return arch; } #endif mumble-1.3.4/3rdparty/opus-src/celt/arm/celt_pitch_xcorr_arm.s0000664000175000017500000004722614010707326024262 0ustar builderbuilder; Copyright (c) 2007-2008 CSIRO ; Copyright (c) 2007-2009 Xiph.Org Foundation ; Copyright (c) 2013 Parrot ; Written by Aurélien Zanelli ; ; Redistribution and use in source and binary forms, with or without ; modification, are permitted provided that the following conditions ; are met: ; ; - Redistributions of source code must retain the above copyright ; notice, this list of conditions and the following disclaimer. ; ; - Redistributions in binary form must reproduce the above copyright ; notice, this list of conditions and the following disclaimer in the ; documentation and/or other materials provided with the distribution. ; ; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ; ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER ; OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ; PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ; LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. AREA |.text|, CODE, READONLY GET celt/arm/armopts.s IF OPUS_ARM_MAY_HAVE_EDSP EXPORT celt_pitch_xcorr_edsp ENDIF IF OPUS_ARM_MAY_HAVE_NEON EXPORT celt_pitch_xcorr_neon ENDIF IF OPUS_ARM_MAY_HAVE_NEON ; Compute sum[k]=sum(x[j]*y[j+k],j=0...len-1), k=0...3 xcorr_kernel_neon PROC xcorr_kernel_neon_start ; input: ; r3 = int len ; r4 = opus_val16 *x ; r5 = opus_val16 *y ; q0 = opus_val32 sum[4] ; output: ; q0 = opus_val32 sum[4] ; preserved: r0-r3, r6-r11, d2, q4-q7, q9-q15 ; internal usage: ; r12 = int j ; d3 = y_3|y_2|y_1|y_0 ; q2 = y_B|y_A|y_9|y_8|y_7|y_6|y_5|y_4 ; q3 = x_7|x_6|x_5|x_4|x_3|x_2|x_1|x_0 ; q8 = scratch ; ; Load y[0...3] ; This requires len>0 to always be valid (which we assert in the C code). VLD1.16 {d5}, [r5]! SUBS r12, r3, #8 BLE xcorr_kernel_neon_process4 ; Process 8 samples at a time. ; This loop loads one y value more than we actually need. Therefore we have to ; stop as soon as there are 8 or fewer samples left (instead of 7), to avoid ; reading past the end of the array. xcorr_kernel_neon_process8 ; This loop has 19 total instructions (10 cycles to issue, minimum), with ; - 2 cycles of ARM insrtuctions, ; - 10 cycles of load/store/byte permute instructions, and ; - 9 cycles of data processing instructions. ; On a Cortex A8, we dual-issue the maximum amount (9 cycles) between the ; latter two categories, meaning the whole loop should run in 10 cycles per ; iteration, barring cache misses. ; ; Load x[0...7] VLD1.16 {d6, d7}, [r4]! ; Unlike VMOV, VAND is a data processsing instruction (and doesn't get ; assembled to VMOV, like VORR would), so it dual-issues with the prior VLD1. VAND d3, d5, d5 SUBS r12, r12, #8 ; Load y[4...11] VLD1.16 {d4, d5}, [r5]! VMLAL.S16 q0, d3, d6[0] VEXT.16 d16, d3, d4, #1 VMLAL.S16 q0, d4, d7[0] VEXT.16 d17, d4, d5, #1 VMLAL.S16 q0, d16, d6[1] VEXT.16 d16, d3, d4, #2 VMLAL.S16 q0, d17, d7[1] VEXT.16 d17, d4, d5, #2 VMLAL.S16 q0, d16, d6[2] VEXT.16 d16, d3, d4, #3 VMLAL.S16 q0, d17, d7[2] VEXT.16 d17, d4, d5, #3 VMLAL.S16 q0, d16, d6[3] VMLAL.S16 q0, d17, d7[3] BGT xcorr_kernel_neon_process8 ; Process 4 samples here if we have > 4 left (still reading one extra y value). xcorr_kernel_neon_process4 ADDS r12, r12, #4 BLE xcorr_kernel_neon_process2 ; Load x[0...3] VLD1.16 d6, [r4]! ; Use VAND since it's a data processing instruction again. VAND d4, d5, d5 SUB r12, r12, #4 ; Load y[4...7] VLD1.16 d5, [r5]! VMLAL.S16 q0, d4, d6[0] VEXT.16 d16, d4, d5, #1 VMLAL.S16 q0, d16, d6[1] VEXT.16 d16, d4, d5, #2 VMLAL.S16 q0, d16, d6[2] VEXT.16 d16, d4, d5, #3 VMLAL.S16 q0, d16, d6[3] ; Process 2 samples here if we have > 2 left (still reading one extra y value). xcorr_kernel_neon_process2 ADDS r12, r12, #2 BLE xcorr_kernel_neon_process1 ; Load x[0...1] VLD2.16 {d6[],d7[]}, [r4]! ; Use VAND since it's a data processing instruction again. VAND d4, d5, d5 SUB r12, r12, #2 ; Load y[4...5] VLD1.32 {d5[]}, [r5]! VMLAL.S16 q0, d4, d6 VEXT.16 d16, d4, d5, #1 ; Replace bottom copy of {y5,y4} in d5 with {y3,y2} from d4, using VSRI ; instead of VEXT, since it's a data-processing instruction. VSRI.64 d5, d4, #32 VMLAL.S16 q0, d16, d7 ; Process 1 sample using the extra y value we loaded above. xcorr_kernel_neon_process1 ; Load next *x VLD1.16 {d6[]}, [r4]! ADDS r12, r12, #1 ; y[0...3] are left in d5 from prior iteration(s) (if any) VMLAL.S16 q0, d5, d6 MOVLE pc, lr ; Now process 1 last sample, not reading ahead. ; Load last *y VLD1.16 {d4[]}, [r5]! VSRI.64 d4, d5, #16 ; Load last *x VLD1.16 {d6[]}, [r4]! VMLAL.S16 q0, d4, d6 MOV pc, lr ENDP ; opus_val32 celt_pitch_xcorr_neon(opus_val16 *_x, opus_val16 *_y, ; opus_val32 *xcorr, int len, int max_pitch, int arch) celt_pitch_xcorr_neon PROC ; input: ; r0 = opus_val16 *_x ; r1 = opus_val16 *_y ; r2 = opus_val32 *xcorr ; r3 = int len ; output: ; r0 = int maxcorr ; internal usage: ; r4 = opus_val16 *x (for xcorr_kernel_neon()) ; r5 = opus_val16 *y (for xcorr_kernel_neon()) ; r6 = int max_pitch ; r12 = int j ; q15 = int maxcorr[4] (q15 is not used by xcorr_kernel_neon()) ; ignored: ; int arch STMFD sp!, {r4-r6, lr} LDR r6, [sp, #16] VMOV.S32 q15, #1 ; if (max_pitch < 4) goto celt_pitch_xcorr_neon_process4_done SUBS r6, r6, #4 BLT celt_pitch_xcorr_neon_process4_done celt_pitch_xcorr_neon_process4 ; xcorr_kernel_neon parameters: ; r3 = len, r4 = _x, r5 = _y, q0 = {0, 0, 0, 0} MOV r4, r0 MOV r5, r1 VEOR q0, q0, q0 ; xcorr_kernel_neon only modifies r4, r5, r12, and q0...q3. ; So we don't save/restore any other registers. BL xcorr_kernel_neon_start SUBS r6, r6, #4 VST1.32 {q0}, [r2]! ; _y += 4 ADD r1, r1, #8 VMAX.S32 q15, q15, q0 ; if (max_pitch < 4) goto celt_pitch_xcorr_neon_process4_done BGE celt_pitch_xcorr_neon_process4 ; We have less than 4 sums left to compute. celt_pitch_xcorr_neon_process4_done ADDS r6, r6, #4 ; Reduce maxcorr to a single value VMAX.S32 d30, d30, d31 VPMAX.S32 d30, d30, d30 ; if (max_pitch <= 0) goto celt_pitch_xcorr_neon_done BLE celt_pitch_xcorr_neon_done ; Now compute each remaining sum one at a time. celt_pitch_xcorr_neon_process_remaining MOV r4, r0 MOV r5, r1 VMOV.I32 q0, #0 SUBS r12, r3, #8 BLT celt_pitch_xcorr_neon_process_remaining4 ; Sum terms 8 at a time. celt_pitch_xcorr_neon_process_remaining_loop8 ; Load x[0...7] VLD1.16 {q1}, [r4]! ; Load y[0...7] VLD1.16 {q2}, [r5]! SUBS r12, r12, #8 VMLAL.S16 q0, d4, d2 VMLAL.S16 q0, d5, d3 BGE celt_pitch_xcorr_neon_process_remaining_loop8 ; Sum terms 4 at a time. celt_pitch_xcorr_neon_process_remaining4 ADDS r12, r12, #4 BLT celt_pitch_xcorr_neon_process_remaining4_done ; Load x[0...3] VLD1.16 {d2}, [r4]! ; Load y[0...3] VLD1.16 {d3}, [r5]! SUB r12, r12, #4 VMLAL.S16 q0, d3, d2 celt_pitch_xcorr_neon_process_remaining4_done ; Reduce the sum to a single value. VADD.S32 d0, d0, d1 VPADDL.S32 d0, d0 ADDS r12, r12, #4 BLE celt_pitch_xcorr_neon_process_remaining_loop_done ; Sum terms 1 at a time. celt_pitch_xcorr_neon_process_remaining_loop1 VLD1.16 {d2[]}, [r4]! VLD1.16 {d3[]}, [r5]! SUBS r12, r12, #1 VMLAL.S16 q0, d2, d3 BGT celt_pitch_xcorr_neon_process_remaining_loop1 celt_pitch_xcorr_neon_process_remaining_loop_done VST1.32 {d0[0]}, [r2]! VMAX.S32 d30, d30, d0 SUBS r6, r6, #1 ; _y++ ADD r1, r1, #2 ; if (--max_pitch > 0) goto celt_pitch_xcorr_neon_process_remaining BGT celt_pitch_xcorr_neon_process_remaining celt_pitch_xcorr_neon_done VMOV.32 r0, d30[0] LDMFD sp!, {r4-r6, pc} ENDP ENDIF IF OPUS_ARM_MAY_HAVE_EDSP ; This will get used on ARMv7 devices without NEON, so it has been optimized ; to take advantage of dual-issuing where possible. xcorr_kernel_edsp PROC xcorr_kernel_edsp_start ; input: ; r3 = int len ; r4 = opus_val16 *_x (must be 32-bit aligned) ; r5 = opus_val16 *_y (must be 32-bit aligned) ; r6...r9 = opus_val32 sum[4] ; output: ; r6...r9 = opus_val32 sum[4] ; preserved: r0-r5 ; internal usage ; r2 = int j ; r12,r14 = opus_val16 x[4] ; r10,r11 = opus_val16 y[4] STMFD sp!, {r2,r4,r5,lr} LDR r10, [r5], #4 ; Load y[0...1] SUBS r2, r3, #4 ; j = len-4 LDR r11, [r5], #4 ; Load y[2...3] BLE xcorr_kernel_edsp_process4_done LDR r12, [r4], #4 ; Load x[0...1] ; Stall xcorr_kernel_edsp_process4 ; The multiplies must issue from pipeline 0, and can't dual-issue with each ; other. Every other instruction here dual-issues with a multiply, and is ; thus "free". There should be no stalls in the body of the loop. SMLABB r6, r12, r10, r6 ; sum[0] = MAC16_16(sum[0],x_0,y_0) LDR r14, [r4], #4 ; Load x[2...3] SMLABT r7, r12, r10, r7 ; sum[1] = MAC16_16(sum[1],x_0,y_1) SUBS r2, r2, #4 ; j-=4 SMLABB r8, r12, r11, r8 ; sum[2] = MAC16_16(sum[2],x_0,y_2) SMLABT r9, r12, r11, r9 ; sum[3] = MAC16_16(sum[3],x_0,y_3) SMLATT r6, r12, r10, r6 ; sum[0] = MAC16_16(sum[0],x_1,y_1) LDR r10, [r5], #4 ; Load y[4...5] SMLATB r7, r12, r11, r7 ; sum[1] = MAC16_16(sum[1],x_1,y_2) SMLATT r8, r12, r11, r8 ; sum[2] = MAC16_16(sum[2],x_1,y_3) SMLATB r9, r12, r10, r9 ; sum[3] = MAC16_16(sum[3],x_1,y_4) LDRGT r12, [r4], #4 ; Load x[0...1] SMLABB r6, r14, r11, r6 ; sum[0] = MAC16_16(sum[0],x_2,y_2) SMLABT r7, r14, r11, r7 ; sum[1] = MAC16_16(sum[1],x_2,y_3) SMLABB r8, r14, r10, r8 ; sum[2] = MAC16_16(sum[2],x_2,y_4) SMLABT r9, r14, r10, r9 ; sum[3] = MAC16_16(sum[3],x_2,y_5) SMLATT r6, r14, r11, r6 ; sum[0] = MAC16_16(sum[0],x_3,y_3) LDR r11, [r5], #4 ; Load y[6...7] SMLATB r7, r14, r10, r7 ; sum[1] = MAC16_16(sum[1],x_3,y_4) SMLATT r8, r14, r10, r8 ; sum[2] = MAC16_16(sum[2],x_3,y_5) SMLATB r9, r14, r11, r9 ; sum[3] = MAC16_16(sum[3],x_3,y_6) BGT xcorr_kernel_edsp_process4 xcorr_kernel_edsp_process4_done ADDS r2, r2, #4 BLE xcorr_kernel_edsp_done LDRH r12, [r4], #2 ; r12 = *x++ SUBS r2, r2, #1 ; j-- ; Stall SMLABB r6, r12, r10, r6 ; sum[0] = MAC16_16(sum[0],x,y_0) LDRHGT r14, [r4], #2 ; r14 = *x++ SMLABT r7, r12, r10, r7 ; sum[1] = MAC16_16(sum[1],x,y_1) SMLABB r8, r12, r11, r8 ; sum[2] = MAC16_16(sum[2],x,y_2) SMLABT r9, r12, r11, r9 ; sum[3] = MAC16_16(sum[3],x,y_3) BLE xcorr_kernel_edsp_done SMLABT r6, r14, r10, r6 ; sum[0] = MAC16_16(sum[0],x,y_1) SUBS r2, r2, #1 ; j-- SMLABB r7, r14, r11, r7 ; sum[1] = MAC16_16(sum[1],x,y_2) LDRH r10, [r5], #2 ; r10 = y_4 = *y++ SMLABT r8, r14, r11, r8 ; sum[2] = MAC16_16(sum[2],x,y_3) LDRHGT r12, [r4], #2 ; r12 = *x++ SMLABB r9, r14, r10, r9 ; sum[3] = MAC16_16(sum[3],x,y_4) BLE xcorr_kernel_edsp_done SMLABB r6, r12, r11, r6 ; sum[0] = MAC16_16(sum[0],tmp,y_2) CMP r2, #1 ; j-- SMLABT r7, r12, r11, r7 ; sum[1] = MAC16_16(sum[1],tmp,y_3) LDRH r2, [r5], #2 ; r2 = y_5 = *y++ SMLABB r8, r12, r10, r8 ; sum[2] = MAC16_16(sum[2],tmp,y_4) LDRHGT r14, [r4] ; r14 = *x SMLABB r9, r12, r2, r9 ; sum[3] = MAC16_16(sum[3],tmp,y_5) BLE xcorr_kernel_edsp_done SMLABT r6, r14, r11, r6 ; sum[0] = MAC16_16(sum[0],tmp,y_3) LDRH r11, [r5] ; r11 = y_6 = *y SMLABB r7, r14, r10, r7 ; sum[1] = MAC16_16(sum[1],tmp,y_4) SMLABB r8, r14, r2, r8 ; sum[2] = MAC16_16(sum[2],tmp,y_5) SMLABB r9, r14, r11, r9 ; sum[3] = MAC16_16(sum[3],tmp,y_6) xcorr_kernel_edsp_done LDMFD sp!, {r2,r4,r5,pc} ENDP celt_pitch_xcorr_edsp PROC ; input: ; r0 = opus_val16 *_x (must be 32-bit aligned) ; r1 = opus_val16 *_y (only needs to be 16-bit aligned) ; r2 = opus_val32 *xcorr ; r3 = int len ; output: ; r0 = maxcorr ; internal usage ; r4 = opus_val16 *x ; r5 = opus_val16 *y ; r6 = opus_val32 sum0 ; r7 = opus_val32 sum1 ; r8 = opus_val32 sum2 ; r9 = opus_val32 sum3 ; r1 = int max_pitch ; r12 = int j ; ignored: ; int arch STMFD sp!, {r4-r11, lr} MOV r5, r1 LDR r1, [sp, #36] MOV r4, r0 TST r5, #3 ; maxcorr = 1 MOV r0, #1 BEQ celt_pitch_xcorr_edsp_process1u_done ; Compute one sum at the start to make y 32-bit aligned. SUBS r12, r3, #4 ; r14 = sum = 0 MOV r14, #0 LDRH r8, [r5], #2 BLE celt_pitch_xcorr_edsp_process1u_loop4_done LDR r6, [r4], #4 MOV r8, r8, LSL #16 celt_pitch_xcorr_edsp_process1u_loop4 LDR r9, [r5], #4 SMLABT r14, r6, r8, r14 ; sum = MAC16_16(sum, x_0, y_0) LDR r7, [r4], #4 SMLATB r14, r6, r9, r14 ; sum = MAC16_16(sum, x_1, y_1) LDR r8, [r5], #4 SMLABT r14, r7, r9, r14 ; sum = MAC16_16(sum, x_2, y_2) SUBS r12, r12, #4 ; j-=4 SMLATB r14, r7, r8, r14 ; sum = MAC16_16(sum, x_3, y_3) LDRGT r6, [r4], #4 BGT celt_pitch_xcorr_edsp_process1u_loop4 MOV r8, r8, LSR #16 celt_pitch_xcorr_edsp_process1u_loop4_done ADDS r12, r12, #4 celt_pitch_xcorr_edsp_process1u_loop1 LDRHGE r6, [r4], #2 ; Stall SMLABBGE r14, r6, r8, r14 ; sum = MAC16_16(sum, *x, *y) SUBSGE r12, r12, #1 LDRHGT r8, [r5], #2 BGT celt_pitch_xcorr_edsp_process1u_loop1 ; Restore _x SUB r4, r4, r3, LSL #1 ; Restore and advance _y SUB r5, r5, r3, LSL #1 ; maxcorr = max(maxcorr, sum) CMP r0, r14 ADD r5, r5, #2 MOVLT r0, r14 SUBS r1, r1, #1 ; xcorr[i] = sum STR r14, [r2], #4 BLE celt_pitch_xcorr_edsp_done celt_pitch_xcorr_edsp_process1u_done ; if (max_pitch < 4) goto celt_pitch_xcorr_edsp_process2 SUBS r1, r1, #4 BLT celt_pitch_xcorr_edsp_process2 celt_pitch_xcorr_edsp_process4 ; xcorr_kernel_edsp parameters: ; r3 = len, r4 = _x, r5 = _y, r6...r9 = sum[4] = {0, 0, 0, 0} MOV r6, #0 MOV r7, #0 MOV r8, #0 MOV r9, #0 BL xcorr_kernel_edsp_start ; xcorr_kernel_edsp(_x, _y+i, xcorr+i, len) ; maxcorr = max(maxcorr, sum0, sum1, sum2, sum3) CMP r0, r6 ; _y+=4 ADD r5, r5, #8 MOVLT r0, r6 CMP r0, r7 MOVLT r0, r7 CMP r0, r8 MOVLT r0, r8 CMP r0, r9 MOVLT r0, r9 STMIA r2!, {r6-r9} SUBS r1, r1, #4 BGE celt_pitch_xcorr_edsp_process4 celt_pitch_xcorr_edsp_process2 ADDS r1, r1, #2 BLT celt_pitch_xcorr_edsp_process1a SUBS r12, r3, #4 ; {r10, r11} = {sum0, sum1} = {0, 0} MOV r10, #0 MOV r11, #0 LDR r8, [r5], #4 BLE celt_pitch_xcorr_edsp_process2_loop_done LDR r6, [r4], #4 LDR r9, [r5], #4 celt_pitch_xcorr_edsp_process2_loop4 SMLABB r10, r6, r8, r10 ; sum0 = MAC16_16(sum0, x_0, y_0) LDR r7, [r4], #4 SMLABT r11, r6, r8, r11 ; sum1 = MAC16_16(sum1, x_0, y_1) SUBS r12, r12, #4 ; j-=4 SMLATT r10, r6, r8, r10 ; sum0 = MAC16_16(sum0, x_1, y_1) LDR r8, [r5], #4 SMLATB r11, r6, r9, r11 ; sum1 = MAC16_16(sum1, x_1, y_2) LDRGT r6, [r4], #4 SMLABB r10, r7, r9, r10 ; sum0 = MAC16_16(sum0, x_2, y_2) SMLABT r11, r7, r9, r11 ; sum1 = MAC16_16(sum1, x_2, y_3) SMLATT r10, r7, r9, r10 ; sum0 = MAC16_16(sum0, x_3, y_3) LDRGT r9, [r5], #4 SMLATB r11, r7, r8, r11 ; sum1 = MAC16_16(sum1, x_3, y_4) BGT celt_pitch_xcorr_edsp_process2_loop4 celt_pitch_xcorr_edsp_process2_loop_done ADDS r12, r12, #2 BLE celt_pitch_xcorr_edsp_process2_1 LDR r6, [r4], #4 ; Stall SMLABB r10, r6, r8, r10 ; sum0 = MAC16_16(sum0, x_0, y_0) LDR r9, [r5], #4 SMLABT r11, r6, r8, r11 ; sum1 = MAC16_16(sum1, x_0, y_1) SUB r12, r12, #2 SMLATT r10, r6, r8, r10 ; sum0 = MAC16_16(sum0, x_1, y_1) MOV r8, r9 SMLATB r11, r6, r9, r11 ; sum1 = MAC16_16(sum1, x_1, y_2) celt_pitch_xcorr_edsp_process2_1 LDRH r6, [r4], #2 ADDS r12, r12, #1 ; Stall SMLABB r10, r6, r8, r10 ; sum0 = MAC16_16(sum0, x_0, y_0) LDRHGT r7, [r4], #2 SMLABT r11, r6, r8, r11 ; sum1 = MAC16_16(sum1, x_0, y_1) BLE celt_pitch_xcorr_edsp_process2_done LDRH r9, [r5], #2 SMLABT r10, r7, r8, r10 ; sum0 = MAC16_16(sum0, x_0, y_1) SMLABB r11, r7, r9, r11 ; sum1 = MAC16_16(sum1, x_0, y_2) celt_pitch_xcorr_edsp_process2_done ; Restore _x SUB r4, r4, r3, LSL #1 ; Restore and advance _y SUB r5, r5, r3, LSL #1 ; maxcorr = max(maxcorr, sum0) CMP r0, r10 ADD r5, r5, #2 MOVLT r0, r10 SUB r1, r1, #2 ; maxcorr = max(maxcorr, sum1) CMP r0, r11 ; xcorr[i] = sum STR r10, [r2], #4 MOVLT r0, r11 STR r11, [r2], #4 celt_pitch_xcorr_edsp_process1a ADDS r1, r1, #1 BLT celt_pitch_xcorr_edsp_done SUBS r12, r3, #4 ; r14 = sum = 0 MOV r14, #0 BLT celt_pitch_xcorr_edsp_process1a_loop_done LDR r6, [r4], #4 LDR r8, [r5], #4 LDR r7, [r4], #4 LDR r9, [r5], #4 celt_pitch_xcorr_edsp_process1a_loop4 SMLABB r14, r6, r8, r14 ; sum = MAC16_16(sum, x_0, y_0) SUBS r12, r12, #4 ; j-=4 SMLATT r14, r6, r8, r14 ; sum = MAC16_16(sum, x_1, y_1) LDRGE r6, [r4], #4 SMLABB r14, r7, r9, r14 ; sum = MAC16_16(sum, x_2, y_2) LDRGE r8, [r5], #4 SMLATT r14, r7, r9, r14 ; sum = MAC16_16(sum, x_3, y_3) LDRGE r7, [r4], #4 LDRGE r9, [r5], #4 BGE celt_pitch_xcorr_edsp_process1a_loop4 celt_pitch_xcorr_edsp_process1a_loop_done ADDS r12, r12, #2 LDRGE r6, [r4], #4 LDRGE r8, [r5], #4 ; Stall SMLABBGE r14, r6, r8, r14 ; sum = MAC16_16(sum, x_0, y_0) SUBGE r12, r12, #2 SMLATTGE r14, r6, r8, r14 ; sum = MAC16_16(sum, x_1, y_1) ADDS r12, r12, #1 LDRHGE r6, [r4], #2 LDRHGE r8, [r5], #2 ; Stall SMLABBGE r14, r6, r8, r14 ; sum = MAC16_16(sum, *x, *y) ; maxcorr = max(maxcorr, sum) CMP r0, r14 ; xcorr[i] = sum STR r14, [r2], #4 MOVLT r0, r14 celt_pitch_xcorr_edsp_done LDMFD sp!, {r4-r11, pc} ENDP ENDIF END mumble-1.3.4/3rdparty/opus-src/celt/arm/arm_celt_map.c0000664000175000017500000001477214010707326022473 0ustar builderbuilder/* Copyright (c) 2010 Xiph.Org Foundation * Copyright (c) 2013 Parrot */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "pitch.h" #include "kiss_fft.h" #include "mdct.h" #if defined(OPUS_HAVE_RTCD) # if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR) opus_val32 (*const CELT_INNER_PROD_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *x, const opus_val16 *y, int N) = { celt_inner_prod_c, /* ARMv4 */ celt_inner_prod_c, /* EDSP */ celt_inner_prod_c, /* Media */ celt_inner_prod_neon /* NEON */ }; void (*const DUAL_INNER_PROD_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *x, const opus_val16 *y01, const opus_val16 *y02, int N, opus_val32 *xy1, opus_val32 *xy2) = { dual_inner_prod_c, /* ARMv4 */ dual_inner_prod_c, /* EDSP */ dual_inner_prod_c, /* Media */ dual_inner_prod_neon /* NEON */ }; # endif # if defined(FIXED_POINT) # if ((defined(OPUS_ARM_MAY_HAVE_NEON) && !defined(OPUS_ARM_PRESUME_NEON)) || \ (defined(OPUS_ARM_MAY_HAVE_MEDIA) && !defined(OPUS_ARM_PRESUME_MEDIA)) || \ (defined(OPUS_ARM_MAY_HAVE_EDSP) && !defined(OPUS_ARM_PRESUME_EDSP))) opus_val32 (*const CELT_PITCH_XCORR_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *, const opus_val16 *, opus_val32 *, int, int, int) = { celt_pitch_xcorr_c, /* ARMv4 */ MAY_HAVE_EDSP(celt_pitch_xcorr), /* EDSP */ MAY_HAVE_MEDIA(celt_pitch_xcorr), /* Media */ MAY_HAVE_NEON(celt_pitch_xcorr) /* NEON */ }; # endif # else /* !FIXED_POINT */ # if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR) void (*const CELT_PITCH_XCORR_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *, const opus_val16 *, opus_val32 *, int, int, int) = { celt_pitch_xcorr_c, /* ARMv4 */ celt_pitch_xcorr_c, /* EDSP */ celt_pitch_xcorr_c, /* Media */ celt_pitch_xcorr_float_neon /* Neon */ }; # endif # endif /* FIXED_POINT */ #if defined(FIXED_POINT) && defined(OPUS_HAVE_RTCD) && \ defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR) void (*const XCORR_KERNEL_IMPL[OPUS_ARCHMASK + 1])( const opus_val16 *x, const opus_val16 *y, opus_val32 sum[4], int len ) = { xcorr_kernel_c, /* ARMv4 */ xcorr_kernel_c, /* EDSP */ xcorr_kernel_c, /* Media */ xcorr_kernel_neon_fixed, /* Neon */ }; #endif # if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) # if defined(HAVE_ARM_NE10) # if defined(CUSTOM_MODES) int (*const OPUS_FFT_ALLOC_ARCH_IMPL[OPUS_ARCHMASK+1])(kiss_fft_state *st) = { opus_fft_alloc_arch_c, /* ARMv4 */ opus_fft_alloc_arch_c, /* EDSP */ opus_fft_alloc_arch_c, /* Media */ opus_fft_alloc_arm_neon /* Neon with NE10 library support */ }; void (*const OPUS_FFT_FREE_ARCH_IMPL[OPUS_ARCHMASK+1])(kiss_fft_state *st) = { opus_fft_free_arch_c, /* ARMv4 */ opus_fft_free_arch_c, /* EDSP */ opus_fft_free_arch_c, /* Media */ opus_fft_free_arm_neon /* Neon with NE10 */ }; # endif /* CUSTOM_MODES */ void (*const OPUS_FFT[OPUS_ARCHMASK+1])(const kiss_fft_state *cfg, const kiss_fft_cpx *fin, kiss_fft_cpx *fout) = { opus_fft_c, /* ARMv4 */ opus_fft_c, /* EDSP */ opus_fft_c, /* Media */ opus_fft_neon /* Neon with NE10 */ }; void (*const OPUS_IFFT[OPUS_ARCHMASK+1])(const kiss_fft_state *cfg, const kiss_fft_cpx *fin, kiss_fft_cpx *fout) = { opus_ifft_c, /* ARMv4 */ opus_ifft_c, /* EDSP */ opus_ifft_c, /* Media */ opus_ifft_neon /* Neon with NE10 */ }; void (*const CLT_MDCT_FORWARD_IMPL[OPUS_ARCHMASK+1])(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar * OPUS_RESTRICT out, const opus_val16 *window, int overlap, int shift, int stride, int arch) = { clt_mdct_forward_c, /* ARMv4 */ clt_mdct_forward_c, /* EDSP */ clt_mdct_forward_c, /* Media */ clt_mdct_forward_neon /* Neon with NE10 */ }; void (*const CLT_MDCT_BACKWARD_IMPL[OPUS_ARCHMASK+1])(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar * OPUS_RESTRICT out, const opus_val16 *window, int overlap, int shift, int stride, int arch) = { clt_mdct_backward_c, /* ARMv4 */ clt_mdct_backward_c, /* EDSP */ clt_mdct_backward_c, /* Media */ clt_mdct_backward_neon /* Neon with NE10 */ }; # endif /* HAVE_ARM_NE10 */ # endif /* OPUS_ARM_MAY_HAVE_NEON_INTR */ #endif /* OPUS_HAVE_RTCD */ mumble-1.3.4/3rdparty/opus-src/celt/arm/fixed_arm64.h0000664000175000017500000000271414010707326022156 0ustar builderbuilder/* Copyright (C) 2015 Vidyo */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef FIXED_ARM64_H #define FIXED_ARM64_H #include #undef SIG2WORD16 #define SIG2WORD16(x) (vqmovns_s32(PSHR32((x), SIG_SHIFT))) #endif mumble-1.3.4/3rdparty/opus-src/celt/arm/fixed_armv4.h0000664000175000017500000000561014010707326022254 0ustar builderbuilder/* Copyright (C) 2013 Xiph.Org Foundation and contributors */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef FIXED_ARMv4_H #define FIXED_ARMv4_H /** 16x32 multiplication, followed by a 16-bit shift right. Results fits in 32 bits */ #undef MULT16_32_Q16 static OPUS_INLINE opus_val32 MULT16_32_Q16_armv4(opus_val16 a, opus_val32 b) { unsigned rd_lo; int rd_hi; __asm__( "#MULT16_32_Q16\n\t" "smull %0, %1, %2, %3\n\t" : "=&r"(rd_lo), "=&r"(rd_hi) : "%r"(b),"r"(SHL32(a,16)) ); return rd_hi; } #define MULT16_32_Q16(a, b) (MULT16_32_Q16_armv4(a, b)) /** 16x32 multiplication, followed by a 15-bit shift right. Results fits in 32 bits */ #undef MULT16_32_Q15 static OPUS_INLINE opus_val32 MULT16_32_Q15_armv4(opus_val16 a, opus_val32 b) { unsigned rd_lo; int rd_hi; __asm__( "#MULT16_32_Q15\n\t" "smull %0, %1, %2, %3\n\t" : "=&r"(rd_lo), "=&r"(rd_hi) : "%r"(b), "r"(SHL32(a,16)) ); /*We intentionally don't OR in the high bit of rd_lo for speed.*/ return SHL32(rd_hi,1); } #define MULT16_32_Q15(a, b) (MULT16_32_Q15_armv4(a, b)) /** 16x32 multiply, followed by a 15-bit shift right and 32-bit add. b must fit in 31 bits. Result fits in 32 bits. */ #undef MAC16_32_Q15 #define MAC16_32_Q15(c, a, b) ADD32(c, MULT16_32_Q15(a, b)) /** 16x32 multiply, followed by a 16-bit shift right and 32-bit add. Result fits in 32 bits. */ #undef MAC16_32_Q16 #define MAC16_32_Q16(c, a, b) ADD32(c, MULT16_32_Q16(a, b)) /** 32x32 multiplication, followed by a 31-bit shift right. Results fits in 32 bits */ #undef MULT32_32_Q31 #define MULT32_32_Q31(a,b) (opus_val32)((((opus_int64)(a)) * ((opus_int64)(b)))>>31) #endif mumble-1.3.4/3rdparty/opus-src/celt/arm/celt_neon_intr.c0000664000175000017500000001517614010707326023051 0ustar builderbuilder/* Copyright (c) 2014-2015 Xiph.Org Foundation Written by Viswanath Puttagunta */ /** @file celt_neon_intr.c @brief ARM Neon Intrinsic optimizations for celt */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "../pitch.h" #if defined(FIXED_POINT) void xcorr_kernel_neon_fixed(const opus_val16 * x, const opus_val16 * y, opus_val32 sum[4], int len) { int j; int32x4_t a = vld1q_s32(sum); /* Load y[0...3] */ /* This requires len>0 to always be valid (which we assert in the C code). */ int16x4_t y0 = vld1_s16(y); y += 4; for (j = 0; j + 8 <= len; j += 8) { /* Load x[0...7] */ int16x8_t xx = vld1q_s16(x); int16x4_t x0 = vget_low_s16(xx); int16x4_t x4 = vget_high_s16(xx); /* Load y[4...11] */ int16x8_t yy = vld1q_s16(y); int16x4_t y4 = vget_low_s16(yy); int16x4_t y8 = vget_high_s16(yy); int32x4_t a0 = vmlal_lane_s16(a, y0, x0, 0); int32x4_t a1 = vmlal_lane_s16(a0, y4, x4, 0); int16x4_t y1 = vext_s16(y0, y4, 1); int16x4_t y5 = vext_s16(y4, y8, 1); int32x4_t a2 = vmlal_lane_s16(a1, y1, x0, 1); int32x4_t a3 = vmlal_lane_s16(a2, y5, x4, 1); int16x4_t y2 = vext_s16(y0, y4, 2); int16x4_t y6 = vext_s16(y4, y8, 2); int32x4_t a4 = vmlal_lane_s16(a3, y2, x0, 2); int32x4_t a5 = vmlal_lane_s16(a4, y6, x4, 2); int16x4_t y3 = vext_s16(y0, y4, 3); int16x4_t y7 = vext_s16(y4, y8, 3); int32x4_t a6 = vmlal_lane_s16(a5, y3, x0, 3); int32x4_t a7 = vmlal_lane_s16(a6, y7, x4, 3); y0 = y8; a = a7; x += 8; y += 8; } for (; j < len; j++) { int16x4_t x0 = vld1_dup_s16(x); /* load next x */ int32x4_t a0 = vmlal_s16(a, y0, x0); int16x4_t y4 = vld1_dup_s16(y); /* load next y */ y0 = vext_s16(y0, y4, 1); a = a0; x++; y++; } vst1q_s32(sum, a); } #else /* * Function: xcorr_kernel_neon_float * --------------------------------- * Computes 4 correlation values and stores them in sum[4] */ static void xcorr_kernel_neon_float(const float32_t *x, const float32_t *y, float32_t sum[4], int len) { float32x4_t YY[3]; float32x4_t YEXT[3]; float32x4_t XX[2]; float32x2_t XX_2; float32x4_t SUMM; const float32_t *xi = x; const float32_t *yi = y; celt_assert(len>0); YY[0] = vld1q_f32(yi); SUMM = vdupq_n_f32(0); /* Consume 8 elements in x vector and 12 elements in y * vector. However, the 12'th element never really gets * touched in this loop. So, if len == 8, then we only * must access y[0] to y[10]. y[11] must not be accessed * hence make sure len > 8 and not len >= 8 */ while (len > 8) { yi += 4; YY[1] = vld1q_f32(yi); yi += 4; YY[2] = vld1q_f32(yi); XX[0] = vld1q_f32(xi); xi += 4; XX[1] = vld1q_f32(xi); xi += 4; SUMM = vmlaq_lane_f32(SUMM, YY[0], vget_low_f32(XX[0]), 0); YEXT[0] = vextq_f32(YY[0], YY[1], 1); SUMM = vmlaq_lane_f32(SUMM, YEXT[0], vget_low_f32(XX[0]), 1); YEXT[1] = vextq_f32(YY[0], YY[1], 2); SUMM = vmlaq_lane_f32(SUMM, YEXT[1], vget_high_f32(XX[0]), 0); YEXT[2] = vextq_f32(YY[0], YY[1], 3); SUMM = vmlaq_lane_f32(SUMM, YEXT[2], vget_high_f32(XX[0]), 1); SUMM = vmlaq_lane_f32(SUMM, YY[1], vget_low_f32(XX[1]), 0); YEXT[0] = vextq_f32(YY[1], YY[2], 1); SUMM = vmlaq_lane_f32(SUMM, YEXT[0], vget_low_f32(XX[1]), 1); YEXT[1] = vextq_f32(YY[1], YY[2], 2); SUMM = vmlaq_lane_f32(SUMM, YEXT[1], vget_high_f32(XX[1]), 0); YEXT[2] = vextq_f32(YY[1], YY[2], 3); SUMM = vmlaq_lane_f32(SUMM, YEXT[2], vget_high_f32(XX[1]), 1); YY[0] = YY[2]; len -= 8; } /* Consume 4 elements in x vector and 8 elements in y * vector. However, the 8'th element in y never really gets * touched in this loop. So, if len == 4, then we only * must access y[0] to y[6]. y[7] must not be accessed * hence make sure len>4 and not len>=4 */ if (len > 4) { yi += 4; YY[1] = vld1q_f32(yi); XX[0] = vld1q_f32(xi); xi += 4; SUMM = vmlaq_lane_f32(SUMM, YY[0], vget_low_f32(XX[0]), 0); YEXT[0] = vextq_f32(YY[0], YY[1], 1); SUMM = vmlaq_lane_f32(SUMM, YEXT[0], vget_low_f32(XX[0]), 1); YEXT[1] = vextq_f32(YY[0], YY[1], 2); SUMM = vmlaq_lane_f32(SUMM, YEXT[1], vget_high_f32(XX[0]), 0); YEXT[2] = vextq_f32(YY[0], YY[1], 3); SUMM = vmlaq_lane_f32(SUMM, YEXT[2], vget_high_f32(XX[0]), 1); YY[0] = YY[1]; len -= 4; } while (--len > 0) { XX_2 = vld1_dup_f32(xi++); SUMM = vmlaq_lane_f32(SUMM, YY[0], XX_2, 0); YY[0]= vld1q_f32(++yi); } XX_2 = vld1_dup_f32(xi); SUMM = vmlaq_lane_f32(SUMM, YY[0], XX_2, 0); vst1q_f32(sum, SUMM); } void celt_pitch_xcorr_float_neon(const opus_val16 *_x, const opus_val16 *_y, opus_val32 *xcorr, int len, int max_pitch, int arch) { int i; (void)arch; celt_assert(max_pitch > 0); celt_assert((((unsigned char *)_x-(unsigned char *)NULL)&3)==0); for (i = 0; i < (max_pitch-3); i += 4) { xcorr_kernel_neon_float((const float32_t *)_x, (const float32_t *)_y+i, (float32_t *)xcorr+i, len); } /* In case max_pitch isn't a multiple of 4, do non-unrolled version. */ for (; i < max_pitch; i++) { xcorr[i] = celt_inner_prod_neon(_x, _y+i, len); } } #endif mumble-1.3.4/3rdparty/opus-src/celt/arm/arm2gnu.pl0000775000175000017500000002501214010707326021604 0ustar builderbuilder#!/usr/bin/perl # Copyright (C) 2002-2013 Xiph.org Foundation # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # - Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # - Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER # OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. my $bigend; # little/big endian my $nxstack; my $apple = 0; my $symprefix = ""; $nxstack = 0; eval 'exec /usr/local/bin/perl -S $0 ${1+"$@"}' if $running_under_some_shell; while ($ARGV[0] =~ /^-/) { $_ = shift; last if /^--$/; if (/^-n$/) { $nflag++; next; } if (/^--apple$/) { $apple = 1; $symprefix = "_"; next; } die "I don't recognize this switch: $_\\n"; } $printit++ unless $nflag; $\ = "\n"; # automatically add newline on print $n=0; $thumb = 0; # ARM mode by default, not Thumb. @proc_stack = (); printf (" .syntax unified\n"); LINE: while (<>) { # For ADRLs we need to add a new line after the substituted one. $addPadding = 0; # First, we do not dare to touch *anything* inside double quotes, do we? # Second, if you want a dollar character in the string, # insert two of them -- that's how ARM C and assembler treat strings. s/^([A-Za-z_]\w*)[ \t]+DCB[ \t]*\"/$1: .ascii \"/ && do { s/\$\$/\$/g; next }; s/\bDCB\b[ \t]*\"/.ascii \"/ && do { s/\$\$/\$/g; next }; s/^(\S+)\s+RN\s+(\S+)/$1 .req r$2/ && do { s/\$\$/\$/g; next }; # If there's nothing on a line but a comment, don't try to apply any further # substitutions (this is a cheap hack to avoid mucking up the license header) s/^([ \t]*);/$1@/ && do { s/\$\$/\$/g; next }; # If substituted -- leave immediately ! s/@/,:/; s/;/@/; while ( /@.*'/ ) { s/(@.*)'/$1/g; } s/\{FALSE\}/0/g; s/\{TRUE\}/1/g; s/\{(\w\w\w\w+)\}/$1/g; s/\bINCLUDE[ \t]*([^ \t\n]+)/.include \"$1\"/; s/\bGET[ \t]*([^ \t\n]+)/.include \"${ my $x=$1; $x =~ s|\.s|-gnu.S|; \$x }\"/; s/\bIMPORT\b/.extern/; s/\bEXPORT\b\s*/.global $symprefix/; s/^(\s+)\[/$1IF/; s/^(\s+)\|/$1ELSE/; s/^(\s+)\]/$1ENDIF/; s/IF *:DEF:/ .ifdef/; s/IF *:LNOT: *:DEF:/ .ifndef/; s/ELSE/ .else/; s/ENDIF/ .endif/; if( /\bIF\b/ ) { s/\bIF\b/ .if/; s/=/==/; } if ( $n == 2) { s/\$/\\/g; } if ($n == 1) { s/\$//g; s/label//g; $n = 2; } if ( /MACRO/ ) { s/MACRO *\n/.macro/; $n=1; } if ( /\bMEND\b/ ) { s/\bMEND\b/.endm/; $n=0; } # ".rdata" doesn't work in 'as' version 2.13.2, as it is ".rodata" there. # if ( /\bAREA\b/ ) { my $align; $align = "2"; if ( /ALIGN=(\d+)/ ) { $align = $1; } if ( /CODE/ ) { $nxstack = 1; } s/^(.+)CODE(.+)READONLY(.*)/ .text/; s/^(.+)DATA(.+)READONLY(.*)/ .section .rdata/; s/^(.+)\|\|\.data\|\|(.+)/ .data/; s/^(.+)\|\|\.bss\|\|(.+)/ .bss/; s/$/; .p2align $align/; # Enable NEON instructions but don't produce a binary that requires # ARMv7. RVCT does not have equivalent directives, so we just do this # for all CODE areas. if ( /.text/ ) { # Separating .arch, .fpu, etc., by semicolons does not work (gas # thinks the semicolon is part of the arch name, even when there's # whitespace separating them). Sadly this means our line numbers # won't match the original source file (we could use the .line # directive, which is documented to be obsolete, but then gdb will # show the wrong line in the translated source file). s/$/; .arch armv7-a\n .fpu neon\n .object_arch armv4t/ unless ($apple); } } s/\|\|\.constdata\$(\d+)\|\|/.L_CONST$1/; # ||.constdata$3|| s/\|\|\.bss\$(\d+)\|\|/.L_BSS$1/; # ||.bss$2|| s/\|\|\.data\$(\d+)\|\|/.L_DATA$1/; # ||.data$2|| s/\|\|([a-zA-Z0-9_]+)\@([a-zA-Z0-9_]+)\|\|/@ $&/; s/^(\s+)\%(\s)/ .space $1/; s/\|(.+)\.(\d+)\|/\.$1_$2/; # |L80.123| -> .L80_123 s/\bCODE32\b/.code 32/ && do {$thumb = 0}; s/\bCODE16\b/.code 16/ && do {$thumb = 1}; if (/\bPROC\b/) { my $prefix; my $proc; /^([A-Za-z_\.]\w+)\b/; $proc = $1; $prefix = ""; if ($proc) { $prefix = $prefix.sprintf("\t.type\t%s, %%function", $proc) unless ($apple); # Make sure we $prefix isn't empty here (for the $apple case). # We handle mangling the label here, make sure it doesn't match # the label handling below (if $prefix would be empty). $prefix = $prefix."; "; push(@proc_stack, $proc); s/^[A-Za-z_\.]\w+/$symprefix$&:/; } $prefix = $prefix."\t.thumb_func; " if ($thumb); s/\bPROC\b/@ $&/; $_ = $prefix.$_; } s/^(\s*)(S|Q|SH|U|UQ|UH)ASX\b/$1$2ADDSUBX/; s/^(\s*)(S|Q|SH|U|UQ|UH)SAX\b/$1$2SUBADDX/; if (/\bENDP\b/) { my $proc; s/\bENDP\b/@ $&/; $proc = pop(@proc_stack); $_ = "\t.size $proc, .-$proc".$_ if ($proc && !$apple); } s/\bSUBT\b/@ $&/; s/\bDATA\b/@ $&/; # DATA directive is deprecated -- Asm guide, p.7-25 s/\bKEEP\b/@ $&/; s/\bEXPORTAS\b/@ $&/; s/\|\|(.)+\bEQU\b/@ $&/; s/\|\|([\w\$]+)\|\|/$1/; s/\bENTRY\b/@ $&/; s/\bASSERT\b/@ $&/; s/\bGBLL\b/@ $&/; s/\bGBLA\b/@ $&/; s/^\W+OPT\b/@ $&/; s/:OR:/|/g; s/:SHL:/<>/g; s/:AND:/&/g; s/:LAND:/&&/g; s/CPSR/cpsr/; s/SPSR/spsr/; s/ALIGN$/.balign 4/; s/ALIGN\s+([0-9x]+)$/.balign $1/; s/psr_cxsf/psr_all/; s/LTORG/.ltorg/; s/^([A-Za-z_]\w*)[ \t]+EQU/ .set $1,/; s/^([A-Za-z_]\w*)[ \t]+SETL/ .set $1,/; s/^([A-Za-z_]\w*)[ \t]+SETA/ .set $1,/; s/^([A-Za-z_]\w*)[ \t]+\*/ .set $1,/; # {PC} + 0xdeadfeed --> . + 0xdeadfeed s/\{PC\} \+/ \. +/; # Single hex constant on the line ! # # >>> NOTE <<< # Double-precision floats in gcc are always mixed-endian, which means # bytes in two words are little-endian, but words are big-endian. # So, 0x0000deadfeed0000 would be stored as 0x0000dead at low address # and 0xfeed0000 at high address. # s/\bDCFD\b[ \t]+0x([a-fA-F0-9]{8})([a-fA-F0-9]{8})/.long 0x$1, 0x$2/; # Only decimal constants on the line, no hex ! s/\bDCFD\b[ \t]+([0-9\.\-]+)/.double $1/; # Single hex constant on the line ! # s/\bDCFS\b[ \t]+0x([a-f0-9]{8})([a-f0-9]{8})/.long 0x$1, 0x$2/; # Only decimal constants on the line, no hex ! # s/\bDCFS\b[ \t]+([0-9\.\-]+)/.double $1/; s/\bDCFS[ \t]+0x/.word 0x/; s/\bDCFS\b/.float/; s/^([A-Za-z_]\w*)[ \t]+DCD/$1 .word/; s/\bDCD\b/.word/; s/^([A-Za-z_]\w*)[ \t]+DCW/$1 .short/; s/\bDCW\b/.short/; s/^([A-Za-z_]\w*)[ \t]+DCB/$1 .byte/; s/\bDCB\b/.byte/; s/^([A-Za-z_]\w*)[ \t]+\%/.comm $1,/; s/^[A-Za-z_\.]\w+/$&:/; s/^(\d+)/$1:/; s/\%(\d+)/$1b_or_f/; s/\%[Bb](\d+)/$1b/; s/\%[Ff](\d+)/$1f/; s/\%[Ff][Tt](\d+)/$1f/; s/&([\dA-Fa-f]+)/0x$1/; if ( /\b2_[01]+\b/ ) { s/\b2_([01]+)\b/conv$1&&&&/g; while ( /[01][01][01][01]&&&&/ ) { s/0000&&&&/&&&&0/g; s/0001&&&&/&&&&1/g; s/0010&&&&/&&&&2/g; s/0011&&&&/&&&&3/g; s/0100&&&&/&&&&4/g; s/0101&&&&/&&&&5/g; s/0110&&&&/&&&&6/g; s/0111&&&&/&&&&7/g; s/1000&&&&/&&&&8/g; s/1001&&&&/&&&&9/g; s/1010&&&&/&&&&A/g; s/1011&&&&/&&&&B/g; s/1100&&&&/&&&&C/g; s/1101&&&&/&&&&D/g; s/1110&&&&/&&&&E/g; s/1111&&&&/&&&&F/g; } s/000&&&&/&&&&0/g; s/001&&&&/&&&&1/g; s/010&&&&/&&&&2/g; s/011&&&&/&&&&3/g; s/100&&&&/&&&&4/g; s/101&&&&/&&&&5/g; s/110&&&&/&&&&6/g; s/111&&&&/&&&&7/g; s/00&&&&/&&&&0/g; s/01&&&&/&&&&1/g; s/10&&&&/&&&&2/g; s/11&&&&/&&&&3/g; s/0&&&&/&&&&0/g; s/1&&&&/&&&&1/g; s/conv&&&&/0x/g; } if ( /commandline/) { if( /-bigend/) { $bigend=1; } } if ( /\bDCDU\b/ ) { my $cmd=$_; my $value; my $prefix; my $w1; my $w2; my $w3; my $w4; s/\s+DCDU\b/@ $&/; $cmd =~ /\bDCDU\b\s+0x(\d+)/; $value = $1; $value =~ /(\w\w)(\w\w)(\w\w)(\w\w)/; $w1 = $1; $w2 = $2; $w3 = $3; $w4 = $4; if( $bigend ne "") { # big endian $prefix = "\t.byte\t0x".$w1.";". "\t.byte\t0x".$w2.";". "\t.byte\t0x".$w3.";". "\t.byte\t0x".$w4."; "; } else { # little endian $prefix = "\t.byte\t0x".$w4.";". "\t.byte\t0x".$w3.";". "\t.byte\t0x".$w2.";". "\t.byte\t0x".$w1."; "; } $_=$prefix.$_; } if ( /\badrl\b/i ) { s/\badrl\s+(\w+)\s*,\s*(\w+)/ldr $1,=$2/i; $addPadding = 1; } s/\bEND\b/@ END/; } continue { printf ("%s", $_) if $printit; if ($addPadding != 0) { printf (" mov r0,r0\n"); $addPadding = 0; } } #If we had a code section, mark that this object doesn't need an executable # stack. if ($nxstack && !$apple) { printf (" .section\t.note.GNU-stack,\"\",\%\%progbits\n"); } mumble-1.3.4/3rdparty/opus-src/celt/arm/fft_arm.h0000664000175000017500000000457414010707326021472 0ustar builderbuilder/* Copyright (c) 2015 Xiph.Org Foundation Written by Viswanath Puttagunta */ /** @file fft_arm.h @brief ARM Neon Intrinsic optimizations for fft using NE10 library */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if !defined(FFT_ARM_H) #define FFT_ARM_H #include "kiss_fft.h" #if defined(HAVE_ARM_NE10) int opus_fft_alloc_arm_neon(kiss_fft_state *st); void opus_fft_free_arm_neon(kiss_fft_state *st); void opus_fft_neon(const kiss_fft_state *st, const kiss_fft_cpx *fin, kiss_fft_cpx *fout); void opus_ifft_neon(const kiss_fft_state *st, const kiss_fft_cpx *fin, kiss_fft_cpx *fout); #if !defined(OPUS_HAVE_RTCD) #define OVERRIDE_OPUS_FFT (1) #define opus_fft_alloc_arch(_st, arch) \ ((void)(arch), opus_fft_alloc_arm_neon(_st)) #define opus_fft_free_arch(_st, arch) \ ((void)(arch), opus_fft_free_arm_neon(_st)) #define opus_fft(_st, _fin, _fout, arch) \ ((void)(arch), opus_fft_neon(_st, _fin, _fout)) #define opus_ifft(_st, _fin, _fout, arch) \ ((void)(arch), opus_ifft_neon(_st, _fin, _fout)) #endif /* OPUS_HAVE_RTCD */ #endif /* HAVE_ARM_NE10 */ #endif mumble-1.3.4/3rdparty/opus-src/celt/arm/mdct_arm.h0000664000175000017500000000507514010707326021637 0ustar builderbuilder/* Copyright (c) 2015 Xiph.Org Foundation Written by Viswanath Puttagunta */ /** @file arm_mdct.h @brief ARM Neon Intrinsic optimizations for mdct using NE10 library */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if !defined(MDCT_ARM_H) #define MDCT_ARM_H #include "mdct.h" #if defined(HAVE_ARM_NE10) /** Compute a forward MDCT and scale by 4/N, trashes the input array */ void clt_mdct_forward_neon(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar * OPUS_RESTRICT out, const opus_val16 *window, int overlap, int shift, int stride, int arch); void clt_mdct_backward_neon(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar * OPUS_RESTRICT out, const opus_val16 *window, int overlap, int shift, int stride, int arch); #if !defined(OPUS_HAVE_RTCD) #define OVERRIDE_OPUS_MDCT (1) #define clt_mdct_forward(_l, _in, _out, _window, _int, _shift, _stride, _arch) \ clt_mdct_forward_neon(_l, _in, _out, _window, _int, _shift, _stride, _arch) #define clt_mdct_backward(_l, _in, _out, _window, _int, _shift, _stride, _arch) \ clt_mdct_backward_neon(_l, _in, _out, _window, _int, _shift, _stride, _arch) #endif /* OPUS_HAVE_RTCD */ #endif /* HAVE_ARM_NE10 */ #endif mumble-1.3.4/3rdparty/opus-src/celt/arm/kiss_fft_armv4.h0000664000175000017500000001056114010707326022766 0ustar builderbuilder/*Copyright (c) 2013, Xiph.Org Foundation and contributors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.*/ #ifndef KISS_FFT_ARMv4_H #define KISS_FFT_ARMv4_H #if !defined(KISS_FFT_GUTS_H) #error "This file should only be included from _kiss_fft_guts.h" #endif #ifdef FIXED_POINT #undef C_MUL #define C_MUL(m,a,b) \ do{ \ int br__; \ int bi__; \ int tt__; \ __asm__ __volatile__( \ "#C_MUL\n\t" \ "ldrsh %[br], [%[bp], #0]\n\t" \ "ldm %[ap], {r0,r1}\n\t" \ "ldrsh %[bi], [%[bp], #2]\n\t" \ "smull %[tt], %[mi], r1, %[br]\n\t" \ "smlal %[tt], %[mi], r0, %[bi]\n\t" \ "rsb %[bi], %[bi], #0\n\t" \ "smull %[br], %[mr], r0, %[br]\n\t" \ "mov %[tt], %[tt], lsr #15\n\t" \ "smlal %[br], %[mr], r1, %[bi]\n\t" \ "orr %[mi], %[tt], %[mi], lsl #17\n\t" \ "mov %[br], %[br], lsr #15\n\t" \ "orr %[mr], %[br], %[mr], lsl #17\n\t" \ : [mr]"=r"((m).r), [mi]"=r"((m).i), \ [br]"=&r"(br__), [bi]"=r"(bi__), [tt]"=r"(tt__) \ : [ap]"r"(&(a)), [bp]"r"(&(b)) \ : "r0", "r1" \ ); \ } \ while(0) #undef C_MUL4 #define C_MUL4(m,a,b) \ do{ \ int br__; \ int bi__; \ int tt__; \ __asm__ __volatile__( \ "#C_MUL4\n\t" \ "ldrsh %[br], [%[bp], #0]\n\t" \ "ldm %[ap], {r0,r1}\n\t" \ "ldrsh %[bi], [%[bp], #2]\n\t" \ "smull %[tt], %[mi], r1, %[br]\n\t" \ "smlal %[tt], %[mi], r0, %[bi]\n\t" \ "rsb %[bi], %[bi], #0\n\t" \ "smull %[br], %[mr], r0, %[br]\n\t" \ "mov %[tt], %[tt], lsr #17\n\t" \ "smlal %[br], %[mr], r1, %[bi]\n\t" \ "orr %[mi], %[tt], %[mi], lsl #15\n\t" \ "mov %[br], %[br], lsr #17\n\t" \ "orr %[mr], %[br], %[mr], lsl #15\n\t" \ : [mr]"=r"((m).r), [mi]"=r"((m).i), \ [br]"=&r"(br__), [bi]"=r"(bi__), [tt]"=r"(tt__) \ : [ap]"r"(&(a)), [bp]"r"(&(b)) \ : "r0", "r1" \ ); \ } \ while(0) #undef C_MULC #define C_MULC(m,a,b) \ do{ \ int br__; \ int bi__; \ int tt__; \ __asm__ __volatile__( \ "#C_MULC\n\t" \ "ldrsh %[br], [%[bp], #0]\n\t" \ "ldm %[ap], {r0,r1}\n\t" \ "ldrsh %[bi], [%[bp], #2]\n\t" \ "smull %[tt], %[mr], r0, %[br]\n\t" \ "smlal %[tt], %[mr], r1, %[bi]\n\t" \ "rsb %[bi], %[bi], #0\n\t" \ "smull %[br], %[mi], r1, %[br]\n\t" \ "mov %[tt], %[tt], lsr #15\n\t" \ "smlal %[br], %[mi], r0, %[bi]\n\t" \ "orr %[mr], %[tt], %[mr], lsl #17\n\t" \ "mov %[br], %[br], lsr #15\n\t" \ "orr %[mi], %[br], %[mi], lsl #17\n\t" \ : [mr]"=r"((m).r), [mi]"=r"((m).i), \ [br]"=&r"(br__), [bi]"=r"(bi__), [tt]"=r"(tt__) \ : [ap]"r"(&(a)), [bp]"r"(&(b)) \ : "r0", "r1" \ ); \ } \ while(0) #endif /* FIXED_POINT */ #endif /* KISS_FFT_ARMv4_H */ mumble-1.3.4/3rdparty/opus-src/celt/arm/pitch_arm.h0000664000175000017500000001446314010707326022020 0ustar builderbuilder/* Copyright (c) 2010 Xiph.Org Foundation * Copyright (c) 2013 Parrot */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if !defined(PITCH_ARM_H) # define PITCH_ARM_H # include "armcpu.h" # if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) opus_val32 celt_inner_prod_neon(const opus_val16 *x, const opus_val16 *y, int N); void dual_inner_prod_neon(const opus_val16 *x, const opus_val16 *y01, const opus_val16 *y02, int N, opus_val32 *xy1, opus_val32 *xy2); # if !defined(OPUS_HAVE_RTCD) && defined(OPUS_ARM_PRESUME_NEON) # define OVERRIDE_CELT_INNER_PROD (1) # define OVERRIDE_DUAL_INNER_PROD (1) # define celt_inner_prod(x, y, N, arch) ((void)(arch), PRESUME_NEON(celt_inner_prod)(x, y, N)) # define dual_inner_prod(x, y01, y02, N, xy1, xy2, arch) ((void)(arch), PRESUME_NEON(dual_inner_prod)(x, y01, y02, N, xy1, xy2)) # endif # endif # if !defined(OVERRIDE_CELT_INNER_PROD) # if defined(OPUS_HAVE_RTCD) && (defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR)) extern opus_val32 (*const CELT_INNER_PROD_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *x, const opus_val16 *y, int N); # define OVERRIDE_CELT_INNER_PROD (1) # define celt_inner_prod(x, y, N, arch) ((*CELT_INNER_PROD_IMPL[(arch)&OPUS_ARCHMASK])(x, y, N)) # elif defined(OPUS_ARM_PRESUME_NEON_INTR) # define OVERRIDE_CELT_INNER_PROD (1) # define celt_inner_prod(x, y, N, arch) ((void)(arch), celt_inner_prod_neon(x, y, N)) # endif # endif # if !defined(OVERRIDE_DUAL_INNER_PROD) # if defined(OPUS_HAVE_RTCD) && (defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR)) extern void (*const DUAL_INNER_PROD_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *x, const opus_val16 *y01, const opus_val16 *y02, int N, opus_val32 *xy1, opus_val32 *xy2); # define OVERRIDE_DUAL_INNER_PROD (1) # define dual_inner_prod(x, y01, y02, N, xy1, xy2, arch) ((*DUAL_INNER_PROD_IMPL[(arch)&OPUS_ARCHMASK])(x, y01, y02, N, xy1, xy2)) # elif defined(OPUS_ARM_PRESUME_NEON_INTR) # define OVERRIDE_DUAL_INNER_PROD (1) # define dual_inner_prod(x, y01, y02, N, xy1, xy2, arch) ((void)(arch), dual_inner_prod_neon(x, y01, y02, N, xy1, xy2)) # endif # endif # if defined(FIXED_POINT) # if defined(OPUS_ARM_MAY_HAVE_NEON) opus_val32 celt_pitch_xcorr_neon(const opus_val16 *_x, const opus_val16 *_y, opus_val32 *xcorr, int len, int max_pitch, int arch); # endif # if defined(OPUS_ARM_MAY_HAVE_MEDIA) # define celt_pitch_xcorr_media MAY_HAVE_EDSP(celt_pitch_xcorr) # endif # if defined(OPUS_ARM_MAY_HAVE_EDSP) opus_val32 celt_pitch_xcorr_edsp(const opus_val16 *_x, const opus_val16 *_y, opus_val32 *xcorr, int len, int max_pitch, int arch); # endif # if defined(OPUS_HAVE_RTCD) && \ ((defined(OPUS_ARM_MAY_HAVE_NEON) && !defined(OPUS_ARM_PRESUME_NEON)) || \ (defined(OPUS_ARM_MAY_HAVE_MEDIA) && !defined(OPUS_ARM_PRESUME_MEDIA)) || \ (defined(OPUS_ARM_MAY_HAVE_EDSP) && !defined(OPUS_ARM_PRESUME_EDSP))) extern opus_val32 (*const CELT_PITCH_XCORR_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *, const opus_val16 *, opus_val32 *, int, int, int); # define OVERRIDE_PITCH_XCORR (1) # define celt_pitch_xcorr (*CELT_PITCH_XCORR_IMPL[(arch)&OPUS_ARCHMASK]) # elif defined(OPUS_ARM_PRESUME_EDSP) || \ defined(OPUS_ARM_PRESUME_MEDIA) || \ defined(OPUS_ARM_PRESUME_NEON) # define OVERRIDE_PITCH_XCORR (1) # define celt_pitch_xcorr (PRESUME_NEON(celt_pitch_xcorr)) # endif # if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) void xcorr_kernel_neon_fixed( const opus_val16 *x, const opus_val16 *y, opus_val32 sum[4], int len); # endif # if defined(OPUS_HAVE_RTCD) && \ (defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR)) extern void (*const XCORR_KERNEL_IMPL[OPUS_ARCHMASK + 1])( const opus_val16 *x, const opus_val16 *y, opus_val32 sum[4], int len); # define OVERRIDE_XCORR_KERNEL (1) # define xcorr_kernel(x, y, sum, len, arch) \ ((*XCORR_KERNEL_IMPL[(arch) & OPUS_ARCHMASK])(x, y, sum, len)) # elif defined(OPUS_ARM_PRESUME_NEON_INTR) # define OVERRIDE_XCORR_KERNEL (1) # define xcorr_kernel(x, y, sum, len, arch) \ ((void)arch, xcorr_kernel_neon_fixed(x, y, sum, len)) # endif #else /* Start !FIXED_POINT */ /* Float case */ #if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) void celt_pitch_xcorr_float_neon(const opus_val16 *_x, const opus_val16 *_y, opus_val32 *xcorr, int len, int max_pitch, int arch); #endif # if defined(OPUS_HAVE_RTCD) && \ (defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR)) extern void (*const CELT_PITCH_XCORR_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *, const opus_val16 *, opus_val32 *, int, int, int); # define OVERRIDE_PITCH_XCORR (1) # define celt_pitch_xcorr (*CELT_PITCH_XCORR_IMPL[(arch)&OPUS_ARCHMASK]) # elif defined(OPUS_ARM_PRESUME_NEON_INTR) # define OVERRIDE_PITCH_XCORR (1) # define celt_pitch_xcorr celt_pitch_xcorr_float_neon # endif #endif /* end !FIXED_POINT */ #endif mumble-1.3.4/3rdparty/opus-src/celt/kiss_fft.h0000664000175000017500000001422714010707327021102 0ustar builderbuilder/*Copyright (c) 2003-2004, Mark Borgerding Lots of modifications by Jean-Marc Valin Copyright (c) 2005-2007, Xiph.Org Foundation Copyright (c) 2008, Xiph.Org Foundation, CSIRO All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.*/ #ifndef KISS_FFT_H #define KISS_FFT_H #include #include #include "arch.h" #include "cpu_support.h" #ifdef __cplusplus extern "C" { #endif #ifdef USE_SIMD # include # define kiss_fft_scalar __m128 #define KISS_FFT_MALLOC(nbytes) memalign(16,nbytes) #else #define KISS_FFT_MALLOC opus_alloc #endif #ifdef FIXED_POINT #include "arch.h" # define kiss_fft_scalar opus_int32 # define kiss_twiddle_scalar opus_int16 #else # ifndef kiss_fft_scalar /* default is float */ # define kiss_fft_scalar float # define kiss_twiddle_scalar float # define KF_SUFFIX _celt_single # endif #endif typedef struct { kiss_fft_scalar r; kiss_fft_scalar i; }kiss_fft_cpx; typedef struct { kiss_twiddle_scalar r; kiss_twiddle_scalar i; }kiss_twiddle_cpx; #define MAXFACTORS 8 /* e.g. an fft of length 128 has 4 factors as far as kissfft is concerned 4*4*4*2 */ typedef struct arch_fft_state{ int is_supported; void *priv; } arch_fft_state; typedef struct kiss_fft_state{ int nfft; opus_val16 scale; #ifdef FIXED_POINT int scale_shift; #endif int shift; opus_int16 factors[2*MAXFACTORS]; const opus_int16 *bitrev; const kiss_twiddle_cpx *twiddles; arch_fft_state *arch_fft; } kiss_fft_state; #if defined(HAVE_ARM_NE10) #include "arm/fft_arm.h" #endif /*typedef struct kiss_fft_state* kiss_fft_cfg;*/ /** * opus_fft_alloc * * Initialize a FFT (or IFFT) algorithm's cfg/state buffer. * * typical usage: kiss_fft_cfg mycfg=opus_fft_alloc(1024,0,NULL,NULL); * * The return value from fft_alloc is a cfg buffer used internally * by the fft routine or NULL. * * If lenmem is NULL, then opus_fft_alloc will allocate a cfg buffer using malloc. * The returned value should be free()d when done to avoid memory leaks. * * The state can be placed in a user supplied buffer 'mem': * If lenmem is not NULL and mem is not NULL and *lenmem is large enough, * then the function places the cfg in mem and the size used in *lenmem * and returns mem. * * If lenmem is not NULL and ( mem is NULL or *lenmem is not large enough), * then the function returns NULL and places the minimum cfg * buffer size in *lenmem. * */ kiss_fft_state *opus_fft_alloc_twiddles(int nfft,void * mem,size_t * lenmem, const kiss_fft_state *base, int arch); kiss_fft_state *opus_fft_alloc(int nfft,void * mem,size_t * lenmem, int arch); /** * opus_fft(cfg,in_out_buf) * * Perform an FFT on a complex input buffer. * for a forward FFT, * fin should be f[0] , f[1] , ... ,f[nfft-1] * fout will be F[0] , F[1] , ... ,F[nfft-1] * Note that each element is complex and can be accessed like f[k].r and f[k].i * */ void opus_fft_c(const kiss_fft_state *cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout); void opus_ifft_c(const kiss_fft_state *cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout); void opus_fft_impl(const kiss_fft_state *st,kiss_fft_cpx *fout); void opus_ifft_impl(const kiss_fft_state *st,kiss_fft_cpx *fout); void opus_fft_free(const kiss_fft_state *cfg, int arch); void opus_fft_free_arch_c(kiss_fft_state *st); int opus_fft_alloc_arch_c(kiss_fft_state *st); #if !defined(OVERRIDE_OPUS_FFT) /* Is run-time CPU detection enabled on this platform? */ #if defined(OPUS_HAVE_RTCD) && (defined(HAVE_ARM_NE10)) extern int (*const OPUS_FFT_ALLOC_ARCH_IMPL[OPUS_ARCHMASK+1])( kiss_fft_state *st); #define opus_fft_alloc_arch(_st, arch) \ ((*OPUS_FFT_ALLOC_ARCH_IMPL[(arch)&OPUS_ARCHMASK])(_st)) extern void (*const OPUS_FFT_FREE_ARCH_IMPL[OPUS_ARCHMASK+1])( kiss_fft_state *st); #define opus_fft_free_arch(_st, arch) \ ((*OPUS_FFT_FREE_ARCH_IMPL[(arch)&OPUS_ARCHMASK])(_st)) extern void (*const OPUS_FFT[OPUS_ARCHMASK+1])(const kiss_fft_state *cfg, const kiss_fft_cpx *fin, kiss_fft_cpx *fout); #define opus_fft(_cfg, _fin, _fout, arch) \ ((*OPUS_FFT[(arch)&OPUS_ARCHMASK])(_cfg, _fin, _fout)) extern void (*const OPUS_IFFT[OPUS_ARCHMASK+1])(const kiss_fft_state *cfg, const kiss_fft_cpx *fin, kiss_fft_cpx *fout); #define opus_ifft(_cfg, _fin, _fout, arch) \ ((*OPUS_IFFT[(arch)&OPUS_ARCHMASK])(_cfg, _fin, _fout)) #else /* else for if defined(OPUS_HAVE_RTCD) && (defined(HAVE_ARM_NE10)) */ #define opus_fft_alloc_arch(_st, arch) \ ((void)(arch), opus_fft_alloc_arch_c(_st)) #define opus_fft_free_arch(_st, arch) \ ((void)(arch), opus_fft_free_arch_c(_st)) #define opus_fft(_cfg, _fin, _fout, arch) \ ((void)(arch), opus_fft_c(_cfg, _fin, _fout)) #define opus_ifft(_cfg, _fin, _fout, arch) \ ((void)(arch), opus_ifft_c(_cfg, _fin, _fout)) #endif /* end if defined(OPUS_HAVE_RTCD) && (defined(HAVE_ARM_NE10)) */ #endif /* end if !defined(OVERRIDE_OPUS_FFT) */ #ifdef __cplusplus } #endif #endif mumble-1.3.4/3rdparty/opus-src/celt/vq.c0000664000175000017500000003106214010707327017707 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "mathops.h" #include "cwrs.h" #include "vq.h" #include "arch.h" #include "os_support.h" #include "bands.h" #include "rate.h" #include "pitch.h" #ifndef OVERRIDE_vq_exp_rotation1 static void exp_rotation1(celt_norm *X, int len, int stride, opus_val16 c, opus_val16 s) { int i; opus_val16 ms; celt_norm *Xptr; Xptr = X; ms = NEG16(s); for (i=0;i=0;i--) { celt_norm x1, x2; x1 = Xptr[0]; x2 = Xptr[stride]; Xptr[stride] = EXTRACT16(PSHR32(MAC16_16(MULT16_16(c, x2), s, x1), 15)); *Xptr-- = EXTRACT16(PSHR32(MAC16_16(MULT16_16(c, x1), ms, x2), 15)); } } #endif /* OVERRIDE_vq_exp_rotation1 */ void exp_rotation(celt_norm *X, int len, int dir, int stride, int K, int spread) { static const int SPREAD_FACTOR[3]={15,10,5}; int i; opus_val16 c, s; opus_val16 gain, theta; int stride2=0; int factor; if (2*K>=len || spread==SPREAD_NONE) return; factor = SPREAD_FACTOR[spread-1]; gain = celt_div((opus_val32)MULT16_16(Q15_ONE,len),(opus_val32)(len+factor*K)); theta = HALF16(MULT16_16_Q15(gain,gain)); c = celt_cos_norm(EXTEND32(theta)); s = celt_cos_norm(EXTEND32(SUB16(Q15ONE,theta))); /* sin(theta) */ if (len>=8*stride) { stride2 = 1; /* This is just a simple (equivalent) way of computing sqrt(len/stride) with rounding. It's basically incrementing long as (stride2+0.5)^2 < len/stride. */ while ((stride2*stride2+stride2)*stride + (stride>>2) < len) stride2++; } /*NOTE: As a minor optimization, we could be passing around log2(B), not B, for both this and for extract_collapse_mask().*/ len = celt_udiv(len, stride); for (i=0;i>1; #endif t = VSHR32(Ryy, 2*(k-7)); g = MULT16_16_P15(celt_rsqrt_norm(t),gain); i=0; do X[i] = EXTRACT16(PSHR32(MULT16_16(g, iy[i]), k+1)); while (++i < N); } static unsigned extract_collapse_mask(int *iy, int N, int B) { unsigned collapse_mask; int N0; int i; if (B<=1) return 1; /*NOTE: As a minor optimization, we could be passing around log2(B), not B, for both this and for exp_rotation().*/ N0 = celt_udiv(N, B); collapse_mask = 0; i=0; do { int j; unsigned tmp=0; j=0; do { tmp |= iy[i*N0+j]; } while (++j (N>>1)) { opus_val16 rcp; j=0; do { sum += X[j]; } while (++j EPSILON && sum < 64)) #endif { X[0] = QCONST16(1.f,14); j=1; do X[j]=0; while (++j=0, "Allocated too many pulses in the quick pass"); /* This should never happen, but just in case it does (e.g. on silence) we fill the first bin with pulses. */ #ifdef FIXED_POINT_DEBUG celt_assert2(pulsesLeft<=N+3, "Not enough pulses in the quick pass"); #endif if (pulsesLeft > N+3) { opus_val16 tmp = (opus_val16)pulsesLeft; yy = MAC16_16(yy, tmp, tmp); yy = MAC16_16(yy, tmp, y[0]); iy[0] += pulsesLeft; pulsesLeft=0; } for (i=0;i= best_num/best_den, but that way we can do it without any division */ /* OPT: It's not clear whether a cmov is faster than a branch here since the condition is more often false than true and using a cmov introduces data dependencies across iterations. The optimal choice may be architecture-dependent. */ if (opus_unlikely(MULT16_16(best_den, Rxy) > MULT16_16(Ryy, best_num))) { best_den = Ryy; best_num = Rxy; best_id = j; } } while (++j0, "alg_quant() needs at least one pulse"); celt_assert2(N>1, "alg_quant() needs at least two dimensions"); /* Covers vectorization by up to 4. */ ALLOC(iy, N+3, int); exp_rotation(X, N, 1, B, K, spread); yy = op_pvq_search(X, iy, K, N, arch); encode_pulses(iy, N, K, enc); if (resynth) { normalise_residual(iy, X, N, yy, gain); exp_rotation(X, N, -1, B, K, spread); } collapse_mask = extract_collapse_mask(iy, N, B); RESTORE_STACK; return collapse_mask; } /** Decode pulse vector and combine the result with the pitch vector to produce the final normalised signal in the current band. */ unsigned alg_unquant(celt_norm *X, int N, int K, int spread, int B, ec_dec *dec, opus_val16 gain) { opus_val32 Ryy; unsigned collapse_mask; VARDECL(int, iy); SAVE_STACK; celt_assert2(K>0, "alg_unquant() needs at least one pulse"); celt_assert2(N>1, "alg_unquant() needs at least two dimensions"); ALLOC(iy, N, int); Ryy = decode_pulses(iy, N, K, dec); normalise_residual(iy, X, N, Ryy, gain); exp_rotation(X, N, -1, B, K, spread); collapse_mask = extract_collapse_mask(iy, N, B); RESTORE_STACK; return collapse_mask; } #ifndef OVERRIDE_renormalise_vector void renormalise_vector(celt_norm *X, int N, opus_val16 gain, int arch) { int i; #ifdef FIXED_POINT int k; #endif opus_val32 E; opus_val16 g; opus_val32 t; celt_norm *xptr; E = EPSILON + celt_inner_prod(X, X, N, arch); #ifdef FIXED_POINT k = celt_ilog2(E)>>1; #endif t = VSHR32(E, 2*(k-7)); g = MULT16_16_P15(celt_rsqrt_norm(t),gain); xptr = X; for (i=0;i #include "bands.h" #include "modes.h" #include "vq.h" #include "cwrs.h" #include "stack_alloc.h" #include "os_support.h" #include "mathops.h" #include "rate.h" #include "quant_bands.h" #include "pitch.h" int hysteresis_decision(opus_val16 val, const opus_val16 *thresholds, const opus_val16 *hysteresis, int N, int prev) { int i; for (i=0;iprev && val < thresholds[prev]+hysteresis[prev]) i=prev; if (i thresholds[prev-1]-hysteresis[prev-1]) i=prev; return i; } opus_uint32 celt_lcg_rand(opus_uint32 seed) { return 1664525 * seed + 1013904223; } /* This is a cos() approximation designed to be bit-exact on any platform. Bit exactness with this approximation is important because it has an impact on the bit allocation */ opus_int16 bitexact_cos(opus_int16 x) { opus_int32 tmp; opus_int16 x2; tmp = (4096+((opus_int32)(x)*(x)))>>13; celt_assert(tmp<=32767); x2 = tmp; x2 = (32767-x2) + FRAC_MUL16(x2, (-7651 + FRAC_MUL16(x2, (8277 + FRAC_MUL16(-626, x2))))); celt_assert(x2<=32766); return 1+x2; } int bitexact_log2tan(int isin,int icos) { int lc; int ls; lc=EC_ILOG(icos); ls=EC_ILOG(isin); icos<<=15-lc; isin<<=15-ls; return (ls-lc)*(1<<11) +FRAC_MUL16(isin, FRAC_MUL16(isin, -2597) + 7932) -FRAC_MUL16(icos, FRAC_MUL16(icos, -2597) + 7932); } #ifdef FIXED_POINT /* Compute the amplitude (sqrt energy) in each of the bands */ void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *bandE, int end, int C, int LM, int arch) { int i, c, N; const opus_int16 *eBands = m->eBands; (void)arch; N = m->shortMdctSize< 0) { int shift = celt_ilog2(maxval) - 14 + (((m->logN[i]>>BITRES)+LM+1)>>1); j=eBands[i]<0) { do { sum = MAC16_16(sum, EXTRACT16(SHR32(X[j+c*N],shift)), EXTRACT16(SHR32(X[j+c*N],shift))); } while (++jnbEBands] = EPSILON+VSHR32(EXTEND32(celt_sqrt(sum)),-shift); } else { bandE[i+c*m->nbEBands] = EPSILON; } /*printf ("%f ", bandE[i+c*m->nbEBands]);*/ } } while (++ceBands; N = M*m->shortMdctSize; c=0; do { i=0; do { opus_val16 g; int j,shift; opus_val16 E; shift = celt_zlog2(bandE[i+c*m->nbEBands])-13; E = VSHR32(bandE[i+c*m->nbEBands], shift); g = EXTRACT16(celt_rcp(SHL32(E,3))); j=M*eBands[i]; do { X[j+c*N] = MULT16_16_Q15(VSHR32(freq[j+c*N],shift-1),g); } while (++jeBands; N = m->shortMdctSize<nbEBands] = celt_sqrt(sum); /*printf ("%f ", bandE[i+c*m->nbEBands]);*/ } } while (++ceBands; N = M*m->shortMdctSize; c=0; do { for (i=0;inbEBands]); for (j=M*eBands[i];jeBands; N = M*m->shortMdctSize; bound = M*eBands[end]; if (downsample!=1) bound = IMIN(bound, N/downsample); if (silence) { bound = 0; start = end = 0; } f = freq; x = X+M*eBands[start]; for (i=0;i>DB_SHIFT); if (shift>31) { shift=0; g=0; } else { /* Handle the fractional part. */ g = celt_exp2_frac(lg&((1< 16384 we'd be likely to overflow, so we're capping the gain here, which is equivalent to a cap of 18 on lg. This shouldn't trigger unless the bitstream is already corrupted. */ if (shift <= -2) { g = 16384; shift = -2; } do { *f++ = SHL32(MULT16_16(*x++, g), -shift); } while (++jeBands[i+1]-m->eBands[i]; /* depth in 1/8 bits */ celt_assert(pulses[i]>=0); depth = celt_udiv(1+pulses[i], (m->eBands[i+1]-m->eBands[i]))>>LM; #ifdef FIXED_POINT thresh32 = SHR32(celt_exp2(-SHL16(depth, 10-BITRES)),1); thresh = MULT16_32_Q15(QCONST16(0.5f, 15), MIN32(32767,thresh32)); { opus_val32 t; t = N0<>1; t = SHL32(t, (7-shift)<<1); sqrt_1 = celt_rsqrt_norm(t); } #else thresh = .5f*celt_exp2(-.125f*depth); sqrt_1 = celt_rsqrt(N0<nbEBands+i]; prev2 = prev2logE[c*m->nbEBands+i]; if (C==1) { prev1 = MAX16(prev1,prev1logE[m->nbEBands+i]); prev2 = MAX16(prev2,prev2logE[m->nbEBands+i]); } Ediff = EXTEND32(logE[c*m->nbEBands+i])-EXTEND32(MIN16(prev1,prev2)); Ediff = MAX32(0, Ediff); #ifdef FIXED_POINT if (Ediff < 16384) { opus_val32 r32 = SHR32(celt_exp2(-EXTRACT16(Ediff)),1); r = 2*MIN16(16383,r32); } else { r = 0; } if (LM==3) r = MULT16_16_Q14(23170, MIN32(23169, r)); r = SHR16(MIN16(thresh, r),1); r = SHR32(MULT16_16_Q15(sqrt_1, r),shift); #else /* r needs to be multiplied by 2 or 2*sqrt(2) depending on LM because short blocks don't have the same energy as long */ r = 2.f*celt_exp2(-Ediff); if (LM==3) r *= 1.41421356f; r = MIN16(thresh, r); r = r*sqrt_1; #endif X = X_+c*size+(m->eBands[i]<nbEBands]))-13; #endif left = VSHR32(bandE[i],shift); right = VSHR32(bandE[i+m->nbEBands],shift); norm = EPSILON + celt_sqrt(EPSILON+MULT16_16(left,left)+MULT16_16(right,right)); a1 = DIV32_16(SHL32(EXTEND32(left),14),norm); a2 = DIV32_16(SHL32(EXTEND32(right),14),norm); for (j=0;j>1; kr = celt_ilog2(Er)>>1; #endif t = VSHR32(El, (kl-7)<<1); lgain = celt_rsqrt_norm(t); t = VSHR32(Er, (kr-7)<<1); rgain = celt_rsqrt_norm(t); #ifdef FIXED_POINT if (kl < 7) kl = 7; if (kr < 7) kr = 7; #endif for (j=0;jeBands; int decision; int hf_sum=0; celt_assert(end>0); N0 = M*m->shortMdctSize; if (M*(eBands[end]-eBands[end-1]) <= 8) return SPREAD_NONE; c=0; do { for (i=0;im->nbEBands-4) hf_sum += celt_udiv(32*(tcount[1]+tcount[0]), N); tmp = (2*tcount[2] >= N) + (2*tcount[1] >= N) + (2*tcount[0] >= N); sum += tmp*256; nbBands++; } } while (++cnbEBands+end)); *hf_average = (*hf_average+hf_sum)>>1; hf_sum = *hf_average; if (*tapset_decision==2) hf_sum += 4; else if (*tapset_decision==0) hf_sum -= 4; if (hf_sum > 22) *tapset_decision=2; else if (hf_sum > 18) *tapset_decision=1; else *tapset_decision=0; } /*printf("%d %d %d\n", hf_sum, *hf_average, *tapset_decision);*/ celt_assert(nbBands>0); /* end has to be non-zero */ celt_assert(sum>=0); sum = celt_udiv(sum, nbBands); /* Recursive averaging */ sum = (sum+*average)>>1; *average = sum; /* Hysteresis */ sum = (3*sum + (((3-last_decision)<<7) + 64) + 2)>>2; if (sum < 80) { decision = SPREAD_AGGRESSIVE; } else if (sum < 256) { decision = SPREAD_NORMAL; } else if (sum < 384) { decision = SPREAD_LIGHT; } else { decision = SPREAD_NONE; } #ifdef FUZZING decision = rand()&0x3; *tapset_decision=rand()%3; #endif return decision; } /* Indexing table for converting from natural Hadamard to ordery Hadamard This is essentially a bit-reversed Gray, on top of which we've added an inversion of the order because we want the DC at the end rather than the beginning. The lines are for N=2, 4, 8, 16 */ static const int ordery_table[] = { 1, 0, 3, 0, 2, 1, 7, 0, 4, 3, 6, 1, 5, 2, 15, 0, 8, 7, 12, 3, 11, 4, 14, 1, 9, 6, 13, 2, 10, 5, }; static void deinterleave_hadamard(celt_norm *X, int N0, int stride, int hadamard) { int i,j; VARDECL(celt_norm, tmp); int N; SAVE_STACK; N = N0*stride; ALLOC(tmp, N, celt_norm); celt_assert(stride>0); if (hadamard) { const int *ordery = ordery_table+stride-2; for (i=0;i>= 1; for (i=0;i>1)) { qn = 1; } else { qn = exp2_table8[qb&0x7]>>(14-(qb>>BITRES)); qn = (qn+1)>>1<<1; } celt_assert(qn <= 256); return qn; } struct band_ctx { int encode; int resynth; const CELTMode *m; int i; int intensity; int spread; int tf_change; ec_ctx *ec; opus_int32 remaining_bits; const celt_ener *bandE; opus_uint32 seed; int arch; int theta_round; int disable_inv; int avoid_split_noise; }; struct split_ctx { int inv; int imid; int iside; int delta; int itheta; int qalloc; }; static void compute_theta(struct band_ctx *ctx, struct split_ctx *sctx, celt_norm *X, celt_norm *Y, int N, int *b, int B, int B0, int LM, int stereo, int *fill) { int qn; int itheta=0; int delta; int imid, iside; int qalloc; int pulse_cap; int offset; opus_int32 tell; int inv=0; int encode; const CELTMode *m; int i; int intensity; ec_ctx *ec; const celt_ener *bandE; encode = ctx->encode; m = ctx->m; i = ctx->i; intensity = ctx->intensity; ec = ctx->ec; bandE = ctx->bandE; /* Decide on the resolution to give to the split parameter theta */ pulse_cap = m->logN[i]+LM*(1<>1) - (stereo&&N==2 ? QTHETA_OFFSET_TWOPHASE : QTHETA_OFFSET); qn = compute_qn(N, *b, offset, pulse_cap, stereo); if (stereo && i>=intensity) qn = 1; if (encode) { /* theta is the atan() of the ratio between the (normalized) side and mid. With just that parameter, we can re-scale both mid and side because we know that 1) they have unit norm and 2) they are orthogonal. */ itheta = stereo_itheta(X, Y, stereo, N, ctx->arch); } tell = ec_tell_frac(ec); if (qn!=1) { if (encode) { if (!stereo || ctx->theta_round == 0) { itheta = (itheta*(opus_int32)qn+8192)>>14; if (!stereo && ctx->avoid_split_noise && itheta > 0 && itheta < qn) { /* Check if the selected value of theta will cause the bit allocation to inject noise on one side. If so, make sure the energy of that side is zero. */ int unquantized = celt_udiv((opus_int32)itheta*16384, qn); imid = bitexact_cos((opus_int16)unquantized); iside = bitexact_cos((opus_int16)(16384-unquantized)); delta = FRAC_MUL16((N-1)<<7,bitexact_log2tan(iside,imid)); if (delta > *b) itheta = qn; else if (delta < -*b) itheta = 0; } } else { int down; /* Bias quantization towards itheta=0 and itheta=16384. */ int bias = itheta > 8192 ? 32767/qn : -32767/qn; down = IMIN(qn-1, IMAX(0, (itheta*(opus_int32)qn + bias)>>14)); if (ctx->theta_round < 0) itheta = down; else itheta = down+1; } } /* Entropy coding of the angle. We use a uniform pdf for the time split, a step for stereo, and a triangular one for the rest. */ if (stereo && N>2) { int p0 = 3; int x = itheta; int x0 = qn/2; int ft = p0*(x0+1) + x0; /* Use a probability of p0 up to itheta=8192 and then use 1 after */ if (encode) { ec_encode(ec,x<=x0?p0*x:(x-1-x0)+(x0+1)*p0,x<=x0?p0*(x+1):(x-x0)+(x0+1)*p0,ft); } else { int fs; fs=ec_decode(ec,ft); if (fs<(x0+1)*p0) x=fs/p0; else x=x0+1+(fs-(x0+1)*p0); ec_dec_update(ec,x<=x0?p0*x:(x-1-x0)+(x0+1)*p0,x<=x0?p0*(x+1):(x-x0)+(x0+1)*p0,ft); itheta = x; } } else if (B0>1 || stereo) { /* Uniform pdf */ if (encode) ec_enc_uint(ec, itheta, qn+1); else itheta = ec_dec_uint(ec, qn+1); } else { int fs=1, ft; ft = ((qn>>1)+1)*((qn>>1)+1); if (encode) { int fl; fs = itheta <= (qn>>1) ? itheta + 1 : qn + 1 - itheta; fl = itheta <= (qn>>1) ? itheta*(itheta + 1)>>1 : ft - ((qn + 1 - itheta)*(qn + 2 - itheta)>>1); ec_encode(ec, fl, fl+fs, ft); } else { /* Triangular pdf */ int fl=0; int fm; fm = ec_decode(ec, ft); if (fm < ((qn>>1)*((qn>>1) + 1)>>1)) { itheta = (isqrt32(8*(opus_uint32)fm + 1) - 1)>>1; fs = itheta + 1; fl = itheta*(itheta + 1)>>1; } else { itheta = (2*(qn + 1) - isqrt32(8*(opus_uint32)(ft - fm - 1) + 1))>>1; fs = qn + 1 - itheta; fl = ft - ((qn + 1 - itheta)*(qn + 2 - itheta)>>1); } ec_dec_update(ec, fl, fl+fs, ft); } } celt_assert(itheta>=0); itheta = celt_udiv((opus_int32)itheta*16384, qn); if (encode && stereo) { if (itheta==0) intensity_stereo(m, X, Y, bandE, i, N); else stereo_split(X, Y, N); } /* NOTE: Renormalising X and Y *may* help fixed-point a bit at very high rate. Let's do that at higher complexity */ } else if (stereo) { if (encode) { inv = itheta > 8192 && !ctx->disable_inv; if (inv) { int j; for (j=0;j2<remaining_bits > 2<disable_inv) inv = 0; itheta = 0; } qalloc = ec_tell_frac(ec) - tell; *b -= qalloc; if (itheta == 0) { imid = 32767; iside = 0; *fill &= (1<inv = inv; sctx->imid = imid; sctx->iside = iside; sctx->delta = delta; sctx->itheta = itheta; sctx->qalloc = qalloc; } static unsigned quant_band_n1(struct band_ctx *ctx, celt_norm *X, celt_norm *Y, int b, celt_norm *lowband_out) { int c; int stereo; celt_norm *x = X; int encode; ec_ctx *ec; encode = ctx->encode; ec = ctx->ec; stereo = Y != NULL; c=0; do { int sign=0; if (ctx->remaining_bits>=1<remaining_bits -= 1<resynth) x[0] = sign ? -NORM_SCALING : NORM_SCALING; x = Y; } while (++c<1+stereo); if (lowband_out) lowband_out[0] = SHR16(X[0],4); return 1; } /* This function is responsible for encoding and decoding a mono partition. It can split the band in two and transmit the energy difference with the two half-bands. It can be called recursively so bands can end up being split in 8 parts. */ static unsigned quant_partition(struct band_ctx *ctx, celt_norm *X, int N, int b, int B, celt_norm *lowband, int LM, opus_val16 gain, int fill) { const unsigned char *cache; int q; int curr_bits; int imid=0, iside=0; int B0=B; opus_val16 mid=0, side=0; unsigned cm=0; celt_norm *Y=NULL; int encode; const CELTMode *m; int i; int spread; ec_ctx *ec; encode = ctx->encode; m = ctx->m; i = ctx->i; spread = ctx->spread; ec = ctx->ec; /* If we need 1.5 more bit than we can produce, split the band in two. */ cache = m->cache.bits + m->cache.index[(LM+1)*m->nbEBands+i]; if (LM != -1 && b > cache[cache[0]]+12 && N>2) { int mbits, sbits, delta; int itheta; int qalloc; struct split_ctx sctx; celt_norm *next_lowband2=NULL; opus_int32 rebalance; N >>= 1; Y = X+N; LM -= 1; if (B==1) fill = (fill&1)|(fill<<1); B = (B+1)>>1; compute_theta(ctx, &sctx, X, Y, N, &b, B, B0, LM, 0, &fill); imid = sctx.imid; iside = sctx.iside; delta = sctx.delta; itheta = sctx.itheta; qalloc = sctx.qalloc; #ifdef FIXED_POINT mid = imid; side = iside; #else mid = (1.f/32768)*imid; side = (1.f/32768)*iside; #endif /* Give more bits to low-energy MDCTs than they would otherwise deserve */ if (B0>1 && (itheta&0x3fff)) { if (itheta > 8192) /* Rough approximation for pre-echo masking */ delta -= delta>>(4-LM); else /* Corresponds to a forward-masking slope of 1.5 dB per 10 ms */ delta = IMIN(0, delta + (N<>(5-LM))); } mbits = IMAX(0, IMIN(b, (b-delta)/2)); sbits = b-mbits; ctx->remaining_bits -= qalloc; if (lowband) next_lowband2 = lowband+N; /* >32-bit split case */ rebalance = ctx->remaining_bits; if (mbits >= sbits) { cm = quant_partition(ctx, X, N, mbits, B, lowband, LM, MULT16_16_P15(gain,mid), fill); rebalance = mbits - (rebalance-ctx->remaining_bits); if (rebalance > 3<>B)<<(B0>>1); } else { cm = quant_partition(ctx, Y, N, sbits, B, next_lowband2, LM, MULT16_16_P15(gain,side), fill>>B)<<(B0>>1); rebalance = sbits - (rebalance-ctx->remaining_bits); if (rebalance > 3<remaining_bits -= curr_bits; /* Ensures we can never bust the budget */ while (ctx->remaining_bits < 0 && q > 0) { ctx->remaining_bits += curr_bits; q--; curr_bits = pulses2bits(m, i, LM, q); ctx->remaining_bits -= curr_bits; } if (q!=0) { int K = get_pulses(q); /* Finally do the actual quantization */ if (encode) { cm = alg_quant(X, N, K, spread, B, ec, gain, ctx->resynth, ctx->arch); } else { cm = alg_unquant(X, N, K, spread, B, ec, gain); } } else { /* If there's no pulse, fill the band anyway */ int j; if (ctx->resynth) { unsigned cm_mask; /* B can be as large as 16, so this shift might overflow an int on a 16-bit platform; use a long to get defined behavior.*/ cm_mask = (unsigned)(1UL<seed = celt_lcg_rand(ctx->seed); X[j] = (celt_norm)((opus_int32)ctx->seed>>20); } cm = cm_mask; } else { /* Folded spectrum */ for (j=0;jseed = celt_lcg_rand(ctx->seed); /* About 48 dB below the "normal" folding level */ tmp = QCONST16(1.0f/256, 10); tmp = (ctx->seed)&0x8000 ? tmp : -tmp; X[j] = lowband[j]+tmp; } cm = fill; } renormalise_vector(X, N, gain, ctx->arch); } } } } return cm; } /* This function is responsible for encoding and decoding a band for the mono case. */ static unsigned quant_band(struct band_ctx *ctx, celt_norm *X, int N, int b, int B, celt_norm *lowband, int LM, celt_norm *lowband_out, opus_val16 gain, celt_norm *lowband_scratch, int fill) { int N0=N; int N_B=N; int N_B0; int B0=B; int time_divide=0; int recombine=0; int longBlocks; unsigned cm=0; int k; int encode; int tf_change; encode = ctx->encode; tf_change = ctx->tf_change; longBlocks = B0==1; N_B = celt_udiv(N_B, B); /* Special case for one sample */ if (N==1) { return quant_band_n1(ctx, X, NULL, b, lowband_out); } if (tf_change>0) recombine = tf_change; /* Band recombining to increase frequency resolution */ if (lowband_scratch && lowband && (recombine || ((N_B&1) == 0 && tf_change<0) || B0>1)) { OPUS_COPY(lowband_scratch, lowband, N); lowband = lowband_scratch; } for (k=0;k>k, 1<>k, 1<>4]<<2; } B>>=recombine; N_B<<=recombine; /* Increasing the time resolution */ while ((N_B&1) == 0 && tf_change<0) { if (encode) haar1(X, N_B, B); if (lowband) haar1(lowband, N_B, B); fill |= fill<>= 1; time_divide++; tf_change++; } B0=B; N_B0 = N_B; /* Reorganize the samples in time order instead of frequency order */ if (B0>1) { if (encode) deinterleave_hadamard(X, N_B>>recombine, B0<>recombine, B0<resynth) { /* Undo the sample reorganization going from time order to frequency order */ if (B0>1) interleave_hadamard(X, N_B>>recombine, B0<>= 1; N_B <<= 1; cm |= cm>>B; haar1(X, N_B, B); } for (k=0;k>k, 1<encode; ec = ctx->ec; /* Special case for one sample */ if (N==1) { return quant_band_n1(ctx, X, Y, b, lowband_out); } orig_fill = fill; compute_theta(ctx, &sctx, X, Y, N, &b, B, B, LM, 1, &fill); inv = sctx.inv; imid = sctx.imid; iside = sctx.iside; delta = sctx.delta; itheta = sctx.itheta; qalloc = sctx.qalloc; #ifdef FIXED_POINT mid = imid; side = iside; #else mid = (1.f/32768)*imid; side = (1.f/32768)*iside; #endif /* This is a special case for N=2 that only works for stereo and takes advantage of the fact that mid and side are orthogonal to encode the side with just one bit. */ if (N==2) { int c; int sign=0; celt_norm *x2, *y2; mbits = b; sbits = 0; /* Only need one bit for the side. */ if (itheta != 0 && itheta != 16384) sbits = 1< 8192; ctx->remaining_bits -= qalloc+sbits; x2 = c ? Y : X; y2 = c ? X : Y; if (sbits) { if (encode) { /* Here we only need to encode a sign for the side. */ sign = x2[0]*y2[1] - x2[1]*y2[0] < 0; ec_enc_bits(ec, sign, 1); } else { sign = ec_dec_bits(ec, 1); } } sign = 1-2*sign; /* We use orig_fill here because we want to fold the side, but if itheta==16384, we'll have cleared the low bits of fill. */ cm = quant_band(ctx, x2, N, mbits, B, lowband, LM, lowband_out, Q15ONE, lowband_scratch, orig_fill); /* We don't split N=2 bands, so cm is either 1 or 0 (for a fold-collapse), and there's no need to worry about mixing with the other channel. */ y2[0] = -sign*x2[1]; y2[1] = sign*x2[0]; if (ctx->resynth) { celt_norm tmp; X[0] = MULT16_16_Q15(mid, X[0]); X[1] = MULT16_16_Q15(mid, X[1]); Y[0] = MULT16_16_Q15(side, Y[0]); Y[1] = MULT16_16_Q15(side, Y[1]); tmp = X[0]; X[0] = SUB16(tmp,Y[0]); Y[0] = ADD16(tmp,Y[0]); tmp = X[1]; X[1] = SUB16(tmp,Y[1]); Y[1] = ADD16(tmp,Y[1]); } } else { /* "Normal" split code */ opus_int32 rebalance; mbits = IMAX(0, IMIN(b, (b-delta)/2)); sbits = b-mbits; ctx->remaining_bits -= qalloc; rebalance = ctx->remaining_bits; if (mbits >= sbits) { /* In stereo mode, we do not apply a scaling to the mid because we need the normalized mid for folding later. */ cm = quant_band(ctx, X, N, mbits, B, lowband, LM, lowband_out, Q15ONE, lowband_scratch, fill); rebalance = mbits - (rebalance-ctx->remaining_bits); if (rebalance > 3<>B); } else { /* For a stereo split, the high bits of fill are always zero, so no folding will be done to the side. */ cm = quant_band(ctx, Y, N, sbits, B, NULL, LM, NULL, side, NULL, fill>>B); rebalance = sbits - (rebalance-ctx->remaining_bits); if (rebalance > 3<resynth) { if (N!=2) stereo_merge(X, Y, mid, N, ctx->arch); if (inv) { int j; for (j=0;jeBands; n1 = M*(eBands[start+1]-eBands[start]); n2 = M*(eBands[start+2]-eBands[start+1]); /* Duplicate enough of the first band folding data to be able to fold the second band. Copies no data for CELT-only mode. */ OPUS_COPY(&norm[n1], &norm[2*n1 - n2], n2-n1); if (dual_stereo) OPUS_COPY(&norm2[n1], &norm2[2*n1 - n2], n2-n1); } void quant_all_bands(int encode, const CELTMode *m, int start, int end, celt_norm *X_, celt_norm *Y_, unsigned char *collapse_masks, const celt_ener *bandE, int *pulses, int shortBlocks, int spread, int dual_stereo, int intensity, int *tf_res, opus_int32 total_bits, opus_int32 balance, ec_ctx *ec, int LM, int codedBands, opus_uint32 *seed, int complexity, int arch, int disable_inv) { int i; opus_int32 remaining_bits; const opus_int16 * OPUS_RESTRICT eBands = m->eBands; celt_norm * OPUS_RESTRICT norm, * OPUS_RESTRICT norm2; VARDECL(celt_norm, _norm); VARDECL(celt_norm, _lowband_scratch); VARDECL(celt_norm, X_save); VARDECL(celt_norm, Y_save); VARDECL(celt_norm, X_save2); VARDECL(celt_norm, Y_save2); VARDECL(celt_norm, norm_save2); int resynth_alloc; celt_norm *lowband_scratch; int B; int M; int lowband_offset; int update_lowband = 1; int C = Y_ != NULL ? 2 : 1; int norm_offset; int theta_rdo = encode && Y_!=NULL && !dual_stereo && complexity>=8; #ifdef RESYNTH int resynth = 1; #else int resynth = !encode || theta_rdo; #endif struct band_ctx ctx; SAVE_STACK; M = 1<nbEBands-1]-norm_offset), celt_norm); norm = _norm; norm2 = norm + M*eBands[m->nbEBands-1]-norm_offset; /* For decoding, we can use the last band as scratch space because we don't need that scratch space for the last band and we don't care about the data there until we're decoding the last band. */ if (encode && resynth) resynth_alloc = M*(eBands[m->nbEBands]-eBands[m->nbEBands-1]); else resynth_alloc = ALLOC_NONE; ALLOC(_lowband_scratch, resynth_alloc, celt_norm); if (encode && resynth) lowband_scratch = _lowband_scratch; else lowband_scratch = X_+M*eBands[m->nbEBands-1]; ALLOC(X_save, resynth_alloc, celt_norm); ALLOC(Y_save, resynth_alloc, celt_norm); ALLOC(X_save2, resynth_alloc, celt_norm); ALLOC(Y_save2, resynth_alloc, celt_norm); ALLOC(norm_save2, resynth_alloc, celt_norm); lowband_offset = 0; ctx.bandE = bandE; ctx.ec = ec; ctx.encode = encode; ctx.intensity = intensity; ctx.m = m; ctx.seed = *seed; ctx.spread = spread; ctx.arch = arch; ctx.disable_inv = disable_inv; ctx.resynth = resynth; ctx.theta_round = 0; /* Avoid injecting noise in the first band on transients. */ ctx.avoid_split_noise = B > 1; for (i=start;i= M*eBands[start] || i==start+1) && (update_lowband || lowband_offset==0)) lowband_offset = i; if (i == start+1) special_hybrid_folding(m, norm, norm2, start, M, dual_stereo); #else if (resynth && M*eBands[i]-N >= M*eBands[start] && (update_lowband || lowband_offset==0)) lowband_offset = i; #endif tf_change = tf_res[i]; ctx.tf_change = tf_change; if (i>=m->effEBands) { X=norm; if (Y_!=NULL) Y = norm; lowband_scratch = NULL; } if (last && !theta_rdo) lowband_scratch = NULL; /* Get a conservative estimate of the collapse_mask's for the bands we're going to be folding from. */ if (lowband_offset != 0 && (spread!=SPREAD_AGGRESSIVE || B>1 || tf_change<0)) { int fold_start; int fold_end; int fold_i; /* This ensures we never repeat spectral content within one band */ effective_lowband = IMAX(0, M*eBands[lowband_offset]-norm_offset-N); fold_start = lowband_offset; while(M*eBands[--fold_start] > effective_lowband+norm_offset); fold_end = lowband_offset-1; #ifdef ENABLE_UPDATE_DRAFT while(++fold_end < i && M*eBands[fold_end] < effective_lowband+norm_offset+N); #else while(M*eBands[++fold_end] < effective_lowband+norm_offset+N); #endif x_cm = y_cm = 0; fold_i = fold_start; do { x_cm |= collapse_masks[fold_i*C+0]; y_cm |= collapse_masks[fold_i*C+C-1]; } while (++fold_inbEBands], w); /* Make a copy. */ cm = x_cm|y_cm; ec_save = *ec; ctx_save = ctx; OPUS_COPY(X_save, X, N); OPUS_COPY(Y_save, Y, N); /* Encode and round down. */ ctx.theta_round = -1; x_cm = quant_band_stereo(&ctx, X, Y, N, b, B, effective_lowband != -1 ? norm+effective_lowband : NULL, LM, last?NULL:norm+M*eBands[i]-norm_offset, lowband_scratch, cm); dist0 = MULT16_32_Q15(w[0], celt_inner_prod(X_save, X, N, arch)) + MULT16_32_Q15(w[1], celt_inner_prod(Y_save, Y, N, arch)); /* Save first result. */ cm2 = x_cm; ec_save2 = *ec; ctx_save2 = ctx; OPUS_COPY(X_save2, X, N); OPUS_COPY(Y_save2, Y, N); if (!last) OPUS_COPY(norm_save2, norm+M*eBands[i]-norm_offset, N); nstart_bytes = ec_save.offs; nend_bytes = ec_save.storage; bytes_buf = ec_save.buf+nstart_bytes; save_bytes = nend_bytes-nstart_bytes; OPUS_COPY(bytes_save, bytes_buf, save_bytes); /* Restore */ *ec = ec_save; ctx = ctx_save; OPUS_COPY(X, X_save, N); OPUS_COPY(Y, Y_save, N); if (i == start+1) special_hybrid_folding(m, norm, norm2, start, M, dual_stereo); /* Encode and round up. */ ctx.theta_round = 1; x_cm = quant_band_stereo(&ctx, X, Y, N, b, B, effective_lowband != -1 ? norm+effective_lowband : NULL, LM, last?NULL:norm+M*eBands[i]-norm_offset, lowband_scratch, cm); dist1 = MULT16_32_Q15(w[0], celt_inner_prod(X_save, X, N, arch)) + MULT16_32_Q15(w[1], celt_inner_prod(Y_save, Y, N, arch)); if (dist0 >= dist1) { x_cm = cm2; *ec = ec_save2; ctx = ctx_save2; OPUS_COPY(X, X_save2, N); OPUS_COPY(Y, Y_save2, N); if (!last) OPUS_COPY(norm+M*eBands[i]-norm_offset, norm_save2, N); OPUS_COPY(bytes_buf, bytes_save, save_bytes); } } else { ctx.theta_round = 0; x_cm = quant_band_stereo(&ctx, X, Y, N, b, B, effective_lowband != -1 ? norm+effective_lowband : NULL, LM, last?NULL:norm+M*eBands[i]-norm_offset, lowband_scratch, x_cm|y_cm); } } else { x_cm = quant_band(&ctx, X, N, b, B, effective_lowband != -1 ? norm+effective_lowband : NULL, LM, last?NULL:norm+M*eBands[i]-norm_offset, Q15ONE, lowband_scratch, x_cm|y_cm); } y_cm = x_cm; } collapse_masks[i*C+0] = (unsigned char)x_cm; collapse_masks[i*C+C-1] = (unsigned char)y_cm; balance += pulses[i] + tell; /* Update the folding position only as long as we have 1 bit/sample depth. */ update_lowband = b>(N<>15; } void ec_laplace_encode(ec_enc *enc, int *value, unsigned fs, int decay) { unsigned fl; int val = *value; fl = 0; if (val) { int s; int i; s = -(val<0); val = (val+s)^s; fl = fs; fs = ec_laplace_get_freq1(fs, decay); /* Search the decaying part of the PDF.*/ for (i=1; fs > 0 && i < val; i++) { fs *= 2; fl += fs+2*LAPLACE_MINP; fs = (fs*(opus_int32)decay)>>15; } /* Everything beyond that has probability LAPLACE_MINP. */ if (!fs) { int di; int ndi_max; ndi_max = (32768-fl+LAPLACE_MINP-1)>>LAPLACE_LOG_MINP; ndi_max = (ndi_max-s)>>1; di = IMIN(val - i, ndi_max - 1); fl += (2*di+1+s)*LAPLACE_MINP; fs = IMIN(LAPLACE_MINP, 32768-fl); *value = (i+di+s)^s; } else { fs += LAPLACE_MINP; fl += fs&~s; } celt_assert(fl+fs<=32768); celt_assert(fs>0); } ec_encode_bin(enc, fl, fl+fs, 15); } int ec_laplace_decode(ec_dec *dec, unsigned fs, int decay) { int val=0; unsigned fl; unsigned fm; fm = ec_decode_bin(dec, 15); fl = 0; if (fm >= fs) { val++; fl = fs; fs = ec_laplace_get_freq1(fs, decay)+LAPLACE_MINP; /* Search the decaying part of the PDF.*/ while(fs > LAPLACE_MINP && fm >= fl+2*fs) { fs *= 2; fl += fs; fs = ((fs-2*LAPLACE_MINP)*(opus_int32)decay)>>15; fs += LAPLACE_MINP; val++; } /* Everything beyond that has probability LAPLACE_MINP. */ if (fs <= LAPLACE_MINP) { int di; di = (fm-fl)>>(LAPLACE_LOG_MINP+1); val += di; fl += 2*di*LAPLACE_MINP; } if (fm < fl+fs) val = -val; else fl += fs; } celt_assert(fl<32768); celt_assert(fs>0); celt_assert(fl<=fm); celt_assert(fm #include "os_support.h" #include "mathops.h" #include "stack_alloc.h" #if defined(MIPSr1_ASM) #include "mips/mdct_mipsr1.h" #endif #ifdef CUSTOM_MODES int clt_mdct_init(mdct_lookup *l,int N, int maxshift, int arch) { int i; kiss_twiddle_scalar *trig; int shift; int N2=N>>1; l->n = N; l->maxshift = maxshift; for (i=0;i<=maxshift;i++) { if (i==0) l->kfft[i] = opus_fft_alloc(N>>2>>i, 0, 0, arch); else l->kfft[i] = opus_fft_alloc_twiddles(N>>2>>i, 0, 0, l->kfft[0], arch); #ifndef ENABLE_TI_DSPLIB55 if (l->kfft[i]==NULL) return 0; #endif } l->trig = trig = (kiss_twiddle_scalar*)opus_alloc((N-(N2>>maxshift))*sizeof(kiss_twiddle_scalar)); if (l->trig==NULL) return 0; for (shift=0;shift<=maxshift;shift++) { /* We have enough points that sine isn't necessary */ #if defined(FIXED_POINT) #if 1 for (i=0;i>= 1; N >>= 1; } return 1; } void clt_mdct_clear(mdct_lookup *l, int arch) { int i; for (i=0;i<=l->maxshift;i++) opus_fft_free(l->kfft[i], arch); opus_free((kiss_twiddle_scalar*)l->trig); } #endif /* CUSTOM_MODES */ /* Forward MDCT trashes the input array */ #ifndef OVERRIDE_clt_mdct_forward void clt_mdct_forward_c(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar * OPUS_RESTRICT out, const opus_val16 *window, int overlap, int shift, int stride, int arch) { int i; int N, N2, N4; VARDECL(kiss_fft_scalar, f); VARDECL(kiss_fft_cpx, f2); const kiss_fft_state *st = l->kfft[shift]; const kiss_twiddle_scalar *trig; opus_val16 scale; #ifdef FIXED_POINT /* Allows us to scale with MULT16_32_Q16(), which is faster than MULT16_32_Q15() on ARM. */ int scale_shift = st->scale_shift-1; #endif SAVE_STACK; (void)arch; scale = st->scale; N = l->n; trig = l->trig; for (i=0;i>= 1; trig += N; } N2 = N>>1; N4 = N>>2; ALLOC(f, N2, kiss_fft_scalar); ALLOC(f2, N4, kiss_fft_cpx); /* Consider the input to be composed of four blocks: [a, b, c, d] */ /* Window, shuffle, fold */ { /* Temp pointers to make it really clear to the compiler what we're doing */ const kiss_fft_scalar * OPUS_RESTRICT xp1 = in+(overlap>>1); const kiss_fft_scalar * OPUS_RESTRICT xp2 = in+N2-1+(overlap>>1); kiss_fft_scalar * OPUS_RESTRICT yp = f; const opus_val16 * OPUS_RESTRICT wp1 = window+(overlap>>1); const opus_val16 * OPUS_RESTRICT wp2 = window+(overlap>>1)-1; for(i=0;i<((overlap+3)>>2);i++) { /* Real part arranged as -d-cR, Imag part arranged as -b+aR*/ *yp++ = MULT16_32_Q15(*wp2, xp1[N2]) + MULT16_32_Q15(*wp1,*xp2); *yp++ = MULT16_32_Q15(*wp1, *xp1) - MULT16_32_Q15(*wp2, xp2[-N2]); xp1+=2; xp2-=2; wp1+=2; wp2-=2; } wp1 = window; wp2 = window+overlap-1; for(;i>2);i++) { /* Real part arranged as a-bR, Imag part arranged as -c-dR */ *yp++ = *xp2; *yp++ = *xp1; xp1+=2; xp2-=2; } for(;ibitrev[i]] = yc; } } /* N/4 complex FFT, does not downscale anymore */ opus_fft_impl(st, f2); /* Post-rotate */ { /* Temp pointers to make it really clear to the compiler what we're doing */ const kiss_fft_cpx * OPUS_RESTRICT fp = f2; kiss_fft_scalar * OPUS_RESTRICT yp1 = out; kiss_fft_scalar * OPUS_RESTRICT yp2 = out+stride*(N2-1); const kiss_twiddle_scalar *t = &trig[0]; /* Temp pointers to make it really clear to the compiler what we're doing */ for(i=0;ii,t[N4+i]) - S_MUL(fp->r,t[i]); yi = S_MUL(fp->r,t[N4+i]) + S_MUL(fp->i,t[i]); *yp1 = yr; *yp2 = yi; fp++; yp1 += 2*stride; yp2 -= 2*stride; } } RESTORE_STACK; } #endif /* OVERRIDE_clt_mdct_forward */ #ifndef OVERRIDE_clt_mdct_backward void clt_mdct_backward_c(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar * OPUS_RESTRICT out, const opus_val16 * OPUS_RESTRICT window, int overlap, int shift, int stride, int arch) { int i; int N, N2, N4; const kiss_twiddle_scalar *trig; (void) arch; N = l->n; trig = l->trig; for (i=0;i>= 1; trig += N; } N2 = N>>1; N4 = N>>2; /* Pre-rotate */ { /* Temp pointers to make it really clear to the compiler what we're doing */ const kiss_fft_scalar * OPUS_RESTRICT xp1 = in; const kiss_fft_scalar * OPUS_RESTRICT xp2 = in+stride*(N2-1); kiss_fft_scalar * OPUS_RESTRICT yp = out+(overlap>>1); const kiss_twiddle_scalar * OPUS_RESTRICT t = &trig[0]; const opus_int16 * OPUS_RESTRICT bitrev = l->kfft[shift]->bitrev; for(i=0;ikfft[shift], (kiss_fft_cpx*)(out+(overlap>>1))); /* Post-rotate and de-shuffle from both ends of the buffer at once to make it in-place. */ { kiss_fft_scalar * yp0 = out+(overlap>>1); kiss_fft_scalar * yp1 = out+(overlap>>1)+N2-2; const kiss_twiddle_scalar *t = &trig[0]; /* Loop to (N4+1)>>1 to handle odd N4. When N4 is odd, the middle pair will be computed twice. */ for(i=0;i<(N4+1)>>1;i++) { kiss_fft_scalar re, im, yr, yi; kiss_twiddle_scalar t0, t1; /* We swap real and imag because we're using an FFT instead of an IFFT. */ re = yp0[1]; im = yp0[0]; t0 = t[i]; t1 = t[N4+i]; /* We'd scale up by 2 here, but instead it's done when mixing the windows */ yr = ADD32_ovflw(S_MUL(re,t0), S_MUL(im,t1)); yi = SUB32_ovflw(S_MUL(re,t1), S_MUL(im,t0)); /* We swap real and imag because we're using an FFT instead of an IFFT. */ re = yp1[1]; im = yp1[0]; yp0[0] = yr; yp1[1] = yi; t0 = t[(N4-i-1)]; t1 = t[(N2-i-1)]; /* We'd scale up by 2 here, but instead it's done when mixing the windows */ yr = ADD32_ovflw(S_MUL(re,t0), S_MUL(im,t1)); yi = SUB32_ovflw(S_MUL(re,t1), S_MUL(im,t0)); yp1[0] = yr; yp0[1] = yi; yp0 += 2; yp1 -= 2; } } /* Mirror on both sides for TDAC */ { kiss_fft_scalar * OPUS_RESTRICT xp1 = out+overlap-1; kiss_fft_scalar * OPUS_RESTRICT yp1 = out; const opus_val16 * OPUS_RESTRICT wp1 = window; const opus_val16 * OPUS_RESTRICT wp2 = window+overlap-1; for(i = 0; i < overlap/2; i++) { kiss_fft_scalar x1, x2; x1 = *xp1; x2 = *yp1; *yp1++ = SUB32_ovflw(MULT16_32_Q15(*wp2, x2), MULT16_32_Q15(*wp1, x1)); *xp1-- = ADD32_ovflw(MULT16_32_Q15(*wp1, x2), MULT16_32_Q15(*wp2, x1)); wp1++; wp2--; } } } #endif /* OVERRIDE_clt_mdct_backward */ mumble-1.3.4/3rdparty/opus-src/celt/quant_bands.h0000664000175000017500000000563614010707327021575 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef QUANT_BANDS #define QUANT_BANDS #include "arch.h" #include "modes.h" #include "entenc.h" #include "entdec.h" #include "mathops.h" #ifdef FIXED_POINT extern const signed char eMeans[25]; #else extern const opus_val16 eMeans[25]; #endif void amp2Log2(const CELTMode *m, int effEnd, int end, celt_ener *bandE, opus_val16 *bandLogE, int C); void log2Amp(const CELTMode *m, int start, int end, celt_ener *eBands, const opus_val16 *oldEBands, int C); void quant_coarse_energy(const CELTMode *m, int start, int end, int effEnd, const opus_val16 *eBands, opus_val16 *oldEBands, opus_uint32 budget, opus_val16 *error, ec_enc *enc, int C, int LM, int nbAvailableBytes, int force_intra, opus_val32 *delayedIntra, int two_pass, int loss_rate, int lfe); void quant_fine_energy(const CELTMode *m, int start, int end, opus_val16 *oldEBands, opus_val16 *error, int *fine_quant, ec_enc *enc, int C); void quant_energy_finalise(const CELTMode *m, int start, int end, opus_val16 *oldEBands, opus_val16 *error, int *fine_quant, int *fine_priority, int bits_left, ec_enc *enc, int C); void unquant_coarse_energy(const CELTMode *m, int start, int end, opus_val16 *oldEBands, int intra, ec_dec *dec, int C, int LM); void unquant_fine_energy(const CELTMode *m, int start, int end, opus_val16 *oldEBands, int *fine_quant, ec_dec *dec, int C); void unquant_energy_finalise(const CELTMode *m, int start, int end, opus_val16 *oldEBands, int *fine_quant, int *fine_priority, int bits_left, ec_dec *dec, int C); #endif /* QUANT_BANDS */ mumble-1.3.4/3rdparty/opus-src/celt/cwrs.c0000664000175000017500000006714114010707327020246 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Copyright (c) 2007-2009 Timothy B. Terriberry Written by Timothy B. Terriberry and Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "os_support.h" #include "cwrs.h" #include "mathops.h" #include "arch.h" #ifdef CUSTOM_MODES /*Guaranteed to return a conservatively large estimate of the binary logarithm with frac bits of fractional precision. Tested for all possible 32-bit inputs with frac=4, where the maximum overestimation is 0.06254243 bits.*/ int log2_frac(opus_uint32 val, int frac) { int l; l=EC_ILOG(val); if(val&(val-1)){ /*This is (val>>l-16), but guaranteed to round up, even if adding a bias before the shift would cause overflow (e.g., for 0xFFFFxxxx). Doesn't work for val=0, but that case fails the test above.*/ if(l>16)val=((val-1)>>(l-16))+1; else val<<=16-l; l=(l-1)<>16); l+=b<>b; val=(val*val+0x7FFF)>>15; } while(frac-->0); /*If val is not exactly 0x8000, then we have to round up the remainder.*/ return l+(val>0x8000); } /*Exact powers of two require no rounding.*/ else return (l-1)<0 ? sum(k=1...K,2**k*choose(N,k)*choose(K-1,k-1)) : 1, where choose() is the binomial function. A table of values for N<10 and K<10 looks like: V[10][10] = { {1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {1, 2, 2, 2, 2, 2, 2, 2, 2, 2}, {1, 4, 8, 12, 16, 20, 24, 28, 32, 36}, {1, 6, 18, 38, 66, 102, 146, 198, 258, 326}, {1, 8, 32, 88, 192, 360, 608, 952, 1408, 1992}, {1, 10, 50, 170, 450, 1002, 1970, 3530, 5890, 9290}, {1, 12, 72, 292, 912, 2364, 5336, 10836, 20256, 35436}, {1, 14, 98, 462, 1666, 4942, 12642, 28814, 59906, 115598}, {1, 16, 128, 688, 2816, 9424, 27008, 68464, 157184, 332688}, {1, 18, 162, 978, 4482, 16722, 53154, 148626, 374274, 864146} }; U(N,K) = the number of such combinations wherein N-1 objects are taken at most K-1 at a time. This is given by U(N,K) = sum(k=0...K-1,V(N-1,k)) = K>0 ? (V(N-1,K-1) + V(N,K-1))/2 : 0. The latter expression also makes clear that U(N,K) is half the number of such combinations wherein the first object is taken at least once. Although it may not be clear from either of these definitions, U(N,K) is the natural function to work with when enumerating the pulse vector codebooks, not V(N,K). U(N,K) is not well-defined for N=0, but with the extension U(0,K) = K>0 ? 0 : 1, the function becomes symmetric: U(N,K) = U(K,N), with a similar table: U[10][10] = { {1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {0, 1, 3, 5, 7, 9, 11, 13, 15, 17}, {0, 1, 5, 13, 25, 41, 61, 85, 113, 145}, {0, 1, 7, 25, 63, 129, 231, 377, 575, 833}, {0, 1, 9, 41, 129, 321, 681, 1289, 2241, 3649}, {0, 1, 11, 61, 231, 681, 1683, 3653, 7183, 13073}, {0, 1, 13, 85, 377, 1289, 3653, 8989, 19825, 40081}, {0, 1, 15, 113, 575, 2241, 7183, 19825, 48639, 108545}, {0, 1, 17, 145, 833, 3649, 13073, 40081, 108545, 265729} }; With this extension, V(N,K) may be written in terms of U(N,K): V(N,K) = U(N,K) + U(N,K+1) for all N>=0, K>=0. Thus U(N,K+1) represents the number of combinations where the first element is positive or zero, and U(N,K) represents the number of combinations where it is negative. With a large enough table of U(N,K) values, we could write O(N) encoding and O(min(N*log(K),N+K)) decoding routines, but such a table would be prohibitively large for small embedded devices (K may be as large as 32767 for small N, and N may be as large as 200). Both functions obey the same recurrence relation: V(N,K) = V(N-1,K) + V(N,K-1) + V(N-1,K-1), U(N,K) = U(N-1,K) + U(N,K-1) + U(N-1,K-1), for all N>0, K>0, with different initial conditions at N=0 or K=0. This allows us to construct a row of one of the tables above given the previous row or the next row. Thus we can derive O(NK) encoding and decoding routines with O(K) memory using only addition and subtraction. When encoding, we build up from the U(2,K) row and work our way forwards. When decoding, we need to start at the U(N,K) row and work our way backwards, which requires a means of computing U(N,K). U(N,K) may be computed from two previous values with the same N: U(N,K) = ((2*N-1)*U(N,K-1) - U(N,K-2))/(K-1) + U(N,K-2) for all N>1, and since U(N,K) is symmetric, a similar relation holds for two previous values with the same K: U(N,K>1) = ((2*K-1)*U(N-1,K) - U(N-2,K))/(N-1) + U(N-2,K) for all K>1. This allows us to construct an arbitrary row of the U(N,K) table by starting with the first two values, which are constants. This saves roughly 2/3 the work in our O(NK) decoding routine, but costs O(K) multiplications. Similar relations can be derived for V(N,K), but are not used here. For N>0 and K>0, U(N,K) and V(N,K) take on the form of an (N-1)-degree polynomial for fixed N. The first few are U(1,K) = 1, U(2,K) = 2*K-1, U(3,K) = (2*K-2)*K+1, U(4,K) = (((4*K-6)*K+8)*K-3)/3, U(5,K) = ((((2*K-4)*K+10)*K-8)*K+3)/3, and V(1,K) = 2, V(2,K) = 4*K, V(3,K) = 4*K*K+2, V(4,K) = 8*(K*K+2)*K/3, V(5,K) = ((4*K*K+20)*K*K+6)/3, for all K>0. This allows us to derive O(N) encoding and O(N*log(K)) decoding routines for small N (and indeed decoding is also O(N) for N<3). @ARTICLE{Fis86, author="Thomas R. Fischer", title="A Pyramid Vector Quantizer", journal="IEEE Transactions on Information Theory", volume="IT-32", number=4, pages="568--583", month=Jul, year=1986 }*/ #if !defined(SMALL_FOOTPRINT) /*U(N,K) = U(K,N) := N>0?K>0?U(N-1,K)+U(N,K-1)+U(N-1,K-1):0:K>0?1:0*/ # define CELT_PVQ_U(_n,_k) (CELT_PVQ_U_ROW[IMIN(_n,_k)][IMAX(_n,_k)]) /*V(N,K) := U(N,K)+U(N,K+1) = the number of PVQ codewords for a band of size N with K pulses allocated to it.*/ # define CELT_PVQ_V(_n,_k) (CELT_PVQ_U(_n,_k)+CELT_PVQ_U(_n,(_k)+1)) /*For each V(N,K) supported, we will access element U(min(N,K+1),max(N,K+1)). Thus, the number of entries in row I is the larger of the maximum number of pulses we will ever allocate for a given N=I (K=128, or however many fit in 32 bits, whichever is smaller), plus one, and the maximum N for which K=I-1 pulses fit in 32 bits. The largest band size in an Opus Custom mode is 208. Otherwise, we can limit things to the set of N which can be achieved by splitting a band from a standard Opus mode: 176, 144, 96, 88, 72, 64, 48, 44, 36, 32, 24, 22, 18, 16, 8, 4, 2).*/ #if defined(CUSTOM_MODES) static const opus_uint32 CELT_PVQ_U_DATA[1488]={ #else static const opus_uint32 CELT_PVQ_U_DATA[1272]={ #endif /*N=0, K=0...176:*/ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, #if defined(CUSTOM_MODES) /*...208:*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, #endif /*N=1, K=1...176:*/ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, #if defined(CUSTOM_MODES) /*...208:*/ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, #endif /*N=2, K=2...176:*/ 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99, 101, 103, 105, 107, 109, 111, 113, 115, 117, 119, 121, 123, 125, 127, 129, 131, 133, 135, 137, 139, 141, 143, 145, 147, 149, 151, 153, 155, 157, 159, 161, 163, 165, 167, 169, 171, 173, 175, 177, 179, 181, 183, 185, 187, 189, 191, 193, 195, 197, 199, 201, 203, 205, 207, 209, 211, 213, 215, 217, 219, 221, 223, 225, 227, 229, 231, 233, 235, 237, 239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 259, 261, 263, 265, 267, 269, 271, 273, 275, 277, 279, 281, 283, 285, 287, 289, 291, 293, 295, 297, 299, 301, 303, 305, 307, 309, 311, 313, 315, 317, 319, 321, 323, 325, 327, 329, 331, 333, 335, 337, 339, 341, 343, 345, 347, 349, 351, #if defined(CUSTOM_MODES) /*...208:*/ 353, 355, 357, 359, 361, 363, 365, 367, 369, 371, 373, 375, 377, 379, 381, 383, 385, 387, 389, 391, 393, 395, 397, 399, 401, 403, 405, 407, 409, 411, 413, 415, #endif /*N=3, K=3...176:*/ 13, 25, 41, 61, 85, 113, 145, 181, 221, 265, 313, 365, 421, 481, 545, 613, 685, 761, 841, 925, 1013, 1105, 1201, 1301, 1405, 1513, 1625, 1741, 1861, 1985, 2113, 2245, 2381, 2521, 2665, 2813, 2965, 3121, 3281, 3445, 3613, 3785, 3961, 4141, 4325, 4513, 4705, 4901, 5101, 5305, 5513, 5725, 5941, 6161, 6385, 6613, 6845, 7081, 7321, 7565, 7813, 8065, 8321, 8581, 8845, 9113, 9385, 9661, 9941, 10225, 10513, 10805, 11101, 11401, 11705, 12013, 12325, 12641, 12961, 13285, 13613, 13945, 14281, 14621, 14965, 15313, 15665, 16021, 16381, 16745, 17113, 17485, 17861, 18241, 18625, 19013, 19405, 19801, 20201, 20605, 21013, 21425, 21841, 22261, 22685, 23113, 23545, 23981, 24421, 24865, 25313, 25765, 26221, 26681, 27145, 27613, 28085, 28561, 29041, 29525, 30013, 30505, 31001, 31501, 32005, 32513, 33025, 33541, 34061, 34585, 35113, 35645, 36181, 36721, 37265, 37813, 38365, 38921, 39481, 40045, 40613, 41185, 41761, 42341, 42925, 43513, 44105, 44701, 45301, 45905, 46513, 47125, 47741, 48361, 48985, 49613, 50245, 50881, 51521, 52165, 52813, 53465, 54121, 54781, 55445, 56113, 56785, 57461, 58141, 58825, 59513, 60205, 60901, 61601, #if defined(CUSTOM_MODES) /*...208:*/ 62305, 63013, 63725, 64441, 65161, 65885, 66613, 67345, 68081, 68821, 69565, 70313, 71065, 71821, 72581, 73345, 74113, 74885, 75661, 76441, 77225, 78013, 78805, 79601, 80401, 81205, 82013, 82825, 83641, 84461, 85285, 86113, #endif /*N=4, K=4...176:*/ 63, 129, 231, 377, 575, 833, 1159, 1561, 2047, 2625, 3303, 4089, 4991, 6017, 7175, 8473, 9919, 11521, 13287, 15225, 17343, 19649, 22151, 24857, 27775, 30913, 34279, 37881, 41727, 45825, 50183, 54809, 59711, 64897, 70375, 76153, 82239, 88641, 95367, 102425, 109823, 117569, 125671, 134137, 142975, 152193, 161799, 171801, 182207, 193025, 204263, 215929, 228031, 240577, 253575, 267033, 280959, 295361, 310247, 325625, 341503, 357889, 374791, 392217, 410175, 428673, 447719, 467321, 487487, 508225, 529543, 551449, 573951, 597057, 620775, 645113, 670079, 695681, 721927, 748825, 776383, 804609, 833511, 863097, 893375, 924353, 956039, 988441, 1021567, 1055425, 1090023, 1125369, 1161471, 1198337, 1235975, 1274393, 1313599, 1353601, 1394407, 1436025, 1478463, 1521729, 1565831, 1610777, 1656575, 1703233, 1750759, 1799161, 1848447, 1898625, 1949703, 2001689, 2054591, 2108417, 2163175, 2218873, 2275519, 2333121, 2391687, 2451225, 2511743, 2573249, 2635751, 2699257, 2763775, 2829313, 2895879, 2963481, 3032127, 3101825, 3172583, 3244409, 3317311, 3391297, 3466375, 3542553, 3619839, 3698241, 3777767, 3858425, 3940223, 4023169, 4107271, 4192537, 4278975, 4366593, 4455399, 4545401, 4636607, 4729025, 4822663, 4917529, 5013631, 5110977, 5209575, 5309433, 5410559, 5512961, 5616647, 5721625, 5827903, 5935489, 6044391, 6154617, 6266175, 6379073, 6493319, 6608921, 6725887, 6844225, 6963943, 7085049, 7207551, #if defined(CUSTOM_MODES) /*...208:*/ 7331457, 7456775, 7583513, 7711679, 7841281, 7972327, 8104825, 8238783, 8374209, 8511111, 8649497, 8789375, 8930753, 9073639, 9218041, 9363967, 9511425, 9660423, 9810969, 9963071, 10116737, 10271975, 10428793, 10587199, 10747201, 10908807, 11072025, 11236863, 11403329, 11571431, 11741177, 11912575, #endif /*N=5, K=5...176:*/ 321, 681, 1289, 2241, 3649, 5641, 8361, 11969, 16641, 22569, 29961, 39041, 50049, 63241, 78889, 97281, 118721, 143529, 172041, 204609, 241601, 283401, 330409, 383041, 441729, 506921, 579081, 658689, 746241, 842249, 947241, 1061761, 1186369, 1321641, 1468169, 1626561, 1797441, 1981449, 2179241, 2391489, 2618881, 2862121, 3121929, 3399041, 3694209, 4008201, 4341801, 4695809, 5071041, 5468329, 5888521, 6332481, 6801089, 7295241, 7815849, 8363841, 8940161, 9545769, 10181641, 10848769, 11548161, 12280841, 13047849, 13850241, 14689089, 15565481, 16480521, 17435329, 18431041, 19468809, 20549801, 21675201, 22846209, 24064041, 25329929, 26645121, 28010881, 29428489, 30899241, 32424449, 34005441, 35643561, 37340169, 39096641, 40914369, 42794761, 44739241, 46749249, 48826241, 50971689, 53187081, 55473921, 57833729, 60268041, 62778409, 65366401, 68033601, 70781609, 73612041, 76526529, 79526721, 82614281, 85790889, 89058241, 92418049, 95872041, 99421961, 103069569, 106816641, 110664969, 114616361, 118672641, 122835649, 127107241, 131489289, 135983681, 140592321, 145317129, 150160041, 155123009, 160208001, 165417001, 170752009, 176215041, 181808129, 187533321, 193392681, 199388289, 205522241, 211796649, 218213641, 224775361, 231483969, 238341641, 245350569, 252512961, 259831041, 267307049, 274943241, 282741889, 290705281, 298835721, 307135529, 315607041, 324252609, 333074601, 342075401, 351257409, 360623041, 370174729, 379914921, 389846081, 399970689, 410291241, 420810249, 431530241, 442453761, 453583369, 464921641, 476471169, 488234561, 500214441, 512413449, 524834241, 537479489, 550351881, 563454121, 576788929, 590359041, 604167209, 618216201, 632508801, #if defined(CUSTOM_MODES) /*...208:*/ 647047809, 661836041, 676876329, 692171521, 707724481, 723538089, 739615241, 755958849, 772571841, 789457161, 806617769, 824056641, 841776769, 859781161, 878072841, 896654849, 915530241, 934702089, 954173481, 973947521, 994027329, 1014416041, 1035116809, 1056132801, 1077467201, 1099123209, 1121104041, 1143412929, 1166053121, 1189027881, 1212340489, 1235994241, #endif /*N=6, K=6...96:*/ 1683, 3653, 7183, 13073, 22363, 36365, 56695, 85305, 124515, 177045, 246047, 335137, 448427, 590557, 766727, 982729, 1244979, 1560549, 1937199, 2383409, 2908411, 3522221, 4235671, 5060441, 6009091, 7095093, 8332863, 9737793, 11326283, 13115773, 15124775, 17372905, 19880915, 22670725, 25765455, 29189457, 32968347, 37129037, 41699767, 46710137, 52191139, 58175189, 64696159, 71789409, 79491819, 87841821, 96879431, 106646281, 117185651, 128542501, 140763503, 153897073, 167993403, 183104493, 199284183, 216588185, 235074115, 254801525, 275831935, 298228865, 322057867, 347386557, 374284647, 402823977, 433078547, 465124549, 499040399, 534906769, 572806619, 612825229, 655050231, 699571641, 746481891, 795875861, 847850911, 902506913, 959946283, 1020274013, 1083597703, 1150027593, 1219676595, 1292660325, 1369097135, 1449108145, 1532817275, 1620351277, 1711839767, 1807415257, 1907213187, 2011371957, 2120032959, #if defined(CUSTOM_MODES) /*...109:*/ 2233340609U, 2351442379U, 2474488829U, 2602633639U, 2736033641U, 2874848851U, 3019242501U, 3169381071U, 3325434321U, 3487575323U, 3655980493U, 3830829623U, 4012305913U, #endif /*N=7, K=7...54*/ 8989, 19825, 40081, 75517, 134245, 227305, 369305, 579125, 880685, 1303777, 1884961, 2668525, 3707509, 5064793, 6814249, 9041957, 11847485, 15345233, 19665841, 24957661, 31388293, 39146185, 48442297, 59511829, 72616013, 88043969, 106114625, 127178701, 151620757, 179861305, 212358985, 249612805, 292164445, 340600625, 395555537, 457713341, 527810725, 606639529, 695049433, 793950709, 904317037, 1027188385, 1163673953, 1314955181, 1482288821, 1667010073, 1870535785, 2094367717, #if defined(CUSTOM_MODES) /*...60:*/ 2340095869U, 2609401873U, 2904062449U, 3225952925U, 3577050821U, 3959439497U, #endif /*N=8, K=8...37*/ 48639, 108545, 224143, 433905, 795455, 1392065, 2340495, 3800305, 5984767, 9173505, 13726991, 20103025, 28875327, 40754369, 56610575, 77500017, 104692735, 139703809, 184327311, 240673265, 311207743, 398796225, 506750351, 638878193, 799538175, 993696769, 1226990095, 1505789553, 1837271615, 2229491905U, #if defined(CUSTOM_MODES) /*...40:*/ 2691463695U, 3233240945U, 3866006015U, #endif /*N=9, K=9...28:*/ 265729, 598417, 1256465, 2485825, 4673345, 8405905, 14546705, 24331777, 39490049, 62390545, 96220561, 145198913, 214828609, 312193553, 446304145, 628496897, 872893441, 1196924561, 1621925137, 2173806145U, #if defined(CUSTOM_MODES) /*...29:*/ 2883810113U, #endif /*N=10, K=10...24:*/ 1462563, 3317445, 7059735, 14218905, 27298155, 50250765, 89129247, 152951073, 254831667, 413442773, 654862247, 1014889769, 1541911931, 2300409629U, 3375210671U, /*N=11, K=11...19:*/ 8097453, 18474633, 39753273, 81270333, 158819253, 298199265, 540279585, 948062325, 1616336765, #if defined(CUSTOM_MODES) /*...20:*/ 2684641785U, #endif /*N=12, K=12...18:*/ 45046719, 103274625, 224298231, 464387817, 921406335, 1759885185, 3248227095U, /*N=13, K=13...16:*/ 251595969, 579168825, 1267854873, 2653649025U, /*N=14, K=14:*/ 1409933619 }; #if defined(CUSTOM_MODES) static const opus_uint32 *const CELT_PVQ_U_ROW[15]={ CELT_PVQ_U_DATA+ 0,CELT_PVQ_U_DATA+ 208,CELT_PVQ_U_DATA+ 415, CELT_PVQ_U_DATA+ 621,CELT_PVQ_U_DATA+ 826,CELT_PVQ_U_DATA+1030, CELT_PVQ_U_DATA+1233,CELT_PVQ_U_DATA+1336,CELT_PVQ_U_DATA+1389, CELT_PVQ_U_DATA+1421,CELT_PVQ_U_DATA+1441,CELT_PVQ_U_DATA+1455, CELT_PVQ_U_DATA+1464,CELT_PVQ_U_DATA+1470,CELT_PVQ_U_DATA+1473 }; #else static const opus_uint32 *const CELT_PVQ_U_ROW[15]={ CELT_PVQ_U_DATA+ 0,CELT_PVQ_U_DATA+ 176,CELT_PVQ_U_DATA+ 351, CELT_PVQ_U_DATA+ 525,CELT_PVQ_U_DATA+ 698,CELT_PVQ_U_DATA+ 870, CELT_PVQ_U_DATA+1041,CELT_PVQ_U_DATA+1131,CELT_PVQ_U_DATA+1178, CELT_PVQ_U_DATA+1207,CELT_PVQ_U_DATA+1226,CELT_PVQ_U_DATA+1240, CELT_PVQ_U_DATA+1248,CELT_PVQ_U_DATA+1254,CELT_PVQ_U_DATA+1257 }; #endif #if defined(CUSTOM_MODES) void get_required_bits(opus_int16 *_bits,int _n,int _maxk,int _frac){ int k; /*_maxk==0 => there's nothing to do.*/ celt_assert(_maxk>0); _bits[0]=0; for(k=1;k<=_maxk;k++)_bits[k]=log2_frac(CELT_PVQ_V(_n,k),_frac); } #endif static opus_uint32 icwrs(int _n,const int *_y){ opus_uint32 i; int j; int k; celt_assert(_n>=2); j=_n-1; i=_y[j]<0; k=abs(_y[j]); do{ j--; i+=CELT_PVQ_U(_n-j,k); k+=abs(_y[j]); if(_y[j]<0)i+=CELT_PVQ_U(_n-j,k+1); } while(j>0); return i; } void encode_pulses(const int *_y,int _n,int _k,ec_enc *_enc){ celt_assert(_k>0); ec_enc_uint(_enc,icwrs(_n,_y),CELT_PVQ_V(_n,_k)); } static opus_val32 cwrsi(int _n,int _k,opus_uint32 _i,int *_y){ opus_uint32 p; int s; int k0; opus_int16 val; opus_val32 yy=0; celt_assert(_k>0); celt_assert(_n>1); while(_n>2){ opus_uint32 q; /*Lots of pulses case:*/ if(_k>=_n){ const opus_uint32 *row; row=CELT_PVQ_U_ROW[_n]; /*Are the pulses in this dimension negative?*/ p=row[_k+1]; s=-(_i>=p); _i-=p&s; /*Count how many pulses were placed in this dimension.*/ k0=_k; q=row[_n]; if(q>_i){ celt_assert(p>q); _k=_n; do p=CELT_PVQ_U_ROW[--_k][_n]; while(p>_i); } else for(p=row[_k];p>_i;p=row[_k])_k--; _i-=p; val=(k0-_k+s)^s; *_y++=val; yy=MAC16_16(yy,val,val); } /*Lots of dimensions case:*/ else{ /*Are there any pulses in this dimension at all?*/ p=CELT_PVQ_U_ROW[_k][_n]; q=CELT_PVQ_U_ROW[_k+1][_n]; if(p<=_i&&_i=q); _i-=q&s; /*Count how many pulses were placed in this dimension.*/ k0=_k; do p=CELT_PVQ_U_ROW[--_k][_n]; while(p>_i); _i-=p; val=(k0-_k+s)^s; *_y++=val; yy=MAC16_16(yy,val,val); } } _n--; } /*_n==2*/ p=2*_k+1; s=-(_i>=p); _i-=p&s; k0=_k; _k=(_i+1)>>1; if(_k)_i-=2*_k-1; val=(k0-_k+s)^s; *_y++=val; yy=MAC16_16(yy,val,val); /*_n==1*/ s=-(int)_i; val=(_k+s)^s; *_y=val; yy=MAC16_16(yy,val,val); return yy; } opus_val32 decode_pulses(int *_y,int _n,int _k,ec_dec *_dec){ return cwrsi(_n,_k,ec_dec_uint(_dec,CELT_PVQ_V(_n,_k)),_y); } #else /* SMALL_FOOTPRINT */ /*Computes the next row/column of any recurrence that obeys the relation u[i][j]=u[i-1][j]+u[i][j-1]+u[i-1][j-1]. _ui0 is the base case for the new row/column.*/ static OPUS_INLINE void unext(opus_uint32 *_ui,unsigned _len,opus_uint32 _ui0){ opus_uint32 ui1; unsigned j; /*This do-while will overrun the array if we don't have storage for at least 2 values.*/ j=1; do { ui1=UADD32(UADD32(_ui[j],_ui[j-1]),_ui0); _ui[j-1]=_ui0; _ui0=ui1; } while (++j<_len); _ui[j-1]=_ui0; } /*Computes the previous row/column of any recurrence that obeys the relation u[i-1][j]=u[i][j]-u[i][j-1]-u[i-1][j-1]. _ui0 is the base case for the new row/column.*/ static OPUS_INLINE void uprev(opus_uint32 *_ui,unsigned _n,opus_uint32 _ui0){ opus_uint32 ui1; unsigned j; /*This do-while will overrun the array if we don't have storage for at least 2 values.*/ j=1; do { ui1=USUB32(USUB32(_ui[j],_ui[j-1]),_ui0); _ui[j-1]=_ui0; _ui0=ui1; } while (++j<_n); _ui[j-1]=_ui0; } /*Compute V(_n,_k), as well as U(_n,0..._k+1). _u: On exit, _u[i] contains U(_n,i) for i in [0..._k+1].*/ static opus_uint32 ncwrs_urow(unsigned _n,unsigned _k,opus_uint32 *_u){ opus_uint32 um2; unsigned len; unsigned k; len=_k+2; /*We require storage at least 3 values (e.g., _k>0).*/ celt_assert(len>=3); _u[0]=0; _u[1]=um2=1; /*If _n==0, _u[0] should be 1 and the rest should be 0.*/ /*If _n==1, _u[i] should be 1 for i>1.*/ celt_assert(_n>=2); /*If _k==0, the following do-while loop will overflow the buffer.*/ celt_assert(_k>0); k=2; do _u[k]=(k<<1)-1; while(++k0); j=0; do{ opus_uint32 p; int s; int yj; p=_u[_k+1]; s=-(_i>=p); _i-=p&s; yj=_k; p=_u[_k]; while(p>_i)p=_u[--_k]; _i-=p; yj-=_k; val=(yj+s)^s; _y[j]=val; yy=MAC16_16(yy,val,val); uprev(_u,_k+2,0); } while(++j<_n); return yy; } /*Returns the index of the given combination of K elements chosen from a set of size 1 with associated sign bits. _y: The vector of pulses, whose sum of absolute values is K. _k: Returns K.*/ static OPUS_INLINE opus_uint32 icwrs1(const int *_y,int *_k){ *_k=abs(_y[0]); return _y[0]<0; } /*Returns the index of the given combination of K elements chosen from a set of size _n with associated sign bits. _y: The vector of pulses, whose sum of absolute values must be _k. _nc: Returns V(_n,_k).*/ static OPUS_INLINE opus_uint32 icwrs(int _n,int _k,opus_uint32 *_nc,const int *_y, opus_uint32 *_u){ opus_uint32 i; int j; int k; /*We can't unroll the first two iterations of the loop unless _n>=2.*/ celt_assert(_n>=2); _u[0]=0; for(k=1;k<=_k+1;k++)_u[k]=(k<<1)-1; i=icwrs1(_y+_n-1,&k); j=_n-2; i+=_u[k]; k+=abs(_y[j]); if(_y[j]<0)i+=_u[k+1]; while(j-->0){ unext(_u,_k+2,0); i+=_u[k]; k+=abs(_y[j]); if(_y[j]<0)i+=_u[k+1]; } *_nc=_u[k]+_u[k+1]; return i; } #ifdef CUSTOM_MODES void get_required_bits(opus_int16 *_bits,int _n,int _maxk,int _frac){ int k; /*_maxk==0 => there's nothing to do.*/ celt_assert(_maxk>0); _bits[0]=0; if (_n==1) { for (k=1;k<=_maxk;k++) _bits[k] = 1<<_frac; } else { VARDECL(opus_uint32,u); SAVE_STACK; ALLOC(u,_maxk+2U,opus_uint32); ncwrs_urow(_n,_maxk,u); for(k=1;k<=_maxk;k++) _bits[k]=log2_frac(u[k]+u[k+1],_frac); RESTORE_STACK; } } #endif /* CUSTOM_MODES */ void encode_pulses(const int *_y,int _n,int _k,ec_enc *_enc){ opus_uint32 i; VARDECL(opus_uint32,u); opus_uint32 nc; SAVE_STACK; celt_assert(_k>0); ALLOC(u,_k+2U,opus_uint32); i=icwrs(_n,_k,&nc,_y,u); ec_enc_uint(_enc,i,nc); RESTORE_STACK; } opus_val32 decode_pulses(int *_y,int _n,int _k,ec_dec *_dec){ VARDECL(opus_uint32,u); int ret; SAVE_STACK; celt_assert(_k>0); ALLOC(u,_k+2U,opus_uint32); ret = cwrsi(_n,_k,ec_dec_uint(_dec,ncwrs_urow(_n,_k,u)),_y,u); RESTORE_STACK; return ret; } #endif /* SMALL_FOOTPRINT */ mumble-1.3.4/3rdparty/opus-src/celt/static_modes_float_arm_ne10.h0000664000175000017500000006770514010707327024630 0ustar builderbuilder/* The contents of this file was automatically generated by * dump_mode_arm_ne10.c with arguments: 48000 960 * It contains static definitions for some pre-defined modes. */ #include #ifndef NE10_FFT_PARAMS48000_960 #define NE10_FFT_PARAMS48000_960 static const ne10_int32_t ne10_factors_480[64] = { 4, 40, 4, 30, 2, 15, 5, 3, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static const ne10_int32_t ne10_factors_240[64] = { 3, 20, 4, 15, 5, 3, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static const ne10_int32_t ne10_factors_120[64] = { 3, 10, 2, 15, 5, 3, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static const ne10_int32_t ne10_factors_60[64] = { 2, 5, 5, 3, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static const ne10_fft_cpx_float32_t ne10_twiddles_480[480] = { {1.0000000f,0.0000000f}, {1.0000000f,-0.0000000f}, {1.0000000f,-0.0000000f}, {1.0000000f,-0.0000000f}, {0.91354543f,-0.40673664f}, {0.66913056f,-0.74314487f}, {1.0000000f,-0.0000000f}, {0.66913056f,-0.74314487f}, {-0.10452851f,-0.99452192f}, {1.0000000f,-0.0000000f}, {0.30901697f,-0.95105654f}, {-0.80901700f,-0.58778518f}, {1.0000000f,-0.0000000f}, {-0.10452851f,-0.99452192f}, {-0.97814757f,0.20791179f}, {1.0000000f,-0.0000000f}, {0.97814763f,-0.20791170f}, {0.91354543f,-0.40673664f}, {0.80901700f,-0.58778524f}, {0.66913056f,-0.74314487f}, {0.49999997f,-0.86602545f}, {0.30901697f,-0.95105654f}, {0.10452842f,-0.99452192f}, {-0.10452851f,-0.99452192f}, {-0.30901703f,-0.95105648f}, {-0.50000006f,-0.86602533f}, {-0.66913068f,-0.74314475f}, {-0.80901700f,-0.58778518f}, {-0.91354549f,-0.40673658f}, {-0.97814763f,-0.20791161f}, {1.0000000f,-0.0000000f}, {0.99862951f,-0.052335959f}, {0.99452192f,-0.10452846f}, {0.98768836f,-0.15643448f}, {0.97814763f,-0.20791170f}, {0.96592581f,-0.25881904f}, {0.95105648f,-0.30901700f}, {0.93358040f,-0.35836795f}, {0.91354543f,-0.40673664f}, {0.89100653f,-0.45399052f}, {0.86602545f,-0.50000000f}, {0.83867055f,-0.54463905f}, {0.80901700f,-0.58778524f}, {0.77714598f,-0.62932038f}, {0.74314475f,-0.66913062f}, {0.70710677f,-0.70710683f}, {0.66913056f,-0.74314487f}, {0.62932038f,-0.77714598f}, {0.58778524f,-0.80901700f}, {0.54463899f,-0.83867055f}, {0.49999997f,-0.86602545f}, {0.45399052f,-0.89100653f}, {0.40673661f,-0.91354549f}, {0.35836786f,-0.93358046f}, {0.30901697f,-0.95105654f}, {0.25881907f,-0.96592581f}, {0.20791166f,-0.97814763f}, {0.15643437f,-0.98768836f}, {0.10452842f,-0.99452192f}, {0.052335974f,-0.99862951f}, {1.0000000f,-0.0000000f}, {0.99452192f,-0.10452846f}, {0.97814763f,-0.20791170f}, {0.95105648f,-0.30901700f}, {0.91354543f,-0.40673664f}, {0.86602545f,-0.50000000f}, {0.80901700f,-0.58778524f}, {0.74314475f,-0.66913062f}, {0.66913056f,-0.74314487f}, {0.58778524f,-0.80901700f}, {0.49999997f,-0.86602545f}, {0.40673661f,-0.91354549f}, {0.30901697f,-0.95105654f}, {0.20791166f,-0.97814763f}, {0.10452842f,-0.99452192f}, {-4.3711388e-08f,-1.0000000f}, {-0.10452851f,-0.99452192f}, {-0.20791174f,-0.97814757f}, {-0.30901703f,-0.95105648f}, {-0.40673670f,-0.91354543f}, {-0.50000006f,-0.86602533f}, {-0.58778518f,-0.80901700f}, {-0.66913068f,-0.74314475f}, {-0.74314493f,-0.66913044f}, {-0.80901700f,-0.58778518f}, {-0.86602539f,-0.50000006f}, {-0.91354549f,-0.40673658f}, {-0.95105654f,-0.30901679f}, {-0.97814763f,-0.20791161f}, {-0.99452192f,-0.10452849f}, {1.0000000f,-0.0000000f}, {0.98768836f,-0.15643448f}, {0.95105648f,-0.30901700f}, {0.89100653f,-0.45399052f}, {0.80901700f,-0.58778524f}, {0.70710677f,-0.70710683f}, {0.58778524f,-0.80901700f}, {0.45399052f,-0.89100653f}, {0.30901697f,-0.95105654f}, {0.15643437f,-0.98768836f}, {-4.3711388e-08f,-1.0000000f}, {-0.15643445f,-0.98768836f}, {-0.30901703f,-0.95105648f}, {-0.45399061f,-0.89100647f}, {-0.58778518f,-0.80901700f}, {-0.70710677f,-0.70710677f}, {-0.80901700f,-0.58778518f}, {-0.89100659f,-0.45399037f}, {-0.95105654f,-0.30901679f}, {-0.98768836f,-0.15643445f}, {-1.0000000f,8.7422777e-08f}, {-0.98768830f,0.15643461f}, {-0.95105654f,0.30901697f}, {-0.89100653f,0.45399055f}, {-0.80901694f,0.58778536f}, {-0.70710665f,0.70710689f}, {-0.58778507f,0.80901712f}, {-0.45399022f,0.89100665f}, {-0.30901709f,0.95105648f}, {-0.15643452f,0.98768830f}, {1.0000000f,-0.0000000f}, {0.99991435f,-0.013089596f}, {0.99965733f,-0.026176950f}, {0.99922901f,-0.039259817f}, {0.99862951f,-0.052335959f}, {0.99785894f,-0.065403134f}, {0.99691731f,-0.078459099f}, {0.99580491f,-0.091501623f}, {0.99452192f,-0.10452846f}, {0.99306846f,-0.11753740f}, {0.99144489f,-0.13052620f}, {0.98965138f,-0.14349262f}, {0.98768836f,-0.15643448f}, {0.98555607f,-0.16934951f}, {0.98325491f,-0.18223552f}, {0.98078525f,-0.19509032f}, {0.97814763f,-0.20791170f}, {0.97534233f,-0.22069745f}, {0.97236991f,-0.23344538f}, {0.96923089f,-0.24615330f}, {0.96592581f,-0.25881904f}, {0.96245521f,-0.27144045f}, {0.95881975f,-0.28401536f}, {0.95501995f,-0.29654160f}, {0.95105648f,-0.30901700f}, {0.94693011f,-0.32143945f}, {0.94264150f,-0.33380687f}, {0.93819129f,-0.34611708f}, {0.93358040f,-0.35836795f}, {0.92880952f,-0.37055743f}, {0.92387956f,-0.38268346f}, {0.91879117f,-0.39474389f}, {0.91354543f,-0.40673664f}, {0.90814316f,-0.41865975f}, {0.90258527f,-0.43051112f}, {0.89687270f,-0.44228873f}, {0.89100653f,-0.45399052f}, {0.88498765f,-0.46561453f}, {0.87881708f,-0.47715878f}, {0.87249601f,-0.48862126f}, {0.86602545f,-0.50000000f}, {0.85940641f,-0.51129311f}, {0.85264015f,-0.52249855f}, {0.84572786f,-0.53361452f}, {0.83867055f,-0.54463905f}, {0.83146960f,-0.55557024f}, {0.82412618f,-0.56640625f}, {0.81664151f,-0.57714522f}, {0.80901700f,-0.58778524f}, {0.80125380f,-0.59832460f}, {0.79335332f,-0.60876143f}, {0.78531694f,-0.61909395f}, {0.77714598f,-0.62932038f}, {0.76884180f,-0.63943899f}, {0.76040596f,-0.64944810f}, {0.75183982f,-0.65934587f}, {0.74314475f,-0.66913062f}, {0.73432249f,-0.67880076f}, {0.72537434f,-0.68835455f}, {0.71630192f,-0.69779050f}, {0.70710677f,-0.70710683f}, {0.69779044f,-0.71630198f}, {0.68835455f,-0.72537440f}, {0.67880070f,-0.73432255f}, {0.66913056f,-0.74314487f}, {0.65934581f,-0.75183982f}, {0.64944804f,-0.76040596f}, {0.63943899f,-0.76884186f}, {0.62932038f,-0.77714598f}, {0.61909395f,-0.78531694f}, {0.60876137f,-0.79335338f}, {0.59832460f,-0.80125386f}, {0.58778524f,-0.80901700f}, {0.57714516f,-0.81664151f}, {0.56640625f,-0.82412618f}, {0.55557019f,-0.83146960f}, {0.54463899f,-0.83867055f}, {0.53361452f,-0.84572786f}, {0.52249849f,-0.85264015f}, {0.51129311f,-0.85940641f}, {0.49999997f,-0.86602545f}, {0.48862118f,-0.87249601f}, {0.47715876f,-0.87881708f}, {0.46561447f,-0.88498765f}, {0.45399052f,-0.89100653f}, {0.44228867f,-0.89687276f}, {0.43051103f,-0.90258533f}, {0.41865975f,-0.90814316f}, {0.40673661f,-0.91354549f}, {0.39474380f,-0.91879129f}, {0.38268343f,-0.92387956f}, {0.37055740f,-0.92880958f}, {0.35836786f,-0.93358046f}, {0.34611705f,-0.93819135f}, {0.33380681f,-0.94264150f}, {0.32143947f,-0.94693011f}, {0.30901697f,-0.95105654f}, {0.29654151f,-0.95501995f}, {0.28401533f,-0.95881975f}, {0.27144039f,-0.96245527f}, {0.25881907f,-0.96592581f}, {0.24615327f,-0.96923089f}, {0.23344530f,-0.97236991f}, {0.22069745f,-0.97534233f}, {0.20791166f,-0.97814763f}, {0.19509023f,-0.98078531f}, {0.18223552f,-0.98325491f}, {0.16934945f,-0.98555607f}, {0.15643437f,-0.98768836f}, {0.14349259f,-0.98965138f}, {0.13052613f,-0.99144489f}, {0.11753740f,-0.99306846f}, {0.10452842f,-0.99452192f}, {0.091501534f,-0.99580491f}, {0.078459084f,-0.99691731f}, {0.065403074f,-0.99785894f}, {0.052335974f,-0.99862951f}, {0.039259788f,-0.99922901f}, {0.026176875f,-0.99965733f}, {0.013089597f,-0.99991435f}, {1.0000000f,-0.0000000f}, {0.99965733f,-0.026176950f}, {0.99862951f,-0.052335959f}, {0.99691731f,-0.078459099f}, {0.99452192f,-0.10452846f}, {0.99144489f,-0.13052620f}, {0.98768836f,-0.15643448f}, {0.98325491f,-0.18223552f}, {0.97814763f,-0.20791170f}, {0.97236991f,-0.23344538f}, {0.96592581f,-0.25881904f}, {0.95881975f,-0.28401536f}, {0.95105648f,-0.30901700f}, {0.94264150f,-0.33380687f}, {0.93358040f,-0.35836795f}, {0.92387956f,-0.38268346f}, {0.91354543f,-0.40673664f}, {0.90258527f,-0.43051112f}, {0.89100653f,-0.45399052f}, {0.87881708f,-0.47715878f}, {0.86602545f,-0.50000000f}, {0.85264015f,-0.52249855f}, {0.83867055f,-0.54463905f}, {0.82412618f,-0.56640625f}, {0.80901700f,-0.58778524f}, {0.79335332f,-0.60876143f}, {0.77714598f,-0.62932038f}, {0.76040596f,-0.64944810f}, {0.74314475f,-0.66913062f}, {0.72537434f,-0.68835455f}, {0.70710677f,-0.70710683f}, {0.68835455f,-0.72537440f}, {0.66913056f,-0.74314487f}, {0.64944804f,-0.76040596f}, {0.62932038f,-0.77714598f}, {0.60876137f,-0.79335338f}, {0.58778524f,-0.80901700f}, {0.56640625f,-0.82412618f}, {0.54463899f,-0.83867055f}, {0.52249849f,-0.85264015f}, {0.49999997f,-0.86602545f}, {0.47715876f,-0.87881708f}, {0.45399052f,-0.89100653f}, {0.43051103f,-0.90258533f}, {0.40673661f,-0.91354549f}, {0.38268343f,-0.92387956f}, {0.35836786f,-0.93358046f}, {0.33380681f,-0.94264150f}, {0.30901697f,-0.95105654f}, {0.28401533f,-0.95881975f}, {0.25881907f,-0.96592581f}, {0.23344530f,-0.97236991f}, {0.20791166f,-0.97814763f}, {0.18223552f,-0.98325491f}, {0.15643437f,-0.98768836f}, {0.13052613f,-0.99144489f}, {0.10452842f,-0.99452192f}, {0.078459084f,-0.99691731f}, {0.052335974f,-0.99862951f}, {0.026176875f,-0.99965733f}, {-4.3711388e-08f,-1.0000000f}, {-0.026176963f,-0.99965733f}, {-0.052336060f,-0.99862951f}, {-0.078459173f,-0.99691731f}, {-0.10452851f,-0.99452192f}, {-0.13052621f,-0.99144489f}, {-0.15643445f,-0.98768836f}, {-0.18223560f,-0.98325491f}, {-0.20791174f,-0.97814757f}, {-0.23344538f,-0.97236991f}, {-0.25881916f,-0.96592581f}, {-0.28401542f,-0.95881969f}, {-0.30901703f,-0.95105648f}, {-0.33380687f,-0.94264150f}, {-0.35836795f,-0.93358040f}, {-0.38268352f,-0.92387950f}, {-0.40673670f,-0.91354543f}, {-0.43051112f,-0.90258527f}, {-0.45399061f,-0.89100647f}, {-0.47715873f,-0.87881708f}, {-0.50000006f,-0.86602533f}, {-0.52249867f,-0.85264009f}, {-0.54463905f,-0.83867055f}, {-0.56640631f,-0.82412612f}, {-0.58778518f,-0.80901700f}, {-0.60876143f,-0.79335332f}, {-0.62932050f,-0.77714586f}, {-0.64944804f,-0.76040596f}, {-0.66913068f,-0.74314475f}, {-0.68835467f,-0.72537428f}, {-0.70710677f,-0.70710677f}, {-0.72537446f,-0.68835449f}, {-0.74314493f,-0.66913044f}, {-0.76040596f,-0.64944804f}, {-0.77714604f,-0.62932026f}, {-0.79335332f,-0.60876143f}, {-0.80901700f,-0.58778518f}, {-0.82412624f,-0.56640613f}, {-0.83867055f,-0.54463899f}, {-0.85264021f,-0.52249849f}, {-0.86602539f,-0.50000006f}, {-0.87881714f,-0.47715873f}, {-0.89100659f,-0.45399037f}, {-0.90258527f,-0.43051112f}, {-0.91354549f,-0.40673658f}, {-0.92387956f,-0.38268328f}, {-0.93358040f,-0.35836792f}, {-0.94264150f,-0.33380675f}, {-0.95105654f,-0.30901679f}, {-0.95881975f,-0.28401530f}, {-0.96592587f,-0.25881892f}, {-0.97236991f,-0.23344538f}, {-0.97814763f,-0.20791161f}, {-0.98325491f,-0.18223536f}, {-0.98768836f,-0.15643445f}, {-0.99144489f,-0.13052608f}, {-0.99452192f,-0.10452849f}, {-0.99691737f,-0.078459039f}, {-0.99862957f,-0.052335810f}, {-0.99965733f,-0.026176952f}, {1.0000000f,-0.0000000f}, {0.99922901f,-0.039259817f}, {0.99691731f,-0.078459099f}, {0.99306846f,-0.11753740f}, {0.98768836f,-0.15643448f}, {0.98078525f,-0.19509032f}, {0.97236991f,-0.23344538f}, {0.96245521f,-0.27144045f}, {0.95105648f,-0.30901700f}, {0.93819129f,-0.34611708f}, {0.92387956f,-0.38268346f}, {0.90814316f,-0.41865975f}, {0.89100653f,-0.45399052f}, {0.87249601f,-0.48862126f}, {0.85264015f,-0.52249855f}, {0.83146960f,-0.55557024f}, {0.80901700f,-0.58778524f}, {0.78531694f,-0.61909395f}, {0.76040596f,-0.64944810f}, {0.73432249f,-0.67880076f}, {0.70710677f,-0.70710683f}, {0.67880070f,-0.73432255f}, {0.64944804f,-0.76040596f}, {0.61909395f,-0.78531694f}, {0.58778524f,-0.80901700f}, {0.55557019f,-0.83146960f}, {0.52249849f,-0.85264015f}, {0.48862118f,-0.87249601f}, {0.45399052f,-0.89100653f}, {0.41865975f,-0.90814316f}, {0.38268343f,-0.92387956f}, {0.34611705f,-0.93819135f}, {0.30901697f,-0.95105654f}, {0.27144039f,-0.96245527f}, {0.23344530f,-0.97236991f}, {0.19509023f,-0.98078531f}, {0.15643437f,-0.98768836f}, {0.11753740f,-0.99306846f}, {0.078459084f,-0.99691731f}, {0.039259788f,-0.99922901f}, {-4.3711388e-08f,-1.0000000f}, {-0.039259877f,-0.99922901f}, {-0.078459173f,-0.99691731f}, {-0.11753749f,-0.99306846f}, {-0.15643445f,-0.98768836f}, {-0.19509032f,-0.98078525f}, {-0.23344538f,-0.97236991f}, {-0.27144048f,-0.96245521f}, {-0.30901703f,-0.95105648f}, {-0.34611711f,-0.93819129f}, {-0.38268352f,-0.92387950f}, {-0.41865984f,-0.90814310f}, {-0.45399061f,-0.89100647f}, {-0.48862135f,-0.87249595f}, {-0.52249867f,-0.85264009f}, {-0.55557036f,-0.83146954f}, {-0.58778518f,-0.80901700f}, {-0.61909389f,-0.78531694f}, {-0.64944804f,-0.76040596f}, {-0.67880076f,-0.73432249f}, {-0.70710677f,-0.70710677f}, {-0.73432249f,-0.67880070f}, {-0.76040596f,-0.64944804f}, {-0.78531694f,-0.61909389f}, {-0.80901700f,-0.58778518f}, {-0.83146966f,-0.55557019f}, {-0.85264021f,-0.52249849f}, {-0.87249607f,-0.48862115f}, {-0.89100659f,-0.45399037f}, {-0.90814322f,-0.41865960f}, {-0.92387956f,-0.38268328f}, {-0.93819135f,-0.34611690f}, {-0.95105654f,-0.30901679f}, {-0.96245521f,-0.27144048f}, {-0.97236991f,-0.23344538f}, {-0.98078531f,-0.19509031f}, {-0.98768836f,-0.15643445f}, {-0.99306846f,-0.11753736f}, {-0.99691737f,-0.078459039f}, {-0.99922901f,-0.039259743f}, {-1.0000000f,8.7422777e-08f}, {-0.99922901f,0.039259918f}, {-0.99691731f,0.078459218f}, {-0.99306846f,0.11753753f}, {-0.98768830f,0.15643461f}, {-0.98078525f,0.19509049f}, {-0.97236985f,0.23344554f}, {-0.96245515f,0.27144065f}, {-0.95105654f,0.30901697f}, {-0.93819135f,0.34611705f}, {-0.92387956f,0.38268346f}, {-0.90814316f,0.41865975f}, {-0.89100653f,0.45399055f}, {-0.87249601f,0.48862129f}, {-0.85264015f,0.52249861f}, {-0.83146960f,0.55557030f}, {-0.80901694f,0.58778536f}, {-0.78531688f,0.61909401f}, {-0.76040590f,0.64944816f}, {-0.73432243f,0.67880082f}, {-0.70710665f,0.70710689f}, {-0.67880058f,0.73432261f}, {-0.64944792f,0.76040608f}, {-0.61909378f,0.78531706f}, {-0.58778507f,0.80901712f}, {-0.55557001f,0.83146977f}, {-0.52249837f,0.85264033f}, {-0.48862100f,0.87249613f}, {-0.45399022f,0.89100665f}, {-0.41865945f,0.90814328f}, {-0.38268313f,0.92387968f}, {-0.34611672f,0.93819147f}, {-0.30901709f,0.95105648f}, {-0.27144054f,0.96245521f}, {-0.23344545f,0.97236991f}, {-0.19509038f,0.98078525f}, {-0.15643452f,0.98768830f}, {-0.11753743f,0.99306846f}, {-0.078459114f,0.99691731f}, {-0.039259821f,0.99922901f}, }; static const ne10_fft_cpx_float32_t ne10_twiddles_240[240] = { {1.0000000f,0.0000000f}, {1.0000000f,-0.0000000f}, {1.0000000f,-0.0000000f}, {1.0000000f,-0.0000000f}, {0.91354543f,-0.40673664f}, {0.66913056f,-0.74314487f}, {1.0000000f,-0.0000000f}, {0.66913056f,-0.74314487f}, {-0.10452851f,-0.99452192f}, {1.0000000f,-0.0000000f}, {0.30901697f,-0.95105654f}, {-0.80901700f,-0.58778518f}, {1.0000000f,-0.0000000f}, {-0.10452851f,-0.99452192f}, {-0.97814757f,0.20791179f}, {1.0000000f,-0.0000000f}, {0.99452192f,-0.10452846f}, {0.97814763f,-0.20791170f}, {0.95105648f,-0.30901700f}, {0.91354543f,-0.40673664f}, {0.86602545f,-0.50000000f}, {0.80901700f,-0.58778524f}, {0.74314475f,-0.66913062f}, {0.66913056f,-0.74314487f}, {0.58778524f,-0.80901700f}, {0.49999997f,-0.86602545f}, {0.40673661f,-0.91354549f}, {0.30901697f,-0.95105654f}, {0.20791166f,-0.97814763f}, {0.10452842f,-0.99452192f}, {1.0000000f,-0.0000000f}, {0.97814763f,-0.20791170f}, {0.91354543f,-0.40673664f}, {0.80901700f,-0.58778524f}, {0.66913056f,-0.74314487f}, {0.49999997f,-0.86602545f}, {0.30901697f,-0.95105654f}, {0.10452842f,-0.99452192f}, {-0.10452851f,-0.99452192f}, {-0.30901703f,-0.95105648f}, {-0.50000006f,-0.86602533f}, {-0.66913068f,-0.74314475f}, {-0.80901700f,-0.58778518f}, {-0.91354549f,-0.40673658f}, {-0.97814763f,-0.20791161f}, {1.0000000f,-0.0000000f}, {0.95105648f,-0.30901700f}, {0.80901700f,-0.58778524f}, {0.58778524f,-0.80901700f}, {0.30901697f,-0.95105654f}, {-4.3711388e-08f,-1.0000000f}, {-0.30901703f,-0.95105648f}, {-0.58778518f,-0.80901700f}, {-0.80901700f,-0.58778518f}, {-0.95105654f,-0.30901679f}, {-1.0000000f,8.7422777e-08f}, {-0.95105654f,0.30901697f}, {-0.80901694f,0.58778536f}, {-0.58778507f,0.80901712f}, {-0.30901709f,0.95105648f}, {1.0000000f,-0.0000000f}, {0.99965733f,-0.026176950f}, {0.99862951f,-0.052335959f}, {0.99691731f,-0.078459099f}, {0.99452192f,-0.10452846f}, {0.99144489f,-0.13052620f}, {0.98768836f,-0.15643448f}, {0.98325491f,-0.18223552f}, {0.97814763f,-0.20791170f}, {0.97236991f,-0.23344538f}, {0.96592581f,-0.25881904f}, {0.95881975f,-0.28401536f}, {0.95105648f,-0.30901700f}, {0.94264150f,-0.33380687f}, {0.93358040f,-0.35836795f}, {0.92387956f,-0.38268346f}, {0.91354543f,-0.40673664f}, {0.90258527f,-0.43051112f}, {0.89100653f,-0.45399052f}, {0.87881708f,-0.47715878f}, {0.86602545f,-0.50000000f}, {0.85264015f,-0.52249855f}, {0.83867055f,-0.54463905f}, {0.82412618f,-0.56640625f}, {0.80901700f,-0.58778524f}, {0.79335332f,-0.60876143f}, {0.77714598f,-0.62932038f}, {0.76040596f,-0.64944810f}, {0.74314475f,-0.66913062f}, {0.72537434f,-0.68835455f}, {0.70710677f,-0.70710683f}, {0.68835455f,-0.72537440f}, {0.66913056f,-0.74314487f}, {0.64944804f,-0.76040596f}, {0.62932038f,-0.77714598f}, {0.60876137f,-0.79335338f}, {0.58778524f,-0.80901700f}, {0.56640625f,-0.82412618f}, {0.54463899f,-0.83867055f}, {0.52249849f,-0.85264015f}, {0.49999997f,-0.86602545f}, {0.47715876f,-0.87881708f}, {0.45399052f,-0.89100653f}, {0.43051103f,-0.90258533f}, {0.40673661f,-0.91354549f}, {0.38268343f,-0.92387956f}, {0.35836786f,-0.93358046f}, {0.33380681f,-0.94264150f}, {0.30901697f,-0.95105654f}, {0.28401533f,-0.95881975f}, {0.25881907f,-0.96592581f}, {0.23344530f,-0.97236991f}, {0.20791166f,-0.97814763f}, {0.18223552f,-0.98325491f}, {0.15643437f,-0.98768836f}, {0.13052613f,-0.99144489f}, {0.10452842f,-0.99452192f}, {0.078459084f,-0.99691731f}, {0.052335974f,-0.99862951f}, {0.026176875f,-0.99965733f}, {1.0000000f,-0.0000000f}, {0.99862951f,-0.052335959f}, {0.99452192f,-0.10452846f}, {0.98768836f,-0.15643448f}, {0.97814763f,-0.20791170f}, {0.96592581f,-0.25881904f}, {0.95105648f,-0.30901700f}, {0.93358040f,-0.35836795f}, {0.91354543f,-0.40673664f}, {0.89100653f,-0.45399052f}, {0.86602545f,-0.50000000f}, {0.83867055f,-0.54463905f}, {0.80901700f,-0.58778524f}, {0.77714598f,-0.62932038f}, {0.74314475f,-0.66913062f}, {0.70710677f,-0.70710683f}, {0.66913056f,-0.74314487f}, {0.62932038f,-0.77714598f}, {0.58778524f,-0.80901700f}, {0.54463899f,-0.83867055f}, {0.49999997f,-0.86602545f}, {0.45399052f,-0.89100653f}, {0.40673661f,-0.91354549f}, {0.35836786f,-0.93358046f}, {0.30901697f,-0.95105654f}, {0.25881907f,-0.96592581f}, {0.20791166f,-0.97814763f}, {0.15643437f,-0.98768836f}, {0.10452842f,-0.99452192f}, {0.052335974f,-0.99862951f}, {-4.3711388e-08f,-1.0000000f}, {-0.052336060f,-0.99862951f}, {-0.10452851f,-0.99452192f}, {-0.15643445f,-0.98768836f}, {-0.20791174f,-0.97814757f}, {-0.25881916f,-0.96592581f}, {-0.30901703f,-0.95105648f}, {-0.35836795f,-0.93358040f}, {-0.40673670f,-0.91354543f}, {-0.45399061f,-0.89100647f}, {-0.50000006f,-0.86602533f}, {-0.54463905f,-0.83867055f}, {-0.58778518f,-0.80901700f}, {-0.62932050f,-0.77714586f}, {-0.66913068f,-0.74314475f}, {-0.70710677f,-0.70710677f}, {-0.74314493f,-0.66913044f}, {-0.77714604f,-0.62932026f}, {-0.80901700f,-0.58778518f}, {-0.83867055f,-0.54463899f}, {-0.86602539f,-0.50000006f}, {-0.89100659f,-0.45399037f}, {-0.91354549f,-0.40673658f}, {-0.93358040f,-0.35836792f}, {-0.95105654f,-0.30901679f}, {-0.96592587f,-0.25881892f}, {-0.97814763f,-0.20791161f}, {-0.98768836f,-0.15643445f}, {-0.99452192f,-0.10452849f}, {-0.99862957f,-0.052335810f}, {1.0000000f,-0.0000000f}, {0.99691731f,-0.078459099f}, {0.98768836f,-0.15643448f}, {0.97236991f,-0.23344538f}, {0.95105648f,-0.30901700f}, {0.92387956f,-0.38268346f}, {0.89100653f,-0.45399052f}, {0.85264015f,-0.52249855f}, {0.80901700f,-0.58778524f}, {0.76040596f,-0.64944810f}, {0.70710677f,-0.70710683f}, {0.64944804f,-0.76040596f}, {0.58778524f,-0.80901700f}, {0.52249849f,-0.85264015f}, {0.45399052f,-0.89100653f}, {0.38268343f,-0.92387956f}, {0.30901697f,-0.95105654f}, {0.23344530f,-0.97236991f}, {0.15643437f,-0.98768836f}, {0.078459084f,-0.99691731f}, {-4.3711388e-08f,-1.0000000f}, {-0.078459173f,-0.99691731f}, {-0.15643445f,-0.98768836f}, {-0.23344538f,-0.97236991f}, {-0.30901703f,-0.95105648f}, {-0.38268352f,-0.92387950f}, {-0.45399061f,-0.89100647f}, {-0.52249867f,-0.85264009f}, {-0.58778518f,-0.80901700f}, {-0.64944804f,-0.76040596f}, {-0.70710677f,-0.70710677f}, {-0.76040596f,-0.64944804f}, {-0.80901700f,-0.58778518f}, {-0.85264021f,-0.52249849f}, {-0.89100659f,-0.45399037f}, {-0.92387956f,-0.38268328f}, {-0.95105654f,-0.30901679f}, {-0.97236991f,-0.23344538f}, {-0.98768836f,-0.15643445f}, {-0.99691737f,-0.078459039f}, {-1.0000000f,8.7422777e-08f}, {-0.99691731f,0.078459218f}, {-0.98768830f,0.15643461f}, {-0.97236985f,0.23344554f}, {-0.95105654f,0.30901697f}, {-0.92387956f,0.38268346f}, {-0.89100653f,0.45399055f}, {-0.85264015f,0.52249861f}, {-0.80901694f,0.58778536f}, {-0.76040590f,0.64944816f}, {-0.70710665f,0.70710689f}, {-0.64944792f,0.76040608f}, {-0.58778507f,0.80901712f}, {-0.52249837f,0.85264033f}, {-0.45399022f,0.89100665f}, {-0.38268313f,0.92387968f}, {-0.30901709f,0.95105648f}, {-0.23344545f,0.97236991f}, {-0.15643452f,0.98768830f}, {-0.078459114f,0.99691731f}, }; static const ne10_fft_cpx_float32_t ne10_twiddles_120[120] = { {1.0000000f,0.0000000f}, {1.0000000f,-0.0000000f}, {1.0000000f,-0.0000000f}, {1.0000000f,-0.0000000f}, {0.91354543f,-0.40673664f}, {0.66913056f,-0.74314487f}, {1.0000000f,-0.0000000f}, {0.66913056f,-0.74314487f}, {-0.10452851f,-0.99452192f}, {1.0000000f,-0.0000000f}, {0.30901697f,-0.95105654f}, {-0.80901700f,-0.58778518f}, {1.0000000f,-0.0000000f}, {-0.10452851f,-0.99452192f}, {-0.97814757f,0.20791179f}, {1.0000000f,-0.0000000f}, {0.97814763f,-0.20791170f}, {0.91354543f,-0.40673664f}, {0.80901700f,-0.58778524f}, {0.66913056f,-0.74314487f}, {0.49999997f,-0.86602545f}, {0.30901697f,-0.95105654f}, {0.10452842f,-0.99452192f}, {-0.10452851f,-0.99452192f}, {-0.30901703f,-0.95105648f}, {-0.50000006f,-0.86602533f}, {-0.66913068f,-0.74314475f}, {-0.80901700f,-0.58778518f}, {-0.91354549f,-0.40673658f}, {-0.97814763f,-0.20791161f}, {1.0000000f,-0.0000000f}, {0.99862951f,-0.052335959f}, {0.99452192f,-0.10452846f}, {0.98768836f,-0.15643448f}, {0.97814763f,-0.20791170f}, {0.96592581f,-0.25881904f}, {0.95105648f,-0.30901700f}, {0.93358040f,-0.35836795f}, {0.91354543f,-0.40673664f}, {0.89100653f,-0.45399052f}, {0.86602545f,-0.50000000f}, {0.83867055f,-0.54463905f}, {0.80901700f,-0.58778524f}, {0.77714598f,-0.62932038f}, {0.74314475f,-0.66913062f}, {0.70710677f,-0.70710683f}, {0.66913056f,-0.74314487f}, {0.62932038f,-0.77714598f}, {0.58778524f,-0.80901700f}, {0.54463899f,-0.83867055f}, {0.49999997f,-0.86602545f}, {0.45399052f,-0.89100653f}, {0.40673661f,-0.91354549f}, {0.35836786f,-0.93358046f}, {0.30901697f,-0.95105654f}, {0.25881907f,-0.96592581f}, {0.20791166f,-0.97814763f}, {0.15643437f,-0.98768836f}, {0.10452842f,-0.99452192f}, {0.052335974f,-0.99862951f}, {1.0000000f,-0.0000000f}, {0.99452192f,-0.10452846f}, {0.97814763f,-0.20791170f}, {0.95105648f,-0.30901700f}, {0.91354543f,-0.40673664f}, {0.86602545f,-0.50000000f}, {0.80901700f,-0.58778524f}, {0.74314475f,-0.66913062f}, {0.66913056f,-0.74314487f}, {0.58778524f,-0.80901700f}, {0.49999997f,-0.86602545f}, {0.40673661f,-0.91354549f}, {0.30901697f,-0.95105654f}, {0.20791166f,-0.97814763f}, {0.10452842f,-0.99452192f}, {-4.3711388e-08f,-1.0000000f}, {-0.10452851f,-0.99452192f}, {-0.20791174f,-0.97814757f}, {-0.30901703f,-0.95105648f}, {-0.40673670f,-0.91354543f}, {-0.50000006f,-0.86602533f}, {-0.58778518f,-0.80901700f}, {-0.66913068f,-0.74314475f}, {-0.74314493f,-0.66913044f}, {-0.80901700f,-0.58778518f}, {-0.86602539f,-0.50000006f}, {-0.91354549f,-0.40673658f}, {-0.95105654f,-0.30901679f}, {-0.97814763f,-0.20791161f}, {-0.99452192f,-0.10452849f}, {1.0000000f,-0.0000000f}, {0.98768836f,-0.15643448f}, {0.95105648f,-0.30901700f}, {0.89100653f,-0.45399052f}, {0.80901700f,-0.58778524f}, {0.70710677f,-0.70710683f}, {0.58778524f,-0.80901700f}, {0.45399052f,-0.89100653f}, {0.30901697f,-0.95105654f}, {0.15643437f,-0.98768836f}, {-4.3711388e-08f,-1.0000000f}, {-0.15643445f,-0.98768836f}, {-0.30901703f,-0.95105648f}, {-0.45399061f,-0.89100647f}, {-0.58778518f,-0.80901700f}, {-0.70710677f,-0.70710677f}, {-0.80901700f,-0.58778518f}, {-0.89100659f,-0.45399037f}, {-0.95105654f,-0.30901679f}, {-0.98768836f,-0.15643445f}, {-1.0000000f,8.7422777e-08f}, {-0.98768830f,0.15643461f}, {-0.95105654f,0.30901697f}, {-0.89100653f,0.45399055f}, {-0.80901694f,0.58778536f}, {-0.70710665f,0.70710689f}, {-0.58778507f,0.80901712f}, {-0.45399022f,0.89100665f}, {-0.30901709f,0.95105648f}, {-0.15643452f,0.98768830f}, }; static const ne10_fft_cpx_float32_t ne10_twiddles_60[60] = { {1.0000000f,0.0000000f}, {1.0000000f,-0.0000000f}, {1.0000000f,-0.0000000f}, {1.0000000f,-0.0000000f}, {0.91354543f,-0.40673664f}, {0.66913056f,-0.74314487f}, {1.0000000f,-0.0000000f}, {0.66913056f,-0.74314487f}, {-0.10452851f,-0.99452192f}, {1.0000000f,-0.0000000f}, {0.30901697f,-0.95105654f}, {-0.80901700f,-0.58778518f}, {1.0000000f,-0.0000000f}, {-0.10452851f,-0.99452192f}, {-0.97814757f,0.20791179f}, {1.0000000f,-0.0000000f}, {0.99452192f,-0.10452846f}, {0.97814763f,-0.20791170f}, {0.95105648f,-0.30901700f}, {0.91354543f,-0.40673664f}, {0.86602545f,-0.50000000f}, {0.80901700f,-0.58778524f}, {0.74314475f,-0.66913062f}, {0.66913056f,-0.74314487f}, {0.58778524f,-0.80901700f}, {0.49999997f,-0.86602545f}, {0.40673661f,-0.91354549f}, {0.30901697f,-0.95105654f}, {0.20791166f,-0.97814763f}, {0.10452842f,-0.99452192f}, {1.0000000f,-0.0000000f}, {0.97814763f,-0.20791170f}, {0.91354543f,-0.40673664f}, {0.80901700f,-0.58778524f}, {0.66913056f,-0.74314487f}, {0.49999997f,-0.86602545f}, {0.30901697f,-0.95105654f}, {0.10452842f,-0.99452192f}, {-0.10452851f,-0.99452192f}, {-0.30901703f,-0.95105648f}, {-0.50000006f,-0.86602533f}, {-0.66913068f,-0.74314475f}, {-0.80901700f,-0.58778518f}, {-0.91354549f,-0.40673658f}, {-0.97814763f,-0.20791161f}, {1.0000000f,-0.0000000f}, {0.95105648f,-0.30901700f}, {0.80901700f,-0.58778524f}, {0.58778524f,-0.80901700f}, {0.30901697f,-0.95105654f}, {-4.3711388e-08f,-1.0000000f}, {-0.30901703f,-0.95105648f}, {-0.58778518f,-0.80901700f}, {-0.80901700f,-0.58778518f}, {-0.95105654f,-0.30901679f}, {-1.0000000f,8.7422777e-08f}, {-0.95105654f,0.30901697f}, {-0.80901694f,0.58778536f}, {-0.58778507f,0.80901712f}, {-0.30901709f,0.95105648f}, }; static const ne10_fft_state_float32_t ne10_fft_state_float32_t_480 = { 120, (ne10_int32_t *)ne10_factors_480, (ne10_fft_cpx_float32_t *)ne10_twiddles_480, NULL, (ne10_fft_cpx_float32_t *)&ne10_twiddles_480[120], /* is_forward_scaled = true */ (ne10_int32_t) 1, /* is_backward_scaled = false */ (ne10_int32_t) 0, }; static const arch_fft_state cfg_arch_480 = { 1, (void *)&ne10_fft_state_float32_t_480, }; static const ne10_fft_state_float32_t ne10_fft_state_float32_t_240 = { 60, (ne10_int32_t *)ne10_factors_240, (ne10_fft_cpx_float32_t *)ne10_twiddles_240, NULL, (ne10_fft_cpx_float32_t *)&ne10_twiddles_240[60], /* is_forward_scaled = true */ (ne10_int32_t) 1, /* is_backward_scaled = false */ (ne10_int32_t) 0, }; static const arch_fft_state cfg_arch_240 = { 1, (void *)&ne10_fft_state_float32_t_240, }; static const ne10_fft_state_float32_t ne10_fft_state_float32_t_120 = { 30, (ne10_int32_t *)ne10_factors_120, (ne10_fft_cpx_float32_t *)ne10_twiddles_120, NULL, (ne10_fft_cpx_float32_t *)&ne10_twiddles_120[30], /* is_forward_scaled = true */ (ne10_int32_t) 1, /* is_backward_scaled = false */ (ne10_int32_t) 0, }; static const arch_fft_state cfg_arch_120 = { 1, (void *)&ne10_fft_state_float32_t_120, }; static const ne10_fft_state_float32_t ne10_fft_state_float32_t_60 = { 15, (ne10_int32_t *)ne10_factors_60, (ne10_fft_cpx_float32_t *)ne10_twiddles_60, NULL, (ne10_fft_cpx_float32_t *)&ne10_twiddles_60[15], /* is_forward_scaled = true */ (ne10_int32_t) 1, /* is_backward_scaled = false */ (ne10_int32_t) 0, }; static const arch_fft_state cfg_arch_60 = { 1, (void *)&ne10_fft_state_float32_t_60, }; #endif /* end NE10_FFT_PARAMS48000_960 */ mumble-1.3.4/3rdparty/opus-src/celt/fixed_c6x.h0000664000175000017500000000421514010707327021145 0ustar builderbuilder/* Copyright (C) 2008 CSIRO */ /** @file fixed_c6x.h @brief Fixed-point operations for the TI C6x DSP family */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef FIXED_C6X_H #define FIXED_C6X_H #undef MULT16_16SU #define MULT16_16SU(a,b) _mpysu(a,b) #undef MULT_16_16 #define MULT_16_16(a,b) _mpy(a,b) #define celt_ilog2(x) (30 - _norm(x)) #define OVERRIDE_CELT_ILOG2 #undef MULT16_32_Q15 #define MULT16_32_Q15(a,b) (_mpylill(a, b) >> 15) #if 0 #include "dsplib.h" #undef MAX16 #define MAX16(a,b) _max(a,b) #undef MIN16 #define MIN16(a,b) _min(a,b) #undef MAX32 #define MAX32(a,b) _lmax(a,b) #undef MIN32 #define MIN32(a,b) _lmin(a,b) #undef VSHR32 #define VSHR32(a, shift) _lshl(a,-(shift)) #undef MULT16_16_Q15 #define MULT16_16_Q15(a,b) (_smpy(a,b)) #define celt_maxabs16(x, len) MAX32(EXTEND32(maxval((DATA *)x, len)),-EXTEND32(minval((DATA *)x, len))) #define OVERRIDE_CELT_MAXABS16 #endif /* FIXED_C6X_H */ mumble-1.3.4/3rdparty/opus-src/celt/opus_custom_demo.c0000664000175000017500000001414314010707327022646 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "opus_custom.h" #include "arch.h" #include #include #include #include #define MAX_PACKET 1275 int main(int argc, char *argv[]) { int err; char *inFile, *outFile; FILE *fin, *fout; OpusCustomMode *mode=NULL; OpusCustomEncoder *enc; OpusCustomDecoder *dec; int len; opus_int32 frame_size, channels, rate; int bytes_per_packet; unsigned char data[MAX_PACKET]; int complexity; #if !(defined (FIXED_POINT) && !defined(CUSTOM_MODES)) && defined(RESYNTH) int i; double rmsd = 0; #endif int count = 0; opus_int32 skip; opus_int16 *in, *out; if (argc != 9 && argc != 8 && argc != 7) { fprintf (stderr, "Usage: test_opus_custom " " [ [packet loss rate]] " " \n"); return 1; } rate = (opus_int32)atol(argv[1]); channels = atoi(argv[2]); frame_size = atoi(argv[3]); mode = opus_custom_mode_create(rate, frame_size, NULL); if (mode == NULL) { fprintf(stderr, "failed to create a mode\n"); return 1; } bytes_per_packet = atoi(argv[4]); if (bytes_per_packet < 0 || bytes_per_packet > MAX_PACKET) { fprintf (stderr, "bytes per packet must be between 0 and %d\n", MAX_PACKET); return 1; } inFile = argv[argc-2]; fin = fopen(inFile, "rb"); if (!fin) { fprintf (stderr, "Could not open input file %s\n", argv[argc-2]); return 1; } outFile = argv[argc-1]; fout = fopen(outFile, "wb+"); if (!fout) { fprintf (stderr, "Could not open output file %s\n", argv[argc-1]); fclose(fin); return 1; } enc = opus_custom_encoder_create(mode, channels, &err); if (err != 0) { fprintf(stderr, "Failed to create the encoder: %s\n", opus_strerror(err)); fclose(fin); fclose(fout); return 1; } dec = opus_custom_decoder_create(mode, channels, &err); if (err != 0) { fprintf(stderr, "Failed to create the decoder: %s\n", opus_strerror(err)); fclose(fin); fclose(fout); return 1; } opus_custom_decoder_ctl(dec, OPUS_GET_LOOKAHEAD(&skip)); if (argc>7) { complexity=atoi(argv[5]); opus_custom_encoder_ctl(enc,OPUS_SET_COMPLEXITY(complexity)); } in = (opus_int16*)malloc(frame_size*channels*sizeof(opus_int16)); out = (opus_int16*)malloc(frame_size*channels*sizeof(opus_int16)); while (!feof(fin)) { int ret; err = fread(in, sizeof(short), frame_size*channels, fin); if (feof(fin)) break; len = opus_custom_encode(enc, in, frame_size, data, bytes_per_packet); if (len <= 0) fprintf (stderr, "opus_custom_encode() failed: %s\n", opus_strerror(len)); /* This is for simulating bit errors */ #if 0 int errors = 0; int eid = 0; /* This simulates random bit error */ for (i=0;i 0) { rmsd = sqrt(rmsd/(1.0*frame_size*channels*count)); fprintf (stderr, "Error: encoder doesn't match decoder\n"); fprintf (stderr, "RMS mismatch is %f\n", rmsd); return 1; } else { fprintf (stderr, "Encoder matches decoder!!\n"); } #endif return 0; } mumble-1.3.4/3rdparty/opus-src/celt/arch.h0000664000175000017500000001727114010707326020210 0ustar builderbuilder/* Copyright (c) 2003-2008 Jean-Marc Valin Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /** @file arch.h @brief Various architecture definitions for CELT */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef ARCH_H #define ARCH_H #include "opus_types.h" #include "opus_defines.h" # if !defined(__GNUC_PREREQ) # if defined(__GNUC__)&&defined(__GNUC_MINOR__) # define __GNUC_PREREQ(_maj,_min) \ ((__GNUC__<<16)+__GNUC_MINOR__>=((_maj)<<16)+(_min)) # else # define __GNUC_PREREQ(_maj,_min) 0 # endif # endif #if OPUS_GNUC_PREREQ(3, 0) #define opus_likely(x) (__builtin_expect(!!(x), 1)) #define opus_unlikely(x) (__builtin_expect(!!(x), 0)) #else #define opus_likely(x) (!!(x)) #define opus_unlikely(x) (!!(x)) #endif #define CELT_SIG_SCALE 32768.f #define celt_fatal(str) _celt_fatal(str, __FILE__, __LINE__); #ifdef ENABLE_ASSERTIONS #include #include #ifdef __GNUC__ __attribute__((noreturn)) #endif static OPUS_INLINE void _celt_fatal(const char *str, const char *file, int line) { fprintf (stderr, "Fatal (internal) error in %s, line %d: %s\n", file, line, str); abort(); } #define celt_assert(cond) {if (!(cond)) {celt_fatal("assertion failed: " #cond);}} #define celt_assert2(cond, message) {if (!(cond)) {celt_fatal("assertion failed: " #cond "\n" message);}} #else #define celt_assert(cond) #define celt_assert2(cond, message) #endif #define IMUL32(a,b) ((a)*(b)) #define MIN16(a,b) ((a) < (b) ? (a) : (b)) /**< Minimum 16-bit value. */ #define MAX16(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 16-bit value. */ #define MIN32(a,b) ((a) < (b) ? (a) : (b)) /**< Minimum 32-bit value. */ #define MAX32(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 32-bit value. */ #define IMIN(a,b) ((a) < (b) ? (a) : (b)) /**< Minimum int value. */ #define IMAX(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum int value. */ #define UADD32(a,b) ((a)+(b)) #define USUB32(a,b) ((a)-(b)) /* Set this if opus_int64 is a native type of the CPU. */ /* Assume that all LP64 architectures have fast 64-bit types; also x86_64 (which can be ILP32 for x32) and Win64 (which is LLP64). */ #if defined(__x86_64__) || defined(__LP64__) || defined(_WIN64) #define OPUS_FAST_INT64 1 #else #define OPUS_FAST_INT64 0 #endif #define PRINT_MIPS(file) #ifdef FIXED_POINT typedef opus_int16 opus_val16; typedef opus_int32 opus_val32; typedef opus_int64 opus_val64; typedef opus_val32 celt_sig; typedef opus_val16 celt_norm; typedef opus_val32 celt_ener; #define Q15ONE 32767 #define SIG_SHIFT 12 /* Safe saturation value for 32-bit signals. Should be less than 2^31*(1-0.85) to avoid blowing up on DC at deemphasis.*/ #define SIG_SAT (300000000) #define NORM_SCALING 16384 #define DB_SHIFT 10 #define EPSILON 1 #define VERY_SMALL 0 #define VERY_LARGE16 ((opus_val16)32767) #define Q15_ONE ((opus_val16)32767) #define SCALEIN(a) (a) #define SCALEOUT(a) (a) #define ABS16(x) ((x) < 0 ? (-(x)) : (x)) #define ABS32(x) ((x) < 0 ? (-(x)) : (x)) static OPUS_INLINE opus_int16 SAT16(opus_int32 x) { return x > 32767 ? 32767 : x < -32768 ? -32768 : (opus_int16)x; } #ifdef FIXED_DEBUG #include "fixed_debug.h" #else #include "fixed_generic.h" #ifdef OPUS_ARM_PRESUME_AARCH64_NEON_INTR #include "arm/fixed_arm64.h" #elif OPUS_ARM_INLINE_EDSP #include "arm/fixed_armv5e.h" #elif defined (OPUS_ARM_INLINE_ASM) #include "arm/fixed_armv4.h" #elif defined (BFIN_ASM) #include "fixed_bfin.h" #elif defined (TI_C5X_ASM) #include "fixed_c5x.h" #elif defined (TI_C6X_ASM) #include "fixed_c6x.h" #endif #endif #else /* FIXED_POINT */ typedef float opus_val16; typedef float opus_val32; typedef float opus_val64; typedef float celt_sig; typedef float celt_norm; typedef float celt_ener; #ifdef FLOAT_APPROX /* This code should reliably detect NaN/inf even when -ffast-math is used. Assumes IEEE 754 format. */ static OPUS_INLINE int celt_isnan(float x) { union {float f; opus_uint32 i;} in; in.f = x; return ((in.i>>23)&0xFF)==0xFF && (in.i&0x007FFFFF)!=0; } #else #ifdef __FAST_MATH__ #error Cannot build libopus with -ffast-math unless FLOAT_APPROX is defined. This could result in crashes on extreme (e.g. NaN) input #endif #define celt_isnan(x) ((x)!=(x)) #endif #define Q15ONE 1.0f #define NORM_SCALING 1.f #define EPSILON 1e-15f #define VERY_SMALL 1e-30f #define VERY_LARGE16 1e15f #define Q15_ONE ((opus_val16)1.f) /* This appears to be the same speed as C99's fabsf() but it's more portable. */ #define ABS16(x) ((float)fabs(x)) #define ABS32(x) ((float)fabs(x)) #define QCONST16(x,bits) (x) #define QCONST32(x,bits) (x) #define NEG16(x) (-(x)) #define NEG32(x) (-(x)) #define NEG32_ovflw(x) (-(x)) #define EXTRACT16(x) (x) #define EXTEND32(x) (x) #define SHR16(a,shift) (a) #define SHL16(a,shift) (a) #define SHR32(a,shift) (a) #define SHL32(a,shift) (a) #define PSHR32(a,shift) (a) #define VSHR32(a,shift) (a) #define PSHR(a,shift) (a) #define SHR(a,shift) (a) #define SHL(a,shift) (a) #define SATURATE(x,a) (x) #define SATURATE16(x) (x) #define ROUND16(a,shift) (a) #define SROUND16(a,shift) (a) #define HALF16(x) (.5f*(x)) #define HALF32(x) (.5f*(x)) #define ADD16(a,b) ((a)+(b)) #define SUB16(a,b) ((a)-(b)) #define ADD32(a,b) ((a)+(b)) #define SUB32(a,b) ((a)-(b)) #define ADD32_ovflw(a,b) ((a)+(b)) #define SUB32_ovflw(a,b) ((a)-(b)) #define MULT16_16_16(a,b) ((a)*(b)) #define MULT16_16(a,b) ((opus_val32)(a)*(opus_val32)(b)) #define MAC16_16(c,a,b) ((c)+(opus_val32)(a)*(opus_val32)(b)) #define MULT16_32_Q15(a,b) ((a)*(b)) #define MULT16_32_Q16(a,b) ((a)*(b)) #define MULT32_32_Q31(a,b) ((a)*(b)) #define MAC16_32_Q15(c,a,b) ((c)+(a)*(b)) #define MAC16_32_Q16(c,a,b) ((c)+(a)*(b)) #define MULT16_16_Q11_32(a,b) ((a)*(b)) #define MULT16_16_Q11(a,b) ((a)*(b)) #define MULT16_16_Q13(a,b) ((a)*(b)) #define MULT16_16_Q14(a,b) ((a)*(b)) #define MULT16_16_Q15(a,b) ((a)*(b)) #define MULT16_16_P15(a,b) ((a)*(b)) #define MULT16_16_P13(a,b) ((a)*(b)) #define MULT16_16_P14(a,b) ((a)*(b)) #define MULT16_32_P16(a,b) ((a)*(b)) #define DIV32_16(a,b) (((opus_val32)(a))/(opus_val16)(b)) #define DIV32(a,b) (((opus_val32)(a))/(opus_val32)(b)) #define SCALEIN(a) ((a)*CELT_SIG_SCALE) #define SCALEOUT(a) ((a)*(1/CELT_SIG_SCALE)) #define SIG2WORD16(x) (x) #endif /* !FIXED_POINT */ #ifndef GLOBAL_STACK_SIZE #ifdef FIXED_POINT #define GLOBAL_STACK_SIZE 120000 #else #define GLOBAL_STACK_SIZE 120000 #endif #endif #endif /* ARCH_H */ mumble-1.3.4/3rdparty/opus-src/celt/dump_modes/0000775000175000017500000000000014010707327021247 5ustar builderbuildermumble-1.3.4/3rdparty/opus-src/celt/dump_modes/dump_modes.c0000664000175000017500000003202014010707327023544 0ustar builderbuilder/* Copyright (c) 2008 CSIRO Copyright (c) 2008-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "modes.h" #include "celt.h" #include "rate.h" #include "dump_modes_arch.h" #define INT16 "%d" #define INT32 "%d" #define FLOAT "%#0.8gf" #ifdef FIXED_POINT #define WORD16 INT16 #define WORD32 INT32 #else #define WORD16 FLOAT #define WORD32 FLOAT #endif void dump_modes(FILE *file, CELTMode **modes, int nb_modes) { int i, j, k; int mdct_twiddles_size; fprintf(file, "/* The contents of this file was automatically generated by dump_modes.c\n"); fprintf(file, " with arguments:"); for (i=0;iFs,mode->shortMdctSize*mode->nbShortMdcts); } fprintf(file, "\n It contains static definitions for some pre-defined modes. */\n"); fprintf(file, "#include \"modes.h\"\n"); fprintf(file, "#include \"rate.h\"\n"); fprintf(file, "\n#ifdef HAVE_ARM_NE10\n"); fprintf(file, "#define OVERRIDE_FFT 1\n"); fprintf(file, "#include \"%s\"\n", ARM_NE10_ARCH_FILE_NAME); fprintf(file, "#endif\n"); fprintf(file, "\n"); for (i=0;ishortMdctSize*mode->nbShortMdcts; standard = (mode->Fs == 400*(opus_int32)mode->shortMdctSize); framerate = mode->Fs/mode->shortMdctSize; if (!standard) { fprintf(file, "#ifndef DEF_EBANDS%d_%d\n", mode->Fs, mdctSize); fprintf(file, "#define DEF_EBANDS%d_%d\n", mode->Fs, mdctSize); fprintf (file, "static const opus_int16 eBands%d_%d[%d] = {\n", mode->Fs, mdctSize, mode->nbEBands+2); for (j=0;jnbEBands+2;j++) fprintf (file, "%d, ", mode->eBands[j]); fprintf (file, "};\n"); fprintf(file, "#endif\n"); fprintf(file, "\n"); } fprintf(file, "#ifndef DEF_WINDOW%d\n", mode->overlap); fprintf(file, "#define DEF_WINDOW%d\n", mode->overlap); fprintf (file, "static const opus_val16 window%d[%d] = {\n", mode->overlap, mode->overlap); for (j=0;joverlap;j++) fprintf (file, WORD16 ",%c", mode->window[j],(j+6)%5==0?'\n':' '); fprintf (file, "};\n"); fprintf(file, "#endif\n"); fprintf(file, "\n"); if (!standard) { fprintf(file, "#ifndef DEF_ALLOC_VECTORS%d_%d\n", mode->Fs, mdctSize); fprintf(file, "#define DEF_ALLOC_VECTORS%d_%d\n", mode->Fs, mdctSize); fprintf (file, "static const unsigned char allocVectors%d_%d[%d] = {\n", mode->Fs, mdctSize, mode->nbEBands*mode->nbAllocVectors); for (j=0;jnbAllocVectors;j++) { for (k=0;knbEBands;k++) fprintf (file, "%2d, ", mode->allocVectors[j*mode->nbEBands+k]); fprintf (file, "\n"); } fprintf (file, "};\n"); fprintf(file, "#endif\n"); fprintf(file, "\n"); } fprintf(file, "#ifndef DEF_LOGN%d\n", framerate); fprintf(file, "#define DEF_LOGN%d\n", framerate); fprintf (file, "static const opus_int16 logN%d[%d] = {\n", framerate, mode->nbEBands); for (j=0;jnbEBands;j++) fprintf (file, "%d, ", mode->logN[j]); fprintf (file, "};\n"); fprintf(file, "#endif\n"); fprintf(file, "\n"); /* Pulse cache */ fprintf(file, "#ifndef DEF_PULSE_CACHE%d\n", mode->Fs/mdctSize); fprintf(file, "#define DEF_PULSE_CACHE%d\n", mode->Fs/mdctSize); fprintf (file, "static const opus_int16 cache_index%d[%d] = {\n", mode->Fs/mdctSize, (mode->maxLM+2)*mode->nbEBands); for (j=0;jnbEBands*(mode->maxLM+2);j++) fprintf (file, "%d,%c", mode->cache.index[j],(j+16)%15==0?'\n':' '); fprintf (file, "};\n"); fprintf (file, "static const unsigned char cache_bits%d[%d] = {\n", mode->Fs/mdctSize, mode->cache.size); for (j=0;jcache.size;j++) fprintf (file, "%d,%c", mode->cache.bits[j],(j+16)%15==0?'\n':' '); fprintf (file, "};\n"); fprintf (file, "static const unsigned char cache_caps%d[%d] = {\n", mode->Fs/mdctSize, (mode->maxLM+1)*2*mode->nbEBands); for (j=0;j<(mode->maxLM+1)*2*mode->nbEBands;j++) fprintf (file, "%d,%c", mode->cache.caps[j],(j+16)%15==0?'\n':' '); fprintf (file, "};\n"); fprintf(file, "#endif\n"); fprintf(file, "\n"); /* FFT twiddles */ fprintf(file, "#ifndef FFT_TWIDDLES%d_%d\n", mode->Fs, mdctSize); fprintf(file, "#define FFT_TWIDDLES%d_%d\n", mode->Fs, mdctSize); fprintf (file, "static const kiss_twiddle_cpx fft_twiddles%d_%d[%d] = {\n", mode->Fs, mdctSize, mode->mdct.kfft[0]->nfft); for (j=0;jmdct.kfft[0]->nfft;j++) fprintf (file, "{" WORD16 ", " WORD16 "},%c", mode->mdct.kfft[0]->twiddles[j].r, mode->mdct.kfft[0]->twiddles[j].i,(j+3)%2==0?'\n':' '); fprintf (file, "};\n"); #ifdef OVERRIDE_FFT dump_mode_arch(mode); #endif /* FFT Bitrev tables */ for (k=0;k<=mode->mdct.maxshift;k++) { fprintf(file, "#ifndef FFT_BITREV%d\n", mode->mdct.kfft[k]->nfft); fprintf(file, "#define FFT_BITREV%d\n", mode->mdct.kfft[k]->nfft); fprintf (file, "static const opus_int16 fft_bitrev%d[%d] = {\n", mode->mdct.kfft[k]->nfft, mode->mdct.kfft[k]->nfft); for (j=0;jmdct.kfft[k]->nfft;j++) fprintf (file, "%d,%c", mode->mdct.kfft[k]->bitrev[j],(j+16)%15==0?'\n':' '); fprintf (file, "};\n"); fprintf(file, "#endif\n"); fprintf(file, "\n"); } /* FFT States */ for (k=0;k<=mode->mdct.maxshift;k++) { fprintf(file, "#ifndef FFT_STATE%d_%d_%d\n", mode->Fs, mdctSize, k); fprintf(file, "#define FFT_STATE%d_%d_%d\n", mode->Fs, mdctSize, k); fprintf (file, "static const kiss_fft_state fft_state%d_%d_%d = {\n", mode->Fs, mdctSize, k); fprintf (file, "%d, /* nfft */\n", mode->mdct.kfft[k]->nfft); fprintf (file, WORD16 ", /* scale */\n", mode->mdct.kfft[k]->scale); #ifdef FIXED_POINT fprintf (file, "%d, /* scale_shift */\n", mode->mdct.kfft[k]->scale_shift); #endif fprintf (file, "%d, /* shift */\n", mode->mdct.kfft[k]->shift); fprintf (file, "{"); for (j=0;j<2*MAXFACTORS;j++) fprintf (file, "%d, ", mode->mdct.kfft[k]->factors[j]); fprintf (file, "}, /* factors */\n"); fprintf (file, "fft_bitrev%d, /* bitrev */\n", mode->mdct.kfft[k]->nfft); fprintf (file, "fft_twiddles%d_%d, /* bitrev */\n", mode->Fs, mdctSize); fprintf (file, "#ifdef OVERRIDE_FFT\n"); fprintf (file, "(arch_fft_state *)&cfg_arch_%d,\n", mode->mdct.kfft[k]->nfft); fprintf (file, "#else\n"); fprintf (file, "NULL,\n"); fprintf(file, "#endif\n"); fprintf (file, "};\n"); fprintf(file, "#endif\n"); fprintf(file, "\n"); } fprintf(file, "#endif\n"); fprintf(file, "\n"); /* MDCT twiddles */ mdct_twiddles_size = mode->mdct.n-(mode->mdct.n/2>>mode->mdct.maxshift); fprintf(file, "#ifndef MDCT_TWIDDLES%d\n", mdctSize); fprintf(file, "#define MDCT_TWIDDLES%d\n", mdctSize); fprintf (file, "static const opus_val16 mdct_twiddles%d[%d] = {\n", mdctSize, mdct_twiddles_size); for (j=0;jmdct.trig[j],(j+6)%5==0?'\n':' '); fprintf (file, "};\n"); fprintf(file, "#endif\n"); fprintf(file, "\n"); /* Print the actual mode data */ fprintf(file, "static const CELTMode mode%d_%d_%d = {\n", mode->Fs, mdctSize, mode->overlap); fprintf(file, INT32 ", /* Fs */\n", mode->Fs); fprintf(file, "%d, /* overlap */\n", mode->overlap); fprintf(file, "%d, /* nbEBands */\n", mode->nbEBands); fprintf(file, "%d, /* effEBands */\n", mode->effEBands); fprintf(file, "{"); for (j=0;j<4;j++) fprintf(file, WORD16 ", ", mode->preemph[j]); fprintf(file, "}, /* preemph */\n"); if (standard) fprintf(file, "eband5ms, /* eBands */\n"); else fprintf(file, "eBands%d_%d, /* eBands */\n", mode->Fs, mdctSize); fprintf(file, "%d, /* maxLM */\n", mode->maxLM); fprintf(file, "%d, /* nbShortMdcts */\n", mode->nbShortMdcts); fprintf(file, "%d, /* shortMdctSize */\n", mode->shortMdctSize); fprintf(file, "%d, /* nbAllocVectors */\n", mode->nbAllocVectors); if (standard) fprintf(file, "band_allocation, /* allocVectors */\n"); else fprintf(file, "allocVectors%d_%d, /* allocVectors */\n", mode->Fs, mdctSize); fprintf(file, "logN%d, /* logN */\n", framerate); fprintf(file, "window%d, /* window */\n", mode->overlap); fprintf(file, "{%d, %d, {", mode->mdct.n, mode->mdct.maxshift); for (k=0;k<=mode->mdct.maxshift;k++) fprintf(file, "&fft_state%d_%d_%d, ", mode->Fs, mdctSize, k); fprintf (file, "}, mdct_twiddles%d}, /* mdct */\n", mdctSize); fprintf(file, "{%d, cache_index%d, cache_bits%d, cache_caps%d}, /* cache */\n", mode->cache.size, mode->Fs/mdctSize, mode->Fs/mdctSize, mode->Fs/mdctSize); fprintf(file, "};\n"); } fprintf(file, "\n"); fprintf(file, "/* List of all the available modes */\n"); fprintf(file, "#define TOTAL_MODES %d\n", nb_modes); fprintf(file, "static const CELTMode * const static_mode_list[TOTAL_MODES] = {\n"); for (i=0;ishortMdctSize*mode->nbShortMdcts; fprintf(file, "&mode%d_%d_%d,\n", mode->Fs, mdctSize, mode->overlap); } fprintf(file, "};\n"); } void dump_header(FILE *file, CELTMode **modes, int nb_modes) { int i; int channels = 0; int frame_size = 0; int overlap = 0; fprintf (file, "/* This header file is generated automatically*/\n"); for (i=0;ishortMdctSize*mode->nbShortMdcts; else if (frame_size != mode->shortMdctSize*mode->nbShortMdcts) frame_size = -1; if (overlap==0) overlap = mode->overlap; else if (overlap != mode->overlap) overlap = -1; } if (channels>0) { fprintf (file, "#define CHANNELS(mode) %d\n", channels); if (channels==1) fprintf (file, "#define DISABLE_STEREO\n"); } if (frame_size>0) { fprintf (file, "#define FRAMESIZE(mode) %d\n", frame_size); } if (overlap>0) { fprintf (file, "#define OVERLAP(mode) %d\n", overlap); } } #ifdef FIXED_POINT #define BASENAME "static_modes_fixed" #else #define BASENAME "static_modes_float" #endif int main(int argc, char **argv) { int i, nb; FILE *file; CELTMode **m; if (argc%2 != 1 || argc<3) { fprintf (stderr, "Usage: %s rate frame_size [rate frame_size] [rate frame_size]...\n",argv[0]); return 1; } nb = (argc-1)/2; m = malloc(nb*sizeof(CELTMode*)); for (i=0;i #include #include "modes.h" #include "dump_modes_arch.h" #include #if !defined(FIXED_POINT) # define NE10_FFT_CFG_TYPE_T ne10_fft_cfg_float32_t # define NE10_FFT_CPX_TYPE_T_STR "ne10_fft_cpx_float32_t" # define NE10_FFT_STATE_TYPE_T_STR "ne10_fft_state_float32_t" #else # define NE10_FFT_CFG_TYPE_T ne10_fft_cfg_int32_t # define NE10_FFT_CPX_TYPE_T_STR "ne10_fft_cpx_int32_t" # define NE10_FFT_STATE_TYPE_T_STR "ne10_fft_state_int32_t" #endif static FILE *file; void dump_modes_arch_init(CELTMode **modes, int nb_modes) { int i; file = fopen(ARM_NE10_ARCH_FILE_NAME, "w"); fprintf(file, "/* The contents of this file was automatically generated by\n"); fprintf(file, " * dump_mode_arm_ne10.c with arguments:"); for (i=0;iFs,mode->shortMdctSize*mode->nbShortMdcts); } fprintf(file, "\n * It contains static definitions for some pre-defined modes. */\n"); fprintf(file, "#include \n\n"); } void dump_modes_arch_finalize() { fclose(file); } void dump_mode_arch(CELTMode *mode) { int k, j; int mdctSize; mdctSize = mode->shortMdctSize*mode->nbShortMdcts; fprintf(file, "#ifndef NE10_FFT_PARAMS%d_%d\n", mode->Fs, mdctSize); fprintf(file, "#define NE10_FFT_PARAMS%d_%d\n", mode->Fs, mdctSize); /* cfg->factors */ for(k=0;k<=mode->mdct.maxshift;k++) { NE10_FFT_CFG_TYPE_T cfg; cfg = (NE10_FFT_CFG_TYPE_T)mode->mdct.kfft[k]->arch_fft->priv; if (!cfg) continue; fprintf(file, "static const ne10_int32_t ne10_factors_%d[%d] = {\n", mode->mdct.kfft[k]->nfft, (NE10_MAXFACTORS * 2)); for(j=0;j<(NE10_MAXFACTORS * 2);j++) { fprintf(file, "%d,%c", cfg->factors[j],(j+16)%15==0?'\n':' '); } fprintf (file, "};\n"); } /* cfg->twiddles */ for(k=0;k<=mode->mdct.maxshift;k++) { NE10_FFT_CFG_TYPE_T cfg; cfg = (NE10_FFT_CFG_TYPE_T)mode->mdct.kfft[k]->arch_fft->priv; if (!cfg) continue; fprintf(file, "static const %s ne10_twiddles_%d[%d] = {\n", NE10_FFT_CPX_TYPE_T_STR, mode->mdct.kfft[k]->nfft, mode->mdct.kfft[k]->nfft); for(j=0;jmdct.kfft[k]->nfft;j++) { #if !defined(FIXED_POINT) fprintf(file, "{%#0.8gf,%#0.8gf},%c", cfg->twiddles[j].r, cfg->twiddles[j].i,(j+4)%3==0?'\n':' '); #else fprintf(file, "{%d,%d},%c", cfg->twiddles[j].r, cfg->twiddles[j].i,(j+4)%3==0?'\n':' '); #endif } fprintf (file, "};\n"); } for(k=0;k<=mode->mdct.maxshift;k++) { NE10_FFT_CFG_TYPE_T cfg; cfg = (NE10_FFT_CFG_TYPE_T)mode->mdct.kfft[k]->arch_fft->priv; if (!cfg) { fprintf(file, "/* Ne10 does not support scaled FFT for length = %d */\n", mode->mdct.kfft[k]->nfft); fprintf(file, "static const arch_fft_state cfg_arch_%d = {\n", mode->mdct.kfft[k]->nfft); fprintf(file, "0,\n"); fprintf(file, "NULL\n"); fprintf(file, "};\n"); continue; } fprintf(file, "static const %s %s_%d = {\n", NE10_FFT_STATE_TYPE_T_STR, NE10_FFT_STATE_TYPE_T_STR, mode->mdct.kfft[k]->nfft); fprintf(file, "%d,\n", cfg->nfft); fprintf(file, "(ne10_int32_t *)ne10_factors_%d,\n", mode->mdct.kfft[k]->nfft); fprintf(file, "(%s *)ne10_twiddles_%d,\n", NE10_FFT_CPX_TYPE_T_STR, mode->mdct.kfft[k]->nfft); fprintf(file, "NULL,\n"); /* buffer */ fprintf(file, "(%s *)&ne10_twiddles_%d[%d],\n", NE10_FFT_CPX_TYPE_T_STR, mode->mdct.kfft[k]->nfft, cfg->nfft); #if !defined(FIXED_POINT) fprintf(file, "/* is_forward_scaled = true */\n"); fprintf(file, "(ne10_int32_t) 1,\n"); fprintf(file, "/* is_backward_scaled = false */\n"); fprintf(file, "(ne10_int32_t) 0,\n"); #endif fprintf(file, "};\n"); fprintf(file, "static const arch_fft_state cfg_arch_%d = {\n", mode->mdct.kfft[k]->nfft); fprintf(file, "1,\n"); fprintf(file, "(void *)&%s_%d,\n", NE10_FFT_STATE_TYPE_T_STR, mode->mdct.kfft[k]->nfft); fprintf(file, "};\n\n"); } fprintf(file, "#endif /* end NE10_FFT_PARAMS%d_%d */\n", mode->Fs, mdctSize); } mumble-1.3.4/3rdparty/opus-src/celt/dump_modes/dump_modes_arch.h0000664000175000017500000000334514010707327024556 0ustar builderbuilder/* Copyright (c) 2015 Xiph.Org Foundation Written by Viswanath Puttagunta */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef DUMP_MODE_ARCH_H #define DUMP_MODE_ARCH_H void dump_modes_arch_init(); void dump_mode_arch(CELTMode *mode); void dump_modes_arch_finalize(); #if !defined(FIXED_POINT) #define ARM_NE10_ARCH_FILE_NAME "static_modes_float_arm_ne10.h" #else #define ARM_NE10_ARCH_FILE_NAME "static_modes_fixed_arm_ne10.h" #endif #if defined(HAVE_ARM_NE10) #define OVERRIDE_FFT (1) #endif #endif mumble-1.3.4/3rdparty/opus-src/celt/dump_modes/Makefile0000664000175000017500000000134414010707327022711 0ustar builderbuilder CFLAGS=-O2 -Wall -Wextra -DHAVE_CONFIG_H INCLUDES=-I. -I../ -I../.. -I../../include SOURCES = dump_modes.c \ ../modes.c \ ../cwrs.c \ ../rate.c \ ../entcode.c \ ../entenc.c \ ../entdec.c \ ../mathops.c \ ../mdct.c \ ../kiss_fft.c ifdef HAVE_ARM_NE10 CC = gcc CFLAGS += -mfpu=neon INCLUDES += -I$(NE10_INCDIR) -DHAVE_ARM_NE10 -DOPUS_ARM_PRESUME_NEON_INTR LIBS = -L$(NE10_LIBDIR) -lNE10 SOURCES += ../arm/celt_ne10_fft.c \ dump_modes_arm_ne10.c \ ../arm/armcpu.c endif all: dump_modes dump_modes: $(PREFIX)$(CC) $(CFLAGS) $(INCLUDES) -DCUSTOM_MODES_ONLY -DCUSTOM_MODES $(SOURCES) -o $@ $(LIBS) -lm clean: rm -f dump_modes mumble-1.3.4/3rdparty/opus-src/celt/rate.h0000664000175000017500000000631714010707327020226 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef RATE_H #define RATE_H #define MAX_PSEUDO 40 #define LOG_MAX_PSEUDO 6 #define CELT_MAX_PULSES 128 #define MAX_FINE_BITS 8 #define FINE_OFFSET 21 #define QTHETA_OFFSET 4 #define QTHETA_OFFSET_TWOPHASE 16 #include "cwrs.h" #include "modes.h" void compute_pulse_cache(CELTMode *m, int LM); static OPUS_INLINE int get_pulses(int i) { return i<8 ? i : (8 + (i&7)) << ((i>>3)-1); } static OPUS_INLINE int bits2pulses(const CELTMode *m, int band, int LM, int bits) { int i; int lo, hi; const unsigned char *cache; LM++; cache = m->cache.bits + m->cache.index[LM*m->nbEBands+band]; lo = 0; hi = cache[0]; bits--; for (i=0;i>1; /* OPT: Make sure this is implemented with a conditional move */ if ((int)cache[mid] >= bits) hi = mid; else lo = mid; } if (bits- (lo == 0 ? -1 : (int)cache[lo]) <= (int)cache[hi]-bits) return lo; else return hi; } static OPUS_INLINE int pulses2bits(const CELTMode *m, int band, int LM, int pulses) { const unsigned char *cache; LM++; cache = m->cache.bits + m->cache.index[LM*m->nbEBands+band]; return pulses == 0 ? 0 : cache[pulses]+1; } /** Compute the pulse allocation, i.e. how many pulses will go in each * band. @param m mode @param offsets Requested increase or decrease in the number of bits for each band @param total Number of bands @param pulses Number of pulses per band (returned) @return Total number of bits allocated */ int compute_allocation(const CELTMode *m, int start, int end, const int *offsets, const int *cap, int alloc_trim, int *intensity, int *dual_stero, opus_int32 total, opus_int32 *balance, int *pulses, int *ebits, int *fine_priority, int C, int LM, ec_ctx *ec, int encode, int prev, int signalBandwidth); #endif mumble-1.3.4/3rdparty/opus-src/celt/modes.c0000664000175000017500000003317714010707327020401 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Copyright (c) 2008 Gregory Maxwell Written by Jean-Marc Valin and Gregory Maxwell */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "celt.h" #include "modes.h" #include "rate.h" #include "os_support.h" #include "stack_alloc.h" #include "quant_bands.h" #include "cpu_support.h" static const opus_int16 eband5ms[] = { /*0 200 400 600 800 1k 1.2 1.4 1.6 2k 2.4 2.8 3.2 4k 4.8 5.6 6.8 8k 9.6 12k 15.6 */ 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 34, 40, 48, 60, 78, 100 }; /* Alternate tuning (partially derived from Vorbis) */ #define BITALLOC_SIZE 11 /* Bit allocation table in units of 1/32 bit/sample (0.1875 dB SNR) */ static const unsigned char band_allocation[] = { /*0 200 400 600 800 1k 1.2 1.4 1.6 2k 2.4 2.8 3.2 4k 4.8 5.6 6.8 8k 9.6 12k 15.6 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 80, 75, 69, 63, 56, 49, 40, 34, 29, 20, 18, 10, 0, 0, 0, 0, 0, 0, 0, 0, 110,100, 90, 84, 78, 71, 65, 58, 51, 45, 39, 32, 26, 20, 12, 0, 0, 0, 0, 0, 0, 118,110,103, 93, 86, 80, 75, 70, 65, 59, 53, 47, 40, 31, 23, 15, 4, 0, 0, 0, 0, 126,119,112,104, 95, 89, 83, 78, 72, 66, 60, 54, 47, 39, 32, 25, 17, 12, 1, 0, 0, 134,127,120,114,103, 97, 91, 85, 78, 72, 66, 60, 54, 47, 41, 35, 29, 23, 16, 10, 1, 144,137,130,124,113,107,101, 95, 88, 82, 76, 70, 64, 57, 51, 45, 39, 33, 26, 15, 1, 152,145,138,132,123,117,111,105, 98, 92, 86, 80, 74, 67, 61, 55, 49, 43, 36, 20, 1, 162,155,148,142,133,127,121,115,108,102, 96, 90, 84, 77, 71, 65, 59, 53, 46, 30, 1, 172,165,158,152,143,137,131,125,118,112,106,100, 94, 87, 81, 75, 69, 63, 56, 45, 20, 200,200,200,200,200,200,200,200,198,193,188,183,178,173,168,163,158,153,148,129,104, }; #ifndef CUSTOM_MODES_ONLY #ifdef FIXED_POINT #include "static_modes_fixed.h" #else #include "static_modes_float.h" #endif #endif /* CUSTOM_MODES_ONLY */ #ifndef M_PI #define M_PI 3.141592653 #endif #ifdef CUSTOM_MODES /* Defining 25 critical bands for the full 0-20 kHz audio bandwidth Taken from http://ccrma.stanford.edu/~jos/bbt/Bark_Frequency_Scale.html */ #define BARK_BANDS 25 static const opus_int16 bark_freq[BARK_BANDS+1] = { 0, 100, 200, 300, 400, 510, 630, 770, 920, 1080, 1270, 1480, 1720, 2000, 2320, 2700, 3150, 3700, 4400, 5300, 6400, 7700, 9500, 12000, 15500, 20000}; static opus_int16 *compute_ebands(opus_int32 Fs, int frame_size, int res, int *nbEBands) { opus_int16 *eBands; int i, j, lin, low, high, nBark, offset=0; /* All modes that have 2.5 ms short blocks use the same definition */ if (Fs == 400*(opus_int32)frame_size) { *nbEBands = sizeof(eband5ms)/sizeof(eband5ms[0])-1; eBands = opus_alloc(sizeof(opus_int16)*(*nbEBands+1)); for (i=0;i<*nbEBands+1;i++) eBands[i] = eband5ms[i]; return eBands; } /* Find the number of critical bands supported by our sampling rate */ for (nBark=1;nBark= Fs) break; /* Find where the linear part ends (i.e. where the spacing is more than min_width */ for (lin=0;lin= res) break; low = (bark_freq[lin]+res/2)/res; high = nBark-lin; *nbEBands = low+high; eBands = opus_alloc(sizeof(opus_int16)*(*nbEBands+2)); if (eBands==NULL) return NULL; /* Linear spacing (min_width) */ for (i=0;i0) offset = eBands[low-1]*res - bark_freq[lin-1]; /* Spacing follows critical bands */ for (i=0;i frame_size) eBands[*nbEBands] = frame_size; for (i=1;i<*nbEBands-1;i++) { if (eBands[i+1]-eBands[i] < eBands[i]-eBands[i-1]) { eBands[i] -= (2*eBands[i]-eBands[i-1]-eBands[i+1])/2; } } /* Remove any empty bands. */ for (i=j=0;i<*nbEBands;i++) if(eBands[i+1]>eBands[j]) eBands[++j]=eBands[i+1]; *nbEBands=j; for (i=1;i<*nbEBands;i++) { /* Every band must be smaller than the last band. */ celt_assert(eBands[i]-eBands[i-1]<=eBands[*nbEBands]-eBands[*nbEBands-1]); /* Each band must be no larger than twice the size of the previous one. */ celt_assert(eBands[i+1]-eBands[i]<=2*(eBands[i]-eBands[i-1])); } return eBands; } static void compute_allocation_table(CELTMode *mode) { int i, j; unsigned char *allocVectors; int maxBands = sizeof(eband5ms)/sizeof(eband5ms[0])-1; mode->nbAllocVectors = BITALLOC_SIZE; allocVectors = opus_alloc(sizeof(unsigned char)*(BITALLOC_SIZE*mode->nbEBands)); if (allocVectors==NULL) return; /* Check for standard mode */ if (mode->Fs == 400*(opus_int32)mode->shortMdctSize) { for (i=0;inbEBands;i++) allocVectors[i] = band_allocation[i]; mode->allocVectors = allocVectors; return; } /* If not the standard mode, interpolate */ /* Compute per-codec-band allocation from per-critical-band matrix */ for (i=0;inbEBands;j++) { int k; for (k=0;k mode->eBands[j]*(opus_int32)mode->Fs/mode->shortMdctSize) break; } if (k>maxBands-1) allocVectors[i*mode->nbEBands+j] = band_allocation[i*maxBands + maxBands-1]; else { opus_int32 a0, a1; a1 = mode->eBands[j]*(opus_int32)mode->Fs/mode->shortMdctSize - 400*(opus_int32)eband5ms[k-1]; a0 = 400*(opus_int32)eband5ms[k] - mode->eBands[j]*(opus_int32)mode->Fs/mode->shortMdctSize; allocVectors[i*mode->nbEBands+j] = (a0*band_allocation[i*maxBands+k-1] + a1*band_allocation[i*maxBands+k])/(a0+a1); } } } /*printf ("\n"); for (i=0;inbEBands;j++) printf ("%d ", allocVectors[i*mode->nbEBands+j]); printf ("\n"); } exit(0);*/ mode->allocVectors = allocVectors; } #endif /* CUSTOM_MODES */ CELTMode *opus_custom_mode_create(opus_int32 Fs, int frame_size, int *error) { int i; #ifdef CUSTOM_MODES CELTMode *mode=NULL; int res; opus_val16 *window; opus_int16 *logN; int LM; int arch = opus_select_arch(); ALLOC_STACK; #if !defined(VAR_ARRAYS) && !defined(USE_ALLOCA) if (global_stack==NULL) goto failure; #endif #endif #ifndef CUSTOM_MODES_ONLY for (i=0;iFs && (frame_size<shortMdctSize*static_mode_list[i]->nbShortMdcts) { if (error) *error = OPUS_OK; return (CELTMode*)static_mode_list[i]; } } } #endif /* CUSTOM_MODES_ONLY */ #ifndef CUSTOM_MODES if (error) *error = OPUS_BAD_ARG; return NULL; #else /* The good thing here is that permutation of the arguments will automatically be invalid */ if (Fs < 8000 || Fs > 96000) { if (error) *error = OPUS_BAD_ARG; return NULL; } if (frame_size < 40 || frame_size > 1024 || frame_size%2!=0) { if (error) *error = OPUS_BAD_ARG; return NULL; } /* Frames of less than 1ms are not supported. */ if ((opus_int32)frame_size*1000 < Fs) { if (error) *error = OPUS_BAD_ARG; return NULL; } if ((opus_int32)frame_size*75 >= Fs && (frame_size%16)==0) { LM = 3; } else if ((opus_int32)frame_size*150 >= Fs && (frame_size%8)==0) { LM = 2; } else if ((opus_int32)frame_size*300 >= Fs && (frame_size%4)==0) { LM = 1; } else { LM = 0; } /* Shorts longer than 3.3ms are not supported. */ if ((opus_int32)(frame_size>>LM)*300 > Fs) { if (error) *error = OPUS_BAD_ARG; return NULL; } mode = opus_alloc(sizeof(CELTMode)); if (mode==NULL) goto failure; mode->Fs = Fs; /* Pre/de-emphasis depends on sampling rate. The "standard" pre-emphasis is defined as A(z) = 1 - 0.85*z^-1 at 48 kHz. Other rates should approximate that. */ if(Fs < 12000) /* 8 kHz */ { mode->preemph[0] = QCONST16(0.3500061035f, 15); mode->preemph[1] = -QCONST16(0.1799926758f, 15); mode->preemph[2] = QCONST16(0.2719968125f, SIG_SHIFT); /* exact 1/preemph[3] */ mode->preemph[3] = QCONST16(3.6765136719f, 13); } else if(Fs < 24000) /* 16 kHz */ { mode->preemph[0] = QCONST16(0.6000061035f, 15); mode->preemph[1] = -QCONST16(0.1799926758f, 15); mode->preemph[2] = QCONST16(0.4424998650f, SIG_SHIFT); /* exact 1/preemph[3] */ mode->preemph[3] = QCONST16(2.2598876953f, 13); } else if(Fs < 40000) /* 32 kHz */ { mode->preemph[0] = QCONST16(0.7799987793f, 15); mode->preemph[1] = -QCONST16(0.1000061035f, 15); mode->preemph[2] = QCONST16(0.7499771125f, SIG_SHIFT); /* exact 1/preemph[3] */ mode->preemph[3] = QCONST16(1.3333740234f, 13); } else /* 48 kHz */ { mode->preemph[0] = QCONST16(0.8500061035f, 15); mode->preemph[1] = QCONST16(0.0f, 15); mode->preemph[2] = QCONST16(1.f, SIG_SHIFT); mode->preemph[3] = QCONST16(1.f, 13); } mode->maxLM = LM; mode->nbShortMdcts = 1<shortMdctSize = frame_size/mode->nbShortMdcts; res = (mode->Fs+mode->shortMdctSize)/(2*mode->shortMdctSize); mode->eBands = compute_ebands(Fs, mode->shortMdctSize, res, &mode->nbEBands); if (mode->eBands==NULL) goto failure; #if !defined(SMALL_FOOTPRINT) /* Make sure we don't allocate a band larger than our PVQ table. 208 should be enough, but let's be paranoid. */ if ((mode->eBands[mode->nbEBands] - mode->eBands[mode->nbEBands-1])< 208) { goto failure; } #endif mode->effEBands = mode->nbEBands; while (mode->eBands[mode->effEBands] > mode->shortMdctSize) mode->effEBands--; /* Overlap must be divisible by 4 */ mode->overlap = ((mode->shortMdctSize>>2)<<2); compute_allocation_table(mode); if (mode->allocVectors==NULL) goto failure; window = (opus_val16*)opus_alloc(mode->overlap*sizeof(opus_val16)); if (window==NULL) goto failure; #ifndef FIXED_POINT for (i=0;ioverlap;i++) window[i] = Q15ONE*sin(.5*M_PI* sin(.5*M_PI*(i+.5)/mode->overlap) * sin(.5*M_PI*(i+.5)/mode->overlap)); #else for (i=0;ioverlap;i++) window[i] = MIN32(32767,floor(.5+32768.*sin(.5*M_PI* sin(.5*M_PI*(i+.5)/mode->overlap) * sin(.5*M_PI*(i+.5)/mode->overlap)))); #endif mode->window = window; logN = (opus_int16*)opus_alloc(mode->nbEBands*sizeof(opus_int16)); if (logN==NULL) goto failure; for (i=0;inbEBands;i++) logN[i] = log2_frac(mode->eBands[i+1]-mode->eBands[i], BITRES); mode->logN = logN; compute_pulse_cache(mode, mode->maxLM); if (clt_mdct_init(&mode->mdct, 2*mode->shortMdctSize*mode->nbShortMdcts, mode->maxLM, arch) == 0) goto failure; if (error) *error = OPUS_OK; return mode; failure: if (error) *error = OPUS_ALLOC_FAIL; if (mode!=NULL) opus_custom_mode_destroy(mode); return NULL; #endif /* !CUSTOM_MODES */ } #ifdef CUSTOM_MODES void opus_custom_mode_destroy(CELTMode *mode) { int arch = opus_select_arch(); if (mode == NULL) return; #ifndef CUSTOM_MODES_ONLY { int i; for (i=0;ieBands); opus_free((unsigned char*)mode->allocVectors); opus_free((opus_val16*)mode->window); opus_free((opus_int16*)mode->logN); opus_free((opus_int16*)mode->cache.index); opus_free((unsigned char*)mode->cache.bits); opus_free((unsigned char*)mode->cache.caps); clt_mdct_clear(&mode->mdct, arch); opus_free((CELTMode *)mode); } #endif mumble-1.3.4/3rdparty/opus-src/celt/modes.h0000664000175000017500000000460514010707327020400 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Copyright (c) 2008 Gregory Maxwell Written by Jean-Marc Valin and Gregory Maxwell */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef MODES_H #define MODES_H #include "opus_types.h" #include "celt.h" #include "arch.h" #include "mdct.h" #include "entenc.h" #include "entdec.h" #define MAX_PERIOD 1024 typedef struct { int size; const opus_int16 *index; const unsigned char *bits; const unsigned char *caps; } PulseCache; /** Mode definition (opaque) @brief Mode definition */ struct OpusCustomMode { opus_int32 Fs; int overlap; int nbEBands; int effEBands; opus_val16 preemph[4]; const opus_int16 *eBands; /**< Definition for each "pseudo-critical band" */ int maxLM; int nbShortMdcts; int shortMdctSize; int nbAllocVectors; /**< Number of lines in the matrix below */ const unsigned char *allocVectors; /**< Number of bits in each band for several rates */ const opus_int16 *logN; const opus_val16 *window; mdct_lookup mdct; PulseCache cache; }; #endif mumble-1.3.4/3rdparty/opus-src/celt/static_modes_fixed_arm_ne10.h0000664000175000017500000006117114010707327024611 0ustar builderbuilder/* The contents of this file was automatically generated by * dump_mode_arm_ne10.c with arguments: 48000 960 * It contains static definitions for some pre-defined modes. */ #include #ifndef NE10_FFT_PARAMS48000_960 #define NE10_FFT_PARAMS48000_960 static const ne10_int32_t ne10_factors_480[64] = { 4, 40, 4, 30, 2, 15, 5, 3, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static const ne10_int32_t ne10_factors_240[64] = { 3, 20, 4, 15, 5, 3, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static const ne10_int32_t ne10_factors_120[64] = { 3, 10, 2, 15, 5, 3, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static const ne10_int32_t ne10_factors_60[64] = { 2, 5, 5, 3, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static const ne10_fft_cpx_int32_t ne10_twiddles_480[480] = { {0,0}, {2147483647,0}, {2147483647,0}, {2147483647,0}, {1961823921,-873460313}, {1436946998,-1595891394}, {2147483647,0}, {1436946998,-1595891394}, {-224473265,-2135719496}, {2147483647,0}, {663608871,-2042378339}, {-1737350854,-1262259096}, {2147483647,0}, {-224473265,-2135719496}, {-2100555935,446487152}, {2147483647,0}, {2100555974,-446486968}, {1961823921,-873460313}, {1737350743,-1262259248}, {1436946998,-1595891394}, {1073741769,-1859775424}, {663608871,-2042378339}, {224473078,-2135719516}, {-224473265,-2135719496}, {-663609049,-2042378281}, {-1073741932,-1859775330}, {-1436947137,-1595891268}, {-1737350854,-1262259096}, {-1961823997,-873460141}, {-2100556013,-446486785}, {2147483647,0}, {2144540595,-112390613}, {2135719506,-224473172}, {2121044558,-335940465}, {2100555974,-446486968}, {2074309912,-555809682}, {2042378310,-663608960}, {2004848691,-769589332}, {1961823921,-873460313}, {1913421927,-974937199}, {1859775377,-1073741851}, {1801031311,-1169603450}, {1737350743,-1262259248}, {1668908218,-1351455280}, {1595891331,-1436947067}, {1518500216,-1518500282}, {1436946998,-1595891394}, {1351455207,-1668908277}, {1262259172,-1737350799}, {1169603371,-1801031362}, {1073741769,-1859775424}, {974937230,-1913421912}, {873460227,-1961823959}, {769589125,-2004848771}, {663608871,-2042378339}, {555809715,-2074309903}, {446486876,-2100555994}, {335940246,-2121044593}, {224473078,-2135719516}, {112390647,-2144540593}, {2147483647,0}, {2135719506,-224473172}, {2100555974,-446486968}, {2042378310,-663608960}, {1961823921,-873460313}, {1859775377,-1073741851}, {1737350743,-1262259248}, {1595891331,-1436947067}, {1436946998,-1595891394}, {1262259172,-1737350799}, {1073741769,-1859775424}, {873460227,-1961823959}, {663608871,-2042378339}, {446486876,-2100555994}, {224473078,-2135719516}, {-94,-2147483647}, {-224473265,-2135719496}, {-446487060,-2100555955}, {-663609049,-2042378281}, {-873460398,-1961823883}, {-1073741932,-1859775330}, {-1262259116,-1737350839}, {-1436947137,-1595891268}, {-1595891628,-1436946738}, {-1737350854,-1262259096}, {-1859775343,-1073741910}, {-1961823997,-873460141}, {-2042378447,-663608538}, {-2100556013,-446486785}, {-2135719499,-224473240}, {2147483647,0}, {2121044558,-335940465}, {2042378310,-663608960}, {1913421927,-974937199}, {1737350743,-1262259248}, {1518500216,-1518500282}, {1262259172,-1737350799}, {974937230,-1913421912}, {663608871,-2042378339}, {335940246,-2121044593}, {-94,-2147483647}, {-335940431,-2121044564}, {-663609049,-2042378281}, {-974937397,-1913421827}, {-1262259116,-1737350839}, {-1518500258,-1518500240}, {-1737350854,-1262259096}, {-1913422071,-974936918}, {-2042378447,-663608538}, {-2121044568,-335940406}, {-2147483647,188}, {-2121044509,335940777}, {-2042378331,663608895}, {-1913421900,974937252}, {-1737350633,1262259400}, {-1518499993,1518500506}, {-1262258813,1737351059}, {-974936606,1913422229}, {-663609179,2042378239}, {-335940566,2121044542}, {2147483647,0}, {2147299667,-28109693}, {2146747758,-56214570}, {2145828015,-84309815}, {2144540595,-112390613}, {2142885719,-140452154}, {2140863671,-168489630}, {2138474797,-196498235}, {2135719506,-224473172}, {2132598271,-252409646}, {2129111626,-280302871}, {2125260168,-308148068}, {2121044558,-335940465}, {2116465518,-363675300}, {2111523833,-391347822}, {2106220349,-418953288}, {2100555974,-446486968}, {2094531681,-473944146}, {2088148500,-501320115}, {2081407525,-528610186}, {2074309912,-555809682}, {2066856885,-582913912}, {2059049696,-609918325}, {2050889698,-636818231}, {2042378310,-663608960}, {2033516972,-690285983}, {2024307180,-716844791}, {2014750533,-743280770}, {2004848691,-769589332}, {1994603329,-795766029}, {1984016179,-821806435}, {1973089077,-847706028}, {1961823921,-873460313}, {1950222618,-899064934}, {1938287127,-924515564}, {1926019520,-949807783}, {1913421927,-974937199}, {1900496481,-999899565}, {1887245364,-1024690661}, {1873670877,-1049306180}, {1859775377,-1073741851}, {1845561215,-1097993541}, {1831030826,-1122057097}, {1816186632,-1145928502}, {1801031311,-1169603450}, {1785567394,-1193077993}, {1769797456,-1216348214}, {1753724345,-1239409914}, {1737350743,-1262259248}, {1720679456,-1284892300}, {1703713340,-1307305194}, {1686455222,-1329494189}, {1668908218,-1351455280}, {1651075255,-1373184807}, {1632959307,-1394679144}, {1614563642,-1415934412}, {1595891331,-1436947067}, {1576945572,-1457713510}, {1557729613,-1478230181}, {1538246655,-1498493658}, {1518500216,-1518500282}, {1498493590,-1538246721}, {1478230113,-1557729677}, {1457713441,-1576945636}, {1436946998,-1595891394}, {1415934341,-1614563704}, {1394679073,-1632959368}, {1373184735,-1651075315}, {1351455207,-1668908277}, {1329494115,-1686455280}, {1307305120,-1703713397}, {1284892225,-1720679512}, {1262259172,-1737350799}, {1239409837,-1753724400}, {1216348136,-1769797510}, {1193077915,-1785567446}, {1169603371,-1801031362}, {1145928423,-1816186682}, {1122057017,-1831030875}, {1097993571,-1845561197}, {1073741769,-1859775424}, {1049305987,-1873670985}, {1024690635,-1887245378}, {999899482,-1900496524}, {974937230,-1913421912}, {949807699,-1926019561}, {924515422,-1938287195}, {899064965,-1950222603}, {873460227,-1961823959}, {847705824,-1973089164}, {821806407,-1984016190}, {795765941,-1994603364}, {769589125,-2004848771}, {743280682,-2014750566}, {716844642,-2024307233}, {690286016,-2033516961}, {663608871,-2042378339}, {636818019,-2050889764}, {609918296,-2059049705}, {582913822,-2066856911}, {555809715,-2074309903}, {528610126,-2081407540}, {501319962,-2088148536}, {473944148,-2094531680}, {446486876,-2100555994}, {418953102,-2106220386}, {391347792,-2111523838}, {363675176,-2116465540}, {335940246,-2121044593}, {308148006,-2125260177}, {280302715,-2129111646}, {252409648,-2132598271}, {224473078,-2135719516}, {196498046,-2138474814}, {168489600,-2140863674}, {140452029,-2142885728}, {112390647,-2144540593}, {84309753,-2145828017}, {56214412,-2146747762}, {28109695,-2147299667}, {2147483647,0}, {2146747758,-56214570}, {2144540595,-112390613}, {2140863671,-168489630}, {2135719506,-224473172}, {2129111626,-280302871}, {2121044558,-335940465}, {2111523833,-391347822}, {2100555974,-446486968}, {2088148500,-501320115}, {2074309912,-555809682}, {2059049696,-609918325}, {2042378310,-663608960}, {2024307180,-716844791}, {2004848691,-769589332}, {1984016179,-821806435}, {1961823921,-873460313}, {1938287127,-924515564}, {1913421927,-974937199}, {1887245364,-1024690661}, {1859775377,-1073741851}, {1831030826,-1122057097}, {1801031311,-1169603450}, {1769797456,-1216348214}, {1737350743,-1262259248}, {1703713340,-1307305194}, {1668908218,-1351455280}, {1632959307,-1394679144}, {1595891331,-1436947067}, {1557729613,-1478230181}, {1518500216,-1518500282}, {1478230113,-1557729677}, {1436946998,-1595891394}, {1394679073,-1632959368}, {1351455207,-1668908277}, {1307305120,-1703713397}, {1262259172,-1737350799}, {1216348136,-1769797510}, {1169603371,-1801031362}, {1122057017,-1831030875}, {1073741769,-1859775424}, {1024690635,-1887245378}, {974937230,-1913421912}, {924515422,-1938287195}, {873460227,-1961823959}, {821806407,-1984016190}, {769589125,-2004848771}, {716844642,-2024307233}, {663608871,-2042378339}, {609918296,-2059049705}, {555809715,-2074309903}, {501319962,-2088148536}, {446486876,-2100555994}, {391347792,-2111523838}, {335940246,-2121044593}, {280302715,-2129111646}, {224473078,-2135719516}, {168489600,-2140863674}, {112390647,-2144540593}, {56214412,-2146747762}, {-94,-2147483647}, {-56214600,-2146747757}, {-112390835,-2144540584}, {-168489787,-2140863659}, {-224473265,-2135719496}, {-280302901,-2129111622}, {-335940431,-2121044564}, {-391347977,-2111523804}, {-446487060,-2100555955}, {-501320144,-2088148493}, {-555809896,-2074309855}, {-609918476,-2059049651}, {-663609049,-2042378281}, {-716844819,-2024307170}, {-769589300,-2004848703}, {-821806581,-1984016118}, {-873460398,-1961823883}, {-924515591,-1938287114}, {-974937397,-1913421827}, {-1024690575,-1887245411}, {-1073741932,-1859775330}, {-1122057395,-1831030643}, {-1169603421,-1801031330}, {-1216348291,-1769797403}, {-1262259116,-1737350839}, {-1307305268,-1703713283}, {-1351455453,-1668908078}, {-1394679021,-1632959413}, {-1436947137,-1595891268}, {-1478230435,-1557729372}, {-1518500258,-1518500240}, {-1557729742,-1478230045}, {-1595891628,-1436946738}, {-1632959429,-1394679001}, {-1668908417,-1351455035}, {-1703713298,-1307305248}, {-1737350854,-1262259096}, {-1769797708,-1216347848}, {-1801031344,-1169603400}, {-1831030924,-1122056937}, {-1859775343,-1073741910}, {-1887245423,-1024690552}, {-1913422071,-974936918}, {-1938287125,-924515568}, {-1961823997,-873460141}, {-1984016324,-821806084}, {-2004848713,-769589276}, {-2024307264,-716844553}, {-2042378447,-663608538}, {-2059049731,-609918206}, {-2074309994,-555809377}, {-2088148499,-501320119}, {-2100556013,-446486785}, {-2111523902,-391347448}, {-2121044568,-335940406}, {-2129111659,-280302621}, {-2135719499,-224473240}, {-2140863681,-168489506}, {-2144540612,-112390298}, {-2146747758,-56214574}, {2147483647,0}, {2145828015,-84309815}, {2140863671,-168489630}, {2132598271,-252409646}, {2121044558,-335940465}, {2106220349,-418953288}, {2088148500,-501320115}, {2066856885,-582913912}, {2042378310,-663608960}, {2014750533,-743280770}, {1984016179,-821806435}, {1950222618,-899064934}, {1913421927,-974937199}, {1873670877,-1049306180}, {1831030826,-1122057097}, {1785567394,-1193077993}, {1737350743,-1262259248}, {1686455222,-1329494189}, {1632959307,-1394679144}, {1576945572,-1457713510}, {1518500216,-1518500282}, {1457713441,-1576945636}, {1394679073,-1632959368}, {1329494115,-1686455280}, {1262259172,-1737350799}, {1193077915,-1785567446}, {1122057017,-1831030875}, {1049305987,-1873670985}, {974937230,-1913421912}, {899064965,-1950222603}, {821806407,-1984016190}, {743280682,-2014750566}, {663608871,-2042378339}, {582913822,-2066856911}, {501319962,-2088148536}, {418953102,-2106220386}, {335940246,-2121044593}, {252409648,-2132598271}, {168489600,-2140863674}, {84309753,-2145828017}, {-94,-2147483647}, {-84309940,-2145828010}, {-168489787,-2140863659}, {-252409834,-2132598249}, {-335940431,-2121044564}, {-418953286,-2106220349}, {-501320144,-2088148493}, {-582914003,-2066856860}, {-663609049,-2042378281}, {-743280858,-2014750501}, {-821806581,-1984016118}, {-899065136,-1950222525}, {-974937397,-1913421827}, {-1049306374,-1873670768}, {-1122057395,-1831030643}, {-1193078284,-1785567199}, {-1262259116,-1737350839}, {-1329494061,-1686455323}, {-1394679021,-1632959413}, {-1457713485,-1576945595}, {-1518500258,-1518500240}, {-1576945613,-1457713466}, {-1632959429,-1394679001}, {-1686455338,-1329494041}, {-1737350854,-1262259096}, {-1785567498,-1193077837}, {-1831030924,-1122056937}, {-1873671031,-1049305905}, {-1913422071,-974936918}, {-1950222750,-899064648}, {-1984016324,-821806084}, {-2014750687,-743280354}, {-2042378447,-663608538}, {-2066856867,-582913978}, {-2088148499,-501320119}, {-2106220354,-418953261}, {-2121044568,-335940406}, {-2132598282,-252409555}, {-2140863681,-168489506}, {-2145828021,-84309659}, {-2147483647,188}, {-2145828006,84310034}, {-2140863651,168489881}, {-2132598237,252409928}, {-2121044509,335940777}, {-2106220281,418953629}, {-2088148411,501320484}, {-2066856765,582914339}, {-2042378331,663608895}, {-2014750557,743280706}, {-1984016181,821806431}, {-1950222593,899064989}, {-1913421900,974937252}, {-1873670848,1049306232}, {-1831030728,1122057257}, {-1785567289,1193078149}, {-1737350633,1262259400}, {-1686455106,1329494336}, {-1632959185,1394679287}, {-1576945358,1457713742}, {-1518499993,1518500506}, {-1457713209,1576945850}, {-1394678735,1632959656}, {-1329493766,1686455555}, {-1262258813,1737351059}, {-1193077546,1785567692}, {-1122056638,1831031107}, {-1049305599,1873671202}, {-974936606,1913422229}, {-899064330,1950222896}, {-821805761,1984016458}, {-743280025,2014750808}, {-663609179,2042378239}, {-582914134,2066856823}, {-501320277,2088148461}, {-418953420,2106220322}, {-335940566,2121044542}, {-252409716,2132598263}, {-168489668,2140863668}, {-84309821,2145828015}, }; static const ne10_fft_cpx_int32_t ne10_twiddles_240[240] = { {0,0}, {2147483647,0}, {2147483647,0}, {2147483647,0}, {1961823921,-873460313}, {1436946998,-1595891394}, {2147483647,0}, {1436946998,-1595891394}, {-224473265,-2135719496}, {2147483647,0}, {663608871,-2042378339}, {-1737350854,-1262259096}, {2147483647,0}, {-224473265,-2135719496}, {-2100555935,446487152}, {2147483647,0}, {2135719506,-224473172}, {2100555974,-446486968}, {2042378310,-663608960}, {1961823921,-873460313}, {1859775377,-1073741851}, {1737350743,-1262259248}, {1595891331,-1436947067}, {1436946998,-1595891394}, {1262259172,-1737350799}, {1073741769,-1859775424}, {873460227,-1961823959}, {663608871,-2042378339}, {446486876,-2100555994}, {224473078,-2135719516}, {2147483647,0}, {2100555974,-446486968}, {1961823921,-873460313}, {1737350743,-1262259248}, {1436946998,-1595891394}, {1073741769,-1859775424}, {663608871,-2042378339}, {224473078,-2135719516}, {-224473265,-2135719496}, {-663609049,-2042378281}, {-1073741932,-1859775330}, {-1436947137,-1595891268}, {-1737350854,-1262259096}, {-1961823997,-873460141}, {-2100556013,-446486785}, {2147483647,0}, {2042378310,-663608960}, {1737350743,-1262259248}, {1262259172,-1737350799}, {663608871,-2042378339}, {-94,-2147483647}, {-663609049,-2042378281}, {-1262259116,-1737350839}, {-1737350854,-1262259096}, {-2042378447,-663608538}, {-2147483647,188}, {-2042378331,663608895}, {-1737350633,1262259400}, {-1262258813,1737351059}, {-663609179,2042378239}, {2147483647,0}, {2146747758,-56214570}, {2144540595,-112390613}, {2140863671,-168489630}, {2135719506,-224473172}, {2129111626,-280302871}, {2121044558,-335940465}, {2111523833,-391347822}, {2100555974,-446486968}, {2088148500,-501320115}, {2074309912,-555809682}, {2059049696,-609918325}, {2042378310,-663608960}, {2024307180,-716844791}, {2004848691,-769589332}, {1984016179,-821806435}, {1961823921,-873460313}, {1938287127,-924515564}, {1913421927,-974937199}, {1887245364,-1024690661}, {1859775377,-1073741851}, {1831030826,-1122057097}, {1801031311,-1169603450}, {1769797456,-1216348214}, {1737350743,-1262259248}, {1703713340,-1307305194}, {1668908218,-1351455280}, {1632959307,-1394679144}, {1595891331,-1436947067}, {1557729613,-1478230181}, {1518500216,-1518500282}, {1478230113,-1557729677}, {1436946998,-1595891394}, {1394679073,-1632959368}, {1351455207,-1668908277}, {1307305120,-1703713397}, {1262259172,-1737350799}, {1216348136,-1769797510}, {1169603371,-1801031362}, {1122057017,-1831030875}, {1073741769,-1859775424}, {1024690635,-1887245378}, {974937230,-1913421912}, {924515422,-1938287195}, {873460227,-1961823959}, {821806407,-1984016190}, {769589125,-2004848771}, {716844642,-2024307233}, {663608871,-2042378339}, {609918296,-2059049705}, {555809715,-2074309903}, {501319962,-2088148536}, {446486876,-2100555994}, {391347792,-2111523838}, {335940246,-2121044593}, {280302715,-2129111646}, {224473078,-2135719516}, {168489600,-2140863674}, {112390647,-2144540593}, {56214412,-2146747762}, {2147483647,0}, {2144540595,-112390613}, {2135719506,-224473172}, {2121044558,-335940465}, {2100555974,-446486968}, {2074309912,-555809682}, {2042378310,-663608960}, {2004848691,-769589332}, {1961823921,-873460313}, {1913421927,-974937199}, {1859775377,-1073741851}, {1801031311,-1169603450}, {1737350743,-1262259248}, {1668908218,-1351455280}, {1595891331,-1436947067}, {1518500216,-1518500282}, {1436946998,-1595891394}, {1351455207,-1668908277}, {1262259172,-1737350799}, {1169603371,-1801031362}, {1073741769,-1859775424}, {974937230,-1913421912}, {873460227,-1961823959}, {769589125,-2004848771}, {663608871,-2042378339}, {555809715,-2074309903}, {446486876,-2100555994}, {335940246,-2121044593}, {224473078,-2135719516}, {112390647,-2144540593}, {-94,-2147483647}, {-112390835,-2144540584}, {-224473265,-2135719496}, {-335940431,-2121044564}, {-446487060,-2100555955}, {-555809896,-2074309855}, {-663609049,-2042378281}, {-769589300,-2004848703}, {-873460398,-1961823883}, {-974937397,-1913421827}, {-1073741932,-1859775330}, {-1169603421,-1801031330}, {-1262259116,-1737350839}, {-1351455453,-1668908078}, {-1436947137,-1595891268}, {-1518500258,-1518500240}, {-1595891628,-1436946738}, {-1668908417,-1351455035}, {-1737350854,-1262259096}, {-1801031344,-1169603400}, {-1859775343,-1073741910}, {-1913422071,-974936918}, {-1961823997,-873460141}, {-2004848713,-769589276}, {-2042378447,-663608538}, {-2074309994,-555809377}, {-2100556013,-446486785}, {-2121044568,-335940406}, {-2135719499,-224473240}, {-2144540612,-112390298}, {2147483647,0}, {2140863671,-168489630}, {2121044558,-335940465}, {2088148500,-501320115}, {2042378310,-663608960}, {1984016179,-821806435}, {1913421927,-974937199}, {1831030826,-1122057097}, {1737350743,-1262259248}, {1632959307,-1394679144}, {1518500216,-1518500282}, {1394679073,-1632959368}, {1262259172,-1737350799}, {1122057017,-1831030875}, {974937230,-1913421912}, {821806407,-1984016190}, {663608871,-2042378339}, {501319962,-2088148536}, {335940246,-2121044593}, {168489600,-2140863674}, {-94,-2147483647}, {-168489787,-2140863659}, {-335940431,-2121044564}, {-501320144,-2088148493}, {-663609049,-2042378281}, {-821806581,-1984016118}, {-974937397,-1913421827}, {-1122057395,-1831030643}, {-1262259116,-1737350839}, {-1394679021,-1632959413}, {-1518500258,-1518500240}, {-1632959429,-1394679001}, {-1737350854,-1262259096}, {-1831030924,-1122056937}, {-1913422071,-974936918}, {-1984016324,-821806084}, {-2042378447,-663608538}, {-2088148499,-501320119}, {-2121044568,-335940406}, {-2140863681,-168489506}, {-2147483647,188}, {-2140863651,168489881}, {-2121044509,335940777}, {-2088148411,501320484}, {-2042378331,663608895}, {-1984016181,821806431}, {-1913421900,974937252}, {-1831030728,1122057257}, {-1737350633,1262259400}, {-1632959185,1394679287}, {-1518499993,1518500506}, {-1394678735,1632959656}, {-1262258813,1737351059}, {-1122056638,1831031107}, {-974936606,1913422229}, {-821805761,1984016458}, {-663609179,2042378239}, {-501320277,2088148461}, {-335940566,2121044542}, {-168489668,2140863668}, }; static const ne10_fft_cpx_int32_t ne10_twiddles_120[120] = { {0,0}, {2147483647,0}, {2147483647,0}, {2147483647,0}, {1961823921,-873460313}, {1436946998,-1595891394}, {2147483647,0}, {1436946998,-1595891394}, {-224473265,-2135719496}, {2147483647,0}, {663608871,-2042378339}, {-1737350854,-1262259096}, {2147483647,0}, {-224473265,-2135719496}, {-2100555935,446487152}, {2147483647,0}, {2100555974,-446486968}, {1961823921,-873460313}, {1737350743,-1262259248}, {1436946998,-1595891394}, {1073741769,-1859775424}, {663608871,-2042378339}, {224473078,-2135719516}, {-224473265,-2135719496}, {-663609049,-2042378281}, {-1073741932,-1859775330}, {-1436947137,-1595891268}, {-1737350854,-1262259096}, {-1961823997,-873460141}, {-2100556013,-446486785}, {2147483647,0}, {2144540595,-112390613}, {2135719506,-224473172}, {2121044558,-335940465}, {2100555974,-446486968}, {2074309912,-555809682}, {2042378310,-663608960}, {2004848691,-769589332}, {1961823921,-873460313}, {1913421927,-974937199}, {1859775377,-1073741851}, {1801031311,-1169603450}, {1737350743,-1262259248}, {1668908218,-1351455280}, {1595891331,-1436947067}, {1518500216,-1518500282}, {1436946998,-1595891394}, {1351455207,-1668908277}, {1262259172,-1737350799}, {1169603371,-1801031362}, {1073741769,-1859775424}, {974937230,-1913421912}, {873460227,-1961823959}, {769589125,-2004848771}, {663608871,-2042378339}, {555809715,-2074309903}, {446486876,-2100555994}, {335940246,-2121044593}, {224473078,-2135719516}, {112390647,-2144540593}, {2147483647,0}, {2135719506,-224473172}, {2100555974,-446486968}, {2042378310,-663608960}, {1961823921,-873460313}, {1859775377,-1073741851}, {1737350743,-1262259248}, {1595891331,-1436947067}, {1436946998,-1595891394}, {1262259172,-1737350799}, {1073741769,-1859775424}, {873460227,-1961823959}, {663608871,-2042378339}, {446486876,-2100555994}, {224473078,-2135719516}, {-94,-2147483647}, {-224473265,-2135719496}, {-446487060,-2100555955}, {-663609049,-2042378281}, {-873460398,-1961823883}, {-1073741932,-1859775330}, {-1262259116,-1737350839}, {-1436947137,-1595891268}, {-1595891628,-1436946738}, {-1737350854,-1262259096}, {-1859775343,-1073741910}, {-1961823997,-873460141}, {-2042378447,-663608538}, {-2100556013,-446486785}, {-2135719499,-224473240}, {2147483647,0}, {2121044558,-335940465}, {2042378310,-663608960}, {1913421927,-974937199}, {1737350743,-1262259248}, {1518500216,-1518500282}, {1262259172,-1737350799}, {974937230,-1913421912}, {663608871,-2042378339}, {335940246,-2121044593}, {-94,-2147483647}, {-335940431,-2121044564}, {-663609049,-2042378281}, {-974937397,-1913421827}, {-1262259116,-1737350839}, {-1518500258,-1518500240}, {-1737350854,-1262259096}, {-1913422071,-974936918}, {-2042378447,-663608538}, {-2121044568,-335940406}, {-2147483647,188}, {-2121044509,335940777}, {-2042378331,663608895}, {-1913421900,974937252}, {-1737350633,1262259400}, {-1518499993,1518500506}, {-1262258813,1737351059}, {-974936606,1913422229}, {-663609179,2042378239}, {-335940566,2121044542}, }; static const ne10_fft_cpx_int32_t ne10_twiddles_60[60] = { {0,0}, {2147483647,0}, {2147483647,0}, {2147483647,0}, {1961823921,-873460313}, {1436946998,-1595891394}, {2147483647,0}, {1436946998,-1595891394}, {-224473265,-2135719496}, {2147483647,0}, {663608871,-2042378339}, {-1737350854,-1262259096}, {2147483647,0}, {-224473265,-2135719496}, {-2100555935,446487152}, {2147483647,0}, {2135719506,-224473172}, {2100555974,-446486968}, {2042378310,-663608960}, {1961823921,-873460313}, {1859775377,-1073741851}, {1737350743,-1262259248}, {1595891331,-1436947067}, {1436946998,-1595891394}, {1262259172,-1737350799}, {1073741769,-1859775424}, {873460227,-1961823959}, {663608871,-2042378339}, {446486876,-2100555994}, {224473078,-2135719516}, {2147483647,0}, {2100555974,-446486968}, {1961823921,-873460313}, {1737350743,-1262259248}, {1436946998,-1595891394}, {1073741769,-1859775424}, {663608871,-2042378339}, {224473078,-2135719516}, {-224473265,-2135719496}, {-663609049,-2042378281}, {-1073741932,-1859775330}, {-1436947137,-1595891268}, {-1737350854,-1262259096}, {-1961823997,-873460141}, {-2100556013,-446486785}, {2147483647,0}, {2042378310,-663608960}, {1737350743,-1262259248}, {1262259172,-1737350799}, {663608871,-2042378339}, {-94,-2147483647}, {-663609049,-2042378281}, {-1262259116,-1737350839}, {-1737350854,-1262259096}, {-2042378447,-663608538}, {-2147483647,188}, {-2042378331,663608895}, {-1737350633,1262259400}, {-1262258813,1737351059}, {-663609179,2042378239}, }; static const ne10_fft_state_int32_t ne10_fft_state_int32_t_480 = { 120, (ne10_int32_t *)ne10_factors_480, (ne10_fft_cpx_int32_t *)ne10_twiddles_480, NULL, (ne10_fft_cpx_int32_t *)&ne10_twiddles_480[120], }; static const arch_fft_state cfg_arch_480 = { 1, (void *)&ne10_fft_state_int32_t_480, }; static const ne10_fft_state_int32_t ne10_fft_state_int32_t_240 = { 60, (ne10_int32_t *)ne10_factors_240, (ne10_fft_cpx_int32_t *)ne10_twiddles_240, NULL, (ne10_fft_cpx_int32_t *)&ne10_twiddles_240[60], }; static const arch_fft_state cfg_arch_240 = { 1, (void *)&ne10_fft_state_int32_t_240, }; static const ne10_fft_state_int32_t ne10_fft_state_int32_t_120 = { 30, (ne10_int32_t *)ne10_factors_120, (ne10_fft_cpx_int32_t *)ne10_twiddles_120, NULL, (ne10_fft_cpx_int32_t *)&ne10_twiddles_120[30], }; static const arch_fft_state cfg_arch_120 = { 1, (void *)&ne10_fft_state_int32_t_120, }; static const ne10_fft_state_int32_t ne10_fft_state_int32_t_60 = { 15, (ne10_int32_t *)ne10_factors_60, (ne10_fft_cpx_int32_t *)ne10_twiddles_60, NULL, (ne10_fft_cpx_int32_t *)&ne10_twiddles_60[15], }; static const arch_fft_state cfg_arch_60 = { 1, (void *)&ne10_fft_state_int32_t_60, }; #endif /* end NE10_FFT_PARAMS48000_960 */ mumble-1.3.4/3rdparty/opus-src/celt/fixed_debug.h0000664000175000017500000005132614010707327021540 0ustar builderbuilder/* Copyright (C) 2003-2008 Jean-Marc Valin Copyright (C) 2007-2012 Xiph.Org Foundation */ /** @file fixed_debug.h @brief Fixed-point operations with debugging */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef FIXED_DEBUG_H #define FIXED_DEBUG_H #include #include "opus_defines.h" #ifdef CELT_C OPUS_EXPORT opus_int64 celt_mips=0; #else extern opus_int64 celt_mips; #endif #define MULT16_16SU(a,b) ((opus_val32)(opus_val16)(a)*(opus_val32)(opus_uint16)(b)) #define MULT32_32_Q31(a,b) ADD32(ADD32(SHL32(MULT16_16(SHR32((a),16),SHR((b),16)),1), SHR32(MULT16_16SU(SHR32((a),16),((b)&0x0000ffff)),15)), SHR32(MULT16_16SU(SHR32((b),16),((a)&0x0000ffff)),15)) /** 16x32 multiplication, followed by a 16-bit shift right. Results fits in 32 bits */ #define MULT16_32_Q16(a,b) ADD32(MULT16_16((a),SHR32((b),16)), SHR32(MULT16_16SU((a),((b)&0x0000ffff)),16)) #define MULT16_32_P16(a,b) MULT16_32_PX(a,b,16) #define QCONST16(x,bits) ((opus_val16)(.5+(x)*(((opus_val32)1)<<(bits)))) #define QCONST32(x,bits) ((opus_val32)(.5+(x)*(((opus_val32)1)<<(bits)))) #define VERIFY_SHORT(x) ((x)<=32767&&(x)>=-32768) #define VERIFY_INT(x) ((x)<=2147483647LL&&(x)>=-2147483648LL) #define VERIFY_UINT(x) ((x)<=(2147483647LLU<<1)) #define SHR(a,b) SHR32(a,b) #define PSHR(a,b) PSHR32(a,b) /** Add two 32-bit values, ignore any overflows */ #define ADD32_ovflw(a,b) (celt_mips+=2,(opus_val32)((opus_uint32)(a)+(opus_uint32)(b))) /** Subtract two 32-bit values, ignore any overflows */ #define SUB32_ovflw(a,b) (celt_mips+=2,(opus_val32)((opus_uint32)(a)-(opus_uint32)(b))) /* Avoid MSVC warning C4146: unary minus operator applied to unsigned type */ /** Negate 32-bit value, ignore any overflows */ #define NEG32_ovflw(a) (celt_mips+=2,(opus_val32)(0-(opus_uint32)(a))) static OPUS_INLINE short NEG16(int x) { int res; if (!VERIFY_SHORT(x)) { fprintf (stderr, "NEG16: input is not short: %d\n", (int)x); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } res = -x; if (!VERIFY_SHORT(res)) { fprintf (stderr, "NEG16: output is not short: %d\n", (int)res); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } celt_mips++; return res; } static OPUS_INLINE int NEG32(opus_int64 x) { opus_int64 res; if (!VERIFY_INT(x)) { fprintf (stderr, "NEG16: input is not int: %d\n", (int)x); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } res = -x; if (!VERIFY_INT(res)) { fprintf (stderr, "NEG16: output is not int: %d\n", (int)res); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } celt_mips+=2; return res; } #define EXTRACT16(x) EXTRACT16_(x, __FILE__, __LINE__) static OPUS_INLINE short EXTRACT16_(int x, char *file, int line) { int res; if (!VERIFY_SHORT(x)) { fprintf (stderr, "EXTRACT16: input is not short: %d in %s: line %d\n", x, file, line); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } res = x; celt_mips++; return res; } #define EXTEND32(x) EXTEND32_(x, __FILE__, __LINE__) static OPUS_INLINE int EXTEND32_(int x, char *file, int line) { int res; if (!VERIFY_SHORT(x)) { fprintf (stderr, "EXTEND32: input is not short: %d in %s: line %d\n", x, file, line); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } res = x; celt_mips++; return res; } #define SHR16(a, shift) SHR16_(a, shift, __FILE__, __LINE__) static OPUS_INLINE short SHR16_(int a, int shift, char *file, int line) { int res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(shift)) { fprintf (stderr, "SHR16: inputs are not short: %d >> %d in %s: line %d\n", a, shift, file, line); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } res = a>>shift; if (!VERIFY_SHORT(res)) { fprintf (stderr, "SHR16: output is not short: %d in %s: line %d\n", res, file, line); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } celt_mips++; return res; } #define SHL16(a, shift) SHL16_(a, shift, __FILE__, __LINE__) static OPUS_INLINE short SHL16_(int a, int shift, char *file, int line) { int res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(shift)) { fprintf (stderr, "SHL16: inputs are not short: %d %d in %s: line %d\n", a, shift, file, line); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } res = a<>shift; if (!VERIFY_INT(res)) { fprintf (stderr, "SHR32: output is not int: %d\n", (int)res); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } celt_mips+=2; return res; } #define SHL32(a, shift) SHL32_(a, shift, __FILE__, __LINE__) static OPUS_INLINE int SHL32_(opus_int64 a, int shift, char *file, int line) { opus_int64 res; if (!VERIFY_INT(a) || !VERIFY_SHORT(shift)) { fprintf (stderr, "SHL32: inputs are not int: %lld %d in %s: line %d\n", a, shift, file, line); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } res = a<>1))),shift)) #define VSHR32(a, shift) (((shift)>0) ? SHR32(a, shift) : SHL32(a, -(shift))) #define ROUND16(x,a) (celt_mips--,EXTRACT16(PSHR32((x),(a)))) #define SROUND16(x,a) (celt_mips--,EXTRACT16(SATURATE(PSHR32(x,a), 32767))); #define HALF16(x) (SHR16(x,1)) #define HALF32(x) (SHR32(x,1)) #define ADD16(a, b) ADD16_(a, b, __FILE__, __LINE__) static OPUS_INLINE short ADD16_(int a, int b, char *file, int line) { int res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "ADD16: inputs are not short: %d %d in %s: line %d\n", a, b, file, line); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } res = a+b; if (!VERIFY_SHORT(res)) { fprintf (stderr, "ADD16: output is not short: %d+%d=%d in %s: line %d\n", a,b,res, file, line); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } celt_mips++; return res; } #define SUB16(a, b) SUB16_(a, b, __FILE__, __LINE__) static OPUS_INLINE short SUB16_(int a, int b, char *file, int line) { int res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "SUB16: inputs are not short: %d %d in %s: line %d\n", a, b, file, line); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } res = a-b; if (!VERIFY_SHORT(res)) { fprintf (stderr, "SUB16: output is not short: %d in %s: line %d\n", res, file, line); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } celt_mips++; return res; } #define ADD32(a, b) ADD32_(a, b, __FILE__, __LINE__) static OPUS_INLINE int ADD32_(opus_int64 a, opus_int64 b, char *file, int line) { opus_int64 res; if (!VERIFY_INT(a) || !VERIFY_INT(b)) { fprintf (stderr, "ADD32: inputs are not int: %d %d in %s: line %d\n", (int)a, (int)b, file, line); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } res = a+b; if (!VERIFY_INT(res)) { fprintf (stderr, "ADD32: output is not int: %d in %s: line %d\n", (int)res, file, line); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } celt_mips+=2; return res; } #define SUB32(a, b) SUB32_(a, b, __FILE__, __LINE__) static OPUS_INLINE int SUB32_(opus_int64 a, opus_int64 b, char *file, int line) { opus_int64 res; if (!VERIFY_INT(a) || !VERIFY_INT(b)) { fprintf (stderr, "SUB32: inputs are not int: %d %d in %s: line %d\n", (int)a, (int)b, file, line); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } res = a-b; if (!VERIFY_INT(res)) { fprintf (stderr, "SUB32: output is not int: %d in %s: line %d\n", (int)res, file, line); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } celt_mips+=2; return res; } #undef UADD32 #define UADD32(a, b) UADD32_(a, b, __FILE__, __LINE__) static OPUS_INLINE unsigned int UADD32_(opus_uint64 a, opus_uint64 b, char *file, int line) { opus_uint64 res; if (!VERIFY_UINT(a) || !VERIFY_UINT(b)) { fprintf (stderr, "UADD32: inputs are not uint32: %llu %llu in %s: line %d\n", a, b, file, line); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } res = a+b; if (!VERIFY_UINT(res)) { fprintf (stderr, "UADD32: output is not uint32: %llu in %s: line %d\n", res, file, line); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } celt_mips+=2; return res; } #undef USUB32 #define USUB32(a, b) USUB32_(a, b, __FILE__, __LINE__) static OPUS_INLINE unsigned int USUB32_(opus_uint64 a, opus_uint64 b, char *file, int line) { opus_uint64 res; if (!VERIFY_UINT(a) || !VERIFY_UINT(b)) { fprintf (stderr, "USUB32: inputs are not uint32: %llu %llu in %s: line %d\n", a, b, file, line); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } if (a=((opus_val32)(1)<<(15+Q))) { fprintf (stderr, "MULT16_32_Q%d: second operand too large: %d %d in %s: line %d\n", Q, (int)a, (int)b, file, line); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } res = (((opus_int64)a)*(opus_int64)b) >> Q; if (!VERIFY_INT(res)) { fprintf (stderr, "MULT16_32_Q%d: output is not int: %d*%d=%d in %s: line %d\n", Q, (int)a, (int)b,(int)res, file, line); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } if (Q==15) celt_mips+=3; else celt_mips+=4; return res; } #define MULT16_32_PX(a, b, Q) MULT16_32_PX_(a, b, Q, __FILE__, __LINE__) static OPUS_INLINE int MULT16_32_PX_(int a, opus_int64 b, int Q, char *file, int line) { opus_int64 res; if (!VERIFY_SHORT(a) || !VERIFY_INT(b)) { fprintf (stderr, "MULT16_32_P%d: inputs are not short+int: %d %d in %s: line %d\n\n", Q, (int)a, (int)b, file, line); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } if (ABS32(b)>=((opus_int64)(1)<<(15+Q))) { fprintf (stderr, "MULT16_32_Q%d: second operand too large: %d %d in %s: line %d\n\n", Q, (int)a, (int)b,file, line); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } res = ((((opus_int64)a)*(opus_int64)b) + (((opus_val32)(1)<>1))>> Q; if (!VERIFY_INT(res)) { fprintf (stderr, "MULT16_32_P%d: output is not int: %d*%d=%d in %s: line %d\n\n", Q, (int)a, (int)b,(int)res, file, line); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } if (Q==15) celt_mips+=4; else celt_mips+=5; return res; } #define MULT16_32_Q15(a,b) MULT16_32_QX(a,b,15) #define MAC16_32_Q15(c,a,b) (celt_mips-=2,ADD32((c),MULT16_32_Q15((a),(b)))) #define MAC16_32_Q16(c,a,b) (celt_mips-=2,ADD32((c),MULT16_32_Q16((a),(b)))) static OPUS_INLINE int SATURATE(int a, int b) { if (a>b) a=b; if (a<-b) a = -b; celt_mips+=3; return a; } static OPUS_INLINE opus_int16 SATURATE16(opus_int32 a) { celt_mips+=3; if (a>32767) return 32767; else if (a<-32768) return -32768; else return a; } static OPUS_INLINE int MULT16_16_Q11_32(int a, int b) { opus_int64 res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16_Q11: inputs are not short: %d %d\n", a, b); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } res = ((opus_int64)a)*b; res >>= 11; if (!VERIFY_INT(res)) { fprintf (stderr, "MULT16_16_Q11: output is not short: %d*%d=%d\n", (int)a, (int)b, (int)res); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } celt_mips+=3; return res; } static OPUS_INLINE short MULT16_16_Q13(int a, int b) { opus_int64 res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16_Q13: inputs are not short: %d %d\n", a, b); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } res = ((opus_int64)a)*b; res >>= 13; if (!VERIFY_SHORT(res)) { fprintf (stderr, "MULT16_16_Q13: output is not short: %d*%d=%d\n", a, b, (int)res); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } celt_mips+=3; return res; } static OPUS_INLINE short MULT16_16_Q14(int a, int b) { opus_int64 res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16_Q14: inputs are not short: %d %d\n", a, b); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } res = ((opus_int64)a)*b; res >>= 14; if (!VERIFY_SHORT(res)) { fprintf (stderr, "MULT16_16_Q14: output is not short: %d\n", (int)res); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } celt_mips+=3; return res; } #define MULT16_16_Q15(a, b) MULT16_16_Q15_(a, b, __FILE__, __LINE__) static OPUS_INLINE short MULT16_16_Q15_(int a, int b, char *file, int line) { opus_int64 res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16_Q15: inputs are not short: %d %d in %s: line %d\n", a, b, file, line); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } res = ((opus_int64)a)*b; res >>= 15; if (!VERIFY_SHORT(res)) { fprintf (stderr, "MULT16_16_Q15: output is not short: %d in %s: line %d\n", (int)res, file, line); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } celt_mips+=1; return res; } static OPUS_INLINE short MULT16_16_P13(int a, int b) { opus_int64 res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16_P13: inputs are not short: %d %d\n", a, b); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } res = ((opus_int64)a)*b; res += 4096; if (!VERIFY_INT(res)) { fprintf (stderr, "MULT16_16_P13: overflow: %d*%d=%d\n", a, b, (int)res); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } res >>= 13; if (!VERIFY_SHORT(res)) { fprintf (stderr, "MULT16_16_P13: output is not short: %d*%d=%d\n", a, b, (int)res); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } celt_mips+=4; return res; } static OPUS_INLINE short MULT16_16_P14(int a, int b) { opus_int64 res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16_P14: inputs are not short: %d %d\n", a, b); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } res = ((opus_int64)a)*b; res += 8192; if (!VERIFY_INT(res)) { fprintf (stderr, "MULT16_16_P14: overflow: %d*%d=%d\n", a, b, (int)res); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } res >>= 14; if (!VERIFY_SHORT(res)) { fprintf (stderr, "MULT16_16_P14: output is not short: %d*%d=%d\n", a, b, (int)res); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } celt_mips+=4; return res; } static OPUS_INLINE short MULT16_16_P15(int a, int b) { opus_int64 res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16_P15: inputs are not short: %d %d\n", a, b); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } res = ((opus_int64)a)*b; res += 16384; if (!VERIFY_INT(res)) { fprintf (stderr, "MULT16_16_P15: overflow: %d*%d=%d\n", a, b, (int)res); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } res >>= 15; if (!VERIFY_SHORT(res)) { fprintf (stderr, "MULT16_16_P15: output is not short: %d*%d=%d\n", a, b, (int)res); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } celt_mips+=2; return res; } #define DIV32_16(a, b) DIV32_16_(a, b, __FILE__, __LINE__) static OPUS_INLINE int DIV32_16_(opus_int64 a, opus_int64 b, char *file, int line) { opus_int64 res; if (b==0) { fprintf(stderr, "DIV32_16: divide by zero: %d/%d in %s: line %d\n", (int)a, (int)b, file, line); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif return 0; } if (!VERIFY_INT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "DIV32_16: inputs are not int/short: %d %d in %s: line %d\n", (int)a, (int)b, file, line); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } res = a/b; if (!VERIFY_SHORT(res)) { fprintf (stderr, "DIV32_16: output is not short: %d / %d = %d in %s: line %d\n", (int)a,(int)b,(int)res, file, line); if (res>32767) res = 32767; if (res<-32768) res = -32768; #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } celt_mips+=35; return res; } #define DIV32(a, b) DIV32_(a, b, __FILE__, __LINE__) static OPUS_INLINE int DIV32_(opus_int64 a, opus_int64 b, char *file, int line) { opus_int64 res; if (b==0) { fprintf(stderr, "DIV32: divide by zero: %d/%d in %s: line %d\n", (int)a, (int)b, file, line); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif return 0; } if (!VERIFY_INT(a) || !VERIFY_INT(b)) { fprintf (stderr, "DIV32: inputs are not int/short: %d %d in %s: line %d\n", (int)a, (int)b, file, line); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } res = a/b; if (!VERIFY_INT(res)) { fprintf (stderr, "DIV32: output is not int: %d in %s: line %d\n", (int)res, file, line); #ifdef FIXED_DEBUG_ASSERT celt_assert(0); #endif } celt_mips+=70; return res; } static OPUS_INLINE opus_val16 SIG2WORD16_generic(celt_sig x) { x = PSHR32(x, SIG_SHIFT); x = MAX32(x, -32768); x = MIN32(x, 32767); return EXTRACT16(x); } #define SIG2WORD16(x) (SIG2WORD16_generic(x)) #undef PRINT_MIPS #define PRINT_MIPS(file) do {fprintf (file, "total complexity = %llu MIPS\n", celt_mips);} while (0); #endif mumble-1.3.4/3rdparty/opus-src/celt/celt_lpc.h0000664000175000017500000000425514010707327021057 0ustar builderbuilder/* Copyright (c) 2009-2010 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef PLC_H #define PLC_H #include "arch.h" #include "cpu_support.h" #if defined(OPUS_X86_MAY_HAVE_SSE4_1) #include "x86/celt_lpc_sse.h" #endif #define LPC_ORDER 24 void _celt_lpc(opus_val16 *_lpc, const opus_val32 *ac, int p); void celt_fir_c( const opus_val16 *x, const opus_val16 *num, opus_val16 *y, int N, int ord, int arch); #if !defined(OVERRIDE_CELT_FIR) #define celt_fir(x, num, y, N, ord, arch) \ (celt_fir_c(x, num, y, N, ord, arch)) #endif void celt_iir(const opus_val32 *x, const opus_val16 *den, opus_val32 *y, int N, int ord, opus_val16 *mem, int arch); int _celt_autocorr(const opus_val16 *x, opus_val32 *ac, const opus_val16 *window, int overlap, int lag, int n, int arch); #endif /* PLC_H */ mumble-1.3.4/3rdparty/opus-src/celt/entenc.h0000664000175000017500000001246314010707327020546 0ustar builderbuilder/* Copyright (c) 2001-2011 Timothy B. Terriberry Copyright (c) 2008-2009 Xiph.Org Foundation */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if !defined(_entenc_H) # define _entenc_H (1) # include # include "entcode.h" /*Initializes the encoder. _buf: The buffer to store output bytes in. _size: The size of the buffer, in chars.*/ void ec_enc_init(ec_enc *_this,unsigned char *_buf,opus_uint32 _size); /*Encodes a symbol given its frequency information. The frequency information must be discernable by the decoder, assuming it has read only the previous symbols from the stream. It is allowable to change the frequency information, or even the entire source alphabet, so long as the decoder can tell from the context of the previously encoded information that it is supposed to do so as well. _fl: The cumulative frequency of all symbols that come before the one to be encoded. _fh: The cumulative frequency of all symbols up to and including the one to be encoded. Together with _fl, this defines the range [_fl,_fh) in which the decoded value will fall. _ft: The sum of the frequencies of all the symbols*/ void ec_encode(ec_enc *_this,unsigned _fl,unsigned _fh,unsigned _ft); /*Equivalent to ec_encode() with _ft==1<<_bits.*/ void ec_encode_bin(ec_enc *_this,unsigned _fl,unsigned _fh,unsigned _bits); /* Encode a bit that has a 1/(1<<_logp) probability of being a one */ void ec_enc_bit_logp(ec_enc *_this,int _val,unsigned _logp); /*Encodes a symbol given an "inverse" CDF table. _s: The index of the symbol to encode. _icdf: The "inverse" CDF, such that symbol _s falls in the range [_s>0?ft-_icdf[_s-1]:0,ft-_icdf[_s]), where ft=1<<_ftb. The values must be monotonically non-increasing, and the last value must be 0. _ftb: The number of bits of precision in the cumulative distribution.*/ void ec_enc_icdf(ec_enc *_this,int _s,const unsigned char *_icdf,unsigned _ftb); /*Encodes a raw unsigned integer in the stream. _fl: The integer to encode. _ft: The number of integers that can be encoded (one more than the max). This must be at least one, and no more than 2**32-1.*/ void ec_enc_uint(ec_enc *_this,opus_uint32 _fl,opus_uint32 _ft); /*Encodes a sequence of raw bits in the stream. _fl: The bits to encode. _ftb: The number of bits to encode. This must be between 1 and 25, inclusive.*/ void ec_enc_bits(ec_enc *_this,opus_uint32 _fl,unsigned _ftb); /*Overwrites a few bits at the very start of an existing stream, after they have already been encoded. This makes it possible to have a few flags up front, where it is easy for decoders to access them without parsing the whole stream, even if their values are not determined until late in the encoding process, without having to buffer all the intermediate symbols in the encoder. In order for this to work, at least _nbits bits must have already been encoded using probabilities that are an exact power of two. The encoder can verify the number of encoded bits is sufficient, but cannot check this latter condition. _val: The bits to encode (in the least _nbits significant bits). They will be decoded in order from most-significant to least. _nbits: The number of bits to overwrite. This must be no more than 8.*/ void ec_enc_patch_initial_bits(ec_enc *_this,unsigned _val,unsigned _nbits); /*Compacts the data to fit in the target size. This moves up the raw bits at the end of the current buffer so they are at the end of the new buffer size. The caller must ensure that the amount of data that's already been written will fit in the new size. _size: The number of bytes in the new buffer. This must be large enough to contain the bits already written, and must be no larger than the existing size.*/ void ec_enc_shrink(ec_enc *_this,opus_uint32 _size); /*Indicates that there are no more symbols to encode. All reamining output bytes are flushed to the output buffer. ec_enc_init() must be called before the encoder can be used again.*/ void ec_enc_done(ec_enc *_this); #endif mumble-1.3.4/3rdparty/opus-src/celt/celt.c0000664000175000017500000002162314010707326020211 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2010 Xiph.Org Foundation Copyright (c) 2008 Gregory Maxwell Written by Jean-Marc Valin and Gregory Maxwell */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #define CELT_C #include "os_support.h" #include "mdct.h" #include #include "celt.h" #include "pitch.h" #include "bands.h" #include "modes.h" #include "entcode.h" #include "quant_bands.h" #include "rate.h" #include "stack_alloc.h" #include "mathops.h" #include "float_cast.h" #include #include "celt_lpc.h" #include "vq.h" #ifndef PACKAGE_VERSION #define PACKAGE_VERSION "unknown" #endif #if defined(MIPSr1_ASM) #include "mips/celt_mipsr1.h" #endif int resampling_factor(opus_int32 rate) { int ret; switch (rate) { case 48000: ret = 1; break; case 24000: ret = 2; break; case 16000: ret = 3; break; case 12000: ret = 4; break; case 8000: ret = 6; break; default: #ifndef CUSTOM_MODES celt_assert(0); #endif ret = 0; break; } return ret; } #if !defined(OVERRIDE_COMB_FILTER_CONST) || defined(NON_STATIC_COMB_FILTER_CONST_C) /* This version should be faster on ARM */ #ifdef OPUS_ARM_ASM #ifndef NON_STATIC_COMB_FILTER_CONST_C static #endif void comb_filter_const_c(opus_val32 *y, opus_val32 *x, int T, int N, opus_val16 g10, opus_val16 g11, opus_val16 g12) { opus_val32 x0, x1, x2, x3, x4; int i; x4 = SHL32(x[-T-2], 1); x3 = SHL32(x[-T-1], 1); x2 = SHL32(x[-T], 1); x1 = SHL32(x[-T+1], 1); for (i=0;inbEBands;i++) { int N; N=(m->eBands[i+1]-m->eBands[i])<cache.caps[m->nbEBands*(2*LM+C-1)+i]+64)*C*N>>2; } } const char *opus_strerror(int error) { static const char * const error_strings[8] = { "success", "invalid argument", "buffer too small", "internal error", "corrupted stream", "request not implemented", "invalid state", "memory allocation failed" }; if (error > 0 || error < -7) return "unknown error"; else return error_strings[-error]; } const char *opus_get_version_string(void) { return "libopus " PACKAGE_VERSION /* Applications may rely on the presence of this substring in the version string to determine if they have a fixed-point or floating-point build at runtime. */ #ifdef FIXED_POINT "-fixed" #endif #ifdef FUZZING "-fuzzing" #endif ; } mumble-1.3.4/3rdparty/opus-src/celt/vq.h0000664000175000017500000000614114010707327017714 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /** @file vq.h @brief Vector quantisation of the residual */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef VQ_H #define VQ_H #include "entenc.h" #include "entdec.h" #include "modes.h" #if (defined(OPUS_X86_MAY_HAVE_SSE2) && !defined(FIXED_POINT)) #include "x86/vq_sse.h" #endif #if defined(MIPSr1_ASM) #include "mips/vq_mipsr1.h" #endif void exp_rotation(celt_norm *X, int len, int dir, int stride, int K, int spread); opus_val16 op_pvq_search_c(celt_norm *X, int *iy, int K, int N, int arch); #if !defined(OVERRIDE_OP_PVQ_SEARCH) #define op_pvq_search(x, iy, K, N, arch) \ (op_pvq_search_c(x, iy, K, N, arch)) #endif /** Algebraic pulse-vector quantiser. The signal x is replaced by the sum of * the pitch and a combination of pulses such that its norm is still equal * to 1. This is the function that will typically require the most CPU. * @param X Residual signal to quantise/encode (returns quantised version) * @param N Number of samples to encode * @param K Number of pulses to use * @param enc Entropy encoder state * @ret A mask indicating which blocks in the band received pulses */ unsigned alg_quant(celt_norm *X, int N, int K, int spread, int B, ec_enc *enc, opus_val16 gain, int resynth, int arch); /** Algebraic pulse decoder * @param X Decoded normalised spectrum (returned) * @param N Number of samples to decode * @param K Number of pulses to use * @param dec Entropy decoder state * @ret A mask indicating which blocks in the band received pulses */ unsigned alg_unquant(celt_norm *X, int N, int K, int spread, int B, ec_dec *dec, opus_val16 gain); void renormalise_vector(celt_norm *X, int N, opus_val16 gain, int arch); int stereo_itheta(const celt_norm *X, const celt_norm *Y, int stereo, int N, int arch); #endif /* VQ_H */ mumble-1.3.4/3rdparty/opus-src/celt/mathops.h0000664000175000017500000001745014010707327020746 0ustar builderbuilder/* Copyright (c) 2002-2008 Jean-Marc Valin Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /** @file mathops.h @brief Various math functions */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef MATHOPS_H #define MATHOPS_H #include "arch.h" #include "entcode.h" #include "os_support.h" #define PI 3.141592653f /* Multiplies two 16-bit fractional values. Bit-exactness of this macro is important */ #define FRAC_MUL16(a,b) ((16384+((opus_int32)(opus_int16)(a)*(opus_int16)(b)))>>15) unsigned isqrt32(opus_uint32 _val); /* CELT doesn't need it for fixed-point, by analysis.c does. */ #if !defined(FIXED_POINT) || defined(ANALYSIS_C) #define cA 0.43157974f #define cB 0.67848403f #define cC 0.08595542f #define cE ((float)PI/2) static OPUS_INLINE float fast_atan2f(float y, float x) { float x2, y2; x2 = x*x; y2 = y*y; /* For very small values, we don't care about the answer, so we can just return 0. */ if (x2 + y2 < 1e-18f) { return 0; } if(x2>23)-127; in.i -= integer<<23; frac = in.f - 1.5f; frac = -0.41445418f + frac*(0.95909232f + frac*(-0.33951290f + frac*0.16541097f)); return 1+integer+frac; } /** Base-2 exponential approximation (2^x). */ static OPUS_INLINE float celt_exp2(float x) { int integer; float frac; union { float f; opus_uint32 i; } res; integer = floor(x); if (integer < -50) return 0; frac = x-integer; /* K0 = 1, K1 = log(2), K2 = 3-4*log(2), K3 = 3*log(2) - 2 */ res.f = 0.99992522f + frac * (0.69583354f + frac * (0.22606716f + 0.078024523f*frac)); res.i = (res.i + (integer<<23)) & 0x7fffffff; return res.f; } #else #define celt_log2(x) ((float)(1.442695040888963387*log(x))) #define celt_exp2(x) ((float)exp(0.6931471805599453094*(x))) #endif #endif #ifdef FIXED_POINT #include "os_support.h" #ifndef OVERRIDE_CELT_ILOG2 /** Integer log in base2. Undefined for zero and negative numbers */ static OPUS_INLINE opus_int16 celt_ilog2(opus_int32 x) { celt_assert2(x>0, "celt_ilog2() only defined for strictly positive numbers"); return EC_ILOG(x)-1; } #endif /** Integer log in base2. Defined for zero, but not for negative numbers */ static OPUS_INLINE opus_int16 celt_zlog2(opus_val32 x) { return x <= 0 ? 0 : celt_ilog2(x); } opus_val16 celt_rsqrt_norm(opus_val32 x); opus_val32 celt_sqrt(opus_val32 x); opus_val16 celt_cos_norm(opus_val32 x); /** Base-2 logarithm approximation (log2(x)). (Q14 input, Q10 output) */ static OPUS_INLINE opus_val16 celt_log2(opus_val32 x) { int i; opus_val16 n, frac; /* -0.41509302963303146, 0.9609890551383969, -0.31836011537636605, 0.15530808010959576, -0.08556153059057618 */ static const opus_val16 C[5] = {-6801+(1<<(13-DB_SHIFT)), 15746, -5217, 2545, -1401}; if (x==0) return -32767; i = celt_ilog2(x); n = VSHR32(x,i-15)-32768-16384; frac = ADD16(C[0], MULT16_16_Q15(n, ADD16(C[1], MULT16_16_Q15(n, ADD16(C[2], MULT16_16_Q15(n, ADD16(C[3], MULT16_16_Q15(n, C[4])))))))); return SHL16(i-13,DB_SHIFT)+SHR16(frac,14-DB_SHIFT); } /* K0 = 1 K1 = log(2) K2 = 3-4*log(2) K3 = 3*log(2) - 2 */ #define D0 16383 #define D1 22804 #define D2 14819 #define D3 10204 static OPUS_INLINE opus_val32 celt_exp2_frac(opus_val16 x) { opus_val16 frac; frac = SHL16(x, 4); return ADD16(D0, MULT16_16_Q15(frac, ADD16(D1, MULT16_16_Q15(frac, ADD16(D2 , MULT16_16_Q15(D3,frac)))))); } /** Base-2 exponential approximation (2^x). (Q10 input, Q16 output) */ static OPUS_INLINE opus_val32 celt_exp2(opus_val16 x) { int integer; opus_val16 frac; integer = SHR16(x,10); if (integer>14) return 0x7f000000; else if (integer < -15) return 0; frac = celt_exp2_frac(x-SHL16(integer,10)); return VSHR32(EXTEND32(frac), -integer-2); } opus_val32 celt_rcp(opus_val32 x); #define celt_div(a,b) MULT32_32_Q31((opus_val32)(a),celt_rcp(b)) opus_val32 frac_div32(opus_val32 a, opus_val32 b); #define M1 32767 #define M2 -21 #define M3 -11943 #define M4 4936 /* Atan approximation using a 4th order polynomial. Input is in Q15 format and normalized by pi/4. Output is in Q15 format */ static OPUS_INLINE opus_val16 celt_atan01(opus_val16 x) { return MULT16_16_P15(x, ADD32(M1, MULT16_16_P15(x, ADD32(M2, MULT16_16_P15(x, ADD32(M3, MULT16_16_P15(M4, x))))))); } #undef M1 #undef M2 #undef M3 #undef M4 /* atan2() approximation valid for positive input values */ static OPUS_INLINE opus_val16 celt_atan2p(opus_val16 y, opus_val16 x) { if (y < x) { opus_val32 arg; arg = celt_div(SHL32(EXTEND32(y),15),x); if (arg >= 32767) arg = 32767; return SHR16(celt_atan01(EXTRACT16(arg)),1); } else { opus_val32 arg; arg = celt_div(SHL32(EXTEND32(x),15),y); if (arg >= 32767) arg = 32767; return 25736-SHR16(celt_atan01(EXTRACT16(arg)),1); } } #endif /* FIXED_POINT */ #endif /* MATHOPS_H */ mumble-1.3.4/3rdparty/opus-src/celt/entdec.h0000664000175000017500000001134314010707327020530 0ustar builderbuilder/* Copyright (c) 2001-2011 Timothy B. Terriberry Copyright (c) 2008-2009 Xiph.Org Foundation */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if !defined(_entdec_H) # define _entdec_H (1) # include # include "entcode.h" /*Initializes the decoder. _buf: The input buffer to use. Return: 0 on success, or a negative value on error.*/ void ec_dec_init(ec_dec *_this,unsigned char *_buf,opus_uint32 _storage); /*Calculates the cumulative frequency for the next symbol. This can then be fed into the probability model to determine what that symbol is, and the additional frequency information required to advance to the next symbol. This function cannot be called more than once without a corresponding call to ec_dec_update(), or decoding will not proceed correctly. _ft: The total frequency of the symbols in the alphabet the next symbol was encoded with. Return: A cumulative frequency representing the encoded symbol. If the cumulative frequency of all the symbols before the one that was encoded was fl, and the cumulative frequency of all the symbols up to and including the one encoded is fh, then the returned value will fall in the range [fl,fh).*/ unsigned ec_decode(ec_dec *_this,unsigned _ft); /*Equivalent to ec_decode() with _ft==1<<_bits.*/ unsigned ec_decode_bin(ec_dec *_this,unsigned _bits); /*Advance the decoder past the next symbol using the frequency information the symbol was encoded with. Exactly one call to ec_decode() must have been made so that all necessary intermediate calculations are performed. _fl: The cumulative frequency of all symbols that come before the symbol decoded. _fh: The cumulative frequency of all symbols up to and including the symbol decoded. Together with _fl, this defines the range [_fl,_fh) in which the value returned above must fall. _ft: The total frequency of the symbols in the alphabet the symbol decoded was encoded in. This must be the same as passed to the preceding call to ec_decode().*/ void ec_dec_update(ec_dec *_this,unsigned _fl,unsigned _fh,unsigned _ft); /* Decode a bit that has a 1/(1<<_logp) probability of being a one */ int ec_dec_bit_logp(ec_dec *_this,unsigned _logp); /*Decodes a symbol given an "inverse" CDF table. No call to ec_dec_update() is necessary after this call. _icdf: The "inverse" CDF, such that symbol s falls in the range [s>0?ft-_icdf[s-1]:0,ft-_icdf[s]), where ft=1<<_ftb. The values must be monotonically non-increasing, and the last value must be 0. _ftb: The number of bits of precision in the cumulative distribution. Return: The decoded symbol s.*/ int ec_dec_icdf(ec_dec *_this,const unsigned char *_icdf,unsigned _ftb); /*Extracts a raw unsigned integer with a non-power-of-2 range from the stream. The bits must have been encoded with ec_enc_uint(). No call to ec_dec_update() is necessary after this call. _ft: The number of integers that can be decoded (one more than the max). This must be at least one, and no more than 2**32-1. Return: The decoded bits.*/ opus_uint32 ec_dec_uint(ec_dec *_this,opus_uint32 _ft); /*Extracts a sequence of raw bits from the stream. The bits must have been encoded with ec_enc_bits(). No call to ec_dec_update() is necessary after this call. _ftb: The number of bits to extract. This must be between 0 and 25, inclusive. Return: The decoded bits.*/ opus_uint32 ec_dec_bits(ec_dec *_this,unsigned _ftb); #endif mumble-1.3.4/3rdparty/opus-src/celt/static_modes_fixed.h0000664000175000017500000010006314010707327023121 0ustar builderbuilder/* The contents of this file was automatically generated by dump_modes.c with arguments: 48000 960 It contains static definitions for some pre-defined modes. */ #include "modes.h" #include "rate.h" #ifdef HAVE_ARM_NE10 #define OVERRIDE_FFT 1 #include "static_modes_fixed_arm_ne10.h" #endif #ifndef DEF_WINDOW120 #define DEF_WINDOW120 static const opus_val16 window120[120] = { 2, 20, 55, 108, 178, 266, 372, 494, 635, 792, 966, 1157, 1365, 1590, 1831, 2089, 2362, 2651, 2956, 3276, 3611, 3961, 4325, 4703, 5094, 5499, 5916, 6346, 6788, 7241, 7705, 8179, 8663, 9156, 9657, 10167, 10684, 11207, 11736, 12271, 12810, 13353, 13899, 14447, 14997, 15547, 16098, 16648, 17197, 17744, 18287, 18827, 19363, 19893, 20418, 20936, 21447, 21950, 22445, 22931, 23407, 23874, 24330, 24774, 25208, 25629, 26039, 26435, 26819, 27190, 27548, 27893, 28224, 28541, 28845, 29135, 29411, 29674, 29924, 30160, 30384, 30594, 30792, 30977, 31151, 31313, 31463, 31602, 31731, 31849, 31958, 32057, 32148, 32229, 32303, 32370, 32429, 32481, 32528, 32568, 32604, 32634, 32661, 32683, 32701, 32717, 32729, 32740, 32748, 32754, 32758, 32762, 32764, 32766, 32767, 32767, 32767, 32767, 32767, 32767, }; #endif #ifndef DEF_LOGN400 #define DEF_LOGN400 static const opus_int16 logN400[21] = { 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 16, 16, 16, 21, 21, 24, 29, 34, 36, }; #endif #ifndef DEF_PULSE_CACHE50 #define DEF_PULSE_CACHE50 static const opus_int16 cache_index50[105] = { -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 41, 41, 41, 82, 82, 123, 164, 200, 222, 0, 0, 0, 0, 0, 0, 0, 0, 41, 41, 41, 41, 123, 123, 123, 164, 164, 240, 266, 283, 295, 41, 41, 41, 41, 41, 41, 41, 41, 123, 123, 123, 123, 240, 240, 240, 266, 266, 305, 318, 328, 336, 123, 123, 123, 123, 123, 123, 123, 123, 240, 240, 240, 240, 305, 305, 305, 318, 318, 343, 351, 358, 364, 240, 240, 240, 240, 240, 240, 240, 240, 305, 305, 305, 305, 343, 343, 343, 351, 351, 370, 376, 382, 387, }; static const unsigned char cache_bits50[392] = { 40, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 40, 15, 23, 28, 31, 34, 36, 38, 39, 41, 42, 43, 44, 45, 46, 47, 47, 49, 50, 51, 52, 53, 54, 55, 55, 57, 58, 59, 60, 61, 62, 63, 63, 65, 66, 67, 68, 69, 70, 71, 71, 40, 20, 33, 41, 48, 53, 57, 61, 64, 66, 69, 71, 73, 75, 76, 78, 80, 82, 85, 87, 89, 91, 92, 94, 96, 98, 101, 103, 105, 107, 108, 110, 112, 114, 117, 119, 121, 123, 124, 126, 128, 40, 23, 39, 51, 60, 67, 73, 79, 83, 87, 91, 94, 97, 100, 102, 105, 107, 111, 115, 118, 121, 124, 126, 129, 131, 135, 139, 142, 145, 148, 150, 153, 155, 159, 163, 166, 169, 172, 174, 177, 179, 35, 28, 49, 65, 78, 89, 99, 107, 114, 120, 126, 132, 136, 141, 145, 149, 153, 159, 165, 171, 176, 180, 185, 189, 192, 199, 205, 211, 216, 220, 225, 229, 232, 239, 245, 251, 21, 33, 58, 79, 97, 112, 125, 137, 148, 157, 166, 174, 182, 189, 195, 201, 207, 217, 227, 235, 243, 251, 17, 35, 63, 86, 106, 123, 139, 152, 165, 177, 187, 197, 206, 214, 222, 230, 237, 250, 25, 31, 55, 75, 91, 105, 117, 128, 138, 146, 154, 161, 168, 174, 180, 185, 190, 200, 208, 215, 222, 229, 235, 240, 245, 255, 16, 36, 65, 89, 110, 128, 144, 159, 173, 185, 196, 207, 217, 226, 234, 242, 250, 11, 41, 74, 103, 128, 151, 172, 191, 209, 225, 241, 255, 9, 43, 79, 110, 138, 163, 186, 207, 227, 246, 12, 39, 71, 99, 123, 144, 164, 182, 198, 214, 228, 241, 253, 9, 44, 81, 113, 142, 168, 192, 214, 235, 255, 7, 49, 90, 127, 160, 191, 220, 247, 6, 51, 95, 134, 170, 203, 234, 7, 47, 87, 123, 155, 184, 212, 237, 6, 52, 97, 137, 174, 208, 240, 5, 57, 106, 151, 192, 231, 5, 59, 111, 158, 202, 243, 5, 55, 103, 147, 187, 224, 5, 60, 113, 161, 206, 248, 4, 65, 122, 175, 224, 4, 67, 127, 182, 234, }; static const unsigned char cache_caps50[168] = { 224, 224, 224, 224, 224, 224, 224, 224, 160, 160, 160, 160, 185, 185, 185, 178, 178, 168, 134, 61, 37, 224, 224, 224, 224, 224, 224, 224, 224, 240, 240, 240, 240, 207, 207, 207, 198, 198, 183, 144, 66, 40, 160, 160, 160, 160, 160, 160, 160, 160, 185, 185, 185, 185, 193, 193, 193, 183, 183, 172, 138, 64, 38, 240, 240, 240, 240, 240, 240, 240, 240, 207, 207, 207, 207, 204, 204, 204, 193, 193, 180, 143, 66, 40, 185, 185, 185, 185, 185, 185, 185, 185, 193, 193, 193, 193, 193, 193, 193, 183, 183, 172, 138, 65, 39, 207, 207, 207, 207, 207, 207, 207, 207, 204, 204, 204, 204, 201, 201, 201, 188, 188, 176, 141, 66, 40, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 194, 194, 194, 184, 184, 173, 139, 65, 39, 204, 204, 204, 204, 204, 204, 204, 204, 201, 201, 201, 201, 198, 198, 198, 187, 187, 175, 140, 66, 40, }; #endif #ifndef FFT_TWIDDLES48000_960 #define FFT_TWIDDLES48000_960 static const kiss_twiddle_cpx fft_twiddles48000_960[480] = { {32767, 0}, {32766, -429}, {32757, -858}, {32743, -1287}, {32724, -1715}, {32698, -2143}, {32667, -2570}, {32631, -2998}, {32588, -3425}, {32541, -3851}, {32488, -4277}, {32429, -4701}, {32364, -5125}, {32295, -5548}, {32219, -5971}, {32138, -6393}, {32051, -6813}, {31960, -7231}, {31863, -7650}, {31760, -8067}, {31652, -8481}, {31539, -8895}, {31419, -9306}, {31294, -9716}, {31165, -10126}, {31030, -10532}, {30889, -10937}, {30743, -11340}, {30592, -11741}, {30436, -12141}, {30274, -12540}, {30107, -12935}, {29936, -13328}, {29758, -13718}, {29577, -14107}, {29390, -14493}, {29197, -14875}, {29000, -15257}, {28797, -15635}, {28590, -16010}, {28379, -16384}, {28162, -16753}, {27940, -17119}, {27714, -17484}, {27482, -17845}, {27246, -18205}, {27006, -18560}, {26760, -18911}, {26510, -19260}, {26257, -19606}, {25997, -19947}, {25734, -20286}, {25466, -20621}, {25194, -20952}, {24918, -21281}, {24637, -21605}, {24353, -21926}, {24063, -22242}, {23770, -22555}, {23473, -22865}, {23171, -23171}, {22866, -23472}, {22557, -23769}, {22244, -24063}, {21927, -24352}, {21606, -24636}, {21282, -24917}, {20954, -25194}, {20622, -25465}, {20288, -25733}, {19949, -25997}, {19607, -26255}, {19261, -26509}, {18914, -26760}, {18561, -27004}, {18205, -27246}, {17846, -27481}, {17485, -27713}, {17122, -27940}, {16755, -28162}, {16385, -28378}, {16012, -28590}, {15636, -28797}, {15258, -28999}, {14878, -29197}, {14494, -29389}, {14108, -29576}, {13720, -29757}, {13329, -29934}, {12937, -30107}, {12540, -30274}, {12142, -30435}, {11744, -30592}, {11342, -30743}, {10939, -30889}, {10534, -31030}, {10127, -31164}, {9718, -31294}, {9307, -31418}, {8895, -31537}, {8482, -31652}, {8067, -31759}, {7650, -31862}, {7233, -31960}, {6815, -32051}, {6393, -32138}, {5973, -32219}, {5549, -32294}, {5127, -32364}, {4703, -32429}, {4278, -32487}, {3852, -32541}, {3426, -32588}, {2999, -32630}, {2572, -32667}, {2144, -32698}, {1716, -32724}, {1287, -32742}, {860, -32757}, {430, -32766}, {0, -32767}, {-429, -32766}, {-858, -32757}, {-1287, -32743}, {-1715, -32724}, {-2143, -32698}, {-2570, -32667}, {-2998, -32631}, {-3425, -32588}, {-3851, -32541}, {-4277, -32488}, {-4701, -32429}, {-5125, -32364}, {-5548, -32295}, {-5971, -32219}, {-6393, -32138}, {-6813, -32051}, {-7231, -31960}, {-7650, -31863}, {-8067, -31760}, {-8481, -31652}, {-8895, -31539}, {-9306, -31419}, {-9716, -31294}, {-10126, -31165}, {-10532, -31030}, {-10937, -30889}, {-11340, -30743}, {-11741, -30592}, {-12141, -30436}, {-12540, -30274}, {-12935, -30107}, {-13328, -29936}, {-13718, -29758}, {-14107, -29577}, {-14493, -29390}, {-14875, -29197}, {-15257, -29000}, {-15635, -28797}, {-16010, -28590}, {-16384, -28379}, {-16753, -28162}, {-17119, -27940}, {-17484, -27714}, {-17845, -27482}, {-18205, -27246}, {-18560, -27006}, {-18911, -26760}, {-19260, -26510}, {-19606, -26257}, {-19947, -25997}, {-20286, -25734}, {-20621, -25466}, {-20952, -25194}, {-21281, -24918}, {-21605, -24637}, {-21926, -24353}, {-22242, -24063}, {-22555, -23770}, {-22865, -23473}, {-23171, -23171}, {-23472, -22866}, {-23769, -22557}, {-24063, -22244}, {-24352, -21927}, {-24636, -21606}, {-24917, -21282}, {-25194, -20954}, {-25465, -20622}, {-25733, -20288}, {-25997, -19949}, {-26255, -19607}, {-26509, -19261}, {-26760, -18914}, {-27004, -18561}, {-27246, -18205}, {-27481, -17846}, {-27713, -17485}, {-27940, -17122}, {-28162, -16755}, {-28378, -16385}, {-28590, -16012}, {-28797, -15636}, {-28999, -15258}, {-29197, -14878}, {-29389, -14494}, {-29576, -14108}, {-29757, -13720}, {-29934, -13329}, {-30107, -12937}, {-30274, -12540}, {-30435, -12142}, {-30592, -11744}, {-30743, -11342}, {-30889, -10939}, {-31030, -10534}, {-31164, -10127}, {-31294, -9718}, {-31418, -9307}, {-31537, -8895}, {-31652, -8482}, {-31759, -8067}, {-31862, -7650}, {-31960, -7233}, {-32051, -6815}, {-32138, -6393}, {-32219, -5973}, {-32294, -5549}, {-32364, -5127}, {-32429, -4703}, {-32487, -4278}, {-32541, -3852}, {-32588, -3426}, {-32630, -2999}, {-32667, -2572}, {-32698, -2144}, {-32724, -1716}, {-32742, -1287}, {-32757, -860}, {-32766, -430}, {-32767, 0}, {-32766, 429}, {-32757, 858}, {-32743, 1287}, {-32724, 1715}, {-32698, 2143}, {-32667, 2570}, {-32631, 2998}, {-32588, 3425}, {-32541, 3851}, {-32488, 4277}, {-32429, 4701}, {-32364, 5125}, {-32295, 5548}, {-32219, 5971}, {-32138, 6393}, {-32051, 6813}, {-31960, 7231}, {-31863, 7650}, {-31760, 8067}, {-31652, 8481}, {-31539, 8895}, {-31419, 9306}, {-31294, 9716}, {-31165, 10126}, {-31030, 10532}, {-30889, 10937}, {-30743, 11340}, {-30592, 11741}, {-30436, 12141}, {-30274, 12540}, {-30107, 12935}, {-29936, 13328}, {-29758, 13718}, {-29577, 14107}, {-29390, 14493}, {-29197, 14875}, {-29000, 15257}, {-28797, 15635}, {-28590, 16010}, {-28379, 16384}, {-28162, 16753}, {-27940, 17119}, {-27714, 17484}, {-27482, 17845}, {-27246, 18205}, {-27006, 18560}, {-26760, 18911}, {-26510, 19260}, {-26257, 19606}, {-25997, 19947}, {-25734, 20286}, {-25466, 20621}, {-25194, 20952}, {-24918, 21281}, {-24637, 21605}, {-24353, 21926}, {-24063, 22242}, {-23770, 22555}, {-23473, 22865}, {-23171, 23171}, {-22866, 23472}, {-22557, 23769}, {-22244, 24063}, {-21927, 24352}, {-21606, 24636}, {-21282, 24917}, {-20954, 25194}, {-20622, 25465}, {-20288, 25733}, {-19949, 25997}, {-19607, 26255}, {-19261, 26509}, {-18914, 26760}, {-18561, 27004}, {-18205, 27246}, {-17846, 27481}, {-17485, 27713}, {-17122, 27940}, {-16755, 28162}, {-16385, 28378}, {-16012, 28590}, {-15636, 28797}, {-15258, 28999}, {-14878, 29197}, {-14494, 29389}, {-14108, 29576}, {-13720, 29757}, {-13329, 29934}, {-12937, 30107}, {-12540, 30274}, {-12142, 30435}, {-11744, 30592}, {-11342, 30743}, {-10939, 30889}, {-10534, 31030}, {-10127, 31164}, {-9718, 31294}, {-9307, 31418}, {-8895, 31537}, {-8482, 31652}, {-8067, 31759}, {-7650, 31862}, {-7233, 31960}, {-6815, 32051}, {-6393, 32138}, {-5973, 32219}, {-5549, 32294}, {-5127, 32364}, {-4703, 32429}, {-4278, 32487}, {-3852, 32541}, {-3426, 32588}, {-2999, 32630}, {-2572, 32667}, {-2144, 32698}, {-1716, 32724}, {-1287, 32742}, {-860, 32757}, {-430, 32766}, {0, 32767}, {429, 32766}, {858, 32757}, {1287, 32743}, {1715, 32724}, {2143, 32698}, {2570, 32667}, {2998, 32631}, {3425, 32588}, {3851, 32541}, {4277, 32488}, {4701, 32429}, {5125, 32364}, {5548, 32295}, {5971, 32219}, {6393, 32138}, {6813, 32051}, {7231, 31960}, {7650, 31863}, {8067, 31760}, {8481, 31652}, {8895, 31539}, {9306, 31419}, {9716, 31294}, {10126, 31165}, {10532, 31030}, {10937, 30889}, {11340, 30743}, {11741, 30592}, {12141, 30436}, {12540, 30274}, {12935, 30107}, {13328, 29936}, {13718, 29758}, {14107, 29577}, {14493, 29390}, {14875, 29197}, {15257, 29000}, {15635, 28797}, {16010, 28590}, {16384, 28379}, {16753, 28162}, {17119, 27940}, {17484, 27714}, {17845, 27482}, {18205, 27246}, {18560, 27006}, {18911, 26760}, {19260, 26510}, {19606, 26257}, {19947, 25997}, {20286, 25734}, {20621, 25466}, {20952, 25194}, {21281, 24918}, {21605, 24637}, {21926, 24353}, {22242, 24063}, {22555, 23770}, {22865, 23473}, {23171, 23171}, {23472, 22866}, {23769, 22557}, {24063, 22244}, {24352, 21927}, {24636, 21606}, {24917, 21282}, {25194, 20954}, {25465, 20622}, {25733, 20288}, {25997, 19949}, {26255, 19607}, {26509, 19261}, {26760, 18914}, {27004, 18561}, {27246, 18205}, {27481, 17846}, {27713, 17485}, {27940, 17122}, {28162, 16755}, {28378, 16385}, {28590, 16012}, {28797, 15636}, {28999, 15258}, {29197, 14878}, {29389, 14494}, {29576, 14108}, {29757, 13720}, {29934, 13329}, {30107, 12937}, {30274, 12540}, {30435, 12142}, {30592, 11744}, {30743, 11342}, {30889, 10939}, {31030, 10534}, {31164, 10127}, {31294, 9718}, {31418, 9307}, {31537, 8895}, {31652, 8482}, {31759, 8067}, {31862, 7650}, {31960, 7233}, {32051, 6815}, {32138, 6393}, {32219, 5973}, {32294, 5549}, {32364, 5127}, {32429, 4703}, {32487, 4278}, {32541, 3852}, {32588, 3426}, {32630, 2999}, {32667, 2572}, {32698, 2144}, {32724, 1716}, {32742, 1287}, {32757, 860}, {32766, 430}, }; #ifndef FFT_BITREV480 #define FFT_BITREV480 static const opus_int16 fft_bitrev480[480] = { 0, 96, 192, 288, 384, 32, 128, 224, 320, 416, 64, 160, 256, 352, 448, 8, 104, 200, 296, 392, 40, 136, 232, 328, 424, 72, 168, 264, 360, 456, 16, 112, 208, 304, 400, 48, 144, 240, 336, 432, 80, 176, 272, 368, 464, 24, 120, 216, 312, 408, 56, 152, 248, 344, 440, 88, 184, 280, 376, 472, 4, 100, 196, 292, 388, 36, 132, 228, 324, 420, 68, 164, 260, 356, 452, 12, 108, 204, 300, 396, 44, 140, 236, 332, 428, 76, 172, 268, 364, 460, 20, 116, 212, 308, 404, 52, 148, 244, 340, 436, 84, 180, 276, 372, 468, 28, 124, 220, 316, 412, 60, 156, 252, 348, 444, 92, 188, 284, 380, 476, 1, 97, 193, 289, 385, 33, 129, 225, 321, 417, 65, 161, 257, 353, 449, 9, 105, 201, 297, 393, 41, 137, 233, 329, 425, 73, 169, 265, 361, 457, 17, 113, 209, 305, 401, 49, 145, 241, 337, 433, 81, 177, 273, 369, 465, 25, 121, 217, 313, 409, 57, 153, 249, 345, 441, 89, 185, 281, 377, 473, 5, 101, 197, 293, 389, 37, 133, 229, 325, 421, 69, 165, 261, 357, 453, 13, 109, 205, 301, 397, 45, 141, 237, 333, 429, 77, 173, 269, 365, 461, 21, 117, 213, 309, 405, 53, 149, 245, 341, 437, 85, 181, 277, 373, 469, 29, 125, 221, 317, 413, 61, 157, 253, 349, 445, 93, 189, 285, 381, 477, 2, 98, 194, 290, 386, 34, 130, 226, 322, 418, 66, 162, 258, 354, 450, 10, 106, 202, 298, 394, 42, 138, 234, 330, 426, 74, 170, 266, 362, 458, 18, 114, 210, 306, 402, 50, 146, 242, 338, 434, 82, 178, 274, 370, 466, 26, 122, 218, 314, 410, 58, 154, 250, 346, 442, 90, 186, 282, 378, 474, 6, 102, 198, 294, 390, 38, 134, 230, 326, 422, 70, 166, 262, 358, 454, 14, 110, 206, 302, 398, 46, 142, 238, 334, 430, 78, 174, 270, 366, 462, 22, 118, 214, 310, 406, 54, 150, 246, 342, 438, 86, 182, 278, 374, 470, 30, 126, 222, 318, 414, 62, 158, 254, 350, 446, 94, 190, 286, 382, 478, 3, 99, 195, 291, 387, 35, 131, 227, 323, 419, 67, 163, 259, 355, 451, 11, 107, 203, 299, 395, 43, 139, 235, 331, 427, 75, 171, 267, 363, 459, 19, 115, 211, 307, 403, 51, 147, 243, 339, 435, 83, 179, 275, 371, 467, 27, 123, 219, 315, 411, 59, 155, 251, 347, 443, 91, 187, 283, 379, 475, 7, 103, 199, 295, 391, 39, 135, 231, 327, 423, 71, 167, 263, 359, 455, 15, 111, 207, 303, 399, 47, 143, 239, 335, 431, 79, 175, 271, 367, 463, 23, 119, 215, 311, 407, 55, 151, 247, 343, 439, 87, 183, 279, 375, 471, 31, 127, 223, 319, 415, 63, 159, 255, 351, 447, 95, 191, 287, 383, 479, }; #endif #ifndef FFT_BITREV240 #define FFT_BITREV240 static const opus_int16 fft_bitrev240[240] = { 0, 48, 96, 144, 192, 16, 64, 112, 160, 208, 32, 80, 128, 176, 224, 4, 52, 100, 148, 196, 20, 68, 116, 164, 212, 36, 84, 132, 180, 228, 8, 56, 104, 152, 200, 24, 72, 120, 168, 216, 40, 88, 136, 184, 232, 12, 60, 108, 156, 204, 28, 76, 124, 172, 220, 44, 92, 140, 188, 236, 1, 49, 97, 145, 193, 17, 65, 113, 161, 209, 33, 81, 129, 177, 225, 5, 53, 101, 149, 197, 21, 69, 117, 165, 213, 37, 85, 133, 181, 229, 9, 57, 105, 153, 201, 25, 73, 121, 169, 217, 41, 89, 137, 185, 233, 13, 61, 109, 157, 205, 29, 77, 125, 173, 221, 45, 93, 141, 189, 237, 2, 50, 98, 146, 194, 18, 66, 114, 162, 210, 34, 82, 130, 178, 226, 6, 54, 102, 150, 198, 22, 70, 118, 166, 214, 38, 86, 134, 182, 230, 10, 58, 106, 154, 202, 26, 74, 122, 170, 218, 42, 90, 138, 186, 234, 14, 62, 110, 158, 206, 30, 78, 126, 174, 222, 46, 94, 142, 190, 238, 3, 51, 99, 147, 195, 19, 67, 115, 163, 211, 35, 83, 131, 179, 227, 7, 55, 103, 151, 199, 23, 71, 119, 167, 215, 39, 87, 135, 183, 231, 11, 59, 107, 155, 203, 27, 75, 123, 171, 219, 43, 91, 139, 187, 235, 15, 63, 111, 159, 207, 31, 79, 127, 175, 223, 47, 95, 143, 191, 239, }; #endif #ifndef FFT_BITREV120 #define FFT_BITREV120 static const opus_int16 fft_bitrev120[120] = { 0, 24, 48, 72, 96, 8, 32, 56, 80, 104, 16, 40, 64, 88, 112, 4, 28, 52, 76, 100, 12, 36, 60, 84, 108, 20, 44, 68, 92, 116, 1, 25, 49, 73, 97, 9, 33, 57, 81, 105, 17, 41, 65, 89, 113, 5, 29, 53, 77, 101, 13, 37, 61, 85, 109, 21, 45, 69, 93, 117, 2, 26, 50, 74, 98, 10, 34, 58, 82, 106, 18, 42, 66, 90, 114, 6, 30, 54, 78, 102, 14, 38, 62, 86, 110, 22, 46, 70, 94, 118, 3, 27, 51, 75, 99, 11, 35, 59, 83, 107, 19, 43, 67, 91, 115, 7, 31, 55, 79, 103, 15, 39, 63, 87, 111, 23, 47, 71, 95, 119, }; #endif #ifndef FFT_BITREV60 #define FFT_BITREV60 static const opus_int16 fft_bitrev60[60] = { 0, 12, 24, 36, 48, 4, 16, 28, 40, 52, 8, 20, 32, 44, 56, 1, 13, 25, 37, 49, 5, 17, 29, 41, 53, 9, 21, 33, 45, 57, 2, 14, 26, 38, 50, 6, 18, 30, 42, 54, 10, 22, 34, 46, 58, 3, 15, 27, 39, 51, 7, 19, 31, 43, 55, 11, 23, 35, 47, 59, }; #endif #ifndef FFT_STATE48000_960_0 #define FFT_STATE48000_960_0 static const kiss_fft_state fft_state48000_960_0 = { 480, /* nfft */ 17476, /* scale */ 8, /* scale_shift */ -1, /* shift */ {5, 96, 3, 32, 4, 8, 2, 4, 4, 1, 0, 0, 0, 0, 0, 0, }, /* factors */ fft_bitrev480, /* bitrev */ fft_twiddles48000_960, /* bitrev */ #ifdef OVERRIDE_FFT (arch_fft_state *)&cfg_arch_480, #else NULL, #endif }; #endif #ifndef FFT_STATE48000_960_1 #define FFT_STATE48000_960_1 static const kiss_fft_state fft_state48000_960_1 = { 240, /* nfft */ 17476, /* scale */ 7, /* scale_shift */ 1, /* shift */ {5, 48, 3, 16, 4, 4, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */ fft_bitrev240, /* bitrev */ fft_twiddles48000_960, /* bitrev */ #ifdef OVERRIDE_FFT (arch_fft_state *)&cfg_arch_240, #else NULL, #endif }; #endif #ifndef FFT_STATE48000_960_2 #define FFT_STATE48000_960_2 static const kiss_fft_state fft_state48000_960_2 = { 120, /* nfft */ 17476, /* scale */ 6, /* scale_shift */ 2, /* shift */ {5, 24, 3, 8, 2, 4, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */ fft_bitrev120, /* bitrev */ fft_twiddles48000_960, /* bitrev */ #ifdef OVERRIDE_FFT (arch_fft_state *)&cfg_arch_120, #else NULL, #endif }; #endif #ifndef FFT_STATE48000_960_3 #define FFT_STATE48000_960_3 static const kiss_fft_state fft_state48000_960_3 = { 60, /* nfft */ 17476, /* scale */ 5, /* scale_shift */ 3, /* shift */ {5, 12, 3, 4, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */ fft_bitrev60, /* bitrev */ fft_twiddles48000_960, /* bitrev */ #ifdef OVERRIDE_FFT (arch_fft_state *)&cfg_arch_60, #else NULL, #endif }; #endif #endif #ifndef MDCT_TWIDDLES960 #define MDCT_TWIDDLES960 static const opus_val16 mdct_twiddles960[1800] = { 32767, 32767, 32767, 32766, 32765, 32763, 32761, 32759, 32756, 32753, 32750, 32746, 32742, 32738, 32733, 32728, 32722, 32717, 32710, 32704, 32697, 32690, 32682, 32674, 32666, 32657, 32648, 32639, 32629, 32619, 32609, 32598, 32587, 32576, 32564, 32552, 32539, 32526, 32513, 32500, 32486, 32472, 32457, 32442, 32427, 32411, 32395, 32379, 32362, 32345, 32328, 32310, 32292, 32274, 32255, 32236, 32217, 32197, 32177, 32157, 32136, 32115, 32093, 32071, 32049, 32027, 32004, 31981, 31957, 31933, 31909, 31884, 31859, 31834, 31809, 31783, 31756, 31730, 31703, 31676, 31648, 31620, 31592, 31563, 31534, 31505, 31475, 31445, 31415, 31384, 31353, 31322, 31290, 31258, 31226, 31193, 31160, 31127, 31093, 31059, 31025, 30990, 30955, 30920, 30884, 30848, 30812, 30775, 30738, 30701, 30663, 30625, 30587, 30548, 30509, 30470, 30430, 30390, 30350, 30309, 30269, 30227, 30186, 30144, 30102, 30059, 30016, 29973, 29930, 29886, 29842, 29797, 29752, 29707, 29662, 29616, 29570, 29524, 29477, 29430, 29383, 29335, 29287, 29239, 29190, 29142, 29092, 29043, 28993, 28943, 28892, 28842, 28791, 28739, 28688, 28636, 28583, 28531, 28478, 28425, 28371, 28317, 28263, 28209, 28154, 28099, 28044, 27988, 27932, 27876, 27820, 27763, 27706, 27648, 27591, 27533, 27474, 27416, 27357, 27298, 27238, 27178, 27118, 27058, 26997, 26936, 26875, 26814, 26752, 26690, 26628, 26565, 26502, 26439, 26375, 26312, 26247, 26183, 26119, 26054, 25988, 25923, 25857, 25791, 25725, 25658, 25592, 25524, 25457, 25389, 25322, 25253, 25185, 25116, 25047, 24978, 24908, 24838, 24768, 24698, 24627, 24557, 24485, 24414, 24342, 24270, 24198, 24126, 24053, 23980, 23907, 23834, 23760, 23686, 23612, 23537, 23462, 23387, 23312, 23237, 23161, 23085, 23009, 22932, 22856, 22779, 22701, 22624, 22546, 22468, 22390, 22312, 22233, 22154, 22075, 21996, 21916, 21836, 21756, 21676, 21595, 21515, 21434, 21352, 21271, 21189, 21107, 21025, 20943, 20860, 20777, 20694, 20611, 20528, 20444, 20360, 20276, 20192, 20107, 20022, 19937, 19852, 19767, 19681, 19595, 19509, 19423, 19336, 19250, 19163, 19076, 18988, 18901, 18813, 18725, 18637, 18549, 18460, 18372, 18283, 18194, 18104, 18015, 17925, 17835, 17745, 17655, 17565, 17474, 17383, 17292, 17201, 17110, 17018, 16927, 16835, 16743, 16650, 16558, 16465, 16372, 16279, 16186, 16093, 15999, 15906, 15812, 15718, 15624, 15529, 15435, 15340, 15245, 15150, 15055, 14960, 14864, 14769, 14673, 14577, 14481, 14385, 14288, 14192, 14095, 13998, 13901, 13804, 13706, 13609, 13511, 13414, 13316, 13218, 13119, 13021, 12923, 12824, 12725, 12626, 12527, 12428, 12329, 12230, 12130, 12030, 11930, 11831, 11730, 11630, 11530, 11430, 11329, 11228, 11128, 11027, 10926, 10824, 10723, 10622, 10520, 10419, 10317, 10215, 10113, 10011, 9909, 9807, 9704, 9602, 9499, 9397, 9294, 9191, 9088, 8985, 8882, 8778, 8675, 8572, 8468, 8364, 8261, 8157, 8053, 7949, 7845, 7741, 7637, 7532, 7428, 7323, 7219, 7114, 7009, 6905, 6800, 6695, 6590, 6485, 6380, 6274, 6169, 6064, 5958, 5853, 5747, 5642, 5536, 5430, 5325, 5219, 5113, 5007, 4901, 4795, 4689, 4583, 4476, 4370, 4264, 4157, 4051, 3945, 3838, 3732, 3625, 3518, 3412, 3305, 3198, 3092, 2985, 2878, 2771, 2664, 2558, 2451, 2344, 2237, 2130, 2023, 1916, 1809, 1702, 1594, 1487, 1380, 1273, 1166, 1059, 952, 844, 737, 630, 523, 416, 308, 201, 94, -13, -121, -228, -335, -442, -550, -657, -764, -871, -978, -1086, -1193, -1300, -1407, -1514, -1621, -1728, -1835, -1942, -2049, -2157, -2263, -2370, -2477, -2584, -2691, -2798, -2905, -3012, -3118, -3225, -3332, -3439, -3545, -3652, -3758, -3865, -3971, -4078, -4184, -4290, -4397, -4503, -4609, -4715, -4821, -4927, -5033, -5139, -5245, -5351, -5457, -5562, -5668, -5774, -5879, -5985, -6090, -6195, -6301, -6406, -6511, -6616, -6721, -6826, -6931, -7036, -7140, -7245, -7349, -7454, -7558, -7663, -7767, -7871, -7975, -8079, -8183, -8287, -8390, -8494, -8597, -8701, -8804, -8907, -9011, -9114, -9217, -9319, -9422, -9525, -9627, -9730, -9832, -9934, -10037, -10139, -10241, -10342, -10444, -10546, -10647, -10748, -10850, -10951, -11052, -11153, -11253, -11354, -11455, -11555, -11655, -11756, -11856, -11955, -12055, -12155, -12254, -12354, -12453, -12552, -12651, -12750, -12849, -12947, -13046, -13144, -13242, -13340, -13438, -13536, -13633, -13731, -13828, -13925, -14022, -14119, -14216, -14312, -14409, -14505, -14601, -14697, -14793, -14888, -14984, -15079, -15174, -15269, -15364, -15459, -15553, -15647, -15741, -15835, -15929, -16023, -16116, -16210, -16303, -16396, -16488, -16581, -16673, -16766, -16858, -16949, -17041, -17133, -17224, -17315, -17406, -17497, -17587, -17678, -17768, -17858, -17948, -18037, -18127, -18216, -18305, -18394, -18483, -18571, -18659, -18747, -18835, -18923, -19010, -19098, -19185, -19271, -19358, -19444, -19531, -19617, -19702, -19788, -19873, -19959, -20043, -20128, -20213, -20297, -20381, -20465, -20549, -20632, -20715, -20798, -20881, -20963, -21046, -21128, -21210, -21291, -21373, -21454, -21535, -21616, -21696, -21776, -21856, -21936, -22016, -22095, -22174, -22253, -22331, -22410, -22488, -22566, -22643, -22721, -22798, -22875, -22951, -23028, -23104, -23180, -23256, -23331, -23406, -23481, -23556, -23630, -23704, -23778, -23852, -23925, -23998, -24071, -24144, -24216, -24288, -24360, -24432, -24503, -24574, -24645, -24716, -24786, -24856, -24926, -24995, -25064, -25133, -25202, -25270, -25339, -25406, -25474, -25541, -25608, -25675, -25742, -25808, -25874, -25939, -26005, -26070, -26135, -26199, -26264, -26327, -26391, -26455, -26518, -26581, -26643, -26705, -26767, -26829, -26891, -26952, -27013, -27073, -27133, -27193, -27253, -27312, -27372, -27430, -27489, -27547, -27605, -27663, -27720, -27777, -27834, -27890, -27946, -28002, -28058, -28113, -28168, -28223, -28277, -28331, -28385, -28438, -28491, -28544, -28596, -28649, -28701, -28752, -28803, -28854, -28905, -28955, -29006, -29055, -29105, -29154, -29203, -29251, -29299, -29347, -29395, -29442, -29489, -29535, -29582, -29628, -29673, -29719, -29764, -29808, -29853, -29897, -29941, -29984, -30027, -30070, -30112, -30154, -30196, -30238, -30279, -30320, -30360, -30400, -30440, -30480, -30519, -30558, -30596, -30635, -30672, -30710, -30747, -30784, -30821, -30857, -30893, -30929, -30964, -30999, -31033, -31068, -31102, -31135, -31168, -31201, -31234, -31266, -31298, -31330, -31361, -31392, -31422, -31453, -31483, -31512, -31541, -31570, -31599, -31627, -31655, -31682, -31710, -31737, -31763, -31789, -31815, -31841, -31866, -31891, -31915, -31939, -31963, -31986, -32010, -32032, -32055, -32077, -32099, -32120, -32141, -32162, -32182, -32202, -32222, -32241, -32260, -32279, -32297, -32315, -32333, -32350, -32367, -32383, -32399, -32415, -32431, -32446, -32461, -32475, -32489, -32503, -32517, -32530, -32542, -32555, -32567, -32579, -32590, -32601, -32612, -32622, -32632, -32641, -32651, -32659, -32668, -32676, -32684, -32692, -32699, -32706, -32712, -32718, -32724, -32729, -32734, -32739, -32743, -32747, -32751, -32754, -32757, -32760, -32762, -32764, -32765, -32767, -32767, -32767, 32767, 32767, 32765, 32761, 32756, 32750, 32742, 32732, 32722, 32710, 32696, 32681, 32665, 32647, 32628, 32608, 32586, 32562, 32538, 32512, 32484, 32455, 32425, 32393, 32360, 32326, 32290, 32253, 32214, 32174, 32133, 32090, 32046, 32001, 31954, 31906, 31856, 31805, 31753, 31700, 31645, 31588, 31530, 31471, 31411, 31349, 31286, 31222, 31156, 31089, 31020, 30951, 30880, 30807, 30733, 30658, 30582, 30504, 30425, 30345, 30263, 30181, 30096, 30011, 29924, 29836, 29747, 29656, 29564, 29471, 29377, 29281, 29184, 29086, 28987, 28886, 28784, 28681, 28577, 28471, 28365, 28257, 28147, 28037, 27925, 27812, 27698, 27583, 27467, 27349, 27231, 27111, 26990, 26868, 26744, 26620, 26494, 26367, 26239, 26110, 25980, 25849, 25717, 25583, 25449, 25313, 25176, 25038, 24900, 24760, 24619, 24477, 24333, 24189, 24044, 23898, 23751, 23602, 23453, 23303, 23152, 22999, 22846, 22692, 22537, 22380, 22223, 22065, 21906, 21746, 21585, 21423, 21261, 21097, 20933, 20767, 20601, 20434, 20265, 20096, 19927, 19756, 19584, 19412, 19239, 19065, 18890, 18714, 18538, 18361, 18183, 18004, 17824, 17644, 17463, 17281, 17098, 16915, 16731, 16546, 16361, 16175, 15988, 15800, 15612, 15423, 15234, 15043, 14852, 14661, 14469, 14276, 14083, 13889, 13694, 13499, 13303, 13107, 12910, 12713, 12515, 12317, 12118, 11918, 11718, 11517, 11316, 11115, 10913, 10710, 10508, 10304, 10100, 9896, 9691, 9486, 9281, 9075, 8869, 8662, 8455, 8248, 8040, 7832, 7623, 7415, 7206, 6996, 6787, 6577, 6366, 6156, 5945, 5734, 5523, 5311, 5100, 4888, 4675, 4463, 4251, 4038, 3825, 3612, 3399, 3185, 2972, 2758, 2544, 2330, 2116, 1902, 1688, 1474, 1260, 1045, 831, 617, 402, 188, -27, -241, -456, -670, -885, -1099, -1313, -1528, -1742, -1956, -2170, -2384, -2598, -2811, -3025, -3239, -3452, -3665, -3878, -4091, -4304, -4516, -4728, -4941, -5153, -5364, -5576, -5787, -5998, -6209, -6419, -6629, -6839, -7049, -7258, -7467, -7676, -7884, -8092, -8300, -8507, -8714, -8920, -9127, -9332, -9538, -9743, -9947, -10151, -10355, -10558, -10761, -10963, -11165, -11367, -11568, -11768, -11968, -12167, -12366, -12565, -12762, -12960, -13156, -13352, -13548, -13743, -13937, -14131, -14324, -14517, -14709, -14900, -15091, -15281, -15470, -15659, -15847, -16035, -16221, -16407, -16593, -16777, -16961, -17144, -17326, -17508, -17689, -17869, -18049, -18227, -18405, -18582, -18758, -18934, -19108, -19282, -19455, -19627, -19799, -19969, -20139, -20308, -20475, -20642, -20809, -20974, -21138, -21301, -21464, -21626, -21786, -21946, -22105, -22263, -22420, -22575, -22730, -22884, -23037, -23189, -23340, -23490, -23640, -23788, -23935, -24080, -24225, -24369, -24512, -24654, -24795, -24934, -25073, -25211, -25347, -25482, -25617, -25750, -25882, -26013, -26143, -26272, -26399, -26526, -26651, -26775, -26898, -27020, -27141, -27260, -27379, -27496, -27612, -27727, -27841, -27953, -28065, -28175, -28284, -28391, -28498, -28603, -28707, -28810, -28911, -29012, -29111, -29209, -29305, -29401, -29495, -29587, -29679, -29769, -29858, -29946, -30032, -30118, -30201, -30284, -30365, -30445, -30524, -30601, -30677, -30752, -30825, -30897, -30968, -31038, -31106, -31172, -31238, -31302, -31365, -31426, -31486, -31545, -31602, -31658, -31713, -31766, -31818, -31869, -31918, -31966, -32012, -32058, -32101, -32144, -32185, -32224, -32262, -32299, -32335, -32369, -32401, -32433, -32463, -32491, -32518, -32544, -32568, -32591, -32613, -32633, -32652, -32669, -32685, -32700, -32713, -32724, -32735, -32744, -32751, -32757, -32762, -32766, -32767, 32767, 32764, 32755, 32741, 32720, 32694, 32663, 32626, 32583, 32535, 32481, 32421, 32356, 32286, 32209, 32128, 32041, 31948, 31850, 31747, 31638, 31523, 31403, 31278, 31148, 31012, 30871, 30724, 30572, 30415, 30253, 30086, 29913, 29736, 29553, 29365, 29172, 28974, 28771, 28564, 28351, 28134, 27911, 27684, 27452, 27216, 26975, 26729, 26478, 26223, 25964, 25700, 25432, 25159, 24882, 24601, 24315, 24026, 23732, 23434, 23133, 22827, 22517, 22204, 21886, 21565, 21240, 20912, 20580, 20244, 19905, 19563, 19217, 18868, 18516, 18160, 17802, 17440, 17075, 16708, 16338, 15964, 15588, 15210, 14829, 14445, 14059, 13670, 13279, 12886, 12490, 12093, 11693, 11291, 10888, 10482, 10075, 9666, 9255, 8843, 8429, 8014, 7597, 7180, 6760, 6340, 5919, 5496, 5073, 4649, 4224, 3798, 3372, 2945, 2517, 2090, 1661, 1233, 804, 375, -54, -483, -911, -1340, -1768, -2197, -2624, -3052, -3479, -3905, -4330, -4755, -5179, -5602, -6024, -6445, -6865, -7284, -7702, -8118, -8533, -8946, -9358, -9768, -10177, -10584, -10989, -11392, -11793, -12192, -12589, -12984, -13377, -13767, -14155, -14541, -14924, -15305, -15683, -16058, -16430, -16800, -17167, -17531, -17892, -18249, -18604, -18956, -19304, -19649, -19990, -20329, -20663, -20994, -21322, -21646, -21966, -22282, -22595, -22904, -23208, -23509, -23806, -24099, -24387, -24672, -24952, -25228, -25499, -25766, -26029, -26288, -26541, -26791, -27035, -27275, -27511, -27741, -27967, -28188, -28405, -28616, -28823, -29024, -29221, -29412, -29599, -29780, -29957, -30128, -30294, -30455, -30611, -30761, -30906, -31046, -31181, -31310, -31434, -31552, -31665, -31773, -31875, -31972, -32063, -32149, -32229, -32304, -32373, -32437, -32495, -32547, -32594, -32635, -32671, -32701, -32726, -32745, -32758, -32766, 32767, 32754, 32717, 32658, 32577, 32473, 32348, 32200, 32029, 31837, 31624, 31388, 31131, 30853, 30553, 30232, 29891, 29530, 29148, 28746, 28324, 27883, 27423, 26944, 26447, 25931, 25398, 24847, 24279, 23695, 23095, 22478, 21846, 21199, 20538, 19863, 19174, 18472, 17757, 17030, 16291, 15541, 14781, 14010, 13230, 12441, 11643, 10837, 10024, 9204, 8377, 7545, 6708, 5866, 5020, 4171, 3319, 2464, 1608, 751, -107, -965, -1822, -2678, -3532, -4383, -5232, -6077, -6918, -7754, -8585, -9409, -10228, -11039, -11843, -12639, -13426, -14204, -14972, -15730, -16477, -17213, -17937, -18648, -19347, -20033, -20705, -21363, -22006, -22634, -23246, -23843, -24423, -24986, -25533, -26062, -26573, -27066, -27540, -27995, -28431, -28848, -29245, -29622, -29979, -30315, -30630, -30924, -31197, -31449, -31679, -31887, -32074, -32239, -32381, -32501, -32600, -32675, -32729, -32759, }; #endif static const CELTMode mode48000_960_120 = { 48000, /* Fs */ 120, /* overlap */ 21, /* nbEBands */ 21, /* effEBands */ {27853, 0, 4096, 8192, }, /* preemph */ eband5ms, /* eBands */ 3, /* maxLM */ 8, /* nbShortMdcts */ 120, /* shortMdctSize */ 11, /* nbAllocVectors */ band_allocation, /* allocVectors */ logN400, /* logN */ window120, /* window */ {1920, 3, {&fft_state48000_960_0, &fft_state48000_960_1, &fft_state48000_960_2, &fft_state48000_960_3, }, mdct_twiddles960}, /* mdct */ {392, cache_index50, cache_bits50, cache_caps50}, /* cache */ }; /* List of all the available modes */ #define TOTAL_MODES 1 static const CELTMode * const static_mode_list[TOTAL_MODES] = { &mode48000_960_120, }; mumble-1.3.4/3rdparty/opus-src/celt/celt_lpc.c0000664000175000017500000001747414010707327021061 0ustar builderbuilder/* Copyright (c) 2009-2010 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "celt_lpc.h" #include "stack_alloc.h" #include "mathops.h" #include "pitch.h" void _celt_lpc( opus_val16 *_lpc, /* out: [0...p-1] LPC coefficients */ const opus_val32 *ac, /* in: [0...p] autocorrelation values */ int p ) { int i, j; opus_val32 r; opus_val32 error = ac[0]; #ifdef FIXED_POINT opus_val32 lpc[LPC_ORDER]; #else float *lpc = _lpc; #endif OPUS_CLEAR(lpc, p); if (ac[0] != 0) { for (i = 0; i < p; i++) { /* Sum up this iteration's reflection coefficient */ opus_val32 rr = 0; for (j = 0; j < i; j++) rr += MULT32_32_Q31(lpc[j],ac[i - j]); rr += SHR32(ac[i + 1],3); r = -frac_div32(SHL32(rr,3), error); /* Update LPC coefficients and total error */ lpc[i] = SHR32(r,3); for (j = 0; j < (i+1)>>1; j++) { opus_val32 tmp1, tmp2; tmp1 = lpc[j]; tmp2 = lpc[i-1-j]; lpc[j] = tmp1 + MULT32_32_Q31(r,tmp2); lpc[i-1-j] = tmp2 + MULT32_32_Q31(r,tmp1); } error = error - MULT32_32_Q31(MULT32_32_Q31(r,r),error); /* Bail out once we get 30 dB gain */ #ifdef FIXED_POINT if (error=1;j--) { mem[j]=mem[j-1]; } mem[0] = SROUND16(sum, SIG_SHIFT); _y[i] = sum; } #else int i,j; VARDECL(opus_val16, rden); VARDECL(opus_val16, y); SAVE_STACK; celt_assert((ord&3)==0); ALLOC(rden, ord, opus_val16); ALLOC(y, N+ord, opus_val16); for(i=0;i0); celt_assert(overlap>=0); if (overlap == 0) { xptr = x; } else { for (i=0;i0) { for(i=0;i= 536870912) { int shift2=1; if (ac[0] >= 1073741824) shift2++; for (i=0;i<=lag;i++) ac[i] = SHR32(ac[i], shift2); shift += shift2; } #endif RESTORE_STACK; return shift; } mumble-1.3.4/3rdparty/opus-src/celt/x86/0000775000175000017500000000000014010707327017540 5ustar builderbuildermumble-1.3.4/3rdparty/opus-src/celt/x86/pitch_sse2.c0000664000175000017500000000617614010707327021761 0ustar builderbuilder/* Copyright (c) 2014, Cisco Systems, INC Written by XiangMingZhu WeiZhou MinPeng YanWang Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "macros.h" #include "celt_lpc.h" #include "stack_alloc.h" #include "mathops.h" #include "pitch.h" #if defined(OPUS_X86_MAY_HAVE_SSE2) && defined(FIXED_POINT) opus_val32 celt_inner_prod_sse2(const opus_val16 *x, const opus_val16 *y, int N) { opus_int i, dataSize16; opus_int32 sum; __m128i inVec1_76543210, inVec1_FEDCBA98, acc1; __m128i inVec2_76543210, inVec2_FEDCBA98, acc2; sum = 0; dataSize16 = N & ~15; acc1 = _mm_setzero_si128(); acc2 = _mm_setzero_si128(); for (i=0;i= 8) { inVec1_76543210 = _mm_loadu_si128((__m128i *)(&x[i + 0])); inVec2_76543210 = _mm_loadu_si128((__m128i *)(&y[i + 0])); inVec1_76543210 = _mm_madd_epi16(inVec1_76543210, inVec2_76543210); acc1 = _mm_add_epi32(acc1, inVec1_76543210); i += 8; } acc1 = _mm_add_epi32(acc1, _mm_unpackhi_epi64( acc1, acc1)); acc1 = _mm_add_epi32(acc1, _mm_shufflelo_epi16( acc1, 0x0E)); sum += _mm_cvtsi128_si32(acc1); for (;i #include #include #include "celt_lpc.h" #include "stack_alloc.h" #include "mathops.h" #include "pitch.h" #include "x86cpu.h" #if defined(FIXED_POINT) void celt_fir_sse4_1(const opus_val16 *x, const opus_val16 *num, opus_val16 *y, int N, int ord, int arch) { int i,j; VARDECL(opus_val16, rnum); __m128i vecNoA; opus_int32 noA ; SAVE_STACK; ALLOC(rnum, ord, opus_val16); for(i=0;i> 1; vecNoA = _mm_set_epi32(noA, noA, noA, noA); for (i=0;i #include #include "macros.h" #include "celt_lpc.h" #include "stack_alloc.h" #include "mathops.h" #include "pitch.h" #if defined(OPUS_X86_MAY_HAVE_SSE4_1) && defined(FIXED_POINT) #include #include "x86cpu.h" opus_val32 celt_inner_prod_sse4_1(const opus_val16 *x, const opus_val16 *y, int N) { opus_int i, dataSize16; opus_int32 sum; __m128i inVec1_76543210, inVec1_FEDCBA98, acc1; __m128i inVec2_76543210, inVec2_FEDCBA98, acc2; __m128i inVec1_3210, inVec2_3210; sum = 0; dataSize16 = N & ~15; acc1 = _mm_setzero_si128(); acc2 = _mm_setzero_si128(); for (i=0;i= 8) { inVec1_76543210 = _mm_loadu_si128((__m128i *)(&x[i + 0])); inVec2_76543210 = _mm_loadu_si128((__m128i *)(&y[i + 0])); inVec1_76543210 = _mm_madd_epi16(inVec1_76543210, inVec2_76543210); acc1 = _mm_add_epi32(acc1, inVec1_76543210); i += 8; } if (N - i >= 4) { inVec1_3210 = OP_CVTEPI16_EPI32_M64(&x[i + 0]); inVec2_3210 = OP_CVTEPI16_EPI32_M64(&y[i + 0]); inVec1_3210 = _mm_mullo_epi32(inVec1_3210, inVec2_3210); acc1 = _mm_add_epi32(acc1, inVec1_3210); i += 4; } acc1 = _mm_add_epi32(acc1, _mm_unpackhi_epi64(acc1, acc1)); acc1 = _mm_add_epi32(acc1, _mm_shufflelo_epi16(acc1, 0x0E)); sum += _mm_cvtsi128_si32(acc1); for (;i= 3); sum0 = _mm_setzero_si128(); sum1 = _mm_setzero_si128(); sum2 = _mm_setzero_si128(); sum3 = _mm_setzero_si128(); for (j=0;j<(len-7);j+=8) { vecX = _mm_loadu_si128((__m128i *)(&x[j + 0])); vecY0 = _mm_loadu_si128((__m128i *)(&y[j + 0])); vecY1 = _mm_loadu_si128((__m128i *)(&y[j + 1])); vecY2 = _mm_loadu_si128((__m128i *)(&y[j + 2])); vecY3 = _mm_loadu_si128((__m128i *)(&y[j + 3])); sum0 = _mm_add_epi32(sum0, _mm_madd_epi16(vecX, vecY0)); sum1 = _mm_add_epi32(sum1, _mm_madd_epi16(vecX, vecY1)); sum2 = _mm_add_epi32(sum2, _mm_madd_epi16(vecX, vecY2)); sum3 = _mm_add_epi32(sum3, _mm_madd_epi16(vecX, vecY3)); } sum0 = _mm_add_epi32(sum0, _mm_unpackhi_epi64( sum0, sum0)); sum0 = _mm_add_epi32(sum0, _mm_shufflelo_epi16( sum0, 0x0E)); sum1 = _mm_add_epi32(sum1, _mm_unpackhi_epi64( sum1, sum1)); sum1 = _mm_add_epi32(sum1, _mm_shufflelo_epi16( sum1, 0x0E)); sum2 = _mm_add_epi32(sum2, _mm_unpackhi_epi64( sum2, sum2)); sum2 = _mm_add_epi32(sum2, _mm_shufflelo_epi16( sum2, 0x0E)); sum3 = _mm_add_epi32(sum3, _mm_unpackhi_epi64( sum3, sum3)); sum3 = _mm_add_epi32(sum3, _mm_shufflelo_epi16( sum3, 0x0E)); vecSum = _mm_unpacklo_epi64(_mm_unpacklo_epi32(sum0, sum1), _mm_unpacklo_epi32(sum2, sum3)); for (;j<(len-3);j+=4) { vecX = OP_CVTEPI16_EPI32_M64(&x[j + 0]); vecX0 = _mm_shuffle_epi32(vecX, 0x00); vecX1 = _mm_shuffle_epi32(vecX, 0x55); vecX2 = _mm_shuffle_epi32(vecX, 0xaa); vecX3 = _mm_shuffle_epi32(vecX, 0xff); vecY0 = OP_CVTEPI16_EPI32_M64(&y[j + 0]); vecY1 = OP_CVTEPI16_EPI32_M64(&y[j + 1]); vecY2 = OP_CVTEPI16_EPI32_M64(&y[j + 2]); vecY3 = OP_CVTEPI16_EPI32_M64(&y[j + 3]); sum0 = _mm_mullo_epi32(vecX0, vecY0); sum1 = _mm_mullo_epi32(vecX1, vecY1); sum2 = _mm_mullo_epi32(vecX2, vecY2); sum3 = _mm_mullo_epi32(vecX3, vecY3); sum0 = _mm_add_epi32(sum0, sum1); sum2 = _mm_add_epi32(sum2, sum3); vecSum = _mm_add_epi32(vecSum, sum0); vecSum = _mm_add_epi32(vecSum, sum2); } for (;j static _inline void cpuid(unsigned int CPUInfo[4], unsigned int InfoType) { __cpuid((int*)CPUInfo, InfoType); } #else #if defined(CPU_INFO_BY_C) #include #endif static void cpuid(unsigned int CPUInfo[4], unsigned int InfoType) { #if defined(CPU_INFO_BY_ASM) #if defined(__i386__) && defined(__PIC__) /* %ebx is PIC register in 32-bit, so mustn't clobber it. */ __asm__ __volatile__ ( "xchg %%ebx, %1\n" "cpuid\n" "xchg %%ebx, %1\n": "=a" (CPUInfo[0]), "=r" (CPUInfo[1]), "=c" (CPUInfo[2]), "=d" (CPUInfo[3]) : "0" (InfoType) ); #else __asm__ __volatile__ ( "cpuid": "=a" (CPUInfo[0]), "=b" (CPUInfo[1]), "=c" (CPUInfo[2]), "=d" (CPUInfo[3]) : "0" (InfoType) ); #endif #elif defined(CPU_INFO_BY_C) __get_cpuid(InfoType, &(CPUInfo[0]), &(CPUInfo[1]), &(CPUInfo[2]), &(CPUInfo[3])); #endif } #endif typedef struct CPU_Feature{ /* SIMD: 128-bit */ int HW_SSE; int HW_SSE2; int HW_SSE41; /* SIMD: 256-bit */ int HW_AVX; } CPU_Feature; static void opus_cpu_feature_check(CPU_Feature *cpu_feature) { unsigned int info[4] = {0}; unsigned int nIds = 0; cpuid(info, 0); nIds = info[0]; if (nIds >= 1){ cpuid(info, 1); cpu_feature->HW_SSE = (info[3] & (1 << 25)) != 0; cpu_feature->HW_SSE2 = (info[3] & (1 << 26)) != 0; cpu_feature->HW_SSE41 = (info[2] & (1 << 19)) != 0; cpu_feature->HW_AVX = (info[2] & (1 << 28)) != 0; } else { cpu_feature->HW_SSE = 0; cpu_feature->HW_SSE2 = 0; cpu_feature->HW_SSE41 = 0; cpu_feature->HW_AVX = 0; } } int opus_select_arch(void) { CPU_Feature cpu_feature; int arch; opus_cpu_feature_check(&cpu_feature); arch = 0; if (!cpu_feature.HW_SSE) { return arch; } arch++; if (!cpu_feature.HW_SSE2) { return arch; } arch++; if (!cpu_feature.HW_SSE41) { return arch; } arch++; if (!cpu_feature.HW_AVX) { return arch; } arch++; return arch; } #endif mumble-1.3.4/3rdparty/opus-src/celt/x86/x86cpu.h0000664000175000017500000000674114010707327021056 0ustar builderbuilder/* Copyright (c) 2014, Cisco Systems, INC Written by XiangMingZhu WeiZhou MinPeng YanWang Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if !defined(X86CPU_H) # define X86CPU_H # if defined(OPUS_X86_MAY_HAVE_SSE) # define MAY_HAVE_SSE(name) name ## _sse # else # define MAY_HAVE_SSE(name) name ## _c # endif # if defined(OPUS_X86_MAY_HAVE_SSE2) # define MAY_HAVE_SSE2(name) name ## _sse2 # else # define MAY_HAVE_SSE2(name) name ## _c # endif # if defined(OPUS_X86_MAY_HAVE_SSE4_1) # define MAY_HAVE_SSE4_1(name) name ## _sse4_1 # else # define MAY_HAVE_SSE4_1(name) name ## _c # endif # if defined(OPUS_X86_MAY_HAVE_AVX) # define MAY_HAVE_AVX(name) name ## _avx # else # define MAY_HAVE_AVX(name) name ## _c # endif # if defined(OPUS_HAVE_RTCD) int opus_select_arch(void); # endif /*gcc appears to emit MOVDQA's to load the argument of an _mm_cvtepi8_epi32() or _mm_cvtepi16_epi32() when optimizations are disabled, even though the actual PMOVSXWD instruction takes an m32 or m64. Unlike a normal memory reference, these require 16-byte alignment and load a full 16 bytes (instead of 4 or 8), possibly reading out of bounds. We can insert an explicit MOVD or MOVQ using _mm_cvtsi32_si128() or _mm_loadl_epi64(), which should have the same semantics as an m32 or m64 reference in the PMOVSXWD instruction itself, but gcc is not smart enough to optimize this out when optimizations ARE enabled. Clang, in contrast, requires us to do this always for _mm_cvtepi8_epi32 (which is fair, since technically the compiler is always allowed to do the dereference before invoking the function implementing the intrinsic). However, it is smart enough to eliminate the extra MOVD instruction. For _mm_cvtepi16_epi32, it does the right thing, though does *not* optimize out the extra MOVQ if it's specified explicitly */ # if defined(__clang__) || !defined(__OPTIMIZE__) # define OP_CVTEPI8_EPI32_M32(x) \ (_mm_cvtepi8_epi32(_mm_cvtsi32_si128(*(int *)(x)))) # else # define OP_CVTEPI8_EPI32_M32(x) \ (_mm_cvtepi8_epi32(*(__m128i *)(x))) #endif # if !defined(__OPTIMIZE__) # define OP_CVTEPI16_EPI32_M64(x) \ (_mm_cvtepi16_epi32(_mm_loadl_epi64((__m128i *)(x)))) # else # define OP_CVTEPI16_EPI32_M64(x) \ (_mm_cvtepi16_epi32(*(__m128i *)(x))) # endif #endif mumble-1.3.4/3rdparty/opus-src/celt/x86/pitch_sse.c0000664000175000017500000001341514010707327021671 0ustar builderbuilder/* Copyright (c) 2014, Cisco Systems, INC Written by XiangMingZhu WeiZhou MinPeng YanWang Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "macros.h" #include "celt_lpc.h" #include "stack_alloc.h" #include "mathops.h" #include "pitch.h" #if defined(OPUS_X86_MAY_HAVE_SSE) && !defined(FIXED_POINT) #include #include "arch.h" void xcorr_kernel_sse(const opus_val16 *x, const opus_val16 *y, opus_val32 sum[4], int len) { int j; __m128 xsum1, xsum2; xsum1 = _mm_loadu_ps(sum); xsum2 = _mm_setzero_ps(); for (j = 0; j < len-3; j += 4) { __m128 x0 = _mm_loadu_ps(x+j); __m128 yj = _mm_loadu_ps(y+j); __m128 y3 = _mm_loadu_ps(y+j+3); xsum1 = _mm_add_ps(xsum1,_mm_mul_ps(_mm_shuffle_ps(x0,x0,0x00),yj)); xsum2 = _mm_add_ps(xsum2,_mm_mul_ps(_mm_shuffle_ps(x0,x0,0x55), _mm_shuffle_ps(yj,y3,0x49))); xsum1 = _mm_add_ps(xsum1,_mm_mul_ps(_mm_shuffle_ps(x0,x0,0xaa), _mm_shuffle_ps(yj,y3,0x9e))); xsum2 = _mm_add_ps(xsum2,_mm_mul_ps(_mm_shuffle_ps(x0,x0,0xff),y3)); } if (j < len) { xsum1 = _mm_add_ps(xsum1,_mm_mul_ps(_mm_load1_ps(x+j),_mm_loadu_ps(y+j))); if (++j < len) { xsum2 = _mm_add_ps(xsum2,_mm_mul_ps(_mm_load1_ps(x+j),_mm_loadu_ps(y+j))); if (++j < len) { xsum1 = _mm_add_ps(xsum1,_mm_mul_ps(_mm_load1_ps(x+j),_mm_loadu_ps(y+j))); } } } _mm_storeu_ps(sum,_mm_add_ps(xsum1,xsum2)); } void dual_inner_prod_sse(const opus_val16 *x, const opus_val16 *y01, const opus_val16 *y02, int N, opus_val32 *xy1, opus_val32 *xy2) { int i; __m128 xsum1, xsum2; xsum1 = _mm_setzero_ps(); xsum2 = _mm_setzero_ps(); for (i=0;i #include #include "celt_lpc.h" #include "stack_alloc.h" #include "mathops.h" #include "vq.h" #include "x86cpu.h" #ifndef FIXED_POINT opus_val16 op_pvq_search_sse2(celt_norm *_X, int *iy, int K, int N, int arch) { int i, j; int pulsesLeft; float xy, yy; VARDECL(celt_norm, y); VARDECL(celt_norm, X); VARDECL(float, signy); __m128 signmask; __m128 sums; __m128i fours; SAVE_STACK; (void)arch; /* All bits set to zero, except for the sign bit. */ signmask = _mm_set_ps1(-0.f); fours = _mm_set_epi32(4, 4, 4, 4); ALLOC(y, N+3, celt_norm); ALLOC(X, N+3, celt_norm); ALLOC(signy, N+3, float); OPUS_COPY(X, _X, N); X[N] = X[N+1] = X[N+2] = 0; sums = _mm_setzero_ps(); for (j=0;j (N>>1)) { __m128i pulses_sum; __m128 yy4, xy4; __m128 rcp4; opus_val32 sum = _mm_cvtss_f32(sums); /* If X is too small, just replace it with a pulse at 0 */ /* Prevents infinities and NaNs from causing too many pulses to be allocated. 64 is an approximation of infinity here. */ if (!(sum > EPSILON && sum < 64)) { X[0] = QCONST16(1.f,14); j=1; do X[j]=0; while (++j=0, "Allocated too many pulses in the quick pass"); /* This should never happen, but just in case it does (e.g. on silence) we fill the first bin with pulses. */ if (pulsesLeft > N+3) { opus_val16 tmp = (opus_val16)pulsesLeft; yy = MAC16_16(yy, tmp, tmp); yy = MAC16_16(yy, tmp, y[0]); iy[0] += pulsesLeft; pulsesLeft=0; } for (i=0;i> (shift)) /** Arithmetic shift-left of a 16-bit value */ #define SHL16(a,shift) ((opus_int16)((opus_uint16)(a)<<(shift))) /** Arithmetic shift-right of a 32-bit value */ #define SHR32(a,shift) ((a) >> (shift)) /** Arithmetic shift-left of a 32-bit value */ #define SHL32(a,shift) ((opus_int32)((opus_uint32)(a)<<(shift))) /** 32-bit arithmetic shift right with rounding-to-nearest instead of rounding down */ #define PSHR32(a,shift) (SHR32((a)+((EXTEND32(1)<<((shift))>>1)),shift)) /** 32-bit arithmetic shift right where the argument can be negative */ #define VSHR32(a, shift) (((shift)>0) ? SHR32(a, shift) : SHL32(a, -(shift))) /** "RAW" macros, should not be used outside of this header file */ #define SHR(a,shift) ((a) >> (shift)) #define SHL(a,shift) SHL32(a,shift) #define PSHR(a,shift) (SHR((a)+((EXTEND32(1)<<((shift))>>1)),shift)) #define SATURATE(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) #define SATURATE16(x) (EXTRACT16((x)>32767 ? 32767 : (x)<-32768 ? -32768 : (x))) /** Shift by a and round-to-neareast 32-bit value. Result is a 16-bit value */ #define ROUND16(x,a) (EXTRACT16(PSHR32((x),(a)))) /** Shift by a and round-to-neareast 32-bit value. Result is a saturated 16-bit value */ #define SROUND16(x,a) EXTRACT16(SATURATE(PSHR32(x,a), 32767)); /** Divide by two */ #define HALF16(x) (SHR16(x,1)) #define HALF32(x) (SHR32(x,1)) /** Add two 16-bit values */ #define ADD16(a,b) ((opus_val16)((opus_val16)(a)+(opus_val16)(b))) /** Subtract two 16-bit values */ #define SUB16(a,b) ((opus_val16)(a)-(opus_val16)(b)) /** Add two 32-bit values */ #define ADD32(a,b) ((opus_val32)(a)+(opus_val32)(b)) /** Subtract two 32-bit values */ #define SUB32(a,b) ((opus_val32)(a)-(opus_val32)(b)) /** Add two 32-bit values, ignore any overflows */ #define ADD32_ovflw(a,b) ((opus_val32)((opus_uint32)(a)+(opus_uint32)(b))) /** Subtract two 32-bit values, ignore any overflows */ #define SUB32_ovflw(a,b) ((opus_val32)((opus_uint32)(a)-(opus_uint32)(b))) /* Avoid MSVC warning C4146: unary minus operator applied to unsigned type */ /** Negate 32-bit value, ignore any overflows */ #define NEG32_ovflw(a) ((opus_val32)(0-(opus_uint32)(a))) /** 16x16 multiplication where the result fits in 16 bits */ #define MULT16_16_16(a,b) ((((opus_val16)(a))*((opus_val16)(b)))) /* (opus_val32)(opus_val16) gives TI compiler a hint that it's 16x16->32 multiply */ /** 16x16 multiplication where the result fits in 32 bits */ #define MULT16_16(a,b) (((opus_val32)(opus_val16)(a))*((opus_val32)(opus_val16)(b))) /** 16x16 multiply-add where the result fits in 32 bits */ #define MAC16_16(c,a,b) (ADD32((c),MULT16_16((a),(b)))) /** 16x32 multiply, followed by a 15-bit shift right and 32-bit add. b must fit in 31 bits. Result fits in 32 bits. */ #define MAC16_32_Q15(c,a,b) ADD32((c),ADD32(MULT16_16((a),SHR((b),15)), SHR(MULT16_16((a),((b)&0x00007fff)),15))) /** 16x32 multiplication, followed by a 16-bit shift right and 32-bit add. Results fits in 32 bits */ #define MAC16_32_Q16(c,a,b) ADD32((c),ADD32(MULT16_16((a),SHR((b),16)), SHR(MULT16_16SU((a),((b)&0x0000ffff)),16))) #define MULT16_16_Q11_32(a,b) (SHR(MULT16_16((a),(b)),11)) #define MULT16_16_Q11(a,b) (SHR(MULT16_16((a),(b)),11)) #define MULT16_16_Q13(a,b) (SHR(MULT16_16((a),(b)),13)) #define MULT16_16_Q14(a,b) (SHR(MULT16_16((a),(b)),14)) #define MULT16_16_Q15(a,b) (SHR(MULT16_16((a),(b)),15)) #define MULT16_16_P13(a,b) (SHR(ADD32(4096,MULT16_16((a),(b))),13)) #define MULT16_16_P14(a,b) (SHR(ADD32(8192,MULT16_16((a),(b))),14)) #define MULT16_16_P15(a,b) (SHR(ADD32(16384,MULT16_16((a),(b))),15)) /** Divide a 32-bit value by a 16-bit value. Result fits in 16 bits */ #define DIV32_16(a,b) ((opus_val16)(((opus_val32)(a))/((opus_val16)(b)))) /** Divide a 32-bit value by a 32-bit value. Result fits in 32 bits */ #define DIV32(a,b) (((opus_val32)(a))/((opus_val32)(b))) #if defined(MIPSr1_ASM) #include "mips/fixed_generic_mipsr1.h" #endif static OPUS_INLINE opus_val16 SIG2WORD16_generic(celt_sig x) { x = PSHR32(x, SIG_SHIFT); x = MAX32(x, -32768); x = MIN32(x, 32767); return EXTRACT16(x); } #define SIG2WORD16(x) (SIG2WORD16_generic(x)) #endif mumble-1.3.4/3rdparty/opus-src/celt/kiss_fft.c0000664000175000017500000004115314010707327021073 0ustar builderbuilder/*Copyright (c) 2003-2004, Mark Borgerding Lots of modifications by Jean-Marc Valin Copyright (c) 2005-2007, Xiph.Org Foundation Copyright (c) 2008, Xiph.Org Foundation, CSIRO All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.*/ /* This code is originally from Mark Borgerding's KISS-FFT but has been heavily modified to better suit Opus */ #ifndef SKIP_CONFIG_H # ifdef HAVE_CONFIG_H # include "config.h" # endif #endif #include "_kiss_fft_guts.h" #include "arch.h" #include "os_support.h" #include "mathops.h" #include "stack_alloc.h" /* The guts header contains all the multiplication and addition macros that are defined for complex numbers. It also delares the kf_ internal functions. */ static void kf_bfly2( kiss_fft_cpx * Fout, int m, int N ) { kiss_fft_cpx * Fout2; int i; (void)m; #ifdef CUSTOM_MODES if (m==1) { celt_assert(m==1); for (i=0;itwiddles; /* m is guaranteed to be a multiple of 4. */ for (j=0;jtwiddles[fstride*m]; #endif for (i=0;itwiddles; /* For non-custom modes, m is guaranteed to be a multiple of 4. */ k=m; do { C_MUL(scratch[1],Fout[m] , *tw1); C_MUL(scratch[2],Fout[m2] , *tw2); C_ADD(scratch[3],scratch[1],scratch[2]); C_SUB(scratch[0],scratch[1],scratch[2]); tw1 += fstride; tw2 += fstride*2; Fout[m].r = SUB32_ovflw(Fout->r, HALF_OF(scratch[3].r)); Fout[m].i = SUB32_ovflw(Fout->i, HALF_OF(scratch[3].i)); C_MULBYSCALAR( scratch[0] , epi3.i ); C_ADDTO(*Fout,scratch[3]); Fout[m2].r = ADD32_ovflw(Fout[m].r, scratch[0].i); Fout[m2].i = SUB32_ovflw(Fout[m].i, scratch[0].r); Fout[m].r = SUB32_ovflw(Fout[m].r, scratch[0].i); Fout[m].i = ADD32_ovflw(Fout[m].i, scratch[0].r); ++Fout; } while(--k); } } #ifndef OVERRIDE_kf_bfly5 static void kf_bfly5( kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_state *st, int m, int N, int mm ) { kiss_fft_cpx *Fout0,*Fout1,*Fout2,*Fout3,*Fout4; int i, u; kiss_fft_cpx scratch[13]; const kiss_twiddle_cpx *tw; kiss_twiddle_cpx ya,yb; kiss_fft_cpx * Fout_beg = Fout; #ifdef FIXED_POINT ya.r = 10126; ya.i = -31164; yb.r = -26510; yb.i = -19261; #else ya = st->twiddles[fstride*m]; yb = st->twiddles[fstride*2*m]; #endif tw=st->twiddles; for (i=0;ir = ADD32_ovflw(Fout0->r, ADD32_ovflw(scratch[7].r, scratch[8].r)); Fout0->i = ADD32_ovflw(Fout0->i, ADD32_ovflw(scratch[7].i, scratch[8].i)); scratch[5].r = ADD32_ovflw(scratch[0].r, ADD32_ovflw(S_MUL(scratch[7].r,ya.r), S_MUL(scratch[8].r,yb.r))); scratch[5].i = ADD32_ovflw(scratch[0].i, ADD32_ovflw(S_MUL(scratch[7].i,ya.r), S_MUL(scratch[8].i,yb.r))); scratch[6].r = ADD32_ovflw(S_MUL(scratch[10].i,ya.i), S_MUL(scratch[9].i,yb.i)); scratch[6].i = NEG32_ovflw(ADD32_ovflw(S_MUL(scratch[10].r,ya.i), S_MUL(scratch[9].r,yb.i))); C_SUB(*Fout1,scratch[5],scratch[6]); C_ADD(*Fout4,scratch[5],scratch[6]); scratch[11].r = ADD32_ovflw(scratch[0].r, ADD32_ovflw(S_MUL(scratch[7].r,yb.r), S_MUL(scratch[8].r,ya.r))); scratch[11].i = ADD32_ovflw(scratch[0].i, ADD32_ovflw(S_MUL(scratch[7].i,yb.r), S_MUL(scratch[8].i,ya.r))); scratch[12].r = SUB32_ovflw(S_MUL(scratch[9].i,ya.i), S_MUL(scratch[10].i,yb.i)); scratch[12].i = SUB32_ovflw(S_MUL(scratch[10].r,yb.i), S_MUL(scratch[9].r,ya.i)); C_ADD(*Fout2,scratch[11],scratch[12]); C_SUB(*Fout3,scratch[11],scratch[12]); ++Fout0;++Fout1;++Fout2;++Fout3;++Fout4; } } } #endif /* OVERRIDE_kf_bfly5 */ #endif #ifdef CUSTOM_MODES static void compute_bitrev_table( int Fout, opus_int16 *f, const size_t fstride, int in_stride, opus_int16 * factors, const kiss_fft_state *st ) { const int p=*factors++; /* the radix */ const int m=*factors++; /* stage's fft length/p */ /*printf ("fft %d %d %d %d %d %d\n", p*m, m, p, s2, fstride*in_stride, N);*/ if (m==1) { int j; for (j=0;j32000 || (opus_int32)p*(opus_int32)p > n) p = n; /* no more factors, skip to end */ } n /= p; #ifdef RADIX_TWO_ONLY if (p!=2 && p != 4) #else if (p>5) #endif { return 0; } facbuf[2*stages] = p; if (p==2 && stages > 1) { facbuf[2*stages] = 4; facbuf[2] = 2; } stages++; } while (n > 1); n = nbak; /* Reverse the order to get the radix 4 at the end, so we can use the fast degenerate case. It turns out that reversing the order also improves the noise behaviour. */ for (i=0;i= memneeded) st = (kiss_fft_state*)mem; *lenmem = memneeded; } if (st) { opus_int16 *bitrev; kiss_twiddle_cpx *twiddles; st->nfft=nfft; #ifdef FIXED_POINT st->scale_shift = celt_ilog2(st->nfft); if (st->nfft == 1<scale_shift) st->scale = Q15ONE; else st->scale = (1073741824+st->nfft/2)/st->nfft>>(15-st->scale_shift); #else st->scale = 1.f/nfft; #endif if (base != NULL) { st->twiddles = base->twiddles; st->shift = 0; while (st->shift < 32 && nfft<shift != base->nfft) st->shift++; if (st->shift>=32) goto fail; } else { st->twiddles = twiddles = (kiss_twiddle_cpx*)KISS_FFT_MALLOC(sizeof(kiss_twiddle_cpx)*nfft); compute_twiddles(twiddles, nfft); st->shift = -1; } if (!kf_factor(nfft,st->factors)) { goto fail; } /* bitrev */ st->bitrev = bitrev = (opus_int16*)KISS_FFT_MALLOC(sizeof(opus_int16)*nfft); if (st->bitrev==NULL) goto fail; compute_bitrev_table(0, bitrev, 1,1, st->factors,st); /* Initialize architecture specific fft parameters */ if (opus_fft_alloc_arch(st, arch)) goto fail; } return st; fail: opus_fft_free(st, arch); return NULL; } kiss_fft_state *opus_fft_alloc(int nfft,void * mem,size_t * lenmem, int arch) { return opus_fft_alloc_twiddles(nfft, mem, lenmem, NULL, arch); } void opus_fft_free_arch_c(kiss_fft_state *st) { (void)st; } void opus_fft_free(const kiss_fft_state *cfg, int arch) { if (cfg) { opus_fft_free_arch((kiss_fft_state *)cfg, arch); opus_free((opus_int16*)cfg->bitrev); if (cfg->shift < 0) opus_free((kiss_twiddle_cpx*)cfg->twiddles); opus_free((kiss_fft_state*)cfg); } } #endif /* CUSTOM_MODES */ void opus_fft_impl(const kiss_fft_state *st,kiss_fft_cpx *fout) { int m2, m; int p; int L; int fstride[MAXFACTORS]; int i; int shift; /* st->shift can be -1 */ shift = st->shift>0 ? st->shift : 0; fstride[0] = 1; L=0; do { p = st->factors[2*L]; m = st->factors[2*L+1]; fstride[L+1] = fstride[L]*p; L++; } while(m!=1); m = st->factors[2*L-1]; for (i=L-1;i>=0;i--) { if (i!=0) m2 = st->factors[2*i-1]; else m2 = 1; switch (st->factors[2*i]) { case 2: kf_bfly2(fout, m, fstride[i]); break; case 4: kf_bfly4(fout,fstride[i]<scale_shift-1; #endif scale = st->scale; celt_assert2 (fin != fout, "In-place FFT not supported"); /* Bit-reverse the input */ for (i=0;infft;i++) { kiss_fft_cpx x = fin[i]; fout[st->bitrev[i]].r = SHR32(MULT16_32_Q16(scale, x.r), scale_shift); fout[st->bitrev[i]].i = SHR32(MULT16_32_Q16(scale, x.i), scale_shift); } opus_fft_impl(st, fout); } void opus_ifft_c(const kiss_fft_state *st,const kiss_fft_cpx *fin,kiss_fft_cpx *fout) { int i; celt_assert2 (fin != fout, "In-place FFT not supported"); /* Bit-reverse the input */ for (i=0;infft;i++) fout[st->bitrev[i]] = fin[i]; for (i=0;infft;i++) fout[i].i = -fout[i].i; opus_fft_impl(st, fout); for (i=0;infft;i++) fout[i].i = -fout[i].i; } mumble-1.3.4/3rdparty/opus-src/celt/quant_bands.c0000664000175000017500000004443214010707327021565 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "quant_bands.h" #include "laplace.h" #include #include "os_support.h" #include "arch.h" #include "mathops.h" #include "stack_alloc.h" #include "rate.h" #ifdef FIXED_POINT /* Mean energy in each band quantized in Q4 */ const signed char eMeans[25] = { 103,100, 92, 85, 81, 77, 72, 70, 78, 75, 73, 71, 78, 74, 69, 72, 70, 74, 76, 71, 60, 60, 60, 60, 60 }; #else /* Mean energy in each band quantized in Q4 and converted back to float */ const opus_val16 eMeans[25] = { 6.437500f, 6.250000f, 5.750000f, 5.312500f, 5.062500f, 4.812500f, 4.500000f, 4.375000f, 4.875000f, 4.687500f, 4.562500f, 4.437500f, 4.875000f, 4.625000f, 4.312500f, 4.500000f, 4.375000f, 4.625000f, 4.750000f, 4.437500f, 3.750000f, 3.750000f, 3.750000f, 3.750000f, 3.750000f }; #endif /* prediction coefficients: 0.9, 0.8, 0.65, 0.5 */ #ifdef FIXED_POINT static const opus_val16 pred_coef[4] = {29440, 26112, 21248, 16384}; static const opus_val16 beta_coef[4] = {30147, 22282, 12124, 6554}; static const opus_val16 beta_intra = 4915; #else static const opus_val16 pred_coef[4] = {29440/32768., 26112/32768., 21248/32768., 16384/32768.}; static const opus_val16 beta_coef[4] = {30147/32768., 22282/32768., 12124/32768., 6554/32768.}; static const opus_val16 beta_intra = 4915/32768.; #endif /*Parameters of the Laplace-like probability models used for the coarse energy. There is one pair of parameters for each frame size, prediction type (inter/intra), and band number. The first number of each pair is the probability of 0, and the second is the decay rate, both in Q8 precision.*/ static const unsigned char e_prob_model[4][2][42] = { /*120 sample frames.*/ { /*Inter*/ { 72, 127, 65, 129, 66, 128, 65, 128, 64, 128, 62, 128, 64, 128, 64, 128, 92, 78, 92, 79, 92, 78, 90, 79, 116, 41, 115, 40, 114, 40, 132, 26, 132, 26, 145, 17, 161, 12, 176, 10, 177, 11 }, /*Intra*/ { 24, 179, 48, 138, 54, 135, 54, 132, 53, 134, 56, 133, 55, 132, 55, 132, 61, 114, 70, 96, 74, 88, 75, 88, 87, 74, 89, 66, 91, 67, 100, 59, 108, 50, 120, 40, 122, 37, 97, 43, 78, 50 } }, /*240 sample frames.*/ { /*Inter*/ { 83, 78, 84, 81, 88, 75, 86, 74, 87, 71, 90, 73, 93, 74, 93, 74, 109, 40, 114, 36, 117, 34, 117, 34, 143, 17, 145, 18, 146, 19, 162, 12, 165, 10, 178, 7, 189, 6, 190, 8, 177, 9 }, /*Intra*/ { 23, 178, 54, 115, 63, 102, 66, 98, 69, 99, 74, 89, 71, 91, 73, 91, 78, 89, 86, 80, 92, 66, 93, 64, 102, 59, 103, 60, 104, 60, 117, 52, 123, 44, 138, 35, 133, 31, 97, 38, 77, 45 } }, /*480 sample frames.*/ { /*Inter*/ { 61, 90, 93, 60, 105, 42, 107, 41, 110, 45, 116, 38, 113, 38, 112, 38, 124, 26, 132, 27, 136, 19, 140, 20, 155, 14, 159, 16, 158, 18, 170, 13, 177, 10, 187, 8, 192, 6, 175, 9, 159, 10 }, /*Intra*/ { 21, 178, 59, 110, 71, 86, 75, 85, 84, 83, 91, 66, 88, 73, 87, 72, 92, 75, 98, 72, 105, 58, 107, 54, 115, 52, 114, 55, 112, 56, 129, 51, 132, 40, 150, 33, 140, 29, 98, 35, 77, 42 } }, /*960 sample frames.*/ { /*Inter*/ { 42, 121, 96, 66, 108, 43, 111, 40, 117, 44, 123, 32, 120, 36, 119, 33, 127, 33, 134, 34, 139, 21, 147, 23, 152, 20, 158, 25, 154, 26, 166, 21, 173, 16, 184, 13, 184, 10, 150, 13, 139, 15 }, /*Intra*/ { 22, 178, 63, 114, 74, 82, 84, 83, 92, 82, 103, 62, 96, 72, 96, 67, 101, 73, 107, 72, 113, 55, 118, 52, 125, 52, 118, 52, 117, 55, 135, 49, 137, 39, 157, 32, 145, 29, 97, 33, 77, 40 } } }; static const unsigned char small_energy_icdf[3]={2,1,0}; static opus_val32 loss_distortion(const opus_val16 *eBands, opus_val16 *oldEBands, int start, int end, int len, int C) { int c, i; opus_val32 dist = 0; c=0; do { for (i=start;inbEBands]; oldE = MAX16(-QCONST16(9.f,DB_SHIFT), oldEBands[i+c*m->nbEBands]); #ifdef FIXED_POINT f = SHL32(EXTEND32(x),7) - PSHR32(MULT16_16(coef,oldE), 8) - prev[c]; /* Rounding to nearest integer here is really important! */ qi = (f+QCONST32(.5f,DB_SHIFT+7))>>(DB_SHIFT+7); decay_bound = EXTRACT16(MAX32(-QCONST16(28.f,DB_SHIFT), SUB32((opus_val32)oldEBands[i+c*m->nbEBands],max_decay))); #else f = x-coef*oldE-prev[c]; /* Rounding to nearest integer here is really important! */ qi = (int)floor(.5f+f); decay_bound = MAX16(-QCONST16(28.f,DB_SHIFT), oldEBands[i+c*m->nbEBands]) - max_decay; #endif /* Prevent the energy from going down too quickly (e.g. for bands that have just one bin) */ if (qi < 0 && x < decay_bound) { qi += (int)SHR16(SUB16(decay_bound,x), DB_SHIFT); if (qi > 0) qi = 0; } qi0 = qi; /* If we don't have enough bits to encode all the energy, just assume something safe. */ tell = ec_tell(enc); bits_left = budget-tell-3*C*(end-i); if (i!=start && bits_left < 30) { if (bits_left < 24) qi = IMIN(1, qi); if (bits_left < 16) qi = IMAX(-1, qi); } if (lfe && i>=2) qi = IMIN(qi, 0); if (budget-tell >= 15) { int pi; pi = 2*IMIN(i,20); ec_laplace_encode(enc, &qi, prob_model[pi]<<7, prob_model[pi+1]<<6); } else if(budget-tell >= 2) { qi = IMAX(-1, IMIN(qi, 1)); ec_enc_icdf(enc, 2*qi^-(qi<0), small_energy_icdf, 2); } else if(budget-tell >= 1) { qi = IMIN(0, qi); ec_enc_bit_logp(enc, -qi, 1); } else qi = -1; error[i+c*m->nbEBands] = PSHR32(f,7) - SHL16(qi,DB_SHIFT); badness += abs(qi0-qi); q = (opus_val32)SHL32(EXTEND32(qi),DB_SHIFT); tmp = PSHR32(MULT16_16(coef,oldE),8) + prev[c] + SHL32(q,7); #ifdef FIXED_POINT tmp = MAX32(-QCONST32(28.f, DB_SHIFT+7), tmp); #endif oldEBands[i+c*m->nbEBands] = PSHR32(tmp, 7); prev[c] = prev[c] + SHL32(q,7) - MULT16_16(beta,PSHR32(q,8)); } while (++c < C); } return lfe ? 0 : badness; } void quant_coarse_energy(const CELTMode *m, int start, int end, int effEnd, const opus_val16 *eBands, opus_val16 *oldEBands, opus_uint32 budget, opus_val16 *error, ec_enc *enc, int C, int LM, int nbAvailableBytes, int force_intra, opus_val32 *delayedIntra, int two_pass, int loss_rate, int lfe) { int intra; opus_val16 max_decay; VARDECL(opus_val16, oldEBands_intra); VARDECL(opus_val16, error_intra); ec_enc enc_start_state; opus_uint32 tell; int badness1=0; opus_int32 intra_bias; opus_val32 new_distortion; SAVE_STACK; intra = force_intra || (!two_pass && *delayedIntra>2*C*(end-start) && nbAvailableBytes > (end-start)*C); intra_bias = (opus_int32)((budget**delayedIntra*loss_rate)/(C*512)); new_distortion = loss_distortion(eBands, oldEBands, start, effEnd, m->nbEBands, C); tell = ec_tell(enc); if (tell+3 > budget) two_pass = intra = 0; max_decay = QCONST16(16.f,DB_SHIFT); if (end-start>10) { #ifdef FIXED_POINT max_decay = MIN32(max_decay, SHL32(EXTEND32(nbAvailableBytes),DB_SHIFT-3)); #else max_decay = MIN32(max_decay, .125f*nbAvailableBytes); #endif } if (lfe) max_decay = QCONST16(3.f,DB_SHIFT); enc_start_state = *enc; ALLOC(oldEBands_intra, C*m->nbEBands, opus_val16); ALLOC(error_intra, C*m->nbEBands, opus_val16); OPUS_COPY(oldEBands_intra, oldEBands, C*m->nbEBands); if (two_pass || intra) { badness1 = quant_coarse_energy_impl(m, start, end, eBands, oldEBands_intra, budget, tell, e_prob_model[LM][1], error_intra, enc, C, LM, 1, max_decay, lfe); } if (!intra) { unsigned char *intra_buf; ec_enc enc_intra_state; opus_int32 tell_intra; opus_uint32 nstart_bytes; opus_uint32 nintra_bytes; opus_uint32 save_bytes; int badness2; VARDECL(unsigned char, intra_bits); tell_intra = ec_tell_frac(enc); enc_intra_state = *enc; nstart_bytes = ec_range_bytes(&enc_start_state); nintra_bytes = ec_range_bytes(&enc_intra_state); intra_buf = ec_get_buffer(&enc_intra_state) + nstart_bytes; save_bytes = nintra_bytes-nstart_bytes; if (save_bytes == 0) save_bytes = ALLOC_NONE; ALLOC(intra_bits, save_bytes, unsigned char); /* Copy bits from intra bit-stream */ OPUS_COPY(intra_bits, intra_buf, nintra_bytes - nstart_bytes); *enc = enc_start_state; badness2 = quant_coarse_energy_impl(m, start, end, eBands, oldEBands, budget, tell, e_prob_model[LM][intra], error, enc, C, LM, 0, max_decay, lfe); if (two_pass && (badness1 < badness2 || (badness1 == badness2 && ((opus_int32)ec_tell_frac(enc))+intra_bias > tell_intra))) { *enc = enc_intra_state; /* Copy intra bits to bit-stream */ OPUS_COPY(intra_buf, intra_bits, nintra_bytes - nstart_bytes); OPUS_COPY(oldEBands, oldEBands_intra, C*m->nbEBands); OPUS_COPY(error, error_intra, C*m->nbEBands); intra = 1; } } else { OPUS_COPY(oldEBands, oldEBands_intra, C*m->nbEBands); OPUS_COPY(error, error_intra, C*m->nbEBands); } if (intra) *delayedIntra = new_distortion; else *delayedIntra = ADD32(MULT16_32_Q15(MULT16_16_Q15(pred_coef[LM], pred_coef[LM]),*delayedIntra), new_distortion); RESTORE_STACK; } void quant_fine_energy(const CELTMode *m, int start, int end, opus_val16 *oldEBands, opus_val16 *error, int *fine_quant, ec_enc *enc, int C) { int i, c; /* Encode finer resolution */ for (i=start;inbEBands]+QCONST16(.5f,DB_SHIFT))>>(DB_SHIFT-fine_quant[i]); #else q2 = (int)floor((error[i+c*m->nbEBands]+.5f)*frac); #endif if (q2 > frac-1) q2 = frac-1; if (q2<0) q2 = 0; ec_enc_bits(enc, q2, fine_quant[i]); #ifdef FIXED_POINT offset = SUB16(SHR32(SHL32(EXTEND32(q2),DB_SHIFT)+QCONST16(.5f,DB_SHIFT),fine_quant[i]),QCONST16(.5f,DB_SHIFT)); #else offset = (q2+.5f)*(1<<(14-fine_quant[i]))*(1.f/16384) - .5f; #endif oldEBands[i+c*m->nbEBands] += offset; error[i+c*m->nbEBands] -= offset; /*printf ("%f ", error[i] - offset);*/ } while (++c < C); } } void quant_energy_finalise(const CELTMode *m, int start, int end, opus_val16 *oldEBands, opus_val16 *error, int *fine_quant, int *fine_priority, int bits_left, ec_enc *enc, int C) { int i, prio, c; /* Use up the remaining bits */ for (prio=0;prio<2;prio++) { for (i=start;i=C ;i++) { if (fine_quant[i] >= MAX_FINE_BITS || fine_priority[i]!=prio) continue; c=0; do { int q2; opus_val16 offset; q2 = error[i+c*m->nbEBands]<0 ? 0 : 1; ec_enc_bits(enc, q2, 1); #ifdef FIXED_POINT offset = SHR16(SHL16(q2,DB_SHIFT)-QCONST16(.5f,DB_SHIFT),fine_quant[i]+1); #else offset = (q2-.5f)*(1<<(14-fine_quant[i]-1))*(1.f/16384); #endif oldEBands[i+c*m->nbEBands] += offset; error[i+c*m->nbEBands] -= offset; bits_left--; } while (++c < C); } } } void unquant_coarse_energy(const CELTMode *m, int start, int end, opus_val16 *oldEBands, int intra, ec_dec *dec, int C, int LM) { const unsigned char *prob_model = e_prob_model[LM][intra]; int i, c; opus_val32 prev[2] = {0, 0}; opus_val16 coef; opus_val16 beta; opus_int32 budget; opus_int32 tell; if (intra) { coef = 0; beta = beta_intra; } else { beta = beta_coef[LM]; coef = pred_coef[LM]; } budget = dec->storage*8; /* Decode at a fixed coarse resolution */ for (i=start;i=15) { int pi; pi = 2*IMIN(i,20); qi = ec_laplace_decode(dec, prob_model[pi]<<7, prob_model[pi+1]<<6); } else if(budget-tell>=2) { qi = ec_dec_icdf(dec, small_energy_icdf, 2); qi = (qi>>1)^-(qi&1); } else if(budget-tell>=1) { qi = -ec_dec_bit_logp(dec, 1); } else qi = -1; q = (opus_val32)SHL32(EXTEND32(qi),DB_SHIFT); oldEBands[i+c*m->nbEBands] = MAX16(-QCONST16(9.f,DB_SHIFT), oldEBands[i+c*m->nbEBands]); tmp = PSHR32(MULT16_16(coef,oldEBands[i+c*m->nbEBands]),8) + prev[c] + SHL32(q,7); #ifdef FIXED_POINT tmp = MAX32(-QCONST32(28.f, DB_SHIFT+7), tmp); #endif oldEBands[i+c*m->nbEBands] = PSHR32(tmp, 7); prev[c] = prev[c] + SHL32(q,7) - MULT16_16(beta,PSHR32(q,8)); } while (++c < C); } } void unquant_fine_energy(const CELTMode *m, int start, int end, opus_val16 *oldEBands, int *fine_quant, ec_dec *dec, int C) { int i, c; /* Decode finer resolution */ for (i=start;inbEBands] += offset; } while (++c < C); } } void unquant_energy_finalise(const CELTMode *m, int start, int end, opus_val16 *oldEBands, int *fine_quant, int *fine_priority, int bits_left, ec_dec *dec, int C) { int i, prio, c; /* Use up the remaining bits */ for (prio=0;prio<2;prio++) { for (i=start;i=C ;i++) { if (fine_quant[i] >= MAX_FINE_BITS || fine_priority[i]!=prio) continue; c=0; do { int q2; opus_val16 offset; q2 = ec_dec_bits(dec, 1); #ifdef FIXED_POINT offset = SHR16(SHL16(q2,DB_SHIFT)-QCONST16(.5f,DB_SHIFT),fine_quant[i]+1); #else offset = (q2-.5f)*(1<<(14-fine_quant[i]-1))*(1.f/16384); #endif oldEBands[i+c*m->nbEBands] += offset; bits_left--; } while (++c < C); } } } void amp2Log2(const CELTMode *m, int effEnd, int end, celt_ener *bandE, opus_val16 *bandLogE, int C) { int c, i; c=0; do { for (i=0;inbEBands] = celt_log2(bandE[i+c*m->nbEBands]) - SHL16((opus_val16)eMeans[i],6); #ifdef FIXED_POINT /* Compensate for bandE[] being Q12 but celt_log2() taking a Q14 input. */ bandLogE[i+c*m->nbEBands] += QCONST16(2.f, DB_SHIFT); #endif } for (i=effEnd;inbEBands+i] = -QCONST16(14.f,DB_SHIFT); } while (++c < C); } mumble-1.3.4/3rdparty/opus-src/celt/rate.c0000664000175000017500000005166414010707327020226 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "modes.h" #include "cwrs.h" #include "arch.h" #include "os_support.h" #include "entcode.h" #include "rate.h" static const unsigned char LOG2_FRAC_TABLE[24]={ 0, 8,13, 16,19,21,23, 24,26,27,28,29,30,31,32, 32,33,34,34,35,36,36,37,37 }; #ifdef CUSTOM_MODES /*Determines if V(N,K) fits in a 32-bit unsigned integer. N and K are themselves limited to 15 bits.*/ static int fits_in32(int _n, int _k) { static const opus_int16 maxN[15] = { 32767, 32767, 32767, 1476, 283, 109, 60, 40, 29, 24, 20, 18, 16, 14, 13}; static const opus_int16 maxK[15] = { 32767, 32767, 32767, 32767, 1172, 238, 95, 53, 36, 27, 22, 18, 16, 15, 13}; if (_n>=14) { if (_k>=14) return 0; else return _n <= maxN[_k]; } else { return _k <= maxK[_n]; } } void compute_pulse_cache(CELTMode *m, int LM) { int C; int i; int j; int curr=0; int nbEntries=0; int entryN[100], entryK[100], entryI[100]; const opus_int16 *eBands = m->eBands; PulseCache *cache = &m->cache; opus_int16 *cindex; unsigned char *bits; unsigned char *cap; cindex = (opus_int16 *)opus_alloc(sizeof(cache->index[0])*m->nbEBands*(LM+2)); cache->index = cindex; /* Scan for all unique band sizes */ for (i=0;i<=LM+1;i++) { for (j=0;jnbEBands;j++) { int k; int N = (eBands[j+1]-eBands[j])<>1; cindex[i*m->nbEBands+j] = -1; /* Find other bands that have the same size */ for (k=0;k<=i;k++) { int n; for (n=0;nnbEBands && (k!=i || n>1) { cindex[i*m->nbEBands+j] = cindex[k*m->nbEBands+n]; break; } } } if (cache->index[i*m->nbEBands+j] == -1 && N!=0) { int K; entryN[nbEntries] = N; K = 0; while (fits_in32(N,get_pulses(K+1)) && KnbEBands+j] = curr; entryI[nbEntries] = curr; curr += K+1; nbEntries++; } } } bits = (unsigned char *)opus_alloc(sizeof(unsigned char)*curr); cache->bits = bits; cache->size = curr; /* Compute the cache for all unique sizes */ for (i=0;icaps = cap = (unsigned char *)opus_alloc(sizeof(cache->caps[0])*(LM+1)*2*m->nbEBands); for (i=0;i<=LM;i++) { for (C=1;C<=2;C++) { for (j=0;jnbEBands;j++) { int N0; int max_bits; N0 = m->eBands[j+1]-m->eBands[j]; /* N=1 bands only have a sign bit and fine bits. */ if (N0<1 are even, including custom modes.*/ if (N0 > 2) { N0>>=1; LM0--; } /* N0=1 bands can't be split down to N<2. */ else if (N0 <= 1) { LM0=IMIN(i,1); N0<<=LM0; } /* Compute the cost for the lowest-level PVQ of a fully split band. */ pcache = bits + cindex[(LM0+1)*m->nbEBands+j]; max_bits = pcache[pcache[0]]+1; /* Add in the cost of coding regular splits. */ N = N0; for(k=0;klogN[j]+((LM0+k)<>1)-QTHETA_OFFSET; /* The number of qtheta bits we'll allocate if the remainder is to be max_bits. The average measured cost for theta is 0.89701 times qb, approximated here as 459/512. */ num=459*(opus_int32)((2*N-1)*offset+max_bits); den=((opus_int32)(2*N-1)<<9)-459; qb = IMIN((num+(den>>1))/den, 57); celt_assert(qb >= 0); max_bits += qb; N <<= 1; } /* Add in the cost of a stereo split, if necessary. */ if (C==2) { max_bits <<= 1; offset = ((m->logN[j]+(i<>1)-(N==2?QTHETA_OFFSET_TWOPHASE:QTHETA_OFFSET); ndof = 2*N-1-(N==2); /* The average measured cost for theta with the step PDF is 0.95164 times qb, approximated here as 487/512. */ num = (N==2?512:487)*(opus_int32)(max_bits+ndof*offset); den = ((opus_int32)ndof<<9)-(N==2?512:487); qb = IMIN((num+(den>>1))/den, (N==2?64:61)); celt_assert(qb >= 0); max_bits += qb; } /* Add the fine bits we'll use. */ /* Compensate for the extra DoF in stereo */ ndof = C*N + ((C==2 && N>2) ? 1 : 0); /* Offset the number of fine bits by log2(N)/2 + FINE_OFFSET compared to their "fair share" of total/N */ offset = ((m->logN[j] + (i<>1)-FINE_OFFSET; /* N=2 is the only point that doesn't match the curve */ if (N==2) offset += 1<>2; /* The number of fine bits we'll allocate if the remainder is to be max_bits. */ num = max_bits+ndof*offset; den = (ndof-1)<>1))/den, MAX_FINE_BITS); celt_assert(qb >= 0); max_bits += C*qb<eBands[j+1]-m->eBands[j])<= 0); celt_assert(max_bits < 256); *cap++ = (unsigned char)max_bits; } } } } #endif /* CUSTOM_MODES */ #define ALLOC_STEPS 6 static OPUS_INLINE int interp_bits2pulses(const CELTMode *m, int start, int end, int skip_start, const int *bits1, const int *bits2, const int *thresh, const int *cap, opus_int32 total, opus_int32 *_balance, int skip_rsv, int *intensity, int intensity_rsv, int *dual_stereo, int dual_stereo_rsv, int *bits, int *ebits, int *fine_priority, int C, int LM, ec_ctx *ec, int encode, int prev, int signalBandwidth) { opus_int32 psum; int lo, hi; int i, j; int logM; int stereo; int codedBands=-1; int alloc_floor; opus_int32 left, percoeff; int done; opus_int32 balance; SAVE_STACK; alloc_floor = C<1; logM = LM<>1; psum = 0; done = 0; for (j=end;j-->start;) { int tmp = bits1[j] + (mid*(opus_int32)bits2[j]>>ALLOC_STEPS); if (tmp >= thresh[j] || done) { done = 1; /* Don't allocate more than we can actually use */ psum += IMIN(tmp, cap[j]); } else { if (tmp >= alloc_floor) psum += alloc_floor; } } if (psum > total) hi = mid; else lo = mid; } psum = 0; /*printf ("interp bisection gave %d\n", lo);*/ done = 0; for (j=end;j-->start;) { int tmp = bits1[j] + ((opus_int32)lo*bits2[j]>>ALLOC_STEPS); if (tmp < thresh[j] && !done) { if (tmp >= alloc_floor) tmp = alloc_floor; else tmp = 0; } else done = 1; /* Don't allocate more than we can actually use */ tmp = IMIN(tmp, cap[j]); bits[j] = tmp; psum += tmp; } /* Decide which bands to skip, working backwards from the end. */ for (codedBands=end;;codedBands--) { int band_width; int band_bits; int rem; j = codedBands-1; /* Never skip the first band, nor a band that has been boosted by dynalloc. In the first case, we'd be coding a bit to signal we're going to waste all the other bits. In the second case, we'd be coding a bit to redistribute all the bits we just signaled should be cocentrated in this band. */ if (j<=skip_start) { /* Give the bit we reserved to end skipping back. */ total += skip_rsv; break; } /*Figure out how many left-over bits we would be adding to this band. This can include bits we've stolen back from higher, skipped bands.*/ left = total-psum; percoeff = celt_udiv(left, m->eBands[codedBands]-m->eBands[start]); left -= (m->eBands[codedBands]-m->eBands[start])*percoeff; rem = IMAX(left-(m->eBands[j]-m->eBands[start]),0); band_width = m->eBands[codedBands]-m->eBands[j]; band_bits = (int)(bits[j] + percoeff*band_width + rem); /*Only code a skip decision if we're above the threshold for this band. Otherwise it is force-skipped. This ensures that we have enough bits to code the skip flag.*/ if (band_bits >= IMAX(thresh[j], alloc_floor+(1< 17) depth_threshold = j (depth_threshold*band_width<>4 && j<=signalBandwidth)) #endif { ec_enc_bit_logp(ec, 1, 1); break; } ec_enc_bit_logp(ec, 0, 1); } else if (ec_dec_bit_logp(ec, 1)) { break; } /*We used a bit to skip this band.*/ psum += 1< 0) intensity_rsv = LOG2_FRAC_TABLE[j-start]; psum += intensity_rsv; if (band_bits >= alloc_floor) { /*If we have enough for a fine energy bit per channel, use it.*/ psum += alloc_floor; bits[j] = alloc_floor; } else { /*Otherwise this band gets nothing at all.*/ bits[j] = 0; } } celt_assert(codedBands > start); /* Code the intensity and dual stereo parameters. */ if (intensity_rsv > 0) { if (encode) { *intensity = IMIN(*intensity, codedBands); ec_enc_uint(ec, *intensity-start, codedBands+1-start); } else *intensity = start+ec_dec_uint(ec, codedBands+1-start); } else *intensity = 0; if (*intensity <= start) { total += dual_stereo_rsv; dual_stereo_rsv = 0; } if (dual_stereo_rsv > 0) { if (encode) ec_enc_bit_logp(ec, *dual_stereo, 1); else *dual_stereo = ec_dec_bit_logp(ec, 1); } else *dual_stereo = 0; /* Allocate the remaining bits */ left = total-psum; percoeff = celt_udiv(left, m->eBands[codedBands]-m->eBands[start]); left -= (m->eBands[codedBands]-m->eBands[start])*percoeff; for (j=start;jeBands[j+1]-m->eBands[j])); for (j=start;jeBands[j+1]-m->eBands[j]); bits[j] += tmp; left -= tmp; } /*for (j=0;j= 0); N0 = m->eBands[j+1]-m->eBands[j]; N=N0<1) { excess = MAX32(bit-cap[j],0); bits[j] = bit-excess; /* Compensate for the extra DoF in stereo */ den=(C*N+ ((C==2 && N>2 && !*dual_stereo && j<*intensity) ? 1 : 0)); NClogN = den*(m->logN[j] + logM); /* Offset for the number of fine bits by log2(N)/2 + FINE_OFFSET compared to their "fair share" of total/N */ offset = (NClogN>>1)-den*FINE_OFFSET; /* N=2 is the only point that doesn't match the curve */ if (N==2) offset += den<>2; /* Changing the offset for allocating the second and third fine energy bit */ if (bits[j] + offset < den*2<>2; else if (bits[j] + offset < den*3<>3; /* Divide with rounding */ ebits[j] = IMAX(0, (bits[j] + offset + (den<<(BITRES-1)))); ebits[j] = celt_udiv(ebits[j], den)>>BITRES; /* Make sure not to bust */ if (C*ebits[j] > (bits[j]>>BITRES)) ebits[j] = bits[j] >> stereo >> BITRES; /* More than that is useless because that's about as far as PVQ can go */ ebits[j] = IMIN(ebits[j], MAX_FINE_BITS); /* If we rounded down or capped this band, make it a candidate for the final fine energy pass */ fine_priority[j] = ebits[j]*(den<= bits[j]+offset; /* Remove the allocated fine bits; the rest are assigned to PVQ */ bits[j] -= C*ebits[j]< 0) { int extra_fine; int extra_bits; extra_fine = IMIN(excess>>(stereo+BITRES),MAX_FINE_BITS-ebits[j]); ebits[j] += extra_fine; extra_bits = extra_fine*C<= excess-balance; excess -= extra_bits; } balance = excess; celt_assert(bits[j] >= 0); celt_assert(ebits[j] >= 0); } /* Save any remaining bits over the cap for the rebalancing in quant_all_bands(). */ *_balance = balance; /* The skipped bands use all their bits for fine energy. */ for (;j> stereo >> BITRES; celt_assert(C*ebits[j]<nbEBands; skip_start = start; /* Reserve a bit to signal the end of manually skipped bands. */ skip_rsv = total >= 1<total) intensity_rsv = 0; else { total -= intensity_rsv; dual_stereo_rsv = total>=1<eBands[j+1]-m->eBands[j])<>4); /* Tilt of the allocation curve */ trim_offset[j] = C*(m->eBands[j+1]-m->eBands[j])*(alloc_trim-5-LM)*(end-j-1) *(1<<(LM+BITRES))>>6; /* Giving less resolution to single-coefficient bands because they get more benefit from having one coarse value per coefficient*/ if ((m->eBands[j+1]-m->eBands[j])<nbAllocVectors - 1; do { int done = 0; int psum = 0; int mid = (lo+hi) >> 1; for (j=end;j-->start;) { int bitsj; int N = m->eBands[j+1]-m->eBands[j]; bitsj = C*N*m->allocVectors[mid*len+j]<>2; if (bitsj > 0) bitsj = IMAX(0, bitsj + trim_offset[j]); bitsj += offsets[j]; if (bitsj >= thresh[j] || done) { done = 1; /* Don't allocate more than we can actually use */ psum += IMIN(bitsj, cap[j]); } else { if (bitsj >= C< total) hi = mid - 1; else lo = mid + 1; /*printf ("lo = %d, hi = %d\n", lo, hi);*/ } while (lo <= hi); hi = lo--; /*printf ("interp between %d and %d\n", lo, hi);*/ for (j=start;jeBands[j+1]-m->eBands[j]; bits1j = C*N*m->allocVectors[lo*len+j]<>2; bits2j = hi>=m->nbAllocVectors ? cap[j] : C*N*m->allocVectors[hi*len+j]<>2; if (bits1j > 0) bits1j = IMAX(0, bits1j + trim_offset[j]); if (bits2j > 0) bits2j = IMAX(0, bits2j + trim_offset[j]); if (lo > 0) bits1j += offsets[j]; bits2j += offsets[j]; if (offsets[j]>0) skip_start = j; bits2j = IMAX(0,bits2j-bits1j); bits1[j] = bits1j; bits2[j] = bits2j; } codedBands = interp_bits2pulses(m, start, end, skip_start, bits1, bits2, thresh, cap, total, balance, skip_rsv, intensity, intensity_rsv, dual_stereo, dual_stereo_rsv, pulses, ebits, fine_priority, C, LM, ec, encode, prev, signalBandwidth); RESTORE_STACK; return codedBands; } mumble-1.3.4/3rdparty/opus-src/celt/_kiss_fft_guts.h0000664000175000017500000001357214010707326022304 0ustar builderbuilder/*Copyright (c) 2003-2004, Mark Borgerding All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.*/ #ifndef KISS_FFT_GUTS_H #define KISS_FFT_GUTS_H #define MIN(a,b) ((a)<(b) ? (a):(b)) #define MAX(a,b) ((a)>(b) ? (a):(b)) /* kiss_fft.h defines kiss_fft_scalar as either short or a float type and defines typedef struct { kiss_fft_scalar r; kiss_fft_scalar i; }kiss_fft_cpx; */ #include "kiss_fft.h" /* Explanation of macros dealing with complex math: C_MUL(m,a,b) : m = a*b C_FIXDIV( c , div ) : if a fixed point impl., c /= div. noop otherwise C_SUB( res, a,b) : res = a - b C_SUBFROM( res , a) : res -= a C_ADDTO( res , a) : res += a * */ #ifdef FIXED_POINT #include "arch.h" #define SAMP_MAX 2147483647 #define TWID_MAX 32767 #define TRIG_UPSCALE 1 #define SAMP_MIN -SAMP_MAX # define S_MUL(a,b) MULT16_32_Q15(b, a) # define C_MUL(m,a,b) \ do{ (m).r = SUB32_ovflw(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)); \ (m).i = ADD32_ovflw(S_MUL((a).r,(b).i) , S_MUL((a).i,(b).r)); }while(0) # define C_MULC(m,a,b) \ do{ (m).r = ADD32_ovflw(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)); \ (m).i = SUB32_ovflw(S_MUL((a).i,(b).r) , S_MUL((a).r,(b).i)); }while(0) # define C_MULBYSCALAR( c, s ) \ do{ (c).r = S_MUL( (c).r , s ) ;\ (c).i = S_MUL( (c).i , s ) ; }while(0) # define DIVSCALAR(x,k) \ (x) = S_MUL( x, (TWID_MAX-((k)>>1))/(k)+1 ) # define C_FIXDIV(c,div) \ do { DIVSCALAR( (c).r , div); \ DIVSCALAR( (c).i , div); }while (0) #define C_ADD( res, a,b)\ do {(res).r=ADD32_ovflw((a).r,(b).r); (res).i=ADD32_ovflw((a).i,(b).i); \ }while(0) #define C_SUB( res, a,b)\ do {(res).r=SUB32_ovflw((a).r,(b).r); (res).i=SUB32_ovflw((a).i,(b).i); \ }while(0) #define C_ADDTO( res , a)\ do {(res).r = ADD32_ovflw((res).r, (a).r); (res).i = ADD32_ovflw((res).i,(a).i);\ }while(0) #define C_SUBFROM( res , a)\ do {(res).r = ADD32_ovflw((res).r,(a).r); (res).i = SUB32_ovflw((res).i,(a).i); \ }while(0) #if defined(OPUS_ARM_INLINE_ASM) #include "arm/kiss_fft_armv4.h" #endif #if defined(OPUS_ARM_INLINE_EDSP) #include "arm/kiss_fft_armv5e.h" #endif #if defined(MIPSr1_ASM) #include "mips/kiss_fft_mipsr1.h" #endif #else /* not FIXED_POINT*/ # define S_MUL(a,b) ( (a)*(b) ) #define C_MUL(m,a,b) \ do{ (m).r = (a).r*(b).r - (a).i*(b).i;\ (m).i = (a).r*(b).i + (a).i*(b).r; }while(0) #define C_MULC(m,a,b) \ do{ (m).r = (a).r*(b).r + (a).i*(b).i;\ (m).i = (a).i*(b).r - (a).r*(b).i; }while(0) #define C_MUL4(m,a,b) C_MUL(m,a,b) # define C_FIXDIV(c,div) /* NOOP */ # define C_MULBYSCALAR( c, s ) \ do{ (c).r *= (s);\ (c).i *= (s); }while(0) #endif #ifndef CHECK_OVERFLOW_OP # define CHECK_OVERFLOW_OP(a,op,b) /* noop */ #endif #ifndef C_ADD #define C_ADD( res, a,b)\ do { \ CHECK_OVERFLOW_OP((a).r,+,(b).r)\ CHECK_OVERFLOW_OP((a).i,+,(b).i)\ (res).r=(a).r+(b).r; (res).i=(a).i+(b).i; \ }while(0) #define C_SUB( res, a,b)\ do { \ CHECK_OVERFLOW_OP((a).r,-,(b).r)\ CHECK_OVERFLOW_OP((a).i,-,(b).i)\ (res).r=(a).r-(b).r; (res).i=(a).i-(b).i; \ }while(0) #define C_ADDTO( res , a)\ do { \ CHECK_OVERFLOW_OP((res).r,+,(a).r)\ CHECK_OVERFLOW_OP((res).i,+,(a).i)\ (res).r += (a).r; (res).i += (a).i;\ }while(0) #define C_SUBFROM( res , a)\ do {\ CHECK_OVERFLOW_OP((res).r,-,(a).r)\ CHECK_OVERFLOW_OP((res).i,-,(a).i)\ (res).r -= (a).r; (res).i -= (a).i; \ }while(0) #endif /* C_ADD defined */ #ifdef FIXED_POINT /*# define KISS_FFT_COS(phase) TRIG_UPSCALE*floor(MIN(32767,MAX(-32767,.5+32768 * cos (phase)))) # define KISS_FFT_SIN(phase) TRIG_UPSCALE*floor(MIN(32767,MAX(-32767,.5+32768 * sin (phase))))*/ # define KISS_FFT_COS(phase) floor(.5+TWID_MAX*cos (phase)) # define KISS_FFT_SIN(phase) floor(.5+TWID_MAX*sin (phase)) # define HALF_OF(x) ((x)>>1) #elif defined(USE_SIMD) # define KISS_FFT_COS(phase) _mm_set1_ps( cos(phase) ) # define KISS_FFT_SIN(phase) _mm_set1_ps( sin(phase) ) # define HALF_OF(x) ((x)*_mm_set1_ps(.5f)) #else # define KISS_FFT_COS(phase) (kiss_fft_scalar) cos(phase) # define KISS_FFT_SIN(phase) (kiss_fft_scalar) sin(phase) # define HALF_OF(x) ((x)*.5f) #endif #define kf_cexp(x,phase) \ do{ \ (x)->r = KISS_FFT_COS(phase);\ (x)->i = KISS_FFT_SIN(phase);\ }while(0) #define kf_cexp2(x,phase) \ do{ \ (x)->r = TRIG_UPSCALE*celt_cos_norm((phase));\ (x)->i = TRIG_UPSCALE*celt_cos_norm((phase)-32768);\ }while(0) #endif /* KISS_FFT_GUTS_H */ mumble-1.3.4/3rdparty/opus-src/celt/tests/0000775000175000017500000000000014010707327020255 5ustar builderbuildermumble-1.3.4/3rdparty/opus-src/celt/tests/test_unit_entropy.c0000664000175000017500000002715614010707327024232 0ustar builderbuilder/* Copyright (c) 2007-2011 Xiph.Org Foundation, Mozilla Corporation, Gregory Maxwell Written by Jean-Marc Valin, Gregory Maxwell, and Timothy B. Terriberry */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include "entcode.h" #include "entenc.h" #include "entdec.h" #include #include "entenc.c" #include "entdec.c" #include "entcode.c" #ifndef M_LOG2E # define M_LOG2E 1.4426950408889634074 #endif #define DATA_SIZE 10000000 #define DATA_SIZE2 10000 int main(int _argc,char **_argv){ ec_enc enc; ec_dec dec; long nbits; long nbits2; double entropy; int ft; int ftb; int sz; int i; int ret; unsigned int sym; unsigned int seed; unsigned char *ptr; const char *env_seed; ret=0; entropy=0; if (_argc > 2) { fprintf(stderr, "Usage: %s []\n", _argv[0]); return 1; } env_seed = getenv("SEED"); if (_argc > 1) seed = atoi(_argv[1]); else if (env_seed) seed = atoi(env_seed); else seed = time(NULL); /*Testing encoding of raw bit values.*/ ptr = (unsigned char *)malloc(DATA_SIZE); ec_enc_init(&enc,ptr, DATA_SIZE); for(ft=2;ft<1024;ft++){ for(i=0;i>(rand()%11U))+1U)+10; sz=rand()/((RAND_MAX>>(rand()%9U))+1U); data=(unsigned *)malloc(sz*sizeof(*data)); tell=(unsigned *)malloc((sz+1)*sizeof(*tell)); ec_enc_init(&enc,ptr,DATA_SIZE2); zeros = rand()%13==0; tell[0]=ec_tell_frac(&enc); for(j=0;j>(rand()%9U))+1U); logp1=(unsigned *)malloc(sz*sizeof(*logp1)); data=(unsigned *)malloc(sz*sizeof(*data)); tell=(unsigned *)malloc((sz+1)*sizeof(*tell)); enc_method=(unsigned *)malloc(sz*sizeof(*enc_method)); ec_enc_init(&enc,ptr,DATA_SIZE2); tell[0]=ec_tell_frac(&enc); for(j=0;j>1)+1); logp1[j]=(rand()%15)+1; enc_method[j]=rand()/((RAND_MAX>>2)+1); switch(enc_method[j]){ case 0:{ ec_encode(&enc,data[j]?(1<>2)+1); switch(dec_method){ case 0:{ fs=ec_decode(&dec,1<=(1<=(1< #include #include "mathops.h" #include "bands.h" #ifdef FIXED_POINT #define WORD "%d" #else #define WORD "%f" #endif int ret = 0; void testdiv(void) { opus_int32 i; for (i=1;i<=327670;i++) { double prod; opus_val32 val; val = celt_rcp(i); #ifdef FIXED_POINT prod = (1./32768./65526.)*val*i; #else prod = val*i; #endif if (fabs(prod-1) > .00025) { fprintf (stderr, "div failed: 1/%d="WORD" (product = %f)\n", i, val, prod); ret = 1; } } } void testsqrt(void) { opus_int32 i; for (i=1;i<=1000000000;i++) { double ratio; opus_val16 val; val = celt_sqrt(i); ratio = val/sqrt(i); if (fabs(ratio - 1) > .0005 && fabs(val-sqrt(i)) > 2) { fprintf (stderr, "sqrt failed: sqrt(%d)="WORD" (ratio = %f)\n", i, val, ratio); ret = 1; } i+= i>>10; } } void testbitexactcos(void) { int i; opus_int32 min_d,max_d,last,chk; chk=max_d=0; last=min_d=32767; for(i=64;i<=16320;i++) { opus_int32 d; opus_int32 q=bitexact_cos(i); chk ^= q*i; d = last - q; if (d>max_d)max_d=d; if (dmax_d)max_d=d; if (d0.0009) { fprintf (stderr, "celt_log2 failed: fabs((1.442695040888963387*log(x))-celt_log2(x))>0.001 (x = %f, error = %f)\n", x,error); ret = 1; } } } void testexp2(void) { float x; for (x=-11.0;x<24.0;x+=0.0007) { float error = fabs(x-(1.442695040888963387*log(celt_exp2(x)))); if (error>0.0002) { fprintf (stderr, "celt_exp2 failed: fabs(x-(1.442695040888963387*log(celt_exp2(x))))>0.0005 (x = %f, error = %f)\n", x,error); ret = 1; } } } void testexp2log2(void) { float x; for (x=-11.0;x<24.0;x+=0.0007) { float error = fabs(x-(celt_log2(celt_exp2(x)))); if (error>0.001) { fprintf (stderr, "celt_log2/celt_exp2 failed: fabs(x-(celt_log2(celt_exp2(x))))>0.001 (x = %f, error = %f)\n", x,error); ret = 1; } } } #else void testlog2(void) { opus_val32 x; for (x=8;x<1073741824;x+=(x>>3)) { float error = fabs((1.442695040888963387*log(x/16384.0))-celt_log2(x)/1024.0); if (error>0.003) { fprintf (stderr, "celt_log2 failed: x = %ld, error = %f\n", (long)x,error); ret = 1; } } } void testexp2(void) { opus_val16 x; for (x=-32768;x<15360;x++) { float error1 = fabs(x/1024.0-(1.442695040888963387*log(celt_exp2(x)/65536.0))); float error2 = fabs(exp(0.6931471805599453094*x/1024.0)-celt_exp2(x)/65536.0); if (error1>0.0002&&error2>0.00004) { fprintf (stderr, "celt_exp2 failed: x = "WORD", error1 = %f, error2 = %f\n", x,error1,error2); ret = 1; } } } void testexp2log2(void) { opus_val32 x; for (x=8;x<65536;x+=(x>>3)) { float error = fabs(x-0.25*celt_exp2(celt_log2(x)))/16384; if (error>0.004) { fprintf (stderr, "celt_log2/celt_exp2 failed: fabs(x-(celt_exp2(celt_log2(x))))>0.001 (x = %ld, error = %f)\n", (long)x,error); ret = 1; } } } void testilog2(void) { opus_val32 x; for (x=1;x<=268435455;x+=127) { opus_val32 lg; opus_val32 y; lg = celt_ilog2(x); if (lg<0 || lg>=31) { printf("celt_ilog2 failed: 0<=celt_ilog2(x)<31 (x = %d, celt_ilog2(x) = %d)\n",x,lg); ret = 1; } y = 1<>1)>=y) { printf("celt_ilog2 failed: 2**celt_ilog2(x)<=x<2**(celt_ilog2(x)+1) (x = %d, 2**celt_ilog2(x) = %d)\n",x,y); ret = 1; } } } #endif int main(void) { testbitexactcos(); testbitexactlog2tan(); testdiv(); testsqrt(); testlog2(); testexp2(); testexp2log2(); #ifdef FIXED_POINT testilog2(); #endif return ret; } mumble-1.3.4/3rdparty/opus-src/celt/tests/test_unit_rotation.c0000664000175000017500000000506014010707327024357 0ustar builderbuilder/* Copyright (c) 2008-2011 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifndef CUSTOM_MODES #define CUSTOM_MODES #endif #define CELT_C #include #include #include "vq.h" #include "bands.h" #include "stack_alloc.h" #include #define MAX_SIZE 100 int ret=0; void test_rotation(int N, int K) { int i; double err = 0, ener = 0, snr, snr0; opus_val16 x0[MAX_SIZE]; opus_val16 x1[MAX_SIZE]; for (i=0;i 20) { fprintf(stderr, "FAIL!\n"); ret = 1; } } int main(void) { ALLOC_STACK; test_rotation(15, 3); test_rotation(23, 5); test_rotation(50, 3); test_rotation(80, 1); return ret; } mumble-1.3.4/3rdparty/opus-src/celt/tests/test_unit_cwrs32.c0000664000175000017500000001057014010707327023645 0ustar builderbuilder/* Copyright (c) 2008-2011 Xiph.Org Foundation, Mozilla Corporation, Gregory Maxwell Written by Jean-Marc Valin, Gregory Maxwell, and Timothy B. Terriberry */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #ifndef CUSTOM_MODES #define CUSTOM_MODES #else #define TEST_CUSTOM_MODES #endif #define CELT_C #include "stack_alloc.h" #include "entenc.c" #include "entdec.c" #include "entcode.c" #include "cwrs.c" #include "mathops.c" #include "rate.h" #define NMAX (240) #define KMAX (128) #ifdef TEST_CUSTOM_MODES #define NDIMS (44) static const int pn[NDIMS]={ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 20, 22, 24, 26, 28, 30, 32, 36, 40, 44, 48, 52, 56, 60, 64, 72, 80, 88, 96, 104, 112, 120, 128, 144, 160, 176, 192, 208 }; static const int pkmax[NDIMS]={ 128, 128, 128, 128, 88, 52, 36, 26, 22, 18, 16, 15, 13, 12, 12, 11, 10, 9, 9, 8, 8, 7, 7, 7, 7, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4 }; #else /* TEST_CUSTOM_MODES */ #define NDIMS (22) static const int pn[NDIMS]={ 2, 3, 4, 6, 8, 9, 11, 12, 16, 18, 22, 24, 32, 36, 44, 48, 64, 72, 88, 96, 144, 176 }; static const int pkmax[NDIMS]={ 128, 128, 128, 88, 36, 26, 18, 16, 12, 11, 9, 9, 7, 7, 6, 6, 5, 5, 5, 5, 4, 4 }; #endif int main(void){ int t; int n; ALLOC_STACK; for(t=0;tpkmax[t])break; printf("Testing CWRS with N=%i, K=%i...\n",n,k); #if defined(SMALL_FOOTPRINT) nc=ncwrs_urow(n,k,uu); #else nc=CELT_PVQ_V(n,k); #endif inc=nc/20000; if(inc<1)inc=1; for(i=0;i");*/ #if defined(SMALL_FOOTPRINT) ii=icwrs(n,k,&v,y,u); #else ii=icwrs(n,y); v=CELT_PVQ_V(n,k); #endif if(ii!=i){ fprintf(stderr,"Combination-index mismatch (%lu!=%lu).\n", (long)ii,(long)i); return 1; } if(v!=nc){ fprintf(stderr,"Combination count mismatch (%lu!=%lu).\n", (long)v,(long)nc); return 2; } /*printf(" %6u\n",i);*/ } /*printf("\n");*/ } } return 0; } mumble-1.3.4/3rdparty/opus-src/celt/tests/test_unit_laplace.c0000664000175000017500000000534114010707327024123 0ustar builderbuilder/* Copyright (c) 2008-2011 Xiph.Org Foundation, Mozilla Corporation Written by Jean-Marc Valin and Timothy B. Terriberry */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "laplace.h" #define CELT_C #include "stack_alloc.h" #include "entenc.c" #include "entdec.c" #include "entcode.c" #include "laplace.c" #define DATA_SIZE 40000 int ec_laplace_get_start_freq(int decay) { opus_uint32 ft = 32768 - LAPLACE_MINP*(2*LAPLACE_NMIN+1); int fs = (ft*(16384-decay))/(16384+decay); return fs+LAPLACE_MINP; } int main(void) { int i; int ret = 0; ec_enc enc; ec_dec dec; unsigned char *ptr; int val[10000], decay[10000]; ALLOC_STACK; ptr = (unsigned char *)malloc(DATA_SIZE); ec_enc_init(&enc,ptr,DATA_SIZE); val[0] = 3; decay[0] = 6000; val[1] = 0; decay[1] = 5800; val[2] = -1; decay[2] = 5600; for (i=3;i<10000;i++) { val[i] = rand()%15-7; decay[i] = rand()%11000+5000; } for (i=0;i<10000;i++) ec_laplace_encode(&enc, &val[i], ec_laplace_get_start_freq(decay[i]), decay[i]); ec_enc_done(&enc); ec_dec_init(&dec,ec_get_buffer(&enc),ec_range_bytes(&enc)); for (i=0;i<10000;i++) { int d = ec_laplace_decode(&dec, ec_laplace_get_start_freq(decay[i]), decay[i]); if (d != val[i]) { fprintf (stderr, "Got %d instead of %d\n", d, val[i]); ret = 1; } } free(ptr); return ret; } mumble-1.3.4/3rdparty/opus-src/celt/tests/test_unit_dft.c0000664000175000017500000001127014010707327023275 0ustar builderbuilder/* Copyright (c) 2008 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "stack_alloc.h" #include "kiss_fft.h" #include "mathops.h" #include "modes.h" #ifndef M_PI #define M_PI 3.141592653 #endif int ret = 0; void check(kiss_fft_cpx * in,kiss_fft_cpx * out,int nfft,int isinverse) { int bin,k; double errpow=0,sigpow=0, snr; for (bin=0;binmdct.kfft[id]; #endif in = (kiss_fft_cpx*)malloc(buflen); out = (kiss_fft_cpx*)malloc(buflen); for (k=0;k1) { int k; for (k=1;k #include "mdct.h" #include "stack_alloc.h" #include "kiss_fft.h" #include "mdct.h" #include "modes.h" #ifndef M_PI #define M_PI 3.141592653 #endif int ret = 0; void check(kiss_fft_scalar * in,kiss_fft_scalar * out,int nfft,int isinverse) { int bin,k; double errpow=0,sigpow=0; double snr; for (bin=0;binmdct; #endif in = (kiss_fft_scalar*)malloc(buflen); in_copy = (kiss_fft_scalar*)malloc(buflen); out = (kiss_fft_scalar*)malloc(buflen); window = (opus_val16*)malloc(sizeof(opus_val16)*nfft/2); for (k=0;k1) { int k; for (k=1;k int main(void) { opus_int16 i = 1; i <<= 14; if (i>>14 != 1) { fprintf(stderr, "opus_int16 isn't 16 bits\n"); return 1; } if (sizeof(opus_int16)*2 != sizeof(opus_int32)) { fprintf(stderr, "16*2 != 32\n"); return 1; } return 0; } mumble-1.3.4/3rdparty/opus-src/celt/mdct.h0000664000175000017500000001125014010707327020212 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2008 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* This is a simple MDCT implementation that uses a N/4 complex FFT to do most of the work. It should be relatively straightforward to plug in pretty much and FFT here. This replaces the Vorbis FFT (and uses the exact same API), which was a bit too messy and that was ending up duplicating code (might as well use the same FFT everywhere). The algorithm is similar to (and inspired from) Fabrice Bellard's MDCT implementation in FFMPEG, but has differences in signs, ordering and scaling in many places. */ #ifndef MDCT_H #define MDCT_H #include "opus_defines.h" #include "kiss_fft.h" #include "arch.h" typedef struct { int n; int maxshift; const kiss_fft_state *kfft[4]; const kiss_twiddle_scalar * OPUS_RESTRICT trig; } mdct_lookup; #if defined(HAVE_ARM_NE10) #include "arm/mdct_arm.h" #endif int clt_mdct_init(mdct_lookup *l,int N, int maxshift, int arch); void clt_mdct_clear(mdct_lookup *l, int arch); /** Compute a forward MDCT and scale by 4/N, trashes the input array */ void clt_mdct_forward_c(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar * OPUS_RESTRICT out, const opus_val16 *window, int overlap, int shift, int stride, int arch); /** Compute a backward MDCT (no scaling) and performs weighted overlap-add (scales implicitly by 1/2) */ void clt_mdct_backward_c(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar * OPUS_RESTRICT out, const opus_val16 * OPUS_RESTRICT window, int overlap, int shift, int stride, int arch); #if !defined(OVERRIDE_OPUS_MDCT) /* Is run-time CPU detection enabled on this platform? */ #if defined(OPUS_HAVE_RTCD) && defined(HAVE_ARM_NE10) extern void (*const CLT_MDCT_FORWARD_IMPL[OPUS_ARCHMASK+1])( const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar * OPUS_RESTRICT out, const opus_val16 *window, int overlap, int shift, int stride, int arch); #define clt_mdct_forward(_l, _in, _out, _window, _overlap, _shift, _stride, _arch) \ ((*CLT_MDCT_FORWARD_IMPL[(arch)&OPUS_ARCHMASK])(_l, _in, _out, \ _window, _overlap, _shift, \ _stride, _arch)) extern void (*const CLT_MDCT_BACKWARD_IMPL[OPUS_ARCHMASK+1])( const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar * OPUS_RESTRICT out, const opus_val16 *window, int overlap, int shift, int stride, int arch); #define clt_mdct_backward(_l, _in, _out, _window, _overlap, _shift, _stride, _arch) \ (*CLT_MDCT_BACKWARD_IMPL[(arch)&OPUS_ARCHMASK])(_l, _in, _out, \ _window, _overlap, _shift, \ _stride, _arch) #else /* if defined(OPUS_HAVE_RTCD) && defined(HAVE_ARM_NE10) */ #define clt_mdct_forward(_l, _in, _out, _window, _overlap, _shift, _stride, _arch) \ clt_mdct_forward_c(_l, _in, _out, _window, _overlap, _shift, _stride, _arch) #define clt_mdct_backward(_l, _in, _out, _window, _overlap, _shift, _stride, _arch) \ clt_mdct_backward_c(_l, _in, _out, _window, _overlap, _shift, _stride, _arch) #endif /* end if defined(OPUS_HAVE_RTCD) && defined(HAVE_ARM_NE10) && !defined(FIXED_POINT) */ #endif /* end if !defined(OVERRIDE_OPUS_MDCT) */ #endif mumble-1.3.4/3rdparty/opus-src/celt/mathops.c0000664000175000017500000001525214010707327020737 0ustar builderbuilder/* Copyright (c) 2002-2008 Jean-Marc Valin Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /** @file mathops.h @brief Various math functions */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "mathops.h" /*Compute floor(sqrt(_val)) with exact arithmetic. This has been tested on all possible 32-bit inputs.*/ unsigned isqrt32(opus_uint32 _val){ unsigned b; unsigned g; int bshift; /*Uses the second method from http://www.azillionmonkeys.com/qed/sqroot.html The main idea is to search for the largest binary digit b such that (g+b)*(g+b) <= _val, and add it to the solution g.*/ g=0; bshift=(EC_ILOG(_val)-1)>>1; b=1U<>=1; bshift--; } while(bshift>=0); return g; } #ifdef FIXED_POINT opus_val32 frac_div32(opus_val32 a, opus_val32 b) { opus_val16 rcp; opus_val32 result, rem; int shift = celt_ilog2(b)-29; a = VSHR32(a,shift); b = VSHR32(b,shift); /* 16-bit reciprocal */ rcp = ROUND16(celt_rcp(ROUND16(b,16)),3); result = MULT16_32_Q15(rcp, a); rem = PSHR32(a,2)-MULT32_32_Q31(result, b); result = ADD32(result, SHL32(MULT16_32_Q15(rcp, rem),2)); if (result >= 536870912) /* 2^29 */ return 2147483647; /* 2^31 - 1 */ else if (result <= -536870912) /* -2^29 */ return -2147483647; /* -2^31 */ else return SHL32(result, 2); } /** Reciprocal sqrt approximation in the range [0.25,1) (Q16 in, Q14 out) */ opus_val16 celt_rsqrt_norm(opus_val32 x) { opus_val16 n; opus_val16 r; opus_val16 r2; opus_val16 y; /* Range of n is [-16384,32767] ([-0.5,1) in Q15). */ n = x-32768; /* Get a rough initial guess for the root. The optimal minimax quadratic approximation (using relative error) is r = 1.437799046117536+n*(-0.823394375837328+n*0.4096419668459485). Coefficients here, and the final result r, are Q14.*/ r = ADD16(23557, MULT16_16_Q15(n, ADD16(-13490, MULT16_16_Q15(n, 6713)))); /* We want y = x*r*r-1 in Q15, but x is 32-bit Q16 and r is Q14. We can compute the result from n and r using Q15 multiplies with some adjustment, carefully done to avoid overflow. Range of y is [-1564,1594]. */ r2 = MULT16_16_Q15(r, r); y = SHL16(SUB16(ADD16(MULT16_16_Q15(r2, n), r2), 16384), 1); /* Apply a 2nd-order Householder iteration: r += r*y*(y*0.375-0.5). This yields the Q14 reciprocal square root of the Q16 x, with a maximum relative error of 1.04956E-4, a (relative) RMSE of 2.80979E-5, and a peak absolute error of 2.26591/16384. */ return ADD16(r, MULT16_16_Q15(r, MULT16_16_Q15(y, SUB16(MULT16_16_Q15(y, 12288), 16384)))); } /** Sqrt approximation (QX input, QX/2 output) */ opus_val32 celt_sqrt(opus_val32 x) { int k; opus_val16 n; opus_val32 rt; static const opus_val16 C[5] = {23175, 11561, -3011, 1699, -664}; if (x==0) return 0; else if (x>=1073741824) return 32767; k = (celt_ilog2(x)>>1)-7; x = VSHR32(x, 2*k); n = x-32768; rt = ADD16(C[0], MULT16_16_Q15(n, ADD16(C[1], MULT16_16_Q15(n, ADD16(C[2], MULT16_16_Q15(n, ADD16(C[3], MULT16_16_Q15(n, (C[4]))))))))); rt = VSHR32(rt,7-k); return rt; } #define L1 32767 #define L2 -7651 #define L3 8277 #define L4 -626 static OPUS_INLINE opus_val16 _celt_cos_pi_2(opus_val16 x) { opus_val16 x2; x2 = MULT16_16_P15(x,x); return ADD16(1,MIN16(32766,ADD32(SUB16(L1,x2), MULT16_16_P15(x2, ADD32(L2, MULT16_16_P15(x2, ADD32(L3, MULT16_16_P15(L4, x2 )))))))); } #undef L1 #undef L2 #undef L3 #undef L4 opus_val16 celt_cos_norm(opus_val32 x) { x = x&0x0001ffff; if (x>SHL32(EXTEND32(1), 16)) x = SUB32(SHL32(EXTEND32(1), 17),x); if (x&0x00007fff) { if (x0, "celt_rcp() only defined for positive values"); i = celt_ilog2(x); /* n is Q15 with range [0,1). */ n = VSHR32(x,i-15)-32768; /* Start with a linear approximation: r = 1.8823529411764706-0.9411764705882353*n. The coefficients and the result are Q14 in the range [15420,30840].*/ r = ADD16(30840, MULT16_16_Q15(-15420, n)); /* Perform two Newton iterations: r -= r*((r*n)-1.Q15) = r*((r*n)+(r-1.Q15)). */ r = SUB16(r, MULT16_16_Q15(r, ADD16(MULT16_16_Q15(r, n), ADD16(r, -32768)))); /* We subtract an extra 1 in the second iteration to avoid overflow; it also neatly compensates for truncation error in the rest of the process. */ r = SUB16(r, ADD16(1, MULT16_16_Q15(r, ADD16(MULT16_16_Q15(r, n), ADD16(r, -32768))))); /* r is now the Q15 solution to 2/(n+1), with a maximum relative error of 7.05346E-5, a (relative) RMSE of 2.14418E-5, and a peak absolute error of 1.24665/32768. */ return VSHR32(EXTEND32(r),i-16); } #endif mumble-1.3.4/3rdparty/opus-src/celt/static_modes_float.h0000664000175000017500000014334714010707327023143 0ustar builderbuilder/* The contents of this file was automatically generated by dump_modes.c with arguments: 48000 960 It contains static definitions for some pre-defined modes. */ #include "modes.h" #include "rate.h" #ifdef HAVE_ARM_NE10 #define OVERRIDE_FFT 1 #include "static_modes_float_arm_ne10.h" #endif #ifndef DEF_WINDOW120 #define DEF_WINDOW120 static const opus_val16 window120[120] = { 6.7286966e-05f, 0.00060551348f, 0.0016815970f, 0.0032947962f, 0.0054439943f, 0.0081276923f, 0.011344001f, 0.015090633f, 0.019364886f, 0.024163635f, 0.029483315f, 0.035319905f, 0.041668911f, 0.048525347f, 0.055883718f, 0.063737999f, 0.072081616f, 0.080907428f, 0.090207705f, 0.099974111f, 0.11019769f, 0.12086883f, 0.13197729f, 0.14351214f, 0.15546177f, 0.16781389f, 0.18055550f, 0.19367290f, 0.20715171f, 0.22097682f, 0.23513243f, 0.24960208f, 0.26436860f, 0.27941419f, 0.29472040f, 0.31026818f, 0.32603788f, 0.34200931f, 0.35816177f, 0.37447407f, 0.39092462f, 0.40749142f, 0.42415215f, 0.44088423f, 0.45766484f, 0.47447104f, 0.49127978f, 0.50806798f, 0.52481261f, 0.54149077f, 0.55807973f, 0.57455701f, 0.59090049f, 0.60708841f, 0.62309951f, 0.63891306f, 0.65450896f, 0.66986776f, 0.68497077f, 0.69980010f, 0.71433873f, 0.72857055f, 0.74248043f, 0.75605424f, 0.76927895f, 0.78214257f, 0.79463430f, 0.80674445f, 0.81846456f, 0.82978733f, 0.84070669f, 0.85121779f, 0.86131698f, 0.87100183f, 0.88027111f, 0.88912479f, 0.89756398f, 0.90559094f, 0.91320904f, 0.92042270f, 0.92723738f, 0.93365955f, 0.93969656f, 0.94535671f, 0.95064907f, 0.95558353f, 0.96017067f, 0.96442171f, 0.96834849f, 0.97196334f, 0.97527906f, 0.97830883f, 0.98106616f, 0.98356480f, 0.98581869f, 0.98784191f, 0.98964856f, 0.99125274f, 0.99266849f, 0.99390969f, 0.99499004f, 0.99592297f, 0.99672162f, 0.99739874f, 0.99796667f, 0.99843728f, 0.99882195f, 0.99913147f, 0.99937606f, 0.99956527f, 0.99970802f, 0.99981248f, 0.99988613f, 0.99993565f, 0.99996697f, 0.99998518f, 0.99999457f, 0.99999859f, 0.99999982f, 1.0000000f, }; #endif #ifndef DEF_LOGN400 #define DEF_LOGN400 static const opus_int16 logN400[21] = { 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 16, 16, 16, 21, 21, 24, 29, 34, 36, }; #endif #ifndef DEF_PULSE_CACHE50 #define DEF_PULSE_CACHE50 static const opus_int16 cache_index50[105] = { -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 41, 41, 41, 82, 82, 123, 164, 200, 222, 0, 0, 0, 0, 0, 0, 0, 0, 41, 41, 41, 41, 123, 123, 123, 164, 164, 240, 266, 283, 295, 41, 41, 41, 41, 41, 41, 41, 41, 123, 123, 123, 123, 240, 240, 240, 266, 266, 305, 318, 328, 336, 123, 123, 123, 123, 123, 123, 123, 123, 240, 240, 240, 240, 305, 305, 305, 318, 318, 343, 351, 358, 364, 240, 240, 240, 240, 240, 240, 240, 240, 305, 305, 305, 305, 343, 343, 343, 351, 351, 370, 376, 382, 387, }; static const unsigned char cache_bits50[392] = { 40, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 40, 15, 23, 28, 31, 34, 36, 38, 39, 41, 42, 43, 44, 45, 46, 47, 47, 49, 50, 51, 52, 53, 54, 55, 55, 57, 58, 59, 60, 61, 62, 63, 63, 65, 66, 67, 68, 69, 70, 71, 71, 40, 20, 33, 41, 48, 53, 57, 61, 64, 66, 69, 71, 73, 75, 76, 78, 80, 82, 85, 87, 89, 91, 92, 94, 96, 98, 101, 103, 105, 107, 108, 110, 112, 114, 117, 119, 121, 123, 124, 126, 128, 40, 23, 39, 51, 60, 67, 73, 79, 83, 87, 91, 94, 97, 100, 102, 105, 107, 111, 115, 118, 121, 124, 126, 129, 131, 135, 139, 142, 145, 148, 150, 153, 155, 159, 163, 166, 169, 172, 174, 177, 179, 35, 28, 49, 65, 78, 89, 99, 107, 114, 120, 126, 132, 136, 141, 145, 149, 153, 159, 165, 171, 176, 180, 185, 189, 192, 199, 205, 211, 216, 220, 225, 229, 232, 239, 245, 251, 21, 33, 58, 79, 97, 112, 125, 137, 148, 157, 166, 174, 182, 189, 195, 201, 207, 217, 227, 235, 243, 251, 17, 35, 63, 86, 106, 123, 139, 152, 165, 177, 187, 197, 206, 214, 222, 230, 237, 250, 25, 31, 55, 75, 91, 105, 117, 128, 138, 146, 154, 161, 168, 174, 180, 185, 190, 200, 208, 215, 222, 229, 235, 240, 245, 255, 16, 36, 65, 89, 110, 128, 144, 159, 173, 185, 196, 207, 217, 226, 234, 242, 250, 11, 41, 74, 103, 128, 151, 172, 191, 209, 225, 241, 255, 9, 43, 79, 110, 138, 163, 186, 207, 227, 246, 12, 39, 71, 99, 123, 144, 164, 182, 198, 214, 228, 241, 253, 9, 44, 81, 113, 142, 168, 192, 214, 235, 255, 7, 49, 90, 127, 160, 191, 220, 247, 6, 51, 95, 134, 170, 203, 234, 7, 47, 87, 123, 155, 184, 212, 237, 6, 52, 97, 137, 174, 208, 240, 5, 57, 106, 151, 192, 231, 5, 59, 111, 158, 202, 243, 5, 55, 103, 147, 187, 224, 5, 60, 113, 161, 206, 248, 4, 65, 122, 175, 224, 4, 67, 127, 182, 234, }; static const unsigned char cache_caps50[168] = { 224, 224, 224, 224, 224, 224, 224, 224, 160, 160, 160, 160, 185, 185, 185, 178, 178, 168, 134, 61, 37, 224, 224, 224, 224, 224, 224, 224, 224, 240, 240, 240, 240, 207, 207, 207, 198, 198, 183, 144, 66, 40, 160, 160, 160, 160, 160, 160, 160, 160, 185, 185, 185, 185, 193, 193, 193, 183, 183, 172, 138, 64, 38, 240, 240, 240, 240, 240, 240, 240, 240, 207, 207, 207, 207, 204, 204, 204, 193, 193, 180, 143, 66, 40, 185, 185, 185, 185, 185, 185, 185, 185, 193, 193, 193, 193, 193, 193, 193, 183, 183, 172, 138, 65, 39, 207, 207, 207, 207, 207, 207, 207, 207, 204, 204, 204, 204, 201, 201, 201, 188, 188, 176, 141, 66, 40, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 194, 194, 194, 184, 184, 173, 139, 65, 39, 204, 204, 204, 204, 204, 204, 204, 204, 201, 201, 201, 201, 198, 198, 198, 187, 187, 175, 140, 66, 40, }; #endif #ifndef FFT_TWIDDLES48000_960 #define FFT_TWIDDLES48000_960 static const kiss_twiddle_cpx fft_twiddles48000_960[480] = { {1.0000000f, -0.0000000f}, {0.99991433f, -0.013089596f}, {0.99965732f, -0.026176948f}, {0.99922904f, -0.039259816f}, {0.99862953f, -0.052335956f}, {0.99785892f, -0.065403129f}, {0.99691733f, -0.078459096f}, {0.99580493f, -0.091501619f}, {0.99452190f, -0.10452846f}, {0.99306846f, -0.11753740f}, {0.99144486f, -0.13052619f}, {0.98965139f, -0.14349262f}, {0.98768834f, -0.15643447f}, {0.98555606f, -0.16934950f}, {0.98325491f, -0.18223553f}, {0.98078528f, -0.19509032f}, {0.97814760f, -0.20791169f}, {0.97534232f, -0.22069744f}, {0.97236992f, -0.23344536f}, {0.96923091f, -0.24615329f}, {0.96592583f, -0.25881905f}, {0.96245524f, -0.27144045f}, {0.95881973f, -0.28401534f}, {0.95501994f, -0.29654157f}, {0.95105652f, -0.30901699f}, {0.94693013f, -0.32143947f}, {0.94264149f, -0.33380686f}, {0.93819134f, -0.34611706f}, {0.93358043f, -0.35836795f}, {0.92880955f, -0.37055744f}, {0.92387953f, -0.38268343f}, {0.91879121f, -0.39474386f}, {0.91354546f, -0.40673664f}, {0.90814317f, -0.41865974f}, {0.90258528f, -0.43051110f}, {0.89687274f, -0.44228869f}, {0.89100652f, -0.45399050f}, {0.88498764f, -0.46561452f}, {0.87881711f, -0.47715876f}, {0.87249601f, -0.48862124f}, {0.86602540f, -0.50000000f}, {0.85940641f, -0.51129309f}, {0.85264016f, -0.52249856f}, {0.84572782f, -0.53361452f}, {0.83867057f, -0.54463904f}, {0.83146961f, -0.55557023f}, {0.82412619f, -0.56640624f}, {0.81664156f, -0.57714519f}, {0.80901699f, -0.58778525f}, {0.80125381f, -0.59832460f}, {0.79335334f, -0.60876143f}, {0.78531693f, -0.61909395f}, {0.77714596f, -0.62932039f}, {0.76884183f, -0.63943900f}, {0.76040597f, -0.64944805f}, {0.75183981f, -0.65934582f}, {0.74314483f, -0.66913061f}, {0.73432251f, -0.67880075f}, {0.72537437f, -0.68835458f}, {0.71630194f, -0.69779046f}, {0.70710678f, -0.70710678f}, {0.69779046f, -0.71630194f}, {0.68835458f, -0.72537437f}, {0.67880075f, -0.73432251f}, {0.66913061f, -0.74314483f}, {0.65934582f, -0.75183981f}, {0.64944805f, -0.76040597f}, {0.63943900f, -0.76884183f}, {0.62932039f, -0.77714596f}, {0.61909395f, -0.78531693f}, {0.60876143f, -0.79335334f}, {0.59832460f, -0.80125381f}, {0.58778525f, -0.80901699f}, {0.57714519f, -0.81664156f}, {0.56640624f, -0.82412619f}, {0.55557023f, -0.83146961f}, {0.54463904f, -0.83867057f}, {0.53361452f, -0.84572782f}, {0.52249856f, -0.85264016f}, {0.51129309f, -0.85940641f}, {0.50000000f, -0.86602540f}, {0.48862124f, -0.87249601f}, {0.47715876f, -0.87881711f}, {0.46561452f, -0.88498764f}, {0.45399050f, -0.89100652f}, {0.44228869f, -0.89687274f}, {0.43051110f, -0.90258528f}, {0.41865974f, -0.90814317f}, {0.40673664f, -0.91354546f}, {0.39474386f, -0.91879121f}, {0.38268343f, -0.92387953f}, {0.37055744f, -0.92880955f}, {0.35836795f, -0.93358043f}, {0.34611706f, -0.93819134f}, {0.33380686f, -0.94264149f}, {0.32143947f, -0.94693013f}, {0.30901699f, -0.95105652f}, {0.29654157f, -0.95501994f}, {0.28401534f, -0.95881973f}, {0.27144045f, -0.96245524f}, {0.25881905f, -0.96592583f}, {0.24615329f, -0.96923091f}, {0.23344536f, -0.97236992f}, {0.22069744f, -0.97534232f}, {0.20791169f, -0.97814760f}, {0.19509032f, -0.98078528f}, {0.18223553f, -0.98325491f}, {0.16934950f, -0.98555606f}, {0.15643447f, -0.98768834f}, {0.14349262f, -0.98965139f}, {0.13052619f, -0.99144486f}, {0.11753740f, -0.99306846f}, {0.10452846f, -0.99452190f}, {0.091501619f, -0.99580493f}, {0.078459096f, -0.99691733f}, {0.065403129f, -0.99785892f}, {0.052335956f, -0.99862953f}, {0.039259816f, -0.99922904f}, {0.026176948f, -0.99965732f}, {0.013089596f, -0.99991433f}, {6.1230318e-17f, -1.0000000f}, {-0.013089596f, -0.99991433f}, {-0.026176948f, -0.99965732f}, {-0.039259816f, -0.99922904f}, {-0.052335956f, -0.99862953f}, {-0.065403129f, -0.99785892f}, {-0.078459096f, -0.99691733f}, {-0.091501619f, -0.99580493f}, {-0.10452846f, -0.99452190f}, {-0.11753740f, -0.99306846f}, {-0.13052619f, -0.99144486f}, {-0.14349262f, -0.98965139f}, {-0.15643447f, -0.98768834f}, {-0.16934950f, -0.98555606f}, {-0.18223553f, -0.98325491f}, {-0.19509032f, -0.98078528f}, {-0.20791169f, -0.97814760f}, {-0.22069744f, -0.97534232f}, {-0.23344536f, -0.97236992f}, {-0.24615329f, -0.96923091f}, {-0.25881905f, -0.96592583f}, {-0.27144045f, -0.96245524f}, {-0.28401534f, -0.95881973f}, {-0.29654157f, -0.95501994f}, {-0.30901699f, -0.95105652f}, {-0.32143947f, -0.94693013f}, {-0.33380686f, -0.94264149f}, {-0.34611706f, -0.93819134f}, {-0.35836795f, -0.93358043f}, {-0.37055744f, -0.92880955f}, {-0.38268343f, -0.92387953f}, {-0.39474386f, -0.91879121f}, {-0.40673664f, -0.91354546f}, {-0.41865974f, -0.90814317f}, {-0.43051110f, -0.90258528f}, {-0.44228869f, -0.89687274f}, {-0.45399050f, -0.89100652f}, {-0.46561452f, -0.88498764f}, {-0.47715876f, -0.87881711f}, {-0.48862124f, -0.87249601f}, {-0.50000000f, -0.86602540f}, {-0.51129309f, -0.85940641f}, {-0.52249856f, -0.85264016f}, {-0.53361452f, -0.84572782f}, {-0.54463904f, -0.83867057f}, {-0.55557023f, -0.83146961f}, {-0.56640624f, -0.82412619f}, {-0.57714519f, -0.81664156f}, {-0.58778525f, -0.80901699f}, {-0.59832460f, -0.80125381f}, {-0.60876143f, -0.79335334f}, {-0.61909395f, -0.78531693f}, {-0.62932039f, -0.77714596f}, {-0.63943900f, -0.76884183f}, {-0.64944805f, -0.76040597f}, {-0.65934582f, -0.75183981f}, {-0.66913061f, -0.74314483f}, {-0.67880075f, -0.73432251f}, {-0.68835458f, -0.72537437f}, {-0.69779046f, -0.71630194f}, {-0.70710678f, -0.70710678f}, {-0.71630194f, -0.69779046f}, {-0.72537437f, -0.68835458f}, {-0.73432251f, -0.67880075f}, {-0.74314483f, -0.66913061f}, {-0.75183981f, -0.65934582f}, {-0.76040597f, -0.64944805f}, {-0.76884183f, -0.63943900f}, {-0.77714596f, -0.62932039f}, {-0.78531693f, -0.61909395f}, {-0.79335334f, -0.60876143f}, {-0.80125381f, -0.59832460f}, {-0.80901699f, -0.58778525f}, {-0.81664156f, -0.57714519f}, {-0.82412619f, -0.56640624f}, {-0.83146961f, -0.55557023f}, {-0.83867057f, -0.54463904f}, {-0.84572782f, -0.53361452f}, {-0.85264016f, -0.52249856f}, {-0.85940641f, -0.51129309f}, {-0.86602540f, -0.50000000f}, {-0.87249601f, -0.48862124f}, {-0.87881711f, -0.47715876f}, {-0.88498764f, -0.46561452f}, {-0.89100652f, -0.45399050f}, {-0.89687274f, -0.44228869f}, {-0.90258528f, -0.43051110f}, {-0.90814317f, -0.41865974f}, {-0.91354546f, -0.40673664f}, {-0.91879121f, -0.39474386f}, {-0.92387953f, -0.38268343f}, {-0.92880955f, -0.37055744f}, {-0.93358043f, -0.35836795f}, {-0.93819134f, -0.34611706f}, {-0.94264149f, -0.33380686f}, {-0.94693013f, -0.32143947f}, {-0.95105652f, -0.30901699f}, {-0.95501994f, -0.29654157f}, {-0.95881973f, -0.28401534f}, {-0.96245524f, -0.27144045f}, {-0.96592583f, -0.25881905f}, {-0.96923091f, -0.24615329f}, {-0.97236992f, -0.23344536f}, {-0.97534232f, -0.22069744f}, {-0.97814760f, -0.20791169f}, {-0.98078528f, -0.19509032f}, {-0.98325491f, -0.18223553f}, {-0.98555606f, -0.16934950f}, {-0.98768834f, -0.15643447f}, {-0.98965139f, -0.14349262f}, {-0.99144486f, -0.13052619f}, {-0.99306846f, -0.11753740f}, {-0.99452190f, -0.10452846f}, {-0.99580493f, -0.091501619f}, {-0.99691733f, -0.078459096f}, {-0.99785892f, -0.065403129f}, {-0.99862953f, -0.052335956f}, {-0.99922904f, -0.039259816f}, {-0.99965732f, -0.026176948f}, {-0.99991433f, -0.013089596f}, {-1.0000000f, -1.2246064e-16f}, {-0.99991433f, 0.013089596f}, {-0.99965732f, 0.026176948f}, {-0.99922904f, 0.039259816f}, {-0.99862953f, 0.052335956f}, {-0.99785892f, 0.065403129f}, {-0.99691733f, 0.078459096f}, {-0.99580493f, 0.091501619f}, {-0.99452190f, 0.10452846f}, {-0.99306846f, 0.11753740f}, {-0.99144486f, 0.13052619f}, {-0.98965139f, 0.14349262f}, {-0.98768834f, 0.15643447f}, {-0.98555606f, 0.16934950f}, {-0.98325491f, 0.18223553f}, {-0.98078528f, 0.19509032f}, {-0.97814760f, 0.20791169f}, {-0.97534232f, 0.22069744f}, {-0.97236992f, 0.23344536f}, {-0.96923091f, 0.24615329f}, {-0.96592583f, 0.25881905f}, {-0.96245524f, 0.27144045f}, {-0.95881973f, 0.28401534f}, {-0.95501994f, 0.29654157f}, {-0.95105652f, 0.30901699f}, {-0.94693013f, 0.32143947f}, {-0.94264149f, 0.33380686f}, {-0.93819134f, 0.34611706f}, {-0.93358043f, 0.35836795f}, {-0.92880955f, 0.37055744f}, {-0.92387953f, 0.38268343f}, {-0.91879121f, 0.39474386f}, {-0.91354546f, 0.40673664f}, {-0.90814317f, 0.41865974f}, {-0.90258528f, 0.43051110f}, {-0.89687274f, 0.44228869f}, {-0.89100652f, 0.45399050f}, {-0.88498764f, 0.46561452f}, {-0.87881711f, 0.47715876f}, {-0.87249601f, 0.48862124f}, {-0.86602540f, 0.50000000f}, {-0.85940641f, 0.51129309f}, {-0.85264016f, 0.52249856f}, {-0.84572782f, 0.53361452f}, {-0.83867057f, 0.54463904f}, {-0.83146961f, 0.55557023f}, {-0.82412619f, 0.56640624f}, {-0.81664156f, 0.57714519f}, {-0.80901699f, 0.58778525f}, {-0.80125381f, 0.59832460f}, {-0.79335334f, 0.60876143f}, {-0.78531693f, 0.61909395f}, {-0.77714596f, 0.62932039f}, {-0.76884183f, 0.63943900f}, {-0.76040597f, 0.64944805f}, {-0.75183981f, 0.65934582f}, {-0.74314483f, 0.66913061f}, {-0.73432251f, 0.67880075f}, {-0.72537437f, 0.68835458f}, {-0.71630194f, 0.69779046f}, {-0.70710678f, 0.70710678f}, {-0.69779046f, 0.71630194f}, {-0.68835458f, 0.72537437f}, {-0.67880075f, 0.73432251f}, {-0.66913061f, 0.74314483f}, {-0.65934582f, 0.75183981f}, {-0.64944805f, 0.76040597f}, {-0.63943900f, 0.76884183f}, {-0.62932039f, 0.77714596f}, {-0.61909395f, 0.78531693f}, {-0.60876143f, 0.79335334f}, {-0.59832460f, 0.80125381f}, {-0.58778525f, 0.80901699f}, {-0.57714519f, 0.81664156f}, {-0.56640624f, 0.82412619f}, {-0.55557023f, 0.83146961f}, {-0.54463904f, 0.83867057f}, {-0.53361452f, 0.84572782f}, {-0.52249856f, 0.85264016f}, {-0.51129309f, 0.85940641f}, {-0.50000000f, 0.86602540f}, {-0.48862124f, 0.87249601f}, {-0.47715876f, 0.87881711f}, {-0.46561452f, 0.88498764f}, {-0.45399050f, 0.89100652f}, {-0.44228869f, 0.89687274f}, {-0.43051110f, 0.90258528f}, {-0.41865974f, 0.90814317f}, {-0.40673664f, 0.91354546f}, {-0.39474386f, 0.91879121f}, {-0.38268343f, 0.92387953f}, {-0.37055744f, 0.92880955f}, {-0.35836795f, 0.93358043f}, {-0.34611706f, 0.93819134f}, {-0.33380686f, 0.94264149f}, {-0.32143947f, 0.94693013f}, {-0.30901699f, 0.95105652f}, {-0.29654157f, 0.95501994f}, {-0.28401534f, 0.95881973f}, {-0.27144045f, 0.96245524f}, {-0.25881905f, 0.96592583f}, {-0.24615329f, 0.96923091f}, {-0.23344536f, 0.97236992f}, {-0.22069744f, 0.97534232f}, {-0.20791169f, 0.97814760f}, {-0.19509032f, 0.98078528f}, {-0.18223553f, 0.98325491f}, {-0.16934950f, 0.98555606f}, {-0.15643447f, 0.98768834f}, {-0.14349262f, 0.98965139f}, {-0.13052619f, 0.99144486f}, {-0.11753740f, 0.99306846f}, {-0.10452846f, 0.99452190f}, {-0.091501619f, 0.99580493f}, {-0.078459096f, 0.99691733f}, {-0.065403129f, 0.99785892f}, {-0.052335956f, 0.99862953f}, {-0.039259816f, 0.99922904f}, {-0.026176948f, 0.99965732f}, {-0.013089596f, 0.99991433f}, {-1.8369095e-16f, 1.0000000f}, {0.013089596f, 0.99991433f}, {0.026176948f, 0.99965732f}, {0.039259816f, 0.99922904f}, {0.052335956f, 0.99862953f}, {0.065403129f, 0.99785892f}, {0.078459096f, 0.99691733f}, {0.091501619f, 0.99580493f}, {0.10452846f, 0.99452190f}, {0.11753740f, 0.99306846f}, {0.13052619f, 0.99144486f}, {0.14349262f, 0.98965139f}, {0.15643447f, 0.98768834f}, {0.16934950f, 0.98555606f}, {0.18223553f, 0.98325491f}, {0.19509032f, 0.98078528f}, {0.20791169f, 0.97814760f}, {0.22069744f, 0.97534232f}, {0.23344536f, 0.97236992f}, {0.24615329f, 0.96923091f}, {0.25881905f, 0.96592583f}, {0.27144045f, 0.96245524f}, {0.28401534f, 0.95881973f}, {0.29654157f, 0.95501994f}, {0.30901699f, 0.95105652f}, {0.32143947f, 0.94693013f}, {0.33380686f, 0.94264149f}, {0.34611706f, 0.93819134f}, {0.35836795f, 0.93358043f}, {0.37055744f, 0.92880955f}, {0.38268343f, 0.92387953f}, {0.39474386f, 0.91879121f}, {0.40673664f, 0.91354546f}, {0.41865974f, 0.90814317f}, {0.43051110f, 0.90258528f}, {0.44228869f, 0.89687274f}, {0.45399050f, 0.89100652f}, {0.46561452f, 0.88498764f}, {0.47715876f, 0.87881711f}, {0.48862124f, 0.87249601f}, {0.50000000f, 0.86602540f}, {0.51129309f, 0.85940641f}, {0.52249856f, 0.85264016f}, {0.53361452f, 0.84572782f}, {0.54463904f, 0.83867057f}, {0.55557023f, 0.83146961f}, {0.56640624f, 0.82412619f}, {0.57714519f, 0.81664156f}, {0.58778525f, 0.80901699f}, {0.59832460f, 0.80125381f}, {0.60876143f, 0.79335334f}, {0.61909395f, 0.78531693f}, {0.62932039f, 0.77714596f}, {0.63943900f, 0.76884183f}, {0.64944805f, 0.76040597f}, {0.65934582f, 0.75183981f}, {0.66913061f, 0.74314483f}, {0.67880075f, 0.73432251f}, {0.68835458f, 0.72537437f}, {0.69779046f, 0.71630194f}, {0.70710678f, 0.70710678f}, {0.71630194f, 0.69779046f}, {0.72537437f, 0.68835458f}, {0.73432251f, 0.67880075f}, {0.74314483f, 0.66913061f}, {0.75183981f, 0.65934582f}, {0.76040597f, 0.64944805f}, {0.76884183f, 0.63943900f}, {0.77714596f, 0.62932039f}, {0.78531693f, 0.61909395f}, {0.79335334f, 0.60876143f}, {0.80125381f, 0.59832460f}, {0.80901699f, 0.58778525f}, {0.81664156f, 0.57714519f}, {0.82412619f, 0.56640624f}, {0.83146961f, 0.55557023f}, {0.83867057f, 0.54463904f}, {0.84572782f, 0.53361452f}, {0.85264016f, 0.52249856f}, {0.85940641f, 0.51129309f}, {0.86602540f, 0.50000000f}, {0.87249601f, 0.48862124f}, {0.87881711f, 0.47715876f}, {0.88498764f, 0.46561452f}, {0.89100652f, 0.45399050f}, {0.89687274f, 0.44228869f}, {0.90258528f, 0.43051110f}, {0.90814317f, 0.41865974f}, {0.91354546f, 0.40673664f}, {0.91879121f, 0.39474386f}, {0.92387953f, 0.38268343f}, {0.92880955f, 0.37055744f}, {0.93358043f, 0.35836795f}, {0.93819134f, 0.34611706f}, {0.94264149f, 0.33380686f}, {0.94693013f, 0.32143947f}, {0.95105652f, 0.30901699f}, {0.95501994f, 0.29654157f}, {0.95881973f, 0.28401534f}, {0.96245524f, 0.27144045f}, {0.96592583f, 0.25881905f}, {0.96923091f, 0.24615329f}, {0.97236992f, 0.23344536f}, {0.97534232f, 0.22069744f}, {0.97814760f, 0.20791169f}, {0.98078528f, 0.19509032f}, {0.98325491f, 0.18223553f}, {0.98555606f, 0.16934950f}, {0.98768834f, 0.15643447f}, {0.98965139f, 0.14349262f}, {0.99144486f, 0.13052619f}, {0.99306846f, 0.11753740f}, {0.99452190f, 0.10452846f}, {0.99580493f, 0.091501619f}, {0.99691733f, 0.078459096f}, {0.99785892f, 0.065403129f}, {0.99862953f, 0.052335956f}, {0.99922904f, 0.039259816f}, {0.99965732f, 0.026176948f}, {0.99991433f, 0.013089596f}, }; #ifndef FFT_BITREV480 #define FFT_BITREV480 static const opus_int16 fft_bitrev480[480] = { 0, 96, 192, 288, 384, 32, 128, 224, 320, 416, 64, 160, 256, 352, 448, 8, 104, 200, 296, 392, 40, 136, 232, 328, 424, 72, 168, 264, 360, 456, 16, 112, 208, 304, 400, 48, 144, 240, 336, 432, 80, 176, 272, 368, 464, 24, 120, 216, 312, 408, 56, 152, 248, 344, 440, 88, 184, 280, 376, 472, 4, 100, 196, 292, 388, 36, 132, 228, 324, 420, 68, 164, 260, 356, 452, 12, 108, 204, 300, 396, 44, 140, 236, 332, 428, 76, 172, 268, 364, 460, 20, 116, 212, 308, 404, 52, 148, 244, 340, 436, 84, 180, 276, 372, 468, 28, 124, 220, 316, 412, 60, 156, 252, 348, 444, 92, 188, 284, 380, 476, 1, 97, 193, 289, 385, 33, 129, 225, 321, 417, 65, 161, 257, 353, 449, 9, 105, 201, 297, 393, 41, 137, 233, 329, 425, 73, 169, 265, 361, 457, 17, 113, 209, 305, 401, 49, 145, 241, 337, 433, 81, 177, 273, 369, 465, 25, 121, 217, 313, 409, 57, 153, 249, 345, 441, 89, 185, 281, 377, 473, 5, 101, 197, 293, 389, 37, 133, 229, 325, 421, 69, 165, 261, 357, 453, 13, 109, 205, 301, 397, 45, 141, 237, 333, 429, 77, 173, 269, 365, 461, 21, 117, 213, 309, 405, 53, 149, 245, 341, 437, 85, 181, 277, 373, 469, 29, 125, 221, 317, 413, 61, 157, 253, 349, 445, 93, 189, 285, 381, 477, 2, 98, 194, 290, 386, 34, 130, 226, 322, 418, 66, 162, 258, 354, 450, 10, 106, 202, 298, 394, 42, 138, 234, 330, 426, 74, 170, 266, 362, 458, 18, 114, 210, 306, 402, 50, 146, 242, 338, 434, 82, 178, 274, 370, 466, 26, 122, 218, 314, 410, 58, 154, 250, 346, 442, 90, 186, 282, 378, 474, 6, 102, 198, 294, 390, 38, 134, 230, 326, 422, 70, 166, 262, 358, 454, 14, 110, 206, 302, 398, 46, 142, 238, 334, 430, 78, 174, 270, 366, 462, 22, 118, 214, 310, 406, 54, 150, 246, 342, 438, 86, 182, 278, 374, 470, 30, 126, 222, 318, 414, 62, 158, 254, 350, 446, 94, 190, 286, 382, 478, 3, 99, 195, 291, 387, 35, 131, 227, 323, 419, 67, 163, 259, 355, 451, 11, 107, 203, 299, 395, 43, 139, 235, 331, 427, 75, 171, 267, 363, 459, 19, 115, 211, 307, 403, 51, 147, 243, 339, 435, 83, 179, 275, 371, 467, 27, 123, 219, 315, 411, 59, 155, 251, 347, 443, 91, 187, 283, 379, 475, 7, 103, 199, 295, 391, 39, 135, 231, 327, 423, 71, 167, 263, 359, 455, 15, 111, 207, 303, 399, 47, 143, 239, 335, 431, 79, 175, 271, 367, 463, 23, 119, 215, 311, 407, 55, 151, 247, 343, 439, 87, 183, 279, 375, 471, 31, 127, 223, 319, 415, 63, 159, 255, 351, 447, 95, 191, 287, 383, 479, }; #endif #ifndef FFT_BITREV240 #define FFT_BITREV240 static const opus_int16 fft_bitrev240[240] = { 0, 48, 96, 144, 192, 16, 64, 112, 160, 208, 32, 80, 128, 176, 224, 4, 52, 100, 148, 196, 20, 68, 116, 164, 212, 36, 84, 132, 180, 228, 8, 56, 104, 152, 200, 24, 72, 120, 168, 216, 40, 88, 136, 184, 232, 12, 60, 108, 156, 204, 28, 76, 124, 172, 220, 44, 92, 140, 188, 236, 1, 49, 97, 145, 193, 17, 65, 113, 161, 209, 33, 81, 129, 177, 225, 5, 53, 101, 149, 197, 21, 69, 117, 165, 213, 37, 85, 133, 181, 229, 9, 57, 105, 153, 201, 25, 73, 121, 169, 217, 41, 89, 137, 185, 233, 13, 61, 109, 157, 205, 29, 77, 125, 173, 221, 45, 93, 141, 189, 237, 2, 50, 98, 146, 194, 18, 66, 114, 162, 210, 34, 82, 130, 178, 226, 6, 54, 102, 150, 198, 22, 70, 118, 166, 214, 38, 86, 134, 182, 230, 10, 58, 106, 154, 202, 26, 74, 122, 170, 218, 42, 90, 138, 186, 234, 14, 62, 110, 158, 206, 30, 78, 126, 174, 222, 46, 94, 142, 190, 238, 3, 51, 99, 147, 195, 19, 67, 115, 163, 211, 35, 83, 131, 179, 227, 7, 55, 103, 151, 199, 23, 71, 119, 167, 215, 39, 87, 135, 183, 231, 11, 59, 107, 155, 203, 27, 75, 123, 171, 219, 43, 91, 139, 187, 235, 15, 63, 111, 159, 207, 31, 79, 127, 175, 223, 47, 95, 143, 191, 239, }; #endif #ifndef FFT_BITREV120 #define FFT_BITREV120 static const opus_int16 fft_bitrev120[120] = { 0, 24, 48, 72, 96, 8, 32, 56, 80, 104, 16, 40, 64, 88, 112, 4, 28, 52, 76, 100, 12, 36, 60, 84, 108, 20, 44, 68, 92, 116, 1, 25, 49, 73, 97, 9, 33, 57, 81, 105, 17, 41, 65, 89, 113, 5, 29, 53, 77, 101, 13, 37, 61, 85, 109, 21, 45, 69, 93, 117, 2, 26, 50, 74, 98, 10, 34, 58, 82, 106, 18, 42, 66, 90, 114, 6, 30, 54, 78, 102, 14, 38, 62, 86, 110, 22, 46, 70, 94, 118, 3, 27, 51, 75, 99, 11, 35, 59, 83, 107, 19, 43, 67, 91, 115, 7, 31, 55, 79, 103, 15, 39, 63, 87, 111, 23, 47, 71, 95, 119, }; #endif #ifndef FFT_BITREV60 #define FFT_BITREV60 static const opus_int16 fft_bitrev60[60] = { 0, 12, 24, 36, 48, 4, 16, 28, 40, 52, 8, 20, 32, 44, 56, 1, 13, 25, 37, 49, 5, 17, 29, 41, 53, 9, 21, 33, 45, 57, 2, 14, 26, 38, 50, 6, 18, 30, 42, 54, 10, 22, 34, 46, 58, 3, 15, 27, 39, 51, 7, 19, 31, 43, 55, 11, 23, 35, 47, 59, }; #endif #ifndef FFT_STATE48000_960_0 #define FFT_STATE48000_960_0 static const kiss_fft_state fft_state48000_960_0 = { 480, /* nfft */ 0.002083333f, /* scale */ -1, /* shift */ {5, 96, 3, 32, 4, 8, 2, 4, 4, 1, 0, 0, 0, 0, 0, 0, }, /* factors */ fft_bitrev480, /* bitrev */ fft_twiddles48000_960, /* bitrev */ #ifdef OVERRIDE_FFT (arch_fft_state *)&cfg_arch_480, #else NULL, #endif }; #endif #ifndef FFT_STATE48000_960_1 #define FFT_STATE48000_960_1 static const kiss_fft_state fft_state48000_960_1 = { 240, /* nfft */ 0.004166667f, /* scale */ 1, /* shift */ {5, 48, 3, 16, 4, 4, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */ fft_bitrev240, /* bitrev */ fft_twiddles48000_960, /* bitrev */ #ifdef OVERRIDE_FFT (arch_fft_state *)&cfg_arch_240, #else NULL, #endif }; #endif #ifndef FFT_STATE48000_960_2 #define FFT_STATE48000_960_2 static const kiss_fft_state fft_state48000_960_2 = { 120, /* nfft */ 0.008333333f, /* scale */ 2, /* shift */ {5, 24, 3, 8, 2, 4, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */ fft_bitrev120, /* bitrev */ fft_twiddles48000_960, /* bitrev */ #ifdef OVERRIDE_FFT (arch_fft_state *)&cfg_arch_120, #else NULL, #endif }; #endif #ifndef FFT_STATE48000_960_3 #define FFT_STATE48000_960_3 static const kiss_fft_state fft_state48000_960_3 = { 60, /* nfft */ 0.016666667f, /* scale */ 3, /* shift */ {5, 12, 3, 4, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */ fft_bitrev60, /* bitrev */ fft_twiddles48000_960, /* bitrev */ #ifdef OVERRIDE_FFT (arch_fft_state *)&cfg_arch_60, #else NULL, #endif }; #endif #endif #ifndef MDCT_TWIDDLES960 #define MDCT_TWIDDLES960 static const opus_val16 mdct_twiddles960[1800] = { 0.99999994f, 0.99999321f, 0.99997580f, 0.99994773f, 0.99990886f, 0.99985933f, 0.99979913f, 0.99972820f, 0.99964654f, 0.99955416f, 0.99945110f, 0.99933738f, 0.99921292f, 0.99907774f, 0.99893188f, 0.99877530f, 0.99860805f, 0.99843007f, 0.99824142f, 0.99804211f, 0.99783206f, 0.99761140f, 0.99737996f, 0.99713790f, 0.99688518f, 0.99662173f, 0.99634761f, 0.99606287f, 0.99576741f, 0.99546129f, 0.99514455f, 0.99481714f, 0.99447906f, 0.99413031f, 0.99377096f, 0.99340093f, 0.99302030f, 0.99262899f, 0.99222708f, 0.99181455f, 0.99139136f, 0.99095762f, 0.99051321f, 0.99005818f, 0.98959261f, 0.98911643f, 0.98862964f, 0.98813224f, 0.98762429f, 0.98710573f, 0.98657662f, 0.98603696f, 0.98548669f, 0.98492593f, 0.98435456f, 0.98377270f, 0.98318028f, 0.98257732f, 0.98196387f, 0.98133987f, 0.98070538f, 0.98006040f, 0.97940493f, 0.97873890f, 0.97806245f, 0.97737551f, 0.97667813f, 0.97597027f, 0.97525197f, 0.97452319f, 0.97378403f, 0.97303438f, 0.97227436f, 0.97150391f, 0.97072303f, 0.96993178f, 0.96913016f, 0.96831810f, 0.96749574f, 0.96666300f, 0.96581990f, 0.96496642f, 0.96410263f, 0.96322852f, 0.96234411f, 0.96144938f, 0.96054435f, 0.95962906f, 0.95870346f, 0.95776761f, 0.95682150f, 0.95586514f, 0.95489854f, 0.95392174f, 0.95293468f, 0.95193744f, 0.95093000f, 0.94991243f, 0.94888461f, 0.94784665f, 0.94679856f, 0.94574034f, 0.94467193f, 0.94359344f, 0.94250488f, 0.94140619f, 0.94029742f, 0.93917859f, 0.93804967f, 0.93691075f, 0.93576175f, 0.93460274f, 0.93343377f, 0.93225473f, 0.93106574f, 0.92986679f, 0.92865789f, 0.92743903f, 0.92621022f, 0.92497152f, 0.92372292f, 0.92246443f, 0.92119598f, 0.91991776f, 0.91862965f, 0.91733170f, 0.91602397f, 0.91470635f, 0.91337901f, 0.91204184f, 0.91069490f, 0.90933824f, 0.90797186f, 0.90659571f, 0.90520984f, 0.90381432f, 0.90240908f, 0.90099424f, 0.89956969f, 0.89813554f, 0.89669174f, 0.89523834f, 0.89377540f, 0.89230281f, 0.89082074f, 0.88932908f, 0.88782793f, 0.88631725f, 0.88479710f, 0.88326746f, 0.88172835f, 0.88017982f, 0.87862182f, 0.87705445f, 0.87547767f, 0.87389153f, 0.87229604f, 0.87069118f, 0.86907703f, 0.86745358f, 0.86582077f, 0.86417878f, 0.86252749f, 0.86086690f, 0.85919720f, 0.85751826f, 0.85583007f, 0.85413277f, 0.85242635f, 0.85071075f, 0.84898609f, 0.84725231f, 0.84550947f, 0.84375757f, 0.84199661f, 0.84022665f, 0.83844769f, 0.83665979f, 0.83486289f, 0.83305705f, 0.83124226f, 0.82941860f, 0.82758605f, 0.82574469f, 0.82389444f, 0.82203537f, 0.82016748f, 0.81829083f, 0.81640542f, 0.81451124f, 0.81260836f, 0.81069672f, 0.80877650f, 0.80684757f, 0.80490994f, 0.80296379f, 0.80100900f, 0.79904562f, 0.79707366f, 0.79509324f, 0.79310423f, 0.79110676f, 0.78910083f, 0.78708643f, 0.78506362f, 0.78303236f, 0.78099275f, 0.77894479f, 0.77688843f, 0.77482378f, 0.77275085f, 0.77066964f, 0.76858020f, 0.76648247f, 0.76437658f, 0.76226246f, 0.76014024f, 0.75800985f, 0.75587130f, 0.75372469f, 0.75157005f, 0.74940729f, 0.74723655f, 0.74505776f, 0.74287105f, 0.74067634f, 0.73847371f, 0.73626316f, 0.73404479f, 0.73181850f, 0.72958434f, 0.72734243f, 0.72509271f, 0.72283524f, 0.72057003f, 0.71829706f, 0.71601641f, 0.71372813f, 0.71143216f, 0.70912862f, 0.70681745f, 0.70449871f, 0.70217246f, 0.69983864f, 0.69749737f, 0.69514859f, 0.69279242f, 0.69042879f, 0.68805778f, 0.68567938f, 0.68329364f, 0.68090063f, 0.67850029f, 0.67609268f, 0.67367786f, 0.67125577f, 0.66882652f, 0.66639012f, 0.66394657f, 0.66149592f, 0.65903819f, 0.65657341f, 0.65410155f, 0.65162271f, 0.64913690f, 0.64664418f, 0.64414448f, 0.64163786f, 0.63912445f, 0.63660413f, 0.63407701f, 0.63154310f, 0.62900239f, 0.62645501f, 0.62390089f, 0.62134010f, 0.61877263f, 0.61619854f, 0.61361790f, 0.61103064f, 0.60843682f, 0.60583651f, 0.60322970f, 0.60061646f, 0.59799677f, 0.59537065f, 0.59273821f, 0.59009939f, 0.58745426f, 0.58480281f, 0.58214509f, 0.57948118f, 0.57681108f, 0.57413477f, 0.57145232f, 0.56876373f, 0.56606907f, 0.56336832f, 0.56066155f, 0.55794877f, 0.55523002f, 0.55250537f, 0.54977477f, 0.54703826f, 0.54429591f, 0.54154772f, 0.53879374f, 0.53603399f, 0.53326851f, 0.53049731f, 0.52772039f, 0.52493787f, 0.52214974f, 0.51935595f, 0.51655668f, 0.51375180f, 0.51094145f, 0.50812566f, 0.50530440f, 0.50247771f, 0.49964568f, 0.49680826f, 0.49396557f, 0.49111754f, 0.48826426f, 0.48540577f, 0.48254207f, 0.47967321f, 0.47679919f, 0.47392011f, 0.47103590f, 0.46814668f, 0.46525243f, 0.46235323f, 0.45944905f, 0.45653993f, 0.45362595f, 0.45070711f, 0.44778344f, 0.44485497f, 0.44192174f, 0.43898380f, 0.43604112f, 0.43309379f, 0.43014181f, 0.42718524f, 0.42422408f, 0.42125839f, 0.41828820f, 0.41531351f, 0.41233435f, 0.40935081f, 0.40636289f, 0.40337059f, 0.40037400f, 0.39737311f, 0.39436796f, 0.39135858f, 0.38834500f, 0.38532731f, 0.38230544f, 0.37927949f, 0.37624949f, 0.37321547f, 0.37017745f, 0.36713544f, 0.36408952f, 0.36103970f, 0.35798600f, 0.35492846f, 0.35186714f, 0.34880206f, 0.34573323f, 0.34266070f, 0.33958447f, 0.33650464f, 0.33342120f, 0.33033419f, 0.32724363f, 0.32414958f, 0.32105204f, 0.31795108f, 0.31484672f, 0.31173897f, 0.30862790f, 0.30551350f, 0.30239585f, 0.29927495f, 0.29615086f, 0.29302359f, 0.28989318f, 0.28675964f, 0.28362307f, 0.28048345f, 0.27734083f, 0.27419522f, 0.27104670f, 0.26789525f, 0.26474094f, 0.26158381f, 0.25842386f, 0.25526115f, 0.25209570f, 0.24892756f, 0.24575676f, 0.24258332f, 0.23940729f, 0.23622867f, 0.23304754f, 0.22986393f, 0.22667783f, 0.22348931f, 0.22029841f, 0.21710514f, 0.21390954f, 0.21071166f, 0.20751151f, 0.20430915f, 0.20110460f, 0.19789790f, 0.19468907f, 0.19147816f, 0.18826519f, 0.18505022f, 0.18183327f, 0.17861435f, 0.17539354f, 0.17217083f, 0.16894630f, 0.16571994f, 0.16249183f, 0.15926196f, 0.15603039f, 0.15279715f, 0.14956227f, 0.14632578f, 0.14308774f, 0.13984816f, 0.13660708f, 0.13336454f, 0.13012058f, 0.12687522f, 0.12362850f, 0.12038045f, 0.11713112f, 0.11388054f, 0.11062872f, 0.10737573f, 0.10412160f, 0.10086634f, 0.097609997f, 0.094352618f, 0.091094226f, 0.087834857f, 0.084574550f, 0.081313334f, 0.078051247f, 0.074788325f, 0.071524605f, 0.068260118f, 0.064994894f, 0.061728980f, 0.058462404f, 0.055195201f, 0.051927410f, 0.048659060f, 0.045390189f, 0.042120833f, 0.038851023f, 0.035580799f, 0.032310195f, 0.029039243f, 0.025767982f, 0.022496443f, 0.019224664f, 0.015952680f, 0.012680525f, 0.0094082337f, 0.0061358409f, 0.0028633832f, -0.00040910527f, -0.0036815894f, -0.0069540343f, -0.010226404f, -0.013498665f, -0.016770782f, -0.020042717f, -0.023314439f, -0.026585912f, -0.029857099f, -0.033127967f, -0.036398482f, -0.039668605f, -0.042938303f, -0.046207540f, -0.049476285f, -0.052744497f, -0.056012146f, -0.059279196f, -0.062545612f, -0.065811358f, -0.069076397f, -0.072340697f, -0.075604223f, -0.078866936f, -0.082128808f, -0.085389800f, -0.088649876f, -0.091909006f, -0.095167145f, -0.098424271f, -0.10168034f, -0.10493532f, -0.10818918f, -0.11144188f, -0.11469338f, -0.11794366f, -0.12119267f, -0.12444039f, -0.12768677f, -0.13093179f, -0.13417540f, -0.13741758f, -0.14065829f, -0.14389749f, -0.14713514f, -0.15037122f, -0.15360570f, -0.15683852f, -0.16006967f, -0.16329910f, -0.16652679f, -0.16975269f, -0.17297678f, -0.17619900f, -0.17941935f, -0.18263777f, -0.18585424f, -0.18906870f, -0.19228116f, -0.19549155f, -0.19869985f, -0.20190603f, -0.20511003f, -0.20831184f, -0.21151142f, -0.21470875f, -0.21790376f, -0.22109644f, -0.22428675f, -0.22747467f, -0.23066014f, -0.23384315f, -0.23702365f, -0.24020162f, -0.24337701f, -0.24654980f, -0.24971995f, -0.25288740f, -0.25605217f, -0.25921419f, -0.26237345f, -0.26552987f, -0.26868346f, -0.27183419f, -0.27498198f, -0.27812684f, -0.28126872f, -0.28440759f, -0.28754342f, -0.29067615f, -0.29380578f, -0.29693225f, -0.30005556f, -0.30317566f, -0.30629250f, -0.30940607f, -0.31251630f, -0.31562322f, -0.31872672f, -0.32182685f, -0.32492352f, -0.32801670f, -0.33110636f, -0.33419248f, -0.33727503f, -0.34035397f, -0.34342924f, -0.34650084f, -0.34956875f, -0.35263291f, -0.35569328f, -0.35874987f, -0.36180258f, -0.36485144f, -0.36789638f, -0.37093741f, -0.37397444f, -0.37700745f, -0.38003644f, -0.38306138f, -0.38608220f, -0.38909888f, -0.39211139f, -0.39511973f, -0.39812380f, -0.40112361f, -0.40411916f, -0.40711036f, -0.41009718f, -0.41307965f, -0.41605768f, -0.41903123f, -0.42200032f, -0.42496487f, -0.42792490f, -0.43088034f, -0.43383113f, -0.43677729f, -0.43971881f, -0.44265559f, -0.44558764f, -0.44851488f, -0.45143735f, -0.45435500f, -0.45726776f, -0.46017563f, -0.46307856f, -0.46597654f, -0.46886954f, -0.47175750f, -0.47464043f, -0.47751826f, -0.48039100f, -0.48325855f, -0.48612097f, -0.48897815f, -0.49183011f, -0.49467680f, -0.49751821f, -0.50035429f, -0.50318497f, -0.50601029f, -0.50883019f, -0.51164466f, -0.51445359f, -0.51725709f, -0.52005500f, -0.52284735f, -0.52563411f, -0.52841520f, -0.53119069f, -0.53396046f, -0.53672451f, -0.53948283f, -0.54223537f, -0.54498214f, -0.54772300f, -0.55045801f, -0.55318713f, -0.55591035f, -0.55862761f, -0.56133890f, -0.56404412f, -0.56674337f, -0.56943649f, -0.57212353f, -0.57480448f, -0.57747924f, -0.58014780f, -0.58281022f, -0.58546633f, -0.58811617f, -0.59075975f, -0.59339696f, -0.59602785f, -0.59865236f, -0.60127044f, -0.60388207f, -0.60648727f, -0.60908598f, -0.61167812f, -0.61426371f, -0.61684275f, -0.61941516f, -0.62198097f, -0.62454009f, -0.62709254f, -0.62963831f, -0.63217729f, -0.63470948f, -0.63723493f, -0.63975352f, -0.64226526f, -0.64477009f, -0.64726806f, -0.64975911f, -0.65224314f, -0.65472025f, -0.65719032f, -0.65965337f, -0.66210932f, -0.66455823f, -0.66700000f, -0.66943461f, -0.67186207f, -0.67428231f, -0.67669535f, -0.67910111f, -0.68149966f, -0.68389088f, -0.68627477f, -0.68865126f, -0.69102043f, -0.69338220f, -0.69573659f, -0.69808346f, -0.70042288f, -0.70275480f, -0.70507920f, -0.70739603f, -0.70970529f, -0.71200693f, -0.71430099f, -0.71658736f, -0.71886611f, -0.72113711f, -0.72340041f, -0.72565591f, -0.72790372f, -0.73014367f, -0.73237586f, -0.73460019f, -0.73681659f, -0.73902518f, -0.74122584f, -0.74341851f, -0.74560326f, -0.74778003f, -0.74994880f, -0.75210953f, -0.75426215f, -0.75640678f, -0.75854325f, -0.76067162f, -0.76279181f, -0.76490390f, -0.76700771f, -0.76910341f, -0.77119076f, -0.77326995f, -0.77534080f, -0.77740335f, -0.77945763f, -0.78150350f, -0.78354102f, -0.78557014f, -0.78759086f, -0.78960317f, -0.79160696f, -0.79360235f, -0.79558921f, -0.79756755f, -0.79953730f, -0.80149853f, -0.80345118f, -0.80539525f, -0.80733067f, -0.80925739f, -0.81117553f, -0.81308490f, -0.81498563f, -0.81687760f, -0.81876087f, -0.82063532f, -0.82250100f, -0.82435787f, -0.82620591f, -0.82804507f, -0.82987541f, -0.83169687f, -0.83350939f, -0.83531296f, -0.83710766f, -0.83889335f, -0.84067005f, -0.84243774f, -0.84419644f, -0.84594607f, -0.84768665f, -0.84941816f, -0.85114056f, -0.85285389f, -0.85455805f, -0.85625303f, -0.85793889f, -0.85961550f, -0.86128294f, -0.86294121f, -0.86459017f, -0.86622989f, -0.86786032f, -0.86948150f, -0.87109333f, -0.87269586f, -0.87428904f, -0.87587279f, -0.87744725f, -0.87901229f, -0.88056785f, -0.88211405f, -0.88365078f, -0.88517809f, -0.88669586f, -0.88820416f, -0.88970292f, -0.89119220f, -0.89267188f, -0.89414203f, -0.89560264f, -0.89705360f, -0.89849502f, -0.89992678f, -0.90134889f, -0.90276134f, -0.90416414f, -0.90555727f, -0.90694070f, -0.90831441f, -0.90967834f, -0.91103262f, -0.91237706f, -0.91371179f, -0.91503674f, -0.91635185f, -0.91765714f, -0.91895264f, -0.92023826f, -0.92151409f, -0.92277998f, -0.92403603f, -0.92528218f, -0.92651838f, -0.92774469f, -0.92896110f, -0.93016750f, -0.93136400f, -0.93255049f, -0.93372697f, -0.93489349f, -0.93604994f, -0.93719643f, -0.93833286f, -0.93945926f, -0.94057560f, -0.94168180f, -0.94277799f, -0.94386405f, -0.94494003f, -0.94600588f, -0.94706154f, -0.94810712f, -0.94914252f, -0.95016778f, -0.95118284f, -0.95218778f, -0.95318246f, -0.95416695f, -0.95514119f, -0.95610523f, -0.95705903f, -0.95800257f, -0.95893586f, -0.95985889f, -0.96077162f, -0.96167403f, -0.96256620f, -0.96344805f, -0.96431959f, -0.96518075f, -0.96603161f, -0.96687216f, -0.96770233f, -0.96852213f, -0.96933156f, -0.97013056f, -0.97091925f, -0.97169751f, -0.97246534f, -0.97322279f, -0.97396982f, -0.97470641f, -0.97543252f, -0.97614825f, -0.97685349f, -0.97754824f, -0.97823256f, -0.97890645f, -0.97956979f, -0.98022264f, -0.98086500f, -0.98149687f, -0.98211825f, -0.98272908f, -0.98332942f, -0.98391914f, -0.98449844f, -0.98506713f, -0.98562527f, -0.98617285f, -0.98670989f, -0.98723638f, -0.98775226f, -0.98825759f, -0.98875231f, -0.98923647f, -0.98971003f, -0.99017298f, -0.99062532f, -0.99106705f, -0.99149817f, -0.99191868f, -0.99232858f, -0.99272782f, -0.99311644f, -0.99349445f, -0.99386179f, -0.99421853f, -0.99456459f, -0.99489999f, -0.99522477f, -0.99553883f, -0.99584228f, -0.99613506f, -0.99641716f, -0.99668860f, -0.99694937f, -0.99719942f, -0.99743885f, -0.99766755f, -0.99788558f, -0.99809295f, -0.99828959f, -0.99847561f, -0.99865085f, -0.99881548f, -0.99896932f, -0.99911255f, -0.99924499f, -0.99936682f, -0.99947786f, -0.99957830f, -0.99966794f, -0.99974692f, -0.99981517f, -0.99987274f, -0.99991959f, -0.99995571f, -0.99998116f, -0.99999589f, 0.99999964f, 0.99997288f, 0.99990326f, 0.99979085f, 0.99963558f, 0.99943751f, 0.99919659f, 0.99891287f, 0.99858636f, 0.99821711f, 0.99780506f, 0.99735034f, 0.99685282f, 0.99631262f, 0.99572974f, 0.99510419f, 0.99443603f, 0.99372530f, 0.99297196f, 0.99217612f, 0.99133772f, 0.99045694f, 0.98953366f, 0.98856801f, 0.98756003f, 0.98650974f, 0.98541719f, 0.98428243f, 0.98310548f, 0.98188645f, 0.98062533f, 0.97932225f, 0.97797716f, 0.97659022f, 0.97516143f, 0.97369087f, 0.97217858f, 0.97062469f, 0.96902919f, 0.96739221f, 0.96571374f, 0.96399397f, 0.96223283f, 0.96043050f, 0.95858705f, 0.95670253f, 0.95477700f, 0.95281059f, 0.95080340f, 0.94875544f, 0.94666684f, 0.94453770f, 0.94236809f, 0.94015813f, 0.93790787f, 0.93561745f, 0.93328691f, 0.93091643f, 0.92850608f, 0.92605597f, 0.92356616f, 0.92103678f, 0.91846794f, 0.91585976f, 0.91321236f, 0.91052586f, 0.90780038f, 0.90503591f, 0.90223277f, 0.89939094f, 0.89651060f, 0.89359182f, 0.89063478f, 0.88763964f, 0.88460642f, 0.88153529f, 0.87842643f, 0.87527996f, 0.87209594f, 0.86887461f, 0.86561602f, 0.86232042f, 0.85898781f, 0.85561842f, 0.85221243f, 0.84876984f, 0.84529096f, 0.84177583f, 0.83822471f, 0.83463764f, 0.83101481f, 0.82735640f, 0.82366252f, 0.81993335f, 0.81616908f, 0.81236988f, 0.80853581f, 0.80466717f, 0.80076402f, 0.79682660f, 0.79285502f, 0.78884947f, 0.78481019f, 0.78073722f, 0.77663082f, 0.77249116f, 0.76831841f, 0.76411277f, 0.75987434f, 0.75560343f, 0.75130010f, 0.74696463f, 0.74259710f, 0.73819780f, 0.73376691f, 0.72930455f, 0.72481096f, 0.72028631f, 0.71573079f, 0.71114463f, 0.70652801f, 0.70188117f, 0.69720417f, 0.69249737f, 0.68776089f, 0.68299496f, 0.67819971f, 0.67337549f, 0.66852236f, 0.66364062f, 0.65873051f, 0.65379208f, 0.64882571f, 0.64383155f, 0.63880974f, 0.63376063f, 0.62868434f, 0.62358117f, 0.61845124f, 0.61329484f, 0.60811216f, 0.60290343f, 0.59766883f, 0.59240872f, 0.58712316f, 0.58181250f, 0.57647687f, 0.57111657f, 0.56573176f, 0.56032276f, 0.55488980f, 0.54943299f, 0.54395270f, 0.53844911f, 0.53292239f, 0.52737290f, 0.52180082f, 0.51620632f, 0.51058978f, 0.50495136f, 0.49929130f, 0.49360985f, 0.48790723f, 0.48218375f, 0.47643960f, 0.47067502f, 0.46489030f, 0.45908567f, 0.45326138f, 0.44741765f, 0.44155475f, 0.43567297f, 0.42977250f, 0.42385364f, 0.41791660f, 0.41196167f, 0.40598908f, 0.39999911f, 0.39399201f, 0.38796803f, 0.38192743f, 0.37587047f, 0.36979741f, 0.36370850f, 0.35760403f, 0.35148421f, 0.34534934f, 0.33919969f, 0.33303553f, 0.32685706f, 0.32066461f, 0.31445843f, 0.30823877f, 0.30200592f, 0.29576012f, 0.28950164f, 0.28323078f, 0.27694780f, 0.27065292f, 0.26434645f, 0.25802869f, 0.25169984f, 0.24536023f, 0.23901010f, 0.23264973f, 0.22627939f, 0.21989937f, 0.21350993f, 0.20711134f, 0.20070387f, 0.19428782f, 0.18786344f, 0.18143101f, 0.17499080f, 0.16854310f, 0.16208819f, 0.15562633f, 0.14915779f, 0.14268288f, 0.13620184f, 0.12971498f, 0.12322257f, 0.11672486f, 0.11022217f, 0.10371475f, 0.097202882f, 0.090686858f, 0.084166944f, 0.077643424f, 0.071116582f, 0.064586692f, 0.058054037f, 0.051518895f, 0.044981543f, 0.038442269f, 0.031901345f, 0.025359053f, 0.018815678f, 0.012271495f, 0.0057267868f, -0.00081816671f, -0.0073630852f, -0.013907688f, -0.020451695f, -0.026994826f, -0.033536803f, -0.040077340f, -0.046616159f, -0.053152986f, -0.059687532f, -0.066219524f, -0.072748676f, -0.079274714f, -0.085797355f, -0.092316322f, -0.098831341f, -0.10534211f, -0.11184838f, -0.11834986f, -0.12484626f, -0.13133731f, -0.13782275f, -0.14430228f, -0.15077563f, -0.15724251f, -0.16370267f, -0.17015581f, -0.17660165f, -0.18303993f, -0.18947038f, -0.19589271f, -0.20230664f, -0.20871192f, -0.21510825f, -0.22149536f, -0.22787298f, -0.23424086f, -0.24059868f, -0.24694622f, -0.25328314f, -0.25960925f, -0.26592422f, -0.27222782f, -0.27851975f, -0.28479972f, -0.29106751f, -0.29732284f, -0.30356544f, -0.30979502f, -0.31601134f, -0.32221413f, -0.32840309f, -0.33457801f, -0.34073856f, -0.34688455f, -0.35301566f, -0.35913166f, -0.36523229f, -0.37131724f, -0.37738630f, -0.38343921f, -0.38947567f, -0.39549544f, -0.40149832f, -0.40748394f, -0.41345215f, -0.41940263f, -0.42533514f, -0.43124944f, -0.43714526f, -0.44302234f, -0.44888046f, -0.45471936f, -0.46053877f, -0.46633846f, -0.47211814f, -0.47787762f, -0.48361665f, -0.48933494f, -0.49503228f, -0.50070840f, -0.50636309f, -0.51199609f, -0.51760709f, -0.52319598f, -0.52876246f, -0.53430629f, -0.53982723f, -0.54532504f, -0.55079949f, -0.55625033f, -0.56167740f, -0.56708032f, -0.57245898f, -0.57781315f, -0.58314258f, -0.58844697f, -0.59372622f, -0.59897995f, -0.60420811f, -0.60941035f, -0.61458647f, -0.61973625f, -0.62485951f, -0.62995601f, -0.63502556f, -0.64006782f, -0.64508271f, -0.65007001f, -0.65502942f, -0.65996075f, -0.66486382f, -0.66973841f, -0.67458433f, -0.67940134f, -0.68418926f, -0.68894786f, -0.69367695f, -0.69837630f, -0.70304573f, -0.70768511f, -0.71229410f, -0.71687263f, -0.72142041f, -0.72593731f, -0.73042315f, -0.73487765f, -0.73930067f, -0.74369204f, -0.74805158f, -0.75237900f, -0.75667429f, -0.76093709f, -0.76516730f, -0.76936477f, -0.77352923f, -0.77766061f, -0.78175867f, -0.78582323f, -0.78985411f, -0.79385114f, -0.79781419f, -0.80174309f, -0.80563760f, -0.80949765f, -0.81332302f, -0.81711352f, -0.82086903f, -0.82458937f, -0.82827437f, -0.83192390f, -0.83553779f, -0.83911592f, -0.84265804f, -0.84616417f, -0.84963393f, -0.85306740f, -0.85646427f, -0.85982448f, -0.86314780f, -0.86643422f, -0.86968350f, -0.87289548f, -0.87607014f, -0.87920725f, -0.88230664f, -0.88536829f, -0.88839203f, -0.89137769f, -0.89432514f, -0.89723432f, -0.90010506f, -0.90293723f, -0.90573072f, -0.90848541f, -0.91120118f, -0.91387796f, -0.91651553f, -0.91911387f, -0.92167282f, -0.92419231f, -0.92667222f, -0.92911243f, -0.93151283f, -0.93387336f, -0.93619382f, -0.93847424f, -0.94071442f, -0.94291431f, -0.94507378f, -0.94719279f, -0.94927126f, -0.95130903f, -0.95330608f, -0.95526224f, -0.95717752f, -0.95905179f, -0.96088499f, -0.96267700f, -0.96442777f, -0.96613729f, -0.96780539f, -0.96943200f, -0.97101706f, -0.97256058f, -0.97406244f, -0.97552258f, -0.97694093f, -0.97831738f, -0.97965199f, -0.98094457f, -0.98219514f, -0.98340368f, -0.98457009f, -0.98569429f, -0.98677629f, -0.98781598f, -0.98881340f, -0.98976845f, -0.99068111f, -0.99155134f, -0.99237907f, -0.99316430f, -0.99390697f, -0.99460709f, -0.99526459f, -0.99587947f, -0.99645168f, -0.99698120f, -0.99746799f, -0.99791211f, -0.99831343f, -0.99867201f, -0.99898779f, -0.99926084f, -0.99949104f, -0.99967843f, -0.99982297f, -0.99992472f, -0.99998361f, 0.99999869f, 0.99989158f, 0.99961317f, 0.99916345f, 0.99854255f, 0.99775058f, 0.99678761f, 0.99565387f, 0.99434954f, 0.99287480f, 0.99122995f, 0.98941529f, 0.98743105f, 0.98527765f, 0.98295540f, 0.98046476f, 0.97780609f, 0.97497988f, 0.97198665f, 0.96882683f, 0.96550101f, 0.96200979f, 0.95835376f, 0.95453346f, 0.95054960f, 0.94640291f, 0.94209403f, 0.93762374f, 0.93299282f, 0.92820197f, 0.92325211f, 0.91814411f, 0.91287869f, 0.90745693f, 0.90187967f, 0.89614785f, 0.89026248f, 0.88422459f, 0.87803519f, 0.87169534f, 0.86520612f, 0.85856867f, 0.85178405f, 0.84485358f, 0.83777827f, 0.83055943f, 0.82319832f, 0.81569612f, 0.80805415f, 0.80027372f, 0.79235619f, 0.78430289f, 0.77611518f, 0.76779449f, 0.75934225f, 0.75075996f, 0.74204898f, 0.73321080f, 0.72424710f, 0.71515924f, 0.70594883f, 0.69661748f, 0.68716675f, 0.67759830f, 0.66791373f, 0.65811473f, 0.64820296f, 0.63818014f, 0.62804794f, 0.61780810f, 0.60746247f, 0.59701276f, 0.58646071f, 0.57580817f, 0.56505698f, 0.55420899f, 0.54326600f, 0.53222996f, 0.52110273f, 0.50988621f, 0.49858227f, 0.48719296f, 0.47572014f, 0.46416581f, 0.45253196f, 0.44082057f, 0.42903364f, 0.41717321f, 0.40524128f, 0.39323992f, 0.38117120f, 0.36903715f, 0.35683987f, 0.34458145f, 0.33226398f, 0.31988961f, 0.30746040f, 0.29497850f, 0.28244606f, 0.26986524f, 0.25723818f, 0.24456702f, 0.23185398f, 0.21910121f, 0.20631088f, 0.19348522f, 0.18062639f, 0.16773662f, 0.15481812f, 0.14187308f, 0.12890373f, 0.11591230f, 0.10290100f, 0.089872077f, 0.076827750f, 0.063770257f, 0.050701842f, 0.037624735f, 0.024541186f, 0.011453429f, -0.0016362892f, -0.014725727f, -0.027812643f, -0.040894791f, -0.053969935f, -0.067035832f, -0.080090240f, -0.093130924f, -0.10615565f, -0.11916219f, -0.13214831f, -0.14511178f, -0.15805040f, -0.17096193f, -0.18384418f, -0.19669491f, -0.20951195f, -0.22229309f, -0.23503613f, -0.24773891f, -0.26039925f, -0.27301496f, -0.28558388f, -0.29810387f, -0.31057280f, -0.32298848f, -0.33534884f, -0.34765175f, -0.35989508f, -0.37207675f, -0.38419467f, -0.39624676f, -0.40823093f, -0.42014518f, -0.43198743f, -0.44375566f, -0.45544785f, -0.46706200f, -0.47859612f, -0.49004826f, -0.50141639f, -0.51269865f, -0.52389306f, -0.53499764f, -0.54601061f, -0.55693001f, -0.56775403f, -0.57848072f, -0.58910829f, -0.59963489f, -0.61005878f, -0.62037814f, -0.63059121f, -0.64069623f, -0.65069145f, -0.66057515f, -0.67034572f, -0.68000144f, -0.68954057f, -0.69896162f, -0.70826286f, -0.71744281f, -0.72649974f, -0.73543227f, -0.74423873f, -0.75291771f, -0.76146764f, -0.76988715f, -0.77817470f, -0.78632891f, -0.79434842f, -0.80223179f, -0.80997771f, -0.81758487f, -0.82505190f, -0.83237761f, -0.83956063f, -0.84659988f, -0.85349399f, -0.86024189f, -0.86684239f, -0.87329435f, -0.87959671f, -0.88574833f, -0.89174819f, -0.89759529f, -0.90328854f, -0.90882701f, -0.91420978f, -0.91943592f, -0.92450452f, -0.92941469f, -0.93416560f, -0.93875647f, -0.94318646f, -0.94745487f, -0.95156091f, -0.95550388f, -0.95928317f, -0.96289814f, -0.96634805f, -0.96963239f, -0.97275060f, -0.97570217f, -0.97848648f, -0.98110318f, -0.98355180f, -0.98583186f, -0.98794299f, -0.98988485f, -0.99165714f, -0.99325943f, -0.99469161f, -0.99595332f, -0.99704438f, -0.99796462f, -0.99871385f, -0.99929196f, -0.99969882f, -0.99993443f, 0.99999464f, 0.99956632f, 0.99845290f, 0.99665523f, 0.99417448f, 0.99101239f, 0.98717111f, 0.98265326f, 0.97746199f, 0.97160077f, 0.96507365f, 0.95788515f, 0.95004016f, 0.94154406f, 0.93240267f, 0.92262226f, 0.91220951f, 0.90117162f, 0.88951606f, 0.87725091f, 0.86438453f, 0.85092574f, 0.83688372f, 0.82226819f, 0.80708915f, 0.79135692f, 0.77508235f, 0.75827658f, 0.74095112f, 0.72311783f, 0.70478898f, 0.68597710f, 0.66669506f, 0.64695615f, 0.62677377f, 0.60616189f, 0.58513457f, 0.56370622f, 0.54189157f, 0.51970547f, 0.49716324f, 0.47428027f, 0.45107225f, 0.42755505f, 0.40374488f, 0.37965798f, 0.35531086f, 0.33072025f, 0.30590299f, 0.28087607f, 0.25565663f, 0.23026201f, 0.20470956f, 0.17901683f, 0.15320139f, 0.12728097f, 0.10127331f, 0.075196236f, 0.049067631f, 0.022905400f, -0.0032725304f, -0.029448219f, -0.055603724f, -0.081721120f, -0.10778251f, -0.13377003f, -0.15966587f, -0.18545228f, -0.21111161f, -0.23662624f, -0.26197869f, -0.28715160f, -0.31212771f, -0.33688989f, -0.36142120f, -0.38570482f, -0.40972409f, -0.43346253f, -0.45690393f, -0.48003218f, -0.50283146f, -0.52528608f, -0.54738069f, -0.56910020f, -0.59042966f, -0.61135447f, -0.63186026f, -0.65193301f, -0.67155898f, -0.69072473f, -0.70941705f, -0.72762316f, -0.74533063f, -0.76252723f, -0.77920127f, -0.79534131f, -0.81093621f, -0.82597536f, -0.84044844f, -0.85434550f, -0.86765707f, -0.88037395f, -0.89248747f, -0.90398932f, -0.91487163f, -0.92512697f, -0.93474823f, -0.94372886f, -0.95206273f, -0.95974404f, -0.96676767f, -0.97312868f, -0.97882277f, -0.98384601f, -0.98819500f, -0.99186671f, -0.99485862f, -0.99716878f, -0.99879545f, -0.99973762f, }; #endif static const CELTMode mode48000_960_120 = { 48000, /* Fs */ 120, /* overlap */ 21, /* nbEBands */ 21, /* effEBands */ {0.85000610f, 0.0000000f, 1.0000000f, 1.0000000f, }, /* preemph */ eband5ms, /* eBands */ 3, /* maxLM */ 8, /* nbShortMdcts */ 120, /* shortMdctSize */ 11, /* nbAllocVectors */ band_allocation, /* allocVectors */ logN400, /* logN */ window120, /* window */ {1920, 3, {&fft_state48000_960_0, &fft_state48000_960_1, &fft_state48000_960_2, &fft_state48000_960_3, }, mdct_twiddles960}, /* mdct */ {392, cache_index50, cache_bits50, cache_caps50}, /* cache */ }; /* List of all the available modes */ #define TOTAL_MODES 1 static const CELTMode * const static_mode_list[TOTAL_MODES] = { &mode48000_960_120, }; mumble-1.3.4/3rdparty/opus-src/celt/celt_encoder.c0000664000175000017500000024017014010707327021711 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2010 Xiph.Org Foundation Copyright (c) 2008 Gregory Maxwell Written by Jean-Marc Valin and Gregory Maxwell */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #define CELT_ENCODER_C #include "cpu_support.h" #include "os_support.h" #include "mdct.h" #include #include "celt.h" #include "pitch.h" #include "bands.h" #include "modes.h" #include "entcode.h" #include "quant_bands.h" #include "rate.h" #include "stack_alloc.h" #include "mathops.h" #include "float_cast.h" #include #include "celt_lpc.h" #include "vq.h" /** Encoder state @brief Encoder state */ struct OpusCustomEncoder { const OpusCustomMode *mode; /**< Mode used by the encoder */ int channels; int stream_channels; int force_intra; int clip; int disable_pf; int complexity; int upsample; int start, end; opus_int32 bitrate; int vbr; int signalling; int constrained_vbr; /* If zero, VBR can do whatever it likes with the rate */ int loss_rate; int lsb_depth; int lfe; int disable_inv; int arch; /* Everything beyond this point gets cleared on a reset */ #define ENCODER_RESET_START rng opus_uint32 rng; int spread_decision; opus_val32 delayedIntra; int tonal_average; int lastCodedBands; int hf_average; int tapset_decision; int prefilter_period; opus_val16 prefilter_gain; int prefilter_tapset; #ifdef RESYNTH int prefilter_period_old; opus_val16 prefilter_gain_old; int prefilter_tapset_old; #endif int consec_transient; AnalysisInfo analysis; SILKInfo silk_info; opus_val32 preemph_memE[2]; opus_val32 preemph_memD[2]; /* VBR-related parameters */ opus_int32 vbr_reservoir; opus_int32 vbr_drift; opus_int32 vbr_offset; opus_int32 vbr_count; opus_val32 overlap_max; opus_val16 stereo_saving; int intensity; opus_val16 *energy_mask; opus_val16 spec_avg; #ifdef RESYNTH /* +MAX_PERIOD/2 to make space for overlap */ celt_sig syn_mem[2][2*MAX_PERIOD+MAX_PERIOD/2]; #endif celt_sig in_mem[1]; /* Size = channels*mode->overlap */ /* celt_sig prefilter_mem[], Size = channels*COMBFILTER_MAXPERIOD */ /* opus_val16 oldBandE[], Size = channels*mode->nbEBands */ /* opus_val16 oldLogE[], Size = channels*mode->nbEBands */ /* opus_val16 oldLogE2[], Size = channels*mode->nbEBands */ /* opus_val16 energyError[], Size = channels*mode->nbEBands */ }; int celt_encoder_get_size(int channels) { CELTMode *mode = opus_custom_mode_create(48000, 960, NULL); return opus_custom_encoder_get_size(mode, channels); } OPUS_CUSTOM_NOSTATIC int opus_custom_encoder_get_size(const CELTMode *mode, int channels) { int size = sizeof(struct CELTEncoder) + (channels*mode->overlap-1)*sizeof(celt_sig) /* celt_sig in_mem[channels*mode->overlap]; */ + channels*COMBFILTER_MAXPERIOD*sizeof(celt_sig) /* celt_sig prefilter_mem[channels*COMBFILTER_MAXPERIOD]; */ + 4*channels*mode->nbEBands*sizeof(opus_val16); /* opus_val16 oldBandE[channels*mode->nbEBands]; */ /* opus_val16 oldLogE[channels*mode->nbEBands]; */ /* opus_val16 oldLogE2[channels*mode->nbEBands]; */ /* opus_val16 energyError[channels*mode->nbEBands]; */ return size; } #ifdef CUSTOM_MODES CELTEncoder *opus_custom_encoder_create(const CELTMode *mode, int channels, int *error) { int ret; CELTEncoder *st = (CELTEncoder *)opus_alloc(opus_custom_encoder_get_size(mode, channels)); /* init will handle the NULL case */ ret = opus_custom_encoder_init(st, mode, channels); if (ret != OPUS_OK) { opus_custom_encoder_destroy(st); st = NULL; } if (error) *error = ret; return st; } #endif /* CUSTOM_MODES */ static int opus_custom_encoder_init_arch(CELTEncoder *st, const CELTMode *mode, int channels, int arch) { if (channels < 0 || channels > 2) return OPUS_BAD_ARG; if (st==NULL || mode==NULL) return OPUS_ALLOC_FAIL; OPUS_CLEAR((char*)st, opus_custom_encoder_get_size(mode, channels)); st->mode = mode; st->stream_channels = st->channels = channels; st->upsample = 1; st->start = 0; st->end = st->mode->effEBands; st->signalling = 1; st->arch = arch; st->constrained_vbr = 1; st->clip = 1; st->bitrate = OPUS_BITRATE_MAX; st->vbr = 0; st->force_intra = 0; st->complexity = 5; st->lsb_depth=24; opus_custom_encoder_ctl(st, OPUS_RESET_STATE); return OPUS_OK; } #ifdef CUSTOM_MODES int opus_custom_encoder_init(CELTEncoder *st, const CELTMode *mode, int channels) { return opus_custom_encoder_init_arch(st, mode, channels, opus_select_arch()); } #endif int celt_encoder_init(CELTEncoder *st, opus_int32 sampling_rate, int channels, int arch) { int ret; ret = opus_custom_encoder_init_arch(st, opus_custom_mode_create(48000, 960, NULL), channels, arch); if (ret != OPUS_OK) return ret; st->upsample = resampling_factor(sampling_rate); return OPUS_OK; } #ifdef CUSTOM_MODES void opus_custom_encoder_destroy(CELTEncoder *st) { opus_free(st); } #endif /* CUSTOM_MODES */ static int transient_analysis(const opus_val32 * OPUS_RESTRICT in, int len, int C, opus_val16 *tf_estimate, int *tf_chan, int allow_weak_transients, int *weak_transient) { int i; VARDECL(opus_val16, tmp); opus_val32 mem0,mem1; int is_transient = 0; opus_int32 mask_metric = 0; int c; opus_val16 tf_max; int len2; /* Forward masking: 6.7 dB/ms. */ #ifdef FIXED_POINT int forward_shift = 4; #else opus_val16 forward_decay = QCONST16(.0625f,15); #endif /* Table of 6*64/x, trained on real data to minimize the average error */ static const unsigned char inv_table[128] = { 255,255,156,110, 86, 70, 59, 51, 45, 40, 37, 33, 31, 28, 26, 25, 23, 22, 21, 20, 19, 18, 17, 16, 16, 15, 15, 14, 13, 13, 12, 12, 12, 12, 11, 11, 11, 10, 10, 10, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, }; SAVE_STACK; ALLOC(tmp, len, opus_val16); *weak_transient = 0; /* For lower bitrates, let's be more conservative and have a forward masking decay of 3.3 dB/ms. This avoids having to code transients at very low bitrate (mostly for hybrid), which can result in unstable energy and/or partial collapse. */ if (allow_weak_transients) { #ifdef FIXED_POINT forward_shift = 5; #else forward_decay = QCONST16(.03125f,15); #endif } len2=len/2; for (c=0;c=0;i--) { /* Backward masking: 13.9 dB/ms. */ #ifdef FIXED_POINT /* FIXME: Use PSHR16() instead */ tmp[i] = mem0 + PSHR32(tmp[i]-mem0,3); #else tmp[i] = mem0 + MULT16_16_P15(QCONST16(0.125f,15),tmp[i]-mem0); #endif mem0 = tmp[i]; maxE = MAX16(maxE, mem0); } /*for (i=0;i>1))); #else mean = celt_sqrt(mean * maxE*.5*len2); #endif /* Inverse of the mean energy in Q15+6 */ norm = SHL32(EXTEND32(len2),6+14)/ADD32(EPSILON,SHR32(mean,1)); /* Compute harmonic mean discarding the unreliable boundaries The data is smooth, so we only take 1/4th of the samples */ unmask=0; for (i=12;imask_metric) { *tf_chan = c; mask_metric = unmask; } } is_transient = mask_metric>200; /* For low bitrates, define "weak transients" that need to be handled differently to avoid partial collapse. */ if (allow_weak_transients && is_transient && mask_metric<600) { is_transient = 0; *weak_transient = 1; } /* Arbitrary metric for VBR boost */ tf_max = MAX16(0,celt_sqrt(27*mask_metric)-42); /* *tf_estimate = 1 + MIN16(1, sqrt(MAX16(0, tf_max-30))/20); */ *tf_estimate = celt_sqrt(MAX32(0, SHL32(MULT16_16(QCONST16(0.0069,14),MIN16(163,tf_max)),14)-QCONST32(0.139,28))); /*printf("%d %f\n", tf_max, mask_metric);*/ RESTORE_STACK; #ifdef FUZZING is_transient = rand()&0x1; #endif /*printf("%d %f %d\n", is_transient, (float)*tf_estimate, tf_max);*/ return is_transient; } /* Looks for sudden increases of energy to decide whether we need to patch the transient decision */ static int patch_transient_decision(opus_val16 *newE, opus_val16 *oldE, int nbEBands, int start, int end, int C) { int i, c; opus_val32 mean_diff=0; opus_val16 spread_old[26]; /* Apply an aggressive (-6 dB/Bark) spreading function to the old frame to avoid false detection caused by irrelevant bands */ if (C==1) { spread_old[start] = oldE[start]; for (i=start+1;i=start;i--) spread_old[i] = MAX16(spread_old[i], spread_old[i+1]-QCONST16(1.0f, DB_SHIFT)); /* Compute mean increase */ c=0; do { for (i=IMAX(2,start);i QCONST16(1.f, DB_SHIFT); } /** Apply window and compute the MDCT for all sub-frames and all channels in a frame */ static void compute_mdcts(const CELTMode *mode, int shortBlocks, celt_sig * OPUS_RESTRICT in, celt_sig * OPUS_RESTRICT out, int C, int CC, int LM, int upsample, int arch) { const int overlap = mode->overlap; int N; int B; int shift; int i, b, c; if (shortBlocks) { B = shortBlocks; N = mode->shortMdctSize; shift = mode->maxLM; } else { B = 1; N = mode->shortMdctSize<maxLM-LM; } c=0; do { for (b=0;bmdct, in+c*(B*N+overlap)+b*N, &out[b+c*N*B], mode->window, overlap, shift, B, arch); } } while (++ceBands[len]-m->eBands[len-1])<eBands[len]-m->eBands[len-1])<eBands[i+1]-m->eBands[i])<eBands[i+1]-m->eBands[i])==1; OPUS_COPY(tmp, &X[tf_chan*N0 + (m->eBands[i]<eBands[i]<>LM, 1<>k, 1<=0;i--) { if (tf_res[i+1] == 1) tf_res[i] = path1[i+1]; else tf_res[i] = path0[i+1]; } /*printf("%d %f\n", *tf_sum, tf_estimate);*/ RESTORE_STACK; #ifdef FUZZING tf_select = rand()&0x1; tf_res[0] = rand()&0x1; for (i=1;istorage*8; tell = ec_tell(enc); logp = isTransient ? 2 : 4; /* Reserve space to code the tf_select decision. */ tf_select_rsv = LM>0 && tell+logp+1 <= budget; budget -= tf_select_rsv; curr = tf_changed = 0; for (i=start;i> 10; trim = QCONST16(4.f, 8) + QCONST16(1.f/16.f, 8)*frac; } if (C==2) { opus_val16 sum = 0; /* Q10 */ opus_val16 minXC; /* Q10 */ /* Compute inter-channel correlation for low frequencies */ for (i=0;i<8;i++) { opus_val32 partial; partial = celt_inner_prod(&X[m->eBands[i]<eBands[i]<eBands[i+1]-m->eBands[i])<eBands[i]<eBands[i]<eBands[i+1]-m->eBands[i])<nbEBands]*(opus_int32)(2+2*i-end); } } while (++cvalid) { trim -= MAX16(-QCONST16(2.f, 8), MIN16(QCONST16(2.f, 8), (opus_val16)(QCONST16(2.f, 8)*(analysis->tonality_slope+.05f)))); } #else (void)analysis; #endif #ifdef FIXED_POINT trim_index = PSHR32(trim, 8); #else trim_index = (int)floor(.5f+trim); #endif trim_index = IMAX(0, IMIN(10, trim_index)); /*printf("%d\n", trim_index);*/ #ifdef FUZZING trim_index = rand()%11; #endif return trim_index; } static int stereo_analysis(const CELTMode *m, const celt_norm *X, int LM, int N0) { int i; int thetas; opus_val32 sumLR = EPSILON, sumMS = EPSILON; /* Use the L1 norm to model the entropy of the L/R signal vs the M/S signal */ for (i=0;i<13;i++) { int j; for (j=m->eBands[i]<eBands[i+1]<eBands[13]<<(LM+1))+thetas, sumMS) > MULT16_32_Q15(m->eBands[13]<<(LM+1), sumLR); } #define MSWAP(a,b) do {opus_val16 tmp = a;a=b;b=tmp;} while(0) static opus_val16 median_of_5(const opus_val16 *x) { opus_val16 t0, t1, t2, t3, t4; t2 = x[2]; if (x[0] > x[1]) { t0 = x[1]; t1 = x[0]; } else { t0 = x[0]; t1 = x[1]; } if (x[3] > x[4]) { t3 = x[4]; t4 = x[3]; } else { t3 = x[3]; t4 = x[4]; } if (t0 > t3) { MSWAP(t0, t3); MSWAP(t1, t4); } if (t2 > t1) { if (t1 < t3) return MIN16(t2, t3); else return MIN16(t4, t1); } else { if (t2 < t3) return MIN16(t1, t3); else return MIN16(t2, t4); } } static opus_val16 median_of_3(const opus_val16 *x) { opus_val16 t0, t1, t2; if (x[0] > x[1]) { t0 = x[1]; t1 = x[0]; } else { t0 = x[0]; t1 = x[1]; } t2 = x[2]; if (t1 < t2) return t1; else if (t0 < t2) return t2; else return t0; } static opus_val16 dynalloc_analysis(const opus_val16 *bandLogE, const opus_val16 *bandLogE2, int nbEBands, int start, int end, int C, int *offsets, int lsb_depth, const opus_int16 *logN, int isTransient, int vbr, int constrained_vbr, const opus_int16 *eBands, int LM, int effectiveBytes, opus_int32 *tot_boost_, int lfe, opus_val16 *surround_dynalloc, AnalysisInfo *analysis) { int i, c; opus_int32 tot_boost=0; opus_val16 maxDepth; VARDECL(opus_val16, follower); VARDECL(opus_val16, noise_floor); SAVE_STACK; ALLOC(follower, C*nbEBands, opus_val16); ALLOC(noise_floor, C*nbEBands, opus_val16); OPUS_CLEAR(offsets, nbEBands); /* Dynamic allocation code */ maxDepth=-QCONST16(31.9f, DB_SHIFT); for (i=0;i 50 && LM>=1 && !lfe) { int last=0; c=0;do { opus_val16 offset; opus_val16 tmp; opus_val16 *f; f = &follower[c*nbEBands]; f[0] = bandLogE2[c*nbEBands]; for (i=1;i bandLogE2[c*nbEBands+i-1]+QCONST16(.5f,DB_SHIFT)) last=i; f[i] = MIN16(f[i-1]+QCONST16(1.5f,DB_SHIFT), bandLogE2[c*nbEBands+i]); } for (i=last-1;i>=0;i--) f[i] = MIN16(f[i], MIN16(f[i+1]+QCONST16(2.f,DB_SHIFT), bandLogE2[c*nbEBands+i])); /* Combine with a median filter to avoid dynalloc triggering unnecessarily. The "offset" value controls how conservative we are -- a higher offset reduces the impact of the median filter and makes dynalloc use more bits. */ offset = QCONST16(1.f, DB_SHIFT); for (i=2;i=12) follower[i] = HALF16(follower[i]); } #ifdef DISABLE_FLOAT_API (void)analysis; #else if (analysis->valid) { for (i=start;ileak_boost[i]; } #endif for (i=start;i 48) { boost = (int)SHR32(EXTEND32(follower[i])*8,DB_SHIFT); boost_bits = (boost*width<>BITRES>>3 > 2*effectiveBytes/3) { opus_int32 cap = ((2*effectiveBytes/3)<mode; overlap = mode->overlap; ALLOC(_pre, CC*(N+COMBFILTER_MAXPERIOD), celt_sig); pre[0] = _pre; pre[1] = _pre + (N+COMBFILTER_MAXPERIOD); c=0; do { OPUS_COPY(pre[c], prefilter_mem+c*COMBFILTER_MAXPERIOD, COMBFILTER_MAXPERIOD); OPUS_COPY(pre[c]+COMBFILTER_MAXPERIOD, in+c*(N+overlap)+overlap, N); } while (++c>1, opus_val16); pitch_downsample(pre, pitch_buf, COMBFILTER_MAXPERIOD+N, CC, st->arch); /* Don't search for the fir last 1.5 octave of the range because there's too many false-positives due to short-term correlation */ pitch_search(pitch_buf+(COMBFILTER_MAXPERIOD>>1), pitch_buf, N, COMBFILTER_MAXPERIOD-3*COMBFILTER_MINPERIOD, &pitch_index, st->arch); pitch_index = COMBFILTER_MAXPERIOD-pitch_index; gain1 = remove_doubling(pitch_buf, COMBFILTER_MAXPERIOD, COMBFILTER_MINPERIOD, N, &pitch_index, st->prefilter_period, st->prefilter_gain, st->arch); if (pitch_index > COMBFILTER_MAXPERIOD-2) pitch_index = COMBFILTER_MAXPERIOD-2; gain1 = MULT16_16_Q15(QCONST16(.7f,15),gain1); /*printf("%d %d %f %f\n", pitch_change, pitch_index, gain1, st->analysis.tonality);*/ if (st->loss_rate>2) gain1 = HALF32(gain1); if (st->loss_rate>4) gain1 = HALF32(gain1); if (st->loss_rate>8) gain1 = 0; } else { gain1 = 0; pitch_index = COMBFILTER_MINPERIOD; } /* Gain threshold for enabling the prefilter/postfilter */ pf_threshold = QCONST16(.2f,15); /* Adjusting the threshold based on rate and continuity */ if (abs(pitch_index-st->prefilter_period)*10>pitch_index) pf_threshold += QCONST16(.2f,15); if (nbAvailableBytes<25) pf_threshold += QCONST16(.1f,15); if (nbAvailableBytes<35) pf_threshold += QCONST16(.1f,15); if (st->prefilter_gain > QCONST16(.4f,15)) pf_threshold -= QCONST16(.1f,15); if (st->prefilter_gain > QCONST16(.55f,15)) pf_threshold -= QCONST16(.1f,15); /* Hard threshold at 0.2 */ pf_threshold = MAX16(pf_threshold, QCONST16(.2f,15)); if (gain1prefilter_gain)prefilter_gain; #ifdef FIXED_POINT qg = ((gain1+1536)>>10)/3-1; #else qg = (int)floor(.5f+gain1*32/3)-1; #endif qg = IMAX(0, IMIN(7, qg)); gain1 = QCONST16(0.09375f,15)*(qg+1); pf_on = 1; } /*printf("%d %f\n", pitch_index, gain1);*/ c=0; do { int offset = mode->shortMdctSize-overlap; st->prefilter_period=IMAX(st->prefilter_period, COMBFILTER_MINPERIOD); OPUS_COPY(in+c*(N+overlap), st->in_mem+c*(overlap), overlap); if (offset) comb_filter(in+c*(N+overlap)+overlap, pre[c]+COMBFILTER_MAXPERIOD, st->prefilter_period, st->prefilter_period, offset, -st->prefilter_gain, -st->prefilter_gain, st->prefilter_tapset, st->prefilter_tapset, NULL, 0, st->arch); comb_filter(in+c*(N+overlap)+overlap+offset, pre[c]+COMBFILTER_MAXPERIOD+offset, st->prefilter_period, pitch_index, N-offset, -st->prefilter_gain, -gain1, st->prefilter_tapset, prefilter_tapset, mode->window, overlap, st->arch); OPUS_COPY(st->in_mem+c*(overlap), in+c*(N+overlap)+N, overlap); if (N>COMBFILTER_MAXPERIOD) { OPUS_COPY(prefilter_mem+c*COMBFILTER_MAXPERIOD, pre[c]+N, COMBFILTER_MAXPERIOD); } else { OPUS_MOVE(prefilter_mem+c*COMBFILTER_MAXPERIOD, prefilter_mem+c*COMBFILTER_MAXPERIOD+N, COMBFILTER_MAXPERIOD-N); OPUS_COPY(prefilter_mem+c*COMBFILTER_MAXPERIOD+COMBFILTER_MAXPERIOD-N, pre[c]+COMBFILTER_MAXPERIOD, N); } } while (++cnbEBands; eBands = mode->eBands; coded_bands = lastCodedBands ? lastCodedBands : nbEBands; coded_bins = eBands[coded_bands]<analysis.activity, st->analysis.tonality, tf_estimate, st->stereo_saving, tot_boost, coded_bands);*/ #ifndef DISABLE_FLOAT_API if (analysis->valid && analysis->activity<.4) target -= (opus_int32)((coded_bins<activity)); #endif /* Stereo savings */ if (C==2) { int coded_stereo_bands; int coded_stereo_dof; opus_val16 max_frac; coded_stereo_bands = IMIN(intensity, coded_bands); coded_stereo_dof = (eBands[coded_stereo_bands]<valid && !lfe) { opus_int32 tonal_target; float tonal; /* Tonality boost (compensating for the average). */ tonal = MAX16(0.f,analysis->tonality-.15f)-0.12f; tonal_target = target + (opus_int32)((coded_bins<tonality, tonal);*/ target = tonal_target; } #else (void)analysis; (void)pitch_change; #endif if (has_surround_mask&&!lfe) { opus_int32 surround_target = target + (opus_int32)SHR32(MULT16_16(surround_masking,coded_bins<end, st->intensity, surround_target, target, st->bitrate);*/ target = IMAX(target/4, surround_target); } { opus_int32 floor_depth; int bins; bins = eBands[nbEBands-2]<>2); target = IMIN(target, floor_depth); /*printf("%f %d\n", maxDepth, floor_depth);*/ } /* Make VBR less aggressive for constrained VBR because we can't keep a higher bitrate for long. Needs tuning. */ if ((!has_surround_mask||lfe) && constrained_vbr) { target = base_target + (opus_int32)MULT16_32_Q15(QCONST16(0.67f, 15), target-base_target); } if (!has_surround_mask && tf_estimate < QCONST16(.2f, 14)) { opus_val16 amount; opus_val16 tvbr_factor; amount = MULT16_16_Q15(QCONST16(.0000031f, 30), IMAX(0, IMIN(32000, 96000-bitrate))); tvbr_factor = SHR32(MULT16_16(temporal_vbr, amount), DB_SHIFT); target += (opus_int32)MULT16_32_Q15(tvbr_factor, target); } /* Don't allow more than doubling the rate */ target = IMIN(2*base_target, target); return target; } int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes, ec_enc *enc) { int i, c, N; opus_int32 bits; ec_enc _enc; VARDECL(celt_sig, in); VARDECL(celt_sig, freq); VARDECL(celt_norm, X); VARDECL(celt_ener, bandE); VARDECL(opus_val16, bandLogE); VARDECL(opus_val16, bandLogE2); VARDECL(int, fine_quant); VARDECL(opus_val16, error); VARDECL(int, pulses); VARDECL(int, cap); VARDECL(int, offsets); VARDECL(int, fine_priority); VARDECL(int, tf_res); VARDECL(unsigned char, collapse_masks); celt_sig *prefilter_mem; opus_val16 *oldBandE, *oldLogE, *oldLogE2, *energyError; int shortBlocks=0; int isTransient=0; const int CC = st->channels; const int C = st->stream_channels; int LM, M; int tf_select; int nbFilledBytes, nbAvailableBytes; int start; int end; int effEnd; int codedBands; int alloc_trim; int pitch_index=COMBFILTER_MINPERIOD; opus_val16 gain1 = 0; int dual_stereo=0; int effectiveBytes; int dynalloc_logp; opus_int32 vbr_rate; opus_int32 total_bits; opus_int32 total_boost; opus_int32 balance; opus_int32 tell; opus_int32 tell0_frac; int prefilter_tapset=0; int pf_on; int anti_collapse_rsv; int anti_collapse_on=0; int silence=0; int tf_chan = 0; opus_val16 tf_estimate; int pitch_change=0; opus_int32 tot_boost; opus_val32 sample_max; opus_val16 maxDepth; const OpusCustomMode *mode; int nbEBands; int overlap; const opus_int16 *eBands; int secondMdct; int signalBandwidth; int transient_got_disabled=0; opus_val16 surround_masking=0; opus_val16 temporal_vbr=0; opus_val16 surround_trim = 0; opus_int32 equiv_rate; int hybrid; int weak_transient = 0; VARDECL(opus_val16, surround_dynalloc); ALLOC_STACK; mode = st->mode; nbEBands = mode->nbEBands; overlap = mode->overlap; eBands = mode->eBands; start = st->start; end = st->end; hybrid = start != 0; tf_estimate = 0; if (nbCompressedBytes<2 || pcm==NULL) { RESTORE_STACK; return OPUS_BAD_ARG; } frame_size *= st->upsample; for (LM=0;LM<=mode->maxLM;LM++) if (mode->shortMdctSize<mode->maxLM) { RESTORE_STACK; return OPUS_BAD_ARG; } M=1<shortMdctSize; prefilter_mem = st->in_mem+CC*(overlap); oldBandE = (opus_val16*)(st->in_mem+CC*(overlap+COMBFILTER_MAXPERIOD)); oldLogE = oldBandE + CC*nbEBands; oldLogE2 = oldLogE + CC*nbEBands; energyError = oldLogE2 + CC*nbEBands; if (enc==NULL) { tell0_frac=tell=1; nbFilledBytes=0; } else { tell0_frac=tell=ec_tell_frac(enc); tell=ec_tell(enc); nbFilledBytes=(tell+4)>>3; } #ifdef CUSTOM_MODES if (st->signalling && enc==NULL) { int tmp = (mode->effEBands-end)>>1; end = st->end = IMAX(1, mode->effEBands-tmp); compressed[0] = tmp<<5; compressed[0] |= LM<<3; compressed[0] |= (C==2)<<2; /* Convert "standard mode" to Opus header */ if (mode->Fs==48000 && mode->shortMdctSize==120) { int c0 = toOpus(compressed[0]); if (c0<0) { RESTORE_STACK; return OPUS_BAD_ARG; } compressed[0] = c0; } compressed++; nbCompressedBytes--; } #else celt_assert(st->signalling==0); #endif /* Can't produce more than 1275 output bytes */ nbCompressedBytes = IMIN(nbCompressedBytes,1275); nbAvailableBytes = nbCompressedBytes - nbFilledBytes; if (st->vbr && st->bitrate!=OPUS_BITRATE_MAX) { opus_int32 den=mode->Fs>>BITRES; vbr_rate=(st->bitrate*frame_size+(den>>1))/den; #ifdef CUSTOM_MODES if (st->signalling) vbr_rate -= 8<>(3+BITRES); } else { opus_int32 tmp; vbr_rate = 0; tmp = st->bitrate*frame_size; if (tell>1) tmp += tell; if (st->bitrate!=OPUS_BITRATE_MAX) nbCompressedBytes = IMAX(2, IMIN(nbCompressedBytes, (tmp+4*mode->Fs)/(8*mode->Fs)-!!st->signalling)); effectiveBytes = nbCompressedBytes - nbFilledBytes; } equiv_rate = ((opus_int32)nbCompressedBytes*8*50 >> (3-LM)) - (40*C+20)*((400>>LM) - 50); if (st->bitrate != OPUS_BITRATE_MAX) equiv_rate = IMIN(equiv_rate, st->bitrate - (40*C+20)*((400>>LM) - 50)); if (enc==NULL) { ec_enc_init(&_enc, compressed, nbCompressedBytes); enc = &_enc; } if (vbr_rate>0) { /* Computes the max bit-rate allowed in VBR mode to avoid violating the target rate and buffering. We must do this up front so that bust-prevention logic triggers correctly if we don't have enough bits. */ if (st->constrained_vbr) { opus_int32 vbr_bound; opus_int32 max_allowed; /* We could use any multiple of vbr_rate as bound (depending on the delay). This is clamped to ensure we use at least two bytes if the encoder was entirely empty, but to allow 0 in hybrid mode. */ vbr_bound = vbr_rate; max_allowed = IMIN(IMAX(tell==1?2:0, (vbr_rate+vbr_bound-st->vbr_reservoir)>>(BITRES+3)), nbAvailableBytes); if(max_allowed < nbAvailableBytes) { nbCompressedBytes = nbFilledBytes+max_allowed; nbAvailableBytes = max_allowed; ec_enc_shrink(enc, nbCompressedBytes); } } } total_bits = nbCompressedBytes*8; effEnd = end; if (effEnd > mode->effEBands) effEnd = mode->effEBands; ALLOC(in, CC*(N+overlap), celt_sig); sample_max=MAX32(st->overlap_max, celt_maxabs16(pcm, C*(N-overlap)/st->upsample)); st->overlap_max=celt_maxabs16(pcm+C*(N-overlap)/st->upsample, C*overlap/st->upsample); sample_max=MAX32(sample_max, st->overlap_max); #ifdef FIXED_POINT silence = (sample_max==0); #else silence = (sample_max <= (opus_val16)1/(1<lsb_depth)); #endif #ifdef FUZZING if ((rand()&0x3F)==0) silence = 1; #endif if (tell==1) ec_enc_bit_logp(enc, silence, 15); else silence=0; if (silence) { /*In VBR mode there is no need to send more than the minimum. */ if (vbr_rate>0) { effectiveBytes=nbCompressedBytes=IMIN(nbCompressedBytes, nbFilledBytes+2); total_bits=nbCompressedBytes*8; nbAvailableBytes=2; ec_enc_shrink(enc, nbCompressedBytes); } /* Pretend we've filled all the remaining bits with zeros (that's what the initialiser did anyway) */ tell = nbCompressedBytes*8; enc->nbits_total+=tell-ec_tell(enc); } c=0; do { int need_clip=0; #ifndef FIXED_POINT need_clip = st->clip && sample_max>65536.f; #endif celt_preemphasis(pcm+c, in+c*(N+overlap)+overlap, N, CC, st->upsample, mode->preemph, st->preemph_memE+c, need_clip); } while (++clfe&&nbAvailableBytes>3) || nbAvailableBytes>12*C) && !hybrid && !silence && !st->disable_pf && st->complexity >= 5; prefilter_tapset = st->tapset_decision; pf_on = run_prefilter(st, in, prefilter_mem, CC, N, prefilter_tapset, &pitch_index, &gain1, &qg, enabled, nbAvailableBytes); if ((gain1 > QCONST16(.4f,15) || st->prefilter_gain > QCONST16(.4f,15)) && (!st->analysis.valid || st->analysis.tonality > .3) && (pitch_index > 1.26*st->prefilter_period || pitch_index < .79*st->prefilter_period)) pitch_change = 1; if (pf_on==0) { if(!hybrid && tell+16<=total_bits) ec_enc_bit_logp(enc, 0, 1); } else { /*This block is not gated by a total bits check only because of the nbAvailableBytes check above.*/ int octave; ec_enc_bit_logp(enc, 1, 1); pitch_index += 1; octave = EC_ILOG(pitch_index)-5; ec_enc_uint(enc, octave, 6); ec_enc_bits(enc, pitch_index-(16<complexity >= 1 && !st->lfe) { /* Reduces the likelihood of energy instability on fricatives at low bitrate in hybrid mode. It seems like we still want to have real transients on vowels though (small SILK quantization offset value). */ int allow_weak_transients = hybrid && effectiveBytes<15 && st->silk_info.offset >= 100; isTransient = transient_analysis(in, N+overlap, CC, &tf_estimate, &tf_chan, allow_weak_transients, &weak_transient); } if (LM>0 && ec_tell(enc)+3<=total_bits) { if (isTransient) shortBlocks = M; } else { isTransient = 0; transient_got_disabled=1; } ALLOC(freq, CC*N, celt_sig); /**< Interleaved signal MDCTs */ ALLOC(bandE,nbEBands*CC, celt_ener); ALLOC(bandLogE,nbEBands*CC, opus_val16); secondMdct = shortBlocks && st->complexity>=8; ALLOC(bandLogE2, C*nbEBands, opus_val16); if (secondMdct) { compute_mdcts(mode, 0, in, freq, C, CC, LM, st->upsample, st->arch); compute_band_energies(mode, freq, bandE, effEnd, C, LM, st->arch); amp2Log2(mode, effEnd, end, bandE, bandLogE2, C); for (i=0;iupsample, st->arch); if (CC==2&&C==1) tf_chan = 0; compute_band_energies(mode, freq, bandE, effEnd, C, LM, st->arch); if (st->lfe) { for (i=2;ienergy_mask&&!st->lfe) { int mask_end; int midband; int count_dynalloc; opus_val32 mask_avg=0; opus_val32 diff=0; int count=0; mask_end = IMAX(2,st->lastCodedBands); for (c=0;cenergy_mask[nbEBands*c+i], QCONST16(.25f, DB_SHIFT)), -QCONST16(2.0f, DB_SHIFT)); if (mask > 0) mask = HALF16(mask); mask_avg += MULT16_16(mask, eBands[i+1]-eBands[i]); count += eBands[i+1]-eBands[i]; diff += MULT16_16(mask, 1+2*i-mask_end); } } celt_assert(count>0); mask_avg = DIV32_16(mask_avg,count); mask_avg += QCONST16(.2f, DB_SHIFT); diff = diff*6/(C*(mask_end-1)*(mask_end+1)*mask_end); /* Again, being conservative */ diff = HALF32(diff); diff = MAX32(MIN32(diff, QCONST32(.031f, DB_SHIFT)), -QCONST32(.031f, DB_SHIFT)); /* Find the band that's in the middle of the coded spectrum */ for (midband=0;eBands[midband+1] < eBands[mask_end]/2;midband++); count_dynalloc=0; for(i=0;ienergy_mask[i], st->energy_mask[nbEBands+i]); else unmask = st->energy_mask[i]; unmask = MIN16(unmask, QCONST16(.0f, DB_SHIFT)); unmask -= lin; if (unmask > QCONST16(.25f, DB_SHIFT)) { surround_dynalloc[i] = unmask - QCONST16(.25f, DB_SHIFT); count_dynalloc++; } } if (count_dynalloc>=3) { /* If we need dynalloc in many bands, it's probably because our initial masking rate was too low. */ mask_avg += QCONST16(.25f, DB_SHIFT); if (mask_avg>0) { /* Something went really wrong in the original calculations, disabling masking. */ mask_avg = 0; diff = 0; OPUS_CLEAR(surround_dynalloc, mask_end); } else { for(i=0;ilfe) { opus_val16 follow=-QCONST16(10.0f,DB_SHIFT); opus_val32 frame_avg=0; opus_val16 offset = shortBlocks?HALF16(SHL16(LM, DB_SHIFT)):0; for(i=start;ispec_avg); temporal_vbr = MIN16(QCONST16(3.f, DB_SHIFT), MAX16(-QCONST16(1.5f, DB_SHIFT), temporal_vbr)); st->spec_avg += MULT16_16_Q15(QCONST16(.02f, 15), temporal_vbr); } /*for (i=0;i<21;i++) printf("%f ", bandLogE[i]); printf("\n");*/ if (!secondMdct) { OPUS_COPY(bandLogE2, bandLogE, C*nbEBands); } /* Last chance to catch any transient we might have missed in the time-domain analysis */ if (LM>0 && ec_tell(enc)+3<=total_bits && !isTransient && st->complexity>=5 && !st->lfe && !hybrid) { if (patch_transient_decision(bandLogE, oldBandE, nbEBands, start, end, C)) { isTransient = 1; shortBlocks = M; compute_mdcts(mode, shortBlocks, in, freq, C, CC, LM, st->upsample, st->arch); compute_band_energies(mode, freq, bandE, effEnd, C, LM, st->arch); amp2Log2(mode, effEnd, end, bandE, bandLogE, C); /* Compensate for the scaling of short vs long mdcts */ for (i=0;i0 && ec_tell(enc)+3<=total_bits) ec_enc_bit_logp(enc, isTransient, 3); ALLOC(X, C*N, celt_norm); /**< Interleaved normalised MDCTs */ /* Band normalisation */ normalise_bands(mode, freq, X, bandE, effEnd, C, M); ALLOC(tf_res, nbEBands, int); /* Disable variable tf resolution for hybrid and at very low bitrate */ if (effectiveBytes>=15*C && !hybrid && st->complexity>=2 && !st->lfe) { int lambda; lambda = IMAX(5, 1280/effectiveBytes + 2); tf_select = tf_analysis(mode, effEnd, isTransient, tf_res, lambda, X, N, LM, tf_estimate, tf_chan); for (i=effEnd;iforce_intra, &st->delayedIntra, st->complexity >= 4, st->loss_rate, st->lfe); tf_encode(start, end, isTransient, tf_res, LM, tf_select, enc); if (ec_tell(enc)+4<=total_bits) { if (st->lfe) { st->tapset_decision = 0; st->spread_decision = SPREAD_NORMAL; } else if (hybrid) { if (st->complexity == 0) st->spread_decision = SPREAD_NONE; else if (isTransient) st->spread_decision = SPREAD_NORMAL; else st->spread_decision = SPREAD_AGGRESSIVE; } else if (shortBlocks || st->complexity < 3 || nbAvailableBytes < 10*C) { if (st->complexity == 0) st->spread_decision = SPREAD_NONE; else st->spread_decision = SPREAD_NORMAL; } else { /* Disable new spreading+tapset estimator until we can show it works better than the old one. So far it seems like spreading_decision() works best. */ #if 0 if (st->analysis.valid) { static const opus_val16 spread_thresholds[3] = {-QCONST16(.6f, 15), -QCONST16(.2f, 15), -QCONST16(.07f, 15)}; static const opus_val16 spread_histeresis[3] = {QCONST16(.15f, 15), QCONST16(.07f, 15), QCONST16(.02f, 15)}; static const opus_val16 tapset_thresholds[2] = {QCONST16(.0f, 15), QCONST16(.15f, 15)}; static const opus_val16 tapset_histeresis[2] = {QCONST16(.1f, 15), QCONST16(.05f, 15)}; st->spread_decision = hysteresis_decision(-st->analysis.tonality, spread_thresholds, spread_histeresis, 3, st->spread_decision); st->tapset_decision = hysteresis_decision(st->analysis.tonality_slope, tapset_thresholds, tapset_histeresis, 2, st->tapset_decision); } else #endif { st->spread_decision = spreading_decision(mode, X, &st->tonal_average, st->spread_decision, &st->hf_average, &st->tapset_decision, pf_on&&!shortBlocks, effEnd, C, M); } /*printf("%d %d\n", st->tapset_decision, st->spread_decision);*/ /*printf("%f %d %f %d\n\n", st->analysis.tonality, st->spread_decision, st->analysis.tonality_slope, st->tapset_decision);*/ } ec_enc_icdf(enc, st->spread_decision, spread_icdf, 5); } ALLOC(offsets, nbEBands, int); maxDepth = dynalloc_analysis(bandLogE, bandLogE2, nbEBands, start, end, C, offsets, st->lsb_depth, mode->logN, isTransient, st->vbr, st->constrained_vbr, eBands, LM, effectiveBytes, &tot_boost, st->lfe, surround_dynalloc, &st->analysis); /* For LFE, everything interesting is in the first band */ if (st->lfe) offsets[0] = IMIN(8, effectiveBytes/3); ALLOC(cap, nbEBands, int); init_caps(mode,cap,LM,C); dynalloc_logp = 6; total_bits<<=BITRES; total_boost = 0; tell = ec_tell_frac(enc); for (i=start;iintensity = hysteresis_decision((opus_val16)(equiv_rate/1000), intensity_thresholds, intensity_histeresis, 21, st->intensity); st->intensity = IMIN(end,IMAX(start, st->intensity)); } alloc_trim = 5; if (tell+(6< 0 || st->lfe) { st->stereo_saving = 0; alloc_trim = 5; } else { alloc_trim = alloc_trim_analysis(mode, X, bandLogE, end, LM, C, N, &st->analysis, &st->stereo_saving, tf_estimate, st->intensity, surround_trim, equiv_rate, st->arch); } ec_enc_icdf(enc, alloc_trim, trim_icdf, 7); tell = ec_tell_frac(enc); } /* Variable bitrate */ if (vbr_rate>0) { opus_val16 alpha; opus_int32 delta; /* The target rate in 8th bits per frame */ opus_int32 target, base_target; opus_int32 min_allowed; int lm_diff = mode->maxLM - LM; /* Don't attempt to use more than 510 kb/s, even for frames smaller than 20 ms. The CELT allocator will just not be able to use more than that anyway. */ nbCompressedBytes = IMIN(nbCompressedBytes,1275>>(3-LM)); if (!hybrid) { base_target = vbr_rate - ((40*C+20)<constrained_vbr) base_target += (st->vbr_offset>>lm_diff); if (!hybrid) { target = compute_vbr(mode, &st->analysis, base_target, LM, equiv_rate, st->lastCodedBands, C, st->intensity, st->constrained_vbr, st->stereo_saving, tot_boost, tf_estimate, pitch_change, maxDepth, st->lfe, st->energy_mask!=NULL, surround_masking, temporal_vbr); } else { target = base_target; /* Tonal frames (offset<100) need more bits than noisy (offset>100) ones. */ if (st->silk_info.offset < 100) target += 12 << BITRES >> (3-LM); if (st->silk_info.offset > 100) target -= 18 << BITRES >> (3-LM); /* Boosting bitrate on transients and vowels with significant temporal spikes. */ target += (opus_int32)MULT16_16_Q14(tf_estimate-QCONST16(.25f,14), (50< QCONST16(.7f,14)) target = IMAX(target, 50<>(BITRES+3)) + 2; /* Take into account the 37 bits we need to have left in the packet to signal a redundant frame in hybrid mode. Creating a shorter packet would create an entropy coder desync. */ if (hybrid) min_allowed = IMAX(min_allowed, (tell0_frac+(37<>(BITRES+3)); nbAvailableBytes = (target+(1<<(BITRES+2)))>>(BITRES+3); nbAvailableBytes = IMAX(min_allowed,nbAvailableBytes); nbAvailableBytes = IMIN(nbCompressedBytes,nbAvailableBytes); /* By how much did we "miss" the target on that frame */ delta = target - vbr_rate; target=nbAvailableBytes<<(BITRES+3); /*If the frame is silent we don't adjust our drift, otherwise the encoder will shoot to very high rates after hitting a span of silence, but we do allow the bitres to refill. This means that we'll undershoot our target in CVBR/VBR modes on files with lots of silence. */ if(silence) { nbAvailableBytes = 2; target = 2*8<vbr_count < 970) { st->vbr_count++; alpha = celt_rcp(SHL32(EXTEND32(st->vbr_count+20),16)); } else alpha = QCONST16(.001f,15); /* How many bits have we used in excess of what we're allowed */ if (st->constrained_vbr) st->vbr_reservoir += target - vbr_rate; /*printf ("%d\n", st->vbr_reservoir);*/ /* Compute the offset we need to apply in order to reach the target */ if (st->constrained_vbr) { st->vbr_drift += (opus_int32)MULT16_32_Q15(alpha,(delta*(1<vbr_offset-st->vbr_drift); st->vbr_offset = -st->vbr_drift; } /*printf ("%d\n", st->vbr_drift);*/ if (st->constrained_vbr && st->vbr_reservoir < 0) { /* We're under the min value -- increase rate */ int adjust = (-st->vbr_reservoir)/(8<vbr_reservoir = 0; /*printf ("+%d\n", adjust);*/ } nbCompressedBytes = IMIN(nbCompressedBytes,nbAvailableBytes); /*printf("%d\n", nbCompressedBytes*50*8);*/ /* This moves the raw bits to take into account the new compressed size */ ec_enc_shrink(enc, nbCompressedBytes); } /* Bit allocation */ ALLOC(fine_quant, nbEBands, int); ALLOC(pulses, nbEBands, int); ALLOC(fine_priority, nbEBands, int); /* bits = packet size - where we are - safety*/ bits = (((opus_int32)nbCompressedBytes*8)<=2&&bits>=((LM+2)<analysis.valid) { int min_bandwidth; if (equiv_rate < (opus_int32)32000*C) min_bandwidth = 13; else if (equiv_rate < (opus_int32)48000*C) min_bandwidth = 16; else if (equiv_rate < (opus_int32)60000*C) min_bandwidth = 18; else if (equiv_rate < (opus_int32)80000*C) min_bandwidth = 19; else min_bandwidth = 20; signalBandwidth = IMAX(st->analysis.bandwidth, min_bandwidth); } #endif if (st->lfe) signalBandwidth = 1; codedBands = compute_allocation(mode, start, end, offsets, cap, alloc_trim, &st->intensity, &dual_stereo, bits, &balance, pulses, fine_quant, fine_priority, C, LM, enc, 1, st->lastCodedBands, signalBandwidth); if (st->lastCodedBands) st->lastCodedBands = IMIN(st->lastCodedBands+1,IMAX(st->lastCodedBands-1,codedBands)); else st->lastCodedBands = codedBands; quant_fine_energy(mode, start, end, oldBandE, error, fine_quant, enc, C); /* Residual quantisation */ ALLOC(collapse_masks, C*nbEBands, unsigned char); quant_all_bands(1, mode, start, end, X, C==2 ? X+N : NULL, collapse_masks, bandE, pulses, shortBlocks, st->spread_decision, dual_stereo, st->intensity, tf_res, nbCompressedBytes*(8<rng, st->complexity, st->arch, st->disable_inv); if (anti_collapse_rsv > 0) { anti_collapse_on = st->consec_transient<2; #ifdef FUZZING anti_collapse_on = rand()&0x1; #endif ec_enc_bits(enc, anti_collapse_on, 1); } quant_energy_finalise(mode, start, end, oldBandE, error, fine_quant, fine_priority, nbCompressedBytes*8-ec_tell(enc), enc, C); OPUS_CLEAR(energyError, nbEBands*CC); c=0; do { for (i=start;irng); } c=0; do { OPUS_MOVE(st->syn_mem[c], st->syn_mem[c]+N, 2*MAX_PERIOD-N+overlap/2); } while (++csyn_mem[c]+2*MAX_PERIOD-N; } while (++cupsample, silence, st->arch); c=0; do { st->prefilter_period=IMAX(st->prefilter_period, COMBFILTER_MINPERIOD); st->prefilter_period_old=IMAX(st->prefilter_period_old, COMBFILTER_MINPERIOD); comb_filter(out_mem[c], out_mem[c], st->prefilter_period_old, st->prefilter_period, mode->shortMdctSize, st->prefilter_gain_old, st->prefilter_gain, st->prefilter_tapset_old, st->prefilter_tapset, mode->window, overlap); if (LM!=0) comb_filter(out_mem[c]+mode->shortMdctSize, out_mem[c]+mode->shortMdctSize, st->prefilter_period, pitch_index, N-mode->shortMdctSize, st->prefilter_gain, gain1, st->prefilter_tapset, prefilter_tapset, mode->window, overlap); } while (++cupsample, mode->preemph, st->preemph_memD); st->prefilter_period_old = st->prefilter_period; st->prefilter_gain_old = st->prefilter_gain; st->prefilter_tapset_old = st->prefilter_tapset; } #endif st->prefilter_period = pitch_index; st->prefilter_gain = gain1; st->prefilter_tapset = prefilter_tapset; #ifdef RESYNTH if (LM!=0) { st->prefilter_period_old = st->prefilter_period; st->prefilter_gain_old = st->prefilter_gain; st->prefilter_tapset_old = st->prefilter_tapset; } #endif if (CC==2&&C==1) { OPUS_COPY(&oldBandE[nbEBands], oldBandE, nbEBands); } if (!isTransient) { OPUS_COPY(oldLogE2, oldLogE, CC*nbEBands); OPUS_COPY(oldLogE, oldBandE, CC*nbEBands); } else { for (i=0;iconsec_transient++; else st->consec_transient=0; st->rng = enc->rng; /* If there's any room left (can only happen for very high rates), it's already filled with zeros */ ec_enc_done(enc); #ifdef CUSTOM_MODES if (st->signalling) nbCompressedBytes++; #endif RESTORE_STACK; if (ec_get_error(enc)) return OPUS_INTERNAL_ERROR; else return nbCompressedBytes; } #ifdef CUSTOM_MODES #ifdef FIXED_POINT int opus_custom_encode(CELTEncoder * OPUS_RESTRICT st, const opus_int16 * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes) { return celt_encode_with_ec(st, pcm, frame_size, compressed, nbCompressedBytes, NULL); } #ifndef DISABLE_FLOAT_API int opus_custom_encode_float(CELTEncoder * OPUS_RESTRICT st, const float * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes) { int j, ret, C, N; VARDECL(opus_int16, in); ALLOC_STACK; if (pcm==NULL) return OPUS_BAD_ARG; C = st->channels; N = frame_size; ALLOC(in, C*N, opus_int16); for (j=0;jchannels; N=frame_size; ALLOC(in, C*N, celt_sig); for (j=0;j10) goto bad_arg; st->complexity = value; } break; case CELT_SET_START_BAND_REQUEST: { opus_int32 value = va_arg(ap, opus_int32); if (value<0 || value>=st->mode->nbEBands) goto bad_arg; st->start = value; } break; case CELT_SET_END_BAND_REQUEST: { opus_int32 value = va_arg(ap, opus_int32); if (value<1 || value>st->mode->nbEBands) goto bad_arg; st->end = value; } break; case CELT_SET_PREDICTION_REQUEST: { int value = va_arg(ap, opus_int32); if (value<0 || value>2) goto bad_arg; st->disable_pf = value<=1; st->force_intra = value==0; } break; case OPUS_SET_PACKET_LOSS_PERC_REQUEST: { int value = va_arg(ap, opus_int32); if (value<0 || value>100) goto bad_arg; st->loss_rate = value; } break; case OPUS_SET_VBR_CONSTRAINT_REQUEST: { opus_int32 value = va_arg(ap, opus_int32); st->constrained_vbr = value; } break; case OPUS_SET_VBR_REQUEST: { opus_int32 value = va_arg(ap, opus_int32); st->vbr = value; } break; case OPUS_SET_BITRATE_REQUEST: { opus_int32 value = va_arg(ap, opus_int32); if (value<=500 && value!=OPUS_BITRATE_MAX) goto bad_arg; value = IMIN(value, 260000*st->channels); st->bitrate = value; } break; case CELT_SET_CHANNELS_REQUEST: { opus_int32 value = va_arg(ap, opus_int32); if (value<1 || value>2) goto bad_arg; st->stream_channels = value; } break; case OPUS_SET_LSB_DEPTH_REQUEST: { opus_int32 value = va_arg(ap, opus_int32); if (value<8 || value>24) goto bad_arg; st->lsb_depth=value; } break; case OPUS_GET_LSB_DEPTH_REQUEST: { opus_int32 *value = va_arg(ap, opus_int32*); *value=st->lsb_depth; } break; case OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST: { opus_int32 value = va_arg(ap, opus_int32); if(value<0 || value>1) { goto bad_arg; } st->disable_inv = value; } break; case OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST: { opus_int32 *value = va_arg(ap, opus_int32*); if (!value) { goto bad_arg; } *value = st->disable_inv; } break; case OPUS_RESET_STATE: { int i; opus_val16 *oldBandE, *oldLogE, *oldLogE2; oldBandE = (opus_val16*)(st->in_mem+st->channels*(st->mode->overlap+COMBFILTER_MAXPERIOD)); oldLogE = oldBandE + st->channels*st->mode->nbEBands; oldLogE2 = oldLogE + st->channels*st->mode->nbEBands; OPUS_CLEAR((char*)&st->ENCODER_RESET_START, opus_custom_encoder_get_size(st->mode, st->channels)- ((char*)&st->ENCODER_RESET_START - (char*)st)); for (i=0;ichannels*st->mode->nbEBands;i++) oldLogE[i]=oldLogE2[i]=-QCONST16(28.f,DB_SHIFT); st->vbr_offset = 0; st->delayedIntra = 1; st->spread_decision = SPREAD_NORMAL; st->tonal_average = 256; st->hf_average = 0; st->tapset_decision = 0; } break; #ifdef CUSTOM_MODES case CELT_SET_INPUT_CLIPPING_REQUEST: { opus_int32 value = va_arg(ap, opus_int32); st->clip = value; } break; #endif case CELT_SET_SIGNALLING_REQUEST: { opus_int32 value = va_arg(ap, opus_int32); st->signalling = value; } break; case CELT_SET_ANALYSIS_REQUEST: { AnalysisInfo *info = va_arg(ap, AnalysisInfo *); if (info) OPUS_COPY(&st->analysis, info, 1); } break; case CELT_SET_SILK_INFO_REQUEST: { SILKInfo *info = va_arg(ap, SILKInfo *); if (info) OPUS_COPY(&st->silk_info, info, 1); } break; case CELT_GET_MODE_REQUEST: { const CELTMode ** value = va_arg(ap, const CELTMode**); if (value==0) goto bad_arg; *value=st->mode; } break; case OPUS_GET_FINAL_RANGE_REQUEST: { opus_uint32 * value = va_arg(ap, opus_uint32 *); if (value==0) goto bad_arg; *value=st->rng; } break; case OPUS_SET_LFE_REQUEST: { opus_int32 value = va_arg(ap, opus_int32); st->lfe = value; } break; case OPUS_SET_ENERGY_MASK_REQUEST: { opus_val16 *value = va_arg(ap, opus_val16*); st->energy_mask = value; } break; default: goto bad_request; } va_end(ap); return OPUS_OK; bad_arg: va_end(ap); return OPUS_BAD_ARG; bad_request: va_end(ap); return OPUS_UNIMPLEMENTED; } mumble-1.3.4/3rdparty/opus-src/celt/celt_decoder.c0000664000175000017500000012042514010707327021677 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2010 Xiph.Org Foundation Copyright (c) 2008 Gregory Maxwell Written by Jean-Marc Valin and Gregory Maxwell */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #define CELT_DECODER_C #include "cpu_support.h" #include "os_support.h" #include "mdct.h" #include #include "celt.h" #include "pitch.h" #include "bands.h" #include "modes.h" #include "entcode.h" #include "quant_bands.h" #include "rate.h" #include "stack_alloc.h" #include "mathops.h" #include "float_cast.h" #include #include "celt_lpc.h" #include "vq.h" #if defined(SMALL_FOOTPRINT) && defined(FIXED_POINT) #define NORM_ALIASING_HACK #endif /**********************************************************************/ /* */ /* DECODER */ /* */ /**********************************************************************/ #define DECODE_BUFFER_SIZE 2048 /** Decoder state @brief Decoder state */ struct OpusCustomDecoder { const OpusCustomMode *mode; int overlap; int channels; int stream_channels; int downsample; int start, end; int signalling; int disable_inv; int arch; /* Everything beyond this point gets cleared on a reset */ #define DECODER_RESET_START rng opus_uint32 rng; int error; int last_pitch_index; int loss_count; int skip_plc; int postfilter_period; int postfilter_period_old; opus_val16 postfilter_gain; opus_val16 postfilter_gain_old; int postfilter_tapset; int postfilter_tapset_old; celt_sig preemph_memD[2]; celt_sig _decode_mem[1]; /* Size = channels*(DECODE_BUFFER_SIZE+mode->overlap) */ /* opus_val16 lpc[], Size = channels*LPC_ORDER */ /* opus_val16 oldEBands[], Size = 2*mode->nbEBands */ /* opus_val16 oldLogE[], Size = 2*mode->nbEBands */ /* opus_val16 oldLogE2[], Size = 2*mode->nbEBands */ /* opus_val16 backgroundLogE[], Size = 2*mode->nbEBands */ }; int celt_decoder_get_size(int channels) { const CELTMode *mode = opus_custom_mode_create(48000, 960, NULL); return opus_custom_decoder_get_size(mode, channels); } OPUS_CUSTOM_NOSTATIC int opus_custom_decoder_get_size(const CELTMode *mode, int channels) { int size = sizeof(struct CELTDecoder) + (channels*(DECODE_BUFFER_SIZE+mode->overlap)-1)*sizeof(celt_sig) + channels*LPC_ORDER*sizeof(opus_val16) + 4*2*mode->nbEBands*sizeof(opus_val16); return size; } #ifdef CUSTOM_MODES CELTDecoder *opus_custom_decoder_create(const CELTMode *mode, int channels, int *error) { int ret; CELTDecoder *st = (CELTDecoder *)opus_alloc(opus_custom_decoder_get_size(mode, channels)); ret = opus_custom_decoder_init(st, mode, channels); if (ret != OPUS_OK) { opus_custom_decoder_destroy(st); st = NULL; } if (error) *error = ret; return st; } #endif /* CUSTOM_MODES */ int celt_decoder_init(CELTDecoder *st, opus_int32 sampling_rate, int channels) { int ret; ret = opus_custom_decoder_init(st, opus_custom_mode_create(48000, 960, NULL), channels); if (ret != OPUS_OK) return ret; st->downsample = resampling_factor(sampling_rate); if (st->downsample==0) return OPUS_BAD_ARG; else return OPUS_OK; } OPUS_CUSTOM_NOSTATIC int opus_custom_decoder_init(CELTDecoder *st, const CELTMode *mode, int channels) { if (channels < 0 || channels > 2) return OPUS_BAD_ARG; if (st==NULL) return OPUS_ALLOC_FAIL; OPUS_CLEAR((char*)st, opus_custom_decoder_get_size(mode, channels)); st->mode = mode; st->overlap = mode->overlap; st->stream_channels = st->channels = channels; st->downsample = 1; st->start = 0; st->end = st->mode->effEBands; st->signalling = 1; #ifdef ENABLE_UPDATE_DRAFT st->disable_inv = channels == 1; #else st->disable_inv = 0; #endif st->arch = opus_select_arch(); opus_custom_decoder_ctl(st, OPUS_RESET_STATE); return OPUS_OK; } #ifdef CUSTOM_MODES void opus_custom_decoder_destroy(CELTDecoder *st) { opus_free(st); } #endif /* CUSTOM_MODES */ #ifndef CUSTOM_MODES /* Special case for stereo with no downsampling and no accumulation. This is quite common and we can make it faster by processing both channels in the same loop, reducing overhead due to the dependency loop in the IIR filter. */ static void deemphasis_stereo_simple(celt_sig *in[], opus_val16 *pcm, int N, const opus_val16 coef0, celt_sig *mem) { celt_sig * OPUS_RESTRICT x0; celt_sig * OPUS_RESTRICT x1; celt_sig m0, m1; int j; x0=in[0]; x1=in[1]; m0 = mem[0]; m1 = mem[1]; for (j=0;j1) { /* Shortcut for the standard (non-custom modes) case */ for (j=0;joverlap; nbEBands = mode->nbEBands; N = mode->shortMdctSize<shortMdctSize; shift = mode->maxLM; } else { B = 1; NB = mode->shortMdctSize<maxLM-LM; } if (CC==2&&C==1) { /* Copying a mono streams to two channels */ celt_sig *freq2; denormalise_bands(mode, X, freq, oldBandE, start, effEnd, M, downsample, silence); /* Store a temporary copy in the output buffer because the IMDCT destroys its input. */ freq2 = out_syn[1]+overlap/2; OPUS_COPY(freq2, freq, N); for (b=0;bmdct, &freq2[b], out_syn[0]+NB*b, mode->window, overlap, shift, B, arch); for (b=0;bmdct, &freq[b], out_syn[1]+NB*b, mode->window, overlap, shift, B, arch); } else if (CC==1&&C==2) { /* Downmixing a stereo stream to mono */ celt_sig *freq2; freq2 = out_syn[0]+overlap/2; denormalise_bands(mode, X, freq, oldBandE, start, effEnd, M, downsample, silence); /* Use the output buffer as temp array before downmixing. */ denormalise_bands(mode, X+N, freq2, oldBandE+nbEBands, start, effEnd, M, downsample, silence); for (i=0;imdct, &freq[b], out_syn[0]+NB*b, mode->window, overlap, shift, B, arch); } else { /* Normal case (mono or stereo) */ c=0; do { denormalise_bands(mode, X+c*N, freq, oldBandE+c*nbEBands, start, effEnd, M, downsample, silence); for (b=0;bmdct, &freq[b], out_syn[c]+NB*b, mode->window, overlap, shift, B, arch); } while (++cstorage*8; tell = ec_tell(dec); logp = isTransient ? 2 : 4; tf_select_rsv = LM>0 && tell+logp+1<=budget; budget -= tf_select_rsv; tf_changed = curr = 0; for (i=start;i>1, opus_val16 ); pitch_downsample(decode_mem, lp_pitch_buf, DECODE_BUFFER_SIZE, C, arch); pitch_search(lp_pitch_buf+(PLC_PITCH_LAG_MAX>>1), lp_pitch_buf, DECODE_BUFFER_SIZE-PLC_PITCH_LAG_MAX, PLC_PITCH_LAG_MAX-PLC_PITCH_LAG_MIN, &pitch_index, arch); pitch_index = PLC_PITCH_LAG_MAX-pitch_index; RESTORE_STACK; return pitch_index; } static void celt_decode_lost(CELTDecoder * OPUS_RESTRICT st, int N, int LM) { int c; int i; const int C = st->channels; celt_sig *decode_mem[2]; celt_sig *out_syn[2]; opus_val16 *lpc; opus_val16 *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE; const OpusCustomMode *mode; int nbEBands; int overlap; int start; int loss_count; int noise_based; const opus_int16 *eBands; SAVE_STACK; mode = st->mode; nbEBands = mode->nbEBands; overlap = mode->overlap; eBands = mode->eBands; c=0; do { decode_mem[c] = st->_decode_mem + c*(DECODE_BUFFER_SIZE+overlap); out_syn[c] = decode_mem[c]+DECODE_BUFFER_SIZE-N; } while (++c_decode_mem+(DECODE_BUFFER_SIZE+overlap)*C); oldBandE = lpc+C*LPC_ORDER; oldLogE = oldBandE + 2*nbEBands; oldLogE2 = oldLogE + 2*nbEBands; backgroundLogE = oldLogE2 + 2*nbEBands; loss_count = st->loss_count; start = st->start; noise_based = loss_count >= 5 || start != 0 || st->skip_plc; if (noise_based) { /* Noise-based PLC/CNG */ #ifdef NORM_ALIASING_HACK celt_norm *X; #else VARDECL(celt_norm, X); #endif opus_uint32 seed; int end; int effEnd; opus_val16 decay; end = st->end; effEnd = IMAX(start, IMIN(end, mode->effEBands)); #ifdef NORM_ALIASING_HACK /* This is an ugly hack that breaks aliasing rules and would be easily broken, but it saves almost 4kB of stack. */ X = (celt_norm*)(out_syn[C-1]+overlap/2); #else ALLOC(X, C*N, celt_norm); /**< Interleaved normalised MDCTs */ #endif /* Energy decay */ decay = loss_count==0 ? QCONST16(1.5f, DB_SHIFT) : QCONST16(.5f, DB_SHIFT); c=0; do { for (i=start;irng; for (c=0;c>20); } renormalise_vector(X+boffs, blen, Q15ONE, st->arch); } } st->rng = seed; c=0; do { OPUS_MOVE(decode_mem[c], decode_mem[c]+N, DECODE_BUFFER_SIZE-N+(overlap>>1)); } while (++cdownsample, 0, st->arch); } else { /* Pitch-based PLC */ const opus_val16 *window; opus_val16 *exc; opus_val16 fade = Q15ONE; int pitch_index; VARDECL(opus_val32, etmp); VARDECL(opus_val16, _exc); if (loss_count == 0) { st->last_pitch_index = pitch_index = celt_plc_pitch_search(decode_mem, C, st->arch); } else { pitch_index = st->last_pitch_index; fade = QCONST16(.8f,15); } ALLOC(etmp, overlap, opus_val32); ALLOC(_exc, MAX_PERIOD+LPC_ORDER, opus_val16); exc = _exc+LPC_ORDER; window = mode->window; c=0; do { opus_val16 decay; opus_val16 attenuation; opus_val32 S1=0; celt_sig *buf; int extrapolation_offset; int extrapolation_len; int exc_length; int j; buf = decode_mem[c]; for (i=0;iarch); /* Add a noise floor of -40 dB. */ #ifdef FIXED_POINT ac[0] += SHR32(ac[0],13); #else ac[0] *= 1.0001f; #endif /* Use lag windowing to stabilize the Levinson-Durbin recursion. */ for (i=1;i<=LPC_ORDER;i++) { /*ac[i] *= exp(-.5*(2*M_PI*.002*i)*(2*M_PI*.002*i));*/ #ifdef FIXED_POINT ac[i] -= MULT16_32_Q15(2*i*i, ac[i]); #else ac[i] -= ac[i]*(0.008f*0.008f)*i*i; #endif } _celt_lpc(lpc+c*LPC_ORDER, ac, LPC_ORDER); #ifdef FIXED_POINT /* For fixed-point, apply bandwidth expansion until we can guarantee that no overflow can happen in the IIR filter. This means: 32768*sum(abs(filter)) < 2^31 */ while (1) { opus_val16 tmp=Q15ONE; opus_val32 sum=QCONST16(1., SIG_SHIFT); for (i=0;iarch); } /* Check if the waveform is decaying, and if so how fast. We do this to avoid adding energy when concealing in a segment with decaying energy. */ { opus_val32 E1=1, E2=1; int decay_length; #ifdef FIXED_POINT int shift = IMAX(0,2*celt_zlog2(celt_maxabs16(&exc[MAX_PERIOD-exc_length], exc_length))-20); #endif decay_length = exc_length>>1; for (i=0;i= pitch_index) { j -= pitch_index; attenuation = MULT16_16_Q15(attenuation, decay); } buf[DECODE_BUFFER_SIZE-N+i] = SHL32(EXTEND32(MULT16_16_Q15(attenuation, exc[extrapolation_offset+j])), SIG_SHIFT); /* Compute the energy of the previously decoded signal whose excitation we're copying. */ tmp = ROUND16( buf[DECODE_BUFFER_SIZE-MAX_PERIOD-N+extrapolation_offset+j], SIG_SHIFT); S1 += SHR32(MULT16_16(tmp, tmp), 10); } { opus_val16 lpc_mem[LPC_ORDER]; /* Copy the last decoded samples (prior to the overlap region) to synthesis filter memory so we can have a continuous signal. */ for (i=0;iarch); #ifdef FIXED_POINT for (i=0; i < extrapolation_len; i++) buf[DECODE_BUFFER_SIZE-N+i] = SATURATE(buf[DECODE_BUFFER_SIZE-N+i], SIG_SAT); #endif } /* Check if the synthesis energy is higher than expected, which can happen with the signal changes during our window. If so, attenuate. */ { opus_val32 S2=0; for (i=0;i SHR32(S2,2))) #else /* The float test is written this way to catch NaNs in the output of the IIR filter at the same time. */ if (!(S1 > 0.2f*S2)) #endif { for (i=0;ipostfilter_period, st->postfilter_period, overlap, -st->postfilter_gain, -st->postfilter_gain, st->postfilter_tapset, st->postfilter_tapset, NULL, 0, st->arch); /* Simulate TDAC on the concealed audio so that it blends with the MDCT of the next frame. */ for (i=0;iloss_count = loss_count+1; RESTORE_STACK; } int celt_decode_with_ec(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, opus_val16 * OPUS_RESTRICT pcm, int frame_size, ec_dec *dec, int accum) { int c, i, N; int spread_decision; opus_int32 bits; ec_dec _dec; #ifdef NORM_ALIASING_HACK celt_norm *X; #else VARDECL(celt_norm, X); #endif VARDECL(int, fine_quant); VARDECL(int, pulses); VARDECL(int, cap); VARDECL(int, offsets); VARDECL(int, fine_priority); VARDECL(int, tf_res); VARDECL(unsigned char, collapse_masks); celt_sig *decode_mem[2]; celt_sig *out_syn[2]; opus_val16 *lpc; opus_val16 *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE; int shortBlocks; int isTransient; int intra_ener; const int CC = st->channels; int LM, M; int start; int end; int effEnd; int codedBands; int alloc_trim; int postfilter_pitch; opus_val16 postfilter_gain; int intensity=0; int dual_stereo=0; opus_int32 total_bits; opus_int32 balance; opus_int32 tell; int dynalloc_logp; int postfilter_tapset; int anti_collapse_rsv; int anti_collapse_on=0; int silence; int C = st->stream_channels; const OpusCustomMode *mode; int nbEBands; int overlap; const opus_int16 *eBands; ALLOC_STACK; mode = st->mode; nbEBands = mode->nbEBands; overlap = mode->overlap; eBands = mode->eBands; start = st->start; end = st->end; frame_size *= st->downsample; lpc = (opus_val16*)(st->_decode_mem+(DECODE_BUFFER_SIZE+overlap)*CC); oldBandE = lpc+CC*LPC_ORDER; oldLogE = oldBandE + 2*nbEBands; oldLogE2 = oldLogE + 2*nbEBands; backgroundLogE = oldLogE2 + 2*nbEBands; #ifdef CUSTOM_MODES if (st->signalling && data!=NULL) { int data0=data[0]; /* Convert "standard mode" to Opus header */ if (mode->Fs==48000 && mode->shortMdctSize==120) { data0 = fromOpus(data0); if (data0<0) return OPUS_INVALID_PACKET; } st->end = end = IMAX(1, mode->effEBands-2*(data0>>5)); LM = (data0>>3)&0x3; C = 1 + ((data0>>2)&0x1); data++; len--; if (LM>mode->maxLM) return OPUS_INVALID_PACKET; if (frame_size < mode->shortMdctSize<shortMdctSize<maxLM;LM++) if (mode->shortMdctSize<mode->maxLM) return OPUS_BAD_ARG; } M=1<1275 || pcm==NULL) return OPUS_BAD_ARG; N = M*mode->shortMdctSize; c=0; do { decode_mem[c] = st->_decode_mem + c*(DECODE_BUFFER_SIZE+overlap); out_syn[c] = decode_mem[c]+DECODE_BUFFER_SIZE-N; } while (++c mode->effEBands) effEnd = mode->effEBands; if (data == NULL || len<=1) { celt_decode_lost(st, N, LM); deemphasis(out_syn, pcm, N, CC, st->downsample, mode->preemph, st->preemph_memD, accum); RESTORE_STACK; return frame_size/st->downsample; } /* Check if there are at least two packets received consecutively before * turning on the pitch-based PLC */ st->skip_plc = st->loss_count != 0; if (dec == NULL) { ec_dec_init(&_dec,(unsigned char*)data,len); dec = &_dec; } if (C==1) { for (i=0;i= total_bits) silence = 1; else if (tell==1) silence = ec_dec_bit_logp(dec, 15); else silence = 0; if (silence) { /* Pretend we've read all the remaining bits */ tell = len*8; dec->nbits_total+=tell-ec_tell(dec); } postfilter_gain = 0; postfilter_pitch = 0; postfilter_tapset = 0; if (start==0 && tell+16 <= total_bits) { if(ec_dec_bit_logp(dec, 1)) { int qg, octave; octave = ec_dec_uint(dec, 6); postfilter_pitch = (16< 0 && tell+3 <= total_bits) { isTransient = ec_dec_bit_logp(dec, 3); tell = ec_tell(dec); } else isTransient = 0; if (isTransient) shortBlocks = M; else shortBlocks = 0; /* Decode the global flags (first symbols in the stream) */ intra_ener = tell+3<=total_bits ? ec_dec_bit_logp(dec, 3) : 0; /* Get band energies */ unquant_coarse_energy(mode, start, end, oldBandE, intra_ener, dec, C, LM); ALLOC(tf_res, nbEBands, int); tf_decode(start, end, isTransient, tf_res, LM, dec); tell = ec_tell(dec); spread_decision = SPREAD_NORMAL; if (tell+4 <= total_bits) spread_decision = ec_dec_icdf(dec, spread_icdf, 5); ALLOC(cap, nbEBands, int); init_caps(mode,cap,LM,C); ALLOC(offsets, nbEBands, int); dynalloc_logp = 6; total_bits<<=BITRES; tell = ec_tell_frac(dec); for (i=start;i0) dynalloc_logp = IMAX(2, dynalloc_logp-1); } ALLOC(fine_quant, nbEBands, int); alloc_trim = tell+(6<=2&&bits>=((LM+2)<rng, 0, st->arch, st->disable_inv); if (anti_collapse_rsv > 0) { anti_collapse_on = ec_dec_bits(dec, 1); } unquant_energy_finalise(mode, start, end, oldBandE, fine_quant, fine_priority, len*8-ec_tell(dec), dec, C); if (anti_collapse_on) anti_collapse(mode, X, collapse_masks, LM, C, N, start, end, oldBandE, oldLogE, oldLogE2, pulses, st->rng, st->arch); if (silence) { for (i=0;idownsample, silence, st->arch); c=0; do { st->postfilter_period=IMAX(st->postfilter_period, COMBFILTER_MINPERIOD); st->postfilter_period_old=IMAX(st->postfilter_period_old, COMBFILTER_MINPERIOD); comb_filter(out_syn[c], out_syn[c], st->postfilter_period_old, st->postfilter_period, mode->shortMdctSize, st->postfilter_gain_old, st->postfilter_gain, st->postfilter_tapset_old, st->postfilter_tapset, mode->window, overlap, st->arch); if (LM!=0) comb_filter(out_syn[c]+mode->shortMdctSize, out_syn[c]+mode->shortMdctSize, st->postfilter_period, postfilter_pitch, N-mode->shortMdctSize, st->postfilter_gain, postfilter_gain, st->postfilter_tapset, postfilter_tapset, mode->window, overlap, st->arch); } while (++cpostfilter_period_old = st->postfilter_period; st->postfilter_gain_old = st->postfilter_gain; st->postfilter_tapset_old = st->postfilter_tapset; st->postfilter_period = postfilter_pitch; st->postfilter_gain = postfilter_gain; st->postfilter_tapset = postfilter_tapset; if (LM!=0) { st->postfilter_period_old = st->postfilter_period; st->postfilter_gain_old = st->postfilter_gain; st->postfilter_tapset_old = st->postfilter_tapset; } if (C==1) OPUS_COPY(&oldBandE[nbEBands], oldBandE, nbEBands); /* In case start or end were to change */ if (!isTransient) { opus_val16 max_background_increase; OPUS_COPY(oldLogE2, oldLogE, 2*nbEBands); OPUS_COPY(oldLogE, oldBandE, 2*nbEBands); /* In normal circumstances, we only allow the noise floor to increase by up to 2.4 dB/second, but when we're in DTX, we allow up to 6 dB increase for each update.*/ if (st->loss_count < 10) max_background_increase = M*QCONST16(0.001f,DB_SHIFT); else max_background_increase = QCONST16(1.f,DB_SHIFT); for (i=0;i<2*nbEBands;i++) backgroundLogE[i] = MIN16(backgroundLogE[i] + max_background_increase, oldBandE[i]); } else { for (i=0;i<2*nbEBands;i++) oldLogE[i] = MIN16(oldLogE[i], oldBandE[i]); } c=0; do { for (i=0;irng = dec->rng; deemphasis(out_syn, pcm, N, CC, st->downsample, mode->preemph, st->preemph_memD, accum); st->loss_count = 0; RESTORE_STACK; if (ec_tell(dec) > 8*len) return OPUS_INTERNAL_ERROR; if(ec_get_error(dec)) st->error = 1; return frame_size/st->downsample; } #ifdef CUSTOM_MODES #ifdef FIXED_POINT int opus_custom_decode(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, opus_int16 * OPUS_RESTRICT pcm, int frame_size) { return celt_decode_with_ec(st, data, len, pcm, frame_size, NULL, 0); } #ifndef DISABLE_FLOAT_API int opus_custom_decode_float(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, float * OPUS_RESTRICT pcm, int frame_size) { int j, ret, C, N; VARDECL(opus_int16, out); ALLOC_STACK; if (pcm==NULL) return OPUS_BAD_ARG; C = st->channels; N = frame_size; ALLOC(out, C*N, opus_int16); ret=celt_decode_with_ec(st, data, len, out, frame_size, NULL, 0); if (ret>0) for (j=0;jchannels; N = frame_size; ALLOC(out, C*N, celt_sig); ret=celt_decode_with_ec(st, data, len, out, frame_size, NULL, 0); if (ret>0) for (j=0;j=st->mode->nbEBands) goto bad_arg; st->start = value; } break; case CELT_SET_END_BAND_REQUEST: { opus_int32 value = va_arg(ap, opus_int32); if (value<1 || value>st->mode->nbEBands) goto bad_arg; st->end = value; } break; case CELT_SET_CHANNELS_REQUEST: { opus_int32 value = va_arg(ap, opus_int32); if (value<1 || value>2) goto bad_arg; st->stream_channels = value; } break; case CELT_GET_AND_CLEAR_ERROR_REQUEST: { opus_int32 *value = va_arg(ap, opus_int32*); if (value==NULL) goto bad_arg; *value=st->error; st->error = 0; } break; case OPUS_GET_LOOKAHEAD_REQUEST: { opus_int32 *value = va_arg(ap, opus_int32*); if (value==NULL) goto bad_arg; *value = st->overlap/st->downsample; } break; case OPUS_RESET_STATE: { int i; opus_val16 *lpc, *oldBandE, *oldLogE, *oldLogE2; lpc = (opus_val16*)(st->_decode_mem+(DECODE_BUFFER_SIZE+st->overlap)*st->channels); oldBandE = lpc+st->channels*LPC_ORDER; oldLogE = oldBandE + 2*st->mode->nbEBands; oldLogE2 = oldLogE + 2*st->mode->nbEBands; OPUS_CLEAR((char*)&st->DECODER_RESET_START, opus_custom_decoder_get_size(st->mode, st->channels)- ((char*)&st->DECODER_RESET_START - (char*)st)); for (i=0;i<2*st->mode->nbEBands;i++) oldLogE[i]=oldLogE2[i]=-QCONST16(28.f,DB_SHIFT); st->skip_plc = 1; } break; case OPUS_GET_PITCH_REQUEST: { opus_int32 *value = va_arg(ap, opus_int32*); if (value==NULL) goto bad_arg; *value = st->postfilter_period; } break; case CELT_GET_MODE_REQUEST: { const CELTMode ** value = va_arg(ap, const CELTMode**); if (value==0) goto bad_arg; *value=st->mode; } break; case CELT_SET_SIGNALLING_REQUEST: { opus_int32 value = va_arg(ap, opus_int32); st->signalling = value; } break; case OPUS_GET_FINAL_RANGE_REQUEST: { opus_uint32 * value = va_arg(ap, opus_uint32 *); if (value==0) goto bad_arg; *value=st->rng; } break; case OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST: { opus_int32 value = va_arg(ap, opus_int32); if(value<0 || value>1) { goto bad_arg; } st->disable_inv = value; } break; case OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST: { opus_int32 *value = va_arg(ap, opus_int32*); if (!value) { goto bad_arg; } *value = st->disable_inv; } break; default: goto bad_request; } va_end(ap); return OPUS_OK; bad_arg: va_end(ap); return OPUS_BAD_ARG; bad_request: va_end(ap); return OPUS_UNIMPLEMENTED; } mumble-1.3.4/3rdparty/opus-src/celt/fixed_c5x.h0000664000175000017500000000473514010707327021153 0ustar builderbuilder/* Copyright (C) 2003 Jean-Marc Valin */ /** @file fixed_c5x.h @brief Fixed-point operations for the TI C5x DSP family */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef FIXED_C5X_H #define FIXED_C5X_H #include "dsplib.h" #undef IMUL32 static OPUS_INLINE long IMUL32(long i, long j) { long ac0, ac1; ac0 = _lmpy(i>>16,j); ac1 = ac0 + _lmpy(i,j>>16); return _lmpyu(i,j) + (ac1<<16); } #undef MAX16 #define MAX16(a,b) _max(a,b) #undef MIN16 #define MIN16(a,b) _min(a,b) #undef MAX32 #define MAX32(a,b) _lmax(a,b) #undef MIN32 #define MIN32(a,b) _lmin(a,b) #undef VSHR32 #define VSHR32(a, shift) _lshl(a,-(shift)) #undef MULT16_16_Q15 #define MULT16_16_Q15(a,b) (_smpy(a,b)) #undef MULT16_16SU #define MULT16_16SU(a,b) _lmpysu(a,b) #undef MULT_16_16 #define MULT_16_16(a,b) _lmpy(a,b) /* FIXME: This is technically incorrect and is bound to cause problems. Is there any cleaner solution? */ #undef MULT16_32_Q15 #define MULT16_32_Q15(a,b) ADD32(SHL(MULT16_16((a),SHR((b),16)),1), SHR(MULT16_16SU((a),(b)),15)) #define celt_ilog2(x) (30 - _lnorm(x)) #define OVERRIDE_CELT_ILOG2 #define celt_maxabs16(x, len) MAX32(EXTEND32(maxval((DATA *)x, len)),-EXTEND32(minval((DATA *)x, len))) #define OVERRIDE_CELT_MAXABS16 #endif /* FIXED_C5X_H */ mumble-1.3.4/3rdparty/opus-src/celt/pitch.h0000664000175000017500000001340314010707327020374 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /** @file pitch.h @brief Pitch analysis */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef PITCH_H #define PITCH_H #include "modes.h" #include "cpu_support.h" #if (defined(OPUS_X86_MAY_HAVE_SSE) && !defined(FIXED_POINT)) \ || ((defined(OPUS_X86_MAY_HAVE_SSE4_1) || defined(OPUS_X86_MAY_HAVE_SSE2)) && defined(FIXED_POINT)) #include "x86/pitch_sse.h" #endif #if defined(MIPSr1_ASM) #include "mips/pitch_mipsr1.h" #endif #if (defined(OPUS_ARM_ASM) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR)) # include "arm/pitch_arm.h" #endif void pitch_downsample(celt_sig * OPUS_RESTRICT x[], opus_val16 * OPUS_RESTRICT x_lp, int len, int C, int arch); void pitch_search(const opus_val16 * OPUS_RESTRICT x_lp, opus_val16 * OPUS_RESTRICT y, int len, int max_pitch, int *pitch, int arch); opus_val16 remove_doubling(opus_val16 *x, int maxperiod, int minperiod, int N, int *T0, int prev_period, opus_val16 prev_gain, int arch); /* OPT: This is the kernel you really want to optimize. It gets used a lot by the prefilter and by the PLC. */ static OPUS_INLINE void xcorr_kernel_c(const opus_val16 * x, const opus_val16 * y, opus_val32 sum[4], int len) { int j; opus_val16 y_0, y_1, y_2, y_3; celt_assert(len>=3); y_3=0; /* gcc doesn't realize that y_3 can't be used uninitialized */ y_0=*y++; y_1=*y++; y_2=*y++; for (j=0;j0) { opus_val16 num; opus_val32 xcorr16; xcorr16 = EXTRACT16(VSHR32(xcorr[i], xshift)); #ifndef FIXED_POINT /* Considering the range of xcorr16, this should avoid both underflows and overflows (inf) when squaring xcorr16 */ xcorr16 *= 1e-12f; #endif num = MULT16_16_Q15(xcorr16,xcorr16); if (MULT16_32_Q15(num,best_den[1]) > MULT16_32_Q15(best_num[1],Syy)) { if (MULT16_32_Q15(num,best_den[0]) > MULT16_32_Q15(best_num[0],Syy)) { best_num[1] = best_num[0]; best_den[1] = best_den[0]; best_pitch[1] = best_pitch[0]; best_num[0] = num; best_den[0] = Syy; best_pitch[0] = i; } else { best_num[1] = num; best_den[1] = Syy; best_pitch[1] = i; } } } Syy += SHR32(MULT16_16(y[i+len],y[i+len]),yshift) - SHR32(MULT16_16(y[i],y[i]),yshift); Syy = MAX32(1, Syy); } } static void celt_fir5(const opus_val16 *x, const opus_val16 *num, opus_val16 *y, int N, opus_val16 *mem) { int i; opus_val16 num0, num1, num2, num3, num4; opus_val32 mem0, mem1, mem2, mem3, mem4; num0=num[0]; num1=num[1]; num2=num[2]; num3=num[3]; num4=num[4]; mem0=mem[0]; mem1=mem[1]; mem2=mem[2]; mem3=mem[3]; mem4=mem[4]; for (i=0;i>1;i++) x_lp[i] = SHR32(HALF32(HALF32(x[0][(2*i-1)]+x[0][(2*i+1)])+x[0][2*i]), shift); x_lp[0] = SHR32(HALF32(HALF32(x[0][1])+x[0][0]), shift); if (C==2) { for (i=1;i>1;i++) x_lp[i] += SHR32(HALF32(HALF32(x[1][(2*i-1)]+x[1][(2*i+1)])+x[1][2*i]), shift); x_lp[0] += SHR32(HALF32(HALF32(x[1][1])+x[1][0]), shift); } _celt_autocorr(x_lp, ac, NULL, 0, 4, len>>1, arch); /* Noise floor -40 dB */ #ifdef FIXED_POINT ac[0] += SHR32(ac[0],13); #else ac[0] *= 1.0001f; #endif /* Lag windowing */ for (i=1;i<=4;i++) { /*ac[i] *= exp(-.5*(2*M_PI*.002*i)*(2*M_PI*.002*i));*/ #ifdef FIXED_POINT ac[i] -= MULT16_32_Q15(2*i*i, ac[i]); #else ac[i] -= ac[i]*(.008f*i)*(.008f*i); #endif } _celt_lpc(lpc, ac, 4); for (i=0;i<4;i++) { tmp = MULT16_16_Q15(QCONST16(.9f,15), tmp); lpc[i] = MULT16_16_Q15(lpc[i], tmp); } /* Add a zero */ lpc2[0] = lpc[0] + QCONST16(.8f,SIG_SHIFT); lpc2[1] = lpc[1] + MULT16_16_Q15(c1,lpc[0]); lpc2[2] = lpc[2] + MULT16_16_Q15(c1,lpc[1]); lpc2[3] = lpc[3] + MULT16_16_Q15(c1,lpc[2]); lpc2[4] = MULT16_16_Q15(c1,lpc[3]); celt_fir5(x_lp, lpc2, x_lp, len>>1, mem); } /* Pure C implementation. */ #ifdef FIXED_POINT opus_val32 #else void #endif celt_pitch_xcorr_c(const opus_val16 *_x, const opus_val16 *_y, opus_val32 *xcorr, int len, int max_pitch, int arch) { #if 0 /* This is a simple version of the pitch correlation that should work well on DSPs like Blackfin and TI C5x/C6x */ int i, j; #ifdef FIXED_POINT opus_val32 maxcorr=1; #endif #if !defined(OVERRIDE_PITCH_XCORR) (void)arch; #endif for (i=0;i0); celt_assert((((unsigned char *)_x-(unsigned char *)NULL)&3)==0); for (i=0;i0); celt_assert(max_pitch>0); lag = len+max_pitch; ALLOC(x_lp4, len>>2, opus_val16); ALLOC(y_lp4, lag>>2, opus_val16); ALLOC(xcorr, max_pitch>>1, opus_val32); /* Downsample by 2 again */ for (j=0;j>2;j++) x_lp4[j] = x_lp[2*j]; for (j=0;j>2;j++) y_lp4[j] = y[2*j]; #ifdef FIXED_POINT xmax = celt_maxabs16(x_lp4, len>>2); ymax = celt_maxabs16(y_lp4, lag>>2); shift = celt_ilog2(MAX32(1, MAX32(xmax, ymax)))-11; if (shift>0) { for (j=0;j>2;j++) x_lp4[j] = SHR16(x_lp4[j], shift); for (j=0;j>2;j++) y_lp4[j] = SHR16(y_lp4[j], shift); /* Use double the shift for a MAC */ shift *= 2; } else { shift = 0; } #endif /* Coarse search with 4x decimation */ #ifdef FIXED_POINT maxcorr = #endif celt_pitch_xcorr(x_lp4, y_lp4, xcorr, len>>2, max_pitch>>2, arch); find_best_pitch(xcorr, y_lp4, len>>2, max_pitch>>2, best_pitch #ifdef FIXED_POINT , 0, maxcorr #endif ); /* Finer search with 2x decimation */ #ifdef FIXED_POINT maxcorr=1; #endif for (i=0;i>1;i++) { opus_val32 sum; xcorr[i] = 0; if (abs(i-2*best_pitch[0])>2 && abs(i-2*best_pitch[1])>2) continue; #ifdef FIXED_POINT sum = 0; for (j=0;j>1;j++) sum += SHR32(MULT16_16(x_lp[j],y[i+j]), shift); #else sum = celt_inner_prod(x_lp, y+i, len>>1, arch); #endif xcorr[i] = MAX32(-1, sum); #ifdef FIXED_POINT maxcorr = MAX32(maxcorr, sum); #endif } find_best_pitch(xcorr, y, len>>1, max_pitch>>1, best_pitch #ifdef FIXED_POINT , shift+1, maxcorr #endif ); /* Refine by pseudo-interpolation */ if (best_pitch[0]>0 && best_pitch[0]<(max_pitch>>1)-1) { opus_val32 a, b, c; a = xcorr[best_pitch[0]-1]; b = xcorr[best_pitch[0]]; c = xcorr[best_pitch[0]+1]; if ((c-a) > MULT16_32_Q15(QCONST16(.7f,15),b-a)) offset = 1; else if ((a-c) > MULT16_32_Q15(QCONST16(.7f,15),b-c)) offset = -1; else offset = 0; } else { offset = 0; } *pitch = 2*best_pitch[0]-offset; RESTORE_STACK; } #ifdef FIXED_POINT static opus_val16 compute_pitch_gain(opus_val32 xy, opus_val32 xx, opus_val32 yy) { opus_val32 x2y2; int sx, sy, shift; opus_val32 g; opus_val16 den; if (xy == 0 || xx == 0 || yy == 0) return 0; sx = celt_ilog2(xx)-14; sy = celt_ilog2(yy)-14; shift = sx + sy; x2y2 = SHR32(MULT16_16(VSHR32(xx, sx), VSHR32(yy, sy)), 14); if (shift & 1) { if (x2y2 < 32768) { x2y2 <<= 1; shift--; } else { x2y2 >>= 1; shift++; } } den = celt_rsqrt_norm(x2y2); g = MULT16_32_Q15(den, xy); g = VSHR32(g, (shift>>1)-1); return EXTRACT16(MIN32(g, Q15ONE)); } #else static opus_val16 compute_pitch_gain(opus_val32 xy, opus_val32 xx, opus_val32 yy) { return xy/celt_sqrt(1+xx*yy); } #endif static const int second_check[16] = {0, 0, 3, 2, 3, 2, 5, 2, 3, 2, 3, 2, 5, 2, 3, 2}; opus_val16 remove_doubling(opus_val16 *x, int maxperiod, int minperiod, int N, int *T0_, int prev_period, opus_val16 prev_gain, int arch) { int k, i, T, T0; opus_val16 g, g0; opus_val16 pg; opus_val32 xy,xx,yy,xy2; opus_val32 xcorr[3]; opus_val32 best_xy, best_yy; int offset; int minperiod0; VARDECL(opus_val32, yy_lookup); SAVE_STACK; minperiod0 = minperiod; maxperiod /= 2; minperiod /= 2; *T0_ /= 2; prev_period /= 2; N /= 2; x += maxperiod; if (*T0_>=maxperiod) *T0_=maxperiod-1; T = T0 = *T0_; ALLOC(yy_lookup, maxperiod+1, opus_val32); dual_inner_prod(x, x, x-T0, N, &xx, &xy, arch); yy_lookup[0] = xx; yy=xx; for (i=1;i<=maxperiod;i++) { yy = yy+MULT16_16(x[-i],x[-i])-MULT16_16(x[N-i],x[N-i]); yy_lookup[i] = MAX32(0, yy); } yy = yy_lookup[T0]; best_xy = xy; best_yy = yy; g = g0 = compute_pitch_gain(xy, xx, yy); /* Look for any pitch at T/k */ for (k=2;k<=15;k++) { int T1, T1b; opus_val16 g1; opus_val16 cont=0; opus_val16 thresh; T1 = celt_udiv(2*T0+k, 2*k); if (T1 < minperiod) break; /* Look for another strong correlation at T1b */ if (k==2) { if (T1+T0>maxperiod) T1b = T0; else T1b = T0+T1; } else { T1b = celt_udiv(2*second_check[k]*T0+k, 2*k); } dual_inner_prod(x, &x[-T1], &x[-T1b], N, &xy, &xy2, arch); xy = HALF32(xy + xy2); yy = HALF32(yy_lookup[T1] + yy_lookup[T1b]); g1 = compute_pitch_gain(xy, xx, yy); if (abs(T1-prev_period)<=1) cont = prev_gain; else if (abs(T1-prev_period)<=2 && 5*k*k < T0) cont = HALF16(prev_gain); else cont = 0; thresh = MAX16(QCONST16(.3f,15), MULT16_16_Q15(QCONST16(.7f,15),g0)-cont); /* Bias against very high pitch (very short period) to avoid false-positives due to short-term correlation */ if (T1<3*minperiod) thresh = MAX16(QCONST16(.4f,15), MULT16_16_Q15(QCONST16(.85f,15),g0)-cont); else if (T1<2*minperiod) thresh = MAX16(QCONST16(.5f,15), MULT16_16_Q15(QCONST16(.9f,15),g0)-cont); if (g1 > thresh) { best_xy = xy; best_yy = yy; T = T1; g = g1; } } best_xy = MAX32(0, best_xy); if (best_yy <= best_xy) pg = Q15ONE; else pg = SHR32(frac_div32(best_xy,best_yy+1),16); for (k=0;k<3;k++) xcorr[k] = celt_inner_prod(x, x-(T+k-1), N, arch); if ((xcorr[2]-xcorr[0]) > MULT16_32_Q15(QCONST16(.7f,15),xcorr[1]-xcorr[0])) offset = 1; else if ((xcorr[0]-xcorr[2]) > MULT16_32_Q15(QCONST16(.7f,15),xcorr[1]-xcorr[2])) offset = -1; else offset = 0; if (pg > g) pg = g; *T0_ = 2*T+offset; if (*T0_offs+_this->end_offs>=_this->storage)return -1; _this->buf[_this->offs++]=(unsigned char)_value; return 0; } static int ec_write_byte_at_end(ec_enc *_this,unsigned _value){ if(_this->offs+_this->end_offs>=_this->storage)return -1; _this->buf[_this->storage-++(_this->end_offs)]=(unsigned char)_value; return 0; } /*Outputs a symbol, with a carry bit. If there is a potential to propagate a carry over several symbols, they are buffered until it can be determined whether or not an actual carry will occur. If the counter for the buffered symbols overflows, then the stream becomes undecodable. This gives a theoretical limit of a few billion symbols in a single packet on 32-bit systems. The alternative is to truncate the range in order to force a carry, but requires similar carry tracking in the decoder, needlessly slowing it down.*/ static void ec_enc_carry_out(ec_enc *_this,int _c){ if(_c!=EC_SYM_MAX){ /*No further carry propagation possible, flush buffer.*/ int carry; carry=_c>>EC_SYM_BITS; /*Don't output a byte on the first write. This compare should be taken care of by branch-prediction thereafter.*/ if(_this->rem>=0)_this->error|=ec_write_byte(_this,_this->rem+carry); if(_this->ext>0){ unsigned sym; sym=(EC_SYM_MAX+carry)&EC_SYM_MAX; do _this->error|=ec_write_byte(_this,sym); while(--(_this->ext)>0); } _this->rem=_c&EC_SYM_MAX; } else _this->ext++; } static OPUS_INLINE void ec_enc_normalize(ec_enc *_this){ /*If the range is too small, output some bits and rescale it.*/ while(_this->rng<=EC_CODE_BOT){ ec_enc_carry_out(_this,(int)(_this->val>>EC_CODE_SHIFT)); /*Move the next-to-high-order symbol into the high-order position.*/ _this->val=(_this->val<rng<<=EC_SYM_BITS; _this->nbits_total+=EC_SYM_BITS; } } void ec_enc_init(ec_enc *_this,unsigned char *_buf,opus_uint32 _size){ _this->buf=_buf; _this->end_offs=0; _this->end_window=0; _this->nend_bits=0; /*This is the offset from which ec_tell() will subtract partial bits.*/ _this->nbits_total=EC_CODE_BITS+1; _this->offs=0; _this->rng=EC_CODE_TOP; _this->rem=-1; _this->val=0; _this->ext=0; _this->storage=_size; _this->error=0; } void ec_encode(ec_enc *_this,unsigned _fl,unsigned _fh,unsigned _ft){ opus_uint32 r; r=celt_udiv(_this->rng,_ft); if(_fl>0){ _this->val+=_this->rng-IMUL32(r,(_ft-_fl)); _this->rng=IMUL32(r,(_fh-_fl)); } else _this->rng-=IMUL32(r,(_ft-_fh)); ec_enc_normalize(_this); } void ec_encode_bin(ec_enc *_this,unsigned _fl,unsigned _fh,unsigned _bits){ opus_uint32 r; r=_this->rng>>_bits; if(_fl>0){ _this->val+=_this->rng-IMUL32(r,((1U<<_bits)-_fl)); _this->rng=IMUL32(r,(_fh-_fl)); } else _this->rng-=IMUL32(r,((1U<<_bits)-_fh)); ec_enc_normalize(_this); } /*The probability of having a "one" is 1/(1<<_logp).*/ void ec_enc_bit_logp(ec_enc *_this,int _val,unsigned _logp){ opus_uint32 r; opus_uint32 s; opus_uint32 l; r=_this->rng; l=_this->val; s=r>>_logp; r-=s; if(_val)_this->val=l+r; _this->rng=_val?s:r; ec_enc_normalize(_this); } void ec_enc_icdf(ec_enc *_this,int _s,const unsigned char *_icdf,unsigned _ftb){ opus_uint32 r; r=_this->rng>>_ftb; if(_s>0){ _this->val+=_this->rng-IMUL32(r,_icdf[_s-1]); _this->rng=IMUL32(r,_icdf[_s-1]-_icdf[_s]); } else _this->rng-=IMUL32(r,_icdf[_s]); ec_enc_normalize(_this); } void ec_enc_uint(ec_enc *_this,opus_uint32 _fl,opus_uint32 _ft){ unsigned ft; unsigned fl; int ftb; /*In order to optimize EC_ILOG(), it is undefined for the value 0.*/ celt_assert(_ft>1); _ft--; ftb=EC_ILOG(_ft); if(ftb>EC_UINT_BITS){ ftb-=EC_UINT_BITS; ft=(_ft>>ftb)+1; fl=(unsigned)(_fl>>ftb); ec_encode(_this,fl,fl+1,ft); ec_enc_bits(_this,_fl&(((opus_uint32)1<end_window; used=_this->nend_bits; celt_assert(_bits>0); if(used+_bits>EC_WINDOW_SIZE){ do{ _this->error|=ec_write_byte_at_end(_this,(unsigned)window&EC_SYM_MAX); window>>=EC_SYM_BITS; used-=EC_SYM_BITS; } while(used>=EC_SYM_BITS); } window|=(ec_window)_fl<end_window=window; _this->nend_bits=used; _this->nbits_total+=_bits; } void ec_enc_patch_initial_bits(ec_enc *_this,unsigned _val,unsigned _nbits){ int shift; unsigned mask; celt_assert(_nbits<=EC_SYM_BITS); shift=EC_SYM_BITS-_nbits; mask=((1<<_nbits)-1)<offs>0){ /*The first byte has been finalized.*/ _this->buf[0]=(unsigned char)((_this->buf[0]&~mask)|_val<rem>=0){ /*The first byte is still awaiting carry propagation.*/ _this->rem=(_this->rem&~mask)|_val<rng<=(EC_CODE_TOP>>_nbits)){ /*The renormalization loop has never been run.*/ _this->val=(_this->val&~((opus_uint32)mask<error=-1; } void ec_enc_shrink(ec_enc *_this,opus_uint32 _size){ celt_assert(_this->offs+_this->end_offs<=_size); OPUS_MOVE(_this->buf+_size-_this->end_offs, _this->buf+_this->storage-_this->end_offs,_this->end_offs); _this->storage=_size; } void ec_enc_done(ec_enc *_this){ ec_window window; int used; opus_uint32 msk; opus_uint32 end; int l; /*We output the minimum number of bits that ensures that the symbols encoded thus far will be decoded correctly regardless of the bits that follow.*/ l=EC_CODE_BITS-EC_ILOG(_this->rng); msk=(EC_CODE_TOP-1)>>l; end=(_this->val+msk)&~msk; if((end|msk)>=_this->val+_this->rng){ l++; msk>>=1; end=(_this->val+msk)&~msk; } while(l>0){ ec_enc_carry_out(_this,(int)(end>>EC_CODE_SHIFT)); end=(end<rem>=0||_this->ext>0)ec_enc_carry_out(_this,0); /*If we have buffered extra bits, flush them as well.*/ window=_this->end_window; used=_this->nend_bits; while(used>=EC_SYM_BITS){ _this->error|=ec_write_byte_at_end(_this,(unsigned)window&EC_SYM_MAX); window>>=EC_SYM_BITS; used-=EC_SYM_BITS; } /*Clear any excess space and add any remaining extra bits to the last byte.*/ if(!_this->error){ OPUS_CLEAR(_this->buf+_this->offs, _this->storage-_this->offs-_this->end_offs); if(used>0){ /*If there's no range coder data at all, give up.*/ if(_this->end_offs>=_this->storage)_this->error=-1; else{ l=-l; /*If we've busted, don't add too many extra bits to the last byte; it would corrupt the range coder data, and that's more important.*/ if(_this->offs+_this->end_offs>=_this->storage&&lerror=-1; } _this->buf[_this->storage-_this->end_offs-1]|=(unsigned char)window; } } } } mumble-1.3.4/3rdparty/opus-src/celt/ecintrin.h0000664000175000017500000000675514010707327021114 0ustar builderbuilder/* Copyright (c) 2003-2008 Timothy B. Terriberry Copyright (c) 2008 Xiph.Org Foundation */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /*Some common macros for potential platform-specific optimization.*/ #include "opus_types.h" #include #include #include "arch.h" #if !defined(_ecintrin_H) # define _ecintrin_H (1) /*Some specific platforms may have optimized intrinsic or OPUS_INLINE assembly versions of these functions which can substantially improve performance. We define macros for them to allow easy incorporation of these non-ANSI features.*/ /*Modern gcc (4.x) can compile the naive versions of min and max with cmov if given an appropriate architecture, but the branchless bit-twiddling versions are just as fast, and do not require any special target architecture. Earlier gcc versions (3.x) compiled both code to the same assembly instructions, because of the way they represented ((_b)>(_a)) internally.*/ # define EC_MINI(_a,_b) ((_a)+(((_b)-(_a))&-((_b)<(_a)))) /*Count leading zeros. This macro should only be used for implementing ec_ilog(), if it is defined. All other code should use EC_ILOG() instead.*/ #if defined(_MSC_VER) && (_MSC_VER >= 1400) # include /*In _DEBUG mode this is not an intrinsic by default.*/ # pragma intrinsic(_BitScanReverse) static __inline int ec_bsr(unsigned long _x){ unsigned long ret; _BitScanReverse(&ret,_x); return (int)ret; } # define EC_CLZ0 (1) # define EC_CLZ(_x) (-ec_bsr(_x)) #elif defined(ENABLE_TI_DSPLIB) # include "dsplib.h" # define EC_CLZ0 (31) # define EC_CLZ(_x) (_lnorm(_x)) #elif __GNUC_PREREQ(3,4) # if INT_MAX>=2147483647 # define EC_CLZ0 ((int)sizeof(unsigned)*CHAR_BIT) # define EC_CLZ(_x) (__builtin_clz(_x)) # elif LONG_MAX>=2147483647L # define EC_CLZ0 ((int)sizeof(unsigned long)*CHAR_BIT) # define EC_CLZ(_x) (__builtin_clzl(_x)) # endif #endif #if defined(EC_CLZ) /*Note that __builtin_clz is not defined when _x==0, according to the gcc documentation (and that of the BSR instruction that implements it on x86). The majority of the time we can never pass it zero. When we need to, it can be special cased.*/ # define EC_ILOG(_x) (EC_CLZ0-EC_CLZ(_x)) #else int ec_ilog(opus_uint32 _v); # define EC_ILOG(_x) (ec_ilog(_x)) #endif #endif mumble-1.3.4/3rdparty/opus-src/celt/mfrngcod.h0000664000175000017500000000427014010707327021066 0ustar builderbuilder/* Copyright (c) 2001-2008 Timothy B. Terriberry Copyright (c) 2008-2009 Xiph.Org Foundation */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if !defined(_mfrngcode_H) # define _mfrngcode_H (1) # include "entcode.h" /*Constants used by the entropy encoder/decoder.*/ /*The number of bits to output at a time.*/ # define EC_SYM_BITS (8) /*The total number of bits in each of the state registers.*/ # define EC_CODE_BITS (32) /*The maximum symbol value.*/ # define EC_SYM_MAX ((1U<>EC_SYM_BITS) /*The number of bits available for the last, partial symbol in the code field.*/ # define EC_CODE_EXTRA ((EC_CODE_BITS-2)%EC_SYM_BITS+1) #endif mumble-1.3.4/3rdparty/opus-src/celt/celt.h0000664000175000017500000001720414010707326020216 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Copyright (c) 2008 Gregory Maxwell Written by Jean-Marc Valin and Gregory Maxwell */ /** @file celt.h @brief Contains all the functions for encoding and decoding audio */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef CELT_H #define CELT_H #include "opus_types.h" #include "opus_defines.h" #include "opus_custom.h" #include "entenc.h" #include "entdec.h" #include "arch.h" #ifdef __cplusplus extern "C" { #endif #define CELTEncoder OpusCustomEncoder #define CELTDecoder OpusCustomDecoder #define CELTMode OpusCustomMode #define LEAK_BANDS 19 typedef struct { int valid; float tonality; float tonality_slope; float noisiness; float activity; float music_prob; float vad_prob; int bandwidth; float activity_probability; /* Store as Q6 char to save space. */ unsigned char leak_boost[LEAK_BANDS]; } AnalysisInfo; typedef struct { int signalType; int offset; } SILKInfo; #define __celt_check_mode_ptr_ptr(ptr) ((ptr) + ((ptr) - (const CELTMode**)(ptr))) #define __celt_check_analysis_ptr(ptr) ((ptr) + ((ptr) - (const AnalysisInfo*)(ptr))) #define __celt_check_silkinfo_ptr(ptr) ((ptr) + ((ptr) - (const SILKInfo*)(ptr))) /* Encoder/decoder Requests */ #define CELT_SET_PREDICTION_REQUEST 10002 /** Controls the use of interframe prediction. 0=Independent frames 1=Short term interframe prediction allowed 2=Long term prediction allowed */ #define CELT_SET_PREDICTION(x) CELT_SET_PREDICTION_REQUEST, __opus_check_int(x) #define CELT_SET_INPUT_CLIPPING_REQUEST 10004 #define CELT_SET_INPUT_CLIPPING(x) CELT_SET_INPUT_CLIPPING_REQUEST, __opus_check_int(x) #define CELT_GET_AND_CLEAR_ERROR_REQUEST 10007 #define CELT_GET_AND_CLEAR_ERROR(x) CELT_GET_AND_CLEAR_ERROR_REQUEST, __opus_check_int_ptr(x) #define CELT_SET_CHANNELS_REQUEST 10008 #define CELT_SET_CHANNELS(x) CELT_SET_CHANNELS_REQUEST, __opus_check_int(x) /* Internal */ #define CELT_SET_START_BAND_REQUEST 10010 #define CELT_SET_START_BAND(x) CELT_SET_START_BAND_REQUEST, __opus_check_int(x) #define CELT_SET_END_BAND_REQUEST 10012 #define CELT_SET_END_BAND(x) CELT_SET_END_BAND_REQUEST, __opus_check_int(x) #define CELT_GET_MODE_REQUEST 10015 /** Get the CELTMode used by an encoder or decoder */ #define CELT_GET_MODE(x) CELT_GET_MODE_REQUEST, __celt_check_mode_ptr_ptr(x) #define CELT_SET_SIGNALLING_REQUEST 10016 #define CELT_SET_SIGNALLING(x) CELT_SET_SIGNALLING_REQUEST, __opus_check_int(x) #define CELT_SET_TONALITY_REQUEST 10018 #define CELT_SET_TONALITY(x) CELT_SET_TONALITY_REQUEST, __opus_check_int(x) #define CELT_SET_TONALITY_SLOPE_REQUEST 10020 #define CELT_SET_TONALITY_SLOPE(x) CELT_SET_TONALITY_SLOPE_REQUEST, __opus_check_int(x) #define CELT_SET_ANALYSIS_REQUEST 10022 #define CELT_SET_ANALYSIS(x) CELT_SET_ANALYSIS_REQUEST, __celt_check_analysis_ptr(x) #define OPUS_SET_LFE_REQUEST 10024 #define OPUS_SET_LFE(x) OPUS_SET_LFE_REQUEST, __opus_check_int(x) #define OPUS_SET_ENERGY_MASK_REQUEST 10026 #define OPUS_SET_ENERGY_MASK(x) OPUS_SET_ENERGY_MASK_REQUEST, __opus_check_val16_ptr(x) #define CELT_SET_SILK_INFO_REQUEST 10028 #define CELT_SET_SILK_INFO(x) CELT_SET_SILK_INFO_REQUEST, __celt_check_silkinfo_ptr(x) /* Encoder stuff */ int celt_encoder_get_size(int channels); int celt_encode_with_ec(OpusCustomEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes, ec_enc *enc); int celt_encoder_init(CELTEncoder *st, opus_int32 sampling_rate, int channels, int arch); /* Decoder stuff */ int celt_decoder_get_size(int channels); int celt_decoder_init(CELTDecoder *st, opus_int32 sampling_rate, int channels); int celt_decode_with_ec(OpusCustomDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, opus_val16 * OPUS_RESTRICT pcm, int frame_size, ec_dec *dec, int accum); #define celt_encoder_ctl opus_custom_encoder_ctl #define celt_decoder_ctl opus_custom_decoder_ctl #ifdef CUSTOM_MODES #define OPUS_CUSTOM_NOSTATIC #else #define OPUS_CUSTOM_NOSTATIC static OPUS_INLINE #endif static const unsigned char trim_icdf[11] = {126, 124, 119, 109, 87, 41, 19, 9, 4, 2, 0}; /* Probs: NONE: 21.875%, LIGHT: 6.25%, NORMAL: 65.625%, AGGRESSIVE: 6.25% */ static const unsigned char spread_icdf[4] = {25, 23, 2, 0}; static const unsigned char tapset_icdf[3]={2,1,0}; #ifdef CUSTOM_MODES static const unsigned char toOpusTable[20] = { 0xE0, 0xE8, 0xF0, 0xF8, 0xC0, 0xC8, 0xD0, 0xD8, 0xA0, 0xA8, 0xB0, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x80, 0x88, 0x90, 0x98, }; static const unsigned char fromOpusTable[16] = { 0x80, 0x88, 0x90, 0x98, 0x40, 0x48, 0x50, 0x58, 0x20, 0x28, 0x30, 0x38, 0x00, 0x08, 0x10, 0x18 }; static OPUS_INLINE int toOpus(unsigned char c) { int ret=0; if (c<0xA0) ret = toOpusTable[c>>3]; if (ret == 0) return -1; else return ret|(c&0x7); } static OPUS_INLINE int fromOpus(unsigned char c) { if (c<0x80) return -1; else return fromOpusTable[(c>>3)-16] | (c&0x7); } #endif /* CUSTOM_MODES */ #define COMBFILTER_MAXPERIOD 1024 #define COMBFILTER_MINPERIOD 15 extern const signed char tf_select_table[4][8]; int resampling_factor(opus_int32 rate); void celt_preemphasis(const opus_val16 * OPUS_RESTRICT pcmp, celt_sig * OPUS_RESTRICT inp, int N, int CC, int upsample, const opus_val16 *coef, celt_sig *mem, int clip); void comb_filter(opus_val32 *y, opus_val32 *x, int T0, int T1, int N, opus_val16 g0, opus_val16 g1, int tapset0, int tapset1, const opus_val16 *window, int overlap, int arch); #ifdef NON_STATIC_COMB_FILTER_CONST_C void comb_filter_const_c(opus_val32 *y, opus_val32 *x, int T, int N, opus_val16 g10, opus_val16 g11, opus_val16 g12); #endif #ifndef OVERRIDE_COMB_FILTER_CONST # define comb_filter_const(y, x, T, N, g10, g11, g12, arch) \ ((void)(arch),comb_filter_const_c(y, x, T, N, g10, g11, g12)) #endif void init_caps(const CELTMode *m,int *cap,int LM,int C); #ifdef RESYNTH void deemphasis(celt_sig *in[], opus_val16 *pcm, int N, int C, int downsample, const opus_val16 *coef, celt_sig *mem); void celt_synthesis(const CELTMode *mode, celt_norm *X, celt_sig * out_syn[], opus_val16 *oldBandE, int start, int effEnd, int C, int CC, int isTransient, int LM, int downsample, int silence); #endif #ifdef __cplusplus } #endif #endif /* CELT_H */ mumble-1.3.4/3rdparty/opus-src/celt/mips/0000775000175000017500000000000014010707327020063 5ustar builderbuildermumble-1.3.4/3rdparty/opus-src/celt/mips/kiss_fft_mipsr1.h0000664000175000017500000001342614010707327023345 0ustar builderbuilder/*Copyright (c) 2013, Xiph.Org Foundation and contributors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.*/ #ifndef KISS_FFT_MIPSR1_H #define KISS_FFT_MIPSR1_H #if !defined(KISS_FFT_GUTS_H) #error "This file should only be included from _kiss_fft_guts.h" #endif #ifdef FIXED_POINT #define S_MUL_ADD(a, b, c, d) (S_MUL(a,b)+S_MUL(c,d)) #define S_MUL_SUB(a, b, c, d) (S_MUL(a,b)-S_MUL(c,d)) #undef S_MUL_ADD static inline int S_MUL_ADD(int a, int b, int c, int d) { int m; asm volatile("MULT $ac1, %0, %1" : : "r" ((int)a), "r" ((int)b)); asm volatile("madd $ac1, %0, %1" : : "r" ((int)c), "r" ((int)d)); asm volatile("EXTR.W %0,$ac1, %1" : "=r" (m): "i" (15)); return m; } #undef S_MUL_SUB static inline int S_MUL_SUB(int a, int b, int c, int d) { int m; asm volatile("MULT $ac1, %0, %1" : : "r" ((int)a), "r" ((int)b)); asm volatile("msub $ac1, %0, %1" : : "r" ((int)c), "r" ((int)d)); asm volatile("EXTR.W %0,$ac1, %1" : "=r" (m): "i" (15)); return m; } #undef C_MUL # define C_MUL(m,a,b) (m=C_MUL_fun(a,b)) static inline kiss_fft_cpx C_MUL_fun(kiss_fft_cpx a, kiss_twiddle_cpx b) { kiss_fft_cpx m; asm volatile("MULT $ac1, %0, %1" : : "r" ((int)a.r), "r" ((int)b.r)); asm volatile("msub $ac1, %0, %1" : : "r" ((int)a.i), "r" ((int)b.i)); asm volatile("EXTR.W %0,$ac1, %1" : "=r" (m.r): "i" (15)); asm volatile("MULT $ac1, %0, %1" : : "r" ((int)a.r), "r" ((int)b.i)); asm volatile("madd $ac1, %0, %1" : : "r" ((int)a.i), "r" ((int)b.r)); asm volatile("EXTR.W %0,$ac1, %1" : "=r" (m.i): "i" (15)); return m; } #undef C_MULC # define C_MULC(m,a,b) (m=C_MULC_fun(a,b)) static inline kiss_fft_cpx C_MULC_fun(kiss_fft_cpx a, kiss_twiddle_cpx b) { kiss_fft_cpx m; asm volatile("MULT $ac1, %0, %1" : : "r" ((int)a.r), "r" ((int)b.r)); asm volatile("madd $ac1, %0, %1" : : "r" ((int)a.i), "r" ((int)b.i)); asm volatile("EXTR.W %0,$ac1, %1" : "=r" (m.r): "i" (15)); asm volatile("MULT $ac1, %0, %1" : : "r" ((int)a.i), "r" ((int)b.r)); asm volatile("msub $ac1, %0, %1" : : "r" ((int)a.r), "r" ((int)b.i)); asm volatile("EXTR.W %0,$ac1, %1" : "=r" (m.i): "i" (15)); return m; } #endif /* FIXED_POINT */ #define OVERRIDE_kf_bfly5 static void kf_bfly5( kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_state *st, int m, int N, int mm ) { kiss_fft_cpx *Fout0,*Fout1,*Fout2,*Fout3,*Fout4; int i, u; kiss_fft_cpx scratch[13]; const kiss_twiddle_cpx *tw; kiss_twiddle_cpx ya,yb; kiss_fft_cpx * Fout_beg = Fout; #ifdef FIXED_POINT ya.r = 10126; ya.i = -31164; yb.r = -26510; yb.i = -19261; #else ya = st->twiddles[fstride*m]; yb = st->twiddles[fstride*2*m]; #endif tw=st->twiddles; for (i=0;ir += scratch[7].r + scratch[8].r; Fout0->i += scratch[7].i + scratch[8].i; scratch[5].r = scratch[0].r + S_MUL_ADD(scratch[7].r,ya.r,scratch[8].r,yb.r); scratch[5].i = scratch[0].i + S_MUL_ADD(scratch[7].i,ya.r,scratch[8].i,yb.r); scratch[6].r = S_MUL_ADD(scratch[10].i,ya.i,scratch[9].i,yb.i); scratch[6].i = -S_MUL_ADD(scratch[10].r,ya.i,scratch[9].r,yb.i); C_SUB(*Fout1,scratch[5],scratch[6]); C_ADD(*Fout4,scratch[5],scratch[6]); scratch[11].r = scratch[0].r + S_MUL_ADD(scratch[7].r,yb.r,scratch[8].r,ya.r); scratch[11].i = scratch[0].i + S_MUL_ADD(scratch[7].i,yb.r,scratch[8].i,ya.r); scratch[12].r = S_MUL_SUB(scratch[9].i,ya.i,scratch[10].i,yb.i); scratch[12].i = S_MUL_SUB(scratch[10].r,yb.i,scratch[9].r,ya.i); C_ADD(*Fout2,scratch[11],scratch[12]); C_SUB(*Fout3,scratch[11],scratch[12]); ++Fout0;++Fout1;++Fout2;++Fout3;++Fout4; } } } #endif /* KISS_FFT_MIPSR1_H */ mumble-1.3.4/3rdparty/opus-src/celt/mips/pitch_mipsr1.h0000664000175000017500000001176014010707327022643 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /** @file pitch.h @brief Pitch analysis */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef PITCH_MIPSR1_H #define PITCH_MIPSR1_H #define OVERRIDE_DUAL_INNER_PROD static inline void dual_inner_prod(const opus_val16 *x, const opus_val16 *y01, const opus_val16 *y02, int N, opus_val32 *xy1, opus_val32 *xy2, int arch) { int j; opus_val32 xy01=0; opus_val32 xy02=0; (void)arch; asm volatile("MULT $ac1, $0, $0"); asm volatile("MULT $ac2, $0, $0"); /* Compute the norm of X+Y and X-Y as |X|^2 + |Y|^2 +/- sum(xy) */ for (j=0;j=0;i--) { celt_norm x1, x2; x1 = Xptr[0]; x2 = Xptr[stride]; Xptr[stride] = EXTRACT16(PSHR32(MAC16_16(MULT16_16(c, x2), s, x1), 15)); *Xptr-- = EXTRACT16(PSHR32(MAC16_16(MULT16_16(c, x1), ms, x2), 15)); } } #define OVERRIDE_renormalise_vector #define renormalise_vector(X, N, gain, arch) \ (renormalise_vector_mips(X, N, gain, arch)) void renormalise_vector_mips(celt_norm *X, int N, opus_val16 gain, int arch) { int i; #ifdef FIXED_POINT int k; #endif opus_val32 E = EPSILON; opus_val16 g; opus_val32 t; celt_norm *xptr = X; int X0, X1; (void)arch; asm volatile("mult $ac1, $0, $0"); asm volatile("MTLO %0, $ac1" : :"r" (E)); /*if(N %4) printf("error");*/ for (i=0;i>1; #endif t = VSHR32(E, 2*(k-7)); g = MULT16_16_P15(celt_rsqrt_norm(t),gain); xptr = X; for (i=0;i #include "celt.h" #include "pitch.h" #include "bands.h" #include "modes.h" #include "entcode.h" #include "quant_bands.h" #include "rate.h" #include "stack_alloc.h" #include "mathops.h" #include "float_cast.h" #include #include "celt_lpc.h" #include "vq.h" #define OVERRIDE_comb_filter void comb_filter(opus_val32 *y, opus_val32 *x, int T0, int T1, int N, opus_val16 g0, opus_val16 g1, int tapset0, int tapset1, const opus_val16 *window, int overlap, int arch) { int i; opus_val32 x0, x1, x2, x3, x4; (void)arch; /* printf ("%d %d %f %f\n", T0, T1, g0, g1); */ opus_val16 g00, g01, g02, g10, g11, g12; static const opus_val16 gains[3][3] = { {QCONST16(0.3066406250f, 15), QCONST16(0.2170410156f, 15), QCONST16(0.1296386719f, 15)}, {QCONST16(0.4638671875f, 15), QCONST16(0.2680664062f, 15), QCONST16(0.f, 15)}, {QCONST16(0.7998046875f, 15), QCONST16(0.1000976562f, 15), QCONST16(0.f, 15)}}; if (g0==0 && g1==0) { /* OPT: Happens to work without the OPUS_MOVE(), but only because the current encoder already copies x to y */ if (x!=y) OPUS_MOVE(y, x, N); return; } g00 = MULT16_16_P15(g0, gains[tapset0][0]); g01 = MULT16_16_P15(g0, gains[tapset0][1]); g02 = MULT16_16_P15(g0, gains[tapset0][2]); g10 = MULT16_16_P15(g1, gains[tapset1][0]); g11 = MULT16_16_P15(g1, gains[tapset1][1]); g12 = MULT16_16_P15(g1, gains[tapset1][2]); x1 = x[-T1+1]; x2 = x[-T1 ]; x3 = x[-T1-1]; x4 = x[-T1-2]; /* If the filter didn't change, we don't need the overlap */ if (g0==g1 && T0==T1 && tapset0==tapset1) overlap=0; for (i=0;i #include "os_support.h" #include "mathops.h" #include "stack_alloc.h" /* Forward MDCT trashes the input array */ #define OVERRIDE_clt_mdct_forward void clt_mdct_forward(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar * OPUS_RESTRICT out, const opus_val16 *window, int overlap, int shift, int stride, int arch) { int i; int N, N2, N4; VARDECL(kiss_fft_scalar, f); VARDECL(kiss_fft_cpx, f2); const kiss_fft_state *st = l->kfft[shift]; const kiss_twiddle_scalar *trig; opus_val16 scale; #ifdef FIXED_POINT /* Allows us to scale with MULT16_32_Q16(), which is faster than MULT16_32_Q15() on ARM. */ int scale_shift = st->scale_shift-1; #endif (void)arch; SAVE_STACK; scale = st->scale; N = l->n; trig = l->trig; for (i=0;i>= 1; trig += N; } N2 = N>>1; N4 = N>>2; ALLOC(f, N2, kiss_fft_scalar); ALLOC(f2, N4, kiss_fft_cpx); /* Consider the input to be composed of four blocks: [a, b, c, d] */ /* Window, shuffle, fold */ { /* Temp pointers to make it really clear to the compiler what we're doing */ const kiss_fft_scalar * OPUS_RESTRICT xp1 = in+(overlap>>1); const kiss_fft_scalar * OPUS_RESTRICT xp2 = in+N2-1+(overlap>>1); kiss_fft_scalar * OPUS_RESTRICT yp = f; const opus_val16 * OPUS_RESTRICT wp1 = window+(overlap>>1); const opus_val16 * OPUS_RESTRICT wp2 = window+(overlap>>1)-1; for(i=0;i<((overlap+3)>>2);i++) { /* Real part arranged as -d-cR, Imag part arranged as -b+aR*/ *yp++ = S_MUL_ADD(*wp2, xp1[N2],*wp1,*xp2); *yp++ = S_MUL_SUB(*wp1, *xp1,*wp2, xp2[-N2]); xp1+=2; xp2-=2; wp1+=2; wp2-=2; } wp1 = window; wp2 = window+overlap-1; for(;i>2);i++) { /* Real part arranged as a-bR, Imag part arranged as -c-dR */ *yp++ = *xp2; *yp++ = *xp1; xp1+=2; xp2-=2; } for(;ibitrev[i]] = yc; } } /* N/4 complex FFT, does not downscale anymore */ opus_fft_impl(st, f2); /* Post-rotate */ { /* Temp pointers to make it really clear to the compiler what we're doing */ const kiss_fft_cpx * OPUS_RESTRICT fp = f2; kiss_fft_scalar * OPUS_RESTRICT yp1 = out; kiss_fft_scalar * OPUS_RESTRICT yp2 = out+stride*(N2-1); const kiss_twiddle_scalar *t = &trig[0]; /* Temp pointers to make it really clear to the compiler what we're doing */ for(i=0;ii,t[N4+i] , fp->r,t[i]); yi = S_MUL_ADD(fp->r,t[N4+i] ,fp->i,t[i]); *yp1 = yr; *yp2 = yi; fp++; yp1 += 2*stride; yp2 -= 2*stride; } } RESTORE_STACK; } #define OVERRIDE_clt_mdct_backward void clt_mdct_backward(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar * OPUS_RESTRICT out, const opus_val16 * OPUS_RESTRICT window, int overlap, int shift, int stride, int arch) { int i; int N, N2, N4; const kiss_twiddle_scalar *trig; (void)arch; N = l->n; trig = l->trig; for (i=0;i>= 1; trig += N; } N2 = N>>1; N4 = N>>2; /* Pre-rotate */ { /* Temp pointers to make it really clear to the compiler what we're doing */ const kiss_fft_scalar * OPUS_RESTRICT xp1 = in; const kiss_fft_scalar * OPUS_RESTRICT xp2 = in+stride*(N2-1); kiss_fft_scalar * OPUS_RESTRICT yp = out+(overlap>>1); const kiss_twiddle_scalar * OPUS_RESTRICT t = &trig[0]; const opus_int16 * OPUS_RESTRICT bitrev = l->kfft[shift]->bitrev; for(i=0;ikfft[shift], (kiss_fft_cpx*)(out+(overlap>>1))); /* Post-rotate and de-shuffle from both ends of the buffer at once to make it in-place. */ { kiss_fft_scalar * OPUS_RESTRICT yp0 = out+(overlap>>1); kiss_fft_scalar * OPUS_RESTRICT yp1 = out+(overlap>>1)+N2-2; const kiss_twiddle_scalar *t = &trig[0]; /* Loop to (N4+1)>>1 to handle odd N4. When N4 is odd, the middle pair will be computed twice. */ for(i=0;i<(N4+1)>>1;i++) { kiss_fft_scalar re, im, yr, yi; kiss_twiddle_scalar t0, t1; /* We swap real and imag because we're using an FFT instead of an IFFT. */ re = yp0[1]; im = yp0[0]; t0 = t[i]; t1 = t[N4+i]; /* We'd scale up by 2 here, but instead it's done when mixing the windows */ yr = S_MUL_ADD(re,t0 , im,t1); yi = S_MUL_SUB(re,t1 , im,t0); /* We swap real and imag because we're using an FFT instead of an IFFT. */ re = yp1[1]; im = yp1[0]; yp0[0] = yr; yp1[1] = yi; t0 = t[(N4-i-1)]; t1 = t[(N2-i-1)]; /* We'd scale up by 2 here, but instead it's done when mixing the windows */ yr = S_MUL_ADD(re,t0,im,t1); yi = S_MUL_SUB(re,t1,im,t0); yp1[0] = yr; yp0[1] = yi; yp0 += 2; yp1 -= 2; } } /* Mirror on both sides for TDAC */ { kiss_fft_scalar * OPUS_RESTRICT xp1 = out+overlap-1; kiss_fft_scalar * OPUS_RESTRICT yp1 = out; const opus_val16 * OPUS_RESTRICT wp1 = window; const opus_val16 * OPUS_RESTRICT wp2 = window+overlap-1; for(i = 0; i < overlap/2; i++) { kiss_fft_scalar x1, x2; x1 = *xp1; x2 = *yp1; *yp1++ = MULT16_32_Q15(*wp2, x2) - MULT16_32_Q15(*wp1, x1); *xp1-- = MULT16_32_Q15(*wp1, x2) + MULT16_32_Q15(*wp2, x1); wp1++; wp2--; } } } #endif /* __MDCT_MIPSR1_H__ */ mumble-1.3.4/3rdparty/opus-src/celt/float_cast.h0000664000175000017500000001161014010707327021402 0ustar builderbuilder/* Copyright (C) 2001 Erik de Castro Lopo */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* Version 1.1 */ #ifndef FLOAT_CAST_H #define FLOAT_CAST_H #include "arch.h" /*============================================================================ ** On Intel Pentium processors (especially PIII and probably P4), converting ** from float to int is very slow. To meet the C specs, the code produced by ** most C compilers targeting Pentium needs to change the FPU rounding mode ** before the float to int conversion is performed. ** ** Changing the FPU rounding mode causes the FPU pipeline to be flushed. It ** is this flushing of the pipeline which is so slow. ** ** Fortunately the ISO C99 specifications define the functions lrint, lrintf, ** llrint and llrintf which fix this problem as a side effect. ** ** On Unix-like systems, the configure process should have detected the ** presence of these functions. If they weren't found we have to replace them ** here with a standard C cast. */ /* ** The C99 prototypes for lrint and lrintf are as follows: ** ** long int lrintf (float x) ; ** long int lrint (double x) ; */ /* The presence of the required functions are detected during the configure ** process and the values HAVE_LRINT and HAVE_LRINTF are set accordingly in ** the config.h file. */ /* With GCC, when SSE is available, the fastest conversion is cvtss2si. */ #if defined(__GNUC__) && defined(__SSE__) #include static OPUS_INLINE opus_int32 float2int(float x) {return _mm_cvt_ss2si(_mm_set_ss(x));} #elif defined(HAVE_LRINTF) /* These defines enable functionality introduced with the 1999 ISO C ** standard. They must be defined before the inclusion of math.h to ** engage them. If optimisation is enabled, these functions will be ** inlined. With optimisation switched off, you have to link in the ** maths library using -lm. */ #define _ISOC9X_SOURCE 1 #define _ISOC99_SOURCE 1 #define __USE_ISOC9X 1 #define __USE_ISOC99 1 #include #define float2int(x) lrintf(x) #elif (defined(HAVE_LRINT)) #define _ISOC9X_SOURCE 1 #define _ISOC99_SOURCE 1 #define __USE_ISOC9X 1 #define __USE_ISOC99 1 #include #define float2int(x) lrint(x) #elif (defined(_MSC_VER) && _MSC_VER >= 1400) && defined (_M_X64) #include __inline long int float2int(float value) { return _mm_cvtss_si32(_mm_load_ss(&value)); } #elif (defined(_MSC_VER) && _MSC_VER >= 1400) && defined (_M_IX86) #include /* Win32 doesn't seem to have these functions. ** Therefore implement OPUS_INLINE versions of these functions here. */ __inline long int float2int (float flt) { int intgr; _asm { fld flt fistp intgr } ; return intgr ; } #else #if (defined(__GNUC__) && defined(__STDC__) && __STDC__ && __STDC_VERSION__ >= 199901L) /* supported by gcc in C99 mode, but not by all other compilers */ #warning "Don't have the functions lrint() and lrintf ()." #warning "Replacing these functions with a standard C cast." #endif /* __STDC_VERSION__ >= 199901L */ #include #define float2int(flt) ((int)(floor(.5+flt))) #endif #ifndef DISABLE_FLOAT_API static OPUS_INLINE opus_int16 FLOAT2INT16(float x) { x = x*CELT_SIG_SCALE; x = MAX32(x, -32768); x = MIN32(x, 32767); return (opus_int16)float2int(x); } #endif /* DISABLE_FLOAT_API */ #endif /* FLOAT_CAST_H */ mumble-1.3.4/3rdparty/opus-src/celt/os_support.h0000664000175000017500000000613314010707327021504 0ustar builderbuilder/* Copyright (C) 2007 Jean-Marc Valin File: os_support.h This is the (tiny) OS abstraction layer. Aside from math.h, this is the only place where system headers are allowed. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef OS_SUPPORT_H #define OS_SUPPORT_H #ifdef CUSTOM_SUPPORT # include "custom_support.h" #endif #include "opus_types.h" #include "opus_defines.h" #include #include #include /** Opus wrapper for malloc(). To do your own dynamic allocation, all you need to do is replace this function and opus_free */ #ifndef OVERRIDE_OPUS_ALLOC static OPUS_INLINE void *opus_alloc (size_t size) { return malloc(size); } #endif /** Same as celt_alloc(), except that the area is only needed inside a CELT call (might cause problem with wideband though) */ #ifndef OVERRIDE_OPUS_ALLOC_SCRATCH static OPUS_INLINE void *opus_alloc_scratch (size_t size) { /* Scratch space doesn't need to be cleared */ return opus_alloc(size); } #endif /** Opus wrapper for free(). To do your own dynamic allocation, all you need to do is replace this function and opus_alloc */ #ifndef OVERRIDE_OPUS_FREE static OPUS_INLINE void opus_free (void *ptr) { free(ptr); } #endif /** Copy n elements from src to dst. The 0* term provides compile-time type checking */ #ifndef OVERRIDE_OPUS_COPY #define OPUS_COPY(dst, src, n) (memcpy((dst), (src), (n)*sizeof(*(dst)) + 0*((dst)-(src)) )) #endif /** Copy n elements from src to dst, allowing overlapping regions. The 0* term provides compile-time type checking */ #ifndef OVERRIDE_OPUS_MOVE #define OPUS_MOVE(dst, src, n) (memmove((dst), (src), (n)*sizeof(*(dst)) + 0*((dst)-(src)) )) #endif /** Set n elements of dst to zero */ #ifndef OVERRIDE_OPUS_CLEAR #define OPUS_CLEAR(dst, n) (memset((dst), 0, (n)*sizeof(*(dst)))) #endif /*#ifdef __GNUC__ #pragma GCC poison printf sprintf #pragma GCC poison malloc free realloc calloc #endif*/ #endif /* OS_SUPPORT_H */ mumble-1.3.4/3rdparty/opus-src/celt/cwrs.h0000664000175000017500000000353514010707327020250 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Copyright (c) 2007-2009 Timothy B. Terriberry Written by Timothy B. Terriberry and Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef CWRS_H #define CWRS_H #include "arch.h" #include "stack_alloc.h" #include "entenc.h" #include "entdec.h" #ifdef CUSTOM_MODES int log2_frac(opus_uint32 val, int frac); #endif void get_required_bits(opus_int16 *bits, int N, int K, int frac); void encode_pulses(const int *_y, int N, int K, ec_enc *enc); opus_val32 decode_pulses(int *_y, int N, int K, ec_dec *dec); #endif /* CWRS_H */ mumble-1.3.4/3rdparty/opus-src/celt/bands.h0000664000175000017500000001245114010707326020355 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Copyright (c) 2008-2009 Gregory Maxwell Written by Jean-Marc Valin and Gregory Maxwell */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef BANDS_H #define BANDS_H #include "arch.h" #include "modes.h" #include "entenc.h" #include "entdec.h" #include "rate.h" opus_int16 bitexact_cos(opus_int16 x); int bitexact_log2tan(int isin,int icos); /** Compute the amplitude (sqrt energy) in each of the bands * @param m Mode data * @param X Spectrum * @param bandE Square root of the energy for each band (returned) */ void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *bandE, int end, int C, int LM, int arch); /*void compute_noise_energies(const CELTMode *m, const celt_sig *X, const opus_val16 *tonality, celt_ener *bandE);*/ /** Normalise each band of X such that the energy in each band is equal to 1 * @param m Mode data * @param X Spectrum (returned normalised) * @param bandE Square root of the energy for each band */ void normalise_bands(const CELTMode *m, const celt_sig * OPUS_RESTRICT freq, celt_norm * OPUS_RESTRICT X, const celt_ener *bandE, int end, int C, int M); /** Denormalise each band of X to restore full amplitude * @param m Mode data * @param X Spectrum (returned de-normalised) * @param bandE Square root of the energy for each band */ void denormalise_bands(const CELTMode *m, const celt_norm * OPUS_RESTRICT X, celt_sig * OPUS_RESTRICT freq, const opus_val16 *bandE, int start, int end, int M, int downsample, int silence); #define SPREAD_NONE (0) #define SPREAD_LIGHT (1) #define SPREAD_NORMAL (2) #define SPREAD_AGGRESSIVE (3) int spreading_decision(const CELTMode *m, const celt_norm *X, int *average, int last_decision, int *hf_average, int *tapset_decision, int update_hf, int end, int C, int M); #ifdef MEASURE_NORM_MSE void measure_norm_mse(const CELTMode *m, float *X, float *X0, float *bandE, float *bandE0, int M, int N, int C); #endif void haar1(celt_norm *X, int N0, int stride); /** Quantisation/encoding of the residual spectrum * @param encode flag that indicates whether we're encoding (1) or decoding (0) * @param m Mode data * @param start First band to process * @param end Last band to process + 1 * @param X Residual (normalised) * @param Y Residual (normalised) for second channel (or NULL for mono) * @param collapse_masks Anti-collapse tracking mask * @param bandE Square root of the energy for each band * @param pulses Bit allocation (per band) for PVQ * @param shortBlocks Zero for long blocks, non-zero for short blocks * @param spread Amount of spreading to use * @param dual_stereo Zero for MS stereo, non-zero for dual stereo * @param intensity First band to use intensity stereo * @param tf_res Time-frequency resolution change * @param total_bits Total number of bits that can be used for the frame (including the ones already spent) * @param balance Number of unallocated bits * @param en Entropy coder state * @param LM log2() of the number of 2.5 subframes in the frame * @param codedBands Last band to receive bits + 1 * @param seed Random generator seed * @param arch Run-time architecture (see opus_select_arch()) */ void quant_all_bands(int encode, const CELTMode *m, int start, int end, celt_norm * X, celt_norm * Y, unsigned char *collapse_masks, const celt_ener *bandE, int *pulses, int shortBlocks, int spread, int dual_stereo, int intensity, int *tf_res, opus_int32 total_bits, opus_int32 balance, ec_ctx *ec, int M, int codedBands, opus_uint32 *seed, int complexity, int arch, int disable_inv); void anti_collapse(const CELTMode *m, celt_norm *X_, unsigned char *collapse_masks, int LM, int C, int size, int start, int end, const opus_val16 *logE, const opus_val16 *prev1logE, const opus_val16 *prev2logE, const int *pulses, opus_uint32 seed, int arch); opus_uint32 celt_lcg_rand(opus_uint32 seed); int hysteresis_decision(opus_val16 val, const opus_val16 *thresholds, const opus_val16 *hysteresis, int N, int prev); #endif /* BANDS_H */ mumble-1.3.4/3rdparty/opus-src/celt/cpu_support.h0000664000175000017500000000450414010707327021652 0ustar builderbuilder/* Copyright (c) 2010 Xiph.Org Foundation * Copyright (c) 2013 Parrot */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef CPU_SUPPORT_H #define CPU_SUPPORT_H #include "opus_types.h" #include "opus_defines.h" #if defined(OPUS_HAVE_RTCD) && \ (defined(OPUS_ARM_ASM) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR)) #include "arm/armcpu.h" /* We currently support 4 ARM variants: * arch[0] -> ARMv4 * arch[1] -> ARMv5E * arch[2] -> ARMv6 * arch[3] -> NEON */ #define OPUS_ARCHMASK 3 #elif (defined(OPUS_X86_MAY_HAVE_SSE) && !defined(OPUS_X86_PRESUME_SSE)) || \ (defined(OPUS_X86_MAY_HAVE_SSE2) && !defined(OPUS_X86_PRESUME_SSE2)) || \ (defined(OPUS_X86_MAY_HAVE_SSE4_1) && !defined(OPUS_X86_PRESUME_SSE4_1)) || \ (defined(OPUS_X86_MAY_HAVE_AVX) && !defined(OPUS_X86_PRESUME_AVX)) #include "x86/x86cpu.h" /* We currently support 5 x86 variants: * arch[0] -> non-sse * arch[1] -> sse * arch[2] -> sse2 * arch[3] -> sse4.1 * arch[4] -> avx */ #define OPUS_ARCHMASK 7 int opus_select_arch(void); #else #define OPUS_ARCHMASK 0 static OPUS_INLINE int opus_select_arch(void) { return 0; } #endif #endif mumble-1.3.4/3rdparty/opus-src/celt/laplace.h0000664000175000017500000000413614010707327020671 0ustar builderbuilder/* Copyright (c) 2007 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "entenc.h" #include "entdec.h" /** Encode a value that is assumed to be the realisation of a Laplace-distributed random process @param enc Entropy encoder state @param value Value to encode @param fs Probability of 0, multiplied by 32768 @param decay Probability of the value +/- 1, multiplied by 16384 */ void ec_laplace_encode(ec_enc *enc, int *value, unsigned fs, int decay); /** Decode a value that is assumed to be the realisation of a Laplace-distributed random process @param dec Entropy decoder state @param fs Probability of 0, multiplied by 32768 @param decay Probability of the value +/- 1, multiplied by 16384 @return Value decoded */ int ec_laplace_decode(ec_dec *dec, unsigned fs, int decay); mumble-1.3.4/3rdparty/opus-src/LICENSE_PLEASE_READ.txt0000664000175000017500000000127714010707326021641 0ustar builderbuilderContributions to the collaboration shall not be considered confidential. Each contributor represents and warrants that it has the right and authority to license copyright in its contributions to the collaboration. Each contributor agrees to license the copyright in the contributions under the Modified (2-clause or 3-clause) BSD License or the Clear BSD License. Please see the IPR statements submitted to the IETF for the complete patent licensing details: Xiph.Org Foundation: https://datatracker.ietf.org/ipr/1524/ Microsoft Corporation: https://datatracker.ietf.org/ipr/1914/ Skype Limited: https://datatracker.ietf.org/ipr/1602/ Broadcom Corporation: https://datatracker.ietf.org/ipr/1526/ mumble-1.3.4/3rdparty/opus-build/0000775000175000017500000000000014010707273016474 5ustar builderbuildermumble-1.3.4/3rdparty/opus-build/opus-build.pro0000664000175000017500000001265514010707273021312 0ustar builderbuilderinclude(../../qmake/compiler.pri) BUILDDIR=$$basename(PWD) SOURCEDIR=$$replace(BUILDDIR,-build,-src) !win32 { VERSION=0 #$$ Fool packaging script } !exists(../$$SOURCEDIR/COPYING) { message("The $$SOURCEDIR/ directory was not found. Please update your submodules (git submodule update --init).") error("Aborting configuration") } TEMPLATE = lib CONFIG -= qt CONFIG += debug_and_release CONFIG += no_include_pwd VPATH = ../$$SOURCEDIR TARGET = opus DEFINES += HAVE_CONFIG_H CONFIG(static) { CONFIG -= static CONFIG += shared } !CONFIG(third-party-warnings) { # We ignore warnings in third party builds. We won't actually look # at them and they clutter out our warnings. CONFIG -= warn_on CONFIG += warn_off } QMAKE_CFLAGS -= -fPIE -pie win32 { DEFINES += WIN32 _WIN32 INCLUDEPATH += ../$$BUILDDIR/win32 CONFIG(sse2) { TARGET_VERSION_EXT = .sse2 } else { QMAKE_CFLAGS_RELEASE -= -arch:SSE QMAKE_CFLAGS_DEBUG -= -arch:SSE } } unix { contains(QMAKE_CFLAGS, -ffast-math) { DEFINES += FLOAT_APPROX } INCLUDEPATH += ../$$BUILDDIR } INCLUDEPATH *= \ ../$$SOURCEDIR \ ../$$SOURCEDIR/celt \ ../$$SOURCEDIR/celt/x86 \ ../$$SOURCEDIR/include \ ../$$SOURCEDIR/silk \ ../$$SOURCEDIR/silk/x86 \ ../$$SOURCEDIR/silk/float win32-msvc* { CONFIG *= opus-sse-sources CONFIG *= opus-sse2-sources CONFIG *= opus-sse41-sources } macx:!CONFIG(universal) { CONFIG *= opus-sse-sources CONFIG *= opus-sse2-sources } # celt_sources.mk: CELT_SOURCES SOURCES *= \ celt/bands.c \ celt/celt.c \ celt/celt_encoder.c \ celt/celt_decoder.c \ celt/cwrs.c \ celt/entcode.c \ celt/entdec.c \ celt/entenc.c \ celt/kiss_fft.c \ celt/laplace.c \ celt/mathops.c \ celt/mdct.c \ celt/modes.c \ celt/pitch.c \ celt/celt_lpc.c \ celt/quant_bands.c \ celt/rate.c \ celt/vq.c CONFIG(opus-sse-sources) { # celt_sources.mk: CELT_SOURCES_SSE SOURCES *= \ celt/x86/x86cpu.c \ celt/x86/x86_celt_map.c \ celt/x86/pitch_sse.c } CONFIG(opus-sse2-sources) { # celt_sources.mk: CELT_SOURCES_SSE2 SOURCES *= \ celt/x86/pitch_sse2.c \ celt/x86/vq_sse2.c } CONFIG(opus-sse41-sources) { # celt_sources.mk: CELT_SOURCES_SSE4_1 SOURCES *= \ celt/x86/celt_lpc_sse.c \ celt/x86/pitch_sse4_1.c } # silk_sources.mk: SILK_SOURCES + SILK_SOURCES_FLOAT SOURCES *= \ silk/CNG.c \ silk/code_signs.c \ silk/init_decoder.c \ silk/decode_core.c \ silk/decode_frame.c \ silk/decode_parameters.c \ silk/decode_indices.c \ silk/decode_pulses.c \ silk/decoder_set_fs.c \ silk/dec_API.c \ silk/enc_API.c \ silk/encode_indices.c \ silk/encode_pulses.c \ silk/gain_quant.c \ silk/interpolate.c \ silk/LP_variable_cutoff.c \ silk/NLSF_decode.c \ silk/NSQ.c \ silk/NSQ_del_dec.c \ silk/PLC.c \ silk/shell_coder.c \ silk/tables_gain.c \ silk/tables_LTP.c \ silk/tables_NLSF_CB_NB_MB.c \ silk/tables_NLSF_CB_WB.c \ silk/tables_other.c \ silk/tables_pitch_lag.c \ silk/tables_pulses_per_block.c \ silk/VAD.c \ silk/control_audio_bandwidth.c \ silk/quant_LTP_gains.c \ silk/VQ_WMat_EC.c \ silk/HP_variable_cutoff.c \ silk/NLSF_encode.c \ silk/NLSF_VQ.c \ silk/NLSF_unpack.c \ silk/NLSF_del_dec_quant.c \ silk/process_NLSFs.c \ silk/stereo_LR_to_MS.c \ silk/stereo_MS_to_LR.c \ silk/check_control_input.c \ silk/control_SNR.c \ silk/init_encoder.c \ silk/control_codec.c \ silk/A2NLSF.c \ silk/ana_filt_bank_1.c \ silk/biquad_alt.c \ silk/bwexpander_32.c \ silk/bwexpander.c \ silk/debug.c \ silk/decode_pitch.c \ silk/inner_prod_aligned.c \ silk/lin2log.c \ silk/log2lin.c \ silk/LPC_analysis_filter.c \ silk/LPC_inv_pred_gain.c \ silk/table_LSF_cos.c \ silk/NLSF2A.c \ silk/NLSF_stabilize.c \ silk/NLSF_VQ_weights_laroia.c \ silk/pitch_est_tables.c \ silk/resampler.c \ silk/resampler_down2_3.c \ silk/resampler_down2.c \ silk/resampler_private_AR2.c \ silk/resampler_private_down_FIR.c \ silk/resampler_private_IIR_FIR.c \ silk/resampler_private_up2_HQ.c \ silk/resampler_rom.c \ silk/sigm_Q15.c \ silk/sort.c \ silk/sum_sqr_shift.c \ silk/stereo_decode_pred.c \ silk/stereo_encode_pred.c \ silk/stereo_find_predictor.c \ silk/stereo_quant_pred.c \ silk/LPC_fit.c \ silk/float/apply_sine_window_FLP.c \ silk/float/corrMatrix_FLP.c \ silk/float/encode_frame_FLP.c \ silk/float/find_LPC_FLP.c \ silk/float/find_LTP_FLP.c \ silk/float/find_pitch_lags_FLP.c \ silk/float/find_pred_coefs_FLP.c \ silk/float/LPC_analysis_filter_FLP.c \ silk/float/LTP_analysis_filter_FLP.c \ silk/float/LTP_scale_ctrl_FLP.c \ silk/float/noise_shape_analysis_FLP.c \ silk/float/process_gains_FLP.c \ silk/float/regularize_correlations_FLP.c \ silk/float/residual_energy_FLP.c \ silk/float/warped_autocorrelation_FLP.c \ silk/float/wrappers_FLP.c \ silk/float/autocorrelation_FLP.c \ silk/float/burg_modified_FLP.c \ silk/float/bwexpander_FLP.c \ silk/float/energy_FLP.c \ silk/float/inner_product_FLP.c \ silk/float/k2a_FLP.c \ silk/float/LPC_inv_pred_gain_FLP.c \ silk/float/pitch_analysis_core_FLP.c \ silk/float/scale_copy_vector_FLP.c \ silk/float/scale_vector_FLP.c \ silk/float/schur_FLP.c \ silk/float/sort_FLP.c CONFIG(opus-sse41-sources) { # silk_sources.mk: SILK_SOURCES_SSE4_1 SOURCES *= \ silk/x86/NSQ_sse.c \ silk/x86/NSQ_del_dec_sse.c \ silk/x86/x86_silk_map.c \ silk/x86/VAD_sse.c \ silk/x86/VQ_WMat_EC_sse.c } # opus_sources.mk: OPUS_SOURCES + OPUS_SOURCES_FLOAT SOURCES *= \ src/opus.c \ src/opus_decoder.c \ src/opus_encoder.c \ src/opus_multistream.c \ src/opus_multistream_encoder.c \ src/opus_multistream_decoder.c \ src/repacketizer.c \ src/analysis.c \ src/mlp.c \ src/mlp_data.c include(../../qmake/symbols.pri) mumble-1.3.4/3rdparty/opus-build/win32/0000775000175000017500000000000014010707273017436 5ustar builderbuildermumble-1.3.4/3rdparty/opus-build/win32/config.h0000664000175000017500000000522514010707273021060 0ustar builderbuilder/*********************************************************************** Copyright (c) 2011, Skype Limited. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Internet Society, IETF or IETF Trust, nor the names of specific contributors, may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ #ifndef CONFIG_H #define CONFIG_H #define USE_ALLOCA 1 /* Comment out the next line for floating-point code */ /*#define FIXED_POINT 1 */ #define OPUS_BUILD 1 #define DLL_EXPORT 1 #if defined(_M_IX86) || defined(_M_X64) /* Can always compile SSE intrinsics (no special compiler flags necessary) */ #define OPUS_X86_MAY_HAVE_SSE #define OPUS_X86_MAY_HAVE_SSE2 #define OPUS_X86_MAY_HAVE_SSE4_1 /* Presume SSE functions, if compiled to use SSE/SSE2/AVX (note that AMD64 implies SSE2, and AVX implies SSE4.1) */ #if defined(_M_X64) || (defined(_M_IX86_FP) && (_M_IX86_FP >= 1)) || defined(__AVX__) #define OPUS_X86_PRESUME_SSE 1 #endif #if defined(_M_X64) || (defined(_M_IX86_FP) && (_M_IX86_FP >= 2)) || defined(__AVX__) #define OPUS_X86_PRESUME_SSE2 1 #endif #if defined(__AVX__) #define OPUS_X86_PRESUME_SSE4_1 1 #endif #if !defined(OPUS_X86_PRESUME_SSE4_1) || !defined(OPUS_X86_PRESUME_SSE2) || !defined(OPUS_X86_PRESUME_SSE) #define OPUS_HAVE_RTCD 1 #endif #endif #include "version.h" #endif /* CONFIG_H */ mumble-1.3.4/3rdparty/opus-build/win32/version.h0000664000175000017500000000004114010707273021267 0ustar builderbuilder#define PACKAGE_VERSION "v1.1.3" mumble-1.3.4/3rdparty/opus-build/config.h0000664000175000017500000001105514010707273020114 0ustar builderbuilder/* config.h. Generated from config.h.in by configure. */ /* config.h.in. Generated from configure.ac by autoheader. */ /* Use ARM NEON optimizations */ /* #undef ARM_HAVE_NEON */ /* Use generic ARMv4 asm optimizations */ /* #undef ARMv4_ASM */ /* Use ARMv5E asm optimizations */ /* #undef ARMv5E_ASM */ /* Use ARMv6 asm optimizations */ /* #undef ARMv6_ASM */ /* Custom modes */ /* #undef CUSTOM_MODES */ /* Assertions */ /* #undef ENABLE_ASSERTIONS */ /* Debug fixed-point implementation */ /* #undef FIXED_DEBUG */ /* Compile as fixed-point (for machines without a fast enough FPU) */ /* #undef FIXED_POINT */ /* Float approximations */ /* #undef FLOAT_APPROX */ /* Fuzzing */ /* #undef FUZZING */ /* Define to 1 if you have the header file. */ /* #undef HAVE_ALLOCA_H */ /* Define to 1 if you have the header file. */ #define HAVE_DLFCN_H 1 /* Define to 1 if you have the header file. */ #define HAVE_INTTYPES_H 1 /* Define to 1 if you have the `lrint' function. */ #define HAVE_LRINT 1 /* Define to 1 if you have the `lrintf' function. */ #define HAVE_LRINTF 1 /* Define to 1 if you have the header file. */ #define HAVE_MEMORY_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STDINT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STDLIB_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STRINGS_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STRING_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_STAT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_TYPES_H 1 /* Define to 1 if you have the header file. */ #define HAVE_UNISTD_H 1 /* Define to 1 if you have the `__malloc_hook' function. */ #define HAVE___MALLOC_HOOK 1 /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #define LT_OBJDIR ".libs/" /* Define to 1 if your C compiler doesn't accept -c and -o together. */ /* #undef NO_MINUS_C_MINUS_O */ /* This is a build of OPUS */ #define OPUS_BUILD /**/ /* Use run-time CPU capabilities detection */ /* #undef OPUS_HAVE_RTCD */ /* Define to the address where bug reports for this package should be sent. */ #define PACKAGE_BUGREPORT "opus@xiph.org" /* Define to the full name of this package. */ #define PACKAGE_NAME "opus" /* Define to the full name and version of this package. */ #define PACKAGE_STRING "opus 1.2.1" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "opus" /* Define to the home page for this package. */ #define PACKAGE_URL "" /* Define to the version of this package. */ #define PACKAGE_VERSION "1.2.1" /* Define to 1 if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* Make use of alloca */ /* #undef USE_ALLOCA */ /* Use C99 variable-size arrays */ #define VAR_ARRAYS 1 /* Define to empty if `const' does not conform to ANSI C. */ /* #undef const */ /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus /* #undef inline */ #endif /* Define to the equivalent of the C99 'restrict' keyword, or to nothing if this is not supported. Do not define if restrict is supported directly. */ #define restrict __restrict /* Work around a bug in Sun C++: it does not support _Restrict or __restrict__, even though the corresponding Sun C compiler ends up with "#define restrict _Restrict" or "#define restrict __restrict__" in the previous line. Perhaps some future version of Sun C++ will work with restrict; if so, hopefully it defines __RESTRICT like Sun C does. */ #if defined __SUNPRO_CC && !defined __RESTRICT # define _Restrict # define __restrict__ #endif // For now, only enable for OS X. We're sure // that modern OS X is x86-64, but we can't make // the same assumption for other Unix-like OSes. #if defined(__APPLE__) && defined(__x86_64__) /* Use run-time CPU capabilities detection */ /* #undef OPUS_HAVE_RTCD */ /* Compiler supports X86 SSE Intrinsics */ #define OPUS_X86_MAY_HAVE_SSE 1 /* Compiler supports X86 SSE2 Intrinsics */ #define OPUS_X86_MAY_HAVE_SSE2 1 /* Compiler supports X86 SSE4.1 Intrinsics */ /* #undef OPUS_X86_MAY_HAVE_SSE4_1 */ /* Define if binary requires SSE intrinsics support */ #define OPUS_X86_PRESUME_SSE 1 /* Define if binary requires SSE2 intrinsics support */ #define OPUS_X86_PRESUME_SSE2 1 /* Define if binary requires SSE4.1 intrinsics support */ /* #undef OPUS_X86_PRESUME_SSE4_1 */ #endif mumble-1.3.4/3rdparty/arc4random-src/0000775000175000017500000000000014010707273017230 5ustar builderbuildermumble-1.3.4/3rdparty/arc4random-src/LICENSE0000664000175000017500000000135314010707273020237 0ustar builderbuilderCopyright (c) 2008, Damien Miller Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. mumble-1.3.4/3rdparty/arc4random-src/arc4random_uniform.cpp0000664000175000017500000000544714010707273023537 0ustar builderbuilder/* $OpenBSD: arc4random_uniform.c,v 1.2 2015/09/13 08:31:47 guenther Exp $ */ /* * Copyright (c) 2008, Damien Miller * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ // This is arc4random_uniform.c from OpenBSD's source tree at // $OPENBSD_ROOT/lib/libc/crypt/arc4random_uniform.c. // // Mumble-specific changes: // // - Change file extension to .cpp and rename to mumble_arc4random_uniform.cpp. // - Add CryptographicRandom.h include. // - Remove and includes, include for uint32_t. // - Added an implementation of arc4random called mumble_arc4random. // - Rename arc4random_uniform to mumble_arc4random_uniform. // - Change call to arc4random in mumble_arc4random_uniform to call // mumble_arc4random instead of arc4random. // - Remove DEF_WEAK for arc4random_uniform. // - Disable MSVC warning 4146. #include #include "CryptographicRandom.h" #if defined(_MSC_VER) // Disable "unary minus operator applied to unsigned type, result still unsigned" // warning. The unary minus operator used in arc4random_uniform is perfectly valid. # pragma warning(disable: 4146) #endif // Call through to CryptographicRandom::uint32() uint32_t mumble_arc4random(void) { return CryptographicRandom::uint32(); } /* * Calculate a uniformly distributed random number less than upper_bound * avoiding "modulo bias". * * Uniformity is achieved by generating new random numbers until the one * returned is outside the range [0, 2**32 % upper_bound). This * guarantees the selected random number will be inside * [2**32 % upper_bound, 2**32) which maps back to [0, upper_bound) * after reduction modulo upper_bound. */ uint32_t mumble_arc4random_uniform(uint32_t upper_bound) { uint32_t r, min; if (upper_bound < 2) return 0; /* 2**32 % x == (2**32 - x) % x */ min = -upper_bound % upper_bound; /* * This could theoretically loop forever but each retry has * p > 0.5 (worst case, usually far better) of selecting a * number inside the range we need, so it should rarely need * to re-roll. */ for (;;) { r = mumble_arc4random(); if (r >= min) break; } return r % upper_bound; } mumble-1.3.4/3rdparty/arc4random-src/arc4random_uniform.h0000664000175000017500000000072314010707273023174 0ustar builderbuilder// Copyright 2005-2019 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . #ifndef MUMBLE_3RDPARTY_ARC4RANDOM_UNIFORM_H_ #define MUMBLE_3RDPARTY_ARC4RANDOM_UNIFORM_H_ #include uint32_t mumble_arc4random(void); uint32_t mumble_arc4random_uniform(uint32_t upper_bound); #endif mumble-1.3.4/3rdparty/mach-override-src/0000775000175000017500000000000014010707335017722 5ustar builderbuildermumble-1.3.4/3rdparty/mach-override-src/mach_override.h0000664000175000017500000000623014010707335022703 0ustar builderbuilder// mach_override.h semver:1.2.0 // Copyright (c) 2003-2012 Jonathan 'Wolf' Rentzsch: http://rentzsch.com // Some rights reserved: http://opensource.org/licenses/mit // https://github.com/rentzsch/mach_override #ifndef _mach_override_ #define _mach_override_ #include #include #define err_cannot_override (err_local|1) __BEGIN_DECLS /**************************************************************************************** Dynamically overrides the function implementation referenced by originalFunctionAddress with the implentation pointed to by overrideFunctionAddress. Optionally returns a pointer to a "reentry island" which, if jumped to, will resume the original implementation. @param originalFunctionAddress -> Required address of the function to override (with overrideFunctionAddress). @param overrideFunctionAddress -> Required address to the overriding function. @param originalFunctionReentryIsland <- Optional pointer to pointer to the reentry island. Can be NULL. @result <- err_cannot_override if the original function's implementation begins with the 'mfctr' instruction. ************************************************************************************/ mach_error_t mach_override_ptr( void *originalFunctionAddress, const void *overrideFunctionAddress, void **originalFunctionReentryIsland ); __END_DECLS /**************************************************************************************** If you're using C++ this macro will ease the tedium of typedef'ing, naming, keeping track of reentry islands and defining your override code. See test_mach_override.cp for example usage. ************************************************************************************/ #ifdef __cplusplus #define MACH_OVERRIDE( ORIGINAL_FUNCTION_RETURN_TYPE, ORIGINAL_FUNCTION_NAME, ORIGINAL_FUNCTION_ARGS, ERR ) \ { \ static ORIGINAL_FUNCTION_RETURN_TYPE (*ORIGINAL_FUNCTION_NAME##_reenter)ORIGINAL_FUNCTION_ARGS; \ static bool ORIGINAL_FUNCTION_NAME##_overriden = false; \ class mach_override_class__##ORIGINAL_FUNCTION_NAME { \ public: \ static kern_return_t override(void *originalFunctionPtr) { \ kern_return_t result = err_none; \ if (!ORIGINAL_FUNCTION_NAME##_overriden) { \ ORIGINAL_FUNCTION_NAME##_overriden = true; \ result = mach_override_ptr( (void*)originalFunctionPtr, \ (void*)mach_override_class__##ORIGINAL_FUNCTION_NAME::replacement, \ (void**)&ORIGINAL_FUNCTION_NAME##_reenter ); \ } \ return result; \ } \ static ORIGINAL_FUNCTION_RETURN_TYPE replacement ORIGINAL_FUNCTION_ARGS { #define END_MACH_OVERRIDE( ORIGINAL_FUNCTION_NAME ) \ } \ }; \ \ err = mach_override_class__##ORIGINAL_FUNCTION_NAME::override((void*)ORIGINAL_FUNCTION_NAME); \ } #endif #endif // _mach_override_ mumble-1.3.4/3rdparty/mach-override-src/test_mach_override.cp0000664000175000017500000000664714010707335024131 0ustar builderbuilder#include #include #include #include #include #include "mach_override.h" #define assertStrEqual( EXPECTED, ACTUAL ) if( strcmp( (EXPECTED), (ACTUAL) ) != 0 ) { printf( "EXPECTED: %s\nACTUAL: %s\n", (EXPECTED), (ACTUAL)); assert( strcmp( (EXPECTED), (ACTUAL) ) == 0 ); } #define assertIntEqual( EXPECTED, ACTUAL ) if( (EXPECTED) != (ACTUAL) ) { printf( "EXPECTED: %d\nACTUAL: %d\n", (EXPECTED), (ACTUAL)); assert( (EXPECTED) == (ACTUAL) ); } //------------------------------------------------------------------------------ #pragma mark Test Local Override by Pointer const char* localFunction() { asm("nop;nop;nop;nop;"); return __FUNCTION__; } const char* (*localOriginalPtr)() = localFunction; void testLocalFunctionOverrideByPointer() { // Test original. assertStrEqual( "localFunction", localOriginalPtr() ); // Override local function by pointer. kern_return_t err; MACH_OVERRIDE( const char*, localFunction, (), err ) { // Test calling through the reentry island back into the original // implementation. assertStrEqual( "localFunction", localFunction_reenter() ); return "localFunctionOverride"; } END_MACH_OVERRIDE(localFunction); assert( !err ); // Test override took effect. assertStrEqual( "localFunctionOverride", localOriginalPtr() ); } //------------------------------------------------------------------------------ #pragma mark Test System Override by Pointer char* (*strerrorPtr)(int) = strerror; const char* strerrReturnValue = "Unknown error: 0"; void testSystemFunctionOverrideByPointer() { SInt32 sysv; if (Gestalt( gestaltSystemVersion, &sysv ) == noErr && sysv >= 0x1070) strerrReturnValue = "Undefined error: 0"; // Test original. assertStrEqual( strerrReturnValue, strerrorPtr( 0 ) ); // Override system function by pointer. kern_return_t err; MACH_OVERRIDE( char*, strerror, (int errnum), err ) { // Test calling through the reentry island back into the original // implementation. assertStrEqual( strerrReturnValue, strerror_reenter( 0 ) ); return (char *)"strerrorOverride"; } END_MACH_OVERRIDE(strerror); assert( !err ); // Test override took effect. assertStrEqual( "strerrorOverride", strerrorPtr( 0 ) ); } //------------------------------------------------------------------------------ #pragma mark Test System Override by Name /* The following is commented out because it does not compile. int strerror_rOverride( int errnum, char *strerrbuf, size_t buflen ); int (*strerror_rPtr)( int, char*, size_t ) = strerror_r; int (*gReentry_strerror_r)( int, char*, size_t ); void testSystemFunctionOverrideByName() { // Test original. assertIntEqual( ERANGE, strerror_rPtr( 0, NULL, 0 ) ); // Override local function by pointer. kern_return_t err = mach_override( (char*)"_strerror_r", NULL, (void*)&strerror_rOverride, (void**)&gReentry_strerror_r ); // Test override took effect. assertIntEqual( 0, strerror_rPtr( 0, NULL, 0 ) ); } int strerror_rOverride( int errnum, char *strerrbuf, size_t buflen ) { assertIntEqual( ERANGE, gReentry_strerror_r( 0, NULL, 0 ) ); return 0; } */ //------------------------------------------------------------------------------ #pragma mark main int main( int argc, const char *argv[] ) { testLocalFunctionOverrideByPointer(); testSystemFunctionOverrideByPointer(); //testSystemFunctionOverrideByName(); printf( "success\n" ); return 0; } mumble-1.3.4/3rdparty/mach-override-src/mach_override.c0000664000175000017500000005113114010707335022676 0ustar builderbuilder// mach_override.c semver:1.2.0 // Copyright (c) 2003-2012 Jonathan 'Wolf' Rentzsch: http://rentzsch.com // Some rights reserved: http://opensource.org/licenses/mit // https://github.com/rentzsch/mach_override #include "mach_override.h" #if defined(__i386__) || defined(__x86_64__) #include "udis86.h" #endif #include #include #include #include #include #include /************************** * * Constants * **************************/ #pragma mark - #pragma mark (Constants) #if defined(__ppc__) || defined(__POWERPC__) long kIslandTemplate[] = { 0x9001FFFC, // stw r0,-4(SP) 0x3C00DEAD, // lis r0,0xDEAD 0x6000BEEF, // ori r0,r0,0xBEEF 0x7C0903A6, // mtctr r0 0x8001FFFC, // lwz r0,-4(SP) 0x60000000, // nop ; optionally replaced 0x4E800420 // bctr }; #define kAddressHi 3 #define kAddressLo 5 #define kInstructionHi 10 #define kInstructionLo 11 #elif defined(__i386__) #define kOriginalInstructionsSize 16 char kIslandTemplate[] = { // kOriginalInstructionsSize nop instructions so that we // should have enough space to host original instructions 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, // Now the real jump instruction 0xE9, 0xEF, 0xBE, 0xAD, 0xDE }; #define kInstructions 0 #define kJumpAddress kInstructions + kOriginalInstructionsSize + 1 #elif defined(__x86_64__) #define kOriginalInstructionsSize 32 #define kJumpAddress kOriginalInstructionsSize + 6 char kIslandTemplate[] = { // kOriginalInstructionsSize nop instructions so that we // should have enough space to host original instructions 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, // Now the real jump instruction 0xFF, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; #endif #define kAllocateHigh 1 #define kAllocateNormal 0 /************************** * * Data Types * **************************/ #pragma mark - #pragma mark (Data Types) typedef struct { char instructions[sizeof(kIslandTemplate)]; int allocatedHigh; } BranchIsland; /************************** * * Funky Protos * **************************/ #pragma mark - #pragma mark (Funky Protos) mach_error_t allocateBranchIsland( BranchIsland **island, int allocateHigh, void *originalFunctionAddress); mach_error_t freeBranchIsland( BranchIsland *island ); #if defined(__ppc__) || defined(__POWERPC__) mach_error_t setBranchIslandTarget( BranchIsland *island, const void *branchTo, long instruction ); #endif #if defined(__i386__) || defined(__x86_64__) mach_error_t setBranchIslandTarget_i386( BranchIsland *island, const void *branchTo, char* instructions ); void atomic_mov64( uint64_t *targetAddress, uint64_t value ); static Boolean eatKnownInstructions( unsigned char *code, uint64_t *newInstruction, int *howManyEaten, char *originalInstructions, int *originalInstructionCount, uint8_t *originalInstructionSizes ); static void fixupInstructions( void *originalFunction, void *escapeIsland, void *instructionsToFix, int instructionCount, uint8_t *instructionSizes ); #endif /******************************************************************************* * * Interface * *******************************************************************************/ #pragma mark - #pragma mark (Interface) #if defined(__i386__) || defined(__x86_64__) mach_error_t makeIslandExecutable(void *address) { mach_error_t err = err_none; uintptr_t page = (uintptr_t)address & ~(uintptr_t)(PAGE_SIZE - 1); int e = err_none; e |= mprotect((void *)page, PAGE_SIZE, PROT_EXEC | PROT_READ); e |= msync((void *)page, PAGE_SIZE, MS_INVALIDATE ); if (e) { err = err_cannot_override; } return err; } #endif mach_error_t mach_override_ptr( void *originalFunctionAddress, const void *overrideFunctionAddress, void **originalFunctionReentryIsland ) { assert( originalFunctionAddress ); assert( overrideFunctionAddress ); // this addresses overriding such functions as AudioOutputUnitStart() // test with modified DefaultOutputUnit project #if defined(__x86_64__) for(;;){ if(*(uint16_t*)originalFunctionAddress==0x25FF) // jmp qword near [rip+0x????????] originalFunctionAddress=*(void**)((char*)originalFunctionAddress+6+*(int32_t *)((uint16_t*)originalFunctionAddress+1)); else break; } #elif defined(__i386__) for(;;){ if(*(uint16_t*)originalFunctionAddress==0x25FF) // jmp *0x???????? originalFunctionAddress=**(void***)((uint16_t*)originalFunctionAddress+1); else break; } #endif long *originalFunctionPtr = (long*) originalFunctionAddress; mach_error_t err = err_none; #if defined(__ppc__) || defined(__POWERPC__) // Ensure first instruction isn't 'mfctr'. #define kMFCTRMask 0xfc1fffff #define kMFCTRInstruction 0x7c0903a6 long originalInstruction = *originalFunctionPtr; if( !err && ((originalInstruction & kMFCTRMask) == kMFCTRInstruction) ) err = err_cannot_override; #elif defined(__i386__) || defined(__x86_64__) int eatenCount = 0; int originalInstructionCount = 0; char originalInstructions[kOriginalInstructionsSize]; uint8_t originalInstructionSizes[kOriginalInstructionsSize]; uint64_t jumpRelativeInstruction = 0; // JMP Boolean overridePossible = eatKnownInstructions ((unsigned char *)originalFunctionPtr, &jumpRelativeInstruction, &eatenCount, originalInstructions, &originalInstructionCount, originalInstructionSizes ); if (eatenCount > kOriginalInstructionsSize) { //printf ("Too many instructions eaten\n"); overridePossible = false; } if (!overridePossible) err = err_cannot_override; if (err) fprintf(stderr, "err = %x %s:%d\n", err, __FILE__, __LINE__); #endif // Make the original function implementation writable. if( !err ) { err = vm_protect( mach_task_self(), (vm_address_t) originalFunctionPtr, 8, false, (VM_PROT_ALL | VM_PROT_COPY) ); if( err ) err = vm_protect( mach_task_self(), (vm_address_t) originalFunctionPtr, 8, false, (VM_PROT_DEFAULT | VM_PROT_COPY) ); } if (err) fprintf(stderr, "err = %x %s:%d\n", err, __FILE__, __LINE__); // Allocate and target the escape island to the overriding function. BranchIsland *escapeIsland = NULL; if( !err ) err = allocateBranchIsland( &escapeIsland, kAllocateHigh, originalFunctionAddress ); if (err) fprintf(stderr, "err = %x %s:%d\n", err, __FILE__, __LINE__); #if defined(__ppc__) || defined(__POWERPC__) if( !err ) err = setBranchIslandTarget( escapeIsland, overrideFunctionAddress, 0 ); // Build the branch absolute instruction to the escape island. long branchAbsoluteInstruction = 0; // Set to 0 just to silence warning. if( !err ) { long escapeIslandAddress = ((long) escapeIsland) & 0x3FFFFFF; branchAbsoluteInstruction = 0x48000002 | escapeIslandAddress; } #elif defined(__i386__) || defined(__x86_64__) if (err) fprintf(stderr, "err = %x %s:%d\n", err, __FILE__, __LINE__); if( !err ) err = setBranchIslandTarget_i386( escapeIsland, overrideFunctionAddress, 0 ); if (err) fprintf(stderr, "err = %x %s:%d\n", err, __FILE__, __LINE__); // Build the jump relative instruction to the escape island #endif #if defined(__i386__) || defined(__x86_64__) if (!err) { uint32_t addressOffset = ((char*)escapeIsland - (char*)originalFunctionPtr - 5); addressOffset = OSSwapInt32(addressOffset); jumpRelativeInstruction |= 0xE900000000000000LL; jumpRelativeInstruction |= ((uint64_t)addressOffset & 0xffffffff) << 24; jumpRelativeInstruction = OSSwapInt64(jumpRelativeInstruction); } #endif // Optionally allocate & return the reentry island. This may contain relocated // jmp instructions and so has all the same addressing reachability requirements // the escape island has to the original function, except the escape island is // technically our original function. BranchIsland *reentryIsland = NULL; if( !err && originalFunctionReentryIsland ) { err = allocateBranchIsland( &reentryIsland, kAllocateHigh, escapeIsland); if( !err ) *originalFunctionReentryIsland = reentryIsland; } #if defined(__ppc__) || defined(__POWERPC__) // Atomically: // o If the reentry island was allocated: // o Insert the original instruction into the reentry island. // o Target the reentry island at the 2nd instruction of the // original function. // o Replace the original instruction with the branch absolute. if( !err ) { int escapeIslandEngaged = false; do { if( reentryIsland ) err = setBranchIslandTarget( reentryIsland, (void*) (originalFunctionPtr+1), originalInstruction ); if( !err ) { escapeIslandEngaged = CompareAndSwap( originalInstruction, branchAbsoluteInstruction, (UInt32*)originalFunctionPtr ); if( !escapeIslandEngaged ) { // Someone replaced the instruction out from under us, // re-read the instruction, make sure it's still not // 'mfctr' and try again. originalInstruction = *originalFunctionPtr; if( (originalInstruction & kMFCTRMask) == kMFCTRInstruction) err = err_cannot_override; } } } while( !err && !escapeIslandEngaged ); } #elif defined(__i386__) || defined(__x86_64__) // Atomically: // o If the reentry island was allocated: // o Insert the original instructions into the reentry island. // o Target the reentry island at the first non-replaced // instruction of the original function. // o Replace the original first instructions with the jump relative. // // Note that on i386, we do not support someone else changing the code under our feet if ( !err ) { fixupInstructions(originalFunctionPtr, reentryIsland, originalInstructions, originalInstructionCount, originalInstructionSizes ); if( reentryIsland ) err = setBranchIslandTarget_i386( reentryIsland, (void*) ((char *)originalFunctionPtr+eatenCount), originalInstructions ); // try making islands executable before planting the jmp #if defined(__x86_64__) || defined(__i386__) if( !err ) err = makeIslandExecutable(escapeIsland); if( !err && reentryIsland ) err = makeIslandExecutable(reentryIsland); #endif if ( !err ) atomic_mov64((uint64_t *)originalFunctionPtr, jumpRelativeInstruction); mach_error_t prot_err = err_none; prot_err = vm_protect( mach_task_self(), (vm_address_t) originalFunctionPtr, 8, false, (VM_PROT_READ | VM_PROT_EXECUTE) ); if(prot_err) fprintf(stderr, "err = %x %s:%d\n", prot_err, __FILE__, __LINE__); } #endif // Clean up on error. if( err ) { if( reentryIsland ) freeBranchIsland( reentryIsland ); if( escapeIsland ) freeBranchIsland( escapeIsland ); } return err; } /******************************************************************************* * * Implementation * *******************************************************************************/ #pragma mark - #pragma mark (Implementation) /******************************************************************************* Implementation: Allocates memory for a branch island. @param island <- The allocated island. @param allocateHigh -> Whether to allocate the island at the end of the address space (for use with the branch absolute instruction). @result <- mach_error_t ***************************************************************************/ mach_error_t allocateBranchIsland( BranchIsland **island, int allocateHigh, void *originalFunctionAddress) { assert( island ); mach_error_t err = err_none; if( allocateHigh ) { assert( sizeof( BranchIsland ) <= PAGE_SIZE ); vm_address_t page = 0; #if defined(__i386__) err = vm_allocate( mach_task_self(), &page, PAGE_SIZE, VM_FLAGS_ANYWHERE ); if( err == err_none ) *island = (BranchIsland*) page; #else #if defined(__ppc__) || defined(__POWERPC__) vm_address_t first = 0xfeffffff; vm_address_t last = 0xfe000000 + PAGE_SIZE; #elif defined(__x86_64__) // 64-bit ASLR is in bits 13-28 vm_address_t first = ((uint64_t)originalFunctionAddress & ~( (0xFUL << 28) | (PAGE_SIZE - 1) ) ) | (0x1UL << 31); vm_address_t last = (uint64_t)originalFunctionAddress & ~((0x1UL << 32) - 1); #endif page = first; int allocated = 0; vm_map_t task_self = mach_task_self(); while( !err && !allocated && page != last ) { err = vm_allocate( task_self, &page, PAGE_SIZE, 0 ); if( err == err_none ) allocated = 1; else if( err == KERN_NO_SPACE ) { #if defined(__x86_64__) page -= PAGE_SIZE; #else page += PAGE_SIZE; #endif err = err_none; } } if( allocated ) *island = (BranchIsland*) page; else if( !allocated && !err ) err = KERN_NO_SPACE; #endif } else { void *block = malloc( sizeof( BranchIsland ) ); if( block ) *island = block; else err = KERN_NO_SPACE; } if( !err ) (**island).allocatedHigh = allocateHigh; return err; } /******************************************************************************* Implementation: Deallocates memory for a branch island. @param island -> The island to deallocate. @result <- mach_error_t ***************************************************************************/ mach_error_t freeBranchIsland( BranchIsland *island ) { assert( island ); assert( (*(long*)&island->instructions[0]) == kIslandTemplate[0] ); assert( island->allocatedHigh ); mach_error_t err = err_none; if( island->allocatedHigh ) { assert( sizeof( BranchIsland ) <= PAGE_SIZE ); err = vm_deallocate(mach_task_self(), (vm_address_t) island, PAGE_SIZE ); } else { free( island ); } return err; } /******************************************************************************* Implementation: Sets the branch island's target, with an optional instruction. @param island -> The branch island to insert target into. @param branchTo -> The address of the target. @param instruction -> Optional instruction to execute prior to branch. Set to zero for nop. @result <- mach_error_t ***************************************************************************/ #if defined(__ppc__) || defined(__POWERPC__) mach_error_t setBranchIslandTarget( BranchIsland *island, const void *branchTo, long instruction ) { // Copy over the template code. bcopy( kIslandTemplate, island->instructions, sizeof( kIslandTemplate ) ); // Fill in the address. ((short*)island->instructions)[kAddressLo] = ((long) branchTo) & 0x0000FFFF; ((short*)island->instructions)[kAddressHi] = (((long) branchTo) >> 16) & 0x0000FFFF; // Fill in the (optional) instuction. if( instruction != 0 ) { ((short*)island->instructions)[kInstructionLo] = instruction & 0x0000FFFF; ((short*)island->instructions)[kInstructionHi] = (instruction >> 16) & 0x0000FFFF; } //MakeDataExecutable( island->instructions, sizeof( kIslandTemplate ) ); msync( island->instructions, sizeof( kIslandTemplate ), MS_INVALIDATE ); return err_none; } #endif #if defined(__i386__) mach_error_t setBranchIslandTarget_i386( BranchIsland *island, const void *branchTo, char* instructions ) { // Copy over the template code. bcopy( kIslandTemplate, island->instructions, sizeof( kIslandTemplate ) ); // copy original instructions if (instructions) { bcopy (instructions, island->instructions + kInstructions, kOriginalInstructionsSize); } // Fill in the address. int32_t addressOffset = (char *)branchTo - (island->instructions + kJumpAddress + 4); *((int32_t *)(island->instructions + kJumpAddress)) = addressOffset; msync( island->instructions, sizeof( kIslandTemplate ), MS_INVALIDATE ); return err_none; } #elif defined(__x86_64__) mach_error_t setBranchIslandTarget_i386( BranchIsland *island, const void *branchTo, char* instructions ) { // Copy over the template code. bcopy( kIslandTemplate, island->instructions, sizeof( kIslandTemplate ) ); // Copy original instructions. if (instructions) { bcopy (instructions, island->instructions, kOriginalInstructionsSize); } // Fill in the address. *((uint64_t *)(island->instructions + kJumpAddress)) = (uint64_t)branchTo; msync( island->instructions, sizeof( kIslandTemplate ), MS_INVALIDATE ); return err_none; } #endif #if defined(__i386__) || defined(__x86_64__) static Boolean eatKnownInstructions( unsigned char *code, uint64_t *newInstruction, int *howManyEaten, char *originalInstructions, int *originalInstructionCount, uint8_t *originalInstructionSizes ) { Boolean allInstructionsKnown = true; int totalEaten = 0; int remainsToEat = 5; // a JMP instruction takes 5 bytes int instructionIndex = 0; ud_t ud_obj; if (howManyEaten) *howManyEaten = 0; if (originalInstructionCount) *originalInstructionCount = 0; ud_init(&ud_obj); #if defined(__i386__) ud_set_mode(&ud_obj, 32); #else ud_set_mode(&ud_obj, 64); #endif ud_set_input_buffer(&ud_obj, code, 64); // Assume that 'code' points to at least 64bytes of data. while (remainsToEat > 0) { if (!ud_disassemble(&ud_obj)) { allInstructionsKnown = false; fprintf(stderr, "mach_override: some instructions unknown! Need to update libudis86\n"); break; } // At this point, we've matched curInstr int eaten = ud_insn_len(&ud_obj); remainsToEat -= eaten; totalEaten += eaten; if (originalInstructionSizes) originalInstructionSizes[instructionIndex] = eaten; instructionIndex += 1; if (originalInstructionCount) *originalInstructionCount = instructionIndex; } if (howManyEaten) *howManyEaten = totalEaten; if (originalInstructions) { Boolean enoughSpaceForOriginalInstructions = (totalEaten < kOriginalInstructionsSize); if (enoughSpaceForOriginalInstructions) { memset(originalInstructions, 0x90 /* NOP */, kOriginalInstructionsSize); // fill instructions with NOP bcopy(code, originalInstructions, totalEaten); } else { // printf ("Not enough space in island to store original instructions. Adapt the island definition and kOriginalInstructionsSize\n"); return false; } } if (allInstructionsKnown) { // save last 3 bytes of first 64bits of codre we'll replace uint64_t currentFirst64BitsOfCode = *((uint64_t *)code); currentFirst64BitsOfCode = OSSwapInt64(currentFirst64BitsOfCode); // back to memory representation currentFirst64BitsOfCode &= 0x0000000000FFFFFFLL; // keep only last 3 instructions bytes, first 5 will be replaced by JMP instr *newInstruction &= 0xFFFFFFFFFF000000LL; // clear last 3 bytes *newInstruction |= (currentFirst64BitsOfCode & 0x0000000000FFFFFFLL); // set last 3 bytes } return allInstructionsKnown; } static void fixupInstructions( void *originalFunction, void *escapeIsland, void *instructionsToFix, int instructionCount, uint8_t *instructionSizes ) { int index; for (index = 0;index < instructionCount;index += 1) { if (*(uint8_t*)instructionsToFix == 0xE9) // 32-bit jump relative { uint32_t offset = (uintptr_t)originalFunction - (uintptr_t)escapeIsland; uint32_t *jumpOffsetPtr = (uint32_t*)((uintptr_t)instructionsToFix + 1); *jumpOffsetPtr += offset; } originalFunction = (void*)((uintptr_t)originalFunction + instructionSizes[index]); escapeIsland = (void*)((uintptr_t)escapeIsland + instructionSizes[index]); instructionsToFix = (void*)((uintptr_t)instructionsToFix + instructionSizes[index]); } } #if defined(__i386__) __asm( ".text;" ".align 2, 0x90;" "_atomic_mov64:;" " pushl %ebp;" " movl %esp, %ebp;" " pushl %esi;" " pushl %ebx;" " pushl %ecx;" " pushl %eax;" " pushl %edx;" // atomic push of value to an address // we use cmpxchg8b, which compares content of an address with // edx:eax. If they are equal, it atomically puts 64bit value // ecx:ebx in address. // We thus put contents of address in edx:eax to force ecx:ebx // in address " mov 8(%ebp), %esi;" // esi contains target address " mov 12(%ebp), %ebx;" " mov 16(%ebp), %ecx;" // ecx:ebx now contains value to put in target address " mov (%esi), %eax;" " mov 4(%esi), %edx;" // edx:eax now contains value currently contained in target address " lock; cmpxchg8b (%esi);" // atomic move. // restore registers " popl %edx;" " popl %eax;" " popl %ecx;" " popl %ebx;" " popl %esi;" " popl %ebp;" " ret" ); #elif defined(__x86_64__) void atomic_mov64( uint64_t *targetAddress, uint64_t value ) { *targetAddress = value; } #endif #endif mumble-1.3.4/3rdparty/mach-override-src/README.markdown0000664000175000017500000000755214010707335022434 0ustar builderbuilder## Description mach_override enables you to override ("patch") program- and system-supplied functions at runtime. You can fully replace functions with your implementations, or merely head- or tail-patch the original implementations to add functionality and/or work around bugs. ## Must Be This Tall To Ride Dynamic function overriding is tricky business. You should be familiar with assembly and runtime calling conventions (ABIs) before using mach_override. mach_override is certainly not bug free and patches are extremely welcome, but the onus is on you when things don't work. Please don't file a bug report stating mach_override is crashing for you when you try to use it -- you have to be hard-core enough to debug the problem yourself. ## Contributing Please base your work off the unstable branch. After making your changes please re-run `rake` to ensure it compiles cleanly and the tests pass. Then submit your Pull Request. ## TODO * Test the entire matrix, not just the current ARCH that `gcc` defaults to:
    CC ARCH
    gcc ppc
    clang ppc
    gcc i386
    clang i386
    gcc x86_64
    clang x86_64
    Obviously ppc can only be tested on ppc Macs or on 10.5 and 10.6 (Rosetta-supporting) Intel Macs. ## Version History ### mach_override 1.2: Aug 9 2012 * [NEW] i386 and x86_64 support. * [CHANGE] Decoupled from mach_star. Most of folks were just using the side or the other of mach_star and this simplifies things (docs, tests). * [CHANGE] Threw away Xcode projects. Trying to get them to work across new and old system versions and Xcode versions is a fool's game. Now there's a Rakefile. Type `rake`. You've built and tested. Ta-da. ### mach_star 1.1.1: Dec 18 2005 * General Xcode 2.2 project cleanup. mach_star now includes `.xcodeproj` Xcode 2.2 project files for all of its projects. The old `.xcode` project files have been left in place, but they aren't maintained and may not work. Xcode 2.2 is the recommended mach_star development environment -- Xcode 2.1 had a bug with inter-project dependancies which would cause compilation failure. It works now again in Xcode 2.2. * Inter-project dependancies should working under Xcode 2.2. Any project you pick, you should just be able to hit the "Build" button and everything should Just Work™. * There was a stray reference to my username in one of the project, which causes compilation headaches for some folks. * Bug fix: in `mach_inject_bundle.c`'s `mach_inject_bundle_pid()` I no longer call `CFRelease()` on the framework bundle reference. Reported by Scott Kevill. * Added some explicit casts now required by gcc 4. * Added this document. ### mach_star 1.1: Apr 06 2005 * New package added: `mach_inject_bundle`. It has a private subproject: `mach_inject_bundle_stub`. The stub is a generic reusable implementation of the code that gets squirted across the address spaces, which was always tricky to write. `mach_inject_bundle` is an embeddable framework that wraps `mach_inject` and the stub with a simple fire-and-forget API. * The "DisposeWindowBeeperOverride" example is replaced by "DisposeWindow+Beep". * The "FinderDisposeWindowBeeperInjector" is replaced by "DisposeWindow+Beep_Injector". * All the text is now wrapped to 80 chars wide. Done to print nicely in Scott Knaster's [Hacking Mac OS X Tiger](http://www.amazon.com/exec/obidos/ASIN/076458345X). Probably will undo this word-wrap in the future. We all have widescreens nowadays, right? ;-) * Thanks to Jon Gotow for letting me peek at `SCPatch`, which I used as a guide for `mach_inject_bundle`. It saved me a bunch of time. Also thanks to Bob Ippolito for `CALL_ON_LOAD` assistance. ### mach_star 1.0: Jun 18 2003 * Initial release at MacHack 2003.mumble-1.3.4/3rdparty/mach-override-src/Rakefile0000664000175000017500000000065714010707335021377 0ustar builderbuilderdesc 'Build' task :build do system('mkdir build') system('gcc -o build/test_gcc_i386 -m32 -framework CoreServices *.c *.cp libudis86/*.c') system('gcc -o build/test_gcc_x86_64 -m64 -framework CoreServices *.c *.cp libudis86/*.c') end desc 'Test' task :test do system('build/test_gcc_i386') system('build/test_gcc_x86_64') end desc 'Clean up' task :clean do system('rm -rf build') end task :default => [:build, :test]mumble-1.3.4/3rdparty/mach-override-src/udis86.h0000664000175000017500000000302214010707335021212 0ustar builderbuilder/* udis86 - udis86.h * * Copyright (c) 2002-2009 Vivek Thampi * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef UDIS86_H #define UDIS86_H #include "libudis86/types.h" #include "libudis86/extern.h" #include "libudis86/itab.h" #endif mumble-1.3.4/3rdparty/mach-override-src/libudis86/0000775000175000017500000000000014010707335021533 5ustar builderbuildermumble-1.3.4/3rdparty/mach-override-src/libudis86/syn.h0000664000175000017500000000403214010707335022514 0ustar builderbuilder/* udis86 - libudis86/syn.h * * Copyright (c) 2002-2009 * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef UD_SYN_H #define UD_SYN_H #include "types.h" #ifndef __UD_STANDALONE__ # include #endif /* __UD_STANDALONE__ */ extern const char* ud_reg_tab[]; uint64_t ud_syn_rel_target(struct ud*, struct ud_operand*); #ifdef __GNUC__ int ud_asmprintf(struct ud *u, char *fmt, ...) __attribute__ ((format (printf, 2, 3))); #else int ud_asmprintf(struct ud *u, char *fmt, ...); #endif void ud_syn_print_addr(struct ud *u, uint64_t addr); void ud_syn_print_imm(struct ud* u, const struct ud_operand *op); void ud_syn_print_mem_disp(struct ud* u, const struct ud_operand *, int sign); #endif /* UD_SYN_H */ /* vim: set ts=2 sw=2 expandtab */ mumble-1.3.4/3rdparty/mach-override-src/libudis86/decode.c0000664000175000017500000006470714010707335023140 0ustar builderbuilder/* udis86 - libudis86/decode.c * * Copyright (c) 2002-2009 Vivek Thampi * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "udint.h" #include "types.h" #include "input.h" #include "decode.h" #ifndef __UD_STANDALONE__ # include #endif /* __UD_STANDALONE__ */ /* The max number of prefixes to an instruction */ #define MAX_PREFIXES 15 /* rex prefix bits */ #define REX_W(r) ( ( 0xF & ( r ) ) >> 3 ) #define REX_R(r) ( ( 0x7 & ( r ) ) >> 2 ) #define REX_X(r) ( ( 0x3 & ( r ) ) >> 1 ) #define REX_B(r) ( ( 0x1 & ( r ) ) >> 0 ) #define REX_PFX_MASK(n) ( ( P_REXW(n) << 3 ) | \ ( P_REXR(n) << 2 ) | \ ( P_REXX(n) << 1 ) | \ ( P_REXB(n) << 0 ) ) /* scable-index-base bits */ #define SIB_S(b) ( ( b ) >> 6 ) #define SIB_I(b) ( ( ( b ) >> 3 ) & 7 ) #define SIB_B(b) ( ( b ) & 7 ) /* modrm bits */ #define MODRM_REG(b) ( ( ( b ) >> 3 ) & 7 ) #define MODRM_NNN(b) ( ( ( b ) >> 3 ) & 7 ) #define MODRM_MOD(b) ( ( ( b ) >> 6 ) & 3 ) #define MODRM_RM(b) ( ( b ) & 7 ) static int decode_ext(struct ud *u, uint16_t ptr); enum reg_class { /* register classes */ REGCLASS_NONE, REGCLASS_GPR, REGCLASS_MMX, REGCLASS_CR, REGCLASS_DB, REGCLASS_SEG, REGCLASS_XMM }; /* * inp_uint8 * int_uint16 * int_uint32 * int_uint64 * Load little-endian values from input */ static uint8_t inp_uint8(struct ud* u) { return ud_inp_next(u); } static uint16_t inp_uint16(struct ud* u) { uint16_t r, ret; ret = ud_inp_next(u); r = ud_inp_next(u); return ret | (r << 8); } static uint32_t inp_uint32(struct ud* u) { uint32_t r, ret; ret = ud_inp_next(u); r = ud_inp_next(u); ret = ret | (r << 8); r = ud_inp_next(u); ret = ret | (r << 16); r = ud_inp_next(u); return ret | (r << 24); } static uint64_t inp_uint64(struct ud* u) { uint64_t r, ret; ret = ud_inp_next(u); r = ud_inp_next(u); ret = ret | (r << 8); r = ud_inp_next(u); ret = ret | (r << 16); r = ud_inp_next(u); ret = ret | (r << 24); r = ud_inp_next(u); ret = ret | (r << 32); r = ud_inp_next(u); ret = ret | (r << 40); r = ud_inp_next(u); ret = ret | (r << 48); r = ud_inp_next(u); return ret | (r << 56); } static inline int eff_opr_mode(int dis_mode, int rex_w, int pfx_opr) { if (dis_mode == 64) { return rex_w ? 64 : (pfx_opr ? 16 : 32); } else if (dis_mode == 32) { return pfx_opr ? 16 : 32; } else { UD_ASSERT(dis_mode == 16); return pfx_opr ? 32 : 16; } } static inline int eff_adr_mode(int dis_mode, int pfx_adr) { if (dis_mode == 64) { return pfx_adr ? 32 : 64; } else if (dis_mode == 32) { return pfx_adr ? 16 : 32; } else { UD_ASSERT(dis_mode == 16); return pfx_adr ? 32 : 16; } } /* Looks up mnemonic code in the mnemonic string table * Returns NULL if the mnemonic code is invalid */ const char* ud_lookup_mnemonic(enum ud_mnemonic_code c) { if (c < UD_MAX_MNEMONIC_CODE) { return ud_mnemonics_str[c]; } else { return NULL; } } /* * decode_prefixes * * Extracts instruction prefixes. */ static int decode_prefixes(struct ud *u) { int done = 0; uint8_t curr; UD_RETURN_ON_ERROR(u); do { ud_inp_next(u); UD_RETURN_ON_ERROR(u); if (inp_len(u) == MAX_INSN_LENGTH) { UD_RETURN_WITH_ERROR(u, "max instruction length"); } curr = inp_curr(u); switch (curr) { case 0x2E : u->pfx_seg = UD_R_CS; break; case 0x36 : u->pfx_seg = UD_R_SS; break; case 0x3E : u->pfx_seg = UD_R_DS; break; case 0x26 : u->pfx_seg = UD_R_ES; break; case 0x64 : u->pfx_seg = UD_R_FS; break; case 0x65 : u->pfx_seg = UD_R_GS; break; case 0x67 : /* adress-size override prefix */ u->pfx_adr = 0x67; break; case 0xF0 : u->pfx_lock = 0xF0; break; case 0x66: u->pfx_opr = 0x66; break; case 0xF2: u->pfx_str = 0xf2; break; case 0xF3: u->pfx_str = 0xf3; break; default: done = 1; break; } } while (!done); if (u->dis_mode == 64 && (curr & 0xF0) == 0x40) { /* rex prefixes in 64bit mode, must be the last prefix */ u->pfx_rex = curr; } else { /* rewind back one byte in stream, since the above loop * stops with a non-prefix byte. */ inp_back(u); } return 0; } static inline unsigned int modrm( struct ud * u ) { if ( !u->have_modrm ) { u->modrm = ud_inp_next( u ); u->have_modrm = 1; } return u->modrm; } static unsigned int resolve_operand_size( const struct ud * u, unsigned int s ) { switch ( s ) { case SZ_V: return ( u->opr_mode ); case SZ_Z: return ( u->opr_mode == 16 ) ? 16 : 32; case SZ_Y: return ( u->opr_mode == 16 ) ? 32 : u->opr_mode; case SZ_RDQ: return ( u->dis_mode == 64 ) ? 64 : 32; default: return s; } } static int resolve_mnemonic( struct ud* u ) { /* resolve 3dnow weirdness. */ if ( u->mnemonic == UD_I3dnow ) { u->mnemonic = ud_itab[ u->le->table[ inp_curr( u ) ] ].mnemonic; } /* SWAPGS is only valid in 64bits mode */ if ( u->mnemonic == UD_Iswapgs && u->dis_mode != 64 ) { UDERR(u, "swapgs invalid in 64bits mode"); return -1; } if (u->mnemonic == UD_Ixchg) { if ((u->operand[0].type == UD_OP_REG && u->operand[0].base == UD_R_AX && u->operand[1].type == UD_OP_REG && u->operand[1].base == UD_R_AX) || (u->operand[0].type == UD_OP_REG && u->operand[0].base == UD_R_EAX && u->operand[1].type == UD_OP_REG && u->operand[1].base == UD_R_EAX)) { u->operand[0].type = UD_NONE; u->operand[1].type = UD_NONE; u->mnemonic = UD_Inop; } } if (u->mnemonic == UD_Inop && u->pfx_repe) { u->pfx_repe = 0; u->mnemonic = UD_Ipause; } return 0; } /* ----------------------------------------------------------------------------- * decode_a()- Decodes operands of the type seg:offset * ----------------------------------------------------------------------------- */ static void decode_a(struct ud* u, struct ud_operand *op) { if (u->opr_mode == 16) { /* seg16:off16 */ op->type = UD_OP_PTR; op->size = 32; op->lval.ptr.off = inp_uint16(u); op->lval.ptr.seg = inp_uint16(u); } else { /* seg16:off32 */ op->type = UD_OP_PTR; op->size = 48; op->lval.ptr.off = inp_uint32(u); op->lval.ptr.seg = inp_uint16(u); } } /* ----------------------------------------------------------------------------- * decode_gpr() - Returns decoded General Purpose Register * ----------------------------------------------------------------------------- */ static enum ud_type decode_gpr(register struct ud* u, unsigned int s, unsigned char rm) { switch (s) { case 64: return UD_R_RAX + rm; case 32: return UD_R_EAX + rm; case 16: return UD_R_AX + rm; case 8: if (u->dis_mode == 64 && u->pfx_rex) { if (rm >= 4) return UD_R_SPL + (rm-4); return UD_R_AL + rm; } else return UD_R_AL + rm; default: UD_ASSERT(!"invalid operand size"); return 0; } } static void decode_reg(struct ud *u, struct ud_operand *opr, int type, int num, int size) { int reg; size = resolve_operand_size(u, size); switch (type) { case REGCLASS_GPR : reg = decode_gpr(u, size, num); break; case REGCLASS_MMX : reg = UD_R_MM0 + (num & 7); break; case REGCLASS_XMM : reg = UD_R_XMM0 + num; break; case REGCLASS_CR : reg = UD_R_CR0 + num; break; case REGCLASS_DB : reg = UD_R_DR0 + num; break; case REGCLASS_SEG : { /* * Only 6 segment registers, anything else is an error. */ if ((num & 7) > 5) { UDERR(u, "invalid segment register value"); return; } else { reg = UD_R_ES + (num & 7); } break; } default: UD_ASSERT(!"invalid register type"); break; } opr->type = UD_OP_REG; opr->base = reg; opr->size = size; } /* * decode_imm * * Decode Immediate values. */ static void decode_imm(struct ud* u, unsigned int size, struct ud_operand *op) { op->size = resolve_operand_size(u, size); op->type = UD_OP_IMM; switch (op->size) { case 8: op->lval.sbyte = inp_uint8(u); break; case 16: op->lval.uword = inp_uint16(u); break; case 32: op->lval.udword = inp_uint32(u); break; case 64: op->lval.uqword = inp_uint64(u); break; default: return; } } /* * decode_mem_disp * * Decode mem address displacement. */ static void decode_mem_disp(struct ud* u, unsigned int size, struct ud_operand *op) { switch (size) { case 8: op->offset = 8; op->lval.ubyte = inp_uint8(u); break; case 16: op->offset = 16; op->lval.uword = inp_uint16(u); break; case 32: op->offset = 32; op->lval.udword = inp_uint32(u); break; case 64: op->offset = 64; op->lval.uqword = inp_uint64(u); break; default: return; } } /* * decode_modrm_reg * * Decodes reg field of mod/rm byte * */ static inline void decode_modrm_reg(struct ud *u, struct ud_operand *operand, unsigned int type, unsigned int size) { uint8_t reg = (REX_R(u->pfx_rex) << 3) | MODRM_REG(modrm(u)); decode_reg(u, operand, type, reg, size); } /* * decode_modrm_rm * * Decodes rm field of mod/rm byte * */ static void decode_modrm_rm(struct ud *u, struct ud_operand *op, unsigned char type, /* register type */ unsigned int size) /* operand size */ { size_t offset = 0; unsigned char mod, rm; /* get mod, r/m and reg fields */ mod = MODRM_MOD(modrm(u)); rm = (REX_B(u->pfx_rex) << 3) | MODRM_RM(modrm(u)); /* * If mod is 11b, then the modrm.rm specifies a register. * */ if (mod == 3) { decode_reg(u, op, type, rm, size); return; } /* * !11b => Memory Address */ op->type = UD_OP_MEM; op->size = resolve_operand_size(u, size); if (u->adr_mode == 64) { op->base = UD_R_RAX + rm; if (mod == 1) { offset = 8; } else if (mod == 2) { offset = 32; } else if (mod == 0 && (rm & 7) == 5) { op->base = UD_R_RIP; offset = 32; } else { offset = 0; } /* * Scale-Index-Base (SIB) */ if ((rm & 7) == 4) { ud_inp_next(u); op->scale = (1 << SIB_S(inp_curr(u))) & ~1; op->index = UD_R_RAX + (SIB_I(inp_curr(u)) | (REX_X(u->pfx_rex) << 3)); op->base = UD_R_RAX + (SIB_B(inp_curr(u)) | (REX_B(u->pfx_rex) << 3)); /* special conditions for base reference */ if (op->index == UD_R_RSP) { op->index = UD_NONE; op->scale = UD_NONE; } if (op->base == UD_R_RBP || op->base == UD_R_R13) { if (mod == 0) { op->base = UD_NONE; } if (mod == 1) { offset = 8; } else { offset = 32; } } } } else if (u->adr_mode == 32) { op->base = UD_R_EAX + rm; if (mod == 1) { offset = 8; } else if (mod == 2) { offset = 32; } else if (mod == 0 && rm == 5) { op->base = UD_NONE; offset = 32; } else { offset = 0; } /* Scale-Index-Base (SIB) */ if ((rm & 7) == 4) { ud_inp_next(u); op->scale = (1 << SIB_S(inp_curr(u))) & ~1; op->index = UD_R_EAX + (SIB_I(inp_curr(u)) | (REX_X(u->pfx_rex) << 3)); op->base = UD_R_EAX + (SIB_B(inp_curr(u)) | (REX_B(u->pfx_rex) << 3)); if (op->index == UD_R_ESP) { op->index = UD_NONE; op->scale = UD_NONE; } /* special condition for base reference */ if (op->base == UD_R_EBP) { if (mod == 0) { op->base = UD_NONE; } if (mod == 1) { offset = 8; } else { offset = 32; } } } } else { const unsigned int bases[] = { UD_R_BX, UD_R_BX, UD_R_BP, UD_R_BP, UD_R_SI, UD_R_DI, UD_R_BP, UD_R_BX }; const unsigned int indices[] = { UD_R_SI, UD_R_DI, UD_R_SI, UD_R_DI, UD_NONE, UD_NONE, UD_NONE, UD_NONE }; op->base = bases[rm & 7]; op->index = indices[rm & 7]; if (mod == 0 && rm == 6) { offset = 16; op->base = UD_NONE; } else if (mod == 1) { offset = 8; } else if (mod == 2) { offset = 16; } } if (offset) { decode_mem_disp(u, offset, op); } } /* * decode_moffset * Decode offset-only memory operand */ static void decode_moffset(struct ud *u, unsigned int size, struct ud_operand *opr) { opr->type = UD_OP_MEM; opr->size = resolve_operand_size(u, size); decode_mem_disp(u, u->adr_mode, opr); } /* ----------------------------------------------------------------------------- * decode_operands() - Disassembles Operands. * ----------------------------------------------------------------------------- */ static int decode_operand(struct ud *u, struct ud_operand *operand, enum ud_operand_code type, unsigned int size) { operand->_oprcode = type; switch (type) { case OP_A : decode_a(u, operand); break; case OP_MR: decode_modrm_rm(u, operand, REGCLASS_GPR, MODRM_MOD(modrm(u)) == 3 ? Mx_reg_size(size) : Mx_mem_size(size)); break; case OP_F: u->br_far = 1; /* intended fall through */ case OP_M: if (MODRM_MOD(modrm(u)) == 3) { UDERR(u, "expected modrm.mod != 3"); } /* intended fall through */ case OP_E: decode_modrm_rm(u, operand, REGCLASS_GPR, size); break; case OP_G: decode_modrm_reg(u, operand, REGCLASS_GPR, size); break; case OP_sI: case OP_I: decode_imm(u, size, operand); break; case OP_I1: operand->type = UD_OP_CONST; operand->lval.udword = 1; break; case OP_N: if (MODRM_MOD(modrm(u)) != 3) { UDERR(u, "expected modrm.mod == 3"); } /* intended fall through */ case OP_Q: decode_modrm_rm(u, operand, REGCLASS_MMX, size); break; case OP_P: decode_modrm_reg(u, operand, REGCLASS_MMX, size); break; case OP_U: if (MODRM_MOD(modrm(u)) != 3) { UDERR(u, "expected modrm.mod == 3"); } /* intended fall through */ case OP_W: decode_modrm_rm(u, operand, REGCLASS_XMM, size); break; case OP_V: decode_modrm_reg(u, operand, REGCLASS_XMM, size); break; case OP_MU: decode_modrm_rm(u, operand, REGCLASS_XMM, MODRM_MOD(modrm(u)) == 3 ? Mx_reg_size(size) : Mx_mem_size(size)); break; case OP_S: decode_modrm_reg(u, operand, REGCLASS_SEG, size); break; case OP_O: decode_moffset(u, size, operand); break; case OP_R0: case OP_R1: case OP_R2: case OP_R3: case OP_R4: case OP_R5: case OP_R6: case OP_R7: decode_reg(u, operand, REGCLASS_GPR, (REX_B(u->pfx_rex) << 3) | (type - OP_R0), size); break; case OP_AL: case OP_AX: case OP_eAX: case OP_rAX: decode_reg(u, operand, REGCLASS_GPR, 0, size); break; case OP_CL: case OP_CX: case OP_eCX: decode_reg(u, operand, REGCLASS_GPR, 1, size); break; case OP_DL: case OP_DX: case OP_eDX: decode_reg(u, operand, REGCLASS_GPR, 2, size); break; case OP_ES: case OP_CS: case OP_DS: case OP_SS: case OP_FS: case OP_GS: /* in 64bits mode, only fs and gs are allowed */ if (u->dis_mode == 64) { if (type != OP_FS && type != OP_GS) { UDERR(u, "invalid segment register in 64bits"); } } operand->type = UD_OP_REG; operand->base = (type - OP_ES) + UD_R_ES; operand->size = 16; break; case OP_J : decode_imm(u, size, operand); operand->type = UD_OP_JIMM; break ; case OP_R : if (MODRM_MOD(modrm(u)) != 3) { UDERR(u, "expected modrm.mod == 3"); } decode_modrm_rm(u, operand, REGCLASS_GPR, size); break; case OP_C: decode_modrm_reg(u, operand, REGCLASS_CR, size); break; case OP_D: decode_modrm_reg(u, operand, REGCLASS_DB, size); break; case OP_I3 : operand->type = UD_OP_CONST; operand->lval.sbyte = 3; break; case OP_ST0: case OP_ST1: case OP_ST2: case OP_ST3: case OP_ST4: case OP_ST5: case OP_ST6: case OP_ST7: operand->type = UD_OP_REG; operand->base = (type - OP_ST0) + UD_R_ST0; operand->size = 80; break; default : break; } return 0; } /* * decode_operands * * Disassemble upto 3 operands of the current instruction being * disassembled. By the end of the function, the operand fields * of the ud structure will have been filled. */ static int decode_operands(struct ud* u) { decode_operand(u, &u->operand[0], u->itab_entry->operand1.type, u->itab_entry->operand1.size); decode_operand(u, &u->operand[1], u->itab_entry->operand2.type, u->itab_entry->operand2.size); decode_operand(u, &u->operand[2], u->itab_entry->operand3.type, u->itab_entry->operand3.size); return 0; } /* ----------------------------------------------------------------------------- * clear_insn() - clear instruction structure * ----------------------------------------------------------------------------- */ static void clear_insn(register struct ud* u) { u->error = 0; u->pfx_seg = 0; u->pfx_opr = 0; u->pfx_adr = 0; u->pfx_lock = 0; u->pfx_repne = 0; u->pfx_rep = 0; u->pfx_repe = 0; u->pfx_rex = 0; u->pfx_str = 0; u->mnemonic = UD_Inone; u->itab_entry = NULL; u->have_modrm = 0; u->br_far = 0; memset( &u->operand[ 0 ], 0, sizeof( struct ud_operand ) ); memset( &u->operand[ 1 ], 0, sizeof( struct ud_operand ) ); memset( &u->operand[ 2 ], 0, sizeof( struct ud_operand ) ); } static inline int resolve_pfx_str(struct ud* u) { if (u->pfx_str == 0xf3) { if (P_STR(u->itab_entry->prefix)) { u->pfx_rep = 0xf3; } else { u->pfx_repe = 0xf3; } } else if (u->pfx_str == 0xf2) { u->pfx_repne = 0xf3; } return 0; } static int resolve_mode( struct ud* u ) { /* if in error state, bail out */ if ( u->error ) return -1; /* propagate prefix effects */ if ( u->dis_mode == 64 ) { /* set 64bit-mode flags */ /* Check validity of instruction m64 */ if ( P_INV64( u->itab_entry->prefix ) ) { UDERR(u, "instruction invalid in 64bits"); return -1; } /* effective rex prefix is the effective mask for the * instruction hard-coded in the opcode map. */ u->pfx_rex = ( u->pfx_rex & 0x40 ) | ( u->pfx_rex & REX_PFX_MASK( u->itab_entry->prefix ) ); /* whether this instruction has a default operand size of * 64bit, also hardcoded into the opcode map. */ u->default64 = P_DEF64( u->itab_entry->prefix ); /* calculate effective operand size */ if ( REX_W( u->pfx_rex ) ) { u->opr_mode = 64; } else if ( u->pfx_opr ) { u->opr_mode = 16; } else { /* unless the default opr size of instruction is 64, * the effective operand size in the absence of rex.w * prefix is 32. */ u->opr_mode = ( u->default64 ) ? 64 : 32; } /* calculate effective address size */ u->adr_mode = (u->pfx_adr) ? 32 : 64; } else if ( u->dis_mode == 32 ) { /* set 32bit-mode flags */ u->opr_mode = ( u->pfx_opr ) ? 16 : 32; u->adr_mode = ( u->pfx_adr ) ? 16 : 32; } else if ( u->dis_mode == 16 ) { /* set 16bit-mode flags */ u->opr_mode = ( u->pfx_opr ) ? 32 : 16; u->adr_mode = ( u->pfx_adr ) ? 32 : 16; } /* set flags for implicit addressing */ u->implicit_addr = P_IMPADDR( u->itab_entry->prefix ); return 0; } static inline int decode_insn(struct ud *u, uint16_t ptr) { UD_ASSERT((ptr & 0x8000) == 0); u->itab_entry = &ud_itab[ ptr ]; u->mnemonic = u->itab_entry->mnemonic; return (resolve_pfx_str(u) == 0 && resolve_mode(u) == 0 && decode_operands(u) == 0 && resolve_mnemonic(u) == 0) ? 0 : -1; } /* * decode_3dnow() * * Decoding 3dnow is a little tricky because of its strange opcode * structure. The final opcode disambiguation depends on the last * byte that comes after the operands have been decoded. Fortunately, * all 3dnow instructions have the same set of operand types. So we * go ahead and decode the instruction by picking an arbitrarily chosen * valid entry in the table, decode the operands, and read the final * byte to resolve the menmonic. */ static inline int decode_3dnow(struct ud* u) { uint16_t ptr; UD_ASSERT(u->le->type == UD_TAB__OPC_3DNOW); UD_ASSERT(u->le->table[0xc] != 0); decode_insn(u, u->le->table[0xc]); ud_inp_next(u); if (u->error) { return -1; } ptr = u->le->table[inp_curr(u)]; UD_ASSERT((ptr & 0x8000) == 0); u->mnemonic = ud_itab[ptr].mnemonic; return 0; } static int decode_ssepfx(struct ud *u) { uint8_t idx; uint8_t pfx; /* * String prefixes (f2, f3) take precedence over operand * size prefix (66). */ pfx = u->pfx_str; if (pfx == 0) { pfx = u->pfx_opr; } idx = ((pfx & 0xf) + 1) / 2; if (u->le->table[idx] == 0) { idx = 0; } if (idx && u->le->table[idx] != 0) { /* * "Consume" the prefix as a part of the opcode, so it is no * longer exported as an instruction prefix. */ u->pfx_str = 0; if (pfx == 0x66) { /* * consume "66" only if it was used for decoding, leaving * it to be used as an operands size override for some * simd instructions. */ u->pfx_opr = 0; } } return decode_ext(u, u->le->table[idx]); } /* * decode_ext() * * Decode opcode extensions (if any) */ static int decode_ext(struct ud *u, uint16_t ptr) { uint8_t idx = 0; if ((ptr & 0x8000) == 0) { return decode_insn(u, ptr); } u->le = &ud_lookup_table_list[(~0x8000 & ptr)]; if (u->le->type == UD_TAB__OPC_3DNOW) { return decode_3dnow(u); } switch (u->le->type) { case UD_TAB__OPC_MOD: /* !11 = 0, 11 = 1 */ idx = (MODRM_MOD(modrm(u)) + 1) / 4; break; /* disassembly mode/operand size/address size based tables. * 16 = 0,, 32 = 1, 64 = 2 */ case UD_TAB__OPC_MODE: idx = u->dis_mode != 64 ? 0 : 1; break; case UD_TAB__OPC_OSIZE: idx = eff_opr_mode(u->dis_mode, REX_W(u->pfx_rex), u->pfx_opr) / 32; break; case UD_TAB__OPC_ASIZE: idx = eff_adr_mode(u->dis_mode, u->pfx_adr) / 32; break; case UD_TAB__OPC_X87: idx = modrm(u) - 0xC0; break; case UD_TAB__OPC_VENDOR: if (u->vendor == UD_VENDOR_ANY) { /* choose a valid entry */ idx = (u->le->table[idx] != 0) ? 0 : 1; } else if (u->vendor == UD_VENDOR_AMD) { idx = 0; } else { idx = 1; } break; case UD_TAB__OPC_RM: idx = MODRM_RM(modrm(u)); break; case UD_TAB__OPC_REG: idx = MODRM_REG(modrm(u)); break; case UD_TAB__OPC_SSE: return decode_ssepfx(u); default: UD_ASSERT(!"not reached"); break; } return decode_ext(u, u->le->table[idx]); } static int decode_opcode(struct ud *u) { uint16_t ptr; UD_ASSERT(u->le->type == UD_TAB__OPC_TABLE); ud_inp_next(u); if (u->error) { return -1; } u->primary_opcode = inp_curr(u); ptr = u->le->table[inp_curr(u)]; if (ptr & 0x8000) { u->le = &ud_lookup_table_list[ptr & ~0x8000]; if (u->le->type == UD_TAB__OPC_TABLE) { return decode_opcode(u); } } return decode_ext(u, ptr); } /* ============================================================================= * ud_decode() - Instruction decoder. Returns the number of bytes decoded. * ============================================================================= */ unsigned int ud_decode(struct ud *u) { inp_start(u); clear_insn(u); u->le = &ud_lookup_table_list[0]; u->error = decode_prefixes(u) == -1 || decode_opcode(u) == -1 || u->error; /* Handle decode error. */ if (u->error) { /* clear out the decode data. */ clear_insn(u); /* mark the sequence of bytes as invalid. */ u->itab_entry = &ud_itab[0]; /* entry 0 is invalid */ u->mnemonic = u->itab_entry->mnemonic; } /* maybe this stray segment override byte * should be spewed out? */ if ( !P_SEG( u->itab_entry->prefix ) && u->operand[0].type != UD_OP_MEM && u->operand[1].type != UD_OP_MEM ) u->pfx_seg = 0; u->insn_offset = u->pc; /* set offset of instruction */ u->asm_buf_fill = 0; /* set translation buffer index to 0 */ u->pc += u->inp_ctr; /* move program counter by bytes decoded */ /* return number of bytes disassembled. */ return u->inp_ctr; } /* vim: set ts=2 sw=2 expandtab */ mumble-1.3.4/3rdparty/mach-override-src/libudis86/syn-att.c0000664000175000017500000001336214010707335023303 0ustar builderbuilder/* udis86 - libudis86/syn-att.c * * Copyright (c) 2002-2009 Vivek Thampi * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "types.h" #include "extern.h" #include "decode.h" #include "itab.h" #include "syn.h" #include "udint.h" /* ----------------------------------------------------------------------------- * opr_cast() - Prints an operand cast. * ----------------------------------------------------------------------------- */ static void opr_cast(struct ud* u, struct ud_operand* op) { switch(op->size) { case 16 : case 32 : ud_asmprintf(u, "*"); break; default: break; } } /* ----------------------------------------------------------------------------- * gen_operand() - Generates assembly output for each operand. * ----------------------------------------------------------------------------- */ static void gen_operand(struct ud* u, struct ud_operand* op) { switch(op->type) { case UD_OP_CONST: ud_asmprintf(u, "$0x%x", op->lval.udword); break; case UD_OP_REG: ud_asmprintf(u, "%%%s", ud_reg_tab[op->base - UD_R_AL]); break; case UD_OP_MEM: if (u->br_far) { opr_cast(u, op); } if (u->pfx_seg) { ud_asmprintf(u, "%%%s:", ud_reg_tab[u->pfx_seg - UD_R_AL]); } if (op->offset != 0) { ud_syn_print_mem_disp(u, op, 0); } if (op->base) { ud_asmprintf(u, "(%%%s", ud_reg_tab[op->base - UD_R_AL]); } if (op->index) { if (op->base) { ud_asmprintf(u, ","); } else { ud_asmprintf(u, "("); } ud_asmprintf(u, "%%%s", ud_reg_tab[op->index - UD_R_AL]); } if (op->scale) { ud_asmprintf(u, ",%d", op->scale); } if (op->base || op->index) { ud_asmprintf(u, ")"); } break; case UD_OP_IMM: ud_syn_print_imm(u, op); break; case UD_OP_JIMM: ud_syn_print_addr(u, ud_syn_rel_target(u, op)); break; case UD_OP_PTR: switch (op->size) { case 32: ud_asmprintf(u, "$0x%x, $0x%x", op->lval.ptr.seg, op->lval.ptr.off & 0xFFFF); break; case 48: ud_asmprintf(u, "$0x%x, $0x%x", op->lval.ptr.seg, op->lval.ptr.off); break; } break; default: return; } } /* ============================================================================= * translates to AT&T syntax * ============================================================================= */ extern void ud_translate_att(struct ud *u) { int size = 0; int star = 0; /* check if P_OSO prefix is used */ if (! P_OSO(u->itab_entry->prefix) && u->pfx_opr) { switch (u->dis_mode) { case 16: ud_asmprintf(u, "o32 "); break; case 32: case 64: ud_asmprintf(u, "o16 "); break; } } /* check if P_ASO prefix was used */ if (! P_ASO(u->itab_entry->prefix) && u->pfx_adr) { switch (u->dis_mode) { case 16: ud_asmprintf(u, "a32 "); break; case 32: ud_asmprintf(u, "a16 "); break; case 64: ud_asmprintf(u, "a32 "); break; } } if (u->pfx_lock) ud_asmprintf(u, "lock "); if (u->pfx_rep) { ud_asmprintf(u, "rep "); } else if (u->pfx_rep) { ud_asmprintf(u, "repe "); } else if (u->pfx_repne) { ud_asmprintf(u, "repne "); } /* special instructions */ switch (u->mnemonic) { case UD_Iretf: ud_asmprintf(u, "lret "); break; case UD_Idb: ud_asmprintf(u, ".byte 0x%x", u->operand[0].lval.ubyte); return; case UD_Ijmp: case UD_Icall: if (u->br_far) ud_asmprintf(u, "l"); if (u->operand[0].type == UD_OP_REG) { star = 1; } ud_asmprintf(u, "%s", ud_lookup_mnemonic(u->mnemonic)); break; case UD_Ibound: case UD_Ienter: if (u->operand[0].type != UD_NONE) gen_operand(u, &u->operand[0]); if (u->operand[1].type != UD_NONE) { ud_asmprintf(u, ","); gen_operand(u, &u->operand[1]); } return; default: ud_asmprintf(u, "%s", ud_lookup_mnemonic(u->mnemonic)); } if (size == 8) ud_asmprintf(u, "b"); else if (size == 16) ud_asmprintf(u, "w"); else if (size == 64) ud_asmprintf(u, "q"); if (star) { ud_asmprintf(u, " *"); } else { ud_asmprintf(u, " "); } if (u->operand[2].type != UD_NONE) { gen_operand(u, &u->operand[2]); ud_asmprintf(u, ", "); } if (u->operand[1].type != UD_NONE) { gen_operand(u, &u->operand[1]); ud_asmprintf(u, ", "); } if (u->operand[0].type != UD_NONE) gen_operand(u, &u->operand[0]); } /* vim: set ts=2 sw=2 expandtab */ mumble-1.3.4/3rdparty/mach-override-src/libudis86/extern.h0000664000175000017500000000674414010707335023224 0ustar builderbuilder/* udis86 - libudis86/extern.h * * Copyright (c) 2002-2009, 2013 Vivek Thampi * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef UD_EXTERN_H #define UD_EXTERN_H #ifdef __cplusplus extern "C" { #endif #include "types.h" /* ============================= PUBLIC API ================================= */ extern void ud_init(struct ud*); extern void ud_set_mode(struct ud*, uint8_t); extern void ud_set_pc(struct ud*, uint64_t); extern void ud_set_input_hook(struct ud*, int (*)(struct ud*)); extern void ud_set_input_buffer(struct ud*, const uint8_t*, size_t); #ifndef __UD_STANDALONE__ extern void ud_set_input_file(struct ud*, FILE*); #endif /* __UD_STANDALONE__ */ extern void ud_set_vendor(struct ud*, unsigned); extern void ud_set_syntax(struct ud*, void (*)(struct ud*)); extern void ud_input_skip(struct ud*, size_t); extern int ud_input_end(const struct ud*); extern unsigned int ud_decode(struct ud*); extern unsigned int ud_disassemble(struct ud*); extern void ud_translate_intel(struct ud*); extern void ud_translate_att(struct ud*); extern const char* ud_insn_asm(const struct ud* u); extern const uint8_t* ud_insn_ptr(const struct ud* u); extern uint64_t ud_insn_off(const struct ud*); extern const char* ud_insn_hex(struct ud*); extern unsigned int ud_insn_len(const struct ud* u); extern const struct ud_operand* ud_insn_opr(const struct ud *u, unsigned int n); extern int ud_opr_is_sreg(const struct ud_operand *opr); extern int ud_opr_isgpr(const struct ud_operand *opr); extern const char* ud_lookup_mnemonic(enum ud_mnemonic_code c); extern void ud_set_user_opaque_data(struct ud*, void*); extern void* ud_get_user_opaque_data(const struct ud*); extern uint64_t ud_insn_sext_imm(const struct ud*, const struct ud_operand*); extern void ud_set_asm_buffer(struct ud *u, char *buf, size_t size); extern void ud_set_sym_resolver(struct ud *u, const char* (*resolver)(struct ud*, uint64_t addr, int64_t *offset)); /* ========================================================================== */ #ifdef __cplusplus } #endif #endif /* UD_EXTERN_H */ mumble-1.3.4/3rdparty/mach-override-src/libudis86/input.h0000664000175000017500000000541314010707335023046 0ustar builderbuilder/* udis86 - libudis86/input.h * * Copyright (c) 2002-2009 Vivek Thampi * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef UD_INPUT_H #define UD_INPUT_H #include "types.h" #include "udint.h" uint8_t ud_inp_next(struct ud* u); /* * inp_start * Should be called before each de-code operation. */ static inline void inp_start(struct ud *u) { u->inp_ctr = 0; } /* inp_reset * Resets the current pointer to its position before the current * instruction disassembly was started. */ static inline void inp_reset(struct ud *u) { u->inp_curr -= u->inp_ctr; u->inp_ctr = 0; } /* inp_sess * Returns the pointer to current session. */ static inline uint8_t* inp_sess(struct ud *u) { return u->inp_sess; } /* * inp_curr * Returns the current input byte. */ static inline uint8_t inp_curr(const struct ud *u) { return u->inp_cache[u->inp_curr]; } /* * inp_back * Move back a single byte in the stream. */ static inline void inp_back(struct ud* u) { if (u->inp_ctr > 0) { --u->inp_curr; --u->inp_ctr; } } /* * inp_peek * Peek next byte in input. */ static inline uint8_t inp_peek(struct ud* u) { uint8_t r = ud_inp_next(u); if (!u->error) { inp_back(u); /* Don't backup if there was an error */ } return r; } /* * inp_len * Returns the number of bytes input in the current * session. */ static inline size_t inp_len(const struct ud *u) { return u->inp_ctr; } #endif /* UD_INPUT_H */ /* vim: set ts=2 sw=2 expandtab */ mumble-1.3.4/3rdparty/mach-override-src/libudis86/decode.h0000664000175000017500000001243314010707335023132 0ustar builderbuilder/* udis86 - libudis86/decode.h * * Copyright (c) 2002-2009 Vivek Thampi * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef UD_DECODE_H #define UD_DECODE_H #include "types.h" #include "itab.h" #define MAX_INSN_LENGTH 15 /* itab prefix bits */ #define P_none ( 0 ) #define P_cast ( 1 << 0 ) #define P_CAST(n) ( ( n >> 0 ) & 1 ) #define P_rexb ( 1 << 1 ) #define P_REXB(n) ( ( n >> 1 ) & 1 ) #define P_inv64 ( 1 << 4 ) #define P_INV64(n) ( ( n >> 4 ) & 1 ) #define P_rexw ( 1 << 5 ) #define P_REXW(n) ( ( n >> 5 ) & 1 ) #define P_def64 ( 1 << 7 ) #define P_DEF64(n) ( ( n >> 7 ) & 1 ) #define P_rexr ( 1 << 8 ) #define P_REXR(n) ( ( n >> 8 ) & 1 ) #define P_oso ( 1 << 9 ) #define P_OSO(n) ( ( n >> 9 ) & 1 ) #define P_aso ( 1 << 10 ) #define P_ASO(n) ( ( n >> 10 ) & 1 ) #define P_rexx ( 1 << 11 ) #define P_REXX(n) ( ( n >> 11 ) & 1 ) #define P_ImpAddr ( 1 << 12 ) #define P_IMPADDR(n) ( ( n >> 12 ) & 1 ) #define P_seg ( 1 << 13 ) #define P_SEG(n) ( ( n >> 13 ) & 1 ) #define P_str ( 1 << 14 ) #define P_STR(n) ( ( n >> 14 ) & 1 ) #define P_strz ( 1 << 15 ) #define P_STR_ZF(n) ( ( n >> 15 ) & 1 ) /* operand type constants -- order is important! */ enum ud_operand_code { OP_NONE, OP_A, OP_E, OP_M, OP_G, OP_I, OP_F, OP_R0, OP_R1, OP_R2, OP_R3, OP_R4, OP_R5, OP_R6, OP_R7, OP_AL, OP_CL, OP_DL, OP_AX, OP_CX, OP_DX, OP_eAX, OP_eCX, OP_eDX, OP_rAX, OP_rCX, OP_rDX, OP_ES, OP_CS, OP_SS, OP_DS, OP_FS, OP_GS, OP_ST0, OP_ST1, OP_ST2, OP_ST3, OP_ST4, OP_ST5, OP_ST6, OP_ST7, OP_J, OP_S, OP_O, OP_I1, OP_I3, OP_sI, OP_V, OP_W, OP_Q, OP_P, OP_U, OP_N, OP_MU, OP_R, OP_C, OP_D, OP_MR } UD_ATTR_PACKED; /* operand size constants */ enum ud_operand_size { SZ_NA = 0, SZ_Z = 1, SZ_V = 2, SZ_RDQ = 7, /* the following values are used as is, * and thus hard-coded. changing them * will break internals */ SZ_B = 8, SZ_W = 16, SZ_D = 32, SZ_Q = 64, SZ_T = 80, SZ_O = 128, SZ_Y = 17, /* * complex size types, that encode sizes for operands * of type MR (memory or register), for internal use * only. Id space 256 and above. */ SZ_BD = (SZ_B << 8) | SZ_D, SZ_BV = (SZ_B << 8) | SZ_V, SZ_WD = (SZ_W << 8) | SZ_D, SZ_WV = (SZ_W << 8) | SZ_V, SZ_WY = (SZ_W << 8) | SZ_Y, SZ_DY = (SZ_D << 8) | SZ_Y, SZ_WO = (SZ_W << 8) | SZ_O, SZ_DO = (SZ_D << 8) | SZ_O, SZ_QO = (SZ_Q << 8) | SZ_O, } UD_ATTR_PACKED; /* resolve complex size type. */ static inline enum ud_operand_size Mx_mem_size(enum ud_operand_size size) { return (size >> 8) & 0xff; } static inline enum ud_operand_size Mx_reg_size(enum ud_operand_size size) { return size & 0xff; } /* A single operand of an entry in the instruction table. * (internal use only) */ struct ud_itab_entry_operand { enum ud_operand_code type; enum ud_operand_size size; }; /* A single entry in an instruction table. *(internal use only) */ struct ud_itab_entry { enum ud_mnemonic_code mnemonic; struct ud_itab_entry_operand operand1; struct ud_itab_entry_operand operand2; struct ud_itab_entry_operand operand3; uint32_t prefix; }; struct ud_lookup_table_list_entry { const uint16_t *table; enum ud_table_type type; const char *meta; }; static inline int ud_opcode_field_sext(uint8_t primary_opcode) { return (primary_opcode & 0x02) != 0; } extern struct ud_itab_entry ud_itab[]; extern struct ud_lookup_table_list_entry ud_lookup_table_list[]; #endif /* UD_DECODE_H */ /* vim:cindent * vim:expandtab * vim:ts=4 * vim:sw=4 */ mumble-1.3.4/3rdparty/mach-override-src/libudis86/syn.c0000664000175000017500000001410014010707335022504 0ustar builderbuilder/* udis86 - libudis86/syn.c * * Copyright (c) 2002-2013 Vivek Thampi * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "types.h" #include "decode.h" #include "syn.h" #include "udint.h" /* ----------------------------------------------------------------------------- * Intel Register Table - Order Matters (types.h)! * ----------------------------------------------------------------------------- */ const char* ud_reg_tab[] = { "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh", "spl", "bpl", "sil", "dil", "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b", "ax", "cx", "dx", "bx", "sp", "bp", "si", "di", "r8w", "r9w", "r10w", "r11w", "r12w", "r13w" , "r14w", "r15w", "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi", "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d", "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", "es", "cs", "ss", "ds", "fs", "gs", "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", "cr8", "cr9", "cr10", "cr11", "cr12", "cr13", "cr14", "cr15", "dr0", "dr1", "dr2", "dr3", "dr4", "dr5", "dr6", "dr7", "dr8", "dr9", "dr10", "dr11", "dr12", "dr13", "dr14", "dr15", "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7", "st0", "st1", "st2", "st3", "st4", "st5", "st6", "st7", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7", "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15", "rip" }; uint64_t ud_syn_rel_target(struct ud *u, struct ud_operand *opr) { const uint64_t trunc_mask = 0xffffffffffffffffull >> (64 - u->opr_mode); switch (opr->size) { case 8 : return (u->pc + opr->lval.sbyte) & trunc_mask; case 16: return (u->pc + opr->lval.sword) & trunc_mask; case 32: return (u->pc + opr->lval.sdword) & trunc_mask; default: UD_ASSERT(!"invalid relative offset size."); } } /* * asmprintf * Printf style function for printing translated assembly * output. Returns the number of characters written and * moves the buffer pointer forward. On an overflow, * returns a negative number and truncates the output. */ int ud_asmprintf(struct ud *u, char *fmt, ...) { int ret; int avail; va_list ap; va_start(ap, fmt); avail = u->asm_buf_size - u->asm_buf_fill - 1 /* nullchar */; ret = vsnprintf((char*) u->asm_buf + u->asm_buf_fill, avail, fmt, ap); if (ret < 0 || ret > avail) { u->asm_buf_fill = u->asm_buf_size - 1; } else { u->asm_buf_fill += ret; } va_end(ap); return ret; } void ud_syn_print_addr(struct ud *u, uint64_t addr) { const char *name = NULL; if (u->sym_resolver) { int64_t offset = 0; name = u->sym_resolver(u, addr, &offset); if (name) { if (offset) { ud_asmprintf(u, "%s%+" FMT64 "d", name, offset); } else { ud_asmprintf(u, "%s", name); } return; } } ud_asmprintf(u, "0x%" FMT64 "x", addr); } void ud_syn_print_imm(struct ud* u, const struct ud_operand *op) { uint64_t v; if (op->_oprcode == OP_sI && op->size != u->opr_mode) { if (op->size == 8) { v = (int64_t)op->lval.sbyte; } else { UD_ASSERT(op->size == 32); v = (int64_t)op->lval.sdword; } if (u->opr_mode < 64) { v = v & ((1ull << u->opr_mode) - 1ull); } } else { switch (op->size) { case 8 : v = op->lval.ubyte; break; case 16: v = op->lval.uword; break; case 32: v = op->lval.udword; break; case 64: v = op->lval.uqword; break; default: UD_ASSERT(!"invalid offset"); v = 0; /* keep cc happy */ } } ud_asmprintf(u, "0x%" FMT64 "x", v); } void ud_syn_print_mem_disp(struct ud* u, const struct ud_operand *op, int sign) { UD_ASSERT(op->offset != 0); if (op->base == UD_NONE && op->index == UD_NONE) { uint64_t v; UD_ASSERT(op->scale == UD_NONE && op->offset != 8); /* unsigned mem-offset */ switch (op->offset) { case 16: v = op->lval.uword; break; case 32: v = op->lval.udword; break; case 64: v = op->lval.uqword; break; default: UD_ASSERT(!"invalid offset"); v = 0; /* keep cc happy */ } ud_asmprintf(u, "0x%" FMT64 "x", v); } else { int64_t v; UD_ASSERT(op->offset != 64); switch (op->offset) { case 8 : v = op->lval.sbyte; break; case 16: v = op->lval.sword; break; case 32: v = op->lval.sdword; break; default: UD_ASSERT(!"invalid offset"); v = 0; /* keep cc happy */ } if (v < 0) { ud_asmprintf(u, "-0x%" FMT64 "x", -v); } else if (v > 0) { ud_asmprintf(u, "%s0x%" FMT64 "x", sign? "+" : "", v); } } } /* vim: set ts=2 sw=2 expandtab */ mumble-1.3.4/3rdparty/mach-override-src/libudis86/udis86.c0000664000175000017500000002204314010707335023022 0ustar builderbuilder/* udis86 - libudis86/udis86.c * * Copyright (c) 2002-2013 Vivek Thampi * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "input.h" #include "extern.h" #include "decode.h" #if !defined(__UD_STANDALONE__) # if HAVE_STRING_H # include # endif #endif /* !__UD_STANDALONE__ */ /* ============================================================================= * ud_init() - Initializes ud_t object. * ============================================================================= */ extern void ud_init(struct ud* u) { memset((void*)u, 0, sizeof(struct ud)); ud_set_mode(u, 16); u->mnemonic = UD_Iinvalid; ud_set_pc(u, 0); #ifndef __UD_STANDALONE__ ud_set_input_file(u, stdin); #endif /* __UD_STANDALONE__ */ ud_set_asm_buffer(u, u->asm_buf_int, sizeof(u->asm_buf_int)); } /* ============================================================================= * ud_disassemble() - disassembles one instruction and returns the number of * bytes disassembled. A zero means end of disassembly. * ============================================================================= */ extern unsigned int ud_disassemble(struct ud* u) { if (ud_input_end(u)) return 0; u->asm_buf[0] = 0; if (ud_decode(u) == 0) return 0; if (u->translator) u->translator(u); return ud_insn_len(u); } /* ============================================================================= * ud_set_mode() - Set Disassemly Mode. * ============================================================================= */ extern void ud_set_mode(struct ud* u, uint8_t m) { switch(m) { case 16: case 32: case 64: u->dis_mode = m ; return; default: u->dis_mode = 16; return; } } /* ============================================================================= * ud_set_vendor() - Set vendor. * ============================================================================= */ extern void ud_set_vendor(struct ud* u, unsigned v) { switch(v) { case UD_VENDOR_INTEL: u->vendor = v; break; case UD_VENDOR_ANY: u->vendor = v; break; default: u->vendor = UD_VENDOR_AMD; } } /* ============================================================================= * ud_set_pc() - Sets code origin. * ============================================================================= */ extern void ud_set_pc(struct ud* u, uint64_t o) { u->pc = o; } /* ============================================================================= * ud_set_syntax() - Sets the output syntax. * ============================================================================= */ extern void ud_set_syntax(struct ud* u, void (*t)(struct ud*)) { u->translator = t; } /* ============================================================================= * ud_insn() - returns the disassembled instruction * ============================================================================= */ const char* ud_insn_asm(const struct ud* u) { return u->asm_buf; } /* ============================================================================= * ud_insn_offset() - Returns the offset. * ============================================================================= */ uint64_t ud_insn_off(const struct ud* u) { return u->insn_offset; } /* ============================================================================= * ud_insn_hex() - Returns hex form of disassembled instruction. * ============================================================================= */ const char* ud_insn_hex(struct ud* u) { u->insn_hexcode[0] = 0; if (!u->error) { unsigned int i; unsigned char *src_ptr = inp_sess(u); char* src_hex; src_hex = (char*) u->insn_hexcode; /* for each byte used to decode instruction */ for (i = 0; i < u->inp_ctr && i < sizeof(u->insn_hexcode) / 2; ++i, ++src_ptr) { sprintf(src_hex, "%02x", *src_ptr & 0xFF); src_hex += 2; } } return u->insn_hexcode; } /* ============================================================================= * ud_insn_ptr() - Returns code disassembled. * ============================================================================= */ extern const uint8_t* ud_insn_ptr(const struct ud* u) { return u->inp_sess; } /* ============================================================================= * ud_insn_len() - Returns the count of bytes disassembled. * ============================================================================= */ extern unsigned int ud_insn_len(const struct ud* u) { return u->inp_ctr; } /* ============================================================================= * ud_insn_get_opr * Return the operand struct representing the nth operand of * the currently disassembled instruction. Returns NULL if * there's no such operand. * ============================================================================= */ const struct ud_operand* ud_insn_opr(const struct ud *u, unsigned int n) { if (n > 2 || u->operand[n].type == UD_NONE) { return NULL; } else { return &u->operand[n]; } } /* ============================================================================= * ud_opr_is_sreg * Returns non-zero if the given operand is of a segment register type. * ============================================================================= */ int ud_opr_is_sreg(const struct ud_operand *opr) { return opr->type == UD_OP_REG && opr->base >= UD_R_ES && opr->base <= UD_R_GS; } /* ============================================================================= * ud_opr_is_sreg * Returns non-zero if the given operand is of a general purpose * register type. * ============================================================================= */ int ud_opr_is_gpr(const struct ud_operand *opr) { return opr->type == UD_OP_REG && opr->base >= UD_R_AL && opr->base <= UD_R_R15; } /* ============================================================================= * ud_set_user_opaque_data * ud_get_user_opaque_data * Get/set user opaqute data pointer * ============================================================================= */ void ud_set_user_opaque_data(struct ud * u, void* opaque) { u->user_opaque_data = opaque; } void* ud_get_user_opaque_data(const struct ud *u) { return u->user_opaque_data; } /* ============================================================================= * ud_set_asm_buffer * Allow the user to set an assembler output buffer. If `buf` is NULL, * we switch back to the internal buffer. * ============================================================================= */ void ud_set_asm_buffer(struct ud *u, char *buf, size_t size) { if (buf == NULL) { ud_set_asm_buffer(u, u->asm_buf_int, sizeof(u->asm_buf_int)); } else { u->asm_buf = buf; u->asm_buf_size = size; } } /* ============================================================================= * ud_set_sym_resolver * Set symbol resolver for relative targets used in the translation * phase. * * The resolver is a function that takes a uint64_t address and returns a * symbolic name for the that address. The function also takes a second * argument pointing to an integer that the client can optionally set to a * non-zero value for offsetted targets. (symbol+offset) The function may * also return NULL, in which case the translator only prints the target * address. * * The function pointer maybe NULL which resets symbol resolution. * ============================================================================= */ void ud_set_sym_resolver(struct ud *u, const char* (*resolver)(struct ud*, uint64_t addr, int64_t *offset)) { u->sym_resolver = resolver; } /* vim:set ts=2 sw=2 expandtab */ mumble-1.3.4/3rdparty/mach-override-src/libudis86/syn-intel.c0000664000175000017500000001433414010707335023626 0ustar builderbuilder/* udis86 - libudis86/syn-intel.c * * Copyright (c) 2002-2013 Vivek Thampi * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "types.h" #include "extern.h" #include "decode.h" #include "itab.h" #include "syn.h" #include "udint.h" /* ----------------------------------------------------------------------------- * opr_cast() - Prints an operand cast. * ----------------------------------------------------------------------------- */ static void opr_cast(struct ud* u, struct ud_operand* op) { if (u->br_far) { ud_asmprintf(u, "far "); } switch(op->size) { case 8: ud_asmprintf(u, "byte " ); break; case 16: ud_asmprintf(u, "word " ); break; case 32: ud_asmprintf(u, "dword "); break; case 64: ud_asmprintf(u, "qword "); break; case 80: ud_asmprintf(u, "tword "); break; default: break; } } /* ----------------------------------------------------------------------------- * gen_operand() - Generates assembly output for each operand. * ----------------------------------------------------------------------------- */ static void gen_operand(struct ud* u, struct ud_operand* op, int syn_cast) { switch(op->type) { case UD_OP_REG: ud_asmprintf(u, "%s", ud_reg_tab[op->base - UD_R_AL]); break; case UD_OP_MEM: if (syn_cast) { opr_cast(u, op); } ud_asmprintf(u, "["); if (u->pfx_seg) { ud_asmprintf(u, "%s:", ud_reg_tab[u->pfx_seg - UD_R_AL]); } if (op->base) { ud_asmprintf(u, "%s", ud_reg_tab[op->base - UD_R_AL]); } if (op->index) { ud_asmprintf(u, "%s%s", op->base != UD_NONE? "+" : "", ud_reg_tab[op->index - UD_R_AL]); if (op->scale) { ud_asmprintf(u, "*%d", op->scale); } } if (op->offset != 0) { ud_syn_print_mem_disp(u, op, (op->base != UD_NONE || op->index != UD_NONE) ? 1 : 0); } ud_asmprintf(u, "]"); break; case UD_OP_IMM: ud_syn_print_imm(u, op); break; case UD_OP_JIMM: ud_syn_print_addr(u, ud_syn_rel_target(u, op)); break; case UD_OP_PTR: switch (op->size) { case 32: ud_asmprintf(u, "word 0x%x:0x%x", op->lval.ptr.seg, op->lval.ptr.off & 0xFFFF); break; case 48: ud_asmprintf(u, "dword 0x%x:0x%x", op->lval.ptr.seg, op->lval.ptr.off); break; } break; case UD_OP_CONST: if (syn_cast) opr_cast(u, op); ud_asmprintf(u, "%d", op->lval.udword); break; default: return; } } /* ============================================================================= * translates to intel syntax * ============================================================================= */ extern void ud_translate_intel(struct ud* u) { /* check if P_OSO prefix is used */ if (!P_OSO(u->itab_entry->prefix) && u->pfx_opr) { switch (u->dis_mode) { case 16: ud_asmprintf(u, "o32 "); break; case 32: case 64: ud_asmprintf(u, "o16 "); break; } } /* check if P_ASO prefix was used */ if (!P_ASO(u->itab_entry->prefix) && u->pfx_adr) { switch (u->dis_mode) { case 16: ud_asmprintf(u, "a32 "); break; case 32: ud_asmprintf(u, "a16 "); break; case 64: ud_asmprintf(u, "a32 "); break; } } if (u->pfx_seg && u->operand[0].type != UD_OP_MEM && u->operand[1].type != UD_OP_MEM ) { ud_asmprintf(u, "%s ", ud_reg_tab[u->pfx_seg - UD_R_AL]); } if (u->pfx_lock) { ud_asmprintf(u, "lock "); } if (u->pfx_rep) { ud_asmprintf(u, "rep "); } else if (u->pfx_repe) { ud_asmprintf(u, "repe "); } else if (u->pfx_repne) { ud_asmprintf(u, "repne "); } /* print the instruction mnemonic */ ud_asmprintf(u, "%s", ud_lookup_mnemonic(u->mnemonic)); if (u->operand[0].type != UD_NONE) { int cast = 0; ud_asmprintf(u, " "); if (u->operand[0].type == UD_OP_MEM) { if (u->operand[1].type == UD_OP_IMM || u->operand[1].type == UD_OP_CONST || u->operand[1].type == UD_NONE || (u->operand[0].size != u->operand[1].size && u->operand[1].type != UD_OP_REG)) { cast = 1; } else if (u->operand[1].type == UD_OP_REG && u->operand[1].base == UD_R_CL) { switch (u->mnemonic) { case UD_Ircl: case UD_Irol: case UD_Iror: case UD_Ircr: case UD_Ishl: case UD_Ishr: case UD_Isar: cast = 1; break; default: break; } } } gen_operand(u, &u->operand[0], cast); } if (u->operand[1].type != UD_NONE) { int cast = 0; ud_asmprintf(u, ", "); if (u->operand[1].type == UD_OP_MEM && u->operand[0].size != u->operand[1].size && !ud_opr_is_sreg(&u->operand[0])) { cast = 1; } gen_operand(u, &u->operand[1], cast); } if (u->operand[2].type != UD_NONE) { ud_asmprintf(u, ", "); gen_operand(u, &u->operand[2], 0); } } /* vim: set ts=2 sw=2 expandtab */ mumble-1.3.4/3rdparty/mach-override-src/libudis86/types.h0000664000175000017500000001633214010707335023055 0ustar builderbuilder/* udis86 - libudis86/types.h * * Copyright (c) 2002-2013 Vivek Thampi * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef UD_TYPES_H #define UD_TYPES_H #ifdef __KERNEL__ /* -D__KERNEL__ is automatically passed on the command line when building something as part of the Linux kernel */ # include # include # ifndef __UD_STANDALONE__ # define __UD_STANDALONE__ 1 #endif #endif /* __KERNEL__ */ #if defined(_MSC_VER) || defined(__BORLANDC__) # include # include # define inline __inline /* MS Visual Studio requires __inline instead of inline for C code */ #elif !defined(__UD_STANDALONE__) # include # include #endif /* !__UD_STANDALONE__ */ /* gcc specific extensions */ #ifdef __GNUC__ # define UD_ATTR_PACKED __attribute__((packed)) #else # define UD_ATTR_PACKED #endif /* UD_ATTR_PACKED */ /* ----------------------------------------------------------------------------- * All possible "types" of objects in udis86. Order is Important! * ----------------------------------------------------------------------------- */ enum ud_type { UD_NONE, /* 8 bit GPRs */ UD_R_AL, UD_R_CL, UD_R_DL, UD_R_BL, UD_R_AH, UD_R_CH, UD_R_DH, UD_R_BH, UD_R_SPL, UD_R_BPL, UD_R_SIL, UD_R_DIL, UD_R_R8B, UD_R_R9B, UD_R_R10B, UD_R_R11B, UD_R_R12B, UD_R_R13B, UD_R_R14B, UD_R_R15B, /* 16 bit GPRs */ UD_R_AX, UD_R_CX, UD_R_DX, UD_R_BX, UD_R_SP, UD_R_BP, UD_R_SI, UD_R_DI, UD_R_R8W, UD_R_R9W, UD_R_R10W, UD_R_R11W, UD_R_R12W, UD_R_R13W, UD_R_R14W, UD_R_R15W, /* 32 bit GPRs */ UD_R_EAX, UD_R_ECX, UD_R_EDX, UD_R_EBX, UD_R_ESP, UD_R_EBP, UD_R_ESI, UD_R_EDI, UD_R_R8D, UD_R_R9D, UD_R_R10D, UD_R_R11D, UD_R_R12D, UD_R_R13D, UD_R_R14D, UD_R_R15D, /* 64 bit GPRs */ UD_R_RAX, UD_R_RCX, UD_R_RDX, UD_R_RBX, UD_R_RSP, UD_R_RBP, UD_R_RSI, UD_R_RDI, UD_R_R8, UD_R_R9, UD_R_R10, UD_R_R11, UD_R_R12, UD_R_R13, UD_R_R14, UD_R_R15, /* segment registers */ UD_R_ES, UD_R_CS, UD_R_SS, UD_R_DS, UD_R_FS, UD_R_GS, /* control registers*/ UD_R_CR0, UD_R_CR1, UD_R_CR2, UD_R_CR3, UD_R_CR4, UD_R_CR5, UD_R_CR6, UD_R_CR7, UD_R_CR8, UD_R_CR9, UD_R_CR10, UD_R_CR11, UD_R_CR12, UD_R_CR13, UD_R_CR14, UD_R_CR15, /* debug registers */ UD_R_DR0, UD_R_DR1, UD_R_DR2, UD_R_DR3, UD_R_DR4, UD_R_DR5, UD_R_DR6, UD_R_DR7, UD_R_DR8, UD_R_DR9, UD_R_DR10, UD_R_DR11, UD_R_DR12, UD_R_DR13, UD_R_DR14, UD_R_DR15, /* mmx registers */ UD_R_MM0, UD_R_MM1, UD_R_MM2, UD_R_MM3, UD_R_MM4, UD_R_MM5, UD_R_MM6, UD_R_MM7, /* x87 registers */ UD_R_ST0, UD_R_ST1, UD_R_ST2, UD_R_ST3, UD_R_ST4, UD_R_ST5, UD_R_ST6, UD_R_ST7, /* extended multimedia registers */ UD_R_XMM0, UD_R_XMM1, UD_R_XMM2, UD_R_XMM3, UD_R_XMM4, UD_R_XMM5, UD_R_XMM6, UD_R_XMM7, UD_R_XMM8, UD_R_XMM9, UD_R_XMM10, UD_R_XMM11, UD_R_XMM12, UD_R_XMM13, UD_R_XMM14, UD_R_XMM15, UD_R_RIP, /* Operand Types */ UD_OP_REG, UD_OP_MEM, UD_OP_PTR, UD_OP_IMM, UD_OP_JIMM, UD_OP_CONST }; #include "itab.h" union ud_lval { int8_t sbyte; uint8_t ubyte; int16_t sword; uint16_t uword; int32_t sdword; uint32_t udword; int64_t sqword; uint64_t uqword; struct { uint16_t seg; uint32_t off; } ptr; }; /* ----------------------------------------------------------------------------- * struct ud_operand - Disassembled instruction Operand. * ----------------------------------------------------------------------------- */ struct ud_operand { enum ud_type type; uint8_t size; enum ud_type base; enum ud_type index; uint8_t scale; uint8_t offset; union ud_lval lval; uint64_t disp; /* * internal use only */ uint8_t _oprcode; }; /* ----------------------------------------------------------------------------- * struct ud - The udis86 object. * ----------------------------------------------------------------------------- */ struct ud { /* * input buffering */ int (*inp_hook) (struct ud*); #ifndef __UD_STANDALONE__ FILE* inp_file; #endif uint8_t inp_curr; uint8_t inp_fill; uint8_t inp_ctr; const uint8_t* inp_buff; const uint8_t* inp_buff_end; uint8_t inp_end; uint8_t inp_cache[256]; uint8_t inp_sess[64]; void (*translator)(struct ud*); uint64_t insn_offset; char insn_hexcode[64]; /* * Assembly output buffer */ char *asm_buf; size_t asm_buf_size; size_t asm_buf_fill; char asm_buf_int[128]; /* * Symbol resolver for use in the translation phase. */ const char* (*sym_resolver)(struct ud*, uint64_t addr, int64_t *offset); uint8_t dis_mode; uint64_t pc; uint8_t vendor; enum ud_mnemonic_code mnemonic; struct ud_operand operand[3]; uint8_t error; uint8_t pfx_rex; uint8_t pfx_seg; uint8_t pfx_opr; uint8_t pfx_adr; uint8_t pfx_lock; uint8_t pfx_str; uint8_t pfx_rep; uint8_t pfx_repe; uint8_t pfx_repne; uint8_t default64; uint8_t opr_mode; uint8_t adr_mode; uint8_t br_far; uint8_t br_near; uint8_t implicit_addr; uint8_t have_modrm; uint8_t modrm; uint8_t primary_opcode; void * user_opaque_data; struct ud_itab_entry * itab_entry; struct ud_lookup_table_list_entry *le; }; /* ----------------------------------------------------------------------------- * Type-definitions * ----------------------------------------------------------------------------- */ typedef enum ud_type ud_type_t; typedef enum ud_mnemonic_code ud_mnemonic_code_t; typedef struct ud ud_t; typedef struct ud_operand ud_operand_t; #define UD_SYN_INTEL ud_translate_intel #define UD_SYN_ATT ud_translate_att #define UD_EOI (-1) #define UD_INP_CACHE_SZ 32 #define UD_VENDOR_AMD 0 #define UD_VENDOR_INTEL 1 #define UD_VENDOR_ANY 2 #endif /* vim: set ts=2 sw=2 expandtab */ mumble-1.3.4/3rdparty/mach-override-src/libudis86/itab.c0000664000175000017500000115265414010707335022634 0ustar builderbuilder/* itab.c -- generated by udis86:scripts/ud_itab.py, do no edit */ #include "decode.h" #define GROUP(n) (0x8000 | (n)) static const uint16_t ud_itab__1[] = { /* 0 */ 7, 0, }; static const uint16_t ud_itab__2[] = { /* 0 */ 8, 0, }; static const uint16_t ud_itab__3[] = { /* 0 */ 15, 0, }; static const uint16_t ud_itab__6[] = { /* 0 */ 16, 0, 0, 0, }; static const uint16_t ud_itab__7[] = { /* 0 */ 17, 0, 0, 0, }; static const uint16_t ud_itab__8[] = { /* 0 */ 18, 0, 0, 0, }; static const uint16_t ud_itab__9[] = { /* 0 */ 19, 0, 0, 0, }; static const uint16_t ud_itab__10[] = { /* 0 */ 20, 0, 0, 0, }; static const uint16_t ud_itab__11[] = { /* 0 */ 21, 0, 0, 0, }; static const uint16_t ud_itab__5[] = { /* 0 */ GROUP(6), GROUP(7), GROUP(8), GROUP(9), /* 4 */ GROUP(10), GROUP(11), 0, 0, }; static const uint16_t ud_itab__15[] = { /* 0 */ 22, 0, }; static const uint16_t ud_itab__14[] = { /* 0 */ GROUP(15), 0, 0, 0, }; static const uint16_t ud_itab__17[] = { /* 0 */ 23, 0, }; static const uint16_t ud_itab__16[] = { /* 0 */ GROUP(17), 0, 0, 0, }; static const uint16_t ud_itab__19[] = { /* 0 */ 24, 0, }; static const uint16_t ud_itab__18[] = { /* 0 */ GROUP(19), 0, 0, 0, }; static const uint16_t ud_itab__21[] = { /* 0 */ 25, 0, }; static const uint16_t ud_itab__20[] = { /* 0 */ GROUP(21), 0, 0, 0, }; static const uint16_t ud_itab__23[] = { /* 0 */ 26, 0, }; static const uint16_t ud_itab__22[] = { /* 0 */ GROUP(23), 0, 0, 0, }; static const uint16_t ud_itab__25[] = { /* 0 */ 27, 0, }; static const uint16_t ud_itab__24[] = { /* 0 */ GROUP(25), 0, 0, 0, }; static const uint16_t ud_itab__27[] = { /* 0 */ 28, 0, }; static const uint16_t ud_itab__26[] = { /* 0 */ GROUP(27), 0, 0, 0, }; static const uint16_t ud_itab__13[] = { /* 0 */ GROUP(14), GROUP(16), GROUP(18), GROUP(20), /* 4 */ GROUP(22), 0, GROUP(24), GROUP(26), }; static const uint16_t ud_itab__32[] = { /* 0 */ 0, 29, 0, }; static const uint16_t ud_itab__31[] = { /* 0 */ 0, GROUP(32), }; static const uint16_t ud_itab__30[] = { /* 0 */ GROUP(31), 0, 0, 0, }; static const uint16_t ud_itab__35[] = { /* 0 */ 0, 30, 0, }; static const uint16_t ud_itab__34[] = { /* 0 */ 0, GROUP(35), }; static const uint16_t ud_itab__33[] = { /* 0 */ GROUP(34), 0, 0, 0, }; static const uint16_t ud_itab__38[] = { /* 0 */ 0, 31, 0, }; static const uint16_t ud_itab__37[] = { /* 0 */ 0, GROUP(38), }; static const uint16_t ud_itab__36[] = { /* 0 */ GROUP(37), 0, 0, 0, }; static const uint16_t ud_itab__41[] = { /* 0 */ 0, 32, 0, }; static const uint16_t ud_itab__40[] = { /* 0 */ 0, GROUP(41), }; static const uint16_t ud_itab__39[] = { /* 0 */ GROUP(40), 0, 0, 0, }; static const uint16_t ud_itab__29[] = { /* 0 */ 0, GROUP(30), GROUP(33), GROUP(36), /* 4 */ GROUP(39), 0, 0, 0, }; static const uint16_t ud_itab__44[] = { /* 0 */ 0, 33, }; static const uint16_t ud_itab__43[] = { /* 0 */ GROUP(44), 0, 0, 0, }; static const uint16_t ud_itab__46[] = { /* 0 */ 0, 34, }; static const uint16_t ud_itab__45[] = { /* 0 */ GROUP(46), 0, 0, 0, }; static const uint16_t ud_itab__42[] = { /* 0 */ GROUP(43), GROUP(45), 0, 0, /* 4 */ 0, 0, 0, 0, }; static const uint16_t ud_itab__49[] = { /* 0 */ 0, 35, }; static const uint16_t ud_itab__48[] = { /* 0 */ GROUP(49), 0, 0, 0, }; static const uint16_t ud_itab__51[] = { /* 0 */ 0, 36, }; static const uint16_t ud_itab__50[] = { /* 0 */ GROUP(51), 0, 0, 0, }; static const uint16_t ud_itab__47[] = { /* 0 */ GROUP(48), GROUP(50), 0, 0, /* 4 */ 0, 0, 0, 0, }; static const uint16_t ud_itab__55[] = { /* 0 */ 37, 0, 0, }; static const uint16_t ud_itab__54[] = { /* 0 */ 0, GROUP(55), }; static const uint16_t ud_itab__53[] = { /* 0 */ GROUP(54), 0, 0, 0, }; static const uint16_t ud_itab__58[] = { /* 0 */ 38, 0, 0, }; static const uint16_t ud_itab__57[] = { /* 0 */ 0, GROUP(58), }; static const uint16_t ud_itab__56[] = { /* 0 */ GROUP(57), 0, 0, 0, }; static const uint16_t ud_itab__61[] = { /* 0 */ 39, 0, 0, }; static const uint16_t ud_itab__60[] = { /* 0 */ 0, GROUP(61), }; static const uint16_t ud_itab__59[] = { /* 0 */ GROUP(60), 0, 0, 0, }; static const uint16_t ud_itab__64[] = { /* 0 */ 40, 0, 0, }; static const uint16_t ud_itab__63[] = { /* 0 */ 0, GROUP(64), }; static const uint16_t ud_itab__62[] = { /* 0 */ GROUP(63), 0, 0, 0, }; static const uint16_t ud_itab__67[] = { /* 0 */ 41, 0, 0, }; static const uint16_t ud_itab__66[] = { /* 0 */ 0, GROUP(67), }; static const uint16_t ud_itab__65[] = { /* 0 */ GROUP(66), 0, 0, 0, }; static const uint16_t ud_itab__70[] = { /* 0 */ 42, 0, 0, }; static const uint16_t ud_itab__69[] = { /* 0 */ 0, GROUP(70), }; static const uint16_t ud_itab__68[] = { /* 0 */ GROUP(69), 0, 0, 0, }; static const uint16_t ud_itab__73[] = { /* 0 */ 43, 0, 0, }; static const uint16_t ud_itab__72[] = { /* 0 */ 0, GROUP(73), }; static const uint16_t ud_itab__71[] = { /* 0 */ GROUP(72), 0, 0, 0, }; static const uint16_t ud_itab__76[] = { /* 0 */ 44, 0, 0, }; static const uint16_t ud_itab__75[] = { /* 0 */ 0, GROUP(76), }; static const uint16_t ud_itab__74[] = { /* 0 */ GROUP(75), 0, 0, 0, }; static const uint16_t ud_itab__52[] = { /* 0 */ GROUP(53), GROUP(56), GROUP(59), GROUP(62), /* 4 */ GROUP(65), GROUP(68), GROUP(71), GROUP(74), }; static const uint16_t ud_itab__78[] = { /* 0 */ 0, 45, }; static const uint16_t ud_itab__77[] = { /* 0 */ GROUP(78), 0, 0, 0, }; static const uint16_t ud_itab__80[] = { /* 0 */ 0, 46, }; static const uint16_t ud_itab__79[] = { /* 0 */ GROUP(80), 0, 0, 0, }; static const uint16_t ud_itab__83[] = { /* 0 */ 0, 47, }; static const uint16_t ud_itab__82[] = { /* 0 */ GROUP(83), 0, 0, 0, }; static const uint16_t ud_itab__86[] = { /* 0 */ 48, 0, 0, }; static const uint16_t ud_itab__85[] = { /* 0 */ 0, GROUP(86), }; static const uint16_t ud_itab__84[] = { /* 0 */ GROUP(85), 0, 0, 0, }; static const uint16_t ud_itab__81[] = { /* 0 */ GROUP(82), GROUP(84), 0, 0, /* 4 */ 0, 0, 0, 0, }; static const uint16_t ud_itab__28[] = { /* 0 */ GROUP(29), GROUP(42), GROUP(47), GROUP(52), /* 4 */ GROUP(77), 0, GROUP(79), GROUP(81), }; static const uint16_t ud_itab__12[] = { /* 0 */ GROUP(13), GROUP(28), }; static const uint16_t ud_itab__87[] = { /* 0 */ 49, 0, 0, 0, }; static const uint16_t ud_itab__88[] = { /* 0 */ 50, 0, 0, 0, }; static const uint16_t ud_itab__89[] = { /* 0 */ 51, 0, 0, 0, }; static const uint16_t ud_itab__90[] = { /* 0 */ 52, 0, 0, 0, }; static const uint16_t ud_itab__91[] = { /* 0 */ 53, 0, 0, 0, }; static const uint16_t ud_itab__92[] = { /* 0 */ 54, 0, 0, 0, }; static const uint16_t ud_itab__93[] = { /* 0 */ 55, 0, 0, 0, }; static const uint16_t ud_itab__94[] = { /* 0 */ 56, 0, 0, 0, }; static const uint16_t ud_itab__96[] = { /* 0 */ 57, 0, 0, 0, }; static const uint16_t ud_itab__97[] = { /* 0 */ 58, 0, 0, 0, }; static const uint16_t ud_itab__98[] = { /* 0 */ 59, 0, 0, 0, }; static const uint16_t ud_itab__99[] = { /* 0 */ 60, 0, 0, 0, }; static const uint16_t ud_itab__100[] = { /* 0 */ 61, 0, 0, 0, }; static const uint16_t ud_itab__101[] = { /* 0 */ 62, 0, 0, 0, }; static const uint16_t ud_itab__102[] = { /* 0 */ 63, 0, 0, 0, }; static const uint16_t ud_itab__103[] = { /* 0 */ 64, 0, 0, 0, }; static const uint16_t ud_itab__95[] = { /* 0 */ GROUP(96), GROUP(97), GROUP(98), GROUP(99), /* 4 */ GROUP(100), GROUP(101), GROUP(102), GROUP(103), }; static const uint16_t ud_itab__104[] = { /* 0 */ 65, 0, 0, 0, }; static const uint16_t ud_itab__105[] = { /* 0 */ 0, 0, 0, 0, /* 4 */ 0, 0, 0, 0, /* 8 */ 0, 0, 0, 0, /* c */ 66, 67, 0, 0, /* 10 */ 0, 0, 0, 0, /* 14 */ 0, 0, 0, 0, /* 18 */ 0, 0, 0, 0, /* 1c */ 68, 69, 0, 0, /* 20 */ 0, 0, 0, 0, /* 24 */ 0, 0, 0, 0, /* 28 */ 0, 0, 0, 0, /* 2c */ 0, 0, 0, 0, /* 30 */ 0, 0, 0, 0, /* 34 */ 0, 0, 0, 0, /* 38 */ 0, 0, 0, 0, /* 3c */ 0, 0, 0, 0, /* 40 */ 0, 0, 0, 0, /* 44 */ 0, 0, 0, 0, /* 48 */ 0, 0, 0, 0, /* 4c */ 0, 0, 0, 0, /* 50 */ 0, 0, 0, 0, /* 54 */ 0, 0, 0, 0, /* 58 */ 0, 0, 0, 0, /* 5c */ 0, 0, 0, 0, /* 60 */ 0, 0, 0, 0, /* 64 */ 0, 0, 0, 0, /* 68 */ 0, 0, 0, 0, /* 6c */ 0, 0, 0, 0, /* 70 */ 0, 0, 0, 0, /* 74 */ 0, 0, 0, 0, /* 78 */ 0, 0, 0, 0, /* 7c */ 0, 0, 0, 0, /* 80 */ 0, 0, 0, 0, /* 84 */ 0, 0, 0, 0, /* 88 */ 0, 0, 70, 0, /* 8c */ 0, 0, 71, 0, /* 90 */ 72, 0, 0, 0, /* 94 */ 73, 0, 74, 75, /* 98 */ 0, 0, 76, 0, /* 9c */ 0, 0, 77, 0, /* a0 */ 78, 0, 0, 0, /* a4 */ 79, 0, 80, 81, /* a8 */ 0, 0, 82, 0, /* ac */ 0, 0, 83, 0, /* b0 */ 84, 0, 0, 0, /* b4 */ 85, 0, 86, 87, /* b8 */ 0, 0, 0, 88, /* bc */ 0, 0, 0, 89, /* c0 */ 0, 0, 0, 0, /* c4 */ 0, 0, 0, 0, /* c8 */ 0, 0, 0, 0, /* cc */ 0, 0, 0, 0, /* d0 */ 0, 0, 0, 0, /* d4 */ 0, 0, 0, 0, /* d8 */ 0, 0, 0, 0, /* dc */ 0, 0, 0, 0, /* e0 */ 0, 0, 0, 0, /* e4 */ 0, 0, 0, 0, /* e8 */ 0, 0, 0, 0, /* ec */ 0, 0, 0, 0, /* f0 */ 0, 0, 0, 0, /* f4 */ 0, 0, 0, 0, /* f8 */ 0, 0, 0, 0, /* fc */ 0, 0, 0, 0, }; static const uint16_t ud_itab__106[] = { /* 0 */ 90, 91, 92, 93, }; static const uint16_t ud_itab__107[] = { /* 0 */ 94, 95, 96, 97, }; static const uint16_t ud_itab__110[] = { /* 0 */ 98, 0, }; static const uint16_t ud_itab__111[] = { /* 0 */ 99, 0, }; static const uint16_t ud_itab__112[] = { /* 0 */ 100, 0, }; static const uint16_t ud_itab__113[] = { /* 0 */ 101, 0, }; static const uint16_t ud_itab__109[] = { /* 0 */ GROUP(110), GROUP(111), GROUP(112), GROUP(113), }; static const uint16_t ud_itab__115[] = { /* 0 */ 0, 102, }; static const uint16_t ud_itab__116[] = { /* 0 */ 0, 103, }; static const uint16_t ud_itab__117[] = { /* 0 */ 0, 104, }; static const uint16_t ud_itab__114[] = { /* 0 */ GROUP(115), GROUP(116), GROUP(117), 0, }; static const uint16_t ud_itab__108[] = { /* 0 */ GROUP(109), GROUP(114), }; static const uint16_t ud_itab__118[] = { /* 0 */ 105, 0, 0, 106, }; static const uint16_t ud_itab__119[] = { /* 0 */ 107, 0, 0, 108, }; static const uint16_t ud_itab__120[] = { /* 0 */ 109, 0, 0, 110, }; static const uint16_t ud_itab__123[] = { /* 0 */ 111, 0, }; static const uint16_t ud_itab__124[] = { /* 0 */ 112, 0, }; static const uint16_t ud_itab__125[] = { /* 0 */ 113, 0, }; static const uint16_t ud_itab__122[] = { /* 0 */ GROUP(123), 0, GROUP(124), GROUP(125), }; static const uint16_t ud_itab__127[] = { /* 0 */ 0, 114, }; static const uint16_t ud_itab__128[] = { /* 0 */ 0, 115, }; static const uint16_t ud_itab__126[] = { /* 0 */ GROUP(127), 0, GROUP(128), 0, }; static const uint16_t ud_itab__121[] = { /* 0 */ GROUP(122), GROUP(126), }; static const uint16_t ud_itab__129[] = { /* 0 */ 116, 0, 0, 117, }; static const uint16_t ud_itab__131[] = { /* 0 */ 118, 0, 0, 0, }; static const uint16_t ud_itab__132[] = { /* 0 */ 119, 0, 0, 0, }; static const uint16_t ud_itab__133[] = { /* 0 */ 120, 0, 0, 0, }; static const uint16_t ud_itab__134[] = { /* 0 */ 121, 0, 0, 0, }; static const uint16_t ud_itab__130[] = { /* 0 */ GROUP(131), GROUP(132), GROUP(133), GROUP(134), /* 4 */ 0, 0, 0, 0, }; static const uint16_t ud_itab__135[] = { /* 0 */ 122, 0, 0, 0, }; static const uint16_t ud_itab__136[] = { /* 0 */ 123, 0, 0, 0, }; static const uint16_t ud_itab__137[] = { /* 0 */ 124, 0, 0, 0, }; static const uint16_t ud_itab__138[] = { /* 0 */ 125, 0, 0, 0, }; static const uint16_t ud_itab__139[] = { /* 0 */ 126, 0, 0, 0, }; static const uint16_t ud_itab__140[] = { /* 0 */ 127, 0, 0, 0, }; static const uint16_t ud_itab__141[] = { /* 0 */ 128, 0, 0, 0, }; static const uint16_t ud_itab__142[] = { /* 0 */ 129, 0, 0, 0, }; static const uint16_t ud_itab__143[] = { /* 0 */ 130, 0, 0, 0, }; static const uint16_t ud_itab__144[] = { /* 0 */ 131, 0, 0, 0, }; static const uint16_t ud_itab__145[] = { /* 0 */ 132, 0, 0, 0, }; static const uint16_t ud_itab__146[] = { /* 0 */ 133, 0, 0, 134, }; static const uint16_t ud_itab__147[] = { /* 0 */ 135, 0, 0, 136, }; static const uint16_t ud_itab__148[] = { /* 0 */ 137, 138, 139, 140, }; static const uint16_t ud_itab__149[] = { /* 0 */ 141, 0, 0, 142, }; static const uint16_t ud_itab__150[] = { /* 0 */ 143, 144, 145, 146, }; static const uint16_t ud_itab__151[] = { /* 0 */ 147, 148, 149, 150, }; static const uint16_t ud_itab__152[] = { /* 0 */ 151, 0, 0, 152, }; static const uint16_t ud_itab__153[] = { /* 0 */ 153, 0, 0, 154, }; static const uint16_t ud_itab__154[] = { /* 0 */ 155, 0, 0, 0, }; static const uint16_t ud_itab__155[] = { /* 0 */ 156, 0, 0, 0, }; static const uint16_t ud_itab__156[] = { /* 0 */ 157, 0, 0, 0, }; static const uint16_t ud_itab__157[] = { /* 0 */ 158, 0, 0, 0, }; static const uint16_t ud_itab__160[] = { /* 0 */ 0, 160, 0, }; static const uint16_t ud_itab__159[] = { /* 0 */ 159, GROUP(160), }; static const uint16_t ud_itab__158[] = { /* 0 */ GROUP(159), 0, 0, 0, }; static const uint16_t ud_itab__163[] = { /* 0 */ 0, 162, 0, }; static const uint16_t ud_itab__162[] = { /* 0 */ 161, GROUP(163), }; static const uint16_t ud_itab__161[] = { /* 0 */ GROUP(162), 0, 0, 0, }; static const uint16_t ud_itab__164[] = { /* 0 */ 163, 0, 0, 0, }; static const uint16_t ud_itab__166[] = { /* 0 */ 164, 0, 0, 165, }; static const uint16_t ud_itab__167[] = { /* 0 */ 166, 0, 0, 167, }; static const uint16_t ud_itab__168[] = { /* 0 */ 168, 0, 0, 169, }; static const uint16_t ud_itab__169[] = { /* 0 */ 170, 0, 0, 171, }; static const uint16_t ud_itab__170[] = { /* 0 */ 172, 0, 0, 173, }; static const uint16_t ud_itab__171[] = { /* 0 */ 174, 0, 0, 175, }; static const uint16_t ud_itab__172[] = { /* 0 */ 176, 0, 0, 177, }; static const uint16_t ud_itab__173[] = { /* 0 */ 178, 0, 0, 179, }; static const uint16_t ud_itab__174[] = { /* 0 */ 180, 0, 0, 181, }; static const uint16_t ud_itab__175[] = { /* 0 */ 182, 0, 0, 183, }; static const uint16_t ud_itab__176[] = { /* 0 */ 184, 0, 0, 185, }; static const uint16_t ud_itab__177[] = { /* 0 */ 186, 0, 0, 187, }; static const uint16_t ud_itab__178[] = { /* 0 */ 0, 0, 0, 188, }; static const uint16_t ud_itab__179[] = { /* 0 */ 0, 0, 0, 189, }; static const uint16_t ud_itab__180[] = { /* 0 */ 0, 0, 0, 190, }; static const uint16_t ud_itab__181[] = { /* 0 */ 0, 0, 0, 191, }; static const uint16_t ud_itab__182[] = { /* 0 */ 192, 0, 0, 193, }; static const uint16_t ud_itab__183[] = { /* 0 */ 194, 0, 0, 195, }; static const uint16_t ud_itab__184[] = { /* 0 */ 196, 0, 0, 197, }; static const uint16_t ud_itab__185[] = { /* 0 */ 0, 0, 0, 198, }; static const uint16_t ud_itab__186[] = { /* 0 */ 0, 0, 0, 199, }; static const uint16_t ud_itab__187[] = { /* 0 */ 0, 0, 0, 200, }; static const uint16_t ud_itab__188[] = { /* 0 */ 0, 0, 0, 201, }; static const uint16_t ud_itab__189[] = { /* 0 */ 0, 0, 0, 202, }; static const uint16_t ud_itab__190[] = { /* 0 */ 0, 0, 0, 203, }; static const uint16_t ud_itab__191[] = { /* 0 */ 0, 0, 0, 204, }; static const uint16_t ud_itab__192[] = { /* 0 */ 0, 0, 0, 205, }; static const uint16_t ud_itab__193[] = { /* 0 */ 0, 0, 0, 206, }; static const uint16_t ud_itab__194[] = { /* 0 */ 0, 0, 0, 207, }; static const uint16_t ud_itab__195[] = { /* 0 */ 0, 0, 0, 208, }; static const uint16_t ud_itab__196[] = { /* 0 */ 0, 0, 0, 209, }; static const uint16_t ud_itab__197[] = { /* 0 */ 0, 0, 0, 210, }; static const uint16_t ud_itab__198[] = { /* 0 */ 0, 0, 0, 211, }; static const uint16_t ud_itab__199[] = { /* 0 */ 0, 0, 0, 212, }; static const uint16_t ud_itab__200[] = { /* 0 */ 0, 0, 0, 213, }; static const uint16_t ud_itab__201[] = { /* 0 */ 0, 0, 0, 214, }; static const uint16_t ud_itab__202[] = { /* 0 */ 0, 0, 0, 215, }; static const uint16_t ud_itab__203[] = { /* 0 */ 0, 0, 0, 216, }; static const uint16_t ud_itab__204[] = { /* 0 */ 0, 0, 0, 217, }; static const uint16_t ud_itab__205[] = { /* 0 */ 0, 0, 0, 218, }; static const uint16_t ud_itab__206[] = { /* 0 */ 0, 0, 0, 219, }; static const uint16_t ud_itab__207[] = { /* 0 */ 0, 0, 0, 220, }; static const uint16_t ud_itab__208[] = { /* 0 */ 0, 0, 0, 221, }; static const uint16_t ud_itab__209[] = { /* 0 */ 0, 0, 0, 222, }; static const uint16_t ud_itab__210[] = { /* 0 */ 0, 0, 0, 223, }; static const uint16_t ud_itab__211[] = { /* 0 */ 0, 0, 0, 224, }; static const uint16_t ud_itab__214[] = { /* 0 */ 0, 225, 0, }; static const uint16_t ud_itab__213[] = { /* 0 */ 0, GROUP(214), }; static const uint16_t ud_itab__212[] = { /* 0 */ 0, 0, 0, GROUP(213), }; static const uint16_t ud_itab__217[] = { /* 0 */ 0, 226, 0, }; static const uint16_t ud_itab__216[] = { /* 0 */ 0, GROUP(217), }; static const uint16_t ud_itab__215[] = { /* 0 */ 0, 0, 0, GROUP(216), }; static const uint16_t ud_itab__218[] = { /* 0 */ 0, 0, 0, 227, }; static const uint16_t ud_itab__219[] = { /* 0 */ 0, 0, 0, 228, }; static const uint16_t ud_itab__220[] = { /* 0 */ 0, 0, 0, 229, }; static const uint16_t ud_itab__221[] = { /* 0 */ 0, 0, 0, 230, }; static const uint16_t ud_itab__222[] = { /* 0 */ 0, 0, 0, 231, }; static const uint16_t ud_itab__223[] = { /* 0 */ 232, 233, 0, 0, }; static const uint16_t ud_itab__224[] = { /* 0 */ 234, 235, 0, 0, }; static const uint16_t ud_itab__165[] = { /* 0 */ GROUP(166), GROUP(167), GROUP(168), GROUP(169), /* 4 */ GROUP(170), GROUP(171), GROUP(172), GROUP(173), /* 8 */ GROUP(174), GROUP(175), GROUP(176), GROUP(177), /* c */ 0, 0, 0, 0, /* 10 */ GROUP(178), 0, 0, 0, /* 14 */ GROUP(179), GROUP(180), 0, GROUP(181), /* 18 */ 0, 0, 0, 0, /* 1c */ GROUP(182), GROUP(183), GROUP(184), 0, /* 20 */ GROUP(185), GROUP(186), GROUP(187), GROUP(188), /* 24 */ GROUP(189), GROUP(190), 0, 0, /* 28 */ GROUP(191), GROUP(192), GROUP(193), GROUP(194), /* 2c */ 0, 0, 0, 0, /* 30 */ GROUP(195), GROUP(196), GROUP(197), GROUP(198), /* 34 */ GROUP(199), GROUP(200), 0, GROUP(201), /* 38 */ GROUP(202), GROUP(203), GROUP(204), GROUP(205), /* 3c */ GROUP(206), GROUP(207), GROUP(208), GROUP(209), /* 40 */ GROUP(210), GROUP(211), 0, 0, /* 44 */ 0, 0, 0, 0, /* 48 */ 0, 0, 0, 0, /* 4c */ 0, 0, 0, 0, /* 50 */ 0, 0, 0, 0, /* 54 */ 0, 0, 0, 0, /* 58 */ 0, 0, 0, 0, /* 5c */ 0, 0, 0, 0, /* 60 */ 0, 0, 0, 0, /* 64 */ 0, 0, 0, 0, /* 68 */ 0, 0, 0, 0, /* 6c */ 0, 0, 0, 0, /* 70 */ 0, 0, 0, 0, /* 74 */ 0, 0, 0, 0, /* 78 */ 0, 0, 0, 0, /* 7c */ 0, 0, 0, 0, /* 80 */ GROUP(212), GROUP(215), 0, 0, /* 84 */ 0, 0, 0, 0, /* 88 */ 0, 0, 0, 0, /* 8c */ 0, 0, 0, 0, /* 90 */ 0, 0, 0, 0, /* 94 */ 0, 0, 0, 0, /* 98 */ 0, 0, 0, 0, /* 9c */ 0, 0, 0, 0, /* a0 */ 0, 0, 0, 0, /* a4 */ 0, 0, 0, 0, /* a8 */ 0, 0, 0, 0, /* ac */ 0, 0, 0, 0, /* b0 */ 0, 0, 0, 0, /* b4 */ 0, 0, 0, 0, /* b8 */ 0, 0, 0, 0, /* bc */ 0, 0, 0, 0, /* c0 */ 0, 0, 0, 0, /* c4 */ 0, 0, 0, 0, /* c8 */ 0, 0, 0, 0, /* cc */ 0, 0, 0, 0, /* d0 */ 0, 0, 0, 0, /* d4 */ 0, 0, 0, 0, /* d8 */ 0, 0, 0, GROUP(218), /* dc */ GROUP(219), GROUP(220), GROUP(221), GROUP(222), /* e0 */ 0, 0, 0, 0, /* e4 */ 0, 0, 0, 0, /* e8 */ 0, 0, 0, 0, /* ec */ 0, 0, 0, 0, /* f0 */ GROUP(223), GROUP(224), 0, 0, /* f4 */ 0, 0, 0, 0, /* f8 */ 0, 0, 0, 0, /* fc */ 0, 0, 0, 0, }; static const uint16_t ud_itab__226[] = { /* 0 */ 0, 0, 0, 236, }; static const uint16_t ud_itab__227[] = { /* 0 */ 0, 0, 0, 237, }; static const uint16_t ud_itab__228[] = { /* 0 */ 0, 0, 0, 238, }; static const uint16_t ud_itab__229[] = { /* 0 */ 0, 0, 0, 239, }; static const uint16_t ud_itab__230[] = { /* 0 */ 0, 0, 0, 240, }; static const uint16_t ud_itab__231[] = { /* 0 */ 0, 0, 0, 241, }; static const uint16_t ud_itab__232[] = { /* 0 */ 0, 0, 0, 242, }; static const uint16_t ud_itab__233[] = { /* 0 */ 243, 0, 0, 244, }; static const uint16_t ud_itab__234[] = { /* 0 */ 0, 0, 0, 245, }; static const uint16_t ud_itab__235[] = { /* 0 */ 0, 0, 0, 246, }; static const uint16_t ud_itab__237[] = { /* 0 */ 247, 248, 249, }; static const uint16_t ud_itab__236[] = { /* 0 */ 0, 0, 0, GROUP(237), }; static const uint16_t ud_itab__238[] = { /* 0 */ 0, 0, 0, 250, }; static const uint16_t ud_itab__239[] = { /* 0 */ 0, 0, 0, 251, }; static const uint16_t ud_itab__240[] = { /* 0 */ 0, 0, 0, 252, }; static const uint16_t ud_itab__242[] = { /* 0 */ 253, 254, 255, }; static const uint16_t ud_itab__241[] = { /* 0 */ 0, 0, 0, GROUP(242), }; static const uint16_t ud_itab__243[] = { /* 0 */ 0, 0, 0, 256, }; static const uint16_t ud_itab__244[] = { /* 0 */ 0, 0, 0, 257, }; static const uint16_t ud_itab__245[] = { /* 0 */ 0, 0, 0, 258, }; static const uint16_t ud_itab__246[] = { /* 0 */ 0, 0, 0, 259, }; static const uint16_t ud_itab__247[] = { /* 0 */ 0, 0, 0, 260, }; static const uint16_t ud_itab__248[] = { /* 0 */ 0, 0, 0, 261, }; static const uint16_t ud_itab__249[] = { /* 0 */ 0, 0, 0, 262, }; static const uint16_t ud_itab__250[] = { /* 0 */ 0, 0, 0, 263, }; static const uint16_t ud_itab__251[] = { /* 0 */ 0, 0, 0, 264, }; static const uint16_t ud_itab__225[] = { /* 0 */ 0, 0, 0, 0, /* 4 */ 0, 0, 0, 0, /* 8 */ GROUP(226), GROUP(227), GROUP(228), GROUP(229), /* c */ GROUP(230), GROUP(231), GROUP(232), GROUP(233), /* 10 */ 0, 0, 0, 0, /* 14 */ GROUP(234), GROUP(235), GROUP(236), GROUP(238), /* 18 */ 0, 0, 0, 0, /* 1c */ 0, 0, 0, 0, /* 20 */ GROUP(239), GROUP(240), GROUP(241), 0, /* 24 */ 0, 0, 0, 0, /* 28 */ 0, 0, 0, 0, /* 2c */ 0, 0, 0, 0, /* 30 */ 0, 0, 0, 0, /* 34 */ 0, 0, 0, 0, /* 38 */ 0, 0, 0, 0, /* 3c */ 0, 0, 0, 0, /* 40 */ GROUP(243), GROUP(244), GROUP(245), 0, /* 44 */ GROUP(246), 0, 0, 0, /* 48 */ 0, 0, 0, 0, /* 4c */ 0, 0, 0, 0, /* 50 */ 0, 0, 0, 0, /* 54 */ 0, 0, 0, 0, /* 58 */ 0, 0, 0, 0, /* 5c */ 0, 0, 0, 0, /* 60 */ GROUP(247), GROUP(248), GROUP(249), GROUP(250), /* 64 */ 0, 0, 0, 0, /* 68 */ 0, 0, 0, 0, /* 6c */ 0, 0, 0, 0, /* 70 */ 0, 0, 0, 0, /* 74 */ 0, 0, 0, 0, /* 78 */ 0, 0, 0, 0, /* 7c */ 0, 0, 0, 0, /* 80 */ 0, 0, 0, 0, /* 84 */ 0, 0, 0, 0, /* 88 */ 0, 0, 0, 0, /* 8c */ 0, 0, 0, 0, /* 90 */ 0, 0, 0, 0, /* 94 */ 0, 0, 0, 0, /* 98 */ 0, 0, 0, 0, /* 9c */ 0, 0, 0, 0, /* a0 */ 0, 0, 0, 0, /* a4 */ 0, 0, 0, 0, /* a8 */ 0, 0, 0, 0, /* ac */ 0, 0, 0, 0, /* b0 */ 0, 0, 0, 0, /* b4 */ 0, 0, 0, 0, /* b8 */ 0, 0, 0, 0, /* bc */ 0, 0, 0, 0, /* c0 */ 0, 0, 0, 0, /* c4 */ 0, 0, 0, 0, /* c8 */ 0, 0, 0, 0, /* cc */ 0, 0, 0, 0, /* d0 */ 0, 0, 0, 0, /* d4 */ 0, 0, 0, 0, /* d8 */ 0, 0, 0, 0, /* dc */ 0, 0, 0, GROUP(251), /* e0 */ 0, 0, 0, 0, /* e4 */ 0, 0, 0, 0, /* e8 */ 0, 0, 0, 0, /* ec */ 0, 0, 0, 0, /* f0 */ 0, 0, 0, 0, /* f4 */ 0, 0, 0, 0, /* f8 */ 0, 0, 0, 0, /* fc */ 0, 0, 0, 0, }; static const uint16_t ud_itab__252[] = { /* 0 */ 265, 0, 0, 0, }; static const uint16_t ud_itab__253[] = { /* 0 */ 266, 0, 0, 0, }; static const uint16_t ud_itab__254[] = { /* 0 */ 267, 0, 0, 0, }; static const uint16_t ud_itab__255[] = { /* 0 */ 268, 0, 0, 0, }; static const uint16_t ud_itab__256[] = { /* 0 */ 269, 0, 0, 0, }; static const uint16_t ud_itab__257[] = { /* 0 */ 270, 0, 0, 0, }; static const uint16_t ud_itab__258[] = { /* 0 */ 271, 0, 0, 0, }; static const uint16_t ud_itab__259[] = { /* 0 */ 272, 0, 0, 0, }; static const uint16_t ud_itab__260[] = { /* 0 */ 273, 0, 0, 0, }; static const uint16_t ud_itab__261[] = { /* 0 */ 274, 0, 0, 0, }; static const uint16_t ud_itab__262[] = { /* 0 */ 275, 0, 0, 0, }; static const uint16_t ud_itab__263[] = { /* 0 */ 276, 0, 0, 0, }; static const uint16_t ud_itab__264[] = { /* 0 */ 277, 0, 0, 0, }; static const uint16_t ud_itab__265[] = { /* 0 */ 278, 0, 0, 0, }; static const uint16_t ud_itab__266[] = { /* 0 */ 279, 0, 0, 0, }; static const uint16_t ud_itab__267[] = { /* 0 */ 280, 0, 0, 0, }; static const uint16_t ud_itab__268[] = { /* 0 */ 281, 0, 0, 282, }; static const uint16_t ud_itab__269[] = { /* 0 */ 283, 284, 285, 286, }; static const uint16_t ud_itab__270[] = { /* 0 */ 287, 0, 288, 0, }; static const uint16_t ud_itab__271[] = { /* 0 */ 289, 0, 290, 0, }; static const uint16_t ud_itab__272[] = { /* 0 */ 291, 0, 0, 292, }; static const uint16_t ud_itab__273[] = { /* 0 */ 293, 0, 0, 294, }; static const uint16_t ud_itab__274[] = { /* 0 */ 295, 0, 0, 296, }; static const uint16_t ud_itab__275[] = { /* 0 */ 297, 0, 0, 298, }; static const uint16_t ud_itab__276[] = { /* 0 */ 299, 300, 301, 302, }; static const uint16_t ud_itab__277[] = { /* 0 */ 303, 304, 305, 306, }; static const uint16_t ud_itab__278[] = { /* 0 */ 307, 308, 309, 310, }; static const uint16_t ud_itab__279[] = { /* 0 */ 311, 0, 312, 313, }; static const uint16_t ud_itab__280[] = { /* 0 */ 314, 315, 316, 317, }; static const uint16_t ud_itab__281[] = { /* 0 */ 318, 319, 320, 321, }; static const uint16_t ud_itab__282[] = { /* 0 */ 322, 323, 324, 325, }; static const uint16_t ud_itab__283[] = { /* 0 */ 326, 327, 328, 329, }; static const uint16_t ud_itab__284[] = { /* 0 */ 330, 0, 0, 331, }; static const uint16_t ud_itab__285[] = { /* 0 */ 332, 0, 0, 333, }; static const uint16_t ud_itab__286[] = { /* 0 */ 334, 0, 0, 335, }; static const uint16_t ud_itab__287[] = { /* 0 */ 336, 0, 0, 337, }; static const uint16_t ud_itab__288[] = { /* 0 */ 338, 0, 0, 339, }; static const uint16_t ud_itab__289[] = { /* 0 */ 340, 0, 0, 341, }; static const uint16_t ud_itab__290[] = { /* 0 */ 342, 0, 0, 343, }; static const uint16_t ud_itab__291[] = { /* 0 */ 344, 0, 0, 345, }; static const uint16_t ud_itab__292[] = { /* 0 */ 346, 0, 0, 347, }; static const uint16_t ud_itab__293[] = { /* 0 */ 348, 0, 0, 349, }; static const uint16_t ud_itab__294[] = { /* 0 */ 350, 0, 0, 351, }; static const uint16_t ud_itab__295[] = { /* 0 */ 352, 0, 0, 353, }; static const uint16_t ud_itab__296[] = { /* 0 */ 0, 0, 0, 354, }; static const uint16_t ud_itab__297[] = { /* 0 */ 0, 0, 0, 355, }; static const uint16_t ud_itab__298[] = { /* 0 */ 356, 0, 0, 357, }; static const uint16_t ud_itab__299[] = { /* 0 */ 358, 0, 359, 360, }; static const uint16_t ud_itab__300[] = { /* 0 */ 361, 362, 363, 364, }; static const uint16_t ud_itab__302[] = { /* 0 */ 365, 0, 0, 366, }; static const uint16_t ud_itab__303[] = { /* 0 */ 367, 0, 0, 368, }; static const uint16_t ud_itab__304[] = { /* 0 */ 369, 0, 0, 370, }; static const uint16_t ud_itab__301[] = { /* 0 */ 0, 0, GROUP(302), 0, /* 4 */ GROUP(303), 0, GROUP(304), 0, }; static const uint16_t ud_itab__306[] = { /* 0 */ 371, 0, 0, 372, }; static const uint16_t ud_itab__307[] = { /* 0 */ 373, 0, 0, 374, }; static const uint16_t ud_itab__308[] = { /* 0 */ 375, 0, 0, 376, }; static const uint16_t ud_itab__305[] = { /* 0 */ 0, 0, GROUP(306), 0, /* 4 */ GROUP(307), 0, GROUP(308), 0, }; static const uint16_t ud_itab__310[] = { /* 0 */ 377, 0, 0, 378, }; static const uint16_t ud_itab__311[] = { /* 0 */ 0, 0, 0, 379, }; static const uint16_t ud_itab__312[] = { /* 0 */ 380, 0, 0, 381, }; static const uint16_t ud_itab__313[] = { /* 0 */ 0, 0, 0, 382, }; static const uint16_t ud_itab__309[] = { /* 0 */ 0, 0, GROUP(310), GROUP(311), /* 4 */ 0, 0, GROUP(312), GROUP(313), }; static const uint16_t ud_itab__314[] = { /* 0 */ 383, 0, 0, 384, }; static const uint16_t ud_itab__315[] = { /* 0 */ 385, 0, 0, 386, }; static const uint16_t ud_itab__316[] = { /* 0 */ 387, 0, 0, 388, }; static const uint16_t ud_itab__317[] = { /* 0 */ 389, 0, 0, 0, }; static const uint16_t ud_itab__319[] = { /* 0 */ 0, 390, 0, }; static const uint16_t ud_itab__318[] = { /* 0 */ GROUP(319), 0, 0, 0, }; static const uint16_t ud_itab__321[] = { /* 0 */ 0, 391, 0, }; static const uint16_t ud_itab__320[] = { /* 0 */ GROUP(321), 0, 0, 0, }; static const uint16_t ud_itab__322[] = { /* 0 */ 0, 392, 0, 393, }; static const uint16_t ud_itab__323[] = { /* 0 */ 0, 394, 0, 395, }; static const uint16_t ud_itab__324[] = { /* 0 */ 396, 0, 397, 398, }; static const uint16_t ud_itab__325[] = { /* 0 */ 399, 0, 400, 401, }; static const uint16_t ud_itab__326[] = { /* 0 */ 402, 0, 0, 0, }; static const uint16_t ud_itab__327[] = { /* 0 */ 403, 0, 0, 0, }; static const uint16_t ud_itab__328[] = { /* 0 */ 404, 0, 0, 0, }; static const uint16_t ud_itab__329[] = { /* 0 */ 405, 0, 0, 0, }; static const uint16_t ud_itab__330[] = { /* 0 */ 406, 0, 0, 0, }; static const uint16_t ud_itab__331[] = { /* 0 */ 407, 0, 0, 0, }; static const uint16_t ud_itab__332[] = { /* 0 */ 408, 0, 0, 0, }; static const uint16_t ud_itab__333[] = { /* 0 */ 409, 0, 0, 0, }; static const uint16_t ud_itab__334[] = { /* 0 */ 410, 0, 0, 0, }; static const uint16_t ud_itab__335[] = { /* 0 */ 411, 0, 0, 0, }; static const uint16_t ud_itab__336[] = { /* 0 */ 412, 0, 0, 0, }; static const uint16_t ud_itab__337[] = { /* 0 */ 413, 0, 0, 0, }; static const uint16_t ud_itab__338[] = { /* 0 */ 414, 0, 0, 0, }; static const uint16_t ud_itab__339[] = { /* 0 */ 415, 0, 0, 0, }; static const uint16_t ud_itab__340[] = { /* 0 */ 416, 0, 0, 0, }; static const uint16_t ud_itab__341[] = { /* 0 */ 417, 0, 0, 0, }; static const uint16_t ud_itab__342[] = { /* 0 */ 418, 0, 0, 0, }; static const uint16_t ud_itab__343[] = { /* 0 */ 419, 0, 0, 0, }; static const uint16_t ud_itab__344[] = { /* 0 */ 420, 0, 0, 0, }; static const uint16_t ud_itab__345[] = { /* 0 */ 421, 0, 0, 0, }; static const uint16_t ud_itab__346[] = { /* 0 */ 422, 0, 0, 0, }; static const uint16_t ud_itab__347[] = { /* 0 */ 423, 0, 0, 0, }; static const uint16_t ud_itab__348[] = { /* 0 */ 424, 0, 0, 0, }; static const uint16_t ud_itab__349[] = { /* 0 */ 425, 0, 0, 0, }; static const uint16_t ud_itab__350[] = { /* 0 */ 426, 0, 0, 0, }; static const uint16_t ud_itab__351[] = { /* 0 */ 427, 0, 0, 0, }; static const uint16_t ud_itab__352[] = { /* 0 */ 428, 0, 0, 0, }; static const uint16_t ud_itab__353[] = { /* 0 */ 429, 0, 0, 0, }; static const uint16_t ud_itab__354[] = { /* 0 */ 430, 0, 0, 0, }; static const uint16_t ud_itab__355[] = { /* 0 */ 431, 0, 0, 0, }; static const uint16_t ud_itab__356[] = { /* 0 */ 432, 0, 0, 0, }; static const uint16_t ud_itab__357[] = { /* 0 */ 433, 0, 0, 0, }; static const uint16_t ud_itab__358[] = { /* 0 */ 434, 0, 0, 0, }; static const uint16_t ud_itab__359[] = { /* 0 */ 435, 0, 0, 0, }; static const uint16_t ud_itab__360[] = { /* 0 */ 436, 0, 0, 0, }; static const uint16_t ud_itab__361[] = { /* 0 */ 437, 0, 0, 0, }; static const uint16_t ud_itab__362[] = { /* 0 */ 438, 0, 0, 0, }; static const uint16_t ud_itab__363[] = { /* 0 */ 439, 0, 0, 0, }; static const uint16_t ud_itab__368[] = { /* 0 */ 0, 440, }; static const uint16_t ud_itab__367[] = { /* 0 */ GROUP(368), 0, 0, 0, }; static const uint16_t ud_itab__366[] = { /* 0 */ GROUP(367), 0, 0, 0, /* 4 */ 0, 0, 0, 0, }; static const uint16_t ud_itab__371[] = { /* 0 */ 0, 441, }; static const uint16_t ud_itab__370[] = { /* 0 */ GROUP(371), 0, 0, 0, }; static const uint16_t ud_itab__369[] = { /* 0 */ GROUP(370), 0, 0, 0, /* 4 */ 0, 0, 0, 0, }; static const uint16_t ud_itab__374[] = { /* 0 */ 0, 442, }; static const uint16_t ud_itab__373[] = { /* 0 */ GROUP(374), 0, 0, 0, }; static const uint16_t ud_itab__372[] = { /* 0 */ GROUP(373), 0, 0, 0, /* 4 */ 0, 0, 0, 0, }; static const uint16_t ud_itab__365[] = { /* 0 */ GROUP(366), GROUP(369), GROUP(372), 0, /* 4 */ 0, 0, 0, 0, }; static const uint16_t ud_itab__364[] = { /* 0 */ 0, GROUP(365), }; static const uint16_t ud_itab__379[] = { /* 0 */ 0, 443, }; static const uint16_t ud_itab__378[] = { /* 0 */ GROUP(379), 0, 0, 0, }; static const uint16_t ud_itab__377[] = { /* 0 */ GROUP(378), 0, 0, 0, /* 4 */ 0, 0, 0, 0, }; static const uint16_t ud_itab__382[] = { /* 0 */ 0, 444, }; static const uint16_t ud_itab__381[] = { /* 0 */ GROUP(382), 0, 0, 0, }; static const uint16_t ud_itab__380[] = { /* 0 */ GROUP(381), 0, 0, 0, /* 4 */ 0, 0, 0, 0, }; static const uint16_t ud_itab__385[] = { /* 0 */ 0, 445, }; static const uint16_t ud_itab__384[] = { /* 0 */ GROUP(385), 0, 0, 0, }; static const uint16_t ud_itab__383[] = { /* 0 */ GROUP(384), 0, 0, 0, /* 4 */ 0, 0, 0, 0, }; static const uint16_t ud_itab__388[] = { /* 0 */ 0, 446, }; static const uint16_t ud_itab__387[] = { /* 0 */ GROUP(388), 0, 0, 0, }; static const uint16_t ud_itab__386[] = { /* 0 */ GROUP(387), 0, 0, 0, /* 4 */ 0, 0, 0, 0, }; static const uint16_t ud_itab__391[] = { /* 0 */ 0, 447, }; static const uint16_t ud_itab__390[] = { /* 0 */ GROUP(391), 0, 0, 0, }; static const uint16_t ud_itab__389[] = { /* 0 */ GROUP(390), 0, 0, 0, /* 4 */ 0, 0, 0, 0, }; static const uint16_t ud_itab__394[] = { /* 0 */ 0, 448, }; static const uint16_t ud_itab__393[] = { /* 0 */ GROUP(394), 0, 0, 0, }; static const uint16_t ud_itab__392[] = { /* 0 */ GROUP(393), 0, 0, 0, /* 4 */ 0, 0, 0, 0, }; static const uint16_t ud_itab__376[] = { /* 0 */ GROUP(377), GROUP(380), GROUP(383), GROUP(386), /* 4 */ GROUP(389), GROUP(392), 0, 0, }; static const uint16_t ud_itab__375[] = { /* 0 */ 0, GROUP(376), }; static const uint16_t ud_itab__395[] = { /* 0 */ 449, 0, 0, 0, }; static const uint16_t ud_itab__396[] = { /* 0 */ 450, 0, 0, 0, }; static const uint16_t ud_itab__397[] = { /* 0 */ 451, 0, 0, 0, }; static const uint16_t ud_itab__398[] = { /* 0 */ 452, 0, 0, 0, }; static const uint16_t ud_itab__399[] = { /* 0 */ 453, 0, 0, 0, }; static const uint16_t ud_itab__400[] = { /* 0 */ 454, 0, 0, 0, }; static const uint16_t ud_itab__404[] = { /* 0 */ 455, 0, }; static const uint16_t ud_itab__403[] = { /* 0 */ GROUP(404), 0, 0, 0, }; static const uint16_t ud_itab__406[] = { /* 0 */ 456, 0, }; static const uint16_t ud_itab__405[] = { /* 0 */ GROUP(406), 0, 0, 0, }; static const uint16_t ud_itab__408[] = { /* 0 */ 457, 0, }; static const uint16_t ud_itab__407[] = { /* 0 */ GROUP(408), 0, 0, 0, }; static const uint16_t ud_itab__410[] = { /* 0 */ 458, 0, }; static const uint16_t ud_itab__409[] = { /* 0 */ GROUP(410), 0, 0, 0, }; static const uint16_t ud_itab__412[] = { /* 0 */ 459, 0, }; static const uint16_t ud_itab__411[] = { /* 0 */ GROUP(412), 0, 0, 0, }; static const uint16_t ud_itab__414[] = { /* 0 */ 460, 0, }; static const uint16_t ud_itab__413[] = { /* 0 */ GROUP(414), 0, 0, 0, }; static const uint16_t ud_itab__416[] = { /* 0 */ 461, 0, }; static const uint16_t ud_itab__415[] = { /* 0 */ GROUP(416), 0, 0, 0, }; static const uint16_t ud_itab__402[] = { /* 0 */ GROUP(403), GROUP(405), GROUP(407), GROUP(409), /* 4 */ GROUP(411), GROUP(413), 0, GROUP(415), }; static const uint16_t ud_itab__420[] = { /* 0 */ 0, 462, }; static const uint16_t ud_itab__419[] = { /* 0 */ GROUP(420), 0, 0, 0, }; static const uint16_t ud_itab__422[] = { /* 0 */ 0, 463, }; static const uint16_t ud_itab__421[] = { /* 0 */ GROUP(422), 0, 0, 0, }; static const uint16_t ud_itab__424[] = { /* 0 */ 0, 464, }; static const uint16_t ud_itab__423[] = { /* 0 */ GROUP(424), 0, 0, 0, }; static const uint16_t ud_itab__426[] = { /* 0 */ 0, 465, }; static const uint16_t ud_itab__425[] = { /* 0 */ GROUP(426), 0, 0, 0, }; static const uint16_t ud_itab__428[] = { /* 0 */ 0, 466, }; static const uint16_t ud_itab__427[] = { /* 0 */ GROUP(428), 0, 0, 0, }; static const uint16_t ud_itab__430[] = { /* 0 */ 0, 467, }; static const uint16_t ud_itab__429[] = { /* 0 */ GROUP(430), 0, 0, 0, }; static const uint16_t ud_itab__432[] = { /* 0 */ 0, 468, }; static const uint16_t ud_itab__431[] = { /* 0 */ GROUP(432), 0, 0, 0, }; static const uint16_t ud_itab__434[] = { /* 0 */ 0, 469, }; static const uint16_t ud_itab__433[] = { /* 0 */ GROUP(434), 0, 0, 0, }; static const uint16_t ud_itab__418[] = { /* 0 */ GROUP(419), GROUP(421), GROUP(423), GROUP(425), /* 4 */ GROUP(427), GROUP(429), GROUP(431), GROUP(433), }; static const uint16_t ud_itab__437[] = { /* 0 */ 0, 470, }; static const uint16_t ud_itab__436[] = { /* 0 */ GROUP(437), 0, 0, 0, }; static const uint16_t ud_itab__439[] = { /* 0 */ 0, 471, }; static const uint16_t ud_itab__438[] = { /* 0 */ GROUP(439), 0, 0, 0, }; static const uint16_t ud_itab__441[] = { /* 0 */ 0, 472, }; static const uint16_t ud_itab__440[] = { /* 0 */ GROUP(441), 0, 0, 0, }; static const uint16_t ud_itab__443[] = { /* 0 */ 0, 473, }; static const uint16_t ud_itab__442[] = { /* 0 */ GROUP(443), 0, 0, 0, }; static const uint16_t ud_itab__445[] = { /* 0 */ 0, 474, }; static const uint16_t ud_itab__444[] = { /* 0 */ GROUP(445), 0, 0, 0, }; static const uint16_t ud_itab__447[] = { /* 0 */ 0, 475, }; static const uint16_t ud_itab__446[] = { /* 0 */ GROUP(447), 0, 0, 0, }; static const uint16_t ud_itab__449[] = { /* 0 */ 0, 476, }; static const uint16_t ud_itab__448[] = { /* 0 */ GROUP(449), 0, 0, 0, }; static const uint16_t ud_itab__451[] = { /* 0 */ 0, 477, }; static const uint16_t ud_itab__450[] = { /* 0 */ GROUP(451), 0, 0, 0, }; static const uint16_t ud_itab__435[] = { /* 0 */ GROUP(436), GROUP(438), GROUP(440), GROUP(442), /* 4 */ GROUP(444), GROUP(446), GROUP(448), GROUP(450), }; static const uint16_t ud_itab__454[] = { /* 0 */ 0, 478, }; static const uint16_t ud_itab__453[] = { /* 0 */ GROUP(454), 0, 0, 0, }; static const uint16_t ud_itab__456[] = { /* 0 */ 0, 479, }; static const uint16_t ud_itab__455[] = { /* 0 */ GROUP(456), 0, 0, 0, }; static const uint16_t ud_itab__458[] = { /* 0 */ 0, 480, }; static const uint16_t ud_itab__457[] = { /* 0 */ GROUP(458), 0, 0, 0, }; static const uint16_t ud_itab__460[] = { /* 0 */ 0, 481, }; static const uint16_t ud_itab__459[] = { /* 0 */ GROUP(460), 0, 0, 0, }; static const uint16_t ud_itab__462[] = { /* 0 */ 0, 482, }; static const uint16_t ud_itab__461[] = { /* 0 */ GROUP(462), 0, 0, 0, }; static const uint16_t ud_itab__464[] = { /* 0 */ 0, 483, }; static const uint16_t ud_itab__463[] = { /* 0 */ GROUP(464), 0, 0, 0, }; static const uint16_t ud_itab__466[] = { /* 0 */ 0, 484, }; static const uint16_t ud_itab__465[] = { /* 0 */ GROUP(466), 0, 0, 0, }; static const uint16_t ud_itab__468[] = { /* 0 */ 0, 485, }; static const uint16_t ud_itab__467[] = { /* 0 */ GROUP(468), 0, 0, 0, }; static const uint16_t ud_itab__452[] = { /* 0 */ GROUP(453), GROUP(455), GROUP(457), GROUP(459), /* 4 */ GROUP(461), GROUP(463), GROUP(465), GROUP(467), }; static const uint16_t ud_itab__417[] = { /* 0 */ 0, 0, 0, 0, /* 4 */ 0, GROUP(418), GROUP(435), GROUP(452), }; static const uint16_t ud_itab__401[] = { /* 0 */ GROUP(402), GROUP(417), }; static const uint16_t ud_itab__469[] = { /* 0 */ 486, 0, 0, 0, }; static const uint16_t ud_itab__470[] = { /* 0 */ 487, 0, 0, 0, }; static const uint16_t ud_itab__471[] = { /* 0 */ 488, 0, 0, 0, }; static const uint16_t ud_itab__472[] = { /* 0 */ 489, 0, 0, 0, }; static const uint16_t ud_itab__473[] = { /* 0 */ 490, 0, 0, 0, }; static const uint16_t ud_itab__474[] = { /* 0 */ 491, 0, 0, 0, }; static const uint16_t ud_itab__475[] = { /* 0 */ 492, 0, 0, 0, }; static const uint16_t ud_itab__476[] = { /* 0 */ 493, 0, 0, 0, }; static const uint16_t ud_itab__477[] = { /* 0 */ 494, 0, 0, 0, }; static const uint16_t ud_itab__478[] = { /* 0 */ 0, 0, 495, 0, }; static const uint16_t ud_itab__480[] = { /* 0 */ 496, 0, 0, 0, }; static const uint16_t ud_itab__481[] = { /* 0 */ 497, 0, 0, 0, }; static const uint16_t ud_itab__482[] = { /* 0 */ 498, 0, 0, 0, }; static const uint16_t ud_itab__483[] = { /* 0 */ 499, 0, 0, 0, }; static const uint16_t ud_itab__479[] = { /* 0 */ 0, 0, 0, 0, /* 4 */ GROUP(480), GROUP(481), GROUP(482), GROUP(483), }; static const uint16_t ud_itab__484[] = { /* 0 */ 500, 0, 0, 0, }; static const uint16_t ud_itab__485[] = { /* 0 */ 501, 0, 0, 0, }; static const uint16_t ud_itab__486[] = { /* 0 */ 502, 0, 0, 0, }; static const uint16_t ud_itab__487[] = { /* 0 */ 503, 0, 0, 0, }; static const uint16_t ud_itab__488[] = { /* 0 */ 504, 0, 0, 0, }; static const uint16_t ud_itab__489[] = { /* 0 */ 505, 0, 0, 0, }; static const uint16_t ud_itab__490[] = { /* 0 */ 506, 0, 0, 0, }; static const uint16_t ud_itab__491[] = { /* 0 */ 507, 508, 509, 510, }; static const uint16_t ud_itab__492[] = { /* 0 */ 511, 0, 0, 0, }; static const uint16_t ud_itab__493[] = { /* 0 */ 512, 0, 0, 513, }; static const uint16_t ud_itab__494[] = { /* 0 */ 514, 0, 0, 515, }; static const uint16_t ud_itab__495[] = { /* 0 */ 516, 0, 0, 517, }; static const uint16_t ud_itab__498[] = { /* 0 */ 518, 519, 520, }; static const uint16_t ud_itab__497[] = { /* 0 */ GROUP(498), 0, 0, 0, }; static const uint16_t ud_itab__500[] = { /* 0 */ 0, 521, 0, }; static const uint16_t ud_itab__501[] = { /* 0 */ 0, 522, 0, }; static const uint16_t ud_itab__502[] = { /* 0 */ 0, 523, 0, }; static const uint16_t ud_itab__499[] = { /* 0 */ GROUP(500), 0, GROUP(501), GROUP(502), }; static const uint16_t ud_itab__504[] = { /* 0 */ 0, 524, 0, }; static const uint16_t ud_itab__503[] = { /* 0 */ GROUP(504), 0, 0, 0, }; static const uint16_t ud_itab__496[] = { /* 0 */ 0, GROUP(497), 0, 0, /* 4 */ 0, 0, GROUP(499), GROUP(503), }; static const uint16_t ud_itab__505[] = { /* 0 */ 525, 0, 0, 0, }; static const uint16_t ud_itab__506[] = { /* 0 */ 526, 0, 0, 0, }; static const uint16_t ud_itab__507[] = { /* 0 */ 527, 0, 0, 0, }; static const uint16_t ud_itab__508[] = { /* 0 */ 528, 0, 0, 0, }; static const uint16_t ud_itab__509[] = { /* 0 */ 529, 0, 0, 0, }; static const uint16_t ud_itab__510[] = { /* 0 */ 530, 0, 0, 0, }; static const uint16_t ud_itab__511[] = { /* 0 */ 531, 0, 0, 0, }; static const uint16_t ud_itab__512[] = { /* 0 */ 532, 0, 0, 0, }; static const uint16_t ud_itab__513[] = { /* 0 */ 0, 533, 0, 534, }; static const uint16_t ud_itab__514[] = { /* 0 */ 535, 0, 0, 536, }; static const uint16_t ud_itab__515[] = { /* 0 */ 537, 0, 0, 538, }; static const uint16_t ud_itab__516[] = { /* 0 */ 539, 0, 0, 540, }; static const uint16_t ud_itab__517[] = { /* 0 */ 541, 0, 0, 542, }; static const uint16_t ud_itab__518[] = { /* 0 */ 543, 0, 0, 544, }; static const uint16_t ud_itab__519[] = { /* 0 */ 0, 545, 546, 547, }; static const uint16_t ud_itab__520[] = { /* 0 */ 548, 0, 0, 549, }; static const uint16_t ud_itab__521[] = { /* 0 */ 550, 0, 0, 551, }; static const uint16_t ud_itab__522[] = { /* 0 */ 552, 0, 0, 553, }; static const uint16_t ud_itab__523[] = { /* 0 */ 554, 0, 0, 555, }; static const uint16_t ud_itab__524[] = { /* 0 */ 556, 0, 0, 557, }; static const uint16_t ud_itab__525[] = { /* 0 */ 558, 0, 0, 559, }; static const uint16_t ud_itab__526[] = { /* 0 */ 560, 0, 0, 561, }; static const uint16_t ud_itab__527[] = { /* 0 */ 562, 0, 0, 563, }; static const uint16_t ud_itab__528[] = { /* 0 */ 564, 0, 0, 565, }; static const uint16_t ud_itab__529[] = { /* 0 */ 566, 0, 0, 567, }; static const uint16_t ud_itab__530[] = { /* 0 */ 568, 0, 0, 569, }; static const uint16_t ud_itab__531[] = { /* 0 */ 570, 0, 0, 571, }; static const uint16_t ud_itab__532[] = { /* 0 */ 572, 0, 0, 573, }; static const uint16_t ud_itab__533[] = { /* 0 */ 574, 0, 0, 575, }; static const uint16_t ud_itab__534[] = { /* 0 */ 576, 0, 0, 577, }; static const uint16_t ud_itab__535[] = { /* 0 */ 0, 578, 579, 580, }; static const uint16_t ud_itab__536[] = { /* 0 */ 581, 0, 0, 582, }; static const uint16_t ud_itab__537[] = { /* 0 */ 583, 0, 0, 584, }; static const uint16_t ud_itab__538[] = { /* 0 */ 585, 0, 0, 586, }; static const uint16_t ud_itab__539[] = { /* 0 */ 587, 0, 0, 588, }; static const uint16_t ud_itab__540[] = { /* 0 */ 589, 0, 0, 590, }; static const uint16_t ud_itab__541[] = { /* 0 */ 591, 0, 0, 592, }; static const uint16_t ud_itab__542[] = { /* 0 */ 593, 0, 0, 594, }; static const uint16_t ud_itab__543[] = { /* 0 */ 595, 0, 0, 596, }; static const uint16_t ud_itab__544[] = { /* 0 */ 597, 0, 0, 598, }; static const uint16_t ud_itab__545[] = { /* 0 */ 0, 599, 0, 0, }; static const uint16_t ud_itab__546[] = { /* 0 */ 600, 0, 0, 601, }; static const uint16_t ud_itab__547[] = { /* 0 */ 602, 0, 0, 603, }; static const uint16_t ud_itab__548[] = { /* 0 */ 604, 0, 0, 605, }; static const uint16_t ud_itab__549[] = { /* 0 */ 606, 0, 0, 607, }; static const uint16_t ud_itab__550[] = { /* 0 */ 608, 0, 0, 609, }; static const uint16_t ud_itab__551[] = { /* 0 */ 610, 0, 0, 611, }; static const uint16_t ud_itab__554[] = { /* 0 */ 0, 612, }; static const uint16_t ud_itab__555[] = { /* 0 */ 0, 613, }; static const uint16_t ud_itab__553[] = { /* 0 */ GROUP(554), 0, 0, GROUP(555), }; static const uint16_t ud_itab__552[] = { /* 0 */ 0, GROUP(553), }; static const uint16_t ud_itab__556[] = { /* 0 */ 614, 0, 0, 615, }; static const uint16_t ud_itab__557[] = { /* 0 */ 616, 0, 0, 617, }; static const uint16_t ud_itab__558[] = { /* 0 */ 618, 0, 0, 619, }; static const uint16_t ud_itab__559[] = { /* 0 */ 620, 0, 0, 621, }; static const uint16_t ud_itab__560[] = { /* 0 */ 622, 0, 0, 623, }; static const uint16_t ud_itab__561[] = { /* 0 */ 624, 0, 0, 625, }; static const uint16_t ud_itab__562[] = { /* 0 */ 626, 0, 0, 627, }; static const uint16_t ud_itab__4[] = { /* 0 */ GROUP(5), GROUP(12), GROUP(87), GROUP(88), /* 4 */ 0, GROUP(89), GROUP(90), GROUP(91), /* 8 */ GROUP(92), GROUP(93), 0, GROUP(94), /* c */ 0, GROUP(95), GROUP(104), GROUP(105), /* 10 */ GROUP(106), GROUP(107), GROUP(108), GROUP(118), /* 14 */ GROUP(119), GROUP(120), GROUP(121), GROUP(129), /* 18 */ GROUP(130), GROUP(135), GROUP(136), GROUP(137), /* 1c */ GROUP(138), GROUP(139), GROUP(140), GROUP(141), /* 20 */ GROUP(142), GROUP(143), GROUP(144), GROUP(145), /* 24 */ 0, 0, 0, 0, /* 28 */ GROUP(146), GROUP(147), GROUP(148), GROUP(149), /* 2c */ GROUP(150), GROUP(151), GROUP(152), GROUP(153), /* 30 */ GROUP(154), GROUP(155), GROUP(156), GROUP(157), /* 34 */ GROUP(158), GROUP(161), 0, GROUP(164), /* 38 */ GROUP(165), 0, GROUP(225), 0, /* 3c */ 0, 0, 0, 0, /* 40 */ GROUP(252), GROUP(253), GROUP(254), GROUP(255), /* 44 */ GROUP(256), GROUP(257), GROUP(258), GROUP(259), /* 48 */ GROUP(260), GROUP(261), GROUP(262), GROUP(263), /* 4c */ GROUP(264), GROUP(265), GROUP(266), GROUP(267), /* 50 */ GROUP(268), GROUP(269), GROUP(270), GROUP(271), /* 54 */ GROUP(272), GROUP(273), GROUP(274), GROUP(275), /* 58 */ GROUP(276), GROUP(277), GROUP(278), GROUP(279), /* 5c */ GROUP(280), GROUP(281), GROUP(282), GROUP(283), /* 60 */ GROUP(284), GROUP(285), GROUP(286), GROUP(287), /* 64 */ GROUP(288), GROUP(289), GROUP(290), GROUP(291), /* 68 */ GROUP(292), GROUP(293), GROUP(294), GROUP(295), /* 6c */ GROUP(296), GROUP(297), GROUP(298), GROUP(299), /* 70 */ GROUP(300), GROUP(301), GROUP(305), GROUP(309), /* 74 */ GROUP(314), GROUP(315), GROUP(316), GROUP(317), /* 78 */ GROUP(318), GROUP(320), 0, 0, /* 7c */ GROUP(322), GROUP(323), GROUP(324), GROUP(325), /* 80 */ GROUP(326), GROUP(327), GROUP(328), GROUP(329), /* 84 */ GROUP(330), GROUP(331), GROUP(332), GROUP(333), /* 88 */ GROUP(334), GROUP(335), GROUP(336), GROUP(337), /* 8c */ GROUP(338), GROUP(339), GROUP(340), GROUP(341), /* 90 */ GROUP(342), GROUP(343), GROUP(344), GROUP(345), /* 94 */ GROUP(346), GROUP(347), GROUP(348), GROUP(349), /* 98 */ GROUP(350), GROUP(351), GROUP(352), GROUP(353), /* 9c */ GROUP(354), GROUP(355), GROUP(356), GROUP(357), /* a0 */ GROUP(358), GROUP(359), GROUP(360), GROUP(361), /* a4 */ GROUP(362), GROUP(363), GROUP(364), GROUP(375), /* a8 */ GROUP(395), GROUP(396), GROUP(397), GROUP(398), /* ac */ GROUP(399), GROUP(400), GROUP(401), GROUP(469), /* b0 */ GROUP(470), GROUP(471), GROUP(472), GROUP(473), /* b4 */ GROUP(474), GROUP(475), GROUP(476), GROUP(477), /* b8 */ GROUP(478), 0, GROUP(479), GROUP(484), /* bc */ GROUP(485), GROUP(486), GROUP(487), GROUP(488), /* c0 */ GROUP(489), GROUP(490), GROUP(491), GROUP(492), /* c4 */ GROUP(493), GROUP(494), GROUP(495), GROUP(496), /* c8 */ GROUP(505), GROUP(506), GROUP(507), GROUP(508), /* cc */ GROUP(509), GROUP(510), GROUP(511), GROUP(512), /* d0 */ GROUP(513), GROUP(514), GROUP(515), GROUP(516), /* d4 */ GROUP(517), GROUP(518), GROUP(519), GROUP(520), /* d8 */ GROUP(521), GROUP(522), GROUP(523), GROUP(524), /* dc */ GROUP(525), GROUP(526), GROUP(527), GROUP(528), /* e0 */ GROUP(529), GROUP(530), GROUP(531), GROUP(532), /* e4 */ GROUP(533), GROUP(534), GROUP(535), GROUP(536), /* e8 */ GROUP(537), GROUP(538), GROUP(539), GROUP(540), /* ec */ GROUP(541), GROUP(542), GROUP(543), GROUP(544), /* f0 */ GROUP(545), GROUP(546), GROUP(547), GROUP(548), /* f4 */ GROUP(549), GROUP(550), GROUP(551), GROUP(552), /* f8 */ GROUP(556), GROUP(557), GROUP(558), GROUP(559), /* fc */ GROUP(560), GROUP(561), GROUP(562), 0, }; static const uint16_t ud_itab__563[] = { /* 0 */ 634, 0, }; static const uint16_t ud_itab__564[] = { /* 0 */ 635, 0, }; static const uint16_t ud_itab__565[] = { /* 0 */ 642, 0, }; static const uint16_t ud_itab__566[] = { /* 0 */ 643, 0, }; static const uint16_t ud_itab__567[] = { /* 0 */ 650, 0, }; static const uint16_t ud_itab__568[] = { /* 0 */ 657, 0, }; static const uint16_t ud_itab__569[] = { /* 0 */ 664, 0, }; static const uint16_t ud_itab__570[] = { /* 0 */ 671, 0, }; static const uint16_t ud_itab__572[] = { /* 0 */ 704, 0, }; static const uint16_t ud_itab__573[] = { /* 0 */ 705, 0, }; static const uint16_t ud_itab__571[] = { /* 0 */ GROUP(572), GROUP(573), 0, }; static const uint16_t ud_itab__575[] = { /* 0 */ 706, 0, }; static const uint16_t ud_itab__576[] = { /* 0 */ 707, 0, }; static const uint16_t ud_itab__574[] = { /* 0 */ GROUP(575), GROUP(576), 0, }; static const uint16_t ud_itab__577[] = { /* 0 */ 708, 0, }; static const uint16_t ud_itab__578[] = { /* 0 */ 709, 710, }; static const uint16_t ud_itab__579[] = { /* 0 */ 716, 717, 0, }; static const uint16_t ud_itab__580[] = { /* 0 */ 719, 720, 0, }; static const uint16_t ud_itab__581[] = { /* 0 */ 737, 738, 739, 740, /* 4 */ 741, 742, 743, 744, }; static const uint16_t ud_itab__582[] = { /* 0 */ 745, 746, 747, 748, /* 4 */ 749, 750, 751, 752, }; static const uint16_t ud_itab__584[] = { /* 0 */ 753, 0, }; static const uint16_t ud_itab__585[] = { /* 0 */ 754, 0, }; static const uint16_t ud_itab__586[] = { /* 0 */ 755, 0, }; static const uint16_t ud_itab__587[] = { /* 0 */ 756, 0, }; static const uint16_t ud_itab__588[] = { /* 0 */ 757, 0, }; static const uint16_t ud_itab__589[] = { /* 0 */ 758, 0, }; static const uint16_t ud_itab__590[] = { /* 0 */ 759, 0, }; static const uint16_t ud_itab__591[] = { /* 0 */ 760, 0, }; static const uint16_t ud_itab__583[] = { /* 0 */ GROUP(584), GROUP(585), GROUP(586), GROUP(587), /* 4 */ GROUP(588), GROUP(589), GROUP(590), GROUP(591), }; static const uint16_t ud_itab__592[] = { /* 0 */ 761, 762, 763, 764, /* 4 */ 765, 766, 767, 768, }; static const uint16_t ud_itab__593[] = { /* 0 */ 780, 0, 0, 0, /* 4 */ 0, 0, 0, 0, }; static const uint16_t ud_itab__594[] = { /* 0 */ 789, 790, 791, }; static const uint16_t ud_itab__595[] = { /* 0 */ 792, 793, 794, }; static const uint16_t ud_itab__596[] = { /* 0 */ 795, 0, }; static const uint16_t ud_itab__598[] = { /* 0 */ 797, 798, }; static const uint16_t ud_itab__599[] = { /* 0 */ 799, 800, }; static const uint16_t ud_itab__600[] = { /* 0 */ 0, 801, }; static const uint16_t ud_itab__597[] = { /* 0 */ GROUP(598), GROUP(599), GROUP(600), }; static const uint16_t ud_itab__602[] = { /* 0 */ 802, 0, }; static const uint16_t ud_itab__603[] = { /* 0 */ 803, 804, }; static const uint16_t ud_itab__604[] = { /* 0 */ 0, 805, }; static const uint16_t ud_itab__601[] = { /* 0 */ GROUP(602), GROUP(603), GROUP(604), }; static const uint16_t ud_itab__605[] = { /* 0 */ 813, 814, 815, }; static const uint16_t ud_itab__606[] = { /* 0 */ 817, 818, 819, }; static const uint16_t ud_itab__607[] = { /* 0 */ 823, 824, 825, }; static const uint16_t ud_itab__608[] = { /* 0 */ 827, 828, 829, }; static const uint16_t ud_itab__609[] = { /* 0 */ 831, 832, 833, }; static const uint16_t ud_itab__610[] = { /* 0 */ 850, 851, 852, 853, /* 4 */ 854, 855, 856, 857, }; static const uint16_t ud_itab__611[] = { /* 0 */ 858, 859, 860, 861, /* 4 */ 862, 863, 864, 865, }; static const uint16_t ud_itab__612[] = { /* 0 */ 868, 0, }; static const uint16_t ud_itab__613[] = { /* 0 */ 869, 0, }; static const uint16_t ud_itab__614[] = { /* 0 */ 870, 0, 0, 0, /* 4 */ 0, 0, 0, 0, }; static const uint16_t ud_itab__615[] = { /* 0 */ 871, 0, 0, 0, /* 4 */ 0, 0, 0, 0, }; static const uint16_t ud_itab__616[] = { /* 0 */ 878, 0, }; static const uint16_t ud_itab__617[] = { /* 0 */ 879, 880, 881, }; static const uint16_t ud_itab__618[] = { /* 0 */ 882, 883, 884, 885, /* 4 */ 886, 887, 888, 889, }; static const uint16_t ud_itab__619[] = { /* 0 */ 890, 891, 892, 893, /* 4 */ 894, 895, 896, 897, }; static const uint16_t ud_itab__620[] = { /* 0 */ 898, 899, 900, 901, /* 4 */ 902, 903, 904, 905, }; static const uint16_t ud_itab__621[] = { /* 0 */ 906, 907, 908, 909, /* 4 */ 910, 911, 912, 913, }; static const uint16_t ud_itab__622[] = { /* 0 */ 914, 0, }; static const uint16_t ud_itab__623[] = { /* 0 */ 915, 0, }; static const uint16_t ud_itab__624[] = { /* 0 */ 916, 0, }; static const uint16_t ud_itab__627[] = { /* 0 */ 918, 0, }; static const uint16_t ud_itab__628[] = { /* 0 */ 919, 0, }; static const uint16_t ud_itab__629[] = { /* 0 */ 920, 0, }; static const uint16_t ud_itab__630[] = { /* 0 */ 921, 0, }; static const uint16_t ud_itab__631[] = { /* 0 */ 922, 0, }; static const uint16_t ud_itab__632[] = { /* 0 */ 923, 0, }; static const uint16_t ud_itab__633[] = { /* 0 */ 924, 0, }; static const uint16_t ud_itab__634[] = { /* 0 */ 925, 0, }; static const uint16_t ud_itab__626[] = { /* 0 */ GROUP(627), GROUP(628), GROUP(629), GROUP(630), /* 4 */ GROUP(631), GROUP(632), GROUP(633), GROUP(634), }; static const uint16_t ud_itab__636[] = { /* 0 */ 0, 926, }; static const uint16_t ud_itab__637[] = { /* 0 */ 0, 927, }; static const uint16_t ud_itab__638[] = { /* 0 */ 0, 928, }; static const uint16_t ud_itab__639[] = { /* 0 */ 0, 929, }; static const uint16_t ud_itab__640[] = { /* 0 */ 0, 930, }; static const uint16_t ud_itab__641[] = { /* 0 */ 0, 931, }; static const uint16_t ud_itab__642[] = { /* 0 */ 0, 932, }; static const uint16_t ud_itab__643[] = { /* 0 */ 0, 933, }; static const uint16_t ud_itab__644[] = { /* 0 */ 0, 934, }; static const uint16_t ud_itab__645[] = { /* 0 */ 0, 935, }; static const uint16_t ud_itab__646[] = { /* 0 */ 0, 936, }; static const uint16_t ud_itab__647[] = { /* 0 */ 0, 937, }; static const uint16_t ud_itab__648[] = { /* 0 */ 0, 938, }; static const uint16_t ud_itab__649[] = { /* 0 */ 0, 939, }; static const uint16_t ud_itab__650[] = { /* 0 */ 0, 940, }; static const uint16_t ud_itab__651[] = { /* 0 */ 0, 941, }; static const uint16_t ud_itab__652[] = { /* 0 */ 0, 942, }; static const uint16_t ud_itab__653[] = { /* 0 */ 0, 943, }; static const uint16_t ud_itab__654[] = { /* 0 */ 0, 944, }; static const uint16_t ud_itab__655[] = { /* 0 */ 0, 945, }; static const uint16_t ud_itab__656[] = { /* 0 */ 0, 946, }; static const uint16_t ud_itab__657[] = { /* 0 */ 0, 947, }; static const uint16_t ud_itab__658[] = { /* 0 */ 0, 948, }; static const uint16_t ud_itab__659[] = { /* 0 */ 0, 949, }; static const uint16_t ud_itab__660[] = { /* 0 */ 0, 950, }; static const uint16_t ud_itab__661[] = { /* 0 */ 0, 951, }; static const uint16_t ud_itab__662[] = { /* 0 */ 0, 952, }; static const uint16_t ud_itab__663[] = { /* 0 */ 0, 953, }; static const uint16_t ud_itab__664[] = { /* 0 */ 0, 954, }; static const uint16_t ud_itab__665[] = { /* 0 */ 0, 955, }; static const uint16_t ud_itab__666[] = { /* 0 */ 0, 956, }; static const uint16_t ud_itab__667[] = { /* 0 */ 0, 957, }; static const uint16_t ud_itab__668[] = { /* 0 */ 0, 958, }; static const uint16_t ud_itab__669[] = { /* 0 */ 0, 959, }; static const uint16_t ud_itab__670[] = { /* 0 */ 0, 960, }; static const uint16_t ud_itab__671[] = { /* 0 */ 0, 961, }; static const uint16_t ud_itab__672[] = { /* 0 */ 0, 962, }; static const uint16_t ud_itab__673[] = { /* 0 */ 0, 963, }; static const uint16_t ud_itab__674[] = { /* 0 */ 0, 964, }; static const uint16_t ud_itab__675[] = { /* 0 */ 0, 965, }; static const uint16_t ud_itab__676[] = { /* 0 */ 0, 966, }; static const uint16_t ud_itab__677[] = { /* 0 */ 0, 967, }; static const uint16_t ud_itab__678[] = { /* 0 */ 0, 968, }; static const uint16_t ud_itab__679[] = { /* 0 */ 0, 969, }; static const uint16_t ud_itab__680[] = { /* 0 */ 0, 970, }; static const uint16_t ud_itab__681[] = { /* 0 */ 0, 971, }; static const uint16_t ud_itab__682[] = { /* 0 */ 0, 972, }; static const uint16_t ud_itab__683[] = { /* 0 */ 0, 973, }; static const uint16_t ud_itab__684[] = { /* 0 */ 0, 974, }; static const uint16_t ud_itab__685[] = { /* 0 */ 0, 975, }; static const uint16_t ud_itab__686[] = { /* 0 */ 0, 976, }; static const uint16_t ud_itab__687[] = { /* 0 */ 0, 977, }; static const uint16_t ud_itab__688[] = { /* 0 */ 0, 978, }; static const uint16_t ud_itab__689[] = { /* 0 */ 0, 979, }; static const uint16_t ud_itab__690[] = { /* 0 */ 0, 980, }; static const uint16_t ud_itab__691[] = { /* 0 */ 0, 981, }; static const uint16_t ud_itab__692[] = { /* 0 */ 0, 982, }; static const uint16_t ud_itab__693[] = { /* 0 */ 0, 983, }; static const uint16_t ud_itab__694[] = { /* 0 */ 0, 984, }; static const uint16_t ud_itab__695[] = { /* 0 */ 0, 985, }; static const uint16_t ud_itab__696[] = { /* 0 */ 0, 986, }; static const uint16_t ud_itab__697[] = { /* 0 */ 0, 987, }; static const uint16_t ud_itab__698[] = { /* 0 */ 0, 988, }; static const uint16_t ud_itab__699[] = { /* 0 */ 0, 989, }; static const uint16_t ud_itab__635[] = { /* 0 */ GROUP(636), GROUP(637), GROUP(638), GROUP(639), /* 4 */ GROUP(640), GROUP(641), GROUP(642), GROUP(643), /* 8 */ GROUP(644), GROUP(645), GROUP(646), GROUP(647), /* c */ GROUP(648), GROUP(649), GROUP(650), GROUP(651), /* 10 */ GROUP(652), GROUP(653), GROUP(654), GROUP(655), /* 14 */ GROUP(656), GROUP(657), GROUP(658), GROUP(659), /* 18 */ GROUP(660), GROUP(661), GROUP(662), GROUP(663), /* 1c */ GROUP(664), GROUP(665), GROUP(666), GROUP(667), /* 20 */ GROUP(668), GROUP(669), GROUP(670), GROUP(671), /* 24 */ GROUP(672), GROUP(673), GROUP(674), GROUP(675), /* 28 */ GROUP(676), GROUP(677), GROUP(678), GROUP(679), /* 2c */ GROUP(680), GROUP(681), GROUP(682), GROUP(683), /* 30 */ GROUP(684), GROUP(685), GROUP(686), GROUP(687), /* 34 */ GROUP(688), GROUP(689), GROUP(690), GROUP(691), /* 38 */ GROUP(692), GROUP(693), GROUP(694), GROUP(695), /* 3c */ GROUP(696), GROUP(697), GROUP(698), GROUP(699), }; static const uint16_t ud_itab__625[] = { /* 0 */ GROUP(626), GROUP(635), }; static const uint16_t ud_itab__702[] = { /* 0 */ 990, 0, }; static const uint16_t ud_itab__703[] = { /* 0 */ 991, 0, }; static const uint16_t ud_itab__704[] = { /* 0 */ 992, 0, }; static const uint16_t ud_itab__705[] = { /* 0 */ 993, 0, }; static const uint16_t ud_itab__706[] = { /* 0 */ 994, 0, }; static const uint16_t ud_itab__707[] = { /* 0 */ 995, 0, }; static const uint16_t ud_itab__708[] = { /* 0 */ 996, 0, }; static const uint16_t ud_itab__701[] = { /* 0 */ GROUP(702), 0, GROUP(703), GROUP(704), /* 4 */ GROUP(705), GROUP(706), GROUP(707), GROUP(708), }; static const uint16_t ud_itab__710[] = { /* 0 */ 0, 997, }; static const uint16_t ud_itab__711[] = { /* 0 */ 0, 998, }; static const uint16_t ud_itab__712[] = { /* 0 */ 0, 999, }; static const uint16_t ud_itab__713[] = { /* 0 */ 0, 1000, }; static const uint16_t ud_itab__714[] = { /* 0 */ 0, 1001, }; static const uint16_t ud_itab__715[] = { /* 0 */ 0, 1002, }; static const uint16_t ud_itab__716[] = { /* 0 */ 0, 1003, }; static const uint16_t ud_itab__717[] = { /* 0 */ 0, 1004, }; static const uint16_t ud_itab__718[] = { /* 0 */ 0, 1005, }; static const uint16_t ud_itab__719[] = { /* 0 */ 0, 1006, }; static const uint16_t ud_itab__720[] = { /* 0 */ 0, 1007, }; static const uint16_t ud_itab__721[] = { /* 0 */ 0, 1008, }; static const uint16_t ud_itab__722[] = { /* 0 */ 0, 1009, }; static const uint16_t ud_itab__723[] = { /* 0 */ 0, 1010, }; static const uint16_t ud_itab__724[] = { /* 0 */ 0, 1011, }; static const uint16_t ud_itab__725[] = { /* 0 */ 0, 1012, }; static const uint16_t ud_itab__726[] = { /* 0 */ 0, 1013, }; static const uint16_t ud_itab__727[] = { /* 0 */ 0, 1014, }; static const uint16_t ud_itab__728[] = { /* 0 */ 0, 1015, }; static const uint16_t ud_itab__729[] = { /* 0 */ 0, 1016, }; static const uint16_t ud_itab__730[] = { /* 0 */ 0, 1017, }; static const uint16_t ud_itab__731[] = { /* 0 */ 0, 1018, }; static const uint16_t ud_itab__732[] = { /* 0 */ 0, 1019, }; static const uint16_t ud_itab__733[] = { /* 0 */ 0, 1020, }; static const uint16_t ud_itab__734[] = { /* 0 */ 0, 1021, }; static const uint16_t ud_itab__735[] = { /* 0 */ 0, 1022, }; static const uint16_t ud_itab__736[] = { /* 0 */ 0, 1023, }; static const uint16_t ud_itab__737[] = { /* 0 */ 0, 1024, }; static const uint16_t ud_itab__738[] = { /* 0 */ 0, 1025, }; static const uint16_t ud_itab__739[] = { /* 0 */ 0, 1026, }; static const uint16_t ud_itab__740[] = { /* 0 */ 0, 1027, }; static const uint16_t ud_itab__741[] = { /* 0 */ 0, 1028, }; static const uint16_t ud_itab__742[] = { /* 0 */ 0, 1029, }; static const uint16_t ud_itab__743[] = { /* 0 */ 0, 1030, }; static const uint16_t ud_itab__744[] = { /* 0 */ 0, 1031, }; static const uint16_t ud_itab__745[] = { /* 0 */ 0, 1032, }; static const uint16_t ud_itab__746[] = { /* 0 */ 0, 1033, }; static const uint16_t ud_itab__747[] = { /* 0 */ 0, 1034, }; static const uint16_t ud_itab__748[] = { /* 0 */ 0, 1035, }; static const uint16_t ud_itab__749[] = { /* 0 */ 0, 1036, }; static const uint16_t ud_itab__750[] = { /* 0 */ 0, 1037, }; static const uint16_t ud_itab__751[] = { /* 0 */ 0, 1038, }; static const uint16_t ud_itab__752[] = { /* 0 */ 0, 1039, }; static const uint16_t ud_itab__753[] = { /* 0 */ 0, 1040, }; static const uint16_t ud_itab__754[] = { /* 0 */ 0, 1041, }; static const uint16_t ud_itab__755[] = { /* 0 */ 0, 1042, }; static const uint16_t ud_itab__756[] = { /* 0 */ 0, 1043, }; static const uint16_t ud_itab__757[] = { /* 0 */ 0, 1044, }; static const uint16_t ud_itab__758[] = { /* 0 */ 0, 1045, }; static const uint16_t ud_itab__759[] = { /* 0 */ 0, 1046, }; static const uint16_t ud_itab__760[] = { /* 0 */ 0, 1047, }; static const uint16_t ud_itab__761[] = { /* 0 */ 0, 1048, }; static const uint16_t ud_itab__709[] = { /* 0 */ GROUP(710), GROUP(711), GROUP(712), GROUP(713), /* 4 */ GROUP(714), GROUP(715), GROUP(716), GROUP(717), /* 8 */ GROUP(718), GROUP(719), GROUP(720), GROUP(721), /* c */ GROUP(722), GROUP(723), GROUP(724), GROUP(725), /* 10 */ GROUP(726), 0, 0, 0, /* 14 */ 0, 0, 0, 0, /* 18 */ GROUP(727), GROUP(728), GROUP(729), GROUP(730), /* 1c */ GROUP(731), GROUP(732), GROUP(733), GROUP(734), /* 20 */ GROUP(735), GROUP(736), 0, 0, /* 24 */ GROUP(737), GROUP(738), 0, 0, /* 28 */ GROUP(739), GROUP(740), GROUP(741), GROUP(742), /* 2c */ GROUP(743), GROUP(744), GROUP(745), 0, /* 30 */ GROUP(746), GROUP(747), GROUP(748), GROUP(749), /* 34 */ GROUP(750), GROUP(751), GROUP(752), GROUP(753), /* 38 */ GROUP(754), GROUP(755), GROUP(756), GROUP(757), /* 3c */ GROUP(758), GROUP(759), GROUP(760), GROUP(761), }; static const uint16_t ud_itab__700[] = { /* 0 */ GROUP(701), GROUP(709), }; static const uint16_t ud_itab__764[] = { /* 0 */ 1049, 0, }; static const uint16_t ud_itab__765[] = { /* 0 */ 1050, 0, }; static const uint16_t ud_itab__766[] = { /* 0 */ 1051, 0, }; static const uint16_t ud_itab__767[] = { /* 0 */ 1052, 0, }; static const uint16_t ud_itab__768[] = { /* 0 */ 1053, 0, }; static const uint16_t ud_itab__769[] = { /* 0 */ 1054, 0, }; static const uint16_t ud_itab__770[] = { /* 0 */ 1055, 0, }; static const uint16_t ud_itab__771[] = { /* 0 */ 1056, 0, }; static const uint16_t ud_itab__763[] = { /* 0 */ GROUP(764), GROUP(765), GROUP(766), GROUP(767), /* 4 */ GROUP(768), GROUP(769), GROUP(770), GROUP(771), }; static const uint16_t ud_itab__773[] = { /* 0 */ 0, 1057, }; static const uint16_t ud_itab__774[] = { /* 0 */ 0, 1058, }; static const uint16_t ud_itab__775[] = { /* 0 */ 0, 1059, }; static const uint16_t ud_itab__776[] = { /* 0 */ 0, 1060, }; static const uint16_t ud_itab__777[] = { /* 0 */ 0, 1061, }; static const uint16_t ud_itab__778[] = { /* 0 */ 0, 1062, }; static const uint16_t ud_itab__779[] = { /* 0 */ 0, 1063, }; static const uint16_t ud_itab__780[] = { /* 0 */ 0, 1064, }; static const uint16_t ud_itab__781[] = { /* 0 */ 0, 1065, }; static const uint16_t ud_itab__782[] = { /* 0 */ 0, 1066, }; static const uint16_t ud_itab__783[] = { /* 0 */ 0, 1067, }; static const uint16_t ud_itab__784[] = { /* 0 */ 0, 1068, }; static const uint16_t ud_itab__785[] = { /* 0 */ 0, 1069, }; static const uint16_t ud_itab__786[] = { /* 0 */ 0, 1070, }; static const uint16_t ud_itab__787[] = { /* 0 */ 0, 1071, }; static const uint16_t ud_itab__788[] = { /* 0 */ 0, 1072, }; static const uint16_t ud_itab__789[] = { /* 0 */ 0, 1073, }; static const uint16_t ud_itab__790[] = { /* 0 */ 0, 1074, }; static const uint16_t ud_itab__791[] = { /* 0 */ 0, 1075, }; static const uint16_t ud_itab__792[] = { /* 0 */ 0, 1076, }; static const uint16_t ud_itab__793[] = { /* 0 */ 0, 1077, }; static const uint16_t ud_itab__794[] = { /* 0 */ 0, 1078, }; static const uint16_t ud_itab__795[] = { /* 0 */ 0, 1079, }; static const uint16_t ud_itab__796[] = { /* 0 */ 0, 1080, }; static const uint16_t ud_itab__797[] = { /* 0 */ 0, 1081, }; static const uint16_t ud_itab__798[] = { /* 0 */ 0, 1082, }; static const uint16_t ud_itab__799[] = { /* 0 */ 0, 1083, }; static const uint16_t ud_itab__800[] = { /* 0 */ 0, 1084, }; static const uint16_t ud_itab__801[] = { /* 0 */ 0, 1085, }; static const uint16_t ud_itab__802[] = { /* 0 */ 0, 1086, }; static const uint16_t ud_itab__803[] = { /* 0 */ 0, 1087, }; static const uint16_t ud_itab__804[] = { /* 0 */ 0, 1088, }; static const uint16_t ud_itab__805[] = { /* 0 */ 0, 1089, }; static const uint16_t ud_itab__772[] = { /* 0 */ GROUP(773), GROUP(774), GROUP(775), GROUP(776), /* 4 */ GROUP(777), GROUP(778), GROUP(779), GROUP(780), /* 8 */ GROUP(781), GROUP(782), GROUP(783), GROUP(784), /* c */ GROUP(785), GROUP(786), GROUP(787), GROUP(788), /* 10 */ GROUP(789), GROUP(790), GROUP(791), GROUP(792), /* 14 */ GROUP(793), GROUP(794), GROUP(795), GROUP(796), /* 18 */ GROUP(797), GROUP(798), GROUP(799), GROUP(800), /* 1c */ GROUP(801), GROUP(802), GROUP(803), GROUP(804), /* 20 */ 0, 0, 0, 0, /* 24 */ 0, 0, 0, 0, /* 28 */ 0, GROUP(805), 0, 0, /* 2c */ 0, 0, 0, 0, /* 30 */ 0, 0, 0, 0, /* 34 */ 0, 0, 0, 0, /* 38 */ 0, 0, 0, 0, /* 3c */ 0, 0, 0, 0, }; static const uint16_t ud_itab__762[] = { /* 0 */ GROUP(763), GROUP(772), }; static const uint16_t ud_itab__808[] = { /* 0 */ 1090, 0, }; static const uint16_t ud_itab__809[] = { /* 0 */ 1091, 0, }; static const uint16_t ud_itab__810[] = { /* 0 */ 1092, 0, }; static const uint16_t ud_itab__811[] = { /* 0 */ 1093, 0, }; static const uint16_t ud_itab__812[] = { /* 0 */ 1094, 0, }; static const uint16_t ud_itab__813[] = { /* 0 */ 1095, 0, }; static const uint16_t ud_itab__807[] = { /* 0 */ GROUP(808), GROUP(809), GROUP(810), GROUP(811), /* 4 */ 0, GROUP(812), 0, GROUP(813), }; static const uint16_t ud_itab__815[] = { /* 0 */ 0, 1096, }; static const uint16_t ud_itab__816[] = { /* 0 */ 0, 1097, }; static const uint16_t ud_itab__817[] = { /* 0 */ 0, 1098, }; static const uint16_t ud_itab__818[] = { /* 0 */ 0, 1099, }; static const uint16_t ud_itab__819[] = { /* 0 */ 0, 1100, }; static const uint16_t ud_itab__820[] = { /* 0 */ 0, 1101, }; static const uint16_t ud_itab__821[] = { /* 0 */ 0, 1102, }; static const uint16_t ud_itab__822[] = { /* 0 */ 0, 1103, }; static const uint16_t ud_itab__823[] = { /* 0 */ 0, 1104, }; static const uint16_t ud_itab__824[] = { /* 0 */ 0, 1105, }; static const uint16_t ud_itab__825[] = { /* 0 */ 0, 1106, }; static const uint16_t ud_itab__826[] = { /* 0 */ 0, 1107, }; static const uint16_t ud_itab__827[] = { /* 0 */ 0, 1108, }; static const uint16_t ud_itab__828[] = { /* 0 */ 0, 1109, }; static const uint16_t ud_itab__829[] = { /* 0 */ 0, 1110, }; static const uint16_t ud_itab__830[] = { /* 0 */ 0, 1111, }; static const uint16_t ud_itab__831[] = { /* 0 */ 0, 1112, }; static const uint16_t ud_itab__832[] = { /* 0 */ 0, 1113, }; static const uint16_t ud_itab__833[] = { /* 0 */ 0, 1114, }; static const uint16_t ud_itab__834[] = { /* 0 */ 0, 1115, }; static const uint16_t ud_itab__835[] = { /* 0 */ 0, 1116, }; static const uint16_t ud_itab__836[] = { /* 0 */ 0, 1117, }; static const uint16_t ud_itab__837[] = { /* 0 */ 0, 1118, }; static const uint16_t ud_itab__838[] = { /* 0 */ 0, 1119, }; static const uint16_t ud_itab__839[] = { /* 0 */ 0, 1120, }; static const uint16_t ud_itab__840[] = { /* 0 */ 0, 1121, }; static const uint16_t ud_itab__841[] = { /* 0 */ 0, 1122, }; static const uint16_t ud_itab__842[] = { /* 0 */ 0, 1123, }; static const uint16_t ud_itab__843[] = { /* 0 */ 0, 1124, }; static const uint16_t ud_itab__844[] = { /* 0 */ 0, 1125, }; static const uint16_t ud_itab__845[] = { /* 0 */ 0, 1126, }; static const uint16_t ud_itab__846[] = { /* 0 */ 0, 1127, }; static const uint16_t ud_itab__847[] = { /* 0 */ 0, 1128, }; static const uint16_t ud_itab__848[] = { /* 0 */ 0, 1129, }; static const uint16_t ud_itab__849[] = { /* 0 */ 0, 1130, }; static const uint16_t ud_itab__850[] = { /* 0 */ 0, 1131, }; static const uint16_t ud_itab__851[] = { /* 0 */ 0, 1132, }; static const uint16_t ud_itab__852[] = { /* 0 */ 0, 1133, }; static const uint16_t ud_itab__853[] = { /* 0 */ 0, 1134, }; static const uint16_t ud_itab__854[] = { /* 0 */ 0, 1135, }; static const uint16_t ud_itab__855[] = { /* 0 */ 0, 1136, }; static const uint16_t ud_itab__856[] = { /* 0 */ 0, 1137, }; static const uint16_t ud_itab__857[] = { /* 0 */ 0, 1138, }; static const uint16_t ud_itab__858[] = { /* 0 */ 0, 1139, }; static const uint16_t ud_itab__859[] = { /* 0 */ 0, 1140, }; static const uint16_t ud_itab__860[] = { /* 0 */ 0, 1141, }; static const uint16_t ud_itab__861[] = { /* 0 */ 0, 1142, }; static const uint16_t ud_itab__862[] = { /* 0 */ 0, 1143, }; static const uint16_t ud_itab__863[] = { /* 0 */ 0, 1144, }; static const uint16_t ud_itab__864[] = { /* 0 */ 0, 1145, }; static const uint16_t ud_itab__814[] = { /* 0 */ GROUP(815), GROUP(816), GROUP(817), GROUP(818), /* 4 */ GROUP(819), GROUP(820), GROUP(821), GROUP(822), /* 8 */ GROUP(823), GROUP(824), GROUP(825), GROUP(826), /* c */ GROUP(827), GROUP(828), GROUP(829), GROUP(830), /* 10 */ GROUP(831), GROUP(832), GROUP(833), GROUP(834), /* 14 */ GROUP(835), GROUP(836), GROUP(837), GROUP(838), /* 18 */ GROUP(839), GROUP(840), GROUP(841), GROUP(842), /* 1c */ GROUP(843), GROUP(844), GROUP(845), GROUP(846), /* 20 */ 0, 0, GROUP(847), GROUP(848), /* 24 */ 0, 0, 0, 0, /* 28 */ GROUP(849), GROUP(850), GROUP(851), GROUP(852), /* 2c */ GROUP(853), GROUP(854), GROUP(855), GROUP(856), /* 30 */ GROUP(857), GROUP(858), GROUP(859), GROUP(860), /* 34 */ GROUP(861), GROUP(862), GROUP(863), GROUP(864), /* 38 */ 0, 0, 0, 0, /* 3c */ 0, 0, 0, 0, }; static const uint16_t ud_itab__806[] = { /* 0 */ GROUP(807), GROUP(814), }; static const uint16_t ud_itab__867[] = { /* 0 */ 1146, 0, }; static const uint16_t ud_itab__868[] = { /* 0 */ 1147, 0, }; static const uint16_t ud_itab__869[] = { /* 0 */ 1148, 0, }; static const uint16_t ud_itab__870[] = { /* 0 */ 1149, 0, }; static const uint16_t ud_itab__871[] = { /* 0 */ 1150, 0, }; static const uint16_t ud_itab__872[] = { /* 0 */ 1151, 0, }; static const uint16_t ud_itab__873[] = { /* 0 */ 1152, 0, }; static const uint16_t ud_itab__874[] = { /* 0 */ 1153, 0, }; static const uint16_t ud_itab__866[] = { /* 0 */ GROUP(867), GROUP(868), GROUP(869), GROUP(870), /* 4 */ GROUP(871), GROUP(872), GROUP(873), GROUP(874), }; static const uint16_t ud_itab__876[] = { /* 0 */ 0, 1154, }; static const uint16_t ud_itab__877[] = { /* 0 */ 0, 1155, }; static const uint16_t ud_itab__878[] = { /* 0 */ 0, 1156, }; static const uint16_t ud_itab__879[] = { /* 0 */ 0, 1157, }; static const uint16_t ud_itab__880[] = { /* 0 */ 0, 1158, }; static const uint16_t ud_itab__881[] = { /* 0 */ 0, 1159, }; static const uint16_t ud_itab__882[] = { /* 0 */ 0, 1160, }; static const uint16_t ud_itab__883[] = { /* 0 */ 0, 1161, }; static const uint16_t ud_itab__884[] = { /* 0 */ 0, 1162, }; static const uint16_t ud_itab__885[] = { /* 0 */ 0, 1163, }; static const uint16_t ud_itab__886[] = { /* 0 */ 0, 1164, }; static const uint16_t ud_itab__887[] = { /* 0 */ 0, 1165, }; static const uint16_t ud_itab__888[] = { /* 0 */ 0, 1166, }; static const uint16_t ud_itab__889[] = { /* 0 */ 0, 1167, }; static const uint16_t ud_itab__890[] = { /* 0 */ 0, 1168, }; static const uint16_t ud_itab__891[] = { /* 0 */ 0, 1169, }; static const uint16_t ud_itab__892[] = { /* 0 */ 0, 1170, }; static const uint16_t ud_itab__893[] = { /* 0 */ 0, 1171, }; static const uint16_t ud_itab__894[] = { /* 0 */ 0, 1172, }; static const uint16_t ud_itab__895[] = { /* 0 */ 0, 1173, }; static const uint16_t ud_itab__896[] = { /* 0 */ 0, 1174, }; static const uint16_t ud_itab__897[] = { /* 0 */ 0, 1175, }; static const uint16_t ud_itab__898[] = { /* 0 */ 0, 1176, }; static const uint16_t ud_itab__899[] = { /* 0 */ 0, 1177, }; static const uint16_t ud_itab__900[] = { /* 0 */ 0, 1178, }; static const uint16_t ud_itab__901[] = { /* 0 */ 0, 1179, }; static const uint16_t ud_itab__902[] = { /* 0 */ 0, 1180, }; static const uint16_t ud_itab__903[] = { /* 0 */ 0, 1181, }; static const uint16_t ud_itab__904[] = { /* 0 */ 0, 1182, }; static const uint16_t ud_itab__905[] = { /* 0 */ 0, 1183, }; static const uint16_t ud_itab__906[] = { /* 0 */ 0, 1184, }; static const uint16_t ud_itab__907[] = { /* 0 */ 0, 1185, }; static const uint16_t ud_itab__908[] = { /* 0 */ 0, 1186, }; static const uint16_t ud_itab__909[] = { /* 0 */ 0, 1187, }; static const uint16_t ud_itab__910[] = { /* 0 */ 0, 1188, }; static const uint16_t ud_itab__911[] = { /* 0 */ 0, 1189, }; static const uint16_t ud_itab__912[] = { /* 0 */ 0, 1190, }; static const uint16_t ud_itab__913[] = { /* 0 */ 0, 1191, }; static const uint16_t ud_itab__914[] = { /* 0 */ 0, 1192, }; static const uint16_t ud_itab__915[] = { /* 0 */ 0, 1193, }; static const uint16_t ud_itab__916[] = { /* 0 */ 0, 1194, }; static const uint16_t ud_itab__917[] = { /* 0 */ 0, 1195, }; static const uint16_t ud_itab__918[] = { /* 0 */ 0, 1196, }; static const uint16_t ud_itab__919[] = { /* 0 */ 0, 1197, }; static const uint16_t ud_itab__920[] = { /* 0 */ 0, 1198, }; static const uint16_t ud_itab__921[] = { /* 0 */ 0, 1199, }; static const uint16_t ud_itab__922[] = { /* 0 */ 0, 1200, }; static const uint16_t ud_itab__923[] = { /* 0 */ 0, 1201, }; static const uint16_t ud_itab__924[] = { /* 0 */ 0, 1202, }; static const uint16_t ud_itab__925[] = { /* 0 */ 0, 1203, }; static const uint16_t ud_itab__926[] = { /* 0 */ 0, 1204, }; static const uint16_t ud_itab__927[] = { /* 0 */ 0, 1205, }; static const uint16_t ud_itab__928[] = { /* 0 */ 0, 1206, }; static const uint16_t ud_itab__929[] = { /* 0 */ 0, 1207, }; static const uint16_t ud_itab__930[] = { /* 0 */ 0, 1208, }; static const uint16_t ud_itab__931[] = { /* 0 */ 0, 1209, }; static const uint16_t ud_itab__932[] = { /* 0 */ 0, 1210, }; static const uint16_t ud_itab__933[] = { /* 0 */ 0, 1211, }; static const uint16_t ud_itab__934[] = { /* 0 */ 0, 1212, }; static const uint16_t ud_itab__935[] = { /* 0 */ 0, 1213, }; static const uint16_t ud_itab__936[] = { /* 0 */ 0, 1214, }; static const uint16_t ud_itab__937[] = { /* 0 */ 0, 1215, }; static const uint16_t ud_itab__938[] = { /* 0 */ 0, 1216, }; static const uint16_t ud_itab__939[] = { /* 0 */ 0, 1217, }; static const uint16_t ud_itab__875[] = { /* 0 */ GROUP(876), GROUP(877), GROUP(878), GROUP(879), /* 4 */ GROUP(880), GROUP(881), GROUP(882), GROUP(883), /* 8 */ GROUP(884), GROUP(885), GROUP(886), GROUP(887), /* c */ GROUP(888), GROUP(889), GROUP(890), GROUP(891), /* 10 */ GROUP(892), GROUP(893), GROUP(894), GROUP(895), /* 14 */ GROUP(896), GROUP(897), GROUP(898), GROUP(899), /* 18 */ GROUP(900), GROUP(901), GROUP(902), GROUP(903), /* 1c */ GROUP(904), GROUP(905), GROUP(906), GROUP(907), /* 20 */ GROUP(908), GROUP(909), GROUP(910), GROUP(911), /* 24 */ GROUP(912), GROUP(913), GROUP(914), GROUP(915), /* 28 */ GROUP(916), GROUP(917), GROUP(918), GROUP(919), /* 2c */ GROUP(920), GROUP(921), GROUP(922), GROUP(923), /* 30 */ GROUP(924), GROUP(925), GROUP(926), GROUP(927), /* 34 */ GROUP(928), GROUP(929), GROUP(930), GROUP(931), /* 38 */ GROUP(932), GROUP(933), GROUP(934), GROUP(935), /* 3c */ GROUP(936), GROUP(937), GROUP(938), GROUP(939), }; static const uint16_t ud_itab__865[] = { /* 0 */ GROUP(866), GROUP(875), }; static const uint16_t ud_itab__942[] = { /* 0 */ 1218, 0, }; static const uint16_t ud_itab__943[] = { /* 0 */ 1219, 0, }; static const uint16_t ud_itab__944[] = { /* 0 */ 1220, 0, }; static const uint16_t ud_itab__945[] = { /* 0 */ 1221, 0, }; static const uint16_t ud_itab__946[] = { /* 0 */ 1222, 0, }; static const uint16_t ud_itab__947[] = { /* 0 */ 1223, 0, }; static const uint16_t ud_itab__948[] = { /* 0 */ 1224, 0, }; static const uint16_t ud_itab__941[] = { /* 0 */ GROUP(942), GROUP(943), GROUP(944), GROUP(945), /* 4 */ GROUP(946), 0, GROUP(947), GROUP(948), }; static const uint16_t ud_itab__950[] = { /* 0 */ 0, 1225, }; static const uint16_t ud_itab__951[] = { /* 0 */ 0, 1226, }; static const uint16_t ud_itab__952[] = { /* 0 */ 0, 1227, }; static const uint16_t ud_itab__953[] = { /* 0 */ 0, 1228, }; static const uint16_t ud_itab__954[] = { /* 0 */ 0, 1229, }; static const uint16_t ud_itab__955[] = { /* 0 */ 0, 1230, }; static const uint16_t ud_itab__956[] = { /* 0 */ 0, 1231, }; static const uint16_t ud_itab__957[] = { /* 0 */ 0, 1232, }; static const uint16_t ud_itab__958[] = { /* 0 */ 0, 1233, }; static const uint16_t ud_itab__959[] = { /* 0 */ 0, 1234, }; static const uint16_t ud_itab__960[] = { /* 0 */ 0, 1235, }; static const uint16_t ud_itab__961[] = { /* 0 */ 0, 1236, }; static const uint16_t ud_itab__962[] = { /* 0 */ 0, 1237, }; static const uint16_t ud_itab__963[] = { /* 0 */ 0, 1238, }; static const uint16_t ud_itab__964[] = { /* 0 */ 0, 1239, }; static const uint16_t ud_itab__965[] = { /* 0 */ 0, 1240, }; static const uint16_t ud_itab__966[] = { /* 0 */ 0, 1241, }; static const uint16_t ud_itab__967[] = { /* 0 */ 0, 1242, }; static const uint16_t ud_itab__968[] = { /* 0 */ 0, 1243, }; static const uint16_t ud_itab__969[] = { /* 0 */ 0, 1244, }; static const uint16_t ud_itab__970[] = { /* 0 */ 0, 1245, }; static const uint16_t ud_itab__971[] = { /* 0 */ 0, 1246, }; static const uint16_t ud_itab__972[] = { /* 0 */ 0, 1247, }; static const uint16_t ud_itab__973[] = { /* 0 */ 0, 1248, }; static const uint16_t ud_itab__974[] = { /* 0 */ 0, 1249, }; static const uint16_t ud_itab__975[] = { /* 0 */ 0, 1250, }; static const uint16_t ud_itab__976[] = { /* 0 */ 0, 1251, }; static const uint16_t ud_itab__977[] = { /* 0 */ 0, 1252, }; static const uint16_t ud_itab__978[] = { /* 0 */ 0, 1253, }; static const uint16_t ud_itab__979[] = { /* 0 */ 0, 1254, }; static const uint16_t ud_itab__980[] = { /* 0 */ 0, 1255, }; static const uint16_t ud_itab__981[] = { /* 0 */ 0, 1256, }; static const uint16_t ud_itab__982[] = { /* 0 */ 0, 1257, }; static const uint16_t ud_itab__983[] = { /* 0 */ 0, 1258, }; static const uint16_t ud_itab__984[] = { /* 0 */ 0, 1259, }; static const uint16_t ud_itab__985[] = { /* 0 */ 0, 1260, }; static const uint16_t ud_itab__986[] = { /* 0 */ 0, 1261, }; static const uint16_t ud_itab__987[] = { /* 0 */ 0, 1262, }; static const uint16_t ud_itab__988[] = { /* 0 */ 0, 1263, }; static const uint16_t ud_itab__989[] = { /* 0 */ 0, 1264, }; static const uint16_t ud_itab__990[] = { /* 0 */ 0, 1265, }; static const uint16_t ud_itab__991[] = { /* 0 */ 0, 1266, }; static const uint16_t ud_itab__992[] = { /* 0 */ 0, 1267, }; static const uint16_t ud_itab__993[] = { /* 0 */ 0, 1268, }; static const uint16_t ud_itab__994[] = { /* 0 */ 0, 1269, }; static const uint16_t ud_itab__995[] = { /* 0 */ 0, 1270, }; static const uint16_t ud_itab__996[] = { /* 0 */ 0, 1271, }; static const uint16_t ud_itab__997[] = { /* 0 */ 0, 1272, }; static const uint16_t ud_itab__949[] = { /* 0 */ GROUP(950), GROUP(951), GROUP(952), GROUP(953), /* 4 */ GROUP(954), GROUP(955), GROUP(956), GROUP(957), /* 8 */ GROUP(958), GROUP(959), GROUP(960), GROUP(961), /* c */ GROUP(962), GROUP(963), GROUP(964), GROUP(965), /* 10 */ GROUP(966), GROUP(967), GROUP(968), GROUP(969), /* 14 */ GROUP(970), GROUP(971), GROUP(972), GROUP(973), /* 18 */ GROUP(974), GROUP(975), GROUP(976), GROUP(977), /* 1c */ GROUP(978), GROUP(979), GROUP(980), GROUP(981), /* 20 */ GROUP(982), GROUP(983), GROUP(984), GROUP(985), /* 24 */ GROUP(986), GROUP(987), GROUP(988), GROUP(989), /* 28 */ GROUP(990), GROUP(991), GROUP(992), GROUP(993), /* 2c */ GROUP(994), GROUP(995), GROUP(996), GROUP(997), /* 30 */ 0, 0, 0, 0, /* 34 */ 0, 0, 0, 0, /* 38 */ 0, 0, 0, 0, /* 3c */ 0, 0, 0, 0, }; static const uint16_t ud_itab__940[] = { /* 0 */ GROUP(941), GROUP(949), }; static const uint16_t ud_itab__1000[] = { /* 0 */ 1273, 0, }; static const uint16_t ud_itab__1001[] = { /* 0 */ 1274, 0, }; static const uint16_t ud_itab__1002[] = { /* 0 */ 1275, 0, }; static const uint16_t ud_itab__1003[] = { /* 0 */ 1276, 0, }; static const uint16_t ud_itab__1004[] = { /* 0 */ 1277, 0, }; static const uint16_t ud_itab__1005[] = { /* 0 */ 1278, 0, }; static const uint16_t ud_itab__1006[] = { /* 0 */ 1279, 0, }; static const uint16_t ud_itab__1007[] = { /* 0 */ 1280, 0, }; static const uint16_t ud_itab__999[] = { /* 0 */ GROUP(1000), GROUP(1001), GROUP(1002), GROUP(1003), /* 4 */ GROUP(1004), GROUP(1005), GROUP(1006), GROUP(1007), }; static const uint16_t ud_itab__1009[] = { /* 0 */ 0, 1281, }; static const uint16_t ud_itab__1010[] = { /* 0 */ 0, 1282, }; static const uint16_t ud_itab__1011[] = { /* 0 */ 0, 1283, }; static const uint16_t ud_itab__1012[] = { /* 0 */ 0, 1284, }; static const uint16_t ud_itab__1013[] = { /* 0 */ 0, 1285, }; static const uint16_t ud_itab__1014[] = { /* 0 */ 0, 1286, }; static const uint16_t ud_itab__1015[] = { /* 0 */ 0, 1287, }; static const uint16_t ud_itab__1016[] = { /* 0 */ 0, 1288, }; static const uint16_t ud_itab__1017[] = { /* 0 */ 0, 1289, }; static const uint16_t ud_itab__1018[] = { /* 0 */ 0, 1290, }; static const uint16_t ud_itab__1019[] = { /* 0 */ 0, 1291, }; static const uint16_t ud_itab__1020[] = { /* 0 */ 0, 1292, }; static const uint16_t ud_itab__1021[] = { /* 0 */ 0, 1293, }; static const uint16_t ud_itab__1022[] = { /* 0 */ 0, 1294, }; static const uint16_t ud_itab__1023[] = { /* 0 */ 0, 1295, }; static const uint16_t ud_itab__1024[] = { /* 0 */ 0, 1296, }; static const uint16_t ud_itab__1025[] = { /* 0 */ 0, 1297, }; static const uint16_t ud_itab__1026[] = { /* 0 */ 0, 1298, }; static const uint16_t ud_itab__1027[] = { /* 0 */ 0, 1299, }; static const uint16_t ud_itab__1028[] = { /* 0 */ 0, 1300, }; static const uint16_t ud_itab__1029[] = { /* 0 */ 0, 1301, }; static const uint16_t ud_itab__1030[] = { /* 0 */ 0, 1302, }; static const uint16_t ud_itab__1031[] = { /* 0 */ 0, 1303, }; static const uint16_t ud_itab__1032[] = { /* 0 */ 0, 1304, }; static const uint16_t ud_itab__1033[] = { /* 0 */ 0, 1305, }; static const uint16_t ud_itab__1034[] = { /* 0 */ 0, 1306, }; static const uint16_t ud_itab__1035[] = { /* 0 */ 0, 1307, }; static const uint16_t ud_itab__1036[] = { /* 0 */ 0, 1308, }; static const uint16_t ud_itab__1037[] = { /* 0 */ 0, 1309, }; static const uint16_t ud_itab__1038[] = { /* 0 */ 0, 1310, }; static const uint16_t ud_itab__1039[] = { /* 0 */ 0, 1311, }; static const uint16_t ud_itab__1040[] = { /* 0 */ 0, 1312, }; static const uint16_t ud_itab__1041[] = { /* 0 */ 0, 1313, }; static const uint16_t ud_itab__1042[] = { /* 0 */ 0, 1314, }; static const uint16_t ud_itab__1043[] = { /* 0 */ 0, 1315, }; static const uint16_t ud_itab__1044[] = { /* 0 */ 0, 1316, }; static const uint16_t ud_itab__1045[] = { /* 0 */ 0, 1317, }; static const uint16_t ud_itab__1046[] = { /* 0 */ 0, 1318, }; static const uint16_t ud_itab__1047[] = { /* 0 */ 0, 1319, }; static const uint16_t ud_itab__1048[] = { /* 0 */ 0, 1320, }; static const uint16_t ud_itab__1049[] = { /* 0 */ 0, 1321, }; static const uint16_t ud_itab__1050[] = { /* 0 */ 0, 1322, }; static const uint16_t ud_itab__1051[] = { /* 0 */ 0, 1323, }; static const uint16_t ud_itab__1052[] = { /* 0 */ 0, 1324, }; static const uint16_t ud_itab__1053[] = { /* 0 */ 0, 1325, }; static const uint16_t ud_itab__1054[] = { /* 0 */ 0, 1326, }; static const uint16_t ud_itab__1055[] = { /* 0 */ 0, 1327, }; static const uint16_t ud_itab__1056[] = { /* 0 */ 0, 1328, }; static const uint16_t ud_itab__1057[] = { /* 0 */ 0, 1329, }; static const uint16_t ud_itab__1058[] = { /* 0 */ 0, 1330, }; static const uint16_t ud_itab__1059[] = { /* 0 */ 0, 1331, }; static const uint16_t ud_itab__1060[] = { /* 0 */ 0, 1332, }; static const uint16_t ud_itab__1061[] = { /* 0 */ 0, 1333, }; static const uint16_t ud_itab__1062[] = { /* 0 */ 0, 1334, }; static const uint16_t ud_itab__1063[] = { /* 0 */ 0, 1335, }; static const uint16_t ud_itab__1064[] = { /* 0 */ 0, 1336, }; static const uint16_t ud_itab__1065[] = { /* 0 */ 0, 1337, }; static const uint16_t ud_itab__1008[] = { /* 0 */ GROUP(1009), GROUP(1010), GROUP(1011), GROUP(1012), /* 4 */ GROUP(1013), GROUP(1014), GROUP(1015), GROUP(1016), /* 8 */ GROUP(1017), GROUP(1018), GROUP(1019), GROUP(1020), /* c */ GROUP(1021), GROUP(1022), GROUP(1023), GROUP(1024), /* 10 */ GROUP(1025), GROUP(1026), GROUP(1027), GROUP(1028), /* 14 */ GROUP(1029), GROUP(1030), GROUP(1031), GROUP(1032), /* 18 */ 0, GROUP(1033), 0, 0, /* 1c */ 0, 0, 0, 0, /* 20 */ GROUP(1034), GROUP(1035), GROUP(1036), GROUP(1037), /* 24 */ GROUP(1038), GROUP(1039), GROUP(1040), GROUP(1041), /* 28 */ GROUP(1042), GROUP(1043), GROUP(1044), GROUP(1045), /* 2c */ GROUP(1046), GROUP(1047), GROUP(1048), GROUP(1049), /* 30 */ GROUP(1050), GROUP(1051), GROUP(1052), GROUP(1053), /* 34 */ GROUP(1054), GROUP(1055), GROUP(1056), GROUP(1057), /* 38 */ GROUP(1058), GROUP(1059), GROUP(1060), GROUP(1061), /* 3c */ GROUP(1062), GROUP(1063), GROUP(1064), GROUP(1065), }; static const uint16_t ud_itab__998[] = { /* 0 */ GROUP(999), GROUP(1008), }; static const uint16_t ud_itab__1068[] = { /* 0 */ 1338, 0, }; static const uint16_t ud_itab__1069[] = { /* 0 */ 1339, 0, }; static const uint16_t ud_itab__1070[] = { /* 0 */ 1340, 0, }; static const uint16_t ud_itab__1071[] = { /* 0 */ 1341, 0, }; static const uint16_t ud_itab__1072[] = { /* 0 */ 1342, 0, }; static const uint16_t ud_itab__1073[] = { /* 0 */ 1343, 0, }; static const uint16_t ud_itab__1074[] = { /* 0 */ 1344, 0, }; static const uint16_t ud_itab__1075[] = { /* 0 */ 1345, 0, }; static const uint16_t ud_itab__1067[] = { /* 0 */ GROUP(1068), GROUP(1069), GROUP(1070), GROUP(1071), /* 4 */ GROUP(1072), GROUP(1073), GROUP(1074), GROUP(1075), }; static const uint16_t ud_itab__1077[] = { /* 0 */ 0, 1346, }; static const uint16_t ud_itab__1078[] = { /* 0 */ 0, 1347, }; static const uint16_t ud_itab__1079[] = { /* 0 */ 0, 1348, }; static const uint16_t ud_itab__1080[] = { /* 0 */ 0, 1349, }; static const uint16_t ud_itab__1081[] = { /* 0 */ 0, 1350, }; static const uint16_t ud_itab__1082[] = { /* 0 */ 0, 1351, }; static const uint16_t ud_itab__1083[] = { /* 0 */ 0, 1352, }; static const uint16_t ud_itab__1084[] = { /* 0 */ 0, 1353, }; static const uint16_t ud_itab__1085[] = { /* 0 */ 0, 1354, }; static const uint16_t ud_itab__1086[] = { /* 0 */ 0, 1355, }; static const uint16_t ud_itab__1087[] = { /* 0 */ 0, 1356, }; static const uint16_t ud_itab__1088[] = { /* 0 */ 0, 1357, }; static const uint16_t ud_itab__1089[] = { /* 0 */ 0, 1358, }; static const uint16_t ud_itab__1090[] = { /* 0 */ 0, 1359, }; static const uint16_t ud_itab__1091[] = { /* 0 */ 0, 1360, }; static const uint16_t ud_itab__1092[] = { /* 0 */ 0, 1361, }; static const uint16_t ud_itab__1093[] = { /* 0 */ 0, 1362, }; static const uint16_t ud_itab__1094[] = { /* 0 */ 0, 1363, }; static const uint16_t ud_itab__1095[] = { /* 0 */ 0, 1364, }; static const uint16_t ud_itab__1096[] = { /* 0 */ 0, 1365, }; static const uint16_t ud_itab__1097[] = { /* 0 */ 0, 1366, }; static const uint16_t ud_itab__1098[] = { /* 0 */ 0, 1367, }; static const uint16_t ud_itab__1099[] = { /* 0 */ 0, 1368, }; static const uint16_t ud_itab__1100[] = { /* 0 */ 0, 1369, }; static const uint16_t ud_itab__1101[] = { /* 0 */ 0, 1370, }; static const uint16_t ud_itab__1102[] = { /* 0 */ 0, 1371, }; static const uint16_t ud_itab__1103[] = { /* 0 */ 0, 1372, }; static const uint16_t ud_itab__1104[] = { /* 0 */ 0, 1373, }; static const uint16_t ud_itab__1105[] = { /* 0 */ 0, 1374, }; static const uint16_t ud_itab__1106[] = { /* 0 */ 0, 1375, }; static const uint16_t ud_itab__1107[] = { /* 0 */ 0, 1376, }; static const uint16_t ud_itab__1108[] = { /* 0 */ 0, 1377, }; static const uint16_t ud_itab__1109[] = { /* 0 */ 0, 1378, }; static const uint16_t ud_itab__1110[] = { /* 0 */ 0, 1379, }; static const uint16_t ud_itab__1111[] = { /* 0 */ 0, 1380, }; static const uint16_t ud_itab__1112[] = { /* 0 */ 0, 1381, }; static const uint16_t ud_itab__1113[] = { /* 0 */ 0, 1382, }; static const uint16_t ud_itab__1114[] = { /* 0 */ 0, 1383, }; static const uint16_t ud_itab__1115[] = { /* 0 */ 0, 1384, }; static const uint16_t ud_itab__1116[] = { /* 0 */ 0, 1385, }; static const uint16_t ud_itab__1117[] = { /* 0 */ 0, 1386, }; static const uint16_t ud_itab__1118[] = { /* 0 */ 0, 1387, }; static const uint16_t ud_itab__1119[] = { /* 0 */ 0, 1388, }; static const uint16_t ud_itab__1120[] = { /* 0 */ 0, 1389, }; static const uint16_t ud_itab__1121[] = { /* 0 */ 0, 1390, }; static const uint16_t ud_itab__1122[] = { /* 0 */ 0, 1391, }; static const uint16_t ud_itab__1123[] = { /* 0 */ 0, 1392, }; static const uint16_t ud_itab__1124[] = { /* 0 */ 0, 1393, }; static const uint16_t ud_itab__1125[] = { /* 0 */ 0, 1394, }; static const uint16_t ud_itab__1076[] = { /* 0 */ GROUP(1077), GROUP(1078), GROUP(1079), GROUP(1080), /* 4 */ GROUP(1081), GROUP(1082), GROUP(1083), GROUP(1084), /* 8 */ GROUP(1085), GROUP(1086), GROUP(1087), GROUP(1088), /* c */ GROUP(1089), GROUP(1090), GROUP(1091), GROUP(1092), /* 10 */ GROUP(1093), GROUP(1094), GROUP(1095), GROUP(1096), /* 14 */ GROUP(1097), GROUP(1098), GROUP(1099), GROUP(1100), /* 18 */ GROUP(1101), GROUP(1102), GROUP(1103), GROUP(1104), /* 1c */ GROUP(1105), GROUP(1106), GROUP(1107), GROUP(1108), /* 20 */ GROUP(1109), 0, 0, 0, /* 24 */ 0, 0, 0, 0, /* 28 */ GROUP(1110), GROUP(1111), GROUP(1112), GROUP(1113), /* 2c */ GROUP(1114), GROUP(1115), GROUP(1116), GROUP(1117), /* 30 */ GROUP(1118), GROUP(1119), GROUP(1120), GROUP(1121), /* 34 */ GROUP(1122), GROUP(1123), GROUP(1124), GROUP(1125), /* 38 */ 0, 0, 0, 0, /* 3c */ 0, 0, 0, 0, }; static const uint16_t ud_itab__1066[] = { /* 0 */ GROUP(1067), GROUP(1076), }; static const uint16_t ud_itab__1126[] = { /* 0 */ 1398, 1399, 1400, }; static const uint16_t ud_itab__1127[] = { /* 0 */ 1407, 0, }; static const uint16_t ud_itab__1128[] = { /* 0 */ 1419, 1420, 1421, 1422, /* 4 */ 1423, 1424, 1425, 1426, }; static const uint16_t ud_itab__1129[] = { /* 0 */ 1427, 1428, 1429, 1430, /* 4 */ 1431, 1432, 1433, 1434, }; static const uint16_t ud_itab__1130[] = { /* 0 */ 1441, 1442, 0, 0, /* 4 */ 0, 0, 0, 0, }; static const uint16_t ud_itab__1132[] = { /* 0 */ 1445, 1446, }; static const uint16_t ud_itab__1131[] = { /* 0 */ 1443, 1444, GROUP(1132), 1447, /* 4 */ 1448, 1449, 1450, 0, }; const uint16_t ud_itab__0[] = { /* 0 */ 1, 2, 3, 4, /* 4 */ 5, 6, GROUP(1), GROUP(2), /* 8 */ 9, 10, 11, 12, /* c */ 13, 14, GROUP(3), GROUP(4), /* 10 */ 628, 629, 630, 631, /* 14 */ 632, 633, GROUP(563), GROUP(564), /* 18 */ 636, 637, 638, 639, /* 1c */ 640, 641, GROUP(565), GROUP(566), /* 20 */ 644, 645, 646, 647, /* 24 */ 648, 649, 0, GROUP(567), /* 28 */ 651, 652, 653, 654, /* 2c */ 655, 656, 0, GROUP(568), /* 30 */ 658, 659, 660, 661, /* 34 */ 662, 663, 0, GROUP(569), /* 38 */ 665, 666, 667, 668, /* 3c */ 669, 670, 0, GROUP(570), /* 40 */ 672, 673, 674, 675, /* 44 */ 676, 677, 678, 679, /* 48 */ 680, 681, 682, 683, /* 4c */ 684, 685, 686, 687, /* 50 */ 688, 689, 690, 691, /* 54 */ 692, 693, 694, 695, /* 58 */ 696, 697, 698, 699, /* 5c */ 700, 701, 702, 703, /* 60 */ GROUP(571), GROUP(574), GROUP(577), GROUP(578), /* 64 */ 0, 0, 0, 0, /* 68 */ 711, 712, 713, 714, /* 6c */ 715, GROUP(579), 718, GROUP(580), /* 70 */ 721, 722, 723, 724, /* 74 */ 725, 726, 727, 728, /* 78 */ 729, 730, 731, 732, /* 7c */ 733, 734, 735, 736, /* 80 */ GROUP(581), GROUP(582), GROUP(583), GROUP(592), /* 84 */ 769, 770, 771, 772, /* 88 */ 773, 774, 775, 776, /* 8c */ 777, 778, 779, GROUP(593), /* 90 */ 781, 782, 783, 784, /* 94 */ 785, 786, 787, 788, /* 98 */ GROUP(594), GROUP(595), GROUP(596), 796, /* 9c */ GROUP(597), GROUP(601), 806, 807, /* a0 */ 808, 809, 810, 811, /* a4 */ 812, GROUP(605), 816, GROUP(606), /* a8 */ 820, 821, 822, GROUP(607), /* ac */ 826, GROUP(608), 830, GROUP(609), /* b0 */ 834, 835, 836, 837, /* b4 */ 838, 839, 840, 841, /* b8 */ 842, 843, 844, 845, /* bc */ 846, 847, 848, 849, /* c0 */ GROUP(610), GROUP(611), 866, 867, /* c4 */ GROUP(612), GROUP(613), GROUP(614), GROUP(615), /* c8 */ 872, 873, 874, 875, /* cc */ 876, 877, GROUP(616), GROUP(617), /* d0 */ GROUP(618), GROUP(619), GROUP(620), GROUP(621), /* d4 */ GROUP(622), GROUP(623), GROUP(624), 917, /* d8 */ GROUP(625), GROUP(700), GROUP(762), GROUP(806), /* dc */ GROUP(865), GROUP(940), GROUP(998), GROUP(1066), /* e0 */ 1395, 1396, 1397, GROUP(1126), /* e4 */ 1401, 1402, 1403, 1404, /* e8 */ 1405, 1406, GROUP(1127), 1408, /* ec */ 1409, 1410, 1411, 1412, /* f0 */ 1413, 1414, 1415, 1416, /* f4 */ 1417, 1418, GROUP(1128), GROUP(1129), /* f8 */ 1435, 1436, 1437, 1438, /* fc */ 1439, 1440, GROUP(1130), GROUP(1131), }; struct ud_lookup_table_list_entry ud_lookup_table_list[] = { /* 000 */ { ud_itab__0, UD_TAB__OPC_TABLE, "table0" }, /* 001 */ { ud_itab__1, UD_TAB__OPC_MODE, "/m" }, /* 002 */ { ud_itab__2, UD_TAB__OPC_MODE, "/m" }, /* 003 */ { ud_itab__3, UD_TAB__OPC_MODE, "/m" }, /* 004 */ { ud_itab__4, UD_TAB__OPC_TABLE, "0f" }, /* 005 */ { ud_itab__5, UD_TAB__OPC_REG, "/reg" }, /* 006 */ { ud_itab__6, UD_TAB__OPC_SSE, "/sse" }, /* 007 */ { ud_itab__7, UD_TAB__OPC_SSE, "/sse" }, /* 008 */ { ud_itab__8, UD_TAB__OPC_SSE, "/sse" }, /* 009 */ { ud_itab__9, UD_TAB__OPC_SSE, "/sse" }, /* 010 */ { ud_itab__10, UD_TAB__OPC_SSE, "/sse" }, /* 011 */ { ud_itab__11, UD_TAB__OPC_SSE, "/sse" }, /* 012 */ { ud_itab__12, UD_TAB__OPC_MOD, "/mod" }, /* 013 */ { ud_itab__13, UD_TAB__OPC_REG, "/reg" }, /* 014 */ { ud_itab__14, UD_TAB__OPC_SSE, "/sse" }, /* 015 */ { ud_itab__15, UD_TAB__OPC_MOD, "/mod" }, /* 016 */ { ud_itab__16, UD_TAB__OPC_SSE, "/sse" }, /* 017 */ { ud_itab__17, UD_TAB__OPC_MOD, "/mod" }, /* 018 */ { ud_itab__18, UD_TAB__OPC_SSE, "/sse" }, /* 019 */ { ud_itab__19, UD_TAB__OPC_MOD, "/mod" }, /* 020 */ { ud_itab__20, UD_TAB__OPC_SSE, "/sse" }, /* 021 */ { ud_itab__21, UD_TAB__OPC_MOD, "/mod" }, /* 022 */ { ud_itab__22, UD_TAB__OPC_SSE, "/sse" }, /* 023 */ { ud_itab__23, UD_TAB__OPC_MOD, "/mod" }, /* 024 */ { ud_itab__24, UD_TAB__OPC_SSE, "/sse" }, /* 025 */ { ud_itab__25, UD_TAB__OPC_MOD, "/mod" }, /* 026 */ { ud_itab__26, UD_TAB__OPC_SSE, "/sse" }, /* 027 */ { ud_itab__27, UD_TAB__OPC_MOD, "/mod" }, /* 028 */ { ud_itab__28, UD_TAB__OPC_REG, "/reg" }, /* 029 */ { ud_itab__29, UD_TAB__OPC_RM, "/rm" }, /* 030 */ { ud_itab__30, UD_TAB__OPC_SSE, "/sse" }, /* 031 */ { ud_itab__31, UD_TAB__OPC_MOD, "/mod" }, /* 032 */ { ud_itab__32, UD_TAB__OPC_VENDOR, "intel" }, /* 033 */ { ud_itab__33, UD_TAB__OPC_SSE, "/sse" }, /* 034 */ { ud_itab__34, UD_TAB__OPC_MOD, "/mod" }, /* 035 */ { ud_itab__35, UD_TAB__OPC_VENDOR, "intel" }, /* 036 */ { ud_itab__36, UD_TAB__OPC_SSE, "/sse" }, /* 037 */ { ud_itab__37, UD_TAB__OPC_MOD, "/mod" }, /* 038 */ { ud_itab__38, UD_TAB__OPC_VENDOR, "intel" }, /* 039 */ { ud_itab__39, UD_TAB__OPC_SSE, "/sse" }, /* 040 */ { ud_itab__40, UD_TAB__OPC_MOD, "/mod" }, /* 041 */ { ud_itab__41, UD_TAB__OPC_VENDOR, "intel" }, /* 042 */ { ud_itab__42, UD_TAB__OPC_RM, "/rm" }, /* 043 */ { ud_itab__43, UD_TAB__OPC_SSE, "/sse" }, /* 044 */ { ud_itab__44, UD_TAB__OPC_MOD, "/mod" }, /* 045 */ { ud_itab__45, UD_TAB__OPC_SSE, "/sse" }, /* 046 */ { ud_itab__46, UD_TAB__OPC_MOD, "/mod" }, /* 047 */ { ud_itab__47, UD_TAB__OPC_RM, "/rm" }, /* 048 */ { ud_itab__48, UD_TAB__OPC_SSE, "/sse" }, /* 049 */ { ud_itab__49, UD_TAB__OPC_MOD, "/mod" }, /* 050 */ { ud_itab__50, UD_TAB__OPC_SSE, "/sse" }, /* 051 */ { ud_itab__51, UD_TAB__OPC_MOD, "/mod" }, /* 052 */ { ud_itab__52, UD_TAB__OPC_RM, "/rm" }, /* 053 */ { ud_itab__53, UD_TAB__OPC_SSE, "/sse" }, /* 054 */ { ud_itab__54, UD_TAB__OPC_MOD, "/mod" }, /* 055 */ { ud_itab__55, UD_TAB__OPC_VENDOR, "amd" }, /* 056 */ { ud_itab__56, UD_TAB__OPC_SSE, "/sse" }, /* 057 */ { ud_itab__57, UD_TAB__OPC_MOD, "/mod" }, /* 058 */ { ud_itab__58, UD_TAB__OPC_VENDOR, "amd" }, /* 059 */ { ud_itab__59, UD_TAB__OPC_SSE, "/sse" }, /* 060 */ { ud_itab__60, UD_TAB__OPC_MOD, "/mod" }, /* 061 */ { ud_itab__61, UD_TAB__OPC_VENDOR, "amd" }, /* 062 */ { ud_itab__62, UD_TAB__OPC_SSE, "/sse" }, /* 063 */ { ud_itab__63, UD_TAB__OPC_MOD, "/mod" }, /* 064 */ { ud_itab__64, UD_TAB__OPC_VENDOR, "amd" }, /* 065 */ { ud_itab__65, UD_TAB__OPC_SSE, "/sse" }, /* 066 */ { ud_itab__66, UD_TAB__OPC_MOD, "/mod" }, /* 067 */ { ud_itab__67, UD_TAB__OPC_VENDOR, "amd" }, /* 068 */ { ud_itab__68, UD_TAB__OPC_SSE, "/sse" }, /* 069 */ { ud_itab__69, UD_TAB__OPC_MOD, "/mod" }, /* 070 */ { ud_itab__70, UD_TAB__OPC_VENDOR, "amd" }, /* 071 */ { ud_itab__71, UD_TAB__OPC_SSE, "/sse" }, /* 072 */ { ud_itab__72, UD_TAB__OPC_MOD, "/mod" }, /* 073 */ { ud_itab__73, UD_TAB__OPC_VENDOR, "amd" }, /* 074 */ { ud_itab__74, UD_TAB__OPC_SSE, "/sse" }, /* 075 */ { ud_itab__75, UD_TAB__OPC_MOD, "/mod" }, /* 076 */ { ud_itab__76, UD_TAB__OPC_VENDOR, "amd" }, /* 077 */ { ud_itab__77, UD_TAB__OPC_SSE, "/sse" }, /* 078 */ { ud_itab__78, UD_TAB__OPC_MOD, "/mod" }, /* 079 */ { ud_itab__79, UD_TAB__OPC_SSE, "/sse" }, /* 080 */ { ud_itab__80, UD_TAB__OPC_MOD, "/mod" }, /* 081 */ { ud_itab__81, UD_TAB__OPC_RM, "/rm" }, /* 082 */ { ud_itab__82, UD_TAB__OPC_SSE, "/sse" }, /* 083 */ { ud_itab__83, UD_TAB__OPC_MOD, "/mod" }, /* 084 */ { ud_itab__84, UD_TAB__OPC_SSE, "/sse" }, /* 085 */ { ud_itab__85, UD_TAB__OPC_MOD, "/mod" }, /* 086 */ { ud_itab__86, UD_TAB__OPC_VENDOR, "amd" }, /* 087 */ { ud_itab__87, UD_TAB__OPC_SSE, "/sse" }, /* 088 */ { ud_itab__88, UD_TAB__OPC_SSE, "/sse" }, /* 089 */ { ud_itab__89, UD_TAB__OPC_SSE, "/sse" }, /* 090 */ { ud_itab__90, UD_TAB__OPC_SSE, "/sse" }, /* 091 */ { ud_itab__91, UD_TAB__OPC_SSE, "/sse" }, /* 092 */ { ud_itab__92, UD_TAB__OPC_SSE, "/sse" }, /* 093 */ { ud_itab__93, UD_TAB__OPC_SSE, "/sse" }, /* 094 */ { ud_itab__94, UD_TAB__OPC_SSE, "/sse" }, /* 095 */ { ud_itab__95, UD_TAB__OPC_REG, "/reg" }, /* 096 */ { ud_itab__96, UD_TAB__OPC_SSE, "/sse" }, /* 097 */ { ud_itab__97, UD_TAB__OPC_SSE, "/sse" }, /* 098 */ { ud_itab__98, UD_TAB__OPC_SSE, "/sse" }, /* 099 */ { ud_itab__99, UD_TAB__OPC_SSE, "/sse" }, /* 100 */ { ud_itab__100, UD_TAB__OPC_SSE, "/sse" }, /* 101 */ { ud_itab__101, UD_TAB__OPC_SSE, "/sse" }, /* 102 */ { ud_itab__102, UD_TAB__OPC_SSE, "/sse" }, /* 103 */ { ud_itab__103, UD_TAB__OPC_SSE, "/sse" }, /* 104 */ { ud_itab__104, UD_TAB__OPC_SSE, "/sse" }, /* 105 */ { ud_itab__105, UD_TAB__OPC_3DNOW, "/3dnow" }, /* 106 */ { ud_itab__106, UD_TAB__OPC_SSE, "/sse" }, /* 107 */ { ud_itab__107, UD_TAB__OPC_SSE, "/sse" }, /* 108 */ { ud_itab__108, UD_TAB__OPC_MOD, "/mod" }, /* 109 */ { ud_itab__109, UD_TAB__OPC_SSE, "/sse" }, /* 110 */ { ud_itab__110, UD_TAB__OPC_MOD, "/mod" }, /* 111 */ { ud_itab__111, UD_TAB__OPC_MOD, "/mod" }, /* 112 */ { ud_itab__112, UD_TAB__OPC_MOD, "/mod" }, /* 113 */ { ud_itab__113, UD_TAB__OPC_MOD, "/mod" }, /* 114 */ { ud_itab__114, UD_TAB__OPC_SSE, "/sse" }, /* 115 */ { ud_itab__115, UD_TAB__OPC_MOD, "/mod" }, /* 116 */ { ud_itab__116, UD_TAB__OPC_MOD, "/mod" }, /* 117 */ { ud_itab__117, UD_TAB__OPC_MOD, "/mod" }, /* 118 */ { ud_itab__118, UD_TAB__OPC_SSE, "/sse" }, /* 119 */ { ud_itab__119, UD_TAB__OPC_SSE, "/sse" }, /* 120 */ { ud_itab__120, UD_TAB__OPC_SSE, "/sse" }, /* 121 */ { ud_itab__121, UD_TAB__OPC_MOD, "/mod" }, /* 122 */ { ud_itab__122, UD_TAB__OPC_SSE, "/sse" }, /* 123 */ { ud_itab__123, UD_TAB__OPC_MOD, "/mod" }, /* 124 */ { ud_itab__124, UD_TAB__OPC_MOD, "/mod" }, /* 125 */ { ud_itab__125, UD_TAB__OPC_MOD, "/mod" }, /* 126 */ { ud_itab__126, UD_TAB__OPC_SSE, "/sse" }, /* 127 */ { ud_itab__127, UD_TAB__OPC_MOD, "/mod" }, /* 128 */ { ud_itab__128, UD_TAB__OPC_MOD, "/mod" }, /* 129 */ { ud_itab__129, UD_TAB__OPC_SSE, "/sse" }, /* 130 */ { ud_itab__130, UD_TAB__OPC_REG, "/reg" }, /* 131 */ { ud_itab__131, UD_TAB__OPC_SSE, "/sse" }, /* 132 */ { ud_itab__132, UD_TAB__OPC_SSE, "/sse" }, /* 133 */ { ud_itab__133, UD_TAB__OPC_SSE, "/sse" }, /* 134 */ { ud_itab__134, UD_TAB__OPC_SSE, "/sse" }, /* 135 */ { ud_itab__135, UD_TAB__OPC_SSE, "/sse" }, /* 136 */ { ud_itab__136, UD_TAB__OPC_SSE, "/sse" }, /* 137 */ { ud_itab__137, UD_TAB__OPC_SSE, "/sse" }, /* 138 */ { ud_itab__138, UD_TAB__OPC_SSE, "/sse" }, /* 139 */ { ud_itab__139, UD_TAB__OPC_SSE, "/sse" }, /* 140 */ { ud_itab__140, UD_TAB__OPC_SSE, "/sse" }, /* 141 */ { ud_itab__141, UD_TAB__OPC_SSE, "/sse" }, /* 142 */ { ud_itab__142, UD_TAB__OPC_SSE, "/sse" }, /* 143 */ { ud_itab__143, UD_TAB__OPC_SSE, "/sse" }, /* 144 */ { ud_itab__144, UD_TAB__OPC_SSE, "/sse" }, /* 145 */ { ud_itab__145, UD_TAB__OPC_SSE, "/sse" }, /* 146 */ { ud_itab__146, UD_TAB__OPC_SSE, "/sse" }, /* 147 */ { ud_itab__147, UD_TAB__OPC_SSE, "/sse" }, /* 148 */ { ud_itab__148, UD_TAB__OPC_SSE, "/sse" }, /* 149 */ { ud_itab__149, UD_TAB__OPC_SSE, "/sse" }, /* 150 */ { ud_itab__150, UD_TAB__OPC_SSE, "/sse" }, /* 151 */ { ud_itab__151, UD_TAB__OPC_SSE, "/sse" }, /* 152 */ { ud_itab__152, UD_TAB__OPC_SSE, "/sse" }, /* 153 */ { ud_itab__153, UD_TAB__OPC_SSE, "/sse" }, /* 154 */ { ud_itab__154, UD_TAB__OPC_SSE, "/sse" }, /* 155 */ { ud_itab__155, UD_TAB__OPC_SSE, "/sse" }, /* 156 */ { ud_itab__156, UD_TAB__OPC_SSE, "/sse" }, /* 157 */ { ud_itab__157, UD_TAB__OPC_SSE, "/sse" }, /* 158 */ { ud_itab__158, UD_TAB__OPC_SSE, "/sse" }, /* 159 */ { ud_itab__159, UD_TAB__OPC_MODE, "/m" }, /* 160 */ { ud_itab__160, UD_TAB__OPC_VENDOR, "intel" }, /* 161 */ { ud_itab__161, UD_TAB__OPC_SSE, "/sse" }, /* 162 */ { ud_itab__162, UD_TAB__OPC_MODE, "/m" }, /* 163 */ { ud_itab__163, UD_TAB__OPC_VENDOR, "intel" }, /* 164 */ { ud_itab__164, UD_TAB__OPC_SSE, "/sse" }, /* 165 */ { ud_itab__165, UD_TAB__OPC_TABLE, "38" }, /* 166 */ { ud_itab__166, UD_TAB__OPC_SSE, "/sse" }, /* 167 */ { ud_itab__167, UD_TAB__OPC_SSE, "/sse" }, /* 168 */ { ud_itab__168, UD_TAB__OPC_SSE, "/sse" }, /* 169 */ { ud_itab__169, UD_TAB__OPC_SSE, "/sse" }, /* 170 */ { ud_itab__170, UD_TAB__OPC_SSE, "/sse" }, /* 171 */ { ud_itab__171, UD_TAB__OPC_SSE, "/sse" }, /* 172 */ { ud_itab__172, UD_TAB__OPC_SSE, "/sse" }, /* 173 */ { ud_itab__173, UD_TAB__OPC_SSE, "/sse" }, /* 174 */ { ud_itab__174, UD_TAB__OPC_SSE, "/sse" }, /* 175 */ { ud_itab__175, UD_TAB__OPC_SSE, "/sse" }, /* 176 */ { ud_itab__176, UD_TAB__OPC_SSE, "/sse" }, /* 177 */ { ud_itab__177, UD_TAB__OPC_SSE, "/sse" }, /* 178 */ { ud_itab__178, UD_TAB__OPC_SSE, "/sse" }, /* 179 */ { ud_itab__179, UD_TAB__OPC_SSE, "/sse" }, /* 180 */ { ud_itab__180, UD_TAB__OPC_SSE, "/sse" }, /* 181 */ { ud_itab__181, UD_TAB__OPC_SSE, "/sse" }, /* 182 */ { ud_itab__182, UD_TAB__OPC_SSE, "/sse" }, /* 183 */ { ud_itab__183, UD_TAB__OPC_SSE, "/sse" }, /* 184 */ { ud_itab__184, UD_TAB__OPC_SSE, "/sse" }, /* 185 */ { ud_itab__185, UD_TAB__OPC_SSE, "/sse" }, /* 186 */ { ud_itab__186, UD_TAB__OPC_SSE, "/sse" }, /* 187 */ { ud_itab__187, UD_TAB__OPC_SSE, "/sse" }, /* 188 */ { ud_itab__188, UD_TAB__OPC_SSE, "/sse" }, /* 189 */ { ud_itab__189, UD_TAB__OPC_SSE, "/sse" }, /* 190 */ { ud_itab__190, UD_TAB__OPC_SSE, "/sse" }, /* 191 */ { ud_itab__191, UD_TAB__OPC_SSE, "/sse" }, /* 192 */ { ud_itab__192, UD_TAB__OPC_SSE, "/sse" }, /* 193 */ { ud_itab__193, UD_TAB__OPC_SSE, "/sse" }, /* 194 */ { ud_itab__194, UD_TAB__OPC_SSE, "/sse" }, /* 195 */ { ud_itab__195, UD_TAB__OPC_SSE, "/sse" }, /* 196 */ { ud_itab__196, UD_TAB__OPC_SSE, "/sse" }, /* 197 */ { ud_itab__197, UD_TAB__OPC_SSE, "/sse" }, /* 198 */ { ud_itab__198, UD_TAB__OPC_SSE, "/sse" }, /* 199 */ { ud_itab__199, UD_TAB__OPC_SSE, "/sse" }, /* 200 */ { ud_itab__200, UD_TAB__OPC_SSE, "/sse" }, /* 201 */ { ud_itab__201, UD_TAB__OPC_SSE, "/sse" }, /* 202 */ { ud_itab__202, UD_TAB__OPC_SSE, "/sse" }, /* 203 */ { ud_itab__203, UD_TAB__OPC_SSE, "/sse" }, /* 204 */ { ud_itab__204, UD_TAB__OPC_SSE, "/sse" }, /* 205 */ { ud_itab__205, UD_TAB__OPC_SSE, "/sse" }, /* 206 */ { ud_itab__206, UD_TAB__OPC_SSE, "/sse" }, /* 207 */ { ud_itab__207, UD_TAB__OPC_SSE, "/sse" }, /* 208 */ { ud_itab__208, UD_TAB__OPC_SSE, "/sse" }, /* 209 */ { ud_itab__209, UD_TAB__OPC_SSE, "/sse" }, /* 210 */ { ud_itab__210, UD_TAB__OPC_SSE, "/sse" }, /* 211 */ { ud_itab__211, UD_TAB__OPC_SSE, "/sse" }, /* 212 */ { ud_itab__212, UD_TAB__OPC_SSE, "/sse" }, /* 213 */ { ud_itab__213, UD_TAB__OPC_MODE, "/m" }, /* 214 */ { ud_itab__214, UD_TAB__OPC_VENDOR, "intel" }, /* 215 */ { ud_itab__215, UD_TAB__OPC_SSE, "/sse" }, /* 216 */ { ud_itab__216, UD_TAB__OPC_MODE, "/m" }, /* 217 */ { ud_itab__217, UD_TAB__OPC_VENDOR, "intel" }, /* 218 */ { ud_itab__218, UD_TAB__OPC_SSE, "/sse" }, /* 219 */ { ud_itab__219, UD_TAB__OPC_SSE, "/sse" }, /* 220 */ { ud_itab__220, UD_TAB__OPC_SSE, "/sse" }, /* 221 */ { ud_itab__221, UD_TAB__OPC_SSE, "/sse" }, /* 222 */ { ud_itab__222, UD_TAB__OPC_SSE, "/sse" }, /* 223 */ { ud_itab__223, UD_TAB__OPC_SSE, "/sse" }, /* 224 */ { ud_itab__224, UD_TAB__OPC_SSE, "/sse" }, /* 225 */ { ud_itab__225, UD_TAB__OPC_TABLE, "3a" }, /* 226 */ { ud_itab__226, UD_TAB__OPC_SSE, "/sse" }, /* 227 */ { ud_itab__227, UD_TAB__OPC_SSE, "/sse" }, /* 228 */ { ud_itab__228, UD_TAB__OPC_SSE, "/sse" }, /* 229 */ { ud_itab__229, UD_TAB__OPC_SSE, "/sse" }, /* 230 */ { ud_itab__230, UD_TAB__OPC_SSE, "/sse" }, /* 231 */ { ud_itab__231, UD_TAB__OPC_SSE, "/sse" }, /* 232 */ { ud_itab__232, UD_TAB__OPC_SSE, "/sse" }, /* 233 */ { ud_itab__233, UD_TAB__OPC_SSE, "/sse" }, /* 234 */ { ud_itab__234, UD_TAB__OPC_SSE, "/sse" }, /* 235 */ { ud_itab__235, UD_TAB__OPC_SSE, "/sse" }, /* 236 */ { ud_itab__236, UD_TAB__OPC_SSE, "/sse" }, /* 237 */ { ud_itab__237, UD_TAB__OPC_OSIZE, "/o" }, /* 238 */ { ud_itab__238, UD_TAB__OPC_SSE, "/sse" }, /* 239 */ { ud_itab__239, UD_TAB__OPC_SSE, "/sse" }, /* 240 */ { ud_itab__240, UD_TAB__OPC_SSE, "/sse" }, /* 241 */ { ud_itab__241, UD_TAB__OPC_SSE, "/sse" }, /* 242 */ { ud_itab__242, UD_TAB__OPC_OSIZE, "/o" }, /* 243 */ { ud_itab__243, UD_TAB__OPC_SSE, "/sse" }, /* 244 */ { ud_itab__244, UD_TAB__OPC_SSE, "/sse" }, /* 245 */ { ud_itab__245, UD_TAB__OPC_SSE, "/sse" }, /* 246 */ { ud_itab__246, UD_TAB__OPC_SSE, "/sse" }, /* 247 */ { ud_itab__247, UD_TAB__OPC_SSE, "/sse" }, /* 248 */ { ud_itab__248, UD_TAB__OPC_SSE, "/sse" }, /* 249 */ { ud_itab__249, UD_TAB__OPC_SSE, "/sse" }, /* 250 */ { ud_itab__250, UD_TAB__OPC_SSE, "/sse" }, /* 251 */ { ud_itab__251, UD_TAB__OPC_SSE, "/sse" }, /* 252 */ { ud_itab__252, UD_TAB__OPC_SSE, "/sse" }, /* 253 */ { ud_itab__253, UD_TAB__OPC_SSE, "/sse" }, /* 254 */ { ud_itab__254, UD_TAB__OPC_SSE, "/sse" }, /* 255 */ { ud_itab__255, UD_TAB__OPC_SSE, "/sse" }, /* 256 */ { ud_itab__256, UD_TAB__OPC_SSE, "/sse" }, /* 257 */ { ud_itab__257, UD_TAB__OPC_SSE, "/sse" }, /* 258 */ { ud_itab__258, UD_TAB__OPC_SSE, "/sse" }, /* 259 */ { ud_itab__259, UD_TAB__OPC_SSE, "/sse" }, /* 260 */ { ud_itab__260, UD_TAB__OPC_SSE, "/sse" }, /* 261 */ { ud_itab__261, UD_TAB__OPC_SSE, "/sse" }, /* 262 */ { ud_itab__262, UD_TAB__OPC_SSE, "/sse" }, /* 263 */ { ud_itab__263, UD_TAB__OPC_SSE, "/sse" }, /* 264 */ { ud_itab__264, UD_TAB__OPC_SSE, "/sse" }, /* 265 */ { ud_itab__265, UD_TAB__OPC_SSE, "/sse" }, /* 266 */ { ud_itab__266, UD_TAB__OPC_SSE, "/sse" }, /* 267 */ { ud_itab__267, UD_TAB__OPC_SSE, "/sse" }, /* 268 */ { ud_itab__268, UD_TAB__OPC_SSE, "/sse" }, /* 269 */ { ud_itab__269, UD_TAB__OPC_SSE, "/sse" }, /* 270 */ { ud_itab__270, UD_TAB__OPC_SSE, "/sse" }, /* 271 */ { ud_itab__271, UD_TAB__OPC_SSE, "/sse" }, /* 272 */ { ud_itab__272, UD_TAB__OPC_SSE, "/sse" }, /* 273 */ { ud_itab__273, UD_TAB__OPC_SSE, "/sse" }, /* 274 */ { ud_itab__274, UD_TAB__OPC_SSE, "/sse" }, /* 275 */ { ud_itab__275, UD_TAB__OPC_SSE, "/sse" }, /* 276 */ { ud_itab__276, UD_TAB__OPC_SSE, "/sse" }, /* 277 */ { ud_itab__277, UD_TAB__OPC_SSE, "/sse" }, /* 278 */ { ud_itab__278, UD_TAB__OPC_SSE, "/sse" }, /* 279 */ { ud_itab__279, UD_TAB__OPC_SSE, "/sse" }, /* 280 */ { ud_itab__280, UD_TAB__OPC_SSE, "/sse" }, /* 281 */ { ud_itab__281, UD_TAB__OPC_SSE, "/sse" }, /* 282 */ { ud_itab__282, UD_TAB__OPC_SSE, "/sse" }, /* 283 */ { ud_itab__283, UD_TAB__OPC_SSE, "/sse" }, /* 284 */ { ud_itab__284, UD_TAB__OPC_SSE, "/sse" }, /* 285 */ { ud_itab__285, UD_TAB__OPC_SSE, "/sse" }, /* 286 */ { ud_itab__286, UD_TAB__OPC_SSE, "/sse" }, /* 287 */ { ud_itab__287, UD_TAB__OPC_SSE, "/sse" }, /* 288 */ { ud_itab__288, UD_TAB__OPC_SSE, "/sse" }, /* 289 */ { ud_itab__289, UD_TAB__OPC_SSE, "/sse" }, /* 290 */ { ud_itab__290, UD_TAB__OPC_SSE, "/sse" }, /* 291 */ { ud_itab__291, UD_TAB__OPC_SSE, "/sse" }, /* 292 */ { ud_itab__292, UD_TAB__OPC_SSE, "/sse" }, /* 293 */ { ud_itab__293, UD_TAB__OPC_SSE, "/sse" }, /* 294 */ { ud_itab__294, UD_TAB__OPC_SSE, "/sse" }, /* 295 */ { ud_itab__295, UD_TAB__OPC_SSE, "/sse" }, /* 296 */ { ud_itab__296, UD_TAB__OPC_SSE, "/sse" }, /* 297 */ { ud_itab__297, UD_TAB__OPC_SSE, "/sse" }, /* 298 */ { ud_itab__298, UD_TAB__OPC_SSE, "/sse" }, /* 299 */ { ud_itab__299, UD_TAB__OPC_SSE, "/sse" }, /* 300 */ { ud_itab__300, UD_TAB__OPC_SSE, "/sse" }, /* 301 */ { ud_itab__301, UD_TAB__OPC_REG, "/reg" }, /* 302 */ { ud_itab__302, UD_TAB__OPC_SSE, "/sse" }, /* 303 */ { ud_itab__303, UD_TAB__OPC_SSE, "/sse" }, /* 304 */ { ud_itab__304, UD_TAB__OPC_SSE, "/sse" }, /* 305 */ { ud_itab__305, UD_TAB__OPC_REG, "/reg" }, /* 306 */ { ud_itab__306, UD_TAB__OPC_SSE, "/sse" }, /* 307 */ { ud_itab__307, UD_TAB__OPC_SSE, "/sse" }, /* 308 */ { ud_itab__308, UD_TAB__OPC_SSE, "/sse" }, /* 309 */ { ud_itab__309, UD_TAB__OPC_REG, "/reg" }, /* 310 */ { ud_itab__310, UD_TAB__OPC_SSE, "/sse" }, /* 311 */ { ud_itab__311, UD_TAB__OPC_SSE, "/sse" }, /* 312 */ { ud_itab__312, UD_TAB__OPC_SSE, "/sse" }, /* 313 */ { ud_itab__313, UD_TAB__OPC_SSE, "/sse" }, /* 314 */ { ud_itab__314, UD_TAB__OPC_SSE, "/sse" }, /* 315 */ { ud_itab__315, UD_TAB__OPC_SSE, "/sse" }, /* 316 */ { ud_itab__316, UD_TAB__OPC_SSE, "/sse" }, /* 317 */ { ud_itab__317, UD_TAB__OPC_SSE, "/sse" }, /* 318 */ { ud_itab__318, UD_TAB__OPC_SSE, "/sse" }, /* 319 */ { ud_itab__319, UD_TAB__OPC_VENDOR, "intel" }, /* 320 */ { ud_itab__320, UD_TAB__OPC_SSE, "/sse" }, /* 321 */ { ud_itab__321, UD_TAB__OPC_VENDOR, "intel" }, /* 322 */ { ud_itab__322, UD_TAB__OPC_SSE, "/sse" }, /* 323 */ { ud_itab__323, UD_TAB__OPC_SSE, "/sse" }, /* 324 */ { ud_itab__324, UD_TAB__OPC_SSE, "/sse" }, /* 325 */ { ud_itab__325, UD_TAB__OPC_SSE, "/sse" }, /* 326 */ { ud_itab__326, UD_TAB__OPC_SSE, "/sse" }, /* 327 */ { ud_itab__327, UD_TAB__OPC_SSE, "/sse" }, /* 328 */ { ud_itab__328, UD_TAB__OPC_SSE, "/sse" }, /* 329 */ { ud_itab__329, UD_TAB__OPC_SSE, "/sse" }, /* 330 */ { ud_itab__330, UD_TAB__OPC_SSE, "/sse" }, /* 331 */ { ud_itab__331, UD_TAB__OPC_SSE, "/sse" }, /* 332 */ { ud_itab__332, UD_TAB__OPC_SSE, "/sse" }, /* 333 */ { ud_itab__333, UD_TAB__OPC_SSE, "/sse" }, /* 334 */ { ud_itab__334, UD_TAB__OPC_SSE, "/sse" }, /* 335 */ { ud_itab__335, UD_TAB__OPC_SSE, "/sse" }, /* 336 */ { ud_itab__336, UD_TAB__OPC_SSE, "/sse" }, /* 337 */ { ud_itab__337, UD_TAB__OPC_SSE, "/sse" }, /* 338 */ { ud_itab__338, UD_TAB__OPC_SSE, "/sse" }, /* 339 */ { ud_itab__339, UD_TAB__OPC_SSE, "/sse" }, /* 340 */ { ud_itab__340, UD_TAB__OPC_SSE, "/sse" }, /* 341 */ { ud_itab__341, UD_TAB__OPC_SSE, "/sse" }, /* 342 */ { ud_itab__342, UD_TAB__OPC_SSE, "/sse" }, /* 343 */ { ud_itab__343, UD_TAB__OPC_SSE, "/sse" }, /* 344 */ { ud_itab__344, UD_TAB__OPC_SSE, "/sse" }, /* 345 */ { ud_itab__345, UD_TAB__OPC_SSE, "/sse" }, /* 346 */ { ud_itab__346, UD_TAB__OPC_SSE, "/sse" }, /* 347 */ { ud_itab__347, UD_TAB__OPC_SSE, "/sse" }, /* 348 */ { ud_itab__348, UD_TAB__OPC_SSE, "/sse" }, /* 349 */ { ud_itab__349, UD_TAB__OPC_SSE, "/sse" }, /* 350 */ { ud_itab__350, UD_TAB__OPC_SSE, "/sse" }, /* 351 */ { ud_itab__351, UD_TAB__OPC_SSE, "/sse" }, /* 352 */ { ud_itab__352, UD_TAB__OPC_SSE, "/sse" }, /* 353 */ { ud_itab__353, UD_TAB__OPC_SSE, "/sse" }, /* 354 */ { ud_itab__354, UD_TAB__OPC_SSE, "/sse" }, /* 355 */ { ud_itab__355, UD_TAB__OPC_SSE, "/sse" }, /* 356 */ { ud_itab__356, UD_TAB__OPC_SSE, "/sse" }, /* 357 */ { ud_itab__357, UD_TAB__OPC_SSE, "/sse" }, /* 358 */ { ud_itab__358, UD_TAB__OPC_SSE, "/sse" }, /* 359 */ { ud_itab__359, UD_TAB__OPC_SSE, "/sse" }, /* 360 */ { ud_itab__360, UD_TAB__OPC_SSE, "/sse" }, /* 361 */ { ud_itab__361, UD_TAB__OPC_SSE, "/sse" }, /* 362 */ { ud_itab__362, UD_TAB__OPC_SSE, "/sse" }, /* 363 */ { ud_itab__363, UD_TAB__OPC_SSE, "/sse" }, /* 364 */ { ud_itab__364, UD_TAB__OPC_MOD, "/mod" }, /* 365 */ { ud_itab__365, UD_TAB__OPC_REG, "/reg" }, /* 366 */ { ud_itab__366, UD_TAB__OPC_RM, "/rm" }, /* 367 */ { ud_itab__367, UD_TAB__OPC_SSE, "/sse" }, /* 368 */ { ud_itab__368, UD_TAB__OPC_MOD, "/mod" }, /* 369 */ { ud_itab__369, UD_TAB__OPC_RM, "/rm" }, /* 370 */ { ud_itab__370, UD_TAB__OPC_SSE, "/sse" }, /* 371 */ { ud_itab__371, UD_TAB__OPC_MOD, "/mod" }, /* 372 */ { ud_itab__372, UD_TAB__OPC_RM, "/rm" }, /* 373 */ { ud_itab__373, UD_TAB__OPC_SSE, "/sse" }, /* 374 */ { ud_itab__374, UD_TAB__OPC_MOD, "/mod" }, /* 375 */ { ud_itab__375, UD_TAB__OPC_MOD, "/mod" }, /* 376 */ { ud_itab__376, UD_TAB__OPC_REG, "/reg" }, /* 377 */ { ud_itab__377, UD_TAB__OPC_RM, "/rm" }, /* 378 */ { ud_itab__378, UD_TAB__OPC_SSE, "/sse" }, /* 379 */ { ud_itab__379, UD_TAB__OPC_MOD, "/mod" }, /* 380 */ { ud_itab__380, UD_TAB__OPC_RM, "/rm" }, /* 381 */ { ud_itab__381, UD_TAB__OPC_SSE, "/sse" }, /* 382 */ { ud_itab__382, UD_TAB__OPC_MOD, "/mod" }, /* 383 */ { ud_itab__383, UD_TAB__OPC_RM, "/rm" }, /* 384 */ { ud_itab__384, UD_TAB__OPC_SSE, "/sse" }, /* 385 */ { ud_itab__385, UD_TAB__OPC_MOD, "/mod" }, /* 386 */ { ud_itab__386, UD_TAB__OPC_RM, "/rm" }, /* 387 */ { ud_itab__387, UD_TAB__OPC_SSE, "/sse" }, /* 388 */ { ud_itab__388, UD_TAB__OPC_MOD, "/mod" }, /* 389 */ { ud_itab__389, UD_TAB__OPC_RM, "/rm" }, /* 390 */ { ud_itab__390, UD_TAB__OPC_SSE, "/sse" }, /* 391 */ { ud_itab__391, UD_TAB__OPC_MOD, "/mod" }, /* 392 */ { ud_itab__392, UD_TAB__OPC_RM, "/rm" }, /* 393 */ { ud_itab__393, UD_TAB__OPC_SSE, "/sse" }, /* 394 */ { ud_itab__394, UD_TAB__OPC_MOD, "/mod" }, /* 395 */ { ud_itab__395, UD_TAB__OPC_SSE, "/sse" }, /* 396 */ { ud_itab__396, UD_TAB__OPC_SSE, "/sse" }, /* 397 */ { ud_itab__397, UD_TAB__OPC_SSE, "/sse" }, /* 398 */ { ud_itab__398, UD_TAB__OPC_SSE, "/sse" }, /* 399 */ { ud_itab__399, UD_TAB__OPC_SSE, "/sse" }, /* 400 */ { ud_itab__400, UD_TAB__OPC_SSE, "/sse" }, /* 401 */ { ud_itab__401, UD_TAB__OPC_MOD, "/mod" }, /* 402 */ { ud_itab__402, UD_TAB__OPC_REG, "/reg" }, /* 403 */ { ud_itab__403, UD_TAB__OPC_SSE, "/sse" }, /* 404 */ { ud_itab__404, UD_TAB__OPC_MOD, "/mod" }, /* 405 */ { ud_itab__405, UD_TAB__OPC_SSE, "/sse" }, /* 406 */ { ud_itab__406, UD_TAB__OPC_MOD, "/mod" }, /* 407 */ { ud_itab__407, UD_TAB__OPC_SSE, "/sse" }, /* 408 */ { ud_itab__408, UD_TAB__OPC_MOD, "/mod" }, /* 409 */ { ud_itab__409, UD_TAB__OPC_SSE, "/sse" }, /* 410 */ { ud_itab__410, UD_TAB__OPC_MOD, "/mod" }, /* 411 */ { ud_itab__411, UD_TAB__OPC_SSE, "/sse" }, /* 412 */ { ud_itab__412, UD_TAB__OPC_MOD, "/mod" }, /* 413 */ { ud_itab__413, UD_TAB__OPC_SSE, "/sse" }, /* 414 */ { ud_itab__414, UD_TAB__OPC_MOD, "/mod" }, /* 415 */ { ud_itab__415, UD_TAB__OPC_SSE, "/sse" }, /* 416 */ { ud_itab__416, UD_TAB__OPC_MOD, "/mod" }, /* 417 */ { ud_itab__417, UD_TAB__OPC_REG, "/reg" }, /* 418 */ { ud_itab__418, UD_TAB__OPC_RM, "/rm" }, /* 419 */ { ud_itab__419, UD_TAB__OPC_SSE, "/sse" }, /* 420 */ { ud_itab__420, UD_TAB__OPC_MOD, "/mod" }, /* 421 */ { ud_itab__421, UD_TAB__OPC_SSE, "/sse" }, /* 422 */ { ud_itab__422, UD_TAB__OPC_MOD, "/mod" }, /* 423 */ { ud_itab__423, UD_TAB__OPC_SSE, "/sse" }, /* 424 */ { ud_itab__424, UD_TAB__OPC_MOD, "/mod" }, /* 425 */ { ud_itab__425, UD_TAB__OPC_SSE, "/sse" }, /* 426 */ { ud_itab__426, UD_TAB__OPC_MOD, "/mod" }, /* 427 */ { ud_itab__427, UD_TAB__OPC_SSE, "/sse" }, /* 428 */ { ud_itab__428, UD_TAB__OPC_MOD, "/mod" }, /* 429 */ { ud_itab__429, UD_TAB__OPC_SSE, "/sse" }, /* 430 */ { ud_itab__430, UD_TAB__OPC_MOD, "/mod" }, /* 431 */ { ud_itab__431, UD_TAB__OPC_SSE, "/sse" }, /* 432 */ { ud_itab__432, UD_TAB__OPC_MOD, "/mod" }, /* 433 */ { ud_itab__433, UD_TAB__OPC_SSE, "/sse" }, /* 434 */ { ud_itab__434, UD_TAB__OPC_MOD, "/mod" }, /* 435 */ { ud_itab__435, UD_TAB__OPC_RM, "/rm" }, /* 436 */ { ud_itab__436, UD_TAB__OPC_SSE, "/sse" }, /* 437 */ { ud_itab__437, UD_TAB__OPC_MOD, "/mod" }, /* 438 */ { ud_itab__438, UD_TAB__OPC_SSE, "/sse" }, /* 439 */ { ud_itab__439, UD_TAB__OPC_MOD, "/mod" }, /* 440 */ { ud_itab__440, UD_TAB__OPC_SSE, "/sse" }, /* 441 */ { ud_itab__441, UD_TAB__OPC_MOD, "/mod" }, /* 442 */ { ud_itab__442, UD_TAB__OPC_SSE, "/sse" }, /* 443 */ { ud_itab__443, UD_TAB__OPC_MOD, "/mod" }, /* 444 */ { ud_itab__444, UD_TAB__OPC_SSE, "/sse" }, /* 445 */ { ud_itab__445, UD_TAB__OPC_MOD, "/mod" }, /* 446 */ { ud_itab__446, UD_TAB__OPC_SSE, "/sse" }, /* 447 */ { ud_itab__447, UD_TAB__OPC_MOD, "/mod" }, /* 448 */ { ud_itab__448, UD_TAB__OPC_SSE, "/sse" }, /* 449 */ { ud_itab__449, UD_TAB__OPC_MOD, "/mod" }, /* 450 */ { ud_itab__450, UD_TAB__OPC_SSE, "/sse" }, /* 451 */ { ud_itab__451, UD_TAB__OPC_MOD, "/mod" }, /* 452 */ { ud_itab__452, UD_TAB__OPC_RM, "/rm" }, /* 453 */ { ud_itab__453, UD_TAB__OPC_SSE, "/sse" }, /* 454 */ { ud_itab__454, UD_TAB__OPC_MOD, "/mod" }, /* 455 */ { ud_itab__455, UD_TAB__OPC_SSE, "/sse" }, /* 456 */ { ud_itab__456, UD_TAB__OPC_MOD, "/mod" }, /* 457 */ { ud_itab__457, UD_TAB__OPC_SSE, "/sse" }, /* 458 */ { ud_itab__458, UD_TAB__OPC_MOD, "/mod" }, /* 459 */ { ud_itab__459, UD_TAB__OPC_SSE, "/sse" }, /* 460 */ { ud_itab__460, UD_TAB__OPC_MOD, "/mod" }, /* 461 */ { ud_itab__461, UD_TAB__OPC_SSE, "/sse" }, /* 462 */ { ud_itab__462, UD_TAB__OPC_MOD, "/mod" }, /* 463 */ { ud_itab__463, UD_TAB__OPC_SSE, "/sse" }, /* 464 */ { ud_itab__464, UD_TAB__OPC_MOD, "/mod" }, /* 465 */ { ud_itab__465, UD_TAB__OPC_SSE, "/sse" }, /* 466 */ { ud_itab__466, UD_TAB__OPC_MOD, "/mod" }, /* 467 */ { ud_itab__467, UD_TAB__OPC_SSE, "/sse" }, /* 468 */ { ud_itab__468, UD_TAB__OPC_MOD, "/mod" }, /* 469 */ { ud_itab__469, UD_TAB__OPC_SSE, "/sse" }, /* 470 */ { ud_itab__470, UD_TAB__OPC_SSE, "/sse" }, /* 471 */ { ud_itab__471, UD_TAB__OPC_SSE, "/sse" }, /* 472 */ { ud_itab__472, UD_TAB__OPC_SSE, "/sse" }, /* 473 */ { ud_itab__473, UD_TAB__OPC_SSE, "/sse" }, /* 474 */ { ud_itab__474, UD_TAB__OPC_SSE, "/sse" }, /* 475 */ { ud_itab__475, UD_TAB__OPC_SSE, "/sse" }, /* 476 */ { ud_itab__476, UD_TAB__OPC_SSE, "/sse" }, /* 477 */ { ud_itab__477, UD_TAB__OPC_SSE, "/sse" }, /* 478 */ { ud_itab__478, UD_TAB__OPC_SSE, "/sse" }, /* 479 */ { ud_itab__479, UD_TAB__OPC_REG, "/reg" }, /* 480 */ { ud_itab__480, UD_TAB__OPC_SSE, "/sse" }, /* 481 */ { ud_itab__481, UD_TAB__OPC_SSE, "/sse" }, /* 482 */ { ud_itab__482, UD_TAB__OPC_SSE, "/sse" }, /* 483 */ { ud_itab__483, UD_TAB__OPC_SSE, "/sse" }, /* 484 */ { ud_itab__484, UD_TAB__OPC_SSE, "/sse" }, /* 485 */ { ud_itab__485, UD_TAB__OPC_SSE, "/sse" }, /* 486 */ { ud_itab__486, UD_TAB__OPC_SSE, "/sse" }, /* 487 */ { ud_itab__487, UD_TAB__OPC_SSE, "/sse" }, /* 488 */ { ud_itab__488, UD_TAB__OPC_SSE, "/sse" }, /* 489 */ { ud_itab__489, UD_TAB__OPC_SSE, "/sse" }, /* 490 */ { ud_itab__490, UD_TAB__OPC_SSE, "/sse" }, /* 491 */ { ud_itab__491, UD_TAB__OPC_SSE, "/sse" }, /* 492 */ { ud_itab__492, UD_TAB__OPC_SSE, "/sse" }, /* 493 */ { ud_itab__493, UD_TAB__OPC_SSE, "/sse" }, /* 494 */ { ud_itab__494, UD_TAB__OPC_SSE, "/sse" }, /* 495 */ { ud_itab__495, UD_TAB__OPC_SSE, "/sse" }, /* 496 */ { ud_itab__496, UD_TAB__OPC_REG, "/reg" }, /* 497 */ { ud_itab__497, UD_TAB__OPC_SSE, "/sse" }, /* 498 */ { ud_itab__498, UD_TAB__OPC_OSIZE, "/o" }, /* 499 */ { ud_itab__499, UD_TAB__OPC_SSE, "/sse" }, /* 500 */ { ud_itab__500, UD_TAB__OPC_VENDOR, "intel" }, /* 501 */ { ud_itab__501, UD_TAB__OPC_VENDOR, "intel" }, /* 502 */ { ud_itab__502, UD_TAB__OPC_VENDOR, "intel" }, /* 503 */ { ud_itab__503, UD_TAB__OPC_SSE, "/sse" }, /* 504 */ { ud_itab__504, UD_TAB__OPC_VENDOR, "intel" }, /* 505 */ { ud_itab__505, UD_TAB__OPC_SSE, "/sse" }, /* 506 */ { ud_itab__506, UD_TAB__OPC_SSE, "/sse" }, /* 507 */ { ud_itab__507, UD_TAB__OPC_SSE, "/sse" }, /* 508 */ { ud_itab__508, UD_TAB__OPC_SSE, "/sse" }, /* 509 */ { ud_itab__509, UD_TAB__OPC_SSE, "/sse" }, /* 510 */ { ud_itab__510, UD_TAB__OPC_SSE, "/sse" }, /* 511 */ { ud_itab__511, UD_TAB__OPC_SSE, "/sse" }, /* 512 */ { ud_itab__512, UD_TAB__OPC_SSE, "/sse" }, /* 513 */ { ud_itab__513, UD_TAB__OPC_SSE, "/sse" }, /* 514 */ { ud_itab__514, UD_TAB__OPC_SSE, "/sse" }, /* 515 */ { ud_itab__515, UD_TAB__OPC_SSE, "/sse" }, /* 516 */ { ud_itab__516, UD_TAB__OPC_SSE, "/sse" }, /* 517 */ { ud_itab__517, UD_TAB__OPC_SSE, "/sse" }, /* 518 */ { ud_itab__518, UD_TAB__OPC_SSE, "/sse" }, /* 519 */ { ud_itab__519, UD_TAB__OPC_SSE, "/sse" }, /* 520 */ { ud_itab__520, UD_TAB__OPC_SSE, "/sse" }, /* 521 */ { ud_itab__521, UD_TAB__OPC_SSE, "/sse" }, /* 522 */ { ud_itab__522, UD_TAB__OPC_SSE, "/sse" }, /* 523 */ { ud_itab__523, UD_TAB__OPC_SSE, "/sse" }, /* 524 */ { ud_itab__524, UD_TAB__OPC_SSE, "/sse" }, /* 525 */ { ud_itab__525, UD_TAB__OPC_SSE, "/sse" }, /* 526 */ { ud_itab__526, UD_TAB__OPC_SSE, "/sse" }, /* 527 */ { ud_itab__527, UD_TAB__OPC_SSE, "/sse" }, /* 528 */ { ud_itab__528, UD_TAB__OPC_SSE, "/sse" }, /* 529 */ { ud_itab__529, UD_TAB__OPC_SSE, "/sse" }, /* 530 */ { ud_itab__530, UD_TAB__OPC_SSE, "/sse" }, /* 531 */ { ud_itab__531, UD_TAB__OPC_SSE, "/sse" }, /* 532 */ { ud_itab__532, UD_TAB__OPC_SSE, "/sse" }, /* 533 */ { ud_itab__533, UD_TAB__OPC_SSE, "/sse" }, /* 534 */ { ud_itab__534, UD_TAB__OPC_SSE, "/sse" }, /* 535 */ { ud_itab__535, UD_TAB__OPC_SSE, "/sse" }, /* 536 */ { ud_itab__536, UD_TAB__OPC_SSE, "/sse" }, /* 537 */ { ud_itab__537, UD_TAB__OPC_SSE, "/sse" }, /* 538 */ { ud_itab__538, UD_TAB__OPC_SSE, "/sse" }, /* 539 */ { ud_itab__539, UD_TAB__OPC_SSE, "/sse" }, /* 540 */ { ud_itab__540, UD_TAB__OPC_SSE, "/sse" }, /* 541 */ { ud_itab__541, UD_TAB__OPC_SSE, "/sse" }, /* 542 */ { ud_itab__542, UD_TAB__OPC_SSE, "/sse" }, /* 543 */ { ud_itab__543, UD_TAB__OPC_SSE, "/sse" }, /* 544 */ { ud_itab__544, UD_TAB__OPC_SSE, "/sse" }, /* 545 */ { ud_itab__545, UD_TAB__OPC_SSE, "/sse" }, /* 546 */ { ud_itab__546, UD_TAB__OPC_SSE, "/sse" }, /* 547 */ { ud_itab__547, UD_TAB__OPC_SSE, "/sse" }, /* 548 */ { ud_itab__548, UD_TAB__OPC_SSE, "/sse" }, /* 549 */ { ud_itab__549, UD_TAB__OPC_SSE, "/sse" }, /* 550 */ { ud_itab__550, UD_TAB__OPC_SSE, "/sse" }, /* 551 */ { ud_itab__551, UD_TAB__OPC_SSE, "/sse" }, /* 552 */ { ud_itab__552, UD_TAB__OPC_MOD, "/mod" }, /* 553 */ { ud_itab__553, UD_TAB__OPC_SSE, "/sse" }, /* 554 */ { ud_itab__554, UD_TAB__OPC_MOD, "/mod" }, /* 555 */ { ud_itab__555, UD_TAB__OPC_MOD, "/mod" }, /* 556 */ { ud_itab__556, UD_TAB__OPC_SSE, "/sse" }, /* 557 */ { ud_itab__557, UD_TAB__OPC_SSE, "/sse" }, /* 558 */ { ud_itab__558, UD_TAB__OPC_SSE, "/sse" }, /* 559 */ { ud_itab__559, UD_TAB__OPC_SSE, "/sse" }, /* 560 */ { ud_itab__560, UD_TAB__OPC_SSE, "/sse" }, /* 561 */ { ud_itab__561, UD_TAB__OPC_SSE, "/sse" }, /* 562 */ { ud_itab__562, UD_TAB__OPC_SSE, "/sse" }, /* 563 */ { ud_itab__563, UD_TAB__OPC_MODE, "/m" }, /* 564 */ { ud_itab__564, UD_TAB__OPC_MODE, "/m" }, /* 565 */ { ud_itab__565, UD_TAB__OPC_MODE, "/m" }, /* 566 */ { ud_itab__566, UD_TAB__OPC_MODE, "/m" }, /* 567 */ { ud_itab__567, UD_TAB__OPC_MODE, "/m" }, /* 568 */ { ud_itab__568, UD_TAB__OPC_MODE, "/m" }, /* 569 */ { ud_itab__569, UD_TAB__OPC_MODE, "/m" }, /* 570 */ { ud_itab__570, UD_TAB__OPC_MODE, "/m" }, /* 571 */ { ud_itab__571, UD_TAB__OPC_OSIZE, "/o" }, /* 572 */ { ud_itab__572, UD_TAB__OPC_MODE, "/m" }, /* 573 */ { ud_itab__573, UD_TAB__OPC_MODE, "/m" }, /* 574 */ { ud_itab__574, UD_TAB__OPC_OSIZE, "/o" }, /* 575 */ { ud_itab__575, UD_TAB__OPC_MODE, "/m" }, /* 576 */ { ud_itab__576, UD_TAB__OPC_MODE, "/m" }, /* 577 */ { ud_itab__577, UD_TAB__OPC_MODE, "/m" }, /* 578 */ { ud_itab__578, UD_TAB__OPC_MODE, "/m" }, /* 579 */ { ud_itab__579, UD_TAB__OPC_OSIZE, "/o" }, /* 580 */ { ud_itab__580, UD_TAB__OPC_OSIZE, "/o" }, /* 581 */ { ud_itab__581, UD_TAB__OPC_REG, "/reg" }, /* 582 */ { ud_itab__582, UD_TAB__OPC_REG, "/reg" }, /* 583 */ { ud_itab__583, UD_TAB__OPC_REG, "/reg" }, /* 584 */ { ud_itab__584, UD_TAB__OPC_MODE, "/m" }, /* 585 */ { ud_itab__585, UD_TAB__OPC_MODE, "/m" }, /* 586 */ { ud_itab__586, UD_TAB__OPC_MODE, "/m" }, /* 587 */ { ud_itab__587, UD_TAB__OPC_MODE, "/m" }, /* 588 */ { ud_itab__588, UD_TAB__OPC_MODE, "/m" }, /* 589 */ { ud_itab__589, UD_TAB__OPC_MODE, "/m" }, /* 590 */ { ud_itab__590, UD_TAB__OPC_MODE, "/m" }, /* 591 */ { ud_itab__591, UD_TAB__OPC_MODE, "/m" }, /* 592 */ { ud_itab__592, UD_TAB__OPC_REG, "/reg" }, /* 593 */ { ud_itab__593, UD_TAB__OPC_REG, "/reg" }, /* 594 */ { ud_itab__594, UD_TAB__OPC_OSIZE, "/o" }, /* 595 */ { ud_itab__595, UD_TAB__OPC_OSIZE, "/o" }, /* 596 */ { ud_itab__596, UD_TAB__OPC_MODE, "/m" }, /* 597 */ { ud_itab__597, UD_TAB__OPC_OSIZE, "/o" }, /* 598 */ { ud_itab__598, UD_TAB__OPC_MODE, "/m" }, /* 599 */ { ud_itab__599, UD_TAB__OPC_MODE, "/m" }, /* 600 */ { ud_itab__600, UD_TAB__OPC_MODE, "/m" }, /* 601 */ { ud_itab__601, UD_TAB__OPC_OSIZE, "/o" }, /* 602 */ { ud_itab__602, UD_TAB__OPC_MODE, "/m" }, /* 603 */ { ud_itab__603, UD_TAB__OPC_MODE, "/m" }, /* 604 */ { ud_itab__604, UD_TAB__OPC_MODE, "/m" }, /* 605 */ { ud_itab__605, UD_TAB__OPC_OSIZE, "/o" }, /* 606 */ { ud_itab__606, UD_TAB__OPC_OSIZE, "/o" }, /* 607 */ { ud_itab__607, UD_TAB__OPC_OSIZE, "/o" }, /* 608 */ { ud_itab__608, UD_TAB__OPC_OSIZE, "/o" }, /* 609 */ { ud_itab__609, UD_TAB__OPC_OSIZE, "/o" }, /* 610 */ { ud_itab__610, UD_TAB__OPC_REG, "/reg" }, /* 611 */ { ud_itab__611, UD_TAB__OPC_REG, "/reg" }, /* 612 */ { ud_itab__612, UD_TAB__OPC_MODE, "/m" }, /* 613 */ { ud_itab__613, UD_TAB__OPC_MODE, "/m" }, /* 614 */ { ud_itab__614, UD_TAB__OPC_REG, "/reg" }, /* 615 */ { ud_itab__615, UD_TAB__OPC_REG, "/reg" }, /* 616 */ { ud_itab__616, UD_TAB__OPC_MODE, "/m" }, /* 617 */ { ud_itab__617, UD_TAB__OPC_OSIZE, "/o" }, /* 618 */ { ud_itab__618, UD_TAB__OPC_REG, "/reg" }, /* 619 */ { ud_itab__619, UD_TAB__OPC_REG, "/reg" }, /* 620 */ { ud_itab__620, UD_TAB__OPC_REG, "/reg" }, /* 621 */ { ud_itab__621, UD_TAB__OPC_REG, "/reg" }, /* 622 */ { ud_itab__622, UD_TAB__OPC_MODE, "/m" }, /* 623 */ { ud_itab__623, UD_TAB__OPC_MODE, "/m" }, /* 624 */ { ud_itab__624, UD_TAB__OPC_MODE, "/m" }, /* 625 */ { ud_itab__625, UD_TAB__OPC_MOD, "/mod" }, /* 626 */ { ud_itab__626, UD_TAB__OPC_REG, "/reg" }, /* 627 */ { ud_itab__627, UD_TAB__OPC_MOD, "/mod" }, /* 628 */ { ud_itab__628, UD_TAB__OPC_MOD, "/mod" }, /* 629 */ { ud_itab__629, UD_TAB__OPC_MOD, "/mod" }, /* 630 */ { ud_itab__630, UD_TAB__OPC_MOD, "/mod" }, /* 631 */ { ud_itab__631, UD_TAB__OPC_MOD, "/mod" }, /* 632 */ { ud_itab__632, UD_TAB__OPC_MOD, "/mod" }, /* 633 */ { ud_itab__633, UD_TAB__OPC_MOD, "/mod" }, /* 634 */ { ud_itab__634, UD_TAB__OPC_MOD, "/mod" }, /* 635 */ { ud_itab__635, UD_TAB__OPC_X87, "/x87" }, /* 636 */ { ud_itab__636, UD_TAB__OPC_MOD, "/mod" }, /* 637 */ { ud_itab__637, UD_TAB__OPC_MOD, "/mod" }, /* 638 */ { ud_itab__638, UD_TAB__OPC_MOD, "/mod" }, /* 639 */ { ud_itab__639, UD_TAB__OPC_MOD, "/mod" }, /* 640 */ { ud_itab__640, UD_TAB__OPC_MOD, "/mod" }, /* 641 */ { ud_itab__641, UD_TAB__OPC_MOD, "/mod" }, /* 642 */ { ud_itab__642, UD_TAB__OPC_MOD, "/mod" }, /* 643 */ { ud_itab__643, UD_TAB__OPC_MOD, "/mod" }, /* 644 */ { ud_itab__644, UD_TAB__OPC_MOD, "/mod" }, /* 645 */ { ud_itab__645, UD_TAB__OPC_MOD, "/mod" }, /* 646 */ { ud_itab__646, UD_TAB__OPC_MOD, "/mod" }, /* 647 */ { ud_itab__647, UD_TAB__OPC_MOD, "/mod" }, /* 648 */ { ud_itab__648, UD_TAB__OPC_MOD, "/mod" }, /* 649 */ { ud_itab__649, UD_TAB__OPC_MOD, "/mod" }, /* 650 */ { ud_itab__650, UD_TAB__OPC_MOD, "/mod" }, /* 651 */ { ud_itab__651, UD_TAB__OPC_MOD, "/mod" }, /* 652 */ { ud_itab__652, UD_TAB__OPC_MOD, "/mod" }, /* 653 */ { ud_itab__653, UD_TAB__OPC_MOD, "/mod" }, /* 654 */ { ud_itab__654, UD_TAB__OPC_MOD, "/mod" }, /* 655 */ { ud_itab__655, UD_TAB__OPC_MOD, "/mod" }, /* 656 */ { ud_itab__656, UD_TAB__OPC_MOD, "/mod" }, /* 657 */ { ud_itab__657, UD_TAB__OPC_MOD, "/mod" }, /* 658 */ { ud_itab__658, UD_TAB__OPC_MOD, "/mod" }, /* 659 */ { ud_itab__659, UD_TAB__OPC_MOD, "/mod" }, /* 660 */ { ud_itab__660, UD_TAB__OPC_MOD, "/mod" }, /* 661 */ { ud_itab__661, UD_TAB__OPC_MOD, "/mod" }, /* 662 */ { ud_itab__662, UD_TAB__OPC_MOD, "/mod" }, /* 663 */ { ud_itab__663, UD_TAB__OPC_MOD, "/mod" }, /* 664 */ { ud_itab__664, UD_TAB__OPC_MOD, "/mod" }, /* 665 */ { ud_itab__665, UD_TAB__OPC_MOD, "/mod" }, /* 666 */ { ud_itab__666, UD_TAB__OPC_MOD, "/mod" }, /* 667 */ { ud_itab__667, UD_TAB__OPC_MOD, "/mod" }, /* 668 */ { ud_itab__668, UD_TAB__OPC_MOD, "/mod" }, /* 669 */ { ud_itab__669, UD_TAB__OPC_MOD, "/mod" }, /* 670 */ { ud_itab__670, UD_TAB__OPC_MOD, "/mod" }, /* 671 */ { ud_itab__671, UD_TAB__OPC_MOD, "/mod" }, /* 672 */ { ud_itab__672, UD_TAB__OPC_MOD, "/mod" }, /* 673 */ { ud_itab__673, UD_TAB__OPC_MOD, "/mod" }, /* 674 */ { ud_itab__674, UD_TAB__OPC_MOD, "/mod" }, /* 675 */ { ud_itab__675, UD_TAB__OPC_MOD, "/mod" }, /* 676 */ { ud_itab__676, UD_TAB__OPC_MOD, "/mod" }, /* 677 */ { ud_itab__677, UD_TAB__OPC_MOD, "/mod" }, /* 678 */ { ud_itab__678, UD_TAB__OPC_MOD, "/mod" }, /* 679 */ { ud_itab__679, UD_TAB__OPC_MOD, "/mod" }, /* 680 */ { ud_itab__680, UD_TAB__OPC_MOD, "/mod" }, /* 681 */ { ud_itab__681, UD_TAB__OPC_MOD, "/mod" }, /* 682 */ { ud_itab__682, UD_TAB__OPC_MOD, "/mod" }, /* 683 */ { ud_itab__683, UD_TAB__OPC_MOD, "/mod" }, /* 684 */ { ud_itab__684, UD_TAB__OPC_MOD, "/mod" }, /* 685 */ { ud_itab__685, UD_TAB__OPC_MOD, "/mod" }, /* 686 */ { ud_itab__686, UD_TAB__OPC_MOD, "/mod" }, /* 687 */ { ud_itab__687, UD_TAB__OPC_MOD, "/mod" }, /* 688 */ { ud_itab__688, UD_TAB__OPC_MOD, "/mod" }, /* 689 */ { ud_itab__689, UD_TAB__OPC_MOD, "/mod" }, /* 690 */ { ud_itab__690, UD_TAB__OPC_MOD, "/mod" }, /* 691 */ { ud_itab__691, UD_TAB__OPC_MOD, "/mod" }, /* 692 */ { ud_itab__692, UD_TAB__OPC_MOD, "/mod" }, /* 693 */ { ud_itab__693, UD_TAB__OPC_MOD, "/mod" }, /* 694 */ { ud_itab__694, UD_TAB__OPC_MOD, "/mod" }, /* 695 */ { ud_itab__695, UD_TAB__OPC_MOD, "/mod" }, /* 696 */ { ud_itab__696, UD_TAB__OPC_MOD, "/mod" }, /* 697 */ { ud_itab__697, UD_TAB__OPC_MOD, "/mod" }, /* 698 */ { ud_itab__698, UD_TAB__OPC_MOD, "/mod" }, /* 699 */ { ud_itab__699, UD_TAB__OPC_MOD, "/mod" }, /* 700 */ { ud_itab__700, UD_TAB__OPC_MOD, "/mod" }, /* 701 */ { ud_itab__701, UD_TAB__OPC_REG, "/reg" }, /* 702 */ { ud_itab__702, UD_TAB__OPC_MOD, "/mod" }, /* 703 */ { ud_itab__703, UD_TAB__OPC_MOD, "/mod" }, /* 704 */ { ud_itab__704, UD_TAB__OPC_MOD, "/mod" }, /* 705 */ { ud_itab__705, UD_TAB__OPC_MOD, "/mod" }, /* 706 */ { ud_itab__706, UD_TAB__OPC_MOD, "/mod" }, /* 707 */ { ud_itab__707, UD_TAB__OPC_MOD, "/mod" }, /* 708 */ { ud_itab__708, UD_TAB__OPC_MOD, "/mod" }, /* 709 */ { ud_itab__709, UD_TAB__OPC_X87, "/x87" }, /* 710 */ { ud_itab__710, UD_TAB__OPC_MOD, "/mod" }, /* 711 */ { ud_itab__711, UD_TAB__OPC_MOD, "/mod" }, /* 712 */ { ud_itab__712, UD_TAB__OPC_MOD, "/mod" }, /* 713 */ { ud_itab__713, UD_TAB__OPC_MOD, "/mod" }, /* 714 */ { ud_itab__714, UD_TAB__OPC_MOD, "/mod" }, /* 715 */ { ud_itab__715, UD_TAB__OPC_MOD, "/mod" }, /* 716 */ { ud_itab__716, UD_TAB__OPC_MOD, "/mod" }, /* 717 */ { ud_itab__717, UD_TAB__OPC_MOD, "/mod" }, /* 718 */ { ud_itab__718, UD_TAB__OPC_MOD, "/mod" }, /* 719 */ { ud_itab__719, UD_TAB__OPC_MOD, "/mod" }, /* 720 */ { ud_itab__720, UD_TAB__OPC_MOD, "/mod" }, /* 721 */ { ud_itab__721, UD_TAB__OPC_MOD, "/mod" }, /* 722 */ { ud_itab__722, UD_TAB__OPC_MOD, "/mod" }, /* 723 */ { ud_itab__723, UD_TAB__OPC_MOD, "/mod" }, /* 724 */ { ud_itab__724, UD_TAB__OPC_MOD, "/mod" }, /* 725 */ { ud_itab__725, UD_TAB__OPC_MOD, "/mod" }, /* 726 */ { ud_itab__726, UD_TAB__OPC_MOD, "/mod" }, /* 727 */ { ud_itab__727, UD_TAB__OPC_MOD, "/mod" }, /* 728 */ { ud_itab__728, UD_TAB__OPC_MOD, "/mod" }, /* 729 */ { ud_itab__729, UD_TAB__OPC_MOD, "/mod" }, /* 730 */ { ud_itab__730, UD_TAB__OPC_MOD, "/mod" }, /* 731 */ { ud_itab__731, UD_TAB__OPC_MOD, "/mod" }, /* 732 */ { ud_itab__732, UD_TAB__OPC_MOD, "/mod" }, /* 733 */ { ud_itab__733, UD_TAB__OPC_MOD, "/mod" }, /* 734 */ { ud_itab__734, UD_TAB__OPC_MOD, "/mod" }, /* 735 */ { ud_itab__735, UD_TAB__OPC_MOD, "/mod" }, /* 736 */ { ud_itab__736, UD_TAB__OPC_MOD, "/mod" }, /* 737 */ { ud_itab__737, UD_TAB__OPC_MOD, "/mod" }, /* 738 */ { ud_itab__738, UD_TAB__OPC_MOD, "/mod" }, /* 739 */ { ud_itab__739, UD_TAB__OPC_MOD, "/mod" }, /* 740 */ { ud_itab__740, UD_TAB__OPC_MOD, "/mod" }, /* 741 */ { ud_itab__741, UD_TAB__OPC_MOD, "/mod" }, /* 742 */ { ud_itab__742, UD_TAB__OPC_MOD, "/mod" }, /* 743 */ { ud_itab__743, UD_TAB__OPC_MOD, "/mod" }, /* 744 */ { ud_itab__744, UD_TAB__OPC_MOD, "/mod" }, /* 745 */ { ud_itab__745, UD_TAB__OPC_MOD, "/mod" }, /* 746 */ { ud_itab__746, UD_TAB__OPC_MOD, "/mod" }, /* 747 */ { ud_itab__747, UD_TAB__OPC_MOD, "/mod" }, /* 748 */ { ud_itab__748, UD_TAB__OPC_MOD, "/mod" }, /* 749 */ { ud_itab__749, UD_TAB__OPC_MOD, "/mod" }, /* 750 */ { ud_itab__750, UD_TAB__OPC_MOD, "/mod" }, /* 751 */ { ud_itab__751, UD_TAB__OPC_MOD, "/mod" }, /* 752 */ { ud_itab__752, UD_TAB__OPC_MOD, "/mod" }, /* 753 */ { ud_itab__753, UD_TAB__OPC_MOD, "/mod" }, /* 754 */ { ud_itab__754, UD_TAB__OPC_MOD, "/mod" }, /* 755 */ { ud_itab__755, UD_TAB__OPC_MOD, "/mod" }, /* 756 */ { ud_itab__756, UD_TAB__OPC_MOD, "/mod" }, /* 757 */ { ud_itab__757, UD_TAB__OPC_MOD, "/mod" }, /* 758 */ { ud_itab__758, UD_TAB__OPC_MOD, "/mod" }, /* 759 */ { ud_itab__759, UD_TAB__OPC_MOD, "/mod" }, /* 760 */ { ud_itab__760, UD_TAB__OPC_MOD, "/mod" }, /* 761 */ { ud_itab__761, UD_TAB__OPC_MOD, "/mod" }, /* 762 */ { ud_itab__762, UD_TAB__OPC_MOD, "/mod" }, /* 763 */ { ud_itab__763, UD_TAB__OPC_REG, "/reg" }, /* 764 */ { ud_itab__764, UD_TAB__OPC_MOD, "/mod" }, /* 765 */ { ud_itab__765, UD_TAB__OPC_MOD, "/mod" }, /* 766 */ { ud_itab__766, UD_TAB__OPC_MOD, "/mod" }, /* 767 */ { ud_itab__767, UD_TAB__OPC_MOD, "/mod" }, /* 768 */ { ud_itab__768, UD_TAB__OPC_MOD, "/mod" }, /* 769 */ { ud_itab__769, UD_TAB__OPC_MOD, "/mod" }, /* 770 */ { ud_itab__770, UD_TAB__OPC_MOD, "/mod" }, /* 771 */ { ud_itab__771, UD_TAB__OPC_MOD, "/mod" }, /* 772 */ { ud_itab__772, UD_TAB__OPC_X87, "/x87" }, /* 773 */ { ud_itab__773, UD_TAB__OPC_MOD, "/mod" }, /* 774 */ { ud_itab__774, UD_TAB__OPC_MOD, "/mod" }, /* 775 */ { ud_itab__775, UD_TAB__OPC_MOD, "/mod" }, /* 776 */ { ud_itab__776, UD_TAB__OPC_MOD, "/mod" }, /* 777 */ { ud_itab__777, UD_TAB__OPC_MOD, "/mod" }, /* 778 */ { ud_itab__778, UD_TAB__OPC_MOD, "/mod" }, /* 779 */ { ud_itab__779, UD_TAB__OPC_MOD, "/mod" }, /* 780 */ { ud_itab__780, UD_TAB__OPC_MOD, "/mod" }, /* 781 */ { ud_itab__781, UD_TAB__OPC_MOD, "/mod" }, /* 782 */ { ud_itab__782, UD_TAB__OPC_MOD, "/mod" }, /* 783 */ { ud_itab__783, UD_TAB__OPC_MOD, "/mod" }, /* 784 */ { ud_itab__784, UD_TAB__OPC_MOD, "/mod" }, /* 785 */ { ud_itab__785, UD_TAB__OPC_MOD, "/mod" }, /* 786 */ { ud_itab__786, UD_TAB__OPC_MOD, "/mod" }, /* 787 */ { ud_itab__787, UD_TAB__OPC_MOD, "/mod" }, /* 788 */ { ud_itab__788, UD_TAB__OPC_MOD, "/mod" }, /* 789 */ { ud_itab__789, UD_TAB__OPC_MOD, "/mod" }, /* 790 */ { ud_itab__790, UD_TAB__OPC_MOD, "/mod" }, /* 791 */ { ud_itab__791, UD_TAB__OPC_MOD, "/mod" }, /* 792 */ { ud_itab__792, UD_TAB__OPC_MOD, "/mod" }, /* 793 */ { ud_itab__793, UD_TAB__OPC_MOD, "/mod" }, /* 794 */ { ud_itab__794, UD_TAB__OPC_MOD, "/mod" }, /* 795 */ { ud_itab__795, UD_TAB__OPC_MOD, "/mod" }, /* 796 */ { ud_itab__796, UD_TAB__OPC_MOD, "/mod" }, /* 797 */ { ud_itab__797, UD_TAB__OPC_MOD, "/mod" }, /* 798 */ { ud_itab__798, UD_TAB__OPC_MOD, "/mod" }, /* 799 */ { ud_itab__799, UD_TAB__OPC_MOD, "/mod" }, /* 800 */ { ud_itab__800, UD_TAB__OPC_MOD, "/mod" }, /* 801 */ { ud_itab__801, UD_TAB__OPC_MOD, "/mod" }, /* 802 */ { ud_itab__802, UD_TAB__OPC_MOD, "/mod" }, /* 803 */ { ud_itab__803, UD_TAB__OPC_MOD, "/mod" }, /* 804 */ { ud_itab__804, UD_TAB__OPC_MOD, "/mod" }, /* 805 */ { ud_itab__805, UD_TAB__OPC_MOD, "/mod" }, /* 806 */ { ud_itab__806, UD_TAB__OPC_MOD, "/mod" }, /* 807 */ { ud_itab__807, UD_TAB__OPC_REG, "/reg" }, /* 808 */ { ud_itab__808, UD_TAB__OPC_MOD, "/mod" }, /* 809 */ { ud_itab__809, UD_TAB__OPC_MOD, "/mod" }, /* 810 */ { ud_itab__810, UD_TAB__OPC_MOD, "/mod" }, /* 811 */ { ud_itab__811, UD_TAB__OPC_MOD, "/mod" }, /* 812 */ { ud_itab__812, UD_TAB__OPC_MOD, "/mod" }, /* 813 */ { ud_itab__813, UD_TAB__OPC_MOD, "/mod" }, /* 814 */ { ud_itab__814, UD_TAB__OPC_X87, "/x87" }, /* 815 */ { ud_itab__815, UD_TAB__OPC_MOD, "/mod" }, /* 816 */ { ud_itab__816, UD_TAB__OPC_MOD, "/mod" }, /* 817 */ { ud_itab__817, UD_TAB__OPC_MOD, "/mod" }, /* 818 */ { ud_itab__818, UD_TAB__OPC_MOD, "/mod" }, /* 819 */ { ud_itab__819, UD_TAB__OPC_MOD, "/mod" }, /* 820 */ { ud_itab__820, UD_TAB__OPC_MOD, "/mod" }, /* 821 */ { ud_itab__821, UD_TAB__OPC_MOD, "/mod" }, /* 822 */ { ud_itab__822, UD_TAB__OPC_MOD, "/mod" }, /* 823 */ { ud_itab__823, UD_TAB__OPC_MOD, "/mod" }, /* 824 */ { ud_itab__824, UD_TAB__OPC_MOD, "/mod" }, /* 825 */ { ud_itab__825, UD_TAB__OPC_MOD, "/mod" }, /* 826 */ { ud_itab__826, UD_TAB__OPC_MOD, "/mod" }, /* 827 */ { ud_itab__827, UD_TAB__OPC_MOD, "/mod" }, /* 828 */ { ud_itab__828, UD_TAB__OPC_MOD, "/mod" }, /* 829 */ { ud_itab__829, UD_TAB__OPC_MOD, "/mod" }, /* 830 */ { ud_itab__830, UD_TAB__OPC_MOD, "/mod" }, /* 831 */ { ud_itab__831, UD_TAB__OPC_MOD, "/mod" }, /* 832 */ { ud_itab__832, UD_TAB__OPC_MOD, "/mod" }, /* 833 */ { ud_itab__833, UD_TAB__OPC_MOD, "/mod" }, /* 834 */ { ud_itab__834, UD_TAB__OPC_MOD, "/mod" }, /* 835 */ { ud_itab__835, UD_TAB__OPC_MOD, "/mod" }, /* 836 */ { ud_itab__836, UD_TAB__OPC_MOD, "/mod" }, /* 837 */ { ud_itab__837, UD_TAB__OPC_MOD, "/mod" }, /* 838 */ { ud_itab__838, UD_TAB__OPC_MOD, "/mod" }, /* 839 */ { ud_itab__839, UD_TAB__OPC_MOD, "/mod" }, /* 840 */ { ud_itab__840, UD_TAB__OPC_MOD, "/mod" }, /* 841 */ { ud_itab__841, UD_TAB__OPC_MOD, "/mod" }, /* 842 */ { ud_itab__842, UD_TAB__OPC_MOD, "/mod" }, /* 843 */ { ud_itab__843, UD_TAB__OPC_MOD, "/mod" }, /* 844 */ { ud_itab__844, UD_TAB__OPC_MOD, "/mod" }, /* 845 */ { ud_itab__845, UD_TAB__OPC_MOD, "/mod" }, /* 846 */ { ud_itab__846, UD_TAB__OPC_MOD, "/mod" }, /* 847 */ { ud_itab__847, UD_TAB__OPC_MOD, "/mod" }, /* 848 */ { ud_itab__848, UD_TAB__OPC_MOD, "/mod" }, /* 849 */ { ud_itab__849, UD_TAB__OPC_MOD, "/mod" }, /* 850 */ { ud_itab__850, UD_TAB__OPC_MOD, "/mod" }, /* 851 */ { ud_itab__851, UD_TAB__OPC_MOD, "/mod" }, /* 852 */ { ud_itab__852, UD_TAB__OPC_MOD, "/mod" }, /* 853 */ { ud_itab__853, UD_TAB__OPC_MOD, "/mod" }, /* 854 */ { ud_itab__854, UD_TAB__OPC_MOD, "/mod" }, /* 855 */ { ud_itab__855, UD_TAB__OPC_MOD, "/mod" }, /* 856 */ { ud_itab__856, UD_TAB__OPC_MOD, "/mod" }, /* 857 */ { ud_itab__857, UD_TAB__OPC_MOD, "/mod" }, /* 858 */ { ud_itab__858, UD_TAB__OPC_MOD, "/mod" }, /* 859 */ { ud_itab__859, UD_TAB__OPC_MOD, "/mod" }, /* 860 */ { ud_itab__860, UD_TAB__OPC_MOD, "/mod" }, /* 861 */ { ud_itab__861, UD_TAB__OPC_MOD, "/mod" }, /* 862 */ { ud_itab__862, UD_TAB__OPC_MOD, "/mod" }, /* 863 */ { ud_itab__863, UD_TAB__OPC_MOD, "/mod" }, /* 864 */ { ud_itab__864, UD_TAB__OPC_MOD, "/mod" }, /* 865 */ { ud_itab__865, UD_TAB__OPC_MOD, "/mod" }, /* 866 */ { ud_itab__866, UD_TAB__OPC_REG, "/reg" }, /* 867 */ { ud_itab__867, UD_TAB__OPC_MOD, "/mod" }, /* 868 */ { ud_itab__868, UD_TAB__OPC_MOD, "/mod" }, /* 869 */ { ud_itab__869, UD_TAB__OPC_MOD, "/mod" }, /* 870 */ { ud_itab__870, UD_TAB__OPC_MOD, "/mod" }, /* 871 */ { ud_itab__871, UD_TAB__OPC_MOD, "/mod" }, /* 872 */ { ud_itab__872, UD_TAB__OPC_MOD, "/mod" }, /* 873 */ { ud_itab__873, UD_TAB__OPC_MOD, "/mod" }, /* 874 */ { ud_itab__874, UD_TAB__OPC_MOD, "/mod" }, /* 875 */ { ud_itab__875, UD_TAB__OPC_X87, "/x87" }, /* 876 */ { ud_itab__876, UD_TAB__OPC_MOD, "/mod" }, /* 877 */ { ud_itab__877, UD_TAB__OPC_MOD, "/mod" }, /* 878 */ { ud_itab__878, UD_TAB__OPC_MOD, "/mod" }, /* 879 */ { ud_itab__879, UD_TAB__OPC_MOD, "/mod" }, /* 880 */ { ud_itab__880, UD_TAB__OPC_MOD, "/mod" }, /* 881 */ { ud_itab__881, UD_TAB__OPC_MOD, "/mod" }, /* 882 */ { ud_itab__882, UD_TAB__OPC_MOD, "/mod" }, /* 883 */ { ud_itab__883, UD_TAB__OPC_MOD, "/mod" }, /* 884 */ { ud_itab__884, UD_TAB__OPC_MOD, "/mod" }, /* 885 */ { ud_itab__885, UD_TAB__OPC_MOD, "/mod" }, /* 886 */ { ud_itab__886, UD_TAB__OPC_MOD, "/mod" }, /* 887 */ { ud_itab__887, UD_TAB__OPC_MOD, "/mod" }, /* 888 */ { ud_itab__888, UD_TAB__OPC_MOD, "/mod" }, /* 889 */ { ud_itab__889, UD_TAB__OPC_MOD, "/mod" }, /* 890 */ { ud_itab__890, UD_TAB__OPC_MOD, "/mod" }, /* 891 */ { ud_itab__891, UD_TAB__OPC_MOD, "/mod" }, /* 892 */ { ud_itab__892, UD_TAB__OPC_MOD, "/mod" }, /* 893 */ { ud_itab__893, UD_TAB__OPC_MOD, "/mod" }, /* 894 */ { ud_itab__894, UD_TAB__OPC_MOD, "/mod" }, /* 895 */ { ud_itab__895, UD_TAB__OPC_MOD, "/mod" }, /* 896 */ { ud_itab__896, UD_TAB__OPC_MOD, "/mod" }, /* 897 */ { ud_itab__897, UD_TAB__OPC_MOD, "/mod" }, /* 898 */ { ud_itab__898, UD_TAB__OPC_MOD, "/mod" }, /* 899 */ { ud_itab__899, UD_TAB__OPC_MOD, "/mod" }, /* 900 */ { ud_itab__900, UD_TAB__OPC_MOD, "/mod" }, /* 901 */ { ud_itab__901, UD_TAB__OPC_MOD, "/mod" }, /* 902 */ { ud_itab__902, UD_TAB__OPC_MOD, "/mod" }, /* 903 */ { ud_itab__903, UD_TAB__OPC_MOD, "/mod" }, /* 904 */ { ud_itab__904, UD_TAB__OPC_MOD, "/mod" }, /* 905 */ { ud_itab__905, UD_TAB__OPC_MOD, "/mod" }, /* 906 */ { ud_itab__906, UD_TAB__OPC_MOD, "/mod" }, /* 907 */ { ud_itab__907, UD_TAB__OPC_MOD, "/mod" }, /* 908 */ { ud_itab__908, UD_TAB__OPC_MOD, "/mod" }, /* 909 */ { ud_itab__909, UD_TAB__OPC_MOD, "/mod" }, /* 910 */ { ud_itab__910, UD_TAB__OPC_MOD, "/mod" }, /* 911 */ { ud_itab__911, UD_TAB__OPC_MOD, "/mod" }, /* 912 */ { ud_itab__912, UD_TAB__OPC_MOD, "/mod" }, /* 913 */ { ud_itab__913, UD_TAB__OPC_MOD, "/mod" }, /* 914 */ { ud_itab__914, UD_TAB__OPC_MOD, "/mod" }, /* 915 */ { ud_itab__915, UD_TAB__OPC_MOD, "/mod" }, /* 916 */ { ud_itab__916, UD_TAB__OPC_MOD, "/mod" }, /* 917 */ { ud_itab__917, UD_TAB__OPC_MOD, "/mod" }, /* 918 */ { ud_itab__918, UD_TAB__OPC_MOD, "/mod" }, /* 919 */ { ud_itab__919, UD_TAB__OPC_MOD, "/mod" }, /* 920 */ { ud_itab__920, UD_TAB__OPC_MOD, "/mod" }, /* 921 */ { ud_itab__921, UD_TAB__OPC_MOD, "/mod" }, /* 922 */ { ud_itab__922, UD_TAB__OPC_MOD, "/mod" }, /* 923 */ { ud_itab__923, UD_TAB__OPC_MOD, "/mod" }, /* 924 */ { ud_itab__924, UD_TAB__OPC_MOD, "/mod" }, /* 925 */ { ud_itab__925, UD_TAB__OPC_MOD, "/mod" }, /* 926 */ { ud_itab__926, UD_TAB__OPC_MOD, "/mod" }, /* 927 */ { ud_itab__927, UD_TAB__OPC_MOD, "/mod" }, /* 928 */ { ud_itab__928, UD_TAB__OPC_MOD, "/mod" }, /* 929 */ { ud_itab__929, UD_TAB__OPC_MOD, "/mod" }, /* 930 */ { ud_itab__930, UD_TAB__OPC_MOD, "/mod" }, /* 931 */ { ud_itab__931, UD_TAB__OPC_MOD, "/mod" }, /* 932 */ { ud_itab__932, UD_TAB__OPC_MOD, "/mod" }, /* 933 */ { ud_itab__933, UD_TAB__OPC_MOD, "/mod" }, /* 934 */ { ud_itab__934, UD_TAB__OPC_MOD, "/mod" }, /* 935 */ { ud_itab__935, UD_TAB__OPC_MOD, "/mod" }, /* 936 */ { ud_itab__936, UD_TAB__OPC_MOD, "/mod" }, /* 937 */ { ud_itab__937, UD_TAB__OPC_MOD, "/mod" }, /* 938 */ { ud_itab__938, UD_TAB__OPC_MOD, "/mod" }, /* 939 */ { ud_itab__939, UD_TAB__OPC_MOD, "/mod" }, /* 940 */ { ud_itab__940, UD_TAB__OPC_MOD, "/mod" }, /* 941 */ { ud_itab__941, UD_TAB__OPC_REG, "/reg" }, /* 942 */ { ud_itab__942, UD_TAB__OPC_MOD, "/mod" }, /* 943 */ { ud_itab__943, UD_TAB__OPC_MOD, "/mod" }, /* 944 */ { ud_itab__944, UD_TAB__OPC_MOD, "/mod" }, /* 945 */ { ud_itab__945, UD_TAB__OPC_MOD, "/mod" }, /* 946 */ { ud_itab__946, UD_TAB__OPC_MOD, "/mod" }, /* 947 */ { ud_itab__947, UD_TAB__OPC_MOD, "/mod" }, /* 948 */ { ud_itab__948, UD_TAB__OPC_MOD, "/mod" }, /* 949 */ { ud_itab__949, UD_TAB__OPC_X87, "/x87" }, /* 950 */ { ud_itab__950, UD_TAB__OPC_MOD, "/mod" }, /* 951 */ { ud_itab__951, UD_TAB__OPC_MOD, "/mod" }, /* 952 */ { ud_itab__952, UD_TAB__OPC_MOD, "/mod" }, /* 953 */ { ud_itab__953, UD_TAB__OPC_MOD, "/mod" }, /* 954 */ { ud_itab__954, UD_TAB__OPC_MOD, "/mod" }, /* 955 */ { ud_itab__955, UD_TAB__OPC_MOD, "/mod" }, /* 956 */ { ud_itab__956, UD_TAB__OPC_MOD, "/mod" }, /* 957 */ { ud_itab__957, UD_TAB__OPC_MOD, "/mod" }, /* 958 */ { ud_itab__958, UD_TAB__OPC_MOD, "/mod" }, /* 959 */ { ud_itab__959, UD_TAB__OPC_MOD, "/mod" }, /* 960 */ { ud_itab__960, UD_TAB__OPC_MOD, "/mod" }, /* 961 */ { ud_itab__961, UD_TAB__OPC_MOD, "/mod" }, /* 962 */ { ud_itab__962, UD_TAB__OPC_MOD, "/mod" }, /* 963 */ { ud_itab__963, UD_TAB__OPC_MOD, "/mod" }, /* 964 */ { ud_itab__964, UD_TAB__OPC_MOD, "/mod" }, /* 965 */ { ud_itab__965, UD_TAB__OPC_MOD, "/mod" }, /* 966 */ { ud_itab__966, UD_TAB__OPC_MOD, "/mod" }, /* 967 */ { ud_itab__967, UD_TAB__OPC_MOD, "/mod" }, /* 968 */ { ud_itab__968, UD_TAB__OPC_MOD, "/mod" }, /* 969 */ { ud_itab__969, UD_TAB__OPC_MOD, "/mod" }, /* 970 */ { ud_itab__970, UD_TAB__OPC_MOD, "/mod" }, /* 971 */ { ud_itab__971, UD_TAB__OPC_MOD, "/mod" }, /* 972 */ { ud_itab__972, UD_TAB__OPC_MOD, "/mod" }, /* 973 */ { ud_itab__973, UD_TAB__OPC_MOD, "/mod" }, /* 974 */ { ud_itab__974, UD_TAB__OPC_MOD, "/mod" }, /* 975 */ { ud_itab__975, UD_TAB__OPC_MOD, "/mod" }, /* 976 */ { ud_itab__976, UD_TAB__OPC_MOD, "/mod" }, /* 977 */ { ud_itab__977, UD_TAB__OPC_MOD, "/mod" }, /* 978 */ { ud_itab__978, UD_TAB__OPC_MOD, "/mod" }, /* 979 */ { ud_itab__979, UD_TAB__OPC_MOD, "/mod" }, /* 980 */ { ud_itab__980, UD_TAB__OPC_MOD, "/mod" }, /* 981 */ { ud_itab__981, UD_TAB__OPC_MOD, "/mod" }, /* 982 */ { ud_itab__982, UD_TAB__OPC_MOD, "/mod" }, /* 983 */ { ud_itab__983, UD_TAB__OPC_MOD, "/mod" }, /* 984 */ { ud_itab__984, UD_TAB__OPC_MOD, "/mod" }, /* 985 */ { ud_itab__985, UD_TAB__OPC_MOD, "/mod" }, /* 986 */ { ud_itab__986, UD_TAB__OPC_MOD, "/mod" }, /* 987 */ { ud_itab__987, UD_TAB__OPC_MOD, "/mod" }, /* 988 */ { ud_itab__988, UD_TAB__OPC_MOD, "/mod" }, /* 989 */ { ud_itab__989, UD_TAB__OPC_MOD, "/mod" }, /* 990 */ { ud_itab__990, UD_TAB__OPC_MOD, "/mod" }, /* 991 */ { ud_itab__991, UD_TAB__OPC_MOD, "/mod" }, /* 992 */ { ud_itab__992, UD_TAB__OPC_MOD, "/mod" }, /* 993 */ { ud_itab__993, UD_TAB__OPC_MOD, "/mod" }, /* 994 */ { ud_itab__994, UD_TAB__OPC_MOD, "/mod" }, /* 995 */ { ud_itab__995, UD_TAB__OPC_MOD, "/mod" }, /* 996 */ { ud_itab__996, UD_TAB__OPC_MOD, "/mod" }, /* 997 */ { ud_itab__997, UD_TAB__OPC_MOD, "/mod" }, /* 998 */ { ud_itab__998, UD_TAB__OPC_MOD, "/mod" }, /* 999 */ { ud_itab__999, UD_TAB__OPC_REG, "/reg" }, /* 1000 */ { ud_itab__1000, UD_TAB__OPC_MOD, "/mod" }, /* 1001 */ { ud_itab__1001, UD_TAB__OPC_MOD, "/mod" }, /* 1002 */ { ud_itab__1002, UD_TAB__OPC_MOD, "/mod" }, /* 1003 */ { ud_itab__1003, UD_TAB__OPC_MOD, "/mod" }, /* 1004 */ { ud_itab__1004, UD_TAB__OPC_MOD, "/mod" }, /* 1005 */ { ud_itab__1005, UD_TAB__OPC_MOD, "/mod" }, /* 1006 */ { ud_itab__1006, UD_TAB__OPC_MOD, "/mod" }, /* 1007 */ { ud_itab__1007, UD_TAB__OPC_MOD, "/mod" }, /* 1008 */ { ud_itab__1008, UD_TAB__OPC_X87, "/x87" }, /* 1009 */ { ud_itab__1009, UD_TAB__OPC_MOD, "/mod" }, /* 1010 */ { ud_itab__1010, UD_TAB__OPC_MOD, "/mod" }, /* 1011 */ { ud_itab__1011, UD_TAB__OPC_MOD, "/mod" }, /* 1012 */ { ud_itab__1012, UD_TAB__OPC_MOD, "/mod" }, /* 1013 */ { ud_itab__1013, UD_TAB__OPC_MOD, "/mod" }, /* 1014 */ { ud_itab__1014, UD_TAB__OPC_MOD, "/mod" }, /* 1015 */ { ud_itab__1015, UD_TAB__OPC_MOD, "/mod" }, /* 1016 */ { ud_itab__1016, UD_TAB__OPC_MOD, "/mod" }, /* 1017 */ { ud_itab__1017, UD_TAB__OPC_MOD, "/mod" }, /* 1018 */ { ud_itab__1018, UD_TAB__OPC_MOD, "/mod" }, /* 1019 */ { ud_itab__1019, UD_TAB__OPC_MOD, "/mod" }, /* 1020 */ { ud_itab__1020, UD_TAB__OPC_MOD, "/mod" }, /* 1021 */ { ud_itab__1021, UD_TAB__OPC_MOD, "/mod" }, /* 1022 */ { ud_itab__1022, UD_TAB__OPC_MOD, "/mod" }, /* 1023 */ { ud_itab__1023, UD_TAB__OPC_MOD, "/mod" }, /* 1024 */ { ud_itab__1024, UD_TAB__OPC_MOD, "/mod" }, /* 1025 */ { ud_itab__1025, UD_TAB__OPC_MOD, "/mod" }, /* 1026 */ { ud_itab__1026, UD_TAB__OPC_MOD, "/mod" }, /* 1027 */ { ud_itab__1027, UD_TAB__OPC_MOD, "/mod" }, /* 1028 */ { ud_itab__1028, UD_TAB__OPC_MOD, "/mod" }, /* 1029 */ { ud_itab__1029, UD_TAB__OPC_MOD, "/mod" }, /* 1030 */ { ud_itab__1030, UD_TAB__OPC_MOD, "/mod" }, /* 1031 */ { ud_itab__1031, UD_TAB__OPC_MOD, "/mod" }, /* 1032 */ { ud_itab__1032, UD_TAB__OPC_MOD, "/mod" }, /* 1033 */ { ud_itab__1033, UD_TAB__OPC_MOD, "/mod" }, /* 1034 */ { ud_itab__1034, UD_TAB__OPC_MOD, "/mod" }, /* 1035 */ { ud_itab__1035, UD_TAB__OPC_MOD, "/mod" }, /* 1036 */ { ud_itab__1036, UD_TAB__OPC_MOD, "/mod" }, /* 1037 */ { ud_itab__1037, UD_TAB__OPC_MOD, "/mod" }, /* 1038 */ { ud_itab__1038, UD_TAB__OPC_MOD, "/mod" }, /* 1039 */ { ud_itab__1039, UD_TAB__OPC_MOD, "/mod" }, /* 1040 */ { ud_itab__1040, UD_TAB__OPC_MOD, "/mod" }, /* 1041 */ { ud_itab__1041, UD_TAB__OPC_MOD, "/mod" }, /* 1042 */ { ud_itab__1042, UD_TAB__OPC_MOD, "/mod" }, /* 1043 */ { ud_itab__1043, UD_TAB__OPC_MOD, "/mod" }, /* 1044 */ { ud_itab__1044, UD_TAB__OPC_MOD, "/mod" }, /* 1045 */ { ud_itab__1045, UD_TAB__OPC_MOD, "/mod" }, /* 1046 */ { ud_itab__1046, UD_TAB__OPC_MOD, "/mod" }, /* 1047 */ { ud_itab__1047, UD_TAB__OPC_MOD, "/mod" }, /* 1048 */ { ud_itab__1048, UD_TAB__OPC_MOD, "/mod" }, /* 1049 */ { ud_itab__1049, UD_TAB__OPC_MOD, "/mod" }, /* 1050 */ { ud_itab__1050, UD_TAB__OPC_MOD, "/mod" }, /* 1051 */ { ud_itab__1051, UD_TAB__OPC_MOD, "/mod" }, /* 1052 */ { ud_itab__1052, UD_TAB__OPC_MOD, "/mod" }, /* 1053 */ { ud_itab__1053, UD_TAB__OPC_MOD, "/mod" }, /* 1054 */ { ud_itab__1054, UD_TAB__OPC_MOD, "/mod" }, /* 1055 */ { ud_itab__1055, UD_TAB__OPC_MOD, "/mod" }, /* 1056 */ { ud_itab__1056, UD_TAB__OPC_MOD, "/mod" }, /* 1057 */ { ud_itab__1057, UD_TAB__OPC_MOD, "/mod" }, /* 1058 */ { ud_itab__1058, UD_TAB__OPC_MOD, "/mod" }, /* 1059 */ { ud_itab__1059, UD_TAB__OPC_MOD, "/mod" }, /* 1060 */ { ud_itab__1060, UD_TAB__OPC_MOD, "/mod" }, /* 1061 */ { ud_itab__1061, UD_TAB__OPC_MOD, "/mod" }, /* 1062 */ { ud_itab__1062, UD_TAB__OPC_MOD, "/mod" }, /* 1063 */ { ud_itab__1063, UD_TAB__OPC_MOD, "/mod" }, /* 1064 */ { ud_itab__1064, UD_TAB__OPC_MOD, "/mod" }, /* 1065 */ { ud_itab__1065, UD_TAB__OPC_MOD, "/mod" }, /* 1066 */ { ud_itab__1066, UD_TAB__OPC_MOD, "/mod" }, /* 1067 */ { ud_itab__1067, UD_TAB__OPC_REG, "/reg" }, /* 1068 */ { ud_itab__1068, UD_TAB__OPC_MOD, "/mod" }, /* 1069 */ { ud_itab__1069, UD_TAB__OPC_MOD, "/mod" }, /* 1070 */ { ud_itab__1070, UD_TAB__OPC_MOD, "/mod" }, /* 1071 */ { ud_itab__1071, UD_TAB__OPC_MOD, "/mod" }, /* 1072 */ { ud_itab__1072, UD_TAB__OPC_MOD, "/mod" }, /* 1073 */ { ud_itab__1073, UD_TAB__OPC_MOD, "/mod" }, /* 1074 */ { ud_itab__1074, UD_TAB__OPC_MOD, "/mod" }, /* 1075 */ { ud_itab__1075, UD_TAB__OPC_MOD, "/mod" }, /* 1076 */ { ud_itab__1076, UD_TAB__OPC_X87, "/x87" }, /* 1077 */ { ud_itab__1077, UD_TAB__OPC_MOD, "/mod" }, /* 1078 */ { ud_itab__1078, UD_TAB__OPC_MOD, "/mod" }, /* 1079 */ { ud_itab__1079, UD_TAB__OPC_MOD, "/mod" }, /* 1080 */ { ud_itab__1080, UD_TAB__OPC_MOD, "/mod" }, /* 1081 */ { ud_itab__1081, UD_TAB__OPC_MOD, "/mod" }, /* 1082 */ { ud_itab__1082, UD_TAB__OPC_MOD, "/mod" }, /* 1083 */ { ud_itab__1083, UD_TAB__OPC_MOD, "/mod" }, /* 1084 */ { ud_itab__1084, UD_TAB__OPC_MOD, "/mod" }, /* 1085 */ { ud_itab__1085, UD_TAB__OPC_MOD, "/mod" }, /* 1086 */ { ud_itab__1086, UD_TAB__OPC_MOD, "/mod" }, /* 1087 */ { ud_itab__1087, UD_TAB__OPC_MOD, "/mod" }, /* 1088 */ { ud_itab__1088, UD_TAB__OPC_MOD, "/mod" }, /* 1089 */ { ud_itab__1089, UD_TAB__OPC_MOD, "/mod" }, /* 1090 */ { ud_itab__1090, UD_TAB__OPC_MOD, "/mod" }, /* 1091 */ { ud_itab__1091, UD_TAB__OPC_MOD, "/mod" }, /* 1092 */ { ud_itab__1092, UD_TAB__OPC_MOD, "/mod" }, /* 1093 */ { ud_itab__1093, UD_TAB__OPC_MOD, "/mod" }, /* 1094 */ { ud_itab__1094, UD_TAB__OPC_MOD, "/mod" }, /* 1095 */ { ud_itab__1095, UD_TAB__OPC_MOD, "/mod" }, /* 1096 */ { ud_itab__1096, UD_TAB__OPC_MOD, "/mod" }, /* 1097 */ { ud_itab__1097, UD_TAB__OPC_MOD, "/mod" }, /* 1098 */ { ud_itab__1098, UD_TAB__OPC_MOD, "/mod" }, /* 1099 */ { ud_itab__1099, UD_TAB__OPC_MOD, "/mod" }, /* 1100 */ { ud_itab__1100, UD_TAB__OPC_MOD, "/mod" }, /* 1101 */ { ud_itab__1101, UD_TAB__OPC_MOD, "/mod" }, /* 1102 */ { ud_itab__1102, UD_TAB__OPC_MOD, "/mod" }, /* 1103 */ { ud_itab__1103, UD_TAB__OPC_MOD, "/mod" }, /* 1104 */ { ud_itab__1104, UD_TAB__OPC_MOD, "/mod" }, /* 1105 */ { ud_itab__1105, UD_TAB__OPC_MOD, "/mod" }, /* 1106 */ { ud_itab__1106, UD_TAB__OPC_MOD, "/mod" }, /* 1107 */ { ud_itab__1107, UD_TAB__OPC_MOD, "/mod" }, /* 1108 */ { ud_itab__1108, UD_TAB__OPC_MOD, "/mod" }, /* 1109 */ { ud_itab__1109, UD_TAB__OPC_MOD, "/mod" }, /* 1110 */ { ud_itab__1110, UD_TAB__OPC_MOD, "/mod" }, /* 1111 */ { ud_itab__1111, UD_TAB__OPC_MOD, "/mod" }, /* 1112 */ { ud_itab__1112, UD_TAB__OPC_MOD, "/mod" }, /* 1113 */ { ud_itab__1113, UD_TAB__OPC_MOD, "/mod" }, /* 1114 */ { ud_itab__1114, UD_TAB__OPC_MOD, "/mod" }, /* 1115 */ { ud_itab__1115, UD_TAB__OPC_MOD, "/mod" }, /* 1116 */ { ud_itab__1116, UD_TAB__OPC_MOD, "/mod" }, /* 1117 */ { ud_itab__1117, UD_TAB__OPC_MOD, "/mod" }, /* 1118 */ { ud_itab__1118, UD_TAB__OPC_MOD, "/mod" }, /* 1119 */ { ud_itab__1119, UD_TAB__OPC_MOD, "/mod" }, /* 1120 */ { ud_itab__1120, UD_TAB__OPC_MOD, "/mod" }, /* 1121 */ { ud_itab__1121, UD_TAB__OPC_MOD, "/mod" }, /* 1122 */ { ud_itab__1122, UD_TAB__OPC_MOD, "/mod" }, /* 1123 */ { ud_itab__1123, UD_TAB__OPC_MOD, "/mod" }, /* 1124 */ { ud_itab__1124, UD_TAB__OPC_MOD, "/mod" }, /* 1125 */ { ud_itab__1125, UD_TAB__OPC_MOD, "/mod" }, /* 1126 */ { ud_itab__1126, UD_TAB__OPC_ASIZE, "/a" }, /* 1127 */ { ud_itab__1127, UD_TAB__OPC_MODE, "/m" }, /* 1128 */ { ud_itab__1128, UD_TAB__OPC_REG, "/reg" }, /* 1129 */ { ud_itab__1129, UD_TAB__OPC_REG, "/reg" }, /* 1130 */ { ud_itab__1130, UD_TAB__OPC_REG, "/reg" }, /* 1131 */ { ud_itab__1131, UD_TAB__OPC_REG, "/reg" }, /* 1132 */ { ud_itab__1132, UD_TAB__OPC_MODE, "/m" }, }; /* itab entry operand definitions (for readability) */ #define O_AL { OP_AL, SZ_B } #define O_AX { OP_AX, SZ_W } #define O_Av { OP_A, SZ_V } #define O_C { OP_C, SZ_NA } #define O_CL { OP_CL, SZ_B } #define O_CS { OP_CS, SZ_NA } #define O_CX { OP_CX, SZ_W } #define O_D { OP_D, SZ_NA } #define O_DL { OP_DL, SZ_B } #define O_DS { OP_DS, SZ_NA } #define O_DX { OP_DX, SZ_W } #define O_E { OP_E, SZ_NA } #define O_ES { OP_ES, SZ_NA } #define O_Eb { OP_E, SZ_B } #define O_Ed { OP_E, SZ_D } #define O_Eq { OP_E, SZ_Q } #define O_Ev { OP_E, SZ_V } #define O_Ew { OP_E, SZ_W } #define O_Ey { OP_E, SZ_Y } #define O_Ez { OP_E, SZ_Z } #define O_FS { OP_FS, SZ_NA } #define O_Fv { OP_F, SZ_V } #define O_G { OP_G, SZ_NA } #define O_GS { OP_GS, SZ_NA } #define O_Gb { OP_G, SZ_B } #define O_Gd { OP_G, SZ_D } #define O_Gq { OP_G, SZ_Q } #define O_Gv { OP_G, SZ_V } #define O_Gw { OP_G, SZ_W } #define O_Gy { OP_G, SZ_Y } #define O_Gz { OP_G, SZ_Z } #define O_I1 { OP_I1, SZ_NA } #define O_I3 { OP_I3, SZ_NA } #define O_Ib { OP_I, SZ_B } #define O_Iv { OP_I, SZ_V } #define O_Iw { OP_I, SZ_W } #define O_Iz { OP_I, SZ_Z } #define O_Jb { OP_J, SZ_B } #define O_Jv { OP_J, SZ_V } #define O_Jz { OP_J, SZ_Z } #define O_M { OP_M, SZ_NA } #define O_Mb { OP_M, SZ_B } #define O_MbRd { OP_MR, SZ_BD } #define O_MbRv { OP_MR, SZ_BV } #define O_Md { OP_M, SZ_D } #define O_MdRy { OP_MR, SZ_DY } #define O_MdU { OP_MU, SZ_DO } #define O_Mo { OP_M, SZ_O } #define O_Mq { OP_M, SZ_Q } #define O_MqU { OP_MU, SZ_QO } #define O_Ms { OP_M, SZ_W } #define O_Mt { OP_M, SZ_T } #define O_Mv { OP_M, SZ_V } #define O_Mw { OP_M, SZ_W } #define O_MwRd { OP_MR, SZ_WD } #define O_MwRv { OP_MR, SZ_WV } #define O_MwRy { OP_MR, SZ_WY } #define O_MwU { OP_MU, SZ_WO } #define O_N { OP_N, SZ_Q } #define O_NONE { OP_NONE, SZ_NA } #define O_Ob { OP_O, SZ_B } #define O_Ov { OP_O, SZ_V } #define O_Ow { OP_O, SZ_W } #define O_P { OP_P, SZ_Q } #define O_Q { OP_Q, SZ_Q } #define O_R { OP_R, SZ_RDQ } #define O_R0b { OP_R0, SZ_B } #define O_R0v { OP_R0, SZ_V } #define O_R0w { OP_R0, SZ_W } #define O_R0y { OP_R0, SZ_Y } #define O_R0z { OP_R0, SZ_Z } #define O_R1b { OP_R1, SZ_B } #define O_R1v { OP_R1, SZ_V } #define O_R1w { OP_R1, SZ_W } #define O_R1y { OP_R1, SZ_Y } #define O_R1z { OP_R1, SZ_Z } #define O_R2b { OP_R2, SZ_B } #define O_R2v { OP_R2, SZ_V } #define O_R2w { OP_R2, SZ_W } #define O_R2y { OP_R2, SZ_Y } #define O_R2z { OP_R2, SZ_Z } #define O_R3b { OP_R3, SZ_B } #define O_R3v { OP_R3, SZ_V } #define O_R3w { OP_R3, SZ_W } #define O_R3y { OP_R3, SZ_Y } #define O_R3z { OP_R3, SZ_Z } #define O_R4b { OP_R4, SZ_B } #define O_R4v { OP_R4, SZ_V } #define O_R4w { OP_R4, SZ_W } #define O_R4y { OP_R4, SZ_Y } #define O_R4z { OP_R4, SZ_Z } #define O_R5b { OP_R5, SZ_B } #define O_R5v { OP_R5, SZ_V } #define O_R5w { OP_R5, SZ_W } #define O_R5y { OP_R5, SZ_Y } #define O_R5z { OP_R5, SZ_Z } #define O_R6b { OP_R6, SZ_B } #define O_R6v { OP_R6, SZ_V } #define O_R6w { OP_R6, SZ_W } #define O_R6y { OP_R6, SZ_Y } #define O_R6z { OP_R6, SZ_Z } #define O_R7b { OP_R7, SZ_B } #define O_R7v { OP_R7, SZ_V } #define O_R7w { OP_R7, SZ_W } #define O_R7y { OP_R7, SZ_Y } #define O_R7z { OP_R7, SZ_Z } #define O_S { OP_S, SZ_NA } #define O_SS { OP_SS, SZ_NA } #define O_ST0 { OP_ST0, SZ_NA } #define O_ST1 { OP_ST1, SZ_NA } #define O_ST2 { OP_ST2, SZ_NA } #define O_ST3 { OP_ST3, SZ_NA } #define O_ST4 { OP_ST4, SZ_NA } #define O_ST5 { OP_ST5, SZ_NA } #define O_ST6 { OP_ST6, SZ_NA } #define O_ST7 { OP_ST7, SZ_NA } #define O_U { OP_U, SZ_O } #define O_V { OP_V, SZ_O } #define O_W { OP_W, SZ_O } #define O_eAX { OP_eAX, SZ_Z } #define O_eCX { OP_eCX, SZ_Z } #define O_eDX { OP_eDX, SZ_Z } #define O_rAX { OP_rAX, SZ_V } #define O_rCX { OP_rCX, SZ_V } #define O_rDX { OP_rDX, SZ_V } #define O_sIb { OP_sI, SZ_B } #define O_sIv { OP_sI, SZ_V } #define O_sIz { OP_sI, SZ_Z } struct ud_itab_entry ud_itab[] = { /* 0000 */ { UD_Iinvalid, O_NONE, O_NONE, O_NONE, P_none }, /* 0001 */ { UD_Iadd, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0002 */ { UD_Iadd, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0003 */ { UD_Iadd, O_Gb, O_Eb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0004 */ { UD_Iadd, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0005 */ { UD_Iadd, O_AL, O_Ib, O_NONE, P_none }, /* 0006 */ { UD_Iadd, O_rAX, O_sIz, O_NONE, P_oso|P_rexw }, /* 0007 */ { UD_Ipush, O_ES, O_NONE, O_NONE, P_inv64 }, /* 0008 */ { UD_Ipop, O_ES, O_NONE, O_NONE, P_inv64 }, /* 0009 */ { UD_Ior, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0010 */ { UD_Ior, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0011 */ { UD_Ior, O_Gb, O_Eb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0012 */ { UD_Ior, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0013 */ { UD_Ior, O_AL, O_Ib, O_NONE, P_none }, /* 0014 */ { UD_Ior, O_rAX, O_sIz, O_NONE, P_oso|P_rexw }, /* 0015 */ { UD_Ipush, O_CS, O_NONE, O_NONE, P_inv64 }, /* 0016 */ { UD_Isldt, O_MwRv, O_NONE, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb }, /* 0017 */ { UD_Istr, O_MwRv, O_NONE, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb }, /* 0018 */ { UD_Illdt, O_Ew, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0019 */ { UD_Iltr, O_Ew, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0020 */ { UD_Iverr, O_Ew, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0021 */ { UD_Iverw, O_Ew, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0022 */ { UD_Isgdt, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0023 */ { UD_Isidt, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0024 */ { UD_Ilgdt, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0025 */ { UD_Ilidt, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0026 */ { UD_Ismsw, O_MwRv, O_NONE, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb }, /* 0027 */ { UD_Ilmsw, O_Ew, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0028 */ { UD_Iinvlpg, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0029 */ { UD_Ivmcall, O_NONE, O_NONE, O_NONE, P_none }, /* 0030 */ { UD_Ivmlaunch, O_NONE, O_NONE, O_NONE, P_none }, /* 0031 */ { UD_Ivmresume, O_NONE, O_NONE, O_NONE, P_none }, /* 0032 */ { UD_Ivmxoff, O_NONE, O_NONE, O_NONE, P_none }, /* 0033 */ { UD_Imonitor, O_NONE, O_NONE, O_NONE, P_none }, /* 0034 */ { UD_Imwait, O_NONE, O_NONE, O_NONE, P_none }, /* 0035 */ { UD_Ixgetbv, O_NONE, O_NONE, O_NONE, P_none }, /* 0036 */ { UD_Ixsetbv, O_NONE, O_NONE, O_NONE, P_none }, /* 0037 */ { UD_Ivmrun, O_NONE, O_NONE, O_NONE, P_none }, /* 0038 */ { UD_Ivmmcall, O_NONE, O_NONE, O_NONE, P_none }, /* 0039 */ { UD_Ivmload, O_NONE, O_NONE, O_NONE, P_none }, /* 0040 */ { UD_Ivmsave, O_NONE, O_NONE, O_NONE, P_none }, /* 0041 */ { UD_Istgi, O_NONE, O_NONE, O_NONE, P_none }, /* 0042 */ { UD_Iclgi, O_NONE, O_NONE, O_NONE, P_none }, /* 0043 */ { UD_Iskinit, O_NONE, O_NONE, O_NONE, P_none }, /* 0044 */ { UD_Iinvlpga, O_NONE, O_NONE, O_NONE, P_none }, /* 0045 */ { UD_Ismsw, O_MwRv, O_NONE, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb }, /* 0046 */ { UD_Ilmsw, O_Ew, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0047 */ { UD_Iswapgs, O_NONE, O_NONE, O_NONE, P_none }, /* 0048 */ { UD_Irdtscp, O_NONE, O_NONE, O_NONE, P_none }, /* 0049 */ { UD_Ilar, O_Gv, O_Ew, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0050 */ { UD_Ilsl, O_Gv, O_Ew, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0051 */ { UD_Isyscall, O_NONE, O_NONE, O_NONE, P_none }, /* 0052 */ { UD_Iclts, O_NONE, O_NONE, O_NONE, P_none }, /* 0053 */ { UD_Isysret, O_NONE, O_NONE, O_NONE, P_none }, /* 0054 */ { UD_Iinvd, O_NONE, O_NONE, O_NONE, P_none }, /* 0055 */ { UD_Iwbinvd, O_NONE, O_NONE, O_NONE, P_none }, /* 0056 */ { UD_Iud2, O_NONE, O_NONE, O_NONE, P_none }, /* 0057 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0058 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0059 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0060 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0061 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0062 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0063 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0064 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0065 */ { UD_Ifemms, O_NONE, O_NONE, O_NONE, P_none }, /* 0066 */ { UD_Ipi2fw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0067 */ { UD_Ipi2fd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0068 */ { UD_Ipf2iw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0069 */ { UD_Ipf2id, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0070 */ { UD_Ipfnacc, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0071 */ { UD_Ipfpnacc, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0072 */ { UD_Ipfcmpge, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0073 */ { UD_Ipfmin, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0074 */ { UD_Ipfrcp, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0075 */ { UD_Ipfrsqrt, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0076 */ { UD_Ipfsub, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0077 */ { UD_Ipfadd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0078 */ { UD_Ipfcmpgt, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0079 */ { UD_Ipfmax, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0080 */ { UD_Ipfrcpit1, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0081 */ { UD_Ipfrsqit1, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0082 */ { UD_Ipfsubr, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0083 */ { UD_Ipfacc, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0084 */ { UD_Ipfcmpeq, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0085 */ { UD_Ipfmul, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0086 */ { UD_Ipfrcpit2, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0087 */ { UD_Ipmulhrw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0088 */ { UD_Ipswapd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0089 */ { UD_Ipavgusb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0090 */ { UD_Imovups, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0091 */ { UD_Imovsd, O_V, O_W, O_NONE, P_str|P_aso|P_rexr|P_rexx|P_rexb }, /* 0092 */ { UD_Imovss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0093 */ { UD_Imovupd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0094 */ { UD_Imovups, O_W, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0095 */ { UD_Imovsd, O_W, O_V, O_NONE, P_str|P_aso|P_rexr|P_rexx|P_rexb }, /* 0096 */ { UD_Imovss, O_W, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0097 */ { UD_Imovupd, O_W, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0098 */ { UD_Imovlps, O_V, O_M, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0099 */ { UD_Imovddup, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0100 */ { UD_Imovsldup, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0101 */ { UD_Imovlpd, O_V, O_M, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0102 */ { UD_Imovhlps, O_V, O_U, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0103 */ { UD_Imovddup, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0104 */ { UD_Imovsldup, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0105 */ { UD_Imovlps, O_M, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0106 */ { UD_Imovlpd, O_M, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0107 */ { UD_Iunpcklps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0108 */ { UD_Iunpcklpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0109 */ { UD_Iunpckhps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0110 */ { UD_Iunpckhpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0111 */ { UD_Imovhps, O_V, O_M, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0112 */ { UD_Imovshdup, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0113 */ { UD_Imovhpd, O_V, O_M, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0114 */ { UD_Imovlhps, O_V, O_U, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0115 */ { UD_Imovshdup, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0116 */ { UD_Imovhps, O_M, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0117 */ { UD_Imovhpd, O_M, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0118 */ { UD_Iprefetchnta, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0119 */ { UD_Iprefetcht0, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0120 */ { UD_Iprefetcht1, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0121 */ { UD_Iprefetcht2, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0122 */ { UD_Inop, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0123 */ { UD_Inop, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0124 */ { UD_Inop, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0125 */ { UD_Inop, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0126 */ { UD_Inop, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0127 */ { UD_Inop, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0128 */ { UD_Inop, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0129 */ { UD_Imov, O_R, O_C, O_NONE, P_rexr|P_rexw|P_rexb }, /* 0130 */ { UD_Imov, O_R, O_D, O_NONE, P_rexr|P_rexw|P_rexb }, /* 0131 */ { UD_Imov, O_C, O_R, O_NONE, P_rexr|P_rexw|P_rexb }, /* 0132 */ { UD_Imov, O_D, O_R, O_NONE, P_rexr|P_rexw|P_rexb }, /* 0133 */ { UD_Imovaps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0134 */ { UD_Imovapd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0135 */ { UD_Imovaps, O_W, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0136 */ { UD_Imovapd, O_W, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0137 */ { UD_Icvtpi2ps, O_V, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0138 */ { UD_Icvtsi2sd, O_V, O_Ey, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0139 */ { UD_Icvtsi2ss, O_V, O_Ey, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0140 */ { UD_Icvtpi2pd, O_V, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0141 */ { UD_Imovntps, O_M, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0142 */ { UD_Imovntpd, O_M, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0143 */ { UD_Icvttps2pi, O_P, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0144 */ { UD_Icvttsd2si, O_Gy, O_W, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0145 */ { UD_Icvttss2si, O_Gy, O_W, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0146 */ { UD_Icvttpd2pi, O_P, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0147 */ { UD_Icvtps2pi, O_P, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0148 */ { UD_Icvtsd2si, O_Gy, O_W, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0149 */ { UD_Icvtss2si, O_Gy, O_W, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0150 */ { UD_Icvtpd2pi, O_P, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0151 */ { UD_Iucomiss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0152 */ { UD_Iucomisd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0153 */ { UD_Icomiss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0154 */ { UD_Icomisd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0155 */ { UD_Iwrmsr, O_NONE, O_NONE, O_NONE, P_none }, /* 0156 */ { UD_Irdtsc, O_NONE, O_NONE, O_NONE, P_none }, /* 0157 */ { UD_Irdmsr, O_NONE, O_NONE, O_NONE, P_none }, /* 0158 */ { UD_Irdpmc, O_NONE, O_NONE, O_NONE, P_none }, /* 0159 */ { UD_Isysenter, O_NONE, O_NONE, O_NONE, P_none }, /* 0160 */ { UD_Isysenter, O_NONE, O_NONE, O_NONE, P_none }, /* 0161 */ { UD_Isysexit, O_NONE, O_NONE, O_NONE, P_none }, /* 0162 */ { UD_Isysexit, O_NONE, O_NONE, O_NONE, P_none }, /* 0163 */ { UD_Igetsec, O_NONE, O_NONE, O_NONE, P_none }, /* 0164 */ { UD_Ipshufb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0165 */ { UD_Ipshufb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0166 */ { UD_Iphaddw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0167 */ { UD_Iphaddw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0168 */ { UD_Iphaddd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0169 */ { UD_Iphaddd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0170 */ { UD_Iphaddsw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0171 */ { UD_Iphaddsw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0172 */ { UD_Ipmaddubsw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0173 */ { UD_Ipmaddubsw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0174 */ { UD_Iphsubw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0175 */ { UD_Iphsubw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0176 */ { UD_Iphsubd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0177 */ { UD_Iphsubd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0178 */ { UD_Iphsubsw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0179 */ { UD_Iphsubsw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0180 */ { UD_Ipsignb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0181 */ { UD_Ipsignb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0182 */ { UD_Ipsignw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0183 */ { UD_Ipsignw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0184 */ { UD_Ipsignd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0185 */ { UD_Ipsignd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0186 */ { UD_Ipmulhrsw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0187 */ { UD_Ipmulhrsw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0188 */ { UD_Ipblendvb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0189 */ { UD_Iblendvps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0190 */ { UD_Iblendvpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0191 */ { UD_Iptest, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, /* 0192 */ { UD_Ipabsb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0193 */ { UD_Ipabsb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0194 */ { UD_Ipabsw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0195 */ { UD_Ipabsw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0196 */ { UD_Ipabsd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0197 */ { UD_Ipabsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0198 */ { UD_Ipmovsxbw, O_V, O_MqU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, /* 0199 */ { UD_Ipmovsxbd, O_V, O_MdU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, /* 0200 */ { UD_Ipmovsxbq, O_V, O_MwU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, /* 0201 */ { UD_Ipmovsxwd, O_V, O_MqU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, /* 0202 */ { UD_Ipmovsxwq, O_V, O_MdU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, /* 0203 */ { UD_Ipmovsxdq, O_V, O_MqU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, /* 0204 */ { UD_Ipmuldq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0205 */ { UD_Ipcmpeqq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, /* 0206 */ { UD_Imovntdqa, O_V, O_Mo, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, /* 0207 */ { UD_Ipackusdw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, /* 0208 */ { UD_Ipmovzxbw, O_V, O_MqU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, /* 0209 */ { UD_Ipmovzxbd, O_V, O_MdU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, /* 0210 */ { UD_Ipmovzxbq, O_V, O_MwU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, /* 0211 */ { UD_Ipmovzxwd, O_V, O_MqU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, /* 0212 */ { UD_Ipmovzxwq, O_V, O_MdU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, /* 0213 */ { UD_Ipmovzxdq, O_V, O_MqU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, /* 0214 */ { UD_Ipcmpgtq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, /* 0215 */ { UD_Ipminsb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0216 */ { UD_Ipminsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0217 */ { UD_Ipminuw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0218 */ { UD_Ipminud, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0219 */ { UD_Ipmaxsb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0220 */ { UD_Ipmaxsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0221 */ { UD_Ipmaxuw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0222 */ { UD_Ipmaxud, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0223 */ { UD_Ipmulld, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0224 */ { UD_Iphminposuw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0225 */ { UD_Iinvept, O_Gq, O_Mo, O_NONE, P_none }, /* 0226 */ { UD_Iinvvpid, O_Gq, O_Mo, O_NONE, P_none }, /* 0227 */ { UD_Iaesimc, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0228 */ { UD_Iaesenc, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0229 */ { UD_Iaesenclast, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0230 */ { UD_Iaesdec, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0231 */ { UD_Iaesdeclast, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0232 */ { UD_Imovbe, O_Gv, O_Mv, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb }, /* 0233 */ { UD_Icrc32, O_Gy, O_Eb, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb }, /* 0234 */ { UD_Imovbe, O_Mv, O_Gv, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb }, /* 0235 */ { UD_Icrc32, O_Gy, O_Ev, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb }, /* 0236 */ { UD_Iroundps, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, /* 0237 */ { UD_Iroundpd, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, /* 0238 */ { UD_Iroundss, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, /* 0239 */ { UD_Iroundsd, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, /* 0240 */ { UD_Iblendps, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, /* 0241 */ { UD_Iblendpd, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, /* 0242 */ { UD_Ipblendw, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, /* 0243 */ { UD_Ipalignr, O_P, O_Q, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, /* 0244 */ { UD_Ipalignr, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, /* 0245 */ { UD_Ipextrb, O_MbRv, O_V, O_Ib, P_aso|P_rexx|P_rexr|P_rexb|P_def64 }, /* 0246 */ { UD_Ipextrw, O_MwRd, O_V, O_Ib, P_aso|P_rexx|P_rexr|P_rexb }, /* 0247 */ { UD_Ipextrd, O_Ed, O_V, O_Ib, P_aso|P_rexr|P_rexx|P_rexw|P_rexb }, /* 0248 */ { UD_Ipextrd, O_Ed, O_V, O_Ib, P_aso|P_rexr|P_rexx|P_rexw|P_rexb }, /* 0249 */ { UD_Ipextrq, O_Eq, O_V, O_Ib, P_aso|P_rexr|P_rexw|P_rexb|P_def64 }, /* 0250 */ { UD_Iextractps, O_MdRy, O_V, O_Ib, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, /* 0251 */ { UD_Ipinsrb, O_V, O_MbRd, O_Ib, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0252 */ { UD_Iinsertps, O_V, O_Md, O_Ib, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, /* 0253 */ { UD_Ipinsrd, O_V, O_Ed, O_Ib, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0254 */ { UD_Ipinsrd, O_V, O_Ed, O_Ib, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0255 */ { UD_Ipinsrq, O_V, O_Eq, O_Ib, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0256 */ { UD_Idpps, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, /* 0257 */ { UD_Idppd, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, /* 0258 */ { UD_Impsadbw, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, /* 0259 */ { UD_Ipclmulqdq, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, /* 0260 */ { UD_Ipcmpestrm, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, /* 0261 */ { UD_Ipcmpestri, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, /* 0262 */ { UD_Ipcmpistrm, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, /* 0263 */ { UD_Ipcmpistri, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, /* 0264 */ { UD_Iaeskeygenassist, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, /* 0265 */ { UD_Icmovo, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0266 */ { UD_Icmovno, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0267 */ { UD_Icmovb, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0268 */ { UD_Icmovae, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0269 */ { UD_Icmovz, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0270 */ { UD_Icmovnz, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0271 */ { UD_Icmovbe, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0272 */ { UD_Icmova, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0273 */ { UD_Icmovs, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0274 */ { UD_Icmovns, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0275 */ { UD_Icmovp, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0276 */ { UD_Icmovnp, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0277 */ { UD_Icmovl, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0278 */ { UD_Icmovge, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0279 */ { UD_Icmovle, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0280 */ { UD_Icmovg, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0281 */ { UD_Imovmskps, O_Gd, O_U, O_NONE, P_oso|P_rexr|P_rexb }, /* 0282 */ { UD_Imovmskpd, O_Gd, O_U, O_NONE, P_oso|P_rexr|P_rexb }, /* 0283 */ { UD_Isqrtps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0284 */ { UD_Isqrtsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0285 */ { UD_Isqrtss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0286 */ { UD_Isqrtpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0287 */ { UD_Irsqrtps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0288 */ { UD_Irsqrtss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0289 */ { UD_Ircpps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0290 */ { UD_Ircpss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0291 */ { UD_Iandps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0292 */ { UD_Iandpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0293 */ { UD_Iandnps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0294 */ { UD_Iandnpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0295 */ { UD_Iorps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0296 */ { UD_Iorpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0297 */ { UD_Ixorps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0298 */ { UD_Ixorpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0299 */ { UD_Iaddps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0300 */ { UD_Iaddsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0301 */ { UD_Iaddss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0302 */ { UD_Iaddpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0303 */ { UD_Imulps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0304 */ { UD_Imulsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0305 */ { UD_Imulss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0306 */ { UD_Imulpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0307 */ { UD_Icvtps2pd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0308 */ { UD_Icvtsd2ss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0309 */ { UD_Icvtss2sd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0310 */ { UD_Icvtpd2ps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0311 */ { UD_Icvtdq2ps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0312 */ { UD_Icvttps2dq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0313 */ { UD_Icvtps2dq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0314 */ { UD_Isubps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0315 */ { UD_Isubsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0316 */ { UD_Isubss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0317 */ { UD_Isubpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0318 */ { UD_Iminps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0319 */ { UD_Iminsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0320 */ { UD_Iminss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0321 */ { UD_Iminpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0322 */ { UD_Idivps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0323 */ { UD_Idivsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0324 */ { UD_Idivss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0325 */ { UD_Idivpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0326 */ { UD_Imaxps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0327 */ { UD_Imaxsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0328 */ { UD_Imaxss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0329 */ { UD_Imaxpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0330 */ { UD_Ipunpcklbw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0331 */ { UD_Ipunpcklbw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0332 */ { UD_Ipunpcklwd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0333 */ { UD_Ipunpcklwd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0334 */ { UD_Ipunpckldq, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0335 */ { UD_Ipunpckldq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0336 */ { UD_Ipacksswb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0337 */ { UD_Ipacksswb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0338 */ { UD_Ipcmpgtb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0339 */ { UD_Ipcmpgtb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0340 */ { UD_Ipcmpgtw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0341 */ { UD_Ipcmpgtw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0342 */ { UD_Ipcmpgtd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0343 */ { UD_Ipcmpgtd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0344 */ { UD_Ipackuswb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0345 */ { UD_Ipackuswb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0346 */ { UD_Ipunpckhbw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0347 */ { UD_Ipunpckhbw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0348 */ { UD_Ipunpckhwd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0349 */ { UD_Ipunpckhwd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0350 */ { UD_Ipunpckhdq, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0351 */ { UD_Ipunpckhdq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0352 */ { UD_Ipackssdw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0353 */ { UD_Ipackssdw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0354 */ { UD_Ipunpcklqdq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0355 */ { UD_Ipunpckhqdq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0356 */ { UD_Imovd, O_P, O_Ey, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0357 */ { UD_Imovd, O_V, O_Ey, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0358 */ { UD_Imovq, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0359 */ { UD_Imovdqu, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0360 */ { UD_Imovdqa, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0361 */ { UD_Ipshufw, O_P, O_Q, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, /* 0362 */ { UD_Ipshuflw, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, /* 0363 */ { UD_Ipshufhw, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, /* 0364 */ { UD_Ipshufd, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, /* 0365 */ { UD_Ipsrlw, O_N, O_Ib, O_NONE, P_none }, /* 0366 */ { UD_Ipsrlw, O_U, O_Ib, O_NONE, P_rexb }, /* 0367 */ { UD_Ipsraw, O_N, O_Ib, O_NONE, P_none }, /* 0368 */ { UD_Ipsraw, O_U, O_Ib, O_NONE, P_rexb }, /* 0369 */ { UD_Ipsllw, O_N, O_Ib, O_NONE, P_none }, /* 0370 */ { UD_Ipsllw, O_U, O_Ib, O_NONE, P_rexb }, /* 0371 */ { UD_Ipsrld, O_N, O_Ib, O_NONE, P_none }, /* 0372 */ { UD_Ipsrld, O_U, O_Ib, O_NONE, P_rexb }, /* 0373 */ { UD_Ipsrad, O_N, O_Ib, O_NONE, P_none }, /* 0374 */ { UD_Ipsrad, O_U, O_Ib, O_NONE, P_rexb }, /* 0375 */ { UD_Ipslld, O_N, O_Ib, O_NONE, P_none }, /* 0376 */ { UD_Ipslld, O_U, O_Ib, O_NONE, P_rexb }, /* 0377 */ { UD_Ipsrlq, O_N, O_Ib, O_NONE, P_none }, /* 0378 */ { UD_Ipsrlq, O_U, O_Ib, O_NONE, P_rexb }, /* 0379 */ { UD_Ipsrldq, O_U, O_Ib, O_NONE, P_rexb }, /* 0380 */ { UD_Ipsllq, O_N, O_Ib, O_NONE, P_none }, /* 0381 */ { UD_Ipsllq, O_U, O_Ib, O_NONE, P_rexb }, /* 0382 */ { UD_Ipslldq, O_U, O_Ib, O_NONE, P_rexb }, /* 0383 */ { UD_Ipcmpeqb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0384 */ { UD_Ipcmpeqb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0385 */ { UD_Ipcmpeqw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0386 */ { UD_Ipcmpeqw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0387 */ { UD_Ipcmpeqd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0388 */ { UD_Ipcmpeqd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0389 */ { UD_Iemms, O_NONE, O_NONE, O_NONE, P_none }, /* 0390 */ { UD_Ivmread, O_Ey, O_Gy, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_def64 }, /* 0391 */ { UD_Ivmwrite, O_Gy, O_Ey, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_def64 }, /* 0392 */ { UD_Ihaddps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0393 */ { UD_Ihaddpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0394 */ { UD_Ihsubps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0395 */ { UD_Ihsubpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0396 */ { UD_Imovd, O_Ey, O_P, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0397 */ { UD_Imovq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0398 */ { UD_Imovd, O_Ey, O_V, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0399 */ { UD_Imovq, O_Q, O_P, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0400 */ { UD_Imovdqu, O_W, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0401 */ { UD_Imovdqa, O_W, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0402 */ { UD_Ijo, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, /* 0403 */ { UD_Ijno, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, /* 0404 */ { UD_Ijb, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, /* 0405 */ { UD_Ijae, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, /* 0406 */ { UD_Ijz, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, /* 0407 */ { UD_Ijnz, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, /* 0408 */ { UD_Ijbe, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, /* 0409 */ { UD_Ija, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, /* 0410 */ { UD_Ijs, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, /* 0411 */ { UD_Ijns, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, /* 0412 */ { UD_Ijp, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, /* 0413 */ { UD_Ijnp, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, /* 0414 */ { UD_Ijl, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, /* 0415 */ { UD_Ijge, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, /* 0416 */ { UD_Ijle, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, /* 0417 */ { UD_Ijg, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, /* 0418 */ { UD_Iseto, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0419 */ { UD_Isetno, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0420 */ { UD_Isetb, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0421 */ { UD_Isetae, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0422 */ { UD_Isetz, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0423 */ { UD_Isetnz, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0424 */ { UD_Isetbe, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0425 */ { UD_Iseta, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0426 */ { UD_Isets, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0427 */ { UD_Isetns, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0428 */ { UD_Isetp, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0429 */ { UD_Isetnp, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0430 */ { UD_Isetl, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0431 */ { UD_Isetge, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0432 */ { UD_Isetle, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0433 */ { UD_Isetg, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0434 */ { UD_Ipush, O_FS, O_NONE, O_NONE, P_none }, /* 0435 */ { UD_Ipop, O_FS, O_NONE, O_NONE, P_none }, /* 0436 */ { UD_Icpuid, O_NONE, O_NONE, O_NONE, P_none }, /* 0437 */ { UD_Ibt, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0438 */ { UD_Ishld, O_Ev, O_Gv, O_Ib, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0439 */ { UD_Ishld, O_Ev, O_Gv, O_CL, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0440 */ { UD_Imontmul, O_NONE, O_NONE, O_NONE, P_none }, /* 0441 */ { UD_Ixsha1, O_NONE, O_NONE, O_NONE, P_none }, /* 0442 */ { UD_Ixsha256, O_NONE, O_NONE, O_NONE, P_none }, /* 0443 */ { UD_Ixstore, O_NONE, O_NONE, O_NONE, P_none }, /* 0444 */ { UD_Ixcryptecb, O_NONE, O_NONE, O_NONE, P_none }, /* 0445 */ { UD_Ixcryptcbc, O_NONE, O_NONE, O_NONE, P_none }, /* 0446 */ { UD_Ixcryptctr, O_NONE, O_NONE, O_NONE, P_none }, /* 0447 */ { UD_Ixcryptcfb, O_NONE, O_NONE, O_NONE, P_none }, /* 0448 */ { UD_Ixcryptofb, O_NONE, O_NONE, O_NONE, P_none }, /* 0449 */ { UD_Ipush, O_GS, O_NONE, O_NONE, P_none }, /* 0450 */ { UD_Ipop, O_GS, O_NONE, O_NONE, P_none }, /* 0451 */ { UD_Irsm, O_NONE, O_NONE, O_NONE, P_none }, /* 0452 */ { UD_Ibts, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0453 */ { UD_Ishrd, O_Ev, O_Gv, O_Ib, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0454 */ { UD_Ishrd, O_Ev, O_Gv, O_CL, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0455 */ { UD_Ifxsave, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0456 */ { UD_Ifxrstor, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0457 */ { UD_Ildmxcsr, O_Md, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0458 */ { UD_Istmxcsr, O_Md, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0459 */ { UD_Ixsave, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0460 */ { UD_Ixrstor, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0461 */ { UD_Iclflush, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0462 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, P_none }, /* 0463 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, P_none }, /* 0464 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, P_none }, /* 0465 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, P_none }, /* 0466 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, P_none }, /* 0467 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, P_none }, /* 0468 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, P_none }, /* 0469 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, P_none }, /* 0470 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, P_none }, /* 0471 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, P_none }, /* 0472 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, P_none }, /* 0473 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, P_none }, /* 0474 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, P_none }, /* 0475 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, P_none }, /* 0476 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, P_none }, /* 0477 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, P_none }, /* 0478 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, P_none }, /* 0479 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, P_none }, /* 0480 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, P_none }, /* 0481 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, P_none }, /* 0482 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, P_none }, /* 0483 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, P_none }, /* 0484 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, P_none }, /* 0485 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, P_none }, /* 0486 */ { UD_Iimul, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0487 */ { UD_Icmpxchg, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0488 */ { UD_Icmpxchg, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0489 */ { UD_Ilss, O_Gv, O_M, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0490 */ { UD_Ibtr, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0491 */ { UD_Ilfs, O_Gz, O_M, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0492 */ { UD_Ilgs, O_Gz, O_M, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0493 */ { UD_Imovzx, O_Gv, O_Eb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0494 */ { UD_Imovzx, O_Gy, O_Ew, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0495 */ { UD_Ipopcnt, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb }, /* 0496 */ { UD_Ibt, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0497 */ { UD_Ibts, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0498 */ { UD_Ibtr, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0499 */ { UD_Ibtc, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0500 */ { UD_Ibtc, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0501 */ { UD_Ibsf, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0502 */ { UD_Ibsr, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0503 */ { UD_Imovsx, O_Gv, O_Eb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0504 */ { UD_Imovsx, O_Gy, O_Ew, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0505 */ { UD_Ixadd, O_Eb, O_Gb, O_NONE, P_aso|P_oso|P_rexr|P_rexx|P_rexb }, /* 0506 */ { UD_Ixadd, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0507 */ { UD_Icmpps, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, /* 0508 */ { UD_Icmpsd, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, /* 0509 */ { UD_Icmpss, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, /* 0510 */ { UD_Icmppd, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, /* 0511 */ { UD_Imovnti, O_M, O_Gy, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0512 */ { UD_Ipinsrw, O_P, O_MwRy, O_Ib, P_aso|P_rexw|P_rexr|P_rexx|P_rexb|P_def64 }, /* 0513 */ { UD_Ipinsrw, O_V, O_MwRy, O_Ib, P_aso|P_rexw|P_rexr|P_rexx|P_rexb|P_def64 }, /* 0514 */ { UD_Ipextrw, O_Gd, O_N, O_Ib, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0515 */ { UD_Ipextrw, O_Gd, O_U, O_Ib, P_aso|P_rexr|P_rexb }, /* 0516 */ { UD_Ishufps, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, /* 0517 */ { UD_Ishufpd, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, /* 0518 */ { UD_Icmpxchg8b, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0519 */ { UD_Icmpxchg8b, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0520 */ { UD_Icmpxchg16b, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0521 */ { UD_Ivmptrld, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0522 */ { UD_Ivmxon, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0523 */ { UD_Ivmclear, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0524 */ { UD_Ivmptrst, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0525 */ { UD_Ibswap, O_R0y, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, /* 0526 */ { UD_Ibswap, O_R1y, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, /* 0527 */ { UD_Ibswap, O_R2y, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, /* 0528 */ { UD_Ibswap, O_R3y, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, /* 0529 */ { UD_Ibswap, O_R4y, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, /* 0530 */ { UD_Ibswap, O_R5y, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, /* 0531 */ { UD_Ibswap, O_R6y, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, /* 0532 */ { UD_Ibswap, O_R7y, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, /* 0533 */ { UD_Iaddsubps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0534 */ { UD_Iaddsubpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0535 */ { UD_Ipsrlw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0536 */ { UD_Ipsrlw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0537 */ { UD_Ipsrld, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0538 */ { UD_Ipsrld, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0539 */ { UD_Ipsrlq, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0540 */ { UD_Ipsrlq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0541 */ { UD_Ipaddq, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0542 */ { UD_Ipaddq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0543 */ { UD_Ipmullw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0544 */ { UD_Ipmullw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0545 */ { UD_Imovdq2q, O_P, O_U, O_NONE, P_aso|P_rexb }, /* 0546 */ { UD_Imovq2dq, O_V, O_N, O_NONE, P_aso|P_rexr }, /* 0547 */ { UD_Imovq, O_W, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0548 */ { UD_Ipmovmskb, O_Gd, O_N, O_NONE, P_oso|P_rexr|P_rexb }, /* 0549 */ { UD_Ipmovmskb, O_Gd, O_U, O_NONE, P_rexr|P_rexb }, /* 0550 */ { UD_Ipsubusb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0551 */ { UD_Ipsubusb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0552 */ { UD_Ipsubusw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0553 */ { UD_Ipsubusw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0554 */ { UD_Ipminub, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0555 */ { UD_Ipminub, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0556 */ { UD_Ipand, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0557 */ { UD_Ipand, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0558 */ { UD_Ipaddusb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0559 */ { UD_Ipaddusb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0560 */ { UD_Ipaddusw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0561 */ { UD_Ipaddusw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0562 */ { UD_Ipmaxub, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0563 */ { UD_Ipmaxub, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0564 */ { UD_Ipandn, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0565 */ { UD_Ipandn, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0566 */ { UD_Ipavgb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0567 */ { UD_Ipavgb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0568 */ { UD_Ipsraw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0569 */ { UD_Ipsraw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0570 */ { UD_Ipsrad, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0571 */ { UD_Ipsrad, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0572 */ { UD_Ipavgw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0573 */ { UD_Ipavgw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0574 */ { UD_Ipmulhuw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0575 */ { UD_Ipmulhuw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0576 */ { UD_Ipmulhw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0577 */ { UD_Ipmulhw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0578 */ { UD_Icvtpd2dq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0579 */ { UD_Icvtdq2pd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0580 */ { UD_Icvttpd2dq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0581 */ { UD_Imovntq, O_M, O_P, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0582 */ { UD_Imovntdq, O_M, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0583 */ { UD_Ipsubsb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0584 */ { UD_Ipsubsb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0585 */ { UD_Ipsubsw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0586 */ { UD_Ipsubsw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0587 */ { UD_Ipminsw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0588 */ { UD_Ipminsw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0589 */ { UD_Ipor, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0590 */ { UD_Ipor, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0591 */ { UD_Ipaddsb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0592 */ { UD_Ipaddsb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0593 */ { UD_Ipaddsw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0594 */ { UD_Ipaddsw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0595 */ { UD_Ipmaxsw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0596 */ { UD_Ipmaxsw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0597 */ { UD_Ipxor, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0598 */ { UD_Ipxor, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0599 */ { UD_Ilddqu, O_V, O_M, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0600 */ { UD_Ipsllw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0601 */ { UD_Ipsllw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0602 */ { UD_Ipslld, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0603 */ { UD_Ipslld, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0604 */ { UD_Ipsllq, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0605 */ { UD_Ipsllq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0606 */ { UD_Ipmuludq, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0607 */ { UD_Ipmuludq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0608 */ { UD_Ipmaddwd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0609 */ { UD_Ipmaddwd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0610 */ { UD_Ipsadbw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0611 */ { UD_Ipsadbw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0612 */ { UD_Imaskmovq, O_P, O_N, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0613 */ { UD_Imaskmovdqu, O_V, O_U, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0614 */ { UD_Ipsubb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0615 */ { UD_Ipsubb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0616 */ { UD_Ipsubw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0617 */ { UD_Ipsubw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0618 */ { UD_Ipsubd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0619 */ { UD_Ipsubd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0620 */ { UD_Ipsubq, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0621 */ { UD_Ipsubq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0622 */ { UD_Ipaddb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0623 */ { UD_Ipaddb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0624 */ { UD_Ipaddw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0625 */ { UD_Ipaddw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0626 */ { UD_Ipaddd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0627 */ { UD_Ipaddd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0628 */ { UD_Iadc, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0629 */ { UD_Iadc, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0630 */ { UD_Iadc, O_Gb, O_Eb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0631 */ { UD_Iadc, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0632 */ { UD_Iadc, O_AL, O_Ib, O_NONE, P_none }, /* 0633 */ { UD_Iadc, O_rAX, O_sIz, O_NONE, P_oso|P_rexw }, /* 0634 */ { UD_Ipush, O_SS, O_NONE, O_NONE, P_inv64 }, /* 0635 */ { UD_Ipop, O_SS, O_NONE, O_NONE, P_inv64 }, /* 0636 */ { UD_Isbb, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0637 */ { UD_Isbb, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0638 */ { UD_Isbb, O_Gb, O_Eb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0639 */ { UD_Isbb, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0640 */ { UD_Isbb, O_AL, O_Ib, O_NONE, P_none }, /* 0641 */ { UD_Isbb, O_rAX, O_sIz, O_NONE, P_oso|P_rexw }, /* 0642 */ { UD_Ipush, O_DS, O_NONE, O_NONE, P_inv64 }, /* 0643 */ { UD_Ipop, O_DS, O_NONE, O_NONE, P_inv64 }, /* 0644 */ { UD_Iand, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0645 */ { UD_Iand, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0646 */ { UD_Iand, O_Gb, O_Eb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0647 */ { UD_Iand, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0648 */ { UD_Iand, O_AL, O_Ib, O_NONE, P_none }, /* 0649 */ { UD_Iand, O_rAX, O_sIz, O_NONE, P_oso|P_rexw }, /* 0650 */ { UD_Idaa, O_NONE, O_NONE, O_NONE, P_inv64 }, /* 0651 */ { UD_Isub, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0652 */ { UD_Isub, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0653 */ { UD_Isub, O_Gb, O_Eb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0654 */ { UD_Isub, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0655 */ { UD_Isub, O_AL, O_Ib, O_NONE, P_none }, /* 0656 */ { UD_Isub, O_rAX, O_sIz, O_NONE, P_oso|P_rexw }, /* 0657 */ { UD_Idas, O_NONE, O_NONE, O_NONE, P_inv64 }, /* 0658 */ { UD_Ixor, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0659 */ { UD_Ixor, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0660 */ { UD_Ixor, O_Gb, O_Eb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0661 */ { UD_Ixor, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0662 */ { UD_Ixor, O_AL, O_Ib, O_NONE, P_none }, /* 0663 */ { UD_Ixor, O_rAX, O_sIz, O_NONE, P_oso|P_rexw }, /* 0664 */ { UD_Iaaa, O_NONE, O_NONE, O_NONE, P_none }, /* 0665 */ { UD_Icmp, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0666 */ { UD_Icmp, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0667 */ { UD_Icmp, O_Gb, O_Eb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0668 */ { UD_Icmp, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0669 */ { UD_Icmp, O_AL, O_Ib, O_NONE, P_none }, /* 0670 */ { UD_Icmp, O_rAX, O_sIz, O_NONE, P_oso|P_rexw }, /* 0671 */ { UD_Iaas, O_NONE, O_NONE, O_NONE, P_none }, /* 0672 */ { UD_Iinc, O_R0z, O_NONE, O_NONE, P_oso }, /* 0673 */ { UD_Iinc, O_R1z, O_NONE, O_NONE, P_oso }, /* 0674 */ { UD_Iinc, O_R2z, O_NONE, O_NONE, P_oso }, /* 0675 */ { UD_Iinc, O_R3z, O_NONE, O_NONE, P_oso }, /* 0676 */ { UD_Iinc, O_R4z, O_NONE, O_NONE, P_oso }, /* 0677 */ { UD_Iinc, O_R5z, O_NONE, O_NONE, P_oso }, /* 0678 */ { UD_Iinc, O_R6z, O_NONE, O_NONE, P_oso }, /* 0679 */ { UD_Iinc, O_R7z, O_NONE, O_NONE, P_oso }, /* 0680 */ { UD_Idec, O_R0z, O_NONE, O_NONE, P_oso }, /* 0681 */ { UD_Idec, O_R1z, O_NONE, O_NONE, P_oso }, /* 0682 */ { UD_Idec, O_R2z, O_NONE, O_NONE, P_oso }, /* 0683 */ { UD_Idec, O_R3z, O_NONE, O_NONE, P_oso }, /* 0684 */ { UD_Idec, O_R4z, O_NONE, O_NONE, P_oso }, /* 0685 */ { UD_Idec, O_R5z, O_NONE, O_NONE, P_oso }, /* 0686 */ { UD_Idec, O_R6z, O_NONE, O_NONE, P_oso }, /* 0687 */ { UD_Idec, O_R7z, O_NONE, O_NONE, P_oso }, /* 0688 */ { UD_Ipush, O_R0v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, /* 0689 */ { UD_Ipush, O_R1v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, /* 0690 */ { UD_Ipush, O_R2v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, /* 0691 */ { UD_Ipush, O_R3v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, /* 0692 */ { UD_Ipush, O_R4v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, /* 0693 */ { UD_Ipush, O_R5v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, /* 0694 */ { UD_Ipush, O_R6v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, /* 0695 */ { UD_Ipush, O_R7v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, /* 0696 */ { UD_Ipop, O_R0v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, /* 0697 */ { UD_Ipop, O_R1v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, /* 0698 */ { UD_Ipop, O_R2v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, /* 0699 */ { UD_Ipop, O_R3v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, /* 0700 */ { UD_Ipop, O_R4v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, /* 0701 */ { UD_Ipop, O_R5v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, /* 0702 */ { UD_Ipop, O_R6v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, /* 0703 */ { UD_Ipop, O_R7v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, /* 0704 */ { UD_Ipusha, O_NONE, O_NONE, O_NONE, P_oso|P_inv64 }, /* 0705 */ { UD_Ipushad, O_NONE, O_NONE, O_NONE, P_oso|P_inv64 }, /* 0706 */ { UD_Ipopa, O_NONE, O_NONE, O_NONE, P_oso|P_inv64 }, /* 0707 */ { UD_Ipopad, O_NONE, O_NONE, O_NONE, P_oso|P_inv64 }, /* 0708 */ { UD_Ibound, O_Gv, O_M, O_NONE, P_aso|P_oso }, /* 0709 */ { UD_Iarpl, O_Ew, O_Gw, O_NONE, P_aso }, /* 0710 */ { UD_Imovsxd, O_Gq, O_Ed, O_NONE, P_aso|P_oso|P_rexw|P_rexx|P_rexr|P_rexb }, /* 0711 */ { UD_Ipush, O_sIz, O_NONE, O_NONE, P_oso|P_def64 }, /* 0712 */ { UD_Iimul, O_Gv, O_Ev, O_Iz, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0713 */ { UD_Ipush, O_sIb, O_NONE, O_NONE, P_oso|P_def64 }, /* 0714 */ { UD_Iimul, O_Gv, O_Ev, O_sIb, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0715 */ { UD_Iinsb, O_NONE, O_NONE, O_NONE, P_str|P_seg }, /* 0716 */ { UD_Iinsw, O_NONE, O_NONE, O_NONE, P_str|P_oso|P_seg }, /* 0717 */ { UD_Iinsd, O_NONE, O_NONE, O_NONE, P_str|P_oso|P_seg }, /* 0718 */ { UD_Ioutsb, O_NONE, O_NONE, O_NONE, P_str|P_seg }, /* 0719 */ { UD_Ioutsw, O_NONE, O_NONE, O_NONE, P_str|P_oso|P_seg }, /* 0720 */ { UD_Ioutsd, O_NONE, O_NONE, O_NONE, P_str|P_oso|P_seg }, /* 0721 */ { UD_Ijo, O_Jb, O_NONE, O_NONE, P_none }, /* 0722 */ { UD_Ijno, O_Jb, O_NONE, O_NONE, P_none }, /* 0723 */ { UD_Ijb, O_Jb, O_NONE, O_NONE, P_none }, /* 0724 */ { UD_Ijae, O_Jb, O_NONE, O_NONE, P_none }, /* 0725 */ { UD_Ijz, O_Jb, O_NONE, O_NONE, P_none }, /* 0726 */ { UD_Ijnz, O_Jb, O_NONE, O_NONE, P_none }, /* 0727 */ { UD_Ijbe, O_Jb, O_NONE, O_NONE, P_none }, /* 0728 */ { UD_Ija, O_Jb, O_NONE, O_NONE, P_none }, /* 0729 */ { UD_Ijs, O_Jb, O_NONE, O_NONE, P_none }, /* 0730 */ { UD_Ijns, O_Jb, O_NONE, O_NONE, P_none }, /* 0731 */ { UD_Ijp, O_Jb, O_NONE, O_NONE, P_none }, /* 0732 */ { UD_Ijnp, O_Jb, O_NONE, O_NONE, P_none }, /* 0733 */ { UD_Ijl, O_Jb, O_NONE, O_NONE, P_none }, /* 0734 */ { UD_Ijge, O_Jb, O_NONE, O_NONE, P_none }, /* 0735 */ { UD_Ijle, O_Jb, O_NONE, O_NONE, P_none }, /* 0736 */ { UD_Ijg, O_Jb, O_NONE, O_NONE, P_none }, /* 0737 */ { UD_Iadd, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0738 */ { UD_Ior, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0739 */ { UD_Iadc, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0740 */ { UD_Isbb, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0741 */ { UD_Iand, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0742 */ { UD_Isub, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0743 */ { UD_Ixor, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0744 */ { UD_Icmp, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0745 */ { UD_Iadd, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0746 */ { UD_Ior, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0747 */ { UD_Iadc, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0748 */ { UD_Isbb, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0749 */ { UD_Iand, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0750 */ { UD_Isub, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0751 */ { UD_Ixor, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0752 */ { UD_Icmp, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0753 */ { UD_Iadd, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_inv64 }, /* 0754 */ { UD_Ior, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0755 */ { UD_Iadc, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_inv64 }, /* 0756 */ { UD_Isbb, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_inv64 }, /* 0757 */ { UD_Iand, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_inv64 }, /* 0758 */ { UD_Isub, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_inv64 }, /* 0759 */ { UD_Ixor, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_inv64 }, /* 0760 */ { UD_Icmp, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_inv64 }, /* 0761 */ { UD_Iadd, O_Ev, O_sIb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0762 */ { UD_Ior, O_Ev, O_sIb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0763 */ { UD_Iadc, O_Ev, O_sIb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0764 */ { UD_Isbb, O_Ev, O_sIb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0765 */ { UD_Iand, O_Ev, O_sIb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0766 */ { UD_Isub, O_Ev, O_sIb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0767 */ { UD_Ixor, O_Ev, O_sIb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0768 */ { UD_Icmp, O_Ev, O_sIb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0769 */ { UD_Itest, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0770 */ { UD_Itest, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0771 */ { UD_Ixchg, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0772 */ { UD_Ixchg, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0773 */ { UD_Imov, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0774 */ { UD_Imov, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0775 */ { UD_Imov, O_Gb, O_Eb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0776 */ { UD_Imov, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0777 */ { UD_Imov, O_MwRv, O_S, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0778 */ { UD_Ilea, O_Gv, O_M, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0779 */ { UD_Imov, O_S, O_MwRv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0780 */ { UD_Ipop, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb|P_def64 }, /* 0781 */ { UD_Ixchg, O_R0v, O_rAX, O_NONE, P_oso|P_rexw|P_rexb }, /* 0782 */ { UD_Ixchg, O_R1v, O_rAX, O_NONE, P_oso|P_rexw|P_rexb }, /* 0783 */ { UD_Ixchg, O_R2v, O_rAX, O_NONE, P_oso|P_rexw|P_rexb }, /* 0784 */ { UD_Ixchg, O_R3v, O_rAX, O_NONE, P_oso|P_rexw|P_rexb }, /* 0785 */ { UD_Ixchg, O_R4v, O_rAX, O_NONE, P_oso|P_rexw|P_rexb }, /* 0786 */ { UD_Ixchg, O_R5v, O_rAX, O_NONE, P_oso|P_rexw|P_rexb }, /* 0787 */ { UD_Ixchg, O_R6v, O_rAX, O_NONE, P_oso|P_rexw|P_rexb }, /* 0788 */ { UD_Ixchg, O_R7v, O_rAX, O_NONE, P_oso|P_rexw|P_rexb }, /* 0789 */ { UD_Icbw, O_NONE, O_NONE, O_NONE, P_oso|P_rexw }, /* 0790 */ { UD_Icwde, O_NONE, O_NONE, O_NONE, P_oso|P_rexw }, /* 0791 */ { UD_Icdqe, O_NONE, O_NONE, O_NONE, P_oso|P_rexw }, /* 0792 */ { UD_Icwd, O_NONE, O_NONE, O_NONE, P_oso|P_rexw }, /* 0793 */ { UD_Icdq, O_NONE, O_NONE, O_NONE, P_oso|P_rexw }, /* 0794 */ { UD_Icqo, O_NONE, O_NONE, O_NONE, P_oso|P_rexw }, /* 0795 */ { UD_Icall, O_Av, O_NONE, O_NONE, P_oso }, /* 0796 */ { UD_Iwait, O_NONE, O_NONE, O_NONE, P_none }, /* 0797 */ { UD_Ipushfw, O_NONE, O_NONE, O_NONE, P_oso }, /* 0798 */ { UD_Ipushfw, O_NONE, O_NONE, O_NONE, P_oso|P_rexw|P_def64 }, /* 0799 */ { UD_Ipushfd, O_NONE, O_NONE, O_NONE, P_oso }, /* 0800 */ { UD_Ipushfq, O_NONE, O_NONE, O_NONE, P_oso|P_rexw|P_def64 }, /* 0801 */ { UD_Ipushfq, O_NONE, O_NONE, O_NONE, P_oso|P_rexw|P_def64 }, /* 0802 */ { UD_Ipopfw, O_NONE, O_NONE, O_NONE, P_oso }, /* 0803 */ { UD_Ipopfd, O_NONE, O_NONE, O_NONE, P_oso }, /* 0804 */ { UD_Ipopfq, O_NONE, O_NONE, O_NONE, P_oso|P_def64 }, /* 0805 */ { UD_Ipopfq, O_NONE, O_NONE, O_NONE, P_oso|P_def64 }, /* 0806 */ { UD_Isahf, O_NONE, O_NONE, O_NONE, P_none }, /* 0807 */ { UD_Ilahf, O_NONE, O_NONE, O_NONE, P_none }, /* 0808 */ { UD_Imov, O_AL, O_Ob, O_NONE, P_none }, /* 0809 */ { UD_Imov, O_rAX, O_Ov, O_NONE, P_aso|P_oso|P_rexw }, /* 0810 */ { UD_Imov, O_Ob, O_AL, O_NONE, P_none }, /* 0811 */ { UD_Imov, O_Ov, O_rAX, O_NONE, P_aso|P_oso|P_rexw }, /* 0812 */ { UD_Imovsb, O_NONE, O_NONE, O_NONE, P_str|P_seg }, /* 0813 */ { UD_Imovsw, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw }, /* 0814 */ { UD_Imovsd, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw }, /* 0815 */ { UD_Imovsq, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw }, /* 0816 */ { UD_Icmpsb, O_NONE, O_NONE, O_NONE, P_strz|P_seg }, /* 0817 */ { UD_Icmpsw, O_NONE, O_NONE, O_NONE, P_strz|P_oso|P_rexw|P_seg }, /* 0818 */ { UD_Icmpsd, O_NONE, O_NONE, O_NONE, P_strz|P_oso|P_rexw|P_seg }, /* 0819 */ { UD_Icmpsq, O_NONE, O_NONE, O_NONE, P_strz|P_oso|P_rexw|P_seg }, /* 0820 */ { UD_Itest, O_AL, O_Ib, O_NONE, P_none }, /* 0821 */ { UD_Itest, O_rAX, O_sIz, O_NONE, P_oso|P_rexw }, /* 0822 */ { UD_Istosb, O_NONE, O_NONE, O_NONE, P_str|P_seg }, /* 0823 */ { UD_Istosw, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw }, /* 0824 */ { UD_Istosd, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw }, /* 0825 */ { UD_Istosq, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw }, /* 0826 */ { UD_Ilodsb, O_NONE, O_NONE, O_NONE, P_str|P_seg }, /* 0827 */ { UD_Ilodsw, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw }, /* 0828 */ { UD_Ilodsd, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw }, /* 0829 */ { UD_Ilodsq, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw }, /* 0830 */ { UD_Iscasb, O_NONE, O_NONE, O_NONE, P_strz }, /* 0831 */ { UD_Iscasw, O_NONE, O_NONE, O_NONE, P_strz|P_oso|P_rexw }, /* 0832 */ { UD_Iscasd, O_NONE, O_NONE, O_NONE, P_strz|P_oso|P_rexw }, /* 0833 */ { UD_Iscasq, O_NONE, O_NONE, O_NONE, P_strz|P_oso|P_rexw }, /* 0834 */ { UD_Imov, O_R0b, O_Ib, O_NONE, P_rexb }, /* 0835 */ { UD_Imov, O_R1b, O_Ib, O_NONE, P_rexb }, /* 0836 */ { UD_Imov, O_R2b, O_Ib, O_NONE, P_rexb }, /* 0837 */ { UD_Imov, O_R3b, O_Ib, O_NONE, P_rexb }, /* 0838 */ { UD_Imov, O_R4b, O_Ib, O_NONE, P_rexb }, /* 0839 */ { UD_Imov, O_R5b, O_Ib, O_NONE, P_rexb }, /* 0840 */ { UD_Imov, O_R6b, O_Ib, O_NONE, P_rexb }, /* 0841 */ { UD_Imov, O_R7b, O_Ib, O_NONE, P_rexb }, /* 0842 */ { UD_Imov, O_R0v, O_Iv, O_NONE, P_oso|P_rexw|P_rexb }, /* 0843 */ { UD_Imov, O_R1v, O_Iv, O_NONE, P_oso|P_rexw|P_rexb }, /* 0844 */ { UD_Imov, O_R2v, O_Iv, O_NONE, P_oso|P_rexw|P_rexb }, /* 0845 */ { UD_Imov, O_R3v, O_Iv, O_NONE, P_oso|P_rexw|P_rexb }, /* 0846 */ { UD_Imov, O_R4v, O_Iv, O_NONE, P_oso|P_rexw|P_rexb }, /* 0847 */ { UD_Imov, O_R5v, O_Iv, O_NONE, P_oso|P_rexw|P_rexb }, /* 0848 */ { UD_Imov, O_R6v, O_Iv, O_NONE, P_oso|P_rexw|P_rexb }, /* 0849 */ { UD_Imov, O_R7v, O_Iv, O_NONE, P_oso|P_rexw|P_rexb }, /* 0850 */ { UD_Irol, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0851 */ { UD_Iror, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0852 */ { UD_Ircl, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0853 */ { UD_Ircr, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0854 */ { UD_Ishl, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0855 */ { UD_Ishr, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0856 */ { UD_Ishl, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0857 */ { UD_Isar, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0858 */ { UD_Irol, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0859 */ { UD_Iror, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0860 */ { UD_Ircl, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0861 */ { UD_Ircr, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0862 */ { UD_Ishl, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0863 */ { UD_Ishr, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0864 */ { UD_Ishl, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0865 */ { UD_Isar, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0866 */ { UD_Iret, O_Iw, O_NONE, O_NONE, P_none }, /* 0867 */ { UD_Iret, O_NONE, O_NONE, O_NONE, P_none }, /* 0868 */ { UD_Iles, O_Gv, O_M, O_NONE, P_aso|P_oso }, /* 0869 */ { UD_Ilds, O_Gv, O_M, O_NONE, P_aso|P_oso }, /* 0870 */ { UD_Imov, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0871 */ { UD_Imov, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0872 */ { UD_Ienter, O_Iw, O_Ib, O_NONE, P_def64 }, /* 0873 */ { UD_Ileave, O_NONE, O_NONE, O_NONE, P_none }, /* 0874 */ { UD_Iretf, O_Iw, O_NONE, O_NONE, P_none }, /* 0875 */ { UD_Iretf, O_NONE, O_NONE, O_NONE, P_none }, /* 0876 */ { UD_Iint3, O_NONE, O_NONE, O_NONE, P_none }, /* 0877 */ { UD_Iint, O_Ib, O_NONE, O_NONE, P_none }, /* 0878 */ { UD_Iinto, O_NONE, O_NONE, O_NONE, P_inv64 }, /* 0879 */ { UD_Iiretw, O_NONE, O_NONE, O_NONE, P_oso|P_rexw }, /* 0880 */ { UD_Iiretd, O_NONE, O_NONE, O_NONE, P_oso|P_rexw }, /* 0881 */ { UD_Iiretq, O_NONE, O_NONE, O_NONE, P_oso|P_rexw }, /* 0882 */ { UD_Irol, O_Eb, O_I1, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0883 */ { UD_Iror, O_Eb, O_I1, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0884 */ { UD_Ircl, O_Eb, O_I1, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0885 */ { UD_Ircr, O_Eb, O_I1, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0886 */ { UD_Ishl, O_Eb, O_I1, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0887 */ { UD_Ishr, O_Eb, O_I1, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0888 */ { UD_Ishl, O_Eb, O_I1, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0889 */ { UD_Isar, O_Eb, O_I1, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0890 */ { UD_Irol, O_Ev, O_I1, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0891 */ { UD_Iror, O_Ev, O_I1, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0892 */ { UD_Ircl, O_Ev, O_I1, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0893 */ { UD_Ircr, O_Ev, O_I1, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0894 */ { UD_Ishl, O_Ev, O_I1, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0895 */ { UD_Ishr, O_Ev, O_I1, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0896 */ { UD_Ishl, O_Ev, O_I1, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0897 */ { UD_Isar, O_Ev, O_I1, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0898 */ { UD_Irol, O_Eb, O_CL, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0899 */ { UD_Iror, O_Eb, O_CL, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0900 */ { UD_Ircl, O_Eb, O_CL, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0901 */ { UD_Ircr, O_Eb, O_CL, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0902 */ { UD_Ishl, O_Eb, O_CL, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0903 */ { UD_Ishr, O_Eb, O_CL, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0904 */ { UD_Ishl, O_Eb, O_CL, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0905 */ { UD_Isar, O_Eb, O_CL, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0906 */ { UD_Irol, O_Ev, O_CL, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0907 */ { UD_Iror, O_Ev, O_CL, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0908 */ { UD_Ircl, O_Ev, O_CL, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0909 */ { UD_Ircr, O_Ev, O_CL, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0910 */ { UD_Ishl, O_Ev, O_CL, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0911 */ { UD_Ishr, O_Ev, O_CL, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0912 */ { UD_Ishl, O_Ev, O_CL, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0913 */ { UD_Isar, O_Ev, O_CL, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 0914 */ { UD_Iaam, O_Ib, O_NONE, O_NONE, P_none }, /* 0915 */ { UD_Iaad, O_Ib, O_NONE, O_NONE, P_none }, /* 0916 */ { UD_Isalc, O_NONE, O_NONE, O_NONE, P_inv64 }, /* 0917 */ { UD_Ixlatb, O_NONE, O_NONE, O_NONE, P_rexw|P_seg }, /* 0918 */ { UD_Ifadd, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0919 */ { UD_Ifmul, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0920 */ { UD_Ifcom, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0921 */ { UD_Ifcomp, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0922 */ { UD_Ifsub, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0923 */ { UD_Ifsubr, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0924 */ { UD_Ifdiv, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0925 */ { UD_Ifdivr, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0926 */ { UD_Ifadd, O_ST0, O_ST0, O_NONE, P_none }, /* 0927 */ { UD_Ifadd, O_ST0, O_ST1, O_NONE, P_none }, /* 0928 */ { UD_Ifadd, O_ST0, O_ST2, O_NONE, P_none }, /* 0929 */ { UD_Ifadd, O_ST0, O_ST3, O_NONE, P_none }, /* 0930 */ { UD_Ifadd, O_ST0, O_ST4, O_NONE, P_none }, /* 0931 */ { UD_Ifadd, O_ST0, O_ST5, O_NONE, P_none }, /* 0932 */ { UD_Ifadd, O_ST0, O_ST6, O_NONE, P_none }, /* 0933 */ { UD_Ifadd, O_ST0, O_ST7, O_NONE, P_none }, /* 0934 */ { UD_Ifmul, O_ST0, O_ST0, O_NONE, P_none }, /* 0935 */ { UD_Ifmul, O_ST0, O_ST1, O_NONE, P_none }, /* 0936 */ { UD_Ifmul, O_ST0, O_ST2, O_NONE, P_none }, /* 0937 */ { UD_Ifmul, O_ST0, O_ST3, O_NONE, P_none }, /* 0938 */ { UD_Ifmul, O_ST0, O_ST4, O_NONE, P_none }, /* 0939 */ { UD_Ifmul, O_ST0, O_ST5, O_NONE, P_none }, /* 0940 */ { UD_Ifmul, O_ST0, O_ST6, O_NONE, P_none }, /* 0941 */ { UD_Ifmul, O_ST0, O_ST7, O_NONE, P_none }, /* 0942 */ { UD_Ifcom, O_ST0, O_ST0, O_NONE, P_none }, /* 0943 */ { UD_Ifcom, O_ST0, O_ST1, O_NONE, P_none }, /* 0944 */ { UD_Ifcom, O_ST0, O_ST2, O_NONE, P_none }, /* 0945 */ { UD_Ifcom, O_ST0, O_ST3, O_NONE, P_none }, /* 0946 */ { UD_Ifcom, O_ST0, O_ST4, O_NONE, P_none }, /* 0947 */ { UD_Ifcom, O_ST0, O_ST5, O_NONE, P_none }, /* 0948 */ { UD_Ifcom, O_ST0, O_ST6, O_NONE, P_none }, /* 0949 */ { UD_Ifcom, O_ST0, O_ST7, O_NONE, P_none }, /* 0950 */ { UD_Ifcomp, O_ST0, O_ST0, O_NONE, P_none }, /* 0951 */ { UD_Ifcomp, O_ST0, O_ST1, O_NONE, P_none }, /* 0952 */ { UD_Ifcomp, O_ST0, O_ST2, O_NONE, P_none }, /* 0953 */ { UD_Ifcomp, O_ST0, O_ST3, O_NONE, P_none }, /* 0954 */ { UD_Ifcomp, O_ST0, O_ST4, O_NONE, P_none }, /* 0955 */ { UD_Ifcomp, O_ST0, O_ST5, O_NONE, P_none }, /* 0956 */ { UD_Ifcomp, O_ST0, O_ST6, O_NONE, P_none }, /* 0957 */ { UD_Ifcomp, O_ST0, O_ST7, O_NONE, P_none }, /* 0958 */ { UD_Ifsub, O_ST0, O_ST0, O_NONE, P_none }, /* 0959 */ { UD_Ifsub, O_ST0, O_ST1, O_NONE, P_none }, /* 0960 */ { UD_Ifsub, O_ST0, O_ST2, O_NONE, P_none }, /* 0961 */ { UD_Ifsub, O_ST0, O_ST3, O_NONE, P_none }, /* 0962 */ { UD_Ifsub, O_ST0, O_ST4, O_NONE, P_none }, /* 0963 */ { UD_Ifsub, O_ST0, O_ST5, O_NONE, P_none }, /* 0964 */ { UD_Ifsub, O_ST0, O_ST6, O_NONE, P_none }, /* 0965 */ { UD_Ifsub, O_ST0, O_ST7, O_NONE, P_none }, /* 0966 */ { UD_Ifsubr, O_ST0, O_ST0, O_NONE, P_none }, /* 0967 */ { UD_Ifsubr, O_ST0, O_ST1, O_NONE, P_none }, /* 0968 */ { UD_Ifsubr, O_ST0, O_ST2, O_NONE, P_none }, /* 0969 */ { UD_Ifsubr, O_ST0, O_ST3, O_NONE, P_none }, /* 0970 */ { UD_Ifsubr, O_ST0, O_ST4, O_NONE, P_none }, /* 0971 */ { UD_Ifsubr, O_ST0, O_ST5, O_NONE, P_none }, /* 0972 */ { UD_Ifsubr, O_ST0, O_ST6, O_NONE, P_none }, /* 0973 */ { UD_Ifsubr, O_ST0, O_ST7, O_NONE, P_none }, /* 0974 */ { UD_Ifdiv, O_ST0, O_ST0, O_NONE, P_none }, /* 0975 */ { UD_Ifdiv, O_ST0, O_ST1, O_NONE, P_none }, /* 0976 */ { UD_Ifdiv, O_ST0, O_ST2, O_NONE, P_none }, /* 0977 */ { UD_Ifdiv, O_ST0, O_ST3, O_NONE, P_none }, /* 0978 */ { UD_Ifdiv, O_ST0, O_ST4, O_NONE, P_none }, /* 0979 */ { UD_Ifdiv, O_ST0, O_ST5, O_NONE, P_none }, /* 0980 */ { UD_Ifdiv, O_ST0, O_ST6, O_NONE, P_none }, /* 0981 */ { UD_Ifdiv, O_ST0, O_ST7, O_NONE, P_none }, /* 0982 */ { UD_Ifdivr, O_ST0, O_ST0, O_NONE, P_none }, /* 0983 */ { UD_Ifdivr, O_ST0, O_ST1, O_NONE, P_none }, /* 0984 */ { UD_Ifdivr, O_ST0, O_ST2, O_NONE, P_none }, /* 0985 */ { UD_Ifdivr, O_ST0, O_ST3, O_NONE, P_none }, /* 0986 */ { UD_Ifdivr, O_ST0, O_ST4, O_NONE, P_none }, /* 0987 */ { UD_Ifdivr, O_ST0, O_ST5, O_NONE, P_none }, /* 0988 */ { UD_Ifdivr, O_ST0, O_ST6, O_NONE, P_none }, /* 0989 */ { UD_Ifdivr, O_ST0, O_ST7, O_NONE, P_none }, /* 0990 */ { UD_Ifld, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0991 */ { UD_Ifst, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0992 */ { UD_Ifstp, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0993 */ { UD_Ifldenv, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0994 */ { UD_Ifldcw, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0995 */ { UD_Ifnstenv, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0996 */ { UD_Ifnstcw, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 0997 */ { UD_Ifld, O_ST0, O_NONE, O_NONE, P_none }, /* 0998 */ { UD_Ifld, O_ST1, O_NONE, O_NONE, P_none }, /* 0999 */ { UD_Ifld, O_ST2, O_NONE, O_NONE, P_none }, /* 1000 */ { UD_Ifld, O_ST3, O_NONE, O_NONE, P_none }, /* 1001 */ { UD_Ifld, O_ST4, O_NONE, O_NONE, P_none }, /* 1002 */ { UD_Ifld, O_ST5, O_NONE, O_NONE, P_none }, /* 1003 */ { UD_Ifld, O_ST6, O_NONE, O_NONE, P_none }, /* 1004 */ { UD_Ifld, O_ST7, O_NONE, O_NONE, P_none }, /* 1005 */ { UD_Ifxch, O_ST0, O_ST0, O_NONE, P_none }, /* 1006 */ { UD_Ifxch, O_ST0, O_ST1, O_NONE, P_none }, /* 1007 */ { UD_Ifxch, O_ST0, O_ST2, O_NONE, P_none }, /* 1008 */ { UD_Ifxch, O_ST0, O_ST3, O_NONE, P_none }, /* 1009 */ { UD_Ifxch, O_ST0, O_ST4, O_NONE, P_none }, /* 1010 */ { UD_Ifxch, O_ST0, O_ST5, O_NONE, P_none }, /* 1011 */ { UD_Ifxch, O_ST0, O_ST6, O_NONE, P_none }, /* 1012 */ { UD_Ifxch, O_ST0, O_ST7, O_NONE, P_none }, /* 1013 */ { UD_Ifnop, O_NONE, O_NONE, O_NONE, P_none }, /* 1014 */ { UD_Ifstp1, O_ST0, O_NONE, O_NONE, P_none }, /* 1015 */ { UD_Ifstp1, O_ST1, O_NONE, O_NONE, P_none }, /* 1016 */ { UD_Ifstp1, O_ST2, O_NONE, O_NONE, P_none }, /* 1017 */ { UD_Ifstp1, O_ST3, O_NONE, O_NONE, P_none }, /* 1018 */ { UD_Ifstp1, O_ST4, O_NONE, O_NONE, P_none }, /* 1019 */ { UD_Ifstp1, O_ST5, O_NONE, O_NONE, P_none }, /* 1020 */ { UD_Ifstp1, O_ST6, O_NONE, O_NONE, P_none }, /* 1021 */ { UD_Ifstp1, O_ST7, O_NONE, O_NONE, P_none }, /* 1022 */ { UD_Ifchs, O_NONE, O_NONE, O_NONE, P_none }, /* 1023 */ { UD_Ifabs, O_NONE, O_NONE, O_NONE, P_none }, /* 1024 */ { UD_Iftst, O_NONE, O_NONE, O_NONE, P_none }, /* 1025 */ { UD_Ifxam, O_NONE, O_NONE, O_NONE, P_none }, /* 1026 */ { UD_Ifld1, O_NONE, O_NONE, O_NONE, P_none }, /* 1027 */ { UD_Ifldl2t, O_NONE, O_NONE, O_NONE, P_none }, /* 1028 */ { UD_Ifldl2e, O_NONE, O_NONE, O_NONE, P_none }, /* 1029 */ { UD_Ifldpi, O_NONE, O_NONE, O_NONE, P_none }, /* 1030 */ { UD_Ifldlg2, O_NONE, O_NONE, O_NONE, P_none }, /* 1031 */ { UD_Ifldln2, O_NONE, O_NONE, O_NONE, P_none }, /* 1032 */ { UD_Ifldz, O_NONE, O_NONE, O_NONE, P_none }, /* 1033 */ { UD_If2xm1, O_NONE, O_NONE, O_NONE, P_none }, /* 1034 */ { UD_Ifyl2x, O_NONE, O_NONE, O_NONE, P_none }, /* 1035 */ { UD_Ifptan, O_NONE, O_NONE, O_NONE, P_none }, /* 1036 */ { UD_Ifpatan, O_NONE, O_NONE, O_NONE, P_none }, /* 1037 */ { UD_Ifxtract, O_NONE, O_NONE, O_NONE, P_none }, /* 1038 */ { UD_Ifprem1, O_NONE, O_NONE, O_NONE, P_none }, /* 1039 */ { UD_Ifdecstp, O_NONE, O_NONE, O_NONE, P_none }, /* 1040 */ { UD_Ifincstp, O_NONE, O_NONE, O_NONE, P_none }, /* 1041 */ { UD_Ifprem, O_NONE, O_NONE, O_NONE, P_none }, /* 1042 */ { UD_Ifyl2xp1, O_NONE, O_NONE, O_NONE, P_none }, /* 1043 */ { UD_Ifsqrt, O_NONE, O_NONE, O_NONE, P_none }, /* 1044 */ { UD_Ifsincos, O_NONE, O_NONE, O_NONE, P_none }, /* 1045 */ { UD_Ifrndint, O_NONE, O_NONE, O_NONE, P_none }, /* 1046 */ { UD_Ifscale, O_NONE, O_NONE, O_NONE, P_none }, /* 1047 */ { UD_Ifsin, O_NONE, O_NONE, O_NONE, P_none }, /* 1048 */ { UD_Ifcos, O_NONE, O_NONE, O_NONE, P_none }, /* 1049 */ { UD_Ifiadd, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1050 */ { UD_Ifimul, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1051 */ { UD_Ificom, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1052 */ { UD_Ificomp, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1053 */ { UD_Ifisub, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1054 */ { UD_Ifisubr, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1055 */ { UD_Ifidiv, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1056 */ { UD_Ifidivr, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1057 */ { UD_Ifcmovb, O_ST0, O_ST0, O_NONE, P_none }, /* 1058 */ { UD_Ifcmovb, O_ST0, O_ST1, O_NONE, P_none }, /* 1059 */ { UD_Ifcmovb, O_ST0, O_ST2, O_NONE, P_none }, /* 1060 */ { UD_Ifcmovb, O_ST0, O_ST3, O_NONE, P_none }, /* 1061 */ { UD_Ifcmovb, O_ST0, O_ST4, O_NONE, P_none }, /* 1062 */ { UD_Ifcmovb, O_ST0, O_ST5, O_NONE, P_none }, /* 1063 */ { UD_Ifcmovb, O_ST0, O_ST6, O_NONE, P_none }, /* 1064 */ { UD_Ifcmovb, O_ST0, O_ST7, O_NONE, P_none }, /* 1065 */ { UD_Ifcmove, O_ST0, O_ST0, O_NONE, P_none }, /* 1066 */ { UD_Ifcmove, O_ST0, O_ST1, O_NONE, P_none }, /* 1067 */ { UD_Ifcmove, O_ST0, O_ST2, O_NONE, P_none }, /* 1068 */ { UD_Ifcmove, O_ST0, O_ST3, O_NONE, P_none }, /* 1069 */ { UD_Ifcmove, O_ST0, O_ST4, O_NONE, P_none }, /* 1070 */ { UD_Ifcmove, O_ST0, O_ST5, O_NONE, P_none }, /* 1071 */ { UD_Ifcmove, O_ST0, O_ST6, O_NONE, P_none }, /* 1072 */ { UD_Ifcmove, O_ST0, O_ST7, O_NONE, P_none }, /* 1073 */ { UD_Ifcmovbe, O_ST0, O_ST0, O_NONE, P_none }, /* 1074 */ { UD_Ifcmovbe, O_ST0, O_ST1, O_NONE, P_none }, /* 1075 */ { UD_Ifcmovbe, O_ST0, O_ST2, O_NONE, P_none }, /* 1076 */ { UD_Ifcmovbe, O_ST0, O_ST3, O_NONE, P_none }, /* 1077 */ { UD_Ifcmovbe, O_ST0, O_ST4, O_NONE, P_none }, /* 1078 */ { UD_Ifcmovbe, O_ST0, O_ST5, O_NONE, P_none }, /* 1079 */ { UD_Ifcmovbe, O_ST0, O_ST6, O_NONE, P_none }, /* 1080 */ { UD_Ifcmovbe, O_ST0, O_ST7, O_NONE, P_none }, /* 1081 */ { UD_Ifcmovu, O_ST0, O_ST0, O_NONE, P_none }, /* 1082 */ { UD_Ifcmovu, O_ST0, O_ST1, O_NONE, P_none }, /* 1083 */ { UD_Ifcmovu, O_ST0, O_ST2, O_NONE, P_none }, /* 1084 */ { UD_Ifcmovu, O_ST0, O_ST3, O_NONE, P_none }, /* 1085 */ { UD_Ifcmovu, O_ST0, O_ST4, O_NONE, P_none }, /* 1086 */ { UD_Ifcmovu, O_ST0, O_ST5, O_NONE, P_none }, /* 1087 */ { UD_Ifcmovu, O_ST0, O_ST6, O_NONE, P_none }, /* 1088 */ { UD_Ifcmovu, O_ST0, O_ST7, O_NONE, P_none }, /* 1089 */ { UD_Ifucompp, O_NONE, O_NONE, O_NONE, P_none }, /* 1090 */ { UD_Ifild, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1091 */ { UD_Ifisttp, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1092 */ { UD_Ifist, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1093 */ { UD_Ifistp, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1094 */ { UD_Ifld, O_Mt, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1095 */ { UD_Ifstp, O_Mt, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1096 */ { UD_Ifcmovnb, O_ST0, O_ST0, O_NONE, P_none }, /* 1097 */ { UD_Ifcmovnb, O_ST0, O_ST1, O_NONE, P_none }, /* 1098 */ { UD_Ifcmovnb, O_ST0, O_ST2, O_NONE, P_none }, /* 1099 */ { UD_Ifcmovnb, O_ST0, O_ST3, O_NONE, P_none }, /* 1100 */ { UD_Ifcmovnb, O_ST0, O_ST4, O_NONE, P_none }, /* 1101 */ { UD_Ifcmovnb, O_ST0, O_ST5, O_NONE, P_none }, /* 1102 */ { UD_Ifcmovnb, O_ST0, O_ST6, O_NONE, P_none }, /* 1103 */ { UD_Ifcmovnb, O_ST0, O_ST7, O_NONE, P_none }, /* 1104 */ { UD_Ifcmovne, O_ST0, O_ST0, O_NONE, P_none }, /* 1105 */ { UD_Ifcmovne, O_ST0, O_ST1, O_NONE, P_none }, /* 1106 */ { UD_Ifcmovne, O_ST0, O_ST2, O_NONE, P_none }, /* 1107 */ { UD_Ifcmovne, O_ST0, O_ST3, O_NONE, P_none }, /* 1108 */ { UD_Ifcmovne, O_ST0, O_ST4, O_NONE, P_none }, /* 1109 */ { UD_Ifcmovne, O_ST0, O_ST5, O_NONE, P_none }, /* 1110 */ { UD_Ifcmovne, O_ST0, O_ST6, O_NONE, P_none }, /* 1111 */ { UD_Ifcmovne, O_ST0, O_ST7, O_NONE, P_none }, /* 1112 */ { UD_Ifcmovnbe, O_ST0, O_ST0, O_NONE, P_none }, /* 1113 */ { UD_Ifcmovnbe, O_ST0, O_ST1, O_NONE, P_none }, /* 1114 */ { UD_Ifcmovnbe, O_ST0, O_ST2, O_NONE, P_none }, /* 1115 */ { UD_Ifcmovnbe, O_ST0, O_ST3, O_NONE, P_none }, /* 1116 */ { UD_Ifcmovnbe, O_ST0, O_ST4, O_NONE, P_none }, /* 1117 */ { UD_Ifcmovnbe, O_ST0, O_ST5, O_NONE, P_none }, /* 1118 */ { UD_Ifcmovnbe, O_ST0, O_ST6, O_NONE, P_none }, /* 1119 */ { UD_Ifcmovnbe, O_ST0, O_ST7, O_NONE, P_none }, /* 1120 */ { UD_Ifcmovnu, O_ST0, O_ST0, O_NONE, P_none }, /* 1121 */ { UD_Ifcmovnu, O_ST0, O_ST1, O_NONE, P_none }, /* 1122 */ { UD_Ifcmovnu, O_ST0, O_ST2, O_NONE, P_none }, /* 1123 */ { UD_Ifcmovnu, O_ST0, O_ST3, O_NONE, P_none }, /* 1124 */ { UD_Ifcmovnu, O_ST0, O_ST4, O_NONE, P_none }, /* 1125 */ { UD_Ifcmovnu, O_ST0, O_ST5, O_NONE, P_none }, /* 1126 */ { UD_Ifcmovnu, O_ST0, O_ST6, O_NONE, P_none }, /* 1127 */ { UD_Ifcmovnu, O_ST0, O_ST7, O_NONE, P_none }, /* 1128 */ { UD_Ifclex, O_NONE, O_NONE, O_NONE, P_none }, /* 1129 */ { UD_Ifninit, O_NONE, O_NONE, O_NONE, P_none }, /* 1130 */ { UD_Ifucomi, O_ST0, O_ST0, O_NONE, P_none }, /* 1131 */ { UD_Ifucomi, O_ST0, O_ST1, O_NONE, P_none }, /* 1132 */ { UD_Ifucomi, O_ST0, O_ST2, O_NONE, P_none }, /* 1133 */ { UD_Ifucomi, O_ST0, O_ST3, O_NONE, P_none }, /* 1134 */ { UD_Ifucomi, O_ST0, O_ST4, O_NONE, P_none }, /* 1135 */ { UD_Ifucomi, O_ST0, O_ST5, O_NONE, P_none }, /* 1136 */ { UD_Ifucomi, O_ST0, O_ST6, O_NONE, P_none }, /* 1137 */ { UD_Ifucomi, O_ST0, O_ST7, O_NONE, P_none }, /* 1138 */ { UD_Ifcomi, O_ST0, O_ST0, O_NONE, P_none }, /* 1139 */ { UD_Ifcomi, O_ST0, O_ST1, O_NONE, P_none }, /* 1140 */ { UD_Ifcomi, O_ST0, O_ST2, O_NONE, P_none }, /* 1141 */ { UD_Ifcomi, O_ST0, O_ST3, O_NONE, P_none }, /* 1142 */ { UD_Ifcomi, O_ST0, O_ST4, O_NONE, P_none }, /* 1143 */ { UD_Ifcomi, O_ST0, O_ST5, O_NONE, P_none }, /* 1144 */ { UD_Ifcomi, O_ST0, O_ST6, O_NONE, P_none }, /* 1145 */ { UD_Ifcomi, O_ST0, O_ST7, O_NONE, P_none }, /* 1146 */ { UD_Ifadd, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1147 */ { UD_Ifmul, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1148 */ { UD_Ifcom, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1149 */ { UD_Ifcomp, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1150 */ { UD_Ifsub, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1151 */ { UD_Ifsubr, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1152 */ { UD_Ifdiv, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1153 */ { UD_Ifdivr, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1154 */ { UD_Ifadd, O_ST0, O_ST0, O_NONE, P_none }, /* 1155 */ { UD_Ifadd, O_ST1, O_ST0, O_NONE, P_none }, /* 1156 */ { UD_Ifadd, O_ST2, O_ST0, O_NONE, P_none }, /* 1157 */ { UD_Ifadd, O_ST3, O_ST0, O_NONE, P_none }, /* 1158 */ { UD_Ifadd, O_ST4, O_ST0, O_NONE, P_none }, /* 1159 */ { UD_Ifadd, O_ST5, O_ST0, O_NONE, P_none }, /* 1160 */ { UD_Ifadd, O_ST6, O_ST0, O_NONE, P_none }, /* 1161 */ { UD_Ifadd, O_ST7, O_ST0, O_NONE, P_none }, /* 1162 */ { UD_Ifmul, O_ST0, O_ST0, O_NONE, P_none }, /* 1163 */ { UD_Ifmul, O_ST1, O_ST0, O_NONE, P_none }, /* 1164 */ { UD_Ifmul, O_ST2, O_ST0, O_NONE, P_none }, /* 1165 */ { UD_Ifmul, O_ST3, O_ST0, O_NONE, P_none }, /* 1166 */ { UD_Ifmul, O_ST4, O_ST0, O_NONE, P_none }, /* 1167 */ { UD_Ifmul, O_ST5, O_ST0, O_NONE, P_none }, /* 1168 */ { UD_Ifmul, O_ST6, O_ST0, O_NONE, P_none }, /* 1169 */ { UD_Ifmul, O_ST7, O_ST0, O_NONE, P_none }, /* 1170 */ { UD_Ifcom2, O_ST0, O_NONE, O_NONE, P_none }, /* 1171 */ { UD_Ifcom2, O_ST1, O_NONE, O_NONE, P_none }, /* 1172 */ { UD_Ifcom2, O_ST2, O_NONE, O_NONE, P_none }, /* 1173 */ { UD_Ifcom2, O_ST3, O_NONE, O_NONE, P_none }, /* 1174 */ { UD_Ifcom2, O_ST4, O_NONE, O_NONE, P_none }, /* 1175 */ { UD_Ifcom2, O_ST5, O_NONE, O_NONE, P_none }, /* 1176 */ { UD_Ifcom2, O_ST6, O_NONE, O_NONE, P_none }, /* 1177 */ { UD_Ifcom2, O_ST7, O_NONE, O_NONE, P_none }, /* 1178 */ { UD_Ifcomp3, O_ST0, O_NONE, O_NONE, P_none }, /* 1179 */ { UD_Ifcomp3, O_ST1, O_NONE, O_NONE, P_none }, /* 1180 */ { UD_Ifcomp3, O_ST2, O_NONE, O_NONE, P_none }, /* 1181 */ { UD_Ifcomp3, O_ST3, O_NONE, O_NONE, P_none }, /* 1182 */ { UD_Ifcomp3, O_ST4, O_NONE, O_NONE, P_none }, /* 1183 */ { UD_Ifcomp3, O_ST5, O_NONE, O_NONE, P_none }, /* 1184 */ { UD_Ifcomp3, O_ST6, O_NONE, O_NONE, P_none }, /* 1185 */ { UD_Ifcomp3, O_ST7, O_NONE, O_NONE, P_none }, /* 1186 */ { UD_Ifsubr, O_ST0, O_ST0, O_NONE, P_none }, /* 1187 */ { UD_Ifsubr, O_ST1, O_ST0, O_NONE, P_none }, /* 1188 */ { UD_Ifsubr, O_ST2, O_ST0, O_NONE, P_none }, /* 1189 */ { UD_Ifsubr, O_ST3, O_ST0, O_NONE, P_none }, /* 1190 */ { UD_Ifsubr, O_ST4, O_ST0, O_NONE, P_none }, /* 1191 */ { UD_Ifsubr, O_ST5, O_ST0, O_NONE, P_none }, /* 1192 */ { UD_Ifsubr, O_ST6, O_ST0, O_NONE, P_none }, /* 1193 */ { UD_Ifsubr, O_ST7, O_ST0, O_NONE, P_none }, /* 1194 */ { UD_Ifsub, O_ST0, O_ST0, O_NONE, P_none }, /* 1195 */ { UD_Ifsub, O_ST1, O_ST0, O_NONE, P_none }, /* 1196 */ { UD_Ifsub, O_ST2, O_ST0, O_NONE, P_none }, /* 1197 */ { UD_Ifsub, O_ST3, O_ST0, O_NONE, P_none }, /* 1198 */ { UD_Ifsub, O_ST4, O_ST0, O_NONE, P_none }, /* 1199 */ { UD_Ifsub, O_ST5, O_ST0, O_NONE, P_none }, /* 1200 */ { UD_Ifsub, O_ST6, O_ST0, O_NONE, P_none }, /* 1201 */ { UD_Ifsub, O_ST7, O_ST0, O_NONE, P_none }, /* 1202 */ { UD_Ifdivr, O_ST0, O_ST0, O_NONE, P_none }, /* 1203 */ { UD_Ifdivr, O_ST1, O_ST0, O_NONE, P_none }, /* 1204 */ { UD_Ifdivr, O_ST2, O_ST0, O_NONE, P_none }, /* 1205 */ { UD_Ifdivr, O_ST3, O_ST0, O_NONE, P_none }, /* 1206 */ { UD_Ifdivr, O_ST4, O_ST0, O_NONE, P_none }, /* 1207 */ { UD_Ifdivr, O_ST5, O_ST0, O_NONE, P_none }, /* 1208 */ { UD_Ifdivr, O_ST6, O_ST0, O_NONE, P_none }, /* 1209 */ { UD_Ifdivr, O_ST7, O_ST0, O_NONE, P_none }, /* 1210 */ { UD_Ifdiv, O_ST0, O_ST0, O_NONE, P_none }, /* 1211 */ { UD_Ifdiv, O_ST1, O_ST0, O_NONE, P_none }, /* 1212 */ { UD_Ifdiv, O_ST2, O_ST0, O_NONE, P_none }, /* 1213 */ { UD_Ifdiv, O_ST3, O_ST0, O_NONE, P_none }, /* 1214 */ { UD_Ifdiv, O_ST4, O_ST0, O_NONE, P_none }, /* 1215 */ { UD_Ifdiv, O_ST5, O_ST0, O_NONE, P_none }, /* 1216 */ { UD_Ifdiv, O_ST6, O_ST0, O_NONE, P_none }, /* 1217 */ { UD_Ifdiv, O_ST7, O_ST0, O_NONE, P_none }, /* 1218 */ { UD_Ifld, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1219 */ { UD_Ifisttp, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1220 */ { UD_Ifst, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1221 */ { UD_Ifstp, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1222 */ { UD_Ifrstor, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1223 */ { UD_Ifnsave, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1224 */ { UD_Ifnstsw, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1225 */ { UD_Iffree, O_ST0, O_NONE, O_NONE, P_none }, /* 1226 */ { UD_Iffree, O_ST1, O_NONE, O_NONE, P_none }, /* 1227 */ { UD_Iffree, O_ST2, O_NONE, O_NONE, P_none }, /* 1228 */ { UD_Iffree, O_ST3, O_NONE, O_NONE, P_none }, /* 1229 */ { UD_Iffree, O_ST4, O_NONE, O_NONE, P_none }, /* 1230 */ { UD_Iffree, O_ST5, O_NONE, O_NONE, P_none }, /* 1231 */ { UD_Iffree, O_ST6, O_NONE, O_NONE, P_none }, /* 1232 */ { UD_Iffree, O_ST7, O_NONE, O_NONE, P_none }, /* 1233 */ { UD_Ifxch4, O_ST0, O_NONE, O_NONE, P_none }, /* 1234 */ { UD_Ifxch4, O_ST1, O_NONE, O_NONE, P_none }, /* 1235 */ { UD_Ifxch4, O_ST2, O_NONE, O_NONE, P_none }, /* 1236 */ { UD_Ifxch4, O_ST3, O_NONE, O_NONE, P_none }, /* 1237 */ { UD_Ifxch4, O_ST4, O_NONE, O_NONE, P_none }, /* 1238 */ { UD_Ifxch4, O_ST5, O_NONE, O_NONE, P_none }, /* 1239 */ { UD_Ifxch4, O_ST6, O_NONE, O_NONE, P_none }, /* 1240 */ { UD_Ifxch4, O_ST7, O_NONE, O_NONE, P_none }, /* 1241 */ { UD_Ifst, O_ST0, O_NONE, O_NONE, P_none }, /* 1242 */ { UD_Ifst, O_ST1, O_NONE, O_NONE, P_none }, /* 1243 */ { UD_Ifst, O_ST2, O_NONE, O_NONE, P_none }, /* 1244 */ { UD_Ifst, O_ST3, O_NONE, O_NONE, P_none }, /* 1245 */ { UD_Ifst, O_ST4, O_NONE, O_NONE, P_none }, /* 1246 */ { UD_Ifst, O_ST5, O_NONE, O_NONE, P_none }, /* 1247 */ { UD_Ifst, O_ST6, O_NONE, O_NONE, P_none }, /* 1248 */ { UD_Ifst, O_ST7, O_NONE, O_NONE, P_none }, /* 1249 */ { UD_Ifstp, O_ST0, O_NONE, O_NONE, P_none }, /* 1250 */ { UD_Ifstp, O_ST1, O_NONE, O_NONE, P_none }, /* 1251 */ { UD_Ifstp, O_ST2, O_NONE, O_NONE, P_none }, /* 1252 */ { UD_Ifstp, O_ST3, O_NONE, O_NONE, P_none }, /* 1253 */ { UD_Ifstp, O_ST4, O_NONE, O_NONE, P_none }, /* 1254 */ { UD_Ifstp, O_ST5, O_NONE, O_NONE, P_none }, /* 1255 */ { UD_Ifstp, O_ST6, O_NONE, O_NONE, P_none }, /* 1256 */ { UD_Ifstp, O_ST7, O_NONE, O_NONE, P_none }, /* 1257 */ { UD_Ifucom, O_ST0, O_NONE, O_NONE, P_none }, /* 1258 */ { UD_Ifucom, O_ST1, O_NONE, O_NONE, P_none }, /* 1259 */ { UD_Ifucom, O_ST2, O_NONE, O_NONE, P_none }, /* 1260 */ { UD_Ifucom, O_ST3, O_NONE, O_NONE, P_none }, /* 1261 */ { UD_Ifucom, O_ST4, O_NONE, O_NONE, P_none }, /* 1262 */ { UD_Ifucom, O_ST5, O_NONE, O_NONE, P_none }, /* 1263 */ { UD_Ifucom, O_ST6, O_NONE, O_NONE, P_none }, /* 1264 */ { UD_Ifucom, O_ST7, O_NONE, O_NONE, P_none }, /* 1265 */ { UD_Ifucomp, O_ST0, O_NONE, O_NONE, P_none }, /* 1266 */ { UD_Ifucomp, O_ST1, O_NONE, O_NONE, P_none }, /* 1267 */ { UD_Ifucomp, O_ST2, O_NONE, O_NONE, P_none }, /* 1268 */ { UD_Ifucomp, O_ST3, O_NONE, O_NONE, P_none }, /* 1269 */ { UD_Ifucomp, O_ST4, O_NONE, O_NONE, P_none }, /* 1270 */ { UD_Ifucomp, O_ST5, O_NONE, O_NONE, P_none }, /* 1271 */ { UD_Ifucomp, O_ST6, O_NONE, O_NONE, P_none }, /* 1272 */ { UD_Ifucomp, O_ST7, O_NONE, O_NONE, P_none }, /* 1273 */ { UD_Ifiadd, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1274 */ { UD_Ifimul, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1275 */ { UD_Ificom, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1276 */ { UD_Ificomp, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1277 */ { UD_Ifisub, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1278 */ { UD_Ifisubr, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1279 */ { UD_Ifidiv, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1280 */ { UD_Ifidivr, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1281 */ { UD_Ifaddp, O_ST0, O_ST0, O_NONE, P_none }, /* 1282 */ { UD_Ifaddp, O_ST1, O_ST0, O_NONE, P_none }, /* 1283 */ { UD_Ifaddp, O_ST2, O_ST0, O_NONE, P_none }, /* 1284 */ { UD_Ifaddp, O_ST3, O_ST0, O_NONE, P_none }, /* 1285 */ { UD_Ifaddp, O_ST4, O_ST0, O_NONE, P_none }, /* 1286 */ { UD_Ifaddp, O_ST5, O_ST0, O_NONE, P_none }, /* 1287 */ { UD_Ifaddp, O_ST6, O_ST0, O_NONE, P_none }, /* 1288 */ { UD_Ifaddp, O_ST7, O_ST0, O_NONE, P_none }, /* 1289 */ { UD_Ifmulp, O_ST0, O_ST0, O_NONE, P_none }, /* 1290 */ { UD_Ifmulp, O_ST1, O_ST0, O_NONE, P_none }, /* 1291 */ { UD_Ifmulp, O_ST2, O_ST0, O_NONE, P_none }, /* 1292 */ { UD_Ifmulp, O_ST3, O_ST0, O_NONE, P_none }, /* 1293 */ { UD_Ifmulp, O_ST4, O_ST0, O_NONE, P_none }, /* 1294 */ { UD_Ifmulp, O_ST5, O_ST0, O_NONE, P_none }, /* 1295 */ { UD_Ifmulp, O_ST6, O_ST0, O_NONE, P_none }, /* 1296 */ { UD_Ifmulp, O_ST7, O_ST0, O_NONE, P_none }, /* 1297 */ { UD_Ifcomp5, O_ST0, O_NONE, O_NONE, P_none }, /* 1298 */ { UD_Ifcomp5, O_ST1, O_NONE, O_NONE, P_none }, /* 1299 */ { UD_Ifcomp5, O_ST2, O_NONE, O_NONE, P_none }, /* 1300 */ { UD_Ifcomp5, O_ST3, O_NONE, O_NONE, P_none }, /* 1301 */ { UD_Ifcomp5, O_ST4, O_NONE, O_NONE, P_none }, /* 1302 */ { UD_Ifcomp5, O_ST5, O_NONE, O_NONE, P_none }, /* 1303 */ { UD_Ifcomp5, O_ST6, O_NONE, O_NONE, P_none }, /* 1304 */ { UD_Ifcomp5, O_ST7, O_NONE, O_NONE, P_none }, /* 1305 */ { UD_Ifcompp, O_NONE, O_NONE, O_NONE, P_none }, /* 1306 */ { UD_Ifsubrp, O_ST0, O_ST0, O_NONE, P_none }, /* 1307 */ { UD_Ifsubrp, O_ST1, O_ST0, O_NONE, P_none }, /* 1308 */ { UD_Ifsubrp, O_ST2, O_ST0, O_NONE, P_none }, /* 1309 */ { UD_Ifsubrp, O_ST3, O_ST0, O_NONE, P_none }, /* 1310 */ { UD_Ifsubrp, O_ST4, O_ST0, O_NONE, P_none }, /* 1311 */ { UD_Ifsubrp, O_ST5, O_ST0, O_NONE, P_none }, /* 1312 */ { UD_Ifsubrp, O_ST6, O_ST0, O_NONE, P_none }, /* 1313 */ { UD_Ifsubrp, O_ST7, O_ST0, O_NONE, P_none }, /* 1314 */ { UD_Ifsubp, O_ST0, O_ST0, O_NONE, P_none }, /* 1315 */ { UD_Ifsubp, O_ST1, O_ST0, O_NONE, P_none }, /* 1316 */ { UD_Ifsubp, O_ST2, O_ST0, O_NONE, P_none }, /* 1317 */ { UD_Ifsubp, O_ST3, O_ST0, O_NONE, P_none }, /* 1318 */ { UD_Ifsubp, O_ST4, O_ST0, O_NONE, P_none }, /* 1319 */ { UD_Ifsubp, O_ST5, O_ST0, O_NONE, P_none }, /* 1320 */ { UD_Ifsubp, O_ST6, O_ST0, O_NONE, P_none }, /* 1321 */ { UD_Ifsubp, O_ST7, O_ST0, O_NONE, P_none }, /* 1322 */ { UD_Ifdivrp, O_ST0, O_ST0, O_NONE, P_none }, /* 1323 */ { UD_Ifdivrp, O_ST1, O_ST0, O_NONE, P_none }, /* 1324 */ { UD_Ifdivrp, O_ST2, O_ST0, O_NONE, P_none }, /* 1325 */ { UD_Ifdivrp, O_ST3, O_ST0, O_NONE, P_none }, /* 1326 */ { UD_Ifdivrp, O_ST4, O_ST0, O_NONE, P_none }, /* 1327 */ { UD_Ifdivrp, O_ST5, O_ST0, O_NONE, P_none }, /* 1328 */ { UD_Ifdivrp, O_ST6, O_ST0, O_NONE, P_none }, /* 1329 */ { UD_Ifdivrp, O_ST7, O_ST0, O_NONE, P_none }, /* 1330 */ { UD_Ifdivp, O_ST0, O_ST0, O_NONE, P_none }, /* 1331 */ { UD_Ifdivp, O_ST1, O_ST0, O_NONE, P_none }, /* 1332 */ { UD_Ifdivp, O_ST2, O_ST0, O_NONE, P_none }, /* 1333 */ { UD_Ifdivp, O_ST3, O_ST0, O_NONE, P_none }, /* 1334 */ { UD_Ifdivp, O_ST4, O_ST0, O_NONE, P_none }, /* 1335 */ { UD_Ifdivp, O_ST5, O_ST0, O_NONE, P_none }, /* 1336 */ { UD_Ifdivp, O_ST6, O_ST0, O_NONE, P_none }, /* 1337 */ { UD_Ifdivp, O_ST7, O_ST0, O_NONE, P_none }, /* 1338 */ { UD_Ifild, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1339 */ { UD_Ifisttp, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1340 */ { UD_Ifist, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1341 */ { UD_Ifistp, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1342 */ { UD_Ifbld, O_Mt, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1343 */ { UD_Ifild, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1344 */ { UD_Ifbstp, O_Mt, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1345 */ { UD_Ifistp, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, /* 1346 */ { UD_Iffreep, O_ST0, O_NONE, O_NONE, P_none }, /* 1347 */ { UD_Iffreep, O_ST1, O_NONE, O_NONE, P_none }, /* 1348 */ { UD_Iffreep, O_ST2, O_NONE, O_NONE, P_none }, /* 1349 */ { UD_Iffreep, O_ST3, O_NONE, O_NONE, P_none }, /* 1350 */ { UD_Iffreep, O_ST4, O_NONE, O_NONE, P_none }, /* 1351 */ { UD_Iffreep, O_ST5, O_NONE, O_NONE, P_none }, /* 1352 */ { UD_Iffreep, O_ST6, O_NONE, O_NONE, P_none }, /* 1353 */ { UD_Iffreep, O_ST7, O_NONE, O_NONE, P_none }, /* 1354 */ { UD_Ifxch7, O_ST0, O_NONE, O_NONE, P_none }, /* 1355 */ { UD_Ifxch7, O_ST1, O_NONE, O_NONE, P_none }, /* 1356 */ { UD_Ifxch7, O_ST2, O_NONE, O_NONE, P_none }, /* 1357 */ { UD_Ifxch7, O_ST3, O_NONE, O_NONE, P_none }, /* 1358 */ { UD_Ifxch7, O_ST4, O_NONE, O_NONE, P_none }, /* 1359 */ { UD_Ifxch7, O_ST5, O_NONE, O_NONE, P_none }, /* 1360 */ { UD_Ifxch7, O_ST6, O_NONE, O_NONE, P_none }, /* 1361 */ { UD_Ifxch7, O_ST7, O_NONE, O_NONE, P_none }, /* 1362 */ { UD_Ifstp8, O_ST0, O_NONE, O_NONE, P_none }, /* 1363 */ { UD_Ifstp8, O_ST1, O_NONE, O_NONE, P_none }, /* 1364 */ { UD_Ifstp8, O_ST2, O_NONE, O_NONE, P_none }, /* 1365 */ { UD_Ifstp8, O_ST3, O_NONE, O_NONE, P_none }, /* 1366 */ { UD_Ifstp8, O_ST4, O_NONE, O_NONE, P_none }, /* 1367 */ { UD_Ifstp8, O_ST5, O_NONE, O_NONE, P_none }, /* 1368 */ { UD_Ifstp8, O_ST6, O_NONE, O_NONE, P_none }, /* 1369 */ { UD_Ifstp8, O_ST7, O_NONE, O_NONE, P_none }, /* 1370 */ { UD_Ifstp9, O_ST0, O_NONE, O_NONE, P_none }, /* 1371 */ { UD_Ifstp9, O_ST1, O_NONE, O_NONE, P_none }, /* 1372 */ { UD_Ifstp9, O_ST2, O_NONE, O_NONE, P_none }, /* 1373 */ { UD_Ifstp9, O_ST3, O_NONE, O_NONE, P_none }, /* 1374 */ { UD_Ifstp9, O_ST4, O_NONE, O_NONE, P_none }, /* 1375 */ { UD_Ifstp9, O_ST5, O_NONE, O_NONE, P_none }, /* 1376 */ { UD_Ifstp9, O_ST6, O_NONE, O_NONE, P_none }, /* 1377 */ { UD_Ifstp9, O_ST7, O_NONE, O_NONE, P_none }, /* 1378 */ { UD_Ifnstsw, O_AX, O_NONE, O_NONE, P_none }, /* 1379 */ { UD_Ifucomip, O_ST0, O_ST0, O_NONE, P_none }, /* 1380 */ { UD_Ifucomip, O_ST0, O_ST1, O_NONE, P_none }, /* 1381 */ { UD_Ifucomip, O_ST0, O_ST2, O_NONE, P_none }, /* 1382 */ { UD_Ifucomip, O_ST0, O_ST3, O_NONE, P_none }, /* 1383 */ { UD_Ifucomip, O_ST0, O_ST4, O_NONE, P_none }, /* 1384 */ { UD_Ifucomip, O_ST0, O_ST5, O_NONE, P_none }, /* 1385 */ { UD_Ifucomip, O_ST0, O_ST6, O_NONE, P_none }, /* 1386 */ { UD_Ifucomip, O_ST0, O_ST7, O_NONE, P_none }, /* 1387 */ { UD_Ifcomip, O_ST0, O_ST0, O_NONE, P_none }, /* 1388 */ { UD_Ifcomip, O_ST0, O_ST1, O_NONE, P_none }, /* 1389 */ { UD_Ifcomip, O_ST0, O_ST2, O_NONE, P_none }, /* 1390 */ { UD_Ifcomip, O_ST0, O_ST3, O_NONE, P_none }, /* 1391 */ { UD_Ifcomip, O_ST0, O_ST4, O_NONE, P_none }, /* 1392 */ { UD_Ifcomip, O_ST0, O_ST5, O_NONE, P_none }, /* 1393 */ { UD_Ifcomip, O_ST0, O_ST6, O_NONE, P_none }, /* 1394 */ { UD_Ifcomip, O_ST0, O_ST7, O_NONE, P_none }, /* 1395 */ { UD_Iloopne, O_Jb, O_NONE, O_NONE, P_none }, /* 1396 */ { UD_Iloope, O_Jb, O_NONE, O_NONE, P_none }, /* 1397 */ { UD_Iloop, O_Jb, O_NONE, O_NONE, P_none }, /* 1398 */ { UD_Ijcxz, O_Jb, O_NONE, O_NONE, P_aso }, /* 1399 */ { UD_Ijecxz, O_Jb, O_NONE, O_NONE, P_aso }, /* 1400 */ { UD_Ijrcxz, O_Jb, O_NONE, O_NONE, P_aso }, /* 1401 */ { UD_Iin, O_AL, O_Ib, O_NONE, P_none }, /* 1402 */ { UD_Iin, O_eAX, O_Ib, O_NONE, P_oso }, /* 1403 */ { UD_Iout, O_Ib, O_AL, O_NONE, P_none }, /* 1404 */ { UD_Iout, O_Ib, O_eAX, O_NONE, P_oso }, /* 1405 */ { UD_Icall, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, /* 1406 */ { UD_Ijmp, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, /* 1407 */ { UD_Ijmp, O_Av, O_NONE, O_NONE, P_oso }, /* 1408 */ { UD_Ijmp, O_Jb, O_NONE, O_NONE, P_none }, /* 1409 */ { UD_Iin, O_AL, O_DX, O_NONE, P_none }, /* 1410 */ { UD_Iin, O_eAX, O_DX, O_NONE, P_oso }, /* 1411 */ { UD_Iout, O_DX, O_AL, O_NONE, P_none }, /* 1412 */ { UD_Iout, O_DX, O_eAX, O_NONE, P_oso }, /* 1413 */ { UD_Ilock, O_NONE, O_NONE, O_NONE, P_none }, /* 1414 */ { UD_Iint1, O_NONE, O_NONE, O_NONE, P_none }, /* 1415 */ { UD_Irepne, O_NONE, O_NONE, O_NONE, P_none }, /* 1416 */ { UD_Irep, O_NONE, O_NONE, O_NONE, P_none }, /* 1417 */ { UD_Ihlt, O_NONE, O_NONE, O_NONE, P_none }, /* 1418 */ { UD_Icmc, O_NONE, O_NONE, O_NONE, P_none }, /* 1419 */ { UD_Itest, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 1420 */ { UD_Itest, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 1421 */ { UD_Inot, O_Eb, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 1422 */ { UD_Ineg, O_Eb, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 1423 */ { UD_Imul, O_Eb, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 1424 */ { UD_Iimul, O_Eb, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 1425 */ { UD_Idiv, O_Eb, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 1426 */ { UD_Iidiv, O_Eb, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 1427 */ { UD_Itest, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 1428 */ { UD_Itest, O_Ev, O_Iz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 1429 */ { UD_Inot, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 1430 */ { UD_Ineg, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 1431 */ { UD_Imul, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 1432 */ { UD_Iimul, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 1433 */ { UD_Idiv, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 1434 */ { UD_Iidiv, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 1435 */ { UD_Iclc, O_NONE, O_NONE, O_NONE, P_none }, /* 1436 */ { UD_Istc, O_NONE, O_NONE, O_NONE, P_none }, /* 1437 */ { UD_Icli, O_NONE, O_NONE, O_NONE, P_none }, /* 1438 */ { UD_Isti, O_NONE, O_NONE, O_NONE, P_none }, /* 1439 */ { UD_Icld, O_NONE, O_NONE, O_NONE, P_none }, /* 1440 */ { UD_Istd, O_NONE, O_NONE, O_NONE, P_none }, /* 1441 */ { UD_Iinc, O_Eb, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 1442 */ { UD_Idec, O_Eb, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 1443 */ { UD_Iinc, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 1444 */ { UD_Idec, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 1445 */ { UD_Icall, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 1446 */ { UD_Icall, O_Eq, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb|P_def64 }, /* 1447 */ { UD_Icall, O_Fv, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 1448 */ { UD_Ijmp, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb|P_def64 }, /* 1449 */ { UD_Ijmp, O_Fv, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, /* 1450 */ { UD_Ipush, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb|P_def64 }, }; const char * ud_mnemonics_str[] = { "invalid", "3dnow", "none", "db", "pause", "aaa", "aad", "aam", "aas", "adc", "add", "addpd", "addps", "addsd", "addss", "and", "andpd", "andps", "andnpd", "andnps", "arpl", "movsxd", "bound", "bsf", "bsr", "bswap", "bt", "btc", "btr", "bts", "call", "cbw", "cwde", "cdqe", "clc", "cld", "clflush", "clgi", "cli", "clts", "cmc", "cmovo", "cmovno", "cmovb", "cmovae", "cmovz", "cmovnz", "cmovbe", "cmova", "cmovs", "cmovns", "cmovp", "cmovnp", "cmovl", "cmovge", "cmovle", "cmovg", "cmp", "cmppd", "cmpps", "cmpsb", "cmpsw", "cmpsd", "cmpsq", "cmpss", "cmpxchg", "cmpxchg8b", "cmpxchg16b", "comisd", "comiss", "cpuid", "cvtdq2pd", "cvtdq2ps", "cvtpd2dq", "cvtpd2pi", "cvtpd2ps", "cvtpi2ps", "cvtpi2pd", "cvtps2dq", "cvtps2pi", "cvtps2pd", "cvtsd2si", "cvtsd2ss", "cvtsi2ss", "cvtss2si", "cvtss2sd", "cvttpd2pi", "cvttpd2dq", "cvttps2dq", "cvttps2pi", "cvttsd2si", "cvtsi2sd", "cvttss2si", "cwd", "cdq", "cqo", "daa", "das", "dec", "div", "divpd", "divps", "divsd", "divss", "emms", "enter", "f2xm1", "fabs", "fadd", "faddp", "fbld", "fbstp", "fchs", "fclex", "fcmovb", "fcmove", "fcmovbe", "fcmovu", "fcmovnb", "fcmovne", "fcmovnbe", "fcmovnu", "fucomi", "fcom", "fcom2", "fcomp3", "fcomi", "fucomip", "fcomip", "fcomp", "fcomp5", "fcompp", "fcos", "fdecstp", "fdiv", "fdivp", "fdivr", "fdivrp", "femms", "ffree", "ffreep", "ficom", "ficomp", "fild", "fincstp", "fninit", "fiadd", "fidivr", "fidiv", "fisub", "fisubr", "fist", "fistp", "fisttp", "fld", "fld1", "fldl2t", "fldl2e", "fldpi", "fldlg2", "fldln2", "fldz", "fldcw", "fldenv", "fmul", "fmulp", "fimul", "fnop", "fpatan", "fprem", "fprem1", "fptan", "frndint", "frstor", "fnsave", "fscale", "fsin", "fsincos", "fsqrt", "fstp", "fstp1", "fstp8", "fstp9", "fst", "fnstcw", "fnstenv", "fnstsw", "fsub", "fsubp", "fsubr", "fsubrp", "ftst", "fucom", "fucomp", "fucompp", "fxam", "fxch", "fxch4", "fxch7", "fxrstor", "fxsave", "fxtract", "fyl2x", "fyl2xp1", "hlt", "idiv", "in", "imul", "inc", "insb", "insw", "insd", "int1", "int3", "int", "into", "invd", "invept", "invlpg", "invlpga", "invvpid", "iretw", "iretd", "iretq", "jo", "jno", "jb", "jae", "jz", "jnz", "jbe", "ja", "js", "jns", "jp", "jnp", "jl", "jge", "jle", "jg", "jcxz", "jecxz", "jrcxz", "jmp", "lahf", "lar", "lddqu", "ldmxcsr", "lds", "lea", "les", "lfs", "lgs", "lidt", "lss", "leave", "lfence", "lgdt", "lldt", "lmsw", "lock", "lodsb", "lodsw", "lodsd", "lodsq", "loopne", "loope", "loop", "lsl", "ltr", "maskmovq", "maxpd", "maxps", "maxsd", "maxss", "mfence", "minpd", "minps", "minsd", "minss", "monitor", "montmul", "mov", "movapd", "movaps", "movd", "movhpd", "movhps", "movlhps", "movlpd", "movlps", "movhlps", "movmskpd", "movmskps", "movntdq", "movnti", "movntpd", "movntps", "movntq", "movq", "movsb", "movsw", "movsd", "movsq", "movss", "movsx", "movupd", "movups", "movzx", "mul", "mulpd", "mulps", "mulsd", "mulss", "mwait", "neg", "nop", "not", "or", "orpd", "orps", "out", "outsb", "outsw", "outsd", "packsswb", "packssdw", "packuswb", "paddb", "paddw", "paddd", "paddsb", "paddsw", "paddusb", "paddusw", "pand", "pandn", "pavgb", "pavgw", "pcmpeqb", "pcmpeqw", "pcmpeqd", "pcmpgtb", "pcmpgtw", "pcmpgtd", "pextrb", "pextrd", "pextrq", "pextrw", "pinsrb", "pinsrw", "pinsrd", "pinsrq", "pmaddwd", "pmaxsw", "pmaxub", "pminsw", "pminub", "pmovmskb", "pmulhuw", "pmulhw", "pmullw", "pop", "popa", "popad", "popfw", "popfd", "popfq", "por", "prefetch", "prefetchnta", "prefetcht0", "prefetcht1", "prefetcht2", "psadbw", "pshufw", "psllw", "pslld", "psllq", "psraw", "psrad", "psrlw", "psrld", "psrlq", "psubb", "psubw", "psubd", "psubsb", "psubsw", "psubusb", "psubusw", "punpckhbw", "punpckhwd", "punpckhdq", "punpcklbw", "punpcklwd", "punpckldq", "pi2fw", "pi2fd", "pf2iw", "pf2id", "pfnacc", "pfpnacc", "pfcmpge", "pfmin", "pfrcp", "pfrsqrt", "pfsub", "pfadd", "pfcmpgt", "pfmax", "pfrcpit1", "pfrsqit1", "pfsubr", "pfacc", "pfcmpeq", "pfmul", "pfrcpit2", "pmulhrw", "pswapd", "pavgusb", "push", "pusha", "pushad", "pushfw", "pushfd", "pushfq", "pxor", "rcl", "rcr", "rol", "ror", "rcpps", "rcpss", "rdmsr", "rdpmc", "rdtsc", "rdtscp", "repne", "rep", "ret", "retf", "rsm", "rsqrtps", "rsqrtss", "sahf", "salc", "sar", "shl", "shr", "sbb", "scasb", "scasw", "scasd", "scasq", "seto", "setno", "setb", "setae", "setz", "setnz", "setbe", "seta", "sets", "setns", "setp", "setnp", "setl", "setge", "setle", "setg", "sfence", "sgdt", "shld", "shrd", "shufpd", "shufps", "sidt", "sldt", "smsw", "sqrtps", "sqrtpd", "sqrtsd", "sqrtss", "stc", "std", "stgi", "sti", "skinit", "stmxcsr", "stosb", "stosw", "stosd", "stosq", "str", "sub", "subpd", "subps", "subsd", "subss", "swapgs", "syscall", "sysenter", "sysexit", "sysret", "test", "ucomisd", "ucomiss", "ud2", "unpckhpd", "unpckhps", "unpcklps", "unpcklpd", "verr", "verw", "vmcall", "vmclear", "vmxon", "vmptrld", "vmptrst", "vmlaunch", "vmresume", "vmxoff", "vmread", "vmwrite", "vmrun", "vmmcall", "vmload", "vmsave", "wait", "wbinvd", "wrmsr", "xadd", "xchg", "xgetbv", "xlatb", "xor", "xorpd", "xorps", "xcryptecb", "xcryptcbc", "xcryptctr", "xcryptcfb", "xcryptofb", "xrstor", "xsave", "xsetbv", "xsha1", "xsha256", "xstore", "aesdec", "aesdeclast", "aesenc", "aesenclast", "aesimc", "aeskeygenassist", "pclmulqdq", "getsec", "movdqa", "maskmovdqu", "movdq2q", "movdqu", "movq2dq", "paddq", "psubq", "pmuludq", "pshufhw", "pshuflw", "pshufd", "pslldq", "psrldq", "punpckhqdq", "punpcklqdq", "addsubpd", "addsubps", "haddpd", "haddps", "hsubpd", "hsubps", "movddup", "movshdup", "movsldup", "pabsb", "pabsw", "pabsd", "pshufb", "phaddw", "phaddd", "phaddsw", "pmaddubsw", "phsubw", "phsubd", "phsubsw", "psignb", "psignd", "psignw", "pmulhrsw", "palignr", "pblendvb", "pmuldq", "pminsb", "pminsd", "pminuw", "pminud", "pmaxsb", "pmaxsd", "pmaxud", "pmaxuw", "pmulld", "phminposuw", "roundps", "roundpd", "roundss", "roundsd", "blendpd", "pblendw", "blendps", "blendvpd", "blendvps", "dpps", "dppd", "mpsadbw", "extractps", "insertps", "movntdqa", "packusdw", "pmovsxbw", "pmovsxbd", "pmovsxbq", "pmovsxwd", "pmovsxwq", "pmovsxdq", "pmovzxbw", "pmovzxbd", "pmovzxbq", "pmovzxwd", "pmovzxwq", "pmovzxdq", "pcmpeqq", "popcnt", "ptest", "pcmpestri", "pcmpestrm", "pcmpgtq", "pcmpistri", "pcmpistrm", "movbe", "crc32" }; mumble-1.3.4/3rdparty/mach-override-src/libudis86/input.c0000664000175000017500000001241514010707335023041 0ustar builderbuilder/* udis86 - libudis86/input.c * * Copyright (c) 2002-2009 Vivek Thampi * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "extern.h" #include "types.h" #include "input.h" #include "udint.h" /* * inp_init * Initializes the input system. */ static void inp_init(struct ud *u) { u->inp_curr = 0; u->inp_fill = 0; u->inp_ctr = 0; u->inp_end = 0; } /* ----------------------------------------------------------------------------- * inp_buff_hook() - Hook for buffered inputs. * ----------------------------------------------------------------------------- */ static int inp_buff_hook(struct ud* u) { if (u->inp_buff < u->inp_buff_end) return *u->inp_buff++; else return -1; } #ifndef __UD_STANDALONE__ /* ----------------------------------------------------------------------------- * inp_file_hook() - Hook for FILE inputs. * ----------------------------------------------------------------------------- */ static int inp_file_hook(struct ud* u) { return fgetc(u->inp_file); } #endif /* __UD_STANDALONE__*/ /* ============================================================================= * ud_inp_set_hook() - Sets input hook. * ============================================================================= */ void ud_set_input_hook(register struct ud* u, int (*hook)(struct ud*)) { u->inp_hook = hook; inp_init(u); } /* ============================================================================= * ud_inp_set_buffer() - Set buffer as input. * ============================================================================= */ void ud_set_input_buffer(register struct ud* u, const uint8_t* buf, size_t len) { u->inp_hook = inp_buff_hook; u->inp_buff = buf; u->inp_buff_end = buf + len; inp_init(u); } #ifndef __UD_STANDALONE__ /* ============================================================================= * ud_input_set_file() - Set buffer as input. * ============================================================================= */ void ud_set_input_file(register struct ud* u, FILE* f) { u->inp_hook = inp_file_hook; u->inp_file = f; inp_init(u); } #endif /* __UD_STANDALONE__ */ /* ============================================================================= * ud_input_skip() - Skip n input bytes. * ============================================================================= */ void ud_input_skip(struct ud* u, size_t n) { while (n--) { u->inp_hook(u); } } /* ============================================================================= * ud_input_end() - Test for end of input. * ============================================================================= */ int ud_input_end(const struct ud* u) { return (u->inp_curr == u->inp_fill) && u->inp_end; } /* * ud_inp_next * Loads and returns the next byte from input. * * inp_curr and inp_fill are pointers to the cache. The program is * written based on the property that they are 8-bits in size, and * will eventually wrap around forming a circular buffer. So, the * size of the cache is 256 in size, kind of unnecessary yet * optimal. * * A buffer inp_sess stores the bytes disassembled for a single * session. */ uint8_t ud_inp_next(struct ud* u) { int c = -1; /* if current pointer is not upto the fill point in the * input cache. */ if (u->inp_curr != u->inp_fill) { c = u->inp_cache[ ++u->inp_curr ]; /* if !end-of-input, call the input hook and get a byte */ } else if (u->inp_end || (c = u->inp_hook(u)) == -1) { /* end-of-input, mark it as an error, since the decoder, * expected a byte more. */ UDERR(u, "byte expected, eoi received"); /* flag end of input */ u->inp_end = 1; return 0; } else { /* increment pointers, we have a new byte. */ u->inp_curr = ++u->inp_fill; /* add the byte to the cache */ u->inp_cache[u->inp_fill] = c; } /* record bytes input per decode-session. */ u->inp_sess[u->inp_ctr++] = c; /* return byte */ return (uint8_t) c; } /* vim: set ts=2 sw=2 expandtab */ mumble-1.3.4/3rdparty/mach-override-src/libudis86/udint.h0000664000175000017500000000500714010707335023031 0ustar builderbuilder/* udis86 - libudis86/udint.h -- definitions for internal use only * * Copyright (c) 2002-2009 Vivek Thampi * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _UDINT_H_ #define _UDINT_H_ #ifdef HAVE_CONFIG_H # include #endif /* HAVE_CONFIG_H */ #ifdef HAVE_ASSERT_H # include # define UD_ASSERT(_x) assert(_x) #else # define UD_ASSERT(_x) #endif /* !HAVE_ASSERT_H */ #ifdef LOGERR #define UDERR(u, msg) \ do { \ (u)->error = 1; \ fprintf(stderr, "decode-error: %s:%d: %s", \ __FILE__, __LINE__, (msg)); \ } while (0) #else #define UDERR(u, m) \ do { \ (u)->error = 1; \ } while (0) #endif /* !LOGERR */ #define UD_RETURN_ON_ERROR(u) \ do { \ if ((u)->error != 0) { \ return (u)->error; \ } \ } while (0) #define UD_RETURN_WITH_ERROR(u, m) \ do { \ UDERR(u, m); \ return (u)->error; \ } while (0) /* printf formatting int64 specifier */ #ifdef FMT64 # undef FMT64 #endif #if defined(_MSC_VER) || defined(__BORLANDC__) # define FMT64 "I64" #else # if defined(__APPLE__) # define FMT64 "ll" # elif defined(__amd64__) || defined(__x86_64__) # define FMT64 "l" # else # define FMT64 "ll" # endif /* !x64 */ #endif #endif /* _UDINT_H_ */ mumble-1.3.4/3rdparty/mach-override-src/libudis86/itab.h0000664000175000017500000002476214010707335022636 0ustar builderbuilder#ifndef UD_ITAB_H #define UD_ITAB_H /* itab.h -- generated by udis86:scripts/ud_itab.py, do no edit */ /* ud_table_type -- lookup table types (see decode.c) */ enum ud_table_type { UD_TAB__OPC_TABLE, UD_TAB__OPC_X87, UD_TAB__OPC_MOD, UD_TAB__OPC_VEX_M, UD_TAB__OPC_VEX_P, UD_TAB__OPC_RM, UD_TAB__OPC_VENDOR, UD_TAB__OPC_OSIZE, UD_TAB__OPC_MODE, UD_TAB__OPC_3DNOW, UD_TAB__OPC_REG, UD_TAB__OPC_ASIZE, UD_TAB__OPC_SSE }; /* ud_mnemonic -- mnemonic constants */ enum ud_mnemonic_code { UD_Iinvalid, UD_I3dnow, UD_Inone, UD_Idb, UD_Ipause, UD_Iaaa, UD_Iaad, UD_Iaam, UD_Iaas, UD_Iadc, UD_Iadd, UD_Iaddpd, UD_Iaddps, UD_Iaddsd, UD_Iaddss, UD_Iand, UD_Iandpd, UD_Iandps, UD_Iandnpd, UD_Iandnps, UD_Iarpl, UD_Imovsxd, UD_Ibound, UD_Ibsf, UD_Ibsr, UD_Ibswap, UD_Ibt, UD_Ibtc, UD_Ibtr, UD_Ibts, UD_Icall, UD_Icbw, UD_Icwde, UD_Icdqe, UD_Iclc, UD_Icld, UD_Iclflush, UD_Iclgi, UD_Icli, UD_Iclts, UD_Icmc, UD_Icmovo, UD_Icmovno, UD_Icmovb, UD_Icmovae, UD_Icmovz, UD_Icmovnz, UD_Icmovbe, UD_Icmova, UD_Icmovs, UD_Icmovns, UD_Icmovp, UD_Icmovnp, UD_Icmovl, UD_Icmovge, UD_Icmovle, UD_Icmovg, UD_Icmp, UD_Icmppd, UD_Icmpps, UD_Icmpsb, UD_Icmpsw, UD_Icmpsd, UD_Icmpsq, UD_Icmpss, UD_Icmpxchg, UD_Icmpxchg8b, UD_Icmpxchg16b, UD_Icomisd, UD_Icomiss, UD_Icpuid, UD_Icvtdq2pd, UD_Icvtdq2ps, UD_Icvtpd2dq, UD_Icvtpd2pi, UD_Icvtpd2ps, UD_Icvtpi2ps, UD_Icvtpi2pd, UD_Icvtps2dq, UD_Icvtps2pi, UD_Icvtps2pd, UD_Icvtsd2si, UD_Icvtsd2ss, UD_Icvtsi2ss, UD_Icvtss2si, UD_Icvtss2sd, UD_Icvttpd2pi, UD_Icvttpd2dq, UD_Icvttps2dq, UD_Icvttps2pi, UD_Icvttsd2si, UD_Icvtsi2sd, UD_Icvttss2si, UD_Icwd, UD_Icdq, UD_Icqo, UD_Idaa, UD_Idas, UD_Idec, UD_Idiv, UD_Idivpd, UD_Idivps, UD_Idivsd, UD_Idivss, UD_Iemms, UD_Ienter, UD_If2xm1, UD_Ifabs, UD_Ifadd, UD_Ifaddp, UD_Ifbld, UD_Ifbstp, UD_Ifchs, UD_Ifclex, UD_Ifcmovb, UD_Ifcmove, UD_Ifcmovbe, UD_Ifcmovu, UD_Ifcmovnb, UD_Ifcmovne, UD_Ifcmovnbe, UD_Ifcmovnu, UD_Ifucomi, UD_Ifcom, UD_Ifcom2, UD_Ifcomp3, UD_Ifcomi, UD_Ifucomip, UD_Ifcomip, UD_Ifcomp, UD_Ifcomp5, UD_Ifcompp, UD_Ifcos, UD_Ifdecstp, UD_Ifdiv, UD_Ifdivp, UD_Ifdivr, UD_Ifdivrp, UD_Ifemms, UD_Iffree, UD_Iffreep, UD_Ificom, UD_Ificomp, UD_Ifild, UD_Ifincstp, UD_Ifninit, UD_Ifiadd, UD_Ifidivr, UD_Ifidiv, UD_Ifisub, UD_Ifisubr, UD_Ifist, UD_Ifistp, UD_Ifisttp, UD_Ifld, UD_Ifld1, UD_Ifldl2t, UD_Ifldl2e, UD_Ifldpi, UD_Ifldlg2, UD_Ifldln2, UD_Ifldz, UD_Ifldcw, UD_Ifldenv, UD_Ifmul, UD_Ifmulp, UD_Ifimul, UD_Ifnop, UD_Ifpatan, UD_Ifprem, UD_Ifprem1, UD_Ifptan, UD_Ifrndint, UD_Ifrstor, UD_Ifnsave, UD_Ifscale, UD_Ifsin, UD_Ifsincos, UD_Ifsqrt, UD_Ifstp, UD_Ifstp1, UD_Ifstp8, UD_Ifstp9, UD_Ifst, UD_Ifnstcw, UD_Ifnstenv, UD_Ifnstsw, UD_Ifsub, UD_Ifsubp, UD_Ifsubr, UD_Ifsubrp, UD_Iftst, UD_Ifucom, UD_Ifucomp, UD_Ifucompp, UD_Ifxam, UD_Ifxch, UD_Ifxch4, UD_Ifxch7, UD_Ifxrstor, UD_Ifxsave, UD_Ifxtract, UD_Ifyl2x, UD_Ifyl2xp1, UD_Ihlt, UD_Iidiv, UD_Iin, UD_Iimul, UD_Iinc, UD_Iinsb, UD_Iinsw, UD_Iinsd, UD_Iint1, UD_Iint3, UD_Iint, UD_Iinto, UD_Iinvd, UD_Iinvept, UD_Iinvlpg, UD_Iinvlpga, UD_Iinvvpid, UD_Iiretw, UD_Iiretd, UD_Iiretq, UD_Ijo, UD_Ijno, UD_Ijb, UD_Ijae, UD_Ijz, UD_Ijnz, UD_Ijbe, UD_Ija, UD_Ijs, UD_Ijns, UD_Ijp, UD_Ijnp, UD_Ijl, UD_Ijge, UD_Ijle, UD_Ijg, UD_Ijcxz, UD_Ijecxz, UD_Ijrcxz, UD_Ijmp, UD_Ilahf, UD_Ilar, UD_Ilddqu, UD_Ildmxcsr, UD_Ilds, UD_Ilea, UD_Iles, UD_Ilfs, UD_Ilgs, UD_Ilidt, UD_Ilss, UD_Ileave, UD_Ilfence, UD_Ilgdt, UD_Illdt, UD_Ilmsw, UD_Ilock, UD_Ilodsb, UD_Ilodsw, UD_Ilodsd, UD_Ilodsq, UD_Iloopne, UD_Iloope, UD_Iloop, UD_Ilsl, UD_Iltr, UD_Imaskmovq, UD_Imaxpd, UD_Imaxps, UD_Imaxsd, UD_Imaxss, UD_Imfence, UD_Iminpd, UD_Iminps, UD_Iminsd, UD_Iminss, UD_Imonitor, UD_Imontmul, UD_Imov, UD_Imovapd, UD_Imovaps, UD_Imovd, UD_Imovhpd, UD_Imovhps, UD_Imovlhps, UD_Imovlpd, UD_Imovlps, UD_Imovhlps, UD_Imovmskpd, UD_Imovmskps, UD_Imovntdq, UD_Imovnti, UD_Imovntpd, UD_Imovntps, UD_Imovntq, UD_Imovq, UD_Imovsb, UD_Imovsw, UD_Imovsd, UD_Imovsq, UD_Imovss, UD_Imovsx, UD_Imovupd, UD_Imovups, UD_Imovzx, UD_Imul, UD_Imulpd, UD_Imulps, UD_Imulsd, UD_Imulss, UD_Imwait, UD_Ineg, UD_Inop, UD_Inot, UD_Ior, UD_Iorpd, UD_Iorps, UD_Iout, UD_Ioutsb, UD_Ioutsw, UD_Ioutsd, UD_Ipacksswb, UD_Ipackssdw, UD_Ipackuswb, UD_Ipaddb, UD_Ipaddw, UD_Ipaddd, UD_Ipaddsb, UD_Ipaddsw, UD_Ipaddusb, UD_Ipaddusw, UD_Ipand, UD_Ipandn, UD_Ipavgb, UD_Ipavgw, UD_Ipcmpeqb, UD_Ipcmpeqw, UD_Ipcmpeqd, UD_Ipcmpgtb, UD_Ipcmpgtw, UD_Ipcmpgtd, UD_Ipextrb, UD_Ipextrd, UD_Ipextrq, UD_Ipextrw, UD_Ipinsrb, UD_Ipinsrw, UD_Ipinsrd, UD_Ipinsrq, UD_Ipmaddwd, UD_Ipmaxsw, UD_Ipmaxub, UD_Ipminsw, UD_Ipminub, UD_Ipmovmskb, UD_Ipmulhuw, UD_Ipmulhw, UD_Ipmullw, UD_Ipop, UD_Ipopa, UD_Ipopad, UD_Ipopfw, UD_Ipopfd, UD_Ipopfq, UD_Ipor, UD_Iprefetch, UD_Iprefetchnta, UD_Iprefetcht0, UD_Iprefetcht1, UD_Iprefetcht2, UD_Ipsadbw, UD_Ipshufw, UD_Ipsllw, UD_Ipslld, UD_Ipsllq, UD_Ipsraw, UD_Ipsrad, UD_Ipsrlw, UD_Ipsrld, UD_Ipsrlq, UD_Ipsubb, UD_Ipsubw, UD_Ipsubd, UD_Ipsubsb, UD_Ipsubsw, UD_Ipsubusb, UD_Ipsubusw, UD_Ipunpckhbw, UD_Ipunpckhwd, UD_Ipunpckhdq, UD_Ipunpcklbw, UD_Ipunpcklwd, UD_Ipunpckldq, UD_Ipi2fw, UD_Ipi2fd, UD_Ipf2iw, UD_Ipf2id, UD_Ipfnacc, UD_Ipfpnacc, UD_Ipfcmpge, UD_Ipfmin, UD_Ipfrcp, UD_Ipfrsqrt, UD_Ipfsub, UD_Ipfadd, UD_Ipfcmpgt, UD_Ipfmax, UD_Ipfrcpit1, UD_Ipfrsqit1, UD_Ipfsubr, UD_Ipfacc, UD_Ipfcmpeq, UD_Ipfmul, UD_Ipfrcpit2, UD_Ipmulhrw, UD_Ipswapd, UD_Ipavgusb, UD_Ipush, UD_Ipusha, UD_Ipushad, UD_Ipushfw, UD_Ipushfd, UD_Ipushfq, UD_Ipxor, UD_Ircl, UD_Ircr, UD_Irol, UD_Iror, UD_Ircpps, UD_Ircpss, UD_Irdmsr, UD_Irdpmc, UD_Irdtsc, UD_Irdtscp, UD_Irepne, UD_Irep, UD_Iret, UD_Iretf, UD_Irsm, UD_Irsqrtps, UD_Irsqrtss, UD_Isahf, UD_Isalc, UD_Isar, UD_Ishl, UD_Ishr, UD_Isbb, UD_Iscasb, UD_Iscasw, UD_Iscasd, UD_Iscasq, UD_Iseto, UD_Isetno, UD_Isetb, UD_Isetae, UD_Isetz, UD_Isetnz, UD_Isetbe, UD_Iseta, UD_Isets, UD_Isetns, UD_Isetp, UD_Isetnp, UD_Isetl, UD_Isetge, UD_Isetle, UD_Isetg, UD_Isfence, UD_Isgdt, UD_Ishld, UD_Ishrd, UD_Ishufpd, UD_Ishufps, UD_Isidt, UD_Isldt, UD_Ismsw, UD_Isqrtps, UD_Isqrtpd, UD_Isqrtsd, UD_Isqrtss, UD_Istc, UD_Istd, UD_Istgi, UD_Isti, UD_Iskinit, UD_Istmxcsr, UD_Istosb, UD_Istosw, UD_Istosd, UD_Istosq, UD_Istr, UD_Isub, UD_Isubpd, UD_Isubps, UD_Isubsd, UD_Isubss, UD_Iswapgs, UD_Isyscall, UD_Isysenter, UD_Isysexit, UD_Isysret, UD_Itest, UD_Iucomisd, UD_Iucomiss, UD_Iud2, UD_Iunpckhpd, UD_Iunpckhps, UD_Iunpcklps, UD_Iunpcklpd, UD_Iverr, UD_Iverw, UD_Ivmcall, UD_Ivmclear, UD_Ivmxon, UD_Ivmptrld, UD_Ivmptrst, UD_Ivmlaunch, UD_Ivmresume, UD_Ivmxoff, UD_Ivmread, UD_Ivmwrite, UD_Ivmrun, UD_Ivmmcall, UD_Ivmload, UD_Ivmsave, UD_Iwait, UD_Iwbinvd, UD_Iwrmsr, UD_Ixadd, UD_Ixchg, UD_Ixgetbv, UD_Ixlatb, UD_Ixor, UD_Ixorpd, UD_Ixorps, UD_Ixcryptecb, UD_Ixcryptcbc, UD_Ixcryptctr, UD_Ixcryptcfb, UD_Ixcryptofb, UD_Ixrstor, UD_Ixsave, UD_Ixsetbv, UD_Ixsha1, UD_Ixsha256, UD_Ixstore, UD_Iaesdec, UD_Iaesdeclast, UD_Iaesenc, UD_Iaesenclast, UD_Iaesimc, UD_Iaeskeygenassist, UD_Ipclmulqdq, UD_Igetsec, UD_Imovdqa, UD_Imaskmovdqu, UD_Imovdq2q, UD_Imovdqu, UD_Imovq2dq, UD_Ipaddq, UD_Ipsubq, UD_Ipmuludq, UD_Ipshufhw, UD_Ipshuflw, UD_Ipshufd, UD_Ipslldq, UD_Ipsrldq, UD_Ipunpckhqdq, UD_Ipunpcklqdq, UD_Iaddsubpd, UD_Iaddsubps, UD_Ihaddpd, UD_Ihaddps, UD_Ihsubpd, UD_Ihsubps, UD_Imovddup, UD_Imovshdup, UD_Imovsldup, UD_Ipabsb, UD_Ipabsw, UD_Ipabsd, UD_Ipshufb, UD_Iphaddw, UD_Iphaddd, UD_Iphaddsw, UD_Ipmaddubsw, UD_Iphsubw, UD_Iphsubd, UD_Iphsubsw, UD_Ipsignb, UD_Ipsignd, UD_Ipsignw, UD_Ipmulhrsw, UD_Ipalignr, UD_Ipblendvb, UD_Ipmuldq, UD_Ipminsb, UD_Ipminsd, UD_Ipminuw, UD_Ipminud, UD_Ipmaxsb, UD_Ipmaxsd, UD_Ipmaxud, UD_Ipmaxuw, UD_Ipmulld, UD_Iphminposuw, UD_Iroundps, UD_Iroundpd, UD_Iroundss, UD_Iroundsd, UD_Iblendpd, UD_Ipblendw, UD_Iblendps, UD_Iblendvpd, UD_Iblendvps, UD_Idpps, UD_Idppd, UD_Impsadbw, UD_Iextractps, UD_Iinsertps, UD_Imovntdqa, UD_Ipackusdw, UD_Ipmovsxbw, UD_Ipmovsxbd, UD_Ipmovsxbq, UD_Ipmovsxwd, UD_Ipmovsxwq, UD_Ipmovsxdq, UD_Ipmovzxbw, UD_Ipmovzxbd, UD_Ipmovzxbq, UD_Ipmovzxwd, UD_Ipmovzxwq, UD_Ipmovzxdq, UD_Ipcmpeqq, UD_Ipopcnt, UD_Iptest, UD_Ipcmpestri, UD_Ipcmpestrm, UD_Ipcmpgtq, UD_Ipcmpistri, UD_Ipcmpistrm, UD_Imovbe, UD_Icrc32, UD_MAX_MNEMONIC_CODE } UD_ATTR_PACKED; extern const char * ud_mnemonics_str[]; #endif /* UD_ITAB_H */ mumble-1.3.4/3rdparty/GL/0000775000175000017500000000000014010707273014713 5ustar builderbuildermumble-1.3.4/3rdparty/GL/glext.h0000664000175000017500000276245314010707273016232 0ustar builderbuilder#ifndef __glext_h_ #define __glext_h_ 1 #ifdef __cplusplus extern "C" { #endif /* ** Copyright (c) 2013-2014 The Khronos Group Inc. ** ** Permission is hereby granted, free of charge, to any person obtaining a ** copy of this software and/or associated documentation files (the ** "Materials"), to deal in the Materials without restriction, including ** without limitation the rights to use, copy, modify, merge, publish, ** distribute, sublicense, and/or sell copies of the Materials, and to ** permit persons to whom the Materials are furnished to do so, subject to ** the following conditions: ** ** The above copyright notice and this permission notice shall be included ** in all copies or substantial portions of the Materials. ** ** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. */ /* ** This header is generated from the Khronos OpenGL / OpenGL ES XML ** API Registry. The current version of the Registry, generator scripts ** used to make the header, and the header can be found at ** http://www.opengl.org/registry/ ** ** Khronos $Revision: 29324 $ on $Date: 2015-01-04 17:42:37 -0800 (Sun, 04 Jan 2015) $ */ #if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN 1 #endif #include #endif #ifndef APIENTRY #define APIENTRY #endif #ifndef APIENTRYP #define APIENTRYP APIENTRY * #endif #ifndef GLAPI #define GLAPI extern #endif #define GL_GLEXT_VERSION 20150104 /* Generated C header for: * API: gl * Profile: compatibility * Versions considered: .* * Versions emitted: 1\.[2-9]|[234]\.[0-9] * Default extensions included: gl * Additional extensions included: _nomatch_^ * Extensions removed: _nomatch_^ */ #ifndef GL_VERSION_1_2 #define GL_VERSION_1_2 1 #define GL_UNSIGNED_BYTE_3_3_2 0x8032 #define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 #define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 #define GL_UNSIGNED_INT_8_8_8_8 0x8035 #define GL_UNSIGNED_INT_10_10_10_2 0x8036 #define GL_TEXTURE_BINDING_3D 0x806A #define GL_PACK_SKIP_IMAGES 0x806B #define GL_PACK_IMAGE_HEIGHT 0x806C #define GL_UNPACK_SKIP_IMAGES 0x806D #define GL_UNPACK_IMAGE_HEIGHT 0x806E #define GL_TEXTURE_3D 0x806F #define GL_PROXY_TEXTURE_3D 0x8070 #define GL_TEXTURE_DEPTH 0x8071 #define GL_TEXTURE_WRAP_R 0x8072 #define GL_MAX_3D_TEXTURE_SIZE 0x8073 #define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 #define GL_UNSIGNED_SHORT_5_6_5 0x8363 #define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 #define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 #define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 #define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 #define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 #define GL_BGR 0x80E0 #define GL_BGRA 0x80E1 #define GL_MAX_ELEMENTS_VERTICES 0x80E8 #define GL_MAX_ELEMENTS_INDICES 0x80E9 #define GL_CLAMP_TO_EDGE 0x812F #define GL_TEXTURE_MIN_LOD 0x813A #define GL_TEXTURE_MAX_LOD 0x813B #define GL_TEXTURE_BASE_LEVEL 0x813C #define GL_TEXTURE_MAX_LEVEL 0x813D #define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 #define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 #define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 #define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 #define GL_ALIASED_LINE_WIDTH_RANGE 0x846E #define GL_RESCALE_NORMAL 0x803A #define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 #define GL_SINGLE_COLOR 0x81F9 #define GL_SEPARATE_SPECULAR_COLOR 0x81FA #define GL_ALIASED_POINT_SIZE_RANGE 0x846D typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); typedef void (APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); GLAPI void APIENTRY glTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); GLAPI void APIENTRY glTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); GLAPI void APIENTRY glCopyTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); #endif #endif /* GL_VERSION_1_2 */ #ifndef GL_VERSION_1_3 #define GL_VERSION_1_3 1 #define GL_TEXTURE0 0x84C0 #define GL_TEXTURE1 0x84C1 #define GL_TEXTURE2 0x84C2 #define GL_TEXTURE3 0x84C3 #define GL_TEXTURE4 0x84C4 #define GL_TEXTURE5 0x84C5 #define GL_TEXTURE6 0x84C6 #define GL_TEXTURE7 0x84C7 #define GL_TEXTURE8 0x84C8 #define GL_TEXTURE9 0x84C9 #define GL_TEXTURE10 0x84CA #define GL_TEXTURE11 0x84CB #define GL_TEXTURE12 0x84CC #define GL_TEXTURE13 0x84CD #define GL_TEXTURE14 0x84CE #define GL_TEXTURE15 0x84CF #define GL_TEXTURE16 0x84D0 #define GL_TEXTURE17 0x84D1 #define GL_TEXTURE18 0x84D2 #define GL_TEXTURE19 0x84D3 #define GL_TEXTURE20 0x84D4 #define GL_TEXTURE21 0x84D5 #define GL_TEXTURE22 0x84D6 #define GL_TEXTURE23 0x84D7 #define GL_TEXTURE24 0x84D8 #define GL_TEXTURE25 0x84D9 #define GL_TEXTURE26 0x84DA #define GL_TEXTURE27 0x84DB #define GL_TEXTURE28 0x84DC #define GL_TEXTURE29 0x84DD #define GL_TEXTURE30 0x84DE #define GL_TEXTURE31 0x84DF #define GL_ACTIVE_TEXTURE 0x84E0 #define GL_MULTISAMPLE 0x809D #define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E #define GL_SAMPLE_ALPHA_TO_ONE 0x809F #define GL_SAMPLE_COVERAGE 0x80A0 #define GL_SAMPLE_BUFFERS 0x80A8 #define GL_SAMPLES 0x80A9 #define GL_SAMPLE_COVERAGE_VALUE 0x80AA #define GL_SAMPLE_COVERAGE_INVERT 0x80AB #define GL_TEXTURE_CUBE_MAP 0x8513 #define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 #define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A #define GL_PROXY_TEXTURE_CUBE_MAP 0x851B #define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C #define GL_COMPRESSED_RGB 0x84ED #define GL_COMPRESSED_RGBA 0x84EE #define GL_TEXTURE_COMPRESSION_HINT 0x84EF #define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 #define GL_TEXTURE_COMPRESSED 0x86A1 #define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 #define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 #define GL_CLAMP_TO_BORDER 0x812D #define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 #define GL_MAX_TEXTURE_UNITS 0x84E2 #define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 #define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 #define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 #define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 #define GL_MULTISAMPLE_BIT 0x20000000 #define GL_NORMAL_MAP 0x8511 #define GL_REFLECTION_MAP 0x8512 #define GL_COMPRESSED_ALPHA 0x84E9 #define GL_COMPRESSED_LUMINANCE 0x84EA #define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB #define GL_COMPRESSED_INTENSITY 0x84EC #define GL_COMBINE 0x8570 #define GL_COMBINE_RGB 0x8571 #define GL_COMBINE_ALPHA 0x8572 #define GL_SOURCE0_RGB 0x8580 #define GL_SOURCE1_RGB 0x8581 #define GL_SOURCE2_RGB 0x8582 #define GL_SOURCE0_ALPHA 0x8588 #define GL_SOURCE1_ALPHA 0x8589 #define GL_SOURCE2_ALPHA 0x858A #define GL_OPERAND0_RGB 0x8590 #define GL_OPERAND1_RGB 0x8591 #define GL_OPERAND2_RGB 0x8592 #define GL_OPERAND0_ALPHA 0x8598 #define GL_OPERAND1_ALPHA 0x8599 #define GL_OPERAND2_ALPHA 0x859A #define GL_RGB_SCALE 0x8573 #define GL_ADD_SIGNED 0x8574 #define GL_INTERPOLATE 0x8575 #define GL_SUBTRACT 0x84E7 #define GL_CONSTANT 0x8576 #define GL_PRIMARY_COLOR 0x8577 #define GL_PREVIOUS 0x8578 #define GL_DOT3_RGB 0x86AE #define GL_DOT3_RGBA 0x86AF typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLfloat value, GLboolean invert); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, void *img); typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); typedef void (APIENTRYP PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat *m); typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble *m); typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat *m); typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble *m); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glActiveTexture (GLenum texture); GLAPI void APIENTRY glSampleCoverage (GLfloat value, GLboolean invert); GLAPI void APIENTRY glCompressedTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); GLAPI void APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); GLAPI void APIENTRY glCompressedTexImage1D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); GLAPI void APIENTRY glCompressedTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); GLAPI void APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); GLAPI void APIENTRY glCompressedTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); GLAPI void APIENTRY glGetCompressedTexImage (GLenum target, GLint level, void *img); GLAPI void APIENTRY glClientActiveTexture (GLenum texture); GLAPI void APIENTRY glMultiTexCoord1d (GLenum target, GLdouble s); GLAPI void APIENTRY glMultiTexCoord1dv (GLenum target, const GLdouble *v); GLAPI void APIENTRY glMultiTexCoord1f (GLenum target, GLfloat s); GLAPI void APIENTRY glMultiTexCoord1fv (GLenum target, const GLfloat *v); GLAPI void APIENTRY glMultiTexCoord1i (GLenum target, GLint s); GLAPI void APIENTRY glMultiTexCoord1iv (GLenum target, const GLint *v); GLAPI void APIENTRY glMultiTexCoord1s (GLenum target, GLshort s); GLAPI void APIENTRY glMultiTexCoord1sv (GLenum target, const GLshort *v); GLAPI void APIENTRY glMultiTexCoord2d (GLenum target, GLdouble s, GLdouble t); GLAPI void APIENTRY glMultiTexCoord2dv (GLenum target, const GLdouble *v); GLAPI void APIENTRY glMultiTexCoord2f (GLenum target, GLfloat s, GLfloat t); GLAPI void APIENTRY glMultiTexCoord2fv (GLenum target, const GLfloat *v); GLAPI void APIENTRY glMultiTexCoord2i (GLenum target, GLint s, GLint t); GLAPI void APIENTRY glMultiTexCoord2iv (GLenum target, const GLint *v); GLAPI void APIENTRY glMultiTexCoord2s (GLenum target, GLshort s, GLshort t); GLAPI void APIENTRY glMultiTexCoord2sv (GLenum target, const GLshort *v); GLAPI void APIENTRY glMultiTexCoord3d (GLenum target, GLdouble s, GLdouble t, GLdouble r); GLAPI void APIENTRY glMultiTexCoord3dv (GLenum target, const GLdouble *v); GLAPI void APIENTRY glMultiTexCoord3f (GLenum target, GLfloat s, GLfloat t, GLfloat r); GLAPI void APIENTRY glMultiTexCoord3fv (GLenum target, const GLfloat *v); GLAPI void APIENTRY glMultiTexCoord3i (GLenum target, GLint s, GLint t, GLint r); GLAPI void APIENTRY glMultiTexCoord3iv (GLenum target, const GLint *v); GLAPI void APIENTRY glMultiTexCoord3s (GLenum target, GLshort s, GLshort t, GLshort r); GLAPI void APIENTRY glMultiTexCoord3sv (GLenum target, const GLshort *v); GLAPI void APIENTRY glMultiTexCoord4d (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); GLAPI void APIENTRY glMultiTexCoord4dv (GLenum target, const GLdouble *v); GLAPI void APIENTRY glMultiTexCoord4f (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); GLAPI void APIENTRY glMultiTexCoord4fv (GLenum target, const GLfloat *v); GLAPI void APIENTRY glMultiTexCoord4i (GLenum target, GLint s, GLint t, GLint r, GLint q); GLAPI void APIENTRY glMultiTexCoord4iv (GLenum target, const GLint *v); GLAPI void APIENTRY glMultiTexCoord4s (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); GLAPI void APIENTRY glMultiTexCoord4sv (GLenum target, const GLshort *v); GLAPI void APIENTRY glLoadTransposeMatrixf (const GLfloat *m); GLAPI void APIENTRY glLoadTransposeMatrixd (const GLdouble *m); GLAPI void APIENTRY glMultTransposeMatrixf (const GLfloat *m); GLAPI void APIENTRY glMultTransposeMatrixd (const GLdouble *m); #endif #endif /* GL_VERSION_1_3 */ #ifndef GL_VERSION_1_4 #define GL_VERSION_1_4 1 #define GL_BLEND_DST_RGB 0x80C8 #define GL_BLEND_SRC_RGB 0x80C9 #define GL_BLEND_DST_ALPHA 0x80CA #define GL_BLEND_SRC_ALPHA 0x80CB #define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 #define GL_DEPTH_COMPONENT16 0x81A5 #define GL_DEPTH_COMPONENT24 0x81A6 #define GL_DEPTH_COMPONENT32 0x81A7 #define GL_MIRRORED_REPEAT 0x8370 #define GL_MAX_TEXTURE_LOD_BIAS 0x84FD #define GL_TEXTURE_LOD_BIAS 0x8501 #define GL_INCR_WRAP 0x8507 #define GL_DECR_WRAP 0x8508 #define GL_TEXTURE_DEPTH_SIZE 0x884A #define GL_TEXTURE_COMPARE_MODE 0x884C #define GL_TEXTURE_COMPARE_FUNC 0x884D #define GL_POINT_SIZE_MIN 0x8126 #define GL_POINT_SIZE_MAX 0x8127 #define GL_POINT_DISTANCE_ATTENUATION 0x8129 #define GL_GENERATE_MIPMAP 0x8191 #define GL_GENERATE_MIPMAP_HINT 0x8192 #define GL_FOG_COORDINATE_SOURCE 0x8450 #define GL_FOG_COORDINATE 0x8451 #define GL_FRAGMENT_DEPTH 0x8452 #define GL_CURRENT_FOG_COORDINATE 0x8453 #define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 #define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 #define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 #define GL_FOG_COORDINATE_ARRAY 0x8457 #define GL_COLOR_SUM 0x8458 #define GL_CURRENT_SECONDARY_COLOR 0x8459 #define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A #define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B #define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C #define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D #define GL_SECONDARY_COLOR_ARRAY 0x845E #define GL_TEXTURE_FILTER_CONTROL 0x8500 #define GL_DEPTH_TEXTURE_MODE 0x884B #define GL_COMPARE_R_TO_TEXTURE 0x884E #define GL_FUNC_ADD 0x8006 #define GL_FUNC_SUBTRACT 0x800A #define GL_FUNC_REVERSE_SUBTRACT 0x800B #define GL_MIN 0x8007 #define GL_MAX 0x8008 #define GL_CONSTANT_COLOR 0x8001 #define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 #define GL_CONSTANT_ALPHA 0x8003 #define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount); typedef void (APIENTRYP PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); typedef void (APIENTRYP PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLFOGCOORDFPROC) (GLfloat coord); typedef void (APIENTRYP PFNGLFOGCOORDFVPROC) (const GLfloat *coord); typedef void (APIENTRYP PFNGLFOGCOORDDPROC) (GLdouble coord); typedef void (APIENTRYP PFNGLFOGCOORDDVPROC) (const GLdouble *coord); typedef void (APIENTRYP PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const void *pointer); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v); typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); typedef void (APIENTRYP PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); typedef void (APIENTRYP PFNGLWINDOWPOS2DVPROC) (const GLdouble *v); typedef void (APIENTRYP PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); typedef void (APIENTRYP PFNGLWINDOWPOS2FVPROC) (const GLfloat *v); typedef void (APIENTRYP PFNGLWINDOWPOS2IPROC) (GLint x, GLint y); typedef void (APIENTRYP PFNGLWINDOWPOS2IVPROC) (const GLint *v); typedef void (APIENTRYP PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y); typedef void (APIENTRYP PFNGLWINDOWPOS2SVPROC) (const GLshort *v); typedef void (APIENTRYP PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); typedef void (APIENTRYP PFNGLWINDOWPOS3DVPROC) (const GLdouble *v); typedef void (APIENTRYP PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLWINDOWPOS3FVPROC) (const GLfloat *v); typedef void (APIENTRYP PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); typedef void (APIENTRYP PFNGLWINDOWPOS3IVPROC) (const GLint *v); typedef void (APIENTRYP PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); typedef void (APIENTRYP PFNGLWINDOWPOS3SVPROC) (const GLshort *v); typedef void (APIENTRYP PFNGLBLENDCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); GLAPI void APIENTRY glMultiDrawArrays (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); GLAPI void APIENTRY glMultiDrawElements (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount); GLAPI void APIENTRY glPointParameterf (GLenum pname, GLfloat param); GLAPI void APIENTRY glPointParameterfv (GLenum pname, const GLfloat *params); GLAPI void APIENTRY glPointParameteri (GLenum pname, GLint param); GLAPI void APIENTRY glPointParameteriv (GLenum pname, const GLint *params); GLAPI void APIENTRY glFogCoordf (GLfloat coord); GLAPI void APIENTRY glFogCoordfv (const GLfloat *coord); GLAPI void APIENTRY glFogCoordd (GLdouble coord); GLAPI void APIENTRY glFogCoorddv (const GLdouble *coord); GLAPI void APIENTRY glFogCoordPointer (GLenum type, GLsizei stride, const void *pointer); GLAPI void APIENTRY glSecondaryColor3b (GLbyte red, GLbyte green, GLbyte blue); GLAPI void APIENTRY glSecondaryColor3bv (const GLbyte *v); GLAPI void APIENTRY glSecondaryColor3d (GLdouble red, GLdouble green, GLdouble blue); GLAPI void APIENTRY glSecondaryColor3dv (const GLdouble *v); GLAPI void APIENTRY glSecondaryColor3f (GLfloat red, GLfloat green, GLfloat blue); GLAPI void APIENTRY glSecondaryColor3fv (const GLfloat *v); GLAPI void APIENTRY glSecondaryColor3i (GLint red, GLint green, GLint blue); GLAPI void APIENTRY glSecondaryColor3iv (const GLint *v); GLAPI void APIENTRY glSecondaryColor3s (GLshort red, GLshort green, GLshort blue); GLAPI void APIENTRY glSecondaryColor3sv (const GLshort *v); GLAPI void APIENTRY glSecondaryColor3ub (GLubyte red, GLubyte green, GLubyte blue); GLAPI void APIENTRY glSecondaryColor3ubv (const GLubyte *v); GLAPI void APIENTRY glSecondaryColor3ui (GLuint red, GLuint green, GLuint blue); GLAPI void APIENTRY glSecondaryColor3uiv (const GLuint *v); GLAPI void APIENTRY glSecondaryColor3us (GLushort red, GLushort green, GLushort blue); GLAPI void APIENTRY glSecondaryColor3usv (const GLushort *v); GLAPI void APIENTRY glSecondaryColorPointer (GLint size, GLenum type, GLsizei stride, const void *pointer); GLAPI void APIENTRY glWindowPos2d (GLdouble x, GLdouble y); GLAPI void APIENTRY glWindowPos2dv (const GLdouble *v); GLAPI void APIENTRY glWindowPos2f (GLfloat x, GLfloat y); GLAPI void APIENTRY glWindowPos2fv (const GLfloat *v); GLAPI void APIENTRY glWindowPos2i (GLint x, GLint y); GLAPI void APIENTRY glWindowPos2iv (const GLint *v); GLAPI void APIENTRY glWindowPos2s (GLshort x, GLshort y); GLAPI void APIENTRY glWindowPos2sv (const GLshort *v); GLAPI void APIENTRY glWindowPos3d (GLdouble x, GLdouble y, GLdouble z); GLAPI void APIENTRY glWindowPos3dv (const GLdouble *v); GLAPI void APIENTRY glWindowPos3f (GLfloat x, GLfloat y, GLfloat z); GLAPI void APIENTRY glWindowPos3fv (const GLfloat *v); GLAPI void APIENTRY glWindowPos3i (GLint x, GLint y, GLint z); GLAPI void APIENTRY glWindowPos3iv (const GLint *v); GLAPI void APIENTRY glWindowPos3s (GLshort x, GLshort y, GLshort z); GLAPI void APIENTRY glWindowPos3sv (const GLshort *v); GLAPI void APIENTRY glBlendColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); GLAPI void APIENTRY glBlendEquation (GLenum mode); #endif #endif /* GL_VERSION_1_4 */ #ifndef GL_VERSION_1_5 #define GL_VERSION_1_5 1 #include typedef ptrdiff_t GLsizeiptr; typedef ptrdiff_t GLintptr; #define GL_BUFFER_SIZE 0x8764 #define GL_BUFFER_USAGE 0x8765 #define GL_QUERY_COUNTER_BITS 0x8864 #define GL_CURRENT_QUERY 0x8865 #define GL_QUERY_RESULT 0x8866 #define GL_QUERY_RESULT_AVAILABLE 0x8867 #define GL_ARRAY_BUFFER 0x8892 #define GL_ELEMENT_ARRAY_BUFFER 0x8893 #define GL_ARRAY_BUFFER_BINDING 0x8894 #define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 #define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F #define GL_READ_ONLY 0x88B8 #define GL_WRITE_ONLY 0x88B9 #define GL_READ_WRITE 0x88BA #define GL_BUFFER_ACCESS 0x88BB #define GL_BUFFER_MAPPED 0x88BC #define GL_BUFFER_MAP_POINTER 0x88BD #define GL_STREAM_DRAW 0x88E0 #define GL_STREAM_READ 0x88E1 #define GL_STREAM_COPY 0x88E2 #define GL_STATIC_DRAW 0x88E4 #define GL_STATIC_READ 0x88E5 #define GL_STATIC_COPY 0x88E6 #define GL_DYNAMIC_DRAW 0x88E8 #define GL_DYNAMIC_READ 0x88E9 #define GL_DYNAMIC_COPY 0x88EA #define GL_SAMPLES_PASSED 0x8914 #define GL_SRC1_ALPHA 0x8589 #define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 #define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 #define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 #define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 #define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A #define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B #define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C #define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D #define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E #define GL_FOG_COORD_SRC 0x8450 #define GL_FOG_COORD 0x8451 #define GL_CURRENT_FOG_COORD 0x8453 #define GL_FOG_COORD_ARRAY_TYPE 0x8454 #define GL_FOG_COORD_ARRAY_STRIDE 0x8455 #define GL_FOG_COORD_ARRAY_POINTER 0x8456 #define GL_FOG_COORD_ARRAY 0x8457 #define GL_FOG_COORD_ARRAY_BUFFER_BINDING 0x889D #define GL_SRC0_RGB 0x8580 #define GL_SRC1_RGB 0x8581 #define GL_SRC2_RGB 0x8582 #define GL_SRC0_ALPHA 0x8588 #define GL_SRC2_ALPHA 0x858A typedef void (APIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids); typedef void (APIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids); typedef GLboolean (APIENTRYP PFNGLISQUERYPROC) (GLuint id); typedef void (APIENTRYP PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); typedef void (APIENTRYP PFNGLENDQUERYPROC) (GLenum target); typedef void (APIENTRYP PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params); typedef void (APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); typedef void (APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); typedef void (APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers); typedef GLboolean (APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer); typedef void (APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void *data, GLenum usage); typedef void (APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, void *data); typedef void *(APIENTRYP PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target); typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, void **params); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glGenQueries (GLsizei n, GLuint *ids); GLAPI void APIENTRY glDeleteQueries (GLsizei n, const GLuint *ids); GLAPI GLboolean APIENTRY glIsQuery (GLuint id); GLAPI void APIENTRY glBeginQuery (GLenum target, GLuint id); GLAPI void APIENTRY glEndQuery (GLenum target); GLAPI void APIENTRY glGetQueryiv (GLenum target, GLenum pname, GLint *params); GLAPI void APIENTRY glGetQueryObjectiv (GLuint id, GLenum pname, GLint *params); GLAPI void APIENTRY glGetQueryObjectuiv (GLuint id, GLenum pname, GLuint *params); GLAPI void APIENTRY glBindBuffer (GLenum target, GLuint buffer); GLAPI void APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers); GLAPI void APIENTRY glGenBuffers (GLsizei n, GLuint *buffers); GLAPI GLboolean APIENTRY glIsBuffer (GLuint buffer); GLAPI void APIENTRY glBufferData (GLenum target, GLsizeiptr size, const void *data, GLenum usage); GLAPI void APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); GLAPI void APIENTRY glGetBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, void *data); GLAPI void *APIENTRY glMapBuffer (GLenum target, GLenum access); GLAPI GLboolean APIENTRY glUnmapBuffer (GLenum target); GLAPI void APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params); GLAPI void APIENTRY glGetBufferPointerv (GLenum target, GLenum pname, void **params); #endif #endif /* GL_VERSION_1_5 */ #ifndef GL_VERSION_2_0 #define GL_VERSION_2_0 1 typedef char GLchar; #define GL_BLEND_EQUATION_RGB 0x8009 #define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 #define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 #define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 #define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 #define GL_CURRENT_VERTEX_ATTRIB 0x8626 #define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 #define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 #define GL_STENCIL_BACK_FUNC 0x8800 #define GL_STENCIL_BACK_FAIL 0x8801 #define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 #define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 #define GL_MAX_DRAW_BUFFERS 0x8824 #define GL_DRAW_BUFFER0 0x8825 #define GL_DRAW_BUFFER1 0x8826 #define GL_DRAW_BUFFER2 0x8827 #define GL_DRAW_BUFFER3 0x8828 #define GL_DRAW_BUFFER4 0x8829 #define GL_DRAW_BUFFER5 0x882A #define GL_DRAW_BUFFER6 0x882B #define GL_DRAW_BUFFER7 0x882C #define GL_DRAW_BUFFER8 0x882D #define GL_DRAW_BUFFER9 0x882E #define GL_DRAW_BUFFER10 0x882F #define GL_DRAW_BUFFER11 0x8830 #define GL_DRAW_BUFFER12 0x8831 #define GL_DRAW_BUFFER13 0x8832 #define GL_DRAW_BUFFER14 0x8833 #define GL_DRAW_BUFFER15 0x8834 #define GL_BLEND_EQUATION_ALPHA 0x883D #define GL_MAX_VERTEX_ATTRIBS 0x8869 #define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A #define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 #define GL_FRAGMENT_SHADER 0x8B30 #define GL_VERTEX_SHADER 0x8B31 #define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 #define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A #define GL_MAX_VARYING_FLOATS 0x8B4B #define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C #define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D #define GL_SHADER_TYPE 0x8B4F #define GL_FLOAT_VEC2 0x8B50 #define GL_FLOAT_VEC3 0x8B51 #define GL_FLOAT_VEC4 0x8B52 #define GL_INT_VEC2 0x8B53 #define GL_INT_VEC3 0x8B54 #define GL_INT_VEC4 0x8B55 #define GL_BOOL 0x8B56 #define GL_BOOL_VEC2 0x8B57 #define GL_BOOL_VEC3 0x8B58 #define GL_BOOL_VEC4 0x8B59 #define GL_FLOAT_MAT2 0x8B5A #define GL_FLOAT_MAT3 0x8B5B #define GL_FLOAT_MAT4 0x8B5C #define GL_SAMPLER_1D 0x8B5D #define GL_SAMPLER_2D 0x8B5E #define GL_SAMPLER_3D 0x8B5F #define GL_SAMPLER_CUBE 0x8B60 #define GL_SAMPLER_1D_SHADOW 0x8B61 #define GL_SAMPLER_2D_SHADOW 0x8B62 #define GL_DELETE_STATUS 0x8B80 #define GL_COMPILE_STATUS 0x8B81 #define GL_LINK_STATUS 0x8B82 #define GL_VALIDATE_STATUS 0x8B83 #define GL_INFO_LOG_LENGTH 0x8B84 #define GL_ATTACHED_SHADERS 0x8B85 #define GL_ACTIVE_UNIFORMS 0x8B86 #define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 #define GL_SHADER_SOURCE_LENGTH 0x8B88 #define GL_ACTIVE_ATTRIBUTES 0x8B89 #define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A #define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B #define GL_SHADING_LANGUAGE_VERSION 0x8B8C #define GL_CURRENT_PROGRAM 0x8B8D #define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 #define GL_LOWER_LEFT 0x8CA1 #define GL_UPPER_LEFT 0x8CA2 #define GL_STENCIL_BACK_REF 0x8CA3 #define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 #define GL_STENCIL_BACK_WRITEMASK 0x8CA5 #define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 #define GL_POINT_SPRITE 0x8861 #define GL_COORD_REPLACE 0x8862 #define GL_MAX_TEXTURE_COORDS 0x8871 typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); typedef void (APIENTRYP PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs); typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum face, GLenum func, GLint ref, GLuint mask); typedef void (APIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); typedef void (APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name); typedef void (APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader); typedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC) (void); typedef GLuint (APIENTRYP PFNGLCREATESHADERPROC) (GLenum type); typedef void (APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program); typedef void (APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader); typedef void (APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); typedef void (APIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); typedef void (APIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name); typedef void (APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); typedef void (APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); typedef void (APIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name); typedef void (APIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params); typedef void (APIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble *params); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void **pointer); typedef GLboolean (APIENTRYP PFNGLISPROGRAMPROC) (GLuint program); typedef GLboolean (APIENTRYP PFNGLISSHADERPROC) (GLuint shader); typedef void (APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program); typedef void (APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); typedef void (APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program); typedef void (APIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); typedef void (APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); typedef void (APIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); typedef void (APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); typedef void (APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0); typedef void (APIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); typedef void (APIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); typedef void (APIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); typedef void (APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value); typedef void (APIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value); typedef void (APIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value); typedef void (APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program); typedef void (APIENTRYP PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha); GLAPI void APIENTRY glDrawBuffers (GLsizei n, const GLenum *bufs); GLAPI void APIENTRY glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); GLAPI void APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask); GLAPI void APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask); GLAPI void APIENTRY glAttachShader (GLuint program, GLuint shader); GLAPI void APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name); GLAPI void APIENTRY glCompileShader (GLuint shader); GLAPI GLuint APIENTRY glCreateProgram (void); GLAPI GLuint APIENTRY glCreateShader (GLenum type); GLAPI void APIENTRY glDeleteProgram (GLuint program); GLAPI void APIENTRY glDeleteShader (GLuint shader); GLAPI void APIENTRY glDetachShader (GLuint program, GLuint shader); GLAPI void APIENTRY glDisableVertexAttribArray (GLuint index); GLAPI void APIENTRY glEnableVertexAttribArray (GLuint index); GLAPI void APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); GLAPI void APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); GLAPI void APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); GLAPI GLint APIENTRY glGetAttribLocation (GLuint program, const GLchar *name); GLAPI void APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params); GLAPI void APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); GLAPI void APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params); GLAPI void APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); GLAPI void APIENTRY glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); GLAPI GLint APIENTRY glGetUniformLocation (GLuint program, const GLchar *name); GLAPI void APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat *params); GLAPI void APIENTRY glGetUniformiv (GLuint program, GLint location, GLint *params); GLAPI void APIENTRY glGetVertexAttribdv (GLuint index, GLenum pname, GLdouble *params); GLAPI void APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params); GLAPI void APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params); GLAPI void APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, void **pointer); GLAPI GLboolean APIENTRY glIsProgram (GLuint program); GLAPI GLboolean APIENTRY glIsShader (GLuint shader); GLAPI void APIENTRY glLinkProgram (GLuint program); GLAPI void APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); GLAPI void APIENTRY glUseProgram (GLuint program); GLAPI void APIENTRY glUniform1f (GLint location, GLfloat v0); GLAPI void APIENTRY glUniform2f (GLint location, GLfloat v0, GLfloat v1); GLAPI void APIENTRY glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); GLAPI void APIENTRY glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); GLAPI void APIENTRY glUniform1i (GLint location, GLint v0); GLAPI void APIENTRY glUniform2i (GLint location, GLint v0, GLint v1); GLAPI void APIENTRY glUniform3i (GLint location, GLint v0, GLint v1, GLint v2); GLAPI void APIENTRY glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); GLAPI void APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat *value); GLAPI void APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat *value); GLAPI void APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat *value); GLAPI void APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat *value); GLAPI void APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint *value); GLAPI void APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint *value); GLAPI void APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint *value); GLAPI void APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint *value); GLAPI void APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glValidateProgram (GLuint program); GLAPI void APIENTRY glVertexAttrib1d (GLuint index, GLdouble x); GLAPI void APIENTRY glVertexAttrib1dv (GLuint index, const GLdouble *v); GLAPI void APIENTRY glVertexAttrib1f (GLuint index, GLfloat x); GLAPI void APIENTRY glVertexAttrib1fv (GLuint index, const GLfloat *v); GLAPI void APIENTRY glVertexAttrib1s (GLuint index, GLshort x); GLAPI void APIENTRY glVertexAttrib1sv (GLuint index, const GLshort *v); GLAPI void APIENTRY glVertexAttrib2d (GLuint index, GLdouble x, GLdouble y); GLAPI void APIENTRY glVertexAttrib2dv (GLuint index, const GLdouble *v); GLAPI void APIENTRY glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y); GLAPI void APIENTRY glVertexAttrib2fv (GLuint index, const GLfloat *v); GLAPI void APIENTRY glVertexAttrib2s (GLuint index, GLshort x, GLshort y); GLAPI void APIENTRY glVertexAttrib2sv (GLuint index, const GLshort *v); GLAPI void APIENTRY glVertexAttrib3d (GLuint index, GLdouble x, GLdouble y, GLdouble z); GLAPI void APIENTRY glVertexAttrib3dv (GLuint index, const GLdouble *v); GLAPI void APIENTRY glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z); GLAPI void APIENTRY glVertexAttrib3fv (GLuint index, const GLfloat *v); GLAPI void APIENTRY glVertexAttrib3s (GLuint index, GLshort x, GLshort y, GLshort z); GLAPI void APIENTRY glVertexAttrib3sv (GLuint index, const GLshort *v); GLAPI void APIENTRY glVertexAttrib4Nbv (GLuint index, const GLbyte *v); GLAPI void APIENTRY glVertexAttrib4Niv (GLuint index, const GLint *v); GLAPI void APIENTRY glVertexAttrib4Nsv (GLuint index, const GLshort *v); GLAPI void APIENTRY glVertexAttrib4Nub (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); GLAPI void APIENTRY glVertexAttrib4Nubv (GLuint index, const GLubyte *v); GLAPI void APIENTRY glVertexAttrib4Nuiv (GLuint index, const GLuint *v); GLAPI void APIENTRY glVertexAttrib4Nusv (GLuint index, const GLushort *v); GLAPI void APIENTRY glVertexAttrib4bv (GLuint index, const GLbyte *v); GLAPI void APIENTRY glVertexAttrib4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); GLAPI void APIENTRY glVertexAttrib4dv (GLuint index, const GLdouble *v); GLAPI void APIENTRY glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); GLAPI void APIENTRY glVertexAttrib4fv (GLuint index, const GLfloat *v); GLAPI void APIENTRY glVertexAttrib4iv (GLuint index, const GLint *v); GLAPI void APIENTRY glVertexAttrib4s (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); GLAPI void APIENTRY glVertexAttrib4sv (GLuint index, const GLshort *v); GLAPI void APIENTRY glVertexAttrib4ubv (GLuint index, const GLubyte *v); GLAPI void APIENTRY glVertexAttrib4uiv (GLuint index, const GLuint *v); GLAPI void APIENTRY glVertexAttrib4usv (GLuint index, const GLushort *v); GLAPI void APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); #endif #endif /* GL_VERSION_2_0 */ #ifndef GL_VERSION_2_1 #define GL_VERSION_2_1 1 #define GL_PIXEL_PACK_BUFFER 0x88EB #define GL_PIXEL_UNPACK_BUFFER 0x88EC #define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED #define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF #define GL_FLOAT_MAT2x3 0x8B65 #define GL_FLOAT_MAT2x4 0x8B66 #define GL_FLOAT_MAT3x2 0x8B67 #define GL_FLOAT_MAT3x4 0x8B68 #define GL_FLOAT_MAT4x2 0x8B69 #define GL_FLOAT_MAT4x3 0x8B6A #define GL_SRGB 0x8C40 #define GL_SRGB8 0x8C41 #define GL_SRGB_ALPHA 0x8C42 #define GL_SRGB8_ALPHA8 0x8C43 #define GL_COMPRESSED_SRGB 0x8C48 #define GL_COMPRESSED_SRGB_ALPHA 0x8C49 #define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F #define GL_SLUMINANCE_ALPHA 0x8C44 #define GL_SLUMINANCE8_ALPHA8 0x8C45 #define GL_SLUMINANCE 0x8C46 #define GL_SLUMINANCE8 0x8C47 #define GL_COMPRESSED_SLUMINANCE 0x8C4A #define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glUniformMatrix2x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glUniformMatrix3x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glUniformMatrix2x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glUniformMatrix4x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glUniformMatrix3x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glUniformMatrix4x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); #endif #endif /* GL_VERSION_2_1 */ #ifndef GL_VERSION_3_0 #define GL_VERSION_3_0 1 typedef unsigned short GLhalf; #define GL_COMPARE_REF_TO_TEXTURE 0x884E #define GL_CLIP_DISTANCE0 0x3000 #define GL_CLIP_DISTANCE1 0x3001 #define GL_CLIP_DISTANCE2 0x3002 #define GL_CLIP_DISTANCE3 0x3003 #define GL_CLIP_DISTANCE4 0x3004 #define GL_CLIP_DISTANCE5 0x3005 #define GL_CLIP_DISTANCE6 0x3006 #define GL_CLIP_DISTANCE7 0x3007 #define GL_MAX_CLIP_DISTANCES 0x0D32 #define GL_MAJOR_VERSION 0x821B #define GL_MINOR_VERSION 0x821C #define GL_NUM_EXTENSIONS 0x821D #define GL_CONTEXT_FLAGS 0x821E #define GL_COMPRESSED_RED 0x8225 #define GL_COMPRESSED_RG 0x8226 #define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x00000001 #define GL_RGBA32F 0x8814 #define GL_RGB32F 0x8815 #define GL_RGBA16F 0x881A #define GL_RGB16F 0x881B #define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD #define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF #define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 #define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 #define GL_CLAMP_READ_COLOR 0x891C #define GL_FIXED_ONLY 0x891D #define GL_MAX_VARYING_COMPONENTS 0x8B4B #define GL_TEXTURE_1D_ARRAY 0x8C18 #define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19 #define GL_TEXTURE_2D_ARRAY 0x8C1A #define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B #define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C #define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D #define GL_R11F_G11F_B10F 0x8C3A #define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B #define GL_RGB9_E5 0x8C3D #define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E #define GL_TEXTURE_SHARED_SIZE 0x8C3F #define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 #define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F #define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 #define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 #define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 #define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 #define GL_PRIMITIVES_GENERATED 0x8C87 #define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 #define GL_RASTERIZER_DISCARD 0x8C89 #define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A #define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B #define GL_INTERLEAVED_ATTRIBS 0x8C8C #define GL_SEPARATE_ATTRIBS 0x8C8D #define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E #define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F #define GL_RGBA32UI 0x8D70 #define GL_RGB32UI 0x8D71 #define GL_RGBA16UI 0x8D76 #define GL_RGB16UI 0x8D77 #define GL_RGBA8UI 0x8D7C #define GL_RGB8UI 0x8D7D #define GL_RGBA32I 0x8D82 #define GL_RGB32I 0x8D83 #define GL_RGBA16I 0x8D88 #define GL_RGB16I 0x8D89 #define GL_RGBA8I 0x8D8E #define GL_RGB8I 0x8D8F #define GL_RED_INTEGER 0x8D94 #define GL_GREEN_INTEGER 0x8D95 #define GL_BLUE_INTEGER 0x8D96 #define GL_RGB_INTEGER 0x8D98 #define GL_RGBA_INTEGER 0x8D99 #define GL_BGR_INTEGER 0x8D9A #define GL_BGRA_INTEGER 0x8D9B #define GL_SAMPLER_1D_ARRAY 0x8DC0 #define GL_SAMPLER_2D_ARRAY 0x8DC1 #define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3 #define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 #define GL_SAMPLER_CUBE_SHADOW 0x8DC5 #define GL_UNSIGNED_INT_VEC2 0x8DC6 #define GL_UNSIGNED_INT_VEC3 0x8DC7 #define GL_UNSIGNED_INT_VEC4 0x8DC8 #define GL_INT_SAMPLER_1D 0x8DC9 #define GL_INT_SAMPLER_2D 0x8DCA #define GL_INT_SAMPLER_3D 0x8DCB #define GL_INT_SAMPLER_CUBE 0x8DCC #define GL_INT_SAMPLER_1D_ARRAY 0x8DCE #define GL_INT_SAMPLER_2D_ARRAY 0x8DCF #define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1 #define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 #define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 #define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 #define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6 #define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 #define GL_QUERY_WAIT 0x8E13 #define GL_QUERY_NO_WAIT 0x8E14 #define GL_QUERY_BY_REGION_WAIT 0x8E15 #define GL_QUERY_BY_REGION_NO_WAIT 0x8E16 #define GL_BUFFER_ACCESS_FLAGS 0x911F #define GL_BUFFER_MAP_LENGTH 0x9120 #define GL_BUFFER_MAP_OFFSET 0x9121 #define GL_DEPTH_COMPONENT32F 0x8CAC #define GL_DEPTH32F_STENCIL8 0x8CAD #define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD #define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 #define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 #define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 #define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 #define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 #define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 #define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 #define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 #define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 #define GL_FRAMEBUFFER_DEFAULT 0x8218 #define GL_FRAMEBUFFER_UNDEFINED 0x8219 #define GL_DEPTH_STENCIL_ATTACHMENT 0x821A #define GL_MAX_RENDERBUFFER_SIZE 0x84E8 #define GL_DEPTH_STENCIL 0x84F9 #define GL_UNSIGNED_INT_24_8 0x84FA #define GL_DEPTH24_STENCIL8 0x88F0 #define GL_TEXTURE_STENCIL_SIZE 0x88F1 #define GL_TEXTURE_RED_TYPE 0x8C10 #define GL_TEXTURE_GREEN_TYPE 0x8C11 #define GL_TEXTURE_BLUE_TYPE 0x8C12 #define GL_TEXTURE_ALPHA_TYPE 0x8C13 #define GL_TEXTURE_DEPTH_TYPE 0x8C16 #define GL_UNSIGNED_NORMALIZED 0x8C17 #define GL_FRAMEBUFFER_BINDING 0x8CA6 #define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6 #define GL_RENDERBUFFER_BINDING 0x8CA7 #define GL_READ_FRAMEBUFFER 0x8CA8 #define GL_DRAW_FRAMEBUFFER 0x8CA9 #define GL_READ_FRAMEBUFFER_BINDING 0x8CAA #define GL_RENDERBUFFER_SAMPLES 0x8CAB #define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 #define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 #define GL_FRAMEBUFFER_COMPLETE 0x8CD5 #define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 #define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 #define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB #define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC #define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD #define GL_MAX_COLOR_ATTACHMENTS 0x8CDF #define GL_COLOR_ATTACHMENT0 0x8CE0 #define GL_COLOR_ATTACHMENT1 0x8CE1 #define GL_COLOR_ATTACHMENT2 0x8CE2 #define GL_COLOR_ATTACHMENT3 0x8CE3 #define GL_COLOR_ATTACHMENT4 0x8CE4 #define GL_COLOR_ATTACHMENT5 0x8CE5 #define GL_COLOR_ATTACHMENT6 0x8CE6 #define GL_COLOR_ATTACHMENT7 0x8CE7 #define GL_COLOR_ATTACHMENT8 0x8CE8 #define GL_COLOR_ATTACHMENT9 0x8CE9 #define GL_COLOR_ATTACHMENT10 0x8CEA #define GL_COLOR_ATTACHMENT11 0x8CEB #define GL_COLOR_ATTACHMENT12 0x8CEC #define GL_COLOR_ATTACHMENT13 0x8CED #define GL_COLOR_ATTACHMENT14 0x8CEE #define GL_COLOR_ATTACHMENT15 0x8CEF #define GL_DEPTH_ATTACHMENT 0x8D00 #define GL_STENCIL_ATTACHMENT 0x8D20 #define GL_FRAMEBUFFER 0x8D40 #define GL_RENDERBUFFER 0x8D41 #define GL_RENDERBUFFER_WIDTH 0x8D42 #define GL_RENDERBUFFER_HEIGHT 0x8D43 #define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 #define GL_STENCIL_INDEX1 0x8D46 #define GL_STENCIL_INDEX4 0x8D47 #define GL_STENCIL_INDEX8 0x8D48 #define GL_STENCIL_INDEX16 0x8D49 #define GL_RENDERBUFFER_RED_SIZE 0x8D50 #define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 #define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 #define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 #define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 #define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 #define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 #define GL_MAX_SAMPLES 0x8D57 #define GL_INDEX 0x8222 #define GL_TEXTURE_LUMINANCE_TYPE 0x8C14 #define GL_TEXTURE_INTENSITY_TYPE 0x8C15 #define GL_FRAMEBUFFER_SRGB 0x8DB9 #define GL_HALF_FLOAT 0x140B #define GL_MAP_READ_BIT 0x0001 #define GL_MAP_WRITE_BIT 0x0002 #define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 #define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 #define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 #define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 #define GL_COMPRESSED_RED_RGTC1 0x8DBB #define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC #define GL_COMPRESSED_RG_RGTC2 0x8DBD #define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE #define GL_RG 0x8227 #define GL_RG_INTEGER 0x8228 #define GL_R8 0x8229 #define GL_R16 0x822A #define GL_RG8 0x822B #define GL_RG16 0x822C #define GL_R16F 0x822D #define GL_R32F 0x822E #define GL_RG16F 0x822F #define GL_RG32F 0x8230 #define GL_R8I 0x8231 #define GL_R8UI 0x8232 #define GL_R16I 0x8233 #define GL_R16UI 0x8234 #define GL_R32I 0x8235 #define GL_R32UI 0x8236 #define GL_RG8I 0x8237 #define GL_RG8UI 0x8238 #define GL_RG16I 0x8239 #define GL_RG16UI 0x823A #define GL_RG32I 0x823B #define GL_RG32UI 0x823C #define GL_VERTEX_ARRAY_BINDING 0x85B5 #define GL_CLAMP_VERTEX_COLOR 0x891A #define GL_CLAMP_FRAGMENT_COLOR 0x891B #define GL_ALPHA_INTEGER 0x8D97 typedef void (APIENTRYP PFNGLCOLORMASKIPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); typedef void (APIENTRYP PFNGLGETBOOLEANI_VPROC) (GLenum target, GLuint index, GLboolean *data); typedef void (APIENTRYP PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint *data); typedef void (APIENTRYP PFNGLENABLEIPROC) (GLenum target, GLuint index); typedef void (APIENTRYP PFNGLDISABLEIPROC) (GLenum target, GLuint index); typedef GLboolean (APIENTRYP PFNGLISENABLEDIPROC) (GLenum target, GLuint index); typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode); typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKPROC) (void); typedef void (APIENTRYP PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); typedef void (APIENTRYP PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer); typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); typedef void (APIENTRYP PFNGLCLAMPCOLORPROC) (GLenum target, GLenum clamp); typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERPROC) (GLuint id, GLenum mode); typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERPROC) (void); typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint *params); typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IPROC) (GLuint index, GLint x); typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IPROC) (GLuint index, GLint x, GLint y); typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IPROC) (GLuint index, GLint x, GLint y, GLint z); typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIPROC) (GLuint index, GLuint x); typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIPROC) (GLuint index, GLuint x, GLuint y); typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z); typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IVPROC) (GLuint index, const GLint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IVPROC) (GLuint index, const GLint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IVPROC) (GLuint index, const GLint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIVPROC) (GLuint index, const GLuint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIVPROC) (GLuint index, const GLuint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIVPROC) (GLuint index, const GLuint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVPROC) (GLuint index, const GLbyte *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVPROC) (GLuint index, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVPROC) (GLuint index, const GLubyte *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVPROC) (GLuint index, const GLushort *v); typedef void (APIENTRYP PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint *params); typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONPROC) (GLuint program, GLuint color, const GLchar *name); typedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar *name); typedef void (APIENTRYP PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0); typedef void (APIENTRYP PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1); typedef void (APIENTRYP PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); typedef void (APIENTRYP PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); typedef void (APIENTRYP PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint *value); typedef void (APIENTRYP PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint *value); typedef void (APIENTRYP PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint *value); typedef void (APIENTRYP PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint *value); typedef void (APIENTRYP PFNGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint *params); typedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint *params); typedef void (APIENTRYP PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawbuffer, const GLint *value); typedef void (APIENTRYP PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawbuffer, const GLuint *value); typedef void (APIENTRYP PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawbuffer, const GLfloat *value); typedef void (APIENTRYP PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); typedef const GLubyte *(APIENTRYP PFNGLGETSTRINGIPROC) (GLenum name, GLuint index); typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer); typedef void (APIENTRYP PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer); typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint *renderbuffers); typedef void (APIENTRYP PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers); typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer); typedef void (APIENTRYP PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer); typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint *framebuffers); typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers); typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target); typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGENERATEMIPMAPPROC) (GLenum target); typedef void (APIENTRYP PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); typedef void *(APIENTRYP PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); typedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length); typedef void (APIENTRYP PFNGLBINDVERTEXARRAYPROC) (GLuint array); typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays); typedef void (APIENTRYP PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays); typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYPROC) (GLuint array); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glColorMaski (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); GLAPI void APIENTRY glGetBooleani_v (GLenum target, GLuint index, GLboolean *data); GLAPI void APIENTRY glGetIntegeri_v (GLenum target, GLuint index, GLint *data); GLAPI void APIENTRY glEnablei (GLenum target, GLuint index); GLAPI void APIENTRY glDisablei (GLenum target, GLuint index); GLAPI GLboolean APIENTRY glIsEnabledi (GLenum target, GLuint index); GLAPI void APIENTRY glBeginTransformFeedback (GLenum primitiveMode); GLAPI void APIENTRY glEndTransformFeedback (void); GLAPI void APIENTRY glBindBufferRange (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); GLAPI void APIENTRY glBindBufferBase (GLenum target, GLuint index, GLuint buffer); GLAPI void APIENTRY glTransformFeedbackVaryings (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); GLAPI void APIENTRY glGetTransformFeedbackVarying (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); GLAPI void APIENTRY glClampColor (GLenum target, GLenum clamp); GLAPI void APIENTRY glBeginConditionalRender (GLuint id, GLenum mode); GLAPI void APIENTRY glEndConditionalRender (void); GLAPI void APIENTRY glVertexAttribIPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); GLAPI void APIENTRY glGetVertexAttribIiv (GLuint index, GLenum pname, GLint *params); GLAPI void APIENTRY glGetVertexAttribIuiv (GLuint index, GLenum pname, GLuint *params); GLAPI void APIENTRY glVertexAttribI1i (GLuint index, GLint x); GLAPI void APIENTRY glVertexAttribI2i (GLuint index, GLint x, GLint y); GLAPI void APIENTRY glVertexAttribI3i (GLuint index, GLint x, GLint y, GLint z); GLAPI void APIENTRY glVertexAttribI4i (GLuint index, GLint x, GLint y, GLint z, GLint w); GLAPI void APIENTRY glVertexAttribI1ui (GLuint index, GLuint x); GLAPI void APIENTRY glVertexAttribI2ui (GLuint index, GLuint x, GLuint y); GLAPI void APIENTRY glVertexAttribI3ui (GLuint index, GLuint x, GLuint y, GLuint z); GLAPI void APIENTRY glVertexAttribI4ui (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); GLAPI void APIENTRY glVertexAttribI1iv (GLuint index, const GLint *v); GLAPI void APIENTRY glVertexAttribI2iv (GLuint index, const GLint *v); GLAPI void APIENTRY glVertexAttribI3iv (GLuint index, const GLint *v); GLAPI void APIENTRY glVertexAttribI4iv (GLuint index, const GLint *v); GLAPI void APIENTRY glVertexAttribI1uiv (GLuint index, const GLuint *v); GLAPI void APIENTRY glVertexAttribI2uiv (GLuint index, const GLuint *v); GLAPI void APIENTRY glVertexAttribI3uiv (GLuint index, const GLuint *v); GLAPI void APIENTRY glVertexAttribI4uiv (GLuint index, const GLuint *v); GLAPI void APIENTRY glVertexAttribI4bv (GLuint index, const GLbyte *v); GLAPI void APIENTRY glVertexAttribI4sv (GLuint index, const GLshort *v); GLAPI void APIENTRY glVertexAttribI4ubv (GLuint index, const GLubyte *v); GLAPI void APIENTRY glVertexAttribI4usv (GLuint index, const GLushort *v); GLAPI void APIENTRY glGetUniformuiv (GLuint program, GLint location, GLuint *params); GLAPI void APIENTRY glBindFragDataLocation (GLuint program, GLuint color, const GLchar *name); GLAPI GLint APIENTRY glGetFragDataLocation (GLuint program, const GLchar *name); GLAPI void APIENTRY glUniform1ui (GLint location, GLuint v0); GLAPI void APIENTRY glUniform2ui (GLint location, GLuint v0, GLuint v1); GLAPI void APIENTRY glUniform3ui (GLint location, GLuint v0, GLuint v1, GLuint v2); GLAPI void APIENTRY glUniform4ui (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); GLAPI void APIENTRY glUniform1uiv (GLint location, GLsizei count, const GLuint *value); GLAPI void APIENTRY glUniform2uiv (GLint location, GLsizei count, const GLuint *value); GLAPI void APIENTRY glUniform3uiv (GLint location, GLsizei count, const GLuint *value); GLAPI void APIENTRY glUniform4uiv (GLint location, GLsizei count, const GLuint *value); GLAPI void APIENTRY glTexParameterIiv (GLenum target, GLenum pname, const GLint *params); GLAPI void APIENTRY glTexParameterIuiv (GLenum target, GLenum pname, const GLuint *params); GLAPI void APIENTRY glGetTexParameterIiv (GLenum target, GLenum pname, GLint *params); GLAPI void APIENTRY glGetTexParameterIuiv (GLenum target, GLenum pname, GLuint *params); GLAPI void APIENTRY glClearBufferiv (GLenum buffer, GLint drawbuffer, const GLint *value); GLAPI void APIENTRY glClearBufferuiv (GLenum buffer, GLint drawbuffer, const GLuint *value); GLAPI void APIENTRY glClearBufferfv (GLenum buffer, GLint drawbuffer, const GLfloat *value); GLAPI void APIENTRY glClearBufferfi (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); GLAPI const GLubyte *APIENTRY glGetStringi (GLenum name, GLuint index); GLAPI GLboolean APIENTRY glIsRenderbuffer (GLuint renderbuffer); GLAPI void APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer); GLAPI void APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers); GLAPI void APIENTRY glGenRenderbuffers (GLsizei n, GLuint *renderbuffers); GLAPI void APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); GLAPI void APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint *params); GLAPI GLboolean APIENTRY glIsFramebuffer (GLuint framebuffer); GLAPI void APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer); GLAPI void APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers); GLAPI void APIENTRY glGenFramebuffers (GLsizei n, GLuint *framebuffers); GLAPI GLenum APIENTRY glCheckFramebufferStatus (GLenum target); GLAPI void APIENTRY glFramebufferTexture1D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); GLAPI void APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); GLAPI void APIENTRY glFramebufferTexture3D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); GLAPI void APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); GLAPI void APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint *params); GLAPI void APIENTRY glGenerateMipmap (GLenum target); GLAPI void APIENTRY glBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); GLAPI void APIENTRY glRenderbufferStorageMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); GLAPI void APIENTRY glFramebufferTextureLayer (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); GLAPI void *APIENTRY glMapBufferRange (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); GLAPI void APIENTRY glFlushMappedBufferRange (GLenum target, GLintptr offset, GLsizeiptr length); GLAPI void APIENTRY glBindVertexArray (GLuint array); GLAPI void APIENTRY glDeleteVertexArrays (GLsizei n, const GLuint *arrays); GLAPI void APIENTRY glGenVertexArrays (GLsizei n, GLuint *arrays); GLAPI GLboolean APIENTRY glIsVertexArray (GLuint array); #endif #endif /* GL_VERSION_3_0 */ #ifndef GL_VERSION_3_1 #define GL_VERSION_3_1 1 #define GL_SAMPLER_2D_RECT 0x8B63 #define GL_SAMPLER_2D_RECT_SHADOW 0x8B64 #define GL_SAMPLER_BUFFER 0x8DC2 #define GL_INT_SAMPLER_2D_RECT 0x8DCD #define GL_INT_SAMPLER_BUFFER 0x8DD0 #define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5 #define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 #define GL_TEXTURE_BUFFER 0x8C2A #define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B #define GL_TEXTURE_BINDING_BUFFER 0x8C2C #define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D #define GL_TEXTURE_RECTANGLE 0x84F5 #define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 #define GL_PROXY_TEXTURE_RECTANGLE 0x84F7 #define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8 #define GL_R8_SNORM 0x8F94 #define GL_RG8_SNORM 0x8F95 #define GL_RGB8_SNORM 0x8F96 #define GL_RGBA8_SNORM 0x8F97 #define GL_R16_SNORM 0x8F98 #define GL_RG16_SNORM 0x8F99 #define GL_RGB16_SNORM 0x8F9A #define GL_RGBA16_SNORM 0x8F9B #define GL_SIGNED_NORMALIZED 0x8F9C #define GL_PRIMITIVE_RESTART 0x8F9D #define GL_PRIMITIVE_RESTART_INDEX 0x8F9E #define GL_COPY_READ_BUFFER 0x8F36 #define GL_COPY_WRITE_BUFFER 0x8F37 #define GL_UNIFORM_BUFFER 0x8A11 #define GL_UNIFORM_BUFFER_BINDING 0x8A28 #define GL_UNIFORM_BUFFER_START 0x8A29 #define GL_UNIFORM_BUFFER_SIZE 0x8A2A #define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B #define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C #define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D #define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E #define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F #define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 #define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 #define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 #define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 #define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 #define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 #define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 #define GL_UNIFORM_TYPE 0x8A37 #define GL_UNIFORM_SIZE 0x8A38 #define GL_UNIFORM_NAME_LENGTH 0x8A39 #define GL_UNIFORM_BLOCK_INDEX 0x8A3A #define GL_UNIFORM_OFFSET 0x8A3B #define GL_UNIFORM_ARRAY_STRIDE 0x8A3C #define GL_UNIFORM_MATRIX_STRIDE 0x8A3D #define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E #define GL_UNIFORM_BLOCK_BINDING 0x8A3F #define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 #define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 #define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 #define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 #define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 #define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 #define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 #define GL_INVALID_INDEX 0xFFFFFFFFu typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount); typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount); typedef void (APIENTRYP PFNGLTEXBUFFERPROC) (GLenum target, GLenum internalformat, GLuint buffer); typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXPROC) (GLuint index); typedef void (APIENTRYP PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); typedef void (APIENTRYP PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices); typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMNAMEPROC) (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName); typedef GLuint (APIENTRYP PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar *uniformBlockName); typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); typedef void (APIENTRYP PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glDrawArraysInstanced (GLenum mode, GLint first, GLsizei count, GLsizei instancecount); GLAPI void APIENTRY glDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount); GLAPI void APIENTRY glTexBuffer (GLenum target, GLenum internalformat, GLuint buffer); GLAPI void APIENTRY glPrimitiveRestartIndex (GLuint index); GLAPI void APIENTRY glCopyBufferSubData (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); GLAPI void APIENTRY glGetUniformIndices (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices); GLAPI void APIENTRY glGetActiveUniformsiv (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); GLAPI void APIENTRY glGetActiveUniformName (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName); GLAPI GLuint APIENTRY glGetUniformBlockIndex (GLuint program, const GLchar *uniformBlockName); GLAPI void APIENTRY glGetActiveUniformBlockiv (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); GLAPI void APIENTRY glGetActiveUniformBlockName (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); GLAPI void APIENTRY glUniformBlockBinding (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); #endif #endif /* GL_VERSION_3_1 */ #ifndef GL_VERSION_3_2 #define GL_VERSION_3_2 1 typedef struct __GLsync *GLsync; #ifndef GLEXT_64_TYPES_DEFINED /* This code block is duplicated in glxext.h, so must be protected */ #define GLEXT_64_TYPES_DEFINED /* Define int32_t, int64_t, and uint64_t types for UST/MSC */ /* (as used in the GL_EXT_timer_query extension). */ #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #include #elif defined(__sun__) || defined(__digital__) #include #if defined(__STDC__) #if defined(__arch64__) || defined(_LP64) typedef long int int64_t; typedef unsigned long int uint64_t; #else typedef long long int int64_t; typedef unsigned long long int uint64_t; #endif /* __arch64__ */ #endif /* __STDC__ */ #elif defined( __VMS ) || defined(__sgi) #include #elif defined(__SCO__) || defined(__USLC__) #include #elif defined(__UNIXOS2__) || defined(__SOL64__) typedef long int int32_t; typedef long long int int64_t; typedef unsigned long long int uint64_t; #elif defined(_WIN32) && defined(__GNUC__) #include #elif defined(_WIN32) typedef __int32 int32_t; typedef __int64 int64_t; typedef unsigned __int64 uint64_t; #else /* Fallback if nothing above works */ #include #endif #endif typedef uint64_t GLuint64; typedef int64_t GLint64; #define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 #define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 #define GL_LINES_ADJACENCY 0x000A #define GL_LINE_STRIP_ADJACENCY 0x000B #define GL_TRIANGLES_ADJACENCY 0x000C #define GL_TRIANGLE_STRIP_ADJACENCY 0x000D #define GL_PROGRAM_POINT_SIZE 0x8642 #define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 #define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7 #define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 #define GL_GEOMETRY_SHADER 0x8DD9 #define GL_GEOMETRY_VERTICES_OUT 0x8916 #define GL_GEOMETRY_INPUT_TYPE 0x8917 #define GL_GEOMETRY_OUTPUT_TYPE 0x8918 #define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF #define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 #define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 #define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 #define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 #define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 #define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 #define GL_CONTEXT_PROFILE_MASK 0x9126 #define GL_DEPTH_CLAMP 0x864F #define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C #define GL_FIRST_VERTEX_CONVENTION 0x8E4D #define GL_LAST_VERTEX_CONVENTION 0x8E4E #define GL_PROVOKING_VERTEX 0x8E4F #define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F #define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 #define GL_OBJECT_TYPE 0x9112 #define GL_SYNC_CONDITION 0x9113 #define GL_SYNC_STATUS 0x9114 #define GL_SYNC_FLAGS 0x9115 #define GL_SYNC_FENCE 0x9116 #define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 #define GL_UNSIGNALED 0x9118 #define GL_SIGNALED 0x9119 #define GL_ALREADY_SIGNALED 0x911A #define GL_TIMEOUT_EXPIRED 0x911B #define GL_CONDITION_SATISFIED 0x911C #define GL_WAIT_FAILED 0x911D #define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFFull #define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 #define GL_SAMPLE_POSITION 0x8E50 #define GL_SAMPLE_MASK 0x8E51 #define GL_SAMPLE_MASK_VALUE 0x8E52 #define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 #define GL_TEXTURE_2D_MULTISAMPLE 0x9100 #define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101 #define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 #define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 #define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 #define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105 #define GL_TEXTURE_SAMPLES 0x9106 #define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 #define GL_SAMPLER_2D_MULTISAMPLE 0x9108 #define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 #define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A #define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B #define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C #define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D #define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E #define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F #define GL_MAX_INTEGER_SAMPLES 0x9110 typedef void (APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex); typedef void (APIENTRYP PFNGLPROVOKINGVERTEXPROC) (GLenum mode); typedef GLsync (APIENTRYP PFNGLFENCESYNCPROC) (GLenum condition, GLbitfield flags); typedef GLboolean (APIENTRYP PFNGLISSYNCPROC) (GLsync sync); typedef void (APIENTRYP PFNGLDELETESYNCPROC) (GLsync sync); typedef GLenum (APIENTRYP PFNGLCLIENTWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); typedef void (APIENTRYP PFNGLWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); typedef void (APIENTRYP PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64 *data); typedef void (APIENTRYP PFNGLGETSYNCIVPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); typedef void (APIENTRYP PFNGLGETINTEGER64I_VPROC) (GLenum target, GLuint index, GLint64 *data); typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum pname, GLint64 *params); typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); typedef void (APIENTRYP PFNGLTEXIMAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); typedef void (APIENTRYP PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); typedef void (APIENTRYP PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat *val); typedef void (APIENTRYP PFNGLSAMPLEMASKIPROC) (GLuint maskNumber, GLbitfield mask); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glDrawElementsBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); GLAPI void APIENTRY glDrawRangeElementsBaseVertex (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); GLAPI void APIENTRY glDrawElementsInstancedBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); GLAPI void APIENTRY glMultiDrawElementsBaseVertex (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex); GLAPI void APIENTRY glProvokingVertex (GLenum mode); GLAPI GLsync APIENTRY glFenceSync (GLenum condition, GLbitfield flags); GLAPI GLboolean APIENTRY glIsSync (GLsync sync); GLAPI void APIENTRY glDeleteSync (GLsync sync); GLAPI GLenum APIENTRY glClientWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout); GLAPI void APIENTRY glWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout); GLAPI void APIENTRY glGetInteger64v (GLenum pname, GLint64 *data); GLAPI void APIENTRY glGetSynciv (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); GLAPI void APIENTRY glGetInteger64i_v (GLenum target, GLuint index, GLint64 *data); GLAPI void APIENTRY glGetBufferParameteri64v (GLenum target, GLenum pname, GLint64 *params); GLAPI void APIENTRY glFramebufferTexture (GLenum target, GLenum attachment, GLuint texture, GLint level); GLAPI void APIENTRY glTexImage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); GLAPI void APIENTRY glTexImage3DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); GLAPI void APIENTRY glGetMultisamplefv (GLenum pname, GLuint index, GLfloat *val); GLAPI void APIENTRY glSampleMaski (GLuint maskNumber, GLbitfield mask); #endif #endif /* GL_VERSION_3_2 */ #ifndef GL_VERSION_3_3 #define GL_VERSION_3_3 1 #define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE #define GL_SRC1_COLOR 0x88F9 #define GL_ONE_MINUS_SRC1_COLOR 0x88FA #define GL_ONE_MINUS_SRC1_ALPHA 0x88FB #define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC #define GL_ANY_SAMPLES_PASSED 0x8C2F #define GL_SAMPLER_BINDING 0x8919 #define GL_RGB10_A2UI 0x906F #define GL_TEXTURE_SWIZZLE_R 0x8E42 #define GL_TEXTURE_SWIZZLE_G 0x8E43 #define GL_TEXTURE_SWIZZLE_B 0x8E44 #define GL_TEXTURE_SWIZZLE_A 0x8E45 #define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 #define GL_TIME_ELAPSED 0x88BF #define GL_TIMESTAMP 0x8E28 #define GL_INT_2_10_10_10_REV 0x8D9F typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); typedef GLint (APIENTRYP PFNGLGETFRAGDATAINDEXPROC) (GLuint program, const GLchar *name); typedef void (APIENTRYP PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint *samplers); typedef void (APIENTRYP PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint *samplers); typedef GLboolean (APIENTRYP PFNGLISSAMPLERPROC) (GLuint sampler); typedef void (APIENTRYP PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler); typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param); typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint *param); typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat *param); typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint *param); typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint *param); typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint *params); typedef void (APIENTRYP PFNGLQUERYCOUNTERPROC) (GLuint id, GLenum target); typedef void (APIENTRYP PFNGLGETQUERYOBJECTI64VPROC) (GLuint id, GLenum pname, GLint64 *params); typedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VPROC) (GLuint id, GLenum pname, GLuint64 *params); typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor); typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); typedef void (APIENTRYP PFNGLVERTEXP2UIPROC) (GLenum type, GLuint value); typedef void (APIENTRYP PFNGLVERTEXP2UIVPROC) (GLenum type, const GLuint *value); typedef void (APIENTRYP PFNGLVERTEXP3UIPROC) (GLenum type, GLuint value); typedef void (APIENTRYP PFNGLVERTEXP3UIVPROC) (GLenum type, const GLuint *value); typedef void (APIENTRYP PFNGLVERTEXP4UIPROC) (GLenum type, GLuint value); typedef void (APIENTRYP PFNGLVERTEXP4UIVPROC) (GLenum type, const GLuint *value); typedef void (APIENTRYP PFNGLTEXCOORDP1UIPROC) (GLenum type, GLuint coords); typedef void (APIENTRYP PFNGLTEXCOORDP1UIVPROC) (GLenum type, const GLuint *coords); typedef void (APIENTRYP PFNGLTEXCOORDP2UIPROC) (GLenum type, GLuint coords); typedef void (APIENTRYP PFNGLTEXCOORDP2UIVPROC) (GLenum type, const GLuint *coords); typedef void (APIENTRYP PFNGLTEXCOORDP3UIPROC) (GLenum type, GLuint coords); typedef void (APIENTRYP PFNGLTEXCOORDP3UIVPROC) (GLenum type, const GLuint *coords); typedef void (APIENTRYP PFNGLTEXCOORDP4UIPROC) (GLenum type, GLuint coords); typedef void (APIENTRYP PFNGLTEXCOORDP4UIVPROC) (GLenum type, const GLuint *coords); typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIPROC) (GLenum texture, GLenum type, GLuint coords); typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIPROC) (GLenum texture, GLenum type, GLuint coords); typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIPROC) (GLenum texture, GLenum type, GLuint coords); typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIPROC) (GLenum texture, GLenum type, GLuint coords); typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); typedef void (APIENTRYP PFNGLNORMALP3UIPROC) (GLenum type, GLuint coords); typedef void (APIENTRYP PFNGLNORMALP3UIVPROC) (GLenum type, const GLuint *coords); typedef void (APIENTRYP PFNGLCOLORP3UIPROC) (GLenum type, GLuint color); typedef void (APIENTRYP PFNGLCOLORP3UIVPROC) (GLenum type, const GLuint *color); typedef void (APIENTRYP PFNGLCOLORP4UIPROC) (GLenum type, GLuint color); typedef void (APIENTRYP PFNGLCOLORP4UIVPROC) (GLenum type, const GLuint *color); typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIPROC) (GLenum type, GLuint color); typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIVPROC) (GLenum type, const GLuint *color); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBindFragDataLocationIndexed (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); GLAPI GLint APIENTRY glGetFragDataIndex (GLuint program, const GLchar *name); GLAPI void APIENTRY glGenSamplers (GLsizei count, GLuint *samplers); GLAPI void APIENTRY glDeleteSamplers (GLsizei count, const GLuint *samplers); GLAPI GLboolean APIENTRY glIsSampler (GLuint sampler); GLAPI void APIENTRY glBindSampler (GLuint unit, GLuint sampler); GLAPI void APIENTRY glSamplerParameteri (GLuint sampler, GLenum pname, GLint param); GLAPI void APIENTRY glSamplerParameteriv (GLuint sampler, GLenum pname, const GLint *param); GLAPI void APIENTRY glSamplerParameterf (GLuint sampler, GLenum pname, GLfloat param); GLAPI void APIENTRY glSamplerParameterfv (GLuint sampler, GLenum pname, const GLfloat *param); GLAPI void APIENTRY glSamplerParameterIiv (GLuint sampler, GLenum pname, const GLint *param); GLAPI void APIENTRY glSamplerParameterIuiv (GLuint sampler, GLenum pname, const GLuint *param); GLAPI void APIENTRY glGetSamplerParameteriv (GLuint sampler, GLenum pname, GLint *params); GLAPI void APIENTRY glGetSamplerParameterIiv (GLuint sampler, GLenum pname, GLint *params); GLAPI void APIENTRY glGetSamplerParameterfv (GLuint sampler, GLenum pname, GLfloat *params); GLAPI void APIENTRY glGetSamplerParameterIuiv (GLuint sampler, GLenum pname, GLuint *params); GLAPI void APIENTRY glQueryCounter (GLuint id, GLenum target); GLAPI void APIENTRY glGetQueryObjecti64v (GLuint id, GLenum pname, GLint64 *params); GLAPI void APIENTRY glGetQueryObjectui64v (GLuint id, GLenum pname, GLuint64 *params); GLAPI void APIENTRY glVertexAttribDivisor (GLuint index, GLuint divisor); GLAPI void APIENTRY glVertexAttribP1ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); GLAPI void APIENTRY glVertexAttribP1uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); GLAPI void APIENTRY glVertexAttribP2ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); GLAPI void APIENTRY glVertexAttribP2uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); GLAPI void APIENTRY glVertexAttribP3ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); GLAPI void APIENTRY glVertexAttribP3uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); GLAPI void APIENTRY glVertexAttribP4ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); GLAPI void APIENTRY glVertexAttribP4uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); GLAPI void APIENTRY glVertexP2ui (GLenum type, GLuint value); GLAPI void APIENTRY glVertexP2uiv (GLenum type, const GLuint *value); GLAPI void APIENTRY glVertexP3ui (GLenum type, GLuint value); GLAPI void APIENTRY glVertexP3uiv (GLenum type, const GLuint *value); GLAPI void APIENTRY glVertexP4ui (GLenum type, GLuint value); GLAPI void APIENTRY glVertexP4uiv (GLenum type, const GLuint *value); GLAPI void APIENTRY glTexCoordP1ui (GLenum type, GLuint coords); GLAPI void APIENTRY glTexCoordP1uiv (GLenum type, const GLuint *coords); GLAPI void APIENTRY glTexCoordP2ui (GLenum type, GLuint coords); GLAPI void APIENTRY glTexCoordP2uiv (GLenum type, const GLuint *coords); GLAPI void APIENTRY glTexCoordP3ui (GLenum type, GLuint coords); GLAPI void APIENTRY glTexCoordP3uiv (GLenum type, const GLuint *coords); GLAPI void APIENTRY glTexCoordP4ui (GLenum type, GLuint coords); GLAPI void APIENTRY glTexCoordP4uiv (GLenum type, const GLuint *coords); GLAPI void APIENTRY glMultiTexCoordP1ui (GLenum texture, GLenum type, GLuint coords); GLAPI void APIENTRY glMultiTexCoordP1uiv (GLenum texture, GLenum type, const GLuint *coords); GLAPI void APIENTRY glMultiTexCoordP2ui (GLenum texture, GLenum type, GLuint coords); GLAPI void APIENTRY glMultiTexCoordP2uiv (GLenum texture, GLenum type, const GLuint *coords); GLAPI void APIENTRY glMultiTexCoordP3ui (GLenum texture, GLenum type, GLuint coords); GLAPI void APIENTRY glMultiTexCoordP3uiv (GLenum texture, GLenum type, const GLuint *coords); GLAPI void APIENTRY glMultiTexCoordP4ui (GLenum texture, GLenum type, GLuint coords); GLAPI void APIENTRY glMultiTexCoordP4uiv (GLenum texture, GLenum type, const GLuint *coords); GLAPI void APIENTRY glNormalP3ui (GLenum type, GLuint coords); GLAPI void APIENTRY glNormalP3uiv (GLenum type, const GLuint *coords); GLAPI void APIENTRY glColorP3ui (GLenum type, GLuint color); GLAPI void APIENTRY glColorP3uiv (GLenum type, const GLuint *color); GLAPI void APIENTRY glColorP4ui (GLenum type, GLuint color); GLAPI void APIENTRY glColorP4uiv (GLenum type, const GLuint *color); GLAPI void APIENTRY glSecondaryColorP3ui (GLenum type, GLuint color); GLAPI void APIENTRY glSecondaryColorP3uiv (GLenum type, const GLuint *color); #endif #endif /* GL_VERSION_3_3 */ #ifndef GL_VERSION_4_0 #define GL_VERSION_4_0 1 #define GL_SAMPLE_SHADING 0x8C36 #define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37 #define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E #define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F #define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 #define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A #define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B #define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C #define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D #define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E #define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F #define GL_DRAW_INDIRECT_BUFFER 0x8F3F #define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43 #define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F #define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A #define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B #define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C #define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D #define GL_MAX_VERTEX_STREAMS 0x8E71 #define GL_DOUBLE_VEC2 0x8FFC #define GL_DOUBLE_VEC3 0x8FFD #define GL_DOUBLE_VEC4 0x8FFE #define GL_DOUBLE_MAT2 0x8F46 #define GL_DOUBLE_MAT3 0x8F47 #define GL_DOUBLE_MAT4 0x8F48 #define GL_DOUBLE_MAT2x3 0x8F49 #define GL_DOUBLE_MAT2x4 0x8F4A #define GL_DOUBLE_MAT3x2 0x8F4B #define GL_DOUBLE_MAT3x4 0x8F4C #define GL_DOUBLE_MAT4x2 0x8F4D #define GL_DOUBLE_MAT4x3 0x8F4E #define GL_ACTIVE_SUBROUTINES 0x8DE5 #define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6 #define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47 #define GL_ACTIVE_SUBROUTINE_MAX_LENGTH 0x8E48 #define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49 #define GL_MAX_SUBROUTINES 0x8DE7 #define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8 #define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A #define GL_COMPATIBLE_SUBROUTINES 0x8E4B #define GL_PATCHES 0x000E #define GL_PATCH_VERTICES 0x8E72 #define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73 #define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74 #define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75 #define GL_TESS_GEN_MODE 0x8E76 #define GL_TESS_GEN_SPACING 0x8E77 #define GL_TESS_GEN_VERTEX_ORDER 0x8E78 #define GL_TESS_GEN_POINT_MODE 0x8E79 #define GL_ISOLINES 0x8E7A #define GL_FRACTIONAL_ODD 0x8E7B #define GL_FRACTIONAL_EVEN 0x8E7C #define GL_MAX_PATCH_VERTICES 0x8E7D #define GL_MAX_TESS_GEN_LEVEL 0x8E7E #define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F #define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80 #define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81 #define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82 #define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83 #define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84 #define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85 #define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86 #define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89 #define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A #define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C #define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D #define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E #define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F #define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0 #define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1 #define GL_TESS_EVALUATION_SHADER 0x8E87 #define GL_TESS_CONTROL_SHADER 0x8E88 #define GL_TRANSFORM_FEEDBACK 0x8E22 #define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23 #define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24 #define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25 #define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70 typedef void (APIENTRYP PFNGLMINSAMPLESHADINGPROC) (GLfloat value); typedef void (APIENTRYP PFNGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode); typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); typedef void (APIENTRYP PFNGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst); typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); typedef void (APIENTRYP PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect); typedef void (APIENTRYP PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect); typedef void (APIENTRYP PFNGLUNIFORM1DPROC) (GLint location, GLdouble x); typedef void (APIENTRYP PFNGLUNIFORM2DPROC) (GLint location, GLdouble x, GLdouble y); typedef void (APIENTRYP PFNGLUNIFORM3DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z); typedef void (APIENTRYP PFNGLUNIFORM4DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (APIENTRYP PFNGLUNIFORM1DVPROC) (GLint location, GLsizei count, const GLdouble *value); typedef void (APIENTRYP PFNGLUNIFORM2DVPROC) (GLint location, GLsizei count, const GLdouble *value); typedef void (APIENTRYP PFNGLUNIFORM3DVPROC) (GLint location, GLsizei count, const GLdouble *value); typedef void (APIENTRYP PFNGLUNIFORM4DVPROC) (GLint location, GLsizei count, const GLdouble *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLGETUNIFORMDVPROC) (GLuint program, GLint location, GLdouble *params); typedef GLint (APIENTRYP PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) (GLuint program, GLenum shadertype, const GLchar *name); typedef GLuint (APIENTRYP PFNGLGETSUBROUTINEINDEXPROC) (GLuint program, GLenum shadertype, const GLchar *name); typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values); typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINENAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); typedef void (APIENTRYP PFNGLUNIFORMSUBROUTINESUIVPROC) (GLenum shadertype, GLsizei count, const GLuint *indices); typedef void (APIENTRYP PFNGLGETUNIFORMSUBROUTINEUIVPROC) (GLenum shadertype, GLint location, GLuint *params); typedef void (APIENTRYP PFNGLGETPROGRAMSTAGEIVPROC) (GLuint program, GLenum shadertype, GLenum pname, GLint *values); typedef void (APIENTRYP PFNGLPATCHPARAMETERIPROC) (GLenum pname, GLint value); typedef void (APIENTRYP PFNGLPATCHPARAMETERFVPROC) (GLenum pname, const GLfloat *values); typedef void (APIENTRYP PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id); typedef void (APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint *ids); typedef void (APIENTRYP PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids); typedef GLboolean (APIENTRYP PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id); typedef void (APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKPROC) (void); typedef void (APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKPROC) (void); typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKPROC) (GLenum mode, GLuint id); typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) (GLenum mode, GLuint id, GLuint stream); typedef void (APIENTRYP PFNGLBEGINQUERYINDEXEDPROC) (GLenum target, GLuint index, GLuint id); typedef void (APIENTRYP PFNGLENDQUERYINDEXEDPROC) (GLenum target, GLuint index); typedef void (APIENTRYP PFNGLGETQUERYINDEXEDIVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glMinSampleShading (GLfloat value); GLAPI void APIENTRY glBlendEquationi (GLuint buf, GLenum mode); GLAPI void APIENTRY glBlendEquationSeparatei (GLuint buf, GLenum modeRGB, GLenum modeAlpha); GLAPI void APIENTRY glBlendFunci (GLuint buf, GLenum src, GLenum dst); GLAPI void APIENTRY glBlendFuncSeparatei (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); GLAPI void APIENTRY glDrawArraysIndirect (GLenum mode, const void *indirect); GLAPI void APIENTRY glDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect); GLAPI void APIENTRY glUniform1d (GLint location, GLdouble x); GLAPI void APIENTRY glUniform2d (GLint location, GLdouble x, GLdouble y); GLAPI void APIENTRY glUniform3d (GLint location, GLdouble x, GLdouble y, GLdouble z); GLAPI void APIENTRY glUniform4d (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); GLAPI void APIENTRY glUniform1dv (GLint location, GLsizei count, const GLdouble *value); GLAPI void APIENTRY glUniform2dv (GLint location, GLsizei count, const GLdouble *value); GLAPI void APIENTRY glUniform3dv (GLint location, GLsizei count, const GLdouble *value); GLAPI void APIENTRY glUniform4dv (GLint location, GLsizei count, const GLdouble *value); GLAPI void APIENTRY glUniformMatrix2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glUniformMatrix3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glUniformMatrix4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glUniformMatrix2x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glUniformMatrix2x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glUniformMatrix3x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glUniformMatrix3x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glUniformMatrix4x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glUniformMatrix4x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glGetUniformdv (GLuint program, GLint location, GLdouble *params); GLAPI GLint APIENTRY glGetSubroutineUniformLocation (GLuint program, GLenum shadertype, const GLchar *name); GLAPI GLuint APIENTRY glGetSubroutineIndex (GLuint program, GLenum shadertype, const GLchar *name); GLAPI void APIENTRY glGetActiveSubroutineUniformiv (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values); GLAPI void APIENTRY glGetActiveSubroutineUniformName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); GLAPI void APIENTRY glGetActiveSubroutineName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); GLAPI void APIENTRY glUniformSubroutinesuiv (GLenum shadertype, GLsizei count, const GLuint *indices); GLAPI void APIENTRY glGetUniformSubroutineuiv (GLenum shadertype, GLint location, GLuint *params); GLAPI void APIENTRY glGetProgramStageiv (GLuint program, GLenum shadertype, GLenum pname, GLint *values); GLAPI void APIENTRY glPatchParameteri (GLenum pname, GLint value); GLAPI void APIENTRY glPatchParameterfv (GLenum pname, const GLfloat *values); GLAPI void APIENTRY glBindTransformFeedback (GLenum target, GLuint id); GLAPI void APIENTRY glDeleteTransformFeedbacks (GLsizei n, const GLuint *ids); GLAPI void APIENTRY glGenTransformFeedbacks (GLsizei n, GLuint *ids); GLAPI GLboolean APIENTRY glIsTransformFeedback (GLuint id); GLAPI void APIENTRY glPauseTransformFeedback (void); GLAPI void APIENTRY glResumeTransformFeedback (void); GLAPI void APIENTRY glDrawTransformFeedback (GLenum mode, GLuint id); GLAPI void APIENTRY glDrawTransformFeedbackStream (GLenum mode, GLuint id, GLuint stream); GLAPI void APIENTRY glBeginQueryIndexed (GLenum target, GLuint index, GLuint id); GLAPI void APIENTRY glEndQueryIndexed (GLenum target, GLuint index); GLAPI void APIENTRY glGetQueryIndexediv (GLenum target, GLuint index, GLenum pname, GLint *params); #endif #endif /* GL_VERSION_4_0 */ #ifndef GL_VERSION_4_1 #define GL_VERSION_4_1 1 #define GL_FIXED 0x140C #define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A #define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B #define GL_LOW_FLOAT 0x8DF0 #define GL_MEDIUM_FLOAT 0x8DF1 #define GL_HIGH_FLOAT 0x8DF2 #define GL_LOW_INT 0x8DF3 #define GL_MEDIUM_INT 0x8DF4 #define GL_HIGH_INT 0x8DF5 #define GL_SHADER_COMPILER 0x8DFA #define GL_SHADER_BINARY_FORMATS 0x8DF8 #define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 #define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB #define GL_MAX_VARYING_VECTORS 0x8DFC #define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD #define GL_RGB565 0x8D62 #define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257 #define GL_PROGRAM_BINARY_LENGTH 0x8741 #define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE #define GL_PROGRAM_BINARY_FORMATS 0x87FF #define GL_VERTEX_SHADER_BIT 0x00000001 #define GL_FRAGMENT_SHADER_BIT 0x00000002 #define GL_GEOMETRY_SHADER_BIT 0x00000004 #define GL_TESS_CONTROL_SHADER_BIT 0x00000008 #define GL_TESS_EVALUATION_SHADER_BIT 0x00000010 #define GL_ALL_SHADER_BITS 0xFFFFFFFF #define GL_PROGRAM_SEPARABLE 0x8258 #define GL_ACTIVE_PROGRAM 0x8259 #define GL_PROGRAM_PIPELINE_BINDING 0x825A #define GL_MAX_VIEWPORTS 0x825B #define GL_VIEWPORT_SUBPIXEL_BITS 0x825C #define GL_VIEWPORT_BOUNDS_RANGE 0x825D #define GL_LAYER_PROVOKING_VERTEX 0x825E #define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F #define GL_UNDEFINED_VERTEX 0x8260 typedef void (APIENTRYP PFNGLRELEASESHADERCOMPILERPROC) (void); typedef void (APIENTRYP PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length); typedef void (APIENTRYP PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); typedef void (APIENTRYP PFNGLDEPTHRANGEFPROC) (GLfloat n, GLfloat f); typedef void (APIENTRYP PFNGLCLEARDEPTHFPROC) (GLfloat d); typedef void (APIENTRYP PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); typedef void (APIENTRYP PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value); typedef void (APIENTRYP PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program); typedef void (APIENTRYP PFNGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program); typedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const GLchar *const*strings); typedef void (APIENTRYP PFNGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline); typedef void (APIENTRYP PFNGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint *pipelines); typedef void (APIENTRYP PFNGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint *pipelines); typedef GLboolean (APIENTRYP PFNGLISPROGRAMPIPELINEPROC) (GLuint pipeline); typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint v0); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat v0); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DPROC) (GLuint program, GLint location, GLdouble v0); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint v0); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint v0, GLint v1); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline); typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DPROC) (GLuint index, GLdouble x); typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DPROC) (GLuint index, GLdouble x, GLdouble y); typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DVPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DVPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DVPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DVPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLDVPROC) (GLuint index, GLenum pname, GLdouble *params); typedef void (APIENTRYP PFNGLVIEWPORTARRAYVPROC) (GLuint first, GLsizei count, const GLfloat *v); typedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); typedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFVPROC) (GLuint index, const GLfloat *v); typedef void (APIENTRYP PFNGLSCISSORARRAYVPROC) (GLuint first, GLsizei count, const GLint *v); typedef void (APIENTRYP PFNGLSCISSORINDEXEDPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); typedef void (APIENTRYP PFNGLSCISSORINDEXEDVPROC) (GLuint index, const GLint *v); typedef void (APIENTRYP PFNGLDEPTHRANGEARRAYVPROC) (GLuint first, GLsizei count, const GLdouble *v); typedef void (APIENTRYP PFNGLDEPTHRANGEINDEXEDPROC) (GLuint index, GLdouble n, GLdouble f); typedef void (APIENTRYP PFNGLGETFLOATI_VPROC) (GLenum target, GLuint index, GLfloat *data); typedef void (APIENTRYP PFNGLGETDOUBLEI_VPROC) (GLenum target, GLuint index, GLdouble *data); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glReleaseShaderCompiler (void); GLAPI void APIENTRY glShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length); GLAPI void APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); GLAPI void APIENTRY glDepthRangef (GLfloat n, GLfloat f); GLAPI void APIENTRY glClearDepthf (GLfloat d); GLAPI void APIENTRY glGetProgramBinary (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); GLAPI void APIENTRY glProgramBinary (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); GLAPI void APIENTRY glProgramParameteri (GLuint program, GLenum pname, GLint value); GLAPI void APIENTRY glUseProgramStages (GLuint pipeline, GLbitfield stages, GLuint program); GLAPI void APIENTRY glActiveShaderProgram (GLuint pipeline, GLuint program); GLAPI GLuint APIENTRY glCreateShaderProgramv (GLenum type, GLsizei count, const GLchar *const*strings); GLAPI void APIENTRY glBindProgramPipeline (GLuint pipeline); GLAPI void APIENTRY glDeleteProgramPipelines (GLsizei n, const GLuint *pipelines); GLAPI void APIENTRY glGenProgramPipelines (GLsizei n, GLuint *pipelines); GLAPI GLboolean APIENTRY glIsProgramPipeline (GLuint pipeline); GLAPI void APIENTRY glGetProgramPipelineiv (GLuint pipeline, GLenum pname, GLint *params); GLAPI void APIENTRY glProgramUniform1i (GLuint program, GLint location, GLint v0); GLAPI void APIENTRY glProgramUniform1iv (GLuint program, GLint location, GLsizei count, const GLint *value); GLAPI void APIENTRY glProgramUniform1f (GLuint program, GLint location, GLfloat v0); GLAPI void APIENTRY glProgramUniform1fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); GLAPI void APIENTRY glProgramUniform1d (GLuint program, GLint location, GLdouble v0); GLAPI void APIENTRY glProgramUniform1dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); GLAPI void APIENTRY glProgramUniform1ui (GLuint program, GLint location, GLuint v0); GLAPI void APIENTRY glProgramUniform1uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); GLAPI void APIENTRY glProgramUniform2i (GLuint program, GLint location, GLint v0, GLint v1); GLAPI void APIENTRY glProgramUniform2iv (GLuint program, GLint location, GLsizei count, const GLint *value); GLAPI void APIENTRY glProgramUniform2f (GLuint program, GLint location, GLfloat v0, GLfloat v1); GLAPI void APIENTRY glProgramUniform2fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); GLAPI void APIENTRY glProgramUniform2d (GLuint program, GLint location, GLdouble v0, GLdouble v1); GLAPI void APIENTRY glProgramUniform2dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); GLAPI void APIENTRY glProgramUniform2ui (GLuint program, GLint location, GLuint v0, GLuint v1); GLAPI void APIENTRY glProgramUniform2uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); GLAPI void APIENTRY glProgramUniform3i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); GLAPI void APIENTRY glProgramUniform3iv (GLuint program, GLint location, GLsizei count, const GLint *value); GLAPI void APIENTRY glProgramUniform3f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); GLAPI void APIENTRY glProgramUniform3fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); GLAPI void APIENTRY glProgramUniform3d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); GLAPI void APIENTRY glProgramUniform3dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); GLAPI void APIENTRY glProgramUniform3ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); GLAPI void APIENTRY glProgramUniform3uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); GLAPI void APIENTRY glProgramUniform4i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); GLAPI void APIENTRY glProgramUniform4iv (GLuint program, GLint location, GLsizei count, const GLint *value); GLAPI void APIENTRY glProgramUniform4f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); GLAPI void APIENTRY glProgramUniform4fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); GLAPI void APIENTRY glProgramUniform4d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); GLAPI void APIENTRY glProgramUniform4dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); GLAPI void APIENTRY glProgramUniform4ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); GLAPI void APIENTRY glProgramUniform4uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); GLAPI void APIENTRY glProgramUniformMatrix2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glProgramUniformMatrix3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glProgramUniformMatrix4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glProgramUniformMatrix2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glProgramUniformMatrix3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glProgramUniformMatrix4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glProgramUniformMatrix2x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glProgramUniformMatrix3x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glProgramUniformMatrix2x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glProgramUniformMatrix4x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glProgramUniformMatrix3x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glProgramUniformMatrix4x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glProgramUniformMatrix2x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glProgramUniformMatrix3x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glProgramUniformMatrix2x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glProgramUniformMatrix4x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glProgramUniformMatrix3x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glProgramUniformMatrix4x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glValidateProgramPipeline (GLuint pipeline); GLAPI void APIENTRY glGetProgramPipelineInfoLog (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); GLAPI void APIENTRY glVertexAttribL1d (GLuint index, GLdouble x); GLAPI void APIENTRY glVertexAttribL2d (GLuint index, GLdouble x, GLdouble y); GLAPI void APIENTRY glVertexAttribL3d (GLuint index, GLdouble x, GLdouble y, GLdouble z); GLAPI void APIENTRY glVertexAttribL4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); GLAPI void APIENTRY glVertexAttribL1dv (GLuint index, const GLdouble *v); GLAPI void APIENTRY glVertexAttribL2dv (GLuint index, const GLdouble *v); GLAPI void APIENTRY glVertexAttribL3dv (GLuint index, const GLdouble *v); GLAPI void APIENTRY glVertexAttribL4dv (GLuint index, const GLdouble *v); GLAPI void APIENTRY glVertexAttribLPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); GLAPI void APIENTRY glGetVertexAttribLdv (GLuint index, GLenum pname, GLdouble *params); GLAPI void APIENTRY glViewportArrayv (GLuint first, GLsizei count, const GLfloat *v); GLAPI void APIENTRY glViewportIndexedf (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); GLAPI void APIENTRY glViewportIndexedfv (GLuint index, const GLfloat *v); GLAPI void APIENTRY glScissorArrayv (GLuint first, GLsizei count, const GLint *v); GLAPI void APIENTRY glScissorIndexed (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); GLAPI void APIENTRY glScissorIndexedv (GLuint index, const GLint *v); GLAPI void APIENTRY glDepthRangeArrayv (GLuint first, GLsizei count, const GLdouble *v); GLAPI void APIENTRY glDepthRangeIndexed (GLuint index, GLdouble n, GLdouble f); GLAPI void APIENTRY glGetFloati_v (GLenum target, GLuint index, GLfloat *data); GLAPI void APIENTRY glGetDoublei_v (GLenum target, GLuint index, GLdouble *data); #endif #endif /* GL_VERSION_4_1 */ #ifndef GL_VERSION_4_2 #define GL_VERSION_4_2 1 #define GL_COPY_READ_BUFFER_BINDING 0x8F36 #define GL_COPY_WRITE_BUFFER_BINDING 0x8F37 #define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24 #define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23 #define GL_UNPACK_COMPRESSED_BLOCK_WIDTH 0x9127 #define GL_UNPACK_COMPRESSED_BLOCK_HEIGHT 0x9128 #define GL_UNPACK_COMPRESSED_BLOCK_DEPTH 0x9129 #define GL_UNPACK_COMPRESSED_BLOCK_SIZE 0x912A #define GL_PACK_COMPRESSED_BLOCK_WIDTH 0x912B #define GL_PACK_COMPRESSED_BLOCK_HEIGHT 0x912C #define GL_PACK_COMPRESSED_BLOCK_DEPTH 0x912D #define GL_PACK_COMPRESSED_BLOCK_SIZE 0x912E #define GL_NUM_SAMPLE_COUNTS 0x9380 #define GL_MIN_MAP_BUFFER_ALIGNMENT 0x90BC #define GL_ATOMIC_COUNTER_BUFFER 0x92C0 #define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1 #define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2 #define GL_ATOMIC_COUNTER_BUFFER_SIZE 0x92C3 #define GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE 0x92C4 #define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS 0x92C5 #define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES 0x92C6 #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER 0x92C7 #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER 0x92C8 #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER 0x92C9 #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER 0x92CA #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER 0x92CB #define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC #define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS 0x92CD #define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS 0x92CE #define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS 0x92CF #define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0 #define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1 #define GL_MAX_VERTEX_ATOMIC_COUNTERS 0x92D2 #define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS 0x92D3 #define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS 0x92D4 #define GL_MAX_GEOMETRY_ATOMIC_COUNTERS 0x92D5 #define GL_MAX_FRAGMENT_ATOMIC_COUNTERS 0x92D6 #define GL_MAX_COMBINED_ATOMIC_COUNTERS 0x92D7 #define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8 #define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC #define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9 #define GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX 0x92DA #define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB #define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001 #define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002 #define GL_UNIFORM_BARRIER_BIT 0x00000004 #define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008 #define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020 #define GL_COMMAND_BARRIER_BIT 0x00000040 #define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080 #define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100 #define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200 #define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400 #define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800 #define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000 #define GL_ALL_BARRIER_BITS 0xFFFFFFFF #define GL_MAX_IMAGE_UNITS 0x8F38 #define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS 0x8F39 #define GL_IMAGE_BINDING_NAME 0x8F3A #define GL_IMAGE_BINDING_LEVEL 0x8F3B #define GL_IMAGE_BINDING_LAYERED 0x8F3C #define GL_IMAGE_BINDING_LAYER 0x8F3D #define GL_IMAGE_BINDING_ACCESS 0x8F3E #define GL_IMAGE_1D 0x904C #define GL_IMAGE_2D 0x904D #define GL_IMAGE_3D 0x904E #define GL_IMAGE_2D_RECT 0x904F #define GL_IMAGE_CUBE 0x9050 #define GL_IMAGE_BUFFER 0x9051 #define GL_IMAGE_1D_ARRAY 0x9052 #define GL_IMAGE_2D_ARRAY 0x9053 #define GL_IMAGE_CUBE_MAP_ARRAY 0x9054 #define GL_IMAGE_2D_MULTISAMPLE 0x9055 #define GL_IMAGE_2D_MULTISAMPLE_ARRAY 0x9056 #define GL_INT_IMAGE_1D 0x9057 #define GL_INT_IMAGE_2D 0x9058 #define GL_INT_IMAGE_3D 0x9059 #define GL_INT_IMAGE_2D_RECT 0x905A #define GL_INT_IMAGE_CUBE 0x905B #define GL_INT_IMAGE_BUFFER 0x905C #define GL_INT_IMAGE_1D_ARRAY 0x905D #define GL_INT_IMAGE_2D_ARRAY 0x905E #define GL_INT_IMAGE_CUBE_MAP_ARRAY 0x905F #define GL_INT_IMAGE_2D_MULTISAMPLE 0x9060 #define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x9061 #define GL_UNSIGNED_INT_IMAGE_1D 0x9062 #define GL_UNSIGNED_INT_IMAGE_2D 0x9063 #define GL_UNSIGNED_INT_IMAGE_3D 0x9064 #define GL_UNSIGNED_INT_IMAGE_2D_RECT 0x9065 #define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066 #define GL_UNSIGNED_INT_IMAGE_BUFFER 0x9067 #define GL_UNSIGNED_INT_IMAGE_1D_ARRAY 0x9068 #define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069 #define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A #define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE 0x906B #define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x906C #define GL_MAX_IMAGE_SAMPLES 0x906D #define GL_IMAGE_BINDING_FORMAT 0x906E #define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7 #define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8 #define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9 #define GL_MAX_VERTEX_IMAGE_UNIFORMS 0x90CA #define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS 0x90CB #define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS 0x90CC #define GL_MAX_GEOMETRY_IMAGE_UNIFORMS 0x90CD #define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE #define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF #define GL_COMPRESSED_RGBA_BPTC_UNORM 0x8E8C #define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM 0x8E8D #define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT 0x8E8E #define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT 0x8E8F #define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); typedef void (APIENTRYP PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params); typedef void (APIENTRYP PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) (GLuint program, GLuint bufferIndex, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLBINDIMAGETEXTUREPROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); typedef void (APIENTRYP PFNGLMEMORYBARRIERPROC) (GLbitfield barriers); typedef void (APIENTRYP PFNGLTEXSTORAGE1DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); typedef void (APIENTRYP PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); typedef void (APIENTRYP PFNGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) (GLenum mode, GLuint id, GLsizei instancecount); typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glDrawArraysInstancedBaseInstance (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); GLAPI void APIENTRY glDrawElementsInstancedBaseInstance (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); GLAPI void APIENTRY glDrawElementsInstancedBaseVertexBaseInstance (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); GLAPI void APIENTRY glGetInternalformativ (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params); GLAPI void APIENTRY glGetActiveAtomicCounterBufferiv (GLuint program, GLuint bufferIndex, GLenum pname, GLint *params); GLAPI void APIENTRY glBindImageTexture (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); GLAPI void APIENTRY glMemoryBarrier (GLbitfield barriers); GLAPI void APIENTRY glTexStorage1D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); GLAPI void APIENTRY glTexStorage2D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); GLAPI void APIENTRY glTexStorage3D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); GLAPI void APIENTRY glDrawTransformFeedbackInstanced (GLenum mode, GLuint id, GLsizei instancecount); GLAPI void APIENTRY glDrawTransformFeedbackStreamInstanced (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount); #endif #endif /* GL_VERSION_4_2 */ #ifndef GL_VERSION_4_3 #define GL_VERSION_4_3 1 typedef void (APIENTRY *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); #define GL_NUM_SHADING_LANGUAGE_VERSIONS 0x82E9 #define GL_VERTEX_ATTRIB_ARRAY_LONG 0x874E #define GL_COMPRESSED_RGB8_ETC2 0x9274 #define GL_COMPRESSED_SRGB8_ETC2 0x9275 #define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 #define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277 #define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 #define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279 #define GL_COMPRESSED_R11_EAC 0x9270 #define GL_COMPRESSED_SIGNED_R11_EAC 0x9271 #define GL_COMPRESSED_RG11_EAC 0x9272 #define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273 #define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69 #define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A #define GL_MAX_ELEMENT_INDEX 0x8D6B #define GL_COMPUTE_SHADER 0x91B9 #define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB #define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC #define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD #define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262 #define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263 #define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264 #define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265 #define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266 #define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB #define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE #define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF #define GL_COMPUTE_WORK_GROUP_SIZE 0x8267 #define GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER 0x90EC #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER 0x90ED #define GL_DISPATCH_INDIRECT_BUFFER 0x90EE #define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF #define GL_COMPUTE_SHADER_BIT 0x00000020 #define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242 #define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243 #define GL_DEBUG_CALLBACK_FUNCTION 0x8244 #define GL_DEBUG_CALLBACK_USER_PARAM 0x8245 #define GL_DEBUG_SOURCE_API 0x8246 #define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247 #define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248 #define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249 #define GL_DEBUG_SOURCE_APPLICATION 0x824A #define GL_DEBUG_SOURCE_OTHER 0x824B #define GL_DEBUG_TYPE_ERROR 0x824C #define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D #define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E #define GL_DEBUG_TYPE_PORTABILITY 0x824F #define GL_DEBUG_TYPE_PERFORMANCE 0x8250 #define GL_DEBUG_TYPE_OTHER 0x8251 #define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143 #define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144 #define GL_DEBUG_LOGGED_MESSAGES 0x9145 #define GL_DEBUG_SEVERITY_HIGH 0x9146 #define GL_DEBUG_SEVERITY_MEDIUM 0x9147 #define GL_DEBUG_SEVERITY_LOW 0x9148 #define GL_DEBUG_TYPE_MARKER 0x8268 #define GL_DEBUG_TYPE_PUSH_GROUP 0x8269 #define GL_DEBUG_TYPE_POP_GROUP 0x826A #define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B #define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C #define GL_DEBUG_GROUP_STACK_DEPTH 0x826D #define GL_BUFFER 0x82E0 #define GL_SHADER 0x82E1 #define GL_PROGRAM 0x82E2 #define GL_QUERY 0x82E3 #define GL_PROGRAM_PIPELINE 0x82E4 #define GL_SAMPLER 0x82E6 #define GL_MAX_LABEL_LENGTH 0x82E8 #define GL_DEBUG_OUTPUT 0x92E0 #define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002 #define GL_MAX_UNIFORM_LOCATIONS 0x826E #define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310 #define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311 #define GL_FRAMEBUFFER_DEFAULT_LAYERS 0x9312 #define GL_FRAMEBUFFER_DEFAULT_SAMPLES 0x9313 #define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314 #define GL_MAX_FRAMEBUFFER_WIDTH 0x9315 #define GL_MAX_FRAMEBUFFER_HEIGHT 0x9316 #define GL_MAX_FRAMEBUFFER_LAYERS 0x9317 #define GL_MAX_FRAMEBUFFER_SAMPLES 0x9318 #define GL_INTERNALFORMAT_SUPPORTED 0x826F #define GL_INTERNALFORMAT_PREFERRED 0x8270 #define GL_INTERNALFORMAT_RED_SIZE 0x8271 #define GL_INTERNALFORMAT_GREEN_SIZE 0x8272 #define GL_INTERNALFORMAT_BLUE_SIZE 0x8273 #define GL_INTERNALFORMAT_ALPHA_SIZE 0x8274 #define GL_INTERNALFORMAT_DEPTH_SIZE 0x8275 #define GL_INTERNALFORMAT_STENCIL_SIZE 0x8276 #define GL_INTERNALFORMAT_SHARED_SIZE 0x8277 #define GL_INTERNALFORMAT_RED_TYPE 0x8278 #define GL_INTERNALFORMAT_GREEN_TYPE 0x8279 #define GL_INTERNALFORMAT_BLUE_TYPE 0x827A #define GL_INTERNALFORMAT_ALPHA_TYPE 0x827B #define GL_INTERNALFORMAT_DEPTH_TYPE 0x827C #define GL_INTERNALFORMAT_STENCIL_TYPE 0x827D #define GL_MAX_WIDTH 0x827E #define GL_MAX_HEIGHT 0x827F #define GL_MAX_DEPTH 0x8280 #define GL_MAX_LAYERS 0x8281 #define GL_MAX_COMBINED_DIMENSIONS 0x8282 #define GL_COLOR_COMPONENTS 0x8283 #define GL_DEPTH_COMPONENTS 0x8284 #define GL_STENCIL_COMPONENTS 0x8285 #define GL_COLOR_RENDERABLE 0x8286 #define GL_DEPTH_RENDERABLE 0x8287 #define GL_STENCIL_RENDERABLE 0x8288 #define GL_FRAMEBUFFER_RENDERABLE 0x8289 #define GL_FRAMEBUFFER_RENDERABLE_LAYERED 0x828A #define GL_FRAMEBUFFER_BLEND 0x828B #define GL_READ_PIXELS 0x828C #define GL_READ_PIXELS_FORMAT 0x828D #define GL_READ_PIXELS_TYPE 0x828E #define GL_TEXTURE_IMAGE_FORMAT 0x828F #define GL_TEXTURE_IMAGE_TYPE 0x8290 #define GL_GET_TEXTURE_IMAGE_FORMAT 0x8291 #define GL_GET_TEXTURE_IMAGE_TYPE 0x8292 #define GL_MIPMAP 0x8293 #define GL_MANUAL_GENERATE_MIPMAP 0x8294 #define GL_AUTO_GENERATE_MIPMAP 0x8295 #define GL_COLOR_ENCODING 0x8296 #define GL_SRGB_READ 0x8297 #define GL_SRGB_WRITE 0x8298 #define GL_FILTER 0x829A #define GL_VERTEX_TEXTURE 0x829B #define GL_TESS_CONTROL_TEXTURE 0x829C #define GL_TESS_EVALUATION_TEXTURE 0x829D #define GL_GEOMETRY_TEXTURE 0x829E #define GL_FRAGMENT_TEXTURE 0x829F #define GL_COMPUTE_TEXTURE 0x82A0 #define GL_TEXTURE_SHADOW 0x82A1 #define GL_TEXTURE_GATHER 0x82A2 #define GL_TEXTURE_GATHER_SHADOW 0x82A3 #define GL_SHADER_IMAGE_LOAD 0x82A4 #define GL_SHADER_IMAGE_STORE 0x82A5 #define GL_SHADER_IMAGE_ATOMIC 0x82A6 #define GL_IMAGE_TEXEL_SIZE 0x82A7 #define GL_IMAGE_COMPATIBILITY_CLASS 0x82A8 #define GL_IMAGE_PIXEL_FORMAT 0x82A9 #define GL_IMAGE_PIXEL_TYPE 0x82AA #define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST 0x82AC #define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST 0x82AD #define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE 0x82AE #define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE 0x82AF #define GL_TEXTURE_COMPRESSED_BLOCK_WIDTH 0x82B1 #define GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT 0x82B2 #define GL_TEXTURE_COMPRESSED_BLOCK_SIZE 0x82B3 #define GL_CLEAR_BUFFER 0x82B4 #define GL_TEXTURE_VIEW 0x82B5 #define GL_VIEW_COMPATIBILITY_CLASS 0x82B6 #define GL_FULL_SUPPORT 0x82B7 #define GL_CAVEAT_SUPPORT 0x82B8 #define GL_IMAGE_CLASS_4_X_32 0x82B9 #define GL_IMAGE_CLASS_2_X_32 0x82BA #define GL_IMAGE_CLASS_1_X_32 0x82BB #define GL_IMAGE_CLASS_4_X_16 0x82BC #define GL_IMAGE_CLASS_2_X_16 0x82BD #define GL_IMAGE_CLASS_1_X_16 0x82BE #define GL_IMAGE_CLASS_4_X_8 0x82BF #define GL_IMAGE_CLASS_2_X_8 0x82C0 #define GL_IMAGE_CLASS_1_X_8 0x82C1 #define GL_IMAGE_CLASS_11_11_10 0x82C2 #define GL_IMAGE_CLASS_10_10_10_2 0x82C3 #define GL_VIEW_CLASS_128_BITS 0x82C4 #define GL_VIEW_CLASS_96_BITS 0x82C5 #define GL_VIEW_CLASS_64_BITS 0x82C6 #define GL_VIEW_CLASS_48_BITS 0x82C7 #define GL_VIEW_CLASS_32_BITS 0x82C8 #define GL_VIEW_CLASS_24_BITS 0x82C9 #define GL_VIEW_CLASS_16_BITS 0x82CA #define GL_VIEW_CLASS_8_BITS 0x82CB #define GL_VIEW_CLASS_S3TC_DXT1_RGB 0x82CC #define GL_VIEW_CLASS_S3TC_DXT1_RGBA 0x82CD #define GL_VIEW_CLASS_S3TC_DXT3_RGBA 0x82CE #define GL_VIEW_CLASS_S3TC_DXT5_RGBA 0x82CF #define GL_VIEW_CLASS_RGTC1_RED 0x82D0 #define GL_VIEW_CLASS_RGTC2_RG 0x82D1 #define GL_VIEW_CLASS_BPTC_UNORM 0x82D2 #define GL_VIEW_CLASS_BPTC_FLOAT 0x82D3 #define GL_UNIFORM 0x92E1 #define GL_UNIFORM_BLOCK 0x92E2 #define GL_PROGRAM_INPUT 0x92E3 #define GL_PROGRAM_OUTPUT 0x92E4 #define GL_BUFFER_VARIABLE 0x92E5 #define GL_SHADER_STORAGE_BLOCK 0x92E6 #define GL_VERTEX_SUBROUTINE 0x92E8 #define GL_TESS_CONTROL_SUBROUTINE 0x92E9 #define GL_TESS_EVALUATION_SUBROUTINE 0x92EA #define GL_GEOMETRY_SUBROUTINE 0x92EB #define GL_FRAGMENT_SUBROUTINE 0x92EC #define GL_COMPUTE_SUBROUTINE 0x92ED #define GL_VERTEX_SUBROUTINE_UNIFORM 0x92EE #define GL_TESS_CONTROL_SUBROUTINE_UNIFORM 0x92EF #define GL_TESS_EVALUATION_SUBROUTINE_UNIFORM 0x92F0 #define GL_GEOMETRY_SUBROUTINE_UNIFORM 0x92F1 #define GL_FRAGMENT_SUBROUTINE_UNIFORM 0x92F2 #define GL_COMPUTE_SUBROUTINE_UNIFORM 0x92F3 #define GL_TRANSFORM_FEEDBACK_VARYING 0x92F4 #define GL_ACTIVE_RESOURCES 0x92F5 #define GL_MAX_NAME_LENGTH 0x92F6 #define GL_MAX_NUM_ACTIVE_VARIABLES 0x92F7 #define GL_MAX_NUM_COMPATIBLE_SUBROUTINES 0x92F8 #define GL_NAME_LENGTH 0x92F9 #define GL_TYPE 0x92FA #define GL_ARRAY_SIZE 0x92FB #define GL_OFFSET 0x92FC #define GL_BLOCK_INDEX 0x92FD #define GL_ARRAY_STRIDE 0x92FE #define GL_MATRIX_STRIDE 0x92FF #define GL_IS_ROW_MAJOR 0x9300 #define GL_ATOMIC_COUNTER_BUFFER_INDEX 0x9301 #define GL_BUFFER_BINDING 0x9302 #define GL_BUFFER_DATA_SIZE 0x9303 #define GL_NUM_ACTIVE_VARIABLES 0x9304 #define GL_ACTIVE_VARIABLES 0x9305 #define GL_REFERENCED_BY_VERTEX_SHADER 0x9306 #define GL_REFERENCED_BY_TESS_CONTROL_SHADER 0x9307 #define GL_REFERENCED_BY_TESS_EVALUATION_SHADER 0x9308 #define GL_REFERENCED_BY_GEOMETRY_SHADER 0x9309 #define GL_REFERENCED_BY_FRAGMENT_SHADER 0x930A #define GL_REFERENCED_BY_COMPUTE_SHADER 0x930B #define GL_TOP_LEVEL_ARRAY_SIZE 0x930C #define GL_TOP_LEVEL_ARRAY_STRIDE 0x930D #define GL_LOCATION 0x930E #define GL_LOCATION_INDEX 0x930F #define GL_IS_PER_PATCH 0x92E7 #define GL_SHADER_STORAGE_BUFFER 0x90D2 #define GL_SHADER_STORAGE_BUFFER_BINDING 0x90D3 #define GL_SHADER_STORAGE_BUFFER_START 0x90D4 #define GL_SHADER_STORAGE_BUFFER_SIZE 0x90D5 #define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6 #define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS 0x90D7 #define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS 0x90D8 #define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS 0x90D9 #define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA #define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB #define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC #define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD #define GL_MAX_SHADER_STORAGE_BLOCK_SIZE 0x90DE #define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF #define GL_SHADER_STORAGE_BARRIER_BIT 0x00002000 #define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39 #define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA #define GL_TEXTURE_BUFFER_OFFSET 0x919D #define GL_TEXTURE_BUFFER_SIZE 0x919E #define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT 0x919F #define GL_TEXTURE_VIEW_MIN_LEVEL 0x82DB #define GL_TEXTURE_VIEW_NUM_LEVELS 0x82DC #define GL_TEXTURE_VIEW_MIN_LAYER 0x82DD #define GL_TEXTURE_VIEW_NUM_LAYERS 0x82DE #define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF #define GL_VERTEX_ATTRIB_BINDING 0x82D4 #define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5 #define GL_VERTEX_BINDING_DIVISOR 0x82D6 #define GL_VERTEX_BINDING_OFFSET 0x82D7 #define GL_VERTEX_BINDING_STRIDE 0x82D8 #define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9 #define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA #define GL_VERTEX_BINDING_BUFFER 0x8F4F #define GL_DISPLAY_LIST 0x82E7 typedef void (APIENTRYP PFNGLCLEARBUFFERDATAPROC) (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data); typedef void (APIENTRYP PFNGLCLEARBUFFERSUBDATAPROC) (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEINDIRECTPROC) (GLintptr indirect); typedef void (APIENTRYP PFNGLCOPYIMAGESUBDATAPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); typedef void (APIENTRYP PFNGLFRAMEBUFFERPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); typedef void (APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETINTERNALFORMATI64VPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params); typedef void (APIENTRYP PFNGLINVALIDATETEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); typedef void (APIENTRYP PFNGLINVALIDATETEXIMAGEPROC) (GLuint texture, GLint level); typedef void (APIENTRYP PFNGLINVALIDATEBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); typedef void (APIENTRYP PFNGLINVALIDATEBUFFERDATAPROC) (GLuint buffer); typedef void (APIENTRYP PFNGLINVALIDATEFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments); typedef void (APIENTRYP PFNGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); typedef void (APIENTRYP PFNGLGETPROGRAMINTERFACEIVPROC) (GLuint program, GLenum programInterface, GLenum pname, GLint *params); typedef GLuint (APIENTRYP PFNGLGETPROGRAMRESOURCEINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name); typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCENAMEPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCEIVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params); typedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONPROC) (GLuint program, GLenum programInterface, const GLchar *name); typedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name); typedef void (APIENTRYP PFNGLSHADERSTORAGEBLOCKBINDINGPROC) (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); typedef void (APIENTRYP PFNGLTEXBUFFERRANGEPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); typedef void (APIENTRYP PFNGLTEXSTORAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); typedef void (APIENTRYP PFNGLTEXSTORAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); typedef void (APIENTRYP PFNGLTEXTUREVIEWPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); typedef void (APIENTRYP PFNGLBINDVERTEXBUFFERPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); typedef void (APIENTRYP PFNGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); typedef void (APIENTRYP PFNGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); typedef void (APIENTRYP PFNGLVERTEXATTRIBLFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); typedef void (APIENTRYP PFNGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex); typedef void (APIENTRYP PFNGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor); typedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, const void *userParam); typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); typedef void (APIENTRYP PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message); typedef void (APIENTRYP PFNGLPOPDEBUGGROUPPROC) (void); typedef void (APIENTRYP PFNGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); typedef void (APIENTRYP PFNGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); typedef void (APIENTRYP PFNGLOBJECTPTRLABELPROC) (const void *ptr, GLsizei length, const GLchar *label); typedef void (APIENTRYP PFNGLGETOBJECTPTRLABELPROC) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glClearBufferData (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data); GLAPI void APIENTRY glClearBufferSubData (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); GLAPI void APIENTRY glDispatchCompute (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); GLAPI void APIENTRY glDispatchComputeIndirect (GLintptr indirect); GLAPI void APIENTRY glCopyImageSubData (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); GLAPI void APIENTRY glFramebufferParameteri (GLenum target, GLenum pname, GLint param); GLAPI void APIENTRY glGetFramebufferParameteriv (GLenum target, GLenum pname, GLint *params); GLAPI void APIENTRY glGetInternalformati64v (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params); GLAPI void APIENTRY glInvalidateTexSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); GLAPI void APIENTRY glInvalidateTexImage (GLuint texture, GLint level); GLAPI void APIENTRY glInvalidateBufferSubData (GLuint buffer, GLintptr offset, GLsizeiptr length); GLAPI void APIENTRY glInvalidateBufferData (GLuint buffer); GLAPI void APIENTRY glInvalidateFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments); GLAPI void APIENTRY glInvalidateSubFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); GLAPI void APIENTRY glMultiDrawArraysIndirect (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); GLAPI void APIENTRY glMultiDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); GLAPI void APIENTRY glGetProgramInterfaceiv (GLuint program, GLenum programInterface, GLenum pname, GLint *params); GLAPI GLuint APIENTRY glGetProgramResourceIndex (GLuint program, GLenum programInterface, const GLchar *name); GLAPI void APIENTRY glGetProgramResourceName (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); GLAPI void APIENTRY glGetProgramResourceiv (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params); GLAPI GLint APIENTRY glGetProgramResourceLocation (GLuint program, GLenum programInterface, const GLchar *name); GLAPI GLint APIENTRY glGetProgramResourceLocationIndex (GLuint program, GLenum programInterface, const GLchar *name); GLAPI void APIENTRY glShaderStorageBlockBinding (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); GLAPI void APIENTRY glTexBufferRange (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); GLAPI void APIENTRY glTexStorage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); GLAPI void APIENTRY glTexStorage3DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); GLAPI void APIENTRY glTextureView (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); GLAPI void APIENTRY glBindVertexBuffer (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); GLAPI void APIENTRY glVertexAttribFormat (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); GLAPI void APIENTRY glVertexAttribIFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); GLAPI void APIENTRY glVertexAttribLFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); GLAPI void APIENTRY glVertexAttribBinding (GLuint attribindex, GLuint bindingindex); GLAPI void APIENTRY glVertexBindingDivisor (GLuint bindingindex, GLuint divisor); GLAPI void APIENTRY glDebugMessageControl (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); GLAPI void APIENTRY glDebugMessageInsert (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); GLAPI void APIENTRY glDebugMessageCallback (GLDEBUGPROC callback, const void *userParam); GLAPI GLuint APIENTRY glGetDebugMessageLog (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); GLAPI void APIENTRY glPushDebugGroup (GLenum source, GLuint id, GLsizei length, const GLchar *message); GLAPI void APIENTRY glPopDebugGroup (void); GLAPI void APIENTRY glObjectLabel (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); GLAPI void APIENTRY glGetObjectLabel (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); GLAPI void APIENTRY glObjectPtrLabel (const void *ptr, GLsizei length, const GLchar *label); GLAPI void APIENTRY glGetObjectPtrLabel (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); #endif #endif /* GL_VERSION_4_3 */ #ifndef GL_VERSION_4_4 #define GL_VERSION_4_4 1 #define GL_MAX_VERTEX_ATTRIB_STRIDE 0x82E5 #define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221 #define GL_TEXTURE_BUFFER_BINDING 0x8C2A #define GL_MAP_PERSISTENT_BIT 0x0040 #define GL_MAP_COHERENT_BIT 0x0080 #define GL_DYNAMIC_STORAGE_BIT 0x0100 #define GL_CLIENT_STORAGE_BIT 0x0200 #define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT 0x00004000 #define GL_BUFFER_IMMUTABLE_STORAGE 0x821F #define GL_BUFFER_STORAGE_FLAGS 0x8220 #define GL_CLEAR_TEXTURE 0x9365 #define GL_LOCATION_COMPONENT 0x934A #define GL_TRANSFORM_FEEDBACK_BUFFER_INDEX 0x934B #define GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE 0x934C #define GL_QUERY_BUFFER 0x9192 #define GL_QUERY_BUFFER_BARRIER_BIT 0x00008000 #define GL_QUERY_BUFFER_BINDING 0x9193 #define GL_QUERY_RESULT_NO_WAIT 0x9194 #define GL_MIRROR_CLAMP_TO_EDGE 0x8743 typedef void (APIENTRYP PFNGLBUFFERSTORAGEPROC) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); typedef void (APIENTRYP PFNGLCLEARTEXIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); typedef void (APIENTRYP PFNGLCLEARTEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); typedef void (APIENTRYP PFNGLBINDBUFFERSBASEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint *buffers); typedef void (APIENTRYP PFNGLBINDBUFFERSRANGEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes); typedef void (APIENTRYP PFNGLBINDTEXTURESPROC) (GLuint first, GLsizei count, const GLuint *textures); typedef void (APIENTRYP PFNGLBINDSAMPLERSPROC) (GLuint first, GLsizei count, const GLuint *samplers); typedef void (APIENTRYP PFNGLBINDIMAGETEXTURESPROC) (GLuint first, GLsizei count, const GLuint *textures); typedef void (APIENTRYP PFNGLBINDVERTEXBUFFERSPROC) (GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBufferStorage (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); GLAPI void APIENTRY glClearTexImage (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); GLAPI void APIENTRY glClearTexSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); GLAPI void APIENTRY glBindBuffersBase (GLenum target, GLuint first, GLsizei count, const GLuint *buffers); GLAPI void APIENTRY glBindBuffersRange (GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes); GLAPI void APIENTRY glBindTextures (GLuint first, GLsizei count, const GLuint *textures); GLAPI void APIENTRY glBindSamplers (GLuint first, GLsizei count, const GLuint *samplers); GLAPI void APIENTRY glBindImageTextures (GLuint first, GLsizei count, const GLuint *textures); GLAPI void APIENTRY glBindVertexBuffers (GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); #endif #endif /* GL_VERSION_4_4 */ #ifndef GL_VERSION_4_5 #define GL_VERSION_4_5 1 #define GL_CONTEXT_LOST 0x0507 #define GL_NEGATIVE_ONE_TO_ONE 0x935E #define GL_ZERO_TO_ONE 0x935F #define GL_CLIP_ORIGIN 0x935C #define GL_CLIP_DEPTH_MODE 0x935D #define GL_QUERY_WAIT_INVERTED 0x8E17 #define GL_QUERY_NO_WAIT_INVERTED 0x8E18 #define GL_QUERY_BY_REGION_WAIT_INVERTED 0x8E19 #define GL_QUERY_BY_REGION_NO_WAIT_INVERTED 0x8E1A #define GL_MAX_CULL_DISTANCES 0x82F9 #define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES 0x82FA #define GL_TEXTURE_TARGET 0x1006 #define GL_QUERY_TARGET 0x82EA #define GL_TEXTURE_BINDING 0x82EB #define GL_GUILTY_CONTEXT_RESET 0x8253 #define GL_INNOCENT_CONTEXT_RESET 0x8254 #define GL_UNKNOWN_CONTEXT_RESET 0x8255 #define GL_RESET_NOTIFICATION_STRATEGY 0x8256 #define GL_LOSE_CONTEXT_ON_RESET 0x8252 #define GL_NO_RESET_NOTIFICATION 0x8261 #define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT 0x00000004 #define GL_CONTEXT_RELEASE_BEHAVIOR 0x82FB #define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH 0x82FC typedef void (APIENTRYP PFNGLCLIPCONTROLPROC) (GLenum origin, GLenum depth); typedef void (APIENTRYP PFNGLCREATETRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids); typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC) (GLuint xfb, GLuint index, GLuint buffer); typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC) (GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizei size); typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKIVPROC) (GLuint xfb, GLenum pname, GLint *param); typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKI_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint *param); typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKI64_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint64 *param); typedef void (APIENTRYP PFNGLCREATEBUFFERSPROC) (GLsizei n, GLuint *buffers); typedef void (APIENTRYP PFNGLNAMEDBUFFERSTORAGEPROC) (GLuint buffer, GLsizei size, const void *data, GLbitfield flags); typedef void (APIENTRYP PFNGLNAMEDBUFFERDATAPROC) (GLuint buffer, GLsizei size, const void *data, GLenum usage); typedef void (APIENTRYP PFNGLNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizei size, const void *data); typedef void (APIENTRYP PFNGLCOPYNAMEDBUFFERSUBDATAPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizei size); typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERDATAPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizei size, GLenum format, GLenum type, const void *data); typedef void *(APIENTRYP PFNGLMAPNAMEDBUFFERPROC) (GLuint buffer, GLenum access); typedef void *(APIENTRYP PFNGLMAPNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizei length, GLbitfield access); typedef GLboolean (APIENTRYP PFNGLUNMAPNAMEDBUFFERPROC) (GLuint buffer); typedef void (APIENTRYP PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizei length); typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERIVPROC) (GLuint buffer, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERI64VPROC) (GLuint buffer, GLenum pname, GLint64 *params); typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPOINTERVPROC) (GLuint buffer, GLenum pname, void **params); typedef void (APIENTRYP PFNGLGETNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizei size, void *data); typedef void (APIENTRYP PFNGLCREATEFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers); typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC) (GLuint framebuffer, GLenum pname, GLint param); typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC) (GLuint framebuffer, GLenum buf); typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC) (GLuint framebuffer, GLsizei n, const GLenum *bufs); typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC) (GLuint framebuffer, GLenum src); typedef void (APIENTRYP PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments); typedef void (APIENTRYP PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint *value); typedef void (APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint *value); typedef void (APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERFVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat *value); typedef void (APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERFIPROC) (GLuint framebuffer, GLenum buffer, const GLfloat depth, GLint stencil); typedef void (APIENTRYP PFNGLBLITNAMEDFRAMEBUFFERPROC) (GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); typedef GLenum (APIENTRYP PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC) (GLuint framebuffer, GLenum target); typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC) (GLuint framebuffer, GLenum pname, GLint *param); typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLCREATERENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers); typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); typedef void (APIENTRYP PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC) (GLuint renderbuffer, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLCREATETEXTURESPROC) (GLenum target, GLsizei n, GLuint *textures); typedef void (APIENTRYP PFNGLTEXTUREBUFFERPROC) (GLuint texture, GLenum internalformat, GLuint buffer); typedef void (APIENTRYP PFNGLTEXTUREBUFFERRANGEPROC) (GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizei size); typedef void (APIENTRYP PFNGLTEXTURESTORAGE1DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width); typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFPROC) (GLuint texture, GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, const GLfloat *param); typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIPROC) (GLuint texture, GLenum pname, GLint param); typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, const GLuint *params); typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, const GLint *param); typedef void (APIENTRYP PFNGLGENERATETEXTUREMIPMAPPROC) (GLuint texture); typedef void (APIENTRYP PFNGLBINDTEXTUREUNITPROC) (GLuint unit, GLuint texture); typedef void (APIENTRYP PFNGLGETTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLsizei bufSize, void *pixels); typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERFVPROC) (GLuint texture, GLint level, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERIVPROC) (GLuint texture, GLint level, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, GLuint *params); typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLCREATEVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays); typedef void (APIENTRYP PFNGLDISABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index); typedef void (APIENTRYP PFNGLENABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index); typedef void (APIENTRYP PFNGLVERTEXARRAYELEMENTBUFFERPROC) (GLuint vaobj, GLuint buffer); typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXBUFFERPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXBUFFERSPROC) (GLuint vaobj, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); typedef void (APIENTRYP PFNGLVERTEXARRAYATTRIBBINDINGPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); typedef void (APIENTRYP PFNGLVERTEXARRAYATTRIBFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); typedef void (APIENTRYP PFNGLVERTEXARRAYATTRIBIFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); typedef void (APIENTRYP PFNGLVERTEXARRAYATTRIBLFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); typedef void (APIENTRYP PFNGLVERTEXARRAYBINDINGDIVISORPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor); typedef void (APIENTRYP PFNGLGETVERTEXARRAYIVPROC) (GLuint vaobj, GLenum pname, GLint *param); typedef void (APIENTRYP PFNGLGETVERTEXARRAYINDEXEDIVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint *param); typedef void (APIENTRYP PFNGLGETVERTEXARRAYINDEXED64IVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint64 *param); typedef void (APIENTRYP PFNGLCREATESAMPLERSPROC) (GLsizei n, GLuint *samplers); typedef void (APIENTRYP PFNGLCREATEPROGRAMPIPELINESPROC) (GLsizei n, GLuint *pipelines); typedef void (APIENTRYP PFNGLCREATEQUERIESPROC) (GLenum target, GLsizei n, GLuint *ids); typedef void (APIENTRYP PFNGLGETQUERYBUFFEROBJECTI64VPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); typedef void (APIENTRYP PFNGLGETQUERYBUFFEROBJECTIVPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); typedef void (APIENTRYP PFNGLGETQUERYBUFFEROBJECTUI64VPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); typedef void (APIENTRYP PFNGLGETQUERYBUFFEROBJECTUIVPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); typedef void (APIENTRYP PFNGLMEMORYBARRIERBYREGIONPROC) (GLbitfield barriers); typedef void (APIENTRYP PFNGLGETTEXTURESUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void *pixels); typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels); typedef GLenum (APIENTRYP PFNGLGETGRAPHICSRESETSTATUSPROC) (void); typedef void (APIENTRYP PFNGLGETNCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, GLsizei bufSize, void *pixels); typedef void (APIENTRYP PFNGLGETNTEXIMAGEPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); typedef void (APIENTRYP PFNGLGETNUNIFORMDVPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); typedef void (APIENTRYP PFNGLGETNUNIFORMFVPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); typedef void (APIENTRYP PFNGLGETNUNIFORMIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); typedef void (APIENTRYP PFNGLGETNUNIFORMUIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params); typedef void (APIENTRYP PFNGLREADNPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); typedef void (APIENTRYP PFNGLGETNMAPDVPROC) (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); typedef void (APIENTRYP PFNGLGETNMAPFVPROC) (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); typedef void (APIENTRYP PFNGLGETNMAPIVPROC) (GLenum target, GLenum query, GLsizei bufSize, GLint *v); typedef void (APIENTRYP PFNGLGETNPIXELMAPFVPROC) (GLenum map, GLsizei bufSize, GLfloat *values); typedef void (APIENTRYP PFNGLGETNPIXELMAPUIVPROC) (GLenum map, GLsizei bufSize, GLuint *values); typedef void (APIENTRYP PFNGLGETNPIXELMAPUSVPROC) (GLenum map, GLsizei bufSize, GLushort *values); typedef void (APIENTRYP PFNGLGETNPOLYGONSTIPPLEPROC) (GLsizei bufSize, GLubyte *pattern); typedef void (APIENTRYP PFNGLGETNCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table); typedef void (APIENTRYP PFNGLGETNCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image); typedef void (APIENTRYP PFNGLGETNSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span); typedef void (APIENTRYP PFNGLGETNHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); typedef void (APIENTRYP PFNGLGETNMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); typedef void (APIENTRYP PFNGLTEXTUREBARRIERPROC) (void); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glClipControl (GLenum origin, GLenum depth); GLAPI void APIENTRY glCreateTransformFeedbacks (GLsizei n, GLuint *ids); GLAPI void APIENTRY glTransformFeedbackBufferBase (GLuint xfb, GLuint index, GLuint buffer); GLAPI void APIENTRY glTransformFeedbackBufferRange (GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizei size); GLAPI void APIENTRY glGetTransformFeedbackiv (GLuint xfb, GLenum pname, GLint *param); GLAPI void APIENTRY glGetTransformFeedbacki_v (GLuint xfb, GLenum pname, GLuint index, GLint *param); GLAPI void APIENTRY glGetTransformFeedbacki64_v (GLuint xfb, GLenum pname, GLuint index, GLint64 *param); GLAPI void APIENTRY glCreateBuffers (GLsizei n, GLuint *buffers); GLAPI void APIENTRY glNamedBufferStorage (GLuint buffer, GLsizei size, const void *data, GLbitfield flags); GLAPI void APIENTRY glNamedBufferData (GLuint buffer, GLsizei size, const void *data, GLenum usage); GLAPI void APIENTRY glNamedBufferSubData (GLuint buffer, GLintptr offset, GLsizei size, const void *data); GLAPI void APIENTRY glCopyNamedBufferSubData (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizei size); GLAPI void APIENTRY glClearNamedBufferData (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); GLAPI void APIENTRY glClearNamedBufferSubData (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizei size, GLenum format, GLenum type, const void *data); GLAPI void *APIENTRY glMapNamedBuffer (GLuint buffer, GLenum access); GLAPI void *APIENTRY glMapNamedBufferRange (GLuint buffer, GLintptr offset, GLsizei length, GLbitfield access); GLAPI GLboolean APIENTRY glUnmapNamedBuffer (GLuint buffer); GLAPI void APIENTRY glFlushMappedNamedBufferRange (GLuint buffer, GLintptr offset, GLsizei length); GLAPI void APIENTRY glGetNamedBufferParameteriv (GLuint buffer, GLenum pname, GLint *params); GLAPI void APIENTRY glGetNamedBufferParameteri64v (GLuint buffer, GLenum pname, GLint64 *params); GLAPI void APIENTRY glGetNamedBufferPointerv (GLuint buffer, GLenum pname, void **params); GLAPI void APIENTRY glGetNamedBufferSubData (GLuint buffer, GLintptr offset, GLsizei size, void *data); GLAPI void APIENTRY glCreateFramebuffers (GLsizei n, GLuint *framebuffers); GLAPI void APIENTRY glNamedFramebufferRenderbuffer (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); GLAPI void APIENTRY glNamedFramebufferParameteri (GLuint framebuffer, GLenum pname, GLint param); GLAPI void APIENTRY glNamedFramebufferTexture (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); GLAPI void APIENTRY glNamedFramebufferTextureLayer (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); GLAPI void APIENTRY glNamedFramebufferDrawBuffer (GLuint framebuffer, GLenum buf); GLAPI void APIENTRY glNamedFramebufferDrawBuffers (GLuint framebuffer, GLsizei n, const GLenum *bufs); GLAPI void APIENTRY glNamedFramebufferReadBuffer (GLuint framebuffer, GLenum src); GLAPI void APIENTRY glInvalidateNamedFramebufferData (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments); GLAPI void APIENTRY glInvalidateNamedFramebufferSubData (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); GLAPI void APIENTRY glClearNamedFramebufferiv (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint *value); GLAPI void APIENTRY glClearNamedFramebufferuiv (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint *value); GLAPI void APIENTRY glClearNamedFramebufferfv (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat *value); GLAPI void APIENTRY glClearNamedFramebufferfi (GLuint framebuffer, GLenum buffer, const GLfloat depth, GLint stencil); GLAPI void APIENTRY glBlitNamedFramebuffer (GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); GLAPI GLenum APIENTRY glCheckNamedFramebufferStatus (GLuint framebuffer, GLenum target); GLAPI void APIENTRY glGetNamedFramebufferParameteriv (GLuint framebuffer, GLenum pname, GLint *param); GLAPI void APIENTRY glGetNamedFramebufferAttachmentParameteriv (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); GLAPI void APIENTRY glCreateRenderbuffers (GLsizei n, GLuint *renderbuffers); GLAPI void APIENTRY glNamedRenderbufferStorage (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); GLAPI void APIENTRY glNamedRenderbufferStorageMultisample (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); GLAPI void APIENTRY glGetNamedRenderbufferParameteriv (GLuint renderbuffer, GLenum pname, GLint *params); GLAPI void APIENTRY glCreateTextures (GLenum target, GLsizei n, GLuint *textures); GLAPI void APIENTRY glTextureBuffer (GLuint texture, GLenum internalformat, GLuint buffer); GLAPI void APIENTRY glTextureBufferRange (GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizei size); GLAPI void APIENTRY glTextureStorage1D (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width); GLAPI void APIENTRY glTextureStorage2D (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); GLAPI void APIENTRY glTextureStorage3D (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); GLAPI void APIENTRY glTextureStorage2DMultisample (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); GLAPI void APIENTRY glTextureStorage3DMultisample (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); GLAPI void APIENTRY glTextureSubImage1D (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); GLAPI void APIENTRY glTextureSubImage2D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); GLAPI void APIENTRY glTextureSubImage3D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); GLAPI void APIENTRY glCompressedTextureSubImage1D (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); GLAPI void APIENTRY glCompressedTextureSubImage2D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); GLAPI void APIENTRY glCompressedTextureSubImage3D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); GLAPI void APIENTRY glCopyTextureSubImage1D (GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); GLAPI void APIENTRY glCopyTextureSubImage2D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); GLAPI void APIENTRY glCopyTextureSubImage3D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); GLAPI void APIENTRY glTextureParameterf (GLuint texture, GLenum pname, GLfloat param); GLAPI void APIENTRY glTextureParameterfv (GLuint texture, GLenum pname, const GLfloat *param); GLAPI void APIENTRY glTextureParameteri (GLuint texture, GLenum pname, GLint param); GLAPI void APIENTRY glTextureParameterIiv (GLuint texture, GLenum pname, const GLint *params); GLAPI void APIENTRY glTextureParameterIuiv (GLuint texture, GLenum pname, const GLuint *params); GLAPI void APIENTRY glTextureParameteriv (GLuint texture, GLenum pname, const GLint *param); GLAPI void APIENTRY glGenerateTextureMipmap (GLuint texture); GLAPI void APIENTRY glBindTextureUnit (GLuint unit, GLuint texture); GLAPI void APIENTRY glGetTextureImage (GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); GLAPI void APIENTRY glGetCompressedTextureImage (GLuint texture, GLint level, GLsizei bufSize, void *pixels); GLAPI void APIENTRY glGetTextureLevelParameterfv (GLuint texture, GLint level, GLenum pname, GLfloat *params); GLAPI void APIENTRY glGetTextureLevelParameteriv (GLuint texture, GLint level, GLenum pname, GLint *params); GLAPI void APIENTRY glGetTextureParameterfv (GLuint texture, GLenum pname, GLfloat *params); GLAPI void APIENTRY glGetTextureParameterIiv (GLuint texture, GLenum pname, GLint *params); GLAPI void APIENTRY glGetTextureParameterIuiv (GLuint texture, GLenum pname, GLuint *params); GLAPI void APIENTRY glGetTextureParameteriv (GLuint texture, GLenum pname, GLint *params); GLAPI void APIENTRY glCreateVertexArrays (GLsizei n, GLuint *arrays); GLAPI void APIENTRY glDisableVertexArrayAttrib (GLuint vaobj, GLuint index); GLAPI void APIENTRY glEnableVertexArrayAttrib (GLuint vaobj, GLuint index); GLAPI void APIENTRY glVertexArrayElementBuffer (GLuint vaobj, GLuint buffer); GLAPI void APIENTRY glVertexArrayVertexBuffer (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); GLAPI void APIENTRY glVertexArrayVertexBuffers (GLuint vaobj, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); GLAPI void APIENTRY glVertexArrayAttribBinding (GLuint vaobj, GLuint attribindex, GLuint bindingindex); GLAPI void APIENTRY glVertexArrayAttribFormat (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); GLAPI void APIENTRY glVertexArrayAttribIFormat (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); GLAPI void APIENTRY glVertexArrayAttribLFormat (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); GLAPI void APIENTRY glVertexArrayBindingDivisor (GLuint vaobj, GLuint bindingindex, GLuint divisor); GLAPI void APIENTRY glGetVertexArrayiv (GLuint vaobj, GLenum pname, GLint *param); GLAPI void APIENTRY glGetVertexArrayIndexediv (GLuint vaobj, GLuint index, GLenum pname, GLint *param); GLAPI void APIENTRY glGetVertexArrayIndexed64iv (GLuint vaobj, GLuint index, GLenum pname, GLint64 *param); GLAPI void APIENTRY glCreateSamplers (GLsizei n, GLuint *samplers); GLAPI void APIENTRY glCreateProgramPipelines (GLsizei n, GLuint *pipelines); GLAPI void APIENTRY glCreateQueries (GLenum target, GLsizei n, GLuint *ids); GLAPI void APIENTRY glGetQueryBufferObjecti64v (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); GLAPI void APIENTRY glGetQueryBufferObjectiv (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); GLAPI void APIENTRY glGetQueryBufferObjectui64v (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); GLAPI void APIENTRY glGetQueryBufferObjectuiv (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); GLAPI void APIENTRY glMemoryBarrierByRegion (GLbitfield barriers); GLAPI void APIENTRY glGetTextureSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void *pixels); GLAPI void APIENTRY glGetCompressedTextureSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels); GLAPI GLenum APIENTRY glGetGraphicsResetStatus (void); GLAPI void APIENTRY glGetnCompressedTexImage (GLenum target, GLint lod, GLsizei bufSize, void *pixels); GLAPI void APIENTRY glGetnTexImage (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); GLAPI void APIENTRY glGetnUniformdv (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); GLAPI void APIENTRY glGetnUniformfv (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); GLAPI void APIENTRY glGetnUniformiv (GLuint program, GLint location, GLsizei bufSize, GLint *params); GLAPI void APIENTRY glGetnUniformuiv (GLuint program, GLint location, GLsizei bufSize, GLuint *params); GLAPI void APIENTRY glReadnPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); GLAPI void APIENTRY glGetnMapdv (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); GLAPI void APIENTRY glGetnMapfv (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); GLAPI void APIENTRY glGetnMapiv (GLenum target, GLenum query, GLsizei bufSize, GLint *v); GLAPI void APIENTRY glGetnPixelMapfv (GLenum map, GLsizei bufSize, GLfloat *values); GLAPI void APIENTRY glGetnPixelMapuiv (GLenum map, GLsizei bufSize, GLuint *values); GLAPI void APIENTRY glGetnPixelMapusv (GLenum map, GLsizei bufSize, GLushort *values); GLAPI void APIENTRY glGetnPolygonStipple (GLsizei bufSize, GLubyte *pattern); GLAPI void APIENTRY glGetnColorTable (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table); GLAPI void APIENTRY glGetnConvolutionFilter (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image); GLAPI void APIENTRY glGetnSeparableFilter (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span); GLAPI void APIENTRY glGetnHistogram (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); GLAPI void APIENTRY glGetnMinmax (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); GLAPI void APIENTRY glTextureBarrier (void); #endif #endif /* GL_VERSION_4_5 */ #ifndef GL_ARB_ES2_compatibility #define GL_ARB_ES2_compatibility 1 #endif /* GL_ARB_ES2_compatibility */ #ifndef GL_ARB_ES3_1_compatibility #define GL_ARB_ES3_1_compatibility 1 #endif /* GL_ARB_ES3_1_compatibility */ #ifndef GL_ARB_ES3_compatibility #define GL_ARB_ES3_compatibility 1 #endif /* GL_ARB_ES3_compatibility */ #ifndef GL_ARB_arrays_of_arrays #define GL_ARB_arrays_of_arrays 1 #endif /* GL_ARB_arrays_of_arrays */ #ifndef GL_ARB_base_instance #define GL_ARB_base_instance 1 #endif /* GL_ARB_base_instance */ #ifndef GL_ARB_bindless_texture #define GL_ARB_bindless_texture 1 typedef uint64_t GLuint64EXT; #define GL_UNSIGNED_INT64_ARB 0x140F typedef GLuint64 (APIENTRYP PFNGLGETTEXTUREHANDLEARBPROC) (GLuint texture); typedef GLuint64 (APIENTRYP PFNGLGETTEXTURESAMPLERHANDLEARBPROC) (GLuint texture, GLuint sampler); typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC) (GLuint64 handle); typedef GLuint64 (APIENTRYP PFNGLGETIMAGEHANDLEARBPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle, GLenum access); typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC) (GLuint64 handle); typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64ARBPROC) (GLint location, GLuint64 value); typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64VARBPROC) (GLint location, GLsizei count, const GLuint64 *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC) (GLuint program, GLint location, GLuint64 value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *values); typedef GLboolean (APIENTRYP PFNGLISTEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); typedef GLboolean (APIENTRYP PFNGLISIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle); typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64ARBPROC) (GLuint index, GLuint64EXT x); typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64VARBPROC) (GLuint index, const GLuint64EXT *v); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLUI64VARBPROC) (GLuint index, GLenum pname, GLuint64EXT *params); #ifdef GL_GLEXT_PROTOTYPES GLAPI GLuint64 APIENTRY glGetTextureHandleARB (GLuint texture); GLAPI GLuint64 APIENTRY glGetTextureSamplerHandleARB (GLuint texture, GLuint sampler); GLAPI void APIENTRY glMakeTextureHandleResidentARB (GLuint64 handle); GLAPI void APIENTRY glMakeTextureHandleNonResidentARB (GLuint64 handle); GLAPI GLuint64 APIENTRY glGetImageHandleARB (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); GLAPI void APIENTRY glMakeImageHandleResidentARB (GLuint64 handle, GLenum access); GLAPI void APIENTRY glMakeImageHandleNonResidentARB (GLuint64 handle); GLAPI void APIENTRY glUniformHandleui64ARB (GLint location, GLuint64 value); GLAPI void APIENTRY glUniformHandleui64vARB (GLint location, GLsizei count, const GLuint64 *value); GLAPI void APIENTRY glProgramUniformHandleui64ARB (GLuint program, GLint location, GLuint64 value); GLAPI void APIENTRY glProgramUniformHandleui64vARB (GLuint program, GLint location, GLsizei count, const GLuint64 *values); GLAPI GLboolean APIENTRY glIsTextureHandleResidentARB (GLuint64 handle); GLAPI GLboolean APIENTRY glIsImageHandleResidentARB (GLuint64 handle); GLAPI void APIENTRY glVertexAttribL1ui64ARB (GLuint index, GLuint64EXT x); GLAPI void APIENTRY glVertexAttribL1ui64vARB (GLuint index, const GLuint64EXT *v); GLAPI void APIENTRY glGetVertexAttribLui64vARB (GLuint index, GLenum pname, GLuint64EXT *params); #endif #endif /* GL_ARB_bindless_texture */ #ifndef GL_ARB_blend_func_extended #define GL_ARB_blend_func_extended 1 #endif /* GL_ARB_blend_func_extended */ #ifndef GL_ARB_buffer_storage #define GL_ARB_buffer_storage 1 #endif /* GL_ARB_buffer_storage */ #ifndef GL_ARB_cl_event #define GL_ARB_cl_event 1 struct _cl_context; struct _cl_event; #define GL_SYNC_CL_EVENT_ARB 0x8240 #define GL_SYNC_CL_EVENT_COMPLETE_ARB 0x8241 typedef GLsync (APIENTRYP PFNGLCREATESYNCFROMCLEVENTARBPROC) (struct _cl_context *context, struct _cl_event *event, GLbitfield flags); #ifdef GL_GLEXT_PROTOTYPES GLAPI GLsync APIENTRY glCreateSyncFromCLeventARB (struct _cl_context *context, struct _cl_event *event, GLbitfield flags); #endif #endif /* GL_ARB_cl_event */ #ifndef GL_ARB_clear_buffer_object #define GL_ARB_clear_buffer_object 1 #endif /* GL_ARB_clear_buffer_object */ #ifndef GL_ARB_clear_texture #define GL_ARB_clear_texture 1 #endif /* GL_ARB_clear_texture */ #ifndef GL_ARB_clip_control #define GL_ARB_clip_control 1 #endif /* GL_ARB_clip_control */ #ifndef GL_ARB_color_buffer_float #define GL_ARB_color_buffer_float 1 #define GL_RGBA_FLOAT_MODE_ARB 0x8820 #define GL_CLAMP_VERTEX_COLOR_ARB 0x891A #define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B #define GL_CLAMP_READ_COLOR_ARB 0x891C #define GL_FIXED_ONLY_ARB 0x891D typedef void (APIENTRYP PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glClampColorARB (GLenum target, GLenum clamp); #endif #endif /* GL_ARB_color_buffer_float */ #ifndef GL_ARB_compatibility #define GL_ARB_compatibility 1 #endif /* GL_ARB_compatibility */ #ifndef GL_ARB_compressed_texture_pixel_storage #define GL_ARB_compressed_texture_pixel_storage 1 #endif /* GL_ARB_compressed_texture_pixel_storage */ #ifndef GL_ARB_compute_shader #define GL_ARB_compute_shader 1 #endif /* GL_ARB_compute_shader */ #ifndef GL_ARB_compute_variable_group_size #define GL_ARB_compute_variable_group_size 1 #define GL_MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB 0x9344 #define GL_MAX_COMPUTE_FIXED_GROUP_INVOCATIONS_ARB 0x90EB #define GL_MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB 0x9345 #define GL_MAX_COMPUTE_FIXED_GROUP_SIZE_ARB 0x91BF typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glDispatchComputeGroupSizeARB (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z); #endif #endif /* GL_ARB_compute_variable_group_size */ #ifndef GL_ARB_conditional_render_inverted #define GL_ARB_conditional_render_inverted 1 #endif /* GL_ARB_conditional_render_inverted */ #ifndef GL_ARB_conservative_depth #define GL_ARB_conservative_depth 1 #endif /* GL_ARB_conservative_depth */ #ifndef GL_ARB_copy_buffer #define GL_ARB_copy_buffer 1 #endif /* GL_ARB_copy_buffer */ #ifndef GL_ARB_copy_image #define GL_ARB_copy_image 1 #endif /* GL_ARB_copy_image */ #ifndef GL_ARB_cull_distance #define GL_ARB_cull_distance 1 #endif /* GL_ARB_cull_distance */ #ifndef GL_ARB_debug_output #define GL_ARB_debug_output 1 typedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); #define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB 0x8242 #define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB 0x8243 #define GL_DEBUG_CALLBACK_FUNCTION_ARB 0x8244 #define GL_DEBUG_CALLBACK_USER_PARAM_ARB 0x8245 #define GL_DEBUG_SOURCE_API_ARB 0x8246 #define GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB 0x8247 #define GL_DEBUG_SOURCE_SHADER_COMPILER_ARB 0x8248 #define GL_DEBUG_SOURCE_THIRD_PARTY_ARB 0x8249 #define GL_DEBUG_SOURCE_APPLICATION_ARB 0x824A #define GL_DEBUG_SOURCE_OTHER_ARB 0x824B #define GL_DEBUG_TYPE_ERROR_ARB 0x824C #define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB 0x824D #define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB 0x824E #define GL_DEBUG_TYPE_PORTABILITY_ARB 0x824F #define GL_DEBUG_TYPE_PERFORMANCE_ARB 0x8250 #define GL_DEBUG_TYPE_OTHER_ARB 0x8251 #define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB 0x9143 #define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB 0x9144 #define GL_DEBUG_LOGGED_MESSAGES_ARB 0x9145 #define GL_DEBUG_SEVERITY_HIGH_ARB 0x9146 #define GL_DEBUG_SEVERITY_MEDIUM_ARB 0x9147 #define GL_DEBUG_SEVERITY_LOW_ARB 0x9148 typedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTARBPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKARBPROC) (GLDEBUGPROCARB callback, const void *userParam); typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGARBPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glDebugMessageControlARB (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); GLAPI void APIENTRY glDebugMessageInsertARB (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); GLAPI void APIENTRY glDebugMessageCallbackARB (GLDEBUGPROCARB callback, const void *userParam); GLAPI GLuint APIENTRY glGetDebugMessageLogARB (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); #endif #endif /* GL_ARB_debug_output */ #ifndef GL_ARB_depth_buffer_float #define GL_ARB_depth_buffer_float 1 #endif /* GL_ARB_depth_buffer_float */ #ifndef GL_ARB_depth_clamp #define GL_ARB_depth_clamp 1 #endif /* GL_ARB_depth_clamp */ #ifndef GL_ARB_depth_texture #define GL_ARB_depth_texture 1 #define GL_DEPTH_COMPONENT16_ARB 0x81A5 #define GL_DEPTH_COMPONENT24_ARB 0x81A6 #define GL_DEPTH_COMPONENT32_ARB 0x81A7 #define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A #define GL_DEPTH_TEXTURE_MODE_ARB 0x884B #endif /* GL_ARB_depth_texture */ #ifndef GL_ARB_derivative_control #define GL_ARB_derivative_control 1 #endif /* GL_ARB_derivative_control */ #ifndef GL_ARB_direct_state_access #define GL_ARB_direct_state_access 1 #endif /* GL_ARB_direct_state_access */ #ifndef GL_ARB_draw_buffers #define GL_ARB_draw_buffers 1 #define GL_MAX_DRAW_BUFFERS_ARB 0x8824 #define GL_DRAW_BUFFER0_ARB 0x8825 #define GL_DRAW_BUFFER1_ARB 0x8826 #define GL_DRAW_BUFFER2_ARB 0x8827 #define GL_DRAW_BUFFER3_ARB 0x8828 #define GL_DRAW_BUFFER4_ARB 0x8829 #define GL_DRAW_BUFFER5_ARB 0x882A #define GL_DRAW_BUFFER6_ARB 0x882B #define GL_DRAW_BUFFER7_ARB 0x882C #define GL_DRAW_BUFFER8_ARB 0x882D #define GL_DRAW_BUFFER9_ARB 0x882E #define GL_DRAW_BUFFER10_ARB 0x882F #define GL_DRAW_BUFFER11_ARB 0x8830 #define GL_DRAW_BUFFER12_ARB 0x8831 #define GL_DRAW_BUFFER13_ARB 0x8832 #define GL_DRAW_BUFFER14_ARB 0x8833 #define GL_DRAW_BUFFER15_ARB 0x8834 typedef void (APIENTRYP PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum *bufs); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glDrawBuffersARB (GLsizei n, const GLenum *bufs); #endif #endif /* GL_ARB_draw_buffers */ #ifndef GL_ARB_draw_buffers_blend #define GL_ARB_draw_buffers_blend 1 typedef void (APIENTRYP PFNGLBLENDEQUATIONIARBPROC) (GLuint buf, GLenum mode); typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIARBPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); typedef void (APIENTRYP PFNGLBLENDFUNCIARBPROC) (GLuint buf, GLenum src, GLenum dst); typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIARBPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBlendEquationiARB (GLuint buf, GLenum mode); GLAPI void APIENTRY glBlendEquationSeparateiARB (GLuint buf, GLenum modeRGB, GLenum modeAlpha); GLAPI void APIENTRY glBlendFunciARB (GLuint buf, GLenum src, GLenum dst); GLAPI void APIENTRY glBlendFuncSeparateiARB (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); #endif #endif /* GL_ARB_draw_buffers_blend */ #ifndef GL_ARB_draw_elements_base_vertex #define GL_ARB_draw_elements_base_vertex 1 #endif /* GL_ARB_draw_elements_base_vertex */ #ifndef GL_ARB_draw_indirect #define GL_ARB_draw_indirect 1 #endif /* GL_ARB_draw_indirect */ #ifndef GL_ARB_draw_instanced #define GL_ARB_draw_instanced 1 typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDARBPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDARBPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glDrawArraysInstancedARB (GLenum mode, GLint first, GLsizei count, GLsizei primcount); GLAPI void APIENTRY glDrawElementsInstancedARB (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); #endif #endif /* GL_ARB_draw_instanced */ #ifndef GL_ARB_enhanced_layouts #define GL_ARB_enhanced_layouts 1 #endif /* GL_ARB_enhanced_layouts */ #ifndef GL_ARB_explicit_attrib_location #define GL_ARB_explicit_attrib_location 1 #endif /* GL_ARB_explicit_attrib_location */ #ifndef GL_ARB_explicit_uniform_location #define GL_ARB_explicit_uniform_location 1 #endif /* GL_ARB_explicit_uniform_location */ #ifndef GL_ARB_fragment_coord_conventions #define GL_ARB_fragment_coord_conventions 1 #endif /* GL_ARB_fragment_coord_conventions */ #ifndef GL_ARB_fragment_layer_viewport #define GL_ARB_fragment_layer_viewport 1 #endif /* GL_ARB_fragment_layer_viewport */ #ifndef GL_ARB_fragment_program #define GL_ARB_fragment_program 1 #define GL_FRAGMENT_PROGRAM_ARB 0x8804 #define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 #define GL_PROGRAM_LENGTH_ARB 0x8627 #define GL_PROGRAM_FORMAT_ARB 0x8876 #define GL_PROGRAM_BINDING_ARB 0x8677 #define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 #define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 #define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 #define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 #define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 #define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 #define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 #define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 #define GL_PROGRAM_PARAMETERS_ARB 0x88A8 #define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 #define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA #define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB #define GL_PROGRAM_ATTRIBS_ARB 0x88AC #define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD #define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE #define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF #define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 #define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 #define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 #define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 #define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 #define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 #define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 #define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 #define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A #define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B #define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C #define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D #define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E #define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F #define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 #define GL_PROGRAM_STRING_ARB 0x8628 #define GL_PROGRAM_ERROR_POSITION_ARB 0x864B #define GL_CURRENT_MATRIX_ARB 0x8641 #define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 #define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 #define GL_MAX_PROGRAM_MATRICES_ARB 0x862F #define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E #define GL_MAX_TEXTURE_COORDS_ARB 0x8871 #define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 #define GL_PROGRAM_ERROR_STRING_ARB 0x8874 #define GL_MATRIX0_ARB 0x88C0 #define GL_MATRIX1_ARB 0x88C1 #define GL_MATRIX2_ARB 0x88C2 #define GL_MATRIX3_ARB 0x88C3 #define GL_MATRIX4_ARB 0x88C4 #define GL_MATRIX5_ARB 0x88C5 #define GL_MATRIX6_ARB 0x88C6 #define GL_MATRIX7_ARB 0x88C7 #define GL_MATRIX8_ARB 0x88C8 #define GL_MATRIX9_ARB 0x88C9 #define GL_MATRIX10_ARB 0x88CA #define GL_MATRIX11_ARB 0x88CB #define GL_MATRIX12_ARB 0x88CC #define GL_MATRIX13_ARB 0x88CD #define GL_MATRIX14_ARB 0x88CE #define GL_MATRIX15_ARB 0x88CF #define GL_MATRIX16_ARB 0x88D0 #define GL_MATRIX17_ARB 0x88D1 #define GL_MATRIX18_ARB 0x88D2 #define GL_MATRIX19_ARB 0x88D3 #define GL_MATRIX20_ARB 0x88D4 #define GL_MATRIX21_ARB 0x88D5 #define GL_MATRIX22_ARB 0x88D6 #define GL_MATRIX23_ARB 0x88D7 #define GL_MATRIX24_ARB 0x88D8 #define GL_MATRIX25_ARB 0x88D9 #define GL_MATRIX26_ARB 0x88DA #define GL_MATRIX27_ARB 0x88DB #define GL_MATRIX28_ARB 0x88DC #define GL_MATRIX29_ARB 0x88DD #define GL_MATRIX30_ARB 0x88DE #define GL_MATRIX31_ARB 0x88DF typedef void (APIENTRYP PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const void *string); typedef void (APIENTRYP PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); typedef void (APIENTRYP PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint *programs); typedef void (APIENTRYP PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint *programs); typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); typedef void (APIENTRYP PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, void *string); typedef GLboolean (APIENTRYP PFNGLISPROGRAMARBPROC) (GLuint program); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glProgramStringARB (GLenum target, GLenum format, GLsizei len, const void *string); GLAPI void APIENTRY glBindProgramARB (GLenum target, GLuint program); GLAPI void APIENTRY glDeleteProgramsARB (GLsizei n, const GLuint *programs); GLAPI void APIENTRY glGenProgramsARB (GLsizei n, GLuint *programs); GLAPI void APIENTRY glProgramEnvParameter4dARB (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); GLAPI void APIENTRY glProgramEnvParameter4dvARB (GLenum target, GLuint index, const GLdouble *params); GLAPI void APIENTRY glProgramEnvParameter4fARB (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); GLAPI void APIENTRY glProgramEnvParameter4fvARB (GLenum target, GLuint index, const GLfloat *params); GLAPI void APIENTRY glProgramLocalParameter4dARB (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); GLAPI void APIENTRY glProgramLocalParameter4dvARB (GLenum target, GLuint index, const GLdouble *params); GLAPI void APIENTRY glProgramLocalParameter4fARB (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); GLAPI void APIENTRY glProgramLocalParameter4fvARB (GLenum target, GLuint index, const GLfloat *params); GLAPI void APIENTRY glGetProgramEnvParameterdvARB (GLenum target, GLuint index, GLdouble *params); GLAPI void APIENTRY glGetProgramEnvParameterfvARB (GLenum target, GLuint index, GLfloat *params); GLAPI void APIENTRY glGetProgramLocalParameterdvARB (GLenum target, GLuint index, GLdouble *params); GLAPI void APIENTRY glGetProgramLocalParameterfvARB (GLenum target, GLuint index, GLfloat *params); GLAPI void APIENTRY glGetProgramivARB (GLenum target, GLenum pname, GLint *params); GLAPI void APIENTRY glGetProgramStringARB (GLenum target, GLenum pname, void *string); GLAPI GLboolean APIENTRY glIsProgramARB (GLuint program); #endif #endif /* GL_ARB_fragment_program */ #ifndef GL_ARB_fragment_program_shadow #define GL_ARB_fragment_program_shadow 1 #endif /* GL_ARB_fragment_program_shadow */ #ifndef GL_ARB_fragment_shader #define GL_ARB_fragment_shader 1 #define GL_FRAGMENT_SHADER_ARB 0x8B30 #define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 #define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B #endif /* GL_ARB_fragment_shader */ #ifndef GL_ARB_framebuffer_no_attachments #define GL_ARB_framebuffer_no_attachments 1 #endif /* GL_ARB_framebuffer_no_attachments */ #ifndef GL_ARB_framebuffer_object #define GL_ARB_framebuffer_object 1 #endif /* GL_ARB_framebuffer_object */ #ifndef GL_ARB_framebuffer_sRGB #define GL_ARB_framebuffer_sRGB 1 #endif /* GL_ARB_framebuffer_sRGB */ #ifndef GL_ARB_geometry_shader4 #define GL_ARB_geometry_shader4 1 #define GL_LINES_ADJACENCY_ARB 0x000A #define GL_LINE_STRIP_ADJACENCY_ARB 0x000B #define GL_TRIANGLES_ADJACENCY_ARB 0x000C #define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0x000D #define GL_PROGRAM_POINT_SIZE_ARB 0x8642 #define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29 #define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7 #define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8 #define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9 #define GL_GEOMETRY_SHADER_ARB 0x8DD9 #define GL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA #define GL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB #define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC #define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD #define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE #define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF #define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0 #define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1 typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIARBPROC) (GLuint program, GLenum pname, GLint value); typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glProgramParameteriARB (GLuint program, GLenum pname, GLint value); GLAPI void APIENTRY glFramebufferTextureARB (GLenum target, GLenum attachment, GLuint texture, GLint level); GLAPI void APIENTRY glFramebufferTextureLayerARB (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); GLAPI void APIENTRY glFramebufferTextureFaceARB (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); #endif #endif /* GL_ARB_geometry_shader4 */ #ifndef GL_ARB_get_program_binary #define GL_ARB_get_program_binary 1 #endif /* GL_ARB_get_program_binary */ #ifndef GL_ARB_get_texture_sub_image #define GL_ARB_get_texture_sub_image 1 #endif /* GL_ARB_get_texture_sub_image */ #ifndef GL_ARB_gpu_shader5 #define GL_ARB_gpu_shader5 1 #endif /* GL_ARB_gpu_shader5 */ #ifndef GL_ARB_gpu_shader_fp64 #define GL_ARB_gpu_shader_fp64 1 #endif /* GL_ARB_gpu_shader_fp64 */ #ifndef GL_ARB_half_float_pixel #define GL_ARB_half_float_pixel 1 typedef unsigned short GLhalfARB; #define GL_HALF_FLOAT_ARB 0x140B #endif /* GL_ARB_half_float_pixel */ #ifndef GL_ARB_half_float_vertex #define GL_ARB_half_float_vertex 1 #endif /* GL_ARB_half_float_vertex */ #ifndef GL_ARB_imaging #define GL_ARB_imaging 1 #define GL_BLEND_COLOR 0x8005 #define GL_BLEND_EQUATION 0x8009 #define GL_CONVOLUTION_1D 0x8010 #define GL_CONVOLUTION_2D 0x8011 #define GL_SEPARABLE_2D 0x8012 #define GL_CONVOLUTION_BORDER_MODE 0x8013 #define GL_CONVOLUTION_FILTER_SCALE 0x8014 #define GL_CONVOLUTION_FILTER_BIAS 0x8015 #define GL_REDUCE 0x8016 #define GL_CONVOLUTION_FORMAT 0x8017 #define GL_CONVOLUTION_WIDTH 0x8018 #define GL_CONVOLUTION_HEIGHT 0x8019 #define GL_MAX_CONVOLUTION_WIDTH 0x801A #define GL_MAX_CONVOLUTION_HEIGHT 0x801B #define GL_POST_CONVOLUTION_RED_SCALE 0x801C #define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D #define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E #define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F #define GL_POST_CONVOLUTION_RED_BIAS 0x8020 #define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 #define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 #define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 #define GL_HISTOGRAM 0x8024 #define GL_PROXY_HISTOGRAM 0x8025 #define GL_HISTOGRAM_WIDTH 0x8026 #define GL_HISTOGRAM_FORMAT 0x8027 #define GL_HISTOGRAM_RED_SIZE 0x8028 #define GL_HISTOGRAM_GREEN_SIZE 0x8029 #define GL_HISTOGRAM_BLUE_SIZE 0x802A #define GL_HISTOGRAM_ALPHA_SIZE 0x802B #define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C #define GL_HISTOGRAM_SINK 0x802D #define GL_MINMAX 0x802E #define GL_MINMAX_FORMAT 0x802F #define GL_MINMAX_SINK 0x8030 #define GL_TABLE_TOO_LARGE 0x8031 #define GL_COLOR_MATRIX 0x80B1 #define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 #define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 #define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 #define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 #define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 #define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 #define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 #define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 #define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA #define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB #define GL_COLOR_TABLE 0x80D0 #define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 #define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 #define GL_PROXY_COLOR_TABLE 0x80D3 #define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 #define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 #define GL_COLOR_TABLE_SCALE 0x80D6 #define GL_COLOR_TABLE_BIAS 0x80D7 #define GL_COLOR_TABLE_FORMAT 0x80D8 #define GL_COLOR_TABLE_WIDTH 0x80D9 #define GL_COLOR_TABLE_RED_SIZE 0x80DA #define GL_COLOR_TABLE_GREEN_SIZE 0x80DB #define GL_COLOR_TABLE_BLUE_SIZE 0x80DC #define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD #define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE #define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF #define GL_CONSTANT_BORDER 0x8151 #define GL_REPLICATE_BORDER 0x8153 #define GL_CONVOLUTION_BORDER_COLOR 0x8154 typedef void (APIENTRYP PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); typedef void (APIENTRYP PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, void *table); typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, void *image); typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); typedef void (APIENTRYP PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); typedef void (APIENTRYP PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); typedef void (APIENTRYP PFNGLRESETHISTOGRAMPROC) (GLenum target); typedef void (APIENTRYP PFNGLRESETMINMAXPROC) (GLenum target); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glColorTable (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); GLAPI void APIENTRY glColorTableParameterfv (GLenum target, GLenum pname, const GLfloat *params); GLAPI void APIENTRY glColorTableParameteriv (GLenum target, GLenum pname, const GLint *params); GLAPI void APIENTRY glCopyColorTable (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); GLAPI void APIENTRY glGetColorTable (GLenum target, GLenum format, GLenum type, void *table); GLAPI void APIENTRY glGetColorTableParameterfv (GLenum target, GLenum pname, GLfloat *params); GLAPI void APIENTRY glGetColorTableParameteriv (GLenum target, GLenum pname, GLint *params); GLAPI void APIENTRY glColorSubTable (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); GLAPI void APIENTRY glCopyColorSubTable (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); GLAPI void APIENTRY glConvolutionFilter1D (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); GLAPI void APIENTRY glConvolutionFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); GLAPI void APIENTRY glConvolutionParameterf (GLenum target, GLenum pname, GLfloat params); GLAPI void APIENTRY glConvolutionParameterfv (GLenum target, GLenum pname, const GLfloat *params); GLAPI void APIENTRY glConvolutionParameteri (GLenum target, GLenum pname, GLint params); GLAPI void APIENTRY glConvolutionParameteriv (GLenum target, GLenum pname, const GLint *params); GLAPI void APIENTRY glCopyConvolutionFilter1D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); GLAPI void APIENTRY glCopyConvolutionFilter2D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); GLAPI void APIENTRY glGetConvolutionFilter (GLenum target, GLenum format, GLenum type, void *image); GLAPI void APIENTRY glGetConvolutionParameterfv (GLenum target, GLenum pname, GLfloat *params); GLAPI void APIENTRY glGetConvolutionParameteriv (GLenum target, GLenum pname, GLint *params); GLAPI void APIENTRY glGetSeparableFilter (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); GLAPI void APIENTRY glSeparableFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); GLAPI void APIENTRY glGetHistogram (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); GLAPI void APIENTRY glGetHistogramParameterfv (GLenum target, GLenum pname, GLfloat *params); GLAPI void APIENTRY glGetHistogramParameteriv (GLenum target, GLenum pname, GLint *params); GLAPI void APIENTRY glGetMinmax (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); GLAPI void APIENTRY glGetMinmaxParameterfv (GLenum target, GLenum pname, GLfloat *params); GLAPI void APIENTRY glGetMinmaxParameteriv (GLenum target, GLenum pname, GLint *params); GLAPI void APIENTRY glHistogram (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); GLAPI void APIENTRY glMinmax (GLenum target, GLenum internalformat, GLboolean sink); GLAPI void APIENTRY glResetHistogram (GLenum target); GLAPI void APIENTRY glResetMinmax (GLenum target); #endif #endif /* GL_ARB_imaging */ #ifndef GL_ARB_indirect_parameters #define GL_ARB_indirect_parameters 1 #define GL_PARAMETER_BUFFER_ARB 0x80EE #define GL_PARAMETER_BUFFER_BINDING_ARB 0x80EF typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC) (GLenum mode, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC) (GLenum mode, GLenum type, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glMultiDrawArraysIndirectCountARB (GLenum mode, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); GLAPI void APIENTRY glMultiDrawElementsIndirectCountARB (GLenum mode, GLenum type, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); #endif #endif /* GL_ARB_indirect_parameters */ #ifndef GL_ARB_instanced_arrays #define GL_ARB_instanced_arrays 1 #define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB 0x88FE typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORARBPROC) (GLuint index, GLuint divisor); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glVertexAttribDivisorARB (GLuint index, GLuint divisor); #endif #endif /* GL_ARB_instanced_arrays */ #ifndef GL_ARB_internalformat_query #define GL_ARB_internalformat_query 1 #endif /* GL_ARB_internalformat_query */ #ifndef GL_ARB_internalformat_query2 #define GL_ARB_internalformat_query2 1 #define GL_SRGB_DECODE_ARB 0x8299 #endif /* GL_ARB_internalformat_query2 */ #ifndef GL_ARB_invalidate_subdata #define GL_ARB_invalidate_subdata 1 #endif /* GL_ARB_invalidate_subdata */ #ifndef GL_ARB_map_buffer_alignment #define GL_ARB_map_buffer_alignment 1 #endif /* GL_ARB_map_buffer_alignment */ #ifndef GL_ARB_map_buffer_range #define GL_ARB_map_buffer_range 1 #endif /* GL_ARB_map_buffer_range */ #ifndef GL_ARB_matrix_palette #define GL_ARB_matrix_palette 1 #define GL_MATRIX_PALETTE_ARB 0x8840 #define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 #define GL_MAX_PALETTE_MATRICES_ARB 0x8842 #define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 #define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 #define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 #define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 #define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 #define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 #define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 typedef void (APIENTRYP PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); typedef void (APIENTRYP PFNGLMATRIXINDEXUBVARBPROC) (GLint size, const GLubyte *indices); typedef void (APIENTRYP PFNGLMATRIXINDEXUSVARBPROC) (GLint size, const GLushort *indices); typedef void (APIENTRYP PFNGLMATRIXINDEXUIVARBPROC) (GLint size, const GLuint *indices); typedef void (APIENTRYP PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glCurrentPaletteMatrixARB (GLint index); GLAPI void APIENTRY glMatrixIndexubvARB (GLint size, const GLubyte *indices); GLAPI void APIENTRY glMatrixIndexusvARB (GLint size, const GLushort *indices); GLAPI void APIENTRY glMatrixIndexuivARB (GLint size, const GLuint *indices); GLAPI void APIENTRY glMatrixIndexPointerARB (GLint size, GLenum type, GLsizei stride, const void *pointer); #endif #endif /* GL_ARB_matrix_palette */ #ifndef GL_ARB_multi_bind #define GL_ARB_multi_bind 1 #endif /* GL_ARB_multi_bind */ #ifndef GL_ARB_multi_draw_indirect #define GL_ARB_multi_draw_indirect 1 #endif /* GL_ARB_multi_draw_indirect */ #ifndef GL_ARB_multisample #define GL_ARB_multisample 1 #define GL_MULTISAMPLE_ARB 0x809D #define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E #define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F #define GL_SAMPLE_COVERAGE_ARB 0x80A0 #define GL_SAMPLE_BUFFERS_ARB 0x80A8 #define GL_SAMPLES_ARB 0x80A9 #define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA #define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB #define GL_MULTISAMPLE_BIT_ARB 0x20000000 typedef void (APIENTRYP PFNGLSAMPLECOVERAGEARBPROC) (GLfloat value, GLboolean invert); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glSampleCoverageARB (GLfloat value, GLboolean invert); #endif #endif /* GL_ARB_multisample */ #ifndef GL_ARB_multitexture #define GL_ARB_multitexture 1 #define GL_TEXTURE0_ARB 0x84C0 #define GL_TEXTURE1_ARB 0x84C1 #define GL_TEXTURE2_ARB 0x84C2 #define GL_TEXTURE3_ARB 0x84C3 #define GL_TEXTURE4_ARB 0x84C4 #define GL_TEXTURE5_ARB 0x84C5 #define GL_TEXTURE6_ARB 0x84C6 #define GL_TEXTURE7_ARB 0x84C7 #define GL_TEXTURE8_ARB 0x84C8 #define GL_TEXTURE9_ARB 0x84C9 #define GL_TEXTURE10_ARB 0x84CA #define GL_TEXTURE11_ARB 0x84CB #define GL_TEXTURE12_ARB 0x84CC #define GL_TEXTURE13_ARB 0x84CD #define GL_TEXTURE14_ARB 0x84CE #define GL_TEXTURE15_ARB 0x84CF #define GL_TEXTURE16_ARB 0x84D0 #define GL_TEXTURE17_ARB 0x84D1 #define GL_TEXTURE18_ARB 0x84D2 #define GL_TEXTURE19_ARB 0x84D3 #define GL_TEXTURE20_ARB 0x84D4 #define GL_TEXTURE21_ARB 0x84D5 #define GL_TEXTURE22_ARB 0x84D6 #define GL_TEXTURE23_ARB 0x84D7 #define GL_TEXTURE24_ARB 0x84D8 #define GL_TEXTURE25_ARB 0x84D9 #define GL_TEXTURE26_ARB 0x84DA #define GL_TEXTURE27_ARB 0x84DB #define GL_TEXTURE28_ARB 0x84DC #define GL_TEXTURE29_ARB 0x84DD #define GL_TEXTURE30_ARB 0x84DE #define GL_TEXTURE31_ARB 0x84DF #define GL_ACTIVE_TEXTURE_ARB 0x84E0 #define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 #define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 typedef void (APIENTRYP PFNGLACTIVETEXTUREARBPROC) (GLenum texture); typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); typedef void (APIENTRYP PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glActiveTextureARB (GLenum texture); GLAPI void APIENTRY glClientActiveTextureARB (GLenum texture); GLAPI void APIENTRY glMultiTexCoord1dARB (GLenum target, GLdouble s); GLAPI void APIENTRY glMultiTexCoord1dvARB (GLenum target, const GLdouble *v); GLAPI void APIENTRY glMultiTexCoord1fARB (GLenum target, GLfloat s); GLAPI void APIENTRY glMultiTexCoord1fvARB (GLenum target, const GLfloat *v); GLAPI void APIENTRY glMultiTexCoord1iARB (GLenum target, GLint s); GLAPI void APIENTRY glMultiTexCoord1ivARB (GLenum target, const GLint *v); GLAPI void APIENTRY glMultiTexCoord1sARB (GLenum target, GLshort s); GLAPI void APIENTRY glMultiTexCoord1svARB (GLenum target, const GLshort *v); GLAPI void APIENTRY glMultiTexCoord2dARB (GLenum target, GLdouble s, GLdouble t); GLAPI void APIENTRY glMultiTexCoord2dvARB (GLenum target, const GLdouble *v); GLAPI void APIENTRY glMultiTexCoord2fARB (GLenum target, GLfloat s, GLfloat t); GLAPI void APIENTRY glMultiTexCoord2fvARB (GLenum target, const GLfloat *v); GLAPI void APIENTRY glMultiTexCoord2iARB (GLenum target, GLint s, GLint t); GLAPI void APIENTRY glMultiTexCoord2ivARB (GLenum target, const GLint *v); GLAPI void APIENTRY glMultiTexCoord2sARB (GLenum target, GLshort s, GLshort t); GLAPI void APIENTRY glMultiTexCoord2svARB (GLenum target, const GLshort *v); GLAPI void APIENTRY glMultiTexCoord3dARB (GLenum target, GLdouble s, GLdouble t, GLdouble r); GLAPI void APIENTRY glMultiTexCoord3dvARB (GLenum target, const GLdouble *v); GLAPI void APIENTRY glMultiTexCoord3fARB (GLenum target, GLfloat s, GLfloat t, GLfloat r); GLAPI void APIENTRY glMultiTexCoord3fvARB (GLenum target, const GLfloat *v); GLAPI void APIENTRY glMultiTexCoord3iARB (GLenum target, GLint s, GLint t, GLint r); GLAPI void APIENTRY glMultiTexCoord3ivARB (GLenum target, const GLint *v); GLAPI void APIENTRY glMultiTexCoord3sARB (GLenum target, GLshort s, GLshort t, GLshort r); GLAPI void APIENTRY glMultiTexCoord3svARB (GLenum target, const GLshort *v); GLAPI void APIENTRY glMultiTexCoord4dARB (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); GLAPI void APIENTRY glMultiTexCoord4dvARB (GLenum target, const GLdouble *v); GLAPI void APIENTRY glMultiTexCoord4fARB (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); GLAPI void APIENTRY glMultiTexCoord4fvARB (GLenum target, const GLfloat *v); GLAPI void APIENTRY glMultiTexCoord4iARB (GLenum target, GLint s, GLint t, GLint r, GLint q); GLAPI void APIENTRY glMultiTexCoord4ivARB (GLenum target, const GLint *v); GLAPI void APIENTRY glMultiTexCoord4sARB (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); GLAPI void APIENTRY glMultiTexCoord4svARB (GLenum target, const GLshort *v); #endif #endif /* GL_ARB_multitexture */ #ifndef GL_ARB_occlusion_query #define GL_ARB_occlusion_query 1 #define GL_QUERY_COUNTER_BITS_ARB 0x8864 #define GL_CURRENT_QUERY_ARB 0x8865 #define GL_QUERY_RESULT_ARB 0x8866 #define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 #define GL_SAMPLES_PASSED_ARB 0x8914 typedef void (APIENTRYP PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint *ids); typedef void (APIENTRYP PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint *ids); typedef GLboolean (APIENTRYP PFNGLISQUERYARBPROC) (GLuint id); typedef void (APIENTRYP PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id); typedef void (APIENTRYP PFNGLENDQUERYARBPROC) (GLenum target); typedef void (APIENTRYP PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint *params); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glGenQueriesARB (GLsizei n, GLuint *ids); GLAPI void APIENTRY glDeleteQueriesARB (GLsizei n, const GLuint *ids); GLAPI GLboolean APIENTRY glIsQueryARB (GLuint id); GLAPI void APIENTRY glBeginQueryARB (GLenum target, GLuint id); GLAPI void APIENTRY glEndQueryARB (GLenum target); GLAPI void APIENTRY glGetQueryivARB (GLenum target, GLenum pname, GLint *params); GLAPI void APIENTRY glGetQueryObjectivARB (GLuint id, GLenum pname, GLint *params); GLAPI void APIENTRY glGetQueryObjectuivARB (GLuint id, GLenum pname, GLuint *params); #endif #endif /* GL_ARB_occlusion_query */ #ifndef GL_ARB_occlusion_query2 #define GL_ARB_occlusion_query2 1 #endif /* GL_ARB_occlusion_query2 */ #ifndef GL_ARB_pipeline_statistics_query #define GL_ARB_pipeline_statistics_query 1 #define GL_VERTICES_SUBMITTED_ARB 0x82EE #define GL_PRIMITIVES_SUBMITTED_ARB 0x82EF #define GL_VERTEX_SHADER_INVOCATIONS_ARB 0x82F0 #define GL_TESS_CONTROL_SHADER_PATCHES_ARB 0x82F1 #define GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB 0x82F2 #define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB 0x82F3 #define GL_FRAGMENT_SHADER_INVOCATIONS_ARB 0x82F4 #define GL_COMPUTE_SHADER_INVOCATIONS_ARB 0x82F5 #define GL_CLIPPING_INPUT_PRIMITIVES_ARB 0x82F6 #define GL_CLIPPING_OUTPUT_PRIMITIVES_ARB 0x82F7 #endif /* GL_ARB_pipeline_statistics_query */ #ifndef GL_ARB_pixel_buffer_object #define GL_ARB_pixel_buffer_object 1 #define GL_PIXEL_PACK_BUFFER_ARB 0x88EB #define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC #define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED #define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF #endif /* GL_ARB_pixel_buffer_object */ #ifndef GL_ARB_point_parameters #define GL_ARB_point_parameters 1 #define GL_POINT_SIZE_MIN_ARB 0x8126 #define GL_POINT_SIZE_MAX_ARB 0x8127 #define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 #define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 typedef void (APIENTRYP PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat *params); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glPointParameterfARB (GLenum pname, GLfloat param); GLAPI void APIENTRY glPointParameterfvARB (GLenum pname, const GLfloat *params); #endif #endif /* GL_ARB_point_parameters */ #ifndef GL_ARB_point_sprite #define GL_ARB_point_sprite 1 #define GL_POINT_SPRITE_ARB 0x8861 #define GL_COORD_REPLACE_ARB 0x8862 #endif /* GL_ARB_point_sprite */ #ifndef GL_ARB_program_interface_query #define GL_ARB_program_interface_query 1 #endif /* GL_ARB_program_interface_query */ #ifndef GL_ARB_provoking_vertex #define GL_ARB_provoking_vertex 1 #endif /* GL_ARB_provoking_vertex */ #ifndef GL_ARB_query_buffer_object #define GL_ARB_query_buffer_object 1 #endif /* GL_ARB_query_buffer_object */ #ifndef GL_ARB_robust_buffer_access_behavior #define GL_ARB_robust_buffer_access_behavior 1 #endif /* GL_ARB_robust_buffer_access_behavior */ #ifndef GL_ARB_robustness #define GL_ARB_robustness 1 #define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB 0x00000004 #define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 #define GL_GUILTY_CONTEXT_RESET_ARB 0x8253 #define GL_INNOCENT_CONTEXT_RESET_ARB 0x8254 #define GL_UNKNOWN_CONTEXT_RESET_ARB 0x8255 #define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 #define GL_NO_RESET_NOTIFICATION_ARB 0x8261 typedef GLenum (APIENTRYP PFNGLGETGRAPHICSRESETSTATUSARBPROC) (void); typedef void (APIENTRYP PFNGLGETNTEXIMAGEARBPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *img); typedef void (APIENTRYP PFNGLREADNPIXELSARBPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); typedef void (APIENTRYP PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, GLsizei bufSize, void *img); typedef void (APIENTRYP PFNGLGETNUNIFORMFVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); typedef void (APIENTRYP PFNGLGETNUNIFORMIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); typedef void (APIENTRYP PFNGLGETNUNIFORMUIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params); typedef void (APIENTRYP PFNGLGETNUNIFORMDVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); typedef void (APIENTRYP PFNGLGETNMAPDVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); typedef void (APIENTRYP PFNGLGETNMAPFVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); typedef void (APIENTRYP PFNGLGETNMAPIVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLint *v); typedef void (APIENTRYP PFNGLGETNPIXELMAPFVARBPROC) (GLenum map, GLsizei bufSize, GLfloat *values); typedef void (APIENTRYP PFNGLGETNPIXELMAPUIVARBPROC) (GLenum map, GLsizei bufSize, GLuint *values); typedef void (APIENTRYP PFNGLGETNPIXELMAPUSVARBPROC) (GLenum map, GLsizei bufSize, GLushort *values); typedef void (APIENTRYP PFNGLGETNPOLYGONSTIPPLEARBPROC) (GLsizei bufSize, GLubyte *pattern); typedef void (APIENTRYP PFNGLGETNCOLORTABLEARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table); typedef void (APIENTRYP PFNGLGETNCONVOLUTIONFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image); typedef void (APIENTRYP PFNGLGETNSEPARABLEFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span); typedef void (APIENTRYP PFNGLGETNHISTOGRAMARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); typedef void (APIENTRYP PFNGLGETNMINMAXARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); #ifdef GL_GLEXT_PROTOTYPES GLAPI GLenum APIENTRY glGetGraphicsResetStatusARB (void); GLAPI void APIENTRY glGetnTexImageARB (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *img); GLAPI void APIENTRY glReadnPixelsARB (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); GLAPI void APIENTRY glGetnCompressedTexImageARB (GLenum target, GLint lod, GLsizei bufSize, void *img); GLAPI void APIENTRY glGetnUniformfvARB (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); GLAPI void APIENTRY glGetnUniformivARB (GLuint program, GLint location, GLsizei bufSize, GLint *params); GLAPI void APIENTRY glGetnUniformuivARB (GLuint program, GLint location, GLsizei bufSize, GLuint *params); GLAPI void APIENTRY glGetnUniformdvARB (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); GLAPI void APIENTRY glGetnMapdvARB (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); GLAPI void APIENTRY glGetnMapfvARB (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); GLAPI void APIENTRY glGetnMapivARB (GLenum target, GLenum query, GLsizei bufSize, GLint *v); GLAPI void APIENTRY glGetnPixelMapfvARB (GLenum map, GLsizei bufSize, GLfloat *values); GLAPI void APIENTRY glGetnPixelMapuivARB (GLenum map, GLsizei bufSize, GLuint *values); GLAPI void APIENTRY glGetnPixelMapusvARB (GLenum map, GLsizei bufSize, GLushort *values); GLAPI void APIENTRY glGetnPolygonStippleARB (GLsizei bufSize, GLubyte *pattern); GLAPI void APIENTRY glGetnColorTableARB (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table); GLAPI void APIENTRY glGetnConvolutionFilterARB (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image); GLAPI void APIENTRY glGetnSeparableFilterARB (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span); GLAPI void APIENTRY glGetnHistogramARB (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); GLAPI void APIENTRY glGetnMinmaxARB (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); #endif #endif /* GL_ARB_robustness */ #ifndef GL_ARB_robustness_isolation #define GL_ARB_robustness_isolation 1 #endif /* GL_ARB_robustness_isolation */ #ifndef GL_ARB_sample_shading #define GL_ARB_sample_shading 1 #define GL_SAMPLE_SHADING_ARB 0x8C36 #define GL_MIN_SAMPLE_SHADING_VALUE_ARB 0x8C37 typedef void (APIENTRYP PFNGLMINSAMPLESHADINGARBPROC) (GLfloat value); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glMinSampleShadingARB (GLfloat value); #endif #endif /* GL_ARB_sample_shading */ #ifndef GL_ARB_sampler_objects #define GL_ARB_sampler_objects 1 #endif /* GL_ARB_sampler_objects */ #ifndef GL_ARB_seamless_cube_map #define GL_ARB_seamless_cube_map 1 #endif /* GL_ARB_seamless_cube_map */ #ifndef GL_ARB_seamless_cubemap_per_texture #define GL_ARB_seamless_cubemap_per_texture 1 #endif /* GL_ARB_seamless_cubemap_per_texture */ #ifndef GL_ARB_separate_shader_objects #define GL_ARB_separate_shader_objects 1 #endif /* GL_ARB_separate_shader_objects */ #ifndef GL_ARB_shader_atomic_counters #define GL_ARB_shader_atomic_counters 1 #endif /* GL_ARB_shader_atomic_counters */ #ifndef GL_ARB_shader_bit_encoding #define GL_ARB_shader_bit_encoding 1 #endif /* GL_ARB_shader_bit_encoding */ #ifndef GL_ARB_shader_draw_parameters #define GL_ARB_shader_draw_parameters 1 #endif /* GL_ARB_shader_draw_parameters */ #ifndef GL_ARB_shader_group_vote #define GL_ARB_shader_group_vote 1 #endif /* GL_ARB_shader_group_vote */ #ifndef GL_ARB_shader_image_load_store #define GL_ARB_shader_image_load_store 1 #endif /* GL_ARB_shader_image_load_store */ #ifndef GL_ARB_shader_image_size #define GL_ARB_shader_image_size 1 #endif /* GL_ARB_shader_image_size */ #ifndef GL_ARB_shader_objects #define GL_ARB_shader_objects 1 #ifdef __APPLE__ typedef void *GLhandleARB; #else typedef unsigned int GLhandleARB; #endif typedef char GLcharARB; #define GL_PROGRAM_OBJECT_ARB 0x8B40 #define GL_SHADER_OBJECT_ARB 0x8B48 #define GL_OBJECT_TYPE_ARB 0x8B4E #define GL_OBJECT_SUBTYPE_ARB 0x8B4F #define GL_FLOAT_VEC2_ARB 0x8B50 #define GL_FLOAT_VEC3_ARB 0x8B51 #define GL_FLOAT_VEC4_ARB 0x8B52 #define GL_INT_VEC2_ARB 0x8B53 #define GL_INT_VEC3_ARB 0x8B54 #define GL_INT_VEC4_ARB 0x8B55 #define GL_BOOL_ARB 0x8B56 #define GL_BOOL_VEC2_ARB 0x8B57 #define GL_BOOL_VEC3_ARB 0x8B58 #define GL_BOOL_VEC4_ARB 0x8B59 #define GL_FLOAT_MAT2_ARB 0x8B5A #define GL_FLOAT_MAT3_ARB 0x8B5B #define GL_FLOAT_MAT4_ARB 0x8B5C #define GL_SAMPLER_1D_ARB 0x8B5D #define GL_SAMPLER_2D_ARB 0x8B5E #define GL_SAMPLER_3D_ARB 0x8B5F #define GL_SAMPLER_CUBE_ARB 0x8B60 #define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 #define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 #define GL_SAMPLER_2D_RECT_ARB 0x8B63 #define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 #define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 #define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 #define GL_OBJECT_LINK_STATUS_ARB 0x8B82 #define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 #define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 #define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 #define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 #define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 #define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 typedef void (APIENTRYP PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); typedef GLhandleARB (APIENTRYP PFNGLGETHANDLEARBPROC) (GLenum pname); typedef void (APIENTRYP PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); typedef GLhandleARB (APIENTRYP PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); typedef void (APIENTRYP PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB **string, const GLint *length); typedef void (APIENTRYP PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); typedef GLhandleARB (APIENTRYP PFNGLCREATEPROGRAMOBJECTARBPROC) (void); typedef void (APIENTRYP PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); typedef void (APIENTRYP PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); typedef void (APIENTRYP PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); typedef void (APIENTRYP PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); typedef void (APIENTRYP PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); typedef void (APIENTRYP PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); typedef void (APIENTRYP PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); typedef void (APIENTRYP PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); typedef void (APIENTRYP PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); typedef void (APIENTRYP PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); typedef void (APIENTRYP PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); typedef void (APIENTRYP PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); typedef void (APIENTRYP PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint *value); typedef void (APIENTRYP PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint *value); typedef void (APIENTRYP PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint *value); typedef void (APIENTRYP PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); typedef void (APIENTRYP PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); typedef void (APIENTRYP PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat *params); typedef void (APIENTRYP PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint *params); typedef void (APIENTRYP PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glDeleteObjectARB (GLhandleARB obj); GLAPI GLhandleARB APIENTRY glGetHandleARB (GLenum pname); GLAPI void APIENTRY glDetachObjectARB (GLhandleARB containerObj, GLhandleARB attachedObj); GLAPI GLhandleARB APIENTRY glCreateShaderObjectARB (GLenum shaderType); GLAPI void APIENTRY glShaderSourceARB (GLhandleARB shaderObj, GLsizei count, const GLcharARB **string, const GLint *length); GLAPI void APIENTRY glCompileShaderARB (GLhandleARB shaderObj); GLAPI GLhandleARB APIENTRY glCreateProgramObjectARB (void); GLAPI void APIENTRY glAttachObjectARB (GLhandleARB containerObj, GLhandleARB obj); GLAPI void APIENTRY glLinkProgramARB (GLhandleARB programObj); GLAPI void APIENTRY glUseProgramObjectARB (GLhandleARB programObj); GLAPI void APIENTRY glValidateProgramARB (GLhandleARB programObj); GLAPI void APIENTRY glUniform1fARB (GLint location, GLfloat v0); GLAPI void APIENTRY glUniform2fARB (GLint location, GLfloat v0, GLfloat v1); GLAPI void APIENTRY glUniform3fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); GLAPI void APIENTRY glUniform4fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); GLAPI void APIENTRY glUniform1iARB (GLint location, GLint v0); GLAPI void APIENTRY glUniform2iARB (GLint location, GLint v0, GLint v1); GLAPI void APIENTRY glUniform3iARB (GLint location, GLint v0, GLint v1, GLint v2); GLAPI void APIENTRY glUniform4iARB (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); GLAPI void APIENTRY glUniform1fvARB (GLint location, GLsizei count, const GLfloat *value); GLAPI void APIENTRY glUniform2fvARB (GLint location, GLsizei count, const GLfloat *value); GLAPI void APIENTRY glUniform3fvARB (GLint location, GLsizei count, const GLfloat *value); GLAPI void APIENTRY glUniform4fvARB (GLint location, GLsizei count, const GLfloat *value); GLAPI void APIENTRY glUniform1ivARB (GLint location, GLsizei count, const GLint *value); GLAPI void APIENTRY glUniform2ivARB (GLint location, GLsizei count, const GLint *value); GLAPI void APIENTRY glUniform3ivARB (GLint location, GLsizei count, const GLint *value); GLAPI void APIENTRY glUniform4ivARB (GLint location, GLsizei count, const GLint *value); GLAPI void APIENTRY glUniformMatrix2fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glUniformMatrix3fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glUniformMatrix4fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glGetObjectParameterfvARB (GLhandleARB obj, GLenum pname, GLfloat *params); GLAPI void APIENTRY glGetObjectParameterivARB (GLhandleARB obj, GLenum pname, GLint *params); GLAPI void APIENTRY glGetInfoLogARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); GLAPI void APIENTRY glGetAttachedObjectsARB (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); GLAPI GLint APIENTRY glGetUniformLocationARB (GLhandleARB programObj, const GLcharARB *name); GLAPI void APIENTRY glGetActiveUniformARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); GLAPI void APIENTRY glGetUniformfvARB (GLhandleARB programObj, GLint location, GLfloat *params); GLAPI void APIENTRY glGetUniformivARB (GLhandleARB programObj, GLint location, GLint *params); GLAPI void APIENTRY glGetShaderSourceARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); #endif #endif /* GL_ARB_shader_objects */ #ifndef GL_ARB_shader_precision #define GL_ARB_shader_precision 1 #endif /* GL_ARB_shader_precision */ #ifndef GL_ARB_shader_stencil_export #define GL_ARB_shader_stencil_export 1 #endif /* GL_ARB_shader_stencil_export */ #ifndef GL_ARB_shader_storage_buffer_object #define GL_ARB_shader_storage_buffer_object 1 #endif /* GL_ARB_shader_storage_buffer_object */ #ifndef GL_ARB_shader_subroutine #define GL_ARB_shader_subroutine 1 #endif /* GL_ARB_shader_subroutine */ #ifndef GL_ARB_shader_texture_image_samples #define GL_ARB_shader_texture_image_samples 1 #endif /* GL_ARB_shader_texture_image_samples */ #ifndef GL_ARB_shader_texture_lod #define GL_ARB_shader_texture_lod 1 #endif /* GL_ARB_shader_texture_lod */ #ifndef GL_ARB_shading_language_100 #define GL_ARB_shading_language_100 1 #define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C #endif /* GL_ARB_shading_language_100 */ #ifndef GL_ARB_shading_language_420pack #define GL_ARB_shading_language_420pack 1 #endif /* GL_ARB_shading_language_420pack */ #ifndef GL_ARB_shading_language_include #define GL_ARB_shading_language_include 1 #define GL_SHADER_INCLUDE_ARB 0x8DAE #define GL_NAMED_STRING_LENGTH_ARB 0x8DE9 #define GL_NAMED_STRING_TYPE_ARB 0x8DEA typedef void (APIENTRYP PFNGLNAMEDSTRINGARBPROC) (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string); typedef void (APIENTRYP PFNGLDELETENAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name); typedef void (APIENTRYP PFNGLCOMPILESHADERINCLUDEARBPROC) (GLuint shader, GLsizei count, const GLchar *const*path, const GLint *length); typedef GLboolean (APIENTRYP PFNGLISNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name); typedef void (APIENTRYP PFNGLGETNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string); typedef void (APIENTRYP PFNGLGETNAMEDSTRINGIVARBPROC) (GLint namelen, const GLchar *name, GLenum pname, GLint *params); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glNamedStringARB (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string); GLAPI void APIENTRY glDeleteNamedStringARB (GLint namelen, const GLchar *name); GLAPI void APIENTRY glCompileShaderIncludeARB (GLuint shader, GLsizei count, const GLchar *const*path, const GLint *length); GLAPI GLboolean APIENTRY glIsNamedStringARB (GLint namelen, const GLchar *name); GLAPI void APIENTRY glGetNamedStringARB (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string); GLAPI void APIENTRY glGetNamedStringivARB (GLint namelen, const GLchar *name, GLenum pname, GLint *params); #endif #endif /* GL_ARB_shading_language_include */ #ifndef GL_ARB_shading_language_packing #define GL_ARB_shading_language_packing 1 #endif /* GL_ARB_shading_language_packing */ #ifndef GL_ARB_shadow #define GL_ARB_shadow 1 #define GL_TEXTURE_COMPARE_MODE_ARB 0x884C #define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D #define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E #endif /* GL_ARB_shadow */ #ifndef GL_ARB_shadow_ambient #define GL_ARB_shadow_ambient 1 #define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF #endif /* GL_ARB_shadow_ambient */ #ifndef GL_ARB_sparse_buffer #define GL_ARB_sparse_buffer 1 #define GL_SPARSE_STORAGE_BIT_ARB 0x0400 #define GL_SPARSE_BUFFER_PAGE_SIZE_ARB 0x82F8 typedef void (APIENTRYP PFNGLBUFFERPAGECOMMITMENTARBPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLboolean commit); typedef void (APIENTRYP PFNGLNAMEDBUFFERPAGECOMMITMENTEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit); typedef void (APIENTRYP PFNGLNAMEDBUFFERPAGECOMMITMENTARBPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBufferPageCommitmentARB (GLenum target, GLintptr offset, GLsizeiptr size, GLboolean commit); GLAPI void APIENTRY glNamedBufferPageCommitmentEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit); GLAPI void APIENTRY glNamedBufferPageCommitmentARB (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit); #endif #endif /* GL_ARB_sparse_buffer */ #ifndef GL_ARB_sparse_texture #define GL_ARB_sparse_texture 1 #define GL_TEXTURE_SPARSE_ARB 0x91A6 #define GL_VIRTUAL_PAGE_SIZE_INDEX_ARB 0x91A7 #define GL_NUM_SPARSE_LEVELS_ARB 0x91AA #define GL_NUM_VIRTUAL_PAGE_SIZES_ARB 0x91A8 #define GL_VIRTUAL_PAGE_SIZE_X_ARB 0x9195 #define GL_VIRTUAL_PAGE_SIZE_Y_ARB 0x9196 #define GL_VIRTUAL_PAGE_SIZE_Z_ARB 0x9197 #define GL_MAX_SPARSE_TEXTURE_SIZE_ARB 0x9198 #define GL_MAX_SPARSE_3D_TEXTURE_SIZE_ARB 0x9199 #define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_ARB 0x919A #define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_ARB 0x91A9 typedef void (APIENTRYP PFNGLTEXPAGECOMMITMENTARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean resident); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glTexPageCommitmentARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean resident); #endif #endif /* GL_ARB_sparse_texture */ #ifndef GL_ARB_stencil_texturing #define GL_ARB_stencil_texturing 1 #endif /* GL_ARB_stencil_texturing */ #ifndef GL_ARB_sync #define GL_ARB_sync 1 #endif /* GL_ARB_sync */ #ifndef GL_ARB_tessellation_shader #define GL_ARB_tessellation_shader 1 #endif /* GL_ARB_tessellation_shader */ #ifndef GL_ARB_texture_barrier #define GL_ARB_texture_barrier 1 #endif /* GL_ARB_texture_barrier */ #ifndef GL_ARB_texture_border_clamp #define GL_ARB_texture_border_clamp 1 #define GL_CLAMP_TO_BORDER_ARB 0x812D #endif /* GL_ARB_texture_border_clamp */ #ifndef GL_ARB_texture_buffer_object #define GL_ARB_texture_buffer_object 1 #define GL_TEXTURE_BUFFER_ARB 0x8C2A #define GL_MAX_TEXTURE_BUFFER_SIZE_ARB 0x8C2B #define GL_TEXTURE_BINDING_BUFFER_ARB 0x8C2C #define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB 0x8C2D #define GL_TEXTURE_BUFFER_FORMAT_ARB 0x8C2E typedef void (APIENTRYP PFNGLTEXBUFFERARBPROC) (GLenum target, GLenum internalformat, GLuint buffer); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glTexBufferARB (GLenum target, GLenum internalformat, GLuint buffer); #endif #endif /* GL_ARB_texture_buffer_object */ #ifndef GL_ARB_texture_buffer_object_rgb32 #define GL_ARB_texture_buffer_object_rgb32 1 #endif /* GL_ARB_texture_buffer_object_rgb32 */ #ifndef GL_ARB_texture_buffer_range #define GL_ARB_texture_buffer_range 1 #endif /* GL_ARB_texture_buffer_range */ #ifndef GL_ARB_texture_compression #define GL_ARB_texture_compression 1 #define GL_COMPRESSED_ALPHA_ARB 0x84E9 #define GL_COMPRESSED_LUMINANCE_ARB 0x84EA #define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB #define GL_COMPRESSED_INTENSITY_ARB 0x84EC #define GL_COMPRESSED_RGB_ARB 0x84ED #define GL_COMPRESSED_RGBA_ARB 0x84EE #define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF #define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 #define GL_TEXTURE_COMPRESSED_ARB 0x86A1 #define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 #define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint level, void *img); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glCompressedTexImage3DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); GLAPI void APIENTRY glCompressedTexImage2DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); GLAPI void APIENTRY glCompressedTexImage1DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); GLAPI void APIENTRY glCompressedTexSubImage3DARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); GLAPI void APIENTRY glCompressedTexSubImage2DARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); GLAPI void APIENTRY glCompressedTexSubImage1DARB (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); GLAPI void APIENTRY glGetCompressedTexImageARB (GLenum target, GLint level, void *img); #endif #endif /* GL_ARB_texture_compression */ #ifndef GL_ARB_texture_compression_bptc #define GL_ARB_texture_compression_bptc 1 #define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C #define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D #define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E #define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F #endif /* GL_ARB_texture_compression_bptc */ #ifndef GL_ARB_texture_compression_rgtc #define GL_ARB_texture_compression_rgtc 1 #endif /* GL_ARB_texture_compression_rgtc */ #ifndef GL_ARB_texture_cube_map #define GL_ARB_texture_cube_map 1 #define GL_NORMAL_MAP_ARB 0x8511 #define GL_REFLECTION_MAP_ARB 0x8512 #define GL_TEXTURE_CUBE_MAP_ARB 0x8513 #define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 #define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A #define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B #define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C #endif /* GL_ARB_texture_cube_map */ #ifndef GL_ARB_texture_cube_map_array #define GL_ARB_texture_cube_map_array 1 #define GL_TEXTURE_CUBE_MAP_ARRAY_ARB 0x9009 #define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 0x900A #define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB 0x900B #define GL_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900C #define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D #define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E #define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F #endif /* GL_ARB_texture_cube_map_array */ #ifndef GL_ARB_texture_env_add #define GL_ARB_texture_env_add 1 #endif /* GL_ARB_texture_env_add */ #ifndef GL_ARB_texture_env_combine #define GL_ARB_texture_env_combine 1 #define GL_COMBINE_ARB 0x8570 #define GL_COMBINE_RGB_ARB 0x8571 #define GL_COMBINE_ALPHA_ARB 0x8572 #define GL_SOURCE0_RGB_ARB 0x8580 #define GL_SOURCE1_RGB_ARB 0x8581 #define GL_SOURCE2_RGB_ARB 0x8582 #define GL_SOURCE0_ALPHA_ARB 0x8588 #define GL_SOURCE1_ALPHA_ARB 0x8589 #define GL_SOURCE2_ALPHA_ARB 0x858A #define GL_OPERAND0_RGB_ARB 0x8590 #define GL_OPERAND1_RGB_ARB 0x8591 #define GL_OPERAND2_RGB_ARB 0x8592 #define GL_OPERAND0_ALPHA_ARB 0x8598 #define GL_OPERAND1_ALPHA_ARB 0x8599 #define GL_OPERAND2_ALPHA_ARB 0x859A #define GL_RGB_SCALE_ARB 0x8573 #define GL_ADD_SIGNED_ARB 0x8574 #define GL_INTERPOLATE_ARB 0x8575 #define GL_SUBTRACT_ARB 0x84E7 #define GL_CONSTANT_ARB 0x8576 #define GL_PRIMARY_COLOR_ARB 0x8577 #define GL_PREVIOUS_ARB 0x8578 #endif /* GL_ARB_texture_env_combine */ #ifndef GL_ARB_texture_env_crossbar #define GL_ARB_texture_env_crossbar 1 #endif /* GL_ARB_texture_env_crossbar */ #ifndef GL_ARB_texture_env_dot3 #define GL_ARB_texture_env_dot3 1 #define GL_DOT3_RGB_ARB 0x86AE #define GL_DOT3_RGBA_ARB 0x86AF #endif /* GL_ARB_texture_env_dot3 */ #ifndef GL_ARB_texture_float #define GL_ARB_texture_float 1 #define GL_TEXTURE_RED_TYPE_ARB 0x8C10 #define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11 #define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12 #define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13 #define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14 #define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15 #define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16 #define GL_UNSIGNED_NORMALIZED_ARB 0x8C17 #define GL_RGBA32F_ARB 0x8814 #define GL_RGB32F_ARB 0x8815 #define GL_ALPHA32F_ARB 0x8816 #define GL_INTENSITY32F_ARB 0x8817 #define GL_LUMINANCE32F_ARB 0x8818 #define GL_LUMINANCE_ALPHA32F_ARB 0x8819 #define GL_RGBA16F_ARB 0x881A #define GL_RGB16F_ARB 0x881B #define GL_ALPHA16F_ARB 0x881C #define GL_INTENSITY16F_ARB 0x881D #define GL_LUMINANCE16F_ARB 0x881E #define GL_LUMINANCE_ALPHA16F_ARB 0x881F #endif /* GL_ARB_texture_float */ #ifndef GL_ARB_texture_gather #define GL_ARB_texture_gather 1 #define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5E #define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5F #define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB 0x8F9F #endif /* GL_ARB_texture_gather */ #ifndef GL_ARB_texture_mirror_clamp_to_edge #define GL_ARB_texture_mirror_clamp_to_edge 1 #endif /* GL_ARB_texture_mirror_clamp_to_edge */ #ifndef GL_ARB_texture_mirrored_repeat #define GL_ARB_texture_mirrored_repeat 1 #define GL_MIRRORED_REPEAT_ARB 0x8370 #endif /* GL_ARB_texture_mirrored_repeat */ #ifndef GL_ARB_texture_multisample #define GL_ARB_texture_multisample 1 #endif /* GL_ARB_texture_multisample */ #ifndef GL_ARB_texture_non_power_of_two #define GL_ARB_texture_non_power_of_two 1 #endif /* GL_ARB_texture_non_power_of_two */ #ifndef GL_ARB_texture_query_levels #define GL_ARB_texture_query_levels 1 #endif /* GL_ARB_texture_query_levels */ #ifndef GL_ARB_texture_query_lod #define GL_ARB_texture_query_lod 1 #endif /* GL_ARB_texture_query_lod */ #ifndef GL_ARB_texture_rectangle #define GL_ARB_texture_rectangle 1 #define GL_TEXTURE_RECTANGLE_ARB 0x84F5 #define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 #define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 #define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 #endif /* GL_ARB_texture_rectangle */ #ifndef GL_ARB_texture_rg #define GL_ARB_texture_rg 1 #endif /* GL_ARB_texture_rg */ #ifndef GL_ARB_texture_rgb10_a2ui #define GL_ARB_texture_rgb10_a2ui 1 #endif /* GL_ARB_texture_rgb10_a2ui */ #ifndef GL_ARB_texture_stencil8 #define GL_ARB_texture_stencil8 1 #endif /* GL_ARB_texture_stencil8 */ #ifndef GL_ARB_texture_storage #define GL_ARB_texture_storage 1 #endif /* GL_ARB_texture_storage */ #ifndef GL_ARB_texture_storage_multisample #define GL_ARB_texture_storage_multisample 1 #endif /* GL_ARB_texture_storage_multisample */ #ifndef GL_ARB_texture_swizzle #define GL_ARB_texture_swizzle 1 #endif /* GL_ARB_texture_swizzle */ #ifndef GL_ARB_texture_view #define GL_ARB_texture_view 1 #endif /* GL_ARB_texture_view */ #ifndef GL_ARB_timer_query #define GL_ARB_timer_query 1 #endif /* GL_ARB_timer_query */ #ifndef GL_ARB_transform_feedback2 #define GL_ARB_transform_feedback2 1 #endif /* GL_ARB_transform_feedback2 */ #ifndef GL_ARB_transform_feedback3 #define GL_ARB_transform_feedback3 1 #endif /* GL_ARB_transform_feedback3 */ #ifndef GL_ARB_transform_feedback_instanced #define GL_ARB_transform_feedback_instanced 1 #endif /* GL_ARB_transform_feedback_instanced */ #ifndef GL_ARB_transform_feedback_overflow_query #define GL_ARB_transform_feedback_overflow_query 1 #define GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB 0x82EC #define GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB 0x82ED #endif /* GL_ARB_transform_feedback_overflow_query */ #ifndef GL_ARB_transpose_matrix #define GL_ARB_transpose_matrix 1 #define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 #define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 #define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 #define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glLoadTransposeMatrixfARB (const GLfloat *m); GLAPI void APIENTRY glLoadTransposeMatrixdARB (const GLdouble *m); GLAPI void APIENTRY glMultTransposeMatrixfARB (const GLfloat *m); GLAPI void APIENTRY glMultTransposeMatrixdARB (const GLdouble *m); #endif #endif /* GL_ARB_transpose_matrix */ #ifndef GL_ARB_uniform_buffer_object #define GL_ARB_uniform_buffer_object 1 #endif /* GL_ARB_uniform_buffer_object */ #ifndef GL_ARB_vertex_array_bgra #define GL_ARB_vertex_array_bgra 1 #endif /* GL_ARB_vertex_array_bgra */ #ifndef GL_ARB_vertex_array_object #define GL_ARB_vertex_array_object 1 #endif /* GL_ARB_vertex_array_object */ #ifndef GL_ARB_vertex_attrib_64bit #define GL_ARB_vertex_attrib_64bit 1 #endif /* GL_ARB_vertex_attrib_64bit */ #ifndef GL_ARB_vertex_attrib_binding #define GL_ARB_vertex_attrib_binding 1 #endif /* GL_ARB_vertex_attrib_binding */ #ifndef GL_ARB_vertex_blend #define GL_ARB_vertex_blend 1 #define GL_MAX_VERTEX_UNITS_ARB 0x86A4 #define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 #define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 #define GL_VERTEX_BLEND_ARB 0x86A7 #define GL_CURRENT_WEIGHT_ARB 0x86A8 #define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 #define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA #define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB #define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC #define GL_WEIGHT_ARRAY_ARB 0x86AD #define GL_MODELVIEW0_ARB 0x1700 #define GL_MODELVIEW1_ARB 0x850A #define GL_MODELVIEW2_ARB 0x8722 #define GL_MODELVIEW3_ARB 0x8723 #define GL_MODELVIEW4_ARB 0x8724 #define GL_MODELVIEW5_ARB 0x8725 #define GL_MODELVIEW6_ARB 0x8726 #define GL_MODELVIEW7_ARB 0x8727 #define GL_MODELVIEW8_ARB 0x8728 #define GL_MODELVIEW9_ARB 0x8729 #define GL_MODELVIEW10_ARB 0x872A #define GL_MODELVIEW11_ARB 0x872B #define GL_MODELVIEW12_ARB 0x872C #define GL_MODELVIEW13_ARB 0x872D #define GL_MODELVIEW14_ARB 0x872E #define GL_MODELVIEW15_ARB 0x872F #define GL_MODELVIEW16_ARB 0x8730 #define GL_MODELVIEW17_ARB 0x8731 #define GL_MODELVIEW18_ARB 0x8732 #define GL_MODELVIEW19_ARB 0x8733 #define GL_MODELVIEW20_ARB 0x8734 #define GL_MODELVIEW21_ARB 0x8735 #define GL_MODELVIEW22_ARB 0x8736 #define GL_MODELVIEW23_ARB 0x8737 #define GL_MODELVIEW24_ARB 0x8738 #define GL_MODELVIEW25_ARB 0x8739 #define GL_MODELVIEW26_ARB 0x873A #define GL_MODELVIEW27_ARB 0x873B #define GL_MODELVIEW28_ARB 0x873C #define GL_MODELVIEW29_ARB 0x873D #define GL_MODELVIEW30_ARB 0x873E #define GL_MODELVIEW31_ARB 0x873F typedef void (APIENTRYP PFNGLWEIGHTBVARBPROC) (GLint size, const GLbyte *weights); typedef void (APIENTRYP PFNGLWEIGHTSVARBPROC) (GLint size, const GLshort *weights); typedef void (APIENTRYP PFNGLWEIGHTIVARBPROC) (GLint size, const GLint *weights); typedef void (APIENTRYP PFNGLWEIGHTFVARBPROC) (GLint size, const GLfloat *weights); typedef void (APIENTRYP PFNGLWEIGHTDVARBPROC) (GLint size, const GLdouble *weights); typedef void (APIENTRYP PFNGLWEIGHTUBVARBPROC) (GLint size, const GLubyte *weights); typedef void (APIENTRYP PFNGLWEIGHTUSVARBPROC) (GLint size, const GLushort *weights); typedef void (APIENTRYP PFNGLWEIGHTUIVARBPROC) (GLint size, const GLuint *weights); typedef void (APIENTRYP PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); typedef void (APIENTRYP PFNGLVERTEXBLENDARBPROC) (GLint count); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glWeightbvARB (GLint size, const GLbyte *weights); GLAPI void APIENTRY glWeightsvARB (GLint size, const GLshort *weights); GLAPI void APIENTRY glWeightivARB (GLint size, const GLint *weights); GLAPI void APIENTRY glWeightfvARB (GLint size, const GLfloat *weights); GLAPI void APIENTRY glWeightdvARB (GLint size, const GLdouble *weights); GLAPI void APIENTRY glWeightubvARB (GLint size, const GLubyte *weights); GLAPI void APIENTRY glWeightusvARB (GLint size, const GLushort *weights); GLAPI void APIENTRY glWeightuivARB (GLint size, const GLuint *weights); GLAPI void APIENTRY glWeightPointerARB (GLint size, GLenum type, GLsizei stride, const void *pointer); GLAPI void APIENTRY glVertexBlendARB (GLint count); #endif #endif /* GL_ARB_vertex_blend */ #ifndef GL_ARB_vertex_buffer_object #define GL_ARB_vertex_buffer_object 1 typedef ptrdiff_t GLsizeiptrARB; typedef ptrdiff_t GLintptrARB; #define GL_BUFFER_SIZE_ARB 0x8764 #define GL_BUFFER_USAGE_ARB 0x8765 #define GL_ARRAY_BUFFER_ARB 0x8892 #define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 #define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 #define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 #define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 #define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 #define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 #define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 #define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A #define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B #define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C #define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D #define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E #define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F #define GL_READ_ONLY_ARB 0x88B8 #define GL_WRITE_ONLY_ARB 0x88B9 #define GL_READ_WRITE_ARB 0x88BA #define GL_BUFFER_ACCESS_ARB 0x88BB #define GL_BUFFER_MAPPED_ARB 0x88BC #define GL_BUFFER_MAP_POINTER_ARB 0x88BD #define GL_STREAM_DRAW_ARB 0x88E0 #define GL_STREAM_READ_ARB 0x88E1 #define GL_STREAM_COPY_ARB 0x88E2 #define GL_STATIC_DRAW_ARB 0x88E4 #define GL_STATIC_READ_ARB 0x88E5 #define GL_STATIC_COPY_ARB 0x88E6 #define GL_DYNAMIC_DRAW_ARB 0x88E8 #define GL_DYNAMIC_READ_ARB 0x88E9 #define GL_DYNAMIC_COPY_ARB 0x88EA typedef void (APIENTRYP PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); typedef void (APIENTRYP PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers); typedef void (APIENTRYP PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint *buffers); typedef GLboolean (APIENTRYP PFNGLISBUFFERARBPROC) (GLuint buffer); typedef void (APIENTRYP PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const void *data, GLenum usage); typedef void (APIENTRYP PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void *data); typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, void *data); typedef void *(APIENTRYP PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERARBPROC) (GLenum target); typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, void **params); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBindBufferARB (GLenum target, GLuint buffer); GLAPI void APIENTRY glDeleteBuffersARB (GLsizei n, const GLuint *buffers); GLAPI void APIENTRY glGenBuffersARB (GLsizei n, GLuint *buffers); GLAPI GLboolean APIENTRY glIsBufferARB (GLuint buffer); GLAPI void APIENTRY glBufferDataARB (GLenum target, GLsizeiptrARB size, const void *data, GLenum usage); GLAPI void APIENTRY glBufferSubDataARB (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void *data); GLAPI void APIENTRY glGetBufferSubDataARB (GLenum target, GLintptrARB offset, GLsizeiptrARB size, void *data); GLAPI void *APIENTRY glMapBufferARB (GLenum target, GLenum access); GLAPI GLboolean APIENTRY glUnmapBufferARB (GLenum target); GLAPI void APIENTRY glGetBufferParameterivARB (GLenum target, GLenum pname, GLint *params); GLAPI void APIENTRY glGetBufferPointervARB (GLenum target, GLenum pname, void **params); #endif #endif /* GL_ARB_vertex_buffer_object */ #ifndef GL_ARB_vertex_program #define GL_ARB_vertex_program 1 #define GL_COLOR_SUM_ARB 0x8458 #define GL_VERTEX_PROGRAM_ARB 0x8620 #define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 #define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 #define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 #define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 #define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 #define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 #define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 #define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 #define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 #define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A #define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 #define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 #define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 #define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 typedef void (APIENTRYP PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble *params); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, void **pointer); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glVertexAttrib1dARB (GLuint index, GLdouble x); GLAPI void APIENTRY glVertexAttrib1dvARB (GLuint index, const GLdouble *v); GLAPI void APIENTRY glVertexAttrib1fARB (GLuint index, GLfloat x); GLAPI void APIENTRY glVertexAttrib1fvARB (GLuint index, const GLfloat *v); GLAPI void APIENTRY glVertexAttrib1sARB (GLuint index, GLshort x); GLAPI void APIENTRY glVertexAttrib1svARB (GLuint index, const GLshort *v); GLAPI void APIENTRY glVertexAttrib2dARB (GLuint index, GLdouble x, GLdouble y); GLAPI void APIENTRY glVertexAttrib2dvARB (GLuint index, const GLdouble *v); GLAPI void APIENTRY glVertexAttrib2fARB (GLuint index, GLfloat x, GLfloat y); GLAPI void APIENTRY glVertexAttrib2fvARB (GLuint index, const GLfloat *v); GLAPI void APIENTRY glVertexAttrib2sARB (GLuint index, GLshort x, GLshort y); GLAPI void APIENTRY glVertexAttrib2svARB (GLuint index, const GLshort *v); GLAPI void APIENTRY glVertexAttrib3dARB (GLuint index, GLdouble x, GLdouble y, GLdouble z); GLAPI void APIENTRY glVertexAttrib3dvARB (GLuint index, const GLdouble *v); GLAPI void APIENTRY glVertexAttrib3fARB (GLuint index, GLfloat x, GLfloat y, GLfloat z); GLAPI void APIENTRY glVertexAttrib3fvARB (GLuint index, const GLfloat *v); GLAPI void APIENTRY glVertexAttrib3sARB (GLuint index, GLshort x, GLshort y, GLshort z); GLAPI void APIENTRY glVertexAttrib3svARB (GLuint index, const GLshort *v); GLAPI void APIENTRY glVertexAttrib4NbvARB (GLuint index, const GLbyte *v); GLAPI void APIENTRY glVertexAttrib4NivARB (GLuint index, const GLint *v); GLAPI void APIENTRY glVertexAttrib4NsvARB (GLuint index, const GLshort *v); GLAPI void APIENTRY glVertexAttrib4NubARB (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); GLAPI void APIENTRY glVertexAttrib4NubvARB (GLuint index, const GLubyte *v); GLAPI void APIENTRY glVertexAttrib4NuivARB (GLuint index, const GLuint *v); GLAPI void APIENTRY glVertexAttrib4NusvARB (GLuint index, const GLushort *v); GLAPI void APIENTRY glVertexAttrib4bvARB (GLuint index, const GLbyte *v); GLAPI void APIENTRY glVertexAttrib4dARB (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); GLAPI void APIENTRY glVertexAttrib4dvARB (GLuint index, const GLdouble *v); GLAPI void APIENTRY glVertexAttrib4fARB (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); GLAPI void APIENTRY glVertexAttrib4fvARB (GLuint index, const GLfloat *v); GLAPI void APIENTRY glVertexAttrib4ivARB (GLuint index, const GLint *v); GLAPI void APIENTRY glVertexAttrib4sARB (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); GLAPI void APIENTRY glVertexAttrib4svARB (GLuint index, const GLshort *v); GLAPI void APIENTRY glVertexAttrib4ubvARB (GLuint index, const GLubyte *v); GLAPI void APIENTRY glVertexAttrib4uivARB (GLuint index, const GLuint *v); GLAPI void APIENTRY glVertexAttrib4usvARB (GLuint index, const GLushort *v); GLAPI void APIENTRY glVertexAttribPointerARB (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); GLAPI void APIENTRY glEnableVertexAttribArrayARB (GLuint index); GLAPI void APIENTRY glDisableVertexAttribArrayARB (GLuint index); GLAPI void APIENTRY glGetVertexAttribdvARB (GLuint index, GLenum pname, GLdouble *params); GLAPI void APIENTRY glGetVertexAttribfvARB (GLuint index, GLenum pname, GLfloat *params); GLAPI void APIENTRY glGetVertexAttribivARB (GLuint index, GLenum pname, GLint *params); GLAPI void APIENTRY glGetVertexAttribPointervARB (GLuint index, GLenum pname, void **pointer); #endif #endif /* GL_ARB_vertex_program */ #ifndef GL_ARB_vertex_shader #define GL_ARB_vertex_shader 1 #define GL_VERTEX_SHADER_ARB 0x8B31 #define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A #define GL_MAX_VARYING_FLOATS_ARB 0x8B4B #define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C #define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D #define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 #define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB *name); typedef void (APIENTRYP PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBindAttribLocationARB (GLhandleARB programObj, GLuint index, const GLcharARB *name); GLAPI void APIENTRY glGetActiveAttribARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); GLAPI GLint APIENTRY glGetAttribLocationARB (GLhandleARB programObj, const GLcharARB *name); #endif #endif /* GL_ARB_vertex_shader */ #ifndef GL_ARB_vertex_type_10f_11f_11f_rev #define GL_ARB_vertex_type_10f_11f_11f_rev 1 #endif /* GL_ARB_vertex_type_10f_11f_11f_rev */ #ifndef GL_ARB_vertex_type_2_10_10_10_rev #define GL_ARB_vertex_type_2_10_10_10_rev 1 #endif /* GL_ARB_vertex_type_2_10_10_10_rev */ #ifndef GL_ARB_viewport_array #define GL_ARB_viewport_array 1 #endif /* GL_ARB_viewport_array */ #ifndef GL_ARB_window_pos #define GL_ARB_window_pos 1 typedef void (APIENTRYP PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); typedef void (APIENTRYP PFNGLWINDOWPOS2DVARBPROC) (const GLdouble *v); typedef void (APIENTRYP PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); typedef void (APIENTRYP PFNGLWINDOWPOS2FVARBPROC) (const GLfloat *v); typedef void (APIENTRYP PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); typedef void (APIENTRYP PFNGLWINDOWPOS2IVARBPROC) (const GLint *v); typedef void (APIENTRYP PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); typedef void (APIENTRYP PFNGLWINDOWPOS2SVARBPROC) (const GLshort *v); typedef void (APIENTRYP PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); typedef void (APIENTRYP PFNGLWINDOWPOS3DVARBPROC) (const GLdouble *v); typedef void (APIENTRYP PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLWINDOWPOS3FVARBPROC) (const GLfloat *v); typedef void (APIENTRYP PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); typedef void (APIENTRYP PFNGLWINDOWPOS3IVARBPROC) (const GLint *v); typedef void (APIENTRYP PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); typedef void (APIENTRYP PFNGLWINDOWPOS3SVARBPROC) (const GLshort *v); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glWindowPos2dARB (GLdouble x, GLdouble y); GLAPI void APIENTRY glWindowPos2dvARB (const GLdouble *v); GLAPI void APIENTRY glWindowPos2fARB (GLfloat x, GLfloat y); GLAPI void APIENTRY glWindowPos2fvARB (const GLfloat *v); GLAPI void APIENTRY glWindowPos2iARB (GLint x, GLint y); GLAPI void APIENTRY glWindowPos2ivARB (const GLint *v); GLAPI void APIENTRY glWindowPos2sARB (GLshort x, GLshort y); GLAPI void APIENTRY glWindowPos2svARB (const GLshort *v); GLAPI void APIENTRY glWindowPos3dARB (GLdouble x, GLdouble y, GLdouble z); GLAPI void APIENTRY glWindowPos3dvARB (const GLdouble *v); GLAPI void APIENTRY glWindowPos3fARB (GLfloat x, GLfloat y, GLfloat z); GLAPI void APIENTRY glWindowPos3fvARB (const GLfloat *v); GLAPI void APIENTRY glWindowPos3iARB (GLint x, GLint y, GLint z); GLAPI void APIENTRY glWindowPos3ivARB (const GLint *v); GLAPI void APIENTRY glWindowPos3sARB (GLshort x, GLshort y, GLshort z); GLAPI void APIENTRY glWindowPos3svARB (const GLshort *v); #endif #endif /* GL_ARB_window_pos */ #ifndef GL_KHR_blend_equation_advanced #define GL_KHR_blend_equation_advanced 1 #define GL_MULTIPLY_KHR 0x9294 #define GL_SCREEN_KHR 0x9295 #define GL_OVERLAY_KHR 0x9296 #define GL_DARKEN_KHR 0x9297 #define GL_LIGHTEN_KHR 0x9298 #define GL_COLORDODGE_KHR 0x9299 #define GL_COLORBURN_KHR 0x929A #define GL_HARDLIGHT_KHR 0x929B #define GL_SOFTLIGHT_KHR 0x929C #define GL_DIFFERENCE_KHR 0x929E #define GL_EXCLUSION_KHR 0x92A0 #define GL_HSL_HUE_KHR 0x92AD #define GL_HSL_SATURATION_KHR 0x92AE #define GL_HSL_COLOR_KHR 0x92AF #define GL_HSL_LUMINOSITY_KHR 0x92B0 typedef void (APIENTRYP PFNGLBLENDBARRIERKHRPROC) (void); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBlendBarrierKHR (void); #endif #endif /* GL_KHR_blend_equation_advanced */ #ifndef GL_KHR_blend_equation_advanced_coherent #define GL_KHR_blend_equation_advanced_coherent 1 #define GL_BLEND_ADVANCED_COHERENT_KHR 0x9285 #endif /* GL_KHR_blend_equation_advanced_coherent */ #ifndef GL_KHR_context_flush_control #define GL_KHR_context_flush_control 1 #endif /* GL_KHR_context_flush_control */ #ifndef GL_KHR_debug #define GL_KHR_debug 1 #endif /* GL_KHR_debug */ #ifndef GL_KHR_robust_buffer_access_behavior #define GL_KHR_robust_buffer_access_behavior 1 #endif /* GL_KHR_robust_buffer_access_behavior */ #ifndef GL_KHR_robustness #define GL_KHR_robustness 1 #define GL_CONTEXT_ROBUST_ACCESS 0x90F3 #endif /* GL_KHR_robustness */ #ifndef GL_KHR_texture_compression_astc_hdr #define GL_KHR_texture_compression_astc_hdr 1 #define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 #define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 #define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 #define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 #define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 #define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 #define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 #define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 #define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 #define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 #define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA #define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB #define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC #define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC #define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD #endif /* GL_KHR_texture_compression_astc_hdr */ #ifndef GL_KHR_texture_compression_astc_ldr #define GL_KHR_texture_compression_astc_ldr 1 #endif /* GL_KHR_texture_compression_astc_ldr */ #ifndef GL_OES_byte_coordinates #define GL_OES_byte_coordinates 1 typedef void (APIENTRYP PFNGLMULTITEXCOORD1BOESPROC) (GLenum texture, GLbyte s); typedef void (APIENTRYP PFNGLMULTITEXCOORD1BVOESPROC) (GLenum texture, const GLbyte *coords); typedef void (APIENTRYP PFNGLMULTITEXCOORD2BOESPROC) (GLenum texture, GLbyte s, GLbyte t); typedef void (APIENTRYP PFNGLMULTITEXCOORD2BVOESPROC) (GLenum texture, const GLbyte *coords); typedef void (APIENTRYP PFNGLMULTITEXCOORD3BOESPROC) (GLenum texture, GLbyte s, GLbyte t, GLbyte r); typedef void (APIENTRYP PFNGLMULTITEXCOORD3BVOESPROC) (GLenum texture, const GLbyte *coords); typedef void (APIENTRYP PFNGLMULTITEXCOORD4BOESPROC) (GLenum texture, GLbyte s, GLbyte t, GLbyte r, GLbyte q); typedef void (APIENTRYP PFNGLMULTITEXCOORD4BVOESPROC) (GLenum texture, const GLbyte *coords); typedef void (APIENTRYP PFNGLTEXCOORD1BOESPROC) (GLbyte s); typedef void (APIENTRYP PFNGLTEXCOORD1BVOESPROC) (const GLbyte *coords); typedef void (APIENTRYP PFNGLTEXCOORD2BOESPROC) (GLbyte s, GLbyte t); typedef void (APIENTRYP PFNGLTEXCOORD2BVOESPROC) (const GLbyte *coords); typedef void (APIENTRYP PFNGLTEXCOORD3BOESPROC) (GLbyte s, GLbyte t, GLbyte r); typedef void (APIENTRYP PFNGLTEXCOORD3BVOESPROC) (const GLbyte *coords); typedef void (APIENTRYP PFNGLTEXCOORD4BOESPROC) (GLbyte s, GLbyte t, GLbyte r, GLbyte q); typedef void (APIENTRYP PFNGLTEXCOORD4BVOESPROC) (const GLbyte *coords); typedef void (APIENTRYP PFNGLVERTEX2BOESPROC) (GLbyte x, GLbyte y); typedef void (APIENTRYP PFNGLVERTEX2BVOESPROC) (const GLbyte *coords); typedef void (APIENTRYP PFNGLVERTEX3BOESPROC) (GLbyte x, GLbyte y, GLbyte z); typedef void (APIENTRYP PFNGLVERTEX3BVOESPROC) (const GLbyte *coords); typedef void (APIENTRYP PFNGLVERTEX4BOESPROC) (GLbyte x, GLbyte y, GLbyte z, GLbyte w); typedef void (APIENTRYP PFNGLVERTEX4BVOESPROC) (const GLbyte *coords); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glMultiTexCoord1bOES (GLenum texture, GLbyte s); GLAPI void APIENTRY glMultiTexCoord1bvOES (GLenum texture, const GLbyte *coords); GLAPI void APIENTRY glMultiTexCoord2bOES (GLenum texture, GLbyte s, GLbyte t); GLAPI void APIENTRY glMultiTexCoord2bvOES (GLenum texture, const GLbyte *coords); GLAPI void APIENTRY glMultiTexCoord3bOES (GLenum texture, GLbyte s, GLbyte t, GLbyte r); GLAPI void APIENTRY glMultiTexCoord3bvOES (GLenum texture, const GLbyte *coords); GLAPI void APIENTRY glMultiTexCoord4bOES (GLenum texture, GLbyte s, GLbyte t, GLbyte r, GLbyte q); GLAPI void APIENTRY glMultiTexCoord4bvOES (GLenum texture, const GLbyte *coords); GLAPI void APIENTRY glTexCoord1bOES (GLbyte s); GLAPI void APIENTRY glTexCoord1bvOES (const GLbyte *coords); GLAPI void APIENTRY glTexCoord2bOES (GLbyte s, GLbyte t); GLAPI void APIENTRY glTexCoord2bvOES (const GLbyte *coords); GLAPI void APIENTRY glTexCoord3bOES (GLbyte s, GLbyte t, GLbyte r); GLAPI void APIENTRY glTexCoord3bvOES (const GLbyte *coords); GLAPI void APIENTRY glTexCoord4bOES (GLbyte s, GLbyte t, GLbyte r, GLbyte q); GLAPI void APIENTRY glTexCoord4bvOES (const GLbyte *coords); GLAPI void APIENTRY glVertex2bOES (GLbyte x, GLbyte y); GLAPI void APIENTRY glVertex2bvOES (const GLbyte *coords); GLAPI void APIENTRY glVertex3bOES (GLbyte x, GLbyte y, GLbyte z); GLAPI void APIENTRY glVertex3bvOES (const GLbyte *coords); GLAPI void APIENTRY glVertex4bOES (GLbyte x, GLbyte y, GLbyte z, GLbyte w); GLAPI void APIENTRY glVertex4bvOES (const GLbyte *coords); #endif #endif /* GL_OES_byte_coordinates */ #ifndef GL_OES_compressed_paletted_texture #define GL_OES_compressed_paletted_texture 1 #define GL_PALETTE4_RGB8_OES 0x8B90 #define GL_PALETTE4_RGBA8_OES 0x8B91 #define GL_PALETTE4_R5_G6_B5_OES 0x8B92 #define GL_PALETTE4_RGBA4_OES 0x8B93 #define GL_PALETTE4_RGB5_A1_OES 0x8B94 #define GL_PALETTE8_RGB8_OES 0x8B95 #define GL_PALETTE8_RGBA8_OES 0x8B96 #define GL_PALETTE8_R5_G6_B5_OES 0x8B97 #define GL_PALETTE8_RGBA4_OES 0x8B98 #define GL_PALETTE8_RGB5_A1_OES 0x8B99 #endif /* GL_OES_compressed_paletted_texture */ #ifndef GL_OES_fixed_point #define GL_OES_fixed_point 1 typedef GLint GLfixed; #define GL_FIXED_OES 0x140C typedef void (APIENTRYP PFNGLALPHAFUNCXOESPROC) (GLenum func, GLfixed ref); typedef void (APIENTRYP PFNGLCLEARCOLORXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); typedef void (APIENTRYP PFNGLCLEARDEPTHXOESPROC) (GLfixed depth); typedef void (APIENTRYP PFNGLCLIPPLANEXOESPROC) (GLenum plane, const GLfixed *equation); typedef void (APIENTRYP PFNGLCOLOR4XOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); typedef void (APIENTRYP PFNGLDEPTHRANGEXOESPROC) (GLfixed n, GLfixed f); typedef void (APIENTRYP PFNGLFOGXOESPROC) (GLenum pname, GLfixed param); typedef void (APIENTRYP PFNGLFOGXVOESPROC) (GLenum pname, const GLfixed *param); typedef void (APIENTRYP PFNGLFRUSTUMXOESPROC) (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); typedef void (APIENTRYP PFNGLGETCLIPPLANEXOESPROC) (GLenum plane, GLfixed *equation); typedef void (APIENTRYP PFNGLGETFIXEDVOESPROC) (GLenum pname, GLfixed *params); typedef void (APIENTRYP PFNGLGETTEXENVXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); typedef void (APIENTRYP PFNGLGETTEXPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); typedef void (APIENTRYP PFNGLLIGHTMODELXOESPROC) (GLenum pname, GLfixed param); typedef void (APIENTRYP PFNGLLIGHTMODELXVOESPROC) (GLenum pname, const GLfixed *param); typedef void (APIENTRYP PFNGLLIGHTXOESPROC) (GLenum light, GLenum pname, GLfixed param); typedef void (APIENTRYP PFNGLLIGHTXVOESPROC) (GLenum light, GLenum pname, const GLfixed *params); typedef void (APIENTRYP PFNGLLINEWIDTHXOESPROC) (GLfixed width); typedef void (APIENTRYP PFNGLLOADMATRIXXOESPROC) (const GLfixed *m); typedef void (APIENTRYP PFNGLMATERIALXOESPROC) (GLenum face, GLenum pname, GLfixed param); typedef void (APIENTRYP PFNGLMATERIALXVOESPROC) (GLenum face, GLenum pname, const GLfixed *param); typedef void (APIENTRYP PFNGLMULTMATRIXXOESPROC) (const GLfixed *m); typedef void (APIENTRYP PFNGLMULTITEXCOORD4XOESPROC) (GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q); typedef void (APIENTRYP PFNGLNORMAL3XOESPROC) (GLfixed nx, GLfixed ny, GLfixed nz); typedef void (APIENTRYP PFNGLORTHOXOESPROC) (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); typedef void (APIENTRYP PFNGLPOINTPARAMETERXVOESPROC) (GLenum pname, const GLfixed *params); typedef void (APIENTRYP PFNGLPOINTSIZEXOESPROC) (GLfixed size); typedef void (APIENTRYP PFNGLPOLYGONOFFSETXOESPROC) (GLfixed factor, GLfixed units); typedef void (APIENTRYP PFNGLROTATEXOESPROC) (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); typedef void (APIENTRYP PFNGLSAMPLECOVERAGEOESPROC) (GLfixed value, GLboolean invert); typedef void (APIENTRYP PFNGLSCALEXOESPROC) (GLfixed x, GLfixed y, GLfixed z); typedef void (APIENTRYP PFNGLTEXENVXOESPROC) (GLenum target, GLenum pname, GLfixed param); typedef void (APIENTRYP PFNGLTEXENVXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params); typedef void (APIENTRYP PFNGLTEXPARAMETERXOESPROC) (GLenum target, GLenum pname, GLfixed param); typedef void (APIENTRYP PFNGLTEXPARAMETERXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params); typedef void (APIENTRYP PFNGLTRANSLATEXOESPROC) (GLfixed x, GLfixed y, GLfixed z); typedef void (APIENTRYP PFNGLACCUMXOESPROC) (GLenum op, GLfixed value); typedef void (APIENTRYP PFNGLBITMAPXOESPROC) (GLsizei width, GLsizei height, GLfixed xorig, GLfixed yorig, GLfixed xmove, GLfixed ymove, const GLubyte *bitmap); typedef void (APIENTRYP PFNGLBLENDCOLORXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); typedef void (APIENTRYP PFNGLCLEARACCUMXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); typedef void (APIENTRYP PFNGLCOLOR3XOESPROC) (GLfixed red, GLfixed green, GLfixed blue); typedef void (APIENTRYP PFNGLCOLOR3XVOESPROC) (const GLfixed *components); typedef void (APIENTRYP PFNGLCOLOR4XVOESPROC) (const GLfixed *components); typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERXOESPROC) (GLenum target, GLenum pname, GLfixed param); typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params); typedef void (APIENTRYP PFNGLEVALCOORD1XOESPROC) (GLfixed u); typedef void (APIENTRYP PFNGLEVALCOORD1XVOESPROC) (const GLfixed *coords); typedef void (APIENTRYP PFNGLEVALCOORD2XOESPROC) (GLfixed u, GLfixed v); typedef void (APIENTRYP PFNGLEVALCOORD2XVOESPROC) (const GLfixed *coords); typedef void (APIENTRYP PFNGLFEEDBACKBUFFERXOESPROC) (GLsizei n, GLenum type, const GLfixed *buffer); typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); typedef void (APIENTRYP PFNGLGETLIGHTXOESPROC) (GLenum light, GLenum pname, GLfixed *params); typedef void (APIENTRYP PFNGLGETMAPXVOESPROC) (GLenum target, GLenum query, GLfixed *v); typedef void (APIENTRYP PFNGLGETMATERIALXOESPROC) (GLenum face, GLenum pname, GLfixed param); typedef void (APIENTRYP PFNGLGETPIXELMAPXVPROC) (GLenum map, GLint size, GLfixed *values); typedef void (APIENTRYP PFNGLGETTEXGENXVOESPROC) (GLenum coord, GLenum pname, GLfixed *params); typedef void (APIENTRYP PFNGLGETTEXLEVELPARAMETERXVOESPROC) (GLenum target, GLint level, GLenum pname, GLfixed *params); typedef void (APIENTRYP PFNGLINDEXXOESPROC) (GLfixed component); typedef void (APIENTRYP PFNGLINDEXXVOESPROC) (const GLfixed *component); typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXXOESPROC) (const GLfixed *m); typedef void (APIENTRYP PFNGLMAP1XOESPROC) (GLenum target, GLfixed u1, GLfixed u2, GLint stride, GLint order, GLfixed points); typedef void (APIENTRYP PFNGLMAP2XOESPROC) (GLenum target, GLfixed u1, GLfixed u2, GLint ustride, GLint uorder, GLfixed v1, GLfixed v2, GLint vstride, GLint vorder, GLfixed points); typedef void (APIENTRYP PFNGLMAPGRID1XOESPROC) (GLint n, GLfixed u1, GLfixed u2); typedef void (APIENTRYP PFNGLMAPGRID2XOESPROC) (GLint n, GLfixed u1, GLfixed u2, GLfixed v1, GLfixed v2); typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXXOESPROC) (const GLfixed *m); typedef void (APIENTRYP PFNGLMULTITEXCOORD1XOESPROC) (GLenum texture, GLfixed s); typedef void (APIENTRYP PFNGLMULTITEXCOORD1XVOESPROC) (GLenum texture, const GLfixed *coords); typedef void (APIENTRYP PFNGLMULTITEXCOORD2XOESPROC) (GLenum texture, GLfixed s, GLfixed t); typedef void (APIENTRYP PFNGLMULTITEXCOORD2XVOESPROC) (GLenum texture, const GLfixed *coords); typedef void (APIENTRYP PFNGLMULTITEXCOORD3XOESPROC) (GLenum texture, GLfixed s, GLfixed t, GLfixed r); typedef void (APIENTRYP PFNGLMULTITEXCOORD3XVOESPROC) (GLenum texture, const GLfixed *coords); typedef void (APIENTRYP PFNGLMULTITEXCOORD4XVOESPROC) (GLenum texture, const GLfixed *coords); typedef void (APIENTRYP PFNGLNORMAL3XVOESPROC) (const GLfixed *coords); typedef void (APIENTRYP PFNGLPASSTHROUGHXOESPROC) (GLfixed token); typedef void (APIENTRYP PFNGLPIXELMAPXPROC) (GLenum map, GLint size, const GLfixed *values); typedef void (APIENTRYP PFNGLPIXELSTOREXPROC) (GLenum pname, GLfixed param); typedef void (APIENTRYP PFNGLPIXELTRANSFERXOESPROC) (GLenum pname, GLfixed param); typedef void (APIENTRYP PFNGLPIXELZOOMXOESPROC) (GLfixed xfactor, GLfixed yfactor); typedef void (APIENTRYP PFNGLPRIORITIZETEXTURESXOESPROC) (GLsizei n, const GLuint *textures, const GLfixed *priorities); typedef void (APIENTRYP PFNGLRASTERPOS2XOESPROC) (GLfixed x, GLfixed y); typedef void (APIENTRYP PFNGLRASTERPOS2XVOESPROC) (const GLfixed *coords); typedef void (APIENTRYP PFNGLRASTERPOS3XOESPROC) (GLfixed x, GLfixed y, GLfixed z); typedef void (APIENTRYP PFNGLRASTERPOS3XVOESPROC) (const GLfixed *coords); typedef void (APIENTRYP PFNGLRASTERPOS4XOESPROC) (GLfixed x, GLfixed y, GLfixed z, GLfixed w); typedef void (APIENTRYP PFNGLRASTERPOS4XVOESPROC) (const GLfixed *coords); typedef void (APIENTRYP PFNGLRECTXOESPROC) (GLfixed x1, GLfixed y1, GLfixed x2, GLfixed y2); typedef void (APIENTRYP PFNGLRECTXVOESPROC) (const GLfixed *v1, const GLfixed *v2); typedef void (APIENTRYP PFNGLTEXCOORD1XOESPROC) (GLfixed s); typedef void (APIENTRYP PFNGLTEXCOORD1XVOESPROC) (const GLfixed *coords); typedef void (APIENTRYP PFNGLTEXCOORD2XOESPROC) (GLfixed s, GLfixed t); typedef void (APIENTRYP PFNGLTEXCOORD2XVOESPROC) (const GLfixed *coords); typedef void (APIENTRYP PFNGLTEXCOORD3XOESPROC) (GLfixed s, GLfixed t, GLfixed r); typedef void (APIENTRYP PFNGLTEXCOORD3XVOESPROC) (const GLfixed *coords); typedef void (APIENTRYP PFNGLTEXCOORD4XOESPROC) (GLfixed s, GLfixed t, GLfixed r, GLfixed q); typedef void (APIENTRYP PFNGLTEXCOORD4XVOESPROC) (const GLfixed *coords); typedef void (APIENTRYP PFNGLTEXGENXOESPROC) (GLenum coord, GLenum pname, GLfixed param); typedef void (APIENTRYP PFNGLTEXGENXVOESPROC) (GLenum coord, GLenum pname, const GLfixed *params); typedef void (APIENTRYP PFNGLVERTEX2XOESPROC) (GLfixed x); typedef void (APIENTRYP PFNGLVERTEX2XVOESPROC) (const GLfixed *coords); typedef void (APIENTRYP PFNGLVERTEX3XOESPROC) (GLfixed x, GLfixed y); typedef void (APIENTRYP PFNGLVERTEX3XVOESPROC) (const GLfixed *coords); typedef void (APIENTRYP PFNGLVERTEX4XOESPROC) (GLfixed x, GLfixed y, GLfixed z); typedef void (APIENTRYP PFNGLVERTEX4XVOESPROC) (const GLfixed *coords); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glAlphaFuncxOES (GLenum func, GLfixed ref); GLAPI void APIENTRY glClearColorxOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); GLAPI void APIENTRY glClearDepthxOES (GLfixed depth); GLAPI void APIENTRY glClipPlanexOES (GLenum plane, const GLfixed *equation); GLAPI void APIENTRY glColor4xOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); GLAPI void APIENTRY glDepthRangexOES (GLfixed n, GLfixed f); GLAPI void APIENTRY glFogxOES (GLenum pname, GLfixed param); GLAPI void APIENTRY glFogxvOES (GLenum pname, const GLfixed *param); GLAPI void APIENTRY glFrustumxOES (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); GLAPI void APIENTRY glGetClipPlanexOES (GLenum plane, GLfixed *equation); GLAPI void APIENTRY glGetFixedvOES (GLenum pname, GLfixed *params); GLAPI void APIENTRY glGetTexEnvxvOES (GLenum target, GLenum pname, GLfixed *params); GLAPI void APIENTRY glGetTexParameterxvOES (GLenum target, GLenum pname, GLfixed *params); GLAPI void APIENTRY glLightModelxOES (GLenum pname, GLfixed param); GLAPI void APIENTRY glLightModelxvOES (GLenum pname, const GLfixed *param); GLAPI void APIENTRY glLightxOES (GLenum light, GLenum pname, GLfixed param); GLAPI void APIENTRY glLightxvOES (GLenum light, GLenum pname, const GLfixed *params); GLAPI void APIENTRY glLineWidthxOES (GLfixed width); GLAPI void APIENTRY glLoadMatrixxOES (const GLfixed *m); GLAPI void APIENTRY glMaterialxOES (GLenum face, GLenum pname, GLfixed param); GLAPI void APIENTRY glMaterialxvOES (GLenum face, GLenum pname, const GLfixed *param); GLAPI void APIENTRY glMultMatrixxOES (const GLfixed *m); GLAPI void APIENTRY glMultiTexCoord4xOES (GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q); GLAPI void APIENTRY glNormal3xOES (GLfixed nx, GLfixed ny, GLfixed nz); GLAPI void APIENTRY glOrthoxOES (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); GLAPI void APIENTRY glPointParameterxvOES (GLenum pname, const GLfixed *params); GLAPI void APIENTRY glPointSizexOES (GLfixed size); GLAPI void APIENTRY glPolygonOffsetxOES (GLfixed factor, GLfixed units); GLAPI void APIENTRY glRotatexOES (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); GLAPI void APIENTRY glSampleCoverageOES (GLfixed value, GLboolean invert); GLAPI void APIENTRY glScalexOES (GLfixed x, GLfixed y, GLfixed z); GLAPI void APIENTRY glTexEnvxOES (GLenum target, GLenum pname, GLfixed param); GLAPI void APIENTRY glTexEnvxvOES (GLenum target, GLenum pname, const GLfixed *params); GLAPI void APIENTRY glTexParameterxOES (GLenum target, GLenum pname, GLfixed param); GLAPI void APIENTRY glTexParameterxvOES (GLenum target, GLenum pname, const GLfixed *params); GLAPI void APIENTRY glTranslatexOES (GLfixed x, GLfixed y, GLfixed z); GLAPI void APIENTRY glAccumxOES (GLenum op, GLfixed value); GLAPI void APIENTRY glBitmapxOES (GLsizei width, GLsizei height, GLfixed xorig, GLfixed yorig, GLfixed xmove, GLfixed ymove, const GLubyte *bitmap); GLAPI void APIENTRY glBlendColorxOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); GLAPI void APIENTRY glClearAccumxOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); GLAPI void APIENTRY glColor3xOES (GLfixed red, GLfixed green, GLfixed blue); GLAPI void APIENTRY glColor3xvOES (const GLfixed *components); GLAPI void APIENTRY glColor4xvOES (const GLfixed *components); GLAPI void APIENTRY glConvolutionParameterxOES (GLenum target, GLenum pname, GLfixed param); GLAPI void APIENTRY glConvolutionParameterxvOES (GLenum target, GLenum pname, const GLfixed *params); GLAPI void APIENTRY glEvalCoord1xOES (GLfixed u); GLAPI void APIENTRY glEvalCoord1xvOES (const GLfixed *coords); GLAPI void APIENTRY glEvalCoord2xOES (GLfixed u, GLfixed v); GLAPI void APIENTRY glEvalCoord2xvOES (const GLfixed *coords); GLAPI void APIENTRY glFeedbackBufferxOES (GLsizei n, GLenum type, const GLfixed *buffer); GLAPI void APIENTRY glGetConvolutionParameterxvOES (GLenum target, GLenum pname, GLfixed *params); GLAPI void APIENTRY glGetHistogramParameterxvOES (GLenum target, GLenum pname, GLfixed *params); GLAPI void APIENTRY glGetLightxOES (GLenum light, GLenum pname, GLfixed *params); GLAPI void APIENTRY glGetMapxvOES (GLenum target, GLenum query, GLfixed *v); GLAPI void APIENTRY glGetMaterialxOES (GLenum face, GLenum pname, GLfixed param); GLAPI void APIENTRY glGetPixelMapxv (GLenum map, GLint size, GLfixed *values); GLAPI void APIENTRY glGetTexGenxvOES (GLenum coord, GLenum pname, GLfixed *params); GLAPI void APIENTRY glGetTexLevelParameterxvOES (GLenum target, GLint level, GLenum pname, GLfixed *params); GLAPI void APIENTRY glIndexxOES (GLfixed component); GLAPI void APIENTRY glIndexxvOES (const GLfixed *component); GLAPI void APIENTRY glLoadTransposeMatrixxOES (const GLfixed *m); GLAPI void APIENTRY glMap1xOES (GLenum target, GLfixed u1, GLfixed u2, GLint stride, GLint order, GLfixed points); GLAPI void APIENTRY glMap2xOES (GLenum target, GLfixed u1, GLfixed u2, GLint ustride, GLint uorder, GLfixed v1, GLfixed v2, GLint vstride, GLint vorder, GLfixed points); GLAPI void APIENTRY glMapGrid1xOES (GLint n, GLfixed u1, GLfixed u2); GLAPI void APIENTRY glMapGrid2xOES (GLint n, GLfixed u1, GLfixed u2, GLfixed v1, GLfixed v2); GLAPI void APIENTRY glMultTransposeMatrixxOES (const GLfixed *m); GLAPI void APIENTRY glMultiTexCoord1xOES (GLenum texture, GLfixed s); GLAPI void APIENTRY glMultiTexCoord1xvOES (GLenum texture, const GLfixed *coords); GLAPI void APIENTRY glMultiTexCoord2xOES (GLenum texture, GLfixed s, GLfixed t); GLAPI void APIENTRY glMultiTexCoord2xvOES (GLenum texture, const GLfixed *coords); GLAPI void APIENTRY glMultiTexCoord3xOES (GLenum texture, GLfixed s, GLfixed t, GLfixed r); GLAPI void APIENTRY glMultiTexCoord3xvOES (GLenum texture, const GLfixed *coords); GLAPI void APIENTRY glMultiTexCoord4xvOES (GLenum texture, const GLfixed *coords); GLAPI void APIENTRY glNormal3xvOES (const GLfixed *coords); GLAPI void APIENTRY glPassThroughxOES (GLfixed token); GLAPI void APIENTRY glPixelMapx (GLenum map, GLint size, const GLfixed *values); GLAPI void APIENTRY glPixelStorex (GLenum pname, GLfixed param); GLAPI void APIENTRY glPixelTransferxOES (GLenum pname, GLfixed param); GLAPI void APIENTRY glPixelZoomxOES (GLfixed xfactor, GLfixed yfactor); GLAPI void APIENTRY glPrioritizeTexturesxOES (GLsizei n, const GLuint *textures, const GLfixed *priorities); GLAPI void APIENTRY glRasterPos2xOES (GLfixed x, GLfixed y); GLAPI void APIENTRY glRasterPos2xvOES (const GLfixed *coords); GLAPI void APIENTRY glRasterPos3xOES (GLfixed x, GLfixed y, GLfixed z); GLAPI void APIENTRY glRasterPos3xvOES (const GLfixed *coords); GLAPI void APIENTRY glRasterPos4xOES (GLfixed x, GLfixed y, GLfixed z, GLfixed w); GLAPI void APIENTRY glRasterPos4xvOES (const GLfixed *coords); GLAPI void APIENTRY glRectxOES (GLfixed x1, GLfixed y1, GLfixed x2, GLfixed y2); GLAPI void APIENTRY glRectxvOES (const GLfixed *v1, const GLfixed *v2); GLAPI void APIENTRY glTexCoord1xOES (GLfixed s); GLAPI void APIENTRY glTexCoord1xvOES (const GLfixed *coords); GLAPI void APIENTRY glTexCoord2xOES (GLfixed s, GLfixed t); GLAPI void APIENTRY glTexCoord2xvOES (const GLfixed *coords); GLAPI void APIENTRY glTexCoord3xOES (GLfixed s, GLfixed t, GLfixed r); GLAPI void APIENTRY glTexCoord3xvOES (const GLfixed *coords); GLAPI void APIENTRY glTexCoord4xOES (GLfixed s, GLfixed t, GLfixed r, GLfixed q); GLAPI void APIENTRY glTexCoord4xvOES (const GLfixed *coords); GLAPI void APIENTRY glTexGenxOES (GLenum coord, GLenum pname, GLfixed param); GLAPI void APIENTRY glTexGenxvOES (GLenum coord, GLenum pname, const GLfixed *params); GLAPI void APIENTRY glVertex2xOES (GLfixed x); GLAPI void APIENTRY glVertex2xvOES (const GLfixed *coords); GLAPI void APIENTRY glVertex3xOES (GLfixed x, GLfixed y); GLAPI void APIENTRY glVertex3xvOES (const GLfixed *coords); GLAPI void APIENTRY glVertex4xOES (GLfixed x, GLfixed y, GLfixed z); GLAPI void APIENTRY glVertex4xvOES (const GLfixed *coords); #endif #endif /* GL_OES_fixed_point */ #ifndef GL_OES_query_matrix #define GL_OES_query_matrix 1 typedef GLbitfield (APIENTRYP PFNGLQUERYMATRIXXOESPROC) (GLfixed *mantissa, GLint *exponent); #ifdef GL_GLEXT_PROTOTYPES GLAPI GLbitfield APIENTRY glQueryMatrixxOES (GLfixed *mantissa, GLint *exponent); #endif #endif /* GL_OES_query_matrix */ #ifndef GL_OES_read_format #define GL_OES_read_format 1 #define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A #define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B #endif /* GL_OES_read_format */ #ifndef GL_OES_single_precision #define GL_OES_single_precision 1 typedef void (APIENTRYP PFNGLCLEARDEPTHFOESPROC) (GLclampf depth); typedef void (APIENTRYP PFNGLCLIPPLANEFOESPROC) (GLenum plane, const GLfloat *equation); typedef void (APIENTRYP PFNGLDEPTHRANGEFOESPROC) (GLclampf n, GLclampf f); typedef void (APIENTRYP PFNGLFRUSTUMFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); typedef void (APIENTRYP PFNGLGETCLIPPLANEFOESPROC) (GLenum plane, GLfloat *equation); typedef void (APIENTRYP PFNGLORTHOFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glClearDepthfOES (GLclampf depth); GLAPI void APIENTRY glClipPlanefOES (GLenum plane, const GLfloat *equation); GLAPI void APIENTRY glDepthRangefOES (GLclampf n, GLclampf f); GLAPI void APIENTRY glFrustumfOES (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); GLAPI void APIENTRY glGetClipPlanefOES (GLenum plane, GLfloat *equation); GLAPI void APIENTRY glOrthofOES (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); #endif #endif /* GL_OES_single_precision */ #ifndef GL_3DFX_multisample #define GL_3DFX_multisample 1 #define GL_MULTISAMPLE_3DFX 0x86B2 #define GL_SAMPLE_BUFFERS_3DFX 0x86B3 #define GL_SAMPLES_3DFX 0x86B4 #define GL_MULTISAMPLE_BIT_3DFX 0x20000000 #endif /* GL_3DFX_multisample */ #ifndef GL_3DFX_tbuffer #define GL_3DFX_tbuffer 1 typedef void (APIENTRYP PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glTbufferMask3DFX (GLuint mask); #endif #endif /* GL_3DFX_tbuffer */ #ifndef GL_3DFX_texture_compression_FXT1 #define GL_3DFX_texture_compression_FXT1 1 #define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 #define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 #endif /* GL_3DFX_texture_compression_FXT1 */ #ifndef GL_AMD_blend_minmax_factor #define GL_AMD_blend_minmax_factor 1 #define GL_FACTOR_MIN_AMD 0x901C #define GL_FACTOR_MAX_AMD 0x901D #endif /* GL_AMD_blend_minmax_factor */ #ifndef GL_AMD_conservative_depth #define GL_AMD_conservative_depth 1 #endif /* GL_AMD_conservative_depth */ #ifndef GL_AMD_debug_output #define GL_AMD_debug_output 1 typedef void (APIENTRY *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,void *userParam); #define GL_MAX_DEBUG_MESSAGE_LENGTH_AMD 0x9143 #define GL_MAX_DEBUG_LOGGED_MESSAGES_AMD 0x9144 #define GL_DEBUG_LOGGED_MESSAGES_AMD 0x9145 #define GL_DEBUG_SEVERITY_HIGH_AMD 0x9146 #define GL_DEBUG_SEVERITY_MEDIUM_AMD 0x9147 #define GL_DEBUG_SEVERITY_LOW_AMD 0x9148 #define GL_DEBUG_CATEGORY_API_ERROR_AMD 0x9149 #define GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD 0x914A #define GL_DEBUG_CATEGORY_DEPRECATION_AMD 0x914B #define GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD 0x914C #define GL_DEBUG_CATEGORY_PERFORMANCE_AMD 0x914D #define GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD 0x914E #define GL_DEBUG_CATEGORY_APPLICATION_AMD 0x914F #define GL_DEBUG_CATEGORY_OTHER_AMD 0x9150 typedef void (APIENTRYP PFNGLDEBUGMESSAGEENABLEAMDPROC) (GLenum category, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTAMDPROC) (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar *buf); typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKAMDPROC) (GLDEBUGPROCAMD callback, void *userParam); typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGAMDPROC) (GLuint count, GLsizei bufsize, GLenum *categories, GLuint *severities, GLuint *ids, GLsizei *lengths, GLchar *message); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glDebugMessageEnableAMD (GLenum category, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); GLAPI void APIENTRY glDebugMessageInsertAMD (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar *buf); GLAPI void APIENTRY glDebugMessageCallbackAMD (GLDEBUGPROCAMD callback, void *userParam); GLAPI GLuint APIENTRY glGetDebugMessageLogAMD (GLuint count, GLsizei bufsize, GLenum *categories, GLuint *severities, GLuint *ids, GLsizei *lengths, GLchar *message); #endif #endif /* GL_AMD_debug_output */ #ifndef GL_AMD_depth_clamp_separate #define GL_AMD_depth_clamp_separate 1 #define GL_DEPTH_CLAMP_NEAR_AMD 0x901E #define GL_DEPTH_CLAMP_FAR_AMD 0x901F #endif /* GL_AMD_depth_clamp_separate */ #ifndef GL_AMD_draw_buffers_blend #define GL_AMD_draw_buffers_blend 1 typedef void (APIENTRYP PFNGLBLENDFUNCINDEXEDAMDPROC) (GLuint buf, GLenum src, GLenum dst); typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); typedef void (APIENTRYP PFNGLBLENDEQUATIONINDEXEDAMDPROC) (GLuint buf, GLenum mode); typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBlendFuncIndexedAMD (GLuint buf, GLenum src, GLenum dst); GLAPI void APIENTRY glBlendFuncSeparateIndexedAMD (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); GLAPI void APIENTRY glBlendEquationIndexedAMD (GLuint buf, GLenum mode); GLAPI void APIENTRY glBlendEquationSeparateIndexedAMD (GLuint buf, GLenum modeRGB, GLenum modeAlpha); #endif #endif /* GL_AMD_draw_buffers_blend */ #ifndef GL_AMD_gcn_shader #define GL_AMD_gcn_shader 1 #endif /* GL_AMD_gcn_shader */ #ifndef GL_AMD_gpu_shader_int64 #define GL_AMD_gpu_shader_int64 1 typedef int64_t GLint64EXT; #define GL_INT64_NV 0x140E #define GL_UNSIGNED_INT64_NV 0x140F #define GL_INT8_NV 0x8FE0 #define GL_INT8_VEC2_NV 0x8FE1 #define GL_INT8_VEC3_NV 0x8FE2 #define GL_INT8_VEC4_NV 0x8FE3 #define GL_INT16_NV 0x8FE4 #define GL_INT16_VEC2_NV 0x8FE5 #define GL_INT16_VEC3_NV 0x8FE6 #define GL_INT16_VEC4_NV 0x8FE7 #define GL_INT64_VEC2_NV 0x8FE9 #define GL_INT64_VEC3_NV 0x8FEA #define GL_INT64_VEC4_NV 0x8FEB #define GL_UNSIGNED_INT8_NV 0x8FEC #define GL_UNSIGNED_INT8_VEC2_NV 0x8FED #define GL_UNSIGNED_INT8_VEC3_NV 0x8FEE #define GL_UNSIGNED_INT8_VEC4_NV 0x8FEF #define GL_UNSIGNED_INT16_NV 0x8FF0 #define GL_UNSIGNED_INT16_VEC2_NV 0x8FF1 #define GL_UNSIGNED_INT16_VEC3_NV 0x8FF2 #define GL_UNSIGNED_INT16_VEC4_NV 0x8FF3 #define GL_UNSIGNED_INT64_VEC2_NV 0x8FF5 #define GL_UNSIGNED_INT64_VEC3_NV 0x8FF6 #define GL_UNSIGNED_INT64_VEC4_NV 0x8FF7 #define GL_FLOAT16_NV 0x8FF8 #define GL_FLOAT16_VEC2_NV 0x8FF9 #define GL_FLOAT16_VEC3_NV 0x8FFA #define GL_FLOAT16_VEC4_NV 0x8FFB typedef void (APIENTRYP PFNGLUNIFORM1I64NVPROC) (GLint location, GLint64EXT x); typedef void (APIENTRYP PFNGLUNIFORM2I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y); typedef void (APIENTRYP PFNGLUNIFORM3I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); typedef void (APIENTRYP PFNGLUNIFORM4I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); typedef void (APIENTRYP PFNGLUNIFORM1I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); typedef void (APIENTRYP PFNGLUNIFORM2I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); typedef void (APIENTRYP PFNGLUNIFORM3I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); typedef void (APIENTRYP PFNGLUNIFORM4I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); typedef void (APIENTRYP PFNGLUNIFORM1UI64NVPROC) (GLint location, GLuint64EXT x); typedef void (APIENTRYP PFNGLUNIFORM2UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y); typedef void (APIENTRYP PFNGLUNIFORM3UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); typedef void (APIENTRYP PFNGLUNIFORM4UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); typedef void (APIENTRYP PFNGLUNIFORM1UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); typedef void (APIENTRYP PFNGLUNIFORM2UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); typedef void (APIENTRYP PFNGLUNIFORM3UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); typedef void (APIENTRYP PFNGLUNIFORM4UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); typedef void (APIENTRYP PFNGLGETUNIFORMI64VNVPROC) (GLuint program, GLint location, GLint64EXT *params); typedef void (APIENTRYP PFNGLGETUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLuint64EXT *params); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64NVPROC) (GLuint program, GLint location, GLint64EXT x); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glUniform1i64NV (GLint location, GLint64EXT x); GLAPI void APIENTRY glUniform2i64NV (GLint location, GLint64EXT x, GLint64EXT y); GLAPI void APIENTRY glUniform3i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); GLAPI void APIENTRY glUniform4i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); GLAPI void APIENTRY glUniform1i64vNV (GLint location, GLsizei count, const GLint64EXT *value); GLAPI void APIENTRY glUniform2i64vNV (GLint location, GLsizei count, const GLint64EXT *value); GLAPI void APIENTRY glUniform3i64vNV (GLint location, GLsizei count, const GLint64EXT *value); GLAPI void APIENTRY glUniform4i64vNV (GLint location, GLsizei count, const GLint64EXT *value); GLAPI void APIENTRY glUniform1ui64NV (GLint location, GLuint64EXT x); GLAPI void APIENTRY glUniform2ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y); GLAPI void APIENTRY glUniform3ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); GLAPI void APIENTRY glUniform4ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); GLAPI void APIENTRY glUniform1ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); GLAPI void APIENTRY glUniform2ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); GLAPI void APIENTRY glUniform3ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); GLAPI void APIENTRY glUniform4ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); GLAPI void APIENTRY glGetUniformi64vNV (GLuint program, GLint location, GLint64EXT *params); GLAPI void APIENTRY glGetUniformui64vNV (GLuint program, GLint location, GLuint64EXT *params); GLAPI void APIENTRY glProgramUniform1i64NV (GLuint program, GLint location, GLint64EXT x); GLAPI void APIENTRY glProgramUniform2i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); GLAPI void APIENTRY glProgramUniform3i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); GLAPI void APIENTRY glProgramUniform4i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); GLAPI void APIENTRY glProgramUniform1i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); GLAPI void APIENTRY glProgramUniform2i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); GLAPI void APIENTRY glProgramUniform3i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); GLAPI void APIENTRY glProgramUniform4i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); GLAPI void APIENTRY glProgramUniform1ui64NV (GLuint program, GLint location, GLuint64EXT x); GLAPI void APIENTRY glProgramUniform2ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); GLAPI void APIENTRY glProgramUniform3ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); GLAPI void APIENTRY glProgramUniform4ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); GLAPI void APIENTRY glProgramUniform1ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); GLAPI void APIENTRY glProgramUniform2ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); GLAPI void APIENTRY glProgramUniform3ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); GLAPI void APIENTRY glProgramUniform4ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); #endif #endif /* GL_AMD_gpu_shader_int64 */ #ifndef GL_AMD_interleaved_elements #define GL_AMD_interleaved_elements 1 #define GL_VERTEX_ELEMENT_SWIZZLE_AMD 0x91A4 #define GL_VERTEX_ID_SWIZZLE_AMD 0x91A5 typedef void (APIENTRYP PFNGLVERTEXATTRIBPARAMETERIAMDPROC) (GLuint index, GLenum pname, GLint param); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glVertexAttribParameteriAMD (GLuint index, GLenum pname, GLint param); #endif #endif /* GL_AMD_interleaved_elements */ #ifndef GL_AMD_multi_draw_indirect #define GL_AMD_multi_draw_indirect 1 typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC) (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride); typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glMultiDrawArraysIndirectAMD (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride); GLAPI void APIENTRY glMultiDrawElementsIndirectAMD (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride); #endif #endif /* GL_AMD_multi_draw_indirect */ #ifndef GL_AMD_name_gen_delete #define GL_AMD_name_gen_delete 1 #define GL_DATA_BUFFER_AMD 0x9151 #define GL_PERFORMANCE_MONITOR_AMD 0x9152 #define GL_QUERY_OBJECT_AMD 0x9153 #define GL_VERTEX_ARRAY_OBJECT_AMD 0x9154 #define GL_SAMPLER_OBJECT_AMD 0x9155 typedef void (APIENTRYP PFNGLGENNAMESAMDPROC) (GLenum identifier, GLuint num, GLuint *names); typedef void (APIENTRYP PFNGLDELETENAMESAMDPROC) (GLenum identifier, GLuint num, const GLuint *names); typedef GLboolean (APIENTRYP PFNGLISNAMEAMDPROC) (GLenum identifier, GLuint name); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glGenNamesAMD (GLenum identifier, GLuint num, GLuint *names); GLAPI void APIENTRY glDeleteNamesAMD (GLenum identifier, GLuint num, const GLuint *names); GLAPI GLboolean APIENTRY glIsNameAMD (GLenum identifier, GLuint name); #endif #endif /* GL_AMD_name_gen_delete */ #ifndef GL_AMD_occlusion_query_event #define GL_AMD_occlusion_query_event 1 #define GL_OCCLUSION_QUERY_EVENT_MASK_AMD 0x874F #define GL_QUERY_DEPTH_PASS_EVENT_BIT_AMD 0x00000001 #define GL_QUERY_DEPTH_FAIL_EVENT_BIT_AMD 0x00000002 #define GL_QUERY_STENCIL_FAIL_EVENT_BIT_AMD 0x00000004 #define GL_QUERY_DEPTH_BOUNDS_FAIL_EVENT_BIT_AMD 0x00000008 #define GL_QUERY_ALL_EVENT_BITS_AMD 0xFFFFFFFF typedef void (APIENTRYP PFNGLQUERYOBJECTPARAMETERUIAMDPROC) (GLenum target, GLuint id, GLenum pname, GLuint param); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glQueryObjectParameteruiAMD (GLenum target, GLuint id, GLenum pname, GLuint param); #endif #endif /* GL_AMD_occlusion_query_event */ #ifndef GL_AMD_performance_monitor #define GL_AMD_performance_monitor 1 #define GL_COUNTER_TYPE_AMD 0x8BC0 #define GL_COUNTER_RANGE_AMD 0x8BC1 #define GL_UNSIGNED_INT64_AMD 0x8BC2 #define GL_PERCENTAGE_AMD 0x8BC3 #define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4 #define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5 #define GL_PERFMON_RESULT_AMD 0x8BC6 typedef void (APIENTRYP PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint *numGroups, GLsizei groupsSize, GLuint *groups); typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); typedef void (APIENTRYP PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, void *data); typedef void (APIENTRYP PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); typedef void (APIENTRYP PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); typedef void (APIENTRYP PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList); typedef void (APIENTRYP PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor); typedef void (APIENTRYP PFNGLENDPERFMONITORAMDPROC) (GLuint monitor); typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glGetPerfMonitorGroupsAMD (GLint *numGroups, GLsizei groupsSize, GLuint *groups); GLAPI void APIENTRY glGetPerfMonitorCountersAMD (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); GLAPI void APIENTRY glGetPerfMonitorGroupStringAMD (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); GLAPI void APIENTRY glGetPerfMonitorCounterStringAMD (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); GLAPI void APIENTRY glGetPerfMonitorCounterInfoAMD (GLuint group, GLuint counter, GLenum pname, void *data); GLAPI void APIENTRY glGenPerfMonitorsAMD (GLsizei n, GLuint *monitors); GLAPI void APIENTRY glDeletePerfMonitorsAMD (GLsizei n, GLuint *monitors); GLAPI void APIENTRY glSelectPerfMonitorCountersAMD (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList); GLAPI void APIENTRY glBeginPerfMonitorAMD (GLuint monitor); GLAPI void APIENTRY glEndPerfMonitorAMD (GLuint monitor); GLAPI void APIENTRY glGetPerfMonitorCounterDataAMD (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); #endif #endif /* GL_AMD_performance_monitor */ #ifndef GL_AMD_pinned_memory #define GL_AMD_pinned_memory 1 #define GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD 0x9160 #endif /* GL_AMD_pinned_memory */ #ifndef GL_AMD_query_buffer_object #define GL_AMD_query_buffer_object 1 #define GL_QUERY_BUFFER_AMD 0x9192 #define GL_QUERY_BUFFER_BINDING_AMD 0x9193 #define GL_QUERY_RESULT_NO_WAIT_AMD 0x9194 #endif /* GL_AMD_query_buffer_object */ #ifndef GL_AMD_sample_positions #define GL_AMD_sample_positions 1 #define GL_SUBSAMPLE_DISTANCE_AMD 0x883F typedef void (APIENTRYP PFNGLSETMULTISAMPLEFVAMDPROC) (GLenum pname, GLuint index, const GLfloat *val); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glSetMultisamplefvAMD (GLenum pname, GLuint index, const GLfloat *val); #endif #endif /* GL_AMD_sample_positions */ #ifndef GL_AMD_seamless_cubemap_per_texture #define GL_AMD_seamless_cubemap_per_texture 1 #endif /* GL_AMD_seamless_cubemap_per_texture */ #ifndef GL_AMD_shader_atomic_counter_ops #define GL_AMD_shader_atomic_counter_ops 1 #endif /* GL_AMD_shader_atomic_counter_ops */ #ifndef GL_AMD_shader_stencil_export #define GL_AMD_shader_stencil_export 1 #endif /* GL_AMD_shader_stencil_export */ #ifndef GL_AMD_shader_trinary_minmax #define GL_AMD_shader_trinary_minmax 1 #endif /* GL_AMD_shader_trinary_minmax */ #ifndef GL_AMD_sparse_texture #define GL_AMD_sparse_texture 1 #define GL_VIRTUAL_PAGE_SIZE_X_AMD 0x9195 #define GL_VIRTUAL_PAGE_SIZE_Y_AMD 0x9196 #define GL_VIRTUAL_PAGE_SIZE_Z_AMD 0x9197 #define GL_MAX_SPARSE_TEXTURE_SIZE_AMD 0x9198 #define GL_MAX_SPARSE_3D_TEXTURE_SIZE_AMD 0x9199 #define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS 0x919A #define GL_MIN_SPARSE_LEVEL_AMD 0x919B #define GL_MIN_LOD_WARNING_AMD 0x919C #define GL_TEXTURE_STORAGE_SPARSE_BIT_AMD 0x00000001 typedef void (APIENTRYP PFNGLTEXSTORAGESPARSEAMDPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); typedef void (APIENTRYP PFNGLTEXTURESTORAGESPARSEAMDPROC) (GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glTexStorageSparseAMD (GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); GLAPI void APIENTRY glTextureStorageSparseAMD (GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); #endif #endif /* GL_AMD_sparse_texture */ #ifndef GL_AMD_stencil_operation_extended #define GL_AMD_stencil_operation_extended 1 #define GL_SET_AMD 0x874A #define GL_REPLACE_VALUE_AMD 0x874B #define GL_STENCIL_OP_VALUE_AMD 0x874C #define GL_STENCIL_BACK_OP_VALUE_AMD 0x874D typedef void (APIENTRYP PFNGLSTENCILOPVALUEAMDPROC) (GLenum face, GLuint value); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glStencilOpValueAMD (GLenum face, GLuint value); #endif #endif /* GL_AMD_stencil_operation_extended */ #ifndef GL_AMD_texture_texture4 #define GL_AMD_texture_texture4 1 #endif /* GL_AMD_texture_texture4 */ #ifndef GL_AMD_transform_feedback3_lines_triangles #define GL_AMD_transform_feedback3_lines_triangles 1 #endif /* GL_AMD_transform_feedback3_lines_triangles */ #ifndef GL_AMD_transform_feedback4 #define GL_AMD_transform_feedback4 1 #define GL_STREAM_RASTERIZATION_AMD 0x91A0 #endif /* GL_AMD_transform_feedback4 */ #ifndef GL_AMD_vertex_shader_layer #define GL_AMD_vertex_shader_layer 1 #endif /* GL_AMD_vertex_shader_layer */ #ifndef GL_AMD_vertex_shader_tessellator #define GL_AMD_vertex_shader_tessellator 1 #define GL_SAMPLER_BUFFER_AMD 0x9001 #define GL_INT_SAMPLER_BUFFER_AMD 0x9002 #define GL_UNSIGNED_INT_SAMPLER_BUFFER_AMD 0x9003 #define GL_TESSELLATION_MODE_AMD 0x9004 #define GL_TESSELLATION_FACTOR_AMD 0x9005 #define GL_DISCRETE_AMD 0x9006 #define GL_CONTINUOUS_AMD 0x9007 typedef void (APIENTRYP PFNGLTESSELLATIONFACTORAMDPROC) (GLfloat factor); typedef void (APIENTRYP PFNGLTESSELLATIONMODEAMDPROC) (GLenum mode); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glTessellationFactorAMD (GLfloat factor); GLAPI void APIENTRY glTessellationModeAMD (GLenum mode); #endif #endif /* GL_AMD_vertex_shader_tessellator */ #ifndef GL_AMD_vertex_shader_viewport_index #define GL_AMD_vertex_shader_viewport_index 1 #endif /* GL_AMD_vertex_shader_viewport_index */ #ifndef GL_APPLE_aux_depth_stencil #define GL_APPLE_aux_depth_stencil 1 #define GL_AUX_DEPTH_STENCIL_APPLE 0x8A14 #endif /* GL_APPLE_aux_depth_stencil */ #ifndef GL_APPLE_client_storage #define GL_APPLE_client_storage 1 #define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 #endif /* GL_APPLE_client_storage */ #ifndef GL_APPLE_element_array #define GL_APPLE_element_array 1 #define GL_ELEMENT_ARRAY_APPLE 0x8A0C #define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8A0D #define GL_ELEMENT_ARRAY_POINTER_APPLE 0x8A0E typedef void (APIENTRYP PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const void *pointer); typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); typedef void (APIENTRYP PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glElementPointerAPPLE (GLenum type, const void *pointer); GLAPI void APIENTRY glDrawElementArrayAPPLE (GLenum mode, GLint first, GLsizei count); GLAPI void APIENTRY glDrawRangeElementArrayAPPLE (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); GLAPI void APIENTRY glMultiDrawElementArrayAPPLE (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); GLAPI void APIENTRY glMultiDrawRangeElementArrayAPPLE (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); #endif #endif /* GL_APPLE_element_array */ #ifndef GL_APPLE_fence #define GL_APPLE_fence 1 #define GL_DRAW_PIXELS_APPLE 0x8A0A #define GL_FENCE_APPLE 0x8A0B typedef void (APIENTRYP PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint *fences); typedef void (APIENTRYP PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint *fences); typedef void (APIENTRYP PFNGLSETFENCEAPPLEPROC) (GLuint fence); typedef GLboolean (APIENTRYP PFNGLISFENCEAPPLEPROC) (GLuint fence); typedef GLboolean (APIENTRYP PFNGLTESTFENCEAPPLEPROC) (GLuint fence); typedef void (APIENTRYP PFNGLFINISHFENCEAPPLEPROC) (GLuint fence); typedef GLboolean (APIENTRYP PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name); typedef void (APIENTRYP PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glGenFencesAPPLE (GLsizei n, GLuint *fences); GLAPI void APIENTRY glDeleteFencesAPPLE (GLsizei n, const GLuint *fences); GLAPI void APIENTRY glSetFenceAPPLE (GLuint fence); GLAPI GLboolean APIENTRY glIsFenceAPPLE (GLuint fence); GLAPI GLboolean APIENTRY glTestFenceAPPLE (GLuint fence); GLAPI void APIENTRY glFinishFenceAPPLE (GLuint fence); GLAPI GLboolean APIENTRY glTestObjectAPPLE (GLenum object, GLuint name); GLAPI void APIENTRY glFinishObjectAPPLE (GLenum object, GLint name); #endif #endif /* GL_APPLE_fence */ #ifndef GL_APPLE_float_pixels #define GL_APPLE_float_pixels 1 #define GL_HALF_APPLE 0x140B #define GL_RGBA_FLOAT32_APPLE 0x8814 #define GL_RGB_FLOAT32_APPLE 0x8815 #define GL_ALPHA_FLOAT32_APPLE 0x8816 #define GL_INTENSITY_FLOAT32_APPLE 0x8817 #define GL_LUMINANCE_FLOAT32_APPLE 0x8818 #define GL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819 #define GL_RGBA_FLOAT16_APPLE 0x881A #define GL_RGB_FLOAT16_APPLE 0x881B #define GL_ALPHA_FLOAT16_APPLE 0x881C #define GL_INTENSITY_FLOAT16_APPLE 0x881D #define GL_LUMINANCE_FLOAT16_APPLE 0x881E #define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F #define GL_COLOR_FLOAT_APPLE 0x8A0F #endif /* GL_APPLE_float_pixels */ #ifndef GL_APPLE_flush_buffer_range #define GL_APPLE_flush_buffer_range 1 #define GL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8A12 #define GL_BUFFER_FLUSHING_UNMAP_APPLE 0x8A13 typedef void (APIENTRYP PFNGLBUFFERPARAMETERIAPPLEPROC) (GLenum target, GLenum pname, GLint param); typedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) (GLenum target, GLintptr offset, GLsizeiptr size); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBufferParameteriAPPLE (GLenum target, GLenum pname, GLint param); GLAPI void APIENTRY glFlushMappedBufferRangeAPPLE (GLenum target, GLintptr offset, GLsizeiptr size); #endif #endif /* GL_APPLE_flush_buffer_range */ #ifndef GL_APPLE_object_purgeable #define GL_APPLE_object_purgeable 1 #define GL_BUFFER_OBJECT_APPLE 0x85B3 #define GL_RELEASED_APPLE 0x8A19 #define GL_VOLATILE_APPLE 0x8A1A #define GL_RETAINED_APPLE 0x8A1B #define GL_UNDEFINED_APPLE 0x8A1C #define GL_PURGEABLE_APPLE 0x8A1D typedef GLenum (APIENTRYP PFNGLOBJECTPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); typedef GLenum (APIENTRYP PFNGLOBJECTUNPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVAPPLEPROC) (GLenum objectType, GLuint name, GLenum pname, GLint *params); #ifdef GL_GLEXT_PROTOTYPES GLAPI GLenum APIENTRY glObjectPurgeableAPPLE (GLenum objectType, GLuint name, GLenum option); GLAPI GLenum APIENTRY glObjectUnpurgeableAPPLE (GLenum objectType, GLuint name, GLenum option); GLAPI void APIENTRY glGetObjectParameterivAPPLE (GLenum objectType, GLuint name, GLenum pname, GLint *params); #endif #endif /* GL_APPLE_object_purgeable */ #ifndef GL_APPLE_rgb_422 #define GL_APPLE_rgb_422 1 #define GL_RGB_422_APPLE 0x8A1F #define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA #define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB #define GL_RGB_RAW_422_APPLE 0x8A51 #endif /* GL_APPLE_rgb_422 */ #ifndef GL_APPLE_row_bytes #define GL_APPLE_row_bytes 1 #define GL_PACK_ROW_BYTES_APPLE 0x8A15 #define GL_UNPACK_ROW_BYTES_APPLE 0x8A16 #endif /* GL_APPLE_row_bytes */ #ifndef GL_APPLE_specular_vector #define GL_APPLE_specular_vector 1 #define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 #endif /* GL_APPLE_specular_vector */ #ifndef GL_APPLE_texture_range #define GL_APPLE_texture_range 1 #define GL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7 #define GL_TEXTURE_RANGE_POINTER_APPLE 0x85B8 #define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC #define GL_STORAGE_PRIVATE_APPLE 0x85BD #define GL_STORAGE_CACHED_APPLE 0x85BE #define GL_STORAGE_SHARED_APPLE 0x85BF typedef void (APIENTRYP PFNGLTEXTURERANGEAPPLEPROC) (GLenum target, GLsizei length, const void *pointer); typedef void (APIENTRYP PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC) (GLenum target, GLenum pname, void **params); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glTextureRangeAPPLE (GLenum target, GLsizei length, const void *pointer); GLAPI void APIENTRY glGetTexParameterPointervAPPLE (GLenum target, GLenum pname, void **params); #endif #endif /* GL_APPLE_texture_range */ #ifndef GL_APPLE_transform_hint #define GL_APPLE_transform_hint 1 #define GL_TRANSFORM_HINT_APPLE 0x85B1 #endif /* GL_APPLE_transform_hint */ #ifndef GL_APPLE_vertex_array_object #define GL_APPLE_vertex_array_object 1 #define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 typedef void (APIENTRYP PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays); typedef void (APIENTRYP PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, GLuint *arrays); typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBindVertexArrayAPPLE (GLuint array); GLAPI void APIENTRY glDeleteVertexArraysAPPLE (GLsizei n, const GLuint *arrays); GLAPI void APIENTRY glGenVertexArraysAPPLE (GLsizei n, GLuint *arrays); GLAPI GLboolean APIENTRY glIsVertexArrayAPPLE (GLuint array); #endif #endif /* GL_APPLE_vertex_array_object */ #ifndef GL_APPLE_vertex_array_range #define GL_APPLE_vertex_array_range 1 #define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D #define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E #define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F #define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 #define GL_STORAGE_CLIENT_APPLE 0x85B4 typedef void (APIENTRYP PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer); typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer); typedef void (APIENTRYP PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glVertexArrayRangeAPPLE (GLsizei length, void *pointer); GLAPI void APIENTRY glFlushVertexArrayRangeAPPLE (GLsizei length, void *pointer); GLAPI void APIENTRY glVertexArrayParameteriAPPLE (GLenum pname, GLint param); #endif #endif /* GL_APPLE_vertex_array_range */ #ifndef GL_APPLE_vertex_program_evaluators #define GL_APPLE_vertex_program_evaluators 1 #define GL_VERTEX_ATTRIB_MAP1_APPLE 0x8A00 #define GL_VERTEX_ATTRIB_MAP2_APPLE 0x8A01 #define GL_VERTEX_ATTRIB_MAP1_SIZE_APPLE 0x8A02 #define GL_VERTEX_ATTRIB_MAP1_COEFF_APPLE 0x8A03 #define GL_VERTEX_ATTRIB_MAP1_ORDER_APPLE 0x8A04 #define GL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE 0x8A05 #define GL_VERTEX_ATTRIB_MAP2_SIZE_APPLE 0x8A06 #define GL_VERTEX_ATTRIB_MAP2_COEFF_APPLE 0x8A07 #define GL_VERTEX_ATTRIB_MAP2_ORDER_APPLE 0x8A08 #define GL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE 0x8A09 typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); typedef GLboolean (APIENTRYP PFNGLISVERTEXATTRIBENABLEDAPPLEPROC) (GLuint index, GLenum pname); typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB1DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB1FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB2DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB2FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glEnableVertexAttribAPPLE (GLuint index, GLenum pname); GLAPI void APIENTRY glDisableVertexAttribAPPLE (GLuint index, GLenum pname); GLAPI GLboolean APIENTRY glIsVertexAttribEnabledAPPLE (GLuint index, GLenum pname); GLAPI void APIENTRY glMapVertexAttrib1dAPPLE (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); GLAPI void APIENTRY glMapVertexAttrib1fAPPLE (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); GLAPI void APIENTRY glMapVertexAttrib2dAPPLE (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); GLAPI void APIENTRY glMapVertexAttrib2fAPPLE (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); #endif #endif /* GL_APPLE_vertex_program_evaluators */ #ifndef GL_APPLE_ycbcr_422 #define GL_APPLE_ycbcr_422 1 #define GL_YCBCR_422_APPLE 0x85B9 #endif /* GL_APPLE_ycbcr_422 */ #ifndef GL_ATI_draw_buffers #define GL_ATI_draw_buffers 1 #define GL_MAX_DRAW_BUFFERS_ATI 0x8824 #define GL_DRAW_BUFFER0_ATI 0x8825 #define GL_DRAW_BUFFER1_ATI 0x8826 #define GL_DRAW_BUFFER2_ATI 0x8827 #define GL_DRAW_BUFFER3_ATI 0x8828 #define GL_DRAW_BUFFER4_ATI 0x8829 #define GL_DRAW_BUFFER5_ATI 0x882A #define GL_DRAW_BUFFER6_ATI 0x882B #define GL_DRAW_BUFFER7_ATI 0x882C #define GL_DRAW_BUFFER8_ATI 0x882D #define GL_DRAW_BUFFER9_ATI 0x882E #define GL_DRAW_BUFFER10_ATI 0x882F #define GL_DRAW_BUFFER11_ATI 0x8830 #define GL_DRAW_BUFFER12_ATI 0x8831 #define GL_DRAW_BUFFER13_ATI 0x8832 #define GL_DRAW_BUFFER14_ATI 0x8833 #define GL_DRAW_BUFFER15_ATI 0x8834 typedef void (APIENTRYP PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum *bufs); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glDrawBuffersATI (GLsizei n, const GLenum *bufs); #endif #endif /* GL_ATI_draw_buffers */ #ifndef GL_ATI_element_array #define GL_ATI_element_array 1 #define GL_ELEMENT_ARRAY_ATI 0x8768 #define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 #define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A typedef void (APIENTRYP PFNGLELEMENTPOINTERATIPROC) (GLenum type, const void *pointer); typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glElementPointerATI (GLenum type, const void *pointer); GLAPI void APIENTRY glDrawElementArrayATI (GLenum mode, GLsizei count); GLAPI void APIENTRY glDrawRangeElementArrayATI (GLenum mode, GLuint start, GLuint end, GLsizei count); #endif #endif /* GL_ATI_element_array */ #ifndef GL_ATI_envmap_bumpmap #define GL_ATI_envmap_bumpmap 1 #define GL_BUMP_ROT_MATRIX_ATI 0x8775 #define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 #define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 #define GL_BUMP_TEX_UNITS_ATI 0x8778 #define GL_DUDV_ATI 0x8779 #define GL_DU8DV8_ATI 0x877A #define GL_BUMP_ENVMAP_ATI 0x877B #define GL_BUMP_TARGET_ATI 0x877C typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, const GLint *param); typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, const GLfloat *param); typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glTexBumpParameterivATI (GLenum pname, const GLint *param); GLAPI void APIENTRY glTexBumpParameterfvATI (GLenum pname, const GLfloat *param); GLAPI void APIENTRY glGetTexBumpParameterivATI (GLenum pname, GLint *param); GLAPI void APIENTRY glGetTexBumpParameterfvATI (GLenum pname, GLfloat *param); #endif #endif /* GL_ATI_envmap_bumpmap */ #ifndef GL_ATI_fragment_shader #define GL_ATI_fragment_shader 1 #define GL_FRAGMENT_SHADER_ATI 0x8920 #define GL_REG_0_ATI 0x8921 #define GL_REG_1_ATI 0x8922 #define GL_REG_2_ATI 0x8923 #define GL_REG_3_ATI 0x8924 #define GL_REG_4_ATI 0x8925 #define GL_REG_5_ATI 0x8926 #define GL_REG_6_ATI 0x8927 #define GL_REG_7_ATI 0x8928 #define GL_REG_8_ATI 0x8929 #define GL_REG_9_ATI 0x892A #define GL_REG_10_ATI 0x892B #define GL_REG_11_ATI 0x892C #define GL_REG_12_ATI 0x892D #define GL_REG_13_ATI 0x892E #define GL_REG_14_ATI 0x892F #define GL_REG_15_ATI 0x8930 #define GL_REG_16_ATI 0x8931 #define GL_REG_17_ATI 0x8932 #define GL_REG_18_ATI 0x8933 #define GL_REG_19_ATI 0x8934 #define GL_REG_20_ATI 0x8935 #define GL_REG_21_ATI 0x8936 #define GL_REG_22_ATI 0x8937 #define GL_REG_23_ATI 0x8938 #define GL_REG_24_ATI 0x8939 #define GL_REG_25_ATI 0x893A #define GL_REG_26_ATI 0x893B #define GL_REG_27_ATI 0x893C #define GL_REG_28_ATI 0x893D #define GL_REG_29_ATI 0x893E #define GL_REG_30_ATI 0x893F #define GL_REG_31_ATI 0x8940 #define GL_CON_0_ATI 0x8941 #define GL_CON_1_ATI 0x8942 #define GL_CON_2_ATI 0x8943 #define GL_CON_3_ATI 0x8944 #define GL_CON_4_ATI 0x8945 #define GL_CON_5_ATI 0x8946 #define GL_CON_6_ATI 0x8947 #define GL_CON_7_ATI 0x8948 #define GL_CON_8_ATI 0x8949 #define GL_CON_9_ATI 0x894A #define GL_CON_10_ATI 0x894B #define GL_CON_11_ATI 0x894C #define GL_CON_12_ATI 0x894D #define GL_CON_13_ATI 0x894E #define GL_CON_14_ATI 0x894F #define GL_CON_15_ATI 0x8950 #define GL_CON_16_ATI 0x8951 #define GL_CON_17_ATI 0x8952 #define GL_CON_18_ATI 0x8953 #define GL_CON_19_ATI 0x8954 #define GL_CON_20_ATI 0x8955 #define GL_CON_21_ATI 0x8956 #define GL_CON_22_ATI 0x8957 #define GL_CON_23_ATI 0x8958 #define GL_CON_24_ATI 0x8959 #define GL_CON_25_ATI 0x895A #define GL_CON_26_ATI 0x895B #define GL_CON_27_ATI 0x895C #define GL_CON_28_ATI 0x895D #define GL_CON_29_ATI 0x895E #define GL_CON_30_ATI 0x895F #define GL_CON_31_ATI 0x8960 #define GL_MOV_ATI 0x8961 #define GL_ADD_ATI 0x8963 #define GL_MUL_ATI 0x8964 #define GL_SUB_ATI 0x8965 #define GL_DOT3_ATI 0x8966 #define GL_DOT4_ATI 0x8967 #define GL_MAD_ATI 0x8968 #define GL_LERP_ATI 0x8969 #define GL_CND_ATI 0x896A #define GL_CND0_ATI 0x896B #define GL_DOT2_ADD_ATI 0x896C #define GL_SECONDARY_INTERPOLATOR_ATI 0x896D #define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E #define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F #define GL_NUM_PASSES_ATI 0x8970 #define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 #define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 #define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 #define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 #define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 #define GL_SWIZZLE_STR_ATI 0x8976 #define GL_SWIZZLE_STQ_ATI 0x8977 #define GL_SWIZZLE_STR_DR_ATI 0x8978 #define GL_SWIZZLE_STQ_DQ_ATI 0x8979 #define GL_SWIZZLE_STRQ_ATI 0x897A #define GL_SWIZZLE_STRQ_DQ_ATI 0x897B #define GL_RED_BIT_ATI 0x00000001 #define GL_GREEN_BIT_ATI 0x00000002 #define GL_BLUE_BIT_ATI 0x00000004 #define GL_2X_BIT_ATI 0x00000001 #define GL_4X_BIT_ATI 0x00000002 #define GL_8X_BIT_ATI 0x00000004 #define GL_HALF_BIT_ATI 0x00000008 #define GL_QUARTER_BIT_ATI 0x00000010 #define GL_EIGHTH_BIT_ATI 0x00000020 #define GL_SATURATE_BIT_ATI 0x00000040 #define GL_COMP_BIT_ATI 0x00000002 #define GL_NEGATE_BIT_ATI 0x00000004 #define GL_BIAS_BIT_ATI 0x00000008 typedef GLuint (APIENTRYP PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); typedef void (APIENTRYP PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); typedef void (APIENTRYP PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); typedef void (APIENTRYP PFNGLBEGINFRAGMENTSHADERATIPROC) (void); typedef void (APIENTRYP PFNGLENDFRAGMENTSHADERATIPROC) (void); typedef void (APIENTRYP PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); typedef void (APIENTRYP PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); typedef void (APIENTRYP PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat *value); #ifdef GL_GLEXT_PROTOTYPES GLAPI GLuint APIENTRY glGenFragmentShadersATI (GLuint range); GLAPI void APIENTRY glBindFragmentShaderATI (GLuint id); GLAPI void APIENTRY glDeleteFragmentShaderATI (GLuint id); GLAPI void APIENTRY glBeginFragmentShaderATI (void); GLAPI void APIENTRY glEndFragmentShaderATI (void); GLAPI void APIENTRY glPassTexCoordATI (GLuint dst, GLuint coord, GLenum swizzle); GLAPI void APIENTRY glSampleMapATI (GLuint dst, GLuint interp, GLenum swizzle); GLAPI void APIENTRY glColorFragmentOp1ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); GLAPI void APIENTRY glColorFragmentOp2ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); GLAPI void APIENTRY glColorFragmentOp3ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); GLAPI void APIENTRY glAlphaFragmentOp1ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); GLAPI void APIENTRY glAlphaFragmentOp2ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); GLAPI void APIENTRY glAlphaFragmentOp3ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); GLAPI void APIENTRY glSetFragmentShaderConstantATI (GLuint dst, const GLfloat *value); #endif #endif /* GL_ATI_fragment_shader */ #ifndef GL_ATI_map_object_buffer #define GL_ATI_map_object_buffer 1 typedef void *(APIENTRYP PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); typedef void (APIENTRYP PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); #ifdef GL_GLEXT_PROTOTYPES GLAPI void *APIENTRY glMapObjectBufferATI (GLuint buffer); GLAPI void APIENTRY glUnmapObjectBufferATI (GLuint buffer); #endif #endif /* GL_ATI_map_object_buffer */ #ifndef GL_ATI_meminfo #define GL_ATI_meminfo 1 #define GL_VBO_FREE_MEMORY_ATI 0x87FB #define GL_TEXTURE_FREE_MEMORY_ATI 0x87FC #define GL_RENDERBUFFER_FREE_MEMORY_ATI 0x87FD #endif /* GL_ATI_meminfo */ #ifndef GL_ATI_pixel_format_float #define GL_ATI_pixel_format_float 1 #define GL_RGBA_FLOAT_MODE_ATI 0x8820 #define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 #endif /* GL_ATI_pixel_format_float */ #ifndef GL_ATI_pn_triangles #define GL_ATI_pn_triangles 1 #define GL_PN_TRIANGLES_ATI 0x87F0 #define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 #define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 #define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 #define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 #define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 #define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 #define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 #define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 typedef void (APIENTRYP PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); typedef void (APIENTRYP PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glPNTrianglesiATI (GLenum pname, GLint param); GLAPI void APIENTRY glPNTrianglesfATI (GLenum pname, GLfloat param); #endif #endif /* GL_ATI_pn_triangles */ #ifndef GL_ATI_separate_stencil #define GL_ATI_separate_stencil 1 #define GL_STENCIL_BACK_FUNC_ATI 0x8800 #define GL_STENCIL_BACK_FAIL_ATI 0x8801 #define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 #define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glStencilOpSeparateATI (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); GLAPI void APIENTRY glStencilFuncSeparateATI (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); #endif #endif /* GL_ATI_separate_stencil */ #ifndef GL_ATI_text_fragment_shader #define GL_ATI_text_fragment_shader 1 #define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 #endif /* GL_ATI_text_fragment_shader */ #ifndef GL_ATI_texture_env_combine3 #define GL_ATI_texture_env_combine3 1 #define GL_MODULATE_ADD_ATI 0x8744 #define GL_MODULATE_SIGNED_ADD_ATI 0x8745 #define GL_MODULATE_SUBTRACT_ATI 0x8746 #endif /* GL_ATI_texture_env_combine3 */ #ifndef GL_ATI_texture_float #define GL_ATI_texture_float 1 #define GL_RGBA_FLOAT32_ATI 0x8814 #define GL_RGB_FLOAT32_ATI 0x8815 #define GL_ALPHA_FLOAT32_ATI 0x8816 #define GL_INTENSITY_FLOAT32_ATI 0x8817 #define GL_LUMINANCE_FLOAT32_ATI 0x8818 #define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 #define GL_RGBA_FLOAT16_ATI 0x881A #define GL_RGB_FLOAT16_ATI 0x881B #define GL_ALPHA_FLOAT16_ATI 0x881C #define GL_INTENSITY_FLOAT16_ATI 0x881D #define GL_LUMINANCE_FLOAT16_ATI 0x881E #define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F #endif /* GL_ATI_texture_float */ #ifndef GL_ATI_texture_mirror_once #define GL_ATI_texture_mirror_once 1 #define GL_MIRROR_CLAMP_ATI 0x8742 #define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 #endif /* GL_ATI_texture_mirror_once */ #ifndef GL_ATI_vertex_array_object #define GL_ATI_vertex_array_object 1 #define GL_STATIC_ATI 0x8760 #define GL_DYNAMIC_ATI 0x8761 #define GL_PRESERVE_ATI 0x8762 #define GL_DISCARD_ATI 0x8763 #define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 #define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 #define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 #define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 typedef GLuint (APIENTRYP PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const void *pointer, GLenum usage); typedef GLboolean (APIENTRYP PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); typedef void (APIENTRYP PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const void *pointer, GLenum preserve); typedef void (APIENTRYP PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer); typedef void (APIENTRYP PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); typedef void (APIENTRYP PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint *params); #ifdef GL_GLEXT_PROTOTYPES GLAPI GLuint APIENTRY glNewObjectBufferATI (GLsizei size, const void *pointer, GLenum usage); GLAPI GLboolean APIENTRY glIsObjectBufferATI (GLuint buffer); GLAPI void APIENTRY glUpdateObjectBufferATI (GLuint buffer, GLuint offset, GLsizei size, const void *pointer, GLenum preserve); GLAPI void APIENTRY glGetObjectBufferfvATI (GLuint buffer, GLenum pname, GLfloat *params); GLAPI void APIENTRY glGetObjectBufferivATI (GLuint buffer, GLenum pname, GLint *params); GLAPI void APIENTRY glFreeObjectBufferATI (GLuint buffer); GLAPI void APIENTRY glArrayObjectATI (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); GLAPI void APIENTRY glGetArrayObjectfvATI (GLenum array, GLenum pname, GLfloat *params); GLAPI void APIENTRY glGetArrayObjectivATI (GLenum array, GLenum pname, GLint *params); GLAPI void APIENTRY glVariantArrayObjectATI (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); GLAPI void APIENTRY glGetVariantArrayObjectfvATI (GLuint id, GLenum pname, GLfloat *params); GLAPI void APIENTRY glGetVariantArrayObjectivATI (GLuint id, GLenum pname, GLint *params); #endif #endif /* GL_ATI_vertex_array_object */ #ifndef GL_ATI_vertex_attrib_array_object #define GL_ATI_vertex_attrib_array_object 1 typedef void (APIENTRYP PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint *params); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glVertexAttribArrayObjectATI (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); GLAPI void APIENTRY glGetVertexAttribArrayObjectfvATI (GLuint index, GLenum pname, GLfloat *params); GLAPI void APIENTRY glGetVertexAttribArrayObjectivATI (GLuint index, GLenum pname, GLint *params); #endif #endif /* GL_ATI_vertex_attrib_array_object */ #ifndef GL_ATI_vertex_streams #define GL_ATI_vertex_streams 1 #define GL_MAX_VERTEX_STREAMS_ATI 0x876B #define GL_VERTEX_STREAM0_ATI 0x876C #define GL_VERTEX_STREAM1_ATI 0x876D #define GL_VERTEX_STREAM2_ATI 0x876E #define GL_VERTEX_STREAM3_ATI 0x876F #define GL_VERTEX_STREAM4_ATI 0x8770 #define GL_VERTEX_STREAM5_ATI 0x8771 #define GL_VERTEX_STREAM6_ATI 0x8772 #define GL_VERTEX_STREAM7_ATI 0x8773 #define GL_VERTEX_SOURCE_ATI 0x8774 typedef void (APIENTRYP PFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x); typedef void (APIENTRYP PFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort *coords); typedef void (APIENTRYP PFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x); typedef void (APIENTRYP PFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint *coords); typedef void (APIENTRYP PFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x); typedef void (APIENTRYP PFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat *coords); typedef void (APIENTRYP PFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x); typedef void (APIENTRYP PFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble *coords); typedef void (APIENTRYP PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); typedef void (APIENTRYP PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *coords); typedef void (APIENTRYP PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); typedef void (APIENTRYP PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *coords); typedef void (APIENTRYP PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); typedef void (APIENTRYP PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *coords); typedef void (APIENTRYP PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); typedef void (APIENTRYP PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *coords); typedef void (APIENTRYP PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); typedef void (APIENTRYP PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); typedef void (APIENTRYP PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); typedef void (APIENTRYP PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); typedef void (APIENTRYP PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); typedef void (APIENTRYP PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); typedef void (APIENTRYP PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); typedef void (APIENTRYP PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); typedef void (APIENTRYP PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *coords); typedef void (APIENTRYP PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); typedef void (APIENTRYP PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *coords); typedef void (APIENTRYP PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (APIENTRYP PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *coords); typedef void (APIENTRYP PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (APIENTRYP PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *coords); typedef void (APIENTRYP PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); typedef void (APIENTRYP PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *coords); typedef void (APIENTRYP PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort nx, GLshort ny, GLshort nz); typedef void (APIENTRYP PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); typedef void (APIENTRYP PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint nx, GLint ny, GLint nz); typedef void (APIENTRYP PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); typedef void (APIENTRYP PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); typedef void (APIENTRYP PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); typedef void (APIENTRYP PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); typedef void (APIENTRYP PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); typedef void (APIENTRYP PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); typedef void (APIENTRYP PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); typedef void (APIENTRYP PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glVertexStream1sATI (GLenum stream, GLshort x); GLAPI void APIENTRY glVertexStream1svATI (GLenum stream, const GLshort *coords); GLAPI void APIENTRY glVertexStream1iATI (GLenum stream, GLint x); GLAPI void APIENTRY glVertexStream1ivATI (GLenum stream, const GLint *coords); GLAPI void APIENTRY glVertexStream1fATI (GLenum stream, GLfloat x); GLAPI void APIENTRY glVertexStream1fvATI (GLenum stream, const GLfloat *coords); GLAPI void APIENTRY glVertexStream1dATI (GLenum stream, GLdouble x); GLAPI void APIENTRY glVertexStream1dvATI (GLenum stream, const GLdouble *coords); GLAPI void APIENTRY glVertexStream2sATI (GLenum stream, GLshort x, GLshort y); GLAPI void APIENTRY glVertexStream2svATI (GLenum stream, const GLshort *coords); GLAPI void APIENTRY glVertexStream2iATI (GLenum stream, GLint x, GLint y); GLAPI void APIENTRY glVertexStream2ivATI (GLenum stream, const GLint *coords); GLAPI void APIENTRY glVertexStream2fATI (GLenum stream, GLfloat x, GLfloat y); GLAPI void APIENTRY glVertexStream2fvATI (GLenum stream, const GLfloat *coords); GLAPI void APIENTRY glVertexStream2dATI (GLenum stream, GLdouble x, GLdouble y); GLAPI void APIENTRY glVertexStream2dvATI (GLenum stream, const GLdouble *coords); GLAPI void APIENTRY glVertexStream3sATI (GLenum stream, GLshort x, GLshort y, GLshort z); GLAPI void APIENTRY glVertexStream3svATI (GLenum stream, const GLshort *coords); GLAPI void APIENTRY glVertexStream3iATI (GLenum stream, GLint x, GLint y, GLint z); GLAPI void APIENTRY glVertexStream3ivATI (GLenum stream, const GLint *coords); GLAPI void APIENTRY glVertexStream3fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z); GLAPI void APIENTRY glVertexStream3fvATI (GLenum stream, const GLfloat *coords); GLAPI void APIENTRY glVertexStream3dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z); GLAPI void APIENTRY glVertexStream3dvATI (GLenum stream, const GLdouble *coords); GLAPI void APIENTRY glVertexStream4sATI (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); GLAPI void APIENTRY glVertexStream4svATI (GLenum stream, const GLshort *coords); GLAPI void APIENTRY glVertexStream4iATI (GLenum stream, GLint x, GLint y, GLint z, GLint w); GLAPI void APIENTRY glVertexStream4ivATI (GLenum stream, const GLint *coords); GLAPI void APIENTRY glVertexStream4fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); GLAPI void APIENTRY glVertexStream4fvATI (GLenum stream, const GLfloat *coords); GLAPI void APIENTRY glVertexStream4dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); GLAPI void APIENTRY glVertexStream4dvATI (GLenum stream, const GLdouble *coords); GLAPI void APIENTRY glNormalStream3bATI (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); GLAPI void APIENTRY glNormalStream3bvATI (GLenum stream, const GLbyte *coords); GLAPI void APIENTRY glNormalStream3sATI (GLenum stream, GLshort nx, GLshort ny, GLshort nz); GLAPI void APIENTRY glNormalStream3svATI (GLenum stream, const GLshort *coords); GLAPI void APIENTRY glNormalStream3iATI (GLenum stream, GLint nx, GLint ny, GLint nz); GLAPI void APIENTRY glNormalStream3ivATI (GLenum stream, const GLint *coords); GLAPI void APIENTRY glNormalStream3fATI (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); GLAPI void APIENTRY glNormalStream3fvATI (GLenum stream, const GLfloat *coords); GLAPI void APIENTRY glNormalStream3dATI (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); GLAPI void APIENTRY glNormalStream3dvATI (GLenum stream, const GLdouble *coords); GLAPI void APIENTRY glClientActiveVertexStreamATI (GLenum stream); GLAPI void APIENTRY glVertexBlendEnviATI (GLenum pname, GLint param); GLAPI void APIENTRY glVertexBlendEnvfATI (GLenum pname, GLfloat param); #endif #endif /* GL_ATI_vertex_streams */ #ifndef GL_EXT_422_pixels #define GL_EXT_422_pixels 1 #define GL_422_EXT 0x80CC #define GL_422_REV_EXT 0x80CD #define GL_422_AVERAGE_EXT 0x80CE #define GL_422_REV_AVERAGE_EXT 0x80CF #endif /* GL_EXT_422_pixels */ #ifndef GL_EXT_abgr #define GL_EXT_abgr 1 #define GL_ABGR_EXT 0x8000 #endif /* GL_EXT_abgr */ #ifndef GL_EXT_bgra #define GL_EXT_bgra 1 #define GL_BGR_EXT 0x80E0 #define GL_BGRA_EXT 0x80E1 #endif /* GL_EXT_bgra */ #ifndef GL_EXT_bindable_uniform #define GL_EXT_bindable_uniform 1 #define GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT 0x8DE2 #define GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT 0x8DE3 #define GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT 0x8DE4 #define GL_MAX_BINDABLE_UNIFORM_SIZE_EXT 0x8DED #define GL_UNIFORM_BUFFER_EXT 0x8DEE #define GL_UNIFORM_BUFFER_BINDING_EXT 0x8DEF typedef void (APIENTRYP PFNGLUNIFORMBUFFEREXTPROC) (GLuint program, GLint location, GLuint buffer); typedef GLint (APIENTRYP PFNGLGETUNIFORMBUFFERSIZEEXTPROC) (GLuint program, GLint location); typedef GLintptr (APIENTRYP PFNGLGETUNIFORMOFFSETEXTPROC) (GLuint program, GLint location); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glUniformBufferEXT (GLuint program, GLint location, GLuint buffer); GLAPI GLint APIENTRY glGetUniformBufferSizeEXT (GLuint program, GLint location); GLAPI GLintptr APIENTRY glGetUniformOffsetEXT (GLuint program, GLint location); #endif #endif /* GL_EXT_bindable_uniform */ #ifndef GL_EXT_blend_color #define GL_EXT_blend_color 1 #define GL_CONSTANT_COLOR_EXT 0x8001 #define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 #define GL_CONSTANT_ALPHA_EXT 0x8003 #define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 #define GL_BLEND_COLOR_EXT 0x8005 typedef void (APIENTRYP PFNGLBLENDCOLOREXTPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBlendColorEXT (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); #endif #endif /* GL_EXT_blend_color */ #ifndef GL_EXT_blend_equation_separate #define GL_EXT_blend_equation_separate 1 #define GL_BLEND_EQUATION_RGB_EXT 0x8009 #define GL_BLEND_EQUATION_ALPHA_EXT 0x883D typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBlendEquationSeparateEXT (GLenum modeRGB, GLenum modeAlpha); #endif #endif /* GL_EXT_blend_equation_separate */ #ifndef GL_EXT_blend_func_separate #define GL_EXT_blend_func_separate 1 #define GL_BLEND_DST_RGB_EXT 0x80C8 #define GL_BLEND_SRC_RGB_EXT 0x80C9 #define GL_BLEND_DST_ALPHA_EXT 0x80CA #define GL_BLEND_SRC_ALPHA_EXT 0x80CB typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBlendFuncSeparateEXT (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); #endif #endif /* GL_EXT_blend_func_separate */ #ifndef GL_EXT_blend_logic_op #define GL_EXT_blend_logic_op 1 #endif /* GL_EXT_blend_logic_op */ #ifndef GL_EXT_blend_minmax #define GL_EXT_blend_minmax 1 #define GL_MIN_EXT 0x8007 #define GL_MAX_EXT 0x8008 #define GL_FUNC_ADD_EXT 0x8006 #define GL_BLEND_EQUATION_EXT 0x8009 typedef void (APIENTRYP PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBlendEquationEXT (GLenum mode); #endif #endif /* GL_EXT_blend_minmax */ #ifndef GL_EXT_blend_subtract #define GL_EXT_blend_subtract 1 #define GL_FUNC_SUBTRACT_EXT 0x800A #define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B #endif /* GL_EXT_blend_subtract */ #ifndef GL_EXT_clip_volume_hint #define GL_EXT_clip_volume_hint 1 #define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 #endif /* GL_EXT_clip_volume_hint */ #ifndef GL_EXT_cmyka #define GL_EXT_cmyka 1 #define GL_CMYK_EXT 0x800C #define GL_CMYKA_EXT 0x800D #define GL_PACK_CMYK_HINT_EXT 0x800E #define GL_UNPACK_CMYK_HINT_EXT 0x800F #endif /* GL_EXT_cmyka */ #ifndef GL_EXT_color_subtable #define GL_EXT_color_subtable 1 typedef void (APIENTRYP PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glColorSubTableEXT (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); GLAPI void APIENTRY glCopyColorSubTableEXT (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); #endif #endif /* GL_EXT_color_subtable */ #ifndef GL_EXT_compiled_vertex_array #define GL_EXT_compiled_vertex_array 1 #define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 #define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 typedef void (APIENTRYP PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); typedef void (APIENTRYP PFNGLUNLOCKARRAYSEXTPROC) (void); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glLockArraysEXT (GLint first, GLsizei count); GLAPI void APIENTRY glUnlockArraysEXT (void); #endif #endif /* GL_EXT_compiled_vertex_array */ #ifndef GL_EXT_convolution #define GL_EXT_convolution 1 #define GL_CONVOLUTION_1D_EXT 0x8010 #define GL_CONVOLUTION_2D_EXT 0x8011 #define GL_SEPARABLE_2D_EXT 0x8012 #define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 #define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 #define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 #define GL_REDUCE_EXT 0x8016 #define GL_CONVOLUTION_FORMAT_EXT 0x8017 #define GL_CONVOLUTION_WIDTH_EXT 0x8018 #define GL_CONVOLUTION_HEIGHT_EXT 0x8019 #define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A #define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B #define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C #define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D #define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E #define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F #define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 #define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 #define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 #define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat params); typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint params); typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void *image); typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glConvolutionFilter1DEXT (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); GLAPI void APIENTRY glConvolutionFilter2DEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); GLAPI void APIENTRY glConvolutionParameterfEXT (GLenum target, GLenum pname, GLfloat params); GLAPI void APIENTRY glConvolutionParameterfvEXT (GLenum target, GLenum pname, const GLfloat *params); GLAPI void APIENTRY glConvolutionParameteriEXT (GLenum target, GLenum pname, GLint params); GLAPI void APIENTRY glConvolutionParameterivEXT (GLenum target, GLenum pname, const GLint *params); GLAPI void APIENTRY glCopyConvolutionFilter1DEXT (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); GLAPI void APIENTRY glCopyConvolutionFilter2DEXT (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); GLAPI void APIENTRY glGetConvolutionFilterEXT (GLenum target, GLenum format, GLenum type, void *image); GLAPI void APIENTRY glGetConvolutionParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); GLAPI void APIENTRY glGetConvolutionParameterivEXT (GLenum target, GLenum pname, GLint *params); GLAPI void APIENTRY glGetSeparableFilterEXT (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); GLAPI void APIENTRY glSeparableFilter2DEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); #endif #endif /* GL_EXT_convolution */ #ifndef GL_EXT_coordinate_frame #define GL_EXT_coordinate_frame 1 #define GL_TANGENT_ARRAY_EXT 0x8439 #define GL_BINORMAL_ARRAY_EXT 0x843A #define GL_CURRENT_TANGENT_EXT 0x843B #define GL_CURRENT_BINORMAL_EXT 0x843C #define GL_TANGENT_ARRAY_TYPE_EXT 0x843E #define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F #define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 #define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 #define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 #define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 #define GL_MAP1_TANGENT_EXT 0x8444 #define GL_MAP2_TANGENT_EXT 0x8445 #define GL_MAP1_BINORMAL_EXT 0x8446 #define GL_MAP2_BINORMAL_EXT 0x8447 typedef void (APIENTRYP PFNGLTANGENT3BEXTPROC) (GLbyte tx, GLbyte ty, GLbyte tz); typedef void (APIENTRYP PFNGLTANGENT3BVEXTPROC) (const GLbyte *v); typedef void (APIENTRYP PFNGLTANGENT3DEXTPROC) (GLdouble tx, GLdouble ty, GLdouble tz); typedef void (APIENTRYP PFNGLTANGENT3DVEXTPROC) (const GLdouble *v); typedef void (APIENTRYP PFNGLTANGENT3FEXTPROC) (GLfloat tx, GLfloat ty, GLfloat tz); typedef void (APIENTRYP PFNGLTANGENT3FVEXTPROC) (const GLfloat *v); typedef void (APIENTRYP PFNGLTANGENT3IEXTPROC) (GLint tx, GLint ty, GLint tz); typedef void (APIENTRYP PFNGLTANGENT3IVEXTPROC) (const GLint *v); typedef void (APIENTRYP PFNGLTANGENT3SEXTPROC) (GLshort tx, GLshort ty, GLshort tz); typedef void (APIENTRYP PFNGLTANGENT3SVEXTPROC) (const GLshort *v); typedef void (APIENTRYP PFNGLBINORMAL3BEXTPROC) (GLbyte bx, GLbyte by, GLbyte bz); typedef void (APIENTRYP PFNGLBINORMAL3BVEXTPROC) (const GLbyte *v); typedef void (APIENTRYP PFNGLBINORMAL3DEXTPROC) (GLdouble bx, GLdouble by, GLdouble bz); typedef void (APIENTRYP PFNGLBINORMAL3DVEXTPROC) (const GLdouble *v); typedef void (APIENTRYP PFNGLBINORMAL3FEXTPROC) (GLfloat bx, GLfloat by, GLfloat bz); typedef void (APIENTRYP PFNGLBINORMAL3FVEXTPROC) (const GLfloat *v); typedef void (APIENTRYP PFNGLBINORMAL3IEXTPROC) (GLint bx, GLint by, GLint bz); typedef void (APIENTRYP PFNGLBINORMAL3IVEXTPROC) (const GLint *v); typedef void (APIENTRYP PFNGLBINORMAL3SEXTPROC) (GLshort bx, GLshort by, GLshort bz); typedef void (APIENTRYP PFNGLBINORMAL3SVEXTPROC) (const GLshort *v); typedef void (APIENTRYP PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, const void *pointer); typedef void (APIENTRYP PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, const void *pointer); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glTangent3bEXT (GLbyte tx, GLbyte ty, GLbyte tz); GLAPI void APIENTRY glTangent3bvEXT (const GLbyte *v); GLAPI void APIENTRY glTangent3dEXT (GLdouble tx, GLdouble ty, GLdouble tz); GLAPI void APIENTRY glTangent3dvEXT (const GLdouble *v); GLAPI void APIENTRY glTangent3fEXT (GLfloat tx, GLfloat ty, GLfloat tz); GLAPI void APIENTRY glTangent3fvEXT (const GLfloat *v); GLAPI void APIENTRY glTangent3iEXT (GLint tx, GLint ty, GLint tz); GLAPI void APIENTRY glTangent3ivEXT (const GLint *v); GLAPI void APIENTRY glTangent3sEXT (GLshort tx, GLshort ty, GLshort tz); GLAPI void APIENTRY glTangent3svEXT (const GLshort *v); GLAPI void APIENTRY glBinormal3bEXT (GLbyte bx, GLbyte by, GLbyte bz); GLAPI void APIENTRY glBinormal3bvEXT (const GLbyte *v); GLAPI void APIENTRY glBinormal3dEXT (GLdouble bx, GLdouble by, GLdouble bz); GLAPI void APIENTRY glBinormal3dvEXT (const GLdouble *v); GLAPI void APIENTRY glBinormal3fEXT (GLfloat bx, GLfloat by, GLfloat bz); GLAPI void APIENTRY glBinormal3fvEXT (const GLfloat *v); GLAPI void APIENTRY glBinormal3iEXT (GLint bx, GLint by, GLint bz); GLAPI void APIENTRY glBinormal3ivEXT (const GLint *v); GLAPI void APIENTRY glBinormal3sEXT (GLshort bx, GLshort by, GLshort bz); GLAPI void APIENTRY glBinormal3svEXT (const GLshort *v); GLAPI void APIENTRY glTangentPointerEXT (GLenum type, GLsizei stride, const void *pointer); GLAPI void APIENTRY glBinormalPointerEXT (GLenum type, GLsizei stride, const void *pointer); #endif #endif /* GL_EXT_coordinate_frame */ #ifndef GL_EXT_copy_texture #define GL_EXT_copy_texture 1 typedef void (APIENTRYP PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); typedef void (APIENTRYP PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glCopyTexImage1DEXT (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); GLAPI void APIENTRY glCopyTexImage2DEXT (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); GLAPI void APIENTRY glCopyTexSubImage1DEXT (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); GLAPI void APIENTRY glCopyTexSubImage2DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); GLAPI void APIENTRY glCopyTexSubImage3DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); #endif #endif /* GL_EXT_copy_texture */ #ifndef GL_EXT_cull_vertex #define GL_EXT_cull_vertex 1 #define GL_CULL_VERTEX_EXT 0x81AA #define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB #define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC typedef void (APIENTRYP PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble *params); typedef void (APIENTRYP PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat *params); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glCullParameterdvEXT (GLenum pname, GLdouble *params); GLAPI void APIENTRY glCullParameterfvEXT (GLenum pname, GLfloat *params); #endif #endif /* GL_EXT_cull_vertex */ #ifndef GL_EXT_debug_label #define GL_EXT_debug_label 1 #define GL_PROGRAM_PIPELINE_OBJECT_EXT 0x8A4F #define GL_PROGRAM_OBJECT_EXT 0x8B40 #define GL_SHADER_OBJECT_EXT 0x8B48 #define GL_BUFFER_OBJECT_EXT 0x9151 #define GL_QUERY_OBJECT_EXT 0x9153 #define GL_VERTEX_ARRAY_OBJECT_EXT 0x9154 typedef void (APIENTRYP PFNGLLABELOBJECTEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar *label); typedef void (APIENTRYP PFNGLGETOBJECTLABELEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glLabelObjectEXT (GLenum type, GLuint object, GLsizei length, const GLchar *label); GLAPI void APIENTRY glGetObjectLabelEXT (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); #endif #endif /* GL_EXT_debug_label */ #ifndef GL_EXT_debug_marker #define GL_EXT_debug_marker 1 typedef void (APIENTRYP PFNGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar *marker); typedef void (APIENTRYP PFNGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar *marker); typedef void (APIENTRYP PFNGLPOPGROUPMARKEREXTPROC) (void); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glInsertEventMarkerEXT (GLsizei length, const GLchar *marker); GLAPI void APIENTRY glPushGroupMarkerEXT (GLsizei length, const GLchar *marker); GLAPI void APIENTRY glPopGroupMarkerEXT (void); #endif #endif /* GL_EXT_debug_marker */ #ifndef GL_EXT_depth_bounds_test #define GL_EXT_depth_bounds_test 1 #define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 #define GL_DEPTH_BOUNDS_EXT 0x8891 typedef void (APIENTRYP PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glDepthBoundsEXT (GLclampd zmin, GLclampd zmax); #endif #endif /* GL_EXT_depth_bounds_test */ #ifndef GL_EXT_direct_state_access #define GL_EXT_direct_state_access 1 #define GL_PROGRAM_MATRIX_EXT 0x8E2D #define GL_TRANSPOSE_PROGRAM_MATRIX_EXT 0x8E2E #define GL_PROGRAM_MATRIX_STACK_DEPTH_EXT 0x8E2F typedef void (APIENTRYP PFNGLMATRIXLOADFEXTPROC) (GLenum mode, const GLfloat *m); typedef void (APIENTRYP PFNGLMATRIXLOADDEXTPROC) (GLenum mode, const GLdouble *m); typedef void (APIENTRYP PFNGLMATRIXMULTFEXTPROC) (GLenum mode, const GLfloat *m); typedef void (APIENTRYP PFNGLMATRIXMULTDEXTPROC) (GLenum mode, const GLdouble *m); typedef void (APIENTRYP PFNGLMATRIXLOADIDENTITYEXTPROC) (GLenum mode); typedef void (APIENTRYP PFNGLMATRIXROTATEFEXTPROC) (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLMATRIXROTATEDEXTPROC) (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); typedef void (APIENTRYP PFNGLMATRIXSCALEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLMATRIXSCALEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); typedef void (APIENTRYP PFNGLMATRIXTRANSLATEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLMATRIXTRANSLATEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); typedef void (APIENTRYP PFNGLMATRIXFRUSTUMEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); typedef void (APIENTRYP PFNGLMATRIXORTHOEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); typedef void (APIENTRYP PFNGLMATRIXPOPEXTPROC) (GLenum mode); typedef void (APIENTRYP PFNGLMATRIXPUSHEXTPROC) (GLenum mode); typedef void (APIENTRYP PFNGLCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); typedef void (APIENTRYP PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint param); typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); typedef void (APIENTRYP PFNGLTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); typedef void (APIENTRYP PFNGLCOPYTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); typedef void (APIENTRYP PFNGLCOPYTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (APIENTRYP PFNGLGETTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (APIENTRYP PFNGLBINDMULTITEXTUREEXTPROC) (GLenum texunit, GLenum target, GLuint texture); typedef void (APIENTRYP PFNGLMULTITEXCOORDPOINTEREXTPROC) (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void *pointer); typedef void (APIENTRYP PFNGLMULTITEXENVFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLMULTITEXENVIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); typedef void (APIENTRYP PFNGLMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLMULTITEXGENDEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); typedef void (APIENTRYP PFNGLMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLdouble *params); typedef void (APIENTRYP PFNGLMULTITEXGENFEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLMULTITEXGENIEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint param); typedef void (APIENTRYP PFNGLMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLGETMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble *params); typedef void (APIENTRYP PFNGLGETMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLMULTITEXPARAMETERFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); typedef void (APIENTRYP PFNGLMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); typedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); typedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); typedef void (APIENTRYP PFNGLCOPYMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); typedef void (APIENTRYP PFNGLCOPYMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); typedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); typedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (APIENTRYP PFNGLGETMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); typedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); typedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (APIENTRYP PFNGLENABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); typedef void (APIENTRYP PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); typedef void (APIENTRYP PFNGLGETFLOATINDEXEDVEXTPROC) (GLenum target, GLuint index, GLfloat *data); typedef void (APIENTRYP PFNGLGETDOUBLEINDEXEDVEXTPROC) (GLenum target, GLuint index, GLdouble *data); typedef void (APIENTRYP PFNGLGETPOINTERINDEXEDVEXTPROC) (GLenum target, GLuint index, void **data); typedef void (APIENTRYP PFNGLENABLEINDEXEDEXTPROC) (GLenum target, GLuint index); typedef void (APIENTRYP PFNGLDISABLEINDEXEDEXTPROC) (GLenum target, GLuint index); typedef GLboolean (APIENTRYP PFNGLISENABLEDINDEXEDEXTPROC) (GLenum target, GLuint index); typedef void (APIENTRYP PFNGLGETINTEGERINDEXEDVEXTPROC) (GLenum target, GLuint index, GLint *data); typedef void (APIENTRYP PFNGLGETBOOLEANINDEXEDVEXTPROC) (GLenum target, GLuint index, GLboolean *data); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint lod, void *img); typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits); typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); typedef void (APIENTRYP PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint lod, void *img); typedef void (APIENTRYP PFNGLMATRIXLOADTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat *m); typedef void (APIENTRYP PFNGLMATRIXLOADTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble *m); typedef void (APIENTRYP PFNGLMATRIXMULTTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat *m); typedef void (APIENTRYP PFNGLMATRIXMULTTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble *m); typedef void (APIENTRYP PFNGLNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); typedef void (APIENTRYP PFNGLNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); typedef void *(APIENTRYP PFNGLMAPNAMEDBUFFEREXTPROC) (GLuint buffer, GLenum access); typedef GLboolean (APIENTRYP PFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer); typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC) (GLuint buffer, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPOINTERVEXTPROC) (GLuint buffer, GLenum pname, void **params); typedef void (APIENTRYP PFNGLGETNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLTEXTUREBUFFEREXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); typedef void (APIENTRYP PFNGLMULTITEXBUFFEREXTPROC) (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLuint *params); typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLuint *params); typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLuint *params); typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLuint *params); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat *params); typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC) (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLint *params); typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint *params); typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLuint *params); typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint *params); typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLint *params); typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint *params); typedef void (APIENTRYP PFNGLENABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); typedef void (APIENTRYP PFNGLDISABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); typedef void (APIENTRYP PFNGLGETFLOATI_VEXTPROC) (GLenum pname, GLuint index, GLfloat *params); typedef void (APIENTRYP PFNGLGETDOUBLEI_VEXTPROC) (GLenum pname, GLuint index, GLdouble *params); typedef void (APIENTRYP PFNGLGETPOINTERI_VEXTPROC) (GLenum pname, GLuint index, void **params); typedef void (APIENTRYP PFNGLNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum format, GLsizei len, const void *string); typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLdouble *params); typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLfloat *params); typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble *params); typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat *params); typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMIVEXTPROC) (GLuint program, GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum pname, void *string); typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); typedef void (APIENTRYP PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC) (GLuint renderbuffer, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC) (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); typedef GLenum (APIENTRYP PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC) (GLuint framebuffer, GLenum target); typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGENERATETEXTUREMIPMAPEXTPROC) (GLuint texture, GLenum target); typedef void (APIENTRYP PFNGLGENERATEMULTITEXMIPMAPEXTPROC) (GLenum texunit, GLenum target); typedef void (APIENTRYP PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); typedef void (APIENTRYP PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC) (GLuint framebuffer, GLsizei n, const GLenum *bufs); typedef void (APIENTRYP PFNGLFRAMEBUFFERREADBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); typedef void (APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); typedef void (APIENTRYP PFNGLTEXTURERENDERBUFFEREXTPROC) (GLuint texture, GLenum target, GLuint renderbuffer); typedef void (APIENTRYP PFNGLMULTITEXRENDERBUFFEREXTPROC) (GLenum texunit, GLenum target, GLuint renderbuffer); typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); typedef void (APIENTRYP PFNGLVERTEXARRAYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); typedef void (APIENTRYP PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset); typedef void (APIENTRYP PFNGLVERTEXARRAYINDEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); typedef void (APIENTRYP PFNGLVERTEXARRAYNORMALOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); typedef void (APIENTRYP PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); typedef void (APIENTRYP PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset); typedef void (APIENTRYP PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); typedef void (APIENTRYP PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset); typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); typedef void (APIENTRYP PFNGLENABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); typedef void (APIENTRYP PFNGLDISABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); typedef void (APIENTRYP PFNGLENABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); typedef void (APIENTRYP PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); typedef void (APIENTRYP PFNGLGETVERTEXARRAYINTEGERVEXTPROC) (GLuint vaobj, GLenum pname, GLint *param); typedef void (APIENTRYP PFNGLGETVERTEXARRAYPOINTERVEXTPROC) (GLuint vaobj, GLenum pname, void **param); typedef void (APIENTRYP PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint *param); typedef void (APIENTRYP PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, void **param); typedef void *(APIENTRYP PFNGLMAPNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); typedef void (APIENTRYP PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); typedef void (APIENTRYP PFNGLNAMEDBUFFERSTORAGEEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLsizeiptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC) (GLuint framebuffer, GLenum pname, GLint param); typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DEXTPROC) (GLuint program, GLint location, GLdouble x); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); typedef void (APIENTRYP PFNGLTEXTUREBUFFERRANGEEXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); typedef void (APIENTRYP PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); typedef void (APIENTRYP PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor); typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); typedef void (APIENTRYP PFNGLTEXTUREPAGECOMMITMENTEXTPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean resident); typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC) (GLuint vaobj, GLuint index, GLuint divisor); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glMatrixLoadfEXT (GLenum mode, const GLfloat *m); GLAPI void APIENTRY glMatrixLoaddEXT (GLenum mode, const GLdouble *m); GLAPI void APIENTRY glMatrixMultfEXT (GLenum mode, const GLfloat *m); GLAPI void APIENTRY glMatrixMultdEXT (GLenum mode, const GLdouble *m); GLAPI void APIENTRY glMatrixLoadIdentityEXT (GLenum mode); GLAPI void APIENTRY glMatrixRotatefEXT (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); GLAPI void APIENTRY glMatrixRotatedEXT (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); GLAPI void APIENTRY glMatrixScalefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z); GLAPI void APIENTRY glMatrixScaledEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z); GLAPI void APIENTRY glMatrixTranslatefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z); GLAPI void APIENTRY glMatrixTranslatedEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z); GLAPI void APIENTRY glMatrixFrustumEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); GLAPI void APIENTRY glMatrixOrthoEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); GLAPI void APIENTRY glMatrixPopEXT (GLenum mode); GLAPI void APIENTRY glMatrixPushEXT (GLenum mode); GLAPI void APIENTRY glClientAttribDefaultEXT (GLbitfield mask); GLAPI void APIENTRY glPushClientAttribDefaultEXT (GLbitfield mask); GLAPI void APIENTRY glTextureParameterfEXT (GLuint texture, GLenum target, GLenum pname, GLfloat param); GLAPI void APIENTRY glTextureParameterfvEXT (GLuint texture, GLenum target, GLenum pname, const GLfloat *params); GLAPI void APIENTRY glTextureParameteriEXT (GLuint texture, GLenum target, GLenum pname, GLint param); GLAPI void APIENTRY glTextureParameterivEXT (GLuint texture, GLenum target, GLenum pname, const GLint *params); GLAPI void APIENTRY glTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); GLAPI void APIENTRY glTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); GLAPI void APIENTRY glTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); GLAPI void APIENTRY glTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); GLAPI void APIENTRY glCopyTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); GLAPI void APIENTRY glCopyTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); GLAPI void APIENTRY glCopyTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); GLAPI void APIENTRY glCopyTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); GLAPI void APIENTRY glGetTextureImageEXT (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); GLAPI void APIENTRY glGetTextureParameterfvEXT (GLuint texture, GLenum target, GLenum pname, GLfloat *params); GLAPI void APIENTRY glGetTextureParameterivEXT (GLuint texture, GLenum target, GLenum pname, GLint *params); GLAPI void APIENTRY glGetTextureLevelParameterfvEXT (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat *params); GLAPI void APIENTRY glGetTextureLevelParameterivEXT (GLuint texture, GLenum target, GLint level, GLenum pname, GLint *params); GLAPI void APIENTRY glTextureImage3DEXT (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); GLAPI void APIENTRY glTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); GLAPI void APIENTRY glCopyTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); GLAPI void APIENTRY glBindMultiTextureEXT (GLenum texunit, GLenum target, GLuint texture); GLAPI void APIENTRY glMultiTexCoordPointerEXT (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void *pointer); GLAPI void APIENTRY glMultiTexEnvfEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat param); GLAPI void APIENTRY glMultiTexEnvfvEXT (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); GLAPI void APIENTRY glMultiTexEnviEXT (GLenum texunit, GLenum target, GLenum pname, GLint param); GLAPI void APIENTRY glMultiTexEnvivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); GLAPI void APIENTRY glMultiTexGendEXT (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); GLAPI void APIENTRY glMultiTexGendvEXT (GLenum texunit, GLenum coord, GLenum pname, const GLdouble *params); GLAPI void APIENTRY glMultiTexGenfEXT (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); GLAPI void APIENTRY glMultiTexGenfvEXT (GLenum texunit, GLenum coord, GLenum pname, const GLfloat *params); GLAPI void APIENTRY glMultiTexGeniEXT (GLenum texunit, GLenum coord, GLenum pname, GLint param); GLAPI void APIENTRY glMultiTexGenivEXT (GLenum texunit, GLenum coord, GLenum pname, const GLint *params); GLAPI void APIENTRY glGetMultiTexEnvfvEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); GLAPI void APIENTRY glGetMultiTexEnvivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); GLAPI void APIENTRY glGetMultiTexGendvEXT (GLenum texunit, GLenum coord, GLenum pname, GLdouble *params); GLAPI void APIENTRY glGetMultiTexGenfvEXT (GLenum texunit, GLenum coord, GLenum pname, GLfloat *params); GLAPI void APIENTRY glGetMultiTexGenivEXT (GLenum texunit, GLenum coord, GLenum pname, GLint *params); GLAPI void APIENTRY glMultiTexParameteriEXT (GLenum texunit, GLenum target, GLenum pname, GLint param); GLAPI void APIENTRY glMultiTexParameterivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); GLAPI void APIENTRY glMultiTexParameterfEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat param); GLAPI void APIENTRY glMultiTexParameterfvEXT (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); GLAPI void APIENTRY glMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); GLAPI void APIENTRY glMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); GLAPI void APIENTRY glMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); GLAPI void APIENTRY glMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); GLAPI void APIENTRY glCopyMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); GLAPI void APIENTRY glCopyMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); GLAPI void APIENTRY glCopyMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); GLAPI void APIENTRY glCopyMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); GLAPI void APIENTRY glGetMultiTexImageEXT (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); GLAPI void APIENTRY glGetMultiTexParameterfvEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); GLAPI void APIENTRY glGetMultiTexParameterivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); GLAPI void APIENTRY glGetMultiTexLevelParameterfvEXT (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat *params); GLAPI void APIENTRY glGetMultiTexLevelParameterivEXT (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint *params); GLAPI void APIENTRY glMultiTexImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); GLAPI void APIENTRY glMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); GLAPI void APIENTRY glCopyMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); GLAPI void APIENTRY glEnableClientStateIndexedEXT (GLenum array, GLuint index); GLAPI void APIENTRY glDisableClientStateIndexedEXT (GLenum array, GLuint index); GLAPI void APIENTRY glGetFloatIndexedvEXT (GLenum target, GLuint index, GLfloat *data); GLAPI void APIENTRY glGetDoubleIndexedvEXT (GLenum target, GLuint index, GLdouble *data); GLAPI void APIENTRY glGetPointerIndexedvEXT (GLenum target, GLuint index, void **data); GLAPI void APIENTRY glEnableIndexedEXT (GLenum target, GLuint index); GLAPI void APIENTRY glDisableIndexedEXT (GLenum target, GLuint index); GLAPI GLboolean APIENTRY glIsEnabledIndexedEXT (GLenum target, GLuint index); GLAPI void APIENTRY glGetIntegerIndexedvEXT (GLenum target, GLuint index, GLint *data); GLAPI void APIENTRY glGetBooleanIndexedvEXT (GLenum target, GLuint index, GLboolean *data); GLAPI void APIENTRY glCompressedTextureImage3DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); GLAPI void APIENTRY glCompressedTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); GLAPI void APIENTRY glCompressedTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); GLAPI void APIENTRY glCompressedTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits); GLAPI void APIENTRY glCompressedTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); GLAPI void APIENTRY glCompressedTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); GLAPI void APIENTRY glGetCompressedTextureImageEXT (GLuint texture, GLenum target, GLint lod, void *img); GLAPI void APIENTRY glCompressedMultiTexImage3DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); GLAPI void APIENTRY glCompressedMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); GLAPI void APIENTRY glCompressedMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); GLAPI void APIENTRY glCompressedMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits); GLAPI void APIENTRY glCompressedMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); GLAPI void APIENTRY glCompressedMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); GLAPI void APIENTRY glGetCompressedMultiTexImageEXT (GLenum texunit, GLenum target, GLint lod, void *img); GLAPI void APIENTRY glMatrixLoadTransposefEXT (GLenum mode, const GLfloat *m); GLAPI void APIENTRY glMatrixLoadTransposedEXT (GLenum mode, const GLdouble *m); GLAPI void APIENTRY glMatrixMultTransposefEXT (GLenum mode, const GLfloat *m); GLAPI void APIENTRY glMatrixMultTransposedEXT (GLenum mode, const GLdouble *m); GLAPI void APIENTRY glNamedBufferDataEXT (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); GLAPI void APIENTRY glNamedBufferSubDataEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); GLAPI void *APIENTRY glMapNamedBufferEXT (GLuint buffer, GLenum access); GLAPI GLboolean APIENTRY glUnmapNamedBufferEXT (GLuint buffer); GLAPI void APIENTRY glGetNamedBufferParameterivEXT (GLuint buffer, GLenum pname, GLint *params); GLAPI void APIENTRY glGetNamedBufferPointervEXT (GLuint buffer, GLenum pname, void **params); GLAPI void APIENTRY glGetNamedBufferSubDataEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); GLAPI void APIENTRY glProgramUniform1fEXT (GLuint program, GLint location, GLfloat v0); GLAPI void APIENTRY glProgramUniform2fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1); GLAPI void APIENTRY glProgramUniform3fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); GLAPI void APIENTRY glProgramUniform4fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); GLAPI void APIENTRY glProgramUniform1iEXT (GLuint program, GLint location, GLint v0); GLAPI void APIENTRY glProgramUniform2iEXT (GLuint program, GLint location, GLint v0, GLint v1); GLAPI void APIENTRY glProgramUniform3iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); GLAPI void APIENTRY glProgramUniform4iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); GLAPI void APIENTRY glProgramUniform1fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); GLAPI void APIENTRY glProgramUniform2fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); GLAPI void APIENTRY glProgramUniform3fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); GLAPI void APIENTRY glProgramUniform4fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); GLAPI void APIENTRY glProgramUniform1ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); GLAPI void APIENTRY glProgramUniform2ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); GLAPI void APIENTRY glProgramUniform3ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); GLAPI void APIENTRY glProgramUniform4ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); GLAPI void APIENTRY glProgramUniformMatrix2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glProgramUniformMatrix3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glProgramUniformMatrix4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glProgramUniformMatrix2x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glProgramUniformMatrix3x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glProgramUniformMatrix2x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glProgramUniformMatrix4x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glProgramUniformMatrix3x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glProgramUniformMatrix4x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); GLAPI void APIENTRY glTextureBufferEXT (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); GLAPI void APIENTRY glMultiTexBufferEXT (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); GLAPI void APIENTRY glTextureParameterIivEXT (GLuint texture, GLenum target, GLenum pname, const GLint *params); GLAPI void APIENTRY glTextureParameterIuivEXT (GLuint texture, GLenum target, GLenum pname, const GLuint *params); GLAPI void APIENTRY glGetTextureParameterIivEXT (GLuint texture, GLenum target, GLenum pname, GLint *params); GLAPI void APIENTRY glGetTextureParameterIuivEXT (GLuint texture, GLenum target, GLenum pname, GLuint *params); GLAPI void APIENTRY glMultiTexParameterIivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); GLAPI void APIENTRY glMultiTexParameterIuivEXT (GLenum texunit, GLenum target, GLenum pname, const GLuint *params); GLAPI void APIENTRY glGetMultiTexParameterIivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); GLAPI void APIENTRY glGetMultiTexParameterIuivEXT (GLenum texunit, GLenum target, GLenum pname, GLuint *params); GLAPI void APIENTRY glProgramUniform1uiEXT (GLuint program, GLint location, GLuint v0); GLAPI void APIENTRY glProgramUniform2uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1); GLAPI void APIENTRY glProgramUniform3uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); GLAPI void APIENTRY glProgramUniform4uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); GLAPI void APIENTRY glProgramUniform1uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); GLAPI void APIENTRY glProgramUniform2uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); GLAPI void APIENTRY glProgramUniform3uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); GLAPI void APIENTRY glProgramUniform4uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); GLAPI void APIENTRY glNamedProgramLocalParameters4fvEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat *params); GLAPI void APIENTRY glNamedProgramLocalParameterI4iEXT (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); GLAPI void APIENTRY glNamedProgramLocalParameterI4ivEXT (GLuint program, GLenum target, GLuint index, const GLint *params); GLAPI void APIENTRY glNamedProgramLocalParametersI4ivEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint *params); GLAPI void APIENTRY glNamedProgramLocalParameterI4uiEXT (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); GLAPI void APIENTRY glNamedProgramLocalParameterI4uivEXT (GLuint program, GLenum target, GLuint index, const GLuint *params); GLAPI void APIENTRY glNamedProgramLocalParametersI4uivEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint *params); GLAPI void APIENTRY glGetNamedProgramLocalParameterIivEXT (GLuint program, GLenum target, GLuint index, GLint *params); GLAPI void APIENTRY glGetNamedProgramLocalParameterIuivEXT (GLuint program, GLenum target, GLuint index, GLuint *params); GLAPI void APIENTRY glEnableClientStateiEXT (GLenum array, GLuint index); GLAPI void APIENTRY glDisableClientStateiEXT (GLenum array, GLuint index); GLAPI void APIENTRY glGetFloati_vEXT (GLenum pname, GLuint index, GLfloat *params); GLAPI void APIENTRY glGetDoublei_vEXT (GLenum pname, GLuint index, GLdouble *params); GLAPI void APIENTRY glGetPointeri_vEXT (GLenum pname, GLuint index, void **params); GLAPI void APIENTRY glNamedProgramStringEXT (GLuint program, GLenum target, GLenum format, GLsizei len, const void *string); GLAPI void APIENTRY glNamedProgramLocalParameter4dEXT (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); GLAPI void APIENTRY glNamedProgramLocalParameter4dvEXT (GLuint program, GLenum target, GLuint index, const GLdouble *params); GLAPI void APIENTRY glNamedProgramLocalParameter4fEXT (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); GLAPI void APIENTRY glNamedProgramLocalParameter4fvEXT (GLuint program, GLenum target, GLuint index, const GLfloat *params); GLAPI void APIENTRY glGetNamedProgramLocalParameterdvEXT (GLuint program, GLenum target, GLuint index, GLdouble *params); GLAPI void APIENTRY glGetNamedProgramLocalParameterfvEXT (GLuint program, GLenum target, GLuint index, GLfloat *params); GLAPI void APIENTRY glGetNamedProgramivEXT (GLuint program, GLenum target, GLenum pname, GLint *params); GLAPI void APIENTRY glGetNamedProgramStringEXT (GLuint program, GLenum target, GLenum pname, void *string); GLAPI void APIENTRY glNamedRenderbufferStorageEXT (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); GLAPI void APIENTRY glGetNamedRenderbufferParameterivEXT (GLuint renderbuffer, GLenum pname, GLint *params); GLAPI void APIENTRY glNamedRenderbufferStorageMultisampleEXT (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); GLAPI void APIENTRY glNamedRenderbufferStorageMultisampleCoverageEXT (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); GLAPI GLenum APIENTRY glCheckNamedFramebufferStatusEXT (GLuint framebuffer, GLenum target); GLAPI void APIENTRY glNamedFramebufferTexture1DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); GLAPI void APIENTRY glNamedFramebufferTexture2DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); GLAPI void APIENTRY glNamedFramebufferTexture3DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); GLAPI void APIENTRY glNamedFramebufferRenderbufferEXT (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); GLAPI void APIENTRY glGetNamedFramebufferAttachmentParameterivEXT (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); GLAPI void APIENTRY glGenerateTextureMipmapEXT (GLuint texture, GLenum target); GLAPI void APIENTRY glGenerateMultiTexMipmapEXT (GLenum texunit, GLenum target); GLAPI void APIENTRY glFramebufferDrawBufferEXT (GLuint framebuffer, GLenum mode); GLAPI void APIENTRY glFramebufferDrawBuffersEXT (GLuint framebuffer, GLsizei n, const GLenum *bufs); GLAPI void APIENTRY glFramebufferReadBufferEXT (GLuint framebuffer, GLenum mode); GLAPI void APIENTRY glGetFramebufferParameterivEXT (GLuint framebuffer, GLenum pname, GLint *params); GLAPI void APIENTRY glNamedCopyBufferSubDataEXT (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); GLAPI void APIENTRY glNamedFramebufferTextureEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); GLAPI void APIENTRY glNamedFramebufferTextureLayerEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); GLAPI void APIENTRY glNamedFramebufferTextureFaceEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); GLAPI void APIENTRY glTextureRenderbufferEXT (GLuint texture, GLenum target, GLuint renderbuffer); GLAPI void APIENTRY glMultiTexRenderbufferEXT (GLenum texunit, GLenum target, GLuint renderbuffer); GLAPI void APIENTRY glVertexArrayVertexOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); GLAPI void APIENTRY glVertexArrayColorOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); GLAPI void APIENTRY glVertexArrayEdgeFlagOffsetEXT (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset); GLAPI void APIENTRY glVertexArrayIndexOffsetEXT (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); GLAPI void APIENTRY glVertexArrayNormalOffsetEXT (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); GLAPI void APIENTRY glVertexArrayTexCoordOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); GLAPI void APIENTRY glVertexArrayMultiTexCoordOffsetEXT (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset); GLAPI void APIENTRY glVertexArrayFogCoordOffsetEXT (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); GLAPI void APIENTRY glVertexArraySecondaryColorOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); GLAPI void APIENTRY glVertexArrayVertexAttribOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset); GLAPI void APIENTRY glVertexArrayVertexAttribIOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); GLAPI void APIENTRY glEnableVertexArrayEXT (GLuint vaobj, GLenum array); GLAPI void APIENTRY glDisableVertexArrayEXT (GLuint vaobj, GLenum array); GLAPI void APIENTRY glEnableVertexArrayAttribEXT (GLuint vaobj, GLuint index); GLAPI void APIENTRY glDisableVertexArrayAttribEXT (GLuint vaobj, GLuint index); GLAPI void APIENTRY glGetVertexArrayIntegervEXT (GLuint vaobj, GLenum pname, GLint *param); GLAPI void APIENTRY glGetVertexArrayPointervEXT (GLuint vaobj, GLenum pname, void **param); GLAPI void APIENTRY glGetVertexArrayIntegeri_vEXT (GLuint vaobj, GLuint index, GLenum pname, GLint *param); GLAPI void APIENTRY glGetVertexArrayPointeri_vEXT (GLuint vaobj, GLuint index, GLenum pname, void **param); GLAPI void *APIENTRY glMapNamedBufferRangeEXT (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); GLAPI void APIENTRY glFlushMappedNamedBufferRangeEXT (GLuint buffer, GLintptr offset, GLsizeiptr length); GLAPI void APIENTRY glNamedBufferStorageEXT (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); GLAPI void APIENTRY glClearNamedBufferDataEXT (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); GLAPI void APIENTRY glClearNamedBufferSubDataEXT (GLuint buffer, GLenum internalformat, GLsizeiptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); GLAPI void APIENTRY glNamedFramebufferParameteriEXT (GLuint framebuffer, GLenum pname, GLint param); GLAPI void APIENTRY glGetNamedFramebufferParameterivEXT (GLuint framebuffer, GLenum pname, GLint *params); GLAPI void APIENTRY glProgramUniform1dEXT (GLuint program, GLint location, GLdouble x); GLAPI void APIENTRY glProgramUniform2dEXT (GLuint program, GLint location, GLdouble x, GLdouble y); GLAPI void APIENTRY glProgramUniform3dEXT (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); GLAPI void APIENTRY glProgramUniform4dEXT (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); GLAPI void APIENTRY glProgramUniform1dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); GLAPI void APIENTRY glProgramUniform2dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); GLAPI void APIENTRY glProgramUniform3dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); GLAPI void APIENTRY glProgramUniform4dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); GLAPI void APIENTRY glProgramUniformMatrix2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glProgramUniformMatrix3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glProgramUniformMatrix4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glProgramUniformMatrix2x3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glProgramUniformMatrix2x4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glProgramUniformMatrix3x2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glProgramUniformMatrix3x4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glProgramUniformMatrix4x2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glProgramUniformMatrix4x3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); GLAPI void APIENTRY glTextureBufferRangeEXT (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); GLAPI void APIENTRY glTextureStorage1DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); GLAPI void APIENTRY glTextureStorage2DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); GLAPI void APIENTRY glTextureStorage3DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); GLAPI void APIENTRY glTextureStorage2DMultisampleEXT (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); GLAPI void APIENTRY glTextureStorage3DMultisampleEXT (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); GLAPI void APIENTRY glVertexArrayBindVertexBufferEXT (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); GLAPI void APIENTRY glVertexArrayVertexAttribFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); GLAPI void APIENTRY glVertexArrayVertexAttribIFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); GLAPI void APIENTRY glVertexArrayVertexAttribLFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); GLAPI void APIENTRY glVertexArrayVertexAttribBindingEXT (GLuint vaobj, GLuint attribindex, GLuint bindingindex); GLAPI void APIENTRY glVertexArrayVertexBindingDivisorEXT (GLuint vaobj, GLuint bindingindex, GLuint divisor); GLAPI void APIENTRY glVertexArrayVertexAttribLOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); GLAPI void APIENTRY glTexturePageCommitmentEXT (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean resident); GLAPI void APIENTRY glVertexArrayVertexAttribDivisorEXT (GLuint vaobj, GLuint index, GLuint divisor); #endif #endif /* GL_EXT_direct_state_access */ #ifndef GL_EXT_draw_buffers2 #define GL_EXT_draw_buffers2 1 typedef void (APIENTRYP PFNGLCOLORMASKINDEXEDEXTPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glColorMaskIndexedEXT (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); #endif #endif /* GL_EXT_draw_buffers2 */ #ifndef GL_EXT_draw_instanced #define GL_EXT_draw_instanced 1 typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glDrawArraysInstancedEXT (GLenum mode, GLint start, GLsizei count, GLsizei primcount); GLAPI void APIENTRY glDrawElementsInstancedEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); #endif #endif /* GL_EXT_draw_instanced */ #ifndef GL_EXT_draw_range_elements #define GL_EXT_draw_range_elements 1 #define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 #define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glDrawRangeElementsEXT (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); #endif #endif /* GL_EXT_draw_range_elements */ #ifndef GL_EXT_fog_coord #define GL_EXT_fog_coord 1 #define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 #define GL_FOG_COORDINATE_EXT 0x8451 #define GL_FRAGMENT_DEPTH_EXT 0x8452 #define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 #define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 #define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 #define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 #define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 typedef void (APIENTRYP PFNGLFOGCOORDFEXTPROC) (GLfloat coord); typedef void (APIENTRYP PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); typedef void (APIENTRYP PFNGLFOGCOORDDEXTPROC) (GLdouble coord); typedef void (APIENTRYP PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); typedef void (APIENTRYP PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const void *pointer); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glFogCoordfEXT (GLfloat coord); GLAPI void APIENTRY glFogCoordfvEXT (const GLfloat *coord); GLAPI void APIENTRY glFogCoorddEXT (GLdouble coord); GLAPI void APIENTRY glFogCoorddvEXT (const GLdouble *coord); GLAPI void APIENTRY glFogCoordPointerEXT (GLenum type, GLsizei stride, const void *pointer); #endif #endif /* GL_EXT_fog_coord */ #ifndef GL_EXT_framebuffer_blit #define GL_EXT_framebuffer_blit 1 #define GL_READ_FRAMEBUFFER_EXT 0x8CA8 #define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9 #define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6 #define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA typedef void (APIENTRYP PFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBlitFramebufferEXT (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); #endif #endif /* GL_EXT_framebuffer_blit */ #ifndef GL_EXT_framebuffer_multisample #define GL_EXT_framebuffer_multisample 1 #define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB #define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 #define GL_MAX_SAMPLES_EXT 0x8D57 typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glRenderbufferStorageMultisampleEXT (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); #endif #endif /* GL_EXT_framebuffer_multisample */ #ifndef GL_EXT_framebuffer_multisample_blit_scaled #define GL_EXT_framebuffer_multisample_blit_scaled 1 #define GL_SCALED_RESOLVE_FASTEST_EXT 0x90BA #define GL_SCALED_RESOLVE_NICEST_EXT 0x90BB #endif /* GL_EXT_framebuffer_multisample_blit_scaled */ #ifndef GL_EXT_framebuffer_object #define GL_EXT_framebuffer_object 1 #define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 #define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 #define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 #define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 #define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 #define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 #define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 #define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 #define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 #define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 #define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA #define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB #define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC #define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD #define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF #define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 #define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 #define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 #define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 #define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 #define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 #define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 #define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 #define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 #define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 #define GL_COLOR_ATTACHMENT10_EXT 0x8CEA #define GL_COLOR_ATTACHMENT11_EXT 0x8CEB #define GL_COLOR_ATTACHMENT12_EXT 0x8CEC #define GL_COLOR_ATTACHMENT13_EXT 0x8CED #define GL_COLOR_ATTACHMENT14_EXT 0x8CEE #define GL_COLOR_ATTACHMENT15_EXT 0x8CEF #define GL_DEPTH_ATTACHMENT_EXT 0x8D00 #define GL_STENCIL_ATTACHMENT_EXT 0x8D20 #define GL_FRAMEBUFFER_EXT 0x8D40 #define GL_RENDERBUFFER_EXT 0x8D41 #define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 #define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 #define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 #define GL_STENCIL_INDEX1_EXT 0x8D46 #define GL_STENCIL_INDEX4_EXT 0x8D47 #define GL_STENCIL_INDEX8_EXT 0x8D48 #define GL_STENCIL_INDEX16_EXT 0x8D49 #define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 #define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 #define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 #define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 #define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 #define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer); typedef void (APIENTRYP PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer); typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint *renderbuffers); typedef void (APIENTRYP PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint *renderbuffers); typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer); typedef void (APIENTRYP PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer); typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint *framebuffers); typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint *framebuffers); typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target); typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGENERATEMIPMAPEXTPROC) (GLenum target); #ifdef GL_GLEXT_PROTOTYPES GLAPI GLboolean APIENTRY glIsRenderbufferEXT (GLuint renderbuffer); GLAPI void APIENTRY glBindRenderbufferEXT (GLenum target, GLuint renderbuffer); GLAPI void APIENTRY glDeleteRenderbuffersEXT (GLsizei n, const GLuint *renderbuffers); GLAPI void APIENTRY glGenRenderbuffersEXT (GLsizei n, GLuint *renderbuffers); GLAPI void APIENTRY glRenderbufferStorageEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); GLAPI void APIENTRY glGetRenderbufferParameterivEXT (GLenum target, GLenum pname, GLint *params); GLAPI GLboolean APIENTRY glIsFramebufferEXT (GLuint framebuffer); GLAPI void APIENTRY glBindFramebufferEXT (GLenum target, GLuint framebuffer); GLAPI void APIENTRY glDeleteFramebuffersEXT (GLsizei n, const GLuint *framebuffers); GLAPI void APIENTRY glGenFramebuffersEXT (GLsizei n, GLuint *framebuffers); GLAPI GLenum APIENTRY glCheckFramebufferStatusEXT (GLenum target); GLAPI void APIENTRY glFramebufferTexture1DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); GLAPI void APIENTRY glFramebufferTexture2DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); GLAPI void APIENTRY glFramebufferTexture3DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); GLAPI void APIENTRY glFramebufferRenderbufferEXT (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); GLAPI void APIENTRY glGetFramebufferAttachmentParameterivEXT (GLenum target, GLenum attachment, GLenum pname, GLint *params); GLAPI void APIENTRY glGenerateMipmapEXT (GLenum target); #endif #endif /* GL_EXT_framebuffer_object */ #ifndef GL_EXT_framebuffer_sRGB #define GL_EXT_framebuffer_sRGB 1 #define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 #define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA #endif /* GL_EXT_framebuffer_sRGB */ #ifndef GL_EXT_geometry_shader4 #define GL_EXT_geometry_shader4 1 #define GL_GEOMETRY_SHADER_EXT 0x8DD9 #define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA #define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB #define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC #define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 #define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD #define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE #define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B #define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF #define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 #define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 #define GL_LINES_ADJACENCY_EXT 0x000A #define GL_LINE_STRIP_ADJACENCY_EXT 0x000B #define GL_TRIANGLES_ADJACENCY_EXT 0x000C #define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0x000D #define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 #define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9 #define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4 #define GL_PROGRAM_POINT_SIZE_EXT 0x8642 typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glProgramParameteriEXT (GLuint program, GLenum pname, GLint value); #endif #endif /* GL_EXT_geometry_shader4 */ #ifndef GL_EXT_gpu_program_parameters #define GL_EXT_gpu_program_parameters 1 typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *params); typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *params); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glProgramEnvParameters4fvEXT (GLenum target, GLuint index, GLsizei count, const GLfloat *params); GLAPI void APIENTRY glProgramLocalParameters4fvEXT (GLenum target, GLuint index, GLsizei count, const GLfloat *params); #endif #endif /* GL_EXT_gpu_program_parameters */ #ifndef GL_EXT_gpu_shader4 #define GL_EXT_gpu_shader4 1 #define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT 0x88FD #define GL_SAMPLER_1D_ARRAY_EXT 0x8DC0 #define GL_SAMPLER_2D_ARRAY_EXT 0x8DC1 #define GL_SAMPLER_BUFFER_EXT 0x8DC2 #define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3 #define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4 #define GL_SAMPLER_CUBE_SHADOW_EXT 0x8DC5 #define GL_UNSIGNED_INT_VEC2_EXT 0x8DC6 #define GL_UNSIGNED_INT_VEC3_EXT 0x8DC7 #define GL_UNSIGNED_INT_VEC4_EXT 0x8DC8 #define GL_INT_SAMPLER_1D_EXT 0x8DC9 #define GL_INT_SAMPLER_2D_EXT 0x8DCA #define GL_INT_SAMPLER_3D_EXT 0x8DCB #define GL_INT_SAMPLER_CUBE_EXT 0x8DCC #define GL_INT_SAMPLER_2D_RECT_EXT 0x8DCD #define GL_INT_SAMPLER_1D_ARRAY_EXT 0x8DCE #define GL_INT_SAMPLER_2D_ARRAY_EXT 0x8DCF #define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0 #define GL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8DD1 #define GL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8DD2 #define GL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8DD3 #define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8DD4 #define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5 #define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6 #define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7 #define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8 #define GL_MIN_PROGRAM_TEXEL_OFFSET_EXT 0x8904 #define GL_MAX_PROGRAM_TEXEL_OFFSET_EXT 0x8905 typedef void (APIENTRYP PFNGLGETUNIFORMUIVEXTPROC) (GLuint program, GLint location, GLuint *params); typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name); typedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONEXTPROC) (GLuint program, const GLchar *name); typedef void (APIENTRYP PFNGLUNIFORM1UIEXTPROC) (GLint location, GLuint v0); typedef void (APIENTRYP PFNGLUNIFORM2UIEXTPROC) (GLint location, GLuint v0, GLuint v1); typedef void (APIENTRYP PFNGLUNIFORM3UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); typedef void (APIENTRYP PFNGLUNIFORM4UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); typedef void (APIENTRYP PFNGLUNIFORM1UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); typedef void (APIENTRYP PFNGLUNIFORM2UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); typedef void (APIENTRYP PFNGLUNIFORM3UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); typedef void (APIENTRYP PFNGLUNIFORM4UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glGetUniformuivEXT (GLuint program, GLint location, GLuint *params); GLAPI void APIENTRY glBindFragDataLocationEXT (GLuint program, GLuint color, const GLchar *name); GLAPI GLint APIENTRY glGetFragDataLocationEXT (GLuint program, const GLchar *name); GLAPI void APIENTRY glUniform1uiEXT (GLint location, GLuint v0); GLAPI void APIENTRY glUniform2uiEXT (GLint location, GLuint v0, GLuint v1); GLAPI void APIENTRY glUniform3uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2); GLAPI void APIENTRY glUniform4uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); GLAPI void APIENTRY glUniform1uivEXT (GLint location, GLsizei count, const GLuint *value); GLAPI void APIENTRY glUniform2uivEXT (GLint location, GLsizei count, const GLuint *value); GLAPI void APIENTRY glUniform3uivEXT (GLint location, GLsizei count, const GLuint *value); GLAPI void APIENTRY glUniform4uivEXT (GLint location, GLsizei count, const GLuint *value); #endif #endif /* GL_EXT_gpu_shader4 */ #ifndef GL_EXT_histogram #define GL_EXT_histogram 1 #define GL_HISTOGRAM_EXT 0x8024 #define GL_PROXY_HISTOGRAM_EXT 0x8025 #define GL_HISTOGRAM_WIDTH_EXT 0x8026 #define GL_HISTOGRAM_FORMAT_EXT 0x8027 #define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 #define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 #define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A #define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B #define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C #define GL_HISTOGRAM_SINK_EXT 0x802D #define GL_MINMAX_EXT 0x802E #define GL_MINMAX_FORMAT_EXT 0x802F #define GL_MINMAX_SINK_EXT 0x8030 #define GL_TABLE_TOO_LARGE_EXT 0x8031 typedef void (APIENTRYP PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); typedef void (APIENTRYP PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); typedef void (APIENTRYP PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); typedef void (APIENTRYP PFNGLRESETMINMAXEXTPROC) (GLenum target); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glGetHistogramEXT (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); GLAPI void APIENTRY glGetHistogramParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); GLAPI void APIENTRY glGetHistogramParameterivEXT (GLenum target, GLenum pname, GLint *params); GLAPI void APIENTRY glGetMinmaxEXT (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); GLAPI void APIENTRY glGetMinmaxParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); GLAPI void APIENTRY glGetMinmaxParameterivEXT (GLenum target, GLenum pname, GLint *params); GLAPI void APIENTRY glHistogramEXT (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); GLAPI void APIENTRY glMinmaxEXT (GLenum target, GLenum internalformat, GLboolean sink); GLAPI void APIENTRY glResetHistogramEXT (GLenum target); GLAPI void APIENTRY glResetMinmaxEXT (GLenum target); #endif #endif /* GL_EXT_histogram */ #ifndef GL_EXT_index_array_formats #define GL_EXT_index_array_formats 1 #define GL_IUI_V2F_EXT 0x81AD #define GL_IUI_V3F_EXT 0x81AE #define GL_IUI_N3F_V2F_EXT 0x81AF #define GL_IUI_N3F_V3F_EXT 0x81B0 #define GL_T2F_IUI_V2F_EXT 0x81B1 #define GL_T2F_IUI_V3F_EXT 0x81B2 #define GL_T2F_IUI_N3F_V2F_EXT 0x81B3 #define GL_T2F_IUI_N3F_V3F_EXT 0x81B4 #endif /* GL_EXT_index_array_formats */ #ifndef GL_EXT_index_func #define GL_EXT_index_func 1 #define GL_INDEX_TEST_EXT 0x81B5 #define GL_INDEX_TEST_FUNC_EXT 0x81B6 #define GL_INDEX_TEST_REF_EXT 0x81B7 typedef void (APIENTRYP PFNGLINDEXFUNCEXTPROC) (GLenum func, GLclampf ref); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glIndexFuncEXT (GLenum func, GLclampf ref); #endif #endif /* GL_EXT_index_func */ #ifndef GL_EXT_index_material #define GL_EXT_index_material 1 #define GL_INDEX_MATERIAL_EXT 0x81B8 #define GL_INDEX_MATERIAL_PARAMETER_EXT 0x81B9 #define GL_INDEX_MATERIAL_FACE_EXT 0x81BA typedef void (APIENTRYP PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glIndexMaterialEXT (GLenum face, GLenum mode); #endif #endif /* GL_EXT_index_material */ #ifndef GL_EXT_index_texture #define GL_EXT_index_texture 1 #endif /* GL_EXT_index_texture */ #ifndef GL_EXT_light_texture #define GL_EXT_light_texture 1 #define GL_FRAGMENT_MATERIAL_EXT 0x8349 #define GL_FRAGMENT_NORMAL_EXT 0x834A #define GL_FRAGMENT_COLOR_EXT 0x834C #define GL_ATTENUATION_EXT 0x834D #define GL_SHADOW_ATTENUATION_EXT 0x834E #define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F #define GL_TEXTURE_LIGHT_EXT 0x8350 #define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 #define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 typedef void (APIENTRYP PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); typedef void (APIENTRYP PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); typedef void (APIENTRYP PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glApplyTextureEXT (GLenum mode); GLAPI void APIENTRY glTextureLightEXT (GLenum pname); GLAPI void APIENTRY glTextureMaterialEXT (GLenum face, GLenum mode); #endif #endif /* GL_EXT_light_texture */ #ifndef GL_EXT_misc_attribute #define GL_EXT_misc_attribute 1 #endif /* GL_EXT_misc_attribute */ #ifndef GL_EXT_multi_draw_arrays #define GL_EXT_multi_draw_arrays 1 typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glMultiDrawArraysEXT (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); GLAPI void APIENTRY glMultiDrawElementsEXT (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount); #endif #endif /* GL_EXT_multi_draw_arrays */ #ifndef GL_EXT_multisample #define GL_EXT_multisample 1 #define GL_MULTISAMPLE_EXT 0x809D #define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E #define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F #define GL_SAMPLE_MASK_EXT 0x80A0 #define GL_1PASS_EXT 0x80A1 #define GL_2PASS_0_EXT 0x80A2 #define GL_2PASS_1_EXT 0x80A3 #define GL_4PASS_0_EXT 0x80A4 #define GL_4PASS_1_EXT 0x80A5 #define GL_4PASS_2_EXT 0x80A6 #define GL_4PASS_3_EXT 0x80A7 #define GL_SAMPLE_BUFFERS_EXT 0x80A8 #define GL_SAMPLES_EXT 0x80A9 #define GL_SAMPLE_MASK_VALUE_EXT 0x80AA #define GL_SAMPLE_MASK_INVERT_EXT 0x80AB #define GL_SAMPLE_PATTERN_EXT 0x80AC #define GL_MULTISAMPLE_BIT_EXT 0x20000000 typedef void (APIENTRYP PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); typedef void (APIENTRYP PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glSampleMaskEXT (GLclampf value, GLboolean invert); GLAPI void APIENTRY glSamplePatternEXT (GLenum pattern); #endif #endif /* GL_EXT_multisample */ #ifndef GL_EXT_packed_depth_stencil #define GL_EXT_packed_depth_stencil 1 #define GL_DEPTH_STENCIL_EXT 0x84F9 #define GL_UNSIGNED_INT_24_8_EXT 0x84FA #define GL_DEPTH24_STENCIL8_EXT 0x88F0 #define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1 #endif /* GL_EXT_packed_depth_stencil */ #ifndef GL_EXT_packed_float #define GL_EXT_packed_float 1 #define GL_R11F_G11F_B10F_EXT 0x8C3A #define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B #define GL_RGBA_SIGNED_COMPONENTS_EXT 0x8C3C #endif /* GL_EXT_packed_float */ #ifndef GL_EXT_packed_pixels #define GL_EXT_packed_pixels 1 #define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 #define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 #define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 #define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 #define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 #endif /* GL_EXT_packed_pixels */ #ifndef GL_EXT_paletted_texture #define GL_EXT_paletted_texture 1 #define GL_COLOR_INDEX1_EXT 0x80E2 #define GL_COLOR_INDEX2_EXT 0x80E3 #define GL_COLOR_INDEX4_EXT 0x80E4 #define GL_COLOR_INDEX8_EXT 0x80E5 #define GL_COLOR_INDEX12_EXT 0x80E6 #define GL_COLOR_INDEX16_EXT 0x80E7 #define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED typedef void (APIENTRYP PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void *table); typedef void (APIENTRYP PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, void *data); typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glColorTableEXT (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void *table); GLAPI void APIENTRY glGetColorTableEXT (GLenum target, GLenum format, GLenum type, void *data); GLAPI void APIENTRY glGetColorTableParameterivEXT (GLenum target, GLenum pname, GLint *params); GLAPI void APIENTRY glGetColorTableParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); #endif #endif /* GL_EXT_paletted_texture */ #ifndef GL_EXT_pixel_buffer_object #define GL_EXT_pixel_buffer_object 1 #define GL_PIXEL_PACK_BUFFER_EXT 0x88EB #define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC #define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED #define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF #endif /* GL_EXT_pixel_buffer_object */ #ifndef GL_EXT_pixel_transform #define GL_EXT_pixel_transform 1 #define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 #define GL_PIXEL_MAG_FILTER_EXT 0x8331 #define GL_PIXEL_MIN_FILTER_EXT 0x8332 #define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 #define GL_CUBIC_EXT 0x8334 #define GL_AVERAGE_EXT 0x8335 #define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 #define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 #define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glPixelTransformParameteriEXT (GLenum target, GLenum pname, GLint param); GLAPI void APIENTRY glPixelTransformParameterfEXT (GLenum target, GLenum pname, GLfloat param); GLAPI void APIENTRY glPixelTransformParameterivEXT (GLenum target, GLenum pname, const GLint *params); GLAPI void APIENTRY glPixelTransformParameterfvEXT (GLenum target, GLenum pname, const GLfloat *params); GLAPI void APIENTRY glGetPixelTransformParameterivEXT (GLenum target, GLenum pname, GLint *params); GLAPI void APIENTRY glGetPixelTransformParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); #endif #endif /* GL_EXT_pixel_transform */ #ifndef GL_EXT_pixel_transform_color_table #define GL_EXT_pixel_transform_color_table 1 #endif /* GL_EXT_pixel_transform_color_table */ #ifndef GL_EXT_point_parameters #define GL_EXT_point_parameters 1 #define GL_POINT_SIZE_MIN_EXT 0x8126 #define GL_POINT_SIZE_MAX_EXT 0x8127 #define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 #define GL_DISTANCE_ATTENUATION_EXT 0x8129 typedef void (APIENTRYP PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glPointParameterfEXT (GLenum pname, GLfloat param); GLAPI void APIENTRY glPointParameterfvEXT (GLenum pname, const GLfloat *params); #endif #endif /* GL_EXT_point_parameters */ #ifndef GL_EXT_polygon_offset #define GL_EXT_polygon_offset 1 #define GL_POLYGON_OFFSET_EXT 0x8037 #define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 #define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 typedef void (APIENTRYP PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glPolygonOffsetEXT (GLfloat factor, GLfloat bias); #endif #endif /* GL_EXT_polygon_offset */ #ifndef GL_EXT_polygon_offset_clamp #define GL_EXT_polygon_offset_clamp 1 #define GL_POLYGON_OFFSET_CLAMP_EXT 0x8E1B typedef void (APIENTRYP PFNGLPOLYGONOFFSETCLAMPEXTPROC) (GLfloat factor, GLfloat units, GLfloat clamp); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glPolygonOffsetClampEXT (GLfloat factor, GLfloat units, GLfloat clamp); #endif #endif /* GL_EXT_polygon_offset_clamp */ #ifndef GL_EXT_post_depth_coverage #define GL_EXT_post_depth_coverage 1 #endif /* GL_EXT_post_depth_coverage */ #ifndef GL_EXT_provoking_vertex #define GL_EXT_provoking_vertex 1 #define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT 0x8E4C #define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D #define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E #define GL_PROVOKING_VERTEX_EXT 0x8E4F typedef void (APIENTRYP PFNGLPROVOKINGVERTEXEXTPROC) (GLenum mode); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glProvokingVertexEXT (GLenum mode); #endif #endif /* GL_EXT_provoking_vertex */ #ifndef GL_EXT_raster_multisample #define GL_EXT_raster_multisample 1 #define GL_RASTER_MULTISAMPLE_EXT 0x9327 #define GL_RASTER_SAMPLES_EXT 0x9328 #define GL_MAX_RASTER_SAMPLES_EXT 0x9329 #define GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT 0x932A #define GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT 0x932B #define GL_EFFECTIVE_RASTER_SAMPLES_EXT 0x932C typedef void (APIENTRYP PFNGLRASTERSAMPLESEXTPROC) (GLuint samples, GLboolean fixedsamplelocations); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glRasterSamplesEXT (GLuint samples, GLboolean fixedsamplelocations); #endif #endif /* GL_EXT_raster_multisample */ #ifndef GL_EXT_rescale_normal #define GL_EXT_rescale_normal 1 #define GL_RESCALE_NORMAL_EXT 0x803A #endif /* GL_EXT_rescale_normal */ #ifndef GL_EXT_secondary_color #define GL_EXT_secondary_color 1 #define GL_COLOR_SUM_EXT 0x8458 #define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 #define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A #define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B #define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C #define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D #define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glSecondaryColor3bEXT (GLbyte red, GLbyte green, GLbyte blue); GLAPI void APIENTRY glSecondaryColor3bvEXT (const GLbyte *v); GLAPI void APIENTRY glSecondaryColor3dEXT (GLdouble red, GLdouble green, GLdouble blue); GLAPI void APIENTRY glSecondaryColor3dvEXT (const GLdouble *v); GLAPI void APIENTRY glSecondaryColor3fEXT (GLfloat red, GLfloat green, GLfloat blue); GLAPI void APIENTRY glSecondaryColor3fvEXT (const GLfloat *v); GLAPI void APIENTRY glSecondaryColor3iEXT (GLint red, GLint green, GLint blue); GLAPI void APIENTRY glSecondaryColor3ivEXT (const GLint *v); GLAPI void APIENTRY glSecondaryColor3sEXT (GLshort red, GLshort green, GLshort blue); GLAPI void APIENTRY glSecondaryColor3svEXT (const GLshort *v); GLAPI void APIENTRY glSecondaryColor3ubEXT (GLubyte red, GLubyte green, GLubyte blue); GLAPI void APIENTRY glSecondaryColor3ubvEXT (const GLubyte *v); GLAPI void APIENTRY glSecondaryColor3uiEXT (GLuint red, GLuint green, GLuint blue); GLAPI void APIENTRY glSecondaryColor3uivEXT (const GLuint *v); GLAPI void APIENTRY glSecondaryColor3usEXT (GLushort red, GLushort green, GLushort blue); GLAPI void APIENTRY glSecondaryColor3usvEXT (const GLushort *v); GLAPI void APIENTRY glSecondaryColorPointerEXT (GLint size, GLenum type, GLsizei stride, const void *pointer); #endif #endif /* GL_EXT_secondary_color */ #ifndef GL_EXT_separate_shader_objects #define GL_EXT_separate_shader_objects 1 #define GL_ACTIVE_PROGRAM_EXT 0x8B8D typedef void (APIENTRYP PFNGLUSESHADERPROGRAMEXTPROC) (GLenum type, GLuint program); typedef void (APIENTRYP PFNGLACTIVEPROGRAMEXTPROC) (GLuint program); typedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMEXTPROC) (GLenum type, const GLchar *string); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glUseShaderProgramEXT (GLenum type, GLuint program); GLAPI void APIENTRY glActiveProgramEXT (GLuint program); GLAPI GLuint APIENTRY glCreateShaderProgramEXT (GLenum type, const GLchar *string); #endif #endif /* GL_EXT_separate_shader_objects */ #ifndef GL_EXT_separate_specular_color #define GL_EXT_separate_specular_color 1 #define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 #define GL_SINGLE_COLOR_EXT 0x81F9 #define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA #endif /* GL_EXT_separate_specular_color */ #ifndef GL_EXT_shader_image_load_formatted #define GL_EXT_shader_image_load_formatted 1 #endif /* GL_EXT_shader_image_load_formatted */ #ifndef GL_EXT_shader_image_load_store #define GL_EXT_shader_image_load_store 1 #define GL_MAX_IMAGE_UNITS_EXT 0x8F38 #define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS_EXT 0x8F39 #define GL_IMAGE_BINDING_NAME_EXT 0x8F3A #define GL_IMAGE_BINDING_LEVEL_EXT 0x8F3B #define GL_IMAGE_BINDING_LAYERED_EXT 0x8F3C #define GL_IMAGE_BINDING_LAYER_EXT 0x8F3D #define GL_IMAGE_BINDING_ACCESS_EXT 0x8F3E #define GL_IMAGE_1D_EXT 0x904C #define GL_IMAGE_2D_EXT 0x904D #define GL_IMAGE_3D_EXT 0x904E #define GL_IMAGE_2D_RECT_EXT 0x904F #define GL_IMAGE_CUBE_EXT 0x9050 #define GL_IMAGE_BUFFER_EXT 0x9051 #define GL_IMAGE_1D_ARRAY_EXT 0x9052 #define GL_IMAGE_2D_ARRAY_EXT 0x9053 #define GL_IMAGE_CUBE_MAP_ARRAY_EXT 0x9054 #define GL_IMAGE_2D_MULTISAMPLE_EXT 0x9055 #define GL_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9056 #define GL_INT_IMAGE_1D_EXT 0x9057 #define GL_INT_IMAGE_2D_EXT 0x9058 #define GL_INT_IMAGE_3D_EXT 0x9059 #define GL_INT_IMAGE_2D_RECT_EXT 0x905A #define GL_INT_IMAGE_CUBE_EXT 0x905B #define GL_INT_IMAGE_BUFFER_EXT 0x905C #define GL_INT_IMAGE_1D_ARRAY_EXT 0x905D #define GL_INT_IMAGE_2D_ARRAY_EXT 0x905E #define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x905F #define GL_INT_IMAGE_2D_MULTISAMPLE_EXT 0x9060 #define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9061 #define GL_UNSIGNED_INT_IMAGE_1D_EXT 0x9062 #define GL_UNSIGNED_INT_IMAGE_2D_EXT 0x9063 #define GL_UNSIGNED_INT_IMAGE_3D_EXT 0x9064 #define GL_UNSIGNED_INT_IMAGE_2D_RECT_EXT 0x9065 #define GL_UNSIGNED_INT_IMAGE_CUBE_EXT 0x9066 #define GL_UNSIGNED_INT_IMAGE_BUFFER_EXT 0x9067 #define GL_UNSIGNED_INT_IMAGE_1D_ARRAY_EXT 0x9068 #define GL_UNSIGNED_INT_IMAGE_2D_ARRAY_EXT 0x9069 #define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A #define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_EXT 0x906B #define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x906C #define GL_MAX_IMAGE_SAMPLES_EXT 0x906D #define GL_IMAGE_BINDING_FORMAT_EXT 0x906E #define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT_EXT 0x00000001 #define GL_ELEMENT_ARRAY_BARRIER_BIT_EXT 0x00000002 #define GL_UNIFORM_BARRIER_BIT_EXT 0x00000004 #define GL_TEXTURE_FETCH_BARRIER_BIT_EXT 0x00000008 #define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT_EXT 0x00000020 #define GL_COMMAND_BARRIER_BIT_EXT 0x00000040 #define GL_PIXEL_BUFFER_BARRIER_BIT_EXT 0x00000080 #define GL_TEXTURE_UPDATE_BARRIER_BIT_EXT 0x00000100 #define GL_BUFFER_UPDATE_BARRIER_BIT_EXT 0x00000200 #define GL_FRAMEBUFFER_BARRIER_BIT_EXT 0x00000400 #define GL_TRANSFORM_FEEDBACK_BARRIER_BIT_EXT 0x00000800 #define GL_ATOMIC_COUNTER_BARRIER_BIT_EXT 0x00001000 #define GL_ALL_BARRIER_BITS_EXT 0xFFFFFFFF typedef void (APIENTRYP PFNGLBINDIMAGETEXTUREEXTPROC) (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format); typedef void (APIENTRYP PFNGLMEMORYBARRIEREXTPROC) (GLbitfield barriers); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBindImageTextureEXT (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format); GLAPI void APIENTRY glMemoryBarrierEXT (GLbitfield barriers); #endif #endif /* GL_EXT_shader_image_load_store */ #ifndef GL_EXT_shader_integer_mix #define GL_EXT_shader_integer_mix 1 #endif /* GL_EXT_shader_integer_mix */ #ifndef GL_EXT_shadow_funcs #define GL_EXT_shadow_funcs 1 #endif /* GL_EXT_shadow_funcs */ #ifndef GL_EXT_shared_texture_palette #define GL_EXT_shared_texture_palette 1 #define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB #endif /* GL_EXT_shared_texture_palette */ #ifndef GL_EXT_sparse_texture2 #define GL_EXT_sparse_texture2 1 #endif /* GL_EXT_sparse_texture2 */ #ifndef GL_EXT_stencil_clear_tag #define GL_EXT_stencil_clear_tag 1 #define GL_STENCIL_TAG_BITS_EXT 0x88F2 #define GL_STENCIL_CLEAR_TAG_VALUE_EXT 0x88F3 typedef void (APIENTRYP PFNGLSTENCILCLEARTAGEXTPROC) (GLsizei stencilTagBits, GLuint stencilClearTag); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glStencilClearTagEXT (GLsizei stencilTagBits, GLuint stencilClearTag); #endif #endif /* GL_EXT_stencil_clear_tag */ #ifndef GL_EXT_stencil_two_side #define GL_EXT_stencil_two_side 1 #define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 #define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 typedef void (APIENTRYP PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glActiveStencilFaceEXT (GLenum face); #endif #endif /* GL_EXT_stencil_two_side */ #ifndef GL_EXT_stencil_wrap #define GL_EXT_stencil_wrap 1 #define GL_INCR_WRAP_EXT 0x8507 #define GL_DECR_WRAP_EXT 0x8508 #endif /* GL_EXT_stencil_wrap */ #ifndef GL_EXT_subtexture #define GL_EXT_subtexture 1 typedef void (APIENTRYP PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glTexSubImage1DEXT (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); GLAPI void APIENTRY glTexSubImage2DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); #endif #endif /* GL_EXT_subtexture */ #ifndef GL_EXT_texture #define GL_EXT_texture 1 #define GL_ALPHA4_EXT 0x803B #define GL_ALPHA8_EXT 0x803C #define GL_ALPHA12_EXT 0x803D #define GL_ALPHA16_EXT 0x803E #define GL_LUMINANCE4_EXT 0x803F #define GL_LUMINANCE8_EXT 0x8040 #define GL_LUMINANCE12_EXT 0x8041 #define GL_LUMINANCE16_EXT 0x8042 #define GL_LUMINANCE4_ALPHA4_EXT 0x8043 #define GL_LUMINANCE6_ALPHA2_EXT 0x8044 #define GL_LUMINANCE8_ALPHA8_EXT 0x8045 #define GL_LUMINANCE12_ALPHA4_EXT 0x8046 #define GL_LUMINANCE12_ALPHA12_EXT 0x8047 #define GL_LUMINANCE16_ALPHA16_EXT 0x8048 #define GL_INTENSITY_EXT 0x8049 #define GL_INTENSITY4_EXT 0x804A #define GL_INTENSITY8_EXT 0x804B #define GL_INTENSITY12_EXT 0x804C #define GL_INTENSITY16_EXT 0x804D #define GL_RGB2_EXT 0x804E #define GL_RGB4_EXT 0x804F #define GL_RGB5_EXT 0x8050 #define GL_RGB8_EXT 0x8051 #define GL_RGB10_EXT 0x8052 #define GL_RGB12_EXT 0x8053 #define GL_RGB16_EXT 0x8054 #define GL_RGBA2_EXT 0x8055 #define GL_RGBA4_EXT 0x8056 #define GL_RGB5_A1_EXT 0x8057 #define GL_RGBA8_EXT 0x8058 #define GL_RGB10_A2_EXT 0x8059 #define GL_RGBA12_EXT 0x805A #define GL_RGBA16_EXT 0x805B #define GL_TEXTURE_RED_SIZE_EXT 0x805C #define GL_TEXTURE_GREEN_SIZE_EXT 0x805D #define GL_TEXTURE_BLUE_SIZE_EXT 0x805E #define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F #define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 #define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 #define GL_REPLACE_EXT 0x8062 #define GL_PROXY_TEXTURE_1D_EXT 0x8063 #define GL_PROXY_TEXTURE_2D_EXT 0x8064 #define GL_TEXTURE_TOO_LARGE_EXT 0x8065 #endif /* GL_EXT_texture */ #ifndef GL_EXT_texture3D #define GL_EXT_texture3D 1 #define GL_PACK_SKIP_IMAGES_EXT 0x806B #define GL_PACK_IMAGE_HEIGHT_EXT 0x806C #define GL_UNPACK_SKIP_IMAGES_EXT 0x806D #define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E #define GL_TEXTURE_3D_EXT 0x806F #define GL_PROXY_TEXTURE_3D_EXT 0x8070 #define GL_TEXTURE_DEPTH_EXT 0x8071 #define GL_TEXTURE_WRAP_R_EXT 0x8072 #define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 typedef void (APIENTRYP PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glTexImage3DEXT (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); GLAPI void APIENTRY glTexSubImage3DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); #endif #endif /* GL_EXT_texture3D */ #ifndef GL_EXT_texture_array #define GL_EXT_texture_array 1 #define GL_TEXTURE_1D_ARRAY_EXT 0x8C18 #define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19 #define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A #define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B #define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C #define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D #define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF #define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glFramebufferTextureLayerEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); #endif #endif /* GL_EXT_texture_array */ #ifndef GL_EXT_texture_buffer_object #define GL_EXT_texture_buffer_object 1 #define GL_TEXTURE_BUFFER_EXT 0x8C2A #define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B #define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C #define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D #define GL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E typedef void (APIENTRYP PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glTexBufferEXT (GLenum target, GLenum internalformat, GLuint buffer); #endif #endif /* GL_EXT_texture_buffer_object */ #ifndef GL_EXT_texture_compression_latc #define GL_EXT_texture_compression_latc 1 #define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70 #define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71 #define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72 #define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73 #endif /* GL_EXT_texture_compression_latc */ #ifndef GL_EXT_texture_compression_rgtc #define GL_EXT_texture_compression_rgtc 1 #define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB #define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC #define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD #define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE #endif /* GL_EXT_texture_compression_rgtc */ #ifndef GL_EXT_texture_compression_s3tc #define GL_EXT_texture_compression_s3tc 1 #define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 #define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 #define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 #define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 #endif /* GL_EXT_texture_compression_s3tc */ #ifndef GL_EXT_texture_cube_map #define GL_EXT_texture_cube_map 1 #define GL_NORMAL_MAP_EXT 0x8511 #define GL_REFLECTION_MAP_EXT 0x8512 #define GL_TEXTURE_CUBE_MAP_EXT 0x8513 #define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 #define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A #define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B #define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C #endif /* GL_EXT_texture_cube_map */ #ifndef GL_EXT_texture_env_add #define GL_EXT_texture_env_add 1 #endif /* GL_EXT_texture_env_add */ #ifndef GL_EXT_texture_env_combine #define GL_EXT_texture_env_combine 1 #define GL_COMBINE_EXT 0x8570 #define GL_COMBINE_RGB_EXT 0x8571 #define GL_COMBINE_ALPHA_EXT 0x8572 #define GL_RGB_SCALE_EXT 0x8573 #define GL_ADD_SIGNED_EXT 0x8574 #define GL_INTERPOLATE_EXT 0x8575 #define GL_CONSTANT_EXT 0x8576 #define GL_PRIMARY_COLOR_EXT 0x8577 #define GL_PREVIOUS_EXT 0x8578 #define GL_SOURCE0_RGB_EXT 0x8580 #define GL_SOURCE1_RGB_EXT 0x8581 #define GL_SOURCE2_RGB_EXT 0x8582 #define GL_SOURCE0_ALPHA_EXT 0x8588 #define GL_SOURCE1_ALPHA_EXT 0x8589 #define GL_SOURCE2_ALPHA_EXT 0x858A #define GL_OPERAND0_RGB_EXT 0x8590 #define GL_OPERAND1_RGB_EXT 0x8591 #define GL_OPERAND2_RGB_EXT 0x8592 #define GL_OPERAND0_ALPHA_EXT 0x8598 #define GL_OPERAND1_ALPHA_EXT 0x8599 #define GL_OPERAND2_ALPHA_EXT 0x859A #endif /* GL_EXT_texture_env_combine */ #ifndef GL_EXT_texture_env_dot3 #define GL_EXT_texture_env_dot3 1 #define GL_DOT3_RGB_EXT 0x8740 #define GL_DOT3_RGBA_EXT 0x8741 #endif /* GL_EXT_texture_env_dot3 */ #ifndef GL_EXT_texture_filter_anisotropic #define GL_EXT_texture_filter_anisotropic 1 #define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE #define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF #endif /* GL_EXT_texture_filter_anisotropic */ #ifndef GL_EXT_texture_filter_minmax #define GL_EXT_texture_filter_minmax 1 #endif /* GL_EXT_texture_filter_minmax */ #ifndef GL_EXT_texture_integer #define GL_EXT_texture_integer 1 #define GL_RGBA32UI_EXT 0x8D70 #define GL_RGB32UI_EXT 0x8D71 #define GL_ALPHA32UI_EXT 0x8D72 #define GL_INTENSITY32UI_EXT 0x8D73 #define GL_LUMINANCE32UI_EXT 0x8D74 #define GL_LUMINANCE_ALPHA32UI_EXT 0x8D75 #define GL_RGBA16UI_EXT 0x8D76 #define GL_RGB16UI_EXT 0x8D77 #define GL_ALPHA16UI_EXT 0x8D78 #define GL_INTENSITY16UI_EXT 0x8D79 #define GL_LUMINANCE16UI_EXT 0x8D7A #define GL_LUMINANCE_ALPHA16UI_EXT 0x8D7B #define GL_RGBA8UI_EXT 0x8D7C #define GL_RGB8UI_EXT 0x8D7D #define GL_ALPHA8UI_EXT 0x8D7E #define GL_INTENSITY8UI_EXT 0x8D7F #define GL_LUMINANCE8UI_EXT 0x8D80 #define GL_LUMINANCE_ALPHA8UI_EXT 0x8D81 #define GL_RGBA32I_EXT 0x8D82 #define GL_RGB32I_EXT 0x8D83 #define GL_ALPHA32I_EXT 0x8D84 #define GL_INTENSITY32I_EXT 0x8D85 #define GL_LUMINANCE32I_EXT 0x8D86 #define GL_LUMINANCE_ALPHA32I_EXT 0x8D87 #define GL_RGBA16I_EXT 0x8D88 #define GL_RGB16I_EXT 0x8D89 #define GL_ALPHA16I_EXT 0x8D8A #define GL_INTENSITY16I_EXT 0x8D8B #define GL_LUMINANCE16I_EXT 0x8D8C #define GL_LUMINANCE_ALPHA16I_EXT 0x8D8D #define GL_RGBA8I_EXT 0x8D8E #define GL_RGB8I_EXT 0x8D8F #define GL_ALPHA8I_EXT 0x8D90 #define GL_INTENSITY8I_EXT 0x8D91 #define GL_LUMINANCE8I_EXT 0x8D92 #define GL_LUMINANCE_ALPHA8I_EXT 0x8D93 #define GL_RED_INTEGER_EXT 0x8D94 #define GL_GREEN_INTEGER_EXT 0x8D95 #define GL_BLUE_INTEGER_EXT 0x8D96 #define GL_ALPHA_INTEGER_EXT 0x8D97 #define GL_RGB_INTEGER_EXT 0x8D98 #define GL_RGBA_INTEGER_EXT 0x8D99 #define GL_BGR_INTEGER_EXT 0x8D9A #define GL_BGRA_INTEGER_EXT 0x8D9B #define GL_LUMINANCE_INTEGER_EXT 0x8D9C #define GL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D #define GL_RGBA_INTEGER_MODE_EXT 0x8D9E typedef void (APIENTRYP PFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params); typedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params); typedef void (APIENTRYP PFNGLCLEARCOLORIIEXTPROC) (GLint red, GLint green, GLint blue, GLint alpha); typedef void (APIENTRYP PFNGLCLEARCOLORIUIEXTPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glTexParameterIivEXT (GLenum target, GLenum pname, const GLint *params); GLAPI void APIENTRY glTexParameterIuivEXT (GLenum target, GLenum pname, const GLuint *params); GLAPI void APIENTRY glGetTexParameterIivEXT (GLenum target, GLenum pname, GLint *params); GLAPI void APIENTRY glGetTexParameterIuivEXT (GLenum target, GLenum pname, GLuint *params); GLAPI void APIENTRY glClearColorIiEXT (GLint red, GLint green, GLint blue, GLint alpha); GLAPI void APIENTRY glClearColorIuiEXT (GLuint red, GLuint green, GLuint blue, GLuint alpha); #endif #endif /* GL_EXT_texture_integer */ #ifndef GL_EXT_texture_lod_bias #define GL_EXT_texture_lod_bias 1 #define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD #define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 #define GL_TEXTURE_LOD_BIAS_EXT 0x8501 #endif /* GL_EXT_texture_lod_bias */ #ifndef GL_EXT_texture_mirror_clamp #define GL_EXT_texture_mirror_clamp 1 #define GL_MIRROR_CLAMP_EXT 0x8742 #define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 #define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 #endif /* GL_EXT_texture_mirror_clamp */ #ifndef GL_EXT_texture_object #define GL_EXT_texture_object 1 #define GL_TEXTURE_PRIORITY_EXT 0x8066 #define GL_TEXTURE_RESIDENT_EXT 0x8067 #define GL_TEXTURE_1D_BINDING_EXT 0x8068 #define GL_TEXTURE_2D_BINDING_EXT 0x8069 #define GL_TEXTURE_3D_BINDING_EXT 0x806A typedef GLboolean (APIENTRYP PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint *textures, GLboolean *residences); typedef void (APIENTRYP PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); typedef void (APIENTRYP PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint *textures); typedef void (APIENTRYP PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint *textures); typedef GLboolean (APIENTRYP PFNGLISTEXTUREEXTPROC) (GLuint texture); typedef void (APIENTRYP PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint *textures, const GLclampf *priorities); #ifdef GL_GLEXT_PROTOTYPES GLAPI GLboolean APIENTRY glAreTexturesResidentEXT (GLsizei n, const GLuint *textures, GLboolean *residences); GLAPI void APIENTRY glBindTextureEXT (GLenum target, GLuint texture); GLAPI void APIENTRY glDeleteTexturesEXT (GLsizei n, const GLuint *textures); GLAPI void APIENTRY glGenTexturesEXT (GLsizei n, GLuint *textures); GLAPI GLboolean APIENTRY glIsTextureEXT (GLuint texture); GLAPI void APIENTRY glPrioritizeTexturesEXT (GLsizei n, const GLuint *textures, const GLclampf *priorities); #endif #endif /* GL_EXT_texture_object */ #ifndef GL_EXT_texture_perturb_normal #define GL_EXT_texture_perturb_normal 1 #define GL_PERTURB_EXT 0x85AE #define GL_TEXTURE_NORMAL_EXT 0x85AF typedef void (APIENTRYP PFNGLTEXTURENORMALEXTPROC) (GLenum mode); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glTextureNormalEXT (GLenum mode); #endif #endif /* GL_EXT_texture_perturb_normal */ #ifndef GL_EXT_texture_sRGB #define GL_EXT_texture_sRGB 1 #define GL_SRGB_EXT 0x8C40 #define GL_SRGB8_EXT 0x8C41 #define GL_SRGB_ALPHA_EXT 0x8C42 #define GL_SRGB8_ALPHA8_EXT 0x8C43 #define GL_SLUMINANCE_ALPHA_EXT 0x8C44 #define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45 #define GL_SLUMINANCE_EXT 0x8C46 #define GL_SLUMINANCE8_EXT 0x8C47 #define GL_COMPRESSED_SRGB_EXT 0x8C48 #define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49 #define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A #define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B #define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C #define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D #define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E #define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F #endif /* GL_EXT_texture_sRGB */ #ifndef GL_EXT_texture_sRGB_decode #define GL_EXT_texture_sRGB_decode 1 #define GL_TEXTURE_SRGB_DECODE_EXT 0x8A48 #define GL_DECODE_EXT 0x8A49 #define GL_SKIP_DECODE_EXT 0x8A4A #endif /* GL_EXT_texture_sRGB_decode */ #ifndef GL_EXT_texture_shared_exponent #define GL_EXT_texture_shared_exponent 1 #define GL_RGB9_E5_EXT 0x8C3D #define GL_UNSIGNED_INT_5_9_9_9_REV_EXT 0x8C3E #define GL_TEXTURE_SHARED_SIZE_EXT 0x8C3F #endif /* GL_EXT_texture_shared_exponent */ #ifndef GL_EXT_texture_snorm #define GL_EXT_texture_snorm 1 #define GL_ALPHA_SNORM 0x9010 #define GL_LUMINANCE_SNORM 0x9011 #define GL_LUMINANCE_ALPHA_SNORM 0x9012 #define GL_INTENSITY_SNORM 0x9013 #define GL_ALPHA8_SNORM 0x9014 #define GL_LUMINANCE8_SNORM 0x9015 #define GL_LUMINANCE8_ALPHA8_SNORM 0x9016 #define GL_INTENSITY8_SNORM 0x9017 #define GL_ALPHA16_SNORM 0x9018 #define GL_LUMINANCE16_SNORM 0x9019 #define GL_LUMINANCE16_ALPHA16_SNORM 0x901A #define GL_INTENSITY16_SNORM 0x901B #define GL_RED_SNORM 0x8F90 #define GL_RG_SNORM 0x8F91 #define GL_RGB_SNORM 0x8F92 #define GL_RGBA_SNORM 0x8F93 #endif /* GL_EXT_texture_snorm */ #ifndef GL_EXT_texture_swizzle #define GL_EXT_texture_swizzle 1 #define GL_TEXTURE_SWIZZLE_R_EXT 0x8E42 #define GL_TEXTURE_SWIZZLE_G_EXT 0x8E43 #define GL_TEXTURE_SWIZZLE_B_EXT 0x8E44 #define GL_TEXTURE_SWIZZLE_A_EXT 0x8E45 #define GL_TEXTURE_SWIZZLE_RGBA_EXT 0x8E46 #endif /* GL_EXT_texture_swizzle */ #ifndef GL_EXT_timer_query #define GL_EXT_timer_query 1 #define GL_TIME_ELAPSED_EXT 0x88BF typedef void (APIENTRYP PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64 *params); typedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64 *params); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glGetQueryObjecti64vEXT (GLuint id, GLenum pname, GLint64 *params); GLAPI void APIENTRY glGetQueryObjectui64vEXT (GLuint id, GLenum pname, GLuint64 *params); #endif #endif /* GL_EXT_timer_query */ #ifndef GL_EXT_transform_feedback #define GL_EXT_transform_feedback 1 #define GL_TRANSFORM_FEEDBACK_BUFFER_EXT 0x8C8E #define GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT 0x8C84 #define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT 0x8C85 #define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT 0x8C8F #define GL_INTERLEAVED_ATTRIBS_EXT 0x8C8C #define GL_SEPARATE_ATTRIBS_EXT 0x8C8D #define GL_PRIMITIVES_GENERATED_EXT 0x8C87 #define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT 0x8C88 #define GL_RASTERIZER_DISCARD_EXT 0x8C89 #define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT 0x8C8A #define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT 0x8C8B #define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT 0x8C80 #define GL_TRANSFORM_FEEDBACK_VARYINGS_EXT 0x8C83 #define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT 0x8C7F #define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT 0x8C76 typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKEXTPROC) (GLenum primitiveMode); typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKEXTPROC) (void); typedef void (APIENTRYP PFNGLBINDBUFFERRANGEEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); typedef void (APIENTRYP PFNGLBINDBUFFEROFFSETEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); typedef void (APIENTRYP PFNGLBINDBUFFERBASEEXTPROC) (GLenum target, GLuint index, GLuint buffer); typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBeginTransformFeedbackEXT (GLenum primitiveMode); GLAPI void APIENTRY glEndTransformFeedbackEXT (void); GLAPI void APIENTRY glBindBufferRangeEXT (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); GLAPI void APIENTRY glBindBufferOffsetEXT (GLenum target, GLuint index, GLuint buffer, GLintptr offset); GLAPI void APIENTRY glBindBufferBaseEXT (GLenum target, GLuint index, GLuint buffer); GLAPI void APIENTRY glTransformFeedbackVaryingsEXT (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); GLAPI void APIENTRY glGetTransformFeedbackVaryingEXT (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); #endif #endif /* GL_EXT_transform_feedback */ #ifndef GL_EXT_vertex_array #define GL_EXT_vertex_array 1 #define GL_VERTEX_ARRAY_EXT 0x8074 #define GL_NORMAL_ARRAY_EXT 0x8075 #define GL_COLOR_ARRAY_EXT 0x8076 #define GL_INDEX_ARRAY_EXT 0x8077 #define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 #define GL_EDGE_FLAG_ARRAY_EXT 0x8079 #define GL_VERTEX_ARRAY_SIZE_EXT 0x807A #define GL_VERTEX_ARRAY_TYPE_EXT 0x807B #define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C #define GL_VERTEX_ARRAY_COUNT_EXT 0x807D #define GL_NORMAL_ARRAY_TYPE_EXT 0x807E #define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F #define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 #define GL_COLOR_ARRAY_SIZE_EXT 0x8081 #define GL_COLOR_ARRAY_TYPE_EXT 0x8082 #define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 #define GL_COLOR_ARRAY_COUNT_EXT 0x8084 #define GL_INDEX_ARRAY_TYPE_EXT 0x8085 #define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 #define GL_INDEX_ARRAY_COUNT_EXT 0x8087 #define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 #define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 #define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A #define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B #define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C #define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D #define GL_VERTEX_ARRAY_POINTER_EXT 0x808E #define GL_NORMAL_ARRAY_POINTER_EXT 0x808F #define GL_COLOR_ARRAY_POINTER_EXT 0x8090 #define GL_INDEX_ARRAY_POINTER_EXT 0x8091 #define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 #define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 typedef void (APIENTRYP PFNGLARRAYELEMENTEXTPROC) (GLint i); typedef void (APIENTRYP PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); typedef void (APIENTRYP PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); typedef void (APIENTRYP PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean *pointer); typedef void (APIENTRYP PFNGLGETPOINTERVEXTPROC) (GLenum pname, void **params); typedef void (APIENTRYP PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void *pointer); typedef void (APIENTRYP PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void *pointer); typedef void (APIENTRYP PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); typedef void (APIENTRYP PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glArrayElementEXT (GLint i); GLAPI void APIENTRY glColorPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); GLAPI void APIENTRY glDrawArraysEXT (GLenum mode, GLint first, GLsizei count); GLAPI void APIENTRY glEdgeFlagPointerEXT (GLsizei stride, GLsizei count, const GLboolean *pointer); GLAPI void APIENTRY glGetPointervEXT (GLenum pname, void **params); GLAPI void APIENTRY glIndexPointerEXT (GLenum type, GLsizei stride, GLsizei count, const void *pointer); GLAPI void APIENTRY glNormalPointerEXT (GLenum type, GLsizei stride, GLsizei count, const void *pointer); GLAPI void APIENTRY glTexCoordPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); GLAPI void APIENTRY glVertexPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); #endif #endif /* GL_EXT_vertex_array */ #ifndef GL_EXT_vertex_array_bgra #define GL_EXT_vertex_array_bgra 1 #endif /* GL_EXT_vertex_array_bgra */ #ifndef GL_EXT_vertex_attrib_64bit #define GL_EXT_vertex_attrib_64bit 1 #define GL_DOUBLE_VEC2_EXT 0x8FFC #define GL_DOUBLE_VEC3_EXT 0x8FFD #define GL_DOUBLE_VEC4_EXT 0x8FFE #define GL_DOUBLE_MAT2_EXT 0x8F46 #define GL_DOUBLE_MAT3_EXT 0x8F47 #define GL_DOUBLE_MAT4_EXT 0x8F48 #define GL_DOUBLE_MAT2x3_EXT 0x8F49 #define GL_DOUBLE_MAT2x4_EXT 0x8F4A #define GL_DOUBLE_MAT3x2_EXT 0x8F4B #define GL_DOUBLE_MAT3x4_EXT 0x8F4C #define GL_DOUBLE_MAT4x2_EXT 0x8F4D #define GL_DOUBLE_MAT4x3_EXT 0x8F4E typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DEXTPROC) (GLuint index, GLdouble x); typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DEXTPROC) (GLuint index, GLdouble x, GLdouble y); typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DVEXTPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DVEXTPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DVEXTPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DVEXTPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLDVEXTPROC) (GLuint index, GLenum pname, GLdouble *params); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glVertexAttribL1dEXT (GLuint index, GLdouble x); GLAPI void APIENTRY glVertexAttribL2dEXT (GLuint index, GLdouble x, GLdouble y); GLAPI void APIENTRY glVertexAttribL3dEXT (GLuint index, GLdouble x, GLdouble y, GLdouble z); GLAPI void APIENTRY glVertexAttribL4dEXT (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); GLAPI void APIENTRY glVertexAttribL1dvEXT (GLuint index, const GLdouble *v); GLAPI void APIENTRY glVertexAttribL2dvEXT (GLuint index, const GLdouble *v); GLAPI void APIENTRY glVertexAttribL3dvEXT (GLuint index, const GLdouble *v); GLAPI void APIENTRY glVertexAttribL4dvEXT (GLuint index, const GLdouble *v); GLAPI void APIENTRY glVertexAttribLPointerEXT (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); GLAPI void APIENTRY glGetVertexAttribLdvEXT (GLuint index, GLenum pname, GLdouble *params); #endif #endif /* GL_EXT_vertex_attrib_64bit */ #ifndef GL_EXT_vertex_shader #define GL_EXT_vertex_shader 1 #define GL_VERTEX_SHADER_EXT 0x8780 #define GL_VERTEX_SHADER_BINDING_EXT 0x8781 #define GL_OP_INDEX_EXT 0x8782 #define GL_OP_NEGATE_EXT 0x8783 #define GL_OP_DOT3_EXT 0x8784 #define GL_OP_DOT4_EXT 0x8785 #define GL_OP_MUL_EXT 0x8786 #define GL_OP_ADD_EXT 0x8787 #define GL_OP_MADD_EXT 0x8788 #define GL_OP_FRAC_EXT 0x8789 #define GL_OP_MAX_EXT 0x878A #define GL_OP_MIN_EXT 0x878B #define GL_OP_SET_GE_EXT 0x878C #define GL_OP_SET_LT_EXT 0x878D #define GL_OP_CLAMP_EXT 0x878E #define GL_OP_FLOOR_EXT 0x878F #define GL_OP_ROUND_EXT 0x8790 #define GL_OP_EXP_BASE_2_EXT 0x8791 #define GL_OP_LOG_BASE_2_EXT 0x8792 #define GL_OP_POWER_EXT 0x8793 #define GL_OP_RECIP_EXT 0x8794 #define GL_OP_RECIP_SQRT_EXT 0x8795 #define GL_OP_SUB_EXT 0x8796 #define GL_OP_CROSS_PRODUCT_EXT 0x8797 #define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 #define GL_OP_MOV_EXT 0x8799 #define GL_OUTPUT_VERTEX_EXT 0x879A #define GL_OUTPUT_COLOR0_EXT 0x879B #define GL_OUTPUT_COLOR1_EXT 0x879C #define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D #define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E #define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F #define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 #define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 #define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 #define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 #define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 #define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 #define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 #define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 #define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 #define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 #define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA #define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB #define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC #define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD #define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE #define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF #define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 #define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 #define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 #define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 #define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 #define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 #define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 #define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 #define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 #define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 #define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA #define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB #define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC #define GL_OUTPUT_FOG_EXT 0x87BD #define GL_SCALAR_EXT 0x87BE #define GL_VECTOR_EXT 0x87BF #define GL_MATRIX_EXT 0x87C0 #define GL_VARIANT_EXT 0x87C1 #define GL_INVARIANT_EXT 0x87C2 #define GL_LOCAL_CONSTANT_EXT 0x87C3 #define GL_LOCAL_EXT 0x87C4 #define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 #define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 #define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 #define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 #define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 #define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA #define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB #define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CC #define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CD #define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE #define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF #define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 #define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 #define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 #define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 #define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 #define GL_X_EXT 0x87D5 #define GL_Y_EXT 0x87D6 #define GL_Z_EXT 0x87D7 #define GL_W_EXT 0x87D8 #define GL_NEGATIVE_X_EXT 0x87D9 #define GL_NEGATIVE_Y_EXT 0x87DA #define GL_NEGATIVE_Z_EXT 0x87DB #define GL_NEGATIVE_W_EXT 0x87DC #define GL_ZERO_EXT 0x87DD #define GL_ONE_EXT 0x87DE #define GL_NEGATIVE_ONE_EXT 0x87DF #define GL_NORMALIZED_RANGE_EXT 0x87E0 #define GL_FULL_RANGE_EXT 0x87E1 #define GL_CURRENT_VERTEX_EXT 0x87E2 #define GL_MVP_MATRIX_EXT 0x87E3 #define GL_VARIANT_VALUE_EXT 0x87E4 #define GL_VARIANT_DATATYPE_EXT 0x87E5 #define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 #define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 #define GL_VARIANT_ARRAY_EXT 0x87E8 #define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 #define GL_INVARIANT_VALUE_EXT 0x87EA #define GL_INVARIANT_DATATYPE_EXT 0x87EB #define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC #define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED typedef void (APIENTRYP PFNGLBEGINVERTEXSHADEREXTPROC) (void); typedef void (APIENTRYP PFNGLENDVERTEXSHADEREXTPROC) (void); typedef void (APIENTRYP PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); typedef GLuint (APIENTRYP PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); typedef void (APIENTRYP PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); typedef void (APIENTRYP PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); typedef void (APIENTRYP PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); typedef void (APIENTRYP PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); typedef void (APIENTRYP PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); typedef void (APIENTRYP PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); typedef void (APIENTRYP PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); typedef void (APIENTRYP PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); typedef GLuint (APIENTRYP PFNGLGENSYMBOLSEXTPROC) (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); typedef void (APIENTRYP PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, const void *addr); typedef void (APIENTRYP PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, const void *addr); typedef void (APIENTRYP PFNGLVARIANTBVEXTPROC) (GLuint id, const GLbyte *addr); typedef void (APIENTRYP PFNGLVARIANTSVEXTPROC) (GLuint id, const GLshort *addr); typedef void (APIENTRYP PFNGLVARIANTIVEXTPROC) (GLuint id, const GLint *addr); typedef void (APIENTRYP PFNGLVARIANTFVEXTPROC) (GLuint id, const GLfloat *addr); typedef void (APIENTRYP PFNGLVARIANTDVEXTPROC) (GLuint id, const GLdouble *addr); typedef void (APIENTRYP PFNGLVARIANTUBVEXTPROC) (GLuint id, const GLubyte *addr); typedef void (APIENTRYP PFNGLVARIANTUSVEXTPROC) (GLuint id, const GLushort *addr); typedef void (APIENTRYP PFNGLVARIANTUIVEXTPROC) (GLuint id, const GLuint *addr); typedef void (APIENTRYP PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, const void *addr); typedef void (APIENTRYP PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); typedef void (APIENTRYP PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); typedef GLuint (APIENTRYP PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); typedef GLuint (APIENTRYP PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); typedef GLuint (APIENTRYP PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); typedef GLuint (APIENTRYP PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); typedef GLuint (APIENTRYP PFNGLBINDPARAMETEREXTPROC) (GLenum value); typedef GLboolean (APIENTRYP PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); typedef void (APIENTRYP PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); typedef void (APIENTRYP PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); typedef void (APIENTRYP PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); typedef void (APIENTRYP PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, void **data); typedef void (APIENTRYP PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); typedef void (APIENTRYP PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); typedef void (APIENTRYP PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); typedef void (APIENTRYP PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); typedef void (APIENTRYP PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); typedef void (APIENTRYP PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBeginVertexShaderEXT (void); GLAPI void APIENTRY glEndVertexShaderEXT (void); GLAPI void APIENTRY glBindVertexShaderEXT (GLuint id); GLAPI GLuint APIENTRY glGenVertexShadersEXT (GLuint range); GLAPI void APIENTRY glDeleteVertexShaderEXT (GLuint id); GLAPI void APIENTRY glShaderOp1EXT (GLenum op, GLuint res, GLuint arg1); GLAPI void APIENTRY glShaderOp2EXT (GLenum op, GLuint res, GLuint arg1, GLuint arg2); GLAPI void APIENTRY glShaderOp3EXT (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); GLAPI void APIENTRY glSwizzleEXT (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); GLAPI void APIENTRY glWriteMaskEXT (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); GLAPI void APIENTRY glInsertComponentEXT (GLuint res, GLuint src, GLuint num); GLAPI void APIENTRY glExtractComponentEXT (GLuint res, GLuint src, GLuint num); GLAPI GLuint APIENTRY glGenSymbolsEXT (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); GLAPI void APIENTRY glSetInvariantEXT (GLuint id, GLenum type, const void *addr); GLAPI void APIENTRY glSetLocalConstantEXT (GLuint id, GLenum type, const void *addr); GLAPI void APIENTRY glVariantbvEXT (GLuint id, const GLbyte *addr); GLAPI void APIENTRY glVariantsvEXT (GLuint id, const GLshort *addr); GLAPI void APIENTRY glVariantivEXT (GLuint id, const GLint *addr); GLAPI void APIENTRY glVariantfvEXT (GLuint id, const GLfloat *addr); GLAPI void APIENTRY glVariantdvEXT (GLuint id, const GLdouble *addr); GLAPI void APIENTRY glVariantubvEXT (GLuint id, const GLubyte *addr); GLAPI void APIENTRY glVariantusvEXT (GLuint id, const GLushort *addr); GLAPI void APIENTRY glVariantuivEXT (GLuint id, const GLuint *addr); GLAPI void APIENTRY glVariantPointerEXT (GLuint id, GLenum type, GLuint stride, const void *addr); GLAPI void APIENTRY glEnableVariantClientStateEXT (GLuint id); GLAPI void APIENTRY glDisableVariantClientStateEXT (GLuint id); GLAPI GLuint APIENTRY glBindLightParameterEXT (GLenum light, GLenum value); GLAPI GLuint APIENTRY glBindMaterialParameterEXT (GLenum face, GLenum value); GLAPI GLuint APIENTRY glBindTexGenParameterEXT (GLenum unit, GLenum coord, GLenum value); GLAPI GLuint APIENTRY glBindTextureUnitParameterEXT (GLenum unit, GLenum value); GLAPI GLuint APIENTRY glBindParameterEXT (GLenum value); GLAPI GLboolean APIENTRY glIsVariantEnabledEXT (GLuint id, GLenum cap); GLAPI void APIENTRY glGetVariantBooleanvEXT (GLuint id, GLenum value, GLboolean *data); GLAPI void APIENTRY glGetVariantIntegervEXT (GLuint id, GLenum value, GLint *data); GLAPI void APIENTRY glGetVariantFloatvEXT (GLuint id, GLenum value, GLfloat *data); GLAPI void APIENTRY glGetVariantPointervEXT (GLuint id, GLenum value, void **data); GLAPI void APIENTRY glGetInvariantBooleanvEXT (GLuint id, GLenum value, GLboolean *data); GLAPI void APIENTRY glGetInvariantIntegervEXT (GLuint id, GLenum value, GLint *data); GLAPI void APIENTRY glGetInvariantFloatvEXT (GLuint id, GLenum value, GLfloat *data); GLAPI void APIENTRY glGetLocalConstantBooleanvEXT (GLuint id, GLenum value, GLboolean *data); GLAPI void APIENTRY glGetLocalConstantIntegervEXT (GLuint id, GLenum value, GLint *data); GLAPI void APIENTRY glGetLocalConstantFloatvEXT (GLuint id, GLenum value, GLfloat *data); #endif #endif /* GL_EXT_vertex_shader */ #ifndef GL_EXT_vertex_weighting #define GL_EXT_vertex_weighting 1 #define GL_MODELVIEW0_STACK_DEPTH_EXT 0x0BA3 #define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 #define GL_MODELVIEW0_MATRIX_EXT 0x0BA6 #define GL_MODELVIEW1_MATRIX_EXT 0x8506 #define GL_VERTEX_WEIGHTING_EXT 0x8509 #define GL_MODELVIEW0_EXT 0x1700 #define GL_MODELVIEW1_EXT 0x850A #define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B #define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C #define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D #define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E #define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F #define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 typedef void (APIENTRYP PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); typedef void (APIENTRYP PFNGLVERTEXWEIGHTFVEXTPROC) (const GLfloat *weight); typedef void (APIENTRYP PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glVertexWeightfEXT (GLfloat weight); GLAPI void APIENTRY glVertexWeightfvEXT (const GLfloat *weight); GLAPI void APIENTRY glVertexWeightPointerEXT (GLint size, GLenum type, GLsizei stride, const void *pointer); #endif #endif /* GL_EXT_vertex_weighting */ #ifndef GL_EXT_x11_sync_object #define GL_EXT_x11_sync_object 1 #define GL_SYNC_X11_FENCE_EXT 0x90E1 typedef GLsync (APIENTRYP PFNGLIMPORTSYNCEXTPROC) (GLenum external_sync_type, GLintptr external_sync, GLbitfield flags); #ifdef GL_GLEXT_PROTOTYPES GLAPI GLsync APIENTRY glImportSyncEXT (GLenum external_sync_type, GLintptr external_sync, GLbitfield flags); #endif #endif /* GL_EXT_x11_sync_object */ #ifndef GL_GREMEDY_frame_terminator #define GL_GREMEDY_frame_terminator 1 typedef void (APIENTRYP PFNGLFRAMETERMINATORGREMEDYPROC) (void); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glFrameTerminatorGREMEDY (void); #endif #endif /* GL_GREMEDY_frame_terminator */ #ifndef GL_GREMEDY_string_marker #define GL_GREMEDY_string_marker 1 typedef void (APIENTRYP PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const void *string); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glStringMarkerGREMEDY (GLsizei len, const void *string); #endif #endif /* GL_GREMEDY_string_marker */ #ifndef GL_HP_convolution_border_modes #define GL_HP_convolution_border_modes 1 #define GL_IGNORE_BORDER_HP 0x8150 #define GL_CONSTANT_BORDER_HP 0x8151 #define GL_REPLICATE_BORDER_HP 0x8153 #define GL_CONVOLUTION_BORDER_COLOR_HP 0x8154 #endif /* GL_HP_convolution_border_modes */ #ifndef GL_HP_image_transform #define GL_HP_image_transform 1 #define GL_IMAGE_SCALE_X_HP 0x8155 #define GL_IMAGE_SCALE_Y_HP 0x8156 #define GL_IMAGE_TRANSLATE_X_HP 0x8157 #define GL_IMAGE_TRANSLATE_Y_HP 0x8158 #define GL_IMAGE_ROTATE_ANGLE_HP 0x8159 #define GL_IMAGE_ROTATE_ORIGIN_X_HP 0x815A #define GL_IMAGE_ROTATE_ORIGIN_Y_HP 0x815B #define GL_IMAGE_MAG_FILTER_HP 0x815C #define GL_IMAGE_MIN_FILTER_HP 0x815D #define GL_IMAGE_CUBIC_WEIGHT_HP 0x815E #define GL_CUBIC_HP 0x815F #define GL_AVERAGE_HP 0x8160 #define GL_IMAGE_TRANSFORM_2D_HP 0x8161 #define GL_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8162 #define GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8163 typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, GLint param); typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, GLfloat *params); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glImageTransformParameteriHP (GLenum target, GLenum pname, GLint param); GLAPI void APIENTRY glImageTransformParameterfHP (GLenum target, GLenum pname, GLfloat param); GLAPI void APIENTRY glImageTransformParameterivHP (GLenum target, GLenum pname, const GLint *params); GLAPI void APIENTRY glImageTransformParameterfvHP (GLenum target, GLenum pname, const GLfloat *params); GLAPI void APIENTRY glGetImageTransformParameterivHP (GLenum target, GLenum pname, GLint *params); GLAPI void APIENTRY glGetImageTransformParameterfvHP (GLenum target, GLenum pname, GLfloat *params); #endif #endif /* GL_HP_image_transform */ #ifndef GL_HP_occlusion_test #define GL_HP_occlusion_test 1 #define GL_OCCLUSION_TEST_HP 0x8165 #define GL_OCCLUSION_TEST_RESULT_HP 0x8166 #endif /* GL_HP_occlusion_test */ #ifndef GL_HP_texture_lighting #define GL_HP_texture_lighting 1 #define GL_TEXTURE_LIGHTING_MODE_HP 0x8167 #define GL_TEXTURE_POST_SPECULAR_HP 0x8168 #define GL_TEXTURE_PRE_SPECULAR_HP 0x8169 #endif /* GL_HP_texture_lighting */ #ifndef GL_IBM_cull_vertex #define GL_IBM_cull_vertex 1 #define GL_CULL_VERTEX_IBM 103050 #endif /* GL_IBM_cull_vertex */ #ifndef GL_IBM_multimode_draw_arrays #define GL_IBM_multimode_draw_arrays 1 typedef void (APIENTRYP PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); typedef void (APIENTRYP PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum *mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, GLint modestride); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glMultiModeDrawArraysIBM (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); GLAPI void APIENTRY glMultiModeDrawElementsIBM (const GLenum *mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, GLint modestride); #endif #endif /* GL_IBM_multimode_draw_arrays */ #ifndef GL_IBM_rasterpos_clip #define GL_IBM_rasterpos_clip 1 #define GL_RASTER_POSITION_UNCLIPPED_IBM 0x19262 #endif /* GL_IBM_rasterpos_clip */ #ifndef GL_IBM_static_data #define GL_IBM_static_data 1 #define GL_ALL_STATIC_DATA_IBM 103060 #define GL_STATIC_VERTEX_ARRAY_IBM 103061 typedef void (APIENTRYP PFNGLFLUSHSTATICDATAIBMPROC) (GLenum target); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glFlushStaticDataIBM (GLenum target); #endif #endif /* GL_IBM_static_data */ #ifndef GL_IBM_texture_mirrored_repeat #define GL_IBM_texture_mirrored_repeat 1 #define GL_MIRRORED_REPEAT_IBM 0x8370 #endif /* GL_IBM_texture_mirrored_repeat */ #ifndef GL_IBM_vertex_array_lists #define GL_IBM_vertex_array_lists 1 #define GL_VERTEX_ARRAY_LIST_IBM 103070 #define GL_NORMAL_ARRAY_LIST_IBM 103071 #define GL_COLOR_ARRAY_LIST_IBM 103072 #define GL_INDEX_ARRAY_LIST_IBM 103073 #define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 #define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 #define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 #define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 #define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 #define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 #define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 #define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 #define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 #define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 #define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 #define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 typedef void (APIENTRYP PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); typedef void (APIENTRYP PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean **pointer, GLint ptrstride); typedef void (APIENTRYP PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void **pointer, GLint ptrstride); typedef void (APIENTRYP PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void **pointer, GLint ptrstride); typedef void (APIENTRYP PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void **pointer, GLint ptrstride); typedef void (APIENTRYP PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); typedef void (APIENTRYP PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glColorPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); GLAPI void APIENTRY glSecondaryColorPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); GLAPI void APIENTRY glEdgeFlagPointerListIBM (GLint stride, const GLboolean **pointer, GLint ptrstride); GLAPI void APIENTRY glFogCoordPointerListIBM (GLenum type, GLint stride, const void **pointer, GLint ptrstride); GLAPI void APIENTRY glIndexPointerListIBM (GLenum type, GLint stride, const void **pointer, GLint ptrstride); GLAPI void APIENTRY glNormalPointerListIBM (GLenum type, GLint stride, const void **pointer, GLint ptrstride); GLAPI void APIENTRY glTexCoordPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); GLAPI void APIENTRY glVertexPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); #endif #endif /* GL_IBM_vertex_array_lists */ #ifndef GL_INGR_blend_func_separate #define GL_INGR_blend_func_separate 1 typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINGRPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBlendFuncSeparateINGR (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); #endif #endif /* GL_INGR_blend_func_separate */ #ifndef GL_INGR_color_clamp #define GL_INGR_color_clamp 1 #define GL_RED_MIN_CLAMP_INGR 0x8560 #define GL_GREEN_MIN_CLAMP_INGR 0x8561 #define GL_BLUE_MIN_CLAMP_INGR 0x8562 #define GL_ALPHA_MIN_CLAMP_INGR 0x8563 #define GL_RED_MAX_CLAMP_INGR 0x8564 #define GL_GREEN_MAX_CLAMP_INGR 0x8565 #define GL_BLUE_MAX_CLAMP_INGR 0x8566 #define GL_ALPHA_MAX_CLAMP_INGR 0x8567 #endif /* GL_INGR_color_clamp */ #ifndef GL_INGR_interlace_read #define GL_INGR_interlace_read 1 #define GL_INTERLACE_READ_INGR 0x8568 #endif /* GL_INGR_interlace_read */ #ifndef GL_INTEL_fragment_shader_ordering #define GL_INTEL_fragment_shader_ordering 1 #endif /* GL_INTEL_fragment_shader_ordering */ #ifndef GL_INTEL_map_texture #define GL_INTEL_map_texture 1 #define GL_TEXTURE_MEMORY_LAYOUT_INTEL 0x83FF #define GL_LAYOUT_DEFAULT_INTEL 0 #define GL_LAYOUT_LINEAR_INTEL 1 #define GL_LAYOUT_LINEAR_CPU_CACHED_INTEL 2 typedef void (APIENTRYP PFNGLSYNCTEXTUREINTELPROC) (GLuint texture); typedef void (APIENTRYP PFNGLUNMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level); typedef void *(APIENTRYP PFNGLMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level, GLbitfield access, GLint *stride, GLenum *layout); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glSyncTextureINTEL (GLuint texture); GLAPI void APIENTRY glUnmapTexture2DINTEL (GLuint texture, GLint level); GLAPI void *APIENTRY glMapTexture2DINTEL (GLuint texture, GLint level, GLbitfield access, GLint *stride, GLenum *layout); #endif #endif /* GL_INTEL_map_texture */ #ifndef GL_INTEL_parallel_arrays #define GL_INTEL_parallel_arrays 1 #define GL_PARALLEL_ARRAYS_INTEL 0x83F4 #define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 #define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 #define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 #define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 typedef void (APIENTRYP PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const void **pointer); typedef void (APIENTRYP PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const void **pointer); typedef void (APIENTRYP PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const void **pointer); typedef void (APIENTRYP PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const void **pointer); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glVertexPointervINTEL (GLint size, GLenum type, const void **pointer); GLAPI void APIENTRY glNormalPointervINTEL (GLenum type, const void **pointer); GLAPI void APIENTRY glColorPointervINTEL (GLint size, GLenum type, const void **pointer); GLAPI void APIENTRY glTexCoordPointervINTEL (GLint size, GLenum type, const void **pointer); #endif #endif /* GL_INTEL_parallel_arrays */ #ifndef GL_INTEL_performance_query #define GL_INTEL_performance_query 1 #define GL_PERFQUERY_SINGLE_CONTEXT_INTEL 0x00000000 #define GL_PERFQUERY_GLOBAL_CONTEXT_INTEL 0x00000001 #define GL_PERFQUERY_WAIT_INTEL 0x83FB #define GL_PERFQUERY_FLUSH_INTEL 0x83FA #define GL_PERFQUERY_DONOT_FLUSH_INTEL 0x83F9 #define GL_PERFQUERY_COUNTER_EVENT_INTEL 0x94F0 #define GL_PERFQUERY_COUNTER_DURATION_NORM_INTEL 0x94F1 #define GL_PERFQUERY_COUNTER_DURATION_RAW_INTEL 0x94F2 #define GL_PERFQUERY_COUNTER_THROUGHPUT_INTEL 0x94F3 #define GL_PERFQUERY_COUNTER_RAW_INTEL 0x94F4 #define GL_PERFQUERY_COUNTER_TIMESTAMP_INTEL 0x94F5 #define GL_PERFQUERY_COUNTER_DATA_UINT32_INTEL 0x94F8 #define GL_PERFQUERY_COUNTER_DATA_UINT64_INTEL 0x94F9 #define GL_PERFQUERY_COUNTER_DATA_FLOAT_INTEL 0x94FA #define GL_PERFQUERY_COUNTER_DATA_DOUBLE_INTEL 0x94FB #define GL_PERFQUERY_COUNTER_DATA_BOOL32_INTEL 0x94FC #define GL_PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL 0x94FD #define GL_PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL 0x94FE #define GL_PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL 0x94FF #define GL_PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL 0x9500 typedef void (APIENTRYP PFNGLBEGINPERFQUERYINTELPROC) (GLuint queryHandle); typedef void (APIENTRYP PFNGLCREATEPERFQUERYINTELPROC) (GLuint queryId, GLuint *queryHandle); typedef void (APIENTRYP PFNGLDELETEPERFQUERYINTELPROC) (GLuint queryHandle); typedef void (APIENTRYP PFNGLENDPERFQUERYINTELPROC) (GLuint queryHandle); typedef void (APIENTRYP PFNGLGETFIRSTPERFQUERYIDINTELPROC) (GLuint *queryId); typedef void (APIENTRYP PFNGLGETNEXTPERFQUERYIDINTELPROC) (GLuint queryId, GLuint *nextQueryId); typedef void (APIENTRYP PFNGLGETPERFCOUNTERINFOINTELPROC) (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); typedef void (APIENTRYP PFNGLGETPERFQUERYDATAINTELPROC) (GLuint queryHandle, GLuint flags, GLsizei dataSize, GLvoid *data, GLuint *bytesWritten); typedef void (APIENTRYP PFNGLGETPERFQUERYIDBYNAMEINTELPROC) (GLchar *queryName, GLuint *queryId); typedef void (APIENTRYP PFNGLGETPERFQUERYINFOINTELPROC) (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBeginPerfQueryINTEL (GLuint queryHandle); GLAPI void APIENTRY glCreatePerfQueryINTEL (GLuint queryId, GLuint *queryHandle); GLAPI void APIENTRY glDeletePerfQueryINTEL (GLuint queryHandle); GLAPI void APIENTRY glEndPerfQueryINTEL (GLuint queryHandle); GLAPI void APIENTRY glGetFirstPerfQueryIdINTEL (GLuint *queryId); GLAPI void APIENTRY glGetNextPerfQueryIdINTEL (GLuint queryId, GLuint *nextQueryId); GLAPI void APIENTRY glGetPerfCounterInfoINTEL (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); GLAPI void APIENTRY glGetPerfQueryDataINTEL (GLuint queryHandle, GLuint flags, GLsizei dataSize, GLvoid *data, GLuint *bytesWritten); GLAPI void APIENTRY glGetPerfQueryIdByNameINTEL (GLchar *queryName, GLuint *queryId); GLAPI void APIENTRY glGetPerfQueryInfoINTEL (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); #endif #endif /* GL_INTEL_performance_query */ #ifndef GL_MESAX_texture_stack #define GL_MESAX_texture_stack 1 #define GL_TEXTURE_1D_STACK_MESAX 0x8759 #define GL_TEXTURE_2D_STACK_MESAX 0x875A #define GL_PROXY_TEXTURE_1D_STACK_MESAX 0x875B #define GL_PROXY_TEXTURE_2D_STACK_MESAX 0x875C #define GL_TEXTURE_1D_STACK_BINDING_MESAX 0x875D #define GL_TEXTURE_2D_STACK_BINDING_MESAX 0x875E #endif /* GL_MESAX_texture_stack */ #ifndef GL_MESA_pack_invert #define GL_MESA_pack_invert 1 #define GL_PACK_INVERT_MESA 0x8758 #endif /* GL_MESA_pack_invert */ #ifndef GL_MESA_resize_buffers #define GL_MESA_resize_buffers 1 typedef void (APIENTRYP PFNGLRESIZEBUFFERSMESAPROC) (void); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glResizeBuffersMESA (void); #endif #endif /* GL_MESA_resize_buffers */ #ifndef GL_MESA_window_pos #define GL_MESA_window_pos 1 typedef void (APIENTRYP PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); typedef void (APIENTRYP PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble *v); typedef void (APIENTRYP PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); typedef void (APIENTRYP PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat *v); typedef void (APIENTRYP PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); typedef void (APIENTRYP PFNGLWINDOWPOS2IVMESAPROC) (const GLint *v); typedef void (APIENTRYP PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); typedef void (APIENTRYP PFNGLWINDOWPOS2SVMESAPROC) (const GLshort *v); typedef void (APIENTRYP PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); typedef void (APIENTRYP PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble *v); typedef void (APIENTRYP PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat *v); typedef void (APIENTRYP PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); typedef void (APIENTRYP PFNGLWINDOWPOS3IVMESAPROC) (const GLint *v); typedef void (APIENTRYP PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); typedef void (APIENTRYP PFNGLWINDOWPOS3SVMESAPROC) (const GLshort *v); typedef void (APIENTRYP PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (APIENTRYP PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble *v); typedef void (APIENTRYP PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (APIENTRYP PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat *v); typedef void (APIENTRYP PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); typedef void (APIENTRYP PFNGLWINDOWPOS4IVMESAPROC) (const GLint *v); typedef void (APIENTRYP PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); typedef void (APIENTRYP PFNGLWINDOWPOS4SVMESAPROC) (const GLshort *v); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glWindowPos2dMESA (GLdouble x, GLdouble y); GLAPI void APIENTRY glWindowPos2dvMESA (const GLdouble *v); GLAPI void APIENTRY glWindowPos2fMESA (GLfloat x, GLfloat y); GLAPI void APIENTRY glWindowPos2fvMESA (const GLfloat *v); GLAPI void APIENTRY glWindowPos2iMESA (GLint x, GLint y); GLAPI void APIENTRY glWindowPos2ivMESA (const GLint *v); GLAPI void APIENTRY glWindowPos2sMESA (GLshort x, GLshort y); GLAPI void APIENTRY glWindowPos2svMESA (const GLshort *v); GLAPI void APIENTRY glWindowPos3dMESA (GLdouble x, GLdouble y, GLdouble z); GLAPI void APIENTRY glWindowPos3dvMESA (const GLdouble *v); GLAPI void APIENTRY glWindowPos3fMESA (GLfloat x, GLfloat y, GLfloat z); GLAPI void APIENTRY glWindowPos3fvMESA (const GLfloat *v); GLAPI void APIENTRY glWindowPos3iMESA (GLint x, GLint y, GLint z); GLAPI void APIENTRY glWindowPos3ivMESA (const GLint *v); GLAPI void APIENTRY glWindowPos3sMESA (GLshort x, GLshort y, GLshort z); GLAPI void APIENTRY glWindowPos3svMESA (const GLshort *v); GLAPI void APIENTRY glWindowPos4dMESA (GLdouble x, GLdouble y, GLdouble z, GLdouble w); GLAPI void APIENTRY glWindowPos4dvMESA (const GLdouble *v); GLAPI void APIENTRY glWindowPos4fMESA (GLfloat x, GLfloat y, GLfloat z, GLfloat w); GLAPI void APIENTRY glWindowPos4fvMESA (const GLfloat *v); GLAPI void APIENTRY glWindowPos4iMESA (GLint x, GLint y, GLint z, GLint w); GLAPI void APIENTRY glWindowPos4ivMESA (const GLint *v); GLAPI void APIENTRY glWindowPos4sMESA (GLshort x, GLshort y, GLshort z, GLshort w); GLAPI void APIENTRY glWindowPos4svMESA (const GLshort *v); #endif #endif /* GL_MESA_window_pos */ #ifndef GL_MESA_ycbcr_texture #define GL_MESA_ycbcr_texture 1 #define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA #define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB #define GL_YCBCR_MESA 0x8757 #endif /* GL_MESA_ycbcr_texture */ #ifndef GL_NVX_conditional_render #define GL_NVX_conditional_render 1 typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERNVXPROC) (GLuint id); typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERNVXPROC) (void); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBeginConditionalRenderNVX (GLuint id); GLAPI void APIENTRY glEndConditionalRenderNVX (void); #endif #endif /* GL_NVX_conditional_render */ #ifndef GL_NVX_gpu_memory_info #define GL_NVX_gpu_memory_info 1 #define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX 0x9047 #define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX 0x9048 #define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX 0x9049 #define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX 0x904A #define GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX 0x904B #endif /* GL_NVX_gpu_memory_info */ #ifndef GL_NV_bindless_multi_draw_indirect #define GL_NV_bindless_multi_draw_indirect 1 typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC) (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glMultiDrawArraysIndirectBindlessNV (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); GLAPI void APIENTRY glMultiDrawElementsIndirectBindlessNV (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); #endif #endif /* GL_NV_bindless_multi_draw_indirect */ #ifndef GL_NV_bindless_multi_draw_indirect_count #define GL_NV_bindless_multi_draw_indirect_count 1 typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glMultiDrawArraysIndirectBindlessCountNV (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); GLAPI void APIENTRY glMultiDrawElementsIndirectBindlessCountNV (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); #endif #endif /* GL_NV_bindless_multi_draw_indirect_count */ #ifndef GL_NV_bindless_texture #define GL_NV_bindless_texture 1 typedef GLuint64 (APIENTRYP PFNGLGETTEXTUREHANDLENVPROC) (GLuint texture); typedef GLuint64 (APIENTRYP PFNGLGETTEXTURESAMPLERHANDLENVPROC) (GLuint texture, GLuint sampler); typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC) (GLuint64 handle); typedef GLuint64 (APIENTRYP PFNGLGETIMAGEHANDLENVPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle, GLenum access); typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC) (GLuint64 handle); typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64NVPROC) (GLint location, GLuint64 value); typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64VNVPROC) (GLint location, GLsizei count, const GLuint64 *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC) (GLuint program, GLint location, GLuint64 value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *values); typedef GLboolean (APIENTRYP PFNGLISTEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); typedef GLboolean (APIENTRYP PFNGLISIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle); #ifdef GL_GLEXT_PROTOTYPES GLAPI GLuint64 APIENTRY glGetTextureHandleNV (GLuint texture); GLAPI GLuint64 APIENTRY glGetTextureSamplerHandleNV (GLuint texture, GLuint sampler); GLAPI void APIENTRY glMakeTextureHandleResidentNV (GLuint64 handle); GLAPI void APIENTRY glMakeTextureHandleNonResidentNV (GLuint64 handle); GLAPI GLuint64 APIENTRY glGetImageHandleNV (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); GLAPI void APIENTRY glMakeImageHandleResidentNV (GLuint64 handle, GLenum access); GLAPI void APIENTRY glMakeImageHandleNonResidentNV (GLuint64 handle); GLAPI void APIENTRY glUniformHandleui64NV (GLint location, GLuint64 value); GLAPI void APIENTRY glUniformHandleui64vNV (GLint location, GLsizei count, const GLuint64 *value); GLAPI void APIENTRY glProgramUniformHandleui64NV (GLuint program, GLint location, GLuint64 value); GLAPI void APIENTRY glProgramUniformHandleui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64 *values); GLAPI GLboolean APIENTRY glIsTextureHandleResidentNV (GLuint64 handle); GLAPI GLboolean APIENTRY glIsImageHandleResidentNV (GLuint64 handle); #endif #endif /* GL_NV_bindless_texture */ #ifndef GL_NV_blend_equation_advanced #define GL_NV_blend_equation_advanced 1 #define GL_BLEND_OVERLAP_NV 0x9281 #define GL_BLEND_PREMULTIPLIED_SRC_NV 0x9280 #define GL_BLUE_NV 0x1905 #define GL_COLORBURN_NV 0x929A #define GL_COLORDODGE_NV 0x9299 #define GL_CONJOINT_NV 0x9284 #define GL_CONTRAST_NV 0x92A1 #define GL_DARKEN_NV 0x9297 #define GL_DIFFERENCE_NV 0x929E #define GL_DISJOINT_NV 0x9283 #define GL_DST_ATOP_NV 0x928F #define GL_DST_IN_NV 0x928B #define GL_DST_NV 0x9287 #define GL_DST_OUT_NV 0x928D #define GL_DST_OVER_NV 0x9289 #define GL_EXCLUSION_NV 0x92A0 #define GL_GREEN_NV 0x1904 #define GL_HARDLIGHT_NV 0x929B #define GL_HARDMIX_NV 0x92A9 #define GL_HSL_COLOR_NV 0x92AF #define GL_HSL_HUE_NV 0x92AD #define GL_HSL_LUMINOSITY_NV 0x92B0 #define GL_HSL_SATURATION_NV 0x92AE #define GL_INVERT_OVG_NV 0x92B4 #define GL_INVERT_RGB_NV 0x92A3 #define GL_LIGHTEN_NV 0x9298 #define GL_LINEARBURN_NV 0x92A5 #define GL_LINEARDODGE_NV 0x92A4 #define GL_LINEARLIGHT_NV 0x92A7 #define GL_MINUS_CLAMPED_NV 0x92B3 #define GL_MINUS_NV 0x929F #define GL_MULTIPLY_NV 0x9294 #define GL_OVERLAY_NV 0x9296 #define GL_PINLIGHT_NV 0x92A8 #define GL_PLUS_CLAMPED_ALPHA_NV 0x92B2 #define GL_PLUS_CLAMPED_NV 0x92B1 #define GL_PLUS_DARKER_NV 0x9292 #define GL_PLUS_NV 0x9291 #define GL_RED_NV 0x1903 #define GL_SCREEN_NV 0x9295 #define GL_SOFTLIGHT_NV 0x929C #define GL_SRC_ATOP_NV 0x928E #define GL_SRC_IN_NV 0x928A #define GL_SRC_NV 0x9286 #define GL_SRC_OUT_NV 0x928C #define GL_SRC_OVER_NV 0x9288 #define GL_UNCORRELATED_NV 0x9282 #define GL_VIVIDLIGHT_NV 0x92A6 #define GL_XOR_NV 0x1506 typedef void (APIENTRYP PFNGLBLENDPARAMETERINVPROC) (GLenum pname, GLint value); typedef void (APIENTRYP PFNGLBLENDBARRIERNVPROC) (void); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBlendParameteriNV (GLenum pname, GLint value); GLAPI void APIENTRY glBlendBarrierNV (void); #endif #endif /* GL_NV_blend_equation_advanced */ #ifndef GL_NV_blend_equation_advanced_coherent #define GL_NV_blend_equation_advanced_coherent 1 #define GL_BLEND_ADVANCED_COHERENT_NV 0x9285 #endif /* GL_NV_blend_equation_advanced_coherent */ #ifndef GL_NV_blend_square #define GL_NV_blend_square 1 #endif /* GL_NV_blend_square */ #ifndef GL_NV_compute_program5 #define GL_NV_compute_program5 1 #define GL_COMPUTE_PROGRAM_NV 0x90FB #define GL_COMPUTE_PROGRAM_PARAMETER_BUFFER_NV 0x90FC #endif /* GL_NV_compute_program5 */ #ifndef GL_NV_conditional_render #define GL_NV_conditional_render 1 #define GL_QUERY_WAIT_NV 0x8E13 #define GL_QUERY_NO_WAIT_NV 0x8E14 #define GL_QUERY_BY_REGION_WAIT_NV 0x8E15 #define GL_QUERY_BY_REGION_NO_WAIT_NV 0x8E16 typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERNVPROC) (GLuint id, GLenum mode); typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERNVPROC) (void); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBeginConditionalRenderNV (GLuint id, GLenum mode); GLAPI void APIENTRY glEndConditionalRenderNV (void); #endif #endif /* GL_NV_conditional_render */ #ifndef GL_NV_conservative_raster #define GL_NV_conservative_raster 1 #define GL_CONSERVATIVE_RASTERIZATION_NV 0x9346 #define GL_SUBPIXEL_PRECISION_BIAS_X_BITS_NV 0x9347 #define GL_SUBPIXEL_PRECISION_BIAS_Y_BITS_NV 0x9348 #define GL_MAX_SUBPIXEL_PRECISION_BIAS_BITS_NV 0x9349 typedef void (APIENTRYP PFNGLSUBPIXELPRECISIONBIASNVPROC) (GLuint xbits, GLuint ybits); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glSubpixelPrecisionBiasNV (GLuint xbits, GLuint ybits); #endif #endif /* GL_NV_conservative_raster */ #ifndef GL_NV_copy_depth_to_color #define GL_NV_copy_depth_to_color 1 #define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E #define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F #endif /* GL_NV_copy_depth_to_color */ #ifndef GL_NV_copy_image #define GL_NV_copy_image 1 typedef void (APIENTRYP PFNGLCOPYIMAGESUBDATANVPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glCopyImageSubDataNV (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); #endif #endif /* GL_NV_copy_image */ #ifndef GL_NV_deep_texture3D #define GL_NV_deep_texture3D 1 #define GL_MAX_DEEP_3D_TEXTURE_WIDTH_HEIGHT_NV 0x90D0 #define GL_MAX_DEEP_3D_TEXTURE_DEPTH_NV 0x90D1 #endif /* GL_NV_deep_texture3D */ #ifndef GL_NV_depth_buffer_float #define GL_NV_depth_buffer_float 1 #define GL_DEPTH_COMPONENT32F_NV 0x8DAB #define GL_DEPTH32F_STENCIL8_NV 0x8DAC #define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD #define GL_DEPTH_BUFFER_FLOAT_MODE_NV 0x8DAF typedef void (APIENTRYP PFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFar); typedef void (APIENTRYP PFNGLCLEARDEPTHDNVPROC) (GLdouble depth); typedef void (APIENTRYP PFNGLDEPTHBOUNDSDNVPROC) (GLdouble zmin, GLdouble zmax); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glDepthRangedNV (GLdouble zNear, GLdouble zFar); GLAPI void APIENTRY glClearDepthdNV (GLdouble depth); GLAPI void APIENTRY glDepthBoundsdNV (GLdouble zmin, GLdouble zmax); #endif #endif /* GL_NV_depth_buffer_float */ #ifndef GL_NV_depth_clamp #define GL_NV_depth_clamp 1 #define GL_DEPTH_CLAMP_NV 0x864F #endif /* GL_NV_depth_clamp */ #ifndef GL_NV_draw_texture #define GL_NV_draw_texture 1 typedef void (APIENTRYP PFNGLDRAWTEXTURENVPROC) (GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glDrawTextureNV (GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); #endif #endif /* GL_NV_draw_texture */ #ifndef GL_NV_evaluators #define GL_NV_evaluators 1 #define GL_EVAL_2D_NV 0x86C0 #define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 #define GL_MAP_TESSELLATION_NV 0x86C2 #define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 #define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 #define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 #define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 #define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 #define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 #define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 #define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA #define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB #define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC #define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD #define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE #define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF #define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 #define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 #define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 #define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 #define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 #define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 #define GL_MAX_MAP_TESSELLATION_NV 0x86D6 #define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 typedef void (APIENTRYP PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void *points); typedef void (APIENTRYP PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void *points); typedef void (APIENTRYP PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glMapControlPointsNV (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void *points); GLAPI void APIENTRY glMapParameterivNV (GLenum target, GLenum pname, const GLint *params); GLAPI void APIENTRY glMapParameterfvNV (GLenum target, GLenum pname, const GLfloat *params); GLAPI void APIENTRY glGetMapControlPointsNV (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void *points); GLAPI void APIENTRY glGetMapParameterivNV (GLenum target, GLenum pname, GLint *params); GLAPI void APIENTRY glGetMapParameterfvNV (GLenum target, GLenum pname, GLfloat *params); GLAPI void APIENTRY glGetMapAttribParameterivNV (GLenum target, GLuint index, GLenum pname, GLint *params); GLAPI void APIENTRY glGetMapAttribParameterfvNV (GLenum target, GLuint index, GLenum pname, GLfloat *params); GLAPI void APIENTRY glEvalMapsNV (GLenum target, GLenum mode); #endif #endif /* GL_NV_evaluators */ #ifndef GL_NV_explicit_multisample #define GL_NV_explicit_multisample 1 #define GL_SAMPLE_POSITION_NV 0x8E50 #define GL_SAMPLE_MASK_NV 0x8E51 #define GL_SAMPLE_MASK_VALUE_NV 0x8E52 #define GL_TEXTURE_BINDING_RENDERBUFFER_NV 0x8E53 #define GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV 0x8E54 #define GL_TEXTURE_RENDERBUFFER_NV 0x8E55 #define GL_SAMPLER_RENDERBUFFER_NV 0x8E56 #define GL_INT_SAMPLER_RENDERBUFFER_NV 0x8E57 #define GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV 0x8E58 #define GL_MAX_SAMPLE_MASK_WORDS_NV 0x8E59 typedef void (APIENTRYP PFNGLGETMULTISAMPLEFVNVPROC) (GLenum pname, GLuint index, GLfloat *val); typedef void (APIENTRYP PFNGLSAMPLEMASKINDEXEDNVPROC) (GLuint index, GLbitfield mask); typedef void (APIENTRYP PFNGLTEXRENDERBUFFERNVPROC) (GLenum target, GLuint renderbuffer); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glGetMultisamplefvNV (GLenum pname, GLuint index, GLfloat *val); GLAPI void APIENTRY glSampleMaskIndexedNV (GLuint index, GLbitfield mask); GLAPI void APIENTRY glTexRenderbufferNV (GLenum target, GLuint renderbuffer); #endif #endif /* GL_NV_explicit_multisample */ #ifndef GL_NV_fence #define GL_NV_fence 1 #define GL_ALL_COMPLETED_NV 0x84F2 #define GL_FENCE_STATUS_NV 0x84F3 #define GL_FENCE_CONDITION_NV 0x84F4 typedef void (APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences); typedef void (APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences); typedef GLboolean (APIENTRYP PFNGLISFENCENVPROC) (GLuint fence); typedef GLboolean (APIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence); typedef void (APIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence); typedef void (APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glDeleteFencesNV (GLsizei n, const GLuint *fences); GLAPI void APIENTRY glGenFencesNV (GLsizei n, GLuint *fences); GLAPI GLboolean APIENTRY glIsFenceNV (GLuint fence); GLAPI GLboolean APIENTRY glTestFenceNV (GLuint fence); GLAPI void APIENTRY glGetFenceivNV (GLuint fence, GLenum pname, GLint *params); GLAPI void APIENTRY glFinishFenceNV (GLuint fence); GLAPI void APIENTRY glSetFenceNV (GLuint fence, GLenum condition); #endif #endif /* GL_NV_fence */ #ifndef GL_NV_fill_rectangle #define GL_NV_fill_rectangle 1 #define GL_FILL_RECTANGLE_NV 0x933C #endif /* GL_NV_fill_rectangle */ #ifndef GL_NV_float_buffer #define GL_NV_float_buffer 1 #define GL_FLOAT_R_NV 0x8880 #define GL_FLOAT_RG_NV 0x8881 #define GL_FLOAT_RGB_NV 0x8882 #define GL_FLOAT_RGBA_NV 0x8883 #define GL_FLOAT_R16_NV 0x8884 #define GL_FLOAT_R32_NV 0x8885 #define GL_FLOAT_RG16_NV 0x8886 #define GL_FLOAT_RG32_NV 0x8887 #define GL_FLOAT_RGB16_NV 0x8888 #define GL_FLOAT_RGB32_NV 0x8889 #define GL_FLOAT_RGBA16_NV 0x888A #define GL_FLOAT_RGBA32_NV 0x888B #define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C #define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D #define GL_FLOAT_RGBA_MODE_NV 0x888E #endif /* GL_NV_float_buffer */ #ifndef GL_NV_fog_distance #define GL_NV_fog_distance 1 #define GL_FOG_DISTANCE_MODE_NV 0x855A #define GL_EYE_RADIAL_NV 0x855B #define GL_EYE_PLANE_ABSOLUTE_NV 0x855C #endif /* GL_NV_fog_distance */ #ifndef GL_NV_fragment_coverage_to_color #define GL_NV_fragment_coverage_to_color 1 #define GL_FRAGMENT_COVERAGE_TO_COLOR_NV 0x92DD #define GL_FRAGMENT_COVERAGE_COLOR_NV 0x92DE typedef void (APIENTRYP PFNGLFRAGMENTCOVERAGECOLORNVPROC) (GLuint color); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glFragmentCoverageColorNV (GLuint color); #endif #endif /* GL_NV_fragment_coverage_to_color */ #ifndef GL_NV_fragment_program #define GL_NV_fragment_program 1 #define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 #define GL_FRAGMENT_PROGRAM_NV 0x8870 #define GL_MAX_TEXTURE_COORDS_NV 0x8871 #define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 #define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 #define GL_PROGRAM_ERROR_STRING_NV 0x8874 typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v); typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v); typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glProgramNamedParameter4fNV (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); GLAPI void APIENTRY glProgramNamedParameter4fvNV (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v); GLAPI void APIENTRY glProgramNamedParameter4dNV (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); GLAPI void APIENTRY glProgramNamedParameter4dvNV (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v); GLAPI void APIENTRY glGetProgramNamedParameterfvNV (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); GLAPI void APIENTRY glGetProgramNamedParameterdvNV (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); #endif #endif /* GL_NV_fragment_program */ #ifndef GL_NV_fragment_program2 #define GL_NV_fragment_program2 1 #define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 #define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 #define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6 #define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7 #define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8 #endif /* GL_NV_fragment_program2 */ #ifndef GL_NV_fragment_program4 #define GL_NV_fragment_program4 1 #endif /* GL_NV_fragment_program4 */ #ifndef GL_NV_fragment_program_option #define GL_NV_fragment_program_option 1 #endif /* GL_NV_fragment_program_option */ #ifndef GL_NV_fragment_shader_interlock #define GL_NV_fragment_shader_interlock 1 #endif /* GL_NV_fragment_shader_interlock */ #ifndef GL_NV_framebuffer_mixed_samples #define GL_NV_framebuffer_mixed_samples 1 #define GL_COVERAGE_MODULATION_TABLE_NV 0x9331 #define GL_COLOR_SAMPLES_NV 0x8E20 #define GL_DEPTH_SAMPLES_NV 0x932D #define GL_STENCIL_SAMPLES_NV 0x932E #define GL_MIXED_DEPTH_SAMPLES_SUPPORTED_NV 0x932F #define GL_MIXED_STENCIL_SAMPLES_SUPPORTED_NV 0x9330 #define GL_COVERAGE_MODULATION_NV 0x9332 #define GL_COVERAGE_MODULATION_TABLE_SIZE_NV 0x9333 typedef void (APIENTRYP PFNGLCOVERAGEMODULATIONTABLENVPROC) (GLsizei n, const GLfloat *v); typedef void (APIENTRYP PFNGLGETCOVERAGEMODULATIONTABLENVPROC) (GLsizei bufsize, GLfloat *v); typedef void (APIENTRYP PFNGLCOVERAGEMODULATIONNVPROC) (GLenum components); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glCoverageModulationTableNV (GLsizei n, const GLfloat *v); GLAPI void APIENTRY glGetCoverageModulationTableNV (GLsizei bufsize, GLfloat *v); GLAPI void APIENTRY glCoverageModulationNV (GLenum components); #endif #endif /* GL_NV_framebuffer_mixed_samples */ #ifndef GL_NV_framebuffer_multisample_coverage #define GL_NV_framebuffer_multisample_coverage 1 #define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB #define GL_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E10 #define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11 #define GL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12 typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glRenderbufferStorageMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); #endif #endif /* GL_NV_framebuffer_multisample_coverage */ #ifndef GL_NV_geometry_program4 #define GL_NV_geometry_program4 1 #define GL_GEOMETRY_PROGRAM_NV 0x8C26 #define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27 #define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28 typedef void (APIENTRYP PFNGLPROGRAMVERTEXLIMITNVPROC) (GLenum target, GLint limit); typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glProgramVertexLimitNV (GLenum target, GLint limit); GLAPI void APIENTRY glFramebufferTextureEXT (GLenum target, GLenum attachment, GLuint texture, GLint level); GLAPI void APIENTRY glFramebufferTextureFaceEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); #endif #endif /* GL_NV_geometry_program4 */ #ifndef GL_NV_geometry_shader4 #define GL_NV_geometry_shader4 1 #endif /* GL_NV_geometry_shader4 */ #ifndef GL_NV_geometry_shader_passthrough #define GL_NV_geometry_shader_passthrough 1 #endif /* GL_NV_geometry_shader_passthrough */ #ifndef GL_NV_gpu_program4 #define GL_NV_gpu_program4 1 #define GL_MIN_PROGRAM_TEXEL_OFFSET_NV 0x8904 #define GL_MAX_PROGRAM_TEXEL_OFFSET_NV 0x8905 #define GL_PROGRAM_ATTRIB_COMPONENTS_NV 0x8906 #define GL_PROGRAM_RESULT_COMPONENTS_NV 0x8907 #define GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV 0x8908 #define GL_MAX_PROGRAM_RESULT_COMPONENTS_NV 0x8909 #define GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV 0x8DA5 #define GL_MAX_PROGRAM_GENERIC_RESULTS_NV 0x8DA6 typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERIIVNVPROC) (GLenum target, GLuint index, GLint *params); typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERIUIVNVPROC) (GLenum target, GLuint index, GLuint *params); typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERIIVNVPROC) (GLenum target, GLuint index, GLint *params); typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERIUIVNVPROC) (GLenum target, GLuint index, GLuint *params); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glProgramLocalParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); GLAPI void APIENTRY glProgramLocalParameterI4ivNV (GLenum target, GLuint index, const GLint *params); GLAPI void APIENTRY glProgramLocalParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params); GLAPI void APIENTRY glProgramLocalParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); GLAPI void APIENTRY glProgramLocalParameterI4uivNV (GLenum target, GLuint index, const GLuint *params); GLAPI void APIENTRY glProgramLocalParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params); GLAPI void APIENTRY glProgramEnvParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); GLAPI void APIENTRY glProgramEnvParameterI4ivNV (GLenum target, GLuint index, const GLint *params); GLAPI void APIENTRY glProgramEnvParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params); GLAPI void APIENTRY glProgramEnvParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); GLAPI void APIENTRY glProgramEnvParameterI4uivNV (GLenum target, GLuint index, const GLuint *params); GLAPI void APIENTRY glProgramEnvParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params); GLAPI void APIENTRY glGetProgramLocalParameterIivNV (GLenum target, GLuint index, GLint *params); GLAPI void APIENTRY glGetProgramLocalParameterIuivNV (GLenum target, GLuint index, GLuint *params); GLAPI void APIENTRY glGetProgramEnvParameterIivNV (GLenum target, GLuint index, GLint *params); GLAPI void APIENTRY glGetProgramEnvParameterIuivNV (GLenum target, GLuint index, GLuint *params); #endif #endif /* GL_NV_gpu_program4 */ #ifndef GL_NV_gpu_program5 #define GL_NV_gpu_program5 1 #define GL_MAX_GEOMETRY_PROGRAM_INVOCATIONS_NV 0x8E5A #define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5B #define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5C #define GL_FRAGMENT_PROGRAM_INTERPOLATION_OFFSET_BITS_NV 0x8E5D #define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5E #define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5F #define GL_MAX_PROGRAM_SUBROUTINE_PARAMETERS_NV 0x8F44 #define GL_MAX_PROGRAM_SUBROUTINE_NUM_NV 0x8F45 typedef void (APIENTRYP PFNGLPROGRAMSUBROUTINEPARAMETERSUIVNVPROC) (GLenum target, GLsizei count, const GLuint *params); typedef void (APIENTRYP PFNGLGETPROGRAMSUBROUTINEPARAMETERUIVNVPROC) (GLenum target, GLuint index, GLuint *param); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glProgramSubroutineParametersuivNV (GLenum target, GLsizei count, const GLuint *params); GLAPI void APIENTRY glGetProgramSubroutineParameteruivNV (GLenum target, GLuint index, GLuint *param); #endif #endif /* GL_NV_gpu_program5 */ #ifndef GL_NV_gpu_program5_mem_extended #define GL_NV_gpu_program5_mem_extended 1 #endif /* GL_NV_gpu_program5_mem_extended */ #ifndef GL_NV_gpu_shader5 #define GL_NV_gpu_shader5 1 #endif /* GL_NV_gpu_shader5 */ #ifndef GL_NV_half_float #define GL_NV_half_float 1 typedef unsigned short GLhalfNV; #define GL_HALF_FLOAT_NV 0x140B typedef void (APIENTRYP PFNGLVERTEX2HNVPROC) (GLhalfNV x, GLhalfNV y); typedef void (APIENTRYP PFNGLVERTEX2HVNVPROC) (const GLhalfNV *v); typedef void (APIENTRYP PFNGLVERTEX3HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z); typedef void (APIENTRYP PFNGLVERTEX3HVNVPROC) (const GLhalfNV *v); typedef void (APIENTRYP PFNGLVERTEX4HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); typedef void (APIENTRYP PFNGLVERTEX4HVNVPROC) (const GLhalfNV *v); typedef void (APIENTRYP PFNGLNORMAL3HNVPROC) (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); typedef void (APIENTRYP PFNGLNORMAL3HVNVPROC) (const GLhalfNV *v); typedef void (APIENTRYP PFNGLCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); typedef void (APIENTRYP PFNGLCOLOR3HVNVPROC) (const GLhalfNV *v); typedef void (APIENTRYP PFNGLCOLOR4HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); typedef void (APIENTRYP PFNGLCOLOR4HVNVPROC) (const GLhalfNV *v); typedef void (APIENTRYP PFNGLTEXCOORD1HNVPROC) (GLhalfNV s); typedef void (APIENTRYP PFNGLTEXCOORD1HVNVPROC) (const GLhalfNV *v); typedef void (APIENTRYP PFNGLTEXCOORD2HNVPROC) (GLhalfNV s, GLhalfNV t); typedef void (APIENTRYP PFNGLTEXCOORD2HVNVPROC) (const GLhalfNV *v); typedef void (APIENTRYP PFNGLTEXCOORD3HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r); typedef void (APIENTRYP PFNGLTEXCOORD3HVNVPROC) (const GLhalfNV *v); typedef void (APIENTRYP PFNGLTEXCOORD4HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); typedef void (APIENTRYP PFNGLTEXCOORD4HVNVPROC) (const GLhalfNV *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalfNV s); typedef void (APIENTRYP PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalfNV *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t); typedef void (APIENTRYP PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalfNV *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); typedef void (APIENTRYP PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalfNV *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); typedef void (APIENTRYP PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalfNV *v); typedef void (APIENTRYP PFNGLFOGCOORDHNVPROC) (GLhalfNV fog); typedef void (APIENTRYP PFNGLFOGCOORDHVNVPROC) (const GLhalfNV *fog); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalfNV *v); typedef void (APIENTRYP PFNGLVERTEXWEIGHTHNVPROC) (GLhalfNV weight); typedef void (APIENTRYP PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalfNV *weight); typedef void (APIENTRYP PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalfNV x); typedef void (APIENTRYP PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalfNV *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y); typedef void (APIENTRYP PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalfNV *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); typedef void (APIENTRYP PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalfNV *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); typedef void (APIENTRYP PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalfNV *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glVertex2hNV (GLhalfNV x, GLhalfNV y); GLAPI void APIENTRY glVertex2hvNV (const GLhalfNV *v); GLAPI void APIENTRY glVertex3hNV (GLhalfNV x, GLhalfNV y, GLhalfNV z); GLAPI void APIENTRY glVertex3hvNV (const GLhalfNV *v); GLAPI void APIENTRY glVertex4hNV (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); GLAPI void APIENTRY glVertex4hvNV (const GLhalfNV *v); GLAPI void APIENTRY glNormal3hNV (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); GLAPI void APIENTRY glNormal3hvNV (const GLhalfNV *v); GLAPI void APIENTRY glColor3hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue); GLAPI void APIENTRY glColor3hvNV (const GLhalfNV *v); GLAPI void APIENTRY glColor4hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); GLAPI void APIENTRY glColor4hvNV (const GLhalfNV *v); GLAPI void APIENTRY glTexCoord1hNV (GLhalfNV s); GLAPI void APIENTRY glTexCoord1hvNV (const GLhalfNV *v); GLAPI void APIENTRY glTexCoord2hNV (GLhalfNV s, GLhalfNV t); GLAPI void APIENTRY glTexCoord2hvNV (const GLhalfNV *v); GLAPI void APIENTRY glTexCoord3hNV (GLhalfNV s, GLhalfNV t, GLhalfNV r); GLAPI void APIENTRY glTexCoord3hvNV (const GLhalfNV *v); GLAPI void APIENTRY glTexCoord4hNV (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); GLAPI void APIENTRY glTexCoord4hvNV (const GLhalfNV *v); GLAPI void APIENTRY glMultiTexCoord1hNV (GLenum target, GLhalfNV s); GLAPI void APIENTRY glMultiTexCoord1hvNV (GLenum target, const GLhalfNV *v); GLAPI void APIENTRY glMultiTexCoord2hNV (GLenum target, GLhalfNV s, GLhalfNV t); GLAPI void APIENTRY glMultiTexCoord2hvNV (GLenum target, const GLhalfNV *v); GLAPI void APIENTRY glMultiTexCoord3hNV (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); GLAPI void APIENTRY glMultiTexCoord3hvNV (GLenum target, const GLhalfNV *v); GLAPI void APIENTRY glMultiTexCoord4hNV (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); GLAPI void APIENTRY glMultiTexCoord4hvNV (GLenum target, const GLhalfNV *v); GLAPI void APIENTRY glFogCoordhNV (GLhalfNV fog); GLAPI void APIENTRY glFogCoordhvNV (const GLhalfNV *fog); GLAPI void APIENTRY glSecondaryColor3hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue); GLAPI void APIENTRY glSecondaryColor3hvNV (const GLhalfNV *v); GLAPI void APIENTRY glVertexWeighthNV (GLhalfNV weight); GLAPI void APIENTRY glVertexWeighthvNV (const GLhalfNV *weight); GLAPI void APIENTRY glVertexAttrib1hNV (GLuint index, GLhalfNV x); GLAPI void APIENTRY glVertexAttrib1hvNV (GLuint index, const GLhalfNV *v); GLAPI void APIENTRY glVertexAttrib2hNV (GLuint index, GLhalfNV x, GLhalfNV y); GLAPI void APIENTRY glVertexAttrib2hvNV (GLuint index, const GLhalfNV *v); GLAPI void APIENTRY glVertexAttrib3hNV (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); GLAPI void APIENTRY glVertexAttrib3hvNV (GLuint index, const GLhalfNV *v); GLAPI void APIENTRY glVertexAttrib4hNV (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); GLAPI void APIENTRY glVertexAttrib4hvNV (GLuint index, const GLhalfNV *v); GLAPI void APIENTRY glVertexAttribs1hvNV (GLuint index, GLsizei n, const GLhalfNV *v); GLAPI void APIENTRY glVertexAttribs2hvNV (GLuint index, GLsizei n, const GLhalfNV *v); GLAPI void APIENTRY glVertexAttribs3hvNV (GLuint index, GLsizei n, const GLhalfNV *v); GLAPI void APIENTRY glVertexAttribs4hvNV (GLuint index, GLsizei n, const GLhalfNV *v); #endif #endif /* GL_NV_half_float */ #ifndef GL_NV_internalformat_sample_query #define GL_NV_internalformat_sample_query 1 #define GL_MULTISAMPLES_NV 0x9371 #define GL_SUPERSAMPLE_SCALE_X_NV 0x9372 #define GL_SUPERSAMPLE_SCALE_Y_NV 0x9373 #define GL_CONFORMANT_NV 0x9374 typedef void (APIENTRYP PFNGLGETINTERNALFORMATSAMPLEIVNVPROC) (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei bufSize, GLint *params); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glGetInternalformatSampleivNV (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei bufSize, GLint *params); #endif #endif /* GL_NV_internalformat_sample_query */ #ifndef GL_NV_light_max_exponent #define GL_NV_light_max_exponent 1 #define GL_MAX_SHININESS_NV 0x8504 #define GL_MAX_SPOT_EXPONENT_NV 0x8505 #endif /* GL_NV_light_max_exponent */ #ifndef GL_NV_multisample_coverage #define GL_NV_multisample_coverage 1 #endif /* GL_NV_multisample_coverage */ #ifndef GL_NV_multisample_filter_hint #define GL_NV_multisample_filter_hint 1 #define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 #endif /* GL_NV_multisample_filter_hint */ #ifndef GL_NV_occlusion_query #define GL_NV_occlusion_query 1 #define GL_PIXEL_COUNTER_BITS_NV 0x8864 #define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 #define GL_PIXEL_COUNT_NV 0x8866 #define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 typedef void (APIENTRYP PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint *ids); typedef void (APIENTRYP PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint *ids); typedef GLboolean (APIENTRYP PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); typedef void (APIENTRYP PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); typedef void (APIENTRYP PFNGLENDOCCLUSIONQUERYNVPROC) (void); typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint *params); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glGenOcclusionQueriesNV (GLsizei n, GLuint *ids); GLAPI void APIENTRY glDeleteOcclusionQueriesNV (GLsizei n, const GLuint *ids); GLAPI GLboolean APIENTRY glIsOcclusionQueryNV (GLuint id); GLAPI void APIENTRY glBeginOcclusionQueryNV (GLuint id); GLAPI void APIENTRY glEndOcclusionQueryNV (void); GLAPI void APIENTRY glGetOcclusionQueryivNV (GLuint id, GLenum pname, GLint *params); GLAPI void APIENTRY glGetOcclusionQueryuivNV (GLuint id, GLenum pname, GLuint *params); #endif #endif /* GL_NV_occlusion_query */ #ifndef GL_NV_packed_depth_stencil #define GL_NV_packed_depth_stencil 1 #define GL_DEPTH_STENCIL_NV 0x84F9 #define GL_UNSIGNED_INT_24_8_NV 0x84FA #endif /* GL_NV_packed_depth_stencil */ #ifndef GL_NV_parameter_buffer_object #define GL_NV_parameter_buffer_object 1 #define GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV 0x8DA0 #define GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV 0x8DA1 #define GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV 0x8DA2 #define GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV 0x8DA3 #define GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV 0x8DA4 typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLfloat *params); typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLint *params); typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLuint *params); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glProgramBufferParametersfvNV (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLfloat *params); GLAPI void APIENTRY glProgramBufferParametersIivNV (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLint *params); GLAPI void APIENTRY glProgramBufferParametersIuivNV (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLuint *params); #endif #endif /* GL_NV_parameter_buffer_object */ #ifndef GL_NV_parameter_buffer_object2 #define GL_NV_parameter_buffer_object2 1 #endif /* GL_NV_parameter_buffer_object2 */ #ifndef GL_NV_path_rendering #define GL_NV_path_rendering 1 #define GL_PATH_FORMAT_SVG_NV 0x9070 #define GL_PATH_FORMAT_PS_NV 0x9071 #define GL_STANDARD_FONT_NAME_NV 0x9072 #define GL_SYSTEM_FONT_NAME_NV 0x9073 #define GL_FILE_NAME_NV 0x9074 #define GL_PATH_STROKE_WIDTH_NV 0x9075 #define GL_PATH_END_CAPS_NV 0x9076 #define GL_PATH_INITIAL_END_CAP_NV 0x9077 #define GL_PATH_TERMINAL_END_CAP_NV 0x9078 #define GL_PATH_JOIN_STYLE_NV 0x9079 #define GL_PATH_MITER_LIMIT_NV 0x907A #define GL_PATH_DASH_CAPS_NV 0x907B #define GL_PATH_INITIAL_DASH_CAP_NV 0x907C #define GL_PATH_TERMINAL_DASH_CAP_NV 0x907D #define GL_PATH_DASH_OFFSET_NV 0x907E #define GL_PATH_CLIENT_LENGTH_NV 0x907F #define GL_PATH_FILL_MODE_NV 0x9080 #define GL_PATH_FILL_MASK_NV 0x9081 #define GL_PATH_FILL_COVER_MODE_NV 0x9082 #define GL_PATH_STROKE_COVER_MODE_NV 0x9083 #define GL_PATH_STROKE_MASK_NV 0x9084 #define GL_COUNT_UP_NV 0x9088 #define GL_COUNT_DOWN_NV 0x9089 #define GL_PATH_OBJECT_BOUNDING_BOX_NV 0x908A #define GL_CONVEX_HULL_NV 0x908B #define GL_BOUNDING_BOX_NV 0x908D #define GL_TRANSLATE_X_NV 0x908E #define GL_TRANSLATE_Y_NV 0x908F #define GL_TRANSLATE_2D_NV 0x9090 #define GL_TRANSLATE_3D_NV 0x9091 #define GL_AFFINE_2D_NV 0x9092 #define GL_AFFINE_3D_NV 0x9094 #define GL_TRANSPOSE_AFFINE_2D_NV 0x9096 #define GL_TRANSPOSE_AFFINE_3D_NV 0x9098 #define GL_UTF8_NV 0x909A #define GL_UTF16_NV 0x909B #define GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV 0x909C #define GL_PATH_COMMAND_COUNT_NV 0x909D #define GL_PATH_COORD_COUNT_NV 0x909E #define GL_PATH_DASH_ARRAY_COUNT_NV 0x909F #define GL_PATH_COMPUTED_LENGTH_NV 0x90A0 #define GL_PATH_FILL_BOUNDING_BOX_NV 0x90A1 #define GL_PATH_STROKE_BOUNDING_BOX_NV 0x90A2 #define GL_SQUARE_NV 0x90A3 #define GL_ROUND_NV 0x90A4 #define GL_TRIANGULAR_NV 0x90A5 #define GL_BEVEL_NV 0x90A6 #define GL_MITER_REVERT_NV 0x90A7 #define GL_MITER_TRUNCATE_NV 0x90A8 #define GL_SKIP_MISSING_GLYPH_NV 0x90A9 #define GL_USE_MISSING_GLYPH_NV 0x90AA #define GL_PATH_ERROR_POSITION_NV 0x90AB #define GL_ACCUM_ADJACENT_PAIRS_NV 0x90AD #define GL_ADJACENT_PAIRS_NV 0x90AE #define GL_FIRST_TO_REST_NV 0x90AF #define GL_PATH_GEN_MODE_NV 0x90B0 #define GL_PATH_GEN_COEFF_NV 0x90B1 #define GL_PATH_GEN_COMPONENTS_NV 0x90B3 #define GL_PATH_STENCIL_FUNC_NV 0x90B7 #define GL_PATH_STENCIL_REF_NV 0x90B8 #define GL_PATH_STENCIL_VALUE_MASK_NV 0x90B9 #define GL_PATH_STENCIL_DEPTH_OFFSET_FACTOR_NV 0x90BD #define GL_PATH_STENCIL_DEPTH_OFFSET_UNITS_NV 0x90BE #define GL_PATH_COVER_DEPTH_FUNC_NV 0x90BF #define GL_PATH_DASH_OFFSET_RESET_NV 0x90B4 #define GL_MOVE_TO_RESETS_NV 0x90B5 #define GL_MOVE_TO_CONTINUES_NV 0x90B6 #define GL_CLOSE_PATH_NV 0x00 #define GL_MOVE_TO_NV 0x02 #define GL_RELATIVE_MOVE_TO_NV 0x03 #define GL_LINE_TO_NV 0x04 #define GL_RELATIVE_LINE_TO_NV 0x05 #define GL_HORIZONTAL_LINE_TO_NV 0x06 #define GL_RELATIVE_HORIZONTAL_LINE_TO_NV 0x07 #define GL_VERTICAL_LINE_TO_NV 0x08 #define GL_RELATIVE_VERTICAL_LINE_TO_NV 0x09 #define GL_QUADRATIC_CURVE_TO_NV 0x0A #define GL_RELATIVE_QUADRATIC_CURVE_TO_NV 0x0B #define GL_CUBIC_CURVE_TO_NV 0x0C #define GL_RELATIVE_CUBIC_CURVE_TO_NV 0x0D #define GL_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0E #define GL_RELATIVE_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0F #define GL_SMOOTH_CUBIC_CURVE_TO_NV 0x10 #define GL_RELATIVE_SMOOTH_CUBIC_CURVE_TO_NV 0x11 #define GL_SMALL_CCW_ARC_TO_NV 0x12 #define GL_RELATIVE_SMALL_CCW_ARC_TO_NV 0x13 #define GL_SMALL_CW_ARC_TO_NV 0x14 #define GL_RELATIVE_SMALL_CW_ARC_TO_NV 0x15 #define GL_LARGE_CCW_ARC_TO_NV 0x16 #define GL_RELATIVE_LARGE_CCW_ARC_TO_NV 0x17 #define GL_LARGE_CW_ARC_TO_NV 0x18 #define GL_RELATIVE_LARGE_CW_ARC_TO_NV 0x19 #define GL_RESTART_PATH_NV 0xF0 #define GL_DUP_FIRST_CUBIC_CURVE_TO_NV 0xF2 #define GL_DUP_LAST_CUBIC_CURVE_TO_NV 0xF4 #define GL_RECT_NV 0xF6 #define GL_CIRCULAR_CCW_ARC_TO_NV 0xF8 #define GL_CIRCULAR_CW_ARC_TO_NV 0xFA #define GL_CIRCULAR_TANGENT_ARC_TO_NV 0xFC #define GL_ARC_TO_NV 0xFE #define GL_RELATIVE_ARC_TO_NV 0xFF #define GL_BOLD_BIT_NV 0x01 #define GL_ITALIC_BIT_NV 0x02 #define GL_GLYPH_WIDTH_BIT_NV 0x01 #define GL_GLYPH_HEIGHT_BIT_NV 0x02 #define GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV 0x04 #define GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV 0x08 #define GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV 0x10 #define GL_GLYPH_VERTICAL_BEARING_X_BIT_NV 0x20 #define GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV 0x40 #define GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV 0x80 #define GL_GLYPH_HAS_KERNING_BIT_NV 0x100 #define GL_FONT_X_MIN_BOUNDS_BIT_NV 0x00010000 #define GL_FONT_Y_MIN_BOUNDS_BIT_NV 0x00020000 #define GL_FONT_X_MAX_BOUNDS_BIT_NV 0x00040000 #define GL_FONT_Y_MAX_BOUNDS_BIT_NV 0x00080000 #define GL_FONT_UNITS_PER_EM_BIT_NV 0x00100000 #define GL_FONT_ASCENDER_BIT_NV 0x00200000 #define GL_FONT_DESCENDER_BIT_NV 0x00400000 #define GL_FONT_HEIGHT_BIT_NV 0x00800000 #define GL_FONT_MAX_ADVANCE_WIDTH_BIT_NV 0x01000000 #define GL_FONT_MAX_ADVANCE_HEIGHT_BIT_NV 0x02000000 #define GL_FONT_UNDERLINE_POSITION_BIT_NV 0x04000000 #define GL_FONT_UNDERLINE_THICKNESS_BIT_NV 0x08000000 #define GL_FONT_HAS_KERNING_BIT_NV 0x10000000 #define GL_ROUNDED_RECT_NV 0xE8 #define GL_RELATIVE_ROUNDED_RECT_NV 0xE9 #define GL_ROUNDED_RECT2_NV 0xEA #define GL_RELATIVE_ROUNDED_RECT2_NV 0xEB #define GL_ROUNDED_RECT4_NV 0xEC #define GL_RELATIVE_ROUNDED_RECT4_NV 0xED #define GL_ROUNDED_RECT8_NV 0xEE #define GL_RELATIVE_ROUNDED_RECT8_NV 0xEF #define GL_RELATIVE_RECT_NV 0xF7 #define GL_FONT_GLYPHS_AVAILABLE_NV 0x9368 #define GL_FONT_TARGET_UNAVAILABLE_NV 0x9369 #define GL_FONT_UNAVAILABLE_NV 0x936A #define GL_FONT_UNINTELLIGIBLE_NV 0x936B #define GL_CONIC_CURVE_TO_NV 0x1A #define GL_RELATIVE_CONIC_CURVE_TO_NV 0x1B #define GL_FONT_NUM_GLYPH_INDICES_BIT_NV 0x20000000 #define GL_STANDARD_FONT_FORMAT_NV 0x936C #define GL_2_BYTES_NV 0x1407 #define GL_3_BYTES_NV 0x1408 #define GL_4_BYTES_NV 0x1409 #define GL_EYE_LINEAR_NV 0x2400 #define GL_OBJECT_LINEAR_NV 0x2401 #define GL_CONSTANT_NV 0x8576 #define GL_PATH_FOG_GEN_MODE_NV 0x90AC #define GL_PRIMARY_COLOR_NV 0x852C #define GL_SECONDARY_COLOR_NV 0x852D #define GL_PATH_GEN_COLOR_FORMAT_NV 0x90B2 #define GL_PATH_PROJECTION_NV 0x1701 #define GL_PATH_MODELVIEW_NV 0x1700 #define GL_PATH_MODELVIEW_STACK_DEPTH_NV 0x0BA3 #define GL_PATH_MODELVIEW_MATRIX_NV 0x0BA6 #define GL_PATH_MAX_MODELVIEW_STACK_DEPTH_NV 0x0D36 #define GL_PATH_TRANSPOSE_MODELVIEW_MATRIX_NV 0x84E3 #define GL_PATH_PROJECTION_STACK_DEPTH_NV 0x0BA4 #define GL_PATH_PROJECTION_MATRIX_NV 0x0BA7 #define GL_PATH_MAX_PROJECTION_STACK_DEPTH_NV 0x0D38 #define GL_PATH_TRANSPOSE_PROJECTION_MATRIX_NV 0x84E4 #define GL_FRAGMENT_INPUT_NV 0x936D typedef GLuint (APIENTRYP PFNGLGENPATHSNVPROC) (GLsizei range); typedef void (APIENTRYP PFNGLDELETEPATHSNVPROC) (GLuint path, GLsizei range); typedef GLboolean (APIENTRYP PFNGLISPATHNVPROC) (GLuint path); typedef void (APIENTRYP PFNGLPATHCOMMANDSNVPROC) (GLuint path, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); typedef void (APIENTRYP PFNGLPATHCOORDSNVPROC) (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords); typedef void (APIENTRYP PFNGLPATHSUBCOMMANDSNVPROC) (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); typedef void (APIENTRYP PFNGLPATHSUBCOORDSNVPROC) (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords); typedef void (APIENTRYP PFNGLPATHSTRINGNVPROC) (GLuint path, GLenum format, GLsizei length, const void *pathString); typedef void (APIENTRYP PFNGLPATHGLYPHSNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void *charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); typedef void (APIENTRYP PFNGLPATHGLYPHRANGENVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); typedef void (APIENTRYP PFNGLWEIGHTPATHSNVPROC) (GLuint resultPath, GLsizei numPaths, const GLuint *paths, const GLfloat *weights); typedef void (APIENTRYP PFNGLCOPYPATHNVPROC) (GLuint resultPath, GLuint srcPath); typedef void (APIENTRYP PFNGLINTERPOLATEPATHSNVPROC) (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight); typedef void (APIENTRYP PFNGLTRANSFORMPATHNVPROC) (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat *transformValues); typedef void (APIENTRYP PFNGLPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, const GLint *value); typedef void (APIENTRYP PFNGLPATHPARAMETERINVPROC) (GLuint path, GLenum pname, GLint value); typedef void (APIENTRYP PFNGLPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, const GLfloat *value); typedef void (APIENTRYP PFNGLPATHPARAMETERFNVPROC) (GLuint path, GLenum pname, GLfloat value); typedef void (APIENTRYP PFNGLPATHDASHARRAYNVPROC) (GLuint path, GLsizei dashCount, const GLfloat *dashArray); typedef void (APIENTRYP PFNGLPATHSTENCILFUNCNVPROC) (GLenum func, GLint ref, GLuint mask); typedef void (APIENTRYP PFNGLPATHSTENCILDEPTHOFFSETNVPROC) (GLfloat factor, GLfloat units); typedef void (APIENTRYP PFNGLSTENCILFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask); typedef void (APIENTRYP PFNGLSTENCILSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask); typedef void (APIENTRYP PFNGLSTENCILFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues); typedef void (APIENTRYP PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues); typedef void (APIENTRYP PFNGLPATHCOVERDEPTHFUNCNVPROC) (GLenum func); typedef void (APIENTRYP PFNGLCOVERFILLPATHNVPROC) (GLuint path, GLenum coverMode); typedef void (APIENTRYP PFNGLCOVERSTROKEPATHNVPROC) (GLuint path, GLenum coverMode); typedef void (APIENTRYP PFNGLCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); typedef void (APIENTRYP PFNGLCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); typedef void (APIENTRYP PFNGLGETPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, GLint *value); typedef void (APIENTRYP PFNGLGETPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, GLfloat *value); typedef void (APIENTRYP PFNGLGETPATHCOMMANDSNVPROC) (GLuint path, GLubyte *commands); typedef void (APIENTRYP PFNGLGETPATHCOORDSNVPROC) (GLuint path, GLfloat *coords); typedef void (APIENTRYP PFNGLGETPATHDASHARRAYNVPROC) (GLuint path, GLfloat *dashArray); typedef void (APIENTRYP PFNGLGETPATHMETRICSNVPROC) (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics); typedef void (APIENTRYP PFNGLGETPATHMETRICRANGENVPROC) (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat *metrics); typedef void (APIENTRYP PFNGLGETPATHSPACINGNVPROC) (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing); typedef GLboolean (APIENTRYP PFNGLISPOINTINFILLPATHNVPROC) (GLuint path, GLuint mask, GLfloat x, GLfloat y); typedef GLboolean (APIENTRYP PFNGLISPOINTINSTROKEPATHNVPROC) (GLuint path, GLfloat x, GLfloat y); typedef GLfloat (APIENTRYP PFNGLGETPATHLENGTHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments); typedef GLboolean (APIENTRYP PFNGLPOINTALONGPATHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat *x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY); typedef void (APIENTRYP PFNGLMATRIXLOAD3X2FNVPROC) (GLenum matrixMode, const GLfloat *m); typedef void (APIENTRYP PFNGLMATRIXLOAD3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); typedef void (APIENTRYP PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); typedef void (APIENTRYP PFNGLMATRIXMULT3X2FNVPROC) (GLenum matrixMode, const GLfloat *m); typedef void (APIENTRYP PFNGLMATRIXMULT3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); typedef void (APIENTRYP PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); typedef void (APIENTRYP PFNGLSTENCILTHENCOVERFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode); typedef void (APIENTRYP PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask, GLenum coverMode); typedef void (APIENTRYP PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); typedef void (APIENTRYP PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); typedef GLenum (APIENTRYP PFNGLPATHGLYPHINDEXRANGENVPROC) (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint baseAndCount[2]); typedef GLenum (APIENTRYP PFNGLPATHGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); typedef GLenum (APIENTRYP PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); typedef void (APIENTRYP PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC) (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat *coeffs); typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCEFVNVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLfloat *params); typedef void (APIENTRYP PFNGLPATHCOLORGENNVPROC) (GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat *coeffs); typedef void (APIENTRYP PFNGLPATHTEXGENNVPROC) (GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat *coeffs); typedef void (APIENTRYP PFNGLPATHFOGGENNVPROC) (GLenum genMode); typedef void (APIENTRYP PFNGLGETPATHCOLORGENIVNVPROC) (GLenum color, GLenum pname, GLint *value); typedef void (APIENTRYP PFNGLGETPATHCOLORGENFVNVPROC) (GLenum color, GLenum pname, GLfloat *value); typedef void (APIENTRYP PFNGLGETPATHTEXGENIVNVPROC) (GLenum texCoordSet, GLenum pname, GLint *value); typedef void (APIENTRYP PFNGLGETPATHTEXGENFVNVPROC) (GLenum texCoordSet, GLenum pname, GLfloat *value); #ifdef GL_GLEXT_PROTOTYPES GLAPI GLuint APIENTRY glGenPathsNV (GLsizei range); GLAPI void APIENTRY glDeletePathsNV (GLuint path, GLsizei range); GLAPI GLboolean APIENTRY glIsPathNV (GLuint path); GLAPI void APIENTRY glPathCommandsNV (GLuint path, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); GLAPI void APIENTRY glPathCoordsNV (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords); GLAPI void APIENTRY glPathSubCommandsNV (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); GLAPI void APIENTRY glPathSubCoordsNV (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords); GLAPI void APIENTRY glPathStringNV (GLuint path, GLenum format, GLsizei length, const void *pathString); GLAPI void APIENTRY glPathGlyphsNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void *charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); GLAPI void APIENTRY glPathGlyphRangeNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); GLAPI void APIENTRY glWeightPathsNV (GLuint resultPath, GLsizei numPaths, const GLuint *paths, const GLfloat *weights); GLAPI void APIENTRY glCopyPathNV (GLuint resultPath, GLuint srcPath); GLAPI void APIENTRY glInterpolatePathsNV (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight); GLAPI void APIENTRY glTransformPathNV (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat *transformValues); GLAPI void APIENTRY glPathParameterivNV (GLuint path, GLenum pname, const GLint *value); GLAPI void APIENTRY glPathParameteriNV (GLuint path, GLenum pname, GLint value); GLAPI void APIENTRY glPathParameterfvNV (GLuint path, GLenum pname, const GLfloat *value); GLAPI void APIENTRY glPathParameterfNV (GLuint path, GLenum pname, GLfloat value); GLAPI void APIENTRY glPathDashArrayNV (GLuint path, GLsizei dashCount, const GLfloat *dashArray); GLAPI void APIENTRY glPathStencilFuncNV (GLenum func, GLint ref, GLuint mask); GLAPI void APIENTRY glPathStencilDepthOffsetNV (GLfloat factor, GLfloat units); GLAPI void APIENTRY glStencilFillPathNV (GLuint path, GLenum fillMode, GLuint mask); GLAPI void APIENTRY glStencilStrokePathNV (GLuint path, GLint reference, GLuint mask); GLAPI void APIENTRY glStencilFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues); GLAPI void APIENTRY glStencilStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues); GLAPI void APIENTRY glPathCoverDepthFuncNV (GLenum func); GLAPI void APIENTRY glCoverFillPathNV (GLuint path, GLenum coverMode); GLAPI void APIENTRY glCoverStrokePathNV (GLuint path, GLenum coverMode); GLAPI void APIENTRY glCoverFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); GLAPI void APIENTRY glCoverStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); GLAPI void APIENTRY glGetPathParameterivNV (GLuint path, GLenum pname, GLint *value); GLAPI void APIENTRY glGetPathParameterfvNV (GLuint path, GLenum pname, GLfloat *value); GLAPI void APIENTRY glGetPathCommandsNV (GLuint path, GLubyte *commands); GLAPI void APIENTRY glGetPathCoordsNV (GLuint path, GLfloat *coords); GLAPI void APIENTRY glGetPathDashArrayNV (GLuint path, GLfloat *dashArray); GLAPI void APIENTRY glGetPathMetricsNV (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics); GLAPI void APIENTRY glGetPathMetricRangeNV (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat *metrics); GLAPI void APIENTRY glGetPathSpacingNV (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing); GLAPI GLboolean APIENTRY glIsPointInFillPathNV (GLuint path, GLuint mask, GLfloat x, GLfloat y); GLAPI GLboolean APIENTRY glIsPointInStrokePathNV (GLuint path, GLfloat x, GLfloat y); GLAPI GLfloat APIENTRY glGetPathLengthNV (GLuint path, GLsizei startSegment, GLsizei numSegments); GLAPI GLboolean APIENTRY glPointAlongPathNV (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat *x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY); GLAPI void APIENTRY glMatrixLoad3x2fNV (GLenum matrixMode, const GLfloat *m); GLAPI void APIENTRY glMatrixLoad3x3fNV (GLenum matrixMode, const GLfloat *m); GLAPI void APIENTRY glMatrixLoadTranspose3x3fNV (GLenum matrixMode, const GLfloat *m); GLAPI void APIENTRY glMatrixMult3x2fNV (GLenum matrixMode, const GLfloat *m); GLAPI void APIENTRY glMatrixMult3x3fNV (GLenum matrixMode, const GLfloat *m); GLAPI void APIENTRY glMatrixMultTranspose3x3fNV (GLenum matrixMode, const GLfloat *m); GLAPI void APIENTRY glStencilThenCoverFillPathNV (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode); GLAPI void APIENTRY glStencilThenCoverStrokePathNV (GLuint path, GLint reference, GLuint mask, GLenum coverMode); GLAPI void APIENTRY glStencilThenCoverFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); GLAPI void APIENTRY glStencilThenCoverStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); GLAPI GLenum APIENTRY glPathGlyphIndexRangeNV (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint baseAndCount[2]); GLAPI GLenum APIENTRY glPathGlyphIndexArrayNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); GLAPI GLenum APIENTRY glPathMemoryGlyphIndexArrayNV (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); GLAPI void APIENTRY glProgramPathFragmentInputGenNV (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat *coeffs); GLAPI void APIENTRY glGetProgramResourcefvNV (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLfloat *params); GLAPI void APIENTRY glPathColorGenNV (GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat *coeffs); GLAPI void APIENTRY glPathTexGenNV (GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat *coeffs); GLAPI void APIENTRY glPathFogGenNV (GLenum genMode); GLAPI void APIENTRY glGetPathColorGenivNV (GLenum color, GLenum pname, GLint *value); GLAPI void APIENTRY glGetPathColorGenfvNV (GLenum color, GLenum pname, GLfloat *value); GLAPI void APIENTRY glGetPathTexGenivNV (GLenum texCoordSet, GLenum pname, GLint *value); GLAPI void APIENTRY glGetPathTexGenfvNV (GLenum texCoordSet, GLenum pname, GLfloat *value); #endif #endif /* GL_NV_path_rendering */ #ifndef GL_NV_path_rendering_shared_edge #define GL_NV_path_rendering_shared_edge 1 #define GL_SHARED_EDGE_NV 0xC0 #endif /* GL_NV_path_rendering_shared_edge */ #ifndef GL_NV_pixel_data_range #define GL_NV_pixel_data_range 1 #define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 #define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 #define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A #define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B #define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C #define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D typedef void (APIENTRYP PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, const void *pointer); typedef void (APIENTRYP PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glPixelDataRangeNV (GLenum target, GLsizei length, const void *pointer); GLAPI void APIENTRY glFlushPixelDataRangeNV (GLenum target); #endif #endif /* GL_NV_pixel_data_range */ #ifndef GL_NV_point_sprite #define GL_NV_point_sprite 1 #define GL_POINT_SPRITE_NV 0x8861 #define GL_COORD_REPLACE_NV 0x8862 #define GL_POINT_SPRITE_R_MODE_NV 0x8863 typedef void (APIENTRYP PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); typedef void (APIENTRYP PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint *params); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glPointParameteriNV (GLenum pname, GLint param); GLAPI void APIENTRY glPointParameterivNV (GLenum pname, const GLint *params); #endif #endif /* GL_NV_point_sprite */ #ifndef GL_NV_present_video #define GL_NV_present_video 1 #define GL_FRAME_NV 0x8E26 #define GL_FIELDS_NV 0x8E27 #define GL_CURRENT_TIME_NV 0x8E28 #define GL_NUM_FILL_STREAMS_NV 0x8E29 #define GL_PRESENT_TIME_NV 0x8E2A #define GL_PRESENT_DURATION_NV 0x8E2B typedef void (APIENTRYP PFNGLPRESENTFRAMEKEYEDNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); typedef void (APIENTRYP PFNGLPRESENTFRAMEDUALFILLNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3); typedef void (APIENTRYP PFNGLGETVIDEOIVNVPROC) (GLuint video_slot, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETVIDEOUIVNVPROC) (GLuint video_slot, GLenum pname, GLuint *params); typedef void (APIENTRYP PFNGLGETVIDEOI64VNVPROC) (GLuint video_slot, GLenum pname, GLint64EXT *params); typedef void (APIENTRYP PFNGLGETVIDEOUI64VNVPROC) (GLuint video_slot, GLenum pname, GLuint64EXT *params); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glPresentFrameKeyedNV (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); GLAPI void APIENTRY glPresentFrameDualFillNV (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3); GLAPI void APIENTRY glGetVideoivNV (GLuint video_slot, GLenum pname, GLint *params); GLAPI void APIENTRY glGetVideouivNV (GLuint video_slot, GLenum pname, GLuint *params); GLAPI void APIENTRY glGetVideoi64vNV (GLuint video_slot, GLenum pname, GLint64EXT *params); GLAPI void APIENTRY glGetVideoui64vNV (GLuint video_slot, GLenum pname, GLuint64EXT *params); #endif #endif /* GL_NV_present_video */ #ifndef GL_NV_primitive_restart #define GL_NV_primitive_restart 1 #define GL_PRIMITIVE_RESTART_NV 0x8558 #define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 typedef void (APIENTRYP PFNGLPRIMITIVERESTARTNVPROC) (void); typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glPrimitiveRestartNV (void); GLAPI void APIENTRY glPrimitiveRestartIndexNV (GLuint index); #endif #endif /* GL_NV_primitive_restart */ #ifndef GL_NV_register_combiners #define GL_NV_register_combiners 1 #define GL_REGISTER_COMBINERS_NV 0x8522 #define GL_VARIABLE_A_NV 0x8523 #define GL_VARIABLE_B_NV 0x8524 #define GL_VARIABLE_C_NV 0x8525 #define GL_VARIABLE_D_NV 0x8526 #define GL_VARIABLE_E_NV 0x8527 #define GL_VARIABLE_F_NV 0x8528 #define GL_VARIABLE_G_NV 0x8529 #define GL_CONSTANT_COLOR0_NV 0x852A #define GL_CONSTANT_COLOR1_NV 0x852B #define GL_SPARE0_NV 0x852E #define GL_SPARE1_NV 0x852F #define GL_DISCARD_NV 0x8530 #define GL_E_TIMES_F_NV 0x8531 #define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 #define GL_UNSIGNED_IDENTITY_NV 0x8536 #define GL_UNSIGNED_INVERT_NV 0x8537 #define GL_EXPAND_NORMAL_NV 0x8538 #define GL_EXPAND_NEGATE_NV 0x8539 #define GL_HALF_BIAS_NORMAL_NV 0x853A #define GL_HALF_BIAS_NEGATE_NV 0x853B #define GL_SIGNED_IDENTITY_NV 0x853C #define GL_SIGNED_NEGATE_NV 0x853D #define GL_SCALE_BY_TWO_NV 0x853E #define GL_SCALE_BY_FOUR_NV 0x853F #define GL_SCALE_BY_ONE_HALF_NV 0x8540 #define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 #define GL_COMBINER_INPUT_NV 0x8542 #define GL_COMBINER_MAPPING_NV 0x8543 #define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 #define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 #define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 #define GL_COMBINER_MUX_SUM_NV 0x8547 #define GL_COMBINER_SCALE_NV 0x8548 #define GL_COMBINER_BIAS_NV 0x8549 #define GL_COMBINER_AB_OUTPUT_NV 0x854A #define GL_COMBINER_CD_OUTPUT_NV 0x854B #define GL_COMBINER_SUM_OUTPUT_NV 0x854C #define GL_MAX_GENERAL_COMBINERS_NV 0x854D #define GL_NUM_GENERAL_COMBINERS_NV 0x854E #define GL_COLOR_SUM_CLAMP_NV 0x854F #define GL_COMBINER0_NV 0x8550 #define GL_COMBINER1_NV 0x8551 #define GL_COMBINER2_NV 0x8552 #define GL_COMBINER3_NV 0x8553 #define GL_COMBINER4_NV 0x8554 #define GL_COMBINER5_NV 0x8555 #define GL_COMBINER6_NV 0x8556 #define GL_COMBINER7_NV 0x8557 typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); typedef void (APIENTRYP PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); typedef void (APIENTRYP PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); typedef void (APIENTRYP PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint *params); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glCombinerParameterfvNV (GLenum pname, const GLfloat *params); GLAPI void APIENTRY glCombinerParameterfNV (GLenum pname, GLfloat param); GLAPI void APIENTRY glCombinerParameterivNV (GLenum pname, const GLint *params); GLAPI void APIENTRY glCombinerParameteriNV (GLenum pname, GLint param); GLAPI void APIENTRY glCombinerInputNV (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); GLAPI void APIENTRY glCombinerOutputNV (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); GLAPI void APIENTRY glFinalCombinerInputNV (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); GLAPI void APIENTRY glGetCombinerInputParameterfvNV (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); GLAPI void APIENTRY glGetCombinerInputParameterivNV (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); GLAPI void APIENTRY glGetCombinerOutputParameterfvNV (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); GLAPI void APIENTRY glGetCombinerOutputParameterivNV (GLenum stage, GLenum portion, GLenum pname, GLint *params); GLAPI void APIENTRY glGetFinalCombinerInputParameterfvNV (GLenum variable, GLenum pname, GLfloat *params); GLAPI void APIENTRY glGetFinalCombinerInputParameterivNV (GLenum variable, GLenum pname, GLint *params); #endif #endif /* GL_NV_register_combiners */ #ifndef GL_NV_register_combiners2 #define GL_NV_register_combiners2 1 #define GL_PER_STAGE_CONSTANTS_NV 0x8535 typedef void (APIENTRYP PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat *params); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glCombinerStageParameterfvNV (GLenum stage, GLenum pname, const GLfloat *params); GLAPI void APIENTRY glGetCombinerStageParameterfvNV (GLenum stage, GLenum pname, GLfloat *params); #endif #endif /* GL_NV_register_combiners2 */ #ifndef GL_NV_sample_locations #define GL_NV_sample_locations 1 #define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_NV 0x933D #define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_NV 0x933E #define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_NV 0x933F #define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_NV 0x9340 #define GL_SAMPLE_LOCATION_NV 0x8E50 #define GL_PROGRAMMABLE_SAMPLE_LOCATION_NV 0x9341 #define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_NV 0x9342 #define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_NV 0x9343 typedef void (APIENTRYP PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLenum target, GLuint start, GLsizei count, const GLfloat *v); typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); typedef void (APIENTRYP PFNGLRESOLVEDEPTHVALUESNVPROC) (void); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glFramebufferSampleLocationsfvNV (GLenum target, GLuint start, GLsizei count, const GLfloat *v); GLAPI void APIENTRY glNamedFramebufferSampleLocationsfvNV (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); GLAPI void APIENTRY glResolveDepthValuesNV (void); #endif #endif /* GL_NV_sample_locations */ #ifndef GL_NV_sample_mask_override_coverage #define GL_NV_sample_mask_override_coverage 1 #endif /* GL_NV_sample_mask_override_coverage */ #ifndef GL_NV_shader_atomic_counters #define GL_NV_shader_atomic_counters 1 #endif /* GL_NV_shader_atomic_counters */ #ifndef GL_NV_shader_atomic_float #define GL_NV_shader_atomic_float 1 #endif /* GL_NV_shader_atomic_float */ #ifndef GL_NV_shader_atomic_fp16_vector #define GL_NV_shader_atomic_fp16_vector 1 #endif /* GL_NV_shader_atomic_fp16_vector */ #ifndef GL_NV_shader_atomic_int64 #define GL_NV_shader_atomic_int64 1 #endif /* GL_NV_shader_atomic_int64 */ #ifndef GL_NV_shader_buffer_load #define GL_NV_shader_buffer_load 1 #define GL_BUFFER_GPU_ADDRESS_NV 0x8F1D #define GL_GPU_ADDRESS_NV 0x8F34 #define GL_MAX_SHADER_BUFFER_ADDRESS_NV 0x8F35 typedef void (APIENTRYP PFNGLMAKEBUFFERRESIDENTNVPROC) (GLenum target, GLenum access); typedef void (APIENTRYP PFNGLMAKEBUFFERNONRESIDENTNVPROC) (GLenum target); typedef GLboolean (APIENTRYP PFNGLISBUFFERRESIDENTNVPROC) (GLenum target); typedef void (APIENTRYP PFNGLMAKENAMEDBUFFERRESIDENTNVPROC) (GLuint buffer, GLenum access); typedef void (APIENTRYP PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC) (GLuint buffer); typedef GLboolean (APIENTRYP PFNGLISNAMEDBUFFERRESIDENTNVPROC) (GLuint buffer); typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERUI64VNVPROC) (GLenum target, GLenum pname, GLuint64EXT *params); typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC) (GLuint buffer, GLenum pname, GLuint64EXT *params); typedef void (APIENTRYP PFNGLGETINTEGERUI64VNVPROC) (GLenum value, GLuint64EXT *result); typedef void (APIENTRYP PFNGLUNIFORMUI64NVPROC) (GLint location, GLuint64EXT value); typedef void (APIENTRYP PFNGLUNIFORMUI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMUI64NVPROC) (GLuint program, GLint location, GLuint64EXT value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glMakeBufferResidentNV (GLenum target, GLenum access); GLAPI void APIENTRY glMakeBufferNonResidentNV (GLenum target); GLAPI GLboolean APIENTRY glIsBufferResidentNV (GLenum target); GLAPI void APIENTRY glMakeNamedBufferResidentNV (GLuint buffer, GLenum access); GLAPI void APIENTRY glMakeNamedBufferNonResidentNV (GLuint buffer); GLAPI GLboolean APIENTRY glIsNamedBufferResidentNV (GLuint buffer); GLAPI void APIENTRY glGetBufferParameterui64vNV (GLenum target, GLenum pname, GLuint64EXT *params); GLAPI void APIENTRY glGetNamedBufferParameterui64vNV (GLuint buffer, GLenum pname, GLuint64EXT *params); GLAPI void APIENTRY glGetIntegerui64vNV (GLenum value, GLuint64EXT *result); GLAPI void APIENTRY glUniformui64NV (GLint location, GLuint64EXT value); GLAPI void APIENTRY glUniformui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); GLAPI void APIENTRY glProgramUniformui64NV (GLuint program, GLint location, GLuint64EXT value); GLAPI void APIENTRY glProgramUniformui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); #endif #endif /* GL_NV_shader_buffer_load */ #ifndef GL_NV_shader_buffer_store #define GL_NV_shader_buffer_store 1 #define GL_SHADER_GLOBAL_ACCESS_BARRIER_BIT_NV 0x00000010 #endif /* GL_NV_shader_buffer_store */ #ifndef GL_NV_shader_storage_buffer_object #define GL_NV_shader_storage_buffer_object 1 #endif /* GL_NV_shader_storage_buffer_object */ #ifndef GL_NV_shader_thread_group #define GL_NV_shader_thread_group 1 #define GL_WARP_SIZE_NV 0x9339 #define GL_WARPS_PER_SM_NV 0x933A #define GL_SM_COUNT_NV 0x933B #endif /* GL_NV_shader_thread_group */ #ifndef GL_NV_shader_thread_shuffle #define GL_NV_shader_thread_shuffle 1 #endif /* GL_NV_shader_thread_shuffle */ #ifndef GL_NV_tessellation_program5 #define GL_NV_tessellation_program5 1 #define GL_MAX_PROGRAM_PATCH_ATTRIBS_NV 0x86D8 #define GL_TESS_CONTROL_PROGRAM_NV 0x891E #define GL_TESS_EVALUATION_PROGRAM_NV 0x891F #define GL_TESS_CONTROL_PROGRAM_PARAMETER_BUFFER_NV 0x8C74 #define GL_TESS_EVALUATION_PROGRAM_PARAMETER_BUFFER_NV 0x8C75 #endif /* GL_NV_tessellation_program5 */ #ifndef GL_NV_texgen_emboss #define GL_NV_texgen_emboss 1 #define GL_EMBOSS_LIGHT_NV 0x855D #define GL_EMBOSS_CONSTANT_NV 0x855E #define GL_EMBOSS_MAP_NV 0x855F #endif /* GL_NV_texgen_emboss */ #ifndef GL_NV_texgen_reflection #define GL_NV_texgen_reflection 1 #define GL_NORMAL_MAP_NV 0x8511 #define GL_REFLECTION_MAP_NV 0x8512 #endif /* GL_NV_texgen_reflection */ #ifndef GL_NV_texture_barrier #define GL_NV_texture_barrier 1 typedef void (APIENTRYP PFNGLTEXTUREBARRIERNVPROC) (void); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glTextureBarrierNV (void); #endif #endif /* GL_NV_texture_barrier */ #ifndef GL_NV_texture_compression_vtc #define GL_NV_texture_compression_vtc 1 #endif /* GL_NV_texture_compression_vtc */ #ifndef GL_NV_texture_env_combine4 #define GL_NV_texture_env_combine4 1 #define GL_COMBINE4_NV 0x8503 #define GL_SOURCE3_RGB_NV 0x8583 #define GL_SOURCE3_ALPHA_NV 0x858B #define GL_OPERAND3_RGB_NV 0x8593 #define GL_OPERAND3_ALPHA_NV 0x859B #endif /* GL_NV_texture_env_combine4 */ #ifndef GL_NV_texture_expand_normal #define GL_NV_texture_expand_normal 1 #define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F #endif /* GL_NV_texture_expand_normal */ #ifndef GL_NV_texture_multisample #define GL_NV_texture_multisample 1 #define GL_TEXTURE_COVERAGE_SAMPLES_NV 0x9045 #define GL_TEXTURE_COLOR_SAMPLES_NV 0x9046 typedef void (APIENTRYP PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); typedef void (APIENTRYP PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); typedef void (APIENTRYP PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); typedef void (APIENTRYP PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); typedef void (APIENTRYP PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); typedef void (APIENTRYP PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glTexImage2DMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); GLAPI void APIENTRY glTexImage3DMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); GLAPI void APIENTRY glTextureImage2DMultisampleNV (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); GLAPI void APIENTRY glTextureImage3DMultisampleNV (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); GLAPI void APIENTRY glTextureImage2DMultisampleCoverageNV (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); GLAPI void APIENTRY glTextureImage3DMultisampleCoverageNV (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); #endif #endif /* GL_NV_texture_multisample */ #ifndef GL_NV_texture_rectangle #define GL_NV_texture_rectangle 1 #define GL_TEXTURE_RECTANGLE_NV 0x84F5 #define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 #define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 #define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 #endif /* GL_NV_texture_rectangle */ #ifndef GL_NV_texture_shader #define GL_NV_texture_shader 1 #define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C #define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D #define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E #define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 #define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA #define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB #define GL_DSDT_MAG_INTENSITY_NV 0x86DC #define GL_SHADER_CONSISTENT_NV 0x86DD #define GL_TEXTURE_SHADER_NV 0x86DE #define GL_SHADER_OPERATION_NV 0x86DF #define GL_CULL_MODES_NV 0x86E0 #define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 #define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 #define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 #define GL_OFFSET_TEXTURE_2D_MATRIX_NV 0x86E1 #define GL_OFFSET_TEXTURE_2D_SCALE_NV 0x86E2 #define GL_OFFSET_TEXTURE_2D_BIAS_NV 0x86E3 #define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 #define GL_CONST_EYE_NV 0x86E5 #define GL_PASS_THROUGH_NV 0x86E6 #define GL_CULL_FRAGMENT_NV 0x86E7 #define GL_OFFSET_TEXTURE_2D_NV 0x86E8 #define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 #define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA #define GL_DOT_PRODUCT_NV 0x86EC #define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED #define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE #define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 #define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 #define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 #define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 #define GL_HILO_NV 0x86F4 #define GL_DSDT_NV 0x86F5 #define GL_DSDT_MAG_NV 0x86F6 #define GL_DSDT_MAG_VIB_NV 0x86F7 #define GL_HILO16_NV 0x86F8 #define GL_SIGNED_HILO_NV 0x86F9 #define GL_SIGNED_HILO16_NV 0x86FA #define GL_SIGNED_RGBA_NV 0x86FB #define GL_SIGNED_RGBA8_NV 0x86FC #define GL_SIGNED_RGB_NV 0x86FE #define GL_SIGNED_RGB8_NV 0x86FF #define GL_SIGNED_LUMINANCE_NV 0x8701 #define GL_SIGNED_LUMINANCE8_NV 0x8702 #define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 #define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 #define GL_SIGNED_ALPHA_NV 0x8705 #define GL_SIGNED_ALPHA8_NV 0x8706 #define GL_SIGNED_INTENSITY_NV 0x8707 #define GL_SIGNED_INTENSITY8_NV 0x8708 #define GL_DSDT8_NV 0x8709 #define GL_DSDT8_MAG8_NV 0x870A #define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B #define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C #define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D #define GL_HI_SCALE_NV 0x870E #define GL_LO_SCALE_NV 0x870F #define GL_DS_SCALE_NV 0x8710 #define GL_DT_SCALE_NV 0x8711 #define GL_MAGNITUDE_SCALE_NV 0x8712 #define GL_VIBRANCE_SCALE_NV 0x8713 #define GL_HI_BIAS_NV 0x8714 #define GL_LO_BIAS_NV 0x8715 #define GL_DS_BIAS_NV 0x8716 #define GL_DT_BIAS_NV 0x8717 #define GL_MAGNITUDE_BIAS_NV 0x8718 #define GL_VIBRANCE_BIAS_NV 0x8719 #define GL_TEXTURE_BORDER_VALUES_NV 0x871A #define GL_TEXTURE_HI_SIZE_NV 0x871B #define GL_TEXTURE_LO_SIZE_NV 0x871C #define GL_TEXTURE_DS_SIZE_NV 0x871D #define GL_TEXTURE_DT_SIZE_NV 0x871E #define GL_TEXTURE_MAG_SIZE_NV 0x871F #endif /* GL_NV_texture_shader */ #ifndef GL_NV_texture_shader2 #define GL_NV_texture_shader2 1 #define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF #endif /* GL_NV_texture_shader2 */ #ifndef GL_NV_texture_shader3 #define GL_NV_texture_shader3 1 #define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 #define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 #define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 #define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 #define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 #define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 #define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 #define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 #define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 #define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 #define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A #define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B #define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C #define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D #define GL_HILO8_NV 0x885E #define GL_SIGNED_HILO8_NV 0x885F #define GL_FORCE_BLUE_TO_ONE_NV 0x8860 #endif /* GL_NV_texture_shader3 */ #ifndef GL_NV_transform_feedback #define GL_NV_transform_feedback 1 #define GL_BACK_PRIMARY_COLOR_NV 0x8C77 #define GL_BACK_SECONDARY_COLOR_NV 0x8C78 #define GL_TEXTURE_COORD_NV 0x8C79 #define GL_CLIP_DISTANCE_NV 0x8C7A #define GL_VERTEX_ID_NV 0x8C7B #define GL_PRIMITIVE_ID_NV 0x8C7C #define GL_GENERIC_ATTRIB_NV 0x8C7D #define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV 0x8C7E #define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F #define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80 #define GL_ACTIVE_VARYINGS_NV 0x8C81 #define GL_ACTIVE_VARYING_MAX_LENGTH_NV 0x8C82 #define GL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83 #define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84 #define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85 #define GL_TRANSFORM_FEEDBACK_RECORD_NV 0x8C86 #define GL_PRIMITIVES_GENERATED_NV 0x8C87 #define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88 #define GL_RASTERIZER_DISCARD_NV 0x8C89 #define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV 0x8C8A #define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B #define GL_INTERLEAVED_ATTRIBS_NV 0x8C8C #define GL_SEPARATE_ATTRIBS_NV 0x8C8D #define GL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E #define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F #define GL_LAYER_NV 0x8DAA #define GL_NEXT_BUFFER_NV -2 #define GL_SKIP_COMPONENTS4_NV -3 #define GL_SKIP_COMPONENTS3_NV -4 #define GL_SKIP_COMPONENTS2_NV -5 #define GL_SKIP_COMPONENTS1_NV -6 typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKNVPROC) (GLenum primitiveMode); typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKNVPROC) (void); typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) (GLsizei count, const GLint *attribs, GLenum bufferMode); typedef void (APIENTRYP PFNGLBINDBUFFERRANGENVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); typedef void (APIENTRYP PFNGLBINDBUFFEROFFSETNVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); typedef void (APIENTRYP PFNGLBINDBUFFERBASENVPROC) (GLenum target, GLuint index, GLuint buffer); typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); typedef void (APIENTRYP PFNGLACTIVEVARYINGNVPROC) (GLuint program, const GLchar *name); typedef GLint (APIENTRYP PFNGLGETVARYINGLOCATIONNVPROC) (GLuint program, const GLchar *name); typedef void (APIENTRYP PFNGLGETACTIVEVARYINGNVPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) (GLuint program, GLuint index, GLint *location); typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKSTREAMATTRIBSNVPROC) (GLsizei count, const GLint *attribs, GLsizei nbuffers, const GLint *bufstreams, GLenum bufferMode); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBeginTransformFeedbackNV (GLenum primitiveMode); GLAPI void APIENTRY glEndTransformFeedbackNV (void); GLAPI void APIENTRY glTransformFeedbackAttribsNV (GLsizei count, const GLint *attribs, GLenum bufferMode); GLAPI void APIENTRY glBindBufferRangeNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); GLAPI void APIENTRY glBindBufferOffsetNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset); GLAPI void APIENTRY glBindBufferBaseNV (GLenum target, GLuint index, GLuint buffer); GLAPI void APIENTRY glTransformFeedbackVaryingsNV (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); GLAPI void APIENTRY glActiveVaryingNV (GLuint program, const GLchar *name); GLAPI GLint APIENTRY glGetVaryingLocationNV (GLuint program, const GLchar *name); GLAPI void APIENTRY glGetActiveVaryingNV (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); GLAPI void APIENTRY glGetTransformFeedbackVaryingNV (GLuint program, GLuint index, GLint *location); GLAPI void APIENTRY glTransformFeedbackStreamAttribsNV (GLsizei count, const GLint *attribs, GLsizei nbuffers, const GLint *bufstreams, GLenum bufferMode); #endif #endif /* GL_NV_transform_feedback */ #ifndef GL_NV_transform_feedback2 #define GL_NV_transform_feedback2 1 #define GL_TRANSFORM_FEEDBACK_NV 0x8E22 #define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV 0x8E23 #define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV 0x8E24 #define GL_TRANSFORM_FEEDBACK_BINDING_NV 0x8E25 typedef void (APIENTRYP PFNGLBINDTRANSFORMFEEDBACKNVPROC) (GLenum target, GLuint id); typedef void (APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSNVPROC) (GLsizei n, const GLuint *ids); typedef void (APIENTRYP PFNGLGENTRANSFORMFEEDBACKSNVPROC) (GLsizei n, GLuint *ids); typedef GLboolean (APIENTRYP PFNGLISTRANSFORMFEEDBACKNVPROC) (GLuint id); typedef void (APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKNVPROC) (void); typedef void (APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKNVPROC) (void); typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKNVPROC) (GLenum mode, GLuint id); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBindTransformFeedbackNV (GLenum target, GLuint id); GLAPI void APIENTRY glDeleteTransformFeedbacksNV (GLsizei n, const GLuint *ids); GLAPI void APIENTRY glGenTransformFeedbacksNV (GLsizei n, GLuint *ids); GLAPI GLboolean APIENTRY glIsTransformFeedbackNV (GLuint id); GLAPI void APIENTRY glPauseTransformFeedbackNV (void); GLAPI void APIENTRY glResumeTransformFeedbackNV (void); GLAPI void APIENTRY glDrawTransformFeedbackNV (GLenum mode, GLuint id); #endif #endif /* GL_NV_transform_feedback2 */ #ifndef GL_NV_uniform_buffer_unified_memory #define GL_NV_uniform_buffer_unified_memory 1 #define GL_UNIFORM_BUFFER_UNIFIED_NV 0x936E #define GL_UNIFORM_BUFFER_ADDRESS_NV 0x936F #define GL_UNIFORM_BUFFER_LENGTH_NV 0x9370 #endif /* GL_NV_uniform_buffer_unified_memory */ #ifndef GL_NV_vdpau_interop #define GL_NV_vdpau_interop 1 typedef GLintptr GLvdpauSurfaceNV; #define GL_SURFACE_STATE_NV 0x86EB #define GL_SURFACE_REGISTERED_NV 0x86FD #define GL_SURFACE_MAPPED_NV 0x8700 #define GL_WRITE_DISCARD_NV 0x88BE typedef void (APIENTRYP PFNGLVDPAUINITNVPROC) (const void *vdpDevice, const void *getProcAddress); typedef void (APIENTRYP PFNGLVDPAUFININVPROC) (void); typedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTERVIDEOSURFACENVPROC) (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); typedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC) (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); typedef GLboolean (APIENTRYP PFNGLVDPAUISSURFACENVPROC) (GLvdpauSurfaceNV surface); typedef void (APIENTRYP PFNGLVDPAUUNREGISTERSURFACENVPROC) (GLvdpauSurfaceNV surface); typedef void (APIENTRYP PFNGLVDPAUGETSURFACEIVNVPROC) (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); typedef void (APIENTRYP PFNGLVDPAUSURFACEACCESSNVPROC) (GLvdpauSurfaceNV surface, GLenum access); typedef void (APIENTRYP PFNGLVDPAUMAPSURFACESNVPROC) (GLsizei numSurfaces, const GLvdpauSurfaceNV *surfaces); typedef void (APIENTRYP PFNGLVDPAUUNMAPSURFACESNVPROC) (GLsizei numSurface, const GLvdpauSurfaceNV *surfaces); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glVDPAUInitNV (const void *vdpDevice, const void *getProcAddress); GLAPI void APIENTRY glVDPAUFiniNV (void); GLAPI GLvdpauSurfaceNV APIENTRY glVDPAURegisterVideoSurfaceNV (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); GLAPI GLvdpauSurfaceNV APIENTRY glVDPAURegisterOutputSurfaceNV (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); GLAPI GLboolean APIENTRY glVDPAUIsSurfaceNV (GLvdpauSurfaceNV surface); GLAPI void APIENTRY glVDPAUUnregisterSurfaceNV (GLvdpauSurfaceNV surface); GLAPI void APIENTRY glVDPAUGetSurfaceivNV (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); GLAPI void APIENTRY glVDPAUSurfaceAccessNV (GLvdpauSurfaceNV surface, GLenum access); GLAPI void APIENTRY glVDPAUMapSurfacesNV (GLsizei numSurfaces, const GLvdpauSurfaceNV *surfaces); GLAPI void APIENTRY glVDPAUUnmapSurfacesNV (GLsizei numSurface, const GLvdpauSurfaceNV *surfaces); #endif #endif /* GL_NV_vdpau_interop */ #ifndef GL_NV_vertex_array_range #define GL_NV_vertex_array_range 1 #define GL_VERTEX_ARRAY_RANGE_NV 0x851D #define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E #define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F #define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 #define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); typedef void (APIENTRYP PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, const void *pointer); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glFlushVertexArrayRangeNV (void); GLAPI void APIENTRY glVertexArrayRangeNV (GLsizei length, const void *pointer); #endif #endif /* GL_NV_vertex_array_range */ #ifndef GL_NV_vertex_array_range2 #define GL_NV_vertex_array_range2 1 #define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 #endif /* GL_NV_vertex_array_range2 */ #ifndef GL_NV_vertex_attrib_integer_64bit #define GL_NV_vertex_attrib_integer_64bit 1 typedef void (APIENTRYP PFNGLVERTEXATTRIBL1I64NVPROC) (GLuint index, GLint64EXT x); typedef void (APIENTRYP PFNGLVERTEXATTRIBL2I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y); typedef void (APIENTRYP PFNGLVERTEXATTRIBL3I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); typedef void (APIENTRYP PFNGLVERTEXATTRIBL4I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); typedef void (APIENTRYP PFNGLVERTEXATTRIBL1I64VNVPROC) (GLuint index, const GLint64EXT *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBL2I64VNVPROC) (GLuint index, const GLint64EXT *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBL3I64VNVPROC) (GLuint index, const GLint64EXT *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBL4I64VNVPROC) (GLuint index, const GLint64EXT *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64NVPROC) (GLuint index, GLuint64EXT x); typedef void (APIENTRYP PFNGLVERTEXATTRIBL2UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y); typedef void (APIENTRYP PFNGLVERTEXATTRIBL3UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); typedef void (APIENTRYP PFNGLVERTEXATTRIBL4UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64VNVPROC) (GLuint index, const GLuint64EXT *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBL2UI64VNVPROC) (GLuint index, const GLuint64EXT *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBL3UI64VNVPROC) (GLuint index, const GLuint64EXT *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBL4UI64VNVPROC) (GLuint index, const GLuint64EXT *v); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLI64VNVPROC) (GLuint index, GLenum pname, GLint64EXT *params); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLUI64VNVPROC) (GLuint index, GLenum pname, GLuint64EXT *params); typedef void (APIENTRYP PFNGLVERTEXATTRIBLFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glVertexAttribL1i64NV (GLuint index, GLint64EXT x); GLAPI void APIENTRY glVertexAttribL2i64NV (GLuint index, GLint64EXT x, GLint64EXT y); GLAPI void APIENTRY glVertexAttribL3i64NV (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); GLAPI void APIENTRY glVertexAttribL4i64NV (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); GLAPI void APIENTRY glVertexAttribL1i64vNV (GLuint index, const GLint64EXT *v); GLAPI void APIENTRY glVertexAttribL2i64vNV (GLuint index, const GLint64EXT *v); GLAPI void APIENTRY glVertexAttribL3i64vNV (GLuint index, const GLint64EXT *v); GLAPI void APIENTRY glVertexAttribL4i64vNV (GLuint index, const GLint64EXT *v); GLAPI void APIENTRY glVertexAttribL1ui64NV (GLuint index, GLuint64EXT x); GLAPI void APIENTRY glVertexAttribL2ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y); GLAPI void APIENTRY glVertexAttribL3ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); GLAPI void APIENTRY glVertexAttribL4ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); GLAPI void APIENTRY glVertexAttribL1ui64vNV (GLuint index, const GLuint64EXT *v); GLAPI void APIENTRY glVertexAttribL2ui64vNV (GLuint index, const GLuint64EXT *v); GLAPI void APIENTRY glVertexAttribL3ui64vNV (GLuint index, const GLuint64EXT *v); GLAPI void APIENTRY glVertexAttribL4ui64vNV (GLuint index, const GLuint64EXT *v); GLAPI void APIENTRY glGetVertexAttribLi64vNV (GLuint index, GLenum pname, GLint64EXT *params); GLAPI void APIENTRY glGetVertexAttribLui64vNV (GLuint index, GLenum pname, GLuint64EXT *params); GLAPI void APIENTRY glVertexAttribLFormatNV (GLuint index, GLint size, GLenum type, GLsizei stride); #endif #endif /* GL_NV_vertex_attrib_integer_64bit */ #ifndef GL_NV_vertex_buffer_unified_memory #define GL_NV_vertex_buffer_unified_memory 1 #define GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV 0x8F1E #define GL_ELEMENT_ARRAY_UNIFIED_NV 0x8F1F #define GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV 0x8F20 #define GL_VERTEX_ARRAY_ADDRESS_NV 0x8F21 #define GL_NORMAL_ARRAY_ADDRESS_NV 0x8F22 #define GL_COLOR_ARRAY_ADDRESS_NV 0x8F23 #define GL_INDEX_ARRAY_ADDRESS_NV 0x8F24 #define GL_TEXTURE_COORD_ARRAY_ADDRESS_NV 0x8F25 #define GL_EDGE_FLAG_ARRAY_ADDRESS_NV 0x8F26 #define GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV 0x8F27 #define GL_FOG_COORD_ARRAY_ADDRESS_NV 0x8F28 #define GL_ELEMENT_ARRAY_ADDRESS_NV 0x8F29 #define GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV 0x8F2A #define GL_VERTEX_ARRAY_LENGTH_NV 0x8F2B #define GL_NORMAL_ARRAY_LENGTH_NV 0x8F2C #define GL_COLOR_ARRAY_LENGTH_NV 0x8F2D #define GL_INDEX_ARRAY_LENGTH_NV 0x8F2E #define GL_TEXTURE_COORD_ARRAY_LENGTH_NV 0x8F2F #define GL_EDGE_FLAG_ARRAY_LENGTH_NV 0x8F30 #define GL_SECONDARY_COLOR_ARRAY_LENGTH_NV 0x8F31 #define GL_FOG_COORD_ARRAY_LENGTH_NV 0x8F32 #define GL_ELEMENT_ARRAY_LENGTH_NV 0x8F33 #define GL_DRAW_INDIRECT_UNIFIED_NV 0x8F40 #define GL_DRAW_INDIRECT_ADDRESS_NV 0x8F41 #define GL_DRAW_INDIRECT_LENGTH_NV 0x8F42 typedef void (APIENTRYP PFNGLBUFFERADDRESSRANGENVPROC) (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); typedef void (APIENTRYP PFNGLVERTEXFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); typedef void (APIENTRYP PFNGLNORMALFORMATNVPROC) (GLenum type, GLsizei stride); typedef void (APIENTRYP PFNGLCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); typedef void (APIENTRYP PFNGLINDEXFORMATNVPROC) (GLenum type, GLsizei stride); typedef void (APIENTRYP PFNGLTEXCOORDFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); typedef void (APIENTRYP PFNGLEDGEFLAGFORMATNVPROC) (GLsizei stride); typedef void (APIENTRYP PFNGLSECONDARYCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); typedef void (APIENTRYP PFNGLFOGCOORDFORMATNVPROC) (GLenum type, GLsizei stride); typedef void (APIENTRYP PFNGLVERTEXATTRIBFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); typedef void (APIENTRYP PFNGLVERTEXATTRIBIFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); typedef void (APIENTRYP PFNGLGETINTEGERUI64I_VNVPROC) (GLenum value, GLuint index, GLuint64EXT *result); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBufferAddressRangeNV (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); GLAPI void APIENTRY glVertexFormatNV (GLint size, GLenum type, GLsizei stride); GLAPI void APIENTRY glNormalFormatNV (GLenum type, GLsizei stride); GLAPI void APIENTRY glColorFormatNV (GLint size, GLenum type, GLsizei stride); GLAPI void APIENTRY glIndexFormatNV (GLenum type, GLsizei stride); GLAPI void APIENTRY glTexCoordFormatNV (GLint size, GLenum type, GLsizei stride); GLAPI void APIENTRY glEdgeFlagFormatNV (GLsizei stride); GLAPI void APIENTRY glSecondaryColorFormatNV (GLint size, GLenum type, GLsizei stride); GLAPI void APIENTRY glFogCoordFormatNV (GLenum type, GLsizei stride); GLAPI void APIENTRY glVertexAttribFormatNV (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); GLAPI void APIENTRY glVertexAttribIFormatNV (GLuint index, GLint size, GLenum type, GLsizei stride); GLAPI void APIENTRY glGetIntegerui64i_vNV (GLenum value, GLuint index, GLuint64EXT *result); #endif #endif /* GL_NV_vertex_buffer_unified_memory */ #ifndef GL_NV_vertex_program #define GL_NV_vertex_program 1 #define GL_VERTEX_PROGRAM_NV 0x8620 #define GL_VERTEX_STATE_PROGRAM_NV 0x8621 #define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 #define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 #define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 #define GL_CURRENT_ATTRIB_NV 0x8626 #define GL_PROGRAM_LENGTH_NV 0x8627 #define GL_PROGRAM_STRING_NV 0x8628 #define GL_MODELVIEW_PROJECTION_NV 0x8629 #define GL_IDENTITY_NV 0x862A #define GL_INVERSE_NV 0x862B #define GL_TRANSPOSE_NV 0x862C #define GL_INVERSE_TRANSPOSE_NV 0x862D #define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E #define GL_MAX_TRACK_MATRICES_NV 0x862F #define GL_MATRIX0_NV 0x8630 #define GL_MATRIX1_NV 0x8631 #define GL_MATRIX2_NV 0x8632 #define GL_MATRIX3_NV 0x8633 #define GL_MATRIX4_NV 0x8634 #define GL_MATRIX5_NV 0x8635 #define GL_MATRIX6_NV 0x8636 #define GL_MATRIX7_NV 0x8637 #define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 #define GL_CURRENT_MATRIX_NV 0x8641 #define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 #define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 #define GL_PROGRAM_PARAMETER_NV 0x8644 #define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 #define GL_PROGRAM_TARGET_NV 0x8646 #define GL_PROGRAM_RESIDENT_NV 0x8647 #define GL_TRACK_MATRIX_NV 0x8648 #define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 #define GL_VERTEX_PROGRAM_BINDING_NV 0x864A #define GL_PROGRAM_ERROR_POSITION_NV 0x864B #define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 #define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 #define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 #define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 #define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 #define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 #define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 #define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 #define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 #define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 #define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A #define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B #define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C #define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D #define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E #define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F #define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 #define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 #define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 #define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 #define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 #define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 #define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 #define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 #define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 #define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 #define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A #define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B #define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C #define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D #define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E #define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F #define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 #define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 #define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 #define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 #define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 #define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 #define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 #define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 #define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 #define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 #define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A #define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B #define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C #define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D #define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E #define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F typedef GLboolean (APIENTRYP PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint *programs, GLboolean *residences); typedef void (APIENTRYP PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); typedef void (APIENTRYP PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); typedef void (APIENTRYP PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat *params); typedef void (APIENTRYP PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint *programs); typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble *params); typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte *program); typedef void (APIENTRYP PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble *params); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, void **pointer); typedef GLboolean (APIENTRYP PFNGLISPROGRAMNVPROC) (GLuint id); typedef void (APIENTRYP PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte *program); typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat *v); typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLdouble *v); typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *v); typedef void (APIENTRYP PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); typedef void (APIENTRYP PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint fsize, GLenum type, GLsizei stride, const void *pointer); typedef void (APIENTRYP PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei count, const GLubyte *v); #ifdef GL_GLEXT_PROTOTYPES GLAPI GLboolean APIENTRY glAreProgramsResidentNV (GLsizei n, const GLuint *programs, GLboolean *residences); GLAPI void APIENTRY glBindProgramNV (GLenum target, GLuint id); GLAPI void APIENTRY glDeleteProgramsNV (GLsizei n, const GLuint *programs); GLAPI void APIENTRY glExecuteProgramNV (GLenum target, GLuint id, const GLfloat *params); GLAPI void APIENTRY glGenProgramsNV (GLsizei n, GLuint *programs); GLAPI void APIENTRY glGetProgramParameterdvNV (GLenum target, GLuint index, GLenum pname, GLdouble *params); GLAPI void APIENTRY glGetProgramParameterfvNV (GLenum target, GLuint index, GLenum pname, GLfloat *params); GLAPI void APIENTRY glGetProgramivNV (GLuint id, GLenum pname, GLint *params); GLAPI void APIENTRY glGetProgramStringNV (GLuint id, GLenum pname, GLubyte *program); GLAPI void APIENTRY glGetTrackMatrixivNV (GLenum target, GLuint address, GLenum pname, GLint *params); GLAPI void APIENTRY glGetVertexAttribdvNV (GLuint index, GLenum pname, GLdouble *params); GLAPI void APIENTRY glGetVertexAttribfvNV (GLuint index, GLenum pname, GLfloat *params); GLAPI void APIENTRY glGetVertexAttribivNV (GLuint index, GLenum pname, GLint *params); GLAPI void APIENTRY glGetVertexAttribPointervNV (GLuint index, GLenum pname, void **pointer); GLAPI GLboolean APIENTRY glIsProgramNV (GLuint id); GLAPI void APIENTRY glLoadProgramNV (GLenum target, GLuint id, GLsizei len, const GLubyte *program); GLAPI void APIENTRY glProgramParameter4dNV (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); GLAPI void APIENTRY glProgramParameter4dvNV (GLenum target, GLuint index, const GLdouble *v); GLAPI void APIENTRY glProgramParameter4fNV (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); GLAPI void APIENTRY glProgramParameter4fvNV (GLenum target, GLuint index, const GLfloat *v); GLAPI void APIENTRY glProgramParameters4dvNV (GLenum target, GLuint index, GLsizei count, const GLdouble *v); GLAPI void APIENTRY glProgramParameters4fvNV (GLenum target, GLuint index, GLsizei count, const GLfloat *v); GLAPI void APIENTRY glRequestResidentProgramsNV (GLsizei n, const GLuint *programs); GLAPI void APIENTRY glTrackMatrixNV (GLenum target, GLuint address, GLenum matrix, GLenum transform); GLAPI void APIENTRY glVertexAttribPointerNV (GLuint index, GLint fsize, GLenum type, GLsizei stride, const void *pointer); GLAPI void APIENTRY glVertexAttrib1dNV (GLuint index, GLdouble x); GLAPI void APIENTRY glVertexAttrib1dvNV (GLuint index, const GLdouble *v); GLAPI void APIENTRY glVertexAttrib1fNV (GLuint index, GLfloat x); GLAPI void APIENTRY glVertexAttrib1fvNV (GLuint index, const GLfloat *v); GLAPI void APIENTRY glVertexAttrib1sNV (GLuint index, GLshort x); GLAPI void APIENTRY glVertexAttrib1svNV (GLuint index, const GLshort *v); GLAPI void APIENTRY glVertexAttrib2dNV (GLuint index, GLdouble x, GLdouble y); GLAPI void APIENTRY glVertexAttrib2dvNV (GLuint index, const GLdouble *v); GLAPI void APIENTRY glVertexAttrib2fNV (GLuint index, GLfloat x, GLfloat y); GLAPI void APIENTRY glVertexAttrib2fvNV (GLuint index, const GLfloat *v); GLAPI void APIENTRY glVertexAttrib2sNV (GLuint index, GLshort x, GLshort y); GLAPI void APIENTRY glVertexAttrib2svNV (GLuint index, const GLshort *v); GLAPI void APIENTRY glVertexAttrib3dNV (GLuint index, GLdouble x, GLdouble y, GLdouble z); GLAPI void APIENTRY glVertexAttrib3dvNV (GLuint index, const GLdouble *v); GLAPI void APIENTRY glVertexAttrib3fNV (GLuint index, GLfloat x, GLfloat y, GLfloat z); GLAPI void APIENTRY glVertexAttrib3fvNV (GLuint index, const GLfloat *v); GLAPI void APIENTRY glVertexAttrib3sNV (GLuint index, GLshort x, GLshort y, GLshort z); GLAPI void APIENTRY glVertexAttrib3svNV (GLuint index, const GLshort *v); GLAPI void APIENTRY glVertexAttrib4dNV (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); GLAPI void APIENTRY glVertexAttrib4dvNV (GLuint index, const GLdouble *v); GLAPI void APIENTRY glVertexAttrib4fNV (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); GLAPI void APIENTRY glVertexAttrib4fvNV (GLuint index, const GLfloat *v); GLAPI void APIENTRY glVertexAttrib4sNV (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); GLAPI void APIENTRY glVertexAttrib4svNV (GLuint index, const GLshort *v); GLAPI void APIENTRY glVertexAttrib4ubNV (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); GLAPI void APIENTRY glVertexAttrib4ubvNV (GLuint index, const GLubyte *v); GLAPI void APIENTRY glVertexAttribs1dvNV (GLuint index, GLsizei count, const GLdouble *v); GLAPI void APIENTRY glVertexAttribs1fvNV (GLuint index, GLsizei count, const GLfloat *v); GLAPI void APIENTRY glVertexAttribs1svNV (GLuint index, GLsizei count, const GLshort *v); GLAPI void APIENTRY glVertexAttribs2dvNV (GLuint index, GLsizei count, const GLdouble *v); GLAPI void APIENTRY glVertexAttribs2fvNV (GLuint index, GLsizei count, const GLfloat *v); GLAPI void APIENTRY glVertexAttribs2svNV (GLuint index, GLsizei count, const GLshort *v); GLAPI void APIENTRY glVertexAttribs3dvNV (GLuint index, GLsizei count, const GLdouble *v); GLAPI void APIENTRY glVertexAttribs3fvNV (GLuint index, GLsizei count, const GLfloat *v); GLAPI void APIENTRY glVertexAttribs3svNV (GLuint index, GLsizei count, const GLshort *v); GLAPI void APIENTRY glVertexAttribs4dvNV (GLuint index, GLsizei count, const GLdouble *v); GLAPI void APIENTRY glVertexAttribs4fvNV (GLuint index, GLsizei count, const GLfloat *v); GLAPI void APIENTRY glVertexAttribs4svNV (GLuint index, GLsizei count, const GLshort *v); GLAPI void APIENTRY glVertexAttribs4ubvNV (GLuint index, GLsizei count, const GLubyte *v); #endif #endif /* GL_NV_vertex_program */ #ifndef GL_NV_vertex_program1_1 #define GL_NV_vertex_program1_1 1 #endif /* GL_NV_vertex_program1_1 */ #ifndef GL_NV_vertex_program2 #define GL_NV_vertex_program2 1 #endif /* GL_NV_vertex_program2 */ #ifndef GL_NV_vertex_program2_option #define GL_NV_vertex_program2_option 1 #endif /* GL_NV_vertex_program2_option */ #ifndef GL_NV_vertex_program3 #define GL_NV_vertex_program3 1 #endif /* GL_NV_vertex_program3 */ #ifndef GL_NV_vertex_program4 #define GL_NV_vertex_program4 1 #define GL_VERTEX_ATTRIB_ARRAY_INTEGER_NV 0x88FD typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IEXTPROC) (GLuint index, GLint x); typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IEXTPROC) (GLuint index, GLint x, GLint y); typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IEXTPROC) (GLuint index, GLint x, GLint y, GLint z); typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IEXTPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIEXTPROC) (GLuint index, GLuint x); typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIEXTPROC) (GLuint index, GLuint x, GLuint y); typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z); typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IVEXTPROC) (GLuint index, const GLint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IVEXTPROC) (GLuint index, const GLint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IVEXTPROC) (GLuint index, const GLint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IVEXTPROC) (GLuint index, const GLint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIVEXTPROC) (GLuint index, const GLuint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIVEXTPROC) (GLuint index, const GLuint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIVEXTPROC) (GLuint index, const GLuint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIVEXTPROC) (GLuint index, const GLuint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVEXTPROC) (GLuint index, const GLbyte *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVEXTPROC) (GLuint index, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVEXTPROC) (GLuint index, const GLubyte *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVEXTPROC) (GLuint index, const GLushort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVEXTPROC) (GLuint index, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVEXTPROC) (GLuint index, GLenum pname, GLuint *params); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glVertexAttribI1iEXT (GLuint index, GLint x); GLAPI void APIENTRY glVertexAttribI2iEXT (GLuint index, GLint x, GLint y); GLAPI void APIENTRY glVertexAttribI3iEXT (GLuint index, GLint x, GLint y, GLint z); GLAPI void APIENTRY glVertexAttribI4iEXT (GLuint index, GLint x, GLint y, GLint z, GLint w); GLAPI void APIENTRY glVertexAttribI1uiEXT (GLuint index, GLuint x); GLAPI void APIENTRY glVertexAttribI2uiEXT (GLuint index, GLuint x, GLuint y); GLAPI void APIENTRY glVertexAttribI3uiEXT (GLuint index, GLuint x, GLuint y, GLuint z); GLAPI void APIENTRY glVertexAttribI4uiEXT (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); GLAPI void APIENTRY glVertexAttribI1ivEXT (GLuint index, const GLint *v); GLAPI void APIENTRY glVertexAttribI2ivEXT (GLuint index, const GLint *v); GLAPI void APIENTRY glVertexAttribI3ivEXT (GLuint index, const GLint *v); GLAPI void APIENTRY glVertexAttribI4ivEXT (GLuint index, const GLint *v); GLAPI void APIENTRY glVertexAttribI1uivEXT (GLuint index, const GLuint *v); GLAPI void APIENTRY glVertexAttribI2uivEXT (GLuint index, const GLuint *v); GLAPI void APIENTRY glVertexAttribI3uivEXT (GLuint index, const GLuint *v); GLAPI void APIENTRY glVertexAttribI4uivEXT (GLuint index, const GLuint *v); GLAPI void APIENTRY glVertexAttribI4bvEXT (GLuint index, const GLbyte *v); GLAPI void APIENTRY glVertexAttribI4svEXT (GLuint index, const GLshort *v); GLAPI void APIENTRY glVertexAttribI4ubvEXT (GLuint index, const GLubyte *v); GLAPI void APIENTRY glVertexAttribI4usvEXT (GLuint index, const GLushort *v); GLAPI void APIENTRY glVertexAttribIPointerEXT (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); GLAPI void APIENTRY glGetVertexAttribIivEXT (GLuint index, GLenum pname, GLint *params); GLAPI void APIENTRY glGetVertexAttribIuivEXT (GLuint index, GLenum pname, GLuint *params); #endif #endif /* GL_NV_vertex_program4 */ #ifndef GL_NV_video_capture #define GL_NV_video_capture 1 #define GL_VIDEO_BUFFER_NV 0x9020 #define GL_VIDEO_BUFFER_BINDING_NV 0x9021 #define GL_FIELD_UPPER_NV 0x9022 #define GL_FIELD_LOWER_NV 0x9023 #define GL_NUM_VIDEO_CAPTURE_STREAMS_NV 0x9024 #define GL_NEXT_VIDEO_CAPTURE_BUFFER_STATUS_NV 0x9025 #define GL_VIDEO_CAPTURE_TO_422_SUPPORTED_NV 0x9026 #define GL_LAST_VIDEO_CAPTURE_STATUS_NV 0x9027 #define GL_VIDEO_BUFFER_PITCH_NV 0x9028 #define GL_VIDEO_COLOR_CONVERSION_MATRIX_NV 0x9029 #define GL_VIDEO_COLOR_CONVERSION_MAX_NV 0x902A #define GL_VIDEO_COLOR_CONVERSION_MIN_NV 0x902B #define GL_VIDEO_COLOR_CONVERSION_OFFSET_NV 0x902C #define GL_VIDEO_BUFFER_INTERNAL_FORMAT_NV 0x902D #define GL_PARTIAL_SUCCESS_NV 0x902E #define GL_SUCCESS_NV 0x902F #define GL_FAILURE_NV 0x9030 #define GL_YCBYCR8_422_NV 0x9031 #define GL_YCBAYCR8A_4224_NV 0x9032 #define GL_Z6Y10Z6CB10Z6Y10Z6CR10_422_NV 0x9033 #define GL_Z6Y10Z6CB10Z6A10Z6Y10Z6CR10Z6A10_4224_NV 0x9034 #define GL_Z4Y12Z4CB12Z4Y12Z4CR12_422_NV 0x9035 #define GL_Z4Y12Z4CB12Z4A12Z4Y12Z4CR12Z4A12_4224_NV 0x9036 #define GL_Z4Y12Z4CB12Z4CR12_444_NV 0x9037 #define GL_VIDEO_CAPTURE_FRAME_WIDTH_NV 0x9038 #define GL_VIDEO_CAPTURE_FRAME_HEIGHT_NV 0x9039 #define GL_VIDEO_CAPTURE_FIELD_UPPER_HEIGHT_NV 0x903A #define GL_VIDEO_CAPTURE_FIELD_LOWER_HEIGHT_NV 0x903B #define GL_VIDEO_CAPTURE_SURFACE_ORIGIN_NV 0x903C typedef void (APIENTRYP PFNGLBEGINVIDEOCAPTURENVPROC) (GLuint video_capture_slot); typedef void (APIENTRYP PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset); typedef void (APIENTRYP PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture); typedef void (APIENTRYP PFNGLENDVIDEOCAPTURENVPROC) (GLuint video_capture_slot); typedef void (APIENTRYP PFNGLGETVIDEOCAPTUREIVNVPROC) (GLuint video_capture_slot, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble *params); typedef GLenum (APIENTRYP PFNGLVIDEOCAPTURENVPROC) (GLuint video_capture_slot, GLuint *sequence_num, GLuint64EXT *capture_time); typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble *params); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBeginVideoCaptureNV (GLuint video_capture_slot); GLAPI void APIENTRY glBindVideoCaptureStreamBufferNV (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset); GLAPI void APIENTRY glBindVideoCaptureStreamTextureNV (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture); GLAPI void APIENTRY glEndVideoCaptureNV (GLuint video_capture_slot); GLAPI void APIENTRY glGetVideoCaptureivNV (GLuint video_capture_slot, GLenum pname, GLint *params); GLAPI void APIENTRY glGetVideoCaptureStreamivNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint *params); GLAPI void APIENTRY glGetVideoCaptureStreamfvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat *params); GLAPI void APIENTRY glGetVideoCaptureStreamdvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble *params); GLAPI GLenum APIENTRY glVideoCaptureNV (GLuint video_capture_slot, GLuint *sequence_num, GLuint64EXT *capture_time); GLAPI void APIENTRY glVideoCaptureStreamParameterivNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint *params); GLAPI void APIENTRY glVideoCaptureStreamParameterfvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat *params); GLAPI void APIENTRY glVideoCaptureStreamParameterdvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble *params); #endif #endif /* GL_NV_video_capture */ #ifndef GL_NV_viewport_array2 #define GL_NV_viewport_array2 1 #endif /* GL_NV_viewport_array2 */ #ifndef GL_OML_interlace #define GL_OML_interlace 1 #define GL_INTERLACE_OML 0x8980 #define GL_INTERLACE_READ_OML 0x8981 #endif /* GL_OML_interlace */ #ifndef GL_OML_resample #define GL_OML_resample 1 #define GL_PACK_RESAMPLE_OML 0x8984 #define GL_UNPACK_RESAMPLE_OML 0x8985 #define GL_RESAMPLE_REPLICATE_OML 0x8986 #define GL_RESAMPLE_ZERO_FILL_OML 0x8987 #define GL_RESAMPLE_AVERAGE_OML 0x8988 #define GL_RESAMPLE_DECIMATE_OML 0x8989 #endif /* GL_OML_resample */ #ifndef GL_OML_subsample #define GL_OML_subsample 1 #define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 #define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 #endif /* GL_OML_subsample */ #ifndef GL_PGI_misc_hints #define GL_PGI_misc_hints 1 #define GL_PREFER_DOUBLEBUFFER_HINT_PGI 0x1A1F8 #define GL_CONSERVE_MEMORY_HINT_PGI 0x1A1FD #define GL_RECLAIM_MEMORY_HINT_PGI 0x1A1FE #define GL_NATIVE_GRAPHICS_HANDLE_PGI 0x1A202 #define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 0x1A203 #define GL_NATIVE_GRAPHICS_END_HINT_PGI 0x1A204 #define GL_ALWAYS_FAST_HINT_PGI 0x1A20C #define GL_ALWAYS_SOFT_HINT_PGI 0x1A20D #define GL_ALLOW_DRAW_OBJ_HINT_PGI 0x1A20E #define GL_ALLOW_DRAW_WIN_HINT_PGI 0x1A20F #define GL_ALLOW_DRAW_FRG_HINT_PGI 0x1A210 #define GL_ALLOW_DRAW_MEM_HINT_PGI 0x1A211 #define GL_STRICT_DEPTHFUNC_HINT_PGI 0x1A216 #define GL_STRICT_LIGHTING_HINT_PGI 0x1A217 #define GL_STRICT_SCISSOR_HINT_PGI 0x1A218 #define GL_FULL_STIPPLE_HINT_PGI 0x1A219 #define GL_CLIP_NEAR_HINT_PGI 0x1A220 #define GL_CLIP_FAR_HINT_PGI 0x1A221 #define GL_WIDE_LINE_HINT_PGI 0x1A222 #define GL_BACK_NORMALS_HINT_PGI 0x1A223 typedef void (APIENTRYP PFNGLHINTPGIPROC) (GLenum target, GLint mode); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glHintPGI (GLenum target, GLint mode); #endif #endif /* GL_PGI_misc_hints */ #ifndef GL_PGI_vertex_hints #define GL_PGI_vertex_hints 1 #define GL_VERTEX_DATA_HINT_PGI 0x1A22A #define GL_VERTEX_CONSISTENT_HINT_PGI 0x1A22B #define GL_MATERIAL_SIDE_HINT_PGI 0x1A22C #define GL_MAX_VERTEX_HINT_PGI 0x1A22D #define GL_COLOR3_BIT_PGI 0x00010000 #define GL_COLOR4_BIT_PGI 0x00020000 #define GL_EDGEFLAG_BIT_PGI 0x00040000 #define GL_INDEX_BIT_PGI 0x00080000 #define GL_MAT_AMBIENT_BIT_PGI 0x00100000 #define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 #define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 #define GL_MAT_EMISSION_BIT_PGI 0x00800000 #define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 #define GL_MAT_SHININESS_BIT_PGI 0x02000000 #define GL_MAT_SPECULAR_BIT_PGI 0x04000000 #define GL_NORMAL_BIT_PGI 0x08000000 #define GL_TEXCOORD1_BIT_PGI 0x10000000 #define GL_TEXCOORD2_BIT_PGI 0x20000000 #define GL_TEXCOORD3_BIT_PGI 0x40000000 #define GL_TEXCOORD4_BIT_PGI 0x80000000 #define GL_VERTEX23_BIT_PGI 0x00000004 #define GL_VERTEX4_BIT_PGI 0x00000008 #endif /* GL_PGI_vertex_hints */ #ifndef GL_REND_screen_coordinates #define GL_REND_screen_coordinates 1 #define GL_SCREEN_COORDINATES_REND 0x8490 #define GL_INVERTED_SCREEN_W_REND 0x8491 #endif /* GL_REND_screen_coordinates */ #ifndef GL_S3_s3tc #define GL_S3_s3tc 1 #define GL_RGB_S3TC 0x83A0 #define GL_RGB4_S3TC 0x83A1 #define GL_RGBA_S3TC 0x83A2 #define GL_RGBA4_S3TC 0x83A3 #define GL_RGBA_DXT5_S3TC 0x83A4 #define GL_RGBA4_DXT5_S3TC 0x83A5 #endif /* GL_S3_s3tc */ #ifndef GL_SGIS_detail_texture #define GL_SGIS_detail_texture 1 #define GL_DETAIL_TEXTURE_2D_SGIS 0x8095 #define GL_DETAIL_TEXTURE_2D_BINDING_SGIS 0x8096 #define GL_LINEAR_DETAIL_SGIS 0x8097 #define GL_LINEAR_DETAIL_ALPHA_SGIS 0x8098 #define GL_LINEAR_DETAIL_COLOR_SGIS 0x8099 #define GL_DETAIL_TEXTURE_LEVEL_SGIS 0x809A #define GL_DETAIL_TEXTURE_MODE_SGIS 0x809B #define GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS 0x809C typedef void (APIENTRYP PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); typedef void (APIENTRYP PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat *points); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glDetailTexFuncSGIS (GLenum target, GLsizei n, const GLfloat *points); GLAPI void APIENTRY glGetDetailTexFuncSGIS (GLenum target, GLfloat *points); #endif #endif /* GL_SGIS_detail_texture */ #ifndef GL_SGIS_fog_function #define GL_SGIS_fog_function 1 #define GL_FOG_FUNC_SGIS 0x812A #define GL_FOG_FUNC_POINTS_SGIS 0x812B #define GL_MAX_FOG_FUNC_POINTS_SGIS 0x812C typedef void (APIENTRYP PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat *points); typedef void (APIENTRYP PFNGLGETFOGFUNCSGISPROC) (GLfloat *points); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glFogFuncSGIS (GLsizei n, const GLfloat *points); GLAPI void APIENTRY glGetFogFuncSGIS (GLfloat *points); #endif #endif /* GL_SGIS_fog_function */ #ifndef GL_SGIS_generate_mipmap #define GL_SGIS_generate_mipmap 1 #define GL_GENERATE_MIPMAP_SGIS 0x8191 #define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 #endif /* GL_SGIS_generate_mipmap */ #ifndef GL_SGIS_multisample #define GL_SGIS_multisample 1 #define GL_MULTISAMPLE_SGIS 0x809D #define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E #define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F #define GL_SAMPLE_MASK_SGIS 0x80A0 #define GL_1PASS_SGIS 0x80A1 #define GL_2PASS_0_SGIS 0x80A2 #define GL_2PASS_1_SGIS 0x80A3 #define GL_4PASS_0_SGIS 0x80A4 #define GL_4PASS_1_SGIS 0x80A5 #define GL_4PASS_2_SGIS 0x80A6 #define GL_4PASS_3_SGIS 0x80A7 #define GL_SAMPLE_BUFFERS_SGIS 0x80A8 #define GL_SAMPLES_SGIS 0x80A9 #define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA #define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB #define GL_SAMPLE_PATTERN_SGIS 0x80AC typedef void (APIENTRYP PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); typedef void (APIENTRYP PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glSampleMaskSGIS (GLclampf value, GLboolean invert); GLAPI void APIENTRY glSamplePatternSGIS (GLenum pattern); #endif #endif /* GL_SGIS_multisample */ #ifndef GL_SGIS_pixel_texture #define GL_SGIS_pixel_texture 1 #define GL_PIXEL_TEXTURE_SGIS 0x8353 #define GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS 0x8354 #define GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS 0x8355 #define GL_PIXEL_GROUP_COLOR_SGIS 0x8356 typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERISGISPROC) (GLenum pname, GLint param); typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFSGISPROC) (GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, GLfloat *params); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glPixelTexGenParameteriSGIS (GLenum pname, GLint param); GLAPI void APIENTRY glPixelTexGenParameterivSGIS (GLenum pname, const GLint *params); GLAPI void APIENTRY glPixelTexGenParameterfSGIS (GLenum pname, GLfloat param); GLAPI void APIENTRY glPixelTexGenParameterfvSGIS (GLenum pname, const GLfloat *params); GLAPI void APIENTRY glGetPixelTexGenParameterivSGIS (GLenum pname, GLint *params); GLAPI void APIENTRY glGetPixelTexGenParameterfvSGIS (GLenum pname, GLfloat *params); #endif #endif /* GL_SGIS_pixel_texture */ #ifndef GL_SGIS_point_line_texgen #define GL_SGIS_point_line_texgen 1 #define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 #define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 #define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 #define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 #define GL_EYE_POINT_SGIS 0x81F4 #define GL_OBJECT_POINT_SGIS 0x81F5 #define GL_EYE_LINE_SGIS 0x81F6 #define GL_OBJECT_LINE_SGIS 0x81F7 #endif /* GL_SGIS_point_line_texgen */ #ifndef GL_SGIS_point_parameters #define GL_SGIS_point_parameters 1 #define GL_POINT_SIZE_MIN_SGIS 0x8126 #define GL_POINT_SIZE_MAX_SGIS 0x8127 #define GL_POINT_FADE_THRESHOLD_SIZE_SGIS 0x8128 #define GL_DISTANCE_ATTENUATION_SGIS 0x8129 typedef void (APIENTRYP PFNGLPOINTPARAMETERFSGISPROC) (GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLPOINTPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glPointParameterfSGIS (GLenum pname, GLfloat param); GLAPI void APIENTRY glPointParameterfvSGIS (GLenum pname, const GLfloat *params); #endif #endif /* GL_SGIS_point_parameters */ #ifndef GL_SGIS_sharpen_texture #define GL_SGIS_sharpen_texture 1 #define GL_LINEAR_SHARPEN_SGIS 0x80AD #define GL_LINEAR_SHARPEN_ALPHA_SGIS 0x80AE #define GL_LINEAR_SHARPEN_COLOR_SGIS 0x80AF #define GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS 0x80B0 typedef void (APIENTRYP PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); typedef void (APIENTRYP PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat *points); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glSharpenTexFuncSGIS (GLenum target, GLsizei n, const GLfloat *points); GLAPI void APIENTRY glGetSharpenTexFuncSGIS (GLenum target, GLfloat *points); #endif #endif /* GL_SGIS_sharpen_texture */ #ifndef GL_SGIS_texture4D #define GL_SGIS_texture4D 1 #define GL_PACK_SKIP_VOLUMES_SGIS 0x8130 #define GL_PACK_IMAGE_DEPTH_SGIS 0x8131 #define GL_UNPACK_SKIP_VOLUMES_SGIS 0x8132 #define GL_UNPACK_IMAGE_DEPTH_SGIS 0x8133 #define GL_TEXTURE_4D_SGIS 0x8134 #define GL_PROXY_TEXTURE_4D_SGIS 0x8135 #define GL_TEXTURE_4DSIZE_SGIS 0x8136 #define GL_TEXTURE_WRAP_Q_SGIS 0x8137 #define GL_MAX_4D_TEXTURE_SIZE_SGIS 0x8138 #define GL_TEXTURE_4D_BINDING_SGIS 0x814F typedef void (APIENTRYP PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const void *pixels); typedef void (APIENTRYP PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const void *pixels); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glTexImage4DSGIS (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const void *pixels); GLAPI void APIENTRY glTexSubImage4DSGIS (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const void *pixels); #endif #endif /* GL_SGIS_texture4D */ #ifndef GL_SGIS_texture_border_clamp #define GL_SGIS_texture_border_clamp 1 #define GL_CLAMP_TO_BORDER_SGIS 0x812D #endif /* GL_SGIS_texture_border_clamp */ #ifndef GL_SGIS_texture_color_mask #define GL_SGIS_texture_color_mask 1 #define GL_TEXTURE_COLOR_WRITEMASK_SGIS 0x81EF typedef void (APIENTRYP PFNGLTEXTURECOLORMASKSGISPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glTextureColorMaskSGIS (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); #endif #endif /* GL_SGIS_texture_color_mask */ #ifndef GL_SGIS_texture_edge_clamp #define GL_SGIS_texture_edge_clamp 1 #define GL_CLAMP_TO_EDGE_SGIS 0x812F #endif /* GL_SGIS_texture_edge_clamp */ #ifndef GL_SGIS_texture_filter4 #define GL_SGIS_texture_filter4 1 #define GL_FILTER4_SGIS 0x8146 #define GL_TEXTURE_FILTER4_SIZE_SGIS 0x8147 typedef void (APIENTRYP PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat *weights); typedef void (APIENTRYP PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glGetTexFilterFuncSGIS (GLenum target, GLenum filter, GLfloat *weights); GLAPI void APIENTRY glTexFilterFuncSGIS (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); #endif #endif /* GL_SGIS_texture_filter4 */ #ifndef GL_SGIS_texture_lod #define GL_SGIS_texture_lod 1 #define GL_TEXTURE_MIN_LOD_SGIS 0x813A #define GL_TEXTURE_MAX_LOD_SGIS 0x813B #define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C #define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D #endif /* GL_SGIS_texture_lod */ #ifndef GL_SGIS_texture_select #define GL_SGIS_texture_select 1 #define GL_DUAL_ALPHA4_SGIS 0x8110 #define GL_DUAL_ALPHA8_SGIS 0x8111 #define GL_DUAL_ALPHA12_SGIS 0x8112 #define GL_DUAL_ALPHA16_SGIS 0x8113 #define GL_DUAL_LUMINANCE4_SGIS 0x8114 #define GL_DUAL_LUMINANCE8_SGIS 0x8115 #define GL_DUAL_LUMINANCE12_SGIS 0x8116 #define GL_DUAL_LUMINANCE16_SGIS 0x8117 #define GL_DUAL_INTENSITY4_SGIS 0x8118 #define GL_DUAL_INTENSITY8_SGIS 0x8119 #define GL_DUAL_INTENSITY12_SGIS 0x811A #define GL_DUAL_INTENSITY16_SGIS 0x811B #define GL_DUAL_LUMINANCE_ALPHA4_SGIS 0x811C #define GL_DUAL_LUMINANCE_ALPHA8_SGIS 0x811D #define GL_QUAD_ALPHA4_SGIS 0x811E #define GL_QUAD_ALPHA8_SGIS 0x811F #define GL_QUAD_LUMINANCE4_SGIS 0x8120 #define GL_QUAD_LUMINANCE8_SGIS 0x8121 #define GL_QUAD_INTENSITY4_SGIS 0x8122 #define GL_QUAD_INTENSITY8_SGIS 0x8123 #define GL_DUAL_TEXTURE_SELECT_SGIS 0x8124 #define GL_QUAD_TEXTURE_SELECT_SGIS 0x8125 #endif /* GL_SGIS_texture_select */ #ifndef GL_SGIX_async #define GL_SGIX_async 1 #define GL_ASYNC_MARKER_SGIX 0x8329 typedef void (APIENTRYP PFNGLASYNCMARKERSGIXPROC) (GLuint marker); typedef GLint (APIENTRYP PFNGLFINISHASYNCSGIXPROC) (GLuint *markerp); typedef GLint (APIENTRYP PFNGLPOLLASYNCSGIXPROC) (GLuint *markerp); typedef GLuint (APIENTRYP PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); typedef void (APIENTRYP PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); typedef GLboolean (APIENTRYP PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glAsyncMarkerSGIX (GLuint marker); GLAPI GLint APIENTRY glFinishAsyncSGIX (GLuint *markerp); GLAPI GLint APIENTRY glPollAsyncSGIX (GLuint *markerp); GLAPI GLuint APIENTRY glGenAsyncMarkersSGIX (GLsizei range); GLAPI void APIENTRY glDeleteAsyncMarkersSGIX (GLuint marker, GLsizei range); GLAPI GLboolean APIENTRY glIsAsyncMarkerSGIX (GLuint marker); #endif #endif /* GL_SGIX_async */ #ifndef GL_SGIX_async_histogram #define GL_SGIX_async_histogram 1 #define GL_ASYNC_HISTOGRAM_SGIX 0x832C #define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D #endif /* GL_SGIX_async_histogram */ #ifndef GL_SGIX_async_pixel #define GL_SGIX_async_pixel 1 #define GL_ASYNC_TEX_IMAGE_SGIX 0x835C #define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D #define GL_ASYNC_READ_PIXELS_SGIX 0x835E #define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F #define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 #define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 #endif /* GL_SGIX_async_pixel */ #ifndef GL_SGIX_blend_alpha_minmax #define GL_SGIX_blend_alpha_minmax 1 #define GL_ALPHA_MIN_SGIX 0x8320 #define GL_ALPHA_MAX_SGIX 0x8321 #endif /* GL_SGIX_blend_alpha_minmax */ #ifndef GL_SGIX_calligraphic_fragment #define GL_SGIX_calligraphic_fragment 1 #define GL_CALLIGRAPHIC_FRAGMENT_SGIX 0x8183 #endif /* GL_SGIX_calligraphic_fragment */ #ifndef GL_SGIX_clipmap #define GL_SGIX_clipmap 1 #define GL_LINEAR_CLIPMAP_LINEAR_SGIX 0x8170 #define GL_TEXTURE_CLIPMAP_CENTER_SGIX 0x8171 #define GL_TEXTURE_CLIPMAP_FRAME_SGIX 0x8172 #define GL_TEXTURE_CLIPMAP_OFFSET_SGIX 0x8173 #define GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8174 #define GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX 0x8175 #define GL_TEXTURE_CLIPMAP_DEPTH_SGIX 0x8176 #define GL_MAX_CLIPMAP_DEPTH_SGIX 0x8177 #define GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8178 #define GL_NEAREST_CLIPMAP_NEAREST_SGIX 0x844D #define GL_NEAREST_CLIPMAP_LINEAR_SGIX 0x844E #define GL_LINEAR_CLIPMAP_NEAREST_SGIX 0x844F #endif /* GL_SGIX_clipmap */ #ifndef GL_SGIX_convolution_accuracy #define GL_SGIX_convolution_accuracy 1 #define GL_CONVOLUTION_HINT_SGIX 0x8316 #endif /* GL_SGIX_convolution_accuracy */ #ifndef GL_SGIX_depth_pass_instrument #define GL_SGIX_depth_pass_instrument 1 #endif /* GL_SGIX_depth_pass_instrument */ #ifndef GL_SGIX_depth_texture #define GL_SGIX_depth_texture 1 #define GL_DEPTH_COMPONENT16_SGIX 0x81A5 #define GL_DEPTH_COMPONENT24_SGIX 0x81A6 #define GL_DEPTH_COMPONENT32_SGIX 0x81A7 #endif /* GL_SGIX_depth_texture */ #ifndef GL_SGIX_flush_raster #define GL_SGIX_flush_raster 1 typedef void (APIENTRYP PFNGLFLUSHRASTERSGIXPROC) (void); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glFlushRasterSGIX (void); #endif #endif /* GL_SGIX_flush_raster */ #ifndef GL_SGIX_fog_offset #define GL_SGIX_fog_offset 1 #define GL_FOG_OFFSET_SGIX 0x8198 #define GL_FOG_OFFSET_VALUE_SGIX 0x8199 #endif /* GL_SGIX_fog_offset */ #ifndef GL_SGIX_fragment_lighting #define GL_SGIX_fragment_lighting 1 #define GL_FRAGMENT_LIGHTING_SGIX 0x8400 #define GL_FRAGMENT_COLOR_MATERIAL_SGIX 0x8401 #define GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX 0x8402 #define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX 0x8403 #define GL_MAX_FRAGMENT_LIGHTS_SGIX 0x8404 #define GL_MAX_ACTIVE_LIGHTS_SGIX 0x8405 #define GL_CURRENT_RASTER_NORMAL_SGIX 0x8406 #define GL_LIGHT_ENV_MODE_SGIX 0x8407 #define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX 0x8408 #define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX 0x8409 #define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX 0x840A #define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX 0x840B #define GL_FRAGMENT_LIGHT0_SGIX 0x840C #define GL_FRAGMENT_LIGHT1_SGIX 0x840D #define GL_FRAGMENT_LIGHT2_SGIX 0x840E #define GL_FRAGMENT_LIGHT3_SGIX 0x840F #define GL_FRAGMENT_LIGHT4_SGIX 0x8410 #define GL_FRAGMENT_LIGHT5_SGIX 0x8411 #define GL_FRAGMENT_LIGHT6_SGIX 0x8412 #define GL_FRAGMENT_LIGHT7_SGIX 0x8413 typedef void (APIENTRYP PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); typedef void (APIENTRYP PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, GLint param); typedef void (APIENTRYP PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLLIGHTENVISGIXPROC) (GLenum pname, GLint param); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glFragmentColorMaterialSGIX (GLenum face, GLenum mode); GLAPI void APIENTRY glFragmentLightfSGIX (GLenum light, GLenum pname, GLfloat param); GLAPI void APIENTRY glFragmentLightfvSGIX (GLenum light, GLenum pname, const GLfloat *params); GLAPI void APIENTRY glFragmentLightiSGIX (GLenum light, GLenum pname, GLint param); GLAPI void APIENTRY glFragmentLightivSGIX (GLenum light, GLenum pname, const GLint *params); GLAPI void APIENTRY glFragmentLightModelfSGIX (GLenum pname, GLfloat param); GLAPI void APIENTRY glFragmentLightModelfvSGIX (GLenum pname, const GLfloat *params); GLAPI void APIENTRY glFragmentLightModeliSGIX (GLenum pname, GLint param); GLAPI void APIENTRY glFragmentLightModelivSGIX (GLenum pname, const GLint *params); GLAPI void APIENTRY glFragmentMaterialfSGIX (GLenum face, GLenum pname, GLfloat param); GLAPI void APIENTRY glFragmentMaterialfvSGIX (GLenum face, GLenum pname, const GLfloat *params); GLAPI void APIENTRY glFragmentMaterialiSGIX (GLenum face, GLenum pname, GLint param); GLAPI void APIENTRY glFragmentMaterialivSGIX (GLenum face, GLenum pname, const GLint *params); GLAPI void APIENTRY glGetFragmentLightfvSGIX (GLenum light, GLenum pname, GLfloat *params); GLAPI void APIENTRY glGetFragmentLightivSGIX (GLenum light, GLenum pname, GLint *params); GLAPI void APIENTRY glGetFragmentMaterialfvSGIX (GLenum face, GLenum pname, GLfloat *params); GLAPI void APIENTRY glGetFragmentMaterialivSGIX (GLenum face, GLenum pname, GLint *params); GLAPI void APIENTRY glLightEnviSGIX (GLenum pname, GLint param); #endif #endif /* GL_SGIX_fragment_lighting */ #ifndef GL_SGIX_framezoom #define GL_SGIX_framezoom 1 #define GL_FRAMEZOOM_SGIX 0x818B #define GL_FRAMEZOOM_FACTOR_SGIX 0x818C #define GL_MAX_FRAMEZOOM_FACTOR_SGIX 0x818D typedef void (APIENTRYP PFNGLFRAMEZOOMSGIXPROC) (GLint factor); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glFrameZoomSGIX (GLint factor); #endif #endif /* GL_SGIX_framezoom */ #ifndef GL_SGIX_igloo_interface #define GL_SGIX_igloo_interface 1 typedef void (APIENTRYP PFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, const void *params); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glIglooInterfaceSGIX (GLenum pname, const void *params); #endif #endif /* GL_SGIX_igloo_interface */ #ifndef GL_SGIX_instruments #define GL_SGIX_instruments 1 #define GL_INSTRUMENT_BUFFER_POINTER_SGIX 0x8180 #define GL_INSTRUMENT_MEASUREMENTS_SGIX 0x8181 typedef GLint (APIENTRYP PFNGLGETINSTRUMENTSSGIXPROC) (void); typedef void (APIENTRYP PFNGLINSTRUMENTSBUFFERSGIXPROC) (GLsizei size, GLint *buffer); typedef GLint (APIENTRYP PFNGLPOLLINSTRUMENTSSGIXPROC) (GLint *marker_p); typedef void (APIENTRYP PFNGLREADINSTRUMENTSSGIXPROC) (GLint marker); typedef void (APIENTRYP PFNGLSTARTINSTRUMENTSSGIXPROC) (void); typedef void (APIENTRYP PFNGLSTOPINSTRUMENTSSGIXPROC) (GLint marker); #ifdef GL_GLEXT_PROTOTYPES GLAPI GLint APIENTRY glGetInstrumentsSGIX (void); GLAPI void APIENTRY glInstrumentsBufferSGIX (GLsizei size, GLint *buffer); GLAPI GLint APIENTRY glPollInstrumentsSGIX (GLint *marker_p); GLAPI void APIENTRY glReadInstrumentsSGIX (GLint marker); GLAPI void APIENTRY glStartInstrumentsSGIX (void); GLAPI void APIENTRY glStopInstrumentsSGIX (GLint marker); #endif #endif /* GL_SGIX_instruments */ #ifndef GL_SGIX_interlace #define GL_SGIX_interlace 1 #define GL_INTERLACE_SGIX 0x8094 #endif /* GL_SGIX_interlace */ #ifndef GL_SGIX_ir_instrument1 #define GL_SGIX_ir_instrument1 1 #define GL_IR_INSTRUMENT1_SGIX 0x817F #endif /* GL_SGIX_ir_instrument1 */ #ifndef GL_SGIX_list_priority #define GL_SGIX_list_priority 1 #define GL_LIST_PRIORITY_SGIX 0x8182 typedef void (APIENTRYP PFNGLGETLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLLISTPARAMETERFSGIXPROC) (GLuint list, GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLLISTPARAMETERISGIXPROC) (GLuint list, GLenum pname, GLint param); typedef void (APIENTRYP PFNGLLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, const GLint *params); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glGetListParameterfvSGIX (GLuint list, GLenum pname, GLfloat *params); GLAPI void APIENTRY glGetListParameterivSGIX (GLuint list, GLenum pname, GLint *params); GLAPI void APIENTRY glListParameterfSGIX (GLuint list, GLenum pname, GLfloat param); GLAPI void APIENTRY glListParameterfvSGIX (GLuint list, GLenum pname, const GLfloat *params); GLAPI void APIENTRY glListParameteriSGIX (GLuint list, GLenum pname, GLint param); GLAPI void APIENTRY glListParameterivSGIX (GLuint list, GLenum pname, const GLint *params); #endif #endif /* GL_SGIX_list_priority */ #ifndef GL_SGIX_pixel_texture #define GL_SGIX_pixel_texture 1 #define GL_PIXEL_TEX_GEN_SGIX 0x8139 #define GL_PIXEL_TEX_GEN_MODE_SGIX 0x832B typedef void (APIENTRYP PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glPixelTexGenSGIX (GLenum mode); #endif #endif /* GL_SGIX_pixel_texture */ #ifndef GL_SGIX_pixel_tiles #define GL_SGIX_pixel_tiles 1 #define GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX 0x813E #define GL_PIXEL_TILE_CACHE_INCREMENT_SGIX 0x813F #define GL_PIXEL_TILE_WIDTH_SGIX 0x8140 #define GL_PIXEL_TILE_HEIGHT_SGIX 0x8141 #define GL_PIXEL_TILE_GRID_WIDTH_SGIX 0x8142 #define GL_PIXEL_TILE_GRID_HEIGHT_SGIX 0x8143 #define GL_PIXEL_TILE_GRID_DEPTH_SGIX 0x8144 #define GL_PIXEL_TILE_CACHE_SIZE_SGIX 0x8145 #endif /* GL_SGIX_pixel_tiles */ #ifndef GL_SGIX_polynomial_ffd #define GL_SGIX_polynomial_ffd 1 #define GL_TEXTURE_DEFORMATION_BIT_SGIX 0x00000001 #define GL_GEOMETRY_DEFORMATION_BIT_SGIX 0x00000002 #define GL_GEOMETRY_DEFORMATION_SGIX 0x8194 #define GL_TEXTURE_DEFORMATION_SGIX 0x8195 #define GL_DEFORMATIONS_MASK_SGIX 0x8196 #define GL_MAX_DEFORMATION_ORDER_SGIX 0x8197 typedef void (APIENTRYP PFNGLDEFORMATIONMAP3DSGIXPROC) (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); typedef void (APIENTRYP PFNGLDEFORMATIONMAP3FSGIXPROC) (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); typedef void (APIENTRYP PFNGLDEFORMSGIXPROC) (GLbitfield mask); typedef void (APIENTRYP PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) (GLbitfield mask); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glDeformationMap3dSGIX (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); GLAPI void APIENTRY glDeformationMap3fSGIX (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); GLAPI void APIENTRY glDeformSGIX (GLbitfield mask); GLAPI void APIENTRY glLoadIdentityDeformationMapSGIX (GLbitfield mask); #endif #endif /* GL_SGIX_polynomial_ffd */ #ifndef GL_SGIX_reference_plane #define GL_SGIX_reference_plane 1 #define GL_REFERENCE_PLANE_SGIX 0x817D #define GL_REFERENCE_PLANE_EQUATION_SGIX 0x817E typedef void (APIENTRYP PFNGLREFERENCEPLANESGIXPROC) (const GLdouble *equation); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glReferencePlaneSGIX (const GLdouble *equation); #endif #endif /* GL_SGIX_reference_plane */ #ifndef GL_SGIX_resample #define GL_SGIX_resample 1 #define GL_PACK_RESAMPLE_SGIX 0x842C #define GL_UNPACK_RESAMPLE_SGIX 0x842D #define GL_RESAMPLE_REPLICATE_SGIX 0x842E #define GL_RESAMPLE_ZERO_FILL_SGIX 0x842F #define GL_RESAMPLE_DECIMATE_SGIX 0x8430 #endif /* GL_SGIX_resample */ #ifndef GL_SGIX_scalebias_hint #define GL_SGIX_scalebias_hint 1 #define GL_SCALEBIAS_HINT_SGIX 0x8322 #endif /* GL_SGIX_scalebias_hint */ #ifndef GL_SGIX_shadow #define GL_SGIX_shadow 1 #define GL_TEXTURE_COMPARE_SGIX 0x819A #define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B #define GL_TEXTURE_LEQUAL_R_SGIX 0x819C #define GL_TEXTURE_GEQUAL_R_SGIX 0x819D #endif /* GL_SGIX_shadow */ #ifndef GL_SGIX_shadow_ambient #define GL_SGIX_shadow_ambient 1 #define GL_SHADOW_AMBIENT_SGIX 0x80BF #endif /* GL_SGIX_shadow_ambient */ #ifndef GL_SGIX_sprite #define GL_SGIX_sprite 1 #define GL_SPRITE_SGIX 0x8148 #define GL_SPRITE_MODE_SGIX 0x8149 #define GL_SPRITE_AXIS_SGIX 0x814A #define GL_SPRITE_TRANSLATION_SGIX 0x814B #define GL_SPRITE_AXIAL_SGIX 0x814C #define GL_SPRITE_OBJECT_ALIGNED_SGIX 0x814D #define GL_SPRITE_EYE_ALIGNED_SGIX 0x814E typedef void (APIENTRYP PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); typedef void (APIENTRYP PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, const GLint *params); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glSpriteParameterfSGIX (GLenum pname, GLfloat param); GLAPI void APIENTRY glSpriteParameterfvSGIX (GLenum pname, const GLfloat *params); GLAPI void APIENTRY glSpriteParameteriSGIX (GLenum pname, GLint param); GLAPI void APIENTRY glSpriteParameterivSGIX (GLenum pname, const GLint *params); #endif #endif /* GL_SGIX_sprite */ #ifndef GL_SGIX_subsample #define GL_SGIX_subsample 1 #define GL_PACK_SUBSAMPLE_RATE_SGIX 0x85A0 #define GL_UNPACK_SUBSAMPLE_RATE_SGIX 0x85A1 #define GL_PIXEL_SUBSAMPLE_4444_SGIX 0x85A2 #define GL_PIXEL_SUBSAMPLE_2424_SGIX 0x85A3 #define GL_PIXEL_SUBSAMPLE_4242_SGIX 0x85A4 #endif /* GL_SGIX_subsample */ #ifndef GL_SGIX_tag_sample_buffer #define GL_SGIX_tag_sample_buffer 1 typedef void (APIENTRYP PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glTagSampleBufferSGIX (void); #endif #endif /* GL_SGIX_tag_sample_buffer */ #ifndef GL_SGIX_texture_add_env #define GL_SGIX_texture_add_env 1 #define GL_TEXTURE_ENV_BIAS_SGIX 0x80BE #endif /* GL_SGIX_texture_add_env */ #ifndef GL_SGIX_texture_coordinate_clamp #define GL_SGIX_texture_coordinate_clamp 1 #define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 #define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A #define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B #endif /* GL_SGIX_texture_coordinate_clamp */ #ifndef GL_SGIX_texture_lod_bias #define GL_SGIX_texture_lod_bias 1 #define GL_TEXTURE_LOD_BIAS_S_SGIX 0x818E #define GL_TEXTURE_LOD_BIAS_T_SGIX 0x818F #define GL_TEXTURE_LOD_BIAS_R_SGIX 0x8190 #endif /* GL_SGIX_texture_lod_bias */ #ifndef GL_SGIX_texture_multi_buffer #define GL_SGIX_texture_multi_buffer 1 #define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E #endif /* GL_SGIX_texture_multi_buffer */ #ifndef GL_SGIX_texture_scale_bias #define GL_SGIX_texture_scale_bias 1 #define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 #define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A #define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B #define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C #endif /* GL_SGIX_texture_scale_bias */ #ifndef GL_SGIX_vertex_preclip #define GL_SGIX_vertex_preclip 1 #define GL_VERTEX_PRECLIP_SGIX 0x83EE #define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF #endif /* GL_SGIX_vertex_preclip */ #ifndef GL_SGIX_ycrcb #define GL_SGIX_ycrcb 1 #define GL_YCRCB_422_SGIX 0x81BB #define GL_YCRCB_444_SGIX 0x81BC #endif /* GL_SGIX_ycrcb */ #ifndef GL_SGIX_ycrcb_subsample #define GL_SGIX_ycrcb_subsample 1 #endif /* GL_SGIX_ycrcb_subsample */ #ifndef GL_SGIX_ycrcba #define GL_SGIX_ycrcba 1 #define GL_YCRCB_SGIX 0x8318 #define GL_YCRCBA_SGIX 0x8319 #endif /* GL_SGIX_ycrcba */ #ifndef GL_SGI_color_matrix #define GL_SGI_color_matrix 1 #define GL_COLOR_MATRIX_SGI 0x80B1 #define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 #define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 #define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 #define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 #define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 #define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 #define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 #define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 #define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA #define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB #endif /* GL_SGI_color_matrix */ #ifndef GL_SGI_color_table #define GL_SGI_color_table 1 #define GL_COLOR_TABLE_SGI 0x80D0 #define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 #define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 #define GL_PROXY_COLOR_TABLE_SGI 0x80D3 #define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 #define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 #define GL_COLOR_TABLE_SCALE_SGI 0x80D6 #define GL_COLOR_TABLE_BIAS_SGI 0x80D7 #define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 #define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 #define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA #define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB #define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC #define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD #define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE #define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF typedef void (APIENTRYP PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); typedef void (APIENTRYP PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, void *table); typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint *params); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glColorTableSGI (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); GLAPI void APIENTRY glColorTableParameterfvSGI (GLenum target, GLenum pname, const GLfloat *params); GLAPI void APIENTRY glColorTableParameterivSGI (GLenum target, GLenum pname, const GLint *params); GLAPI void APIENTRY glCopyColorTableSGI (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); GLAPI void APIENTRY glGetColorTableSGI (GLenum target, GLenum format, GLenum type, void *table); GLAPI void APIENTRY glGetColorTableParameterfvSGI (GLenum target, GLenum pname, GLfloat *params); GLAPI void APIENTRY glGetColorTableParameterivSGI (GLenum target, GLenum pname, GLint *params); #endif #endif /* GL_SGI_color_table */ #ifndef GL_SGI_texture_color_table #define GL_SGI_texture_color_table 1 #define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC #define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD #endif /* GL_SGI_texture_color_table */ #ifndef GL_SUNX_constant_data #define GL_SUNX_constant_data 1 #define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 #define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 typedef void (APIENTRYP PFNGLFINISHTEXTURESUNXPROC) (void); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glFinishTextureSUNX (void); #endif #endif /* GL_SUNX_constant_data */ #ifndef GL_SUN_convolution_border_modes #define GL_SUN_convolution_border_modes 1 #define GL_WRAP_BORDER_SUN 0x81D4 #endif /* GL_SUN_convolution_border_modes */ #ifndef GL_SUN_global_alpha #define GL_SUN_global_alpha 1 #define GL_GLOBAL_ALPHA_SUN 0x81D9 #define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glGlobalAlphaFactorbSUN (GLbyte factor); GLAPI void APIENTRY glGlobalAlphaFactorsSUN (GLshort factor); GLAPI void APIENTRY glGlobalAlphaFactoriSUN (GLint factor); GLAPI void APIENTRY glGlobalAlphaFactorfSUN (GLfloat factor); GLAPI void APIENTRY glGlobalAlphaFactordSUN (GLdouble factor); GLAPI void APIENTRY glGlobalAlphaFactorubSUN (GLubyte factor); GLAPI void APIENTRY glGlobalAlphaFactorusSUN (GLushort factor); GLAPI void APIENTRY glGlobalAlphaFactoruiSUN (GLuint factor); #endif #endif /* GL_SUN_global_alpha */ #ifndef GL_SUN_mesh_array #define GL_SUN_mesh_array 1 #define GL_QUAD_MESH_SUN 0x8614 #define GL_TRIANGLE_MESH_SUN 0x8615 typedef void (APIENTRYP PFNGLDRAWMESHARRAYSSUNPROC) (GLenum mode, GLint first, GLsizei count, GLsizei width); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glDrawMeshArraysSUN (GLenum mode, GLint first, GLsizei count, GLsizei width); #endif #endif /* GL_SUN_mesh_array */ #ifndef GL_SUN_slice_accum #define GL_SUN_slice_accum 1 #define GL_SLICE_ACCUM_SUN 0x85CC #endif /* GL_SUN_slice_accum */ #ifndef GL_SUN_triangle_list #define GL_SUN_triangle_list 1 #define GL_RESTART_SUN 0x0001 #define GL_REPLACE_MIDDLE_SUN 0x0002 #define GL_REPLACE_OLDEST_SUN 0x0003 #define GL_TRIANGLE_LIST_SUN 0x81D7 #define GL_REPLACEMENT_CODE_SUN 0x81D8 #define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 #define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 #define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 #define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 #define GL_R1UI_V3F_SUN 0x85C4 #define GL_R1UI_C4UB_V3F_SUN 0x85C5 #define GL_R1UI_C3F_V3F_SUN 0x85C6 #define GL_R1UI_N3F_V3F_SUN 0x85C7 #define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 #define GL_R1UI_T2F_V3F_SUN 0x85C9 #define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA #define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB typedef void (APIENTRYP PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint *code); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort *code); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte *code); typedef void (APIENTRYP PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const void **pointer); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glReplacementCodeuiSUN (GLuint code); GLAPI void APIENTRY glReplacementCodeusSUN (GLushort code); GLAPI void APIENTRY glReplacementCodeubSUN (GLubyte code); GLAPI void APIENTRY glReplacementCodeuivSUN (const GLuint *code); GLAPI void APIENTRY glReplacementCodeusvSUN (const GLushort *code); GLAPI void APIENTRY glReplacementCodeubvSUN (const GLubyte *code); GLAPI void APIENTRY glReplacementCodePointerSUN (GLenum type, GLsizei stride, const void **pointer); #endif #endif /* GL_SUN_triangle_list */ #ifndef GL_SUN_vertex #define GL_SUN_vertex 1 typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte *c, const GLfloat *v); typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte *c, const GLfloat *v); typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *v); typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *n, const GLfloat *v); typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *n, const GLfloat *v); typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *v); typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *v); typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat *tc, const GLubyte *c, const GLfloat *v); typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *v); typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *n, const GLfloat *v); typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *v); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint *rc, const GLubyte *c, const GLfloat *v); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *v); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *n, const GLfloat *v); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *v); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glColor4ubVertex2fSUN (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); GLAPI void APIENTRY glColor4ubVertex2fvSUN (const GLubyte *c, const GLfloat *v); GLAPI void APIENTRY glColor4ubVertex3fSUN (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); GLAPI void APIENTRY glColor4ubVertex3fvSUN (const GLubyte *c, const GLfloat *v); GLAPI void APIENTRY glColor3fVertex3fSUN (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); GLAPI void APIENTRY glColor3fVertex3fvSUN (const GLfloat *c, const GLfloat *v); GLAPI void APIENTRY glNormal3fVertex3fSUN (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); GLAPI void APIENTRY glNormal3fVertex3fvSUN (const GLfloat *n, const GLfloat *v); GLAPI void APIENTRY glColor4fNormal3fVertex3fSUN (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); GLAPI void APIENTRY glColor4fNormal3fVertex3fvSUN (const GLfloat *c, const GLfloat *n, const GLfloat *v); GLAPI void APIENTRY glTexCoord2fVertex3fSUN (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); GLAPI void APIENTRY glTexCoord2fVertex3fvSUN (const GLfloat *tc, const GLfloat *v); GLAPI void APIENTRY glTexCoord4fVertex4fSUN (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); GLAPI void APIENTRY glTexCoord4fVertex4fvSUN (const GLfloat *tc, const GLfloat *v); GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fSUN (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fvSUN (const GLfloat *tc, const GLubyte *c, const GLfloat *v); GLAPI void APIENTRY glTexCoord2fColor3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); GLAPI void APIENTRY glTexCoord2fColor3fVertex3fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *v); GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fvSUN (const GLfloat *tc, const GLfloat *n, const GLfloat *v); GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fSUN (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); GLAPI void APIENTRY glReplacementCodeuiVertex3fSUN (GLuint rc, GLfloat x, GLfloat y, GLfloat z); GLAPI void APIENTRY glReplacementCodeuiVertex3fvSUN (const GLuint *rc, const GLfloat *v); GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fSUN (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fvSUN (const GLuint *rc, const GLubyte *c, const GLfloat *v); GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fSUN (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fvSUN (const GLuint *rc, const GLfloat *c, const GLfloat *v); GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fSUN (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *n, const GLfloat *v); GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fSUN (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *v); GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); #endif #endif /* GL_SUN_vertex */ #ifndef GL_WIN_phong_shading #define GL_WIN_phong_shading 1 #define GL_PHONG_WIN 0x80EA #define GL_PHONG_HINT_WIN 0x80EB #endif /* GL_WIN_phong_shading */ #ifndef GL_WIN_specular_fog #define GL_WIN_specular_fog 1 #define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC #endif /* GL_WIN_specular_fog */ #ifdef __cplusplus } #endif #endif mumble-1.3.4/3rdparty/smallft-src/0000775000175000017500000000000014010707273016640 5ustar builderbuildermumble-1.3.4/3rdparty/smallft-src/smallft.cpp0000664000175000017500000005106714010707273021017 0ustar builderbuilder/******************************************************************** * * * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * * * * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * * by the Xiph.Org Foundation http://www.xiph.org/ * * * ******************************************************************** Copyright (c) 2002-2007 Xiph.org Foundation Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ********************************************************************/ #include "mumble_pch.hpp" #include "smallft.h" static void drfti1(int n, float *wa, int *ifac) { static int ntryh[4] = { 4,2,3,5 }; static float tpi = 6.28318530717958648f; float arg,argh,argld,fi; int ntry=0,i,j=-1; int k1, l1, l2, ib; int ld, ii, ip, is, nq, nr; int ido, ipm, nfm1; int nl=n; int nf=0; L101: j++; if (j < 4) ntry=ntryh[j]; else ntry+=2; L104: nq=nl/ntry; nr=nl-ntry*nq; if (nr!=0) goto L101; nf++; ifac[nf+1]=ntry; nl=nq; if (ntry!=2)goto L107; if (nf==1)goto L107; for (i=1;i(n); is=0; nfm1=nf-1; l1=1; if (nfm1==0)return; for (k1=0;k1(ld)*argh; fi=0.f; for (ii=2;ii(ip); dcp=cosf(arg); dsp=sinf(arg); ipph=(ip+1)>>1; ipp2=ip; idp2=ido; nbd=(ido-1)>>1; t0=l1*ido; t10=ip*ido; if (ido==1)goto L119; for (ik=0;ikl1) { for (j=1;j(ip); dcp=cosf(arg); dsp=sinf(arg); nbd=(ido-1)>>1; ipp2=ip; ipph=(ip+1)>>1; if (idol1)goto L139; is= -ido-1; t1=0; for (j=1;jn==1)return; drftf1(l->n,data,l->trigcache,l->trigcache+l->n,l->splitcache); } void mumble_drft_backward(drft_lookup *l,float *data) { if (l->n==1)return; drftb1(l->n,data,l->trigcache,l->trigcache+l->n,l->splitcache); } void mumble_drft_init(drft_lookup *l,int n) { l->n=n; l->trigcache=reinterpret_cast(calloc(3*n,sizeof(*l->trigcache))); l->splitcache=reinterpret_cast(calloc(32,sizeof(*l->splitcache))); fdrffti(n, l->trigcache, l->splitcache); } void mumble_drft_clear(drft_lookup *l) { if (l) { free(l->trigcache); free(l->splitcache); memset(l,0,sizeof(*l)); } } mumble-1.3.4/3rdparty/smallft-src/smallft.h0000664000175000017500000000465114010707273020461 0ustar builderbuilder/******************************************************************** * * * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * * * * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * * by the Xiph.Org Foundation http://www.xiph.org/ * * * ******************************************************************** Copyright (c) 2002-2007 Xiph.org Foundation Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ********************************************************************/ #ifndef MUMBLE_MUMBLE_SMFT_H_ #define MUMBLE_MUMBLE_SMFT_H_ typedef struct { int n; float *trigcache; int *splitcache; } drft_lookup; extern void mumble_drft_forward(drft_lookup *l,float *data); extern void mumble_drft_backward(drft_lookup *l,float *data); extern void mumble_drft_init(drft_lookup *l,int n); extern void mumble_drft_clear(drft_lookup *l); #endif mumble-1.3.4/3rdparty/smallft-src/LICENSE0000664000175000017500000000267514010707273017657 0ustar builderbuilderCopyright (c) 2002-2007 Xiph.org Foundation Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. mumble-1.3.4/3rdparty/xinputcheck-src/0000775000175000017500000000000014010707273017523 5ustar builderbuildermumble-1.3.4/3rdparty/xinputcheck-src/README0000664000175000017500000000065514010707273020411 0ustar builderbuilderXInputCheck is an XInput check abstracted away from SDL. The content of xinputcheck.c is originally from SDL Hg c7932bb6dcee. The files used are "src/joystick/windows/SDL_dinputjoystick.c" and "include/SDL_stdinc.h". If you need to update this file, please arrange the code such that it is possible to copy/paste directly from SDL. This makes code sharing easier! Right now, the SDL_IsXInputDevice is directly copied from SDL. mumble-1.3.4/3rdparty/xinputcheck-src/xinputcheck.h0000664000175000017500000000424714010707273022230 0ustar builderbuilder/* Simple DirectMedia Layer Copyright (C) 1997-2013 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ #ifndef XINPUTCHECK_H #define XINPUTCHECK_H #include /// XInputCheck_IsGuidProductXInputDevice checks whether the DirectInput /// guidProduct given in GuidProductFromDirectInput is a valid XInput device. /// /// This function holds an internal cache of the system's device tree. This /// cache can be cleared by calling the XInputCheck_ClearDeviceCache function. /// The function does not ever clear this cache itself, so it is important to /// to call XInputCheck_ClearDeviceCache when new hardware has been added to /// the system. /// /// This function is not thread safe. /// /// @param pGuidProductFromDirectInput The DirectInput guidProduct to check. /// This parameter must not be NULL. /// @return Returns true if the given device is an XInput device. Returns /// false if it is not. /// /// @see XInputCheck_ClearDeviceCache bool XInputCheck_IsGuidProductXInputDevice(const GUID *pGuidProductFromDirectInput); /// XInputCheck_ClearDeviceCache clears XInputCheck's internal device cache. /// Calling this function causes the next call to /// XInputCheck_IsGuidProductXInputDevice to query the system's device tree. /// /// This function is not thread safe. void XInputCheck_ClearDeviceCache(); #endif mumble-1.3.4/3rdparty/xinputcheck-src/COPYING.txt0000664000175000017500000000161414010707273021376 0ustar builderbuilderSimple DirectMedia Layer Copyright (C) 1997-2016 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. mumble-1.3.4/3rdparty/xinputcheck-src/xinputcheck.cpp0000664000175000017500000001613514010707273022562 0ustar builderbuilder/* Simple DirectMedia Layer Copyright (C) 1997-2013 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ #include "xinputcheck.h" #include #include // XInputCheck is an XInput check abstracted away from SDL. // // If you need to update this file, please arrange the code such that // it is possible to copy/paste directly from SDL. This makes code // sharing easier! Right now, the SDL_IsXInputDevice is directly // copied from SDL. // // Below, we have a few preprocessor defines, that allow the SDL functions // we use, to run in our environment. // // After that, there is an implementation of the SDL_XINPUT_Enabled // that always returns true. // // Then comes the implementation of SDL_IsXInputDevice, which is copied // directly from SDL. // // At the bottom of the file, you'll find our wrapper interfaces -- // the public API for the XInputCheck library. // // Again, if you ever need to change anything in the SDL functions, well. // Think again! If you find a bug, feel free to fix it, but report it // upstream as well. // If at all possible, try to use wrapper functions to implement "new" // functionality (such as XInputCheck_ClearDeviceCache, for clearing // the internal cache). // Preprocessor helpers for running SDL code as-is. #define SDL_bool bool #define SDL_TRUE true #define SDL_FALSE false #define SDL_free free #define SDL_malloc malloc #define SDL_OutOfMemory abort #define SDL_strstr strstr #define SDL_memcmp memcmp #define SDL_arraysize(array) (sizeof(array)/sizeof(array[0])) static SDL_bool SDL_XINPUT_Enabled() { return SDL_TRUE; } static PRAWINPUTDEVICELIST SDL_RawDevList = NULL; static UINT SDL_RawDevListCount = 0; static SDL_bool SDL_IsXInputDevice(const GUID* pGuidProductFromDirectInput) { static GUID IID_ValveStreamingGamepad = { MAKELONG(0x28DE, 0x11FF), 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } }; static GUID IID_X360WiredGamepad = { MAKELONG(0x045E, 0x02A1), 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } }; static GUID IID_X360WirelessGamepad = { MAKELONG(0x045E, 0x028E), 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } }; static GUID IID_XOneWiredGamepad = { MAKELONG(0x045E, 0x02FF), 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } }; static GUID IID_XOneWirelessGamepad = { MAKELONG(0x045E, 0x02DD), 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } }; static GUID IID_XOneNewWirelessGamepad = { MAKELONG(0x045E, 0x02D1), 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } }; static GUID IID_XOneSWirelessGamepad = { MAKELONG(0x045E, 0x02EA), 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } }; static GUID IID_XOneSBluetoothGamepad = { MAKELONG(0x045E, 0x02E0), 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } }; static GUID IID_XOneEliteWirelessGamepad = { MAKELONG(0x045E, 0x02E3), 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } }; static const GUID *s_XInputProductGUID[] = { &IID_ValveStreamingGamepad, &IID_X360WiredGamepad, /* Microsoft's wired X360 controller for Windows. */ &IID_X360WirelessGamepad, /* Microsoft's wireless X360 controller for Windows. */ &IID_XOneWiredGamepad, /* Microsoft's wired Xbox One controller for Windows. */ &IID_XOneWirelessGamepad, /* Microsoft's wireless Xbox One controller for Windows. */ &IID_XOneNewWirelessGamepad, /* Microsoft's updated wireless Xbox One controller (w/ 3.5 mm jack) for Windows. */ &IID_XOneSWirelessGamepad, /* Microsoft's wireless Xbox One S controller for Windows. */ &IID_XOneSBluetoothGamepad, /* Microsoft's Bluetooth Xbox One S controller for Windows. */ &IID_XOneEliteWirelessGamepad /* Microsoft's wireless Xbox One Elite controller for Windows. */ }; size_t iDevice; UINT i; if (!SDL_XINPUT_Enabled()) { return SDL_FALSE; } /* Check for well known XInput device GUIDs */ /* This lets us skip RAWINPUT for popular devices. Also, we need to do this for the Valve Streaming Gamepad because it's virtualized and doesn't show up in the device list. */ for (iDevice = 0; iDevice < SDL_arraysize(s_XInputProductGUID); ++iDevice) { if (SDL_memcmp(pGuidProductFromDirectInput, s_XInputProductGUID[iDevice], sizeof(GUID)) == 0) { return SDL_TRUE; } } /* Go through RAWINPUT (WinXP and later) to find HID devices. */ /* Cache this if we end up using it. */ if (SDL_RawDevList == NULL) { if ((GetRawInputDeviceList(NULL, &SDL_RawDevListCount, sizeof(RAWINPUTDEVICELIST)) == -1) || (!SDL_RawDevListCount)) { return SDL_FALSE; /* oh well. */ } SDL_RawDevList = (PRAWINPUTDEVICELIST)SDL_malloc(sizeof(RAWINPUTDEVICELIST) * SDL_RawDevListCount); if (SDL_RawDevList == NULL) { SDL_OutOfMemory(); return SDL_FALSE; } if (GetRawInputDeviceList(SDL_RawDevList, &SDL_RawDevListCount, sizeof(RAWINPUTDEVICELIST)) == -1) { SDL_free(SDL_RawDevList); SDL_RawDevList = NULL; return SDL_FALSE; /* oh well. */ } } for (i = 0; i < SDL_RawDevListCount; i++) { RID_DEVICE_INFO rdi; char devName[128]; UINT rdiSize = sizeof(rdi); UINT nameSize = SDL_arraysize(devName); rdi.cbSize = sizeof(rdi); if ((SDL_RawDevList[i].dwType == RIM_TYPEHID) && (GetRawInputDeviceInfoA(SDL_RawDevList[i].hDevice, RIDI_DEVICEINFO, &rdi, &rdiSize) != ((UINT)-1)) && (MAKELONG(rdi.hid.dwVendorId, rdi.hid.dwProductId) == ((LONG)pGuidProductFromDirectInput->Data1)) && (GetRawInputDeviceInfoA(SDL_RawDevList[i].hDevice, RIDI_DEVICENAME, devName, &nameSize) != ((UINT)-1)) && (SDL_strstr(devName, "IG_") != NULL)) { return SDL_TRUE; } } return SDL_FALSE; } bool XInputCheck_IsGuidProductXInputDevice(const GUID *pGuidProductFromDirectInput) { return SDL_IsXInputDevice(pGuidProductFromDirectInput); } void XInputCheck_ClearDeviceCache() { SDL_free(SDL_RawDevList); SDL_RawDevList = NULL; SDL_RawDevListCount = 0; } mumble-1.3.4/3rdparty/minhook-src/0000775000175000017500000000000014010707332016636 5ustar builderbuildermumble-1.3.4/3rdparty/minhook-src/LICENSE.txt0000664000175000017500000001041514010707332020462 0ustar builderbuilderMinHook - The Minimalistic API Hooking Library for x64/x86 Copyright (C) 2009-2017 Tsuda Kageyu. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ================================================================================ Portions of this software are Copyright (c) 2008-2009, Vyacheslav Patkov. ================================================================================ Hacker Disassembler Engine 32 C Copyright (c) 2008-2009, Vyacheslav Patkov. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------------- Hacker Disassembler Engine 64 C Copyright (c) 2008-2009, Vyacheslav Patkov. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. mumble-1.3.4/3rdparty/minhook-src/build/0000775000175000017500000000000014010707332017735 5ustar builderbuildermumble-1.3.4/3rdparty/minhook-src/build/VC10/0000775000175000017500000000000014010707332020406 5ustar builderbuildermumble-1.3.4/3rdparty/minhook-src/build/VC10/MinHook.vcxproj0000664000175000017500000002423314010707332023373 0ustar builderbuilder Debug Win32 Debug x64 Release Win32 Release x64 {027FAC75-3FDB-4044-8DD0-BC297BD4C461} MinHook Win32Proj DynamicLibrary Unicode true DynamicLibrary Unicode DynamicLibrary Unicode true DynamicLibrary Unicode <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)bin\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ true $(SolutionDir)bin\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ true $(SolutionDir)bin\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ false $(SolutionDir)bin\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ false $(ProjectName).x86 $(ProjectName).x86 $(ProjectName).x64 $(ProjectName).x64 Disabled WIN32;_DEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) false EnableFastChecks MultiThreadedDebug Level3 $(SolutionDir)..\..\dll_resources\MinHook.def false Windows MachineX86 $(SolutionDir)lib\$(Configuration)\libMinHook.x86.lib;%(AdditionalDependencies) X64 Disabled WIN32;_DEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) false EnableFastChecks MultiThreadedDebug Level3 $(SolutionDir)..\..\dll_resources\MinHook.def false Windows MachineX64 $(SolutionDir)lib\$(Configuration)\libMinHook.x64.lib;%(AdditionalDependencies) MinSpace true WIN32;NDEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) MultiThreaded true Level3 false $(SolutionDir)..\..\dll_resources\MinHook.def false Windows true true MachineX86 $(SolutionDir)lib\$(Configuration)\libMinHook.x86.lib;%(AdditionalDependencies) true .CRT=.text X64 MinSpace true WIN32;NDEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) MultiThreaded true Level3 false $(SolutionDir)..\..\dll_resources\MinHook.def false Windows true true MachineX64 $(SolutionDir)lib\$(Configuration)\libMinHook.x64.lib;%(AdditionalDependencies) true .CRT=.text mumble-1.3.4/3rdparty/minhook-src/build/VC10/libMinHook.vcxproj0000664000175000017500000002244714010707332024067 0ustar builderbuilder Debug Win32 Debug x64 Release Win32 Release x64 {F142A341-5EE0-442D-A15F-98AE9B48DBAE} libMinHook Win32Proj StaticLibrary Unicode true StaticLibrary Unicode StaticLibrary Unicode true StaticLibrary Unicode <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)lib\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ $(SolutionDir)lib\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ $(SolutionDir)lib\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ $(SolutionDir)lib\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ $(ProjectName).x86 $(ProjectName).x86 $(ProjectName).x64 $(ProjectName).x64 Disabled %(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;STRICT;%(PreprocessorDefinitions) false EnableFastChecks MultiThreadedDebug Level3 false X64 Disabled %(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;STRICT;%(PreprocessorDefinitions) false EnableFastChecks MultiThreadedDebug Level3 false MinSpace true %(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;STRICT;%(PreprocessorDefinitions) false MultiThreaded true Level3 true AnySuitable X64 MinSpace true %(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;STRICT;%(PreprocessorDefinitions) false MultiThreaded true Level3 true AnySuitable true true true true mumble-1.3.4/3rdparty/minhook-src/build/VC10/libMinHook.vcxproj.filters0000664000175000017500000000342514010707332025531 0ustar builderbuilder Source Files Source Files Source Files HDE HDE Header Files Header Files HDE HDE HDE HDE HDE {9d24b740-be2e-4cfd-b9a4-340a50946ee9} {76381bc7-2863-4cc5-aede-926ec2c506e4} {56ddb326-6179-430d-ae19-e13bfd767bfa} mumble-1.3.4/3rdparty/minhook-src/build/VC10/MinHookVC10.sln0000664000175000017500000000407414010707332023067 0ustar builderbuilder Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libMinHook", "libMinHook.vcxproj", "{F142A341-5EE0-442D-A15F-98AE9B48DBAE}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MinHook", "MinHook.vcxproj", "{027FAC75-3FDB-4044-8DD0-BC297BD4C461}" ProjectSection(ProjectDependencies) = postProject {F142A341-5EE0-442D-A15F-98AE9B48DBAE} = {F142A341-5EE0-442D-A15F-98AE9B48DBAE} EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|Win32.ActiveCfg = Debug|Win32 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|Win32.Build.0 = Debug|Win32 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x64.ActiveCfg = Debug|x64 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x64.Build.0 = Debug|x64 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|Win32.ActiveCfg = Release|Win32 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|Win32.Build.0 = Release|Win32 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|x64.ActiveCfg = Release|x64 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|x64.Build.0 = Release|x64 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|Win32.ActiveCfg = Debug|Win32 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|Win32.Build.0 = Debug|Win32 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|x64.ActiveCfg = Debug|x64 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|x64.Build.0 = Debug|x64 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|Win32.ActiveCfg = Release|Win32 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|Win32.Build.0 = Release|Win32 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|x64.ActiveCfg = Release|x64 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal mumble-1.3.4/3rdparty/minhook-src/build/VC15/0000775000175000017500000000000014010707332020413 5ustar builderbuildermumble-1.3.4/3rdparty/minhook-src/build/VC15/MinHookVC15.sln0000664000175000017500000000420714010707332023077 0ustar builderbuilder Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 VisualStudioVersion = 15.0.25123.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libMinHook", "libMinHook.vcxproj", "{F142A341-5EE0-442D-A15F-98AE9B48DBAE}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MinHook", "MinHook.vcxproj", "{027FAC75-3FDB-4044-8DD0-BC297BD4C461}" ProjectSection(ProjectDependencies) = postProject {F142A341-5EE0-442D-A15F-98AE9B48DBAE} = {F142A341-5EE0-442D-A15F-98AE9B48DBAE} EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|Win32.ActiveCfg = Debug|Win32 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|Win32.Build.0 = Debug|Win32 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x64.ActiveCfg = Debug|x64 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x64.Build.0 = Debug|x64 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|Win32.ActiveCfg = Release|Win32 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|Win32.Build.0 = Release|Win32 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|x64.ActiveCfg = Release|x64 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|x64.Build.0 = Release|x64 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|Win32.ActiveCfg = Debug|Win32 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|Win32.Build.0 = Debug|Win32 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|x64.ActiveCfg = Debug|x64 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|x64.Build.0 = Debug|x64 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|Win32.ActiveCfg = Release|Win32 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|Win32.Build.0 = Release|Win32 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|x64.ActiveCfg = Release|x64 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal mumble-1.3.4/3rdparty/minhook-src/build/VC15/MinHook.vcxproj0000664000175000017500000002451514010707332023403 0ustar builderbuilder Debug Win32 Debug x64 Release Win32 Release x64 {027FAC75-3FDB-4044-8DD0-BC297BD4C461} MinHook Win32Proj DynamicLibrary Unicode true v141_xp DynamicLibrary Unicode v141_xp DynamicLibrary Unicode true v141_xp DynamicLibrary Unicode v141_xp <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)bin\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ true $(SolutionDir)bin\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ true $(SolutionDir)bin\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ false $(SolutionDir)bin\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ false $(ProjectName).x86 $(ProjectName).x86 $(ProjectName).x64 $(ProjectName).x64 Disabled WIN32;_DEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) false EnableFastChecks MultiThreadedDebug Level3 None $(SolutionDir)..\..\dll_resources\MinHook.def false Windows MachineX86 $(SolutionDir)lib\$(Configuration)\libMinHook.x86.lib;%(AdditionalDependencies) X64 Disabled WIN32;_DEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) false EnableFastChecks MultiThreadedDebug Level3 None $(SolutionDir)..\..\dll_resources\MinHook.def false Windows MachineX64 $(SolutionDir)lib\$(Configuration)\libMinHook.x64.lib;%(AdditionalDependencies) MinSpace true WIN32;NDEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) MultiThreaded true Level3 None false $(SolutionDir)..\..\dll_resources\MinHook.def false Windows true true MachineX86 $(SolutionDir)lib\$(Configuration)\libMinHook.x86.lib;%(AdditionalDependencies) true .CRT=.text X64 MinSpace true WIN32;NDEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) MultiThreaded true Level3 None false $(SolutionDir)..\..\dll_resources\MinHook.def false Windows true true MachineX64 $(SolutionDir)lib\$(Configuration)\libMinHook.x64.lib;%(AdditionalDependencies) true .CRT=.text mumble-1.3.4/3rdparty/minhook-src/build/VC15/libMinHook.vcxproj0000664000175000017500000002315114010707332024065 0ustar builderbuilder Debug Win32 Debug x64 Release Win32 Release x64 {F142A341-5EE0-442D-A15F-98AE9B48DBAE} libMinHook Win32Proj StaticLibrary Unicode true v141_xp StaticLibrary Unicode v141_xp StaticLibrary Unicode true v141_xp StaticLibrary Unicode v141_xp <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)lib\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ $(SolutionDir)lib\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ $(SolutionDir)lib\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ $(SolutionDir)lib\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ $(ProjectName).x86 $(ProjectName).x86 $(ProjectName).x64 $(ProjectName).x64 Disabled %(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;STRICT;%(PreprocessorDefinitions) false EnableFastChecks MultiThreadedDebug Level3 None NoExtensions X64 Disabled %(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;STRICT;%(PreprocessorDefinitions) false EnableFastChecks MultiThreadedDebug Level3 None NotSet MinSpace true %(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;STRICT;%(PreprocessorDefinitions) false MultiThreaded true Level3 None AnySuitable CompileAsC true NoExtensions X64 MinSpace true %(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;STRICT;%(PreprocessorDefinitions) false MultiThreaded true Level3 None true AnySuitable true true true true mumble-1.3.4/3rdparty/minhook-src/build/VC15/libMinHook.vcxproj.filters0000664000175000017500000000342514010707332025536 0ustar builderbuilder Source Files Source Files Source Files HDE HDE Header Files Header Files HDE HDE HDE HDE HDE {9d24b740-be2e-4cfd-b9a4-340a50946ee9} {76381bc7-2863-4cc5-aede-926ec2c506e4} {56ddb326-6179-430d-ae19-e13bfd767bfa} mumble-1.3.4/3rdparty/minhook-src/build/VC14/0000775000175000017500000000000014010707332020412 5ustar builderbuildermumble-1.3.4/3rdparty/minhook-src/build/VC14/MinHook.vcxproj0000664000175000017500000002451414010707332023401 0ustar builderbuilder Debug Win32 Debug x64 Release Win32 Release x64 {027FAC75-3FDB-4044-8DD0-BC297BD4C461} MinHook Win32Proj DynamicLibrary Unicode true v140_xp DynamicLibrary Unicode v140_xp DynamicLibrary Unicode true v140_xp DynamicLibrary Unicode v140_xp <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)bin\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ true $(SolutionDir)bin\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ true $(SolutionDir)bin\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ false $(SolutionDir)bin\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ false $(ProjectName).x86 $(ProjectName).x86 $(ProjectName).x64 $(ProjectName).x64 Disabled WIN32;_DEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) false EnableFastChecks MultiThreadedDebug Level3 None $(SolutionDir)..\..\dll_resources\MinHook.def false Windows MachineX86 $(SolutionDir)lib\$(Configuration)\libMinHook.x86.lib;%(AdditionalDependencies) X64 Disabled WIN32;_DEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) false EnableFastChecks MultiThreadedDebug Level3 None $(SolutionDir)..\..\dll_resources\MinHook.def false Windows MachineX64 $(SolutionDir)lib\$(Configuration)\libMinHook.x64.lib;%(AdditionalDependencies) MinSpace true WIN32;NDEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) MultiThreaded true Level3 None false $(SolutionDir)..\..\dll_resources\MinHook.def false Windows true true MachineX86 $(SolutionDir)lib\$(Configuration)\libMinHook.x86.lib;%(AdditionalDependencies) true .CRT=.text X64 MinSpace true WIN32;NDEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) MultiThreaded true Level3 None false $(SolutionDir)..\..\dll_resources\MinHook.def false Windows true true MachineX64 $(SolutionDir)lib\$(Configuration)\libMinHook.x64.lib;%(AdditionalDependencies) true .CRT=.text mumble-1.3.4/3rdparty/minhook-src/build/VC14/MinHookVC14.sln0000664000175000017500000000420714010707332023075 0ustar builderbuilder Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 VisualStudioVersion = 14.0.22823.1 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libMinHook", "libMinHook.vcxproj", "{F142A341-5EE0-442D-A15F-98AE9B48DBAE}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MinHook", "MinHook.vcxproj", "{027FAC75-3FDB-4044-8DD0-BC297BD4C461}" ProjectSection(ProjectDependencies) = postProject {F142A341-5EE0-442D-A15F-98AE9B48DBAE} = {F142A341-5EE0-442D-A15F-98AE9B48DBAE} EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|Win32.ActiveCfg = Debug|Win32 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|Win32.Build.0 = Debug|Win32 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x64.ActiveCfg = Debug|x64 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x64.Build.0 = Debug|x64 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|Win32.ActiveCfg = Release|Win32 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|Win32.Build.0 = Release|Win32 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|x64.ActiveCfg = Release|x64 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|x64.Build.0 = Release|x64 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|Win32.ActiveCfg = Debug|Win32 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|Win32.Build.0 = Debug|Win32 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|x64.ActiveCfg = Debug|x64 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|x64.Build.0 = Debug|x64 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|Win32.ActiveCfg = Release|Win32 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|Win32.Build.0 = Release|Win32 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|x64.ActiveCfg = Release|x64 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal mumble-1.3.4/3rdparty/minhook-src/build/VC14/libMinHook.vcxproj0000664000175000017500000002315014010707332024063 0ustar builderbuilder Debug Win32 Debug x64 Release Win32 Release x64 {F142A341-5EE0-442D-A15F-98AE9B48DBAE} libMinHook Win32Proj StaticLibrary Unicode true v140_xp StaticLibrary Unicode v140_xp StaticLibrary Unicode true v140_xp StaticLibrary Unicode v140_xp <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)lib\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ $(SolutionDir)lib\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ $(SolutionDir)lib\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ $(SolutionDir)lib\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ $(ProjectName).x86 $(ProjectName).x86 $(ProjectName).x64 $(ProjectName).x64 Disabled %(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;STRICT;%(PreprocessorDefinitions) false EnableFastChecks MultiThreadedDebug Level3 None NoExtensions X64 Disabled %(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;STRICT;%(PreprocessorDefinitions) false EnableFastChecks MultiThreadedDebug Level3 None NotSet MinSpace true %(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;STRICT;%(PreprocessorDefinitions) false MultiThreaded true Level3 None AnySuitable CompileAsC true NoExtensions X64 MinSpace true %(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;STRICT;%(PreprocessorDefinitions) false MultiThreaded true Level3 None true AnySuitable true true true true mumble-1.3.4/3rdparty/minhook-src/build/VC14/libMinHook.vcxproj.filters0000664000175000017500000000342514010707332025535 0ustar builderbuilder Source Files Source Files Source Files HDE HDE Header Files Header Files HDE HDE HDE HDE HDE {9d24b740-be2e-4cfd-b9a4-340a50946ee9} {76381bc7-2863-4cc5-aede-926ec2c506e4} {56ddb326-6179-430d-ae19-e13bfd767bfa} mumble-1.3.4/3rdparty/minhook-src/build/VC11/0000775000175000017500000000000014010707332020407 5ustar builderbuildermumble-1.3.4/3rdparty/minhook-src/build/VC11/MinHook.vcxproj0000664000175000017500000002451314010707332023375 0ustar builderbuilder Debug Win32 Debug x64 Release Win32 Release x64 {027FAC75-3FDB-4044-8DD0-BC297BD4C461} MinHook Win32Proj DynamicLibrary Unicode true v110_xp DynamicLibrary Unicode v110_xp DynamicLibrary Unicode true v110_xp DynamicLibrary Unicode v110_xp <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)bin\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ true $(SolutionDir)bin\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ true $(SolutionDir)bin\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ false $(SolutionDir)bin\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ false $(ProjectName).x86 $(ProjectName).x86 $(ProjectName).x64 $(ProjectName).x64 Disabled WIN32;_DEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) false EnableFastChecks MultiThreadedDebug Level3 None $(SolutionDir)..\..\dll_resources\MinHook.def false Windows MachineX86 $(SolutionDir)lib\$(Configuration)\libMinHook.x86.lib;%(AdditionalDependencies) X64 Disabled WIN32;_DEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) false EnableFastChecks MultiThreadedDebug Level3 None $(SolutionDir)..\..\dll_resources\MinHook.def false Windows MachineX64 $(SolutionDir)lib\$(Configuration)\libMinHook.x64.lib;%(AdditionalDependencies) MinSpace true WIN32;NDEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) MultiThreaded true Level3 None false $(SolutionDir)..\..\dll_resources\MinHook.def false Windows true true MachineX86 $(SolutionDir)lib\$(Configuration)\libMinHook.x86.lib;%(AdditionalDependencies) true .CRT=.text X64 MinSpace true WIN32;NDEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) MultiThreaded true Level3 None false $(SolutionDir)..\..\dll_resources\MinHook.def false Windows true true MachineX64 $(SolutionDir)lib\$(Configuration)\libMinHook.x64.lib;%(AdditionalDependencies) true .CRT=.text mumble-1.3.4/3rdparty/minhook-src/build/VC11/libMinHook.vcxproj0000664000175000017500000002276514010707332024073 0ustar builderbuilder Debug Win32 Debug x64 Release Win32 Release x64 {F142A341-5EE0-442D-A15F-98AE9B48DBAE} libMinHook Win32Proj StaticLibrary Unicode true v110_xp StaticLibrary Unicode v110_xp StaticLibrary Unicode true v110_xp StaticLibrary Unicode v110_xp <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)lib\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ $(SolutionDir)lib\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ $(SolutionDir)lib\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ $(SolutionDir)lib\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ $(ProjectName).x86 $(ProjectName).x86 $(ProjectName).x64 $(ProjectName).x64 Disabled %(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;STRICT;%(PreprocessorDefinitions) false EnableFastChecks MultiThreadedDebug Level3 None NoExtensions X64 Disabled %(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;STRICT;%(PreprocessorDefinitions) false EnableFastChecks MultiThreadedDebug Level3 None MinSpace true %(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;STRICT;%(PreprocessorDefinitions) false MultiThreaded true Level3 None true AnySuitable NoExtensions X64 MinSpace true %(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;STRICT;%(PreprocessorDefinitions) false MultiThreaded true Level3 None true AnySuitable true true true true mumble-1.3.4/3rdparty/minhook-src/build/VC11/libMinHook.vcxproj.filters0000664000175000017500000000342514010707332025532 0ustar builderbuilder Source Files Source Files Source Files HDE HDE Header Files Header Files HDE HDE HDE HDE HDE {9d24b740-be2e-4cfd-b9a4-340a50946ee9} {76381bc7-2863-4cc5-aede-926ec2c506e4} {56ddb326-6179-430d-ae19-e13bfd767bfa} mumble-1.3.4/3rdparty/minhook-src/build/VC11/MinHookVC11.sln0000664000175000017500000000407414010707332023071 0ustar builderbuilder Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2012 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libMinHook", "libMinHook.vcxproj", "{F142A341-5EE0-442D-A15F-98AE9B48DBAE}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MinHook", "MinHook.vcxproj", "{027FAC75-3FDB-4044-8DD0-BC297BD4C461}" ProjectSection(ProjectDependencies) = postProject {F142A341-5EE0-442D-A15F-98AE9B48DBAE} = {F142A341-5EE0-442D-A15F-98AE9B48DBAE} EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|Win32.ActiveCfg = Debug|Win32 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|Win32.Build.0 = Debug|Win32 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x64.ActiveCfg = Debug|x64 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x64.Build.0 = Debug|x64 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|Win32.ActiveCfg = Release|Win32 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|Win32.Build.0 = Release|Win32 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|x64.ActiveCfg = Release|x64 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|x64.Build.0 = Release|x64 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|Win32.ActiveCfg = Debug|Win32 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|Win32.Build.0 = Debug|Win32 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|x64.ActiveCfg = Debug|x64 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|x64.Build.0 = Debug|x64 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|Win32.ActiveCfg = Release|Win32 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|Win32.Build.0 = Release|Win32 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|x64.ActiveCfg = Release|x64 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal mumble-1.3.4/3rdparty/minhook-src/build/MinGW/0000775000175000017500000000000014010707332020716 5ustar builderbuildermumble-1.3.4/3rdparty/minhook-src/build/MinGW/Makefile0000664000175000017500000000164114010707332022360 0ustar builderbuilderWINDRES:=$(CROSS_PREFIX)windres DLLTOOL:=$(CROSS_PREFIX)dlltool AR:=$(CROSS_PREFIX)ar CC:=$(CROSS_PREFIX)gcc CCLD:=$(CC) SRCS:=$(wildcard src/*.c src/hde/*.c) OBJS:=$(SRCS:%.c=%.o) DEPS:=$(SRCS:%.c=%.d) INCS:=-Isrc -Iinclude CFLAGS:=-masm=intel -Wall -Werror -std=c11 LDFLAGS:=-Wl,-enable-stdcall-fixup -s -static-libgcc all: MinHook.dll libMinHook.dll.a libMinHook.a -include $(DEPS) libMinHook.a: $(OBJS) $(AR) r $@ $^ libMinHook.dll.a: MinHook.dll dll_resources/MinHook.def $(DLLTOOL) --dllname MinHook.dll --def dll_resources/MinHook.def --output-lib $@ MinHook.dll: $(OBJS) dll_resources/MinHook.res dll_resources/MinHook.def $(CCLD) -o $@ -shared $(LDFLAGS) $^ .rc.res: $(WINDRES) -o $@ --input-format=rc --output-format=coff $< .c.o: $(CC) -o $@ -c -MMD -MP $(INCS) $(CFLAGS) $< clean: rm -f $(OBJS) $(DEPS) MinHook.dll libMinHook.dll.a libMinHook.a dll_resources/MinHook.res .PHONY: clean .SUFFIXES: .rc .res mumble-1.3.4/3rdparty/minhook-src/build/MinGW/make.bat0000664000175000017500000000047714010707332022333 0ustar builderbuilderwindres -i ../../dll_resources/MinHook.rc -o MinHook_rc.o && dllwrap --driver-name g++ -o MinHook.dll -masm=intel --def ../../dll_resources/MinHook.def -Wl,-enable-stdcall-fixup -Wall MinHook_rc.o ../../src/*.c ../../src/HDE/*.c -I../../include -I../../src -Werror -std=c++11 -s -static-libgcc -static-libstdc++|| pausemumble-1.3.4/3rdparty/minhook-src/build/VC9/0000775000175000017500000000000014010707332020336 5ustar builderbuildermumble-1.3.4/3rdparty/minhook-src/build/VC9/MinHookVC9.sln0000664000175000017500000000407214010707332022745 0ustar builderbuilder Microsoft Visual Studio Solution File, Format Version 10.00 # Visual Studio 2008 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libMinHook", "libMinHook.vcproj", "{F142A341-5EE0-442D-A15F-98AE9B48DBAE}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MinHook", "MinHook.vcproj", "{027FAC75-3FDB-4044-8DD0-BC297BD4C461}" ProjectSection(ProjectDependencies) = postProject {F142A341-5EE0-442D-A15F-98AE9B48DBAE} = {F142A341-5EE0-442D-A15F-98AE9B48DBAE} EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|Win32.ActiveCfg = Debug|Win32 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|Win32.Build.0 = Debug|Win32 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x64.ActiveCfg = Debug|x64 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x64.Build.0 = Debug|x64 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|Win32.ActiveCfg = Release|Win32 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|Win32.Build.0 = Release|Win32 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|x64.ActiveCfg = Release|x64 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|x64.Build.0 = Release|x64 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|Win32.ActiveCfg = Debug|Win32 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|Win32.Build.0 = Debug|Win32 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|x64.ActiveCfg = Debug|x64 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|x64.Build.0 = Debug|x64 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|Win32.ActiveCfg = Release|Win32 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|Win32.Build.0 = Release|Win32 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|x64.ActiveCfg = Release|x64 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal mumble-1.3.4/3rdparty/minhook-src/build/VC9/libMinHook.vcproj0000664000175000017500000001756414010707332023633 0ustar builderbuilder mumble-1.3.4/3rdparty/minhook-src/build/VC9/MinHook.vcproj0000664000175000017500000001553614010707332023141 0ustar builderbuilder mumble-1.3.4/3rdparty/minhook-src/build/VC12/0000775000175000017500000000000014010707332020410 5ustar builderbuildermumble-1.3.4/3rdparty/minhook-src/build/VC12/MinHook.vcxproj0000664000175000017500000002451414010707332023377 0ustar builderbuilder Debug Win32 Debug x64 Release Win32 Release x64 {027FAC75-3FDB-4044-8DD0-BC297BD4C461} MinHook Win32Proj DynamicLibrary Unicode true v120_xp DynamicLibrary Unicode v120_xp DynamicLibrary Unicode true v120_xp DynamicLibrary Unicode v120_xp <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)bin\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ true $(SolutionDir)bin\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ true $(SolutionDir)bin\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ false $(SolutionDir)bin\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ false $(ProjectName).x86 $(ProjectName).x86 $(ProjectName).x64 $(ProjectName).x64 Disabled WIN32;_DEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) false EnableFastChecks MultiThreadedDebug Level3 None $(SolutionDir)..\..\dll_resources\MinHook.def false Windows MachineX86 $(SolutionDir)lib\$(Configuration)\libMinHook.x86.lib;%(AdditionalDependencies) X64 Disabled WIN32;_DEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) false EnableFastChecks MultiThreadedDebug Level3 None $(SolutionDir)..\..\dll_resources\MinHook.def false Windows MachineX64 $(SolutionDir)lib\$(Configuration)\libMinHook.x64.lib;%(AdditionalDependencies) MinSpace true WIN32;NDEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) MultiThreaded true Level3 None false $(SolutionDir)..\..\dll_resources\MinHook.def false Windows true true MachineX86 $(SolutionDir)lib\$(Configuration)\libMinHook.x86.lib;%(AdditionalDependencies) true .CRT=.text X64 MinSpace true WIN32;NDEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) MultiThreaded true Level3 None false $(SolutionDir)..\..\dll_resources\MinHook.def false Windows true true MachineX64 $(SolutionDir)lib\$(Configuration)\libMinHook.x64.lib;%(AdditionalDependencies) true .CRT=.text mumble-1.3.4/3rdparty/minhook-src/build/VC12/libMinHook.vcxproj0000664000175000017500000002315014010707332024061 0ustar builderbuilder Debug Win32 Debug x64 Release Win32 Release x64 {F142A341-5EE0-442D-A15F-98AE9B48DBAE} libMinHook Win32Proj StaticLibrary Unicode true v120_xp StaticLibrary Unicode v120_xp StaticLibrary Unicode true v120_xp StaticLibrary Unicode v120_xp <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)lib\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ $(SolutionDir)lib\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ $(SolutionDir)lib\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ $(SolutionDir)lib\$(Configuration)\ $(Platform)\$(Configuration)\$(ProjectName)\ $(ProjectName).x86 $(ProjectName).x86 $(ProjectName).x64 $(ProjectName).x64 Disabled %(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;STRICT;%(PreprocessorDefinitions) false EnableFastChecks MultiThreadedDebug Level3 None NoExtensions X64 Disabled %(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;STRICT;%(PreprocessorDefinitions) false EnableFastChecks MultiThreadedDebug Level3 None NotSet MinSpace true %(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;STRICT;%(PreprocessorDefinitions) false MultiThreaded true Level3 None AnySuitable CompileAsC true NoExtensions X64 MinSpace true %(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;STRICT;%(PreprocessorDefinitions) false MultiThreaded true Level3 None true AnySuitable true true true true mumble-1.3.4/3rdparty/minhook-src/build/VC12/libMinHook.vcxproj.filters0000664000175000017500000000342514010707332025533 0ustar builderbuilder Source Files Source Files Source Files HDE HDE Header Files Header Files HDE HDE HDE HDE HDE {9d24b740-be2e-4cfd-b9a4-340a50946ee9} {76381bc7-2863-4cc5-aede-926ec2c506e4} {56ddb326-6179-430d-ae19-e13bfd767bfa} mumble-1.3.4/3rdparty/minhook-src/build/VC12/MinHookVC12.sln0000664000175000017500000000421114010707332023064 0ustar builderbuilder Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 VisualStudioVersion = 12.0.30501.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libMinHook", "libMinHook.vcxproj", "{F142A341-5EE0-442D-A15F-98AE9B48DBAE}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MinHook", "MinHook.vcxproj", "{027FAC75-3FDB-4044-8DD0-BC297BD4C461}" ProjectSection(ProjectDependencies) = postProject {F142A341-5EE0-442D-A15F-98AE9B48DBAE} = {F142A341-5EE0-442D-A15F-98AE9B48DBAE} EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|Win32.ActiveCfg = Debug|Win32 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|Win32.Build.0 = Debug|Win32 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x64.ActiveCfg = Debug|x64 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x64.Build.0 = Debug|x64 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|Win32.ActiveCfg = Release|Win32 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|Win32.Build.0 = Release|Win32 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|x64.ActiveCfg = Release|x64 {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|x64.Build.0 = Release|x64 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|Win32.ActiveCfg = Debug|Win32 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|Win32.Build.0 = Debug|Win32 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|x64.ActiveCfg = Debug|x64 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|x64.Build.0 = Debug|x64 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|Win32.ActiveCfg = Release|Win32 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|Win32.Build.0 = Release|Win32 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|x64.ActiveCfg = Release|x64 {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal mumble-1.3.4/3rdparty/minhook-src/AUTHORS.txt0000664000175000017500000000032614010707332020525 0ustar builderbuilderTsuda Kageyu Creator, maintainer Michael Maltsev Added "Queue" functions. A lot of bug fixes. Andrey Unis Rewrote the hook engine in plain C. mumble-1.3.4/3rdparty/minhook-src/src/0000775000175000017500000000000014010707332017425 5ustar builderbuildermumble-1.3.4/3rdparty/minhook-src/src/hde/0000775000175000017500000000000014010707332020165 5ustar builderbuildermumble-1.3.4/3rdparty/minhook-src/src/hde/hde32.h0000664000175000017500000000462214010707332021247 0ustar builderbuilder/* * Hacker Disassembler Engine 32 * Copyright (c) 2006-2009, Vyacheslav Patkov. * All rights reserved. * * hde32.h: C/C++ header file * */ #ifndef _HDE32_H_ #define _HDE32_H_ /* stdint.h - C99 standard header * http://en.wikipedia.org/wiki/stdint.h * * if your compiler doesn't contain "stdint.h" header (for * example, Microsoft Visual C++), you can download file: * http://www.azillionmonkeys.com/qed/pstdint.h * and change next line to: * #include "pstdint.h" */ #include "pstdint.h" #define F_MODRM 0x00000001 #define F_SIB 0x00000002 #define F_IMM8 0x00000004 #define F_IMM16 0x00000008 #define F_IMM32 0x00000010 #define F_DISP8 0x00000020 #define F_DISP16 0x00000040 #define F_DISP32 0x00000080 #define F_RELATIVE 0x00000100 #define F_2IMM16 0x00000800 #define F_ERROR 0x00001000 #define F_ERROR_OPCODE 0x00002000 #define F_ERROR_LENGTH 0x00004000 #define F_ERROR_LOCK 0x00008000 #define F_ERROR_OPERAND 0x00010000 #define F_PREFIX_REPNZ 0x01000000 #define F_PREFIX_REPX 0x02000000 #define F_PREFIX_REP 0x03000000 #define F_PREFIX_66 0x04000000 #define F_PREFIX_67 0x08000000 #define F_PREFIX_LOCK 0x10000000 #define F_PREFIX_SEG 0x20000000 #define F_PREFIX_ANY 0x3f000000 #define PREFIX_SEGMENT_CS 0x2e #define PREFIX_SEGMENT_SS 0x36 #define PREFIX_SEGMENT_DS 0x3e #define PREFIX_SEGMENT_ES 0x26 #define PREFIX_SEGMENT_FS 0x64 #define PREFIX_SEGMENT_GS 0x65 #define PREFIX_LOCK 0xf0 #define PREFIX_REPNZ 0xf2 #define PREFIX_REPX 0xf3 #define PREFIX_OPERAND_SIZE 0x66 #define PREFIX_ADDRESS_SIZE 0x67 #pragma pack(push,1) typedef struct { uint8_t len; uint8_t p_rep; uint8_t p_lock; uint8_t p_seg; uint8_t p_66; uint8_t p_67; uint8_t opcode; uint8_t opcode2; uint8_t modrm; uint8_t modrm_mod; uint8_t modrm_reg; uint8_t modrm_rm; uint8_t sib; uint8_t sib_scale; uint8_t sib_index; uint8_t sib_base; union { uint8_t imm8; uint16_t imm16; uint32_t imm32; } imm; union { uint8_t disp8; uint16_t disp16; uint32_t disp32; } disp; uint32_t flags; } hde32s; #pragma pack(pop) #ifdef __cplusplus extern "C" { #endif /* __cdecl */ unsigned int hde32_disasm(const void *code, hde32s *hs); #ifdef __cplusplus } #endif #endif /* _HDE32_H_ */ mumble-1.3.4/3rdparty/minhook-src/src/hde/table64.h0000664000175000017500000000677114010707332021612 0ustar builderbuilder/* * Hacker Disassembler Engine 64 C * Copyright (c) 2008-2009, Vyacheslav Patkov. * All rights reserved. * */ #define C_NONE 0x00 #define C_MODRM 0x01 #define C_IMM8 0x02 #define C_IMM16 0x04 #define C_IMM_P66 0x10 #define C_REL8 0x20 #define C_REL32 0x40 #define C_GROUP 0x80 #define C_ERROR 0xff #define PRE_ANY 0x00 #define PRE_NONE 0x01 #define PRE_F2 0x02 #define PRE_F3 0x04 #define PRE_66 0x08 #define PRE_67 0x10 #define PRE_LOCK 0x20 #define PRE_SEG 0x40 #define PRE_ALL 0xff #define DELTA_OPCODES 0x4a #define DELTA_FPU_REG 0xfd #define DELTA_FPU_MODRM 0x104 #define DELTA_PREFIXES 0x13c #define DELTA_OP_LOCK_OK 0x1ae #define DELTA_OP2_LOCK_OK 0x1c6 #define DELTA_OP_ONLY_MEM 0x1d8 #define DELTA_OP2_ONLY_MEM 0x1e7 unsigned char hde64_table[] = { 0xa5,0xaa,0xa5,0xb8,0xa5,0xaa,0xa5,0xaa,0xa5,0xb8,0xa5,0xb8,0xa5,0xb8,0xa5, 0xb8,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xac,0xc0,0xcc,0xc0,0xa1,0xa1, 0xa1,0xa1,0xb1,0xa5,0xa5,0xa6,0xc0,0xc0,0xd7,0xda,0xe0,0xc0,0xe4,0xc0,0xea, 0xea,0xe0,0xe0,0x98,0xc8,0xee,0xf1,0xa5,0xd3,0xa5,0xa5,0xa1,0xea,0x9e,0xc0, 0xc0,0xc2,0xc0,0xe6,0x03,0x7f,0x11,0x7f,0x01,0x7f,0x01,0x3f,0x01,0x01,0xab, 0x8b,0x90,0x64,0x5b,0x5b,0x5b,0x5b,0x5b,0x92,0x5b,0x5b,0x76,0x90,0x92,0x92, 0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x6a,0x73,0x90, 0x5b,0x52,0x52,0x52,0x52,0x5b,0x5b,0x5b,0x5b,0x77,0x7c,0x77,0x85,0x5b,0x5b, 0x70,0x5b,0x7a,0xaf,0x76,0x76,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b, 0x5b,0x5b,0x86,0x01,0x03,0x01,0x04,0x03,0xd5,0x03,0xd5,0x03,0xcc,0x01,0xbc, 0x03,0xf0,0x03,0x03,0x04,0x00,0x50,0x50,0x50,0x50,0xff,0x20,0x20,0x20,0x20, 0x01,0x01,0x01,0x01,0xc4,0x02,0x10,0xff,0xff,0xff,0x01,0x00,0x03,0x11,0xff, 0x03,0xc4,0xc6,0xc8,0x02,0x10,0x00,0xff,0xcc,0x01,0x01,0x01,0x00,0x00,0x00, 0x00,0x01,0x01,0x03,0x01,0xff,0xff,0xc0,0xc2,0x10,0x11,0x02,0x03,0x01,0x01, 0x01,0xff,0xff,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0xff,0xff,0xff,0xff,0x10, 0x10,0x10,0x10,0x02,0x10,0x00,0x00,0xc6,0xc8,0x02,0x02,0x02,0x02,0x06,0x00, 0x04,0x00,0x02,0xff,0x00,0xc0,0xc2,0x01,0x01,0x03,0x03,0x03,0xca,0x40,0x00, 0x0a,0x00,0x04,0x00,0x00,0x00,0x00,0x7f,0x00,0x33,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xff,0xbf,0xff,0xff,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0xff,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff, 0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x00, 0xff,0x40,0x40,0x40,0x40,0x41,0x49,0x40,0x40,0x40,0x40,0x4c,0x42,0x40,0x40, 0x40,0x40,0x40,0x40,0x40,0x40,0x4f,0x44,0x53,0x40,0x40,0x40,0x44,0x57,0x43, 0x5c,0x40,0x60,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, 0x40,0x40,0x64,0x66,0x6e,0x6b,0x40,0x40,0x6a,0x46,0x40,0x40,0x44,0x46,0x40, 0x40,0x5b,0x44,0x40,0x40,0x00,0x00,0x00,0x00,0x06,0x06,0x06,0x06,0x01,0x06, 0x06,0x02,0x06,0x06,0x00,0x06,0x00,0x0a,0x0a,0x00,0x00,0x00,0x02,0x07,0x07, 0x06,0x02,0x0d,0x06,0x06,0x06,0x0e,0x05,0x05,0x02,0x02,0x00,0x00,0x04,0x04, 0x04,0x04,0x05,0x06,0x06,0x06,0x00,0x00,0x00,0x0e,0x00,0x00,0x08,0x00,0x10, 0x00,0x18,0x00,0x20,0x00,0x28,0x00,0x30,0x00,0x80,0x01,0x82,0x01,0x86,0x00, 0xf6,0xcf,0xfe,0x3f,0xab,0x00,0xb0,0x00,0xb1,0x00,0xb3,0x00,0xba,0xf8,0xbb, 0x00,0xc0,0x00,0xc1,0x00,0xc7,0xbf,0x62,0xff,0x00,0x8d,0xff,0x00,0xc4,0xff, 0x00,0xc5,0xff,0x00,0xff,0xff,0xeb,0x01,0xff,0x0e,0x12,0x08,0x00,0x13,0x09, 0x00,0x16,0x08,0x00,0x17,0x09,0x00,0x2b,0x09,0x00,0xae,0xff,0x07,0xb2,0xff, 0x00,0xb4,0xff,0x00,0xb5,0xff,0x00,0xc3,0x01,0x00,0xc7,0xff,0xbf,0xe7,0x08, 0x00,0xf0,0x02,0x00 }; mumble-1.3.4/3rdparty/minhook-src/src/hde/hde64.c0000664000175000017500000002254414010707332021252 0ustar builderbuilder/* * Hacker Disassembler Engine 64 C * Copyright (c) 2008-2009, Vyacheslav Patkov. * All rights reserved. * */ #if defined(_M_X64) || defined(__x86_64__) #include "hde64.h" #include "table64.h" unsigned int hde64_disasm(const void *code, hde64s *hs) { uint8_t x, c, *p = (uint8_t *)code, cflags, opcode, pref = 0; uint8_t *ht = hde64_table, m_mod, m_reg, m_rm, disp_size = 0; uint8_t op64 = 0; // Avoid using memset to reduce the footprint. #ifndef _MSC_VER memset((LPBYTE)hs, 0, sizeof(hde64s)); #else __stosb((LPBYTE)hs, 0, sizeof(hde64s)); #endif for (x = 16; x; x--) switch (c = *p++) { case 0xf3: hs->p_rep = c; pref |= PRE_F3; break; case 0xf2: hs->p_rep = c; pref |= PRE_F2; break; case 0xf0: hs->p_lock = c; pref |= PRE_LOCK; break; case 0x26: case 0x2e: case 0x36: case 0x3e: case 0x64: case 0x65: hs->p_seg = c; pref |= PRE_SEG; break; case 0x66: hs->p_66 = c; pref |= PRE_66; break; case 0x67: hs->p_67 = c; pref |= PRE_67; break; default: goto pref_done; } pref_done: hs->flags = (uint32_t)pref << 23; if (!pref) pref |= PRE_NONE; if ((c & 0xf0) == 0x40) { hs->flags |= F_PREFIX_REX; if ((hs->rex_w = (c & 0xf) >> 3) && (*p & 0xf8) == 0xb8) op64++; hs->rex_r = (c & 7) >> 2; hs->rex_x = (c & 3) >> 1; hs->rex_b = c & 1; if (((c = *p++) & 0xf0) == 0x40) { opcode = c; goto error_opcode; } } if ((hs->opcode = c) == 0x0f) { hs->opcode2 = c = *p++; ht += DELTA_OPCODES; } else if (c >= 0xa0 && c <= 0xa3) { op64++; if (pref & PRE_67) pref |= PRE_66; else pref &= ~PRE_66; } opcode = c; cflags = ht[ht[opcode / 4] + (opcode % 4)]; if (cflags == C_ERROR) { error_opcode: hs->flags |= F_ERROR | F_ERROR_OPCODE; cflags = 0; if ((opcode & -3) == 0x24) cflags++; } x = 0; if (cflags & C_GROUP) { uint16_t t; t = *(uint16_t *)(ht + (cflags & 0x7f)); cflags = (uint8_t)t; x = (uint8_t)(t >> 8); } if (hs->opcode2) { ht = hde64_table + DELTA_PREFIXES; if (ht[ht[opcode / 4] + (opcode % 4)] & pref) hs->flags |= F_ERROR | F_ERROR_OPCODE; } if (cflags & C_MODRM) { hs->flags |= F_MODRM; hs->modrm = c = *p++; hs->modrm_mod = m_mod = c >> 6; hs->modrm_rm = m_rm = c & 7; hs->modrm_reg = m_reg = (c & 0x3f) >> 3; if (x && ((x << m_reg) & 0x80)) hs->flags |= F_ERROR | F_ERROR_OPCODE; if (!hs->opcode2 && opcode >= 0xd9 && opcode <= 0xdf) { uint8_t t = opcode - 0xd9; if (m_mod == 3) { ht = hde64_table + DELTA_FPU_MODRM + t*8; t = ht[m_reg] << m_rm; } else { ht = hde64_table + DELTA_FPU_REG; t = ht[t] << m_reg; } if (t & 0x80) hs->flags |= F_ERROR | F_ERROR_OPCODE; } if (pref & PRE_LOCK) { if (m_mod == 3) { hs->flags |= F_ERROR | F_ERROR_LOCK; } else { uint8_t *table_end, op = opcode; if (hs->opcode2) { ht = hde64_table + DELTA_OP2_LOCK_OK; table_end = ht + DELTA_OP_ONLY_MEM - DELTA_OP2_LOCK_OK; } else { ht = hde64_table + DELTA_OP_LOCK_OK; table_end = ht + DELTA_OP2_LOCK_OK - DELTA_OP_LOCK_OK; op &= -2; } for (; ht != table_end; ht++) if (*ht++ == op) { if (!((*ht << m_reg) & 0x80)) goto no_lock_error; else break; } hs->flags |= F_ERROR | F_ERROR_LOCK; no_lock_error: ; } } if (hs->opcode2) { switch (opcode) { case 0x20: case 0x22: m_mod = 3; if (m_reg > 4 || m_reg == 1) goto error_operand; else goto no_error_operand; case 0x21: case 0x23: m_mod = 3; if (m_reg == 4 || m_reg == 5) goto error_operand; else goto no_error_operand; } } else { switch (opcode) { case 0x8c: if (m_reg > 5) goto error_operand; else goto no_error_operand; case 0x8e: if (m_reg == 1 || m_reg > 5) goto error_operand; else goto no_error_operand; } } if (m_mod == 3) { uint8_t *table_end; if (hs->opcode2) { ht = hde64_table + DELTA_OP2_ONLY_MEM; table_end = ht + sizeof(hde64_table) - DELTA_OP2_ONLY_MEM; } else { ht = hde64_table + DELTA_OP_ONLY_MEM; table_end = ht + DELTA_OP2_ONLY_MEM - DELTA_OP_ONLY_MEM; } for (; ht != table_end; ht += 2) if (*ht++ == opcode) { if (*ht++ & pref && !((*ht << m_reg) & 0x80)) goto error_operand; else break; } goto no_error_operand; } else if (hs->opcode2) { switch (opcode) { case 0x50: case 0xd7: case 0xf7: if (pref & (PRE_NONE | PRE_66)) goto error_operand; break; case 0xd6: if (pref & (PRE_F2 | PRE_F3)) goto error_operand; break; case 0xc5: goto error_operand; } goto no_error_operand; } else goto no_error_operand; error_operand: hs->flags |= F_ERROR | F_ERROR_OPERAND; no_error_operand: c = *p++; if (m_reg <= 1) { if (opcode == 0xf6) cflags |= C_IMM8; else if (opcode == 0xf7) cflags |= C_IMM_P66; } switch (m_mod) { case 0: if (pref & PRE_67) { if (m_rm == 6) disp_size = 2; } else if (m_rm == 5) disp_size = 4; break; case 1: disp_size = 1; break; case 2: disp_size = 2; if (!(pref & PRE_67)) disp_size <<= 1; } if (m_mod != 3 && m_rm == 4) { hs->flags |= F_SIB; p++; hs->sib = c; hs->sib_scale = c >> 6; hs->sib_index = (c & 0x3f) >> 3; if ((hs->sib_base = c & 7) == 5 && !(m_mod & 1)) disp_size = 4; } p--; switch (disp_size) { case 1: hs->flags |= F_DISP8; hs->disp.disp8 = *p; break; case 2: hs->flags |= F_DISP16; hs->disp.disp16 = *(uint16_t *)p; break; case 4: hs->flags |= F_DISP32; hs->disp.disp32 = *(uint32_t *)p; } p += disp_size; } else if (pref & PRE_LOCK) hs->flags |= F_ERROR | F_ERROR_LOCK; if (cflags & C_IMM_P66) { if (cflags & C_REL32) { if (pref & PRE_66) { hs->flags |= F_IMM16 | F_RELATIVE; hs->imm.imm16 = *(uint16_t *)p; p += 2; goto disasm_done; } goto rel32_ok; } if (op64) { hs->flags |= F_IMM64; hs->imm.imm64 = *(uint64_t *)p; p += 8; } else if (!(pref & PRE_66)) { hs->flags |= F_IMM32; hs->imm.imm32 = *(uint32_t *)p; p += 4; } else goto imm16_ok; } if (cflags & C_IMM16) { imm16_ok: hs->flags |= F_IMM16; hs->imm.imm16 = *(uint16_t *)p; p += 2; } if (cflags & C_IMM8) { hs->flags |= F_IMM8; hs->imm.imm8 = *p++; } if (cflags & C_REL32) { rel32_ok: hs->flags |= F_IMM32 | F_RELATIVE; hs->imm.imm32 = *(uint32_t *)p; p += 4; } else if (cflags & C_REL8) { hs->flags |= F_IMM8 | F_RELATIVE; hs->imm.imm8 = *p++; } disasm_done: if ((hs->len = (uint8_t)(p-(uint8_t *)code)) > 15) { hs->flags |= F_ERROR | F_ERROR_LENGTH; hs->len = 15; } return (unsigned int)hs->len; } #endif // defined(_M_X64) || defined(__x86_64__) mumble-1.3.4/3rdparty/minhook-src/src/hde/hde32.c0000664000175000017500000002224714010707332021245 0ustar builderbuilder/* * Hacker Disassembler Engine 32 C * Copyright (c) 2008-2009, Vyacheslav Patkov. * All rights reserved. * */ #if defined(_M_IX86) || defined(__i386__) #include "hde32.h" #include "table32.h" unsigned int hde32_disasm(const void *code, hde32s *hs) { uint8_t x, c, *p = (uint8_t *)code, cflags, opcode, pref = 0; uint8_t *ht = hde32_table, m_mod, m_reg, m_rm, disp_size = 0; // Avoid using memset to reduce the footprint. #ifndef _MSC_VER memset((LPBYTE)hs, 0, sizeof(hde32s)); #else __stosb((LPBYTE)hs, 0, sizeof(hde32s)); #endif for (x = 16; x; x--) switch (c = *p++) { case 0xf3: hs->p_rep = c; pref |= PRE_F3; break; case 0xf2: hs->p_rep = c; pref |= PRE_F2; break; case 0xf0: hs->p_lock = c; pref |= PRE_LOCK; break; case 0x26: case 0x2e: case 0x36: case 0x3e: case 0x64: case 0x65: hs->p_seg = c; pref |= PRE_SEG; break; case 0x66: hs->p_66 = c; pref |= PRE_66; break; case 0x67: hs->p_67 = c; pref |= PRE_67; break; default: goto pref_done; } pref_done: hs->flags = (uint32_t)pref << 23; if (!pref) pref |= PRE_NONE; if ((hs->opcode = c) == 0x0f) { hs->opcode2 = c = *p++; ht += DELTA_OPCODES; } else if (c >= 0xa0 && c <= 0xa3) { if (pref & PRE_67) pref |= PRE_66; else pref &= ~PRE_66; } opcode = c; cflags = ht[ht[opcode / 4] + (opcode % 4)]; if (cflags == C_ERROR) { hs->flags |= F_ERROR | F_ERROR_OPCODE; cflags = 0; if ((opcode & -3) == 0x24) cflags++; } x = 0; if (cflags & C_GROUP) { uint16_t t; t = *(uint16_t *)(ht + (cflags & 0x7f)); cflags = (uint8_t)t; x = (uint8_t)(t >> 8); } if (hs->opcode2) { ht = hde32_table + DELTA_PREFIXES; if (ht[ht[opcode / 4] + (opcode % 4)] & pref) hs->flags |= F_ERROR | F_ERROR_OPCODE; } if (cflags & C_MODRM) { hs->flags |= F_MODRM; hs->modrm = c = *p++; hs->modrm_mod = m_mod = c >> 6; hs->modrm_rm = m_rm = c & 7; hs->modrm_reg = m_reg = (c & 0x3f) >> 3; if (x && ((x << m_reg) & 0x80)) hs->flags |= F_ERROR | F_ERROR_OPCODE; if (!hs->opcode2 && opcode >= 0xd9 && opcode <= 0xdf) { uint8_t t = opcode - 0xd9; if (m_mod == 3) { ht = hde32_table + DELTA_FPU_MODRM + t*8; t = ht[m_reg] << m_rm; } else { ht = hde32_table + DELTA_FPU_REG; t = ht[t] << m_reg; } if (t & 0x80) hs->flags |= F_ERROR | F_ERROR_OPCODE; } if (pref & PRE_LOCK) { if (m_mod == 3) { hs->flags |= F_ERROR | F_ERROR_LOCK; } else { uint8_t *table_end, op = opcode; if (hs->opcode2) { ht = hde32_table + DELTA_OP2_LOCK_OK; table_end = ht + DELTA_OP_ONLY_MEM - DELTA_OP2_LOCK_OK; } else { ht = hde32_table + DELTA_OP_LOCK_OK; table_end = ht + DELTA_OP2_LOCK_OK - DELTA_OP_LOCK_OK; op &= -2; } for (; ht != table_end; ht++) if (*ht++ == op) { if (!((*ht << m_reg) & 0x80)) goto no_lock_error; else break; } hs->flags |= F_ERROR | F_ERROR_LOCK; no_lock_error: ; } } if (hs->opcode2) { switch (opcode) { case 0x20: case 0x22: m_mod = 3; if (m_reg > 4 || m_reg == 1) goto error_operand; else goto no_error_operand; case 0x21: case 0x23: m_mod = 3; if (m_reg == 4 || m_reg == 5) goto error_operand; else goto no_error_operand; } } else { switch (opcode) { case 0x8c: if (m_reg > 5) goto error_operand; else goto no_error_operand; case 0x8e: if (m_reg == 1 || m_reg > 5) goto error_operand; else goto no_error_operand; } } if (m_mod == 3) { uint8_t *table_end; if (hs->opcode2) { ht = hde32_table + DELTA_OP2_ONLY_MEM; table_end = ht + sizeof(hde32_table) - DELTA_OP2_ONLY_MEM; } else { ht = hde32_table + DELTA_OP_ONLY_MEM; table_end = ht + DELTA_OP2_ONLY_MEM - DELTA_OP_ONLY_MEM; } for (; ht != table_end; ht += 2) if (*ht++ == opcode) { if (*ht++ & pref && !((*ht << m_reg) & 0x80)) goto error_operand; else break; } goto no_error_operand; } else if (hs->opcode2) { switch (opcode) { case 0x50: case 0xd7: case 0xf7: if (pref & (PRE_NONE | PRE_66)) goto error_operand; break; case 0xd6: if (pref & (PRE_F2 | PRE_F3)) goto error_operand; break; case 0xc5: goto error_operand; } goto no_error_operand; } else goto no_error_operand; error_operand: hs->flags |= F_ERROR | F_ERROR_OPERAND; no_error_operand: c = *p++; if (m_reg <= 1) { if (opcode == 0xf6) cflags |= C_IMM8; else if (opcode == 0xf7) cflags |= C_IMM_P66; } switch (m_mod) { case 0: if (pref & PRE_67) { if (m_rm == 6) disp_size = 2; } else if (m_rm == 5) disp_size = 4; break; case 1: disp_size = 1; break; case 2: disp_size = 2; if (!(pref & PRE_67)) disp_size <<= 1; } if (m_mod != 3 && m_rm == 4 && !(pref & PRE_67)) { hs->flags |= F_SIB; p++; hs->sib = c; hs->sib_scale = c >> 6; hs->sib_index = (c & 0x3f) >> 3; if ((hs->sib_base = c & 7) == 5 && !(m_mod & 1)) disp_size = 4; } p--; switch (disp_size) { case 1: hs->flags |= F_DISP8; hs->disp.disp8 = *p; break; case 2: hs->flags |= F_DISP16; hs->disp.disp16 = *(uint16_t *)p; break; case 4: hs->flags |= F_DISP32; hs->disp.disp32 = *(uint32_t *)p; } p += disp_size; } else if (pref & PRE_LOCK) hs->flags |= F_ERROR | F_ERROR_LOCK; if (cflags & C_IMM_P66) { if (cflags & C_REL32) { if (pref & PRE_66) { hs->flags |= F_IMM16 | F_RELATIVE; hs->imm.imm16 = *(uint16_t *)p; p += 2; goto disasm_done; } goto rel32_ok; } if (pref & PRE_66) { hs->flags |= F_IMM16; hs->imm.imm16 = *(uint16_t *)p; p += 2; } else { hs->flags |= F_IMM32; hs->imm.imm32 = *(uint32_t *)p; p += 4; } } if (cflags & C_IMM16) { if (hs->flags & F_IMM32) { hs->flags |= F_IMM16; hs->disp.disp16 = *(uint16_t *)p; } else if (hs->flags & F_IMM16) { hs->flags |= F_2IMM16; hs->disp.disp16 = *(uint16_t *)p; } else { hs->flags |= F_IMM16; hs->imm.imm16 = *(uint16_t *)p; } p += 2; } if (cflags & C_IMM8) { hs->flags |= F_IMM8; hs->imm.imm8 = *p++; } if (cflags & C_REL32) { rel32_ok: hs->flags |= F_IMM32 | F_RELATIVE; hs->imm.imm32 = *(uint32_t *)p; p += 4; } else if (cflags & C_REL8) { hs->flags |= F_IMM8 | F_RELATIVE; hs->imm.imm8 = *p++; } disasm_done: if ((hs->len = (uint8_t)(p-(uint8_t *)code)) > 15) { hs->flags |= F_ERROR | F_ERROR_LENGTH; hs->len = 15; } return (unsigned int)hs->len; } #endif // defined(_M_IX86) || defined(__i386__) mumble-1.3.4/3rdparty/minhook-src/src/hde/pstdint.h0000664000175000017500000000317614010707332022032 0ustar builderbuilder/* * MinHook - The Minimalistic API Hooking Library for x64/x86 * Copyright (C) 2009-2017 Tsuda Kageyu. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #pragma once #include // Integer types for HDE. typedef INT8 int8_t; typedef INT16 int16_t; typedef INT32 int32_t; typedef INT64 int64_t; typedef UINT8 uint8_t; typedef UINT16 uint16_t; typedef UINT32 uint32_t; typedef UINT64 uint64_t; mumble-1.3.4/3rdparty/minhook-src/src/hde/hde64.h0000664000175000017500000000505214010707332021252 0ustar builderbuilder/* * Hacker Disassembler Engine 64 * Copyright (c) 2008-2009, Vyacheslav Patkov. * All rights reserved. * * hde64.h: C/C++ header file * */ #ifndef _HDE64_H_ #define _HDE64_H_ /* stdint.h - C99 standard header * http://en.wikipedia.org/wiki/stdint.h * * if your compiler doesn't contain "stdint.h" header (for * example, Microsoft Visual C++), you can download file: * http://www.azillionmonkeys.com/qed/pstdint.h * and change next line to: * #include "pstdint.h" */ #include "pstdint.h" #define F_MODRM 0x00000001 #define F_SIB 0x00000002 #define F_IMM8 0x00000004 #define F_IMM16 0x00000008 #define F_IMM32 0x00000010 #define F_IMM64 0x00000020 #define F_DISP8 0x00000040 #define F_DISP16 0x00000080 #define F_DISP32 0x00000100 #define F_RELATIVE 0x00000200 #define F_ERROR 0x00001000 #define F_ERROR_OPCODE 0x00002000 #define F_ERROR_LENGTH 0x00004000 #define F_ERROR_LOCK 0x00008000 #define F_ERROR_OPERAND 0x00010000 #define F_PREFIX_REPNZ 0x01000000 #define F_PREFIX_REPX 0x02000000 #define F_PREFIX_REP 0x03000000 #define F_PREFIX_66 0x04000000 #define F_PREFIX_67 0x08000000 #define F_PREFIX_LOCK 0x10000000 #define F_PREFIX_SEG 0x20000000 #define F_PREFIX_REX 0x40000000 #define F_PREFIX_ANY 0x7f000000 #define PREFIX_SEGMENT_CS 0x2e #define PREFIX_SEGMENT_SS 0x36 #define PREFIX_SEGMENT_DS 0x3e #define PREFIX_SEGMENT_ES 0x26 #define PREFIX_SEGMENT_FS 0x64 #define PREFIX_SEGMENT_GS 0x65 #define PREFIX_LOCK 0xf0 #define PREFIX_REPNZ 0xf2 #define PREFIX_REPX 0xf3 #define PREFIX_OPERAND_SIZE 0x66 #define PREFIX_ADDRESS_SIZE 0x67 #pragma pack(push,1) typedef struct { uint8_t len; uint8_t p_rep; uint8_t p_lock; uint8_t p_seg; uint8_t p_66; uint8_t p_67; uint8_t rex; uint8_t rex_w; uint8_t rex_r; uint8_t rex_x; uint8_t rex_b; uint8_t opcode; uint8_t opcode2; uint8_t modrm; uint8_t modrm_mod; uint8_t modrm_reg; uint8_t modrm_rm; uint8_t sib; uint8_t sib_scale; uint8_t sib_index; uint8_t sib_base; union { uint8_t imm8; uint16_t imm16; uint32_t imm32; uint64_t imm64; } imm; union { uint8_t disp8; uint16_t disp16; uint32_t disp32; } disp; uint32_t flags; } hde64s; #pragma pack(pop) #ifdef __cplusplus extern "C" { #endif /* __cdecl */ unsigned int hde64_disasm(const void *code, hde64s *hs); #ifdef __cplusplus } #endif #endif /* _HDE64_H_ */ mumble-1.3.4/3rdparty/minhook-src/src/hde/table32.h0000664000175000017500000000666414010707332021606 0ustar builderbuilder/* * Hacker Disassembler Engine 32 C * Copyright (c) 2008-2009, Vyacheslav Patkov. * All rights reserved. * */ #define C_NONE 0x00 #define C_MODRM 0x01 #define C_IMM8 0x02 #define C_IMM16 0x04 #define C_IMM_P66 0x10 #define C_REL8 0x20 #define C_REL32 0x40 #define C_GROUP 0x80 #define C_ERROR 0xff #define PRE_ANY 0x00 #define PRE_NONE 0x01 #define PRE_F2 0x02 #define PRE_F3 0x04 #define PRE_66 0x08 #define PRE_67 0x10 #define PRE_LOCK 0x20 #define PRE_SEG 0x40 #define PRE_ALL 0xff #define DELTA_OPCODES 0x4a #define DELTA_FPU_REG 0xf1 #define DELTA_FPU_MODRM 0xf8 #define DELTA_PREFIXES 0x130 #define DELTA_OP_LOCK_OK 0x1a1 #define DELTA_OP2_LOCK_OK 0x1b9 #define DELTA_OP_ONLY_MEM 0x1cb #define DELTA_OP2_ONLY_MEM 0x1da unsigned char hde32_table[] = { 0xa3,0xa8,0xa3,0xa8,0xa3,0xa8,0xa3,0xa8,0xa3,0xa8,0xa3,0xa8,0xa3,0xa8,0xa3, 0xa8,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xac,0xaa,0xb2,0xaa,0x9f,0x9f, 0x9f,0x9f,0xb5,0xa3,0xa3,0xa4,0xaa,0xaa,0xba,0xaa,0x96,0xaa,0xa8,0xaa,0xc3, 0xc3,0x96,0x96,0xb7,0xae,0xd6,0xbd,0xa3,0xc5,0xa3,0xa3,0x9f,0xc3,0x9c,0xaa, 0xaa,0xac,0xaa,0xbf,0x03,0x7f,0x11,0x7f,0x01,0x7f,0x01,0x3f,0x01,0x01,0x90, 0x82,0x7d,0x97,0x59,0x59,0x59,0x59,0x59,0x7f,0x59,0x59,0x60,0x7d,0x7f,0x7f, 0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x9a,0x88,0x7d, 0x59,0x50,0x50,0x50,0x50,0x59,0x59,0x59,0x59,0x61,0x94,0x61,0x9e,0x59,0x59, 0x85,0x59,0x92,0xa3,0x60,0x60,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59, 0x59,0x59,0x9f,0x01,0x03,0x01,0x04,0x03,0xd5,0x03,0xcc,0x01,0xbc,0x03,0xf0, 0x10,0x10,0x10,0x10,0x50,0x50,0x50,0x50,0x14,0x20,0x20,0x20,0x20,0x01,0x01, 0x01,0x01,0xc4,0x02,0x10,0x00,0x00,0x00,0x00,0x01,0x01,0xc0,0xc2,0x10,0x11, 0x02,0x03,0x11,0x03,0x03,0x04,0x00,0x00,0x14,0x00,0x02,0x00,0x00,0xc6,0xc8, 0x02,0x02,0x02,0x02,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xca, 0x01,0x01,0x01,0x00,0x06,0x00,0x04,0x00,0xc0,0xc2,0x01,0x01,0x03,0x01,0xff, 0xff,0x01,0x00,0x03,0xc4,0xc4,0xc6,0x03,0x01,0x01,0x01,0xff,0x03,0x03,0x03, 0xc8,0x40,0x00,0x0a,0x00,0x04,0x00,0x00,0x00,0x00,0x7f,0x00,0x33,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0xff,0xbf,0xff,0xff,0x00,0x00,0x00,0x00,0x07,0x00, 0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xff,0xff,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x7f,0x00,0x00,0xff,0x4a,0x4a,0x4a,0x4a,0x4b,0x52,0x4a,0x4a,0x4a,0x4a,0x4f, 0x4c,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x55,0x45,0x40,0x4a,0x4a,0x4a, 0x45,0x59,0x4d,0x46,0x4a,0x5d,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a, 0x4a,0x4a,0x4a,0x4a,0x4a,0x61,0x63,0x67,0x4e,0x4a,0x4a,0x6b,0x6d,0x4a,0x4a, 0x45,0x6d,0x4a,0x4a,0x44,0x45,0x4a,0x4a,0x00,0x00,0x00,0x02,0x0d,0x06,0x06, 0x06,0x06,0x0e,0x00,0x00,0x00,0x00,0x06,0x06,0x06,0x00,0x06,0x06,0x02,0x06, 0x00,0x0a,0x0a,0x07,0x07,0x06,0x02,0x05,0x05,0x02,0x02,0x00,0x00,0x04,0x04, 0x04,0x04,0x00,0x00,0x00,0x0e,0x05,0x06,0x06,0x06,0x01,0x06,0x00,0x00,0x08, 0x00,0x10,0x00,0x18,0x00,0x20,0x00,0x28,0x00,0x30,0x00,0x80,0x01,0x82,0x01, 0x86,0x00,0xf6,0xcf,0xfe,0x3f,0xab,0x00,0xb0,0x00,0xb1,0x00,0xb3,0x00,0xba, 0xf8,0xbb,0x00,0xc0,0x00,0xc1,0x00,0xc7,0xbf,0x62,0xff,0x00,0x8d,0xff,0x00, 0xc4,0xff,0x00,0xc5,0xff,0x00,0xff,0xff,0xeb,0x01,0xff,0x0e,0x12,0x08,0x00, 0x13,0x09,0x00,0x16,0x08,0x00,0x17,0x09,0x00,0x2b,0x09,0x00,0xae,0xff,0x07, 0xb2,0xff,0x00,0xb4,0xff,0x00,0xb5,0xff,0x00,0xc3,0x01,0x00,0xc7,0xff,0xbf, 0xe7,0x08,0x00,0xf0,0x02,0x00 }; mumble-1.3.4/3rdparty/minhook-src/src/trampoline.h0000664000175000017500000000725714010707332021763 0ustar builderbuilder/* * MinHook - The Minimalistic API Hooking Library for x64/x86 * Copyright (C) 2009-2017 Tsuda Kageyu. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #pragma once #pragma pack(push, 1) // Structs for writing x86/x64 instructions. // 8-bit relative jump. typedef struct _JMP_REL_SHORT { UINT8 opcode; // EB xx: JMP +2+xx UINT8 operand; } JMP_REL_SHORT, *PJMP_REL_SHORT; // 32-bit direct relative jump/call. typedef struct _JMP_REL { UINT8 opcode; // E9/E8 xxxxxxxx: JMP/CALL +5+xxxxxxxx UINT32 operand; // Relative destination address } JMP_REL, *PJMP_REL, CALL_REL; // 64-bit indirect absolute jump. typedef struct _JMP_ABS { UINT8 opcode0; // FF25 00000000: JMP [+6] UINT8 opcode1; UINT32 dummy; UINT64 address; // Absolute destination address } JMP_ABS, *PJMP_ABS; // 64-bit indirect absolute call. typedef struct _CALL_ABS { UINT8 opcode0; // FF15 00000002: CALL [+6] UINT8 opcode1; UINT32 dummy0; UINT8 dummy1; // EB 08: JMP +10 UINT8 dummy2; UINT64 address; // Absolute destination address } CALL_ABS; // 32-bit direct relative conditional jumps. typedef struct _JCC_REL { UINT8 opcode0; // 0F8* xxxxxxxx: J** +6+xxxxxxxx UINT8 opcode1; UINT32 operand; // Relative destination address } JCC_REL; // 64bit indirect absolute conditional jumps that x64 lacks. typedef struct _JCC_ABS { UINT8 opcode; // 7* 0E: J** +16 UINT8 dummy0; UINT8 dummy1; // FF25 00000000: JMP [+6] UINT8 dummy2; UINT32 dummy3; UINT64 address; // Absolute destination address } JCC_ABS; #pragma pack(pop) typedef struct _TRAMPOLINE { LPVOID pTarget; // [In] Address of the target function. LPVOID pDetour; // [In] Address of the detour function. LPVOID pTrampoline; // [In] Buffer address for the trampoline and relay function. #if defined(_M_X64) || defined(__x86_64__) LPVOID pRelay; // [Out] Address of the relay function. #endif BOOL patchAbove; // [Out] Should use the hot patch area? UINT nIP; // [Out] Number of the instruction boundaries. UINT8 oldIPs[8]; // [Out] Instruction boundaries of the target function. UINT8 newIPs[8]; // [Out] Instruction boundaries of the trampoline function. } TRAMPOLINE, *PTRAMPOLINE; BOOL CreateTrampolineFunction(PTRAMPOLINE ct); mumble-1.3.4/3rdparty/minhook-src/src/buffer.h0000664000175000017500000000343414010707332021053 0ustar builderbuilder/* * MinHook - The Minimalistic API Hooking Library for x64/x86 * Copyright (C) 2009-2017 Tsuda Kageyu. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #pragma once // Size of each memory slot. #if defined(_M_X64) || defined(__x86_64__) #define MEMORY_SLOT_SIZE 64 #else #define MEMORY_SLOT_SIZE 32 #endif VOID InitializeBuffer(VOID); VOID UninitializeBuffer(VOID); LPVOID AllocateBuffer(LPVOID pOrigin); VOID FreeBuffer(LPVOID pBuffer); BOOL IsExecutableAddress(LPVOID pAddress); mumble-1.3.4/3rdparty/minhook-src/src/trampoline.c0000664000175000017500000002451614010707332021753 0ustar builderbuilder/* * MinHook - The Minimalistic API Hooking Library for x64/x86 * Copyright (C) 2009-2017 Tsuda Kageyu. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #ifndef ARRAYSIZE #define ARRAYSIZE(A) (sizeof(A)/sizeof((A)[0])) #endif #if defined(_M_X64) || defined(__x86_64__) #include "./hde/hde64.h" typedef hde64s HDE; #define HDE_DISASM(code, hs) hde64_disasm(code, hs) #else #include "./hde/hde32.h" typedef hde32s HDE; #define HDE_DISASM(code, hs) hde32_disasm(code, hs) #endif #include "trampoline.h" #include "buffer.h" // Maximum size of a trampoline function. #if defined(_M_X64) || defined(__x86_64__) #define TRAMPOLINE_MAX_SIZE (MEMORY_SLOT_SIZE - sizeof(JMP_ABS)) #else #define TRAMPOLINE_MAX_SIZE MEMORY_SLOT_SIZE #endif //------------------------------------------------------------------------- static BOOL IsCodePadding(LPBYTE pInst, UINT size) { UINT i; if (pInst[0] != 0x00 && pInst[0] != 0x90 && pInst[0] != 0xCC) return FALSE; for (i = 1; i < size; ++i) { if (pInst[i] != pInst[0]) return FALSE; } return TRUE; } //------------------------------------------------------------------------- BOOL CreateTrampolineFunction(PTRAMPOLINE ct) { #if defined(_M_X64) || defined(__x86_64__) CALL_ABS call = { 0xFF, 0x15, 0x00000002, // FF15 00000002: CALL [RIP+8] 0xEB, 0x08, // EB 08: JMP +10 0x0000000000000000ULL // Absolute destination address }; JMP_ABS jmp = { 0xFF, 0x25, 0x00000000, // FF25 00000000: JMP [RIP+6] 0x0000000000000000ULL // Absolute destination address }; JCC_ABS jcc = { 0x70, 0x0E, // 7* 0E: J** +16 0xFF, 0x25, 0x00000000, // FF25 00000000: JMP [RIP+6] 0x0000000000000000ULL // Absolute destination address }; #else CALL_REL call = { 0xE8, // E8 xxxxxxxx: CALL +5+xxxxxxxx 0x00000000 // Relative destination address }; JMP_REL jmp = { 0xE9, // E9 xxxxxxxx: JMP +5+xxxxxxxx 0x00000000 // Relative destination address }; JCC_REL jcc = { 0x0F, 0x80, // 0F8* xxxxxxxx: J** +6+xxxxxxxx 0x00000000 // Relative destination address }; #endif UINT8 oldPos = 0; UINT8 newPos = 0; ULONG_PTR jmpDest = 0; // Destination address of an internal jump. BOOL finished = FALSE; // Is the function completed? #if defined(_M_X64) || defined(__x86_64__) UINT8 instBuf[16]; #endif ct->patchAbove = FALSE; ct->nIP = 0; do { HDE hs; UINT copySize; LPVOID pCopySrc; ULONG_PTR pOldInst = (ULONG_PTR)ct->pTarget + oldPos; ULONG_PTR pNewInst = (ULONG_PTR)ct->pTrampoline + newPos; copySize = HDE_DISASM((LPVOID)pOldInst, &hs); if (hs.flags & F_ERROR) return FALSE; pCopySrc = (LPVOID)pOldInst; if (oldPos >= sizeof(JMP_REL)) { // The trampoline function is long enough. // Complete the function with the jump to the target function. #if defined(_M_X64) || defined(__x86_64__) jmp.address = pOldInst; #else jmp.operand = (UINT32)(pOldInst - (pNewInst + sizeof(jmp))); #endif pCopySrc = &jmp; copySize = sizeof(jmp); finished = TRUE; } #if defined(_M_X64) || defined(__x86_64__) else if ((hs.modrm & 0xC7) == 0x05) { // Instructions using RIP relative addressing. (ModR/M = 00???101B) // Modify the RIP relative address. PUINT32 pRelAddr; // Avoid using memcpy to reduce the footprint. #ifndef _MSC_VER memcpy(instBuf, (LPBYTE)pOldInst, copySize); #else __movsb(instBuf, (LPBYTE)pOldInst, copySize); #endif pCopySrc = instBuf; // Relative address is stored at (instruction length - immediate value length - 4). pRelAddr = (PUINT32)(instBuf + hs.len - ((hs.flags & 0x3C) >> 2) - 4); *pRelAddr = (UINT32)((pOldInst + hs.len + (INT32)hs.disp.disp32) - (pNewInst + hs.len)); // Complete the function if JMP (FF /4). if (hs.opcode == 0xFF && hs.modrm_reg == 4) finished = TRUE; } #endif else if (hs.opcode == 0xE8) { // Direct relative CALL ULONG_PTR dest = pOldInst + hs.len + (INT32)hs.imm.imm32; #if defined(_M_X64) || defined(__x86_64__) call.address = dest; #else call.operand = (UINT32)(dest - (pNewInst + sizeof(call))); #endif pCopySrc = &call; copySize = sizeof(call); } else if ((hs.opcode & 0xFD) == 0xE9) { // Direct relative JMP (EB or E9) ULONG_PTR dest = pOldInst + hs.len; if (hs.opcode == 0xEB) // isShort jmp dest += (INT8)hs.imm.imm8; else dest += (INT32)hs.imm.imm32; // Simply copy an internal jump. if ((ULONG_PTR)ct->pTarget <= dest && dest < ((ULONG_PTR)ct->pTarget + sizeof(JMP_REL))) { if (jmpDest < dest) jmpDest = dest; } else { #if defined(_M_X64) || defined(__x86_64__) jmp.address = dest; #else jmp.operand = (UINT32)(dest - (pNewInst + sizeof(jmp))); #endif pCopySrc = &jmp; copySize = sizeof(jmp); // Exit the function If it is not in the branch finished = (pOldInst >= jmpDest); } } else if ((hs.opcode & 0xF0) == 0x70 || (hs.opcode & 0xFC) == 0xE0 || (hs.opcode2 & 0xF0) == 0x80) { // Direct relative Jcc ULONG_PTR dest = pOldInst + hs.len; if ((hs.opcode & 0xF0) == 0x70 // Jcc || (hs.opcode & 0xFC) == 0xE0) // LOOPNZ/LOOPZ/LOOP/JECXZ dest += (INT8)hs.imm.imm8; else dest += (INT32)hs.imm.imm32; // Simply copy an internal jump. if ((ULONG_PTR)ct->pTarget <= dest && dest < ((ULONG_PTR)ct->pTarget + sizeof(JMP_REL))) { if (jmpDest < dest) jmpDest = dest; } else if ((hs.opcode & 0xFC) == 0xE0) { // LOOPNZ/LOOPZ/LOOP/JCXZ/JECXZ to the outside are not supported. return FALSE; } else { UINT8 cond = ((hs.opcode != 0x0F ? hs.opcode : hs.opcode2) & 0x0F); #if defined(_M_X64) || defined(__x86_64__) // Invert the condition in x64 mode to simplify the conditional jump logic. jcc.opcode = 0x71 ^ cond; jcc.address = dest; #else jcc.opcode1 = 0x80 | cond; jcc.operand = (UINT32)(dest - (pNewInst + sizeof(jcc))); #endif pCopySrc = &jcc; copySize = sizeof(jcc); } } else if ((hs.opcode & 0xFE) == 0xC2) { // RET (C2 or C3) // Complete the function if not in a branch. finished = (pOldInst >= jmpDest); } // Can't alter the instruction length in a branch. if (pOldInst < jmpDest && copySize != hs.len) return FALSE; // Trampoline function is too large. if ((newPos + copySize) > TRAMPOLINE_MAX_SIZE) return FALSE; // Trampoline function has too many instructions. if (ct->nIP >= ARRAYSIZE(ct->oldIPs)) return FALSE; ct->oldIPs[ct->nIP] = oldPos; ct->newIPs[ct->nIP] = newPos; ct->nIP++; // Avoid using memcpy to reduce the footprint. #ifndef _MSC_VER memcpy((LPBYTE)ct->pTrampoline + newPos, pCopySrc, copySize); #else __movsb((LPBYTE)ct->pTrampoline + newPos, pCopySrc, copySize); #endif newPos += copySize; oldPos += hs.len; } while (!finished); // Is there enough place for a long jump? if (oldPos < sizeof(JMP_REL) && !IsCodePadding((LPBYTE)ct->pTarget + oldPos, sizeof(JMP_REL) - oldPos)) { // Is there enough place for a short jump? if (oldPos < sizeof(JMP_REL_SHORT) && !IsCodePadding((LPBYTE)ct->pTarget + oldPos, sizeof(JMP_REL_SHORT) - oldPos)) { return FALSE; } // Can we place the long jump above the function? if (!IsExecutableAddress((LPBYTE)ct->pTarget - sizeof(JMP_REL))) return FALSE; if (!IsCodePadding((LPBYTE)ct->pTarget - sizeof(JMP_REL), sizeof(JMP_REL))) return FALSE; ct->patchAbove = TRUE; } #if defined(_M_X64) || defined(__x86_64__) // Create a relay function. jmp.address = (ULONG_PTR)ct->pDetour; ct->pRelay = (LPBYTE)ct->pTrampoline + newPos; memcpy(ct->pRelay, &jmp, sizeof(jmp)); #endif return TRUE; } mumble-1.3.4/3rdparty/minhook-src/src/hook.c0000664000175000017500000006072314010707332020541 0ustar builderbuilder/* * MinHook - The Minimalistic API Hooking Library for x64/x86 * Copyright (C) 2009-2017 Tsuda Kageyu. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include "../include/MinHook.h" #include "buffer.h" #include "trampoline.h" #ifndef ARRAYSIZE #define ARRAYSIZE(A) (sizeof(A)/sizeof((A)[0])) #endif // Initial capacity of the HOOK_ENTRY buffer. #define INITIAL_HOOK_CAPACITY 32 // Initial capacity of the thread IDs buffer. #define INITIAL_THREAD_CAPACITY 128 // Special hook position values. #define INVALID_HOOK_POS UINT_MAX #define ALL_HOOKS_POS UINT_MAX // Freeze() action argument defines. #define ACTION_DISABLE 0 #define ACTION_ENABLE 1 #define ACTION_APPLY_QUEUED 2 // Thread access rights for suspending/resuming threads. #define THREAD_ACCESS \ (THREAD_SUSPEND_RESUME | THREAD_GET_CONTEXT | THREAD_QUERY_INFORMATION | THREAD_SET_CONTEXT) // Hook information. typedef struct _HOOK_ENTRY { LPVOID pTarget; // Address of the target function. LPVOID pDetour; // Address of the detour or relay function. LPVOID pTrampoline; // Address of the trampoline function. UINT8 backup[8]; // Original prologue of the target function. UINT8 patchAbove : 1; // Uses the hot patch area. UINT8 isEnabled : 1; // Enabled. UINT8 queueEnable : 1; // Queued for enabling/disabling when != isEnabled. UINT nIP : 4; // Count of the instruction boundaries. UINT8 oldIPs[8]; // Instruction boundaries of the target function. UINT8 newIPs[8]; // Instruction boundaries of the trampoline function. } HOOK_ENTRY, *PHOOK_ENTRY; // Suspended threads for Freeze()/Unfreeze(). typedef struct _FROZEN_THREADS { LPDWORD pItems; // Data heap UINT capacity; // Size of allocated data heap, items UINT size; // Actual number of data items } FROZEN_THREADS, *PFROZEN_THREADS; //------------------------------------------------------------------------- // Global Variables: //------------------------------------------------------------------------- // Spin lock flag for EnterSpinLock()/LeaveSpinLock(). volatile LONG g_isLocked = FALSE; // Private heap handle. If not NULL, this library is initialized. HANDLE g_hHeap = NULL; // Hook entries. struct { PHOOK_ENTRY pItems; // Data heap UINT capacity; // Size of allocated data heap, items UINT size; // Actual number of data items } g_hooks; //------------------------------------------------------------------------- // Returns INVALID_HOOK_POS if not found. static UINT FindHookEntry(LPVOID pTarget) { UINT i; for (i = 0; i < g_hooks.size; ++i) { if ((ULONG_PTR)pTarget == (ULONG_PTR)g_hooks.pItems[i].pTarget) return i; } return INVALID_HOOK_POS; } //------------------------------------------------------------------------- static PHOOK_ENTRY AddHookEntry() { if (g_hooks.pItems == NULL) { g_hooks.capacity = INITIAL_HOOK_CAPACITY; g_hooks.pItems = (PHOOK_ENTRY)HeapAlloc( g_hHeap, 0, g_hooks.capacity * sizeof(HOOK_ENTRY)); if (g_hooks.pItems == NULL) return NULL; } else if (g_hooks.size >= g_hooks.capacity) { PHOOK_ENTRY p = (PHOOK_ENTRY)HeapReAlloc( g_hHeap, 0, g_hooks.pItems, (g_hooks.capacity * 2) * sizeof(HOOK_ENTRY)); if (p == NULL) return NULL; g_hooks.capacity *= 2; g_hooks.pItems = p; } return &g_hooks.pItems[g_hooks.size++]; } //------------------------------------------------------------------------- static void DeleteHookEntry(UINT pos) { if (pos < g_hooks.size - 1) g_hooks.pItems[pos] = g_hooks.pItems[g_hooks.size - 1]; g_hooks.size--; if (g_hooks.capacity / 2 >= INITIAL_HOOK_CAPACITY && g_hooks.capacity / 2 >= g_hooks.size) { PHOOK_ENTRY p = (PHOOK_ENTRY)HeapReAlloc( g_hHeap, 0, g_hooks.pItems, (g_hooks.capacity / 2) * sizeof(HOOK_ENTRY)); if (p == NULL) return; g_hooks.capacity /= 2; g_hooks.pItems = p; } } //------------------------------------------------------------------------- static DWORD_PTR FindOldIP(PHOOK_ENTRY pHook, DWORD_PTR ip) { UINT i; if (pHook->patchAbove && ip == ((DWORD_PTR)pHook->pTarget - sizeof(JMP_REL))) return (DWORD_PTR)pHook->pTarget; for (i = 0; i < pHook->nIP; ++i) { if (ip == ((DWORD_PTR)pHook->pTrampoline + pHook->newIPs[i])) return (DWORD_PTR)pHook->pTarget + pHook->oldIPs[i]; } #if defined(_M_X64) || defined(__x86_64__) // Check relay function. if (ip == (DWORD_PTR)pHook->pDetour) return (DWORD_PTR)pHook->pTarget; #endif return 0; } //------------------------------------------------------------------------- static DWORD_PTR FindNewIP(PHOOK_ENTRY pHook, DWORD_PTR ip) { UINT i; for (i = 0; i < pHook->nIP; ++i) { if (ip == ((DWORD_PTR)pHook->pTarget + pHook->oldIPs[i])) return (DWORD_PTR)pHook->pTrampoline + pHook->newIPs[i]; } return 0; } //------------------------------------------------------------------------- static void ProcessThreadIPs(HANDLE hThread, UINT pos, UINT action) { // If the thread suspended in the overwritten area, // move IP to the proper address. CONTEXT c; #if defined(_M_X64) || defined(__x86_64__) DWORD64 *pIP = &c.Rip; #else DWORD *pIP = &c.Eip; #endif UINT count; c.ContextFlags = CONTEXT_CONTROL; if (!GetThreadContext(hThread, &c)) return; if (pos == ALL_HOOKS_POS) { pos = 0; count = g_hooks.size; } else { count = pos + 1; } for (; pos < count; ++pos) { PHOOK_ENTRY pHook = &g_hooks.pItems[pos]; BOOL enable; DWORD_PTR ip; switch (action) { case ACTION_DISABLE: enable = FALSE; break; case ACTION_ENABLE: enable = TRUE; break; default: // ACTION_APPLY_QUEUED enable = pHook->queueEnable; break; } if (pHook->isEnabled == enable) continue; if (enable) ip = FindNewIP(pHook, *pIP); else ip = FindOldIP(pHook, *pIP); if (ip != 0) { *pIP = ip; SetThreadContext(hThread, &c); } } } //------------------------------------------------------------------------- static VOID EnumerateThreads(PFROZEN_THREADS pThreads) { HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); if (hSnapshot != INVALID_HANDLE_VALUE) { THREADENTRY32 te; te.dwSize = sizeof(THREADENTRY32); if (Thread32First(hSnapshot, &te)) { do { if (te.dwSize >= (FIELD_OFFSET(THREADENTRY32, th32OwnerProcessID) + sizeof(DWORD)) && te.th32OwnerProcessID == GetCurrentProcessId() && te.th32ThreadID != GetCurrentThreadId()) { if (pThreads->pItems == NULL) { pThreads->capacity = INITIAL_THREAD_CAPACITY; pThreads->pItems = (LPDWORD)HeapAlloc(g_hHeap, 0, pThreads->capacity * sizeof(DWORD)); if (pThreads->pItems == NULL) break; } else if (pThreads->size >= pThreads->capacity) { LPDWORD p = (LPDWORD)HeapReAlloc( g_hHeap, 0, pThreads->pItems, (pThreads->capacity * 2) * sizeof(DWORD)); if (p == NULL) break; pThreads->capacity *= 2; pThreads->pItems = p; } pThreads->pItems[pThreads->size++] = te.th32ThreadID; } te.dwSize = sizeof(THREADENTRY32); } while (Thread32Next(hSnapshot, &te)); } CloseHandle(hSnapshot); } } //------------------------------------------------------------------------- static VOID Freeze(PFROZEN_THREADS pThreads, UINT pos, UINT action) { pThreads->pItems = NULL; pThreads->capacity = 0; pThreads->size = 0; EnumerateThreads(pThreads); if (pThreads->pItems != NULL) { UINT i; for (i = 0; i < pThreads->size; ++i) { HANDLE hThread = OpenThread(THREAD_ACCESS, FALSE, pThreads->pItems[i]); if (hThread != NULL) { SuspendThread(hThread); ProcessThreadIPs(hThread, pos, action); CloseHandle(hThread); } } } } //------------------------------------------------------------------------- static VOID Unfreeze(PFROZEN_THREADS pThreads) { if (pThreads->pItems != NULL) { UINT i; for (i = 0; i < pThreads->size; ++i) { HANDLE hThread = OpenThread(THREAD_ACCESS, FALSE, pThreads->pItems[i]); if (hThread != NULL) { ResumeThread(hThread); CloseHandle(hThread); } } HeapFree(g_hHeap, 0, pThreads->pItems); } } //------------------------------------------------------------------------- static MH_STATUS EnableHookLL(UINT pos, BOOL enable) { PHOOK_ENTRY pHook = &g_hooks.pItems[pos]; DWORD oldProtect; SIZE_T patchSize = sizeof(JMP_REL); LPBYTE pPatchTarget = (LPBYTE)pHook->pTarget; if (pHook->patchAbove) { pPatchTarget -= sizeof(JMP_REL); patchSize += sizeof(JMP_REL_SHORT); } if (!VirtualProtect(pPatchTarget, patchSize, PAGE_EXECUTE_READWRITE, &oldProtect)) return MH_ERROR_MEMORY_PROTECT; if (enable) { PJMP_REL pJmp = (PJMP_REL)pPatchTarget; pJmp->opcode = 0xE9; pJmp->operand = (UINT32)((LPBYTE)pHook->pDetour - (pPatchTarget + sizeof(JMP_REL))); if (pHook->patchAbove) { PJMP_REL_SHORT pShortJmp = (PJMP_REL_SHORT)pHook->pTarget; pShortJmp->opcode = 0xEB; pShortJmp->operand = (UINT8)(0 - (sizeof(JMP_REL_SHORT) + sizeof(JMP_REL))); } } else { if (pHook->patchAbove) memcpy(pPatchTarget, pHook->backup, sizeof(JMP_REL) + sizeof(JMP_REL_SHORT)); else memcpy(pPatchTarget, pHook->backup, sizeof(JMP_REL)); } VirtualProtect(pPatchTarget, patchSize, oldProtect, &oldProtect); // Just-in-case measure. FlushInstructionCache(GetCurrentProcess(), pPatchTarget, patchSize); pHook->isEnabled = enable; pHook->queueEnable = enable; return MH_OK; } //------------------------------------------------------------------------- static MH_STATUS EnableAllHooksLL(BOOL enable) { MH_STATUS status = MH_OK; UINT i, first = INVALID_HOOK_POS; for (i = 0; i < g_hooks.size; ++i) { if (g_hooks.pItems[i].isEnabled != enable) { first = i; break; } } if (first != INVALID_HOOK_POS) { FROZEN_THREADS threads; Freeze(&threads, ALL_HOOKS_POS, enable ? ACTION_ENABLE : ACTION_DISABLE); for (i = first; i < g_hooks.size; ++i) { if (g_hooks.pItems[i].isEnabled != enable) { status = EnableHookLL(i, enable); if (status != MH_OK) break; } } Unfreeze(&threads); } return status; } //------------------------------------------------------------------------- static VOID EnterSpinLock(VOID) { SIZE_T spinCount = 0; // Wait until the flag is FALSE. while (InterlockedCompareExchange(&g_isLocked, TRUE, FALSE) != FALSE) { // No need to generate a memory barrier here, since InterlockedCompareExchange() // generates a full memory barrier itself. // Prevent the loop from being too busy. if (spinCount < 32) Sleep(0); else Sleep(1); spinCount++; } } //------------------------------------------------------------------------- static VOID LeaveSpinLock(VOID) { // No need to generate a memory barrier here, since InterlockedExchange() // generates a full memory barrier itself. InterlockedExchange(&g_isLocked, FALSE); } //------------------------------------------------------------------------- MH_STATUS WINAPI MH_Initialize(VOID) { MH_STATUS status = MH_OK; EnterSpinLock(); if (g_hHeap == NULL) { g_hHeap = HeapCreate(0, 0, 0); if (g_hHeap != NULL) { // Initialize the internal function buffer. InitializeBuffer(); } else { status = MH_ERROR_MEMORY_ALLOC; } } else { status = MH_ERROR_ALREADY_INITIALIZED; } LeaveSpinLock(); return status; } //------------------------------------------------------------------------- MH_STATUS WINAPI MH_Uninitialize(VOID) { MH_STATUS status = MH_OK; EnterSpinLock(); if (g_hHeap != NULL) { status = EnableAllHooksLL(FALSE); if (status == MH_OK) { // Free the internal function buffer. // HeapFree is actually not required, but some tools detect a false // memory leak without HeapFree. UninitializeBuffer(); HeapFree(g_hHeap, 0, g_hooks.pItems); HeapDestroy(g_hHeap); g_hHeap = NULL; g_hooks.pItems = NULL; g_hooks.capacity = 0; g_hooks.size = 0; } } else { status = MH_ERROR_NOT_INITIALIZED; } LeaveSpinLock(); return status; } //------------------------------------------------------------------------- MH_STATUS WINAPI MH_CreateHook(LPVOID pTarget, LPVOID pDetour, LPVOID *ppOriginal) { MH_STATUS status = MH_OK; EnterSpinLock(); if (g_hHeap != NULL) { if (IsExecutableAddress(pTarget) && IsExecutableAddress(pDetour)) { UINT pos = FindHookEntry(pTarget); if (pos == INVALID_HOOK_POS) { LPVOID pBuffer = AllocateBuffer(pTarget); if (pBuffer != NULL) { TRAMPOLINE ct; ct.pTarget = pTarget; ct.pDetour = pDetour; ct.pTrampoline = pBuffer; if (CreateTrampolineFunction(&ct)) { PHOOK_ENTRY pHook = AddHookEntry(); if (pHook != NULL) { pHook->pTarget = ct.pTarget; #if defined(_M_X64) || defined(__x86_64__) pHook->pDetour = ct.pRelay; #else pHook->pDetour = ct.pDetour; #endif pHook->pTrampoline = ct.pTrampoline; pHook->patchAbove = ct.patchAbove; pHook->isEnabled = FALSE; pHook->queueEnable = FALSE; pHook->nIP = ct.nIP; memcpy(pHook->oldIPs, ct.oldIPs, ARRAYSIZE(ct.oldIPs)); memcpy(pHook->newIPs, ct.newIPs, ARRAYSIZE(ct.newIPs)); // Back up the target function. if (ct.patchAbove) { memcpy( pHook->backup, (LPBYTE)pTarget - sizeof(JMP_REL), sizeof(JMP_REL) + sizeof(JMP_REL_SHORT)); } else { memcpy(pHook->backup, pTarget, sizeof(JMP_REL)); } if (ppOriginal != NULL) *ppOriginal = pHook->pTrampoline; } else { status = MH_ERROR_MEMORY_ALLOC; } } else { status = MH_ERROR_UNSUPPORTED_FUNCTION; } if (status != MH_OK) { FreeBuffer(pBuffer); } } else { status = MH_ERROR_MEMORY_ALLOC; } } else { status = MH_ERROR_ALREADY_CREATED; } } else { status = MH_ERROR_NOT_EXECUTABLE; } } else { status = MH_ERROR_NOT_INITIALIZED; } LeaveSpinLock(); return status; } //------------------------------------------------------------------------- MH_STATUS WINAPI MH_RemoveHook(LPVOID pTarget) { MH_STATUS status = MH_OK; EnterSpinLock(); if (g_hHeap != NULL) { UINT pos = FindHookEntry(pTarget); if (pos != INVALID_HOOK_POS) { if (g_hooks.pItems[pos].isEnabled) { FROZEN_THREADS threads; Freeze(&threads, pos, ACTION_DISABLE); status = EnableHookLL(pos, FALSE); Unfreeze(&threads); } if (status == MH_OK) { FreeBuffer(g_hooks.pItems[pos].pTrampoline); DeleteHookEntry(pos); } } else { status = MH_ERROR_NOT_CREATED; } } else { status = MH_ERROR_NOT_INITIALIZED; } LeaveSpinLock(); return status; } //------------------------------------------------------------------------- static MH_STATUS EnableHook(LPVOID pTarget, BOOL enable) { MH_STATUS status = MH_OK; EnterSpinLock(); if (g_hHeap != NULL) { if (pTarget == MH_ALL_HOOKS) { status = EnableAllHooksLL(enable); } else { FROZEN_THREADS threads; UINT pos = FindHookEntry(pTarget); if (pos != INVALID_HOOK_POS) { if (g_hooks.pItems[pos].isEnabled != enable) { Freeze(&threads, pos, ACTION_ENABLE); status = EnableHookLL(pos, enable); Unfreeze(&threads); } else { status = enable ? MH_ERROR_ENABLED : MH_ERROR_DISABLED; } } else { status = MH_ERROR_NOT_CREATED; } } } else { status = MH_ERROR_NOT_INITIALIZED; } LeaveSpinLock(); return status; } //------------------------------------------------------------------------- MH_STATUS WINAPI MH_EnableHook(LPVOID pTarget) { return EnableHook(pTarget, TRUE); } //------------------------------------------------------------------------- MH_STATUS WINAPI MH_DisableHook(LPVOID pTarget) { return EnableHook(pTarget, FALSE); } //------------------------------------------------------------------------- static MH_STATUS QueueHook(LPVOID pTarget, BOOL queueEnable) { MH_STATUS status = MH_OK; EnterSpinLock(); if (g_hHeap != NULL) { if (pTarget == MH_ALL_HOOKS) { UINT i; for (i = 0; i < g_hooks.size; ++i) g_hooks.pItems[i].queueEnable = queueEnable; } else { UINT pos = FindHookEntry(pTarget); if (pos != INVALID_HOOK_POS) { g_hooks.pItems[pos].queueEnable = queueEnable; } else { status = MH_ERROR_NOT_CREATED; } } } else { status = MH_ERROR_NOT_INITIALIZED; } LeaveSpinLock(); return status; } //------------------------------------------------------------------------- MH_STATUS WINAPI MH_QueueEnableHook(LPVOID pTarget) { return QueueHook(pTarget, TRUE); } //------------------------------------------------------------------------- MH_STATUS WINAPI MH_QueueDisableHook(LPVOID pTarget) { return QueueHook(pTarget, FALSE); } //------------------------------------------------------------------------- MH_STATUS WINAPI MH_ApplyQueued(VOID) { MH_STATUS status = MH_OK; UINT i, first = INVALID_HOOK_POS; EnterSpinLock(); if (g_hHeap != NULL) { for (i = 0; i < g_hooks.size; ++i) { if (g_hooks.pItems[i].isEnabled != g_hooks.pItems[i].queueEnable) { first = i; break; } } if (first != INVALID_HOOK_POS) { FROZEN_THREADS threads; Freeze(&threads, ALL_HOOKS_POS, ACTION_APPLY_QUEUED); for (i = first; i < g_hooks.size; ++i) { PHOOK_ENTRY pHook = &g_hooks.pItems[i]; if (pHook->isEnabled != pHook->queueEnable) { status = EnableHookLL(i, pHook->queueEnable); if (status != MH_OK) break; } } Unfreeze(&threads); } } else { status = MH_ERROR_NOT_INITIALIZED; } LeaveSpinLock(); return status; } //------------------------------------------------------------------------- MH_STATUS WINAPI MH_CreateHookApiEx( LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID *ppOriginal, LPVOID *ppTarget) { HMODULE hModule; LPVOID pTarget; hModule = GetModuleHandleW(pszModule); if (hModule == NULL) return MH_ERROR_MODULE_NOT_FOUND; pTarget = (LPVOID)GetProcAddress(hModule, pszProcName); if (pTarget == NULL) return MH_ERROR_FUNCTION_NOT_FOUND; if(ppTarget != NULL) *ppTarget = pTarget; return MH_CreateHook(pTarget, pDetour, ppOriginal); } //------------------------------------------------------------------------- MH_STATUS WINAPI MH_CreateHookApi( LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID *ppOriginal) { return MH_CreateHookApiEx(pszModule, pszProcName, pDetour, ppOriginal, NULL); } //------------------------------------------------------------------------- const char * WINAPI MH_StatusToString(MH_STATUS status) { #define MH_ST2STR(x) \ case x: \ return #x; switch (status) { MH_ST2STR(MH_UNKNOWN) MH_ST2STR(MH_OK) MH_ST2STR(MH_ERROR_ALREADY_INITIALIZED) MH_ST2STR(MH_ERROR_NOT_INITIALIZED) MH_ST2STR(MH_ERROR_ALREADY_CREATED) MH_ST2STR(MH_ERROR_NOT_CREATED) MH_ST2STR(MH_ERROR_ENABLED) MH_ST2STR(MH_ERROR_DISABLED) MH_ST2STR(MH_ERROR_NOT_EXECUTABLE) MH_ST2STR(MH_ERROR_UNSUPPORTED_FUNCTION) MH_ST2STR(MH_ERROR_MEMORY_ALLOC) MH_ST2STR(MH_ERROR_MEMORY_PROTECT) MH_ST2STR(MH_ERROR_MODULE_NOT_FOUND) MH_ST2STR(MH_ERROR_FUNCTION_NOT_FOUND) } #undef MH_ST2STR return "(unknown)"; } mumble-1.3.4/3rdparty/minhook-src/src/buffer.c0000664000175000017500000002312114010707332021041 0ustar builderbuilder/* * MinHook - The Minimalistic API Hooking Library for x64/x86 * Copyright (C) 2009-2017 Tsuda Kageyu. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include "buffer.h" // Size of each memory block. (= page size of VirtualAlloc) #define MEMORY_BLOCK_SIZE 0x1000 // Max range for seeking a memory block. (= 1024MB) #define MAX_MEMORY_RANGE 0x40000000 // Memory protection flags to check the executable address. #define PAGE_EXECUTE_FLAGS \ (PAGE_EXECUTE | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY) // Memory slot. typedef struct _MEMORY_SLOT { union { struct _MEMORY_SLOT *pNext; UINT8 buffer[MEMORY_SLOT_SIZE]; }; } MEMORY_SLOT, *PMEMORY_SLOT; // Memory block info. Placed at the head of each block. typedef struct _MEMORY_BLOCK { struct _MEMORY_BLOCK *pNext; PMEMORY_SLOT pFree; // First element of the free slot list. UINT usedCount; } MEMORY_BLOCK, *PMEMORY_BLOCK; //------------------------------------------------------------------------- // Global Variables: //------------------------------------------------------------------------- // First element of the memory block list. PMEMORY_BLOCK g_pMemoryBlocks; //------------------------------------------------------------------------- VOID InitializeBuffer(VOID) { // Nothing to do for now. } //------------------------------------------------------------------------- VOID UninitializeBuffer(VOID) { PMEMORY_BLOCK pBlock = g_pMemoryBlocks; g_pMemoryBlocks = NULL; while (pBlock) { PMEMORY_BLOCK pNext = pBlock->pNext; VirtualFree(pBlock, 0, MEM_RELEASE); pBlock = pNext; } } //------------------------------------------------------------------------- #if defined(_M_X64) || defined(__x86_64__) static LPVOID FindPrevFreeRegion(LPVOID pAddress, LPVOID pMinAddr, DWORD dwAllocationGranularity) { ULONG_PTR tryAddr = (ULONG_PTR)pAddress; // Round down to the allocation granularity. tryAddr -= tryAddr % dwAllocationGranularity; // Start from the previous allocation granularity multiply. tryAddr -= dwAllocationGranularity; while (tryAddr >= (ULONG_PTR)pMinAddr) { MEMORY_BASIC_INFORMATION mbi; if (VirtualQuery((LPVOID)tryAddr, &mbi, sizeof(mbi)) == 0) break; if (mbi.State == MEM_FREE) return (LPVOID)tryAddr; if ((ULONG_PTR)mbi.AllocationBase < dwAllocationGranularity) break; tryAddr = (ULONG_PTR)mbi.AllocationBase - dwAllocationGranularity; } return NULL; } #endif //------------------------------------------------------------------------- #if defined(_M_X64) || defined(__x86_64__) static LPVOID FindNextFreeRegion(LPVOID pAddress, LPVOID pMaxAddr, DWORD dwAllocationGranularity) { ULONG_PTR tryAddr = (ULONG_PTR)pAddress; // Round down to the allocation granularity. tryAddr -= tryAddr % dwAllocationGranularity; // Start from the next allocation granularity multiply. tryAddr += dwAllocationGranularity; while (tryAddr <= (ULONG_PTR)pMaxAddr) { MEMORY_BASIC_INFORMATION mbi; if (VirtualQuery((LPVOID)tryAddr, &mbi, sizeof(mbi)) == 0) break; if (mbi.State == MEM_FREE) return (LPVOID)tryAddr; tryAddr = (ULONG_PTR)mbi.BaseAddress + mbi.RegionSize; // Round up to the next allocation granularity. tryAddr += dwAllocationGranularity - 1; tryAddr -= tryAddr % dwAllocationGranularity; } return NULL; } #endif //------------------------------------------------------------------------- static PMEMORY_BLOCK GetMemoryBlock(LPVOID pOrigin) { PMEMORY_BLOCK pBlock; #if defined(_M_X64) || defined(__x86_64__) ULONG_PTR minAddr; ULONG_PTR maxAddr; SYSTEM_INFO si; GetSystemInfo(&si); minAddr = (ULONG_PTR)si.lpMinimumApplicationAddress; maxAddr = (ULONG_PTR)si.lpMaximumApplicationAddress; // pOrigin ± 512MB if ((ULONG_PTR)pOrigin > MAX_MEMORY_RANGE && minAddr < (ULONG_PTR)pOrigin - MAX_MEMORY_RANGE) minAddr = (ULONG_PTR)pOrigin - MAX_MEMORY_RANGE; if (maxAddr > (ULONG_PTR)pOrigin + MAX_MEMORY_RANGE) maxAddr = (ULONG_PTR)pOrigin + MAX_MEMORY_RANGE; // Make room for MEMORY_BLOCK_SIZE bytes. maxAddr -= MEMORY_BLOCK_SIZE - 1; #endif // Look the registered blocks for a reachable one. for (pBlock = g_pMemoryBlocks; pBlock != NULL; pBlock = pBlock->pNext) { #if defined(_M_X64) || defined(__x86_64__) // Ignore the blocks too far. if ((ULONG_PTR)pBlock < minAddr || (ULONG_PTR)pBlock >= maxAddr) continue; #endif // The block has at least one unused slot. if (pBlock->pFree != NULL) return pBlock; } #if defined(_M_X64) || defined(__x86_64__) // Alloc a new block above if not found. { LPVOID pAlloc = pOrigin; while ((ULONG_PTR)pAlloc >= minAddr) { pAlloc = FindPrevFreeRegion(pAlloc, (LPVOID)minAddr, si.dwAllocationGranularity); if (pAlloc == NULL) break; pBlock = (PMEMORY_BLOCK)VirtualAlloc( pAlloc, MEMORY_BLOCK_SIZE, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); if (pBlock != NULL) break; } } // Alloc a new block below if not found. if (pBlock == NULL) { LPVOID pAlloc = pOrigin; while ((ULONG_PTR)pAlloc <= maxAddr) { pAlloc = FindNextFreeRegion(pAlloc, (LPVOID)maxAddr, si.dwAllocationGranularity); if (pAlloc == NULL) break; pBlock = (PMEMORY_BLOCK)VirtualAlloc( pAlloc, MEMORY_BLOCK_SIZE, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); if (pBlock != NULL) break; } } #else // In x86 mode, a memory block can be placed anywhere. pBlock = (PMEMORY_BLOCK)VirtualAlloc( NULL, MEMORY_BLOCK_SIZE, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); #endif if (pBlock != NULL) { // Build a linked list of all the slots. PMEMORY_SLOT pSlot = (PMEMORY_SLOT)pBlock + 1; pBlock->pFree = NULL; pBlock->usedCount = 0; do { pSlot->pNext = pBlock->pFree; pBlock->pFree = pSlot; pSlot++; } while ((ULONG_PTR)pSlot - (ULONG_PTR)pBlock <= MEMORY_BLOCK_SIZE - MEMORY_SLOT_SIZE); pBlock->pNext = g_pMemoryBlocks; g_pMemoryBlocks = pBlock; } return pBlock; } //------------------------------------------------------------------------- LPVOID AllocateBuffer(LPVOID pOrigin) { PMEMORY_SLOT pSlot; PMEMORY_BLOCK pBlock = GetMemoryBlock(pOrigin); if (pBlock == NULL) return NULL; // Remove an unused slot from the list. pSlot = pBlock->pFree; pBlock->pFree = pSlot->pNext; pBlock->usedCount++; #ifdef _DEBUG // Fill the slot with INT3 for debugging. memset(pSlot, 0xCC, sizeof(MEMORY_SLOT)); #endif return pSlot; } //------------------------------------------------------------------------- VOID FreeBuffer(LPVOID pBuffer) { PMEMORY_BLOCK pBlock = g_pMemoryBlocks; PMEMORY_BLOCK pPrev = NULL; ULONG_PTR pTargetBlock = ((ULONG_PTR)pBuffer / MEMORY_BLOCK_SIZE) * MEMORY_BLOCK_SIZE; while (pBlock != NULL) { if ((ULONG_PTR)pBlock == pTargetBlock) { PMEMORY_SLOT pSlot = (PMEMORY_SLOT)pBuffer; #ifdef _DEBUG // Clear the released slot for debugging. memset(pSlot, 0x00, sizeof(*pSlot)); #endif // Restore the released slot to the list. pSlot->pNext = pBlock->pFree; pBlock->pFree = pSlot; pBlock->usedCount--; // Free if unused. if (pBlock->usedCount == 0) { if (pPrev) pPrev->pNext = pBlock->pNext; else g_pMemoryBlocks = pBlock->pNext; VirtualFree(pBlock, 0, MEM_RELEASE); } break; } pPrev = pBlock; pBlock = pBlock->pNext; } } //------------------------------------------------------------------------- BOOL IsExecutableAddress(LPVOID pAddress) { MEMORY_BASIC_INFORMATION mi; VirtualQuery(pAddress, &mi, sizeof(mi)); return (mi.State == MEM_COMMIT && (mi.Protect & PAGE_EXECUTE_FLAGS)); } mumble-1.3.4/3rdparty/minhook-src/README.md0000664000175000017500000001003514010707332020114 0ustar builderbuilder# MinHook [![License](https://img.shields.io/badge/License-BSD%202--Clause-orange.svg)](https://opensource.org/licenses/BSD-2-Clause) The Minimalistic x86/x64 API Hooking Library for Windows http://www.codeproject.com/KB/winsdk/LibMinHook.aspx ### Donation please I need some funds to continue developing this library. All contributions gratefully accepted. Click here to lend your support to: MinHook - Help me continue to develop this library and make a donation at pledgie.com ! ### Version history - ####v1.3.3 - 8 Jan 2017 * Added a helper function ```MH_CreateHookApiEx```. (Thanks to asm256) * Support Visual Studio 2017 RC. - ####v1.3.2.1 - 9 Nov 2015 (Nuget package only) * Fixed an insufficient support for Visual Studio 2015. - ####v1.3.2 - 1 Nov 2015 * Support Visual Studio 2015. * Support MinGW. - ####v1.3.2-beta3 - 21 Jul 2015 (Nuget package only) * Support MinGW. (Experimental) - ####v1.3.2-beta2 - 18 May 2015 * Fixed some subtle bugs. (Thanks to RaMMicHaeL) * Added a helper function ```MH_StatusToString```. (Thanks to Jan Klass) - ####v1.3.2-beta - 12 May 2015 * Fixed a possible thread deadlock in x64 mode. (Thanks to Aleh Kazakevich) * Reduced the footprint a little more. * Support Visual Studio 2015 RC. (Experimental) - ####v1.3.1.1 - 7 Apr 2015 (Nuget package only) * Support for WDK8.0 and 8.1. - ####v1.3.1 - 19 Mar 2015 * No major changes from v1.3.1-beta. - ####v1.3.1-beta - 11 Mar 2015 * Added a helper function ```MH_CreateHookApi```. (Thanks to uniskz). * Fixed a false memory leak reported by some tools. * Fixed a degradated compatibility issue. - ####v1.3 - 13 Sep 2014 * No major changes from v1.3-beta3. - ####v1.3-beta3 - 31 Jul 2014 * Fixed some small bugs. * Improved the memory management. - ####v1.3-beta2 - 21 Jul 2014 * Changed the parameters to Windows-friendly types. (void* to LPVOID) * Fixed some small bugs. * Reorganized the source files. * Reduced the footprint a little more. - ####v1.3-beta - 17 Jul 2014 * Rewrote in plain C to reduce the footprint and memory usage. (suggested by Andrey Unis) * Simplified the overall code base to make it more readable and maintainable. * Changed the license from 3-clause to 2-clause BSD License. - ####v1.2 - 28 Sep 2013 * Removed boost dependency ([jarredholman](https://github.com/jarredholman/minhook)). * Fixed a small bug in the GetRelativeBranchDestination function ([pillbug99](http://www.codeproject.com/Messages/4058892/Small-Bug-Found.aspx)). * Added the ```MH_RemoveHook``` function, which removes a hook created with the ```MH_CreateHook``` function. * Added the following functions to enable or disable multiple hooks in one go: ```MH_QueueEnableHook```, ```MH_QueueDisableHook```, ```MH_ApplyQueued```. This is the preferred way of handling multiple hooks as every call to `MH_EnableHook` or `MH_DisableHook` suspends and resumes all threads. * Made the functions ```MH_EnableHook``` and ```MH_DisableHook``` enable/disable all created hooks when the ```MH_ALL_HOOKS``` parameter is passed. This, too, is an efficient way of handling multiple hooks. * If the target function is too small to be patched with a jump, MinHook tries to place the jump above the function. If that fails as well, the ```MH_CreateHook``` function returns ```MH_ERROR_UNSUPPORTED_FUNCTION```. This fixes an issue of hooking the LoadLibraryExW function on Windows 7 x64 ([reported by Obble](http://www.codeproject.com/Messages/4578613/Re-Bug-LoadLibraryExW-hook-fails-on-windows-2008-r.aspx)). - ####v1.1 - 26 Nov 2009 * Changed the interface to create a hook and a trampoline function in one go to prevent the detour function from being called before the trampoline function is created. ([reported by xliqz](http://www.codeproject.com/Messages/3280374/Unsafe.aspx)) * Shortened the function names from ```MinHook_*``` to ```MH_*``` to make them handier. - ####v1.0 - 22 Nov 2009 * Initial release. mumble-1.3.4/3rdparty/minhook-src/include/0000775000175000017500000000000014010707332020261 5ustar builderbuildermumble-1.3.4/3rdparty/minhook-src/include/MinHook.h0000664000175000017500000001651714010707332022010 0ustar builderbuilder/* * MinHook - The Minimalistic API Hooking Library for x64/x86 * Copyright (C) 2009-2017 Tsuda Kageyu. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #pragma once #if !(defined _M_IX86) && !(defined _M_X64) && !(defined __i386__) && !(defined __x86_64__) #error MinHook supports only x86 and x64 systems. #endif #include // MinHook Error Codes. typedef enum MH_STATUS { // Unknown error. Should not be returned. MH_UNKNOWN = -1, // Successful. MH_OK = 0, // MinHook is already initialized. MH_ERROR_ALREADY_INITIALIZED, // MinHook is not initialized yet, or already uninitialized. MH_ERROR_NOT_INITIALIZED, // The hook for the specified target function is already created. MH_ERROR_ALREADY_CREATED, // The hook for the specified target function is not created yet. MH_ERROR_NOT_CREATED, // The hook for the specified target function is already enabled. MH_ERROR_ENABLED, // The hook for the specified target function is not enabled yet, or already // disabled. MH_ERROR_DISABLED, // The specified pointer is invalid. It points the address of non-allocated // and/or non-executable region. MH_ERROR_NOT_EXECUTABLE, // The specified target function cannot be hooked. MH_ERROR_UNSUPPORTED_FUNCTION, // Failed to allocate memory. MH_ERROR_MEMORY_ALLOC, // Failed to change the memory protection. MH_ERROR_MEMORY_PROTECT, // The specified module is not loaded. MH_ERROR_MODULE_NOT_FOUND, // The specified function is not found. MH_ERROR_FUNCTION_NOT_FOUND } MH_STATUS; // Can be passed as a parameter to MH_EnableHook, MH_DisableHook, // MH_QueueEnableHook or MH_QueueDisableHook. #define MH_ALL_HOOKS NULL #ifdef __cplusplus extern "C" { #endif // Initialize the MinHook library. You must call this function EXACTLY ONCE // at the beginning of your program. MH_STATUS WINAPI MH_Initialize(VOID); // Uninitialize the MinHook library. You must call this function EXACTLY // ONCE at the end of your program. MH_STATUS WINAPI MH_Uninitialize(VOID); // Creates a Hook for the specified target function, in disabled state. // Parameters: // pTarget [in] A pointer to the target function, which will be // overridden by the detour function. // pDetour [in] A pointer to the detour function, which will override // the target function. // ppOriginal [out] A pointer to the trampoline function, which will be // used to call the original target function. // This parameter can be NULL. MH_STATUS WINAPI MH_CreateHook(LPVOID pTarget, LPVOID pDetour, LPVOID *ppOriginal); // Creates a Hook for the specified API function, in disabled state. // Parameters: // pszModule [in] A pointer to the loaded module name which contains the // target function. // pszTarget [in] A pointer to the target function name, which will be // overridden by the detour function. // pDetour [in] A pointer to the detour function, which will override // the target function. // ppOriginal [out] A pointer to the trampoline function, which will be // used to call the original target function. // This parameter can be NULL. MH_STATUS WINAPI MH_CreateHookApi( LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID *ppOriginal); // Creates a Hook for the specified API function, in disabled state. // Parameters: // pszModule [in] A pointer to the loaded module name which contains the // target function. // pszTarget [in] A pointer to the target function name, which will be // overridden by the detour function. // pDetour [in] A pointer to the detour function, which will override // the target function. // ppOriginal [out] A pointer to the trampoline function, which will be // used to call the original target function. // This parameter can be NULL. // ppTarget [out] A pointer to the target function, which will be used // with other functions. // This parameter can be NULL. MH_STATUS WINAPI MH_CreateHookApiEx( LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID *ppOriginal, LPVOID *ppTarget); // Removes an already created hook. // Parameters: // pTarget [in] A pointer to the target function. MH_STATUS WINAPI MH_RemoveHook(LPVOID pTarget); // Enables an already created hook. // Parameters: // pTarget [in] A pointer to the target function. // If this parameter is MH_ALL_HOOKS, all created hooks are // enabled in one go. MH_STATUS WINAPI MH_EnableHook(LPVOID pTarget); // Disables an already created hook. // Parameters: // pTarget [in] A pointer to the target function. // If this parameter is MH_ALL_HOOKS, all created hooks are // disabled in one go. MH_STATUS WINAPI MH_DisableHook(LPVOID pTarget); // Queues to enable an already created hook. // Parameters: // pTarget [in] A pointer to the target function. // If this parameter is MH_ALL_HOOKS, all created hooks are // queued to be enabled. MH_STATUS WINAPI MH_QueueEnableHook(LPVOID pTarget); // Queues to disable an already created hook. // Parameters: // pTarget [in] A pointer to the target function. // If this parameter is MH_ALL_HOOKS, all created hooks are // queued to be disabled. MH_STATUS WINAPI MH_QueueDisableHook(LPVOID pTarget); // Applies all queued changes in one go. MH_STATUS WINAPI MH_ApplyQueued(VOID); // Translates the MH_STATUS to its name as a string. const char * WINAPI MH_StatusToString(MH_STATUS status); #ifdef __cplusplus } #endif mumble-1.3.4/3rdparty/minhook-src/dll_resources/0000775000175000017500000000000014010707332021503 5ustar builderbuildermumble-1.3.4/3rdparty/minhook-src/dll_resources/MinHook.rc0000664000175000017500000000155714010707332023405 0ustar builderbuilder1 VERSIONINFO FILEVERSION 1,3,3,0 PRODUCTVERSION 1,3,3,0 FILEFLAGSMASK 0x17L #ifdef _DEBUG FILEFLAGS 0x1L #else FILEFLAGS 0x0L #endif FILEOS 0x4L FILETYPE 0x2L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904b0" BEGIN VALUE "CompanyName", "Tsuda Kageyu" VALUE "FileDescription", "MinHook - The Minimalistic API Hook Library for x64/x86" VALUE "FileVersion", "1.3.3.0" VALUE "InternalName", "MinHookD" VALUE "LegalCopyright", "Copyright (C) 2009-2017 Tsuda Kageyu. All rights reserved." VALUE "LegalTrademarks", "Tsuda Kageyu" VALUE "ProductName", "MinHook DLL" VALUE "ProductVersion", "1.3.3.0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1200 END END mumble-1.3.4/3rdparty/minhook-src/dll_resources/MinHook.def0000664000175000017500000000037414010707332023533 0ustar builderbuilderEXPORTS MH_Initialize MH_Uninitialize MH_CreateHook MH_CreateHookApi MH_CreateHookApiEx MH_RemoveHook MH_EnableHook MH_DisableHook MH_QueueEnableHook MH_QueueDisableHook MH_ApplyQueued MH_StatusToString mumble-1.3.4/3rdparty/minhook-src/.editorconfig0000664000175000017500000000063214010707332021314 0ustar builderbuilder# EditorConfig is awesome: http://EditorConfig.org # top-most EditorConfig file root = true # Windows-style newlines with a newline ending every file [*] end_of_line = crlf insert_final_newline = true # 4 space indentation [*.{c,h,def}] indent_style = space indent_size = 4 # Trim trailing whitespaces [*.{c,h,def,txt}] trim_trailing_whitespace = true # UTF-8 with BOM [*.{c,h,def,txt}] charset=utf-8-bom mumble-1.3.4/3rdparty/rnnoise-src/0000775000175000017500000000000014010707350016647 5ustar builderbuildermumble-1.3.4/3rdparty/rnnoise-src/AUTHORS0000664000175000017500000000004514010707350017716 0ustar builderbuilderJean-Marc Valin mumble-1.3.4/3rdparty/rnnoise-src/update_version0000775000175000017500000000443614010707350021633 0ustar builderbuilder#!/bin/bash # Creates and updates the package_version information used by configure.ac # (or other makefiles). When run inside a git repository it will use the # version information that can be queried from it unless AUTO_UPDATE is set # to 'no'. If no version is currently known it will be set to 'unknown'. # # If called with the argument 'release', the PACKAGE_VERSION will be updated # even if AUTO_UPDATE=no, but the value of AUTO_UPDATE shall be preserved. # This is used to force a version update whenever `make dist` is run. # # The exit status is 1 if package_version is not modified, else 0 is returned. # # This script should NOT be included in distributed tarballs, because if a # parent directory contains a git repository we do not want to accidentally # retrieve the version information from it instead. Tarballs should ship # with only the package_version file. # # Ron , 2012. SRCDIR=$(dirname $0) if [ -e "$SRCDIR/package_version" ]; then . "$SRCDIR/package_version" fi if [ "$AUTO_UPDATE" = no ]; then [ "$1" = release ] || exit 1 else AUTO_UPDATE=yes fi # We run `git status` before describe here to ensure that we don't get a false # -dirty from files that have been touched but are not actually altered in the # working dir. GIT_VERSION=$(cd "$SRCDIR" && git status > /dev/null 2>&1 \ && git describe --tags --match 'v*' --dirty 2> /dev/null) GIT_VERSION=${GIT_VERSION#v} if [ -n "$GIT_VERSION" ]; then [ "$GIT_VERSION" != "$PACKAGE_VERSION" ] || exit 1 PACKAGE_VERSION="$GIT_VERSION" elif [ -z "$PACKAGE_VERSION" ]; then # No current package_version and no git ... # We really shouldn't ever get here, because this script should only be # included in the git repository, and should usually be export-ignored. PACKAGE_VERSION="unknown" else exit 1 fi cat > "$SRCDIR/package_version" <<-EOF # Automatically generated by update_version. # This file may be sourced into a shell script or makefile. # Set this to 'no' if you do not wish the version information # to be checked and updated for every build. Most people will # never want to change this, it is an option for developers # making frequent changes that they know will not be released. AUTO_UPDATE=$AUTO_UPDATE PACKAGE_VERSION="$PACKAGE_VERSION" EOF mumble-1.3.4/3rdparty/rnnoise-src/rnnoise.pc.in0000664000175000017500000000044514010707350021260 0ustar builderbuilder# rnnoise installed pkg-config file prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: rnnoise Description: RNN-based noise suppression Version: @PACKAGE_VERSION@ Conflicts: Libs: -L${libdir} -lrnnoise Libs.private: @lrintf_lib@ Cflags: -I${includedir}/ mumble-1.3.4/3rdparty/rnnoise-src/README0000664000175000017500000000067614010707350017540 0ustar builderbuilderRNNoise is a noise suppression library based on a recurrent neural network To compile, just type: % ./autogen.sh % ./configure % make Optionally: % make install While it is meant to be used as a library, a simple command-line tool is provided as an example. It operates on RAW 16-bit (machine endian) mono PCM files sampled at 48 kHz. It can be used as: ./examples/rnnoise_demo input.pcm output.pcm The output is also a 16-bit raw PCM file. mumble-1.3.4/3rdparty/rnnoise-src/training/0000775000175000017500000000000014010707350020462 5ustar builderbuildermumble-1.3.4/3rdparty/rnnoise-src/training/dump_rnn.py0000775000175000017500000000615214010707350022665 0ustar builderbuilder#!/usr/bin/python from __future__ import print_function from keras.models import Sequential from keras.layers import Dense from keras.layers import LSTM from keras.layers import GRU from keras.models import load_model from keras import backend as K import sys import re import numpy as np def printVector(f, vector, name): v = np.reshape(vector, (-1)); #print('static const float ', name, '[', len(v), '] = \n', file=f) f.write('static const rnn_weight {}[{}] = {{\n '.format(name, len(v))) for i in range(0, len(v)): f.write('{}'.format(min(127, int(round(256*v[i]))))) if (i!=len(v)-1): f.write(',') else: break; if (i%8==7): f.write("\n ") else: f.write(" ") #print(v, file=f) f.write('\n};\n\n') return; def printLayer(f, hf, layer): weights = layer.get_weights() printVector(f, weights[0], layer.name + '_weights') if len(weights) > 2: printVector(f, weights[1], layer.name + '_recurrent_weights') printVector(f, weights[-1], layer.name + '_bias') name = layer.name activation = re.search('function (.*) at', str(layer.activation)).group(1).upper() if len(weights) > 2: f.write('const GRULayer {} = {{\n {}_bias,\n {}_weights,\n {}_recurrent_weights,\n {}, {}, ACTIVATION_{}\n}};\n\n' .format(name, name, name, name, weights[0].shape[0], weights[0].shape[1]/3, activation)) hf.write('#define {}_SIZE {}\n'.format(name.upper(), weights[0].shape[1]/3)) hf.write('extern const GRULayer {};\n\n'.format(name)); else: f.write('const DenseLayer {} = {{\n {}_bias,\n {}_weights,\n {}, {}, ACTIVATION_{}\n}};\n\n' .format(name, name, name, weights[0].shape[0], weights[0].shape[1], activation)) hf.write('#define {}_SIZE {}\n'.format(name.upper(), weights[0].shape[1])) hf.write('extern const DenseLayer {};\n\n'.format(name)); def foo(c, name): return 1 def mean_squared_sqrt_error(y_true, y_pred): return K.mean(K.square(K.sqrt(y_pred) - K.sqrt(y_true)), axis=-1) model = load_model(sys.argv[1], custom_objects={'msse': mean_squared_sqrt_error, 'mean_squared_sqrt_error': mean_squared_sqrt_error, 'my_crossentropy': mean_squared_sqrt_error, 'mycost': mean_squared_sqrt_error, 'WeightClip': foo}) weights = model.get_weights() f = open(sys.argv[2], 'w') hf = open(sys.argv[3], 'w') f.write('/*This file is automatically generated from a Keras model*/\n\n') f.write('#ifdef HAVE_CONFIG_H\n#include "config.h"\n#endif\n\n#include "rnn.h"\n\n') hf.write('/*This file is automatically generated from a Keras model*/\n\n') hf.write('#ifndef RNN_DATA_H\n#define RNN_DATA_H\n\n#include "rnn.h"\n\n') layer_list = [] for i, layer in enumerate(model.layers): if len(layer.get_weights()) > 0: printLayer(f, hf, layer) if len(layer.get_weights()) > 2: layer_list.append(layer.name) hf.write('struct RNNState {\n') for i, name in enumerate(layer_list): hf.write(' float {}_state[{}_SIZE];\n'.format(name, name.upper())) hf.write('};\n') hf.write('\n\n#endif\n') f.close() hf.close() mumble-1.3.4/3rdparty/rnnoise-src/training/rnn_train.py0000775000175000017500000001101514010707350023027 0ustar builderbuilder#!/usr/bin/python from __future__ import print_function import keras from keras.models import Sequential from keras.models import Model from keras.layers import Input from keras.layers import Dense from keras.layers import LSTM from keras.layers import GRU from keras.layers import SimpleRNN from keras.layers import Dropout from keras.layers import concatenate from keras import losses from keras import regularizers from keras.constraints import min_max_norm import h5py from keras.constraints import Constraint from keras import backend as K import numpy as np #import tensorflow as tf #from keras.backend.tensorflow_backend import set_session #config = tf.ConfigProto() #config.gpu_options.per_process_gpu_memory_fraction = 0.42 #set_session(tf.Session(config=config)) def my_crossentropy(y_true, y_pred): return K.mean(2*K.abs(y_true-0.5) * K.binary_crossentropy(y_pred, y_true), axis=-1) def mymask(y_true): return K.minimum(y_true+1., 1.) def msse(y_true, y_pred): return K.mean(mymask(y_true) * K.square(K.sqrt(y_pred) - K.sqrt(y_true)), axis=-1) def mycost(y_true, y_pred): return K.mean(mymask(y_true) * (10*K.square(K.square(K.sqrt(y_pred) - K.sqrt(y_true))) + K.square(K.sqrt(y_pred) - K.sqrt(y_true)) + 0.01*K.binary_crossentropy(y_pred, y_true)), axis=-1) def my_accuracy(y_true, y_pred): return K.mean(2*K.abs(y_true-0.5) * K.equal(y_true, K.round(y_pred)), axis=-1) class WeightClip(Constraint): '''Clips the weights incident to each hidden unit to be inside a range ''' def __init__(self, c=2): self.c = c def __call__(self, p): return K.clip(p, -self.c, self.c) def get_config(self): return {'name': self.__class__.__name__, 'c': self.c} reg = 0.000001 constraint = WeightClip(0.499) print('Build model...') main_input = Input(shape=(None, 42), name='main_input') tmp = Dense(24, activation='tanh', name='input_dense', kernel_constraint=constraint, bias_constraint=constraint)(main_input) vad_gru = GRU(24, activation='tanh', recurrent_activation='sigmoid', return_sequences=True, name='vad_gru', kernel_regularizer=regularizers.l2(reg), recurrent_regularizer=regularizers.l2(reg), kernel_constraint=constraint, recurrent_constraint=constraint, bias_constraint=constraint)(tmp) vad_output = Dense(1, activation='sigmoid', name='vad_output', kernel_constraint=constraint, bias_constraint=constraint)(vad_gru) noise_input = keras.layers.concatenate([tmp, vad_gru, main_input]) noise_gru = GRU(48, activation='relu', recurrent_activation='sigmoid', return_sequences=True, name='noise_gru', kernel_regularizer=regularizers.l2(reg), recurrent_regularizer=regularizers.l2(reg), kernel_constraint=constraint, recurrent_constraint=constraint, bias_constraint=constraint)(noise_input) denoise_input = keras.layers.concatenate([vad_gru, noise_gru, main_input]) denoise_gru = GRU(96, activation='tanh', recurrent_activation='sigmoid', return_sequences=True, name='denoise_gru', kernel_regularizer=regularizers.l2(reg), recurrent_regularizer=regularizers.l2(reg), kernel_constraint=constraint, recurrent_constraint=constraint, bias_constraint=constraint)(denoise_input) denoise_output = Dense(22, activation='sigmoid', name='denoise_output', kernel_constraint=constraint, bias_constraint=constraint)(denoise_gru) model = Model(inputs=main_input, outputs=[denoise_output, vad_output]) model.compile(loss=[mycost, my_crossentropy], metrics=[msse], optimizer='adam', loss_weights=[10, 0.5]) batch_size = 32 print('Loading data...') with h5py.File('denoise_data9.h5', 'r') as hf: all_data = hf['data'][:] print('done.') window_size = 2000 nb_sequences = len(all_data)//window_size print(nb_sequences, ' sequences') x_train = all_data[:nb_sequences*window_size, :42] x_train = np.reshape(x_train, (nb_sequences, window_size, 42)) y_train = np.copy(all_data[:nb_sequences*window_size, 42:64]) y_train = np.reshape(y_train, (nb_sequences, window_size, 22)) noise_train = np.copy(all_data[:nb_sequences*window_size, 64:86]) noise_train = np.reshape(noise_train, (nb_sequences, window_size, 22)) vad_train = np.copy(all_data[:nb_sequences*window_size, 86:87]) vad_train = np.reshape(vad_train, (nb_sequences, window_size, 1)) all_data = 0; #x_train = x_train.astype('float32') #y_train = y_train.astype('float32') print(len(x_train), 'train sequences. x shape =', x_train.shape, 'y shape = ', y_train.shape) print('Train...') model.fit(x_train, [y_train, vad_train], batch_size=batch_size, epochs=120, validation_split=0.1) model.save("newweights9i.hdf5") mumble-1.3.4/3rdparty/rnnoise-src/training/bin2hdf5.py0000775000175000017500000000045314010707350022442 0ustar builderbuilder#!/usr/bin/python from __future__ import print_function import numpy as np import h5py import sys data = np.fromfile(sys.argv[1], dtype='float32'); data = np.reshape(data, (int(sys.argv[2]), int(sys.argv[3]))); h5f = h5py.File(sys.argv[4], 'w'); h5f.create_dataset('data', data=data) h5f.close() mumble-1.3.4/3rdparty/rnnoise-src/COPYING0000664000175000017500000000305514010707350017705 0ustar builderbuilderCopyright (c) 2017, Mozilla Copyright (c) 2007-2017, Jean-Marc Valin Copyright (c) 2005-2017, Xiph.Org Foundation Copyright (c) 2003-2004, Mark Borgerding Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.Org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. mumble-1.3.4/3rdparty/rnnoise-src/src/0000775000175000017500000000000014010707350017436 5ustar builderbuildermumble-1.3.4/3rdparty/rnnoise-src/src/kiss_fft.h0000664000175000017500000001432014010707350021417 0ustar builderbuilder/*Copyright (c) 2003-2004, Mark Borgerding Lots of modifications by Jean-Marc Valin Copyright (c) 2005-2007, Xiph.Org Foundation Copyright (c) 2008, Xiph.Org Foundation, CSIRO All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.*/ #ifndef KISS_FFT_H #define KISS_FFT_H #include #include #include "arch.h" #include #define opus_alloc(x) malloc(x) #define opus_free(x) free(x) #ifdef __cplusplus extern "C" { #endif #ifdef USE_SIMD # include # define kiss_fft_scalar __m128 #define KISS_FFT_MALLOC(nbytes) memalign(16,nbytes) #else #define KISS_FFT_MALLOC opus_alloc #endif #ifdef FIXED_POINT #include "arch.h" # define kiss_fft_scalar opus_int32 # define kiss_twiddle_scalar opus_int16 #else # ifndef kiss_fft_scalar /* default is float */ # define kiss_fft_scalar float # define kiss_twiddle_scalar float # define KF_SUFFIX _celt_single # endif #endif typedef struct { kiss_fft_scalar r; kiss_fft_scalar i; }kiss_fft_cpx; typedef struct { kiss_twiddle_scalar r; kiss_twiddle_scalar i; }kiss_twiddle_cpx; #define MAXFACTORS 8 /* e.g. an fft of length 128 has 4 factors as far as kissfft is concerned 4*4*4*2 */ typedef struct arch_fft_state{ int is_supported; void *priv; } arch_fft_state; typedef struct kiss_fft_state{ int nfft; opus_val16 scale; #ifdef FIXED_POINT int scale_shift; #endif int shift; opus_int16 factors[2*MAXFACTORS]; const opus_int16 *bitrev; const kiss_twiddle_cpx *twiddles; arch_fft_state *arch_fft; } kiss_fft_state; #if defined(HAVE_ARM_NE10) #include "arm/fft_arm.h" #endif /*typedef struct kiss_fft_state* kiss_fft_cfg;*/ /** * opus_fft_alloc * * Initialize a FFT (or IFFT) algorithm's cfg/state buffer. * * typical usage: kiss_fft_cfg mycfg=opus_fft_alloc(1024,0,NULL,NULL); * * The return value from fft_alloc is a cfg buffer used internally * by the fft routine or NULL. * * If lenmem is NULL, then opus_fft_alloc will allocate a cfg buffer using malloc. * The returned value should be free()d when done to avoid memory leaks. * * The state can be placed in a user supplied buffer 'mem': * If lenmem is not NULL and mem is not NULL and *lenmem is large enough, * then the function places the cfg in mem and the size used in *lenmem * and returns mem. * * If lenmem is not NULL and ( mem is NULL or *lenmem is not large enough), * then the function returns NULL and places the minimum cfg * buffer size in *lenmem. * */ kiss_fft_state *opus_fft_alloc_twiddles(int nfft,void * mem,size_t * lenmem, const kiss_fft_state *base, int arch); kiss_fft_state *opus_fft_alloc(int nfft,void * mem,size_t * lenmem, int arch); /** * opus_fft(cfg,in_out_buf) * * Perform an FFT on a complex input buffer. * for a forward FFT, * fin should be f[0] , f[1] , ... ,f[nfft-1] * fout will be F[0] , F[1] , ... ,F[nfft-1] * Note that each element is complex and can be accessed like f[k].r and f[k].i * */ void opus_fft_c(const kiss_fft_state *cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout); void opus_ifft_c(const kiss_fft_state *cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout); void opus_fft_impl(const kiss_fft_state *st,kiss_fft_cpx *fout); void opus_ifft_impl(const kiss_fft_state *st,kiss_fft_cpx *fout); void opus_fft_free(const kiss_fft_state *cfg, int arch); void opus_fft_free_arch_c(kiss_fft_state *st); int opus_fft_alloc_arch_c(kiss_fft_state *st); #if !defined(OVERRIDE_OPUS_FFT) /* Is run-time CPU detection enabled on this platform? */ #if defined(OPUS_HAVE_RTCD) && (defined(HAVE_ARM_NE10)) extern int (*const OPUS_FFT_ALLOC_ARCH_IMPL[OPUS_ARCHMASK+1])( kiss_fft_state *st); #define opus_fft_alloc_arch(_st, arch) \ ((*OPUS_FFT_ALLOC_ARCH_IMPL[(arch)&OPUS_ARCHMASK])(_st)) extern void (*const OPUS_FFT_FREE_ARCH_IMPL[OPUS_ARCHMASK+1])( kiss_fft_state *st); #define opus_fft_free_arch(_st, arch) \ ((*OPUS_FFT_FREE_ARCH_IMPL[(arch)&OPUS_ARCHMASK])(_st)) extern void (*const OPUS_FFT[OPUS_ARCHMASK+1])(const kiss_fft_state *cfg, const kiss_fft_cpx *fin, kiss_fft_cpx *fout); #define opus_fft(_cfg, _fin, _fout, arch) \ ((*OPUS_FFT[(arch)&OPUS_ARCHMASK])(_cfg, _fin, _fout)) extern void (*const OPUS_IFFT[OPUS_ARCHMASK+1])(const kiss_fft_state *cfg, const kiss_fft_cpx *fin, kiss_fft_cpx *fout); #define opus_ifft(_cfg, _fin, _fout, arch) \ ((*OPUS_IFFT[(arch)&OPUS_ARCHMASK])(_cfg, _fin, _fout)) #else /* else for if defined(OPUS_HAVE_RTCD) && (defined(HAVE_ARM_NE10)) */ #define opus_fft_alloc_arch(_st, arch) \ ((void)(arch), opus_fft_alloc_arch_c(_st)) #define opus_fft_free_arch(_st, arch) \ ((void)(arch), opus_fft_free_arch_c(_st)) #define opus_fft(_cfg, _fin, _fout, arch) \ ((void)(arch), opus_fft_c(_cfg, _fin, _fout)) #define opus_ifft(_cfg, _fin, _fout, arch) \ ((void)(arch), opus_ifft_c(_cfg, _fin, _fout)) #endif /* end if defined(OPUS_HAVE_RTCD) && (defined(HAVE_ARM_NE10)) */ #endif /* end if !defined(OVERRIDE_OPUS_FFT) */ #ifdef __cplusplus } #endif #endif mumble-1.3.4/3rdparty/rnnoise-src/src/rnn.c0000664000175000017500000001310214010707350020374 0ustar builderbuilder/* Copyright (c) 2008-2011 Octasic Inc. 2012-2017 Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "opus_types.h" #include "common.h" #include "arch.h" #include "tansig_table.h" #include "rnn.h" #include "rnn_data.h" #include static OPUS_INLINE float tansig_approx(float x) { int i; float y, dy; float sign=1; /* Tests are reversed to catch NaNs */ if (!(x<8)) return 1; if (!(x>-8)) return -1; #ifndef FIXED_POINT /* Another check in case of -ffast-math */ if (celt_isnan(x)) return 0; #endif if (x<0) { x=-x; sign=-1; } i = (int)floor(.5f+25*x); x -= .04f*i; y = tansig_table[i]; dy = 1-y*y; y = y + x*dy*(1 - y*x); return sign*y; } static OPUS_INLINE float sigmoid_approx(float x) { return .5 + .5*tansig_approx(.5*x); } static OPUS_INLINE float relu(float x) { return x < 0 ? 0 : x; } void compute_dense(const DenseLayer *layer, float *output, const float *input) { int i, j; int N, M; int stride; M = layer->nb_inputs; N = layer->nb_neurons; stride = N; for (i=0;ibias[i]; for (j=0;jinput_weights[j*stride + i]*input[j]; output[i] = WEIGHTS_SCALE*sum; } if (layer->activation == ACTIVATION_SIGMOID) { for (i=0;iactivation == ACTIVATION_TANH) { for (i=0;iactivation == ACTIVATION_RELU) { for (i=0;inb_inputs; N = gru->nb_neurons; stride = 3*N; for (i=0;ibias[i]; for (j=0;jinput_weights[j*stride + i]*input[j]; for (j=0;jrecurrent_weights[j*stride + i]*state[j]; z[i] = sigmoid_approx(WEIGHTS_SCALE*sum); } for (i=0;ibias[N + i]; for (j=0;jinput_weights[N + j*stride + i]*input[j]; for (j=0;jrecurrent_weights[N + j*stride + i]*state[j]; r[i] = sigmoid_approx(WEIGHTS_SCALE*sum); } for (i=0;ibias[2*N + i]; for (j=0;jinput_weights[2*N + j*stride + i]*input[j]; for (j=0;jrecurrent_weights[2*N + j*stride + i]*state[j]*r[j]; if (gru->activation == ACTIVATION_SIGMOID) sum = sigmoid_approx(WEIGHTS_SCALE*sum); else if (gru->activation == ACTIVATION_TANH) sum = tansig_approx(WEIGHTS_SCALE*sum); else if (gru->activation == ACTIVATION_RELU) sum = relu(WEIGHTS_SCALE*sum); else *(int*)0=0; h[i] = z[i]*state[i] + (1-z[i])*sum; } for (i=0;ivad_gru_state, dense_out); compute_dense(&vad_output, vad, rnn->vad_gru_state); for (i=0;ivad_gru_state[i]; for (i=0;inoise_gru_state, noise_input); for (i=0;ivad_gru_state[i]; for (i=0;inoise_gru_state[i]; for (i=0;idenoise_gru_state, denoise_input); compute_dense(&denoise_output, gains, rnn->denoise_gru_state); } mumble-1.3.4/3rdparty/rnnoise-src/src/rnn_train.py0000775000175000017500000000377714010707350022023 0ustar builderbuilder#!/usr/bin/python from __future__ import print_function from keras.models import Sequential from keras.models import Model from keras.layers import Input from keras.layers import Dense from keras.layers import LSTM from keras.layers import GRU from keras.layers import SimpleRNN from keras.layers import Dropout from keras import losses import h5py from keras import backend as K import numpy as np print('Build model...') main_input = Input(shape=(None, 22), name='main_input') #x = Dense(44, activation='relu')(main_input) #x = GRU(44, dropout=0.0, recurrent_dropout=0.0, activation='tanh', recurrent_activation='sigmoid', return_sequences=True)(x) x=main_input x = GRU(128, activation='tanh', recurrent_activation='sigmoid', return_sequences=True)(x) #x = GRU(128, return_sequences=True)(x) #x = GRU(22, activation='relu', return_sequences=True)(x) x = Dense(22, activation='sigmoid')(x) #x = Dense(22, activation='softplus')(x) model = Model(inputs=main_input, outputs=x) batch_size = 32 print('Loading data...') with h5py.File('denoise_data.h5', 'r') as hf: all_data = hf['denoise_data'][:] print('done.') window_size = 500 nb_sequences = len(all_data)//window_size print(nb_sequences, ' sequences') x_train = all_data[:nb_sequences*window_size, :-22] x_train = np.reshape(x_train, (nb_sequences, window_size, 22)) y_train = np.copy(all_data[:nb_sequences*window_size, -22:]) y_train = np.reshape(y_train, (nb_sequences, window_size, 22)) #y_train = -20*np.log10(np.add(y_train, .03)); all_data = 0; x_train = x_train.astype('float32') y_train = y_train.astype('float32') print(len(x_train), 'train sequences. x shape =', x_train.shape, 'y shape = ', y_train.shape) # try using different optimizers and different optimizer configs model.compile(loss='mean_squared_error', optimizer='adam', metrics=['binary_accuracy']) print('Train...') model.fit(x_train, y_train, batch_size=batch_size, epochs=200, validation_data=(x_train, y_train)) model.save("newweights.hdf5") mumble-1.3.4/3rdparty/rnnoise-src/src/arch.h0000664000175000017500000001671414010707350020535 0ustar builderbuilder/* Copyright (c) 2003-2008 Jean-Marc Valin Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /** @file arch.h @brief Various architecture definitions for CELT */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef ARCH_H #define ARCH_H #include "opus_types.h" #include "common.h" # if !defined(__GNUC_PREREQ) # if defined(__GNUC__)&&defined(__GNUC_MINOR__) # define __GNUC_PREREQ(_maj,_min) \ ((__GNUC__<<16)+__GNUC_MINOR__>=((_maj)<<16)+(_min)) # else # define __GNUC_PREREQ(_maj,_min) 0 # endif # endif #define CELT_SIG_SCALE 32768.f #define celt_fatal(str) _celt_fatal(str, __FILE__, __LINE__); #ifdef ENABLE_ASSERTIONS #include #include #ifdef __GNUC__ __attribute__((noreturn)) #endif static OPUS_INLINE void _celt_fatal(const char *str, const char *file, int line) { fprintf (stderr, "Fatal (internal) error in %s, line %d: %s\n", file, line, str); abort(); } #define celt_assert(cond) {if (!(cond)) {celt_fatal("assertion failed: " #cond);}} #define celt_assert2(cond, message) {if (!(cond)) {celt_fatal("assertion failed: " #cond "\n" message);}} #else #define celt_assert(cond) #define celt_assert2(cond, message) #endif #define IMUL32(a,b) ((a)*(b)) #define MIN16(a,b) ((a) < (b) ? (a) : (b)) /**< Minimum 16-bit value. */ #define MAX16(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 16-bit value. */ #define MIN32(a,b) ((a) < (b) ? (a) : (b)) /**< Minimum 32-bit value. */ #define MAX32(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 32-bit value. */ #define IMIN(a,b) ((a) < (b) ? (a) : (b)) /**< Minimum int value. */ #define IMAX(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum int value. */ #define UADD32(a,b) ((a)+(b)) #define USUB32(a,b) ((a)-(b)) /* Set this if opus_int64 is a native type of the CPU. */ /* Assume that all LP64 architectures have fast 64-bit types; also x86_64 (which can be ILP32 for x32) and Win64 (which is LLP64). */ #if defined(__x86_64__) || defined(__LP64__) || defined(_WIN64) #define OPUS_FAST_INT64 1 #else #define OPUS_FAST_INT64 0 #endif #define PRINT_MIPS(file) #ifdef FIXED_POINT typedef opus_int16 opus_val16; typedef opus_int32 opus_val32; typedef opus_int64 opus_val64; typedef opus_val32 celt_sig; typedef opus_val16 celt_norm; typedef opus_val32 celt_ener; #define Q15ONE 32767 #define SIG_SHIFT 12 /* Safe saturation value for 32-bit signals. Should be less than 2^31*(1-0.85) to avoid blowing up on DC at deemphasis.*/ #define SIG_SAT (300000000) #define NORM_SCALING 16384 #define DB_SHIFT 10 #define EPSILON 1 #define VERY_SMALL 0 #define VERY_LARGE16 ((opus_val16)32767) #define Q15_ONE ((opus_val16)32767) #define SCALEIN(a) (a) #define SCALEOUT(a) (a) #define ABS16(x) ((x) < 0 ? (-(x)) : (x)) #define ABS32(x) ((x) < 0 ? (-(x)) : (x)) static OPUS_INLINE opus_int16 SAT16(opus_int32 x) { return x > 32767 ? 32767 : x < -32768 ? -32768 : (opus_int16)x; } #ifdef FIXED_DEBUG #include "fixed_debug.h" #else #include "fixed_generic.h" #ifdef OPUS_ARM_PRESUME_AARCH64_NEON_INTR #include "arm/fixed_arm64.h" #elif OPUS_ARM_INLINE_EDSP #include "arm/fixed_armv5e.h" #elif defined (OPUS_ARM_INLINE_ASM) #include "arm/fixed_armv4.h" #elif defined (BFIN_ASM) #include "fixed_bfin.h" #elif defined (TI_C5X_ASM) #include "fixed_c5x.h" #elif defined (TI_C6X_ASM) #include "fixed_c6x.h" #endif #endif #else /* FIXED_POINT */ typedef float opus_val16; typedef float opus_val32; typedef float opus_val64; typedef float celt_sig; typedef float celt_norm; typedef float celt_ener; #ifdef FLOAT_APPROX /* This code should reliably detect NaN/inf even when -ffast-math is used. Assumes IEEE 754 format. */ static OPUS_INLINE int celt_isnan(float x) { union {float f; opus_uint32 i;} in; in.f = x; return ((in.i>>23)&0xFF)==0xFF && (in.i&0x007FFFFF)!=0; } #else #ifdef __FAST_MATH__ #error Cannot build libopus with -ffast-math unless FLOAT_APPROX is defined. This could result in crashes on extreme (e.g. NaN) input #endif #define celt_isnan(x) ((x)!=(x)) #endif #define Q15ONE 1.0f #define NORM_SCALING 1.f #define EPSILON 1e-15f #define VERY_SMALL 1e-30f #define VERY_LARGE16 1e15f #define Q15_ONE ((opus_val16)1.f) /* This appears to be the same speed as C99's fabsf() but it's more portable. */ #define ABS16(x) ((float)fabs(x)) #define ABS32(x) ((float)fabs(x)) #define QCONST16(x,bits) (x) #define QCONST32(x,bits) (x) #define NEG16(x) (-(x)) #define NEG32(x) (-(x)) #define NEG32_ovflw(x) (-(x)) #define EXTRACT16(x) (x) #define EXTEND32(x) (x) #define SHR16(a,shift) (a) #define SHL16(a,shift) (a) #define SHR32(a,shift) (a) #define SHL32(a,shift) (a) #define PSHR32(a,shift) (a) #define VSHR32(a,shift) (a) #define PSHR(a,shift) (a) #define SHR(a,shift) (a) #define SHL(a,shift) (a) #define SATURATE(x,a) (x) #define SATURATE16(x) (x) #define ROUND16(a,shift) (a) #define SROUND16(a,shift) (a) #define HALF16(x) (.5f*(x)) #define HALF32(x) (.5f*(x)) #define ADD16(a,b) ((a)+(b)) #define SUB16(a,b) ((a)-(b)) #define ADD32(a,b) ((a)+(b)) #define SUB32(a,b) ((a)-(b)) #define ADD32_ovflw(a,b) ((a)+(b)) #define SUB32_ovflw(a,b) ((a)-(b)) #define MULT16_16_16(a,b) ((a)*(b)) #define MULT16_16(a,b) ((opus_val32)(a)*(opus_val32)(b)) #define MAC16_16(c,a,b) ((c)+(opus_val32)(a)*(opus_val32)(b)) #define MULT16_32_Q15(a,b) ((a)*(b)) #define MULT16_32_Q16(a,b) ((a)*(b)) #define MULT32_32_Q31(a,b) ((a)*(b)) #define MAC16_32_Q15(c,a,b) ((c)+(a)*(b)) #define MAC16_32_Q16(c,a,b) ((c)+(a)*(b)) #define MULT16_16_Q11_32(a,b) ((a)*(b)) #define MULT16_16_Q11(a,b) ((a)*(b)) #define MULT16_16_Q13(a,b) ((a)*(b)) #define MULT16_16_Q14(a,b) ((a)*(b)) #define MULT16_16_Q15(a,b) ((a)*(b)) #define MULT16_16_P15(a,b) ((a)*(b)) #define MULT16_16_P13(a,b) ((a)*(b)) #define MULT16_16_P14(a,b) ((a)*(b)) #define MULT16_32_P16(a,b) ((a)*(b)) #define DIV32_16(a,b) (((opus_val32)(a))/(opus_val16)(b)) #define DIV32(a,b) (((opus_val32)(a))/(opus_val32)(b)) #define SCALEIN(a) ((a)*CELT_SIG_SCALE) #define SCALEOUT(a) ((a)*(1/CELT_SIG_SCALE)) #define SIG2WORD16(x) (x) #endif /* !FIXED_POINT */ #ifndef GLOBAL_STACK_SIZE #ifdef FIXED_POINT #define GLOBAL_STACK_SIZE 120000 #else #define GLOBAL_STACK_SIZE 120000 #endif #endif #endif /* ARCH_H */ mumble-1.3.4/3rdparty/rnnoise-src/src/rnn_data.h0000664000175000017500000000121414010707350021373 0ustar builderbuilder/*This file is automatically generated from a Keras model*/ #ifndef RNN_DATA_H #define RNN_DATA_H #include "rnn.h" #define INPUT_DENSE_SIZE 24 extern const DenseLayer input_dense; #define VAD_GRU_SIZE 24 extern const GRULayer vad_gru; #define NOISE_GRU_SIZE 48 extern const GRULayer noise_gru; #define DENOISE_GRU_SIZE 96 extern const GRULayer denoise_gru; #define DENOISE_OUTPUT_SIZE 22 extern const DenseLayer denoise_output; #define VAD_OUTPUT_SIZE 1 extern const DenseLayer vad_output; struct RNNState { float vad_gru_state[VAD_GRU_SIZE]; float noise_gru_state[NOISE_GRU_SIZE]; float denoise_gru_state[DENOISE_GRU_SIZE]; }; #endif mumble-1.3.4/3rdparty/rnnoise-src/src/rnn_data.c0000664000175000017500000147562414010707350021413 0ustar builderbuilder/*This file is automatically generated from a Keras model*/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "rnn.h" static const rnn_weight input_dense_weights[1008] = { -10, 0, -3, 1, -8, -6, 3, -13, 1, 0, -3, -7, -5, -3, 6, -1, -6, 0, -6, -4, -1, -2, 1, 1, -7, 2, 21, 10, -5, -20, 24, 23, 37, 8, -2, 33, -6, 22, 13, -2, 50, 8, 13, 1, -15, 30, -10, 30, 0, 3, 5, 27, 1, 4, -3, 41, 56, 35, -2, 49, -13, 11, 13, -2, -47, 5, -16, -60, -15, 77, -17, 26, -3, 14, -21, 19, -5, -19, -13, 0, 10, 14, 9, 31, -13, -41, -10, 4, 22, 18, -48, -6, -10, 62, -3, -18, -14, 12, 26, -28, 3, 14, 25, -13, -19, 6, 5, 36, -3, -65, -12, 0, 31, -7, -9, 101, -4, 26, 16, 17, -12, -12, 14, -36, -3, 5, -15, 21, 2, 30, -3, 38, -4, 1, -6, 7, -7, 14, 38, -22, -30, -3, -7, 3, -39, -70, -126, 25, 34, 94, -67, -22, -33, 83, -47, -118, 4, 70, 33, 25, 62, -128, -76, -118, -113, 49, -12, -100, -18, -114, -33, 43, 32, 61, 40, -9, -106, 2, 36, -100, -40, -5, 20, -75, 61, -51, -9, 126, -27, -52, 5, -24, -21, -126, -114, -12, 15, 106, -2, 73, -125, 50, 13, -120, 35, 35, 4, -61, 29, -124, 6, -53, -69, -125, 64, -89, 36, -107, -103, -7, 27, 121, 69, 77, -35, 35, 95, -125, -49, 97, -45, -43, -23, 23, -28, -65, -118, 2, 8, -126, 27, -97, 92, 5, 55, 82, 17, -57, -115, 37, 8, -106, -46, 41, -2, 21, -44, 8, -73, -58, -39, 34, 89, -95, 95, -117, 120, -58, 31, 123, 1, -32, -109, -110, 60, -120, -43, -74, 5, 91, 26, 21, 114, 82, -83, -126, 123, 22, -16, -67, 25, -83, 46, 48, -34, -121, -124, -63, -35, -9, 31, 82, 123, 6, -3, 117, 93, -2, -13, -36, 124, -112, -6, -102, -5, -33, -15, 44, -69, -127, -23, -40, -34, -85, 68, 83, -1, 40, 8, 84, 118, -58, -55, -102, 123, -55, -14, -123, 44, -63, -14, 21, 35, 16, 24, -126, -13, -114, 35, 20, -36, 61, -9, 97, 34, 19, -32, -109, 76, -104, 99, -119, 45, -125, -51, -28, -8, -69, -8, 125, -45, -93, 113, 103, -41, -82, 52, 7, 126, 0, -40, 104, 55, -58, 17, -124, -93, -58, 8, -45, 1, 56, -123, 108, -47, -23, 115, 127, 17, -68, -13, 116, -82, -44, 45, 67, -120, -101, -15, -125, 120, -113, 17, -48, -73, 126, -64, -86, -118, -19, 112, -1, -66, -27, -62, 121, -86, -58, 50, 89, -38, -75, 95, -111, 12, -113, 2, -68, 2, -94, -121, 91, -5, 0, 79, 43, -7, -18, 79, 35, -38, 47, 1, -45, 83, -50, 102, 32, 55, -96, 15, -122, -69, 45, -27, 91, -62, -30, 46, -95, 22, -72, -97, -1, 14, -122, 28, 127, 61, -126, 121, 9, 68, -120, 49, -60, 90, 3, 43, 68, 54, 34, -10, 28, 21, -24, -54, 22, -113, -12, 82, -2, -17, -9, 127, 8, 116, -92, 0, -70, -33, 123, 66, 116, -74, -4, 74, -72, -22, -47, 1, -83, -60, -124, 1, 122, -57, -43, 49, 40, -126, -128, -8, -29, 28, -24, -123, -121, -70, -93, -37, -126, 11, -125, -37, 11, -31, -51, -124, 116, -128, 8, -25, 109, 75, -12, 7, 8, 10, 117, 124, -128, -128, 29, -26, 101, 21, -128, 87, 8, -39, 23, -128, 127, -127, 74, -55, 74, 112, 127, 4, 55, 44, -92, 123, 34, -93, 47, -21, -92, 17, 49, -121, 92, 7, -126, -125, 124, -74, 3, -59, 18, -91, 3, -9, 9, 56, 116, 7, -29, 33, 87, -21, -128, -13, 57, 74, 9, -29, -61, -97, -21, -95, -12, -114, 16, 82, 125, -7, 10, -24, 9, 77, -128, -102, -25, 3, -126, 10, 13, -18, 51, 26, 127, -79, 35, 51, 12, -50, -24, 1, -7, 22, 81, 65, 120, -30, -38, 85, 122, -4, -106, -11, 27, 53, 41, 8, -104, -66, -38, -124, 10, 12, 76, 117, -109, 9, 11, 2, -18, 3, 113, -16, -79, -39, -123, -20, -128, 2, 13, -33, -58, 10, 84, -104, 13, 64, 109, 1, 54, -12, 28, 24, 63, -126, 118, -82, 46, -12, -15, 14, -43, 60, 22, -32, -19, -46, 91, -107, 24, -94, 26, -47, 125, 6, 58, -15, -75, -26, -38, -35, 103, -16, -17, -13, 63, -2, 45, -45, -73, -23, 70, -87, 51, -17, 53, 76, 14, -18, -31, -14, 103, 8, 21, -28, -33, -20, -47, 6, 39, 40, -30, 7, -76, 55, 31, -20, -21, -59, 1, 25, -11, 17, 5, -13, -39, 0, -76, 50, -33, -29, -50, -16, -11, -12, -1, -46, 40, -10, 65, -19, 21, -41, -32, -83, -19, -4, 49, -60, 118, -24, -46, 9, 102, -20, 8, -19, 25, 31, -3, -37, 0, 25, 7, 29, 2, -39, 127, -64, -20, 64, 115, -30, 36, 100, 35, 122, 127, 127, -127, 127, -127, 19, 127, -89, -79, -32, 39, -127, 125, -80, 126, -127, 26, 8, 98, -8, -57, -90, -50, 126, 61, 127, -126, 40, -106, -68, 104, -125, -119, 11, 10, -127, 66, -56, -12, -126, -104, 27, 75, 38, -124, -126, -125, 84, -123, -45, -114, -128, 127, 103, -101, -124, 127, -11, -23, -123, 92, -123, 24, 126, 41, -2, -39, -27, -94, 40, -112, -48, 127, 58, 14, 38, -75, -64, 73, 117, 100, -119, -11, 6, 32, -126, -14, 35, 121, -10, 54, -60, 89, -3, 69, -25, -20, 43, -86, -34, 24, 27, 7, -81, -99, -23, -16, -26, 13, 35, -97, 80, -29, -13, -121, -12, -65, -94, 70, -89, -126, -95, 88, 33, 96, 29, -90, 69, 114, -78, 65, 90, -47, -47, 89, 1, -12, 3, 8, 30, 5, 2, -30, -1, 6, -7, 10, -4, 46, -27, -40, 22, -6, -17, 45, 24, -9, 23, -14, -63, -26, -12, -57, 27, 25, 55, -76, -47, 21, 34, 33, 26, 17, 14, 6, 9, 26, 25, -25, -25, -18 }; static const rnn_weight input_dense_bias[24] = { 38, -6, 127, 127, 127, -43, -127, 78, 127, 5, 127, 123, 127, 127, -128, -76, -126, 28, 127, 125, -30, 127, -89, -20 }; const DenseLayer input_dense = { input_dense_bias, input_dense_weights, 42, 24, ACTIVATION_TANH }; static const rnn_weight vad_gru_weights[1728] = { -124, 23, -123, -33, -95, -4, 8, -84, 4, 101, -119, 116, -4, 123, 103, -51, 29, -124, -114, -49, 31, 9, 75, -128, 0, -49, 37, -50, 46, -21, -63, -104, 54, 82, 33, 21, 70, 127, -9, -79, -39, -23, -127, 107, 122, -96, -46, -18, -39, 13, -28, -48, 14, 56, -52, 49, -1, -121, 25, -18, -36, -52, -57, -30, 54, -124, -26, -47, 10, 39, 12, 2, 9, -127, -128, 102, 21, 11, -64, -71, 89, -113, -111, 54, 31, 94, 121, -40, 30, 40, -109, 73, -9, 108, -92, 2, -127, 116, 127, 127, -122, 95, 127, -37, -127, 28, 89, 10, 24, -104, -62, -67, -14, 38, 14, -71, 22, -41, 20, -50, 39, 63, 86, 127, -18, 79, 4, -51, 2, 33, 117, -113, -78, 56, -91, 37, 34, -45, -44, -22, 21, -16, 56, 30, -84, -79, 38, -74, 127, 9, -25, 2, 82, 61, 25, -26, 26, 11, 117, -65, 12, -58, 42, -62, -93, 11, 11, 124, -123, 80, -125, 11, -90, 42, 94, 4, -109, -1, 85, -52, 45, -26, -27, 77, -5, 30, 90, 0, 95, -7, 53, 29, -82, 22, -9, 74, 2, -12, -73, 114, 97, -64, 122, -77, 43, 91, 86, 126, 106, 72, 90, -43, 46, 96, -51, 21, 22, 68, 22, 41, 79, 75, -46, -105, 23, -116, 127, -123, 102, 57, 85, 10, -29, 34, 125, 126, 124, 81, -15, 54, 96, -128, 39, -124, 103, 74, 126, 127, -50, -71, -122, -64, 93, -75, 71, 105, 122, 123, 126, 122, -127, 33, -63, -74, 124, -71, 33, 41, -56, 19, 6, 65, 41, 90, -116, -3, -46, 75, -13, 98, -74, -42, 74, -95, -96, 81, 24, 32, -19, -123, 74, 55, 109, 115, 0, 32, 33, 12, -20, 9, 127, 127, -61, 79, -48, -54, -49, 101, -9, 27, -106, 74, 119, 77, 87, -126, -24, 127, 124, 31, 34, 127, 40, 3, -90, 127, 23, 57, -53, 127, -69, -88, -33, 127, 19, -46, -9, -125, 13, -126, -113, 127, -41, 46, 106, -62, 3, -10, 111, 49, -34, -24, -20, -112, 11, 101, -50, -34, 50, 65, -64, -106, 70, -48, 60, 9, -122, -45, 15, -112, -26, -4, 1, 39, 23, 58, -45, -80, 127, 82, 58, 30, -94, -119, 51, -89, 95, -107, 30, 127, 125, 58, -52, -42, -38, -20, -122, 115, 39, -26, 5, 73, 13, -39, 43, -23, -20, -125, 23, 35, 53, -61, -66, 72, -20, 33, 8, 35, 4, 7, 18, 19, 16, -45, -50, -71, 31, -29, -41, -27, 10, 14, 27, 9, -23, 98, 6, -94, 92, 127, -114, 59, -26, -100, -62, -127, -17, -85, -60, 126, -42, -6, 33, -120, -26, -126, -127, -35, -114, -31, 25, -126, -100, -126, -64, -46, -31, 30, 25, -74, -111, -97, -81, -104, -114, -19, -9, -116, -69, 22, 30, 59, 8, -51, 16, -97, 18, -4, -89, 80, -50, 3, 36, -67, 56, 69, -26, 107, -10, 58, -28, -4, -57, -72, -111, 0, -75, -119, 14, -75, -49, -66, -49, 8, -121, 22, -54, 121, 30, 54, -26, -126, -123, 56, 5, 48, 21, -127, -11, 23, 25, -82, 6, -25, 119, 78, 4, -104, 27, 61, -48, 37, -13, -52, 50, -50, 44, -1, -22, -43, -59, -78, -67, -32, -26, 9, -3, 40, 16, 19, 3, -9, 20, -6, -37, 28, 39, 17, -19, -10, 1, 6, -59, 74, 47, 3, -119, 0, -128, -107, -25, -22, -69, -23, -111, -42, -93, -120, 90, -85, -54, -118, 76, -79, 124, 101, -77, -75, -17, -71, -114, 68, 55, 79, -1, -123, -20, 127, -65, -123, -128, -87, 123, 9, -115, -14, 7, -4, 127, -79, -115, 125, -28, 89, -83, 49, 89, 119, -69, -5, 12, -49, 60, 57, -24, -99, -110, 76, -83, 125, 73, 81, 11, 8, -45, 1, 83, 13, -70, -2, 97, 112, -97, 53, -9, -94, 124, 44, -49, -24, 52, 76, -110, -70, -114, -12, 72, -4, -114, 43, -43, 81, 102, -84, -27, 62, -40, 52, 58, 124, -35, -51, -123, -43, 56, -75, -34, -35, -106, 93, -43, 14, -16, 46, 62, -97, 21, 30, -53, 21, -11, -33, -20, -95, 4, -126, 12, 45, 20, 108, 85, 11, 20, -40, 99, 4, -25, -18, -23, -12, -126, -55, -20, -44, -51, 91, -127, 127, -44, 7, 127, 78, 38, 125, -6, -94, -103, 73, 126, -126, 18, 59, -46, 106, 76, 116, -31, 75, -4, 92, 102, 32, -31, 73, 42, -21, -28, 57, 127, -8, -107, 115, 124, -94, -4, -128, 29, -57, 70, -82, 50, -13, -44, 38, 67, -93, 6, -39, -46, 56, 68, 27, 61, 26, 18, -72, 127, 22, 18, -31, 127, 61, -65, -38, 1, -67, -1, 8, -73, 46, -116, -94, 58, -49, 71, -40, -63, -82, -20, -60, 93, 76, 69, -106, 34, -31, 4, -25, 107, -18, 45, 4, -61, 126, 54, -126, -125, 41, 19, 44, 32, -98, 125, -24, 125, -96, -125, 15, 87, -4, -90, 18, -40, 28, -69, 67, 22, 41, 39, 7, -48, -44, 12, 69, -13, 2, 44, -38, 111, -7, -126, -22, -9, 74, -128, -36, -7, -123, -15, -79, -91, -37, -127, -122, 104, 30, 7, 98, -37, 111, -116, -47, 127, -45, 118, -111, -123, -120, -77, -64, -125, 124, 77, 111, 77, 18, -113, 117, -9, 67, -77, 126, 49, -20, -124, 39, 41, -124, -34, 114, -87, -126, 98, -20, 59, -17, -24, 125, 107, 54, 35, 33, -44, 12, -29, 125, -71, -28, -63, -114, 28, -17, 121, -36, 127, 89, -122, -49, -18, -48, 17, 24, 19, -64, -128, 13, 86, 45, 13, -49, 55, 84, 48, 80, -39, 99, -127, 70, -33, 30, 50, 126, -65, -117, -13, -20, -24, 127, 115, -72, -104, 63, 126, -42, 57, 17, 46, 21, 119, 110, -100, -60, -112, 62, -33, 28, 26, -22, -60, -33, -54, 78, 25, 32, -114, 86, 44, 26, 43, 76, 121, 19, 97, -2, -3, -73, -68, 6, -116, 6, -43, -97, 46, -128, -120, -31, -119, -29, 16, 16, -126, -128, -126, -46, -9, -3, 92, -31, -76, -126, -3, -107, -12, -23, -69, 5, 51, 27, -42, 23, -70, -128, -29, 22, 29, -126, -55, 50, -71, -3, 127, 44, -27, -70, -63, -66, -70, 104, 86, 115, 29, -92, 41, -90, 44, -11, -28, 20, -11, -63, -16, 43, 31, 17, -73, -31, -1, -17, -11, -39, 56, 18, 124, 72, -14, 28, 69, -121, -125, 34, 127, 63, 86, -80, -126, -125, -124, -47, 124, 77, 124, -19, 23, -7, -50, 96, -128, -93, 102, -53, -36, -87, 119, -125, 92, -126, 118, 102, 72, -2, 125, 10, 97, 124, -125, 125, 71, -20, -47, -116, -121, -4, -9, -32, 79, -124, -36, 33, -128, -74, 125, 23, 127, -29, -115, -32, 124, -89, 32, -107, 43, -17, 24, 24, 18, 29, -13, -15, -36, 62, -91, 4, -41, 95, 28, -23, 6, 46, 84, 66, 77, 68, -70, -1, -23, -6, 65, 70, -21, 9, 77, -12, 2, -118, 4, 9, -108, 84, 52, 2, 52, 13, -10, 58, -110, 18, 66, -95, -23, 70, 31, -3, 56, 56, -3, -7, 1, -27, -48, -61, 41, -4, 10, -62, 32, -7, -24, 9, -48, -60, -4, 79, -20, -38, -76, 68, -49, -97, 0, -15, 5, -100, -49, -95, -99, -115, -9, -40, 10, 104, 13, 56, 127, -27, -109, -94, -118, -102, -44, -85, 52, 127, -4, 14, 62, 121, -122, -26, -79, -42, -34, 1, 25, -38, -79, -58, -31, -31, -90, -30, -123, 32, -56, 125, 66, 124, -1, 3, 91, -103, -7, 23, 78, -18, 9, 69, -69, 76, -38, -33, -2, -98, 18, 106, 84, 55, 87, -47, 35, -124, 64, 41, -14, 46, 25, -2, 120, -21, 82, 19, -79, -37, -3, -8, -16, 21, 19, -5, -28, -112, 39, -6, -30, 53, -69, 53, 46, 127, 123, 78, 20, 28, -7, 73, 72, 17, -40, 41, 111, 57, 32, -95, 29, 28, -39, -65, 54, -20, -63, 29, -67, 3, 44, -57, -47, 11, 61, -22, -44, 61, 48, -100, 20, 125, 96, -24, -16, 3, -69, -126, 74, -125, 9, 45, -67, -123, -59, -72, 118, 69, 45, 50, -57, 67, 13, -66, -106, 47, 62, 22, -1, -22, -25, -40, -125, 3, 125, 32, 102, -56, -25, -75, -30, 122, 60, -13, 36, -73, 7, -84, 124, 40, -118, 17, -87, -118, -8, 3, -27, 111, -40, 40, -51, 127, 125, -45, -30, -54, 46, 80, -1, -30, 101, -17, 18, 26, 54, 7, -12, 1, -127, 123, -122, -27, -75, 64, 10, 25, -15, -44, 127, -127, 5, -84, -81, -7, 19, -26, 126, 15, 116, -126, 14, -76, 44, 62, -110, -124, 125, -29, -87, -3, -69, 82, 90, 57, -123, 123, 100, -19, -51, -32, 69, 37, -57, -128, -124, -72, -13, 51, -7, -45, -73, 5, 99, -26, -117, -96, -109, 4, -31, -12, 0, 31, -42, -27, 12, -81, 118, 39, 83, 14, 41, -126, 107, -82, 94, -116, -122, -47, -109, -84, -128, -35, -56, 66, 8, -65, 19, 42, -46, -72, -109, 41, 43, -127, -113, 58, 127, 42, -75, -1, 65, 117, -55, -113, -123, 124, 43, -96, -115, -19, 68, 15, 94, 3, 75, 0, 34, 9, 42, 110, -48, 92, -76, 99, -17, 27, 32, 13, 125, 50, -17, 56, 4, 53, 34, -8, 99, 80, -126, -21, -65, -11, -46, 44, -81, -3, -121, 123, 66, -81, -84, 119, 127, 84, 105, 45, -66, -42, -23, 32, -25, 12, 111, 127, 88, 125, 30, 24, -127, -9, -54, 127, -116, -119, 88, 70, 94, -120, 35, -93, 15, 22, -21, 25, -110, -123, -45, 8, -109, 125, -122, -86, -126, 8, -14, -120, -45, -45, 69, -125, -122, 6, 81, 86, 125, 95, 54, 77, 54, -123, 126, -85, -117, 56, 11, 0, -61, -91, -12, -2, -113, -3, -15, -122, -63, -91, 10, 84, -111, 125, 93, 21, 62, -78, -116, 13, -57, 28, -124, 126, 110, 12, 15, 95, 15, -19, -125, -97, 52, -7, 101, 9, 20, -125, -26, -56, 72, 77, 12, -126, 22, -29, 47, 62, 95, 112, 69, 32, 97, -83, -8, -5, 67, -63, -123, 79, 59, 0, -6, -17, 4, -111, -52, 27, 65, 0 }; static const rnn_weight vad_gru_recurrent_weights[1728] = { 65, 83, 35, 56, 24, -34, -28, -2, 125, 19, 42, -9, 124, -53, 24, -87, 11, 35, -81, -35, -125, -31, 123, -21, 33, -91, 113, -93, 45, -6, 53, 38, -92, 8, -27, 87, 4, 43, 43, 10, -128, -128, -46, 127, -38, -45, 25, -87, 19, 5, 52, -96, -23, -29, 121, -126, -24, -20, -2, 69, -50, 6, 71, -81, -125, 90, -94, 1, -38, 36, 89, 17, -60, 71, -48, 18, -15, 44, -18, 59, 11, 114, -51, 32, 110, 1, 4, 109, -24, 127, 27, 60, 88, 24, 45, -59, 75, -36, 8, 57, -32, -25, 13, 126, -89, -61, -76, 127, 18, -62, -68, 23, -113, 5, 126, 43, -88, 26, -78, 18, 75, 21, 9, -74, 20, 41, 126, -118, -15, 9, 116, 126, -127, 34, -6, 126, -128, -53, -54, -55, -121, 70, 127, -12, -68, 82, -25, 104, -126, 126, -21, -26, 124, -75, -127, -120, 13, 61, -64, -108, -63, -65, -44, -35, -61, -39, 109, -74, 113, -3, 108, -30, 125, 120, 39, 125, -128, -95, -99, 111, 9, 25, 114, -75, -92, -54, -12, -32, -38, 10, 31, 10, 63, 51, 40, -99, 74, 4, 50, -128, -36, -35, -11, -28, -126, -7, 66, -58, -126, -22, -83, -61, -127, 49, 126, -8, 7, 62, 36, -11, -32, -44, 63, 116, 41, 65, -127, 126, 63, -30, -96, 74, -92, 127, 38, -18, -128, 68, -5, 101, -4, 85, 58, 79, 0, -58, 8, 119, -70, -1, -79, -68, 114, -28, -90, -6, -112, 2, 127, -8, 10, 55, -59, -126, 127, 125, 80, 72, 35, -54, 95, -124, -124, 79, 23, -46, -61, -127, -100, 99, -77, 8, -87, 5, -2, 49, 85, 7, -71, 82, 53, -41, 22, -22, -93, -103, 6, 52, -56, 14, -8, -111, 85, 16, 54, 32, -118, -24, 61, -53, 96, -70, -5, -17, -67, -84, -7, -82, -107, -96, 21, -83, -58, 50, 12, -126, -1, -28, 34, -126, 115, 17, 91, 1, -127, 72, 11, 126, -81, 6, 96, -8, 77, 15, -6, 63, -27, 20, -123, -109, 85, -79, -17, 126, -92, 2, -61, 20, 14, 17, 121, 123, 30, 57, 120, 127, 57, 42, 117, 98, 67, 39, -20, -70, 100, 7, 125, 122, 40, 16, -79, 125, 83, 41, -106, -57, 24, 55, 27, -66, -111, -44, -7, -43, -66, 121, 42, -128, -45, 35, 15, -127, 34, -35, -34, -40, -18, -6, 63, 111, 31, 116, 127, 19, 24, -71, -39, 34, 11, 19, -40, 27, 12, 106, -10, 56, -82, -106, -2, -50, -52, 114, -126, -34, -43, -68, 10, 76, 57, -118, -128, 37, -104, 76, 125, 3, -76, 127, -29, 84, -94, -15, 55, 125, 79, 127, -57, -125, 104, -68, 126, 126, -77, 51, 45, 33, -109, 115, -11, 1, 95, -121, -5, -9, -126, -114, 39, 68, -126, -107, -51, -42, 24, -8, 51, -27, -43, 66, -45, 62, -98, -109, 69, 67, 0, -125, -128, 49, 31, 126, -122, 2, -55, -67, -126, -70, -128, -125, -77, 25, 16, -8, -102, 11, -75, 82, 38, -5, 5, 19, 34, 47, -127, -93, 21, 24, -97, -18, 31, 39, 34, -20, 22, 123, 7, -77, -81, -46, -9, 1, 23, 39, -127, -43, -8, -50, 10, -21, 59, -9, -4, -13, -27, 44, 127, 52, -47, 70, -43, 52, 101, -49, 27, 45, 49, 33, -125, 55, 114, 20, -1, 76, -24, -96, 105, 24, 126, 75, -21, -105, 13, -42, 40, 126, -30, -39, -95, 125, -63, 11, 6, 125, 125, -14, 5, 42, -61, -4, 49, 88, 6, -107, -28, 19, -29, 47, 126, 6, -46, -89, -18, 91, -20, -6, 118, -21, -22, 39, 115, 11, -42, 54, 73, -55, -77, 62, -27, -59, -99, -12, -127, -40, 56, -3, -124, -91, 71, -111, 6, -19, 82, -24, -35, 102, -42, 7, -126, -126, -125, 18, 98, -52, 127, 105, -52, 40, -83, 126, -122, 109, 5, 127, 48, 6, 5, -125, 100, -16, 29, 85, -89, 8, 4, 41, 62, -127, 62, 122, 85, 122, -107, 8, -125, 93, -127, 127, 102, 19, 19, -66, 41, -42, 114, 127, -48, -117, -29, -6, -73, -102, -3, -19, 0, 88, 42, 87, -117, -20, 2, 122, 28, 63, 71, 66, 120, 93, 124, -43, 49, 103, 31, 90, -91, -22, -126, 26, -24, -21, 51, -126, 87, -103, -69, -10, -66, -23, 20, 97, 36, 25, -127, 30, -20, -63, 30, 51, -116, 23, 40, -39, 36, -83, -77, -25, -50, 110, 14, 13, -109, 125, -65, -55, -87, 124, -126, -32, -72, -108, 127, 127, -125, -124, 61, 121, 102, -128, -127, 16, 100, 127, -124, -68, 72, -93, -128, 43, -93, -19, -125, -97, -113, -33, 83, 127, -44, 127, -75, 127, 16, 44, 50, -122, 23, 118, 46, 19, 26, -128, 10, 4, 99, -14, -82, -13, 30, 125, 57, 65, 60, -71, 35, 98, 28, 7, 1, 43, 89, 70, 75, 121, -59, 82, -126, -53, -16, -116, -65, 52, -52, 0, 80, 35, 45, -61, 46, 8, 107, 27, -26, -118, 90, 57, -10, 7, -15, 0, -39, -4, 12, 29, -1, 116, 84, 79, 119, 125, -59, 28, -6, -25, -43, 2, 90, 79, 67, 103, -82, 2, -6, 125, 19, 73, 0, -105, 112, -17, 104, 107, 124, 106, 19, 56, -44, 55, -112, 6, -39, -83, 126, -93, -98, 57, -120, -23, -38, 2, -31, -48, 106, 127, 127, 69, 16, 110, 71, 104, 62, -12, -22, 42, -37, -94, 34, -1, -32, -12, -124, -47, -13, 60, -75, -66, 58, -127, -2, 64, 76, -106, 73, -49, -31, 127, 126, 31, 16, 127, -110, 107, -16, -53, 20, 69, -14, -125, 59, -44, 15, 120, 125, 125, 43, 6, 19, -58, 127, 127, 43, 16, 82, 97, -127, 127, -93, -41, 88, 0, 77, -15, 116, 16, -124, -31, -3, 95, -40, -126, -54, -126, -83, -8, -59, 6, 67, -29, 4, 124, -10, 112, -28, -8, 85, -21, 45, 84, 6, -8, 11, 72, 32, 84, -62, 77, 2, -36, 75, 31, -50, 116, 126, 119, -88, -55, -14, -37, 126, 40, -108, -6, -6, 57, 64, -28, -76, 30, -117, -93, 31, -92, -44, -64, 94, 58, 65, 114, 41, 47, 71, 42, -26, 99, -126, 57, -5, 74, -19, -113, -1, 67, -21, 126, 1, -3, 33, 60, -82, 37, -48, 89, 114, -38, 127, -114, 35, 58, -5, 21, -46, 121, -123, -43, 127, 115, 123, 122, -101, 126, 127, 81, 52, 89, -127, 102, 42, 117, -9, -2, 125, 127, 110, 96, 120, 66, 70, 124, 55, 84, -38, -58, 119, -127, -16, -79, 123, 18, -127, -50, -38, 120, -85, 1, 7, -56, 108, -77, -2, 21, 37, 1, 13, -105, -69, 28, -87, 33, -104, -51, 126, 41, 3, -121, 28, 71, 58, 86, -8, 127, 94, -55, 125, 40, -19, 127, -33, -87, -23, 7, -111, -68, 9, 84, -119, 55, -82, 78, -37, -20, -9, -23, 53, -13, 15, -46, 116, 126, -127, 56, -126, 125, -7, -1, 45, 26, 125, 121, 29, 47, -86, 30, 10, 76, -125, -7, 23, 92, -12, -39, -18, 92, -97, -8, -85, -41, 49, -50, 123, -37, -126, -30, 14, 79, -49, -65, 9, -36, -38, -96, 85, -24, -13, 37, -25, -5, -64, -127, 55, -60, -18, -61, -63, 127, 56, 67, 15, 124, 72, 120, 127, 40, -10, 114, 24, -23, 46, 78, -53, 125, 86, 124, 86, 0, 38, 93, 21, 127, 123, 75, -72, 13, 48, 33, 83, -51, 15, -32, -49, -33, 120, 64, 7, 9, 65, 60, 21, -21, -61, -53, -113, 84, -97, 101, 37, -114, -27, 41, 73, 126, -10, 59, 61, -15, 70, -13, 82, -4, 69, 56, 94, -91, -50, 92, -74, -48, 53, -7, -107, 127, 28, 30, -26, -21, -61, 77, 82, 64, -91, -125, 122, -104, 127, 123, 122, 123, 76, -126, 127, -6, -80, 7, 40, -66, -65, 54, -2, 23, 96, -64, 74, 2, -53, -12, -123, 39, 60, -20, 16, -17, -97, 23, -4, -53, -122, 32, -16, -54, -95, 43, 71, -1, -67, -33, 41, 18, 72, 28, -83, 31, -100, -91, -27, 10, -128, -106, 2, 76, -13, 42, 34, 112, -19, 44, 40, -9, -11, 65, 92, -43, -125, 2, 47, -32, 25, 122, -29, 12, 101, -8, -126, -23, 43, 7, 125, -20, -124, 82, -2, 13, -73, -106, 115, 31, 116, -23, -44, -71, 84, 3, 47, 91, 127, 127, -15, 95, 7, 93, 5, 113, -50, 54, 11, 13, -127, 17, 72, 43, -23, 5, -70, 20, 15, -27, 99, 69, -109, -122, -94, 16, 127, 0, 116, 104, 45, 108, -34, 87, 72, -14, 118, 46, 42, 109, -26, 95, 93, 127, 60, 127, -93, -54, -122, 34, -105, 56, 55, 103, 125, -71, -50, 95, -72, 127, 107, 21, 73, 126, 61, 127, 127, 24, -62, 90, 73, 90, -46, -78, -124, 72, 123, -42, 50, -107, 17, -32, -62, -89, 124, 1, 80, -2, 117, 119, -65, -127, -95, -121, -52, 103, 66, 75, -3, -62, -127, 127, -74, 124, 79, 49, 40, 105, -67, -71, -70, 43, 127, 119, -4, 66, 43, 23, 91, -126, 15, 63, -119, 112, 103, 15, -99, 31, -127, 69, 116, -46, -67, 2, -126, -29, 30, 30, -69, -98, -47, -87, -70, -127, 23, -73, 30, -7, 94, -52, -65, 98, -45, 97, 53, 23, -9, -22, -52, -47, 6, -1, -85, -15, -61, -14, 68, 110, -10, -121, -25, -35, -15, -94, -123, 27, 75, 48, -66, -56, -44, 93, 109, 67, -36, 24, 70, -126, 8, -127, 126, 52, 11, -32, 120, -13, -26, -28, -125, 127, 106, -50, 124, 36, -126, -12, 0, -23, 76, -71, -126, -12, -17, -82, 12, 124, 57, 33, 4, 77, -46, 71, -34, 72, 125, -128, 124, -24, -128, 75, -120, 69, -45, 55, 33, 127, -33, 4, -105, -41, -59, -91, 123, 44, -127, 127, -67, 52, 25, -125, -65, 100, -25, 123, 6, 11, -123, -92, -33, 126, -17, -4, 29, 33, 127, 96, 3, 87, -48, -18, -70, 123, 58, -127, -3, -52, -1, -36, -41, 127, 51, -52, -27, 46, -83, 57, 9, 126, 127, 94, 79, -37, -127, -40, 67, 52, 82, -66, 122, -13, -73, 127, -8, -80, 46, -48, 4, -54 }; static const rnn_weight vad_gru_bias[72] = { 124, 125, -57, -126, 53, 123, 127, -75, 68, 102, -2, 116, 124, 127, 124, 125, 126, 123, -16, 48, 125, 126, 78, 85, 11, 126, -30, -30, -64, -3, -105, -29, -17, 69, 63, 2, -32, -10, -62, 113, -52, 112, -109, 112, 7, -40, 73, 53, 62, 6, -2, 0, 0, 100, -16, 26, -24, 56, 26, -10, -33, 41, 70, 109, -29, 127, 34, -66, 49, 53, 27, 62 }; const GRULayer vad_gru = { vad_gru_bias, vad_gru_weights, vad_gru_recurrent_weights, 24, 24, ACTIVATION_RELU }; static const rnn_weight noise_gru_weights[12960] = { -10, -8, 5, -72, 7, 55, -38, 3, 10, 4, 21, 60, 73, 0, -3, 34, 49, -36, 17, 8, 18, 41, -51, -42, 34, -8, 126, 15, 112, 74, -60, -60, 53, -17, 65, 6, 74, -1, 26, 80, -46, -99, -47, 40, 29, -21, 85, -75, 27, -117, 46, -22, -76, 56, 16, -67, -49, -63, -35, -10, -20, 10, 68, 7, -1, 37, 58, -53, 6, -79, -20, 12, 6, 91, -63, 67, 58, -13, -23, -74, -50, -77, -53, -22, -56, 123, -33, 28, 74, -85, -9, -57, -32, 38, 21, 122, 40, 23, -30, -81, -68, -29, -14, -98, -1, -62, -32, 19, 102, 26, 28, -23, 104, 28, -43, -20, -41, 28, 80, -22, -88, 6, -26, 14, 34, -46, 57, -33, -105, -16, 3, -17, -55, -1, -47, -122, 11, 16, 62, 78, -1, -64, 71, 57, -5, 45, 65, -93, 31, 30, -25, 21, 23, 32, -1, -75, -10, 75, -90, 21, 7, -110, -77, -39, 18, -39, 54, -97, 12, 52, -97, 17, 73, 120, -81, -114, 67, 82, 29, -71, -47, 69, -64, 17, -105, -24, -70, -32, -2, -112, -31, -48, 1, 22, 92, -21, -89, -65, 16, 49, 3, 15, 80, -21, -1, 37, -4, -25, 12, -80, -43, 56, -7, 36, -20, 18, -12, 39, 66, 74, -100, 117, 76, -82, -93, 63, 56, 36, 5, 41, -57, 31, -47, -14, 52, -22, -56, 29, -123, -104, 41, -113, 124, -106, -36, 41, -86, -40, 44, 28, -6, 114, -32, -17, -26, -77, -69, 42, -33, 61, 28, 82, -18, 71, -53, -63, 122, -38, -49, -108, -32, 126, 126, 45, 43, -56, 61, 9, -20, -53, 122, 98, -3, 3, 24, -3, 80, -42, -20, 57, -34, 108, -26, 48, 116, -14, 53, 5, -45, 21, -55, 114, -49, -29, -44, -5, -70, 98, 63, -115, -66, 53, -55, -19, 83, -12, 7, 47, 42, 15, -36, 44, 75, -85, 105, -84, -17, -127, 15, -67, -105, 23, 36, -1, -16, -116, 21, 58, 69, -57, -104, -81, -49, 91, 26, -72, 33, -31, -37, -79, 5, 9, 123, -61, 11, 67, -14, -29, 41, -53, 37, -59, -20, -24, 95, 125, -66, -26, 17, 28, -43, -8, -100, 80, -6, 0, 37, -123, -54, -92, 28, 56, 127, 48, 11, -58, 99, -90, 63, -4, 6, 10, 37, -38, -15, 31, 5, -39, 25, -17, 24, -23, -64, -68, 41, 65, 28, -113, -115, -27, -51, 50, 9, -101, 73, -41, -104, 88, -71, 3, -87, 119, -73, 20, -35, 0, -30, 34, -31, -9, -4, 23, -19, 35, -16, 111, 66, -52, -107, 101, 54, -2, -3, 109, -40, -2, 119, 74, -26, -116, -105, -90, 25, -111, -43, -92, -3, -104, 102, 11, 19, -83, 14, -62, 38, 57, 50, -10, 36, -95, 124, 32, -34, -123, -7, -109, 124, -119, -67, -116, -31, 114, -65, -34, -126, 8, 8, 5, 53, -28, 53, 84, -9, -14, 92, -70, 74, 116, -4, 121, -49, 108, 0, 126, 123, -1, -25, 24, 56, -121, 20, -47, -41, -11, -22, -32, -40, -41, -66, 29, -128, -30, -28, 31, -39, 30, 57, -96, 63, -121, 71, 1, -29, -20, 72, 114, 12, -43, 23, -75, 24, -4, -123, 17, 18, -68, -23, 51, -30, 39, -125, -48, 13, -119, -75, -74, 51, 125, -10, 29, -103, 6, -28, 22, -45, 19, 17, 19, 33, -3, -18, -30, -12, -25, -128, 61, 94, 47, -56, 59, -62, 66, -28, 18, -115, 12, -3, -80, 60, -62, 55, -16, 68, 23, -6, 109, 11, 0, -7, -96, -11, 21, 44, -75, -8, -10, -10, 69, 14, 14, -41, 26, 67, 37, -30, 44, 11, -16, 3, 66, 1, -18, 21, 96, -29, -100, 27, -8, -98, 21, -2, 58, -45, -15, 93, 37, -66, -48, -7, -5, 39, -57, 17, -81, 42, 0, -40, 123, 3, 118, -14, 56, -113, -68, -127, 74, -78, 46, 97, -61, -42, 68, -32, 16, -10, -82, -6, 1, 98, -48, 20, 32, -102, -35, 45, -5, -91, 26, 37, 18, 59, -88, -29, 17, 43, 33, 14, 6, -37, -37, 5, -7, -37, -13, 72, -6, -128, -43, 17, 32, 45, -26, 4, -85, -59, 8, 5, -27, 51, 55, 42, -79, -13, -51, 49, 70, -26, -21, 9, 27, 21, -26, -76, 28, 1, 89, -76, 23, -4, 10, 31, -13, -22, 3, 41, 24, 18, 25, -55, 10, -23, 4, -72, -18, -91, -50, 1, -55, 12, -26, -43, 11, -14, 27, -82, -73, 36, 27, -20, 62, 53, 100, 75, -12, -37, -77, -127, 32, -21, -24, 34, -26, -39, -5, -66, 94, -97, 19, 16, 61, 59, 65, 37, -64, 26, -34, 63, 74, 7, 38, -2, -27, 82, -73, -10, 37, -43, 1, 23, 24, 25, -5, 13, 6, -76, 78, 46, 44, -107, 14, 7, -22, 28, -125, 47, -48, 28, -16, 15, 1, -16, 21, 15, 51, 37, -17, 2, 39, -23, -28, 10, -51, -48, -1, 6, 88, 38, 22, -40, 37, -22, -23, 67, -4, -3, -6, 9, 108, -32, 31, 77, 28, -101, -23, -10, -38, -13, 12, -34, 55, 24, -4, 48, 29, -72, -83, 41, -31, -49, -68, 5, -3, 124, -19, 44, -94, -4, -8, -31, 9, -21, 58, -60, 24, 13, -9, 97, 53, 93, -51, 105, 55, 36, -32, 6, -51, -99, 19, 39, -63, -64, 29, 22, 5, -24, -74, 72, -6, 35, 37, -25, 65, 74, 29, 30, 65, 91, 30, -42, 15, 42, -64, -87, -68, 53, -78, -33, 21, -60, 33, 7, 6, 10, 68, 55, -47, 51, -56, 79, -29, -1, -66, -29, 50, 66, -12, -67, 69, -53, -90, -31, -123, 49, 7, 10, -6, 55, -61, -14, -6, 59, -2, -41, 21, 10, -21, -24, -23, -34, 30, -49, -41, -27, 36, -56, 46, 7, 18, -23, 78, -49, 1, -37, 43, 77, -21, -19, 18, 14, 35, 92, 39, -39, 44, -58, -1, 4, -63, 27, 79, -14, -7, -41, -34, -24, -25, 13, -14, -30, 5, -62, 13, -52, 53, 40, -18, -29, 52, -20, 11, 20, 23, -47, 51, 30, -91, -46, 39, 4, 53, -18, 2, -28, -12, 62, -29, -57, -13, -20, 60, -15, 3, 49, -26, 0, -30, -18, 97, 11, 52, 43, 87, 107, -94, -30, 63, -4, -62, 48, 2, 22, 7, -11, -79, -41, 18, -28, 9, 30, -58, 80, -64, 45, 2, 28, -49, -25, -34, 25, 87, 108, -8, -42, -34, 61, -14, -13, 62, -98, -5, 23, 15, -2, -1, -6, -52, 40, -33, 61, -38, 76, -115, -23, 22, 17, 25, 63, -37, -32, 26, -19, -8, 54, 6, -39, -28, 25, 40, -29, 33, 10, -50, 20, 25, 6, -22, 69, -24, -115, 2, -13, -28, 28, -8, 109, -18, -64, 96, 6, 7, 31, -10, 7, -34, 24, -10, 50, 23, -59, -55, 45, 37, -98, 27, -17, -47, 63, 57, 13, 35, 4, -85, -65, 52, -54, -19, -40, 4, -68, -61, -85, 98, -81, 44, 25, -17, 44, -33, -31, -44, 21, -6, -29, -32, -2, 50, -31, -16, 46, 50, -54, -18, 70, -88, -44, 26, -51, -34, 21, 48, -16, -15, 5, -28, -37, 25, -52, 25, 37, -60, 19, -18, -49, 72, -120, -1, 65, -61, -28, 25, -114, 89, -61, 126, -48, -64, 69, 37, 46, 9, 18, -117, -35, 64, -75, 28, 127, 33, -63, 22, -15, -28, -9, -41, 27, 68, -4, 54, 4, -89, -8, -10, 83, 73, -11, -90, -8, 14, -92, -38, 11, -22, -36, 33, -37, -38, -126, -74, -5, -12, -8, -4, -28, -47, -30, -30, -6, 43, -5, 56, 3, -16, -83, -73, -51, 23, -99, -10, -2, 57, -18, -17, -53, 3, -21, 35, 25, -116, -20, -33, 89, -44, 49, 102, -74, -57, -65, -127, -33, 59, 60, 20, -60, -1, -18, 10, -30, 106, 3, -24, -15, 93, 45, -22, 7, 55, 9, -27, -82, 3, 19, 9, 4, -14, -43, -36, -19, 97, 85, 31, 42, -35, -19, -12, -1, 68, -53, 46, -127, -93, 16, -63, -58, -126, 55, 6, -52, 97, -41, 59, 49, -9, 10, 54, -42, 5, -11, -25, -1, 35, 72, 52, 28, -6, -54, 30, -28, 18, 38, -17, 57, -8, -44, -20, 42, -20, 94, -46, -2, -81, 110, 27, -66, 5, 63, 36, -51, -55, -27, 71, 125, -5, -12, -57, 65, -98, 36, -12, 17, -8, -13, -8, -17, -52, -109, 15, -31, 31, 9, -23, -22, -11, 10, 55, -11, -52, -69, 52, 10, -23, 47, -35, -4, -65, 15, 33, 53, -14, -104, 26, -26, -29, -8, 97, -2, 58, -127, -4, -106, 35, 53, -2, -71, 2, 79, 54, 39, -74, -121, 124, 41, 25, -33, 4, 28, -18, -9, -43, 59, -11, 31, -19, -122, 86, 25, 54, -40, -18, 49, -25, -28, 118, 65, -102, 111, -39, -7, -89, -38, -17, 79, 0, -50, 72, 51, 22, 24, 36, 59, 1, 66, -119, -84, -8, 102, 44, 15, 56, 26, -74, -29, 28, 13, -75, 32, 78, -38, -45, -80, -90, 13, 3, 34, -76, -122, 120, -82, -34, 6, -32, -100, -89, 14, -14, 73, 24, -41, 53, 30, -80, -63, 51, -17, 33, 47, -17, 14, -17, 32, 74, -52, 2, 14, -67, -16, -18, -57, 18, -14, 44, -73, 45, 107, 38, 69, -24, -12, 114, -15, 91, 10, -26, -51, 78, 63, -78, -5, -120, 14, 32, -6, -25, -49, 67, 20, -66, 7, 65, 46, -41, -32, 62, 41, -50, -87, -34, 64, 70, 23, -36, 44, -51, -127, -22, -102, 33, -58, -23, 105, -29, -33, 47, 9, -44, 35, -36, -21, 126, -90, -34, 105, -6, 18, -35, 3, -14, 65, 114, -2, -25, -27, -72, -63, 61, -109, -13, -113, 8, -45, 22, 105, 6, 45, -47, 65, 16, 79, 28, -21, 82, 37, -15, -64, -34, -114, 29, 67, 43, 78, 52, 34, -84, -54, -48, -65, 63, -8, 18, -16, 10, 3, 71, -101, 119, -24, 88, -26, 33, -38, -80, 14, -123, 24, -33, -20, 52, -1, -40, 49, -13, 8, -39, 23, -5, -11, -23, -10, -17, -25, 43, 29, -13, -34, -19, -35, -18, -21, 51, -21, -3, -19, 12, -2, 50, 48, 22, -56, 39, -5, -38, -60, -11, 36, 33, 13, -53, -9, 94, 8, -62, 55, -11, 101, 22, 2, -8, -127, 98, -25, -37, -73, 71, -16, 45, 67, 8, -17, -90, -91, 23, -120, -39, -9, 28, -128, 8, -52, -107, -27, 68, 33, -31, 29, 124, -26, 30, -10, -31, 33, 47, 9, -65, -46, 13, -90, 126, 99, -37, -81, 1, -61, 15, -4, 4, -9, -34, -33, -33, -28, -49, 14, -93, 87, -80, 59, -56, -50, -45, 45, -65, -97, 6, -121, 6, -113, 19, 56, -21, 4, 12, 87, 5, -112, 126, 69, 27, -70, 82, 31, -27, -123, -16, 21, 32, -5, 83, -95, -7, -1, 93, -9, 15, 124, 21, 21, -7, -45, -16, -66, 5, -34, -118, -16, -32, -34, -44, 2, 124, -78, 8, 90, -27, 127, 44, -28, 114, -30, 114, -8, 27, -56, 18, 59, -24, -62, 16, -25, -31, 71, 17, 3, 12, 92, -4, -78, 37, 127, 85, -3, -17, 80, 32, -2, 84, -71, -31, 62, -26, 47, -81, -51, -95, 66, -52, -57, -31, -10, 54, 116, 88, -3, -122, -93, 7, 37, -70, -28, -91, 39, 12, -94, 41, 44, 70, -55, 69, 20, 56, -34, 1, 9, -34, -37, -4, -2, 23, 68, -44, 2, -46, -5, -72, -104, -94, -56, -30, -59, 56, 14, 108, 36, 115, -96, 29, -114, 105, -64, 5, 65, -82, 25, -10, 117, 58, 20, -19, 122, 33, -37, 35, -19, -120, 6, -10, 78, -34, 126, -116, -37, 59, -30, 55, 47, 51, -42, 11, -2, -26, 29, 25, 51, -5, -34, 89, -29, 76, -51, -44, 9, -17, 46, -42, 5, -52, -24, -14, 6, 127, 127, -9, -5, -81, -2, 65, -67, 72, 99, 14, -13, -6, -7, -36, -54, -6, -4, 30, -29, -27, -28, -56, 83, -1, 29, -24, -48, -23, -20, 11, -2, -4, -31, 39, -45, 0, -18, -73, -29, 48, 51, -20, 61, 24, -62, 75, -32, -18, -44, -38, 44, 26, 38, -56, 14, -34, -48, -7, 19, -55, 20, -95, 45, 16, 13, 93, -13, 21, -72, 23, 124, -33, -52, 51, 5, 8, -25, -10, -77, 102, -25, -1, -14, 14, 4, 16, -28, 98, 18, -43, -26, 12, -30, -86, -68, 81, 9, -50, 80, -56, -11, 37, 24, -11, 28, 1, 55, 36, 34, 23, -87, -58, 10, 31, -11, 19, -48, 48, 95, -12, 33, -46, 100, 52, 32, -49, -24, -27, 46, -6, -31, 21, 39, 33, 63, -65, -35, 79, 127, 11, 34, -13, -124, 10, -54, 24, 3, 24, 11, 16, -19, -45, 36, 52, -32, 90, -33, -68, -51, 33, -16, 34, 65, 98, -8, 125, 60, -83, -21, 6, 111, 87, -46, -59, 44, -7, 89, 124, 28, 32, 30, 68, 106, -37, -1, -2, -97, -57, -92, -37, 56, -75, 22, -31, 100, -44, -10, 12, -2, 95, 36, 3, 74, 35, 127, 51, -41, 72, 27, 59, -105, 103, -2, -32, -116, 23, 43, 6, 48, -20, 110, 66, -42, -28, -41, -10, 33, 117, 14, 89, -18, -36, 54, 39, 88, -72, -27, 109, 27, -13, -119, 54, -18, -14, 85, -12, 64, 6, 44, -15, -66, -46, -18, 90, 109, 98, 119, -28, 11, 46, 29, 115, -20, -106, -27, 97, -45, -82, 43, -103, 122, -14, -122, 24, 10, -128, 14, 10, 72, 40, -71, -10, -21, -99, -103, 2, -120, 50, 0, 35, -100, 46, 77, 88, -28, -1, 26, -46, -3, -22, -37, -11, -82, -82, -128, -21, -16, -4, -9, -69, -5, 40, 0, -63, 33, 19, -14, 83, 54, 24, 66, -8, 24, -122, -44, -32, 86, 38, -3, 6, 48, 32, 62, 34, 3, -42, 28, -11, -23, -23, 21, 12, -2, 36, 4, -20, -1, 64, -20, 11, 73, 23, -7, -50, 42, 7, 99, 40, -19, 39, 26, 65, 117, 7, -16, -6, 79, 70, -48, -12, 47, 19, 7, -54, -7, -43, 39, 50, 23, 53, -48, -97, 28, 6, 83, -25, 42, 38, 19, 32, -59, 22, -60, -94, -45, -45, 83, -3, -69, 75, 34, 61, 66, 30, 19, -14, -32, -4, 13, -38, 8, -36, 31, -48, -56, -49, -24, 72, -73, 60, 17, -40, 6, 125, 27, -18, 41, 28, 44, 29, -32, 45, -33, -6, -41, 123, 5, -31, 89, 92, 20, -66, 73, -39, -51, 0, -31, 21, 69, 99, -50, -3, -13, -10, -5, 72, 14, -13, -57, 20, -33, 107, -84, 5, -57, -37, -10, -46, -80, -108, 3, 49, -36, -28, -44, 34, -125, 41, 48, -3, -33, 2, 12, 27, -56, -41, 18, -42, -25, 81, -67, -86, -29, -7, 94, -89, 30, 84, 73, -21, 40, 29, -27, -19, -35, 68, 64, -4, -100, -102, -94, -19, -18, -30, -36, 26, -2, 33, -93, 56, 67, 103, -73, -101, -45, 18, 11, 18, -33, 43, 34, 37, -71, 27, -38, -13, -26, -13, -16, 113, 33, 84, -26, -55, -17, -13, 15, 32, -8, -37, 32, -5, 113, -10, 126, 53, 23, -24, -52, -11, -55, -9, -37, -33, 40, 65, 3, -95, -65, 78, -13, -75, -22, 9, 93, 68, 46, 127, 16, 87, -47, 59, -36, -5, -3, 37, 16, 66, 19, -69, 42, -15, -18, 76, 96, 91, -7, 24, -29, 47, -20, 56, 45, -54, 50, -70, -52, 54, 41, 20, 63, 71, -63, 40, 1, 80, 20, -39, 6, -35, 71, -40, 7, -28, 63, -7, -49, -12, 1, -16, 73, 9, 50, -46, -10, 73, -81, 94, -13, 6, -1, 31, -19, 15, 41, 3, -17, 0, -85, -93, -86, -10, -37, 47, -6, -62, 30, 35, 20, 99, 37, 63, -17, -42, -28, -96, 2, -22, 3, 15, 28, 11, -115, 48, -34, 6, -30, -78, -85, 38, 25, -32, -29, -97, 2, 14, 26, 47, 99, 119, 71, 8, -60, 42, -55, 30, 53, 1, 31, -103, -20, -11, 0, 87, 37, -5, 89, 15, -32, -12, 55, 60, 3, -32, -124, -2, -88, 53, -51, 55, -4, -53, -46, 94, 18, 57, -72, 14, -41, 11, 14, -29, -3, -4, -9, 34, 18, -10, -72, -14, -82, -90, -31, 11, -120, -48, 44, 3, -6, 79, -15, 8, -16, -89, 20, -125, -72, 69, 19, 118, -54, -2, -10, 50, -28, -3, 17, -22, 104, 17, 101, -61, -9, -117, 5, -24, -105, -117, -115, 28, -120, 36, -62, -77, 50, 67, 79, -41, -9, 4, 2, 15, 114, -12, -16, 15, -49, 50, -122, -46, 30, 39, 56, 49, 14, -28, -71, -125, 36, 115, -46, 47, -45, -16, 69, 113, -7, -119, -43, -16, 17, -11, 102, 120, -34, 64, -5, -53, 14, 0, -124, 120, 14, -26, 42, 74, 55, -12, 103, -37, 27, -54, 13, -54, -9, 39, 6, 6, -28, 43, 54, 21, 46, -90, -58, 122, -21, -81, -13, -39, 50, 106, -2, 49, 9, -16, 24, 15, -73, 110, 1, 104, 52, -104, 2, -35, -17, 8, -58, 60, 26, 68, -123, 6, 44, 70, -40, -4, -95, -21, -110, 51, 80, -19, -97, -5, -50, -100, -23, -30, 46, -66, -18, -38, -48, 38, -9, -26, -71, 21, 25, 14, 16, 53, 14, -56, 20, 79, -87, 50, -7, -28, 52, 4, 11, -17, -26, 39, 2, 25, 6, 13, 11, 18, -56, -36, 46, -115, 32, -80, -44, -7, -32, -13, 74, -61, 9, -89, 14, 80, 20, -61, 109, -21, -66, -34, -126, -6, 12, 22, -14, 55, -28, -47, -59, -12, 2, -38, 73, -42, 91, -87, 37, -4, 29, 33, 122, 43, 85, 41, -50, 11, 29, 60, -4, 31, -18, 8, -27, -75, 76, -13, 35, 18, -49, -34, -33, 6, 51, 51, -41, 53, 47, 21, 62, -52, 30, 5, 16, 78, -22, 28, -21, 31, -16, 21, -2, 62, -94, -30, -83, -92, 122, -41, -113, -27, -51, -123, 4, -116, 4, -68, -14, 3, -21, -5, 29, -31, -15, -4, -27, -24, 10, -121, -119, -30, -37, -74, -32, -63, -46, -69, -72, -44, 90, 84, 21, -16, 79, -16, -32, -111, 10, -25, 97, 57, -59, -69, -83, -36, -24, -90, 14, 76, -23, -16, 2, 26, 26, -50, 23, 120, 44, 32, -12, -29, -11, -45, 8, 41, -28, 107, -32, -40, -92, -8, -76, -52, 76, 79, 93, 16, 86, 46, -14, 53, -65, 53, 92, 63, 44, -30, 7, 5, -4, 20, 22, 14, 8, 9, -58, -99, -30, -119, 46, 2, -23, 34, 51, -63, 45, -84, -8, 36, -59, -2, -98, -6, 29, 121, -26, -1, -20, 39, 25, -66, -56, 8, -40, -7, 25, -79, 90, 72, -55, -12, -20, -123, -39, -25, -65, -12, 47, 30, 33, 55, 18, 19, -22, 35, 86, 65, 11, 119, -32, -47, -107, 80, -50, -43, 44, -1, -14, 49, 17, 33, 13, 84, 64, 125, 97, 17, 20, 20, -62, -7, -13, -16, -8, 18, -36, -89, -13, 98, 21, 108, -35, 51, 44, -127, -31, 40, -83, 50, -122, 16, -82, -105, -58, 65, 76, -31, 61, 40, 28, -92, 43, -59, 63, -33, -33, 24, -37, -22, 7, 51, 54, 29, 12, 40, 68, -44, 79, 52, -3, 10, -62, 35, -26, 70, 40, 61, 83, -73, 97, 16, 33, 49, 0, -83, -15, -101, 67, -26, 108, 113, 3, 93, -15, 83, 27, -67, 71, 119, -48, -31, -28, 4, 4, -15, -46, 13, -17, -70, 78, 49, 36, 21, -72, -45, -1, -31, -52, 1, 61, -17, -18, -71, 69, -65, -11, 104, -25, 52, 7, -70, -14, -8, -16, -13, 72, 37, -91, -80, 31, 7, -33, -59, -12, -20, 26, 48, 69, -16, -87, -13, -11, -14, -14, 58, -2, -3, -119, -17, 31, -17, -23, 75, 62, 43, -97, -42, -23, -9, -5, -11, -43, 21, 37, -37, 6, -3, 14, 8, 18, -98, 37, -14, -50, -36, 31, 123, 7, 19, 95, 17, 22, 15, -7, 59, 62, 18, -93, 10, 23, 42, -26, -23, -32, -28, 10, 42, 19, 38, 8, 31, -109, -5, 81, -25, -40, 35, -96, -117, -12, -4, -15, 13, 84, -70, -4, -93, 24, 28, -66, -45, -70, -118, -33, 116, -6, 7, -54, 2, 11, 85, 34, -4, 67, 67, -96, -13, 3, 11, 50, 62, -61, -28, 7, -17, 11, 22, -61, 62, 45, 42, 50, -26, -43, 114, 69, 121, 53, 127, 15, -3, 50, 30, 70, 26, 25, -15, 35, -72, -48, -11, 15, 29, 42, -40, 12, -38, -3, 16, -81, 65, 53, 84, -48, -66, 11, 23, -22, 77, 21, 115, -87, -35, -50, -89, -121, 67, 18, 8, 40, 66, -3, 11, -24, -100, 70, 35, 16, 16, -31, -62, 71, 64, 74, -124, -15, -26, -17, -26, -55, 71, -22, 20, -35, 24, -48, 40, 56, 27, -35, -14, -8, -34, 113, 41, 58, -8, -2, -114, -38, -73, -28, -57, 70, 3, -22, 64, 31, 29, -46, -43, 88, 11, -67, -6, 71, -27, -24, -38, -24, -80, -21, 36, -32, -84, 37, 55, -22, 24, -54, 11, -94, -28, 8, -30, -46, 39, 25, 0, 6, 93, 34, 8, 3, 26, -76, -69, 4, -71, 57, -65, -90, -40, -43, -56, -16, -53, -11, -11, 7, 45, -16, 7, 11, 39, -38, -9, -81, -86, -50, -16, -39, -18, -11, -10, -69, -44, -58, -49, 58, -63, 2, 64, 5, -81, -36, 42, 56, 24, 11, 2, 36, 92, 78, 33, -2, -98, -55, 46, 14, 14, 42, -14, -12, -6, -41, -69, 88, -122, 36, 34, 12, -15, 18, -98, 58, -28, 44, 4, -107, 85, 46, 27, 8, 58, 66, -70, -8, 21, -110, -9, 89, -83, 55, 59, -110, 51, 44, 11, 16, 108, 43, -33, -18, -34, 2, -3, 28, -50, 53, 14, 44, 6, -19, 23, 41, 75, 72, -18, 12, -51, 34, -86, 28, 30, -103, 74, 4, -43, 49, 10, -31, -10, -17, -65, -82, -92, -17, 25, 1, -9, 30, 81, 15, 9, 72, 52, 27, 19, 61, 14, -64, 62, 5, -1, -16, -21, -25, -59, 28, -7, 28, -35, -28, -17, -16, -46, -25, -25, -79, -33, -112, 21, 41, 13, -6, 53, 7, 17, -54, -39, -91, -94, 70, -128, -66, 28, -7, -93, -120, 54, -47, 35, -111, -58, 54, -5, -48, 11, -18, -104, -70, -78, 54, -7, 17, -8, -96, 72, -119, -125, 28, -107, 14, 16, -38, -48, 63, -21, 74, -45, -65, -94, 118, 39, -100, 39, -41, 13, 19, -122, -55, 10, 23, 33, 20, -68, 24, -41, -113, 12, 95, 26, 0, -17, -42, -66, -11, -107, -86, 76, 29, 49, -108, 112, -28, 124, -55, -96, -23, 34, 91, -30, 61, -94, 102, -18, 19, -77, -60, 13, -125, -28, 7, -34, -91, 22, -12, -50, 17, -8, 2, 7, -18, -62, 51, -37, -55, 19, 35, -30, 8, 46, -42, -56, -128, 61, -35, -16, -81, -8, -30, -59, -22, -111, 6, -45, -76, 29, 16, -72, -34, -28, 22, -5, -116, 3, 18, -9, -56, -48, 18, 56, -97, -21, -121, -116, -6, -24, -62, -26, -21, -69, -52, -48, -22, 23, 72, -35, 68, 39, 47, 37, -18, 0, -76, 26, 114, -10, 25, 5, -12, 70, 17, -105, -25, -112, 5, 24, -8, 7, -38, -119, -21, 34, 125, -125, -2, 5, -6, 81, 40, 60, 54, -104, 22, -42, -2, 120, -33, 16, 38, -30, -23, -83, -60, -1, 86, 92, -59, -10, -6, -11, -68, -96, -53, -3, -9, -17, -17, 109, 34, -15, -121, -40, 5, 89, -38, -26, 38, -47, -80, -40, -116, -34, -30, -76, -35, -39, -118, 27, 0, -67, 76, 0, -5, -2, 72, -15, -1, -94, -75, -62, 37, -6, -91, 59, -15, -8, -124, -25, -46, 17, -22, 28, 5, -50, 21, 63, -7, 12, 67, 33, 16, -35, -73, -120, -30, -14, -113, -77, 45, 84, -16, -50, -21, 44, -97, 6, -61, -40, 29, -104, 28, 4, -17, 50, 14, 44, 13, -61, -34, -28, -8, 105, 67, 0, 31, -113, -121, -65, -21, 24, 57, 12, -16, 9, -5, -1, 38, -61, -30, 60, -7, -55, 7, 32, 39, -33, 12, 30, -60, 13, -75, 3, 55, -40, -16, 20, -86, 68, 24, -57, 72, 24, -8, 62, -126, -42, 54, 122, 125, 64, 25, -38, -45, -78, -33, -109, 57, 15, -79, -1, 73, 7, -20, -42, -67, -13, -24, -69, 38, -38, -22, -115, 70, 15, -104, 67, -35, -114, 27, 31, -80, -5, 27, -8, -11, -58, 39, -29, 1, -18, -4, 23, -12, 46, 33, 32, 21, -14, 8, -13, 43, -8, 25, -37, 55, -30, -37, -39, -2, -117, -12, -14, -3, -10, 30, -27, 9, 7, -32, -25, -101, -115, -40, -8, -5, -38, 34, 44, 45, -62, 45, -25, 100, -29, 52, 24, -32, 66, 31, 112, 72, 12, 121, -57, 21, 125, 55, 36, -33, 22, 2, 52, 40, 25, -1, 26, 6, -23, -18, -16, 11, 25, 17, -62, 6, -60, -25, 65, 50, 114, 62, -44, -19, 43, 70, 76, 40, -8, 47, -31, -64, 17, -34, 42, 8, 20, -19, -7, -59, 54, 26, -31, 120, 18, -55, -3, 4, -2, 58, -113, 10, -41, -6, -13, 2, 9, 28, -20, -34, 74, -44, 45, 49, 1, -9, 72, -13, -65, -50, 17, 22, 32, -10, 87, -21, -43, -21, -24, 5, -83, 20, 29, -54, 14, -20, -48, 94, 125, -17, 16, -15, 24, 15, 17, 26, -34, 52, -4, 18, -59, -1, 4, 14, 62, 17, -54, -41, 29, -77, -15, 31, 29, 13, 5, 27, -35, 33, 8, 48, -21, 30, -5, -22, -67, -118, 18, 0, 69, 26, 2, -120, 65, 27, -28, 57, 41, 48, 7, -52, 14, 6, -11, 54, -17, -40, -28, 82, -14, -27, -12, 2, 16, 30, -113, 13, -48, -37, 61, 72, 2, 8, -30, -30, 39, -78, -96, 42, -80, -16, 45, -28, 57, 24, -123, -47, -7, 32, -25, 6, -76, 50, 97, -89, -40, -49, 89, 70, 114, -29, -14, -43, -127, 83, -100, -79, -16, -19, 78, -27, 46, -30, -65, 37, 46, 34, -12, -41, -29, -17, -68, 53, 99, 59, 51, 69, -11, 32, -5, -53, 33, -14, 4, 55, -68, 23, 26, -63, -123, -31, -39, -67, 58, -6, 23, -3, 25, 41, 12, -31, -11, -55, -63, -90, 8, -11, 27, -31, -127, 15, 29, 28, -74, -46, 44, -1, -122, -46, -44, -113, 40, 11, 23, -44, 4, 6, -26, -118, 30, -70, 42, 19, -29, 45, -76, 34, 11, -94, 1, 125, -26, 11, 35, 39, 48, -20, -83, 48, -36, -23, -53, 11, -53, -38, 57, -34, 33, -59, -2, 51, 121, -3, -29, 30, -48, 51, 20, 36, 2, -22, -12, 42, -7, -8, -52, 20, -66, 61, -64, -53, -21, -83, 9, -20, -39, 61, 6, -75, -13, -12, 42, 90, 48, -17, 47, -3, -97, 4, -87, -7, -39, -19, -14, -64, 70, 27, 86, 30, -23, -23, 110, -21, -81, -38, 63, 20, 44, 10, -1, -106, -26, -122, -45, -25, -61, -7, -45, 3, -3, -8, 4, 1, -38, -14, -41, -31, -10, 2, 0, -54, -37, 96, 25, -52, 4, -2, 25, -2, 16, 21, -15, 39, -29, 58, -77, 62, 39, -53, -66, -14, -78, 31, 47, 5, -43, 12, 38, 45, 33, -33, 53, 31, -14, 18, -28, 40, 36, -32, 68, -77, 78, -31, 10, 124, 23, 26, 61, -46, 80, 17, -17, -11, -64, -27, 72, -54, 55, -1, -8, -102, 33, 9, 38, 39, 122, -36, -21, 51, -27, -16, -12, 35, -7, -13, 0, -117, 49, 0, -53, 4, -91, -61, 5, -30, -102, -43, 17, 13, -48, 44, -40, 27, 84, -19, -13, 72, 101, 10, 12, -16, 15, -37, 18, -37, 1, 22, -79, -55, -42, 6, 123, -8, -31, -19, 35, -31, -74, -35, 30, -21, 30, -76, -8, -57, 11, -9, 29, -46, 29, -30, -15, -1, -43, 13, -9, -3, -72, -3, 36, -62, -91, -5, 32, 7, 10, 0, -46, -44, -8, 23, 39, -3, 15, 13, 19, -107, 7, -45, 11, 30, -72, -23, -25, -93, -116, 19, -1, -36, -25, -4, -59, 18, -22, -88, 0, -20, 12, 82, 10, 44, 89, 64, 100, -39, 101, 60, 70, 93, 108, 121, 120, -20, 31, 20, 66, 123, -11, -118, 4, 82, 32, -19, 24, 4, 6, 28, -9, 57, 76, -15, 79, 86, 123, 79, -94, 23, 73, 90, -54, -43, 4, 12, 12, 121, -49, 3, -45, -6, 33, -10, 74, -30, -56, 35, 54, -92, 29, 10, 82, 84, 95, 112, 36, -54, -120, -83, 78, -1, 36, 54, 57, 3, 26, -48, 1, -46, -3, -22, 48, 45, -38, -51, -19, 33, -14, -88, 61, -39, 17, -4, -56, -100, 19, -40, -72, 7, -33, -6, 21, -64, -122, -40, 14, -119, -102, -69, 14, -19, -8, 60, 23, -128, -37, -28, -40, -2, 13, -4, -22, -15, 15, -2, -35, 42, -118, -4, -77, -1, -127, -35, -19, -68, -58, -72, -4, 8, -1, -15, -4, -125, 6, -108, -9, 56, -121, -6, 13, 0, 1, -118, 119, -13, 42, -52, -72, -72, 52, -61, -18, -37, 63, -112, 23, 31, -119, 34, 61, 46, 127, -68, -120, 19, -21, -12, 41, 25, -112, 21, 92, 83, 78, -63, -20, -61, 8, -24, 27, -19, 76, 31, -4, -22, 2, 8, 88, 122, -27, -72, -30, -52, -42, 25, -44, -67, 33, -65, 28, -64, -36, -127, -5, 119, 23, -112, -8, 84, 51, 77, -32, 93, 21, -3, 9, 10, -23, -109, 40, -99, -9, -10, 32, -21, -1, 1, -31, -54, 47, -49, -5, -83, -61, 4, 1, -2, 7, 45, -85, -78, -9, 122, -24, 26, 57, -10, 18, -14, -4, 3, -97, -7, -17, -4, -24, 0, -69, 40, 67, -63, 20, 51, 6, -36, 21, 53, -57, -41, -103, -34, 29, -88, 2, 49, 56, 31, -37, -26, -8, -22, 28, 18, -44, 0, -54, 61, 52, -97, 56, 7, 90, -17, 97, 1, -116, -86, -80, -64, -18, -26, -47, 105, -111, -16, 49, 23, 116, 127, 1, -11, 8, -2, -31, -51, 59, 21, 78, 90, 61, -4, -8, -82, 117, -34, 102, 8, -63, 96, -41, 25, 35, -15, -18, -13, 79, -33, -34, -75, -103, -82, -41, 37, -56, 13, 54, -84, -56, 88, 7, -66, -74, -3, -23, -118, -19, -34, 7, -44, -8, 26, -37, -9, 52, -58, 27, 54, -128, -15, -5, -126, 27, 61, 50, -15, 72, -37, -35, 17, -125, -16, 27, -34, -41, 9, -77, -1, 23, -91, -66, 38, -38, 41, -90, 67, -18, 16, 58, 23, -22, -11, 25, -10, 13, -71, 90, -13, 34, -41, 26, -124, 40, -42, -15, -29, 33, -8, -41, -84, -17, 78, -73, 120, -31, 69, 77, 54, 96, 7, -25, 98, 48, 120, 78, 65, 59, 59, 124, 69, 41, 33, -93, 32, 51, 44, -3, -127, -90, -25, -26, 37, 27, -14, 119, -46, 84, 4, -27, -3, -53, -12, 49, 86, 44, -15, 69, 15, -95, -18, 99, 27, -17, 1, -35, -11, 27, 15, -30, -78, -3, 41, 7, 127, -1, 102, 24, 45, 39, -37, -50, 11, 0, -16, 5, 23, -18, 63, 89, 63, 34, 47, -126, -8, 77, 21, -121, -51, -9, 29, 42, 43, 60, -107, 24, -35, 40, -36, 42, -35, -62, -23, -19, 43, 2, -52, 12, -70, 17, -122, -23, -54, 45, 19, 31, 40, -60, -9, 8, -38, 3, -62, -38, 15, 29, -15, 45, 18, -42, 66, 17, 48, -124, 39, -53, -52, 36, -16, -10, 18, 90, -29, 2, 26, 15, -11, -22, 65, 18, 53, 89, -88, 122, -86, 82, -63, -16, 111, 40, 55, 61, 22, 126, 17, -45, -58, 23, -30, 61, -98, 48, -35, -72, -7, -52, 25, -89, 80, -98, 15, -85, 78, 13, 6, -11, 52, -2, 29, -3, -3, 7, -37, 88, 61, -98, 8, -35, 10, -73, 11, 63, 27, -38, 30, -46, 2, 45, 20, 7, 45, 74, 67, 78, 27, -28, 33, 53, -119, -42, 32, 56, 34, -67, 49, 3, -36, 11, -62, 122, 6, -47, -3, -17, -40, 35, -48, 98, -67, -31, -35, 11, -64, 42, -18, -34, 33, -48, 26, -28, -6, -68, 33, 2, -70, -78, -27, 45, -20, 6, 13, -43, -35, -23, 4, 25, -49, 18, 8, 1, -15, -26, -41, 13, -16, -28, -8, -24, 23, -87, -22, 6, -26, 33, -16, -35, 19, -5, -27, -7, -74, 5, -81, 26, 15, 119, -15, 35, -111, -64, -70, -53, 34, -9, -30, -14, 20, -51, 57, 15, -13, 57, -74, -7, -39, -36, -3, -30, 13, -32, 8, -20, 47, -61, -63, -53, 33, 15, 32, 24, 81, -39, -42, -43, 46, 29, 26, 6, -30, -6, 42, 11, 23, -31, -22, 18, 18, -53, 28, 30, -18, -49, 53, -57, -13, 27, 31, -1, -7, -21, -6, -100, 49, -69, 120, -53, 10, 59, 14, -24, -27, 80, -63, -28, -26, -9, -13, -65, 8, -28, -13, 1, 66, -4, -20, -5, 25, -41, -18, 37, -16, -17, 9, -52, -32, 92, -26, -8, 9, -42, 26, 2, -15, 81, -13, -20, -7, -14, 75, -36, 44, 10, 6, 21, -38, -74, 15, 12, 58, -34, -22, 69, -41, -19, -60, 42, -57, -12, 9, 19, 10, -18, 3, -42, -23, 32, 9, 83, 38, 76, -111, 76, -98, 88, -114, -63, 0, -19, 41, 37, -33, 36, -7, 8, 53, 74, 51, 12, -16, 6, -15, -127, -5, 87, -51, 27, 72, 12, -104, -7, 53, 124, -21, -103, 122, 14, 56, -21, 52, -64, -23, 88, 122, -82, 0, 13, -54, -52, 31, 93, 122, -49, 15, -71, 84, 41, -53, -124, -43, 88, 70, 42, -5, 120, 77, -23, -94, -57, 51, -79, 58, 0, 8, -21, -61, -19, -37, 126, -11, -53, 20, -10, -68, 79, -124, -30, -59, -25, -8, -29, -125, 26, -36, -28, -64, -8, -5, 100, 70, -20, 7, -126, -54, 4, -1, 45, -18, 73, -19, -123, -64, 11, 20, 22, 1, 1, 3, -12, -41, 91, -69, -75, 16, 46, -29, -66, -31, -79, -85, -10, 41, -10, -83, -121, -10, -17, -90, 6, -128, -51, 76, 40, -19, 81, -123, 104, -17, 88, 19, 30, 92, 58, 29, 95, 14, 84, 109, 12, 20, -96, -16, -20, -45, -120, -13, -98, -126, 66, -104, 6, 106, 91, -1, 59, -50, 5, -24, -66, 32, 69, 68, 29, 23, -24, 63, -17, 55, -57, 5, 20, 66, -9, -25, 74, -16, -115, 71, -6, 4, 63, 34, -45, 30, 58, 37, 26, -22, -26, -32, 6, 9, 83, -30, -8, -2, 75, 43, 71, -62, -104, 44, 35, -75, -85, 21, -51, -1, 74, -97, 26, -67, 28, -34, -75, -62, -4, -55, -34, -24, 12, 16, -20, -4, -54, -62, -7, 20, -126, -1, 24, 4, 10, 32, -44, -76, -13, -49, -28, 6, -6, 34, 1, 17, 84, -22, -2, -40, 30, -34, -35, -91, -57, 30, 20, -15, 14, -27, 25, 24, 5, 13, 7, -112, -3, -30, 38, -33, 3, 25, 111, -20, -48, -23, 58, 5, -30, 29, 122, -72, 45, 110, -16, 47, -21, -16, 0, 34, 13, 40, -19, -14, 36, 9, 24, -6, -59, 39, 121, 123, -29, 25, 38, 52, 53, 31, -107, -89, 12, -29, -9, 59, -3, -13, 41, 67, 0, 64, 46, -23, 17, -52, 4, 34, -41, -47, 54, -19, 125, -13, -17, -56, -6, -1, 4, -28, -59, 72, 23, 39, 78, -114, 31, 5, -35, -39, 80, -30, 19, -117, -45, -74, 53, -26, 120, 22, -99, -24, 49, -60, -37, -15, 24, -29, -1, -2, -19, 4, 34, -8, -47, -15, 1, -78, 68, -33, 18, -11, -14, -6, -29, 10, -57, 2, -22, 37, 1, 52, -118, -22, -81, 25, 4, 35, -25, 16, -22, -97, -12, -73, 26, 13, 11, -36, -48, -63, -24, -16, -31, 19, -67, -11, 127, -13, 9, -31, 110, 83, -107, 25, 33, 63, 122, -30, 18, -61, -128, -49, -92, 10, -103, -37, 1, -21, -91, 80, 61, 41, -84, -24, 112, -15, -38, 2, -3, 7, 22, 68, -67, 44, -15, -75, -13, -71, 7, 52, -118, -88, 27, -34, -69, 30, 4, 88, -91, 4, -5, 13, -14, -32, 9, 47, 93, -27, 98, -5, 40, -65, 38, -21, 35, 62, -40, 10, 14, 4, 13, 17, -50, -23, 12, -90, -13, 35, 63, 23, 35, -128, 3, -103, 14, -53, -72, -31, 13, -42, -63, 17, -58, 6, 25, -24, -116, -48, -20, -41, -39, 80, -47, -54, -27, 38, -50, -116, -38, -76, 18, -39, -38, 12, 15, -75, 12, -62, 10, 33, -23, -21, -38, -95, -118, -71, -11, -25, 4, -52, -118, -2, -11, -117, -38, -119, 12, -24, -53, 43, 8, 64, 21, -37, 53, 27, -54, 40, -83, 55, 90, -16, 48, 39, -35, 102, -15, -63, 94, -6, 45, -23, -64, -123, 43, -29, 7, -23, 118, -58, -46, 23, -73, 37, -53, -8, 7, -9, -24, -33, -48, 31, 26, 28, 52, -48, 43, 33, -22, 56, 77, -26, -85, -66, 42, 0, -49, 12, -18, 26, 56, -13, 13, -14, 7, -29, -4, -89, 40, 25, 45, -15, 35, -7, 42, -7, -59, -10, 30, -92, -29, 3, -60, 1, 12, -6, 64, 0, 57, -99, 24, -46, 13, 1, 56, -21, -11, 0, -41, -15, -28, -36, 14, 17, -42, -57, 49, -9, -11, -23, 16, -103, 18, -28, 1, 13, -86, 4, -7, -22, -6, 5, -11, 41, -32, 55, -45, 1, -125, -39, -20, -12, 0, -20, 66, -17, -17, 3, 33, 24, 3, 55, -100, -103, 49, -127, 59, 74, -10, -93, -60, 45, -27, -23, 13, 107, 38, -75, -31, 70, -10, 12, -104, -68, -6, 31, 82, 17, 74, 56, 113, 72, 42, -52, -4, 75, 40, -117, -16, 15, 42, 19, 6, 33, -41, 92, 60, -13, 28, -12, -17, -11, -90, -118, 35, 21, -63, -32, -48, -50, 22, -25, -20, 41, 28, 22, 24, 8, -7, 14, 30, -20, 5, 59, -28, -21, 2, -41, 65, 56, -47, -94, -5, 19, -82, -60, -16, -22, -73, 16, 65, -35, 49, -34, 26, -20, 51, -28, -2, -34, 81, 8, -53, 2, 50, -43, 0, -48, -78, -5, -7, -37, 26, 98, -22, 7, -10, 37, 0, -23, 118, -14, -33, -11, 23, 3, -64, 3, 41, 102, -56, -101, 34, 1, 82, -22, -66, -1, 7, 58, 3, -27, -57, -7, -7, -72, 0, 84, 17, 14, 126, -87, 35, -3, 70, 126, -43, 50, 90, 52, 10, 102, -35, 23, -40, -91, 15, 26, 6, 102, -42, 16, -84, -9, -40, 63, 13, 27, -14, 98, 120, 59, -123, 21, 48, 121, -61, 32, 49, -23, 13, 45, 45, 58, -76, -14, -35, -6, 65, 32, -57, 99, 14, -81, 34, 34, 46, 70, 9, 31, -23, -48, -14, 14, -9, -62, -48, -18, 103, -45, 9, -8, 29, 46, -17, 45, 41, -58, -53, 1, -35, 31, -80, -26, 30, 88, -39, -76, 40, -9, 24, 10, -26, 31, -48, -17, 16, -10, -126, -57, -22, -127, -20, -50, 62, 12, 65, 43, -23, -63, 6, -64, 23, -38, -11, -91, -43, -6, 5, -21, 40, 49, -120, -58, 7, 20, -13, 44, -27, 61, -7, -21, -83, 44, -28, 9, -77, -45, -15, -97, -80, -25, -29, 89, -43, -51, -7, -3, -40, 89, -67, 118, 3, -38, 5, 4, 12, 6, 79, -28, -6, 27, -17, -23, 74, 33, 29, 22, -97, -64, -119, 33, 10, -115, 124, 33, 59, -41, 49, 34, -77, 3, -31, -15, 67, 31, 47, 89, -66, 33, -40, 33, -5, -46, -44, -25, 109, -93, 50, -119, 26, 122, 85, 10, -1, -29, -124, 61, 21, -67, -41, -47, -55, -27, 123, -30, 20, -88, 78, -49, -4, -88, -17, -10, -7, 86, -48, -30, 82, 46, 42, 45, -23, -112, -32, 1, -35, 0, -70, 49, 5, -65, -128, 36, 86, 14, 127, 9, -24, -16, 6, -42, 36, -127, -91, 24, -112, -48, 32, -48, 17, 50, -123, -4, 68, -35, 10, 105, 5, -2, -126, -34, 57, -123, 14, 25, -27, 1, -85, 3, -28, -123, -51, 8, 15, -60, 9, 28, -71, -67, 88, 24, 65, 123, -28, 20, 65, 79, -45, 118, 63, -88, 83, -98, 91, 11, -31, 118, -109, 36, 53, -68, 11, 22, -76, -38, -14, -85, 116, 109, -28, -34, 47, 41, -9, -27, -27, 4, 17, 2, 73, 86, -68, 56, 13, 40, -24, -23, -4, -45, 80, -84, 28, 8, -32, 116, 87, -19, -7, 10, 42, -43, 104, 34, 13, 39, 37, 13, 80, -1, -20, 51, 27, -30, 79, -45, -5, 10, 25, 91, 24, -43, 22, 99, 100, 32, 8, 60, 100, 48, -10, 5, 15, 15, 26, 6, -51, 40, 19, 45, 127, -11, -46, 31, -26, -50, 54, -9, 21, 4, -126, -37, -16, -66, 23, 17, -28, -10, 55, -31, 23, 37, 22, 13, -10, 86, -17, 6, 51, 16, 44, -5, -31, 42, 4, -73, -44, 14, -5, -2, 1, 14, 7, 37, 11, 1, 13, 11, 5, 4, -37, 10, 19, 5, 3, -15, 15, -26, 17, -5, -1, 30, 32, 8, -7, -5, -12, -12, 11, 6, -26, -19, -9, 8, 7, -10, 19, 11, -3, 13, 14, 6, 7, -13, -5, 39, -17, -6, 33, -8, -16, 31, -35, 1, -32, -62, 16, 11, -6, 37, -5, -16, -10, -47, -10, 12, -9, 26, 4, 49, 1, -18, 26, 10, -5, -23, 17, -21, -35, -70, 58, 22, 5, -62, 17, -9, -15, 25, 7, 9, 14, 3, 17, 0, -9, 9, 8, -5, 22, 4, -1, 7, -7, 32, 24, 10, -39, 3, -27, 33, 3, 4, -3, -1, -9, -3, -1, -27, -2, 4, -3, 4, 0, 1, 5, -11, 11, 15, 10, 6, 0, -8, -13, 3, -1, 12, 9, 7, -6, 5, -15, 44, 18, -14, -17, -16, -15, -26, 25, -7, 3, 9, 15, 0, -11, 10, 7, 2, -14, -43, 8, 45, 18, 1, -5, 1, 18, -12, 1, -25, -18, 1, -63, 4, 32, 8, -52, 15, -54, -27, 12, -27, -35, -53, 18, -10, -14, 34, 4, -23, -10, 51, 54, 5, 20, -19, 62, -66, -38, 27, -18, 10, 43, 40, 67, -9, -29, -34, 54, 1, 18, -17, 61, 26, 5, 113, 22, 1, 6, 63, -29, 47, 118, -41, -12, -4, 7, -41, -27, -3, 14, 1, -20, 38, -15, 10, 12, -35, -38, -33, -9, 10, -56, -38, -9, -9, -55, 26, 26, -15, 5, 12, -43, 30, 8, -68, -11, 14, -33, -2, 23, 8, -8, 27, 3, 22, -15, -23, 14, 22, -44, 12, -52, 36, 1, 3, -40, -55, 16, -40, 7, 27, 27, -45, 22, -17, 26, -23, -26, -2, 30, -15, 19, 4, -1, 30, -24, -3, -36, -33, 13, 13, -21, -1, 28, 21, 32, 19, -7, -13, 16, -9, -23, -33, -66, -13, -44, 15, -18, 14, 9, -23, -68, -7, 55, -12, -98, -32, -4, -6, -13, 11, 33, -30, -5, -27, -40, 52, 106, -40, -13, 19, -35, -17, -40, -24, 9, -90, 54, -1, -58, 15, 101, 18, -15, -105, 90, 39, 23, -7, 70, 8, -24, -89, 19, -21, -8, 18, -74, 112, -86, -14, 47, -81, 43, -50, 2, 13, -9, -38, 23, -12, -64, -10, 13, 23, 29, 106, -25, -22, -115, -43, -5, -2, 5, 7, 7, 33, 8, -60, 10, -48, -47, 6, 50, 43, -3, 15, -17, 36, 1, -17, -14, 7, -22, -24, -110, 21, 3, 64, 99, -31, 3, -10, -21, -7, 20, -61, -22, -50, 31, 35, 0, 4, -8, -35, -26, 13, 56, 32, -12, -10, -7, -45, -5, 15, -17, 78, -11, 51, 15, -26, -16, -40, -20, 31, 0, 12, -52, 25, -33, 22, -26, -12, 81, -17, -19, -12, 3, 60, -76, 11, -5, 24, 9, 34, 2, 54, 12, -68, -18, 10, -33, 50, -2, -52, -43, 10, -18, -6, -20, 69, -4, 15, -59, -21, 5, -18, -45, 32, 21, 87, 19, -24, -85, 26, -56, 64, 27, -14, -35, 13, -18, 45, -33, -77, -36, -123, 55, 13, 61, -15, 6, -41, -21, 86, -19, 72, -10, -12, -27, -114, -25, -8, -31, 8, -4, 17, -27, 31, -5, -1, -10, 52, 55, -70, -55, 23, 52, 45, 32, -57, -30, 6, -20, -1, 20, -48, -10, 47, -21, 13, -27, 50, -25, 46, -20, 7, 12, -3, -39, -36, 22, -42, 24, 27, -12, -13, 3, -28, -52, 14, 48, -13, 30, -6, -4, -37, 13, -12, 28, -9, 48, -30, -25, 0, -6, 49, -9, 39, 10, 66, -32, -43, 85, 5, -4, -9, 76, 16, 46, -18, -122, -59, 48, -35, -26, 20, 13, -23, -41, -26, 51, 120, -54, -38, -53, -1, 126, 3, 8, 84, -49, -40, 33, 88, 113, 22, -54, 0, 44, 10, -76, 80, -75, 66, -58, 10, 109, -24, -17, 49, 11, -32, 1, 15, 55, 103, 56, 10, 48, -28, 83, 6, 28, 19, 5, -46, 23, 89, 74, 32, 4, -24, 23, 0, 26, 11, 38, 42, -6, -2, -8, 5, -8, -7, -9, -1, 40, 15, -59, 8, 43, -36, 24, -75, 43, -37, 0, -43, -27, -15, -78, -11, 17, 9, -12, -41, -36, -87, 7, -36, 1, 15, -29, 27, -60, 106, 77, 4, 39, 20, -5, 123, -45, -2, -28, 8, 6, -32, 20, -8, 3, -27, 13, 0, -75, 6, -52, 8, -2, 105, 89, 6, 22, 29, -18, 20, -60, 39, 61, 39, 14, 2, 26, 15, -21, 14, 95, 57, -7, 29, -43, 10, -70, -23, 112, -14, -24, -41, 2, -25, -121, 30, 111, -19, 23, 24, 48, 21, 85, -3, -31, 6, 16, -3, -59, -120, 44, 33, -11, 7, -126, -128, 5, 10, 19, 73, -36, 24, -16, -18, 57, -103, -126, -16, 67, 39, -40, 120, 61, 2, -44, -1, 45, -14, 56, 12, 30, 46, -6, 13, -8, 30, 25, -54, -6, -8, -7, -38, -23, -16, 16, 56, -19, -13, 36, -70, 9, -22, -8, -67, -3, 16, 6, -22, 87, -6, 23, 0, 3, -49, 71, 21, 41, 55, 14, -25, 8, -8, -8, 127, 62, -75, -25, -2, 4, -46, 49, -123, -58, -92, -127, -23, 22, -125, -32, 34, 125, 13, 93, 53, -47, 122, -80, 50, 119, 1, 40, -127, -118, 33, 124, 22, -93, 9, -38, 49, 58, -52, -117, 41, 120, -120, 44, -74, -7, 9, -26, -107, 7, 21, 13, 72, -7, 116, 45, -82, 3, 60, 104, -127, -81, -122, -69, -105, -28, -6, -16, -12, 97, -113, 119, -48, 127, 124, 124, -126, -6, 78, -72, 72, 38, 127, 34, 116, 33, 34, 127, 45, -17, 28, 127, 65, -124, -29, 23, -128, 50, -18, 110, 76, -70, -125, -20, -65, -49, -44, 20, 20, -12, 93, -31, -105, -120, 71, 113, 51, -125, -56, -46, -70, 60, 68, -54, -126, 84, -121, -39, -66, -125, 120, -13, 124, -24, 67, -8, 120, -14, -93, -52, -78, 11, -27, -52, 65, -128, 11, 17, 6, -5, 32, 120, -121, 0, 45, -3, 93, 104, 108, -41, -7, 46, 19, -10, 93, -27, -91, -112, -128, -125, 45, 21, -125, 1, 64, 38, -127, 97, -5, -37, 94, 52, 24, 122, -125, 23, 98, 63, -37, 85, -40, -63, -1, 93, 127, -8, 60, -56, 94, -16, 127, -96, 17, 58, -6, 110, 71, 66, -4, -95, 12, 81, 105, 19, 83, -84, 125, -66, -46, -25, -58, -76, -125, 39, 127, -57, -75, -56, -64, 56, -123, 45, -53, -83, -7, -111, 44, -126, 34, 97, -65, 104, -67, 114, 11, 127, -122, 120, -64, -8, 6, -106, 24, -55, 104, -4, -52, -38, 21, 126, -119, -95, -8, -127, 122, -23, 126, -60, -54, 42, 36, 120, -128, -46, -127, 55, -40, -38, 70, -8, -125, -127, -124, -128, -14, -56, 115, 60, 60, -123, -37, -128, 48, 104, 125, -88, -67, 38, 23, 23, 106, -83, 121, -30, -44, 126, 17, -42, -23, 127, -1, -73, -76, -124, 104, -5, -58, 86, -112, 23, -57, -100, -2, 26, 21, 88, 75, -127, 71, 124, -27, 94, 25, 120, -125, -120, -113, 126, -127, 31, 127, 18, -124, 74, -125, 15, 23, 43, 103, 123, 74, -47, 96, -102, -14, 127, -20, 124, -82, -121, 106, -112, 5, 44, 99, -17, 122, 69, -46, 74, 29, -56, -127, -53, 51, 93, 79, -85, 87, -126, -100, -29, 116, -121, 127, 126, -21, 119, 3, -77, 17, 120, 52, 127, 106, -4, -112, -30, 124, -34, 2, -103, 125, 127, -68, -109, -36, 3, 68, -119, 127, 118, 126, -99, -89, 38, -53, -121, 67, 95, -44, -39, 82, 127, 75, -127, 91, -12, -67, -91, 37, 4, 40, -122, 65, -84, -8, 30, 46, -1, 55, -55, 106, 12, -61, 47, -11, -102, 54, 96, 18, -4, 75, -93, 76, 73, 119, -24, 108, -9, 124, -127, 116, -43, 110, 48, 15, -32, 33, -95, 23, -9, 78, 113, 123, 127, -104, 40, -29, -57, 74, -114, 121, -41, -113, 127, 6, 123, 83, 81, -39, -27, -30, -120, 58, 14, 16, 2, 6, 13, -41, 120, -112, 11, 121, 124, 58, -126, 77, 32, -124, -32, -13, 39, -92, 36, -33, -46, -13, 125, 20, -127, 108, -109, -97, -57, 26, -108, 82, 78, -127, -84, 32, 31, -96, -124, 60, 96, -121, -107, -113, -14, 113, 15, 69, -53, 11, 91, -44, -33, 56, -75, -127, -122, 114, -27, 34, 36, 120, 122, -70, -16, -35, -122, -119, 4, 127, -86, -18, -113, -74, 87, -83, -123, 65, -1, -14, -119, 32, -20, -122, 31, -18, 23, 119, 120, 112, -107, 29, 24, -123, 22, 67, 127, 106, -128, 79, 17, 73, -53, -27, 58, -10, -7, 127, -51, -119, 15, -74, -113, -45, -36, 44, -120, 105, -80, 98, 103, -102, -22, -108, 7, -122, 70, 89, -127, 58, -33, -8, 91, -1, -4, -62, 127, 65, 74, -124, -111, -67, 89, 12, -122, -25, 45, 117, -73, 23, 51, 15, 88, 25, 116, 77, 95, 121, -5, 103, 80, 108, 127, 100, 8, -113, -112, 119, -106, 127, -114, -82, 125, 81, -127, -121, 127, -124, -8, -126, 58, 127, -126, 119, 25, 26, -68, -83, 77, 70, 51, -64, -30, 127, 127, -126, -124, 127, -128, -119, -1, 122, 112, 13, 94, 46, -22, 80, -26, 102, -122, -35, 37, -11, -108, -128, -95, -111, 125, -123, -79, 116, 8, 90, 97, 26, -34, 109, 120, 61, 69, -5, 4, 119, 11, -61, 91, -3, 38, 19, 127, -87, 125, 125, 33, 127, 46, 39, 4, 36, 121, 127, -124, -27, -25, -79, 39, 105, -71, 30, -14, 78, -123, 119, 80, 106, 125, -59, 125, -106, 24, 30, -68, -116, -56, -78, -13, 103, 10, 120, -29, 82, 119, -107, -32, 17, -41, 123, -126, 54, 121, 54, 127, 10, 119, 126, -120, 40, 115, 121, 85, -13, -11, 103, 33, 60, 72, -21, 50, -66, 127, -69, 33, -118, -128, 29, -12, 123, 125, 45, 127, -121, -74, -72, 80, -82, -55, 120, 0, -65, -39, -124, 63, 126, -20, 124, -21, 109, 127, -119, -125, 98, -125, -36, -94, 58, -34, -123, 108, -24, -61, 42, -10, -63, -14, -76, -3, 22, -109, -1, -126, 58, 119, 9, -83, 124, 75, -17, -33, 58, 40, 114, -126, -31, 120, 64, 20, -21, -37, -33, -19, -51, 42, 1, 127, 39, 62, 125, -86, 62, 22, -12, -22, 2, -48, -28, -117, -60, -3, -60, 101, -29, 25, 83, 41, 75, -83, 65, -88, 10, 104, 22, 93, -11, -86, -67, 98, -18, 44, 126, -100, -123, 49, 126, -80, -44, -39, -14, 108, -122, -126, 84, 102, 77, 112, -61, 125, 121, 35, 102, -124, -9, 119, -119, 45, 19, 114, 127, 61, -7, -57, -103, -104, 88, -30, -125, 123, 123, -121, 125, -5, 127, -49, 28, 127, -69, 87, 5, 73, 127, 126, -12, -9, 46, -4, -122, 42, -54, 18, -17, 85, 39, 127, -117, -127, 0, -91, 24, -6, -103, -39, -126, 127, -7, -19, 95, 79, -36, 118, 95, -65, -89, 117, 76, -47, -124, -53, 5, -53, -15, 71, 124, -56, 35, 48, -54, 104, -76, 43, 65, -121, -70, -48, 40, 18, -128, -8, 42, 124, 33, -5, 102, -124, -128, 120, -128, 51, -99, -88, -128, -121, -70, 92, 78, 112, 110, 122, 117, -107, 97, 111, 65, -52, -23, -116, -5, -113, 11, -38, -37, 127, 119, 23, 124, -43, 79, 124, 125, -122, 67, -104, -127, -53, -24, -112, 120, 92, 69, -93, -6, -118, 110, 111, -128, 15, -46, -118, -121, -35, 107, 115, 116, 67, 117, -30, -96, 126, -20, 127, -127, 108, 22, 123, -46, 63, 112, 121, 8, 124, -125, -90, 14, 4, -5, 127, -119, 99, -63, 1, -107, -103, -86, -28, 42, 103, 67, 32, -48, -95, 78, -77, -91, -46, -128, -84, 14, 125, 8, -73, -124, 11, 66, 111, -125, -4, -37, -125, -83, -29, -47, 71, 122, -42, 34, -31, 103, 103, 21, 22, -103, -102, -83, -120, 127, -15, -80, 125, -92, -34, -123, 21, 80, -71, 111, -65, 119, -119, -109, 109, -26, -100, 10, 16, -127, -79, -121, 4, 70, 19, 19, 39, -35, -25, 33, -118, 1, 113, 93, -63, 52, 30, -22, 39, 117, -7, 48, 50, 93, 9, -8, 45, 36, -125, -8, -121, 39, -76, -92, -19, 95, 101, 19, 59, -72, -106, 82, 121, -74, -123, -66, 121, -24, -69, 116, -28, 6, -17, -69, -38, -90, 76, 33, -127, -67, 127, 31, 122, -113, 106, 123, -120, 83, 117, -41, 83, -48, 29, 123, 42, -5, -84, -103, 106, -116, -9, -124, 117, 17, 120, -121, -15, 73, -91, 120, -127, -70, 126, -128, 99, 127, 117, 124, -13, -118, -27, -82, -52, -31, 39, -104, -125, 102, 14, -120, -94, 60, -39, -58, 9, 51, 120, -111, -103, 126, 54, -112, -124, 126, -10, 108, -39, 54, 51, -116, 61, 126, -72, 69, -60, 125, -17, 4, 46, 43, 127, 26, -51, 9, -104, 125, 37, 95, 45, -67, -65, 62, 122, -66, -22, -89, -28, -99, -117, -81, -31, -51, 127, 88, -121, 8, 62, -4, -45, 16, -68, 9, -3, -73, -71, 29, -42, 69, -46, 115, 123, -14, -118, 51, -3, 79, -91, -74, 91, -7, -119, 127, -95, -30, -49, 62, -16, 62, 69, 58, 72, 5, 40, -121, -66, -4, 117, -121, 101, 53, 97, -118, -111, -127, 115, 122, 40, -3, -44, -5, -13, 5, 121, 49, 40, -124, -59, 126, 6, -30, -98, -116, -2, 65, 29, -126, -121, -123, 15, 127, 119, -120, -51, -71, 127, 7, 1, -112, 33, 106, -20, -114, 59, -105, -81, -11, 28, 96, 4, -92, 27, 32, -125, -60, -107, 69, -106, 23, 100, -53, -105, 13, -68, -126, 109, 22, -127, 27, -127, 26, -127, -122, 127, -88, 66, 2, -105, -3, -113, -126, -40, 74, 44, -9, 107, 41, -74, 77, -74, 77, 127, 106, 53, 108, -71, -105, 122, 99, -114, -123, 24, -127, -62, -20, 125, -12, 38, -43, -108, -33, -125, 103, -9, -67, 127, -3, -113, -128, 71, 120, 57, -127, -117, -122, 127, 124, 15, -54, 122, -24, -24, -58, -25, 50, 76, -56, -119, 64, -88, -36, 125, 8, -117, 126, -60, -116, -127, 105, 69, 10, -127, -112, -31, -89, -58, 71, 31, -62, -2, -127, 8, -74, 124, -84, -87, -119, -103, 41, -128, -66, 127, -93, 55, 127, 19, 127, -97, -22, -54, -124, -78, 32, 70, 26, -1, 124, 101, -127, -125, -82, 80, 98, 1, -40, 30, -66, 33, -15, 85, 125, 74, 75, -73, 11, 126, 127, -34, -44, -47, 117, -124, 118, -126, -68, -126, -111, 116, 27, 92, 101, 45, 15, -113, 44, 47, 122, -128, 45, -81, -90, 116, -117, 127, 10, -7, -2, 2, 79, 46, -70, 72, 35, -35, -125, -44, 34, -83, 9, -26, 92, -121, -73, -105, -116, -6, 113, 43, 47, -86, -1, -21, 78, -120, -31, 124, 118, 127, -78, -113, 79, -47, 124, 120, -79, -31, 66, -4, -117, 125, 65, 127, 14, -69, 84, 126, 89, 82, 86, 114, -65, 15, -68, 57, -10, 123, -110, -108, -113, 93, 86, 83, -26, -118, -86, -87, -41, -126, -14, -127, 127, 55, 126, -85, -87, -62, -126, 59, 127, 89, -72, -123, -44, -63, 5, -34, 107, 37, 127, -102, -50, 39, -126, -85, 118, 122, 82, -125, -124, 106, -128, 52, 26, -128, 40, 11, 105, 91, 23, -4, 88, 14, -44, -5, 111, -122, -27, -125, -81, -69, -25, 87, 23, 125, -64, -31, 50, -120, -124, -123, -109, 118, 32, 103, -6, -54, -76, 76, -97, -3, 126, -47, 122, -22, -52, -125, -6, -75, -79, -38, 79, -49, 77, -104, -77, -35, -104, -128, -81, 36, 124, -59, -36, 74, -6, 39, -60, -31, 81, 123, -84, -123, -10, 124, -69, -53, -125, -126, 5, -20, 28, -68, 33, 118, -62, -122, 78, -63, -3, 126, 22, 28, 127, 100, 111, 14, -28, -77, 89, 124, 27, 56, -118, 126, 123, -35, -112, -7, 38, -122, -61, -70, 124, -64, 127, -22, 84, -57, -24, 17, -76, 24, 44, 115, 107, 118, -39, 89, 35, 126, 121, 23, 50, -25, 116, 63, -107, -122, 67, 114, 126, 108, -27, 38, -60, -44, -127, 7, -88, -46, 52, 119, -96, -84, 93, 43, -94, 39, 44, -98, 84, -69, -33, -116, -122, 81, -22, 63, 104, -62, 126, -127, 78, -117, 109, 111, 108, -40, -52, 45, -118, -22, -50, -125, 7, -51, 125, -33, -106, 17, 119, -122, -98, -18, 3, 16, 5, 101, 8, 50, -1, 102, -108, 85, 65, 95, 4, 116, 2, -67, 21, -47, 50, -67, -31, 58, 28, -23, -32, -13, 59, -23, -80, -21, -13, -45, -91, -2, -24, -123, 30, -92, 51, 127, -73, -10, 118, 127, -12, -123, -57, -116, 46, 113, -128, -118, 33, -32, 87, -110, 121, -102, 125, -124, -60, -50, 20, -110, -56, 0, 61, -107, -75, -126, -46, 118, -14, 58, -125, 8, 13, 31, 73, -115, -120, 47, 122, -85, -17, 31, 6, -65, 70, 106, 123, -108, 40, -71, -20, -89, -74, -88, -32, -12, 24, -45, 73, 127, -39, -43, 110, 36, 76, -1, 113, 83, 95, 15, 53, 8, -9, -126, -33, -102, -51, 69, -128, -14, -98, 15, 119, -79, -15, -57, 126, -55, -82, -95, 37, 99, 73, 121, -1, -40, 120, -127, -24, -22, -15, 22, -24, 28, -117, -3, -26, 18, -54, 122, 73, 127, 116, -114, -40, -123, -66, 9, 4, 35, 78, 57, 52, 51, -2, 85, -10, -9, -20, -22, -69, 106, -11, 36, 19, 48, 127, 7, 70, -121, 16, -19, 114, -17, -117, -126, -3, -60, 26, 72, -123, -126, 33, 26, -128, -118, -84, -86, 121, -84, 80, -87, -56, -106, -79, -127, -3, -44, 7, 17, 36, 103, -1, -31, 127, -106, -20, -78, -45, -91, 120, 77, 114, -122, -48, 16, -102, 6, 56, 26, 127, 105, -103, -117, 31, -124, 1, 19, 31, -13, -82, -118, 123, 88, -24, 26, 107, -98, -46, -13, 24, -2, -6, 81, -25, 55, 10, -38, -75, -60, -73, -52, 87, -41, -88, -127, -123, -113, -25, -120, -67, 40, -58, 29, -87, 117, 88, 40, -50, -117, 124, -95, -12, -25, 100, -28, 0, 11, 13, 62, -30, 26, -74, 127, 78, 127, -103, -128, 3, 31, 112, -35, -32, 121, 126, 69, -2, 4, 86, 123, 100, -127, -83, -11, -34, 75, -75, 52, 9, 118, 127, 5, -12, -93, -108, 17, -9, -21, -62, -101, -10, 122, -24, 39, -100, -121, -118, -58, 0, -55, 97, 120, 120, 26, -22, -75, -22, 57, -89, 107, 117, -32, 75, -100, 49, 17, -20, 96, -64, 72, 28, 125, 38, -127, -69, 108, 33, -100, 36, 39, 3, 82, -50, -1, 127, -86, 74, 44, -64, -124, -83, 13, 18, -39, 40, -20, 92, -70, -16, -15, -17, -61, 91, 51, 114, 1, -21, -29, 123, 20, -20, 5, -19, 7, -1, 86, 121, 12, 77, 23, 17, -83, 16, -34, 28, -2, -76, -27, -52, -33, 64, -83, 122, -2, 64, -128, -9, 122, 127, -42, -37, 97, 2, 118, 38, -32, 49, 46, 60, 52, -128, 0, 72, -2, 114, -109, -8, -37, 48, 65, -21, 127, 66, -48, -128, 123, -26, 39, 8, 63, 2, -122, 35, 99, 56, -89, -1, -37, 3, 2, -126, 52, 4, 17, 46, -104, -126, -105, -46, -125, -2, 27, 35, 45, -119, 42, 115, -18, 34, 56, 104, 2, 61, 52, 124, -34, -73, 110, 19, 9, -15, -74, -6, -56, 86, -96, 17, -127, 28, -126, 3, 29, -127, 76, 37, 125, 7, -7, 127, 52, 94, 23, 123, -115, 120, 41, 91, -88, 87, -50, -49, 88, 51, 1, -7, -20, 77, -39, -92, -47, -49, 33, -67, -33, 25, 29, 44, 14, -37, 118, -126, -63, 125, -6, 19, -124, -9, 104, -121, -94, 47, -101, -5, 90, 86, 64, -126, 29, 126, -128, 59, -105, 63, 1, 34, 62, -43, 101, -109, -112, -22, 39, 86, 48, -84, -126, -110, -43, -51, 68, 7, -99, -81, 109, -43, -127, 2, 118, 123, -127, -31, 21, 55, 36, 113, 19, -48, 123, 60, -1, -123, -108, 20, 32, -128, -13, -11, -123, 72, -115, 126, 47, 61, -126, 89, 118, -20, 14, -127, -19, 102, 20, 11, 98, -71, -87, 24, -3, 127, 13, 92, -127, 83, -69, 9, -118, -38, -53, 19, 14, 27, -125, -9, 110, 115, 7, 126, 112, -124, 119, -43, -8, 127, 29, -9, -29, -32, -110, 64, -108, 0, -92, 127, -12, -19, 31, -18, 2, 79, -52, 32, 79, -79, -83, 27, -35, -89, -124, -125, 67, 23, 82, -37, -125, 127, -92, -1, 5, 14, -117, 52, 42, 57, 94, -87, -123, -60, -11, -7, -47, -122, -20, -8, 123, -118, -13, -128, -95, -127, 74, -104, -69, -125, 35, -30, 87, -64, -11, 124, -69, -93, 125, -119, 123, 106, -121, -22, -68, 81, 124, -22, -96, -126, 69, 35, 29, -125, -85, 106, -59, -60, -61, -121, 88, 87, -67, -112, -65, 127, 73, -47, -122, -42, 127, 113, -121, 23, 26, -12, 109, 76, 19, -21, -30, -11, -31, 12, -66, -17, 118, -83, -109, -128, -53, -49, -128, 96, -2, 76, 102, -6, -19, -126, 30, 61, -96, 51, 54, -8, 75, 117, 111, 87, -126, 104, -123, -42, -82, -112, 58, 39, 127, -123, 68, -107, -128, 13, -81, 76, -108, 28, -49, -52, -67, 16, -19, -23, 31, -127, 84, -15, 21, 3, -70, -119, 26, 91, -122, -122, 89, -117, 24, -78, 41, -17, -65, -114, -49, 7, -113, 78, 48, 117, 53, -110, -28, -49, -60, -128, -44, -67, 125, 16, -26, -119, 72, -41, -83, 120, 51, 114, -56, 127, -20, -15, -45, 61, -62, 119, -43, 118, -126, -32, -38, -112, -108, 121, 15, -84, -90, 87, 83, 43, -41, 85, -128, -3, 103, -122, 124, 18, -52, -58, -128, 109, -122, -49, -21, -110, 105, 2, -19, -4, 111, -16, 74, -73, -27, -126, -44, 125, -126, -1, 49, -59, -66, -53, 116, 123, 126, -105, 119, 127, 127, 40, 43, -44, -63, 18, -111, 124, -91, 18, 10, -83, 4, -17, 1, 78, 121, -79, 9, -128, 5, 112, 3, 13, -104, 55, -54, 3, 58, 27, 41, -45, -46, -26, -38, -59, 122, -41, -34, 63, -40, 8, -4, -12, 4, -75, 2, 83, -25, 25, 109, 46, 30, -9, 75, -45, -57, -58, -118, 74, 89, -124, -6, 25, -82, -107, -58, -30, 117, 116, -19, 123, -30, -23, 51, -11, -13, 8, 50, -121, -11, 46, -78, 120, -127, -6, 33, 53, 52, 126, -72, 109, -113, -118, -16, -82, -71, 2, -43, -122, 55, -33, 49, -26, -118, 24, 113, -24, 28, 77, -118, 12, 90, 95, 25, 127, 29, 101, 116, -9, -87, -78, 120, 120, 114, -122, 79, -94, -89, 61, -39, 5, -127, -14, 29, -127, -74, 76, 9, -94, 73, -125, -62, -28, 47, 86, -83, -124, -68, -11, -68, -31, 98, -79, -123, 122, 62, -103, -16, -48, 49, -79, -106, 65, 118, 56, 73, 53, -11, -112, -97, -73, -39, 5, -69, 111, -45, 13, -3, 65, 4, -4, -88, 121, 11, 45, -19, 87, 84, -67, -114, 73, -83, -19, 30, 35, -79, 55, 77, -81, 63, -71, 2, -83, 44, 127, 61, -75, 9, -125, 65, -128, -23, -110, 43, -11, -19, -36, -102, -77, 122, 63, 95, 105, -18, 11, 36, 125, -71, -59, -8, 16, 95, -61, -102, -125, -69, 29, -16, -52, -27, 55, 102, -24, -105, 52, -10, -123, -39, 81, -128, -11, 91, 40, 11, 123, 27, 26, -28, -97, -122, -121, 27, 49, 24, 112, -34, -71, 125, 115, 75, 73, -65, 68, 53, -99, -37, -86, 59, 73, -115, -128, 37, -66, -66, -76, 115, -128, 20, -56, 3, 36, 91, -85, -121, 120, 24, -17, 108, 38, -82, 87, -39, 92, -10, 58, -20, -30, 46, 66, -10, -95, -16, -57, -108, 68, -14, -57, -113, -55, -7, -91, 53, 112, 22, 24, 26, 102, -29, 76, 41, 13, 27, 17, 86, -33, 126, 103, 50, -11, -49, -118, -103, 26, 116, 47, -56, -88, -40, -24, -56, -2, 87, 105, -99, 104, -54, 14, 25, 118, -125, 11, 28, -76, -70, -32, -71, 97, 15, -22, -35, -100, -21, 24, -25, 17, -31, 80, -65, 50, 37, 115, 84, 53, 5, -33, -33, -99, 25, -11, 20, 86, -96, 44, 86, 126, -111, 66, 21, 0, 63, -123, 93, -15, 36, 127, -76, -123, -72, -111, -127, -62, 1, -85, 1, -32, 61, 50, 57, 27, 87, -34, -30, -2, 28, 111, -59, -18, 16, 3, 82, 4, -128, 126, -76, -21, -122, -21, -93, -28, 42, -52, 1, -16, 37, 67, 17, -91, 29, 121, 6, 118, -43, -54, -125, 87, 4, -25, 50, 124, 57, 43, 22, -51, 21, -49, 21, 12, 71, 122, 45, -66, -58, -54, 44, 41, 52, -6, 84, -56, 127, -122, 57, 75, -42, 127, -11, -42, 31, -124, 54, 21, 5, -23, 108, 123, -64, 23, 45, 100, -28, -86, -50, -32, -27, 116, 99, 58, 35, -64, 71, 32, -51, 63, 0, 46, -89, -69, 40, -12, 27, 71, -24, -76, 91, -40, -88, 119, 47, 126, -122, -81, -81, 7, 10, 50, 113, 2, 58, 26, -55, -98, -59, -50, -59, -110, -125, 16, -59, -41, -16, 103, 48, 83, -26, 54, -119, 11, -36, 126, -16, 35, 38, -96, 118, 0, -43, -30, -26, 21, -28, 32, -75, -17, 29, -7, -127, -16, -23, 3, 18, 75, -42, 97, 117, 26, 126, 118, 62, -126, 17, -112, -70, 119, -47, 60, -42, -49, -33, 69, -43, 79, 7, 80, 116, -45, 113, -45, -74, 72, 21, 63, 19, -116, -15, -110, -67, -121, -2, -42, 101, 79, -36, 15, -50, 81, 127, -51, 120, -47, 38, 22, -75, 126, -39, -38, -123, -13, 31, 16, 62, -119, -76, 35, -7, 17, -11, -122, -6, 65, 93, 36, 104, -100, 73, -9, 95, 92, -80, 75, 34, -65, 18, -112, 20, 0, -27, -2, -127, 54, 25, -45, -61, -126, -53, -15, -29, -7, -1, -41, -126, 21, -124, -75, 86, -43, 62, 75, 55, 122, 54, -8, -124, -109, 108, 71, 20, -26, 28, -29, 11, 125, -51, 90, -11, 29, 67, -124, -80, 51, 8, 72, 46, -120, -75, -44, -52, 34, 2, -19, 127, 113, -34, -97, 85, -32, -58, -5, 35, 125, 80, -17, 40, -34, -30, -50, 6, -63, -40, 102, -12, -17, -2, -80, 120, 66, 121, -40, 87, -13, -38, 36, -36, 1, -6, 72, 61, -1, 82, -102, -37, -32, 4, -6, 66, -73, 126, -6, -4, -42, -27, 24, 118, 5, 10, -32, -20, -36, -23, -74, 5, 85, 67, -45, -115, -101, 115, 85, -75, -61, 29, -17, -89, 104, 91, -46, 102, -68, 56, -112, -67, -75, -114, 45, 111, -35, -51, -125, -87, -20, 59, -120, -15, -22, 1, -96, -95, 15, 119, -14, -111, 18, -6, -42, -88, 42, -2, 22, 112, 89, 97, 40, 98, 117, -123, -4, -27, 61, -96, -83, 10, -1, -1, 31, 51, 1, 9, -93, 47, -38, 88, -75, -79, -28, 13, -16, -31, -94, 36, 63, 120, -72, -127, 4, 78, 21, 34, -30, 43, 23, -123, -124, 17, -71, 38, -103, 3, -15, 17, 124, 84, -88, -21, 73, 37, 50, 44, 107, 34, 81, 33, -55, 2, 8, 33, -15, 10, -119, 33, 10, -10, 44, 74, -70, -67, 90, 7, -67, 28, -123, 33, -27, 63, 2, 123, 87, 5, -76, 53, -128, -55, 120, -115, 111, -43, 16, 14, 98, -2, -24, 46, -4, -123, 34, -50, 113, 27, 38, 117, 106, 46, 10, 2, -2, 72, -123, 3, 14, 28, 3, -124, -51, -40, 73, -117, 32, 86, 22, -32, -76, -119, 83, -96, -94, -51, -51, -87, 53, 94, -87, -2, -22, 36, -127, -34, 77, 127, 121, 57, 39, -71, 98, 13, 13, -43, 3, -34, 71, 124, 117, 48, 74, 10, 20, -2, -105, -71, 10, 62, -74, 4, 74, -17, -40, -50, -116, 29, 27, 47, 68, 7, -60, 67, -58, -119, 53, -25, -79, -102, 70, 27, 5, -14, -74, 51, -12, -13, 1, 17, -22, -87, -12, 0, -50, 19, -114, -33, -56, -99, 45, -27, -6, 47, 21, 21, -91, 35, 87, -32, 8, -126, -2, -51, -122, 93, -63, -118, 4, -36, 40, -46, 56, -79, 126, 30, -4, 81, 11, 12, 106, -1, -89, -90, -45, 46, -118, 12, -81, 75, -99, 20, -120, 78, 5, 93, 79, 9, 101, -47, -78, -104, -62, 123, -13, 108, 101, -55, 27, -4, -127, -35, 63, 79, -98, 36, 15, 62, -9, -23, 45, -17, -37, -5, 49, -120, -89, -10, 123, -38, 125, -103, 119, -104, 11, 8, 72, 39, -39, 110, -20, 19, -38, 91, -104, 103, -47, -24, 25, -14, -59, -29, -23, 82, -8, 7, -106, -11, 5, -15, -30, 87, 27, 102, -95, 52, 66, -48, -124, -58, -126, -30, 127, 63, -121, -16, -42, -125, 77, -4, -107, -19, -29, 22, 5, -56, 29, -88, 10, 26, -127, 36, -17, 67, -26, 93, -16, -31, 7, -30, -17, -24, -56, 33, 10, -125, 120, 119, -128, -77, -68, -9, -33, -60, 7, 1, -88, 40, -6, -67, 43, 14, -128, -26, 39, -26, -80, -120, 7, 125, 69, -86, 47, 5, 119, 76, 38, 52, 6, 62, -31, 15, 71, -25, -61, -75, 88, 109, -4, -93, -126, 56, -99, 103, 16, 93, 93, -11, -127, 106, 5, -126, 19, 56, 68, 59, -41, 9, 17, 29, 0, 112, -74, -51, -127, -119, -110, -122, -9, -64, -86, -50, 61, 40, 33, -105, 127, -6, -28, -9, 26, -20, -81, 50, -111, -118, -25, -49, -109, -35, -96, 127, -51, -120, 127, 22, -125, 43, 29, 127, 1, 66, 19, 4, 15, 86, 42, -71, -26, 125, 80, 48, -100, 125, -13, 126, 33, -14, 33, -16, -68, -33, -4, 75, -127, 20, -12, -10, -3, 25, -43, -30, 14, 12, -33, 44, 51, 46, 63, -116, 76, 93, -128, -35, 13, 9, -39, -97, 33, 55, -39, 24, -33, 52, 84, -65, 120, 11, 103, -32, 101, 127, 23, 3, 20, 31, 53, 39, -38, 41, -19, 94, -41, 67, -33, 15, 9, 24, -77, -26, 93, -71, -8, 46, -26, 51, -21, -127, 42, -12, 126, 48, -121, 48, 39, -123, -5, -4, 45, 60, -122, -55, 13, -43, -9, 100, -7, -122, 32, -63, -71, -85, 58, -59, -60, -70, 93, 68, 85, -77, 126, 43, -5, 63, -103, -69, -49, 59, -51, -120, -53, -75, -98, -21, -20, 127, -43, -35, 127, 27, 57, 83, -8, 127, -50, 119, 126, -65, -14, -95, -22, 33, -17, -39, -39, 12, 122, -118, 17, -26, -94, 47, -30, 111, 26, 14, -79, 105, 127, 31, -51, -96, -75, 21, 67, 25, 22, 79, -98, 41, 110, 59, 127, 127, -18, 3, 97, 124, 36, -8, 9, -99, 23, 1, 66, 39, -44, 116, 123, -5, 124, 84, -6, -55, -50, 121, 47, -117, -80, 85, -113, 22, -126, 101, -81, 119, 6, 39, 1, 81, -30, -50, -120, -9, 42, -126, 1, 23, 111, -33, 14, -128, -4, -57, 26, -45, 126, -115, 8, 14, 84, -11, 19, -3, -123, -127, 80, -37, -100, 13, -57, -121, 122, 45, -59, 36, 50, 3, 39, -15, 7, -12, -15, 96, -128, -7, 47, -47, -19, 71, 31, 26, 63, -67, -112, -36, 45, 14, 65, -103, 4, 59, -127, 37, 127, -47, -35, 44, 9, 115, 120, -127, 96, -125, -33, 114, 66, -120, -1, 15, -128, -126, 28, -125, 16, 8, 56, 83, 109, 116, -59, 111, 40, -4, -60, -15, -10, 101, 41, -100, -3, -39, 91, 34, 26, -78, -4, 126, -18, -11, 112, -108, 40, 11, 44, -50, 62, -67, 37, 80, 22, 11, 101, 21, -115, -69, -32, 59, -125, -126, 107, 120, -24, 119, -127, -48, -3, 6, -70, 65, -114, -3, -5, 120, -23, -80, 72, 68, 63, 48, -7, -112, -109, 5, -34, 116, -73, 126, -15, -87, 22, -7, -39, -12, 74, 14, 4, -113, 44, 33, 82, 32, -113, -107, -20, 102, -111, 1, -122, 63, -115, -45, -61, -53, -85, -16, -9, -23, -24, -5, -38, -76, 37, 59, 4, 79, 23, 70, -113, 36, -42, -41, -68, -59, 9, -100, -105, 117, 127, -127, 45, -128, 9, 26, -115, -80, 99, 72, -74, 17, 8, 8, 60, 31, -128, 126, -122, 107, 7, -28, 28, -109, -32, -44, -81, 16, -128, 13, -126, -39, 18, -69, -84, -22, -113, -31, 48, 49, 0, -65, -109, 82, 57, -95, 12, 13, -43, 19, 36, 95, -113, 40, 95, 116, -11, 61, 55, -61, 127, 67, 127, -46, 126, 31, 116, -30, -67, 113, 90, -23, 54, -55, 13, -45, 127, 63, -22, 120, -13, -22, 58, 91, 52, 45, 13, 83, 40, 87, -25, 125, 91, 74, 50, -124, 86, 66, 5, 127, -19, 116, 6, -12, 4, 42, 92, -40, -100, -21, 123, 27, -45, 4, -97, -22, -113, -4, -27, 18, 49, 78, 107, 6, 126, 127, 8, -47, -124, -110, -8, 17, 67, 51, 5, 13, -11, -76, 15, -124, 37, 58, -71, 25, -112, 45, 35, -128, 44, 127, 34, 39, 15, -17, 49, -3, -24, -27, -49, 12, 127, 111, -78, -63, 30, 29, 29, -25, 73, -66, 94, 17, 6, 75, -82, 118, -96, 55, -47, -53, 16, 21, 115, 15, -10, 64, 7, 42, 73, -33, -38, 6, -88, 94, 31, 51, -99, -27, 0, 123, -124, 81, 51, -54, -112, 115, 42, -124, -60, 99, 23, 101, 62, -52, 20, 6, -43, 4, 9, 0, 44, 51, 8, -59, -11, 110, -6, 100, 29, 127, 0, 92, 127, 13, -38, 65, 23, 76, -1, -127, -69, -14, 59, -33, -57, 11, 0, 83, -38, 52, 110, -36, -35, -112, 99, -16, -113, 125, -50, -114, 63, -62, -6, 39, -9, 110, 0, -100, -29, 123, 121, 7, 82, -51, -32, 51, -34, 84, -76, -82, 90, -105, 111, 24, 17, -16, -41, -116, -123, 1, 48, -127, 55, 66, -16, -84, 74, -37, -91, 27, 83, 47, 49, 92, -80, 32, 72, 65, 29, 16, -7, 8, -106, -3, 15, -69, -48, -27, 45, 8, -51, 58, 35, -10, -15, 0, 15, 4, 50, -64, 6, -16, -35, 59, -2, 14, 1, 7, 4, -74, 7, 124, 38, -46, 70, 0, -73, -35, -5, -4, 0, 54, 7, -4, 10, 93, -8, 42, -93, -38, -46, 1, 29, 50, 78, 75, 63, -73, 14, -26, 6, 58, -81, 7, -3, 86, 69, 5, -6, 14, 48, -41, 124, 0, 43, 65, 24, 54, -79, 32, 46, 17, -13, -57, -35, -10, -19, 40, -78, -47, -4, 30, -86, -61, 0, 15, -15, 13, 127, 5, -22, 61, 68, -33, 8, -16, -34, 10, 33, 5, -48, 14, 49, 126, -27, 20, 96, 26, 8, 24, -4, 57, 54, 45, -11, -126, 126, -13, -51, -32, 4, -65, 74, -77, -35, -3, -7, -69, 10, 13, 0, -49, -123, -56, -9, -61, 6, 18, -1, 12, -67, 23, 5, -30, 7, 37, -34, 12, -40, 3, -25, 32, -60, -66, 97, -27, 32, 20, -95, -3, 8, -76, -15, 61, 8, 19, 9, 18, -20, -13, 105, -13, 47, -11, 19, 10, -47, 1, 125, 77, 90, 34, -76, 49, 64, -28, -67, 2, -32, -24, -1, -25, -120, 1, -68, 55, 81, -85, -11, -12, -29, -110, 2, -44, 41, -12, -16, 7, -1, -118, 76, -76, -17, -43, -8, 101, 86, -123, 70, 45, -13, -39, 114, -72, 101, -5, -8, -5, -54, -49, -92, -26, -117, 19, 14, -116, 37, 8, 15, -15, 30, -22, -16, 23, -83, 5, 57, 14, -19, -9, 51, -1, -20, -26, -3, -8, 3, -14, -51, 11, -56, 30, -5, -108, -10, -115, -89, -38, -70, -4, -15, -30, 35, 48, -119, -63 }; static const rnn_weight noise_gru_recurrent_weights[6912] = { 20, -47, 122, 31, 41, -36, 18, -22, 0, 87, -28, -26, -68, 8, -54, 104, 112, 19, 31, -118, -31, -31, 9, 17, 11, 5, -53, -24, -17, 24, -35, 16, 53, -26, 6, 24, 48, 11, 17, -34, 17, -15, -51, -32, -44, -11, 10, 63, 25, -92, -52, -30, 26, -57, 44, -18, 20, 49, -40, 74, 96, -43, 99, 90, -15, 40, 11, -119, -125, 42, 58, -127, -27, 9, -64, -64, -87, -31, -53, -39, -1, -11, 53, -6, -124, -6, -81, -67, 46, 23, 11, -124, -48, 100, -62, -6, -17, -124, 10, 81, 39, 35, -125, -52, 4, 41, -43, 12, -48, 13, 27, 41, 25, -20, 4, -71, -59, -30, 43, 46, 22, 34, 50, -78, -117, -26, 67, 22, -27, -86, 48, -51, -52, 32, 48, 1, -11, 63, -38, 62, -13, 17, 32, -6, 11, -15, -65, -45, 69, -9, -33, -13, -114, -30, 55, -29, -33, 3, -59, 44, 72, -52, 22, 65, 14, 5, -20, 19, 12, 81, -2, 100, -6, 125, -41, 124, -2, 24, 107, 21, -38, 66, 46, -20, -11, 8, 51, -59, 8, 50, -78, -26, 98, -21, 120, -30, 34, -49, 72, -22, -74, 69, -86, -11, 23, -126, 10, 12, -35, -36, 20, 21, -24, 39, 44, -110, -54, 33, 1, 10, -83, 36, -37, 7, -57, 0, -73, -23, 15, -10, -14, 12, 52, -80, -21, -40, 0, -47, 24, 8, 58, -41, -48, 14, 27, -83, -11, 62, 5, 101, 35, -75, 89, -101, 44, 50, -77, -115, 1, 50, 25, -113, -64, -6, -14, 30, -80, -91, -48, -126, -51, -93, -103, -1, -49, 73, 25, -39, 51, 70, -39, -53, 41, -60, -70, -72, -6, -19, 63, 75, 120, 79, 1, -57, 8, -3, 18, 5, -56, 31, -13, 73, 83, 77, 4, -122, 122, -127, -17, 63, -119, -30, -74, -109, -106, 44, -12, 106, -15, -31, -19, 17, 87, 15, -79, 81, 32, 35, 60, 127, 0, -53, -60, 30, -93, -31, -19, 36, -19, -21, -46, 44, 16, 88, -98, 61, 65, 25, 119, -70, 127, 52, 12, -1, -6, -72, 15, 99, -117, 22, 3, 99, -63, -54, -56, -1, -32, -2, -120, 53, 66, -8, 112, 43, 2, -57, -27, -92, 39, 100, 5, -20, -66, -7, 33, -81, -127, -80, 27, -112, -76, -53, 122, 12, 33, -88, -25, 47, -112, 10, -38, 117, 29, -125, -65, 30, 60, -124, -61, 14, 108, 7, -30, -50, -38, 44, 16, -35, 39, -2, 125, 83, -1, -24, -27, 106, -76, 58, 122, 24, 15, -86, -101, -82, 121, 6, -4, 33, 0, -40, -80, 22, -24, -124, -39, 120, -53, -1, 63, 12, 48, -54, 83, -109, 40, 7, 26, -51, -74, 38, -12, 0, 33, -66, 50, -118, -25, -109, 18, 59, 124, 50, 10, -42, 12, 68, -85, -59, 46, 34, 5, -1, -2, -41, 53, 3, -8, -62, -8, 33, -95, -24, 52, 30, -16, 98, -13, -54, -54, 39, -30, 9, -78, -13, -21, -39, -20, -21, 36, 24, 1, 63, 28, -72, 63, -15, -127, -19, 16, 56, 4, 22, -71, 9, -13, 18, -42, 5, -10, -14, -71, -37, -47, -48, -68, 64, 56, 23, -90, 15, -67, -38, -1, 10, -34, -119, 55, -61, -25, 24, 29, -47, -53, -28, 32, 23, 51, 45, -17, 111, 12, -16, -63, -25, -50, 31, -18, -45, 2, -15, -79, -11, 78, -102, -46, 31, -47, 69, 8, 63, -123, 107, -74, -78, 45, 55, 20, -64, 30, 95, 44, 6, 13, 28, -37, -70, -21, -84, 16, 6, 5, -53, 8, -9, -11, 24, 41, -39, -84, -40, 24, -126, -41, -3, 13, -84, 59, -62, -43, 11, -15, 14, -46, -125, -72, -38, -48, 22, -38, 84, 39, -29, -97, 31, 8, -46, 22, -68, -60, 8, -47, -123, -18, -102, -43, 34, -79, 30, -74, -94, 64, -57, -1, 98, -9, 97, -119, 45, 19, -24, -26, -99, -55, 24, 46, 7, -6, -126, -80, 15, 1, -20, -72, -68, -23, -79, -74, 65, 8, 26, 118, 13, -82, -38, 20, -9, 104, 41, 42, 126, -15, -54, -65, -97, 59, 50, 12, 76, -47, 92, -126, -39, 2, 46, 27, 101, -87, -7, -26, -25, -2, 22, 12, 57, -99, -16, 54, 126, 80, -17, 54, 21, -21, 83, -54, 62, -11, 35, -37, 80, -2, 20, 6, 39, -20, -74, 33, -53, 56, -21, -48, 37, 37, 0, -40, 13, 44, 107, -47, -21, 19, -23, -116, 104, 72, -43, 59, 37, 53, 70, -59, 26, -14, 41, 13, 17, 32, 123, -73, 62, 101, -47, -60, 15, -44, 7, -114, -40, -39, -79, 84, 18, 114, 70, 103, 55, -24, -8, -80, 71, -50, 55, 54, 46, 25, -59, 15, 19, 122, -104, 121, -5, 45, -22, 118, 88, -2, 123, -13, 21, -33, -70, -54, -86, -29, -85, -40, -38, -20, -71, 8, -97, -23, -48, -4, -9, 25, -122, -52, -119, -5, 3, 39, -28, -113, -65, -44, 5, 13, -14, 83, 9, 50, 27, -24, -13, -14, -37, 106, -31, 58, -26, 37, 1, -78, -128, -12, -39, -127, 20, -53, 54, -61, 71, 16, 41, 54, -92, 57, 88, 48, -51, -7, 18, 24, -12, 83, 29, 63, -20, -88, 11, -17, -79, -84, -51, 53, -2, -21, -64, -28, 98, -14, 7, 127, -122, -22, -25, 6, 4, 121, 124, 111, 38, -33, -17, -106, -2, -10, 12, -35, 67, -2, 8, -15, -17, 48, 66, -5, -10, -33, -2, -37, 73, -110, 124, -27, -14, -7, 46, 6, -14, -37, -32, -32, -33, 39, 33, -21, -111, 1, 21, -126, -99, -81, 31, -32, 58, 32, -104, 23, 61, -48, 20, -5, -51, 57, -126, -10, 110, -6, -32, -35, 65, 42, -95, -74, -72, 6, 45, -81, 34, -61, -128, 46, 22, 5, -30, -59, 116, -95, -31, -14, 16, 18, -39, 52, -36, -35, -1, -107, 59, 34, -24, 35, 28, 52, -65, -49, -66, -1, 59, -87, 45, 42, 124, -47, -59, -68, -85, 52, -18, -119, 19, 25, -126, -118, -26, -9, 82, -111, 20, -72, -86, 6, -36, 18, -45, 100, 3, -86, -17, 125, -121, -50, 25, 37, 123, 20, 52, -118, 53, 19, -31, -86, 123, 63, -110, -12, -28, 64, -39, 75, 96, -95, 58, 45, 43, 97, -71, -25, -38, -8, -33, -85, -56, -44, 41, 82, -77, 71, -35, 29, -36, -16, 21, -84, -7, -37, -82, 60, 21, 26, -39, -23, 87, -2, 46, -27, 45, -38, -25, -67, 45, -48, -3, 11, -82, -15, -34, -35, 87, -94, -17, 47, -33, 41, -17, -36, 30, 41, -18, 81, 33, 25, -80, 65, -6, 65, -35, -18, -105, 33, 57, 5, -12, 25, 120, 6, -69, 90, -41, 45, -59, -82, 80, 41, -11, 6, 38, 105, 51, 58, -73, 20, 19, -4, 40, -28, -124, 116, -33, -15, 23, 124, 68, 28, 6, -25, -29, 18, 80, -35, -4, -25, 10, -118, -20, 9, 94, -111, -76, 43, -19, 15, 97, -19, -21, 63, 92, 72, -67, -23, -66, -49, -14, 6, -47, 17, -101, 21, -29, 89, -72, -86, 112, -92, 38, -71, 114, -53, 47, -102, 6, -59, 64, -16, -116, -22, 6, -43, 19, 9, 9, -37, -68, 86, -6, -84, -40, 10, -14, 80, -10, -49, 76, 31, 47, 123, 90, -49, 35, 9, 64, 71, -29, -40, -107, 60, -33, -23, 25, 63, -116, -16, -118, 82, -125, -7, 26, -70, 77, 37, 124, 29, 80, 69, 88, -5, -56, -77, 68, -77, 61, 20, -72, -27, -120, -58, -70, -10, -126, -49, -66, -44, 127, -28, 83, 63, 65, -90, -29, -121, -1, -30, 85, -41, -91, 40, -43, 68, 85, 85, -75, -43, 122, -24, -103, -82, 20, -113, -22, -36, -72, 29, -39, 28, -24, -16, 11, 27, 28, -1, -61, 15, -126, 1, -31, -43, -26, 24, -27, -42, 28, -80, -34, 15, -44, -42, 31, 23, -40, 30, -2, -54, -6, -48, -114, 36, -71, 13, 57, -127, 94, 1, -28, 116, -62, -3, -29, -23, -75, -110, 49, 42, 127, 19, -121, -92, 56, -58, -28, -41, -19, -5, 38, 106, 120, 40, 2, 86, -58, -49, -20, 102, -56, -86, -7, 1, -85, 10, 34, -11, -63, -1, 85, -106, 31, -48, -64, 12, -14, -111, -82, -28, -11, -26, -52, -43, -33, -20, -57, -91, 27, -64, 54, -55, -32, 27, 97, 11, 13, -8, -120, -35, 35, 6, -117, 25, 104, 7, -1, -8, 0, 31, -29, -10, -20, -33, -23, -1, -6, -107, 60, -62, 70, -28, -96, 48, 17, -103, -64, 30, 42, 18, 66, 0, -69, -16, 77, -21, -4, 35, 45, -70, 70, 36, 27, 97, -27, 57, 23, -23, 91, 118, -12, 24, 21, -54, 1, 40, -17, -109, 39, 33, -22, -44, 46, 20, -15, -42, 29, -10, -64, -16, 35, -95, -83, 40, -34, -63, 54, -12, 2, 104, -5, -103, -79, -94, 126, -7, 18, -17, 116, -15, 76, -48, 19, -5, 76, 58, 53, 1, 20, 22, -13, -63, 11, -15, -117, -39, 43, -21, -5, 18, 16, -7, -72, 34, -103, 86, -76, -114, 26, 39, -4, 3, 45, -37, -55, -34, 56, -113, 14, -56, 21, 83, -115, 52, -41, 71, -51, -125, -95, 11, 93, -48, 5, -41, -128, 11, 22, -20, -103, 1, 17, -69, -28, -32, 25, 119, 52, -92, -92, -19, 57, 77, -51, 59, -57, -8, -90, -17, -44, -94, -43, -90, 5, 18, -27, -72, 42, -18, -29, 32, -30, 19, -7, -27, -102, -82, -20, -7, -127, -26, 60, 1, -37, -124, -92, -47, -8, 8, -55, -25, -88, -18, 98, -5, -35, -44, 15, 121, -38, -13, 9, -88, -126, 68, -126, 62, -49, -44, -56, -71, 3, 65, -27, -46, -103, -78, 29, -65, -23, 100, 75, 47, 8, 57, -43, -47, 69, 112, -85, 51, -56, 36, -101, 13, -36, 73, 26, 31, -8, 53, 52, -38, 29, 81, -26, 116, -18, 35, -49, 2, -6, -4, 52, 94, 59, -120, 68, -59, 6, -3, -54, -22, 18, 1, -126, -127, -34, 19, 105, -26, -16, 113, -43, -31, -7, -60, -4, 72, 39, 17, 38, 118, 31, 5, 19, -70, -14, -93, -8, -107, -56, -59, 56, -127, 41, -63, -30, -71, -27, -4, 13, -15, -66, -50, 33, 38, 34, -47, 2, -50, 71, -49, 18, -39, -18, 46, -3, 50, -18, -32, -67, -25, 58, -14, -7, 23, -3, -24, 7, 8, 118, -20, -55, -24, -30, -16, -9, 73, 63, -74, 42, 112, -35, -27, 38, 59, 13, 72, 2, 109, -11, -75, 30, 28, -20, -74, 16, 103, -83, -6, -115, -44, -11, -33, -120, 66, -58, 22, -12, 15, -32, -26, 1, 30, 35, 76, 62, -121, 9, -32, 12, 75, -77, 80, 25, -18, -78, -123, -61, 23, 36, -127, -65, 15, 29, 100, -23, 2, 15, 21, 52, -120, -14, 12, -38, -39, 100, 13, -3, 22, -125, -115, -44, -65, 85, -44, 35, -27, -44, 9, 77, 2, 4, 5, 35, -31, -126, -112, -91, 32, -24, 6, -73, -41, 41, -23, 42, -127, 41, -51, -8, -55, -52, -32, -6, -52, 55, -16, 26, 110, -63, 70, 127, 38, 80, 17, 87, 44, -51, 34, 127, -16, 117, 126, 22, -24, -123, -6, -76, 12, -4, -3, 47, -31, 28, 30, 12, -24, 84, 110, -105, 64, 44, 84, 27, -13, 54, 104, -20, 60, -60, -10, 45, 120, -55, -6, -91, 35, 10, 2, 38, -30, -125, -100, -23, -126, 47, -16, -17, 20, -73, 6, 31, -28, -121, -53, 79, -100, -4, 69, 0, -20, 125, 35, 16, -44, -20, -5, 44, -113, -11, -6, 57, 33, -3, -21, 50, 101, -9, 42, 72, -10, 21, 95, 39, 8, 72, 42, -43, -24, 30, 33, -27, -17, 79, 52, -127, 3, 39, 1, -66, -43, 85, 11, -56, -20, 14, -7, -30, -8, -10, -34, 48, -109, -12, -99, -58, 123, -82, 35, -102, 7, -83, -104, 29, 99, -91, 13, 15, -64, -111, -17, -24, -98, -97, 86, 0, 12, 123, -113, 61, -13, 3, 31, 4, -92, -115, 126, 7, 6, 74, -68, 46, 19, -85, -94, -20, -20, -117, 59, -51, -59, 20, 18, 3, 6, 21, 1, 94, -78, 112, -12, -46, -30, 67, -16, -83, 6, 42, -118, 49, -82, -21, -4, 15, -12, -67, 20, -71, -69, 57, -10, -51, -46, 99, -5, -9, -40, 59, -61, -11, -59, -69, 2, -55, -32, -48, -4, -6, -33, -110, 94, 43, -19, -18, 31, -126, -5, -19, -80, -20, -20, -28, -56, -70, 45, -46, 43, 77, 6, 77, -90, 26, -37, 35, -39, -48, 28, 9, -56, -42, -31, -46, -31, 13, -65, 77, 34, -41, 9, 17, 20, 24, 51, -44, 11, -21, -44, -78, -96, -23, -22, 6, 18, -126, -110, -33, 8, -32, 17, -123, -43, -7, -53, 17, 46, -53, 26, -15, 70, 19, -51, 67, 25, 117, 56, 7, -6, 74, 57, 101, 122, 41, -32, -44, -21, 54, 32, 22, 119, 120, 72, 68, -24, 29, 48, -6, 2, -14, 5, -35, -77, 4, -72, 53, 46, -31, 57, 25, 9, 69, -21, -7, 70, -41, 43, 63, 10, -53, -68, -31, 20, -19, -90, 48, -22, -54, 33, 64, 20, -79, -13, -17, 45, -41, 103, -16, 25, 6, -35, -24, 28, 9, -29, 76, 4, 40, 47, 23, 24, -51, 92, -17, 49, -23, 107, -13, 65, 72, 34, -19, -20, -60, -45, -55, -2, 19, -58, -49, 7, 20, 78, 120, -69, 28, 45, -119, -15, 13, 20, -45, 25, -108, -20, 12, -54, -17, 32, -17, -13, -3, -3, 17, -25, -48, 95, 8, 36, -66, -4, -26, -17, 12, 39, 57, 53, -17, -33, -46, -18, -61, 19, 64, -72, -12, -69, -31, -31, 66, 65, -62, -10, 120, 4, 46, 122, -36, 75, -47, -5, -82, 49, -3, -123, -125, -37, 127, 33, 111, 58, -68, -36, 87, 51, 22, -49, -1, 115, -10, -40, 37, -56, -90, 11, 34, 77, -5, -37, 61, 123, -11, 17, 46, 64, -86, -96, -5, -18, -84, 116, -126, 127, 55, 58, 27, -68, 42, 47, -63, -108, -103, -33, -1, 77, 0, -9, 33, 126, -106, -14, 127, 8, 2, -42, 37, 41, -23, 17, 11, 4, -65, -42, 0, -47, -36, -11, 34, -83, -25, 52, -125, -25, 0, 7, 24, -83, -56, -21, 112, -60, 25, -124, -114, -67, -14, -55, -28, -34, -9, 119, 8, -47, 52, -6, 20, 23, 9, -104, -27, -46, -42, -32, 55, 118, 49, -35, -41, -19, -103, 1, 63, -47, 9, 1, 0, 124, 72, 1, 8, 47, 118, 29, -39, -20, 26, -38, -17, 13, 68, -52, -37, -30, 105, 7, -5, 27, 24, 71, 15, -48, 80, -9, -9, 66, 19, 19, -31, -74, 115, -4, 21, 78, -19, 2, 17, -51, 28, -109, 58, 78, -10, -3, 119, -44, -12, -41, -57, 67, 38, 49, -113, -43, -101, 59, 104, -26, 116, -23, -47, -33, 57, 17, -99, -123, -3, -55, 9, 94, -50, 30, -48, -128, -63, 3, -61, 61, -31, -40, -31, 4, -54, -123, 37, 70, 14, -13, -32, -115, 61, 21, -93, -34, -7, -32, 26, -20, -110, 73, -15, -123, -69, 41, 13, 106, 10, -39, 69, -102, -80, 18, 51, -81, 86, 30, 39, 48, -78, 106, 14, 30, -27, 65, 62, -20, -113, -30, 47, 22, -101, -24, 119, -15, -40, -95, 76, -112, -5, 38, -123, 77, -22, -84, 63, 17, 3, -113, 50, -6, -60, 5, 16, 29, 21, -1, -25, -16, -2, 58, -50, -58, -43, -28, -85, -71, -45, 66, 46, 127, 37, -63, -9, -60, 56, 22, 48, -47, 23, 28, 21, 27, -32, 7, -71, -82, -7, -11, -27, -24, -2, -45, 67, 32, 21, 86, 62, -51, 39, -41, 2, -41, -31, -15, 50, -50, 54, -8, -21, 39, 51, -32, -24, -22, -27, 5, -8, 16, -2, -17, 17, -43, -35, -32, 29, -21, -58, 27, 49, -2, -63, -109, 40, 26, -55, 63, 87, -37, 76, -88, -23, 42, 59, 24, -32, -47, 18, -16, -30, 71, 39, -13, -10, -83, -2, 24, -12, -36, -44, -79, 66, 17, -21, -27, 48, -4, -7, 101, 16, -13, 17, 20, 29, 70, -46, 19, -30, 25, 20, 8, 32, 86, -76, -17, -59, 102, -29, 10, 38, -104, 6, -86, 8, -39, 4, -2, -28, 8, -27, 8, -1, 36, -82, 17, -53, 44, 72, 43, -83, 16, 70, 42, -61, 12, -74, -70, -10, -23, -43, 33, 29, 12, -3, -18, -81, -26, -48, 10, 27, -37, 96, -27, 24, 67, -36, -28, -6, -10, -26, 15, -41, 7, 110, 25, -101, -75, 62, -54, -64, -11, -38, -126, -24, -93, 101, 0, 13, 20, 35, 41, -122, 91, 62, -45, -12, 13, -36, 40, -43, -104, -29, 61, -117, -70, -121, 17, -21, -3, -127, 107, -22, 62, 47, -3, -36, -18, 69, -67, -33, -19, -89, -13, -7, -4, -49, -20, -112, -13, 35, -126, 38, -27, -114, 12, -54, 19, -108, -61, -79, 5, -65, 71, -121, -115, -64, -2, -52, 35, 22, -46, -8, -82, 41, -113, -126, -6, -19, 43, -51, 35, -11, 84, -44, -100, 23, 67, -11, -20, 81, 52, 22, 21, 124, 12, -23, 4, -27, -128, 111, 25, 35, 48, 28, 9, 28, -24, 84, 56, 10, 71, -22, -22, 78, 16, 92, 117, -22, 33, 29, -10, -98, -35, 45, 1, 5, 24, -46, -69, 13, 21, 28, 4, -27, -117, 44, -29, 116, 26, -21, -38, 111, 43, 14, 6, -7, -79, 82, -57, 4, -127, 0, 86, 113, 2, 7, 42, -72, -31, 11, -6, -97, 22, 113, 10, -31, -30, -57, -35, 21, -21, 47, -3, -42, -36, 74, -102, -24, -59, -58, -50, -67, -113, 25, -128, 4, -108, 16, 113, 82, 32, -128, -17, 65, -121, -92, 81, 0, 28, 27, -8, -93, -31, -41, -22, -20, -78, -111, 44, -105, -67, -117, -123, -72, -76, -90, 9, 29, -48, -66, 4, -82, -51, 16, -28, 11, -54, 4, 22, 10, -91, -64, 6, 119, -63, -6, 24, 124, 75, -54, 70, 67, 38, -31, -48, 68, 71, -38, -7, 7, 34, 91, 53, 53, -33, 10, 90, 3, -37, 55, 58, 38, -17, 54, 19, -45, 63, 69, -9, 82, 9, -5, -33, -13, -35, -17, 4, -64, -126, 102, -116, -3, 17, -42, 19, -50, 62, 41, -21, -103, 38, 36, 14, -9, -10, -46, -35, -2, 43, 56, -112, -109, 70, -17, -35, -42, 34, -20, 94, -8, -1, -29, -30, -47, 71, -29, 56, -12, 6, -76, 53, 1, 8, 55, -24, 63, 15, 61, -113, -27, -57, 71, -42, 47, 74, -72, -12, 13, -39, -75, -112, -46, 40, 24, 82, 32, 48, -20, 40, 14, 61, -11, -117, -37, -7, -67, -123, -21, 20, -36, -31, -7, 28, -95, 39, -5, -98, -39, 10, 40, -67, -5, -47, 12, -23, 31, -2, -4, -9, -70, 29, 45, -37, 49, 15, -122, -47, 34, 9, 62, -7, -42, -127, -72, -22, -55, -64, -24, 2, -12, 86, -77, -36, -6, 56, 55, 46, 117, 105, -72, 27, 1, 97, 81, -24, -83, -94, 6, -16, 68, 9, -57, 12, 108, 11, 13, -89, 25, 59, -38, 49, -18, 16, -53, -2, -1, -5, 50, 17, 89, -9, -50, 27, -34, 62, -7, 4, -49, -6, -3, 12, -12, -118, -9, 26, -32, 29, 76, 37, -112, -26, -76, -38, -22, -34, 125, 59, 1, -53, 40, 21, -4, -27, -83, -19, 47, -123, -123, 30, 111, 3, 27, -1, 127, -47, -97, 38, 87, -101, 1, 15, 79, -2, 44, -18, -40, -17, 18, -49, -26, -125, -120, 16, -55, -37, -25, -86, -87, -23, 8, 29, 3, -14, 9, -9, 34, 10, 69, 4, -32, -20, 68, 10, 21, 15, -58, 16, -45, 81, 81, 104, -20, 45, 6, 45, 41, 55, 12, 18, 1, 11, -84, -48, 88, 2, 50, 30, 11, 17, 5, -23, 70, 121, 24, -31, 97, 36, 102, -95, 88, 5, -43, 123, 92, -20, -43, -28, 22, 127, -42, -47, -37, 86, 56, -60, 94, -13, -108, 21, -82, 25, -76, 36, 21, 54, 123, -70, 39, 3, 9, 73, -9, 31, -35, -55, -128, 14, 36, 15, 32, -63, -80, 64, -76, -72, -58, -115, -124, 127, 33, 17, 23, -65, 111, 18, 60, -34, -120, 80, 19, -125, 49, -20, 53, -66, 31, 22, 35, -125, -86, -42, -73, 37, -87, 22, 113, 70, -39, 1, -57, -44, -85, -12, 103, -49, -72, 79, -26, 89, -46, -67, 51, -11, 125, -121, -87, 32, -90, 21, -42, -3, 77, -6, 33, 38, -7, -27, 31, -28, 51, 18, 49, 55, 6, 22, 6, -29, 71, -123, -10, -46, 64, 30, -52, 124, 33, -1, -48, 27, 105, -74, -104, 38, -45, 102, -8, -28, 20, 19, 28, 8, -50, -44, 43, 123, -23, 121, -28, 88, 3, 57, -31, 13, 17, 52, 27, 8, 53, -25, -28, -34, 18, -68, 63, -21, -32, 11, 53, 66, -38, -79, 59, 5, -65, 50, -23, 61, -52, 64, -120, -20, 12, -77, -9, -67, -95, 16, -127, -111, -74, 124, 126, 78, 45, -29, -3, -70, -68, 43, -27, 32, -127, -69, -16, -33, -127, -125, -43, 13, 81, 67, -10, -41, -7, -38, -26, -1, 64, -66, 106, 127, -15, -28, 14, 117, 28, 41, -81, 46, -58, -121, 48, -86, -39, 8, -36, -128, -3, -78, 35, 45, 24, -7, -25, -3, 115, -21, 15, 14, -30, -40, -30, -55, 39, 79, -29, 126, 69, -97, 18, -31, -11, 58, -60, 14, 99, 11, 54, 43, 30, -50, -53, 4, 125, 26, 108, 32, 36, -17, 9, -68, -104, 27, 7, 84, -73, 8, -58, 4, 35, 85, 76, 125, 31, 32, 42, 15, -65, 63, 89, 31, 44, 7, 24, -22, -117, -4, -84, -32, -2, 78, -53, -74, 108, -96, -26, 26, 27, 8, -62, 9, 61, -20, 32, -37, -39, 20, -5, -88, 38, -22, -47, -79, 30, -35, -12, 13, -35, -79, 34, 10, -117, 34, -14, 106, 12, 11, -24, 59, 28, 25, -21, 10, -73, 9, 9, -18, -31, -52, -70, -45, -5, -20, -22, 89, -21, 41, 39, 58, -16, -2, -128, 23, 9, 61, 22, 25, -43, -126, -27, -20, 14, -57, -32, 126, -5, 25, -44, 32, 51, 108, 62, -3, 12, -16, -39, -35, 37, 41, -64, 37, 58, -63, 100, -29, 66, 31, 14, -3, -12, 98, -58, 9, -5, -22, 35, -1, 2, 78, 46, 45, -33, 35, -62, 78, -54, -40, 17, 60, 99, -43, 42, 47, 24, -42, -80, -72, -81, 14, -48, -41, -40, 83, 36, 24, 55, 48, 124, -39, -75, -57, 96, 28, -107, -64, 88, 18, 4, -18, -47, 53, 35, -61, 60, 21, -23, -15, -112, -55, -39, -75, -17, -122, 78, 51, 15, 51, -126, 79, -100, 94, 35, -33, 42, 45, -26, 41, -20, -76, -2, 11, -82, -12, 60, -44, -9, -40, 3, -93, -116, -125, 1, -60, 34, -28, 43, -3, 18, 33, 29, -117, 87, 19, -88, -92, -92, -64, 37, -125, 68, -123, -113, 29, 39, 5, -8, 6, 100, 127, -7, 8, 62, -9, -10, -48, 96, 104, 121, 122, 21, 46, 116, 124, -77, 0, -124, 120, -10, -72, 0, -5, 100, -44, 124, 12, 52, 26, -46, -18, 126, 8, -30, -124, 4, 94, 12, 10, -39, 126, -73, 109, 22, -72, -82, 32, -33, -56, 37, -58, -50, -24, -6, 114, -62, 33, -124, 44, 27, 111, -2, 50, -12, 35, 12, 126, 12, 21, 94, 25, 22, -8, 51, 74, 46, -102, 24, -57, 0, -54, -51, -27, 116, 113, -25, 0, 9, -29, 16, 47, -69, 41, -63, -66, -36, 21, -74, -40, 41, 65, 62, 8, -86, 59, 35, 90, 24, -9, -31, -23, 25, 14, 50, -113, -48, 59, -9, -48, 7, -37, -124, -25, 15, 18, 77, -66, 35, -1, -15, -84, -29, 6, -9, 25, -26, -108, 53, 5, -13, 26, -124, -47, -39, 21, -5, 21, -64, -43, 74, 51, -34, 42, 60, -30, 23, -32, -6, -53, 58, 41, -92, 30, -67, -22, -16, -30, -10, -43, 96, 22, 64, 121, 18, -105, -61, 8, 69, -90, 80, 65, -118, 9, -16, 20, 54, 6, -68, 66, 31, 29, -101, 81, -79, 37, 68, 5, -123, 115, -9, -33, -94, 7, -42, 113, 39, -3, 110, -74, -13, 37, -75, -62, -13, 119, 2, 0, -120, -114, 62, -53, 28, -99, -58, -7, -63, -120, 85, -79, 4, -28, 61, -126, -65, 62, -94, -60, 20, 125, -112, -124, -56, 31, 127, -59, -66, -125, 62, -92, 25, 39, -128, -24, 24, -34, 50, 2, -30, 127, -91, -43, 65, 127, -8, -21, 12, 99, 7, 120, -126, -35, -5, 109, -117, -32, 10, 114, -11, -18, -83, 66, -76, 87, 35, -12, -90, 17, -25, 123, 14, 20, -5, -62, 23, -35, 125, 36, -5, 28, 64, -113, 5, -11, -27, -123, 14, -48, -13, 26, 19, -20, -4, -19, 33, 0, -81, 41, -47, -30, 16, -67, -52, 39, 68, -7, 85, 6, -10, -6, 17, 59, 18, -48, 113, 73, 85, 60, -3, 94, -43, 21, 9, 15, -74, -40, -52, 45, -104, -34, 3, 26, 20, -36, 17, -121, 21, 44, 66, -67, 5, 4, 63, 8, -23, -45, 12, 52, 4, 53, 8, -116, -64, -42, 68, -124, 39, -25, -22, -2, -17, -31, -77, 43, 32, -55, -127, -40, -6, 44, 66, 27, -21, 60, -110, 16, -71, 65, 103, -25, 50, 47, -49, 18, -35, 18, 21, -29, -19, 38, 4, -47, -4, -66, -21, -41, 43, -22, 50, -78, -62, 106, 71, -66, 31, -38, -17, 45, -65, 92, 0, -23, 13, 90, 48, -42, 103, -42, 18, 11, 50, -20, 19, -76, 74, 70, 43, 106, -119, 18, -40, 34, 24, 20, -17, -83, -64, -10, 27, -6, 62, 127, -88, -43, 49, 124, -23, -95, -17, 3, 75, 65, -45, -14, 88, 48, 30, -53, -35, 29, -87, 11, 66, -2, 109, -28, -29, -71, 96, 28, 24, 38, 23, 63, -55, 57, -42, -18, -55, -42, 23, -40, 16, 18, 33, 10, 29, -24, 36, -79, -81, -13, 38, 24, 10, 126, 46, -9, 7, 34, 59, -1, -52, -8, -28, -23, -95, 55, -128, -32, 17, 120, -89, 40, -62, -63, 17, -97, -77, -46, 41, -121, -5, 45, -70, -50, -92, 94, 71, -121, -15, 127, -77, 6, 125, -34, -48, -21, -128, 127, -39, -47, -109, 36, 127, 76, -55, -83, -30, -124, -128, 52, 23, -123, 127, -21, -91, -9, 28, 36, -67, -51, 27, 33, -38, 4, -74, -123, 10, -120, -25, -30, 54, -9, 123, -118, -14, -77, 30, 70, 8, -18, 106, -7, -55, -39, -75, -59, -47, 25, 48, -6, 7, 83, -47, 25, -127, -33, -114, 33, 30, -3, 49, 105, -41, 72, 75, -91, 0, -36, -64, -18, 16, -36, -99, 116, -85, 61, -70, -14, -126, -39, 122, -81, 91, -42, -108, -116, -41, 46, 119, -1, 15, -19, -47, -19, 17, -73, -20, 3, -66, 40, -122, 81, -5, -61, 23, 45, -79, -25, -79, 66, -2, 6, -36, -47, 95, -9, -34, -24, 3, 94, -11, 127, 75, 38, -6, -45, 12, 25, -28, -124, 111, 108, -78, -7, -87, -45, -3, 26, -66, 91, -87, 72, 64, -88, -78, -41, 29, -86, -59, -1, -55, -35, 13, 124, 15, 40, -43, 29, 59, -112, -38, -10, -77, -9, 18, 20, -47, 39, 43, -34, -47, -17, 34, 1, 70, 90, 47, -63, -15, -4, 28, 102, 48, -78, 24, 58, -12, -33, 8, 16, 17, -52, 18, -4, 81, -28, -28, 28, 56, -40, -43, 9, -52, 5, -54, -26, 15, 40, 6, 18, 29, -25, -35, -87, -21, 17, -25, -5, 6, 65, 34, 59, 33, -38, -17, 6, -18, 42, -42, -61, 45, -46, 63, -80, 16, -56, -118, 27, 44, -8, -74, -24, 7, -49, -47, -87, 16, -64, -22, -16, 127, 24, -39, -44, 42, -125, -75, -16, 52, -40, -39, 40, -48, -5, 16, 10, -59, 25, -13, 19, -23, -96, 43, 71, 51, -21, -24, -22, -10, 66, -91, 23, 74, -119, 93, -42, 5, 33, -95, 53, -121, -68, 35, -63, 33, -50, -48, -65, -8, 21, -3, -1, -87, 88, 82, -51, 33, -32, -26, -72, 15, 61, 2, 55, 122, -32, 48, 15, -71, -3, -41, -11, -22, 19, 6, -27, -85, -11, 1, 25, -52, 94, -104, 52, 42, -49, 49, 118, 79, 78, -46, 22, -7, 11, 63, 24, 5, 3, -2, -37, 118, -4, 7, -50, 1, -27, 50, 39, -33, -20, -116, -67, 4, -13, 99, 58, 16, 38, 47, 65, 86, 68, -62, 62, 8, 9, -81, 10, -26, -87, -18, 89, 42, 51, -19, -71, 126, -87, -64, -69, -80, -3, -13, -20, 33, -4, 89, -6, -16, -45, 93, 29, -7, 58, 78, 45, 23, 32, -67, 5, -25, 59, -47, 33, 60, -23, 41, 12, -13, 26, -18, 15, -64, -30, -122, -31, 66, 120, -86, 98, -120, 66, -22, 6, -37, 39, 90, -124, -75, -124, 16, -59, -42, 96, -4, -51, -34, -10, 36, 8, 127, -60, -80, 44, 46, -31, -3, -20, 116, 45, 50, 5, -6, 78, -25, -27, 40, 49, -24, 68, 1, 25, -42, 0, -93, 94, -37, 8, 31, 27, -24, 22, 8, 15, -33, 33, 18, 75, -113, 75, -14, -63, 28, -4, -63, 3, 45, -5, -6, -38, -66, -4, 58, -4, 125, 89, 56, -21, -119, 54, -26, -35, 43, -51, -51, 74, -9, -57, -30, -30, -126, -122, -42, 90, 5, -74, 37, 49, -3, -69, 33, 20, -2, 70, -84, 0, -51, -74, -26, 100, 10, -89, 3, -92, -119, 31, 50, 20, 24, 51, 23, 114, -120, -46, 70, -7, -11, -11, -16, 36, 3, -122, 20, 46, -52, -23, -35, 3, -53, -37, -35, -36, 28, 38, -69, -90, -4, -43, -58, 30, 13, -70, 5, -44, -17, -59, -26, -48, -74, 29, -127, -23, -34, -31, 29, 14, -50, -93, -20, -53, -35, -59, -42, 1, -44, 16, -126, 16, -125, 22, -22, -98, -8, 71, -57, -76, 13, 61, 125, 48, 52, -110, -90, 37, -75, -41, 0, -36, 32, 33, -2, 28, -70, 59, 93, -116, 13, 79, -18, 83, -43, -12, 0, 4, -74, -121, 0, -63, 42, 52, -65, 96, 7, 18, 11, -24, 100, 29, 23, 45, 24, 6, -33, 17, -75, -66, 59, -8, 42, -8, 8, -36, -35, 3, 22, -26, -19, -23, 17, -62, 44, -32, 120, -5, 26, -14, 11, -54, -40, 43, -47, -62, 8, 11, 18, -5, -44, 9, 15, 41, -13, -42, -58, 45, 32, 8, -28, 52, 29, 18, -14, 31, -18, 63, -19, -103, 60, 4, 75, -36, -86, -90, 68, 7, 17, -24, -44, -16, 11, -62, -31, 71, -78, 15, -51, 1, -46, 71, 124, -2, 9, -20, -9, 39, 5, 71, -12, 0, 54, 68, 41, 33, -19, 103, 1, -66, 20, 41, -56, -80, 7, -35, -85, 23, -37, 9, 62, 56, 63, -23, 25, 127, 26, 1, -76, 124, -23, 44, -55, 87, -58, -47, -18, -15, -8, -24, -50, 54, -68, -63, -12, 25, -14, -25, -49, -16, 109, -55, 9, -49, -2, -73, -33, -101, 28, -53, -10, 21, -42, 11, -53, -31, -125, 57, 24, 85, -11, -76, -39, -40, 34, -30, -34, -127, -4, 55, 96, -3, -44, -32, -24, 115, -9, -92, -63, 6, 71, -23, -74, -16, -86, 84, -127, -116, -109, 108, 18, 91, -96, -76, 65, -55, -5, 29, -26, 23, 40, 9, -127, 40, -103, 69, -127, -10, -16, 99, -34, 53, -5, -108, -40, -81, -42, 63, 61, 23, 123, -72, 7, 55, 114, 24, 73, -15, 17, 37, -43, 48, -105, 77, -12, 33, 29, -36, -1, 41, -35, -81, 81, -41, -80, -29, -43, 115, 19, 50, 40, 32, 32, -82, 87, 28, -5, -22, -77, 56, -12, 28, 26, 5, 49, 37, 25, -29, -35, -13, -82, -57, -74, 36, 104, 62, -78, -82, 46, -3, -57, -18, -57, -9, 61, 14, -12, -41, -84, 125, 124, 24, -80, -44, -21, 21, 82, -48, 123, -72, -23, -93, 38, 10, -103, 55, -126, 31, 29, -48, 127, 26, -51, -74, -54, 4, 35, -125, -40, -30, 37, 58, 31, 11, 10, 2, -24, -75, -18, 29, 35, 10, 37, -3, -106, -56, -70, -11, 14, -59, -125, 27, -49, -18, 12, -59, -63, -74, -1, -66, -13, -121, -73, -4, 5, -121, -70, 6, -128, -23, -20, -25, -65, 14, -23, 112, 67, 109, 41, -15, 71, 3, -9, -21, 121, -119, 63, 93, 34, 35, 65, 126, -39, -46, -118, 105, -103, -25, -29, 76, 51, -77, 122, 95, 65, 77, 67, 11, -4, -119, -52, -39, 48, 6, -28, 68, -42, 113, 9, 23, -18, -7, -14, 23, -12, -9, 5, 6, -93, 43, -32, 7, 20, -65, 55, 18, -128, 53, -7, -5, 21, -2, 13, 43, -5, 13, -126, 92, -60, 32, -84, -116, 62, 70, 115, -21, -38, -116, 0, 39, -10, -10, -29, -101, -40, -9, -29, 43, -16, -1, -4, 29, -42, -52, 13, 44, -126, -91, 39, 64, -52, -60, -52, 66, 15, -7, -35, -105, -55, 63, -24, -76, 89, -18, 38, -73, 57, 6, 67, -80, 64, -48, -42, 19, -74, -128, 36, 4, 20, -125, 15, 51, 13, -19, -29, -78, -60, 56, -9, 63, -23, -37, -57, -12, 7, 33, -115, -30, 62, -32, 93, -19, 73, 20, 15, -2, -48, -19, -128, -54, 126, -103, -39, -27, -65, -24, 63, 7, -40, 27, -26, 71, -110, 116, 36, 20, 7, 2, 40, 45, -41, -62, -78, 28, -54, -59, -1, -19, -75, 50, 32, 107, 20, -5, -104, 105, -39, -38, 72, 70, -121, -4, 99, -23, 16, -47, 14, 89, 34, -65, -16, -46, 18, 52, -65, -51, 11, -108, -37, -57, -25, 27, 19, -36, -100, 97, -112, -24, -118, -31, -39, 122, -61, -52, 95, 42, -53, -27, -71, -79, 3, -62, -126, -115, -30, 65, -48, -98, -110, 77, 13, 55, 26, -4, 2, -73, -36, 50, 20, -86, -70, 22, -35, 118, -119, 7, 62, -124, -7, -107, -95, -119, -60, -47, -94, 14, 105, -70, 104, 16, 75, 114, -128, -95, -113, 17, 7, -127, 24, 28, -53, -76, -57, -118, -19, -59, -14, -64, -22, -27, 0, -10, -103, 13, -116, -59, -1, 66, -123, -107, -5, -48, 4, -61, -86, -50, 5, 51, -81, -108, -59, 19, 54, -103, -17, -35, -127, -81, 59, -122, 0, 36, -24, 117, -29, 31, -9, 13, 15, 80, 81, 36, 123, 90, 77, 21, -49, 8, -12, -34, 65, -71, 35, -3, 15, -54, -58, -41, -45, 10, 54, 102, 77, 23, 28, -39, -43, -47, -49, -87, -35, 24, -2, 21, 33, -22, 26, 19, 80, -26, -32, -101, 34, 31, -6, -57, 20, 73, 78, -107, 36, -49, 2, 23, -17, 109, 5, 15, -34, 41, -23, 61, -5, -56, -102, 88, -16, 49, -52, -57, 59, 90, -8, -125, 30, 72, 75, -46, -75, -126, 97, -28, 118, -62, -47, 113, -29, -48, -29, 101, 23, -7, -42, 18, 36, 0, 11, -29, 31, -53, -5, -18, -80, 46, -18, 29, 5, 17, 0, -19, 65, -6, -1, 21, 11, -35, -40, 26, -68, -29, -43, -4, -24, 29, 85, -25, -77, -10, -27, 3, -34, 56, 74, -118, 13, 14, 101, -48, 22, -41, 59, 22, 21, -20, -127, -73, -7, 70, -48, 13, -95, 31, -14, -63, 22, -71, -93, -74, -38, -120, -28, -33, -45, -14, -48, -18, 81, 24, -60, -29, 0, -16, -7, 47, -84, -72, 58, 14, -37, 71, 20, 41, -42, -6, -105, -8, -2, -25, -16, 23, -50, 16, 33, 52, 22, 42, -4, -5, 54, 15, -22, -105, -18, -8, -25, -112, 26, -32, -46, -70, 86, -41, 105, 46, -30, -38, 1, -24, -20, -24, 3, -13, -44, 19, -79, 23, -60, 21, -54, -120, -21, -3, 60, 4, -29, -2, 17, -2, -10, -20, 12, -71, -108, 47, 4, 26, 20, -11, -28, 0, -27, 2, -50, 7, 9, -42, -59, -52, 65, 9, 77, -67, -21, 5, 44, -30, -33, -87, 8, 109, 120, -80, -27, -74, 4, 40, 22, -17, 91, 13, -31, 80, 0, 34, 24, -29, -74, -120, 71, -96, 85, 125, 117, 59, -53, -75, -42, -21, -19, 9, 29, 47, -124, 97, -7, 54, 29, 9, 67, 56, 13, -16, 33, -10, -11, 100, 26, -65, -10, 2, 80, -43, -1, -98, -37, -1, 63, 29, 41, -92, -5, 48, 36, -2, 48, 2, -23, 7, -2, 19, -121, 95, -85, -2, -126, 47, 44, 4, -49, 53, 27, -80, 48, -51, 127, 13, 84, -39, 2, 40, 29, 45, 53, 14, -21, 27, -38, -79, -63, -28, -20, 7, -117, 62, 1, 58, -68, -6, 22, -5, 9, -16, -23, 55, -43, 25, -31, -85, 39, -5, 65, 1, 16, 11, 2, -27, 31, 65, 88, -15, 16, -127, 58, 45, -45, -20, 45, -22, -61, 62, -62, -74, -107, -62, 96, 37, 57, 23, -83, 3, 11, -69, 31, -13, -67, 14, -93, 35, 61, -62, -31, -61, 9, 25, -53, 127, 117, -4, 67, 59, -65, -38, -11, 46, -75, -20, -48, -9, 55, 18, -39, 30, -55, 114, -45, 47, 15, -32, -27, -84, 12, -42, 85, 0, 4, -56, -48, -43, -24, 24, 26, -85, -10, -90, 28, -9, 77, -111, -51, -79, -41, 26, 16, 46, -65, -69, -106, 121, 68, 19, 16, -62, -25, -62, 115, 116, 20, -94, 61, 45, 78, 53, 55, 28, -42, 20, 7, -109, -34, 55, -124, -39, 125, 40, 25, -28, 82, -60, -101, -13, 25, -71, -34, 27, 71, 16, -7, -33, -37, -1, 12, -1, 9, -52, -12, 25, 25, -34, -41, -37, 32, -18, -31, -124, -85, -101, 0, -37, -122, 49, -21, 85, -68, 5, 36, -20, -13, -12, 43, -26, -57, 30, -12, -46, -90, -83, -120, -3, -26, -59, 16, 47, -83, 32, -44, -14, 35, -94, 69, -61, 108, -20, -17, 54, 36, -49, 53, -50, 48, -4, 9, 38, -70, 56, -23, 80, -48, 56, 37, -55, 20, 41, -9, -97, -55, 81, 18, -42, -6, -110, 97, -86, -91, 21, 9, -14, -10, -14, 92, -39, 45, -37, 62, -43, 34, 114, -14, 24, -25, 126, -92, -8, 6, 0, -59, 34, 26, 18, -3, -53, 24, -36, -125, -75, -21, -36, -37, 75, -124, -50, -48, -117, -29, 38, -10, 117, -84, 82, -126, -4, -123, 9, 27, -91, -81, -21, -126, 50, -29, 47, 51, 44, 51, -17, 125, -39, -56, 49, 44, 127, -14, 101, -46, -3, -21, -52, -2, 4, -35, 65, 25, 33, -47, 89, -36, 34, 72, 70, 43, -72, -38, 90, 54, 121, 13, 63, -18, 45, -41, 95, 23, -4, 82, 14, 37, -10, 86, 47, 46, -13, 15, -35, -123, -58, -7, 102, -79, 40, 13, -6, -42, 75, -127, -109, 20, 61, 20, -74, -113, -28, 96, -97, -67, -41, -28, 118, 15, -10, 41, 26, 17, -84, 34, 125, 7, 61, -126, -104, -124, 125, -109, -1, 50, -44, 40, 62, -118, 86, -50, -45, -58, 9, -126, -94, 26, -45, -28, -77, 11, -54, -38, 70, -74, -49, 39, -127, -21, -98, 39, 113, -109, -123, -69, 47, -73, -111, -59, 1, 3, -43, 25, 115, 102, 5, -83, -72, 122, 84, -126, -42, -51, -13, 17, 19, -106, -56, 38, -40, -75, -20, 56, -7, 32, 58, 57, 39, -118, -23, -123, -82, 66, -40, -115, -84, 29, 120, 28, 6, 12, -66, 15, 58, -77, -26, -71, 80, 120, 38, -13, 92, -113, 23, 61, -122, -39, -5, -114, -30, -11, 0, 43, 19, -122, 111, 73, 0, -51, 49, -36, -25, 101, -41, -45, -33, -91, -52, 52, 65, 37, -78, 93, 78, -73, 9, -9, 9, -79, -35, 25, 16, -29, -36, 9, -16, -40, 33, 118, 7, 36, -19, 43, -46, -123, -49, 18, -95, 101, 29, -35, -17, -7, 60, 20, -75, -25, -35, -17, -117, -106, -30, -98, -40, 68, 35, -15, 14, -101, -36, -83, 2, 20, 53, 126, 8, 74, 63, -57, -20, -13, 33, -9, -90, -75, -2, -105, 86, 37, -48, 14, -40, -20, 5, -127, -12, -30, -53, -14, 39, 93, -24, 0, -20, 66, 42, 7, -39, 68, 80, 25, 81, 4, 28, -22, -41, 56, 51, -39, 2, 28, 45, -3, 62, 92, 19, 73, 43, 45, 61, -53, 102, -35, -34, 47, -85, -29, -12, 46, -31, -89, 47, -25, 120, -8, 30, 63, -27, 56, -67, -10, 71, 30, -21, 88, 86, -72, 23, 16, -46, 126, 116, 45, -53, 15, 90, 20, 10, -47, -35, 61, 28, -68, 121, 108, -24, -8, -97, -13, -124, -27, -21, -104, -22, -61, -118, -124, -41, -3, -86, -31, -15, 71, -1, -42, -2, 45, 40, -33, -115, -38, -33, -36, -4, 34, 74, 98, -8, 107, -49, 11, 121, -29, -49, -15, -37, 43, -80, -31, 19, 15, 18, -71, 78, -108, -87, 34, -4, -30, -98, 124, -115, -18, -116, 35, 10, -125 }; static const rnn_weight noise_gru_bias[144] = { 51, 32, 88, 60, -64, 92, 5, -36, -49, 95, 102, -20, -1, 14, 8, 21, -36, -68, 62, 46, 10, -60, -103, -16, -30, -42, -43, 35, -4, 23, 97, 46, -29, -16, 71, 52, -20, -23, 91, 16, 69, -13, -23, 73, -17, 13, 30, 23, 1, -27, 53, -24, -71, 45, 42, -49, 28, -16, -20, 61, 40, -104, 54, -5, 31, 10, -51, -37, -6, -85, 9, 51, 16, 2, -26, 56, -39, -5, -27, -13, -49, 30, 4, -64, -41, 45, -23, 14, -19, -10, -55, -61, -35, 46, -31, -12, -93, -28, 11, -6, -46, -12, 1, 15, -37, -107, -50, 3, 54, -26, -86, 14, 66, -54, -38, -70, -1, 69, 46, -12, -128, -55, 0, 17, 48, -64, -24, 9, -67, -107, -101, -43, -4, 80, -52, -90, -23, -64, 31, 86, -50, 2, -38, 7 }; const GRULayer noise_gru = { noise_gru_bias, noise_gru_weights, noise_gru_recurrent_weights, 90, 48, ACTIVATION_RELU }; static const rnn_weight denoise_gru_weights[32832] = { -53, 26, -20, 28, -57, -30, -79, 58, -68, 103, 70, 4, 92, 14, -71, -3, 26, 54, -9, -86, -8, 49, -60, 121, -98, -4, 103, -38, -89, 28, 85, 30, 33, -45, 42, 53, -37, -116, 72, -44, 24, 1, 17, -26, -7, 9, 5, -71, -97, -86, -118, -59, -27, -51, 26, 14, -89, -63, 76, -16, -5, 11, 86, 121, 67, 5, -20, -44, -43, -7, 18, 25, -41, 14, 11, 24, -5, -58, 15, 10, 89, 41, -100, 42, 41, 89, -89, 30, -16, -35, -29, -119, -45, -1, -104, 24, 9, 46, 21, 122, -5, -29, -64, 19, 72, -60, 79, -52, -15, -37, 15, 38, -13, -9, 28, 56, -12, 121, 23, -104, -81, -7, -94, 17, 124, 49, 108, -41, 118, -33, -106, 42, -27, 50, 57, -24, 26, -107, 15, -103, -23, -13, -7, 23, -40, -113, 14, -36, -59, 25, 44, 54, 37, 40, -10, 59, 29, -16, -49, 18, 4, -27, 15, 15, 37, 29, 50, -61, 28, -16, -96, 48, -102, -97, 12, -31, 43, 54, 9, -58, -42, 18, 10, 115, -16, -29, -14, -66, -38, 69, -65, 50, 7, 6, 11, 8, -53, -1, 25, 32, 77, -5, -42, 58, -43, -63, -86, -36, 18, 21, -49, 38, 72, 22, -25, 22, -16, -95, 77, 16, 55, -8, 31, -39, -117, 3, -38, -24, 27, 24, 25, -29, 21, -44, -13, -61, 6, 5, 19, -20, -11, 89, 40, -113, -86, 65, -84, -21, 20, 10, 15, 28, -56, -14, -17, 50, 90, -15, 29, -27, -54, -40, -32, -58, -59, 4, -17, 58, 3, -85, -9, 64, -38, -5, 104, -21, -30, -4, 79, -44, -55, 8, 44, 10, -58, 31, 7, 25, -49, -2, -30, -29, -118, 49, 68, 17, -34, 0, 46, -109, 28, -14, -47, 88, 13, -55, 24, 62, 44, -16, -54, -67, 40, 69, 3, -46, 1, -43, 127, -30, -78, 25, 106, 16, -30, 104, -12, 20, -58, 35, -71, -79, 18, 7, -12, -28, -49, 17, 98, -64, 25, 84, 32, 33, -36, 13, -31, 29, -9, -97, -78, 4, 16, 26, 86, 28, -29, 5, 23, -5, -112, 83, -27, 9, -47, 43, 12, -7, -11, 27, 92, -9, -14, -9, 69, 68, 32, -25, 20, -70, 40, -20, -32, 36, -94, 19, 5, 101, 11, -47, 44, 65, -40, -56, -21, -43, 72, 7, 36, 14, 1, -27, -18, -10, 18, 14, 58, -4, 12, 3, -60, -6, 68, -9, -42, 10, 40, -17, -17, 13, -16, 86, -62, -20, -22, 24, 75, 61, -5, -32, -75, 0, -41, -65, -19, -37, 21, -51, -54, -79, 3, 34, 10, 75, 91, -59, 25, 21, -5, 26, -71, 9, 27, 28, 49, -17, -12, -44, -28, -51, -8, -18, -4, -12, -45, -50, 32, 26, 65, -54, 29, 16, -80, 16, 38, -94, -27, 33, 3, 51, 17, 26, -10, -35, 18, 57, -6, 7, -9, -35, 22, 10, -9, 5, -18, 7, -3, 15, -82, -12, -18, 51, 6, 21, -29, 58, 14, -16, 6, 29, -35, 59, 10, 32, 54, -11, 25, -27, -13, 33, -19, 11, -83, 61, 37, 42, 20, 21, 13, 57, 40, -1, 8, 6, -8, 22, 57, -18, -1, -7, 29, -40, -17, 50, 8, -4, -4, 32, 26, 35, -60, -35, -36, -17, -66, -63, 2, -124, 8, 26, 17, 31, -84, -12, 15, 49, 6, 39, 33, 28, 20, -48, 42, 8, -5, -6, 26, -33, 12, 42, 91, 25, 5, -91, -27, 23, 6, -63, -119, -99, -38, -32, -97, -31, 15, -28, -18, -59, -24, -7, -2, -7, -119, -34, -121, -121, 26, 74, -85, -7, -22, -26, -43, 2, -32, 34, 51, -82, -92, 14, 80, 19, -2, -39, -81, -22, 48, -39, -21, -46, -49, -19, -68, -111, 80, -45, -49, -86, 23, -2, -55, -9, 2, 1, -55, -32, -32, 18, -104, 88, 1, 25, -48, -100, 9, -89, 9, -8, 70, 43, -122, 90, 45, -60, -48, -22, -47, -100, 48, 22, 6, 26, -16, 18, -37, 5, -102, -6, 3, -55, -87, -117, -33, -106, -63, -21, 10, 74, 16, -19, -14, -60, 15, -38, 90, -58, -14, -2, -58, -45, 50, 30, -72, -26, 94, -108, -79, -4, 53, 63, -80, 45, 20, 35, 73, -9, -5, -83, 46, -6, -68, 0, 0, -127, -17, -69, 25, -91, -75, 3, -62, -31, -47, 16, 35, -39, 20, -22, -63, -17, -3, -72, 48, 15, 74, -33, -86, -63, -67, -44, -15, -32, -42, -34, 37, 9, 18, -41, 19, -8, 27, 41, -81, -120, -113, 7, 83, -16, 17, -17, 22, -28, -73, -54, 1, 11, 3, 33, 33, 16, 6, -20, -64, 11, 2, -14, -69, -36, -42, -13, -115, -16, -27, 9, 26, 7, -58, 6, -55, 52, 23, -20, 74, -61, -13, -31, -63, 68, -7, -20, 64, 0, 17, -10, 24, 15, 47, 16, -23, -1, 9, -4, -69, 14, -6, -7, 3, 9, -20, -29, -41, 64, 23, -21, -1, 41, 48, -46, 11, -22, -2, -7, -54, -86, -44, -44, 8, 31, -47, -25, 33, 95, -35, -125, -8, -3, 52, 19, 9, -27, 62, 32, -11, -7, -60, -13, 110, -28, 118, -11, 45, 5, -2, 22, 22, -61, 6, -72, -42, -12, 0, -17, 13, -91, -29, -50, -54, -126, -60, 119, 25, 24, 51, -32, -15, 77, 14, 34, -33, -53, -53, 56, -72, -27, 57, -11, -61, 32, 3, -18, -54, 19, 70, 34, 17, -68, -65, -2, 48, 18, 10, -72, 88, -15, -63, -38, 2, -20, -4, 42, -88, 96, 60, 79, 6, 77, 127, 9, 22, 21, -26, -55, -33, -69, 39, -62, 33, 5, -29, -40, 29, -51, 7, 18, 37, -14, 88, -25, 52, -6, 17, -104, -10, -68, -42, -116, 83, 81, -74, -9, -127, -55, -79, 26, -59, 37, -27, 20, 36, -46, -67, 51, 10, -19, 101, -28, 53, -62, 10, -6, -15, -13, 5, 9, -61, -123, -33, 30, -39, -48, 11, -126, 59, 21, -3, -121, 27, 46, 13, -59, -3, -122, 37, -120, 9, -43, -33, 24, -33, -42, 9, -34, 68, 16, 6, -1, -49, -105, -9, -13, 41, -46, 78, 7, -55, -38, 82, -26, 9, 24, 43, -18, -91, -56, -34, 30, 28, 16, 4, -2, -120, -42, -125, -16, 45, -29, 42, -25, -1, -43, -12, 4, 39, 16, -17, -12, 10, -37, -5, 8, 16, -12, -14, -18, 19, 0, -30, -24, -101, 2, -30, -6, -6, 3, -40, 0, 13, 52, -31, 27, -56, 63, 35, 32, -64, 29, 34, -41, 47, -24, 13, 52, -26, 29, -2, -30, 25, -44, 36, 93, -54, 3, -3, -17, 15, 5, 72, -61, 48, -5, 63, -34, -26, -48, 2, -28, 69, -10, 42, 50, -89, -123, 12, -8, -10, 50, -8, -30, -50, -40, 13, -26, -41, -8, -23, -9, 61, -117, 29, 50, -20, 20, 31, 45, -82, 59, 12, -96, 8, 8, -49, 28, -33, 14, -31, 9, -44, -60, 49, 98, -4, -19, 16, 3, 75, 31, -55, -75, 114, -12, -113, 3, -116, 80, -12, 19, 9, 74, -28, -109, 9, 21, 27, -15, 12, -37, 23, 81, 103, -19, -40, -113, -42, -121, -104, 36, -29, -70, -38, -75, 73, 16, 0, 30, -10, -82, -35, 82, 112, -19, 43, 41, -65, 29, -65, 7, -82, -14, -36, -32, -19, 76, 9, 71, -61, 79, 71, 8, -82, -31, 35, -33, 41, -46, 17, 23, 28, 33, 86, -21, 66, 65, 68, -55, 37, -50, -92, -17, -8, -39, -90, -47, 81, -7, 57, -71, -2, 0, -18, -17, -18, -117, -47, 60, -3, 19, -115, -17, -37, -64, -7, -37, -36, -100, 2, 122, -68, 7, -29, -46, -4, -67, 63, 44, -9, 40, -94, -123, -6, -126, 2, -84, 31, -46, -23, 51, -37, 31, -27, -64, -60, -16, -125, -38, 29, -80, 5, 54, 10, 96, 46, -1, -34, 6, -37, -69, 17, -32, 31, 49, -31, -42, -120, -54, -6, -7, 43, -50, -15, 66, -124, 4, 21, 10, -8, 31, 11, -35, -8, 81, 26, 9, -14, -44, -87, -66, 9, -82, -45, -39, -3, -17, -21, 61, 17, -4, -4, 15, 40, -23, 1, -44, -30, -24, -51, -56, -21, 19, -45, -24, -22, 37, -50, -3, -6, -17, -19, -54, -65, -51, -17, 15, 40, 19, -26, -61, -26, 0, 8, -17, -26, 8, -5, 3, 22, -16, 7, -54, -25, -15, 18, 47, -31, 6, -34, -22, -25, -16, 31, -8, 49, -38, -33, 30, -39, 21, 4, -26, -36, -48, -28, 24, 0, 32, 38, -21, 97, -10, 45, 10, -31, -32, -39, -57, -52, 6, 11, 5, 7, -13, 25, 0, 54, 14, -32, -4, 59, 17, -30, -10, 23, 21, 29, 8, -48, 39, 56, 18, -18, 10, 26, -16, 90, 8, 19, -55, -36, 49, -28, 39, -28, -127, 123, 11, 8, 83, 4, 26, -67, 21, 31, -43, -33, 25, -32, 92, 44, 9, 19, 108, 39, 53, -15, 94, 13, 28, 36, 38, 28, -6, -13, 14, -99, -17, -17, 2, -15, -3, 10, 19, 56, -15, 124, 21, 39, -23, 3, 61, 59, -29, 48, -2, -1, 51, -11, 41, -42, 76, -108, -50, -15, -43, 37, -38, 61, -47, -42, -62, 3, -6, -66, 18, -48, -25, 19, 66, 1, 78, -26, -127, 26, 0, 10, 21, -25, -12, 3, 11, 126, -126, 1, 3, 17, 123, -9, -29, 96, 125, -2, 32, 21, 24, 52, 8, 42, -53, 42, -12, -18, 23, -11, -125, 43, 47, 40, -68, 3, -5, -14, -43, -49, 23, -34, 35, 35, -33, 58, -126, 26, 42, 34, 8, -39, 20, 72, -2, -61, -26, 32, 1, 31, 36, -107, 19, -6, -128, -41, -65, 15, 21, 36, 6, 74, 27, 29, 6, -71, 46, -30, 37, 33, 43, 105, 31, -26, -59, -19, 20, 37, 30, -71, -9, 92, 1, -21, -11, 50, 81, 22, 62, 61, 23, -64, 77, -22, -31, -2, 1, 17, 9, -7, 31, 20, 17, -12, 36, 42, 0, 71, 7, -52, -101, 1, 2, 7, 45, 38, -103, -24, 32, 4, 61, 60, 36, -33, 40, 60, 79, 15, -85, 74, -71, 26, -11, 46, 8, 40, 53, 26, 62, 19, -5, 39, 68, -57, -59, 67, 18, -20, -1, -45, 9, 41, -33, -5, 46, 12, 14, 3, -10, -12, 42, -18, 118, 65, -32, -2, -12, 112, -36, 18, -43, 38, 6, -41, -22, 20, -31, -5, -25, -31, -54, -35, -10, -5, -8, -44, -124, -122, 37, -113, -24, -29, -18, -7, -69, 63, 3, 33, 50, -47, 114, 6, -15, 37, -38, 21, 23, -37, -44, -24, 48, 104, 47, -8, -80, 37, -28, 76, 4, 3, 36, 19, 16, -45, -59, -17, 16, 5, -18, -36, -26, -125, -24, 12, 29, -34, -6, -76, 31, 50, -33, -38, 12, -14, -63, 24, 29, 116, 5, 26, 23, 31, -8, 91, 17, 0, 2, 125, -90, 33, 8, -67, -99, -41, -64, -73, -15, -23, 7, 7, 10, -97, -127, -14, -77, -127, -40, -45, -23, -12, 14, -3, -7, 12, 0, -2, -80, -38, 22, -100, -60, -121, -11, -1, 119, -2, 40, -20, -125, 63, 10, -32, -110, -15, -103, -7, -7, 87, -32, -7, -35, -33, -33, -54, -1, -12, -43, 15, 6, 12, 48, -1, -14, -100, -20, 95, 31, 41, -50, 18, -36, -9, 16, -10, -6, -28, -17, -55, -79, -9, -3, 46, 29, -31, 44, -84, -23, -37, -40, 18, -8, 21, -33, 30, -44, -14, -13, -7, -4, -116, -19, 45, -60, 2, 26, 13, -4, -4, -6, -15, 20, -122, 26, -38, -46, 4, -101, -124, -12, 0, 46, 5, -20, -10, 35, -49, -46, -42, 19, 6, -21, -127, 108, -4, -7, -20, -25, 15, 67, -38, 12, 27, -28, 21, -19, -11, 18, 5, -3, -23, 17, 32, -10, -25, 19, -90, 27, -6, 9, -24, 19, -123, -17, 50, -85, -16, -98, -8, -9, 27, 1, -24, -37, -27, -28, 5, -26, 26, -12, 1, 14, -16, -2, -12, 31, 0, -36, -9, 19, 13, -1, 9, 9, -16, -51, -15, -34, -61, -3, -15, -30, -17, 2, -8, 30, -39, -27, 23, 46, 17, -9, -29, 56, -91, -91, -58, 23, -15, 19, -6, -30, -10, -31, -34, -14, -41, -30, -78, 12, 16, 51, -7, -38, 0, -19, -16, -54, 4, 3, -1, -16, 17, 3, 7, -20, -14, -38, 30, -23, 27, 12, 84, 60, 19, -16, -55, -15, 5, 32, 33, 1, -15, -3, -35, -121, 52, 75, 31, 30, 0, -20, -26, 32, 38, -14, 33, 81, -17, -4, -16, -84, -37, -29, 7, -14, 5, -30, -52, 27, 29, -119, -48, 0, -101, -28, -11, -69, -56, -34, 48, 85, 22, 35, -18, -90, 53, 10, 8, 13, -60, 52, -54, 10, 99, -95, 32, -60, 0, 124, -19, -1, 4, 65, -48, -2, -18, -28, 0, -58, 43, -63, 40, -73, 0, 32, -26, -36, -25, 16, -37, 7, -70, -50, 41, 0, -18, 10, 21, -10, 24, 35, -35, -38, 48, 16, 26, -33, 94, 3, 27, -22, -17, 69, 19, 21, -57, 78, -5, 8, 17, 5, 3, -39, -4, 19, -26, 14, 7, -1, 2, -31, -22, -8, -2, -9, -48, -51, 71, 10, 20, 21, -1, 11, 26, 13, 1, -20, 60, 18, -38, -9, -30, 30, -20, -30, 45, -39, 21, -6, 18, -16, 5, 42, -41, 58, 41, 9, 7, 38, 11, 41, 21, 35, -53, -49, -43, -3, -30, 38, 1, -5, -34, -52, -10, 22, -11, -20, 22, 13, -54, 20, -19, 19, -24, -38, 24, -6, 67, 92, -6, 46, 60, -25, 5, -68, 0, -36, 6, 14, -33, -40, -33, 38, -26, 1, 20, -23, -54, -13, 4, 25, -30, -7, -51, 14, -37, -53, -11, -7, 5, 10, 7, 0, -29, 8, -27, 1, -14, -37, 60, -7, -41, -29, -31, -13, 22, -13, 52, 8, 65, 48, -10, -74, 5, -4, 31, 30, -25, -9, -13, 24, -12, -22, 64, 13, 18, 28, -22, 46, -8, 39, -48, -14, -17, -6, -40, 16, -5, -29, -2, -46, -47, -25, -19, 52, -1, -22, 21, -66, -5, 29, -3, -28, 17, 21, 18, 11, 67, -26, 31, -8, -1, 36, 46, -9, 14, 39, 18, 9, 23, 38, 56, -25, 46, 70, -22, -11, -19, 7, -11, 49, -4, -25, -55, -43, -28, 66, 79, 16, 2, 17, -19, 20, -20, -2, -26, 41, 27, 19, -11, 67, 33, -49, 69, 16, 0, -5, 3, 47, -2, -48, 56, -77, -22, -3, 21, 84, 67, -17, 10, 21, 19, 23, -4, 7, -45, 40, -21, -64, 19, -23, -15, 68, -9, 7, -3, 38, 14, 12, -73, -6, -28, 36, 15, 20, 15, 28, 40, 42, 100, 47, 37, -43, -31, -80, 39, 12, 20, -14, 19, 17, -117, 24, -36, 16, 34, 31, -22, -48, 4, 4, 27, 33, 39, 38, -12, 34, 13, 37, -9, 40, -23, -11, 75, -6, -14, -30, -61, 20, 20, -38, -16, -6, 34, -14, -2, 4, 11, 9, -1, -17, -24, -112, 59, 20, 25, -17, -10, 9, -18, 11, -7, 16, -3, 17, 2, 66, 38, 12, 9, 3, -17, -10, 35, 22, -38, -23, 40, 19, -51, -32, 18, 17, 2, 21, 10, 16, -16, 0, 13, 6, -8, 28, 47, -6, -25, 43, 17, -4, -13, -94, -1, 18, 24, -1, 14, 15, 3, 1, 41, 36, 1, -16, -10, -50, 27, -50, 18, 16, -6, 6, -14, 38, -49, 73, 9, 57, 31, -41, 58, -45, -11, 20, 15, -61, 27, 4, -3, 8, 56, -101, 29, 21, 27, 8, 73, 31, -16, -87, -17, -87, 4, -22, -45, 59, 3, 7, 12, 13, 0, 17, 23, 94, -50, 3, -29, 55, -124, -10, -32, 41, -38, 25, 2, 18, 34, 31, 34, 15, -82, 61, -13, 32, -17, 20, -5, -19, 24, 14, 53, 38, 72, 41, -47, 24, 43, 7, 82, -7, -7, 38, -1, -28, 13, -7, 8, -7, 16, -26, 9, 12, 17, -48, -23, 33, 64, -8, 0, 71, -37, 67, -85, 20, 19, 25, 18, 15, -6, -34, 97, 17, 8, 30, 11, -23, -12, 41, 6, 62, 21, 4, 18, -31, 71, -70, 9, 2, -32, 21, -11, 44, 47, -11, -34, -5, 3, -5, 11, 33, 59, 6, 6, 12, 49, 6, 43, 33, 3, -26, 34, 53, -11, -29, -1, -10, 39, 82, 116, -25, -38, 28, -18, 26, -59, -47, 21, 6, -31, 44, -81, -72, 38, -104, 39, 98, 4, -68, -4, -36, -49, -19, -18, -52, 37, 5, -56, -44, 21, -5, 69, 42, 10, -26, -45, 28, -6, -22, -37, 39, 44, 5, -29, 54, -1, 90, -81, 118, -54, 20, 28, 7, 77, 0, 34, -2, -25, 60, -64, 8, -49, -31, -46, -26, -18, 12, 4, 22, 5, 42, -6, 6, 59, 34, 11, 10, -62, 14, 4, -11, -15, -47, -1, -15, -34, 38, 26, -33, -18, -12, 2, 6, 9, -15, 43, 13, 35, 25, -53, 9, 10, 47, -27, 85, -25, 12, -12, 5, 12, -125, 12, -89, -4, 55, 20, 17, 48, 22, -45, -7, 5, 65, 22, 13, 2, 22, 38, 12, 35, -17, 32, -40, -49, -10, -100, -97, 13, 17, -29, -24, 32, -77, -4, -81, -83, 49, -99, 41, -34, -58, -10, -69, -2, 33, -120, -81, -36, -31, -78, -27, 83, 15, -49, -51, -19, 83, 29, -63, 25, -15, -84, 21, 30, -88, 45, -11, -44, -73, -86, 22, 11, -126, 66, -41, 16, -5, -59, 37, 62, -29, -5, -128, 116, 102, -44, -30, -43, -73, -121, 86, -39, -14, -127, -7, 63, -24, 12, -47, 4, 24, -58, 31, -33, -34, -98, 90, 119, -56, 4, -16, -42, -35, 48, -24, -85, 12, 73, -48, 52, -22, -109, -26, -29, 31, 105, -5, -39, -60, -81, 24, -114, 46, -51, 56, -5, -96, 58, 97, -26, 0, 84, 51, -85, -39, -20, -10, -11, -6, -55, -47, -65, -50, -63, 77, -54, 3, 41, -127, 44, -63, 61, 17, -44, 29, -22, 1, 2, -83, 36, -43, -7, -30, -19, -37, 28, 7, -63, -73, 81, 51, -37, -13, 18, -123, -7, 33, 75, 43, 85, 40, -56, 10, 91, -45, 7, -60, 14, -26, -13, -118, -33, 38, -27, 63, 7, 36, -30, -52, -115, 113, -42, 39, 3, 3, 26, 53, -109, -103, -23, 1, 121, 36, 60, -62, -124, 39, -60, -16, -22, -12, -86, -13, 27, -9, -3, -22, 60, 9, -16, 100, 51, -33, -34, -57, -9, -29, -1, -29, -42, 2, -19, -11, -1, -8, 93, -46, -43, -42, 9, 9, 15, -23, -11, 14, -20, -73, -59, 17, 7, -26, -57, -6, 54, -43, -70, 82, -12, -1, -99, 25, 4, -24, 5, 34, 39, 17, -89, 10, 32, -93, 18, -9, -20, 8, 41, -37, -25, -19, 8, 28, -72, 60, 66, -80, -52, -4, -19, 14, -25, -16, -49, 15, -91, 84, 34, 47, -123, 44, 18, 20, -77, 0, 9, -66, 20, -28, 13, -99, 24, 48, -1, 32, -42, 33, 47, 20, 85, 71, 57, -27, -53, -73, 60, 119, -81, -51, 4, 38, 38, -1, 5, 25, 38, 36, 92, 125, 122, 29, -89, -109, 65, 53, -17, 39, 121, -19, 71, -3, -97, 29, 55, 102, 8, -53, 101, 40, 78, -56, -77, 29, 81, 60, 117, -4, -45, -3, 100, 87, -122, -12, -80, 100, -116, -18, 33, 121, 112, 21, 35, 5, 47, -51, 10, 46, -95, -42, -28, 78, -39, -32, -114, -3, -53, -104, -94, -1, -50, 27, -38, 20, -30, -59, 111, -63, 21, -18, -31, 11, 17, 46, 21, 30, -22, 59, 13, 62, -17, 42, -75, -42, 23, 30, 33, -39, -49, -110, -46, 56, 21, 23, 24, -80, -16, -69, 11, 80, -42, -27, -44, -46, 16, -24, -7, 35, 61, 43, 16, 24, 9, 43, 28, -88, 53, 26, -80, -128, 73, -34, -44, 10, 38, -114, 80, 2, 72, -1, 56, -52, 79, 9, -40, -103, -35, 2, -40, 0, 49, -54, 110, 8, 3, -8, 17, -38, 38, -52, 45, -4, -22, -82, 28, 79, 18, -56, -45, -13, -57, -7, 14, -16, 8, -10, 44, -58, 22, 120, -30, 10, 22, -14, -104, 58, 7, 28, -30, 15, 7, -19, 39, 90, 51, 39, -128, 46, -34, -55, -37, -65, -2, 29, 79, 63, 39, -38, -63, -30, 14, 4, 30, 74, 62, 17, -21, 40, 107, -62, 18, -85, 60, 2, -12, -67, 36, -65, -67, 23, 25, 14, -22, 12, 68, 10, 59, 28, 53, -16, 34, -116, -15, 12, 66, 76, 111, -33, -58, -7, 21, -11, -50, 94, -55, -49, -102, 9, -3, 17, -5, 83, 22, 29, 73, -17, 22, 1, -37, -90, 17, 14, -22, -39, 46, 13, 2, 77, 36, -25, 66, 17, 17, 25, 11, 9, 25, 15, 51, -24, 2, -53, -9, 24, 26, 14, -18, -2, 15, -34, 35, -15, 59, -36, -10, -7, -26, -123, -10, -10, 69, -33, 5, 22, 3, 40, 0, 89, 29, 28, -37, -32, 23, -14, -25, -11, -22, 18, 36, 62, 21, -61, 26, 15, -68, 73, 59, -34, 1, 21, 17, 124, -16, 40, 7, -31, -43, 80, -5, -14, -3, 27, -42, -70, -31, -54, -25, 46, 112, -35, 35, -32, -73, -33, 69, -13, 40, -2, 7, -17, 60, -3, -32, 41, 25, 108, 7, -41, 55, -76, -27, -4, -7, -19, 33, -2, 30, 17, -3, 43, 21, 9, 33, -36, 15, -29, 46, -36, -15, 81, 27, -14, 9, 10, 42, -6, -22, -49, 43, 5, 12, 10, 115, -13, 63, 43, 37, 50, 5, 7, -60, -7, 15, 0, 7, -48, -8, 51, -61, -11, -12, 110, 83, -17, 6, -5, 19, 35, 41, -16, -5, -74, -8, -22, -30, 17, -28, -19, 39, -15, 6, -32, -44, -26, -38, -54, -22, -7, -55, 4, -33, -11, -3, 8, 14, -4, -8, 21, 6, -77, 27, 13, -5, -5, 43, 55, 19, 3, -18, 10, -17, -6, 39, 20, -5, -28, 25, -33, 16, 7, 10, -43, -3, -7, 38, -26, 14, 18, 26, 27, -17, -28, -16, -24, -13, 6, 4, 12, -4, 20, -13, -2, -23, 79, -6, -3, -8, -14, -47, 41, -18, 27, 27, -3, -49, -21, -1, -32, 25, 15, -32, -25, -1, -121, -24, -11, 23, -7, -12, 15, -48, 20, -14, 2, -27, -26, 24, -16, 65, -17, 26, 72, -33, 9, -63, -63, -8, -63, -68, -22, 40, 6, 68, 24, 20, -44, 45, -15, -27, 4, 8, -37, 2, -1, 16, 16, -17, -2, 16, 93, -19, 89, -2, 65, 27, -6, 21, 44, 122, 45, 3, -2, 24, 44, 42, -30, 6, -18, 27, -21, -8, 24, -14, 54, 6, 21, 56, 13, 55, 25, 32, 41, 62, -100, -37, 14, 15, 50, -23, -22, 119, 10, 18, 61, 39, 45, 48, 110, 23, 73, -31, -19, -16, 5, 72, 41, -23, -47, 38, -14, 8, 53, -7, 8, 41, -5, 65, 39, -12, 31, 34, -10, -15, 4, 21, -42, -39, -23, 112, -35, 93, -28, -11, -37, 40, 49, 54, -29, -39, 93, -11, 32, 48, -1, -5, 93, 80, 0, 1, -37, 5, -17, 20, 16, 11, 13, 19, -10, -41, -29, -19, 10, 44, -48, 62, 4, -37, -13, -6, -28, 28, -42, 22, -14, -37, -18, 2, 19, 3, -50, -12, -16, -6, -7, 45, -43, -34, -88, -29, -95, 11, 33, -31, -10, -53, -13, -7, -19, 30, -24, 10, 17, -5, 6, -22, 36, 45, -1, -46, 10, 19, 8, 5, -65, 4, 27, 3, 11, -37, -45, 15, -3, -39, 24, 7, 35, 14, -35, -8, -14, -18, 49, 7, -37, -4, -14, 10, -2, -9, 4, 35, -6, -19, 17, 12, 23, 39, 22, 24, -63, -25, 1, 21, 38, 24, 7, 13, 6, 10, -9, 29, -19, 8, 45, 14, -21, 12, -22, -26, 2, 20, 60, 29, 67, -115, 8, -2, -32, 8, 42, -13, -10, 5, 19, 0, -34, 2, 6, 42, 5, 33, -63, 13, 27, -19, 23, 23, 16, -38, -11, 21, 116, 3, -53, -96, -88, 119, 56, -82, 4, -14, 4, 21, -3, -17, 103, 5, 38, 37, -33, 73, -1, -12, 7, -53, -19, -12, -41, 32, 18, -26, 65, -24, -113, 91, -35, 23, 47, -41, 51, -40, -48, 93, 22, -51, 13, 51, -49, -37, -14, 19, 37, 22, -48, -55, 15, 72, -12, 30, -20, 51, -15, 56, 69, 30, -39, -37, 79, 101, 10, 3, 18, 40, 21, 3, -14, -26, 4, 30, -18, -2, -20, -24, -19, 53, 43, 34, -26, 44, 13, -24, -56, 122, 13, -1, 96, -58, -40, -24, 10, -85, -127, 26, -57, 35, -5, -4, 0, -75, -33, 19, 66, 26, -38, -89, -40, -7, 8, -25, 85, -48, 17, 44, -21, 54, -59, 37, -39, 57, 101, 64, 12, 39, 35, -7, -91, -22, -21, 125, -20, 55, -105, -26, -22, -17, 48, 124, -38, -17, 15, -14, 41, -42, -25, -35, -9, -34, -50, -19, 62, 15, -8, -16, 58, 58, 103, -38, 2, -51, -53, 45, -37, 32, 30, -33, 51, 82, -51, 1, 4, 65, -19, -12, 45, -71, -8, 40, -19, -6, -14, 15, 29, -5, 25, 3, 3, -39, -18, -42, 21, 32, 17, -10, 21, 32, 32, -7, -27, 13, -35, 68, 18, -3, -37, 36, -67, -13, 5, -18, -15, 34, 6, -54, -25, 65, 55, -9, -1, 8, 22, -69, 26, 16, 42, 9, -23, -3, -102, -46, -33, -19, -13, 49, -29, 23, -9, 12, 13, 15, 30, -12, 30, -4, -5, -1, 12, 27, -40, -19, -42, 29, 18, -2, 29, 29, -73, -6, -31, -1, 23, -10, -31, 40, 14, -4, 0, -80, 5, -66, -9, -7, -13, 81, -8, 59, 48, -56, 7, 22, 71, -13, 24, 27, -28, 31, -69, 40, 52, 37, 73, 33, -38, -76, -31, 26, 23, 29, 13, 91, -88, 95, -14, 3, 31, 85, -22, 25, 59, -82, 31, -93, -2, 67, -9, -19, -6, -119, 23, -15, 70, -7, 31, -23, 98, 33, -6, -20, 33, -31, -27, 47, -107, -76, -51, -8, -108, 4, 1, -50, -35, 62, 9, -8, 122, 28, 12, 45, 56, 49, -3, 14, -80, 34, 64, -11, 40, 24, 49, -34, -32, 22, -17, 20, -28, 7, 43, -24, 1, -71, -21, 12, 45, -8, -34, 5, 6, -57, 93, 21, 40, 42, 19, -6, 51, 23, 12, -106, 13, 25, -9, 21, 26, 75, -58, 95, 21, 15, -48, -11, 63, 61, 19, 37, -80, -1, 82, 46, 78, 47, -65, -7, 9, 34, 50, 2, 25, 25, 17, 63, -58, -14, -8, 32, 17, -47, 19, 0, 22, -50, 10, -55, 8, -19, 27, -22, -9, -9, 3, -66, 47, 111, 91, -54, -21, -41, 24, -9, -4, 87, 11, -22, 75, -59, 8, -14, 39, 71, -31, -9, -5, -113, -58, 36, -6, 15, 10, -38, 2, -39, 23, 12, 58, 24, -15, -50, 3, 9, 24, -3, 8, 22, 7, -16, 22, 33, -7, -26, -29, 23, 44, 3, 47, -60, -97, 33, -17, 36, 57, 50, 21, -2, -15, 66, 82, 61, 22, 16, 5, 110, 20, 35, 13, 2, -27, 18, -82, -40, 46, 23, -6, 4, 40, 45, 3, -34, 19, 46, -10, 47, 22, -5, 3, 15, 29, 9, 30, -43, 9, -73, 20, -16, -11, 7, 43, 44, -1, 49, -12, -27, -16, 79, 24, 24, 37, -10, 41, 31, -93, 46, 20, 18, 33, 19, -103, 36, 41, 54, -10, 50, -5, 74, -17, -43, -14, -48, -60, 54, 3, -25, 28, 41, -53, -30, 19, 36, 15, -1, 8, -36, -37, 28, 35, 13, -33, 9, 26, 1, 4, -22, -35, -19, 48, -8, 15, -23, -44, 35, -70, -34, -37, -35, -15, -19, 15, 17, -31, -58, 69, 11, -29, -55, 21, -39, 1, 17, 0, 46, 69, 25, 60, 26, -46, 49, -99, -71, 49, -2, -24, -25, -37, -1, -95, 44, -15, -49, 49, -3, 31, 36, 4, 67, -16, -17, -45, -21, 5, 7, -5, -10, 37, -28, 71, 1, -53, -10, -1, 20, -18, -39, 8, -29, 9, -31, -10, -4, -15, 17, 19, 46, -83, 57, -71, 97, 119, 1, -45, 6, 79, 40, 7, 44, -126, -19, -40, 23, 74, 54, -3, 14, 62, 74, -32, -19, 34, -5, -106, 12, -13, 46, -32, 40, 96, -8, -40, -35, 20, -7, 55, -18, -41, -28, 1, -36, -42, -71, -20, 1, 19, -72, -52, -18, 0, 3, -73, 8, 18, 7, -18, 54, 21, -12, 13, -14, -62, 4, -38, 52, -30, -40, -6, 48, 29, 30, 25, 44, -48, -6, -24, 23, -42, -3, -20, -50, -5, -31, -13, -14, 32, -11, 16, 46, 10, -81, -30, 3, -22, 24, 0, 28, 54, 25, -78, 60, 22, -12, 4, -4, -47, -1, 4, -19, 33, 60, 27, 17, 16, -14, -88, 27, -87, 20, -31, -3, -30, -12, 6, 6, 77, 13, -10, 7, -7, -5, -62, 22, 6, 39, 26, 25, 30, -3, -7, 11, 6, -65, -26, -44, 30, 94, -68, 21, 48, 19, -14, 32, 32, -6, 36, -7, 17, -42, -2, -2, 13, 18, 71, 1, 8, -9, 23, -20, 16, 54, -47, 73, 38, 17, -11, -83, 91, -11, 14, 79, 93, -65, 114, -10, 21, 13, 8, -20, -23, -14, 45, 48, 23, 1, 2, -15, -18, 39, 56, 4, 63, 13, 21, 86, -33, 30, 12, -31, 92, -88, 50, -4, 14, 7, 48, 23, 70, 123, -5, 42, 2, 16, -19, 127, -16, 95, -26, -72, 53, 37, 5, 46, -52, 42, 17, 30, -12, 65, 28, 22, -13, 125, -9, -7, -26, 17, -9, -64, -84, 16, 8, 105, -30, 9, -58, 53, 126, 29, 39, 19, 47, 40, 14, -22, -3, 19, -53, -105, -22, 11, -15, 34, -64, -46, -18, -2, -26, -45, -22, -43, 1, -8, 15, -28, 64, 48, 59, 18, -4, -8, 31, -45, 53, -109, -10, -3, -19, -3, 18, -20, -48, 34, 77, -19, 117, -9, -43, 93, -30, -113, 11, -15, -19, -6, 17, 24, -48, 74, -29, 67, -15, 45, -38, -9, 30, -18, 22, 60, 8, 72, 10, -1, -2, -32, -52, 47, -17, -35, -3, -2, -18, 36, 50, 18, -1, -19, -115, 8, 7, 28, 45, -41, -25, -70, -6, -59, -68, -13, -76, 31, 22, 31, 7, 31, 12, 47, -19, -28, -58, 21, -37, -23, -35, 59, -35, -32, -25, -12, 2, -12, 23, 9, 39, -30, -30, -1, -37, 2, -19, 35, 18, 18, 27, -50, 24, -38, -20, 3, -11, 13, -3, -30, 67, 8, 63, 7, -10, 2, 3, 75, -7, 31, -2, -10, -10, 15, -11, 48, -37, -4, 13, 25, -12, 72, -45, -37, -7, -49, 15, -36, 17, -6, 1, -52, -3, -23, 29, 49, 18, 62, 0, 25, 27, -13, -4, 9, 6, 10, 40, 10, 46, 83, 68, 15, 9, 67, 71, -122, -15, 73, 44, -125, -44, 11, 12, -28, -56, 15, 3, 6, -7, 50, 35, -2, 125, -60, 60, 76, 55, 103, -42, 50, 19, -10, -104, -11, -1, -1, -35, 3, -34, 27, 23, 24, -45, -2, 19, -17, 56, -53, 52, 18, -53, -121, 0, -10, -65, -47, 22, 81, -58, 33, 5, -84, -9, -10, -35, -40, 47, -24, -73, 15, 49, -48, -127, -26, 11, 118, -75, -16, -69, -32, -74, -46, 127, 111, -6, 26, 25, 53, -10, -32, 33, -3, 30, 54, 84, -14, -32, -73, -76, 77, 88, -9, -15, -6, -102, -59, 39, 13, 54, -64, 10, 67, 62, 7, -18, -21, 73, 13, 53, -27, 34, 11, -81, 122, -21, 65, -27, 1, 104, 22, -96, 68, -111, 25, 4, -2, 66, 106, -21, 8, 49, 19, 10, 10, 5, -6, 45, 32, -116, -15, -68, 38, -1, -3, 13, -22, 18, -20, -10, -119, -20, -4, 64, -23, 56, 17, -28, -12, 16, 4, 45, 67, -76, -6, -60, 8, -59, -10, -65, -29, 47, -68, -38, -76, -59, -16, 90, -10, 1, -2, 72, -21, -20, -36, 50, -23, 4, -9, -14, -14, 30, 5, 6, -99, -49, -19, 16, 21, -2, 65, -15, -39, -5, 25, 4, 17, -28, -8, -4, -46, 31, 42, -17, -8, -29, -14, 45, 38, -32, -28, 24, 40, 28, -5, -22, -32, 56, -6, 11, 5, 48, 5, -57, -4, 11, -12, 32, 12, 23, 0, -10, 2, 10, -1, -17, 56, -25, 34, 12, -37, 12, -4, -38, 9, -93, 36, 28, 32, 83, 48, -48, -21, 3, -18, -69, 45, 0, 36, 9, -37, 29, -6, -16, 36, -10, -29, 16, -39, -12, 23, -14, 2, -27, 77, -39, -77, -57, 23, 40, 32, 19, -13, 0, -18, 39, 33, 26, -4, 6, 59, -121, -7, 24, 2, -53, 61, 4, 6, -4, -6, -38, 5, -12, 55, -9, -8, 2, -13, -14, -31, -18, 25, -46, 81, 26, 21, -25, -47, 37, 25, 8, -36, 19, -7, -42, 8, -19, -13, 17, 45, -3, -12, -7, 5, 11, -31, 49, 10, 34, 2, 64, -17, 75, -61, 24, -1, 5, 22, 21, 24, -46, -35, -15, 16, 14, 46, -12, -15, -60, 6, -14, -15, 48, -7, 22, -13, 33, 8, -25, -15, 0, 10, 33, 9, -36, 71, -115, 3, -29, -35, -73, -46, -68, -17, -38, -24, -11, 31, -12, -3, -52, 52, -36, -6, -54, -18, -14, 13, -54, 13, -6, -4, 25, -22, 49, 9, 1, 18, 15, -4, -16, 10, -15, -32, 15, -2, -67, 55, -63, -4, 48, -44, -14, -43, -6, -4, -5, -32, 1, 11, 23, -20, 36, 40, -28, 22, 22, -40, 2, -4, 11, -14, -7, -25, -17, 9, 41, -16, 10, 5, 10, -9, 9, 57, 25, 0, 1, -20, 8, 13, 127, -24, 17, 9, -24, -2, -6, -40, -2, -5, 4, -49, -34, -25, -5, -2, 25, -99, 11, -10, -13, -16, 8, -6, 0, -23, 21, -42, 12, -22, -55, 18, -9, -13, -17, -20, -10, 13, 23, 19, 10, 14, 5, 3, 17, -7, -4, 9, 126, 6, -29, 12, -19, -29, -38, 8, 4, 5, 22, 19, -20, 0, 98, -1, 12, -17, 12, 0, -15, 38, -25, -11, -17, -46, 48, 3, -19, 22, -89, 13, -37, 20, -26, -2, 8, 23, -13, -3, -7, 28, 21, -16, -3, -10, 12, -6, -22, 27, -14, 49, -16, 0, 54, 48, 67, -34, -37, -56, 78, -24, 55, -23, -10, 30, -33, 92, 16, -61, -1, -30, -24, 38, -66, 79, 69, 16, 27, 19, 12, 48, 31, 40, -47, -106, -118, -51, 96, 30, -12, -48, -15, 74, 117, 106, 24, 18, -39, 1, 38, 86, -28, 2, 17, 126, 22, 17, -121, -65, -9, -17, 47, 61, -7, 74, -107, 71, 68, 71, 95, 83, 127, 122, 53, -8, -2, -88, -49, -95, -23, -36, 92, 58, -33, 41, -26, -61, 43, -104, 63, 41, 41, -36, -55, -40, 36, -26, 35, -19, -27, 5, 64, 27, -40, 46, 19, -57, 48, -19, 33, 127, -86, 28, 4, 83, 82, -15, 111, -30, 47, -49, 34, 121, 30, -82, 24, 111, 73, 44, -13, 39, 79, 90, 77, 17, 13, -92, 126, -32, 50, 123, 32, -66, 55, 21, 13, 24, 106, 71, -79, -19, 83, 25, 79, 27, 68, 33, 49, -42, -50, 126, 20, 8, 15, -25, -72, 10, 126, 40, -56, 23, -6, 121, 38, 33, 104, -50, 38, -3, 123, 26, 31, 127, -67, 30, -123, -62, 27, -7, 28, -20, -39, -28, 36, -43, 44, 41, 61, 38, -17, -17, 4, 73, 49, -19, 87, 109, 92, 49, 60, 66, 38, -9, -32, 16, -13, 57, 21, -6, -53, -39, -84, 126, 79, 21, -46, -37, 56, 52, 102, 62, 36, 26, 83, 74, 77, 7, -124, -57, -22, -6, -115, 18, 46, 122, 14, 7, 0, 45, 29, 1, 57, 8, -14, 58, -17, 49, 24, -66, 28, -15, -8, 82, -71, 13, 10, 91, -46, -24, -36, 18, -9, 59, -19, 10, -60, -27, -24, 28, 3, 127, 48, -2, -57, 77, -3, -7, -11, -31, 31, -31, 78, 12, -127, -17, 15, 22, 51, -61, -59, -38, 87, 10, -23, 21, 10, 58, -58, -37, -14, -52, -4, -48, -1, 10, 0, -44, -56, -46, -15, -71, 16, 23, -2, 53, 11, -46, 2, -52, 59, -104, 24, -26, 112, 45, -55, -103, 17, -46, 0, 43, -51, 18, 16, -30, 14, 4, 50, 14, -23, 44, -40, -19, 64, -34, -8, -12, -27, -29, 88, -73, -34, 7, -32, -27, 68, -44, -2, -13, -15, 53, -13, -120, 18, -1, 56, 37, 96, 126, 17, 60, 15, -35, 74, -13, -17, -32, 37, -28, -63, 68, 6, 10, -29, 89, 57, 20, 14, -118, 67, -10, 71, 14, 73, 7, -37, -75, -27, -69, -50, 48, 5, 34, -51, -4, -66, 23, -18, 7, -17, -19, 115, -82, -22, 42, 92, -52, 17, 9, 104, 118, -16, 58, 5, -24, 33, -41, -90, -97, 4, 80, -16, -37, 14, -9, -13, 38, -1, -23, -25, 5, 13, -12, 18, -4, 35, -68, 0, 2, -30, -21, 40, 36, 28, -4, -6, -87, 90, 44, -6, -122, -36, 16, -104, 47, 60, -32, -61, 14, -107, -4, 48, -3, -60, -11, 65, 37, 16, -36, -5, 57, 1, -34, 1, -108, 14, 17, 54, -4, 33, 24, -25, -47, 3, 12, -46, 16, 5, 3, 27, 21, 54, -35, 34, -1, -30, 4, -36, -13, -8, 4, -14, -91, 88, 0, -28, 19, 28, 7, 47, -45, 53, -2, -22, 15, 32, 24, 2, 7, 3, -34, -42, 39, -7, 1, 18, 5, 63, -34, -30, 2, 64, -26, 16, -54, -96, -18, -91, -32, 20, -58, 21, 49, 14, 96, -14, -8, 46, 26, 20, -61, -13, -8, 23, -9, -16, 44, 1, 23, -71, -3, 56, 43, -5, -17, -29, 55, 74, -8, -82, 14, -1, 96, 12, -3, 16, -34, -4, 34, 3, 10, 79, 109, -32, -85, -120, -114, -69, 30, -10, -60, -67, 4, -22, -81, 45, 35, -54, 27, 29, 33, 127, -86, 42, -7, -1, 29, -80, -38, 13, -3, -21, 12, -8, 48, -11, 4, 56, 4, 22, -26, 41, -122, 28, 59, -49, 44, 125, 2, 8, -116, -3, -57, 14, 11, 42, -45, -59, 1, -47, 16, -72, -101, -27, 22, -24, -24, 11, -14, 8, -36, 22, 45, 3, 33, 60, 66, -58, 5, 2, 10, -63, -122, -67, 26, -10, -24, 9, -7, 23, -74, 10, -25, 43, -111, 40, -69, 18, 9, -27, 0, -86, -6, 37, -48, -42, 19, 16, -42, 23, -96, 46, 14, 115, 29, -11, -4, -119, 87, 25, -13, 19, -1, 22, 22, -90, 19, 27, 23, -52, -10, 26, 31, 11, 20, -51, 68, -25, -15, 11, 3, -33, -65, -109, 94, -18, -64, 17, 61, -41, -22, 26, -18, 23, -66, 9, -125, 7, 29, 2, -48, -58, -36, -72, -127, -82, 30, -40, 28, 46, 14, 72, -9, -43, 9, 56, 51, 38, -53, 11, 45, -53, -1, 22, -6, -29, 17, -37, 39, 11, -93, -68, -10, -54, 13, -36, -38, 3, -46, -5, -57, -16, -12, 19, -19, -59, -76, 15, 38, -81, -123, 13, 12, 89, 64, 41, -12, -3, 27, -21, -11, 113, -27, -40, 26, 4, -3, 13, -35, 14, -33, 8, 29, -7, -17, 0, 38, 16, 69, -24, 41, 30, 24, -63, 15, -84, 1, 23, 52, 12, 37, -21, -35, 13, -31, -24, 35, 38, 75, 1, -42, 13, 23, 1, 10, -15, 66, -14, 47, -60, 11, 14, 47, -11, 77, 68, -47, 123, 47, 26, -12, 18, 35, -65, 10, 21, 24, 12, 43, 2, -9, -42, 37, -55, -65, -11, -23, 32, 2, 37, 26, -28, -22, -10, 62, -46, 43, -18, 56, 18, 19, -6, -33, 69, -29, -37, 64, 23, -71, -3, -50, -18, 79, 10, 29, 7, 67, 38, -2, 91, -98, -22, -23, 31, 126, -4, -2, 70, 76, -14, 36, -23, 22, 6, -51, -46, -12, -56, -22, 70, -13, -19, 30, -36, 17, 13, -20, -17, -5, 11, 72, 18, 18, 76, -14, -60, 3, -29, -23, -6, -37, -48, -31, -48, -17, -5, -67, -71, -2, 88, -42, 52, 43, -11, 2, -60, 21, 42, -24, -24, 48, -20, 31, 12, 27, 25, 30, -123, -90, -19, 89, 112, -50, -51, 18, 64, 109, 8, 124, -74, 41, 53, 77, -96, -102, -25, 92, -70, 49, -48, 26, 16, 29, 27, -35, -35, -8, 12, 37, -56, -38, -85, 87, 74, -46, 8, -22, 108, 7, 70, -38, -4, -3, 93, -27, -13, -68, -27, 89, -48, 12, 38, -116, -30, 62, -48, 46, 30, 15, -47, 50, -21, -3, 88, 48, 81, 7, 35, 49, -90, -86, -33, -17, -27, -4, -84, 53, 58, 51, -54, 14, 15, 32, -4, 98, 45, -99, 27, -15, 79, -32, -28, -6, -39, 1, 6, 3, -34, -128, -66, -13, -16, 125, 41, -50, -35, -31, -19, 12, 81, -52, -56, 7, 28, 6, 79, -50, 48, -57, 16, 65, -30, 27, -18, 56, -29, 27, 21, -5, 46, -40, 43, 38, 95, -28, 0, 8, 53, -23, 71, 96, 11, -33, 6, -16, 35, -4, -45, -53, 11, -49, 7, -44, -21, 97, -23, 103, 37, -2, -11, -9, -11, -57, 36, -8, -44, 125, 3, 78, 76, 42, 10, 79, 25, 75, 27, 34, -87, 20, -43, 17, -20, -57, 80, 40, 7, 111, -66, 4, 33, -19, 92, 25, -64, 51, 64, 28, -13, 66, 25, 31, 21, 21, -35, 81, 51, 127, -6, 3, 60, 52, -25, -17, 17, 42, -3, -30, 55, -22, -41, 127, 28, -54, -119, 92, 77, -9, -47, -7, 35, 0, -40, 15, -25, 71, 104, 34, 36, 60, 38, -16, -3, 6, 106, 42, 89, -16, 16, -31, -8, 94, -3, 20, -26, 12, -68, 42, 45, -58, -59, 30, -64, 45, 122, 75, 22, 69, -42, -60, -114, -33, -99, -99, 9, 14, 13, 99, -1, 65, 5, -29, -121, 73, -3, 15, 40, 19, 37, -31, 85, -43, -35, -34, 24, 80, -29, -25, -23, 41, -24, 62, -6, -124, -24, 12, 7, -9, 103, 88, 18, -126, 123, -70, -28, 12, -114, 6, -71, -13, -80, 31, -69, 56, 13, 109, -75, 3, 24, -85, -58, 18, -91, -27, -48, 2, -67, 39, 70, -19, 82, -30, 37, -34, -2, 43, 77, 48, 22, 23, 39, -47, 65, -36, -24, 4, -50, 9, 16, -89, 15, 11, 11, -107, -71, -54, 10, -52, 17, -29, -19, -50, 10, -27, 80, 35, 35, -67, 5, -5, -35, 40, -48, -24, -7, -44, 1, -16, -52, -118, -20, -1, 24, 34, -105, -60, -50, -54, -17, 18, 79, 26, -11, -23, -63, -28, 10, 69, -124, -45, 8, 7, 13, -96, -24, 35, 37, 24, 24, -73, -3, 44, 85, -3, 7, -81, 12, -3, -30, -1, -18, -35, -36, -67, 28, -39, -61, 1, -36, -27, 24, 29, 28, 3, -32, 40, -32, -46, 45, 58, -62, -104, 31, 45, -12, 87, 12, 7, -63, -17, 29, 102, 8, 57, 22, 9, 8, -11, 45, 125, 106, -65, -28, 93, 0, 53, -31, 49, -20, 6, 61, 39, -19, 43, -52, 6, 3, 91, 29, -69, 11, -23, 32, -9, 31, 29, -47, 26, -66, 8, -44, 59, -6, -18, 34, 5, -33, -46, 59, -34, -23, -48, -19, 105, -30, -14, 31, 121, 88, 1, -1, 27, 70, 93, 31, -56, 20, 27, -75, -35, -18, 18, 71, 24, 40, -3, -15, -13, -10, -65, -13, -22, 41, 33, 3, 74, 25, 32, 49, 110, -5, 90, -23, 22, -64, -35, -15, 22, 77, 17, 1, -51, 50, 107, 70, 26, 66, -78, -106, 40, -110, -60, 26, 41, -32, 54, -10, 32, -41, 30, -1, -25, 6, 69, 117, 6, 1, -8, -16, 8, -12, 49, -72, 22, -16, -34, 24, 0, -50, 57, 80, -1, 55, 58, -122, 63, -63, 97, 60, 26, -43, -22, -29, 99, -30, 30, 53, 49, -49, 8, -21, -44, 127, -9, 38, -58, 26, 38, 46, 48, 56, 58, 56, -36, -25, -12, -45, -82, 7, -13, -48, -116, -52, 7, 11, 37, 40, 95, 1, -7, 14, 44, -33, -46, -19, -8, 52, 61, -37, -22, 9, 44, -11, -21, -35, 20, -53, 106, -45, -8, 11, 70, 49, 34, 91, -60, -25, -21, 14, 40, -65, -12, -7, 6, 9, -9, -75, -40, 41, 53, 9, -31, -31, 48, -18, 11, -3, 30, 6, 40, -45, -35, 38, 72, 64, -117, -32, 38, -53, 10, 1, -7, -10, 29, -36, 22, 6, -8, 33, 20, 44, -89, 74, -66, 5, 60, 21, 26, 29, 31, -61, 11, 24, 29, -36, 33, -16, -27, -40, 39, -75, 12, -25, 12, 46, -2, 0, 3, 86, 14, 13, -26, 73, 10, 5, -16, 31, 35, -9, 96, -56, 22, 15, 51, 18, -60, -25, -34, -5, 19, -13, 20, 74, 70, 16, -120, 10, 103, -27, -92, -46, 25, 39, -49, 17, 40, -56, -25, -68, -81, -40, 126, 51, -9, 4, 30, 5, -68, -33, 53, 60, 8, 34, -36, -14, 52, 30, 114, -25, -65, 38, -53, 45, 38, 59, 12, 113, 9, -29, -9, -10, -81, 13, -56, 75, 19, 46, 21, -14, -49, 31, -100, -24, -34, 38, 100, -60, -30, -9, -46, -104, -21, -3, 12, 31, 65, 97, -14, 7, 27, 30, -83, 40, -74, -9, -62, -7, 112, -59, -49, -24, 23, 113, 96, 40, -35, -42, 38, 69, 73, 42, 41, 18, -3, 95, 96, 77, -32, -20, -90, 105, 40, 82, -1, 108, 58, 73, 118, -15, -4, 26, -4, -16, 68, -50, -59, 10, 32, -58, 31, 44, 4, -50, 31, -19, 91, 43, 11, 40, -32, 119, 75, 86, 113, 0, -108, -14, 121, -104, 17, 126, -38, 2, 52, 56, -20, 51, -16, -35, -18, 26, -26, 13, -65, 25, -105, 67, 50, 18, 20, 13, -22, 24, -9, 27, -9, 8, 3, 81, 40, 73, -26, -33, -7, 22, 6, -7, -11, 19, 14, -47, 96, -16, 52, 60, 17, -71, 56, -50, 12, 7, 6, 31, -59, 1, 23, 17, -49, -17, 21, -9, 30, 31, 35, -1, -18, 7, 29, 15, 65, -68, -9, 89, -8, -30, 44, 74, -4, 46, 28, -69, 62, 27, -22, -57, 28, -20, 11, -3, 5, -65, 28, 7, -26, -13, 20, 20, 32, 71, 115, -47, -11, 36, -65, 5, -50, 52, 16, 22, 77, -9, -8, -16, 56, 30, 17, 50, -35, -69, 19, 71, 60, -55, 2, 55, -47, 3, -13, -109, 28, -3, -5, -38, 0, 34, 110, 38, 15, 46, 18, -1, 34, 32, 32, -1, 53, -3, 75, 65, -14, 63, 61, 0, 4, -78, 18, 21, 5, 47, 19, 26, -65, -59, 84, 45, 2, -126, -38, 24, 56, 15, 47, -13, 45, -69, 7, 122, -42, 34, 84, -8, 6, 21, 6, -11, 26, -47, 117, 3, 23, 10, 34, 29, -48, 123, -11, 53, -47, 46, -8, 45, 4, -16, 14, -28, -30, -16, -67, 59, 10, 34, 15, 63, 1, -28, -11, -24, 8, 27, 54, -4, -110, 80, 57, 31, 7, 104, -35, 60, -10, -12, 41, 66, -122, -18, 9, 52, 41, 42, -47, -28, -32, 68, 8, -56, 13, 28, 115, 42, 31, 0, -55, 24, 39, -47, 9, -41, -14, 41, 34, 53, 71, 0, -5, 53, -55, 14, 17, 23, -59, -22, 52, 96, -40, 72, -7, -7, -24, 5, 48, 33, 29, 18, -106, 36, 30, -53, -29, 88, -21, 77, -5, -22, 29, 7, 21, 0, 27, 19, 63, 8, 37, 32, -45, 16, -25, 45, -16, -2, 61, -13, -31, -8, -19, 65, -14, -69, 29, -25, -83, -53, 35, -60, -23, 4, 52, -10, 29, 9, -5, -80, -30, 3, -22, 8, -40, -28, 15, 66, 23, 64, 7, 41, 11, -24, -97, -21, -16, 79, 7, -4, -29, -20, -42, -33, -35, -66, -18, -76, -18, 22, -59, -20, -59, 0, -72, -77, 6, -60, 28, 18, 19, -51, 96, -34, 8, 22, 2, -98, 38, 29, 21, 3, -15, -26, 31, 0, -7, -9, 26, -8, -128, 118, -75, 33, -69, -8, 121, 26, 46, 37, 101, -19, 7, -82, -39, 34, -65, -14, 40, 20, 127, -126, 29, -44, -44, 29, 23, 2, 80, -14, 126, -31, -22, -21, -12, 15, -16, 80, -18, 49, 41, -8, -43, -121, -67, 59, 123, -24, -27, -28, 36, -103, 18, 36, 0, -64, 10, 69, -11, -74, -99, 102, -64, 35, 6, 16, 122, -19, -6, 3, -21, 73, 5, 10, 121, 18, 87, -16, -28, 79, 4, 96, 39, -1, -21, -40, 110, 24, -42, -56, 109, -10, -57, -41, -76, -53, -126, 27, 63, -47, 51, -40, 17, 83, 79, 3, 31, 13, 13, 26, -86, 37, -96, 77, 31, 47, 127, 22, -5, -18, -48, 30, 19, 25, 106, 117, -66, -49, 124, -90, -4, -90, 7, -1, -64, 30, -91, 32, 1, 103, 40, 96, -26, -47, 21, 8, -23, -12, -29, 25, 36, -28, -115, -27, 80, 13, 65, 3, -2, 124, 86, 25, 108, -77, -57, 16, 19, 5, 26, -39, 126, 27, 14, 30, 5, -6, 47, 16, 4, 1, 3, 24, 44, -58, -27, -128, -13, -25, 0, -13, -9, 18, -14, -19, 22, 92, -31, 14, -14, -20, 37, -27, -37, -11, 36, 3, -27, 11, 4, 16, -50, -2, -74, -2, 61, -5, 75, -5, 6, 31, -40, -6, 127, -63, 31, -7, -4, -41, -50, -125, -33, -42, -3, -99, 14, 0, -12, 22, -22, 15, -14, 29, 9, 0, -4, 30, 31, -5, -17, -24, 13, -56, -6, -36, 37, -6, 53, 29, -2, -3, 5, -34, -121, -68, -38, -33, 53, -23, 9, -12, 12, -10, 11, -69, -4, -51, 16, 84, -71, 15, -38, 4, -26, 31, -40, 11, -64, 13, -26, -7, -14, -20, 27, 2, 31, 67, 30, 108, 28, 66, -14, -5, -9, -11, 9, -38, 35, 83, -49, -13, 81, 32, 40, -22, -20, 91, 1, -24, -26, 53, 69, -66, -48, 50, 12, -39, 11, 55, 13, -22, -17, 67, -28, 21, 103, -45, 65, 11, -18, -20, 28, 0, -5, -12, -15, 31, -54, 14, 82, -99, -38, -46, -22, -81, -20, -62, 65, -47, -21, -32, 14, -50, 73, 11, 14, 5, 38, -14, 53, 27, -14, 39, -18, 63, -47, 61, -12, 12, 58, 0, 15, -47, -51, -50, 3, -10, 52, 20, 28, 23, -19, 4, -58, -3, 13, 97, -44, 10, -98, 31, -38, 4, 50, 72, 21, 24, 127, 33, 48, 64, 48, -100, 7, 46, 1, 105, 11, 59, -16, -46, 86, -11, 23, 12, -42, -50, -81, 21, 108, 91, -125, 19, 55, -21, 117, -75, -24, 9, -58, 39, 10, -12, 26, 126, -77, 31, -3, 127, -13, 76, 64, 40, -10, 10, -29, -56, 40, 7, 68, 4, 12, 119, 99, 36, 31, -20, -117, 127, -122, -33, 97, 22, 43, 0, -7, 4, 35, -16, -16, 16, -4, -15, -50, -24, 85, -4, -59, 23, 11, -76, 21, 57, -19, 6, -32, -7, -58, 39, -46, 14, -27, 6, -76, -5, 65, 24, -30, -57, -22, 45, 23, -3, -11, -122, -29, -38, -16, -10, 23, 25, -45, 12, 7, -69, 25, 19, 24, 2, 7, 9, -40, 37, 26, 45, -92, 16, 22, 53, 22, -24, 15, 53, 35, -107, 56, 19, 20, 17, 1, -50, -31, 0, 18, 13, -1, 11, 23, 71, -5, 21, 34, -63, 50, 77, 24, 29, 9, 77, -20, 66, -3, 15, 24, 81, 83, 25, -5, 42, -121, 126, 34, -84, 44, 16, 112, 38, 22, 24, -78, 102, 40, 14, -18, 95, 70, -15, 32, 28, 31, 82, 58, -1, 26, 30, 59, 16, 5, -41, -15, -45, -29, -15, 71, -9, 17, -11, -6, 31, 30, 89, 48, -34, 95, -5, -72, -14, 108, -34, 41, -24, -45, -79, 117, 0, 25, 14, 68, -24, 23, -15, -23, -61, -3, -21, 24, 55, 7, 46, 19, 17, 66, -75, 10, 95, 14, 18, 6, -54, 23, 90, 113, 34, 44, 57, 12, 66, -9, 116, 9, 32, -88, -105, -123, -31, -17, -7, -50, 16, 83, -57, 70, -110, -127, -38, 55, 5, -108, -35, 49, 52, -4, -19, 20, -41, -101, 89, -127, -121, -6, 14, 61, -91, -47, 27, 62, 39, -71, -64, -112, -21, 27, 8, -70, 17, 14, 5, -37, 10, -2, 61, -77, -23, -40, -39, -67, 18, -124, -33, -40, 68, 11, 4, 118, -14, 24, -56, 67, 33, 52, -11, -13, -16, 122, -115, -34, 46, -50, 43, 59, 78, 19, 120, 6, 41, -50, 37, -28, 28, 103, -128, 24, -44, -3, -14, 3, -10, 62, -51, 36, 2, 73, -93, -59, -26, 30, 17, 90, -21, -31, -17, 23, 22, 39, 20, 17, -9, -96, 57, -6, -60, -50, -18, -56, 19, 8, -76, 8, -21, -32, 14, -38, 1, 20, -90, 55, -54, 7, 35, 19, -28, -33, -86, 54, 72, 29, -19, -32, -33, 97, 16, 11, -15, 23, 18, -56, 29, -17, -9, 46, 30, 46, -122, 106, -21, 48, -63, 32, 16, -61, -55, 22, -21, 121, 29, -15, 30, -25, 39, -21, 62, -25, -11, -34, 62, 42, 6, 26, -29, 80, -57, 7, 29, 17, 71, 2, 37, -45, -111, 27, 47, 112, 7, 77, -22, -29, -73, 39, 106, 37, 45, 65, 43, 26, -119, 33, -28, 16, 123, -52, -61, 64, 2, 34, -39, -3, 6, 18, 35, 4, 24, 2, -3, 53, -17, 19, 14, -4, -30, -14, 72, -6, -50, -94, -23, 30, -115, 77, 17, 69, -20, 5, 13, -13, -83, 25, 3, -23, 15, -128, 46, 112, 13, 41, -4, 125, 47, 23, -39, -13, 123, 43, -18, 5, 6, 3, -32, 114, -11, -69, -23, 43, 13, 5, 106, -8, -8, 22, 8, -22, 61, -27, 51, 28, -2, -75, 13, 61, -8, 71, 56, -28, -15, -29, -53, 83, -33, -13, -26, -76, 98, 75, 97, -11, 101, -126, 124, 29, -105, -36, 83, 6, 57, 45, 98, -55, 9, 14, -45, 124, 42, 88, 62, 87, 43, 18, 8, -6, 28, 99, 26, 127, 27, 2, -20, -47, -41, -39, -52, 35, -18, -37, 41, -1, -4, 9, 29, 48, 46, -14, 42, 34, -38, 1, 87, 13, -22, 61, 123, 4, 26, -16, 32, 125, 19, 43, 28, -32, 114, 4, -87, -61, -99, 22, -10, -8, -27, -7, 5, -24, 6, 4, 23, 10, 23, -33, -31, 82, -48, -25, -74, 68, -9, 35, -16, 30, 10, 24, 71, 50, -127, -50, 21, 114, -31, -56, 2, 48, 39, 39, -14, 33, -9, 34, -13, -35, 49, 59, -27, 15, 61, 28, 17, 15, -14, -5, 38, 7, -8, 2, -62, -7, 1, -32, 22, -30, 17, 6, -12, 42, 8, 24, 61, -101, 1, 13, 48, -16, 27, -10, -9, -5, -7, 75, 21, -39, -33, 25, -49, -30, 17, 11, 75, 7, -11, 20, 3, -49, 52, -25, 72, 52, -11, 57, -6, 21, 99, 32, -81, 37, -59, -65, 18, -24, 119, -37, -69, 57, -20, -1, 78, -32, -15, 6, 33, 108, 81, -120, 38, -47, -82, -4, 62, 29, -11, -53, 9, -23, -10, -78, 63, -12, 38, -37, 21, 64, 3, -17, -117, 24, 3, -24, -75, -34, 34, -5, 26, 9, 15, 41, 51, -8, 52, 25, -42, -101, 100, 57, 9, -98, 127, -86, 36, -63, -92, 50, 43, -7, -16, 30, 66, 56, 54, 33, 29, -49, 8, -1, -8, -16, 73, -14, -72, 26, -34, 44, 43, -117, 12, -43, -121, -70, -28, -5, -23, -68, 23, 123, -11, 70, -14, -64, -82, 99, 79, -113, -45, 118, -12, -35, -79, 94, -43, -125, -45, 121, -126, -45, 4, -18, -47, 11, 25, -73, -51, 104, -19, 46, -116, 117, -32, -11, 106, -14, -112, 52, -73, -127, 82, 14, -22, -2, 35, -65, -108, -88, -4, 8, -33, 28, -128, -23, 0, -20, 0, 97, -45, -31, -27, 126, -65, -31, 23, -25, -53, -92, 65, -123, 62, 127, 4, 83, 40, 35, -14, -11, -32, -71, 6, 6, 51, 22, 30, -23, -46, -38, -11, -24, 41, -31, -22, -123, 36, -57, -46, -22, -10, -4, -21, 30, -12, -124, -27, 21, 38, -25, 8, -38, 73, 24, 27, -2, 21, -7, -10, 19, 28, -78, 17, -10, -8, 34, -60, 103, 27, -18, -36, 48, 24, -51, -34, -52, -11, -61, 102, 5, -1, -37, -70, -66, -19, 48, -90, -18, -23, 70, 17, -100, 87, 55, -19, -23, 73, -11, -65, -39, -83, -16, -10, -68, 46, -92, -126, -66, -121, -94, -92, 47, 2, -39, -95, -43, 42, 2, -50, 8, 38, 81, -84, -1, 36, 0, 16, -54, -61, 83, 51, -31, -50, -19, 0, 1, -64, 22, -3, -12, 5, 10, 58, 38, 71, 47, -23, -3, -4, -112, 35, -44, -39, -44, -7, -121, 13, 33, -28, 41, 26, 60, 86, -87, 37, 11, 25, 42, -15, -25, -49, 27, 27, 58, -62, 91, 48, 59, 15, -11, 118, -55, 22, -5, -1, -1, 68, -16, 86, -95, -95, 46, -9, -40, -18, 20, 5, 48, 44, 17, 10, 13, 1, 19, -17, 12, -66, -44, -48, 33, 23, -50, -16, 59, -11, -48, 2, -6, -5, -43, 33, 44, -12, 23, -63, 46, -23, -51, 3, 126, -54, -50, 85, 15, -6, -3, 42, -58, 61, -55, 75, 94, 26, -97, 71, -107, -80, 13, 61, -37, 30, 5, -36, 63, 9, -68, -18, -32, 39, -58, 21, -21, -30, -46, -127, 42, 34, 6, -84, 31, 39, -10, 36, -58, 38, 10, 10, -4, 29, -128, -28, 65, 29, 10, -78, 116, 19, 67, -122, 31, -43, -27, 68, 9, 35, -90, -8, 7, -49, 56, -29, 25, -21, 31, 0, 28, -44, -51, 61, 30, -5, 57, 83, 2, 1, 54, 74, 27, -3, 20, -35, 6, 17, -17, 27, 65, 35, -7, 67, -46, 19, -34, 23, 26, 34, -26, 18, -22, -4, -113, -48, -10, -12, -32, 1, 0, 15, 33, -11, 24, 35, -18, 35, -85, 41, 52, -18, 29, 26, -37, -25, 4, 34, 5, 1, -16, 4, 13, -12, -2, -66, 29, -29, 70, -15, -48, 14, -6, -32, 36, -9, 25, -12, 25, -127, 27, -26, -54, -55, 13, 78, 26, -26, -15, -21, -4, -50, -17, 10, -18, -11, -42, -19, -8, 12, 0, 24, 27, 64, 42, 83, 34, -23, 16, 7, -123, 21, -16, -53, -5, 14, -24, 50, -22, -20, 36, -9, 35, 9, 64, -16, -6, -41, 99, 67, 26, 21, -59, 4, -13, 48, 67, 38, 67, 127, 38, 14, -5, 43, 3, 1, -3, 13, 62, 24, -5, -49, 39, 74, 61, -44, -39, 70, 112, 6, 62, 52, 49, 17, 0, 80, -21, 11, -19, -34, -2, 4, 38, 31, -9, -3, 109, 51, -14, 121, 66, 15, -12, 34, -33, -2, 0, 10, 27, 63, -6, 37, -55, -36, 22, 15, 30, 68, 37, -65, -17, 79, -8, 32, -50, 4, 83, 36, -57, 18, -21, -48, 39, 98, 35, 27, -10, 24, 36, -13, 41, 22, -15, 44, -98, 62, 32, -1, 116, 62, -35, -78, -13, 34, -37, 123, -31, -26, -2, 10, 52, -77, -35, 78, -67, 63, -5, -60, -13, 71, -10, 22, 118, 42, 126, 59, -21, 30, 2, 9, 8, 14, -31, 38, -70, 57, -36, 109, 9, -13, -33, 88, -9, 70, 8, -44, -20, 73, -2, -13, -19, 118, -27, 2, -16, 58, -82, 39, -59, 36, -7, 4, 60, 23, 38, -6, 37, -3, 29, -32, 1, -34, 44, 45, -10, -29, -10, 9, -39, -58, -25, -26, 37, 44, 71, 60, -1, -18, 45, -76, -12, -24, -5, 2, 15, 5, 10, -72, -38, 31, -58, -27, 4, -10, 6, -4, -110, 11, -34, 31, 36, 2, 32, -14, 19, -4, 13, 17, -8, 5, -1, -18, 15, 16, 47, 56, 48, -6, -53, -8, 66, 27, -57, 45, 51, -24, 35, -33, -29, 74, 16, 14, 22, 15, -72, -26, 101, -27, -14, -22, 14, -79, -9, 34, 81, -114, 33, 9, -24, -31, 31, 13, -79, -61, -40, 82, -115, 45, -107, 57, -37, -66, 12, -25, 4, 7, -24, 4, 27, 6, -64, 6, 89, -84, -121, 75, 40, -36, 13, -57, 48, -59, -128, -62, 7, -15, 26, 75, 16, -59, 27, -20, 16, 6, 13, 2, -84, 15, -40, -70, -8, 56, 107, -1, 12, 15, -1, 25, 58, -12, 53, -110, -67, -38, -67, -46, -42, 16, -54, -103, -109, -5, -70, -67, -56, -67, 80, -13, -53, 55, 15, 83, -124, -44, 0, -17, -44, -60, -32, 8, -23, -17, -54, 36, -49, -9, -65, 16, -39, 88, 43, 50, -8, 3, -25, -57, 30, 37, 34, -60, 74, 57, -27, -30, -104, -67, 46, -46, -12, -120, 52, 36, -117, -45, 35, 45, 62, -66, 58, -52, 54, 14, 28, -24, -86, -35, 49, 17, 91, 75, 39, 125, -24, -7, -109, 70, -24, -88, 25, -59, 127, 55, -81, -16, 17, 14, -41, 7, 69, -9, 15, 25, 46, 87, 13, -42, 20, 12, -38, -14, 109, 16, -66, 107, 91, 30, 83, 4, 15, -41, 36, -38, -106, 75, -120, 18, 92, 58, -123, 9, -42, 95, 4, -2, 26, 24, 1, -4, 22, -14, -11, 3, -122, -53, -76, -53, -8, 1, -100, -6, 26, 3, 1, -35, 105, 25, 11, -43, -105, -27, -35, -54, 56, -16, 8, 8, 14, 33, -13, 33, 39, 24, 8, 26, 27, 30, 19, -13, 13, 7, 67, 67, -20, -40, -50, -17, 22, -18, 18, -1, -2, 22, 35, -33, 5, 3, -56, 9, -51, 6, 15, -74, 86, -11, 5, -11, -3, 95, 8, -44, 29, 1, -26, -54, 101, -84, 33, 45, -34, 78, 61, 36, -20, 44, 10, 74, -84, 5, 13, -26, 35, 80, -43, 126, -75, 4, 23, -64, 54, -42, -20, 68, 87, 44, -63, -39, 4, -99, -27, 14, 58, -17, 91, -10, -39, 82, -13, -47, -44, -22, 34, -17, 23, -128, -53, -2, 12, -8, -5, -29, -19, 64, -42, 13, 28, -42, 28, 67, -65, 63, -47, -9, 37, -66, -2, 56, 51, -3, 40, -22, 47, -2, -24, -12, 25, -68, 89, -27, 18, 121, 59, -27, -46, -11, 6, -61, -15, -46, 2, 15, 16, -34, -17, -18, -3, 27, 55, 40, 31, 22, -19, 2, -72, -14, 89, 94, -24, 24, -96, -119, -65, -13, 40, -69, -62, 10, -49, -60, -52, 27, -75, 8, 42, 57, 48, -15, -70, -117, 82, 71, 83, 34, 87, 22, 2, 22, 2, -114, 33, -46, -32, 99, 10, 4, -44, 92, 67, 23, 42, -127, 33, -35, -11, -25, 54, -15, -31, 26, -115, 18, -6, -112, 3, 39, -63, -66, 0, -51, -39, 26, 1, 37, 7, -25, 20, 5, 38, -21, -2, -9, 108, -77, 16, 12, 24, -5, 14, 88, 59, 1, 8, -5, -20, 36, -124, -50, -23, 38, -67, 0, -10, 4, 1, -42, 0, -64, 1, -10, 7, -32, -80, -17, -13, -113, 107, -54, 71, -24, -38, 11, 21, 24, -122, -6, -31, -67, 56, -68, -12, -23, 0, 2, 37, -114, -1, -19, -1, -72, -91, -16, 32, -4, -22, 118, -17, 41, 45, 32, -14, -27, -45, 6, 18, -62, 21, 33, 30, 14, 5, 39, 17, -10, 25, 12, -15, -2, -4, 17, -9, -2, 38, -66, -50, -18, 18, 41, -21, -24, 7, -18, -15, -20, 61, 18, -1, 10, -24, -67, -16, -17, 2, -21, -25, 21, 7, 24, -8, 25, 47, -46, 122, -11, -48, 20, -39, -60, -30, 53, -64, 14, 59, -82, -10, -10, 37, -11, -1, 26, 1, 2, 41, -58, 87, -18, 20, 5, -36, 59, -52, -18, 56, 80, 49, -115, -16, -2, 26, 20, 22, 28, -6, 24, -69, -6, 6, 8, 7, -8, 105, 49, -13, 46, -86, 46, 31, 70, 10, -25, 51, 27, -14, 12, -14, 5, 28, 8, 95, 56, -4, 43, -18, 7, 3, 70, -5, -9, -105, 21, -97, 2, -28, 67, 27, 18, 109, -52, 88, 32, 49, -1, 18, 25, -35, 61, -47, 13, -124, -52, 71, 8, -31, -6, -31, -32, 60, 62, -38, -9, -83, -107, 126, -22, -16, -47, -78, -55, 30, 16, -24, -27, -45, 74, -58, 50, 6, 15, -7, 91, -127, -2, -8, -55, 81, 103, 14, 27, -16, 26, 125, -13, 98, -80, 68, -4, 35, 126, -59, -103, 58, -31, 92, -2, 16, 42, -5, -58, 45, -48, 64, -106, -14, -62, -30, 36, 10, 9, 50, -5, -6, 33, -39, -10, -16, -71, 83, 38, -10, -70, -77, 42, 35, -128, 64, 37, 49, 60, -9, 33, -33, -37, -23, 7, 8, -30, 19, 35, -17, 16, 17, 6, -36, -22, -82, 54, 3, 6, 35, 12, 57, 0, 12, -32, 58, 108, 7, 49, -8, -38, -79, 30, -1, 7, 15, 32, -20, 16, 68, 16, 22, -41, 33, -25, 13, -42, 49, 14, 2, 60, 41, 8, -25, -21, 46, -43, -26, -9, -15, -10, 36, -19, 0, 36, -12, 17, -7, 13, 16, -49, 79, 59, -8, 10, 59, -12, 15, -125, -18, -8, 7, 6, 10, 39, -37, -64, 29, 0, -50, -6, -24, 15, -32, -28, 27, -12, -44, 84, -30, -10, -51, 5, -59, 77, -26, 3, 3, 9, -39, 39, 100, -33, -80, -7, -36, -83, -30, 19, -21, 59, 44, 86, -29, -4, -112, 28, 8, 97, -24, -37, 13, 110, -2, 16, 72, -7, 9, 22, 10, 37, 32, -20, 66, 7, -72, -127, -5, -11, 50, 22, 1, 5, 74, -74, -118, -36, 123, -8, 14, 29, 21, -71, 54, -94, 11, -27, 45, 95, -126, 70, -39, -60, 52, -36, 73, 23, 48, 12, 36, 63, 33, 68, 88, -24, -65, -4, -2, -20, -9, 48, -63, -121, -66, 40, -128, -22, -13, 11, -105, 20, -30, -127, 26, -21, -92, -108, 60, -14, 56, -117, -113, -123, -46, 57, 111, 124, 82, 58, 25, 5, -57, -42, 116, 9, -24, 16, -17, 86, -116, 68, 10, -35, 124, 66, 53, -51, -65, -10, -14, -12, 26, 5, -51, -15, 12, 25, -3, -33, -54, -20, -116, -10, -25, 117, -1, -24, 80, 55, 4, 112, -8, -67, 0, 41, 12, -31, 102, 36, -3, -69, 96, 18, 126, 116, 27, 16, 114, -28, -82, 113, -57, -119, 123, 63, 126, 33, -1, 29, -17, -28, -13, -4, 85, 39, -5, -53, -53, -63, 5, 29, -76, 27, -23, 3, -70, -31, -46, -48, -15, -93, -13, 50, -1, -6, 0, 26, -34, -22, 3, -112, 39, 48, -12, 73, 18, 38, 17, -18, -15, 35, -10, -72, -19, 13, -72, -21, 19, -58, -17, 70, 4, -32, -4, 35, 86, 11, -6, 14, 38, 4, 99, 29, 117, -7, -57, 11, 44, 2, 12, -37, 30, 117, 36, 5, 93, -56, 27, -4, -104, -83, -76, -26, 70, -63, 108, 37, 57, 62, -23, 26, -9, 11, -12, 6, 22, -28, 24, 11, 63, 12, 28, 15, 78, -3, 85, -2, -29, 37, -41, -30, -37, 39, -19, -39, 50, -5, 15, 39, 12, 3, -34, 17, 35, 5, -13, 10, -45, 12, 109, 5, 71, -28, -11, 22, 3, 63, 11, -11, 40, -13, 53, 32, -7, 41, 1, -14, 27, -1, -25, 54, 16, -64, 14, 92, 67, 94, -10, 52, 56, 84, 0, 28, 59, 39, -68, 6, -31, 73, -87, -40, 1, 23, 31, -35, -21, 34, -50, 82, -13, 62, 24, 84, 44, -11, 29, 56, -11, -14, 10, 18, 12, -85, -127, -3, -65, 4, 52, -27, 11, -89, 1, -64, -78, -24, -44, -12, -20, -51, 13, 97, -77, 50, 63, -74, -47, 31, 1, -8, 4, 23, -74, -126, 13, 62, 57, -25, -30, -125, -105, 13, 127, 90, 24, 3, 24, 22, -3, 3, 122, -59, -50, 18, -48, -20, -26, -37, 122, 109, 124, -29, -23, -114, -4, -120, -2, 7, -70, 55, -73, 12, -80, -124, -11, 33, 83, -14, 31, 2, 126, 78, -101, 48, -104, 18, 53, -1, -28, 54, 87, -126, 40, 30, -85, -7, 86, -95, 86, 23, -70, 17, 10, -49, 2, 94, -20, 123, -35, -22, 28, -31, -35, -13, 41, 38, -45, -58, 50, 8, 6, -96, 49, 9, -2, -70, 55, 66, -55, 38, -86, 81, -72, -17, -11, -72, 18, 27, 17, 49, -84, -44, -7, 16, 82, 27, -89, -18, 23, -28, 24, 36, -8, -92, -24, 34, -20, 127, -23, 19, -6, 3, 28, 111, 14, -19, 7, 35, 10, 27, 27, 2, 95, 29, 66, -56, -55, 24, -38, 127, -59, 4, 56, -20, -69, 14, -12, 17, -37, -23, -43, 31, -35, -35, -56, 29, -9, -11, 123, 24, 19, -23, -52, -3, 7, -39, 25, 23, 34, 95, -16, 35, -9, 39, -55, -25, -43, 47, 108, -3, -3, 61, 56, -9, 54, 54, -8, 51, -20, 62, -92, -39, 40, -8, 34, 29, -41, 52, 18, 14, 21, -30, 39, 64, 81, -32, 71, 41, 28, -8, -42, -75, 20, -14, 12, -32, 66, 34, -30, -68, 31, -104, -37, 31, 86, 42, 14, 12, 3, -20, 15, -7, 29, -26, -45, -32, -12, 9, 48, -25, 41, -70, 21, -3, 26, 3, 28, 41, 31, -6, 60, 76, 126, 5, -14, -32, -42, -36, -3, -3, 4, 18, 3, -6, 51, 45, -60, 104, -41, -8, 64, 7, 10, 125, 61, 6, -3, 43, 5, 9, -126, 83, 13, -126, 24, 51, 33, 118, -28, -25, -127, -13, -20, 96, -27, 15, -124, 21, -75, 86, -11, -9, -9, 40, -17, 111, -52, -94, -126, 26, -3, 72, 7, 116, 55, 30, -2, -119, 127, 126, 32, 9, -77, -1, -50, 24, 21, -55, -125, 6, 99, 13, -12, -3, -53, 26, 106, 113, 125, 125, -51, -12, -3, 2, -46, 69, -35, -1, 57, 46, 65, 19, 43, -39, -44, -24, 26, -4, 0, 26, 28, 64, -22, 5, 32, 36, 1, 16, 3, 69, 18, -52, -20, -36, -56, -22, -19, 21, 75, -70, 56, 15, 23, -4, -50, 85, 48, -46, 43, 64, 53, -4, -46, 19, 35, -23, 18, 27, 13, -35, -4, 127, -50, 7, 52, -41, 3, 31, 29, -9, -19, -94, -22, -30, 58, 74, -53, -22, -21, 0, -43, -6, -58, -3, 115, 10, 93, -71, 46, 10, -38, -19, 49, -60, 6, -30, 60, -22, 62, 24, 23, 63, -22, 5, 57, -8, 64, 106, 28, -80, 112, -50, 57, -122, -128, 47, -12, -51, -10, 4, 1, -124, -11, -87, 30, -36, -10, -36, -21, -19, -125, -76, 53, 104, -125, 32, 33, -64, 64, 6, -14, 15, 94, 12, -69, 2, 8, 0, -51, 28, 34, -124, -21, -49, -70, -71, 54, -56, -2, 45, 70, -3, 127, 87, 101, -10, -28, 100, 116, 19, -14, 43, 19, 100, -113, -44, 52, -8, -90, -7, 15, 36, 39, 5, -79, -27, 8, -40, 24, 93, -39, -3, 40, 56, 57, -33, 3, 48, 81, -41, 7, 111, 44, -62, 51, -126, -51, -111, 40, -35, -122, -49, 70, 75, 84, 29, -72, -40, -119, -3, 14, 61, 127, 14, -38, -23, -26, -127, -116, -122, -121, -96, -5, 40, 40, -12, -112, -1, 118, -102, 16, 26, -18, -34, -25, -95, -40, 19, 47, -128, -18, -115, -23, -48, -44, -99, -41, 30, -111, 4, -7, -16, -52, -45, -16, -88, -115, 50, 59, -41, -105, -121, 108, -42, 77, -109, -116, -51, -60, -25, 2, 59, 55, 78, 104, -70, 23, 85, -123, 52, -2, 2, 26, -75, -14, 50, 14, 21, 3, 85, -9, -38, 28, -72, 60, -116, 25, 37, -28, 41, 69, 19, -80, -53, 12, 32, -87, -5, -48, 9, 80, 81, -79, -74, 37, 116, -45, 41, -28, 19, -40, -103, -117, 51, -44, 41, -80, 79, -61, 69, 10, -41, 15, 83, -35, -58, 65, -21, 32, 127, 62, 1, -1, -56, -15, 13, 37, -50, 11, 8, 25, 11, -90, 16, -12, -37, -116, 77, -22, -62, 3, 45, -12, 34, -43, 27, -50, 41, 31, -66, 36, -13, -9, 3, 104, -11, 42, -25, -34, 17, 37, 30, 22, 1, 19, 26, -9, 27, -106, -41, 97, 37, -16, 53, -10, -48, -10, -17, 52, 18, 62, 38, -24, 48, -8, 34, 96, -57, 27, 23, -18, 56, 105, -38, 63, -36, 51, 53, 82, 79, -22, 64, -12, 28, 37, 50, 91, 59, 5, 12, 39, -19, 73, 38, 63, 26, 57, 35, -33, 124, 63, 49, 68, -6, 34, 63, 49, -43, 42, -39, 5, -34, 68, 65, 61, 52, 24, 36, 46, 63, 45, 92, 22, 22, -46, 24, 11, 73, -30, 127, 15, 47, 38, 28, 43, -9, -11, -42, 0, -9, -14, 56, -103, 9, 27, 15, -22, 65, -28, -18, 6, -43, 23, -25, 31, 54, -23, -41, -29, 27, -9, -10, 29, 25, 116, 46, -84, 58, 19, -37, -6, 29, -20, -30, -8, 10, -59, -20, -26, -27, 97, 64, 117, -7, -61, 15, -14, 47, -61, -37, 36, 82, 18, 61, 17, 23, 30, -40, -65, -76, 0, -72, 59, 43, 49, -7, 20, 22, 101, 46, 31, 14, 72, -41, 24, -26, 7, -71, 14, 66, -6, -35, -23, 15, 32, 27, -34, 2, -12, -26, 44, -64, 33, 47, 23, 41, -7, -8, 17, 7, -59, 44, -16, -18, -37, 4, -91, -4, -38, 9, -31, 22, 57, -17, 68, 1, 24, -23, 43, -11, -18, 2, -72, 3, 11, 29, 48, 39, -34, -22, -36, -4, 13, -35, 43, 41, -57, -125, 97, -41, -10, -57, -32, 10, 15, -10, -41, -62, -17, 20, 33, -95, 17, 30, 6, -46, -22, -24, 51, 89, -50, -78, -17, -24, 34, -124, 51, -35, 58, -6, 14, -27, -51, -11, 6, -9, -32, -22, -16, -69, -41, 7, -50, -61, 45, -47, 39, 17, -12, -7, -12, -25, -11, -7, -30, -9, 57, -125, 20, 14, -66, 73, -17, 18, -57, -20, 28, 58, 124, -31, -18, 14, 11, 38, -104, 65, -95, 125, -81, 24, 26, -31, 25, 40, 127, 17, -27, 62, -13, -38, 120, 22, -29, 54, 56, -99, 16, -33, 32, -39, -5, -1, 31, 17, 10, -26, -52, -64, 9, 24, 38, -9, 28, 99, 30, 56, -18, 39, -85, -70, 55, 16, 118, 20, 4, -97, -18, -3, 6, -34, 69, 14, 107, -4, -30, -38, 24, 26, -114, 54, -36, -21, 33, -40, -43, 29, -19, 20, -9, 114, 30, 6, -65, -1, 75, 10, 12, -21, 41, -5, 113, -39, -12, -105, -43, 78, 74, 18, -53, -28, 9, -25, -2, 23, -9, 84, -26, -5, -21, -44, -49, 46, 63, -1, 2, 90, 72, -63, -44, 59, 18, 64, 13, 49, -21, -21, 64, 106, 30, -26, 73, -18, -83, -24, -77, -6, -47, 27, -34, 8, 47, 4, -76, -117, -28, -22, -32, 70, 94, -20, 35, -22, -12, 10, -28, 72, -66, 103, 100, 46, 20, -42, 50, 21, -16, -35, 49, 104, 56, 111, -48, -31, -1, -17, 20, -23, -12, 12, -36, 32, -2, 9, 14, 77, 14, 17, -11, -38, -88, -54, 30, -15, -37, -15, 27, 21, 29, -68, 14, -91, -6, 10, 13, -82, 11, 19, 124, 38, 80, -5, 6, -15, 7, 22, -4, 32, 20, -55, 24, 90, 5, -15, 18, -70, 25, -16, 52, 2, -15, -39, -17, 14, 47, -4, 41, 3, 45, 20, -26, -32, -66, -37, -98, 65, -17, 24, 45, 22, -34, -36, -68, -13, -24, 18, -29, -125, -1, 25, 13, -68, -82, 20, -85, -101, 13, 19, 4, 37, 28, -23, 47, 14, -50, 43, -46, 52, -12, 82, 31, 77, 101, -28, 42, 27, 81, -117, -19, 14, 2, -69, 27, 23, -27, 127, 59, 101, 90, -4, 40, 26, 3, 64, -23, -53, 31, 42, 51, 8, -109, 35, -41, 25, 30, 42, 43, -54, -22, 38, -72, 11, 3, 38, 31, -69, -17, -1, -85, 15, -24, 17, 29, -1, -13, 11, 44, 33, 115, -36, -11, -39, 112, 27, 20, -11, 9, -5, -40, -21, 14, -31, -9, 28, -24, 22, 21, 19, -27, 19, 49, 9, 7, -79, 79, -81, -6, 48, -75, 72, -72, -62, 19, 4, 38, 18, -17, 54, 107, 60, 18, 14, -37, -9, 28, 52, 12, -33, 6, 50, 127, 42, -67, 46, 37, 43, -18, 20, 74, 17, -10, 56, -30, 66, 27, 36, 27, -24, -34, 55, 12, -32, -26, -46, 63, 21, -66, -14, 98, 16, -3, 12, 29, 28, 17, 58, -5, -2, 23, 8, -10, 0, -23, 29, 28, -79, -10, -21, 32, -15, -29, 47, 5, 31, -49, -44, 21, 58, 81, -92, 48, -13, 119, 52, -6, 19, 11, -26, 13, -57, 23, -16, 30, 34, 35, -10, -28, 4, -9, -6, -10, -47, -35, 7, -33, 28, -28, -3, -3, -3, 19, 11, 30, -7, -27, -14, 0, -90, 8, -62, -44, -13, -5, -2, -27, 1, 34, 67, 13, -37, -15, 32, 33, 15, 22, -113, 28, 18, -6, -27, 31, 46, 10, -24, 60, -2, -114, -7, 8, 8, 39, 14, 124, 55, -6, -30, 10, -35, -5, -18, -1, -11, -7, -11, -16, -51, 49, -30, 64, 3, -10, -38, 2, -3, -2, 27, 22, 15, 46, 41, 0, 6, 4, 54, 8, -5, 2, 7, -10, 108, -43, 11, -30, 15, -47, 51, 26, -21, 71, 22, -33, -54, -29, 120, 11, 106, 1, 10, 55, 53, 38, 11, 19, 42, 45, 5, 20, -39, 44, 120, -68, 51, 127, 24, 66, -28, 60, 8, 10, 32, 17, -8, 35, -6, -3, 57, -32, -8, -51, 8, 24, -63, 47, 28, 15, 18, -8, -70, 81, 10, -125, 13, -86, 62, 37, -27, 28, 127, -8, 18, 56, 6, -108, 22, -36, 10, 14, -10, -45, 19, 72, -27, -53, -12, 42, 6, 7, -2, 127, 1, -41, 13, 3, -81, -25, 1, -11, 45, -107, 62, 18, 54, 22, 4, 35, 34, -32, -120, -106, 18, 38, 100, 11, 29, -56, 116, -37, -23, 122, -1, -78, 31, 23, -4, -2, 42, -28, -57, 97, -63, 12, 56, -4, -127, -14, -45, 44, -65, 103, -52, -67, 7, -11, 23, -38, -32, -3, -4, -24, -38, 31, -20, 20, 42, -17, 79, 34, 29, 60, -71, 71, 49, 101, 35, 22, 19, -60, 40, 11, 25, -34, -102, 8, 62, -3, 17, -9, -57, 47, -26, -44, -29, -43, 89, 121, 19, 49, 71, 6, -61, 15, 100, -124, -20, 0, 37, -21, -56, 21, 59, 26, 15, -40, -34, 53, 11, 60, 15, 63, -3, -13, 16, -34, 57, -13, 61, -15, 38, -3, 33, 7, 36, -1, 72, -59, 18, -90, -6, 78, 67, 14, 20, 34, 37, -12, -47, -34, -123, 19, 53, -61, -4, -38, -37, 6, 4, 32, -46, -13, -18, 0, 27, -73, 27, -11, -47, 63, 24, 66, -124, -64, -5, 34, 6, 25, 44, 0, -42, -26, 39, 95, -25, -45, 87, 10, -33, -30, -18, -71, -3, 6, 31, -6, 10, -21, -60, 39, 64, 24, -11, 102, -20, 127, -70, -119, -69, 103, -17, 42, 6, -81, 43, 26, -12, -33, -72, 51, 55, 17, -57, -3, -12, -24, -22, -60, -18, -57, -22, 22, 32, 101, 40, -47, 47, -1, -38, -15, -56, 58, 57, -36, -7, 51, -6, -12, -66, 33, 73, 19, 26, -6, 77, 74, -46, -50, -16, 125, 47, -30, 41, 115, -91, -11, -4, -47, 127, -121, 112, -83, 25, 22, -32, 31, 6, -78, -84, -44, -15, -25, -1, 3, -50, -46, -5, -28, 64, -74, 94, 8, 16, 28, 30, 41, -11, -17, -4, 57, -69, -2, -32, -15, 12, 96, -96, -15, 61, -38, -5, -20, -37, 61, -63, -50, -60, 34, 44, 53, 37, 47, 18, 22, -24, -19, -54, -8, -7, -60, 56, 2, -41, -22, 70, 33, 83, -46, -71, 35, 124, 22, -38, -43, -70, 7, -62, -22, -51, 15, -46, -6, -25, -34, -54, 51, -22, -29, -13, 117, -53, 20, -9, 23, 27, -13, 127, 68, 11, 41, -31, 18, -50, -53, 29, -109, -2, -18, 13, -43, -125, 23, 15, -6, -25, -19, -95, 4, -106, 25, -24, -14, 21, -20, 28, 2, 38, -92, -86, 47, 22, 108, 29, 118, -17, 22, 3, 61, 4, -3, 28, -125, 10, 81, -6, -19, 22, 22, 75, 16, 20, -26, -14, 46, 89, 99, 29, 43, 20, 29, 87, -57, 108, 16, 39, 42, -39, 16, 69, -65, -11, 6, 12, -19, -6, -60, 11, -32, -21, -41, -23, -128, 50, -11, 24, -44, 17, 7, -1, -20, -91, 33, 47, 10, -6, 17, 57, 42, -30, -41, 12, -50, -4, 22, -16, -31, -21, 10, -69, 20, -29, -51, -32, -6, -15, -50, -1, 13, 9, 38, 33, 68, -12, 58, 115, 18, -68, 12, -127, -37, -8, 39, -4, -70, 15, 31, -3, -17, 58, -56, -19, 25, 3, -22, -92, 63, -4, 122, -56, -9, 55, 39, -80, -90, 40, 7, -6, 59, 26, 38, 0, -46, -60, 43, 34, -127, -71, 32, -17, 29, -80, -33, -11, -16, -7, 19, -5, 52, 25, -16, 13, 108, -13, 53, -28, 11, 106, 99, 35, -113, -103, 9, 4, -6, -67, 37, -22, 1, -13, -9, -34, -9, -7, -20, -12, 5, 84, 64, -35, -8, 48, 31, -20, 22, 61, 95, -55, 17, 32, -4, -57, -120, 5, 30, -31, 85, -27, 22, -8, 101, -121, 32, 33, -117, -48, -15, 18, 38, -13, -57, 30, 79, -127, -50, -108, -56, -126, -121, 6, 36, -12, -9, 2, 66, 85, 21, -48, -6, 14, 44, 18, 97, -127, -20, -128, -85, 31, 45, -54, 25, 22, -105, -127, 43, -10, -37, -28, 32, -126, -13, -14, 73, 90, 127, -28, -13, -73, 97, -49, -52, -17, -44, -9, -9, 11, -124, 0, -59, -69, -18, -27, 19, -25, -120, 56, -32, 23, 18, 41, -6, -2, -57, -76, -9, -13, 70, -86, -92, 6, 39, -109, 28, -14, 70, 37, 37, 53, 42, 90, 24, -15, -120, -14, -11, -10, 8, 22, -17, -61, -9, -19, 96, -128, -68, 93, 77, 6, 36, 30, -128, 39, 1, -6, 8, 0, 4, -83, -124, -86, 6, -103, -58, 43, 19, -2, -39, -109, -111, -41, -107, 37, 1, 30, -46, -28, -23, 61, 49, -38, 31, -35, -96, -126, -38, 54, -24, 28, 19, 66, -126, -79, -119, 37, 7, -14, 24, -27, -59, -113, 55, -56, -15, 24, -7, 5, 14, -92, -52, -43, 91, -23, 2, 93, -16, -93, -66, -34, -11, 46, -48, 3, -75, 47, 8, -17, -40, -87, 113, 121, -117, 19, 16, 74, 106, 29, -8, -1, 54, 8, 24, 33, 59, 64, 38, 68, -89, 72, -26, 9, -14, 20, -34, -85, 33, 33, 48, 17, 120, -11, 16, 19, 80, 37, -18, 11, 8, 8, 5, -41, -76, 7, 31, -42, -14, -6, -50, 114, 34, 45, -48, 66, 47, -8, 53, 53, -66, 15, -59, 2, 24, -49, -17, 14, -22, -62, 73, 20, 5, -55, 57, 83, 91, 59, -49, 22, 64, -44, -4, -60, -114, -88, -62, -23, 34, -29, 110, 123, 117, -49, 1, 124, -67, 123, -52, -45, 0, -27, 13, -76, -44, 11, -14, 16, -9, -92, 33, -72, -125, -1, -41, -122, 13, -56, -29, -44, -121, 27, -127, 9, 63, 47, -47, 23, -11, -2, -119, -39, -32, -61, -36, -11, -32, -27, 98, 61, -122, -84, -23, 106, 114, 42, 11, -29, -9, -74, 124, 15, -11, 29, 67, -9, 12, 31, 68, 23, 13, -60, -46, 40, -37, -41, -113, 70, 37, 7, 8, 92, 34, 46, -21, 0, 13, 63, -50, -57, 8, -22, 13, 35, -52, -35, -11, 24, -30, -47, -1, 56, -35, -11, -123, -26, 93, 4, -28, -28, -56, 56, -55, 26, 14, -41, -7, -14, -19, 35, 16, 21, -5, -19, -10, -26, -70, -5, 26, -5, 62, -15, -15, -97, 49, 56, 63, -30, 2, -103, 15, 22, -6, -30, 18, -55, 46, 16, -16, 41, 78, -18, -53, 21, -11, -73, 27, -4, -19, 27, -21, 37, 12, 50, 5, 0, 13, -26, -60, -39, -61, -24, 75, 36, -26, -28, 26, 18, 10, 25, -47, -4, 35, 7, 21, -3, -51, 28, 16, -23, -44, 15, -35, 89, -36, -81, 73, -7, 22, -34, 6, 24, -17, 72, 90, 92, -35, 43, -14, 20, -26, 104, 78, -22, 39, 29, 38, -29, 15, -24, 55, -23, -18, 10, 51, -12, 84, 22, -10, 10, 127, -27, 127, 17, 6, -6, 54, 0, 117, 49, 8, -13, 114, -15, -28, 4, 8, -28, -60, 125, -46, -60, -15, 10, 43, -23, -121, -27, 20, 50, 25, 72, 61, -98, 35, -21, 39, -7, 81, 27, 10, -23, 41, -123, 97, -76, 65, 10, 125, -120, -86, -73, -4, 73, 109, -126, 50, 94, -47, -74, -8, -83, -50, 1, 16, 46, -34, -62, 24, -25, -13, -58, -117, -108, -28, -8, 63, -10, 56, 25, -65, 41, 53, -46, -47, -109, 98, 7, 72, -7, -38, 47, -76, -126, 42, 124, -10, 65, -52, -62, -25, -108, -101, 14, 3, 75, -9, 4, 86, -124, -126, 72, 35, -2, 21, 26, -66, 43, 30, -123, -28, 46, 3, 29, -49, -96, -79, 40, -43, -98, 60, 27, -125, 72, 1, 63, -49, -3, 22, -49, 23, 27, -32, -20, -21, 52, -20, -49, -11, 0, 24, -4, 20, -67, 12, -23, 6, 17, 1, -10, -27, 5, -15, 3, -35, -5, 12, -14, -33, -20, 35, -68, -27, -66, -58, -14, 52, 40, -5, 38, 96, 32, 11, -47, 27, 0, 44, -30, -70, -23, -33, -46, -58, 66, -19, -14, 1, -24, 25, 12, -99, 30, 28, -14, 36, 19, 27, 10, 51, -47, -118, 11, -44, 16, 30, 14, -16, -12, -52, 1, 4, 4, 9, 27, -26, 47, 15, 7, -26, 11, 37, -30, 7, -22, -13, -87, -56, 118, -31, 12, -61, -65, 22, 127, -69, -111, 115, -57, 86, 121, 66, 108, 61, -64, 52, -25, 33, 45, -101, 123, -19, 20, -5, -34, 61, 62, -14, 63, 55, 18, -31, -89, -60, 68, 63, -31, -46, 44, -44, 23, -125, -23, -122, 103, 44, -102, -5, 124, -90, -71, 12, -5, 77, 40, -47, 54, 52, 47, 9, -53, -77, 33, -30, 23, 49, 39, -126, -34, 2, -33, -123, 30, 48, -69, 11, -87, -109, -60, 27, 30, -26, -26, -8, 56, 8, 0, 25, -1, 106, 1, -35, -98, 79, 20, -37, 0, -79, 64, -2, -99, -123, -65, 28, -31, -63, 48, 40, 68, 55, -32, -117, -2, -75, -67, 3, 111, -36, 7, -53, -63, 125, -73, 121, -74, -11, -63, -74, 54, -20, 21, -91, 118, 30, 16, -33, -128, 69, -3, -64, 19, -15, -100, -14, -127, -84, -86, 26, -37, -14, 13, -20, -46, 31, 34, 43, -4, 70, -128, -60, 19, -19, -75, 48, -79, 84, -34, 127, 14, -119, 82, 82, -63, 88, -28, -127, 59, -35, -127, 48, 11, -116, -126, -3, -110, 24, -78, -4, 46, -25, -76, -29, 53, 10, 47, 16, 46, 5, 34, -18, -45, -30, -2, 88, 68, -4, -40, -21, 24, -112, -115, -13, 5, -47, 21, -32, 109, -120, -51, -8, -47, 127, 66, 28, 4, -76, -22, -10, -4, -44, 5, -77, -12, 12, 35, 115, -92, -39, -123, 8, -106, 17, 124, 21, 9, 57, 42, -11, 49, 36, -115, 104, 18, -17, -20, -63, 47, 29, 19, 22, 82, -73, -128, -66, -102, 18, 20, -74, 58, -22, -115, -121, -121, -66, -74, 4, -25, -34, 67, 42, -3, 0, -68, 50, 16, 47, 74, 30, 125, -49, -14, 105, -32, 97, -30, -67, -20, 10, 15, 4, 2, -18, -62, -43, 15, 8, -61, -4, -33, 7, -46, 71, 46, -5, 66, -24, -1, 86, -99, 27, 78, 41, 15, 14, 5, 100, 58, -50, -32, -35, -32, 89, 32, -93, -7, 69, 18, -43, 36, 97, -29, 68, 41, 77, -25, 65, 67, 89, 20, 25, 28, -35, -16, -10, 125, 101, 126, -53, 39, -112, 120, -23, 8, -10, 9, -38, 43, 4, 127, 43, 51, 86, 5, -79, 38, -14, 36, 9, 29, 46, -9, 7, 34, -31, -89, 28, 18, 50, 84, -67, -12, -12, 23, -91, -95, -28, -82, 44, -40, 10, 1, -10, 0, 12, 46, -5, -40, -76, 11, -27, -42, -22, -5, -71, -39, -89, 96, -56, -89, 21, 73, 72, 1, 15, -122, 73, 13, -31, -16, -57, -27, -10, -27, -51, -71, -18, -48, 0, -5, -37, -6, 81, -7, 19, -25, 13, -28, 24, -82, 90, -73, -66, 38, -11, 17, 19, 65, -30, 80, -23, -68, 65, 16, 18, 66, -17, -58, -52, -71, 14, -1, -2, 39, -2, 55, 10, 21, 10, 3, -110, -53, -10, 39, 36, 84, -45, 41, 28, -10, 22, 35, 8, 23, 32, -40, 37, 34, 39, 15, 7, 22, 70, 35, 18, -40, 5, -8, 33, 31, -36, 8, -6, -24, 25, -23, 6, 12, -79, -16, -21, 126, 54, 7, 4, 66, 18, -22, -4, 35, 40, -40, 68, 41, 13, 43, -8, -7, -34, 39, 21, 24, 6, 32, 16, 5, -38, -126, -36, 26, 61, 61, -1, 78, -35, -19, -44, 30, 12, -40, 12, -3, -13, -12, 48, 32, 32, 42, -4, -18, -26, 22, 11, -108, 88, 82, -39, 65, 39, 35, -16, -95, 29, 63, 104, -17, -18, 12, 33, -81, 1, 103, 16, -39, 31, 6, 44, -102, 97, 10, 48, -38, 124, 34, 10, 23, -66, -35, -102, 19, 81, 87, 34, -27, 44, -14, -44, 1, -25, 27, 125, 10, -110, -27, 5, 2, 10, -60, -28, 15, -75, -13, 52, 29, -17, -47, 10, -15, 98, 43, 1, -25, 37, -110, 76, -20, 24, 20, 24, 45, -50, -35, -10, 80, -17, -62, 47, 17, -31, 16, 2, 77, 94, -108, -43, -12, 44, -124, -31, -15, -78, -84, -114, 97, -47, 91, 33, 23, -104, -24, 127, 28, 61, -109, -53, 68, -26, -108, -12, -88, 75, -10, 87, 99, 28, 32, -125, -48, 121, -70, 56, -61, 37, -90, 123, 87, -43, 3, -14, 96, -6, -4, 91, 35, 11, 66, -38, -108, -21, -7, -5, 96, -34, -52, 69, 28, 33, 82, 22, 36, 19, 6, 10, 47, 86, -122, -11, -13, -66, 41, -24, 22, 89, 66, 24, -24, -11, -25, -28, -67, 113, -110, -128, -109, -69, 102, 114, -8, 19, -51, -12, 120, -78, 41, 9, 125, -118, -11, -7, 60, 0, -68, 28, 124, -14, 50, 24, -37, 56, -21, 6, 26, 53, 0, 19, 19, -30, -60, -53, 52, -26, -6, -19, -48, 37, 20, -17, -9, -22, 69, 31, -27, -10, 7, 25, -65, -52, 39, -40, -80, 29, -32, -78, -4, 13, -26, 22, -45, 94, -24, 1, -12, 17, 73, 116, -34, 69, -39, -7, 7, -57, -45, 38, -70, 62, 7, -12, 55, -35, 66, 48, -21, 48, -5, 98, -114, 81, 14, -127, 25, -17, 78, -53, 124, 12, 65, -23, 15, -42, 79, 7, 0, 45, -20, 62, -20, 25, 35, -34, -34, -104, 70, 74, 79, -26, -16, -114, 31, 79, -23, -18, 15, 119, -110, -54, -83, -7, -8, 57, -50, 3, 12, 48, -6, 23, -111, 9, -54, 19, -4, 14, 19, -26, 37, 84, 36, -12, -16, 39, -95, -65, -20, -23, -15, -7, -24, -3, 0, 75, -23, 13, 6, 119, 5, 65, 9, -90, -112, -22, 30, 54, 26, -58, 39, 116, -37, -22, -54, 44, -1, 40, -31, 6, 41, -35, 48, 79, -86, 26, -8, -12, -10, -4, 77, 59, 2, 58, -84, 14, -85, -7, -11, -22, 5, 3, -110, -53, -127, -23, -3, 93, 11, 19, 19, 13, -126, 29, 14, -28, 42, -33, -50, 35, 94, 3, -56, -88, -115, -9, -127, -74, -83, 34, 26, -21, -6, -5, -73, -10, -25, 68, -77, 35, -5, -114, 58, -64, 21, 2, -7, -111, 26, 1, -80, -35, -116, -124, -40, 87, 58, -30, 18, 121, -125, -25, -20, 64, -3, 3, -44, -24, 59, 125, 10, 29, 26, 33, -7, -43, -42, 88, 44, 26, -84, 1, 5, -65, -50, -31, 100, -27, 37, 28, -14, 6, -61, -14, -106, -6, 16, 86, -124, -9, -91, -33, -27, -122, -28, -8, -32, -99, -75, -1, 22, -69, -33, -1, -45, -24, 38, -44, 45, -51, -127, -5, -4, 111, -119, 3, -106, -84, -1, 30, -6, 16, -11, 18, -28, 18, -11, -20, 48, -65, -29, -63, -104, 16, 60, -18, 6, 6, -63, 6, 28, 16, -28, 14, -5, -25, 2, 3, 68, 80, -18, 101, -51, -126, 56, 61, -22, 37, 1, 106, 4, -14, 18, -12, 13, 77, 13, -47, 36, -31, 10, 12, -15, 5, -7, -7, -17, 7, -46, 5, -21, 81, -19, -31, -103, 63, -27, -32, 3, 120, 65, -21, 35, -12, -34, -26, -1, -33, 26, -5, 35, -41, -13, -27, -78, 19, -5, 15, -43, 9, 22, -12, -64, -39, -16, -49, 106, -13, 13, -6, -18, 0, -38, 12, 5, -44, -26, 116, -63, 76, 41, 19, -47, 1, -5, 39, 1, 110, -11, 59, -31, -33, 13, -31, -31, -43, -51, 48, -3, -76, -49, 10, 94, 11, -18, -1, -31, -94, 14, -17, 35, 3, 55, 8, 46, -23, 31, -4, 31, -15, -41, -50, 19, 47, -35, 80, -89, 27, -36, -12, -32, 49, -64, -68, 62, -75, 11, 15, 9, -29, 3, 30, -36, 8, -57, -40, 50, 19, 59, 39, -23, -60, 4, 2, -4, 3, -28, -2, 125, 10, 5, -21, -77, 42, 71, 20, -18, 17, -8, -24, 20, -17, 73, -30, -34, -71, -68, 40, 1, -1, 30, 47, -16, 84, -16, 16, 99, -13, -1, 4, 127, -37, 15, 15, 27, 35, 1, -23, 8, -10, -5, 48, 22, 9, 120, 110, -56, 6, -52, 67, 110, -32, 47, 21, -42, 39, -34, -2, 0, 8, 32, -11, 1, -8, 29, -34, 44, 50, 1, -8, -44, -32, 61, 40, 24, -17, -4, -21, 10, 22, 28, 51, 31, -34, -56, 22, 0, -9, -17, -5, -48, 2, 34, -3, 37, -23, -8, -6, 6, -105, -21, 14, 3, -53, 10, -12, -47, 51, -15, 17, -45, 20, 25, -19, 17, 10, 6, -59, 5, 35, 25, 39, 10, 59, 63, 5, -22, 59, 96, 22, 43, 33, -13, 10, -37, -20, 14, -41, 9, 25, 40, 39, 32, -27, -45, -43, 8, 28, -25, 19, 12, 22, 31, -76, -46, -30, 32, -5, -103, -11, 0, -19, 109, -115, -38, 31, -54, 76, -48, 9, 81, 38, -80, 8, -56, -44, 117, -123, -69, -85, 3, -47, -42, 87, 40, 64, 124, -84, -128, -105, -41, -122, -38, 18, -21, -90, -64, 19, -34, -78, -125, -51, -20, -7, -51, -126, 9, 13, -29, -114, 61, 126, 13, -54, 83, 21, 5, 30, -27, -113, -83, -54, -65, -66, 17, -15, -86, -127, -36, 20, 19, 17, -58, 37, -13, -24, -22, -125, 81, 12, -11, 84, -80, -127, -38, -73, 43, -37, -30, 53, -114, 56, -2, -52, -40, 8, -12, 17, -77, -89, 46, -13, 17, -95, -73, -27, -32, 31, -115, -66, 24, 27, -3, 0, 27, 71, -72, -36, 37, -10, -73, 15, -35, 14, 7, 60, -17, -63, -11, 0, -103, 23, -94, 82, 20, 71, 7, -38, -51, 18, 5, 99, -47, -114, 7, -38, -58, 18, 31, -33, 13, 8, 62, -21, 109, 47, -126, -10, 71, -12, -7, 11, -2, -5, -2, 121, 94, -53, -9, -25, -20, 30, -7, -127, 67, -84, -118, 22, 34, -32, -106, -90, -91, -29, -75, -21, 85, 0, -61, 2, -58, 16, 14, 68, 99, 5, 50, -12, -11, -5, -15, -37, 10, 20, -29, 25, 20, 43, 24, 93, -18, 5, -12, -20, -13, -21, -78, -68, -5, 82, -43, 13, -49, -26, -11, -12, -40, 40, -12, -53, -21, -23, 41, 94, -41, -42, -96, -32, -62, 11, 116, -9, 18, 24, -64, -97, 8, 71, -117, 37, 40, 34, 5, -48, 49, -7, -59, -16, 36, -58, 54, -38, -37, -68, -2, -33, 23, 9, -53, -126, -91, -87, -49, -126, 42, 29, 52, 69, 35, 54, -11, 55, -5, 40, 6, 62, 2, 28, 20, 28, 0, 16, -53, -48, -7, 57, 11, -17, 2, -89, 1, 42, -77, 31, 10, 47, 97, -52, -45, 37, 70, -37, -85, -37, -11, 6, 68, 127, 2, -17, 28, 6, 35, -9, 27, 34, -25, 17, -45, 46, -32, 98, 55, -18, 25, -8, 1, 7, -24, 2, 64, -6, -48, -49, 57, -37, -64, -4, 1, -81, 58, -44, 44, -40, -27, -52, 69, 8, -8, 7, 7, -62, -25, -1, -69, 117, 16, 15, 39, -22, -5, 12, 6, 126, -6, 0, 16, 24, -60, -28, -3, -8, 66, 53, 15, 72, 23, 71, -45, -105, 2, 26, -111, -82, -69, -9, -83, -5, -22, -120, 118, 94, -15, 125, -40, -81, -35, -6, 16, -51, 119, 28, 40, -127, 18, 8, 42, 22, -125, 36, -30, -58, -62, 48, -1, -96, 57, 86, -28, 4, -26, 87, 14, -41, -39, -45, 11, 41, 55, 86, 33, 30, 74, -18, -24, 23, 5, 30, -25, 38, 34, -60, -75, 3, 84, 18, -29, -96, 9, -12, -6, 1, -21, -4, 62, 33, 21, -18, 71, 65, 9, -46, -19, 31, -24, 5, 57, 47, -1, 32, -27, 22, 16, 51, 38, -54, -61, 26, -17, -10, -1, 20, -44, -27, 15, 16, -22, -36, 26, 18, 6, -3, -34, -57, 32, -11, 40, -51, 11, 89, 51, -10, 25, 18, -117, 61, 54, 35, -61, 21, -39, -3, 23, 65, 55, -8, -21, 44, -61, -41, 6, 3, -5, 4, -7, 0, 89, 9, -10, -65, 64, -12, 23, -34, 11, -29, -92, 7, -90, 50, -92, 53, -37, -31, -6, 59, -15, 4, 18, -29, 70, -55, 53, 13, -8, -121, -7, -33, 10, 28, 8, -17, -26, 14, -23, -71, -7, -51, 86, -4, -12, -21, -3, 33, 19, 19, -39, 12, -69, 51, 24, -96, 8, 107, -17, -41, 105, 11, 16, -17, -71, 4, 65, 0, 29, 87, -24, 89, 90, 73, -20, 18, -9, 48, -55, -22, -1, -43, -26, 47, 1, 79, 13, 68, 18, -11, 90, -3, -11, -19, 20, 107, -1, -8, -45, 4, 31, -5, 9, 41, 9, 71, 42, 79, -1, 6, -20, 13, 2, 5, -8, -10, -11, -25, -35, -19, 15, 26, -10, 47, -14, -37, 5, 10, -21, -21, 98, -4, 62, -14, -30, -12, 25, 35, 39, -79, 25, -61, -21, -4, -79, -20, 36, -98, 82, 3, -2, 36, -2, -23, -1, -39, -20, -84, 49, 104, 10, -32, -35, -20, 19, 51, -16, 10, 24, -87, 90, -25, 0, 9, 25, 32, 37, 40, -51, -16, 24, -4, 4, -39, 49, 54, 48, -3, 44, -38, 12, 98, 28, -40, -79, 41, 41, 17, 123, 34, 25, 27, -49, -48, -29, 51, 16, 19, -39, 57, 87, -18, 30, -22, -98, -45, 56, 18, 30, -6, -39, -64, 57, -109, 36, 15, 37, 0, 42, -15, -75, -13, 5, 42, -54, -18, -118, -28, -101, -5, -78, -9, 43, 66, -24, 8, -22, -20, -47, 12, 42, 30, 23, 6, -19, -9, 15, 44, 58, 31, -44, -21, -25, -69, 26, 3, 57, 0, -4, 12, 29, 39, 18, 14, -2, -81, 8, -26, -66, -2, -3, 14, 3, -19, -27, 65, 17, -29, -20, -24, 40, 35, -89, -8, 24, 57, 37, 31, -54, 16, -40, 13, 106, -18, -14, -36, -18, 17, 88, 44, -7, -21, 18, 28, 35, 16, -3, -18, -9, 16, -1, 36, 16, -31, 37, 49, -48, -33, 32, -12, 12, 25, -121, 92, 6, -1, 19, 22, 18, -7, -15, 28, -7, -79, 69, 35, -62, 113, -28, 52, -39, -24, 27, -11, 14, 33, 21, 40, 20, -4, 4, 4, -29, 74, 49, -5, 8, -3, -48, 25, 23, -34, 64, 11, -15, -29, 38, 12, 86, -27, -18, -36, -46, 15, 42, 40, 12, -38, 51, -4, 30, -17, -37, -63, -16, 35, 9, 26, 40, 60, -19, 19, 6, -9, 31, -13, 9, 5, -22, -32, 93, -54, -43, 65, 31, 37, -60, -6, 10, 11, 127, 32, 42, -58, -88, 32, -19, 109, 29, -27, -50, -51, 63, 40, -52, 6, -20, -10, 23, -17, 78, -3, -27, 59, 31, 26, 26, 21, 31, -72, -38, 80, -29, 9, 51, -76, -114, -38, -19, 59, -54, 27, 43, 0, -8, -60, 11, -1, 19, 18, -70, -78, 117, -47, -65, 15, 56, 31, 4, 52, 38, -14, -36, 67, 16, -20, 12, -88, 35, 18, -127, 15, 44, 125, -24, 56, 19, 20, -1, 47, -124, -1, -31, 83, 1, -15, -125, 23, 70, 53, -61, 67, 36, -16, 24, 31, 42, -25, 35, -25, -53, 22, 49, -19, -12, -67, 23, -72, 20, -24, -118, 1, -9, -16, 8, 68, 10, -5, -10, 35, -48, -66, -11, 87, 55, 3, -28, -53, -11, -3, -13, 3, 117, 12, 15, -51, 5, -69, -48, 31, 10, 14, 12, 1, 25, 113, -74, -28, -36, 37, 14, 14, 2, 1, -15, -31, 19, 21, 22, 20, -19, -10, 81, -44, 30, 9, -122, 30, 24, -24, 28, 4, 31, -4, -29, 87, -18, 25, -21, 3, -56, 58, 39, 89, 34, 33, 10, -29, 29, 123, -88, -6, 19, 10, -42, -25, 47, -47, -120, 89, 17, 73, -33, 31, -118, -12, -10, -47, 6, 74, 116, 23, 94, 22, 69, 113, -4, 111, 68, 15, 56, 65, 51, 98, 31, -14, 119, -3, 26, 62, -9, -88, -21, 77, 62, 0, 86, 92, -17, 101, -30, 38, 53, -72, -38, 52, -42, -15, 35, -6, -7, 70, -25, 67, -42, 52, -83, 44, 2, -56, 60, 105, 116, -48, -29, 126, 76, -85, 42, 122, 118, 67, -4, -5, 5, 5, -37, -29, 20, -34, 31, 117, 27, 75, 88, 38, -32, -80, 26, -29, 113, -60, 6, 64, 45, -49, -24, 16, -18, 119, -102, 5, -26, -25, 7, 26, 106, -75, 21, -56, 74, 105, 89, 77, 109, -41, 114, 62, -6, -2, 125, 10, 87, 46, 71, -48, 22, -27, -15, 75, 127, -55, 36, 25, 6, 67, -28, -9, 20, -4, 80, 14, 79, -10, 37, 49, 11, -31, -22, 54, -109, 8, 20, 36, -29, 15, 73, 102, -56, 19, -10, 49, 33, 72, 15, -12, -57, 25, 120, -54, -86, 36, 60, 46, -71, 51, 15, -16, 14, -87, 10, -41, -50, -19, 29, 2, 22, -8, 41, -47, -5, -5, 30, -71, 51, 14, -39, 48, -1, 69, 36, -45, -57, -20, 53, 23, -15, 44, -19, -38, -75, 90, -2, 49, -9, -22, -2, -8, 22, 37, -50, 95, 57, 34, 77, -35, -81, 46, -34, 25, -4, -12, 29, 71, -32, -66, 0, 48, -39, 22, -30, 10, -53, -11, 16, -32, 26, -13, -42, 18, -8, 76, -44, -51, -66, 6, -30, 25, 0, -2, -77, -26, -8, 42, 41, 28, -23, -46, -16, -63, 37, -57, 7, 50, 7, 30, -22, -34, 4, -35, 70, 19, -22, 43, 33, 20, 58, 4, -62, -8, 38, -25, 74, -43, 10, -57, 121, 88, 6, -18, -16, 13, 1, 49, 73, -34, -17, -52, 32, -59, -1, 19, -14, -38, -72, -23, -39, -25, -54, -97, -13, 64, -31, -33, -33, -7, -58, -15, 24, 34, -32, -34, -35, -50, -89, 10, 1, -12, -7, 120, 28, -41, -8, 81, -35, 65, 4, 45, -10, -56, -11, -26, 13, 23, 45, -63, -65, 6, 40, -18, -10, 7, 2, -67, 5, 31, -34, -32, -9, 55, -4, 28, 75, 20, -56, -15, -21, -123, 88, -24, -16, 6, -21, 7, 14, 15, -112, -38, 35, -42, -33, 30, 122, -58, -7, -23, -10, 10, 27, -32, 8, -112, 3, -67, 11, 27, 21, 0, -41, -5, 51, -51, -2, -29, -55, 23, 8, 87, 9, 71, 25, -53, -65, 84, 19, 52, -21, 22, 124, -49, -3, -117, -34, -82, 45, -2, -3, -50, 51, -20, 11, -6, 88, -3, -16, 25, -4, 14, -88, -83, -3, 43, 69, 4, -43, 2, -73, -26, -74, -57, -33, -104, 14, -25, -90, -126, 9, 97, -48, 15, 29, 11, 18, 43, 2, 14, -39, -75, -28, 12, 10, -9, -6, -43, -64, -9, -26, 47, 36, 58, 10, 45, 23, -21, -22, -30, 38, 5, -2, -56, 52, 16, 19, 55, 33, 2, -26, 7, -46, 24, 27, 46, 16, -2, -85, -61, -12, 17, 33, -33, 26, 12, -44, 30, -38, 20, -13, 13, 42, -61, -30, 25, 30, 41, -16, 1, 12, 5, -7, 68, 22, 1, -53, 40, -42, -16, 36, -63, 20, 57, 4, 12, -49, -56, -17, -65, 58, -56, 92, -28, 2, 30, 11, -53, 8, 8, 28, -53, -60, 51, 62, -110, 32, -85, -9, -92, -47, 73, 70, 47, -28, 102, -31, 14, -14, -10, 57, 2, 26, 109, -17, 46, 71, 13, -60, 12, -21, 3, 13, 25, -24, 1, 19, 52, -27, 2, 67, -56, 102, -5, 38, -23, 19, -29, -114, -63, 27, 26, -14, 9, -14, 15, 2, -18, 53, -8, 10, 66, 15, -60, -118, -55, 28, -54, -95, -2, 39, 88, -1, 57, 60, -11, 63, 25, -11, 110, 32, 47, 3, -42, 15, 74, -36, 0, 8, -49, 6, 71, 39, 13, -104, 25, 110, -39, -66, 37, -30, -89, 51, -86, -21, 67, 8, 2, 88, -18, -69, -76, 10, 75, 32, -112, -61, 50, 49, 19, 27, 119, 41, -81, 31, -124, 51, 39, -49, 87, -10, 3, 31, 123, -47, -41, -34, 18, 31, 33, -24, -62, -59, -37, 107, -3, 37, 39, -32, -77, 4, -47, 6, -55, -4, 45, 38, -50, 8, -9, -23, 77, -59, -13, -7, 80, 10, 127, -45, -121, -8, 88, 22, 12, 33, 75, 17, -69, 13, -31, 37, 47, -2, 27, -7, -39, 35, 22, -83, 0, 61, 12, 9, 0, 28, 13, -3, 11, -13, -16, 83, -11, -23, -80, -9, 59, -24, -2, 32, 20, 37, -51, -12, -41, 30, -57, 34, -102, -91, 118, 3, 29, 25, 33, -34, -50, -1, -120, 10, 2, 19, 12, -44, -23, -57, 27, -61, -11, 60, -4, 116, -25, 39, -9, -29, -103, 33, -23, 13, 10, -17, -6, 21, 52, -15, -22, 19, -31, 48, 64, -69, 23, 2, 19, 87, -43, -78, -84, -33, 19, 33, 71, 28, 43, -37, -51, 70, 9, -4, 10, 27, 56, -16, 28, 19, 10, 10, 8, 46, 12, 81, -16, 120, 1, -12, -15, -7, 34, -55, -57, 93, 101, 67, -68, -3, 64, 54, 14, 29, -40, 15, -35, 24, -83, -68, 119, -66, 50, -67, 0, -48, 62, 15, 117, 26, 41, -12, 29, 49, 65, -59, 44, -79, 63, -65, 19, -78, 30, 36, 33, 63, 14, 127, 5, 22, 13, -6, -45, -66, -2, 4, -3, 2, -34, -41, 50, -31, -22, 50, -45, 67, -19, -47, -14, 123, -12, 36, 23, 11, -110, 46, 12, 92, -4, 86, 88, -23, 51, 34, 21, 50, -87, 35, 87, -3, 15, -37, 24, -23, -15, 1, 109, -43, 70, -109, -43, -23, 110, -113, -114, 29, -61, 68, 31, -16, -13, 10, -59, 1, 77, -56, 13, -8, 50, 30, 27, -58, -100, 6, -30, 1, 11, -7, 78, 8, 37, 44, 21, -61, 59, -33, -11, -75, -44, 17, 17, 13, -9, 4, -31, 70, 71, -88, 57, 26, 40, -39, 46, 41, -40, 45, 5, 11, -59, 31, 27, 35, 53, 70, -31, 14, -30, 16, 117, -24, 51, 16, 45, 127, -38, -48, 9, -32, 51, -18, 17, -70, -23, 5, -11, -65, -8, -22, 32, -67, 22, -3, 0, 112, 23, 5, 61, 9, -10, 22, 32, -10, 34, -27, 17, 0, 37, 37, 110, 20, 41, 85, 4, 61, -9, 24, -39, 46, 41, 35, -9, -59, 44, -2, 9, 19, 82, -66, 23, 80, 6, 40, 15, -31, 55, 59, -51, 107, 16, -24, 2, 37, -4, 71, 38, 16, 53, 23, 32, 8, -24, 20, -13, 40, -122, -26, 2, -5, 50, 105, 48, 47, -29, 22, 40, 38, 19, -33, 54, -65, 3, 16, 31, 85, 63, -58, 35, 33, 11, -3, -51, -50, 31, -4, 38, 55, 63, 15, 38, -82, -4, -3, 53, -5, 98, 15, -20, -61, -2, 69, 81, -30, 15, 1, 17, -78, -88, 58, 65, -87, 44, -80, 31, -10, -19, 5, -104, 27, 8, -71, -7, -63, 38, 58, -29, 2, -25, 16, -14, -5, 5, -26, -48, 7, 22, 15, -50, -73, 24, -6, -88, -6, 53, -49, 3, 0, -7, 18, 13, -1, -112, 15, -85, 28, 31, 53, -20, -57, -10, -28, 1, -12, -34, -14, 45, -13, -13, 74, -36, 5, -73, 28, 10, -18, 2, 3, -37, -57, 63, -75, -59, 33, -7, 53, 48, -7, 114, -29, -38, -4, 12, -121, -53, -36, 42, 38, -6, 105, 58, 57, -32, -14, -50, 87, -84, 31, -56, -35, 68, 21, 6, 79, 49, 2, -8, 9, -42, -14, -125, 16, -45, 48, 125, 15, -9, -19, 49, 64, -30, 11, -67, -38, -125, -57, -19, 66, -8, 13, -52, -72, 0, -4, -52, 109, 92, 15, -61, 51, 36, -41, 26, 60, -59, 4, 17, 72, -2, 48, 29, -11, -15, -7, -2, -23, -9, 16, 2, 14, -18, -1, 92, -111, -2, -9, 14, -17, -21, 23, 30, -4, 51, 53, -38, -20, 3, 47, -76, -10, 14, -105, -94, -8, -5, 16, -1, 41, 24, 38, -10, 31, -109, -16, -4, 39, -46, -33, -20, -14, -39, -49, -13, -7, 0, 31, 19, 7, -9, -12, 17, 26, 16, -120, 6, 25, 39, 45, 24, -29, -34, -20, 16, -64, -14, 2, -48, 53, 15, -17, 5, 30, 14, 127, 8, -49, 62, -89, 42, 66, 16, -14, 0, 30, -12, 10, -49, 36, 36, -47, -35, -8, 39, 54, -24, 15, 57, -63, 12, -5, -46, 1, 96, -119, 14, 4, -48, 17, -123, 81, 1, 113, 89, 20, -39, -13, 34, -39, 52, 11, 35, -23, 34, -25, -4, -9, 10, 23, 30, 27, 20, -30, -1, -29, 24, -27, -37, -10, -15, -57, -31, 22, -32, 75, 45, -35, 42, 3, -32, 76, 21, -38, 14, -52, -9, 5, -62, 35, -23, -33, -64, 42, 57, 45, 18, 10, 58, 50, -1, 11, -79, -14, 59, -61, 14, 58, 26, -21, 62, -44, 20, 15, 2, 77, 42, -14, 20, 108, 27, 7, 3, 48, 62, 0, 15, -33, -13, -49, 29, 66, -66, 56, -127, -1, 10, -14, -64, 32, 1, 0, -34, 73, 82, 67, 85, -93, 29, -26, 9, -74, -50, 20, -29, 40, -24, 70, -105, 51, -18, -23, -40, 2, 39, 105, -33, -82, -18, 127, 72, 6, 42, 59, -80, 1, -22, -4, 36, 52, 117, -96, 123, -14, -84, 33, -58, -18, -24, 41, 17, -15, -70, -30, 42, -5, 21, -69, -83, 107, 96, 122, 70, 60, -109, -68, 21, 51, 90, 93, -34, -5, -13, -13, 77, 76, 70, 85, -56, 50, 5, -124, 0, 13, -40, 57, 7, -23, -21, 20, -25, -87, 23, -53, -19, -41, -27, -3, 37, 65, -33, -30, 42, -75, 15, 15, 76, 25, 37, 28, -60, -54, -99, 35, -53, -19, 4, -69, -46, 5, 25, -33, -31, 49, 16, -58, -23, -6, 53, -14, 68, 47, -35, -4, -13, 3, 81, -16, -64, -37, 5, -4, 4, 33, -55, 29, 31, 44, 5, 13, 77, -24, -31, -56, 15, 41, 80, -35, -3, 24, -101, 30, 17, 63, 64, 16, -17, -20, -6, 11, 4, 1, -35, -79, -3, 42, 46, -26, -29, -11, -85, -62, 58, 8, 6, -61, 6, -123, 11, 0, -89, -121, -55, -123, -24, 5, -81, 6, 123, 32, -62, -82, 2, -89, -74, -48, -109, -6, 42, 20, -121, 34, -117, -3, 42, -71, 82, 70, -88, 20, -3, 9, -69, 11, 56, -23, -66, -49, 9, -121, -127, -124, 2, 10, 17, -60, 49, 30, 74, -40, 45, -87, 68, -7, 74, -26, -25, 0, -119, 14, -5, -16, -103, 77, -31, 16, 43, 5, 53, -58, 35, 50, 72, -38, -121, 48, 70, -29, 33, -30, 36, 36, -61, 28, -18, 37, 104, -126, 44, -122, -120, -12, -13, -122, -33, -86, -122, -86, -69, -30, -20, 70, -60, 47, -52, -87, -51, 20, 125, -34, 106, 28, -71, -34, 64, -66, -36, -97, -81, -127, 34, -93, 42, 115, -23, 2, 32, 66, 100, -32, 70, -44, 16, 52, 4, 24, -60, -126, 9, -122, -126, -118, -96, 2, -4, -50, -30, -117, -67, 34, -57, -1, 12, -70, -82, 17, 53, -39, 11, -88, -3, 35, 127, -77, -33, -21, 75, -30, -47, 80, 35, -35, 95, -118, 22, -12, 11, -7, -124, 127, -67, 64, -37, -47, 14, -21, -20, -10, 11, 20, 18, 11, 24, -62, 18, -56, -24, 14, -9, 9, -126, -56, -39, -3, -47, -35, 12, -23, -8, 10, 120, -21, 63, -36, -44, 72, 69, -101, -2, -16, -102, 9, 9, 5, -100, -51, 116, -90, 42, 17, 43, 50, -64, -78, -82, -12, -107, 124, 50, -24, -14, -47, 11, -57, 43, 125, -49, 3, 38, -4, -46, 46, 32, 20, -65, -27, -83, -6, -5, -36, -2, 2, -16, 23, -31, 3, -73, 57, -75, -94, -24, 5, -13, 15, 9, -12, -5, 8, 5, 18, -37, 104, -50, 24, -81, 91, 33, -76, 10, 29, 45, 19, -25, -86, -15, -81, -19, 62, 20, 41, 34, -11, -37, 45, 88, -126, 77, 77, -63, -4, -12, 28, 39, 63, 53, 12, 51, -51, -13, -56, -117, 17, -27, 23, -66, 41, -29, 77, 65, 62, 105, -51, -67, 24, 92, -118, 60, -6, -14, -23, -57, -35, -11, -45, 19, 120, -42, -85, -51, 20, 120, 26, -24, -71, 92, -49, -11, 17, 34, 24, 64, -23, 27, 29, -29, 6, 39, -61, 7, 47, 9, -10, -10, -100, 67, 70, -64, 99, 57, 67, 17, -20, 58, 28, 15, -43, 57, 14, -97, 7, 89, 18, 24, -99, 9, 10, -27, 46, -48, -124, -81, -41, 19, -32, -75, 4, 80, 58, 83, 59, 65, -26, -11, 42, 17, -64, -69, 1, -106, 28, -38, 54, 22, 7, -10, -10, -1, -46, 109, 27, 13, 6, -43, 5, 10, 17, 7, 65, 39, -80, 33, 93, -53, -107, -36, -3, 0, -61, 87, 69, -121, -83, 26, 33, -62, 73, -77, 26, 125, -29, 31, 108, -120, 40, -22, 104, 10, 117, -88, -10, -29, 12, -4, 20, -39, -81, 51, -68, 41, 70, 9, 3, 63, 35, -14, 15, -51, -44, 1, -41, 42, -18, 90, 0, 6, 28, -41, 19, -36, -49, -34, 75, 19, -8, 18, -2, -9, 46, 22, -22, 47, -8, 35, 22, 0, -19, -6, 1, 1, 39, 8, 64, -26, -42, 16, -15, -16, -6, 8, 3, 39, -6, -1, 31, -20, -51, 46, 32, 17, -50, -38, 64, -18, -69, -3, 8, -24, -15, 30, 59, 31, -12, 9, 27, 56, 7, -32, 10, 7, -20, 11, -62, 13, -4, -37, 6, -36, -63, 29, -10, 9, -4, -35, -16, -36, 18, -18, -23, -57, -16, -38, 19, 21, 72, -45, -73, 16, -19, -7, -17, 70, -45, 13, 46, -29, -12, -3, -2, -54, 122, -5, 91, -119, 4, -23, 39, -1, -53, 19, -5, -76, 19, 22, -5, -44, 32, 51, 45, -14, 30, -51, 18, 106, -18, -33, 43, -15, 9, 38, -22, 23, -104, 80, 19, 64, -11, 6, 10, -70, 71, 97, 40, -49, 14, 31, 35, -126, -5, -8, 15, 47, -20, -13, -4, 21, 14, 46, 18, -77, 34, 17, 0, 27, 32, -33, -5, -5, 4, 118, -15, 9, -10, 60, -16, -15, -48, -6, -86, 92, -25, -8, -24, 6, -4, -28, -17, 40, 116, -42, 21, -26, -15, 22, -14, 42, -12, 20, -37, 49, 53, -30, 11, 76, 65, -104, 50, -45, -26, 10, -127, -9, -40, 10, -14, -53, 8, 56, -48, 26, 14, -7, 19, 55, 5, 28, -30, -3, -44, 30, 68, 43, -16, -14, -4, 26, -74, 71, -35, 49, -56, -1, 7, -30, 62, -95, 33, -9, -37, 74, 36, 49, -18, -16, 10, 54, -11, -13, -45, 2, 25, 8, -12, 20, 91, 8, 16, 8, -39, 20, -3, -17, 43, -8, 19, 3, -25, -3, 16, -1, 26, 39, -15, 6, 25, -43, -17, -65, 46, -39, 61, 21, -21, 29, 65, -56, 0, 93, 15, 17, 1, -40, 43, 11, 36, 35, 31, -20, -66, -28, -6, -6, 89, -35, -41, 121, 17, -4, 71, 76, 19, -54, 18, 21, 10, 6, -44, -34, -14, 25, 4, 50, -92, -53, -61, -4, -38, -15, -5, -37, -8, -28, -77, -11, -105, -64, -8, 53, -44, 5, 8, 30, 25, 8, 30, -26, 68, -62, 52, -7, 66, -101, -3, -1, -24, -49, -56, -105, -121, 47, 31, 58, 2, 19, 40, -14, -22, -1, -24, -14, -51, 59, -19, -21, -47, -84, 15, 9, -30, -84, -120, -114, -52, 120, -47, 2, 81, 0, 19, -32, 16, -3, 4, 25, 56, -127, 3, 49, 21, 9, -28, -50, -32, -5, 18, 45, 26, -47, -21, 12, -25, 21, -46, 6, -72, 6, -23, -58, -5, -75, -52, -45, 19, 2, 52, -7, -43, 26, 58, 24, 1, -34, -21, -29, 89, 91, -5, -57, -38, 15, -21, -41, -10, -16, 91, 52, 106, -58, 36, -19, -20, 124, -37, 17, 5, 83, -102, 18, 25, 66, -48, 28, 27, -77, -32, 24, -31, 31, 0, 79, 25, -56, 28, 51, -80, 29, -33, -92, 33, -3, -58, -59, 26, -126, 93, -63, 118, -50, 10, -28, 59, 21, 27, 3, -109, 53, 78, 1, 46, 8, 19, -123, -56, 124, 39, 15, 59, 57, -18, 0, -72, 73, -36, -6, -24, 6, -1, -54, -26, 5, 35, 72, -52, -31, -31, 22, -11, 30, 58, -62, -62, 77, -49, 63, 10, 60, -59, 8, -15, -21, -91, 2, 37, 24, -57, 53, 36, -40, 2, -43, -127, -17, 23, -29, 24, -7, -19, 24, 27, 3, -50, -22, -13, -39, 76, -44, 100, -36, 6, 1, 2, 30, -38, -73, 60, -76, -7, -18, 32, -107, 87, -94, -45, -18, -2, -8, -21, -41, 45, 104, -4, 52, -8, 10, -18, -7, 9, -61, 10, -22, -102, 25, -34, -7, 46, -40, -14, -18, 19, -35, -15, -28, 76, 15, -109, 45, -3, 35, 27, -27, -67, -40, -88, -123, 69, -57, 2, -39, 26, -5, -47, 7, -23, 13, -29, 24, 70, 37, 14, 26, -67, 14, -6, 38, 39, 62, 13, 37, -27, -14, 63, 120, -34, 113, -3, -41, -54, 41, -40, 17, -43, 85, -66, 30, -52, 55, 12, -15, -10, 12, 73, -32, 64, 80, -18, 18, 48, 26, 3, 88, 13, 9, -64, 15, -19, 30, 52, 117, -1, 50, 12, -7, 40, 23, 31, 110, -5, -46, 51, 46, -116, 25, 88, 14, -24, 21, 79, 18, -58, -78, -29, 11, -37, -86, -31, -40, -28, -17, 40, 23, 64, 17, 5, 15, 50, 26, -28, 13, 66, 57, 11, 51, -81, -26, -72, 39, -16, -120, -51, -100, -85, 24, -76, -14, 72, -42, -30, -103, 1, -75, 49, -38, -82, 32, 53, 113, -33, -40, -6, 24, 47, 0, -51, 118, -4, 16, 77, -35, -36, -6, 4, -16, 124, -91, -65, -31, 35, -12, 0, -36, -96, 0, 17, -108, -9, -47, 10, 8, 58, -2, 11, 7, -1, -17, -8, 8, -77, -10, 16, 111, 13, 10, -32, 47, -8, 62, 69, -35, -4, 39, 34, -92, -8, 45, 37, -7, -75, -1, 45, -38, 71, -90, 37, 31, -43, 17, -33, 1, -17, -71, 35, 16, 86, -113, -23, 0, -80, 5, -28, 14, 10, 33, 47, -6, -36, 19, -16, -52, 33, -35, -12, 25, -21, -7, 63, 2, 32, -17, 13, -6, 12, 14, -49, -43, 66, 5, 19, -103, 34, 27, -8, -20, 1, 10, -47, 35, -26, -11, -18, -61, 21, -25, 9, 11, -16, -20, 8, 13, -19, -14, 27, 5, 15, -16, 9, 59, 0, 52, 28, -66, -115, 68, 17, -17, 21, -21, 11, -28, -20, 4, 26, 15, -9, -25, -6, 17, 5, -19, -13, -11, -3, 34, -1, 29, -74, 115, 33, 20, -12, 49, 54, 127, -55, 9, -9, -87, -113, 120, 8, -25, 19, 63, 21, -44, -31, 17, 111, 93, 16, 10, -99, -125, 98, -12, -58, -40, 14, -47, 92, -40, -6, -38, -24, 30, 78, -22, 109, 76, -10, 66, 29, -15, -33, -18, 3, 63, 11, 47, 96, 49, 0, 74, 72, -43, 6, 24, -26, 80, -56, 66, -23, -109, 55, -27, 52, 27, -59, -99, 58, -17, -34, -7, -35, -89, 66, 15, 18, 36, 32, 0, -101, -40, 35, 121, 14, 37, 106, -90, -62, -37, -73, -45, -18, -12, -48, -21, -81, 113, -49, 33, -75, 74, -55, -73, -85, -51, -116, 53, 16, -67, -5, -49, 85, 23, 111, 19, 119, -107, -8, 29, -2, 50, -117, 83, 34, -42, -38, 7, -3, -46, 94, 95, 127, -45, 71, 37, 65, -2, 4, -1, -34, 118, 35, 0, 81, -56, -73, -6, 22, 89, -28, 7, -94, 40, 73, 37, 60, 33, 125, 57, 127, -37, 46, 67, 19, 89, 86, -31, -11, -70, 126, 0, 2, 4, -45, 35, 39, 46, 78, 46, 93, 85, 89, 74, -72, -21, -11, -31, 93, 16, -38, -2, -55, 49, -25, -21, -11, 21, 16, -63, 19, 27, 25, 3, 70, -23, 52, 18, 15, -101, -47, -66, 99, -126, 101, -37, 0, 46, 74, -10, 33, 29, 6, 60, 16, -41, 115, 17, -11, 14, 43, -22, -11, 78, -69, 14, 69, 4, -98, -73, 22, 5, 52, 17, -64, 65, 49, -1, 21, -121, -39, 61, 20, 23, 36, 108, 57, 19, -36, 62, 38, -29, -8, 28, 87, -38, -86, -46, -86, -86, 9, 4, 39, 13, -20, 40, -15, -43, 4, 9, 24, -16, 4, 68, 41, -6, 74, -78, -43, 27, -68, -7, -9, -54, -2, -7, -49, -94, 100, 2, 0, 1, 15, -53, 25, 117, 1, 125, -22, -2, -21, -19, 73, 19, 75, -112, 30, 68, -13, -55, -26, -12, 54, 26, 50, 67, 12, 44, 123, 8, 42, -14, -22, -70, 2, 58, -68, -24, -9, -20, 2, 30, -13, -21, -21, 11, 98, 0, -63, 37, -22, 29, -1, 23, 50, 28, 74, -15, 23, -48, 18, -5, -28, 54, -14, -15, -3, -23, 13, 10, 63, -3, 11, 32, -21, 39, 80, -106, 41, 1, -55, -25, 53, -17, -57, 54, -39, 21, -40, 8, 44, 112, 9, 88, 52, -24, -2, 7, 3, -11, -13, -32, -6, 75, -14, 75, 21, -66, 16, 14, 18, 12, 34, 94, -45, 30, 6, -36, 94, -125, -26, -23, -117, -93, -3, 0, -1, -33, -33, 34, -91, -76, 31, -16, 62, 47, -9, -27, 19, 23, 41, 9, 66, -3, -118, 83, 20, 118, 5, -22, 37, -91, 31, 3, 23, 5, 15, 11, 120, 89, 84, 7, 75, -123, 15, 7, 28, 17, -101, -23, -9, -5, 15, -2, 72, 21, 10, 19, -29, 60, 13, 20, 46, -27, 54, 7, 24, -61, -25, 25, -17, -19, -14, -30, 21, -37, 61, -63, 41, -48, -15, -20, 15, 44, 28, -13, -60, -55, 15, 18, -2, 57, 16, 102, -17, 1, 3, 23, 28, -20, -104, 66, 99, -31, 44, -25, -59, 54, 15, 4, 66, 44, 13, -88, -3, -4, -18, 21, -43, 12, -123, -14, 37, -28, -11, -9, 73, -5, -62, -12, 25, 17, -25, 65, 22, -4, 2, -8, 9, 9, -7, 41, -62, 10, 34, -4, -6, 6, -6, 0, -10, 4, -9, -5, 9, 8, 2, 16, 4, -9, -9, -2, -28, -6, 2, 32, 1, 2, 1, 10, -3, -25, -4, 12, -18, 4, 5, -6, -4, -10, 0, 20, -2, 18, -3, -16, 9, 1, -4, 15, -7, 13, 5, 1, 6, -10, -1, -8, -5, -10, -3, -12, 18, -3, 2, 3, 12, 7, 16, -5, 11, 7, 25, -7, 25, 14, 7, -14, 1, -20, 11, -30, -18, 6, 4, 1, 2, 0, 8, 0, 4, -16, 9, -2, 20, 14, -7, -2, -8, 4, -3, -7, 5, -12, -24, -41, -4, -4, 0, 22, -4, 6, 34, 7, 44, -6, -23, -14, -9, 8, -32, -47, 19, -26, 3, 20, -37, -14, -16, -9, -46, -9, -6, 7, -27, 13, -28, -10, -10, -71, 21, -41, -6, 49, 41, -9, -16, 6, 12, 32, -1, 36, -9, -14, -22, 4, -19, -4, -13, 24, 24, 41, -8, -8, -19, -2, -38, -6, -20, -12, 21, -21, -26, -90, -22, 8, 18, 67, 45, -12, -47, 33, 14, -31, 7, 14, -4, 11, -5, -25, 8, 19, -49, -12, -19, -20, -1, 21, -26, 19, 3, -13, -3, -12, -6, -7, 22, 8, 17, -1, 0, 6, -3, -7, 1, 10, 5, 48, -13, 17, 2, -5, -26, 1, 11, 6, 11, 15, 11, -18, 6, -21, 9, -13, -9, -2, -9, 9, 0, -5, 23, 33, -14, -2, 1, 26, 7, -17, -4, -8, -3, -2, 20, -5, -36, 4, 7, -9, 29, 2, -1, -6, 6, 13, 27, 6, -7, 1, -11, 20, 5, 10, 2, 5, 10, 17, 10, -28, 3, -14, 27, -7, -12, 12, -6, -22, 3, -5, 11, -21, 1, -17, 1, -14, -9, 3, -19, 18, -39, -16, -12, 29, 14, 12, 18, 8, 40, 34, -15, -33, 19, 3, -5, 9, -7, -26, -2, -38, 27, -21, 28, -39, -40, -13, -53, -2, 5, -42, 27, 10, -13, 11, 3, -2, -17, -36, -5, -21, -13, -3, -6, -46, 25, 13, 2, 7, -17, 66, -16, 18, 15, 7, -15, 22, 16, -2, 45, 3, 0, 32, -5, 22, 37, 8, -1, -39, 14, -21, 25, -67, 16, 0, 9, 7, -3, 4, -1, 9, 6, -29, -2, 14, -2, 1, -9, -9, -28, 3, 7, 14, 16, -25, -18, 32, 42, -39, -32, -42, -60, -9, 20, 4, -20, -61, 4, -37, -5, 17, -16, -25, 67, -35, 17, 33, 27, 90, 9, 17, -55, 112, -7, -33, -4, 17, 50, 13, -7, -81, -12, 9, 85, 22, -20, -2, 32, 10, -9, -4, -6, 3, -3, 10, -12, -24, -62, -10, 40, 6, 1, 13, -7, 2, -110, 24, 31, -15, 42, -54, 69, 45, 88, 13, -5, 7, -25, 28, -49, -3, -59, 53, 34, 59, 80, -23, 58, 75, -4, 6, -14, -27, 91, -16, -22, -5, -29, 12, -50, 26, 27, 5, -8, -1, -4, -22, -30, -39, 18, 32, -45, -18, -12, 45, -33, -14, -38, 36, -14, -21, 18, -20, -11, -44, 6, -29, -32, -2, -5, 0, 47, -40, -18, -49, 5, -2, -19, 0, -2, -17, 37, -16, -10, 39, 17, -34, 14, -18, -16, 12, 12, 20, -1, -27, -27, 36, 15, -6, 22, -28, 10, -17, 13, 46, 13, 28, 6, 32, -62, 33, 23, 16, 3, 16, -35, -5, -22, -13, 22, 10, 43, -18, 2, 46, -14, -35, -39, 31, -31, -19, 25, 15, 45, -23, 11, 24, -8, 32, -6, 6, 4, -4, -5, -27, 40, -29, 19, 36, 4, 91, -20, 4, -19, 16, 47, -45, 20, -21, 2, 46, 26, 8, -56, -28, -74, -10, 9, -52, -6, -42, -17, 0, 21, 11, -26, -25, -36, -3, -5, -25, -1, -52, 23, 22, -29, -7, -3, -55, -31, 43, -13, -13, -53, -23, 3, 28, 34, 14, 2, 18, -31, -5, 41, -15, 34, -14, 30, -62, 15, -45, -81, -22, 5, 10, 9, -1, 13, 30, -12, -45, -1, 1, -39, -1, 4, -9, -39, 2, 17, 28, -15, -11, -54, 83, 4, -5, -23, -45, -54, -1, -48, 30, -29, -2, 45, 48, 60, 13, 10, -26, 5, -13, -8, 41, 23, 66, 15, -43, -8, -103, -5, 61, 16, 5, -31, 58, -38, -51, -10, 35, -112, -25, 56, 28, 9, 8, 12, 1, -43, 26, 1, 36, 12, 84, -88, -63, 100, -42, -4, -109, 10, -49, -88, -11, 27, -28, -77, -53, 51, 45, -106, 13, 23, 59, -31, 79, 44, 12, -80, 6, 66, -10, -35, 37, -8, 60, 39, -6, -45, -12, -53, 59, -15, 27, -28, -1, -69, 23, 29, 19, -53, 36, -37, 0, -28, -32, -31, 43, -31, -33, -20, 0, 44, -61, -77, 19, -37, -32, 10, 3, -14, 49, -16, 10, -24, 11, -53, 2, 55, -7, 26, -38, 18, -3, 2, 36, 61, -18, 43, -28, -23, 66, 3, 11, 25, 4, 6, -16, 11, 33, -44, -24, 4, -17, 11, 1, -5, -18, 33, -17, 8, 52, 5, 23, 19, 18, -19, -6, -2, -21, 18, -5, 25, -3, -33, 45, 30, -4, -17, 10, -1, 69, -77, -21, -60, 64, -2, -44, 9, 17, -29, -14, -18, 35, 7, -8, 42, -5, 23, -20, -12, -19, -19, -20, 10, -22, 45, 33, -40, -17, 25, -16, 44, 12, -4, 9, -75, 8, -35, -66, -2, -36, -22, -49, -9, 13, 16, -30, -19, -10, -8, 21, -12, -24, -33, 47, 5, -14, 17, 25, 18, -42, 6, -15, -3, 21, -21, 25, -25, -22, 14, -5, 12, 46, 47, 13, 25, 18, 7, -8, 12, -30, -24, 0, 60, -81, -4, 30, 103, -63, -18, -11, 5, 11, 7, 66, -13, -39, 8, -2, 12, -2, -11, 1, 36, -37, -9, 18, -46, 12, -22, 3, 14, -43, -74, 15, 51, 52, -7, -46, -9, 10, -76, -40, 12, -111, -20, 11, -85, -5, -69, 6, -102, -15, -34, 50, 25, 121, -17, 118, -16, -72, -33, -3, -10, 0, 14, -52, 35, 10, 62, -60, -49, -29, 4, 1, -17, 29, 3, 12, -48, -99, 7, 38, -36, 0, -13, -51, -43, -77, 10, -7, -4, -6, 103, -58, 72, -19, 58, -43, -30, 44, 54, 42, 68, 3, -65, -64, 74, -21, -72, -57, 67, 70, 63, -97, -24, 64, -11, 32, -3, -14, 5, 2, -74, 31, 3, 2, -36, -50, -19, 14, 94, 28, -11, 5, 32, 12, 15, -17, 18, -23, 62, -3, -41, 34, -29, -7, -54, 26, -25, 33, 23, -9, 32, -8, 18, 3, -12, 40, -31, 10, 17, -22, -86, -18, 34, 65, 8, -11, 13, 0, 11, 14, -22, 6, 17, -22, -14, 35, 3, 29, 15, 16, -24, -22, 51, 7, -42, 63, 11, 18, -7, 7, -38, -20, -30, 13, 81, 64, -94, 30, 45, 95, 9, -5, -35, 6, 56, 25, -93, 22, -28, 8, 17, -48, -90, 12, -41, 5, -38, -4, 13, -48, 11, -6, 9, -52, -10, 59, -33, -2, -60, -8, -24, 33, 45, -31, 4, 34, -9, -8, -36, -22, -37, -62, -31, -13, -108, -16, 76, 17, -23, 25, 25, -28, -3, -23, -15, 14, 20, 16, -3, -35, 9, 29, 2, 7, 17, -52, 12, -32, 8, 17, -10, -41, -28, -28, 56, 18, -39, 12, 64, 11, 2, 12, -22, 37, 5, 6, -10, 6, 42, 6, 3, -40, -122, -19, -5, -12, -14, 37, -9, 13, -16, -54, -12, -26, 5, 31, 0, -2, 100, -15, -12, 21, -22, -13, -3, -45, -118, 39, 14, -90, 73, -52, 10, 6, -116, -6, -60, 32, -39, -35, 42, -12, -76, -16, -105, -9, -54, 71, 92, -121, -24, -123, 16, -26, -62, -65, 0, 32, -24, 12, 24, -5, 59, 15, 21, 4, 5, 3, -4, -5, 36, 0, -20, 64, 3, 27, 16, 8, 14, -2, 47, 33, -73, -24, 65, 46, 63, 5, -46, 49, 14, 3, -45, 44, 39, -50, -45, 11, 0, 31, -87, -52, 12, 61, 92, -78, -41, -44, 42, -67, -9, 36, 94, -5, 71, 23, -7, -11, -52, -5, -45, -11, 28, 57, 17, -7, -36, -52, 3, -27, -12, -6, -62, 29, -71, 8, 27, -31, 21, -38, -58, 3, -12, -69, 8, -54, 91, 22, 90, -11, -126, 23, -9, 67, -44, -3, -30, 22, 47, 21, 1, 38, 21, -85, 1, 26, 2, 46, 8, 3, 22, -1, -39, -28, 26, -3, 16, 26, -35, -22, 34, -17, -26, 88, 30, 3, -19, -8, 9, -48, 0, 16, 4, -72, 67, -24, 57, 56, 23, 31, -7, 28, -23, -40, -14, 32, 7, -1, -40, -9, -60, -2, 62, -16, -14, -36, 28, -52, 0, 10, -1, 11, -2, -31, -89, -3, -55, 1, -29, -83, -16, -5, -39, -15, -41, -48, -20, -35, 49, -31, -10, -2, 9, 15, 21, 62, -19, -1, -42, -21, 34, -31, -1, -3, -18, 45, 17, -55, -10, -20, 6, -31, 21, 6, -14, -20, 7, -101, -5, -45, -1, 16, -21, -6, -12, 21, 73, -9, -17, 4, -2, 15, 9, 23, 7, 10, 20, 6, -11, 36, 30, 14, 22, 6, -5, 15, -31, -55, 13, -15, 7, -14, 38, 15, 22, -8, 36, 12, 6, -5, 56, 13, -31, -24, -16, 46, 25, 30, 6, 40, 0, -8, 100, 9, 43, 26, -86, -47, 54, -119, -18, 36, 49, -38, 53, 27, -6, 122, -25, 125, -18, -108, -111, 91, -10, 87, 10, -120, -28, 21, -126, -12, 42, -3, -76, -2, 58, -32, 75, -13, -59, 22, -50, 89, -16, 23, 16, 1, 7, 89, -10, -19, 12, 54, -25, -6, 124, 71, -13, 10, -7, -49, 9, -10, -69, 76, -118, 33, -44, 41, -3, -6, -46, -59, -126, 8, -76, -79, -34, 7, -93, -2, -25, -25, -50, 16, -66, -41, -77, -14, 16, -83, 22, -12, -68, 7, 44, -2, -45, 22, 20, 45, 15, 21, -47, -71, 69, 25, -9, -5, 45, 127, 14, 21, -32, -18, -30, -3, -75, 22, -22, 19, -49, -3, -43, 4, 6, 2, 17, 36, 23, -77, 14, -36, -25, 34, -12, 37, 7, 83, -56, -14, 6, -3, 2, 12, -40, -61, 48, 10, 96, 95, -19, 0, -15, 17, -66, -30, -28, 63, -81, 15, -126, -18, 36, -47, 7, 45, 17, -43, 13, -36, 35, 22, -9, -44, 77, 0, 22, 4, -2, -17, 25, -45, 82, -101, -5, -40, -5, 15, 32, -23, -45, -51, 1, -57, -11, 120, -7, 91, 9, -24, -42, 37, 100, 80, 20, -5, -125, 88, 11, -124, 42, -35, -127, 120, -123, 41, 125, -124, 21, -76, 81, 29, -11, 61, 15, -120, -115, -17, 79, 111, 74, 20, 63, 127, -42, 28, -26, -30, -116, -71, -73, 98, 110, -114, 3, -48, 2, 4, -64, -40, 36, -14, 18, 61, -16, -36, 12, 27, -11, -32, 124, -34, 65, -51, -43, 53, 45, -44, -6, 13, 33, -25, -15, -119, -51, -26, 124, 118, 16, 18, -121, -33, -58, -79, 26, 18, -77, -12, -95, -79, -38, 23, 32, 83, 125, 17, 77, -32, 127, 104, -56, -18, -9, -80, 17, -125, -127, 123, -61, 38, -1, -78, 22, 10, -21, 3, 126, -125, 123, 49, -47, -126, 89, -113, 127, 89, -29, 15, -62, -128, 44, -5, 120, 123, 120, -15, 105, -126, 111, 25, -127, -122, -127, 115, -65, 122, 24, -2, 38, -88, 20, 20, 70, -7, -77, 50, 25, 73, 117, 20, 114, 93, -52, -125, 118, -43, 127, 5, -8, 36, 22, 122, 42, -128, -120, -123, -52, 127, -124, -125, 96, 1, -35, -76, 62, 60, 46, -102, -5, 70, 66, 13, 127, 2, 126, 77, 88, -63, -91, 103, -7, -110, -128, -45, -127, 100, 109, 18, -51, 61, -18, 47, -127, 57, 13, 46, 23, 127, 127, 127, -52, -66, -24, -68, -1, -126, -15, 10, -2, 33, -61, -127, 119, -75, 127, -34, 126, 127, -61, -1, 60, -9, -42, 22, -123, 19, -41, 50, 27, -46, -3, -75, -12, -75, -55, -90, -99, 14, -2, 90, 47, -35, -108, -78, 34, -27, -77, -21, 38, 32, 34, -115, 84, -62, -14, 33, 18, 30, -122, -3, -3, 10, 99, -7, 4, 51, 92, 9, 69, 23, 125, -60, -19, 25, -26, 3, -62, 92, 116, 20, -11, 86, -34, 105, 25, -98, 17, 45, -54, -70, 58, -114, 38, 5, -51, -36, 56, 121, -55, 21, 68, -127, 76, -35, 28, 28, 49, -113, -30, 112, 125, 82, -12, -68, 55, 17, 64, 14, 53, -25, 124, -44, 84, -70, -60, 80, 35, -66, 88, -25, 77, 107, -63, 125, 48, -101, 127, -7, -50, 13, -12, -124, -109, -53, -87, 66, 81, -51, -79, 76, 8, -8, 106, -26, -85, -113, 88, 99, -40, 84, 62, 106, -125, -124, 3, 75, 127, -22, 2, 76, -47, -128, 46, 127, -71, -40, -127, -117, 9, -22, -92, -60, 72, 35, -128, -74, 77, -117, -95, 123, 49, 127, -9, 8, -125, -58, -67, 127, 126, -128, -20, 126, 115, 122, 110, -127, 116, 0, -118, -102, -126, -34, 56, -125, -87, 81, 19, -95, 42, -4, -101, 80, -10, -62, -21, -55, 127, 77, -128, -126, 127, -127, 109, -95, -128, -80, -126, 81, 70, 122, 69, -70, 101, -24, -22, -4, -43, -126, 77, -51, -54, -122, 123, 41, -5, -50, -63, 4, -12, -103, -126, 115, 127, -88, -32, -79, -125, -83, 95, 61, 56, 48, 127, 121, 60, 75, -3, 35, 22, 64, 126, 127, 83, 121, 46, -72, 117, -127, -83, -128, 34, 31, 49, 121, 46, -53, -51, 6, 27, -124, -4, -119, 72, -119, -126, 57, -83, -61, 31, 83, -76, -119, -96, -55, 101, -62, -128, 3, -36, -42, -61, 57, -124, 59, 25, 2, -116, 127, 95, 36, 127, -84, 80, -34, 35, 21, 49, 9, -12, -17, -39, -91, -24, 30, 40, -26, 79, 30, -57, 23, 78, 114, 55, -66, -34, 42, 64, -40, 105, 36, 127, -43, -122, 35, -60, -73, 83, -44, -15, 102, -126, 35, 37, -122, -50, -44, -5, -76, 10, 6, -89, 16, -70, 24, 79, -41, -98, 100, 72, 108, 7, -71, 27, 25, -12, -128, -9, 127, 103, 50, -60, -82, -39, 77, -46, 32, -1, 85, 124, -9, 2, 43, 28, 122, 0, 1, 59, 13, 38, 120, 7, 113, 15, -10, 101, 79, 88, 121, -126, -126, -76, -41, -122, -13, 79, -126, 102, 73, 126, -56, 99, -58, 32, 127, 17, 12, -99, -120, -127, 101, 96, 79, -104, 126, -50, 115, 43, -105, -50, 127, 71, -126, 73, 16, -29, -94, 103, -126, -96, -113, -63, 87, 127, -124, 94, -67, -123, 124, 19, 22, 76, 19, -111, 15, 87, -128, 123, -19, 88, 53, 120, 127, -116, -117, 108, 100, -99, -127, 127, 119, 12, 103, 51, -121, 21, -90, -126, 85, 98, 13, 27, -42, -102, 123, 26, 127, -91, 118, 121, 126, 123, -117, 121, -41, -124, 82, 127, 118, 126, -124, 100, 64, -62, 127, 88, -22, -89, 8, -63, -114, -125, 35, -42, 55, 68, 19, 37, 23, -127, -123, -126, -6, 121, 56, 73, -64, 121, 9, 88, -25, -115, 125, -42, 126, -91, 84, 18, 115, -79, 126, -17, -24, -83, -128, 42, 54, -75, -104, 123, -108, 60, 50, 18, -121, 34, -84, 97, -128, 27, -125, 70, -43, 20, 73, 19, -80, 115, 79, 16, -87, -107, -17, 2, 103, 71, -17, 126, -55, -108, -33, -115, 121, -5, -33, -4, 30, 125, 72, -64, -12, 124, -8, -38, 127, -63, -48, -40, 101, -67, 123, -19, -55, 6, -23, -29, 79, 62, -46, 69, -119, -44, 13, -33, 114, -126, 3, -106, 103, 126, -17, -6, 27, -46, 125, -29, -76, -6, 54, -89, 10, 119, -125, 52, 123, -19, -44, -9, 47, -35, -101, -59, 59, 81, -64, -43, 22, 13, 38, 22, -42, 24, 45, 52, -89, -117, -17, 87, -94, -37, -119, 13, -30, -59, -127, 68, -2, 48, -125, -27, 97, 17, 67, 63, -19, 32, 10, -54, -39, -1, 32, -26, 27, 16, 25, 84, -34, -37, -117, -64, -103, -77, -126, 90, -102, 55, 84, 20, 91, -32, 15, -7, 126, 41, 82, 40, 100, 30, 125, -39, 13, -67, 57, -126, 121, 105, 113, 45, -128, 31, 127, 124, -79, -49, 39, 21, -123, 65, -29, 46, 53, -105, -36, -16, -61, -124, -92, -114, 123, 7, -32, -126, -28, -53, -102, 18, -124, -62, -102, 13, 127, -128, 127, 80, 49, -16, -105, -128, 49, -34, 74, -127, -53, -61, -111, -96, 67, 25, 16, -22, -23, -123, -125, -59, 53, 111, 104, -127, 123, 38, 15, 68, -3, -125, -74, -119, 43, 124, -128, 127, 89, 27, -20, 30, 127, -63, 3, 17, -13, 125, -39, 106, 32, -32, 75, -42, 17, 127, 102, -128, -70, 126, 46, -10, 82, 99, -86, -44, 96, 51, 81, 34, 88, -105, 58, -40, 46, 126, -20, 78, 80, 16, -40, 116, -70, -69, -8, -25, 45, 87, 3, 30, -40, -8, 11, 127, -127, -13, 75, 125, 38, -110, 63, 21, 15, -42, 55, -115, -72, -117, 121, -120, 0, -119, -17, -125, 34, -128, 35, -1, 31, -92, 69, 62, 16, 17, -120, -37, -50, -17, -2, -1, 84, -33, -58, -67, 125, 38, 127, 11, -128, -99, 86, 40, -104, 34, -14, -39, -29, 39, 126, 21, -85, -105, 122, -127, -72, 114, -62, -25, -91, 122, 16, -80, -14, 20, 127, -108, -22, -13, -125, -1, -80, -48, 37, -16, 11, 114, 30, -9, -3, 12, -70, 31, 31, 22, -94, 120, -57, 3, -75, 120, -115, 33, -101, 67, -81, 67, -114, -11, -116, -57, -81, -109, -109, -123, -125, -27, 36, 1, -2, -127, -9, -14, -37, -125, -104, 14, -49, 14, 49, 8, 94, -43, -17, 95, -126, 2, -110, 113, -127, 118, 30, 3, -13, 15, 13, 30, -52, 105, 75, 31, 123, -91, 122, -7, 116, -52, 70, 126, -127, -128, 78, 116, -64, 108, 82, -51, -127, 64, -120, 127, -111, -64, 90, 112, -29, -76, 5, 126, 3, -11, 64, 94, -117, -32, -4, 54, -20, -121, -85, 115, 115, 126, 15, 80, 44, -27, 8, 126, 125, 119, -92, 39, -122, 111, -52, -20, -111, -64, 1, 90, -63, 85, -71, 1, 123, 85, 57, -124, -14, 112, -73, -104, -90, 127, 127, -76, -55, 21, 85, 125, 103, 55, 120, 126, -127, 109, 116, -125, 25, 53, 127, 96, -47, 50, -102, 43, -3, 127, 126, -4, 117, -4, 7, 124, -121, -48, 59, -6, 125, -98, -83, -123, -113, 17, -123, 82, 113, -122, 125, 60, 92, 14, 22, -127, 33, 18, 1, -21, -82, 105, 38, -75, 98, 107, -89, 2, 123, -83, -55, 91, -64, 127, -69, 91, 126, 74, 33, -85, 112, 5, -35, 29, -69, -36, 35, 126, 34, 126, 121, 124, -61, 103, -123, -128, 15, 78, -124, -56, 109, 52, 52, -56, -83, -28, 107, -128, 23, -79, 126, 126, -4, -46, 38, -115, -109, 119, 16, 87, 11, -76, 54, 118, 13, 45, -55, 18, 94, -69, 14, 127, -120, -126, -98, 87, 100, -42, -44, 42, 18, 121, -128, -47, -51, 3, -87, -28, -115, -46, 104, 89, -88, 83, -112, 49, -17, -13, 43, 30, 9, -76, -111, 55, -41, 21, -4, -53, -119, -16, -128, -9, -10, 46, -7, -50, -124, -100, -27, -44, -26, -56, 23, 7, -128, -2, -65, 45, 80, -107, -102, -14, -8, -57, -120, -19, -58, -15, -43, 50, -32, -13, 8, 108, -127, -66, -54, 123, -127, 127, -85, 110, -108, 118, 6, -42, -116, 108, 95, -23, 94, -2, -45, -126, -34, -124, 43, -124, -73, -122, 127, 90, 64, 49, 126, 43, 127, -126, 122, 127, 33, -67, -128, 100, -125, -9, 92, -128, -123, -21, -65, 125, -93, -125, 124, -119, 64, 6, -116, 4, -127, -86, 125, -128, 80, -89, -127, 127, -29, 125, -13, -71, -86, -128, -124, 126, -53, -37, -117, -4, -47, 126, 21, -98, 125, -45, 52, -124, 42, -22, -128, 120, 124, 126, 11, 127, 56, 99, 31, 121, 127, -122, 125, 116, -117, 43, -65, -27, 124, 57, 126, -96, 3, -42, -67, 28, 30, -102, -45, -56, 4, -42, 69, -127, 43, 61, -79, -127, -6, -13, -96, -5, 49, 37, -57, -100, 126, 36, 61, 22, 55, -114, -58, 116, 91, 30, 78, -48, 103, 16, -42, -58, 108, -17, -21, 126, -120, -127, 77, -19, 71, 126, -10, 49, 36, -44, -23, -110, -34, -112, -26, -118, 48, -65, 23, 125, 24, 124, 84, -127, -69, 54, -124, -126, 82, -2, -118, 14, -2, 31, 122, 33, 124, -57, 44, -128, 22, -51, 111, 126, 20, -121, -30, 108, 115, -58, -62, -106, -116, 61, -25, 127, -120, -82, 29, -117, -103, 90, -62, 125, 63, 52, -41, 12, 75, 12, -100, 73, 41, 69, 4, 95, -87, 74, -72, -65, -85, -36, -29, -60, 24, 65, 123, -34, 31, 88, -53, 15, 11, 34, 46, 4, -101, -97, -37, -85, -14, 19, -16, -101, 76, 38, 8, -11, -127, -103, -103, 118, 48, -27, -69, -78, -77, -125, 29, 24, 10, 30, 32, -111, -35, 23, -41, -96, 41, -22, 14, -44, 123, 12, -116, 100, -121, -22, -116, -36, -123, 118, 73, -45, -81, 37, 113, -28, 77, 30, -21, 108, 124, 41, 57, 108, 67, 31, 13, -125, -51, 75, 2, 97, -9, 59, 58, 67, -128, 100, -124, 126, 126, 56, -22, 53, -18, -73, -125, 123, -124, -23, -1, 6, 68, -29, 117, -125, 45, -120, -37, 117, 126, -6, 121, 121, -24, -124, 6, 52, -121, 108, -76, 0, -89, 124, -125, 107, -128, 92, -42, 127, -127, -81, 64, -33, 127, 82, 91, -127, -121, -43, -35, -127, -124, 127, 90, -49, -122, -100, -18, 125, 41, 60, 118, 127, 59, -77, -105, -119, 18, 102, -70, 71, -65, -37, 54, -127, 39, 107, 124, 55, 79, -30, 72, -128, -104, 110, -52, -127, 64, 26, 64, 90, -124, -42, -123, -66, -34, 19, -13, 126, 34, 55, 39, -100, 62, -24, -69, 95, 42, -32, 37, -114, 120, 117, 6, 126, 124, -16, 120, -34, -122, 126, 49, 125, -14, -72, 116, -125, 33, -128, -111, 122, -102, 121, 18, 123, -83, 124, -78, 31, 95, 55, -96, -127, -123, -3, -125, -1, -47, 121, 8, -47, -127, -23, 124, -124, 39, -128, 127, 127, 2, -69, 1, 24, -40, -45, 30, -51, -66, -13, 8, 43, -2, -35, -85, 127, -1, -41, 117, 125, 79, 91, -56, -106, -66, -89, -49, -22, -28, 95, -128, 9, -128, -106, 40, -43, -128, 77, 20, 85, -38, 78, 31, 18, -94, 57, 8, 127, 119, -33, -38, 5, -18, -77, 115, -60, -43, 46, 122, -43, -22, 19, 11, -34, -127, -56, 27, 88, 110, 49, 71, 127, 76, 57, 127, 40, -62, 22, 43, -123, -109, 46, -105, -97, 124, -20, -8, -88, -109, -47, 30, 55, -127, 47, -42, 11, -43, 121, 21, 48, -126, -78, -29, 53, 21, -18, -128, 39, 51, -76, 113, 20, 127, -23, 40, 115, -27, 123, 94, -71, -69, 39, -26, 8, 127, -42, 107, 126, 11, 42, -87, -39, -77, 73, -35, -121, -77, -64, -72, 121, -109, -47, -64, 58, -87, 70, -36, 122, -51, -42, 48, -53, -36, -121, -22, 124, 115, 47, -78, 74, -108, -128, -90, 52, -70, -120, 29, -61, 49, 112, -20, -51, 69, 27, 34, -127, 125, -124, -81, 53, -127, 114, 127, 6, -89, 124, -16, 34, 116, -58, 17, 124, 80, -77, -128, 122, 76, 19, -127, -55, 59, -2, 7, 109, 22, -8, 76, 26, -51, -97, -77, -30, 36, 127, -123, -125, 114, 39, -15, 127, -40, 127, 91, -88, 3, 13, 109, -29, 123, 32, -123, 51, 127, -120, 1, 57, 96, -128, 25, -107, 76, 127, 114, 122, 3, -17, -2, 13, -45, 126, 52, -37, 127, -37, -17, 7, 33, -121, -120, -51, -51, -55, -122, 43, -127, 87, -124, -124, 79, -121, 16, -125, -75, 9, -106, -47, -127, 127, -107, -8, 127, -66, 123, -122, -13, 76, 127, -94, 116, -126, -23, 117, 49, -93, 14, -71, 43, -121, 47, 94, -123, 127, 18, 63, -94, 112, 122, 38, 34, 4, 119, -121, 9, 4, -125, 92, -122, -100, 123, -6, -65, 80, 77, -116, -124, 41, -119, 37, 61, -15, 119, 116, -15, 46, -40, 103, 47, 62, 122, -37, -17, -17, 43, -4, -29, -30, -87, -9, 116, -60, 10, 25, -125, 74, -124, 55, -8, -105, 37, -122, 68, -128, -126, -21, -104, -117, 36, -120, -21, -126, 9, -31, 9, -20, 52, -18, 67, -69, -124, -31, -126, 121, -46, 18, -86, 89, 87, -75, -72, -68, 127, 23, -50, 70, 89, 76, 104, 46, 111, 19, 47, -26, 28, 125, -66, -78, 48, 96, -7, 64, 108, 65, -125, -9, -122, 126, 118, -78, 69, 127, 22, -36, 93, 127, 87, -26, -70, 48, 31, -42, 3, 115, 87, -120, -43, 121, 53, 8, -127, 124, -117, -125, 20, 78, 48, 127, -126, -73, -80, 124, 97, 127, -126, -29, 123, 123, -61, -20, 86, 18, 120, 112, -3, -128, 17, -125, 57, -128, -122, 79, -10, -125, 121, -16, 50, -39, 125, 33, 17, 124, 108, -121, -81, -49, -122, 105, -123, 71, -72, 97, 87, -125, 127, -121, -15, -31, 72, 75, 82, 126, -122, 108, -71, -60, 87, 2, 127, 12, -92, 53, -127, 119, -76, -12, -128, 0, 118, 3, 127, 56, 93, -120, 14, 24, -1, -122, -5, -80, 67, 126, -62, 27, 124, 123, 7, -34, -79, 127, 102, 122, 113, -40, 67, -3, 126, -109, -38, 87, -68, 1, 22, 124, -126, 121, 125, -35, 31, 120, -74, -128, -59, 79, 116, -54, -124, 127, -55, -120, -123, 35, 116, 98, -35, -127, 105, -127, 62, 73, -10, 53, -19, 116, -116, 83, 10, -119, 123, 83, 127, 62, 118, -122, -45, 40, 11, -31, -57, -52, -14, -119, -29, 105, 62, -127, 120, -112, -29, -51, -94, -33, 33, 86, -49, 80, -6, 72, -110, 93, 2, -34, 107, 113, 127, 121, 50, -70, -127, -64, 31, 13, 96, -31, -25, 45, 126, -17, -9, 57, 80, -3, -104, 35, 106, 33, -46, -124, 83, -89, -76, -73, 58, -37, -46, 59, 79, -125, -67, -36, -62, 50, -19, -95, -52, -112, 56, 26, 110, -89, -92, -75, -100, 46, 16, 31, 3, -127, -118, -47, -126, -8, -28, 54, 125, 30, -126, 13, -33, 99, -38, -119, -107, 9, 117, -127, 93, 61, 65, -72, -118, 15, 119, 80, 66, 127, -100, 126, 127, 28, 98, -77, -35, -19, -54, 6, 35, 124, -127, 127, 56, -80, -68, -49, -1, 126, 62, -50, 51, 53, -22, -75, -72, -22, 70, -62, -67, 48, 86, -125, 14, 126, 14, -76, -11, -76, -97, 127, 44, -87, -120, -21, -63, -125, -2, -106, 51, 39, 70, 94, 55, -124, 27, 15, -123, -47, 88, -128, -113, 81, 61, -127, -105, -124, 15, -84, -8, -90, -48, -25, -8, 77, -62, -127, 86, 19, 26, -118, -46, -26, 109, 10, -19, 127, -68, 127, -88, 69, -121, 27, -102, -15, 3, 26, 19, -55, -14, -5, 58, 11, 15, -114, -121, 114, 126, -117, 56, -37, 31, 123, 19, 127, 116, -65, -118, -122, -24, 127, 26, -67, 127, -128, -24, 12, 127, -33, 13, -51, -13, 127, -114, -34, -126, 127, -87, -119, -123, -59, 11, -123, -24, 49, 123, 122, -80, 127, -69, -44, 127, -70, 51, 124, 117, -124, -48, -128, 118, -60, -67, 124, 116, -31, 39, -94, -21, -78, -18, 4, -128, 6, 77, 69, 108, 126, 82, -127, -23, -118, 56, -125, -127, 24, -121, 29, 53, -117, 123, 38, -25, -12, 55, 62, -67, 87, 44, -51, 70, 17, 109, 44, -69, 125, 104, 125, 62, 59, 114, 25, -124, -30, 124, 32, 41, 6, 126, -55, 1, -41, 58, 1, -108, 26, -31, 32, 58, 85, 123, 41, 68, -15, 85, -80, -127, -103, 44, -113, 125, 5, 10, -36, 117, -77, 112, -111, 78, 51, 74, -112, 47, 95, -113, 121, 16, -48, 127, 17, 7, -125, 126, 25, -113, 103, -126, 126, 119, 61, 31, 4, -43, -119, 27, 125, 88, 48, -125, 84, -57, 32, 21, 15, -127, -127, -126, 127, 110, -28, 90, 88, -49, 71, -51, 120, 82, -43, -75, 96, 125, 19, -4, 125, -61, -33, -35, -85, 122, -24, -111, 124, -110, -126, -44, 111, 59, 27, -126, -49, 52, 102, -95, -120, -127, 121, 50, 50, 93, -4, -20, -56, 127, -35, 28, -128, 112, -59, 127, -127, -123, 104, 100, -128, 111, -71, -6, -114, -71, 72, 120, 127, 127, -117, -17, -19, -122, 39, -66, 124, -99, -18, 33, -89, 124, -107, 29, -103, 126, -7, 53, 124, -117, 122, 15, 124, 125, 42, 125, -53, 64, 7, -33, 127, -126, 106, 69, -18, 78, -48, 57, -124, -86, -127, -116, -85, -74, -66, -119, -24, 15, 22, 9, -82, -5, 52, -2, 8, -105, 127, 21, -47, 53, -128, 107, -12, 97, -30, -37, 121, -68, 127, 74, -2, -58, 126, -124, 68, 105, -53, -126, -60, -48, 51, 127, -116, -124, 127, 17, -124, -123, 41, 127, 127, 3, -127, -101, -121, 83, -111, 111, 125, -126, 62, -5, 49, 94, -87, -51, 62, 117, 126, 124, -95, 5, 93, 122, -124, -117, 74, -53, -118, -27, -46, 127, 12, 112, -68, -93, -109, 108, -119, 52, -7, -71, 97, -123, 121, 38, 68, 85, 2, -87, 123, -124, 126, 69, -26, -57, 14, 127, -46, 89, 25, -115, -27, 56, 124, -34, -14, 2, 73, -128, 4, 118, -94, 117, -77, 124, 76, -34, 3, 16, -42, -77, 45, 11, -116, -32, 101, 24, 127, 92, -92, 126, -98, -124, 111, 36, -113, -127, 98, -10, -10, 124, -93, -12, -116, 103, -126, -115, -47, -126, 113, 34, 66, -55, -13, 95, 119, -49, -43, 74, 127, 121, 124, -117, 25, 75, 117, -123, -9, 123, -118, 127, 126, -86, -46, 99, 102, -126, 54, 126, 125, 91, 21, -86, 103, -127, -121, -35, 127, -127, 65, -37, 123, -117, -56, 44, 58, -123, 91, 13, 124, -8, -44, -123, -101, 127, -125, -85, -1, -63, -9, -111, -100, -19, 118, -20, -94, -127, 7, -123, -128, -18, -124, 108, 125, 109, -49, -76, -77, 11, -28, -126, -85, 126, 108, 116, 118, 79, -72, -39, 23, -60, -87, -29, -102, 79, 81, -14, 124, -64, -120, 109, 61, -122, -77, 102, 127, -16, 119, -113, 103, 119, 118, -72, -82, -31, 127, 121, -49, -13, 123, 124, -42, 124, 2, -74, 94, 12, -125, 44, -74, 17, -127, 103, -14, 11, 58, 17, -13, 62, 86, -127, 79, -122, 121, -23, -87, 91, -128, -123, 100, 127, -85, -62, -127, -23, 121, -13, -69, 55, 94, 123, -119, 116, 111, -17, -35, -77, -5, 126, 28, -31, 126, -42, -54, 127, 49, 86, 127, 60, 25, -128, -116, 62, -110, 113, 118, -26, 0, 69, -75, 116, -31, -115, -2, -112, -127, -61, -5, -122, 44, -119, 117, 87, 26, -50, -115, -122, 70, -110, -94, 65, -23, 125, 33, -125, 103, 91, 123, 109, 123, -17, -13, 126, 46, 17, -102, -33, 125, 117, 120, 97, -82, 109, 14, 24, -24, 63, 16, 62, -3, 61, 42, 71, -38, -73, 72, -127, 70, -68, -67, -36, -7, 90, -125, 124, -122, -117, -24, -78, 0, 113, -19, -60, 52, 68, -7, -126, 10, 79, -22, 57, 22, 100, 126, -15, 66, -113, -85, 122, -128, -12, -58, 127, -125, 64, 105, 45, 107, 117, 88, 29, 62, 122, 106, -83, -121, 7, 44, -97, -125, -127, 72, 2, 28, 118, 9, -124, 79, -57, 99, 38, 127, 43, 90, 26, -34, -59, -125, 118, 43, 24, 55, 127, 96, 49, 1, -116, 106, -5, -90, 115, -48, -53, 127, -39, 18, 125, -54, -124, 116, 18, -58, -91, 68, 102, -8, -22, 110, -86, 88, 90, 121, -46, 19, -45, 113, -34, -119, -68, 5, 3, 18, 106, 20, -127, -119, 127, -91, -45, 24, 119, -61, -69, 81, 56, -77, 104, -58, -107, -100, -46, 15, 45, 62, 108, 71, 6, 114, 11, 8, -31, 9, 126, 127, 125, -86, -42, 15, 125, 81, 127, 89, -90, -53, -112, 12, -34, 81, 79, 0, 127, -1, -124, 16, 1, -32, 127, -32, -92, -125, -77, 3, 85, 110, -18, -15, 51, 54, -83, -19, -93, 65, -22, -3, -98, -128, -29, -84, 121, -125, -29, 27, 46, 119, 37, 125, -96, 49, 119, 85, -40, 1, 92, -96, 34, 18, 15, 44, 58, 127, -27, 20, 10, 124, 44, -13, -108, 17, -128, 61, 37, 11, 73, 61, -28, 27, -96, 67, 29, 99, 53, -51, 125, 119, -59, -12, -60, 30, 67, 121, -43, 64, 103, -11, -20, 31, -81, 55, 66, -127, -39, -19, -13, -122, 98, 69, 32, 46, -127, 111, -36, 113, -72, 70, -65, 56, -125, 94, 47, -82, -117, -111, -58, -128, 32, -10, 51, 13, 99, 31, -27, -36, -52, 24, 33, -97, -98, -31, -86, -125, 122, -52, -86, -107, 50, 57, -82, -124, 16, -93, -108, 84, -52, -10, -92, -85, 83, 3, -110, 127, 116, 76, -43, -42, -103, -111, 121, -120, 8, 37, 50, -122, -115, 34, -22, -84, 127, 9, -19, 36, -126, -34, -39, -118, -15, -112, -3, -80, -69, 77, 23, -73, -112, 44, 100, 51, 99, 38, -112, -5, -69, -56, -120, 123, 113, 72, 84, -64, -51, -123, -90, -59, 3, -105, -110, -3, 47, 117, -20, 123, 112, -7, -120, -52, 85, 24, -36, -128, -51, -27, -5, -90, -6, 103, -54, -89, -40, -116, -42, 125, 111, -22, -126, 7, -93, -127, -119, -67, -94, 127, 123, -118, -108, 27, 15, 1, -17, 23, 127, 45, -125, 124, 50, -68, 58, 47, 127, -125, 14, 56, -51, -30, 36, 126, -113, 105, 119, -25, -32, -43, 115, 44, -104, -57, -23, -33, 19, 22, -20, 26, 22, -95, -29, 9, -32, 7, 107, 35, -47, -29, 2, -21, 55, -126, -90, -128, 3, -125, 127, -33, 74, 54, 121, 60, -77, 126, 65, -21, 18, 4, -70, -126, 48, -127, -20, -9, 30, -125, -125, 88, 58, 121, -69, -63, -31, 125, -14, -125, -46, 26, 28, 20, -115, -72, -120, 27, 127, 125, -71, 25, 123, -28, 122, -126, 61, -29, -124, 62, 101, -93, 47, -2, -120, -59, -97, 46, -69, 127, 6, 74, -125, 83, -87, -123, -30, 20, -74, 55, 71, -83, -123, 125, 36, 3, 4, 112, 64, -120, -18, 126, 37, -91, 63, 52, 32, 81, -71, -76, 50, -12, 17, 120, -105, 23, -106, 78, -96, 60, 75, 57, -50, -11, -40, -65, -111, 11, 25, 87, -97, -31, 35, -34, -56, -8, 3, -122, -9, -39, 123, -127, -127, -29, -124, 63, 84, 102, 44, 11, 80, -56, 41, -102, -13, 125, -95, -55, 50, 51, 5, 112, 100, -48, -17, -53, 0, -112, 14, -30, 61, -7, 32, 38, 89, -125, 122, 40, 35, 100, -1, -37, -13, -73, -25, -37, -89, 126, -121, 18, 79, 76, 115, 21, -7, -54, -50, 124, 118, 100, -118, 92, -4, -117, 90, -107, 104, 40, 81, 16, 119, 93, 61, 126, -127, -40, 25, -36, 16, 66, -5, -27, -101, 57, 95, 114, 79, 13, -41, 5, -12, -38, 13, 71, -55, -57, -76, 127, 16, 73, -31, 33, 75, -76, 25, -125, 3, -5, -61, -35, 119, -22, -114, 50, -50, -59, 87, 69, 118, 70, 8, 126, 11, -30, 126, 18, -125, -39, 16, 37, 60, -120, 119, -20, 7, 26, 99, 12, -38, -1, 103, 119, -22, -6, 24, -110, 111, 24, 110, -125, 24, -1, -85, -9, 42, -51, 113, 123, 6, -111, -37, 19, 1, -124, 127, -127, -32, -128, -104, 13, 89, -4, 92, -92, -114, 0, 120, -62, 2, -13, -36, -33, 127, -128, 51, -19, 52, -126, -54, 119, 51, 77, 123, 127, 40, 86, 77, 38, -15, -69, 28, 8, 13, -2, -127, -96, 121, 29, -1, 55, 67, 75, 127, -127, -41, -27, -108, 68, 18, -11, 40, 8, 127, 25, -52, 2, -110, 18, 115, -70, 8, 117, -87, 22, 36, -16, -110, -14, 66, -54, -49, -57, -7, -99, 42, -27, 28, 39, -64, 35, 18, 12, 109, -111, 77, 22, -120, 56, -4, 75, -39, -102, -47, 18, -115, 121, -22, -81, 54, -81, 13, -11, -125, -28, 112, 17, -74, 118, -5, -31, -6, 11, -116, 28, -69, 10, 84, -121, -62, 46, -127, 4, -33, -28, -9, 54, -25, 29, -11, 105, -113, -124, 45, 17, -91, 74, -107, -40, -89, 49, -43, -51, -70, -43, 69, -31, -34, -49, 48, 47, -119, -48, -125, -50, 121, -15, 10, 5, 127, 117, -19, -128, 30, -103, 81, -22, -28, 61, 4, -62, -11, 4, 24, -97, 47, 38, -42, -59, -125, -49, 83, -15, -119, 102, 29, 89, 53, 116, -109, -95, 73, 16, -17, -54, 3, 127, 63, 10, -61, -111, 104, -15, 41, 62, -43, -32, 74, 72, -93, 125, 127, 122, 116, -115, -14, -91, -63, 51, 14, 11, 121, 104, -33, -8, -103, 31, -44, 81, -31, -79, -49, -29, -39, -3, -87, 20, 37, -94, 26, 62, 20, 16, 49, -6, -43, 103, 37, 7, -17, -122, -15, 10, -111, 13, 99, 14, -95, 8, 69, 69, -64, -25, -8, -96, 113, 112, -15, -99, -127, -12, -31, -113, 16, 111, -12, 24, 116, -6, 10, 96, -34, -63, 49, -14, 2, -126, 9, -20, -10, 108, 2, 123, 127, -69, 40, 90, -54, 12, -50, 125, 87, -106, 31, -127, -36, -88, -26, -116, 70, -125, 15, -72, 104, 120, 74, -88, 105, 13, -20, -12, -124, -40, -87, 6, 108, -125, -87, -1, 23, -39, -76, -87, -60, 62, -108, 28, -31, 31, 9, 24, 79, 15, 17, 78, 4, -47, -12, -39, -14, 71, -17, 70, 69, 58, 30, 42, 60, 32, -16, -26, 71, 13, 101, 3, -99, 44, 98, 28, -24, 14, -24, 125, -59, -29, 122, 16, -35, 53, -36, -38, -4, 84, 2, 61, -3, 115, 59, -85, 49, 73, 16, 85, 97, -92, -1, 41, 18, 6, 30, 9, 37, -26, 115, 9, 110, -22, -50, 45, -127, -50, 4, -9, 54, 63, -55, -18, -125, -12, 20, -4, -99, -8, -23, -42, 19, -9, -42, 3, -61, -11, 26, -10, 2, 43, -33, 44, 3, 105, 124, 26, -21, 48, 21, 117, -63, -118, -126, -44, -42, -122, -75, 127, -42, 25, 122, -75, -122, 28, 18, -27, -127, 19, 15, -122, 27, 80, -13, -18, 25, 89, -16, -52, 127, 126, -89, 96, 45, 117, 82, 81, 103, -33, 84, -124, 69, -51, -113, 5, 80, 123, 125, 98, 61, -86, 59, -46, -44, -29, -62, 124, -125, -118, -13, -10, -13, 81, 103, 107, -24, -45, 82, 26, -27, -34, -81, -41, -41, 10, -18, 40, -128, -125, 44, 25, -80, -1, 3, -85, 63, 37, -6, 94, 47, -80, -12, -3, -21, -17, 125, -28, 48, 19, -35, 46, -12, 37, 3, -10, -51, 28, -70, -62, 22, 66, 34, 58, -70, 67, -106, 91, -94, -12, 83, 111, 8, 114, -17, 8, 9, -20, 1, 113, 99, 69, 19, 35, -26, -128, -54, -10, -41, 96, 71, -93, 12, 44, 3, 22, -21, -5, -18, 126, 42, 48, 85, 12, -54, 2, 25, -52, 93, -128, -26, 78, 123, -25, 27, 8, -118, 50, -3, 75, 40, 35, -11, 107, -13, -93, -13, -24, -24, 72, -85, 10, -61, 51, 116, -100, 21, 67, 118, 36, -71, 37, -20, 46, 16, 54, 126, -93, -15, -5, 33, -114, -11, -5, -88, -11, -24, 54, 82, -66, -44, -128, 82, 87, -122, -51, -60, 123, -29, 33, -125, -13, -59, -8, -22, -4, 37, 24, 28, 123, 93, 86, -66, -12, 44, 124, -106, 51, 104, 19, 49, 82, 77, 11, -109, 58, -5, 19, -73, -56, 127, -74, -12, 120, -118, 1, 121, 116, 20, 70, -15, 53, 84, -47, -27, -18, -123, -17, -3, -23, 5, 28, 68, 120, -65, -33, 111, 122, -113, -45, -19, 18, -119, -90, -126, -33, 45, 36, 18, -35, -121, -10, -102, 37, 127, 112, -95, 44, -126, 59, 102, -81, 114, 85, 3, -50, 81, -52, -54, -32, -13, 39, 66, 41, -88, 120, -123, 125, 87, 23, 67, -53, -43, -25, -125, 63, 41, -105, 35, -39, -108, -123, -34, -41, 10, 88, -7, -31, -127, -113, 31, -59, -92, 62, -127, 96, 109, 127, -11, -27, 115, -71, -40, 45, 123, -40, 38, 60, 124, 17, -60, 95, 117, -23, -9, 64, 100, 126, -40, -56, -7, 126, 24, -125, 51, 37, 26, -115, 76, -51, -91, -29, -75, -116, 72, -87, -71, 80, 63, -95, -1, -24, -57, -32, 25, 105, 14, 20, 60, 74, -128, 126, -29, 92, 43, 127, -75, 126, 116, 127, -10, 116, -126, -25, -37, 26, 58, -92, 27, 67, -43, 56, -78, -32, 76, 71, 73, 48, 76, -92, -126, 55, 24, 55, -104, -18, -58, 24, 109, 30, -128, 115, 66, 7, 31, -85, 116, 85, 106, -53, 39, -33, 61, 10, 100, 79, -13, -5, 126, 25, -21, -98, -74, -41, 7, 12, -8, -85, -121, 65, -4, 11, -9, -89, -30, 5, -39, 49, -44, 90, 100, -83, 42, 120, -24, 53, 122, -114, 2, -83, 38, 17, -31, -43, -38, -56, -67, 26, -49, -48, -121, -41, -125, -1, -3, 59, -77, 9, 76, -55, -53, -11, 1, -38, 51, -112, -76, 101, -24, -9, 3, 24, -48, 67, 26, -52, 47, 7, -24, 44, 82, 13, -47, 50, 3, -97, 39, 56, -18, 49, -69, 126, -14, -3, 82, 6, -75, -18, 4, 14, 127, 57, 76, 23, -53, -7, 34, -45, -100, -94, -97, 12, -32, 20, 51, -53, -17, -77, 69, 103, -124, -112, -95, -122, -18, -116, 35, -110, 79, 109, 38, 56, -124, -13, -87, -86, -43, 54, 108, -108, -6, -11, -68, -11, -124, 8, 122, -7, 86, -111, 117, -127, 65, 107, 63, -126, -127, 126, 30, 42, 6, 53, 123, 32, 126, -71, 20, 32, 125, -125, 96, 126, -106, -48, -125, 80, -127, -106, -105, 69, -98, -126, -119, -20, 80, -128, -73, 55, 119, -127, 92, -12, -77, -12, -38, 35, -117, 44, 3, 37, 126, 119, 28, 61, -72, -127, 24, -24, 120, 123, 3, -127, 78, 61, 40, -128, -28, 71, 14, -47, 81, -111, -57, -127, -40, -40, -121, 36, -116, -127, 4, -79, -20, 81, 62, -107, 24, 16, 105, -8, -38, -85, 127, 90, 13, -106, -15, 74, -68, -56, 4, 47, -89, 28, 89, -68, 9, 40, -25, 32, -33, -119, -21, 25, -74, 68, 112, 19, -77, 30, -5, 108, -118, 27, 120, -127, 100, 0, 41, 67, 14, 43, 100, -107, 77, 127, 70, 48, -106, 52, 17, 40, 90, -11, -68, 34, 111, 77, -35, -56, 43, -126, -49, -31, 6, 5, -117, -74, 12, 49, -63, -68, -36, -97, -117, -123, 85, 112, -38, 124, -126, -110, 104, -106, 80, 125, 86, 60, 52, 32, -20, -15, -102, -5, 23, -9, -31, -126, 121, 41, -88, -97, 33, -20, -65, -10, 112, 45, -85, 58, 114, -32, 25, -2, 35, 59, -99, -22, -40, -71, 0, -58, 85, -58, 18, -55, 60, 0, 88, 9, -14, -56, 18, -34, -91, -18, -34, -14, 7, 122, -121, -126, -35, 95, -40, 105, 6, -2, -46, 115, -125, 52, -117, 17, 2, 9, 25, 52, 18, -112, -84, -71, 62, -97, 22, -80, 9, -22, -75, -104, 127, 76, 6, -127, -120, -104, 17, -86, -54, 98, -127, -111, 57, -126, 68, -122, 13, -98, -49, -125, -1, -118, 121, -37, 35, -111, -122, -113, -125, -51, -90, 78, -124, 127, 1, 58, 17, -123, -51, -81, -122, 34, -32, -66, 14, -113, -126, -124, 127, -126, -15, 92, -95, -121, -100, 20, -3, 89, -9, 127, -48, 15, 2, 126, -55, -10, -20, 125, -109, -32, 68, -119, -15, 17, -46, -10, -100, 13, 127, 120, 48, -121, 126, 46, 71, -76, -75, -89, -34, -122, 65, -21, 43, 11, 102, -128, 44, 127, 126, -120, -19, 81, 127, -1, -125, 31, -36, 127, 43, -60, 66, -99, -127, -50, -56, -80, 119, -22, -2, -84, -125, -17, -65, 126, -63, 105, 51, 86, 46, -123, -13, 106, -54, 117, -9, 119, -13, 30, 83, -121, 126, 17, 63, 7, -22, 60, 7, 26, 18, -23, -39, 8, -63, 43, 124, -39, 40, -27, 18, -42, -31, -90, -51, -113, -51, -16, -62, -33, 96, 39, -76, -78, 110, -49, 51, 11, -10, -72, 31, -110, -73, 2, 24, 66, -125, -49, -45, 39, -128, -12, -117, -28, -23, 75, 1, -122, -13, -63, 104, -44, 14, 3, -78, -25, -6, 104, -81, 123, -66, -96, -47, 70, 127, -107, -124, -66, -102, -94, 127, -121, 32, 89, 53, -21, -128, 8, 24, 56, 36, -59, -70, -73, -43, 45, -127, 73, -117, -35, -53, 34, -128, 2, 83, 127, 1, -45, -14, 6, -44, 6, -34, 117, 127, -34, 64, 6, -43, -61, -80, 0, 15, -29, 11, 22, -23, 38, -124, -30, 108, -78, 25, -54, -57, 48, -40, -108, -97, -94, -117, -47, 18, -96, 1, -120, -69, -84, 10, 126, -128, 112, -14, -18, 14, -34, -119, 28, -105, -100, 113, 49, 30, -47, -70, -123, -4, -125, 15, -115, -128, -3, -110, 126, -42, -126, -11, 21, -63, -123, 127, 121, 108, -80, -45, 86, 60, 64, 115, 115, -91, 25, 18, -121, -117, 62, 47, 9, -125, 67, 4, 88, 106, -127, -125, 123, 69, 125, -81, -126, 119, -88, 3, -128, 8, 66, -42, -127, -17, -15, 4, 17, -97, 22, 127, 98, -114, -19, -67, -17, -90, 78, -35, 114, -21, 110, 119, 122, 64, -90, -8, -70, -94, -59, -49, 127, 0, -54, 55, -21, -113, -33, -127, 70, -100, -24, 10, 41, -76, -64, -52, -126, -46, -20, 19, 49, -126, -33, -127, 127, 125, -110, -4, -56, -70, 45, 3, 18, -122, 91, 11, 102, -39, -53, -126, 111, 71, 33, 116, -105, -106, 12, -7, 30, 37, 47, -92, 42, 9, -121, -45, 23, 87, -20, 125, 117, -13, -126, 56, -16, 28, -90, -35, 77, 58, -10, 63, -67, -24, 45, -29, 8, -31, 119, 0, -13, 100, 122, -33, -50, -34, -18, -19, -58, -124, -22, 35, 29, -128, -89, 8, -86, -4, 0, 44, -114, -47, -32, -62, -35, -123, 19, -72, -84, -60, 7, 110, -19, 45, 70, -9, 120, -125, 9, -74, -97, 71, 17, 3, -40, 1, -103, -94, -33, 127, -31, -12, 10, 0, -4, -20, -75, 28, 84, -57, -15, 43, 17, 29, 40, 60, -9, 118, 58, 27, -89, 42, 75, -106, 122, 31, -114, -114, 43, -35, -90, 95, 116, -106, 6, -22, 100, 37, -72, 11, -6, 87, -88, -126, -119, -31, 44, 29, 59, 50, -60, 32, 75, -115, -18, 28, 126, -62, -126, 14, -21, -34, 126, 122, -74, -36, -38, 106, -119, 116, 92, 58, -81, -121, -78, -127, 6, 127, -70, -97, 112, 63, -105, -11, -40, 127, -23, -127, -127, 26, -34, 75, -124, -28, -115, 78, 28, -30, -124, -41, 15, 120, 127, 81, 72, -35, -114, -38, -93, 72, 71, 82, 57, 12, -8, 73, -126, -127, -39, 101, -95, -92, 126, 54, -30, 11, 26, 34, 74, 39, -127, -22, -123, 113, 23, 23, -14, -123, -73, -35, -128, 100, -122, -80, 32, 23, -118, -40, -53, 48, 18, 21, -42, -104, -22, -127, -19, 55, -57, 64, -89, 24, 11, -1, -12, 99, 10, -52, 41, 37, -123, 62, 123, -4, -57, -51, 127, -45, 121, 124, -39, -113, 10, 7, -111, 53, 55, 112, -124, 51, -85, 30, 7, 6, -4, -50, 21, -124, 110, -126, -6, 2, -71, 115, 13, 0, -64, -43, 8, 8, 7, 4, -49, 82, 10, -2, 125, 124, -58, 68, 29, 9, 37, 78, -86, 60, -34, 85, -106, -52, 19, 4, 86, 118, 46, 113, 20, -103, 113, -75, -57, -54, -65, 86, -16, 12, 68, -90, 84, -37, -31, 23, -37, 25, 26, -54, 32, -27, -121, -26, -67, 124, -24, 20, 124, -75, 74, -28, 14, -29, -19, 33, -36, 87, -2, 5, 6, -121, -17, -1, 106, -20, -19, -17, 97, 15, -25, -53, -9, -60, -34, 61, 35, 11, 84, 11, 0, 30, 127, 17, -43, 41, 93, -12, 75, -71, -54, 47, 11, -47, -57, 40, 8, -36, -36, 127, -120, 17, 57, -15, 38, -101, 55, -72, -43, 32, -73, -12, -22, -126, -20, -95, -17, -53, 23, 3, -53, -9, 27, 122, -5, -25, -40, 18, -32, -5, -20, 11, -64, 61, 68, 127, 20, -41, 35, -22, 26, 127, -102, -55, -57, 51, -21, -45, 34, 47, 0, 85, -3, -10, 42, 43, 11, -34, -10, -4, -67, -89, 92, 25, -62, 7, 20, -117, -41, 103, 70, 34, 45, 38, 53, 26, 64, 39, 51, 27, -70, 42, -36, -14, 35, -6, 121, -25, -23, -105, -44, 127, -64, 23, -10, -53, 70, -63, -23, 5, -15, 28, 85, -51, 101, -71, -41, 53, -52, -26, 19, -46, -64, 25, -21, 16, -13, -63, -68, 26, 52, -61, 116, 24, -88, 15, -20, 7, -3, 1, 97, -16, -16, -100, -103, 4, -8, 88, -89, 24, 51, -12, -6, 30, -32, -69, 20, 82, 18, -8, -41, -56, -67, -111, 92, -77, 70, -30, 5, -3, 11, 26, 10, -115, -30, -17, 26, -30, 41, 84, -27, -1, -11, -8, -125, -21, 12, -35, 124, -13, -48, -13, 16, 9, 4, -75, 24, 11, 37, -42, -11, 26, 22, 29, 54, -9, -94, 107, 112, 57, 18, 84, 97, 26, 0, -121, 6, 28, -1, -55, 54, 9, 46, 68, -21, 55, -1, 6, -47, -28, 9, -24, -28, 61, -45, -102, 114, 43, 45, -37, 11, 6, -15, -102, -70, 49, -125, -8, -16, -53, -24, 68, -6, 21, -13, 10, -28, 120, -54, 2, -77, 27, -62, -112, -104, -14, -59, 45, 35, -117, 7, 34, -28, -63, 26, 59, -14, -43, 22, 36, -86, 18, -16, -12, -58, 15, 51, 56, -73, 24, -13, 67, -15, 125, -13, 12, 8, -56, 44, 62, -77, -10, 76, -122, 87, -27, 21, 19, -39, 10, -2, 44, 12, 113, 31, -11, 37, 16, -19, 56, -53, 9, -43, -25, -13, 45, 34, -45, -35, -10, 35, -118, -33, -126, 1, 122, -37, -21, -15, -128, -125, -29, 24, -123, 21, -47, -36, -66, 35, -20, -9, 39, -50, -122, -2, -18, -12, -59, -24, 14, -87, 109, -46, -67, 51, -125, 66, 72, -13, 57, -112, -116, -42, -110, 68, 2, 43, -76, 34, -61, -114, -60, -81, -33, 1, 33, 37, -36, -10, 35, 24, -19, -17, -40, -32, 52, -28, -48, -13, -89, -91, -66, -35, 126, -27, 1, -50, 74, -60, -17, 16, 75, 44, 28, 105, 103, -4, -9, -43, -76, 6, -10, -124, 39, -27, 19, -47, 25, 126, -44, -4, -116, 22, -32, -49, -106, -95, 111, 15, -10, 4, -121, -20, 84, 76, 70, 18, -57, -23, -92, 69, 1, 70, 78, 13, -21, 114, 58, -20, 23, 50, -28, -16, -6, 118, -67, 127, -22, -79, -37, -31, -40, 108, 42, 11, 79, -41, 59, -23, -115, 11, 14, 38, 86, 3, -25, -3, -102, 3, -113, -43, 38, -54, 30, -90, 120, -72, 9, -87, 49, 90, 49, -20, 14, 11, 15, 33, 115, 125, -12, -68, -59, 21, 6, 27, 21, -127, -77, 20, -45, -1, -46, -77, 57, 105, -77, 2, 29, 78, -35, -104, -75, 96, -50, 52, 22, -21, 38, -73, -14, -3, -49, 23, -65, -13, -112, 95, 125, -120, -123, 96, -74, 108, -5, -20, 17, -19, 67, -17, -54, -47, 81, -7, -32, -10, 25, 7, -5, 111, -128, -36, 51, -55, -1, -18, 3, -20, 20, -32, 31, -37, -24, -31, -70, -95, -17, -1, 40, 73, 33, 10, 88, 45, 71, -24, 27, -47, -13, -78, 121, 63, -127, 26, -21, 104, -3, 31, 4, -21, 26, -38, -37, 42, -10, -3, 119, -15, 11, -119, -128, -128, 0, -11, 54, -109, 37, -96, -107, 55, 37, -17, -97, 11, -88, 70, -29, -31, 6, -52, -73, 17, 120, 69, -17, 12, 107, -10, -23, 16, 117, 122, -47, 4, 61, -86, -47, 27, -100, 50, 114, -92, 95, 43, 47, -31, -34, 107, 99, -127, 53, -11, -26, 57, -16, 57, -97, 0, -113, 59, 6, -10, -99, -2, 60, -63, 5, 8, -43, -15, 9, 39, 126, 28, -4, -74, 27, 34, 19, -71, 83, 78, 57, 37, -98, -72, 33, -26, -103, 82, 29, -71, 20, -4, 1, -49, -127, -85, 24, -37, 28, 30, -39, -24, -15, 40, -6, -61, -46, -39, -108, -26, -21, 17, 63, -61, 77, -29, 41, -20, 52, -49, 117, 2, -35, 9, 127, -66, 7, 22, -10, -42, -69, 14, 59, -106, 12, -87, 6, 2, -13, -123, -94, 32, -116, -76, 35, 17, -76, 21, -7, 53, -18, -13, 13, -110, -30, -21, 109, 73, -24, 75, 4, -34, 46, 127, 78, 40, -84, -15, -66, -7, 96, -14, -58, -47, -12, 71, -4, -6, -87, 28, 76, 0, 7, 84, -58, -34, -45, 30, -84, 9, -125, -43, -25, -34, -40, 127, 80, 72, 114, 107, 16, 60, 87, 12, 127, -29, -12, 84, 126, -86, 92, 127, 91, 86, -123, -91, 126, -45, 43, -103, -21, 60, 14, -15, 25, 50, 14, 19, 92, 25, 5, 6, -26, 50, -18, -37, 120, -81, 46, 3, 31, -6, -66, -107, -13, 73, -31, -94, -54, 7, -58, -20, -16, 77, -30, -40, 127, -61, 69, -21, -66, -24, 48, -55, 9, -25, -31, 44, 127, -17, -54, 71, -20, -28, -42, 5, 6, 23, 33, 19, 4, -21, 74, -106, 32, -98, -119, -89, 102, 46, -29, -50, -95, -115, 127, -34, 32, 10, 17, -23, -12, -69, 35, -7, -1, -76, 64, 37, -114, 59, 83, 34, -22, -61, 3, -31, -100, -120, -88, 22, -128, 127, -11, 10, -100, -107, -122, -6, -49, 8, -38, -28, -45, -83, -31, -20, -39, -1, -63, 124, -22, -31, -33, -6, 23, 5, -3, 38, -123, 73, -23, 104, 25, -27, 79, 115, -48, -44, -125, 25, -1, -67, 20, 117, -35, 112, 86, 15, 23, -111, 122, 21, 9, -7, -128, -2, 0, -125, 31, 42, 11, 37, 122, -119, 29, 51, -31, 51, 46, 30, 127, -110, 29, 49, -3, 30, -75, -21, -42, -29, -127, -49, -43, 123, 102, -16, -106, -28, -127, -83, -74, 24, -9, 126, 3, 36, 107, 67, 11, -18, 54, 77, 18, -28, -15, 15, 45, 69, 80, -47, 112, 82, -104, 2, -24, 20, -10, -79, -39, 1, -27, 30, 13, -1, -77, -10, -3, -106, -6, 13, -32, 123, -16, 27, 1, 90, -64, 12, -96, -33, -61, 65, 53, 102, -41, -44, 51, -47, 65, -23, -9, 61, -81, -9, -21, 61, -58, -48, 122, 58, -54, 6, 20, -112, -35, -104, 10, 122, 100, -69, -51, 57, 52, -29, 90, 74, -115, 18, 35, -127, 124, 62, -9, -5, -82, 13, 8, -63, -42, 3, 15, -23, 23, 41, -51, 87, 123, -36, 11, -34, -74, 38, -5, 36, -52, -74, -4, -2, -122, 19, -66, -11, 10, 50, 75, 4, -25, -1, -12, 57, 108, 84, -38, 29, 123, 62, -18, 39, -120, 14, 13, 78, -1, 2, -82, 7, -93, -78, 5, 75, 48, 44, -60, -33, -5, -48, -20, 39, 28, -86, -25, -69, -28, -102, -103, 121, -120, 18, 108, 65, -62, -40, -128, 0, -49, 31, 37, 29, 88, 33, -96, -59, 23, -45, 59, -105, 84, -63, 11, -41, -13, -27, -54, 83, 64, 117, 14, 5, 76, -112, 16, 94, -61, 28, 101, -56, -9, 2, 89, 23, -78, 58, -49, -22, 60, 18, 34, 19, 62, -93, -27, -47, 76, 4, -33, -35, -12, -23, 87, -43, -2, 21, 26, -49, -68, 22, 18, -60, -43, -31, 32, -28, -93, -11, 11, 26, -45, 7, -40, 6, -76, 86, -30, -79, -77, -34, 1, 47, -34, -83, -124, 57, -35, -17, 18, -1, -36, -18, -123, -119, 29, -2, -4, 37, 34, -67, 84, -80, 49, 7, 89, -123, -127, 43, -55, 46, 66, 100, -6, -31, -122, 81, -34, -71, -58, -15, -15, -24, -18, 80, -24, -68, 28, -12, 71, -76, -32, 2, 12, -120, -24, -20, -96, 15, 3, -88, 51, 0, 37, 37, 106, 73, -17, -23, 97, 39, 36, -1, -88, -45, 87, -78, 75, -119, 4, 5, -1, 11, 23, -18, -33, 114, -36, 90, 27, 91, 10, -15, 16, -90, -52, 16, 59, 41, -38, 19, -127, -91, -45, 26, 55, -61, 37, 45, -19, -10, -65, 127, 9, -44, -84, -79, -16, 69, 43, 1, -63, 118, -123, -1, 121, 12, 53, -90, 15, -42, -19, -33, -62, 32, -24, -57, 36, 66, 77, 13, -37, 17, 97, 59, -61, -126, -19, 35, 83, 91, 21, -18, 39, 78, 58, 55, -29, -44, -38, 20, 29, -26, -127, -84, 0, -7, 127, 70, 22, 24, -56, 58, 36, 44, 73, -33, 121, -85, 115, -106, -93, 82, 64, 26, -16, -59, -24, 4, 24, 33, 36, 20, -8, -45, -22, -75, 35, -15, 40, -21, 56, 80, -77, 36, 108, 90, 84, 6, 13, -67, -29, 56, 89, -24, 71, 17, 64, 6, -75, -10, 72, 28, -54, -70, 31, -39, -30, -110, 72, -21, 48, 86, 15, -127, 26, 65, 8, 30, 15, -17, -89, -85, 112, 20, 21, 8, 30, 74, -68, 40, -30, -64, 22, -14, 5, -10, 38, -1, 109, 73, -46, 107, -58, 5, -67, -123, 0, 111, 124, 3, -68, 11, -126, 50, 49, -53, 104, 20, 36, 116, 0, 15, -16, 18, 84, 47, -72, -84, -26, 1, -74, -20, 122, -40, 47, -29, 96, 63, 20, -36, 101, 31, -46, 21, 31, -50, 5, 84, -42, 11, -117, 37, -63, 86, 91, 112, -10, -12, -16, -41, 62, 16, -95, 25, -48, 30, 117, 0, -1, -5, -57, 101, -6, -59, -52, -8, -34, 83, -6, 51, 9, -95, 98, 18, -74, 8, 1, 34, -13, 22, -58, -128, 36, -40, 5, -26, -49, -89, -14, -40, -93, -92, 82, 25, -26, -60, 68, 6, 49, 18, 33, 18, -10, 15, 22, -7, -63, -58, -52, 16, 35, 55, -32, 27, 12, -24, -19, 74, -21, -34, -124, -19, -3, 112, -41, -117, -94, -91, -46, -116, -108, -42, 59, -46, -61, -109, -66, 37, -67, -47, -91, -74, 3, -23, -4, 30, 95, 75, -76, -122, -123, -9, -82, -68, 32, -48, 124, -81, -125, -90, -99, -127, -102, 69, -12, 85, -60, -43, -126, -79, -112, 59, 24, 54, -126, 127, -82, -18, 39, -126, 9, -53, -124, -19, 17, -49, -86, 24, 1, 12, -80, 75, -35, 48, 2, 11, -26, 68, -119, 50, -9, -46, 17, 39, -95, -25, -60, -8, -60, 9, 121, 125, 2, -83, -99, 50, -47, -38, -123, -42, -124, 50, -125, -40, -14, 102, 125, -88, -42, -127, -6, -27, -98, 58, 41, -21, -9, -39, -31, -78, -66, 115, 112, 8, -25, -105, 2, -84, 10, -13, -67, 3, 105, 108, -28, 84, 37, -92, -2, 116, 24, 68, -97, -127, 16, -125, -73, 23, 105, 44, 127, -21, -67, -40, -42, -88, 48, -32, -26, -105, 6, 36, -56, 27, 18, -3, -97, 54, -30, -113, 0, -127, -23, -88, -123, 19, 36, -56, -61, 4, 41, -61, 57, -128, -38, -68, -3, 125, -10, 11, 4, -7, -10, 85, 38, 126, 5, 57, -124, -99, -94, -18, -72, 79, -30, -97, -124, 123, -43, 46, -33, -6, -88, 12, -6, 30, -76, -6, 27, -26, 47, -67, 126, -58, -23, -16, -47, 15, -71, -97, 2, -127, -62, -124, 82, -60, 5, 13, -56, -50, -13, 75, 43, 12, -1, -127, -4, 30, 67, -38, -77, 75, 10, 32, -127, -59, -24, 33, 4, 0, -108, 11, -89, 0, -86, 60, 1, -18, -127, 0, -122, -54, -48, 20, -90, 102, 121, -86, 127, -25, 79, -13, 2, -54, -29, 66, 0, 15, -94, 24, -33, 114, -12, 127, 66, -7, -11, 69, -37, 38, 20, -58, 2, -71, -25, 69, -119, -63, 60, -63, 41, -43, 24, -10, 82, 5, -29, -26, -125, -52, -45, -21, 54, 3, -4, 8, 39, -75, -83, -127, -67, 16, -77, 72, -12, -10, 104, 14, -127, 46, 22, 5, -4, 127, -34, 15, 72, 126, -8, -83, -10, 6, -57, -44, -109, 35, 11, 2, 35, 9, -24, -29, -12, -7, -114, -40, -127, 120, -48, 10, 48, -33, -39, -124, -119, 113, -63, 22, 123, 126, 33, 61, -11, -13, 95, 6, 87, -56, -122, 7, 127, -63, 37, -95, 125, 68, -30, -92, 28, -13, -105, 91, -20, 21, 87, -58, 17, -20, 34, 113, 126, -26, -61, -127, 54, -11, -61, 11, -29, -53, 71, 24, 60, 26, 76, 43, 15, 117, 12, -57, 25, -126, 12, -47, -55, -2, 19, -43, 105, 115, -14, 12, -58, -56, 47, -16, 56, 68, -7, 6, -75, 57, -51, -4, 17, 21, 56, -30, -2, -120, 20, -39, -127, -1, -1, 53, -50, 29, 50, -27, -69, -128, -78, 37, -85, 125, 5, 11, 66, -36, 22, -1, 124, 10, -50, -88, 116, -67, -3, -12, 24, -20, -22, -59, 89, 112, -19, 24, -31, -46, 125, -7, -126, -6, 23, 24, 8, -26, 62, -88, 126, -77, -34, 7, -39, 61, -4, -30, 3, -128, 12, -124, -13, -83, -1, -24, 102, -6, -25, 91, 125, -3, 16, -125, -69, 34, 42, -43, -29, -32, 59, -34, 13, -4, 10, 92, 74, -39, -79, -27, -7, 39, -51, 123, -6, 20, -28, 75, -126, -46, -42, 30, 0, -29, 10, -4, 112, -19, 46, -10, -48, -19, -20, 43, 65, 13, 16, 16, 84, 75, -39, 127, 125, 93, 105, 0, 75, 124, -31, -114, -48, -13, -12, 98, 126, -104, 66, 25, -9, -110, -95, -94, -20, -118, 70, 121, -128, -118, 78, -29, -34, 2, -9, 40, 107, 20, -81, -126, -38, -42, -112, -55, 65, 123, 118, 56, -46, 19, 17, 18, 127, 93, -47, 66, 121, 114, 8, -128, 123, 92, -37, -45, 25, -79, 19, 46, 32, -70, 11, -41, 94, -35, -79, 12, -49, 63, 46, 115, -44, 26, -7, -122, -61, 74, 105, -22, 76, -70, 86, 120, 70, -84, -31, 53, 83, 65, -115, -72, 125, -90, 108, -105, -128, 101, 74, 122, -66, -108, -126, -17, -38, 17, 4, -15, 121, 115, -38, -43, -120, 13, -117, -100, 100, 113, -122, -12, 45, -127, 60, -124, 68, -27, 48, 110, 85, 15, 111, 10, 58, -82, 102, 59, 42, 95, -111, -125, -126, 69, 120, 126, -40, 50, -80, -103, 60, 112, 69, -19, 26, 41, -24, -6, 58, -115, -35, 94, 86, -62, 110, -22, -127, -14, -76, 121, 0, 4, -16, -3, -87, 1, 65, -34, -26, 124, 37, 59, 40, -106, -13, -16, 104, -126, -5, -76, 126, -3, 77, 40, 120, -28, -39, 116, 120, 48, 90, -22, -127, 96, 5, -88, -128, -95, 20, -19, -50, 29, 25, -60, 127, -3, -80, -76, 6, -60, -43, -127, -59, 51, 9, -50, -9, -110, -56, 61, 0, -17, 49, -34, 50, 8, 24, -126, -125, 35, 56, 109, 83, -18, 55, -122, 122, 119, 79, -115, 116, -8, 65, 59, 51, 127, -27, 119, 36, 27, 106, 122, -127, -21, 39, 96, -88, 91, -31, 116, 56, -97, 27, 14, -63, 99, 51, 117, -126, -98, -50, -16, 120, 3, 45, -125, -98, -31, 65, -116, -66, -76, -82, -54, -110, 5, -127, 23, 16, -73, -127, -41, 22, 69, 39, 106, 97, -35, 124, 52, -128, -31, 14, 37, -12, -85, -2, -79, 16, -61, -127, 8, 39, 57, 38, 111, -67, 77, -127, -21, -46, -46, -102, -57, 74, 87, 53, 26, 48, -123, -71, -78, 31, 78, -82, 100, 61, 38, 79, 94, -39, 127, 1, -20, -33, -22, 59, 37, 73, 42, -53, -77, 14, -23, -96, 53, -46, -61, -117, -22, 68, -111, 17, -62, -8, 53, -34, -78, -126, 49, -9, 69, -127, -32, 24, 111, -125, -124, 19, 125, 34, -6, -122, -13, 39, -5, -123, -21, -52, -8, -83, -15, -126, 65, -41, -66, 114, -37, 85, 18, -71, 69, 45, -19, 64, -2, 31, 125, -45, 4, 114, 101, -82, 67, 19, -5, 25, 122, -117, 67, -122, 29, -20, -13, -124, 12, -87, -125, -16, -33, 32, 30, -22, 0, 24, 34, -52, -122, -35, 127, -92, -21, -95, 12, -85, 50, 29, -36, 27, 19, -103, 117, 38, 64, 124, -63, 7, 50, -1, 24, -79, -44, -40, 113, -125, -107, -85, 124, -124, 121, -90, 14, 22, 124, 71, 48, -121, -38, 22, -11, -53, 4, -128, 52, 48, 18, -21, -123, -123, -15, 32, 14, 127, -13, 33, 67, -28, -32, -77, -127, 46, -14, -101, -63, -47, 41, 3, -58, -118, -102, 62, 32, -38, 4, 5, -25, -27, 58, -40, 60, -44, 109, -120, -32, -56, 10, 105, -112, -25, 43, -50, 9, -64, -52, -126, 73, -37, -15, -71, -32, -85, 81, -48, 10, 16, 45, 17, -74, 95, -48, 78, -27, 67, 28, -4, -6, -13, -99, 8, 36, 69, 13, -54, 60, 54, 78, -28, 127, -18, 47, -10, -88, -4, 13, -26, -23, -98, -124, 92, 29, 43, 127, -19, 78, 9, 22, -21, 17, -126, -16, -30, 6, 31, -128, 22, 100, -21, -46, -126, -98, 92, -2, 38, -82, -51, -25, 92, 75, -48, -51, -20, 88, -113, 80, -68, 45, 68, 127, 32, -74, -89, 120, -93, 49, 115, 51, 9, 8, 8, 19, 3, -34, -73, -45, -72, -83, 51, -44, 62, -126, -36, 2, -16, 82, -127, 118, -21, -19, -49, 33, 8, 18, 33, -8, 39, -57, -82, 14, 30, -39, 121, 5, 36, -23, -103, -124, -124, -20, 38, 69, -104, 54, 30, -34, 92, -23, 51, 27, 59, -54, -16, 20, 67, -60, 85, -46, 8, 27, 25, -62, -110, 31, -111, -49, -95, 116, -40, -29, 25, -36, 56, -10, -12, 88, -34, -43, -76, 3, 10, 90, -111, -103, -31, -38, 19, -100, -115, 124, -75, 18, -37, 44, -38, -21, -7, -13, 56, 75, -120, 25, -128, -127, -38, 10, 41, 26, -25, -43, 103, 117, -50, -44, 118, 7, 47, -69, -2, 46, -53, 122, 28, -92, 23, -14, -19, -16, 26, 54, -102, -94, -95, -83, -104, -31, 43, -127, -85, 18, 72, 126, 121, -100, -118, 100, 7, 55, 8, 28, -53, 22, 127, -104, 124, 99, 11, -52, -32, -2, -57, 45, -80, -96, -26, 32, -10, 72, 121, 127, -49, 40, 12, 1, 9, -75, -55, -30, 126, -84, 2, -70, 59, 93, -117, 64, 86, -33, -8, -74, 64, -4, -49, 42, -59, 89, 7, -48, -19, -15, 43, -66, -81, 3, -35, -123, 45, -64, 84, 4, -23, 39, -79, -1, 17, 58, 11, -4, -57, -50, -5, -100, 76, 127, 100, -48, 43, -96, 35, 12, -101, -96, -26, 7, -71, -72, -7, -61, -105, 127, -4, -103, -15, 88, 46, 27, -16, 41, -125, -75, -22, -58, -27, 11, -58, -5, -74, -125, -42, -13, -77, -20, -80, 3, 19, -65, 61, -89, -47, -56, -35, -80, 124, 86, -5, -49, 72, -117, -34, -54, 68, 67, -87, 54, 9, 1, 9, -21, -30, 32, -38, -2, 51, 21, -118, -25, 107, 30, -32, 60, 5, -48, 127, 28, -113, -65, -23, -1, -69, -75, -65, -25, 17, -115, -19, 40, 49, 120, 42, 11, -48, 32, 66, -26, 75, -50, -75, 13, -29, 67, -126, -27, 25, 24, -126, -2, -59, -61, -89, -124, 78, -26, 76, -126, 36, 28, -3, -16, -29, -81, 13, -123, 67, 52, 23, 37, -73, -96, 40, -95, -112, 63, -55, 117, 63, 118, 34, -74, -119, -77, -23, -14, -113, 111, 28, -80, 37, 103, 5, -25, -79, 73, -76, -84, 45, 57, -67, 6, 8, -51, -67, -127, -58, -127, -33, 0, -105, -24, -77, 48, -29, 125, 118, 77, -112, -128, 41, 68, 126, -30, -34, 13, 115, 109, -9, -34, -44, 121, -11, 100, -12, 43, -88, 51, -41, 37, -110, 43, 127, 36, -42, -58, -108, -119, 36, -107, 20, 23, 111, -4, 126, -9, 125, -69, -42, 32, -33, 106, -7, 127, 6, -126, 29, 57, -29, -100, -91, 126, -4, 74, 33, -5, 5, 94, -20, 66, 34, 68, 37, 39, 82, -59, 69, 124, 75, -123, 86, -70, 91, -70, 17, 107, 93, 60, -21, 51, 74, 21, -39, -90, -96, 13, 17, 121, -111, -30, 72, 28, 73, -13, 0, 12, -18, -7, 9, 32, 16, -21, -87, 46, 37, 8, -7, 47, 8, 24, 0, -3, 36, -35, -20, 12, 36, -4, -61, -5, 6, -77, -52, -4, 74, -23, -4, -18, -25, -6, 127, 39, 44, -28, 13, 37, -22, 9, 24, -9, -36, 121, 7, 15, -10, -3, 2, 20, 15, 32, -4, -71, -12, 57, 107, 21, 11, -9, 50, 2, 44, -6, 17, -5, -44, 13, 81, -6, 37, 7, 3, 56, 10, 2, -20, 44, -36, 7, -6, -31, 17, -5, -11, 20, 2, 61, 115, 0, 11, 3, -8, -23, 3, -70, 4, -65, 11, 9, 52, -19, -51, -16, -3, -34, -32, -49, -61, -12, 0, 49, 23, -52, 119, -12, 32, 68, 8, -5, 12, 32, -14, -18, 37, -11, 45, 6, -68, 9, 35, 15, 10, 89, 114, 38, 53, 26, -1, -51, -24, -85, 25, -50, -10, 20, -16, -22, -6, 127, 21, -7, -127, 12, 9, -18, -42, 6, -58, 27, 1, 24, 18, 16, -14, -2, -52, 63, -95, 10, -13, 127, -35, -22, 6, 112, 64, 10, -16, -20, -39, 1, 0, -19, -101, 5, -1, 110, 2, 44, 7, 4, -49, -17, 17, -8, 37, -61, -7, -6, -16, -99, 73, 2, -16, 22, -2, 18, 15, 4, -27, 24, 11, -47, -3, 15, 127, 21, -7, 15, 15, -20, 3, 26, 127, 38, -38, 0, 6, 37, -10, 7, 23, 1, 36, -128, -10, 13, 29, 16, 17, 39, -27, 8, 98, 5, 14, -75, -126, 12, -10, 30, -31, 19, -36, -55, 0, 28, 83, 86, 11, 6, 15, 41, 13, 38, 9, 12, 15, 14, -21, 13, 116, 14, 0, 9, 10, 99, -53, -14, -128, 8, 19, -5, 5, -30, 2, 60, 36, 75, -69, 6, 53, 28, 44, 27, -33, -30, 36, 7, -59, 11, 80, -71, 44, -39, -42, -25, -38, 13, -123, -28, -24, 23, -58, 33, 4, -29, 16, 67, 19, 126, -7, 9, -32, -7, -34, 51, 5, -5, -16, -3, -41, 5, 23, -7, 26, -11, 126, -12, 37, 60, -2, 14, 11, 0, 42, 43, 11, -51, -50, -28, -15, -3, 21, 16, -119, 55, 21, 71, -9, -17, 13, -60, 112, 36, 55, 2, 5, 0, -7, 1, 47, 4, 18, 44, -36, 51, 0, -41, -47, -66, -9, 39, -19, 54, 11, 4, -71, -35, -33, -17, -40, -92, 125, 31, -28, -7, 25, -19, -89, 14, -94, 61, 124, -29, 8, -123, -8, -65, -30, 38, 2, -23, 23, -80, 5, -43, 21, -19, -13, -17, 20, -23, 24, -126, 26, 8, -27, 12, -111, -6, 42, 20, -126, -33, -22, -81, -1, 42, 8, -59, 42, 96, -11, -10, -44, -41, 6, 39, -3, 6, -43, -30, -38, -8, 121, -41, 17, -13, 101, 7, -98, 1, 26, 35, 27, 15, -56, -10, 4, -23, 12, 80, -25, 8, 8, -14, 1, 33, -17, -4, -18, -7, -44, -80, -63, -50, 16, -125, 75, -17, 8, 16, -53, 5, -30, -6, -83, -16, -22, -78, 13, -7, -89, 5, -6, -10, 11, 39, 8, -72, -28, -126, -32, -7, -19, -1, -8, 38, 6, -34, 5, -1, -12, 48, -71, -5, -11, -126, -33, -17, -3, -17, 1, -83, 7, 8, 60, 27, -1, 14, -69, -11, 27, -5, 73, 3, -27, 64, -28, 2, 3, 22, 0, -12, -41, 3, -25, 16, 9, 25, -27, 21, 22, 11, 0, 1, -1, 16, 6, -9 }; static const rnn_weight denoise_gru_recurrent_weights[27648] = { -76, -99, -23, -18, 12, -119, -3, -53, 6, 9, -8, -124, 91, -33, 50, 0, -52, 95, 19, 54, 43, 29, -17, -122, -83, -29, -107, -57, -8, -4, -27, 118, -96, 4, 81, -5, 44, -90, -103, 39, -29, -25, -56, -13, 71, -13, -103, -1, -15, -5, -100, -89, -14, 4, -16, 36, -10, -44, 59, -44, -103, -109, 50, 37, 24, -48, -121, -9, -101, 30, 29, -5, -69, 89, 56, -41, 39, -52, -4, -111, -39, 16, -54, 31, -49, 34, -1, 12, -20, -45, -121, -40, -28, -3, -13, -38, 23, -83, -13, -6, 97, 44, 13, 30, -38, 2, -25, -82, 46, 38, -25, 31, -106, 9, 20, -113, 27, 17, 12, -91, 34, -7, 10, -44, 3, -2, -66, -3, -93, -70, -32, -58, -24, 20, -49, -31, 6, 87, -30, -89, 10, 23, -60, -16, -113, 22, -1, -4, 60, -45, -41, 1, 17, -9, 39, -38, -36, -22, 47, 38, -39, 10, -89, -27, 10, 45, 35, 2, 62, 5, 42, 14, 28, -27, 13, 10, -22, -23, -67, 41, -10, 12, -55, -57, -76, -35, -108, 12, -26, 0, -42, 104, -48, -64, 4, -3, 34, -126, -19, -11, 36, 55, -54, -55, -123, -44, -45, 36, -61, 18, 2, -127, 52, -30, -119, 33, -8, -45, -26, -102, -91, 36, 49, 45, 51, -4, 5, -105, 56, -128, -83, 11, -16, 16, -126, -108, -71, 9, -9, 36, -6, -63, -100, -56, -10, -51, -34, -13, 15, -17, -28, 61, -65, -72, 32, -80, 38, -13, 75, 56, -15, 81, 50, 21, -127, 12, -86, 45, -41, 57, 23, 11, -28, -71, -119, -22, -62, 79, -96, 32, -61, 20, 9, -117, -52, 33, -82, 82, -16, -100, -47, -128, 39, -105, -15, 10, -5, 90, -124, 19, -28, -66, -76, -13, -40, 31, -20, -5, -24, 41, 14, 121, -56, 56, 43, -123, -44, -24, 28, 73, -37, -17, -19, -65, 45, 52, 63, -1, 30, 16, 51, -7, 45, -13, -70, 16, -1, -4, -22, -116, -37, 37, -124, -10, 28, 12, -109, 2, 16, -30, 13, 28, -24, 32, -26, -53, 72, 10, 40, 42, -73, 36, 25, -51, 19, 27, 34, -6, 66, 36, -4, 38, -87, -33, 36, -41, 15, 3, -32, -72, 73, 35, -32, -124, 117, -36, 0, -22, -114, 76, 5, -125, 7, 1, -50, -104, 1, -74, 11, 8, -28, -8, 13, -115, -50, 3, 89, 75, 22, 44, -99, -61, 97, 41, -123, -53, 91, 85, 108, -12, 11, -23, 13, 0, -12, 102, -18, -74, -44, 54, -17, 16, 0, 53, 21, -19, 34, -11, 80, 25, -58, 62, -55, 78, -29, 20, 35, 29, -51, 42, 65, -86, -60, -25, 94, 14, 52, -18, 58, -54, 84, -115, -17, 18, -64, -9, 27, -94, -5, -3, -46, 5, 11, 6, -125, -64, -54, 21, 59, -50, 49, 38, 47, -39, 60, 3, -11, 16, 71, -56, -7, 55, 51, -27, -51, -29, 7, -6, -63, 89, -16, 36, -76, -35, -102, -93, 11, -84, -5, -25, -59, -6, -19, -8, -23, -121, -60, -126, -71, 8, -17, -128, -95, 15, 13, 64, 37, 16, 23, -78, 36, -111, -8, 69, -53, 62, -37, 7, 9, -25, -63, -66, -25, -53, -36, -7, -47, -40, -50, -42, -81, 127, 70, -22, -107, -115, 11, 95, -54, 12, 1, 15, 62, -14, -127, 47, 72, -43, -2, -4, 127, 11, 22, 20, 11, -10, 4, 26, 71, -3, 85, -42, -9, -10, -35, 27, 34, 35, 35, 0, -23, 27, 43, 0, 68, -13, 34, -21, 1, 70, -34, 22, 16, 17, -11, -27, 0, -65, 41, -40, -28, -27, 18, 3, 1, 37, -36, 16, 44, -17, 61, -32, 50, 3, 11, 1, -18, 24, -38, 19, 21, -8, 3, 50, 28, -14, -55, 6, 0, -23, 12, -17, 32, -18, 20, 22, -15, -2, -17, -23, 48, -14, -9, -41, -4, -10, 20, -11, 23, -10, 40, -3, -4, -38, 4, -18, 8, 61, -7, 23, -31, -24, -7, 45, -81, 12, -49, -19, -7, 38, 52, -26, 25, -54, -5, 23, 17, -14, -32, 46, 1, 18, -24, 2, -94, 21, 34, -24, 36, -7, -11, 35, -62, 19, 15, -47, 45, 5, 30, 26, -23, -38, -48, 6, 77, 50, 9, 25, 11, -29, -7, 13, 12, 14, 40, 33, 21, 62, -6, -27, 38, -45, -1, 87, 11, -27, -20, 43, -68, -28, 27, 25, 3, -13, 53, -38, 4, 44, -41, -72, -7, -39, 41, -25, -35, 86, -59, 41, 127, -56, 34, -38, -25, 22, 0, -22, -24, -1, -65, 19, -23, 25, -20, 79, -68, -87, -123, -123, -28, -76, -114, -10, 1, -95, -126, -128, 10, -68, -103, -11, -122, 127, -119, -43, -28, -55, 69, -76, 60, 106, 122, -118, -40, -50, -11, -25, -30, -18, 39, -22, -80, -77, 121, -23, -88, -23, -20, 80, 35, 71, -75, -114, -128, 127, 23, 11, 38, -52, -41, 7, -127, 29, 37, -74, -59, -47, 126, -16, -92, 10, -92, 4, -59, 2, -127, -87, 126, 24, 122, -79, 97, 98, 1, 41, -61, -124, 71, -25, 37, -48, 32, 85, 34, 56, -21, -31, 0, 85, -11, -10, 41, 14, -41, 7, -17, 97, -79, 84, -98, -34, 17, -1, -60, 15, 39, -37, -35, 16, 26, -15, -37, 49, -20, -25, -56, -13, 5, 16, 6, 77, 67, 123, 96, 5, 29, -17, 46, -10, -23, 57, -79, 29, -28, -17, 52, 86, -30, 6, 14, 51, 125, 17, -23, 90, 47, -8, -19, -42, -19, 118, 27, 20, 38, 36, 12, 122, 42, 4, -14, -5, 1, 36, -6, 29, -53, 15, 8, 21, 32, 31, -35, -2, -56, -18, 12, 74, 48, 5, -4, 33, 60, -92, -21, 44, 92, -62, -2, 35, 4, 48, 69, -45, 73, -35, 3, 28, 81, -48, 18, -34, 29, 123, -32, 29, 6, 9, -118, 4, 30, -1, -24, 65, 3, 34, 40, 20, -13, -53, -50, 31, 9, -86, -87, -36, -57, -27, -35, -30, -123, 18, 8, -107, -6, 5, 48, 21, -54, -1, 60, 61, 26, -1, 12, -11, 41, -26, 110, 29, 27, 8, 48, 43, -12, 123, -33, -8, -91, 122, 9, 120, -18, 71, -23, 63, -34, -20, 30, 46, -45, -24, 24, 57, -20, -15, -123, 3, 5, 59, 13, -87, 45, -15, -28, 38, -3, 29, -23, -6, 31, 69, 33, -4, -64, -31, -48, -1, -4, 23, 53, -4, 1, 96, 29, -44, -123, -19, 3, 32, 80, -28, 6, -57, 2, -67, -18, -50, 16, -125, -87, -25, -51, -127, -23, 5, 0, 62, 90, 67, -41, -11, 41, -64, -67, 15, -3, 78, -86, -11, 30, -10, -57, 23, -41, 23, 4, -103, -57, -119, -94, -94, 69, -19, 48, 23, -32, -20, -58, -17, 60, 113, 69, 57, -27, 24, -25, -2, 23, 3, 8, -37, -35, -9, 5, -23, -38, -19, 26, 6, -49, 3, 95, 45, 0, 15, -102, 3, -46, -1, -19, -2, 2, -86, 14, -3, 45, -20, 22, 23, -75, 93, 38, 54, -44, 107, -87, 80, 19, 20, -54, 73, 4, 50, 14, -5, 32, 7, 32, 7, -46, 10, -21, 8, -40, -45, 55, 33, 17, 31, 44, -10, 88, -11, -14, 29, 32, 54, 116, 33, -53, 107, -88, -34, 47, 124, 18, 14, -1, 5, 1, -39, 21, -15, 58, -27, -70, 100, -37, -25, 4, -56, 69, -22, 23, 3, -53, 20, -10, -48, 22, -95, -14, 39, -43, -70, 35, -6, 8, -95, -86, 9, 22, -59, 121, -127, -1, 62, -18, 14, -13, 56, 76, -80, -62, 10, 74, -56, 16, -11, 34, -52, 50, -7, 40, -61, 38, -38, 31, -51, 16, 23, -17, 25, 42, -51, 101, -19, 8, -19, -4, -46, -115, 3, 126, 41, 2, -1, -66, -26, -110, -49, -72, -39, 20, 92, -23, 60, -34, 80, -23, 32, -4, 56, 59, -82, 81, 127, 61, -17, 44, -49, 33, -38, -119, 68, 74, -38, 87, -15, -21, -21, -70, -7, -8, -46, -7, -107, 42, 20, -108, -37, -5, 7, -123, 30, -125, -17, -48, 79, 26, -103, -42, -18, 4, 48, -21, 14, 34, 12, 27, 37, 74, 57, -124, -5, -4, 5, 55, -36, 44, 64, 3, -48, -37, 51, -45, 95, -59, -32, 5, 28, -80, 24, 18, -86, -6, -83, 5, -8, -16, 4, -113, -23, 9, -24, -86, 8, -30, 16, 72, 12, 41, -55, -18, 101, -5, -17, -108, -15, 62, -36, 29, 5, -16, 64, -8, -10, -42, 22, -128, -37, 43, 82, -42, -93, -20, -29, 46, 29, -41, 4, 18, -12, -51, 53, -43, 1, -61, 7, 21, 7, -94, -11, 99, 89, 84, -14, 14, -59, 56, 46, 22, -11, -35, 4, 40, -68, -32, 100, -8, 48, 1, 17, 1, 20, -4, 98, 3, 0, -21, 15, 39, 27, 66, -8, -37, 3, -8, -17, -39, -53, -10, 9, 28, 82, -10, 33, -36, -14, -47, 25, -8, -24, 8, 14, 10, -31, -44, -31, -53, 77, -18, -76, 35, -3, 124, -4, 92, 92, 34, 90, 125, 10, 63, 38, -16, 41, -4, 3, 27, 93, 62, 23, -48, 6, -36, -42, -3, -3, -50, 2, 64, -36, -79, 122, 79, 22, 32, 19, 22, 34, -24, 5, -11, 23, 38, -65, -15, -3, 61, -7, -6, -41, -37, 15, -5, 1, 52, 11, -42, -54, -7, 18, -34, 65, 113, -3, -29, 61, 5, -36, -12, 106, 10, -95, 57, 124, 95, 32, -25, -26, 4, 13, 43, -22, -38, -26, 17, -46, -4, -122, -39, 40, 79, 45, -48, -35, -74, 60, -34, 50, 69, -68, -10, 94, -67, -80, 80, 55, 46, -61, 2, 14, 77, 8, 21, 4, 68, 53, 108, -3, -30, -18, -102, -127, -12, 8, 77, -86, 27, -127, -26, 100, -8, -77, -128, -47, -51, 2, -111, -11, 13, -23, 44, -123, -2, 28, 21, -71, -124, 9, 28, -18, 66, 53, 64, 83, -31, 28, -8, 36, -21, 9, 8, -46, -23, -101, 12, -73, -49, -38, 52, 106, -82, 57, 41, -17, 59, 20, -74, -7, 10, 28, 3, -15, 0, -92, -9, -29, -64, 106, 36, -106, 4, -46, -114, -59, -104, -71, -128, -68, -41, -4, 56, -115, 51, -34, 29, -21, -24, 14, -59, -113, -57, 4, -6, 78, 24, -4, 23, 23, -12, -4, -24, -17, -79, 23, -16, 17, -31, 6, 29, 26, 14, -50, 37, 27, -13, 22, 15, 1, 0, 72, -62, 58, -6, -38, 18, 90, -2, 14, 65, 41, 48, 59, 53, 12, 55, 9, 14, 38, 34, -35, 19, 25, 55, 31, -22, 22, 81, 48, 14, -15, -49, 19, 67, -54, 20, 13, 8, 3, 7, 32, 6, -6, -11, 19, 66, 40, 35, 19, 12, 29, -45, -61, 54, 105, 56, -20, 7, 46, 5, 4, 60, 10, 37, -19, -37, 66, 44, 15, 19, 35, -21, 29, 55, 16, 61, 85, -26, -3, -93, -30, 9, -36, 2, -42, -67, -32, -23, -2, 15, 79, 27, -17, -4, -126, -29, 18, -3, -40, -118, -28, 10, 42, 64, -30, -9, 101, 4, 6, -20, -53, -10, 18, -14, -62, -29, 8, -38, -3, 9, -21, -26, 63, 31, -5, 20, -28, 33, -25, -46, 6, 65, -6, 94, -13, 9, -8, 15, -21, 114, 12, -8, -42, -116, 5, -22, -2, 1, -27, -18, 8, 4, -70, 14, 65, -22, -9, -23, -1, 56, 15, -55, 20, 20, 44, -14, -70, -27, 33, 24, -12, 45, 78, 69, 50, -48, 91, 100, -29, 43, 19, 126, 57, -46, 16, 77, 70, -65, -18, 101, -27, -22, -53, 73, 39, 126, 96, -125, -20, -124, 19, 15, -99, 72, 36, -11, 108, 91, -123, -6, -49, -68, 61, -54, 107, 9, -35, 63, 126, 33, -4, 23, 61, 127, -10, -126, -1, -20, 29, 43, 20, -68, 56, -40, 43, -90, 72, -37, 38, -48, 57, -58, 48, -8, -57, 76, 36, 28, -34, -110, -15, -116, 103, -30, 29, 14, 126, -121, 127, -23, 49, -33, -125, 30, -13, 0, -3, -25, -93, 42, 36, -24, -19, 87, 8, -101, 54, -30, 27, -8, 69, 25, 33, 65, -17, 49, -1, 37, -92, 9, 46, -15, -40, -4, 3, -52, -13, -11, -19, 3, -42, 1, -31, 55, 45, 8, 31, 16, -29, -15, -25, -7, 6, 7, -62, -35, 103, 33, 13, 67, 26, -6, -53, -18, -36, 3, 32, 112, 0, 40, 12, -67, -27, -57, 37, 24, 8, 88, 70, -17, 48, 82, 37, 1, -1, 77, 5, -27, -17, 15, 8, 27, -85, 33, 0, 43, 37, 3, 19, 3, -47, 60, -55, 50, -23, 12, -12, 61, -86, 79, -37, -69, 38, 19, 10, -53, -26, -6, 103, -5, 18, -29, 74, 11, 97, -48, -36, 46, -45, -72, -65, -122, -39, -101, 85, 31, -4, 6, 25, -45, -4, -3, -107, 7, -120, 71, 19, 64, 43, -87, 30, -31, 14, 7, 21, 83, 74, -7, 30, -94, 66, 63, -85, 92, 8, 22, -24, -4, 31, -91, 39, 13, 37, 65, 60, -62, 92, -44, -8, 74, -7, -63, 54, -24, -90, -34, 17, 84, -41, -97, 13, 28, 14, -33, 1, -26, -25, -9, -48, -2, -54, -104, 4, -5, 38, -120, -48, -35, 124, 38, -57, -63, -8, 37, 91, -40, 7, 17, -58, 67, -56, 5, -86, 22, -17, -53, 6, 114, 37, -24, -96, -17, -69, -44, -58, -123, -18, -47, -123, -108, 2, -89, -38, -15, -34, 14, -31, -2, -99, 34, 28, 124, 92, -16, -28, -22, -60, -22, -2, 126, -122, 31, -20, 32, 42, -128, -41, 61, 30, -23, 79, -84, -36, -26, 87, 15, -2, -125, -24, -22, 39, -108, 16, -26, -31, -62, -22, 83, -123, 69, -108, 0, -12, -19, -6, -13, -70, -83, -30, 36, -32, 3, 95, -111, -18, 6, -91, 34, 56, -61, -92, -54, 23, -60, 17, -64, -54, 4, 39, -123, 24, -53, -46, 14, 65, -100, 0, -54, 21, -4, -119, 72, -35, 95, -56, 14, 24, -68, -40, -49, 21, -16, -91, -123, -75, -39, 25, 0, 38, 80, -32, 29, 25, -99, 0, -10, -28, 38, 34, 0, -3, -29, -74, -93, -1, 0, -26, 33, -65, -56, 28, -76, -22, -68, 1, -22, 71, -21, -12, -59, -11, 66, 12, 0, -82, 17, 27, -66, -56, -34, -11, -37, 75, 100, 78, 2, 12, -29, 40, -92, -11, 52, -4, 5, 38, 25, 44, -63, 40, -4, -19, -38, -38, 44, 44, 11, -12, 84, 47, -127, -32, 2, -57, -102, -23, -51, -12, 26, -59, 17, -5, -97, 98, -117, -36, -65, -35, -1, -1, 1, -93, -40, -39, 96, -120, -2, -26, -25, 66, -33, -76, -67, -12, -44, -8, 22, -58, -2, 4, -110, -21, -6, 30, -30, -113, -57, 83, 38, 5, -28, 14, -93, -35, -107, 6, 59, 17, 107, 74, -20, -19, 22, -93, -43, 49, -6, 17, 21, -108, 12, -39, 33, -127, -43, 14, -22, -18, 15, -74, 41, -6, -20, 35, 4, 99, 10, -16, -58, -14, -50, -20, -13, -30, -26, -82, 60, -28, 26, -110, -34, -51, 28, -128, -57, -20, -47, 97, -54, 104, -127, 50, 63, 20, -44, -126, -35, 13, -5, 5, 83, 34, -45, -12, 27, 0, -33, -55, 29, -94, 70, -44, -97, -9, 25, 55, 48, 57, -4, -27, -84, -93, -44, -36, -9, 49, 66, 39, 20, -11, -82, -66, 113, -18, -15, -3, 98, -8, -26, 9, -83, -9, 41, 61, 84, -22, 65, -57, 34, 7, 61, -53, 97, 6, 20, 28, -21, -105, -60, -63, 23, 41, -77, -54, -1, -18, 3, 51, -78, -96, 53, 83, -21, -39, 21, -104, -69, -12, -36, 76, 20, -77, 59, -37, 40, -31, -107, 29, 3, 5, -18, -37, -16, -41, 10, 56, 51, -40, -73, 25, 27, -80, -12, 73, 6, -34, 16, -64, -62, 28, 86, 39, 4, 78, 21, 8, 28, 55, -124, -107, -105, -24, 55, 6, 68, -23, -43, 60, -116, 1, -37, -38, 88, 46, -45, -53, -44, 49, -58, -40, -117, -63, 55, 62, 24, 53, 9, -20, 127, 83, 62, -12, -2, 3, 126, -26, -29, -110, 32, 33, 51, 43, 35, -8, 90, -3, -37, -120, -11, 100, 17, 0, 76, -21, 116, -24, 6, -116, -87, 125, -3, -57, -13, 125, 13, -116, 13, 43, -86, 32, -45, -14, 70, 41, -121, -18, -7, -51, 9, 57, 0, -6, -41, -4, -14, -40, -51, 124, 47, 13, -126, 124, -41, 5, 34, 7, 2, -34, -16, 9, -39, -107, -49, 41, -52, -23, -38, 39, -9, 92, -115, 45, -128, 35, -95, -24, -20, -40, 5, 0, 7, -107, 37, 0, -63, 49, 38, 35, 40, -33, -115, 55, -19, -77, -36, -88, 116, 74, 10, 73, 38, 12, -76, -127, -48, 79, 84, -57, 46, 78, 37, 102, 18, -95, -61, 17, 26, -113, -12, 43, -1, 68, -25, 67, -21, 69, -17, -14, -27, -21, -52, -7, -70, 5, -29, -110, -105, 35, -65, -25, -56, -1, 85, 18, -54, -81, -91, -71, 24, 25, -26, -68, -64, 9, 91, -107, 26, 34, 17, 21, 116, 81, 67, 25, -122, -43, 70, 46, -22, 101, -12, -42, 13, 10, 13, -38, 3, -3, 7, -81, -36, -23, 48, 76, 22, 22, -123, 4, 31, 37, 2, -2, 25, 40, 47, -41, -66, -23, -53, -33, -127, 20, -4, 18, 57, 38, -33, -19, 42, 40, 16, 94, 38, 0, 32, -36, -40, 29, -5, -57, -7, 8, -1, 40, 40, 48, 12, -26, 7, -24, 5, -61, -21, -50, 46, 13, -63, -91, 1, 12, -76, -42, -88, 26, 62, -35, -28, -51, -12, 8, -9, -102, 38, 23, 11, 32, -9, -43, -15, 30, 20, -9, 21, 63, -6, -61, -81, -25, -63, 37, 85, -30, 36, -4, -63, 64, -43, -15, -65, 75, 19, 51, 36, 4, -50, -9, -31, 35, 35, 36, 27, 27, 3, -41, -68, -118, 11, 88, -38, -48, -49, 10, -42, 16, 63, 12, -30, 3, -15, -6, -111, 15, 19, 13, 70, 34, -9, 37, 14, -26, 91, 51, 43, 5, 2, 5, 86, -31, -55, -86, -51, 20, -1, 56, -34, -41, -7, -88, -3, -24, 54, -27, 40, -40, -23, -72, -51, -104, -27, 38, -29, -57, -2, 4, -79, -1, 48, -36, 2, -62, 24, 20, -34, -119, -29, 2, 64, 73, 22, -100, -72, 7, 3, -3, -25, 68, -71, 26, -18, 8, -46, -6, -2, -66, 50, 25, 44, 29, 3, -2, 18, -67, 21, 12, 15, -4, -65, 126, -34, 68, 66, 36, 9, -32, -22, -5, 19, 27, 35, 47, -2, -70, -50, 60, 2, 12, -26, -18, -107, 9, -11, -16, 24, -9, -16, -49, -43, 9, 23, 6, -4, -26, -114, -125, -72, -41, 42, 64, 32, -1, -3, -73, -88, -37, 0, 63, 80, -46, -9, 86, -6, -86, -17, 20, -1, -17, 2, -8, -75, 22, -47, 26, -50, 65, -41, -13, 105, -75, 2, -47, 13, -2, 26, -10, -11, -82, 50, -24, -7, 16, -66, -32, 52, 25, 24, 59, -11, -12, -90, 67, -4, 1, 3, 33, -22, 77, -12, -90, 11, 28, 57, 17, 49, -31, -44, 68, 4, -54, 5, -2, 66, 73, -96, -50, -7, -7, -5, 99, 32, 58, 66, -60, 0, -116, 53, 6, 116, -41, -62, -51, -6, -24, -7, -113, -66, 21, 3, -39, 10, -62, 74, -5, 57, -56, -9, -26, 13, 114, 0, 80, 83, -29, -3, 80, 35, 55, 41, 94, -72, 8, -44, 77, 48, 21, -27, -11, 9, -5, -80, 32, -20, 59, 26, -71, 90, 37, -51, 127, -4, -51, -120, 38, -25, -43, -124, 46, -75, 40, 9, -7, 36, -58, 22, 42, -39, -123, -15, -20, -49, -76, -45, -127, -82, 32, 56, 77, 41, -86, 108, -9, 12, -75, 119, -57, -6, -77, -17, -63, 11, -116, -20, 14, -55, -9, -8, 109, -22, -30, 22, -71, -18, 19, 68, 119, 36, 34, -6, 2, -6, 29, 122, 50, -128, 87, 22, 68, -3, 75, 6, -53, -39, -54, 24, -43, 0, -9, -26, -42, -28, -73, 50, -70, 40, 93, -102, 65, -27, 53, 45, -17, 44, -15, 60, 69, 0, 38, -6, -49, 27, 25, -88, 15, 22, 13, -40, 55, -19, 26, 48, -52, 14, -6, -5, 14, -53, -61, 69, -44, -71, 59, 66, 87, 117, -33, 15, 99, -50, 7, -37, 98, 51, 62, 55, -39, -36, -61, -103, 8, -52, 50, -27, -110, 12, 15, 87, -44, -22, -23, -56, -4, -17, 18, 58, -73, -128, 17, 39, 87, 5, -69, -20, -47, 64, 13, -8, -27, -26, -10, 2, 9, 64, 25, 26, -32, -53, -22, -18, 35, -63, 7, 119, 43, 28, 100, 2, -54, 110, 5, 4, -5, 98, -32, 29, -17, 83, -95, -116, 73, -47, -76, 13, -89, -12, -35, -62, 77, 36, 52, 116, 117, 61, -19, -33, -7, 31, -41, 16, -8, -51, 9, 13, 36, 63, 43, -22, 19, -36, 6, -40, 29, -4, 26, 42, -69, -66, 77, -73, 110, -104, 46, 47, -40, -11, -41, 73, -39, 59, -29, 18, -12, -6, 9, 47, 13, 7, -24, -45, -109, 40, 26, 26, -2, 42, -93, 46, 92, -1, -85, 69, -4, 115, -72, -11, -47, 1, -25, 9, 7, -49, 34, 24, 30, -48, 116, 3, -12, -126, -21, 36, 17, -38, -13, -73, 2, -84, -64, 127, -45, -50, -79, -81, -35, 14, 49, 91, -122, -52, -73, -42, 17, -34, -12, -102, -33, -28, 45, 27, 47, -9, -28, -4, -53, -49, 15, -3, -68, 9, 25, 60, -69, 0, 126, -55, -9, -52, -94, -90, -13, -27, 109, 16, -6, 20, -69, 46, 43, -119, 29, 78, -54, 55, 67, -40, -49, -84, 25, 27, -16, -84, -94, 15, 127, -125, 56, -24, 29, -93, -33, -80, -82, 45, -5, -49, -29, 46, 21, 18, 27, 52, 9, -111, 8, -81, -125, 109, -9, -91, 72, -18, -9, 3, -97, 12, -119, -99, -69, 57, -25, -25, -106, -43, 34, -36, 114, -14, -23, 2, 46, 69, -9, -103, 87, 127, 74, 14, -5, 0, 14, -16, 73, 93, -30, -2, 10, -123, 26, 74, 116, 22, 51, -94, 108, -38, -38, -81, -38, 1, -46, -86, -12, 60, -53, 64, 1, 63, -125, -125, -20, 106, 88, 20, -127, 60, -10, 85, 19, -11, 45, 33, 2, 6, 66, -76, 86, 47, 63, 91, 119, 56, 114, 86, -6, -13, 21, -40, 20, 21, 8, -27, 44, 59, 36, -13, 99, 118, -47, 26, -94, 52, -76, -62, -76, 9, -25, 94, -27, 123, 34, 119, -35, 8, -16, 8, -44, -54, 24, -8, 31, 36, 31, 101, -42, -4, 18, -18, -4, 31, 49, -8, -17, -28, 10, -20, -104, -55, -39, 75, -63, -10, -1, 33, 102, 69, 43, 49, 53, -42, 42, 24, 75, 3, -55, -24, -20, -65, 78, 63, -1, -33, -31, -40, -36, -42, -49, -1, 48, -70, 63, 51, -3, 70, 45, -33, 32, 62, -11, -94, -94, -11, 33, -27, 101, -70, -4, 32, -48, 15, 44, -33, 16, -3, 124, 4, 64, 14, 73, -119, -72, 71, -39, 15, -33, -32, 54, -53, -32, 9, 45, -56, 111, 11, 42, 35, 75, 8, 34, -29, 24, -12, 45, 59, 45, -52, 35, 126, 90, 8, 9, 16, -31, 99, -72, 80, -100, 2, 20, 21, -36, 42, -22, -38, 44, -20, -13, -8, 19, 25, 31, -22, -89, 105, -52, 64, -19, -2, -98, 38, -23, -13, 22, -18, 4, 29, 24, 34, 56, 66, -5, -82, -80, 5, 57, 57, 0, -25, 44, -7, -73, -45, 33, 93, 41, 36, -18, 3, -76, -41, -59, -14, 65, 28, 9, -55, 22, 75, 27, 56, 104, 16, 35, 39, -50, -13, -90, -59, -35, 85, 42, 13, 46, 38, -35, -84, -13, -30, 54, -16, -11, 12, 19, -21, -11, -25, -17, 40, -115, 64, -120, -68, 19, 79, 35, 2, 17, 4, -6, 29, 26, -68, -65, 73, -48, -64, -64, -58, 3, 1, -15, 4, -7, -11, 7, -8, 11, -52, 4, 51, 28, 8, 18, 8, 16, 6, 14, -60, 88, 65, 51, 30, 6, -33, 47, -26, 9, 59, 7, -6, 13, 91, 97, -104, -19, -105, -44, 90, 21, -55, 45, 5, 40, 10, 73, 9, 33, -109, 57, -14, -1, 51, -51, 19, -4, 64, 19, -45, -80, -18, -77, 38, -32, -66, -40, 18, -7, -7, -38, -47, 11, -59, -31, -59, 6, 86, 5, 5, -82, -30, 15, 30, 44, 35, 45, 52, -21, 61, -75, 61, -58, -7, 92, -57, -17, 88, 0, 20, -9, -49, 15, 32, 57, 54, -116, -59, -57, -47, -6, -33, -2, 71, -121, 113, 48, -15, 41, -6, 67, -19, 37, 25, 22, 28, -11, 112, 20, -25, -19, 79, -45, -14, 48, -51, -105, 123, 23, -39, 127, -2, 23, -46, 68, 45, -46, -53, 54, 102, 28, 63, 14, 40, -26, 25, 43, 33, -55, 48, 5, -67, 55, -17, 60, -87, -4, -92, 23, 122, -9, -58, -85, 49, -34, 43, -37, -25, -14, -54, -86, 53, -68, 5, 84, -19, -117, -84, 38, 70, 95, -76, -86, 36, 54, 42, 50, 40, 83, -9, 16, -25, -85, 48, 122, -30, 5, 47, -124, 57, -63, 44, -28, -122, -113, 27, -12, -119, 38, -69, 44, -39, -29, -17, -126, 12, -4, -29, -23, 90, 0, 41, -103, 21, -48, 8, 90, -15, -60, -43, 90, -51, 63, -15, 70, -17, 0, 4, 19, -81, -100, 42, -54, -18, 76, -39, -43, -29, 29, 25, 9, -16, -34, -23, 27, 51, -78, -91, 40, 91, 0, 102, -36, -126, -52, 22, 73, 44, -41, -35, -34, 110, 14, -55, -3, 29, 16, -33, 106, -39, 39, -61, -42, -1, -49, -7, -1, 28, 18, 7, -19, 40, -13, 6, -52, 3, 2, 19, -19, 119, -100, -51, 73, -50, -89, 8, -30, 6, 33, 28, -24, -1, 47, 23, -35, 46, -4, -6, -33, 78, 40, -28, -10, -1, 39, 14, 25, 52, -1, 11, -39, 59, -22, -2, 61, 24, 40, 111, 30, -4, 61, -92, -95, 4, 66, 37, 19, 3, -3, 107, 1, 5, -10, 11, 21, 12, 63, -13, 71, -93, -41, -3, 82, 31, -1, 2, -31, 1, 55, -36, 35, 17, 7, 111, -8, -31, -2, -70, -15, 19, 41, -58, 10, 6, 15, -55, -55, -58, 26, 12, 54, 35, 3, 19, 35, 124, -54, 19, -68, -114, -2, 27, 37, -37, 34, -58, -3, -95, 51, -31, -1, -49, 26, -62, -7, 12, 7, 101, 16, -17, 126, -9, -27, -24, 95, -22, -40, 29, -15, 24, 15, 25, 30, -43, -4, 25, 12, 33, 29, 21, 6, -72, -9, 21, 65, -54, 65, -48, -22, 45, -36, 6, 5, 0, -20, 14, 25, -6, -6, 14, -31, 21, -22, -7, 58, 5, 53, 50, -16, 53, 73, 8, 22, -4, 15, 29, 67, -119, -9, -28, -14, 74, 54, 58, -17, 69, 29, 66, 96, -70, -108, -128, 16, -35, 54, 2, -69, 94, -7, 19, 2, -66, -3, -126, 44, 59, 43, -5, -34, 16, -2, -13, -126, 14, 109, 37, 9, 32, -26, -86, -39, -71, -34, 4, 9, -4, -16, -31, 80, 106, 21, 23, 29, -37, -37, 8, 75, 59, 10, -41, -32, 30, -17, -44, -11, -28, 34, -35, 24, -18, -9, -111, -53, -78, -127, -19, 24, -21, 16, -110, 32, -94, -4, -17, -46, -1, -122, -53, -21, 11, -96, -3, -21, 7, 2, -32, 46, 90, 35, -33, -19, 74, 43, 34, 30, 37, 63, 28, 23, -83, 8, 27, -18, 20, -13, -44, -8, 21, 29, 47, 7, 24, -13, -119, 27, -54, 9, 14, 26, 32, 102, 89, 25, 20, -5, 2, 33, -12, 22, 46, -45, 52, -25, 97, -65, 79, 79, 32, 18, 28, -78, -6, 88, 32, -29, 81, 31, -13, -38, 27, -44, -35, 19, 14, 30, 51, -27, -11, -16, -12, 45, 51, -37, -3, 11, 39, -3, -36, 23, 47, -9, -21, 22, 84, 55, 56, 47, -12, -8, -97, 83, 61, -119, 44, 27, 7, -43, -21, 88, 7, -30, -52, -9, 125, 31, -81, 56, -5, -71, -30, -52, -2, -24, -7, 39, 52, 101, -124, -3, 20, -41, -83, 65, 23, -42, 8, -38, -60, -14, -21, 33, -30, -18, 123, -25, 68, -120, -66, -3, -89, 3, -22, 22, -42, 75, -34, -33, 78, -28, -40, -5, 24, 28, -49, 29, 2, -59, 2, 8, 5, -71, 33, -83, -110, 24, 99, 33, -70, -41, 56, -7, -29, -46, -106, 20, -19, -42, 24, 18, -35, 18, -67, 119, -15, -34, 56, -40, -26, -50, 61, 98, 30, -53, 44, 123, 55, 42, -99, -15, -21, 41, -94, 25, 56, -125, 51, -126, -45, 27, -83, 20, -19, 67, 10, -103, -34, 11, 4, 42, -117, -15, -38, -59, 66, -54, -63, -1, -49, 36, -31, -57, -28, 14, 46, 69, -24, 38, -54, 79, -31, -32, -73, 3, -19, 122, 61, -20, -65, 107, -7, -57, -125, 65, 8, -55, -32, -10, -30, -90, -104, -119, -12, 18, -34, 2, -28, -99, 67, -117, -113, -9, 6, 58, -62, 126, 35, -40, -16, 98, 21, -2, -5, 14, 24, 43, 48, 44, -9, 47, 58, 61, 17, 20, -30, 19, 103, -121, 21, -15, 45, 73, 25, 25, 28, 35, 30, 27, 2, 68, 24, 23, 114, 55, -85, -10, -44, 38, 80, -27, -12, -24, -28, -22, 88, -10, -35, 23, 18, 16, 86, 14, 53, 33, -86, 0, 35, -21, 22, 40, 33, 50, 13, 22, 15, -44, 16, -5, 50, 50, 23, 57, 18, 9, 29, -53, 64, -10, 7, -26, 13, 1, -33, -29, -54, -32, 70, 40, -38, 27, 25, -24, -7, 28, 9, 46, 30, 43, 19, 26, 25, 37, -18, -1, -36, 45, -50, -43, 35, 17, -9, -10, 4, -88, -43, 40, 39, 30, 31, 77, -8, 95, -70, 40, 96, 45, -41, 16, -126, 15, -29, -12, -19, -21, 17, 53, 22, -24, -62, 6, 33, 17, -28, -16, 114, -51, 9, -45, 37, 30, 111, -28, 10, 0, -30, -27, -5, 84, -75, -47, -2, 78, -58, 0, 33, -14, 91, -124, -1, 32, 0, -61, 1, -56, -4, -15, 42, -38, 12, -7, 10, -26, -6, 40, 3, -57, -77, 38, 79, 47, -14, 48, 15, -10, -23, 25, 23, -41, 29, -5, 10, -127, -61, -58, 25, -51, -37, 29, -5, 36, -82, -95, -40, -9, 35, 42, 65, 24, -9, -46, 3, -58, -11, -70, -48, -26, 28, -21, -53, 18, 10, -13, 75, 22, 54, 41, -29, -55, 50, -5, 28, 15, 15, -59, -22, -46, -35, -51, -33, -11, -66, -23, 9, 2, 11, 20, 7, 55, -52, -15, -28, -54, 5, -120, -63, -39, 14, -49, -18, -61, -87, 19, 20, 36, 113, -9, -28, -29, -64, 7, -13, -50, -8, 18, 34, -29, -33, -25, -9, -2, -39, 49, 14, -16, 37, 44, 67, -3, -93, 57, -26, 14, 24, 77, 5, 38, 10, -10, -8, 38, -21, 20, -9, 71, 2, -3, -32, -34, 2, -125, -51, 3, 17, 26, -104, -98, -51, 30, 17, -5, -19, -21, -21, -41, -93, 8, -52, -25, 54, -1, -12, 19, -2, 35, 56, -39, 49, 56, -52, -14, -58, 37, 50, -66, -27, 18, 35, -80, 22, 12, -6, -77, 30, -22, -18, 37, -29, 19, 18, 15, -34, -45, -1, -5, 58, 52, 9, -9, -105, -115, 91, 45, -3, 20, 27, 2, 54, 116, 109, 84, -52, 9, 33, 7, 13, 13, -47, 14, 30, -3, 111, 11, 51, 98, -44, -112, 93, -41, -45, 122, 73, -9, -28, -48, -9, -61, -91, 18, 67, 91, -54, -52, -86, -124, 65, -50, -56, 20, -42, 4, -75, 56, 90, -81, -104, 42, 16, 102, 35, 107, 73, 51, 9, -50, -100, 24, 64, 38, -17, 120, -16, 27, 114, -107, 85, 74, -50, -13, -80, 3, -14, 6, 67, -23, -123, 49, 49, 22, -85, -69, -110, 126, 58, -15, 80, -16, 91, 51, 45, 55, -23, 96, -90, -5, 20, -9, 69, 49, 6, -15, 124, 36, 38, 36, 29, -91, 56, 51, 26, 4, -120, 3, -42, -23, -12, 13, 5, 5, -69, -33, 12, -81, -2, -4, 59, 78, 100, -8, -109, 28, 5, -121, -1, 35, 2, -13, -9, -67, -120, 6, 29, -111, -58, 45, -33, -30, 12, 123, 16, -43, 2, -24, 45, 19, -90, -12, -36, -88, 0, 15, 18, -4, 35, 39, -60, 34, -8, -35, 15, -120, 10, -22, 81, -100, -21, -37, 0, -19, 34, -87, 6, 54, -18, 41, 43, -4, 11, 25, 49, -19, 24, -20, 31, -97, 4, 13, 74, 90, -59, 27, -11, -19, -5, 53, 43, 20, -5, -84, 34, 13, 34, -47, -56, -30, -64, 32, 37, 52, 28, 60, 19, 38, 72, -40, 16, 10, -36, -5, -30, 50, 24, -13, 36, 25, 43, -39, -23, -22, -24, 47, 95, 40, 40, 2, 11, -66, -7, 48, -24, -26, 27, -7, 25, -8, -31, 89, 25, -12, 40, -7, 22, 45, 56, -21, 4, -16, 70, 48, 13, 28, 3, 0, -27, -1, 30, -3, 31, 8, -1, 18, 8, 50, 15, -10, 76, 112, 27, -55, 41, 38, -23, 18, -65, -74, -27, 9, 17, 21, 78, 60, 17, 29, -63, -49, -53, -102, 8, 52, 112, -7, -52, 37, 27, -39, -15, -5, 5, -14, 33, 109, 65, 64, 68, -1, -18, -79, 74, -10, 50, 37, 20, -113, -40, 84, -50, 2, -24, 122, 42, 60, -16, -41, 44, 54, 15, -52, 29, 17, 4, -59, 85, -10, -11, 28, 29, 33, -49, -72, -101, -45, 65, -21, -8, -25, 3, -36, 24, -59, 12, -1, -52, -31, -59, 33, -17, -30, 53, 113, -116, 70, 20, 0, -20, 27, -119, -53, 19, -20, -85, -92, -20, -32, 14, -120, 22, 22, 126, -47, -18, 50, -38, 81, -126, -62, -86, -105, 26, 29, -44, 125, -54, -127, -120, -21, -126, -54, 16, -112, 36, -3, 75, 123, 8, -54, 38, 59, -16, -23, 11, -127, -26, -64, -121, 56, -94, -5, 7, 13, -10, -18, 58, 25, -6, 29, 21, 42, 70, -33, -35, 36, 43, 48, 109, -9, -120, -123, -38, 36, -121, -34, -112, 66, 16, -125, -78, 127, -128, -51, -27, -102, -119, 118, -18, 127, -12, -24, 7, -16, 10, -66, -36, 9, -36, 9, 41, 67, 18, 82, 14, -15, -67, 67, 2, 5, -84, -16, -37, -10, -51, -27, 74, 41, -114, 0, 67, 0, 100, -22, 20, 8, -42, -15, -36, 11, -12, -85, 34, -24, 13, 18, -43, -18, 27, 38, -28, 5, 49, -2, 36, -17, 101, -76, 27, -20, 58, -25, -27, 0, -17, -18, 23, -64, 24, 35, -21, -106, 24, 2, -21, -63, -14, -19, -7, 19, -63, 10, 29, -35, 6, 10, 13, -10, -15, 1, -8, 14, 16, -7, -7, 19, 25, -14, -56, -32, 53, -10, -48, -28, -127, 7, -49, -75, 3, 25, -7, 7, -49, -114, 2, 31, 19, 56, -56, 24, 103, 64, 51, -77, -66, -20, -28, 82, -85, 11, -54, 49, -8, -10, 23, -101, -4, 103, -70, -40, -4, 91, -45, -42, -73, 1, -58, 1, -10, 7, 9, -52, 17, -30, 1, 6, -125, 12, -16, -70, 49, 126, -8, -56, -26, 63, 127, -127, -70, 32, -50, -88, -15, -19, 38, -32, -11, 25, 91, 124, -55, 77, 52, -22, -21, -66, -66, 125, -41, 2, 33, -79, -42, 6, -47, 44, 18, 32, 30, 15, 26, -8, -97, 8, 49, -29, 51, 95, 90, -69, -54, 2, -70, 17, -66, -41, -16, 116, -14, 74, 8, 4, 51, -28, -125, 17, 74, -30, -44, 39, 30, -68, -6, 27, 68, -1, -46, 44, 39, -102, -69, -79, 81, -25, 62, 89, 5, 20, -43, -1, 46, 11, 29, -10, -57, 13, -21, -12, 37, -35, -3, 21, 78, -122, -90, -48, -2, -16, 24, 45, -120, 4, 30, 15, 115, -80, 38, 95, -60, 80, 61, -29, 13, 58, 82, 29, 81, 3, 28, 31, -14, -47, 40, -45, -6, -56, 17, 30, -52, -21, -122, -102, 22, -17, -62, 12, -7, -12, 94, -38, 11, -88, -44, -16, 37, -43, 31, -36, 31, -10, -89, 126, -123, -2, 19, -81, 23, -78, -13, 25, -5, -34, 2, -30, 24, -5, -33, 6, 44, 10, -9, 8, 6, 47, -8, 32, 9, 8, -4, 24, -17, 53, 89, 17, 40, -20, -57, -112, 31, 6, 55, -21, -112, 111, -124, -26, -47, -16, 76, -8, -21, -59, -38, -17, -10, 20, 73, -48, 50, 2, -33, -79, -40, 82, -2, 3, 101, -40, 14, 42, -94, 34, -55, -126, -9, 12, 35, -112, 58, -30, -30, 4, 55, 37, -36, -126, -14, -68, 77, -37, 99, 2, -23, 11, -31, -120, 22, -101, -51, 52, -17, -37, 1, -12, 15, 20, 45, 58, -37, -86, -13, 42, 53, 76, -48, -1, -45, -60, 17, 42, -81, 1, 18, 48, -61, 127, 23, -23, -8, 27, 41, 6, 36, -125, -61, -64, 33, 1, 63, -44, 22, -63, 40, -118, -83, -3, 31, -83, -94, -105, -43, 84, -6, -69, 41, 25, -66, -13, 3, 91, 31, 72, -25, 52, 73, -126, -8, -116, 72, 14, -34, 12, -111, -26, 4, -102, 67, -28, 47, 5, -52, 114, -11, 55, -120, -93, -105, -46, -24, -47, -16, 0, 15, -13, -101, 64, 127, -96, -67, -128, -125, -29, -30, -17, -56, 3, -33, 14, 4, 22, 56, -46, -60, -121, -21, 35, -16, 115, 6, 0, 11, -12, 19, -4, -4, -122, 46, 33, 40, -40, 42, 67, -39, -32, -51, 67, -127, 54, 13, 23, 58, -3, -88, -2, 61, 72, -69, 7, 123, -52, 10, 10, 17, 22, -17, 6, 21, -55, -3, -23, -12, -47, 2, 66, 12, -7, 25, 78, -55, -29, -23, -36, -12, -58, -115, -13, 13, -52, -17, 5, 30, -20, 69, 26, -45, -33, 19, 12, -16, 21, -21, -37, 5, -18, -54, -43, -1, 49, 1, 34, 23, -24, 57, -86, -9, 48, 12, -95, -59, -47, -36, 6, 81, 28, -2, 11, -4, -4, 27, 13, -21, 34, 60, -31, 11, -25, -5, 18, -32, 125, 51, 65, -68, 11, 22, 115, 56, -66, 24, 41, -90, -17, 20, -35, 81, 7, 58, 71, -24, 61, 17, 16, 22, -37, 61, 124, 88, 18, 11, -64, -73, -22, 58, -92, -96, 106, 18, -41, 88, 83, 122, 105, -77, -21, -97, -128, 13, 41, -11, -70, 55, -12, 5, 35, -41, -80, -33, 52, 10, -75, 0, -41, -35, -51, -51, 18, 31, 25, 92, -107, 35, 28, 117, -2, 26, -127, -14, -48, -53, 9, -123, -25, -62, 90, 14, -5, 43, 1, 25, 64, 90, -23, -35, -75, 25, -42, 18, -73, 2, 34, -65, 29, 28, 33, -32, -37, 6, -7, -90, -83, 2, 29, 15, -47, -51, 47, 21, -8, -9, -43, 53, -23, 45, 19, 23, -57, -39, 14, 56, -114, -64, -2, 13, -64, -34, 61, -8, 24, 26, -1, 6, 14, -126, 0, -6, 21, -43, -18, -29, 21, 46, -26, -3, -25, -23, 18, 60, -48, 47, -11, -69, 74, -34, -41, 4, 18, 16, 41, 32, -128, -42, -59, 48, -17, -81, -40, -56, 19, -3, -19, -53, -4, -36, 52, 93, 40, 123, -25, 26, -93, -122, -127, 38, 10, 37, 25, 18, -29, -24, 22, 3, 41, -15, 90, -64, -53, -23, -64, -77, 91, -54, 80, -21, -41, 17, 19, 16, 7, -3, -19, -61, 31, -43, -57, -29, -45, 44, 40, 30, 57, 43, -23, -28, -53, 4, -38, -26, -87, -8, -11, 28, 42, -54, 75, 1, -42, 58, 3, 24, -26, -27, 37, 15, 96, 52, -20, -5, 46, 52, -11, -30, -14, 22, 2, -11, 3, 28, 38, 61, 23, 99, -27, -20, -1, 21, 16, 31, 24, 16, -29, -22, -21, -2, -76, 19, -81, -124, -47, -4, 30, 18, -22, -74, 46, -43, 31, 33, -18, -54, -8, 43, 41, -19, 36, -22, 41, 72, 87, 36, -24, -11, 2, 8, 98, -30, -37, 47, -21, 12, -30, -128, -71, 91, -72, -39, -15, 100, -20, 98, 20, -29, -46, -36, -46, 40, -12, -7, 45, -48, -10, -39, -8, -45, 9, 57, -49, -10, -21, -21, -49, -17, -18, -28, -31, 90, -10, -63, 17, -33, -40, -71, 34, 22, -9, -31, 121, 4, -1, -83, -18, 25, 5, 18, -19, 20, 49, 9, 16, 27, 14, 23, 18, 53, 28, -99, -42, 17, -43, -114, 3, -12, -13, -10, -7, -37, -27, -7, 26, -14, 19, -6, 25, 13, 17, 19, 63, -67, 47, -39, -126, 12, 32, 17, 12, 9, -50, -126, -90, -28, -70, 9, 102, -59, -19, 20, -58, -126, -13, -76, 1, -4, 69, -42, -49, -18, -124, -59, -68, 32, -31, 18, 127, 24, 123, -18, 30, -25, -7, 13, -127, -71, -19, -43, -110, -11, -111, 53, 33, 77, 119, 74, -70, -127, 83, 68, -15, -2, -29, -48, -10, -38, 16, -5, -32, -98, 25, -64, -51, -124, -126, -126, -54, 62, -116, -28, -76, 2, -123, -27, -52, 127, 102, -76, 99, 70, -64, -3, -114, 124, -56, -29, -26, 1, 11, 55, 101, -38, 50, 111, 10, -43, 48, -72, 20, -78, 23, 46, -25, -23, 44, -30, -27, 31, -17, 55, 27, -75, 59, 81, -38, 25, -44, 111, 57, 19, 12, 84, 7, -15, -56, 42, 49, 15, 38, -9, -56, 38, 92, 81, 17, 92, 32, 25, -39, 8, 40, 2, 34, -41, 26, 35, 64, 57, 47, -32, -120, 46, -5, -51, -114, 82, 61, 55, 31, -59, 120, 106, 115, -3, 6, 16, 54, -12, 43, 12, 21, 3, -12, -35, 15, 41, 67, 67, -15, 48, 65, 57, -23, 3, -37, -46, -72, 18, -69, 97, 12, -91, 13, 16, -61, 8, 12, -107, 26, 15, -61, 3, 42, -51, 39, 40, 69, 29, 6, -4, 42, 16, 16, 94, 40, -9, 72, 40, -2, -2, 34, -18, 26, -20, 80, 8, 120, 30, 65, 98, -42, 83, 23, -47, -30, -14, -25, -18, 22, -118, 90, 49, 2, 15, 41, 22, 11, -30, -27, 58, 30, 50, -66, 13, 100, -57, 5, 58, 26, -8, 94, 17, -61, 56, -72, 28, -113, -52, -24, -18, 28, 55, 0, 9, -109, -102, -1, 19, 67, -15, 61, -20, -108, -1, -32, -89, -9, 35, -80, -19, 66, 90, 76, -97, 34, -20, 51, -69, 18, 42, -19, 76, -21, -1, 71, -51, 72, -29, 40, -60, -8, 72, 16, 21, 36, 22, 55, 31, -17, 75, 70, 24, -10, 28, 1, -15, 22, 51, -17, -31, 54, 75, 84, 51, 99, 55, 4, 26, 5, 6, 51, -1, -36, 53, 27, -72, -63, -38, 17, 102, 114, -35, -61, 50, 66, 125, -14, -36, 25, -32, -17, 17, -9, -70, -83, 41, -36, -40, 8, 87, -60, 15, -75, -58, -54, -24, -4, 4, -109, 36, 46, 73, -66, -6, -34, 12, -30, 74, -55, -23, 70, 25, -1, -52, 72, 35, 109, 27, -28, -37, 44, 39, -66, -125, 18, -49, -9, -5, 53, -15, 42, 49, 80, -90, -60, 108, -46, -13, 16, 37, 4, 55, 7, -47, -28, -79, 38, 25, 57, -20, -9, 53, -74, 68, -22, 29, 20, 51, -114, -1, -23, 88, 16, 71, 30, 54, 82, -12, -21, -34, 16, 35, -25, 54, -94, 36, -87, 0, -62, 29, -50, -22, -41, -108, -54, 28, 24, 122, 6, 74, 91, -35, 18, -35, -3, -38, -62, 32, 112, 50, -53, -73, 25, 58, -27, -69, -45, 44, -3, -50, 63, -19, 47, -50, 44, -11, 10, 77, -1, -17, -24, -97, -98, 22, 33, -34, 14, 10, -72, 123, -62, -47, 75, -34, 9, -43, 61, -71, 42, -103, -38, 47, -114, 0, 16, -52, -24, 62, 27, -29, -63, -13, 51, 126, -31, 19, 8, -67, 11, -111, 126, -17, -15, 51, 127, -18, 8, 20, 5, -24, -38, 19, -39, -5, 94, 15, -21, 4, -64, -58, 71, -92, 30, 43, -23, 3, 17, 58, 27, 38, -37, -22, -12, 40, 62, 33, 9, 5, 33, -34, 15, -35, 36, 118, 10, 17, 42, 45, 57, 19, 32, 55, 58, 79, -126, 16, -99, -28, 10, -22, 16, 45, 55, -1, 125, -38, -7, 40, 56, 4, -76, 41, -50, -20, -40, 59, -45, -24, -60, 62, 97, 47, 65, 2, -57, -4, -41, -7, 67, -4, -16, 41, -54, 15, -42, -4, 94, 20, -101, -63, -126, 56, -36, -5, 47, -11, -33, -24, 35, 64, 28, -24, 104, 44, 22, -19, 40, -8, -49, -54, 80, 62, 43, -29, -8, -7, -20, 3, 32, -59, 53, -4, 10, -82, -122, -126, -98, -60, -33, 124, 126, 12, 68, 10, 1, 127, -12, -12, -46, 54, -127, -86, -41, 26, -35, -125, -14, 3, 56, -50, -123, -14, 59, -47, 109, -12, -18, 115, 55, 32, 22, 108, 22, -47, 18, -128, -50, 94, -4, 2, -17, -25, -49, 37, 11, -30, -10, 70, 29, -8, -81, 16, 56, -63, 0, 45, 40, -2, 124, 15, -5, 22, -89, -9, 39, -52, -1, -5, 70, -67, 15, 14, -27, 26, -18, -34, -22, 11, 1, -1, 6, -65, -104, 30, -32, -18, -125, 72, -63, 70, 26, -82, -103, 7, -44, -26, 26, 115, 11, -1, -22, 10, 75, 42, 7, -35, -105, 52, -9, -41, -1, -125, 22, 49, 8, 44, -128, -68, 47, -112, -121, 27, 108, 64, -118, 4, -68, -7, 42, 24, 64, -121, 47, -29, 120, -44, 124, -29, 38, 21, -5, -7, -21, -8, 85, 4, 38, 16, 27, -32, 100, -3, -11, -25, -18, -111, 40, 32, 46, -4, 28, -70, 102, -23, 50, 13, -25, 41, -29, -22, 25, 12, -50, -108, 36, -38, -3, -12, -35, 21, 108, -103, -127, -11, 0, -125, -39, -126, -122, 22, -123, 55, -123, 26, -89, 50, 14, -127, -21, 117, 26, -69, -127, 95, 1, -81, -41, 51, -27, 10, -59, -18, -128, -50, -91, -123, -69, 21, -14, -63, -119, 75, 24, -73, 7, 52, -39, -100, -33, -127, -25, 19, 23, 56, 7, 2, -12, -26, -2, 27, -45, 24, 13, -32, 64, 40, -34, 47, -35, -89, 76, -71, 70, -34, 30, 22, 9, -124, 13, -105, -33, -31, 42, 9, -68, 110, -38, 54, -72, 21, -126, -27, 16, 19, -22, 1, -31, -63, 28, 3, -58, 37, -9, 10, -75, -6, 97, -54, 113, -40, -37, 90, 63, 27, 52, -58, 61, 23, 118, -3, 23, 35, -14, -66, -60, 5, -38, 37, -94, -17, 47, 115, 36, -87, -46, -29, 0, 4, 72, -9, -73, -50, -10, 14, 31, -10, 20, -44, -89, -12, 63, 63, 36, -50, -71, 59, 109, -62, 48, 30, -19, -53, -95, -3, 60, -48, 76, -12, 24, 98, -20, -99, 23, 58, 7, -7, -7, -9, -50, -13, 18, 80, -118, 22, -16, -48, -17, -36, 33, -24, 47, 56, -114, -25, -120, -110, -73, 91, -41, -16, -46, -21, -73, 14, 113, -24, -40, 63, 33, 17, 120, -53, -22, 127, 58, 25, 11, -16, -7, 17, 127, -73, -95, 28, -18, 51, 121, 0, 42, 6, 17, -16, -18, -18, 114, 27, 61, -29, -51, -15, 1, -71, 37, 25, 99, 85, -36, 8, 11, -88, -15, -114, 72, 23, -59, 50, 85, -55, -32, -16, 70, 84, -29, 50, 56, -5, -19, 62, 56, 11, 51, 43, -31, 5, 92, 1, 9, -76, 18, -89, 3, 6, 44, 45, 40, -1, -33, 35, 21, -25, 35, -11, 50, -50, -61, 28, -108, -6, -62, 111, -13, 44, -66, -31, -9, -22, 18, -46, 8, -14, -43, -5, -95, 77, 80, 31, 23, 32, -48, -3, -29, -9, -41, -25, -80, -34, 55, 1, -11, -10, 22, -69, 6, -19, 83, -49, -28, 20, -4, 52, -8, -31, -18, -6, 48, -22, 53, -16, -24, -56, -59, -32, -34, -11, -50, 49, 31, 55, -29, -53, 35, 6, -16, 1, -19, -6, -12, -25, 21, 41, -1, -2, -38, -43, -83, 18, -2, -18, -27, 54, 47, 24, -33, -50, 4, -6, -3, -23, -16, 34, 4, 34, 29, -72, 89, 58, 91, 25, -5, 35, -98, 33, 0, -14, -52, 96, -38, -81, -24, 36, 68, 0, -42, 8, -20, -14, 10, 115, 17, 6, 37, 0, -52, 64, -10, -28, 26, 89, 10, 16, 68, -7, 12, 26, 21, 73, -51, -53, -65, 1, -30, -6, -17, 3, 1, 11, 7, 82, 39, -37, -59, 59, 3, 111, 13, 14, -19, -68, 44, 11, 11, 22, 120, 13, 18, -32, -17, 1, 18, 51, 53, 31, -15, -49, -16, -74, -39, -52, 55, -68, -28, 116, 12, 25, 37, 60, 64, 54, 56, -60, 79, 51, -46, 62, -17, 2, 38, -46, 99, 123, 28, 114, 46, 87, 1, -61, 64, 67, 21, 0, -38, -19, 29, -61, 1, 50, 16, -8, 51, 48, 89, 49, 47, 96, -13, -29, 73, 27, 126, -12, 0, -23, -22, 18, -42, -39, -28, 23, 118, -26, -62, 63, -44, -27, 92, 32, -16, 42, 90, -22, -63, -41, 19, -46, 98, -61, -70, 46, 0, -65, 37, -16, 54, 1, -3, 72, -56, -108, 7, 27, -38, -125, -41, 10, -6, -60, 127, -32, -71, 68, 10, -35, 64, 44, 48, -21, -41, -37, 23, -59, 40, 38, -22, 26, 18, -20, 73, -114, -24, -53, -39, -27, -11, -98, -21, 5, 71, -115, 11, -37, -107, -60, -5, 72, -84, -62, -28, -5, -121, -86, -2, -51, 53, 127, 124, -39, 44, -44, -125, 79, 29, 42, -6, -39, -29, 19, -26, 10, -72, 49, 13, 41, -51, -97, 0, -93, 52, -84, -32, -66, 12, -35, 20, 3, 22, 69, 20, 97, -43, 41, 8, -36, -26, 118, 26, 10, 35, -52, -2, 22, 8, -13, -43, 2, -44, -1, -18, 5, 61, -118, -103, -55, 5, 13, 10, 5, 4, 106, 2, -22, 30, -13, -117, -121, -38, 29, 24, 14, -14, -62, 33, -13, -18, -8, -69, -6, -113, -91, 1, -36, -32, -17, -36, 40, -10, -34, 10, -74, -27, -33, -33, 12, 18, 4, -1, -1, -33, 34, 8, 26, -41, 120, 60, -41, -5, 11, -41, 37, 10, -7, 31, 31, 26, -55, 25, -1, -12, 53, 43, 29, -8, -48, 29, -94, 39, 41, -45, 91, 15, 3, 29, 12, 69, 13, -68, 65, -12, 54, 55, -18, -11, -40, -18, -36, 76, -11, -79, -11, -16, 38, -42, 86, -14, 37, -6, -8, 57, 2, -28, 11, -47, -89, -34, -47, -73, -121, -19, -73, 69, -6, 35, -5, 114, 82, -39, 14, 5, -67, 12, -21, -17, -96, 14, -20, -12, 2, 81, 12, -1, -126, 65, -16, -36, -2, 4, -35, 2, -6, 49, 1, -42, 69, -11, -47, -25, 25, 9, 103, -50, -54, -8, 6, -56, -8, 21, 6, 7, -104, -18, -106, 51, 127, -85, 50, -6, -27, 20, 91, 22, 4, 39, 25, 43, -5, -20, -32, -95, -3, 40, -104, -11, -55, -128, -46, -71, 37, -101, 77, -6, -44, 49, 26, -63, -105, -54, 60, -58, -13, -37, 39, 43, 72, 42, 22, 65, -60, -75, -59, -116, -106, -3, 25, 45, -109, -84, -123, -28, 35, -24, 0, -114, -82, -109, -114, 3, 14, 117, 55, -17, 19, 32, 68, 45, 8, -128, 75, -46, 82, 80, -85, -15, 106, -44, 92, -31, -106, 93, -33, 80, 37, 3, -92, 15, -18, 40, -107, 28, -48, -87, -127, 37, 47, -64, 14, 36, 20, 10, 25, 66, 18, -69, 92, 59, 17, -128, -48, -39, 120, -14, -63, -31, -48, 8, -9, 60, -21, -19, -2, -2, 37, -84, 98, 80, -120, 82, 21, -126, -14, 8, -54, 3, -6, 52, 8, -16, 23, -3, 9, 61, -124, -9, 31, 14, -31, -2, -30, -3, 2, 2, 0, 111, -42, 5, -21, -43, 52, 36, 17, 39, 79, -30, 53, 15, 5, -97, -29, 10, -7, 1, -91, 78, 35, 34, 14, 38, -9, -16, -96, 15, -125, 7, -22, 32, 17, -101, 16, 15, 23, -30, -62, -15, 6, 27, 4, 55, 38, -37, 29, -70, 33, -101, -59, -103, -50, -34, -50, -62, 53, -26, 127, 1, -1, -10, -6, -13, 7, -13, 95, -111, 55, 12, 6, -3, -108, -59, 27, -64, 36, -122, 125, 27, -75, 12, 1, -59, 84, -105, 109, -94, -76, 20, 23, 11, -36, -36, 43, -43, -123, 15, -100, 65, 20, 16, -42, 25, 69, 28, 37, 22, 112, -78, 23, 17, -10, 34, -63, -11, -127, -46, 39, 39, 12, -47, -69, -67, -53, -60, 8, 15, 45, -83, 6, -30, -114, 9, -78, -43, -47, 69, 15, -72, 68, 44, -53, 20, -120, 58, -4, 42, -11, -16, -125, 9, -65, -9, -4, -84, 105, -12, -92, -105, -21, -33, -121, -68, -8, 1, -39, -119, 38, -1, -2, -127, 3, -104, -43, 127, -4, -35, -125, 117, 106, -67, 49, 69, 15, -102, 80, 8, -84, -84, -96, -94, -27, -32, 4, -3, -16, 98, -25, 17, -24, 51, 11, 37, 23, -85, -61, -41, 62, 28, -127, -124, -101, -27, 98, -71, 56, 1, -92, 28, 7, 13, -11, 34, 23, -125, 56, 111, -124, -44, -15, -47, 5, -7, 2, 45, 1, 26, -54, 26, 11, 0, 5, -11, 22, 35, -41, 5, 41, -78, 24, 18, -5, -30, 49, 22, -1, -19, 39, -26, 1, -16, 8, -8, 3, 17, 75, -1, -50, 30, -49, 3, 24, 35, 38, 1, 3, -9, 10, -45, 42, -6, -26, -35, 71, 75, 0, 17, 5, 11, 57, -90, -100, 0, 50, -1, 26, 32, 11, -20, 121, -41, -9, 22, 5, -2, -40, 22, 4, -71, -14, 3, 10, 6, -5, 0, 29, -22, 86, -3, 4, 8, 13, 8, -3, -58, -30, -19, -15, 18, 6, 16, -19, -87, 26, -11, -46, 64, 40, 6, 108, -16, 49, 67, -45, 15, 51, -6, 75, 87, -39, -92, 27, -14, 7, -32, -128, -15, 39, -4, 50, 0, -26, 25, 62, -24, 67, -57, 27, 64, -25, 29, -35, 69, 6, -56, -70, -1, 7, -69, -32, 45, 52, 31, 20, 27, -29, 26, -72, -95, 38, 125, -8, 67, -33, -126, 7, -13, 86, -111, -9, 23, -52, 8, 16, 59, -26, -9, -19, 40, -10, 87, 21, 17, -60, 126, 120, -22, 35, 22, -14, -24, -33, 2, -96, 97, -126, -118, 17, 9, 41, 70, 14, -50, 11, -20, -37, -7, 76, 16, -52, 21, -34, 34, 13, -13, -81, -126, 82, 65, -14, 22, -23, -82, 61, -124, 34, -78, 76, 56, -128, 41, 36, -48, 45, -40, 33, 1, -102, -45, 0, -126, -58, -62, -2, 60, 6, 108, -17, -37, -76, 13, 8, 24, -6, -9, 69, 62, 26, -11, -9, 15, -30, -6, -48, -121, -98, -60, -125, 26, 52, 18, -64, 108, -20, -126, 58, -123, 48, 70, -117, 75, 46, -62, 9, -34, -21, 39, -15, -91, 37, 1, -32, 18, -10, 44, -11, 15, 39, -32, -55, -55, 92, -52, 37, -6, -9, -45, -89, -30, 14, -29, 11, -69, -35, -62, 21, 55, -1, 85, 21, 50, -20, 5, 9, -81, 22, 80, 33, 38, 35, 29, -22, 39, 83, -54, -5, 5, 14, -25, 3, -20, 29, 20, -14, 7, 20, 7, 11, -32, -52, -15, -8, 8, 36, -8, 21, -9, -34, -116, -14, 32, -23, 38, 30, 5, 27, -5, -78, 67, -4, -53, -75, 9, 53, -12, 8, -3, 15, -4, -10, -4, 21, 52, -16, -13, -36, -20, -67, 113, -57, -27, 46, -5, -9, -27, -123, -71, 71, 38, -30, 113, 31, 24, 58, 8, 43, -77, -13, -81, -40, 55, 29, 9, 13, 30, 4, -29, 24, 10, -124, -10, 1, -25, -77, -30, 25, -12, -29, 5, 47, -36, -39, -41, -39, -19, -44, 0, 72, 34, -10, 9, 58, 45, 24, -45, -75, -17, -9, 74, -20, -35, 28, -68, 5, -82, -22, 12, -63, 35, -6, 23, 37, -9, -46, -19, -22, 32, 13, 7, 1, 14, -29, 65, 35, 4, 66, -23, 33, 42, -28, 111, -18, 19, -26, -79, -3, -68, -89, 126, -56, 0, -83, 19, 95, 24, 52, -66, 10, 98, -18, 51, -31, -13, 8, -126, -5, -48, 91, -37, 127, -11, 105, -119, 18, 72, 60, -128, -117, -102, 36, 91, 17, 24, 4, 116, 11, 103, -15, -43, 22, -12, -82, 74, -128, -49, -18, 54, -86, -2, 10, -2, 18, 50, -1, 66, 99, 118, 19, 46, -126, -90, 38, -126, -93, -24, 8, -2, 23, 2, -39, 5, 3, -13, 16, -80, -127, -37, -87, 29, 12, -54, 21, 0, 0, -122, -14, -38, 71, 45, 21, 16, -24, -72, -35, 18, -37, -20, 17, -30, -97, 50, 36, 127, -44, -19, 4, -40, 2, -25, -3, 25, -27, 55, 5, 28, -68, 39, 58, -61, -50, 22, 56, -68, -45, 75, -1, -8, 62, -59, 36, -5, -113, 71, -42, 29, 32, 4, -73, -23, 55, 66, 37, -40, -25, -53, 18, -7, -78, -70, -22, 39, 48, -43, 77, -6, 35, 17, 23, -45, -22, 61, 15, 42, 35, -42, 0, -125, -65, -20, 31, 20, 74, -12, -37, -46, -33, 28, 31, -64, -13, 25, 69, 15, -23, -55, 93, 1, -20, 55, 81, 52, 18, 3, -79, -22, 88, -29, 114, -6, -40, 12, 34, 19, 104, 45, 4, -43, 22, -10, 61, -82, 25, 35, 29, -30, 7, 107, -72, 2, -52, 21, -28, -5, 127, 8, -27, -96, -95, -14, -127, 12, 47, 32, -116, 14, -48, 35, -34, 114, 100, -14, -73, -36, 11, 50, -23, 11, -38, 12, 20, -20, -125, 67, -45, -28, 4, 88, -5, 58, 10, -52, 21, 17, 41, -37, 66, -82, 21, 39, 0, -43, -9, -55, 42, -16, -81, -31, 11, -20, -17, 119, -29, -68, 16, -125, 32, 107, -92, -126, 25, -35, -26, -51, -53, -79, 58, -19, -127, -36, 3, -20, -55, -74, 47, 36, -103, -52, -110, 62, 12, -123, 78, -43, -127, 30, 36, 34, -110, 34, -39, -89, -126, -29, -29, -60, -34, 39, -19, 4, 22, -70, -98, -52, -67, -77, 5, 33, 9, -23, -14, 28, 25, 9, -80, -99, 17, -26, -101, 47, -24, 24, -36, 53, -126, -23, -84, -28, -105, 10, -60, -60, -56, -87, -74, 26, -41, 60, -67, -10, 96, -89, -89, 42, -29, -3, 47, 4, 30, -4, -26, -70, -20, 70, -27, 44, -74, -8, 54, 35, 115, 12, -21, -13, 10, -41, -70, 39, 86, 54, -40, 22, 42, 13, 6, 24, 13, -1, -58, -37, -53, -3, -25, -23, 5, -30, 31, -28, -103, -1, 13, -54, -70, 4, 2, 4, 10, 20, 32, 2, -38, -84, -3, 37, 23, 54, 5, 16, 12, -14, -10, -3, -26, 2, -36, 83, 8, 33, -10, -5, 48, -32, -32, -36, 16, 9, -42, 38, 60, 36, -81, -52, 56, -88, -55, 21, -26, 24, -26, 127, -59, -60, -12, 23, -26, -2, -100, -58, -33, 17, -2, -71, -40, -124, 102, -10, 72, -119, 121, 104, -47, -35, -24, 113, -122, -23, 82, -101, -60, 69, 27, -4, 110, 32, 16, -104, 44, 10, -89, 25, 30, 44, -1, 78, 82, -1, 29, 25, -58, 44, 70, 70, 9, -31, -30, -8, -17, 60, -102, -35, 4, 43, 85, 84, -6, -80, 5, -71, -45, 22, -63, 52, -116, -37, 90, 93, -58, 2, -2, 1, 20, -31, 35, -55, 31, -20, -70, -26, 59, -32, -24, 76, -108, 27, -19, -6, 30, 68, -1, 4, 79, 45, -43, 45, -13, -47, -14, -66, -41, 85, -39, -24, -17, -50, 22, 2, 51, 27, -28, 62, 12, 50, -107, -62, 2, -17, -9, -63, 34, -30, 35, -10, -123, -24, -49, -12, 57, -45, -46, -63, -29, 37, -103, 49, -80, -31, 31, 46, -53, 6, 65, 10, -38, -44, -71, -4, -23, 10, -61, -48, -46, -33, 17, -23, 77, 39, 25, 0, 58, 50, -1, 25, 44, 66, 42, -4, -6, -12, -36, 50, 1, 113, -5, -23, -54, -4, -5, -10, 3, 25, -4, -98, -37, 49, -33, -21, -40, -18, -68, 93, -29, -3, -9, -1, 48, 22, -65, -12, 40, 2, 29, 2, 36, -119, -9, 4, -27, -40, -1, -17, 15, -44, -7, 2, 59, -23, -33, 10, 54, -17, -26, 111, -5, 46, 73, 50, -5, -91, 45, 27, -105, -13, 37, -55, -68, 25, -23, -7, 5, 80, -28, 4, 127, -59, -102, 18, -9, -29, 8, 32, 56, -123, 5, 19, -98, 52, -126, 36, 35, 26, -17, -78, -97, 71, 5, -38, 92, -31, -42, 39, 9, 81, 4, 33, 3, -49, -25, -1, 0, 106, -75, -85, 14, -127, -67, -41, 46, 32, 10, -3, -40, 86, 73, 73, 20, 99, 42, 41, 30, 77, -1, -3, 57, 19, -13, -19, 43, 81, 41, -13, -16, -95, 17, 35, -4, -30, -98, -59, -2, 103, 74, -103, 2, -13, -1, -2, 84, -3, 126, 15, -103, 18, -30, -35, 20, -21, 72, -40, 46, -15, -10, -6, 11, -19, 17, -25, 110, 85, 48, -22, 2, -64, 42, -69, 6, -10, -37, 12, -50, 5, 31, 1, 61, 74, 60, -50, -29, 65, -67, -35, -41, -128, 106, -4, 92, -21, -57, -44, -127, -84, -57, 49, -32, -12, 56, -86, 17, 50, 47, 57, -20, 42, 11, 32, 26, 43, -12, 59, 27, -84, 62, 6, 7, 16, -5, -44, 36, -75, 9, 25, 17, 89, -7, -54, 1, -54, 12, 34, -7, -4, -71, 18, 38, -26, -19, 13, 3, -10, 56, 48, 9, 100, 47, 34, 123, 98, 44, 84, -9, -16, -10, -17, -20, 5, 50, 111, -28, -64, -20, -127, -69, -3, 64, -27, -37, -79, -15, -84, -81, -16, 55, -78, 98, -97, -20, 86, -15, -79, 57, 24, 31, 29, 26, 33, -21, -52, 31, -46, 73, -47, -17, -44, 102, 84, -63, -59, -69, 123, 39, 80, -83, -37, 37, -116, -37, -2, -54, -101, 93, -21, 36, -19, -8, 93, -115, 69, -18, -37, 13, 49, 99, 10, 2, -31, -109, -127, 50, 49, -43, -20, -56, -43, 18, -10, -127, -52, 45, 82, 3, 11, -82, -22, -90, 70, -55, 99, 82, -41, 39, 6, -104, -14, -104, -9, 34, 127, -15, 7, 99, 0, -58, 1, -21, -9, -17, -34, -28, -15, -41, -10, 16, 12, 46, -13, 10, -11, -15, 45, -73, 16, -37, 114, -50, -79, 110, 81, 14, -17, -1, -128, -124, -35, 77, 72, 61, 124, 41, 29, -40, 57, -3, -24, 115, -62, -53, 35, -9, 15, 109, 71, 18, 22, 39, -128, -49, -127, 19, 116, 74, -10, -36, 123, 102, 19, 108, 23, 4, 95, 126, 101, -16, -10, 13, -90, -95, -18, 61, 0, 79, -115, 18, 57, -5, 114, -123, 35, 124, -126, 46, -18, 21, 98, -117, 3, -123, -56, 119, 45, -61, 31, 34, -26, -51, 15, 34, -24, 61, -18, -57, 3, -75, -116, 22, -117, -18, -3, -22, -30, -33, 27, 33, 125, 24, -33, 35, -77, -92, -33, 25, -127, 32, 36, -69, 34, -6, 54, -16, 34, -13, 64, -126, -128, -8, -86, -8, -63, 70, 22, 11, -37, 37, -99, 40, 127, 68, -23, -28, 126, -67, -43, 52, 39, 94, 13, -62, 24, -110, -95, -11, -39, -67, 48, -111, -12, 34, -66, 126, 35, -26, -59, -127, 31, 73, 30, -128, 30, -126, -128, -113, 28, -126, -127, -1, -2, -57, 23, -53, -5, -56, -41, -76, 122, 8, 45, 76, -120, -86, 37, -123, 20, 0, 35, -77, 63, -102, -63, -17, -51, 7, -116, -7, -10, -79, -119, -29, 23, -18, 70, -89, -33, -40, 14, -16, -102, -17, -77, 33, -11, 49, 58, -15, -61, 40, -49, -36, -47, 18, -23, -81, 123, -15, -14, -83, -32, 113, -1, 1, -85, -20, -85, 4, -66, -118, -31, -90, 79, -74, 7, -45, -45, -54, 113, 59, -25, -23, 55, 23, -115, 18, -80, -111, -61, 15, -93, -68, -59, 125, -50, -10, -40, 39, -113, 21, -92, -126, 79, -23, 34, 37, -16, -6, 28, 31, 12, -96, 9, 34, -45, -32, 114, -36, -5, 118, -49, -22, 119, -5, 51, -37, 3, 17, 14, -52, -92, 41, 88, 2, -80, 98, -52, 46, 31, 52, -6, -40, 33, -25, 55, -16, 50, -119, -41, 77, -91, 43, -70, 26, -4, -2, 35, -68, 57, 10, -97, -21, -54, 18, 117, 121, 13, -40, 104, -10, 50, 48, 13, -5, 37, -23, -31, 13, -37, 11, 74, 43, -13, 35, -36, 23, 106, -54, 40, -68, -58, -9, 52, 10, -58, 27, 90, 7, 43, -58, -4, 93, 1, -89, -64, -42, -17, 20, -48, -126, 122, 71, -116, 8, 123, 52, 37, -17, -46, 0, 57, -11, 113, -93, 50, -61, 41, -1, 33, 22, 73, 35, -43, 48, 98, -55, 33, -10, -43, 37, -47, -3, 14, -32, -126, -23, 25, 0, -41, 30, 40, 81, 102, 84, 15, 43, 28, -6, -68, -10, 62, 83, 0, 13, -25, 35, 30, 39, 19, -8, 29, -12, -126, -21, 64, 3, 107, 29, -124, 19, 6, -114, -126, -42, 23, -90, -67, 65, -127, 27, -70, 42, 5, 125, -3, 28, -72, 27, 14, -72, -41, -80, 42, 0, -11, 28, -3, -37, 39, 43, -47, 57, 41, -54, 23, 53, 100, 9, -31, -17, 42, 126, 32, 109, -3, 16, -57, -13, 36, -58, 63, -30, 37, 38, 20, 55, 6, 14, -16, 24, 38, 23, -8, -13, 73, 127, -3, 21, 93, 36, 33, 12, 44, 36, -33, -8, 29, -51, -26, -24, -7, 44, 66, 20, -9, 86, 33, 20, -56, 2, 48, 12, -83, 23, 72, 14, 39, 57, -78, 28, -23, -10, -8, 20, 31, 8, -70, 47, -16, -64, 1, 4, 42, -13, -1, -45, 81, 64, 58, 48, -12, 45, -20, -7, 32, -3, -75, 102, -18, -32, 66, -16, -48, 21, 10, 52, 11, -70, 31, -88, -46, -45, -37, 55, 111, 23, 44, 6, 40, 36, 40, -10, 127, -20, 6, -42, -45, 6, 68, -4, 40, 37, 19, -36, -61, 30, 26, 18, -57, -7, 5, -121, 20, -15, -90, 23, 30, 11, -1, 26, -23, -8, 24, 15, -80, -96, 15, 29, 90, -51, 4, -42, 33, 13, 25, 48, -33, 96, -19, -45, 25, 17, -68, 16, -80, -1, -6, 30, -11, -23, 8, -110, -39, 22, -32, 87, 76, -34, 62, -62, -82, -20, 127, -28, -49, 54, -2, -96, 30, 13, 53, -71, 5, -45, 52, -6, 5, -19, -17, 12, 0, 74, 51, 71, 83, -11, 11, 88, -35, 10, -7, 8, 42, 13, -49, -29, 0, -75, 8, 10, 88, -12, 21, 23, -82, -17, 19, -5, -62, 127, 93, 19, 26, 89, -15, 18, 12, 41, 24, 12, -22, 92, -21, -7, -58, -9, -45, 38, -72, -15, -125, -96, 9, 67, -7, -15, -17, -28, 30, 6, -7, 99, -47, 29, -31, 24, -14, -107, 15, 12, 57, 26, 3, -57, 19, 1, 3, -16, 27, 12, 5, 52, 31, 16, -124, -2, 24, -26, -18, -76, -115, 3, 97, 30, -20, 127, 32, -6, 29, -37, -59, -40, -20, 29, 49, 11, 20, 37, 33, 29, 7, 11, -12, -16, -84, -49, 4, 38, -5, -9, -9, 50, 6, 2, -25, 103, 21, 73, 55, 15, -13, 58, -9, -4, 50, 7, 1, -8, -6, 19, 18, 12, 10, 10, -26, -3, -5, 62, 56, 21, -7, 41, -32, 0, 11, -32, -14, 48, -1, 26, -19, 24, 46, -8, 0, 26, 58, -5, -26, -27, 4, 36, 59, -25, 3, 4, -28, 26, 63, 51, 48, -61, -121, -19, -45, 49, 1, -1, 58, 5, 38, 47, 28, 14, -2, 20, -11, -33, -13, 42, -29, -53, 38, -44, 107, -9, 60, -10, -78, -15, 78, 21, -71, -36, 58, -27, 15, -4, -41, -50, -85, -61, -62, -105, 59, 39, 29, -27, -16, 68, -26, 26, -4, -48, 58, -15, -13, -2, 48, -33, -47, 34, 1, 4, -36, -13, 32, -3, 63, 14, 15, 107, -31, -37, -25, 49, 112, -29, 22, 20, 89, -12, 5, -1, 91, -54, 44, 32, -42, -14, 43, 113, -61, -46, 126, -99, 63, -16, -75, 119, 57, 42, -124, 99, 91, 57, 31, -81, 16, -57, -32, -79, -6, 123, -36, -47, 109, -125, 1, -72, 21, -50, 82, -4, -2, -36, -127, -28, 8, -105, 51, 67, 34, 50, 9, -25, -125, 54, 12, 28, 104, -15, -22, 29, 3, -14, 35, 9, 26, -25, -72, -26, 98, 16, 23, 16, -8, 20, -112, 74, 98, -18, -56, 85, 127, -51, 1, -84, 38, -31, -86, -45, 46, 5, -54, -54, -114, 47, -43, 20, 121, 21, -18, -11, 95, 23, -27, -25, 39, 8, -10, 17, 28, 61, 6, -56, 58, 4, -37, 35, 23, 51, -19, 5, 19, -1, -1, 14, 33, 15, 37, -11, 19, 35, 45, 13, -14, 46, 19, -42, 55, 28, 51, 30, 54, 120, 17, 66, 42, 66, -12, -9, -13, 44, 38, 5, -7, 27, 75, 78, 35, 31, 78, 49, -4, -14, 40, 33, 41, 1, -68, 23, 53, -12, 11, 13, 28, 29, -43, -41, 42, -25, -12, 38, 18, -4, 7, 38, 29, 44, 31, -26, 61, 37, 49, -19, -6, -17, -12, 49, 56, 33, 80, 43, 42, 29, 62, 4, -53, 34, -57, 30, 13, -55, -28, 19, -6, 43, -43, 19, 48, -16, 29, -25, 64, 30, 51, -62, -18, -16, 15, -30, 8, -14, 60, 20, -12, 49, -32, -28, -42, 3, 17, -55, 11, 26, -51, -25, -38, 47, 48, -29, 33, 9, -20, -6, -12, -54, 111, 4, 31, 77, -5, -2, -50, 46, -5, -18, -30, 28, 33, 11, 48, 22, -3, 3, -34, -41, -4, -27, -16, -41, -10, -21, 34, 9, 46, 23, 46, 25, -28, 28, 32, -16, 47, 127, 36, -8, -21, 57, 20, 35, 80, 7, 18, 83, 16, 59, -56, 3, -23, 111, 40, -24, 23, 62, 101, 29, -122, 26, 74, 36, -27, 8, 79, -94, 47, -121, 12, -63, -4, -2, -76, 8, -18, -45, -3, -112, 66, -71, -7, 19, 21, -108, -120, -10, -27, -43, 76, 67, -127, -35, 12, -2, 61, 103, -34, -3, -6, 24, 80, 44, 5, -13, -52, -4, -14, 70, 38, -46, 65, 79, -62, -93, -5, -101, 95, -20, -52, 55, 11, -126, 11, -38, 23, 16, -47, 7, 66, -65, 2, -16, -26, 21, 43, 27, 42, -41, -50, 9, -126, -21, -67, 34, 51, 47, 77, -3, 0, 30, 19, 17, 3, 50, 1, 120, 20, -12, 90, 56, 1, -21, 24, -15, 97, -2, -19, -35, -1, 45, 12, -41, 34, 8, 12, -23, 43, 121, -33, 62, 39, -119, -26, 36, 44, 14, 26, 5, 8, -64, 16, -10, -43, -45, -22, 5, -16, -21, 40, 13, -16, 31, 109, -31, -38, 121, 4, -59, 85, 14, -57, 20, 3, -51, 45, -40, 33, 13, -11, -9, 27, 55, 43, 10, 6, 14, -37, -31, 127, 22, -7, 34, 11, -102, -60, 29, -58, 21, 14, 99, -16, -101, 17, -64, 36, -6, -62, 22, -37, -49, 30, 74, 88, 95, -33, 45, 20, 52, 55, -98, -49, 19, 56, 9, 124, 93, 0, -14, -66, 34, 20, -63, -40, -12, 59, -7, -51, -9, 68, 4, 124, -37, -78, 32, -9, -4, 69, 21, -19, -27, -33, -58, 60, -39, -32, -112, -5, -35, 124, -18, 47, -99, -57, 15, -85, 49, -98, 104, -86, -104, -57, -17, 9, 21, -9, -85, 65, -127, 75, 113, 71, -5, 127, -53, -60, 14, -120, 35, -2, 20, -38, -82, -50, -67, -8, -54, -52, -7, -8, -10, 14, 11, 112, -5, -40, 37, 21, -90, -39, -67, -127, -25, -27, 80, -14, -39, 16, 61, -18, 38, 41, 93, -4, -5, -80, -35, -47, -6, -12, 23, -37, 108, -8, -126, -125, 12, -54, -26, 40, -52, -72, -26, 47, -35, -98, -15, -68, -51, -21, 21, 40, -89, 121, -116, -5, -23, -1, -123, -125, 21, -34, 2, -47, -18, -49, -123, -19, -94, -21, 37, 13, 43, -79, 81, -2, -21, -11, 104, -16, -37, -29, -46, -3, 64, -38, -120, -10, 25, 15, -17, 1, 110, -5, -24, -42, -23, 43, -17, -93, -122, -3, -35, 0, 11, -84, 24, -49, 78, 0, -22, -49, -54, 83, -8, 8, -13, 64, 46, 27, -99, 89, -27, 69, 1, -53, -83, 5, 19, -91, 42, -97, 92, 62, 51, -79, 7, 13, 34, -37, 57, 16, -53, -55, 4, -26, -11, -29, -39, -60, 69, -25, -8, 19, 4, -6, -123, 73, 26, -61, 21, -90, 8, 7, -123, -20, 12, 29, 53, -121, 83, -39, -24, -46, 15, 24, 31, 2, -89, -64, -3, 85, -8, 127, 7, 14, -25, -3, -64, 104, 84, 74, -38, 39, 25, 119, 67, 15, -71, 28, 113, 65, -27, -25, -19, -11, 19, 76, -3, -88, -75, -34, -110, -64, 19, 69, -76, 102, -8, -68, -12, -43, -31, -9, 120, -36, 46, 96, -73, 89, 83, 98, 50, -81, 68, 34, 39, 68, -17, -19, 47, 111, 15, -58, 96, 1, 18, 2, -73, 82, -59, 5, 47, -112, 9, -43, 4, 18, -47, 82, -93, 88, -48, 58, -62, -57, 67, -41, 87, -29, 65, 69, 63, 54, 5, -75, -4, 38, 57, 24, -48, -8, 13, -18, 38, 126, -128, -66, 43, -4, -103, -21, 47, 59, 19, 70, 26, 1, -9, 10, -60, 18, -120, 21, -8, -36, 15, 120, -111, -5, 58, 2, -33, -119, -77, -105, -7, 118, -116, -3, 18, 73, -35, 2, 17, 1, 56, 16, -26, -26, 17, 27, 52, 0, -12, -5, 41, -19, 36, 68, -7, -7, 70, -127, -49, -19, 44, -88, 22, -118, -52, 48, 63, 66, -97, 54, 46, 43, -47, 59, -62, -91, -58, -39, 95, 35, 19, -15, 42, -31, -41, 31, -17, 36, -114, 34, -105, 71, -4, -40, -40, 11, 47, 5, -9, 101, 80, 36, -9, 8, 47, 23, -19, 31, 22, 69, 39, -14, 124, -37, 23, 60, 69, 11, -3, 57, 28, 59, 1, -3, 125, 17, 65, 23, -24, 0, 33, 64, 34, 30, 33, 42, 29, 31, 71, 64, -16, 58, 40, -61, -46, 29, 2, -38, 11, 14, 68, -2, 21, -26, 25, 5, -19, -22, 92, 38, 51, 22, 127, -32, 99, 77, 42, 34, 75, -58, 46, -3, 2, 13, 66, 27, -22, 37, 13, 20, -29, 47, -56, 68, -78, 14, 43, -36, -9, 44, 39, -20, 18, -53, 18, -11, 9, 16, 33, 19, -23, -9, 40, 55, 52, 23, 21, -4, -31, -18, 22, 4, -12, 95, 2, -10, 63, -17, -12, -15, 82, -23, 1, 16, -22, 88, -34, -17, 4, 49, 9, 41, 62, -9, -6, 32, -64, 35, -14, -11, -31, 19, 50, 41, 91, -2, -62, -16, -5, -23, -10, 11, 66, -56, -2, -59, -1, 74, 11, 110, -15, -25, 90, 69, -18, 68, -38, -7, 10, -14, 114, 1, -15, -57, 52, 118, 45, -61, -65, 116, -100, 11, -73, -116, 81, 11, 24, -33, 1, -39, -88, -48, 11, 70, 7, 59, -50, 13, 12, 30, -96, -65, 44, 60, 12, 23, -50, 118, -28, 41, 59, -10, 47, -5, -54, 97, -27, -102, 33, 31, -56, -4, -8, -83, 45, -29, -19, 122, -15, -39, 89, 11, 3, -67, -21, -18, 71, -2, -49, 49, 97, -69, -68, -8, -79, 63, -27, 115, 1, -116, -40, -119, 19, 37, -30, 86, -17, -85, 53, -40, -23, -78, -58, -88, 99, 119, 47, 22, -30, 42, 25, 40, -62, 11, 34, -29, -32, -27, 26, 16, -15, -72, -5, 1, -81, 20, -17, 13, 120, -30, 124, -29, 41, -72, 19, 34, -92, 63, 44, 76, 12, -33, 50, -2, 77, -1, 41, -1, 17, 41, 73, 40, -8, -22, 95, 46, 71, -1, -80, 41, -44, 10, 4, 37, -43, 70, 43, -123, -36, 42, 39, -8, 13, -17, 3, 76, 29, 22, 9, 29, 28, 22, -44, 14, -44, 4, 26, 55, 38, 23, -38, -44, -8, 59, 14, 37, 43, 48, 49, -20, -3, 38, 12, 46, 5, -12, -25, -21, -25, -71, 64, 55, 124, 18, 57, 28, 48, -118, -15, 41, 43, 45, 18, -76, -24, 11, -8, -72, -20, 41, -45, 97, -35, -68, -1, 104, -95, -39, 9, -77, -23, -8, -9, 24, -13, -22, 86, -3, 55, -125, -10, -65, 44, 49, 49, 19, -122, -6, 41, 54, 80, -16, -76, 48, 111, -125, -21, 98, -6, -21, 31, -16, 0, -33, -119, 42, 64, 12, 6, 56, -8, 55, 44, 66, 27, -20, -73, -37, 31, -16, -24, 11, 126, 24, 26, -61, 13, -24, 69, -4, -33, 0, 14, 11, 60, -15, -125, -68, -56, 60, -10, -126, -26, -124, 73, -54, 40, -70, 17, 57, -28, -37, -28, 20, -72, 27, -13, -119, 6, -123, 23, 106, -18, 65, 28, 61, -126, -59, -16, -57, -35, -125, 3, 3, -122, -127, -36, 51, -3, -15, 42, -87, -71, -117, -117, 99, -120, -11, -6, 0, -12, 48, -58, 15, -128, -59, -19, 43, 2, 49, 49, -18, -75, 22, 105, 19, -73, 117, -20, 10, -4, 13, -99, 25, -125, -79, -89, 51, -27, -28, 0, 40, 3, -55, 6, 31, -27, 39, -3, -12, -14, -11, 28, -55, -57, 33, 54, -126, -74, 27, -8, 96, 17, -70, -21, -35, -44, -7, -14, 19, 57, 33, 9, -46, 16, 18, -14, 43, -43, 0, 11, 16, -3, 0, -28, 80, 54, -3, -12, 12, -13, -15, -26, 102, 4, -2, 16, -21, 31, 16, 3, 4, -4, -5, 37, 37, -61, 41, 27, -4, 1, -30, 13, -41, -14, 16, -2, -7, 31, 127, -10, 31, 105, 19, 35, 100, -14, -30, -3, 27, 82, 89, -71, 61, 9, -18, 26, 49, 78, 33, -22, 1, -47, -24, -117, -54, -55, 6, -59, 116, -48, 41, 38, 3, 114, -65, 0, 21, 16, -16, -13, -33, 7, 15, 12, 44, 69, 35, 11, -32, -59, -87, 71, 59, -20, 26, -35, -3, 1, -25, 56, 56, 127, -15, -15, 96, -4, 66, -47, -76, 57, -48, 84, 8, 42, 78, -10, 126, -40, -34, -14, 33, 22, -23, 48, 8, -10, 3, -32, 13, 61, 21, -2, 0, -62, -26, -96, 61, -59, -93, -72, 119, 34, -58, -18, 35, -18, -68, -13, -38, -49, -28, -79, -30, 33, 78, 80, 69, 46, 50, -8, 21, -69, -77, -41, 105, 7, -122, 42, 24, 69, 39, -69, 118, -125, 25, -124, 12, -18, -59, -7, -31, 62, 8, 0, -2, -15, 0, -46, -99, 9, 86, 9, 33, 35, -42, 3, 121, 125, -50, -76, 113, -85, 21, 8, -68, 73, -18, -17, -30, -128, 8, -119, -33, 31, 28, -11, -5, -9, 9, -31, -24, 42, -79, 25, 5, 30, 121, -1, -22, -95, 88, -89, -29, -100, -104, -100, 94, -75, 31, 75, -65, -125, -91, 48, -125, -27, 20, 105, -126, -95, -49, -29, 14, -6, -35, -36, -22, -25, 16, 53, 5, 52, 32, -24, 80, 16, 83, 31, 42, -120, 17, 34, -56, -2, 32, -99, -40, -17, -27, 122, 87, -70, 38, -28, -116, 0, 17, -41, 40, -82, 31, -27, -2, 39, -68, 17, 24, 81, 40, -47, -9, -22, 8, 30, 37, 30, -26, -20, 17, 41, -27, 64, -20, 31, 27, -38, 37, -13, -36, -57, -32, -32, -31, -31, -63, -12, -23, -26, -19, 13, -55, -23, 79, -17, 5, 30, -5, 22, -27, 34, 14, 4, -14, -109, -1, -10, 21, -8, 19, 33, 44, 1, -2, 39, 16, 77, -22, 0, -8, 37, -30, -28, -125, 0, -48, -14, -117, -71, -60, -55, 40, 27, 14, 98, 47, 120, -75, 93, 7, 5, -2, -18, 60, -52, 66, -73, 11, 8, -75, -26, 38, -15, -106, 91, 76, -94, -39, -87, -15, -38, -13, 55, -26, -123, -68, 39, -60, 8, -18, -5, -7, -5, -37, 65, 55, 47, 115, -20, 48, 40, -34, 27, -23, -65, 4, -79, -126, 36, 93, 43, 5, 84, 14, -49, 52, 65, -80, -50, -29, -31, 56, -37, -56, -66, -51, 30, -43, -24, 41, 3, 110, 56, 29, 40, -9, 23, 40, 6, -16, 5, -77, 73, 2, -30, 6, 0, -42, 32, -1, -3, 82, -106, 6, -47, -41, -58, -38, 85, 3, 12, -79, -18, -1, 48, -19, 9, 88, 4, 35, -66, 61, 72, -7, -42, -30, -29, 21, 113, 28, 93, -4, 71, -116, 6, 4, 23, -51, 26, -3, 3, 26, 16, -28, 27, 1, 69, -50, -35, -19, -47, -41, 12, -99, -72, 78, 19, 20, 110, 46, -65, -36, -9, -10, -18, 39, -27, 43, 15, 15, 97, 57, -23, 11, 38, -24, -88, 18, -41, 71, 42, -34, 21, 94, 53, -19, -25, -23, -82, 61, -61, -17, -1, -127, -19, -2, 53, -75, 44, -118, -45, -12, 80, -120, 36, -95, -55, 46, -16, -29, -32, 46, -98, 30, -52, 10, -44, 38, -29, -14, -63, -7, 21, 39, -66, 72, -17, -39, -17, 9, -23, -40, 36, -51, 42, -87, 29, -42, -122, -9, 44, -47, -39, -34, -76, 58, -99, -7, 8, -18, -8, -44, -42, -11, -71, -29, 59, 4, -82, -13, 25, 52, 31, 5, -22, -3, 67, -43, -68, -44, 29, -20, -63, 61, -55, 98, -31, 42, -102, -8, 30, -88, -5, -24, -127, -110, -38, -29, 81, -71, 33, 9, -27, -20, 67, -108, 55, -27, -94, 11, -60, -16, 33, -6, 24, 127, -94, -86, -85, 16, 4, -40, -70, 20, -43, -20, 48, -25, 49, -126, 78, -62, -22, 87, 36, 31, 33, -125, 39, 81, -117, -60, 2, -19, -48, 18, 24, -27, 12, -22, -14, -14, -70, -2, -42, -109, -1, 56, 9, -110, 103, 35, -17, -31, -60, 72, -49, 45, 70, 43, 37, 107, 124, 70, -13, 78, -48, -47, -38, 82, 23, 127, -29, -22, 9, 30, -112, -9, 86, -69, 52, -77, 36, 67, 3, 113, -32, -53, -23, 18, -122, -53, 7, 27, 22, 1, -71, -51, 87, 62, -56, 43, -116, -126, -27, 16, 53, 46, -62, -13, 36, 94, -27, 29, 6, 58, -14, 103, -21, -24, -48, -54, 2, 94, -3, 57, -124, -104, -9, 106, 38, -69, -13, -43, 35, -65, -83, -89, -126, 35, -4, -45, -28, -47, -65, -82, 75, -36, 61, -81, 85, -112, 119, 59, -7, -11, -63, 50, 23, -1, 59, 0, 4, -56, -68, -40, 8, 15, -20, 21, 58, 3, -85, -64, -2, -26, 28, 32, -53, -27, 70, 9, 87, -1, -15, -121, -34, -69, 10, 56, -10, 61, -58, 105, 25, -59, 28, -50, -32, 33, -14, 42, -24, 9, -14, 10, -3, -28, 13, 56, -59, 10, -68, 14, 37, 57, -20, -9, -17, -80, 24, 20, -18, -1, 122, -8, 5, -72, -57, -118, 2, 14, 30, -27, -127, 38, 39, -79, 18, -37, 93, 46, 27, 22, -9, 1, -9, 33, 45, -46, 43, -45, -43, 15, -7, 21, 2, -59, 34, 9, 41, -42, -28, 24, -12, -12, 5, -16, 6, -58, -51, 37, 49, 25, -51, -5, 31, -124, -32, -39, -48, 6, 34, -86, -63, -9, 34, -4, -32, -27, 22, 6, -3, 94, -44, 1, 42, 3, -34, -39, 127, -32, 53, 72, 20, -42, -75, 27, -21, -9, -25, 17, -61, 62, -77, 2, -8, -94, -26, -42, 40, -69, 0, 17, 56, -115, 1, -6, 12, 14, 23, 10, 12, -56, 107, -29, -28, -33, -45, -64, -105, -22, -19, 59, -10, -69, 45, 4, -58, 32, -12, 22, -59, 35, -22, 70, 19, 49, -17, -78, 4, 21, 50, -49, 28, 18, 32, 72, 60, 5, 47, 46, 30, 11, 73, 1, -57, -6, 87, -97, 32, -23, 55, 26, -35, 9, 37, 105, 10, 18, -118, 99, 125, 54, 45, 109, -26, 26, -39, -56, 7, -19, -38, 35, -128, 47, 17, 0, 97, -69, -63, 27, 23, -19, -79, 73, -46, 3, -22, 19, -41, 123, -44, 109, 33, 34, -2, 45, -126, -43, -14, -13, -5, 40, 26, -4, -127, -124, -19, -82, -111, 109, 76, -43, -30, -94, 77, -82, 0, -1, -7, 9, -36, -60, -19, 42, 28, -10, -90, 20, 83, -4, -60, -120, -8, -37, -18, -37, -84, -85, -46, -37, 22, -36, 15, 71, -23, 14, -125, -2, -41, -9, -40, 39, -43, -126, -6, -10, -94, -2, 10, -113, 15, -79, -7, -51, 25, -30, -40, -28, -121, -25, -45, -70, -11, -51, -128, 46, 81, -92, -89, -9, -54, -18, -16, -96, -84, 37, -77, -66, 21, -38, -54, -3, -33, -33, -111, -100, -11, 3, -6, 20, -128, -3, -54, -41, -21, 54, -53, -128, -127, 28, -55, -107, -10, 41, 112, 35, -25, 11, -43, 93, -61, 38, -54, -52, -104, -1, 5, -60, -122, -101, -22, -19, 104, -57, 7, -54, -84, -33, 78, 34, -2, 15, -122, -14, -60, 114, -75, -31, -42, -86, -67, -66, 38, -26, -5, -124, -15, -3, -52, -127, -13, -50, -108, 64, 37, -19, -51, -67, -16, 32, -128, 31, -46, -48, -66, 7, -31, -61, -5, -53, -113, 47, -45, 0, 102, -18, -46, -101, 16, -37, -11, 29, 14, 15, -20, 23, -24, -30, 43, 3, -28, 16, -21, 18, -42, 2, -16, -69, -75, -75, 27, 19, -20, 52, 37, -121, -22, 17, 12, 45, -84, -50, 12, -126, -15, 19, -24, -60, -23, -61, -67, 6, 122, -116, 82, -35, 24, -30, -87, 26, -26, -17, -42, 5, -25, -118, -17, -67, -60, 39, 15, -100, 30, -121, -39, -67, -13, 33, 20, -36, -10, -9, -94, -107, -22, 21, -126, -34, -11, -83, -82, -46, -119, -35, -86, 4, -123, 44, 23, -42, -84, -56, 4, -53, -6, 39, -12, -50, -18, 37, 42, 45, -123, -32, -6, -33, -39, -4, -97, -68, 9, 74, -53, -125, -83, -2, -22, 57, -21, -90, -69, -9, -76, 43, -15, -1, -18, -20, 2, 18, 5, -93, -31, 76, 5, -1, 5, 44, 14, -5, 6, -48, 48, -2, 38, -59, -36, 77, -50, -32, -11, 46, 33, 69, 62, -63, 20, 110, 15, -42, 10, -4, 78, 8, -24, -59, 33, 65, 34, 48, -22, 26, 122, 51, -7, 10, -58, -2, 18, -27, 7, -126, -84, -4, -40, 48, -124, -127, -6, 46, 55, -13, -83, 84, 31, 2, 34, -1, -19, -65, 38, 41, 29, 11, -121, -55, 74, 20, 19, -2, 14, 35, -15, -80, -33, -46, 36, 13, -49, 40, -71, -41, 65, -107, 32, 17, 3, 8, 45, -50, 24, 4, 2, 55, -43, 13, -12, -20, 15, 9, 16, -26, -25, 126, -9, 126, 31, 27, -20, -125, -41, -46, -7, -39, -60, -31, -108, 8, -47, -12, -89, 67, -8, 57, 7, -10, 95, -7, -109, 29, 47, 93, 79, 44, 15, -45, 50, -41, -13, 7, -56, 43, 48, -54, 60, -10, -29, -47, 0, 82, 22, -84, 2, -8, -39, 31, 4, -27, 12, 24, -91, -8, 39, 3, -23, 5, -122, -74, 64, -9, -42, -53, 27, -94, 18, 18, -3, 73, 68, 18, 6, 98, -18, -2, -78, 8, -45, 14, 54, 15, 58, 40, 33, -31, 6, -10, 7, -6, 0, 41, 37, 121, -29, 36, 14, -56, 63, 9, 15, -122, -7, -67, -4, -115, 0, -41, 19, 37, -13, 17, 11, -13, 10, -29, -77, 18, -9, -10, -79, -3, -8, -40, -25, -22, -9, 0, 27, -105, -23, -65, 7, -35, 29, -13, -29, -34, -71, 55, 37, -3, 24, 69, 7, 32, -24, 18, -60, -20, 39, 101, 9, 28, -78, -68, -88, 22, -19, 28, -87, -6, -33, 44, 1, 37, -69, 8, 18, 48, -15, -41, -110, 23, 43, -32, 5, -75, 10, -16, 28, -31, -17, 68, 17, -38, 4, 47, 1, -4, 33, 35, 83, 50, 38, 11, 40, 51, 1, -20, -9, -35, 76, 34, -4, -24, -27, -10, 6, 60, -44, 14, 104, 43, 19, -23, -16, -127, 21, 13, -11, -27, 30, -42, -6, 70, 27, -52, 41, -13, 52, -22, 30, 29, -28, -85, -55, -72, 125, -49, 6, -12, 23, -4, -44, 32, 49, 68, 4, 13, -35, -61, -6, 51, -124, 27, 82, 31, 28, 121, -120, 26, -33, -42, -44, 107, 88, -16, -98, 30, 25, -19, 6, -42, -77, -8, 35, -13, 35, -23, -70, -71, -35, -45, -54, 127, -103, -46, -74, -110, 32, 33, 10, -38, -13, -29, -23, 56, 18, 59, -110, 18, 11, -7, 41, 2, 126, 10, 6, -20, -7, -46, -55, -4, 22, -6, 35, -6, -79, -72, -11, 4, -8, 126, -3, -18, 71, 21, -7, 2, -107, -123, -22, -45, -68, 37, -45, 87, 48, -32, -12, -54, 82, 76, -44, 26, -36, 48, -127, -126, 65, -10, -28, -18, -49, -127, -57, -75, -82, -57, -91, -17, 12, 18, 6, -1, 0, 38, 25, -121, 77, 38, -109, 24, -119, -17, -22, 10, -10, -1, -72, -44, -26, 49, -58, 48, 14, 9, -30, -44, -26, -48, -30, -36, 84, -87, 54, 11, -42, -120, 56, -102, 17, 33, 65, -1, 27, -41, 11, 2, 30, -44, 12, -2, 86, -39, -59, -115, -46, -60, -9, 75, -10, 4, -117, 62, -34, -126, -33, -47, 54, 15, -127, 45, 3, -17, -21, -55, -51, -104, -41, -20, 59, 21, 11, 25, 38, 74, 40, -23, 8, 23, 31, -75, -3, 56, 26, -38, 104, -11, -8, 100, -5, -35, 39, -1, 67, -62, 47, 48, -8, 101, 39, 45, -20, -1, -22, 39, -3, -17, -7, -17, 19, 10, 26, 4, -8, -5, 69, 4, 2, -3, 13, 45, 19, -8, 90, 12, 39, 10, 18, 1, -30, 15, 53, 19, -40, -20, -4, 29, -7, 9, 14, 5, 16, 49, -61, -31, -64, -36, -8, -8, 25, 21, -26, 7, 0, 4, 2, 21, 2, -60, 42, 5, -48, 79, 8, 29, 34, -26, -79, 22, -43, 69, 78, -72, 30, -41, -103, -15, -35, -52, 8, 29, 110, -51, -32, 1, 40, 33, -46, 22, 48, 24, 24, 58, -107, 6, -72, 39, 35, 8, -28, 67, 28, 79, 118, 3, -45, 121, 0, 18, -40, 93, -61, -28, -33, 43, 19, 83, 45, -9, -123, 82, 39, -3, -39, 16, -17, 25, -27, 25, -49, 71, 45, -59, 8, -44, 12, -84, 4, -3, 56, -97, -17, -84, 88, 61, 1, -22, 116, 35, -31, -13, 26, 120, 10, 51, -17, 38, 48, -24, -21, 124, -8, 43, -33, 29, -34, 32, 27, 31, 64, -127, 64, 4, 12, -50, -128, -33, -26, 45, -124, -127, 3, 0, 4, -17, 0, 56, -13, 86, -128, -46, -126, 52, 55, 54, 13, -10, -27, -52, 31, 6, 51, 121, 50, 9, -102, -32, -87, 8, 61, -4, -19, 2, 24, 11, 74, -27, -114, -3, 58, -1, 40, -112, 70, -24, -71, 29, -24, -75, 55, 1, 64, -1, -18, 39, 7, -78, -22, -111, -122, 108, 22, 37, -13, 13, 17, -17, -113, 32, -9, 23, 71, -93, 11, 110, 74, 72, -26, -6, 50, 48, -51, -73, 120, 30, -8, 28, 41, 82, 34, 63, 9, 51, 123, 57, 16, -105, 29, 38, 18, -39, 47, 31, 0, -56, 39, -36, -24, 62, 87, 39, -25, -38, -67, 84, 6, 48, 107, 26, -49, -94, 52, -16, -17, -4, 1, 68, -19, 90, -7, 53, -19, 10, -16, -38, -9, -55, 12, -31, 44, 19, 70, 28, 28, -32, -11, 31, -3, -58, -3, 50, 46, 28, 37, 6, 31, 5, -27, 54, 26, 33, -43, 46, 126, 44, 80, 12, 8, 73, 20, -62, 86, 42, -10, -15, 25, -83, -25, -119, -54, 16, -35, -21, -40, 35, 37, 5, 7, -8, -36, -20, 43, 38, 61, -124, 65, 33, -30, 107, 58, -26, -41, -14, -43, 29, 116, -40, -55, 76, -83, 59, 36, -116, -1, -106, -57, 121, 26, -67, -32, 77, -9, 35, -111, 47, 36, -41, 80, -64, 11, 121, -80, -4, -116, -71, -47, 56, -15, 27, 24, -74, 11, 86, -20, 66, -93, 18, -35, 21, -14, -4, -37, 8, 19, 64, -81, -57, -33, 126, 32, -32, -12, -22, 63, 43, -24, -36, -49, 29, -105, -115, -73, -124, -43, 77, -99, 120, 4, 42, -77, 46, 55, 61, 45, 108, -120, 34, -49, -18, -61, -46, 8, -121, -79, 18, 91, 45, 29, -61, -20, -118, 41, -20, 105, -5, 46, -12, -4, 14, 8, 43, 1, -38, 56, 88, -22, -94, 109, -71, 13, -27, 16, 70, 74, -123, 60, 44, -25, 18, -24, -85, 39, 72, 21, 22, -35, 4, -18, 28, -1, -42, -53, 18, 32, -5, 45, -21, 35, 123, 63, 7, 45, -128, 1, -16, -86, 26, 25, -14, 20, 33, 112, 38, -3, -49, 67, -1, -20, -74, 6, -46, -23, -23, -114, 31, -77, -15, -24, -67, 74, 42, -61, 22, 25, -99, 50, 71, 6, -42, 58, 54, -19, 17, -3, 60, 9, 56, 116, 32, 82, -28, -10, 15, -43, 25, 52, -105, 57, 4, -41, 2, -84, 43, 36, 15, 2, -60, -48, -34, -49, 2, -71, 66, 54, 33, 3, 60, -22, 18, 32, 30, -8, 52, -64, -21, -16, -23, -13, 17, -51, 0, 5, -58, 23, 5, -56, -5, 72, -27, 83, 18, 42, -24, 20, 10, -30, -17, 49, -23, 51, -54, -7, 11, 20, 89, 21, 9, -83, -22, -121, -36, 95, 29, 42, -71, -38, 6, 60, -79, -119, 35, 8, 35, 14, 110, 68, 35, -62, -26, 14, 52, -51, -41, -3, -35, 35, -34, 64, -81, 74, 10, -7, -45, 33, 19, -55, -26, -71, -8, 19, -67, -4, 49, -36, 25, -33, -40, -39, -10, -25, 4, -30, 100, 8, 33, 8, 9, 22, 5, -39, 61, 10, 79, 89, 42, -27, -9, -15, -64, 24, 80, 26, -9, 19, -11, -68, 43, -51, -14, 39, -16, 54, -11, -121, 48, 64, -95, -31, -46, 7, -43, -19, -61, -111, 79, -34, -126, 31, 5, 60, 51, -108, 42, -44, -43, -31, -81, 29, 24, -55, 11, -21, 0, 50, 1, -66, -31, -40, 6, -35, -31, -13, 41, -7, 74, -45, -123, 44, -25, -78, -24, 40, 49, -3, -38, -25, 3, -36, -93, 50, 53, 58, 81, -21, -24, -47, 7, -15, -47, -13, 29, 124, -10, 13, -41, -82, 8, -51, -20, 13, -48, 57, 38, 26, 15, -78, -23, -46, -3, -18, -16, -53, 6, 26, -43, 20, 12, 6, -1, -56, 40, 81, -62, 37, -30, 29, -10, 28, -44, -37, 11, -48, -7, -29, -90, 23, -25, -35, 6, 49, -10, -2, -30, 6, -79, -124, -13, 56, 44, -8, -80, 66, -28, -56, -11, -41, -74, 14, -4, -33, 43, 0, -30, -40, -37, 10, 7, 30, -24, -13, 22, -33, 36, -18, 64, -9, -25, -59, -72, -15, -31, 21, 56, -6, -102, 0, 46, -35, -3, -23, 39, -15, 117, 54, -10, 48, 19, -42, -31, -26, 11, -2, -35, -94, -30, 41, 26, 41, -23, -62, -47, -88, 51, -16, 13, 0, 56, -21, -57, -26, -17, 64, -5, -128, -24, -51, 53, 32, -76, 39, -81, 87, -116, -32, -24, 63, 76, -44, -128, 46, 69, -128, 12, 24, -128, 5, 88, -16, 76, 117, -6, 5, 26, -27, -36, -40, -73, 2, 4, -69, 39, 127, 53, 93, -124, 16, 46, 19, 27, 82, 102, -58, -96, -1, 123, 64, 13, 121, 116, 127, -77, 6, -70, 19, -127, -101, -23, -125, 126, -126, -17, 65, -65, 13, 124, 64, 35, -95, 0, 127, 42, -18, -37, -64, -47, 85, -126, -122, 40, 7, -67, -12, 6, 1, 105, 86, 20, 22, -16, -36, -22, -13, 1, -14, 39, 70, 16, -40, -29, 16, 42, 8, -47, 11, -50, 1, 1, -33, 5, -31, -91, -19, 21, -42, -65, 0, -10, 56, 12, -48, -19, -4, -12, 3, -9, 16, -15, -64, 5, -73, 9, 9, -4, 23, 14, -46, 21, -8, -43, -32, 43, -6, -2, 15, 4, -19, 26, 11, -15, 28, -13, 18, 56, 34, 42, -18, 25, -32, -11, 45, -37, 1, 43, 38, 4, -42, -15, -40, 8, -19, 19, -42, -31, -20, 34, -16, -50, 3, 18, -18, 17, -6, -15, -21, 5, 4, 91, 80, 8, -6, -33, -13, -82, -1, 42, 22, 6, 25, -16, 7, 16, 22, 14, 12, 18, 57, -6, 92, 13, 50, -54, 18, 58, 8, -18, 14, 62, 16, 126, 16, 18, 57, 7, 39, 104, -84, -4, -8, 29, -35, 13, 24, 13, 75, 16, -32, 23, 5, 21, -41, -94, -68, 31, 32, 0, -37, -5, -12, 6, -44, -20, 27, 19, 48, -4, -37, 23, 127, 24, 39, 97, 12, -1, 6, -13, 31, 7, 27, 8, 15, 44, 17, 97, 106, -68, -59, 20, -17, -13, 10, 9, 8, 89, 29, 47, 47, 39, 79, -18, 55, -5, 101, -2, 9, 105, 21, 87, -55, 26, 35, 49, 123, -13, 87, 10, -79, -40, -70, -50, 34, 6, 29, -17, 71, -18, 9, 111, 2, -21, -4, 127, -24, -52, -2, 104, -15, -27, 126, -78, 41, 59, 52, 72, -23, -12, -7, 52, -11, 17, -19, 79, -37, -23, -8, -23, -13, -75, -40, -57, -125, 60, -65, 24, -66, -72, -34, 79, 7, -29, -24, -100, -62, -62, -54, 40, -55, 42, 81, -51, 55, 21, 33, 93, 9, 85, -24, 37, 20, 21, -5, 72, 9, 60, -22, 15, 9, 80, 68, 10, -61, 57, 67, 127, -11, 22, 108, 103, -42, 43, -19, 97, 11, 33, 124, -61, 24, 23, -35, 122, -72, -45, -90, -48, 15, -48, -20, 48, 12, -4, 90, -3, 0, 13, -33, 64, 86, 19, 74, 119, 120, -128, -126, 37, 28, -7, 15, 72, -26, 62, 35, 8, -79, 4, -42, 9, -5, -37, -39, 72, -99, 10, 25, -1, -88, 66, 39, 28, -73, -123, 37, -12, 29, 44, 7, 75, -11, -98, 27, 61, -11, -10, -52, 74, 18, -62, -14, 66, -6, -2, -53, 13, 48, 13, 4, 4, -9, 16, -47, -16, 32, -49, 6, -51, -15, 55, 48, 64, 32, 41, -12, -72, 69, 7, 17, 26, 45, 53, -110, 16, 11, 20, -75, 48, 77, 1, -31, 1, 74, -66, -8, 73, 44, 19, -40, 41, 27, 62, 60, 93, 20, 12, 0, -39, -27, -1, 7, -13, -1, -15, 84, -47, 21, 62, -18, 25, 19, 6, 64, 97, -3, 9, 12, 101, -14, 46, 30, 22, -9, 22, 13, -6, -17, -26, -63, 21, 105, 49, -25, -26, -43, -22, 26, 17, 54, 101, -25, 44, -4, 40, -5, 50, 37, -21, 62, 53, 19, 38, -60, -84, 13, 40, 15, 59, 105, 33, -14, 19, -17, 69, -7, 13, -45, -20, -16, -16, 68, -17, 32, 12, 2, 40, -35, -23, 29, 9, -25, -38, 51, -62, 13, -84, -3, -48, -76, -76, -65, -24, 16, -21, 14, 2, 56, 18, -47, 49, -17, 31, 46, 18, 78, 44, 55, -72, 1, 34, -15, -46, -8, 6, -39, -24, 3, 121, 1, -11, -41, -61, 57, -33, 4, 3, -43, -47, -1, 97, -14, -14, -5, -13, -40, -15, 31, 1, 22, -7, -83, -19, 15, -35, -13, -2, 60, -31, 32, -20, -69, -50, 27, 69, -64, -48, 51, 40, -96, -63, -88, -24, 3, 12, 127, -111, 75, 54, -44, 14, -19, -59, 8, -16, 19, -128, -27, -76, -25, -2, -73, 125, 27, -127, 12, -15, -55, 40, -126, -1, -81, 50, 126, 100, 29, -6, 43, 32, 19, -2, 52, -27, 28, -108, 53, -24, 0, 42, -15, 20, -53, -51, 27, -108, -88, 49, -6, 34, 0, -54, -48, 49, -53, 13, 57, -64, 8, -19, 48, 8, -2, 13, 44, 13, -8, 26, 62, -23, 35, -6, -11, -16, 29, 94, 95, 22, 25, -42, 57, 41, 24, 43, 87, 49, 19, -18, 113, -11, 52, 102, 119, 31, 100, 47, 6, 16, 36, -11, 21, -23, 59, 8, 59, -14, 38, 82, 12, 58, -31, 39, 86, -52, -12, 51, -7, -65, 29, -44, -39, 12, 39, -49, 13, -41, 23, -9, 24, 13, 43, -48, 37, 75, 9, 88, -22, 22, -99, 24, 42, -20, 8, -31, -17, 8, 48, -29, 64, -9, -32, -2, -30, 11, 26, 124, -64, 25, 7, -5, -11, 58, 73, -93, 64, 24, -43, -60, -13, 8, 0, -16, -5, -83, -103, 108, 27, -20, -20, 32, -49, -2, -25, 126, -18, 19, 126, 3, 25, -27, 90, -24, -38, -38, 48, 55, 24, -28, 0, -22, -31, -8, 98, 36, -12, -7, 7, 16, -16, -88, -10, 102, 79, 117, -25, -40, -11, 26, -8, 19, 25, 35, 73, 47, 33, 14, 82, -20, -42, 22, -74, -25, 90, 16, -45, -66, 81, -65, -66, 34, -17, 22, -13, 102, 39, -3, -51, 32, -35, 4, -9, 53, -17, -92, 35, 41, 66, 125, 35, -68, 13, -34, -22, 22, 2, 13, -59, 26, 41, 12, -76, -78, 4, 78, -6, -30, 1, 46, -22, 29, -53, -44, -128, -83, 7, -128, -87, 45, 66, 21, -74, -13, -125, 2, -9, 0, -63, -67, 37, 32, -28, 1, 74, -109, 9, 25, -51, 31, 98, -32, 10, -22, -82, 30, 102, 41, -64, -43, 85, 40, -13, -125, -98, -5, 4, -66, -69, 6, -86, 125, 45, -81, -57, 76, -127, 91, -57, 2, -22, -65, -36, 127, -54, -12, -11, 6, -29, 20, 37, -13, -58, 32, -55, -5, -67, -51, 1, 0, -77, -43, 31, -43, 12, -61, 24, 53, 27, 6, 19, 25, -29, -4, -11, -97, -64, -43, 17, 19, -96, 13, 35, -48, -43, -34, 75, 6, -30, -6, -29, 26, -18, -47, -1, 42, -2, -29, -6, 40, -2, -95, -22, -95, 7, 67, 12, -35, 25, -15, -21, -72, -44, -89, -25, -97, 107, 4, 52, 11, 121, 0, 75, 9, -18, 23, -27, -50, -15, 5, 45, -31, -18, -55, -30, 40, 27, 2, 94, -14, -24, 26, 29, 86, 127, 16, -64, -38, 16, 110, 7, 22, -47, 64, 87, -11, 65, 92, -43, 89, 15, -68, 113, 68, -79, 80, 55, -57, 48, 12, -61, 2, -71, 22, 28, -25, 35, 8, 124, -66, 30, -112, -127, 74, -7, 52, -88, -15, -4, -45, -40, 124, 13, 61, 60, 29, -124, -73, -99, -85, -125, 79, 21, 124, -35, 123, 11, 28, 73, -62, 62, 44, 76, -1, -58, -25, -58, -40, 99, -57, -126, 6, -63, -124, -90, -105, -55, 84, -49, -17, 36, 66, 39, 19, 83, -34, -107, 27, -17, 20, 90, 11, 17, 50, 7, -47, 35, -17, 24, 57, 29, -27, -77, 11, -74, -49, -9, -39, 4, -25, 32, 117, -8, 37, 52, -104, -13, -87, 0, -32, 126, -10, 59, 15, -44, 26, 46, 8, -4, 25, -85, 24, 15, 20, -27, -6, 51, -8, 12, 50, -6, -23, 52, 109, -47, 13, 69, -112, -54, 36, -15, 32, -23, -106, -40, 19, 40, -49, -81, 23, -28, -3, -61, -47, -62, -52, 90, -25, 69, -122, 5, 119, -13, 9, 38, 17, -5, 34, -18, -34, 23, -27, 65, 59, -3, 16, 9, -16, 1, 72, -9, 36, -43, -8, 36, 27, 20, 35, 81, 4, 57, -25, 43, 0, 14, 31, -25, -32, -9, 35, 55, 18, -78, 25, 80, 31, 11, 15, 37, 0, -74, -10, 49, 44, 1, 8, 120, -14, -2, 29, 122, 33, 96, 23, -95, 39, 67, 8, -18, 73, 9, -50, -105, 80, -23, 88, -23, 6, 108, -15, -8, 36, 12, 27, 34, -22, 46, 28, -10, 61, -60, 0, 20, -31, -8, 32, -33, 87, 121, 35, 17, 45, -19, 21, 61, 90, -33, 57, 38, 36, -32, 119, -30, 25, 66, 14, -13, 28, 15, -34, 57, -56, -16, 27, 89, -63, 0, 3, -23, -37, -11, 43, 5, -65, -15, 58, -15, 25, 1, -70, 21, -43, -25, -52, -28, -52, 17, 2, 30, 5, -36, 76, 63, 37, 79, 88, -4, -25, 79, -77, 16, -20, -6, 48, 52, -47, 66, 68, 4, -11, 10, -54, -60, -68, -99, -16, 56, -67, 26, -70, 42, -13, 32, 57, 86, 40, 44, -8, -28, 30, 73, -29, -36, -22, 2, 4, 16, -52, 87, -29, 44, 26, 25, -21, 19, -64, -127, -11, 12, 47, 86, 97, -6, -34, 2, 69, 0, 8, 29, -7, -117, 17, -73, -19, 33, -86, 24, -124, 123, 94, 46, -103, -59, -5, 40, -114, 3, 68, 109, -2, -95, -33, -10, 8, 43, -10, -19, 78, -66, 10, 58, -114, -54, 65, 28, 67, -10, 63, 40, 18, 7, -26, 32, -8, 3, 3, -35, 43, 15, -78, -127, -2, -118, 47, 62, -124, -16, -57, -111, -123, 3, -45, -108, -122, 83, -103, 114, -124, -35, 35, -62, 55, -9, 87, 127, -74, 56, -28, -41, 40, 6, 5, -80, -6, 4, -4, -5, 57, -36, 17, 22, 47, -15, 22, 28, 37, 115, 36, 65, 21, -10, 0, 20, 18, 77, -51, -30, 7, 52, 13, -61, 13, -30, 15, 28, 8, -63, 15, -2, 13, -11, -2, -27, -68, 110, -43, -7, 81, 83, 24, 30, 33, -31, -28, -39, 15, 39, -46, -2, 13, -21, 6, -17, -51, -22, -33, -51, 54, 9, -54, 16, 35, 39, 44, -84, 12, 45, -21, -37, -46, -18, -53, 8, 21, 1, 11, 14, -71, -20, -5, -19, -9, -23, -16, 7, -3, -8, -16, -30, 43, 20, 43, 19, 17, -25, 11, -18, -24, 3, -31, -31, 82, -92, -69, 51, 3, -57, -82, 12, -86, -19, -10, 27, 23, -11, 3, -6, -34, -33, -29, -56, 13, 52, 36, -62, -34, -4, 17, -45, 2, 71, -48, -26, 17, -45, 25, -43, -18, 38, -23, 33, -11, 38, 28, 15, -83, -7, -11, -46, -53, 46, -13, 31, -36, -79, 57, -54, -70, -11, -42, -30, -35, 35, -11, -12, 18, -16, 111, -23, 22, 64, 28, 48, -31, 48, -18, -7, 11, -34, 1, -46, 31, -6, 71, -108, -121, -31, -57, -28, 61, 25, 32, -32, -126, 5, -13, 52, 117, -56, 17, 53, 9, -125, 48, 21, -42, -34, -16, 70, -48, 5, -2, -15, 78, -29, -121, 57, -28, 47, 19, -4, 45, 95, 13, 30, 31, -26, 54, -49, -65, 45, -97, 65, 98, -38, -30, -49, -36, 15, 34, -94, -6, -57, -105, 73, 5, -49, 1, -71, 22, -86, -124, -23, -53, -48, 4, 30, -1, 124, 29, 30, 68, 20, -128, 26, 12, -95, -8, -128, 75, 60, 6, -23, 5, 17, -12, -45, -72, 7, -18, -19, 48, -21, -46, 79, 31, -127, 36, -69, -75, -5, 102, 40, -29, 1, -21, 18, 1, 60, -99, -102, 21, 24, -42, 43, -1, 46, 16, 84, -53, -45, 33, -12, -3, 30, -1, -26, 0, 21, -48, -4, -6, 16, -41, 22, 9, -25, 6, -8, 15, 8, 6, 49, -18, 20, 10, 33, 62, 32, 15, 37, -16, 44, 5, 6, -47, 12, -16, 2, 50, 72, 94, -4, 38, -103, -17, 73, 50, 25, 7, -1, -15, -39, 0, 19, 24, 19, -49, 44, 3, 5, 85, -22, 33, 2, -16, 18, 53, -61, -2, 4, 6, -22, 66, -39, 5, -30, -73, 45, -62, 121, -60, 113, -65, 26, 34, -44, 57, -23, 42, -39, 31, 30, -79, 5, 31, 20, 22, -24, 42, -59, 120, 108, -28, -8, -11, 5, -3, 63, 64, -91, -2, -71, -21, 10, -70, 58, -43, -16, -12, 73, 11, -50, 15, -19, 41, -12, -9, -123, 35, 19, -19, -40, 34, -19, -43, -109, 24, 25, 1, 127, -7, -17, -91, 13, 3, 125, 2, -105, -53, 11, -28, 15, 66, 20, -10, 42, -45, 6, 20, -7, 38, -8, 43, -49, -46, 15, 60, 9, -124, 75, -31, -14, -70, -119, 38, 9, -44, -126, -92, -96, -17, -128, 1, -110, 40, 104, -23, -126, -61, 3, -78, 1, 75, 14, 41, -14, -43, 41, -80, -34, 52, -128, -13, -106, 53, 77, 82, -61, 34, 32, -117, -29, -20, -44, 55, -78, 56, 3, -16, -9, 119, 41, 27, -71, 0, 7, -26, -41, -117, 73, -84, -122, 34, 51, 89, 11, -48, -74, -14, 21, 22, -90, -96, -4, -86, 124, 19, 14, 101, 80, 10, -31, -32, 13, -32, 37, -21, 36, -52, 27, 15, 38, 16, 32, -33, -55, -28, -1, 123, -10, -54, 27, 46, -7, 127, 39, -1, 40, 3, 40, -12, -22, -30, -5, -30, -62, -64, -34, 123, -61, 39, 42, -31, 24, 49, -21, 77, -20, 45, 49, 85, 127, 79, -3, -23, -28, 77, 55, -31, 70, 4, 16, 59, 49, -36, 127, 85, -13, -27, -67, 67, 25, 8, 32, -3, -25, 104, 36, 44, 38, 48, -8, 22, -65, 71, 49, -10, 3, 6, 77, 49, 21, 6, 103, -17, -11, 40, -25, -2, 89, 54, 37, -68, -53, 68, -7, 58, -120, 56, 0, 66, -49, -70, -53, -59, -9, 14, -101, -38, 46, -103, 1, -12, 30, -57, -17, -7, 10, -39, -50, 0, -65, 68, -109, -82, -38, -36, 47, 99, -36, 2, 30, 34, 68, -39, 88, 6, 15, -20, 29, -40, -11, 2, 62, -50, -34, -36, 70, 127, -53, 55, 96, 38, 40, -46, -18, 65, 73, 56, 32, -48, -79, 17, -23, 105, -82, -84, 71, 31, 15, -61, 40, 65, 8, 106, -47, 25, 5, 13, 12, 80, 102, 40, -45, -37, -89, -49, -14, -67, 89, 103, 66, -56, -26, 92, 33, 58, -52, -78, 30, -47, 21, -116, -57, 17, -44, -32, -104, -57, -46, 4, -127, 37, -34, -42, -102, -72, 6, 126, -21, -94, 42, -18, -62, -77, -21, -14, -79, -34, 10, 2, -3, 27, 22, 9, -38, 5, 68, -73, 86, 20, 44, -34, -26, 88, 10, -12, 63, 32, -89, 39, -7, -56, -6, -7, 6, -81, 43, -127, 37, 65, -89, 22, -74, -57, -3, -13, 86, -4, 83, -38, -85, 18, 26, 12, 4, -128, 43, -1, 25, -41, 26, 75, 53, 18, 0, 13, -8, 35, 43, 0, -17, 3, -77, 75, 47, 119, -31, 9, 34, 26, 39, 64, 65, 47, 60, 4, 65, 14, -101, 10, -25, 102, 116, 76, 104, 33, 98, 28, 16, 23, 21, 60, -15, 53, 112, -3, -42, -19, 27, 12, 106, 16, -33, -4, 101, 48, -9, 42, -19, 22, 48, 48, 65, 43, -42, -127, -79, 28, -30, -9, -28, -26, -34, 54, 5, -47, 24, -41, 105, -27, 8, 85, 10, 52, -9, 22, 18, 25, 99, 59, 22, -86, -53, 20, 24, -77, 63, -6, 6, 41, 122, 60, -37, -2, 17, -21, 107, 15, -62, 7, 87, -12, -1, -68, 65, -71, -47, -100, 33, 120, 17, 6, -25, 116, 0, 39, 27, 19, 0, 47, 83, 37, -12, 2, 83, 89, -70, -81, -21, 28, 16, 25, -36, 48, -21, -15, -6, -84, -22, -44, 53, 44, 58, -27, 34, 118, -3, -106, 85, 71, -1, 111, -44, -29, 127, 9, 81, -103, 11, 31, -125, -10, 53, 19, 111, 30, -34, -84, -43, 2, 36, -2, 122, 61, -96, 126, -34, 125, 18, -41, -35, 6, 51, 38, -16, 39, 33, 49, 42, 38, 11, 30, 46, 9, -54, -17, 30, 8, 4, 16, 95, 23, 28, 100, -29, -22, -29, 41, -2, 93, 55, -58, 40, 6, -84, 1, 20, -46, -3, -26, -33, 51, -101, 51, -15, -20, 54, -78, -90, 31, 47, -89, -49, 1, -29, 1, 24, -11, -30, 16, -6, -15, 17, -57, 43, -33, 80, -93, -3, 31, -124, 21, -66, -94, -6, 104, 72, 27, -40, -85, -99, -57, 9, 7, -31, 1, 17, 24, 13, 29, -76, 88, 27, 50, 12, 56, 75, 102, -55, 20, 77, 25, -7, -3, -21, 84, 1, -102, 56, -5, 14, 24, 29, -82, -17, -80, -44, 80, -19, 53, 23, 23, 72, -9, -14, 35, -72, -10, -74, -27, -13, -53, -51, 37, -34, 62, 63, -42, 18, -95, -118, 25, -23, -14, -33, -22, 63, 20, -22, 15, 18, -33, -124, -110, -36, 7, -20, 115, -23, -8, -33, 53, -2, 49, -15, 18, 95, 12, -18, 103, 42, 7, 15, 17, -1, 26, -34, -6, -13, 26, 27, 19, -67, -9, 122, 32, -34, 18, 8, 37, 98, -7, -20, -54, -33, 59, -27, -44, 25, -15, 6, -108, 2, -9, 46, -20, 47, -17, -76, -10, -88, 11, -21, 40, 26, 13, 57, 72, -56, -31, 121, -127, -24, 60, 24, -23, -13, 61, -43, -25, 14, -65, -36, -13, -2, 120, -12, -46, 88, 127, 20, -21, 3, -24, 43, 38, 102, -28, 101, -116, 16, -20, -22, -66, 19, 89, 93, 123, 23, -111, -6, -45, -69, -46, -42, 21, 54, -73, 73, -13, -21, 88, 51, -19, -18, 78, -12, 8, -4, 50, -82, 1, -35, -86, -31, -25, -55, -3, -63, -17, 11, 32, -69, -29, 22, 6, 37, -46, -6, -62, -50, 74, -87, 43, -41, -84, 55, -43, 7, 12, 52, 29, 25, 58, -19, -1, 34, 5, -106, -62, 50, -77, 28, -11, 2, -16, -52, 3, -50, -2, -20, -90, 13, -92, 36, 11, -21, -78, -19, 24, -20, -12, 28, 9, -19, -6, -123, 35, 61, -47, -34, -3, 12, 31, 17, 17, 101, -35, 47, 16, 45, 48, 0, 15, 16, -11, 2, 40, -34, -92, 42, -78, -25, 0, -42, 35, -126, -126, -6, -83, -128, -48, -105, -29, -10, -74, 11, 27, 26, 42, 1, 12, -24, -14, 0, 110, 29, -16, -29, 59, -92, -35, -91, -26, 0, 11, -1, 42, 54, 2, 15, 23, 42, -23, -54, -29, 1, -120, 31, -16, -51, 71, -32, -72, 51, 31, 40, -6, -13, 14, 37, -8, -71, -20, 76, -17, 41, 28, -23, -119, 1, 107, 5, 43, -13, 117, -41, 8, -26, -14, 33, -18, 57, 60, 7, 5, -11, -39, -32, -2, 15, 41, 98, 111, -44, 46, 44, 20, 88, 18, 62, 17, 107, 16, 5, -4, 40, 15, -19, 9, 58, -77, -40, 119, -54, -35, 45, 75, 12, -45, -32, -3, 72, -41, -21, 6, -5, 2, 106, -40, 41, 62, 57, 8, 24, -60, -44, -61, 104, -48, -34, -58, 62, -20, 6, -60, 40, -29, 117, 76, -56, 22, 15, -1, 112, -1, 23, 42, 57, -53, 75, 26, -11, 35, 78, 85, 0, 19, 17, 3, -29, 20, 28, -54, 6, 5, -11, 45, 34, 37, -13, 2, 15, 13, 9, -28, 32, 8, 27, -1, -63, 42, -33, -2, -19, 4, -127, -15, -52, 38, -5, 35, -26, 44, 13, 1, -39, 73, 17, 24, 33, 103, -56, -41, -1, -28, -40, -81, 21, 10, -2, -79, -88, -42, -3, -44, -63, 81, 16, -42, -71, 37, -14, -27, -127, -6, -108, -94, 19, -71, -80, -12, 65, -9, -7, 92, 8, -125, -36, 2, 47, 0, 19, 8, -65, -58, -60, -1, 17, 33, 46, 78, -103, -127, 63, -3, -65, 16, 13, -10, 16, 0, 27, -8, -104, 2, -17, -44, -24, 41, 37, -4, -124, -4, 18, -109, -125, 41, -7, 11, 29, 17, -42, 24, -120, -70, -123, -26, -25, 14, 66, -12, -38, -106, -29, 45, 5, -6, -11, 31, 6, 13, -85, 44, -15, -2, -3, -39, -4, 4, 8, 78, 51, -47, 19, 3, -63, 22, -34, 28, -13, 22, 15, 23, 5, 1, -87, -122, -66, -14, -10, -1, 19, 40, -40, 2, 24, 13, -23, -27, -125, -3, -12, 9, 18, -4, -12, 8, -8, 66, -2, -13, -27, 20, -38, 33, -24, -20, -11, -6, 11, -9, -3, -30, -1, -16, 23, -60, -19, 16, -33, 21, -34, 9, -2, -33, -43, 21, -39, 1, 54, -24, -24, -22, -30, -1, -9, -27, -8, 14, 40, -5, 10, 4, -30, -6, -21, 34, -34, 52, -12, -6, -47, -95, -34, 43, 6, 31, 32, -38, -23, -27, 42, -22, -118, 19, 34, 23, 5, -50, 22, 25, -19, -40, -17, -2, 26, -15, -69, -126, 10, 33, 23, -7, 13, -9, 26, -42, -62, -74, -9, 8, -47, 38, -82, 38, -4, 11, 57, -10, -12, -66, -25, -10, 24, 4, 16, 1, 41, -18, -96, 18, -11, -13, 103, 11, 17, -3, -76, 19, -81, 110, 18, -46, -51, -53, 19, 3, -36, -31, -13, -32, -44, -37, -70, 43, -128, -11, 35, 2, -58, -33, 20, -62, -105, 11, -70, -77, 44, 125, -15, -25, 18, -60, 69, -96, -125, -4, 95, -69, 13, -30, -43, -53, -61, -6, -8, 60, 5, -75, -125, 5, -12, 45, -101, 111, 11, -98, -17, 39, -85, -7, -46, -56, -37, -97, -45, -37, -16, 80, 64, 110, -74, -30, -34, -24, -95, 2, 4, 56, -71, 39, -39, -14, -46, -22, -124, -115, 8, 19, 69, -11, -70, -68, 120, 95, -100, 112, -103, -70, -35, -128, -97, -71, 29, -72, -123, -48, 10, -36, -51, -8, -8, -26, -15, -26, -5, 34, 6, 38, 13, 67, -14, -35, 28, 21, 127, 6, -28, 41, 20, 8, -48, -33, 1, 28, 9, 15, 48, -48, 88, 91, -19, 54, -22, -80, 35, -37, -2, 7, -44, 18, -67, 36, 50, 21, -60, 26, 26, 34, -29, 8, 28, 2, -10, 19, 26, 43, 36, 0, 116, -24, 12, 13, 1, -33, -7, 0, -4, -13, 3, 8, 4, 32, 23, -72, -70, 42, 54, -16, -21, -48, -38, 22, -46, 22, -40, -1, -64, 0, 40, -27, -26, 9, 12, 35, 59, -48, 46, -18, -25, 13, -66, -14, -55, 57, 24, -67, -15, -15, -38, -84, -11, 1, -45, 19, -60, -49, 24, 38, 22, 53, -52, 20, -1, 53, 82, 19, 43, 13, -32, -56, -51, 56, 16, -36, -33, -53, 7, -22, -20, -14, -34, 11, 24, 22, -21, -127, -51, 15, 47, -20, -49, 22, -56, 40, -44, -20, -2, -65, 9, -2, -27, 22, -1, -12, -9, -17, -55, 89, -76, -16, -10, 37, -35, 0, 4, 16, 52, -10, 23, 39, -25, 9, 51, 79, -6, 21, -18, 10, 64, -37, -33, -48, 24, 78, 15, 17, -34, 81, -35, -82, 32, 110, 59, -126, -25, -124, 11, -55, 20, 63, 100, -10, -123, -69, -6, 5, -74, 26, -14, 16, -12, -13, -115, -76, -70, -124, -19, -81, 40, -96, -66, 62, -32, -79, 28, 59, 12, 31, -53, 119, 74, 26, -17, 44, 81, 100, -19, -25, 41, -11, -103, 48, 41, -8, -26, 4, -112, 53, 31, 28, 50, -73, -9, -127, 1, -84, -109, -35, -80, 9, -38, 42, -105, 89, 32, 94, 68, -73, -8, 53, -32, -2, -8, -127, 101, -2, 43, 110, -13, 43, 27, -4, -55, -12, 81, 52, 114, 30, 66, -67, 107, 88, 44, -63, -14, -92, -27, -58, -16, 82, 98, -26, -9, 0, -108, -82, -11, 23, 26, -22, -2, -82, 93, 89, -67, -31, 5, 34, 36, 32, -49, -53, -81, 86, 43, 34, 11, 59, -46, 4, -60, 14, 12, 30, 34, 14, 29, 10, -34, -105, 32, 122, 7, 63, 24, 43, 55, 34, 61, -26, 70, 9, 8, -3, -40, 28, -42, -35, -3, 53, 35, -9, -49, -26, 39, 61, -48, 64, 81, 18, 78, 27, -3, 0, -66, 108, 40, 28, -45, 57, -17, 44, -56, -12, 18, -93, -43, -7, 32, -38, 55, -17, 121, 71, -27, 39, 36, -13, 26, -27, -13, 52, 30, 3, -26, 11, 21, 52, -7, 127, -5, -84, 62, 47, -93, 89, -90, -8, -18, 40, 21, -86, -10, -47, 28, -48, 69, -76, -66, 55, 28, -87, -11, -53, 38, -29, 13, 103, -79, -126, -39, 82, -87, -6, 18, -54, 65, -24, 61, 0, -60, 34, 43, -5, -15, 36, 25, 26, 60, 18, -28, -16, -9, 60, 36, 13, 34, 57, -43, 7, 82, 53, -7, -24, 33, 63, 49, -79, 110, 34, -11, 94, -80, -43, 102, 22, 3, 30, 78, -60, 127, -126, -48, -15, -20, 63, -98, 27, -60, 5, -7, 9, -39, 55, 20, 43, 32, -57, 34, 41, 20, -2, 53, -6, 2, 26, -105, -41, 21, -14, -84, -9, 57, 14, -63, 36, -62, 8, -45, 92, -56, -1, 23, -17, -45, 42, -30, -14, 60, 17, -5, 87, -42, -18, 73, 5, 12, 6, 11, -2, -7, 13, -19, 40, 16, 87, 12, -76, 48, -18, -37, -105, 86, 4, -43, 20, 35, -53, -25, 49, -31, -5, 71, 57, -127, 51, -49, -10, -30, -41, -9, 15, 16, 40, 17, 13, 0, -3, 1, 43, -76, 5, 98, 20, -4, 26, 53, 19, -65, 40, 47, -58, 79, 15, -19, 80, -28, 117, 50, -28, 11, -32, 28, -27, -72, -13, 9, 22, -53, 13, 8, -29, -37, -34, 46, -68, -18, -126, -89, -87, -36, -19, -2, -45, 16, -3, 1, 17, 4, 3, -72, -62, 51, -48, 3, -87, -23, 13, -117, 17, 24, -76, -42, -18, -128, 25, -95, -45, -17, -48, -112, 106, 12, -97, -23, -18, 45, -42, 25, 65, -67, 84, -67, -110, -7, 64, -8, -75, 83, 10, 49, 121, -82, 125, 52, 82, -49, 20, 79, -3, 86, 60, 14, 35, 33, -46, -39, 85, 53, -17, 4, 59, 12, 111, -14, -29, -23, 57, -24, -37, -125, 86, -58, 82, 77, 30, 67, 1, 113, 77, 49, 72, -35, -90, 3, 106, 5, -85, -21, -87, -76, -40, 32, 4, -76, 1, 13, -70, -23, 4, -29, -12, -28, -18, -75, 22, -100, -77, 17, 87, -56, -25, -13, 13, -20, -37, -39, -75, -56, -1, 44, -25, 24, -12, -27, -35, -59, -122, -15, -42, 53, 0, -38, -28, -8, 75, 13, -78, 36, -110, 30, 19, -50, -14, -127, -22, -69, 34, -25, -12, -6, -7, 49, -15, -36, -19, 54, -55, -22, -117, -103, -36, -26, 37, -41, -112, -17, -28, 15, -11, 6, -58, 3, -39, -74, -58, -60, -22, 25, 0, -24, -99, -22, 28, -58, -71, 35, 29, -9, 16, -20, -34, -45, 31, 77, -94, -70, 19, -11, 112, -26, -11, -39, -19, -58, 57, -41, 41, -93, -35, 39, 22, -38, 80, -33, -91, 13, -7, 5, 11, 23, 0, -43, 127, 27, -38, 18, 12, 127, 11, 13, -88, 18, 47, -19, -17, 15, -125, -34, -14, 32, 15, 59, 126, -36, 39, 16, -124, -85, 14, 5, -5, 32, 50, 114, 54, -82, -26, -30, 31, 32, 54, 3, 4, -1, 24, 27, 0, 100, 89, -4, -16, 18, 0, 22, -35, 35, 10, -6, -79, 6, 17, 26, 0, 13, 42, 1, -21, 49, -67, -110, -7, -25, -8, -30, 57, 17, 5, 50, -7, 62, 14, 49, 9, 3, -1, 8, 41, -11, 16, -23, -23, 31, -12, 44, -127, 27, -35, 6, -126, -55, 0, -4, -14, -126, -123, 26, -86, 11, 40, -4, 82, -105, -44, 23, 38, -119, 23, 8, -95, -48, 6, 81, 14, 113, -32, -5, -48, 105, -59, -30, 55, -126, -24, -30, 11, 0, -24, 50, -87, 14, -21, -55, -90, -27, -126, 10, 2, -7, -10, -24, 14, -19, 10, -14, 12, 3, 14, 20, 29, -50, -10, -28, 6, -67, -107, 35, 63, 84, 56, 37, -109, 36, -2, 77, -34, -48, 87, 7, 21, 66, -18, 112, 49, -59, -5, -99, 27, 33, -16, 18, -35, 36, -39, -124, -36, -56, -64, -50, 8, 88, -102, 38, 57, -68, 35, 127, -45, -6, -36, -17, -2, -111, -22, -124, -38, 44, -28, -75, -43, 58, -21, -29, -110, 46, -107, -83, 121, 46, -14, -50, -83, -73, 120, 7, -41, 0, 13, 31, 2, 43, -63, 39, -68, -110, 41, -88, 10, -17, -23, 57, 79, -43, -15, 45, 33, -73, -56, -63, -32, 83, -32, -16, -45, 55, 59, 19, 80, 3, -11, -110, -29, 115, 85, -29, 125, 3, -25, -9, -68, 126, -43, -19, 16, -28, 60, 18, -3, 28, -21, 77, 8, 45, 72, -29, 32, -1, -27, 112, 4, 69, 30, -26, 55, 44, 13, 35, 40, -41, 5, -74, 38, -71, 30, 74, 11, 54, -25, -34, 54, 87, 34, 8, 20, -2, 13, 2, 10, 46, 40, 95, 33, 2, 6, -55, -36, 9, 49, 40, -52, -21, 108, 10, 32, 14, -13, 40, 6, 114, 63, 16, 62, -31, 57, -18, 6, 6, 72, 9, 4, 38, 25, 49, -21, 66, -7, 11, -12, -23, 81, -48, 51, 125, -14, 80, 9, -19, 39, 49, 92, 9, -13, 64, 43, 56, 98, 0, 7, -67, 15, 118, 63, -48, -46, -73, -19, -4, 88, -7, 3, 1, -8, 82, 29, 35, -31, 30, 30, -23, -9, 57, -51, 71, 33, -37, 76, 11, -69, 42, 117, -27, -34, -15, -13, -56, -90, -50, 82, 104, 98, -33, 10, 37, -69, 2, 7, 23, 10, 99, -66, -12, -54, -54, 8, -36, 4, -33, -30, 9, -72, 26, -53, 35, -42, 27, 18, -36, 41, -35, -22, -14, -6, 22, -69, -111, -10, -12, 55, 47, -54, -72, -21, 28, 13, 29, -43, 33, -62, -6, -20, 29, -17, 31, -92, -9, 36, -28, -49, -25, -121, -91, 27, -31, -17, 45, -80, -37, -16, -34, 17, 28, -48, 68, -51, 30, -23, 8, 17, -16, 23, -25, -9, 114, -21, -18, -122, -81, -17, -28, -42, -86, -107, -79, -60, 7, -35, 15, 44, 4, 38, -124, -37, -84, 31, -8, -23, 10, -76, 8, 44, -123, -50, 45, -47, 59, 34, -1, -9, 24, -65, 41, -73, 9, 94, 5, 53, 20, -9, 28, 7, -16, 68, -24, 6, -5, -35, -38, 43, -100, 29, 13, 35, 41, -59, -7, 28, -24, 38, 94, -85, -85, 97, -125, 78, 46, 90, 70, -77, 47, -12, 2, -97, 24, 88, -18, 14, 32, 97, 65, -22, 27, 63, 25, 11, -13, 52, 43, 65, 32, -9, 63, -13, -93, -61, -33, 30, 66, -5, 100, 12, 21, -7, -62, -41, 8, -26, 31, 36, 54, 6, 52, 106, -82, 38, 27, 26, 26, 26, 54, 19, 43, 6, 29, 125, 93, -49, -6, 127, 33, -10, 26, 90, 75, 0, 106, -40, 3, 43, 52, 52, 48, -58, 34, 0, 58, 38, 44, 57, 31, 91, -1, 80, -72, -45, -39, 25, -75, -52, 12, 30, 47, 2, -15, -36, 67, 89, 36, 21, -22, 25, 18, 16, -25, 7, 90, 10, 17, 18, -60, -9, 37, 84, 59, 2, 16, -27, -77, -1, 43, -31, 23, -46, -34, 127, 117, 127, 82, 27, 18, -7, 46, -71, 87, 35, 46, -85, -60, -2, 11, -72, 32, -56, -105, -77, 51, 53, -46, 21, -42, 17, -12, -69, 19, 7, 58, -43, -104, -68, 5, -3, -29, 27, -126, 88, 0, 127, -118, 52, 57, -10, -33, 41, 12, -28, 5, -5, -57, 23, 21, -18, 34, -48, 28, -125, 120, -59, 25, 108, 71, -33, 80, 38, -46, -12, 46, 6, -68, -44, 116, 106, 20, 93, -127, -56, 124, -105, -96, 122, 34, -57, -27, -67, 29, -124, -90, 120, -88, 29, -118, 8, 33, -90, -64, 6, 43, -45, 14, 127, -47, 40, -26, -79, -81, -3, 2, -51, -4, 12, 23, 66, 37, -118, -7, 7, 100, 13, 8, 85, -85, -92, -123, -111, -124, -2, 15, 45, -57, -58, 10, 82, -24, 46, 30, 127, 80, 41, -9, -64, 33, -7, -4, 10, -21, 44, 15, -22, 26, 59, 31, 28, -20, 18, 81, -50, 0, -69, 43, -18, -23, -85, -28, 86, -62, 35, 20, 106, -10, -74, 97, -17, -68, -40, -24, -78, 4, -116, -56, -86, 78, 34, -94, 49, 5, -97, -94, 62, 23, -13, -83, 53, 10, -12, 54, -27, -8, -16, 49, -38, 20, -43, 107, 9, -64, 22, 18, -53, 10, -7, -57, 33, 3, -127, 59, 7, 7, -57, 49, 14, 7, 29, -22, -82, 86, -63, -1, -10, 0, 29, -25, -72, -69, -51, -124, 20, 49, -32, 35, 11, 4, 29, -109, -44, -67, 51, -45, 120, 7, -51, 96, 11, -1, 12, 45, -40, -50, -46, 8, 49, -9, 10, -37, 69, 50, -45, 22, -12, -38, -19, 38, -13, 7, 82, -112, -16, -31, -69, 72, 0, -58, 31, -8, 110, 20, -118, 77, -27, -61, 40, -18, -32, -55, 33, -39, 25, -49, 16, 0, -9, 9, 7, 48, 63, 99, 41, -2, -30, -32, 35, -34, 5, -71, -45, -50, 10, -13, -58, -24, -31, 48, 13, 17, 44, 3, -7, 44, 63, 120, -55, 99, 2, 68, 9, -5, -122, 61, 29, 27, 3, 37, -56, -3, -43, -11, 53, 10, 54, -66, 54, 34, 39, 2, 29, -80, 55, 13, 29, -55, -6, 124, 2, -39, 29, -126, -44, 25, -46, 39, 88, -55, 126, 10, 97, 83, 48, 25, -111, -41, 70, 4, -88, 33, -34, -29, 28, 103, 101, -50, 13, 79, 13, -64, -10, 6, -37, 4, 37, -11, -10, -6, -11, -32, 56, 45, -18, -10, -87, -100, -22, -38, -79, 23, -118, 14, 27, -22, 14, 32, -34, 16, -78, -66, 4, 16, -62, -20, -18, -23, 57, -4, 10, 62, -39, 37, 71, -1, -77, 4, -128, -69, -70, -117, 104, 52, 21, -21, -16, 6, 17, 5, 2, 64, 72, 16, -92, -73, -109, 23, 2, -38, 9, -111, -10, 4, -82, 18, 100, 29, 47, -19, 100, -94, 21, 106, 68, -3, -112, 58, 13, 47, 55, -119, 7, -11, 102, -61, -30, 85, -34, -73, 48, -116, -31, 49, 17, -1, -37, -30, 68, -120, -66, -96, 126, 65, 69, 104, -19, -88, -73, 30, 89, -75, 0, 29, 103, -81, -56, -68, -58, 26, 8, 8, 40, -8, -3, -33, 38, -15, -13, 125, 13, 24, -25, -17, 25, -6, -43, 6, -14, -47, -73, -67, -83, 25, 19, 32, -97, -15, 15, -4, 126, -46, -6, 42, 32, 48, 13, -55, -6, -33, 12, -81, -56, 85, 100, -48, 39, -25, -98, -2, 47, 108, 87, 121, 32, -114, -34, -13, 12, 97, -47, 1, -10, 13, -115, -23, -30, -15, -85, 15, 23, -15, 82, -16, -8, 4, -31, 9, 102, 105, 2, -33, -10, -63, -89, 51, 75, -12, 0, 28, 100, -78, 95, 47, -90, 74, 113, -19, 54, -58, -21, 20, 116, 29, -17, 55, -62, 46, 27, 13, 37, -4, -123, -118, -68, 33, -52, -1, -108, 62, -46, 0, 21, 13, -35, 77, 23, -12, -51, 50, -33, 113, -65, -104, 18, -26, -49, -58, -3, -29, -19, -59, -45, -45, -3, -61, -12, 120, -39, 54, -10, 74, -61, -57, -13, -43, 18, -6, 6, -34, -18, 28, -54, 16, 36, 65, -57, -3, -22, 71, -40, -13, -110, -9, -52, 35, -85, -19, 10, -5, 1, 3, -34, -122, -36, -28, 26, 2, 45, 36, -76, -105, 123, -77, 3, 26, 83, -16, 17, 7, 16, 37, -46, -67, -40, 33, -52, -14, -11, -11, -53, -63, 28, -6, 35, 53, 62, 71, 47, 70, 19, 4, 23, -70, -65, -33, -37, -19, -38, -125, 108, 35, -36, 8, -28, 17, 4, -73, 19, 4, 5, -52, 5, 44, -25, 14, 13, 27, -127, -69, -94, -62, -22, -26, 86, -37, -25, 51, 29, 7, 15, 47, 105, 49, -12, -44, 3, -108, 23, 60, -11, -95, 20, 37, -15, -68, -44, 127, 17, -19, -55, 44, 26, -14, 22, 36, -84, 23, 10, -46, 68, -9, 121, -7, -12, 29, -11, 61, 2, -14, 28, -30, -102, 23, -105, 0, -35, 18, 8, 15, -4, 11, 33, -26, -89, 11, -14, -5, -112, -8, -28, -43, 34, -10, -35, -30, -37, -57, 14, 25, 45, -77, 28, 4, -50, -4, 87, -24, -97, 14, -36, 53, 31, 18, -37, 16, -51, 11, 41, -87, -53, -98, 1, 37, -30, -53, -29, 33, -4, -40, -67, -13, -52, -56, 8, 60, 35, -25, 44, 2, -6, -1, -31, -27, -41, -26, 8, -43, -2, -3, 1, 24, -31, -6, 9, -126, 2, -48, -33, 48, 6, 3, 32, 29, -50, 28, -31, -17, 27, 41, -122, -90, -41, 9, 86, -22, -89, 20, -61, -33, -21, 62, 41, -86, 3, -42, 14, 25, 48, -125, 9, 25, -2, 9, -66, -11, -98, 2, -65, -4, -14, 6, -2, -66, -83, 38, -22, -13, -21, -8, 41, -125, -24, -43, -100, 72, -52, -43, -4, -1, -54, -59, 11, 96, -20, 48, 20, 60, 13, -15, 57, -30, 11, -50, 121, -116, -31, 19, -32, -4, 9, -111, 12, -84, -106, -54, -59, -67, -24, 10, 22, -25, -12, 16, -123, 15, 7, -8, 14, -21, -45, 63, 47, 3, -14, 6, 100, 86, 40, 39, -23, -9, -127, 24, 20, 15, 41, 69, 13, 2, -36, 25, -18, 11, 23, 27, 51, -74, 8, -69, 12, 61, 74, -14, 34, -7, 14, 1, -5, 2, -28, 46, 63, 56, 6, -42, 34, 81, 18, -70, 6, 20, -26, 108, 11, -31, -1, -46, -29, -38, 22, -9, -33, 43, -67, 71, -20, 30, -114, 62, -1, 97, -40, 23, -99, 5, 11, -38, -55, 70, 9, -48, 9, 54, 23, -24, -48, -120, 67, 27, -49, -55, -11, 88, -36, -4, -10, 80, 14, -65, -2, -72, -46, -91, 99, -23, -78, -39, -84, -11, -104, 27, -73, -12, 26, -1, -103, -10, 2, 69, 43, 105, 19, -82, -45, 33, -26, 41, -38, 119, 16, -62, -34, 10, -10, 20, 38, 87, -67, -26, 91, 30, 113, -11, -28, -48, -93, -120, 43, -88, 71, -80, 7, -21, -1, 17, 50, -26, 55, 125, -35, -40, 0, -44, -15, 33, 5, -83, 7, 64, -49, 19, 56, 32, -25, -27, -15, -5, -16, -19, 66, 9, 114, -126, 12, -47, 15, 43, 18, 28, 52, 34, -50, 11, -11, -29, -43, -14, -84, -39, -25, -75, -101, 111, 21, 33, -44, 90, 14, -36, 31, 29, -31, -17, 22, 17, 48, -93, 30, 42, 30, -86, -79, -12, -98, 49, 68, -53, -69, 53, 124, -29, 65, -89, -35, -1, 37, -5, -111, -38, -76, -28, 6, 24, 47, -61, 19, 12, 23, -49, -18, -77, 18, 33, 11, -17, -35, -16, 78, -32, 48, 62, -69, -78, -18, 72, -122, -29, 3, 11, 6, -17, 3, -74, 51, -10, 29, 21, 46, -31, 49, -1, 22, -69, 8, -2, -74, -29, 29, 25, -29, 13, 20, 37, 9, 1, 16, 10, -20, -13, -13, -24, 37, -11, 42, 35, 36, -12, 24, -33, 43, 65, 64, 25, 23, 9, 27, -124, 1, 92, 16, -4, 23, -5, 17, 5, 42, 32, 12, 53, -3, 41, 1, 37, 32, -11, 23, 37, 80, 21, 127, 29, -12, -102, 127, -21, 9, -9, 33, 41, 16, -4, 33, 57, 29, -55, -60, 11, -33, -25, -26, 35, -2, 116, -6, -52, -31, -3, 14, -63, 13, 73, 76, 25, 5, 29, 8, 17, 50, -27, 88, -96, -68, -67, 5, -56, 28, 25, -88, -11, -19, 35, -78, 27, 11, -37, -21, 2, -11, -43, 78, -93, 34, 27, 5, -21, 34, -48, -11, 86, 4, 20, -18, -6, 39, 15, 14, 40, 36, -40, 46, 127, 12, 3, 1, -14, 33, 40, -3, 16, -58, 71, -38, -1, -103, -22, -16, 35, 10, 127, 59, -38, -67, -29, -126, 58, -11, -4, 14, -85, 22, 75, 10, 4, 19, 78, 32, -31, -33, 127, 7, 4, 48, -20, 13, 94, 45, -10, -9, 7, -55, -6, -43, 23, -58, 76, -1, 4, 21, 7, 65, -20, 70, -7, 4, 38, 104, 22, -44, 7, -8, 12, 9, 65, 31, -6, -1, 29, 36, -126, -45, -25, 32, 45, 3, 7, -28, 4, 29, -80, -34, -64, -3, 0, -63, -65, -11, -6, 38, -119, 53, 17, -24, 19, 4, -53, 85, 27, 26, 45, -51, 5, -126, 17, 32, 22, -52, 2, 7, 22, 60, 74, 74, 38, 53, 13, 4, 44, 32, 49, -46, 95, 70, 68, -50, -128, -10, -79, 125, 26, 37, 24, -51, -12, 52, 27, 13, -16, -4, -2, 16, 2, 33, 10, -12, -5, 25, -40, 5, -31, 31, 2, 60, -93, -23, -118, 34, 3, 18, 12, 11, -38, -7, -35, 6, 18, -37, -99, -68, 5, -103, -117, -108, -114, 43, -115, -72, 46, 2, 50, 4, 37, 8, -51, 10, -68, -29, 18, -63, -80, 34, 36, -49, -110, -28, 3, -40, -125, -9, 74, 10, 20, -25, 37, 74, -29, -25, 66, -34, -48, -27, -35, 0, 30, -26, -121, 6, -123, 14, 11, -49, -13, -102, 18, -23, -98, -1, -8, 67, 52, 8, -27, 33, -57, 7, -126, -13, -47, 12, 22, -109, -68, -34, -94, -122, 20, -63, -18, 8, -124, -61, -32, -40, 117, -12, -7, -36, 16, 89, -24, 71, -46, -122, 12, -101, -38, -70, -57, -39, -116, -60, -125, -35, 37, -114, -14, -127, -77, 2, -50, 115, 9, -79, -22, -74, -13, 103, -79, 18, 11, -123, -26, -4, -1, 8, -63, 124, 36, -32, 41, -99, -17, -18, -124, 7, 122, -127, -23, 20, 41, -19, 106, -41, 7, -125, -21, -126, -24, -26, -8, 26, -126, 125, -34, 33, 111, 46, 50, -20, -79, 6, -127, 97, -13, 52, -32, -43, 2, 18, 17, -126, 35, 8, 67, -123, -127, -103, 3, -71, -32, 29, 6, 22, -110, -68, -6, -9, -44, 58, -121, -127, -13, -50, -54, 22, -25, -78, -7, 39, 104, -108, -94, -127, -36, 7, 5, 3, -124, -17, 18, 42, 1, -22, 19, 55, -99, -125, 38, -19, -38, 17, 5, -23, 7, 87, -125, -127, 7, 7, -121, 16, -60, -9, 7, 33, 18, 30, -62, 19, -125, -112, -2, -14, -25, 60, 1, -30, -124, -22, -65, -125, 64, 79, -19, 9, -26, -127, -56, -84, 122, 63, -2, -16, 26, 6, 35, -33, -21, -84, -44, 72, -55, 52, -34, 66, 32, 17, -37, -7, -41, 113, 1, -20, -58, -59, 68, 29, -125, -56, 42, -92, 3, -6, 19, -24, -11, 61, 39, 48, 30, -3, -51, 15, 2, 11, -17, 3, 52, -7, 51, -11, 62, 30, 21, 71, 68, -27, 19, -32, -11, 40, -1, 11, 13, -10, 65, -39, 119, -114, 43, 19, -74, 62, -45, -54, 37, -28, -120, 26, 63, 26, 58, 9, 20, -5, -12, 14, -5, 126, 16, 72, 40, -44, 52, -24, -7, 46, -114, 101, 0, 15, 37, -112, 37, -46, -76, 6, 70, -25, -24, 75, -43, -29, 76, -63, 93, 33, -24, 2, 2, 72, -5, 57, 73, -31, -36, -103, 34, 10, -25, 36, 20, -10, -36, 6, -83, -3, 13, -18, -73, 66, 46, -31, -51, -41, -32, -17, 45, 41, -14, 30, -121, 10, -39, -66, 15, 10, -77, -2, 43, 11, 28, 3, -77, 52, -26, 47, -75, 73, -4, -110, -111, -20, -66, 27, -8, 17, -3, 66, 22, 54, 21, 0, 68, -126, 85, -27, 82, 11, -25, 2, -109, -60, -11, 35, 12, 3, 77, -43, -3, -68, -30, -53, 21, -21, -75, -8, -54, -11, -53, -16, -88, -7, -19, 14, 52, 12, 27, 18, -103, -128, 7, 1, -33, -7, 15, 32, -1, 90, 8, 41, 106, 18, 2, -11, -41, -93, 10, -18, -48, -12, 54, 10, -4, 21, 72, -18, -125, 10, 54, 0, -5, -66, -17, 57, -126, -4, 29, 19, -5, 80, -34, 13, -125, 78, -81, -125, 76, 26, 3, 25, 22, 3, -5, -18, 46, 39, 84, -18, 38, -110, 58, -128, 72, 39, 12, 5, 16, -47, 23, -58, -40, 13, 59, -32, 24, 3, 7, 83, -9, -67, -1, -2, 9, 16, -55, 69, 50, 26, 20, -47, 3, 83, -77, -21, -17, -7, 30, -27, 14, 71, -8, 47, 99, -66, -12, -93, -59, 20, -43, -24, -93, -19, 64, 4, -58, 5, -42, 21, -122, -41, 19, 2, -33, 126, -15, 3, 88, 3, 77, 48, 61, -8, 78, 7, -47, 37, -63, 57, 36, -31, -9, 26, -46, 17, 55, 10, 47, -46, 6, -106, -123, 5, -97, 63, 40, 36, 23, 2, -15, 17, -65, 51, 12, -18, 29, -22, -6, 46, 10, -50, 29, -67, 58, 82, -20, -95, 15, -41, 57, 29, 0, 7, 29, 27, -90, -49, 49, 29, 1, 38, -13, 3, -32, -32, -46, 32, -38, 9, 41, -7, -55, 87, 93, -18, 55, 11, -21, -104, -5, 45, 7, 62, 7, 35, 11, -30, -33, -10, -30, -13, 14, -9, 72, 127, -37, -16, 32, -57, -37, -12, 5, 58, -66, 0, 59, 18, 116, 31, -53, -28, -8, -5, -74, 67, 39, -62, -77, 48, 25, -12, -5, -8, -6, -36, 8, -53, -63, -22, -18, -5, -36, 25, 26, -89, -106, -84, -40, -45, -77, 47, -97, -64, -30, -51, -23, -75, 9, -31, 6, 33, -32, 31, -126, 13, 25, 4, -102, 40, 45, 47, 24, 71, -55, 126, -125, -27, 9, -127, -93, 29, -23, 20, 24, -123, -58, -20, -10, 5, 2, -67, -14, -23, -88, 113, 16, -81, 20, -14, 38, 124, -11, -9, 127, -127, 32, -36, 38, 93, 9, 14, 16, 28, 28, 97, -28, -58, -14, 88, -128, 0, -121, 23, -2, -125, 0, 28, -127, -42, -87, -12, -33, -21, -30, 125, 7, -30, -53, 46, -56, -121, 34, -27, -64, -73, 5, 70, 8, -18, 7, -17, -89, -47, -75, -30, -9, 7, -10, -55, 50, -63, 78, -71, 45, -1, 15, -11, -35, -10, -55, -35, -41, 28, -75, 127, 119, -9, -84, -74, 47, -23, -10, -40, 29, -59, -20, 124, -124, -118, 9, 1, -22, -21, 127, -35, -55, 110, -113, 79, -4, 41, 4, 25, 22, 56, -69, 14, -31, -108, -21, 5, 14, -82, 6, -1, 21, -92, -52, -48, 19, 37, -75, -3, 63, 55, -28, -51, 8, -54, 55, 15, 46, 50, 35, -3, -9, -27, 2, -1, 66, 56, 18, -16, 12, -19, 61, -5, -26, -37, 63, 58, 59, -62, -11, -127, 6, 7, 40, 114, 18, 7, 1, -123, 17, -20, -76, 113, 122, 6, -56, -88, 34, 5, -21, -101, -71, 77, -41, -106, 67, 31, -128, 7, 11, -126, 31, -58, 69, 16, -123, 44, -17, 61, 0, -8, -11, 28, 28, -37, -94, 28, -10, 48, -34, -93, -11, 14, 7, -92, -78, -45, 22, 67, 14, 113, 5, 23, 40, 27, 31, 57, -82, -1, -44, -29, 24, -31, -70, -87, -100, 79, -122, -73, -46, 37, -68, -128, 65, -128, -126, 14, 85, -46, -61, 20, -16, 48, 35, 30, 52, -15, -12, -83, -89, -97, -60, -8, -36, -65, -56, -112, -128, 113, -56, 22, -57, -84, 14, -5, -26, 6, 2, 47, -1, 72, 19, 47, 31, 3, 0, -116, 24, 20, 64, 46, 28, 33, 126, -58, -9, -16, 61, -127, 17, -125, -80, -34, 57, -74, 21, 73, -37, -2, -32, 13, -34, 31, -28, -121, 25, -84, 48, -120, -107, 39, 87, 32, -104, -105, -119, 81, 23, -112, -90, 102, -11, -50, -15, 14, 55, 20, -31, -16, 6, -11, 39, -8, -4, -29, -31, 56, 47, 26, -7, 7, -25, -4, 13, -43, -42, -27, -13, -26, 47, -11, -18, 3, -2, 10, 10, -39, 12, 70, 108, 88, -10, -45, -69, 23, 79, -30, 12, 24, 29, 80, -32, -85, -21, 10, -20, 39, 74, -39, -54, -43, -18, -37, 14, 59, 55, 44, 44, 30, 30, 86, -96, 33, -7, 2, -73, 35, -12, -36, 13, -29, 28, 31, 19, 75, 42, 79, -12, -30, 124, 11, -41, 31, 0, 9, -47, 74, 25, 16, 19, -16, 63, 21, -77, -25, -43, 60, 36, 13, 38, 53, 22, -45, 53, 39, 15, 9, -43, -88, 42, -67, -2, 34, -62, 16, 26, -4, 9, -57, 54, 17, 10, 3, 60, 23, 15, 72, 37, 0, 2, 12, 74, -91, -40, 8, 5, 69, -37, 0, 18, 21, 33, 33, 77, 20, 31, 52, -9, -33, -13, -46, 17, -26, 33, 22, 10, -49, -27, 8, 19, 17, -54, 27, 7, -29, 5, 25, -19, 98, 11, 37, -112, 125, 63, 17, -37, -10, -75, 31, 6, -24, -22, 2, 49, 11, 39, -87, 53, -65, 0, -25, -93, -29, -32, -33, 2, 32, -34, 13, 51, -9, -46, 27, -53, 7, 16, -40, 8, -121, -58, -58, -12, 91, 8, -15, -18, 51, 4, 23, 36, -125, -24, -10, -55, 13, -36, -18, 40, 56, 26, 24, -8, -64, -106, -73, 20, 23, 17, -23, 110, -12, -30, -62, -1, 21, 34, -62, 5, 66, -26, -78, -7, -3, -7, -39, 6, -43, 59, 68, 60, -10, -78, -53, -57, 60, -83, -112, 25, 16, 12, -6, 7, 13, -29, 107, -19, 44, -5, 46, -124, 67, -80, -30, 49, -1, 5, 20, 19, 34, -3, 2, -18, -19, 123, 14, -67, -19, 44, -10, 24, -106, 2, 26, 6, 67, -16, -56, -89, -128, 96, 14, 38, -19, -81, 52, 32, 0, 60, -12, 60, -5, 89, -23, -30, 2, -39, -7, -63, 73, 17, -40, 63, 22, -24, -18, 37, 8, 33, 7, -30, -123, -19, -1, -2, 38, 55, -86, -44, -7, 28, -19, 1, -19, 36, 6, 48, -11, 4, 81, -36, 80, -37, -12, -79, -19, 15, 8, -8, -14, 59, 30, -42, 5, 14, -92, -118, -25, -43, 20, 9, 34, -21, 93, -32, -45, 58, -121, -49, 126, -1, 52, -53, 15, -19, 27, -68, -23, 45, -9, 39, 57, 5, -117, -34, 10, 7, -61, -18, 10, -44, 21, -77, -76, 103, -25, -43, -36, 86, 44, 47, 27, 23, 0, -77, -46, -12, 63, -111, -17, -16, 34, -46, -17, 14, 98, 15, 126, -95, -45, 0, -67, -78, -5, -24, -9, 2, -11, -6, -96, 73, -55, -19, -32, -7, -69, 0, 23, -24, 58, -19, -6, 101, -22, 24, -21, 57, -51, 100, -7, -4, -11, -128, -13, 28, 28, 18, -56, 36, -7, -89, -63, -8, 34, 52, -14, 23, 5, -85, -10, 47, 50, 8, -126, 78, 43, -9, 36, 1, 27, 8, -114, -3, -72, -31, 34, 12, 54, -30, 20, 101, 1, 78, -121, 34, -64, 14, -106, -42, -33, 36, -5, 15, 40, -25, 56, -21, -42, -53, 29, 25, -51, -108, 33, -8, -41, 51, -60, -60, 8, -45, -92, 0, -127, -39, -53, -7, 17, -90, -15, -34, -126, 81, -127, 49, 1, 96, 8, 59, 7, -58, -125, 121, 63, 49, 7, 42, 9, 23, -11, -45, -125, 17, -32, 1, -22, -5, 78, 18, -40, -45, 19, -3, 85, 62, 24, -39, 4, 24, 22, -7, 2, 117, -81, -15, -31, -38, 50, 5, -41, 40, 21, 29, -56, -62, 8, 6, 32, -6, -19, 71, -10, -12, 28, 25, 10, -92, 23, -8, -76, 26, 33, 86, -23, -22, -56, -108, 15, 68, 123, -12, 59, 124, 46, 40, 124, 24, 35, 17, -29, 29, 77, 2, 35, -48, -23, 3, -43, 102, 69, 47, 0, -93, 44, 13, -15, -8, 10, -29, 28, -60, -12, 48, -26, 47, 22, 55, -80, -64, -29, -11, -25, -41, 68, -52, -10, -42, 46, -53, 46, 27, -38, 90, -100, -34, -80, -30, -124, 8, -8, 2, -6, 41, -64, 19, -37, 5, -52, -55, -18, -5, -39, -96, -29, 5, 125, 2, 28, 16, 117, -14, 80, -69, -61, -55, -117, 99, -32, -39, 41, 35, 9, -83, 87, -86, -125, -36, 28, -126, 8, -77, 127, 12, -21, 65, -78, -11, 24, -45, -24, -94, 71, -50, 33, -25, -3, -40, -39, 12, -92, -122, 37, 120, -6, 52, -48, 12, -12, 65, -127, 78, -14, 15, -88, 38, -15, -34, 8, 31, -125, -18, -93, 30, -43, 3, 78, 18, 25, -29, -47, 25, 39, 7, -121, -13, -118, 24, -59, -17, 3, -6, 36, -37, -7, 20, -51, 54, -74, -19, -6, -51, 17, -125, 30, 15, -4, 88, 69, 5, 15, -58, -114, 54, 30, -73, 8, 9, -32, -44, 14, -3, -27, -20, 11, 10, 122, 85, 32, -48, 12, 40, 34, 13, -21, 99, 11, 70, -77, 5, 82, -37, 54, -89, -45, -126, -61, 12, -63, 8, 35, -7, 10, -51, 24, -25, -12, 10, -7, -35, 44, 84, -47, -80, 14, 93, 6, 11, 51, 60, 48, 30, 7, -71, 6, 10, 0, -10, -5, -52, -3, -48, 30, 30, 18, 70, -17, 43, 44, -126, 33, 120, 53, 47, -18, 22, 52, -35, 93, 47, -27, 85, 0, -17, 0, -13, 53, -2, 28, 65, 17, 23, 121, -5, 45, 50, 44, -4, 34, 7, 32, 76, 12, 35, 46, 30, 50, -35, 46, -42, 28, 8, -36, -32, 2, 41, -40, 1, 0, -4, 14, -41, 74, 88, 33, 17, 71, 40, -20, -17, 32, -27, -41, -48, 6, -56, 80, 42, -31, 33, 44, -1, -98, -23, -61, -15, -4, 67, -36, 67, -37, -66, 50, -126, -18, 24, -128, -55, -30, -12, -10, -9, -48, 45, -118, -11, -29, -19, 57, -9, 32, -23, 18, 126, 65, -11, 4, 2, 17, 14, 18, 22, 23, 31, 9, -15, -74, 34, -27, -20, 44, 125, -28, -19, -107, 11, -88, -14, -39, -8, 11, -74, -37, 22, 15, -50, 34, 14, 12, -24, -3, 107, 43, -8, -17, -42, 69, 31, 31, -30, 14, 17, -65, 100, -34, -4, -28, 28, -69, 90, 14, -18, -23, 27, -4, -27, 26, -76, -64, 9, -78, -36, -4, -101, -3, 47, 13, -122, 32, 7, -64, 30, -69, -50, -98, -12, -59, -26, 14, 26, -40, -126, 42, -51, 33, -26, -46, -32, -34, 17, -12, -89, -9, 32, -25, 15, 24, -3, -4, -18, -39, -24, 16, -43, -41, -52, 40, 2, -40, -14, -64, -3, 0, 18, 125, 42, 14, -35, 19, -101, -24, 15, 12, -12, 1, 7, -41, 9, 26, -14, 118, 19, -36, 32, -18, -43, -11, 22, 11, 26, -1, 2, -12, -39, -54, -5, 15, 32, -29, 55, -22, -78, -27, -44, -120, 1, -5, -67, 12, -13, -46, -81, -14, 64, -16, -70, -24, -23, 55, -3, 31, -31, 12, 26, 33, 12, 16, 46, 71, -27, 64, 6, 24, 45, -69, -33, 27, 41, 16, -34, 23, 7, -11, 1, -12, 126, 51, -18, 15, -75, 10, -66, 1, -7, -13, -42, -25, -37, -3, 16, -22, 63, 54, 37, -67, -42, 37, -81, -37, -9, -73, -39, -127, -15, 27, 127, -37, 40, -12, 2, -10, 5, -69, -16, 38, 24, 97, 116, -33, -17, 10, -58, 4, -67, 90, -45, 13, -126, 43, 22, -22, 49, -65, -46, -54, 2, -39, -62, -32, -15, -42, -105, -28, 68, 43, 9, -23, -26, -113, -104, -46, -67, -18, 3, 51, 8, -50, -2, -33, -15, -22, 54, 7, -63, -19, -128, 47, -93, 13, -13, 36, -98, 49, 20, -13, -9, 11, -44, -35, -106, -37, -38, -32, -47, 42, 24, -45, -115, 79, 25, -5, 16, 36, -87, -45, 73, -4, -53, -66, -11, 15, 0, 52, -55, -44, 37, -3, 23, -35, 13, -50, 22, 9, -5, -75, -46, 23, -20, 34, 17, 35, 30, -5, 9, -106, 2, -39, 46, 1, 0, 30, -51, -16, -125, -83, -4, -3, -127, -10, 90, 46, -19, 33, -48, -14, 62, -54, -104, 0, 7, -13, -5, 7, 14, -70, 27, 27, -4, 1, -84, -45, 30, -6, -71, 14, 31, -110, 44, 37, 35, 31, -56, -122, -60, 6, -1, -28, -89, 24, 30, 13, -2, -28, -108, -40, -12, -126, -126, 24, -94, 49, 46, -20, -89, -123, 62, 23, -125, -67, -20, 19, 38, 37, 54, 59, 92, -127, 107, -62, 90, -9, 24, 8, -8, -40, -32, -33, -23, -78, 0, -76, 28, -27, 12, 24, -110, -34, 105, 38, 3, 36, -51, -28, -8, 38, 15, -3, 117, 45, -44, 45, 104, 94, 11, -53, 64, 41, 7, -7, -8, -39, -44, 89, 69, 29, -54, -55, -16, 15, -54, -5, -14, 12, -67, 12, 20, -47, -12, 42, -35, 38, 25, 11, 21, -11, -21, -20, -1, 6, -51, 9, -48, -53, 40, -41, -113, -42, 57, 22, 39, 61, -43, -2, 47, -29, -101, -58, 16, 21, 1, -29, -8, 21, -24, 4, -20, 23, -30, 0, 18, 125, 20, 63, 25, 21, 127, -21, -20, -55, -14, -98, 81, 3, 37, 58, -33, -36, -5, -13, -124, -43, 127, -11, -15, -48, 122, -111, -11, -15, 28, -42, 33, -127, 100, -72, -13, 127, -54, -3, 79, 2, -42, 38, 16, 8, -62, -19, 36, 19, 39, 78, -7, 121, -66, 11, -36, 47, 83, -69, -23, 34, -79, -62, 39, -56, 73, -40, -87, 89, -96, 68, 101, -65, 25, -32, 26, -8, -25, -61, -82, -9, -89, -28, -66, 126, 73, -15, -31, 36, 40, -38, -9, 9, 35, 16, 16, -44, 38, -73, -14, -5, -26, 92, -114, 63, 32, 22, 79, -30, -11, 77, 109, 66, 95, 27, -22, 14, -97, -22, -51, 15, 41, -81, -10, 0, -44, 12, 58, -44, 23, -32, 5, 106, 10, -3, -43, -13, -118, 57, -51, -88, 21, -12, 17, -81, 4, -20, 31, 18, -24, -2, -121, 20, -5, 66, 20, 62, 4, -45, 14, 61, -36, -27, -26, -14, 20, 123, 35, -9, -31, -96, 11, -55, -60, -52, -117, 32, -127, -45, -36, -10, 12, 87, -101, -38, -30, -106, -50, -33, -5, 1, -9, -7, 0, -32, 15, -12, -10, -25, 110, 5, -19, 1, -57, 83, 93, 8, 19, -3, 29, 5, 49, 26, 7, -7, 40, -12, -24, 63, 30, 11, -49, 2, 24, -7, 21, -34, 31, 12, 25, 39, 9, 46, 39, 21, 11, -28, 20, -5, 8, 10, 6, -28, 56, 8, -2, -7, -3, 11, 3, -5, -5, -9, -41, 15, 18, -24, 9, 10, 0, -16, 30, -32, 23, 17, 117, 43, -52, 1, 12, 11, 9, -10, 0, 11, -5, -20, 3, -33, 0, 19, 101, 69, 34, 0, 29, 11, -4, 126, 31, -95, -12, -27, -80, -38, -85, -96, -7, 68, -126, 16, 84, -8, -47, 33, -35, 54, -23, -12, 57, -40, -23, 43, 71, 40, 49, -40, 37, 15, -6, -46, -60, 25, -34, 49, -3, 29, 10, 38, -7, 21, 94, -6, 11, -16, 71, 3, -13, 32, -6, 93, -103, 56, 49, -7, -2, -22, 18, -36, 8, 49, 0, 21, -48, -3, 55, 94, -85, -24, -26, -22, -81, -44, 51, 6, 3, -24, 86, 83, -14, 68, -40, -19, 41, 2, 51, 37, -100, 59, 98, 61, 6, 37, -59, -13, 10, 126, 49, 29, -18, -123, -128, -46, 46, -125, -126, -1, 88, -101, -50, 70, 11, 41, -127, -16, -79, 81, -38, 5, -125, -8, 47, 51, 66, -82, 47, 91, 28, 57, -15, 86, -94, -43, -47, 32, -8, -63, 82, 19, -73, -25, 47, 55, 46, 45, -93, -82, -123, 36, -12, 16, 14, -106, 25, 26, -36, -57, -15, -10, -67, 123, 93, -33, 58, -5, -80, 53, -94, -53, -22, 58, -11, -1, 67, -36, 125, 40, 11, 62, 79, -123, 33, -121, 2, -114, 6, 50, -17, 26, -35, 19, -6, -85, 28, -1, -21, 17, 45, 125, 71, -29, -59, 16, 41, -63, 13, 7, 65, -36, -52, -51, 68, -44, 30, 24, -3, -4, -46, 63, 19, 58, -78, 34, 8, 94, 69, -29, -51, -1, 28, -99, 39, 19, -14, -4, -92, 38, -5, -21, 104, 13, 13, -81, -29, 29, -54, -83, 91, -16, -2, 15, 0, -5, 33, 9, 35, 4, 13, 21, -113, 0, -21, 25, -26, -89, 96, 34, -7, 27, -12, -27, 16, -33, 7, -6, -1, 24, 43, 33, 9, 45, 87, 25, 54, 40, -53, -122, -42, 55, 98, 23, 83, -5, 5, 73, -65, -110, 29, 12, -127, -3, 63, -64, 0, 14, 16, 36, 38, -44, 37, -84, -74, -7, -5, -41, -95, -119, 14, 66, -18, 120, -17, -40, -58, 2, 44, -26, 86, -11, 40, 59, 52, -20, 24, 11, -18, -68, -9, -126, -7, 62, 120, 79, 31, 69, -20, -53, 42, 86, 32, -52, 12, 32, 64, 74, -39, -66, 67, -4, 35, -51, -50, 50, 8, 69, -112, 104, 51, 53, 15, 1, 55, 88, 34, -100, -21, -25, -117, -91, -4, -125, -1, 1, 48, -29, -13, -20, 7, 29, -61, -24, 26, 9, 73, -23, -128, -61, -79, -17, -21, 17, -7, -23, -70, -18, 97, -30, 15, -28, 56, -41, -126, 21, 27, 122, -13, 41, -86, -109, 12, 35, 46, -57, 2, -47, 1, 7, 63, -53, 98, 51, -50, -7, -10, -37, 8, 6, -110, 15, 42, 24, -34, 117, -4, 50, 14, 17, -37, 58, -46, 6, 115, -31, -113, -40, 104, -47, -5, 118, 19, 30, -78, -22, -126, 27, -3, 54, -63, -65, 21, -7, -45, -39, -10, -35, 2, -3, 53, 5, -119, -26, -66, -6, -46, 43, -66, -2, -20, -27, -10, 27, -34, 29, -21, -7, -103, 4, -26, -5, 17, 52, -128, -28, -13, -1, 52, -38, 67, -24, -41, -121, 65, 32, 84, -24, -112, 13, 106, -105, -9, -66, -18, -28, -52, 78, -58, -33, 2, -18, 17, -33, -21, -30, 93, -28, -116, 80, -84, -51, -21, -1, -15, -4, 24, -34, 50, -44, -54, 61, -79, -41, 15, -48, -125, -29, -84, 93, 17, 1, -123, 106, -123, -17, 84, 0, 126, -34, -30, -81, 61, -96, 13, 71, -40, -122, -19, 22, -89, -25, -119, 57, -5, -98, 112, -71, 95, -94, -59, 74, 103, -12, 39, -61, -8, -125, 15, 7, -69, -17, -119, -11, 69, -81, -17, 124, 43, 33, -127, -103, -88, 81, 56, -10, 1, -98, -97, -73, -71, -42, 17, 73, -33, -123, -46, -80, 9, 91, 126, -127, -21, -115, -110, 93, -126, -24, -53, -119, -103, -117, -9, -28, 39, -11, -59, -103, 0, 53, 1, 59, 27, -86, -88, 95, 24, 51, 114, -6, 81, 107, 70, -80, -95, -34, -24, 20, 18, 7, 31, -121, 72, -64, 101, 5, -28, -94, -121, 14, 19, 45, 23, -86, -34, -19, 5, -61, 73, -82, -11, 28, 10, 23, -46, 26, 108, 16, 5, -16, 32, -32, -81, 76, -18, -19, -44, 13, -53, -97, 37, 36, 21, -62, 9, 9, 82, -65, -92, -61, -128, 73, 33, -12, -126, -41, -3, 6, 63, -97, -127, -91, 31, -18, -3, 91, -65, 27, 21, 57, -43, -40, 99, -62, 22, -6, -51, 127, 82, -14, -114, -31, 39, 39, -88, -17, -24, -10, -22, -113, -36, 3, -67, -76, 47, 50, 85, -22, 22, 10, 60, -2, 34, 0, -25, 22, -52, 48, 79, 48, -3, 17, -27, -6, 6, -17, 125, -12, 65, 1, -12, 35, 30, 91, 14, 88, -13, 26, 36, -17, 20, 9, -23, 37, 112, 25, 31, 56, -7, 118, -78, 11, -13, 84, 41, 1, 46, 114, 123, 35, 40, 39, 18, 12, 116, -13, -13, -7, 64, -128, -22, 15, -27, 11, 53, -13, -31, 13, 51, 74, -21, -26, 81, -56, -4, 5, 24, -41, 20, 22, 18, -8, 70, 4, -14, -2, 17, 17, 71, -30, -128, 20, 20, 3, 40, -5, -35, 123, -23, 28, 21, -6, -34, -5, 41, -33, -18, 3, -5, -44, -46, 37, 37, 0, 14, 39, -69, 50, 18, -31, 39, 43, -51, 5, 6, 19, -21, 40, -9, -5, 41, 3, 76, 4, 10, -41, -49, -43, -47, -66, -74, 53, -77, 109, 51, 62, -19, 1, 33, 31, -18, -107, -39, -72, 20, 21, -32, -35, 42, -8, -2, 10, -2, 1, 31, 9, 69, 24, 55, -60, 11, -14, -11, -69, -63, 0, 107, 10, -61, 77, 57, 34, 38, 21, -55, -29, -126, 18, -54, -94, -61, -41, 0, 20, 45, -21, -2, -52, -47, 71, 12, 11, -11, 33, 117, 14, -64, -4, -112, -21, 27, -46, 16, 25, 41, 36, -35, 45, -2, -24, -35, 10, -4, 24, 18, 57, -126, 17, 21, -13, 31, -125, -1, -3, -8, -70, 22, -124, 1, -50, 75, 87, 60, 83, 27, -42, 21, 9, -3, -45, -40, -24, 8, -6, -11, -3, -126, -15, -8, -75, -80, -124, -70, 40, 48, 19, 29, -2, 25, -121, -23, 4, -12, 90, 49, -40, 20, -13, 3, -123, 10, -59, -21, -25, -60, -10, 56, -5, 8, 24, 18, 4, 15, 33, 77, 4, 1, 8, -126, 23, 27, 34, 3, 51, 66, -14, 50, 51, 108, -40, -2, -39, 10, 46, 60, 28, 5, 72, 11, -64, -82, 31, -52, -3, -29, 32, 63, -24, 44, 35, 8, -8, 25, -25, 6, 58, 41, 55, -24, -33, -7, -8, -16, -36, -59, 6, 56, -68, 32, 16, -14, 26, -19, 26, -41, -77, 41, 0, -20, -21, 15, -49, -27, 7, 34, 41, 17, 14, 20, 62, 95, 40, -4, 65, 28, -11, -28, 27, -43, 85, -12, 2, -11, -13, -5, 38, 4, -87, 126, 44, -12, 3, 30, -89, 124, 24, -16, 35, -30, -39, 0, -116, 122, 33, -8, -31, 80, -29, -12, -55, -17, 18, 58, 15, 34, -123, 19, 4, -51, 48, 7, -127, -89, 127, 39, -86, -19, 46, 127, -52, 68, 3, -7, 9, -126, -13, -49, -45, 8, -20, -126, 42, -72, 127, -15, -2, 42, -33, 53, -34, 10, -128, 13, -78, -60, -65, 52, -35, 36, 39, -30, 55, -64, -81, 32, 41, 38, -17, -53, -65, 95, -115, 22, -52, 10, 64, -60, -9, -45, -21, 24, -22, -25, -31, 64, 127, -47, -33, 10, 98, 62, 30, 17, 19, -46, 36, -67, -74, 75, -19, 56, 2, 11, 28, 127, -57, -52, -110, -44, -20, 106, -30, 49, 52, -1, 43, 38, -32, 41, -13, -2, -38, -12, -3, -17, -36, 42, -6, -22, -17, -74, -30, 95, 18, 23, 14, 17, -21, 34, 72, 24, 2, -37, -49, -36, -34, 3, -126, -65, -37, -24, -56, 14, 75, 28, 0, 41, -80, -13, -90, -33, 39, 31, -14, -1, 15, 19, 63, -9, 45, 3, -122, 48, -35, -38, 25, 22, 18, -27, 4, 1, -11, -43, -101, -24, -2, 13, 64, 42, -45, -20, -1, -6, 29, 0, 10, -5, 14, 98, -1, -18, 9, 44, -19, -24, -36, -12, -42, -31, -28, 125, -21, -17, -12, -12, 25, -21, 8, -6, 30, 39, -13, -24, 25, 36, 48, -12, 31, 53, -23, -57, -27, -53, -5, -18, 12, 1, -13, -28, 8, -48, -64, 25, -12, -27, 66, -28, 2, 12, -12, -8, -88, -16, -48, -61, 12, 77, 41, -50, 7, -18, 12, 1, 2, 25, 80, 6, -63, -50, 29, 127, 37, -30, -102, 35, 39, -7, -26, -27, -81, -4, -1, -7, -48, -28, 29, 37, 19, 49, -23, 19, -2, 15, -20, -7, -1, 45, 33, -54, -2, 26, 23, 26, -101, -45, -32, 39, -24, -18, -9, -7, 34, 75, 5, 15, 39, 19, 7, 34, 53, -13, -10, 11, 38, -29, -27, -1, -104, -55, -10, 27, -9, -2, 6, -14, 13, 29, -28, -21, 13, -1, 38, -25, 32, -31, -50, 52, -34, -19, -39, 12, -29, -110, 10, -74, 47, 60, -6, -2, 22, 4, -42, -55, 41, -66, 88, -15, 123, 26, -7, 20, 20, 28, 35, 69, 5, -64, -21, 36, 26, 78, 122, -6, 54, -44, 51, -7, 118, 60, 109, 12, -29, 36, 27, -50, 50, -37, 10, 56, -126, 107, 56, -8, 81, -101, 29, 21, -25, 15, 68, 81, -98, -28, -46, -61, 12, 87, 96, 2, 4, 57, -123, 25, 12, 41, -5, -32, 78, 123, 28, 59, 58, -85, 16, -13, 60, -115, -23, 50, 127, -83, 39, 94, -50, -96, -97, -17, 91, -28, 11, -127, -63, -25, -92, -106, 89, 78, -11, -27, -22, 8, 13, 26, 53, 25, 19, 93, 49, -21, -10, 0, 37, 59, -6, -34, -22, 13, 80, 35, 0, 30, 89, 64, -17, -25, 16, 73, -32, -47, 92, 31, -32, 82, 3, 44, -22, 3, 44, 1, 1, 10, 22, 13, 9, -18, 20, -2, -15, 41, -1, 33, 18, 22, 51, 6, -16, -41, 17, -5, -43, 78, 25, 45, 66, -15, 0, 14, 3, 51, -36, 24, -13, -7, -15, -4, -11, 28, 29, 11, -20, -3, 54, 14, -9, -127, 8, 12, 61, 9, 28, 55, 0, 9, 13, -61, 28, 40, 39, -49, -32, -20, 9, -16, 59, -15, -21, 5, -39, 28, -33, -26, 51, 4, -10, -19, 27, -31, -4, -34, 74, 3, 16, 104, 2, 121, 23, -27, -1, 6, -32, -15, -28, -32, -14, 65, 100, -2, 5, -4, -8, 55, 67, 10, 6, 10, -9, -39, -78, 42, 35, 9, 24, -24, 50, -7, 44, -37, 4, 0, 14, 45, -29, 33, 21, 54, -3, 20, 46, 20, -34, 33, -71, -32, 8, -24, 8, -29, -19, -7, 116, -27, 52, -9, 26, 121, 54, -86, -5, -66, 44, -40, 56, -21, -38, -24, -42, 2, -20, -11, 23, -8, -7, -101, -44, 15, 38, 60, -15, -3, -4, 50, -12, -91, 10, -49, 7, 31, 30, -61, -55, 20, -100, 17, 13, -57, 32, 88, -62, 56, -23, -9, -8, 3, 26, 4, 2, 9, 70, 11, 36, -30, -126, -55, 71, 28, 47, 94, 44, -8, 20, -3, 6, 18, 56, 124, 78, 1, 19, -57, -19, -121, 42, 54, -51, -12, -39, -44, -16, -80, -77, 31, 16, -13, -76, 29, -2, 1, -47, -4, 59, 79, -10, 22, -35, 69, -50, 7, -17, 64, -58 }; static const rnn_weight denoise_gru_bias[288] = { -41, -76, -24, -96, 25, 117, -55, 54, -73, -28, 53, -79, 20, -8, -87, 28, 44, 38, -66, -19, -45, 25, 119, 78, 54, -92, 31, 13, -3, -13, -28, -67, 3, 31, 54, -48, -16, -97, -12, 2, -117, -48, -24, 56, 18, 115, -59, 126, -30, 6, 16, -126, -11, -6, 15, -67, 33, -113, 59, -12, 126, -3, 61, 58, -71, -4, 42, 41, -48, 11, -33, 50, 43, 4, 0, 15, -46, -16, 23, -18, 8, -30, 13, 66, 77, -6, 34, 103, 40, 50, 39, 72, -10, 22, -16, 24, 1, 127, -9, -48, -55, -27, 36, -16, 90, 4, 12, -17, 59, 23, -34, 20, -84, 19, 41, 121, 116, 111, -10, -127, 41, 44, 4, 34, -1, 20, -11, 2, 127, -127, 44, 16, 21, 126, 66, 125, 126, 78, 25, 45, 72, 3, 123, 40, 105, -62, 25, -105, 44, 33, 13, -51, 119, 126, 126, 53, 0, -88, -32, -27, -33, -18, 11, 1, 27, -62, -6, -57, 71, 46, 21, -7, -6, -55, 127, 30, -41, -6, -21, -21, -38, 87, -16, 34, 44, -126, -112, -30, 61, -17, 115, 1, -39, 19, -43, 76, -64, 48, -13, 11, 73, 71, 93, 104, 23, 10, 63, 34, -7, 126, 57, 3, 127, 15, -71, -126, -25, 125, 7, 7, 39, -18, -27, 126, 95, -127, -95, 36, -4, 125, 37, 72, 127, -29, 69, 84, 99, 39, 127, 40, -127, -92, 0, 127, -14, 70, 39, -98, 25, 127, -54, 48, 47, 19, -21, 93, 61, 127, 3, -62, 127, -75, 24, -3, -18, 102, 40, -6, -14, -36, -41, 46, 89, -17, 29, -55, 7, -10, -59, 22, -21, 25, 18, -58, 25, 126, -84, 127 }; const GRULayer denoise_gru = { denoise_gru_bias, denoise_gru_weights, denoise_gru_recurrent_weights, 114, 96, ACTIVATION_RELU }; static const rnn_weight denoise_output_weights[2112] = { 24, 90, 127, 108, 73, 38, 24, 13, 4, 16, 41, 51, 46, 35, 24, 14, 19, 23, 27, 23, 11, 10, 14, -1, 20, 67, 122, 95, 44, 11, 4, 5, 8, 15, 19, 17, 11, 5, 1, -2, -1, 5, 5, 1, 28, 2, -25, -16, -83, -45, 4, 36, 29, 24, 20, 12, -1, -2, 4, 13, 17, 18, 21, 22, 20, 11, -11, -26, -15, -21, -18, -15, -22, -22, -18, -22, -25, -20, -24, -25, -19, -21, -22, -16, -18, -24, -22, -7, 6, 26, 25, 7, 12, 17, 11, 4, 11, 11, 1, 1, 6, 14, 19, 11, 13, 29, 37, 14, -16, -45, -3, -8, -17, -22, -19, -11, -19, -21, -22, -24, -25, -20, -19, -14, -7, -5, -3, -1, 0, 1, 14, 13, 10, -12, 27, 5, -33, 11, 51, 26, -23, -22, -11, -8, -4, -8, -21, -32, -41, -45, -43, -39, -34, -16, -3, 2, -7, -10, -16, -12, -12, -8, -4, 1, 24, 53, 81, 98, 99, 80, 60, 54, 49, 38, 16, 5, 0, 15, 5, 14, 11, 12, 3, 7, 16, 19, 17, 10, 6, 1, -11, -11, -18, -26, -31, -26, -17, -14, -2, -15, -23, -27, -28, -31, -25, -29, -36, -37, -26, -22, -17, -15, -18, -17, -14, -14, -9, -9, 1, 4, 1, -6, -29, -23, -21, -14, -24, -24, -20, -21, -16, -13, -14, -15, -12, -16, -13, -10, -10, -7, 4, 18, -8, -11, -24, -12, -6, -10, -14, -21, -21, -20, -15, -22, -53, -65, -58, -43, -27, -31, -38, -45, -48, 0, -5, -8, -4, 2, 10, 12, 12, 6, 12, 21, 25, 22, 23, 23, 26, 38, 44, 41, 38, 36, 24, 18, -21, -31, -28, -37, -20, -5, -4, -15, -14, -16, -21, -21, -9, -10, -8, 0, -5, 4, 20, 14, 15, 47, 26, 26, 25, 5, 3, 8, 17, 17, 10, 14, 14, 4, 0, 5, 6, 12, 12, 11, 14, 28, 47, 62, 8, 8, -7, 2, 2, 2, -5, -4, 2, 2, -4, -5, -11, -22, -34, -46, -53, -55, -45, -39, -35, -43, -15, -7, 24, 40, 50, 55, 62, 63, 60, 58, 50, 48, 46, 47, 45, 40, 30, 20, 12, 7, 3, 4, -9, 2, -13, -9, -13, -15, -20, -17, -19, -32, -45, -54, -65, -67, -63, -62, -48, -24, -11, 5, 11, -38, -5, -7, -8, -12, -17, -15, -11, -7, -8, -12, -10, -11, -14, -13, -14, -17, -7, 12, 24, 15, -11, -79, -1, 14, -8, 26, 14, 13, 13, 6, -16, -16, 10, 28, 16, 5, -1, -1, 5, 9, 7, 6, 8, 14, -10, -7, -2, -1, -9, -18, -20, -18, -13, -11, -14, -20, -29, -37, -46, -46, -48, -54, -56, -72, -83, 11, 0, 11, 37, 45, 52, 80, 118, 96, 33, -10, -13, -10, 4, 7, -6, -3, 5, 3, -2, -9, -9, -7, -4, -3, 12, 13, 17, 24, 20, 16, 10, 11, 15, 17, 11, 3, 1, -1, -6, -9, -5, -14, -21, -16, 8, 1, -10, 5, -3, -51, -14, -10, -28, -27, -21, -14, -4, -3, -6, 1, 5, 4, 5, 13, 11, -1, -3, 5, 11, 30, 37, 34, 31, 27, 24, 24, 29, 34, 28, 25, 29, 27, 29, 30, 36, 38, 38, 8, -17, -18, -41, -58, -45, -39, -51, -52, -40, -47, -60, -52, -38, -25, -27, -36, -43, -33, -19, -3, 1, -3, 3, 1, 6, 14, 12, 9, 6, 3, 8, 13, 10, 8, 15, 31, 46, 69, 82, 81, 76, 67, 42, 15, 14, 28, 21, 36, 42, 27, 28, 26, 20, 11, 7, 4, 7, 6, 7, 20, 26, 17, 12, 1, -13, -22, -16, -23, -16, -9, -11, -10, -12, -10, -5, -6, -8, -6, -3, -2, 9, 10, 7, 7, 9, 22, 34, 25, -5, -8, -3, 2, -14, -7, -2, 1, 7, 33, 56, 59, 58, 42, 2, -11, -10, -11, -10, -12, -10, -4, 9, 14, 21, 11, 9, 6, 7, 8, 13, 16, 18, 22, 26, 30, 30, 30, 26, 18, 9, 5, 2, 3, -18, -29, -57, -45, -39, -45, -35, -19, -7, -6, -2, -4, -11, -13, -1, 0, -6, -22, -47, -50, -18, 12, -13, -19, -45, -41, -43, -38, -34, -31, -31, -21, -13, -10, -13, -13, -9, -8, -9, -9, -6, -4, -4, 2, -9, -18, -6, 2, 0, 5, 8, 5, 5, 7, 8, 7, 6, 2, -5, -6, -2, 3, 3, -8, -14, -1, 45, 35, 41, 21, 32, 31, 20, 17, 22, 20, 19, 16, 10, 4, 11, 15, 6, 4, 13, 4, -7, -18, 7, -26, -11, 9, -12, -28, -34, -16, -2, -8, -20, -20, -27, -10, 2, 4, 9, 1, -4, 4, 9, -1, 84, 95, 23, 17, 19, 21, 17, 25, 32, 23, 8, 2, 5, 9, 13, 17, 16, 16, 16, 18, 23, 24, -27, -32, -10, -21, -8, -1, -10, -10, -5, -1, 2, 1, 3, 0, -9, -11, -10, 0, 10, 9, 18, 28, 12, 18, 15, 11, 2, 1, -4, 4, 8, 7, 8, 7, 3, 4, 3, 11, 14, 4, -5, -2, 3, -29, -4, -2, -7, 0, -4, -7, -16, -7, 5, 2, 0, 0, -3, 2, 5, 1, -3, -18, -63, -113, -128, -117, -23, -13, -2, -21, -21, -29, -54, -37, -2, -2, -17, -29, -35, -29, -19, -16, -14, -16, -19, -16, -15, -21, 28, 19, 29, 20, 30, 19, 13, 12, 11, 14, 17, 20, 28, 29, 25, 24, 24, 32, 31, 34, 60, 97, -37, -41, -57, -61, -54, -50, -54, -57, -49, -49, -47, -45, -45, -50, -56, -59, -54, -49, -52, -60, -51, -40, -16, -16, 0, -9, -16, -11, -5, -6, -10, -17, -27, -35, -29, -31, -40, -42, -44, -38, -31, -25, -23, -6, -5, -2, -17, -38, -24, -16, -19, -12, 12, 38, 47, 37, 24, 6, -15, -9, 13, 37, 61, 56, 11, -7, 27, 18, -10, -14, -14, -14, -19, -18, -13, -12, -12, -13, -15, -11, -5, -6, -8, -8, -7, -4, -1, -8, -4, 0, -9, 2, 2, 6, -4, -7, -4, -6, -7, -12, -15, -17, -10, -8, -15, -21, -25, -31, -72, -127, -128, 20, 42, 17, 8, -4, 1, 6, 3, -18, -28, -2, 1, 5, 28, 8, -3, 8, 16, 24, 15, 0, -9, 19, 12, 16, 43, 69, 55, 41, 35, 22, 14, 8, 3, 8, 16, 20, 26, 33, 34, 30, 19, 15, -10, -12, -10, -10, -7, -11, -3, -4, -8, -7, -2, 1, 0, -3, -7, -8, -8, -6, -1, -2, -4, -4, -76, -91, -66, -74, -76, -41, -48, -47, -44, -41, -39, -36, -42, -48, -37, -37, -39, -41, -47, -58, -68, -70, -78, -79, -69, -70, -70, -67, -72, -72, -72, -68, -63, -60, -58, -58, -55, -53, -49, -43, -43, -37, -34, -16, -6, -3, -1, -11, -7, -4, -3, -3, -2, 2, 1, -6, -7, -11, -11, -3, -17, -41, -58, -44, -36, -43, 6, -15, -19, -19, -21, -17, 0, 16, 16, 13, 12, -5, 0, -4, -27, -27, -12, -3, 0, -2, -7, -15, 7, 0, -8, -6, -2, 8, 4, 0, -5, -7, -11, -13, -13, -11, -7, -9, -9, -6, -10, -5, 6, 0, 37, 34, 32, 43, 40, 35, 34, 36, 40, 38, 35, 38, 37, 40, 44, 37, 31, 30, 25, 38, 44, 23, 18, 10, 8, 8, 3, 5, 4, 2, 3, 6, 6, 5, 7, 6, -3, -8, -8, -13, -14, -24, -17, 9, -110, 22, -17, -65, -43, -35, 5, 5, -19, -29, -27, -18, -11, -6, -4, -6, -10, -9, -4, 1, 3, 2, 36, -40, -99, -102, 20, 27, 7, -16, -27, -30, -23, -15, -6, 1, 3, -2, -8, -10, -9, 4, 8, -10, -44, -30, -9, -2, -5, -15, -9, -3, 1, -2, -18, -17, -21, -26, -25, -34, -38, -44, -46, -46, -38, -87, 43, 32, 14, 5, 8, 12, 10, 4, -12, -14, -4, 2, -1, -7, -6, 2, 3, -3, -2, -1, 4, 14, -89, -105, -6, -8, 0, 1, -3, -7, -8, -4, 8, 15, 9, 3, -1, -5, -6, -4, -2, 1, 5, 9, -4, -6, -1, -1, -6, -1, -5, -3, 0, -3, -4, -2, -4, -5, -5, -10, -9, -5, -8, -14, -20, -44, -20, -5, 1, 20, 22, -17, -35, -38, -33, -23, -2, 8, 10, 7, -2, -40, -59, -50, -30, -8, -17, -32, -125, -75, -53, -13, -1, -9, -12, -12, -9, -7, -3, -1, -4, -9, -11, -13, -8, -10, -14, -6, -6, -24, 46, -1, 8, -6, 4, 0, 34, 19, -20, -27, -23, -19, -6, 3, 15, 33, 37, 29, 22, 11, 3, -6, 1, 0, 12, 7, 3, -4, 3, 3, 7, 12, 6, -1, -2, -5, -4, -6, -7, -4, -3, -1, 3, 8, -7, 1, 9, 5, -1, -3, -7, -3, 3, 6, 10, 7, 1, 0, 2, 0, 1, -3, -5, 2, 2, -9, 5, -2, -25, -17, -17, -14, -14, -13, -24, -38, -48, -48, -43, -31, -24, -17, -13, -12, -12, -12, -5, 7, 21, 21, -5, 4, 10, -3, 2, 7, 8, 8, 6, 6, 3, -3, -11, -15, -13, -12, -20, -26, -28, -41, 30, 17, 18, 26, 24, 22, 22, 32, 40, 39, 34, 32, 27, 34, 36, 26, 20, 18, 23, 35, 41, 27, -10, -7, 1, 7, 8, 0, 6, 14, 15, 11, 6, 7, 7, 6, 10, 11, 11, 14, 14, 17, 33, 71, 17, 10, -6, -1, 12, 14, 7, 7, 18, 15, 2, -7, -6, 0, 5, 7, 2, -3, -5, -6, -1, 4, -11, 6, 5, 3, 10, 13, 9, 5, 14, 19, 9, -4, -17, -18, -9, 1, 3, 5, 17, 38, 53, 31, -34, -26, -28, -22, -17, -24, -23, -21, -26, -21, -21, -25, -20, -17, -13, -19, -16, -23, -31, -23, -9, -20, 21, 26, 16, 13, 20, 11, 15, 19, 19, 18, 24, 26, 29, 27, 29, 25, 25, 15, 28, 38, 44, 59, 14, 18, 31, 37, 42, 40, 43, 45, 49, 54, 54, 56, 53, 50, 43, 37, 30, 26, 23, 20, 14, 10, 9, 11, 16, 5, 15, 12, 14, 15, 13, 12, 14, 17, 17, 16, 16, 16, 15, 6, 4, 2, -14, 2, 0, -2, -7, 18, 26, 20, 22, 29, 29, 14, 9, 17, 21, 12, 2, 5, 9, 14, 10, 5, 2, 5, 86, 127, 127, 68, 29, -3, -3, 15, 23, 28, 31, 21, 5, -3, -7, -5, -2, -1, -6, -17, -18, -14, 3, -2, -24, -29, -32, -33, -40, -46, -45, -45, -45, -44, -42, -39, -35, -29, -28, -29, -28, -23, -7, 9, 24, 37, 62, 62, 67, 64, 59, 76, 105, 95, 61, 41, 28, 23, 23, 18, 14, 19, 22, 22, 14, 11, -51, -39, -20, -13, -13, -6, -5, -7, -9, -14, -15, -18, -25, -26, -30, -35, -35, -44, -44, -51, -71, -105, -16, -4, -18, 2, 28, 7, -3, 7, 13, 3, -3, 2, 9, 14, 14, 5, -8, -14, -4, 17, 47, 98, -23, -41, -55, -45, -41, -38, -34, -32, -31, -29, -25, -22, -19, -17, -14, -13, -13, -13, -14, -13, -4, 0, 14, 26, 11, 2, 4, -7, -8, -15, -22, -28, -26, -9, 6, 14, 11, -3, -4, -1, 3, 31, 65, 45, 4, -1, 37, 31, 2, -7, -21, -29, -20, 5, 10, -10, -13, -13, -8, 1, 4, -4, -12, -31, -15, 39, -3, -6, -12, -16, -24, -27, -31, -28, -30, -38, -45, -45, -48, -50, -50, -46, -43, -41, -38, -39, -34, -34, 15, 16, 3, 2, 10, 12, -4, -2, 15, 26, 25, 21, 27, 35, 44, 43, 28, 21, 43, 42, 17, 40, 9, 7, 10, 12, 10, 5, 1, 5, 11, 11, 9, 10, 16, 19, 22, 34, 44, 51, 48, 48, 48, 60, -43, -29, -12, -2, -9, -24, -19, -13, -12, -14, -15, -13, -17, -18, -19, -19, -17, -20, -23, -34, -39, -44, -6, -31, -32, -25, 52, 106, 110, 19, -4, -14, -13, -5, -2, -8, 2, 6, 5, 11, 15, 20, 38, 61, -40, -19, -2, -5, -2, -4, -1, -6, -8, -6, -8, -4, -5, -4, 3, 0, -2, -4, -5, -3, -14, -24, -16, -24, -22, 2, -2, -29, -33, -27, -23, -25, -24, -16, -18, -17, 5, 38, 47, 41, 37, 27, 13, 0, 67, 78, 39, -26, -7, -10, -15, -6, 3, -3, -5, -3, -2, 0, 3, 1, -3, -4, -3, -1, 1, 0, -2, -15, 24, -12, -48, 24, -26, -82, -69, -40, -15, -16, -9, -1, 7, 12, 18, 20, 26, 33, 27, 30 }; static const rnn_weight denoise_output_bias[22] = { -82, -66, -125, -95, -127, -127, -127, -127, -127, -94, -113, -127, -80, -65, -109, -127, -126, -105, -53, -49, -18, -9 }; const DenseLayer denoise_output = { denoise_output_bias, denoise_output_weights, 96, 22, ACTIVATION_SIGMOID }; static const rnn_weight vad_output_weights[24] = { 127, 127, 127, 127, 127, 20, 127, -126, -126, -54, 14, 125, -126, -126, 127, -125, -126, 127, -127, -127, -57, -30, 127, 80 }; static const rnn_weight vad_output_bias[1] = { -50 }; const DenseLayer vad_output = { vad_output_bias, vad_output_weights, 24, 1, ACTIVATION_SIGMOID }; mumble-1.3.4/3rdparty/rnnoise-src/src/celt_lpc.h0000664000175000017500000000377014010707350021403 0ustar builderbuilder/* Copyright (c) 2009-2010 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef PLC_H #define PLC_H #include "arch.h" #include "common.h" #if defined(OPUS_X86_MAY_HAVE_SSE4_1) #include "x86/celt_lpc_sse.h" #endif #define LPC_ORDER 24 void _celt_lpc(opus_val16 *_lpc, const opus_val32 *ac, int p); void celt_fir( const opus_val16 *x, const opus_val16 *num, opus_val16 *y, int N, int ord); void celt_iir(const opus_val32 *x, const opus_val16 *den, opus_val32 *y, int N, int ord, opus_val16 *mem); int _celt_autocorr(const opus_val16 *x, opus_val32 *ac, const opus_val16 *window, int overlap, int lag, int n); #endif /* PLC_H */ mumble-1.3.4/3rdparty/rnnoise-src/src/tansig_table.h0000664000175000017500000000440014010707350022241 0ustar builderbuilder/* This file is auto-generated by gen_tables */ static const float tansig_table[201] = { 0.000000f, 0.039979f, 0.079830f, 0.119427f, 0.158649f, 0.197375f, 0.235496f, 0.272905f, 0.309507f, 0.345214f, 0.379949f, 0.413644f, 0.446244f, 0.477700f, 0.507977f, 0.537050f, 0.564900f, 0.591519f, 0.616909f, 0.641077f, 0.664037f, 0.685809f, 0.706419f, 0.725897f, 0.744277f, 0.761594f, 0.777888f, 0.793199f, 0.807569f, 0.821040f, 0.833655f, 0.845456f, 0.856485f, 0.866784f, 0.876393f, 0.885352f, 0.893698f, 0.901468f, 0.908698f, 0.915420f, 0.921669f, 0.927473f, 0.932862f, 0.937863f, 0.942503f, 0.946806f, 0.950795f, 0.954492f, 0.957917f, 0.961090f, 0.964028f, 0.966747f, 0.969265f, 0.971594f, 0.973749f, 0.975743f, 0.977587f, 0.979293f, 0.980869f, 0.982327f, 0.983675f, 0.984921f, 0.986072f, 0.987136f, 0.988119f, 0.989027f, 0.989867f, 0.990642f, 0.991359f, 0.992020f, 0.992631f, 0.993196f, 0.993718f, 0.994199f, 0.994644f, 0.995055f, 0.995434f, 0.995784f, 0.996108f, 0.996407f, 0.996682f, 0.996937f, 0.997172f, 0.997389f, 0.997590f, 0.997775f, 0.997946f, 0.998104f, 0.998249f, 0.998384f, 0.998508f, 0.998623f, 0.998728f, 0.998826f, 0.998916f, 0.999000f, 0.999076f, 0.999147f, 0.999213f, 0.999273f, 0.999329f, 0.999381f, 0.999428f, 0.999472f, 0.999513f, 0.999550f, 0.999585f, 0.999617f, 0.999646f, 0.999673f, 0.999699f, 0.999722f, 0.999743f, 0.999763f, 0.999781f, 0.999798f, 0.999813f, 0.999828f, 0.999841f, 0.999853f, 0.999865f, 0.999875f, 0.999885f, 0.999893f, 0.999902f, 0.999909f, 0.999916f, 0.999923f, 0.999929f, 0.999934f, 0.999939f, 0.999944f, 0.999948f, 0.999952f, 0.999956f, 0.999959f, 0.999962f, 0.999965f, 0.999968f, 0.999970f, 0.999973f, 0.999975f, 0.999977f, 0.999978f, 0.999980f, 0.999982f, 0.999983f, 0.999984f, 0.999986f, 0.999987f, 0.999988f, 0.999989f, 0.999990f, 0.999990f, 0.999991f, 0.999992f, 0.999992f, 0.999993f, 0.999994f, 0.999994f, 0.999994f, 0.999995f, 0.999995f, 0.999996f, 0.999996f, 0.999996f, 0.999997f, 0.999997f, 0.999997f, 0.999997f, 0.999997f, 0.999998f, 0.999998f, 0.999998f, 0.999998f, 0.999998f, 0.999998f, 0.999999f, 0.999999f, 0.999999f, 0.999999f, 0.999999f, 0.999999f, 0.999999f, 0.999999f, 0.999999f, 0.999999f, 0.999999f, 0.999999f, 0.999999f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f, }; mumble-1.3.4/3rdparty/rnnoise-src/src/denoise.c0000664000175000017500000004462414010707350021242 0ustar builderbuilder/* Copyright (c) 2017 Mozilla */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include "kiss_fft.h" #include "common.h" #include #include "rnnoise.h" #include "pitch.h" #include "arch.h" #include "rnn.h" #include "rnn_data.h" #define FRAME_SIZE_SHIFT 2 #define FRAME_SIZE (120<analysis_mem, FRAME_SIZE); for (i=0;ianalysis_mem, in, FRAME_SIZE); apply_window(x); forward_transform(X, x); #if TRAINING for (i=lowpass;i>1]; int pitch_index; float gain; float *(pre[1]); float tmp[NB_BANDS]; float follow, logMax; frame_analysis(st, X, Ex, in); RNN_MOVE(st->pitch_buf, &st->pitch_buf[FRAME_SIZE], PITCH_BUF_SIZE-FRAME_SIZE); RNN_COPY(&st->pitch_buf[PITCH_BUF_SIZE-FRAME_SIZE], in, FRAME_SIZE); pre[0] = &st->pitch_buf[0]; pitch_downsample(pre, pitch_buf, PITCH_BUF_SIZE, 1); pitch_search(pitch_buf+(PITCH_MAX_PERIOD>>1), pitch_buf, PITCH_FRAME_SIZE, PITCH_MAX_PERIOD-3*PITCH_MIN_PERIOD, &pitch_index); pitch_index = PITCH_MAX_PERIOD-pitch_index; gain = remove_doubling(pitch_buf, PITCH_MAX_PERIOD, PITCH_MIN_PERIOD, PITCH_FRAME_SIZE, &pitch_index, st->last_period, st->last_gain); st->last_period = pitch_index; st->last_gain = gain; for (i=0;ipitch_buf[PITCH_BUF_SIZE-WINDOW_SIZE-pitch_index+i]; apply_window(p); forward_transform(P, p); compute_band_energy(Ep, P); compute_band_corr(Exp, X, P); for (i=0;icepstral_mem[st->memid]; ceps_1 = (st->memid < 1) ? st->cepstral_mem[CEPS_MEM+st->memid-1] : st->cepstral_mem[st->memid-1]; ceps_2 = (st->memid < 2) ? st->cepstral_mem[CEPS_MEM+st->memid-2] : st->cepstral_mem[st->memid-2]; for (i=0;imemid++; for (i=0;imemid == CEPS_MEM) st->memid = 0; for (i=0;icepstral_mem[i][k] - st->cepstral_mem[j][k]; dist += tmp*tmp; } if (j!=i) mindist = MIN32(mindist, dist); } spec_variability += mindist; } features[NB_BANDS+3*NB_DELTA_CEPS+1] = spec_variability/CEPS_MEM-2.1; return TRAINING && E < 0.1; } static void frame_synthesis(DenoiseState *st, float *out, const kiss_fft_cpx *y) { float x[WINDOW_SIZE]; int i; inverse_transform(x, y); apply_window(x); for (i=0;isynthesis_mem[i]; RNN_COPY(st->synthesis_mem, &x[FRAME_SIZE], FRAME_SIZE); } static void biquad(float *y, float mem[2], const float *x, const float *b, const float *a, int N) { int i; for (i=0;ig[i]) r[i] = 1; else r[i] = Exp[i]*(1-g[i])/(.001 + g[i]*(1-Exp[i])); r[i] = MIN16(1, MAX16(0, r[i])); #else if (Exp[i]>g[i]) r[i] = 1; else r[i] = SQUARE(Exp[i])*(1-SQUARE(g[i]))/(.001 + SQUARE(g[i])*(1-SQUARE(Exp[i]))); r[i] = sqrt(MIN16(1, MAX16(0, r[i]))); #endif r[i] *= sqrt(Ex[i]/(1e-8+Ep[i])); } interp_band_gain(rf, r); for (i=0;imem_hp_x, in, b_hp, a_hp, FRAME_SIZE); silence = compute_frame_features(st, X, P, Ex, Ep, Exp, features, x); if (!silence) { compute_rnn(&st->rnn, g, &vad_prob, features); pitch_filter(X, P, Ex, Ep, Exp, g); for (i=0;ilastg[i]); st->lastg[i] = g[i]; } interp_band_gain(gf, g); #if 1 for (i=0;i \n", argv[0]); return 1; } f1 = fopen(argv[1], "r"); f2 = fopen(argv[2], "r"); fout = fopen(argv[3], "w"); for(i=0;i<150;i++) { short tmp[FRAME_SIZE]; fread(tmp, sizeof(short), FRAME_SIZE, f2); } while (1) { kiss_fft_cpx X[FREQ_SIZE], Y[FREQ_SIZE], N[FREQ_SIZE], P[WINDOW_SIZE]; float Ex[NB_BANDS], Ey[NB_BANDS], En[NB_BANDS], Ep[NB_BANDS]; float Exp[NB_BANDS]; float Ln[NB_BANDS]; float features[NB_FEATURES]; float g[NB_BANDS]; float gf[FREQ_SIZE]={1}; short tmp[FRAME_SIZE]; float vad=0; float vad_prob; float E=0; if (count==50000000) break; if (++gain_change_count > 2821) { speech_gain = pow(10., (-40+(rand()%60))/20.); noise_gain = pow(10., (-30+(rand()%50))/20.); if (rand()%10==0) noise_gain = 0; noise_gain *= speech_gain; if (rand()%10==0) speech_gain = 0; gain_change_count = 0; rand_resp(a_noise, b_noise); rand_resp(a_sig, b_sig); lowpass = FREQ_SIZE * 3000./24000. * pow(50., rand()/(double)RAND_MAX); for (i=0;i lowpass) { band_lp = i; break; } } } if (speech_gain != 0) { fread(tmp, sizeof(short), FRAME_SIZE, f1); if (feof(f1)) { rewind(f1); fread(tmp, sizeof(short), FRAME_SIZE, f1); } for (i=0;i 1e9f) { vad_cnt=0; } else if (E > 1e8f) { vad_cnt -= 5; } else if (E > 1e7f) { vad_cnt++; } else { vad_cnt+=2; } if (vad_cnt < 0) vad_cnt = 0; if (vad_cnt > 15) vad_cnt = 15; if (vad_cnt >= 10) vad = 0; else if (vad_cnt > 0) vad = 0.5f; else vad = 1.f; frame_analysis(st, Y, Ey, x); frame_analysis(noise_state, N, En, n); for (i=0;ilast_gain, noisy->last_period); for (i=0;i 1) g[i] = 1; if (silence || i > band_lp) g[i] = -1; if (Ey[i] < 5e-2 && Ex[i] < 5e-2) g[i] = -1; if (vad==0 && noise_gain==0) g[i] = -1; } count++; #if 0 for (i=0;irnn, g, &vad_prob, features); interp_band_gain(gf, g); #if 1 for (i=0;i>1; j++) { opus_val32 tmp1, tmp2; tmp1 = lpc[j]; tmp2 = lpc[i-1-j]; lpc[j] = tmp1 + MULT32_32_Q31(r,tmp2); lpc[i-1-j] = tmp2 + MULT32_32_Q31(r,tmp1); } error = error - MULT32_32_Q31(MULT32_32_Q31(r,r),error); /* Bail out once we get 30 dB gain */ #ifdef FIXED_POINT if (error=1;j--) { mem[j]=mem[j-1]; } mem[0] = SROUND16(sum, SIG_SHIFT); _y[i] = sum; } #else int i,j; celt_assert((ord&3)==0); #ifdef USE_MALLOC opus_val16 *rden = malloc(sizeof(*rden) * ord); opus_val16 *y = malloc(sizeof(*y) * (N+ord)); #else opus_val16 rden[ord]; opus_val16 y[N+ord]; #endif for(i=0;i0); celt_assert(overlap>=0); if (overlap == 0) { xptr = x; } else { for (i=0;i0) { for(i=0;i= 536870912) { int shift2=1; if (ac[0] >= 1073741824) shift2++; for (i=0;i<=lag;i++) ac[i] = SHR32(ac[i], shift2); shift += shift2; } #endif #ifdef USE_MALLOC free(xx); #endif return shift; } mumble-1.3.4/3rdparty/rnnoise-src/src/kiss_fft.c0000664000175000017500000004105014010707350021412 0ustar builderbuilder/*Copyright (c) 2003-2004, Mark Borgerding Lots of modifications by Jean-Marc Valin Copyright (c) 2005-2007, Xiph.Org Foundation Copyright (c) 2008, Xiph.Org Foundation, CSIRO All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.*/ /* This code is originally from Mark Borgerding's KISS-FFT but has been heavily modified to better suit Opus */ #ifndef SKIP_CONFIG_H # ifdef HAVE_CONFIG_H # include "config.h" # endif #endif #include "_kiss_fft_guts.h" #define CUSTOM_MODES /* The guts header contains all the multiplication and addition macros that are defined for complex numbers. It also delares the kf_ internal functions. */ static void kf_bfly2( kiss_fft_cpx * Fout, int m, int N ) { kiss_fft_cpx * Fout2; int i; (void)m; #ifdef CUSTOM_MODES if (m==1) { celt_assert(m==1); for (i=0;itwiddles; /* m is guaranteed to be a multiple of 4. */ for (j=0;jtwiddles[fstride*m]; #endif for (i=0;itwiddles; /* For non-custom modes, m is guaranteed to be a multiple of 4. */ k=m; do { C_MUL(scratch[1],Fout[m] , *tw1); C_MUL(scratch[2],Fout[m2] , *tw2); C_ADD(scratch[3],scratch[1],scratch[2]); C_SUB(scratch[0],scratch[1],scratch[2]); tw1 += fstride; tw2 += fstride*2; Fout[m].r = SUB32_ovflw(Fout->r, HALF_OF(scratch[3].r)); Fout[m].i = SUB32_ovflw(Fout->i, HALF_OF(scratch[3].i)); C_MULBYSCALAR( scratch[0] , epi3.i ); C_ADDTO(*Fout,scratch[3]); Fout[m2].r = ADD32_ovflw(Fout[m].r, scratch[0].i); Fout[m2].i = SUB32_ovflw(Fout[m].i, scratch[0].r); Fout[m].r = SUB32_ovflw(Fout[m].r, scratch[0].i); Fout[m].i = ADD32_ovflw(Fout[m].i, scratch[0].r); ++Fout; } while(--k); } } #ifndef OVERRIDE_kf_bfly5 static void kf_bfly5( kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_state *st, int m, int N, int mm ) { kiss_fft_cpx *Fout0,*Fout1,*Fout2,*Fout3,*Fout4; int i, u; kiss_fft_cpx scratch[13]; const kiss_twiddle_cpx *tw; kiss_twiddle_cpx ya,yb; kiss_fft_cpx * Fout_beg = Fout; #ifdef FIXED_POINT ya.r = 10126; ya.i = -31164; yb.r = -26510; yb.i = -19261; #else ya = st->twiddles[fstride*m]; yb = st->twiddles[fstride*2*m]; #endif tw=st->twiddles; for (i=0;ir = ADD32_ovflw(Fout0->r, ADD32_ovflw(scratch[7].r, scratch[8].r)); Fout0->i = ADD32_ovflw(Fout0->i, ADD32_ovflw(scratch[7].i, scratch[8].i)); scratch[5].r = ADD32_ovflw(scratch[0].r, ADD32_ovflw(S_MUL(scratch[7].r,ya.r), S_MUL(scratch[8].r,yb.r))); scratch[5].i = ADD32_ovflw(scratch[0].i, ADD32_ovflw(S_MUL(scratch[7].i,ya.r), S_MUL(scratch[8].i,yb.r))); scratch[6].r = ADD32_ovflw(S_MUL(scratch[10].i,ya.i), S_MUL(scratch[9].i,yb.i)); scratch[6].i = NEG32_ovflw(ADD32_ovflw(S_MUL(scratch[10].r,ya.i), S_MUL(scratch[9].r,yb.i))); C_SUB(*Fout1,scratch[5],scratch[6]); C_ADD(*Fout4,scratch[5],scratch[6]); scratch[11].r = ADD32_ovflw(scratch[0].r, ADD32_ovflw(S_MUL(scratch[7].r,yb.r), S_MUL(scratch[8].r,ya.r))); scratch[11].i = ADD32_ovflw(scratch[0].i, ADD32_ovflw(S_MUL(scratch[7].i,yb.r), S_MUL(scratch[8].i,ya.r))); scratch[12].r = SUB32_ovflw(S_MUL(scratch[9].i,ya.i), S_MUL(scratch[10].i,yb.i)); scratch[12].i = SUB32_ovflw(S_MUL(scratch[10].r,yb.i), S_MUL(scratch[9].r,ya.i)); C_ADD(*Fout2,scratch[11],scratch[12]); C_SUB(*Fout3,scratch[11],scratch[12]); ++Fout0;++Fout1;++Fout2;++Fout3;++Fout4; } } } #endif /* OVERRIDE_kf_bfly5 */ #endif #ifdef CUSTOM_MODES static void compute_bitrev_table( int Fout, opus_int16 *f, const size_t fstride, int in_stride, opus_int16 * factors, const kiss_fft_state *st ) { const int p=*factors++; /* the radix */ const int m=*factors++; /* stage's fft length/p */ /*printf ("fft %d %d %d %d %d %d\n", p*m, m, p, s2, fstride*in_stride, N);*/ if (m==1) { int j; for (j=0;j32000 || (opus_int32)p*(opus_int32)p > n) p = n; /* no more factors, skip to end */ } n /= p; #ifdef RADIX_TWO_ONLY if (p!=2 && p != 4) #else if (p>5) #endif { return 0; } facbuf[2*stages] = p; if (p==2 && stages > 1) { facbuf[2*stages] = 4; facbuf[2] = 2; } stages++; } while (n > 1); n = nbak; /* Reverse the order to get the radix 4 at the end, so we can use the fast degenerate case. It turns out that reversing the order also improves the noise behaviour. */ for (i=0;i= memneeded) st = (kiss_fft_state*)mem; *lenmem = memneeded; } if (st) { opus_int16 *bitrev; kiss_twiddle_cpx *twiddles; st->nfft=nfft; #ifdef FIXED_POINT st->scale_shift = celt_ilog2(st->nfft); if (st->nfft == 1<scale_shift) st->scale = Q15ONE; else st->scale = (1073741824+st->nfft/2)/st->nfft>>(15-st->scale_shift); #else st->scale = 1.f/nfft; #endif if (base != NULL) { st->twiddles = base->twiddles; st->shift = 0; while (st->shift < 32 && nfft<shift != base->nfft) st->shift++; if (st->shift>=32) goto fail; } else { st->twiddles = twiddles = (kiss_twiddle_cpx*)KISS_FFT_MALLOC(sizeof(kiss_twiddle_cpx)*nfft); compute_twiddles(twiddles, nfft); st->shift = -1; } if (!kf_factor(nfft,st->factors)) { goto fail; } /* bitrev */ st->bitrev = bitrev = (opus_int16*)KISS_FFT_MALLOC(sizeof(opus_int16)*nfft); if (st->bitrev==NULL) goto fail; compute_bitrev_table(0, bitrev, 1,1, st->factors,st); /* Initialize architecture specific fft parameters */ if (opus_fft_alloc_arch(st, arch)) goto fail; } return st; fail: opus_fft_free(st, arch); return NULL; } kiss_fft_state *opus_fft_alloc(int nfft,void * mem,size_t * lenmem, int arch) { return opus_fft_alloc_twiddles(nfft, mem, lenmem, NULL, arch); } void opus_fft_free_arch_c(kiss_fft_state *st) { (void)st; } void opus_fft_free(const kiss_fft_state *cfg, int arch) { if (cfg) { opus_fft_free_arch((kiss_fft_state *)cfg, arch); opus_free((opus_int16*)cfg->bitrev); if (cfg->shift < 0) opus_free((kiss_twiddle_cpx*)cfg->twiddles); opus_free((kiss_fft_state*)cfg); } } #endif /* CUSTOM_MODES */ void opus_fft_impl(const kiss_fft_state *st,kiss_fft_cpx *fout) { int m2, m; int p; int L; int fstride[MAXFACTORS]; int i; int shift; /* st->shift can be -1 */ shift = st->shift>0 ? st->shift : 0; fstride[0] = 1; L=0; do { p = st->factors[2*L]; m = st->factors[2*L+1]; fstride[L+1] = fstride[L]*p; L++; } while(m!=1); m = st->factors[2*L-1]; for (i=L-1;i>=0;i--) { if (i!=0) m2 = st->factors[2*i-1]; else m2 = 1; switch (st->factors[2*i]) { case 2: kf_bfly2(fout, m, fstride[i]); break; case 4: kf_bfly4(fout,fstride[i]<scale_shift-1; #endif scale = st->scale; celt_assert2 (fin != fout, "In-place FFT not supported"); /* Bit-reverse the input */ for (i=0;infft;i++) { kiss_fft_cpx x = fin[i]; fout[st->bitrev[i]].r = SHR32(MULT16_32_Q16(scale, x.r), scale_shift); fout[st->bitrev[i]].i = SHR32(MULT16_32_Q16(scale, x.i), scale_shift); } opus_fft_impl(st, fout); } void opus_ifft_c(const kiss_fft_state *st,const kiss_fft_cpx *fin,kiss_fft_cpx *fout) { int i; celt_assert2 (fin != fout, "In-place FFT not supported"); /* Bit-reverse the input */ for (i=0;infft;i++) fout[st->bitrev[i]] = fin[i]; for (i=0;infft;i++) fout[i].i = -fout[i].i; opus_fft_impl(st, fout); for (i=0;infft;i++) fout[i].i = -fout[i].i; } mumble-1.3.4/3rdparty/rnnoise-src/src/common.h0000664000175000017500000000232014010707350021074 0ustar builderbuilder #ifndef COMMON_H #define COMMON_H #include "stdlib.h" #include "string.h" #define RNN_INLINE inline #define OPUS_INLINE inline /** RNNoise wrapper for malloc(). To do your own dynamic allocation, all you need t o do is replace this function and rnnoise_free */ #ifndef OVERRIDE_RNNOISE_ALLOC static RNN_INLINE void *rnnoise_alloc (size_t size) { return malloc(size); } #endif /** RNNoise wrapper for free(). To do your own dynamic allocation, all you need to do is replace this function and rnnoise_alloc */ #ifndef OVERRIDE_RNNOISE_FREE static RNN_INLINE void rnnoise_free (void *ptr) { free(ptr); } #endif /** Copy n elements from src to dst. The 0* term provides compile-time type checking */ #ifndef OVERRIDE_RNN_COPY #define RNN_COPY(dst, src, n) (memcpy((dst), (src), (n)*sizeof(*(dst)) + 0*((dst)-(src)) )) #endif /** Copy n elements from src to dst, allowing overlapping regions. The 0* term provides compile-time type checking */ #ifndef OVERRIDE_RNN_MOVE #define RNN_MOVE(dst, src, n) (memmove((dst), (src), (n)*sizeof(*(dst)) + 0*((dst)-(src)) )) #endif /** Set n elements of dst to zero */ #ifndef OVERRIDE_RNN_CLEAR #define RNN_CLEAR(dst, n) (memset((dst), 0, (n)*sizeof(*(dst)))) #endif #endif mumble-1.3.4/3rdparty/rnnoise-src/src/_kiss_fft_guts.h0000664000175000017500000001357214010707350022630 0ustar builderbuilder/*Copyright (c) 2003-2004, Mark Borgerding All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.*/ #ifndef KISS_FFT_GUTS_H #define KISS_FFT_GUTS_H #define MIN(a,b) ((a)<(b) ? (a):(b)) #define MAX(a,b) ((a)>(b) ? (a):(b)) /* kiss_fft.h defines kiss_fft_scalar as either short or a float type and defines typedef struct { kiss_fft_scalar r; kiss_fft_scalar i; }kiss_fft_cpx; */ #include "kiss_fft.h" /* Explanation of macros dealing with complex math: C_MUL(m,a,b) : m = a*b C_FIXDIV( c , div ) : if a fixed point impl., c /= div. noop otherwise C_SUB( res, a,b) : res = a - b C_SUBFROM( res , a) : res -= a C_ADDTO( res , a) : res += a * */ #ifdef FIXED_POINT #include "arch.h" #define SAMP_MAX 2147483647 #define TWID_MAX 32767 #define TRIG_UPSCALE 1 #define SAMP_MIN -SAMP_MAX # define S_MUL(a,b) MULT16_32_Q15(b, a) # define C_MUL(m,a,b) \ do{ (m).r = SUB32_ovflw(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)); \ (m).i = ADD32_ovflw(S_MUL((a).r,(b).i) , S_MUL((a).i,(b).r)); }while(0) # define C_MULC(m,a,b) \ do{ (m).r = ADD32_ovflw(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)); \ (m).i = SUB32_ovflw(S_MUL((a).i,(b).r) , S_MUL((a).r,(b).i)); }while(0) # define C_MULBYSCALAR( c, s ) \ do{ (c).r = S_MUL( (c).r , s ) ;\ (c).i = S_MUL( (c).i , s ) ; }while(0) # define DIVSCALAR(x,k) \ (x) = S_MUL( x, (TWID_MAX-((k)>>1))/(k)+1 ) # define C_FIXDIV(c,div) \ do { DIVSCALAR( (c).r , div); \ DIVSCALAR( (c).i , div); }while (0) #define C_ADD( res, a,b)\ do {(res).r=ADD32_ovflw((a).r,(b).r); (res).i=ADD32_ovflw((a).i,(b).i); \ }while(0) #define C_SUB( res, a,b)\ do {(res).r=SUB32_ovflw((a).r,(b).r); (res).i=SUB32_ovflw((a).i,(b).i); \ }while(0) #define C_ADDTO( res , a)\ do {(res).r = ADD32_ovflw((res).r, (a).r); (res).i = ADD32_ovflw((res).i,(a).i);\ }while(0) #define C_SUBFROM( res , a)\ do {(res).r = ADD32_ovflw((res).r,(a).r); (res).i = SUB32_ovflw((res).i,(a).i); \ }while(0) #if defined(OPUS_ARM_INLINE_ASM) #include "arm/kiss_fft_armv4.h" #endif #if defined(OPUS_ARM_INLINE_EDSP) #include "arm/kiss_fft_armv5e.h" #endif #if defined(MIPSr1_ASM) #include "mips/kiss_fft_mipsr1.h" #endif #else /* not FIXED_POINT*/ # define S_MUL(a,b) ( (a)*(b) ) #define C_MUL(m,a,b) \ do{ (m).r = (a).r*(b).r - (a).i*(b).i;\ (m).i = (a).r*(b).i + (a).i*(b).r; }while(0) #define C_MULC(m,a,b) \ do{ (m).r = (a).r*(b).r + (a).i*(b).i;\ (m).i = (a).i*(b).r - (a).r*(b).i; }while(0) #define C_MUL4(m,a,b) C_MUL(m,a,b) # define C_FIXDIV(c,div) /* NOOP */ # define C_MULBYSCALAR( c, s ) \ do{ (c).r *= (s);\ (c).i *= (s); }while(0) #endif #ifndef CHECK_OVERFLOW_OP # define CHECK_OVERFLOW_OP(a,op,b) /* noop */ #endif #ifndef C_ADD #define C_ADD( res, a,b)\ do { \ CHECK_OVERFLOW_OP((a).r,+,(b).r)\ CHECK_OVERFLOW_OP((a).i,+,(b).i)\ (res).r=(a).r+(b).r; (res).i=(a).i+(b).i; \ }while(0) #define C_SUB( res, a,b)\ do { \ CHECK_OVERFLOW_OP((a).r,-,(b).r)\ CHECK_OVERFLOW_OP((a).i,-,(b).i)\ (res).r=(a).r-(b).r; (res).i=(a).i-(b).i; \ }while(0) #define C_ADDTO( res , a)\ do { \ CHECK_OVERFLOW_OP((res).r,+,(a).r)\ CHECK_OVERFLOW_OP((res).i,+,(a).i)\ (res).r += (a).r; (res).i += (a).i;\ }while(0) #define C_SUBFROM( res , a)\ do {\ CHECK_OVERFLOW_OP((res).r,-,(a).r)\ CHECK_OVERFLOW_OP((res).i,-,(a).i)\ (res).r -= (a).r; (res).i -= (a).i; \ }while(0) #endif /* C_ADD defined */ #ifdef FIXED_POINT /*# define KISS_FFT_COS(phase) TRIG_UPSCALE*floor(MIN(32767,MAX(-32767,.5+32768 * cos (phase)))) # define KISS_FFT_SIN(phase) TRIG_UPSCALE*floor(MIN(32767,MAX(-32767,.5+32768 * sin (phase))))*/ # define KISS_FFT_COS(phase) floor(.5+TWID_MAX*cos (phase)) # define KISS_FFT_SIN(phase) floor(.5+TWID_MAX*sin (phase)) # define HALF_OF(x) ((x)>>1) #elif defined(USE_SIMD) # define KISS_FFT_COS(phase) _mm_set1_ps( cos(phase) ) # define KISS_FFT_SIN(phase) _mm_set1_ps( sin(phase) ) # define HALF_OF(x) ((x)*_mm_set1_ps(.5f)) #else # define KISS_FFT_COS(phase) (kiss_fft_scalar) cos(phase) # define KISS_FFT_SIN(phase) (kiss_fft_scalar) sin(phase) # define HALF_OF(x) ((x)*.5f) #endif #define kf_cexp(x,phase) \ do{ \ (x)->r = KISS_FFT_COS(phase);\ (x)->i = KISS_FFT_SIN(phase);\ }while(0) #define kf_cexp2(x,phase) \ do{ \ (x)->r = TRIG_UPSCALE*celt_cos_norm((phase));\ (x)->i = TRIG_UPSCALE*celt_cos_norm((phase)-32768);\ }while(0) #endif /* KISS_FFT_GUTS_H */ mumble-1.3.4/3rdparty/rnnoise-src/src/rnn.h0000664000175000017500000000421714010707350020410 0ustar builderbuilder/* Copyright (c) 2017 Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef RNN_H_ #define RNN_H_ #include "opus_types.h" #define WEIGHTS_SCALE (1.f/256) #define MAX_NEURONS 128 #define ACTIVATION_TANH 0 #define ACTIVATION_SIGMOID 1 #define ACTIVATION_RELU 2 typedef signed char rnn_weight; typedef struct { const rnn_weight *bias; const rnn_weight *input_weights; int nb_inputs; int nb_neurons; int activation; } DenseLayer; typedef struct { const rnn_weight *bias; const rnn_weight *input_weights; const rnn_weight *recurrent_weights; int nb_inputs; int nb_neurons; int activation; } GRULayer; typedef struct RNNState RNNState; void compute_dense(const DenseLayer *layer, float *output, const float *input); void compute_gru(const GRULayer *gru, float *state, const float *input); void compute_rnn(RNNState *rnn, float *gains, float *vad, const float *input); #endif /* _MLP_H_ */ mumble-1.3.4/3rdparty/rnnoise-src/src/opus_types.h0000664000175000017500000001153214010707350022023 0ustar builderbuilder/* (C) COPYRIGHT 1994-2002 Xiph.Org Foundation */ /* Modified by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* opus_types.h based on ogg_types.h from libogg */ /** @file opus_types.h @brief Opus reference implementation types */ #ifndef OPUS_TYPES_H #define OPUS_TYPES_H /* Use the real stdint.h if it's there (taken from Paul Hsieh's pstdint.h) */ #if (defined(__STDC__) && __STDC__ && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || (defined(__GNUC__) && (defined(_STDINT_H) || defined(_STDINT_H_)) || defined (HAVE_STDINT_H)) #include typedef int16_t opus_int16; typedef uint16_t opus_uint16; typedef int32_t opus_int32; typedef uint32_t opus_uint32; #elif defined(_WIN32) # if defined(__CYGWIN__) # include <_G_config.h> typedef _G_int32_t opus_int32; typedef _G_uint32_t opus_uint32; typedef _G_int16 opus_int16; typedef _G_uint16 opus_uint16; # elif defined(__MINGW32__) typedef short opus_int16; typedef unsigned short opus_uint16; typedef int opus_int32; typedef unsigned int opus_uint32; # elif defined(__MWERKS__) typedef int opus_int32; typedef unsigned int opus_uint32; typedef short opus_int16; typedef unsigned short opus_uint16; # else /* MSVC/Borland */ typedef __int32 opus_int32; typedef unsigned __int32 opus_uint32; typedef __int16 opus_int16; typedef unsigned __int16 opus_uint16; # endif #elif defined(__MACOS__) # include typedef SInt16 opus_int16; typedef UInt16 opus_uint16; typedef SInt32 opus_int32; typedef UInt32 opus_uint32; #elif (defined(__APPLE__) && defined(__MACH__)) /* MacOS X Framework build */ # include typedef int16_t opus_int16; typedef u_int16_t opus_uint16; typedef int32_t opus_int32; typedef u_int32_t opus_uint32; #elif defined(__BEOS__) /* Be */ # include typedef int16 opus_int16; typedef u_int16 opus_uint16; typedef int32_t opus_int32; typedef u_int32_t opus_uint32; #elif defined (__EMX__) /* OS/2 GCC */ typedef short opus_int16; typedef unsigned short opus_uint16; typedef int opus_int32; typedef unsigned int opus_uint32; #elif defined (DJGPP) /* DJGPP */ typedef short opus_int16; typedef unsigned short opus_uint16; typedef int opus_int32; typedef unsigned int opus_uint32; #elif defined(R5900) /* PS2 EE */ typedef int opus_int32; typedef unsigned opus_uint32; typedef short opus_int16; typedef unsigned short opus_uint16; #elif defined(__SYMBIAN32__) /* Symbian GCC */ typedef signed short opus_int16; typedef unsigned short opus_uint16; typedef signed int opus_int32; typedef unsigned int opus_uint32; #elif defined(CONFIG_TI_C54X) || defined (CONFIG_TI_C55X) typedef short opus_int16; typedef unsigned short opus_uint16; typedef long opus_int32; typedef unsigned long opus_uint32; #elif defined(CONFIG_TI_C6X) typedef short opus_int16; typedef unsigned short opus_uint16; typedef int opus_int32; typedef unsigned int opus_uint32; #else /* Give up, take a reasonable guess */ typedef short opus_int16; typedef unsigned short opus_uint16; typedef int opus_int32; typedef unsigned int opus_uint32; #endif #define opus_int int /* used for counters etc; at least 16 bits */ #define opus_int64 long long #define opus_int8 signed char #define opus_uint unsigned int /* used for counters etc; at least 16 bits */ #define opus_uint64 unsigned long long #define opus_uint8 unsigned char #endif /* OPUS_TYPES_H */ mumble-1.3.4/3rdparty/rnnoise-src/src/pitch.h0000664000175000017500000001111214010707350020712 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /** @file pitch.h @brief Pitch analysis */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef PITCH_H #define PITCH_H //#include "modes.h" //#include "cpu_support.h" #include "arch.h" void pitch_downsample(celt_sig *x[], opus_val16 *x_lp, int len, int C); void pitch_search(const opus_val16 *x_lp, opus_val16 *y, int len, int max_pitch, int *pitch); opus_val16 remove_doubling(opus_val16 *x, int maxperiod, int minperiod, int N, int *T0, int prev_period, opus_val16 prev_gain); /* OPT: This is the kernel you really want to optimize. It gets used a lot by the prefilter and by the PLC. */ static OPUS_INLINE void xcorr_kernel(const opus_val16 * x, const opus_val16 * y, opus_val32 sum[4], int len) { int j; opus_val16 y_0, y_1, y_2, y_3; celt_assert(len>=3); y_3=0; /* gcc doesn't realize that y_3 can't be used uninitialized */ y_0=*y++; y_1=*y++; y_2=*y++; for (j=0;j #endif static void find_best_pitch(opus_val32 *xcorr, opus_val16 *y, int len, int max_pitch, int *best_pitch #ifdef FIXED_POINT , int yshift, opus_val32 maxcorr #endif ) { int i, j; opus_val32 Syy=1; opus_val16 best_num[2]; opus_val32 best_den[2]; #ifdef FIXED_POINT int xshift; xshift = celt_ilog2(maxcorr)-14; #endif best_num[0] = -1; best_num[1] = -1; best_den[0] = 0; best_den[1] = 0; best_pitch[0] = 0; best_pitch[1] = 1; for (j=0;j0) { opus_val16 num; opus_val32 xcorr16; xcorr16 = EXTRACT16(VSHR32(xcorr[i], xshift)); #ifndef FIXED_POINT /* Considering the range of xcorr16, this should avoid both underflows and overflows (inf) when squaring xcorr16 */ xcorr16 *= 1e-12f; #endif num = MULT16_16_Q15(xcorr16,xcorr16); if (MULT16_32_Q15(num,best_den[1]) > MULT16_32_Q15(best_num[1],Syy)) { if (MULT16_32_Q15(num,best_den[0]) > MULT16_32_Q15(best_num[0],Syy)) { best_num[1] = best_num[0]; best_den[1] = best_den[0]; best_pitch[1] = best_pitch[0]; best_num[0] = num; best_den[0] = Syy; best_pitch[0] = i; } else { best_num[1] = num; best_den[1] = Syy; best_pitch[1] = i; } } } Syy += SHR32(MULT16_16(y[i+len],y[i+len]),yshift) - SHR32(MULT16_16(y[i],y[i]),yshift); Syy = MAX32(1, Syy); } } static void celt_fir5(const opus_val16 *x, const opus_val16 *num, opus_val16 *y, int N, opus_val16 *mem) { int i; opus_val16 num0, num1, num2, num3, num4; opus_val32 mem0, mem1, mem2, mem3, mem4; num0=num[0]; num1=num[1]; num2=num[2]; num3=num[3]; num4=num[4]; mem0=mem[0]; mem1=mem[1]; mem2=mem[2]; mem3=mem[3]; mem4=mem[4]; for (i=0;i>1;i++) x_lp[i] = SHR32(HALF32(HALF32(x[0][(2*i-1)]+x[0][(2*i+1)])+x[0][2*i]), shift); x_lp[0] = SHR32(HALF32(HALF32(x[0][1])+x[0][0]), shift); if (C==2) { for (i=1;i>1;i++) x_lp[i] += SHR32(HALF32(HALF32(x[1][(2*i-1)]+x[1][(2*i+1)])+x[1][2*i]), shift); x_lp[0] += SHR32(HALF32(HALF32(x[1][1])+x[1][0]), shift); } _celt_autocorr(x_lp, ac, NULL, 0, 4, len>>1); /* Noise floor -40 dB */ #ifdef FIXED_POINT ac[0] += SHR32(ac[0],13); #else ac[0] *= 1.0001f; #endif /* Lag windowing */ for (i=1;i<=4;i++) { /*ac[i] *= exp(-.5*(2*M_PI*.002*i)*(2*M_PI*.002*i));*/ #ifdef FIXED_POINT ac[i] -= MULT16_32_Q15(2*i*i, ac[i]); #else ac[i] -= ac[i]*(.008f*i)*(.008f*i); #endif } _celt_lpc(lpc, ac, 4); for (i=0;i<4;i++) { tmp = MULT16_16_Q15(QCONST16(.9f,15), tmp); lpc[i] = MULT16_16_Q15(lpc[i], tmp); } /* Add a zero */ lpc2[0] = lpc[0] + QCONST16(.8f,SIG_SHIFT); lpc2[1] = lpc[1] + MULT16_16_Q15(c1,lpc[0]); lpc2[2] = lpc[2] + MULT16_16_Q15(c1,lpc[1]); lpc2[3] = lpc[3] + MULT16_16_Q15(c1,lpc[2]); lpc2[4] = MULT16_16_Q15(c1,lpc[3]); celt_fir5(x_lp, lpc2, x_lp, len>>1, mem); } void celt_pitch_xcorr(const opus_val16 *_x, const opus_val16 *_y, opus_val32 *xcorr, int len, int max_pitch) { #if 0 /* This is a simple version of the pitch correlation that should work well on DSPs like Blackfin and TI C5x/C6x */ int i, j; #ifdef FIXED_POINT opus_val32 maxcorr=1; #endif for (i=0;i0); celt_assert((((unsigned char *)_x-(unsigned char *)NULL)&3)==0); for (i=0;i0); celt_assert(max_pitch>0); lag = len+max_pitch; #ifdef USE_MALLOC opus_val16 *x_lp4 = malloc(sizeof(*x_lp4) * len>>2); opus_val16 *y_lp4 = malloc(sizeof(*y_lp4) * lag>>2); opus_val32 *xcorr = malloc(sizeof(*xcorr) * max_pitch>>1); #else opus_val16 x_lp4[len>>2]; opus_val16 y_lp4[lag>>2]; opus_val32 xcorr[max_pitch>>1]; #endif /* Downsample by 2 again */ for (j=0;j>2;j++) x_lp4[j] = x_lp[2*j]; for (j=0;j>2;j++) y_lp4[j] = y[2*j]; #ifdef FIXED_POINT xmax = celt_maxabs16(x_lp4, len>>2); ymax = celt_maxabs16(y_lp4, lag>>2); shift = celt_ilog2(MAX32(1, MAX32(xmax, ymax)))-11; if (shift>0) { for (j=0;j>2;j++) x_lp4[j] = SHR16(x_lp4[j], shift); for (j=0;j>2;j++) y_lp4[j] = SHR16(y_lp4[j], shift); /* Use double the shift for a MAC */ shift *= 2; } else { shift = 0; } #endif /* Coarse search with 4x decimation */ #ifdef FIXED_POINT maxcorr = #endif celt_pitch_xcorr(x_lp4, y_lp4, xcorr, len>>2, max_pitch>>2); find_best_pitch(xcorr, y_lp4, len>>2, max_pitch>>2, best_pitch #ifdef FIXED_POINT , 0, maxcorr #endif ); /* Finer search with 2x decimation */ #ifdef FIXED_POINT maxcorr=1; #endif for (i=0;i>1;i++) { opus_val32 sum; xcorr[i] = 0; if (abs(i-2*best_pitch[0])>2 && abs(i-2*best_pitch[1])>2) continue; #ifdef FIXED_POINT sum = 0; for (j=0;j>1;j++) sum += SHR32(MULT16_16(x_lp[j],y[i+j]), shift); #else sum = celt_inner_prod(x_lp, y+i, len>>1); #endif xcorr[i] = MAX32(-1, sum); #ifdef FIXED_POINT maxcorr = MAX32(maxcorr, sum); #endif } find_best_pitch(xcorr, y, len>>1, max_pitch>>1, best_pitch #ifdef FIXED_POINT , shift+1, maxcorr #endif ); /* Refine by pseudo-interpolation */ if (best_pitch[0]>0 && best_pitch[0]<(max_pitch>>1)-1) { opus_val32 a, b, c; a = xcorr[best_pitch[0]-1]; b = xcorr[best_pitch[0]]; c = xcorr[best_pitch[0]+1]; if ((c-a) > MULT16_32_Q15(QCONST16(.7f,15),b-a)) offset = 1; else if ((a-c) > MULT16_32_Q15(QCONST16(.7f,15),b-c)) offset = -1; else offset = 0; } else { offset = 0; } *pitch = 2*best_pitch[0]-offset; #ifdef USE_MALLOC free(x_lp4); free(y_lp4); free(xcorr); #endif } #ifdef FIXED_POINT static opus_val16 compute_pitch_gain(opus_val32 xy, opus_val32 xx, opus_val32 yy) { opus_val32 x2y2; int sx, sy, shift; opus_val32 g; opus_val16 den; if (xy == 0 || xx == 0 || yy == 0) return 0; sx = celt_ilog2(xx)-14; sy = celt_ilog2(yy)-14; shift = sx + sy; x2y2 = SHR32(MULT16_16(VSHR32(xx, sx), VSHR32(yy, sy)), 14); if (shift & 1) { if (x2y2 < 32768) { x2y2 <<= 1; shift--; } else { x2y2 >>= 1; shift++; } } den = celt_rsqrt_norm(x2y2); g = MULT16_32_Q15(den, xy); g = VSHR32(g, (shift>>1)-1); return EXTRACT16(MIN32(g, Q15ONE)); } #else static opus_val16 compute_pitch_gain(opus_val32 xy, opus_val32 xx, opus_val32 yy) { return xy/sqrt(1+xx*yy); } #endif static const int second_check[16] = {0, 0, 3, 2, 3, 2, 5, 2, 3, 2, 3, 2, 5, 2, 3, 2}; opus_val16 remove_doubling(opus_val16 *x, int maxperiod, int minperiod, int N, int *T0_, int prev_period, opus_val16 prev_gain) { int k, i, T, T0; opus_val16 g, g0; opus_val16 pg; opus_val32 xy,xx,yy,xy2; #ifdef USE_MALLOC opus_val32 *xcorr = malloc(sizeof(*xcorr) * 3); #else opus_val32 xcorr[3]; #endif opus_val32 best_xy, best_yy; int offset; int minperiod0; minperiod0 = minperiod; maxperiod /= 2; minperiod /= 2; *T0_ /= 2; prev_period /= 2; N /= 2; x += maxperiod; if (*T0_>=maxperiod) *T0_=maxperiod-1; T = T0 = *T0_; #ifdef USE_MALLOC opus_val16 *yy_lookup = malloc(sizeof(*yy_lookup) * maxperiod+1); #else opus_val32 yy_lookup[maxperiod+1]; #endif dual_inner_prod(x, x, x-T0, N, &xx, &xy); yy_lookup[0] = xx; yy=xx; for (i=1;i<=maxperiod;i++) { yy = yy+MULT16_16(x[-i],x[-i])-MULT16_16(x[N-i],x[N-i]); yy_lookup[i] = MAX32(0, yy); } yy = yy_lookup[T0]; best_xy = xy; best_yy = yy; g = g0 = compute_pitch_gain(xy, xx, yy); /* Look for any pitch at T/k */ for (k=2;k<=15;k++) { int T1, T1b; opus_val16 g1; opus_val16 cont=0; opus_val16 thresh; T1 = (2*T0+k)/(2*k); if (T1 < minperiod) break; /* Look for another strong correlation at T1b */ if (k==2) { if (T1+T0>maxperiod) T1b = T0; else T1b = T0+T1; } else { T1b = (2*second_check[k]*T0+k)/(2*k); } dual_inner_prod(x, &x[-T1], &x[-T1b], N, &xy, &xy2); xy = HALF32(xy + xy2); yy = HALF32(yy_lookup[T1] + yy_lookup[T1b]); g1 = compute_pitch_gain(xy, xx, yy); if (abs(T1-prev_period)<=1) cont = prev_gain; else if (abs(T1-prev_period)<=2 && 5*k*k < T0) cont = HALF16(prev_gain); else cont = 0; thresh = MAX16(QCONST16(.3f,15), MULT16_16_Q15(QCONST16(.7f,15),g0)-cont); /* Bias against very high pitch (very short period) to avoid false-positives due to short-term correlation */ if (T1<3*minperiod) thresh = MAX16(QCONST16(.4f,15), MULT16_16_Q15(QCONST16(.85f,15),g0)-cont); else if (T1<2*minperiod) thresh = MAX16(QCONST16(.5f,15), MULT16_16_Q15(QCONST16(.9f,15),g0)-cont); if (g1 > thresh) { best_xy = xy; best_yy = yy; T = T1; g = g1; } } best_xy = MAX32(0, best_xy); if (best_yy <= best_xy) pg = Q15ONE; else pg = best_xy/(best_yy+1); for (k=0;k<3;k++) xcorr[k] = celt_inner_prod(x, x-(T+k-1), N); if ((xcorr[2]-xcorr[0]) > MULT16_32_Q15(QCONST16(.7f,15),xcorr[1]-xcorr[0])) offset = 1; else if ((xcorr[0]-xcorr[2]) > MULT16_32_Q15(QCONST16(.7f,15),xcorr[1]-xcorr[2])) offset = -1; else offset = 0; if (pg > g) pg = g; *T0_ = 2*T+offset; if (*T0_ #include "rnnoise.h" #define FRAME_SIZE 480 int main(int argc, char **argv) { int i; int first = 1; float x[FRAME_SIZE]; FILE *f1, *fout; DenoiseState *st; st = rnnoise_create(); if (argc!=3) { fprintf(stderr, "usage: %s \n", argv[0]); return 1; } f1 = fopen(argv[1], "r"); fout = fopen(argv[2], "w"); while (1) { short tmp[FRAME_SIZE]; fread(tmp, sizeof(short), FRAME_SIZE, f1); if (feof(f1)) break; for (i=0;i /dev/null; then \ if [ ! -e $(top_srcdir)/package_version ]; then \ echo 'PACKAGE_VERSION="unknown"' > $(top_srcdir)/package_version; \ fi; \ . $(top_srcdir)/package_version || exit 1; \ [ "$(PACKAGE_VERSION)" != "$$PACKAGE_VERSION" ] || exit 0; \ fi; \ touch $@ force: # Create a minimal package_version file when make dist is run. dist-hook: echo 'PACKAGE_VERSION="$(PACKAGE_VERSION)"' > $(top_distdir)/package_version .PHONY: rnnoise install-rnnoise docs install-docs mumble-1.3.4/3rdparty/rnnoise-src/m4/0000775000175000017500000000000014010707350017167 5ustar builderbuildermumble-1.3.4/3rdparty/rnnoise-src/m4/attributes.m40000664000175000017500000002474714010707350021635 0ustar builderbuilderdnl Macros to check the presence of generic (non-typed) symbols. dnl Copyright (c) 2006-2007 Diego Pettenò dnl Copyright (c) 2006-2007 xine project dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2, or (at your option) dnl any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA dnl 02110-1301, USA. dnl dnl As a special exception, the copyright owners of the dnl macro gives unlimited permission to copy, distribute and modify the dnl configure scripts that are the output of Autoconf when processing the dnl Macro. You need not follow the terms of the GNU General Public dnl License when using or distributing such scripts, even though portions dnl of the text of the Macro appear in them. The GNU General Public dnl License (GPL) does govern all other use of the material that dnl constitutes the Autoconf Macro. dnl dnl This special exception to the GPL applies to versions of the dnl Autoconf Macro released by this project. When you make and dnl distribute a modified version of the Autoconf Macro, you may extend dnl this special exception to the GPL to apply to your modified version as dnl well. dnl Check if the flag is supported by compiler dnl CC_CHECK_CFLAGS_SILENT([FLAG], [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND]) AC_DEFUN([CC_CHECK_CFLAGS_SILENT], [ AC_CACHE_VAL(AS_TR_SH([cc_cv_cflags_$1]), [ac_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $1" AC_LINK_IFELSE([AC_LANG_SOURCE([int main() { return 0; }])], [eval "AS_TR_SH([cc_cv_cflags_$1])='yes'"], [eval "AS_TR_SH([cc_cv_cflags_$1])='no'"]) CFLAGS="$ac_save_CFLAGS" ]) AS_IF([eval test x$]AS_TR_SH([cc_cv_cflags_$1])[ = xyes], [$2], [$3]) ]) dnl Check if the flag is supported by compiler (cacheable) dnl CC_CHECK_CFLAGS([FLAG], [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND]) AC_DEFUN([CC_CHECK_CFLAGS], [ AC_CACHE_CHECK([if $CC supports $1 flag], AS_TR_SH([cc_cv_cflags_$1]), CC_CHECK_CFLAGS_SILENT([$1]) dnl Don't execute actions here! ) AS_IF([eval test x$]AS_TR_SH([cc_cv_cflags_$1])[ = xyes], [$2], [$3]) ]) dnl CC_CHECK_CFLAG_APPEND(FLAG, [action-if-found], [action-if-not-found]) dnl Check for CFLAG and appends them to CFLAGS if supported AC_DEFUN([CC_CHECK_CFLAG_APPEND], [ AC_CACHE_CHECK([if $CC supports $1 flag], AS_TR_SH([cc_cv_cflags_$1]), CC_CHECK_CFLAGS_SILENT([$1]) dnl Don't execute actions here! ) AS_IF([eval test x$]AS_TR_SH([cc_cv_cflags_$1])[ = xyes], [CFLAGS="$CFLAGS $1"; $2], [$3]) ]) dnl CC_CHECK_CFLAGS_APPEND([FLAG1 FLAG2], [action-if-found], [action-if-not]) AC_DEFUN([CC_CHECK_CFLAGS_APPEND], [ for flag in $1; do CC_CHECK_CFLAG_APPEND($flag, [$2], [$3]) done ]) dnl Check if the flag is supported by linker (cacheable) dnl CC_CHECK_LDFLAGS([FLAG], [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND]) AC_DEFUN([CC_CHECK_LDFLAGS], [ AC_CACHE_CHECK([if $CC supports $1 flag], AS_TR_SH([cc_cv_ldflags_$1]), [ac_save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $1" AC_LINK_IFELSE([AC_LANG_SOURCE([int main() { return 1; }])], [eval "AS_TR_SH([cc_cv_ldflags_$1])='yes'"], [eval "AS_TR_SH([cc_cv_ldflags_$1])="]) LDFLAGS="$ac_save_LDFLAGS" ]) AS_IF([eval test x$]AS_TR_SH([cc_cv_ldflags_$1])[ = xyes], [$2], [$3]) ]) dnl define the LDFLAGS_NOUNDEFINED variable with the correct value for dnl the current linker to avoid undefined references in a shared object. AC_DEFUN([CC_NOUNDEFINED], [ dnl We check $host for which systems to enable this for. AC_REQUIRE([AC_CANONICAL_HOST]) case $host in dnl FreeBSD (et al.) does not complete linking for shared objects when pthreads dnl are requested, as different implementations are present; to avoid problems dnl use -Wl,-z,defs only for those platform not behaving this way. *-freebsd* | *-openbsd*) ;; *) dnl First of all check for the --no-undefined variant of GNU ld. This allows dnl for a much more readable commandline, so that people can understand what dnl it does without going to look for what the heck -z defs does. for possible_flags in "-Wl,--no-undefined" "-Wl,-z,defs"; do CC_CHECK_LDFLAGS([$possible_flags], [LDFLAGS_NOUNDEFINED="$possible_flags"]) break done ;; esac AC_SUBST([LDFLAGS_NOUNDEFINED]) ]) dnl Check for a -Werror flag or equivalent. -Werror is the GCC dnl and ICC flag that tells the compiler to treat all the warnings dnl as fatal. We usually need this option to make sure that some dnl constructs (like attributes) are not simply ignored. dnl dnl Other compilers don't support -Werror per se, but they support dnl an equivalent flag: dnl - Sun Studio compiler supports -errwarn=%all AC_DEFUN([CC_CHECK_WERROR], [ AC_CACHE_CHECK( [for $CC way to treat warnings as errors], [cc_cv_werror], [CC_CHECK_CFLAGS_SILENT([-Werror], [cc_cv_werror=-Werror], [CC_CHECK_CFLAGS_SILENT([-errwarn=%all], [cc_cv_werror=-errwarn=%all])]) ]) ]) AC_DEFUN([CC_CHECK_ATTRIBUTE], [ AC_REQUIRE([CC_CHECK_WERROR]) AC_CACHE_CHECK([if $CC supports __attribute__(( ifelse([$2], , [$1], [$2]) ))], AS_TR_SH([cc_cv_attribute_$1]), [ac_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $cc_cv_werror" AC_COMPILE_IFELSE([AC_LANG_SOURCE([$3])], [eval "AS_TR_SH([cc_cv_attribute_$1])='yes'"], [eval "AS_TR_SH([cc_cv_attribute_$1])='no'"]) CFLAGS="$ac_save_CFLAGS" ]) AS_IF([eval test x$]AS_TR_SH([cc_cv_attribute_$1])[ = xyes], [AC_DEFINE( AS_TR_CPP([SUPPORT_ATTRIBUTE_$1]), 1, [Define this if the compiler supports __attribute__(( ifelse([$2], , [$1], [$2]) ))] ) $4], [$5]) ]) AC_DEFUN([CC_ATTRIBUTE_CONSTRUCTOR], [ CC_CHECK_ATTRIBUTE( [constructor],, [extern void foo(); void __attribute__((constructor)) ctor() { foo(); }], [$1], [$2]) ]) AC_DEFUN([CC_ATTRIBUTE_DESTRUCTOR], [ CC_CHECK_ATTRIBUTE( [destructor],, [extern void foo(); void __attribute__((destructor)) dtor() { foo(); }], [$1], [$2]) ]) AC_DEFUN([CC_ATTRIBUTE_FORMAT], [ CC_CHECK_ATTRIBUTE( [format], [format(printf, n, n)], [void __attribute__((format(printf, 1, 2))) printflike(const char *fmt, ...) { fmt = (void *)0; }], [$1], [$2]) ]) AC_DEFUN([CC_ATTRIBUTE_FORMAT_ARG], [ CC_CHECK_ATTRIBUTE( [format_arg], [format_arg(printf)], [char *__attribute__((format_arg(1))) gettextlike(const char *fmt) { fmt = (void *)0; }], [$1], [$2]) ]) AC_DEFUN([CC_ATTRIBUTE_VISIBILITY], [ CC_CHECK_ATTRIBUTE( [visibility_$1], [visibility("$1")], [void __attribute__((visibility("$1"))) $1_function() { }], [$2], [$3]) ]) AC_DEFUN([CC_ATTRIBUTE_NONNULL], [ CC_CHECK_ATTRIBUTE( [nonnull], [nonnull()], [void __attribute__((nonnull())) some_function(void *foo, void *bar) { foo = (void*)0; bar = (void*)0; }], [$1], [$2]) ]) AC_DEFUN([CC_ATTRIBUTE_UNUSED], [ CC_CHECK_ATTRIBUTE( [unused], , [void some_function(void *foo, __attribute__((unused)) void *bar);], [$1], [$2]) ]) AC_DEFUN([CC_ATTRIBUTE_SENTINEL], [ CC_CHECK_ATTRIBUTE( [sentinel], , [void some_function(void *foo, ...) __attribute__((sentinel));], [$1], [$2]) ]) AC_DEFUN([CC_ATTRIBUTE_DEPRECATED], [ CC_CHECK_ATTRIBUTE( [deprecated], , [void some_function(void *foo, ...) __attribute__((deprecated));], [$1], [$2]) ]) AC_DEFUN([CC_ATTRIBUTE_ALIAS], [ CC_CHECK_ATTRIBUTE( [alias], [weak, alias], [void other_function(void *foo) { } void some_function(void *foo) __attribute__((weak, alias("other_function")));], [$1], [$2]) ]) AC_DEFUN([CC_ATTRIBUTE_MALLOC], [ CC_CHECK_ATTRIBUTE( [malloc], , [void * __attribute__((malloc)) my_alloc(int n);], [$1], [$2]) ]) AC_DEFUN([CC_ATTRIBUTE_PACKED], [ CC_CHECK_ATTRIBUTE( [packed], , [struct astructure { char a; int b; long c; void *d; } __attribute__((packed)); char assert@<:@(sizeof(struct astructure) == (sizeof(char)+sizeof(int)+sizeof(long)+sizeof(void*)))-1@:>@;], [$1], [$2]) ]) AC_DEFUN([CC_ATTRIBUTE_CONST], [ CC_CHECK_ATTRIBUTE( [const], , [int __attribute__((const)) twopow(int n) { return 1 << n; } ], [$1], [$2]) ]) AC_DEFUN([CC_FLAG_VISIBILITY], [ AC_REQUIRE([CC_CHECK_WERROR]) AC_CACHE_CHECK([if $CC supports -fvisibility=hidden], [cc_cv_flag_visibility], [cc_flag_visibility_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $cc_cv_werror" CC_CHECK_CFLAGS_SILENT([-fvisibility=hidden], cc_cv_flag_visibility='yes', cc_cv_flag_visibility='no') CFLAGS="$cc_flag_visibility_save_CFLAGS"]) AS_IF([test "x$cc_cv_flag_visibility" = "xyes"], [AC_DEFINE([SUPPORT_FLAG_VISIBILITY], 1, [Define this if the compiler supports the -fvisibility flag]) $1], [$2]) ]) AC_DEFUN([CC_FUNC_EXPECT], [ AC_REQUIRE([CC_CHECK_WERROR]) AC_CACHE_CHECK([if compiler has __builtin_expect function], [cc_cv_func_expect], [ac_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $cc_cv_werror" AC_COMPILE_IFELSE([AC_LANG_SOURCE( [int some_function() { int a = 3; return (int)__builtin_expect(a, 3); }])], [cc_cv_func_expect=yes], [cc_cv_func_expect=no]) CFLAGS="$ac_save_CFLAGS" ]) AS_IF([test "x$cc_cv_func_expect" = "xyes"], [AC_DEFINE([SUPPORT__BUILTIN_EXPECT], 1, [Define this if the compiler supports __builtin_expect() function]) $1], [$2]) ]) AC_DEFUN([CC_ATTRIBUTE_ALIGNED], [ AC_REQUIRE([CC_CHECK_WERROR]) AC_CACHE_CHECK([highest __attribute__ ((aligned ())) supported], [cc_cv_attribute_aligned], [ac_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $cc_cv_werror" for cc_attribute_align_try in 64 32 16 8 4 2; do AC_COMPILE_IFELSE([AC_LANG_SOURCE([ int main() { static char c __attribute__ ((aligned($cc_attribute_align_try))) = 0; return c; }])], [cc_cv_attribute_aligned=$cc_attribute_align_try; break]) done CFLAGS="$ac_save_CFLAGS" ]) if test "x$cc_cv_attribute_aligned" != "x"; then AC_DEFINE_UNQUOTED([ATTRIBUTE_ALIGNED_MAX], [$cc_cv_attribute_aligned], [Define the highest alignment supported]) fi ]) mumble-1.3.4/3rdparty/rnnoise-src/doc/0000775000175000017500000000000014010707350017414 5ustar builderbuildermumble-1.3.4/3rdparty/rnnoise-src/doc/Doxyfile.in0000664000175000017500000000100614010707350021524 0ustar builderbuilder# Process with doxygen to generate API documentation PROJECT_NAME = @PACKAGE_NAME@ PROJECT_NUMBER = @PACKAGE_VERSION@ PROJECT_BRIEF = "RNN-based noise suppressor." INPUT = @top_srcdir@/include/rnnoise.h OPTIMIZE_OUTPUT_FOR_C = YES QUIET = YES WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_NO_PARAMDOC = YES JAVADOC_AUTOBRIEF = YES SORT_MEMBER_DOCS = NO HAVE_DOT = @HAVE_DOT@ mumble-1.3.4/3rdparty/rnnoise-src/configure.ac0000664000175000017500000000730214010707350021137 0ustar builderbuilder# autoconf source script for generating configure dnl The package_version file will be automatically synced to the git revision dnl by the update_version script when configured in the repository, but will dnl remain constant in tarball releases unless it is manually edited. m4_define([CURRENT_VERSION], m4_esyscmd([ ./update_version 2>/dev/null || true if test -e package_version; then . ./package_version printf "$PACKAGE_VERSION" else printf "unknown" fi ])) AC_INIT([rnnoise],[CURRENT_VERSION],[jmvalin@jmvalin.ca]) AC_CONFIG_SRCDIR([src/denoise.c]) AC_CONFIG_MACRO_DIR([m4]) AC_USE_SYSTEM_EXTENSIONS AC_SYS_LARGEFILE AM_INIT_AUTOMAKE([1.11 foreign no-define dist-zip subdir-objects]) AM_MAINTAINER_MODE([enable]) AC_C_INLINE LT_INIT m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) AC_DEFINE([RNNOISE_BUILD], [], [This is a build of the library]) dnl Library versioning for libtool. dnl Please update these for releases. dnl CURRENT, REVISION, AGE dnl - library source changed -> increment REVISION dnl - interfaces added/removed/changed -> increment CURRENT, REVISION = 0 dnl - interfaces added -> increment AGE dnl - interfaces removed -> AGE = 0 OP_LT_CURRENT=4 OP_LT_REVISION=1 OP_LT_AGE=4 AC_SUBST(OP_LT_CURRENT) AC_SUBST(OP_LT_REVISION) AC_SUBST(OP_LT_AGE) CC_CHECK_CFLAGS_APPEND( [-pedantic -Wall -Wextra -Wno-sign-compare -Wno-parentheses -Wno-long-long]) # Platform-specific tweaks case $host in *-mingw*) # -std=c89 causes some warnings under mingw. CC_CHECK_CFLAGS_APPEND([-U__STRICT_ANSI__]) # We need WINNT>=0x501 (WindowsXP) for getaddrinfo/freeaddrinfo. # It's okay to define this even when HTTP support is disabled, as it only # affects header declarations, not linking (unless we actually use some # XP-only functions). AC_DEFINE_UNQUOTED(_WIN32_WINNT,0x501, [We need at least WindowsXP for getaddrinfo/freeaddrinfo]) host_mingw=true ;; esac AM_CONDITIONAL(OP_WIN32, test "$host_mingw" = "true") AC_ARG_ENABLE([assertions], AS_HELP_STRING([--enable-assertions], [Enable assertions in code]),, enable_assertions=no) AS_IF([test "$enable_assertions" = "yes"], [ AC_DEFINE([OP_ENABLE_ASSERTIONS], [1], [Enable assertions in code]) ]) AC_ARG_ENABLE([examples], AS_HELP_STRING([--disable-examples], [Do not build example applications]),, enable_examples=yes) AM_CONDITIONAL([OP_ENABLE_EXAMPLES], [test "$enable_examples" = "yes"]) AS_CASE(["$ac_cv_search_lrintf"], ["no"],[], ["none required"],[], [lrintf_lib="$ac_cv_search_lrintf"]) LT_LIB_M AC_SUBST([lrintf_lib]) CC_ATTRIBUTE_VISIBILITY([default], [ CC_FLAG_VISIBILITY([CFLAGS="${CFLAGS} -fvisibility=hidden"]) ]) dnl Check for doxygen AC_ARG_ENABLE([doc], AS_HELP_STRING([--disable-doc], [Do not build API documentation]),, [enable_doc=yes] ) AS_IF([test "$enable_doc" = "yes"], [ AC_CHECK_PROG([HAVE_DOXYGEN], [doxygen], [yes], [no]) AC_CHECK_PROG([HAVE_DOT], [dot], [yes], [no]) ],[ HAVE_DOXYGEN=no ]) AM_CONDITIONAL([HAVE_DOXYGEN], [test "$HAVE_DOXYGEN" = "yes"]) AC_CONFIG_FILES([ Makefile rnnoise.pc rnnoise-uninstalled.pc doc/Doxyfile ]) AC_CONFIG_HEADERS([config.h]) AC_OUTPUT AC_MSG_NOTICE([ ------------------------------------------------------------------------ $PACKAGE_NAME $PACKAGE_VERSION: Automatic configuration OK. Assertions ................... ${enable_assertions} Hidden visibility ............ ${cc_cv_flag_visibility} API code examples ............ ${enable_examples} API documentation ............ ${enable_doc} ------------------------------------------------------------------------ ]) mumble-1.3.4/3rdparty/xinputcheck-build/0000775000175000017500000000000014010707273020033 5ustar builderbuildermumble-1.3.4/3rdparty/xinputcheck-build/xinputcheck-build.pro0000664000175000017500000000054414010707273024202 0ustar builderbuilderinclude(../../qmake/compiler.pri) BUILDDIR=$$basename(PWD) SOURCEDIR=$$replace(BUILDDIR,-lib-build,-src) TEMPLATE = lib CONFIG -= qt CONFIG += debug_and_release CONFIG -= warn_on CONFIG += warn_off CONFIG += static VPATH = ../xinputcheck-src TARGET = xinputcheck INCLUDEPATH = ../$$SOURCEDIR SOURCES *= xinputcheck.cpp include(../../qmake/symbols.pri) mumble-1.3.4/3rdparty/rnnoise-build/0000775000175000017500000000000014010707273017163 5ustar builderbuildermumble-1.3.4/3rdparty/rnnoise-build/rnnoise-build.pro0000664000175000017500000000230414010707273022456 0ustar builderbuilderinclude(../../qmake/compiler.pri) BUILDDIR=$$basename(PWD) SOURCEDIR=$$replace(BUILDDIR,-build,-src) !win32 { VERSION=0 #$$ Fool packaging script } !exists(../$$SOURCEDIR/COPYING) { message("The $$SOURCEDIR/ directory was not found. Please update your submodules (git submodule update --init).") error("Aborting configuration") } TEMPLATE = lib CONFIG -= qt CONFIG += debug_and_release VPATH = ../$$SOURCEDIR TARGET = rnnoise DEFINES += HAVE_CONFIG_H !CONFIG(third-party-warnings) { # We ignore warnings in third party builds. We won't actually look # at them and they clutter out our warnings. CONFIG -= warn_on CONFIG += warn_off } QMAKE_CFLAGS -= -fPIE -pie win32 { DEFINES += WIN32 _WIN32 DEFINES += DLL_EXPORT CONFIG -= static CONFIG += shared } win32-msvc* { DEFINES += _USE_MATH_DEFINES # To define M_PI DEFINES += USE_MALLOC # To use malloc() and free() instead of variable length arrays } unix { CONFIG += staticlib contains(QMAKE_CFLAGS, -ffast-math) { DEFINES += FLOAT_APPROX } } INCLUDEPATH *= \ ../$$SOURCEDIR/include \ SOURCES *= \ src/rnn_data.c \ src/rnn.c \ src/pitch.c \ src/kiss_fft.c \ src/denoise.c \ src/celt_lpc.c include(../../qmake/symbols.pri) mumble-1.3.4/3rdparty/rnnoise-build/config.h0000664000175000017500000000671514010707273020612 0ustar builderbuilder/* config.h. Generated from config.h.in by configure. */ /* config.h.in. Generated from configure.ac by autoheader. */ /* Define to 1 if you have the header file. */ #define HAVE_DLFCN_H 1 /* Define to 1 if you have the header file. */ #define HAVE_INTTYPES_H 1 /* Define to 1 if you have the header file. */ #define HAVE_MEMORY_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STDINT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STDLIB_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STRINGS_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STRING_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_STAT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_TYPES_H 1 /* Define to 1 if you have the header file. */ #define HAVE_UNISTD_H 1 /* Define to the sub-directory where libtool stores uninstalled libraries. */ #define LT_OBJDIR ".libs/" /* Enable assertions in code */ /* #undef OP_ENABLE_ASSERTIONS */ /* Define to the address where bug reports for this package should be sent. */ #define PACKAGE_BUGREPORT "jmvalin@jmvalin.ca" /* Define to the full name of this package. */ #define PACKAGE_NAME "rnnoise" /* Define to the full name and version of this package. */ #define PACKAGE_STRING "rnnoise unknown" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "rnnoise" /* Define to the home page for this package. */ #define PACKAGE_URL "" /* Define to the version of this package. */ #define PACKAGE_VERSION "unknown" /* This is a build of the library */ #define RNNOISE_BUILD /**/ /* Define to 1 if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* Define this if the compiler supports __attribute__(( ifelse([visibility("default")], , [visibility_default], [visibility("default")]) )) */ #define SUPPORT_ATTRIBUTE_VISIBILITY_DEFAULT 1 /* Define this if the compiler supports the -fvisibility flag */ #define SUPPORT_FLAG_VISIBILITY 1 /* Enable extensions on AIX 3, Interix. */ #ifndef _ALL_SOURCE # define _ALL_SOURCE 1 #endif /* Enable GNU extensions on systems that have them. */ #ifndef _GNU_SOURCE # define _GNU_SOURCE 1 #endif /* Enable threading extensions on Solaris. */ #ifndef _POSIX_PTHREAD_SEMANTICS # define _POSIX_PTHREAD_SEMANTICS 1 #endif /* Enable extensions on HP NonStop. */ #ifndef _TANDEM_SOURCE # define _TANDEM_SOURCE 1 #endif /* Enable general extensions on Solaris. */ #ifndef __EXTENSIONS__ # define __EXTENSIONS__ 1 #endif /* Enable large inode numbers on Mac OS X 10.5. */ #ifndef _DARWIN_USE_64_BIT_INODE # define _DARWIN_USE_64_BIT_INODE 1 #endif /* Number of bits in a file offset, on hosts where this is settable. */ /* #undef _FILE_OFFSET_BITS */ /* Define for large files, on AIX-style hosts. */ /* #undef _LARGE_FILES */ /* Define to 1 if on MINIX. */ /* #undef _MINIX */ /* Define to 2 if the system does not provide POSIX.1 features except with this defined. */ /* #undef _POSIX_1_SOURCE */ /* Define to 1 if you need to in order for `stat' and other things to work. */ /* #undef _POSIX_SOURCE */ /* We need at least WindowsXP for getaddrinfo/freeaddrinfo */ /* #undef _WIN32_WINNT */ /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus /* #undef inline */ #endif mumble-1.3.4/3rdparty/celt-0.11.0-src/0000775000175000017500000000000014010707315016635 5ustar builderbuildermumble-1.3.4/3rdparty/celt-0.11.0-src/AUTHORS0000664000175000017500000000000014010707315017673 0ustar builderbuildermumble-1.3.4/3rdparty/celt-0.11.0-src/Doxyfile.devel0000664000175000017500000002404014010707315021441 0ustar builderbuilder# Doxyfile 1.5.3 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- DOXYFILE_ENCODING = UTF-8 PROJECT_NAME = CELT PROJECT_NUMBER = 0.11.1 OUTPUT_DIRECTORY = doc/devel CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class " \ "The $name widget " \ "The $name file " \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = YES STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO QT_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES SEPARATE_MEMBER_PAGES = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = YES OPTIMIZE_OUTPUT_JAVA = NO BUILTIN_STL_SUPPORT = NO CPP_CLI_SUPPORT = NO DISTRIBUTE_GROUP_DOC = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = NO EXTRACT_STATIC = NO EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO EXTRACT_ANON_NSPACES = NO HIDE_UNDOC_MEMBERS = YES HIDE_UNDOC_CLASSES = YES HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = YES HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES SHOW_DIRECTORIES = NO FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_NO_PARAMDOC = NO WARN_FORMAT = "$file:$line: $text " WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = libcelt INPUT_ENCODING = UTF-8 FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.d \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.dox \ *.py \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM \ *.PY RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXCLUDE_SYMBOLS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = YES INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = YES REFERENCES_RELATION = YES REFERENCES_LINK_SOURCE = YES USE_HTAGS = NO VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = HTML_FOOTER = HTML_STYLESHEET = HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO HTML_DYNAMIC_SECTIONS = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = YES LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = YES USE_PDFLATEX = YES LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = YES MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO MSCGEN_PATH = HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES GROUP_GRAPHS = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = NO INCLUDED_BY_GRAPH = NO CALL_GRAPH = NO CALLER_GRAPH = NO GRAPHICAL_HIERARCHY = YES DIRECTORY_GRAPH = YES DOT_IMAGE_FORMAT = png DOT_PATH = DOTFILE_DIRS = DOT_GRAPH_MAX_NODES = 50 MAX_DOT_GRAPH_DEPTH = 1000 DOT_TRANSPARENT = NO DOT_MULTI_TARGETS = NO GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/0000775000175000017500000000000014010707315020253 5ustar builderbuildermumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/entdec.c0000664000175000017500000001766414010707315021677 0ustar builderbuilder/* Copyright (c) 2001-2011 Timothy B. Terriberry Copyright (c) 2008-2009 Xiph.Org Foundation */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "os_support.h" #include "arch.h" #include "entdec.h" #include "mfrngcod.h" /*A range decoder. This is an entropy decoder based upon \cite{Mar79}, which is itself a rediscovery of the FIFO arithmetic code introduced by \cite{Pas76}. It is very similar to arithmetic encoding, except that encoding is done with digits in any base, instead of with bits, and so it is faster when using larger bases (i.e.: a byte). The author claims an average waste of $\frac{1}{2}\log_b(2b)$ bits, where $b$ is the base, longer than the theoretical optimum, but to my knowledge there is no published justification for this claim. This only seems true when using near-infinite precision arithmetic so that the process is carried out with no rounding errors. IBM (the author's employer) never sought to patent the idea, and to my knowledge the algorithm is unencumbered by any patents, though its performance is very competitive with proprietary arithmetic coding. The two are based on very similar ideas, however. An excellent description of implementation details is available at http://www.arturocampos.com/ac_range.html A recent work \cite{MNW98} which proposes several changes to arithmetic encoding for efficiency actually re-discovers many of the principles behind range encoding, and presents a good theoretical analysis of them. End of stream is handled by writing out the smallest number of bits that ensures that the stream will be correctly decoded regardless of the value of any subsequent bits. ec_tell() can be used to determine how many bits were needed to decode all the symbols thus far; other data can be packed in the remaining bits of the input buffer. @PHDTHESIS{Pas76, author="Richard Clark Pasco", title="Source coding algorithms for fast data compression", school="Dept. of Electrical Engineering, Stanford University", address="Stanford, CA", month=May, year=1976 } @INPROCEEDINGS{Mar79, author="Martin, G.N.N.", title="Range encoding: an algorithm for removing redundancy from a digitised message", booktitle="Video & Data Recording Conference", year=1979, address="Southampton", month=Jul } @ARTICLE{MNW98, author="Alistair Moffat and Radford Neal and Ian H. Witten", title="Arithmetic Coding Revisited", journal="{ACM} Transactions on Information Systems", year=1998, volume=16, number=3, pages="256--294", month=Jul, URL="http://www.stanford.edu/class/ee398/handouts/papers/Moffat98ArithmCoding.pdf" }*/ static int ec_read_byte(ec_dec *_this){ return _this->offs<_this->storage?_this->buf[_this->offs++]:0; } static int ec_read_byte_from_end(ec_dec *_this){ return _this->end_offs<_this->storage? _this->buf[_this->storage-++(_this->end_offs)]:0; } /*Normalizes the contents of val and rng so that rng lies entirely in the high-order symbol.*/ static void ec_dec_normalize(ec_dec *_this){ /*If the range is too small, rescale it and input some bits.*/ while(_this->rng<=EC_CODE_BOT){ int sym; _this->nbits_total+=EC_SYM_BITS; _this->rng<<=EC_SYM_BITS; /*Use up the remaining bits from our last symbol.*/ sym=_this->rem; /*Read the next value from the input.*/ _this->rem=ec_read_byte(_this); /*Take the rest of the bits we need from this new symbol.*/ sym=(sym<rem)>>EC_SYM_BITS-EC_CODE_EXTRA; /*And subtract them from val, capped to be less than EC_CODE_TOP.*/ _this->val=(_this->val<buf=_buf; _this->storage=_storage; _this->end_offs=0; _this->end_window=0; _this->nend_bits=0; _this->offs=0; _this->rng=1U<rem=ec_read_byte(_this); _this->val=_this->rng-1-(_this->rem>>EC_SYM_BITS-EC_CODE_EXTRA); _this->error=0; /*Normalize the interval.*/ ec_dec_normalize(_this); /*This is the offset from which ec_tell() will subtract partial bits. This must be after the initial ec_dec_normalize(), or you will have to compensate for the bits that are read there.*/ _this->nbits_total=EC_CODE_BITS+1; } unsigned ec_decode(ec_dec *_this,unsigned _ft){ unsigned s; _this->ext=_this->rng/_ft; s=(unsigned)(_this->val/_this->ext); return _ft-EC_MINI(s+1,_ft); } unsigned ec_decode_bin(ec_dec *_this,unsigned _bits){ unsigned s; _this->ext=_this->rng>>_bits; s=(unsigned)(_this->val/_this->ext); return (1<<_bits)-EC_MINI(s+1,1<<_bits); } void ec_dec_update(ec_dec *_this,unsigned _fl,unsigned _fh,unsigned _ft){ ec_uint32 s; s=IMUL32(_this->ext,_ft-_fh); _this->val-=s; _this->rng=_fl>0?IMUL32(_this->ext,_fh-_fl):_this->rng-s; ec_dec_normalize(_this); } /*The probability of having a "one" is 1/(1<<_logp).*/ int ec_dec_bit_logp(ec_dec *_this,unsigned _logp){ ec_uint32 r; ec_uint32 d; ec_uint32 s; int ret; r=_this->rng; d=_this->val; s=r>>_logp; ret=dval=d-s; _this->rng=ret?s:r-s; ec_dec_normalize(_this); return ret; } int ec_dec_icdf(ec_dec *_this,const unsigned char *_icdf,unsigned _ftb){ ec_uint32 r; ec_uint32 d; ec_uint32 s; ec_uint32 t; int ret; s=_this->rng; d=_this->val; r=s>>_ftb; ret=-1; do{ t=s; s=IMUL32(r,_icdf[++ret]); } while(dval=d-s; _this->rng=t-s; ec_dec_normalize(_this); return ret; } ec_uint32 ec_dec_uint(ec_dec *_this,ec_uint32 _ft){ unsigned ft; unsigned s; int ftb; /*In order to optimize EC_ILOG(), it is undefined for the value 0.*/ celt_assert(_ft>1); _ft--; ftb=EC_ILOG(_ft); if(ftb>EC_UINT_BITS){ ec_uint32 t; ftb-=EC_UINT_BITS; ft=(unsigned)(_ft>>ftb)+1; s=ec_decode(_this,ft); ec_dec_update(_this,s,s+1,ft); t=(ec_uint32)s<error=1; return _ft; } else{ _ft++; s=ec_decode(_this,(unsigned)_ft); ec_dec_update(_this,s,s+1,(unsigned)_ft); return s; } } ec_uint32 ec_dec_bits(ec_dec *_this,unsigned _bits){ ec_window window; int available; ec_uint32 ret; window=_this->end_window; available=_this->nend_bits; if(available<_bits){ do{ window|=(ec_window)ec_read_byte_from_end(_this)<>=_bits; available-=_bits; _this->end_window=window; _this->nend_bits=available; _this->nbits_total+=_bits; return ret; } mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/entcode.c0000664000175000017500000000570214010707315022044 0ustar builderbuilder/* Copyright (c) 2001-2011 Timothy B. Terriberry */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "entcode.h" #if !defined(EC_CLZ) int ec_ilog(ec_uint32 _v){ /*On a Pentium M, this branchless version tested as the fastest on 1,000,000,000 random 32-bit integers, edging out a similar version with branches, and a 256-entry LUT version.*/ int ret; int m; ret=!!_v; m=!!(_v&0xFFFF0000)<<4; _v>>=m; ret|=m; m=!!(_v&0xFF00)<<3; _v>>=m; ret|=m; m=!!(_v&0xF0)<<2; _v>>=m; ret|=m; m=!!(_v&0xC)<<1; _v>>=m; ret|=m; ret+=!!(_v&0x2); return ret; } #endif ec_uint32 ec_tell_frac(ec_ctx *_this){ ec_uint32 nbits; ec_uint32 r; int l; int i; /*To handle the non-integral number of bits still left in the encoder/decoder state, we compute the worst-case number of bits of val that must be encoded to ensure that the value is inside the range for any possible subsequent bits. The computation here is independent of val itself (the decoder does not even track that value), even though the real number of bits used after ec_enc_done() may be 1 smaller if rng is a power of two and the corresponding trailing bits of val are all zeros. If we did try to track that special case, then coding a value with a probability of 1/(1<nbits_total<rng); r=_this->rng>>l-16; for(i=BITRES;i-->0;){ int b; r=r*r>>15; b=(int)(r>>16); l=l<<1|b; r>>=b; } return nbits-l; } mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/dump_modes.c0000664000175000017500000002752714010707315022570 0ustar builderbuilder/* Copyright (c) 2008 CSIRO Copyright (c) 2008-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "modes.h" #include "celt.h" #include "rate.h" #define INT16 "%d" #define INT32 "%d" #define FLOAT "%f" #ifdef FIXED_POINT #define WORD16 INT16 #define WORD32 INT32 #else #define WORD16 FLOAT #define WORD32 FLOAT #endif void dump_modes(FILE *file, CELTMode **modes, int nb_modes) { int i, j, k; fprintf(file, "/* The contents of this file is automatically generated and contains static\n"); fprintf(file, " definitions for some pre-defined modes */\n"); fprintf(file, "#include \"modes.h\"\n"); fprintf(file, "#include \"rate.h\"\n"); fprintf(file, "\n"); for (i=0;ishortMdctSize*mode->nbShortMdcts; standard = (mode->Fs == 400*(celt_int32)mode->shortMdctSize); framerate = mode->Fs/mode->shortMdctSize; if (!standard) { fprintf(file, "#ifndef DEF_EBANDS%d_%d\n", mode->Fs, mdctSize); fprintf(file, "#define DEF_EBANDS%d_%d\n", mode->Fs, mdctSize); fprintf (file, "static const celt_int16 eBands%d_%d[%d] = {\n", mode->Fs, mdctSize, mode->nbEBands+2); for (j=0;jnbEBands+2;j++) fprintf (file, "%d, ", mode->eBands[j]); fprintf (file, "};\n"); fprintf(file, "#endif\n"); fprintf(file, "\n"); } fprintf(file, "#ifndef DEF_WINDOW%d\n", mode->overlap); fprintf(file, "#define DEF_WINDOW%d\n", mode->overlap); fprintf (file, "static const celt_word16 window%d[%d] = {\n", mode->overlap, mode->overlap); for (j=0;joverlap;j++) fprintf (file, WORD16 ", ", mode->window[j]); fprintf (file, "};\n"); fprintf(file, "#endif\n"); fprintf(file, "\n"); if (!standard) { fprintf(file, "#ifndef DEF_ALLOC_VECTORS%d_%d\n", mode->Fs, mdctSize); fprintf(file, "#define DEF_ALLOC_VECTORS%d_%d\n", mode->Fs, mdctSize); fprintf (file, "static const unsigned char allocVectors%d_%d[%d] = {\n", mode->Fs, mdctSize, mode->nbEBands*mode->nbAllocVectors); for (j=0;jnbAllocVectors;j++) { for (k=0;knbEBands;k++) fprintf (file, "%2d, ", mode->allocVectors[j*mode->nbEBands+k]); fprintf (file, "\n"); } fprintf (file, "};\n"); fprintf(file, "#endif\n"); fprintf(file, "\n"); } fprintf(file, "#ifndef DEF_LOGN%d\n", framerate); fprintf(file, "#define DEF_LOGN%d\n", framerate); fprintf (file, "static const celt_int16 logN%d[%d] = {\n", framerate, mode->nbEBands); for (j=0;jnbEBands;j++) fprintf (file, "%d, ", mode->logN[j]); fprintf (file, "};\n"); fprintf(file, "#endif\n"); fprintf(file, "\n"); /* Pulse cache */ fprintf(file, "#ifndef DEF_PULSE_CACHE%d\n", mode->Fs/mdctSize); fprintf(file, "#define DEF_PULSE_CACHE%d\n", mode->Fs/mdctSize); fprintf (file, "static const celt_int16 cache_index%d[%d] = {\n", mode->Fs/mdctSize, (mode->maxLM+2)*mode->nbEBands); for (j=0;jnbEBands*(mode->maxLM+2);j++) fprintf (file, "%d, ", mode->cache.index[j]); fprintf (file, "};\n"); fprintf (file, "static const unsigned char cache_bits%d[%d] = {\n", mode->Fs/mdctSize, mode->cache.size); for (j=0;jcache.size;j++) fprintf (file, "%d, ", mode->cache.bits[j]); fprintf (file, "};\n"); fprintf (file, "static const unsigned char cache_caps%d[%d] = {\n", mode->Fs/mdctSize, (mode->maxLM+1)*2*mode->nbEBands); for (j=0;j<(mode->maxLM+1)*2*mode->nbEBands;j++) fprintf (file, "%d, ", mode->cache.caps[j]); fprintf (file, "};\n"); fprintf(file, "#endif\n"); fprintf(file, "\n"); /* FFT twiddles */ fprintf(file, "#ifndef FFT_TWIDDLES%d_%d\n", mode->Fs, mdctSize); fprintf(file, "#define FFT_TWIDDLES%d_%d\n", mode->Fs, mdctSize); fprintf (file, "static const kiss_twiddle_cpx fft_twiddles%d_%d[%d] = {\n", mode->Fs, mdctSize, mode->mdct.kfft[0]->nfft); for (j=0;jmdct.kfft[0]->nfft;j++) fprintf (file, "{" WORD16 ", " WORD16 "}, ", mode->mdct.kfft[0]->twiddles[j].r, mode->mdct.kfft[0]->twiddles[j].i); fprintf (file, "};\n"); /* FFT Bitrev tables */ for (k=0;k<=mode->mdct.maxshift;k++) { fprintf(file, "#ifndef FFT_BITREV%d\n", mode->mdct.kfft[k]->nfft); fprintf(file, "#define FFT_BITREV%d\n", mode->mdct.kfft[k]->nfft); fprintf (file, "static const celt_int16 fft_bitrev%d[%d] = {\n", mode->mdct.kfft[k]->nfft, mode->mdct.kfft[k]->nfft); for (j=0;jmdct.kfft[k]->nfft;j++) fprintf (file, "%d, ", mode->mdct.kfft[k]->bitrev[j]); fprintf (file, "};\n"); fprintf(file, "#endif\n"); fprintf(file, "\n"); } /* FFT States */ for (k=0;k<=mode->mdct.maxshift;k++) { fprintf(file, "#ifndef FFT_STATE%d_%d_%d\n", mode->Fs, mdctSize, k); fprintf(file, "#define FFT_STATE%d_%d_%d\n", mode->Fs, mdctSize, k); fprintf (file, "static const kiss_fft_state fft_state%d_%d_%d = {\n", mode->Fs, mdctSize, k); fprintf (file, "%d,\t/* nfft */\n", mode->mdct.kfft[k]->nfft); #ifndef FIXED_POINT fprintf (file, "%f,\t/* scale */\n", mode->mdct.kfft[k]->scale); #endif fprintf (file, "%d,\t/* shift */\n", mode->mdct.kfft[k]->shift); fprintf (file, "{"); for (j=0;j<2*MAXFACTORS;j++) fprintf (file, "%d, ", mode->mdct.kfft[k]->factors[j]); fprintf (file, "},\t/* factors */\n"); fprintf (file, "fft_bitrev%d,\t/* bitrev */\n", mode->mdct.kfft[k]->nfft); fprintf (file, "fft_twiddles%d_%d,\t/* bitrev */\n", mode->Fs, mdctSize); fprintf (file, "};\n"); fprintf(file, "#endif\n"); fprintf(file, "\n"); } fprintf(file, "#endif\n"); fprintf(file, "\n"); /* MDCT twiddles */ fprintf(file, "#ifndef MDCT_TWIDDLES%d\n", mdctSize); fprintf(file, "#define MDCT_TWIDDLES%d\n", mdctSize); fprintf (file, "static const celt_word16 mdct_twiddles%d[%d] = {\n", mdctSize, mode->mdct.n/4+1); for (j=0;j<=mode->mdct.n/4;j++) fprintf (file, WORD16 ", ", mode->mdct.trig[j]); fprintf (file, "};\n"); fprintf(file, "#endif\n"); fprintf(file, "\n"); /* Print the actual mode data */ fprintf(file, "static const CELTMode mode%d_%d_%d = {\n", mode->Fs, mdctSize, mode->overlap); fprintf(file, INT32 ",\t/* Fs */\n", mode->Fs); fprintf(file, "%d,\t/* overlap */\n", mode->overlap); fprintf(file, "%d,\t/* nbEBands */\n", mode->nbEBands); fprintf(file, "%d,\t/* effEBands */\n", mode->effEBands); fprintf(file, "{"); for (j=0;j<4;j++) fprintf(file, WORD16 ", ", mode->preemph[j]); fprintf(file, "},\t/* preemph */\n"); if (standard) fprintf(file, "eband5ms,\t/* eBands */\n"); else fprintf(file, "eBands%d_%d,\t/* eBands */\n", mode->Fs, mdctSize); fprintf(file, "%d,\t/* nbAllocVectors */\n", mode->nbAllocVectors); if (standard) fprintf(file, "band_allocation,\t/* allocVectors */\n"); else fprintf(file, "allocVectors%d_%d,\t/* allocVectors */\n", mode->Fs, mdctSize); fprintf(file, "{%d, %d, {", mode->mdct.n, mode->mdct.maxshift); for (k=0;k<=mode->mdct.maxshift;k++) fprintf(file, "&fft_state%d_%d_%d, ", mode->Fs, mdctSize, k); fprintf (file, "}, mdct_twiddles%d},\t/* mdct */\n", mdctSize); fprintf(file, "window%d,\t/* window */\n", mode->overlap); fprintf(file, "%d,\t/* maxLM */\n", mode->maxLM); fprintf(file, "%d,\t/* nbShortMdcts */\n", mode->nbShortMdcts); fprintf(file, "%d,\t/* shortMdctSize */\n", mode->shortMdctSize); fprintf(file, "logN%d,\t/* logN */\n", framerate); fprintf(file, "{%d, cache_index%d, cache_bits%d, cache_caps%d},\t/* cache */\n", mode->cache.size, mode->Fs/mdctSize, mode->Fs/mdctSize, mode->Fs/mdctSize); fprintf(file, "};\n"); } fprintf(file, "\n"); fprintf(file, "/* List of all the available modes */\n"); fprintf(file, "#define TOTAL_MODES %d\n", nb_modes); fprintf(file, "static const CELTMode * const static_mode_list[TOTAL_MODES] = {\n"); for (i=0;ishortMdctSize*mode->nbShortMdcts; fprintf(file, "&mode%d_%d_%d,\n", mode->Fs, mdctSize, mode->overlap); } fprintf(file, "};\n"); } void dump_header(FILE *file, CELTMode **modes, int nb_modes) { int i; int channels = 0; int frame_size = 0; int overlap = 0; fprintf (file, "/* This header file is generated automatically*/\n"); for (i=0;ishortMdctSize*mode->nbShortMdcts; else if (frame_size != mode->shortMdctSize*mode->nbShortMdcts) frame_size = -1; if (overlap==0) overlap = mode->overlap; else if (overlap != mode->overlap) overlap = -1; } if (channels>0) { fprintf (file, "#define CHANNELS(mode) %d\n", channels); if (channels==1) fprintf (file, "#define DISABLE_STEREO\n"); } if (frame_size>0) { fprintf (file, "#define FRAMESIZE(mode) %d\n", frame_size); } if (overlap>0) { fprintf (file, "#define OVERLAP(mode) %d\n", overlap); } } #ifdef FIXED_POINT #define BASENAME "static_modes_fixed" #else #define BASENAME "static_modes_float" #endif int main(int argc, char **argv) { int i, nb; FILE *file; CELTMode **m; if (argc%2 != 1) { fprintf (stderr, "must have a multiple of 2 arguments\n"); return 1; } nb = (argc-1)/2; m = malloc(nb*sizeof(CELTMode*)); for (i=0;i # else # ifdef HAVE_ALLOCA_H # include # else # include # endif # endif #endif /** * @def ALIGN(stack, size) * * Aligns the stack to a 'size' boundary * * @param stack Stack * @param size New size boundary */ /** * @def PUSH(stack, size, type) * * Allocates 'size' elements of type 'type' on the stack * * @param stack Stack * @param size Number of elements * @param type Type of element */ /** * @def VARDECL(var) * * Declare variable on stack * * @param var Variable to declare */ /** * @def ALLOC(var, size, type) * * Allocate 'size' elements of 'type' on stack * * @param var Name of variable to allocate * @param size Number of elements * @param type Type of element */ #if defined(VAR_ARRAYS) #define VARDECL(type, var) #define ALLOC(var, size, type) type var[size] #define SAVE_STACK #define RESTORE_STACK #define ALLOC_STACK #elif defined(USE_ALLOCA) #define VARDECL(type, var) type *var # ifdef WIN32 # define ALLOC(var, size, type) var = ((type*)_alloca(sizeof(type)*(size))) # else # define ALLOC(var, size, type) var = ((type*)alloca(sizeof(type)*(size))) # endif #define SAVE_STACK #define RESTORE_STACK #define ALLOC_STACK #else #ifdef CELT_C char *global_stack=0; #else extern char *global_stack; #endif /*CELT_C*/ #ifdef ENABLE_VALGRIND #include #ifdef CELT_C char *global_stack_top=0; #else extern char *global_stack_top; #endif /*CELT_C*/ #define ALIGN(stack, size) ((stack) += ((size) - (long)(stack)) & ((size) - 1)) #define PUSH(stack, size, type) (VALGRIND_MAKE_MEM_NOACCESS(stack, global_stack_top-stack),ALIGN((stack),sizeof(type)/sizeof(char)),VALGRIND_MAKE_MEM_UNDEFINED(stack, ((size)*sizeof(type)/sizeof(char))),(stack)+=(2*(size)*sizeof(type)/sizeof(char)),(type*)((stack)-(2*(size)*sizeof(type)/sizeof(char)))) #define RESTORE_STACK ((global_stack = _saved_stack),VALGRIND_MAKE_MEM_NOACCESS(global_stack, global_stack_top-global_stack)) #define ALLOC_STACK ((global_stack = (global_stack==0) ? ((global_stack_top=celt_alloc_scratch(GLOBAL_STACK_SIZE*2)+(GLOBAL_STACK_SIZE*2))-(GLOBAL_STACK_SIZE*2)) : global_stack),VALGRIND_MAKE_MEM_NOACCESS(global_stack, global_stack_top-global_stack)) #else #define ALIGN(stack, size) ((stack) += ((size) - (long)(stack)) & ((size) - 1)) #define PUSH(stack, size, type) (ALIGN((stack),sizeof(type)/sizeof(char)),(stack)+=(size)*(sizeof(type)/sizeof(char)),(type*)((stack)-(size)*(sizeof(type)/sizeof(char)))) #define RESTORE_STACK (global_stack = _saved_stack) #define ALLOC_STACK (global_stack = (global_stack==0) ? celt_alloc_scratch(GLOBAL_STACK_SIZE) : global_stack) #endif /*ENABLE_VALGRIND*/ #include "os_support.h" #define VARDECL(type, var) type *var #define ALLOC(var, size, type) var = PUSH(global_stack, size, type) #define SAVE_STACK char *_saved_stack = global_stack; #endif /*VAR_ARRAYS*/ #endif /*STACK_ALLOC_H*/ mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/entcode.h0000664000175000017500000001135214010707315022047 0ustar builderbuilder/* Copyright (c) 2001-2011 Timothy B. Terriberry Copyright (c) 2008-2009 Xiph.Org Foundation */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "celt_types.h" #if !defined(_entcode_H) # define _entcode_H (1) # include # include # include "ecintrin.h" typedef celt_int32 ec_int32; typedef celt_uint32 ec_uint32; typedef celt_uint32 ec_window; typedef struct ec_ctx ec_ctx; typedef struct ec_ctx ec_enc; typedef struct ec_ctx ec_dec; /*OPT: This must be at least 32 bits, but if you have fast arithmetic on a larger type, you can speed up the decoder by using it for ec_window.*/ # define EC_WINDOW_SIZE ((int)sizeof(ec_window)*CHAR_BIT) /*The number of bits to use for the range-coded part of unsigned integers.*/ # define EC_UINT_BITS (8) /*The resolution of fractional-precision bit usage measurements, i.e., 3 => 1/8th bits.*/ # define BITRES 3 /*The entropy encoder/decoder context. We use the same structure for both, so that common functions like ec_tell() can be used on either one.*/ struct ec_ctx{ /*Buffered input/output.*/ unsigned char *buf; /*The size of the buffer.*/ ec_uint32 storage; /*The offset at which the last byte containing raw bits was read/written.*/ ec_uint32 end_offs; /*Bits that will be read from/written at the end.*/ ec_window end_window; /*Number of valid bits in end_window.*/ int nend_bits; /*The total number of whole bits read/written. This does not include partial bits currently in the range coder.*/ int nbits_total; /*The offset at which the next range coder byte will be read/written.*/ ec_uint32 offs; /*The number of values in the current range.*/ ec_uint32 rng; /*In the decoder: the difference between the top of the current range and the input value, minus one. In the encoder: the low end of the current range.*/ ec_uint32 val; /*In the decoder: the saved normalization factor from ec_decode(). In the encoder: the number of oustanding carry propagating symbols.*/ ec_uint32 ext; /*A buffered input/output symbol, awaiting carry propagation.*/ int rem; /*Nonzero if an error occurred.*/ int error; }; /*Shared functions.*/ static inline void ec_reset(ec_ctx *_this){ _this->offs=_this->end_offs=0; } static inline ec_uint32 ec_range_bytes(ec_ctx *_this){ return _this->offs; } static inline unsigned char *ec_get_buffer(ec_ctx *_this){ return _this->buf; } static inline int ec_get_error(ec_ctx *_this){ return _this->error; } /*Returns the number of bits "used" by the encoded or decoded symbols so far. This same number can be computed in either the encoder or the decoder, and is suitable for making coding decisions. Return: The number of bits. This will always be slightly larger than the exact value (e.g., all rounding error is in the positive direction).*/ static inline int ec_tell(ec_ctx *_this){ return _this->nbits_total-EC_ILOG(_this->rng); } /*Returns the number of bits "used" by the encoded or decoded symbols so far. This same number can be computed in either the encoder or the decoder, and is suitable for making coding decisions. Return: The number of bits scaled by 2**BITRES. This will always be slightly larger than the exact value (e.g., all rounding error is in the positive direction).*/ ec_uint32 ec_tell_frac(ec_ctx *_this); int ec_ilog(ec_uint32 _v); #endif mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/static_modes_float.c0000664000175000017500000006541214010707315024272 0ustar builderbuilder/* The contents of this file is automatically generated and contains static definitions for some pre-defined modes */ #include "modes.h" #include "rate.h" #ifndef DEF_WINDOW120 #define DEF_WINDOW120 static const celt_word16 window120[120] = { 0.000067, 0.000606, 0.001682, 0.003295, 0.005444, 0.008128, 0.011344, 0.015091, 0.019365, 0.024164, 0.029483, 0.035320, 0.041669, 0.048525, 0.055884, 0.063738, 0.072082, 0.080907, 0.090208, 0.099974, 0.110198, 0.120869, 0.131977, 0.143512, 0.155462, 0.167814, 0.180555, 0.193673, 0.207152, 0.220977, 0.235132, 0.249602, 0.264369, 0.279414, 0.294720, 0.310268, 0.326038, 0.342009, 0.358162, 0.374474, 0.390925, 0.407491, 0.424152, 0.440884, 0.457665, 0.474471, 0.491280, 0.508068, 0.524813, 0.541491, 0.558080, 0.574557, 0.590900, 0.607088, 0.623100, 0.638913, 0.654509, 0.669868, 0.684971, 0.699800, 0.714339, 0.728571, 0.742480, 0.756054, 0.769279, 0.782143, 0.794634, 0.806744, 0.818465, 0.829787, 0.840707, 0.851218, 0.861317, 0.871002, 0.880271, 0.889125, 0.897564, 0.905591, 0.913209, 0.920423, 0.927237, 0.933660, 0.939697, 0.945357, 0.950649, 0.955584, 0.960171, 0.964422, 0.968349, 0.971963, 0.975279, 0.978309, 0.981066, 0.983565, 0.985819, 0.987842, 0.989649, 0.991253, 0.992669, 0.993910, 0.994990, 0.995923, 0.996722, 0.997399, 0.997967, 0.998437, 0.998822, 0.999132, 0.999376, 0.999565, 0.999708, 0.999812, 0.999886, 0.999936, 0.999967, 0.999985, 0.999995, 0.999999, 1.000000, 1.000000, }; #endif #ifndef DEF_LOGN400 #define DEF_LOGN400 static const celt_int16 logN400[21] = { 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 16, 16, 16, 21, 21, 24, 29, 34, 36, }; #endif #ifndef DEF_PULSE_CACHE50 #define DEF_PULSE_CACHE50 static const celt_int16 cache_index50[105] = { -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 41, 41, 41, 82, 82, 123, 164, 200, 222, 0, 0, 0, 0, 0, 0, 0, 0, 41, 41, 41, 41, 123, 123, 123, 164, 164, 240, 266, 283, 295, 41, 41, 41, 41, 41, 41, 41, 41, 123, 123, 123, 123, 240, 240, 240, 266, 266, 305, 318, 328, 336, 123, 123, 123, 123, 123, 123, 123, 123, 240, 240, 240, 240, 305, 305, 305, 318, 318, 343, 351, 358, 364, 240, 240, 240, 240, 240, 240, 240, 240, 305, 305, 305, 305, 343, 343, 343, 351, 351, 370, 376, 382, 387, }; static const unsigned char cache_bits50[392] = { 40, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 40, 15, 23, 28, 31, 34, 36, 38, 39, 41, 42, 43, 44, 45, 46, 47, 47, 49, 50, 51, 52, 53, 54, 55, 55, 57, 58, 59, 60, 61, 62, 63, 63, 65, 66, 67, 68, 69, 70, 71, 71, 40, 20, 33, 41, 48, 53, 57, 61, 64, 66, 69, 71, 73, 75, 76, 78, 80, 82, 85, 87, 89, 91, 92, 94, 96, 98, 101, 103, 105, 107, 108, 110, 112, 114, 117, 119, 121, 123, 124, 126, 128, 40, 23, 39, 51, 60, 67, 73, 79, 83, 87, 91, 94, 97, 100, 102, 105, 107, 111, 115, 118, 121, 124, 126, 129, 131, 135, 139, 142, 145, 148, 150, 153, 155, 159, 163, 166, 169, 172, 174, 177, 179, 35, 28, 49, 65, 78, 89, 99, 107, 114, 120, 126, 132, 136, 141, 145, 149, 153, 159, 165, 171, 176, 180, 185, 189, 192, 199, 205, 211, 216, 220, 225, 229, 232, 239, 245, 251, 21, 33, 58, 79, 97, 112, 125, 137, 148, 157, 166, 174, 182, 189, 195, 201, 207, 217, 227, 235, 243, 251, 17, 35, 63, 86, 106, 123, 139, 152, 165, 177, 187, 197, 206, 214, 222, 230, 237, 250, 25, 31, 55, 75, 91, 105, 117, 128, 138, 146, 154, 161, 168, 174, 180, 185, 190, 200, 208, 215, 222, 229, 235, 240, 245, 255, 16, 36, 65, 89, 110, 128, 144, 159, 173, 185, 196, 207, 217, 226, 234, 242, 250, 11, 41, 74, 103, 128, 151, 172, 191, 209, 225, 241, 255, 9, 43, 79, 110, 138, 163, 186, 207, 227, 246, 12, 39, 71, 99, 123, 144, 164, 182, 198, 214, 228, 241, 253, 9, 44, 81, 113, 142, 168, 192, 214, 235, 255, 7, 49, 90, 127, 160, 191, 220, 247, 6, 51, 95, 134, 170, 203, 234, 7, 47, 87, 123, 155, 184, 212, 237, 6, 52, 97, 137, 174, 208, 240, 5, 57, 106, 151, 192, 231, 5, 59, 111, 158, 202, 243, 5, 55, 103, 147, 187, 224, 5, 60, 113, 161, 206, 248, 4, 65, 122, 175, 224, 4, 67, 127, 182, 234, }; static const unsigned char cache_caps50[168] = { 224, 224, 224, 224, 224, 224, 224, 224, 160, 160, 160, 160, 185, 185, 185, 178, 178, 168, 134, 61, 37, 224, 224, 224, 224, 224, 224, 224, 224, 240, 240, 240, 240, 207, 207, 207, 198, 198, 183, 144, 66, 40, 160, 160, 160, 160, 160, 160, 160, 160, 185, 185, 185, 185, 193, 193, 193, 183, 183, 172, 138, 64, 38, 240, 240, 240, 240, 240, 240, 240, 240, 207, 207, 207, 207, 204, 204, 204, 193, 193, 180, 143, 66, 40, 185, 185, 185, 185, 185, 185, 185, 185, 193, 193, 193, 193, 193, 193, 193, 183, 183, 172, 138, 65, 39, 207, 207, 207, 207, 207, 207, 207, 207, 204, 204, 204, 204, 201, 201, 201, 188, 188, 176, 141, 66, 40, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 194, 194, 194, 184, 184, 173, 139, 65, 39, 204, 204, 204, 204, 204, 204, 204, 204, 201, 201, 201, 201, 198, 198, 198, 187, 187, 175, 140, 66, 40, }; #endif #ifndef FFT_TWIDDLES48000_960 #define FFT_TWIDDLES48000_960 static const kiss_twiddle_cpx fft_twiddles48000_960[480] = { {1.000000, -0.000000}, {0.999914, -0.013090}, {0.999657, -0.026177}, {0.999229, -0.039260}, {0.998630, -0.052336}, {0.997859, -0.065403}, {0.996917, -0.078459}, {0.995805, -0.091502}, {0.994522, -0.104528}, {0.993068, -0.117537}, {0.991445, -0.130526}, {0.989651, -0.143493}, {0.987688, -0.156434}, {0.985556, -0.169350}, {0.983255, -0.182236}, {0.980785, -0.195090}, {0.978148, -0.207912}, {0.975342, -0.220697}, {0.972370, -0.233445}, {0.969231, -0.246153}, {0.965926, -0.258819}, {0.962455, -0.271440}, {0.958820, -0.284015}, {0.955020, -0.296542}, {0.951057, -0.309017}, {0.946930, -0.321439}, {0.942641, -0.333807}, {0.938191, -0.346117}, {0.933580, -0.358368}, {0.928810, -0.370557}, {0.923880, -0.382683}, {0.918791, -0.394744}, {0.913545, -0.406737}, {0.908143, -0.418660}, {0.902585, -0.430511}, {0.896873, -0.442289}, {0.891007, -0.453990}, {0.884988, -0.465615}, {0.878817, -0.477159}, {0.872496, -0.488621}, {0.866025, -0.500000}, {0.859406, -0.511293}, {0.852640, -0.522499}, {0.845728, -0.533615}, {0.838671, -0.544639}, {0.831470, -0.555570}, {0.824126, -0.566406}, {0.816642, -0.577145}, {0.809017, -0.587785}, {0.801254, -0.598325}, {0.793353, -0.608761}, {0.785317, -0.619094}, {0.777146, -0.629320}, {0.768842, -0.639439}, {0.760406, -0.649448}, {0.751840, -0.659346}, {0.743145, -0.669131}, {0.734322, -0.678801}, {0.725374, -0.688355}, {0.716302, -0.697790}, {0.707107, -0.707107}, {0.697790, -0.716302}, {0.688355, -0.725374}, {0.678801, -0.734322}, {0.669131, -0.743145}, {0.659346, -0.751840}, {0.649448, -0.760406}, {0.639439, -0.768842}, {0.629320, -0.777146}, {0.619094, -0.785317}, {0.608761, -0.793353}, {0.598325, -0.801254}, {0.587785, -0.809017}, {0.577145, -0.816642}, {0.566406, -0.824126}, {0.555570, -0.831470}, {0.544639, -0.838671}, {0.533615, -0.845728}, {0.522499, -0.852640}, {0.511293, -0.859406}, {0.500000, -0.866025}, {0.488621, -0.872496}, {0.477159, -0.878817}, {0.465615, -0.884988}, {0.453990, -0.891007}, {0.442289, -0.896873}, {0.430511, -0.902585}, {0.418660, -0.908143}, {0.406737, -0.913545}, {0.394744, -0.918791}, {0.382683, -0.923880}, {0.370557, -0.928810}, {0.358368, -0.933580}, {0.346117, -0.938191}, {0.333807, -0.942641}, {0.321439, -0.946930}, {0.309017, -0.951057}, {0.296542, -0.955020}, {0.284015, -0.958820}, {0.271440, -0.962455}, {0.258819, -0.965926}, {0.246153, -0.969231}, {0.233445, -0.972370}, {0.220697, -0.975342}, {0.207912, -0.978148}, {0.195090, -0.980785}, {0.182236, -0.983255}, {0.169350, -0.985556}, {0.156434, -0.987688}, {0.143493, -0.989651}, {0.130526, -0.991445}, {0.117537, -0.993068}, {0.104528, -0.994522}, {0.091502, -0.995805}, {0.078459, -0.996917}, {0.065403, -0.997859}, {0.052336, -0.998630}, {0.039260, -0.999229}, {0.026177, -0.999657}, {0.013090, -0.999914}, {0.000000, -1.000000}, {-0.013090, -0.999914}, {-0.026177, -0.999657}, {-0.039260, -0.999229}, {-0.052336, -0.998630}, {-0.065403, -0.997859}, {-0.078459, -0.996917}, {-0.091502, -0.995805}, {-0.104528, -0.994522}, {-0.117537, -0.993068}, {-0.130526, -0.991445}, {-0.143493, -0.989651}, {-0.156434, -0.987688}, {-0.169350, -0.985556}, {-0.182236, -0.983255}, {-0.195090, -0.980785}, {-0.207912, -0.978148}, {-0.220697, -0.975342}, {-0.233445, -0.972370}, {-0.246153, -0.969231}, {-0.258819, -0.965926}, {-0.271440, -0.962455}, {-0.284015, -0.958820}, {-0.296542, -0.955020}, {-0.309017, -0.951057}, {-0.321439, -0.946930}, {-0.333807, -0.942641}, {-0.346117, -0.938191}, {-0.358368, -0.933580}, {-0.370557, -0.928810}, {-0.382683, -0.923880}, {-0.394744, -0.918791}, {-0.406737, -0.913545}, {-0.418660, -0.908143}, {-0.430511, -0.902585}, {-0.442289, -0.896873}, {-0.453990, -0.891007}, {-0.465615, -0.884988}, {-0.477159, -0.878817}, {-0.488621, -0.872496}, {-0.500000, -0.866025}, {-0.511293, -0.859406}, {-0.522499, -0.852640}, {-0.533615, -0.845728}, {-0.544639, -0.838671}, {-0.555570, -0.831470}, {-0.566406, -0.824126}, {-0.577145, -0.816642}, {-0.587785, -0.809017}, {-0.598325, -0.801254}, {-0.608761, -0.793353}, {-0.619094, -0.785317}, {-0.629320, -0.777146}, {-0.639439, -0.768842}, {-0.649448, -0.760406}, {-0.659346, -0.751840}, {-0.669131, -0.743145}, {-0.678801, -0.734322}, {-0.688355, -0.725374}, {-0.697790, -0.716302}, {-0.707107, -0.707107}, {-0.716302, -0.697790}, {-0.725374, -0.688355}, {-0.734322, -0.678801}, {-0.743145, -0.669131}, {-0.751840, -0.659346}, {-0.760406, -0.649448}, {-0.768842, -0.639439}, {-0.777146, -0.629320}, {-0.785317, -0.619094}, {-0.793353, -0.608761}, {-0.801254, -0.598325}, {-0.809017, -0.587785}, {-0.816642, -0.577145}, {-0.824126, -0.566406}, {-0.831470, -0.555570}, {-0.838671, -0.544639}, {-0.845728, -0.533615}, {-0.852640, -0.522499}, {-0.859406, -0.511293}, {-0.866025, -0.500000}, {-0.872496, -0.488621}, {-0.878817, -0.477159}, {-0.884988, -0.465615}, {-0.891007, -0.453990}, {-0.896873, -0.442289}, {-0.902585, -0.430511}, {-0.908143, -0.418660}, {-0.913545, -0.406737}, {-0.918791, -0.394744}, {-0.923880, -0.382683}, {-0.928810, -0.370557}, {-0.933580, -0.358368}, {-0.938191, -0.346117}, {-0.942641, -0.333807}, {-0.946930, -0.321439}, {-0.951057, -0.309017}, {-0.955020, -0.296542}, {-0.958820, -0.284015}, {-0.962455, -0.271440}, {-0.965926, -0.258819}, {-0.969231, -0.246153}, {-0.972370, -0.233445}, {-0.975342, -0.220697}, {-0.978148, -0.207912}, {-0.980785, -0.195090}, {-0.983255, -0.182236}, {-0.985556, -0.169350}, {-0.987688, -0.156434}, {-0.989651, -0.143493}, {-0.991445, -0.130526}, {-0.993068, -0.117537}, {-0.994522, -0.104528}, {-0.995805, -0.091502}, {-0.996917, -0.078459}, {-0.997859, -0.065403}, {-0.998630, -0.052336}, {-0.999229, -0.039260}, {-0.999657, -0.026177}, {-0.999914, -0.013090}, {-1.000000, -0.000000}, {-0.999914, 0.013090}, {-0.999657, 0.026177}, {-0.999229, 0.039260}, {-0.998630, 0.052336}, {-0.997859, 0.065403}, {-0.996917, 0.078459}, {-0.995805, 0.091502}, {-0.994522, 0.104528}, {-0.993068, 0.117537}, {-0.991445, 0.130526}, {-0.989651, 0.143493}, {-0.987688, 0.156434}, {-0.985556, 0.169350}, {-0.983255, 0.182236}, {-0.980785, 0.195090}, {-0.978148, 0.207912}, {-0.975342, 0.220697}, {-0.972370, 0.233445}, {-0.969231, 0.246153}, {-0.965926, 0.258819}, {-0.962455, 0.271440}, {-0.958820, 0.284015}, {-0.955020, 0.296542}, {-0.951057, 0.309017}, {-0.946930, 0.321439}, {-0.942641, 0.333807}, {-0.938191, 0.346117}, {-0.933580, 0.358368}, {-0.928810, 0.370557}, {-0.923880, 0.382683}, {-0.918791, 0.394744}, {-0.913545, 0.406737}, {-0.908143, 0.418660}, {-0.902585, 0.430511}, {-0.896873, 0.442289}, {-0.891007, 0.453990}, {-0.884988, 0.465615}, {-0.878817, 0.477159}, {-0.872496, 0.488621}, {-0.866025, 0.500000}, {-0.859406, 0.511293}, {-0.852640, 0.522499}, {-0.845728, 0.533615}, {-0.838671, 0.544639}, {-0.831470, 0.555570}, {-0.824126, 0.566406}, {-0.816642, 0.577145}, {-0.809017, 0.587785}, {-0.801254, 0.598325}, {-0.793353, 0.608761}, {-0.785317, 0.619094}, {-0.777146, 0.629320}, {-0.768842, 0.639439}, {-0.760406, 0.649448}, {-0.751840, 0.659346}, {-0.743145, 0.669131}, {-0.734322, 0.678801}, {-0.725374, 0.688355}, {-0.716302, 0.697790}, {-0.707107, 0.707107}, {-0.697790, 0.716302}, {-0.688355, 0.725374}, {-0.678801, 0.734322}, {-0.669131, 0.743145}, {-0.659346, 0.751840}, {-0.649448, 0.760406}, {-0.639439, 0.768842}, {-0.629320, 0.777146}, {-0.619094, 0.785317}, {-0.608761, 0.793353}, {-0.598325, 0.801254}, {-0.587785, 0.809017}, {-0.577145, 0.816642}, {-0.566406, 0.824126}, {-0.555570, 0.831470}, {-0.544639, 0.838671}, {-0.533615, 0.845728}, {-0.522499, 0.852640}, {-0.511293, 0.859406}, {-0.500000, 0.866025}, {-0.488621, 0.872496}, {-0.477159, 0.878817}, {-0.465615, 0.884988}, {-0.453990, 0.891007}, {-0.442289, 0.896873}, {-0.430511, 0.902585}, {-0.418660, 0.908143}, {-0.406737, 0.913545}, {-0.394744, 0.918791}, {-0.382683, 0.923880}, {-0.370557, 0.928810}, {-0.358368, 0.933580}, {-0.346117, 0.938191}, {-0.333807, 0.942641}, {-0.321439, 0.946930}, {-0.309017, 0.951057}, {-0.296542, 0.955020}, {-0.284015, 0.958820}, {-0.271440, 0.962455}, {-0.258819, 0.965926}, {-0.246153, 0.969231}, {-0.233445, 0.972370}, {-0.220697, 0.975342}, {-0.207912, 0.978148}, {-0.195090, 0.980785}, {-0.182236, 0.983255}, {-0.169350, 0.985556}, {-0.156434, 0.987688}, {-0.143493, 0.989651}, {-0.130526, 0.991445}, {-0.117537, 0.993068}, {-0.104528, 0.994522}, {-0.091502, 0.995805}, {-0.078459, 0.996917}, {-0.065403, 0.997859}, {-0.052336, 0.998630}, {-0.039260, 0.999229}, {-0.026177, 0.999657}, {-0.013090, 0.999914}, {-0.000000, 1.000000}, {0.013090, 0.999914}, {0.026177, 0.999657}, {0.039260, 0.999229}, {0.052336, 0.998630}, {0.065403, 0.997859}, {0.078459, 0.996917}, {0.091502, 0.995805}, {0.104528, 0.994522}, {0.117537, 0.993068}, {0.130526, 0.991445}, {0.143493, 0.989651}, {0.156434, 0.987688}, {0.169350, 0.985556}, {0.182236, 0.983255}, {0.195090, 0.980785}, {0.207912, 0.978148}, {0.220697, 0.975342}, {0.233445, 0.972370}, {0.246153, 0.969231}, {0.258819, 0.965926}, {0.271440, 0.962455}, {0.284015, 0.958820}, {0.296542, 0.955020}, {0.309017, 0.951057}, {0.321439, 0.946930}, {0.333807, 0.942641}, {0.346117, 0.938191}, {0.358368, 0.933580}, {0.370557, 0.928810}, {0.382683, 0.923880}, {0.394744, 0.918791}, {0.406737, 0.913545}, {0.418660, 0.908143}, {0.430511, 0.902585}, {0.442289, 0.896873}, {0.453990, 0.891007}, {0.465615, 0.884988}, {0.477159, 0.878817}, {0.488621, 0.872496}, {0.500000, 0.866025}, {0.511293, 0.859406}, {0.522499, 0.852640}, {0.533615, 0.845728}, {0.544639, 0.838671}, {0.555570, 0.831470}, {0.566406, 0.824126}, {0.577145, 0.816642}, {0.587785, 0.809017}, {0.598325, 0.801254}, {0.608761, 0.793353}, {0.619094, 0.785317}, {0.629320, 0.777146}, {0.639439, 0.768842}, {0.649448, 0.760406}, {0.659346, 0.751840}, {0.669131, 0.743145}, {0.678801, 0.734322}, {0.688355, 0.725374}, {0.697790, 0.716302}, {0.707107, 0.707107}, {0.716302, 0.697790}, {0.725374, 0.688355}, {0.734322, 0.678801}, {0.743145, 0.669131}, {0.751840, 0.659346}, {0.760406, 0.649448}, {0.768842, 0.639439}, {0.777146, 0.629320}, {0.785317, 0.619094}, {0.793353, 0.608761}, {0.801254, 0.598325}, {0.809017, 0.587785}, {0.816642, 0.577145}, {0.824126, 0.566406}, {0.831470, 0.555570}, {0.838671, 0.544639}, {0.845728, 0.533615}, {0.852640, 0.522499}, {0.859406, 0.511293}, {0.866025, 0.500000}, {0.872496, 0.488621}, {0.878817, 0.477159}, {0.884988, 0.465615}, {0.891007, 0.453990}, {0.896873, 0.442289}, {0.902585, 0.430511}, {0.908143, 0.418660}, {0.913545, 0.406737}, {0.918791, 0.394744}, {0.923880, 0.382683}, {0.928810, 0.370557}, {0.933580, 0.358368}, {0.938191, 0.346117}, {0.942641, 0.333807}, {0.946930, 0.321439}, {0.951057, 0.309017}, {0.955020, 0.296542}, {0.958820, 0.284015}, {0.962455, 0.271440}, {0.965926, 0.258819}, {0.969231, 0.246153}, {0.972370, 0.233445}, {0.975342, 0.220697}, {0.978148, 0.207912}, {0.980785, 0.195090}, {0.983255, 0.182236}, {0.985556, 0.169350}, {0.987688, 0.156434}, {0.989651, 0.143493}, {0.991445, 0.130526}, {0.993068, 0.117537}, {0.994522, 0.104528}, {0.995805, 0.091502}, {0.996917, 0.078459}, {0.997859, 0.065403}, {0.998630, 0.052336}, {0.999229, 0.039260}, {0.999657, 0.026177}, {0.999914, 0.013090}, }; #ifndef FFT_BITREV480 #define FFT_BITREV480 static const celt_int16 fft_bitrev480[480] = { 0, 120, 240, 360, 30, 150, 270, 390, 60, 180, 300, 420, 90, 210, 330, 450, 15, 135, 255, 375, 45, 165, 285, 405, 75, 195, 315, 435, 105, 225, 345, 465, 5, 125, 245, 365, 35, 155, 275, 395, 65, 185, 305, 425, 95, 215, 335, 455, 20, 140, 260, 380, 50, 170, 290, 410, 80, 200, 320, 440, 110, 230, 350, 470, 10, 130, 250, 370, 40, 160, 280, 400, 70, 190, 310, 430, 100, 220, 340, 460, 25, 145, 265, 385, 55, 175, 295, 415, 85, 205, 325, 445, 115, 235, 355, 475, 1, 121, 241, 361, 31, 151, 271, 391, 61, 181, 301, 421, 91, 211, 331, 451, 16, 136, 256, 376, 46, 166, 286, 406, 76, 196, 316, 436, 106, 226, 346, 466, 6, 126, 246, 366, 36, 156, 276, 396, 66, 186, 306, 426, 96, 216, 336, 456, 21, 141, 261, 381, 51, 171, 291, 411, 81, 201, 321, 441, 111, 231, 351, 471, 11, 131, 251, 371, 41, 161, 281, 401, 71, 191, 311, 431, 101, 221, 341, 461, 26, 146, 266, 386, 56, 176, 296, 416, 86, 206, 326, 446, 116, 236, 356, 476, 2, 122, 242, 362, 32, 152, 272, 392, 62, 182, 302, 422, 92, 212, 332, 452, 17, 137, 257, 377, 47, 167, 287, 407, 77, 197, 317, 437, 107, 227, 347, 467, 7, 127, 247, 367, 37, 157, 277, 397, 67, 187, 307, 427, 97, 217, 337, 457, 22, 142, 262, 382, 52, 172, 292, 412, 82, 202, 322, 442, 112, 232, 352, 472, 12, 132, 252, 372, 42, 162, 282, 402, 72, 192, 312, 432, 102, 222, 342, 462, 27, 147, 267, 387, 57, 177, 297, 417, 87, 207, 327, 447, 117, 237, 357, 477, 3, 123, 243, 363, 33, 153, 273, 393, 63, 183, 303, 423, 93, 213, 333, 453, 18, 138, 258, 378, 48, 168, 288, 408, 78, 198, 318, 438, 108, 228, 348, 468, 8, 128, 248, 368, 38, 158, 278, 398, 68, 188, 308, 428, 98, 218, 338, 458, 23, 143, 263, 383, 53, 173, 293, 413, 83, 203, 323, 443, 113, 233, 353, 473, 13, 133, 253, 373, 43, 163, 283, 403, 73, 193, 313, 433, 103, 223, 343, 463, 28, 148, 268, 388, 58, 178, 298, 418, 88, 208, 328, 448, 118, 238, 358, 478, 4, 124, 244, 364, 34, 154, 274, 394, 64, 184, 304, 424, 94, 214, 334, 454, 19, 139, 259, 379, 49, 169, 289, 409, 79, 199, 319, 439, 109, 229, 349, 469, 9, 129, 249, 369, 39, 159, 279, 399, 69, 189, 309, 429, 99, 219, 339, 459, 24, 144, 264, 384, 54, 174, 294, 414, 84, 204, 324, 444, 114, 234, 354, 474, 14, 134, 254, 374, 44, 164, 284, 404, 74, 194, 314, 434, 104, 224, 344, 464, 29, 149, 269, 389, 59, 179, 299, 419, 89, 209, 329, 449, 119, 239, 359, 479, }; #endif #ifndef FFT_BITREV240 #define FFT_BITREV240 static const celt_int16 fft_bitrev240[240] = { 0, 60, 120, 180, 15, 75, 135, 195, 30, 90, 150, 210, 45, 105, 165, 225, 5, 65, 125, 185, 20, 80, 140, 200, 35, 95, 155, 215, 50, 110, 170, 230, 10, 70, 130, 190, 25, 85, 145, 205, 40, 100, 160, 220, 55, 115, 175, 235, 1, 61, 121, 181, 16, 76, 136, 196, 31, 91, 151, 211, 46, 106, 166, 226, 6, 66, 126, 186, 21, 81, 141, 201, 36, 96, 156, 216, 51, 111, 171, 231, 11, 71, 131, 191, 26, 86, 146, 206, 41, 101, 161, 221, 56, 116, 176, 236, 2, 62, 122, 182, 17, 77, 137, 197, 32, 92, 152, 212, 47, 107, 167, 227, 7, 67, 127, 187, 22, 82, 142, 202, 37, 97, 157, 217, 52, 112, 172, 232, 12, 72, 132, 192, 27, 87, 147, 207, 42, 102, 162, 222, 57, 117, 177, 237, 3, 63, 123, 183, 18, 78, 138, 198, 33, 93, 153, 213, 48, 108, 168, 228, 8, 68, 128, 188, 23, 83, 143, 203, 38, 98, 158, 218, 53, 113, 173, 233, 13, 73, 133, 193, 28, 88, 148, 208, 43, 103, 163, 223, 58, 118, 178, 238, 4, 64, 124, 184, 19, 79, 139, 199, 34, 94, 154, 214, 49, 109, 169, 229, 9, 69, 129, 189, 24, 84, 144, 204, 39, 99, 159, 219, 54, 114, 174, 234, 14, 74, 134, 194, 29, 89, 149, 209, 44, 104, 164, 224, 59, 119, 179, 239, }; #endif #ifndef FFT_BITREV120 #define FFT_BITREV120 static const celt_int16 fft_bitrev120[120] = { 0, 30, 60, 90, 15, 45, 75, 105, 5, 35, 65, 95, 20, 50, 80, 110, 10, 40, 70, 100, 25, 55, 85, 115, 1, 31, 61, 91, 16, 46, 76, 106, 6, 36, 66, 96, 21, 51, 81, 111, 11, 41, 71, 101, 26, 56, 86, 116, 2, 32, 62, 92, 17, 47, 77, 107, 7, 37, 67, 97, 22, 52, 82, 112, 12, 42, 72, 102, 27, 57, 87, 117, 3, 33, 63, 93, 18, 48, 78, 108, 8, 38, 68, 98, 23, 53, 83, 113, 13, 43, 73, 103, 28, 58, 88, 118, 4, 34, 64, 94, 19, 49, 79, 109, 9, 39, 69, 99, 24, 54, 84, 114, 14, 44, 74, 104, 29, 59, 89, 119, }; #endif #ifndef FFT_BITREV60 #define FFT_BITREV60 static const celt_int16 fft_bitrev60[60] = { 0, 15, 30, 45, 5, 20, 35, 50, 10, 25, 40, 55, 1, 16, 31, 46, 6, 21, 36, 51, 11, 26, 41, 56, 2, 17, 32, 47, 7, 22, 37, 52, 12, 27, 42, 57, 3, 18, 33, 48, 8, 23, 38, 53, 13, 28, 43, 58, 4, 19, 34, 49, 9, 24, 39, 54, 14, 29, 44, 59, }; #endif #ifndef FFT_STATE48000_960_0 #define FFT_STATE48000_960_0 static const kiss_fft_state fft_state48000_960_0 = { 480, /* nfft */ 0.002083, /* scale */ -1, /* shift */ {4, 120, 4, 30, 2, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, }, /* factors */ fft_bitrev480, /* bitrev */ fft_twiddles48000_960, /* bitrev */ }; #endif #ifndef FFT_STATE48000_960_1 #define FFT_STATE48000_960_1 static const kiss_fft_state fft_state48000_960_1 = { 240, /* nfft */ 0.004167, /* scale */ 1, /* shift */ {4, 60, 4, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */ fft_bitrev240, /* bitrev */ fft_twiddles48000_960, /* bitrev */ }; #endif #ifndef FFT_STATE48000_960_2 #define FFT_STATE48000_960_2 static const kiss_fft_state fft_state48000_960_2 = { 120, /* nfft */ 0.008333, /* scale */ 2, /* shift */ {4, 30, 2, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */ fft_bitrev120, /* bitrev */ fft_twiddles48000_960, /* bitrev */ }; #endif #ifndef FFT_STATE48000_960_3 #define FFT_STATE48000_960_3 static const kiss_fft_state fft_state48000_960_3 = { 60, /* nfft */ 0.016667, /* scale */ 3, /* shift */ {4, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */ fft_bitrev60, /* bitrev */ fft_twiddles48000_960, /* bitrev */ }; #endif #endif #ifndef MDCT_TWIDDLES960 #define MDCT_TWIDDLES960 static const celt_word16 mdct_twiddles960[481] = { 1.000000, 0.999995, 0.999979, 0.999952, 0.999914, 0.999866, 0.999807, 0.999738, 0.999657, 0.999566, 0.999465, 0.999352, 0.999229, 0.999095, 0.998951, 0.998795, 0.998630, 0.998453, 0.998266, 0.998068, 0.997859, 0.997640, 0.997409, 0.997169, 0.996917, 0.996655, 0.996382, 0.996099, 0.995805, 0.995500, 0.995185, 0.994859, 0.994522, 0.994174, 0.993816, 0.993448, 0.993068, 0.992679, 0.992278, 0.991867, 0.991445, 0.991012, 0.990569, 0.990116, 0.989651, 0.989177, 0.988691, 0.988195, 0.987688, 0.987171, 0.986643, 0.986105, 0.985556, 0.984997, 0.984427, 0.983846, 0.983255, 0.982653, 0.982041, 0.981418, 0.980785, 0.980142, 0.979487, 0.978823, 0.978148, 0.977462, 0.976766, 0.976059, 0.975342, 0.974615, 0.973877, 0.973129, 0.972370, 0.971601, 0.970821, 0.970031, 0.969231, 0.968420, 0.967599, 0.966768, 0.965926, 0.965074, 0.964211, 0.963338, 0.962455, 0.961562, 0.960658, 0.959744, 0.958820, 0.957885, 0.956940, 0.955985, 0.955020, 0.954044, 0.953059, 0.952063, 0.951057, 0.950040, 0.949014, 0.947977, 0.946930, 0.945873, 0.944806, 0.943729, 0.942641, 0.941544, 0.940437, 0.939319, 0.938191, 0.937054, 0.935906, 0.934748, 0.933580, 0.932403, 0.931215, 0.930017, 0.928810, 0.927592, 0.926364, 0.925127, 0.923880, 0.922622, 0.921355, 0.920078, 0.918791, 0.917494, 0.916188, 0.914872, 0.913545, 0.912210, 0.910864, 0.909508, 0.908143, 0.906768, 0.905384, 0.903989, 0.902585, 0.901172, 0.899748, 0.898315, 0.896873, 0.895421, 0.893959, 0.892487, 0.891007, 0.889516, 0.888016, 0.886507, 0.884988, 0.883459, 0.881921, 0.880374, 0.878817, 0.877251, 0.875675, 0.874090, 0.872496, 0.870892, 0.869279, 0.867657, 0.866025, 0.864385, 0.862734, 0.861075, 0.859406, 0.857729, 0.856042, 0.854345, 0.852640, 0.850926, 0.849202, 0.847470, 0.845728, 0.843977, 0.842217, 0.840448, 0.838671, 0.836884, 0.835088, 0.833283, 0.831470, 0.829647, 0.827816, 0.825975, 0.824126, 0.822268, 0.820401, 0.818526, 0.816642, 0.814748, 0.812847, 0.810936, 0.809017, 0.807089, 0.805153, 0.803208, 0.801254, 0.799291, 0.797321, 0.795341, 0.793353, 0.791357, 0.789352, 0.787339, 0.785317, 0.783287, 0.781248, 0.779201, 0.777146, 0.775082, 0.773010, 0.770930, 0.768842, 0.766745, 0.764640, 0.762527, 0.760406, 0.758277, 0.756139, 0.753994, 0.751840, 0.749678, 0.747508, 0.745331, 0.743145, 0.740951, 0.738750, 0.736540, 0.734322, 0.732097, 0.729864, 0.727623, 0.725374, 0.723118, 0.720854, 0.718582, 0.716302, 0.714015, 0.711720, 0.709417, 0.707107, 0.704789, 0.702464, 0.700131, 0.697790, 0.695443, 0.693087, 0.690725, 0.688355, 0.685977, 0.683592, 0.681200, 0.678801, 0.676394, 0.673980, 0.671559, 0.669131, 0.666695, 0.664252, 0.661803, 0.659346, 0.656882, 0.654411, 0.651933, 0.649448, 0.646956, 0.644457, 0.641952, 0.639439, 0.636920, 0.634393, 0.631860, 0.629320, 0.626774, 0.624221, 0.621661, 0.619094, 0.616521, 0.613941, 0.611354, 0.608761, 0.606162, 0.603556, 0.600944, 0.598325, 0.595699, 0.593068, 0.590430, 0.587785, 0.585135, 0.582478, 0.579815, 0.577145, 0.574470, 0.571788, 0.569100, 0.566406, 0.563706, 0.561000, 0.558288, 0.555570, 0.552846, 0.550116, 0.547381, 0.544639, 0.541892, 0.539138, 0.536379, 0.533615, 0.530844, 0.528068, 0.525286, 0.522499, 0.519706, 0.516907, 0.514103, 0.511293, 0.508478, 0.505657, 0.502831, 0.500000, 0.497163, 0.494321, 0.491474, 0.488621, 0.485763, 0.482900, 0.480032, 0.477159, 0.474280, 0.471397, 0.468508, 0.465615, 0.462716, 0.459812, 0.456904, 0.453990, 0.451072, 0.448149, 0.445221, 0.442289, 0.439351, 0.436409, 0.433463, 0.430511, 0.427555, 0.424595, 0.421629, 0.418660, 0.415686, 0.412707, 0.409724, 0.406737, 0.403745, 0.400749, 0.397748, 0.394744, 0.391735, 0.388722, 0.385705, 0.382683, 0.379658, 0.376628, 0.373595, 0.370557, 0.367516, 0.364471, 0.361421, 0.358368, 0.355311, 0.352250, 0.349185, 0.346117, 0.343045, 0.339969, 0.336890, 0.333807, 0.330720, 0.327630, 0.324537, 0.321439, 0.318339, 0.315235, 0.312128, 0.309017, 0.305903, 0.302786, 0.299665, 0.296542, 0.293415, 0.290285, 0.287152, 0.284015, 0.280876, 0.277734, 0.274589, 0.271440, 0.268289, 0.265135, 0.261979, 0.258819, 0.255657, 0.252492, 0.249324, 0.246153, 0.242980, 0.239804, 0.236626, 0.233445, 0.230262, 0.227076, 0.223888, 0.220697, 0.217504, 0.214309, 0.211112, 0.207912, 0.204710, 0.201505, 0.198299, 0.195090, 0.191880, 0.188667, 0.185452, 0.182236, 0.179017, 0.175796, 0.172574, 0.169350, 0.166123, 0.162895, 0.159666, 0.156434, 0.153201, 0.149967, 0.146730, 0.143493, 0.140253, 0.137012, 0.133770, 0.130526, 0.127281, 0.124034, 0.120787, 0.117537, 0.114287, 0.111035, 0.107782, 0.104528, 0.101273, 0.098017, 0.094760, 0.091502, 0.088242, 0.084982, 0.081721, 0.078459, 0.075196, 0.071933, 0.068668, 0.065403, 0.062137, 0.058871, 0.055604, 0.052336, 0.049068, 0.045799, 0.042530, 0.039260, 0.035990, 0.032719, 0.029448, 0.026177, 0.022905, 0.019634, 0.016362, 0.013090, 0.009817, 0.006545, 0.003272, 0.000000, }; #endif static const CELTMode mode48000_960_120 = { 48000, /* Fs */ 120, /* overlap */ 21, /* nbEBands */ 21, /* effEBands */ {0.850006, 0.000000, 1.000000, 1.000000, }, /* preemph */ eband5ms, /* eBands */ 11, /* nbAllocVectors */ band_allocation, /* allocVectors */ {1920, 3, {&fft_state48000_960_0, &fft_state48000_960_1, &fft_state48000_960_2, &fft_state48000_960_3, }, mdct_twiddles960}, /* mdct */ window120, /* window */ 3, /* maxLM */ 8, /* nbShortMdcts */ 120, /* shortMdctSize */ logN400, /* logN */ {392, cache_index50, cache_bits50, cache_caps50}, /* cache */ }; /* List of all the available modes */ #define TOTAL_MODES 1 static const CELTMode * const static_mode_list[TOTAL_MODES] = { &mode48000_960_120, }; mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/c64_fft.h0000664000175000017500000000412014010707315021654 0ustar builderbuilder/* (c) Copyright 2008/2009 Xiph.Org Foundation */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _dsp_fft_h_ #define _dsp_fft_h_ #include "config.h" #include "arch.h" #include "os_support.h" #include "mathops.h" #include "stack_alloc.h" typedef struct { int nfft; int shift; celt_int32 *twiddle; celt_int32 *itwiddle; } c64_fft_t; extern c64_fft_t *c64_fft16_alloc(int length, int x, int y); extern void c64_fft16_free(c64_fft_t *state); extern void c64_fft16_inplace(c64_fft_t *state, celt_int16 *X); extern void c64_ifft16(c64_fft_t *state, const celt_int16 *X, celt_int16 *Y); extern c64_fft_t *c64_fft32_alloc(int length, int x, int y); extern void c64_fft32_free(c64_fft_t *state); extern void c64_fft32(c64_fft_t *state, const celt_int32 *X, celt_int32 *Y); extern void c64_ifft32(c64_fft_t *state, const celt_int32 *X, celt_int32 *Y); #endif mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/kiss_fft.h0000664000175000017500000001235514010707315022242 0ustar builderbuilder/* Copyright (c) 2003-2004, Mark Borgerding Lots of modifications by Jean-Marc Valin Copyright (c) 2005-2007, Xiph.Org Foundation Copyright (c) 2008, Xiph.Org Foundation, CSIRO All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef KISS_FFT_H #define KISS_FFT_H #include #include #include "arch.h" #ifdef __cplusplus extern "C" { #endif /* ATTENTION! If you would like a : -- a utility that will handle the caching of fft objects -- real-only (no imaginary time component ) FFT -- a multi-dimensional FFT -- a command-line utility to perform ffts -- a command-line utility to perform fast-convolution filtering Then see kfc.h kiss_fftr.h kiss_fftnd.h fftutil.c kiss_fastfir.c in the tools/ directory. */ #ifdef USE_SIMD # include # define kiss_fft_scalar __m128 #define KISS_FFT_MALLOC(nbytes) memalign(16,nbytes) #else #define KISS_FFT_MALLOC celt_alloc #endif #ifdef FIXED_POINT #include "arch.h" #define DOUBLE_PRECISION #ifdef DOUBLE_PRECISION # define kiss_fft_scalar celt_int32 # define kiss_twiddle_scalar celt_int16 # define KF_SUFFIX _celt_double #else # define kiss_fft_scalar celt_int16 # define kiss_twiddle_scalar celt_int16 # define KF_SUFFIX _celt_single #endif #else # ifndef kiss_fft_scalar /* default is float */ # define kiss_fft_scalar float # define kiss_twiddle_scalar float # define KF_SUFFIX _celt_single # endif #endif #if 0 /* This adds a suffix to all the kiss_fft functions so we can easily link with more than one copy of the fft */ #define CAT_SUFFIX(a,b) a ## b #define SUF(a,b) CAT_SUFFIX(a, b) #define kiss_fft_alloc_twiddles SUF(kiss_fft_alloc_twiddles,KF_SUFFIX) #define kiss_fft_alloc SUF(kiss_fft_alloc,KF_SUFFIX) #define kiss_fft SUF(kiss_fft,KF_SUFFIX) #define kiss_ifft SUF(kiss_ifft,KF_SUFFIX) #define kiss_fft_stride SUF(kiss_fft_stride,KF_SUFFIX) #define kiss_ifft_stride SUF(kiss_ifft_stride,KF_SUFFIX) #define kiss_fft_free SUF(kiss_fft_free,KF_SUFFIX) #endif typedef struct { kiss_fft_scalar r; kiss_fft_scalar i; }kiss_fft_cpx; typedef struct { kiss_twiddle_scalar r; kiss_twiddle_scalar i; }kiss_twiddle_cpx; #define MAXFACTORS 8 /* e.g. an fft of length 128 has 4 factors as far as kissfft is concerned 4*4*4*2 */ typedef struct kiss_fft_state{ int nfft; #ifndef FIXED_POINT kiss_fft_scalar scale; #endif int shift; celt_int16 factors[2*MAXFACTORS]; const celt_int16 *bitrev; const kiss_twiddle_cpx *twiddles; } kiss_fft_state; //typedef struct kiss_fft_state* kiss_fft_cfg; /** * kiss_fft_alloc * * Initialize a FFT (or IFFT) algorithm's cfg/state buffer. * * typical usage: kiss_fft_cfg mycfg=kiss_fft_alloc(1024,0,NULL,NULL); * * The return value from fft_alloc is a cfg buffer used internally * by the fft routine or NULL. * * If lenmem is NULL, then kiss_fft_alloc will allocate a cfg buffer using malloc. * The returned value should be free()d when done to avoid memory leaks. * * The state can be placed in a user supplied buffer 'mem': * If lenmem is not NULL and mem is not NULL and *lenmem is large enough, * then the function places the cfg in mem and the size used in *lenmem * and returns mem. * * If lenmem is not NULL and ( mem is NULL or *lenmem is not large enough), * then the function returns NULL and places the minimum cfg * buffer size in *lenmem. * */ kiss_fft_state *kiss_fft_alloc_twiddles(int nfft,void * mem,size_t * lenmem, const kiss_fft_state *base); kiss_fft_state *kiss_fft_alloc(int nfft,void * mem,size_t * lenmem); /** * kiss_fft(cfg,in_out_buf) * * Perform an FFT on a complex input buffer. * for a forward FFT, * fin should be f[0] , f[1] , ... ,f[nfft-1] * fout will be F[0] , F[1] , ... ,F[nfft-1] * Note that each element is complex and can be accessed like f[k].r and f[k].i * */ void kiss_fft(const kiss_fft_state *cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout); void kiss_ifft(const kiss_fft_state *cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout); void kiss_fft_free(const kiss_fft_state *cfg); #ifdef __cplusplus } #endif #endif mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/vq.c0000664000175000017500000002634514010707315021057 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "mathops.h" #include "cwrs.h" #include "vq.h" #include "arch.h" #include "os_support.h" #include "bands.h" #include "rate.h" #ifndef M_PI #define M_PI 3.141592653 #endif static void exp_rotation1(celt_norm *X, int len, int stride, celt_word16 c, celt_word16 s) { int i; celt_norm *Xptr; Xptr = X; for (i=0;i=0;i--) { celt_norm x1, x2; x1 = Xptr[0]; x2 = Xptr[stride]; Xptr[stride] = EXTRACT16(SHR32(MULT16_16(c,x2) + MULT16_16(s,x1), 15)); *Xptr-- = EXTRACT16(SHR32(MULT16_16(c,x1) - MULT16_16(s,x2), 15)); } } static void exp_rotation(celt_norm *X, int len, int dir, int stride, int K, int spread) { static const int SPREAD_FACTOR[3]={15,10,5}; int i; celt_word16 c, s; celt_word16 gain, theta; int stride2=0; int factor; /*int i; if (len>=30) { for (i=0;i=len || spread==SPREAD_NONE) return; factor = SPREAD_FACTOR[spread-1]; gain = celt_div((celt_word32)MULT16_16(Q15_ONE,len),(celt_word32)(len+factor*K)); /* FIXME: Make that HALF16 instead of HALF32 */ theta = HALF32(MULT16_16_Q15(gain,gain)); c = celt_cos_norm(EXTEND32(theta)); s = celt_cos_norm(EXTEND32(SUB16(Q15ONE,theta))); /* sin(theta) */ if (len>=8*stride) { stride2 = 1; /* This is just a simple way of computing sqrt(len/stride) with rounding. It's basically incrementing long as (stride2+0.5)^2 < len/stride. I _think_ it is bit-exact */ while ((stride2*stride2+stride2)*stride + (stride>>2) < len) stride2++; } /*TODO: We should be passing around log2(B), not B, for both this and for extract_collapse_mask().*/ len /= stride; for (i=0;i=30) { for (i=0;i>1; #endif t = VSHR32(Ryy, (k-7)<<1); g = MULT16_16_P15(celt_rsqrt_norm(t),gain); i=0; do X[i] = EXTRACT16(PSHR32(MULT16_16(g, iy[i]), k+1)); while (++i < N); } static unsigned extract_collapse_mask(int *iy, int N, int B) { unsigned collapse_mask; int N0; int i; if (B<=1) return 1; /*TODO: We should be passing around log2(B), not B, for both this and for exp_rotation().*/ N0 = N/B; collapse_mask = 0; i=0; do { int j; j=0; do { collapse_mask |= (iy[i*N0+j]!=0)<0) signx[j]=1; else { signx[j]=-1; X[j]=-X[j]; } iy[j] = 0; y[j] = 0; } while (++j (N>>1)) { celt_word16 rcp; j=0; do { sum += X[j]; } while (++j=1, "Allocated too many pulses in the quick pass"); /* This should never happen, but just in case it does (e.g. on silence) we fill the first bin with pulses. */ #ifdef FIXED_POINT_DEBUG celt_assert2(pulsesLeft<=N+3, "Not enough pulses in the quick pass"); #endif if (pulsesLeft > N+3) { celt_word16 tmp = pulsesLeft; yy = MAC16_16(yy, tmp, tmp); yy = MAC16_16(yy, tmp, y[0]); iy[0] += pulsesLeft; pulsesLeft=0; } s = 1; for (i=0;i= best_num/best_den, but that way we can do it without any division */ /* OPT: Make sure to use conditional moves here */ if (MULT16_16(best_den, Rxy) > MULT16_16(Ryy, best_num)) { best_den = Ryy; best_num = Rxy; best_id = j; } } while (++j>1; #endif t = VSHR32(E, (k-7)<<1); g = MULT16_16_P15(celt_rsqrt_norm(t),gain); xptr = X; for (i=0;i #include "bands.h" #include "modes.h" #include "vq.h" #include "cwrs.h" #include "stack_alloc.h" #include "os_support.h" #include "mathops.h" #include "rate.h" celt_uint32 lcg_rand(celt_uint32 seed) { return 1664525 * seed + 1013904223; } /* This is a cos() approximation designed to be bit-exact on any platform. Bit exactness with this approximation is important because it has an impact on the bit allocation */ static celt_int16 bitexact_cos(celt_int16 x) { celt_int32 tmp; celt_int16 x2; tmp = (4096+((celt_int32)(x)*(x)))>>13; if (tmp > 32767) tmp = 32767; x2 = tmp; x2 = (32767-x2) + FRAC_MUL16(x2, (-7651 + FRAC_MUL16(x2, (8277 + FRAC_MUL16(-626, x2))))); if (x2 > 32766) x2 = 32766; return 1+x2; } static int bitexact_log2tan(int isin,int icos) { int lc; int ls; lc=EC_ILOG(icos); ls=EC_ILOG(isin); icos<<=15-lc; isin<<=15-ls; return (ls-lc<<11) +FRAC_MUL16(isin, FRAC_MUL16(isin, -2597) + 7932) -FRAC_MUL16(icos, FRAC_MUL16(icos, -2597) + 7932); } #ifdef FIXED_POINT /* Compute the amplitude (sqrt energy) in each of the bands */ void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *bank, int end, int _C, int M) { int i, c, N; const celt_int16 *eBands = m->eBands; const int C = CHANNELS(_C); N = M*m->shortMdctSize; c=0; do { for (i=0;i 0) { int shift = celt_ilog2(maxval)-10; j=M*eBands[i]; do { sum = MAC16_16(sum, EXTRACT16(VSHR32(X[j+c*N],shift)), EXTRACT16(VSHR32(X[j+c*N],shift))); } while (++jnbEBands] = EPSILON+VSHR32(EXTEND32(celt_sqrt(sum)),-shift); } else { bank[i+c*m->nbEBands] = EPSILON; } /*printf ("%f ", bank[i+c*m->nbEBands]);*/ } } while (++ceBands; const int C = CHANNELS(_C); N = M*m->shortMdctSize; c=0; do { i=0; do { celt_word16 g; int j,shift; celt_word16 E; shift = celt_zlog2(bank[i+c*m->nbEBands])-13; E = VSHR32(bank[i+c*m->nbEBands], shift); g = EXTRACT16(celt_rcp(SHL32(E,3))); j=M*eBands[i]; do { X[j+c*N] = MULT16_16_Q15(VSHR32(freq[j+c*N],shift-1),g); } while (++jeBands; const int C = CHANNELS(_C); N = M*m->shortMdctSize; c=0; do { for (i=0;inbEBands] = celt_sqrt(sum); /*printf ("%f ", bank[i+c*m->nbEBands]);*/ } } while (++ceBands; const int C = CHANNELS(_C); N = M*m->shortMdctSize; c=0; do { for (i=0;inbEBands]); for (j=M*eBands[i];jeBands; const int C = CHANNELS(_C); N = M*m->shortMdctSize; celt_assert2(C<=2, "denormalise_bands() not implemented for >2 channels"); c=0; do { celt_sig * restrict f; const celt_norm * restrict x; f = freq+c*N; x = X+c*N; for (i=0;inbEBands],1); j=M*eBands[i]; band_end = M*eBands[i+1]; do { *f++ = SHL32(MULT16_32_Q15(*x, g),2); x++; } while (++jeBands[i+1]-m->eBands[i]; /* depth in 1/8 bits */ depth = (1+pulses[i])/(m->eBands[i+1]-m->eBands[i]<>1; t = SHL32(t, (7-shift)<<1); sqrt_1 = celt_rsqrt_norm(t); } #else thresh = .5f*celt_exp2(-.125f*depth); sqrt_1 = celt_rsqrt(N0<nbEBands+i]; prev2 = prev2logE[c*m->nbEBands+i]; if (CnbEBands+i]); prev2 = MAX16(prev2,prev2logE[m->nbEBands+i]); } Ediff = logE[c*m->nbEBands+i]-MIN16(prev1,prev2); Ediff = MAX16(0, Ediff); #ifdef FIXED_POINT if (Ediff < 16384) r = 2*MIN16(16383,SHR32(celt_exp2(-Ediff),1)); else r = 0; if (LM==3) r = MULT16_16_Q14(23170, MIN32(23169, r)); r = SHR16(MIN16(thresh, r),1); r = SHR32(MULT16_16_Q15(sqrt_1, r),shift); #else /* r needs to be multiplied by 2 or 2*sqrt(2) depending on LM because short blocks don't have the same energy as long */ r = 2.f*celt_exp2(-Ediff); if (LM==3) r *= 1.41421356f; r = MIN16(thresh, r); r = r*sqrt_1; #endif X = _X+c*size+(m->eBands[i]<nbEBands]))-13; #endif left = VSHR32(bank[i],shift); right = VSHR32(bank[i+m->nbEBands],shift); norm = EPSILON + celt_sqrt(EPSILON+MULT16_16(left,left)+MULT16_16(right,right)); a1 = DIV32_16(SHL32(EXTEND32(left),14),norm); a2 = DIV32_16(SHL32(EXTEND32(right),14),norm); for (j=0;j>1; kr = celt_ilog2(Er)>>1; #endif t = VSHR32(El, (kl-7)<<1); lgain = celt_rsqrt_norm(t); t = VSHR32(Er, (kr-7)<<1); rgain = celt_rsqrt_norm(t); #ifdef FIXED_POINT if (kl < 7) kl = 7; if (kr < 7) kr = 7; #endif for (j=0;jeBands; int decision; int hf_sum=0; N0 = M*m->shortMdctSize; if (M*(eBands[end]-eBands[end-1]) <= 8) return SPREAD_NONE; c=0; do { for (i=0;im->nbEBands-4) hf_sum += 32*(tcount[1]+tcount[0])/N; tmp = (2*tcount[2] >= N) + (2*tcount[1] >= N) + (2*tcount[0] >= N); sum += tmp*256; nbBands++; } } while (++cnbEBands+end); *hf_average = (*hf_average+hf_sum)>>1; hf_sum = *hf_average; if (*tapset_decision==2) hf_sum += 4; else if (*tapset_decision==0) hf_sum -= 4; if (hf_sum > 22) *tapset_decision=2; else if (hf_sum > 18) *tapset_decision=1; else *tapset_decision=0; } /*printf("%d %d %d\n", hf_sum, *hf_average, *tapset_decision);*/ sum /= nbBands; /* Recursive averaging */ sum = (sum+*average)>>1; *average = sum; /* Hysteresis */ sum = (3*sum + (((3-last_decision)<<7) + 64) + 2)>>2; if (sum < 80) { decision = SPREAD_AGGRESSIVE; } else if (sum < 256) { decision = SPREAD_NORMAL; } else if (sum < 384) { decision = SPREAD_LIGHT; } else { decision = SPREAD_NONE; } return decision; } #ifdef MEASURE_NORM_MSE float MSE[30] = {0}; int nbMSEBands = 0; int MSECount[30] = {0}; void dump_norm_mse(void) { int i; for (i=0;inbEBands;i++) { int j; int c; float g; if (bandE0[i]<10 || (C==2 && bandE0[i+m->nbEBands]<1)) continue; c=0; do { g = bandE[i+c*m->nbEBands]/(1e-15+bandE0[i+c*m->nbEBands]); for (j=M*m->eBands[i];jeBands[i+1];j++) MSE[i] += (g*X[j+c*N]-X0[j+c*N])*(g*X[j+c*N]-X0[j+c*N]); } while (++cnbEBands; } #endif /* Indexing table for converting from natural Hadamard to ordery Hadamard This is essentially a bit-reversed Gray, on top of which we've added an inversion of the order because we want the DC at the end rather than the beginning. The lines are for N=2, 4, 8, 16 */ static const int ordery_table[] = { 1, 0, 3, 0, 2, 1, 7, 0, 4, 3, 6, 1, 5, 2, 15, 0, 8, 7, 12, 3, 11, 4, 14, 1, 9, 6, 13, 2, 10, 5, }; static void deinterleave_hadamard(celt_norm *X, int N0, int stride, int hadamard) { int i,j; VARDECL(celt_norm, tmp); int N; SAVE_STACK; N = N0*stride; ALLOC(tmp, N, celt_norm); if (hadamard) { const int *ordery = ordery_table+stride-2; for (i=0;i>= 1; for (i=0;i>1)) { qn = 1; } else { qn = exp2_table8[qb&0x7]>>(14-(qb>>BITRES)); qn = (qn+1)>>1<<1; } celt_assert(qn <= 256); return qn; } /* This function is responsible for encoding and decoding a band for both the mono and stereo case. Even in the mono case, it can split the band in two and transmit the energy difference with the two half-bands. It can be called recursively so bands can end up being split in 8 parts. */ static unsigned quant_band(int encode, const CELTMode *m, int i, celt_norm *X, celt_norm *Y, int N, int b, int spread, int B, int intensity, int tf_change, celt_norm *lowband, int resynth, ec_ctx *ec, celt_int32 *remaining_bits, int LM, celt_norm *lowband_out, const celt_ener *bandE, int level, celt_uint32 *seed, celt_word16 gain, celt_norm *lowband_scratch, int fill) { const unsigned char *cache; int q; int curr_bits; int stereo, split; int imid=0, iside=0; int N0=N; int N_B=N; int N_B0; int B0=B; int time_divide=0; int recombine=0; int inv = 0; celt_word16 mid=0, side=0; int longBlocks; unsigned cm=0; longBlocks = B0==1; N_B /= B; N_B0 = N_B; split = stereo = Y != NULL; /* Special case for one sample */ if (N==1) { int c; celt_norm *x = X; c=0; do { int sign=0; if (*remaining_bits>=1<0) recombine = tf_change; /* Band recombining to increase frequency resolution */ if (lowband && (recombine || ((N_B&1) == 0 && tf_change<0) || B0>1)) { int j; for (j=0;j>k, 1<>k, 1<>4]<<2; } B>>=recombine; N_B<<=recombine; /* Increasing the time resolution */ while ((N_B&1) == 0 && tf_change<0) { if (encode) haar1(X, N_B, B); if (lowband) haar1(lowband, N_B, B); fill |= fill<>= 1; time_divide++; tf_change++; } B0=B; N_B0 = N_B; /* Reorganize the samples in time order instead of frequency order */ if (B0>1) { if (encode) deinterleave_hadamard(X, N_B>>recombine, B0<>recombine, B0<cache.bits + m->cache.index[(LM+1)*m->nbEBands+i]; if (!stereo && LM != -1 && b > cache[cache[0]]+12 && N>2) { if (LM>0 || (N&1)==0) { N >>= 1; Y = X+N; split = 1; LM -= 1; if (B==1) fill = fill&1|fill<<1; B = (B+1)>>1; } } if (split) { int qn; int itheta=0; int mbits, sbits, delta; int qalloc; int pulse_cap; int offset; int orig_fill; celt_int32 tell; /* Decide on the resolution to give to the split parameter theta */ pulse_cap = m->logN[i]+(LM<>1) - (stereo&&N==2 ? QTHETA_OFFSET_TWOPHASE : QTHETA_OFFSET); qn = compute_qn(N, b, offset, pulse_cap, stereo); if (stereo && i>=intensity) qn = 1; if (encode) { /* theta is the atan() of the ratio between the (normalized) side and mid. With just that parameter, we can re-scale both mid and side because we know that 1) they have unit norm and 2) they are orthogonal. */ itheta = stereo_itheta(X, Y, stereo, N); } tell = ec_tell_frac(ec); if (qn!=1) { if (encode) itheta = (itheta*qn+8192)>>14; /* Entropy coding of the angle. We use a uniform pdf for the time split, a step for stereo, and a triangular one for the rest. */ if (stereo && N>2) { int p0 = 3; int x = itheta; int x0 = qn/2; int ft = p0*(x0+1) + x0; /* Use a probability of p0 up to itheta=8192 and then use 1 after */ if (encode) { ec_encode(ec,x<=x0?p0*x:(x-1-x0)+(x0+1)*p0,x<=x0?p0*(x+1):(x-x0)+(x0+1)*p0,ft); } else { int fs; fs=ec_decode(ec,ft); if (fs<(x0+1)*p0) x=fs/p0; else x=x0+1+(fs-(x0+1)*p0); ec_dec_update(ec,x<=x0?p0*x:(x-1-x0)+(x0+1)*p0,x<=x0?p0*(x+1):(x-x0)+(x0+1)*p0,ft); itheta = x; } } else if (B0>1 || stereo) { /* Uniform pdf */ if (encode) ec_enc_uint(ec, itheta, qn+1); else itheta = ec_dec_uint(ec, qn+1); } else { int fs=1, ft; ft = ((qn>>1)+1)*((qn>>1)+1); if (encode) { int fl; fs = itheta <= (qn>>1) ? itheta + 1 : qn + 1 - itheta; fl = itheta <= (qn>>1) ? itheta*(itheta + 1)>>1 : ft - ((qn + 1 - itheta)*(qn + 2 - itheta)>>1); ec_encode(ec, fl, fl+fs, ft); } else { /* Triangular pdf */ int fl=0; int fm; fm = ec_decode(ec, ft); if (fm < ((qn>>1)*((qn>>1) + 1)>>1)) { itheta = (isqrt32(8*(celt_uint32)fm + 1) - 1)>>1; fs = itheta + 1; fl = itheta*(itheta + 1)>>1; } else { itheta = (2*(qn + 1) - isqrt32(8*(celt_uint32)(ft - fm - 1) + 1))>>1; fs = qn + 1 - itheta; fl = ft - ((qn + 1 - itheta)*(qn + 2 - itheta)>>1); } ec_dec_update(ec, fl, fl+fs, ft); } } itheta = (celt_int32)itheta*16384/qn; if (encode && stereo) { if (itheta==0) intensity_stereo(m, X, Y, bandE, i, N); else stereo_split(X, Y, N); } /* TODO: Renormalising X and Y *may* help fixed-point a bit at very high rate. Let's do that at higher complexity */ } else if (stereo) { if (encode) { inv = itheta > 8192; if (inv) { int j; for (j=0;j2< 2< 8192; *remaining_bits -= qalloc+sbits; x2 = c ? Y : X; y2 = c ? X : Y; if (sbits) { if (encode) { /* Here we only need to encode a sign for the side */ sign = x2[0]*y2[1] - x2[1]*y2[0] < 0; ec_enc_bits(ec, sign, 1); } else { sign = ec_dec_bits(ec, 1); } } sign = 1-2*sign; /* We use orig_fill here because we want to fold the side, but if itheta==16384, we'll have cleared the low bits of fill. */ cm = quant_band(encode, m, i, x2, NULL, N, mbits, spread, B, intensity, tf_change, lowband, resynth, ec, remaining_bits, LM, lowband_out, NULL, level, seed, gain, lowband_scratch, orig_fill); /* We don't split N=2 bands, so cm is either 1 or 0 (for a fold-collapse), and there's no need to worry about mixing with the other channel. */ y2[0] = -sign*x2[1]; y2[1] = sign*x2[0]; if (resynth) { celt_norm tmp; X[0] = MULT16_16_Q15(mid, X[0]); X[1] = MULT16_16_Q15(mid, X[1]); Y[0] = MULT16_16_Q15(side, Y[0]); Y[1] = MULT16_16_Q15(side, Y[1]); tmp = X[0]; X[0] = SUB16(tmp,Y[0]); Y[0] = ADD16(tmp,Y[0]); tmp = X[1]; X[1] = SUB16(tmp,Y[1]); Y[1] = ADD16(tmp,Y[1]); } } else { /* "Normal" split code */ celt_norm *next_lowband2=NULL; celt_norm *next_lowband_out1=NULL; int next_level=0; celt_int32 rebalance; /* Give more bits to low-energy MDCTs than they would otherwise deserve */ if (B0>1 && !stereo && (itheta&0x3fff)) { if (itheta > 8192) /* Rough approximation for pre-echo masking */ delta -= delta>>(4-LM); else /* Corresponds to a forward-masking slope of 1.5 dB per 10 ms */ delta = IMIN(0, delta + (N<>(5-LM))); } mbits = IMAX(0, IMIN(b, (b-delta)/2)); sbits = b-mbits; *remaining_bits -= qalloc; if (lowband && !stereo) next_lowband2 = lowband+N; /* >32-bit split case */ /* Only stereo needs to pass on lowband_out. Otherwise, it's handled at the end */ if (stereo) next_lowband_out1 = lowband_out; else next_level = level+1; rebalance = *remaining_bits; if (mbits >= sbits) { /* In stereo mode, we do not apply a scaling to the mid because we need the normalized mid for folding later */ cm = quant_band(encode, m, i, X, NULL, N, mbits, spread, B, intensity, tf_change, lowband, resynth, ec, remaining_bits, LM, next_lowband_out1, NULL, next_level, seed, stereo ? Q15ONE : MULT16_16_P15(gain,mid), lowband_scratch, fill); rebalance = mbits - (rebalance-*remaining_bits); if (rebalance > 3<>B)<<(B0>>1&stereo-1); } else { /* For a stereo split, the high bits of fill are always zero, so no folding will be done to the side. */ cm = quant_band(encode, m, i, Y, NULL, N, sbits, spread, B, intensity, tf_change, next_lowband2, resynth, ec, remaining_bits, LM, NULL, NULL, next_level, seed, MULT16_16_P15(gain,side), NULL, fill>>B)<<(B0>>1&stereo-1); rebalance = sbits - (rebalance-*remaining_bits); if (rebalance > 3< 0) { *remaining_bits += curr_bits; q--; curr_bits = pulses2bits(m, i, LM, q); *remaining_bits -= curr_bits; } if (q!=0) { int K = get_pulses(q); /* Finally do the actual quantization */ if (encode) cm = alg_quant(X, N, K, spread, B, resynth, ec, gain); else cm = alg_unquant(X, N, K, spread, B, ec, gain); } else { /* If there's no pulse, fill the band anyway */ int j; if (resynth) { unsigned cm_mask; /*B can be as large as 16, so this shift might overflow an int on a 16-bit platform; use a long to get defined behavior.*/ cm_mask = (unsigned)(1UL<>20; } cm = cm_mask; } else { /* Folded spectrum */ for (j=0;j1) interleave_hadamard(X, N_B>>recombine, B0<>= 1; N_B <<= 1; cm |= cm>>B; haar1(X, N_B, B); } for (k=0;k>k, 1<eBands; celt_norm * restrict norm, * restrict norm2; VARDECL(celt_norm, _norm); VARDECL(celt_norm, lowband_scratch); int B; int M; int lowband_offset; int update_lowband = 1; int C = _Y != NULL ? 2 : 1; SAVE_STACK; M = 1<nbEBands], celt_norm); ALLOC(lowband_scratch, M*(eBands[m->nbEBands]-eBands[m->nbEBands-1]), celt_norm); norm = _norm; norm2 = norm + M*eBands[m->nbEBands]; lowband_offset = 0; for (i=start;i= M*eBands[start] && (update_lowband || lowband_offset==0)) lowband_offset = i; tf_change = tf_res[i]; if (i>=m->effEBands) { X=norm; if (_Y!=NULL) Y = norm; } /* Get a conservative estimate of the collapse_mask's for the bands we're going to be folding from. */ if (lowband_offset != 0 && (spread!=SPREAD_AGGRESSIVE || B>1 || tf_change<0)) { int fold_start; int fold_end; int fold_i; /* This ensures we never repeat spectral content within one band */ effective_lowband = IMAX(M*eBands[start], M*eBands[lowband_offset]-N); fold_start = lowband_offset; while(M*eBands[--fold_start] > effective_lowband); fold_end = lowband_offset-1; while(M*eBands[++fold_end] < effective_lowband+N); x_cm = y_cm = 0; fold_i = fold_start; do { x_cm |= collapse_masks[fold_i*C+0]; y_cm |= collapse_masks[fold_i*C+C-1]; } while (++fold_i(N<>15; } void ec_laplace_encode(ec_enc *enc, int *value, int fs, int decay) { unsigned fl; int val = *value; fl = 0; if (val) { int s; int i; s = -(val<0); val = val+s^s; fl = fs; fs = ec_laplace_get_freq1(fs, decay); /* Search the decaying part of the PDF.*/ for (i=1; fs > 0 && i < val; i++) { fs *= 2; fl += fs+2*LAPLACE_MINP; fs = (fs*(celt_int32)decay)>>15; } /* Everything beyond that has probability LAPLACE_MINP. */ if (fs <= 0) { int di; int ndi_max; ndi_max = (32768-fl+LAPLACE_MINP-1)>>LAPLACE_LOG_MINP; ndi_max = (ndi_max-s)>>1; di = IMIN(val - i, ndi_max - 1); fl += (2*di+1+s)*LAPLACE_MINP; fs = IMIN(LAPLACE_MINP, 32768-fl); *value = i+di+s^s; } else { fs += LAPLACE_MINP; fl += fs&~s; } celt_assert(fl+fs<=32768); celt_assert(fs>0); } ec_encode_bin(enc, fl, fl+fs, 15); } int ec_laplace_decode(ec_dec *dec, int fs, int decay) { int val=0; unsigned fl; int fm; fm = ec_decode_bin(dec, 15); fl = 0; if (fm >= fs) { val++; fl = fs; fs = ec_laplace_get_freq1(fs, decay)+LAPLACE_MINP; /* Search the decaying part of the PDF.*/ while(fs > LAPLACE_MINP && fm >= fl+2*fs) { fs *= 2; fl += fs; fs = ((fs-2*LAPLACE_MINP)*(celt_int32)decay)>>15; fs += LAPLACE_MINP; val++; } /* Everything beyond that has probability LAPLACE_MINP. */ if (fs <= LAPLACE_MINP) { int di; di = (fm-fl)>>(LAPLACE_LOG_MINP+1); val += di; fl += 2*di*LAPLACE_MINP; } if (fm < fl+fs) val = -val; else fl += fs; } celt_assert(fl<32768); celt_assert(fs>0); celt_assert(fl<=fm); celt_assert(fm #include "os_support.h" #include "mathops.h" #include "stack_alloc.h" #ifndef M_PI #define M_PI 3.141592653 #endif #ifdef CUSTOM_MODES void clt_mdct_init(mdct_lookup *l,int N, int maxshift) { int i; int N4, N2; kiss_twiddle_scalar *trig; l->n = N; N2 = N>>1; N4 = N>>2; l->maxshift = maxshift; for (i=0;i<=maxshift;i++) { if (i==0) l->kfft[i] = kiss_fft_alloc(N>>2>>i, 0, 0); else l->kfft[i] = kiss_fft_alloc_twiddles(N>>2>>i, 0, 0, l->kfft[0]); #ifndef ENABLE_TI_DSPLIB55 if (l->kfft[i]==NULL) return; #endif } l->trig = trig = (kiss_twiddle_scalar*)celt_alloc((N4+1)*sizeof(kiss_twiddle_scalar)); if (l->trig==NULL) return; /* We have enough points that sine isn't necessary */ #if defined(FIXED_POINT) for (i=0;i<=N4;i++) trig[i] = TRIG_UPSCALE*celt_cos_norm(DIV32(ADD32(SHL32(EXTEND32(i),17),N2),N)); #else for (i=0;i<=N4;i++) trig[i] = (kiss_twiddle_scalar)cos(2*M_PI*i/N); #endif } void clt_mdct_clear(mdct_lookup *l) { int i; for (i=0;i<=l->maxshift;i++) kiss_fft_free(l->kfft[i]); celt_free((kiss_twiddle_scalar*)l->trig); } #endif /* CUSTOM_MODES */ void clt_mdct_forward(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar * restrict out, const celt_word16 *window, int overlap, int shift) { int i; int N, N2, N4; kiss_twiddle_scalar sine; VARDECL(kiss_fft_scalar, f); SAVE_STACK; N = l->n; N >>= shift; N2 = N>>1; N4 = N>>2; ALLOC(f, N2, kiss_fft_scalar); /* sin(x) ~= x here */ #ifdef FIXED_POINT sine = TRIG_UPSCALE*(QCONST16(0.7853981f, 15)+N2)/N; #else sine = (kiss_twiddle_scalar)2*M_PI*(.125f)/N; #endif /* Consider the input to be composed of four blocks: [a, b, c, d] */ /* Window, shuffle, fold */ { /* Temp pointers to make it really clear to the compiler what we're doing */ const kiss_fft_scalar * restrict xp1 = in+(overlap>>1); const kiss_fft_scalar * restrict xp2 = in+N2-1+(overlap>>1); kiss_fft_scalar * restrict yp = out; const celt_word16 * restrict wp1 = window+(overlap>>1); const celt_word16 * restrict wp2 = window+(overlap>>1)-1; for(i=0;i<(overlap>>2);i++) { /* Real part arranged as -d-cR, Imag part arranged as -b+aR*/ *yp++ = MULT16_32_Q15(*wp2, xp1[N2]) + MULT16_32_Q15(*wp1,*xp2); *yp++ = MULT16_32_Q15(*wp1, *xp1) - MULT16_32_Q15(*wp2, xp2[-N2]); xp1+=2; xp2-=2; wp1+=2; wp2-=2; } wp1 = window; wp2 = window+overlap-1; for(;i>2);i++) { /* Real part arranged as a-bR, Imag part arranged as -c-dR */ *yp++ = *xp2; *yp++ = *xp1; xp1+=2; xp2-=2; } for(;itrig[0]; for(i=0;ikfft[shift], (kiss_fft_cpx *)out, (kiss_fft_cpx *)f); /* Post-rotate */ { /* Temp pointers to make it really clear to the compiler what we're doing */ const kiss_fft_scalar * restrict fp = f; kiss_fft_scalar * restrict yp1 = out; kiss_fft_scalar * restrict yp2 = out+N2-1; const kiss_twiddle_scalar *t = &l->trig[0]; /* Temp pointers to make it really clear to the compiler what we're doing */ for(i=0;in; N >>= shift; N2 = N>>1; N4 = N>>2; ALLOC(f, N2, kiss_fft_scalar); ALLOC(f2, N2, kiss_fft_scalar); /* sin(x) ~= x here */ #ifdef FIXED_POINT sine = TRIG_UPSCALE*(QCONST16(0.7853981f, 15)+N2)/N; #else sine = (kiss_twiddle_scalar)2*M_PI*(.125f)/N; #endif /* Pre-rotate */ { /* Temp pointers to make it really clear to the compiler what we're doing */ const kiss_fft_scalar * restrict xp1 = in; const kiss_fft_scalar * restrict xp2 = in+N2-1; kiss_fft_scalar * restrict yp = f2; const kiss_twiddle_scalar *t = &l->trig[0]; for(i=0;ikfft[shift], (kiss_fft_cpx *)f2, (kiss_fft_cpx *)f); /* Post-rotate */ { kiss_fft_scalar * restrict fp = f; const kiss_twiddle_scalar *t = &l->trig[0]; for(i=0;i>1; /* Mirror on both sides for TDAC */ { kiss_fft_scalar * restrict fp1 = f2+N4-1; kiss_fft_scalar * restrict xp1 = out+N2-1; kiss_fft_scalar * restrict yp1 = out+N4-overlap/2; const celt_word16 * restrict wp1 = window; const celt_word16 * restrict wp2 = window+overlap-1; for(i = 0; i< N4-overlap/2; i++) { *xp1 = *fp1; xp1--; fp1--; } for(; i < N4; i++) { kiss_fft_scalar x1; x1 = *fp1--; *yp1++ +=-MULT16_32_Q15(*wp1, x1); *xp1-- += MULT16_32_Q15(*wp2, x1); wp1++; wp2--; } } { kiss_fft_scalar * restrict fp2 = f2+N4; kiss_fft_scalar * restrict xp2 = out+N2; kiss_fft_scalar * restrict yp2 = out+N-1-(N4-overlap/2); const celt_word16 * restrict wp1 = window; const celt_word16 * restrict wp2 = window+overlap-1; for(i = 0; i< N4-overlap/2; i++) { *xp2 = *fp2; xp2++; fp2++; } for(; i < N4; i++) { kiss_fft_scalar x2; x2 = *fp2++; *yp2-- = MULT16_32_Q15(*wp1, x2); *xp2++ = MULT16_32_Q15(*wp2, x2); wp1++; wp2--; } } RESTORE_STACK; } mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/quant_bands.h0000664000175000017500000000560314010707315022727 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef QUANT_BANDS #define QUANT_BANDS #include "arch.h" #include "modes.h" #include "entenc.h" #include "entdec.h" #include "mathops.h" void amp2Log2(const CELTMode *m, int effEnd, int end, celt_ener *bandE, celt_word16 *bandLogE, int _C); void log2Amp(const CELTMode *m, int start, int end, celt_ener *eBands, celt_word16 *oldEBands, int _C); unsigned char *quant_prob_alloc(const CELTMode *m); void quant_prob_free(const celt_int16 *freq); void quant_coarse_energy(const CELTMode *m, int start, int end, int effEnd, const celt_word16 *eBands, celt_word16 *oldEBands, ec_uint32 budget, celt_word16 *error, ec_enc *enc, int _C, int LM, int nbAvailableBytes, int force_intra, int *delayedIntra, int two_pass); void quant_fine_energy(const CELTMode *m, int start, int end, celt_word16 *oldEBands, celt_word16 *error, int *fine_quant, ec_enc *enc, int _C); void quant_energy_finalise(const CELTMode *m, int start, int end, celt_word16 *oldEBands, celt_word16 *error, int *fine_quant, int *fine_priority, int bits_left, ec_enc *enc, int _C); void unquant_coarse_energy(const CELTMode *m, int start, int end, celt_word16 *oldEBands, int intra, ec_dec *dec, int _C, int LM); void unquant_fine_energy(const CELTMode *m, int start, int end, celt_word16 *oldEBands, int *fine_quant, ec_dec *dec, int _C); void unquant_energy_finalise(const CELTMode *m, int start, int end, celt_word16 *oldEBands, int *fine_quant, int *fine_priority, int bits_left, ec_dec *dec, int _C); #endif /* QUANT_BANDS */ mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/cwrs.c0000664000175000017500000005420314010707315021401 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Copyright (c) 2007-2009 Timothy B. Terriberry Written by Timothy B. Terriberry and Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "os_support.h" #include #include #include "cwrs.h" #include "mathops.h" #include "arch.h" /*Guaranteed to return a conservatively large estimate of the binary logarithm with frac bits of fractional precision. Tested for all possible 32-bit inputs with frac=4, where the maximum overestimation is 0.06254243 bits.*/ int log2_frac(ec_uint32 val, int frac) { int l; l=EC_ILOG(val); if(val&val-1){ /*This is (val>>l-16), but guaranteed to round up, even if adding a bias before the shift would cause overflow (e.g., for 0xFFFFxxxx).*/ if(l>16)val=(val>>l-16)+((val&(1<>l-16); else val<<=16-l; l=l-1<>16); l+=b<>b; val=val*val+0x7FFF>>15; } while(frac-->0); /*If val is not exactly 0x8000, then we have to round up the remainder.*/ return l+(val>0x8000); } /*Exact powers of two require no rounding.*/ else return l-1<0); shift=EC_ILOG(_d^_d-1); celt_assert(_d<=256); inv=INV_TABLE[_d-1>>shift]; shift--; one=1<>shift)-(_c>>shift)+ (_a*(_b&mask)+one-(_c&mask)>>shift)-1)*inv&MASK32; } #endif /* SMALL_FOOTPRINT */ /*Although derived separately, the pulse vector coding scheme is equivalent to a Pyramid Vector Quantizer \cite{Fis86}. Some additional notes about an early version appear at http://people.xiph.org/~tterribe/notes/cwrs.html, but the codebook ordering and the definitions of some terms have evolved since that was written. The conversion from a pulse vector to an integer index (encoding) and back (decoding) is governed by two related functions, V(N,K) and U(N,K). V(N,K) = the number of combinations, with replacement, of N items, taken K at a time, when a sign bit is added to each item taken at least once (i.e., the number of N-dimensional unit pulse vectors with K pulses). One way to compute this is via V(N,K) = K>0 ? sum(k=1...K,2**k*choose(N,k)*choose(K-1,k-1)) : 1, where choose() is the binomial function. A table of values for N<10 and K<10 looks like: V[10][10] = { {1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {1, 2, 2, 2, 2, 2, 2, 2, 2, 2}, {1, 4, 8, 12, 16, 20, 24, 28, 32, 36}, {1, 6, 18, 38, 66, 102, 146, 198, 258, 326}, {1, 8, 32, 88, 192, 360, 608, 952, 1408, 1992}, {1, 10, 50, 170, 450, 1002, 1970, 3530, 5890, 9290}, {1, 12, 72, 292, 912, 2364, 5336, 10836, 20256, 35436}, {1, 14, 98, 462, 1666, 4942, 12642, 28814, 59906, 115598}, {1, 16, 128, 688, 2816, 9424, 27008, 68464, 157184, 332688}, {1, 18, 162, 978, 4482, 16722, 53154, 148626, 374274, 864146} }; U(N,K) = the number of such combinations wherein N-1 objects are taken at most K-1 at a time. This is given by U(N,K) = sum(k=0...K-1,V(N-1,k)) = K>0 ? (V(N-1,K-1) + V(N,K-1))/2 : 0. The latter expression also makes clear that U(N,K) is half the number of such combinations wherein the first object is taken at least once. Although it may not be clear from either of these definitions, U(N,K) is the natural function to work with when enumerating the pulse vector codebooks, not V(N,K). U(N,K) is not well-defined for N=0, but with the extension U(0,K) = K>0 ? 0 : 1, the function becomes symmetric: U(N,K) = U(K,N), with a similar table: U[10][10] = { {1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {0, 1, 3, 5, 7, 9, 11, 13, 15, 17}, {0, 1, 5, 13, 25, 41, 61, 85, 113, 145}, {0, 1, 7, 25, 63, 129, 231, 377, 575, 833}, {0, 1, 9, 41, 129, 321, 681, 1289, 2241, 3649}, {0, 1, 11, 61, 231, 681, 1683, 3653, 7183, 13073}, {0, 1, 13, 85, 377, 1289, 3653, 8989, 19825, 40081}, {0, 1, 15, 113, 575, 2241, 7183, 19825, 48639, 108545}, {0, 1, 17, 145, 833, 3649, 13073, 40081, 108545, 265729} }; With this extension, V(N,K) may be written in terms of U(N,K): V(N,K) = U(N,K) + U(N,K+1) for all N>=0, K>=0. Thus U(N,K+1) represents the number of combinations where the first element is positive or zero, and U(N,K) represents the number of combinations where it is negative. With a large enough table of U(N,K) values, we could write O(N) encoding and O(min(N*log(K),N+K)) decoding routines, but such a table would be prohibitively large for small embedded devices (K may be as large as 32767 for small N, and N may be as large as 200). Both functions obey the same recurrence relation: V(N,K) = V(N-1,K) + V(N,K-1) + V(N-1,K-1), U(N,K) = U(N-1,K) + U(N,K-1) + U(N-1,K-1), for all N>0, K>0, with different initial conditions at N=0 or K=0. This allows us to construct a row of one of the tables above given the previous row or the next row. Thus we can derive O(NK) encoding and decoding routines with O(K) memory using only addition and subtraction. When encoding, we build up from the U(2,K) row and work our way forwards. When decoding, we need to start at the U(N,K) row and work our way backwards, which requires a means of computing U(N,K). U(N,K) may be computed from two previous values with the same N: U(N,K) = ((2*N-1)*U(N,K-1) - U(N,K-2))/(K-1) + U(N,K-2) for all N>1, and since U(N,K) is symmetric, a similar relation holds for two previous values with the same K: U(N,K>1) = ((2*K-1)*U(N-1,K) - U(N-2,K))/(N-1) + U(N-2,K) for all K>1. This allows us to construct an arbitrary row of the U(N,K) table by starting with the first two values, which are constants. This saves roughly 2/3 the work in our O(NK) decoding routine, but costs O(K) multiplications. Similar relations can be derived for V(N,K), but are not used here. For N>0 and K>0, U(N,K) and V(N,K) take on the form of an (N-1)-degree polynomial for fixed N. The first few are U(1,K) = 1, U(2,K) = 2*K-1, U(3,K) = (2*K-2)*K+1, U(4,K) = (((4*K-6)*K+8)*K-3)/3, U(5,K) = ((((2*K-4)*K+10)*K-8)*K+3)/3, and V(1,K) = 2, V(2,K) = 4*K, V(3,K) = 4*K*K+2, V(4,K) = 8*(K*K+2)*K/3, V(5,K) = ((4*K*K+20)*K*K+6)/3, for all K>0. This allows us to derive O(N) encoding and O(N*log(K)) decoding routines for small N (and indeed decoding is also O(N) for N<3). @ARTICLE{Fis86, author="Thomas R. Fischer", title="A Pyramid Vector Quantizer", journal="IEEE Transactions on Information Theory", volume="IT-32", number=4, pages="568--583", month=Jul, year=1986 }*/ #ifndef SMALL_FOOTPRINT /*Compute U(1,_k).*/ static inline unsigned ucwrs1(int _k){ return _k?1:0; } /*Compute V(1,_k).*/ static inline unsigned ncwrs1(int _k){ return _k?2:1; } /*Compute U(2,_k). Note that this may be called with _k=32768 (maxK[2]+1).*/ static inline unsigned ucwrs2(unsigned _k){ return _k?_k+(_k-1):0; } /*Compute V(2,_k).*/ static inline celt_uint32 ncwrs2(int _k){ return _k?4*(celt_uint32)_k:1; } /*Compute U(3,_k). Note that this may be called with _k=32768 (maxK[3]+1).*/ static inline celt_uint32 ucwrs3(unsigned _k){ return _k?(2*(celt_uint32)_k-2)*_k+1:0; } /*Compute V(3,_k).*/ static inline celt_uint32 ncwrs3(int _k){ return _k?2*(2*(unsigned)_k*(celt_uint32)_k+1):1; } /*Compute U(4,_k).*/ static inline celt_uint32 ucwrs4(int _k){ return _k?imusdiv32odd(2*_k,(2*_k-3)*(celt_uint32)_k+4,3,1):0; } /*Compute V(4,_k).*/ static inline celt_uint32 ncwrs4(int _k){ return _k?((_k*(celt_uint32)_k+2)*_k)/3<<3:1; } /*Compute U(5,_k).*/ static inline celt_uint32 ucwrs5(int _k){ return _k?(((((_k-2)*(unsigned)_k+5)*(celt_uint32)_k-4)*_k)/3<<1)+1:0; } /*Compute V(5,_k).*/ static inline celt_uint32 ncwrs5(int _k){ return _k?(((_k*(unsigned)_k+5)*(celt_uint32)_k*_k)/3<<2)+2:1; } #endif /* SMALL_FOOTPRINT */ /*Computes the next row/column of any recurrence that obeys the relation u[i][j]=u[i-1][j]+u[i][j-1]+u[i-1][j-1]. _ui0 is the base case for the new row/column.*/ static inline void unext(celt_uint32 *_ui,unsigned _len,celt_uint32 _ui0){ celt_uint32 ui1; unsigned j; /*This do-while will overrun the array if we don't have storage for at least 2 values.*/ j=1; do { ui1=UADD32(UADD32(_ui[j],_ui[j-1]),_ui0); _ui[j-1]=_ui0; _ui0=ui1; } while (++j<_len); _ui[j-1]=_ui0; } /*Computes the previous row/column of any recurrence that obeys the relation u[i-1][j]=u[i][j]-u[i][j-1]-u[i-1][j-1]. _ui0 is the base case for the new row/column.*/ static inline void uprev(celt_uint32 *_ui,unsigned _n,celt_uint32 _ui0){ celt_uint32 ui1; unsigned j; /*This do-while will overrun the array if we don't have storage for at least 2 values.*/ j=1; do { ui1=USUB32(USUB32(_ui[j],_ui[j-1]),_ui0); _ui[j-1]=_ui0; _ui0=ui1; } while (++j<_n); _ui[j-1]=_ui0; } /*Compute V(_n,_k), as well as U(_n,0..._k+1). _u: On exit, _u[i] contains U(_n,i) for i in [0..._k+1].*/ static celt_uint32 ncwrs_urow(unsigned _n,unsigned _k,celt_uint32 *_u){ celt_uint32 um2; unsigned len; unsigned k; len=_k+2; /*We require storage at least 3 values (e.g., _k>0).*/ celt_assert(len>=3); _u[0]=0; _u[1]=um2=1; #ifndef SMALL_FOOTPRINT if(_n<=6 || _k>255) #endif { /*If _n==0, _u[0] should be 1 and the rest should be 0.*/ /*If _n==1, _u[i] should be 1 for i>1.*/ celt_assert(_n>=2); /*If _k==0, the following do-while loop will overflow the buffer.*/ celt_assert(_k>0); k=2; do _u[k]=(k<<1)-1; while(++k=len)break; _u[k]=um1=imusdiv32odd(n2m1,um2,um1,k-1>>1)+um1; } } #endif /* SMALL_FOOTPRINT */ return _u[_k]+_u[_k+1]; } /*Returns the _i'th combination of _k elements (at most 32767) chosen from a set of size 1 with associated sign bits. _y: Returns the vector of pulses.*/ static inline void cwrsi1(int _k,celt_uint32 _i,int *_y){ int s; s=-(int)_i; _y[0]=_k+s^s; } #ifndef SMALL_FOOTPRINT /*Returns the _i'th combination of _k elements (at most 32767) chosen from a set of size 2 with associated sign bits. _y: Returns the vector of pulses.*/ static inline void cwrsi2(int _k,celt_uint32 _i,int *_y){ celt_uint32 p; int s; int yj; p=ucwrs2(_k+1U); s=-(_i>=p); _i-=p&s; yj=_k; _k=_i+1>>1; p=ucwrs2(_k); _i-=p; yj-=_k; _y[0]=yj+s^s; cwrsi1(_k,_i,_y+1); } /*Returns the _i'th combination of _k elements (at most 32767) chosen from a set of size 3 with associated sign bits. _y: Returns the vector of pulses.*/ static void cwrsi3(int _k,celt_uint32 _i,int *_y){ celt_uint32 p; int s; int yj; p=ucwrs3(_k+1U); s=-(_i>=p); _i-=p&s; yj=_k; /*Finds the maximum _k such that ucwrs3(_k)<=_i (tested for all _i<2147418113=U(3,32768)).*/ _k=_i>0?isqrt32(2*_i-1)+1>>1:0; p=ucwrs3(_k); _i-=p; yj-=_k; _y[0]=yj+s^s; cwrsi2(_k,_i,_y+1); } /*Returns the _i'th combination of _k elements (at most 1172) chosen from a set of size 4 with associated sign bits. _y: Returns the vector of pulses.*/ static void cwrsi4(int _k,celt_uint32 _i,int *_y){ celt_uint32 p; int s; int yj; int kl; int kr; p=ucwrs4(_k+1); s=-(_i>=p); _i-=p&s; yj=_k; /*We could solve a cubic for k here, but the form of the direct solution does not lend itself well to exact integer arithmetic. Instead we do a binary search on U(4,K).*/ kl=0; kr=_k; for(;;){ _k=kl+kr>>1; p=ucwrs4(_k); if(p<_i){ if(_k>=kr)break; kl=_k+1; } else if(p>_i)kr=_k-1; else break; } _i-=p; yj-=_k; _y[0]=yj+s^s; cwrsi3(_k,_i,_y+1); } /*Returns the _i'th combination of _k elements (at most 238) chosen from a set of size 5 with associated sign bits. _y: Returns the vector of pulses.*/ static void cwrsi5(int _k,celt_uint32 _i,int *_y){ celt_uint32 p; int s; int yj; p=ucwrs5(_k+1); s=-(_i>=p); _i-=p&s; yj=_k; /* A binary search on U(5,K) avoids the need for 64-bit arithmetic */ { int kl=0; int kr=_k; for(;;){ _k=kl+kr>>1; p=ucwrs5(_k); if(p<_i){ if(_k>=kr)break; kl=_k+1; } else if(p>_i)kr=_k-1; else break; } } _i-=p; yj-=_k; _y[0]=yj+s^s; cwrsi4(_k,_i,_y+1); } #endif /* SMALL_FOOTPRINT */ /*Returns the _i'th combination of _k elements chosen from a set of size _n with associated sign bits. _y: Returns the vector of pulses. _u: Must contain entries [0..._k+1] of row _n of U() on input. Its contents will be destructively modified.*/ static void cwrsi(int _n,int _k,celt_uint32 _i,int *_y,celt_uint32 *_u){ int j; celt_assert(_n>0); j=0; do{ celt_uint32 p; int s; int yj; p=_u[_k+1]; s=-(_i>=p); _i-=p&s; yj=_k; p=_u[_k]; while(p>_i)p=_u[--_k]; _i-=p; yj-=_k; _y[j]=yj+s^s; uprev(_u,_k+2,0); } while(++j<_n); } /*Returns the index of the given combination of K elements chosen from a set of size 1 with associated sign bits. _y: The vector of pulses, whose sum of absolute values is K. _k: Returns K.*/ static inline celt_uint32 icwrs1(const int *_y,int *_k){ *_k=abs(_y[0]); return _y[0]<0; } #ifndef SMALL_FOOTPRINT /*Returns the index of the given combination of K elements chosen from a set of size 2 with associated sign bits. _y: The vector of pulses, whose sum of absolute values is K. _k: Returns K.*/ static inline celt_uint32 icwrs2(const int *_y,int *_k){ celt_uint32 i; int k; i=icwrs1(_y+1,&k); i+=ucwrs2(k); k+=abs(_y[0]); if(_y[0]<0)i+=ucwrs2(k+1U); *_k=k; return i; } /*Returns the index of the given combination of K elements chosen from a set of size 3 with associated sign bits. _y: The vector of pulses, whose sum of absolute values is K. _k: Returns K.*/ static inline celt_uint32 icwrs3(const int *_y,int *_k){ celt_uint32 i; int k; i=icwrs2(_y+1,&k); i+=ucwrs3(k); k+=abs(_y[0]); if(_y[0]<0)i+=ucwrs3(k+1U); *_k=k; return i; } /*Returns the index of the given combination of K elements chosen from a set of size 4 with associated sign bits. _y: The vector of pulses, whose sum of absolute values is K. _k: Returns K.*/ static inline celt_uint32 icwrs4(const int *_y,int *_k){ celt_uint32 i; int k; i=icwrs3(_y+1,&k); i+=ucwrs4(k); k+=abs(_y[0]); if(_y[0]<0)i+=ucwrs4(k+1); *_k=k; return i; } /*Returns the index of the given combination of K elements chosen from a set of size 5 with associated sign bits. _y: The vector of pulses, whose sum of absolute values is K. _k: Returns K.*/ static inline celt_uint32 icwrs5(const int *_y,int *_k){ celt_uint32 i; int k; i=icwrs4(_y+1,&k); i+=ucwrs5(k); k+=abs(_y[0]); if(_y[0]<0)i+=ucwrs5(k+1); *_k=k; return i; } #endif /* SMALL_FOOTPRINT */ /*Returns the index of the given combination of K elements chosen from a set of size _n with associated sign bits. _y: The vector of pulses, whose sum of absolute values must be _k. _nc: Returns V(_n,_k).*/ celt_uint32 icwrs(int _n,int _k,celt_uint32 *_nc,const int *_y, celt_uint32 *_u){ celt_uint32 i; int j; int k; /*We can't unroll the first two iterations of the loop unless _n>=2.*/ celt_assert(_n>=2); _u[0]=0; for(k=1;k<=_k+1;k++)_u[k]=(k<<1)-1; i=icwrs1(_y+_n-1,&k); j=_n-2; i+=_u[k]; k+=abs(_y[j]); if(_y[j]<0)i+=_u[k+1]; while(j-->0){ unext(_u,_k+2,0); i+=_u[k]; k+=abs(_y[j]); if(_y[j]<0)i+=_u[k+1]; } *_nc=_u[k]+_u[k+1]; return i; } #ifdef CUSTOM_MODES void get_required_bits(celt_int16 *_bits,int _n,int _maxk,int _frac){ int k; /*_maxk==0 => there's nothing to do.*/ celt_assert(_maxk>0); _bits[0]=0; if (_n==1) { for (k=1;k<=_maxk;k++) _bits[k] = 1<<_frac; } else { VARDECL(celt_uint32,u); SAVE_STACK; ALLOC(u,_maxk+2U,celt_uint32); ncwrs_urow(_n,_maxk,u); for(k=1;k<=_maxk;k++) _bits[k]=log2_frac(u[k]+u[k+1],_frac); RESTORE_STACK; } } #endif /* CUSTOM_MODES */ void encode_pulses(const int *_y,int _n,int _k,ec_enc *_enc){ celt_uint32 i; if (_k==0) return; switch(_n){ case 1:{ i=icwrs1(_y,&_k); celt_assert(ncwrs1(_k)==2); ec_enc_bits(_enc,i,1); }break; #ifndef SMALL_FOOTPRINT case 2:{ i=icwrs2(_y,&_k); ec_enc_uint(_enc,i,ncwrs2(_k)); }break; case 3:{ i=icwrs3(_y,&_k); ec_enc_uint(_enc,i,ncwrs3(_k)); }break; case 4:{ i=icwrs4(_y,&_k); ec_enc_uint(_enc,i,ncwrs4(_k)); }break; case 5:{ i=icwrs5(_y,&_k); ec_enc_uint(_enc,i,ncwrs5(_k)); }break; #endif default: { VARDECL(celt_uint32,u); celt_uint32 nc; SAVE_STACK; ALLOC(u,_k+2U,celt_uint32); i=icwrs(_n,_k,&nc,_y,u); ec_enc_uint(_enc,i,nc); RESTORE_STACK; }; } } void decode_pulses(int *_y,int _n,int _k,ec_dec *_dec) { if (_k==0) { int i; for (i=0;i<_n;i++) _y[i] = 0; return; } switch(_n){ case 1:{ celt_assert(ncwrs1(_k)==2); cwrsi1(_k,ec_dec_bits(_dec,1),_y); }break; #ifndef SMALL_FOOTPRINT case 2:cwrsi2(_k,ec_dec_uint(_dec,ncwrs2(_k)),_y);break; case 3:cwrsi3(_k,ec_dec_uint(_dec,ncwrs3(_k)),_y);break; case 4:cwrsi4(_k,ec_dec_uint(_dec,ncwrs4(_k)),_y);break; case 5:cwrsi5(_k,ec_dec_uint(_dec,ncwrs5(_k)),_y);break; #endif default: { VARDECL(celt_uint32,u); SAVE_STACK; ALLOC(u,_k+2U,celt_uint32); cwrsi(_n,_k,ec_dec_uint(_dec,ncwrs_urow(_n,_k,u)),_y,u); RESTORE_STACK; } } } mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/fixed_c6x.h0000664000175000017500000000453314010707315022310 0ustar builderbuilder/* Copyright (C) 2008 CSIRO */ /** @file fixed_c6x.h @brief Fixed-point operations for the TI C6x DSP family */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef FIXED_C6X_H #define FIXED_C6X_H #undef MULT16_16SU #define MULT16_16SU(a,b) _mpysu(a,b) #undef MULT_16_16 #define MULT_16_16(a,b) _mpy(a,b) #define celt_ilog2(x) (30 - _norm(x)) #define OVERRIDE_CELT_ILOG2 #undef MULT16_32_Q15 #define MULT16_32_Q15(a,b) (_mpylill(a, b) >> 15) #if 0 #include "dsplib.h" #undef MAX16 #define MAX16(a,b) _max(a,b) #undef MIN16 #define MIN16(a,b) _min(a,b) #undef MAX32 #define MAX32(a,b) _lmax(a,b) #undef MIN32 #define MIN32(a,b) _lmin(a,b) #undef VSHR32 #define VSHR32(a, shift) _lshl(a,-(shift)) #undef MULT16_16_Q15 #define MULT16_16_Q15(a,b) (_smpy(a,b)) #define celt_maxabs16(x, len) MAX16(maxval((DATA *)x, len),-minval((DATA *)x, len)) #define OVERRIDE_CELT_MAXABS16 #define OVERRIDE_FIND_MAX16 static inline int find_max16(celt_word16 *x, int len) { DATA max_corr16 = -VERY_LARGE16; DATA pitch16 = 0; maxvec((DATA *)x, len, &max_corr16, &pitch16); return pitch16; } #endif #endif /* FIXED_C6X_H */ mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/libcelt.vcxproj0000664000175000017500000001241214010707315023306 0ustar builderbuilder Debug Win32 Release Win32 {245603E3-F580-41A5-9632-B25FE3372CBF} Win32Proj libcelt StaticLibrary true Unicode StaticLibrary false true Unicode Level3 Disabled HAVE_CONFIG_H;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) Windows true Level3 MaxSpeed true true HAVE_CONFIG_H;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) Windows true true true mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/arch.h0000664000175000017500000001625214010707315021347 0ustar builderbuilder/* Copyright (c) 2003-2008 Jean-Marc Valin Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /** @file arch.h @brief Various architecture definitions for CELT */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef ARCH_H #define ARCH_H #include "celt_types.h" #define CELT_SIG_SCALE 32768.f #define celt_fatal(str) _celt_fatal(str, __FILE__, __LINE__); #ifdef ENABLE_ASSERTIONS #include #include static inline void _celt_fatal(const char *str, const char *file, int line) { fprintf (stderr, "Fatal (internal) error in %s, line %d: %s\n", file, line, str); abort(); } #define celt_assert(cond) {if (!(cond)) {celt_fatal("assertion failed: " #cond);}} #define celt_assert2(cond, message) {if (!(cond)) {celt_fatal("assertion failed: " #cond "\n" message);}} #else #define celt_assert(cond) #define celt_assert2(cond, message) #endif #define IMUL32(a,b) ((a)*(b)) #define UMUL32(a,b) ((celt_int32)(a)*(celt_int32)(b)) #define UMUL16_16(a,b) ((celt_int32)(a)*(celt_int32)(b)) #define ABS(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute integer value. */ #define ABS16(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute 16-bit value. */ #define MIN16(a,b) ((a) < (b) ? (a) : (b)) /**< Minimum 16-bit value. */ #define MAX16(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 16-bit value. */ #define ABS32(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute 32-bit value. */ #define MIN32(a,b) ((a) < (b) ? (a) : (b)) /**< Minimum 32-bit value. */ #define MAX32(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 32-bit value. */ #define IMIN(a,b) ((a) < (b) ? (a) : (b)) /**< Minimum int value. */ #define IMAX(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum int value. */ #define UADD32(a,b) ((a)+(b)) #define USUB32(a,b) ((a)-(b)) #define PRINT_MIPS(file) #ifdef FIXED_POINT typedef celt_int16 celt_word16; typedef celt_int32 celt_word32; typedef celt_word32 celt_sig; typedef celt_word16 celt_norm; typedef celt_word32 celt_ener; typedef celt_word32 celt_mask; #define Q15ONE 32767 #define Q30ONE 1073741823 #define SIG_SHIFT 12 #define NORM_SCALING 16384 #define NORM_SCALING_1 (1.f/16384.f) #define NORM_SHIFT 14 #define ENER_SCALING 16384.f #define ENER_SCALING_1 (1.f/16384.f) #define ENER_SHIFT 14 #define PGAIN_SCALING 32768.f #define PGAIN_SCALING_1 (1.f/32768.f) #define PGAIN_SHIFT 15 #define DB_SHIFT 10 #define EPSILON 1 #define VERY_SMALL 0 #define VERY_LARGE32 ((celt_word32)2147483647) #define VERY_LARGE16 ((celt_word16)32767) #define Q15_ONE ((celt_word16)32767) #define Q15_ONE_1 (1.f/32768.f) #define SCALEIN(a) (a) #define SCALEOUT(a) (a) #ifdef FIXED_DEBUG #include "fixed_debug.h" #else #include "fixed_generic.h" #ifdef ARM5E_ASM #include "fixed_arm5e.h" #elif defined (ARM4_ASM) #include "fixed_arm4.h" #elif defined (BFIN_ASM) #include "fixed_bfin.h" #elif defined (TI_C5X_ASM) #include "fixed_c5x.h" #elif defined (TI_C6X_ASM) #include "fixed_c6x.h" #endif #endif #else /* FIXED_POINT */ typedef float celt_word16; typedef float celt_word32; typedef float celt_sig; typedef float celt_norm; typedef float celt_ener; typedef float celt_pgain; typedef float celt_mask; #define Q15ONE 1.0f #define Q30ONE 1.0f #define NORM_SCALING 1.f #define NORM_SCALING_1 1.f #define ENER_SCALING 1.f #define ENER_SCALING_1 1.f #define PGAIN_SCALING 1.f #define PGAIN_SCALING_1 1.f #define EPSILON 1e-15f #define VERY_SMALL 1e-15f #define VERY_LARGE32 1e15f #define VERY_LARGE16 1e15f #define Q15_ONE ((celt_word16)1.f) #define Q15_ONE_1 ((celt_word16)1.f) #define QCONST16(x,bits) (x) #define QCONST32(x,bits) (x) #define NEG16(x) (-(x)) #define NEG32(x) (-(x)) #define EXTRACT16(x) (x) #define EXTEND32(x) (x) #define SHR16(a,shift) (a) #define SHL16(a,shift) (a) #define SHR32(a,shift) (a) #define SHL32(a,shift) (a) #define PSHR16(a,shift) (a) #define PSHR32(a,shift) (a) #define VSHR32(a,shift) (a) #define SATURATE16(x,a) (x) #define SATURATE32(x,a) (x) #define PSHR(a,shift) (a) #define SHR(a,shift) (a) #define SHL(a,shift) (a) #define SATURATE(x,a) (x) #define ROUND16(a,shift) (a) #define HALF32(x) (.5f*(x)) #define ADD16(a,b) ((a)+(b)) #define SUB16(a,b) ((a)-(b)) #define ADD32(a,b) ((a)+(b)) #define SUB32(a,b) ((a)-(b)) #define MULT16_16_16(a,b) ((a)*(b)) #define MULT16_16(a,b) ((celt_word32)(a)*(celt_word32)(b)) #define MAC16_16(c,a,b) ((c)+(celt_word32)(a)*(celt_word32)(b)) #define MULT16_32_Q11(a,b) ((a)*(b)) #define MULT16_32_Q13(a,b) ((a)*(b)) #define MULT16_32_Q14(a,b) ((a)*(b)) #define MULT16_32_Q15(a,b) ((a)*(b)) #define MULT16_32_Q16(a,b) ((a)*(b)) #define MULT16_32_P15(a,b) ((a)*(b)) #define MULT32_32_Q31(a,b) ((a)*(b)) #define MAC16_32_Q11(c,a,b) ((c)+(a)*(b)) #define MAC16_32_Q15(c,a,b) ((c)+(a)*(b)) #define MAC16_16_Q11(c,a,b) ((c)+(a)*(b)) #define MAC16_16_Q13(c,a,b) ((c)+(a)*(b)) #define MAC16_16_P13(c,a,b) ((c)+(a)*(b)) #define MULT16_16_Q11_32(a,b) ((a)*(b)) #define MULT16_16_Q13(a,b) ((a)*(b)) #define MULT16_16_Q14(a,b) ((a)*(b)) #define MULT16_16_Q15(a,b) ((a)*(b)) #define MULT16_16_P15(a,b) ((a)*(b)) #define MULT16_16_P13(a,b) ((a)*(b)) #define MULT16_16_P14(a,b) ((a)*(b)) #define DIV32_16(a,b) (((celt_word32)(a))/(celt_word16)(b)) #define PDIV32_16(a,b) (((celt_word32)(a))/(celt_word16)(b)) #define DIV32(a,b) (((celt_word32)(a))/(celt_word32)(b)) #define PDIV32(a,b) (((celt_word32)(a))/(celt_word32)(b)) #define SCALEIN(a) ((a)*CELT_SIG_SCALE) #define SCALEOUT(a) ((a)*(1/CELT_SIG_SCALE)) #endif /* !FIXED_POINT */ #if defined (CONFIG_TI_C54X) || defined (CONFIG_TI_C55X) /* 2 on TI C5x DSP */ #define BYTES_PER_CHAR 2 #define BITS_PER_CHAR 16 #define LOG2_BITS_PER_CHAR 4 #else /* CONFIG_TI_C54X */ #define BYTES_PER_CHAR 1 #define BITS_PER_CHAR 8 #define LOG2_BITS_PER_CHAR 3 #endif /* !CONFIG_TI_C54X */ #ifndef GLOBAL_STACK_SIZE #ifdef FIXED_POINT #define GLOBAL_STACK_SIZE 100000 #else #define GLOBAL_STACK_SIZE 100000 #endif #endif #endif /* ARCH_H */ mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/rate.h0000664000175000017500000000646214010707315021367 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef RATE_H #define RATE_H #define MAX_PSEUDO 40 #define LOG_MAX_PSEUDO 6 #define MAX_PULSES 128 #define MAX_FINE_BITS 8 #define FINE_OFFSET 21 #define QTHETA_OFFSET 4 #define QTHETA_OFFSET_TWOPHASE 16 #define BITOVERFLOW 30000 #include "cwrs.h" #include "modes.h" void compute_pulse_cache(CELTMode *m, int LM); static inline int get_pulses(int i) { return i<8 ? i : (8 + (i&7)) << ((i>>3)-1); } static inline int bits2pulses(const CELTMode *m, int band, int LM, int bits) { int i; int lo, hi; const unsigned char *cache; LM++; cache = m->cache.bits + m->cache.index[LM*m->nbEBands+band]; lo = 0; hi = cache[0]; bits--; for (i=0;i>1; /* OPT: Make sure this is implemented with a conditional move */ if (cache[mid] >= bits) hi = mid; else lo = mid; } if (bits- (lo == 0 ? -1 : cache[lo]) <= cache[hi]-bits) return lo; else return hi; } static inline int pulses2bits(const CELTMode *m, int band, int LM, int pulses) { const unsigned char *cache; LM++; cache = m->cache.bits + m->cache.index[LM*m->nbEBands+band]; return pulses == 0 ? 0 : cache[pulses]+1; } /** Computes a cache of the pulses->bits mapping in each band */ celt_int16 **compute_alloc_cache(CELTMode *m, int M); /** Compute the pulse allocation, i.e. how many pulses will go in each * band. @param m mode @param offsets Requested increase or decrease in the number of bits for each band @param total Number of bands @param pulses Number of pulses per band (returned) @return Total number of bits allocated */ int compute_allocation(const CELTMode *m, int start, int end, const int *offsets, const int *cap, int alloc_trim, int *intensity, int *dual_stero, celt_int32 total, celt_int32 *balance, int *pulses, int *ebits, int *fine_priority, int _C, int LM, ec_ctx *ec, int encode, int prev); #endif mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/match-test.sh0000775000175000017500000000103314010707315022660 0ustar builderbuilder#!/bin/sh #outfile=`mktemp` #if [ $? != 0 ]; then # echo "count not create temp output file" # exit 0 #fi outfile=/dev/null if [ -f mono_test_file.sw ]; then echo -n "mono test... " ./testcelt 44100 1 256 32 mono_test_file.sw $outfile if [ $? != 0 ]; then exit 1 fi else echo "no mono test file" fi if [ -f stereo_test_file.sw ]; then echo -n "stereo test... " ./testcelt 44100 2 256 92 stereo_test_file.sw $outfile if [ $? != 0 ]; then exit 1 fi else echo "no stereo test file" fi exit 0 mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/modes.c0000664000175000017500000003403214010707315021530 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Copyright (c) 2008 Gregory Maxwell Written by Jean-Marc Valin and Gregory Maxwell */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "celt.h" #include "modes.h" #include "rate.h" #include "os_support.h" #include "stack_alloc.h" #include "quant_bands.h" static const celt_int16 eband5ms[] = { /*0 200 400 600 800 1k 1.2 1.4 1.6 2k 2.4 2.8 3.2 4k 4.8 5.6 6.8 8k 9.6 12k 15.6 */ 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 34, 40, 48, 60, 78, 100 }; /* Alternate tuning (partially derived from Vorbis) */ #define BITALLOC_SIZE 11 /* Bit allocation table in units of 1/32 bit/sample (0.1875 dB SNR) */ static const unsigned char band_allocation[] = { /*0 200 400 600 800 1k 1.2 1.4 1.6 2k 2.4 2.8 3.2 4k 4.8 5.6 6.8 8k 9.6 12k 15.6 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 80, 75, 69, 63, 56, 49, 40, 34, 29, 20, 18, 10, 0, 0, 0, 0, 0, 0, 0, 0, 110,100, 90, 84, 78, 71, 65, 58, 51, 45, 39, 32, 26, 20, 12, 0, 0, 0, 0, 0, 0, 118,110,103, 93, 86, 80, 75, 70, 65, 59, 53, 47, 40, 31, 23, 15, 4, 0, 0, 0, 0, 126,119,112,104, 95, 89, 83, 78, 72, 66, 60, 54, 47, 39, 32, 25, 17, 12, 1, 0, 0, 134,127,120,114,103, 97, 91, 85, 78, 72, 66, 60, 54, 47, 41, 35, 29, 23, 16, 10, 1, 144,137,130,124,113,107,101, 95, 88, 82, 76, 70, 64, 57, 51, 45, 39, 33, 26, 15, 1, 152,145,138,132,123,117,111,105, 98, 92, 86, 80, 74, 67, 61, 55, 49, 43, 36, 20, 1, 162,155,148,142,133,127,121,115,108,102, 96, 90, 84, 77, 71, 65, 59, 53, 46, 30, 1, 172,165,158,152,143,137,131,125,118,112,106,100, 94, 87, 81, 75, 69, 63, 56, 45, 20, 200,200,200,200,200,200,200,200,198,193,188,183,178,173,168,163,158,153,148,129,104, }; #ifndef CUSTOM_MODES_ONLY #ifdef FIXED_POINT #include "static_modes_fixed.c" #else #include "static_modes_float.c" #endif #endif /* CUSTOM_MODES_ONLY */ #ifndef M_PI #define M_PI 3.141592653 #endif int celt_mode_info(const CELTMode *mode, int request, celt_int32 *value) { switch (request) { case CELT_GET_LOOKAHEAD: *value = mode->overlap; break; case CELT_GET_BITSTREAM_VERSION: *value = CELT_BITSTREAM_VERSION; break; case CELT_GET_SAMPLE_RATE: *value = mode->Fs; break; default: return CELT_UNIMPLEMENTED; } return CELT_OK; } #ifdef CUSTOM_MODES /* Defining 25 critical bands for the full 0-20 kHz audio bandwidth Taken from http://ccrma.stanford.edu/~jos/bbt/Bark_Frequency_Scale.html */ #define BARK_BANDS 25 static const celt_int16 bark_freq[BARK_BANDS+1] = { 0, 100, 200, 300, 400, 510, 630, 770, 920, 1080, 1270, 1480, 1720, 2000, 2320, 2700, 3150, 3700, 4400, 5300, 6400, 7700, 9500, 12000, 15500, 20000}; static celt_int16 *compute_ebands(celt_int32 Fs, int frame_size, int res, int *nbEBands) { celt_int16 *eBands; int i, j, lin, low, high, nBark, offset=0; /* All modes that have 2.5 ms short blocks use the same definition */ if (Fs == 400*(celt_int32)frame_size) { *nbEBands = sizeof(eband5ms)/sizeof(eband5ms[0])-1; eBands = celt_alloc(sizeof(celt_int16)*(*nbEBands+1)); for (i=0;i<*nbEBands+1;i++) eBands[i] = eband5ms[i]; return eBands; } /* Find the number of critical bands supported by our sampling rate */ for (nBark=1;nBark= Fs) break; /* Find where the linear part ends (i.e. where the spacing is more than min_width */ for (lin=0;lin= res) break; low = (bark_freq[lin]+res/2)/res; high = nBark-lin; *nbEBands = low+high; eBands = celt_alloc(sizeof(celt_int16)*(*nbEBands+2)); if (eBands==NULL) return NULL; /* Linear spacing (min_width) */ for (i=0;i0) offset = eBands[low-1]*res - bark_freq[lin-1]; /* Spacing follows critical bands */ for (i=0;i frame_size) eBands[*nbEBands] = frame_size; for (i=1;i<*nbEBands-1;i++) { if (eBands[i+1]-eBands[i] < eBands[i]-eBands[i-1]) { eBands[i] -= (2*eBands[i]-eBands[i-1]-eBands[i+1])/2; } } /* Remove any empty bands. */ for (i=j=0;i<*nbEBands;i++) if(eBands[i+1]>eBands[j]) eBands[++j]=eBands[i+1]; *nbEBands=j; for (i=1;i<*nbEBands;i++) { /* Every band must be smaller than the last band. */ celt_assert(eBands[i]-eBands[i-1]<=eBands[*nbEBands]-eBands[*nbEBands-1]); /* Each band must be no larger than twice the size of the previous one. */ celt_assert(eBands[i+1]-eBands[i]<=2*(eBands[i]-eBands[i-1])); } return eBands; } static void compute_allocation_table(CELTMode *mode) { int i, j; unsigned char *allocVectors; int maxBands = sizeof(eband5ms)/sizeof(eband5ms[0])-1; mode->nbAllocVectors = BITALLOC_SIZE; allocVectors = celt_alloc(sizeof(unsigned char)*(BITALLOC_SIZE*mode->nbEBands)); if (allocVectors==NULL) return; /* Check for standard mode */ if (mode->Fs == 400*(celt_int32)mode->shortMdctSize) { for (i=0;inbEBands;i++) allocVectors[i] = band_allocation[i]; mode->allocVectors = allocVectors; return; } /* If not the standard mode, interpolate */ /* Compute per-codec-band allocation from per-critical-band matrix */ for (i=0;inbEBands;j++) { int k; for (k=0;k mode->eBands[j]*(celt_int32)mode->Fs/mode->shortMdctSize) break; } if (k>maxBands-1) allocVectors[i*mode->nbEBands+j] = band_allocation[i*maxBands + maxBands-1]; else { celt_int32 a0, a1; a1 = mode->eBands[j]*(celt_int32)mode->Fs/mode->shortMdctSize - 400*(celt_int32)eband5ms[k-1]; a0 = 400*(celt_int32)eband5ms[k] - mode->eBands[j]*(celt_int32)mode->Fs/mode->shortMdctSize; allocVectors[i*mode->nbEBands+j] = (a0*band_allocation[i*maxBands+k-1] + a1*band_allocation[i*maxBands+k])/(a0+a1); } } } /*printf ("\n"); for (i=0;inbEBands;j++) printf ("%d ", allocVectors[i*mode->nbEBands+j]); printf ("\n"); } exit(0);*/ mode->allocVectors = allocVectors; } #endif /* CUSTOM_MODES */ CELTMode *celt_mode_create(celt_int32 Fs, int frame_size, int *error) { int i; CELTMode *mode=NULL; #ifdef CUSTOM_MODES int res; celt_word16 *window; celt_int16 *logN; int LM; #endif #ifdef STDIN_TUNING scanf("%d ", &MIN_BINS); scanf("%d ", &BITALLOC_SIZE); band_allocation = celt_alloc(sizeof(int)*BARK_BANDS*BITALLOC_SIZE); for (i=0;iFs && (frame_size<shortMdctSize*static_mode_list[i]->nbShortMdcts) { if (error) *error = CELT_OK; return (CELTMode*)static_mode_list[i]; } } } #endif /* CUSTOM_MODES_ONLY */ #ifndef CUSTOM_MODES if (error) *error = CELT_BAD_ARG; return NULL; #else /* The good thing here is that permutation of the arguments will automatically be invalid */ if (Fs < 8000 || Fs > 96000) { if (error) *error = CELT_BAD_ARG; return NULL; } if (frame_size < 40 || frame_size > 1024 || frame_size%2!=0) { if (error) *error = CELT_BAD_ARG; return NULL; } /* Frames of less than 1ms are not supported. */ if ((celt_int32)frame_size*1000 < Fs) { if (error) *error = CELT_INVALID_MODE; return NULL; } if ((celt_int32)frame_size*75 >= Fs && (frame_size%16)==0) { LM = 3; } else if ((celt_int32)frame_size*150 >= Fs && (frame_size%8)==0) { LM = 2; } else if ((celt_int32)frame_size*300 >= Fs && (frame_size%4)==0) { LM = 1; } else { LM = 0; } /* Shorts longer than 3.3ms are not supported. */ if ((celt_int32)(frame_size>>LM)*300 > Fs) { if (error) *error = CELT_INVALID_MODE; return NULL; } mode = celt_alloc(sizeof(CELTMode)); if (mode==NULL) goto failure; mode->Fs = Fs; /* Pre/de-emphasis depends on sampling rate. The "standard" pre-emphasis is defined as A(z) = 1 - 0.85*z^-1 at 48 kHz. Other rates should approximate that. */ if(Fs < 12000) /* 8 kHz */ { mode->preemph[0] = QCONST16(0.3500061035f, 15); mode->preemph[1] = -QCONST16(0.1799926758f, 15); mode->preemph[2] = QCONST16(0.2719968125f, SIG_SHIFT); /* exact 1/preemph[3] */ mode->preemph[3] = QCONST16(3.6765136719f, 13); } else if(Fs < 24000) /* 16 kHz */ { mode->preemph[0] = QCONST16(0.6000061035f, 15); mode->preemph[1] = -QCONST16(0.1799926758f, 15); mode->preemph[2] = QCONST16(0.4424998650f, SIG_SHIFT); /* exact 1/preemph[3] */ mode->preemph[3] = QCONST16(2.2598876953f, 13); } else if(Fs < 40000) /* 32 kHz */ { mode->preemph[0] = QCONST16(0.7799987793f, 15); mode->preemph[1] = -QCONST16(0.1000061035f, 15); mode->preemph[2] = QCONST16(0.7499771125f, SIG_SHIFT); /* exact 1/preemph[3] */ mode->preemph[3] = QCONST16(1.3333740234f, 13); } else /* 48 kHz */ { mode->preemph[0] = QCONST16(0.8500061035f, 15); mode->preemph[1] = QCONST16(0.0f, 15); mode->preemph[2] = QCONST16(1.f, SIG_SHIFT); mode->preemph[3] = QCONST16(1.f, 13); } mode->maxLM = LM; mode->nbShortMdcts = 1<shortMdctSize = frame_size/mode->nbShortMdcts; res = (mode->Fs+mode->shortMdctSize)/(2*mode->shortMdctSize); mode->eBands = compute_ebands(Fs, mode->shortMdctSize, res, &mode->nbEBands); if (mode->eBands==NULL) goto failure; mode->effEBands = mode->nbEBands; while (mode->eBands[mode->effEBands] > mode->shortMdctSize) mode->effEBands--; /* Overlap must be divisible by 4 */ mode->overlap = ((mode->shortMdctSize>>2)<<2); compute_allocation_table(mode); if (mode->allocVectors==NULL) goto failure; window = (celt_word16*)celt_alloc(mode->overlap*sizeof(celt_word16)); if (window==NULL) goto failure; #ifndef FIXED_POINT for (i=0;ioverlap;i++) window[i] = Q15ONE*sin(.5*M_PI* sin(.5*M_PI*(i+.5)/mode->overlap) * sin(.5*M_PI*(i+.5)/mode->overlap)); #else for (i=0;ioverlap;i++) window[i] = MIN32(32767,floor(.5+32768.*sin(.5*M_PI* sin(.5*M_PI*(i+.5)/mode->overlap) * sin(.5*M_PI*(i+.5)/mode->overlap)))); #endif mode->window = window; logN = (celt_int16*)celt_alloc(mode->nbEBands*sizeof(celt_int16)); if (logN==NULL) goto failure; for (i=0;inbEBands;i++) logN[i] = log2_frac(mode->eBands[i+1]-mode->eBands[i], BITRES); mode->logN = logN; compute_pulse_cache(mode, mode->maxLM); clt_mdct_init(&mode->mdct, 2*mode->shortMdctSize*mode->nbShortMdcts, mode->maxLM); if ((mode->mdct.trig==NULL) #ifndef ENABLE_TI_DSPLIB55 || (mode->mdct.kfft==NULL) #endif ) goto failure; if (error) *error = CELT_OK; return mode; failure: if (error) *error = CELT_INVALID_MODE; if (mode!=NULL) celt_mode_destroy(mode); return NULL; #endif /* !CUSTOM_MODES */ } void celt_mode_destroy(CELTMode *mode) { #ifdef CUSTOM_MODES int i; if (mode == NULL) return; #ifndef CUSTOM_MODES_ONLY for (i=0;ieBands); celt_free((celt_int16*)mode->allocVectors); celt_free((celt_word16*)mode->window); celt_free((celt_int16*)mode->logN); celt_free((celt_int16*)mode->cache.index); celt_free((unsigned char*)mode->cache.bits); celt_free((unsigned char*)mode->cache.caps); clt_mdct_clear(&mode->mdct); celt_free((CELTMode *)mode); #endif } mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/modes.h0000664000175000017500000000704214010707315021536 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Copyright (c) 2008 Gregory Maxwell Written by Jean-Marc Valin and Gregory Maxwell */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef MODES_H #define MODES_H #include "celt_types.h" #include "celt.h" #include "arch.h" #include "mdct.h" #include "entenc.h" #include "entdec.h" #define CELT_BITSTREAM_VERSION 0x80000010 #define MAX_PERIOD 1024 #ifndef CHANNELS # ifdef DISABLE_STEREO # define CHANNELS(_C) (1) # else # define CHANNELS(_C) (_C) # endif #endif #ifndef OVERLAP #define OVERLAP(mode) ((mode)->overlap) #endif #ifndef FRAMESIZE #define FRAMESIZE(mode) ((mode)->mdctSize) #endif typedef struct { int size; const celt_int16 *index; const unsigned char *bits; const unsigned char *caps; } PulseCache; /** Mode definition (opaque) @brief Mode definition */ struct CELTMode { celt_int32 Fs; int overlap; int nbEBands; int effEBands; celt_word16 preemph[4]; const celt_int16 *eBands; /**< Definition for each "pseudo-critical band" */ int nbAllocVectors; /**< Number of lines in the matrix below */ const unsigned char *allocVectors; /**< Number of bits in each band for several rates */ /* Stuff that could go in the {en,de}coder, but we save space this way */ mdct_lookup mdct; const celt_word16 *window; int maxLM; int nbShortMdcts; int shortMdctSize; const celt_int16 *logN; PulseCache cache; }; #ifndef OPUS_BUILD #define CELT_STATIC static #else #define CELT_STATIC #endif #ifdef OPUS_BUILD /* Prototypes for _ec versions of the encoder/decoder calls (not public) */ int celt_encode_with_ec(CELTEncoder * restrict st, const celt_int16 * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes, ec_enc *enc); int celt_encode_with_ec_float(CELTEncoder * restrict st, const float * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes, ec_enc *enc); int celt_decode_with_ec(CELTDecoder * restrict st, const unsigned char *data, int len, celt_int16 * restrict pcm, int frame_size, ec_dec *dec); int celt_decode_with_ec_float(CELTDecoder * restrict st, const unsigned char *data, int len, float * restrict pcm, int frame_size, ec_dec *dec); #endif /* OPUS_BUILD */ #endif mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/fixed_debug.h0000664000175000017500000004115314010707315022675 0ustar builderbuilder/* Copyright (C) 2003-2008 Jean-Marc Valin Copyright (C) 2007-2009 Xiph.Org Foundation */ /** @file fixed_debug.h @brief Fixed-point operations with debugging */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef FIXED_DEBUG_H #define FIXED_DEBUG_H #include #ifdef CELT_C long long celt_mips=0; #else extern long long celt_mips; #endif #define MIPS_INC celt_mips++, #define MULT16_16SU(a,b) ((celt_word32)(celt_word16)(a)*(celt_word32)(celt_uint16)(b)) #define MULT32_32_Q31(a,b) ADD32(ADD32(SHL32(MULT16_16(SHR32((a),16),SHR((b),16)),1), SHR32(MULT16_16SU(SHR32((a),16),((b)&0x0000ffff)),15)), SHR32(MULT16_16SU(SHR32((b),16),((a)&0x0000ffff)),15)) /** 16x32 multiplication, followed by a 16-bit shift right. Results fits in 32 bits */ #define MULT16_32_Q16(a,b) ADD32(MULT16_16((a),SHR32((b),16)), SHR32(MULT16_16SU((a),((b)&0x0000ffff)),16)) #define QCONST16(x,bits) ((celt_word16)(.5+(x)*(((celt_word32)1)<<(bits)))) #define QCONST32(x,bits) ((celt_word32)(.5+(x)*(((celt_word32)1)<<(bits)))) #define VERIFY_SHORT(x) ((x)<=32767&&(x)>=-32768) #define VERIFY_INT(x) ((x)<=2147483647LL&&(x)>=-2147483648LL) #define VERIFY_UINT(x) ((x)<=(2147483647LLU<<1)) #define SHR(a,b) SHR32(a,b) #define PSHR(a,b) PSHR32(a,b) static inline short NEG16(int x) { int res; if (!VERIFY_SHORT(x)) { fprintf (stderr, "NEG16: input is not short: %d\n", (int)x); } res = -x; if (!VERIFY_SHORT(res)) fprintf (stderr, "NEG16: output is not short: %d\n", (int)res); celt_mips++; return res; } static inline int NEG32(long long x) { long long res; if (!VERIFY_INT(x)) { fprintf (stderr, "NEG16: input is not int: %d\n", (int)x); } res = -x; if (!VERIFY_INT(res)) fprintf (stderr, "NEG16: output is not int: %d\n", (int)res); celt_mips+=2; return res; } #define EXTRACT16(x) _EXTRACT16(x, __FILE__, __LINE__) static inline short _EXTRACT16(int x, char *file, int line) { int res; if (!VERIFY_SHORT(x)) { fprintf (stderr, "EXTRACT16: input is not short: %d in %s: line %d\n", x, file, line); } res = x; celt_mips++; return res; } #define EXTEND32(x) _EXTEND32(x, __FILE__, __LINE__) static inline int _EXTEND32(int x, char *file, int line) { int res; if (!VERIFY_SHORT(x)) { fprintf (stderr, "EXTEND32: input is not short: %d in %s: line %d\n", x, file, line); } res = x; celt_mips++; return res; } #define SHR16(a, shift) _SHR16(a, shift, __FILE__, __LINE__) static inline short _SHR16(int a, int shift, char *file, int line) { int res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(shift)) { fprintf (stderr, "SHR16: inputs are not short: %d >> %d in %s: line %d\n", a, shift, file, line); } res = a>>shift; if (!VERIFY_SHORT(res)) fprintf (stderr, "SHR16: output is not short: %d in %s: line %d\n", res, file, line); celt_mips++; return res; } #define SHL16(a, shift) _SHL16(a, shift, __FILE__, __LINE__) static inline short _SHL16(int a, int shift, char *file, int line) { int res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(shift)) { fprintf (stderr, "SHL16: inputs are not short: %d %d in %s: line %d\n", a, shift, file, line); } res = a<>shift; if (!VERIFY_INT(res)) { fprintf (stderr, "SHR32: output is not int: %d\n", (int)res); } celt_mips+=2; return res; } static inline int SHL32(long long a, int shift) { long long res; if (!VERIFY_INT(a) || !VERIFY_SHORT(shift)) { fprintf (stderr, "SHL32: inputs are not int: %d %d\n", (int)a, shift); } res = a<>1))),shift)) #define PSHR32(a,shift) (celt_mips--,SHR32(ADD32((a),(((celt_word32)(1)<<((shift))>>1))),shift)) #define VSHR32(a, shift) (((shift)>0) ? SHR32(a, shift) : SHL32(a, -(shift))) #define SATURATE16(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) #define SATURATE32(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) #define ROUND16(x,a) (celt_mips--,EXTRACT16(PSHR32((x),(a)))) #define HALF32(x) (SHR32(x,1)) //#define SHR(a,shift) ((a) >> (shift)) //#define SHL(a,shift) ((a) << (shift)) #define ADD16(a, b) _ADD16(a, b, __FILE__, __LINE__) static inline short _ADD16(int a, int b, char *file, int line) { int res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "ADD16: inputs are not short: %d %d in %s: line %d\n", a, b, file, line); } res = a+b; if (!VERIFY_SHORT(res)) { fprintf (stderr, "ADD16: output is not short: %d+%d=%d in %s: line %d\n", a,b,res, file, line); } celt_mips++; return res; } #define SUB16(a, b) _SUB16(a, b, __FILE__, __LINE__) static inline short _SUB16(int a, int b, char *file, int line) { int res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "SUB16: inputs are not short: %d %d in %s: line %d\n", a, b, file, line); } res = a-b; if (!VERIFY_SHORT(res)) fprintf (stderr, "SUB16: output is not short: %d in %s: line %d\n", res, file, line); celt_mips++; return res; } #define ADD32(a, b) _ADD32(a, b, __FILE__, __LINE__) static inline int _ADD32(long long a, long long b, char *file, int line) { long long res; if (!VERIFY_INT(a) || !VERIFY_INT(b)) { fprintf (stderr, "ADD32: inputs are not int: %d %d in %s: line %d\n", (int)a, (int)b, file, line); } res = a+b; if (!VERIFY_INT(res)) { fprintf (stderr, "ADD32: output is not int: %d in %s: line %d\n", (int)res, file, line); } celt_mips+=2; return res; } #define SUB32(a, b) _SUB32(a, b, __FILE__, __LINE__) static inline int _SUB32(long long a, long long b, char *file, int line) { long long res; if (!VERIFY_INT(a) || !VERIFY_INT(b)) { fprintf (stderr, "SUB32: inputs are not int: %d %d in %s: line %d\n", (int)a, (int)b, file, line); } res = a-b; if (!VERIFY_INT(res)) fprintf (stderr, "SUB32: output is not int: %d in %s: line %d\n", (int)res, file, line); celt_mips+=2; return res; } #undef UADD32 #define UADD32(a, b) _UADD32(a, b, __FILE__, __LINE__) static inline unsigned int _UADD32(unsigned long long a, unsigned long long b, char *file, int line) { long long res; if (!VERIFY_UINT(a) || !VERIFY_UINT(b)) { fprintf (stderr, "UADD32: inputs are not int: %u %u in %s: line %d\n", (unsigned)a, (unsigned)b, file, line); } res = a+b; if (!VERIFY_UINT(res)) { fprintf (stderr, "UADD32: output is not int: %u in %s: line %d\n", (unsigned)res, file, line); } celt_mips+=2; return res; } #undef USUB32 #define USUB32(a, b) _USUB32(a, b, __FILE__, __LINE__) static inline unsigned int _USUB32(unsigned long long a, unsigned long long b, char *file, int line) { long long res; if (!VERIFY_UINT(a) || !VERIFY_UINT(b)) { /*fprintf (stderr, "USUB32: inputs are not int: %llu %llu in %s: line %d\n", (unsigned)a, (unsigned)b, file, line);*/ } res = a-b; if (!VERIFY_UINT(res)) { /*fprintf (stderr, "USUB32: output is not int: %llu - %llu = %llu in %s: line %d\n", a, b, res, file, line);*/ } celt_mips+=2; return res; } /* result fits in 16 bits */ static inline short MULT16_16_16(int a, int b) { int res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16_16: inputs are not short: %d %d\n", a, b); } res = a*b; if (!VERIFY_SHORT(res)) fprintf (stderr, "MULT16_16_16: output is not short: %d\n", res); celt_mips++; return res; } #define MULT16_16(a, b) _MULT16_16(a, b, __FILE__, __LINE__) static inline int _MULT16_16(int a, int b, char *file, int line) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16: inputs are not short: %d %d in %s: line %d\n", a, b, file, line); } res = ((long long)a)*b; if (!VERIFY_INT(res)) fprintf (stderr, "MULT16_16: output is not int: %d in %s: line %d\n", (int)res, file, line); celt_mips++; return res; } #define MAC16_16(c,a,b) (celt_mips-=2,ADD32((c),MULT16_16((a),(b)))) #define MAC16_16_Q11(c,a,b) (ADD16((c),EXTRACT16(SHR32(MULT16_16((a),(b)),11)))) #define MAC16_16_Q13(c,a,b) (ADD16((c),EXTRACT16(SHR32(MULT16_16((a),(b)),13)))) #define MAC16_16_P13(c,a,b) (ADD16((c),SHR32(ADD32(4096,MULT16_16((a),(b))),13))) #define MULT16_32_QX(a, b, Q) _MULT16_32_QX(a, b, Q, __FILE__, __LINE__) static inline int _MULT16_32_QX(int a, long long b, int Q, char *file, int line) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_INT(b)) { fprintf (stderr, "MULT16_32_Q%d: inputs are not short+int: %d %d in %s: line %d\n", Q, (int)a, (int)b, file, line); } if (ABS32(b)>=((celt_word32)(1)<<(15+Q))) fprintf (stderr, "MULT16_32_Q%d: second operand too large: %d %d in %s: line %d\n", Q, (int)a, (int)b, file, line); res = (((long long)a)*(long long)b) >> Q; if (!VERIFY_INT(res)) fprintf (stderr, "MULT16_32_Q%d: output is not int: %d*%d=%d in %s: line %d\n", Q, (int)a, (int)b,(int)res, file, line); if (Q==15) celt_mips+=3; else celt_mips+=4; return res; } static inline int MULT16_32_PX(int a, long long b, int Q) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_INT(b)) { fprintf (stderr, "MULT16_32_P%d: inputs are not short+int: %d %d\n", Q, (int)a, (int)b); } if (ABS32(b)>=((celt_word32)(1)<<(15+Q))) fprintf (stderr, "MULT16_32_Q%d: second operand too large: %d %d\n", Q, (int)a, (int)b); res = ((((long long)a)*(long long)b) + (((celt_word32)(1)<>1))>> Q; if (!VERIFY_INT(res)) fprintf (stderr, "MULT16_32_P%d: output is not int: %d*%d=%d\n", Q, (int)a, (int)b,(int)res); if (Q==15) celt_mips+=4; else celt_mips+=5; return res; } #define MULT16_32_Q11(a,b) MULT16_32_QX(a,b,11) #define MAC16_32_Q11(c,a,b) ADD32((c),MULT16_32_Q11((a),(b))) #define MULT16_32_Q12(a,b) MULT16_32_QX(a,b,12) #define MULT16_32_Q13(a,b) MULT16_32_QX(a,b,13) #define MULT16_32_Q14(a,b) MULT16_32_QX(a,b,14) #define MULT16_32_Q15(a,b) MULT16_32_QX(a,b,15) #define MULT16_32_P15(a,b) MULT16_32_PX(a,b,15) #define MAC16_32_Q15(c,a,b) (celt_mips-=2,ADD32((c),MULT16_32_Q15((a),(b)))) static inline int SATURATE(int a, int b) { if (a>b) a=b; if (a<-b) a = -b; celt_mips+=3; return a; } static inline int MULT16_16_Q11_32(int a, int b) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16_Q11: inputs are not short: %d %d\n", a, b); } res = ((long long)a)*b; res >>= 11; if (!VERIFY_INT(res)) fprintf (stderr, "MULT16_16_Q11: output is not short: %d*%d=%d\n", (int)a, (int)b, (int)res); celt_mips+=3; return res; } static inline short MULT16_16_Q13(int a, int b) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16_Q13: inputs are not short: %d %d\n", a, b); } res = ((long long)a)*b; res >>= 13; if (!VERIFY_SHORT(res)) fprintf (stderr, "MULT16_16_Q13: output is not short: %d*%d=%d\n", a, b, (int)res); celt_mips+=3; return res; } static inline short MULT16_16_Q14(int a, int b) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16_Q14: inputs are not short: %d %d\n", a, b); } res = ((long long)a)*b; res >>= 14; if (!VERIFY_SHORT(res)) fprintf (stderr, "MULT16_16_Q14: output is not short: %d\n", (int)res); celt_mips+=3; return res; } #define MULT16_16_Q15(a, b) _MULT16_16_Q15(a, b, __FILE__, __LINE__) static inline short _MULT16_16_Q15(int a, int b, char *file, int line) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16_Q15: inputs are not short: %d %d in %s: line %d\n", a, b, file, line); } res = ((long long)a)*b; res >>= 15; if (!VERIFY_SHORT(res)) { fprintf (stderr, "MULT16_16_Q15: output is not short: %d in %s: line %d\n", (int)res, file, line); } celt_mips+=1; return res; } static inline short MULT16_16_P13(int a, int b) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16_P13: inputs are not short: %d %d\n", a, b); } res = ((long long)a)*b; res += 4096; if (!VERIFY_INT(res)) fprintf (stderr, "MULT16_16_P13: overflow: %d*%d=%d\n", a, b, (int)res); res >>= 13; if (!VERIFY_SHORT(res)) fprintf (stderr, "MULT16_16_P13: output is not short: %d*%d=%d\n", a, b, (int)res); celt_mips+=4; return res; } static inline short MULT16_16_P14(int a, int b) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16_P14: inputs are not short: %d %d\n", a, b); } res = ((long long)a)*b; res += 8192; if (!VERIFY_INT(res)) fprintf (stderr, "MULT16_16_P14: overflow: %d*%d=%d\n", a, b, (int)res); res >>= 14; if (!VERIFY_SHORT(res)) fprintf (stderr, "MULT16_16_P14: output is not short: %d*%d=%d\n", a, b, (int)res); celt_mips+=4; return res; } static inline short MULT16_16_P15(int a, int b) { long long res; if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "MULT16_16_P15: inputs are not short: %d %d\n", a, b); } res = ((long long)a)*b; res += 16384; if (!VERIFY_INT(res)) fprintf (stderr, "MULT16_16_P15: overflow: %d*%d=%d\n", a, b, (int)res); res >>= 15; if (!VERIFY_SHORT(res)) fprintf (stderr, "MULT16_16_P15: output is not short: %d*%d=%d\n", a, b, (int)res); celt_mips+=2; return res; } #define DIV32_16(a, b) _DIV32_16(a, b, __FILE__, __LINE__) static inline int _DIV32_16(long long a, long long b, char *file, int line) { long long res; if (b==0) { fprintf(stderr, "DIV32_16: divide by zero: %d/%d in %s: line %d\n", (int)a, (int)b, file, line); return 0; } if (!VERIFY_INT(a) || !VERIFY_SHORT(b)) { fprintf (stderr, "DIV32_16: inputs are not int/short: %d %d in %s: line %d\n", (int)a, (int)b, file, line); } res = a/b; if (!VERIFY_SHORT(res)) { fprintf (stderr, "DIV32_16: output is not short: %d / %d = %d in %s: line %d\n", (int)a,(int)b,(int)res, file, line); if (res>32767) res = 32767; if (res<-32768) res = -32768; } celt_mips+=35; return res; } #define DIV32(a, b) _DIV32(a, b, __FILE__, __LINE__) static inline int _DIV32(long long a, long long b, char *file, int line) { long long res; if (b==0) { fprintf(stderr, "DIV32: divide by zero: %d/%d in %s: line %d\n", (int)a, (int)b, file, line); return 0; } if (!VERIFY_INT(a) || !VERIFY_INT(b)) { fprintf (stderr, "DIV32: inputs are not int/short: %d %d in %s: line %d\n", (int)a, (int)b, file, line); } res = a/b; if (!VERIFY_INT(res)) fprintf (stderr, "DIV32: output is not int: %d in %s: line %d\n", (int)res, file, line); celt_mips+=70; return res; } #define PDIV32(a,b) DIV32(ADD32((a),(b)>>1),b) #define PDIV32_16(a,b) DIV32_16(ADD32((a),(b)>>1),b) #undef PRINT_MIPS #define PRINT_MIPS(file) do {fprintf (file, "total complexity = %llu MIPS\n", celt_mips);} while (0); #endif mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/static_modes_fixed.c0000664000175000017500000005333514010707315024265 0ustar builderbuilder/* The contents of this file is automatically generated and contains static definitions for some pre-defined modes */ #include "modes.h" #include "rate.h" #ifndef DEF_WINDOW120 #define DEF_WINDOW120 static const celt_word16 window120[120] = { 2, 20, 55, 108, 178, 266, 372, 494, 635, 792, 966, 1157, 1365, 1590, 1831, 2089, 2362, 2651, 2956, 3276, 3611, 3961, 4325, 4703, 5094, 5499, 5916, 6346, 6788, 7241, 7705, 8179, 8663, 9156, 9657, 10167, 10684, 11207, 11736, 12271, 12810, 13353, 13899, 14447, 14997, 15547, 16098, 16648, 17197, 17744, 18287, 18827, 19363, 19893, 20418, 20936, 21447, 21950, 22445, 22931, 23407, 23874, 24330, 24774, 25208, 25629, 26039, 26435, 26819, 27190, 27548, 27893, 28224, 28541, 28845, 29135, 29411, 29674, 29924, 30160, 30384, 30594, 30792, 30977, 31151, 31313, 31463, 31602, 31731, 31849, 31958, 32057, 32148, 32229, 32303, 32370, 32429, 32481, 32528, 32568, 32604, 32634, 32661, 32683, 32701, 32717, 32729, 32740, 32748, 32754, 32758, 32762, 32764, 32766, 32767, 32767, 32767, 32767, 32767, 32767, }; #endif #ifndef DEF_LOGN400 #define DEF_LOGN400 static const celt_int16 logN400[21] = { 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 16, 16, 16, 21, 21, 24, 29, 34, 36, }; #endif #ifndef DEF_PULSE_CACHE50 #define DEF_PULSE_CACHE50 static const celt_int16 cache_index50[105] = { -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 41, 41, 41, 82, 82, 123, 164, 200, 222, 0, 0, 0, 0, 0, 0, 0, 0, 41, 41, 41, 41, 123, 123, 123, 164, 164, 240, 266, 283, 295, 41, 41, 41, 41, 41, 41, 41, 41, 123, 123, 123, 123, 240, 240, 240, 266, 266, 305, 318, 328, 336, 123, 123, 123, 123, 123, 123, 123, 123, 240, 240, 240, 240, 305, 305, 305, 318, 318, 343, 351, 358, 364, 240, 240, 240, 240, 240, 240, 240, 240, 305, 305, 305, 305, 343, 343, 343, 351, 351, 370, 376, 382, 387, }; static const unsigned char cache_bits50[392] = { 40, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 40, 15, 23, 28, 31, 34, 36, 38, 39, 41, 42, 43, 44, 45, 46, 47, 47, 49, 50, 51, 52, 53, 54, 55, 55, 57, 58, 59, 60, 61, 62, 63, 63, 65, 66, 67, 68, 69, 70, 71, 71, 40, 20, 33, 41, 48, 53, 57, 61, 64, 66, 69, 71, 73, 75, 76, 78, 80, 82, 85, 87, 89, 91, 92, 94, 96, 98, 101, 103, 105, 107, 108, 110, 112, 114, 117, 119, 121, 123, 124, 126, 128, 40, 23, 39, 51, 60, 67, 73, 79, 83, 87, 91, 94, 97, 100, 102, 105, 107, 111, 115, 118, 121, 124, 126, 129, 131, 135, 139, 142, 145, 148, 150, 153, 155, 159, 163, 166, 169, 172, 174, 177, 179, 35, 28, 49, 65, 78, 89, 99, 107, 114, 120, 126, 132, 136, 141, 145, 149, 153, 159, 165, 171, 176, 180, 185, 189, 192, 199, 205, 211, 216, 220, 225, 229, 232, 239, 245, 251, 21, 33, 58, 79, 97, 112, 125, 137, 148, 157, 166, 174, 182, 189, 195, 201, 207, 217, 227, 235, 243, 251, 17, 35, 63, 86, 106, 123, 139, 152, 165, 177, 187, 197, 206, 214, 222, 230, 237, 250, 25, 31, 55, 75, 91, 105, 117, 128, 138, 146, 154, 161, 168, 174, 180, 185, 190, 200, 208, 215, 222, 229, 235, 240, 245, 255, 16, 36, 65, 89, 110, 128, 144, 159, 173, 185, 196, 207, 217, 226, 234, 242, 250, 11, 41, 74, 103, 128, 151, 172, 191, 209, 225, 241, 255, 9, 43, 79, 110, 138, 163, 186, 207, 227, 246, 12, 39, 71, 99, 123, 144, 164, 182, 198, 214, 228, 241, 253, 9, 44, 81, 113, 142, 168, 192, 214, 235, 255, 7, 49, 90, 127, 160, 191, 220, 247, 6, 51, 95, 134, 170, 203, 234, 7, 47, 87, 123, 155, 184, 212, 237, 6, 52, 97, 137, 174, 208, 240, 5, 57, 106, 151, 192, 231, 5, 59, 111, 158, 202, 243, 5, 55, 103, 147, 187, 224, 5, 60, 113, 161, 206, 248, 4, 65, 122, 175, 224, 4, 67, 127, 182, 234, }; static const unsigned char cache_caps50[168] = { 224, 224, 224, 224, 224, 224, 224, 224, 160, 160, 160, 160, 185, 185, 185, 178, 178, 168, 134, 61, 37, 224, 224, 224, 224, 224, 224, 224, 224, 240, 240, 240, 240, 207, 207, 207, 198, 198, 183, 144, 66, 40, 160, 160, 160, 160, 160, 160, 160, 160, 185, 185, 185, 185, 193, 193, 193, 183, 183, 172, 138, 64, 38, 240, 240, 240, 240, 240, 240, 240, 240, 207, 207, 207, 207, 204, 204, 204, 193, 193, 180, 143, 66, 40, 185, 185, 185, 185, 185, 185, 185, 185, 193, 193, 193, 193, 193, 193, 193, 183, 183, 172, 138, 65, 39, 207, 207, 207, 207, 207, 207, 207, 207, 204, 204, 204, 204, 201, 201, 201, 188, 188, 176, 141, 66, 40, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 194, 194, 194, 184, 184, 173, 139, 65, 39, 204, 204, 204, 204, 204, 204, 204, 204, 201, 201, 201, 201, 198, 198, 198, 187, 187, 175, 140, 66, 40, }; #endif #ifndef FFT_TWIDDLES48000_960 #define FFT_TWIDDLES48000_960 static const kiss_twiddle_cpx fft_twiddles48000_960[480] = { {32767, 0}, {32766, -429}, {32757, -858}, {32743, -1287}, {32724, -1715}, {32698, -2143}, {32667, -2570}, {32631, -2998}, {32588, -3425}, {32541, -3851}, {32488, -4277}, {32429, -4701}, {32364, -5125}, {32295, -5548}, {32219, -5971}, {32138, -6393}, {32051, -6813}, {31960, -7231}, {31863, -7650}, {31760, -8067}, {31652, -8481}, {31539, -8895}, {31419, -9306}, {31294, -9716}, {31165, -10126}, {31030, -10532}, {30889, -10937}, {30743, -11340}, {30592, -11741}, {30436, -12141}, {30274, -12540}, {30107, -12935}, {29936, -13328}, {29758, -13718}, {29577, -14107}, {29390, -14493}, {29197, -14875}, {29000, -15257}, {28797, -15635}, {28590, -16010}, {28379, -16384}, {28162, -16753}, {27940, -17119}, {27714, -17484}, {27482, -17845}, {27246, -18205}, {27006, -18560}, {26760, -18911}, {26510, -19260}, {26257, -19606}, {25997, -19947}, {25734, -20286}, {25466, -20621}, {25194, -20952}, {24918, -21281}, {24637, -21605}, {24353, -21926}, {24063, -22242}, {23770, -22555}, {23473, -22865}, {23171, -23171}, {22866, -23472}, {22557, -23769}, {22244, -24063}, {21927, -24352}, {21606, -24636}, {21282, -24917}, {20954, -25194}, {20622, -25465}, {20288, -25733}, {19949, -25997}, {19607, -26255}, {19261, -26509}, {18914, -26760}, {18561, -27004}, {18205, -27246}, {17846, -27481}, {17485, -27713}, {17122, -27940}, {16755, -28162}, {16385, -28378}, {16012, -28590}, {15636, -28797}, {15258, -28999}, {14878, -29197}, {14494, -29389}, {14108, -29576}, {13720, -29757}, {13329, -29934}, {12937, -30107}, {12540, -30274}, {12142, -30435}, {11744, -30592}, {11342, -30743}, {10939, -30889}, {10534, -31030}, {10127, -31164}, {9718, -31294}, {9307, -31418}, {8895, -31537}, {8482, -31652}, {8067, -31759}, {7650, -31862}, {7233, -31960}, {6815, -32051}, {6393, -32138}, {5973, -32219}, {5549, -32294}, {5127, -32364}, {4703, -32429}, {4278, -32487}, {3852, -32541}, {3426, -32588}, {2999, -32630}, {2572, -32667}, {2144, -32698}, {1716, -32724}, {1287, -32742}, {860, -32757}, {430, -32766}, {0, -32767}, {-429, -32766}, {-858, -32757}, {-1287, -32743}, {-1715, -32724}, {-2143, -32698}, {-2570, -32667}, {-2998, -32631}, {-3425, -32588}, {-3851, -32541}, {-4277, -32488}, {-4701, -32429}, {-5125, -32364}, {-5548, -32295}, {-5971, -32219}, {-6393, -32138}, {-6813, -32051}, {-7231, -31960}, {-7650, -31863}, {-8067, -31760}, {-8481, -31652}, {-8895, -31539}, {-9306, -31419}, {-9716, -31294}, {-10126, -31165}, {-10532, -31030}, {-10937, -30889}, {-11340, -30743}, {-11741, -30592}, {-12141, -30436}, {-12540, -30274}, {-12935, -30107}, {-13328, -29936}, {-13718, -29758}, {-14107, -29577}, {-14493, -29390}, {-14875, -29197}, {-15257, -29000}, {-15635, -28797}, {-16010, -28590}, {-16384, -28379}, {-16753, -28162}, {-17119, -27940}, {-17484, -27714}, {-17845, -27482}, {-18205, -27246}, {-18560, -27006}, {-18911, -26760}, {-19260, -26510}, {-19606, -26257}, {-19947, -25997}, {-20286, -25734}, {-20621, -25466}, {-20952, -25194}, {-21281, -24918}, {-21605, -24637}, {-21926, -24353}, {-22242, -24063}, {-22555, -23770}, {-22865, -23473}, {-23171, -23171}, {-23472, -22866}, {-23769, -22557}, {-24063, -22244}, {-24352, -21927}, {-24636, -21606}, {-24917, -21282}, {-25194, -20954}, {-25465, -20622}, {-25733, -20288}, {-25997, -19949}, {-26255, -19607}, {-26509, -19261}, {-26760, -18914}, {-27004, -18561}, {-27246, -18205}, {-27481, -17846}, {-27713, -17485}, {-27940, -17122}, {-28162, -16755}, {-28378, -16385}, {-28590, -16012}, {-28797, -15636}, {-28999, -15258}, {-29197, -14878}, {-29389, -14494}, {-29576, -14108}, {-29757, -13720}, {-29934, -13329}, {-30107, -12937}, {-30274, -12540}, {-30435, -12142}, {-30592, -11744}, {-30743, -11342}, {-30889, -10939}, {-31030, -10534}, {-31164, -10127}, {-31294, -9718}, {-31418, -9307}, {-31537, -8895}, {-31652, -8482}, {-31759, -8067}, {-31862, -7650}, {-31960, -7233}, {-32051, -6815}, {-32138, -6393}, {-32219, -5973}, {-32294, -5549}, {-32364, -5127}, {-32429, -4703}, {-32487, -4278}, {-32541, -3852}, {-32588, -3426}, {-32630, -2999}, {-32667, -2572}, {-32698, -2144}, {-32724, -1716}, {-32742, -1287}, {-32757, -860}, {-32766, -430}, {-32767, 0}, {-32766, 429}, {-32757, 858}, {-32743, 1287}, {-32724, 1715}, {-32698, 2143}, {-32667, 2570}, {-32631, 2998}, {-32588, 3425}, {-32541, 3851}, {-32488, 4277}, {-32429, 4701}, {-32364, 5125}, {-32295, 5548}, {-32219, 5971}, {-32138, 6393}, {-32051, 6813}, {-31960, 7231}, {-31863, 7650}, {-31760, 8067}, {-31652, 8481}, {-31539, 8895}, {-31419, 9306}, {-31294, 9716}, {-31165, 10126}, {-31030, 10532}, {-30889, 10937}, {-30743, 11340}, {-30592, 11741}, {-30436, 12141}, {-30274, 12540}, {-30107, 12935}, {-29936, 13328}, {-29758, 13718}, {-29577, 14107}, {-29390, 14493}, {-29197, 14875}, {-29000, 15257}, {-28797, 15635}, {-28590, 16010}, {-28379, 16384}, {-28162, 16753}, {-27940, 17119}, {-27714, 17484}, {-27482, 17845}, {-27246, 18205}, {-27006, 18560}, {-26760, 18911}, {-26510, 19260}, {-26257, 19606}, {-25997, 19947}, {-25734, 20286}, {-25466, 20621}, {-25194, 20952}, {-24918, 21281}, {-24637, 21605}, {-24353, 21926}, {-24063, 22242}, {-23770, 22555}, {-23473, 22865}, {-23171, 23171}, {-22866, 23472}, {-22557, 23769}, {-22244, 24063}, {-21927, 24352}, {-21606, 24636}, {-21282, 24917}, {-20954, 25194}, {-20622, 25465}, {-20288, 25733}, {-19949, 25997}, {-19607, 26255}, {-19261, 26509}, {-18914, 26760}, {-18561, 27004}, {-18205, 27246}, {-17846, 27481}, {-17485, 27713}, {-17122, 27940}, {-16755, 28162}, {-16385, 28378}, {-16012, 28590}, {-15636, 28797}, {-15258, 28999}, {-14878, 29197}, {-14494, 29389}, {-14108, 29576}, {-13720, 29757}, {-13329, 29934}, {-12937, 30107}, {-12540, 30274}, {-12142, 30435}, {-11744, 30592}, {-11342, 30743}, {-10939, 30889}, {-10534, 31030}, {-10127, 31164}, {-9718, 31294}, {-9307, 31418}, {-8895, 31537}, {-8482, 31652}, {-8067, 31759}, {-7650, 31862}, {-7233, 31960}, {-6815, 32051}, {-6393, 32138}, {-5973, 32219}, {-5549, 32294}, {-5127, 32364}, {-4703, 32429}, {-4278, 32487}, {-3852, 32541}, {-3426, 32588}, {-2999, 32630}, {-2572, 32667}, {-2144, 32698}, {-1716, 32724}, {-1287, 32742}, {-860, 32757}, {-430, 32766}, {0, 32767}, {429, 32766}, {858, 32757}, {1287, 32743}, {1715, 32724}, {2143, 32698}, {2570, 32667}, {2998, 32631}, {3425, 32588}, {3851, 32541}, {4277, 32488}, {4701, 32429}, {5125, 32364}, {5548, 32295}, {5971, 32219}, {6393, 32138}, {6813, 32051}, {7231, 31960}, {7650, 31863}, {8067, 31760}, {8481, 31652}, {8895, 31539}, {9306, 31419}, {9716, 31294}, {10126, 31165}, {10532, 31030}, {10937, 30889}, {11340, 30743}, {11741, 30592}, {12141, 30436}, {12540, 30274}, {12935, 30107}, {13328, 29936}, {13718, 29758}, {14107, 29577}, {14493, 29390}, {14875, 29197}, {15257, 29000}, {15635, 28797}, {16010, 28590}, {16384, 28379}, {16753, 28162}, {17119, 27940}, {17484, 27714}, {17845, 27482}, {18205, 27246}, {18560, 27006}, {18911, 26760}, {19260, 26510}, {19606, 26257}, {19947, 25997}, {20286, 25734}, {20621, 25466}, {20952, 25194}, {21281, 24918}, {21605, 24637}, {21926, 24353}, {22242, 24063}, {22555, 23770}, {22865, 23473}, {23171, 23171}, {23472, 22866}, {23769, 22557}, {24063, 22244}, {24352, 21927}, {24636, 21606}, {24917, 21282}, {25194, 20954}, {25465, 20622}, {25733, 20288}, {25997, 19949}, {26255, 19607}, {26509, 19261}, {26760, 18914}, {27004, 18561}, {27246, 18205}, {27481, 17846}, {27713, 17485}, {27940, 17122}, {28162, 16755}, {28378, 16385}, {28590, 16012}, {28797, 15636}, {28999, 15258}, {29197, 14878}, {29389, 14494}, {29576, 14108}, {29757, 13720}, {29934, 13329}, {30107, 12937}, {30274, 12540}, {30435, 12142}, {30592, 11744}, {30743, 11342}, {30889, 10939}, {31030, 10534}, {31164, 10127}, {31294, 9718}, {31418, 9307}, {31537, 8895}, {31652, 8482}, {31759, 8067}, {31862, 7650}, {31960, 7233}, {32051, 6815}, {32138, 6393}, {32219, 5973}, {32294, 5549}, {32364, 5127}, {32429, 4703}, {32487, 4278}, {32541, 3852}, {32588, 3426}, {32630, 2999}, {32667, 2572}, {32698, 2144}, {32724, 1716}, {32742, 1287}, {32757, 860}, {32766, 430}, }; #ifndef FFT_BITREV480 #define FFT_BITREV480 static const celt_int16 fft_bitrev480[480] = { 0, 120, 240, 360, 30, 150, 270, 390, 60, 180, 300, 420, 90, 210, 330, 450, 15, 135, 255, 375, 45, 165, 285, 405, 75, 195, 315, 435, 105, 225, 345, 465, 5, 125, 245, 365, 35, 155, 275, 395, 65, 185, 305, 425, 95, 215, 335, 455, 20, 140, 260, 380, 50, 170, 290, 410, 80, 200, 320, 440, 110, 230, 350, 470, 10, 130, 250, 370, 40, 160, 280, 400, 70, 190, 310, 430, 100, 220, 340, 460, 25, 145, 265, 385, 55, 175, 295, 415, 85, 205, 325, 445, 115, 235, 355, 475, 1, 121, 241, 361, 31, 151, 271, 391, 61, 181, 301, 421, 91, 211, 331, 451, 16, 136, 256, 376, 46, 166, 286, 406, 76, 196, 316, 436, 106, 226, 346, 466, 6, 126, 246, 366, 36, 156, 276, 396, 66, 186, 306, 426, 96, 216, 336, 456, 21, 141, 261, 381, 51, 171, 291, 411, 81, 201, 321, 441, 111, 231, 351, 471, 11, 131, 251, 371, 41, 161, 281, 401, 71, 191, 311, 431, 101, 221, 341, 461, 26, 146, 266, 386, 56, 176, 296, 416, 86, 206, 326, 446, 116, 236, 356, 476, 2, 122, 242, 362, 32, 152, 272, 392, 62, 182, 302, 422, 92, 212, 332, 452, 17, 137, 257, 377, 47, 167, 287, 407, 77, 197, 317, 437, 107, 227, 347, 467, 7, 127, 247, 367, 37, 157, 277, 397, 67, 187, 307, 427, 97, 217, 337, 457, 22, 142, 262, 382, 52, 172, 292, 412, 82, 202, 322, 442, 112, 232, 352, 472, 12, 132, 252, 372, 42, 162, 282, 402, 72, 192, 312, 432, 102, 222, 342, 462, 27, 147, 267, 387, 57, 177, 297, 417, 87, 207, 327, 447, 117, 237, 357, 477, 3, 123, 243, 363, 33, 153, 273, 393, 63, 183, 303, 423, 93, 213, 333, 453, 18, 138, 258, 378, 48, 168, 288, 408, 78, 198, 318, 438, 108, 228, 348, 468, 8, 128, 248, 368, 38, 158, 278, 398, 68, 188, 308, 428, 98, 218, 338, 458, 23, 143, 263, 383, 53, 173, 293, 413, 83, 203, 323, 443, 113, 233, 353, 473, 13, 133, 253, 373, 43, 163, 283, 403, 73, 193, 313, 433, 103, 223, 343, 463, 28, 148, 268, 388, 58, 178, 298, 418, 88, 208, 328, 448, 118, 238, 358, 478, 4, 124, 244, 364, 34, 154, 274, 394, 64, 184, 304, 424, 94, 214, 334, 454, 19, 139, 259, 379, 49, 169, 289, 409, 79, 199, 319, 439, 109, 229, 349, 469, 9, 129, 249, 369, 39, 159, 279, 399, 69, 189, 309, 429, 99, 219, 339, 459, 24, 144, 264, 384, 54, 174, 294, 414, 84, 204, 324, 444, 114, 234, 354, 474, 14, 134, 254, 374, 44, 164, 284, 404, 74, 194, 314, 434, 104, 224, 344, 464, 29, 149, 269, 389, 59, 179, 299, 419, 89, 209, 329, 449, 119, 239, 359, 479, }; #endif #ifndef FFT_BITREV240 #define FFT_BITREV240 static const celt_int16 fft_bitrev240[240] = { 0, 60, 120, 180, 15, 75, 135, 195, 30, 90, 150, 210, 45, 105, 165, 225, 5, 65, 125, 185, 20, 80, 140, 200, 35, 95, 155, 215, 50, 110, 170, 230, 10, 70, 130, 190, 25, 85, 145, 205, 40, 100, 160, 220, 55, 115, 175, 235, 1, 61, 121, 181, 16, 76, 136, 196, 31, 91, 151, 211, 46, 106, 166, 226, 6, 66, 126, 186, 21, 81, 141, 201, 36, 96, 156, 216, 51, 111, 171, 231, 11, 71, 131, 191, 26, 86, 146, 206, 41, 101, 161, 221, 56, 116, 176, 236, 2, 62, 122, 182, 17, 77, 137, 197, 32, 92, 152, 212, 47, 107, 167, 227, 7, 67, 127, 187, 22, 82, 142, 202, 37, 97, 157, 217, 52, 112, 172, 232, 12, 72, 132, 192, 27, 87, 147, 207, 42, 102, 162, 222, 57, 117, 177, 237, 3, 63, 123, 183, 18, 78, 138, 198, 33, 93, 153, 213, 48, 108, 168, 228, 8, 68, 128, 188, 23, 83, 143, 203, 38, 98, 158, 218, 53, 113, 173, 233, 13, 73, 133, 193, 28, 88, 148, 208, 43, 103, 163, 223, 58, 118, 178, 238, 4, 64, 124, 184, 19, 79, 139, 199, 34, 94, 154, 214, 49, 109, 169, 229, 9, 69, 129, 189, 24, 84, 144, 204, 39, 99, 159, 219, 54, 114, 174, 234, 14, 74, 134, 194, 29, 89, 149, 209, 44, 104, 164, 224, 59, 119, 179, 239, }; #endif #ifndef FFT_BITREV120 #define FFT_BITREV120 static const celt_int16 fft_bitrev120[120] = { 0, 30, 60, 90, 15, 45, 75, 105, 5, 35, 65, 95, 20, 50, 80, 110, 10, 40, 70, 100, 25, 55, 85, 115, 1, 31, 61, 91, 16, 46, 76, 106, 6, 36, 66, 96, 21, 51, 81, 111, 11, 41, 71, 101, 26, 56, 86, 116, 2, 32, 62, 92, 17, 47, 77, 107, 7, 37, 67, 97, 22, 52, 82, 112, 12, 42, 72, 102, 27, 57, 87, 117, 3, 33, 63, 93, 18, 48, 78, 108, 8, 38, 68, 98, 23, 53, 83, 113, 13, 43, 73, 103, 28, 58, 88, 118, 4, 34, 64, 94, 19, 49, 79, 109, 9, 39, 69, 99, 24, 54, 84, 114, 14, 44, 74, 104, 29, 59, 89, 119, }; #endif #ifndef FFT_BITREV60 #define FFT_BITREV60 static const celt_int16 fft_bitrev60[60] = { 0, 15, 30, 45, 5, 20, 35, 50, 10, 25, 40, 55, 1, 16, 31, 46, 6, 21, 36, 51, 11, 26, 41, 56, 2, 17, 32, 47, 7, 22, 37, 52, 12, 27, 42, 57, 3, 18, 33, 48, 8, 23, 38, 53, 13, 28, 43, 58, 4, 19, 34, 49, 9, 24, 39, 54, 14, 29, 44, 59, }; #endif #ifndef FFT_STATE48000_960_0 #define FFT_STATE48000_960_0 static const kiss_fft_state fft_state48000_960_0 = { 480, /* nfft */ -1, /* shift */ {4, 120, 4, 30, 2, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, }, /* factors */ fft_bitrev480, /* bitrev */ fft_twiddles48000_960, /* bitrev */ }; #endif #ifndef FFT_STATE48000_960_1 #define FFT_STATE48000_960_1 static const kiss_fft_state fft_state48000_960_1 = { 240, /* nfft */ 1, /* shift */ {4, 60, 4, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */ fft_bitrev240, /* bitrev */ fft_twiddles48000_960, /* bitrev */ }; #endif #ifndef FFT_STATE48000_960_2 #define FFT_STATE48000_960_2 static const kiss_fft_state fft_state48000_960_2 = { 120, /* nfft */ 2, /* shift */ {4, 30, 2, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */ fft_bitrev120, /* bitrev */ fft_twiddles48000_960, /* bitrev */ }; #endif #ifndef FFT_STATE48000_960_3 #define FFT_STATE48000_960_3 static const kiss_fft_state fft_state48000_960_3 = { 60, /* nfft */ 3, /* shift */ {4, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */ fft_bitrev60, /* bitrev */ fft_twiddles48000_960, /* bitrev */ }; #endif #endif #ifndef MDCT_TWIDDLES960 #define MDCT_TWIDDLES960 static const celt_word16 mdct_twiddles960[481] = { 32767, 32767, 32767, 32767, 32766, 32763, 32762, 32759, 32757, 32753, 32751, 32747, 32743, 32738, 32733, 32729, 32724, 32717, 32711, 32705, 32698, 32690, 32683, 32676, 32667, 32658, 32650, 32640, 32631, 32620, 32610, 32599, 32588, 32577, 32566, 32554, 32541, 32528, 32515, 32502, 32487, 32474, 32459, 32444, 32429, 32413, 32397, 32381, 32364, 32348, 32331, 32313, 32294, 32277, 32257, 32239, 32219, 32200, 32180, 32159, 32138, 32118, 32096, 32074, 32051, 32029, 32006, 31984, 31960, 31936, 31912, 31888, 31863, 31837, 31812, 31786, 31760, 31734, 31707, 31679, 31652, 31624, 31596, 31567, 31539, 31508, 31479, 31450, 31419, 31388, 31357, 31326, 31294, 31262, 31230, 31198, 31164, 31131, 31097, 31063, 31030, 30994, 30959, 30924, 30889, 30853, 30816, 30779, 30743, 30705, 30668, 30629, 30592, 30553, 30515, 30475, 30435, 30396, 30356, 30315, 30274, 30233, 30191, 30149, 30107, 30065, 30022, 29979, 29936, 29891, 29847, 29803, 29758, 29713, 29668, 29622, 29577, 29529, 29483, 29436, 29390, 29341, 29293, 29246, 29197, 29148, 29098, 29050, 29000, 28949, 28899, 28848, 28797, 28746, 28694, 28642, 28590, 28537, 28485, 28432, 28378, 28324, 28271, 28217, 28162, 28106, 28051, 27995, 27940, 27884, 27827, 27770, 27713, 27657, 27598, 27540, 27481, 27423, 27365, 27305, 27246, 27187, 27126, 27066, 27006, 26945, 26883, 26822, 26760, 26698, 26636, 26574, 26510, 26448, 26383, 26320, 26257, 26191, 26127, 26062, 25997, 25931, 25866, 25800, 25734, 25667, 25601, 25533, 25466, 25398, 25330, 25262, 25194, 25125, 25056, 24987, 24917, 24848, 24778, 24707, 24636, 24566, 24495, 24424, 24352, 24280, 24208, 24135, 24063, 23990, 23917, 23842, 23769, 23695, 23622, 23546, 23472, 23398, 23322, 23246, 23171, 23095, 23018, 22942, 22866, 22788, 22711, 22634, 22557, 22478, 22400, 22322, 22244, 22165, 22085, 22006, 21927, 21846, 21766, 21687, 21606, 21524, 21443, 21363, 21282, 21199, 21118, 21035, 20954, 20870, 20788, 20705, 20621, 20538, 20455, 20371, 20286, 20202, 20118, 20034, 19947, 19863, 19777, 19692, 19606, 19520, 19434, 19347, 19260, 19174, 19088, 18999, 18911, 18825, 18737, 18648, 18560, 18472, 18384, 18294, 18205, 18116, 18025, 17936, 17846, 17757, 17666, 17576, 17485, 17395, 17303, 17212, 17122, 17030, 16937, 16846, 16755, 16662, 16569, 16477, 16385, 16291, 16198, 16105, 16012, 15917, 15824, 15730, 15636, 15541, 15447, 15352, 15257, 15162, 15067, 14973, 14875, 14781, 14685, 14589, 14493, 14396, 14300, 14204, 14107, 14010, 13914, 13815, 13718, 13621, 13524, 13425, 13328, 13230, 13133, 13033, 12935, 12836, 12738, 12638, 12540, 12441, 12341, 12241, 12142, 12044, 11943, 11843, 11744, 11643, 11542, 11442, 11342, 11241, 11139, 11039, 10939, 10836, 10736, 10635, 10534, 10431, 10330, 10228, 10127, 10024, 9921, 9820, 9718, 9614, 9512, 9410, 9306, 9204, 9101, 8998, 8895, 8791, 8689, 8585, 8481, 8377, 8274, 8171, 8067, 7962, 7858, 7753, 7650, 7545, 7441, 7336, 7231, 7129, 7023, 6917, 6813, 6709, 6604, 6498, 6393, 6288, 6182, 6077, 5973, 5867, 5760, 5656, 5549, 5445, 5339, 5232, 5127, 5022, 4914, 4809, 4703, 4596, 4490, 4384, 4278, 4171, 4065, 3958, 3852, 3745, 3640, 3532, 3426, 3318, 3212, 3106, 2998, 2891, 2786, 2679, 2570, 2465, 2358, 2251, 2143, 2037, 1929, 1823, 1715, 1609, 1501, 1393, 1287, 1180, 1073, 964, 858, 751, 644, 535, 429, 322, 214, 107, 0, }; #endif static const CELTMode mode48000_960_120 = { 48000, /* Fs */ 120, /* overlap */ 21, /* nbEBands */ 21, /* effEBands */ {27853, 0, 4096, 8192, }, /* preemph */ eband5ms, /* eBands */ 11, /* nbAllocVectors */ band_allocation, /* allocVectors */ {1920, 3, {&fft_state48000_960_0, &fft_state48000_960_1, &fft_state48000_960_2, &fft_state48000_960_3, }, mdct_twiddles960}, /* mdct */ window120, /* window */ 3, /* maxLM */ 8, /* nbShortMdcts */ 120, /* shortMdctSize */ logN400, /* logN */ {392, cache_index50, cache_bits50, cache_caps50}, /* cache */ }; /* List of all the available modes */ #define TOTAL_MODES 1 static const CELTMode * const static_mode_list[TOTAL_MODES] = { &mode48000_960_120, }; mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/entenc.h0000664000175000017500000001244714010707315021710 0ustar builderbuilder/* Copyright (c) 2001-2011 Timothy B. Terriberry Copyright (c) 2008-2009 Xiph.Org Foundation */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if !defined(_entenc_H) # define _entenc_H (1) # include # include "entcode.h" /*Initializes the encoder. _buf: The buffer to store output bytes in. _size: The size of the buffer, in chars.*/ void ec_enc_init(ec_enc *_this,unsigned char *_buf,ec_uint32 _size); /*Encodes a symbol given its frequency information. The frequency information must be discernable by the decoder, assuming it has read only the previous symbols from the stream. It is allowable to change the frequency information, or even the entire source alphabet, so long as the decoder can tell from the context of the previously encoded information that it is supposed to do so as well. _fl: The cumulative frequency of all symbols that come before the one to be encoded. _fh: The cumulative frequency of all symbols up to and including the one to be encoded. Together with _fl, this defines the range [_fl,_fh) in which the decoded value will fall. _ft: The sum of the frequencies of all the symbols*/ void ec_encode(ec_enc *_this,unsigned _fl,unsigned _fh,unsigned _ft); /*Equivalent to ec_encode() with _ft==1<<_bits.*/ void ec_encode_bin(ec_enc *_this,unsigned _fl,unsigned _fh,unsigned _bits); /* Encode a bit that has a 1/(1<<_logp) probability of being a one */ void ec_enc_bit_logp(ec_enc *_this,int _val,unsigned _logp); /*Encodes a symbol given an "inverse" CDF table. _s: The index of the symbol to encode. _icdf: The "inverse" CDF, such that symbol _s falls in the range [_s>0?ft-_icdf[_s-1]:0,ft-_icdf[_s]), where ft=1<<_ftb. The values must be monotonically non-increasing, and the last value must be 0. _ftb: The number of bits of precision in the cumulative distribution.*/ void ec_enc_icdf(ec_enc *_this,int _s,const unsigned char *_icdf,unsigned _ftb); /*Encodes a raw unsigned integer in the stream. _fl: The integer to encode. _ft: The number of integers that can be encoded (one more than the max). This must be at least one, and no more than 2**32-1.*/ void ec_enc_uint(ec_enc *_this,ec_uint32 _fl,ec_uint32 _ft); /*Encodes a sequence of raw bits in the stream. _fl: The bits to encode. _ftb: The number of bits to encode. This must be between 0 and 25, inclusive.*/ void ec_enc_bits(ec_enc *_this,ec_uint32 _fl,unsigned _ftb); /*Overwrites a few bits at the very start of an existing stream, after they have already been encoded. This makes it possible to have a few flags up front, where it is easy for decoders to access them without parsing the whole stream, even if their values are not determined until late in the encoding process, without having to buffer all the intermediate symbols in the encoder. In order for this to work, at least _nbits bits must have already been encoded using probabilities that are an exact power of two. The encoder can verify the number of encoded bits is sufficient, but cannot check this latter condition. _val: The bits to encode (in the least _nbits significant bits). They will be decoded in order from most-significant to least. _nbits: The number of bits to overwrite. This must be no more than 8.*/ void ec_enc_patch_initial_bits(ec_enc *_this,unsigned _val,unsigned _nbits); /*Compacts the data to fit in the target size. This moves up the raw bits at the end of the current buffer so they are at the end of the new buffer size. The caller must ensure that the amount of data that's already been written will fit in the new size. _size: The number of bytes in the new buffer. This must be large enough to contain the bits already written, and must be no larger than the existing size.*/ void ec_enc_shrink(ec_enc *_this,ec_uint32 _size); /*Indicates that there are no more symbols to encode. All reamining output bytes are flushed to the output buffer. ec_enc_init() must be called before the encoder can be used again.*/ void ec_enc_done(ec_enc *_this); #endif mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/celt.c0000664000175000017500000023137714010707315021363 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2010 Xiph.Org Foundation Copyright (c) 2008 Gregory Maxwell Written by Jean-Marc Valin and Gregory Maxwell */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #define CELT_C /* Always enable postfilter for Opus */ #if defined(OPUS_BUILD) && !defined(ENABLE_POSTFILTER) #define ENABLE_POSTFILTER #endif #include "os_support.h" #include "mdct.h" #include #include "celt.h" #include "pitch.h" #include "bands.h" #include "modes.h" #include "entcode.h" #include "quant_bands.h" #include "rate.h" #include "stack_alloc.h" #include "mathops.h" #include "float_cast.h" #include #include "plc.h" #include "vq.h" static const unsigned char trim_icdf[11] = {126, 124, 119, 109, 87, 41, 19, 9, 4, 2, 0}; /* Probs: NONE: 21.875%, LIGHT: 6.25%, NORMAL: 65.625%, AGGRESSIVE: 6.25% */ static const unsigned char spread_icdf[4] = {25, 23, 2, 0}; static const unsigned char tapset_icdf[3]={2,1,0}; #define COMBFILTER_MAXPERIOD 1024 #define COMBFILTER_MINPERIOD 15 static int resampling_factor(celt_int32 rate) { int ret; switch (rate) { case 48000: ret = 1; break; case 24000: ret = 2; break; case 16000: ret = 3; break; case 12000: ret = 4; break; case 8000: ret = 6; break; default: ret = 0; } return ret; } /** Encoder state @brief Encoder state */ struct CELTEncoder { const CELTMode *mode; /**< Mode used by the encoder */ int overlap; int channels; int stream_channels; int force_intra; int clip; int disable_pf; int complexity; int upsample; int start, end; celt_int32 bitrate; int vbr; int constrained_vbr; /* If zero, VBR can do whatever it likes with the rate */ /* Everything beyond this point gets cleared on a reset */ #define ENCODER_RESET_START rng ec_uint32 rng; int spread_decision; int delayedIntra; int tonal_average; int lastCodedBands; int hf_average; int tapset_decision; int prefilter_period; celt_word16 prefilter_gain; int prefilter_tapset; #ifdef RESYNTH int prefilter_period_old; celt_word16 prefilter_gain_old; int prefilter_tapset_old; #endif int consec_transient; /* VBR-related parameters */ celt_int32 vbr_reservoir; celt_int32 vbr_drift; celt_int32 vbr_offset; celt_int32 vbr_count; celt_word32 preemph_memE[2]; celt_word32 preemph_memD[2]; #ifdef RESYNTH celt_sig syn_mem[2][2*MAX_PERIOD]; #endif celt_sig in_mem[1]; /* Size = channels*mode->overlap */ /* celt_sig prefilter_mem[], Size = channels*COMBFILTER_PERIOD */ /* celt_sig overlap_mem[], Size = channels*mode->overlap */ /* celt_word16 oldEBands[], Size = 2*channels*mode->nbEBands */ }; int celt_encoder_get_size(int channels) { CELTMode *mode = celt_mode_create(48000, 960, NULL); return celt_encoder_get_size_custom(mode, channels); } int celt_encoder_get_size_custom(const CELTMode *mode, int channels) { int size = sizeof(struct CELTEncoder) + (2*channels*mode->overlap-1)*sizeof(celt_sig) + channels*COMBFILTER_MAXPERIOD*sizeof(celt_sig) + 3*channels*mode->nbEBands*sizeof(celt_word16); return size; } CELTEncoder *celt_encoder_create(int sampling_rate, int channels, int *error) { CELTEncoder *st; st = (CELTEncoder *)celt_alloc(celt_encoder_get_size(channels)); if (st!=NULL && celt_encoder_init(st, sampling_rate, channels, error)==NULL) { celt_encoder_destroy(st); st = NULL; } return st; } CELTEncoder *celt_encoder_create_custom(const CELTMode *mode, int channels, int *error) { CELTEncoder *st = (CELTEncoder *)celt_alloc(celt_encoder_get_size_custom(mode, channels)); if (st!=NULL && celt_encoder_init_custom(st, mode, channels, error)==NULL) { celt_encoder_destroy(st); st = NULL; } return st; } CELTEncoder *celt_encoder_init(CELTEncoder *st, int sampling_rate, int channels, int *error) { celt_encoder_init_custom(st, celt_mode_create(48000, 960, NULL), channels, error); st->upsample = resampling_factor(sampling_rate); if (st->upsample==0) { if (error) *error = CELT_BAD_ARG; return NULL; } return st; } CELTEncoder *celt_encoder_init_custom(CELTEncoder *st, const CELTMode *mode, int channels, int *error) { if (channels < 0 || channels > 2) { if (error) *error = CELT_BAD_ARG; return NULL; } if (st==NULL || mode==NULL) { if (error) *error = CELT_ALLOC_FAIL; return NULL; } CELT_MEMSET((char*)st, 0, celt_encoder_get_size_custom(mode, channels)); st->mode = mode; st->overlap = mode->overlap; st->stream_channels = st->channels = channels; st->upsample = 1; st->start = 0; st->end = st->mode->effEBands; st->constrained_vbr = 1; st->clip = 1; st->bitrate = 255000*channels; st->vbr = 0; st->vbr_offset = 0; st->force_intra = 0; st->delayedIntra = 1; st->tonal_average = 256; st->spread_decision = SPREAD_NORMAL; st->hf_average = 0; st->tapset_decision = 0; st->complexity = 5; if (error) *error = CELT_OK; return st; } void celt_encoder_destroy(CELTEncoder *st) { celt_free(st); } static inline celt_int16 FLOAT2INT16(float x) { x = x*CELT_SIG_SCALE; x = MAX32(x, -32768); x = MIN32(x, 32767); return (celt_int16)float2int(x); } static inline celt_word16 SIG2WORD16(celt_sig x) { #ifdef FIXED_POINT x = PSHR32(x, SIG_SHIFT); x = MAX32(x, -32768); x = MIN32(x, 32767); return EXTRACT16(x); #else return (celt_word16)x; #endif } static int transient_analysis(const celt_word32 * restrict in, int len, int C, int overlap) { int i; VARDECL(celt_word16, tmp); celt_word32 mem0=0,mem1=0; int is_transient = 0; int block; int N; /* FIXME: Make that smaller */ celt_word16 bins[50]; SAVE_STACK; ALLOC(tmp, len, celt_word16); block = overlap/2; N=len/block; if (C==1) { for (i=0;i=3) is_transient=1; conseq = 0; for (j=i+1;j=7) is_transient=1; } RESTORE_STACK; return is_transient; } /** Apply window and compute the MDCT for all sub-frames and all channels in a frame */ static void compute_mdcts(const CELTMode *mode, int shortBlocks, celt_sig * restrict in, celt_sig * restrict out, int _C, int LM) { const int C = CHANNELS(_C); if (C==1 && !shortBlocks) { const int overlap = OVERLAP(mode); clt_mdct_forward(&mode->mdct, in, out, mode->window, overlap, mode->maxLM-LM); } else { const int overlap = OVERLAP(mode); int N = mode->shortMdctSize<mdct[0];*/ N = mode->shortMdctSize; B = shortBlocks; } ALLOC(tmp, N, celt_word32); c=0; do { for (b=0;bmdct, in+c*(B*N+overlap)+b*N, tmp, mode->window, overlap, shortBlocks ? mode->maxLM : mode->maxLM-LM); /* Interleaving the sub-frames */ for (j=0;jshortMdctSize<shortMdctSize; B = shortBlocks; } /* Prevents problems from the imdct doing the overlap-add */ CELT_MEMSET(x, 0, overlap); for (b=0;bmdct, tmp, x+N2*b, mode->window, overlap, shortBlocks ? mode->maxLM : mode->maxLM-LM); } for (j=0;j>LM;j++) L2 = MAC16_16(L2, tmp[(j<eBands[len]-m->eBands[len-1])<eBands[i+1]-m->eBands[i])<eBands[i]<eBands[i]<>LM); best_L1 = L1; /*printf ("%f ", L1);*/ for (k=0;k>(LM-k), 1<<(LM-k)); else haar1(tmp, N>>k, 1<>LM); if (L1 < best_L1) { best_L1 = L1; best_level = k+1; } } /*printf ("%d ", isTransient ? LM-best_level : best_level);*/ if (isTransient) metric[i] = best_level; else metric[i] = -best_level; *tf_sum += metric[i]; } /*printf("\n");*/ /* FIXME: Figure out how to set this */ tf_select = 0; cost0 = 0; cost1 = isTransient ? 0 : lambda; /* Viterbi forward pass */ for (i=1;i=0;i--) { if (tf_res[i+1] == 1) tf_res[i] = path1[i+1]; else tf_res[i] = path0[i+1]; } RESTORE_STACK; return tf_select; } static void tf_encode(int start, int end, int isTransient, int *tf_res, int LM, int tf_select, ec_enc *enc) { int curr, i; int tf_select_rsv; int tf_changed; int logp; ec_uint32 budget; ec_uint32 tell; budget = enc->storage*8; tell = ec_tell(enc); logp = isTransient ? 2 : 4; /* Reserve space to code the tf_select decision. */ tf_select_rsv = LM>0 && tell+logp+1 <= budget; budget -= tf_select_rsv; curr = tf_changed = 0; for (i=start;istorage*8; tell = ec_tell(dec); logp = isTransient ? 2 : 4; tf_select_rsv = LM>0 && tell+logp+1<=budget; budget -= tf_select_rsv; tf_changed = curr = 0; for (i=start;inbEBands;i++) { int N; N=(m->eBands[i+1]-m->eBands[i])<cache.caps[m->nbEBands*(2*LM+C-1)+i]+64)*C*N>>2; } } static int alloc_trim_analysis(const CELTMode *m, const celt_norm *X, const celt_word16 *bandLogE, int end, int LM, int C, int N0) { int i; celt_word32 diff=0; int c; int trim_index = 5; if (C==2) { celt_word16 sum = 0; /* Q10 */ /* Compute inter-channel correlation for low frequencies */ for (i=0;i<8;i++) { int j; celt_word32 partial = 0; for (j=m->eBands[i]<eBands[i+1]< QCONST16(.995f,10)) trim_index-=4; else if (sum > QCONST16(.92f,10)) trim_index-=3; else if (sum > QCONST16(.85f,10)) trim_index-=2; else if (sum > QCONST16(.8f,10)) trim_index-=1; } /* Estimate spectral tilt */ c=0; do { for (i=0;inbEBands]*(celt_int32)(2+2*i-m->nbEBands); } } while (++c<0); diff /= C*(end-1); /*printf("%f\n", diff);*/ if (diff > QCONST16(2.f, DB_SHIFT)) trim_index--; if (diff > QCONST16(8.f, DB_SHIFT)) trim_index--; if (diff < -QCONST16(4.f, DB_SHIFT)) trim_index++; if (diff < -QCONST16(10.f, DB_SHIFT)) trim_index++; if (trim_index<0) trim_index = 0; if (trim_index>10) trim_index = 10; return trim_index; } static int stereo_analysis(const CELTMode *m, const celt_norm *X, int LM, int N0) { int i; int thetas; celt_word32 sumLR = EPSILON, sumMS = EPSILON; /* Use the L1 norm to model the entropy of the L/R signal vs the M/S signal */ for (i=0;i<13;i++) { int j; for (j=m->eBands[i]<eBands[i+1]<eBands[13]<<(LM+1))+thetas, sumMS) > MULT16_32_Q15(m->eBands[13]<<(LM+1), sumLR); } #ifdef FIXED_POINT CELT_STATIC int celt_encode_with_ec(CELTEncoder * restrict st, const celt_int16 * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes, ec_enc *enc) { #else CELT_STATIC int celt_encode_with_ec_float(CELTEncoder * restrict st, const celt_sig * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes, ec_enc *enc) { #endif int i, c, N; celt_int32 bits; ec_enc _enc; VARDECL(celt_sig, in); VARDECL(celt_sig, freq); VARDECL(celt_norm, X); VARDECL(celt_ener, bandE); VARDECL(celt_word16, bandLogE); VARDECL(int, fine_quant); VARDECL(celt_word16, error); VARDECL(int, pulses); VARDECL(int, cap); VARDECL(int, offsets); VARDECL(int, fine_priority); VARDECL(int, tf_res); VARDECL(unsigned char, collapse_masks); celt_sig *_overlap_mem; celt_sig *prefilter_mem; celt_word16 *oldBandE, *oldLogE, *oldLogE2; int shortBlocks=0; int isTransient=0; int resynth; const int CC = CHANNELS(st->channels); const int C = CHANNELS(st->stream_channels); int LM, M; int tf_select; int nbFilledBytes, nbAvailableBytes; int effEnd; int codedBands; int tf_sum; int alloc_trim; int pitch_index=COMBFILTER_MINPERIOD; celt_word16 gain1 = 0; int intensity=0; int dual_stereo=0; int effectiveBytes; celt_word16 pf_threshold; int dynalloc_logp; celt_int32 vbr_rate; celt_int32 total_bits; celt_int32 total_boost; celt_int32 balance; celt_int32 tell; int prefilter_tapset=0; int pf_on; int anti_collapse_rsv; int anti_collapse_on=0; int silence=0; SAVE_STACK; if (nbCompressedBytes<2 || pcm==NULL) return CELT_BAD_ARG; /* Can't produce more than 1275 output bytes */ nbCompressedBytes = IMIN(nbCompressedBytes,1275); frame_size *= st->upsample; for (LM=0;LM<=st->mode->maxLM;LM++) if (st->mode->shortMdctSize<st->mode->maxLM) return CELT_BAD_ARG; M=1<mode->shortMdctSize; prefilter_mem = st->in_mem+CC*(st->overlap); _overlap_mem = prefilter_mem+CC*COMBFILTER_MAXPERIOD; /*_overlap_mem = st->in_mem+C*(st->overlap);*/ oldBandE = (celt_word16*)(st->in_mem+CC*(2*st->overlap+COMBFILTER_MAXPERIOD)); oldLogE = oldBandE + CC*st->mode->nbEBands; oldLogE2 = oldLogE + CC*st->mode->nbEBands; if (enc==NULL) { tell=1; nbFilledBytes=0; } else { tell=ec_tell(enc); nbFilledBytes=(tell+4)>>3; } nbAvailableBytes = nbCompressedBytes - nbFilledBytes; if (st->vbr) { celt_int32 den=st->mode->Fs>>BITRES; vbr_rate=(st->bitrate*frame_size+(den>>1))/den; effectiveBytes = vbr_rate>>3; } else { celt_int32 tmp; vbr_rate = 0; tmp = st->bitrate*frame_size; if (tell>1) tmp += tell; nbCompressedBytes = IMAX(2, IMIN(nbCompressedBytes, (tmp+4*st->mode->Fs)/(8*st->mode->Fs))); effectiveBytes = nbCompressedBytes; } if (enc==NULL) { ec_enc_init(&_enc, compressed, nbCompressedBytes); enc = &_enc; } if (vbr_rate>0) { /* Computes the max bit-rate allowed in VBR mode to avoid violating the target rate and buffering. We must do this up front so that bust-prevention logic triggers correctly if we don't have enough bits. */ if (st->constrained_vbr) { celt_int32 vbr_bound; celt_int32 max_allowed; /* We could use any multiple of vbr_rate as bound (depending on the delay). This is clamped to ensure we use at least two bytes if the encoder was entirely empty, but to allow 0 in hybrid mode. */ vbr_bound = vbr_rate; max_allowed = IMIN(IMAX(tell==1?2:0, vbr_rate+vbr_bound-st->vbr_reservoir>>(BITRES+3)), nbAvailableBytes); if(max_allowed < nbAvailableBytes) { nbCompressedBytes = nbFilledBytes+max_allowed; nbAvailableBytes = max_allowed; ec_enc_shrink(enc, nbCompressedBytes); } } } total_bits = nbCompressedBytes*8; effEnd = st->end; if (effEnd > st->mode->effEBands) effEnd = st->mode->effEBands; ALLOC(in, CC*(N+st->overlap), celt_sig); /* Find pitch period and gain */ { VARDECL(celt_sig, _pre); celt_sig *pre[2]; SAVE_STACK; ALLOC(_pre, CC*(N+COMBFILTER_MAXPERIOD), celt_sig); pre[0] = _pre; pre[1] = _pre + (N+COMBFILTER_MAXPERIOD); silence = 1; c=0; do { int count = 0; const celt_word16 * restrict pcmp = pcm+c; celt_sig * restrict inp = in+c*(N+st->overlap)+st->overlap; for (i=0;iclip) x = MAX32(-65536.f, MIN32(65536.f,x)); #endif if (++count==st->upsample) { count=0; pcmp+=CC; } else { x = 0; } /* Apply pre-emphasis */ tmp = MULT16_16(st->mode->preemph[2], x); *inp = tmp + st->preemph_memE[c]; st->preemph_memE[c] = MULT16_32_Q15(st->mode->preemph[1], *inp) - MULT16_32_Q15(st->mode->preemph[0], tmp); silence = silence && *inp == 0; inp++; } CELT_COPY(pre[c], prefilter_mem+c*COMBFILTER_MAXPERIOD, COMBFILTER_MAXPERIOD); CELT_COPY(pre[c]+COMBFILTER_MAXPERIOD, in+c*(N+st->overlap)+st->overlap, N); } while (++c0) { effectiveBytes=nbCompressedBytes=IMIN(nbCompressedBytes, nbFilledBytes+2); total_bits=nbCompressedBytes*8; nbAvailableBytes=2; ec_enc_shrink(enc, nbCompressedBytes); } /* Pretend we've filled all the remaining bits with zeros (that's what the initialiser did anyway) */ tell = nbCompressedBytes*8; enc->nbits_total+=tell-ec_tell(enc); } #ifdef ENABLE_POSTFILTER if (nbAvailableBytes>12*C && st->start==0 && !silence && !st->disable_pf && st->complexity >= 5) { VARDECL(celt_word16, pitch_buf); ALLOC(pitch_buf, (COMBFILTER_MAXPERIOD+N)>>1, celt_word16); pitch_downsample(pre, pitch_buf, COMBFILTER_MAXPERIOD+N, CC); pitch_search(pitch_buf+(COMBFILTER_MAXPERIOD>>1), pitch_buf, N, COMBFILTER_MAXPERIOD-COMBFILTER_MINPERIOD, &pitch_index); pitch_index = COMBFILTER_MAXPERIOD-pitch_index; gain1 = remove_doubling(pitch_buf, COMBFILTER_MAXPERIOD, COMBFILTER_MINPERIOD, N, &pitch_index, st->prefilter_period, st->prefilter_gain); if (pitch_index > COMBFILTER_MAXPERIOD-2) pitch_index = COMBFILTER_MAXPERIOD-2; gain1 = MULT16_16_Q15(QCONST16(.7f,15),gain1); prefilter_tapset = st->tapset_decision; } else { gain1 = 0; } /* Gain threshold for enabling the prefilter/postfilter */ pf_threshold = QCONST16(.2f,15); /* Adjusting the threshold based on rate and continuity */ if (abs(pitch_index-st->prefilter_period)*10>pitch_index) pf_threshold += QCONST16(.2f,15); if (nbAvailableBytes<25) pf_threshold += QCONST16(.1f,15); if (nbAvailableBytes<35) pf_threshold += QCONST16(.1f,15); if (st->prefilter_gain > QCONST16(.4f,15)) pf_threshold -= QCONST16(.1f,15); if (st->prefilter_gain > QCONST16(.55f,15)) pf_threshold -= QCONST16(.1f,15); /* Hard threshold at 0.2 */ pf_threshold = MAX16(pf_threshold, QCONST16(.2f,15)); if (gain1start==0 && tell+16<=total_bits) ec_enc_bit_logp(enc, 0, 1); gain1 = 0; pf_on = 0; } else { /*This block is not gated by a total bits check only because of the nbAvailableBytes check above.*/ int qg; int octave; if (ABS16(gain1-st->prefilter_gain)prefilter_gain; #ifdef FIXED_POINT qg = ((gain1+1536)>>10)/3-1; #else qg = floor(.5+gain1*32/3)-1; #endif qg = IMAX(0, IMIN(7, qg)); ec_enc_bit_logp(enc, 1, 1); pitch_index += 1; octave = EC_ILOG(pitch_index)-5; ec_enc_uint(enc, octave, 6); ec_enc_bits(enc, pitch_index-(16<start==0 && tell+16<=total_bits) ec_enc_bit_logp(enc, 0, 1); pf_on = 0; #endif /* ENABLE_POSTFILTER */ c=0; do { int offset = st->mode->shortMdctSize-st->mode->overlap; st->prefilter_period=IMAX(st->prefilter_period, COMBFILTER_MINPERIOD); CELT_COPY(in+c*(N+st->overlap), st->in_mem+c*(st->overlap), st->overlap); #ifdef ENABLE_POSTFILTER if (offset) comb_filter(in+c*(N+st->overlap)+st->overlap, pre[c]+COMBFILTER_MAXPERIOD, st->prefilter_period, st->prefilter_period, offset, -st->prefilter_gain, -st->prefilter_gain, st->prefilter_tapset, st->prefilter_tapset, NULL, 0); comb_filter(in+c*(N+st->overlap)+st->overlap+offset, pre[c]+COMBFILTER_MAXPERIOD+offset, st->prefilter_period, pitch_index, N-offset, -st->prefilter_gain, -gain1, st->prefilter_tapset, prefilter_tapset, st->mode->window, st->mode->overlap); #endif /* ENABLE_POSTFILTER */ CELT_COPY(st->in_mem+c*(st->overlap), in+c*(N+st->overlap)+N, st->overlap); #ifdef ENABLE_POSTFILTER if (N>COMBFILTER_MAXPERIOD) { CELT_MOVE(prefilter_mem+c*COMBFILTER_MAXPERIOD, pre[c]+N, COMBFILTER_MAXPERIOD); } else { CELT_MOVE(prefilter_mem+c*COMBFILTER_MAXPERIOD, prefilter_mem+c*COMBFILTER_MAXPERIOD+N, COMBFILTER_MAXPERIOD-N); CELT_MOVE(prefilter_mem+c*COMBFILTER_MAXPERIOD+COMBFILTER_MAXPERIOD-N, pre[c]+COMBFILTER_MAXPERIOD, N); } #endif /* ENABLE_POSTFILTER */ } while (++c0 && ec_tell(enc)+3<=total_bits) { if (st->complexity > 1) { isTransient = transient_analysis(in, N+st->overlap, CC, st->overlap); if (isTransient) shortBlocks = M; } ec_enc_bit_logp(enc, isTransient, 3); } ALLOC(freq, CC*N, celt_sig); /**< Interleaved signal MDCTs */ ALLOC(bandE,st->mode->nbEBands*CC, celt_ener); ALLOC(bandLogE,st->mode->nbEBands*CC, celt_word16); /* Compute MDCTs */ compute_mdcts(st->mode, shortBlocks, in, freq, CC, LM); if (CC==2&&C==1) { for (i=0;iupsample != 1) { c=0; do { int bound = N/st->upsample; for (i=0;iupsample; for (;imode, freq, bandE, effEnd, C, M); amp2Log2(st->mode, effEnd, st->end, bandE, bandLogE, C); /* Band normalisation */ normalise_bands(st->mode, freq, X, bandE, effEnd, C, M); ALLOC(tf_res, st->mode->nbEBands, int); /* Needs to be before coarse energy quantization because otherwise the energy gets modified */ tf_select = tf_analysis(st->mode, bandLogE, oldBandE, effEnd, C, isTransient, tf_res, effectiveBytes, X, N, LM, &tf_sum); for (i=effEnd;iend;i++) tf_res[i] = tf_res[effEnd-1]; ALLOC(error, C*st->mode->nbEBands, celt_word16); quant_coarse_energy(st->mode, st->start, st->end, effEnd, bandLogE, oldBandE, total_bits, error, enc, C, LM, nbAvailableBytes, st->force_intra, &st->delayedIntra, st->complexity >= 4); tf_encode(st->start, st->end, isTransient, tf_res, LM, tf_select, enc); st->spread_decision = SPREAD_NORMAL; if (ec_tell(enc)+4<=total_bits) { if (shortBlocks || st->complexity < 3 || nbAvailableBytes < 10*C) { if (st->complexity == 0) st->spread_decision = SPREAD_NONE; } else { st->spread_decision = spreading_decision(st->mode, X, &st->tonal_average, st->spread_decision, &st->hf_average, &st->tapset_decision, pf_on&&!shortBlocks, effEnd, C, M); } ec_enc_icdf(enc, st->spread_decision, spread_icdf, 5); } ALLOC(cap, st->mode->nbEBands, int); ALLOC(offsets, st->mode->nbEBands, int); init_caps(st->mode,cap,LM,C); for (i=0;imode->nbEBands;i++) offsets[i] = 0; /* Dynamic allocation code */ /* Make sure that dynamic allocation can't make us bust the budget */ if (effectiveBytes > 50 && LM>=1) { int t1, t2; if (LM <= 1) { t1 = 3; t2 = 5; } else { t1 = 2; t2 = 4; } for (i=st->start+1;iend-1;i++) { celt_word32 d2; d2 = 2*bandLogE[i]-bandLogE[i-1]-bandLogE[i+1]; if (C==2) d2 = HALF32(d2 + 2*bandLogE[i+st->mode->nbEBands]- bandLogE[i-1+st->mode->nbEBands]-bandLogE[i+1+st->mode->nbEBands]); if (d2 > SHL16(t1,DB_SHIFT)) offsets[i] += 1; if (d2 > SHL16(t2,DB_SHIFT)) offsets[i] += 1; } } dynalloc_logp = 6; total_bits<<=BITRES; total_boost = 0; tell = ec_tell_frac(enc); for (i=st->start;iend;i++) { int width, quanta; int dynalloc_loop_logp; int boost; int j; width = C*(st->mode->eBands[i+1]-st->mode->eBands[i])<mode, X, bandLogE, st->end, LM, C, N); ec_enc_icdf(enc, alloc_trim, trim_icdf, 7); tell = ec_tell_frac(enc); } /* Variable bitrate */ if (vbr_rate>0) { celt_word16 alpha; celt_int32 delta; /* The target rate in 8th bits per frame */ celt_int32 target; celt_int32 min_allowed; target = vbr_rate + st->vbr_offset - ((40*C+20)<end-st->start)) target = 7*target/4; else if (tf_sum < -(st->end-st->start)) target = 3*target/2; else if (M > 1) target-=(target+14)/28; /* The current offset is removed from the target and the space used so far is added*/ target=target+tell; /* In VBR mode the frame size must not be reduced so much that it would result in the encoder running out of bits. The margin of 2 bytes ensures that none of the bust-prevention logic in the decoder will have triggered so far. */ min_allowed = (tell+total_boost+(1<>(BITRES+3)) + 2 - nbFilledBytes; nbAvailableBytes = target+(1<<(BITRES+2))>>(BITRES+3); nbAvailableBytes = IMAX(min_allowed,nbAvailableBytes); nbAvailableBytes = IMIN(nbCompressedBytes,nbAvailableBytes+nbFilledBytes) - nbFilledBytes; if(silence) { nbAvailableBytes = 2; target = 2*8<vbr_count < 970) { st->vbr_count++; alpha = celt_rcp(SHL32(EXTEND32(st->vbr_count+20),16)); } else alpha = QCONST16(.001f,15); /* How many bits have we used in excess of what we're allowed */ if (st->constrained_vbr) st->vbr_reservoir += target - vbr_rate; /*printf ("%d\n", st->vbr_reservoir);*/ /* Compute the offset we need to apply in order to reach the target */ st->vbr_drift += (celt_int32)MULT16_32_Q15(alpha,delta-st->vbr_offset-st->vbr_drift); st->vbr_offset = -st->vbr_drift; /*printf ("%d\n", st->vbr_drift);*/ if (st->constrained_vbr && st->vbr_reservoir < 0) { /* We're under the min value -- increase rate */ int adjust = (-st->vbr_reservoir)/(8<vbr_reservoir = 0; /*printf ("+%d\n", adjust);*/ } nbCompressedBytes = IMIN(nbCompressedBytes,nbAvailableBytes+nbFilledBytes); /* This moves the raw bits to take into account the new compressed size */ ec_enc_shrink(enc, nbCompressedBytes); } if (C==2) { int effectiveRate; /* Always use MS for 2.5 ms frames until we can do a better analysis */ if (LM!=0) dual_stereo = stereo_analysis(st->mode, X, LM, N); /* Account for coarse energy */ effectiveRate = (8*effectiveBytes - 80)>>LM; /* effectiveRate in kb/s */ effectiveRate = 2*effectiveRate/5; if (effectiveRate<35) intensity = 8; else if (effectiveRate<50) intensity = 12; else if (effectiveRate<68) intensity = 16; else if (effectiveRate<84) intensity = 18; else if (effectiveRate<102) intensity = 19; else if (effectiveRate<130) intensity = 20; else intensity = 100; intensity = IMIN(st->end,IMAX(st->start, intensity)); } /* Bit allocation */ ALLOC(fine_quant, st->mode->nbEBands, int); ALLOC(pulses, st->mode->nbEBands, int); ALLOC(fine_priority, st->mode->nbEBands, int); /* bits = packet size - where we are - safety*/ bits = ((celt_int32)nbCompressedBytes*8<=2&&bits>=(LM+2<mode, st->start, st->end, offsets, cap, alloc_trim, &intensity, &dual_stereo, bits, &balance, pulses, fine_quant, fine_priority, C, LM, enc, 1, st->lastCodedBands); st->lastCodedBands = codedBands; quant_fine_energy(st->mode, st->start, st->end, oldBandE, error, fine_quant, enc, C); #ifdef MEASURE_NORM_MSE float X0[3000]; float bandE0[60]; c=0; do for (i=0;imode->nbEBands;i++) bandE0[i] = bandE[i]; #endif /* Residual quantisation */ ALLOC(collapse_masks, C*st->mode->nbEBands, unsigned char); quant_all_bands(1, st->mode, st->start, st->end, X, C==2 ? X+N : NULL, collapse_masks, bandE, pulses, shortBlocks, st->spread_decision, dual_stereo, intensity, tf_res, resynth, nbCompressedBytes*(8<rng); if (anti_collapse_rsv > 0) { anti_collapse_on = st->consec_transient<2; ec_enc_bits(enc, anti_collapse_on, 1); } quant_energy_finalise(st->mode, st->start, st->end, oldBandE, error, fine_quant, fine_priority, nbCompressedBytes*8-ec_tell(enc), enc, C); if (silence) { for (i=0;imode->nbEBands;i++) oldBandE[i] = -QCONST16(28.f,DB_SHIFT); } #ifdef RESYNTH /* Re-synthesis of the coded audio if required */ if (resynth) { celt_sig *out_mem[2]; celt_sig *overlap_mem[2]; log2Amp(st->mode, st->start, st->end, bandE, oldBandE, C); if (silence) { for (i=0;imode->nbEBands;i++) bandE[i] = 0; } #ifdef MEASURE_NORM_MSE measure_norm_mse(st->mode, X, X0, bandE, bandE0, M, N, C); #endif if (anti_collapse_on) { anti_collapse(st->mode, X, collapse_masks, LM, C, CC, N, st->start, st->end, oldBandE, oldLogE, oldLogE2, pulses, st->rng); } /* Synthesis */ denormalise_bands(st->mode, X, freq, bandE, effEnd, C, M); CELT_MOVE(st->syn_mem[0], st->syn_mem[0]+N, MAX_PERIOD); if (CC==2) CELT_MOVE(st->syn_mem[1], st->syn_mem[1]+N, MAX_PERIOD); c=0; do for (i=0;imode->eBands[st->start];i++) freq[c*N+i] = 0; while (++cmode->eBands[st->end];isyn_mem[0]+MAX_PERIOD; if (CC==2) out_mem[1] = st->syn_mem[1]+MAX_PERIOD; c=0; do overlap_mem[c] = _overlap_mem + c*st->overlap; while (++cmode, shortBlocks, freq, out_mem, overlap_mem, CC, LM); #ifdef ENABLE_POSTFILTER c=0; do { st->prefilter_period=IMAX(st->prefilter_period, COMBFILTER_MINPERIOD); st->prefilter_period_old=IMAX(st->prefilter_period_old, COMBFILTER_MINPERIOD); comb_filter(out_mem[c], out_mem[c], st->prefilter_period_old, st->prefilter_period, st->mode->shortMdctSize, st->prefilter_gain_old, st->prefilter_gain, st->prefilter_tapset_old, st->prefilter_tapset, st->mode->window, st->overlap); if (LM!=0) comb_filter(out_mem[c]+st->mode->shortMdctSize, out_mem[c]+st->mode->shortMdctSize, st->prefilter_period, pitch_index, N-st->mode->shortMdctSize, st->prefilter_gain, gain1, st->prefilter_tapset, prefilter_tapset, st->mode->window, st->mode->overlap); } while (++cupsample, st->mode->preemph, st->preemph_memD); st->prefilter_period_old = st->prefilter_period; st->prefilter_gain_old = st->prefilter_gain; st->prefilter_tapset_old = st->prefilter_tapset; } #endif st->prefilter_period = pitch_index; st->prefilter_gain = gain1; st->prefilter_tapset = prefilter_tapset; #ifdef RESYNTH if (LM!=0) { st->prefilter_period_old = st->prefilter_period; st->prefilter_gain_old = st->prefilter_gain; st->prefilter_tapset_old = st->prefilter_tapset; } #endif if (CC==2&&C==1) { for (i=0;imode->nbEBands;i++) oldBandE[st->mode->nbEBands+i]=oldBandE[i]; } /* In case start or end were to change */ c=0; do { for (i=0;istart;i++) oldBandE[c*st->mode->nbEBands+i]=0; for (i=st->end;imode->nbEBands;i++) oldBandE[c*st->mode->nbEBands+i]=0; } while (++cmode->nbEBands;i++) oldLogE2[i] = oldLogE[i]; for (i=0;imode->nbEBands;i++) oldLogE[i] = oldBandE[i]; } else { for (i=0;imode->nbEBands;i++) oldLogE[i] = MIN16(oldLogE[i], oldBandE[i]); } if (isTransient) st->consec_transient++; else st->consec_transient=0; st->rng = enc->rng; /* If there's any room left (can only happen for very high rates), it's already filled with zeros */ ec_enc_done(enc); RESTORE_STACK; if (ec_get_error(enc)) return CELT_CORRUPTED_DATA; else return nbCompressedBytes; } #ifdef FIXED_POINT #ifndef DISABLE_FLOAT_API CELT_STATIC int celt_encode_with_ec_float(CELTEncoder * restrict st, const float * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes, ec_enc *enc) { int j, ret, C, N; VARDECL(celt_int16, in); ALLOC_STACK; SAVE_STACK; if (pcm==NULL) return CELT_BAD_ARG; C = CHANNELS(st->channels); N = frame_size; ALLOC(in, C*N, celt_int16); for (j=0;jchannels); N=frame_size; ALLOC(in, C*N, celt_sig); for (j=0;jmode; } break; case CELT_SET_COMPLEXITY_REQUEST: { int value = va_arg(ap, celt_int32); if (value<0 || value>10) goto bad_arg; st->complexity = value; } break; case CELT_SET_START_BAND_REQUEST: { celt_int32 value = va_arg(ap, celt_int32); if (value<0 || value>=st->mode->nbEBands) goto bad_arg; st->start = value; } break; case CELT_SET_END_BAND_REQUEST: { celt_int32 value = va_arg(ap, celt_int32); if (value<1 || value>st->mode->nbEBands) goto bad_arg; st->end = value; } break; case CELT_SET_PREDICTION_REQUEST: { int value = va_arg(ap, celt_int32); if (value<0 || value>2) goto bad_arg; st->disable_pf = value<=1; st->force_intra = value==0; } break; case CELT_SET_VBR_CONSTRAINT_REQUEST: { celt_int32 value = va_arg(ap, celt_int32); st->constrained_vbr = value; } break; case CELT_SET_VBR_REQUEST: { celt_int32 value = va_arg(ap, celt_int32); st->vbr = value; } break; case CELT_SET_BITRATE_REQUEST: { celt_int32 value = va_arg(ap, celt_int32); if (value<=500) goto bad_arg; value = IMIN(value, 260000*st->channels); st->bitrate = value; } break; case CELT_SET_CHANNELS_REQUEST: { celt_int32 value = va_arg(ap, celt_int32); if (value<1 || value>2) goto bad_arg; st->stream_channels = value; } break; case CELT_RESET_STATE: { CELT_MEMSET((char*)&st->ENCODER_RESET_START, 0, celt_encoder_get_size_custom(st->mode, st->channels)- ((char*)&st->ENCODER_RESET_START - (char*)st)); st->vbr_offset = 0; st->delayedIntra = 1; st->spread_decision = SPREAD_NORMAL; st->tonal_average = QCONST16(1.f,8); } break; case CELT_SET_INPUT_CLIPPING_REQUEST: { celt_int32 value = va_arg(ap, celt_int32); st->clip = value; } break; default: goto bad_request; } va_end(ap); return CELT_OK; bad_arg: va_end(ap); return CELT_BAD_ARG; bad_request: va_end(ap); return CELT_UNIMPLEMENTED; } /**********************************************************************/ /* */ /* DECODER */ /* */ /**********************************************************************/ #define DECODE_BUFFER_SIZE 2048 /** Decoder state @brief Decoder state */ struct CELTDecoder { const CELTMode *mode; int overlap; int channels; int stream_channels; int downsample; int start, end; /* Everything beyond this point gets cleared on a reset */ #define DECODER_RESET_START rng ec_uint32 rng; int last_pitch_index; int loss_count; int postfilter_period; int postfilter_period_old; celt_word16 postfilter_gain; celt_word16 postfilter_gain_old; int postfilter_tapset; int postfilter_tapset_old; celt_sig preemph_memD[2]; celt_sig _decode_mem[1]; /* Size = channels*(DECODE_BUFFER_SIZE+mode->overlap) */ /* celt_word16 lpc[], Size = channels*LPC_ORDER */ /* celt_word16 oldEBands[], Size = channels*mode->nbEBands */ /* celt_word16 oldLogE[], Size = channels*mode->nbEBands */ /* celt_word16 oldLogE2[], Size = channels*mode->nbEBands */ /* celt_word16 backgroundLogE[], Size = channels*mode->nbEBands */ }; int celt_decoder_get_size(int channels) { const CELTMode *mode = celt_mode_create(48000, 960, NULL); return celt_decoder_get_size_custom(mode, channels); } int celt_decoder_get_size_custom(const CELTMode *mode, int channels) { int size = sizeof(struct CELTDecoder) + (channels*(DECODE_BUFFER_SIZE+mode->overlap)-1)*sizeof(celt_sig) + channels*LPC_ORDER*sizeof(celt_word16) + 4*channels*mode->nbEBands*sizeof(celt_word16); return size; } CELTDecoder *celt_decoder_create(int sampling_rate, int channels, int *error) { CELTDecoder *st; st = (CELTDecoder *)celt_alloc(celt_decoder_get_size(channels)); if (st!=NULL && celt_decoder_init(st, sampling_rate, channels, error)==NULL) { celt_decoder_destroy(st); st = NULL; } return st; } CELTDecoder *celt_decoder_create_custom(const CELTMode *mode, int channels, int *error) { CELTDecoder *st = (CELTDecoder *)celt_alloc(celt_decoder_get_size_custom(mode, channels)); if (st!=NULL && celt_decoder_init_custom(st, mode, channels, error)==NULL) { celt_decoder_destroy(st); st = NULL; } return st; } CELTDecoder *celt_decoder_init(CELTDecoder *st, int sampling_rate, int channels, int *error) { celt_decoder_init_custom(st, celt_mode_create(48000, 960, NULL), channels, error); st->downsample = resampling_factor(sampling_rate); if (st->downsample==0) { if (error) *error = CELT_BAD_ARG; return NULL; } return st; } CELTDecoder *celt_decoder_init_custom(CELTDecoder *st, const CELTMode *mode, int channels, int *error) { if (channels < 0 || channels > 2) { if (error) *error = CELT_BAD_ARG; return NULL; } if (st==NULL) { if (error) *error = CELT_ALLOC_FAIL; return NULL; } CELT_MEMSET((char*)st, 0, celt_decoder_get_size_custom(mode, channels)); st->mode = mode; st->overlap = mode->overlap; st->stream_channels = st->channels = channels; st->downsample = 1; st->start = 0; st->end = st->mode->effEBands; st->loss_count = 0; if (error) *error = CELT_OK; return st; } void celt_decoder_destroy(CELTDecoder *st) { celt_free(st); } static void celt_decode_lost(CELTDecoder * restrict st, celt_word16 * restrict pcm, int N, int LM) { int c; int pitch_index; int overlap = st->mode->overlap; celt_word16 fade = Q15ONE; int i, len; const int C = CHANNELS(st->channels); int offset; celt_sig *out_mem[2]; celt_sig *decode_mem[2]; celt_sig *overlap_mem[2]; celt_word16 *lpc; celt_word32 *out_syn[2]; celt_word16 *oldBandE, *oldLogE2, *backgroundLogE; int plc=1; SAVE_STACK; c=0; do { decode_mem[c] = st->_decode_mem + c*(DECODE_BUFFER_SIZE+st->overlap); out_mem[c] = decode_mem[c]+DECODE_BUFFER_SIZE-MAX_PERIOD; overlap_mem[c] = decode_mem[c]+DECODE_BUFFER_SIZE; } while (++c_decode_mem+(DECODE_BUFFER_SIZE+st->overlap)*C); oldBandE = lpc+C*LPC_ORDER; oldLogE2 = oldBandE + C*st->mode->nbEBands; backgroundLogE = oldLogE2 + C*st->mode->nbEBands; out_syn[0] = out_mem[0]+MAX_PERIOD-N; if (C==2) out_syn[1] = out_mem[1]+MAX_PERIOD-N; len = N+st->mode->overlap; if (st->loss_count >= 5) { VARDECL(celt_sig, freq); VARDECL(celt_norm, X); VARDECL(celt_ener, bandE); celt_uint32 seed; ALLOC(freq, C*N, celt_sig); /**< Interleaved signal MDCTs */ ALLOC(X, C*N, celt_norm); /**< Interleaved normalised MDCTs */ ALLOC(bandE, st->mode->nbEBands*C, celt_ener); log2Amp(st->mode, st->start, st->end, bandE, backgroundLogE, C); seed = st->rng; for (i=0;i>20; } st->rng = seed; for (c=0;cmode->nbEBands;i++) renormalise_vector(X+N*c+(st->mode->eBands[i]<mode->eBands[i+1]-st->mode->eBands[i])<mode, X, freq, bandE, st->mode->nbEBands, C, 1<mode, 0, freq, out_syn, overlap_mem, C, LM); plc = 0; } else if (st->loss_count == 0) { celt_word16 pitch_buf[MAX_PERIOD>>1]; int len2 = len; /* FIXME: This is a kludge */ if (len2>MAX_PERIOD>>1) len2 = MAX_PERIOD>>1; pitch_downsample(out_mem, pitch_buf, MAX_PERIOD, C); pitch_search(pitch_buf+((MAX_PERIOD-len2)>>1), pitch_buf, len2, MAX_PERIOD-len2-100, &pitch_index); pitch_index = MAX_PERIOD-len2-pitch_index; st->last_pitch_index = pitch_index; } else { pitch_index = st->last_pitch_index; fade = QCONST16(.8f,15); } if (plc) { c=0; do { /* FIXME: This is more memory than necessary */ celt_word32 e[2*MAX_PERIOD]; celt_word16 exc[2*MAX_PERIOD]; celt_word32 ac[LPC_ORDER+1]; celt_word16 decay = 1; celt_word32 S1=0; celt_word16 mem[LPC_ORDER]={0}; offset = MAX_PERIOD-pitch_index; for (i=0;iloss_count == 0) { _celt_autocorr(exc, ac, st->mode->window, st->mode->overlap, LPC_ORDER, MAX_PERIOD); /* Noise floor -40 dB */ #ifdef FIXED_POINT ac[0] += SHR32(ac[0],13); #else ac[0] *= 1.0001f; #endif /* Lag windowing */ for (i=1;i<=LPC_ORDER;i++) { /*ac[i] *= exp(-.5*(2*M_PI*.002*i)*(2*M_PI*.002*i));*/ #ifdef FIXED_POINT ac[i] -= MULT16_32_Q15(2*i*i, ac[i]); #else ac[i] -= ac[i]*(.008f*i)*(.008f*i); #endif } _celt_lpc(lpc+c*LPC_ORDER, ac, LPC_ORDER); } for (i=0;i E2) E1 = E2; decay = celt_sqrt(frac_div32(SHR(E1,1),E2)); } /* Copy excitation, taking decay into account */ for (i=0;imode->overlap;i++) { celt_word16 tmp; if (offset+i >= MAX_PERIOD) { offset -= pitch_index; decay = MULT16_16_Q15(decay, decay); } e[i] = SHL32(EXTEND32(MULT16_16_Q15(decay, exc[offset+i])), SIG_SHIFT); tmp = ROUND16(out_mem[c][offset+i],SIG_SHIFT); S1 += SHR32(MULT16_16(tmp,tmp),8); } for (i=0;imode->overlap;i++) e[i] = MULT16_32_Q15(fade, e[i]); iir(e, lpc+c*LPC_ORDER, e, len+st->mode->overlap, LPC_ORDER, mem); { celt_word32 S2=0; for (i=0;i SHR32(S2,2))) #else /* Float test is written this way to catch NaNs at the same time */ if (!(S1 > 0.2f*S2)) #endif { for (i=0;ipostfilter_period, st->postfilter_period, st->overlap, st->postfilter_gain, st->postfilter_gain, st->postfilter_tapset, st->postfilter_tapset, NULL, 0); #endif /* ENABLE_POSTFILTER */ for (i=0;imode->overlap-N;i++) out_mem[c][i] = out_mem[c][N+i]; /* Apply TDAC to the concealed audio so that it blends with the previous and next frames */ for (i=0;imode->window[i], e[N+overlap-1-i]) + MULT16_32_Q15(st->mode->window[overlap-i-1], e[N+i ]); out_mem[c][MAX_PERIOD+i] = MULT16_32_Q15(st->mode->window[overlap-i-1], tmp); out_mem[c][MAX_PERIOD+overlap-i-1] = MULT16_32_Q15(st->mode->window[i], tmp); } for (i=0;ipostfilter_period, st->postfilter_period, st->overlap, -st->postfilter_gain, -st->postfilter_gain, st->postfilter_tapset, st->postfilter_tapset, NULL, 0); #endif /* ENABLE_POSTFILTER */ for (i=0;idownsample, st->mode->preemph, st->preemph_memD); st->loss_count++; RESTORE_STACK; } #ifdef FIXED_POINT CELT_STATIC int celt_decode_with_ec(CELTDecoder * restrict st, const unsigned char *data, int len, celt_int16 * restrict pcm, int frame_size, ec_dec *dec) { #else CELT_STATIC int celt_decode_with_ec_float(CELTDecoder * restrict st, const unsigned char *data, int len, celt_sig * restrict pcm, int frame_size, ec_dec *dec) { #endif int c, i, N; int spread_decision; celt_int32 bits; ec_dec _dec; VARDECL(celt_sig, freq); VARDECL(celt_norm, X); VARDECL(celt_ener, bandE); VARDECL(int, fine_quant); VARDECL(int, pulses); VARDECL(int, cap); VARDECL(int, offsets); VARDECL(int, fine_priority); VARDECL(int, tf_res); VARDECL(unsigned char, collapse_masks); celt_sig *out_mem[2]; celt_sig *decode_mem[2]; celt_sig *overlap_mem[2]; celt_sig *out_syn[2]; celt_word16 *lpc; celt_word16 *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE; int shortBlocks; int isTransient; int intra_ener; const int CC = CHANNELS(st->channels); int LM, M; int effEnd; int codedBands; int alloc_trim; int postfilter_pitch; celt_word16 postfilter_gain; int intensity=0; int dual_stereo=0; celt_int32 total_bits; celt_int32 balance; celt_int32 tell; int dynalloc_logp; int postfilter_tapset; int anti_collapse_rsv; int anti_collapse_on=0; int silence; const int C = CHANNELS(st->stream_channels); SAVE_STACK; if (len<0 || len>1275 || pcm==NULL) return CELT_BAD_ARG; frame_size *= st->downsample; for (LM=0;LM<=st->mode->maxLM;LM++) if (st->mode->shortMdctSize<st->mode->maxLM) return CELT_BAD_ARG; M=1<_decode_mem + c*(DECODE_BUFFER_SIZE+st->overlap); out_mem[c] = decode_mem[c]+DECODE_BUFFER_SIZE-MAX_PERIOD; overlap_mem[c] = decode_mem[c]+DECODE_BUFFER_SIZE; } while (++c_decode_mem+(DECODE_BUFFER_SIZE+st->overlap)*CC); oldBandE = lpc+CC*LPC_ORDER; oldLogE = oldBandE + CC*st->mode->nbEBands; oldLogE2 = oldLogE + CC*st->mode->nbEBands; backgroundLogE = oldLogE2 + CC*st->mode->nbEBands; N = M*st->mode->shortMdctSize; effEnd = st->end; if (effEnd > st->mode->effEBands) effEnd = st->mode->effEBands; ALLOC(freq, CC*N, celt_sig); /**< Interleaved signal MDCTs */ ALLOC(X, CC*N, celt_norm); /**< Interleaved normalised MDCTs */ ALLOC(bandE, st->mode->nbEBands*CC, celt_ener); c=0; do for (i=0;imode->eBands[st->start];i++) X[c*N+i] = 0; while (++cmode->eBands[effEnd];iCC) { RESTORE_STACK; return CELT_CORRUPTED_DATA; } else if (Cmode->nbEBands;i++) oldBandE[i]=MAX16(oldBandE[i],oldBandE[st->mode->nbEBands+i]); } total_bits = len*8; tell = ec_tell(dec); if (tell==1) silence = ec_dec_bit_logp(dec, 15); else silence = 0; if (silence) { /* Pretend we've read all the remaining bits */ tell = len*8; dec->nbits_total+=tell-ec_tell(dec); } postfilter_gain = 0; postfilter_pitch = 0; postfilter_tapset = 0; if (st->start==0 && tell+16 <= total_bits) { if(ec_dec_bit_logp(dec, 1)) { #ifdef ENABLE_POSTFILTER int qg, octave; octave = ec_dec_uint(dec, 6); postfilter_pitch = (16< 0 && tell+3 <= total_bits) { isTransient = ec_dec_bit_logp(dec, 3); tell = ec_tell(dec); } else isTransient = 0; if (isTransient) shortBlocks = M; else shortBlocks = 0; /* Decode the global flags (first symbols in the stream) */ intra_ener = tell+3<=total_bits ? ec_dec_bit_logp(dec, 3) : 0; /* Get band energies */ unquant_coarse_energy(st->mode, st->start, st->end, oldBandE, intra_ener, dec, C, LM); ALLOC(tf_res, st->mode->nbEBands, int); tf_decode(st->start, st->end, isTransient, tf_res, LM, dec); tell = ec_tell(dec); spread_decision = SPREAD_NORMAL; if (tell+4 <= total_bits) spread_decision = ec_dec_icdf(dec, spread_icdf, 5); ALLOC(pulses, st->mode->nbEBands, int); ALLOC(cap, st->mode->nbEBands, int); ALLOC(offsets, st->mode->nbEBands, int); ALLOC(fine_priority, st->mode->nbEBands, int); init_caps(st->mode,cap,LM,C); dynalloc_logp = 6; total_bits<<=BITRES; tell = ec_tell_frac(dec); for (i=st->start;iend;i++) { int width, quanta; int dynalloc_loop_logp; int boost; width = C*(st->mode->eBands[i+1]-st->mode->eBands[i])<0) dynalloc_logp = IMAX(2, dynalloc_logp-1); } ALLOC(fine_quant, st->mode->nbEBands, int); alloc_trim = tell+(6<=2&&bits>=(LM+2<mode, st->start, st->end, offsets, cap, alloc_trim, &intensity, &dual_stereo, bits, &balance, pulses, fine_quant, fine_priority, C, LM, dec, 0, 0); unquant_fine_energy(st->mode, st->start, st->end, oldBandE, fine_quant, dec, C); /* Decode fixed codebook */ ALLOC(collapse_masks, C*st->mode->nbEBands, unsigned char); quant_all_bands(0, st->mode, st->start, st->end, X, C==2 ? X+N : NULL, collapse_masks, NULL, pulses, shortBlocks, spread_decision, dual_stereo, intensity, tf_res, 1, len*(8<rng); if (anti_collapse_rsv > 0) { anti_collapse_on = ec_dec_bits(dec, 1); } unquant_energy_finalise(st->mode, st->start, st->end, oldBandE, fine_quant, fine_priority, len*8-ec_tell(dec), dec, C); if (anti_collapse_on) anti_collapse(st->mode, X, collapse_masks, LM, C, CC, N, st->start, st->end, oldBandE, oldLogE, oldLogE2, pulses, st->rng); log2Amp(st->mode, st->start, st->end, bandE, oldBandE, C); if (silence) { for (i=0;imode->nbEBands;i++) { bandE[i] = 0; oldBandE[i] = -QCONST16(28.f,DB_SHIFT); } } /* Synthesis */ denormalise_bands(st->mode, X, freq, bandE, effEnd, C, M); CELT_MOVE(decode_mem[0], decode_mem[0]+N, DECODE_BUFFER_SIZE-N); if (CC==2) CELT_MOVE(decode_mem[1], decode_mem[1]+N, DECODE_BUFFER_SIZE-N); c=0; do for (i=0;imode->eBands[st->start];i++) freq[c*N+i] = 0; while (++cmode->eBands[effEnd]; if (st->downsample!=1) bound = IMIN(bound, N/st->downsample); for (i=bound;imode, shortBlocks, freq, out_syn, overlap_mem, CC, LM); #ifdef ENABLE_POSTFILTER c=0; do { st->postfilter_period=IMAX(st->postfilter_period, COMBFILTER_MINPERIOD); st->postfilter_period_old=IMAX(st->postfilter_period_old, COMBFILTER_MINPERIOD); comb_filter(out_syn[c], out_syn[c], st->postfilter_period_old, st->postfilter_period, st->mode->shortMdctSize, st->postfilter_gain_old, st->postfilter_gain, st->postfilter_tapset_old, st->postfilter_tapset, st->mode->window, st->overlap); if (LM!=0) comb_filter(out_syn[c]+st->mode->shortMdctSize, out_syn[c]+st->mode->shortMdctSize, st->postfilter_period, postfilter_pitch, N-st->mode->shortMdctSize, st->postfilter_gain, postfilter_gain, st->postfilter_tapset, postfilter_tapset, st->mode->window, st->mode->overlap); } while (++cpostfilter_period_old = st->postfilter_period; st->postfilter_gain_old = st->postfilter_gain; st->postfilter_tapset_old = st->postfilter_tapset; st->postfilter_period = postfilter_pitch; st->postfilter_gain = postfilter_gain; st->postfilter_tapset = postfilter_tapset; if (LM!=0) { st->postfilter_period_old = st->postfilter_period; st->postfilter_gain_old = st->postfilter_gain; st->postfilter_tapset_old = st->postfilter_tapset; } #endif /* ENABLE_POSTFILTER */ if (CC==2&&C==1) { for (i=0;imode->nbEBands;i++) oldBandE[st->mode->nbEBands+i]=oldBandE[i]; } /* In case start or end were to change */ c=0; do { for (i=0;istart;i++) oldBandE[c*st->mode->nbEBands+i]=0; for (i=st->end;imode->nbEBands;i++) oldBandE[c*st->mode->nbEBands+i]=0; } while (++cmode->nbEBands;i++) oldLogE2[i] = oldLogE[i]; for (i=0;imode->nbEBands;i++) oldLogE[i] = oldBandE[i]; for (i=0;imode->nbEBands;i++) backgroundLogE[i] = MIN16(backgroundLogE[i] + M*QCONST16(0.001f,DB_SHIFT), oldBandE[i]); } else { for (i=0;imode->nbEBands;i++) oldLogE[i] = MIN16(oldLogE[i], oldBandE[i]); } st->rng = dec->rng; deemphasis(out_syn, pcm, N, CC, st->downsample, st->mode->preemph, st->preemph_memD); st->loss_count = 0; RESTORE_STACK; if (ec_tell(dec) > 8*len || ec_get_error(dec)) return CELT_CORRUPTED_DATA; else return CELT_OK; } #ifdef FIXED_POINT #ifndef DISABLE_FLOAT_API CELT_STATIC int celt_decode_with_ec_float(CELTDecoder * restrict st, const unsigned char *data, int len, float * restrict pcm, int frame_size, ec_dec *dec) { int j, ret, C, N; VARDECL(celt_int16, out); ALLOC_STACK; SAVE_STACK; if (pcm==NULL) return CELT_BAD_ARG; C = CHANNELS(st->channels); N = frame_size; ALLOC(out, C*N, celt_int16); ret=celt_decode_with_ec(st, data, len, out, frame_size, dec); if (ret==0) for (j=0;jchannels); N = frame_size; ALLOC(out, C*N, celt_sig); ret=celt_decode_with_ec_float(st, data, len, out, frame_size, dec); if (ret==0) for (j=0;jmode; } break; case CELT_SET_START_BAND_REQUEST: { celt_int32 value = va_arg(ap, celt_int32); if (value<0 || value>=st->mode->nbEBands) goto bad_arg; st->start = value; } break; case CELT_SET_END_BAND_REQUEST: { celt_int32 value = va_arg(ap, celt_int32); if (value<1 || value>st->mode->nbEBands) goto bad_arg; st->end = value; } break; case CELT_SET_CHANNELS_REQUEST: { celt_int32 value = va_arg(ap, celt_int32); if (value<1 || value>2) goto bad_arg; st->stream_channels = value; } break; case CELT_RESET_STATE: { CELT_MEMSET((char*)&st->DECODER_RESET_START, 0, celt_decoder_get_size_custom(st->mode, st->channels)- ((char*)&st->DECODER_RESET_START - (char*)st)); } break; default: goto bad_request; } va_end(ap); return CELT_OK; bad_arg: va_end(ap); return CELT_BAD_ARG; bad_request: va_end(ap); return CELT_UNIMPLEMENTED; } const char *celt_strerror(int error) { static const char *error_strings[8] = { "success", "invalid argument", "invalid mode", "internal error", "corrupted stream", "request not implemented", "invalid state", "memory allocation failed" }; if (error > 0 || error < -7) return "unknown error"; else return error_strings[-error]; } mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/vq.h0000664000175000017500000000550614010707315021060 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /** @file vq.h @brief Vector quantisation of the residual */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef VQ_H #define VQ_H #include "entenc.h" #include "entdec.h" #include "modes.h" /** Algebraic pulse-vector quantiser. The signal x is replaced by the sum of * the pitch and a combination of pulses such that its norm is still equal * to 1. This is the function that will typically require the most CPU. * @param x Residual signal to quantise/encode (returns quantised version) * @param W Perceptual weight to use when optimising (currently unused) * @param N Number of samples to encode * @param K Number of pulses to use * @param p Pitch vector (it is assumed that p+x is a unit vector) * @param enc Entropy encoder state * @ret A mask indicating which blocks in the band received pulses */ unsigned alg_quant(celt_norm *X, int N, int K, int spread, int B, int resynth, ec_enc *enc, celt_word16 gain); /** Algebraic pulse decoder * @param x Decoded normalised spectrum (returned) * @param N Number of samples to decode * @param K Number of pulses to use * @param p Pitch vector (automatically added to x) * @param dec Entropy decoder state * @ret A mask indicating which blocks in the band received pulses */ unsigned alg_unquant(celt_norm *X, int N, int K, int spread, int B, ec_dec *dec, celt_word16 gain); void renormalise_vector(celt_norm *X, int N, celt_word16 gain); int stereo_itheta(celt_norm *X, celt_norm *Y, int stereo, int N); #endif /* VQ_H */ mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/mathops.h0000664000175000017500000001463514010707315022110 0ustar builderbuilder/* Copyright (c) 2002-2008 Jean-Marc Valin Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /** @file mathops.h @brief Various math functions */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef MATHOPS_H #define MATHOPS_H #include "arch.h" #include "entcode.h" #include "os_support.h" /* Multiplies two 16-bit fractional values. Bit-exactness of this macro is important */ #define FRAC_MUL16(a,b) ((16384+((celt_int32)(celt_int16)(a)*(celt_int16)(b)))>>15) unsigned isqrt32(celt_uint32 _val); #ifndef FIXED_POINT #define celt_sqrt(x) ((float)sqrt(x)) #define celt_rsqrt(x) (1.f/celt_sqrt(x)) #define celt_rsqrt_norm(x) (celt_rsqrt(x)) #define celt_acos acos #define celt_exp exp #define celt_cos_norm(x) ((float)cos((.5f*M_PI)*(x))) #define celt_atan atan #define celt_rcp(x) (1.f/(x)) #define celt_div(a,b) ((a)/(b)) #define frac_div32(a,b) ((float)(a)/(b)) #ifdef FLOAT_APPROX /* Note: This assumes radix-2 floating point with the exponent at bits 23..30 and an offset of 127 denorm, +/- inf and NaN are *not* handled */ /** Base-2 log approximation (log2(x)). */ static inline float celt_log2(float x) { int integer; float frac; union { float f; celt_uint32 i; } in; in.f = x; integer = (in.i>>23)-127; in.i -= integer<<23; frac = in.f - 1.5f; frac = -0.41445418f + frac*(0.95909232f + frac*(-0.33951290f + frac*0.16541097f)); return 1+integer+frac; } /** Base-2 exponential approximation (2^x). */ static inline float celt_exp2(float x) { int integer; float frac; union { float f; celt_uint32 i; } res; integer = floor(x); if (integer < -50) return 0; frac = x-integer; /* K0 = 1, K1 = log(2), K2 = 3-4*log(2), K3 = 3*log(2) - 2 */ res.f = 0.99992522f + frac * (0.69583354f + frac * (0.22606716f + 0.078024523f*frac)); res.i = (res.i + (integer<<23)) & 0x7fffffff; return res.f; } #else #define celt_log2(x) ((float)(1.442695040888963387*log(x))) #define celt_exp2(x) ((float)exp(0.6931471805599453094*(x))) #endif #endif #ifdef FIXED_POINT #include "os_support.h" #ifndef OVERRIDE_CELT_ILOG2 /** Integer log in base2. Undefined for zero and negative numbers */ static inline celt_int16 celt_ilog2(celt_int32 x) { celt_assert2(x>0, "celt_ilog2() only defined for strictly positive numbers"); return EC_ILOG(x)-1; } #endif #ifndef OVERRIDE_CELT_MAXABS16 static inline celt_word16 celt_maxabs16(celt_word16 *x, int len) { int i; celt_word16 maxval = 0; for (i=0;i14) return 0x7f000000; else if (integer < -15) return 0; frac = SHL16(x-SHL16(integer,10),4); frac = ADD16(D0, MULT16_16_Q15(frac, ADD16(D1, MULT16_16_Q15(frac, ADD16(D2 , MULT16_16_Q15(D3,frac)))))); return VSHR32(EXTEND32(frac), -integer-2); } celt_word32 celt_rcp(celt_word32 x); #define celt_div(a,b) MULT32_32_Q31((celt_word32)(a),celt_rcp(b)) celt_word32 frac_div32(celt_word32 a, celt_word32 b); #define M1 32767 #define M2 -21 #define M3 -11943 #define M4 4936 /* Atan approximation using a 4th order polynomial. Input is in Q15 format and normalized by pi/4. Output is in Q15 format */ static inline celt_word16 celt_atan01(celt_word16 x) { return MULT16_16_P15(x, ADD32(M1, MULT16_16_P15(x, ADD32(M2, MULT16_16_P15(x, ADD32(M3, MULT16_16_P15(M4, x))))))); } #undef M1 #undef M2 #undef M3 #undef M4 /* atan2() approximation valid for positive input values */ static inline celt_word16 celt_atan2p(celt_word16 y, celt_word16 x) { if (y < x) { celt_word32 arg; arg = celt_div(SHL32(EXTEND32(y),15),x); if (arg >= 32767) arg = 32767; return SHR16(celt_atan01(EXTRACT16(arg)),1); } else { celt_word32 arg; arg = celt_div(SHL32(EXTEND32(x),15),y); if (arg >= 32767) arg = 32767; return 25736-SHR16(celt_atan01(EXTRACT16(arg)),1); } } #endif /* FIXED_POINT */ #endif /* MATHOPS_H */ mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/entdec.h0000664000175000017500000001133114010707315021665 0ustar builderbuilder/* Copyright (c) 2001-2011 Timothy B. Terriberry Copyright (c) 2008-2009 Xiph.Org Foundation */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if !defined(_entdec_H) # define _entdec_H (1) # include # include "entcode.h" /*Initializes the decoder. _buf: The input buffer to use. Return: 0 on success, or a negative value on error.*/ void ec_dec_init(ec_dec *_this,unsigned char *_buf,ec_uint32 _storage); /*Calculates the cumulative frequency for the next symbol. This can then be fed into the probability model to determine what that symbol is, and the additional frequency information required to advance to the next symbol. This function cannot be called more than once without a corresponding call to ec_dec_update(), or decoding will not proceed correctly. _ft: The total frequency of the symbols in the alphabet the next symbol was encoded with. Return: A cumulative frequency representing the encoded symbol. If the cumulative frequency of all the symbols before the one that was encoded was fl, and the cumulative frequency of all the symbols up to and including the one encoded is fh, then the returned value will fall in the range [fl,fh).*/ unsigned ec_decode(ec_dec *_this,unsigned _ft); /*Equivalent to ec_decode() with _ft==1<<_bits.*/ unsigned ec_decode_bin(ec_dec *_this,unsigned _bits); /*Advance the decoder past the next symbol using the frequency information the symbol was encoded with. Exactly one call to ec_decode() must have been made so that all necessary intermediate calculations are performed. _fl: The cumulative frequency of all symbols that come before the symbol decoded. _fh: The cumulative frequency of all symbols up to and including the symbol decoded. Together with _fl, this defines the range [_fl,_fh) in which the value returned above must fall. _ft: The total frequency of the symbols in the alphabet the symbol decoded was encoded in. This must be the same as passed to the preceding call to ec_decode().*/ void ec_dec_update(ec_dec *_this,unsigned _fl,unsigned _fh,unsigned _ft); /* Decode a bit that has a 1/(1<<_logp) probability of being a one */ int ec_dec_bit_logp(ec_dec *_this,unsigned _logp); /*Decodes a symbol given an "inverse" CDF table. No call to ec_dec_update() is necessary after this call. _icdf: The "inverse" CDF, such that symbol s falls in the range [s>0?ft-_icdf[s-1]:0,ft-_icdf[s]), where ft=1<<_ftb. The values must be monotonically non-increasing, and the last value must be 0. _ftb: The number of bits of precision in the cumulative distribution. Return: The decoded symbol s.*/ int ec_dec_icdf(ec_dec *_this,const unsigned char *_icdf,unsigned _ftb); /*Extracts a raw unsigned integer with a non-power-of-2 range from the stream. The bits must have been encoded with ec_enc_uint(). No call to ec_dec_update() is necessary after this call. _ft: The number of integers that can be decoded (one more than the max). This must be at least one, and no more than 2**32-1. Return: The decoded bits.*/ ec_uint32 ec_dec_uint(ec_dec *_this,ec_uint32 _ft); /*Extracts a sequence of raw bits from the stream. The bits must have been encoded with ec_enc_bits(). No call to ec_dec_update() is necessary after this call. _ftb: The number of bits to extract. This must be between 0 and 25, inclusive. Return: The decoded bits.*/ ec_uint32 ec_dec_bits(ec_dec *_this,unsigned _ftb); #endif mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/fixed_generic.h0000664000175000017500000002024614010707315023223 0ustar builderbuilder/* Copyright (C) 2007-2009 Xiph.Org Foundation Copyright (C) 2003-2008 Jean-Marc Valin Copyright (C) 2007-2008 CSIRO */ /** @file fixed_generic.h @brief Generic fixed-point operations */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef FIXED_GENERIC_H #define FIXED_GENERIC_H /** Multiply a 16-bit signed value by a 16-bit unsigned value. The result is a 32-bit signed value */ #define MULT16_16SU(a,b) ((celt_word32)(celt_word16)(a)*(celt_word32)(celt_uint16)(b)) /** 16x32 multiplication, followed by a 16-bit shift right. Results fits in 32 bits */ #define MULT16_32_Q16(a,b) ADD32(MULT16_16((a),SHR((b),16)), SHR(MULT16_16SU((a),((b)&0x0000ffff)),16)) /** 16x32 multiplication, followed by a 15-bit shift right. Results fits in 32 bits */ #define MULT16_32_Q15(a,b) ADD32(SHL(MULT16_16((a),SHR((b),16)),1), SHR(MULT16_16SU((a),((b)&0x0000ffff)),15)) /** 32x32 multiplication, followed by a 31-bit shift right. Results fits in 32 bits */ #define MULT32_32_Q31(a,b) ADD32(ADD32(SHL(MULT16_16(SHR((a),16),SHR((b),16)),1), SHR(MULT16_16SU(SHR((a),16),((b)&0x0000ffff)),15)), SHR(MULT16_16SU(SHR((b),16),((a)&0x0000ffff)),15)) /** 32x32 multiplication, followed by a 32-bit shift right. Results fits in 32 bits */ #define MULT32_32_Q32(a,b) ADD32(ADD32(MULT16_16(SHR((a),16),SHR((b),16)), SHR(MULT16_16SU(SHR((a),16),((b)&0x0000ffff)),16)), SHR(MULT16_16SU(SHR((b),16),((a)&0x0000ffff)),16)) /** Compile-time conversion of float constant to 16-bit value */ #define QCONST16(x,bits) ((celt_word16)(.5+(x)*(((celt_word32)1)<<(bits)))) /** Compile-time conversion of float constant to 32-bit value */ #define QCONST32(x,bits) ((celt_word32)(.5+(x)*(((celt_word32)1)<<(bits)))) /** Negate a 16-bit value */ #define NEG16(x) (-(x)) /** Negate a 32-bit value */ #define NEG32(x) (-(x)) /** Change a 32-bit value into a 16-bit value. The value is assumed to fit in 16-bit, otherwise the result is undefined */ #define EXTRACT16(x) ((celt_word16)(x)) /** Change a 16-bit value into a 32-bit value */ #define EXTEND32(x) ((celt_word32)(x)) /** Arithmetic shift-right of a 16-bit value */ #define SHR16(a,shift) ((a) >> (shift)) /** Arithmetic shift-left of a 16-bit value */ #define SHL16(a,shift) ((a) << (shift)) /** Arithmetic shift-right of a 32-bit value */ #define SHR32(a,shift) ((a) >> (shift)) /** Arithmetic shift-left of a 32-bit value */ #define SHL32(a,shift) ((celt_word32)(a) << (shift)) /** 16-bit arithmetic shift right with rounding-to-nearest instead of rounding down */ #define PSHR16(a,shift) (SHR16((a)+((1<<((shift))>>1)),shift)) /** 32-bit arithmetic shift right with rounding-to-nearest instead of rounding down */ #define PSHR32(a,shift) (SHR32((a)+((EXTEND32(1)<<((shift))>>1)),shift)) /** 32-bit arithmetic shift right where the argument can be negative */ #define VSHR32(a, shift) (((shift)>0) ? SHR32(a, shift) : SHL32(a, -(shift))) /** Saturates 16-bit value to +/- a */ #define SATURATE16(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) /** Saturates 32-bit value to +/- a */ #define SATURATE32(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) /** "RAW" macros, should not be used outside of this header file */ #define SHR(a,shift) ((a) >> (shift)) #define SHL(a,shift) ((celt_word32)(a) << (shift)) #define PSHR(a,shift) (SHR((a)+((EXTEND32(1)<<((shift))>>1)),shift)) #define SATURATE(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) /** Shift by a and round-to-neareast 32-bit value. Result is a 16-bit value */ #define ROUND16(x,a) (EXTRACT16(PSHR32((x),(a)))) /** Divide by two */ #define HALF32(x) (SHR32(x,1)) /** Add two 16-bit values */ #define ADD16(a,b) ((celt_word16)((celt_word16)(a)+(celt_word16)(b))) /** Subtract two 16-bit values */ #define SUB16(a,b) ((celt_word16)(a)-(celt_word16)(b)) /** Add two 32-bit values */ #define ADD32(a,b) ((celt_word32)(a)+(celt_word32)(b)) /** Subtract two 32-bit values */ #define SUB32(a,b) ((celt_word32)(a)-(celt_word32)(b)) /** 16x16 multiplication where the result fits in 16 bits */ #define MULT16_16_16(a,b) ((((celt_word16)(a))*((celt_word16)(b)))) /* (celt_word32)(celt_word16) gives TI compiler a hint that it's 16x16->32 multiply */ /** 16x16 multiplication where the result fits in 32 bits */ #define MULT16_16(a,b) (((celt_word32)(celt_word16)(a))*((celt_word32)(celt_word16)(b))) /** 16x16 multiply-add where the result fits in 32 bits */ #define MAC16_16(c,a,b) (ADD32((c),MULT16_16((a),(b)))) /** 16x32 multiplication, followed by a 12-bit shift right. Results fits in 32 bits */ #define MULT16_32_Q12(a,b) ADD32(MULT16_16((a),SHR((b),12)), SHR(MULT16_16((a),((b)&0x00000fff)),12)) /** 16x32 multiplication, followed by a 13-bit shift right. Results fits in 32 bits */ #define MULT16_32_Q13(a,b) ADD32(MULT16_16((a),SHR((b),13)), SHR(MULT16_16((a),((b)&0x00001fff)),13)) /** 16x32 multiplication, followed by a 14-bit shift right. Results fits in 32 bits */ #define MULT16_32_Q14(a,b) ADD32(MULT16_16((a),SHR((b),14)), SHR(MULT16_16((a),((b)&0x00003fff)),14)) /** 16x32 multiplication, followed by an 11-bit shift right. Results fits in 32 bits */ #define MULT16_32_Q11(a,b) ADD32(MULT16_16((a),SHR((b),11)), SHR(MULT16_16((a),((b)&0x000007ff)),11)) /** 16x32 multiply-add, followed by an 11-bit shift right. Results fits in 32 bits */ #define MAC16_32_Q11(c,a,b) ADD32(c,ADD32(MULT16_16((a),SHR((b),11)), SHR(MULT16_16((a),((b)&0x000007ff)),11))) /** 16x32 multiplication, followed by a 15-bit shift right (round-to-nearest). Results fits in 32 bits */ #define MULT16_32_P15(a,b) ADD32(MULT16_16((a),SHR((b),15)), PSHR(MULT16_16((a),((b)&0x00007fff)),15)) /** 16x32 multiply-add, followed by a 15-bit shift right. Results fits in 32 bits */ #define MAC16_32_Q15(c,a,b) ADD32(c,ADD32(MULT16_16((a),SHR((b),15)), SHR(MULT16_16((a),((b)&0x00007fff)),15))) #define MAC16_16_Q11(c,a,b) (ADD32((c),SHR(MULT16_16((a),(b)),11))) #define MAC16_16_Q13(c,a,b) (ADD32((c),SHR(MULT16_16((a),(b)),13))) #define MAC16_16_P13(c,a,b) (ADD32((c),SHR(ADD32(4096,MULT16_16((a),(b))),13))) #define MULT16_16_Q11_32(a,b) (SHR(MULT16_16((a),(b)),11)) #define MULT16_16_Q13(a,b) (SHR(MULT16_16((a),(b)),13)) #define MULT16_16_Q14(a,b) (SHR(MULT16_16((a),(b)),14)) #define MULT16_16_Q15(a,b) (SHR(MULT16_16((a),(b)),15)) #define MULT16_16_P13(a,b) (SHR(ADD32(4096,MULT16_16((a),(b))),13)) #define MULT16_16_P14(a,b) (SHR(ADD32(8192,MULT16_16((a),(b))),14)) #define MULT16_16_P15(a,b) (SHR(ADD32(16384,MULT16_16((a),(b))),15)) /** Divide a 32-bit value by a 16-bit value. Result fits in 16 bits */ #define DIV32_16(a,b) ((celt_word16)(((celt_word32)(a))/((celt_word16)(b)))) /** Divide a 32-bit value by a 16-bit value and round to nearest. Result fits in 16 bits */ #define PDIV32_16(a,b) ((celt_word16)(((celt_word32)(a)+((celt_word16)(b)>>1))/((celt_word16)(b)))) /** Divide a 32-bit value by a 32-bit value. Result fits in 32 bits */ #define DIV32(a,b) (((celt_word32)(a))/((celt_word32)(b))) /** Divide a 32-bit value by a 32-bit value and round to nearest. Result fits in 32 bits */ #define PDIV32(a,b) (((celt_word32)(a)+((celt_word16)(b)>>1))/((celt_word32)(b))) #endif mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/kiss_fft.c0000664000175000017500000004751214010707315022240 0ustar builderbuilder/* Copyright (c) 2003-2004, Mark Borgerding Lots of modifications by Jean-Marc Valin Copyright (c) 2005-2007, Xiph.Org Foundation Copyright (c) 2008, Xiph.Org Foundation, CSIRO All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef SKIP_CONFIG_H # ifdef HAVE_CONFIG_H # include "config.h" # endif #endif #include "_kiss_fft_guts.h" #include "arch.h" #include "os_support.h" #include "mathops.h" #include "stack_alloc.h" /* The guts header contains all the multiplication and addition macros that are defined for complex numbers. It also delares the kf_ internal functions. */ static void kf_bfly2( kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_state *st, int m, int N, int mm ) { kiss_fft_cpx * Fout2; const kiss_twiddle_cpx * tw1; int i,j; kiss_fft_cpx * Fout_beg = Fout; for (i=0;itwiddles; for(j=0;jr = SHR(Fout->r, 1);Fout->i = SHR(Fout->i, 1); Fout2->r = SHR(Fout2->r, 1);Fout2->i = SHR(Fout2->i, 1); C_MUL (t, *Fout2 , *tw1); tw1 += fstride; C_SUB( *Fout2 , *Fout , t ); C_ADDTO( *Fout , t ); ++Fout2; ++Fout; } } } static void ki_bfly2( kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_state *st, int m, int N, int mm ) { kiss_fft_cpx * Fout2; const kiss_twiddle_cpx * tw1; kiss_fft_cpx t; int i,j; kiss_fft_cpx * Fout_beg = Fout; for (i=0;itwiddles; for(j=0;jtwiddles; for (j=0;jr = PSHR(Fout->r, 2); Fout->i = PSHR(Fout->i, 2); C_SUB( scratch[5] , *Fout, scratch[1] ); C_ADDTO(*Fout, scratch[1]); C_ADD( scratch[3] , scratch[0] , scratch[2] ); C_SUB( scratch[4] , scratch[0] , scratch[2] ); Fout[m2].r = PSHR(Fout[m2].r, 2); Fout[m2].i = PSHR(Fout[m2].i, 2); C_SUB( Fout[m2], *Fout, scratch[3] ); tw1 += fstride; tw2 += fstride*2; tw3 += fstride*3; C_ADDTO( *Fout , scratch[3] ); Fout[m].r = scratch[5].r + scratch[4].i; Fout[m].i = scratch[5].i - scratch[4].r; Fout[m3].r = scratch[5].r - scratch[4].i; Fout[m3].i = scratch[5].i + scratch[4].r; ++Fout; } } } static void ki_bfly4( kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_state *st, int m, int N, int mm ) { const kiss_twiddle_cpx *tw1,*tw2,*tw3; kiss_fft_cpx scratch[6]; const size_t m2=2*m; const size_t m3=3*m; int i, j; kiss_fft_cpx * Fout_beg = Fout; for (i=0;itwiddles; for (j=0;jtwiddles[fstride*m]; for (i=0;itwiddles; k=m; do { C_FIXDIV(*Fout,3); C_FIXDIV(Fout[m],3); C_FIXDIV(Fout[m2],3); C_MUL(scratch[1],Fout[m] , *tw1); C_MUL(scratch[2],Fout[m2] , *tw2); C_ADD(scratch[3],scratch[1],scratch[2]); C_SUB(scratch[0],scratch[1],scratch[2]); tw1 += fstride; tw2 += fstride*2; Fout[m].r = Fout->r - HALF_OF(scratch[3].r); Fout[m].i = Fout->i - HALF_OF(scratch[3].i); C_MULBYSCALAR( scratch[0] , epi3.i ); C_ADDTO(*Fout,scratch[3]); Fout[m2].r = Fout[m].r + scratch[0].i; Fout[m2].i = Fout[m].i - scratch[0].r; Fout[m].r -= scratch[0].i; Fout[m].i += scratch[0].r; ++Fout; } while(--k); } } static void ki_bfly3( kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_state *st, size_t m, int N, int mm ) { size_t i, k; const size_t m2 = 2*m; const kiss_twiddle_cpx *tw1,*tw2; kiss_fft_cpx scratch[5]; kiss_twiddle_cpx epi3; kiss_fft_cpx * Fout_beg = Fout; epi3 = st->twiddles[fstride*m]; for (i=0;itwiddles; k=m; do{ C_MULC(scratch[1],Fout[m] , *tw1); C_MULC(scratch[2],Fout[m2] , *tw2); C_ADD(scratch[3],scratch[1],scratch[2]); C_SUB(scratch[0],scratch[1],scratch[2]); tw1 += fstride; tw2 += fstride*2; Fout[m].r = Fout->r - HALF_OF(scratch[3].r); Fout[m].i = Fout->i - HALF_OF(scratch[3].i); C_MULBYSCALAR( scratch[0] , -epi3.i ); C_ADDTO(*Fout,scratch[3]); Fout[m2].r = Fout[m].r + scratch[0].i; Fout[m2].i = Fout[m].i - scratch[0].r; Fout[m].r -= scratch[0].i; Fout[m].i += scratch[0].r; ++Fout; }while(--k); } } static void kf_bfly5( kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_state *st, int m, int N, int mm ) { kiss_fft_cpx *Fout0,*Fout1,*Fout2,*Fout3,*Fout4; int i, u; kiss_fft_cpx scratch[13]; const kiss_twiddle_cpx * twiddles = st->twiddles; const kiss_twiddle_cpx *tw; kiss_twiddle_cpx ya,yb; kiss_fft_cpx * Fout_beg = Fout; ya = twiddles[fstride*m]; yb = twiddles[fstride*2*m]; tw=st->twiddles; for (i=0;ir += scratch[7].r + scratch[8].r; Fout0->i += scratch[7].i + scratch[8].i; scratch[5].r = scratch[0].r + S_MUL(scratch[7].r,ya.r) + S_MUL(scratch[8].r,yb.r); scratch[5].i = scratch[0].i + S_MUL(scratch[7].i,ya.r) + S_MUL(scratch[8].i,yb.r); scratch[6].r = S_MUL(scratch[10].i,ya.i) + S_MUL(scratch[9].i,yb.i); scratch[6].i = -S_MUL(scratch[10].r,ya.i) - S_MUL(scratch[9].r,yb.i); C_SUB(*Fout1,scratch[5],scratch[6]); C_ADD(*Fout4,scratch[5],scratch[6]); scratch[11].r = scratch[0].r + S_MUL(scratch[7].r,yb.r) + S_MUL(scratch[8].r,ya.r); scratch[11].i = scratch[0].i + S_MUL(scratch[7].i,yb.r) + S_MUL(scratch[8].i,ya.r); scratch[12].r = - S_MUL(scratch[10].i,yb.i) + S_MUL(scratch[9].i,ya.i); scratch[12].i = S_MUL(scratch[10].r,yb.i) - S_MUL(scratch[9].r,ya.i); C_ADD(*Fout2,scratch[11],scratch[12]); C_SUB(*Fout3,scratch[11],scratch[12]); ++Fout0;++Fout1;++Fout2;++Fout3;++Fout4; } } } static void ki_bfly5( kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_state *st, int m, int N, int mm ) { kiss_fft_cpx *Fout0,*Fout1,*Fout2,*Fout3,*Fout4; int i, u; kiss_fft_cpx scratch[13]; const kiss_twiddle_cpx * twiddles = st->twiddles; const kiss_twiddle_cpx *tw; kiss_twiddle_cpx ya,yb; kiss_fft_cpx * Fout_beg = Fout; ya = twiddles[fstride*m]; yb = twiddles[fstride*2*m]; tw=st->twiddles; for (i=0;ir += scratch[7].r + scratch[8].r; Fout0->i += scratch[7].i + scratch[8].i; scratch[5].r = scratch[0].r + S_MUL(scratch[7].r,ya.r) + S_MUL(scratch[8].r,yb.r); scratch[5].i = scratch[0].i + S_MUL(scratch[7].i,ya.r) + S_MUL(scratch[8].i,yb.r); scratch[6].r = -S_MUL(scratch[10].i,ya.i) - S_MUL(scratch[9].i,yb.i); scratch[6].i = S_MUL(scratch[10].r,ya.i) + S_MUL(scratch[9].r,yb.i); C_SUB(*Fout1,scratch[5],scratch[6]); C_ADD(*Fout4,scratch[5],scratch[6]); scratch[11].r = scratch[0].r + S_MUL(scratch[7].r,yb.r) + S_MUL(scratch[8].r,ya.r); scratch[11].i = scratch[0].i + S_MUL(scratch[7].i,yb.r) + S_MUL(scratch[8].i,ya.r); scratch[12].r = S_MUL(scratch[10].i,yb.i) - S_MUL(scratch[9].i,ya.i); scratch[12].i = -S_MUL(scratch[10].r,yb.i) + S_MUL(scratch[9].r,ya.i); C_ADD(*Fout2,scratch[11],scratch[12]); C_SUB(*Fout3,scratch[11],scratch[12]); ++Fout0;++Fout1;++Fout2;++Fout3;++Fout4; } } } #endif static void kf_work( kiss_fft_cpx * Fout, const kiss_fft_cpx * f, size_t fstride, int in_stride, const celt_int16 * factors, const kiss_fft_state *st, int N, int m2 ) { const int p=*factors++; /* the radix */ const int m=*factors++; /* stage's fft length/p */ /*printf ("fft %d %d %d %d %d %d %d\n", p*m, m, p, s2, fstride*in_stride, N, m2);*/ if (m!=1) kf_work( Fout , f, fstride*p, in_stride, factors,st, N*p, m); /* Compensate for longer twiddles table (when sharing) */ if (st->shift>0) fstride <<= st->shift; switch (p) { case 2: kf_bfly2(Fout,fstride,st,m, N, m2); break; case 4: kf_bfly4(Fout,fstride,st,m, N, m2); break; #ifndef RADIX_TWO_ONLY case 3: kf_bfly3(Fout,fstride,st,m, N, m2); break; case 5: kf_bfly5(Fout,fstride,st,m, N, m2); break; #endif } } static void ki_work( kiss_fft_cpx * Fout, const kiss_fft_cpx * f, size_t fstride, int in_stride, const celt_int16 * factors, const kiss_fft_state *st, int N, int m2 ) { const int p=*factors++; /* the radix */ const int m=*factors++; /* stage's fft length/p */ /*printf ("fft %d %d %d %d %d %d %d\n", p*m, m, p, s2, fstride*in_stride, N, m2);*/ if (m!=1) ki_work( Fout , f, fstride*p, in_stride, factors,st, N*p, m); /* Compensate for longer twiddles table (when sharing) */ if (st->shift>0) fstride <<= st->shift; switch (p) { case 2: ki_bfly2(Fout,fstride,st,m, N, m2); break; case 4: ki_bfly4(Fout,fstride,st,m, N, m2); break; #ifndef RADIX_TWO_ONLY case 3: ki_bfly3(Fout,fstride,st,m, N, m2); break; case 5: ki_bfly5(Fout,fstride,st,m, N, m2); break; #endif } } #ifdef CUSTOM_MODES static void compute_bitrev_table( int Fout, celt_int16 *f, const size_t fstride, int in_stride, celt_int16 * factors, const kiss_fft_state *st ) { const int p=*factors++; /* the radix */ const int m=*factors++; /* stage's fft length/p */ /*printf ("fft %d %d %d %d %d %d\n", p*m, m, p, s2, fstride*in_stride, N);*/ if (m==1) { int j; for (j=0;j32000 || (celt_int32)p*(celt_int32)p > n) p = n; /* no more factors, skip to end */ } n /= p; #ifdef RADIX_TWO_ONLY if (p!=2 && p != 4) #else if (p>5) #endif { return 0; } *facbuf++ = p; *facbuf++ = n; } while (n > 1); return 1; } static void compute_twiddles(kiss_twiddle_cpx *twiddles, int nfft) { int i; #ifdef FIXED_POINT for (i=0;i= memneeded) st = (kiss_fft_state*)mem; *lenmem = memneeded; } if (st) { celt_int16 *bitrev; kiss_twiddle_cpx *twiddles; st->nfft=nfft; #ifndef FIXED_POINT st->scale = 1./nfft; #endif if (base != NULL) { st->twiddles = base->twiddles; st->shift = 0; while (nfft<shift != base->nfft && st->shift < 32) st->shift++; /* FIXME: Report error and do proper cleanup */ if (st->shift>=32) return NULL; } else { st->twiddles = twiddles = (kiss_twiddle_cpx*)KISS_FFT_MALLOC(sizeof(kiss_twiddle_cpx)*nfft); compute_twiddles(twiddles, nfft); st->shift = -1; } if (!kf_factor(nfft,st->factors)) { kiss_fft_free(st); return NULL; } /* bitrev */ st->bitrev = bitrev = (celt_int16*)KISS_FFT_MALLOC(sizeof(celt_int16)*nfft); compute_bitrev_table(0, bitrev, 1,1, st->factors,st); } return st; } kiss_fft_state *kiss_fft_alloc(int nfft,void * mem,size_t * lenmem ) { return kiss_fft_alloc_twiddles(nfft, mem, lenmem, NULL); } void kiss_fft_free(const kiss_fft_state *cfg) { celt_free((celt_int16*)cfg->bitrev); if (cfg->shift < 0) celt_free((kiss_twiddle_cpx*)cfg->twiddles); celt_free((kiss_fft_state*)cfg); } #endif /* CUSTOM_MODES */ static void kiss_fft_stride(const kiss_fft_state *st,const kiss_fft_cpx *fin,kiss_fft_cpx *fout,int in_stride) { int i; celt_assert2 (fin != fout, "In-place FFT not supported"); /* Bit-reverse the input */ for (i=0;infft;i++) { fout[st->bitrev[i]] = fin[i]; #ifndef FIXED_POINT fout[st->bitrev[i]].r *= st->scale; fout[st->bitrev[i]].i *= st->scale; #endif } kf_work( fout, fin, 1,in_stride, st->factors,st, 1, 1); } void kiss_fft(const kiss_fft_state *cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout) { kiss_fft_stride(cfg,fin,fout,1); } static void kiss_ifft_stride(const kiss_fft_state *st,const kiss_fft_cpx *fin,kiss_fft_cpx *fout,int in_stride) { int i; celt_assert2 (fin != fout, "In-place FFT not supported"); /* Bit-reverse the input */ for (i=0;infft;i++) fout[st->bitrev[i]] = fin[i]; ki_work( fout, fin, 1,in_stride, st->factors,st, 1, 1); } void kiss_ifft(const kiss_fft_state *cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout) { kiss_ifft_stride(cfg,fin,fout,1); } mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/quant_bands.c0000664000175000017500000004415614010707315022730 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "quant_bands.h" #include "laplace.h" #include #include "os_support.h" #include "arch.h" #include "mathops.h" #include "stack_alloc.h" #include "rate.h" #ifdef FIXED_POINT /* Mean energy in each band quantized in Q6 */ static const signed char eMeans[25] = { 103,100, 92, 85, 81, 77, 72, 70, 78, 75, 73, 71, 78, 74, 69, 72, 70, 74, 76, 71, 60, 60, 60, 60, 60 }; #else /* Mean energy in each band quantized in Q6 and converted back to float */ static const celt_word16 eMeans[25] = { 6.437500f, 6.250000f, 5.750000f, 5.312500f, 5.062500f, 4.812500f, 4.500000f, 4.375000f, 4.875000f, 4.687500f, 4.562500f, 4.437500f, 4.875000f, 4.625000f, 4.312500f, 4.500000f, 4.375000f, 4.625000f, 4.750000f, 4.437500f, 3.750000f, 3.750000f, 3.750000f, 3.750000f, 3.750000f }; #endif /* prediction coefficients: 0.9, 0.8, 0.65, 0.5 */ #ifdef FIXED_POINT static const celt_word16 pred_coef[4] = {29440, 26112, 21248, 16384}; static const celt_word16 beta_coef[4] = {30147, 22282, 12124, 6554}; static const celt_word16 beta_intra = 4915; #else static const celt_word16 pred_coef[4] = {29440/32768., 26112/32768., 21248/32768., 16384/32768.}; static const celt_word16 beta_coef[4] = {30147/32768., 22282/32768., 12124/32768., 6554/32768.}; static const celt_word16 beta_intra = 4915/32768.; #endif /*Parameters of the Laplace-like probability models used for the coarse energy. There is one pair of parameters for each frame size, prediction type (inter/intra), and band number. The first number of each pair is the probability of 0, and the second is the decay rate, both in Q8 precision.*/ static const unsigned char e_prob_model[4][2][42] = { /*120 sample frames.*/ { /*Inter*/ { 72, 127, 65, 129, 66, 128, 65, 128, 64, 128, 62, 128, 64, 128, 64, 128, 92, 78, 92, 79, 92, 78, 90, 79, 116, 41, 115, 40, 114, 40, 132, 26, 132, 26, 145, 17, 161, 12, 176, 10, 177, 11 }, /*Intra*/ { 24, 179, 48, 138, 54, 135, 54, 132, 53, 134, 56, 133, 55, 132, 55, 132, 61, 114, 70, 96, 74, 88, 75, 88, 87, 74, 89, 66, 91, 67, 100, 59, 108, 50, 120, 40, 122, 37, 97, 43, 78, 50 } }, /*240 sample frames.*/ { /*Inter*/ { 83, 78, 84, 81, 88, 75, 86, 74, 87, 71, 90, 73, 93, 74, 93, 74, 109, 40, 114, 36, 117, 34, 117, 34, 143, 17, 145, 18, 146, 19, 162, 12, 165, 10, 178, 7, 189, 6, 190, 8, 177, 9 }, /*Intra*/ { 23, 178, 54, 115, 63, 102, 66, 98, 69, 99, 74, 89, 71, 91, 73, 91, 78, 89, 86, 80, 92, 66, 93, 64, 102, 59, 103, 60, 104, 60, 117, 52, 123, 44, 138, 35, 133, 31, 97, 38, 77, 45 } }, /*480 sample frames.*/ { /*Inter*/ { 61, 90, 93, 60, 105, 42, 107, 41, 110, 45, 116, 38, 113, 38, 112, 38, 124, 26, 132, 27, 136, 19, 140, 20, 155, 14, 159, 16, 158, 18, 170, 13, 177, 10, 187, 8, 192, 6, 175, 9, 159, 10 }, /*Intra*/ { 21, 178, 59, 110, 71, 86, 75, 85, 84, 83, 91, 66, 88, 73, 87, 72, 92, 75, 98, 72, 105, 58, 107, 54, 115, 52, 114, 55, 112, 56, 129, 51, 132, 40, 150, 33, 140, 29, 98, 35, 77, 42 } }, /*960 sample frames.*/ { /*Inter*/ { 42, 121, 96, 66, 108, 43, 111, 40, 117, 44, 123, 32, 120, 36, 119, 33, 127, 33, 134, 34, 139, 21, 147, 23, 152, 20, 158, 25, 154, 26, 166, 21, 173, 16, 184, 13, 184, 10, 150, 13, 139, 15 }, /*Intra*/ { 22, 178, 63, 114, 74, 82, 84, 83, 92, 82, 103, 62, 96, 72, 96, 67, 101, 73, 107, 72, 113, 55, 118, 52, 125, 52, 118, 52, 117, 55, 135, 49, 137, 39, 157, 32, 145, 29, 97, 33, 77, 40 } } }; static const unsigned char small_energy_icdf[3]={2,1,0}; static int intra_decision(const celt_word16 *eBands, celt_word16 *oldEBands, int start, int end, int len, int C) { int c, i; celt_word32 dist = 0; c=0; do { for (i=start;i 2*C*(end-start); } static int quant_coarse_energy_impl(const CELTMode *m, int start, int end, const celt_word16 *eBands, celt_word16 *oldEBands, ec_int32 budget, ec_int32 tell, const unsigned char *prob_model, celt_word16 *error, ec_enc *enc, int _C, int LM, int intra, celt_word16 max_decay) { const int C = CHANNELS(_C); int i, c; int badness = 0; celt_word32 prev[2] = {0,0}; celt_word16 coef; celt_word16 beta; if (tell+3 <= budget) ec_enc_bit_logp(enc, intra, 3); if (intra) { coef = 0; beta = beta_intra; } else { beta = beta_coef[LM]; coef = pred_coef[LM]; } /* Encode at a fixed coarse resolution */ for (i=start;inbEBands]; oldE = MAX16(-QCONST16(9.f,DB_SHIFT), oldEBands[i+c*m->nbEBands]); #ifdef FIXED_POINT f = SHL32(EXTEND32(x),7) - PSHR32(MULT16_16(coef,oldE), 8) - prev[c]; /* Rounding to nearest integer here is really important! */ qi = (f+QCONST32(.5f,DB_SHIFT+7))>>(DB_SHIFT+7); decay_bound = EXTRACT16(MAX32(-QCONST16(28.f,DB_SHIFT), SUB32((celt_word32)oldEBands[i+c*m->nbEBands],max_decay))); #else f = x-coef*oldE-prev[c]; /* Rounding to nearest integer here is really important! */ qi = (int)floor(.5f+f); decay_bound = MAX16(-QCONST16(28.f,DB_SHIFT), oldEBands[i+c*m->nbEBands]) - max_decay; #endif /* Prevent the energy from going down too quickly (e.g. for bands that have just one bin) */ if (qi < 0 && x < decay_bound) { qi += (int)SHR16(SUB16(decay_bound,x), DB_SHIFT); if (qi > 0) qi = 0; } qi0 = qi; /* If we don't have enough bits to encode all the energy, just assume something safe. */ tell = ec_tell(enc); bits_left = budget-tell-3*C*(end-i); if (i!=start && bits_left < 30) { if (bits_left < 24) qi = IMIN(1, qi); if (bits_left < 16) qi = IMAX(-1, qi); } if (budget-tell >= 15) { int pi; pi = 2*IMIN(i,20); ec_laplace_encode(enc, &qi, prob_model[pi]<<7, prob_model[pi+1]<<6); } else if(budget-tell >= 2) { qi = IMAX(-1, IMIN(qi, 1)); ec_enc_icdf(enc, 2*qi^-(qi<0), small_energy_icdf, 2); } else if(budget-tell >= 1) { qi = IMIN(0, qi); ec_enc_bit_logp(enc, -qi, 1); } else qi = -1; error[i+c*m->nbEBands] = PSHR32(f,7) - SHL16(qi,DB_SHIFT); badness += abs(qi0-qi); q = SHL32(EXTEND32(qi),DB_SHIFT); tmp = PSHR32(MULT16_16(coef,oldE),8) + prev[c] + SHL32(q,7); #ifdef FIXED_POINT tmp = MAX32(-QCONST32(28.f, DB_SHIFT+7), tmp); #endif oldEBands[i+c*m->nbEBands] = PSHR32(tmp, 7); prev[c] = prev[c] + SHL32(q,7) - MULT16_16(beta,PSHR32(q,8)); } while (++c < C); } return badness; } void quant_coarse_energy(const CELTMode *m, int start, int end, int effEnd, const celt_word16 *eBands, celt_word16 *oldEBands, ec_uint32 budget, celt_word16 *error, ec_enc *enc, int _C, int LM, int nbAvailableBytes, int force_intra, int *delayedIntra, int two_pass) { const int C = CHANNELS(_C); int intra; celt_word16 max_decay; VARDECL(celt_word16, oldEBands_intra); VARDECL(celt_word16, error_intra); ec_enc enc_start_state; ec_uint32 tell; int badness1=0; SAVE_STACK; intra = force_intra || (*delayedIntra && nbAvailableBytes > (end-start)*C); if (/*shortBlocks || */intra_decision(eBands, oldEBands, start, effEnd, m->nbEBands, C)) *delayedIntra = 1; else *delayedIntra = 0; tell = ec_tell(enc); if (tell+3 > budget) two_pass = intra = 0; /* Encode the global flags using a simple probability model (first symbols in the stream) */ #ifdef FIXED_POINT max_decay = MIN32(QCONST16(16.f,DB_SHIFT), SHL32(EXTEND32(nbAvailableBytes),DB_SHIFT-3)); #else max_decay = MIN32(16.f, .125f*nbAvailableBytes); #endif enc_start_state = *enc; ALLOC(oldEBands_intra, C*m->nbEBands, celt_word16); ALLOC(error_intra, C*m->nbEBands, celt_word16); CELT_COPY(oldEBands_intra, oldEBands, C*m->nbEBands); if (two_pass || intra) { badness1 = quant_coarse_energy_impl(m, start, end, eBands, oldEBands_intra, budget, tell, e_prob_model[LM][1], error_intra, enc, C, LM, 1, max_decay); } if (!intra) { ec_enc enc_intra_state; int tell_intra; ec_uint32 nstart_bytes; ec_uint32 nintra_bytes; int badness2; VARDECL(unsigned char, intra_bits); tell_intra = ec_tell_frac(enc); enc_intra_state = *enc; nstart_bytes = ec_range_bytes(&enc_start_state); nintra_bytes = ec_range_bytes(&enc_intra_state); ALLOC(intra_bits, nintra_bytes-nstart_bytes, unsigned char); /* Copy bits from intra bit-stream */ CELT_COPY(intra_bits, ec_get_buffer(&enc_intra_state) + nstart_bytes, nintra_bytes - nstart_bytes); *enc = enc_start_state; badness2 = quant_coarse_energy_impl(m, start, end, eBands, oldEBands, budget, tell, e_prob_model[LM][intra], error, enc, C, LM, 0, max_decay); if (two_pass && (badness1 < badness2 || (badness1 == badness2 && ec_tell_frac(enc) > tell_intra))) { *enc = enc_intra_state; /* Copy intra bits to bit-stream */ CELT_COPY(ec_get_buffer(&enc_intra_state) + nstart_bytes, intra_bits, nintra_bytes - nstart_bytes); CELT_COPY(oldEBands, oldEBands_intra, C*m->nbEBands); CELT_COPY(error, error_intra, C*m->nbEBands); } } else { CELT_COPY(oldEBands, oldEBands_intra, C*m->nbEBands); CELT_COPY(error, error_intra, C*m->nbEBands); } RESTORE_STACK; } void quant_fine_energy(const CELTMode *m, int start, int end, celt_word16 *oldEBands, celt_word16 *error, int *fine_quant, ec_enc *enc, int _C) { int i, c; const int C = CHANNELS(_C); /* Encode finer resolution */ for (i=start;inbEBands]+QCONST16(.5f,DB_SHIFT))>>(DB_SHIFT-fine_quant[i]); #else q2 = (int)floor((error[i+c*m->nbEBands]+.5f)*frac); #endif if (q2 > frac-1) q2 = frac-1; if (q2<0) q2 = 0; ec_enc_bits(enc, q2, fine_quant[i]); #ifdef FIXED_POINT offset = SUB16(SHR32(SHL32(EXTEND32(q2),DB_SHIFT)+QCONST16(.5f,DB_SHIFT),fine_quant[i]),QCONST16(.5f,DB_SHIFT)); #else offset = (q2+.5f)*(1<<(14-fine_quant[i]))*(1.f/16384) - .5f; #endif oldEBands[i+c*m->nbEBands] += offset; error[i+c*m->nbEBands] -= offset; /*printf ("%f ", error[i] - offset);*/ } while (++c < C); } } void quant_energy_finalise(const CELTMode *m, int start, int end, celt_word16 *oldEBands, celt_word16 *error, int *fine_quant, int *fine_priority, int bits_left, ec_enc *enc, int _C) { int i, prio, c; const int C = CHANNELS(_C); /* Use up the remaining bits */ for (prio=0;prio<2;prio++) { for (i=start;i=C ;i++) { if (fine_quant[i] >= MAX_FINE_BITS || fine_priority[i]!=prio) continue; c=0; do { int q2; celt_word16 offset; q2 = error[i+c*m->nbEBands]<0 ? 0 : 1; ec_enc_bits(enc, q2, 1); #ifdef FIXED_POINT offset = SHR16(SHL16(q2,DB_SHIFT)-QCONST16(.5f,DB_SHIFT),fine_quant[i]+1); #else offset = (q2-.5f)*(1<<(14-fine_quant[i]-1))*(1.f/16384); #endif oldEBands[i+c*m->nbEBands] += offset; bits_left--; } while (++c < C); } } } void unquant_coarse_energy(const CELTMode *m, int start, int end, celt_word16 *oldEBands, int intra, ec_dec *dec, int _C, int LM) { const unsigned char *prob_model = e_prob_model[LM][intra]; int i, c; celt_word32 prev[2] = {0, 0}; celt_word16 coef; celt_word16 beta; const int C = CHANNELS(_C); ec_int32 budget; ec_int32 tell; if (intra) { coef = 0; beta = beta_intra; } else { beta = beta_coef[LM]; coef = pred_coef[LM]; } budget = dec->storage*8; /* Decode at a fixed coarse resolution */ for (i=start;i=15) { int pi; pi = 2*IMIN(i,20); qi = ec_laplace_decode(dec, prob_model[pi]<<7, prob_model[pi+1]<<6); } else if(budget-tell>=2) { qi = ec_dec_icdf(dec, small_energy_icdf, 2); qi = (qi>>1)^-(qi&1); } else if(budget-tell>=1) { qi = -ec_dec_bit_logp(dec, 1); } else qi = -1; q = SHL32(EXTEND32(qi),DB_SHIFT); oldEBands[i+c*m->nbEBands] = MAX16(-QCONST16(9.f,DB_SHIFT), oldEBands[i+c*m->nbEBands]); tmp = PSHR32(MULT16_16(coef,oldEBands[i+c*m->nbEBands]),8) + prev[c] + SHL32(q,7); #ifdef FIXED_POINT tmp = MAX32(-QCONST32(28.f, DB_SHIFT+7), tmp); #endif oldEBands[i+c*m->nbEBands] = PSHR32(tmp, 7); prev[c] = prev[c] + SHL32(q,7) - MULT16_16(beta,PSHR32(q,8)); } while (++c < C); } } void unquant_fine_energy(const CELTMode *m, int start, int end, celt_word16 *oldEBands, int *fine_quant, ec_dec *dec, int _C) { int i, c; const int C = CHANNELS(_C); /* Decode finer resolution */ for (i=start;inbEBands] += offset; } while (++c < C); } } void unquant_energy_finalise(const CELTMode *m, int start, int end, celt_word16 *oldEBands, int *fine_quant, int *fine_priority, int bits_left, ec_dec *dec, int _C) { int i, prio, c; const int C = CHANNELS(_C); /* Use up the remaining bits */ for (prio=0;prio<2;prio++) { for (i=start;i=C ;i++) { if (fine_quant[i] >= MAX_FINE_BITS || fine_priority[i]!=prio) continue; c=0; do { int q2; celt_word16 offset; q2 = ec_dec_bits(dec, 1); #ifdef FIXED_POINT offset = SHR16(SHL16(q2,DB_SHIFT)-QCONST16(.5f,DB_SHIFT),fine_quant[i]+1); #else offset = (q2-.5f)*(1<<(14-fine_quant[i]-1))*(1.f/16384); #endif oldEBands[i+c*m->nbEBands] += offset; bits_left--; } while (++c < C); } } } void log2Amp(const CELTMode *m, int start, int end, celt_ener *eBands, celt_word16 *oldEBands, int _C) { int c, i; const int C = CHANNELS(_C); c=0; do { for (i=0;inbEBands] = 0; for (;inbEBands], SHL16((celt_word16)eMeans[i],6)); eBands[i+c*m->nbEBands] = PSHR32(celt_exp2(lg),4); } for (;inbEBands;i++) eBands[i+c*m->nbEBands] = 0; } while (++c < C); } void amp2Log2(const CELTMode *m, int effEnd, int end, celt_ener *bandE, celt_word16 *bandLogE, int _C) { int c, i; const int C = CHANNELS(_C); c=0; do { for (i=0;inbEBands] = celt_log2(SHL32(bandE[i+c*m->nbEBands],2)) - SHL16((celt_word16)eMeans[i],6); for (i=effEnd;inbEBands+i] = -QCONST16(14.f,DB_SHIFT); } while (++c < C); } mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/rate.c0000664000175000017500000005053214010707315021357 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "modes.h" #include "cwrs.h" #include "arch.h" #include "os_support.h" #include "entcode.h" #include "rate.h" static const unsigned char LOG2_FRAC_TABLE[24]={ 0, 8,13, 16,19,21,23, 24,26,27,28,29,30,31,32, 32,33,34,34,35,36,36,37,37 }; #ifdef CUSTOM_MODES /*Determines if V(N,K) fits in a 32-bit unsigned integer. N and K are themselves limited to 15 bits.*/ static int fits_in32(int _n, int _k) { static const celt_int16 maxN[15] = { 32767, 32767, 32767, 1476, 283, 109, 60, 40, 29, 24, 20, 18, 16, 14, 13}; static const celt_int16 maxK[15] = { 32767, 32767, 32767, 32767, 1172, 238, 95, 53, 36, 27, 22, 18, 16, 15, 13}; if (_n>=14) { if (_k>=14) return 0; else return _n <= maxN[_k]; } else { return _k <= maxK[_n]; } } void compute_pulse_cache(CELTMode *m, int LM) { int C; int i; int j; int curr=0; int nbEntries=0; int entryN[100], entryK[100], entryI[100]; const celt_int16 *eBands = m->eBands; PulseCache *cache = &m->cache; celt_int16 *cindex; unsigned char *bits; unsigned char *cap; cindex = celt_alloc(sizeof(cache->index[0])*m->nbEBands*(LM+2)); cache->index = cindex; /* Scan for all unique band sizes */ for (i=0;i<=LM+1;i++) { for (j=0;jnbEBands;j++) { int k; int N = (eBands[j+1]-eBands[j])<>1; cindex[i*m->nbEBands+j] = -1; /* Find other bands that have the same size */ for (k=0;k<=i;k++) { int n; for (n=0;nnbEBands && (k!=i || n>1) { cindex[i*m->nbEBands+j] = cindex[k*m->nbEBands+n]; break; } } } if (cache->index[i*m->nbEBands+j] == -1 && N!=0) { int K; entryN[nbEntries] = N; K = 0; while (fits_in32(N,get_pulses(K+1)) && KnbEBands+j] = curr; entryI[nbEntries] = curr; curr += K+1; nbEntries++; } } } bits = celt_alloc(sizeof(unsigned char)*curr); cache->bits = bits; cache->size = curr; /* Compute the cache for all unique sizes */ for (i=0;icaps = cap = celt_alloc(sizeof(cache->caps[0])*(LM+1)*2*m->nbEBands); for (i=0;i<=LM;i++) { for (C=1;C<=2;C++) { for (j=0;jnbEBands;j++) { int N0; int max_bits; N0 = m->eBands[j+1]-m->eBands[j]; /* N=1 bands only have a sign bit and fine bits. */ if (N0< 2 && !(N0&1)) { N0>>=1; LM0--; } /* N0=1 bands can't be split down to N<2. */ else if (N0 <= 1) { LM0=IMIN(i,1); N0<<=LM0; } /* Compute the cost for the lowest-level PVQ of a fully split band. */ pcache = bits + cindex[(LM0+1)*m->nbEBands+j]; max_bits = pcache[pcache[0]]+1; /* Add in the cost of coding regular splits. */ N = N0; for(k=0;klogN[j]+(LM0+k<>1)-QTHETA_OFFSET; /* The number of qtheta bits we'll allocate if the remainder is to be max_bits. The average measured cost for theta is 0.89701 times qb, approximated here as 459/512. */ num=459*(celt_int32)((2*N-1)*offset+max_bits); den=((celt_int32)(2*N-1)<<9)-459; qb = IMIN((num+(den>>1))/den, 57); celt_assert(qb >= 0); max_bits += qb; N <<= 1; } /* Add in the cost of a stereo split, if necessary. */ if (C==2) { max_bits <<= 1; offset = (m->logN[j]+(i<>1)-(N==2?QTHETA_OFFSET_TWOPHASE:QTHETA_OFFSET); ndof = 2*N-1-(N==2); /* The average measured cost for theta with the step PDF is 0.95164 times qb, approximated here as 487/512. */ num = (N==2?512:487)*(celt_int32)(max_bits+ndof*offset); den = ((celt_int32)ndof<<9)-(N==2?512:487); qb = IMIN((num+(den>>1))/den, (N==2?64:61)); celt_assert(qb >= 0); max_bits += qb; } /* Add the fine bits we'll use. */ /* Compensate for the extra DoF in stereo */ ndof = C*N + ((C==2 && N>2) ? 1 : 0); /* Offset the number of fine bits by log2(N)/2 + FINE_OFFSET compared to their "fair share" of total/N */ offset = (m->logN[j] + (i<>1)-FINE_OFFSET; /* N=2 is the only point that doesn't match the curve */ if (N==2) offset += 1<>2; /* The number of fine bits we'll allocate if the remainder is to be max_bits. */ num = max_bits+ndof*offset; den = ndof-1<>1))/den, MAX_FINE_BITS); celt_assert(qb >= 0); max_bits += C*qb<eBands[j+1]-m->eBands[j]<= 0); celt_assert(max_bits < 256); *cap++ = (unsigned char)max_bits; } } } } #endif /* CUSTOM_MODES */ #define ALLOC_STEPS 6 static inline int interp_bits2pulses(const CELTMode *m, int start, int end, int skip_start, const int *bits1, const int *bits2, const int *thresh, const int *cap, celt_int32 total, celt_int32 *_balance, int skip_rsv, int *intensity, int intensity_rsv, int *dual_stereo, int dual_stereo_rsv, int *bits, int *ebits, int *fine_priority, int _C, int LM, ec_ctx *ec, int encode, int prev) { celt_int32 psum; int lo, hi; int i, j; int logM; const int C = CHANNELS(_C); int stereo; int codedBands=-1; int alloc_floor; celt_int32 left, percoeff; int done; int balance; SAVE_STACK; alloc_floor = C<1; logM = LM<>1; psum = 0; done = 0; for (j=end;j-->start;) { int tmp = bits1[j] + (mid*(celt_int32)bits2[j]>>ALLOC_STEPS); if (tmp >= thresh[j] || done) { done = 1; /* Don't allocate more than we can actually use */ psum += IMIN(tmp, cap[j]); } else { if (tmp >= alloc_floor) psum += alloc_floor; } } if (psum > total) hi = mid; else lo = mid; } psum = 0; /*printf ("interp bisection gave %d\n", lo);*/ done = 0; for (j=end;j-->start;) { int tmp = bits1[j] + (lo*bits2[j]>>ALLOC_STEPS); if (tmp < thresh[j] && !done) { if (tmp >= alloc_floor) tmp = alloc_floor; else tmp = 0; } else done = 1; /* Don't allocate more than we can actually use */ tmp = IMIN(tmp, cap[j]); bits[j] = tmp; psum += tmp; } /* Decide which bands to skip, working backwards from the end. */ for (codedBands=end;;codedBands--) { int band_width; int band_bits; int rem; j = codedBands-1; /* Never skip the first band, nor a band that has been boosted by dynalloc. In the first case, we'd be coding a bit to signal we're going to waste all the other bits. In the second case, we'd be coding a bit to redistribute all the bits we just signaled should be cocentrated in this band. */ if (j<=skip_start) { /* Give the bit we reserved to end skipping back. */ total += skip_rsv; break; } /*Figure out how many left-over bits we would be adding to this band. This can include bits we've stolen back from higher, skipped bands.*/ left = total-psum; percoeff = left/(m->eBands[codedBands]-m->eBands[start]); left -= (m->eBands[codedBands]-m->eBands[start])*percoeff; rem = IMAX(left-(m->eBands[j]-m->eBands[start]),0); band_width = m->eBands[codedBands]-m->eBands[j]; band_bits = (int)(bits[j] + percoeff*band_width + rem); /*Only code a skip decision if we're above the threshold for this band. Otherwise it is force-skipped. This ensures that we have enough bits to code the skip flag.*/ if (band_bits >= IMAX(thresh[j], alloc_floor+(1< ((j>4) { ec_enc_bit_logp(ec, 1, 1); break; } ec_enc_bit_logp(ec, 0, 1); } else if (ec_dec_bit_logp(ec, 1)) { break; } /*We used a bit to skip this band.*/ psum += 1< 0) intensity_rsv = LOG2_FRAC_TABLE[j-start]; psum += intensity_rsv; if (band_bits >= alloc_floor) { /*If we have enough for a fine energy bit per channel, use it.*/ psum += alloc_floor; bits[j] = alloc_floor; } else { /*Otherwise this band gets nothing at all.*/ bits[j] = 0; } } celt_assert(codedBands > start); /* Code the intensity and dual stereo parameters. */ if (intensity_rsv > 0) { if (encode) { *intensity = IMIN(*intensity, codedBands); ec_enc_uint(ec, *intensity-start, codedBands+1-start); } else *intensity = start+ec_dec_uint(ec, codedBands+1-start); } else *intensity = 0; if (*intensity <= start) { total += dual_stereo_rsv; dual_stereo_rsv = 0; } if (dual_stereo_rsv > 0) { if (encode) ec_enc_bit_logp(ec, *dual_stereo, 1); else *dual_stereo = ec_dec_bit_logp(ec, 1); } else *dual_stereo = 0; /* Allocate the remaining bits */ left = total-psum; percoeff = left/(m->eBands[codedBands]-m->eBands[start]); left -= (m->eBands[codedBands]-m->eBands[start])*percoeff; for (j=start;jeBands[j+1]-m->eBands[j])); for (j=start;jeBands[j+1]-m->eBands[j]); bits[j] += tmp; left -= tmp; } /*for (j=0;j= 0); N0 = m->eBands[j+1]-m->eBands[j]; N=N0<1) { excess = IMAX(bits[j]-cap[j],0); bits[j] -= excess; /* Compensate for the extra DoF in stereo */ den=(C*N+ ((C==2 && N>2 && !*dual_stereo && j<*intensity) ? 1 : 0)); NClogN = den*(m->logN[j] + logM); /* Offset for the number of fine bits by log2(N)/2 + FINE_OFFSET compared to their "fair share" of total/N */ offset = (NClogN>>1)-den*FINE_OFFSET; /* N=2 is the only point that doesn't match the curve */ if (N==2) offset += den<>2; /* Changing the offset for allocating the second and third fine energy bit */ if (bits[j] + offset < den*2<>2; else if (bits[j] + offset < den*3<>3; /* Divide with rounding */ ebits[j] = IMAX(0, (bits[j] + offset + (den<<(BITRES-1))) / (den< (bits[j]>>BITRES)) ebits[j] = bits[j] >> stereo >> BITRES; /* More than that is useless because that's about as far as PVQ can go */ ebits[j] = IMIN(ebits[j], MAX_FINE_BITS); /* If we rounded down or capped this band, make it a candidate for the final fine energy pass */ fine_priority[j] = ebits[j]*(den<= bits[j]+offset; /* Remove the allocated fine bits; the rest are assigned to PVQ */ bits[j] -= C*ebits[j]< 0) { int extra_fine; int extra_bits; extra_fine = IMIN(excess >> stereo+BITRES, MAX_FINE_BITS-ebits[j]); ebits[j] += extra_fine; extra_bits = extra_fine*C<= excess-balance; excess -= extra_bits; } balance = excess; celt_assert(bits[j] >= 0); celt_assert(ebits[j] >= 0); } /* Save any remaining bits over the cap for the rebalancing in quant_all_bands(). */ *_balance = balance; /* The skipped bands use all their bits for fine energy. */ for (;j> stereo >> BITRES; celt_assert(C*ebits[j]<nbEBands; skip_start = start; /* Reserve a bit to signal the end of manually skipped bands. */ skip_rsv = total >= 1<total) intensity_rsv = 0; else { total -= intensity_rsv; dual_stereo_rsv = total>=1<eBands[j+1]-m->eBands[j])<>4); /* Tilt of the allocation curve */ trim_offset[j] = C*(m->eBands[j+1]-m->eBands[j])*(alloc_trim-5-LM)*(end-j-1) <<(LM+BITRES)>>6; /* Giving less resolution to single-coefficient bands because they get more benefit from having one coarse value per coefficient*/ if ((m->eBands[j+1]-m->eBands[j])<nbAllocVectors - 1; do { int done = 0; int psum = 0; int mid = (lo+hi) >> 1; for (j=end;j-->start;) { int N = m->eBands[j+1]-m->eBands[j]; bits1[j] = C*N*m->allocVectors[mid*len+j]<>2; if (bits1[j] > 0) bits1[j] = IMAX(0, bits1[j] + trim_offset[j]); bits1[j] += offsets[j]; if (bits1[j] >= thresh[j] || done) { done = 1; /* Don't allocate more than we can actually use */ psum += IMIN(bits1[j], cap[j]); } else { if (bits1[j] >= C< total) hi = mid - 1; else lo = mid + 1; /*printf ("lo = %d, hi = %d\n", lo, hi);*/ } while (lo <= hi); hi = lo--; /*printf ("interp between %d and %d\n", lo, hi);*/ for (j=start;jeBands[j+1]-m->eBands[j]; bits1[j] = C*N*m->allocVectors[lo*len+j]<>2; bits2[j] = hi>=m->nbAllocVectors ? cap[j] : C*N*m->allocVectors[hi*len+j]<>2; if (bits1[j] > 0) bits1[j] = IMAX(0, bits1[j] + trim_offset[j]); if (bits2[j] > 0) bits2[j] = IMAX(0, bits2[j] + trim_offset[j]); if (lo > 0) bits1[j] += offsets[j]; bits2[j] += offsets[j]; if (offsets[j]>0) skip_start = j; bits2[j] = IMAX(0,bits2[j]-bits1[j]); } codedBands = interp_bits2pulses(m, start, end, skip_start, bits1, bits2, thresh, cap, total, balance, skip_rsv, intensity, intensity_rsv, dual_stereo, dual_stereo_rsv, pulses, ebits, fine_priority, C, LM, ec, encode, prev); RESTORE_STACK; return codedBands; } mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/_kiss_fft_guts.h0000664000175000017500000001457414010707315023450 0ustar builderbuilder/* Copyright (c) 2003-2004, Mark Borgerding All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef KISS_FFT_GUTS_H #define KISS_FFT_GUTS_H #define MIN(a,b) ((a)<(b) ? (a):(b)) #define MAX(a,b) ((a)>(b) ? (a):(b)) /* kiss_fft.h defines kiss_fft_scalar as either short or a float type and defines typedef struct { kiss_fft_scalar r; kiss_fft_scalar i; }kiss_fft_cpx; */ #include "kiss_fft.h" /* Explanation of macros dealing with complex math: C_MUL(m,a,b) : m = a*b C_FIXDIV( c , div ) : if a fixed point impl., c /= div. noop otherwise C_SUB( res, a,b) : res = a - b C_SUBFROM( res , a) : res -= a C_ADDTO( res , a) : res += a * */ #ifdef FIXED_POINT #include "arch.h" #define DOUBLE_PRECISION #ifdef DOUBLE_PRECISION # define FRACBITS 31 # define SAMPPROD long long #define SAMP_MAX 2147483647 #define TWID_MAX 32767 #define TRIG_UPSCALE 1 #define EXT32(a) (a) #else /* DOUBLE_PRECISION */ # define FRACBITS 15 # define SAMPPROD celt_int32 #define SAMP_MAX 32767 #define TRIG_UPSCALE 1 #define EXT32(a) EXTEND32(a) #endif /* !DOUBLE_PRECISION */ #define SAMP_MIN -SAMP_MAX #if defined(CHECK_OVERFLOW) # define CHECK_OVERFLOW_OP(a,op,b) \ if ( (SAMPPROD)(a) op (SAMPPROD)(b) > SAMP_MAX || (SAMPPROD)(a) op (SAMPPROD)(b) < SAMP_MIN ) { \ fprintf(stderr,"WARNING:overflow @ " __FILE__ "(%d): (%d " #op" %d) = %ld\n",__LINE__,(a),(b),(SAMPPROD)(a) op (SAMPPROD)(b) ); } #endif # define smul(a,b) ( (SAMPPROD)(a)*(b) ) # define sround( x ) (kiss_fft_scalar)( ( (x) + ((SAMPPROD)1<<(FRACBITS-1)) ) >> FRACBITS ) # define S_MUL(a,b) MULT16_32_Q15(b, a) # define C_MUL(m,a,b) \ do{ (m).r = SUB32(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)); \ (m).i = ADD32(S_MUL((a).r,(b).i) , S_MUL((a).i,(b).r)); }while(0) # define C_MULC(m,a,b) \ do{ (m).r = ADD32(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)); \ (m).i = SUB32(S_MUL((a).i,(b).r) , S_MUL((a).r,(b).i)); }while(0) # define C_MUL4(m,a,b) \ do{ (m).r = SHR(SUB32(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)),2); \ (m).i = SHR(ADD32(S_MUL((a).r,(b).i) , S_MUL((a).i,(b).r)),2); }while(0) # define C_MULBYSCALAR( c, s ) \ do{ (c).r = S_MUL( (c).r , s ) ;\ (c).i = S_MUL( (c).i , s ) ; }while(0) # define DIVSCALAR(x,k) \ (x) = S_MUL( x, (TWID_MAX-((k)>>1))/(k)+1 ) # define C_FIXDIV(c,div) \ do { DIVSCALAR( (c).r , div); \ DIVSCALAR( (c).i , div); }while (0) #define C_ADD( res, a,b)\ do {(res).r=ADD32((a).r,(b).r); (res).i=ADD32((a).i,(b).i); \ }while(0) #define C_SUB( res, a,b)\ do {(res).r=SUB32((a).r,(b).r); (res).i=SUB32((a).i,(b).i); \ }while(0) #define C_ADDTO( res , a)\ do {(res).r = ADD32((res).r, (a).r); (res).i = ADD32((res).i,(a).i);\ }while(0) #define C_SUBFROM( res , a)\ do {(res).r = ADD32((res).r,(a).r); (res).i = SUB32((res).i,(a).i); \ }while(0) #else /* not FIXED_POINT*/ #define EXT32(a) (a) # define S_MUL(a,b) ( (a)*(b) ) #define C_MUL(m,a,b) \ do{ (m).r = (a).r*(b).r - (a).i*(b).i;\ (m).i = (a).r*(b).i + (a).i*(b).r; }while(0) #define C_MULC(m,a,b) \ do{ (m).r = (a).r*(b).r + (a).i*(b).i;\ (m).i = (a).i*(b).r - (a).r*(b).i; }while(0) #define C_MUL4(m,a,b) C_MUL(m,a,b) # define C_FIXDIV(c,div) /* NOOP */ # define C_MULBYSCALAR( c, s ) \ do{ (c).r *= (s);\ (c).i *= (s); }while(0) #endif #ifndef CHECK_OVERFLOW_OP # define CHECK_OVERFLOW_OP(a,op,b) /* noop */ #endif #ifndef C_ADD #define C_ADD( res, a,b)\ do { \ CHECK_OVERFLOW_OP((a).r,+,(b).r)\ CHECK_OVERFLOW_OP((a).i,+,(b).i)\ (res).r=(a).r+(b).r; (res).i=(a).i+(b).i; \ }while(0) #define C_SUB( res, a,b)\ do { \ CHECK_OVERFLOW_OP((a).r,-,(b).r)\ CHECK_OVERFLOW_OP((a).i,-,(b).i)\ (res).r=(a).r-(b).r; (res).i=(a).i-(b).i; \ }while(0) #define C_ADDTO( res , a)\ do { \ CHECK_OVERFLOW_OP((res).r,+,(a).r)\ CHECK_OVERFLOW_OP((res).i,+,(a).i)\ (res).r += (a).r; (res).i += (a).i;\ }while(0) #define C_SUBFROM( res , a)\ do {\ CHECK_OVERFLOW_OP((res).r,-,(a).r)\ CHECK_OVERFLOW_OP((res).i,-,(a).i)\ (res).r -= (a).r; (res).i -= (a).i; \ }while(0) #endif /* C_ADD defined */ #ifdef FIXED_POINT /*# define KISS_FFT_COS(phase) TRIG_UPSCALE*floor(MIN(32767,MAX(-32767,.5+32768 * cos (phase)))) # define KISS_FFT_SIN(phase) TRIG_UPSCALE*floor(MIN(32767,MAX(-32767,.5+32768 * sin (phase))))*/ # define KISS_FFT_COS(phase) floor(.5+TWID_MAX*cos (phase)) # define KISS_FFT_SIN(phase) floor(.5+TWID_MAX*sin (phase)) # define HALF_OF(x) ((x)>>1) #elif defined(USE_SIMD) # define KISS_FFT_COS(phase) _mm_set1_ps( cos(phase) ) # define KISS_FFT_SIN(phase) _mm_set1_ps( sin(phase) ) # define HALF_OF(x) ((x)*_mm_set1_ps(.5f)) #else # define KISS_FFT_COS(phase) (kiss_fft_scalar) cos(phase) # define KISS_FFT_SIN(phase) (kiss_fft_scalar) sin(phase) # define HALF_OF(x) ((x)*.5f) #endif #define kf_cexp(x,phase) \ do{ \ (x)->r = KISS_FFT_COS(phase);\ (x)->i = KISS_FFT_SIN(phase);\ }while(0) #define kf_cexp2(x,phase) \ do{ \ (x)->r = TRIG_UPSCALE*celt_cos_norm((phase));\ (x)->i = TRIG_UPSCALE*celt_cos_norm((phase)-32768);\ }while(0) #endif /* KISS_FFT_GUTS_H */ mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/mdct.h0000664000175000017500000000524114010707315021355 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2008 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* This is a simple MDCT implementation that uses a N/4 complex FFT to do most of the work. It should be relatively straightforward to plug in pretty much and FFT here. This replaces the Vorbis FFT (and uses the exact same API), which was a bit too messy and that was ending up duplicating code (might as well use the same FFT everywhere). The algorithm is similar to (and inspired from) Fabrice Bellard's MDCT implementation in FFMPEG, but has differences in signs, ordering and scaling in many places. */ #ifndef MDCT_H #define MDCT_H #include "kiss_fft.h" #include "arch.h" typedef struct { int n; int maxshift; const kiss_fft_state *kfft[4]; const kiss_twiddle_scalar * restrict trig; } mdct_lookup; void clt_mdct_init(mdct_lookup *l,int N, int maxshift); void clt_mdct_clear(mdct_lookup *l); /** Compute a forward MDCT and scale by 4/N */ void clt_mdct_forward(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar *out, const celt_word16 *window, int overlap, int shift); /** Compute a backward MDCT (no scaling) and performs weighted overlap-add (scales implicitly by 1/2) */ void clt_mdct_backward(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar *out, const celt_word16 * restrict window, int overlap, int shift); #endif mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/mathops.c0000664000175000017500000001465214010707315022102 0ustar builderbuilder/* Copyright (c) 2002-2008 Jean-Marc Valin Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /** @file mathops.h @brief Various math functions */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "mathops.h" /*Compute floor(sqrt(_val)) with exact arithmetic. This has been tested on all possible 32-bit inputs.*/ unsigned isqrt32(celt_uint32 _val){ unsigned b; unsigned g; int bshift; /*Uses the second method from http://www.azillionmonkeys.com/qed/sqroot.html The main idea is to search for the largest binary digit b such that (g+b)*(g+b) <= _val, and add it to the solution g.*/ g=0; bshift=EC_ILOG(_val)-1>>1; b=1U<>=1; bshift--; } while(bshift>=0); return g; } #ifdef FIXED_POINT celt_word32 frac_div32(celt_word32 a, celt_word32 b) { celt_word16 rcp; celt_word32 result, rem; int shift = celt_ilog2(b)-29; a = VSHR32(a,shift); b = VSHR32(b,shift); /* 16-bit reciprocal */ rcp = ROUND16(celt_rcp(ROUND16(b,16)),3); result = SHL32(MULT16_32_Q15(rcp, a),2); rem = a-MULT32_32_Q31(result, b); result += SHL32(MULT16_32_Q15(rcp, rem),2); return result; } /** Reciprocal sqrt approximation in the range [0.25,1) (Q16 in, Q14 out) */ celt_word16 celt_rsqrt_norm(celt_word32 x) { celt_word16 n; celt_word16 r; celt_word16 r2; celt_word16 y; /* Range of n is [-16384,32767] ([-0.5,1) in Q15). */ n = x-32768; /* Get a rough initial guess for the root. The optimal minimax quadratic approximation (using relative error) is r = 1.437799046117536+n*(-0.823394375837328+n*0.4096419668459485). Coefficients here, and the final result r, are Q14.*/ r = ADD16(23557, MULT16_16_Q15(n, ADD16(-13490, MULT16_16_Q15(n, 6713)))); /* We want y = x*r*r-1 in Q15, but x is 32-bit Q16 and r is Q14. We can compute the result from n and r using Q15 multiplies with some adjustment, carefully done to avoid overflow. Range of y is [-1564,1594]. */ r2 = MULT16_16_Q15(r, r); y = SHL16(SUB16(ADD16(MULT16_16_Q15(r2, n), r2), 16384), 1); /* Apply a 2nd-order Householder iteration: r += r*y*(y*0.375-0.5). This yields the Q14 reciprocal square root of the Q16 x, with a maximum relative error of 1.04956E-4, a (relative) RMSE of 2.80979E-5, and a peak absolute error of 2.26591/16384. */ return ADD16(r, MULT16_16_Q15(r, MULT16_16_Q15(y, SUB16(MULT16_16_Q15(y, 12288), 16384)))); } /** Sqrt approximation (QX input, QX/2 output) */ celt_word32 celt_sqrt(celt_word32 x) { int k; celt_word16 n; celt_word32 rt; static const celt_word16 C[5] = {23175, 11561, -3011, 1699, -664}; if (x==0) return 0; k = (celt_ilog2(x)>>1)-7; x = VSHR32(x, (k<<1)); n = x-32768; rt = ADD16(C[0], MULT16_16_Q15(n, ADD16(C[1], MULT16_16_Q15(n, ADD16(C[2], MULT16_16_Q15(n, ADD16(C[3], MULT16_16_Q15(n, (C[4]))))))))); rt = VSHR32(rt,7-k); return rt; } #define L1 32767 #define L2 -7651 #define L3 8277 #define L4 -626 static inline celt_word16 _celt_cos_pi_2(celt_word16 x) { celt_word16 x2; x2 = MULT16_16_P15(x,x); return ADD16(1,MIN16(32766,ADD32(SUB16(L1,x2), MULT16_16_P15(x2, ADD32(L2, MULT16_16_P15(x2, ADD32(L3, MULT16_16_P15(L4, x2 )))))))); } #undef L1 #undef L2 #undef L3 #undef L4 celt_word16 celt_cos_norm(celt_word32 x) { x = x&0x0001ffff; if (x>SHL32(EXTEND32(1), 16)) x = SUB32(SHL32(EXTEND32(1), 17),x); if (x&0x00007fff) { if (x0, "celt_rcp() only defined for positive values"); i = celt_ilog2(x); /* n is Q15 with range [0,1). */ n = VSHR32(x,i-15)-32768; /* Start with a linear approximation: r = 1.8823529411764706-0.9411764705882353*n. The coefficients and the result are Q14 in the range [15420,30840].*/ r = ADD16(30840, MULT16_16_Q15(-15420, n)); /* Perform two Newton iterations: r -= r*((r*n)-1.Q15) = r*((r*n)+(r-1.Q15)). */ r = SUB16(r, MULT16_16_Q15(r, ADD16(MULT16_16_Q15(r, n), ADD16(r, -32768)))); /* We subtract an extra 1 in the second iteration to avoid overflow; it also neatly compensates for truncation error in the rest of the process. */ r = SUB16(r, ADD16(1, MULT16_16_Q15(r, ADD16(MULT16_16_Q15(r, n), ADD16(r, -32768))))); /* r is now the Q15 solution to 2/(n+1), with a maximum relative error of 7.05346E-5, a (relative) RMSE of 2.14418E-5, and a peak absolute error of 1.24665/32768. */ return VSHR32(EXTEND32(r),i-16); } #endif mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/Makefile.am0000664000175000017500000000253414010707315022313 0ustar builderbuilder# Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies pkginclude_HEADERS = celt.h celt_types.h celt_header.h EXTRA_DIST= match-test.sh libcelt.vcxproj libcelt.vcxproj.filters #INCLUDES = -I$(top_srcdir)/include -I$(top_builddir)/include -I$(top_builddir) @OGG_CFLAGS@ TESTS = match-test.sh noinst_SCRIPTS = match-test.sh lib_LTLIBRARIES = libcelt@LIBCELT_SUFFIX@.la # Sources for compilation in the library libcelt@LIBCELT_SUFFIX@_la_SOURCES = bands.c celt.c cwrs.c ecintrin.h entcode.c \ entdec.c entenc.c header.c kiss_fft.c laplace.c mathops.c mdct.c \ modes.c pitch.c plc.c quant_bands.c rate.c vq.c libcelt@LIBCELT_SUFFIX@_la_LDFLAGS = \ -version-info @CELT_LT_CURRENT@:@CELT_LT_REVISION@:@CELT_LT_AGE@ \ -no-undefined noinst_HEADERS = _kiss_fft_guts.h arch.h bands.h fixed_c5x.h fixed_c6x.h \ cwrs.h ecintrin.h entcode.h entdec.h entenc.h fixed_generic.h float_cast.h \ kiss_fft.h laplace.h mdct.h mfrngcod.h \ mathops.h modes.h os_support.h pitch.h \ quant_bands.h rate.h stack_alloc.h \ static_modes_fixed.c static_modes_float.c vq.h plc.h noinst_PROGRAMS = testcelt dump_modes testcelt_SOURCES = testcelt.c testcelt_LDADD = libcelt@LIBCELT_SUFFIX@.la INCLUDES = #libcelt@LIBCELT_SUFFIX@_la_LIBADD = dump_modes_SOURCES = dump_modes.c dump_modes_LDADD = libcelt@LIBCELT_SUFFIX@.la mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/celt_types.h0000664000175000017500000001067214010707315022605 0ustar builderbuilder/* (C) COPYRIGHT 1994-2002 Xiph.Org Foundation */ /* Modified by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* celt_types.h taken from libogg */ /** @file celt_types.h @brief CELT types */ #ifndef _CELT_TYPES_H #define _CELT_TYPES_H /* Use the real stdint.h if it's there (taken from Paul Hsieh's pstdint.h) */ #if (defined(__STDC__) && __STDC__ && __STDC_VERSION__ >= 199901L) || (defined(__GNUC__) && (defined(_STDINT_H) || defined(_STDINT_H_)) || defined (HAVE_STDINT_H)) #include typedef int16_t celt_int16; typedef uint16_t celt_uint16; typedef int32_t celt_int32; typedef uint32_t celt_uint32; #elif defined(_WIN32) # if defined(__CYGWIN__) # include <_G_config.h> typedef _G_int32_t celt_int32; typedef _G_uint32_t celt_uint32; typedef _G_int16 celt_int16; typedef _G_uint16 celt_uint16; # elif defined(__MINGW32__) typedef short celt_int16; typedef unsigned short celt_uint16; typedef int celt_int32; typedef unsigned int celt_uint32; # elif defined(__MWERKS__) typedef int celt_int32; typedef unsigned int celt_uint32; typedef short celt_int16; typedef unsigned short celt_uint16; # else /* MSVC/Borland */ typedef __int32 celt_int32; typedef unsigned __int32 celt_uint32; typedef __int16 celt_int16; typedef unsigned __int16 celt_uint16; # endif #elif defined(__MACOS__) # include typedef SInt16 celt_int16; typedef UInt16 celt_uint16; typedef SInt32 celt_int32; typedef UInt32 celt_uint32; #elif (defined(__APPLE__) && defined(__MACH__)) /* MacOS X Framework build */ # include typedef int16_t celt_int16; typedef u_int16_t celt_uint16; typedef int32_t celt_int32; typedef u_int32_t celt_uint32; #elif defined(__BEOS__) /* Be */ # include typedef int16 celt_int16; typedef u_int16 celt_uint16; typedef int32_t celt_int32; typedef u_int32_t celt_uint32; #elif defined (__EMX__) /* OS/2 GCC */ typedef short celt_int16; typedef unsigned short celt_uint16; typedef int celt_int32; typedef unsigned int celt_uint32; #elif defined (DJGPP) /* DJGPP */ typedef short celt_int16; typedef unsigned short celt_uint16; typedef int celt_int32; typedef unsigned int celt_uint32; #elif defined(R5900) /* PS2 EE */ typedef int celt_int32; typedef unsigned celt_uint32; typedef short celt_int16; typedef unsigned short celt_uint16; #elif defined(__SYMBIAN32__) /* Symbian GCC */ typedef signed short celt_int16; typedef unsigned short celt_uint16; typedef signed int celt_int32; typedef unsigned int celt_uint32; #elif defined(CONFIG_TI_C54X) || defined (CONFIG_TI_C55X) typedef short celt_int16; typedef unsigned short celt_uint16; typedef long celt_int32; typedef unsigned long celt_uint32; #elif defined(CONFIG_TI_C6X) typedef short celt_int16; typedef unsigned short celt_uint16; typedef int celt_int32; typedef unsigned int celt_uint32; #else /* Give up, take a reasonable guess */ typedef short celt_int16; typedef unsigned short celt_uint16; typedef int celt_int32; typedef unsigned int celt_uint32; #endif #endif /* _CELT_TYPES_H */ mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/fixed_c5x.h0000664000175000017500000000524014010707315022303 0ustar builderbuilder/* Copyright (C) 2003 Jean-Marc Valin */ /** @file fixed_c5x.h @brief Fixed-point operations for the TI C5x DSP family */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef FIXED_C5X_H #define FIXED_C5X_H #include "dsplib.h" #undef IMUL32 static inline long IMUL32(long i, long j) { long ac0, ac1; ac0 = _lmpy(i>>16,j); ac1 = ac0 + _lmpy(i,j>>16); return _lmpyu(i,j) + (ac1<<16); } #undef MAX16 #define MAX16(a,b) _max(a,b) #undef MIN16 #define MIN16(a,b) _min(a,b) #undef MAX32 #define MAX32(a,b) _lmax(a,b) #undef MIN32 #define MIN32(a,b) _lmin(a,b) #undef VSHR32 #define VSHR32(a, shift) _lshl(a,-(shift)) #undef MULT16_16_Q15 #define MULT16_16_Q15(a,b) (_smpy(a,b)) #undef MULT16_16SU #define MULT16_16SU(a,b) _lmpysu(a,b) #undef MULT_16_16 #define MULT_16_16(a,b) _lmpy(a,b) /* FIXME: This is technically incorrect and is bound to cause problems. Is there any cleaner solution? */ #undef MULT16_32_Q15 #define MULT16_32_Q15(a,b) ADD32(SHL(MULT16_16((a),SHR((b),16)),1), SHR(MULT16_16SU((a),(b)),15)) #define celt_ilog2(x) (30 - _lnorm(x)) #define OVERRIDE_CELT_ILOG2 #define celt_maxabs16(x, len) MAX16(maxval((DATA *)x, len),-minval((DATA *)x, len)) #define OVERRIDE_CELT_MAXABS16 #define OVERRIDE_FIND_MAX16 static inline int find_max16(celt_word16 *x, int len) { DATA max_corr16 = -VERY_LARGE16; DATA pitch16 = 0; maxvec((DATA *)x, len, &max_corr16, &pitch16); return pitch16; } #endif /* FIXED_C5X_H */ mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/c64_fft.c0000664000175000017500000002451214010707315021656 0ustar builderbuilder/* (c) Copyright 2008/2009 Xiph.Org Foundation */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "c64_fft.h" #include "dsp_fft16x16t.h" #include "dsp_fft32x32s.h" #include "dsp_ifft32x32.h" #ifndef PI # ifdef M_PI # define PI M_PI # else # define PI 3.14159265358979323846 # endif #endif /* ======================================================================== */ /* D2S -- Truncate a 'double' to a 'short', with clamping. */ /* ======================================================================== */ static short d2s(double d) { if (d >= 32767.0) return 32767; if (d <= -32768.0) return -32768; return (short)d; } /* ======================================================================== */ /* D2S -- Truncate a 'double' to a 'int', with clamping. */ /* ======================================================================== */ static int d2i(double d) { if (d >= 2147483647.0) return (int)0x7FFFFFFF; if (d <= -2147483648.0) return (int)0x80000000; return (int)d; } /* ======================================================================== */ /* GEN_TWIDDLE -- Generate twiddle factors for TI's custom FFTs. */ /* */ /* USAGE */ /* This routine is called as follows: */ /* */ /* int gen_twiddle(short *w, int n, double scale) */ /* */ /* short *w Pointer to twiddle-factor array */ /* int n Size of FFT */ /* double scale Scale factor to apply to values. */ /* */ /* The routine will generate the twiddle-factors directly into the */ /* array you specify. The array needs to be approximately 2*N */ /* elements long. (The actual size, which is slightly smaller, is */ /* returned by the function.) */ /* ======================================================================== */ int gen_twiddle16(short *w, int n, double scale) { int i, j, k; for (j = 1, k = 0; j < n >> 2; j = j << 2) { for (i = 0; i < n >> 2; i += j << 1) { w[k + 11] = d2s(scale * cos(6.0 * PI * (i + j) / n)); w[k + 10] = d2s(scale * sin(6.0 * PI * (i + j) / n)); w[k + 9] = d2s(scale * cos(6.0 * PI * (i ) / n)); w[k + 8] = d2s(scale * sin(6.0 * PI * (i ) / n)); w[k + 7] = d2s(scale * cos(4.0 * PI * (i + j) / n)); w[k + 6] = d2s(scale * sin(4.0 * PI * (i + j) / n)); w[k + 5] = d2s(scale * cos(4.0 * PI * (i ) / n)); w[k + 4] = d2s(scale * sin(4.0 * PI * (i ) / n)); w[k + 3] = d2s(scale * cos(2.0 * PI * (i + j) / n)); w[k + 2] = d2s(scale * sin(2.0 * PI * (i + j) / n)); w[k + 1] = d2s(scale * cos(2.0 * PI * (i ) / n)); w[k + 0] = d2s(scale * sin(2.0 * PI * (i ) / n)); k += 12; } } return k; } /* ======================================================================== */ /* GEN_TWIDDLE -- Generate twiddle factors for TI's custom FFTs. */ /* */ /* USAGE */ /* This routine is called as follows: */ /* */ /* int gen_twiddle(int *w, int n, double scale) */ /* */ /* int *w Pointer to twiddle-factor array */ /* int n Size of FFT */ /* double scale Scale factor to apply to values. */ /* */ /* The routine will generate the twiddle-factors directly into the */ /* array you specify. The array needs to be approximately 2*N */ /* elements long. (The actual size, which is slightly smaller, is */ /* returned by the function.) */ /* ======================================================================== */ int gen_twiddle32(int *w, int n, double scale) { int i, j, k, s=0, t; for (j = 1, k = 0; j < n >> 2; j = j << 2, s++) { for (i = t=0; i < n >> 2; i += j, t++) { w[k + 5] = d2i(scale * cos(6.0 * PI * i / n)); w[k + 4] = d2i(scale * sin(6.0 * PI * i / n)); w[k + 3] = d2i(scale * cos(4.0 * PI * i / n)); w[k + 2] = d2i(scale * sin(4.0 * PI * i / n)); w[k + 1] = d2i(scale * cos(2.0 * PI * i / n)); w[k + 0] = d2i(scale * sin(2.0 * PI * i / n)); k += 6; } } return k; } #define NBCACHE 3 static c64_fft_t *cache16[NBCACHE] = {NULL,}; static c64_fft_t *cache32[NBCACHE] = {NULL,}; c64_fft_t *c64_fft16_alloc(int length, int x, int y) { c64_fft_t *state; celt_int16 *w, *iw; int i, c; for (c = 0; c < NBCACHE; c++) { if (cache16[c] == NULL) break; if (cache16[c]->nfft == length) return cache16[c]; } state = (c64_fft_t *)celt_alloc(sizeof(c64_fft_t)); state->shift = log(length)/log(2) - ceil(log(length)/log(4)-1); state->nfft = length; state->twiddle = celt_alloc(length*2*sizeof(celt_int16)); state->itwiddle = celt_alloc(length*2*sizeof(celt_int16)); gen_twiddle16((celt_int16 *)state->twiddle, length, 32767.0); w = (celt_int16 *)state->twiddle; iw = (celt_int16 *)state->itwiddle; for (i = 0; i < length; i++) { iw[2*i+0] = w[2*i+0]; iw[2*i+1] = - w[2*i+1]; } if (c < NBCACHE) cache16[c++] = state; if (c < NBCACHE) cache16[c] = NULL; return state; } c64_fft_t *c64_fft32_alloc(int length, int x, int y) { c64_fft_t *state; int i, c; for (c = 0; c < NBCACHE; c++) { if (cache32[c] == NULL) break; if (cache32[c]->nfft == length) return cache32[c]; } state = (c64_fft_t *)celt_alloc(sizeof(c64_fft_t)); state->shift = log(length)/log(2) - ceil(log(length)/log(4)-1); state->nfft = length; state->twiddle = celt_alloc(length*2*sizeof(celt_int32)); state->itwiddle = celt_alloc(length*2*sizeof(celt_int32)); // Generate the inverse twiddle first because it does not need scaling gen_twiddle32(state->itwiddle, length, 2147483647.000000000); for (i = 0; i < length; i++) { state->twiddle[2*i+0] = state->itwiddle[2*i+0] >> 1; state->twiddle[2*i+1] = state->itwiddle[2*i+1] >> 1; } if (c < NBCACHE) cache32[c++] = state; if (c < NBCACHE) cache32[c] = NULL; return state; } void c64_fft16_free(c64_fft_t *state) { c64_fft32_free(state); } void c64_fft32_free(c64_fft_t *state) { } void c64_fft16_inplace(c64_fft_t * restrict state, celt_int16 *X) { int i; VARDECL(celt_int16, cin); VARDECL(celt_int16, cout); SAVE_STACK; ALLOC(cin, state->nfft*2, celt_int16); ALLOC(cout, state->nfft*2, celt_int16); for (i = 0; i < state->nfft; i++) { cin[2*i+0] = X[2*i+0]; cin[2*i+1] = X[2*i+1]; } DSP_fft16x16t((celt_int16 *)state->twiddle, state->nfft, cin, cout); for (i = 0; i < state->nfft; i++) { X[2*i+0] = cout[2*i+0]; X[2*i+1] = cout[2*i+1]; } RESTORE_STACK; } void c64_fft32(c64_fft_t * restrict state, const celt_int32 *X, celt_int32 *Y) { int i; VARDECL(celt_int32, cin); SAVE_STACK; ALLOC(cin, state->nfft*2, celt_int32); for (i = 0; i < state->nfft; i++) { cin[2*i+0] = X[2*i+0] >> state->shift; cin[2*i+1] = X[2*i+1] >> state->shift; } DSP_fft32x32s(state->twiddle, state->nfft, cin, Y); RESTORE_STACK; } void c64_ifft16(c64_fft_t * restrict state, const celt_int16 *X, celt_int16 *Y) { int i; VARDECL(celt_int16, cin); VARDECL(celt_int16, cout); SAVE_STACK; ALLOC(cin, state->nfft*2, celt_int16); if ((celt_int32)Y & 7) ALLOC(cout, state->nfft*2, celt_int16); else cout = Y; for (i = 0; i < state->nfft; i++) { // No need to scale for this one but still need to save the input // because the fft is going to change it! cin[2*i+0] = X[2*i+0]; cin[2*i+1] = X[2*i+1]; } DSP_fft16x16t((celt_int16 *)state->itwiddle, state->nfft, cin, cout); if ((celt_int32)Y & 7) for (i = 0; i < state->nfft; i++) { Y[2*i+0] = cout[2*i+0]; Y[2*i+1] = cout[2*i+1]; } RESTORE_STACK; } void c64_ifft32(c64_fft_t * restrict state, const celt_int32 *X, celt_int32 *Y) { int i; VARDECL(celt_int32, cin); SAVE_STACK; ALLOC(cin, state->nfft*2, celt_int32); celt_assert(Y & 7 == 0); for (i = 0; i < state->nfft; i++) { // No need to scale for this one but still need to save the input // because the fft is going to change it! cin[2*i+0] = X[2*i+0]; cin[2*i+1] = X[2*i+1]; } DSP_ifft32x32(state->itwiddle, state->nfft, cin, Y); RESTORE_STACK; } mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/header.c0000664000175000017500000001001014010707315021637 0ustar builderbuilder/* Copyright (c) 2007 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "celt_header.h" #include "os_support.h" #include "modes.h" static celt_uint32 _le_32 (celt_uint32 i) { celt_uint32 ret=i; #if !defined(__LITTLE_ENDIAN__) && ( defined(WORDS_BIGENDIAN) || defined(__BIG_ENDIAN__) ) ret = (i>>24); ret += (i>>8) & 0x0000ff00; ret += (i<<8) & 0x00ff0000; ret += (i<<24); #endif return ret; } int celt_header_init(CELTHeader *header, const CELTMode *m, int frame_size, int channels) { if (header==NULL) return CELT_BAD_ARG; CELT_COPY(header->codec_id, "CELT ", 8); CELT_COPY(header->codec_version, "experimental ", 20); celt_mode_info(m, CELT_GET_BITSTREAM_VERSION, &header->version_id); header->header_size = 56; header->sample_rate = m->Fs; header->nb_channels = channels; /*FIXME: This won't work for variable frame size */ header->frame_size = frame_size; header->overlap = m->overlap; header->bytes_per_packet = -1; header->extra_headers = 0; return CELT_OK; } int celt_header_to_packet(const CELTHeader *header, unsigned char *packet, celt_uint32 size) { celt_int32 * h; if ((size < 56) || (header==NULL) || (packet==NULL)) return CELT_BAD_ARG; /* FAIL */ CELT_MEMSET(packet, 0, sizeof(*header)); /* FIXME: Do it in an alignment-safe manner */ /* Copy ident and version */ CELT_COPY(packet, (unsigned char*)header, 28); /* Copy the int32 fields */ h = (celt_int32*)(packet+28); *h++ = _le_32 (header->version_id); *h++ = _le_32 (header->header_size); *h++ = _le_32 (header->sample_rate); *h++ = _le_32 (header->nb_channels); *h++ = _le_32 (header->frame_size); *h++ = _le_32 (header->overlap); *h++ = _le_32 (header->bytes_per_packet); *h = _le_32 (header->extra_headers); return sizeof(*header); } int celt_header_from_packet(const unsigned char *packet, celt_uint32 size, CELTHeader *header) { celt_int32 * h; if ((size < 56) || (header==NULL) || (packet==NULL)) return CELT_BAD_ARG; /* FAIL */ CELT_MEMSET((unsigned char*)header, 0, sizeof(*header)); /* FIXME: Do it in an alignment-safe manner */ /* Copy ident and version */ CELT_COPY((unsigned char*)header, packet, 28); /* Copy the int32 fields */ h = (celt_int32*)(packet+28); header->version_id = _le_32(*h++); header->header_size = _le_32(*h++); header->sample_rate = _le_32(*h++); header->nb_channels = _le_32(*h++); header->frame_size = _le_32(*h++); header->overlap = _le_32(*h++); header->bytes_per_packet = _le_32(*h++); header->extra_headers = _le_32(*h); return sizeof(*header); } mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/plc.c0000664000175000017500000001152214010707315021176 0ustar builderbuilder/* Copyright (c) 2009-2010 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "plc.h" #include "stack_alloc.h" #include "mathops.h" void _celt_lpc( celt_word16 *_lpc, /* out: [0...p-1] LPC coefficients */ const celt_word32 *ac, /* in: [0...p] autocorrelation values */ int p ) { int i, j; celt_word32 r; celt_word32 error = ac[0]; #ifdef FIXED_POINT celt_word32 lpc[LPC_ORDER]; #else float *lpc = _lpc; #endif for (i = 0; i < p; i++) lpc[i] = 0; if (ac[0] != 0) { for (i = 0; i < p; i++) { /* Sum up this iteration's reflection coefficient */ celt_word32 rr = 0; for (j = 0; j < i; j++) rr += MULT32_32_Q31(lpc[j],ac[i - j]); rr += SHR32(ac[i + 1],3); r = -frac_div32(SHL32(rr,3), error); /* Update LPC coefficients and total error */ lpc[i] = SHR32(r,3); for (j = 0; j < (i+1)>>1; j++) { celt_word32 tmp1, tmp2; tmp1 = lpc[j]; tmp2 = lpc[i-1-j]; lpc[j] = tmp1 + MULT32_32_Q31(r,tmp2); lpc[i-1-j] = tmp2 + MULT32_32_Q31(r,tmp1); } error = error - MULT32_32_Q31(MULT32_32_Q31(r,r),error); /* Bail out once we get 30 dB gain */ #ifdef FIXED_POINT if (error=1;j--) { mem[j]=mem[j-1]; } mem[0] = x[i]; y[i] = ROUND16(sum, SIG_SHIFT); } } void iir(const celt_word32 *x, const celt_word16 *den, celt_word32 *y, int N, int ord, celt_word16 *mem) { int i,j; for (i=0;i=1;j--) { mem[j]=mem[j-1]; } mem[0] = ROUND16(sum,SIG_SHIFT); y[i] = sum; } } void _celt_autocorr( const celt_word16 *x, /* in: [0...n-1] samples x */ celt_word32 *ac, /* out: [0...lag-1] ac values */ const celt_word16 *window, int overlap, int lag, int n ) { celt_word32 d; int i; VARDECL(celt_word16, xx); SAVE_STACK; ALLOC(xx, n, celt_word16); for (i=0;i=0) { for (i = lag, d = 0; i < n; i++) d += xx[i] * xx[i-lag]; ac[lag] = d; /*printf ("%f ", ac[lag]);*/ lag--; } /*printf ("\n");*/ ac[0] += 10; RESTORE_STACK; } mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/pitch.h0000664000175000017500000000356114010707315021540 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /** @file pitch.h @brief Pitch analysis */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _PITCH_H #define _PITCH_H #include "modes.h" void pitch_downsample(celt_sig * restrict x[], celt_word16 * restrict x_lp, int len, int _C); void pitch_search(const celt_word16 * restrict x_lp, celt_word16 * restrict y, int len, int max_pitch, int *pitch); celt_word16 remove_doubling(celt_word16 *x, int maxperiod, int minperiod, int N, int *T0, int prev_period, celt_word16 prev_gain); #endif mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/pitch.c0000664000175000017500000002345114010707315021533 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /** @file pitch.c @brief Pitch analysis */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif /* Always enable postfilter for Opus */ #if defined(OPUS_BUILD) && !defined(ENABLE_POSTFILTER) #define ENABLE_POSTFILTER #endif #include "pitch.h" #include "os_support.h" #include "modes.h" #include "stack_alloc.h" #include "mathops.h" static void find_best_pitch(celt_word32 *xcorr, celt_word32 maxcorr, celt_word16 *y, int yshift, int len, int max_pitch, int best_pitch[2]) { int i, j; celt_word32 Syy=1; celt_word16 best_num[2]; celt_word32 best_den[2]; #ifdef FIXED_POINT int xshift; xshift = celt_ilog2(maxcorr)-14; #endif best_num[0] = -1; best_num[1] = -1; best_den[0] = 0; best_den[1] = 0; best_pitch[0] = 0; best_pitch[1] = 1; for (j=0;j0) { celt_word16 num; celt_word32 xcorr16; xcorr16 = EXTRACT16(VSHR32(xcorr[i], xshift)); num = MULT16_16_Q15(xcorr16,xcorr16); if (MULT16_32_Q15(num,best_den[1]) > MULT16_32_Q15(best_num[1],Syy)) { if (MULT16_32_Q15(num,best_den[0]) > MULT16_32_Q15(best_num[0],Syy)) { best_num[1] = best_num[0]; best_den[1] = best_den[0]; best_pitch[1] = best_pitch[0]; best_num[0] = num; best_den[0] = Syy; best_pitch[0] = i; } else { best_num[1] = num; best_den[1] = Syy; best_pitch[1] = i; } } } Syy += SHR32(MULT16_16(y[i+len],y[i+len]),yshift) - SHR32(MULT16_16(y[i],y[i]),yshift); Syy = MAX32(1, Syy); } } #include "plc.h" void pitch_downsample(celt_sig * restrict x[], celt_word16 * restrict x_lp, int len, int _C) { int i; celt_word32 ac[5]; celt_word16 tmp=Q15ONE; celt_word16 lpc[4], mem[4]={0,0,0,0}; const int C = CHANNELS(_C); for (i=1;i>1;i++) x_lp[i] = SHR32(HALF32(HALF32(x[0][(2*i-1)]+x[0][(2*i+1)])+x[0][2*i]), SIG_SHIFT+3); x_lp[0] = SHR32(HALF32(HALF32(x[0][1])+x[0][0]), SIG_SHIFT+3); if (C==2) { for (i=1;i>1;i++) x_lp[i] += SHR32(HALF32(HALF32(x[1][(2*i-1)]+x[1][(2*i+1)])+x[1][2*i]), SIG_SHIFT+3); x_lp[0] += SHR32(HALF32(HALF32(x[1][1])+x[1][0]), SIG_SHIFT+3); } _celt_autocorr(x_lp, ac, NULL, 0, 4, len>>1); /* Noise floor -40 dB */ #ifdef FIXED_POINT ac[0] += SHR32(ac[0],13); #else ac[0] *= 1.0001f; #endif /* Lag windowing */ for (i=1;i<=4;i++) { /*ac[i] *= exp(-.5*(2*M_PI*.002*i)*(2*M_PI*.002*i));*/ #ifdef FIXED_POINT ac[i] -= MULT16_32_Q15(2*i*i, ac[i]); #else ac[i] -= ac[i]*(.008f*i)*(.008f*i); #endif } _celt_lpc(lpc, ac, 4); for (i=0;i<4;i++) { tmp = MULT16_16_Q15(QCONST16(.9f,15), tmp); lpc[i] = MULT16_16_Q15(lpc[i], tmp); } fir(x_lp, lpc, x_lp, len>>1, 4, mem); mem[0]=0; lpc[0]=QCONST16(.8f,12); fir(x_lp, lpc, x_lp, len>>1, 1, mem); } void pitch_search(const celt_word16 * restrict x_lp, celt_word16 * restrict y, int len, int max_pitch, int *pitch) { int i, j; int lag; int best_pitch[2]={0}; VARDECL(celt_word16, x_lp4); VARDECL(celt_word16, y_lp4); VARDECL(celt_word32, xcorr); celt_word32 maxcorr=1; int offset; int shift=0; SAVE_STACK; lag = len+max_pitch; ALLOC(x_lp4, len>>2, celt_word16); ALLOC(y_lp4, lag>>2, celt_word16); ALLOC(xcorr, max_pitch>>1, celt_word32); /* Downsample by 2 again */ for (j=0;j>2;j++) x_lp4[j] = x_lp[2*j]; for (j=0;j>2;j++) y_lp4[j] = y[2*j]; #ifdef FIXED_POINT shift = celt_ilog2(MAX16(1, MAX16(celt_maxabs16(x_lp4, len>>2), celt_maxabs16(y_lp4, lag>>2))))-11; if (shift>0) { for (j=0;j>2;j++) x_lp4[j] = SHR16(x_lp4[j], shift); for (j=0;j>2;j++) y_lp4[j] = SHR16(y_lp4[j], shift); /* Use double the shift for a MAC */ shift *= 2; } else { shift = 0; } #endif /* Coarse search with 4x decimation */ for (i=0;i>2;i++) { celt_word32 sum = 0; for (j=0;j>2;j++) sum = MAC16_16(sum, x_lp4[j],y_lp4[i+j]); xcorr[i] = MAX32(-1, sum); maxcorr = MAX32(maxcorr, sum); } find_best_pitch(xcorr, maxcorr, y_lp4, 0, len>>2, max_pitch>>2, best_pitch); /* Finer search with 2x decimation */ maxcorr=1; for (i=0;i>1;i++) { celt_word32 sum=0; xcorr[i] = 0; if (abs(i-2*best_pitch[0])>2 && abs(i-2*best_pitch[1])>2) continue; for (j=0;j>1;j++) sum += SHR32(MULT16_16(x_lp[j],y[i+j]), shift); xcorr[i] = MAX32(-1, sum); maxcorr = MAX32(maxcorr, sum); } find_best_pitch(xcorr, maxcorr, y, shift, len>>1, max_pitch>>1, best_pitch); /* Refine by pseudo-interpolation */ if (best_pitch[0]>0 && best_pitch[0]<(max_pitch>>1)-1) { celt_word32 a, b, c; a = xcorr[best_pitch[0]-1]; b = xcorr[best_pitch[0]]; c = xcorr[best_pitch[0]+1]; if ((c-a) > MULT16_32_Q15(QCONST16(.7f,15),b-a)) offset = 1; else if ((a-c) > MULT16_32_Q15(QCONST16(.7f,15),b-c)) offset = -1; else offset = 0; } else { offset = 0; } *pitch = 2*best_pitch[0]-offset; RESTORE_STACK; } #ifdef ENABLE_POSTFILTER static const int second_check[16] = {0, 0, 3, 2, 3, 2, 5, 2, 3, 2, 3, 2, 5, 2, 3, 2}; celt_word16 remove_doubling(celt_word16 *x, int maxperiod, int minperiod, int N, int *_T0, int prev_period, celt_word16 prev_gain) { int k, i, T, T0; celt_word16 g, g0; celt_word16 pg; celt_word32 xy,xx,yy; celt_word32 xcorr[3]; celt_word32 best_xy, best_yy; int offset; int minperiod0; minperiod0 = minperiod; maxperiod /= 2; minperiod /= 2; *_T0 /= 2; prev_period /= 2; N /= 2; x += maxperiod; if (*_T0>=maxperiod) *_T0=maxperiod-1; T = T0 = *_T0; xx=xy=yy=0; for (i=0;i>1; t = VSHR32(x2y2, 2*(sh-7)); g = g0 = VSHR32(MULT16_32_Q15(celt_rsqrt_norm(t), xy),sh+1); } #else g = g0 = xy/sqrt(1+xx*yy); #endif /* Look for any pitch at T/k */ for (k=2;k<=15;k++) { int T1, T1b; celt_word16 g1; celt_word16 cont=0; T1 = (2*T0+k)/(2*k); if (T1 < minperiod) break; /* Look for another strong correlation at T1b */ if (k==2) { if (T1+T0>maxperiod) T1b = T0; else T1b = T0+T1; } else { T1b = (2*second_check[k]*T0+k)/(2*k); } xy=yy=0; for (i=0;i>1; t = VSHR32(x2y2, 2*(sh-7)); g1 = VSHR32(MULT16_32_Q15(celt_rsqrt_norm(t), xy),sh+1); } #else g1 = xy/sqrt(1+2.f*xx*1.f*yy); #endif if (abs(T1-prev_period)<=1) cont = prev_gain; else if (abs(T1-prev_period)<=2 && 5*k*k < T0) cont = HALF32(prev_gain); else cont = 0; if (g1 > QCONST16(.3f,15) + MULT16_16_Q15(QCONST16(.4f,15),g0)-cont) { best_xy = xy; best_yy = yy; T = T1; g = g1; } } if (best_yy <= best_xy) pg = Q15ONE; else pg = SHR32(frac_div32(best_xy,best_yy+1),16); for (k=0;k<3;k++) { int T1 = T+k-1; xy = 0; for (i=0;i MULT16_32_Q15(QCONST16(.7f,15),xcorr[1]-xcorr[0])) offset = 1; else if ((xcorr[0]-xcorr[2]) > MULT16_32_Q15(QCONST16(.7f,15),xcorr[1]-xcorr[2])) offset = -1; else offset = 0; if (pg > g) pg = g; *_T0 = 2*T+offset; if (*_T0offs+_this->end_offs>=_this->storage)return -1; _this->buf[_this->offs++]=(unsigned char)_value; return 0; } static int ec_write_byte_at_end(ec_enc *_this,unsigned _value){ if(_this->offs+_this->end_offs>=_this->storage)return -1; _this->buf[_this->storage-++(_this->end_offs)]=(unsigned char)_value; return 0; } /*Outputs a symbol, with a carry bit. If there is a potential to propagate a carry over several symbols, they are buffered until it can be determined whether or not an actual carry will occur. If the counter for the buffered symbols overflows, then the stream becomes undecodable. This gives a theoretical limit of a few billion symbols in a single packet on 32-bit systems. The alternative is to truncate the range in order to force a carry, but requires similar carry tracking in the decoder, needlessly slowing it down.*/ static void ec_enc_carry_out(ec_enc *_this,int _c){ if(_c!=EC_SYM_MAX){ /*No further carry propagation possible, flush buffer.*/ int carry; carry=_c>>EC_SYM_BITS; /*Don't output a byte on the first write. This compare should be taken care of by branch-prediction thereafter.*/ if(_this->rem>=0)_this->error|=ec_write_byte(_this,_this->rem+carry); if(_this->ext>0){ unsigned sym; sym=EC_SYM_MAX+carry&EC_SYM_MAX; do _this->error|=ec_write_byte(_this,sym); while(--(_this->ext)>0); } _this->rem=_c&EC_SYM_MAX; } else _this->ext++; } static void ec_enc_normalize(ec_enc *_this){ /*If the range is too small, output some bits and rescale it.*/ while(_this->rng<=EC_CODE_BOT){ ec_enc_carry_out(_this,(int)(_this->val>>EC_CODE_SHIFT)); /*Move the next-to-high-order symbol into the high-order position.*/ _this->val=_this->val<rng<<=EC_SYM_BITS; _this->nbits_total+=EC_SYM_BITS; } } void ec_enc_init(ec_enc *_this,unsigned char *_buf,ec_uint32 _size){ _this->buf=_buf; _this->end_offs=0; _this->end_window=0; _this->nend_bits=0; /*This is the offset from which ec_tell() will subtract partial bits.*/ _this->nbits_total=EC_CODE_BITS+1; _this->offs=0; _this->rng=EC_CODE_TOP; _this->rem=-1; _this->val=0; _this->ext=0; _this->storage=_size; _this->error=0; } void ec_encode(ec_enc *_this,unsigned _fl,unsigned _fh,unsigned _ft){ ec_uint32 r; r=_this->rng/_ft; if(_fl>0){ _this->val+=_this->rng-IMUL32(r,(_ft-_fl)); _this->rng=IMUL32(r,(_fh-_fl)); } else _this->rng-=IMUL32(r,(_ft-_fh)); ec_enc_normalize(_this); } void ec_encode_bin(ec_enc *_this,unsigned _fl,unsigned _fh,unsigned _bits){ ec_uint32 r; r=_this->rng>>_bits; if(_fl>0){ _this->val+=_this->rng-IMUL32(r,((1<<_bits)-_fl)); _this->rng=IMUL32(r,(_fh-_fl)); } else _this->rng-=IMUL32(r,((1<<_bits)-_fh)); ec_enc_normalize(_this); } /*The probability of having a "one" is 1/(1<<_logp).*/ void ec_enc_bit_logp(ec_enc *_this,int _val,unsigned _logp){ ec_uint32 r; ec_uint32 s; ec_uint32 l; r=_this->rng; l=_this->val; s=r>>_logp; r-=s; if(_val)_this->val=l+r; _this->rng=_val?s:r; ec_enc_normalize(_this); } void ec_enc_icdf(ec_enc *_this,int _s,const unsigned char *_icdf,unsigned _ftb){ ec_uint32 r; r=_this->rng>>_ftb; if(_s>0){ _this->val+=_this->rng-IMUL32(r,_icdf[_s-1]); _this->rng=IMUL32(r,_icdf[_s-1]-_icdf[_s]); } else _this->rng-=IMUL32(r,_icdf[_s]); ec_enc_normalize(_this); } void ec_enc_uint(ec_enc *_this,ec_uint32 _fl,ec_uint32 _ft){ unsigned ft; unsigned fl; int ftb; /*In order to optimize EC_ILOG(), it is undefined for the value 0.*/ celt_assert(_ft>1); _ft--; ftb=EC_ILOG(_ft); if(ftb>EC_UINT_BITS){ ftb-=EC_UINT_BITS; ft=(_ft>>ftb)+1; fl=(unsigned)(_fl>>ftb); ec_encode(_this,fl,fl+1,ft); ec_enc_bits(_this,_fl&((ec_uint32)1<end_window; used=_this->nend_bits; if(used+_bits>EC_WINDOW_SIZE){ do{ _this->error|=ec_write_byte_at_end(_this,(unsigned)window&EC_SYM_MAX); window>>=EC_SYM_BITS; used-=EC_SYM_BITS; } while(used>=EC_SYM_BITS); } window|=(ec_window)_fl<end_window=window; _this->nend_bits=used; _this->nbits_total+=_bits; } void ec_enc_patch_initial_bits(ec_enc *_this,unsigned _val,unsigned _nbits){ int shift; unsigned mask; celt_assert(_nbits<=EC_SYM_BITS); shift=EC_SYM_BITS-_nbits; mask=(1<<_nbits)-1<offs>0){ /*The first byte has been finalized.*/ _this->buf[0]=(unsigned char)(_this->buf[0]&~mask|_val<rem>=0){ /*The first byte is still awaiting carry propagation.*/ _this->rem=_this->rem&~mask|_val<rng<=EC_CODE_TOP>>shift){ /*The renormalization loop has never been run.*/ _this->val=_this->val&~((ec_uint32)mask<error=-1; } void ec_enc_shrink(ec_enc *_this,ec_uint32 _size){ celt_assert(_this->offs+_this->end_offs<=_size); CELT_MOVE(_this->buf+_size-_this->end_offs, _this->buf+_this->storage-_this->end_offs,_this->end_offs); _this->storage=_size; } void ec_enc_done(ec_enc *_this){ ec_window window; int used; ec_uint32 msk; ec_uint32 end; int l; /*We output the minimum number of bits that ensures that the symbols encoded thus far will be decoded correctly regardless of the bits that follow.*/ l=EC_CODE_BITS-EC_ILOG(_this->rng); msk=EC_CODE_TOP-1>>l; end=_this->val+msk&~msk; if((end|msk)>=_this->val+_this->rng){ l++; msk>>=1; end=_this->val+msk&~msk; } while(l>0){ ec_enc_carry_out(_this,(int)(end>>EC_CODE_SHIFT)); end=end<rem>=0||_this->ext>0)ec_enc_carry_out(_this,0); /*If we have buffered extra bits, flush them as well.*/ window=_this->end_window; used=_this->nend_bits; while(used>=EC_SYM_BITS){ _this->error|=ec_write_byte_at_end(_this,(unsigned)window&EC_SYM_MAX); window>>=EC_SYM_BITS; used-=EC_SYM_BITS; } /*Clear any excess space and add any remaining extra bits to the last byte.*/ if(!_this->error){ CELT_MEMSET(_this->buf+_this->offs,0, _this->storage-_this->offs-_this->end_offs); if(used>0){ /*If there's no range coder data at all, give up.*/ if(_this->end_offs>=_this->storage)_this->error=-1; else{ l=-l; /*If we've busted, don't add too many extra bits to the last byte; it would corrupt the range coder data, and that's more important.*/ if(_this->offs+_this->end_offs>=_this->storage&&lerror=-1; } } _this->buf[_this->storage-_this->end_offs-1]|=(unsigned char)window; } } } mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/ecintrin.h0000664000175000017500000001227314010707315022244 0ustar builderbuilder/* Copyright (c) 2003-2008 Timothy B. Terriberry Copyright (c) 2008 Xiph.Org Foundation */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /*Some common macros for potential platform-specific optimization.*/ #include #include #if !defined(_ecintrin_H) # define _ecintrin_H (1) /*Some specific platforms may have optimized intrinsic or inline assembly versions of these functions which can substantially improve performance. We define macros for them to allow easy incorporation of these non-ANSI features.*/ /*Note that we do not provide a macro for abs(), because it is provided as a library function, which we assume is translated into an intrinsic to avoid the function call overhead and then implemented in the smartest way for the target platform. With modern gcc (4.x), this is true: it uses cmov instructions if the architecture supports it and branchless bit-twiddling if it does not (the speed difference between the two approaches is not measurable). Interestingly, the bit-twiddling method was patented in 2000 (US 6,073,150) by Sun Microsystems, despite prior art dating back to at least 1996: http://web.archive.org/web/19961201174141/www.x86.org/ftp/articles/pentopt/PENTOPT.TXT On gcc 3.x, however, our assumption is not true, as abs() is translated to a conditional jump, which is horrible on deeply piplined architectures (e.g., all consumer architectures for the past decade or more) when the sign cannot be reliably predicted.*/ /*Modern gcc (4.x) can compile the naive versions of min and max with cmov if given an appropriate architecture, but the branchless bit-twiddling versions are just as fast, and do not require any special target architecture. Earlier gcc versions (3.x) compiled both code to the same assembly instructions, because of the way they represented ((_b)>(_a)) internally.*/ #define EC_MAXI(_a,_b) ((_a)-((_a)-(_b)&-((_b)>(_a)))) #define EC_MINI(_a,_b) ((_a)+((_b)-(_a)&-((_b)<(_a)))) /*This has a chance of compiling branchless, and is just as fast as the bit-twiddling method, which is slightly less portable, since it relies on a sign-extended rightshift, which is not guaranteed by ANSI (but present on every relevant platform).*/ #define EC_SIGNI(_a) (((_a)>0)-((_a)<0)) /*Slightly more portable than relying on a sign-extended right-shift (which is not guaranteed by ANSI), and just as fast, since gcc (3.x and 4.x both) compile it into the right-shift anyway.*/ #define EC_SIGNMASK(_a) (-((_a)<0)) /*Clamps an integer into the given range. If _a>_c, then the lower bound _a is respected over the upper bound _c (this behavior is required to meet our documented API behavior). _a: The lower bound. _b: The value to clamp. _c: The upper boud.*/ #define EC_CLAMPI(_a,_b,_c) (EC_MAXI(_a,EC_MINI(_b,_c))) /*Count leading zeros. This macro should only be used for implementing ec_ilog(), if it is defined. All other code should use EC_ILOG() instead.*/ #if defined(_MSC_VER) # include static __inline int ec_bsr(unsigned long _x){ unsigned long ret; _BitScanReverse(&ret,_x); return (int)ret; } # define EC_CLZ0 (1) # define EC_CLZ(_x) (-ec_bsr(_x)) #elif defined(ENABLE_TI_DSPLIB) # include "dsplib.h" # define EC_CLZ0 (31) # define EC_CLZ(_x) (_lnorm(x)) #elif defined(__GNUC_PREREQ) # if __GNUC_PREREQ(3,4) # if INT_MAX>=2147483647 # define EC_CLZ0 ((int)sizeof(unsigned)*CHAR_BIT) # define EC_CLZ(_x) (__builtin_clz(_x)) # elif LONG_MAX>=2147483647L # define EC_CLZ0 ((int)sizeof(unsigned long)*CHAR_BIT) # define EC_CLZ(_x) (__builtin_clzl(_x)) # endif # endif #endif #if defined(EC_CLZ) /*Note that __builtin_clz is not defined when _x==0, according to the gcc documentation (and that of the BSR instruction that implements it on x86). The majority of the time we can never pass it zero. When we need to, it can be special cased.*/ # define EC_ILOG(_x) (EC_CLZ0-EC_CLZ(_x)) #else # define EC_ILOG(_x) (ec_ilog(_x)) #endif #endif mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/mfrngcod.h0000664000175000017500000000504314010707315022225 0ustar builderbuilder/* Copyright (c) 2001-2008 Timothy B. Terriberry Copyright (c) 2008-2009 Xiph.Org Foundation */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if !defined(_mfrngcode_H) # define _mfrngcode_H (1) # include "entcode.h" /*Constants used by the entropy encoder/decoder.*/ /*The number of bits to output at a time.*/ # define EC_SYM_BITS (8) /*The total number of bits in each of the state registers.*/ # define EC_CODE_BITS (32) /*The maximum symbol value.*/ # define EC_SYM_MAX ((1U<>EC_SYM_BITS) /*Code for which propagating carries are possible.*/ # define EC_CODE_CARRY (((ec_uint32)EC_SYM_MAX)< */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* Version 1.1 */ #ifndef FLOAT_CAST_H #define FLOAT_CAST_H /*============================================================================ ** On Intel Pentium processors (especially PIII and probably P4), converting ** from float to int is very slow. To meet the C specs, the code produced by ** most C compilers targeting Pentium needs to change the FPU rounding mode ** before the float to int conversion is performed. ** ** Changing the FPU rounding mode causes the FPU pipeline to be flushed. It ** is this flushing of the pipeline which is so slow. ** ** Fortunately the ISO C99 specifications define the functions lrint, lrintf, ** llrint and llrintf which fix this problem as a side effect. ** ** On Unix-like systems, the configure process should have detected the ** presence of these functions. If they weren't found we have to replace them ** here with a standard C cast. */ /* ** The C99 prototypes for lrint and lrintf are as follows: ** ** long int lrintf (float x) ; ** long int lrint (double x) ; */ /* The presence of the required functions are detected during the configure ** process and the values HAVE_LRINT and HAVE_LRINTF are set accordingly in ** the config.h file. */ #if (HAVE_LRINTF) /*#if 0*/ /* These defines enable functionality introduced with the 1999 ISO C ** standard. They must be defined before the inclusion of math.h to ** engage them. If optimisation is enabled, these functions will be ** inlined. With optimisation switched off, you have to link in the ** maths library using -lm. */ #define _ISOC9X_SOURCE 1 #define _ISOC99_SOURCE 1 #define __USE_ISOC9X 1 #define __USE_ISOC99 1 #include #define float2int(x) lrintf(x) #elif (defined(HAVE_LRINT)) #define _ISOC9X_SOURCE 1 #define _ISOC99_SOURCE 1 #define __USE_ISOC9X 1 #define __USE_ISOC99 1 #include #define float2int(x) lrint(x) #elif (defined (WIN64) || defined (_WIN64)) #include __inline long int float2int(float value) { return _mm_cvtss_si32(_mm_load_ss(&value)); } #elif (defined (WIN32) || defined (_WIN32)) #include /* Win32 doesn't seem to have these functions. ** Therefore implement inline versions of these functions here. */ __inline long int float2int (float flt) { int intgr; _asm { fld flt fistp intgr } ; return intgr ; } #else #ifdef __GNUC__ /* supported by gcc, but not by all other compilers*/ #warning "Don't have the functions lrint() and lrintf ()." #warning "Replacing these functions with a standard C cast." #endif /* __GNUC__ */ #include #define float2int(flt) ((int)(floor(.5+flt))) #endif #endif /* FLOAT_CAST_H */ mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/os_support.h0000664000175000017500000000711514010707315022645 0ustar builderbuilder/* Copyright (C) 2007 Jean-Marc Valin File: os_support.h This is the (tiny) OS abstraction layer. Aside from math.h, this is the only place where system headers are allowed. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef OS_SUPPORT_H #define OS_SUPPORT_H #ifdef CUSTOM_SUPPORT # include "custom_support.h" #endif #include #include #include /** CELT wrapper for calloc(). To do your own dynamic allocation, all you need to do is replace this function, celt_realloc and celt_free NOTE: celt_alloc needs to CLEAR THE MEMORY */ #ifndef OVERRIDE_CELT_ALLOC static inline void *celt_alloc (int size) { /* WARNING: this is not equivalent to malloc(). If you want to use malloc() or your own allocator, YOU NEED TO CLEAR THE MEMORY ALLOCATED. Otherwise you will experience strange bugs */ return calloc(size,1); } #endif /** Same as celt_alloc(), except that the area is only needed inside a CELT call (might cause problem with wideband though) */ #ifndef OVERRIDE_CELT_ALLOC_SCRATCH static inline void *celt_alloc_scratch (int size) { /* Scratch space doesn't need to be cleared */ return calloc(size,1); } #endif /** CELT wrapper for free(). To do your own dynamic allocation, all you need to do is replace this function, celt_realloc and celt_alloc */ #ifndef OVERRIDE_CELT_FREE static inline void celt_free (void *ptr) { free(ptr); } #endif /** Same as celt_free(), except that the area is only needed inside a CELT call (might cause problem with wideband though) */ #ifndef OVERRIDE_CELT_FREE_SCRATCH static inline void celt_free_scratch (void *ptr) { free(ptr); } #endif /** Copy n bytes of memory from src to dst. The 0* term provides compile-time type checking */ #ifndef OVERRIDE_CELT_COPY #define CELT_COPY(dst, src, n) (memcpy((dst), (src), (n)*sizeof(*(dst)) + 0*((dst)-(src)) )) #endif /** Copy n bytes of memory from src to dst, allowing overlapping regions. The 0* term provides compile-time type checking */ #ifndef OVERRIDE_CELT_MOVE #define CELT_MOVE(dst, src, n) (memmove((dst), (src), (n)*sizeof(*(dst)) + 0*((dst)-(src)) )) #endif /** Set n bytes of memory to value of c, starting at address s */ #ifndef OVERRIDE_CELT_MEMSET #define CELT_MEMSET(dst, c, n) (memset((dst), (c), (n)*sizeof(*(dst)))) #endif /*#ifdef __GNUC__ #pragma GCC poison printf sprintf #pragma GCC poison malloc free realloc calloc #endif*/ #endif /* OS_SUPPORT_H */ mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/cwrs.h0000664000175000017500000000347714010707315021415 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Copyright (c) 2007-2009 Timothy B. Terriberry Written by Timothy B. Terriberry and Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef CWRS_H #define CWRS_H #include "arch.h" #include "stack_alloc.h" #include "entenc.h" #include "entdec.h" int log2_frac(ec_uint32 val, int frac); void get_required_bits(celt_int16 *bits, int N, int K, int frac); void encode_pulses(const int *_y, int N, int K, ec_enc *enc); void decode_pulses(int *_y, int N, int K, ec_dec *dec); #endif /* CWRS_H */ mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/bands.h0000664000175000017500000001020414010707315021510 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Copyright (c) 2008-2009 Gregory Maxwell Written by Jean-Marc Valin and Gregory Maxwell */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef BANDS_H #define BANDS_H #include "arch.h" #include "modes.h" #include "entenc.h" #include "entdec.h" #include "rate.h" /** Compute the amplitude (sqrt energy) in each of the bands * @param m Mode data * @param X Spectrum * @param bands Square root of the energy for each band (returned) */ void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *bands, int end, int _C, int M); /*void compute_noise_energies(const CELTMode *m, const celt_sig *X, const celt_word16 *tonality, celt_ener *bank);*/ /** Normalise each band of X such that the energy in each band is equal to 1 * @param m Mode data * @param X Spectrum (returned normalised) * @param bands Square root of the energy for each band */ void normalise_bands(const CELTMode *m, const celt_sig * restrict freq, celt_norm * restrict X, const celt_ener *bands, int end, int _C, int M); /** Denormalise each band of X to restore full amplitude * @param m Mode data * @param X Spectrum (returned de-normalised) * @param bands Square root of the energy for each band */ void denormalise_bands(const CELTMode *m, const celt_norm * restrict X, celt_sig * restrict freq, const celt_ener *bands, int end, int _C, int M); #define SPREAD_NONE (0) #define SPREAD_LIGHT (1) #define SPREAD_NORMAL (2) #define SPREAD_AGGRESSIVE (3) int spreading_decision(const CELTMode *m, celt_norm *X, int *average, int last_decision, int *hf_average, int *tapset_decision, int update_hf, int end, int _C, int M); #ifdef MEASURE_NORM_MSE void measure_norm_mse(const CELTMode *m, float *X, float *X0, float *bandE, float *bandE0, int M, int N, int C); #endif void haar1(celt_norm *X, int N0, int stride); /** Quantisation/encoding of the residual spectrum * @param m Mode data * @param X Residual (normalised) * @param total_bits Total number of bits that can be used for the frame (including the ones already spent) * @param enc Entropy encoder */ void quant_all_bands(int encode, const CELTMode *m, int start, int end, celt_norm * X, celt_norm * Y, unsigned char *collapse_masks, const celt_ener *bandE, int *pulses, int time_domain, int fold, int dual_stereo, int intensity, int *tf_res, int resynth, celt_int32 total_bits, celt_int32 balance, ec_ctx *ec, int M, int codedBands, ec_uint32 *seed); void stereo_decision(const CELTMode *m, celt_norm * restrict X, int *stereo_mode, int len, int M); void anti_collapse(const CELTMode *m, celt_norm *_X, unsigned char *collapse_masks, int LM, int C, int CC, int size, int start, int end, celt_word16 *logE, celt_word16 *prev1logE, celt_word16 *prev2logE, int *pulses, celt_uint32 seed); celt_uint32 lcg_rand(celt_uint32 seed); #endif /* BANDS_H */ mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/testcelt.c0000664000175000017500000001362214010707315022252 0ustar builderbuilder/* Copyright (c) 2007-2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "celt.h" #include "arch.h" #include #include #include #include #define MAX_PACKET 1275 int main(int argc, char *argv[]) { int err; char *inFile, *outFile; FILE *fin, *fout; CELTMode *mode=NULL; CELTEncoder *enc; CELTDecoder *dec; int len; celt_int32 frame_size, channels; int bytes_per_packet; unsigned char data[MAX_PACKET]; int rate; int complexity; #if !(defined (FIXED_POINT) && !defined(CUSTOM_MODES)) int i; double rmsd = 0; #endif int count = 0; celt_int32 skip; celt_int16 *in, *out; if (argc != 9 && argc != 8 && argc != 7) { fprintf (stderr, "Usage: testcelt " " [ [packet loss rate]] " " \n"); return 1; } rate = atoi(argv[1]); channels = atoi(argv[2]); frame_size = atoi(argv[3]); mode = celt_mode_create(rate, frame_size, NULL); if (mode == NULL) { fprintf(stderr, "failed to create a mode\n"); return 1; } celt_mode_info(mode, CELT_GET_LOOKAHEAD, &skip); bytes_per_packet = atoi(argv[4]); if (bytes_per_packet < 0 || bytes_per_packet > MAX_PACKET) { fprintf (stderr, "bytes per packet must be between 0 and %d\n", MAX_PACKET); return 1; } inFile = argv[argc-2]; fin = fopen(inFile, "rb"); if (!fin) { fprintf (stderr, "Could not open input file %s\n", argv[argc-2]); return 1; } outFile = argv[argc-1]; fout = fopen(outFile, "wb+"); if (!fout) { fprintf (stderr, "Could not open output file %s\n", argv[argc-1]); return 1; } enc = celt_encoder_create_custom(mode, channels, &err); if (err != 0) { fprintf(stderr, "Failed to create the encoder: %s\n", celt_strerror(err)); return 1; } dec = celt_decoder_create_custom(mode, channels, &err); if (err != 0) { fprintf(stderr, "Failed to create the decoder: %s\n", celt_strerror(err)); return 1; } if (argc>7) { complexity=atoi(argv[5]); celt_encoder_ctl(enc,CELT_SET_COMPLEXITY(complexity)); } in = (celt_int16*)malloc(frame_size*channels*sizeof(celt_int16)); out = (celt_int16*)malloc(frame_size*channels*sizeof(celt_int16)); while (!feof(fin)) { err = fread(in, sizeof(short), frame_size*channels, fin); if (feof(fin)) break; len = celt_encode(enc, in, frame_size, data, bytes_per_packet); if (len <= 0) fprintf (stderr, "celt_encode() failed: %s\n", celt_strerror(len)); /* This is for simulating bit errors */ #if 0 int errors = 0; int eid = 0; /* This simulates random bit error */ for (i=0;i 0) { rmsd = sqrt(rmsd/(1.0*frame_size*channels*count)); fprintf (stderr, "Error: encoder doesn't match decoder\n"); fprintf (stderr, "RMS mismatch is %f\n", rmsd); return 1; } else { fprintf (stderr, "Encoder matches decoder!!\n"); } #endif return 0; } mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/libcelt.vcxproj.filters0000664000175000017500000001143214010707315024756 0ustar builderbuilder {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt/laplace.h0000664000175000017500000000413114010707315022024 0ustar builderbuilder/* Copyright (c) 2007 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "entenc.h" #include "entdec.h" /** Encode a value that is assumed to be the realisation of a Laplace-distributed random process @param enc Entropy encoder state @param value Value to encode @param fs Probability of 0, multiplied by 32768 @param decay Probability of the value +/- 1, multiplied by 16384 */ void ec_laplace_encode(ec_enc *enc, int *value, int fs, int decay); /** Decode a value that is assumed to be the realisation of a Laplace-distributed random process @param dec Entropy decoder state @param fs Probability of 0, multiplied by 32768 @param decay Probability of the value +/- 1, multiplied by 16384 @return Value decoded */ int ec_laplace_decode(ec_dec *dec, int fs, int decay); mumble-1.3.4/3rdparty/celt-0.11.0-src/README0000664000175000017500000001024714010707315017521 0ustar builderbuilderCELT is a very low delay audio codec designed for high-quality communications. Traditional full-bandwidth codecs such as Vorbis and AAC can offer high quality but they require codec delays of hundreds of milliseconds, which makes them unsuitable for real-time interactive applications like tele- conferencing. Speech targeted codecs, such as Speex or G.722, have lower 20-40ms delays but their speech focus and limited sampling rates restricts their quality, especially for music. Additionally, the other mandatory components of a full network audio system— audio interfaces, routers, jitter buffers— each add their own delay. For lower speed networks the time it takes to serialize a packet onto the network cable takes considerable time, and over the long distances the speed of light imposes a significant delay. In teleconferencing— it is important to keep delay low so that the participants can communicate fluidly without talking on top of each other and so that their own voices don't return after a round trip as an annoying echo. For network music performance— research has show that the total one way delay must be kept under 25ms to avoid degrading the musicians performance. Since many of the sources of delay in a complete system are outside of the user's control (such as the speed of light) it is often only possible to reduce the total delay by reducing the codec delay. Low delay has traditionally been considered a challenging area in audio codec design, because as a codec is forced to work on the smaller chunks of audio required for low delay it has access to less redundancy and less perceptual information which it can use to reduce the size of the transmitted audio. CELT is designed to bridge the gap between "music" and "speech" codecs, permitting new very high quality teleconferencing applications, and to go further, permitting latencies much lower than speech codecs normally provide to enable applications such as remote musical collaboration even over long distances. In keeping with the Xiph.Org mission— CELT is also designed to accomplish this without copyright or patent encumbrance. Only by keeping the formats that drive our Internet communication free and unencumbered can we maximize innovation, collaboration, and interoperability. Fortunately, CELT is ahead of the adoption curve in its target application space, so there should be no reason for someone who needs what CELT provides to go with a proprietary codec. CELT has been tested on x86, x86_64, ARM, and the TI C55x DSPs, and should be portable to any platform with a working C compiler and on the order of 100 MIPS of processing power. The code is still in early stage, so it may be broken from time to time, and the bit-stream is not frozen yet, so it is different from one version to another. Oh, and don't complain if it sets your house on fire. Complaints and accolades can be directed to the CELT mailing list: http://lists.xiph.org/mailman/listinfo/celt-dev/ To compile: % ./configure % make For platforms without fast floating point support (such as ARM) use the --enable-fixed argument to configure to build a fixed-point version of CELT. There are Ogg-based encode/decode tools in tools/. These are quite similar to the speexenc/speexdec tools. Use the --help option for details. There is also a basic tool for testing the encoder and decoder called "testcelt" located in libcelt/: % testcelt input.sw output.sw where input.sw is a 16-bit (machine endian) audio file sampled at 32000 Hz to 96000 Hz. The output file is already decompressed. For example, for a 44.1 kHz mono stream at ~64kbit/sec and with 256 sample frames: % testcelt 44100 1 256 46 intput.sw output.sw Since 44100/256*46*8 = 63393.74 bits/sec. All even frame sizes from 64 to 512 are currently supported, although power-of-two sizes are recommended and most CELT development is done using a size of 256. The delay imposed by CELT is 1.25x - 1.5x the frame duration depending on the frame size and some details of CELT's internal operation. For 256 sample frames the delay is 1.5x or 384 samples, so the total codec delay in the above example is 8.70ms (1000/(44100/384)). mumble-1.3.4/3rdparty/celt-0.11.0-src/TODO0000664000175000017500000000122614010707315017326 0ustar builderbuilder- Check minimum width of bands - Revisit energy resolution based on the bit-rate - Revisit static bit allocation (as a function of frame size and channels) - Dynamic adjustment of energy quantisation - Psychacoustics * Error shaping within each band * Decisions on the rate - Intensity stereo decisions - Dynamic (intra-frame) bit allocation - Joint encoding of stereo energy - Encode band shape (or just tilt)? - Make energy encoding more robust to losses? Misc: Detect uint decoding and flag them in the decoder directly If we attempt to write too many bits on the encoder side, set a flag instead of aborting Save "raw bytes" at the end of the stream mumble-1.3.4/3rdparty/celt-0.11.0-src/COPYING0000664000175000017500000000247614010707315017701 0ustar builderbuilderCopyright 2001-2009 Jean-Marc Valin, Timothy B. Terriberry, CSIRO, and other contributors Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. mumble-1.3.4/3rdparty/celt-0.11.0-src/INSTALL0000664000175000017500000000003714010707315017666 0ustar builderbuilderTo compile: ./configure make mumble-1.3.4/3rdparty/celt-0.11.0-src/libcelt.spec.in0000664000175000017500000000360114010707315021534 0ustar builderbuilderSummary: The CELT Low-Latency Audio Compression Codec. Name: libcelt Version: @CELT_VERSION@ Release: 0%{?dist} Epoch: 0 Group: System Environment/Libraries License: BSD URL: http://www.xiph.org/ Source: http://downloads.xiph.org/releases/celt/celt-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: libogg-devel >= 2:1.1 Requires: pkg-config %description CELT is a fully open, non-proprietary, patent- and royalty-free, low-latency compressed audio format for voice and music. The libcelt package contains runtime libraries for use in programs that support Ogg CELT. %package devel Summary: Files for CELT application development. Group: Development/Libraries Requires: libogg-devel >= 2:1.1 Requires: libcelt = %{epoch}:%{version}-%{release} %description devel The libcelt-devel package contains the header files and documentation needed to develop applications with Ogg CELT. %package utils Summary: CELT codec utilities. Group: Applications/Multimedia Requires: libcelt = %{epoch}:%{version}-%{release} %description utils Basic utilities for encoding, decoding and manipulating Ogg CELT streams. %prep %setup -q -n celt-%{version} %build %configure --with-ogg-libraries=%{_libdir} make %check make check %install rm -rf $RPM_BUILD_ROOT make DESTDIR=$RPM_BUILD_ROOT install # remove unpackaged files from the buildroot rm -f $RPM_BUILD_ROOT%{_libdir}/*.la rm -f $RPM_BUILD_ROOT%{_libdir}/*.a %files %defattr(-,root,root) %doc AUTHORS COPYING README %{_libdir}/libcelt.so.* %files devel %defattr(-,root,root) %{_includedir}/celt %{_libdir}/libcelt.so %{_libdir}/pkgconfig/*.pc %files utils %defattr(-,root,root) %{_bindir}/celtenc %{_bindir}/celtdec %clean rm -rf $RPM_BUILD_ROOT %post -p /sbin/ldconfig %postun -p /sbin/ldconfig %changelog * Mon Dec 22 2008 Monty Montgomery 0.5.1-0 - initial spec file created mumble-1.3.4/3rdparty/celt-0.11.0-src/autogen.sh0000775000175000017500000000642214010707315020642 0ustar builderbuilder#!/bin/sh # Run this to set up the build system: configure, makefiles, etc. # (based on the version in enlightenment's cvs) package="celt" olddir=`pwd` srcdir=`dirname $0` test -z "$srcdir" && srcdir=. cd "$srcdir" DIE=0 echo "checking for autoconf... " (autoconf --version) < /dev/null > /dev/null 2>&1 || { echo echo "You must have autoconf installed to compile $package." echo "Download the appropriate package for your distribution," echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" DIE=1 } VERSIONGREP="sed -e s/.*[^0-9\.]\([0-9]\.[0-9]*\).*/\1/" VERSIONMKINT="sed -e s/[^0-9]//" # do we need automake? if test -r Makefile.am; then AM_NEEDED=`fgrep AUTOMAKE_OPTIONS Makefile.am | $VERSIONGREP` if test -z $AM_NEEDED; then echo -n "checking for automake... " AUTOMAKE=automake ACLOCAL=aclocal if ($AUTOMAKE --version < /dev/null > /dev/null 2>&1); then echo "no" AUTOMAKE= else echo "yes" fi else echo -n "checking for automake $AM_NEEDED or later... " for am in automake-$AM_NEEDED automake$AM_NEEDED automake; do ($am --version < /dev/null > /dev/null 2>&1) || continue ver=`$am --version < /dev/null | head -n 1 | $VERSIONGREP | $VERSIONMKINT` verneeded=`echo $AM_NEEDED | $VERSIONMKINT` if test $ver -ge $verneeded; then AUTOMAKE=$am echo $AUTOMAKE break fi done test -z $AUTOMAKE && echo "no" echo -n "checking for aclocal $AM_NEEDED or later... " for ac in aclocal-$AM_NEEDED aclocal$AM_NEEDED aclocal; do ($ac --version < /dev/null > /dev/null 2>&1) || continue ver=`$ac --version < /dev/null | head -n 1 | $VERSIONGREP | $VERSIONMKINT` verneeded=`echo $AM_NEEDED | $VERSIONMKINT` if test $ver -ge $verneeded; then ACLOCAL=$ac echo $ACLOCAL break fi done test -z $ACLOCAL && echo "no" fi test -z $AUTOMAKE || test -z $ACLOCAL && { echo echo "You must have automake installed to compile $package." echo "Download the appropriate package for your distribution," echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" exit 1 } fi echo -n "checking for libtool... " for LIBTOOLIZE in libtoolize glibtoolize nope; do ($LIBTOOLIZE --version) < /dev/null > /dev/null 2>&1 && break done if test x$LIBTOOLIZE = xnope; then echo "nope." LIBTOOLIZE=libtoolize else echo $LIBTOOLIZE fi ($LIBTOOLIZE --version) < /dev/null > /dev/null 2>&1 || { echo echo "You must have libtool installed to compile $package." echo "Download the appropriate package for your system," echo "or get the source from one of the GNU ftp sites" echo "listed in http://www.gnu.org/order/ftp.html" DIE=1 } if test "$DIE" -eq 1; then exit 1 fi echo "Generating configuration files for $package, please wait...." echo " $ACLOCAL $ACLOCAL_FLAGS" $ACLOCAL $ACLOCAL_FLAGS || exit 1 echo " autoheader" autoheader || exit 1 echo " $LIBTOOLIZE --automake" $LIBTOOLIZE --automake || exit 1 echo " $AUTOMAKE --add-missing $AUTOMAKE_FLAGS" $AUTOMAKE --add-missing $AUTOMAKE_FLAGS || exit 1 echo " autoconf" autoconf || exit 1 cd $olddir #$srcdir/configure "$@" && echo mumble-1.3.4/3rdparty/celt-0.11.0-src/celt.kdevelop0000664000175000017500000001465714010707315021334 0ustar builderbuilder Jean-Marc Valin Jean-Marc.Valin@USherbrooke.ca $VERSION KDevAutoProject C celt . false default libcelt/libcelt.la true false false false false optimized GccOptions GppOptions G77Options -O2 -g0 --enable-debug=full debug GccOptions GppOptions G77Options -O0 -g3 true true 4 false 0 libtool true false false false false true 10 ada ada_bugs_gcc bash bash_bugs clanlib fortran_bugs_gcc gnome1 gnustep gtk gtk_bugs haskell haskell_bugs_ghc java_bugs_gcc java_bugs_sun kde2book libstdc++ opengl pascal_bugs_fp php php_bugs perl perl_bugs python python_bugs qt-kdev3 ruby ruby_bugs sdl stl sw w3c-dom-level2-html w3c-svg w3c-uaag10 wxwidgets_bugs Guide to the Qt Translation Tools Qt Assistant Manual Qt Designer Manual Qt Reference Documentation qmake User Guide KDE Libraries (Doxygen) false 3 3 EmbeddedKDevDesigner false true true 250 400 250 false 0 true true false std=_GLIBCXX_STD;__gnu_cxx=std true false false false false true true false .; set m_,_ theValue true true true true Horizontal .h .cpp *.o,*.lo,CVS false mumble-1.3.4/3rdparty/celt-0.11.0-src/tests/0000775000175000017500000000000014010707315017777 5ustar builderbuildermumble-1.3.4/3rdparty/celt-0.11.0-src/tests/laplace-test.c0000664000175000017500000000255614010707315022531 0ustar builderbuilder#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "laplace.h" #define CELT_C #include "../libcelt/stack_alloc.h" #include "../libcelt/entenc.c" #include "../libcelt/entdec.c" #include "../libcelt/entcode.c" #include "../libcelt/laplace.c" #define DATA_SIZE 40000 int ec_laplace_get_start_freq(int decay) { celt_uint32 ft = 32768 - LAPLACE_MINP*(2*LAPLACE_NMIN+1); int fs = (ft*(16384-decay))/(16384+decay); return fs+LAPLACE_MINP; } int main(void) { int i; int ret = 0; ec_enc enc; ec_dec dec; unsigned char *ptr; int val[10000], decay[10000]; ALLOC_STACK; ptr = malloc(DATA_SIZE); ec_enc_init(&enc,ptr,DATA_SIZE); val[0] = 3; decay[0] = 6000; val[1] = 0; decay[1] = 5800; val[2] = -1; decay[2] = 5600; for (i=3;i<10000;i++) { val[i] = rand()%15-7; decay[i] = rand()%11000+5000; } for (i=0;i<10000;i++) ec_laplace_encode(&enc, &val[i], ec_laplace_get_start_freq(decay[i]), decay[i]); ec_enc_done(&enc); ec_dec_init(&dec,ec_get_buffer(&enc),ec_range_bytes(&enc)); for (i=0;i<10000;i++) { int d = ec_laplace_decode(&dec, ec_laplace_get_start_freq(decay[i]), decay[i]); if (d != val[i]) { fprintf (stderr, "Got %d instead of %d\n", d, val[i]); ret = 1; } } return ret; } mumble-1.3.4/3rdparty/celt-0.11.0-src/tests/type-test.c0000664000175000017500000000056514010707315022107 0ustar builderbuilder#ifdef HAVE_CONFIG_H #include "config.h" #endif #include "celt_types.h" #include int main(void) { celt_int16 i = 1; i <<= 14; if (i>>14 != 1) { fprintf(stderr, "celt_int16 isn't 16 bits\n"); return 1; } if (sizeof(celt_int16)*2 != sizeof(celt_int32)) { fprintf(stderr, "16*2 != 32\n"); return 1; } return 0; } mumble-1.3.4/3rdparty/celt-0.11.0-src/tests/mathops-test.c0000664000175000017500000000711014010707315022572 0ustar builderbuilder#ifdef HAVE_CONFIG_H #include "config.h" #endif #include "mathops.c" #include "entcode.c" #include #include #ifdef FIXED_POINT #define WORD "%d" #else #define WORD "%f" #endif #ifdef FIXED_DEBUG long long celt_mips=0; #endif int ret = 0; void testdiv(void) { celt_int32 i; for (i=1;i<=327670;i++) { double prod; celt_word32 val; val = celt_rcp(i); #ifdef FIXED_POINT prod = (1./32768./65526.)*val*i; #else prod = val*i; #endif if (fabs(prod-1) > .00025) { fprintf (stderr, "div failed: 1/%d="WORD" (product = %f)\n", i, val, prod); ret = 1; } } } void testsqrt(void) { celt_int32 i; for (i=1;i<=1000000000;i++) { double ratio; celt_word16 val; val = celt_sqrt(i); ratio = val/sqrt(i); if (fabs(ratio - 1) > .0005 && fabs(val-sqrt(i)) > 2) { fprintf (stderr, "sqrt failed: sqrt(%d)="WORD" (ratio = %f)\n", i, val, ratio); ret = 1; } i+= i>>10; } } #ifndef FIXED_POINT void testlog2(void) { float x; for (x=0.001;x<1677700.0;x+=(x/8.0)) { float error = fabs((1.442695040888963387*log(x))-celt_log2(x)); if (error>0.0009) { fprintf (stderr, "celt_log2 failed: fabs((1.442695040888963387*log(x))-celt_log2(x))>0.001 (x = %f, error = %f)\n", x,error); ret = 1; } } } void testexp2(void) { float x; for (x=-11.0;x<24.0;x+=0.0007) { float error = fabs(x-(1.442695040888963387*log(celt_exp2(x)))); if (error>0.0002) { fprintf (stderr, "celt_exp2 failed: fabs(x-(1.442695040888963387*log(celt_exp2(x))))>0.0005 (x = %f, error = %f)\n", x,error); ret = 1; } } } void testexp2log2(void) { float x; for (x=-11.0;x<24.0;x+=0.0007) { float error = fabs(x-(celt_log2(celt_exp2(x)))); if (error>0.001) { fprintf (stderr, "celt_log2/celt_exp2 failed: fabs(x-(celt_log2(celt_exp2(x))))>0.001 (x = %f, error = %f)\n", x,error); ret = 1; } } } #else void testlog2(void) { celt_word32 x; for (x=8;x<1073741824;x+=(x>>3)) { float error = fabs((1.442695040888963387*log(x/16384.0))-celt_log2(x)/1024.0); if (error>0.003) { fprintf (stderr, "celt_log2 failed: x = %ld, error = %f\n", (long)x,error); ret = 1; } } } void testexp2(void) { celt_word16 x; for (x=-32768;x<-30720;x++) { float error1 = fabs(x/2048.0-(1.442695040888963387*log(celt_exp2(x)/65536.0))); float error2 = fabs(exp(0.6931471805599453094*x/2048.0)-celt_exp2(x)/65536.0); if (error1>0.0002&&error2>0.00004) { fprintf (stderr, "celt_exp2 failed: x = "WORD", error1 = %f, error2 = %f\n", x,error1,error2); ret = 1; } } } void testexp2log2(void) { celt_word32 x; for (x=8;x<65536;x+=(x>>3)) { float error = fabs(x-0.25*celt_exp2(celt_log2(x)<<1))/16384; if (error>0.004) { fprintf (stderr, "celt_log2/celt_exp2 failed: fabs(x-(celt_exp2(celt_log2(x))))>0.001 (x = %ld, error = %f)\n", (long)x,error); ret = 1; } } } void testilog2(void) { celt_word32 x; for (x=1;x<=268435455;x+=127) { celt_word32 error = abs(celt_ilog2(x)-(int)floor(log2(x))); if (error!=0) { printf("celt_ilog2 failed: celt_ilog2(x)!=floor(log2(x)) (x = %d, error = %d)\n",x,error); ret = 1; } } } #endif int main(void) { testdiv(); testsqrt(); testlog2(); testexp2(); testexp2log2(); #ifdef FIXED_POINT testilog2(); #endif return ret; } mumble-1.3.4/3rdparty/celt-0.11.0-src/tests/rotation-test.c0000664000175000017500000000213314010707315022756 0ustar builderbuilder#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "celt_types.h" #include "bands.h" #include #define MAX_SIZE 100 int ret=0; void test_rotation(int N, int K) { int i; double err = 0, ener = 0, snr, snr0; celt_word16 x0[MAX_SIZE]; celt_word16 x1[MAX_SIZE]; int nb_rotations = (N+4*K)/(8*K); for (i=0;i 20) ret = 1; } int main(void) { test_rotation(15, 3); test_rotation(23, 5); test_rotation(50, 3); test_rotation(80, 1); return ret; } mumble-1.3.4/3rdparty/celt-0.11.0-src/tests/tandem-test.c0000664000175000017500000001545214010707315022377 0ustar builderbuilder/* (C) 2009 Gregory Maxwell This test runs pink noise through the encoder and decoder many times while feeding the output back into the input. It checks that after a number of cycles the energy has not increased or decreased by too large an amount. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "celt.h" #include "arch.h" #include #include #include #include #include #include #ifndef _MSC_VER #include #endif int async_tandem(int rate, int frame_size, int channels, int bitrate_min, int bitrate_max) { int error; unsigned char data[648]; CELTMode *mode = NULL; CELTEncoder *enc; short carry[2]; short pcm[960 * 2]; CELTDecoder *dec; int bmin, bmax; float ms; int ret, i, j, bytes_per_frame; int increment = 1; bmin = floor((bitrate_min / (rate / (float) frame_size)) / 8.0); bmax = ceil((bitrate_max / (rate / (float) frame_size)) / 8.0); if (bmin < 8) bmin = 8; if (bmax > 640) bmax = 640; if (bmin >= bmax) bmax = bmin + 8; increment += (bmax - bmin) / 128; printf ("Testing asynchronous tandeming (%dHz, %dch, %d samples, %d - %d bytes).\n", rate, channels, frame_size, bmin, bmax); mode = celt_mode_create(rate, frame_size, &error); if (mode == NULL || error) { fprintf(stderr, "Error: failed to create a mode: %s\n", celt_strerror(error)); exit(1); } dec = celt_decoder_create_custom(mode, channels, &error); if (error){ fprintf(stderr, "Error: celt_decoder_create returned %s\n", celt_strerror(error)); exit(1); } enc = celt_encoder_create_custom(mode, channels, &error); if (error){ fprintf(stderr, "Error: celt_encoder_create returned %s\n", celt_strerror(error)); exit(1); } for (j = 0; j < frame_size * channels; j++) pcm[j] = 0; for (bytes_per_frame = bmin; bytes_per_frame <= bmax; bytes_per_frame += increment) { /*Prime the encoder and decoder */ for (i = 0; i < (1024 + (frame_size >> 1)) / frame_size + 2; i++) { for (j = 0; j < channels; j++) pcm[j] = pcm[frame_size * channels - (channels - j + 1)]; for (j = channels; j < frame_size * channels - 1; j++) pcm[j] = ((rand() % 4096) - 2048) + .9 * pcm[j - channels]; ret = celt_encode(enc, pcm, frame_size, data, bytes_per_frame); if (ret != bytes_per_frame) { fprintf(stderr, "Error: celt_encode returned %s\n", celt_strerror(ret)); exit(1); } ret = celt_decode(dec, data, ret, pcm, frame_size); if (ret != CELT_OK) { fprintf(stderr, "Error: celt_decode returned %s\n", celt_strerror(ret)); } } for (j = 0; j < channels; j++) pcm[j] = pcm[frame_size * channels - (channels - j)]; for (j = channels; j < frame_size * channels - 1; j++) pcm[j] = ((rand() % 4096) - 2048) + .9 * pcm[j - channels]; for (i = 0; i < 8; i++) { for (j = 0; j < channels; j++) carry[j] = pcm[frame_size * channels - (channels - j)]; memmove(pcm + channels, pcm, sizeof(short) * frame_size * channels); for (j = 0; j < channels; j++) pcm[j] = carry[j]; ret = celt_encode(enc, pcm, frame_size, data, bytes_per_frame); if (ret != bytes_per_frame) { fprintf(stderr, "Error: at %d bytes_per_frame celt_encode returned %s\n", bytes_per_frame, celt_strerror(ret)); exit(1); } ret = celt_decode(dec, data, ret, pcm, frame_size); if (ret != CELT_OK) { fprintf(stderr, "Error: at %d bytes_per_frame celt_decode returned %s\n", bytes_per_frame, celt_strerror(ret)); exit(1); } } ms = 0; for (j = 0; j < frame_size * channels; j++) ms += pcm[j] * pcm[j]; ms = sqrt(ms / (frame_size * channels)); if (ms > 7000 || ms < 1000) { fprintf(stderr, "Error: Signal out of expected range. %d %d %d %d %f\n", rate, channels, frame_size, bytes_per_frame, ms); exit(1); } } celt_encoder_destroy(enc); celt_decoder_destroy(dec); celt_mode_destroy(mode); return 0; } int main(int argc, char *argv[]) { #ifdef CUSTOM_MODES int sizes[8]={960,512,480,256,240,128,120,64}; #else int sizes[4]={960,480,240,120}; #endif unsigned int seed; int ch, n; if (argc > 2) { fprintf(stderr, "Usage: %s []\n", argv[0]); return 1; } if (argc > 1) seed = atoi(argv[1]); else seed = (time(NULL) ^ ((getpid() % 65536) << 16)); srand(seed); printf("CELT codec tests. Random seed: %u (%.4X)\n", seed, rand() % 65536); #ifdef CUSTOM_MODES for (n = 0; n < 8; n++) { for (ch = 1; ch <= 2; ch++) { async_tandem(48000, sizes[n], ch, 12000 * ch, 128000 * ch); async_tandem(44100, sizes[n], ch, 12000 * ch, 128000 * ch); if(n>0)async_tandem(32000, sizes[n], ch, 12000 * ch, 128000 * ch); if(n>2)async_tandem(16000, sizes[n], ch, 12000 * ch, 64000 * ch); } } #else for (n = 0; n < 4; n++) { for (ch = 1; ch <= 2; ch++) { async_tandem(48000, sizes[n], ch, 12000 * ch, 128000 * ch); } } #endif return 0; } mumble-1.3.4/3rdparty/celt-0.11.0-src/tests/cwrs32-test.c0000664000175000017500000001147014010707315022246 0ustar builderbuilder#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #define CELT_C #include "../libcelt/stack_alloc.h" #include "../libcelt/entenc.c" #include "../libcelt/entdec.c" #include "../libcelt/entcode.c" #include "../libcelt/cwrs.c" #include "../libcelt/mathops.c" #define NMAX (14) #define KMAX (32767) static const int kmax[15]={ 32767,32767,32767,32767, 1172, 238, 95, 53, 36, 27, 22, 18, 16, 15, 13 }; int main(int _argc,char **_argv){ int n; ALLOC_STACK; for(n=2;n<=NMAX;n++){ int dk; int k; dk=kmax[n]>7?kmax[n]/7:1; k=1-dk; do{ celt_uint32 uu[KMAX+2U]; celt_uint32 inc; celt_uint32 nc; celt_uint32 i; k=kmax[n]-dk");*/ ii=icwrs(n,k,&v,y,u); if(ii!=i){ fprintf(stderr,"Combination-index mismatch (%lu!=%lu).\n", (long)ii,(long)i); return 1; } if(v!=nc){ fprintf(stderr,"Combination count mismatch (%lu!=%lu).\n", (long)v,(long)nc); return 2; } #ifndef SMALL_FOOTPRINT if(n==2){ cwrsi2(k,i,yy); for(j=0;j<2;j++)if(yy[j]!=y[j]){ fprintf(stderr,"N=2 pulse vector mismatch ({%i,%i}!={%i,%i}).\n", yy[0],yy[1],y[0],y[1]); return 3; } ii=icwrs2(yy,&kk); if(ii!=i){ fprintf(stderr,"N=2 combination-index mismatch (%lu!=%lu).\n", (long)ii,(long)i); return 4; } if(kk!=k){ fprintf(stderr,"N=2 pulse count mismatch (%i,%i).\n",kk,k); return 5; } v=ncwrs2(k); if(v!=nc){ fprintf(stderr,"N=2 combination count mismatch (%lu,%lu).\n", (long)v,(long)nc); return 6; } } else if(n==3){ cwrsi3(k,i,yy); for(j=0;j<3;j++)if(yy[j]!=y[j]){ fprintf(stderr,"N=3 pulse vector mismatch " "({%i,%i,%i}!={%i,%i,%i}).\n",yy[0],yy[1],yy[2],y[0],y[1],y[2]); return 7; } ii=icwrs3(yy,&kk); if(ii!=i){ fprintf(stderr,"N=3 combination-index mismatch (%lu!=%lu).\n", (long)ii,(long)i); return 8; } if(kk!=k){ fprintf(stderr,"N=3 pulse count mismatch (%i!=%i).\n",kk,k); return 9; } v=ncwrs3(k); if(v!=nc){ fprintf(stderr,"N=3 combination count mismatch (%lu!=%lu).\n", (long)v,(long)nc); return 10; } } else if(n==4){ cwrsi4(k,i,yy); for(j=0;j<4;j++)if(yy[j]!=y[j]){ fprintf(stderr,"N=4 pulse vector mismatch " "({%i,%i,%i,%i}!={%i,%i,%i,%i}.\n", yy[0],yy[1],yy[2],yy[3],y[0],y[1],y[2],y[3]); return 11; } ii=icwrs4(yy,&kk); if(ii!=i){ fprintf(stderr,"N=4 combination-index mismatch (%lu!=%lu).\n", (long)ii,(long)i); return 12; } if(kk!=k){ fprintf(stderr,"N=4 pulse count mismatch (%i!=%i).\n",kk,k); return 13; } v=ncwrs4(k); if(v!=nc){ fprintf(stderr,"N=4 combination count mismatch (%lu!=%lu).\n", (long)v,(long)nc); return 14; } } else if(n==5){ cwrsi5(k,i,yy); for(j=0;j<5;j++)if(yy[j]!=y[j]){ fprintf(stderr,"N=5 pulse vector mismatch " "({%i,%i,%i,%i,%i}!={%i,%i,%i,%i,%i}).\n", yy[0],yy[1],yy[2],yy[3],yy[4],y[0],y[1],y[2],y[3],y[4]); return 15; } ii=icwrs5(yy,&kk); if(ii!=i){ fprintf(stderr,"N=5 combination-index mismatch (%lu!=%lu).\n", (long)ii,(long)i); return 16; } if(kk!=k){ fprintf(stderr,"N=5 pulse count mismatch (%i!=%i).\n",kk,k); return 17; } v=ncwrs5(k); if(v!=nc){ fprintf(stderr,"N=5 combination count mismatch (%lu!=%lu).\n", (long)v,(long)nc); return 18; } } #endif /* SMALL_FOOTPRINT */ /*printf(" %6u\n",i);*/ } /*printf("\n");*/ } while(k #include "kiss_fft.h" #define CELT_C #include "../libcelt/stack_alloc.h" #include "../libcelt/kiss_fft.c" #include "../libcelt/mathops.c" #include "../libcelt/entcode.c" #ifndef M_PI #define M_PI 3.141592653 #endif #ifdef FIXED_DEBUG long long celt_mips=0; #endif int ret = 0; void check(kiss_fft_cpx * in,kiss_fft_cpx * out,int nfft,int isinverse) { int bin,k; double errpow=0,sigpow=0, snr; for (bin=0;bin1) { int k; for (k=1;k #include #define CELT_C #include "../libcelt/stack_alloc.h" #include "../libcelt/kiss_fft.c" #include "../libcelt/kiss_fftr.c" #ifdef FIXED_DEBUG long long celt_mips=0; #endif int ret=0; static kiss_fft_scalar rand_scalar(void) { return (rand()%32767)-16384; } static double snr_compare( kiss_fft_cpx * vec1,kiss_fft_scalar * vec2, int n) { int k; double sigpow=1e-10, noisepow=1e-10, err,snr; vec1[0].i = vec1[n].r; for (k=0;k #include "mdct.h" #define CELT_C #include "../libcelt/stack_alloc.h" #include "../libcelt/kiss_fft.c" #include "../libcelt/mdct.c" #include "../libcelt/mathops.c" #include "../libcelt/entcode.c" #ifndef M_PI #define M_PI 3.141592653 #endif #ifdef FIXED_DEBUG long long celt_mips=0; #endif int ret = 0; void check(kiss_fft_scalar * in,kiss_fft_scalar * out,int nfft,int isinverse) { int bin,k; double errpow=0,sigpow=0; double snr; for (bin=0;bin1) { int k; for (k=1;k #include #include #include #include "entcode.h" #include "entenc.h" #include "entdec.h" #include #include "../libcelt/entenc.c" #include "../libcelt/entdec.c" #include "../libcelt/entcode.c" #ifndef M_LOG2E # define M_LOG2E 1.4426950408889634074 #endif #define DATA_SIZE 10000000 #define DATA_SIZE2 10000 int main(int _argc,char **_argv){ ec_enc enc; ec_dec dec; long nbits; long nbits2; double entropy; int ft; int ftb; int sym; int sz; int i; int ret; unsigned int seed; unsigned char *ptr; ret=0; entropy=0; if (_argc > 2) { fprintf(stderr, "Usage: %s []\n", _argv[0]); return 1; } if (_argc > 1) seed = atoi(_argv[1]); else seed = time(NULL); /*Testing encoding of raw bit values.*/ ptr = malloc(DATA_SIZE); ec_enc_init(&enc,ptr, DATA_SIZE); for(ft=2;ft<1024;ft++){ for(i=0;i>(rand()%11))+1)+10; sz=rand()/((RAND_MAX>>(rand()%9))+1); data=(unsigned *)malloc(sz*sizeof(*data)); tell=(unsigned *)malloc((sz+1)*sizeof(*tell)); ec_enc_init(&enc,ptr,DATA_SIZE2); zeros = rand()%13==0; tell[0]=ec_tell_frac(&enc); for(j=0;j>(rand()%9))+1); logp1=(unsigned *)malloc(sz*sizeof(*logp1)); data=(unsigned *)malloc(sz*sizeof(*data)); tell=(unsigned *)malloc((sz+1)*sizeof(*tell)); enc_method=(unsigned *)malloc(sz*sizeof(*enc_method)); ec_enc_init(&enc,ptr,DATA_SIZE2); tell[0]=ec_tell_frac(&enc); for(j=0;j>1)+1); logp1[j]=(rand()%15)+1; enc_method[j]=rand()/((RAND_MAX>>2)+1); switch(enc_method[j]){ case 0:{ ec_encode(&enc,data[j]?(1<>2)+1); switch(dec_method){ case 0:{ fs=ec_decode(&dec,1<=(1<=(1< #include #include "wave_out.h" #define MAXWAVESIZE 4294967040LU #define MAX_WAVEBLOCKS 32 // This is modified for USE_WIN_AUDIO - ONLY 2002-02-27 static CRITICAL_SECTION cs; static HWAVEOUT dev = NULL; static int ScheduledBlocks = 0; static int PlayedWaveHeadersCount = 0; // free index static WAVEHDR* PlayedWaveHeaders [MAX_WAVEBLOCKS]; static int Box ( const char* msg ) { MessageBox ( NULL, msg, " "VERSION_STRING": Error Message . . .", MB_OK | MB_ICONEXCLAMATION ); return -1; } /* * This function registers already played WAVE chunks. Freeing is done by free_memory(), */ static void CALLBACK wave_callback ( HWAVE hWave, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2 ) { if ( uMsg == WOM_DONE ) { EnterCriticalSection ( &cs ); PlayedWaveHeaders [PlayedWaveHeadersCount++] = (WAVEHDR*) dwParam1; LeaveCriticalSection ( &cs ); } } static void free_memory ( void ) { WAVEHDR* wh; HGLOBAL hg; EnterCriticalSection ( &cs ); wh = PlayedWaveHeaders [--PlayedWaveHeadersCount]; ScheduledBlocks--; // decrease the number of USED blocks LeaveCriticalSection ( &cs ); waveOutUnprepareHeader ( dev, wh, sizeof (WAVEHDR) ); hg = GlobalHandle ( wh -> lpData ); // Deallocate the buffer memory GlobalUnlock (hg); GlobalFree (hg); hg = GlobalHandle ( wh ); // Deallocate the header memory GlobalUnlock (hg); GlobalFree (hg); } Int Set_WIN_Params ( FILE_T dummyFile , Ldouble SampleFreq, Uint BitsPerSample, Uint Channels ) { WAVEFORMATEX outFormat; UINT deviceID = WAVE_MAPPER; (void) dummyFile; if ( waveOutGetNumDevs () == 0 ) return Box ( "No audio device present." ); outFormat.wFormatTag = WAVE_FORMAT_PCM; outFormat.wBitsPerSample = BitsPerSample; outFormat.nChannels = Channels; outFormat.nSamplesPerSec = (unsigned long)(SampleFreq + 0.5); outFormat.nBlockAlign = (outFormat.wBitsPerSample + 7) / 8 * outFormat.nChannels; outFormat.nAvgBytesPerSec = outFormat.nSamplesPerSec * outFormat.nBlockAlign; switch ( waveOutOpen ( &dev, deviceID, &outFormat, (DWORD)wave_callback, 0, CALLBACK_FUNCTION ) ) { case MMSYSERR_ALLOCATED: return Box ( "Device is already open." ); case MMSYSERR_BADDEVICEID: return Box ( "The specified device is out of range." ); case MMSYSERR_NODRIVER: return Box ( "There is no audio driver in this system." ); case MMSYSERR_NOMEM: return Box ( "Unable to allocate sound memory." ); case WAVERR_BADFORMAT: return Box ( "This audio format is not supported." ); case WAVERR_SYNC: return Box ( "The device is synchronous." ); default: return Box ( "Unknown media error." ); case MMSYSERR_NOERROR: break; } waveOutReset ( dev ); InitializeCriticalSection ( &cs ); SetPriorityClass ( GetCurrentProcess (), HIGH_PRIORITY_CLASS ); return 0; } int WIN_Play_Samples ( const void* data, size_t len ) { HGLOBAL hg; HGLOBAL hg2; LPWAVEHDR wh; void* allocptr; do { while ( PlayedWaveHeadersCount > 0 ) // free used blocks ... free_memory (); if ( ScheduledBlocks < sizeof(PlayedWaveHeaders)/sizeof(*PlayedWaveHeaders) ) // wait for a free block ... break; Sleep (26); } while (1); if ( (hg2 = GlobalAlloc ( GMEM_MOVEABLE, len )) == NULL ) // allocate some memory for a copy of the buffer return Box ( "GlobalAlloc failed." ); allocptr = GlobalLock (hg2); CopyMemory ( allocptr, data, len ); // Here we can call any modification output functions we want.... if ( (hg = GlobalAlloc (GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof (WAVEHDR))) == NULL ) // now make a header and WRITE IT! return -1; wh = GlobalLock (hg); wh -> dwBufferLength = len; wh -> lpData = allocptr; if ( waveOutPrepareHeader ( dev, wh, sizeof (WAVEHDR)) != MMSYSERR_NOERROR ) { GlobalUnlock (hg); GlobalFree (hg); return -1; } if ( waveOutWrite ( dev, wh, sizeof (WAVEHDR)) != MMSYSERR_NOERROR ) { GlobalUnlock (hg); GlobalFree (hg); return -1; } EnterCriticalSection ( &cs ); ScheduledBlocks++; LeaveCriticalSection ( &cs ); return len; } int WIN_Audio_close ( void ) { if ( dev != NULL ) { while ( ScheduledBlocks > 0 ) { Sleep (ScheduledBlocks); while ( PlayedWaveHeadersCount > 0 ) // free used blocks ... free_memory (); } waveOutReset (dev); // reset the device waveOutClose (dev); // close the device dev = NULL; } DeleteCriticalSection ( &cs ); ScheduledBlocks = 0; return 0; } #endif /* end of wave_out.c */ mumble-1.3.4/3rdparty/celt-0.11.0-src/tools/wave_out.h0000664000175000017500000000555414010707315022010 0ustar builderbuilder/* Copyright (c) 2002, John Edwards Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ // WAVE_OUT.H - Necessary stuff for WIN_AUDIO #ifndef WAVE_OUT_H #define WAVE_OUT_H #include #include #ifdef __MINGW32__ #include #endif #define VERSION_STRING "\n 0.11.1\n" #define Cdecl __cdecl #define __attribute__(x) #define sleep(__sec) Sleep ((__sec) * 1000) #define inline __inline #define restrict //// constants ///////////////////////////////////////////////////// #define CD_SAMPLE_FREQ 44.1e3 #define SAMPLE_SIZE 16 #define SAMPLE_SIZE_STRING "" #define WINAUDIO_FD ((FILE_T)-128) #define FILE_T FILE* #define INVALID_FILEDESC NULL //// Simple types ////////////////////////////////////////////////// typedef signed int Int; // at least -32767...+32767, fast type typedef unsigned int Uint; // at least 0...65535, fast type typedef long double Ldouble; // most exact floating point format //// procedures/functions ////////////////////////////////////////// // wave_out.c Int Set_WIN_Params ( FILE_T dummyFile , Ldouble SampleFreq, Uint BitsPerSample, Uint Channels); int WIN_Play_Samples ( const void* buff, size_t len ); int WIN_Audio_close ( void ); #endif /* WAVE_OUT_H */ mumble-1.3.4/3rdparty/celt-0.11.0-src/tools/getopt1.c0000664000175000017500000001120514010707315021523 0ustar builderbuilder/* getopt_long and getopt_long_only entry points for GNU getopt. Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with the GNU C Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "getopt_win.h" #if !defined __STDC__ || !__STDC__ /* This is a separate conditional since some stdc systems reject `defined (const)'. */ #ifndef const #define const #endif #endif #include /* Comment out all this code if we are using the GNU C Library, and are not actually compiling the library itself. This code is part of the GNU C Library, but also included in many other GNU distributions. Compiling and linking in this code is a waste when using the GNU C library (especially if it is a shared library). Rather than having every GNU program understand `configure --with-gnu-libc' and omit the object files, it is simpler to just do this in the source for each such file. */ #define GETOPT_INTERFACE_VERSION 2 #if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 #include #if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION #define ELIDE_CODE #endif #endif #ifndef ELIDE_CODE /* This needs to come after some library #include to get __GNU_LIBRARY__ defined. */ #ifdef __GNU_LIBRARY__ #include #endif #ifndef NULL #define NULL 0 #endif int getopt_long (argc, argv, options, long_options, opt_index) int argc; char *const *argv; const char *options; const struct option *long_options; int *opt_index; { return _getopt_internal (argc, argv, options, long_options, opt_index, 0); } /* Like getopt_long, but '-' as well as '--' can indicate a long option. If an option that starts with '-' (not '--') doesn't match a long option, but does match a short option, it is parsed as a short option instead. */ int getopt_long_only (argc, argv, options, long_options, opt_index) int argc; char *const *argv; const char *options; const struct option *long_options; int *opt_index; { return _getopt_internal (argc, argv, options, long_options, opt_index, 1); } #endif /* Not ELIDE_CODE. */ #ifdef TEST #include int main (argc, argv) int argc; char **argv; { int c; int digit_optind = 0; while (1) { int this_option_optind = optind ? optind : 1; int option_index = 0; static struct option long_options[] = { {"add", 1, 0, 0}, {"append", 0, 0, 0}, {"delete", 1, 0, 0}, {"verbose", 0, 0, 0}, {"create", 0, 0, 0}, {"file", 1, 0, 0}, {0, 0, 0, 0} }; c = getopt_long (argc, argv, "abc:d:0123456789", long_options, &option_index); if (c == -1) break; switch (c) { case 0: printf ("option %s", long_options[option_index].name); if (optarg) printf (" with arg %s", optarg); printf ("\n"); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (digit_optind != 0 && digit_optind != this_option_optind) printf ("digits occur in two different argv-elements.\n"); digit_optind = this_option_optind; printf ("option %c\n", c); break; case 'a': printf ("option a\n"); break; case 'b': printf ("option b\n"); break; case 'c': printf ("option c with value `%s'\n", optarg); break; case 'd': printf ("option d with value `%s'\n", optarg); break; case '?': break; default: printf ("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); printf ("\n"); } exit (0); } #endif /* TEST */ mumble-1.3.4/3rdparty/celt-0.11.0-src/tools/skeleton.c0000664000175000017500000001421214010707315021765 0ustar builderbuilder/* * skeleton.c * author: Tahseen Mohammad */ /* This file depends on WORDS_BIGENDIAN being defined to 1 if the host * processor stores words with the most significant byte first (like Motorola * and SPARC, unlike Intel and VAX). * On little endian systems, WORDS_BIGENDIAN should be undefined. * * When using GNU Autotools, the correct value will be written into config.h * if the autoconf macro AC_C_BIGENDIAN is called in configure.ac. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include "skeleton.h" #ifdef WIN32 #define snprintf _snprintf #endif static unsigned short _le_16 (unsigned short s) { unsigned short ret=s; #ifdef WORDS_BIGENDIAN ret = (s>>8) & 0x00ffU; ret += (s<<8) & 0xff00U; #endif return ret; } static ogg_uint32_t _le_32 (ogg_uint32_t i) { ogg_uint32_t ret=i; #ifdef WORDS_BIGENDIAN ret = (i>>24); ret += (i>>8) & 0x0000ff00; ret += (i<<8) & 0x00ff0000; ret += (i<<24); #endif return ret; } static ogg_int64_t _le_64 (ogg_int64_t l) { ogg_int64_t ret=l; unsigned char *ucptr = (unsigned char *)&ret; #ifdef WORDS_BIGENDIAN unsigned char temp; temp = ucptr [0] ; ucptr [0] = ucptr [7] ; ucptr [7] = temp ; temp = ucptr [1] ; ucptr [1] = ucptr [6] ; ucptr [6] = temp ; temp = ucptr [2] ; ucptr [2] = ucptr [5] ; ucptr [5] = temp ; temp = ucptr [3] ; ucptr [3] = ucptr [4] ; ucptr [4] = temp ; #endif return (*(ogg_int64_t *)ucptr); } /* write an ogg_page to a file pointer */ int write_ogg_page_to_file(ogg_page *og, FILE *out) { int written; written = fwrite(og->header,1, og->header_len, out); written += fwrite(og->body,1, og->body_len, out); return written; } int add_message_header_field(fisbone_packet *fp, char *header_key, char *header_value) { /* size of both key and value + ': ' + CRLF */ int this_message_size = strlen(header_key) + strlen(header_value) + 4; if (fp->message_header_fields == NULL) { fp->message_header_fields = _ogg_calloc(this_message_size+1, sizeof(char)); } else { int new_size = (fp->current_header_size + this_message_size+1) * sizeof(char); fp->message_header_fields = _ogg_realloc(fp->message_header_fields, new_size); } snprintf(fp->message_header_fields + fp->current_header_size, this_message_size+1, "%s: %s\r\n", header_key, header_value); fp->current_header_size += this_message_size; return 0; } /* create a ogg_packet from a fishead_packet structure */ ogg_packet ogg_from_fishead(fishead_packet *fp) { ogg_packet op; memset(&op, 0, sizeof(op)); op.packet = _ogg_calloc(FISHEAD_SIZE, sizeof(unsigned char)); memset(op.packet, 0, FISHEAD_SIZE); memcpy (op.packet, FISHEAD_IDENTIFIER, 8); /* identifier */ *((ogg_uint16_t*)(op.packet+8)) = _le_16 (SKELETON_VERSION_MAJOR); /* version major */ *((ogg_uint16_t*)(op.packet+10)) = _le_16 (SKELETON_VERSION_MINOR); /* version minor */ *((ogg_int64_t*)(op.packet+12)) = _le_64 (fp->ptime_n); /* presentationtime numerator */ *((ogg_int64_t*)(op.packet+20)) = _le_64 (fp->ptime_d); /* presentationtime denominator */ *((ogg_int64_t*)(op.packet+28)) = _le_64 (fp->btime_n); /* basetime numerator */ *((ogg_int64_t*)(op.packet+36)) = _le_64 (fp->btime_d); /* basetime denominator */ /* TODO: UTC time, set to zero for now */ op.b_o_s = 1; /* its the first packet of the stream */ op.e_o_s = 0; /* its not the last packet of the stream */ op.bytes = FISHEAD_SIZE; /* length of the packet in bytes */ return op; } /* create a ogg_packet from a fisbone_packet structure. * call this method after the fisbone_packet is filled and all message header fields are added * by calling add_message_header_field method. */ ogg_packet ogg_from_fisbone(fisbone_packet *fp) { ogg_packet op; int packet_size = FISBONE_SIZE + fp->current_header_size; memset (&op, 0, sizeof (op)); op.packet = _ogg_calloc (packet_size, sizeof(unsigned char)); memset (op.packet, 0, packet_size); memcpy (op.packet, FISBONE_IDENTIFIER, 8); /* identifier */ *((ogg_uint32_t*)(op.packet+8)) = _le_32 (FISBONE_MESSAGE_HEADER_OFFSET); /* offset of the message header fields */ *((ogg_uint32_t*)(op.packet+12)) = _le_32 (fp->serial_no); /* serialno of the respective stream */ *((ogg_uint32_t*)(op.packet+16)) = _le_32 (fp->nr_header_packet); /* number of header packets */ *((ogg_int64_t*)(op.packet+20)) = _le_64 (fp->granule_rate_n); /* granulrate numerator */ *((ogg_int64_t*)(op.packet+28)) = _le_64 (fp->granule_rate_d); /* granulrate denominator */ *((ogg_int64_t*)(op.packet+36)) = _le_64 (fp->start_granule); /* start granule */ *((ogg_uint32_t*)(op.packet+44)) = _le_32 (fp->preroll); /* preroll, for theora its 0 */ *(op.packet+48) = fp->granule_shift; /* granule shift */ memcpy((op.packet+FISBONE_SIZE), fp->message_header_fields, fp->current_header_size); op.b_o_s = 0; op.e_o_s = 0; op.bytes = packet_size; /* size of the packet in bytes */ return op; } int add_fishead_to_stream(ogg_stream_state *os, fishead_packet *fp) { ogg_packet op; op = ogg_from_fishead(fp); ogg_stream_packetin(os, &op); _ogg_free(op.packet); return 0; } int add_fisbone_to_stream(ogg_stream_state *os, fisbone_packet *fp) { ogg_packet op; op = ogg_from_fisbone(fp); ogg_stream_packetin(os, &op); _ogg_free(op.packet); return 0; } int add_eos_packet_to_stream(ogg_stream_state *os) { ogg_packet op; memset (&op, 0, sizeof(op)); op.e_o_s = 1; ogg_stream_packetin(os, &op); return 0; } int flush_ogg_stream_to_file(ogg_stream_state *os, FILE *out) { ogg_page og; int result; while((result = ogg_stream_flush(os, &og))) { if(!result) break; result = write_ogg_page_to_file(&og, out); if(result != og.header_len + og.body_len) return 1; } return 0; } mumble-1.3.4/3rdparty/celt-0.11.0-src/tools/skeleton.h0000664000175000017500000000571614010707315022003 0ustar builderbuilder/* * skeleton.h * author: Tahseen Mohammad */ #ifndef _SKELETON_H #define _SKELETON_H #ifdef __cplusplus extern "C" { #endif #ifdef WIN32 #define snprintf _snprintf #endif #include #define SKELETON_VERSION_MAJOR 3 #define SKELETON_VERSION_MINOR 0 #define FISHEAD_IDENTIFIER "fishead\0" #define FISBONE_IDENTIFIER "fisbone\0" #define FISHEAD_SIZE 64 #define FISBONE_SIZE 52 #define FISBONE_MESSAGE_HEADER_OFFSET 44 /* fishead_packet holds a fishead header packet. */ typedef struct { ogg_uint16_t version_major; /* skeleton version major */ ogg_uint16_t version_minor; /* skeleton version minor */ /* Start time of the presentation * For a new stream presentationtime & basetime is same. */ ogg_int64_t ptime_n; /* presentation time numerator */ ogg_int64_t ptime_d; /* presentation time denominator */ ogg_int64_t btime_n; /* basetime numerator */ ogg_int64_t btime_d; /* basetime denominator */ /* will holds the time of origin of the stream, a 20 bit field. */ unsigned char UTC[20]; } fishead_packet; /* fisbone_packet holds a fisbone header packet. */ typedef struct { ogg_uint32_t serial_no; /* serial no of the corresponding stream */ ogg_uint32_t nr_header_packet; /* number of header packets */ /* granule rate is the temporal resolution of the logical bitstream */ ogg_int64_t granule_rate_n; /* granule rate numerator */ ogg_int64_t granule_rate_d; /* granule rate denominator */ ogg_int64_t start_granule; /* start granule value */ ogg_uint32_t preroll; /* preroll */ unsigned char granule_shift; /* 1 byte value holding the granule shift */ char *message_header_fields; /* holds all the message header fields */ /* current total size of the message header fields, for realloc purpose, initially zero */ ogg_uint32_t current_header_size; } fisbone_packet; extern int write_ogg_page_to_file(ogg_page *og, FILE *out); extern int add_message_header_field(fisbone_packet *fp, char *header_key, char *header_value); /* remember to deallocate the returned ogg_packet properly */ extern ogg_packet ogg_from_fishead(fishead_packet *fp); extern ogg_packet ogg_from_fisbone(fisbone_packet *fp); extern fishead_packet fishead_from_ogg(ogg_packet *op); extern fisbone_packet fisbone_from_ogg(ogg_packet *op); extern int add_fishead_to_stream(ogg_stream_state *os, fishead_packet *fp); extern int add_fisbone_to_stream(ogg_stream_state *os, fisbone_packet *fp); extern int add_eos_packet_to_stream(ogg_stream_state *os); extern int flush_ogg_stream_to_file(ogg_stream_state *os, FILE *out); #ifdef __cplusplus } #endif #endif /* _SKELETON_H */ mumble-1.3.4/3rdparty/celt-0.11.0-src/tools/opus_compare.m0000664000175000017500000000362514010707315022655 0ustar builderbuilder%% Tests bit-stream compliance for the Opus codec %% x: Signal from the Opus reference implementation (float or fixed) %% y: Signal from the decoder under test %% stereo: 0 for mono, 1 for stereo function [err, NMR] = opus_compare(x, y, stereo) % Bands on which we compute the pseudo-NMR (Bark-derived CELT bands) b = 2*[0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 34, 40, 48, 60, 78, 100]; d = diff(b); % Per-band SNR threshold T = 50-.7*[1:21]; % Noise floor N = 10 .^ ((10-0.6*[1:21])/10); % Error signal e=x-y; %Add a +/- 1 dead zone on the error e = e - min(1, max(-1, e)); % Compute spectrum of original and error if (stereo) X=(abs(specgram(x(1:2:end),480))+abs(specgram(x(2:2:end),480)))/2; E=(abs(specgram(e(1:2:end),480))+abs(specgram(e(2:2:end),480)))/2; else X=abs(specgram(x,480)); E=abs(specgram(e,480)); endif % Group energy per band for k=1:21 Xb(k,:) = sum(X(b(k)+1:b(k+1),:).^2)/d(k)+1; Eb(k,:) = sum(E(b(k)+1:b(k+1),:).^2)/d(k)+1; end % Frequency masking (low to high) with 10 dB/Bark slope Xb = filter(1, [1, -.1], Xb); % Frequency masking (high to low) with 15 dB/Bark slope Xb(end:-1:1,:) = filter(1, [1, -.03], Xb(end:-1:1,:)); % Temporal masking with 5 dB/5 ms slope Xb = filter(1, [1, -.3], Xb')'; % NMR threshold T0 = ones(length(Eb), 1)*(10.^((T)/10)); % Time-frequency SNR NMR = (Xb./Eb)'; %Picking only errors in the 90th percentile tmp = Eb(:); thresh = sort(tmp)(round(.90*length(tmp))); weight = Eb'>thresh; printf("Average pseudo-NMR: %3.2f dB\n", mean(mean(10*log10(NMR)))); if (sum(sum(weight))<1) printf("Mismatch level: below noise floor\n"); err = -100; else M = (T0./NMR) .* weight; err = 10*log10(sum(sum(M)) / sum(sum(weight))); printf("Weighted mismatch: %3.2f dB\n", err); endif printf("\n"); if (err < 0) printf("**Decoder PASSES test (mismatch < 0 dB)\n"); else printf("**Decoder FAILS test (mismatch >= 0 dB)\n"); endif mumble-1.3.4/3rdparty/celt-0.11.0-src/tools/wav_io.h0000664000175000017500000000441114010707315021432 0ustar builderbuilder/* Copyright (C) 2002 Jean-Marc Valin File: wav_io.h Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef WAV_IO_H #define WAV_IO_H #include #include "celt_types.h" #if !defined(__LITTLE_ENDIAN__) && ( defined(WORDS_BIGENDIAN) || defined(__BIG_ENDIAN__) ) #define le_short(s) ((short) ((unsigned short) (s) << 8) | ((unsigned short) (s) >> 8)) #define be_short(s) ((short) (s)) #else #define le_short(s) ((short) (s)) #define be_short(s) ((short) ((unsigned short) (s) << 8) | ((unsigned short) (s) >> 8)) #endif /** Convert little endian */ static inline celt_int32 le_int(celt_int32 i) { #if !defined(__LITTLE_ENDIAN__) && ( defined(WORDS_BIGENDIAN) || defined(__BIG_ENDIAN__) ) celt_uint32 ui, ret; ui = i; ret = ui>>24; ret |= (ui>>8)&0x0000ff00; ret |= (ui<<8)&0x00ff0000; ret |= (ui<<24); return ret; #else return i; #endif } int read_wav_header(FILE *file, int *rate, int *channels, int *format, celt_int32 *size); void write_wav_header(FILE *file, int rate, int channels, int format, int size); #endif mumble-1.3.4/3rdparty/celt-0.11.0-src/tools/getopt.c0000664000175000017500000007451614010707315021460 0ustar builderbuilder/* Getopt for GNU. NOTE: getopt is now part of the C library, so if you don't know what "Keep this file name-space clean" means, talk to drepper@gnu.org before changing it! Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99 Free Software Foundation, Inc. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with the GNU C Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* This tells Alpha OSF/1 not to define a getopt prototype in . Ditto for AIX 3.2 and . */ #ifndef _NO_PROTO # define _NO_PROTO #endif #ifdef HAVE_CONFIG_H # include "config.h" #endif #if !defined __STDC__ || !__STDC__ /* This is a separate conditional since some stdc systems reject `defined (const)'. */ # ifndef const # define const # endif #endif #include /* Comment out all this code if we are using the GNU C Library, and are not actually compiling the library itself. This code is part of the GNU C Library, but also included in many other GNU distributions. Compiling and linking in this code is a waste when using the GNU C library (especially if it is a shared library). Rather than having every GNU program understand `configure --with-gnu-libc' and omit the object files, it is simpler to just do this in the source for each such file. */ #define GETOPT_INTERFACE_VERSION 2 #if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 # include # if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION # define ELIDE_CODE # endif #endif #ifndef ELIDE_CODE /* This needs to come after some library #include to get __GNU_LIBRARY__ defined. */ #ifdef __GNU_LIBRARY__ /* Don't include stdlib.h for non-GNU C libraries because some of them contain conflicting prototypes for getopt. */ # include # include #endif /* GNU C library. */ #ifdef VMS # include # if HAVE_STRING_H - 0 # include # endif #endif #ifndef _ /* This is for other GNU distributions with internationalized messages. When compiling libc, the _ macro is predefined. */ # ifdef HAVE_LIBINTL_H # include # define _(msgid) gettext (msgid) # else # define _(msgid) (msgid) # endif #endif /* This version of `getopt' appears to the caller like standard Unix `getopt' but it behaves differently for the user, since it allows the user to intersperse the options with the other arguments. As `getopt' works, it permutes the elements of ARGV so that, when it is done, all the options precede everything else. Thus all application programs are extended to handle flexible argument order. Setting the environment variable POSIXLY_CORRECT disables permutation. Then the behavior is completely standard. GNU application programs can use a third alternative mode in which they can distinguish the relative order of options and other arguments. */ #include "getopt_win.h" /* For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, the argument value is returned here. Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ char *optarg; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to `getopt'. On entry to `getopt', zero means this is the first call; initialize. When `getopt' returns -1, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, `optind' communicates from one call to the next how much of ARGV has been scanned so far. */ /* 1003.2 says this must be 1 before any call. */ int optind = 1; /* Formerly, initialization of getopt depended on optind==0, which causes problems with re-calling getopt as programs generally don't know that. */ int __getopt_initialized; /* The next char to be scanned in the option-element in which the last option character we returned was found. This allows us to pick up the scan where we left off. If this is zero, or a null string, it means resume the scan by advancing to the next ARGV-element. */ static char *nextchar; /* Callers store zero here to inhibit the error message for unrecognized options. */ int opterr = 1; /* Set to an option character which was unrecognized. This must be initialized on some systems to avoid linking in the system's own getopt implementation. */ int optopt = '?'; /* Describe how to deal with options that follow non-option ARGV-elements. If the caller did not specify anything, the default is REQUIRE_ORDER if the environment variable POSIXLY_CORRECT is defined, PERMUTE otherwise. REQUIRE_ORDER means don't recognize them as options; stop option processing when the first non-option is seen. This is what Unix does. This mode of operation is selected by either setting the environment variable POSIXLY_CORRECT, or using `+' as the first character of the list of option characters. PERMUTE is the default. We permute the contents of ARGV as we scan, so that eventually all the non-options are at the end. This allows options to be given in any order, even with programs that were not written to expect this. RETURN_IN_ORDER is an option available to programs that were written to expect options and other ARGV-elements in any order and that care about the ordering of the two. We describe each non-option ARGV-element as if it were the argument of an option with character code 1. Using `-' as the first character of the list of option characters selects this mode of operation. The special argument `--' forces an end of option-scanning regardless of the value of `ordering'. In the case of RETURN_IN_ORDER, only `--' can cause `getopt' to return -1 with `optind' != ARGC. */ static enum { REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER } ordering; /* Value of POSIXLY_CORRECT environment variable. */ static char *posixly_correct; #ifdef __GNU_LIBRARY__ /* We want to avoid inclusion of string.h with non-GNU libraries because there are many ways it can cause trouble. On some systems, it contains special magic macros that don't work in GCC. */ # include # define my_index strchr #else #include /* Avoid depending on library functions or files whose names are inconsistent. */ #ifndef getenv extern char *getenv (); #endif static char * my_index (str, chr) const char *str; int chr; { while (*str) { if (*str == chr) return (char *) str; str++; } return 0; } /* If using GCC, we can safely declare strlen this way. If not using GCC, it is ok not to declare it. */ #ifdef __GNUC__ /* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h. That was relevant to code that was here before. */ # if (!defined __STDC__ || !__STDC__) && !defined strlen /* gcc with -traditional declares the built-in strlen to return int, and has done so at least since version 2.4.5. -- rms. */ extern int strlen (const char *); # endif /* not __STDC__ */ #endif /* __GNUC__ */ #endif /* not __GNU_LIBRARY__ */ /* Handle permutation of arguments. */ /* Describe the part of ARGV that contains non-options that have been skipped. `first_nonopt' is the index in ARGV of the first of them; `last_nonopt' is the index after the last of them. */ static int first_nonopt; static int last_nonopt; #ifdef _LIBC /* Bash 2.0 gives us an environment variable containing flags indicating ARGV elements that should not be considered arguments. */ /* Defined in getopt_init.c */ extern char *__getopt_nonoption_flags; static int nonoption_flags_max_len; static int nonoption_flags_len; static int original_argc; static char *const *original_argv; /* Make sure the environment variable bash 2.0 puts in the environment is valid for the getopt call we must make sure that the ARGV passed to getopt is that one passed to the process. */ static void __attribute__ ((unused)) store_args_and_env (int argc, char *const *argv) { /* XXX This is no good solution. We should rather copy the args so that we can compare them later. But we must not use malloc(3). */ original_argc = argc; original_argv = argv; } # ifdef text_set_element text_set_element (__libc_subinit, store_args_and_env); # endif /* text_set_element */ # define SWAP_FLAGS(ch1, ch2) \ if (nonoption_flags_len > 0) \ { \ char __tmp = __getopt_nonoption_flags[ch1]; \ __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ __getopt_nonoption_flags[ch2] = __tmp; \ } #else /* !_LIBC */ # define SWAP_FLAGS(ch1, ch2) #endif /* _LIBC */ /* Exchange two adjacent subsequences of ARGV. One subsequence is elements [first_nonopt,last_nonopt) which contains all the non-options that have been skipped so far. The other is elements [last_nonopt,optind), which contains all the options processed since those non-options were skipped. `first_nonopt' and `last_nonopt' are relocated so that they describe the new indices of the non-options in ARGV after they are moved. */ #if defined __STDC__ && __STDC__ static void exchange (char **); #endif static void exchange (argv) char **argv; { int bottom = first_nonopt; int middle = last_nonopt; int top = optind; char *tem; /* Exchange the shorter segment with the far end of the longer segment. That puts the shorter segment into the right place. It leaves the longer segment in the right place overall, but it consists of two parts that need to be swapped next. */ #ifdef _LIBC /* First make sure the handling of the `__getopt_nonoption_flags' string can work normally. Our top argument must be in the range of the string. */ if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len) { /* We must extend the array. The user plays games with us and presents new arguments. */ char *new_str = malloc (top + 1); if (new_str == NULL) nonoption_flags_len = nonoption_flags_max_len = 0; else { memset (__mempcpy (new_str, __getopt_nonoption_flags, nonoption_flags_max_len), '\0', top + 1 - nonoption_flags_max_len); nonoption_flags_max_len = top + 1; __getopt_nonoption_flags = new_str; } } #endif while (top > middle && middle > bottom) { if (top - middle > middle - bottom) { /* Bottom segment is the short one. */ int len = middle - bottom; register int i; /* Swap it with the top part of the top segment. */ for (i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[top - (middle - bottom) + i]; argv[top - (middle - bottom) + i] = tem; SWAP_FLAGS (bottom + i, top - (middle - bottom) + i); } /* Exclude the moved bottom segment from further swapping. */ top -= len; } else { /* Top segment is the short one. */ int len = top - middle; register int i; /* Swap it with the bottom part of the bottom segment. */ for (i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[middle + i]; argv[middle + i] = tem; SWAP_FLAGS (bottom + i, middle + i); } /* Exclude the moved top segment from further swapping. */ bottom += len; } } /* Update records for the slots the non-options now occupy. */ first_nonopt += (optind - last_nonopt); last_nonopt = optind; } /* Initialize the internal data when the first call is made. */ #if defined __STDC__ && __STDC__ static const char *_getopt_initialize (int, char *const *, const char *); #endif static const char * _getopt_initialize (argc, argv, optstring) int argc; char *const *argv; const char *optstring; { /* Start processing options with ARGV-element 1 (since ARGV-element 0 is the program name); the sequence of previously skipped non-option ARGV-elements is empty. */ first_nonopt = last_nonopt = optind; nextchar = NULL; posixly_correct = getenv ("POSIXLY_CORRECT"); /* Determine how to handle the ordering of options and nonoptions. */ if (optstring[0] == '-') { ordering = RETURN_IN_ORDER; ++optstring; } else if (optstring[0] == '+') { ordering = REQUIRE_ORDER; ++optstring; } else if (posixly_correct != NULL) ordering = REQUIRE_ORDER; else ordering = PERMUTE; #ifdef _LIBC if (posixly_correct == NULL && argc == original_argc && argv == original_argv) { if (nonoption_flags_max_len == 0) { if (__getopt_nonoption_flags == NULL || __getopt_nonoption_flags[0] == '\0') nonoption_flags_max_len = -1; else { const char *orig_str = __getopt_nonoption_flags; int len = nonoption_flags_max_len = strlen (orig_str); if (nonoption_flags_max_len < argc) nonoption_flags_max_len = argc; __getopt_nonoption_flags = (char *) malloc (nonoption_flags_max_len); if (__getopt_nonoption_flags == NULL) nonoption_flags_max_len = -1; else memset (__mempcpy (__getopt_nonoption_flags, orig_str, len), '\0', nonoption_flags_max_len - len); } } nonoption_flags_len = nonoption_flags_max_len; } else nonoption_flags_len = 0; #endif return optstring; } /* Scan elements of ARGV (whose length is ARGC) for option characters given in OPTSTRING. If an element of ARGV starts with '-', and is not exactly "-" or "--", then it is an option element. The characters of this element (aside from the initial '-') are option characters. If `getopt' is called repeatedly, it returns successively each of the option characters from each of the option elements. If `getopt' finds another option character, it returns that character, updating `optind' and `nextchar' so that the next call to `getopt' can resume the scan with the following option character or ARGV-element. If there are no more option characters, `getopt' returns -1. Then `optind' is the index in ARGV of the first ARGV-element that is not an option. (The ARGV-elements have been permuted so that those that are not options now come last.) OPTSTRING is a string containing the legitimate option characters. If an option character is seen that is not listed in OPTSTRING, return '?' after printing an error message. If you set `opterr' to zero, the error message is suppressed but we still return '?'. If a char in OPTSTRING is followed by a colon, that means it wants an arg, so the following text in the same ARGV-element, or the text of the following ARGV-element, is returned in `optarg'. Two colons mean an option that wants an optional arg; if there is text in the current ARGV-element, it is returned in `optarg', otherwise `optarg' is set to zero. If OPTSTRING starts with `-' or `+', it requests different methods of handling the non-option ARGV-elements. See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. Long-named options begin with `--' instead of `-'. Their names may be abbreviated as long as the abbreviation is unique or is an exact match for some defined option. If they have an argument, it follows the option name in the same ARGV-element, separated from the option name by a `=', or else the in next ARGV-element. When `getopt' finds a long-named option, it returns 0 if that option's `flag' field is nonzero, the value of the option's `val' field if the `flag' field is zero. The elements of ARGV aren't really const, because we permute them. But we pretend they're const in the prototype to be compatible with other systems. LONGOPTS is a vector of `struct option' terminated by an element containing a name which is zero. LONGIND returns the index in LONGOPT of the long-named option found. It is only valid when a long-named option has been found by the most recent call. If LONG_ONLY is nonzero, '-' as well as '--' can introduce long-named options. */ int _getopt_internal (argc, argv, optstring, longopts, longind, long_only) int argc; char *const *argv; const char *optstring; const struct option *longopts; int *longind; int long_only; { optarg = NULL; if (optind == 0 || !__getopt_initialized) { if (optind == 0) optind = 1; /* Don't scan ARGV[0], the program name. */ optstring = _getopt_initialize (argc, argv, optstring); __getopt_initialized = 1; } /* Test whether ARGV[optind] points to a non-option argument. Either it does not have option syntax, or there is an environment flag from the shell indicating it is not an option. The later information is only used when the used in the GNU libc. */ #ifdef _LIBC # define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \ || (optind < nonoption_flags_len \ && __getopt_nonoption_flags[optind] == '1')) #else # define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0') #endif if (nextchar == NULL || *nextchar == '\0') { /* Advance to the next ARGV-element. */ /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been moved back by the user (who may also have changed the arguments). */ if (last_nonopt > optind) last_nonopt = optind; if (first_nonopt > optind) first_nonopt = optind; if (ordering == PERMUTE) { /* If we have just processed some options following some non-options, exchange them so that the options come first. */ if (first_nonopt != last_nonopt && last_nonopt != optind) exchange ((char **) argv); else if (last_nonopt != optind) first_nonopt = optind; /* Skip any additional non-options and extend the range of non-options previously skipped. */ while (optind < argc && NONOPTION_P) optind++; last_nonopt = optind; } /* The special ARGV-element `--' means premature end of options. Skip it like a null option, then exchange with previous non-options as if it were an option, then skip everything else like a non-option. */ if (optind != argc && !strcmp (argv[optind], "--")) { optind++; if (first_nonopt != last_nonopt && last_nonopt != optind) exchange ((char **) argv); else if (first_nonopt == last_nonopt) first_nonopt = optind; last_nonopt = argc; optind = argc; } /* If we have done all the ARGV-elements, stop the scan and back over any non-options that we skipped and permuted. */ if (optind == argc) { /* Set the next-arg-index to point at the non-options that we previously skipped, so the caller will digest them. */ if (first_nonopt != last_nonopt) optind = first_nonopt; return -1; } /* If we have come to a non-option and did not permute it, either stop the scan or describe it to the caller and pass it by. */ if (NONOPTION_P) { if (ordering == REQUIRE_ORDER) return -1; optarg = argv[optind++]; return 1; } /* We have found another option-ARGV-element. Skip the initial punctuation. */ nextchar = (argv[optind] + 1 + (longopts != NULL && argv[optind][1] == '-')); } /* Decode the current option-ARGV-element. */ /* Check whether the ARGV-element is a long option. If long_only and the ARGV-element has the form "-f", where f is a valid short option, don't consider it an abbreviated form of a long option that starts with f. Otherwise there would be no way to give the -f short option. On the other hand, if there's a long option "fubar" and the ARGV-element is "-fu", do consider that an abbreviation of the long option, just like "--fu", and not "-f" with arg "u". This distinction seems to be the most useful approach. */ if (longopts != NULL && (argv[optind][1] == '-' || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1]))))) { char *nameend; const struct option *p; const struct option *pfound = NULL; int exact = 0; int ambig = 0; int indfound = -1; int option_index; for (nameend = nextchar; *nameend && *nameend != '='; nameend++) /* Do nothing. */ ; /* Test all long options for either exact match or abbreviated matches. */ for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!strncmp (p->name, nextchar, nameend - nextchar)) { if ((unsigned int) (nameend - nextchar) == (unsigned int) strlen (p->name)) { /* Exact match found. */ pfound = p; indfound = option_index; exact = 1; break; } else if (pfound == NULL) { /* First nonexact match found. */ pfound = p; indfound = option_index; } else /* Second or later nonexact match found. */ ambig = 1; } if (ambig && !exact) { if (opterr) fprintf (stderr, _("%s: option `%s' is ambiguous\n"), argv[0], argv[optind]); nextchar += strlen (nextchar); optind++; optopt = 0; return '?'; } if (pfound != NULL) { option_index = indfound; optind++; if (*nameend) { /* Don't test has_arg with >, because some C compilers don't allow it to be used on enums. */ if (pfound->has_arg) optarg = nameend + 1; else { if (opterr) { if (argv[optind - 1][1] == '-') /* --option */ fprintf (stderr, _("%s: option `--%s' doesn't allow an argument\n"), argv[0], pfound->name); else /* +option or -option */ fprintf (stderr, _("%s: option `%c%s' doesn't allow an argument\n"), argv[0], argv[optind - 1][0], pfound->name); } nextchar += strlen (nextchar); optopt = pfound->val; return '?'; } } else if (pfound->has_arg == 1) { if (optind < argc) optarg = argv[optind++]; else { if (opterr) fprintf (stderr, _("%s: option `%s' requires an argument\n"), argv[0], argv[optind - 1]); nextchar += strlen (nextchar); optopt = pfound->val; return optstring[0] == ':' ? ':' : '?'; } } nextchar += strlen (nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) { *(pfound->flag) = pfound->val; return 0; } return pfound->val; } /* Can't find it as a long option. If this is not getopt_long_only, or the option starts with '--' or is not a valid short option, then it's an error. Otherwise interpret it as a short option. */ if (!long_only || argv[optind][1] == '-' || my_index (optstring, *nextchar) == NULL) { if (opterr) { if (argv[optind][1] == '-') /* --option */ fprintf (stderr, _("%s: unrecognized option `--%s'\n"), argv[0], nextchar); else /* +option or -option */ fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), argv[0], argv[optind][0], nextchar); } nextchar = (char *) ""; optind++; optopt = 0; return '?'; } } /* Look at and handle the next short option-character. */ { char c = *nextchar++; char *temp = my_index (optstring, c); /* Increment `optind' when we start to process its last character. */ if (*nextchar == '\0') ++optind; if (temp == NULL || c == ':') { if (opterr) { if (posixly_correct) /* 1003.2 specifies the format of this message. */ fprintf (stderr, _("%s: illegal option -- %c\n"), argv[0], c); else fprintf (stderr, _("%s: invalid option -- %c\n"), argv[0], c); } optopt = c; return '?'; } /* Convenience. Treat POSIX -W foo same as long option --foo */ if (temp[0] == 'W' && temp[1] == ';') { char *nameend; const struct option *p; const struct option *pfound = NULL; int exact = 0; int ambig = 0; int indfound = 0; int option_index; /* This is an option that requires an argument. */ if (*nextchar != '\0') { optarg = nextchar; /* If we end this ARGV-element by taking the rest as an arg, we must advance to the next element now. */ optind++; } else if (optind == argc) { if (opterr) { /* 1003.2 specifies the format of this message. */ fprintf (stderr, _("%s: option requires an argument -- %c\n"), argv[0], c); } optopt = c; if (optstring[0] == ':') c = ':'; else c = '?'; return c; } else /* We already incremented `optind' once; increment it again when taking next ARGV-elt as argument. */ optarg = argv[optind++]; /* optarg is now the argument, see if it's in the table of longopts. */ for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++) /* Do nothing. */ ; /* Test all long options for either exact match or abbreviated matches. */ for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!strncmp (p->name, nextchar, nameend - nextchar)) { if ((unsigned int) (nameend - nextchar) == strlen (p->name)) { /* Exact match found. */ pfound = p; indfound = option_index; exact = 1; break; } else if (pfound == NULL) { /* First nonexact match found. */ pfound = p; indfound = option_index; } else /* Second or later nonexact match found. */ ambig = 1; } if (ambig && !exact) { if (opterr) fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), argv[0], argv[optind]); nextchar += strlen (nextchar); optind++; return '?'; } if (pfound != NULL) { option_index = indfound; if (*nameend) { /* Don't test has_arg with >, because some C compilers don't allow it to be used on enums. */ if (pfound->has_arg) optarg = nameend + 1; else { if (opterr) fprintf (stderr, _("\ %s: option `-W %s' doesn't allow an argument\n"), argv[0], pfound->name); nextchar += strlen (nextchar); return '?'; } } else if (pfound->has_arg == 1) { if (optind < argc) optarg = argv[optind++]; else { if (opterr) fprintf (stderr, _("%s: option `%s' requires an argument\n"), argv[0], argv[optind - 1]); nextchar += strlen (nextchar); return optstring[0] == ':' ? ':' : '?'; } } nextchar += strlen (nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) { *(pfound->flag) = pfound->val; return 0; } return pfound->val; } nextchar = NULL; return 'W'; /* Let the application handle it. */ } if (temp[1] == ':') { if (temp[2] == ':') { /* This is an option that accepts an argument optionally. */ if (*nextchar != '\0') { optarg = nextchar; optind++; } else optarg = NULL; nextchar = NULL; } else { /* This is an option that requires an argument. */ if (*nextchar != '\0') { optarg = nextchar; /* If we end this ARGV-element by taking the rest as an arg, we must advance to the next element now. */ optind++; } else if (optind == argc) { if (opterr) { /* 1003.2 specifies the format of this message. */ fprintf (stderr, _("%s: option requires an argument -- %c\n"), argv[0], c); } optopt = c; if (optstring[0] == ':') c = ':'; else c = '?'; } else /* We already incremented `optind' once; increment it again when taking next ARGV-elt as argument. */ optarg = argv[optind++]; nextchar = NULL; } } return c; } } int getopt (argc, argv, optstring) int argc; char *const *argv; const char *optstring; { return _getopt_internal (argc, argv, optstring, (const struct option *) 0, (int *) 0, 0); } #endif /* Not ELIDE_CODE. */ #ifdef TEST /* Compile with -DTEST to make an executable for use in testing the above definition of `getopt'. */ int main (argc, argv) int argc; char **argv; { int c; int digit_optind = 0; while (1) { int this_option_optind = optind ? optind : 1; c = getopt (argc, argv, "abc:d:0123456789"); if (c == -1) break; switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (digit_optind != 0 && digit_optind != this_option_optind) printf ("digits occur in two different argv-elements.\n"); digit_optind = this_option_optind; printf ("option %c\n", c); break; case 'a': printf ("option a\n"); break; case 'b': printf ("option b\n"); break; case 'c': printf ("option c with value `%s'\n", optarg); break; case '?': break; default: printf ("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); printf ("\n"); } exit (0); } #endif /* TEST */ mumble-1.3.4/3rdparty/celt-0.11.0-src/tools/celtclient.c0000664000175000017500000002010114010707315022261 0ustar builderbuilder/*************************************************************************** Copyright (C) 2004-2006 by Jean-Marc Valin Copyright (C) 2006 Commonwealth Scientific and Industrial Research Organisation (CSIRO) Australia Copyright (C) 2008-2009 Gregory Maxwell Copyright (c) 2007-2009 Xiph.Org Foundation Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************************************************************/ /* Compile with something like: * gcc -oceltclient celtclient.c alsa_device.c -I../libcelt/ -lspeexdsp -lasound -lcelt -lm */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include #include /* close() */ #include /* memset() */ #include "alsa_device.h" #include #include #include #define MAX_MSG 1500 #define SAMPLING_RATE 48000 #define FRAME_SIZE 256 #define PACKETSIZE 43 #define CHANNELS 1 #define HAS_SPEEX_AEC #if CHANNELS == 2 /* FIXME: The Speex AEC has multichannel support; but that API isn't being used here yet. */ #undef HAS_SPEEX_AEC #endif #ifdef HAS_SPEEX_AEC #include #endif int main(int argc, char *argv[]) { int sd, rc, n; int i; struct sockaddr_in cliAddr, remoteAddr; char msg[MAX_MSG]; struct hostent *h; int local_port, remote_port; int nfds; struct pollfd *pfds; AlsaDevice *audio_dev; int tmp; if (argc != 5) { fprintf(stderr, "Usage %s plughw:0,0 remote_host local_udp_port remote_udp_port\n",argv[0]); exit(1); } h = gethostbyname(argv[2]); if(h==NULL) { fprintf(stderr, "%s: unknown host '%s' \n", argv[0], argv[2]); exit(1); } local_port = atoi(argv[3]); remote_port = atoi(argv[4]); printf("%s: sending data to '%s' (IP : %s) \n", argv[0], h->h_name, inet_ntoa(*(struct in_addr *)h->h_addr_list[0])); { remoteAddr.sin_family = h->h_addrtype; memcpy((char *) &remoteAddr.sin_addr.s_addr, h->h_addr_list[0], h->h_length); remoteAddr.sin_port = htons(remote_port); } /* socket creation */ sd=socket(AF_INET, SOCK_DGRAM, 0); if(sd<0) { printf("%s: cannot open socket \n",argv[0]); exit(1); } /* bind any port */ cliAddr.sin_family = AF_INET; cliAddr.sin_addr.s_addr = htonl(INADDR_ANY); cliAddr.sin_port = htons(local_port); rc = bind(sd, (struct sockaddr *) &cliAddr, sizeof(cliAddr)); if(rc<0) { printf("%s: cannot bind port\n", argv[0]); exit(1); } /* Setup audio device */ audio_dev = alsa_device_open(argv[1], SAMPLING_RATE, CHANNELS, FRAME_SIZE); /* Setup the encoder and decoder in wideband */ CELTEncoder *enc_state; CELTDecoder *dec_state; CELTMode *mode = celt_mode_create(SAMPLING_RATE, FRAME_SIZE, NULL); enc_state = celt_encoder_create_custom(mode, CHANNELS, NULL); dec_state = celt_decoder_create_custom(mode, CHANNELS, NULL); struct sched_param param; /*param.sched_priority = 40; */ param.sched_priority = sched_get_priority_min(SCHED_FIFO); if (sched_setscheduler(0,SCHED_FIFO,¶m)) perror("sched_setscheduler"); int send_timestamp = 0; int recv_started=0; /* Setup all file descriptors for poll()ing */ nfds = alsa_device_nfds(audio_dev); pfds = malloc(sizeof(*pfds)*(nfds+1)); alsa_device_getfds(audio_dev, pfds, nfds); pfds[nfds].fd = sd; pfds[nfds].events = POLLIN; /* Setup jitter buffer using decoder */ JitterBuffer *jitter; jitter = jitter_buffer_init(FRAME_SIZE); tmp = FRAME_SIZE; jitter_buffer_ctl(jitter, JITTER_BUFFER_SET_MARGIN, &tmp); #ifdef HAS_SPEEX_AEC /* Echo canceller with 200 ms tail length */ SpeexEchoState *echo_state = speex_echo_state_init(FRAME_SIZE, 10*FRAME_SIZE); tmp = SAMPLING_RATE; speex_echo_ctl(echo_state, SPEEX_ECHO_SET_SAMPLING_RATE, &tmp); #endif alsa_device_start(audio_dev); /* Infinite loop on capture, playback and receiving packets */ while (1) { /* Wait for either 1) capture 2) playback 3) socket data */ poll(pfds, nfds+1, -1); /* Received packets */ if (pfds[nfds].revents & POLLIN) { n = recv(sd, msg, MAX_MSG, 0); int recv_timestamp = ((int*)msg)[0]; JitterBufferPacket packet; packet.data = msg+4; packet.len = n-4; packet.timestamp = recv_timestamp; packet.span = FRAME_SIZE; packet.sequence = 0; /* Put content of the packet into the jitter buffer, except for the pseudo-header */ jitter_buffer_put(jitter, &packet); recv_started = 1; } /* Ready to play a frame (playback) */ if (alsa_device_playback_ready(audio_dev, pfds, nfds)) { short pcm[FRAME_SIZE*CHANNELS]; if (recv_started) { JitterBufferPacket packet; /* Get audio from the jitter buffer */ packet.data = msg; packet.len = MAX_MSG; jitter_buffer_tick(jitter); jitter_buffer_get(jitter, &packet, FRAME_SIZE, NULL); if (packet.len==0) packet.data=NULL; celt_decode(dec_state, packet.data, packet.len, pcm, FRAME_SIZE); } else { for (i=0;i #include struct AlsaDevice_ { char *device_name; int channels; int period; snd_pcm_t *capture_handle; snd_pcm_t *playback_handle; int readN, writeN; struct pollfd *read_fd, *write_fd; }; #define PERIODS 3 AlsaDevice *alsa_device_open(char *device_name, unsigned int rate, int channels, int period) { int dir; int err; snd_pcm_hw_params_t *hw_params; snd_pcm_sw_params_t *sw_params; snd_pcm_uframes_t period_size = period; snd_pcm_uframes_t buffer_size = PERIODS*period; static snd_output_t *jcd_out; AlsaDevice *dev = malloc(sizeof(*dev)); if (!dev) return NULL; dev->device_name = malloc(1+strlen(device_name)); if (!dev->device_name) { free(dev); return NULL; } strcpy(dev->device_name, device_name); dev->channels = channels; dev->period = period; err = snd_output_stdio_attach(&jcd_out, stdout, 0); if ((err = snd_pcm_open (&dev->capture_handle, dev->device_name, SND_PCM_STREAM_CAPTURE, 0)) < 0) { fprintf (stderr, "cannot open audio device %s (%s)\n", dev->device_name, snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params_malloc (&hw_params)) < 0) { fprintf (stderr, "cannot allocate hardware parameter structure (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params_any (dev->capture_handle, hw_params)) < 0) { fprintf (stderr, "cannot initialize hardware parameter structure (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params_set_access (dev->capture_handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) { fprintf (stderr, "cannot set access type (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params_set_format (dev->capture_handle, hw_params, SND_PCM_FORMAT_S16_LE)) < 0) { fprintf (stderr, "cannot set sample format (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params_set_rate_near (dev->capture_handle, hw_params, &rate, 0)) < 0) { fprintf (stderr, "cannot set sample rate (%s)\n", snd_strerror (err)); assert(0); } /*fprintf (stderr, "rate = %d\n", rate);*/ if ((err = snd_pcm_hw_params_set_channels (dev->capture_handle, hw_params, channels)) < 0) { fprintf (stderr, "cannot set channel count (%s)\n", snd_strerror (err)); assert(0); } period_size = period; dir = 0; if ((err = snd_pcm_hw_params_set_period_size_near (dev->capture_handle, hw_params, &period_size, &dir)) < 0) { fprintf (stderr, "cannot set period size (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params_set_periods (dev->capture_handle, hw_params, PERIODS, 0)) < 0) { fprintf (stderr, "cannot set number of periods (%s)\n", snd_strerror (err)); assert(0); } buffer_size = period_size * PERIODS; dir=0; if ((err = snd_pcm_hw_params_set_buffer_size_near (dev->capture_handle, hw_params, &buffer_size)) < 0) { fprintf (stderr, "cannot set buffer time (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params (dev->capture_handle, hw_params)) < 0) { fprintf (stderr, "cannot set capture parameters (%s)\n", snd_strerror (err)); assert(0); } /*snd_pcm_dump_setup(dev->capture_handle, jcd_out);*/ snd_pcm_hw_params_free (hw_params); if ((err = snd_pcm_sw_params_malloc (&sw_params)) < 0) { fprintf (stderr, "cannot allocate software parameters structure (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_sw_params_current (dev->capture_handle, sw_params)) < 0) { fprintf (stderr, "cannot initialize software parameters structure (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_sw_params_set_avail_min (dev->capture_handle, sw_params, period)) < 0) { fprintf (stderr, "cannot set minimum available count (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_sw_params (dev->capture_handle, sw_params)) < 0) { fprintf (stderr, "cannot set software parameters (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_open (&dev->playback_handle, dev->device_name, SND_PCM_STREAM_PLAYBACK, 0)) < 0) { fprintf (stderr, "cannot open audio device %s (%s)\n", dev->device_name, snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params_malloc (&hw_params)) < 0) { fprintf (stderr, "cannot allocate hardware parameter structure (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params_any (dev->playback_handle, hw_params)) < 0) { fprintf (stderr, "cannot initialize hardware parameter structure (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params_set_access (dev->playback_handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) { fprintf (stderr, "cannot set access type (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params_set_format (dev->playback_handle, hw_params, SND_PCM_FORMAT_S16_LE)) < 0) { fprintf (stderr, "cannot set sample format (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params_set_rate_near (dev->playback_handle, hw_params, &rate, 0)) < 0) { fprintf (stderr, "cannot set sample rate (%s)\n", snd_strerror (err)); assert(0); } /*fprintf (stderr, "rate = %d\n", rate);*/ if ((err = snd_pcm_hw_params_set_channels (dev->playback_handle, hw_params, channels)) < 0) { fprintf (stderr, "cannot set channel count (%s)\n", snd_strerror (err)); assert(0); } period_size = period; dir = 0; if ((err = snd_pcm_hw_params_set_period_size_near (dev->playback_handle, hw_params, &period_size, &dir)) < 0) { fprintf (stderr, "cannot set period size (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params_set_periods (dev->playback_handle, hw_params, PERIODS, 0)) < 0) { fprintf (stderr, "cannot set number of periods (%s)\n", snd_strerror (err)); assert(0); } buffer_size = period_size * PERIODS; dir=0; if ((err = snd_pcm_hw_params_set_buffer_size_near (dev->playback_handle, hw_params, &buffer_size)) < 0) { fprintf (stderr, "cannot set buffer time (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_hw_params (dev->playback_handle, hw_params)) < 0) { fprintf (stderr, "cannot set playback parameters (%s)\n", snd_strerror (err)); assert(0); } /*snd_pcm_dump_setup(dev->playback_handle, jcd_out);*/ snd_pcm_hw_params_free (hw_params); if ((err = snd_pcm_sw_params_malloc (&sw_params)) < 0) { fprintf (stderr, "cannot allocate software parameters structure (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_sw_params_current (dev->playback_handle, sw_params)) < 0) { fprintf (stderr, "cannot initialize software parameters structure (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_sw_params_set_avail_min (dev->playback_handle, sw_params, period)) < 0) { fprintf (stderr, "cannot set minimum available count (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_sw_params_set_start_threshold (dev->playback_handle, sw_params, period)) < 0) { fprintf (stderr, "cannot set start mode (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_sw_params (dev->playback_handle, sw_params)) < 0) { fprintf (stderr, "cannot set software parameters (%s)\n", snd_strerror (err)); assert(0); } snd_pcm_link(dev->capture_handle, dev->playback_handle); if ((err = snd_pcm_prepare (dev->capture_handle)) < 0) { fprintf (stderr, "cannot prepare audio interface for use (%s)\n", snd_strerror (err)); assert(0); } if ((err = snd_pcm_prepare (dev->playback_handle)) < 0) { fprintf (stderr, "cannot prepare audio interface for use (%s)\n", snd_strerror (err)); assert(0); } dev->readN = snd_pcm_poll_descriptors_count(dev->capture_handle); dev->writeN = snd_pcm_poll_descriptors_count(dev->playback_handle); dev->read_fd = malloc(dev->readN*sizeof(*dev->read_fd)); /*printf ("descriptors: %d %d\n", dev->readN, dev->writeN);*/ if (snd_pcm_poll_descriptors(dev->capture_handle, dev->read_fd, dev->readN) != dev->readN) { fprintf (stderr, "cannot obtain capture file descriptors (%s)\n", snd_strerror (err)); assert(0); } dev->write_fd = malloc(dev->writeN*sizeof(*dev->read_fd)); if (snd_pcm_poll_descriptors(dev->playback_handle, dev->write_fd, dev->writeN) != dev->writeN) { fprintf (stderr, "cannot obtain playback file descriptors (%s)\n", snd_strerror (err)); assert(0); } return dev; } void alsa_device_close(AlsaDevice *dev) { snd_pcm_close(dev->capture_handle); snd_pcm_close(dev->playback_handle); free(dev->device_name); free(dev); } int alsa_device_read(AlsaDevice *dev, short *pcm, int len) { int err; /*fprintf (stderr, "-");*/ if ((err = snd_pcm_readi (dev->capture_handle, pcm, len)) != len) { if (err<0) { //fprintf(stderr, "error %d, EPIPE = %d\n", err, EPIPE); if (err == -EPIPE) { fprintf (stderr, "An overrun has occured, reseting capture\n"); } else { fprintf (stderr, "read from audio interface failed (%s)\n", snd_strerror (err)); } if ((err = snd_pcm_prepare (dev->capture_handle)) < 0) { fprintf (stderr, "cannot prepare audio interface for use (%s)\n", snd_strerror (err)); } if ((err = snd_pcm_start (dev->capture_handle)) < 0) { fprintf (stderr, "cannot prepare audio interface for use (%s)\n", snd_strerror (err)); } /*alsa_device_read(dev,pcm,len);*/ } else { fprintf (stderr, "Couldn't read as many samples as I wanted (%d instead of %d)\n", err, len); } return 1; } return 0; } int alsa_device_write(AlsaDevice *dev, const short *pcm, int len) { int err; /*fprintf (stderr, "+");*/ if ((err = snd_pcm_writei (dev->playback_handle, pcm, len)) != len) { if (err<0) { if (err == -EPIPE) { fprintf (stderr, "An underrun has occured, reseting playback, len=%d\n", len); } else { fprintf (stderr, "write to audio interface failed (%s)\n", snd_strerror (err)); } if ((err = snd_pcm_prepare (dev->playback_handle)) < 0) { fprintf (stderr, "cannot prepare audio interface for use (%s)\n", snd_strerror (err)); } } else { fprintf (stderr, "Couldn't write as many samples as I wanted (%d instead of %d)\n", err, len); } /*alsa_device_write(dev,pcm,len);*/ return 1; } return 0; } int alsa_device_capture_ready(AlsaDevice *dev, struct pollfd *pfds, unsigned int nfds) { unsigned short revents=0; int err; if ((err = snd_pcm_poll_descriptors_revents(dev->capture_handle, pfds, dev->readN, &revents)) < 0) { //cerr << "error in snd_pcm_poll_descriptors_revents for capture: " << snd_strerror (err) << endl; //FIXME: This is a kludge fprintf (stderr, "error in alsa_device_capture_ready: %s\n", snd_strerror (err)); return pfds[0].revents & POLLIN; } //cerr << (revents & POLLERR) << endl; return revents & POLLIN; } int alsa_device_playback_ready(AlsaDevice *dev, struct pollfd *pfds, unsigned int nfds) { unsigned short revents=0; int err; if ((err = snd_pcm_poll_descriptors_revents(dev->playback_handle, pfds+dev->readN, dev->writeN, &revents)) < 0) { //cerr << "error in snd_pcm_poll_descriptors_revents for playback: " << snd_strerror (err) << endl; //FIXME: This is a kludge fprintf (stderr, "error in alsa_device_playback_ready: %s\n", snd_strerror (err)); return pfds[1].revents & POLLOUT; } //cerr << (revents & POLLERR) << endl; return revents & POLLOUT; } void alsa_device_start(AlsaDevice *dev) { int i; short pcm[dev->period*dev->channels]; for (i=0;iperiod*dev->channels;i++) pcm[i] = 0; alsa_device_write(dev, pcm, dev->period); alsa_device_write(dev, pcm, dev->period); snd_pcm_start(dev->capture_handle); snd_pcm_start(dev->playback_handle); } int alsa_device_nfds(AlsaDevice *dev) { return dev->writeN+dev->readN; } void alsa_device_getfds(AlsaDevice *dev, struct pollfd *pfds, unsigned int nfds) { int i; assert (nfds >= dev->writeN+dev->readN); for (i=0;ireadN;i++) pfds[i] = dev->read_fd[i]; for (i=0;iwriteN;i++) pfds[i+dev->readN] = dev->write_fd[i]; } mumble-1.3.4/3rdparty/celt-0.11.0-src/tools/celtdec.c0000664000175000017500000004546014010707315021555 0ustar builderbuilder/* Copyright (c) 2002-2007 Jean-Marc Valin Copyright (c) 2008 CSIRO Copyright (c) 2007-2009 Xiph.Org Foundation File: celtdec.c Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #if !defined WIN32 && !defined _WIN32 #include #endif #ifdef HAVE_GETOPT_H #include #endif #ifndef HAVE_GETOPT_LONG #include "getopt_win.h" #endif #include #include #include #include #if defined WIN32 || defined _WIN32 #include "wave_out.h" /* We need the following two to set stdout to binary */ #include #include #endif #include #ifdef __MINGW32__ #include "wave_out.c" #endif #ifdef HAVE_SYS_SOUNDCARD_H #include #include #include #include #include #elif defined HAVE_SYS_AUDIOIO_H #include #include #include #include #ifndef AUDIO_ENCODING_SLINEAR #define AUDIO_ENCODING_SLINEAR AUDIO_ENCODING_LINEAR /* Solaris */ #endif #endif #include #include "wav_io.h" #include #define MAX_FRAME_SIZE 2048 #define readint(buf, base) (((buf[base+3]<<24)&0xff000000)| \ ((buf[base+2]<<16)&0xff0000)| \ ((buf[base+1]<<8)&0xff00)| \ (buf[base]&0xff)) static void print_comments(char *comments, int length) { char *c=comments; int len, i, nb_fields; char *end; if (length<8) { fprintf (stderr, "Invalid/corrupted comments\n"); return; } end = c+length; len=readint(c, 0); c+=4; if (len < 0 || c+len>end) { fprintf (stderr, "Invalid/corrupted comments\n"); return; } fwrite(c, 1, len, stderr); c+=len; fprintf (stderr, "\n"); if (c+4>end) { fprintf (stderr, "Invalid/corrupted comments\n"); return; } nb_fields=readint(c, 0); c+=4; for (i=0;iend) { fprintf (stderr, "Invalid/corrupted comments\n"); return; } len=readint(c, 0); c+=4; if (len < 0 || c+len>end) { fprintf (stderr, "Invalid/corrupted comments\n"); return; } fwrite(c, 1, len, stderr); c+=len; fprintf (stderr, "\n"); } } FILE *out_file_open(char *outFile, int rate, int *channels) { FILE *fout=NULL; /*Open output file*/ if (strlen(outFile)==0) { #if defined HAVE_SYS_SOUNDCARD_H int audio_fd, format, stereo; audio_fd=open("/dev/dsp", O_WRONLY); if (audio_fd<0) { perror("Cannot open /dev/dsp"); exit(1); } format=AFMT_S16_NE; if (ioctl(audio_fd, SNDCTL_DSP_SETFMT, &format)==-1) { perror("SNDCTL_DSP_SETFMT"); close(audio_fd); exit(1); } stereo=0; if (*channels==2) stereo=1; if (ioctl(audio_fd, SNDCTL_DSP_STEREO, &stereo)==-1) { perror("SNDCTL_DSP_STEREO"); close(audio_fd); exit(1); } if (stereo!=0) { if (*channels==1) fprintf (stderr, "Cannot set mono mode, will decode in stereo\n"); *channels=2; } if (ioctl(audio_fd, SNDCTL_DSP_SPEED, &rate)==-1) { perror("SNDCTL_DSP_SPEED"); close(audio_fd); exit(1); } fout = fdopen(audio_fd, "w"); #elif defined HAVE_SYS_AUDIOIO_H audio_info_t info; int audio_fd; audio_fd = open("/dev/audio", O_WRONLY); if (audio_fd<0) { perror("Cannot open /dev/audio"); exit(1); } AUDIO_INITINFO(&info); #ifdef AUMODE_PLAY /* NetBSD/OpenBSD */ info.mode = AUMODE_PLAY; #endif info.play.encoding = AUDIO_ENCODING_SLINEAR; info.play.precision = 16; info.play.sample_rate = rate; info.play.channels = *channels; if (ioctl(audio_fd, AUDIO_SETINFO, &info) < 0) { perror ("AUDIO_SETINFO"); exit(1); } fout = fdopen(audio_fd, "w"); #elif defined WIN32 || defined _WIN32 { unsigned int celt_channels = *channels; if (Set_WIN_Params (INVALID_FILEDESC, rate, SAMPLE_SIZE, celt_channels)) { fprintf (stderr, "Can't access %s\n", "WAVE OUT"); exit(1); } } #else fprintf (stderr, "No soundcard support\n"); exit(1); #endif } else { if (strcmp(outFile,"-")==0) { #if defined WIN32 || defined _WIN32 _setmode(_fileno(stdout), _O_BINARY); #endif fout=stdout; } else { fout = fopen(outFile, "wb"); if (!fout) { perror(outFile); exit(1); } if (strcmp(outFile+strlen(outFile)-4,".wav")==0 || strcmp(outFile+strlen(outFile)-4,".WAV")==0) write_wav_header(fout, rate, *channels, 0, 0); } } return fout; } void usage(void) { printf ("Usage: celtdec [options] input_file.oga [output_file]\n"); printf ("\n"); printf ("Decodes a CELT file and produce a WAV file or raw file\n"); printf ("\n"); printf ("input_file can be:\n"); printf (" filename.oga regular CELT file\n"); printf (" - stdin\n"); printf ("\n"); printf ("output_file can be:\n"); printf (" filename.wav Wav file\n"); printf (" filename.* Raw PCM file (any extension other that .wav)\n"); printf (" - stdout\n"); printf (" (nothing) Will be played to soundcard\n"); printf ("\n"); printf ("Options:\n"); printf (" --mono Force decoding in mono\n"); printf (" --stereo Force decoding in stereo\n"); printf (" --rate n Force decoding at sampling rate n Hz\n"); printf (" --packet-loss n Simulate n %% random packet loss\n"); printf (" -V Verbose mode (show bit-rate)\n"); printf (" -h, --help This help\n"); printf (" -v, --version Version information\n"); printf ("\n"); } void version(void) { printf ("celtenc (CELT %s encoder)\n",CELT_VERSION); printf ("Copyright (C) 2008 Jean-Marc Valin\n"); } void version_short(void) { printf ("celtenc (CELT %s encoder)\n",CELT_VERSION); printf ("Copyright (C) 2008 Jean-Marc Valin\n"); } static CELTDecoder *process_header(ogg_packet *op, celt_int32 enh_enabled, celt_int32 *frame_size, int *granule_frame_size, celt_int32 *rate, int *nframes, int forceMode, int *channels, int *overlap, int *extra_headers, int quiet, CELTMode **mode) { CELTDecoder *st; CELTHeader header; int bitstream; celt_header_from_packet(op->packet, op->bytes, &header); if (header.nb_channels>2 || header.nb_channels<1) { fprintf (stderr, "Unsupported number of channels: %d\n", header.nb_channels); return NULL; } *mode = celt_mode_create(header.sample_rate, header.frame_size, NULL); if (*mode == NULL) { fprintf (stderr, "Mode initialization failed.\n"); return NULL; } celt_mode_info(*mode, CELT_GET_BITSTREAM_VERSION, &bitstream); if (bitstream!=header.version_id) fprintf(stderr, "WARNING: Input was encoded with a CELT bitstream version %d. This decoder uses %d. Output will probably be corrupted.\n",header.version_id,bitstream); *channels = header.nb_channels; *overlap=header.overlap; st = celt_decoder_create_custom(*mode, header.nb_channels, NULL); if (!st) { fprintf (stderr, "Decoder initialization failed.\n"); return NULL; } /*celt_mode_info(*mode, CELT_GET_FRAME_SIZE, frame_size);*/ *frame_size = header.frame_size; *granule_frame_size = *frame_size; if (!*rate) *rate = header.sample_rate; *nframes = 1; if (!quiet) { fprintf (stderr, "Decoding %d Hz audio in", *rate); if (*channels==1) fprintf (stderr, " (mono"); else fprintf (stderr, " (stereo"); fprintf(stderr, ")\n"); } *extra_headers = header.extra_headers; return st; } int main(int argc, char **argv) { int c; int option_index = 0; char *inFile, *outFile; FILE *fin, *fout=NULL; short out[MAX_FRAME_SIZE]; short output[MAX_FRAME_SIZE]; int frame_size=0, granule_frame_size=0; void *st=NULL; CELTMode *mode=NULL; int packet_count=0; int stream_init = 0; int quiet = 0; ogg_int64_t page_granule=0, last_granule=0; int skip_samples=0, page_nb_packets; struct option long_options[] = { {"help", no_argument, NULL, 0}, {"quiet", no_argument, NULL, 0}, {"version", no_argument, NULL, 0}, {"version-short", no_argument, NULL, 0}, {"rate", required_argument, NULL, 0}, {"mono", no_argument, NULL, 0}, {"stereo", no_argument, NULL, 0}, {"packet-loss", required_argument, NULL, 0}, {0, 0, 0, 0} }; ogg_sync_state oy; ogg_page og; ogg_packet op; ogg_stream_state os; int enh_enabled; int nframes=2; int print_bitrate=0; int close_in=0; int eos=0; int forceMode=-1; int audio_size=0; float loss_percent=-1; int channels=-1; int rate=0; int extra_headers=0; int wav_format=0; int lookahead=0; int celt_serialno = -1; int firstpacket = 1; enh_enabled = 1; /*Process options*/ while(1) { c = getopt_long (argc, argv, "hvV", long_options, &option_index); if (c==-1) break; switch(c) { case 0: if (strcmp(long_options[option_index].name,"help")==0) { usage(); exit(0); } else if (strcmp(long_options[option_index].name,"quiet")==0) { quiet = 1; } else if (strcmp(long_options[option_index].name,"version")==0) { version(); exit(0); } else if (strcmp(long_options[option_index].name,"version-short")==0) { version_short(); exit(0); } else if (strcmp(long_options[option_index].name,"mono")==0) { channels=1; } else if (strcmp(long_options[option_index].name,"stereo")==0) { channels=2; } else if (strcmp(long_options[option_index].name,"rate")==0) { rate=atoi (optarg); } else if (strcmp(long_options[option_index].name,"packet-loss")==0) { loss_percent = atof(optarg); } break; case 'h': usage(); exit(0); break; case 'v': version(); exit(0); break; case 'V': print_bitrate=1; break; case '?': usage(); exit(1); break; } } if (argc-optind!=2 && argc-optind!=1) { usage(); exit(1); } inFile=argv[optind]; if (argc-optind==2) outFile=argv[optind+1]; else outFile = ""; wav_format = strlen(outFile)>=4 && ( strcmp(outFile+strlen(outFile)-4,".wav")==0 || strcmp(outFile+strlen(outFile)-4,".WAV")==0); /*Open input file*/ if (strcmp(inFile, "-")==0) { #if defined WIN32 || defined _WIN32 _setmode(_fileno(stdin), _O_BINARY); #endif fin=stdin; } else { fin = fopen(inFile, "rb"); if (!fin) { perror(inFile); exit(1); } close_in=1; } /*Init Ogg data struct*/ ogg_sync_init(&oy); /*Main decoding loop*/ while (1) { char *data; int i, nb_read; /*Get the ogg buffer for writing*/ data = ogg_sync_buffer(&oy, 200); /*Read bitstream from input file*/ nb_read = fread(data, sizeof(char), 200, fin); ogg_sync_wrote(&oy, nb_read); /*Loop for all complete pages we got (most likely only one)*/ while (ogg_sync_pageout(&oy, &og)==1) { if (stream_init == 0) { ogg_stream_init(&os, ogg_page_serialno(&og)); stream_init = 1; } if (ogg_page_serialno(&og) != os.serialno) { /* so all streams are read. */ ogg_stream_reset_serialno(&os, ogg_page_serialno(&og)); } /*Add page to the bitstream*/ ogg_stream_pagein(&os, &og); page_granule = ogg_page_granulepos(&og); page_nb_packets = ogg_page_packets(&og); if (page_granule>0 && frame_size) { /* FIXME: shift the granule values if --force-* is specified */ skip_samples = frame_size*(page_nb_packets*granule_frame_size*nframes - (page_granule-last_granule))/granule_frame_size; if (ogg_page_eos(&og)) skip_samples = -skip_samples; /*else if (!ogg_page_bos(&og)) skip_samples = 0;*/ } else { skip_samples = 0; } /*printf ("page granulepos: %d %d %d\n", skip_samples, page_nb_packets, (int)page_granule);*/ last_granule = page_granule; /*Extract all available packets*/ while (!eos && ogg_stream_packetout(&os, &op) == 1) { if (op.bytes>=8 && !memcmp(op.packet, "CELT ", 8)) { celt_serialno = os.serialno; } if (celt_serialno == -1 || os.serialno != celt_serialno) break; /*If first packet, process as CELT header*/ if (packet_count==0) { st = process_header(&op, enh_enabled, &frame_size, &granule_frame_size, &rate, &nframes, forceMode, &channels, &lookahead, &extra_headers, quiet, &mode); if (!st) exit(1); if (!nframes) nframes=1; fout = out_file_open(outFile, rate, &channels); } else if (packet_count==1) { if (!quiet) print_comments((char*)op.packet, op.bytes); } else if (packet_count<=1+extra_headers) { /* Ignore extra headers */ } else { int lost=0; if (loss_percent>0 && 100*((float)rand())/RAND_MAX0) { #if defined WIN32 || defined _WIN32 if (strlen(outFile)==0) WIN_Play_Samples (out+frame_offset*channels, sizeof(short) * new_frame_size*channels); else #endif fwrite(out+frame_offset*channels, sizeof(short), new_frame_size*channels, fout); audio_size+=sizeof(short)*new_frame_size*channels; } } } } packet_count++; } } if (feof(fin)) break; } if (fout && wav_format) { if (fseek(fout,4,SEEK_SET)==0) { int tmp; tmp = le_int(audio_size+36); fwrite(&tmp,4,1,fout); if (fseek(fout,32,SEEK_CUR)==0) { tmp = le_int(audio_size); fwrite(&tmp,4,1,fout); } else { fprintf (stderr, "First seek worked, second didn't\n"); } } else { fprintf (stderr, "Cannot seek on wave file, size will be incorrect\n"); } } if (st) { celt_decoder_destroy(st); celt_mode_destroy(mode); } else { fprintf (stderr, "This doesn't look like a CELT file\n"); } if (stream_init) ogg_stream_clear(&os); ogg_sync_clear(&oy); #if defined WIN32 || defined _WIN32 if (strlen(outFile)==0) WIN_Audio_close (); #endif if (close_in) fclose(fin); if (fout != NULL) fclose(fout); return 0; } mumble-1.3.4/3rdparty/celt-0.11.0-src/tools/alsa_device.h0000664000175000017500000000427314010707315022413 0ustar builderbuilder/* Copyright (C) 2004-2006 Jean-Marc Valin Copyright (C) 2006 Commonwealth Scientific and Industrial Research Organisation (CSIRO) Australia Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef ALSA_DEVICE_H #define ALSA_DEVICE_H #include #ifdef __cplusplus extern "C" { #endif struct AlsaDevice_; typedef struct AlsaDevice_ AlsaDevice; AlsaDevice *alsa_device_open(char *device_name, unsigned int rate, int channels, int period); void alsa_device_close(AlsaDevice *dev); int alsa_device_read(AlsaDevice *dev, short *pcm, int len); int alsa_device_write(AlsaDevice *dev, const short *pcm, int len); int alsa_device_capture_ready(AlsaDevice *dev, struct pollfd *pfds, unsigned int nfds); int alsa_device_playback_ready(AlsaDevice *dev, struct pollfd *pfds, unsigned int nfds); void alsa_device_start(AlsaDevice *dev); int alsa_device_nfds(AlsaDevice *dev); void alsa_device_getfds(AlsaDevice *dev, struct pollfd *pfds, unsigned int nfds); #ifdef __cplusplus } #endif #endif mumble-1.3.4/3rdparty/celt-0.11.0-src/tools/Makefile.am0000664000175000017500000000131514010707315022031 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # $Id: Makefile.am,v 1.11 2004/02/18 06:59:40 jm Exp $ # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies INCLUDES = -I$(top_srcdir)/libcelt -I$(top_builddir)/ @OGG_CFLAGS@ EXTRA_DIST = getopt_win.h getopt.c getopt1.c wave_out.c wave_out.h skeleton.h include_HEADERS = noinst_HEADERS = wav_io.h bin_PROGRAMS = celtenc celtdec celtenc_SOURCES = celtenc.c wav_io.c skeleton.c celtenc_LDADD = $(top_builddir)/libcelt/libcelt@LIBCELT_SUFFIX@.la $(OGG_LIBS) celtdec_SOURCES = celtdec.c wav_io.c celtdec_LDADD = $(top_builddir)/libcelt/libcelt@LIBCELT_SUFFIX@.la $(OGG_LIBS) mumble-1.3.4/3rdparty/celt-0.11.0-src/tools/getopt_win.h0000664000175000017500000001361614010707315022334 0ustar builderbuilder/* Declarations for getopt. Copyright (C) 1989,90,91,92,93,94,96,97,98 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with the GNU C Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _GETOPT_H #ifndef __need_getopt # define _GETOPT_H 1 #endif #ifdef __cplusplus extern "C" { #endif /* For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, the argument value is returned here. Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ extern char *optarg; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to `getopt'. On entry to `getopt', zero means this is the first call; initialize. When `getopt' returns -1, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, `optind' communicates from one call to the next how much of ARGV has been scanned so far. */ extern int optind; /* Callers store zero here to inhibit the error message `getopt' prints for unrecognized options. */ extern int opterr; /* Set to an option character which was unrecognized. */ extern int optopt; #ifndef __need_getopt /* Describe the long-named options requested by the application. The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector of `struct option' terminated by an element containing a name which is zero. The field `has_arg' is: no_argument (or 0) if the option does not take an argument, required_argument (or 1) if the option requires an argument, optional_argument (or 2) if the option takes an optional argument. If the field `flag' is not NULL, it points to a variable that is set to the value given in the field `val' when the option is found, but left unchanged if the option is not found. To have a long-named option do something other than set an `int' to a compiled-in constant, such as set a value from `optarg', set the option's `flag' field to zero and its `val' field to a nonzero value (the equivalent single-letter option character, if there is one). For long options that have a zero `flag' field, `getopt' returns the contents of the `val' field. */ struct option { # if defined __STDC__ && __STDC__ const char *name; # else char *name; # endif /* has_arg can't be an enum because some compilers complain about type mismatches in all the code that assumes it is an int. */ int has_arg; int *flag; int val; }; /* Names for the values of the `has_arg' field of `struct option'. */ # define no_argument 0 # define required_argument 1 # define optional_argument 2 #endif /* need getopt */ /* Get definitions and prototypes for functions to process the arguments in ARGV (ARGC of them, minus the program name) for options given in OPTS. Return the option character from OPTS just read. Return -1 when there are no more options. For unrecognized options, or options missing arguments, `optopt' is set to the option letter, and '?' is returned. The OPTS string is a list of characters which are recognized option letters, optionally followed by colons, specifying that that letter takes an argument, to be placed in `optarg'. If a letter in OPTS is followed by two colons, its argument is optional. This behavior is specific to the GNU `getopt'. The argument `--' causes premature termination of argument scanning, explicitly telling `getopt' that there are no more options. If OPTS begins with `--', then non-option arguments are treated as arguments to the option '\0'. This behavior is specific to the GNU `getopt'. */ #if defined __STDC__ && __STDC__ # ifdef __GNU_LIBRARY__ /* Many other libraries have conflicting prototypes for getopt, with differences in the consts, in stdlib.h. To avoid compilation errors, only prototype getopt for the GNU C library. */ extern int getopt (int __argc, char *const *__argv, const char *__shortopts); # else /* not __GNU_LIBRARY__ */ extern int getopt (); # endif /* __GNU_LIBRARY__ */ # ifndef __need_getopt extern int getopt_long (int __argc, char *const *__argv, const char *__shortopts, const struct option *__longopts, int *__longind); extern int getopt_long_only (int __argc, char *const *__argv, const char *__shortopts, const struct option *__longopts, int *__longind); /* Internal only. Users should not call this directly. */ extern int _getopt_internal (int __argc, char *const *__argv, const char *__shortopts, const struct option *__longopts, int *__longind, int __long_only); # endif #else /* not __STDC__ */ extern int getopt (); # ifndef __need_getopt extern int getopt_long (); extern int getopt_long_only (); extern int _getopt_internal (); # endif #endif /* __STDC__ */ #ifdef __cplusplus } #endif /* Make sure we later can get all the definitions and declarations. */ #undef __need_getopt #endif /* getopt.h */ mumble-1.3.4/3rdparty/celt-0.11.0-src/tools/celtenc.c0000664000175000017500000005701514010707315021566 0ustar builderbuilder/* Copyright (c) 2002-2010 Jean-Marc Valin Copyright (c) 2007-2010 Xiph.Org Foundation Copyright (c) 2008-2010 Gregory Maxwell File: celtenc.c Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #if !defined WIN32 && !defined _WIN32 #include #endif #ifdef HAVE_GETOPT_H #include #endif #ifndef HAVE_GETOPT_LONG #include "getopt_win.h" #endif #include #include #include #ifdef _MSC_VER #define snprintf _snprintf #endif #include "celt.h" #include "celt_header.h" #include #include "wav_io.h" #if defined WIN32 || defined _WIN32 /* We need the following two to set stdout to binary */ #include #include #endif #include "skeleton.h" void comment_init(char **comments, int* length, char *vendor_string); void comment_add(char **comments, int* length, char *tag, char *val); /*Write an Ogg page to a file pointer*/ int oe_write_page(ogg_page *page, FILE *fp) { int written; written = fwrite(page->header,1,page->header_len, fp); written += fwrite(page->body,1,page->body_len, fp); return written; } #define MAX_FRAME_SIZE 2048 #define MAX_FRAME_BYTES 1275 #define IMIN(a,b) ((a) < (b) ? (a) : (b)) /**< Minimum int value. */ #define IMAX(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum int value. */ /* Convert input audio bits, endians and channels */ static int read_samples(FILE *fin,int frame_size, int bits, int channels, int lsb, short * input, char *buff, celt_int32 *size) { short s[MAX_FRAME_SIZE]; unsigned char *in = (unsigned char*)s; int i; int nb_read; if (size && *size<=0) { return 0; } /*Read input audio*/ if (size) *size -= bits/8*channels*frame_size; if (buff) { for (i=0;i<12;i++) in[i]=buff[i]; nb_read = fread(in+12,1,bits/8*channels*frame_size-12, fin) + 12; if (size) *size += 12; } else { nb_read = fread(in,1,bits/8*channels* frame_size, fin); } nb_read /= bits/8*channels; /*fprintf (stderr, "%d\n", nb_read);*/ if (nb_read==0) return 0; if(bits==8) { /* Convert 8->16 bits */ for(i=frame_size*channels-1;i>=0;i--) { s[i]=(in[i]<<8)^0x8000; } } else { /* convert to our endian format */ for(i=0;iextra_headers; fp.granule_rate_n = header->sample_rate; fp.granule_rate_d = 1; fp.start_granule = 0; fp.preroll = 3; fp.granule_shift = 0; add_message_header_field(&fp, "Content-Type", "audio/x-celt"); add_fisbone_to_stream(os, &fp); } void version(void) { printf ("celtenc (CELT %s encoder)\n",CELT_VERSION); printf ("Copyright (C) 2008-2010 Xiph.Org Foundation (written by Jean-Marc Valin)\n"); } void version_short(void) { printf ("celtenc (CELT %s encoder)\n",CELT_VERSION); printf ("Copyright (C) 2008-2010 Xiph.Org Foundation (written by Jean-Marc Valin)\n"); } void usage(void) { printf ("Usage: celtenc [options] input_file output_file.oga\n"); printf ("\n"); printf ("Encodes input_file using CELT. It can read the WAV or raw files.\n"); printf ("\n"); printf ("input_file can be:\n"); printf (" filename.wav wav file\n"); printf (" filename.* Raw PCM file (any extension other than .wav)\n"); printf (" - stdin\n"); printf ("\n"); printf ("output_file can be:\n"); printf (" filename.oga compressed file\n"); printf (" - stdout\n"); printf ("\n"); printf ("Options:\n"); printf (" --bitrate n Encoding bit-rate in kbit/sec\n"); printf (" --cbr Use constant bitrate encoding\n"); printf (" --comp n Encoding complexity (0-10)\n"); printf (" --framesize n Frame size (Default: 960)\n"); printf (" --noltp Do not use long-term prediction\n"); printf (" --independent Encode frames independently (implies noltp)\n"); printf (" --skeleton Outputs ogg skeleton metadata (may cause incompatibilities)\n"); printf (" --comment Add the given string as an extra comment. This may be\n"); printf (" used multiple times\n"); printf (" --author Author of this track\n"); printf (" --title Title for this track\n"); printf (" -h, --help This help\n"); printf (" -v, --version Version information\n"); printf (" -V Verbose mode (show bit-rate)\n"); printf ("Raw input options:\n"); printf (" --rate n Sampling rate for raw input\n"); printf (" --mono Consider raw input as mono\n"); printf (" --stereo Consider raw input as stereo\n"); printf (" --le Raw input is little-endian\n"); printf (" --be Raw input is big-endian\n"); printf (" --8bit Raw input is 8-bit unsigned\n"); printf (" --16bit Raw input is 16-bit signed\n"); printf ("Default raw PCM input is 48kHz, 16-bit, little-endian, stereo\n"); } int main(int argc, char **argv) { int nb_samples, total_samples=0, nb_encoded; int c; int option_index = 0; char *inFile, *outFile; FILE *fin, *fout; short input[MAX_FRAME_SIZE]; celt_int32 frame_size = 960; int quiet=0; int nbBytes; CELTMode *mode; void *st; unsigned char bits[MAX_FRAME_BYTES]; int with_cbr = 0; int with_cvbr = 0; int with_skeleton = 0; int total_bytes = 0; int peak_bytes = 0; struct option long_options[] = { {"bitrate", required_argument, NULL, 0}, {"cbr",no_argument,NULL, 0}, {"cvbr",no_argument,NULL, 0}, {"comp", required_argument, NULL, 0}, {"noltp", no_argument, NULL, 0}, {"independent", no_argument, NULL, 0}, {"framesize", required_argument, NULL, 0}, {"skeleton",no_argument,NULL, 0}, {"help", no_argument, NULL, 0}, {"quiet", no_argument, NULL, 0}, {"le", no_argument, NULL, 0}, {"be", no_argument, NULL, 0}, {"8bit", no_argument, NULL, 0}, {"16bit", no_argument, NULL, 0}, {"mono", no_argument, NULL, 0}, {"stereo", no_argument, NULL, 0}, {"rate", required_argument, NULL, 0}, {"version", no_argument, NULL, 0}, {"version-short", no_argument, NULL, 0}, {"comment", required_argument, NULL, 0}, {"author", required_argument, NULL, 0}, {"title", required_argument, NULL, 0}, {0, 0, 0, 0} }; int print_bitrate=0; celt_int32 rate=48000; celt_int32 size; int chan=1; int fmt=16; int lsb=1; ogg_stream_state os; ogg_stream_state so; /* ogg stream for skeleton bitstream */ ogg_page og; ogg_packet op; int bytes_written=0, ret, result; int id=-1; CELTHeader header; char vendor_string[64]; char *comments; int comments_length; int close_in=0, close_out=0; int eos=0; float bitrate=-1; char first_bytes[12]; int wave_input=0; celt_int32 lookahead = 0; int bytes_per_packet=-1; int complexity=-127; int prediction=2; int bitstream; /*Process command-line options*/ while(1) { c = getopt_long (argc, argv, "hvV", long_options, &option_index); if (c==-1) break; switch(c) { case 0: if (strcmp(long_options[option_index].name,"bitrate")==0) { bitrate = atof (optarg); } else if (strcmp(long_options[option_index].name,"cbr")==0) { with_cbr=1; } else if (strcmp(long_options[option_index].name,"cvbr")==0) { with_cvbr=1; } else if (strcmp(long_options[option_index].name,"skeleton")==0) { with_skeleton=1; } else if (strcmp(long_options[option_index].name,"help")==0) { usage(); exit(0); } else if (strcmp(long_options[option_index].name,"quiet")==0) { quiet = 1; } else if (strcmp(long_options[option_index].name,"version")==0) { version(); exit(0); } else if (strcmp(long_options[option_index].name,"version-short")==0) { version_short(); exit(0); } else if (strcmp(long_options[option_index].name,"le")==0) { lsb=1; } else if (strcmp(long_options[option_index].name,"be")==0) { lsb=0; } else if (strcmp(long_options[option_index].name,"8bit")==0) { fmt=8; } else if (strcmp(long_options[option_index].name,"16bit")==0) { fmt=16; } else if (strcmp(long_options[option_index].name,"stereo")==0) { chan=2; } else if (strcmp(long_options[option_index].name,"mono")==0) { chan=1; } else if (strcmp(long_options[option_index].name,"rate")==0) { rate=atoi (optarg); } else if (strcmp(long_options[option_index].name,"comp")==0) { complexity=atoi (optarg); } else if (strcmp(long_options[option_index].name,"framesize")==0) { frame_size=atoi (optarg); } else if (strcmp(long_options[option_index].name,"noltp")==0) { if (prediction>1) prediction=1; } else if (strcmp(long_options[option_index].name,"independent")==0) { prediction=0; } else if (strcmp(long_options[option_index].name,"comment")==0) { if (!strchr(optarg, '=')) { fprintf (stderr, "Invalid comment: %s\n", optarg); fprintf (stderr, "Comments must be of the form name=value\n"); exit(1); } comment_add(&comments, &comments_length, NULL, optarg); } else if (strcmp(long_options[option_index].name,"author")==0) { comment_add(&comments, &comments_length, "author=", optarg); } else if (strcmp(long_options[option_index].name,"title")==0) { comment_add(&comments, &comments_length, "title=", optarg); } break; case 'h': usage(); exit(0); break; case 'v': version(); exit(0); break; case 'V': print_bitrate=1; break; case '?': usage(); exit(1); break; } } if (argc-optind!=2) { usage(); exit(1); } inFile=argv[optind]; outFile=argv[optind+1]; /*Initialize Ogg stream struct*/ srand(time(NULL)); if (ogg_stream_init(&os, rand())==-1) { fprintf(stderr,"Error: stream init failed\n"); exit(1); } if (with_skeleton && ogg_stream_init(&so, rand())==-1) { fprintf(stderr,"Error: stream init failed\n"); exit(1); } if (strcmp(inFile, "-")==0) { #if defined WIN32 || defined _WIN32 _setmode(_fileno(stdin), _O_BINARY); #elif defined OS2 _fsetmode(stdin,"b"); #endif fin=stdin; } else { fin = fopen(inFile, "rb"); if (!fin) { perror(inFile); exit(1); } close_in=1; } { fread(first_bytes, 1, 12, fin); if (strncmp(first_bytes,"RIFF",4)==0 && strncmp(first_bytes,"RIFF",4)==0) { if (read_wav_header(fin, &rate, &chan, &fmt, &size)==-1) exit(1); wave_input=1; lsb=1; /* CHECK: exists big-endian .wav ?? */ } } if (bitrate<=0.005) if (chan==1) bitrate=64.0; else bitrate=128.0; bytes_per_packet = MAX_FRAME_BYTES; mode = celt_mode_create(rate, frame_size, NULL); if (!mode) return 1; celt_mode_info(mode,CELT_GET_BITSTREAM_VERSION,&bitstream); snprintf(vendor_string, sizeof(vendor_string), "Encoded with CELT %s (bitstream: %d)\n",CELT_VERSION,bitstream); comment_init(&comments, &comments_length, vendor_string); /*celt_mode_info(mode, CELT_GET_FRAME_SIZE, &frame_size);*/ celt_header_init(&header, mode, frame_size, chan); header.nb_channels = chan; { char *st_string="mono"; if (chan==2) st_string="stereo"; if (!quiet) if (with_cbr) fprintf (stderr, "Encoding %.0f kHz %s audio in %.0fms packets at %0.3fkbit/sec (%d bytes per packet, CBR) with bitstream version %d\n", header.sample_rate/1000., st_string, frame_size/(float)header.sample_rate*1000., bitrate, bytes_per_packet,bitstream); else fprintf (stderr, "Encoding %.0f kHz %s audio in %.0fms packets at %0.3fkbit/sec (%d bytes per packet maximum) with bitstream version %d\n", header.sample_rate/1000., st_string, frame_size/(float)header.sample_rate*1000., bitrate, bytes_per_packet,bitstream); } /*Initialize CELT encoder*/ st = celt_encoder_create_custom(mode, chan, NULL); { int tmp = (bitrate*1000); if (celt_encoder_ctl(st, CELT_SET_BITRATE(tmp)) != CELT_OK) { fprintf (stderr, "bitrate request failed\n"); return 1; } } if (!with_cbr) { if (celt_encoder_ctl(st, CELT_SET_VBR(1)) != CELT_OK) { fprintf (stderr, "VBR request failed\n"); return 1; } if (!with_cvbr) { if (celt_encoder_ctl(st, CELT_SET_VBR_CONSTRAINT(0)) != CELT_OK) { fprintf (stderr, "VBR constraint failed\n"); return 1; } } } if (celt_encoder_ctl(st, CELT_SET_PREDICTION(prediction)) != CELT_OK) { fprintf (stderr, "Prediction request failed\n"); return 1; } if (complexity!=-127) { if (celt_encoder_ctl(st, CELT_SET_COMPLEXITY(complexity)) != CELT_OK) { fprintf (stderr, "Only complexity 0 through 10 is supported\n"); return 1; } } if (strcmp(outFile,"-")==0) { #if defined WIN32 || defined _WIN32 _setmode(_fileno(stdout), _O_BINARY); #endif fout=stdout; } else { fout = fopen(outFile, "wb"); if (!fout) { perror(outFile); exit(1); } close_out=1; } if (with_skeleton) { fprintf (stderr, "Warning: Enabling skeleton output may cause some decoders to fail.\n"); } /* first packet should be the skeleton header. */ if (with_skeleton) { add_fishead_packet(&so); if ((ret = flush_ogg_stream_to_file(&so, fout))) { fprintf (stderr,"Error: failed skeleton (fishead) header to output stream\n"); exit(1); } else bytes_written += ret; } /*Write header*/ { unsigned char header_data[100]; int packet_size = celt_header_to_packet(&header, header_data, 100); op.packet = header_data; op.bytes = packet_size; op.b_o_s = 1; op.e_o_s = 0; op.granulepos = 0; op.packetno = 0; ogg_stream_packetin(&os, &op); while((result = ogg_stream_flush(&os, &og))) { if(!result) break; ret = oe_write_page(&og, fout); if(ret != og.header_len + og.body_len) { fprintf (stderr,"Error: failed writing header to output stream\n"); exit(1); } else bytes_written += ret; } op.packet = (unsigned char *)comments; op.bytes = comments_length; op.b_o_s = 0; op.e_o_s = 0; op.granulepos = 0; op.packetno = 1; ogg_stream_packetin(&os, &op); } /* fisbone packet should be write after all bos pages */ if (with_skeleton) { add_fisbone_packet(&so, os.serialno, &header); if ((ret = flush_ogg_stream_to_file(&so, fout))) { fprintf (stderr,"Error: failed writing skeleton (fisbone )header to output stream\n"); exit(1); } else bytes_written += ret; } /* writing the rest of the celt header packets */ while((result = ogg_stream_flush(&os, &og))) { if(!result) break; ret = oe_write_page(&og, fout); if(ret != og.header_len + og.body_len) { fprintf (stderr,"Error: failed writing header to output stream\n"); exit(1); } else bytes_written += ret; } free(comments); /* write the skeleton eos packet */ if (with_skeleton) { add_eos_packet_to_stream(&so); if ((ret = flush_ogg_stream_to_file(&so, fout))) { fprintf (stderr,"Error: failed writing skeleton header to output stream\n"); exit(1); } else bytes_written += ret; } if (!wave_input) { nb_samples = read_samples(fin,frame_size,fmt,chan,lsb,input, first_bytes, NULL); } else { nb_samples = read_samples(fin,frame_size,fmt,chan,lsb,input, NULL, &size); } if (nb_samples==0) eos=1; total_samples += nb_samples; nb_encoded = -lookahead; /*Main encoding loop (one frame per iteration)*/ while (!eos || total_samples>nb_encoded) { id++; /*Encode current frame*/ nbBytes = celt_encode(st, input, frame_size, bits, bytes_per_packet); if (nbBytes<0) { fprintf(stderr, "Got error %d while encoding. Aborting.\n", nbBytes); break; } nb_encoded += frame_size; total_bytes += nbBytes; peak_bytes=IMAX(nbBytes,peak_bytes); if (wave_input) { nb_samples = read_samples(fin,frame_size,fmt,chan,lsb,input, NULL, &size); } else { nb_samples = read_samples(fin,frame_size,fmt,chan,lsb,input, NULL, NULL); } if (nb_samples==0) { eos=1; } if (eos && total_samples<=nb_encoded) op.e_o_s = 1; else op.e_o_s = 0; total_samples += nb_samples; op.packet = (unsigned char *)bits; op.bytes = nbBytes; op.b_o_s = 0; /*Is this redundent?*/ if (eos && total_samples<=nb_encoded) op.e_o_s = 1; else op.e_o_s = 0; op.granulepos = (id+1)*frame_size-lookahead; if (op.granulepos>total_samples) op.granulepos = total_samples; /*printf ("granulepos: %d %d %d %d %d %d\n", (int)op.granulepos, id, nframes, lookahead, 5, 6);*/ op.packetno = 2+id; ogg_stream_packetin(&os, &op); /*Write all new pages (most likely 0 or 1)*/ while (ogg_stream_pageout(&os,&og)) { ret = oe_write_page(&og, fout); if(ret != og.header_len + og.body_len) { fprintf (stderr,"Error: failed writing header to output stream\n"); exit(1); } else bytes_written += ret; } } /*Flush all pages left to be written*/ while (ogg_stream_flush(&os, &og)) { ret = oe_write_page(&og, fout); if(ret != og.header_len + og.body_len) { fprintf (stderr,"Error: failed writing header to output stream\n"); exit(1); } else bytes_written += ret; } if (!with_cbr && !quiet) fprintf (stderr, "Average rate %0.3fkbit/sec, %d peak bytes per packet\n", (total_bytes*8.0/((float)nb_encoded/header.sample_rate))/1000.0, peak_bytes); celt_encoder_destroy(st); celt_mode_destroy(mode); ogg_stream_clear(&os); if (close_in) fclose(fin); if (close_out) fclose(fout); return 0; } /* Comments will be stored in the Vorbis style. It is describled in the "Structure" section of http://www.xiph.org/ogg/vorbis/doc/v-comment.html The comment header is decoded as follows: 1) [vendor_length] = read an unsigned integer of 32 bits 2) [vendor_string] = read a UTF-8 vector as [vendor_length] octets 3) [user_comment_list_length] = read an unsigned integer of 32 bits 4) iterate [user_comment_list_length] times { 5) [length] = read an unsigned integer of 32 bits 6) this iteration's user comment = read a UTF-8 vector as [length] octets } 7) [framing_bit] = read a single bit as boolean 8) if ( [framing_bit] unset or end of packet ) then ERROR 9) done. If you have troubles, please write to ymnk@jcraft.com. */ #define readint(buf, base) (((buf[base+3]<<24)&0xff000000)| \ ((buf[base+2]<<16)&0xff0000)| \ ((buf[base+1]<<8)&0xff00)| \ (buf[base]&0xff)) #define writeint(buf, base, val) do{ buf[base+3]=((val)>>24)&0xff; \ buf[base+2]=((val)>>16)&0xff; \ buf[base+1]=((val)>>8)&0xff; \ buf[base]=(val)&0xff; \ }while(0) void comment_init(char **comments, int* length, char *vendor_string) { int vendor_length=strlen(vendor_string); int user_comment_list_length=0; int len=4+vendor_length+4; char *p=(char*)malloc(len); if(p==NULL){ fprintf (stderr, "malloc failed in comment_init()\n"); exit(1); } writeint(p, 0, vendor_length); memcpy(p+4, vendor_string, vendor_length); writeint(p, 4+vendor_length, user_comment_list_length); *length=len; *comments=p; } void comment_add(char **comments, int* length, char *tag, char *val) { char* p=*comments; int vendor_length=readint(p, 0); int user_comment_list_length=readint(p, 4+vendor_length); int tag_len=(tag?strlen(tag):0); int val_len=strlen(val); int len=(*length)+4+tag_len+val_len; p=(char*)realloc(p, len); if(p==NULL){ fprintf (stderr, "realloc failed in comment_add()\n"); exit(1); } writeint(p, *length, tag_len+val_len); /* length of comment */ if(tag) memcpy(p+*length+4, tag, tag_len); /* comment */ memcpy(p+*length+4+tag_len, val, val_len); /* comment */ writeint(p, 4+vendor_length, user_comment_list_length+1); *comments=p; *length=len; } #undef readint #undef writeint mumble-1.3.4/3rdparty/celt-0.11.0-src/tools/wav_io.c0000664000175000017500000001230114010707315021422 0ustar builderbuilder/* Copyright (C) 2002 Jean-Marc Valin File: wav_io.c Routines to handle wav (RIFF) headers Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include "celt_types.h" #include "wav_io.h" int read_wav_header(FILE *file, int *rate, int *channels, int *format, celt_int32 *size) { char ch[5]; celt_int32 itmp; celt_int16 stmp; celt_int32 bpersec; celt_int16 balign; int skip_bytes; int i; ch[4]=0; #if 0 fread(ch, 1, 4, file); if (strcmp(ch, "RIFF")!=0) { fseek(file, 0, SEEK_SET); return 0; } fread(&itmp, 4, 1, file); *size = le_int(itmp-36); fread(ch, 1, 4, file); if (strcmp(ch, "WAVE")!=0) { fprintf (stderr, "RIFF file is not a WAVE file\n"); return -1; } #endif fread(ch, 1, 4, file); while (strcmp(ch, "fmt ")!=0) { fread(&itmp, 4, 1, file); itmp = le_int(itmp); /*fprintf (stderr, "skip=%d\n", itmp);*/ /*strange way of seeking, but it works even for pipes*/ for (i=0;i2) { fprintf (stderr, "Only mono and (intensity) stereo supported\n"); return -1; } fread(&itmp, 4, 1, file); itmp = le_int(itmp); *rate = itmp; fread(&itmp, 4, 1, file); bpersec = le_int(itmp); fread(&stmp, 2, 1, file); balign = le_short(stmp); fread(&stmp, 2, 1, file); stmp = le_short(stmp); if (stmp!=16 && stmp!=8) { fprintf (stderr, "Only 8/16-bit linear supported\n"); return -1; } *format=stmp; if (bpersec!=*rate**channels*stmp/8) { fprintf (stderr, "Corrupted header: ByteRate mismatch\n"); return -1; } if (balign!=*channels*stmp/8) { fprintf (stderr, "Corrupted header: BlockAlign mismatch\n"); return -1; } /*strange way of seeking, but it works even for pipes*/ if (skip_bytes>0) for (i=0;i Constrained-Energy Lapped Transform (CELT) Codec Octasic Semiconductor
    4101, Molson Street, suite 300 Montreal Quebec H1Y 3L1 Canada jean-marc.valin@octasic.com
    Xiph.Org Foundation
    tterribe@xiph.org
    Juniper Networks
    2251 Corporate Park Drive, Suite 100 Herndon VA 20171-1817 USA gmaxwell@juniper.net
    Xiph.Org Foundation
    xiphmont@xiph.org
    General AVT Working Group audio codec low delay Internet-Draft CELT CELT is an open-source voice codec suitable for use in very low delay Voice over IP (VoIP) type applications. This document describes the encoding and decoding process.
    This document describes the CELT codec, which is designed for transmitting full-bandwidth audio with very low delay. It is suitable for encoding both speech and music at rates starting at 32 kbit/s. It is primarily designed for transmission over the Internet and protocols such as RTP , but also includes a certain amount of robustness to bit errors, where this could be done at no significant cost. The novel aspect of CELT compared to most other codecs is its very low delay, below 10 ms. There are two main advantages to having a very low delay audio link. The lower delay itself is important for some interactions, such as playing music remotely. Another advantage is its behavior in the presence of acoustic echo. When the round-trip audio delay is sufficiently low, acoustic echo is no longer perceived as a distinct repetition, but rather as extra reverberation. Applications of CELT include: Collaborative network music performance High-quality teleconferencing Wireless audio equipment Low-delay links for broadcast applications The source code for the reference implementation of the CELT codec is provided in . This source code is the normative specification of the codec. The corresponding text description in this document is provided for informative purposes. The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119 .
    CELT stands for Constrained Energy Lapped Transform. This is the fundamental principle of the codec: the quantization process is designed in such a way as to preserve the energy in a certain number of bands. The theoretical aspects of the codec are described in greater detail and . Although these papers describe slightly older versions of the codec (version 0.3.2 and 0.5.1, respectively), the principles remain the same. CELT is a transform codec, based on the Modified Discrete Cosine Transform (MDCT). The MDCT is derived from the DCT-IV by adding an overlap with time-domain aliasing cancellation . The main characteristics of CELT are as follows: Ultra-low algorithmic delay (scalable, typically 4 to 9 ms) Sampling rates from 32 kHz to 48 kHz and above (full audio bandwidth) Applicability to both speech and music Support for mono and stereo Adaptive bit-rate from 32 kbit/s to 128 kbit/s per channel and above Scalable complexity Robustness to packet loss (scalable trade-off between quality and loss-robustness) Open source implementation (floating-point and fixed-point) No known intellectual property issues
    This document contains a detailed description of both the encoder and the decoder, along with a reference implementation. In most circumstances, and unless otherwise stated, the calculations do not need to produce results that are bit-identical with the reference implementation, so alternate algorithms can sometimes be used. However, there are a few (clearly identified) cases, such as the bit allocation, where bit-exactness with the reference implementation is required. An implementation is considered to be compatible if, for any valid bit-stream, the decoder's output is perceptually indistinguishable from the output produced by the reference decoder. The CELT codec does not use a standard bit-packer, but rather uses a range coder to pack both integers and entropy-coded symbols. In mono mode, the bit-stream generated by the encoder contains the following parameters (in order): Feature flags I, P, S, F (2-4 bits) if P=1 Pitch period if S=1 Transient scalefactor if scalefactor=(1 or 2) AND more than 2 short MDCTs ID of block before transient if scalefactor=3 Transient time Coarse energy encoding (for each band) Fine energy encoding (for each band) For each band if P=1 and band is at the beginning of a pitch band Pitch gain bit PVQ indices More fine energy (using all remaining bits) Note that due to the use of a range coder, all of the parameters have to be encoded and decoded in order. The CELT bit-stream is "octet-based" in the sense that the encoder always produces an integer number of octets when encoding a frame. Also, the bit-rate used by the CELT encoder can only be determined by the number of octets produced. In many cases (e.g. UDP/RTP), the transport layer already encodes the data length, so no extra information is necessary to signal the bit-rate. In cases where this is not true, or when there are multiple compressed frames per packet, the size of each compressed frame MUST be signalled in some way.
    The operation of both the encoder and decoder depends on the mode data. A mode definition can be created by celt_create_mode() (modes.c) based on three parameters: frame size (number of samples) sampling rate (samples per second) number of channels (1 or 2) The frame size can be any even number of samples from 64 to 1024, inclusively. The sampling rate must be between 32000 Hz and 96000 Hz. The mode data that is created defines how the encoder and the decoder operate. More specifically, the following information is contained in the mode object: Frame size Sampling rate Windowing overlap Number of channels Definition of the bands Definition of the pitch bands Decay coefficients of the Laplace distributions for coarse energy Bit allocation matrix The windowing overlap is the amount of overlap between the frames. CELT uses a low-overlap window that is typically half of the frame size. For a frame size of 256 samples, the overlap is 128 samples, so the total algorithmic delay is 256+128=384. CELT divides the audio into frequency bands, for which the energy is preserved. These bands are chosen to follow the ear's critical bands, with the exception that each band has to contain at least 3 frequency bins. The energy bands are based on the Bark scale. The Bark band edges (in Hz) are defined as [0, 100, 200, 300, 400, 510, 630, 770, 920, 1080, 1270, 1480, 1720, 2000, 2320, 2700, 3150, 3700, 4400, 5300, 6400, 7700, 9500, 12000, 15500, 20000]. The actual bands used by the codec depend on the sampling rate and the frame size being used. The mapping from Hz to MDCT bins is done by multiplying by sampling_rate/(2*frame_size) and rounding to the nearest value. An exception is made for the lower frequencies to ensure that all bands contain at least 3 MDCT bins. The definition of the Bark bands is computed in compute_ebands() (modes.c). CELT includes a pitch predictor for which the gains are defined over a set of pitch bands. The pitch bands are defined (in Hz) as [0, 345, 689, 1034, 1378, 2067, 3273, 5340, 6374]. The Hz values are mapped to MDCT bins in the same was as the energy bands. The pitch band boundaries are aligned to energy band boundaries. The definition of the pitch bands is computed in compute_pbands() (modes.c). The mode contains a bit allocation table that is derived from a prototype allocation table, specified in the band_allocation matrix (modes.c). Each row of the table is a single prototype allocation, in bits per Bark band, and assuming 256-sample frames. These rows must be projected onto the actual band layout in use at the current frame size and sample rate, using exact integer calculations. The reference implementation pre-computes these projections in compute_allocation_table() (modes.c) and any other implementation MUST produces bit-identical allocation results. Every entry in the allocation table is multiplied by the current number of channels and the current frame size. Each prototype allocation is projected independently using the following process: the upper band frequencies (in Hz) from the current Bark band and current CELT band are compared. (When the process begins, these will each be the first band, but will increment independently.) If the current Bark band's upper edge frequency is less than the current CELT band's upper edge frequency, the entire value of the Bark band plus any carried remainder is assigned to the current CELT band, and the process continues with the next Bark band in sequence and zero remainder. If the current Bark band's upper edge frequency is equal to or greater than that of the current CELT band, the CELT band will receive only part of this Bark band's allocation. This portion allocated to the CELT band is then calculated by multiplying the Bark band's allocation by the difference in Hz between the Bark band's upper frequency and the current CELT band's lower frequency, adding the width of the current Bark band divided by two, and then dividing this total by the width of the current Bark band in Hz. The partial value plus any carried remainder is added to the current CELT band, and the difference between the partial value and the Bark target is taken as the new carried remainder. The process begins then again starting at the next CELT band and next Bark band. Once all bands in a prototype allocation have been considered, any remainder is added to the last CELT band. All of the resulting values are rescaled by adding 128 and dividing by 256.
    The top-level function for encoding a CELT frame in the reference implementation is celt_encode() (celt.c). The basic block diagram of the CELT encoder is illustrated in . The encoder contains most of the building blocks of the decoder and can, with very little extra computation, compute the signal that would be decoded by the decoder. CELT has three main quantizers denoted Q1, Q2 and Q3. These apply to band energies (), pitch gains () and normalized MDCT bins (), respectively.
    |Q1|------+ | |computation| | +--+ | | +-----------+ | | | +-----+ | | v v +------+ +-+--+ +-+ +-+ +-+ +--+ +---+ +-+ +-----+ +-+ ->|Window|->|MDCT|->|-|->|/|->|-|->|Q3|->|Mix|->|*|->|IMDCT|->|+|-+-> +---+--+ +----+ +-+ +-+ +-+ +--+ +---+ +-+ +-----+ +-+ | | ^ | | +--------------------------+ | +-+ | | | +----------+ +--+ +-+-+ | +------------->|pitch gain|-->|Q2|-->| * | | | +----------+ +--+ +---+ | | ^ ^ | | +-----------------+ | v | | +------------+ +------+-----+ | |Pitch period| |Delay, MDCT,| | |estimation |----------------------->| Normalize | | +------------+ +------------+ | ^ ^ | +--------------------------------------+-----------------+ ]]> Block diagram of the CELT encoder
    The input audio first goes through a pre-emphasis filter (just before the windowing in ), which attenuates the spectral tilt. The filter is has the transfer function A(z)=1-alpha_p*z^-1, with alpha_p=0.8. The inverse of the pre-emphasis is applied at the decoder.
    CELT uses an entropy coder based upon , which is itself a rediscovery of the FIFO arithmetic code introduced by . It is very similar to arithmetic encoding, except that encoding is done with digits in any base instead of with bits, so it is faster when using larger bases (i.e.: an octet). All of the calculations in the range coder must use bit-exact integer arithmetic. The range coder also acts as the bit-packer for CELT. It is used in three different ways, to encode: entropy-coded symbols with a fixed probability model using ec_encode(), (rangeenc.c) integers from 0 to 2^M-1 using ec_enc_uint() or ec_enc_bits(), (entenc.c) integers from 0 to N-1 (where N is not a power of two) using ec_enc_uint(). (entenc.c) The range encoder maintains an internal state vector composed of the four-tuple (low,rng,rem,ext), representing the low end of the current range, the size of the current range, a single buffered output octet, and a count of additional carry-propagating output octets. Both rng and low are 32-bit unsigned integer values, rem is an octet value or the special value -1, and ext is an integer with at least 16 bits. This state vector is initialized at the start of each each frame to the value (0,2^31,-1,0). Each symbol is drawn from a finite alphabet and coded in a separate context which describes the size of the alphabet and the relative frequency of each symbol in that alphabet. CELT only uses static contexts; they are not adapted to the statistics of the data that is coded.
    The main encoding function is ec_encode() (rangeenc.c), which takes as an argument a three-tuple (fl,fh,ft) describing the range of the symbol to be encoded in the current context, with 0 <= fl < fh <= ft <= 65535. The values of this tuple are derived from the probability model for the symbol. Let f(i) be the frequency of the ith symbol in the current context. Then the three-tuple corresponding to the kth symbol is given by ec_encode() updates the state of the encoder as follows. If fl is greater than zero, then low = low + rng - (rng/ft)*(ft-fl) and rng = (rng/ft)*(fh-fl). Otherwise, low is unchanged and rng = rng - (rng/ft)*(fh-fl). The divisions here are exact integer division. After this update, the range is normalized. To normalize the range, the following process is repeated until rng > 2^23. First, the top 9 bits of low, (low>>23), are placed into a carry buffer. Then, low is set to . This process is carried out by ec_enc_normalize() (rangeenc.c). The 9 bits produced in each iteration of the normalization loop consist of 8 data bits and a carry flag. The final value of the output bits is not determined until carry propagation is accounted for. Therefore the reference implementation buffers a single (non-propagating) output octet and keeps a count of additional propagating (0xFF) output octets. An implementation MAY choose to use any mathematically equivalent scheme to perform carry propagation. The function ec_enc_carry_out() (rangeenc.c) performs this buffering. It takes a 9-bit input value, c, from the normalization 8-bit output and a carry bit. If c is 0xFF, then ext is incremented and no octets are output. Otherwise, if rem is not the special value -1, then the octet (rem+(c>>8)) is output. Then ext octets are output with the value 0 if the carry bit is set, or 0xFF if it is not, and rem is set to the lower 8 bits of c. After this, ext is set to zero. In the reference implementation, a special version of ec_encode() called ec_encode_bin() (rangeenc.c) is defined to take a two-tuple (fl,ftb), where , but avoids using division.
    Functions ec_enc_uint() or ec_enc_bits() are based on ec_encode() and encode one of N equiprobable symbols, each with a frequency of 1, where N may be as large as 2^32-1. Because ec_encode() is limited to a total frequency of 2^16-1, this is done by encoding a series of symbols in smaller contexts. ec_enc_bits() (entenc.c) is defined, like ec_encode_bin(), to take a two-tuple (fl,ftb), with >ftb-8&0xFF) using ec_encode_bin() and subtracts 8 from ftb. Then, it encodes the remaining bits of fl, e.g., (fl&(1<, again using ec_encode_bin(). ec_enc_uint() (entenc.c) takes a two-tuple (fl,ft), where ft is not necessarily a power of two. Let ftb be the location of the highest 1 bit in the two's-complement representation of (ft-1), or -1 if no bits are set. If ftb>8, then the top 8 bits of fl are encoded using ec_encode() with the three-tuple (fl>>ftb-8,(fl>>ftb-8)+1,(ft-1>>ftb-8)+1), and the remaining bits are encoded with ec_enc_bits using the two-tuple .
    After all symbols are encoded, the stream must be finalized by outputting a value inside the current range. Let end be the integer in the interval [low,low+rng) with the largest number of trailing zero bits. Then while end is not zero, the top 9 bits of end, e.g., >23), are sent to the carry buffer, and end is replaced by (end<<8&0x7FFFFFFF). Finally, if the value in carry buffer, rem, is]]> neither zero nor the special value -1, or the carry count, ext, is greater than zero, then 9 zero bits are sent to the carry buffer. After the carry buffer is finished outputting octets, the rest of the output buffer is padded with zero octets. Finally, rem is set to the special value -1. This process is implemented by ec_enc_done() (rangeenc.c).
    The bit allocation routines in CELT need to be able to determine a conservative upper bound on the number of bits that have been used to encode the current frame thus far. This drives allocation decisions and ensures that the range code will not overflow the output buffer. This is computed in the reference implementation to fractional bit precision by the function ec_enc_tell() (rangeenc.c). Like all operations in the range encoder, it must be implemented in a bit-exact manner.
    The CELT codec has several optional features that can be switched on or off in each frame, some of which are mutually exclusive. The four main flags are intra-frame energy (I), pitch (P), short blocks (S), and folding (F). Those are described in more detail below. There are eight valid combinations of these four features, and they are encoded into the stream first using a variable length code (). It is left to the implementor to choose when to enable each of the flags, with the only restriction that the combination of the four flags MUST correspond to a valid entry in . Encoding of the feature flags I P S F Encoding 000100 010101 1001110 1011111 00001000 00111001 01001010 10001011
    CELT uses prediction to encode the energy in each frequency band. In order to make frames independent, however, it is possible to disable the part of the prediction that depends on previous frames. This is called intra-frame energy and requires around 12 more bits per frame. It is enabled with the I bit (Table. flags-encoding). The use of intra energy is OPTIONAL and the decision method is left to the implementor. The reference code describes one way of deciding which frames would benefit most from having their energy encoded without prediction. The intra_decision() (quant_bands.c) function looks for frames where the log-spectral distance between consecutive frames is more than 9 dB. When such a difference is found between two frames, the next frame (not the one for which the difference is detected) is marked encoded with intra energy. The one-frame delay is to ensure that when a frame containing a transient is lost, then the next frame will be decoded without accumulating error from the lost frame.
    CELT can use a pitch predictor (also known as long-term predictor) to improve the voice quality at lower bit-rates. When the P bit is set, the pitch period is encoded after the flag bits. The value encoded is an integer in the range [0, 1024-N-overlap-1].
    To improve audio quality during transients, CELT can use a short block multiple-MDCT transform. Unlike other transform codecs, the multiple MDCTs are jointly quantized as if the coefficients were obtained from a single MDCT. For that reason, it is better to consider the short block case as using a different transform of the same length rather than as multiple independent MDCTs. In the reference implementation, the decision to use short blocks is made by transient_analysis() (celt.c) based on the pre-emphasized signal's peak values, but other methods can be used. When the S bit is set, a 2-bit transient scalefactor is encoded directly after the flag bits. If the scalefactor is 0, then the multiple-MDCT output is unmodified. If the scalefactor is 1 or 2, then the output of the MDCTs that follow the transient is scaled down by 2^scalefactor. If the scalefactor is equal to 3, then a time-domain pre-emphasis window is applied before computing the MDCTs and no further scaling is applied to the MDCTs output. The window value is 1 from the beginning of the frame to 16 samples before the transient time. It is a Hanning window from there to the transient time, and then the value is 1/8 up to the end of the frame. The Hanning window part is defined as: static const float transientWindow[16] = { 0.0085135, 0.0337639, 0.0748914, 0.1304955, 0.1986827, 0.2771308, 0.3631685, 0.4538658, 0.5461342, 0.6368315, 0.7228692, 0.8013173, 0.8695045, 0.9251086, 0.9662361, 0.9914865}; When the scalefactor is 3, the transient time is the exact time of the transient determined by the encoder and encoded as an integer number of samples with the range [0, N+overlap-1] directly after the scalefactor. In the case where the scalefactor is 1 or 2 and the mode is defined to use more than 2 MDCTs, the last MDCT to which the scaling is not applied is encoded using an integer in the range [0, B-2], where B is the number of short MDCTs used for the mode.
    The last encoding feature in CELT is spectral folding. It is designed to prevent birdie artifacts caused by the sparse spectra often generated by low-bitrate transform codecs. When folding is enabled, a copy of the low-frequency spectrum is added to the higher-frequency bands (above ~6400 Hz). The folding operation is described in more detail in .
    The MDCT implementation has no special characteristics. The input is a windowed signal (after pre-emphasis) of 2*N samples and the output is N frequency-domain samples. A low-overlap window is used to reduce the algorithmic delay. It is derived from a basic (full overlap) window that is the same as the one used in the Vorbis codec: W(n)=[sin(pi/2*sin(pi/2*(n+.5)/L))]^2. The low-overlap window is created by zero-padding the basic window and inserting ones in the middle, such that the resulting window still satisfies power complementarity. The MDCT is computed in mdct_forward() (mdct.c), which includes the windowing operation and a scaling of 2/N.
    The MDCT output is divided into bands that are designed to match the ear's critical bands, with the exception that each band has to be at least 3 bins wide. For each band, the encoder computes the energy that will later be encoded. Each band is then normalized by the square root of the non-quantized energy, such that each band now forms a unit vector X. The energy and the normalization are computed by compute_band_energies() and normalise_bands() (bands.c), respectively.
    It is important to quantize the energy with sufficient resolution because any energy quantization error cannot be compensated for at a later stage. Regardless of the resolution used for encoding the shape of a band, it is perceptually important to preserve the energy in each band. CELT uses a coarse-fine strategy for encoding the energy in the base-2 log domain, as implemented in quant_bands.c
    The coarse quantization of the energy uses a fixed resolution of 6 dB and is the only place where entropy coding is used. To minimize the bitrate, prediction is applied both in time (using the previous frame) and in frequency (using the previous bands). The 2-D z-transform of the prediction filter is: A(z_l, z_b)=(1-a*z_l^-1)*(1-z_b^-1)/(1-b*z_b^-1) where b is the band index and l is the frame index. The prediction coefficients are a=0.8 and b=0.7 when not using intra energy and a=b=0 when using intra energy. The time-domain prediction is based on the final fine quantization of the previous frame, while the frequency domain (within the current frame) prediction is based on coarse quantization only (because the fine quantization has not been computed yet). We approximate the ideal probability distribution of the prediction error using a Laplace distribution. The coarse energy quantization is performed by quant_coarse_energy() and quant_coarse_energy() (quant_bands.c). The Laplace distribution for each band is defined by a 16-bit (Q15) decay parameter. Thus, the value 0 has a frequency count of p[0]=2*(16384*(16384-decay)/(16384+decay)). The values +/- i each have a frequency count p[i] = (p[i-1]*decay)>>14. The value of p[i] is always rounded down (to avoid exceeding 32768 as the sum of all frequency counts), so it is possible for the sum to be less than 32768. In that case additional values with a frequency count of 1 are encoded. The signed values corresponding to symbols 0, 1, 2, 3, 4, ... are [0, +1, -1, +2, -2, ...]. The encoding of the Laplace-distributed values is implemented in ec_laplace_encode() (laplace.c).
    After the coarse energy quantization and encoding, the bit allocation is computed () and the number of bits to use for refining the energy quantization is determined for each band. Let B_i be the number of fine energy bits for band i; the refinement is an integer f in the range [0,2^B_i-1]. The mapping between f and the correction applied to the coarse energy is equal to (f+1/2)/2^B_i - 1/2. Fine energy quantization is implemented in quant_fine_energy() (quant_bands.c). If any bits are unused at the end of the encoding process, these bits are used to increase the resolution of the fine energy encoding in some bands. Priority is given to the bands for which the allocation () was rounded down. At the same level of priority, lower bands are encoded first. Refinement bits are added until there are no unused bits. This is implemented in quant_energy_finalise() (quant_bands.c).
    Bit allocation is performed based only on information available to both the encoder and decoder. The same calculations are performed in a bit-exact manner in both the encoder and decoder to ensure that the result is always exactly the same. Any mismatch would cause an error in the decoded output. The allocation is computed by compute_allocation() (rate.c), which is used in both the encoder and the decoder. For a given band, the bit allocation is nearly constant across frames that use the same number of bits for Q1, yielding a pre-defined signal-to-mask ratio (SMR) for each band. Because the bands each have a width of one Bark, this is equivalent to modeling the masking occurring within each critical band, while ignoring inter-band masking and tone-vs-noise characteristics. While this is not an optimal bit allocation, it provides good results without requiring the transmission of any allocation information. For every encoded or decoded frame, a target allocation must be computed using the projected allocation. In the reference implementation this is performed by compute_allocation() (rate.c). The target computation begins by calculating the available space as the number of whole bits which can be fit in the frame after Q1 is stored according to the range coder (ec_[enc/dec]_tell()) and then multiplying by 8. Then the two projected prototype allocations whose sums multiplied by 8 are nearest to that value are determined. These two projected prototype allocations are then interpolated by finding the highest integer interpolation coefficient in the range 0-8 such that the sum of the higher prototype times the coefficient, plus the sum of the lower prototype multiplied by the difference of 16 and the coefficient, is less than or equal to the available sixteenth-bits. The reference implementation performs this step using a binary search in interp_bits2pulses() (rate.c). The target allocation is the interpolation coefficient times the higher prototype, plus the lower prototype multiplied by the difference of 16 and the coefficient, for each of the CELT bands. Because the computed target will sometimes be somewhat smaller than the available space, the excess space is divided by the number of bands, and this amount is added equally to each band. Any remaining space is added to the target one sixteenth-bit at a time, starting from the first band. The new target now matches the available space, in sixteenth-bits, exactly. The allocation target is separated into a portion used for fine energy and a portion used for the Spherical Vector Quantizer (PVQ). The fine energy quantizer operates in whole-bit steps. For each band the number of bits per channel used for fine energy is calculated by 50 minus the log2_frac(), with 1/16 bit precision, of the number of MDCT bins in the band. That result is multiplied by the number of bins in the band and again by twice the number of channels, and then the value is set to zero if it is less than zero. Added to that result is 16 times the number of MDCT bins times the number of channels, and it is finally divided by 32 times the number of MDCT bins times the number of channels. If the result times the number of channels is greater than than the target divided by 16, the result is set to the target divided by the number of channels divided by 16. Then if the value is greater than 7 it is reset to 7 because a larger amount of fine energy resolution was determined not to be make an improvement in perceived quality. The resulting number of fine energy bits per channel is then multiplied by the number of channels and then by 16, and subtracted from the target allocation. This final target allocation is what is used for the PVQ.
    This section needs to be updated.
    CELT uses a Pyramid Vector Quantization (PVQ) codebook for quantizing the details of the spectrum in each band that have not been predicted by the pitch predictor. The PVQ codebook consists of all sums of K signed pulses in a vector of N samples, where two pulses at the same position are required to have the same sign. Thus the codebook includes all integer codevectors y of N dimensions that satisfy sum(abs(y(j))) = K. In bands where neither pitch nor folding is used, the PVQ is used to encode the unit vector that results from the normalization in directly. Given a PVQ codevector y, the unit vector X is obtained as X = y/||y||, where ||.|| denotes the L2 norm.
    Although the allocation is performed in 1/16 bit units, the quantization requires an integer number of pulses K. To do this, the encoder searches for the value of K that produces the number of bits that is the nearest to the allocated value (rounding down if exactly half-way between two values), subject to not exceeding the total number of bits available. The computation is performed in 1/16 of bits using log2_frac() and ec_enc_tell(). The number of codebooks entries can be computed as explained in . The difference between the number of bits allocated and the number of bits used is accumulated to a balance (initialised to zero) that helps adjusting the allocation for the next bands. One third of the balance is subtracted from the bit allocation of the next band to help achieving the target allocation. The only exceptions are the band before the last and the last band, for which half the balance and the whole balance are subtracted, respectively.
    The search for the best codevector y is performed by alg_quant() (vq.c). There are several possible approaches to the search with a tradeoff between quality and complexity. The method used in the reference implementation computes an initial codeword y1 by projecting the residual signal R = X - p' onto the codebook pyramid of K-1 pulses: y0 = round_towards_zero( (K-1) * R / sum(abs(R))) Depending on N, K and the input data, the initial codeword y0 may contain from 0 to K-1 non-zero values. All the remaining pulses, with the exception of the last one, are found iteratively with a greedy search that minimizes the normalized correlation between y and R: J = -R^T*y / ||y|| The search described above is considered to be a good trade-off between quality and computational cost. However, there are other possible ways to search the PVQ codebook and the implementors MAY use any other search methods.
    The best PVQ codeword is encoded as a uniformly-distributed integer value by encode_pulses() (cwrs.c). The codeword is converted to a unique index in the same way as specified in . The indexing is based on the calculation of V(N,K) (denoted N(L,K) in ), which is the number of possible combinations of K pulses in N samples. The number of combinations can be computed recursively as V(N,K) = V(N+1,K) + V(N,K+1) + V(N+1,K+1), with V(N,0) = 1 and V(0,K) = 0, K != 0. There are many different ways to compute V(N,K), including pre-computed tables and direct use of the recursive formulation. The reference implementation applies the recursive formulation one line (or column) at a time to save on memory use, along with an alternate, univariate recurrence to initialise an arbitrary line, and direct polynomial solutions for small N. All of these methods are equivalent, and have different trade-offs in speed, memory usage, and code size. Implementations MAY use any methods they like, as long as they are equivalent to the mathematical definition. The indexing computations are performed using 32-bit unsigned integers. For large codebooks, 32-bit integers are not sufficient. Instead of using 64-bit integers (or more), the encoding is made slightly sub-optimal by splitting each band into two equal (or near-equal) vectors of size (N+1)/2 and N/2, respectively. The number of pulses in the first half, K1, is first encoded as an integer in the range [0,K]. Then, two codebooks are encoded with V((N+1)/2, K1) and V(N/2, K-K1). The split operation is performed recursively, in case one (or both) of the split vectors still requires more than 32 bits. For compatibility reasons, the handling of codebooks of more than 32 bits MUST be implemented with the splitting method, even if 64-bit arithmetic is available.
    When encoding a stereo stream, some parameters are shared across the left and right channels, while others are transmitted separately for each channel, or jointly encoded. Only one copy of the flags for the features, transients and pitch (pitch period and gains) are transmitted. The coarse and fine energy parameters are transmitted separately for each channel. Both the coarse energy and fine energy (including the remaining fine bits at the end of the stream) have the left and right bands interleaved in the stream, with the left band encoded first. The main difference between mono and stereo coding is the PVQ coding of the normalized vectors. In stereo mode, a normalized mid-side (M-S) encoding is used. Let L and R be the normalized vector of a certain band for the left and right channels, respectively. The mid and side vectors are computed as M=L+R and S=L-R and no longer have unit norm. From M and S, an angular parameter theta=2/pi*atan2(||S||, ||M||) is computed. The theta parameter is converted to a Q14 fixed-point parameter itheta, which is quantized on a scale from 0 to 1 with an interval of 2^-qb, where qb = (b-2*(N-1)*(40-log2_frac(N,4)))/(32*(N-1)), b is the number of bits allocated to the band, and log2_frac() is defined in cwrs.c. From here on, the value of itheta MUST be treated in a bit-exact manner since both the encoder and decoder rely on it to infer the bit allocation. Let m=M/||M|| and s=S/||S||; m and s are separately encoded with the PVQ encoder described in . The number of bits allocated to m and s depends on the value of itheta. The number of bits allocated to coding m is obtained by: imid = bitexact_cos(itheta); iside = bitexact_cos(16384-itheta); delta = (N-1)*(log2_frac(iside,6)-log2_frac(imid,6))>>2; qalloc = log2_frac((1<<qb)+1,4); mbits = (b-qalloc/2-delta)/2; where bitexact_cos() is a fixed-point cosine approximation that MUST be bit-exact with the reference implementation in mathops.h. The spectral folding operation is performed independently for the mid and side vectors.
    After all the quantization is completed, the quantized energy is used along with the quantized normalized band data to resynthesize the MDCT spectrum. The inverse MDCT () and the weighted overlap-add are applied and the signal is stored in the synthesis buffer so it can be used for pitch prediction. The encoder MAY omit this step of the processing if it knows that it will not be using the pitch predictor for the next few frames. If the de-emphasis filter () is applied to this resynthesized signal, then the output will be the same (within numerical precision) as the decoder's output.
    Each CELT frame can be encoded in a different number of octets, making it possible to vary the bitrate at will. This property can be used to implement source-controlled variable bitrate (VBR). Support for VBR is OPTIONAL for the encoder, but a decoder MUST be prepared to decode a stream that changes its bit-rate dynamically. The method used to vary the bit-rate in VBR mode is left to the implementor, as long as each frame can be decoded by the reference decoder.
    Like most audio codecs, the CELT decoder is less complex than the encoder, as can be observed in the decoder block diagram in . In fact, most of the operations performed by the decoder are also performed by the encoder.
    | Mix |->| * |->|IMDCT|-+-> output +--+ +-----+ +---+ +-----+ | ^ ^ | +------+ | | | +--+ +-+-+ | |Q2|-->| * | | +--+ +---+ | ^ | | | +------+-----+ | +------------+ |Delay, MDCT,| | |Pitch period|->| Normalize | | +------------+ +------------+ | ^ | +--------------------+ ]]> Block diagram of the CELT decoder
    The decoder extracts information from the range-coded bit-stream in the same order as it was encoded by the encoder. In some circumstances, it is possible for a decoded value to be out of range due to a very small amount of redundancy in the encoding of large integers by the range coder. In that case, the decoder should assume there has been an error in the coding, decoding, or transmission and SHOULD take measures to conceal the error and/or report to the application that a problem has occurred.
    The range decoder extracts the symbols and integers encoded using the range encoder in . The range decoder maintains an internal state vector composed of the two-tuple (dif,rng), representing the difference between the high end of the current range and the actual coded value, and the size of the current range, respectively. Both dif and rng are 32-bit unsigned integer values. rng is initialized to 2^7. dif is initialized to rng minus the top 7 bits of the first input octet. Then the range is immediately normalized, using the procedure described in the following section.
    Decoding symbols is a two-step process. The first step determines a value fs that lies within the range of some symbol in the current context. The second step updates the range decoder state with the three-tuple (fl,fh,ft) corresponding to that symbol, as defined in . The first step is implemented by ec_decode() (rangedec.c), and computes fs = ft-min((dif-1)/(rng/ft)+1,ft), where ft is the sum of the frequency counts in the current context, as described in . The divisions here are exact integer division. In the reference implementation, a special version of ec_decode() called ec_decode_bin() (rangeenc.c) is defined using the parameter ftb instead of ft. It is mathematically equivalent to calling ec_decode() with ft = (1<<ftb), but avoids one of the divisions. The decoder then identifies the symbol in the current context corresponding to fs; i.e., the one whose three-tuple (fl,fh,ft) satisfies fl <= fs < fh. This tuple is used to update the decoder state according to dif = dif - (rng/ft)*(ft-fh), and if fl is greater than zero, rng = (rng/ft)*(fh-fl), or otherwise rng = rng - (rng/ft)*(ft-fh). After this update, the range is normalized. To normalize the range, the following process is repeated until rng > 2^23. First, rng is set to (rng<8)&0xFFFFFFFF. Then the next 8 bits of input are read into sym, using the remaining bit from the previous input octet as the high bit of sym, and the top 7 bits of the next octet for the remaining bits of sym. If no more input octets remain, zero bits are used instead. Then, dif is set to (dif<<8)-sym&0xFFFFFFFF (i.e., using wrap-around if the subtraction overflows a 32-bit register). Finally, if dif is larger than 2^31, dif is then set to dif - 2^31. This process is carried out by ec_dec_normalize() (rangedec.c).
    Functions ec_dec_uint() or ec_dec_bits() are based on ec_decode() and decode one of N equiprobable symbols, each with a frequency of 1, where N may be as large as 2^32-1. Because ec_decode() is limited to a total frequency of 2^16-1, this is done by decoding a series of symbols in smaller contexts. ec_dec_bits() (entdec.c) is defined, like ec_decode_bin(), to take a single parameter ftb, with ftb < 32. and ftb < 32, and produces an ftb-bit decoded integer value, t, initialized to zero. While ftb is greater than 8, it decodes the next 8 most significant bits of the integer, s = ec_decode_bin(8), updates the decoder state with the 3-tuple (s,s+1,256), adds those bits to the current value of t, t = t<<8 | s, and subtracts 8 from ftb. Then it decodes the remaining bits of the integer, s = ec_decode_bin(ftb), updates the decoder state with the 3 tuple (s,s+1,1<<ftb), and adds those bits to the final values of t, t = t<<ftb | s. ec_dec_uint() (entdec.c) takes a single parameter, ft, which is not necessarily a power of two, and returns an integer, t, with a value between 0 and ft-1, inclusive, which is initialized to zero. Let ftb be the location of the highest 1 bit in the two's-complement representation of (ft-1), or -1 if no bits are set. If ftb>8, then the top 8 bits of t are decoded using t = ec_decode((ft-1>>ftb-8)+1), the decoder state is updated with the three-tuple (s,s+1,(ft-1>>ftb-8)+1), and the remaining bits are decoded with t = t<<ftb-8|ec_dec_bits(ftb-8). If, at this point, t >= ft, then the current frame is corrupt, and decoding should stop. If the original value of ftb was not greater than 8, then t is decoded with t = ec_decode(ft), and the decoder state is updated with the three-tuple (t,t+1,ft).
    The bit allocation routines in CELT need to be able to determine a conservative upper bound on the number of bits that have been used to decode from the current frame thus far. This drives allocation decisions which must match those made in the encoder. This is computed in the reference implementation to fractional bit precision by the function ec_dec_tell() (rangedec.c). Like all operations in the range decoder, it must be implemented in a bit-exact manner, and must produce exactly the same value returned by ec_enc_tell() after encoding the same symbols.
    The energy of each band is extracted from the bit-stream in two steps according to the same coarse-fine strategy used in the encoder. First, the coarse energy is decoded in unquant_coarse_energy() (quant_bands.c) based on the probability of the Laplace model used by the encoder. After the coarse energy is decoded, the same allocation function as used in the encoder is called (). This determines the number of bits to decode for the fine energy quantization. The decoding of the fine energy bits is performed by unquant_fine_energy() (quant_bands.c). Finally, like the encoder, the remaining bits in the stream (that would otherwise go unused) are decoded using unquant_energy_finalise() (quant_bands.c).
    If the pitch bit is set, then the pitch period is extracted from the bit-stream. The pitch gain bits are extracted within the PVQ decoding as encoded by the encoder. When the folding bit is set, the folding prediction is computed in exactly the same way as the encoder, with the same gain, by the function intra_fold() (vq.c).
    In order to correctly decode the PVQ codewords, the decoder must perform exactly the same bits to pulses conversion as the encoder (see ).
    The decoding of the codeword from the index is performed as specified in , as implemented in function decode_pulses() (cwrs.c).
    The spherical codebook is decoded by alg_unquant() (vq.c). The index of the PVQ entry is obtained from the range coder and converted to a pulse vector by decode_pulses() (cwrs.c). The decoded normalized vector for each band is equal to X' = y/||y||, This operation is implemented in mix_pitch_and_residual() (vq.c), which is the same function as used in the encoder.
    Just like each band was normalized in the encoder, the last step of the decoder before the inverse MDCT is to denormalize the bands. Each decoded normalized band is multiplied by the square root of the decoded energy. This is done by denormalise_bands() (bands.c).
    The inverse MDCT implementation has no special characteristics. The input is N frequency-domain samples and the output is 2*N time-domain samples, while scaling by 1/2. The output is windowed using the same low-overlap window as the encoder. The IMDCT and windowing are performed by mdct_backward (mdct.c). If a time-domain pre-emphasis window was applied in the encoder, the (inverse) time-domain de-emphasis window is applied on the IMDCT result. After the overlap-add process, the signal is de-emphasized using the inverse of the pre-emphasis filter used in the encoder: 1/A(z)=1/(1-alpha_p*z^-1).
    Packet loss concealment (PLC) is an optional decoder-side feature which SHOULD be included when transmitting over an unreliable channel. Because PLC is not part of the bit-stream, there are several possible ways to implement PLC with different complexity/quality trade-offs. The PLC in the reference implementation finds a periodicity in the decoded signal and repeats the windowed waveform using the pitch offset. The windowed waveform is overlapped in such a way as to preserve the time-domain aliasing cancellation with the previous frame and the next frame. This is implemented in celt_decode_lost() (mdct.c).
    A potential denial-of-service threat exists for data encodings using compression techniques that have non-uniform receiver-end computational load. The attacker can inject pathological datagrams into the stream which are complex to decode and cause the receiver to become overloaded. However, this encoding does not exhibit any significant non-uniformity. With the exception of the first four bits, the bit-stream produced by CELT for an unknown audio stream is not easily predictable, due to the use of entropy coding. This should make CELT less vulnerable to attacks based on plaintext guessing when encryption is used. Also, since almost all possible bit combinations can be interpreted as a valid bit-stream, it is likely more difficult to determine from the decrypted bit-stream whether a guessed decryption key is valid. When operating CELT in variable-bitrate (VBR) mode, some of the properties described above no longer hold. More specifically, the size of the packet leaks a very small, but non-zero, amount of information about both the original signal and the bit-stream plaintext.
    This document has no actions for IANA.
    The authors would also like to thank the CELT users who contributed patches, bug reports, feature requests, suggestions or comments.
    Key words for use in RFCs to Indicate Requirement Levels RTP: A Transport Protocol for real-time applications A High-Quality Speech and Audio Codec With Less Than 10 ms delay A Full-Bandwidth Audio Codec with Low Complexity and Very Low Delay The CELT ultra-low delay audio codec Modified Discrete Cosine Transform Range encoding: An algorithm for removing redundancy from a digitised message Source coding algorithms for fast data compression A Pyramid Vector Quantizer
    This appendix contains the complete source code for a floating-point reference implementation of the CELT codec written in C. This implementation is derived from version 0.8.1 of the implementation available on the , which can be compiled for either floating-point or fixed-point architectures. The implementation can be compiled with either a C89 or a C99 compiler. It is reasonably optimized for most platforms such that only architecture-specific optimizations are likely to be useful. The FFT used is a slightly modified version of the KISS-FFT package, but it is easy to substitute any other FFT library. The testcelt executable can be used to test the encoding and decoding process: [ [packet loss rate]] ]]> where "rate" is the sampling rate in Hz, "channels" is the number of channels (1 or 2), "frame size" is the number of samples in a frame (64 to 1024) and "octets per packet" is the number of octets desired for each compressed frame. The input and output files are assumed to be a 16-bit PCM file in the machine native endianness. The optional "complexity" argument can select the quality vs complexity tradeoff (0-10) and the "packet loss rate" argument simulates random packet loss (argument is in tenths or a percent).
    mumble-1.3.4/3rdparty/celt-0.11.0-src/doc/ietf/build_drafts.sh0000775000175000017500000000053714010707315023337 0ustar builderbuilder#!/bin/sh ./convert_source.sh ./ietf_source.sh #codec draft xml2rfc draft-valin-celt-codec.xml draft-valin-celt-codec.html xml2rfc draft-valin-celt-codec.xml draft-valin-celt-codec.txt #RTP draft xml2rfc draft-valin-celt-rtp-profile.xml draft-valin-celt-rtp-profile.html xml2rfc draft-valin-celt-rtp-profile.xml draft-valin-celt-rtp-profile.txt mumble-1.3.4/3rdparty/celt-0.11.0-src/doc/ietf/convert_source.sh0000775000175000017500000000337114010707315023734 0ustar builderbuilder#!/bin/sh mkdir -p source for i in `ls ../../libcelt | grep '\.[ch]$'` do #echo "
    " > source/$i #echo '' >> source/$i #echo '
    > source/$i echo '#include "substitutions.h"' > tata.c echo 'SOURCE_CODE_BEGIN' >> tata.c if echo $i | grep '\.h' > /dev/null; then cat ../../libcelt/$i | sed -e 's/=\*/= \*/' -e 's/=-/= -/' -e 's/\t/ /g' -e 's/^#/\/\/PREPROCESS_REMOVE#/' >> tata.c else cat ../../libcelt/$i | sed -e 's/=\*/= \*/' -e 's/=-/= -/' -e 's/\t/ /g' -e 's/^#include/\/\/PREPROCESS_REMOVE#include/' | sed 's/^#define/\/\/PREPROCESS_REMOVE#define/'>> tata.c fi #cat ../../libcelt/$i | sed 's/^#/\/\/PREPROCESS_REMOVE#/' >> tata.c #cat ../../libcelt/$i | sed 's/^#include/\/\/PREPROCESS_REMOVE#include/' | sed 's/^#define/\/\/PREPROCESS_REMOVE#define/'>> tata.c gcc -DHAVE_CONFIG_H -C -E -nostdinc tata.c | grep -v '^#' | sed 's/\/\/PREPROCESS_REMOVE//' | perl -ne 'if ($begin) {print $_} if (/SOURCE_CODE_BEGIN/) {$begin=1}' > tata2.c #cat ../../libcelt/$i >> tata.c #gcc -C -E -nostdinc tata.c -fdirectives-only | perl -ne 'if ($begin) {print $_} if (/SOURCE_CODE_BEGIN/) {$begin=1}' > tata2.c indent -nsc -ncdb -original -sob -i2 -bl -bli0 --no-tabs -l69 --format-all-comments tata2.c -o tata.c cat tata.c | grep -v 'include.*float_cast' | ./wrap_lines > source/$i #cat tata.c > source/$i #indent --no-tabs -l72 --format-all-comments ../../libcelt/$i -o tata.c #cat tata.c >> source/$i #echo ']]>
    ' >> source/$i #echo '
    ' >> source/$i #echo '
    ' >> source/$i done cp arch.h source/arch.h cp celt_types.h source/celt_types.h cp config.h source/config.h cp Makefile.ietf source/Makefile rm source/mfrng*.c rm source/dump_modes* rm source/header* rm source/fixed* mumble-1.3.4/3rdparty/celt-0.11.0-src/doc/ietf/wrap_lines.c0000664000175000017500000000073014010707315022640 0ustar builderbuilder#include #include int main() { int comment = 0; int col = 0; char c0, c1; c0 = getchar(); while (!feof(stdin)) { c1 = getchar(); if (c1==9) c1 = 32; if (col < 71 || c0 == 10) { putchar(c0); } else { if (c1 == 10 || c1 == 13) { putchar(c0); } else { putchar ('\\'); /*printf ("%d %d %d", col, c0, c1);*/ putchar (10); putchar (c0); col=0; } } col++; if (c0 == 10) col=0; c0 = c1; } }mumble-1.3.4/3rdparty/celt-0.11.0-src/doc/ietf/ietf_source.sh0000775000175000017500000000056414010707315023204 0ustar builderbuilder#!/bin/sh mkdir -p xml_source for i in `ls source/ | grep '\.[ch]$'` Makefile do echo "
    " > xml_source/$i echo '' >> xml_source/$i echo '
    > xml_source/$i cat source/$i >> xml_source/$i echo ']]>
    ' >> xml_source/$i echo '
    ' >> xml_source/$i echo '
    ' >> xml_source/$i donemumble-1.3.4/3rdparty/celt-0.11.0-src/doc/ietf/Makefile.ietf0000664000175000017500000000050714010707315022721 0ustar builderbuilderCC = gcc CFLAGS = -c -O2 -g LIBS = -lm OBJS = bands.o celt.o cwrs.o entcode.o entdec.o entenc.o kiss_fft.o \ kiss_fftr.o laplace.o mdct.o modes.o pitch.o \ quant_bands.o rangedec.o rangeenc.o rate.o testcelt.o vq.o plc.o .c.o: $(CC) $(CFLAGS) $< testcelt: $(OBJS) $(CC) -o $@ $(OBJS) $(LIBS) clean: rm -f testcelt *.o mumble-1.3.4/3rdparty/celt-0.11.0-src/doc/ietf/arch.h0000664000175000017500000000516514010707315021426 0ustar builderbuilder/* Copyright (C) 2003-2008 Jean-Marc Valin */ /** @file arch.h @brief Various architecture definitions for CELT */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef ARCH_H #define ARCH_H #include "celt_types.h" #define CELT_SIG_SCALE 32768. #define celt_fatal(str) _celt_fatal(str, __FILE__, __LINE__); #ifdef ENABLE_ASSERTIONS #define celt_assert(cond) {if (!(cond)) \ {celt_fatal("assertion failed: " #cond);}} #define celt_assert2(cond, message) {if (!(cond)) \ {celt_fatal("assertion failed: " #cond "\n" message);}} #else #define celt_assert(cond) #define celt_assert2(cond, message) #endif #define ABS(x) ((x) < 0 ? (-(x)) : (x)) #define ABS16(x) ((x) < 0 ? (-(x)) : (x)) #define MIN16(a,b) ((a) < (b) ? (a) : (b)) #define MAX16(a,b) ((a) > (b) ? (a) : (b)) #define ABS32(x) ((x) < 0 ? (-(x)) : (x)) #define MIN32(a,b) ((a) < (b) ? (a) : (b)) #define MAX32(a,b) ((a) > (b) ? (a) : (b)) #define IMIN(a,b) ((a) < (b) ? (a) : (b)) #define IMAX(a,b) ((a) > (b) ? (a) : (b)) #define float2int(flt) ((int)(floor(.5+flt))) #define SCALEIN(a) ((a)*CELT_SIG_SCALE) #define SCALEOUT(a) ((a)*(1/CELT_SIG_SCALE)) #ifndef GLOBAL_STACK_SIZE #ifdef FIXED_POINT #define GLOBAL_STACK_SIZE 25000 #else #define GLOBAL_STACK_SIZE 40000 #endif #endif #endif /* ARCH_H */ mumble-1.3.4/3rdparty/celt-0.11.0-src/doc/ietf/draft-valin-celt-rtp-profile.xml0000664000175000017500000007664314010707315026470 0ustar builderbuilder draft-valin-celt-rtp-profile-02 Octasic Semiconductor
    4101, Molson Street, suite 300 Montreal Quebec H1Y 3L1 Canada jean-marc.valin@octasic.com
    Juniper Networks
    2251 Corporate Park Drive, Suite 100 Herndon VA 20171-1817 USA gmaxwell@juniper.net
    General AVT Working Group I-D Internet-Draft CELT RTP CELT is an open-source voice codec suitable for use in very low delay audio communication applications, including Voice over IP (VoIP). This document describes the payload format for CELT generated bit streams within an RTP packet. Also included here are the necessary details for the use of CELT with the Session Description Protocol (SDP). At the time of this writing, the CELT bit-stream has NOT been finalized yet, and compatibility is usually broken with every new release of the codec.
    The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119 .
    CELT stands for "Constrained Energy Lapped Transform". It applies some of the CELP principles, but does everything in the frequency domain, which removes some of the limitations of CELP. CELT is suitable for both speech and music and currently features: Ultra-low algorithmic delay (as low as 2 ms) Full audio bandwidth (up to 20 kHz audio bandwidth) Support for both voice and music Stereo support Packet loss concealment Constant bitrates from under 32 kbps to 128 kbps and above Free software/open-source
    For RTP based transportation of CELT encoded audio the standard RTP header is followed by one or more payload data blocks. An optional padding terminator may also be used.
    The RTP header is defined in the RTP specification . This section defines how fields in the RTP header are used. Padding (P): 1 bit If the padding bit is set, the packet contains one or more additional padding octets at the end which are not part of the payload. The last octet of the padding contains a count of how many padding octets should be ignored, including itself. Padding may be needed by some encryption algorithms with fixed block sizes or for carrying several RTP packets in a lower-layer protocol data unit. Extension (X): 1 bit If the extension, X, bit is set, the fixed header MUST be followed by exactly one header extension, with a format defined in Section 5.3.1. of . Marker (M): 1 bit The M bit MUST be set to zero in all packets. The receiver MUST ignore the M bit. Payload Type (PT): 7 bits Payload Type (PT): The assignment of an RTP payload type for this packet format is outside the scope of this document; it is specified by the RTP profile under which this payload format is used, or signaled dynamically out-of-band (e.g., using SDP). Timestamp: 32 bits A timestamp representing the sampling time of the first sample of the first CELT frame in the RTP payload. The clock frequency MUST be set to the sample rate of the encoded audio data and is conveyed out-of-band (e.g., as an SDP parameter).
    For the purposes of packetizing the bit stream in RTP, it is only necessary to consider the sequence of bits as output by the CELT encoder , and present the same sequence to the decoder. The payload format described here maintains this sequence. A typical CELT frame, encoded at a high bitrate, is approx. 128 octets and the total size of the CELT frames SHOULD be kept below the path MTU to prevent fragmentation. CELT frames MUST NOT be split across multiple RTP packets, An RTP packet MAY contain CELT frames of the same bit rate or of varying bit rates, since the bitrate for the frames is explicitly conveyed in band with the signal. The encoding and decoding algorithm can change the bit rate at any frame boundary, with the bit rate change notification provided in-band. No out-of-band notification is required for the decoder to process changes in the bit rate sent by the encoder. More than one frame may be encoded in the same RTP packet, and for the decoder it is not possible to determine the compressed size (bit-rate) of each encoded frame. Thus the compressed size information MUST be explicitly transmitted. There are two modes for conveying this information: either the compressed size(s) are encoded for each frame at the beginning of the RTP payload , or it is conveyed in the signaling and then fixed for the duration of the session (Low-Overhead Mode, ). Note that the compressed frame size information must be present either way even if only single frames are transmitted per RTP packet. It is RECOMMENDED that sampling rates 32000, 44100, or 48000 Hz be used for most applications, unless a specific reason exists -- such as requirements for a very specific packetization time. For example, 51200 Hz sampling may be useful to obtain a 5 ms packetization time with 256-sample frames. For compatibility reasons, the sender and receiver MUST support 48000 Hz sampling rate. The CELT codec always produces an integer number of bytes and can produce any integer number of bytes, so no padding is ever required. Bitrate adjustment SHOULD be used instead of padding.
    The bitrate used by CELT is implicitly determined by the size of the compressed data. When more than one frame is encoded in the same packet, it is not possible to determine the size of each encoded frame, so the information MUST be explicitly encoded. If N frames are present in a packet, N compressed frame sizes need to be encoded at the beginning of the packet. Each size that is less than 255 bytes is encoded in one byte (unsigned 8-bit integer). For sizes greater or equal to 255, a 0xff byte is encoded, followed by the size-255. Multiple 0xff bytes are allowed if there are more than 510 bytes transmitted. The length is always the size of the CELT frame excluding the length byte itself. The payload MUST NOT be padded, except in accordance with the padding bit definition in the RTP header. Below is an example of two CELT frames contained within one RTP packet.
    The following is an example of C code that interprets the length bytes:
    CELT supports both mono streams and stereo streams. If more than two channels are desired, it is possible to use transmit multiple streams in the same packet. In this case, the number of streams S and the pairing must be agreed with out-of-band negotiation such as SDP. Each stream can be either mono or stereo, depending on whether the channels are assumed to be correlated. For example, a 5.1 surround could have the front-left and front-right channels in a stereo stream, the rear-left and rear-right channels in a separate stereo stream, while the center and low-frequency channels would be in separate mono streams. In that example, the RTP packet would be:
    In the case where streams for multiple channels are used with multiple frames of the same streams per packet, then all streams for a certain timestamp are encoded before all streams for the following timestamp. In the case of the 5.1 example above with two frames per packet, the number of compressed length fields would be S*N = 8.
    Full definition of the MIME type for CELT will be part of the Ogg Vorbis MIME type definition application . MIME media type name: audio MIME subtype: celt Optional parameters: Required parameters: to be included in the Ogg MIME specification. Encoding considerations: Security Considerations: See Section 6 of RFC 3047. Interoperability considerations: none Published specification: Applications which use this media type: Additional information: none Person & email address to contact for further information: Jean-Marc Valin <jean-marc.valin@octasic.com> Intended usage: COMMON Author/Change controller: Author: Jean-Marc Valin <jean-marc.valin@octasic.com> Change controller: Jean-Marc Valin <jean-marc.valin@octasic.com> Change controller: IETF AVT Working Group This transport type signifies that the content is to be interpreted according to this document if the contents are transmitted over RTP. Should this transport type appear over a lossless streaming protocol such as TCP, the content encapsulation should be interpreted as an Ogg Stream in accordance with , with the exception that the content of the Ogg Stream may be assumed to be CELT audio and CELT audio only.
    When conveying information by SDP , the encoding name MUST be set to "CELT". The sampling frequency is typically between 32000 and 48000 Hz. Implementations MUST support 48000 Hz and SHOULD also support 44100 Hz. The SDP parameters have the following interpretation with respect to CELT: ptime: The desired packetization time. The sender SHOULD choose a number of frames per packet that corresponds to the smallest packetization time greater or equal to the specified ptime for the selected frame size. The default is 20 ms as specified in maxptime: The maximum packetization time desired. As specified in , if the maximum is lower than the smallest packetization time determined from the chosen frame size (as described above), then that packtization time SHOULD be used despite the maxptime value. The default is "no maximum". CELT-specific parameters can be given via the "a=fmtp:" directive. Several parameters can be given in a single a=fmtp line provided that they are separated by a semi-colon. The following parameters are defined for use in this way: bitrate: The desired bit-rate in kbit/s for the codec only (excluding headers and the length bytes). The value MUST be rounded to an integer number of bytes per frame. The round-to-nearest method is RECOMMENDED. The default bit-rate value is 64 kbit/s per channel. frame-size: The frame size is the duration of each frame in samples and has to be even. The default is 480. mapping: Optional string describing the multi-channel mapping. The selected frame-size values MUST be even. For quality and complexity reasons, they SHOULD also be divisible by 8 and have a prime factorization which consists only of 2, 3, or 5 factors. For example, powers-of-two and values such as 160, 320, 240, and 480 are recommended. Implementations MUST support receiving and sending the default value of 480. Implementations SHOULD also support frame sizes of 256 and 512 since these are the ones that lead to the lowest complexity. When frame sizes that are powers-of-two are supported, they SHOULD be listed first in the offer and chosen over non-powers-of-two in the answer. Care must be taken when setting the value of ptime: and bitrate: so that the RTP packet size does not exceed the path MTU. An example of the media representation in SDP for offering a single channel of CELT at 48000 samples per second might be: m=audio 8088 RTP/AVP 97 a=rtpmap:97 CELT/48000/1 Note that the RTP payload type code of 97 is defined in this media definition to be 'mapped' to the CELT codec at a 48 kHz sampling frequency using the 'a=rtpmap' line. Any number from 96 to 127 could have been chosen (the allowed range for dynamic types). If there is more than one channel being encoded the rtpmap MUST specify the channel count. When no channel count is included, the default is one channel. The following example demonstrates the use of the a=fmtp: parameters: m=audio 8008 RTP/AVP 97 a=ptime: 25 a=rtpmap:97 CELT/44100 a=fmtp:97 frame-size=512;bitrate=48 This examples illustrate an offerer that wishes to receive a CELT stream at 44100 Hz, by packing two 512-sample frames in each packet (less than 25 ms) at around 48 kbps (70 bytes per frame).
    When more than two channels are used, a mapping parameter MUST be provided. The mapping parameter is defined as comma separated list of integers which specify the number of channels contained in each CELT stream, OPTIONALLY followed by a '/' and a comma separated list of channel identifiers, then OPTIONALLY another '/' and a string which provides an application specific elaboration on any speaker-feed definitions. The channels per stream entries MUST be either 1 or 2. The total number of channels is indicated by the sum of the channels per stream entries. The sum of the channel counts MUST be equal to the total number of channels. Channel identifiers are short alphanumeric strings. Each identifier MUST begin with a letter indicating the type of channel. 'A' MUST be used to indicate an ambisonic channel, 'S' to indicate a speaker-feed channel, or 'O' indicating other usage. A channel identifier MAY be repeated, but the meaning of such repetition is application specific. Applications SHOULD attempt to utilize channel identifiers such that mixing all identical identifiers would produce a reasonable result. Non-surround usage such as individual performer tracks, effect send, "order wire", or other administrative channels may be given application specific identifiers which MUST not conflict with the identifiers defined in this draft. These identifiers SHOULD begin with S if it would be sensible to include them in a mono-downmix, or O if it would be most sensible to exclude them from a mono-downmix. An example usage might be mapping=2,1,2,1,1/SLguitar,SRguitar,OheadsetG,SLkeyboard,SRkeyboard,OheadsetK,SMbass,OheadsetB" Ambisonic channels MUST follow the Furse-Malham naming and weighing conventions for up to third order spherical. Higher order ambisonic support is application defined but MUST NOT reuse any of WXYZRSTUVKLMNOPQ for higher order components. For example, second order spherical ambisonics SHOULD use the mapping "mapping=1,1,1,1,1,1,1,1,1/AW,AX,AY,AZ,AR,AS,AT,AU,AV". Any set of Ambisonic channels MUST contain at least one "AW" channel. Speaker-feed identifiers are named based on the intended speaker locations. "L", "R" for the left and right speakers, respectively, in conventional stereo or the front left and right in 4, 5, 5.1, or 7.1 channel surround. "LR", "RR" for the left and right rear speakers in 4,5 or 5.1 channel surround. C" is used for a center channel, "MLFE" for a low frequency extension channel. "LS", "RS" for the side channels in 7.1 channel surround. Additional speaker-feeds are application specific but should not reuse the prior identifiers. For 5.1 surround in non-ambisonic form the mapping SHOULD be "mapping=2,2,1,1/L,R,LR,RR,C,MLFE/ITU-RBS.775-1". When only one or two channels are used, the mapping parameter MAY be omitted, in which case the default mapping is used. For one channel, the default is "mapping=1/C", while for two channels, the default is "mapping=2/L,R". For example a stereo configuration might signal: m=audio 8008 RTP/AVP 97 a=ptime: 5 a=rtpmap:97 CELT/44100/2 a=fmtp:97 frame-size=256 Which specifies a single two-channel CELT stream according to the default mapping.
    A low-overhead mode is defined to make more efficient use of bandwidth when transmitting CELT frames. In that mode none of the length values need to be transmitted. One the a=fmtp: parameter low-overhead: is defined and contains a single frame size, followed by a '/', followed by a comma-separated list of the number of bytes per frame for each stream defined in the channel mapping. The number of frames per channel can thus be computed as the payload size divided by the sum of the bytes-per-frame values. The frame-size: parameter MUST not be specified and SHOULD be ignored if encountered in an SDP offer or answer. The bitrate: parameter MUST also be ignored since the low-overhead: parameter makes it redundant. When the low-overhead: parameter is specified, the length of each frame MUST NOT be encoded in the payload and the bit-rate MUST NOT be changed during the session. For example a low-overhead 64 kbit/s mono stream could be signaled as: m=audio 8008 RTP/AVP 97 a=ptime: 5 a=rtpmap:97 CELT/48000/1 a=fmtp:97 low-overhead=256/43 and a low-overhead 360 kbit/s 5.1 surround configuration could be signaled as: m=audio 8008 RTP/AVP 97 a=ptime: 5 a=rtpmap:97 CELT/48000/6 a=fmtp:97 low-overhead=256/86,86,43,25;mapping=2,2,1,1/L,R,LR,RR,C,MLFE/ITU-RBS.775-1 In this last example, 4 bytes per packet would be saved. This corresponds to a 6 kbit/s reduction in the overhead, although the 60 kbit/s overhead of the IP, UDP and RTP headers is still present.
    CELT allows any bitrate, with a one byte per frame resolution, without any signaling requirement or overhead. Applications SHOULD utilize congestion control to regulate the transmitted bitrate. In some applications it may make sense to increase the packetization interval rather than decreasing the codec bitrate. Congestion control implementations should consider the users differential tolerance for high latency and low quality.
    RTP packets using the payload format defined in this specification are subject to the security considerations discussed in the RTP specification , and in any applicable RTP profile. The main security considerations for the RTP packet carrying the RTP payload format defined within this memo are confidentiality, integrity and source authenticity. Confidentiality is achieved by encryption of the RTP payload. Integrity of the RTP packets through suitable cryptographic integrity protection mechanism. Cryptographic system may also allow the authentication of the source of the payload. A suitable security mechanism for this RTP payload format should provide confidentiality, integrity protection and at least source authentication capable of determining if an RTP packet is from a member of the RTP session or not. Note that the appropriate mechanism to provide security to RTP and payloads following this memo may vary. It is dependent on the application, the transport, and the signalling protocol employed. Therefore a single mechanism is not sufficient, although if suitable the usage of SRTP is recommended. Other mechanism that may be used are IPsec and TLS (RTP over TCP), but also other alternatives may exist. This RTP payload format and its media decoder do not exhibit any significant non-uniformity in the receiver-side computational complexity for packet processing, and thus are unlikely to pose a denial-of-service threat due to the receipt of pathological data. Nor does the RTP payload format contain any active content. Because this format supports VBR operation small amounts of information about the transmitted audio may be leaked by a length preserving cryptographic transport. Accordingly, when CELT is used inside a secure transport the sender SHOULD restrict the use of VBR to congestion control purposes. CELT implementations will typically exhibit tiny content-sensitive encoding time variances. Since transmission is usually triggered by an accurate hardware clock and the encoded data is typically transmitted as soon as encoding is complete this variance may result in a small amount of additional frame to frame jitter which could be measured by a third-party. Encrypted implementations SHOULD transmit packets at fixed intervals to avoid the possible information leak.
    The authors would also like to thank the following people for their input: Timothy B. Terriberry, Ben Schwartz, Alexander Carot, Thorvald Natvig, Brian West, Steve Underwood, and Anthony Minessale.
    Key words for use in RFCs to Indicate Requirement Levels RTP: A Transport Protocol for real-time applications Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies SDP: Session Description Protocol RTP Profile for Audio and Video Conferences with Minimal Control. The application/ogg Media Type The Secure Real-time Transport Protocol (SRTP) Security Architecture for the Internet Protocol The Transport Layer Security (TLS) Protocol Version 1.2 The CELT ultra-low delay audio codec Higher order Ambisonic systems
    mumble-1.3.4/3rdparty/celt-0.11.0-src/doc/ietf/celt_types.h0000664000175000017500000000040714010707315022656 0ustar builderbuilder#ifndef _CELT_TYPES_H #define _CELT_TYPES_H typedef short celt_int16; typedef unsigned short celt_uint16; typedef int celt_int32; typedef unsigned int celt_uint32; typedef long long celt_int64; typedef unsigned long long celt_uint64; #endif /* _CELT_TYPES_H */ mumble-1.3.4/3rdparty/celt-0.11.0-src/doc/ietf/substitutions.h0000664000175000017500000000472614010707315023452 0ustar builderbuilder#define IMUL32(a,b) ((a)*(b)) #define UMUL32(a,b) ((a)*(b)) #define UMUL16_16(a,b) ((a)*(b)) #define celt_word16 float #define celt_word32 float #define celt_sig float #define celt_norm float #define celt_ener float #define celt_pgain float #define celt_mask float #define UADD32(a,b) ((a)+(b)) #define USUB32(a,b) ((a)-(b)) #define Q15ONE 1.0f #define Q30ONE 1.0f #define NORM_SCALING 1.f #define NORM_SCALING_1 1.f #define ENER_SCALING 1.f #define ENER_SCALING_1 1.f #define PGAIN_SCALING 1.f #define PGAIN_SCALING_1 1.f #define DB_SCALING 1.f #define DB_SCALING_1 1.f #define EPSILON 1e-15f #define VERY_SMALL 1e-15f #define VERY_LARGE32 1e15f #define VERY_LARGE16 1e15f #define Q15_ONE 1.f #define Q15_ONE_1 1.f #define QCONST16(x,bits) (x) #define QCONST32(x,bits) (x) #define NEG16(x) (-(x)) #define NEG32(x) (-(x)) #define EXTRACT16(x) (x) #define EXTEND32(x) (x) #define SHR16(a,shift) (a) #define SHL16(a,shift) (a) #define SHR32(a,shift) (a) #define SHL32(a,shift) (a) #define PSHR16(a,shift) (a) #define PSHR32(a,shift) (a) #define VSHR32(a,shift) (a) #define SATURATE16(x,a) (x) #define SATURATE32(x,a) (x) #define PSHR(a,shift) (a) #define SHR(a,shift) (a) #define SHL(a,shift) (a) #define SATURATE(x,a) (x) #define ROUND16(a,shift) (a) #define HALF32(x) (.5f*(x)) #define ADD16(a,b) ((a)+(b)) #define SUB16(a,b) ((a)-(b)) #define ADD32(a,b) ((a)+(b)) #define SUB32(a,b) ((a)-(b)) #define MULT16_16_16(a,b) ((a)*(b)) #define MULT16_16(a,b) ((a)*(b)) #define MAC16_16(c,a,b) ((c)+(a)*(b)) #define MULT16_32_Q11(a,b) ((a)*(b)) #define MULT16_32_Q13(a,b) ((a)*(b)) #define MULT16_32_Q14(a,b) ((a)*(b)) #define MULT16_32_Q15(a,b) ((a)*(b)) #define MULT16_32_Q16(a,b) ((a)*(b)) #define MULT16_32_P15(a,b) ((a)*(b)) #define MULT32_32_Q31(a,b) ((a)*(b)) #define MAC16_32_Q11(c,a,b) ((c)+(a)*(b)) #define MAC16_32_Q15(c,a,b) ((c)+(a)*(b)) #define MAC16_16_Q11(c,a,b) ((c)+(a)*(b)) #define MAC16_16_Q13(c,a,b) ((c)+(a)*(b)) #define MAC16_16_P13(c,a,b) ((c)+(a)*(b)) #define MULT16_16_Q11_32(a,b) ((a)*(b)) #define MULT16_16_Q13(a,b) ((a)*(b)) #define MULT16_16_Q14(a,b) ((a)*(b)) #define MULT16_16_Q15(a,b) ((a)*(b)) #define MULT16_16_P15(a,b) ((a)*(b)) #define MULT16_16_P13(a,b) ((a)*(b)) #define MULT16_16_P14(a,b) ((a)*(b)) #define DIV32_16(a,b) ((a)/(b)) #define PDIV32_16(a,b) ((a)/(b)) #define DIV32(a,b) ((a)/(b)) #define PDIV32(a,b) ((a)/(b)) #define PRINT_MIPS(x) mumble-1.3.4/3rdparty/celt-0.11.0-src/doc/ietf/config.h0000664000175000017500000000071314010707315021750 0ustar builderbuilder/* config.h. Generated from config.h.in by configure. */ /* config.h.in. Generated from configure.ac by autoheader. */ /* This is a build of CELT */ #define CELT_BUILD /**/ /* Version extra */ #define CELT_EXTRA_VERSION "" /* Version major */ #define CELT_MAJOR_VERSION 0 /* Version micro */ #define CELT_MICRO_VERSION 2 /* Version minor */ #define CELT_MINOR_VERSION 5 /* Complete version string */ #define CELT_VERSION "0.6.0" #define restrict mumble-1.3.4/3rdparty/celt-0.11.0-src/configure.ac0000664000175000017500000001557714010707315021142 0ustar builderbuilderdnl Process this file with autoconf to produce a configure script. -*-m4-*- AC_INIT(libcelt/arch.h) AM_CONFIG_HEADER([config.h]) CELT_MAJOR_VERSION=0 CELT_MINOR_VERSION=11 CELT_MICRO_VERSION=1 CELT_EXTRA_VERSION= CELT_VERSION=$CELT_MAJOR_VERSION.$CELT_MINOR_VERSION.$CELT_MICRO_VERSION$CELT_EXTRA_VERSION LIBCELT_SUFFIX=0 CELT_LT_CURRENT=2 CELT_LT_REVISION=0 CELT_LT_AGE=0 AC_SUBST(CELT_LT_CURRENT) AC_SUBST(CELT_LT_REVISION) AC_SUBST(CELT_LT_AGE) AC_SUBST(LIBCELT_SUFFIX) # For automake. VERSION=$CELT_VERSION PACKAGE=celt AC_SUBST(CELT_VERSION) AM_INIT_AUTOMAKE($PACKAGE, $VERSION, no-define) AM_MAINTAINER_MODE AC_CANONICAL_HOST AM_PROG_LIBTOOL AC_PROG_CC_C99 AC_C_BIGENDIAN AC_C_CONST AC_C_INLINE AC_C_RESTRICT AC_DEFINE([CELT_BUILD], [], [This is a build of CELT]) AC_MSG_CHECKING(for C99 variable-size arrays) AC_TRY_COMPILE( , [ int foo=10; int array[foo]; ], [has_var_arrays=yes;AC_DEFINE([VAR_ARRAYS], [], [Use C99 variable-size arrays]) ], has_var_arrays=no ) AC_MSG_RESULT($has_var_arrays) AC_CHECK_HEADERS([alloca.h getopt.h]) AC_MSG_CHECKING(for alloca) AC_TRY_COMPILE( [#include ], [ int foo=10; int *array = alloca(foo); ], [ has_alloca=yes; if test x$has_var_arrays = "xno" ; then AC_DEFINE([USE_ALLOCA], [], [Make use of alloca]) fi ], has_alloca=no ) AC_MSG_RESULT($has_alloca) AC_CHECK_HEADERS(sys/soundcard.h sys/audioio.h) AS_IF([test "x$with_ogg" != xno], [XIPH_PATH_OGG([tools="tools"], [tools=""])], [tools=""]) AC_SUBST(tools) AC_CHECK_LIB(m, sin) # Check for getopt_long; if not found, use included source. AC_CHECK_FUNCS([getopt_long],, [# FreeBSD has a gnugetopt library. AC_CHECK_LIB([gnugetopt],[getopt_long], [AC_DEFINE([HAVE_GETOPT_LONG])], [# Use the GNU replacement. AC_LIBOBJ(getopt) AC_LIBOBJ(getopt1)])]) AC_CHECK_LIB(winmm, main) AC_DEFINE_UNQUOTED(CELT_VERSION, "${CELT_VERSION}", [Complete version string]) AC_DEFINE_UNQUOTED(CELT_MAJOR_VERSION, ${CELT_MAJOR_VERSION}, [Version major]) AC_DEFINE_UNQUOTED(CELT_MINOR_VERSION, ${CELT_MINOR_VERSION}, [Version minor]) AC_DEFINE_UNQUOTED(CELT_MICRO_VERSION, ${CELT_MICRO_VERSION}, [Version micro]) AC_DEFINE_UNQUOTED(CELT_EXTRA_VERSION, "${CELT_EXTRA_VERSION}", [Version extra]) has_float_approx=no #case "$host_cpu" in #i[[3456]]86 | x86_64 | powerpc64 | powerpc32 | ia64) # has_float_approx=yes # ;; #esac ac_enable_fixed="no"; AC_ARG_ENABLE(fixed-point, [ --enable-fixed-point compile as fixed-point], [if test "$enableval" = yes; then ac_enable_fixed="yes"; AC_DEFINE([FIXED_POINT], , [Compile as fixed-point]) else AC_DEFINE([FLOATING_POINT], , [Compile as floating-point]) fi], AC_DEFINE([FLOATING_POINT], , [Compile as floating-point])) ac_enable_fixed_debug="no" AC_ARG_ENABLE(fixed-point-debug, [ --enable-fixed-point-debug debug fixed-point implementation], [if test "$enableval" = yes; then ac_enable_fixed_debug="yes" AC_DEFINE([FIXED_DEBUG], , [Debug fixed-point implementation]) fi]) ac_enable_experimental_postfilter="no" AC_ARG_ENABLE(experimental-postfilter, [ --enable-experimental-postfilter Enable this for testing only if you know what you're doing ], [if test "$enableval" = yes; then ac_enable_experimental_postfilter="yes" AC_DEFINE([ENABLE_POSTFILTER], , [Postfilter]) fi]) ac_enable_custom_modes="no" AC_ARG_ENABLE(custom-modes, [ --enable-custom-modes Enable non-Opus modes, like 44.1 kHz and powers of two ], [if test "$enableval" = yes; then ac_enable_custom_modes="yes" AC_DEFINE([CUSTOM_MODES], , [Custom modes]) fi]) float_approx=$has_float_approx AC_ARG_ENABLE(float-approx, [ --enable-float-approx enable fast approximations for floating point], [ if test "$enableval" = yes; then AC_WARN([Floating point approximations are not supported on all platforms.]) float_approx=yes else float_approx=no fi], [ float_approx=$has_float_approx ]) if test "x${float_approx}" = "xyes"; then AC_DEFINE([FLOAT_APPROX], , [Float approximations]) fi ac_enable_assertions="no" AC_ARG_ENABLE(assertions, [ --enable-assertions enable additional software error checking], [if test "$enableval" = yes; then ac_enable_assertions="yes" AC_DEFINE([ENABLE_ASSERTIONS], , [Assertions]) fi]) if test "$OPUS_BUILD" != "true" ; then saved_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -fvisibility=hidden" AC_MSG_CHECKING([if ${CXX} supports -fvisibility=hidden]) AC_COMPILE_IFELSE([char foo;], [ AC_MSG_RESULT([yes]) SYMBOL_VISIBILITY="-fvisibility=hidden" ], AC_MSG_RESULT([no])) CFLAGS="$saved_CFLAGS $SYMBOL_VISIBILITY" AC_SUBST(SYMBOL_VISIBILITY) fi if test $ac_cv_c_compiler_gnu = yes ; then CFLAGS="$CFLAGS -W -Wstrict-prototypes -Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wno-parentheses -Wno-unused-parameter -Wno-sign-compare" fi AC_CHECK_FUNCS([lrintf]) AC_CHECK_FUNCS([lrint]) AC_CHECK_SIZEOF(short) AC_CHECK_SIZEOF(int) AC_CHECK_SIZEOF(long) AC_CHECK_SIZEOF(long long) if test x$has_char16 = "xyes" ; then case 1 in $ac_cv_sizeof_short) SIZE16="short";; $ac_cv_sizeof_int) SIZE16="int";; esac else case 2 in $ac_cv_sizeof_short) SIZE16="short";; $ac_cv_sizeof_int) SIZE16="int";; esac fi if test x$has_char16 = "xyes" ; then case 2 in $ac_cv_sizeof_int) SIZE32="int";; $ac_cv_sizeof_long) SIZE32="long";; $ac_cv_sizeof_short) SIZE32="short";; esac else case 4 in $ac_cv_sizeof_int) SIZE32="int";; $ac_cv_sizeof_long) SIZE32="long";; $ac_cv_sizeof_short) SIZE32="short";; esac fi AC_SUBST(SIZE16) AC_SUBST(SIZE32) if test "$OPUS_BUILD" = "true" ; then AC_DEFINE(OPUS_BUILD, [], [We're part of Opus]) fi AC_OUTPUT([Makefile libcelt/Makefile tests/Makefile celt.pc tools/Makefile libcelt.spec ]) AC_MSG_RESULT([ ------------------------------------------------------------------------ $PACKAGE $VERSION: Automatic configuration OK. Compiler support: C99 var arrays: ................ ${has_var_arrays} C99 lrintf: .................... ${ac_cv_func_lrintf} Alloca: ........................ ${has_alloca} General configuration: Fast float approximations: ..... ${float_approx} Fixed point support: ........... ${ac_enable_fixed} Fixed point debugging: ......... ${ac_enable_fixed_debug} Custom modes: .................. ${ac_enable_custom_modes} Assertion checking: ............ ${ac_enable_assertions} ------------------------------------------------------------------------ ]) if test "x$tools" = "x"; then echo "**IMPORTANT**" echo "You don't seem to have the development package for libogg (libogg-devel) available. Only the library will be built (no encoder/decoder executable)" echo "You can download libogg from http://www.vorbis.com/download.psp" fi echo "Type \"make; make install\" to compile and install"; echo "Type \"make check\" to run the test suite"; mumble-1.3.4/3rdparty/celt-0.11.0-src/NEWS0000664000175000017500000000000014010707315017322 0ustar builderbuildermumble-1.3.4/3rdparty/celt-0.7.0-build/0000775000175000017500000000000014010707273017075 5ustar builderbuildermumble-1.3.4/3rdparty/celt-0.7.0-build/celt-0.7.0.rc0000664000175000017500000000161514010707273021015 0ustar builderbuilder#include #ifndef DEBUG #define VER_DEBUG 0L #else #define VER_DEBUG VS_FF_DEBUG #endif #ifdef SNAPSHOT_BUILD #define VER_RELEASE VS_FF_SPECIALBUILD|VS_FF_PRERELEASE #else #define VER_RELEASE 0L #endif VS_VERSION_INFO VERSIONINFO FILEVERSION 1,3,0,0 PRODUCTVERSION 1,3,0,0 FILEFLAGSMASK VS_FFI_FILEFLAGSMASK FILEFLAGS (VER_DEBUG|VER_RELEASE) FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_DLL FILESUBTYPE 0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904E4" BEGIN VALUE "FileDescription", "Mumble CELT 0.7.0 DLL" VALUE "FileVersion", "1.3.0" VALUE "ProductVersion", "1.3.0" VALUE "OriginalFilename", "celt0.0.7.0.dll" VALUE "ProductName", "Mumble" #ifdef SNAPSHOT_BUILD VALUE "SpecialBuild", "Snapshot development release" #endif END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1252 END END mumble-1.3.4/3rdparty/celt-0.7.0-build/celt-0.7.0-build.pro0000664000175000017500000000367614010707273022317 0ustar builderbuilderinclude(../../qmake/compiler.pri) BUILDDIR=$$basename(PWD) SOURCEDIR=$$replace(BUILDDIR,-build,-src) VERSION=$$replace(BUILDDIR,-build,) VERSION=$$replace(VERSION,celt-,) !exists(../$$SOURCEDIR/COPYING) { message("The $$SOURCEDIR/ directory was not found. Please update your submodules (git submodule update --init) or build with CONFIG+=no-bundled-celt.") error("Aborting configuration") } TEMPLATE = lib CONFIG -= qt CONFIG += debug_and_release CONFIG -= warn_on CONFIG += warn_off CONFIG += no_include_pwd VPATH = ../$$SOURCEDIR/libcelt TARGET = celt0 RC_FILE = celt-0.7.0.rc DEFINES += HAVE_CONFIG_H TARGET_VERSION_EXT = .$$VERSION CONFIG(sbcelt) { TARGET = celt CONFIG += static } else { CONFIG(static) { CONFIG -= static CONFIG += shared } } !CONFIG(third-party-warnings) { # We ignore warnings in third party builds. We won't actually look # at them and they clutter out our warnings. CONFIG -= warn_on CONFIG += warn_off } QMAKE_CFLAGS -= -fPIE -pie win32 { DEFINES += WIN32 _WIN32 win32-g++ { # MinGW uses the config.h for Unix-like systems. INCLUDEPATH += ../$$BUILDDIR } win32-msvc* { INCLUDEPATH += ../$$BUILDDIR/win32 CONFIG(sse2) { TARGET_VERSION_EXT = .$${VERSION}.sse2 } else { QMAKE_CFLAGS_RELEASE -= -arch:SSE QMAKE_CFLAGS_DEBUG -= -arch:SSE } } } unix { contains(QMAKE_CFLAGS, -ffast-math) { DEFINES += FLOAT_APPROX } INCLUDEPATH += ../$$BUILDDIR } SOURCES *= bands.c celt.c cwrs.c entcode.c entdec.c entenc.c header.c kiss_fft.c kiss_fftr.c laplace.c mdct.c modes.c pitch.c psy.c quant_bands.c rangedec.c rangeenc.c rate.c vq.c # TARGET is the same in both versions of CELT, thus we have to specify # a separated folder to prevent objects collision between the two. OBJECTS_DIR = $$OBJECTS_ROOT/celt-0.7.0-build MOC_DIR = $$MOC_ROOT/celt-0.7.0-build RCC_DIR = $$RCC_ROOT/celt-0.7.0-build UI_DIR = $$UI_ROOT/celt-0.7.0-build include(../../qmake/symbols.pri) mumble-1.3.4/3rdparty/celt-0.7.0-build/win32/0000775000175000017500000000000014010707273020037 5ustar builderbuildermumble-1.3.4/3rdparty/celt-0.7.0-build/win32/config.h0000664000175000017500000001040614010707273021456 0ustar builderbuilder/* config.h. Generated from config.h.in by configure. */ /* config.h.in. Generated from configure.ac by autoheader. */ /* Define if building universal (internal helper macro) */ /* #undef AC_APPLE_UNIVERSAL_BUILD */ /* This is a build of CELT */ #define CELT_BUILD /**/ /* Version extra */ #define CELT_EXTRA_VERSION "" /* Version major */ #define CELT_MAJOR_VERSION 0 /* Version micro */ #define CELT_MICRO_VERSION 2 /* Version minor */ #define CELT_MINOR_VERSION 5 /* Complete version string */ #define CELT_VERSION "0.5.2" /* Compile as fixed-point */ /* #undef DOUBLE_PRECISION */ /* Assertions */ /* #undef ENABLE_ASSERTIONS */ /* Debug fixed-point implementation */ /* #undef FIXED_DEBUG */ /* Compile as fixed-point */ /* #undef FIXED_POINT */ /* Compile as floating-point */ #define FLOATING_POINT /**/ /* Define to 1 if you have the header file. */ #define HAVE_ALLOCA_H 1 /* Define to 1 if you have the header file. */ #define HAVE_DLFCN_H 1 /* Define to 1 if you have the header file. */ #define HAVE_GETOPT_H 1 /* Define to 1 if you have the `getopt_long' function. */ #define HAVE_GETOPT_LONG 1 /* Define to 1 if you have the header file. */ // #define HAVE_INTTYPES_H 1 /* Define to 1 if you have the `m' library (-lm). */ #define HAVE_LIBM 1 /* Define to 1 if you have the `winmm' library (-lwinmm). */ /* #undef HAVE_LIBWINMM */ /* Define if you have C99's lrint function. */ // #define HAVE_LRINT 1 /* Define if you have C99's lrintf function. */ // #define HAVE_LRINTF 1 /* Define to 1 if you have the header file. */ #define HAVE_MEMORY_H 1 /* Define to 1 if you have the header file. */ // #define HAVE_STDINT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STDLIB_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STRINGS_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STRING_H 1 /* Define to 1 if you have the header file. */ /* #undef HAVE_SYS_AUDIOIO_H */ /* Define to 1 if you have the header file. */ #define HAVE_SYS_SOUNDCARD_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_STAT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_TYPES_H 1 /* Define to 1 if you have the header file. */ #define HAVE_UNISTD_H 1 /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #define LT_OBJDIR ".libs/" /* Compile as fixed-point */ /* #undef MIXED_PRECISION */ /* Define to the address where bug reports for this package should be sent. */ #define PACKAGE_BUGREPORT "" /* Define to the full name of this package. */ #define PACKAGE_NAME "" /* Define to the full name and version of this package. */ #define PACKAGE_STRING "" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "" /* Define to the version of this package. */ #define PACKAGE_VERSION "" /* The size of `int', as computed by sizeof. */ #define SIZEOF_INT 4 /* The size of `long', as computed by sizeof. */ #define SIZEOF_LONG 8 /* The size of `long long', as computed by sizeof. */ #define SIZEOF_LONG_LONG 8 /* The size of `short', as computed by sizeof. */ #define SIZEOF_SHORT 2 /* Static modes */ /* #undef STATIC_MODES */ /* Define to 1 if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* Make use of alloca */ /* #undef USE_ALLOCA */ #define USE_ALLOCA 1 /* Use C99 variable-size arrays */ // #define VAR_ARRAYS /**/ /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */ #if defined AC_APPLE_UNIVERSAL_BUILD # if defined __BIG_ENDIAN__ # define WORDS_BIGENDIAN 1 # endif #else # ifndef WORDS_BIGENDIAN /* # undef WORDS_BIGENDIAN */ # endif #endif /* Define to empty if `const' does not conform to ANSI C. */ /* #undef const */ /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #define inline #endif /* Define to the equivalent of the C99 'restrict' keyword, or to nothing if this is not supported. Do not define if restrict is supported directly. */ #define restrict mumble-1.3.4/3rdparty/celt-0.7.0-build/config.h0000664000175000017500000001117514010707273020520 0ustar builderbuilder/* config.h. Generated from config.h.in by configure. */ /* config.h.in. Generated from configure.ac by autoheader. */ /* Define if building universal (internal helper macro) */ /* #undef AC_APPLE_UNIVERSAL_BUILD */ /* This is a build of CELT */ #define CELT_BUILD /**/ /* Version extra */ #define CELT_EXTRA_VERSION "" /* Version major */ #define CELT_MAJOR_VERSION 0 /* Version micro */ #define CELT_MICRO_VERSION 0 /* Version minor */ #define CELT_MINOR_VERSION 7 /* Complete version string */ #define CELT_VERSION "0.7.0" /* Compile as fixed-point */ /* #undef DOUBLE_PRECISION */ /* Assertions */ /* #undef ENABLE_ASSERTIONS */ /* Debug fixed-point implementation */ /* #undef FIXED_DEBUG */ /* Compile as fixed-point */ /* #undef FIXED_POINT */ /* Compile as floating-point */ #define FLOATING_POINT /**/ /* Define to 1 if you have the header file. */ #define HAVE_ALLOCA_H 1 /* Define to 1 if you have the header file. */ #define HAVE_DLFCN_H 1 /* Define to 1 if you have the header file. */ #define HAVE_GETOPT_H 1 /* Define to 1 if you have the `getopt_long' function. */ #define HAVE_GETOPT_LONG 1 /* Define to 1 if you have the header file. */ #define HAVE_INTTYPES_H 1 /* Define to 1 if you have the `m' library (-lm). */ #define HAVE_LIBM 1 /* Define to 1 if you have the `winmm' library (-lwinmm). */ /* #undef HAVE_LIBWINMM */ /* Define if you have C99's lrint function. */ #define HAVE_LRINT 1 /* Define if you have C99's lrintf function. */ #define HAVE_LRINTF 1 /* Define to 1 if you have the header file. */ #define HAVE_MEMORY_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STDINT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STDLIB_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STRINGS_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STRING_H 1 /* Define to 1 if you have the header file. */ /* #undef HAVE_SYS_AUDIOIO_H */ /* Define to 1 if you have the header file. */ #define HAVE_SYS_SOUNDCARD_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_STAT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_TYPES_H 1 /* Define to 1 if you have the header file. */ #define HAVE_UNISTD_H 1 /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #define LT_OBJDIR ".libs/" /* Compile as fixed-point */ /* #undef MIXED_PRECISION */ /* Define to the address where bug reports for this package should be sent. */ #define PACKAGE_BUGREPORT "" /* Define to the full name of this package. */ #define PACKAGE_NAME "" /* Define to the full name and version of this package. */ #define PACKAGE_STRING "" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "" /* Define to the version of this package. */ #define PACKAGE_VERSION "" /* The size of `int', as computed by sizeof. */ #define SIZEOF_INT 4 /* The size of `long', as computed by sizeof. */ #define SIZEOF_LONG 8 /* The size of `long long', as computed by sizeof. */ #define SIZEOF_LONG_LONG 8 /* The size of `short', as computed by sizeof. */ #define SIZEOF_SHORT 2 /* Static modes */ /* #undef STATIC_MODES */ /* Define to 1 if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* Make use of alloca */ /* #undef USE_ALLOCA */ /* Use C99 variable-size arrays */ #define VAR_ARRAYS /**/ /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */ #if defined AC_APPLE_UNIVERSAL_BUILD # if defined __BIG_ENDIAN__ # define WORDS_BIGENDIAN 1 # endif #else # ifndef WORDS_BIGENDIAN /* # undef WORDS_BIGENDIAN */ # endif #endif /* Define to empty if `const' does not conform to ANSI C. */ /* #undef const */ /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus /* #undef inline */ #endif /* Define to the equivalent of the C99 'restrict' keyword, or to nothing if this is not supported. Do not define if restrict is supported directly. */ #define restrict __restrict /* Work around a bug in Sun C++: it does not support _Restrict, even though the corresponding Sun C compiler does, which causes "#define restrict _Restrict" in the previous line. Perhaps some future version of Sun C++ will work with _Restrict; if so, it'll probably define __RESTRICT, just as Sun C does. */ #if defined __SUNPRO_CC && !defined __RESTRICT # define _Restrict #endif mumble-1.3.4/3rdparty/minhook-build/0000775000175000017500000000000014010707273017152 5ustar builderbuildermumble-1.3.4/3rdparty/minhook-build/minhook-build.pro0000664000175000017500000000203114010707273022431 0ustar builderbuilderCONFIG += force-x86_64-toolchain include(../../qmake/compiler.pri) BUILDDIR=$$basename(PWD) SOURCEDIR=$$replace(BUILDDIR,-build,-src) !exists(../$$SOURCEDIR/README.md) { message("The $$SOURCEDIR/ directory was not found. Please update your submodules (git submodule update --init).") error("Aborting configuration") } TEMPLATE = lib CONFIG -= qt CONFIG += debug_and_release CONFIG += staticlib VPATH = ../$$SOURCEDIR TARGET = minhook INCLUDEPATH *= ../$$SOURCEDIR/src ../$$SOURCEDIR/src/hde ../$$SOURCEDIR/include DEFINES += WIN32 _WINDOWS _USRDLL MINHOOK_EXPORTS !CONFIG(third-party-warnings) { # We ignore warnings in third party builds. We won't actually look # at them and they clutter out our warnings. CONFIG -= warn_on CONFIG += warn_off } win32-msvc* { QMAKE_CFLAGS_RELEASE -= -MD QMAKE_CFLAGS_DEBUG -= -MDd QMAKE_CXXFLAGS_RELEASE *= -MT QMAKE_CXXFLAGS_DEBUG *= -MTd } SOURCES *= \ src/hde/hde64.c \ src/hde/hde32.c \ src/buffer.c \ src/hook.c \ src/trampoline.c mumble-1.3.4/README.Linux0000664000175000017500000000172014010707273014617 0ustar builderbuilderOpenGL Overlay ============== The OpenGL overlay works by intercepting the call to switch buffers, and just before the buffer switch, we draw our nice GUI. To load a game with the overlay enabled, start the game like this: LD_PRELOAD=/path/to/libmumble.so.1.1 gamename If you have Mumble installed through the binary packages, this can be done by simply typing: mumble-overlay gamename Global Keyboard Events ====================== On Linux, Mumble supports reading the kernel input devices. To use this, make sure mumble can open /dev/input/event* for reading. To test it out, that should only require: sudo chmod a+r /dev/input/event* However, be aware that this will most likely only last until the next reboot (at which point devfs is recreated) and you also allow any program run by any user to monitor the physical keyboard. Without this, Mumble will continuously poll the mouse and keyboard state for changes, which will use a tiny bit of processing power.

    =Norig) twidx-=Norig; C_MUL(t,scratchbuf[q] , twiddles[twidx] ); C_ADDTO( Fout[ k ] ,t); } k += m; } } } static void kf_shuffle( kiss_fft_cpx * Fout, const kiss_fft_cpx * f, const size_t fstride, int in_stride, int * factors, const kiss_fft_cfg st ) { const int p=*factors++; /* the radix */ const int m=*factors++; /* stage's fft length/p */ /*printf ("fft %d %d %d %d %d %d\n", p*m, m, p, s2, fstride*in_stride, N);*/ if (m==1) { int j; for (j=0;j32000 || (spx_int32_t)p*(spx_int32_t)p > n) p = n; /* no more factors, skip to end */ } n /= p; *facbuf++ = p; *facbuf++ = n; } while (n > 1); } /* * * User-callable function to allocate all necessary storage space for the fft. * * The return value is a contiguous block of memory, allocated with malloc. As such, * It can be freed with free(), rather than a kiss_fft-specific function. * */ kiss_fft_cfg kiss_fft_alloc(int nfft,int inverse_fft,void * mem,size_t * lenmem ) { kiss_fft_cfg st=NULL; size_t memneeded = sizeof(struct kiss_fft_state) + sizeof(kiss_fft_cpx)*(nfft-1); /* twiddle factors*/ if ( lenmem==NULL ) { st = ( kiss_fft_cfg)KISS_FFT_MALLOC( memneeded ); }else{ if (mem != NULL && *lenmem >= memneeded) st = (kiss_fft_cfg)mem; *lenmem = memneeded; } if (st) { int i; st->nfft=nfft; st->inverse = inverse_fft; #ifdef FIXED_POINT for (i=0;iinverse) phase = -phase; kf_cexp2(st->twiddles+i, DIV32(SHL32(phase,17),nfft)); } #else for (i=0;iinverse) phase *= -1; kf_cexp(st->twiddles+i, phase ); } #endif kf_factor(nfft,st->factors); } return st; } void kiss_fft_stride(kiss_fft_cfg st,const kiss_fft_cpx *fin,kiss_fft_cpx *fout,int in_stride) { if (fin == fout) { speex_fatal("In-place FFT not supported"); /*CHECKBUF(tmpbuf,ntmpbuf,st->nfft); kf_work(tmpbuf,fin,1,in_stride, st->factors,st); SPEEX_MOVE(fout,tmpbuf,st->nfft);*/ } else { kf_shuffle( fout, fin, 1,in_stride, st->factors,st); kf_work( fout, fin, 1,in_stride, st->factors,st, 1, in_stride, 1); } } void kiss_fft(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout) { kiss_fft_stride(cfg,fin,fout,1); } mumble-1.3.4/3rdparty/speexdsp-src/libspeexdsp/kiss_fftr.c0000664000175000017500000002465514010707343023523 0ustar builderbuilder/* Copyright (c) 2003-2004, Mark Borgerding All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the author nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "os_support.h" #include "kiss_fftr.h" #include "_kiss_fft_guts.h" struct kiss_fftr_state{ kiss_fft_cfg substate; kiss_fft_cpx * tmpbuf; kiss_fft_cpx * super_twiddles; #ifdef USE_SIMD long pad; #endif }; kiss_fftr_cfg kiss_fftr_alloc(int nfft,int inverse_fft,void * mem,size_t * lenmem) { int i; kiss_fftr_cfg st = NULL; size_t subsize, memneeded; if (nfft & 1) { speex_warning("Real FFT optimization must be even.\n"); return NULL; } nfft >>= 1; kiss_fft_alloc (nfft, inverse_fft, NULL, &subsize); memneeded = sizeof(struct kiss_fftr_state) + subsize + sizeof(kiss_fft_cpx) * ( nfft * 2); if (lenmem == NULL) { st = (kiss_fftr_cfg) KISS_FFT_MALLOC (memneeded); } else { if (*lenmem >= memneeded) st = (kiss_fftr_cfg) mem; *lenmem = memneeded; } if (!st) return NULL; st->substate = (kiss_fft_cfg) (st + 1); /*just beyond kiss_fftr_state struct */ st->tmpbuf = (kiss_fft_cpx *) (((char *) st->substate) + subsize); st->super_twiddles = st->tmpbuf + nfft; kiss_fft_alloc(nfft, inverse_fft, st->substate, &subsize); #ifdef FIXED_POINT for (i=0;i>1); if (!inverse_fft) phase = -phase; kf_cexp2(st->super_twiddles+i, DIV32(SHL32(phase,16),nfft)); } #else for (i=0;isuper_twiddles+i, phase ); } #endif return st; } void kiss_fftr(kiss_fftr_cfg st,const kiss_fft_scalar *timedata,kiss_fft_cpx *freqdata) { /* input buffer timedata is stored row-wise */ int k,ncfft; kiss_fft_cpx fpnk,fpk,f1k,f2k,tw,tdc; if ( st->substate->inverse) { speex_fatal("kiss fft usage error: improper alloc\n"); } ncfft = st->substate->nfft; /*perform the parallel fft of two real signals packed in real,imag*/ kiss_fft( st->substate , (const kiss_fft_cpx*)timedata, st->tmpbuf ); /* The real part of the DC element of the frequency spectrum in st->tmpbuf * contains the sum of the even-numbered elements of the input time sequence * The imag part is the sum of the odd-numbered elements * * The sum of tdc.r and tdc.i is the sum of the input time sequence. * yielding DC of input time sequence * The difference of tdc.r - tdc.i is the sum of the input (dot product) [1,-1,1,-1... * yielding Nyquist bin of input time sequence */ tdc.r = st->tmpbuf[0].r; tdc.i = st->tmpbuf[0].i; C_FIXDIV(tdc,2); CHECK_OVERFLOW_OP(tdc.r ,+, tdc.i); CHECK_OVERFLOW_OP(tdc.r ,-, tdc.i); freqdata[0].r = tdc.r + tdc.i; freqdata[ncfft].r = tdc.r - tdc.i; #ifdef USE_SIMD freqdata[ncfft].i = freqdata[0].i = _mm_set1_ps(0); #else freqdata[ncfft].i = freqdata[0].i = 0; #endif for ( k=1;k <= ncfft/2 ; ++k ) { fpk = st->tmpbuf[k]; fpnk.r = st->tmpbuf[ncfft-k].r; fpnk.i = - st->tmpbuf[ncfft-k].i; C_FIXDIV(fpk,2); C_FIXDIV(fpnk,2); C_ADD( f1k, fpk , fpnk ); C_SUB( f2k, fpk , fpnk ); C_MUL( tw , f2k , st->super_twiddles[k]); freqdata[k].r = HALF_OF(f1k.r + tw.r); freqdata[k].i = HALF_OF(f1k.i + tw.i); freqdata[ncfft-k].r = HALF_OF(f1k.r - tw.r); freqdata[ncfft-k].i = HALF_OF(tw.i - f1k.i); } } void kiss_fftri(kiss_fftr_cfg st,const kiss_fft_cpx *freqdata, kiss_fft_scalar *timedata) { /* input buffer timedata is stored row-wise */ int k, ncfft; if (st->substate->inverse == 0) { speex_fatal("kiss fft usage error: improper alloc\n"); } ncfft = st->substate->nfft; st->tmpbuf[0].r = freqdata[0].r + freqdata[ncfft].r; st->tmpbuf[0].i = freqdata[0].r - freqdata[ncfft].r; /*C_FIXDIV(st->tmpbuf[0],2);*/ for (k = 1; k <= ncfft / 2; ++k) { kiss_fft_cpx fk, fnkc, fek, fok, tmp; fk = freqdata[k]; fnkc.r = freqdata[ncfft - k].r; fnkc.i = -freqdata[ncfft - k].i; /*C_FIXDIV( fk , 2 ); C_FIXDIV( fnkc , 2 );*/ C_ADD (fek, fk, fnkc); C_SUB (tmp, fk, fnkc); C_MUL (fok, tmp, st->super_twiddles[k]); C_ADD (st->tmpbuf[k], fek, fok); C_SUB (st->tmpbuf[ncfft - k], fek, fok); #ifdef USE_SIMD st->tmpbuf[ncfft - k].i *= _mm_set1_ps(-1.0); #else st->tmpbuf[ncfft - k].i *= -1; #endif } kiss_fft (st->substate, st->tmpbuf, (kiss_fft_cpx *) timedata); } void kiss_fftr2(kiss_fftr_cfg st,const kiss_fft_scalar *timedata,kiss_fft_scalar *freqdata) { /* input buffer timedata is stored row-wise */ int k,ncfft; kiss_fft_cpx f2k,tdc; spx_word32_t f1kr, f1ki, twr, twi; if ( st->substate->inverse) { speex_fatal("kiss fft usage error: improper alloc\n"); } ncfft = st->substate->nfft; /*perform the parallel fft of two real signals packed in real,imag*/ kiss_fft( st->substate , (const kiss_fft_cpx*)timedata, st->tmpbuf ); /* The real part of the DC element of the frequency spectrum in st->tmpbuf * contains the sum of the even-numbered elements of the input time sequence * The imag part is the sum of the odd-numbered elements * * The sum of tdc.r and tdc.i is the sum of the input time sequence. * yielding DC of input time sequence * The difference of tdc.r - tdc.i is the sum of the input (dot product) [1,-1,1,-1... * yielding Nyquist bin of input time sequence */ tdc.r = st->tmpbuf[0].r; tdc.i = st->tmpbuf[0].i; C_FIXDIV(tdc,2); CHECK_OVERFLOW_OP(tdc.r ,+, tdc.i); CHECK_OVERFLOW_OP(tdc.r ,-, tdc.i); freqdata[0] = tdc.r + tdc.i; freqdata[2*ncfft-1] = tdc.r - tdc.i; for ( k=1;k <= ncfft/2 ; ++k ) { /*fpk = st->tmpbuf[k]; fpnk.r = st->tmpbuf[ncfft-k].r; fpnk.i = - st->tmpbuf[ncfft-k].i; C_FIXDIV(fpk,2); C_FIXDIV(fpnk,2); C_ADD( f1k, fpk , fpnk ); C_SUB( f2k, fpk , fpnk ); C_MUL( tw , f2k , st->super_twiddles[k]); freqdata[2*k-1] = HALF_OF(f1k.r + tw.r); freqdata[2*k] = HALF_OF(f1k.i + tw.i); freqdata[2*(ncfft-k)-1] = HALF_OF(f1k.r - tw.r); freqdata[2*(ncfft-k)] = HALF_OF(tw.i - f1k.i); */ /*f1k.r = PSHR32(ADD32(EXTEND32(st->tmpbuf[k].r), EXTEND32(st->tmpbuf[ncfft-k].r)),1); f1k.i = PSHR32(SUB32(EXTEND32(st->tmpbuf[k].i), EXTEND32(st->tmpbuf[ncfft-k].i)),1); f2k.r = PSHR32(SUB32(EXTEND32(st->tmpbuf[k].r), EXTEND32(st->tmpbuf[ncfft-k].r)),1); f2k.i = SHR32(ADD32(EXTEND32(st->tmpbuf[k].i), EXTEND32(st->tmpbuf[ncfft-k].i)),1); C_MUL( tw , f2k , st->super_twiddles[k]); freqdata[2*k-1] = HALF_OF(f1k.r + tw.r); freqdata[2*k] = HALF_OF(f1k.i + tw.i); freqdata[2*(ncfft-k)-1] = HALF_OF(f1k.r - tw.r); freqdata[2*(ncfft-k)] = HALF_OF(tw.i - f1k.i); */ f2k.r = SHR32(SUB32(EXTEND32(st->tmpbuf[k].r), EXTEND32(st->tmpbuf[ncfft-k].r)),1); f2k.i = PSHR32(ADD32(EXTEND32(st->tmpbuf[k].i), EXTEND32(st->tmpbuf[ncfft-k].i)),1); f1kr = SHL32(ADD32(EXTEND32(st->tmpbuf[k].r), EXTEND32(st->tmpbuf[ncfft-k].r)),13); f1ki = SHL32(SUB32(EXTEND32(st->tmpbuf[k].i), EXTEND32(st->tmpbuf[ncfft-k].i)),13); twr = SHR32(SUB32(MULT16_16(f2k.r,st->super_twiddles[k].r),MULT16_16(f2k.i,st->super_twiddles[k].i)), 1); twi = SHR32(ADD32(MULT16_16(f2k.i,st->super_twiddles[k].r),MULT16_16(f2k.r,st->super_twiddles[k].i)), 1); #ifdef FIXED_POINT freqdata[2*k-1] = PSHR32(f1kr + twr, 15); freqdata[2*k] = PSHR32(f1ki + twi, 15); freqdata[2*(ncfft-k)-1] = PSHR32(f1kr - twr, 15); freqdata[2*(ncfft-k)] = PSHR32(twi - f1ki, 15); #else freqdata[2*k-1] = .5f*(f1kr + twr); freqdata[2*k] = .5f*(f1ki + twi); freqdata[2*(ncfft-k)-1] = .5f*(f1kr - twr); freqdata[2*(ncfft-k)] = .5f*(twi - f1ki); #endif } } void kiss_fftri2(kiss_fftr_cfg st,const kiss_fft_scalar *freqdata,kiss_fft_scalar *timedata) { /* input buffer timedata is stored row-wise */ int k, ncfft; if (st->substate->inverse == 0) { speex_fatal ("kiss fft usage error: improper alloc\n"); } ncfft = st->substate->nfft; st->tmpbuf[0].r = freqdata[0] + freqdata[2*ncfft-1]; st->tmpbuf[0].i = freqdata[0] - freqdata[2*ncfft-1]; /*C_FIXDIV(st->tmpbuf[0],2);*/ for (k = 1; k <= ncfft / 2; ++k) { kiss_fft_cpx fk, fnkc, fek, fok, tmp; fk.r = freqdata[2*k-1]; fk.i = freqdata[2*k]; fnkc.r = freqdata[2*(ncfft - k)-1]; fnkc.i = -freqdata[2*(ncfft - k)]; /*C_FIXDIV( fk , 2 ); C_FIXDIV( fnkc , 2 );*/ C_ADD (fek, fk, fnkc); C_SUB (tmp, fk, fnkc); C_MUL (fok, tmp, st->super_twiddles[k]); C_ADD (st->tmpbuf[k], fek, fok); C_SUB (st->tmpbuf[ncfft - k], fek, fok); #ifdef USE_SIMD st->tmpbuf[ncfft - k].i *= _mm_set1_ps(-1.0); #else st->tmpbuf[ncfft - k].i *= -1; #endif } kiss_fft (st->substate, st->tmpbuf, (kiss_fft_cpx *) timedata); } mumble-1.3.4/3rdparty/speexdsp-src/libspeexdsp/resample_sse.h0000664000175000017500000001102714010707343024205 0ustar builderbuilder/* Copyright (C) 2007-2008 Jean-Marc Valin * Copyright (C) 2008 Thorvald Natvig */ /** @file resample_sse.h @brief Resampler functions (SSE version) */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #define OVERRIDE_INNER_PRODUCT_SINGLE static inline float inner_product_single(const float *a, const float *b, unsigned int len) { int i; float ret; __m128 sum = _mm_setzero_ps(); for (i=0;i #define OVERRIDE_INNER_PRODUCT_DOUBLE static inline double inner_product_double(const float *a, const float *b, unsigned int len) { int i; double ret; __m128d sum = _mm_setzero_pd(); __m128 t; for (i=0;i(b) ? (a):(b)) /* kiss_fft.h defines kiss_fft_scalar as either short or a float type and defines typedef struct { kiss_fft_scalar r; kiss_fft_scalar i; }kiss_fft_cpx; */ #include "kiss_fft.h" #include "math_approx.h" #define MAXFACTORS 32 /* e.g. an fft of length 128 has 4 factors as far as kissfft is concerned 4*4*4*2 */ struct kiss_fft_state{ int nfft; int inverse; int factors[2*MAXFACTORS]; kiss_fft_cpx twiddles[1]; }; /* Explanation of macros dealing with complex math: C_MUL(m,a,b) : m = a*b C_FIXDIV( c , div ) : if a fixed point impl., c /= div. noop otherwise C_SUB( res, a,b) : res = a - b C_SUBFROM( res , a) : res -= a C_ADDTO( res , a) : res += a * */ #ifdef FIXED_POINT #include "arch.h" # define FRACBITS 15 # define SAMPPROD spx_int32_t #define SAMP_MAX 32767 #define SAMP_MIN -SAMP_MAX #if defined(CHECK_OVERFLOW) # define CHECK_OVERFLOW_OP(a,op,b) \ if ( (SAMPPROD)(a) op (SAMPPROD)(b) > SAMP_MAX || (SAMPPROD)(a) op (SAMPPROD)(b) < SAMP_MIN ) { \ fprintf(stderr,"WARNING:overflow @ " __FILE__ "(%d): (%d " #op" %d) = %ld\n",__LINE__,(a),(b),(SAMPPROD)(a) op (SAMPPROD)(b) ); } #endif # define smul(a,b) ( (SAMPPROD)(a)*(b) ) # define sround( x ) (kiss_fft_scalar)( ( (x) + (1<<(FRACBITS-1)) ) >> FRACBITS ) # define S_MUL(a,b) sround( smul(a,b) ) # define C_MUL(m,a,b) \ do{ (m).r = sround( smul((a).r,(b).r) - smul((a).i,(b).i) ); \ (m).i = sround( smul((a).r,(b).i) + smul((a).i,(b).r) ); }while(0) # define C_MUL4(m,a,b) \ do{ (m).r = PSHR32( smul((a).r,(b).r) - smul((a).i,(b).i),17 ); \ (m).i = PSHR32( smul((a).r,(b).i) + smul((a).i,(b).r),17 ); }while(0) # define DIVSCALAR(x,k) \ (x) = sround( smul( x, SAMP_MAX/k ) ) # define C_FIXDIV(c,div) \ do { DIVSCALAR( (c).r , div); \ DIVSCALAR( (c).i , div); }while (0) # define C_MULBYSCALAR( c, s ) \ do{ (c).r = sround( smul( (c).r , s ) ) ;\ (c).i = sround( smul( (c).i , s ) ) ; }while(0) #else /* not FIXED_POINT*/ # define S_MUL(a,b) ( (a)*(b) ) #define C_MUL(m,a,b) \ do{ (m).r = (a).r*(b).r - (a).i*(b).i;\ (m).i = (a).r*(b).i + (a).i*(b).r; }while(0) #define C_MUL4(m,a,b) C_MUL(m,a,b) # define C_FIXDIV(c,div) /* NOOP */ # define C_MULBYSCALAR( c, s ) \ do{ (c).r *= (s);\ (c).i *= (s); }while(0) #endif #ifndef CHECK_OVERFLOW_OP # define CHECK_OVERFLOW_OP(a,op,b) /* noop */ #endif #define C_ADD( res, a,b)\ do { \ CHECK_OVERFLOW_OP((a).r,+,(b).r)\ CHECK_OVERFLOW_OP((a).i,+,(b).i)\ (res).r=(a).r+(b).r; (res).i=(a).i+(b).i; \ }while(0) #define C_SUB( res, a,b)\ do { \ CHECK_OVERFLOW_OP((a).r,-,(b).r)\ CHECK_OVERFLOW_OP((a).i,-,(b).i)\ (res).r=(a).r-(b).r; (res).i=(a).i-(b).i; \ }while(0) #define C_ADDTO( res , a)\ do { \ CHECK_OVERFLOW_OP((res).r,+,(a).r)\ CHECK_OVERFLOW_OP((res).i,+,(a).i)\ (res).r += (a).r; (res).i += (a).i;\ }while(0) #define C_SUBFROM( res , a)\ do {\ CHECK_OVERFLOW_OP((res).r,-,(a).r)\ CHECK_OVERFLOW_OP((res).i,-,(a).i)\ (res).r -= (a).r; (res).i -= (a).i; \ }while(0) #ifdef FIXED_POINT # define KISS_FFT_COS(phase) floor(MIN(32767,MAX(-32767,.5+32768 * cos (phase)))) # define KISS_FFT_SIN(phase) floor(MIN(32767,MAX(-32767,.5+32768 * sin (phase)))) # define HALF_OF(x) ((x)>>1) #elif defined(USE_SIMD) # define KISS_FFT_COS(phase) _mm_set1_ps( cos(phase) ) # define KISS_FFT_SIN(phase) _mm_set1_ps( sin(phase) ) # define HALF_OF(x) ((x)*_mm_set1_ps(.5)) #else # define KISS_FFT_COS(phase) (kiss_fft_scalar) cos(phase) # define KISS_FFT_SIN(phase) (kiss_fft_scalar) sin(phase) # define HALF_OF(x) ((x)*.5) #endif #define kf_cexp(x,phase) \ do{ \ (x)->r = KISS_FFT_COS(phase);\ (x)->i = KISS_FFT_SIN(phase);\ }while(0) #define kf_cexp2(x,phase) \ do{ \ (x)->r = spx_cos_norm((phase));\ (x)->i = spx_cos_norm((phase)-32768);\ }while(0) /* a debugging function */ #define pcpx(c)\ fprintf(stderr,"%g + %gi\n",(double)((c)->r),(double)((c)->i) ) mumble-1.3.4/3rdparty/speexdsp-src/libspeexdsp/scal.c0000664000175000017500000002043214010707343022440 0ustar builderbuilder/* Copyright (C) 2006-2008 CSIRO, Jean-Marc Valin, Xiph.Org Foundation File: scal.c Shaped comb-allpass filter for channel decorrelation Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* The algorithm implemented here is described in: * J.-M. Valin, Perceptually-Motivated Nonlinear Channel Decorrelation For Stereo Acoustic Echo Cancellation, Accepted for Joint Workshop on Hands­free Speech Communication and Microphone Arrays (HSCMA), 2008. http://people.xiph.org/~jm/papers/valin_hscma2008.pdf */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "speex/speex_echo.h" #include "vorbis_psy.h" #include "arch.h" #include "os_support.h" #include "smallft.h" #include #include #ifndef M_PI #define M_PI 3.14159265358979323846 /* pi */ #endif #define ALLPASS_ORDER 20 struct SpeexDecorrState_ { int rate; int channels; int frame_size; #ifdef VORBIS_PSYCHO VorbisPsy *psy; struct drft_lookup lookup; float *wola_mem; float *curve; #endif float *vorbis_win; int seed; float *y; /* Per-channel stuff */ float *buff; float (*ring)[ALLPASS_ORDER]; int *ringID; int *order; float *alpha; }; EXPORT SpeexDecorrState *speex_decorrelate_new(int rate, int channels, int frame_size) { int i, ch; SpeexDecorrState *st = speex_alloc(sizeof(SpeexDecorrState)); st->rate = rate; st->channels = channels; st->frame_size = frame_size; #ifdef VORBIS_PSYCHO st->psy = vorbis_psy_init(rate, 2*frame_size); spx_drft_init(&st->lookup, 2*frame_size); st->wola_mem = speex_alloc(frame_size*sizeof(float)); st->curve = speex_alloc(frame_size*sizeof(float)); #endif st->y = speex_alloc(frame_size*sizeof(float)); st->buff = speex_alloc(channels*2*frame_size*sizeof(float)); st->ringID = speex_alloc(channels*sizeof(int)); st->order = speex_alloc(channels*sizeof(int)); st->alpha = speex_alloc(channels*sizeof(float)); st->ring = speex_alloc(channels*ALLPASS_ORDER*sizeof(float)); /*FIXME: The +20 is there only as a kludge for ALL_PASS_OLA*/ st->vorbis_win = speex_alloc((2*frame_size+20)*sizeof(float)); for (i=0;i<2*frame_size;i++) st->vorbis_win[i] = sin(.5*M_PI* sin(M_PI*i/(2*frame_size))*sin(M_PI*i/(2*frame_size)) ); st->seed = rand(); for (ch=0;chring[ch][i] = 0; st->ringID[ch] = 0; st->alpha[ch] = 0; st->order[ch] = 10; } return st; } static float uni_rand(int *seed) { const unsigned int jflone = 0x3f800000; const unsigned int jflmsk = 0x007fffff; union {int i; float f;} ran; *seed = 1664525 * *seed + 1013904223; ran.i = jflone | (jflmsk & *seed); ran.f -= 1.5; return 2*ran.f; } static unsigned int irand(int *seed) { *seed = 1664525 * *seed + 1013904223; return ((unsigned int)*seed)>>16; } EXPORT void speex_decorrelate(SpeexDecorrState *st, const spx_int16_t *in, spx_int16_t *out, int strength) { int ch; float amount; if (strength<0) strength = 0; if (strength>100) strength = 100; amount = .01*strength; for (ch=0;chchannels;ch++) { int i; int N=2*st->frame_size; float beta, beta2; float *x; float max_alpha = 0; float *buff; float *ring; int ringID; int order; float alpha; buff = st->buff+ch*2*st->frame_size; ring = st->ring[ch]; ringID = st->ringID[ch]; order = st->order[ch]; alpha = st->alpha[ch]; for (i=0;iframe_size;i++) buff[i] = buff[i+st->frame_size]; for (i=0;iframe_size;i++) buff[i+st->frame_size] = in[i*st->channels+ch]; x = buff+st->frame_size; if (amount>1) beta = 1-sqrt(.4*amount); else beta = 1-0.63246*amount; if (beta<0) beta = 0; beta2 = beta; for (i=0;iframe_size;i++) { st->y[i] = alpha*(x[i-ALLPASS_ORDER+order]-beta*x[i-ALLPASS_ORDER+order-1])*st->vorbis_win[st->frame_size+i+order] + x[i-ALLPASS_ORDER]*st->vorbis_win[st->frame_size+i] - alpha*(ring[ringID] - beta*ring[ringID+1>=order?0:ringID+1]); ring[ringID++]=st->y[i]; st->y[i] *= st->vorbis_win[st->frame_size+i]; if (ringID>=order) ringID=0; } order = order+(irand(&st->seed)%3)-1; if (order < 5) order = 5; if (order > 10) order = 10; /*order = 5+(irand(&st->seed)%6);*/ max_alpha = pow(.96+.04*(amount-1),order); if (max_alpha > .98/(1.+beta2)) max_alpha = .98/(1.+beta2); alpha = alpha + .4*uni_rand(&st->seed); if (alpha > max_alpha) alpha = max_alpha; if (alpha < -max_alpha) alpha = -max_alpha; for (i=0;iframe_size;i++) { float tmp = alpha*(x[i-ALLPASS_ORDER+order]-beta*x[i-ALLPASS_ORDER+order-1])*st->vorbis_win[i+order] + x[i-ALLPASS_ORDER]*st->vorbis_win[i] - alpha*(ring[ringID] - beta*ring[ringID+1>=order?0:ringID+1]); ring[ringID++]=tmp; tmp *= st->vorbis_win[i]; if (ringID>=order) ringID=0; st->y[i] += tmp; } #ifdef VORBIS_PSYCHO float frame[N]; float scale = 1./N; for (i=0;i<2*st->frame_size;i++) frame[i] = buff[i]; //float coef = .5*0.78130; float coef = M_PI*0.075063 * 0.93763 * amount * .8 * 0.707; compute_curve(st->psy, buff, st->curve); for (i=1;iframe_size;i++) { float x1,x2; float gain; do { x1 = uni_rand(&st->seed); x2 = uni_rand(&st->seed); } while (x1*x1+x2*x2 > 1.); gain = coef*sqrt(.1+st->curve[i]); frame[2*i-1] = gain*x1; frame[2*i] = gain*x2; } frame[0] = coef*uni_rand(&st->seed)*sqrt(.1+st->curve[0]); frame[2*st->frame_size-1] = coef*uni_rand(&st->seed)*sqrt(.1+st->curve[st->frame_size-1]); spx_drft_backward(&st->lookup,frame); for (i=0;i<2*st->frame_size;i++) frame[i] *= st->vorbis_win[i]; #endif for (i=0;iframe_size;i++) { #ifdef VORBIS_PSYCHO float tmp = st->y[i] + frame[i] + st->wola_mem[i]; st->wola_mem[i] = frame[i+st->frame_size]; #else float tmp = st->y[i]; #endif if (tmp>32767) tmp = 32767; if (tmp < -32767) tmp = -32767; out[i*st->channels+ch] = tmp; } st->ringID[ch] = ringID; st->order[ch] = order; st->alpha[ch] = alpha; } } EXPORT void speex_decorrelate_destroy(SpeexDecorrState *st) { #ifdef VORBIS_PSYCHO vorbis_psy_destroy(st->psy); speex_free(st->wola_mem); speex_free(st->curve); #endif speex_free(st->buff); speex_free(st->ring); speex_free(st->ringID); speex_free(st->alpha); speex_free(st->vorbis_win); speex_free(st->order); speex_free(st->y); speex_free(st); } mumble-1.3.4/3rdparty/speexdsp-src/libspeexdsp/vorbis_psy.h0000664000175000017500000000631014010707343023721 0ustar builderbuilder/* Copyright (C) 2005 Jean-Marc Valin, CSIRO, Christopher Montgomery File: vorbis_psy.h Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef VORBIS_PSY_H #define VORBIS_PSY_H #ifdef VORBIS_PSYCHO #include "smallft.h" #define P_BANDS 17 /* 62Hz to 16kHz */ #define NOISE_COMPAND_LEVELS 40 #define todB(x) ((x)>1e-13?log((x)*(x))*4.34294480f:-30) #define fromdB(x) (exp((x)*.11512925f)) /* The bark scale equations are approximations, since the original table was somewhat hand rolled. The below are chosen to have the best possible fit to the rolled tables, thus their somewhat odd appearance (these are more accurate and over a longer range than the oft-quoted bark equations found in the texts I have). The approximations are valid from 0 - 30kHz (nyquist) or so. all f in Hz, z in Bark */ #define toBARK(n) (13.1f*atan(.00074f*(n))+2.24f*atan((n)*(n)*1.85e-8f)+1e-4f*(n)) #define fromBARK(z) (102.f*(z)-2.f*pow(z,2.f)+.4f*pow(z,3.f)+pow(1.46f,z)-1.f) /* Frequency to octave. We arbitrarily declare 63.5 Hz to be octave 0.0 */ #define toOC(n) (log(n)*1.442695f-5.965784f) #define fromOC(o) (exp(((o)+5.965784f)*.693147f)) typedef struct { float noisewindowlo; float noisewindowhi; int noisewindowlomin; int noisewindowhimin; int noisewindowfixed; float noiseoff[P_BANDS]; float noisecompand[NOISE_COMPAND_LEVELS]; } VorbisPsyInfo; typedef struct { int n; int rate; struct drft_lookup lookup; VorbisPsyInfo *vi; float *window; float *noiseoffset; long *bark; } VorbisPsy; VorbisPsy *vorbis_psy_init(int rate, int size); void vorbis_psy_destroy(VorbisPsy *psy); void compute_curve(VorbisPsy *psy, float *audio, float *curve); void curve_to_lpc(VorbisPsy *psy, float *curve, float *awk1, float *awk2, int ord); #endif #endif mumble-1.3.4/3rdparty/speexdsp-src/libspeexdsp/Makefile.am0000664000175000017500000000263514010707343023413 0ustar builderbuilder# Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies EXTRA_DIST=echo_diagnostic.m AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include/speex -I$(top_builddir) @FFT_CFLAGS@ lib_LTLIBRARIES = libspeexdsp.la # Sources for compilation in the library if BUILD_KISS_FFT FFTSRC=kiss_fft.c _kiss_fft_guts.h kiss_fft.h kiss_fftr.c kiss_fftr.h else if BUILD_SMALLFT FFTSRC=smallft.c else FFTSRC= endif endif libspeexdsp_la_SOURCES = preprocess.c jitter.c mdf.c fftwrap.c filterbank.c resample.c buffer.c scal.c $(FFTSRC) noinst_HEADERS = arch.h bfin.h \ fixed_arm4.h \ fixed_arm5e.h fixed_bfin.h fixed_debug.h \ math_approx.h misc_bfin.h \ stack_alloc.h fftwrap.h \ filterbank.h fixed_generic.h os_support.h \ pseudofloat.h smallft.h vorbis_psy.h resample_sse.h resample_neon.h libspeexdsp_la_LDFLAGS = -no-undefined -version-info @SPEEXDSP_LT_CURRENT@:@SPEEXDSP_LT_REVISION@:@SPEEXDSP_LT_AGE@ libspeexdsp_la_LIBADD = $(LIBM) if BUILD_EXAMPLES noinst_PROGRAMS = testdenoise testecho testjitter testresample testdenoise_SOURCES = testdenoise.c testdenoise_LDADD = libspeexdsp.la @FFT_LIBS@ testecho_SOURCES = testecho.c testecho_LDADD = libspeexdsp.la @FFT_LIBS@ testjitter_SOURCES = testjitter.c testjitter_LDADD = libspeexdsp.la @FFT_LIBS@ testresample_SOURCES = testresample.c testresample_LDADD = libspeexdsp.la @FFT_LIBS@ @LIBM@ endif mumble-1.3.4/3rdparty/speexdsp-src/libspeexdsp/smallft.c0000664000175000017500000005336314010707343023171 0ustar builderbuilder/******************************************************************** * * * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2001 * * by the XIPHOPHORUS Company http://www.xiph.org/ * * * ******************************************************************** function: *unnormalized* fft transform last mod: $Id: smallft.c,v 1.19 2003/10/08 05:12:37 jm Exp $ ********************************************************************/ /* FFT implementation from OggSquish, minus cosine transforms, * minus all but radix 2/4 case. In Vorbis we only need this * cut-down version. * * To do more than just power-of-two sized vectors, see the full * version I wrote for NetLib. * * Note that the packing is a little strange; rather than the FFT r/i * packing following R_0, I_n, R_1, I_1, R_2, I_2 ... R_n-1, I_n-1, * it follows R_0, R_1, I_1, R_2, I_2 ... R_n-1, I_n-1, I_n like the * FORTRAN version */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "smallft.h" #include "arch.h" #include "os_support.h" static void drfti1(int n, float *wa, int *ifac){ static int ntryh[4] = { 4,2,3,5 }; static float tpi = 6.28318530717958648f; float arg,argh,argld,fi; int ntry=0,i,j=-1; int k1, l1, l2, ib; int ld, ii, ip, is, nq, nr; int ido, ipm, nfm1; int nl=n; int nf=0; L101: j++; if (j < 4) ntry=ntryh[j]; else ntry+=2; L104: nq=nl/ntry; nr=nl-ntry*nq; if (nr!=0) goto L101; nf++; ifac[nf+1]=ntry; nl=nq; if(ntry!=2)goto L107; if(nf==1)goto L107; for (i=1;i>1; ipp2=ip; idp2=ido; nbd=(ido-1)>>1; t0=l1*ido; t10=ip*ido; if(ido==1)goto L119; for(ik=0;ikl1){ for(j=1;j>1; ipp2=ip; ipph=(ip+1)>>1; if(idol1)goto L139; is= -ido-1; t1=0; for(j=1;jn==1)return; drftf1(l->n,data,l->trigcache,l->trigcache+l->n,l->splitcache); } void spx_drft_backward(struct drft_lookup *l,float *data){ if (l->n==1)return; drftb1(l->n,data,l->trigcache,l->trigcache+l->n,l->splitcache); } void spx_drft_init(struct drft_lookup *l,int n) { l->n=n; l->trigcache=(float*)speex_alloc(3*n*sizeof(*l->trigcache)); l->splitcache=(int*)speex_alloc(32*sizeof(*l->splitcache)); fdrffti(n, l->trigcache, l->splitcache); } void spx_drft_clear(struct drft_lookup *l) { if(l) { if(l->trigcache) speex_free(l->trigcache); if(l->splitcache) speex_free(l->splitcache); } } mumble-1.3.4/3rdparty/speexdsp-src/libspeexdsp/jitter.c0000664000175000017500000007072014010707343023024 0ustar builderbuilder/* Copyright (C) 2002 Jean-Marc Valin File: speex_jitter.h Adaptive jitter buffer for Speex Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* TODO: - Add short-term estimate - Defensive programming + warn when last returned < last desired (begative buffering) + warn if update_delay not called between get() and tick() or is called twice in a row - Linked list structure for holding the packets instead of the current fixed-size array + return memory to a pool + allow pre-allocation of the pool + optional max number of elements - Statistics + drift + loss + late + jitter + buffering delay */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "arch.h" #include "speex/speex_jitter.h" #include "os_support.h" #ifndef NULL #define NULL 0 #endif #define SPEEX_JITTER_MAX_BUFFER_SIZE 200 /**< Maximum number of packets in jitter buffer */ #define TSUB(a,b) ((spx_int32_t)((a)-(b))) #define GT32(a,b) (((spx_int32_t)((a)-(b)))>0) #define GE32(a,b) (((spx_int32_t)((a)-(b)))>=0) #define LT32(a,b) (((spx_int32_t)((a)-(b)))<0) #define LE32(a,b) (((spx_int32_t)((a)-(b)))<=0) #define ROUND_DOWN(x, step) ((x)<0 ? ((x)-(step)+1)/(step)*(step) : (x)/(step)*(step)) #define MAX_TIMINGS 40 #define MAX_BUFFERS 3 #define TOP_DELAY 40 /** Buffer that keeps the time of arrival of the latest packets */ struct TimingBuffer { int filled; /**< Number of entries occupied in "timing" and "counts"*/ int curr_count; /**< Number of packet timings we got (including those we discarded) */ spx_int32_t timing[MAX_TIMINGS]; /**< Sorted list of all timings ("latest" packets first) */ spx_int16_t counts[MAX_TIMINGS]; /**< Order the packets were put in (will be used for short-term estimate) */ }; static void tb_init(struct TimingBuffer *tb) { tb->filled = 0; tb->curr_count = 0; } /* Add the timing of a new packet to the TimingBuffer */ static void tb_add(struct TimingBuffer *tb, spx_int16_t timing) { int pos; /* Discard packet that won't make it into the list because they're too early */ if (tb->filled >= MAX_TIMINGS && timing >= tb->timing[tb->filled-1]) { tb->curr_count++; return; } /* Find where the timing info goes in the sorted list */ pos = 0; /* FIXME: Do bisection instead of linear search */ while (posfilled && timing >= tb->timing[pos]) { pos++; } speex_assert(pos <= tb->filled && pos < MAX_TIMINGS); /* Shift everything so we can perform the insertion */ if (pos < tb->filled) { int move_size = tb->filled-pos; if (tb->filled == MAX_TIMINGS) move_size -= 1; SPEEX_MOVE(&tb->timing[pos+1], &tb->timing[pos], move_size); SPEEX_MOVE(&tb->counts[pos+1], &tb->counts[pos], move_size); } /* Insert */ tb->timing[pos] = timing; tb->counts[pos] = tb->curr_count; tb->curr_count++; if (tb->filledfilled++; } /** Jitter buffer structure */ struct JitterBuffer_ { spx_uint32_t pointer_timestamp; /**< Timestamp of what we will *get* next */ spx_uint32_t last_returned_timestamp; /**< Useful for getting the next packet with the same timestamp (for fragmented media) */ spx_uint32_t next_stop; /**< Estimated time the next get() will be called */ spx_int32_t buffered; /**< Amount of data we think is still buffered by the application (timestamp units)*/ JitterBufferPacket packets[SPEEX_JITTER_MAX_BUFFER_SIZE]; /**< Packets stored in the buffer */ spx_uint32_t arrival[SPEEX_JITTER_MAX_BUFFER_SIZE]; /**< Packet arrival time (0 means it was late, even though it's a valid timestamp) */ void (*destroy) (void *); /**< Callback for destroying a packet */ spx_int32_t delay_step; /**< Size of the steps when adjusting buffering (timestamp units) */ spx_int32_t concealment_size; /**< Size of the packet loss concealment "units" */ int reset_state; /**< True if state was just reset */ int buffer_margin; /**< How many frames we want to keep in the buffer (lower bound) */ int late_cutoff; /**< How late must a packet be for it not to be considered at all */ int interp_requested; /**< An interpolation is requested by speex_jitter_update_delay() */ int auto_adjust; /**< Whether to automatically adjust the delay at any time */ struct TimingBuffer _tb[MAX_BUFFERS]; /**< Don't use those directly */ struct TimingBuffer *timeBuffers[MAX_BUFFERS]; /**< Storing arrival time of latest frames so we can compute some stats */ int window_size; /**< Total window over which the late frames are counted */ int subwindow_size; /**< Sub-window size for faster computation */ int max_late_rate; /**< Absolute maximum amount of late packets tolerable (in percent) */ int latency_tradeoff; /**< Latency equivalent of losing one percent of packets */ int auto_tradeoff; /**< Latency equivalent of losing one percent of packets (automatic default) */ int lost_count; /**< Number of consecutive lost packets */ }; /** Based on available data, this computes the optimal delay for the jitter buffer. The optimised function is in timestamp units and is: cost = delay + late_factor*[number of frames that would be late if we used that delay] @param tb Array of buffers @param late_factor Equivalent cost of a late frame (in timestamp units) */ static spx_int16_t compute_opt_delay(JitterBuffer *jitter) { int i; spx_int16_t opt=0; spx_int32_t best_cost=0x7fffffff; int late = 0; int pos[MAX_BUFFERS]; int tot_count; float late_factor; int penalty_taken = 0; int best = 0; int worst = 0; spx_int32_t deltaT; struct TimingBuffer *tb; tb = jitter->_tb; /* Number of packet timings we have received (including those we didn't keep) */ tot_count = 0; for (i=0;ilatency_tradeoff != 0) late_factor = jitter->latency_tradeoff * 100.0f / tot_count; else late_factor = jitter->auto_tradeoff * jitter->window_size/tot_count; /*fprintf(stderr, "late_factor = %f\n", late_factor);*/ for (i=0;idelay_step); pos[next]++; /* Actual cost function that tells us how bad using this delay would be */ cost = -latest + late_factor*late; /*fprintf(stderr, "cost %d = %d + %f * %d\n", cost, -latest, late_factor, late);*/ if (cost < best_cost) { best_cost = cost; opt = latest; } } else { break; } /* For the next timing we will consider, there will be one more late packet to count */ late++; /* Two-frame penalty if we're going to increase the amount of late frames (hysteresis) */ if (latest >= 0 && !penalty_taken) { penalty_taken = 1; late+=4; } } deltaT = best-worst; /* This is a default "automatic latency tradeoff" when none is provided */ jitter->auto_tradeoff = 1 + deltaT/TOP_DELAY; /*fprintf(stderr, "auto_tradeoff = %d (%d %d %d)\n", jitter->auto_tradeoff, best, worst, i);*/ /* FIXME: Compute a short-term estimate too and combine with the long-term one */ /* Prevents reducing the buffer size when we haven't really had much data */ if (tot_count < TOP_DELAY && opt > 0) return 0; return opt; } /** Initialise jitter buffer */ EXPORT JitterBuffer *jitter_buffer_init(int step_size) { JitterBuffer *jitter = (JitterBuffer*)speex_alloc(sizeof(JitterBuffer)); if (jitter) { int i; spx_int32_t tmp; for (i=0;ipackets[i].data=NULL; jitter->delay_step = step_size; jitter->concealment_size = step_size; /*FIXME: Should this be 0 or 1?*/ jitter->buffer_margin = 0; jitter->late_cutoff = 50; jitter->destroy = NULL; jitter->latency_tradeoff = 0; jitter->auto_adjust = 1; tmp = 4; jitter_buffer_ctl(jitter, JITTER_BUFFER_SET_MAX_LATE_RATE, &tmp); jitter_buffer_reset(jitter); } return jitter; } /** Reset jitter buffer */ EXPORT void jitter_buffer_reset(JitterBuffer *jitter) { int i; for (i=0;ipackets[i].data) { if (jitter->destroy) jitter->destroy(jitter->packets[i].data); else speex_free(jitter->packets[i].data); jitter->packets[i].data = NULL; } } /* Timestamp is actually undefined at this point */ jitter->pointer_timestamp = 0; jitter->next_stop = 0; jitter->reset_state = 1; jitter->lost_count = 0; jitter->buffered = 0; jitter->auto_tradeoff = 32000; for (i=0;i_tb[i]); jitter->timeBuffers[i] = &jitter->_tb[i]; } /*fprintf (stderr, "reset\n");*/ } /** Destroy jitter buffer */ EXPORT void jitter_buffer_destroy(JitterBuffer *jitter) { jitter_buffer_reset(jitter); speex_free(jitter); } /** Take the following timing into consideration for future calculations */ static void update_timings(JitterBuffer *jitter, spx_int32_t timing) { if (timing < -32767) timing = -32767; if (timing > 32767) timing = 32767; /* If the current sub-window is full, perform a rotation and discard oldest sub-widow */ if (jitter->timeBuffers[0]->curr_count >= jitter->subwindow_size) { int i; /*fprintf(stderr, "Rotate buffer\n");*/ struct TimingBuffer *tmp = jitter->timeBuffers[MAX_BUFFERS-1]; for (i=MAX_BUFFERS-1;i>=1;i--) jitter->timeBuffers[i] = jitter->timeBuffers[i-1]; jitter->timeBuffers[0] = tmp; tb_init(jitter->timeBuffers[0]); } tb_add(jitter->timeBuffers[0], timing); } /** Compensate all timings when we do an adjustment of the buffering */ static void shift_timings(JitterBuffer *jitter, spx_int16_t amount) { int i, j; for (i=0;itimeBuffers[i]->filled;j++) jitter->timeBuffers[i]->timing[j] += amount; } } /** Put one packet into the jitter buffer */ EXPORT void jitter_buffer_put(JitterBuffer *jitter, const JitterBufferPacket *packet) { int i,j; int late; /*fprintf (stderr, "put packet %d %d\n", timestamp, span);*/ /* Cleanup buffer (remove old packets that weren't played) */ if (!jitter->reset_state) { for (i=0;ipackets[i].data && LE32(jitter->packets[i].timestamp + jitter->packets[i].span, jitter->pointer_timestamp)) { /*fprintf (stderr, "cleaned (not played)\n");*/ if (jitter->destroy) jitter->destroy(jitter->packets[i].data); else speex_free(jitter->packets[i].data); jitter->packets[i].data = NULL; } } } /*fprintf(stderr, "arrival: %d %d %d\n", packet->timestamp, jitter->next_stop, jitter->pointer_timestamp);*/ /* Check if packet is late (could still be useful though) */ if (!jitter->reset_state && LT32(packet->timestamp, jitter->next_stop)) { update_timings(jitter, ((spx_int32_t)packet->timestamp) - ((spx_int32_t)jitter->next_stop) - jitter->buffer_margin); late = 1; } else { late = 0; } /* For some reason, the consumer has failed the last 20 fetches. Make sure this packet is * used to resync. */ if (jitter->lost_count>20) { jitter_buffer_reset(jitter); } /* Only insert the packet if it's not hopelessly late (i.e. totally useless) */ if (jitter->reset_state || GE32(packet->timestamp+packet->span+jitter->delay_step, jitter->pointer_timestamp)) { /*Find an empty slot in the buffer*/ for (i=0;ipackets[i].data==NULL) break; } /*No place left in the buffer, need to make room for it by discarding the oldest packet */ if (i==SPEEX_JITTER_MAX_BUFFER_SIZE) { int earliest=jitter->packets[0].timestamp; i=0; for (j=1;jpackets[i].data || LT32(jitter->packets[j].timestamp,earliest)) { earliest = jitter->packets[j].timestamp; i=j; } } if (jitter->destroy) jitter->destroy(jitter->packets[i].data); else speex_free(jitter->packets[i].data); jitter->packets[i].data=NULL; /*fprintf (stderr, "Buffer is full, discarding earliest frame %d (currently at %d)\n", timestamp, jitter->pointer_timestamp);*/ } /* Copy packet in buffer */ if (jitter->destroy) { jitter->packets[i].data = packet->data; } else { jitter->packets[i].data=(char*)speex_alloc(packet->len); for (j=0;jlen;j++) jitter->packets[i].data[j]=packet->data[j]; } jitter->packets[i].timestamp=packet->timestamp; jitter->packets[i].span=packet->span; jitter->packets[i].len=packet->len; jitter->packets[i].sequence=packet->sequence; jitter->packets[i].user_data=packet->user_data; if (jitter->reset_state || late) jitter->arrival[i] = 0; else jitter->arrival[i] = jitter->next_stop; } } /** Get one packet from the jitter buffer */ EXPORT int jitter_buffer_get(JitterBuffer *jitter, JitterBufferPacket *packet, spx_int32_t desired_span, spx_int32_t *start_offset) { int i; unsigned int j; spx_int16_t opt; if (start_offset != NULL) *start_offset = 0; /* Syncing on the first call */ if (jitter->reset_state) { int found = 0; /* Find the oldest packet */ spx_uint32_t oldest=0; for (i=0;ipackets[i].data && (!found || LT32(jitter->packets[i].timestamp,oldest))) { oldest = jitter->packets[i].timestamp; found = 1; } } if (found) { jitter->reset_state=0; jitter->pointer_timestamp = oldest; jitter->next_stop = oldest; } else { packet->timestamp = 0; packet->span = jitter->interp_requested; return JITTER_BUFFER_MISSING; } } jitter->last_returned_timestamp = jitter->pointer_timestamp; if (jitter->interp_requested != 0) { packet->timestamp = jitter->pointer_timestamp; packet->span = jitter->interp_requested; /* Increment the pointer because it got decremented in the delay update */ jitter->pointer_timestamp += jitter->interp_requested; packet->len = 0; /*fprintf (stderr, "Deferred interpolate\n");*/ jitter->interp_requested = 0; jitter->buffered = packet->span - desired_span; return JITTER_BUFFER_INSERTION; } /* Searching for the packet that fits best */ /* Search the buffer for a packet with the right timestamp and spanning the whole current chunk */ for (i=0;ipackets[i].data && jitter->packets[i].timestamp==jitter->pointer_timestamp && GE32(jitter->packets[i].timestamp+jitter->packets[i].span,jitter->pointer_timestamp+desired_span)) break; } /* If no match, try for an "older" packet that still spans (fully) the current chunk */ if (i==SPEEX_JITTER_MAX_BUFFER_SIZE) { for (i=0;ipackets[i].data && LE32(jitter->packets[i].timestamp, jitter->pointer_timestamp) && GE32(jitter->packets[i].timestamp+jitter->packets[i].span,jitter->pointer_timestamp+desired_span)) break; } } /* If still no match, try for an "older" packet that spans part of the current chunk */ if (i==SPEEX_JITTER_MAX_BUFFER_SIZE) { for (i=0;ipackets[i].data && LE32(jitter->packets[i].timestamp, jitter->pointer_timestamp) && GT32(jitter->packets[i].timestamp+jitter->packets[i].span,jitter->pointer_timestamp)) break; } } /* If still no match, try for earliest packet possible */ if (i==SPEEX_JITTER_MAX_BUFFER_SIZE) { int found = 0; spx_uint32_t best_time=0; int best_span=0; int besti=0; for (i=0;ipackets[i].data && LT32(jitter->packets[i].timestamp,jitter->pointer_timestamp+desired_span) && GE32(jitter->packets[i].timestamp,jitter->pointer_timestamp)) { if (!found || LT32(jitter->packets[i].timestamp,best_time) || (jitter->packets[i].timestamp==best_time && GT32(jitter->packets[i].span,best_span))) { best_time = jitter->packets[i].timestamp; best_span = jitter->packets[i].span; besti = i; found = 1; } } } if (found) { i=besti; /*fprintf (stderr, "incomplete: %d %d %d %d\n", jitter->packets[i].timestamp, jitter->pointer_timestamp, chunk_size, jitter->packets[i].span);*/ } } /* If we find something */ if (i!=SPEEX_JITTER_MAX_BUFFER_SIZE) { spx_int32_t offset; /* We (obviously) haven't lost this packet */ jitter->lost_count = 0; /* In this case, 0 isn't as a valid timestamp */ if (jitter->arrival[i] != 0) { update_timings(jitter, ((spx_int32_t)jitter->packets[i].timestamp) - ((spx_int32_t)jitter->arrival[i]) - jitter->buffer_margin); } /* Copy packet */ if (jitter->destroy) { packet->data = jitter->packets[i].data; packet->len = jitter->packets[i].len; } else { if (jitter->packets[i].len > packet->len) { speex_warning_int("jitter_buffer_get(): packet too large to fit. Size is", jitter->packets[i].len); } else { packet->len = jitter->packets[i].len; } for (j=0;jlen;j++) packet->data[j] = jitter->packets[i].data[j]; /* Remove packet */ speex_free(jitter->packets[i].data); } jitter->packets[i].data = NULL; /* Set timestamp and span (if requested) */ offset = (spx_int32_t)jitter->packets[i].timestamp-(spx_int32_t)jitter->pointer_timestamp; if (start_offset != NULL) *start_offset = offset; else if (offset != 0) speex_warning_int("jitter_buffer_get() discarding non-zero start_offset", offset); packet->timestamp = jitter->packets[i].timestamp; jitter->last_returned_timestamp = packet->timestamp; packet->span = jitter->packets[i].span; packet->sequence = jitter->packets[i].sequence; packet->user_data = jitter->packets[i].user_data; /* Point to the end of the current packet */ jitter->pointer_timestamp = jitter->packets[i].timestamp+jitter->packets[i].span; jitter->buffered = packet->span - desired_span; if (start_offset != NULL) jitter->buffered += *start_offset; return JITTER_BUFFER_OK; } /* If we haven't found anything worth returning */ /*fprintf (stderr, "not found\n");*/ jitter->lost_count++; /*fprintf (stderr, "m");*/ /*fprintf (stderr, "lost_count = %d\n", jitter->lost_count);*/ opt = compute_opt_delay(jitter); /* Should we force an increase in the buffer or just do normal interpolation? */ if (opt < 0) { /* Need to increase buffering */ /* Shift histogram to compensate */ shift_timings(jitter, -opt); packet->timestamp = jitter->pointer_timestamp; packet->span = -opt; /* Don't move the pointer_timestamp forward */ packet->len = 0; jitter->buffered = packet->span - desired_span; return JITTER_BUFFER_INSERTION; /*jitter->pointer_timestamp -= jitter->delay_step;*/ /*fprintf (stderr, "Forced to interpolate\n");*/ } else { /* Normal packet loss */ packet->timestamp = jitter->pointer_timestamp; desired_span = ROUND_DOWN(desired_span, jitter->concealment_size); packet->span = desired_span; jitter->pointer_timestamp += desired_span; packet->len = 0; jitter->buffered = packet->span - desired_span; return JITTER_BUFFER_MISSING; /*fprintf (stderr, "Normal loss\n");*/ } } EXPORT int jitter_buffer_get_another(JitterBuffer *jitter, JitterBufferPacket *packet) { int i, j; for (i=0;ipackets[i].data && jitter->packets[i].timestamp==jitter->last_returned_timestamp) break; } if (i!=SPEEX_JITTER_MAX_BUFFER_SIZE) { /* Copy packet */ packet->len = jitter->packets[i].len; if (jitter->destroy) { packet->data = jitter->packets[i].data; } else { for (j=0;jlen;j++) packet->data[j] = jitter->packets[i].data[j]; /* Remove packet */ speex_free(jitter->packets[i].data); } jitter->packets[i].data = NULL; packet->timestamp = jitter->packets[i].timestamp; packet->span = jitter->packets[i].span; packet->sequence = jitter->packets[i].sequence; packet->user_data = jitter->packets[i].user_data; return JITTER_BUFFER_OK; } else { packet->data = NULL; packet->len = 0; packet->span = 0; return JITTER_BUFFER_MISSING; } } /* Let the jitter buffer know it's the right time to adjust the buffering delay to the network conditions */ static int _jitter_buffer_update_delay(JitterBuffer *jitter, JitterBufferPacket *packet, spx_int32_t *start_offset) { spx_int16_t opt = compute_opt_delay(jitter); /*fprintf(stderr, "opt adjustment is %d ", opt);*/ if (opt < 0) { shift_timings(jitter, -opt); jitter->pointer_timestamp += opt; jitter->interp_requested = -opt; /*fprintf (stderr, "Decision to interpolate %d samples\n", -opt);*/ } else if (opt > 0) { shift_timings(jitter, -opt); jitter->pointer_timestamp += opt; /*fprintf (stderr, "Decision to drop %d samples\n", opt);*/ } return opt; } /* Let the jitter buffer know it's the right time to adjust the buffering delay to the network conditions */ EXPORT int jitter_buffer_update_delay(JitterBuffer *jitter, JitterBufferPacket *packet, spx_int32_t *start_offset) { /* If the programmer calls jitter_buffer_update_delay() directly, automatically disable auto-adjustment */ jitter->auto_adjust = 0; return _jitter_buffer_update_delay(jitter, packet, start_offset); } /** Get pointer timestamp of jitter buffer */ EXPORT int jitter_buffer_get_pointer_timestamp(JitterBuffer *jitter) { return jitter->pointer_timestamp; } EXPORT void jitter_buffer_tick(JitterBuffer *jitter) { /* Automatically-adjust the buffering delay if requested */ if (jitter->auto_adjust) _jitter_buffer_update_delay(jitter, NULL, NULL); if (jitter->buffered >= 0) { jitter->next_stop = jitter->pointer_timestamp - jitter->buffered; } else { jitter->next_stop = jitter->pointer_timestamp; speex_warning_int("jitter buffer sees negative buffering, your code might be broken. Value is ", jitter->buffered); } jitter->buffered = 0; } EXPORT void jitter_buffer_remaining_span(JitterBuffer *jitter, spx_uint32_t rem) { /* Automatically-adjust the buffering delay if requested */ if (jitter->auto_adjust) _jitter_buffer_update_delay(jitter, NULL, NULL); if (jitter->buffered < 0) speex_warning_int("jitter buffer sees negative buffering, your code might be broken. Value is ", jitter->buffered); jitter->next_stop = jitter->pointer_timestamp - rem; } /* Used like the ioctl function to control the jitter buffer parameters */ EXPORT int jitter_buffer_ctl(JitterBuffer *jitter, int request, void *ptr) { int count, i; switch(request) { case JITTER_BUFFER_SET_MARGIN: jitter->buffer_margin = *(spx_int32_t*)ptr; break; case JITTER_BUFFER_GET_MARGIN: *(spx_int32_t*)ptr = jitter->buffer_margin; break; case JITTER_BUFFER_GET_AVALIABLE_COUNT: count = 0; for (i=0;ipackets[i].data && LE32(jitter->pointer_timestamp, jitter->packets[i].timestamp)) { count++; } } *(spx_int32_t*)ptr = count; break; case JITTER_BUFFER_SET_DESTROY_CALLBACK: jitter->destroy = (void (*) (void *))ptr; break; case JITTER_BUFFER_GET_DESTROY_CALLBACK: *(void (**) (void *))ptr = jitter->destroy; break; case JITTER_BUFFER_SET_DELAY_STEP: jitter->delay_step = *(spx_int32_t*)ptr; break; case JITTER_BUFFER_GET_DELAY_STEP: *(spx_int32_t*)ptr = jitter->delay_step; break; case JITTER_BUFFER_SET_CONCEALMENT_SIZE: jitter->concealment_size = *(spx_int32_t*)ptr; break; case JITTER_BUFFER_GET_CONCEALMENT_SIZE: *(spx_int32_t*)ptr = jitter->concealment_size; break; case JITTER_BUFFER_SET_MAX_LATE_RATE: jitter->max_late_rate = *(spx_int32_t*)ptr; jitter->window_size = 100*TOP_DELAY/jitter->max_late_rate; jitter->subwindow_size = jitter->window_size/MAX_BUFFERS; break; case JITTER_BUFFER_GET_MAX_LATE_RATE: *(spx_int32_t*)ptr = jitter->max_late_rate; break; case JITTER_BUFFER_SET_LATE_COST: jitter->latency_tradeoff = *(spx_int32_t*)ptr; break; case JITTER_BUFFER_GET_LATE_COST: *(spx_int32_t*)ptr = jitter->latency_tradeoff; break; default: speex_warning_int("Unknown jitter_buffer_ctl request: ", request); return -1; } return 0; } mumble-1.3.4/3rdparty/speexdsp-src/libspeexdsp/os_support.h0000664000175000017500000001227114010707343023742 0ustar builderbuilder/* Copyright (C) 2007 Jean-Marc Valin File: os_support.h This is the (tiny) OS abstraction layer. Aside from math.h, this is the only place where system headers are allowed. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef OS_SUPPORT_H #define OS_SUPPORT_H #include #include #include #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef OS_SUPPORT_CUSTOM #include "os_support_custom.h" #endif /** Speex wrapper for calloc. To do your own dynamic allocation, all you need to do is replace this function, speex_realloc and speex_free NOTE: speex_alloc needs to CLEAR THE MEMORY */ #ifndef OVERRIDE_SPEEX_ALLOC static inline void *speex_alloc (int size) { /* WARNING: this is not equivalent to malloc(). If you want to use malloc() or your own allocator, YOU NEED TO CLEAR THE MEMORY ALLOCATED. Otherwise you will experience strange bugs */ return calloc(size,1); } #endif /** Same as speex_alloc, except that the area is only needed inside a Speex call (might cause problem with wideband though) */ #ifndef OVERRIDE_SPEEX_ALLOC_SCRATCH static inline void *speex_alloc_scratch (int size) { /* Scratch space doesn't need to be cleared */ return calloc(size,1); } #endif /** Speex wrapper for realloc. To do your own dynamic allocation, all you need to do is replace this function, speex_alloc and speex_free */ #ifndef OVERRIDE_SPEEX_REALLOC static inline void *speex_realloc (void *ptr, int size) { return realloc(ptr, size); } #endif /** Speex wrapper for calloc. To do your own dynamic allocation, all you need to do is replace this function, speex_realloc and speex_alloc */ #ifndef OVERRIDE_SPEEX_FREE static inline void speex_free (void *ptr) { free(ptr); } #endif /** Same as speex_free, except that the area is only needed inside a Speex call (might cause problem with wideband though) */ #ifndef OVERRIDE_SPEEX_FREE_SCRATCH static inline void speex_free_scratch (void *ptr) { free(ptr); } #endif /** Copy n elements from src to dst. The 0* term provides compile-time type checking */ #ifndef OVERRIDE_SPEEX_COPY #define SPEEX_COPY(dst, src, n) (memcpy((dst), (src), (n)*sizeof(*(dst)) + 0*((dst)-(src)) )) #endif /** Copy n elements from src to dst, allowing overlapping regions. The 0* term provides compile-time type checking */ #ifndef OVERRIDE_SPEEX_MOVE #define SPEEX_MOVE(dst, src, n) (memmove((dst), (src), (n)*sizeof(*(dst)) + 0*((dst)-(src)) )) #endif /** For n elements worth of memory, set every byte to the value of c, starting at address dst */ #ifndef OVERRIDE_SPEEX_MEMSET #define SPEEX_MEMSET(dst, c, n) (memset((dst), (c), (n)*sizeof(*(dst)))) #endif #ifndef OVERRIDE_SPEEX_FATAL static inline void _speex_fatal(const char *str, const char *file, int line) { fprintf (stderr, "Fatal (internal) error in %s, line %d: %s\n", file, line, str); exit(1); } #endif #ifndef OVERRIDE_SPEEX_WARNING static inline void speex_warning(const char *str) { #ifndef DISABLE_WARNINGS fprintf (stderr, "warning: %s\n", str); #endif } #endif #ifndef OVERRIDE_SPEEX_WARNING_INT static inline void speex_warning_int(const char *str, int val) { #ifndef DISABLE_WARNINGS fprintf (stderr, "warning: %s %d\n", str, val); #endif } #endif #ifndef OVERRIDE_SPEEX_NOTIFY static inline void speex_notify(const char *str) { #ifndef DISABLE_NOTIFICATIONS fprintf (stderr, "notification: %s\n", str); #endif } #endif #ifndef OVERRIDE_SPEEX_PUTC /** Speex wrapper for putc */ static inline void _speex_putc(int ch, void *file) { FILE *f = (FILE *)file; fprintf(f, "%c", ch); } #endif #define speex_fatal(str) _speex_fatal(str, __FILE__, __LINE__); #define speex_assert(cond) {if (!(cond)) {speex_fatal("assertion failed: " #cond);}} #ifndef RELEASE static inline void print_vec(float *vec, int len, char *name) { int i; printf ("%s ", name); for (i=0;i union jbpdata { unsigned int idx; unsigned char data[4]; }; void synthIn(JitterBufferPacket *in, int idx, int span) { union jbpdata d; d.idx = idx; in->data = d.data; in->len = sizeof(d); in->timestamp = idx * 10; in->span = span * 10; in->sequence = idx; in->user_data = 0; } void jitterFill(JitterBuffer *jb) { char buffer[65536]; JitterBufferPacket in, out; int i; out.data = buffer; jitter_buffer_reset(jb); for(i=0;i<100;++i) { synthIn(&in, i, 1); jitter_buffer_put(jb, &in); out.len = 65536; if (jitter_buffer_get(jb, &out, 10, NULL) != JITTER_BUFFER_OK) { printf("Fill test failed iteration %d\n", i); } if (out.timestamp != i * 10) { printf("Fill test expected %d got %d\n", i*10, out.timestamp); } jitter_buffer_tick(jb); } } int main() { char buffer[65536]; JitterBufferPacket in, out; int i; JitterBuffer *jb = jitter_buffer_init(10); out.data = buffer; /* Frozen sender case */ jitterFill(jb); for(i=0;i<100;++i) { out.len = 65536; jitter_buffer_get(jb, &out, 10, NULL); jitter_buffer_tick(jb); } synthIn(&in, 100, 1); jitter_buffer_put(jb, &in); out.len = 65536; if (jitter_buffer_get(jb, &out, 10, NULL) != JITTER_BUFFER_OK) { printf("Failed frozen sender resynchronize\n"); } else { printf("Frozen sender: Jitter %d\n", out.timestamp - 100*10); } return 0; } mumble-1.3.4/3rdparty/speexdsp-src/libspeexdsp/filterbank.c0000664000175000017500000001522714010707343023645 0ustar builderbuilder/* Copyright (C) 2006 Jean-Marc Valin */ /** @file filterbank.c @brief Converting between psd and filterbank */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "filterbank.h" #include "arch.h" #include #include "math_approx.h" #include "os_support.h" #ifdef FIXED_POINT #define toBARK(n) (MULT16_16(26829,spx_atan(SHR32(MULT16_16(97,n),2))) + MULT16_16(4588,spx_atan(MULT16_32_Q15(20,MULT16_16(n,n)))) + MULT16_16(3355,n)) #else #define toBARK(n) (13.1f*atan(.00074f*(n))+2.24f*atan((n)*(n)*1.85e-8f)+1e-4f*(n)) #endif #define toMEL(n) (2595.f*log10(1.f+(n)/700.f)) FilterBank *filterbank_new(int banks, spx_word32_t sampling, int len, int type) { FilterBank *bank; spx_word32_t df; spx_word32_t max_mel, mel_interval; int i; int id1; int id2; df = DIV32(SHL32(sampling,15),MULT16_16(2,len)); max_mel = toBARK(EXTRACT16(sampling/2)); mel_interval = PDIV32(max_mel,banks-1); bank = (FilterBank*)speex_alloc(sizeof(FilterBank)); bank->nb_banks = banks; bank->len = len; bank->bank_left = (int*)speex_alloc(len*sizeof(int)); bank->bank_right = (int*)speex_alloc(len*sizeof(int)); bank->filter_left = (spx_word16_t*)speex_alloc(len*sizeof(spx_word16_t)); bank->filter_right = (spx_word16_t*)speex_alloc(len*sizeof(spx_word16_t)); /* Think I can safely disable normalisation that for fixed-point (and probably float as well) */ #ifndef FIXED_POINT bank->scaling = (float*)speex_alloc(banks*sizeof(float)); #endif for (i=0;i max_mel) break; #ifdef FIXED_POINT id1 = DIV32(mel,mel_interval); #else id1 = (int)(floor(mel/mel_interval)); #endif if (id1>banks-2) { id1 = banks-2; val = Q15_ONE; } else { val = DIV32_16(mel - id1*mel_interval,EXTRACT16(PSHR32(mel_interval,15))); } id2 = id1+1; bank->bank_left[i] = id1; bank->filter_left[i] = SUB16(Q15_ONE,val); bank->bank_right[i] = id2; bank->filter_right[i] = val; } /* Think I can safely disable normalisation for fixed-point (and probably float as well) */ #ifndef FIXED_POINT for (i=0;inb_banks;i++) bank->scaling[i] = 0; for (i=0;ilen;i++) { int id = bank->bank_left[i]; bank->scaling[id] += bank->filter_left[i]; id = bank->bank_right[i]; bank->scaling[id] += bank->filter_right[i]; } for (i=0;inb_banks;i++) bank->scaling[i] = Q15_ONE/(bank->scaling[i]); #endif return bank; } void filterbank_destroy(FilterBank *bank) { speex_free(bank->bank_left); speex_free(bank->bank_right); speex_free(bank->filter_left); speex_free(bank->filter_right); #ifndef FIXED_POINT speex_free(bank->scaling); #endif speex_free(bank); } void filterbank_compute_bank32(FilterBank *bank, spx_word32_t *ps, spx_word32_t *mel) { int i; for (i=0;inb_banks;i++) mel[i] = 0; for (i=0;ilen;i++) { int id; id = bank->bank_left[i]; mel[id] += MULT16_32_P15(bank->filter_left[i],ps[i]); id = bank->bank_right[i]; mel[id] += MULT16_32_P15(bank->filter_right[i],ps[i]); } /* Think I can safely disable normalisation that for fixed-point (and probably float as well) */ #ifndef FIXED_POINT /*for (i=0;inb_banks;i++) mel[i] = MULT16_32_P15(Q15(bank->scaling[i]),mel[i]); */ #endif } void filterbank_compute_psd16(FilterBank *bank, spx_word16_t *mel, spx_word16_t *ps) { int i; for (i=0;ilen;i++) { spx_word32_t tmp; int id1, id2; id1 = bank->bank_left[i]; id2 = bank->bank_right[i]; tmp = MULT16_16(mel[id1],bank->filter_left[i]); tmp += MULT16_16(mel[id2],bank->filter_right[i]); ps[i] = EXTRACT16(PSHR32(tmp,15)); } } #ifndef FIXED_POINT void filterbank_compute_bank(FilterBank *bank, float *ps, float *mel) { int i; for (i=0;inb_banks;i++) mel[i] = 0; for (i=0;ilen;i++) { int id = bank->bank_left[i]; mel[id] += bank->filter_left[i]*ps[i]; id = bank->bank_right[i]; mel[id] += bank->filter_right[i]*ps[i]; } for (i=0;inb_banks;i++) mel[i] *= bank->scaling[i]; } void filterbank_compute_psd(FilterBank *bank, float *mel, float *ps) { int i; for (i=0;ilen;i++) { int id = bank->bank_left[i]; ps[i] = mel[id]*bank->filter_left[i]; id = bank->bank_right[i]; ps[i] += mel[id]*bank->filter_right[i]; } } void filterbank_psy_smooth(FilterBank *bank, float *ps, float *mask) { /* Low freq slope: 14 dB/Bark*/ /* High freq slope: 9 dB/Bark*/ /* Noise vs tone: 5 dB difference */ /* FIXME: Temporary kludge */ float bark[100]; int i; /* Assumes 1/3 Bark resolution */ float decay_low = 0.34145f; float decay_high = 0.50119f; filterbank_compute_bank(bank, ps, bark); for (i=1;inb_banks;i++) { /*float decay_high = 13-1.6*log10(bark[i-1]); decay_high = pow(10,(-decay_high/30.f));*/ bark[i] = bark[i] + decay_high*bark[i-1]; } for (i=bank->nb_banks-2;i>=0;i--) { bark[i] = bark[i] + decay_low*bark[i+1]; } filterbank_compute_psd(bank, bark, mask); } #endif mumble-1.3.4/3rdparty/speexdsp-src/libspeexdsp/misc_bfin.h0000664000175000017500000000422714010707343023460 0ustar builderbuilder/* Copyright (C) 2005 Analog Devices */ /** @file misc_bfin.h @author Jean-Marc Valin @brief Various compatibility routines for Speex (Blackfin version) */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "bfin.h" #define OVERRIDE_SPEEX_MOVE void *speex_move (void *dest, void *src, int n) { __asm__ __volatile__ ( "L0 = 0;\n\t" "I0 = %0;\n\t" "R0 = [I0++];\n\t" "LOOP move%= LC0 = %2;\n\t" "LOOP_BEGIN move%=;\n\t" "[%1++] = R0 || R0 = [I0++];\n\t" "LOOP_END move%=;\n\t" "[%1++] = R0;\n\t" : "=a" (src), "=a" (dest) : "a" ((n>>2)-1), "0" (src), "1" (dest) : "R0", "I0", "L0", "memory" BFIN_HWLOOP0_REGS ); return dest; } mumble-1.3.4/3rdparty/speexdsp-src/libspeexdsp/fftwrap.c0000664000175000017500000002471014010707343023172 0ustar builderbuilder/* Copyright (C) 2005-2006 Jean-Marc Valin File: fftwrap.c Wrapper for various FFTs Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "arch.h" #include "os_support.h" #define MAX_FFT_SIZE 2048 #ifdef FIXED_POINT static int maximize_range(spx_word16_t *in, spx_word16_t *out, spx_word16_t bound, int len) { int i, shift; spx_word16_t max_val = 0; for (i=0;imax_val) max_val = in[i]; if (-in[i]>max_val) max_val = -in[i]; } shift=0; while (max_val <= (bound>>1) && max_val != 0) { max_val <<= 1; shift++; } for (i=0;i void *spx_fft_init(int size) { struct drft_lookup *table; table = speex_alloc(sizeof(struct drft_lookup)); spx_drft_init((struct drft_lookup *)table, size); return (void*)table; } void spx_fft_destroy(void *table) { spx_drft_clear(table); speex_free(table); } void spx_fft(void *table, float *in, float *out) { if (in==out) { int i; float scale = 1./((struct drft_lookup *)table)->n; speex_warning("FFT should not be done in-place"); for (i=0;i<((struct drft_lookup *)table)->n;i++) out[i] = scale*in[i]; } else { int i; float scale = 1./((struct drft_lookup *)table)->n; for (i=0;i<((struct drft_lookup *)table)->n;i++) out[i] = scale*in[i]; } spx_drft_forward((struct drft_lookup *)table, out); } void spx_ifft(void *table, float *in, float *out) { if (in==out) { speex_warning("FFT should not be done in-place"); } else { int i; for (i=0;i<((struct drft_lookup *)table)->n;i++) out[i] = in[i]; } spx_drft_backward((struct drft_lookup *)table, out); } #elif defined(USE_INTEL_MKL) #include struct mkl_config { DFTI_DESCRIPTOR_HANDLE desc; int N; }; void *spx_fft_init(int size) { struct mkl_config *table = (struct mkl_config *) speex_alloc(sizeof(struct mkl_config)); table->N = size; DftiCreateDescriptor(&table->desc, DFTI_SINGLE, DFTI_REAL, 1, size); DftiSetValue(table->desc, DFTI_PACKED_FORMAT, DFTI_PACK_FORMAT); DftiSetValue(table->desc, DFTI_PLACEMENT, DFTI_NOT_INPLACE); DftiSetValue(table->desc, DFTI_FORWARD_SCALE, 1.0f / size); DftiCommitDescriptor(table->desc); return table; } void spx_fft_destroy(void *table) { struct mkl_config *t = (struct mkl_config *) table; DftiFreeDescriptor(t->desc); speex_free(table); } void spx_fft(void *table, spx_word16_t *in, spx_word16_t *out) { struct mkl_config *t = (struct mkl_config *) table; DftiComputeForward(t->desc, in, out); } void spx_ifft(void *table, spx_word16_t *in, spx_word16_t *out) { struct mkl_config *t = (struct mkl_config *) table; DftiComputeBackward(t->desc, in, out); } #elif defined(USE_INTEL_IPP) #include struct ipp_fft_config { IppsDFTSpec_R_32f *dftSpec; Ipp8u *buffer; }; void *spx_fft_init(int size) { int bufferSize = 0; int hint; struct ipp_fft_config *table; table = (struct ipp_fft_config *)speex_alloc(sizeof(struct ipp_fft_config)); /* there appears to be no performance difference between ippAlgHintFast and ippAlgHintAccurate when using the with the floating point version of the fft. */ hint = ippAlgHintAccurate; ippsDFTInitAlloc_R_32f(&table->dftSpec, size, IPP_FFT_DIV_FWD_BY_N, hint); ippsDFTGetBufSize_R_32f(table->dftSpec, &bufferSize); table->buffer = ippsMalloc_8u(bufferSize); return table; } void spx_fft_destroy(void *table) { struct ipp_fft_config *t = (struct ipp_fft_config *)table; ippsFree(t->buffer); ippsDFTFree_R_32f(t->dftSpec); speex_free(t); } void spx_fft(void *table, spx_word16_t *in, spx_word16_t *out) { struct ipp_fft_config *t = (struct ipp_fft_config *)table; ippsDFTFwd_RToPack_32f(in, out, t->dftSpec, t->buffer); } void spx_ifft(void *table, spx_word16_t *in, spx_word16_t *out) { struct ipp_fft_config *t = (struct ipp_fft_config *)table; ippsDFTInv_PackToR_32f(in, out, t->dftSpec, t->buffer); } #elif defined(USE_GPL_FFTW3) #include struct fftw_config { float *in; float *out; fftwf_plan fft; fftwf_plan ifft; int N; }; void *spx_fft_init(int size) { struct fftw_config *table = (struct fftw_config *) speex_alloc(sizeof(struct fftw_config)); table->in = fftwf_malloc(sizeof(float) * (size+2)); table->out = fftwf_malloc(sizeof(float) * (size+2)); table->fft = fftwf_plan_dft_r2c_1d(size, table->in, (fftwf_complex *) table->out, FFTW_PATIENT); table->ifft = fftwf_plan_dft_c2r_1d(size, (fftwf_complex *) table->in, table->out, FFTW_PATIENT); table->N = size; return table; } void spx_fft_destroy(void *table) { struct fftw_config *t = (struct fftw_config *) table; fftwf_destroy_plan(t->fft); fftwf_destroy_plan(t->ifft); fftwf_free(t->in); fftwf_free(t->out); speex_free(table); } void spx_fft(void *table, spx_word16_t *in, spx_word16_t *out) { int i; struct fftw_config *t = (struct fftw_config *) table; const int N = t->N; float *iptr = t->in; float *optr = t->out; const float m = 1.0 / N; for(i=0;ifft); out[0] = optr[0]; for(i=1;iN; float *iptr = t->in; float *optr = t->out; iptr[0] = in[0]; iptr[1] = 0.0f; for(i=1;iifft); for(i=0;iforward = kiss_fftr_alloc(size,0,NULL,NULL); table->backward = kiss_fftr_alloc(size,1,NULL,NULL); table->N = size; return table; } void spx_fft_destroy(void *table) { struct kiss_config *t = (struct kiss_config *)table; kiss_fftr_free(t->forward); kiss_fftr_free(t->backward); speex_free(table); } #ifdef FIXED_POINT void spx_fft(void *table, spx_word16_t *in, spx_word16_t *out) { int shift; struct kiss_config *t = (struct kiss_config *)table; shift = maximize_range(in, in, 32000, t->N); kiss_fftr2(t->forward, in, out); renorm_range(in, in, shift, t->N); renorm_range(out, out, shift, t->N); } #else void spx_fft(void *table, spx_word16_t *in, spx_word16_t *out) { int i; float scale; struct kiss_config *t = (struct kiss_config *)table; scale = 1./t->N; kiss_fftr2(t->forward, in, out); for (i=0;iN;i++) out[i] *= scale; } #endif void spx_ifft(void *table, spx_word16_t *in, spx_word16_t *out) { struct kiss_config *t = (struct kiss_config *)table; kiss_fftri2(t->backward, in, out); } #else #error No other FFT implemented #endif #ifdef FIXED_POINT /*#include "smallft.h"*/ void spx_fft_float(void *table, float *in, float *out) { int i; #ifdef USE_SMALLFT int N = ((struct drft_lookup *)table)->n; #elif defined(USE_KISS_FFT) int N = ((struct kiss_config *)table)->N; #else #endif #ifdef VAR_ARRAYS spx_word16_t _in[N]; spx_word16_t _out[N]; #else spx_word16_t _in[MAX_FFT_SIZE]; spx_word16_t _out[MAX_FFT_SIZE]; #endif for (i=0;iN); scale = 1./((struct kiss_config *)table)->N; for (i=0;i<((struct kiss_config *)table)->N;i++) out[i] = scale*in[i]; spx_drft_forward(&t, out); spx_drft_clear(&t); } #endif } void spx_ifft_float(void *table, float *in, float *out) { int i; #ifdef USE_SMALLFT int N = ((struct drft_lookup *)table)->n; #elif defined(USE_KISS_FFT) int N = ((struct kiss_config *)table)->N; #else #endif #ifdef VAR_ARRAYS spx_word16_t _in[N]; spx_word16_t _out[N]; #else spx_word16_t _in[MAX_FFT_SIZE]; spx_word16_t _out[MAX_FFT_SIZE]; #endif for (i=0;iN); for (i=0;i<((struct kiss_config *)table)->N;i++) out[i] = in[i]; spx_drft_backward(&t, out); spx_drft_clear(&t); } #endif } #else void spx_fft_float(void *table, float *in, float *out) { spx_fft(table, in, out); } void spx_ifft_float(void *table, float *in, float *out) { spx_ifft(table, in, out); } #endif mumble-1.3.4/3rdparty/speexdsp-src/libspeexdsp/bfin.h0000664000175000017500000000060714010707343022443 0ustar builderbuilder/* Common Blackfin assembly defines * * Copyright (C) 2005-2009 Analog Devices */ #if __GNUC__ <= 3 /* GCC-3.4 and older did not use hardware loops and thus did not have * register constraints for declaring clobbers. */ # define BFIN_HWLOOP0_REGS # define BFIN_HWLOOP1_REGS #else # define BFIN_HWLOOP0_REGS , "LB0", "LT0", "LC0" # define BFIN_HWLOOP1_REGS , "LB1", "LT1", "LC1" #endif mumble-1.3.4/3rdparty/speexdsp-src/libspeexdsp/buffer.c0000664000175000017500000001123214010707343022765 0ustar builderbuilder/* Copyright (C) 2007 Jean-Marc Valin File: buffer.c This is a very simple ring buffer implementation. It is not thread-safe so you need to do your own locking. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "os_support.h" #include "arch.h" #include "speex/speex_buffer.h" struct SpeexBuffer_ { char *data; int size; int read_ptr; int write_ptr; int available; }; EXPORT SpeexBuffer *speex_buffer_init(int size) { SpeexBuffer *st = speex_alloc(sizeof(SpeexBuffer)); st->data = speex_alloc(size); st->size = size; st->read_ptr = 0; st->write_ptr = 0; st->available = 0; return st; } EXPORT void speex_buffer_destroy(SpeexBuffer *st) { speex_free(st->data); speex_free(st); } EXPORT int speex_buffer_write(SpeexBuffer *st, void *_data, int len) { int end; int end1; char *data = _data; if (len > st->size) { data += len-st->size; len = st->size; } end = st->write_ptr + len; end1 = end; if (end1 > st->size) end1 = st->size; SPEEX_COPY(st->data + st->write_ptr, data, end1 - st->write_ptr); if (end > st->size) { end -= st->size; SPEEX_COPY(st->data, data+end1 - st->write_ptr, end); } st->available += len; if (st->available > st->size) { st->available = st->size; st->read_ptr = st->write_ptr; } st->write_ptr += len; if (st->write_ptr > st->size) st->write_ptr -= st->size; return len; } EXPORT int speex_buffer_writezeros(SpeexBuffer *st, int len) { /* This is almost the same as for speex_buffer_write() but using SPEEX_MEMSET() instead of SPEEX_COPY(). Update accordingly. */ int end; int end1; if (len > st->size) { len = st->size; } end = st->write_ptr + len; end1 = end; if (end1 > st->size) end1 = st->size; SPEEX_MEMSET(st->data + st->write_ptr, 0, end1 - st->write_ptr); if (end > st->size) { end -= st->size; SPEEX_MEMSET(st->data, 0, end); } st->available += len; if (st->available > st->size) { st->available = st->size; st->read_ptr = st->write_ptr; } st->write_ptr += len; if (st->write_ptr > st->size) st->write_ptr -= st->size; return len; } EXPORT int speex_buffer_read(SpeexBuffer *st, void *_data, int len) { int end, end1; char *data = _data; if (len > st->available) { SPEEX_MEMSET(data+st->available, 0, st->size-st->available); len = st->available; } end = st->read_ptr + len; end1 = end; if (end1 > st->size) end1 = st->size; SPEEX_COPY(data, st->data + st->read_ptr, end1 - st->read_ptr); if (end > st->size) { end -= st->size; SPEEX_COPY(data+end1 - st->read_ptr, st->data, end); } st->available -= len; st->read_ptr += len; if (st->read_ptr > st->size) st->read_ptr -= st->size; return len; } EXPORT int speex_buffer_get_available(SpeexBuffer *st) { return st->available; } EXPORT int speex_buffer_resize(SpeexBuffer *st, int len) { int old_len = st->size; if (len > old_len) { st->data = speex_realloc(st->data, len); /* FIXME: move data/pointers properly for growing the buffer */ } else { /* FIXME: move data/pointers properly for shrinking the buffer */ st->data = speex_realloc(st->data, len); } return len; } mumble-1.3.4/3rdparty/speexdsp-src/libspeexdsp/testecho.c0000664000175000017500000000250714010707343023337 0ustar builderbuilder#ifdef HAVE_CONFIG_H #include "config.h" #endif #include "speex/speex_echo.h" #include "speex/speex_preprocess.h" #include #include #include #include #include #define NN 128 #define TAIL 1024 int main(int argc, char **argv) { FILE *echo_fd, *ref_fd, *e_fd; short echo_buf[NN], ref_buf[NN], e_buf[NN]; SpeexEchoState *st; SpeexPreprocessState *den; int sampleRate = 8000; if (argc != 4) { fprintf(stderr, "testecho mic_signal.sw speaker_signal.sw output.sw\n"); exit(1); } echo_fd = fopen(argv[2], "rb"); ref_fd = fopen(argv[1], "rb"); e_fd = fopen(argv[3], "wb"); st = speex_echo_state_init(NN, TAIL); den = speex_preprocess_state_init(NN, sampleRate); speex_echo_ctl(st, SPEEX_ECHO_SET_SAMPLING_RATE, &sampleRate); speex_preprocess_ctl(den, SPEEX_PREPROCESS_SET_ECHO_STATE, st); while (!feof(ref_fd) && !feof(echo_fd)) { fread(ref_buf, sizeof(short), NN, ref_fd); fread(echo_buf, sizeof(short), NN, echo_fd); speex_echo_cancellation(st, ref_buf, echo_buf, e_buf); speex_preprocess_run(den, e_buf); fwrite(e_buf, sizeof(short), NN, e_fd); } speex_echo_state_destroy(st); speex_preprocess_state_destroy(den); fclose(e_fd); fclose(echo_fd); fclose(ref_fd); return 0; } mumble-1.3.4/3rdparty/speexdsp-src/speexdsp.pc.in0000664000175000017500000000055414010707343021617 0ustar builderbuilder# libspeexdsp pkg-config source file prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: speexdsp Description: Speexdsp is a speech processing library that goes along with the Speex codec Version: @PACKAGE_VERSION@ Requires: @FFT_PKGCONFIG@ Conflicts: Libs: -L${libdir} -lspeexdsp Libs.private: @LIBM@ Cflags: -I${includedir} mumble-1.3.4/3rdparty/speexdsp-src/.cvsignore0000664000175000017500000000027114010707343021027 0ustar builderbuilderMakefile Makefile.in Speex.spec aclocal.m4 autom4te.cache config.guess config.log config.status config.sub configure depcomp install-sh libtool ltconfig ltmain.sh missing mkinstalldirs mumble-1.3.4/3rdparty/speexdsp-src/regression-fixes/0000775000175000017500000000000014010707343022323 5ustar builderbuildermumble-1.3.4/3rdparty/speexdsp-src/regression-fixes/1-resampler_unsigned_fix.patch0000664000175000017500000000135614010707343030243 0ustar builderbuilderdiff --git a/libspeex/resample.c b/libspeex/resample.c index 4403f78..48ffcef 100644 --- a/libspeex/resample.c +++ b/libspeex/resample.c @@ -561,10 +561,10 @@ static void update_filter(SpeexResamplerState *st) } for (i=0;iden_rate;i++) { - spx_uint32_t j; + spx_int32_t j; for (j=0;jfilt_len;j++) { - st->sinc_table[i*st->filt_len+j] = sinc(st->cutoff,((j-st->filt_len/2+1)-((float)i)/st->den_rate), st->filt_len, quality_map[st->quality].window_func); + st->sinc_table[i*st->filt_len+j] = sinc(st->cutoff,((j-(spx_int32_t)st->filt_len/2+1)-((float)i)/st->den_rate), st->filt_len, quality_map[st->quality].window_func); } } #ifdef FIXED_POINT mumble-1.3.4/3rdparty/speexdsp-src/README.Trimedia0000664000175000017500000000725014010707343021450 0ustar builderbuilder################# REMOVE warnings on trimedia compiler ############################## ################# Not critical to compilation ############################## 1. Change the following statements to remove warning for constant expression (i) mdf.c [if(0) --> #if 0] (ii) preprocess.c [if(1) --> #if 1] 2. add REMARK_ON macro to remove warning on not reference variable -- uses (void) to remove warning on not referenced variable -- #define REMARK_ON -- (void) -- #endif -- search for REMARK_ON on the following files (i) jitter.c (ii) mdf.c (iii) filterbank.c (iv) preprocess.c 3. commented out the following in pseudofloat.h for unused variable //static const spx_float_t FLOAT_HALF = {16384,-15}; ################# Patches for trimedia compiler ############################## ################# Critical to compilation ############################## -- added the #elif defined (TM_ASM) to the following files for optimized codes (1) arch.h (2) fftwrap.c (3) filterbank.c (4) kiss_fft.c (5) kiss_fftr.c (6) mdf.c (7) preprocess.c -- added macro PREPROCESS_MDF_FLOAT to allow using of floating point -- in mdf and preprocess while keeping fixed point in encoder/decoder -- This is due to the fact that preprocess/mdf run faster on floating -- point on trimedia -- added the following 3 lines to the files below #ifdef PREPROCESS_MDF_FLOAT #undef FIXED_POINT #endif (1) mdf.c (2) preprocess.c (3) filterbank.c (4) fftwrap.c (5) kiss_fft.c (6) kiss_fftr.c -- created a new USE_COMPACT_KISS_FFT for fftwrap.c and shifted defination -- to config file so that user configure the usage of fft on config.h -- TOEXPLORE:is it possible to share table between mdf/preprocess? -- Introducing this macro made the following changes in C code -- New macro to facilitate integration (grouping real/complex for dc and nyquist frequency seems to require a large amount of memory for mdf, therefore did not made the changes for that) (1) modify preprocess.c on init and destroy (2) modify mdf.c on init and destroy (3) shifted power_spectrum to fftwrap.c to share optimised code between preprocess.c and mdf.c ################# NOTES ############################## (1) fixed point encoding/decoding is tested on narrowband - some of the QX fractions are packed together to (frac1 * a + frac2 * a) >> X (should be more accurate in rounding) instead of ((frac1 * a) >> X) + ((frac2 * a) >> X) will cause some different between optimized and unoptimized code. tried decoding/encoding optimized code on some audio files retains the clearity of the word - wideband/ultrawideband is not heavily tested yet (2) optimized fixed point code requires memory alignment - used config to debug on functions where memory is not align (3) floating point optimization for preprocess/mdf is tested fixed point is not tested yet (except fft/filterbank) Note (1) also applies to sround in fft for fixed point some optimization is provided for fixed point as it requires lesser memory compared to floating point. (4) unroll configurations provided to reduce code size if required (5) use profile options only if compiler profiling fails to work (6) can't include the makefile as it is close proprietary ################# TODO:For Trimedia ############################## (1) Optimizations for fixed point in mdf/preprocess ################# Added Files ############################## - _kiss_fft_guts_tm.h - fftwrap_tm.h - filterbank_tm.h - filters_tm.h - fixed_tm.h - kiss_fft_tm.h - kiss_fftr_tm.h - mdf_tm.h - misc_tm.h - preprocess_tm.h - config.h - speex_config_types.h mumble-1.3.4/3rdparty/speexdsp-src/COPYING0000664000175000017500000000335614010707343020071 0ustar builderbuilderCopyright 2002-2008 Xiph.org Foundation Copyright 2002-2008 Jean-Marc Valin Copyright 2005-2007 Analog Devices Inc. Copyright 2005-2008 Commonwealth Scientific and Industrial Research Organisation (CSIRO) Copyright 1993, 2002, 2006 David Rowe Copyright 2003 EpicGames Copyright 1992-1994 Jutta Degener, Carsten Bormann Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. mumble-1.3.4/3rdparty/speexdsp-src/INSTALL0000664000175000017500000000031014010707343020052 0ustar builderbuilderInstalling SpeexDSP is as easy as: % ./configure [--prefix=] % make % make install Note that if you are using the code from git you will need to run "autogen.sh" and then "configure". mumble-1.3.4/3rdparty/speexdsp-src/html/0000775000175000017500000000000014010707343017773 5ustar builderbuildermumble-1.3.4/3rdparty/speexdsp-src/html/speex.png0000664000175000017500000001056614010707343021635 0ustar builderbuilderPNG  IHDRWF*bKGD pHYs  ~tIME@VIDATx]}lUE?, hPl HBX>!#6fAb5uY|li *A>dE,n*6]!A$H,bA,"Yu{s̛9woΜ93^̵Q%[Tuqpb@ rC@ -rȦfWY.up0E#$ɺ<Ә"~cup0#vp1CO4r-c98e\*6p@b/m `88d7p>CFPkr\C0q lc&WDIx;VϿ.5 yubD] 1jT3vQAcŠ>x\-l"We|:9\ ȒAeuё.lLF;-hmN%ڂ ΂ۂ'bxֶ f6dSG up'4.~kjQN<ąmVV>xnS] "j QV Iʬ\ZFoSr"e*kd^b6@rb(/vų!-xb7xWRʦWՉDNAH{ # RB֏2RrH%[rgVYCϓ.lNl㊟U2}c! r|e[f,ZTq_ݬ32VGPm(U:G}Q ÷A6X c"lUE$wA֑ '.l`oivvPfAO19lAy{ 7O\ٽ2b `uB|,1e;dDFzCFn"+S`5kCfy!jq Dݼ Jlg:K]0]Vïtjrk"d$H2d=JKWܺDNG57+&1O57@+x,# UVҦ*;}1Qhw:*yY#{mH $xo)$^+{@] &"m^xhxw)is m`T 6h{饗iɋc"57N:Uz?9Bt(UVV͟ΞݮJ0`""4Bu0-"}mH Q׮OH'" .\/Q.X,X oVHW/thlhooX,vG9sWfbMM˗HnM&zjb.M_|OD[NuuuŠf5kaE䮮&{JO> `ԨQuWJAݛ| C "QL ޚXH(tIQ(AkI'/廔޽{=i2r֭4s[cC|+++}W^^NttgJ4v?Y)n t^Է/HB~ ܻiSQA?l>]dvgw:N3gzDΛ'pK.\`jZlŎmh@?x0ë rM~VF[Rr3B#"DOGv3H};ϑẗ́# B4tM)+󲢢`z\x@<' /Zh'㭌"#?o>}B'TWEƪib\ֶ`)ϡ-sϞ)O{yp2? a #GY!ăJK dZ[FLNGHY87 7=p"ajU:ӢE?g{/gټpҤmNC:q"~&Ggvh yb/7j-aΥZS2UOS?p@YT^Ņ{H ]\>QiBo[(^!54xtLGG/ hje_7x IEmm )"c&<"Wq3p= G 4Lݏ~t--bGBHF[O>,|'Ci|ٲg@ZhZ^#6 qʔjl$翌 uuur]<}"@KK 5*$g}p=xdBġJ>9"]/س'{օLB ٳ***D֯j8 ep/YPPn|$]X jmGz+q/:uj">d̙HCLfҥ۶j?/&v?*oذ!!3a„򛚚|u1bDBfHǞ=CLJ@&s…Dzaa,)r T2aIBԣG6c ,ZBS%Zn[ жmY]fa9n<eܪGܔ qI heu#=2y$bUI @ oS5v :Mߥ#Jӿg!*gD_wNdG5pEW&:atA\oH[)VC+ү'27e*KQ9{p;Md6*dˬQϒDv 0.񴕚&I$w*Dvp\h<&>o$iA;CF-Ay[2S"z"XqyՊ~OI&(Cn%Rz \|jb"?qNu(+!\ /D{;.8ON+=}F`|y d"/mB*YCN,]iD vܽ#LT D)u+9 %aGW|#%8J%2Z]:[ dVO!IVFDhȿO e> 6/FD5DY%]S7;!|a!]pMK2F"̀|&6x lz"8G|Kdrw y,('!½9lK|p _I݉t!J,( 1tAɣ7@ՂfA)+ ܂2W{Xl"R]CXòUL@ TA D(P5@Npy^/"_D c.({ŕRQ"&X?s aqw,&sOme8 u$\F[.M-9CsGd%. ,("&b(8DAEY\Y@LĺV62Kb"}_C]FBWs:C 5JBzY$P"S %iP`b"!H-QF_BNs5iAW/ӛYwM. lPIENDB`mumble-1.3.4/3rdparty/speexdsp-src/html/speex.webprj0000664000175000017500000000027314010707343022334 0ustar builderbuilder mumble-1.3.4/3rdparty/speexdsp-src/html/speex.xcf0000664000175000017500000006045714010707343021635 0ustar builderbuildergimp xcf fileBB/ gimp-commentCreated with The GIMPm&9+Kc^Speex     TtIUa 0@PV H  )9 q=======88UU6qU20U 8.Uq-8-+88+U U+8 ,;::U8 q 88  Uqq U88U8U qq8U8 8qUqU qq 8   q  UUU UU 8UU 8 U8UU  qU   U88 q8 U8  qU UUU qUU88UqU UUU⪪qU UUqqUU88Uq8UUq88 U88qUUUUU8UU8q88q qq8q U88 UqU U q7878798UUqU4<q;U;:8q997q64UU3 ƪ0U 258UqU  U8q UUU8UU U U  q U  qU UUU q UUU q UU  UU  8q 8U UqU U q 8U Uq qq8q8UU88qU88qU 8"ƍ8888qU88888qq888988q7U4ƪqU, 8,8U U^UUU8UUUU UU UUU  U U8U 8Uq8UqUUUUUq8UU 88 U8 U8 qUUqU8+ q88888q9q8U8U8U88;8 HU<UU:87UU3⪪84U6U8 `@0 Bottom     0&&& ,<L\lY$&f&v&&&&& !"$' !"$' !"$' ( ( !"$' !"$' !"$' ( ( !"$' !"$' !"$' ( ( !"$' !"$' !"$i((+++((,,,(i((+++((,,,($$$$$$$$$$$$$$$$$%'(*,-/023578:;=>@BCEFHIKMNPQSTVXY[\^`acdfgiklnoqrtvwyz|}%'(*,-/023578:;=>@BCEFHIKMNPQSTVXY[\^`acdfgiklnoqrtvwyz|}%'(*,-/023578:;=>@BCEFHIKMNPQSTVXY[\^`acdfgiklnoqrtvwyz|}%'23578:;CEFQST`alnoqr|}%'23578:;EFST`alnoq%',-/023578:>@FKMNTY[\^`afgiklnovwyʁ%',-/023578:>@BCEFKMNPTY[\^`afgiklntvwyz|%',-/023578:@BCEFKMNPTY[\^`afgiklnrtvwyz|}%'23578:;CEFT`alnrtvwyz|}%'23578:;=EFQST`alnrtvwyz|}%',-/023578:;=>@FKMNPQSTY[\^`afgiklnrtvwyz|}%',-/023578:;=>@BFKMNPQSTY[\^`afgiklntvwyz|}%',-/023578:>@FKMNPQSTY[\^`afgiklnovwyz%'23578:EFKMNPQST`alnoq%'23578:;CEFKMNPQST`alnoqr|}%'(*,-/023578:;=>@BCEFHIKMNPQSTVXY[\^`acdfgiklnoqrtvwyz|}%'(*,-/023578:;=>@BCEFHIKMNPQSTVXY[\^`acdfgiklnoqrtvwyz|}%'(*,-/023578:;=>@BCEFHIKMNPQSTVXY[\^`acdfgiklnoqrtvwyz|}B         B         Ί튌튌튌튌튌ﱳΐ͐ﱳ튌튌튌튌B    B    ///////// / ///////0A97675568A97675568/////////////////0`@0  Signal#2     ~''999(+(;(K([(k({((((((((-368888888%$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%$$$$$$$$$$$$ # # # #%$$$$$$ $  $  $ $ $$$$$$$$%$$$$$$$$$$$$ # # # #%$$$$$$ $  $  $ $ $$$$$$$$v<=9111$#-///0124== y'LVy&JLV`wy%GJLTV`wy{$GNTV`bow{"7ENTV^`bow{ %-59CNRX^bloquw{ '+/159CNRX^blqu{)3;APRX^bdjqu{;?PX^dhjqu{}=PX^dfqsu} X\^s}+X\s}+X\;X\;X\ spxGlobalHeapEnd ) { #ifdef VERBOSE_ALLOC fprintf (stderr, "insufficient space for persistent alloc request %d bytes\n", size); #endif return 0; } #ifdef VERBOSE_ALLOC fprintf (stderr, "Persist Allocated %d chars at %x, %d remaining\n", size, ptr, ((int)spxGlobalHeapEnd - (int)spxGlobalHeapPtr)); #endif memset(ptr, 0, size); return ptr; } #define OVERRIDE_SPEEX_ALLOC_SCRATCH static inline void *speex_alloc_scratch (int size) { void *ptr; ptr = (void *) (((int)spxGlobalScratchPtr + BLOCK_MASK) & ~BLOCK_MASK); //Start on 8 boundary spxGlobalScratchPtr = (char *)((int)ptr + size); // Update pointer to next free location if (spxGlobalScratchPtr > spxGlobalScratchEnd ) { #ifdef VERBOSE_ALLOC fprintf (stderr, "insufficient space for scratch alloc request %d bytes\n", size); #endif return 0; } #ifdef VERBOSE_ALLOC fprintf (stderr, "Scratch Allocated %d chars at %x, %d remaining\n", size, ptr, ((int)spxGlobalScratchEnd - (int)spxGlobalScratchPtr)); #endif memset(ptr, 0, size); return ptr; } #define OVERRIDE_SPEEX_REALLOC static inline void *speex_realloc (void *ptr, int size) { #ifdef VERBOSE_ALLOC speex_warning("realloc attempted, not allowed"); #endif return 0; } #define OVERRIDE_SPEEX_FREE static inline void speex_free (void *ptr) { #ifdef VERBOSE_ALLOC speex_warning("at speex_free"); #endif } #define OVERRIDE_SPEEX_FREE_SCRATCH static inline void speex_free_scratch (void *ptr) { #ifdef VERBOSE_ALLOC speex_warning("at speex_free_scratch"); #endif } #endif /* !MANUAL_ALLOC */ mumble-1.3.4/3rdparty/speexdsp-src/ti/speex_C64_test/0000775000175000017500000000000014010707343022242 5ustar builderbuildermumble-1.3.4/3rdparty/speexdsp-src/ti/speex_C64_test/speex_C64_test.pjt0000664000175000017500000000262314010707343025563 0ustar builderbuilder; Code Composer Project File, Version 2.0 (do not modify or remove this line) [Project Settings] ProjectDir="C:\Speex\speex_14274\ti\speex_C64_test\" ProjectType=Executable CPUFamily=TMS320C64XX Tool="Compiler" Tool="CustomBuilder" Tool="DspBiosBuilder" Tool="Linker" Config="Debug" Config="Release" [Source Files] Source="..\..\..\..\CCStudio_v3.1\C6000\cgtools\lib\rts6400.lib" Source="..\..\libspeexdsp\buffer.c" Source="..\..\libspeexdsp\fftwrap.c" Source="..\..\libspeexdsp\filterbank.c" Source="..\..\libspeexdsp\jitter.c" Source="..\..\libspeexdsp\kiss_fft.c" Source="..\..\libspeexdsp\kiss_fftr.c" Source="..\..\libspeexdsp\mdf.c" Source="..\..\libspeexdsp\preprocess.c" Source="..\..\libspeexdsp\resample.c" Source="..\..\libspeexdsp\scal.c" Source="speex_C64_test.cmd" ["Compiler" Settings: "Debug"] Options=-g -o3 -fr"$(Proj_dir)\Debug" -i"..\ti" -i"..\include" -d"_DEBUG" -d"CONFIG_TI_C6X" -d"HAVE_CONFIG_H" -mv6400 ["Compiler" Settings: "Release"] Options=-o3 -fr"$(Proj_dir)\Release" -i"..\ti" -i"..\include" -d"HAVE_CONFIG_H" -mv6400 ["DspBiosBuilder" Settings: "Debug"] Options=-v6x ["DspBiosBuilder" Settings: "Release"] Options=-v6x ["Linker" Settings: "Debug"] Options=-c -m".\Debug\speex_C64_test.map" -o".\Debug\speex_C64_test.out" -w -x ["Linker" Settings: "Release"] Options=-c -m".\Release\speex_C64_test.map" -o".\Release\speex_C64_test.out" -w -x mumble-1.3.4/3rdparty/speexdsp-src/ti/speex_C64_test/Makefile.am0000664000175000017500000000036414010707343024301 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies EXTRA_DIST = speex_C64_test.cmd speex_C64_test.pjt mumble-1.3.4/3rdparty/speexdsp-src/ti/speex_C64_test/speex_C64_test.cmd0000664000175000017500000000426714010707343025537 0ustar builderbuilder/* Copyright (C) 2005 Psi Systems, Inc. File: speex_C64_test.cmd Linker command file with memory allocation for TI TMS320C6415 processor for use with TI Code Composer (TM) DSP development tools. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -stack 0x10000 -heap 0x10000 MEMORY { VECRAM : origin = 0x0, len = 0x200 IPRAM : origin = 0x200, len = 0x40000 IDRAM : origin = 0x80000, len = 0x70000 } SECTIONS { .vectors > VECRAM .text > IPRAM .bss > IDRAM .cinit > IDRAM .const > IDRAM .far > IDRAM .stack > IDRAM .cio > IDRAM .sysmem > IDRAM .switch > IDRAM .myheap > IDRAM } mumble-1.3.4/3rdparty/speexdsp-src/ti/speex_C55_test/0000775000175000017500000000000014010707343022242 5ustar builderbuildermumble-1.3.4/3rdparty/speexdsp-src/ti/speex_C55_test/speex_C55_test.cmd0000664000175000017500000000475214010707343025536 0ustar builderbuilder/* Copyright (C) 2005 Psi Systems, Inc. File: speex_C55_test.cmd Linker command file with memory allocation for TI TMS320VC5509A processor for use with TI Code Composer (TM) DSP development tools. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -c -stack 0x1c00 -heap 0x1000 /* If private memory allocation is used for Speex */ /*-heap 0x6000 / * If calloc is used for Speex */ -sysstack 0x200 -lrts55.lib MEMORY { DARAM: origin = 0x200, len = 0x7e00 DARAM_B: origin = 0x8000, len = 0x8000 VECT: origin = 0x100, len = 0x100 SARAM_A: origin = 0x10000, len = 0x10000 SARAM_B: origin = 0x20000, len = 0x20000 } SECTIONS { .vectors: {} > VECT .bootmem: {} > DARAM .text: {} > SARAM_B .cinit: {} > SARAM_B .switch: {} > SARAM_B .bss: {} > DARAM /* .far: {} > DARAM*/ .const: {} > DARAM .sysmem: {} > DARAM_B .cio: {} > DARAM .stack: {} > DARAM .sysstack: {} > DARAM .myheap: {} > SARAM_A } mumble-1.3.4/3rdparty/speexdsp-src/ti/speex_C55_test/speex_C55_test.pjt0000664000175000017500000000257314010707343025567 0ustar builderbuilder; Code Composer Project File, Version 2.0 (do not modify or remove this line) [Project Settings] ProjectDir="C:\Speex\speex_14274\ti\speex_C55_test\" ProjectType=Executable CPUFamily=TMS320C55XX Tool="Compiler" Tool="CustomBuilder" Tool="DspBiosBuilder" Tool="Linker" Config="Debug" Config="Release" [Source Files] Source="..\..\libspeexdsp\buffer.c" Source="..\..\libspeexdsp\fftwrap.c" Source="..\..\libspeexdsp\filterbank.c" Source="..\..\libspeexdsp\jitter.c" Source="..\..\libspeexdsp\kiss_fft.c" Source="..\..\libspeexdsp\kiss_fftr.c" Source="..\..\libspeexdsp\mdf.c" Source="..\..\libspeexdsp\preprocess.c" Source="..\..\libspeexdsp\resample.c" Source="..\..\libspeexdsp\scal.c" Source="speex_C55_test.cmd" ["Compiler" Settings: "Debug"] Options=-g -q -o3 -fr"..\ti\speex_C55_test\Debug" -i"..\ti" -i"..\include" -d"_DEBUG" -d"CONFIG_TI_C55X" -d"HAVE_CONFIG_H" -mn ["Compiler" Settings: "Release"] Options=-q -o2 -fr"..\ti\speex_C55_test\Release" -i"..\ti" -i"..\include" -d"CONFIG_TI_C55X" -d"HAVE_CONFIG_H" -mn ["DspBiosBuilder" Settings: "Debug"] Options=-v55 ["DspBiosBuilder" Settings: "Release"] Options=-v55 ["Linker" Settings: "Debug"] Options=-q -c -m".\Debug\speex_C55_test.map" -o".\Debug\speex_C55_test.out" -w -x ["Linker" Settings: "Release"] Options=-q -c -m".\Release\speex_C55_test.map" -o".\Release\speex_C55_test.out" -w -x mumble-1.3.4/3rdparty/speexdsp-src/ti/speex_C55_test/Makefile.am0000664000175000017500000000036414010707343024301 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies EXTRA_DIST = speex_C55_test.cmd speex_C55_test.pjt mumble-1.3.4/3rdparty/speexdsp-src/ti/speex_C54_test/0000775000175000017500000000000014010707343022241 5ustar builderbuildermumble-1.3.4/3rdparty/speexdsp-src/ti/speex_C54_test/speex_C54_test.pjt0000664000175000017500000000267014010707343025563 0ustar builderbuilder; Code Composer Project File, Version 2.0 (do not modify or remove this line) [Project Settings] ProjectDir="C:\Speex\speex_14274\ti\speex_C54_test\" ProjectType=Executable CPUFamily=TMS320C54XX Tool="Compiler" Tool="CustomBuilder" Tool="DspBiosBuilder" Tool="Linker" Config="Debug" Config="Release" [Source Files] Source="..\..\libspeexdsp\buffer.c" Source="..\..\libspeexdsp\fftwrap.c" Source="..\..\libspeexdsp\filterbank.c" Source="..\..\libspeexdsp\jitter.c" Source="..\..\libspeexdsp\kiss_fft.c" Source="..\..\libspeexdsp\kiss_fftr.c" Source="..\..\libspeexdsp\mdf.c" Source="..\..\libspeexdsp\preprocess.c" Source="..\..\libspeexdsp\resample.c" Source="..\..\libspeexdsp\scal.c" Source="speex_C54_test.cmd" ["Compiler" Settings: "Debug"] Options=-g -q -o3 -fr"..\ti\speex_C54_test\Debug" -i"..\ti" -i"..\include" -d"_DEBUG" -d"CONFIG_TI_C54X" -d"HAVE_CONFIG_H" -d"NO_LONGLONG" -mf -ms ["Compiler" Settings: "Release"] Options=-q -o2 -fr"..\ti\speex_C54_test\Release" -i"..\ti" -i"..\include" -d"CONFIG_TI_C54X" -d"HAVE_CONFIG_H" -d"NO_LONGLONG" -mf -ms ["DspBiosBuilder" Settings: "Debug"] Options=-v54 ["DspBiosBuilder" Settings: "Release"] Options=-v54 ["Linker" Settings: "Debug"] Options=-q -c -heap4096 -m".\Debug\speex_C54_test.map" -o".\Debug\speex_C54_test.out" -stack4096 -w -x ["Linker" Settings: "Release"] Options=-q -c -m".\Release\speex_C54_test.map" -o".\Release\speex_C54_test.out" -w -x mumble-1.3.4/3rdparty/speexdsp-src/ti/speex_C54_test/speex_C54_test.cmd0000664000175000017500000000611514010707343025527 0ustar builderbuilder/* Copyright (C) 2005 Psi Systems, Inc. File: speex_C54_test.cmd Linker command file with memory allocation for TI TMS320VC5416 processor for use with TI Code Composer (TM) DSP development tools. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -c -stack 0x2000 -heap 0x1000 /* If private memory allocation is used for Speex */ /*-heap 0x6000 /* If calloc is used for Speex */ -lrts_ext.lib MEMORY { /* PAGE 0: P_DARAM03: origin = 0x80, len = 0x7f00*/ PAGE 0: P_DARAM03: origin = 0x5000, len = 0x2f80 PAGE 0: VECT: origin = 0x7f80, len = 0x80 PAGE 0: P_DARAM47: origin = 0x18000, len = 0x8000 PAGE 0: SARAM03: origin = 0x28000, len = 0x8000 PAGE 0: SARAM47: origin = 0x38000, len = 0x8000 PAGE 1: USERREGS: origin = 0x60, len = 0x1a PAGE 1: BIOSREGS: origin = 0x7c, len = 0x4 PAGE 1: CSLREGS: origin = 0x7a, len = 0x2 D_DARAM03: origin = 0x80, len = 0x4f80 D_DARAM47: origin = 0x8000, len = 0x8000 } SECTIONS { .vectors: {} > VECT PAGE 0 .bootmem: {rts_ext.lib (.text)} > P_DARAM03 PAGE 0 /* .bootmem: {} > P_DARAM03 PAGE 0 */ .text: {} > SARAM03 PAGE 0 .cinit: {} > SARAM03 PAGE 0 .switch: {} > SARAM03 PAGE 0 .bss: {} > D_DARAM03 | D_DARAM47 PAGE 1 .far: {} > D_DARAM03 | D_DARAM47 PAGE 1 .const: {} > D_DARAM03 | D_DARAM47 PAGE 1 .sysmem: {} > D_DARAM47 PAGE 1 .cio: {} > D_DARAM03 | D_DARAM47 PAGE 1 .stack: {} > D_DARAM03 | D_DARAM47 PAGE 1 .myheap: {} > D_DARAM47 PAGE 1 } mumble-1.3.4/3rdparty/speexdsp-src/ti/speex_C54_test/Makefile.am0000664000175000017500000000036614010707343024302 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies EXTRA_DIST = speex_C54_test.cmd speex_C54_test.pjt mumble-1.3.4/3rdparty/speexdsp-src/ti/Makefile.am0000664000175000017500000000044314010707343021500 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies SUBDIRS = speex_C54_test speex_C55_test speex_C64_test EXTRA_DIST = config.h os_support_custom.h mumble-1.3.4/3rdparty/speexdsp-src/ti/config.h0000664000175000017500000000614014010707343021062 0ustar builderbuilder/* Copyright (C) 2005 Psi Systems, Inc. File: config.h Main Speex option include file for TI C64xx, C54xx and C55xx processors for use with TI Code Composer (TM) DSP development tools. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #define FIXED_POINT #define FRAME_SIZE 160 #define DISABLE_WIDEBAND #define EXPORT /* Disable DC block if doing SNR testing */ #define DISABLE_HIGHPASS /* Allow for 2 20ms narrowband blocks per frame, plus a couple of bytes */ #define MAX_CHARS_PER_FRAME (42/BYTES_PER_CHAR) /* for debug */ #undef DECODE_ONLY #define VERBOSE_ALLOC /* EITHER Allocate from fixed array (C heap not used) */ /* Enable VERBOSE_ALLOC to see how much is used */ #define MANUAL_ALLOC #define OS_SUPPORT_CUSTOM /* OR Use CALLOC (heap size must be increased in linker command file) */ //#undef MANUAL_ALLOC //#undef OS_SUPPORT_CUSTOM #if defined (CONFIG_TI_C54X) || defined (CONFIG_TI_C55X) //#define PRECISION16 // These values determined by analysis for 8kbps narrowband #define SPEEXENC_PERSIST_STACK_SIZE 1000 #define SPEEXENC_SCRATCH_STACK_SIZE 3000 #define SPEEXDEC_PERSIST_STACK_SIZE 1000 #define SPEEXDEC_SCRATCH_STACK_SIZE 1000 #else /* C6X */ #define NO_LONGLONG #define SPEEXENC_PERSIST_STACK_SIZE 2000 #define SPEEXENC_SCRATCH_STACK_SIZE 6000 #define SPEEXDEC_PERSIST_STACK_SIZE 2000 #define SPEEXDEC_SCRATCH_STACK_SIZE 2000 #endif #define SPEEX_PERSIST_STACK_SIZE (SPEEXENC_PERSIST_STACK_SIZE + SPEEXDEC_PERSIST_STACK_SIZE) #define SPEEX_SCRATCH_STACK_SIZE SPEEXENC_SCRATCH_STACK_SIZE #define NB_ENC_STACK SPEEXENC_SCRATCH_STACK_SIZE #define NB_DEC_STACK SPEEXDEC_SCRATCH_STACK_SIZE mumble-1.3.4/3rdparty/speexdsp-src/include/0000775000175000017500000000000014010707343020452 5ustar builderbuildermumble-1.3.4/3rdparty/speexdsp-src/include/Makefile.am0000664000175000017500000000002114010707343022477 0ustar builderbuilder SUBDIRS = speex mumble-1.3.4/3rdparty/speexdsp-src/include/speex/0000775000175000017500000000000014010707343021576 5ustar builderbuildermumble-1.3.4/3rdparty/speexdsp-src/include/speex/speex_jitter.h0000664000175000017500000001602414010707343024457 0ustar builderbuilder/* Copyright (C) 2002 Jean-Marc Valin */ /** @file speex_jitter.h @brief Adaptive jitter buffer for Speex */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef SPEEX_JITTER_H #define SPEEX_JITTER_H /** @defgroup JitterBuffer JitterBuffer: Adaptive jitter buffer * This is the jitter buffer that reorders UDP/RTP packets and adjusts the buffer size * to maintain good quality and low latency. * @{ */ #include "speexdsp_types.h" #ifdef __cplusplus extern "C" { #endif /** Generic adaptive jitter buffer state */ struct JitterBuffer_; /** Generic adaptive jitter buffer state */ typedef struct JitterBuffer_ JitterBuffer; /** Definition of an incoming packet */ typedef struct _JitterBufferPacket JitterBufferPacket; /** Definition of an incoming packet */ struct _JitterBufferPacket { char *data; /**< Data bytes contained in the packet */ spx_uint32_t len; /**< Length of the packet in bytes */ spx_uint32_t timestamp; /**< Timestamp for the packet */ spx_uint32_t span; /**< Time covered by the packet (same units as timestamp) */ spx_uint16_t sequence; /**< RTP Sequence number if available (0 otherwise) */ spx_uint32_t user_data; /**< Put whatever data you like here (it's ignored by the jitter buffer) */ }; /** Packet has been retrieved */ #define JITTER_BUFFER_OK 0 /** Packet is lost or is late */ #define JITTER_BUFFER_MISSING 1 /** A "fake" packet is meant to be inserted here to increase buffering */ #define JITTER_BUFFER_INSERTION 2 /** There was an error in the jitter buffer */ #define JITTER_BUFFER_INTERNAL_ERROR -1 /** Invalid argument */ #define JITTER_BUFFER_BAD_ARGUMENT -2 /** Set minimum amount of extra buffering required (margin) */ #define JITTER_BUFFER_SET_MARGIN 0 /** Get minimum amount of extra buffering required (margin) */ #define JITTER_BUFFER_GET_MARGIN 1 /* JITTER_BUFFER_SET_AVAILABLE_COUNT wouldn't make sense */ /** Get the amount of available packets currently buffered */ #define JITTER_BUFFER_GET_AVAILABLE_COUNT 3 /** Included because of an early misspelling (will remove in next release) */ #define JITTER_BUFFER_GET_AVALIABLE_COUNT 3 /** Assign a function to destroy unused packet. When setting that, the jitter buffer no longer copies packet data. */ #define JITTER_BUFFER_SET_DESTROY_CALLBACK 4 /** */ #define JITTER_BUFFER_GET_DESTROY_CALLBACK 5 /** Tell the jitter buffer to only adjust the delay in multiples of the step parameter provided */ #define JITTER_BUFFER_SET_DELAY_STEP 6 /** */ #define JITTER_BUFFER_GET_DELAY_STEP 7 /** Tell the jitter buffer to only do concealment in multiples of the size parameter provided */ #define JITTER_BUFFER_SET_CONCEALMENT_SIZE 8 #define JITTER_BUFFER_GET_CONCEALMENT_SIZE 9 /** Absolute max amount of loss that can be tolerated regardless of the delay. Typical loss should be half of that or less. */ #define JITTER_BUFFER_SET_MAX_LATE_RATE 10 #define JITTER_BUFFER_GET_MAX_LATE_RATE 11 /** Equivalent cost of one percent late packet in timestamp units */ #define JITTER_BUFFER_SET_LATE_COST 12 #define JITTER_BUFFER_GET_LATE_COST 13 /** Initialises jitter buffer * * @param step_size Starting value for the size of concleanment packets and delay adjustment steps. Can be changed at any time using JITTER_BUFFER_SET_DELAY_STEP and JITTER_BUFFER_GET_CONCEALMENT_SIZE. * @return Newly created jitter buffer state */ JitterBuffer *jitter_buffer_init(int step_size); /** Restores jitter buffer to its original state * * @param jitter Jitter buffer state */ void jitter_buffer_reset(JitterBuffer *jitter); /** Destroys jitter buffer * * @param jitter Jitter buffer state */ void jitter_buffer_destroy(JitterBuffer *jitter); /** Put one packet into the jitter buffer * * @param jitter Jitter buffer state * @param packet Incoming packet */ void jitter_buffer_put(JitterBuffer *jitter, const JitterBufferPacket *packet); /** Get one packet from the jitter buffer * * @param jitter Jitter buffer state * @param packet Returned packet * @param desired_span Number of samples (or units) we wish to get from the buffer (no guarantee) * @param current_timestamp Timestamp for the returned packet */ int jitter_buffer_get(JitterBuffer *jitter, JitterBufferPacket *packet, spx_int32_t desired_span, spx_int32_t *start_offset); /** Used right after jitter_buffer_get() to obtain another packet that would have the same timestamp. * This is mainly useful for media where a single "frame" can be split into several packets. * * @param jitter Jitter buffer state * @param packet Returned packet */ int jitter_buffer_get_another(JitterBuffer *jitter, JitterBufferPacket *packet); /** Get pointer timestamp of jitter buffer * * @param jitter Jitter buffer state */ int jitter_buffer_get_pointer_timestamp(JitterBuffer *jitter); /** Advance by one tick * * @param jitter Jitter buffer state */ void jitter_buffer_tick(JitterBuffer *jitter); /** Telling the jitter buffer about the remaining data in the application buffer * @param jitter Jitter buffer state * @param rem Amount of data buffered by the application (timestamp units) */ void jitter_buffer_remaining_span(JitterBuffer *jitter, spx_uint32_t rem); /** Used like the ioctl function to control the jitter buffer parameters * * @param jitter Jitter buffer state * @param request ioctl-type request (one of the JITTER_BUFFER_* macros) * @param ptr Data exchanged to-from function * @return 0 if no error, -1 if request in unknown */ int jitter_buffer_ctl(JitterBuffer *jitter, int request, void *ptr); int jitter_buffer_update_delay(JitterBuffer *jitter, JitterBufferPacket *packet, spx_int32_t *start_offset); /* @} */ #ifdef __cplusplus } #endif #endif mumble-1.3.4/3rdparty/speexdsp-src/include/speex/speex_resampler.h0000664000175000017500000003447014010707343025155 0ustar builderbuilder/* Copyright (C) 2007 Jean-Marc Valin File: speex_resampler.h Resampling code The design goals of this code are: - Very fast algorithm - Low memory requirement - Good *perceptual* quality (and not best SNR) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef SPEEX_RESAMPLER_H #define SPEEX_RESAMPLER_H #ifdef OUTSIDE_SPEEX /********* WARNING: MENTAL SANITY ENDS HERE *************/ /* If the resampler is defined outside of Speex, we change the symbol names so that there won't be any clash if linking with Speex later on. */ /* #define RANDOM_PREFIX your software name here */ #ifndef RANDOM_PREFIX #error "Please define RANDOM_PREFIX (above) to something specific to your project to prevent symbol name clashes" #endif #define CAT_PREFIX2(a,b) a ## b #define CAT_PREFIX(a,b) CAT_PREFIX2(a, b) #define speex_resampler_init CAT_PREFIX(RANDOM_PREFIX,_resampler_init) #define speex_resampler_init_frac CAT_PREFIX(RANDOM_PREFIX,_resampler_init_frac) #define speex_resampler_destroy CAT_PREFIX(RANDOM_PREFIX,_resampler_destroy) #define speex_resampler_process_float CAT_PREFIX(RANDOM_PREFIX,_resampler_process_float) #define speex_resampler_process_int CAT_PREFIX(RANDOM_PREFIX,_resampler_process_int) #define speex_resampler_process_interleaved_float CAT_PREFIX(RANDOM_PREFIX,_resampler_process_interleaved_float) #define speex_resampler_process_interleaved_int CAT_PREFIX(RANDOM_PREFIX,_resampler_process_interleaved_int) #define speex_resampler_set_rate CAT_PREFIX(RANDOM_PREFIX,_resampler_set_rate) #define speex_resampler_get_rate CAT_PREFIX(RANDOM_PREFIX,_resampler_get_rate) #define speex_resampler_set_rate_frac CAT_PREFIX(RANDOM_PREFIX,_resampler_set_rate_frac) #define speex_resampler_get_ratio CAT_PREFIX(RANDOM_PREFIX,_resampler_get_ratio) #define speex_resampler_set_quality CAT_PREFIX(RANDOM_PREFIX,_resampler_set_quality) #define speex_resampler_get_quality CAT_PREFIX(RANDOM_PREFIX,_resampler_get_quality) #define speex_resampler_set_input_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_set_input_stride) #define speex_resampler_get_input_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_get_input_stride) #define speex_resampler_set_output_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_set_output_stride) #define speex_resampler_get_output_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_get_output_stride) #define speex_resampler_get_input_latency CAT_PREFIX(RANDOM_PREFIX,_resampler_get_input_latency) #define speex_resampler_get_output_latency CAT_PREFIX(RANDOM_PREFIX,_resampler_get_output_latency) #define speex_resampler_skip_zeros CAT_PREFIX(RANDOM_PREFIX,_resampler_skip_zeros) #define speex_resampler_reset_mem CAT_PREFIX(RANDOM_PREFIX,_resampler_reset_mem) #define speex_resampler_strerror CAT_PREFIX(RANDOM_PREFIX,_resampler_strerror) #define spx_int16_t short #define spx_int32_t int #define spx_uint16_t unsigned short #define spx_uint32_t unsigned int #else /* OUTSIDE_SPEEX */ #include "speexdsp_types.h" #endif /* OUTSIDE_SPEEX */ #ifdef __cplusplus extern "C" { #endif #define SPEEX_RESAMPLER_QUALITY_MAX 10 #define SPEEX_RESAMPLER_QUALITY_MIN 0 #define SPEEX_RESAMPLER_QUALITY_DEFAULT 4 #define SPEEX_RESAMPLER_QUALITY_VOIP 3 #define SPEEX_RESAMPLER_QUALITY_DESKTOP 5 enum { RESAMPLER_ERR_SUCCESS = 0, RESAMPLER_ERR_ALLOC_FAILED = 1, RESAMPLER_ERR_BAD_STATE = 2, RESAMPLER_ERR_INVALID_ARG = 3, RESAMPLER_ERR_PTR_OVERLAP = 4, RESAMPLER_ERR_MAX_ERROR }; struct SpeexResamplerState_; typedef struct SpeexResamplerState_ SpeexResamplerState; /** Create a new resampler with integer input and output rates. * @param nb_channels Number of channels to be processed * @param in_rate Input sampling rate (integer number of Hz). * @param out_rate Output sampling rate (integer number of Hz). * @param quality Resampling quality between 0 and 10, where 0 has poor quality * and 10 has very high quality. * @return Newly created resampler state * @retval NULL Error: not enough memory */ SpeexResamplerState *speex_resampler_init(spx_uint32_t nb_channels, spx_uint32_t in_rate, spx_uint32_t out_rate, int quality, int *err); /** Create a new resampler with fractional input/output rates. The sampling * rate ratio is an arbitrary rational number with both the numerator and * denominator being 32-bit integers. * @param nb_channels Number of channels to be processed * @param ratio_num Numerator of the sampling rate ratio * @param ratio_den Denominator of the sampling rate ratio * @param in_rate Input sampling rate rounded to the nearest integer (in Hz). * @param out_rate Output sampling rate rounded to the nearest integer (in Hz). * @param quality Resampling quality between 0 and 10, where 0 has poor quality * and 10 has very high quality. * @return Newly created resampler state * @retval NULL Error: not enough memory */ SpeexResamplerState *speex_resampler_init_frac(spx_uint32_t nb_channels, spx_uint32_t ratio_num, spx_uint32_t ratio_den, spx_uint32_t in_rate, spx_uint32_t out_rate, int quality, int *err); /** Destroy a resampler state. * @param st Resampler state */ void speex_resampler_destroy(SpeexResamplerState *st); /** Resample a float array. The input and output buffers must *not* overlap. * @param st Resampler state * @param channel_index Index of the channel to process for the multi-channel * base (0 otherwise) * @param in Input buffer * @param in_len Number of input samples in the input buffer. Returns the * number of samples processed * @param out Output buffer * @param out_len Size of the output buffer. Returns the number of samples written */ int speex_resampler_process_float(SpeexResamplerState *st, spx_uint32_t channel_index, const float *in, spx_uint32_t *in_len, float *out, spx_uint32_t *out_len); /** Resample an int array. The input and output buffers must *not* overlap. * @param st Resampler state * @param channel_index Index of the channel to process for the multi-channel * base (0 otherwise) * @param in Input buffer * @param in_len Number of input samples in the input buffer. Returns the number * of samples processed * @param out Output buffer * @param out_len Size of the output buffer. Returns the number of samples written */ int speex_resampler_process_int(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_int16_t *in, spx_uint32_t *in_len, spx_int16_t *out, spx_uint32_t *out_len); /** Resample an interleaved float array. The input and output buffers must *not* overlap. * @param st Resampler state * @param in Input buffer * @param in_len Number of input samples in the input buffer. Returns the number * of samples processed. This is all per-channel. * @param out Output buffer * @param out_len Size of the output buffer. Returns the number of samples written. * This is all per-channel. */ int speex_resampler_process_interleaved_float(SpeexResamplerState *st, const float *in, spx_uint32_t *in_len, float *out, spx_uint32_t *out_len); /** Resample an interleaved int array. The input and output buffers must *not* overlap. * @param st Resampler state * @param in Input buffer * @param in_len Number of input samples in the input buffer. Returns the number * of samples processed. This is all per-channel. * @param out Output buffer * @param out_len Size of the output buffer. Returns the number of samples written. * This is all per-channel. */ int speex_resampler_process_interleaved_int(SpeexResamplerState *st, const spx_int16_t *in, spx_uint32_t *in_len, spx_int16_t *out, spx_uint32_t *out_len); /** Set (change) the input/output sampling rates (integer value). * @param st Resampler state * @param in_rate Input sampling rate (integer number of Hz). * @param out_rate Output sampling rate (integer number of Hz). */ int speex_resampler_set_rate(SpeexResamplerState *st, spx_uint32_t in_rate, spx_uint32_t out_rate); /** Get the current input/output sampling rates (integer value). * @param st Resampler state * @param in_rate Input sampling rate (integer number of Hz) copied. * @param out_rate Output sampling rate (integer number of Hz) copied. */ void speex_resampler_get_rate(SpeexResamplerState *st, spx_uint32_t *in_rate, spx_uint32_t *out_rate); /** Set (change) the input/output sampling rates and resampling ratio * (fractional values in Hz supported). * @param st Resampler state * @param ratio_num Numerator of the sampling rate ratio * @param ratio_den Denominator of the sampling rate ratio * @param in_rate Input sampling rate rounded to the nearest integer (in Hz). * @param out_rate Output sampling rate rounded to the nearest integer (in Hz). */ int speex_resampler_set_rate_frac(SpeexResamplerState *st, spx_uint32_t ratio_num, spx_uint32_t ratio_den, spx_uint32_t in_rate, spx_uint32_t out_rate); /** Get the current resampling ratio. This will be reduced to the least * common denominator. * @param st Resampler state * @param ratio_num Numerator of the sampling rate ratio copied * @param ratio_den Denominator of the sampling rate ratio copied */ void speex_resampler_get_ratio(SpeexResamplerState *st, spx_uint32_t *ratio_num, spx_uint32_t *ratio_den); /** Set (change) the conversion quality. * @param st Resampler state * @param quality Resampling quality between 0 and 10, where 0 has poor * quality and 10 has very high quality. */ int speex_resampler_set_quality(SpeexResamplerState *st, int quality); /** Get the conversion quality. * @param st Resampler state * @param quality Resampling quality between 0 and 10, where 0 has poor * quality and 10 has very high quality. */ void speex_resampler_get_quality(SpeexResamplerState *st, int *quality); /** Set (change) the input stride. * @param st Resampler state * @param stride Input stride */ void speex_resampler_set_input_stride(SpeexResamplerState *st, spx_uint32_t stride); /** Get the input stride. * @param st Resampler state * @param stride Input stride copied */ void speex_resampler_get_input_stride(SpeexResamplerState *st, spx_uint32_t *stride); /** Set (change) the output stride. * @param st Resampler state * @param stride Output stride */ void speex_resampler_set_output_stride(SpeexResamplerState *st, spx_uint32_t stride); /** Get the output stride. * @param st Resampler state copied * @param stride Output stride */ void speex_resampler_get_output_stride(SpeexResamplerState *st, spx_uint32_t *stride); /** Get the latency introduced by the resampler measured in input samples. * @param st Resampler state */ int speex_resampler_get_input_latency(SpeexResamplerState *st); /** Get the latency introduced by the resampler measured in output samples. * @param st Resampler state */ int speex_resampler_get_output_latency(SpeexResamplerState *st); /** Make sure that the first samples to go out of the resamplers don't have * leading zeros. This is only useful before starting to use a newly created * resampler. It is recommended to use that when resampling an audio file, as * it will generate a file with the same length. For real-time processing, * it is probably easier not to use this call (so that the output duration * is the same for the first frame). * @param st Resampler state */ int speex_resampler_skip_zeros(SpeexResamplerState *st); /** Reset a resampler so a new (unrelated) stream can be processed. * @param st Resampler state */ int speex_resampler_reset_mem(SpeexResamplerState *st); /** Returns the English meaning for an error code * @param err Error code * @return English string */ const char *speex_resampler_strerror(int err); #ifdef __cplusplus } #endif #endif mumble-1.3.4/3rdparty/speexdsp-src/include/speex/speex_preprocess.h0000664000175000017500000002062614010707343025346 0ustar builderbuilder/* Copyright (C) 2003 Epic Games Written by Jean-Marc Valin */ /** * @file speex_preprocess.h * @brief Speex preprocessor. The preprocess can do noise suppression, * residual echo suppression (after using the echo canceller), automatic * gain control (AGC) and voice activity detection (VAD). */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef SPEEX_PREPROCESS_H #define SPEEX_PREPROCESS_H /** @defgroup SpeexPreprocessState SpeexPreprocessState: The Speex preprocessor * This is the Speex preprocessor. The preprocess can do noise suppression, * residual echo suppression (after using the echo canceller), automatic * gain control (AGC) and voice activity detection (VAD). * @{ */ #include "speexdsp_types.h" #ifdef __cplusplus extern "C" { #endif /** State of the preprocessor (one per channel). Should never be accessed directly. */ struct SpeexPreprocessState_; /** State of the preprocessor (one per channel). Should never be accessed directly. */ typedef struct SpeexPreprocessState_ SpeexPreprocessState; /** Creates a new preprocessing state. You MUST create one state per channel processed. * @param frame_size Number of samples to process at one time (should correspond to 10-20 ms). Must be * the same value as that used for the echo canceller for residual echo cancellation to work. * @param sampling_rate Sampling rate used for the input. * @return Newly created preprocessor state */ SpeexPreprocessState *speex_preprocess_state_init(int frame_size, int sampling_rate); /** Destroys a preprocessor state * @param st Preprocessor state to destroy */ void speex_preprocess_state_destroy(SpeexPreprocessState *st); /** Preprocess a frame * @param st Preprocessor state * @param x Audio sample vector (in and out). Must be same size as specified in speex_preprocess_state_init(). * @return Bool value for voice activity (1 for speech, 0 for noise/silence), ONLY if VAD turned on. */ int speex_preprocess_run(SpeexPreprocessState *st, spx_int16_t *x); /** Preprocess a frame (deprecated, use speex_preprocess_run() instead)*/ int speex_preprocess(SpeexPreprocessState *st, spx_int16_t *x, spx_int32_t *echo); /** Update preprocessor state, but do not compute the output * @param st Preprocessor state * @param x Audio sample vector (in only). Must be same size as specified in speex_preprocess_state_init(). */ void speex_preprocess_estimate_update(SpeexPreprocessState *st, spx_int16_t *x); /** Used like the ioctl function to control the preprocessor parameters * @param st Preprocessor state * @param request ioctl-type request (one of the SPEEX_PREPROCESS_* macros) * @param ptr Data exchanged to-from function * @return 0 if no error, -1 if request in unknown */ int speex_preprocess_ctl(SpeexPreprocessState *st, int request, void *ptr); /** Set preprocessor denoiser state */ #define SPEEX_PREPROCESS_SET_DENOISE 0 /** Get preprocessor denoiser state */ #define SPEEX_PREPROCESS_GET_DENOISE 1 /** Set preprocessor Automatic Gain Control state */ #define SPEEX_PREPROCESS_SET_AGC 2 /** Get preprocessor Automatic Gain Control state */ #define SPEEX_PREPROCESS_GET_AGC 3 /** Set preprocessor Voice Activity Detection state */ #define SPEEX_PREPROCESS_SET_VAD 4 /** Get preprocessor Voice Activity Detection state */ #define SPEEX_PREPROCESS_GET_VAD 5 /** Set preprocessor Automatic Gain Control level (float) */ #define SPEEX_PREPROCESS_SET_AGC_LEVEL 6 /** Get preprocessor Automatic Gain Control level (float) */ #define SPEEX_PREPROCESS_GET_AGC_LEVEL 7 /** Set preprocessor dereverb state */ #define SPEEX_PREPROCESS_SET_DEREVERB 8 /** Get preprocessor dereverb state */ #define SPEEX_PREPROCESS_GET_DEREVERB 9 /** Set preprocessor dereverb level */ #define SPEEX_PREPROCESS_SET_DEREVERB_LEVEL 10 /** Get preprocessor dereverb level */ #define SPEEX_PREPROCESS_GET_DEREVERB_LEVEL 11 /** Set preprocessor dereverb decay */ #define SPEEX_PREPROCESS_SET_DEREVERB_DECAY 12 /** Get preprocessor dereverb decay */ #define SPEEX_PREPROCESS_GET_DEREVERB_DECAY 13 /** Set probability required for the VAD to go from silence to voice */ #define SPEEX_PREPROCESS_SET_PROB_START 14 /** Get probability required for the VAD to go from silence to voice */ #define SPEEX_PREPROCESS_GET_PROB_START 15 /** Set probability required for the VAD to stay in the voice state (integer percent) */ #define SPEEX_PREPROCESS_SET_PROB_CONTINUE 16 /** Get probability required for the VAD to stay in the voice state (integer percent) */ #define SPEEX_PREPROCESS_GET_PROB_CONTINUE 17 /** Set maximum attenuation of the noise in dB (negative number) */ #define SPEEX_PREPROCESS_SET_NOISE_SUPPRESS 18 /** Get maximum attenuation of the noise in dB (negative number) */ #define SPEEX_PREPROCESS_GET_NOISE_SUPPRESS 19 /** Set maximum attenuation of the residual echo in dB (negative number) */ #define SPEEX_PREPROCESS_SET_ECHO_SUPPRESS 20 /** Get maximum attenuation of the residual echo in dB (negative number) */ #define SPEEX_PREPROCESS_GET_ECHO_SUPPRESS 21 /** Set maximum attenuation of the residual echo in dB when near end is active (negative number) */ #define SPEEX_PREPROCESS_SET_ECHO_SUPPRESS_ACTIVE 22 /** Get maximum attenuation of the residual echo in dB when near end is active (negative number) */ #define SPEEX_PREPROCESS_GET_ECHO_SUPPRESS_ACTIVE 23 /** Set the corresponding echo canceller state so that residual echo suppression can be performed (NULL for no residual echo suppression) */ #define SPEEX_PREPROCESS_SET_ECHO_STATE 24 /** Get the corresponding echo canceller state */ #define SPEEX_PREPROCESS_GET_ECHO_STATE 25 /** Set maximal gain increase in dB/second (int32) */ #define SPEEX_PREPROCESS_SET_AGC_INCREMENT 26 /** Get maximal gain increase in dB/second (int32) */ #define SPEEX_PREPROCESS_GET_AGC_INCREMENT 27 /** Set maximal gain decrease in dB/second (int32) */ #define SPEEX_PREPROCESS_SET_AGC_DECREMENT 28 /** Get maximal gain decrease in dB/second (int32) */ #define SPEEX_PREPROCESS_GET_AGC_DECREMENT 29 /** Set maximal gain in dB (int32) */ #define SPEEX_PREPROCESS_SET_AGC_MAX_GAIN 30 /** Get maximal gain in dB (int32) */ #define SPEEX_PREPROCESS_GET_AGC_MAX_GAIN 31 /* Can't set loudness */ /** Get loudness */ #define SPEEX_PREPROCESS_GET_AGC_LOUDNESS 33 /* Can't set gain */ /** Get current gain (int32 percent) */ #define SPEEX_PREPROCESS_GET_AGC_GAIN 35 /* Can't set spectrum size */ /** Get spectrum size for power spectrum (int32) */ #define SPEEX_PREPROCESS_GET_PSD_SIZE 37 /* Can't set power spectrum */ /** Get power spectrum (int32[] of squared values) */ #define SPEEX_PREPROCESS_GET_PSD 39 /* Can't set noise size */ /** Get spectrum size for noise estimate (int32) */ #define SPEEX_PREPROCESS_GET_NOISE_PSD_SIZE 41 /* Can't set noise estimate */ /** Get noise estimate (int32[] of squared values) */ #define SPEEX_PREPROCESS_GET_NOISE_PSD 43 /* Can't set speech probability */ /** Get speech probability in last frame (int32). */ #define SPEEX_PREPROCESS_GET_PROB 45 /** Set preprocessor Automatic Gain Control level (int32) */ #define SPEEX_PREPROCESS_SET_AGC_TARGET 46 /** Get preprocessor Automatic Gain Control level (int32) */ #define SPEEX_PREPROCESS_GET_AGC_TARGET 47 #ifdef __cplusplus } #endif /** @}*/ #endif mumble-1.3.4/3rdparty/speexdsp-src/include/speex/speex_echo.h0000664000175000017500000001445514010707343024102 0ustar builderbuilder/* Copyright (C) Jean-Marc Valin */ /** @file speex_echo.h @brief Echo cancellation */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef SPEEX_ECHO_H #define SPEEX_ECHO_H /** @defgroup SpeexEchoState SpeexEchoState: Acoustic echo canceller * This is the acoustic echo canceller module. * @{ */ #include "speexdsp_types.h" #ifdef __cplusplus extern "C" { #endif /** Obtain frame size used by the AEC */ #define SPEEX_ECHO_GET_FRAME_SIZE 3 /** Set sampling rate */ #define SPEEX_ECHO_SET_SAMPLING_RATE 24 /** Get sampling rate */ #define SPEEX_ECHO_GET_SAMPLING_RATE 25 /* Can't set window sizes */ /** Get size of impulse response (int32) */ #define SPEEX_ECHO_GET_IMPULSE_RESPONSE_SIZE 27 /* Can't set window content */ /** Get impulse response (int32[]) */ #define SPEEX_ECHO_GET_IMPULSE_RESPONSE 29 /** Internal echo canceller state. Should never be accessed directly. */ struct SpeexEchoState_; /** @class SpeexEchoState * This holds the state of the echo canceller. You need one per channel. */ /** Internal echo canceller state. Should never be accessed directly. */ typedef struct SpeexEchoState_ SpeexEchoState; /** Creates a new echo canceller state * @param frame_size Number of samples to process at one time (should correspond to 10-20 ms) * @param filter_length Number of samples of echo to cancel (should generally correspond to 100-500 ms) * @return Newly-created echo canceller state */ SpeexEchoState *speex_echo_state_init(int frame_size, int filter_length); /** Creates a new multi-channel echo canceller state * @param frame_size Number of samples to process at one time (should correspond to 10-20 ms) * @param filter_length Number of samples of echo to cancel (should generally correspond to 100-500 ms) * @param nb_mic Number of microphone channels * @param nb_speakers Number of speaker channels * @return Newly-created echo canceller state */ SpeexEchoState *speex_echo_state_init_mc(int frame_size, int filter_length, int nb_mic, int nb_speakers); /** Destroys an echo canceller state * @param st Echo canceller state */ void speex_echo_state_destroy(SpeexEchoState *st); /** Performs echo cancellation a frame, based on the audio sent to the speaker (no delay is added * to playback in this form) * * @param st Echo canceller state * @param rec Signal from the microphone (near end + far end echo) * @param play Signal played to the speaker (received from far end) * @param out Returns near-end signal with echo removed */ void speex_echo_cancellation(SpeexEchoState *st, const spx_int16_t *rec, const spx_int16_t *play, spx_int16_t *out); /** Performs echo cancellation a frame (deprecated) */ void speex_echo_cancel(SpeexEchoState *st, const spx_int16_t *rec, const spx_int16_t *play, spx_int16_t *out, spx_int32_t *Yout); /** Perform echo cancellation using internal playback buffer, which is delayed by two frames * to account for the delay introduced by most soundcards (but it could be off!) * @param st Echo canceller state * @param rec Signal from the microphone (near end + far end echo) * @param out Returns near-end signal with echo removed */ void speex_echo_capture(SpeexEchoState *st, const spx_int16_t *rec, spx_int16_t *out); /** Let the echo canceller know that a frame was just queued to the soundcard * @param st Echo canceller state * @param play Signal played to the speaker (received from far end) */ void speex_echo_playback(SpeexEchoState *st, const spx_int16_t *play); /** Reset the echo canceller to its original state * @param st Echo canceller state */ void speex_echo_state_reset(SpeexEchoState *st); /** Used like the ioctl function to control the echo canceller parameters * * @param st Echo canceller state * @param request ioctl-type request (one of the SPEEX_ECHO_* macros) * @param ptr Data exchanged to-from function * @return 0 if no error, -1 if request in unknown */ int speex_echo_ctl(SpeexEchoState *st, int request, void *ptr); struct SpeexDecorrState_; typedef struct SpeexDecorrState_ SpeexDecorrState; /** Create a state for the channel decorrelation algorithm This is useful for multi-channel echo cancellation only * @param rate Sampling rate * @param channels Number of channels (it's a bit pointless if you don't have at least 2) * @param frame_size Size of the frame to process at ones (counting samples *per* channel) */ SpeexDecorrState *speex_decorrelate_new(int rate, int channels, int frame_size); /** Remove correlation between the channels by modifying the phase and possibly adding noise in a way that is not (or little) perceptible. * @param st Decorrelator state * @param in Input audio in interleaved format * @param out Result of the decorrelation (out *may* alias in) * @param strength How much alteration of the audio to apply from 0 to 100. */ void speex_decorrelate(SpeexDecorrState *st, const spx_int16_t *in, spx_int16_t *out, int strength); /** Destroy a Decorrelation state * @param st State to destroy */ void speex_decorrelate_destroy(SpeexDecorrState *st); #ifdef __cplusplus } #endif /** @}*/ #endif mumble-1.3.4/3rdparty/speexdsp-src/include/speex/speexdsp_types.h0000664000175000017500000000700714010707343025032 0ustar builderbuilder/* speexdsp_types.h taken from libogg */ /******************************************************************** * * * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 * * by the Xiph.Org Foundation http://www.xiph.org/ * * * ******************************************************************** function: #ifdef jail to whip a few platforms into the UNIX ideal. last mod: $Id: os_types.h 7524 2004-08-11 04:20:36Z conrad $ ********************************************************************/ /** @file speexdsp_types.h @brief Speex types */ #ifndef _SPEEX_TYPES_H #define _SPEEX_TYPES_H #if defined(_WIN32) # if defined(__CYGWIN__) # include <_G_config.h> typedef _G_int32_t spx_int32_t; typedef _G_uint32_t spx_uint32_t; typedef _G_int16_t spx_int16_t; typedef _G_uint16_t spx_uint16_t; # elif defined(__MINGW32__) typedef short spx_int16_t; typedef unsigned short spx_uint16_t; typedef int spx_int32_t; typedef unsigned int spx_uint32_t; # elif defined(__MWERKS__) typedef int spx_int32_t; typedef unsigned int spx_uint32_t; typedef short spx_int16_t; typedef unsigned short spx_uint16_t; # else /* MSVC/Borland */ typedef __int32 spx_int32_t; typedef unsigned __int32 spx_uint32_t; typedef __int16 spx_int16_t; typedef unsigned __int16 spx_uint16_t; # endif #elif defined(__MACOS__) # include typedef SInt16 spx_int16_t; typedef UInt16 spx_uint16_t; typedef SInt32 spx_int32_t; typedef UInt32 spx_uint32_t; #elif (defined(__APPLE__) && defined(__MACH__)) /* MacOS X Framework build */ # include typedef int16_t spx_int16_t; typedef u_int16_t spx_uint16_t; typedef int32_t spx_int32_t; typedef u_int32_t spx_uint32_t; #elif defined(__BEOS__) /* Be */ # include typedef int16_t spx_int16_t; typedef u_int16_t spx_uint16_t; typedef int32_t spx_int32_t; typedef u_int32_t spx_uint32_t; #elif defined (__EMX__) /* OS/2 GCC */ typedef short spx_int16_t; typedef unsigned short spx_uint16_t; typedef int spx_int32_t; typedef unsigned int spx_uint32_t; #elif defined (DJGPP) /* DJGPP */ typedef short spx_int16_t; typedef int spx_int32_t; typedef unsigned int spx_uint32_t; #elif defined(R5900) /* PS2 EE */ typedef int spx_int32_t; typedef unsigned spx_uint32_t; typedef short spx_int16_t; #elif defined(__SYMBIAN32__) /* Symbian GCC */ typedef signed short spx_int16_t; typedef unsigned short spx_uint16_t; typedef signed int spx_int32_t; typedef unsigned int spx_uint32_t; #elif defined(CONFIG_TI_C54X) || defined (CONFIG_TI_C55X) typedef short spx_int16_t; typedef unsigned short spx_uint16_t; typedef long spx_int32_t; typedef unsigned long spx_uint32_t; #elif defined(CONFIG_TI_C6X) typedef short spx_int16_t; typedef unsigned short spx_uint16_t; typedef int spx_int32_t; typedef unsigned int spx_uint32_t; #else #include "speexdsp_config_types.h" #endif #endif /* _SPEEX_TYPES_H */ mumble-1.3.4/3rdparty/speexdsp-src/include/speex/Makefile.am0000664000175000017500000000132214010707343023630 0ustar builderbuilder# Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies # Historically, these headers were part of the speex package, so in order to # keep compatibility with existing software we need to keep installing them # in the same place as they were found then. If new functionality, with new # headers, are added later, some thought should be given as to whether they # should instead go somewhere other than $prefix/include/speex. speexincludedir = $(includedir)/speex nodist_speexinclude_HEADERS = speexdsp_config_types.h speexinclude_HEADERS = speex_echo.h speex_jitter.h speex_preprocess.h speex_resampler.h \ speexdsp_types.h noinst_HEADERS=speex_buffer.h mumble-1.3.4/3rdparty/speexdsp-src/include/speex/speex_buffer.h0000664000175000017500000000416314010707343024430 0ustar builderbuilder/* Copyright (C) 2007 Jean-Marc Valin File: speex_buffer.h This is a very simple ring buffer implementation. It is not thread-safe so you need to do your own locking. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef SPEEX_BUFFER_H #define SPEEX_BUFFER_H #include "speexdsp_types.h" #ifdef __cplusplus extern "C" { #endif struct SpeexBuffer_; typedef struct SpeexBuffer_ SpeexBuffer; SpeexBuffer *speex_buffer_init(int size); void speex_buffer_destroy(SpeexBuffer *st); int speex_buffer_write(SpeexBuffer *st, void *data, int len); int speex_buffer_writezeros(SpeexBuffer *st, int len); int speex_buffer_read(SpeexBuffer *st, void *data, int len); int speex_buffer_get_available(SpeexBuffer *st); int speex_buffer_resize(SpeexBuffer *st, int len); #ifdef __cplusplus } #endif #endif mumble-1.3.4/3rdparty/speexdsp-src/include/speex/speexdsp_config_types.h.in0000664000175000017500000000054014010707343026757 0ustar builderbuilder#ifndef __SPEEX_TYPES_H__ #define __SPEEX_TYPES_H__ #if defined HAVE_STDINT_H # include #elif defined HAVE_INTTYPES_H # include #elif defined HAVE_SYS_TYPES_H # include #endif typedef @SIZE16@ spx_int16_t; typedef @USIZE16@ spx_uint16_t; typedef @SIZE32@ spx_int32_t; typedef @USIZE32@ spx_uint32_t; #endif mumble-1.3.4/3rdparty/speexdsp-src/Doxyfile0000664000175000017500000002040014010707343020531 0ustar builderbuilder# Doxyfile 1.5.1-KDevelop #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = Speex PROJECT_NUMBER = 1.2-beta2 OUTPUT_DIRECTORY = doc CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = NO STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES SEPARATE_MEMBER_PAGES = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO BUILTIN_STL_SUPPORT = NO DISTRIBUTE_GROUP_DOC = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = NO EXTRACT_PRIVATE = NO EXTRACT_STATIC = NO EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = YES HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES SHOW_DIRECTORIES = YES FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_NO_PARAMDOC = NO WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = include/speex FILE_PATTERNS = RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = speex_config_types.h EXAMPLE_PATH = EXAMPLE_PATTERNS = EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = NO INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = YES REFERENCES_RELATION = YES REFERENCES_LINK_SOURCE = YES USE_HTAGS = NO VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = HTML_FOOTER = HTML_STYLESHEET = HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = YES LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = YES USE_PDFLATEX = YES LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = YES HIDE_UNDOC_RELATIONS = YES HAVE_DOT = NO CLASS_GRAPH = YES COLLABORATION_GRAPH = YES GROUP_GRAPHS = YES UML_LOOK = NO TEMPLATE_RELATIONS = YES INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO CALLER_GRAPH = NO GRAPHICAL_HIERARCHY = YES DIRECTORY_GRAPH = YES DOT_IMAGE_FORMAT = gif DOT_PATH = DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 0 DOT_TRANSPARENT = NO DOT_MULTI_TARGETS = NO GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO mumble-1.3.4/3rdparty/speexdsp-src/acinclude.m40000664000175000017500000000663614010707343021233 0ustar builderbuilder# Configure paths for libogg # Jack Moffitt 10-21-2000 # Shamelessly stolen from Owen Taylor and Manish Singh dnl XIPH_PATH_OGG([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) dnl Test for libogg, and define OGG_CFLAGS and OGG_LIBS dnl AC_DEFUN([XIPH_PATH_OGG], [dnl dnl Get the cflags and libraries dnl AC_ARG_WITH(ogg,[ --with-ogg=PFX Prefix where libogg is installed (optional)], ogg_prefix="$withval", ogg_prefix="") AC_ARG_WITH(ogg-libraries,[ --with-ogg-libraries=DIR Directory where libogg library is installed (optional)], ogg_libraries="$withval", ogg_libraries="") AC_ARG_WITH(ogg-includes,[ --with-ogg-includes=DIR Directory where libogg header files are installed (optional)], ogg_includes="$withval", ogg_includes="") AC_ARG_ENABLE(oggtest, [ --disable-oggtest Do not try to compile and run a test Ogg program],, enable_oggtest=yes) if test "x$ogg_libraries" != "x" ; then OGG_LIBS="-L$ogg_libraries" elif test "x$ogg_prefix" != "x" ; then OGG_LIBS="-L$ogg_prefix/lib" elif test "x$prefix" != "xNONE" ; then OGG_LIBS="-L$prefix/lib" fi OGG_LIBS="$OGG_LIBS -logg" if test "x$ogg_includes" != "x" ; then OGG_CFLAGS="-I$ogg_includes" elif test "x$ogg_prefix" != "x" ; then OGG_CFLAGS="-I$ogg_prefix/include" elif test "x$prefix" != "xNONE"; then OGG_CFLAGS="-I$prefix/include" fi AC_MSG_CHECKING(for Ogg) no_ogg="" if test "x$enable_oggtest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $OGG_CFLAGS" LIBS="$LIBS $OGG_LIBS" dnl dnl Now check if the installed Ogg is sufficiently new. dnl rm -f conf.oggtest AC_TRY_RUN([ #include #include #include #include int main () { system("touch conf.oggtest"); return 0; } ],, no_ogg=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi if test "x$no_ogg" = "x" ; then AC_MSG_RESULT(yes) ifelse([$1], , :, [$1]) else AC_MSG_RESULT(no) if test -f conf.oggtest ; then : else echo "*** Could not run Ogg test program, checking why..." CFLAGS="$CFLAGS $OGG_CFLAGS" LIBS="$LIBS $OGG_LIBS" AC_TRY_LINK([ #include #include ], [ return 0; ], [ echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding Ogg or finding the wrong" echo "*** version of Ogg. If it is not finding Ogg, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], [ echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means Ogg was incorrectly installed" echo "*** or that you have moved Ogg since it was installed." ]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi OGG_CFLAGS="" OGG_LIBS="" ifelse([$2], , :, [$2]) fi AC_SUBST(OGG_CFLAGS) AC_SUBST(OGG_LIBS) rm -f conf.oggtest ]) mumble-1.3.4/3rdparty/speexdsp-src/Makefile.am0000664000175000017500000000113414010707343021062 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # To disable automatic dependency tracking if using other tools than # gcc and gmake, add the option 'no-dependencies' AUTOMAKE_OPTIONS = 1.8 ACLOCAL_AMFLAGS = -I m4 pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = speexdsp.pc EXTRA_DIST = SpeexDSP.spec SpeexDSP.spec.in SpeexDSP.kdevelop speexdsp.pc.in README.blackfin #Fools KDevelop into including all files SUBDIRS = libspeexdsp include doc win32 symbian ti DIST_SUBDIRS = libspeexdsp include doc win32 symbian ti rpm: dist rpmbuild -ta ${PACKAGE}-${VERSION}.tar.gz mumble-1.3.4/3rdparty/speexdsp-src/tmv/0000775000175000017500000000000014010707343017635 5ustar builderbuildermumble-1.3.4/3rdparty/speexdsp-src/tmv/speex_config_types.h0000664000175000017500000000106214010707343023702 0ustar builderbuilder#ifndef __SPEEX_TYPES_H__ #define __SPEEX_TYPES_H__ #ifdef __TCS__ #include typedef Int16 spx_int16_t; typedef UInt16 spx_uint16_t; typedef Int32 spx_int32_t; typedef UInt32 spx_uint32_t; #ifdef FIXED_POINT #define VMUX(a,b,c) mux((a),(b),(c)) #define VABS(a) iabs((a)) #define VMAX(a,b) imax((a),(b)) #define VMIN(a,b) imin((a),(b)) #else #define VMUX(a,b,c) fmux((a),(b),(c)) #define VABS(a) fabs((a)) #define VMAX(a,b) fmax((a),(b)) #define VMIN(a,b) fmin((a),(b)) #endif #endif #endif mumble-1.3.4/3rdparty/speexdsp-src/tmv/misc_tm.h0000664000175000017500000000512714010707343021446 0ustar builderbuilder/* Copyright (C) 2007 Hong Zhiqian */ /** @file misc_tm.h @author Hong Zhiqian @brief Various compatibility routines for Speex (TriMedia version) */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #if TM_PROFILE int __profile_begin; int __profile_end; #endif #define OVERRIDE_SPEEX_ALLOC void *speex_alloc (int size) { void *ptr; if ( tmmlMalloc(0, size, (pVoid*)&ptr, tmmlMallocCacheAligned | tmmlMallocCleared) != TM_OK ) { return NULL; } return ptr; } #define OVERRIDE_SPEEX_ALLOC_SCRATCH void *speex_alloc_scratch (int size) { void *ptr; if ( tmmlMalloc(0, size, (pVoid*)&ptr, tmmlMallocCacheAligned | tmmlMallocCleared) != TM_OK ) { return NULL; } return ptr; } #define OVERRIDE_SPEEX_REALLOC void *speex_realloc (void *ptr, int size) { if ( tmmlRealloc(0, size, (pVoid)ptr, (pVoid*)&ptr, tmmlMallocCacheAligned | tmmlMallocCleared) != TM_OK ) { return NULL; } return ptr; } #define OVERRIDE_SPEEX_FREE void speex_free (void *ptr) { tmmlFree(ptr); } #define OVERRIDE_SPEEX_FREE_SCRATCH void speex_free_scratch (void *ptr) { tmmlFree(ptr); } mumble-1.3.4/3rdparty/speexdsp-src/tmv/fftwrap_tm.h0000664000175000017500000001216514010707343022164 0ustar builderbuilder/* Copyright (C) 2007 Hong Zhiqian */ /** @file fftwrap_tm.h @author Hong Zhiqian @brief Various compatibility routines for Speex (TriMedia version) */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include "profile_tm.h" #ifdef FIXED_POINT #define OVERRIDE_MAXIMIZE_RANGE static int maximize_range(Int16 *in, Int16 *out, int bound, int len) { register int max_val=0; register int shift=0; register int i, j; TMDEBUG_ALIGNMEM(in); TMDEBUG_ALIGNMEM(out); MAXIMIZERANGE_START(); len >>= 1; for ( i=0 ; i>1) && max_val != 0 ) { max_val <<= 1; shift++; } if ( shift != 0 ) { for ( i=0,j=0 ; i>1); s = pack16lsb(s,s); len >>= 1; l = len & (int)0xFFFFFFFE; for ( i=0,j=0 ; i>= 1; for( i=1 ; i #include "profile_tm.h" #ifdef FIXED_POINT #define OVERRIDE_PREPROCESS_ANALYSIS static void preprocess_analysis(SpeexPreprocessState * restrict st, spx_int16_t * restrict x) { register int i, j, framesize = st->frame_size; register int N = st->ps_size; register int N3 = 2*N - framesize; register int N4 = framesize - N3; register int * restrict ps = st->ps; register int * restrict frame; register int * restrict inbuf; register int * restrict ptr; register int max_val; frame = (int*)(st->frame); inbuf = (int*)(st->inbuf); ptr = (int*)(st->frame+N3); TMDEBUG_ALIGNMEM(x); TMDEBUG_ALIGNMEM(frame); TMDEBUG_ALIGNMEM(inbuf); PREPROCESSANAYLSIS_START(); N3 >>= 1; framesize >>= 1; max_val = 0; for ( i=0,j=0 ; iwindow ; i> 15; r1 = (asri(16,f10) * asri(16,w10)) >> 15; max_val = imax(iabs(sex16(r0)), max_val); max_val = imax(iabs(sex16(r1)), max_val); r0 = pack16lsb(r1, r0); st32d(j, frame, r0); } #if (TM_UNROLL && TM_UNROLL_PREPROCESSANALYSIS) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif max_val = 14 - spx_ilog2(max_val); st->frame_shift = max_val; if ( max_val != 0 ) { #if (TM_UNROLL && TM_UNROLL_PREPROCESSANALYSIS) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( i=0,j=0 ; ifft_lookup, st->frame, st->ft); power_spectrum(st->ft, ps, N << 1); #if (TM_UNROLL && TM_UNROLL_PREPROCESSANALYSIS) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( i=0,ptr=(int*)st->ps,max_val<<=1,j=((1<<((max_val))>>1)) ;i> max_val; } #if (TM_UNROLL && TM_UNROLL_PREPROCESSANALYSIS) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif filterbank_compute_bank32(st->bank, ps, ps+N); PREPROCESSANAYLSIS_STOP(); } #define _MULT16_32_Q15(a,b,c) ADD32(MULT16_16((a),(b)), SHR(MULT16_16((a),(c)),15)) #define OVERRIDE_UPDATE_NOISE_PROB static void update_noise_prob(SpeexPreprocessState * restrict st) { register int i; register int min_range, nb_adapt; register int N = st->ps_size; register int * restrict Smin = (int*)st->Smin; register int * restrict Stmp = (int*)st->Stmp; register int * restrict S = (int*)st->S; UPDATENOISEPROB_START(); { register int psi_lsb, psi_msb, ips_lsb, ips_msb, psii_lsb, psii_msb; register int psiii_lsb, psiii_msb; register int q8, q05, q2, q1; register int *ps = (int*)st->ps; register int si_lsb, si_msb, sii_lsb, sii_msb; q8 = QCONST16(.8f,15); q05 = QCONST16(.05f,15); q2 = QCONST16(.2f,15); q1 = QCONST16(.1f,15); ips_lsb = ps[0]; psi_lsb = ps[1]; si_lsb = S[0]; ips_msb = ips_lsb >> 15; psi_msb = psi_lsb >> 15; si_msb = si_lsb >> 15; ips_lsb &= 0x00007fff; psi_lsb &= 0x00007fff; si_lsb &= 0x00007fff; S[0] = _MULT16_32_Q15(q8,si_msb,si_lsb) + _MULT16_32_Q15(q2,ips_msb,ips_lsb); for ( i=1 ; i> 15; si_msb = si_lsb >> 15; si_lsb &= 0x00007fff; psii_lsb &= 0x00007fff; S[i]= _MULT16_32_Q15(q8,si_msb,si_lsb) + _MULT16_32_Q15(q05,ips_msb,ips_lsb) + _MULT16_32_Q15(q1,psi_msb,psi_lsb) + _MULT16_32_Q15(q05,psii_msb,psii_lsb); psiii_lsb = ps[i+2]; sii_lsb = S[i+1]; sii_msb = sii_lsb >> 15; psiii_msb= psiii_lsb >> 15; sii_lsb &= 0x00007fff; psiii_lsb&= 0x00007fff; S[i+1]= _MULT16_32_Q15(q8,sii_msb,sii_lsb) + _MULT16_32_Q15(q05,psi_msb,psi_lsb) + _MULT16_32_Q15(q1,psii_msb,psii_lsb) + _MULT16_32_Q15(q05,psiii_msb,psiii_lsb); ips_lsb = psii_lsb; ips_msb = psii_msb; psi_lsb = psiii_lsb; psi_msb = psiii_msb; } S[N-1] = MULT16_32_Q15(q8,S[N-1]) + MULT16_32_Q15(q2,ps[N-1]); } nb_adapt = st->nb_adapt; if ( nb_adapt==1 ) { for ( i=0 ; imin_count > min_range ) { st->min_count = 0; #if (TM_UNROLL && TM_UNROLL_UPDATENOISEPROB) #pragma TCS_unroll=2 #pragma TCS_unrollexact=1 #endif for ( i=0 ; iupdate_prob; q4 = QCONST16(.4f,15); #if (TM_UNROLL && TM_UNROLL_UPDATENOISEPROB) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( i=0 ; i ADD32(smini,20), 1, 0); } #if (TM_UNROLL && TM_UNROLL_UPDATENOISEPROB) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif } UPDATENOISEPROB_STOP(); } #else #define OVERRIDE_PREPROCESS_ANALYSIS static void preprocess_analysis(SpeexPreprocessState * restrict st, spx_int16_t * restrict x) { register int i; register int framesize = st->frame_size; register int N = st->ps_size; register int N3 = 2*N - framesize; register int N4 = framesize - N3; register float * restrict ps = st->ps; register float * restrict frame = st->frame; register float * restrict inbuf = st->inbuf; PREPROCESSANAYLSIS_START(); #if (TM_UNROLL && TM_UNROLL_PREPROCESSANALYSIS) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( i=0 ; iwindow; #if (TM_UNROLL && TM_UNROLL_PREPROCESSANALYSIS) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( i=0 ; i<2*N ; ++i ) { frame[i] = frame[i] * inbuf[i]; } #if (TM_UNROLL && TM_UNROLL_PREPROCESSANALYSIS) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif spx_fft(st->fft_lookup, frame, st->ft); power_spectrum(st->ft, ps, N << 1); filterbank_compute_bank32(st->bank, ps, ps+N); PREPROCESSANAYLSIS_STOP(); } #define OVERRIDE_UPDATE_NOISE_PROB static void update_noise_prob(SpeexPreprocessState * restrict st) { register float * restrict S = st->S; register float * restrict ps = st->ps; register int N = st->ps_size; register int min_range; register int i; register int nb_adapt; register float * restrict Smin = st->Smin; register float * restrict Stmp = st->Stmp; UPDATENOISEPROB_START(); { register float ips, psi; ips = ps[0]; psi = ps[1]; S[0] = .8f * S[0] + .2f * ips; for ( i=1 ; inb_adapt; if ( nb_adapt==1 ) { for (i=0;iStmp[i] = 0; } min_range = mux(nb_adapt < 100, 15, mux(nb_adapt < 1000, 50, mux(nb_adapt < 10000, 150, 300))); if ( st->min_count > min_range ) { st->min_count = 0; #if (TM_UNROLL && TM_UNROLL_UPDATENOISEPROB) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( i=0 ; iSmin; #if (TM_UNROLL && TM_UNROLL_UPDATENOISEPROB) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( i=0 ; iupdate_prob; #if (TM_UNROLL && TM_UNROLL_UPDATENOISEPROB) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for (i=0;i (smini + 20.f), 1, 0); } #if (TM_UNROLL && TM_UNROLL_UPDATENOISEPROB) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif } UPDATENOISEPROB_STOP(); } #define OVERRIDE_COMPUTE_GAIN_FLOOR static void compute_gain_floor( int noise_suppress, int effective_echo_suppress, float * restrict noise, float * restrict echo, float * gain_floor, int len ) { register int i; register float echo_floor; register float noise_floor; COMPUTEGAINFLOOR_START(); noise_floor = exp(.2302585f*noise_suppress); echo_floor = exp(.2302585f*effective_echo_suppress); #if (TM_UNROLL && TM_UNROLL_COMPUTEGAINFLOOR) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for (i=0;iecho_state) { register spx_word32_t * restrict r_echo = st->residual_echo; register spx_word32_t * restrict e_noise = st->echo_noise; register int i; #ifndef FIXED_POINT register spx_word32_t r; #endif speex_echo_get_residual(st->echo_state, r_echo, N); #ifndef FIXED_POINT r = r_echo[0]; if (!(r >=0 && r < N*1e9f) ) { memset(r_echo, 0, N * sizeof(spx_word32_t)); } #endif #if (TM_UNROLL && TM_UNROLL_SPEEXPREPROCESSRUN) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for (i=0;ibank, e_noise, e_noise+N); } else { memset(st->echo_noise, 0, (NM) * sizeof(spx_word32_t)); } } void preprocess_update_noise( SpeexPreprocessState * restrict st, spx_word32_t * restrict ps, int N ) { register spx_word16_t beta, beta_1; register int * restrict up = st->update_prob; register spx_word32_t * restrict noise = st->noise; register int i; beta = MAX16(QCONST16(.03,15),DIV32_16(Q15_ONE,st->nb_adapt)); beta_1 = Q15_ONE-beta; #if (TM_UNROLL && TM_UNROLL_SPEEXPREPROCESSRUN) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for (i=0;ibank, noise, noise+N); } void preprocess_compute_SNR( SpeexPreprocessState * restrict st, spx_word32_t * restrict ps, int NM ) { register spx_word32_t * restrict noise = st->noise; register spx_word32_t * restrict echo = st->echo_noise; register spx_word32_t * restrict reverb = st->reverb_estimate; register spx_word16_t * restrict post = st->post; register spx_word32_t * restrict old_ps = st->old_ps; register spx_word16_t * restrict prior = st->prior; register int i; #if (TM_UNROLL && TM_UNROLL_SPEEXPREPROCESSRUN) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( i=0 ; izeta; register spx_word16_t * restrict prior = st->prior; register spx_word32_t Zframe; register spx_word16_t iprior, priori; register int _N = N-1; register int i; iprior = prior[0]; priori = prior[1]; zeta[0] = PSHR32(ADD32(MULT16_16(QCONST16(.7f,15),zeta[0]), MULT16_16(QCONST16(.3f,15),iprior)),15); #if (TM_UNROLL && TM_UNROLL_SPEEXPREPROCESSRUN) #pragma TCS_unroll=2 #pragma TCS_unrollexact=1 #endif for ( i=1 ; i<_N ; i++) { register spx_word16_t zetai = zeta[i]; register spx_word16_t priorii = prior[i+1]; zeta[i] = PSHR32(ADD32(ADD32(ADD32(MULT16_16(QCONST16(.7f,15),zetai), MULT16_16(QCONST16(.15f,15),priori)), MULT16_16(QCONST16(.075f,15),iprior)), MULT16_16(QCONST16(.075f,15),priorii)),15); iprior = priori; priori = priorii; } #if (TM_UNROLL && TM_UNROLL_SPEEXPREPROCESSRUN) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif for (i=_N; izeta; register spx_word16_t * restrict prior = st->prior; register spx_word16_t * restrict gain = st->gain; register spx_word32_t * restrict old_ps = st->old_ps; register spx_word16_t * restrict post = st->post; register spx_word16_t * restrict gain2 = st->gain2; register int i; register int N=st->ps_size; for ( i=N ; ibank,gain2+N, gain2); filterbank_compute_psd16(st->bank,gain+N, gain); } void preprocess_compute_linear_gain( SpeexPreprocessState * restrict st, spx_word32_t * restrict ps, int N ) { register spx_word16_t * restrict gain_floor = st->gain_floor; register spx_word16_t * restrict prior = st->prior; register spx_word16_t * restrict gain = st->gain; register spx_word32_t * restrict old_ps = st->old_ps; register spx_word16_t * restrict post = st->post; register spx_word16_t * restrict gain2 = st->gain2; register int i; filterbank_compute_psd16(st->bank,gain_floor+N,gain_floor); #if (TM_UNROLL && TM_UNROLL_SPEEXPREPROCESSRUN) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for (i=0;iprior[i]), 15), ADD16(prior[i], SHL32(1,SNR_SHIFT))); theta = MULT16_32_P15(prior_ratio, QCONST32(1.f,EXPIN_SHIFT)+SHL32(EXTEND32(post[i]),EXPIN_SHIFT-SNR_SHIFT)); MM = hypergeom_gain(theta); g = EXTRACT16(MIN32(Q15_ONE, MULT16_32_Q15(prior_ratio, MM))); p = gain2[i]; g = VMUX( MULT16_16_Q15(QCONST16(.333f,15),g) > gain[i], MULT16_16(3,gain[i]), g); old_ps[i]= MULT16_32_P15(QCONST16(.2f,15),old_ps[i]) + MULT16_32_P15(MULT16_16_P15(QCONST16(.8f,15),SQR16_Q15(g)),ps[i]); g = VMUX( g < gfi, gfi, g ); gain[i] = g; tmp = MULT16_16_P15(p,spx_sqrt(SHL32(EXTEND32(g),15))) + MULT16_16_P15(SUB16(Q15_ONE,p),spx_sqrt(SHL32(EXTEND32(gfi),15))); gain2[i]=SQR16_Q15(tmp); /* Use this if you want a log-domain MMSE estimator instead */ /* gain2[i] = pow(g, p) * pow(gfi,1.f-p);*/ } #if (TM_UNROLL && TM_UNROLL_SPEEXPREPROCESSRUN) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif } #if 0 void preprocess_compute_bark_gain( SpeexPreprocessState * restrict st, int N, int NM ) { register spx_word16_t * restrict gain_floor = st->gain_floor; register spx_word16_t * restrict gain = st->gain; register spx_word16_t * restrict gain2 = st->gain2; register int i; for (i=N;ibank,gain2+N, gain2); } #endif void preprocess_apply_gain( SpeexPreprocessState * restrict st, int N ) { register spx_word16_t * restrict ft = st->ft; register spx_word16_t * restrict gain2 = st->gain2; register int j, i; ft[0] = MULT16_16_P15(gain2[0],ft[0]); for (i=1,j=1; iframe; register int shift = st->frame_shift; register int i; register int N2 = N << 1; #if (TM_UNROLL && TM_UNROLL_SPEEXPREPROCESSRUN) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( i=0 ; iframe; register int i; register int N2 = N << 1; #if (TM_UNROLL && TM_UNROLL_SPEEXPREPROCESSRUN) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for (i=0;i max_sample, framei, max_sample); } #if (TM_UNROLL && TM_UNROLL_SPEEXPREPROCESSRUN) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif if ( max_sample > 28000.f ) { float damp = 28000.f/max_sample; #if (TM_UNROLL && TM_UNROLL_SPEEXPREPROCESSRUN) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( i=0 ; i< N2 ; i++ ) { frame[i] *= damp; } #if (TM_UNROLL && TM_UNROLL_SPEEXPREPROCESSRUN) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif } } #endif void preprocess_update( SpeexPreprocessState * restrict st, spx_int16_t * restrict x, int N ) { register spx_word16_t * restrict frame = st->frame; register spx_word16_t * restrict window = st->window; register spx_word16_t * restrict outbuf = st->outbuf; register int framesize = st->frame_size; register int N2 = N << 1; register int N3 = N2 - framesize; register int N4 = (framesize) - N3; register int i; #if (TM_UNROLL && TM_UNROLL_SPEEXPREPROCESSRUN) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( i=0 ; ips; register spx_word32_t Zframe; register spx_word16_t Pframe; st->nb_adapt++; st->min_count++; N = st->ps_size; M = st->nbands; NM = N + M; preprocess_residue_echo(st, N, NM); preprocess_analysis(st, x); update_noise_prob(st); preprocess_update_noise(st, ps, N); if ( st->nb_adapt == 1 ) { memcpy(st->old_ps, ps, (NM) * sizeof(spx_word32_t)); } preprocess_compute_SNR(st, ps, NM); Zframe = preprocess_smooth_SNR(st, N, NM); { register spx_word16_t effective_echo_suppress; Pframe = QCONST16(.1f,15)+MULT16_16_Q15(QCONST16(.899f,15),qcurve(DIV32_16(Zframe,M))); effective_echo_suppress = EXTRACT16(PSHR32(ADD32(MULT16_16(SUB16(Q15_ONE,Pframe), st->echo_suppress), MULT16_16(Pframe, st->echo_suppress_active)),15)); compute_gain_floor(st->noise_suppress, effective_echo_suppress, st->noise+N, st->echo_noise+N, st->gain_floor+N, M); } preprocess_compute_emgain(st, ps, Pframe, NM); preprocess_compute_linear_gain(st, ps, N); if (!st->denoise_enabled) { register spx_word16_t * restrict gain2 = st->gain2; #if (TM_UNROLL && TM_UNROLL_SPEEXPREPROCESSRUN) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( i=0 ; iagc_enabled) { speex_compute_agc(st, Pframe, st->ft); } #endif spx_ifft(st->fft_lookup, st->ft, st->frame); #ifdef FIXED_POINT preprocess_scale(st, N); #endif #ifndef FIXED_POINT if ( st->agc_enabled ) { preprocess_apply_agc(st, N); } #endif preprocess_update(st, x, N); if ( st->vad_enabled ) { if (Pframe > st->speech_prob_start || (st->was_speech && Pframe > st->speech_prob_continue)) { st->was_speech=1; return 1; } else { st->was_speech=0; return 0; } } else { return 1; } } mumble-1.3.4/3rdparty/speexdsp-src/tmv/kiss_fft_tm.h0000664000175000017500000003442714010707343022330 0ustar builderbuilder/* Copyright (C) 2007 Hong Zhiqian */ /** @file kiss_fft_tm.h @author Hong Zhiqian @brief Various compatibility routines for Speex (TriMedia version) */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "_kiss_fft_guts_tm.h" #ifdef TM_ASM #include "profile_tm.h" #ifdef FIXED_POINT #define OVERRIDE_KFBFLY2 static void kf_bfly2( kiss_fft_cpx *Fout, const int fstride, const kiss_fft_cfg st, int m ) { register int * restrict Fout2; register int * restrict tw1 = (int*)st->twiddles; register int i, j; register int _inv = !st->inverse; Fout2 = (int*)Fout + m; for ( i=0,j=0 ; iinverse; tw3 = tw2 = tw1 = (int*)st->twiddles; fstride2 = fstride << 1; fstride3 = fstride * 3; Fout1 = (int*)Fout + m; Fout2 = (int*)Fout + (m << 1); Fout3 = (int*)Fout + (m * 3); for ( i=0,j=0 ; iinverse; tw1 = tw2 = (int*)st->twiddles; Fout1 = (int*)Fout + m; Fout2 = (int*)Fout + (m << 1); epi = tw1[fstride*m]; epi = pack16lsb(epi,epi); fstride2 = fstride << 1; for ( i=0,j=0 ; iinverse; Fout1=(int*)Fout+m; Fout2=(int*)Fout+(m<<1); Fout3=(int*)Fout+(3 *m); Fout4=(int*)Fout+(m<<2); tw1 = tw2 = tw3 = tw4 = (int*)st->twiddles; i = tw1[fstride*m]; yab_lsb = tw1[fstride*(m<<1)]; yab_msb = pack16msb(i, yab_lsb); yab_lsb = pack16lsb(i, yab_lsb); yba_msb = funshift2(-sex16(yab_msb), yab_msb); yba_lsb = funshift2(yab_lsb, yab_lsb); fstride2 = fstride << 1; fstride3 = fstride * 3; fstride4 = fstride << 2; for ( i=0,j=0 ; iinverse; register int i, j, k, l; register int * restrict twiddles = (int*)st->twiddles; register int Norig = st->nfft; CHECKBUF(scratchbuf,nscratchbuf,p); for ( i=0; i=Norig ) { twidx -= Norig; } sc = ld32x(scratchbuf,l); tw = ld32x(twiddles,twidx); TM_MUL(sc, sc, tw); TM_ADD(f10, f10, sc); } st32d(k<<2, Fout, f10); } } } #else #define OVERRIDE_KFBFLY2 static void kf_bfly2( kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_cfg st, int m ) { register kiss_fft_cpx * restrict Fout2; register kiss_fft_cpx * restrict tw1 = st->twiddles; Fout2 = Fout + m; do { register kiss_fft_cpx _fout2, _fout, t; _fout2 = *Fout2; _fout = *Fout; C_MUL ( t, _fout2, *tw1); C_SUB (_fout2, _fout, t); C_ADD (_fout, _fout, t); *Fout2 = _fout2; *Fout = _fout; tw1 += fstride; ++Fout2; ++Fout; } while ( --m ); } #define OVERRIDE_KFBFLY4 static void kf_bfly4( kiss_fft_cpx * Fout, const int fstride, const kiss_fft_cfg st, int m ) { register kiss_fft_cpx * restrict tw1,* restrict tw2,* restrict tw3; register kiss_fft_cpx * restrict Fout1, * restrict Fout2, * restrict Fout3; register int _inv = !st->inverse; tw3 = tw2 = tw1 = st->twiddles; Fout1 = Fout + m; Fout2 = Fout + (m << 1); Fout3 = Fout + (m * 3); do { register kiss_fft_cpx _fout; register kiss_fft_cpx sc0, sc1, sc2, sc3, sc4, sc5; _fout = *Fout; C_MUL( sc0,*Fout1, *tw1); C_MUL( sc1,*Fout2, *tw2); C_MUL( sc2,*Fout3, *tw3); C_SUB( sc5, _fout, sc1); C_ADD( _fout, _fout, sc1); C_ADD( sc3, sc0, sc2); C_SUB( sc4, sc0, sc2); C_SUB(*Fout2, _fout, sc3); C_ADD( *Fout, _fout, sc3); tw1 += fstride; tw2 += (fstride << 1); tw3 += (fstride * 3); if ( _inv ) { Fout1->r = sc5.r + sc4.i; Fout1->i = sc5.i - sc4.r; Fout3->r = sc5.r - sc4.i; Fout3->i = sc5.i + sc4.r; } else { Fout1->r = sc5.r - sc4.i; Fout1->i = sc5.i + sc4.r; Fout3->r = sc5.r + sc4.i; Fout3->i = sc5.i - sc4.r; } ++Fout; ++Fout1; ++Fout2; ++Fout3; } while(--m); } #define OVERRIDE_KFBFLY3 static void kf_bfly3( kiss_fft_cpx * Fout, const int fstride, const kiss_fft_cfg st, int m ) { register kiss_fft_cpx * restrict Fout1, * restrict Fout2; register kiss_fft_cpx * restrict tw1,* restrict tw2; register float epi; tw1 = tw2 = st->twiddles; epi = st->twiddles[fstride*m].i; Fout1 = Fout + m; Fout2 = Fout + (m << 1); do { register kiss_fft_cpx _fout; register kiss_fft_cpx sc0, sc1, sc2, sc3; _fout = *Fout; C_MUL( sc1, *Fout1, *tw1); C_MUL( sc2, *Fout2, *tw2); C_ADD( sc3, sc1, sc2); C_SUB( sc0, sc1, sc2); tw1 += fstride; tw2 += (fstride << 1); sc1.r = _fout.r - HALF_OF(sc3.r); sc1.i = _fout.i - HALF_OF(sc3.i); C_MULBYSCALAR(sc0, epi); C_ADD(*Fout, _fout, sc3); Fout2->r = sc1.r + sc0.i; Fout2->i = sc1.i - sc0.r; Fout1->r = sc1.i - sc0.i; Fout1->i = sc1.r + sc0.r; ++Fout; ++Fout1; ++Fout2; } while(--m); } #define OVERRIDE_KFBFLY5 static void kf_bfly5( kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_cfg st, int m ) { register kiss_fft_cpx * restrict Fout1,* restrict Fout2,* restrict Fout3,* restrict Fout4; register int u; register kiss_fft_cpx *tw; register float yar, yai, ybr, ybi; Fout1=Fout+m; Fout2=Fout+(m<<1); Fout3=Fout+(m*3); Fout4=Fout+(m<<2); tw = st->twiddles; yar = tw[fstride*m].r; yai = tw[fstride*m].i; ybr = tw[fstride*2*m].r; ybi = tw[fstride*2*m].i; for ( u=0; ur = sc0.r + sc7.r + sc8.r; Fout->i = sc0.i + sc7.i + sc8.i; sc5.r = sc0.r + S_MUL(sc7.r,yar) + S_MUL(sc8.r,ybr); sc5.i = sc0.i + S_MUL(sc7.i,yar) + S_MUL(sc8.i,ybr); sc6.r = S_MUL(sc10.i,yai) + S_MUL(sc9.i,ybi); sc6.i = -S_MUL(sc10.r,yai) - S_MUL(sc9.r,ybi); C_SUB(*Fout1,sc5,sc6); C_ADD(*Fout4,sc5,sc6); sc11.r = sc0.r + S_MUL(sc7.r,ybr) + S_MUL(sc8.r,yar); sc11.i = sc0.i + S_MUL(sc7.i,ybr) + S_MUL(sc8.i,yar); sc12.r = - S_MUL(sc10.i,ybi) + S_MUL(sc9.i,yai); sc12.i = S_MUL(sc10.r,ybi) - S_MUL(sc9.r,yai); C_ADD(*Fout2,sc11,sc12); C_SUB(*Fout3,sc11,sc12); ++Fout1; ++Fout2; ++Fout3; ++Fout4; } } #endif #endif mumble-1.3.4/3rdparty/speexdsp-src/tmv/fixed_tm.h0000664000175000017500000000610414010707343021606 0ustar builderbuilder/* Copyright (C) 2007 Hong Zhiqian */ /** @file fixed_tm.h @author Hong Zhiqian @brief Various compatibility routines for Speex (TriMedia version) */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef FIXED_TM_H #define FIXED_TM_H #include #undef SATURATE #undef SATURATE16 #undef SATURATE32 #define SATURATE(x,a) iclipi(x,a) #define SATURATE16(x,a) iclipi(x,a) #define SATURATE32(x,a) iclipi(x,a) #undef EXTEND32 #define EXTEND32(x) sex16(x) #undef NEG16 #undef NEG32 #define NEG16(x) ineg((int)(x)) #define NEG32(x) ineg(x) #undef ABS #undef ABS16 #undef ABS32 #define ABS(x) iabs(x) #define ABS32(x) iabs(x) #define ABS16(x) iabs((int)(x)) #undef MIN16 #undef MIN32 #define MIN16(a,b) imin((int)(a),(int)(b)) #define MIN32(a,b) imin(a,b) #undef MAX16 #undef MAX32 #define MAX16(a,b) imax((int)(a),(int)(b)) #define MAX32(a,b) imax(a,b) #undef ADD16 #undef SUB16 #undef ADD32 #undef SUB32 #undef MULT16_16 #undef MULT16_16_16 #define ADD16(a,b) ((int)(a) + (int)(b)) #define SUB16(a,b) ((int)(a) - (int)(b)) #define ADD32(a,b) ((int)(a) + (int)(b)) #define SUB32(a,b) ((int)(a) - (int)(b)) #define MULT16_16_16(a,b) ((int)(a) * (int)(b)) #define MULT16_16(a,b) ((int)(a) * (int)(b)) #if TM_DEBUGMEM_ALIGNNMENT #include #define TMDEBUG_ALIGNMEM(x) \ { if( ((int)(x) & (int)(0x00000003)) != 0 ) \ { printf("memory not align. file: %s, line: %d\n", __FILE__, __LINE__); \ } \ } #else #define TMDEBUG_ALIGNMEM(x) #endif #endif mumble-1.3.4/3rdparty/speexdsp-src/tmv/profile_tm.h0000664000175000017500000002545214010707343022156 0ustar builderbuilder/* Copyright (C) 2007 Hong Zhiqian */ /** @file profile_tm.h @author Hong Zhiqian @brief Various compatibility routines for Speex (TriMedia version) */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @remarks This file provide some capabilities to measure clock cycles. * Use this if unable to compile with TriMedia profile options */ extern int __profile_begin; extern int __profile_end; #if TM_PROFILE #define PROFILE_START() \ { \ __profile_begin = cycles(); \ } \ #define PROFILE_STOP() \ { \ __profile_end = cycles(); \ printf("%s\t%d\n", __FUNCTION__, end - begin); \ } \ #else #define PROFILE_START() #define PROFILE_STOP() #endif #if TM_PROFILE_SPXAUTOCORR #define _SPX_AUTOCORR_START() PROFILE_START() #define _SPX_AUTOCORR_STOP() PROFILE_STOP() #else #define _SPX_AUTOCORR_START() #define _SPX_AUTOCORR_STOP() #endif #if TM_PROFILE_INNERPROD #define INNERPROD_START() PROFILE_START() #define INNERPROD_STOP() PROFILE_STOP() #else #define INNERPROD_START() #define INNERPROD_STOP() #endif #if TM_PROFILE_PITCHXCORR #define PITCHXCORR_START() PROFILE_START() #define PITCHXCORR_STOP() PROFILE_STOP() #else #define PITCHXCORR_START() #define PITCHXCORR_STOP() #endif #if TM_PROFILE_COMPUTEPITCHERROR #define COMPUTEPITCHERROR_START() PROFILE_START() #define COMPUTEPITCHERROR_STOP() PROFILE_STOP() #else #define COMPUTEPITCHERROR_START() #define COMPUTEPITCHERROR_STOP() #endif #if TM_PROFILE_PITCHGAINSEARCH3TAPVQ #define PITCHGAINSEARCH3TAPVQ_START() PROFILE_START() #define PITCHGAINSEARCH3TAPVQ_STOP() PROFILE_STOP() #else #define PITCHGAINSEARCH3TAPVQ_START() #define PITCHGAINSEARCH3TAPVQ_STOP() #endif #if TM_PROFILE_OPENLOOPNBESTPITCH #define OPENLOOPNBESTPITCH_START() PROFILE_START() #define OPENLOOPNBESTPITCH_STOP() PROFILE_STOP() #else #define OPENLOOPNBESTPITCH_START() #define OPENLOOPNBESTPITCH_STOP() #endif #if TM_PROFILE_LSP_INTERPOLATE #define LSPINTERPOLATE_START() PROFILE_START() #define LSPINTERPOLATE_STOP() PROFILE_STOP() #else #define LSPINTERPOLATE_START() #define LSPINTERPOLATE_STOP() #endif #if TM_PROFILE_CHEBPOLYEVA #define CHEBPOLYEVA_START() PROFILE_START() #define CHEBPOLYEVA_STOP() PROFILE_STOP() #else #define CHEBPOLYEVA_START() #define CHEBPOLYEVA_STOP() #endif #if TM_PROFILE_COMPUTEQUANTWEIGHTS #define COMPUTEQUANTWEIGHTS_START() PROFILE_START() #define COMPUTEQUANTWEIGHTS_STOP() PROFILE_STOP() #else #define COMPUTEQUANTWEIGHTS_START() #define COMPUTEQUANTWEIGHTS_STOP() #endif #if TM_PROFILE_LSPQUANT #define LSPQUANT_START() PROFILE_START() #define LSPQUANT_STOP() PROFILE_STOP() #else #define LSPQUANT_START() #define LSPQUANT_STOP() #endif #if TM_PROFILE_LSPWEIGHTQUANT #define LSPWEIGHTQUANT_START() PROFILE_START() #define LSPWEIGHTQUANT_STOP() PROFILE_STOP() #else #define LSPWEIGHTQUANT_START() #define LSPWEIGHTQUANT_STOP() #endif #if TM_PROFILE_FIRMEM16 #define FIRMEM16_START() PROFILE_START() #define FIRMEM16_STOP() PROFILE_STOP() #else #define FIRMEM16_START() #define FIRMEM16_STOP() #endif #if TM_PROFILE_IIRMEM16 #define IIRMEM16_START() PROFILE_START() #define IIRMEM16_STOP() PROFILE_STOP() #else #define IIRMEM16_START() #define IIRMEM16_STOP() #endif #if TM_PROFILE_FILTERMEM16 #define FILTERMEM16_START() PROFILE_START() #define FILTERMEM16_STOP() PROFILE_STOP() #else #define FILTERMEM16_START() #define FILTERMEM16_STOP() #endif #if TM_PROFILE_COMPUTERMS16 #define COMPUTERMS16_START() PROFILE_START() #define COMPUTERMS16_STOP() PROFILE_STOP() #else #define COMPUTERMS16_START() #define COMPUTERMS16_STOP() #endif #if TM_PROFILE_NORMALIZE16 #define NORMALIZE16_START() PROFILE_START() #define NORMALIZE16_STOP() PROFILE_STOP() #else #define NORMALIZE16_START() #define NORMALIZE16_STOP() #endif #if TM_PROFILE_BWLPC #define BWLPC_START() PROFILE_START() #define BWLPC_STOP() PROFILE_STOP() #else #define BWLPC_START() #define BWLPC_STOP() #endif #if TM_PROFILE_HIGHPASS #define HIGHPASS_START() PROFILE_START() #define HIGHPASS_STOP() PROFILE_STOP() #else #define HIGHPASS_START() #define HIGHPASS_STOP() #endif #if TM_PROFILE_SIGNALMUL #define SIGNALMUL_START() PROFILE_START() #define SIGNALMUL_STOP() PROFILE_STOP() #else #define SIGNALMUL_START() #define SIGNALMUL_STOP() #endif #if TM_PROFILE_SIGNALDIV #define SIGNALDIV_START() PROFILE_START() #define SIGNALDIV_STOP() PROFILE_STOP() #else #define SIGNALDIV_START() #define SIGNALDIV_STOP() #endif #if TM_PROFILE_COMPUTEIMPULSERESPONSE #define COMPUTEIMPULSERESPONSE_START() PROFILE_START() #define COMPUTEIMPULSERESPONSE_STOP() PROFILE_STOP() #else #define COMPUTEIMPULSERESPONSE_START() #define COMPUTEIMPULSERESPONSE_STOP() #endif #if TM_PROFILE_COMPUTEWEIGHTEDCODEBOOK #define COMPUTEWEIGHTEDCODEBOOK_START() PROFILE_START() #define COMPUTEWEIGHTEDCODEBOOK_STOP() PROFILE_STOP() #else #define COMPUTEWEIGHTEDCODEBOOK_START() #define COMPUTEWEIGHTEDCODEBOOK_STOP() #endif #if TM_PROFILE_TARGETUPDATE #define TARGETUPDATE_START() PROFILE_START() #define TARGETUPDATE_STOP() PROFILE_STOP() #else #define TARGETUPDATE_START() #define TARGETUPDATE_STOP() #endif #if TM_PROFILE_VQNBEST #define VQNBEST_START() PROFILE_START() #define VQNBEST_STOP() PROFILE_STOP() #else #define VQNBEST_START() #define VQNBEST_STOP() #endif #if TM_PROFILE_VQNBESTSIGN #define VQNBESTSIGN_START() PROFILE_START() #define VQNBESTSIGN_STOP() PROFILE_STOP() #else #define VQNBESTSIGN_START() #define VQNBESTSIGN_STOP() #endif #if TM_PROFILE_PREPROCESSANALYSIS #define PREPROCESSANAYLSIS_START() PROFILE_START() #define PREPROCESSANAYLSIS_STOP() PROFILE_STOP() #else #define PREPROCESSANAYLSIS_START() #define PREPROCESSANAYLSIS_STOP() #endif #if TM_PROFILE_UPDATENOISEPROB #define UPDATENOISEPROB_START() PROFILE_START() #define UPDATENOISEPROB_STOP() PROFILE_STOP() #else #define UPDATENOISEPROB_START() #define UPDATENOISEPROB_STOP() #endif #if TM_PROFILE_COMPUTEGAINFLOOR #define COMPUTEGAINFLOOR_START() PROFILE_START() #define COMPUTEGAINFLOOR_STOP() PROFILE_STOP() #else #define COMPUTEGAINFLOOR_START() #define COMPUTEGAINFLOOR_STOP() #endif #if TM_PROFILE_FILTERDCNOTCH16 #define FILTERDCNOTCH16_START() PROFILE_START() #define FILTERDCNOTCH16_STOP() PROFILE_STOP() #else #define FILTERDCNOTCH16_START() #define FILTERDCNOTCH16_STOP() #endif #if TM_PROFILE_MDFINNERPROD #define MDFINNERPROD_START() PROFILE_START() #define MDFINNERPROD_STOP() PROFILE_STOP() #else #define MDFINNERPROD_START() #define MDFINNERPROD_STOP() #endif #if TM_PROFILE_SPECTRALMULACCUM #define SPECTRALMULACCUM_START() PROFILE_START() #define SPECTRALMULACCUM_STOP() PROFILE_STOP() #else #define SPECTRALMULACCUM_START() #define SPECTRALMULACCUM_STOP() #endif #if TM_PROFILE_WEIGHTEDSPECTRALMULCONJ #define WEIGHTEDSPECTRALMULCONJ_START() PROFILE_START() #define WEIGHTEDSPECTRALMULCONJ_STOP() PROFILE_STOP() #else #define WEIGHTEDSPECTRALMULCONJ_START() #define WEIGHTEDSPECTRALMULCONJ_STOP() #endif #if TM_PROFILE_MDFADJUSTPROP #define MDFADJUSTPROP_START() PROFILE_START() #define MDFADJUSTPROP_STOP() PROFILE_STOP() #else #define MDFADJUSTPROP_START() #define MDFADJUSTPROP_STOP() #endif #if TM_PROFILE_SPEEXECHOGETRESIDUAL #define SPEEXECHOGETRESIDUAL_START() PROFILE_START() #define SPEEXECHOGETRESIDUAL_STOP() PROFILE_STOP() #else #define SPEEXECHOGETRESIDUAL_START() #define SPEEXECHOGETRESIDUAL_STOP() #endif #if TM_PROFILE_LSPENFORCEMARGIN #define LSPENFORCEMARGIN_START() PROFILE_START() #define LSPENFORCEMARGIN_STOP() PROFILE_STOP() #else #define LSPENFORCEMARGIN_START() #define LSPENFORCEMARGIN_STOP() #endif #if TM_PROFILE_LSPTOLPC #define LSPTOLPC_START() PROFILE_START() #define LSPTOLPC_STOP() PROFILE_STOP() #else #define LSPTOLPC_START() #define LSPTOLPC_STOP() #endif #if TM_PROFILE_MAXIMIZERANGE #define MAXIMIZERANGE_START() PROFILE_START() #define MAXIMIZERANGE_STOP() PROFILE_STOP() #else #define MAXIMIZERANGE_START() #define MAXIMIZERANGE_STOP() #endif #if TM_PROFILE_RENORMRANGE #define RENORMRANGE_START() PROFILE_START() #define RENORMRANGE_STOP() PROFILE_STOP() #else #define RENORMRANGE_START() #define RENORMRANGE_STOP() #endif #if TM_PROFILE_POWERSPECTRUM #define POWERSPECTRUM_START() PROFILE_START() #define POWERSPECTRUM_STOP() PROFILE_STOP() #else #define POWERSPECTRUM_START() #define POWERSPECTRUM_STOP() #endif #if TM_PROFILE_QMFSYNTH #define QMFSYNTH_START() PROFILE_START() #define QMFSYNTH_STOP() PROFILE_STOP() #else #define QMFSYNTH_START() #define QMFSYNTH_STOP() #endif #if TM_PROFILE_QMFDECOMP #define QMFDECOMP_START() PROFILE_START() #define QMFDECOMP_STOP() PROFILE_STOP() #else #define QMFDECOMP_START() #define QMFDECOMP_STOP() #endif #if TM_PROFILE_FILTERBANKCOMPUTEBANK32 #define FILTERBANKCOMPUTEBANK32_START() PROFILE_START() #define FILTERBANKCOMPUTEBANK32_STOP() PROFILE_STOP() #else #define FILTERBANKCOMPUTEBANK32_START() #define FILTERBANKCOMPUTEBANK32_STOP() #endif #if TM_PROFILE_FILTERBANKCOMPUTEPSD16 #define FILTERBANKCOMPUTEPSD16_START() PROFILE_START() #define FILTERBANKCOMPUTEPSD16_STOP() PROFILE_STOP() #else #define FILTERBANKCOMPUTEPSD16_START() #define FILTERBANKCOMPUTEPSD16_STOP() #endif mumble-1.3.4/3rdparty/speexdsp-src/tmv/kiss_fftr_tm.h0000664000175000017500000001513714010707343022507 0ustar builderbuilder/* Copyright (C) 2007 Hong Zhiqian */ /** @file kiss_fftr_tm.h @author Hong Zhiqian @brief Various compatibility routines for Speex (TriMedia version) */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "_kiss_fft_guts_tm.h" #ifdef TM_ASM #include "profile_tm.h" #ifdef FIXED_POINT #define TM_NDIV(res,c,frac) \ { register int c1, c0; \ \ c1 = -asri(16,(c)); \ c0 = sex16((c)); \ (res) = pack16lsb(sround(c1 * (32767/(frac))), sround(c0 * (32767/(frac))));\ } #define OVERRIDE_KISS_FFTR void kiss_fftr(kiss_fftr_cfg st,const kiss_fft_scalar * restrict timedata, kiss_fft_cpx * restrict freqdata) { register int ncfft, ncfft2, k; register int * restrict tmpbuf; register int * restrict twiddles; ncfft = st->substate->nfft; ncfft2 = ncfft >> 1; tmpbuf = (int*)st->tmpbuf; twiddles = (int*)st->super_twiddles; TMDEBUG_ALIGNMEM(timedata); TMDEBUG_ALIGNMEM(freqdata); TMDEBUG_ALIGNMEM(tmpbuf); TMDEBUG_ALIGNMEM(twiddles); kiss_fft(st->substate , (const kiss_fft_cpx*)timedata, st->tmpbuf); { register int tdcr, tdci; tdcr = sround(st->tmpbuf[0].r * (32767/2)); tdci = sround(st->tmpbuf[0].i * (32767/2)); freqdata[0].r = tdcr + tdci; freqdata[ncfft].r = tdcr - tdci; freqdata[ncfft].i = freqdata[0].i = 0; } for ( k=1 ; k <= ncfft2 ; ++k ) { register int fpk, fpnk, i, tw, f1k, f2k; register int fq1, fq2; i = ncfft-k; fpk = ld32x(tmpbuf,k); tw = ld32x(twiddles,k); fpnk = ld32x(tmpbuf,i); TM_DIV(fpk, fpk, 2); TM_NDIV(fpnk,fpnk,2); TM_ADD( f1k, fpk , fpnk ); TM_SUB( f2k, fpk , fpnk ); TM_MUL( tw , f2k, tw ); TM_ADD( fq1, f1k, tw ); TM_SHR( fq1, fq1, 1 ); TM_SUB( fq2, f1k, tw ); TM_NEGMSB( fq2, fq2 ); TM_SHR( fq2, fq2, 1 ); st32d( k<<2, freqdata, fq1 ); st32d( i<<2, freqdata, fq2 ); } } #define OVERRIDE_KISS_FFTRI void kiss_fftri(kiss_fftr_cfg st,const kiss_fft_cpx * restrict freqdata,kiss_fft_scalar * restrict timedata) { register int k, ncfft, ncfft2; register int * restrict tmpbuf; register int * restrict twiddles; ncfft = st->substate->nfft; ncfft2 = ncfft >> 1; tmpbuf = (int*)st->tmpbuf; twiddles = (int*)st->super_twiddles; TMDEBUG_ALIGNMEM(freqdata); TMDEBUG_ALIGNMEM(timedata); TMDEBUG_ALIGNMEM(tmpbuf); TMDEBUG_ALIGNMEM(twiddles); { register int fqr, fqnr; fqr = freqdata[0].r; fqnr = freqdata[ncfft].r; st->tmpbuf[0].r = fqr + fqnr; st->tmpbuf[0].i = fqr - fqnr; } for ( k=1 ; k <= ncfft2 ; ++k ) { register int fk, fnkc, i, tw, fek, fok, tmp; register int tbk, tbn; i = ncfft-k; fk = ld32x(freqdata,k); tw = ld32x(twiddles,k); fnkc = pack16lsb(-freqdata[i].i, freqdata[i].r); TM_ADD (fek, fk, fnkc); TM_SUB (tmp, fk, fnkc); TM_MUL (fok, tmp, tw ); TM_ADD (tbk, fek, fok); TM_SUB (tbn, fek, fok); TM_NEGMSB(tbn, tbn); st32d(k<<2, tmpbuf, tbk); st32d(i<<2, tmpbuf, tbn); } kiss_fft (st->substate, st->tmpbuf, (kiss_fft_cpx *) timedata); } #else #define OVERRIDE_KISS_FFTR void kiss_fftr(kiss_fftr_cfg st,const kiss_fft_scalar * restrict timedata,kiss_fft_cpx * restrict freqdata) { register kiss_fft_cpx fpnk, fpk, f1k, f2k, twk; register int k, ncfft; register kiss_fft_cpx * restrict tmpbuf, * restrict tw; register float tdcr, tdci; ncfft = st->substate->nfft; tmpbuf= st->tmpbuf; tw = st->super_twiddles; kiss_fft( st->substate , (const kiss_fft_cpx*)timedata, tmpbuf ); tdcr = tmpbuf[0].r; tdci = tmpbuf[0].i; freqdata[0].r = tdcr + tdci; freqdata[ncfft].r = tdcr - tdci; freqdata[ncfft].i = freqdata[0].i = 0; for ( k=1;k <= ncfft/2 ; ++k ) { fpk = tmpbuf[k]; fpnk.r = tmpbuf[ncfft-k].r; fpnk.i = -tmpbuf[ncfft-k].i; C_ADD( f1k, fpk , fpnk ); C_SUB( f2k, fpk , fpnk ); C_MUL( twk, f2k , tw[k]); freqdata[k].r = HALF_OF(f1k.r + twk.r); freqdata[k].i = HALF_OF(f1k.i + twk.i); freqdata[ncfft-k].r = HALF_OF(f1k.r - twk.r); freqdata[ncfft-k].i = HALF_OF(twk.i - f1k.i); } } #define OVERRIDE_KISS_FFTRI void kiss_fftri(kiss_fftr_cfg st,const kiss_fft_cpx * restrict freqdata,kiss_fft_scalar * restrict timedata) { register int k, ncfft; register kiss_fft_cpx * restrict tmpbuf, * restrict tw; ncfft = st->substate->nfft; tmpbuf= st->tmpbuf; tw = st->super_twiddles; tmpbuf[0].r = freqdata[0].r + freqdata[ncfft].r; tmpbuf[0].i = freqdata[0].r - freqdata[ncfft].r; for (k = 1; k <= ncfft / 2; ++k) { register kiss_fft_cpx fk, fnkc, fek, fok, tmp; fk = freqdata[k]; fnkc.r = freqdata[ncfft - k].r; fnkc.i = -freqdata[ncfft - k].i; C_ADD (fek, fk, fnkc); C_SUB (tmp, fk, fnkc); C_MUL (fok,tmp,tw[k]); C_ADD (tmpbuf[k],fek, fok); C_SUB (tmp, fek, fok); tmpbuf[ncfft - k].r = tmp.r; tmpbuf[ncfft - k].i = -tmp.i; } kiss_fft (st->substate, st->tmpbuf, (kiss_fft_cpx *) timedata); } #endif #endif mumble-1.3.4/3rdparty/speexdsp-src/tmv/filterbank_tm.h0000664000175000017500000001736114010707343022637 0ustar builderbuilder/* Copyright (C) 2007 Hong Zhiqian */ /** @file filterbank_tm.h @author Hong Zhiqian @brief Various compatibility routines for Speex (TriMedia version) */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include "profile_tm.h" #ifdef FIXED_POINT #define OVERRIDE_FILTERBANK_COMPUTE_BANK32 void filterbank_compute_bank32(FilterBank * restrict bank, spx_word32_t * restrict ps, spx_word32_t * restrict mel) { register int i, j, k, banks, len, zero, s; register int * restrict left; register int * restrict right; register int * restrict bleft; register int * restrict bright; left = (int*)bank->filter_left; right = (int*)bank->filter_right; bleft = (int*)bank->bank_left; bright = (int*)bank->bank_right; TMDEBUG_ALIGNMEM(ps); TMDEBUG_ALIGNMEM(mel); TMDEBUG_ALIGNMEM(left); TMDEBUG_ALIGNMEM(right); TMDEBUG_ALIGNMEM(bleft); TMDEBUG_ALIGNMEM(bright); FILTERBANKCOMPUTEBANK32_START(); banks = bank->nb_banks << 2; zero = 0; len = bank->len; s = (1<<((15))>>1); #if (TM_UNROLL && TM_UNROLL_FILTERBANKCOMPUTEBANK32) #pragma TCS_unroll=2 #pragma TCS_unrollexact=1 #endif for ( i=0 ; i> 15; ps0_lsb = ps0 & 0x00007fff; left0 = sex16(left10); right0 = sex16(right10); _mel += left0 * ps0_msb + ((left0 * ps0_lsb + s ) >> 15); mel[il0]= _mel; _mel = ld32x(mel,ir0); _mel += right0 * ps0_msb + ((right0 * ps0_lsb + s ) >> 15); mel[ir0]= _mel; ps1 = ld32x(ps,j); il1 = ld32x(bleft,j); _mel = ld32x(mel,il1); ir1 = ld32x(bright,j); left1 = asri(16,left10); right1 = asri(16,right10); ps1_msb = ps1 >> 15; ps1_lsb = ps1 & 0x00007fff; _mel += left1 * ps1_msb + ((left1 * ps1_lsb + s ) >> 15); mel[il1]= _mel; _mel = ld32x(mel,ir1); _mel += right1 * ps1_msb + ((right1 * ps1_lsb + s ) >> 15); mel[ir1]= _mel; } #if (TM_UNROLL && TM_UNROLL_FILTERBANKCOMPUTEBANK32) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif FILTERBANKCOMPUTEBANK32_STOP(); } #define OVERRIDE_FILTERBANK_COMPUTE_PSD16 void filterbank_compute_psd16(FilterBank * restrict bank, spx_word16_t * restrict mel, spx_word16_t * restrict ps) { register int i, j, k, len, s; register int * restrict left; register int * restrict right; register int * restrict bleft; register int * restrict bright; left = (int*)bank->filter_left; right = (int*)bank->filter_right; bleft = (int*)bank->bank_left; bright = (int*)bank->bank_right; TMDEBUG_ALIGNMEM(ps); TMDEBUG_ALIGNMEM(mel); TMDEBUG_ALIGNMEM(left); TMDEBUG_ALIGNMEM(right); TMDEBUG_ALIGNMEM(bleft); TMDEBUG_ALIGNMEM(bright); FILTERBANKCOMPUTEPSD16_START(); len = bank->len; s = (1<<((15))>>1); #if (TM_UNROLL && TM_UNROLL_FILTERBANKCOMPUTEPSD16) #pragma TCS_unroll=2 #pragma TCS_unrollexact=1 #endif for ( i=0,j=0,k=0 ; i>= 15; il1 = ld32x(bleft, i+1); ir1 = ld32x(bright,i+1); mell1 = mel[il1]; melr1 = mel[ir1]; mel1 = pack16lsb(mell1, melr1); lr1 = pack16msb(left10, right10); acc1 += ifir16(mel1, lr1); acc1 >>= 15; ps10 = pack16lsb(acc1, acc0); st32d(j, ps, ps10); } #if (TM_UNROLL && TM_UNROLL_FILTERBANKCOMPUTEPSD16) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif FILTERBANKCOMPUTEPSD16_STOP(); } #else #define OVERRIDE_FILTERBANK_COMPUTE_BANK32 void filterbank_compute_bank32(FilterBank * restrict bank, float * restrict ps, float * restrict mel) { register int i, banks, len; register int * restrict bleft, * restrict bright; register float * restrict left, * restrict right; banks = bank->nb_banks; len = bank->len; bleft = bank->bank_left; bright= bank->bank_right; left = bank->filter_left; right = bank->filter_right; FILTERBANKCOMPUTEBANK32_START(); memset(mel, 0, banks * sizeof(float)); #if (TM_UNROLL && TM_UNROLL_FILTERBANKCOMPUTEBANK32) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( i=0 ; ilen; bleft = bank->bank_left; bright= bank->bank_right; left = bank->filter_left; right = bank->filter_right; FILTERBANKCOMPUTEPSD16_START(); #if (TM_UNROLL && TM_UNROLL_FILTERBANKCOMPUTEPSD16) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( i=0 ; i #include "profile_tm.h" // shifted power spectrum to fftwrap.c so that optimisation can be shared between mdf.c and preprocess.c #define OVERRIDE_POWER_SPECTRUM #ifdef FIXED_POINT #else #define OVERRIDE_FILTER_DC_NOTCH16 void filter_dc_notch16( const spx_int16_t * restrict in, float radius, float * restrict out, int len, float * restrict mem ) { register int i; register float den2, r1; register float mem0, mem1; FILTERDCNOTCH16_START(); r1 = 1 - radius; den2 = (radius * radius) + (0.7 * r1 * r1); mem0 = mem[0]; mem1 = mem[1]; #if (TM_UNROLL && TM_UNROLL_FILTERDCNOTCH16) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( i=0 ; i>= 1; #if (TM_UNROLL && TM_UNROLL_MDFINNERPRODUCT) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif while(len--) { register float acc0, acc1; acc0 = (*x++) * (*y++); acc1 = (*x++) * (*y++); sum += acc0 + acc1; } #if (TM_UNROLL && TM_UNROLL_MDFINNERPRODUCT) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif MDFINNERPROD_STOP(); return sum; } #define OVERRIDE_SPECTRAL_MUL_ACCUM void spectral_mul_accum( const float * restrict X, const float * restrict Y, float * restrict acc, int N, int M ) { register int i, j; register float Xi, Yi, Xii, Yii; register int _N; SPECTRALMULACCUM_START(); acc[0] = X[0] * Y[0]; _N = N-1; for ( i=1 ; i<_N ; i+=2 ) { Xi = X[i]; Yi = Y[i]; Xii = X[i+1]; Yii = Y[i+1]; acc[i] = (Xi * Yi - Xii * Yii); acc[i+1]= (Xii * Yi + Xi * Yii); } acc[_N] = X[_N] * Y[_N]; for ( j=1,X+=N,Y+=N ; j max_sum, propi, max_sum); } for ( i=0 ; iwindow; last_y = st->last_y; y = st->y; N = st->window_size; #if (TM_UNROLL && TM_UNROLL_SPEEXECHOGETRESIDUAL) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for (i=0;ifft_table, st->y, st->Y); power_spectrum(st->Y, residual_echo, N); leake = st->leak_estimate; leak2 = fmux(leake > .5, 1, 2 * leake); N = st->frame_size; #if (TM_UNROLL && TM_UNROLL_SPEEXECHOGETRESIDUAL) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( i=0 ; ipreemph; register spx_word16_t memX = st->memX; register spx_word16_t memD = st->memD; register spx_word16_t * restrict input = st->input; register int i; #ifdef FIXED_POINT register int saturated = st->saturated; #endif #if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( i=0 ; i 32767, M+1, saturated); tmp32 = iclipi(tmp32,32767); #endif x[i] = EXTRACT16(tmp32); memX = far_endi; tmp32 = SUB32(EXTEND32(inputi), EXTEND32(MULT16_16_P15(preemph, memD))); #ifdef FIXED_POINT saturated = mux( ((tmp32 > 32767) && (saturated == 0)), 1, mux( ((tmp32 <-32767) && (saturated == 0)), 1, saturated )); tmp32 = iclipi(tmp32,32767); #endif memD = inputi; input[i] = tmp32; } #if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif st->memD = memD; st->memX = memX; #ifdef FIXED_POINT st->saturated = saturated; #endif } void mdf_sub( spx_word16_t * restrict dest, const spx_word16_t * restrict src1, const spx_word16_t * restrict src2, int framesize ) { register int i; #if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif #ifdef FIXED_POINT for ( i=0,framesize<<=1 ; iPHI; for (j=M-1;j>=0;j--) { register spx_word32_t * restrict W = &(st->W[j*N]); weighted_spectral_mul_conj( st->power_1, FLOAT_SHL(PSEUDOFLOAT(st->prop[j]),-15), &X[(j+1)*N], st->E, st->PHI, N); #if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for (i=0;icancel_count; register spx_word16_t * restrict wtmp = st->wtmp; #ifdef FIXED_POINT register spx_word16_t * restrict wtmp2 = st->wtmp2; register int i; #endif for ( j=0 ; jW[j*N]); if (j==0 || cancel_count%(M-1) == j-1) { #ifdef FIXED_POINT #if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( i=0 ; ifft_table, wtmp2, wtmp); memset(wtmp, 0, framesize * sizeof(spx_word16_t)); #if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for (j=framesize; jfft_table, wtmp, wtmp2); #if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for (i=0;ifft_table, W, wtmp); memset(&wtmp[framesize], 0, (N-framesize) * sizeof(spx_word16_t)); spx_fft(st->fft_table, wtmp, W); #endif } } } #ifdef TWO_PATH // first four parameters is passed by registers // generate faster performance with 4 parameters functions spx_word32_t mdf_update_foreground( SpeexEchoState * restrict st, spx_word32_t Dbf, spx_word32_t Sff, spx_word32_t See ) { register spx_word32_t Davg1 = st->Davg1; register spx_word32_t Davg2 = st->Davg2; register spx_word32_t Dvar1 = st->Dvar1; register spx_word32_t Dvar2 = st->Dvar2; register spx_word16_t * restrict input = st->input; register int framesize = st->frame_size; register spx_word16_t * restrict xx = st->x + framesize; register spx_word16_t * restrict y = st->y + framesize; register spx_word16_t * restrict ee = st->e + framesize; register int update_foreground; register int i; register int N = st->window_size; register int M = st->M; #ifdef FIXED_POINT register spx_word32_t sc0 = SUB32(Sff,See); register spx_float_t sc1 = FLOAT_MUL32U(Sff,Dbf); Davg1 = ADD32(MULT16_32_Q15(QCONST16(.6f,15),Davg1), MULT16_32_Q15(QCONST16(.4f,15),sc0)); Davg2 = ADD32(MULT16_32_Q15(QCONST16(.85f,15),Davg2), MULT16_32_Q15(QCONST16(.15f,15),sc0)); Dvar1 = FLOAT_ADD( FLOAT_MULT(VAR1_SMOOTH,Dvar1), FLOAT_MUL32U(MULT16_32_Q15(QCONST16(.4f,15),Sff), MULT16_32_Q15(QCONST16(.4f,15),Dbf))); Dvar2 = FLOAT_ADD( FLOAT_MULT(VAR2_SMOOTH,Dvar2), FLOAT_MUL32U(MULT16_32_Q15(QCONST16(.15f,15),Sff), MULT16_32_Q15(QCONST16(.15f,15),Dbf))); #else register spx_word32_t sc0 = Sff - See; register spx_word32_t sc1 = Sff * Dbf; Davg1 = .6*Davg1 + .4*sc0; Davg2 = .85*Davg2 + .15*sc0; Dvar1 = VAR1_SMOOTH*Dvar1 + .16*sc1; Dvar2 = VAR2_SMOOTH*Dvar2 + .0225*sc1; #endif update_foreground = mux( FLOAT_GT(FLOAT_MUL32U(sc0, VABS(sc0)), sc1), 1, mux( FLOAT_GT(FLOAT_MUL32U(Davg1, VABS(Davg1)), FLOAT_MULT(VAR1_UPDATE,(Dvar1))), 1, mux( FLOAT_GT(FLOAT_MUL32U(Davg2, VABS(Davg2)), FLOAT_MULT(VAR2_UPDATE,(Dvar2))), 1, 0))); if ( update_foreground ) { register spx_word16_t * restrict windowf = st->window + framesize; register spx_word16_t * restrict window = st->window; st->Davg1 = st->Davg2 = 0; st->Dvar1 = st->Dvar2 = FLOAT_ZERO; memcpy(st->foreground, st->W, N*M*sizeof(spx_word32_t)); #if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( i=0 ; iW, st->foreground, N*M*sizeof(spx_word32_t)); memcpy(y, ee, framesize * sizeof(spx_word16_t)); mdf_sub(xx,input,y,framesize); See = Sff; st->Davg1 = st->Davg2 = 0; st->Dvar1 = st->Dvar2 = FLOAT_ZERO; } else { st->Davg1 = Davg1; st->Davg2 = Davg2; st->Dvar1 = Dvar1; st->Dvar2 = Dvar2; } } return See; } #endif void mdf_compute_error_signal( SpeexEchoState * restrict st, const spx_int16_t * restrict in, spx_int16_t * restrict out, int framesize ) { register spx_word16_t preemph = st->preemph; register spx_word16_t memE = st->memE; register int saturated = st->saturated; register spx_word16_t * restrict e = st->e; register spx_word16_t * restrict ee = st->e + framesize; register spx_word16_t * restrict input = st->input; register spx_word16_t * restrict xx = st->x + framesize; register int i; #if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( i=0 ; i 32767, 32767, fmux( tmp_out < -32768, -32768, tmp_out)); #endif tmp_out = ADD32(tmp_out, EXTEND32(MULT16_16_P15(preemph,memE))); flg = iabs(ini) >= 32000; tmp_out = VMUX( flg, 0, tmp_out); saturated = mux( flg && (saturated == 0), 1, saturated); out[i] = (spx_int16_t)tmp_out; memE = tmp_out; } #if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif st->memE = memE; st->saturated = saturated; memset(e, 0, framesize * sizeof(spx_word16_t)); memcpy(ee, xx, framesize * sizeof(spx_word16_t)); } inline int mdf_check( SpeexEchoState * restrict st, spx_int16_t * out, spx_word32_t Syy, spx_word32_t Sxx, spx_word32_t See, spx_word32_t Sff, spx_word32_t Sdd ) { register int N = st->window_size; register spx_word32_t N1e9 = N * 1e9; register int screwed_up = st->screwed_up; register int framesize = st->frame_size; if (!(Syy>=0 && Sxx>=0 && See >= 0) #ifndef FIXED_POINT || !(Sff < N1e9 && Syy < N1e9 && Sxx < N1e9 ) #endif ) { screwed_up += 50; memset(out, 0, framesize * sizeof(spx_int16_t)); } else { screwed_up = mux( SHR32(Sff, 2) > ADD32(Sdd, SHR32(MULT16_16(N, 10000),6)), screwed_up+1, 0); } st->screwed_up = screwed_up; return screwed_up; } void mdf_smooth( spx_word32_t * restrict power, spx_word32_t * restrict Xf, int framesize, int M ) { register spx_word16_t ss, ss_1, pf, xff; register int j; #ifdef FIXED_POINT ss=DIV32_16(11469,M); ss_1 = SUB16(32767,ss); #else ss=.35/M; ss_1 = 1-ss; #endif #if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( j=0 ; jspec_average; register spx_word32_t * restrict pRf = st->Rf; register spx_word32_t * restrict pYf = st->Yf; register spx_word32_t * restrict pEh = st->Eh; register spx_word32_t * restrict pYh = st->Yh; register spx_word16_t beta0 = st->beta0; register spx_word16_t beta_max = st->beta_max; register spx_float_t alpha, alpha_1; register spx_word32_t tmp32, tmpx; register spx_float_t sPey = st->Pey; register spx_float_t sPyy = st->Pyy; register spx_float_t tmp; register spx_word16_t leak_estimate; register int j; register spx_float_t Eh, Yh; register spx_word32_t _Ehj, _Rfj, _Yfj, _Yhj; #ifdef FIXED_POINT register spx_word16_t spec_average1 = SUB16(32767,spec_average); #else register spx_word16_t spec_average1 = 1 - spec_average; #endif #if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for (j=framesize; j>0 ; --j) { _Ehj = pEh[j]; _Rfj = pRf[j]; _Yfj = pYf[j]; _Yhj = pYh[j]; Eh = PSEUDOFLOAT(_Rfj - _Ehj); Yh = PSEUDOFLOAT(_Yfj - _Yhj); Pey = FLOAT_ADD(Pey,FLOAT_MULT(Eh,Yh)); Pyy = FLOAT_ADD(Pyy,FLOAT_MULT(Yh,Yh)); pEh[j] = MAC16_32_Q15(MULT16_32_Q15(spec_average1, _Ehj), spec_average, _Rfj); pYh[j] = MAC16_32_Q15(MULT16_32_Q15(spec_average1, _Yhj), spec_average, _Yfj); } #if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif _Ehj = pEh[0]; _Rfj = pRf[0]; _Yfj = pYf[0]; _Yhj = pYh[0]; Eh = PSEUDOFLOAT(_Rfj - _Ehj); Yh = PSEUDOFLOAT(_Yfj - _Yhj); Pey = FLOAT_ADD(Pey,FLOAT_MULT(Eh,Yh)); Pyy = FLOAT_ADD(Pyy,FLOAT_MULT(Yh,Yh)); pEh[0] = MAC16_32_Q15(MULT16_32_Q15(spec_average1, _Ehj), spec_average, _Rfj); pYh[0] = MAC16_32_Q15(MULT16_32_Q15(spec_average1, _Yhj), spec_average, _Yfj); Pyy = FLOAT_SQRT(Pyy); Pey = FLOAT_DIVU(Pey,Pyy); tmp32 = MULT16_32_Q15(beta0,Syy); tmpx = MULT16_32_Q15(beta_max,See); tmp32 = VMUX(tmp32 > tmpx, tmpx, tmp32); alpha = FLOAT_DIV32(tmp32, See); alpha_1 = FLOAT_SUB(FLOAT_ONE, alpha); sPey = FLOAT_ADD(FLOAT_MULT(alpha_1,sPey) , FLOAT_MULT(alpha,Pey)); sPyy = FLOAT_ADD(FLOAT_MULT(alpha_1,sPyy) , FLOAT_MULT(alpha,Pyy)); tmp = FLOAT_MULT(MIN_LEAK,sPyy); #ifndef FIXED_POINT sPyy = VMUX(FLOAT_LT(sPyy, FLOAT_ONE), FLOAT_ONE, sPyy); sPey = VMUX(FLOAT_LT(sPey, tmp), tmp, sPey); sPey = VMUX(FLOAT_LT(sPey, sPyy), sPey, sPyy); #else sPyy = FLOAT_LT(sPyy, FLOAT_ONE) ? FLOAT_ONE : sPyy; sPey = FLOAT_LT(sPey, tmp) ? tmp : sPey; sPey = FLOAT_LT(sPey, sPyy) ? sPey : sPyy; #endif leak_estimate = FLOAT_EXTRACT16(FLOAT_SHL(FLOAT_DIVU(sPey, sPyy),14)); leak_estimate = VMUX( leak_estimate > 16383, 32767, SHL16(leak_estimate,1)); st->Pey = sPey; st->Pyy = sPyy; st->leak_estimate = leak_estimate; } inline spx_word16_t mdf_compute_RER( spx_word32_t See, spx_word32_t Syy, spx_word32_t Sey, spx_word32_t Sxx, spx_word16_t leake ) { register spx_word16_t RER; #ifdef FIXED_POINT register spx_word32_t tmp32; register spx_word32_t tmp; spx_float_t bound = PSEUDOFLOAT(Sey); tmp32 = MULT16_32_Q15(leake,Syy); tmp32 = ADD32(SHR32(Sxx,13), ADD32(tmp32, SHL32(tmp32,1))); bound = FLOAT_DIVU(FLOAT_MULT(bound, bound), PSEUDOFLOAT(ADD32(1,Syy))); tmp = FLOAT_EXTRACT32(bound); tmp32 = imux( FLOAT_GT(bound, PSEUDOFLOAT(See)), See, imux( tmp32 < tmp, tmp, tmp32)); tmp = SHR32(See,1); tmp32 = imux(tmp32 > tmp, tmp, tmp32); RER = FLOAT_EXTRACT16(FLOAT_SHL(FLOAT_DIV32(tmp32,See),15)); #else register spx_word32_t r0; r0 = (Sey * Sey)/(1 + See * Syy); RER = (.0001*Sxx + 3.* MULT16_32_Q15(leake,Syy)) / See; RER = fmux( RER < r0, r0, RER); RER = fmux( RER > .5, .5, RER); #endif return RER; } void mdf_adapt( SpeexEchoState * restrict st, spx_word16_t RER, spx_word32_t Syy, spx_word32_t See, spx_word32_t Sxx ) { register spx_float_t * restrict power_1 = st->power_1; register spx_word32_t * restrict power = st->power; register int adapted = st->adapted; register spx_word32_t sum_adapt = st->sum_adapt; register spx_word16_t leake = st->leak_estimate; register int framesize = st->frame_size; register int i; register int M = st->M; adapted = mux( !adapted && sum_adapt > QCONST32(M,15) && MULT16_32_Q15(leake,Syy) > MULT16_32_Q15(QCONST16(.03f,15),Syy), 1, adapted); if ( adapted ) { register spx_word32_t * restrict Yf = st->Yf; register spx_word32_t * restrict Rf = st->Rf; register spx_word32_t r, e, e2; #if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for ( i=0 ; i e2, e2, r); #else e2 = e * .5; r = fmux( r > e2, e2, r); #endif r = MULT16_32_Q15(QCONST16(.7,15),r) + MULT16_32_Q15(QCONST16(.3,15),(spx_word32_t)(MULT16_32_Q15(RER,e))); power_1[i] = FLOAT_SHL(FLOAT_DIV32_FLOAT(r,FLOAT_MUL32U(e,power[i]+10)),WEIGHT_SHIFT+16); } #if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION) #pragma TCS_unrollexact=0 #pragma TCS_unroll=0 #endif r = SHL32(Yf[framesize],3); r = MULT16_32_Q15(leake,r); e = SHL32(Rf[framesize],3)+1; #ifdef FIXED_POINT e2 = SHR32(e,1); r = mux( r > e2, e2, r); #else e2 = e * .5; r = fmux( r > e2, e2, r); #endif r = MULT16_32_Q15(QCONST16(.7,15),r) + MULT16_32_Q15(QCONST16(.3,15),(spx_word32_t)(MULT16_32_Q15(RER,e))); power_1[framesize] = FLOAT_SHL(FLOAT_DIV32_FLOAT(r,FLOAT_MUL32U(e,power[framesize]+10)),WEIGHT_SHIFT+16); } else { register spx_word16_t adapt_rate=0; register int N = st->window_size; if ( Sxx > SHR32(MULT16_16(N, 1000),6) ) { register spx_word32_t tmp32, tmp32q; tmp32 = MULT16_32_Q15(QCONST16(.25f, 15), Sxx); #ifdef FIXED_POINT tmp32q = SHR32(See,2); tmp32 = mux(tmp32 > tmp32q, tmp32q, tmp32); #else tmp32q = 0.25 * See; tmp32 = fmux(tmp32 > tmp32q, tmp32q, tmp32); #endif adapt_rate = FLOAT_EXTRACT16(FLOAT_SHL(FLOAT_DIV32(tmp32, See),15)); } #if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION) #pragma TCS_unroll=4 #pragma TCS_unrollexact=1 #endif for (i=0;isum_adapt = sum_adapt; st->adapted = adapted; } #define OVERRIDE_ECHO_CANCELLATION void speex_echo_cancellation( SpeexEchoState * restrict st, const spx_int16_t * restrict in, const spx_int16_t * restrict far_end, spx_int16_t * restrict out ) { register int framesize = st->frame_size; register spx_word16_t * restrict x = st->x; register spx_word16_t * restrict xx = st->x + framesize; register spx_word16_t * restrict yy = st->y + framesize; register spx_word16_t * restrict ee = st->e + framesize; register spx_word32_t Syy, See, Sxx, Sdd, Sff; register spx_word16_t RER; register spx_word32_t Sey; register int j; register int N,M; #ifdef TWO_PATH register spx_word32_t Dbf; #endif N = st->window_size; M = st->M; st->cancel_count++; filter_dc_notch16(in, st->notch_radius, st->input, framesize, st->notch_mem); mdf_preemph(st, xx, far_end, framesize); { register spx_word16_t * restrict X = st->X; for ( j=M-1 ; j>=0 ; j-- ) { register spx_word16_t * restrict Xdes = &(X[(j+1)*N]); register spx_word16_t * restrict Xsrc = &(X[j*N]); memcpy(Xdes, Xsrc, N * sizeof(spx_word16_t)); } spx_fft(st->fft_table, x, X); memcpy(st->last_y, st->x, N * sizeof(spx_word16_t)); Sxx = mdf_inner_prod(xx, xx, framesize); memcpy(x, xx, framesize * sizeof(spx_word16_t)); #ifdef TWO_PATH spectral_mul_accum(st->X, st->foreground, st->Y, N, M); spx_ifft(st->fft_table, st->Y, st->e); mdf_sub(xx, st->input, ee, framesize); Sff = mdf_inner_prod(xx, xx, framesize); #endif mdf_adjust_prop (st->W, N, M, st->prop); if (st->saturated == 0) { mdf_compute_weight_gradient(st, X, N, M); } else { st->saturated--; } } mdf_update_weight(st, N, M, framesize); spectral_mul_accum(st->X, st->W, st->Y, N, M); spx_ifft(st->fft_table, st->Y, st->y); #ifdef TWO_PATH mdf_sub(xx, ee, yy, framesize); Dbf = 10+mdf_inner_prod(xx, xx, framesize); #endif mdf_sub(xx, st->input, yy, framesize); See = mdf_inner_prod(xx, xx, framesize); #ifndef TWO_PATH Sff = See; #else See = mdf_update_foreground(st,Dbf,Sff,See); #endif mdf_compute_error_signal(st, in, out, framesize); Sey = mdf_inner_prod(ee, yy, framesize); Syy = mdf_inner_prod(yy, yy, framesize); Sdd = mdf_inner_prod(st->input, st->input, framesize); if ( mdf_check(st,out,Syy,Sxx,See,Sff,Sdd) >= 50 ) { speex_warning("The echo canceller started acting funny and got slapped (reset). It swears it will behave now."); speex_echo_state_reset(st); return; } See = MAX32(See, SHR32(MULT16_16(N, 100),6)); spx_fft(st->fft_table, st->e, st->E); memset(st->y, 0, framesize * sizeof(spx_word16_t)); spx_fft(st->fft_table, st->y, st->Y); power_spectrum(st->E, st->Rf, N); power_spectrum(st->Y, st->Yf, N); power_spectrum(st->X, st->Xf, N); mdf_smooth(st->power,st->Xf,framesize, M); mdf_compute_filtered_spectra_crosscorrelations(st,Syy,See,framesize); RER = mdf_compute_RER(See,Syy,Sey,Sxx,st->leak_estimate); mdf_adapt(st, RER, Syy, See, Sxx); if ( st->adapted ) { register spx_word16_t * restrict last_yy = st->last_y + framesize; memcpy(st->last_y, last_yy, framesize * sizeof(spx_word16_t)); mdf_sub_int(last_yy, in, out, framesize); } } mumble-1.3.4/3rdparty/speexdsp-src/tmv/_kiss_fft_guts_tm.h0000664000175000017500000001317614010707343023527 0ustar builderbuilder/* Copyright (C) 2007 Hong Zhiqian */ /** @file _kiss_fft_guts_tm.h @author Hong Zhiqian @brief Various compatibility routines for Speex (TriMedia version) */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _KISS_FFT_GUTS_TM_ #define _KISS_FFT_GUTS_TM_ #ifdef TM_ASM #include #ifdef FIXED_POINT #undef sround #define sround(x) sex16(((x) + (1<<(FRACBITS-1)) ) >> FRACBITS) #undef MIN #undef MAX #define MIN(a,b) imin(a,b) #define MAX(a,b) imax(a,b) #define TM_MUL(res,a,b) \ { register int a0, a1, b0, b1; \ \ a0 = sex16((a)); \ a1 = asri(16,(a)); \ b0 = sex16((b)); \ b1 = asri(16,(b)); \ (res)= pack16lsb( \ sround(ifir16((a),funshift2((b),(b)))), \ sround(a0*b0-a1*b1)); \ } \ #define TM_ADD(res,a,b) \ { (res)=dspidualadd((a),(b)); \ } \ #define TM_SUB(res,a,b) \ { (res)=dspidualsub((a),(b)); \ } \ #define TM_SHR(res,a,shift) \ { (res)=dualasr((a),(shift)); \ } \ #define TM_DIV(res,c,frac) \ { register int c1, c0; \ \ c1 = asri(16,(c)); \ c0 = sex16((c)); \ (res) = pack16lsb(sround(c1 * (32767/(frac))), sround(c0 * (32767/(frac))));\ } \ #define TM_NEGMSB(res, a) \ { (res) = pack16lsb((ineg(asri(16,(a)))), (a)); \ } \ #else #undef MIN #undef MAX #define MIN(a,b) fmin(a,b) #define MAX(a,b) fmax(a,b) #endif #endif #undef CHECKBUF #define CHECKBUF(buf,nbuf,n) \ { \ if ( nbuf < (size_t)(n) ) { \ speex_free(buf); \ buf = (kiss_fft_cpx*)KISS_FFT_MALLOC(sizeof(kiss_fft_cpx)*(n)); \ nbuf = (size_t)(n); \ } \ } \ #undef C_ADD #define C_ADD( res, a,b) \ { \ CHECK_OVERFLOW_OP((a).r,+,(b).r) \ CHECK_OVERFLOW_OP((a).i,+,(b).i) \ (res).r=(a).r+(b).r; (res).i=(a).i+(b).i; \ } \ #undef C_SUB #define C_SUB( res, a,b) \ { \ CHECK_OVERFLOW_OP((a).r,-,(b).r) \ CHECK_OVERFLOW_OP((a).i,-,(b).i) \ (res).r=(a).r-(b).r; (res).i=(a).i-(b).i; \ } \ #undef C_ADDTO #define C_ADDTO( res , a) \ { \ CHECK_OVERFLOW_OP((res).r,+,(a).r) \ CHECK_OVERFLOW_OP((res).i,+,(a).i) \ (res).r += (a).r; (res).i += (a).i; \ } \ #undef C_SUBFROM #define C_SUBFROM( res, a) \ { \ CHECK_OVERFLOW_OP((res).r,-,(a).r) \ CHECK_OVERFLOW_OP((res).i,-,(a).i) \ (res).r -= (a).r; (res).i -= (a).i; \ } \ #undef kf_cexp #define kf_cexp(x,phase) \ { (x)->r = KISS_FFT_COS(phase); \ (x)->i = KISS_FFT_SIN(phase); } \ #undef kf_cexp2 #define kf_cexp2(x,phase) \ { (x)->r = spx_cos_norm((phase)); \ (x)->i = spx_cos_norm((phase)-32768); } \ #ifdef FIXED_POINT #undef C_MUL #define C_MUL(m,a,b) \ { (m).r = sround( smul((a).r,(b).r) - smul((a).i,(b).i) ); \ (m).i = sround( smul((a).r,(b).i) + smul((a).i,(b).r) ); } \ #undef C_FIXDIV #define C_FIXDIV(c,div) \ { DIVSCALAR( (c).r , div); \ DIVSCALAR( (c).i , div); } \ #undef C_MULBYSCALAR #define C_MULBYSCALAR( c, s ) \ { (c).r = sround( smul( (c).r , s ) ) ; \ (c).i = sround( smul( (c).i , s ) ) ; } \ #else #undef C_MUL #define C_MUL(m,a,b) \ { (m).r = (a).r*(b).r - (a).i*(b).i; \ (m).i = (a).r*(b).i + (a).i*(b).r; } \ #undef C_MULBYSCALAR #define C_MULBYSCALAR( c, s ) \ { (c).r *= (s); \ (c).i *= (s); } \ #endif #endif mumble-1.3.4/3rdparty/speexdsp-src/regressions0000664000175000017500000000041614010707343021316 0ustar builderbuilder1: 723f644e09333a0230383eae4af1f3aa3e46e1c3 (r12736): broke resampler badly Changed the sign of a bunch of parameters in the API. Tons of signed/unsigned changes in the code as a consequence of that. Hopefully this will be the last change to the API. Fixed: 2007-08-11 mumble-1.3.4/3rdparty/speexdsp-src/README.win320000664000175000017500000000107214010707343020650 0ustar builderbuilderWin32 Specific options In order to enable the following options within SpeexDSP, you will need to manually edit the project options for the appropriate VC configuration. These macros can be specified by adding them as "Preprocessor Definitions" under the appropriate Configuration's project options. If you don't know how to do this, please check your Visual C documentation. Feature: Intel Streaming SIMD Extensions - SSE - macro: USE_SSE Fixed point - macro: FIXED_POINT Epic 48 - macro: EPIC_48K Note: USE_SSE and FIXED_POINT are mutually exclusive. mumble-1.3.4/3rdparty/speexdsp-src/win32/0000775000175000017500000000000014010707343017771 5ustar builderbuildermumble-1.3.4/3rdparty/speexdsp-src/win32/VS2003/0000775000175000017500000000000014010707343020626 5ustar builderbuildermumble-1.3.4/3rdparty/speexdsp-src/win32/VS2003/libspeexdsp.sln0000664000175000017500000002015214010707343023666 0ustar builderbuilderMicrosoft Visual Studio Solution File, Format Version 8.00 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testdenoise", "tests\testdenoise.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}" ProjectSection(ProjectDependencies) = postProject {03207781-0D1C-4DB3-A71D-45C608F28DBD} = {03207781-0D1C-4DB3-A71D-45C608F28DBD} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testecho", "tests\testecho.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}" ProjectSection(ProjectDependencies) = postProject {03207781-0D1C-4DB3-A71D-45C608F28DBD} = {03207781-0D1C-4DB3-A71D-45C608F28DBD} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testresample", "tests\testresample.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}" ProjectSection(ProjectDependencies) = postProject {03207781-0D1C-4DB3-A71D-45C608F28DBD} = {03207781-0D1C-4DB3-A71D-45C608F28DBD} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libspeexdsp", "libspeexdsp\libspeexdsp.vcproj", "{03207781-0D1C-4DB3-A71D-45C608F28DBD}" ProjectSection(ProjectDependencies) = postProject EndProjectSection EndProject Global GlobalSection(SolutionConfiguration) = preSolution Debug = Debug Release = Release Release_Dynamic_SSE = Release_Dynamic_SSE Release_Static_SSE = Release_Static_SSE EndGlobalSection GlobalSection(ProjectDependencies) = postSolution EndGlobalSection GlobalSection(ProjectConfiguration) = postSolution {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug.ActiveCfg = Debug|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug.Build.0 = Debug|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release.ActiveCfg = Release|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release.Build.0 = Release|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic_SSE.ActiveCfg = Release_Dynamic_SSE|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic_SSE.Build.0 = Release_Dynamic_SSE|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Static_SSE.ActiveCfg = Release_Static_SSE|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Static_SSE.Build.0 = Release_Static_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic_SSE.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic_SSE.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Static_SSE.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Static_SSE.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic_SSE.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic_SSE.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Static_SSE.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Static_SSE.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Dynamic_SSE.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Dynamic_SSE.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Static_SSE.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Static_SSE.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Dynamic_SSE.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Dynamic_SSE.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Static_SSE.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Static_SSE.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Dynamic_SSE.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Dynamic_SSE.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Static_SSE.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Static_SSE.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Dynamic_SSE.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Dynamic_SSE.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Static_SSE.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Static_SSE.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Dynamic_SSE.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Dynamic_SSE.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Static_SSE.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Static_SSE.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Dynamic_SSE.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Dynamic_SSE.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Static_SSE.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Static_SSE.Build.0 = Release_SSE|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug.ActiveCfg = Debug|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug.Build.0 = Debug|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release.ActiveCfg = Release|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release.Build.0 = Release|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_Dynamic_SSE.ActiveCfg = Release_Dynamic_SSE|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_Dynamic_SSE.Build.0 = Release_Dynamic_SSE|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_Static_SSE.ActiveCfg = Release_Static_SSE|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_Static_SSE.Build.0 = Release_Static_SSE|Win32 EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution EndGlobalSection GlobalSection(ExtensibilityAddIns) = postSolution EndGlobalSection EndGlobal mumble-1.3.4/3rdparty/speexdsp-src/win32/VS2003/libspeexdsp/0000775000175000017500000000000014010707343023150 5ustar builderbuildermumble-1.3.4/3rdparty/speexdsp-src/win32/VS2003/libspeexdsp/libspeexdsp.vcproj0000775000175000017500000002217114010707343026725 0ustar builderbuilder mumble-1.3.4/3rdparty/speexdsp-src/win32/VS2003/libspeexdsp/Makefile.am0000664000175000017500000000035214010707343025204 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies EXTRA_DIST = libspeexdsp.vcproj mumble-1.3.4/3rdparty/speexdsp-src/win32/VS2003/tests/0000775000175000017500000000000014010707343021770 5ustar builderbuildermumble-1.3.4/3rdparty/speexdsp-src/win32/VS2003/tests/testresample.vcproj0000664000175000017500000001334114010707343025727 0ustar builderbuilder mumble-1.3.4/3rdparty/speexdsp-src/win32/VS2003/tests/testecho.vcproj0000664000175000017500000001331514010707343025036 0ustar builderbuilder mumble-1.3.4/3rdparty/speexdsp-src/win32/VS2003/tests/Makefile.am0000664000175000017500000000041614010707343024025 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies EXTRA_DIST = testdenoise.vcproj testecho.vcproj testresample.vcproj mumble-1.3.4/3rdparty/speexdsp-src/win32/VS2003/tests/testdenoise.vcproj0000664000175000017500000001333414010707343025547 0ustar builderbuilder mumble-1.3.4/3rdparty/speexdsp-src/win32/VS2003/Makefile.am0000664000175000017500000000040214010707343022656 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies SUBDIRS = libspeexdsp tests EXTRA_DIST = libspeexdsp.sln mumble-1.3.4/3rdparty/speexdsp-src/win32/libspeexdsp.def0000775000175000017500000000266714010707343023011 0ustar builderbuilderLIBRARY libspeexdsp EXPORTS ; ; speex_buffer.h ; speex_buffer_init speex_buffer_destroy speex_buffer_write speex_buffer_writezeros speex_buffer_read speex_buffer_get_available speex_buffer_resize ; ; speex_echo.h ; speex_echo_state_init speex_echo_state_init_mc speex_echo_state_destroy speex_echo_cancellation speex_echo_cancel speex_echo_capture speex_echo_playback speex_echo_state_reset speex_echo_ctl speex_decorrelate_new speex_decorrelate speex_decorrelate_destroy ; ; speex_jitter.h ; jitter_buffer_init jitter_buffer_reset jitter_buffer_destroy jitter_buffer_put jitter_buffer_get jitter_buffer_get_pointer_timestamp jitter_buffer_tick jitter_buffer_update_delay ; ; speex_preprocess.h ; speex_preprocess_state_init speex_preprocess_state_destroy speex_preprocess_run speex_preprocess speex_preprocess_estimate_update speex_preprocess_ctl ; ; speex_resampler.h ; speex_resampler_init speex_resampler_init_frac speex_resampler_destroy speex_resampler_process_float speex_resampler_process_int speex_resampler_process_interleaved_float speex_resampler_process_interleaved_int speex_resampler_set_rate speex_resampler_get_rate speex_resampler_set_rate_frac speex_resampler_get_ratio speex_resampler_set_quality speex_resampler_get_quality speex_resampler_set_input_stride speex_resampler_get_input_stride speex_resampler_set_output_stride speex_resampler_get_output_stride speex_resampler_skip_zeros speex_resampler_reset_mem speex_resampler_strerror mumble-1.3.4/3rdparty/speexdsp-src/win32/libspeexdsp/0000775000175000017500000000000014010707343022313 5ustar builderbuildermumble-1.3.4/3rdparty/speexdsp-src/win32/libspeexdsp/libspeexdsp.dsw0000664000175000017500000000136614010707343025362 0ustar builderbuilderMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "libspeexdsp"=.\libspeexdsp.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libspeexdsp_dynamic"=.\libspeexdsp_dynamic.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### mumble-1.3.4/3rdparty/speexdsp-src/win32/libspeexdsp/libspeexdsp_dynamic.dsp0000775000175000017500000001563314010707343027064 0ustar builderbuilder# Microsoft Developer Studio Project File - Name="libspeexdsp_dynamic" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libspeexdsp_dynamic - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libspeexdsp_dynamic.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libspeexdsp_dynamic.mak" CFG="libspeexdsp_dynamic - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libspeexdsp_dynamic - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libspeexdsp_dynamic - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libspeexdsp_dynamic - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "libspeexdsp_dynamic___Win32_Release" # PROP BASE Intermediate_Dir "libspeexdsp_dynamic___Win32_Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Dynamic_Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBSPEEX_DYNAMIC_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /GX /O2 /I "../../include" /I "../" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"..\..\bin\libspeexdsp.dll" /implib:"..\..\lib\libspeexdsp.lib" !ELSEIF "$(CFG)" == "libspeexdsp_dynamic - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "libspeexdsp_dynamic___Win32_Debug" # PROP BASE Intermediate_Dir "libspeexdsp_dynamic___Win32_Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Dynamic_Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBSPEEX_DYNAMIC_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "../../include" /I "../" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "HAVE_CONFIG_H" /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /out:"..\..\bin\libspeexdsp.dll" /implib:"..\..\lib\libspeexdsp.lib" /pdbtype:sept !ENDIF # Begin Target # Name "libspeexdsp_dynamic - Win32 Release" # Name "libspeexdsp_dynamic - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\libspeex\buffer.c # End Source File # Begin Source File SOURCE=..\..\libspeex\fftwrap.c # End Source File # Begin Source File SOURCE=..\..\libspeex\filterbank.c # End Source File # Begin Source File SOURCE=..\..\libspeex\jitter.c # End Source File # Begin Source File SOURCE=..\..\libspeex\kiss_fft.c # End Source File # Begin Source File SOURCE=..\..\libspeex\kiss_fftr.c # End Source File # Begin Source File SOURCE=..\..\libspeex\mdf.c # End Source File # Begin Source File SOURCE=..\..\libspeex\preprocess.c # End Source File # Begin Source File SOURCE=..\..\libspeex\resample.c # End Source File # Begin Source File SOURCE=..\..\libspeex\scal.c # End Source File # Begin Source File SOURCE=..\..\libspeex\smallft.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\libspeex\_kiss_fft_guts.h # End Source File # Begin Source File SOURCE=..\..\libspeex\arch.h # End Source File # Begin Source File SOURCE=..\..\libspeex\fftwrap.h # End Source File # Begin Source File SOURCE=..\..\libspeex\filterbank.h # End Source File # Begin Source File SOURCE=..\..\libspeex\fixed_debug.h # End Source File # Begin Source File SOURCE=..\..\libspeex\fixed_generic.h # End Source File # Begin Source File SOURCE=..\..\libspeex\kiss_fft.h # End Source File # Begin Source File SOURCE=..\..\libspeex\kiss_fftr.h # End Source File # Begin Source File SOURCE=..\..\libspeex\math_approx.h # End Source File # Begin Source File SOURCE=..\..\libspeex\os_support.h # End Source File # Begin Source File SOURCE=..\..\libspeex\pseudofloat.h # End Source File # Begin Source File SOURCE=..\..\libspeex\smallft.h # End Source File # Begin Source File SOURCE=..\..\include\speex\speex_buffer.h # End Source File # End Group # Begin Group "Public Header Files" # PROP Default_Filter "" # Begin Source File SOURCE=..\..\include\speex\speex.h # End Source File # Begin Source File SOURCE=..\..\include\speex\speex_bits.h # End Source File # Begin Source File SOURCE=..\..\include\speex\speex_echo.h # End Source File # Begin Source File SOURCE=..\..\include\speex\speex_jitter.h # End Source File # Begin Source File SOURCE=..\..\include\speex\speex_preprocess.h # End Source File # Begin Source File SOURCE=..\..\include\speex\speex_resampler.h # End Source File # Begin Source File SOURCE=..\..\include\speex\speex_types.h # End Source File # End Group # Begin Source File SOURCE=..\config.h # End Source File # Begin Source File SOURCE=..\libspeexdsp.def # End Source File # End Target # End Project mumble-1.3.4/3rdparty/speexdsp-src/win32/libspeexdsp/libspeexdsp.dsp0000775000175000017500000001310614010707343025351 0ustar builderbuilder# Microsoft Developer Studio Project File - Name="libspeexdsp" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Static Library" 0x0104 CFG=libspeexdsp - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libspeexdsp.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libspeexdsp.mak" CFG="libspeexdsp - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libspeexdsp - Win32 Release" (based on "Win32 (x86) Static Library") !MESSAGE "libspeexdsp - Win32 Debug" (based on "Win32 (x86) Static Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "libspeexdsp - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c # ADD CPP /nologo /MD /W1 /GX- /O2 /I "../../include" /I "../" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE RSC /l 0x419 /d "NDEBUG" # ADD RSC /l 0x809 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo /out:"..\..\lib\libspeexdsp.lib" !ELSEIF "$(CFG)" == "libspeexdsp - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "libspeexdsp___Win32_Debug" # PROP BASE Intermediate_Dir "libspeexdsp___Win32_Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "libspeexdsp___Win32_Debug" # PROP Intermediate_Dir "libspeexdsp___Win32_Debug" # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm- /GX- /Zi /Od /I "../../include" /I "../" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /D "HAVE_CONFIG_H" /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE RSC /l 0x419 /d "_DEBUG" # ADD RSC /l 0x809 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo /out:"..\..\lib\libspeexdsp.lib" !ENDIF # Begin Target # Name "libspeexdsp - Win32 Release" # Name "libspeexdsp - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\libspeex\buffer.c # End Source File # Begin Source File SOURCE=..\..\libspeex\fftwrap.c # End Source File # Begin Source File SOURCE=..\..\libspeex\filterbank.c # End Source File # Begin Source File SOURCE=..\..\libspeex\jitter.c # End Source File # Begin Source File SOURCE=..\..\libspeex\kiss_fft.c # End Source File # Begin Source File SOURCE=..\..\libspeex\kiss_fftr.c # End Source File # Begin Source File SOURCE=..\..\libspeex\mdf.c # End Source File # Begin Source File SOURCE=..\..\libspeex\preprocess.c # End Source File # Begin Source File SOURCE=..\..\libspeex\resample.c # End Source File # Begin Source File SOURCE=..\..\libspeex\scal.c # End Source File # Begin Source File SOURCE=..\..\libspeex\smallft.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\libspeex\_kiss_fft_guts.h # End Source File # Begin Source File SOURCE=..\..\libspeex\arch.h # End Source File # Begin Source File SOURCE=..\..\libspeex\fftwrap.h # End Source File # Begin Source File SOURCE=..\..\libspeex\filterbank.h # End Source File # Begin Source File SOURCE=..\..\libspeex\fixed_debug.h # End Source File # Begin Source File SOURCE=..\..\libspeex\fixed_generic.h # End Source File # Begin Source File SOURCE=..\..\libspeex\kiss_fft.h # End Source File # Begin Source File SOURCE=..\..\libspeex\kiss_fftr.h # End Source File # Begin Source File SOURCE=..\..\libspeex\math_approx.h # End Source File # Begin Source File SOURCE=..\..\libspeex\os_support.h # End Source File # Begin Source File SOURCE=..\..\libspeex\pseudofloat.h # End Source File # Begin Source File SOURCE=..\..\libspeex\smallft.h # End Source File # End Group # Begin Group "Public Header Files" # PROP Default_Filter "" # Begin Source File SOURCE=..\..\include\speex\speex.h # End Source File # Begin Source File SOURCE=..\..\include\speex\speex_bits.h # End Source File # Begin Source File SOURCE=..\..\include\speex\speex_buffer.h # End Source File # Begin Source File SOURCE=..\..\include\speex\speex_echo.h # End Source File # Begin Source File SOURCE=..\..\include\speex\speex_jitter.h # End Source File # Begin Source File SOURCE=..\..\include\speex\speex_preprocess.h # End Source File # Begin Source File SOURCE=..\..\include\speex\speex_resampler.h # End Source File # Begin Source File SOURCE=..\..\include\speex\speex_types.h # End Source File # End Group # Begin Source File SOURCE=..\config.h # End Source File # End Target # End Project mumble-1.3.4/3rdparty/speexdsp-src/win32/libspeexdsp/Makefile.am0000664000175000017500000000040514010707343024346 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies EXTRA_DIST = libspeexdsp.dsw libspeexdsp.dsp libspeexdsp_dynamic.dsp mumble-1.3.4/3rdparty/speexdsp-src/win32/VS2008/0000775000175000017500000000000014010707343020633 5ustar builderbuildermumble-1.3.4/3rdparty/speexdsp-src/win32/VS2008/libspeexdsp.sln0000664000175000017500000012310714010707343023677 0ustar builderbuilderMicrosoft Visual Studio Solution File, Format Version 10.00 # Visual Studio 2008 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testdenoise", "tests\testdenoise.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}" ProjectSection(ProjectDependencies) = postProject {03207781-0D1C-4DB3-A71D-45C608F28DBD} = {03207781-0D1C-4DB3-A71D-45C608F28DBD} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testecho", "tests\testecho.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}" ProjectSection(ProjectDependencies) = postProject {03207781-0D1C-4DB3-A71D-45C608F28DBD} = {03207781-0D1C-4DB3-A71D-45C608F28DBD} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testresample", "tests\testresample.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}" ProjectSection(ProjectDependencies) = postProject {03207781-0D1C-4DB3-A71D-45C608F28DBD} = {03207781-0D1C-4DB3-A71D-45C608F28DBD} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libspeexdsp", "libspeexdsp\libspeexdsp.vcproj", "{03207781-0D1C-4DB3-A71D-45C608F28DBD}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug_RTL_dll|Win32 = Debug_RTL_dll|Win32 Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) Debug_WM5_PPC_ARM|Win32 = Debug_WM5_PPC_ARM|Win32 Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) Debug|Win32 = Debug|Win32 Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) Release_Dynamic_SSE|Win32 = Release_Dynamic_SSE|Win32 Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) Release_Dynamic|Win32 = Release_Dynamic|Win32 Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) Release_RTL_dll|Win32 = Release_RTL_dll|Win32 Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) Release_SSE|Win32 = Release_SSE|Win32 Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) Release_SSE2|Win32 = Release_SSE2|Win32 Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) Release_Static_SSE|Win32 = Release_Static_SSE|Win32 Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) Release_WM5_PPC_ARM|Win32 = Release_WM5_PPC_ARM|Win32 Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) Release|Win32 = Release|Win32 Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_RTL_dll|Win32.ActiveCfg = Debug_RTL_dll|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_RTL_dll|Win32.Build.0 = Debug_RTL_dll|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug_WM5_PPC_ARM|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_WM5_PPC_ARM|Win32.Build.0 = Debug_WM5_PPC_ARM|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|Win32.ActiveCfg = Debug|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|Win32.Build.0 = Debug|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_Dynamic_SSE|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic_SSE|Win32.Build.0 = Release_Dynamic_SSE|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_Dynamic_SSE|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_Dynamic_SSE|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic|Win32.ActiveCfg = Release_Dynamic|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic|Win32.Build.0 = Release_Dynamic|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_RTL_dll|Win32.ActiveCfg = Release_RTL_dll|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_RTL_dll|Win32.Build.0 = Release_RTL_dll|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE2|Win32.ActiveCfg = Release_SSE2|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE2|Win32.Build.0 = Release_SSE2|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Static_SSE|Win32.ActiveCfg = Release_Static_SSE|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Static_SSE|Win32.Build.0 = Release_Static_SSE|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_Static_SSE|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_Static_SSE|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_WM5_PPC_ARM|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_WM5_PPC_ARM|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|Win32.ActiveCfg = Release|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|Win32.Build.0 = Release|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug_WM5_PPC_ARM|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic|Win32.ActiveCfg = Release_SSE2|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic|Win32.Build.0 = Release_SSE2|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE2|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_RTL_dll|Win32.ActiveCfg = Release_SSE2|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_RTL_dll|Win32.Build.0 = Release_SSE2|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE2|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_SSE2|Win32.ActiveCfg = Release_SSE2|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_SSE2|Win32.Build.0 = Release_SSE2|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE2|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Static_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Static_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE2|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE2|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE2|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Debug_WM5_PPC_ARM|Win32.Build.0 = Debug|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Debug|Win32.ActiveCfg = Debug|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE2|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE2|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_Dynamic|Win32.ActiveCfg = Release_SSE2|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_Dynamic|Win32.Build.0 = Release_SSE2|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE2|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_RTL_dll|Win32.ActiveCfg = Release_SSE2|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_RTL_dll|Win32.Build.0 = Release_SSE2|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE2|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_SSE2|Win32.ActiveCfg = Release_SSE2|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_SSE2|Win32.Build.0 = Release_SSE2|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE2|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_Static_SSE|Win32.ActiveCfg = Release_SSE2|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE2|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE2|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE2|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE2|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release|Win32.ActiveCfg = Release|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug_WM5_PPC_ARM|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Dynamic|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Dynamic|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_RTL_dll|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_RTL_dll|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Static_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Static_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug_WM5_PPC_ARM|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Dynamic|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Dynamic|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_RTL_dll|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_RTL_dll|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Static_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Static_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug_WM5_PPC_ARM|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Dynamic|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Dynamic|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_RTL_dll|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_RTL_dll|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Static_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Static_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug_WM5_PPC_ARM|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Dynamic|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Dynamic|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_RTL_dll|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_RTL_dll|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Static_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Static_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug_WM5_PPC_ARM|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Dynamic|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Dynamic|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_RTL_dll|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_RTL_dll|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Static_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Static_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug_WM5_PPC_ARM|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Dynamic|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Dynamic|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_RTL_dll|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_RTL_dll|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Static_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Static_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug|Win32.ActiveCfg = Debug|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_Dynamic_SSE|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_Dynamic_SSE|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_Dynamic|Win32.ActiveCfg = Release_Dynamic_SSE|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_Dynamic_SSE|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_RTL_dll|Win32.ActiveCfg = Release_Static_SSE|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_Static_SSE|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_SSE|Win32.ActiveCfg = Release_Static_SSE|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_Static_SSE|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_SSE2|Win32.ActiveCfg = Release_Static_SSE|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_Static_SSE|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_Static_SSE|Win32.ActiveCfg = Release_Static_SSE|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_Static_SSE|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_Static_SSE|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_Static_SSE|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release|Win32.ActiveCfg = Release|Win32 {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal mumble-1.3.4/3rdparty/speexdsp-src/win32/VS2008/libspeexdsp/0000775000175000017500000000000014010707343023155 5ustar builderbuildermumble-1.3.4/3rdparty/speexdsp-src/win32/VS2008/libspeexdsp/libspeexdsp.vcproj0000775000175000017500000002415514010707343026736 0ustar builderbuilder mumble-1.3.4/3rdparty/speexdsp-src/win32/VS2008/libspeexdsp/Makefile.am0000664000175000017500000000035214010707343025211 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies EXTRA_DIST = libspeexdsp.vcproj mumble-1.3.4/3rdparty/speexdsp-src/win32/VS2008/tests/0000775000175000017500000000000014010707343021775 5ustar builderbuildermumble-1.3.4/3rdparty/speexdsp-src/win32/VS2008/tests/testresample.vcproj0000664000175000017500000001536314010707343025742 0ustar builderbuilder mumble-1.3.4/3rdparty/speexdsp-src/win32/VS2008/tests/testecho.vcproj0000664000175000017500000001533714010707343025051 0ustar builderbuilder mumble-1.3.4/3rdparty/speexdsp-src/win32/VS2008/tests/Makefile.am0000664000175000017500000000041614010707343024032 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies EXTRA_DIST = testdenoise.vcproj testecho.vcproj testresample.vcproj mumble-1.3.4/3rdparty/speexdsp-src/win32/VS2008/tests/testdenoise.vcproj0000664000175000017500000001535614010707343025562 0ustar builderbuilder mumble-1.3.4/3rdparty/speexdsp-src/win32/VS2008/Makefile.am0000664000175000017500000000040214010707343022663 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies SUBDIRS = libspeexdsp tests EXTRA_DIST = libspeexdsp.sln mumble-1.3.4/3rdparty/speexdsp-src/win32/speex.iss0000664000175000017500000000413414010707343021637 0ustar builderbuilder; Script generated by the Inno Setup Script Wizard. ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! [Setup] AppName=Speex AppVerName=Speex V1.1.6 AppPublisherURL=http://www.speex.org AppSupportURL=http://www.speex.org AppUpdatesURL=http://www.speex.org DefaultDirName={pf}\Speex DefaultGroupName=Speex AllowNoIcons=yes LicenseFile=..\COPYING InfoAfterFile=..\README OutputDir=. OutputBaseFilename=speex_win32_1.1.6_setup ; uncomment the following line if you want your installation to run on NT 3.51 too. ; MinVersion=4,3.51 [Tasks] ;Name: "desktopicon"; Description: "Create a &desktop icon"; GroupDescription: "Additional icons:"; MinVersion: 4,4 [Dirs] Name: "{app}" Name: "{app}\doc" Name: "{app}\html" Name: "{app}\libspeex" Name: "{app}\libspeex\include" [Files] Source: "speexdec\Release\speexdec.exe"; DestDir: "{app}"; Flags: ignoreversion Source: "speexenc\Release\speexenc.exe"; DestDir: "{app}"; Flags: ignoreversion Source: "libspeex\Release\libspeex.lib"; DestDir: "{app}\libspeex"; Flags: ignoreversion Source: "libspeex\Release\libspeex.exp"; DestDir: "{app}\libspeex"; Flags: ignoreversion Source: "libspeex\Release\libspeex.dll"; DestDir: "{app}\libspeex"; Flags: ignoreversion Source: "..\include\speex\speex.h"; DestDir: "{app}\libspeex\include"; Flags: ignoreversion Source: "..\include\speex\speex_bits.h"; DestDir: "{app}\libspeex\include"; Flags: ignoreversion Source: "..\include\speex\speex_callbacks.h"; DestDir: "{app}\libspeex\include"; Flags: ignoreversion Source: "..\include\speex\speex_echo.h"; DestDir: "{app}\libspeex\include"; Flags: ignoreversion Source: "..\include\speex\speex_header.h"; DestDir: "{app}\libspeex\include"; Flags: ignoreversion Source: "..\include\speex\speex_jitter.h"; DestDir: "{app}\libspeex\include"; Flags: ignoreversion Source: "..\include\speex\speex_preprocess.h"; DestDir: "{app}\libspeex\include"; Flags: ignoreversion Source: "..\include\speex\speex_stereo.h"; DestDir: "{app}\libspeex\include"; Flags: ignoreversion Source: "..\doc\manual.pdf"; DestDir: "{app}\doc"; Flags: ignoreversion [Run] mumble-1.3.4/3rdparty/speexdsp-src/win32/VS2005/0000775000175000017500000000000014010707343020630 5ustar builderbuildermumble-1.3.4/3rdparty/speexdsp-src/win32/VS2005/libspeexdsp.sln0000664000175000017500000004512414010707343023676 0ustar builderbuilder Microsoft Visual Studio Solution File, Format Version 9.00 # Visual Studio 2005 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libspeexdsp", "libspeexdsp\libspeexdsp.vcproj", "{E42FDC95-7243-4219-9EA4-ACCE4AB97197}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testdenoise", "tests\testdenoise.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}" ProjectSection(ProjectDependencies) = postProject {E42FDC95-7243-4219-9EA4-ACCE4AB97197} = {E42FDC95-7243-4219-9EA4-ACCE4AB97197} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testecho", "tests\testecho.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}" ProjectSection(ProjectDependencies) = postProject {E42FDC95-7243-4219-9EA4-ACCE4AB97197} = {E42FDC95-7243-4219-9EA4-ACCE4AB97197} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testresample", "tests\testresample.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}" ProjectSection(ProjectDependencies) = postProject {E42FDC95-7243-4219-9EA4-ACCE4AB97197} = {E42FDC95-7243-4219-9EA4-ACCE4AB97197} EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug_RTL_dll|Win32 = Debug_RTL_dll|Win32 Debug_WM5_PPC_ARM|Win32 = Debug_WM5_PPC_ARM|Win32 Debug|Win32 = Debug|Win32 Release_Dynamic_SSE|Win32 = Release_Dynamic_SSE|Win32 Release_Dynamic|Win32 = Release_Dynamic|Win32 Release_RTL_dll|Win32 = Release_RTL_dll|Win32 Release_SSE|Win32 = Release_SSE|Win32 Release_SSE2|Win32 = Release_SSE2|Win32 Release_WM5_PPC_ARM|Win32 = Release_WM5_PPC_ARM|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_RTL_dll|Win32.ActiveCfg = Debug_RTL_dll|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_RTL_dll|Win32.Build.0 = Debug_RTL_dll|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug_WM5_PPC_ARM|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_WM5_PPC_ARM|Win32.Build.0 = Debug_WM5_PPC_ARM|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|Win32.ActiveCfg = Debug|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|Win32.Build.0 = Debug|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_Dynamic_SSE|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic_SSE|Win32.Build.0 = Release_Dynamic_SSE|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic|Win32.ActiveCfg = Release_Dynamic|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic|Win32.Build.0 = Release_Dynamic|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_RTL_dll|Win32.ActiveCfg = Release_RTL_dll|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_RTL_dll|Win32.Build.0 = Release_RTL_dll|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE2|Win32.ActiveCfg = Release_SSE2|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE2|Win32.Build.0 = Release_SSE2|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_WM5_PPC_ARM|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_WM5_PPC_ARM|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|Win32.ActiveCfg = Release|Win32 {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|Win32.Build.0 = Release|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Debug_RTL_dll|Win32.ActiveCfg = Debug_RTL_dll|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Debug_RTL_dll|Win32.Build.0 = Debug_RTL_dll|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug_WM5_PPC_ARM|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Debug_WM5_PPC_ARM|Win32.Build.0 = Debug_WM5_PPC_ARM|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Debug|Win32.ActiveCfg = Debug|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Debug|Win32.Build.0 = Debug|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_Dynamic_SSE|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release_Dynamic_SSE|Win32.Build.0 = Release_Dynamic_SSE|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release_Dynamic|Win32.ActiveCfg = Release_Dynamic|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release_Dynamic|Win32.Build.0 = Release_Dynamic|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release_RTL_dll|Win32.ActiveCfg = Release_RTL_dll|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release_RTL_dll|Win32.Build.0 = Release_RTL_dll|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release_SSE2|Win32.ActiveCfg = Release_SSE2|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release_SSE2|Win32.Build.0 = Release_SSE2|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release_WM5_PPC_ARM|Win32.Build.0 = Release|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release|Win32.ActiveCfg = Release|Win32 {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_RTL_dll|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_RTL_dll|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release|Win32.Build.0 = Release|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Debug|Win32.ActiveCfg = Debug|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Debug|Win32.Build.0 = Debug|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_Dynamic|Win32.ActiveCfg = Release|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_Dynamic|Win32.Build.0 = Release|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_RTL_dll|Win32.ActiveCfg = Release|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_RTL_dll|Win32.Build.0 = Release|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release|Win32.ActiveCfg = Release|Win32 {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Dynamic|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Dynamic|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_RTL_dll|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_RTL_dll|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Dynamic|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Dynamic|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_RTL_dll|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_RTL_dll|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Dynamic|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Dynamic|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_RTL_dll|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_RTL_dll|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Dynamic|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Dynamic|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_RTL_dll|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_RTL_dll|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Dynamic|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Dynamic|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_RTL_dll|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_RTL_dll|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug|Win32.ActiveCfg = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug|Win32.Build.0 = Debug|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Dynamic|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Dynamic|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_RTL_dll|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_RTL_dll|Win32.Build.0 = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release|Win32.ActiveCfg = Release|Win32 {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal mumble-1.3.4/3rdparty/speexdsp-src/win32/VS2005/libspeexdsp/0000775000175000017500000000000014010707343023152 5ustar builderbuildermumble-1.3.4/3rdparty/speexdsp-src/win32/VS2005/libspeexdsp/libspeexdsp.vcproj0000775000175000017500000011057114010707343026731 0ustar builderbuilder mumble-1.3.4/3rdparty/speexdsp-src/win32/VS2005/libspeexdsp/Makefile.am0000664000175000017500000000035214010707343025206 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies EXTRA_DIST = libspeexdsp.vcproj mumble-1.3.4/3rdparty/speexdsp-src/win32/VS2005/tests/0000775000175000017500000000000014010707343021772 5ustar builderbuildermumble-1.3.4/3rdparty/speexdsp-src/win32/VS2005/tests/testresample.vcproj0000664000175000017500000001524414010707343025735 0ustar builderbuilder mumble-1.3.4/3rdparty/speexdsp-src/win32/VS2005/tests/testecho.vcproj0000664000175000017500000001522014010707343025035 0ustar builderbuilder mumble-1.3.4/3rdparty/speexdsp-src/win32/VS2005/tests/Makefile.am0000664000175000017500000000041614010707343024027 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies EXTRA_DIST = testdenoise.vcproj testecho.vcproj testresample.vcproj mumble-1.3.4/3rdparty/speexdsp-src/win32/VS2005/tests/testdenoise.vcproj0000664000175000017500000001523714010707343025555 0ustar builderbuilder mumble-1.3.4/3rdparty/speexdsp-src/win32/VS2005/Makefile.am0000664000175000017500000000040214010707343022660 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies SUBDIRS = libspeexdsp tests EXTRA_DIST = libspeexdsp.sln mumble-1.3.4/3rdparty/speexdsp-src/win32/Makefile.am0000664000175000017500000000044414010707343022027 0ustar builderbuilder## Process this file with automake to produce Makefile.in. -*-Makefile-*- # Disable automatic dependency tracking if using other tools than gcc and gmake #AUTOMAKE_OPTIONS = no-dependencies SUBDIRS = libspeexdsp VS2003 VS2005 VS2008 EXTRA_DIST = speex.iss config.h libspeexdsp.def mumble-1.3.4/3rdparty/speexdsp-src/win32/config.h0000664000175000017500000000145514010707343021414 0ustar builderbuilder// Microsoft version of 'inline' #define inline __inline // In Visual Studio, _M_IX86_FP=1 means /arch:SSE was used, likewise // _M_IX86_FP=2 means /arch:SSE2 was used. // Also, enable both _USE_SSE and _USE_SSE2 if we're compiling for x86-64 #if _M_IX86_FP >= 1 || defined(_M_X64) #define _USE_SSE #endif #if _M_IX86_FP >= 2 || defined(_M_X64) #define _USE_SSE2 #endif // Visual Studio support alloca(), but it always align variables to 16-bit // boundary, while SSE need 128-bit alignment. So we disable alloca() when // SSE is enabled. #ifndef _USE_SSE # define USE_ALLOCA #endif /* Default to floating point */ #ifndef FIXED_POINT # define FLOATING_POINT # define USE_SMALLFT #else # define USE_KISS_FFT #endif /* We don't support visibility on Win32 */ #define EXPORT mumble-1.3.4/3rdparty/speexdsp-src/ChangeLog0000664000175000017500000000144214010707343020602 0ustar builderbuilder2005-09-07 Thomas Vander Stichele * libspeex/cb_search.c: (split_cb_search_shape_sign_N1): add declaration for n, seems like an obvious build fix, slap me down if it's not 2004-02-18 Jean-Marc Valin Patch for compiling with mingw32 sent by j@thing.net 2004-02-18 Jean-Marc Valin Integrated IRIX patch (getopt stuff) from Michael Pruett 2004-02-18 Jean-Marc Valin Changed the Makefile.am so that KDevelop can parse SUBDIRS correctly 2002/03/27 Jean-Marc Valin: Working encoder and decoder for both narrowband and wideband. 2002/02/27 Jean-Marc Valin: Got the basic encoder working as a demo with quantization only on some parameters. mumble-1.3.4/3rdparty/speexdsp-src/doc/0000775000175000017500000000000014010707343017574 5ustar builderbuildermumble-1.3.4/3rdparty/speexdsp-src/doc/ref_shaping.eps0000664000175000017500000006357214010707343022607 0ustar builderbuilder%!PS-Adobe-2.0 EPSF-2.0 %%Title: printout.eps %%Creator: gnuplot 4.0 patchlevel 0 %%CreationDate: Mon Mar 6 17:15:27 2006 %%DocumentFonts: (atend) %%BoundingBox: 50 50 410 302 %%Orientation: Portrait %%EndComments /gnudict 256 dict def gnudict begin /Color true def /Solid false def /gnulinewidth 5.000 def /userlinewidth gnulinewidth def /vshift -46 def /dl {10.0 mul} def /hpt_ 31.5 def /vpt_ 31.5 def /hpt hpt_ def /vpt vpt_ def /Rounded false def /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /N {newpath moveto} bind def /C {setrgbcolor} bind def /f {rlineto fill} bind def /vpt2 vpt 2 mul def /hpt2 hpt 2 mul def /Lshow { currentpoint stroke M 0 vshift R show } def /Rshow { currentpoint stroke M dup stringwidth pop neg vshift R show } def /Cshow { currentpoint stroke M dup stringwidth pop -2 div vshift R show } def /UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def /DL { Color {setrgbcolor Solid {pop []} if 0 setdash } {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def /BL { stroke userlinewidth 2 mul setlinewidth Rounded { 1 setlinejoin 1 setlinecap } if } def /AL { stroke userlinewidth 2 div setlinewidth Rounded { 1 setlinejoin 1 setlinecap } if } def /UL { dup gnulinewidth mul /userlinewidth exch def dup 1 lt {pop 1} if 10 mul /udl exch def } def /PL { stroke userlinewidth setlinewidth Rounded { 1 setlinejoin 1 setlinecap } if } def /LTw { PL [] 1 setgray } def /LTb { BL [] 0 0 0 DL } def /LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def /LT0 { PL [] 1 0 0 DL } def /LT1 { PL [4 dl 2 dl] 0 1 0 DL } def /LT2 { PL [2 dl 3 dl] 0 0 1 DL } def /LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def /LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def /LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def /LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def /LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def /LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def /Pnt { stroke [] 0 setdash gsave 1 setlinecap M 0 0 V stroke grestore } def /Dia { stroke [] 0 setdash 2 copy vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V closepath stroke Pnt } def /Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V currentpoint stroke M hpt neg vpt neg R hpt2 0 V stroke } def /Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V closepath stroke Pnt } def /Crs { stroke [] 0 setdash exch hpt sub exch vpt add M hpt2 vpt2 neg V currentpoint stroke M hpt2 neg 0 R hpt2 vpt2 V stroke } def /TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V closepath stroke Pnt } def /Star { 2 copy Pls Crs } def /BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V closepath fill } def /TriUF { stroke [] 0 setdash vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V closepath fill } def /TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M hpt neg vpt 1.62 mul V hpt 2 mul 0 V hpt neg vpt -1.62 mul V closepath stroke Pnt } def /TriDF { stroke [] 0 setdash vpt 1.12 mul sub M hpt neg vpt 1.62 mul V hpt 2 mul 0 V hpt neg vpt -1.62 mul V closepath fill} def /DiaF { stroke [] 0 setdash vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V closepath fill } def /Pent { stroke [] 0 setdash 2 copy gsave translate 0 hpt M 4 {72 rotate 0 hpt L} repeat closepath stroke grestore Pnt } def /PentF { stroke [] 0 setdash gsave translate 0 hpt M 4 {72 rotate 0 hpt L} repeat closepath fill grestore } def /Circle { stroke [] 0 setdash 2 copy hpt 0 360 arc stroke Pnt } def /CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def /C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def /C1 { BL [] 0 setdash 2 copy moveto 2 copy vpt 0 90 arc closepath fill vpt 0 360 arc closepath } bind def /C2 { BL [] 0 setdash 2 copy moveto 2 copy vpt 90 180 arc closepath fill vpt 0 360 arc closepath } bind def /C3 { BL [] 0 setdash 2 copy moveto 2 copy vpt 0 180 arc closepath fill vpt 0 360 arc closepath } bind def /C4 { BL [] 0 setdash 2 copy moveto 2 copy vpt 180 270 arc closepath fill vpt 0 360 arc closepath } bind def /C5 { BL [] 0 setdash 2 copy moveto 2 copy vpt 0 90 arc 2 copy moveto 2 copy vpt 180 270 arc closepath fill vpt 0 360 arc } bind def /C6 { BL [] 0 setdash 2 copy moveto 2 copy vpt 90 270 arc closepath fill vpt 0 360 arc closepath } bind def /C7 { BL [] 0 setdash 2 copy moveto 2 copy vpt 0 270 arc closepath fill vpt 0 360 arc closepath } bind def /C8 { BL [] 0 setdash 2 copy moveto 2 copy vpt 270 360 arc closepath fill vpt 0 360 arc closepath } bind def /C9 { BL [] 0 setdash 2 copy moveto 2 copy vpt 270 450 arc closepath fill vpt 0 360 arc closepath } bind def /C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill 2 copy moveto 2 copy vpt 90 180 arc closepath fill vpt 0 360 arc closepath } bind def /C11 { BL [] 0 setdash 2 copy moveto 2 copy vpt 0 180 arc closepath fill 2 copy moveto 2 copy vpt 270 360 arc closepath fill vpt 0 360 arc closepath } bind def /C12 { BL [] 0 setdash 2 copy moveto 2 copy vpt 180 360 arc closepath fill vpt 0 360 arc closepath } bind def /C13 { BL [] 0 setdash 2 copy moveto 2 copy vpt 0 90 arc closepath fill 2 copy moveto 2 copy vpt 180 360 arc closepath fill vpt 0 360 arc closepath } bind def /C14 { BL [] 0 setdash 2 copy moveto 2 copy vpt 90 360 arc closepath fill vpt 0 360 arc } bind def /C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill vpt 0 360 arc closepath } bind def /Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto closepath } bind def /Square { dup Rec } bind def /Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def /S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def /S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def /S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def /S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def /S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def /S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def /S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def /S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill 2 copy vpt Square fill Bsquare } bind def /S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def /S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def /S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def /S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def /S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def /S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill 2 copy vpt Square fill Bsquare } bind def /S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def /S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def /D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def /D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def /D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def /D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def /D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def /D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def /D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def /D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def /D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def /D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def /D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def /D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def /D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def /D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def /D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def /D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def /DiaE { stroke [] 0 setdash vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V closepath stroke } def /BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V closepath stroke } def /TriUE { stroke [] 0 setdash vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V closepath stroke } def /TriDE { stroke [] 0 setdash vpt 1.12 mul sub M hpt neg vpt 1.62 mul V hpt 2 mul 0 V hpt neg vpt -1.62 mul V closepath stroke } def /PentE { stroke [] 0 setdash gsave translate 0 hpt M 4 {72 rotate 0 hpt L} repeat closepath stroke grestore } def /CircE { stroke [] 0 setdash hpt 0 360 arc stroke } def /Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def /DiaW { stroke [] 0 setdash vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V Opaque stroke } def /BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V Opaque stroke } def /TriUW { stroke [] 0 setdash vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V Opaque stroke } def /TriDW { stroke [] 0 setdash vpt 1.12 mul sub M hpt neg vpt 1.62 mul V hpt 2 mul 0 V hpt neg vpt -1.62 mul V Opaque stroke } def /PentW { stroke [] 0 setdash gsave translate 0 hpt M 4 {72 rotate 0 hpt L} repeat Opaque stroke grestore } def /CircW { stroke [] 0 setdash hpt 0 360 arc Opaque stroke } def /BoxFill { gsave Rec 1 setgray fill grestore } def /BoxColFill { gsave Rec /Fillden exch def currentrgbcolor /ColB exch def /ColG exch def /ColR exch def /ColR ColR Fillden mul Fillden sub 1 add def /ColG ColG Fillden mul Fillden sub 1 add def /ColB ColB Fillden mul Fillden sub 1 add def ColR ColG ColB setrgbcolor fill grestore } def % % PostScript Level 1 Pattern Fill routine % Usage: x y w h s a XX PatternFill % x,y = lower left corner of box to be filled % w,h = width and height of box % a = angle in degrees between lines and x-axis % XX = 0/1 for no/yes cross-hatch % /PatternFill { gsave /PFa [ 9 2 roll ] def PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec gsave 1 setgray fill grestore clip currentlinewidth 0.5 mul setlinewidth /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def 0 0 M PFa 5 get rotate PFs -2 div dup translate 0 1 PFs PFa 4 get div 1 add floor cvi { PFa 4 get mul 0 M 0 PFs V } for 0 PFa 6 get ne { 0 1 PFs PFa 4 get div 1 add floor cvi { PFa 4 get mul 0 2 1 roll M PFs 0 V } for } if stroke grestore } def % /Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall currentdict end definefont pop end %%EndProlog gnudict begin gsave 50 50 translate 0.050 0.050 scale 0 setgray newpath (Helvetica) findfont 140 scalefont setfont 1.000 UL LTb 630 420 M 63 0 V 6269 0 R -63 0 V 546 420 M (-40) Rshow 1.000 UL LTb 630 1056 M 63 0 V 6269 0 R -63 0 V -6353 0 R (-30) Rshow 1.000 UL LTb 630 1692 M 63 0 V 6269 0 R -63 0 V -6353 0 R (-20) Rshow 1.000 UL LTb 630 2328 M 63 0 V 6269 0 R -63 0 V -6353 0 R (-10) Rshow 1.000 UL LTb 630 2964 M 63 0 V 6269 0 R -63 0 V -6353 0 R ( 0) Rshow 1.000 UL LTb 630 3600 M 63 0 V 6269 0 R -63 0 V -6353 0 R ( 10) Rshow 1.000 UL LTb 630 4236 M 63 0 V 6269 0 R -63 0 V -6353 0 R ( 20) Rshow 1.000 UL LTb 630 4872 M 63 0 V 6269 0 R -63 0 V -6353 0 R ( 30) Rshow 1.000 UL LTb 630 420 M 0 63 V 0 4389 R 0 -63 V 630 280 M ( 0) Cshow 1.000 UL LTb 1421 420 M 0 63 V 0 4389 R 0 -63 V 0 -4529 R ( 500) Cshow 1.000 UL LTb 2213 420 M 0 63 V 0 4389 R 0 -63 V 0 -4529 R ( 1000) Cshow 1.000 UL LTb 3004 420 M 0 63 V 0 4389 R 0 -63 V 0 -4529 R ( 1500) Cshow 1.000 UL LTb 3796 420 M 0 63 V 0 4389 R 0 -63 V 0 -4529 R ( 2000) Cshow 1.000 UL LTb 4587 420 M 0 63 V 0 4389 R 0 -63 V 0 -4529 R ( 2500) Cshow 1.000 UL LTb 5379 420 M 0 63 V 0 4389 R 0 -63 V 0 -4529 R ( 3000) Cshow 1.000 UL LTb 6170 420 M 0 63 V 0 4389 R 0 -63 V 0 -4529 R ( 3500) Cshow 1.000 UL LTb 6962 420 M 0 63 V 0 4389 R 0 -63 V 0 -4529 R ( 4000) Cshow 1.000 UL LTb 1.000 UL LTb 630 420 M 6332 0 V 0 4452 V -6332 0 V 630 420 L LTb 140 2646 M currentpoint gsave translate 90 rotate 0 0 M (Response \(dB\)) Cshow grestore LTb 3796 70 M (Frequency \(Hz\)) Cshow 1.000 UP 1.000 UL LT0 LTb 6311 4739 M (Speech signal) Rshow LT0 6395 4739 M 399 0 V 630 1817 M 12 -132 V 13 -287 V 12 256 V 12 139 V 13 -127 V 12 -193 V 13 256 V 12 101 V 12 -189 V 13 -269 V 12 429 V 12 152 V 13 -102 V 12 -276 V 13 139 V 12 115 V 12 -205 V 13 -174 V 12 485 V 12 193 V 13 37 V 12 -17 V 12 41 V 13 230 V 12 242 V 13 107 V 12 190 V 12 513 V 13 436 V 12 323 V 12 236 V 13 168 V 12 110 V 12 58 V 13 9 V 12 -40 V 13 -90 V 12 -141 V 12 -197 V 13 -251 V 12 -289 V 12 -283 V 13 -247 V 12 -265 V 13 -324 V 12 -302 V 12 -231 V 13 -75 V 12 150 V 12 1 V 13 -298 V 1273 782 L 12 1103 V 13 76 V 12 -338 V 13 252 V 12 357 V 12 86 V 13 -118 V 12 -341 V 12 -20 V 13 364 V 12 243 V 12 212 V 13 214 V 12 208 V 13 180 V 12 136 V 12 82 V 13 23 V 12 -40 V 12 -107 V 13 -177 V 12 -240 V 13 -259 V 12 -215 V 12 -220 V 13 -297 V 12 -196 V 12 -128 V 13 -701 V 12 632 V 12 329 V 13 -25 V 12 -470 V 13 -54 V 12 538 V 12 70 V 13 -246 V 1743 551 L 12 1111 V 13 185 V 12 -159 V 1793 652 L 12 893 V 12 321 V 13 103 V 12 164 V 12 262 V 13 239 V 12 190 V 12 141 V stroke 1891 2965 M 13 91 V 12 39 V 13 -13 V 12 -62 V 12 -97 V 13 -110 V 12 -120 V 12 -161 V 13 -265 V 12 -453 V 12 -215 V 13 139 V 12 -195 V 2062 420 L 5 0 R 10 961 V 12 135 V 13 -422 V 12 167 V 12 491 V 13 101 V 12 -169 V 13 -737 V 12 482 V 12 299 V 13 -48 V 12 -421 V 12 -151 V 13 434 V 12 -3 V 12 -378 V 13 -12 V 12 298 V 13 -187 V 12 -44 V 12 658 V 13 272 V 12 90 V 12 -49 V 13 -191 V 12 -370 V 13 -579 V 12 -329 V 12 385 V 13 444 V 12 172 V 12 -57 V 13 -407 V 12 -311 V 12 617 V 13 97 V 12 -198 V 13 -469 V 12 446 V 12 177 V 13 -114 V 12 -483 V 12 196 V 13 269 V 12 -74 V 12 -404 V 13 263 V 12 248 V 13 -37 V 12 -66 V 12 339 V 13 312 V 12 244 V 12 215 V 13 176 V 12 125 V 13 69 V 12 15 V 12 -30 V 13 -64 V 12 -85 V 12 -104 V 13 -138 V 12 -195 V 12 -278 V 13 -354 V 12 -257 V 13 -43 V 12 -20 V 12 -73 V 13 -202 V 12 -25 V 12 318 V 13 132 V 12 -73 V 12 -242 V 13 107 V 12 220 V 13 7 V 12 -277 V 9 -811 V 6 0 R 10 887 V 12 241 V 12 20 V 13 -14 V 12 241 V 13 323 V 12 262 V stroke 3153 2380 M 12 197 V 13 138 V 12 86 V 12 36 V 13 -10 V 12 -54 V 12 -92 V 13 -116 V 12 -108 V 13 -73 V 12 -63 V 12 -107 V 13 -195 V 12 -267 V 12 -88 V 13 50 V 12 -97 V 13 -367 V 12 -285 V 12 374 V 13 3 V 12 -352 V 12 88 V 13 347 V 12 47 V 12 -192 V 13 -264 V 12 200 V 13 16 V 12 -421 V 12 296 V 13 398 V 12 65 V 12 -212 V 13 69 V 12 453 V 12 240 V 13 104 V 12 12 V 13 -52 V 12 -82 V 12 -69 V 13 -34 V 12 -25 V 12 -64 V 13 -158 V 12 -346 V 13 -166 V 12 375 V 12 139 V 13 -46 V 12 -207 V 12 -187 V 13 102 V 12 -14 V 12 -357 V 13 -271 V 12 601 V 13 119 V 12 -172 V 12 -486 V 13 521 V 12 256 V 12 10 V 13 -219 V 12 -294 V 13 446 V 12 285 V 12 167 V 13 137 V 12 152 V 12 161 V 13 144 V 12 106 V 12 58 V 13 7 V 12 -44 V 13 -87 V 12 -116 V 12 -119 V 13 -118 V 12 -152 V 12 -241 V 13 -363 V 12 -109 V 12 172 V 13 43 V 12 -75 V 13 -176 V 12 -313 V 12 -344 V 13 236 V 12 93 V 12 -169 V 13 -102 V 12 320 V 13 123 V 12 17 V 12 207 V 13 270 V 12 201 V 12 186 V 13 217 V 12 213 V stroke 4439 2543 M 12 174 V 13 125 V 12 79 V 13 42 V 12 14 V 12 -3 V 13 -17 V 12 -34 V 12 -62 V 13 -102 V 12 -149 V 12 -182 V 13 -151 V 12 -70 V 13 -73 V 12 -146 V 12 -150 V 13 43 V 12 81 V 12 -27 V 13 -148 V 12 -213 V 13 -14 V 12 246 V 12 262 V 13 190 V 12 94 V 12 -7 V 13 -56 V 12 149 V 12 312 V 13 269 V 12 212 V 13 169 V 12 136 V 12 105 V 13 76 V 12 45 V 12 15 V 13 -15 V 12 -43 V 13 -66 V 12 -80 V 12 -83 V 13 -79 V 12 -80 V 12 -99 V 13 -136 V 12 -193 V 12 -274 V 13 -400 V 12 -462 V 13 173 V 12 148 V 12 -21 V 13 -198 V 12 -146 V 12 391 V 13 253 V 12 99 V 12 -38 V 13 -208 V 12 -260 V 13 418 V 12 330 V 12 210 V 13 153 V 12 123 V 12 105 V 13 88 V 12 68 V 13 47 V 12 24 V 12 1 V 13 -19 V 12 -38 V 12 -54 V 13 -67 V 12 -80 V 12 -93 V 13 -111 V 12 -132 V 13 -152 V 12 -167 V 12 -183 V 13 -211 V 12 -236 V 12 -139 V 13 15 V 12 -22 V 13 -164 V 12 -405 V 12 -211 V 13 440 V 12 230 V 12 152 V 13 96 V 12 29 V 12 -28 V 13 -10 V 12 81 V 13 96 V 12 29 V 12 -69 V stroke 5725 2104 M 13 -186 V 12 -239 V 12 142 V 13 249 V 12 155 V 12 88 V 13 49 V 12 35 V 13 39 V 12 38 V 12 13 V 13 -34 V 12 -87 V 12 -112 V 13 -72 V 12 -35 V 13 -100 V 12 -269 V 12 -452 V 13 296 V 12 99 V 12 -312 V 13 242 V 12 513 V 12 237 V 13 88 V 12 -21 V 13 -82 V 12 -1 V 12 153 V 13 177 V 12 156 V 12 145 V 13 134 V 12 114 V 12 87 V 13 56 V 12 26 V 13 -3 V 12 -30 V 12 -52 V 13 -74 V 12 -93 V 12 -108 V 13 -121 V 12 -130 V 13 -129 V 12 -118 V 12 -100 V 13 -92 V 12 -105 V 12 -135 V 13 -172 V 12 -195 V 12 -222 V 13 -353 V 12 -548 V 13 682 V 12 273 V 12 79 V 13 -59 V 12 -188 V 12 -225 V 13 39 V 12 80 V 13 -43 V 12 -44 V 12 184 V 13 213 V 12 127 V 12 42 V 13 -37 V 12 -115 V 12 -182 V 13 -179 V 12 -53 V 13 12 V 12 6 V 12 20 V 13 10 V 12 -65 V 12 -195 V 13 -296 V 12 56 V 12 100 V 13 -118 V 12 -182 V 13 253 V 12 155 V 12 -50 V 13 -222 V 12 21 V 12 197 V 13 7 V 12 -194 V 13 -77 V 12 240 V 12 73 V 13 -132 V 1.000 UL LT1 LTb 6311 4599 M (LPC synthesis filter) Rshow LT1 6395 4599 M 399 0 V 630 4034 M 12 0 V 13 0 V 12 1 V 12 1 V 13 1 V 12 1 V 13 1 V 12 2 V 12 2 V 13 3 V 12 2 V 12 4 V 13 3 V 12 5 V 13 4 V 12 6 V 12 6 V 13 7 V 12 8 V 12 8 V 13 10 V 12 11 V 12 11 V 13 13 V 12 15 V 13 16 V 12 17 V 12 19 V 13 21 V 12 23 V 12 25 V 13 27 V 12 29 V 12 31 V 13 32 V 12 33 V 13 33 V 12 30 V 12 26 V 13 16 V 12 4 V 12 -11 V 13 -26 V 12 -38 V 13 -49 V 12 -54 V 12 -56 V 13 -58 V 12 -57 V 12 -55 V 13 -53 V 12 -52 V 12 -49 V 13 -47 V 12 -45 V 13 -44 V 12 -41 V 12 -40 V 13 -38 V 12 -37 V 12 -35 V 13 -35 V 12 -33 V 12 -31 V 13 -31 V 12 -30 V 13 -29 V 12 -28 V 12 -27 V 13 -26 V 12 -26 V 12 -24 V 13 -25 V 12 -23 V 13 -23 V 12 -22 V 12 -22 V 13 -21 V 12 -20 V 12 -20 V 13 -20 V 12 -19 V 12 -19 V 13 -18 V 12 -17 V 13 -18 V 12 -17 V 12 -16 V 13 -16 V 12 -16 V 12 -15 V 13 -15 V 12 -15 V 13 -14 V 12 -14 V 12 -14 V 13 -13 V 12 -13 V 12 -13 V 13 -12 V 12 -13 V 12 -11 V stroke 1891 2822 M 13 -12 V 12 -11 V 13 -11 V 12 -11 V 12 -11 V 13 -10 V 12 -10 V 12 -10 V 13 -10 V 12 -9 V 12 -9 V 13 -9 V 12 -8 V 13 -9 V 12 -8 V 12 -8 V 13 -8 V 12 -7 V 12 -8 V 13 -7 V 12 -7 V 13 -7 V 12 -6 V 12 -6 V 13 -7 V 12 -6 V 12 -5 V 13 -6 V 12 -5 V 12 -6 V 13 -5 V 12 -5 V 13 -4 V 12 -5 V 12 -4 V 13 -5 V 12 -4 V 12 -4 V 13 -3 V 12 -4 V 13 -3 V 12 -4 V 12 -3 V 13 -3 V 12 -2 V 12 -3 V 13 -3 V 12 -2 V 12 -2 V 13 -2 V 12 -2 V 13 -2 V 12 -2 V 12 -1 V 13 -2 V 12 -1 V 12 -1 V 13 -2 V 12 -1 V 12 0 V 13 -1 V 12 -1 V 13 0 V 12 -1 V 12 0 V 13 0 V 12 -1 V 12 0 V 13 0 V 12 0 V 13 0 V 12 1 V 12 0 V 13 0 V 12 1 V 12 0 V 13 1 V 12 0 V 12 1 V 13 1 V 12 0 V 13 1 V 12 1 V 12 1 V 13 0 V 12 1 V 12 1 V 13 1 V 12 1 V 12 0 V 13 1 V 12 1 V 13 1 V 12 0 V 12 1 V 13 1 V 12 0 V 12 1 V 13 1 V 12 0 V 13 1 V 12 0 V 12 0 V 13 1 V stroke 3178 2508 M 12 0 V 12 0 V 13 0 V 12 0 V 12 0 V 13 0 V 12 0 V 13 0 V 12 0 V 12 -1 V 13 0 V 12 -1 V 12 0 V 13 -1 V 12 0 V 13 -1 V 12 -1 V 12 0 V 13 -1 V 12 -1 V 12 -1 V 13 -1 V 12 -1 V 12 0 V 13 -1 V 12 -1 V 13 -1 V 12 -1 V 12 -1 V 13 -1 V 12 -1 V 12 -1 V 13 -1 V 12 -1 V 12 0 V 13 -1 V 12 -1 V 13 -1 V 12 0 V 12 -1 V 13 0 V 12 -1 V 12 0 V 13 0 V 12 0 V 13 0 V 12 0 V 12 0 V 13 0 V 12 0 V 12 0 V 13 1 V 12 1 V 12 0 V 13 1 V 12 1 V 13 1 V 12 2 V 12 1 V 13 1 V 12 2 V 12 2 V 13 2 V 12 2 V 13 2 V 12 3 V 12 2 V 13 3 V 12 3 V 12 3 V 13 4 V 12 3 V 12 4 V 13 4 V 12 4 V 13 4 V 12 4 V 12 5 V 13 5 V 12 5 V 12 5 V 13 6 V 12 6 V 12 6 V 13 6 V 12 6 V 13 7 V 12 7 V 12 7 V 13 8 V 12 8 V 12 8 V 13 8 V 12 9 V 13 9 V 12 9 V 12 9 V 13 10 V 12 10 V 12 11 V 13 11 V 12 11 V 12 12 V 13 12 V stroke 4464 2759 M 12 12 V 13 13 V 12 13 V 12 14 V 13 14 V 12 15 V 12 15 V 13 16 V 12 16 V 12 17 V 13 17 V 12 18 V 13 18 V 12 19 V 12 20 V 13 21 V 12 21 V 12 22 V 13 23 V 12 23 V 13 24 V 12 26 V 12 26 V 13 26 V 12 28 V 12 28 V 13 30 V 12 29 V 12 31 V 13 30 V 12 31 V 13 30 V 12 29 V 12 27 V 13 26 V 12 22 V 12 18 V 13 13 V 12 8 V 13 2 V 12 -3 V 12 -9 V 13 -13 V 12 -16 V 12 -20 V 13 -21 V 12 -23 V 12 -24 V 13 -23 V 12 -24 V 13 -23 V 12 -23 V 12 -22 V 13 -21 V 12 -21 V 12 -20 V 13 -18 V 12 -18 V 12 -17 V 13 -16 V 12 -16 V 13 -14 V 12 -14 V 12 -13 V 13 -13 V 12 -11 V 12 -11 V 13 -11 V 12 -10 V 13 -9 V 12 -8 V 12 -8 V 13 -8 V 12 -6 V 12 -7 V 13 -6 V 12 -5 V 12 -5 V 13 -4 V 12 -4 V 13 -4 V 12 -3 V 12 -3 V 13 -2 V 12 -2 V 12 -2 V 13 -1 V 12 -1 V 13 0 V 12 0 V 12 0 V 13 0 V 12 1 V 12 1 V 13 1 V 12 2 V 12 2 V 13 2 V 12 2 V 13 2 V 12 3 V 12 3 V 13 2 V 12 3 V stroke 5750 3038 M 12 3 V 13 3 V 12 3 V 12 3 V 13 3 V 12 2 V 13 3 V 12 2 V 12 2 V 13 2 V 12 2 V 12 1 V 13 0 V 12 1 V 13 0 V 12 -1 V 12 -1 V 13 -2 V 12 -2 V 12 -3 V 13 -4 V 12 -4 V 12 -4 V 13 -6 V 12 -5 V 13 -7 V 12 -6 V 12 -8 V 13 -7 V 12 -9 V 12 -8 V 13 -9 V 12 -9 V 12 -10 V 13 -9 V 12 -10 V 13 -10 V 12 -10 V 12 -11 V 13 -10 V 12 -10 V 12 -11 V 13 -10 V 12 -10 V 13 -11 V 12 -10 V 12 -10 V 13 -10 V 12 -10 V 12 -9 V 13 -10 V 12 -10 V 12 -9 V 13 -9 V 12 -9 V 13 -9 V 12 -8 V 12 -8 V 13 -9 V 12 -8 V 12 -7 V 13 -8 V 12 -7 V 13 -7 V 12 -7 V 12 -7 V 13 -7 V 12 -6 V 12 -6 V 13 -6 V 12 -6 V 12 -5 V 13 -5 V 12 -5 V 13 -5 V 12 -5 V 12 -4 V 13 -4 V 12 -4 V 12 -4 V 13 -4 V 12 -3 V 12 -3 V 13 -3 V 12 -3 V 13 -2 V 12 -3 V 12 -2 V 13 -2 V 12 -2 V 12 -1 V 13 -1 V 12 -2 V 13 0 V 12 -1 V 12 -1 V 13 0 V 1.000 UL LT2 LTb 6311 4459 M (Reference shaping) Rshow LT2 6395 4459 M 399 0 V 630 3487 M 12 0 V 13 0 V 12 1 V 12 0 V 13 1 V 12 1 V 13 1 V 12 2 V 12 1 V 13 2 V 12 2 V 12 2 V 13 2 V 12 2 V 13 3 V 12 2 V 12 3 V 13 3 V 12 3 V 12 2 V 13 4 V 12 3 V 12 3 V 13 3 V 12 3 V 13 2 V 12 3 V 12 3 V 13 2 V 12 2 V 12 1 V 13 1 V 12 1 V 12 0 V 13 0 V 12 -2 V 13 -2 V 12 -2 V 12 -4 V 13 -4 V 12 -6 V 12 -6 V 13 -7 V 12 -8 V 13 -8 V 12 -10 V 12 -10 V 13 -11 V 12 -12 V 12 -12 V 13 -13 V 12 -13 V 12 -14 V 13 -14 V 12 -14 V 13 -15 V 12 -15 V 12 -15 V 13 -15 V 12 -15 V 12 -15 V 13 -14 V 12 -15 V 12 -15 V 13 -15 V 12 -14 V 13 -14 V 12 -15 V 12 -13 V 13 -14 V 12 -14 V 12 -13 V 13 -13 V 12 -13 V 13 -12 V 12 -12 V 12 -12 V 13 -12 V 12 -12 V 12 -11 V 13 -11 V 12 -11 V 12 -10 V 13 -10 V 12 -10 V 13 -10 V 12 -10 V 12 -9 V 13 -9 V 12 -9 V 12 -9 V 13 -8 V 12 -8 V 13 -8 V 12 -8 V 12 -8 V 13 -7 V 12 -7 V 12 -7 V 13 -7 V 12 -6 V 12 -7 V stroke 1891 2847 M 13 -6 V 12 -6 V 13 -6 V 12 -5 V 12 -6 V 13 -5 V 12 -5 V 12 -5 V 13 -5 V 12 -5 V 12 -4 V 13 -5 V 12 -4 V 13 -4 V 12 -4 V 12 -4 V 13 -4 V 12 -3 V 12 -4 V 13 -3 V 12 -3 V 13 -3 V 12 -3 V 12 -3 V 13 -2 V 12 -3 V 12 -2 V 13 -3 V 12 -2 V 12 -2 V 13 -2 V 12 -2 V 13 -2 V 12 -1 V 12 -2 V 13 -1 V 12 -2 V 12 -1 V 13 -1 V 12 -1 V 13 -2 V 12 0 V 12 -1 V 13 -1 V 12 -1 V 12 -1 V 13 0 V 12 -1 V 12 0 V 13 0 V 12 -1 V 13 0 V 12 0 V 12 0 V 13 0 V 12 0 V 12 0 V 13 0 V 12 0 V 12 1 V 13 0 V 12 0 V 13 1 V 12 0 V 12 0 V 13 1 V 12 0 V 12 1 V 13 1 V 12 0 V 13 1 V 12 1 V 12 0 V 13 1 V 12 1 V 12 1 V 13 0 V 12 1 V 12 1 V 13 1 V 12 1 V 13 1 V 12 0 V 12 1 V 13 1 V 12 1 V 12 1 V 13 1 V 12 1 V 12 0 V 13 1 V 12 1 V 13 1 V 12 0 V 12 1 V 13 1 V 12 1 V 12 0 V 13 1 V 12 1 V 13 0 V 12 1 V 12 0 V 13 1 V stroke 3178 2736 M 12 0 V 12 1 V 13 0 V 12 1 V 12 0 V 13 0 V 12 1 V 13 0 V 12 0 V 12 0 V 13 1 V 12 0 V 12 0 V 13 0 V 12 0 V 13 0 V 12 0 V 12 0 V 13 0 V 12 0 V 12 0 V 13 0 V 12 0 V 12 0 V 13 0 V 12 0 V 13 0 V 12 0 V 12 0 V 13 0 V 12 0 V 12 0 V 13 0 V 12 -1 V 12 0 V 13 0 V 12 0 V 13 0 V 12 1 V 12 0 V 13 0 V 12 0 V 12 0 V 13 0 V 12 0 V 13 1 V 12 0 V 12 0 V 13 1 V 12 0 V 12 1 V 13 1 V 12 0 V 12 1 V 13 1 V 12 1 V 13 0 V 12 1 V 12 2 V 13 1 V 12 1 V 12 1 V 13 2 V 12 1 V 13 2 V 12 1 V 12 2 V 13 2 V 12 2 V 12 2 V 13 2 V 12 3 V 12 2 V 13 3 V 12 2 V 13 3 V 12 3 V 12 3 V 13 3 V 12 3 V 12 4 V 13 3 V 12 4 V 12 4 V 13 4 V 12 4 V 13 4 V 12 5 V 12 4 V 13 5 V 12 5 V 12 5 V 13 5 V 12 5 V 13 6 V 12 6 V 12 6 V 13 6 V 12 6 V 12 6 V 13 7 V 12 6 V 12 7 V 13 7 V stroke 4464 2918 M 12 8 V 13 7 V 12 8 V 12 7 V 13 8 V 12 8 V 12 9 V 13 8 V 12 9 V 12 8 V 13 9 V 12 9 V 13 9 V 12 9 V 12 9 V 13 9 V 12 10 V 12 9 V 13 9 V 12 10 V 13 9 V 12 9 V 12 9 V 13 9 V 12 9 V 12 8 V 13 8 V 12 8 V 12 8 V 13 7 V 12 7 V 13 6 V 12 6 V 12 6 V 13 4 V 12 5 V 12 3 V 13 3 V 12 3 V 13 1 V 12 1 V 12 1 V 13 0 V 12 -1 V 12 -1 V 13 -2 V 12 -2 V 12 -3 V 13 -4 V 12 -3 V 13 -4 V 12 -5 V 12 -4 V 13 -5 V 12 -5 V 12 -5 V 13 -5 V 12 -6 V 12 -5 V 13 -6 V 12 -5 V 13 -6 V 12 -5 V 12 -5 V 13 -5 V 12 -6 V 12 -5 V 13 -5 V 12 -4 V 13 -5 V 12 -4 V 12 -5 V 13 -4 V 12 -4 V 12 -4 V 13 -3 V 12 -4 V 12 -3 V 13 -3 V 12 -3 V 13 -3 V 12 -3 V 12 -2 V 13 -2 V 12 -2 V 12 -2 V 13 -2 V 12 -2 V 13 -1 V 12 -2 V 12 -1 V 13 -1 V 12 -1 V 12 -1 V 13 -1 V 12 0 V 12 -1 V 13 -1 V 12 0 V 13 -1 V 12 0 V 12 0 V 13 -1 V 12 0 V stroke 5750 3036 M 12 0 V 13 -1 V 12 0 V 12 0 V 13 -1 V 12 0 V 13 -1 V 12 0 V 12 -1 V 13 -1 V 12 0 V 12 -1 V 13 -1 V 12 -2 V 13 -1 V 12 -1 V 12 -2 V 13 -1 V 12 -2 V 12 -2 V 13 -2 V 12 -3 V 12 -2 V 13 -3 V 12 -2 V 13 -3 V 12 -3 V 12 -3 V 13 -4 V 12 -3 V 12 -4 V 13 -3 V 12 -4 V 12 -4 V 13 -4 V 12 -4 V 13 -4 V 12 -4 V 12 -5 V 13 -4 V 12 -4 V 12 -5 V 13 -4 V 12 -5 V 13 -4 V 12 -5 V 12 -5 V 13 -4 V 12 -5 V 12 -4 V 13 -5 V 12 -4 V 12 -4 V 13 -5 V 12 -4 V 13 -4 V 12 -5 V 12 -4 V 13 -4 V 12 -4 V 12 -4 V 13 -4 V 12 -4 V 13 -3 V 12 -4 V 12 -4 V 13 -3 V 12 -3 V 12 -4 V 13 -3 V 12 -3 V 12 -3 V 13 -3 V 12 -3 V 13 -2 V 12 -3 V 12 -2 V 13 -3 V 12 -2 V 12 -2 V 13 -2 V 12 -2 V 12 -2 V 13 -1 V 12 -2 V 13 -1 V 12 -2 V 12 -1 V 13 -1 V 12 -1 V 12 -1 V 13 -1 V 12 0 V 13 -1 V 12 0 V 12 0 V 13 -1 V 1.000 UL LTb 630 420 M 6332 0 V 0 4452 V -6332 0 V 630 420 L 1.000 UP stroke grestore end showpage %%Trailer %%DocumentFonts: Helvetica mumble-1.3.4/3rdparty/speexdsp-src/doc/manual.lyx0000664000175000017500000071611114010707343021616 0ustar builderbuilder#LyX 1.6.1 created this file. For more info see http://www.lyx.org/ \lyxformat 345 \begin_document \begin_header \textclass scrbook \use_default_options true \language english \inputencoding auto \font_roman default \font_sans default \font_typewriter default \font_default_family default \font_sc false \font_osf false \font_sf_scale 100 \font_tt_scale 100 \graphics default \paperfontsize 10 \spacing single \use_hyperref false \papersize letterpaper \use_geometry true \use_amsmath 2 \use_esint 2 \cite_engine basic \use_bibtopic false \paperorientation portrait \leftmargin 2cm \topmargin 2cm \rightmargin 2cm \bottommargin 2cm \secnumdepth 3 \tocdepth 3 \paragraph_separation indent \defskip medskip \quotes_language english \papercolumns 1 \papersides 1 \paperpagestyle headings \tracking_changes false \output_changes false \author "" \author "" \end_header \begin_body \begin_layout Title The Speex Manual \begin_inset Newline newline \end_inset Version 1.2 \end_layout \begin_layout Author Jean-Marc Valin \end_layout \begin_layout Standard \begin_inset Newpage newpage \end_inset \end_layout \begin_layout Standard Copyright \begin_inset ERT status collapsed \begin_layout Plain Layout \backslash copyright \end_layout \end_inset 2002-2008 Jean-Marc Valin/Xiph.org Foundation \end_layout \begin_layout Standard Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with no Invariant Section, with no Front-Cover Texts, and with no Back-Cover. A copy of the license is included in the section entitled "GNU Free Documentati on License". \end_layout \begin_layout Standard \begin_inset Newpage newpage \end_inset \begin_inset CommandInset toc LatexCommand tableofcontents \end_inset \begin_inset Newpage newpage \end_inset \end_layout \begin_layout Standard \begin_inset FloatList table \end_inset \begin_inset Newpage newpage \end_inset \end_layout \begin_layout Chapter Introduction to Speex \end_layout \begin_layout Standard The Speex codec ( \family typewriter http://www.speex.org/ \family default ) exists because there is a need for a speech codec that is open-source and free from software patent royalties. These are essential conditions for being usable in any open-source software. In essence, Speex is to speech what Vorbis is to audio/music. Unlike many other speech codecs, Speex is not designed for mobile phones but rather for packet networks and voice over IP (VoIP) applications. File-based compression is of course also supported. \end_layout \begin_layout Standard The Speex codec is designed to be very flexible and support a wide range of speech quality and bit-rate. Support for very good quality speech also means that Speex can encode wideband speech (16 kHz sampling rate) in addition to narrowband speech (telephone quality, 8 kHz sampling rate). \end_layout \begin_layout Standard Designing for VoIP instead of mobile phones means that Speex is robust to lost packets, but not to corrupted ones. This is based on the assumption that in VoIP, packets either arrive unaltered or don't arrive at all. Because Speex is targeted at a wide range of devices, it has modest (adjustable ) complexity and a small memory footprint. \end_layout \begin_layout Standard All the design goals led to the choice of CELP \begin_inset Index status collapsed \begin_layout Plain Layout CELP \end_layout \end_inset as the encoding technique. One of the main reasons is that CELP has long proved that it could work reliably and scale well to both low bit-rates (e.g. DoD CELP @ 4.8 kbps) and high bit-rates (e.g. G.728 @ 16 kbps). \end_layout \begin_layout Section Getting help \begin_inset CommandInset label LatexCommand label name "sec:Getting-help" \end_inset \end_layout \begin_layout Standard As for many open source projects, there are many ways to get help with Speex. These include: \end_layout \begin_layout Itemize This manual \end_layout \begin_layout Itemize Other documentation on the Speex website (http://www.speex.org/) \end_layout \begin_layout Itemize Mailing list: Discuss any Speex-related topic on speex-dev@xiph.org (not just for developers) \end_layout \begin_layout Itemize IRC: The main channel is #speex on irc.freenode.net. Note that due to time differences, it may take a while to get someone, so please be patient. \end_layout \begin_layout Itemize Email the author privately at jean-marc.valin@usherbrooke.ca \series bold only \series default for private/delicate topics you do not wish to discuss publicly. \end_layout \begin_layout Standard Before asking for help (mailing list or IRC), \series bold it is important to first read this manual \series default (OK, so if you made it here it's already a good sign). It is generally considered rude to ask on a mailing list about topics that are clearly detailed in the documentation. On the other hand, it's perfectly OK (and encouraged) to ask for clarifications about something covered in the manual. This manual does not (yet) cover everything about Speex, so everyone is encouraged to ask questions, send comments, feature requests, or just let us know how Speex is being used. \end_layout \begin_layout Standard Here are some additional guidelines related to the mailing list. Before reporting bugs in Speex to the list, it is strongly recommended (if possible) to first test whether these bugs can be reproduced using the speexenc and speexdec (see Section \begin_inset CommandInset ref LatexCommand ref reference "sec:Command-line-encoder/decoder" \end_inset ) command-line utilities. Bugs reported based on 3rd party code are both harder to find and far too often caused by errors that have nothing to do with Speex. \end_layout \begin_layout Section About this document \end_layout \begin_layout Standard This document is divided in the following way. Section \begin_inset CommandInset ref LatexCommand ref reference "sec:Feature-description" \end_inset describes the different Speex features and defines many basic terms that are used throughout this manual. Section \begin_inset CommandInset ref LatexCommand ref reference "sec:Command-line-encoder/decoder" \end_inset documents the standard command-line tools provided in the Speex distribution. Section \begin_inset CommandInset ref LatexCommand ref reference "sec:Programming-with-Speex" \end_inset includes detailed instructions about programming using the libspeex \begin_inset Index status collapsed \begin_layout Plain Layout libspeex \end_layout \end_inset API. Section \begin_inset CommandInset ref LatexCommand ref reference "sec:Formats-and-standards" \end_inset has some information related to Speex and standards. \end_layout \begin_layout Standard The three last sections describe the algorithms used in Speex. These sections require signal processing knowledge, but are not required for merely using Speex. They are intended for people who want to understand how Speex really works and/or want to do research based on Speex. Section \begin_inset CommandInset ref LatexCommand ref reference "sec:Introduction-to-CELP" \end_inset explains the general idea behind CELP, while sections \begin_inset CommandInset ref LatexCommand ref reference "sec:Speex-narrowband-mode" \end_inset and \begin_inset CommandInset ref LatexCommand ref reference "sec:Speex-wideband-mode" \end_inset are specific to Speex. \end_layout \begin_layout Standard \begin_inset Newpage newpage \end_inset \end_layout \begin_layout Chapter Codec description \begin_inset CommandInset label LatexCommand label name "sec:Feature-description" \end_inset \end_layout \begin_layout Standard This section describes Speex and its features into more details. \end_layout \begin_layout Section Concepts \end_layout \begin_layout Standard Before introducing all the Speex features, here are some concepts in speech coding that help better understand the rest of the manual. Although some are general concepts in speech/audio processing, others are specific to Speex. \end_layout \begin_layout Subsection* Sampling rate \begin_inset Index status collapsed \begin_layout Plain Layout sampling rate \end_layout \end_inset \end_layout \begin_layout Standard The sampling rate expressed in Hertz (Hz) is the number of samples taken from a signal per second. For a sampling rate of \begin_inset Formula $F_{s}$ \end_inset kHz, the highest frequency that can be represented is equal to \begin_inset Formula $F_{s}/2$ \end_inset kHz ( \begin_inset Formula $F_{s}/2$ \end_inset is known as the Nyquist frequency). This is a fundamental property in signal processing and is described by the sampling theorem. Speex is mainly designed for three different sampling rates: 8 kHz, 16 kHz, and 32 kHz. These are respectively referred to as narrowband \begin_inset Index status collapsed \begin_layout Plain Layout narrowband \end_layout \end_inset , wideband \begin_inset Index status collapsed \begin_layout Plain Layout wideband \end_layout \end_inset and ultra-wideband \begin_inset Index status collapsed \begin_layout Plain Layout ultra-wideband \end_layout \end_inset . \end_layout \begin_layout Subsection* Bit-rate \end_layout \begin_layout Standard When encoding a speech signal, the bit-rate is defined as the number of bits per unit of time required to encode the speech. It is measured in \emph on bits per second \emph default (bps), or generally \emph on kilobits per second \emph default . It is important to make the distinction between \emph on kilo \series bold bits \series default \emph default \emph on per second \emph default (k \series bold b \series default ps) and \emph on kilo \series bold bytes \series default \emph default \emph on per second \emph default (k \series bold B \series default ps). \end_layout \begin_layout Subsection* Quality \begin_inset Index status collapsed \begin_layout Plain Layout quality \end_layout \end_inset (variable) \end_layout \begin_layout Standard Speex is a lossy codec, which means that it achieves compression at the expense of fidelity of the input speech signal. Unlike some other speech codecs, it is possible to control the trade-off made between quality and bit-rate. The Speex encoding process is controlled most of the time by a quality parameter that ranges from 0 to 10. In constant bit-rate \begin_inset Index status collapsed \begin_layout Plain Layout constant bit-rate \end_layout \end_inset (CBR) operation, the quality parameter is an integer, while for variable bit-rate (VBR), the parameter is a float. \end_layout \begin_layout Subsection* Complexity \begin_inset Index status collapsed \begin_layout Plain Layout complexity \end_layout \end_inset (variable) \end_layout \begin_layout Standard With Speex, it is possible to vary the complexity allowed for the encoder. This is done by controlling how the search is performed with an integer ranging from 1 to 10 in a way that's similar to the -1 to -9 options to \emph on gzip \emph default and \emph on bzip2 \emph default compression utilities. For normal use, the noise level at complexity 1 is between 1 and 2 dB higher than at complexity 10, but the CPU requirements for complexity 10 is about 5 times higher than for complexity 1. In practice, the best trade-off is between complexity 2 and 4, though higher settings are often useful when encoding non-speech sounds like DTMF \begin_inset Index status collapsed \begin_layout Plain Layout DTMF \end_layout \end_inset tones. \end_layout \begin_layout Subsection* Variable Bit-Rate \begin_inset Index status collapsed \begin_layout Plain Layout variable bit-rate \end_layout \end_inset (VBR) \end_layout \begin_layout Standard Variable bit-rate (VBR) allows a codec to change its bit-rate dynamically to adapt to the \begin_inset Quotes eld \end_inset difficulty \begin_inset Quotes erd \end_inset of the audio being encoded. In the example of Speex, sounds like vowels and high-energy transients require a higher bit-rate to achieve good quality, while fricatives (e.g. s,f sounds) can be coded adequately with less bits. For this reason, VBR can achieve lower bit-rate for the same quality, or a better quality for a certain bit-rate. Despite its advantages, VBR has two main drawbacks: first, by only specifying quality, there's no guaranty about the final average bit-rate. Second, for some real-time applications like voice over IP (VoIP), what counts is the maximum bit-rate, which must be low enough for the communication channel. \end_layout \begin_layout Subsection* Average Bit-Rate \begin_inset Index status collapsed \begin_layout Plain Layout average bit-rate \end_layout \end_inset (ABR) \end_layout \begin_layout Standard Average bit-rate solves one of the problems of VBR, as it dynamically adjusts VBR quality in order to meet a specific target bit-rate. Because the quality/bit-rate is adjusted in real-time (open-loop), the global quality will be slightly lower than that obtained by encoding in VBR with exactly the right quality setting to meet the target average bit-rate. \end_layout \begin_layout Subsection* Voice Activity Detection \begin_inset Index status collapsed \begin_layout Plain Layout voice activity detection \end_layout \end_inset (VAD) \end_layout \begin_layout Standard When enabled, voice activity detection detects whether the audio being encoded is speech or silence/background noise. VAD is always implicitly activated when encoding in VBR, so the option is only useful in non-VBR operation. In this case, Speex detects non-speech periods and encode them with just enough bits to reproduce the background noise. This is called \begin_inset Quotes eld \end_inset comfort noise generation \begin_inset Quotes erd \end_inset (CNG). \end_layout \begin_layout Subsection* Discontinuous Transmission \begin_inset Index status collapsed \begin_layout Plain Layout discontinuous transmission \end_layout \end_inset (DTX) \end_layout \begin_layout Standard Discontinuous transmission is an addition to VAD/VBR operation, that allows to stop transmitting completely when the background noise is stationary. In file-based operation, since we cannot just stop writing to the file, only 5 bits are used for such frames (corresponding to 250 bps). \end_layout \begin_layout Subsection* Perceptual enhancement \begin_inset Index status collapsed \begin_layout Plain Layout perceptual enhancement \end_layout \end_inset \end_layout \begin_layout Standard Perceptual enhancement is a part of the decoder which, when turned on, attempts to reduce the perception of the noise/distortion produced by the encoding/decod ing process. In most cases, perceptual enhancement brings the sound further from the original \emph on objectively \emph default (e.g. considering only SNR), but in the end it still \emph on sounds \emph default better (subjective improvement). \end_layout \begin_layout Subsection* Latency and algorithmic delay \begin_inset Index status collapsed \begin_layout Plain Layout algorithmic delay \end_layout \end_inset \end_layout \begin_layout Standard Every speech codec introduces a delay in the transmission. For Speex, this delay is equal to the frame size, plus some amount of \begin_inset Quotes eld \end_inset look-ahead \begin_inset Quotes erd \end_inset required to process each frame. In narrowband operation (8 kHz), the look-ahead is 10 ms, in wideband operation (16 kHz), the look-ahead is 13.9 ms and in ultra-wideband operation (32 kHz) look-ahead is 15.9 ms, resulting in the algorithic delays of 30 ms, 33.9 ms and 35.9 ms accordingly. These values don't account for the CPU time it takes to encode or decode the frames. \end_layout \begin_layout Section Codec \end_layout \begin_layout Standard The main characteristics of Speex can be summarized as follows: \end_layout \begin_layout Itemize Free software/open-source \begin_inset Index status collapsed \begin_layout Plain Layout open-source \end_layout \end_inset , patent \begin_inset Index status collapsed \begin_layout Plain Layout patent \end_layout \end_inset and royalty-free \end_layout \begin_layout Itemize Integration of narrowband \begin_inset Index status collapsed \begin_layout Plain Layout narrowband \end_layout \end_inset and wideband \begin_inset Index status collapsed \begin_layout Plain Layout wideband \end_layout \end_inset using an embedded bit-stream \end_layout \begin_layout Itemize Wide range of bit-rates available (from 2.15 kbps to 44 kbps) \end_layout \begin_layout Itemize Dynamic bit-rate switching (AMR) and Variable Bit-Rate \begin_inset Index status collapsed \begin_layout Plain Layout variable bit-rate \end_layout \end_inset (VBR) operation \end_layout \begin_layout Itemize Voice Activity Detection \begin_inset Index status collapsed \begin_layout Plain Layout voice activity detection \end_layout \end_inset (VAD, integrated with VBR) and discontinuous transmission (DTX) \end_layout \begin_layout Itemize Variable complexity \begin_inset Index status collapsed \begin_layout Plain Layout complexity \end_layout \end_inset \end_layout \begin_layout Itemize Embedded wideband structure (scalable sampling rate) \end_layout \begin_layout Itemize Ultra-wideband sampling rate at 32 kHz \end_layout \begin_layout Itemize Intensity stereo encoding option \end_layout \begin_layout Itemize Fixed-point implementation \end_layout \begin_layout Section Preprocessor \end_layout \begin_layout Standard This part refers to the preprocessor module introduced in the 1.1.x branch. The preprocessor is designed to be used on the audio \emph on before \emph default running the encoder. The preprocessor provides three main functionalities: \end_layout \begin_layout Itemize noise suppression \end_layout \begin_layout Itemize automatic gain control (AGC) \end_layout \begin_layout Itemize voice activity detection (VAD) \end_layout \begin_layout Standard The denoiser can be used to reduce the amount of background noise present in the input signal. This provides higher quality speech whether or not the denoised signal is encoded with Speex (or at all). However, when using the denoised signal with the codec, there is an additional benefit. Speech codecs in general (Speex included) tend to perform poorly on noisy input, which tends to amplify the noise. The denoiser greatly reduces this effect. \end_layout \begin_layout Standard Automatic gain control (AGC) is a feature that deals with the fact that the recording volume may vary by a large amount between different setups. The AGC provides a way to adjust a signal to a reference volume. This is useful for voice over IP because it removes the need for manual adjustment of the microphone gain. A secondary advantage is that by setting the microphone gain to a conservative (low) level, it is easier to avoid clipping. \end_layout \begin_layout Standard The voice activity detector (VAD) provided by the preprocessor is more advanced than the one directly provided in the codec. \end_layout \begin_layout Section Adaptive Jitter Buffer \end_layout \begin_layout Standard When transmitting voice (or any content for that matter) over UDP or RTP, packet may be lost, arrive with different delay, or even out of order. The purpose of a jitter buffer is to reorder packets and buffer them long enough (but no longer than necessary) so they can be sent to be decoded. \end_layout \begin_layout Section Acoustic Echo Canceller \end_layout \begin_layout Standard In any hands-free communication system (Fig. \begin_inset CommandInset ref LatexCommand ref reference "fig:Acoustic-echo-model" \end_inset ), speech from the remote end is played in the local loudspeaker, propagates in the room and is captured by the microphone. If the audio captured from the microphone is sent directly to the remote end, then the remote user hears an echo of his voice. An acoustic echo canceller is designed to remove the acoustic echo before it is sent to the remote end. It is important to understand that the echo canceller is meant to improve the quality on the \series bold remote \series default end. For those who care a lot about mouth-to-ear delays it should be noted that unlike Speex codec, resampler and preprocessor, this Acoustic Echo Canceller does not introduce any latency. \end_layout \begin_layout Standard \begin_inset Float figure wide false sideways false status open \begin_layout Plain Layout \begin_inset ERT status collapsed \begin_layout Plain Layout \backslash begin{center} \end_layout \end_inset \begin_inset Graphics filename echo_path.eps width 10cm \end_inset \begin_inset ERT status collapsed \begin_layout Plain Layout \backslash end{center} \end_layout \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption \begin_layout Plain Layout Acoustic echo model \begin_inset CommandInset label LatexCommand label name "fig:Acoustic-echo-model" \end_inset \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Section Resampler \end_layout \begin_layout Standard In some cases, it may be useful to convert audio from one sampling rate to another. There are many reasons for that. It can be for mixing streams that have different sampling rates, for supporting sampling rates that the soundcard doesn't support, for transcoding, etc. That's why there is now a resampler that is part of the Speex project. This resampler can be used to convert between any two arbitrary rates (the ratio must only be a rational number) and there is control over the quality/com plexity tradeoff. Keep in mind, that resampler introduce some delay in audio stream, which size depends on resampler quality setting. Refer to resampler API documentation to know how to get exact delay values. \end_layout \begin_layout Section Integration \end_layout \begin_layout Standard Knowing \emph on how \emph default to use each of the components is not that useful unless we know \emph on where \emph default to use them. Figure \begin_inset CommandInset ref LatexCommand ref reference "fig:Integration-VoIP" \end_inset shows where each of the components would be used in a typical VoIP client. Components in dotted lines are optional, though they may be very useful in some circumstances. There are several important things to note from there. The AEC must be placed as close as possible to the playback and capture. Only the resampling may be closer. Also, it is very important to use the same clock for both mic capture and speaker/headphones playback. \end_layout \begin_layout Standard \begin_inset Float figure wide false sideways false status open \begin_layout Plain Layout \begin_inset ERT status collapsed \begin_layout Plain Layout \backslash begin{center} \end_layout \end_inset \begin_inset Graphics filename components.eps width 80text% \end_inset \begin_inset ERT status collapsed \begin_layout Plain Layout \backslash end{center} \end_layout \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption \begin_layout Plain Layout Integration of all the components in a VoIP client. \begin_inset CommandInset label LatexCommand label name "fig:Integration-VoIP" \end_inset \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Standard \begin_inset Newpage newpage \end_inset \end_layout \begin_layout Chapter Compiling and Porting \end_layout \begin_layout Standard Compiling Speex under UNIX/Linux or any other platform supported by autoconf (e.g. Win32/cygwin) is as easy as typing: \end_layout \begin_layout LyX-Code % ./configure [options] \end_layout \begin_layout LyX-Code % make \end_layout \begin_layout LyX-Code % make install \end_layout \begin_layout Standard The options supported by the Speex configure script are: \end_layout \begin_layout Description --prefix= Specifies the base path for installing Speex (e.g. /usr) \end_layout \begin_layout Description --enable-shared/--disable-shared Whether to compile shared libraries \end_layout \begin_layout Description --enable-static/--disable-static Whether to compile static libraries \end_layout \begin_layout Description --disable-wideband Disable the wideband part of Speex (typically to save space) \end_layout \begin_layout Description --enable-valgrind Enable extra hits for valgrind for debugging purposes (do not use by default) \end_layout \begin_layout Description --enable-sse Enable use of SSE instructions (x86/float only) \end_layout \begin_layout Description --enable-fixed-point \begin_inset Index status collapsed \begin_layout Plain Layout fixed-point \end_layout \end_inset Compile Speex for a processor that does not have a floating point unit (FPU) \end_layout \begin_layout Description --enable-arm4-asm Enable assembly specific to the ARMv4 architecture (gcc only) \end_layout \begin_layout Description --enable-arm5e-asm Enable assembly specific to the ARMv5E architecture (gcc only) \end_layout \begin_layout Description --enable-fixed-point-debug Use only for debugging the fixed-point \begin_inset Index status collapsed \begin_layout Plain Layout fixed-point \end_layout \end_inset code (very slow) \end_layout \begin_layout Description --enable-ti-c55x Enable support for the TI C5x family \end_layout \begin_layout Description --enable-blackfin-asm Enable assembly specific to the Blackfin DSP architecture (gcc only) \end_layout \begin_layout Section Platforms \end_layout \begin_layout Standard Speex is known to compile and work on a large number of architectures, both floating-point and fixed-point. In general, any architecture that can natively compute the multiplication of two signed 16-bit numbers (32-bit result) and runs at a sufficient clock rate (architecture-dependent) is capable of running Speex. Architectures on which Speex is \series bold known \series default to work (it probably works on many others) are: \end_layout \begin_layout Itemize x86 & x86-64 \end_layout \begin_layout Itemize Power \end_layout \begin_layout Itemize SPARC \end_layout \begin_layout Itemize ARM \end_layout \begin_layout Itemize Blackfin \end_layout \begin_layout Itemize Coldfire (68k family) \end_layout \begin_layout Itemize TI C54xx & C55xx \end_layout \begin_layout Itemize TI C6xxx \end_layout \begin_layout Itemize TriMedia (experimental) \end_layout \begin_layout Standard Operating systems on top of which Speex is known to work include (it probably works on many others): \end_layout \begin_layout Itemize Linux \end_layout \begin_layout Itemize \begin_inset Formula $\mu$ \end_inset Clinux \end_layout \begin_layout Itemize MacOS X \end_layout \begin_layout Itemize BSD \end_layout \begin_layout Itemize Other UNIX/POSIX variants \end_layout \begin_layout Itemize Symbian \end_layout \begin_layout Standard The source code directory include additional information for compiling on certain architectures or operating systems in README.xxx files. \end_layout \begin_layout Section Porting and Optimising \end_layout \begin_layout Standard Here are a few things to consider when porting or optimising Speex for a new platform or an existing one. \end_layout \begin_layout Subsection CPU optimisation \end_layout \begin_layout Standard The single factor that will affect the CPU usage of Speex the most is whether it is compiled for floating point or fixed-point. If your CPU/DSP does not have a floating-point unit FPU, then compiling as fixed-point will be orders of magnitudes faster. If there is an FPU present, then it is important to test which version is faster. On the x86 architecture, floating-point is \series bold generally \series default faster, but not always. To compile Speex as fixed-point, you need to pass --fixed-point to the configure script or define the FIXED_POINT macro for the compiler. As of 1.2beta3, it is now possible to disable the floating-point compatibility API, which means that your code can link without a float emulation library. To do that configure with --disable-float-api or define the DISABLE_FLOAT_API macro. Until the VBR feature is ported to fixed-point, you will also need to configure with --disable-vbr or define DISABLE_VBR. \end_layout \begin_layout Standard Other important things to check on some DSP architectures are: \end_layout \begin_layout Itemize Make sure the cache is set to write-back mode \end_layout \begin_layout Itemize If the chip has SRAM instead of cache, make sure as much code and data are in SRAM, rather than in RAM \end_layout \begin_layout Standard If you are going to be writing assembly, then the following functions are \series bold usually \series default the first ones you should consider optimising: \end_layout \begin_layout Itemize \begin_inset listings inline true status collapsed \begin_layout Plain Layout filter_mem16() \end_layout \end_inset \end_layout \begin_layout Itemize \begin_inset listings inline true status collapsed \begin_layout Plain Layout iir_mem16() \end_layout \end_inset \end_layout \begin_layout Itemize \begin_inset listings inline true status collapsed \begin_layout Plain Layout vq_nbest() \end_layout \end_inset \end_layout \begin_layout Itemize \begin_inset listings inline true status collapsed \begin_layout Plain Layout pitch_xcorr() \end_layout \end_inset \end_layout \begin_layout Itemize \begin_inset listings inline true status collapsed \begin_layout Plain Layout interp_pitch() \end_layout \end_inset \end_layout \begin_layout Standard The filtering functions \begin_inset listings inline true status collapsed \begin_layout Plain Layout filter_mem16() \end_layout \end_inset and \begin_inset listings inline true status collapsed \begin_layout Plain Layout iir_mem16() \end_layout \end_inset are implemented in the direct form II transposed (DF2T). However, for architectures based on multiply-accumulate (MAC), DF2T requires frequent reload of the accumulator, which can make the code very slow. For these architectures (e.g. Blackfin and Coldfire), a better approach is to implement those functions as direct form I (DF1), which is easier to express in terms of MAC. When doing that however, \series bold it is important to make sure that the DF1 implementation still behaves like the original DF2T behaviour when it comes to memory values \series default . This is necessary because the filter is time-varying and must compute exactly the same value (not counting machine rounding) on any encoder or decoder. \end_layout \begin_layout Subsection Memory optimisation \end_layout \begin_layout Standard Memory optimisation is mainly something that should be considered for small embedded platforms. For PCs, Speex is already so tiny that it's just not worth doing any of the things suggested here. There are several ways to reduce the memory usage of Speex, both in terms of code size and data size. For optimising code size, the trick is to first remove features you do not need. Some examples of things that can easily be disabled \series bold if you don't need them \series default are: \end_layout \begin_layout Itemize Wideband support (--disable-wideband) \end_layout \begin_layout Itemize Support for stereo (removing stereo.c) \end_layout \begin_layout Itemize VBR support (--disable-vbr or DISABLE_VBR) \end_layout \begin_layout Itemize Static codebooks that are not needed for the bit-rates you are using (*_table.c files) \end_layout \begin_layout Standard Speex also has several methods for allocating temporary arrays. When using a compiler that supports C99 properly (as of 2007, Microsoft compilers don't, but gcc does), it is best to define VAR_ARRAYS. That makes use of the variable-size array feature of C99. The next best is to define USE_ALLOCA so that Speex can use alloca() to allocate the temporary arrays. Note that on many systems, alloca() is buggy so it may not work. If none of VAR_ARRAYS and USE_ALLOCA are defined, then Speex falls back to allocating a large \begin_inset Quotes eld \end_inset scratch space \begin_inset Quotes erd \end_inset and doing its own internal allocation. The main disadvantage of this solution is that it is wasteful. It needs to allocate enough stack for the worst case scenario (worst bit-rate, highest complexity setting, ...) and by default, the memory isn't shared between multiple encoder/decoder states. Still, if the \begin_inset Quotes eld \end_inset manual \begin_inset Quotes erd \end_inset allocation is the only option left, there are a few things that can be improved. By overriding the speex_alloc_scratch() call in os_support.h, it is possible to always return the same memory area for all states \begin_inset Foot status collapsed \begin_layout Plain Layout In this case, one must be careful with threads \end_layout \end_inset . In addition to that, by redefining the NB_ENC_STACK and NB_DEC_STACK (or similar for wideband), it is possible to only allocate memory for a scenario that is known in advance. In this case, it is important to measure the amount of memory required for the specific sampling rate, bit-rate and complexity level being used. \end_layout \begin_layout Standard \begin_inset Newpage newpage \end_inset \end_layout \begin_layout Chapter Command-line encoder/decoder \begin_inset CommandInset label LatexCommand label name "sec:Command-line-encoder/decoder" \end_inset \end_layout \begin_layout Standard The base Speex distribution includes a command-line encoder ( \emph on speexenc \emph default ) and decoder ( \emph on speexdec \emph default ). Those tools produce and read Speex files encapsulated in the Ogg container. Although it is possible to encapsulate Speex in any container, Ogg is the recommended container for files. This section describes how to use the command line tools for Speex files in Ogg. \end_layout \begin_layout Section \emph on speexenc \begin_inset Index status collapsed \begin_layout Plain Layout speexenc \end_layout \end_inset \end_layout \begin_layout Standard The \emph on speexenc \emph default utility is used to create Speex files from raw PCM or wave files. It can be used by calling: \end_layout \begin_layout LyX-Code speexenc [options] input_file output_file \end_layout \begin_layout Standard The value '-' for input_file or output_file corresponds respectively to stdin and stdout. The valid options are: \end_layout \begin_layout Description --narrowband \begin_inset space ~ \end_inset (-n) Tell Speex to treat the input as narrowband (8 kHz). This is the default \end_layout \begin_layout Description --wideband \begin_inset space ~ \end_inset (-w) Tell Speex to treat the input as wideband (16 kHz) \end_layout \begin_layout Description --ultra-wideband \begin_inset space ~ \end_inset (-u) Tell Speex to treat the input as \begin_inset Quotes eld \end_inset ultra-wideband \begin_inset Quotes erd \end_inset (32 kHz) \end_layout \begin_layout Description --quality \begin_inset space ~ \end_inset n Set the encoding quality (0-10), default is 8 \end_layout \begin_layout Description --bitrate \begin_inset space ~ \end_inset n Encoding bit-rate (use bit-rate n or lower) \end_layout \begin_layout Description --vbr Enable VBR (Variable Bit-Rate), disabled by default \end_layout \begin_layout Description --abr \begin_inset space ~ \end_inset n Enable ABR (Average Bit-Rate) at n kbps, disabled by default \end_layout \begin_layout Description --vad Enable VAD (Voice Activity Detection), disabled by default \end_layout \begin_layout Description --dtx Enable DTX (Discontinuous Transmission), disabled by default \end_layout \begin_layout Description --nframes \begin_inset space ~ \end_inset n Pack n frames in each Ogg packet (this saves space at low bit-rates) \end_layout \begin_layout Description --comp \begin_inset space ~ \end_inset n Set encoding speed/quality tradeoff. The higher the value of n, the slower the encoding (default is 3) \end_layout \begin_layout Description -V Verbose operation, print bit-rate currently in use \end_layout \begin_layout Description --help \begin_inset space ~ \end_inset (-h) Print the help \end_layout \begin_layout Description --version \begin_inset space ~ \end_inset (-v) Print version information \end_layout \begin_layout Subsection* Speex comments \end_layout \begin_layout Description --comment Add the given string as an extra comment. This may be used multiple times. \end_layout \begin_layout Description --author Author of this track. \end_layout \begin_layout Description --title Title for this track. \end_layout \begin_layout Subsection* Raw input options \end_layout \begin_layout Description --rate \begin_inset space ~ \end_inset n Sampling rate for raw input \end_layout \begin_layout Description --stereo Consider raw input as stereo \end_layout \begin_layout Description --le Raw input is little-endian \end_layout \begin_layout Description --be Raw input is big-endian \end_layout \begin_layout Description --8bit Raw input is 8-bit unsigned \end_layout \begin_layout Description --16bit Raw input is 16-bit signed \end_layout \begin_layout Section \emph on speexdec \begin_inset Index status collapsed \begin_layout Plain Layout speexdec \end_layout \end_inset \end_layout \begin_layout Standard The \emph on speexdec \emph default utility is used to decode Speex files and can be used by calling: \end_layout \begin_layout LyX-Code speexdec [options] speex_file [output_file] \end_layout \begin_layout Standard The value '-' for input_file or output_file corresponds respectively to stdin and stdout. Also, when no output_file is specified, the file is played to the soundcard. The valid options are: \end_layout \begin_layout Description --enh enable post-filter (default) \end_layout \begin_layout Description --no-enh disable post-filter \end_layout \begin_layout Description --force-nb Force decoding in narrowband \end_layout \begin_layout Description --force-wb Force decoding in wideband \end_layout \begin_layout Description --force-uwb Force decoding in ultra-wideband \end_layout \begin_layout Description --mono Force decoding in mono \end_layout \begin_layout Description --stereo Force decoding in stereo \end_layout \begin_layout Description --rate \begin_inset space ~ \end_inset n Force decoding at n Hz sampling rate \end_layout \begin_layout Description --packet-loss \begin_inset space ~ \end_inset n Simulate n % random packet loss \end_layout \begin_layout Description -V Verbose operation, print bit-rate currently in use \end_layout \begin_layout Description --help \begin_inset space ~ \end_inset (-h) Print the help \end_layout \begin_layout Description --version \begin_inset space ~ \end_inset (-v) Print version information \end_layout \begin_layout Standard \begin_inset Newpage newpage \end_inset \end_layout \begin_layout Chapter Using the Speex Codec API ( \emph on libspeex \emph default \begin_inset Index status collapsed \begin_layout Plain Layout libspeex \end_layout \end_inset ) \begin_inset CommandInset label LatexCommand label name "sec:Programming-with-Speex" \end_inset \end_layout \begin_layout Standard The \emph on libspeex \emph default library contains all the functions for encoding and decoding speech with the Speex codec. When linking on a UNIX system, one must add \emph on -lspeex -lm \emph default to the compiler command line. One important thing to know is that \series bold libspeex calls are reentrant, but not thread-safe \series default . That means that it is fine to use calls from many threads, but \series bold calls using the same state from multiple threads must be protected by mutexes \series default . Examples of code can also be found in Appendix \begin_inset CommandInset ref LatexCommand ref reference "sec:Sample-code" \end_inset and the complete API documentation is included in the Documentation section of the Speex website (http://www.speex.org/). \end_layout \begin_layout Section Encoding \begin_inset CommandInset label LatexCommand label name "sub:Encoding" \end_inset \end_layout \begin_layout Standard In order to encode speech using Speex, one first needs to: \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout #include \end_layout \end_inset Then in the code, a Speex bit-packing struct must be declared, along with a Speex encoder state: \begin_inset listings inline false status open \begin_layout Plain Layout SpeexBits bits; \end_layout \begin_layout Plain Layout void *enc_state; \end_layout \end_inset The two are initialized by: \begin_inset listings inline false status open \begin_layout Plain Layout speex_bits_init(&bits); \end_layout \begin_layout Plain Layout enc_state = speex_encoder_init(&speex_nb_mode); \end_layout \end_inset \end_layout \begin_layout Standard For wideband coding, \emph on speex_nb_mode \emph default will be replaced by \emph on speex_wb_mode \emph default . In most cases, you will need to know the frame size used at the sampling rate you are using. You can get that value in the \emph on frame_size \emph default variable (expressed in \series bold samples \series default , not bytes) with: \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout speex_encoder_ctl(enc_state,SPEEX_GET_FRAME_SIZE,&frame_size); \end_layout \end_inset \end_layout \begin_layout Standard In practice, \emph on frame_size \emph default will correspond to 20 ms when using 8, 16, or 32 kHz sampling rate. There are many parameters that can be set for the Speex encoder, but the most useful one is the quality parameter that controls the quality vs bit-rate tradeoff. This is set by: \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout speex_encoder_ctl(enc_state,SPEEX_SET_QUALITY,&quality); \end_layout \end_inset where \emph on quality \emph default is an integer value ranging from 0 to 10 (inclusively). The mapping between quality and bit-rate is described in Fig. \begin_inset CommandInset ref LatexCommand ref reference "cap:quality_vs_bps" \end_inset for narrowband. \end_layout \begin_layout Standard Once the initialization is done, for every input frame: \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout speex_bits_reset(&bits); \end_layout \begin_layout Plain Layout speex_encode_int(enc_state, input_frame, &bits); \end_layout \begin_layout Plain Layout nbBytes = speex_bits_write(&bits, byte_ptr, MAX_NB_BYTES); \end_layout \end_inset \end_layout \begin_layout Standard where \emph on input_frame \emph default is a \emph on ( \emph default short \emph on *) \emph default pointing to the beginning of a speech frame, \emph on byte_ptr \emph default is a \emph on (char *) \emph default where the encoded frame will be written, \emph on MAX_NB_BYTES \emph default is the maximum number of bytes that can be written to \emph on byte_ptr \emph default without causing an overflow and \emph on nbBytes \emph default is the number of bytes actually written to \emph on byte_ptr \emph default (the encoded size in bytes). Before calling speex_bits_write, it is possible to find the number of bytes that need to be written by calling \family typewriter speex_bits_nbytes(&bits) \family default , which returns a number of bytes. \end_layout \begin_layout Standard It is still possible to use the \emph on speex_encode() \emph default function, which takes a \emph on (float *) \emph default for the audio. However, this would make an eventual port to an FPU-less platform (like ARM) more complicated. Internally, \emph on speex_encode() \emph default and \emph on speex_encode_int() \emph default are processed in the same way. Whether the encoder uses the fixed-point version is only decided by the compile-time flags, not at the API level. \end_layout \begin_layout Standard After you're done with the encoding, free all resources with: \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout speex_bits_destroy(&bits); \end_layout \begin_layout Plain Layout speex_encoder_destroy(enc_state); \end_layout \end_inset \end_layout \begin_layout Standard That's about it for the encoder. \end_layout \begin_layout Section Decoding \begin_inset CommandInset label LatexCommand label name "sub:Decoding" \end_inset \end_layout \begin_layout Standard In order to decode speech using Speex, you first need to: \begin_inset listings inline false status open \begin_layout Plain Layout #include \end_layout \end_inset You also need to declare a Speex bit-packing struct \begin_inset listings inline false status open \begin_layout Plain Layout SpeexBits bits; \end_layout \end_inset and a Speex decoder state \begin_inset listings inline false status open \begin_layout Plain Layout void *dec_state; \end_layout \end_inset The two are initialized by: \begin_inset listings inline false status open \begin_layout Plain Layout speex_bits_init(&bits); \end_layout \begin_layout Plain Layout dec_state = speex_decoder_init(&speex_nb_mode); \end_layout \end_inset \end_layout \begin_layout Standard For wideband decoding, \emph on speex_nb_mode \emph default will be replaced by \emph on speex_wb_mode \emph default . If you need to obtain the size of the frames that will be used by the decoder, you can get that value in the \emph on frame_size \emph default variable (expressed in \series bold samples \series default , not bytes) with: \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout speex_decoder_ctl(dec_state, SPEEX_GET_FRAME_SIZE, &frame_size); \end_layout \end_inset \end_layout \begin_layout Standard There is also a parameter that can be set for the decoder: whether or not to use a perceptual enhancer. This can be set by: \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout speex_decoder_ctl(dec_state, SPEEX_SET_ENH, &enh); \end_layout \end_inset \end_layout \begin_layout Standard where \emph on enh \emph default is an int with value 0 to have the enhancer disabled and 1 to have it enabled. As of 1.2-beta1, the default is now to enable the enhancer. \end_layout \begin_layout Standard Again, once the decoder initialization is done, for every input frame: \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout speex_bits_read_from(&bits, input_bytes, nbBytes); \end_layout \begin_layout Plain Layout speex_decode_int(dec_state, &bits, output_frame); \end_layout \end_inset where input_bytes is a \emph on (char *) \emph default containing the bit-stream data received for a frame, \emph on nbBytes \emph default is the size (in bytes) of that bit-stream, and \emph on output_frame \emph default is a \emph on (short *) \emph default and points to the area where the decoded speech frame will be written. A NULL value as the second argument indicates that we don't have the bits for the current frame. When a frame is lost, the Speex decoder will do its best to "guess" the correct signal. \end_layout \begin_layout Standard As for the encoder, the \emph on speex_decode() \emph default function can still be used, with a \emph on (float *) \emph default as the output for the audio. After you're done with the decoding, free all resources with: \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout speex_bits_destroy(&bits); \end_layout \begin_layout Plain Layout speex_decoder_destroy(dec_state); \end_layout \end_inset \end_layout \begin_layout Section Codec Options (speex_*_ctl) \begin_inset CommandInset label LatexCommand label name "sub:Codec-Options" \end_inset \end_layout \begin_layout Quote \align center \emph on Entities should not be multiplied beyond necessity -- William of Ockham. \end_layout \begin_layout Quote \align center \emph on Just because there's an option for it doesn't mean you have to turn it on -- me. \end_layout \begin_layout Standard The Speex encoder and decoder support many options and requests that can be accessed through the \emph on speex_encoder_ctl \emph default and \emph on speex_decoder_ctl \emph default functions. These functions are similar to the \emph on ioctl \emph default system call and their prototypes are: \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout void speex_encoder_ctl(void *encoder, int request, void *ptr); \end_layout \begin_layout Plain Layout void speex_decoder_ctl(void *encoder, int request, void *ptr); \end_layout \end_inset \end_layout \begin_layout Standard Despite those functions, the defaults are usually good for many applications and \series bold optional settings should only be used when one understands them and knows that they are needed \series default . A common error is to attempt to set many unnecessary settings. \end_layout \begin_layout Standard Here is a list of the values allowed for the requests. Some only apply to the encoder or the decoder. Because the last argument is of type \begin_inset listings inline true status collapsed \begin_layout Plain Layout void * \end_layout \end_inset , the \begin_inset listings inline true status collapsed \begin_layout Plain Layout _ctl() \end_layout \end_inset functions are \series bold not type safe \series default , and should thus be used with care. The type \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset is the same as the C99 \begin_inset listings inline true status collapsed \begin_layout Plain Layout int32_t \end_layout \end_inset type. \end_layout \begin_layout Description SPEEX_SET_ENH \begin_inset Formula $\ddagger$ \end_inset Set perceptual enhancer \begin_inset Index status collapsed \begin_layout Plain Layout perceptual enhancement \end_layout \end_inset to on (1) or off (0) ( \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset , default is on) \end_layout \begin_layout Description SPEEX_GET_ENH \begin_inset Formula $\ddagger$ \end_inset Get perceptual enhancer status ( \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset ) \end_layout \begin_layout Description SPEEX_GET_FRAME_SIZE Get the number of samples per frame for the current mode ( \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset ) \end_layout \begin_layout Description SPEEX_SET_QUALITY \begin_inset Formula $\dagger$ \end_inset Set the encoder speech quality ( \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset from 0 to 10, default is 8) \end_layout \begin_layout Description SPEEX_GET_QUALITY \begin_inset Formula $\dagger$ \end_inset Get the current encoder speech quality ( \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset from 0 to 10) \end_layout \begin_layout Description SPEEX_SET_MODE \begin_inset Formula $\dagger$ \end_inset Set the mode number, as specified in the RTP spec ( \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset ) \end_layout \begin_layout Description SPEEX_GET_MODE \begin_inset Formula $\dagger$ \end_inset Get the current mode number, as specified in the RTP spec ( \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset ) \end_layout \begin_layout Description SPEEX_SET_VBR \begin_inset Formula $\dagger$ \end_inset Set variable bit-rate (VBR) to on (1) or off (0) ( \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset , default is off) \end_layout \begin_layout Description SPEEX_GET_VBR \begin_inset Formula $\dagger$ \end_inset Get variable bit-rate \begin_inset Index status collapsed \begin_layout Plain Layout variable bit-rate \end_layout \end_inset (VBR) status ( \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset ) \end_layout \begin_layout Description SPEEX_SET_VBR_QUALITY \begin_inset Formula $\dagger$ \end_inset Set the encoder VBR speech quality (float 0.0 to 10.0, default is 8.0) \end_layout \begin_layout Description SPEEX_GET_VBR_QUALITY \begin_inset Formula $\dagger$ \end_inset Get the current encoder VBR speech quality (float 0 to 10) \end_layout \begin_layout Description SPEEX_SET_COMPLEXITY \begin_inset Formula $\dagger$ \end_inset Set the CPU resources allowed for the encoder ( \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset from 1 to 10, default is 2) \end_layout \begin_layout Description SPEEX_GET_COMPLEXITY \begin_inset Formula $\dagger$ \end_inset Get the CPU resources allowed for the encoder ( \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset from 1 to 10, default is 2) \end_layout \begin_layout Description SPEEX_SET_BITRATE \begin_inset Formula $\dagger$ \end_inset Set the bit-rate to use the closest value not exceeding the parameter ( \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset in bits per second) \end_layout \begin_layout Description SPEEX_GET_BITRATE Get the current bit-rate in use ( \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset in bits per second) \end_layout \begin_layout Description SPEEX_SET_SAMPLING_RATE Set real sampling rate ( \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset in Hz) \end_layout \begin_layout Description SPEEX_GET_SAMPLING_RATE Get real sampling rate ( \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset in Hz) \end_layout \begin_layout Description SPEEX_RESET_STATE Reset the encoder/decoder state to its original state, clearing all memories (no argument) \end_layout \begin_layout Description SPEEX_SET_VAD \begin_inset Formula $\dagger$ \end_inset Set voice activity detection \begin_inset Index status collapsed \begin_layout Plain Layout voice activity detection \end_layout \end_inset (VAD) to on (1) or off (0) ( \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset , default is off) \end_layout \begin_layout Description SPEEX_GET_VAD \begin_inset Formula $\dagger$ \end_inset Get voice activity detection (VAD) status ( \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset ) \end_layout \begin_layout Description SPEEX_SET_DTX \begin_inset Formula $\dagger$ \end_inset Set discontinuous transmission \begin_inset Index status collapsed \begin_layout Plain Layout discontinuous transmission \end_layout \end_inset (DTX) to on (1) or off (0) ( \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset , default is off) \end_layout \begin_layout Description SPEEX_GET_DTX \begin_inset Formula $\dagger$ \end_inset Get discontinuous transmission (DTX) status ( \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset ) \end_layout \begin_layout Description SPEEX_SET_ABR \begin_inset Formula $\dagger$ \end_inset Set average bit-rate \begin_inset Index status collapsed \begin_layout Plain Layout average bit-rate \end_layout \end_inset (ABR) to a value n in bits per second ( \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset in bits per second) \end_layout \begin_layout Description SPEEX_GET_ABR \begin_inset Formula $\dagger$ \end_inset Get average bit-rate (ABR) setting ( \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset in bits per second) \end_layout \begin_layout Description SPEEX_SET_PLC_TUNING \begin_inset Formula $\dagger$ \end_inset Tell the encoder to optimize encoding for a certain percentage of packet loss ( \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset in percent) \end_layout \begin_layout Description SPEEX_GET_PLC_TUNING \begin_inset Formula $\dagger$ \end_inset Get the current tuning of the encoder for PLC ( \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset in percent) \end_layout \begin_layout Description SPEEX_GET_LOOKAHEAD Returns the lookahead used by Speex separately for an encoder and a decoder. Sum encoder and decoder lookahead values to get the total codec lookahead. \end_layout \begin_layout Description SPEEX_SET_VBR_MAX_BITRATE \begin_inset Formula $\dagger$ \end_inset Set the maximum bit-rate allowed in VBR operation ( \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset in bits per second) \end_layout \begin_layout Description SPEEX_GET_VBR_MAX_BITRATE \begin_inset Formula $\dagger$ \end_inset Get the current maximum bit-rate allowed in VBR operation ( \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset in bits per second) \end_layout \begin_layout Description SPEEX_SET_HIGHPASS Set the high-pass filter on (1) or off (0) ( \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset , default is on) \end_layout \begin_layout Description SPEEX_GET_HIGHPASS Get the current high-pass filter status ( \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset ) \end_layout \begin_layout Description \begin_inset Formula $\dagger$ \end_inset applies only to the encoder \end_layout \begin_layout Description \begin_inset Formula $\ddagger$ \end_inset applies only to the decoder \end_layout \begin_layout Section Mode queries \begin_inset CommandInset label LatexCommand label name "sub:Mode-queries" \end_inset \end_layout \begin_layout Standard Speex modes have a query system similar to the speex_encoder_ctl and speex_decod er_ctl calls. Since modes are read-only, it is only possible to get information about a particular mode. The function used to do that is: \begin_inset listings inline false status open \begin_layout Plain Layout void speex_mode_query(SpeexMode *mode, int request, void *ptr); \end_layout \end_inset The admissible values for request are (unless otherwise note, the values are returned through \emph on ptr \emph default ): \end_layout \begin_layout Description SPEEX_MODE_FRAME_SIZE Get the frame size (in samples) for the mode \end_layout \begin_layout Description SPEEX_SUBMODE_BITRATE Get the bit-rate for a submode number specified through \emph on ptr \emph default (integer in bps). \end_layout \begin_layout Section Packing and in-band signalling \begin_inset Index status collapsed \begin_layout Plain Layout in-band signalling \end_layout \end_inset \end_layout \begin_layout Standard Sometimes it is desirable to pack more than one frame per packet (or other basic unit of storage). The proper way to do it is to call speex_encode \begin_inset Formula $N$ \end_inset times before writing the stream with speex_bits_write. In cases where the number of frames is not determined by an out-of-band mechanism, it is possible to include a terminator code. That terminator consists of the code 15 (decimal) encoded with 5 bits, as shown in Table \begin_inset CommandInset ref LatexCommand ref reference "cap:quality_vs_bps" \end_inset . Note that as of version 1.0.2, calling speex_bits_write automatically inserts the terminator so as to fill the last byte. This doesn't involves any overhead and makes sure Speex can always detect when there is no more frame in a packet. \end_layout \begin_layout Standard It is also possible to send in-band \begin_inset Quotes eld \end_inset messages \begin_inset Quotes erd \end_inset to the other side. All these messages are encoded as \begin_inset Quotes eld \end_inset pseudo-frames \begin_inset Quotes erd \end_inset of mode 14 which contain a 4-bit message type code, followed by the message. Table \begin_inset CommandInset ref LatexCommand ref reference "cap:In-band-signalling-codes" \end_inset lists the available codes, their meaning and the size of the message that follows. Most of these messages are requests that are sent to the encoder or decoder on the other end, which is free to comply or ignore them. By default, all in-band messages are ignored. \end_layout \begin_layout Standard \begin_inset Float table placement htbp wide false sideways false status open \begin_layout Plain Layout \begin_inset ERT status collapsed \begin_layout Plain Layout \backslash begin{center} \end_layout \end_inset \begin_inset Tabular \begin_inset Text \begin_layout Plain Layout Code \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Size (bits) \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Content \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Asks decoder to set perceptual enhancement off (0) or on(1) \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Asks (if 1) the encoder to be less \begin_inset Quotes eld \end_inset aggressive \begin_inset Quotes erd \end_inset due to high packet loss \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 2 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Asks encoder to switch to mode N \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 3 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Asks encoder to switch to mode N for low-band \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Asks encoder to switch to mode N for high-band \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 5 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Asks encoder to switch to quality N for VBR \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 6 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Request acknowledge (0=no, 1=all, 2=only for in-band data) \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 7 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Asks encoder to set CBR (0), VAD(1), DTX(3), VBR(5), VBR+DTX(7) \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 8 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 8 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Transmit (8-bit) character to the other end \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 9 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 8 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Intensity stereo information \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 10 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 16 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Announce maximum bit-rate acceptable (N in bytes/second) \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 11 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 16 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout reserved \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 12 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 32 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Acknowledge receiving packet N \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 13 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 32 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout reserved \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 14 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 64 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout reserved \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 15 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 64 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout reserved \end_layout \end_inset \end_inset \begin_inset ERT status collapsed \begin_layout Plain Layout \backslash end{center} \end_layout \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption \begin_layout Plain Layout In-band signalling codes \begin_inset CommandInset label LatexCommand label name "cap:In-band-signalling-codes" \end_inset \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Standard Finally, applications may define custom in-band messages using mode 13. The size of the message in bytes is encoded with 5 bits, so that the decoder can skip it if it doesn't know how to interpret it. \begin_inset Newpage newpage \end_inset \end_layout \begin_layout Chapter Speech Processing API ( \emph on libspeexdsp \emph default ) \end_layout \begin_layout Standard As of version 1.2beta3, the non-codec parts of the Speex package are now in a separate library called \emph on libspeexdsp \emph default . This library includes the preprocessor, the acoustic echo canceller, the jitter buffer, and the resampler. In a UNIX environment, it can be linked into a program by adding \emph on -lspeexdsp -lm \emph default to the compiler command line. Just like for libspeex, \series bold libspeexdsp calls are reentrant, but not thread-safe \series default . That means that it is fine to use calls from many threads, but \series bold calls using the same state from multiple threads must be protected by mutexes \series default . \end_layout \begin_layout Section Preprocessor \begin_inset CommandInset label LatexCommand label name "sub:Preprocessor" \end_inset \end_layout \begin_layout Standard \noindent In order to use the Speex preprocessor \begin_inset Index status collapsed \begin_layout Plain Layout preprocessor \end_layout \end_inset , you first need to: \begin_inset listings inline false status open \begin_layout Plain Layout #include \end_layout \end_inset \end_layout \begin_layout Standard \noindent Then, a preprocessor state can be created as: \begin_inset listings inline false status open \begin_layout Plain Layout SpeexPreprocessState *preprocess_state = speex_preprocess_state_init(frame_size, sampling_rate); \end_layout \end_inset \end_layout \begin_layout Standard \noindent and it is recommended to use the same value for \family typewriter frame_size \family default as is used by the encoder (20 \emph on ms \emph default ). \end_layout \begin_layout Standard For each input frame, you need to call: \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout speex_preprocess_run(preprocess_state, audio_frame); \end_layout \end_inset \end_layout \begin_layout Standard \noindent where \family typewriter audio_frame \family default is used both as input and output. In cases where the output audio is not useful for a certain frame, it is possible to use instead: \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout speex_preprocess_estimate_update(preprocess_state, audio_frame); \end_layout \end_inset \end_layout \begin_layout Standard \noindent This call will update all the preprocessor internal state variables without computing the output audio, thus saving some CPU cycles. \end_layout \begin_layout Standard The behaviour of the preprocessor can be changed using: \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout speex_preprocess_ctl(preprocess_state, request, ptr); \end_layout \end_inset \end_layout \begin_layout Standard \noindent which is used in the same way as the encoder and decoder equivalent. Options are listed in Section \begin_inset CommandInset ref LatexCommand ref reference "sub:Preprocessor-options" \end_inset . \end_layout \begin_layout Standard The preprocessor state can be destroyed using: \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout speex_preprocess_state_destroy(preprocess_state); \end_layout \end_inset \end_layout \begin_layout Subsection Preprocessor options \begin_inset CommandInset label LatexCommand label name "sub:Preprocessor-options" \end_inset \end_layout \begin_layout Standard As with the codec, the preprocessor also has options that can be controlled using an ioctl()-like call. The available options are: \end_layout \begin_layout Description SPEEX_PREPROCESS_SET_DENOISE Turns denoising on(1) or off(0) ( \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset ) \end_layout \begin_layout Description SPEEX_PREPROCESS_GET_DENOISE Get denoising status ( \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset ) \end_layout \begin_layout Description SPEEX_PREPROCESS_SET_AGC Turns automatic gain control (AGC) on(1) or off(0) ( \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset ) \end_layout \begin_layout Description SPEEX_PREPROCESS_GET_AGC Get AGC status ( \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset ) \end_layout \begin_layout Description SPEEX_PREPROCESS_SET_VAD Turns voice activity detector (VAD) on(1) or off(0) ( \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset ) \end_layout \begin_layout Description SPEEX_PREPROCESS_GET_VAD Get VAD status ( \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset ) \end_layout \begin_layout Description SPEEX_PREPROCESS_SET_AGC_LEVEL \end_layout \begin_layout Description SPEEX_PREPROCESS_GET_AGC_LEVEL \end_layout \begin_layout Description SPEEX_PREPROCESS_SET_DEREVERB Turns reverberation removal on(1) or off(0) ( \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset ) \end_layout \begin_layout Description SPEEX_PREPROCESS_GET_DEREVERB Get reverberation removal status ( \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset ) \end_layout \begin_layout Description SPEEX_PREPROCESS_SET_DEREVERB_LEVEL Not working yet, do not use \end_layout \begin_layout Description SPEEX_PREPROCESS_GET_DEREVERB_LEVEL Not working yet, do not use \end_layout \begin_layout Description SPEEX_PREPROCESS_SET_DEREVERB_DECAY Not working yet, do not use \end_layout \begin_layout Description SPEEX_PREPROCESS_GET_DEREVERB_DECAY Not working yet, do not use \end_layout \begin_layout Description SPEEX_PREPROCESS_SET_PROB_START \end_layout \begin_layout Description SPEEX_PREPROCESS_GET_PROB_START \end_layout \begin_layout Description SPEEX_PREPROCESS_SET_PROB_CONTINUE \end_layout \begin_layout Description SPEEX_PREPROCESS_GET_PROB_CONTINUE \end_layout \begin_layout Description SPEEX_PREPROCESS_SET_NOISE_SUPPRESS Set maximum attenuation of the noise in dB (negative \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset ) \end_layout \begin_layout Description SPEEX_PREPROCESS_GET_NOISE_SUPPRESS Get maximum attenuation of the noise in dB (negative \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset ) \end_layout \begin_layout Description SPEEX_PREPROCESS_SET_ECHO_SUPPRESS Set maximum attenuation of the residual echo in dB (negative \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset ) \end_layout \begin_layout Description SPEEX_PREPROCESS_GET_ECHO_SUPPRESS Get maximum attenuation of the residual echo in dB (negative \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset ) \end_layout \begin_layout Description SPEEX_PREPROCESS_SET_ECHO_SUPPRESS_ACTIVE Set maximum attenuation of the echo in dB when near end is active (negative \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset ) \end_layout \begin_layout Description SPEEX_PREPROCESS_GET_ECHO_SUPPRESS_ACTIVE Get maximum attenuation of the echo in dB when near end is active (negative \begin_inset listings inline true status collapsed \begin_layout Plain Layout spx_int32_t \end_layout \end_inset ) \end_layout \begin_layout Description SPEEX_PREPROCESS_SET_ECHO_STATE Set the associated echo canceller for residual echo suppression (pointer or NULL for no residual echo suppression) \end_layout \begin_layout Description SPEEX_PREPROCESS_GET_ECHO_STATE Get the associated echo canceller (pointer) \end_layout \begin_layout Section Echo Cancellation \begin_inset CommandInset label LatexCommand label name "sub:Echo-Cancellation" \end_inset \end_layout \begin_layout Standard The Speex library now includes an echo cancellation \begin_inset Index status collapsed \begin_layout Plain Layout echo cancellation \end_layout \end_inset algorithm suitable for Acoustic Echo Cancellation \begin_inset Index status collapsed \begin_layout Plain Layout acoustic echo cancellation \end_layout \end_inset (AEC). In order to use the echo canceller, you first need to \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout #include \end_layout \end_inset \end_layout \begin_layout Standard Then, an echo canceller state can be created by: \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout SpeexEchoState *echo_state = speex_echo_state_init(frame_size, filter_length); \end_layout \end_inset \end_layout \begin_layout Standard where \family typewriter frame_size \family default is the amount of data (in samples) you want to process at once and \family typewriter filter_length \family default is the length (in samples) of the echo cancelling filter you want to use (also known as \shape italic tail length \shape default \begin_inset Index status collapsed \begin_layout Plain Layout tail length \end_layout \end_inset ). It is recommended to use a frame size in the order of 20 ms (or equal to the codec frame size) and make sure it is easy to perform an FFT of that size (powers of two are better than prime sizes). The recommended tail length is approximately the third of the room reverberatio n time. For example, in a small room, reverberation time is in the order of 300 ms, so a tail length of 100 ms is a good choice (800 samples at 8000 Hz sampling rate). \end_layout \begin_layout Standard Once the echo canceller state is created, audio can be processed by: \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout speex_echo_cancellation(echo_state, input_frame, echo_frame, output_frame); \end_layout \end_inset \end_layout \begin_layout Standard where \family typewriter input_frame \family default is the audio as captured by the microphone, \family typewriter echo_frame \family default is the signal that was played in the speaker (and needs to be removed) and \family typewriter output_frame \family default is the signal with echo removed. \end_layout \begin_layout Standard One important thing to keep in mind is the relationship between \family typewriter input_frame \family default and \family typewriter echo_frame \family default . It is important that, at any time, any echo that is present in the input has already been sent to the echo canceller as \family typewriter echo_frame \family default . In other words, the echo canceller cannot remove a signal that it hasn't yet received. On the other hand, the delay between the input signal and the echo signal must be small enough because otherwise part of the echo cancellation filter is inefficient. In the ideal case, you code would look like: \begin_inset listings lstparams "breaklines=true" inline false status open \begin_layout Plain Layout write_to_soundcard(echo_frame, frame_size); \end_layout \begin_layout Plain Layout read_from_soundcard(input_frame, frame_size); \end_layout \begin_layout Plain Layout speex_echo_cancellation(echo_state, input_frame, echo_frame, output_frame); \end_layout \end_inset \end_layout \begin_layout Standard If you wish to further reduce the echo present in the signal, you can do so by associating the echo canceller to the preprocessor (see Section \begin_inset CommandInset ref LatexCommand ref reference "sub:Preprocessor" \end_inset ). This is done by calling: \begin_inset listings lstparams "breaklines=true" inline false status open \begin_layout Plain Layout speex_preprocess_ctl(preprocess_state, SPEEX_PREPROCESS_SET_ECHO_STATE,echo_stat e); \end_layout \end_inset in the initialisation. \end_layout \begin_layout Standard As of version 1.2-beta2, there is an alternative, simpler API that can be used instead of \emph on speex_echo_cancellation() \emph default . When audio capture and playback are handled asynchronously (e.g. in different threads or using the \emph on poll() \emph default or \emph on select() \emph default system call), it can be difficult to keep track of what input_frame comes with what echo_frame. Instead, the playback context/thread can simply call: \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout speex_echo_playback(echo_state, echo_frame); \end_layout \end_inset \end_layout \begin_layout Standard every time an audio frame is played. Then, the capture context/thread calls: \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout speex_echo_capture(echo_state, input_frame, output_frame); \end_layout \end_inset \end_layout \begin_layout Standard for every frame captured. Internally, \emph on speex_echo_playback() \emph default simply buffers the playback frame so it can be used by \emph on speex_echo_capture() \emph default to call \emph on speex_echo_cancel() \emph default . A side effect of using this alternate API is that the playback audio is delayed by two frames, which is the normal delay caused by the soundcard. When capture and playback are already synchronised, \emph on speex_echo_cancellation() \emph default is preferable since it gives better control on the exact input/echo timing. \end_layout \begin_layout Standard The echo cancellation state can be destroyed with: \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout speex_echo_state_destroy(echo_state); \end_layout \end_inset \end_layout \begin_layout Standard It is also possible to reset the state of the echo canceller so it can be reused without the need to create another state with: \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout speex_echo_state_reset(echo_state); \end_layout \end_inset \end_layout \begin_layout Subsection Troubleshooting \end_layout \begin_layout Standard There are several things that may prevent the echo canceller from working properly. One of them is a bug (or something suboptimal) in the code, but there are many others you should consider first \end_layout \begin_layout Itemize Using a different soundcard to do the capture and plaback will \series bold not \series default work, regardless of what you may think. The only exception to that is if the two cards can be made to have their sampling clock \begin_inset Quotes eld \end_inset locked \begin_inset Quotes erd \end_inset on the same clock source. If not, the clocks will always have a small amount of drift, which will prevent the echo canceller from adapting. \end_layout \begin_layout Itemize The delay between the record and playback signals must be minimal. Any signal played has to \begin_inset Quotes eld \end_inset appear \begin_inset Quotes erd \end_inset on the playback (far end) signal slightly before the echo canceller \begin_inset Quotes eld \end_inset sees \begin_inset Quotes erd \end_inset it in the near end signal, but excessive delay means that part of the filter length is wasted. In the worst situations, the delay is such that it is longer than the filter length, in which case, no echo can be cancelled. \end_layout \begin_layout Itemize When it comes to echo tail length (filter length), longer is \series bold not \series default better. Actually, the longer the tail length, the longer it takes for the filter to adapt. Of course, a tail length that is too short will not cancel enough echo, but the most common problem seen is that people set a very long tail length and then wonder why no echo is being cancelled. \end_layout \begin_layout Itemize Non-linear distortion cannot (by definition) be modeled by the linear adaptive filter used in the echo canceller and thus cannot be cancelled. Use good audio gear and avoid saturation/clipping. \end_layout \begin_layout Standard Also useful is reading \emph on Echo Cancellation Demystified \emph default by Alexey Frunze \begin_inset Foot status collapsed \begin_layout Plain Layout http://www.embeddedstar.com/articles/2003/7/article20030720-1.html \end_layout \end_inset , which explains the fundamental principles of echo cancellation. The details of the algorithm described in the article are different, but the general ideas of echo cancellation through adaptive filters are the same. \end_layout \begin_layout Standard As of version 1.2beta2, a new \family typewriter echo_diagnostic.m \family default tool is included in the source distribution. The first step is to define DUMP_ECHO_CANCEL_DATA during the build. This causes the echo canceller to automatically save the near-end, far-end and output signals to files (aec_rec.sw aec_play.sw and aec_out.sw). These are exactly what the AEC receives and outputs. From there, it is necessary to start Octave and type: \end_layout \begin_layout Standard \begin_inset listings lstparams "language=Matlab" inline false status open \begin_layout Plain Layout echo_diagnostic('aec_rec.sw', 'aec_play.sw', 'aec_diagnostic.sw', 1024); \end_layout \end_inset \end_layout \begin_layout Standard The value of 1024 is the filter length and can be changed. There will be some (hopefully) useful messages printed and echo cancelled audio will be saved to aec_diagnostic.sw . If even that output is bad (almost no cancellation) then there is probably problem with the playback or recording process. \end_layout \begin_layout Section Jitter Buffer \end_layout \begin_layout Standard The jitter buffer can be enabled by including: \begin_inset listings lstparams "breaklines=true" inline false status open \begin_layout Plain Layout #include \end_layout \end_inset and a new jitter buffer state can be initialised by: \end_layout \begin_layout Standard \begin_inset listings lstparams "breaklines=true" inline false status open \begin_layout Plain Layout JitterBuffer *state = jitter_buffer_init(step); \end_layout \end_inset \end_layout \begin_layout Standard where the \begin_inset listings inline true status collapsed \begin_layout Plain Layout step \end_layout \end_inset argument is the default time step (in timestamp units) used for adjusting the delay and doing concealment. A value of 1 is always correct, but higher values may be more convenient sometimes. For example, if you are only able to do concealment on 20ms frames, there is no point in the jitter buffer asking you to do it on one sample. Another example is that for video, it makes no sense to adjust the delay by less than a full frame. The value provided can always be changed at a later time. \end_layout \begin_layout Standard The jitter buffer API is based on the \begin_inset listings inline true status open \begin_layout Plain Layout JitterBufferPacket \end_layout \end_inset type, which is defined as: \begin_inset listings inline false status open \begin_layout Plain Layout typedef struct { \end_layout \begin_layout Plain Layout char *data; /* Data bytes contained in the packet */ \end_layout \begin_layout Plain Layout spx_uint32_t len; /* Length of the packet in bytes */ \end_layout \begin_layout Plain Layout spx_uint32_t timestamp; /* Timestamp for the packet */ \end_layout \begin_layout Plain Layout spx_uint32_t span; /* Time covered by the packet (timestamp units) */ \end_layout \begin_layout Plain Layout } JitterBufferPacket; \end_layout \end_inset \end_layout \begin_layout Standard As an example, for audio the timestamp field would be what is obtained from the RTP timestamp field and the span would be the number of samples that are encoded in the packet. For Speex narrowband, span would be 160 if only one frame is included in the packet. \end_layout \begin_layout Standard When a packet arrives, it need to be inserter into the jitter buffer by: \begin_inset listings inline false status open \begin_layout Plain Layout JitterBufferPacket packet; \end_layout \begin_layout Plain Layout /* Fill in each field in the packet struct */ \end_layout \begin_layout Plain Layout jitter_buffer_put(state, &packet); \end_layout \end_inset \end_layout \begin_layout Standard When the decoder is ready to decode a packet the packet to be decoded can be obtained by: \begin_inset listings inline false status open \begin_layout Plain Layout int start_offset; \end_layout \begin_layout Plain Layout err = jitter_buffer_get(state, &packet, desired_span, &start_offset); \end_layout \end_inset \end_layout \begin_layout Standard If \begin_inset listings inline true status open \begin_layout Plain Layout jitter_buffer_put() \end_layout \end_inset and \begin_inset listings inline true status collapsed \begin_layout Plain Layout jitter_buffer_get() \end_layout \end_inset are called from different threads, then \series bold you need to protect the jitter buffer state with a mutex \series default . \end_layout \begin_layout Standard Because the jitter buffer is designed not to use an explicit timer, it needs to be told about the time explicitly. This is done by calling: \begin_inset listings inline false status open \begin_layout Plain Layout jitter_buffer_tick(state); \end_layout \end_inset \end_layout \begin_layout Standard This needs to be done periodically in the playing thread. This will be the last jitter buffer call before going to sleep (until more data is played back). In some cases, it may be preferable to use \begin_inset listings inline false status open \begin_layout Plain Layout jitter_buffer_remaining_span(state, remaining); \end_layout \end_inset \end_layout \begin_layout Standard The second argument is used to specify that we are still holding data that has not been written to the playback device. For instance, if 256 samples were needed by the soundcard (specified by \begin_inset listings inline true status collapsed \begin_layout Plain Layout desired_span \end_layout \end_inset ), but \begin_inset listings inline true status collapsed \begin_layout Plain Layout jitter_buffer_get() \end_layout \end_inset returned 320 samples, we would have \begin_inset listings inline true status open \begin_layout Plain Layout remaining=64 \end_layout \end_inset . \end_layout \begin_layout Section Resampler \end_layout \begin_layout Standard Speex includes a resampling modules. To make use of the resampler, it is necessary to include its header file: \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout #include \end_layout \end_inset \end_layout \begin_layout Standard For each stream that is to be resampled, it is necessary to create a resampler state with: \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout SpeexResamplerState *resampler; \end_layout \begin_layout Plain Layout resampler = speex_resampler_init(nb_channels, input_rate, output_rate, quality, &err); \end_layout \end_inset \end_layout \begin_layout Standard where \begin_inset listings inline true status collapsed \begin_layout Plain Layout nb_channels \end_layout \end_inset is the number of channels that will be used (either interleaved or non-interlea ved), \begin_inset listings inline true status collapsed \begin_layout Plain Layout input_rate \end_layout \end_inset is the sampling rate of the input stream, \begin_inset listings inline true status collapsed \begin_layout Plain Layout output_rate \end_layout \end_inset is the sampling rate of the output stream and \begin_inset listings inline true status collapsed \begin_layout Plain Layout quality \end_layout \end_inset is the requested quality setting (0 to 10). The quality parameter is useful for controlling the quality/complexity/latency tradeoff. Using a higher quality setting means less noise/aliasing, a higher complexity and a higher latency. Usually, a quality of 3 is acceptable for most desktop uses and quality 10 is mostly recommended for pro audio work. Quality 0 usually has a decent sound (certainly better than using linear interpolation resampling), but artifacts may be heard. \end_layout \begin_layout Standard The actual resampling is performed using \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout err = speex_resampler_process_int(resampler, channelID, in, &in_length, out, &out_length); \end_layout \end_inset where \begin_inset listings inline true status collapsed \begin_layout Plain Layout channelID \end_layout \end_inset is the ID of the channel to be processed. For a mono stream, use 0. The \emph on in \emph default pointer points to the first sample of the input buffer for the selected channel and \begin_inset listings inline true status collapsed \begin_layout Plain Layout out \end_layout \end_inset points to the first sample of the output. The size of the input and output buffers are specified by \begin_inset listings inline true status collapsed \begin_layout Plain Layout in_length \end_layout \end_inset and \begin_inset listings inline true status collapsed \begin_layout Plain Layout out_length \end_layout \end_inset respectively. Upon completion, these values are replaced by the number of samples read and written by the resampler. Unless an error occurs, either all input samples will be read or all output samples will be written to (or both). For floating-point samples, the function \begin_inset listings inline true status open \begin_layout Plain Layout speex_resampler_process_float() \end_layout \end_inset behaves similarly. \end_layout \begin_layout Standard It is also possible to process multiple channels at once. To do that, you can use speex_resampler_process_interleaved_int() or \begin_inset listings inline true status open \begin_layout Plain Layout speex_resampler_process_interleaved_float() \end_layout \end_inset . The arguments are the same except that there is no \begin_inset listings inline true status collapsed \begin_layout Plain Layout channelID \end_layout \end_inset argument. Note that the \series bold length parameters are per-channel \series default . So if you have 1024 samples for each of 4 channels, you pass 1024 and not 4096. \end_layout \begin_layout Standard The resampler allows changing the quality and input/output sampling frequencies on the fly without glitches. This can be done with calls such as \begin_inset listings inline true status open \begin_layout Plain Layout speex_resampler_set_quality() \end_layout \end_inset and \begin_inset listings inline true status open \begin_layout Plain Layout speex_resampler_set_rate() \end_layout \end_inset . The only side effect is that a new filter will have to be recomputed, consuming many CPU cycles. \end_layout \begin_layout Standard When resampling a file, it is often desirable to have the output file perfectly synchronised with the input. To do that, you need to call \begin_inset listings inline true status open \begin_layout Plain Layout speex_resampler_skip_zeros() \end_layout \end_inset \series bold before \series default you start processing any samples. For real-time applications (e.g. VoIP), it is not recommended to do that as the first process frame will be shorter to compensate for the delay (the skipped zeros). Instead, in real-time applications you may want to know how many delay is introduced by the resampler. This can be done at run-time with \begin_inset listings inline true status open \begin_layout Plain Layout speex_resampler_get_input_latency() \end_layout \end_inset and \begin_inset listings inline true status open \begin_layout Plain Layout speex_resampler_get_output_latency() \end_layout \end_inset functions. First function returns delay measured in samples at input samplerate, while second returns delay measured in samples at output samplerate. \end_layout \begin_layout Standard To destroy a resampler state, just call \begin_inset listings inline true status open \begin_layout Plain Layout speex_resampler_destroy() \end_layout \end_inset . \end_layout \begin_layout Section Ring Buffer \end_layout \begin_layout Standard In some cases, it is necessary to interface components that use different block sizes. For example, it is possible that the soundcard does not support reading/writing in blocks of 20 \begin_inset space ~ \end_inset ms or sometimes, complicated resampling ratios mean that the blocks don't always have the same time. In thoses cases, it is often necessary to buffer a bit of audio using a ring buffer. \end_layout \begin_layout Standard \begin_inset Newpage newpage \end_inset \end_layout \begin_layout Chapter Formats and standards \begin_inset Index status collapsed \begin_layout Plain Layout standards \end_layout \end_inset \begin_inset CommandInset label LatexCommand label name "sec:Formats-and-standards" \end_inset \end_layout \begin_layout Standard Speex can encode speech in both narrowband and wideband and provides different bit-rates. However, not all features need to be supported by a certain implementation or device. In order to be called \begin_inset Quotes eld \end_inset Speex compatible \begin_inset Quotes erd \end_inset (whatever that means), an implementation must implement at least a basic set of features. \end_layout \begin_layout Standard At the minimum, all narrowband modes of operation MUST be supported at the decoder. This includes the decoding of a wideband bit-stream by the narrowband decoder \begin_inset Foot status collapsed \begin_layout Plain Layout The wideband bit-stream contains an embedded narrowband bit-stream which can be decoded alone \end_layout \end_inset . If present, a wideband decoder MUST be able to decode a narrowband stream, and MAY either be able to decode all wideband modes or be able to decode the embedded narrowband part of all modes (which includes ignoring the high-band bits). \end_layout \begin_layout Standard For encoders, at least one narrowband or wideband mode MUST be supported. The main reason why all encoding modes do not have to be supported is that some platforms may not be able to handle the complexity of encoding in some modes. \end_layout \begin_layout Section RTP \begin_inset Index status collapsed \begin_layout Plain Layout RTP \end_layout \end_inset Payload Format \end_layout \begin_layout Standard The RTP payload draft is included in appendix \begin_inset CommandInset ref LatexCommand ref reference "sec:IETF-draft" \end_inset and the latest version is available at \begin_inset Flex URL status collapsed \begin_layout Plain Layout http://www.speex.org/drafts/latest \end_layout \end_inset . This draft has been sent (2003/02/26) to the Internet Engineering Task Force (IETF) and will be discussed at the March 18th meeting in San Francisco. \end_layout \begin_layout Section MIME Type \end_layout \begin_layout Standard For now, you should use the MIME type audio/x-speex for Speex-in-Ogg. We will apply for type \family typewriter audio/speex \family default in the near future. \end_layout \begin_layout Section Ogg \begin_inset Index status collapsed \begin_layout Plain Layout Ogg \end_layout \end_inset file format \end_layout \begin_layout Standard Speex bit-streams can be stored in Ogg files. In this case, the first packet of the Ogg file contains the Speex header described in table \begin_inset CommandInset ref LatexCommand ref reference "cap:ogg_speex_header" \end_inset . All integer fields in the headers are stored as little-endian. The \family typewriter speex_string \family default field must contain the \begin_inset Quotes eld \end_inset \family typewriter Speex \family default \begin_inset space ~ \end_inset \begin_inset space ~ \end_inset \begin_inset space ~ \end_inset \begin_inset Quotes erd \end_inset (with 3 trailing spaces), which identifies the bit-stream. The next field, \family typewriter speex_version \family default contains the version of Speex that encoded the file. For now, refer to speex_header.[ch] for more info. The \emph on beginning of stream \emph default ( \family typewriter b_o_s \family default ) flag is set to 1 for the header. The header packet has \family typewriter packetno=0 \family default and \family typewriter granulepos=0 \family default . \end_layout \begin_layout Standard The second packet contains the Speex comment header. The format used is the Vorbis comment format described here: http://www.xiph.org/ ogg/vorbis/doc/v-comment.html . This packet has \family typewriter packetno=1 \family default and \family typewriter granulepos=0 \family default . \end_layout \begin_layout Standard The third and subsequent packets each contain one or more (number found in header) Speex frames. These are identified with \family typewriter packetno \family default starting from 2 and the \family typewriter granulepos \family default is the number of the last sample encoded in that packet. The last of these packets has the \emph on end of stream \emph default ( \family typewriter e_o_s \family default ) flag is set to 1. \end_layout \begin_layout Standard \begin_inset Float table placement htbp wide true sideways false status open \begin_layout Plain Layout \begin_inset ERT status collapsed \begin_layout Plain Layout \backslash begin{center} \end_layout \end_inset \begin_inset Tabular \begin_inset Text \begin_layout Plain Layout Field \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Type \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Size \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout speex_string \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout char[] \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 8 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout speex_version \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout char[] \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 20 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout speex_version_id \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout int \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout header_size \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout int \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout rate \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout int \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout mode \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout int \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout mode_bitstream_version \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout int \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout nb_channels \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout int \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout bitrate \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout int \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout frame_size \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout int \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout vbr \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout int \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout frames_per_packet \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout int \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout extra_headers \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout int \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout reserved1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout int \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout reserved2 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout int \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \end_inset \begin_inset ERT status collapsed \begin_layout Plain Layout \backslash end{center} \end_layout \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption \begin_layout Plain Layout Ogg/Speex header packet \begin_inset CommandInset label LatexCommand label name "cap:ogg_speex_header" \end_inset \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Standard \begin_inset ERT status collapsed \begin_layout Plain Layout \backslash clearpage \end_layout \end_inset \end_layout \begin_layout Chapter Introduction to CELP Coding \begin_inset Index status collapsed \begin_layout Plain Layout CELP \end_layout \end_inset \begin_inset CommandInset label LatexCommand label name "sec:Introduction-to-CELP" \end_inset \end_layout \begin_layout Quote \align center \emph on Do not meddle in the affairs of poles, for they are subtle and quick to leave the unit circle. \end_layout \begin_layout Standard Speex is based on CELP, which stands for Code Excited Linear Prediction. This section attempts to introduce the principles behind CELP, so if you are already familiar with CELP, you can safely skip to section \begin_inset CommandInset ref LatexCommand ref reference "sec:Speex-narrowband-mode" \end_inset . The CELP technique is based on three ideas: \end_layout \begin_layout Enumerate The use of a linear prediction (LP) model to model the vocal tract \end_layout \begin_layout Enumerate The use of (adaptive and fixed) codebook entries as input (excitation) of the LP model \end_layout \begin_layout Enumerate The search performed in closed-loop in a \begin_inset Quotes eld \end_inset perceptually weighted domain \begin_inset Quotes erd \end_inset \end_layout \begin_layout Standard This section describes the basic ideas behind CELP. This is still a work in progress. \end_layout \begin_layout Section Source-Filter Model of Speech Prediction \end_layout \begin_layout Standard The source-filter model of speech production assumes that the vocal cords are the source of spectrally flat sound (the excitation signal), and that the vocal tract acts as a filter to spectrally shape the various sounds of speech. While still an approximation, the model is widely used in speech coding because of its simplicity.Its use is also the reason why most speech codecs (Speex included) perform badly on music signals. The different phonemes can be distinguished by their excitation (source) and spectral shape (filter). Voiced sounds (e.g. vowels) have an excitation signal that is periodic and that can be approximated by an impulse train in the time domain or by regularly-spaced harmonics in the frequency domain. On the other hand, fricatives (such as the "s", "sh" and "f" sounds) have an excitation signal that is similar to white Gaussian noise. So called voice fricatives (such as "z" and "v") have excitation signal composed of an harmonic part and a noisy part. \end_layout \begin_layout Standard The source-filter model is usually tied with the use of Linear prediction. The CELP model is based on source-filter model, as can be seen from the CELP decoder illustrated in Figure \begin_inset CommandInset ref LatexCommand ref reference "fig:The-CELP-model" \end_inset . \end_layout \begin_layout Standard \begin_inset Float figure wide false sideways false status open \begin_layout Plain Layout \begin_inset ERT status collapsed \begin_layout Plain Layout \backslash begin{center} \end_layout \end_inset \begin_inset Graphics filename celp_decoder.eps width 45page% keepAspectRatio \end_inset \begin_inset ERT status collapsed \begin_layout Plain Layout \backslash end{center} \end_layout \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption \begin_layout Plain Layout The CELP model of speech synthesis (decoder) \begin_inset CommandInset label LatexCommand label name "fig:The-CELP-model" \end_inset \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Section Linear Prediction Coefficients (LPC) \begin_inset Index status collapsed \begin_layout Plain Layout linear prediction \end_layout \end_inset \end_layout \begin_layout Standard Linear prediction is at the base of many speech coding techniques, including CELP. The idea behind it is to predict the signal \begin_inset Formula $x[n]$ \end_inset using a linear combination of its past samples: \end_layout \begin_layout Standard \begin_inset Formula \[ y[n]=\sum_{i=1}^{N}a_{i}x[n-i]\] \end_inset where \begin_inset Formula $y[n]$ \end_inset is the linear prediction of \begin_inset Formula $x[n]$ \end_inset . The prediction error is thus given by: \begin_inset Formula \[ e[n]=x[n]-y[n]=x[n]-\sum_{i=1}^{N}a_{i}x[n-i]\] \end_inset \end_layout \begin_layout Standard The goal of the LPC analysis is to find the best prediction coefficients \begin_inset Formula $a_{i}$ \end_inset which minimize the quadratic error function: \begin_inset Formula \[ E=\sum_{n=0}^{L-1}\left[e[n]\right]^{2}=\sum_{n=0}^{L-1}\left[x[n]-\sum_{i=1}^{N}a_{i}x[n-i]\right]^{2}\] \end_inset That can be done by making all derivatives \begin_inset Formula $\frac{\partial E}{\partial a_{i}}$ \end_inset equal to zero: \begin_inset Formula \[ \frac{\partial E}{\partial a_{i}}=\frac{\partial}{\partial a_{i}}\sum_{n=0}^{L-1}\left[x[n]-\sum_{i=1}^{N}a_{i}x[n-i]\right]^{2}=0\] \end_inset \end_layout \begin_layout Standard For an order \begin_inset Formula $N$ \end_inset filter, the filter coefficients \begin_inset Formula $a_{i}$ \end_inset are found by solving the system \begin_inset Formula $N\times N$ \end_inset linear system \begin_inset Formula $\mathbf{Ra}=\mathbf{r}$ \end_inset , where \begin_inset Formula \[ \mathbf{R}=\left[\begin{array}{cccc} R(0) & R(1) & \cdots & R(N-1)\\ R(1) & R(0) & \cdots & R(N-2)\\ \vdots & \vdots & \ddots & \vdots\\ R(N-1) & R(N-2) & \cdots & R(0)\end{array}\right]\] \end_inset \begin_inset Formula \[ \mathbf{r}=\left[\begin{array}{c} R(1)\\ R(2)\\ \vdots\\ R(N)\end{array}\right]\] \end_inset with \begin_inset Formula $R(m)$ \end_inset , the auto-correlation \begin_inset Index status collapsed \begin_layout Plain Layout auto-correlation \end_layout \end_inset of the signal \begin_inset Formula $x[n]$ \end_inset , computed as: \end_layout \begin_layout Standard \begin_inset Formula \[ R(m)=\sum_{i=0}^{N-1}x[i]x[i-m]\] \end_inset \end_layout \begin_layout Standard Because \begin_inset Formula $\mathbf{R}$ \end_inset is Hermitian Toeplitz, the Levinson-Durbin \begin_inset Index status collapsed \begin_layout Plain Layout Levinson-Durbin \end_layout \end_inset algorithm can be used, making the solution to the problem \begin_inset Formula $\mathcal{O}\left(N^{2}\right)$ \end_inset instead of \begin_inset Formula $\mathcal{O}\left(N^{3}\right)$ \end_inset . Also, it can be proven that all the roots of \begin_inset Formula $A(z)$ \end_inset are within the unit circle, which means that \begin_inset Formula $1/A(z)$ \end_inset is always stable. This is in theory; in practice because of finite precision, there are two commonly used techniques to make sure we have a stable filter. First, we multiply \begin_inset Formula $R(0)$ \end_inset by a number slightly above one (such as 1.0001), which is equivalent to adding noise to the signal. Also, we can apply a window to the auto-correlation, which is equivalent to filtering in the frequency domain, reducing sharp resonances. \end_layout \begin_layout Section Pitch Prediction \begin_inset Index status collapsed \begin_layout Plain Layout pitch \end_layout \end_inset \end_layout \begin_layout Standard During voiced segments, the speech signal is periodic, so it is possible to take advantage of that property by approximating the excitation signal \begin_inset Formula $e[n]$ \end_inset by a gain times the past of the excitation: \end_layout \begin_layout Standard \begin_inset Formula \[ e[n]\simeq p[n]=\beta e[n-T]\ ,\] \end_inset where \begin_inset Formula $T$ \end_inset is the pitch period, \begin_inset Formula $\beta$ \end_inset is the pitch gain. We call that long-term prediction since the excitation is predicted from \begin_inset Formula $e[n-T]$ \end_inset with \begin_inset Formula $T\gg N$ \end_inset . \end_layout \begin_layout Section Innovation Codebook \end_layout \begin_layout Standard The final excitation \begin_inset Formula $e[n]$ \end_inset will be the sum of the pitch prediction and an \emph on innovation \emph default signal \begin_inset Formula $c[n]$ \end_inset taken from a fixed codebook, hence the name \emph on Code \emph default Excited Linear Prediction. The final excitation is given by \end_layout \begin_layout Standard \begin_inset Formula \[ e[n]=p[n]+c[n]=\beta e[n-T]+c[n]\ .\] \end_inset The quantization of \begin_inset Formula $c[n]$ \end_inset is where most of the bits in a CELP codec are allocated. It represents the information that couldn't be obtained either from linear prediction or pitch prediction. In the \emph on z \emph default -domain we can represent the final signal \begin_inset Formula $X(z)$ \end_inset as \begin_inset Formula \[ X(z)=\frac{C(z)}{A(z)\left(1-\beta z^{-T}\right)}\] \end_inset \end_layout \begin_layout Section Noise Weighting \begin_inset Index status collapsed \begin_layout Plain Layout error weighting \end_layout \end_inset \begin_inset Index status collapsed \begin_layout Plain Layout analysis-by-synthesis \end_layout \end_inset \end_layout \begin_layout Standard Most (if not all) modern audio codecs attempt to \begin_inset Quotes eld \end_inset shape \begin_inset Quotes erd \end_inset the noise so that it appears mostly in the frequency regions where the ear cannot detect it. For example, the ear is more tolerant to noise in parts of the spectrum that are louder and \emph on vice versa \emph default . In order to maximize speech quality, CELP codecs minimize the mean square of the error (noise) in the perceptually weighted domain. This means that a perceptual noise weighting filter \begin_inset Formula $W(z)$ \end_inset is applied to the error signal in the encoder. In most CELP codecs, \begin_inset Formula $W(z)$ \end_inset is a pole-zero weighting filter derived from the linear prediction coefficients (LPC), generally using bandwidth expansion. Let the spectral envelope be represented by the synthesis filter \begin_inset Formula $1/A(z)$ \end_inset , CELP codecs typically derive the noise weighting filter as \begin_inset Formula \begin{equation} W(z)=\frac{A(z/\gamma_{1})}{A(z/\gamma_{2})}\ ,\label{eq:gamma-weighting}\end{equation} \end_inset where \begin_inset Formula $\gamma_{1}=0.9$ \end_inset and \begin_inset Formula $\gamma_{2}=0.6$ \end_inset in the Speex reference implementation. If a filter \begin_inset Formula $A(z)$ \end_inset has (complex) poles at \begin_inset Formula $p_{i}$ \end_inset in the \begin_inset Formula $z$ \end_inset -plane, the filter \begin_inset Formula $A(z/\gamma)$ \end_inset will have its poles at \begin_inset Formula $p'_{i}=\gamma p_{i}$ \end_inset , making it a flatter version of \begin_inset Formula $A(z)$ \end_inset . \end_layout \begin_layout Standard The weighting filter is applied to the error signal used to optimize the codebook search through analysis-by-synthesis (AbS). This results in a spectral shape of the noise that tends towards \begin_inset Formula $1/W(z)$ \end_inset . While the simplicity of the model has been an important reason for the success of CELP, it remains that \begin_inset Formula $W(z)$ \end_inset is a very rough approximation for the perceptually optimal noise weighting function. Fig. \begin_inset CommandInset ref LatexCommand ref reference "cap:Standard-noise-shaping" \end_inset illustrates the noise shaping that results from Eq. \begin_inset CommandInset ref LatexCommand ref reference "eq:gamma-weighting" \end_inset . Throughout this paper, we refer to \begin_inset Formula $W(z)$ \end_inset as the noise weighting filter and to \begin_inset Formula $1/W(z)$ \end_inset as the noise shaping filter (or curve). \end_layout \begin_layout Standard \begin_inset Float figure wide false sideways false status open \begin_layout Plain Layout \begin_inset ERT status collapsed \begin_layout Plain Layout \backslash begin{center} \end_layout \end_inset \begin_inset Graphics filename ref_shaping.eps width 45page% keepAspectRatio \end_inset \begin_inset ERT status collapsed \begin_layout Plain Layout \backslash end{center} \end_layout \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption \begin_layout Plain Layout Standard noise shaping in CELP. Arbitrary y-axis offset. \begin_inset CommandInset label LatexCommand label name "cap:Standard-noise-shaping" \end_inset \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Section Analysis-by-Synthesis \end_layout \begin_layout Standard One of the main principles behind CELP is called Analysis-by-Synthesis (AbS), meaning that the encoding (analysis) is performed by perceptually optimising the decoded (synthesis) signal in a closed loop. In theory, the best CELP stream would be produced by trying all possible bit combinations and selecting the one that produces the best-sounding decoded signal. This is obviously not possible in practice for two reasons: the required complexity is beyond any currently available hardware and the \begin_inset Quotes eld \end_inset best sounding \begin_inset Quotes erd \end_inset selection criterion implies a human listener. \end_layout \begin_layout Standard In order to achieve real-time encoding using limited computing resources, the CELP optimisation is broken down into smaller, more manageable, sequential searches using the perceptual weighting function described earlier. \end_layout \begin_layout Standard \begin_inset Newpage newpage \end_inset \end_layout \begin_layout Chapter The Speex Decoder Specification \end_layout \begin_layout Section Narrowband decoder \end_layout \begin_layout Standard \end_layout \begin_layout Subsection Narrowband modes \end_layout \begin_layout Standard There are 7 different narrowband bit-rates defined for Speex, ranging from 250 bps to 24.6 kbps, although the modes below 5.9 kbps should not be used for speech. The bit-allocation for each mode is detailed in table \begin_inset CommandInset ref LatexCommand ref reference "cap:bits-narrowband" \end_inset . Each frame starts with the mode ID encoded with 4 bits which allows a range from 0 to 15, though only the first 7 values are used (the others are reserved). The parameters are listed in the table in the order they are packed in the bit-stream. All frame-based parameters are packed before sub-frame parameters. The parameters for a certain sub-frame are all packed before the following sub-frame is packed. The \begin_inset Quotes eld \end_inset OL \begin_inset Quotes erd \end_inset in the parameter description means that the parameter is an open loop estimatio n based on the whole frame. \end_layout \begin_layout Standard \begin_inset Float table placement h wide true sideways false status open \begin_layout Plain Layout \begin_inset ERT status collapsed \begin_layout Plain Layout \backslash begin{center} \end_layout \end_inset \begin_inset Tabular \begin_inset Text \begin_layout Plain Layout Parameter \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Update rate \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 2 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 3 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 5 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 6 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 7 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 8 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Wideband bit \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout frame \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Mode ID \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout frame \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout LSP \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout frame \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 18 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 18 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 18 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 18 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 30 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 30 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 30 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 18 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout OL pitch \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout frame \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 7 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 7 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 7 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout OL pitch gain \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout frame \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout OL Exc gain \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout frame \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 5 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 5 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 5 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 5 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 5 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 5 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 5 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 5 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Fine pitch \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout sub-frame \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 7 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 7 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 7 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 7 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 7 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Pitch gain \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout sub-frame \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 5 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 5 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 5 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 7 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 7 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 7 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Innovation gain \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout sub-frame \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 3 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 3 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 3 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Innovation VQ \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout sub-frame \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 16 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 20 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 35 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 48 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 64 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 96 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 10 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Total \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout frame \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 5 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 43 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 119 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 160 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 220 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 300 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 364 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 492 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 79 \end_layout \end_inset \end_inset \begin_inset ERT status collapsed \begin_layout Plain Layout \backslash end{center} \end_layout \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption \begin_layout Plain Layout Bit allocation for narrowband modes \begin_inset CommandInset label LatexCommand label name "cap:bits-narrowband" \end_inset \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Subsection LSP decoding \end_layout \begin_layout Standard Depending on the mode, LSP parameters are encoded using either 18 bits or 30 bits. \end_layout \begin_layout Standard Interpolation \end_layout \begin_layout Standard Safe margin \end_layout \begin_layout Subsection Adaptive codebook \end_layout \begin_layout Standard For rates of 8 kbit/s and above, the pitch period is encoded for each subframe. The real period is \begin_inset Formula $T=p_{i}+17$ \end_inset where \begin_inset Formula $p_{i}$ \end_inset is a value encoded with 7 bits and 17 corresponds to the minimum pitch. The maximum period is 144. At 5.95 kbit/s (mode 2), the pitch period is similarly encoded, but only once for the frame. Each sub-frame then has a 2-bit offset that is added to the pitch value of the frame. In that case, the pitch for each sub-frame is equal to \begin_inset Formula $T-1+offset$ \end_inset . For rates below 5.95 kbit/s, only the per-frame pitch is used and the pitch is constant for all sub-frames. \end_layout \begin_layout Standard Speex uses a 3-tap predictor for rates of 5.95 kbit/s and above. The three gain values are obtained from a 5-bit or a 7-bit codebook, depending on the mode. \end_layout \begin_layout Subsection Innovation codebook \end_layout \begin_layout Standard Split codebook, size and entries depend on bit-rate \end_layout \begin_layout Standard a 5-bit gain is encoder on a per-frame basis \end_layout \begin_layout Standard Depending on the mode, higher resolution per sub-frame \end_layout \begin_layout Standard innovation sub-vectors concatenated, gain applied \end_layout \begin_layout Subsection Perceptual enhancement \end_layout \begin_layout Standard Optional, implementation-defined. \end_layout \begin_layout Subsection Bit-stream definition \end_layout \begin_layout Standard This section defines the bit-stream that is transmitted on the wire. One speex packet consist of 1 frame header and 4 sub-frames: \end_layout \begin_layout Standard \begin_inset Tabular \begin_inset Text \begin_layout Plain Layout Frame Header \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Subframe 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Subframe2 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Subframe 3 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Subframe 4 \end_layout \end_inset \end_inset \end_layout \begin_layout Standard The frame header is variable length, depending on decoding mode and submode. The narrowband frame header is defined as follows: \end_layout \begin_layout Standard \begin_inset Tabular \begin_inset Text \begin_layout Plain Layout wb bit \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout modeid \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout LSP \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout OL-pitch \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout OL-pitchgain \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout OL ExcGain \end_layout \end_inset \end_inset \end_layout \begin_layout Standard wb-bit: Wideband bit (1 bit) 0=narrowband, 1=wideband \end_layout \begin_layout Standard modeid: Mode identifier (4 bits) \end_layout \begin_layout Standard LSP: Line Spectral Pairs (0, 18 or 30 bits) \end_layout \begin_layout Standard OL-pitch: Open Loop Pitch (0 or 7 bits) \end_layout \begin_layout Standard OL-pitchgain: Open Loop Pitch Gain (0 or 4 bits) \end_layout \begin_layout Standard OL-ExcGain: Open Loop Excitation Gain (0 or 5 bits) \end_layout \begin_layout Standard ... \end_layout \begin_layout Standard Each subframe is defined as follows: \end_layout \begin_layout Standard \begin_inset Tabular \begin_inset Text \begin_layout Plain Layout FinePitch \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout PitchGain \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout InnovationGain \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Innovation VQ \end_layout \end_inset \end_inset \end_layout \begin_layout Standard FinePitch: (0 or 7 bits) \end_layout \begin_layout Standard PitchGain: (0, 5, or 7 bits) \end_layout \begin_layout Standard Innovation Gain: (0, 1, 3 bits) \end_layout \begin_layout Standard Innovation VQ: (0-96 bits) \end_layout \begin_layout Standard ... \end_layout \begin_layout Subsection Sample decoder \end_layout \begin_layout Standard This section contains some sample source code, showing how a basic Speex decoder can be implemented. The sample decoder is narrowband submode 3 only, and with no advanced features like enhancement, vbr etc. \end_layout \begin_layout Standard ... \end_layout \begin_layout Subsection Lookup tables \end_layout \begin_layout Standard The Speex decoder includes a set of lookup tables and codebooks, which are used to convert between values of different domains. This includes: \end_layout \begin_layout Standard - Excitation 10x16 (3200 bps) \end_layout \begin_layout Standard - Excitation 10x32 (4000 bps) \end_layout \begin_layout Standard - Excitation 20x32 (2000 bps) \end_layout \begin_layout Standard - Excitation 5x256 (12800 bps) \end_layout \begin_layout Standard - Excitation 5x64 (9600 bps) \end_layout \begin_layout Standard - Excitation 8x128 (7000 bps) \end_layout \begin_layout Standard - Codebook for 3-tap pitch prediction gain (Normal and Low Bitrate) \end_layout \begin_layout Standard - Codebook for LSPs in narrowband CELP mode \end_layout \begin_layout Standard ... \end_layout \begin_layout Standard The exact lookup tables are included here for reference. \end_layout \begin_layout Section Wideband embedded decoder \end_layout \begin_layout Standard QMF filter. Narrowband signal decoded using narrowband decoder \end_layout \begin_layout Standard For the high band, the decoder is similar to the narrowband decoder, with the main difference being that there is no adaptive codebook. \end_layout \begin_layout Standard Gain is per-subframe \end_layout \begin_layout Chapter Speex narrowband mode \begin_inset CommandInset label LatexCommand label name "sec:Speex-narrowband-mode" \end_inset \begin_inset Index status collapsed \begin_layout Plain Layout narrowband \end_layout \end_inset \end_layout \begin_layout Standard This section looks at how Speex works for narrowband ( \begin_inset Formula $8\:\mathrm{kHz}$ \end_inset sampling rate) operation. The frame size for this mode is \begin_inset Formula $20\:\mathrm{ms}$ \end_inset , corresponding to 160 samples. Each frame is also subdivided into 4 sub-frames of 40 samples each. \end_layout \begin_layout Standard Also many design decisions were based on the original goals and assumptions: \end_layout \begin_layout Itemize Minimizing the amount of information extracted from past frames (for robustness to packet loss) \end_layout \begin_layout Itemize Dynamically-selectable codebooks (LSP, pitch and innovation) \end_layout \begin_layout Itemize sub-vector fixed (innovation) codebooks \end_layout \begin_layout Section Whole-Frame Analysis \begin_inset Index status collapsed \begin_layout Plain Layout linear prediction \end_layout \end_inset \end_layout \begin_layout Standard In narrowband, Speex frames are 20 ms long (160 samples) and are subdivided in 4 sub-frames of 5 ms each (40 samples). For most narrowband bit-rates (8 kbps and above), the only parameters encoded at the frame level are the Line Spectral Pairs (LSP) and a global excitation gain \begin_inset Formula $g_{frame}$ \end_inset , as shown in Fig. \begin_inset CommandInset ref LatexCommand ref reference "cap:Frame-open-loop-analysis" \end_inset . All other parameters are encoded at the sub-frame level. \end_layout \begin_layout Standard Linear prediction analysis is performed once per frame using an asymmetric Hamming window centered on the fourth sub-frame. Because linear prediction coefficients (LPC) are not robust to quantization, they are first converted to line spectral pairs (LSP) \begin_inset Index status collapsed \begin_layout Plain Layout line spectral pair \end_layout \end_inset . The LSP's are considered to be associated to the \begin_inset Formula $4^{th}$ \end_inset sub-frames and the LSP's associated to the first 3 sub-frames are linearly interpolated using the current and previous LSP coefficients. The LSP coefficients and converted back to the LPC filter \begin_inset Formula $\hat{A}(z)$ \end_inset . The non-quantized interpolated filter is denoted \begin_inset Formula $A(z)$ \end_inset and can be used for the weighting filter \begin_inset Formula $W(z)$ \end_inset because it does not need to be available to the decoder. \end_layout \begin_layout Standard To make Speex more robust to packet loss, no prediction is applied on the LSP coefficients prior to quantization. The LSPs are encoded using vector quantization (VQ) with 30 bits for higher quality modes and 18 bits for lower quality. \end_layout \begin_layout Standard \begin_inset Float figure wide false sideways false status open \begin_layout Plain Layout \begin_inset ERT status collapsed \begin_layout Plain Layout \backslash begin{center} \end_layout \end_inset \begin_inset Graphics filename speex_analysis.eps width 35page% \end_inset \begin_inset ERT status collapsed \begin_layout Plain Layout \backslash end{center} \end_layout \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption \begin_layout Plain Layout Frame open-loop analysis \begin_inset CommandInset label LatexCommand label name "cap:Frame-open-loop-analysis" \end_inset \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Section Sub-Frame Analysis-by-Synthesis \end_layout \begin_layout Standard \begin_inset Float figure wide false sideways false status open \begin_layout Plain Layout \begin_inset ERT status collapsed \begin_layout Plain Layout \backslash begin{center} \end_layout \end_inset \begin_inset Graphics filename speex_abs.eps lyxscale 75 width 40page% \end_inset \begin_inset ERT status collapsed \begin_layout Plain Layout \backslash end{center} \end_layout \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption \begin_layout Plain Layout Analysis-by-synthesis closed-loop optimization on a sub-frame. \begin_inset CommandInset label LatexCommand label name "cap:Sub-frame-AbS" \end_inset \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Standard The analysis-by-synthesis (AbS) encoder loop is described in Fig. \begin_inset CommandInset ref LatexCommand ref reference "cap:Sub-frame-AbS" \end_inset . There are three main aspects where Speex significantly differs from most other CELP codecs. First, while most recent CELP codecs make use of fractional pitch estimation with a single gain, Speex uses an integer to encode the pitch period, but uses a 3-tap predictor (3 gains). The adaptive codebook contribution \begin_inset Formula $e_{a}[n]$ \end_inset can thus be expressed as: \begin_inset Formula \begin{equation} e_{a}[n]=g_{0}e[n-T-1]+g_{1}e[n-T]+g_{2}e[n-T+1]\label{eq:adaptive-3tap}\end{equation} \end_inset where \begin_inset Formula $g_{0}$ \end_inset , \begin_inset Formula $g_{1}$ \end_inset and \begin_inset Formula $g_{2}$ \end_inset are the jointly quantized pitch gains and \begin_inset Formula $e[n]$ \end_inset is the codec excitation memory. It is worth noting that when the pitch is smaller than the sub-frame size, we repeat the excitation at a period \begin_inset Formula $T$ \end_inset . For example, when \begin_inset Formula $n-T+1\geq0$ \end_inset , we use \begin_inset Formula $n-2T+1$ \end_inset instead. In most modes, the pitch period is encoded with 7 bits in the \begin_inset Formula $\left[17,144\right]$ \end_inset range and the \begin_inset Formula $\beta_{i}$ \end_inset coefficients are vector-quantized using 7 bits at higher bit-rates (15 kbps narrowband and above) and 5 bits at lower bit-rates (11 kbps narrowband and below). \end_layout \begin_layout Standard Many current CELP codecs use moving average (MA) prediction to encode the fixed codebook gain. This provides slightly better coding at the expense of introducing a dependency on previously encoded frames. A second difference is that Speex encodes the fixed codebook gain as the product of the global excitation gain \begin_inset Formula $g_{frame}$ \end_inset with a sub-frame gain corrections \begin_inset Formula $g_{subf}$ \end_inset . This increases robustness to packet loss by eliminating the inter-frame dependency. The sub-frame gain correction is encoded before the fixed codebook is searched (not closed-loop optimized) and uses between 0 and 3 bits per sub-frame, depending on the bit-rate. \end_layout \begin_layout Standard The third difference is that Speex uses sub-vector quantization of the innovatio n (fixed codebook) signal instead of an algebraic codebook. Each sub-frame is divided into sub-vectors of lengths ranging between 5 and 20 samples. Each sub-vector is chosen from a bitrate-dependent codebook and all sub-vectors are concatenated to form a sub-frame. As an example, the 3.95 kbps mode uses a sub-vector size of 20 samples with 32 entries in the codebook (5 bits). This means that the innovation is encoded with 10 bits per sub-frame, or 2000 bps. On the other hand, the 18.2 kbps mode uses a sub-vector size of 5 samples with 256 entries in the codebook (8 bits), so the innovation uses 64 bits per sub-frame, or 12800 bps. \end_layout \begin_layout Section Bit-rates \end_layout \begin_layout Standard So far, no MOS (Mean Opinion Score \begin_inset Index status collapsed \begin_layout Plain Layout mean opinion score \end_layout \end_inset ) subjective evaluation has been performed for Speex. In order to give an idea of the quality achievable with it, table \begin_inset CommandInset ref LatexCommand ref reference "cap:quality_vs_bps" \end_inset presents my own subjective opinion on it. It should be noted that different people will perceive the quality differently and that the person that designed the codec often has a bias (one way or another) when it comes to subjective evaluation. Last thing, it should be noted that for most codecs (including Speex) encoding quality sometimes varies depending on the input. Note that the complexity is only approximate (within 0.5 mflops and using the lowest complexity setting). Decoding requires approximately 0.5 mflops \begin_inset Index status collapsed \begin_layout Plain Layout complexity \end_layout \end_inset in most modes (1 mflops with perceptual enhancement). \end_layout \begin_layout Standard \begin_inset Float table placement h wide true sideways false status open \begin_layout Plain Layout \begin_inset ERT status collapsed \begin_layout Plain Layout \backslash begin{center} \end_layout \end_inset \begin_inset Tabular \begin_inset Text \begin_layout Plain Layout Mode \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Quality \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Bit-rate \begin_inset Index status collapsed \begin_layout Plain Layout bit-rate \end_layout \end_inset (bps) \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout mflops \begin_inset Index status collapsed \begin_layout Plain Layout complexity \end_layout \end_inset \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Quality/description \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout - \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 250 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout No transmission (DTX) \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 2,150 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 6 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Vocoder (mostly for comfort noise) \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 2 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 2 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 5,950 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 9 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Very noticeable artifacts/noise, good intelligibility \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 3 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 3-4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 8,000 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 10 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Artifacts/noise sometimes noticeable \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 5-6 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 11,000 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 14 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Artifacts usually noticeable only with headphones \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 5 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 7-8 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 15,000 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 11 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Need good headphones to tell the difference \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 6 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 9 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 18,200 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 17.5 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Hard to tell the difference even with good headphones \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 7 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 10 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 24,600 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 14.5 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Completely transparent for voice, good quality music \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 8 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 3,950 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 10.5 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Very noticeable artifacts/noise, good intelligibility \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 9 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout - \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout - \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout - \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout reserved \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 10 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout - \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout - \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout - \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout reserved \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 11 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout - \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout - \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout - \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout reserved \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 12 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout - \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout - \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout - \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout reserved \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 13 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout - \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout - \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout - \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Application-defined, interpreted by callback or skipped \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 14 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout - \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout - \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout - \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Speex in-band signaling \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 15 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout - \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout - \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout - \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Terminator code \end_layout \end_inset \end_inset \begin_inset ERT status collapsed \begin_layout Plain Layout \backslash end{center} \end_layout \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption \begin_layout Plain Layout Quality versus bit-rate \begin_inset CommandInset label LatexCommand label name "cap:quality_vs_bps" \end_inset \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Section Perceptual enhancement \begin_inset Index status collapsed \begin_layout Plain Layout perceptual enhancement \end_layout \end_inset \end_layout \begin_layout Standard \series bold This section was only valid for version 1.1.12 and earlier. It does not apply to version 1.2-beta1 (and later), for which the new perceptual enhancement is not yet documented. \end_layout \begin_layout Standard This part of the codec only applies to the decoder and can even be changed without affecting inter-operability. For that reason, the implementation provided and described here should only be considered as a reference implementation. The enhancement system is divided into two parts. First, the synthesis filter \begin_inset Formula $S(z)=1/A(z)$ \end_inset is replaced by an enhanced filter: \begin_inset Formula \[ S'(z)=\frac{A\left(z/a_{2}\right)A\left(z/a_{3}\right)}{A\left(z\right)A\left(z/a_{1}\right)}\] \end_inset where \begin_inset Formula $a_{1}$ \end_inset and \begin_inset Formula $a_{2}$ \end_inset depend on the mode in use and \begin_inset Formula $a_{3}=\frac{1}{r}\left(1-\frac{1-ra_{1}}{1-ra_{2}}\right)$ \end_inset with \begin_inset Formula $r=.9$ \end_inset . The second part of the enhancement consists of using a comb filter to enhance the pitch in the excitation domain. \end_layout \begin_layout Standard \begin_inset Newpage newpage \end_inset \end_layout \begin_layout Chapter Speex wideband mode (sub-band CELP) \begin_inset Index status collapsed \begin_layout Plain Layout wideband \end_layout \end_inset \begin_inset CommandInset label LatexCommand label name "sec:Speex-wideband-mode" \end_inset \end_layout \begin_layout Standard For wideband, the Speex approach uses a \emph on q \emph default uadrature \emph on m \emph default irror \emph on f \emph default ilter \begin_inset Index status collapsed \begin_layout Plain Layout quadrature mirror filter \end_layout \end_inset (QMF) to split the band in two. The 16 kHz signal is thus divided into two 8 kHz signals, one representing the low band (0-4 kHz), the other the high band (4-8 kHz). The low band is encoded with the narrowband mode described in section \begin_inset CommandInset ref LatexCommand ref reference "sec:Speex-narrowband-mode" \end_inset in such a way that the resulting \begin_inset Quotes eld \end_inset embedded narrowband bit-stream \begin_inset Quotes erd \end_inset can also be decoded with the narrowband decoder. Since the low band encoding has already been described, only the high band encoding is described in this section. \end_layout \begin_layout Section Linear Prediction \end_layout \begin_layout Standard The linear prediction part used for the high-band is very similar to what is done for narrowband. The only difference is that we use only 12 bits to encode the high-band LSP's using a multi-stage vector quantizer (MSVQ). The first level quantizes the 10 coefficients with 6 bits and the error is then quantized using 6 bits, too. \end_layout \begin_layout Section Pitch Prediction \end_layout \begin_layout Standard That part is easy: there's no pitch prediction for the high-band. There are two reasons for that. First, there is usually little harmonic structure in this band (above 4 kHz). Second, it would be very hard to implement since the QMF folds the 4-8 kHz band into 4-0 kHz (reversing the frequency axis), which means that the location of the harmonics is no longer at multiples of the fundamental (pitch). \end_layout \begin_layout Section Excitation Quantization \end_layout \begin_layout Standard The high-band excitation is coded in the same way as for narrowband. \end_layout \begin_layout Section Bit allocation \end_layout \begin_layout Standard For the wideband mode, the entire narrowband frame is packed before the high-band is encoded. The narrowband part of the bit-stream is as defined in table \begin_inset CommandInset ref LatexCommand ref reference "cap:bits-narrowband" \end_inset . The high-band follows, as described in table \begin_inset CommandInset ref LatexCommand ref reference "cap:bits-wideband" \end_inset . For wideband, the mode ID is the same as the Speex quality setting and is defined in table \begin_inset CommandInset ref LatexCommand ref reference "tab:wideband-quality" \end_inset . This also means that a wideband frame may be correctly decoded by a narrowband decoder with the only caveat that if more than one frame is packed in the same packet, the decoder will need to skip the high-band parts in order to sync with the bit-stream. \end_layout \begin_layout Standard \begin_inset Float table placement h wide true sideways false status open \begin_layout Plain Layout \begin_inset ERT status collapsed \begin_layout Plain Layout \backslash begin{center} \end_layout \end_inset \begin_inset Tabular \begin_inset Text \begin_layout Plain Layout Parameter \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Update rate \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 2 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 3 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Wideband bit \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout frame \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Mode ID \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout frame \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 3 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 3 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 3 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 3 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 3 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout LSP \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout frame \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 12 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 12 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 12 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 12 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Excitation gain \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout sub-frame \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 5 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Excitation VQ \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout sub-frame \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 20 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 40 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 80 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Total \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout frame \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 36 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 112 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 192 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 352 \end_layout \end_inset \end_inset \begin_inset ERT status collapsed \begin_layout Plain Layout \backslash end{center} \end_layout \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption \begin_layout Plain Layout Bit allocation for high-band in wideband mode \begin_inset CommandInset label LatexCommand label name "cap:bits-wideband" \end_inset \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Standard \begin_inset Float table placement h wide true sideways false status open \begin_layout Plain Layout \begin_inset ERT status collapsed \begin_layout Plain Layout \backslash begin{center} \end_layout \end_inset \begin_inset Tabular \begin_inset Text \begin_layout Plain Layout Mode/Quality \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Bit-rate \begin_inset Index status collapsed \begin_layout Plain Layout bit-rate \end_layout \end_inset (bps) \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Quality/description \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 3,950 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Barely intelligible (mostly for comfort noise) \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 5,750 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Very noticeable artifacts/noise, poor intelligibility \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 2 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 7,750 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Very noticeable artifacts/noise, good intelligibility \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 3 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 9,800 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Artifacts/noise sometimes annoying \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 12,800 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Artifacts/noise usually noticeable \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 5 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 16,800 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Artifacts/noise sometimes noticeable \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 6 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 20,600 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Need good headphones to tell the difference \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 7 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 23,800 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Need good headphones to tell the difference \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 8 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 27,800 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Hard to tell the difference even with good headphones \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 9 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 34,200 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Hard to tell the difference even with good headphones \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 10 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 42,200 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Completely transparent for voice, good quality music \end_layout \end_inset \end_inset \begin_inset ERT status collapsed \begin_layout Plain Layout \backslash end{center} \end_layout \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption \begin_layout Plain Layout Quality versus bit-rate for the wideband encoder \begin_inset CommandInset label LatexCommand label name "tab:wideband-quality" \end_inset \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout \backslash clearpage \end_layout \end_inset \end_layout \begin_layout Standard \begin_inset ERT status collapsed \begin_layout Plain Layout \backslash clearpage \end_layout \end_inset \end_layout \begin_layout Chapter \start_of_appendix Sample code \begin_inset CommandInset label LatexCommand label name "sec:Sample-code" \end_inset \end_layout \begin_layout Standard This section shows sample code for encoding and decoding speech using the Speex API. The commands can be used to encode and decode a file by calling: \family typewriter \begin_inset Newline newline \end_inset % sampleenc in_file.sw | sampledec out_file.sw \family default \begin_inset Newline newline \end_inset where both files are raw (no header) files encoded at 16 bits per sample (in the machine natural endianness). \end_layout \begin_layout Section sampleenc.c \end_layout \begin_layout Standard sampleenc takes a raw 16 bits/sample file, encodes it and outputs a Speex stream to stdout. Note that the packing used is \series bold not \series default compatible with that of speexenc/speexdec. \end_layout \begin_layout Standard \begin_inset CommandInset include LatexCommand lstinputlisting filename "sampleenc.c" lstparams "caption={Source code for sampleenc},label={sampleenc-source-code},numbers=left,numberstyle={\\footnotesize}" \end_inset \end_layout \begin_layout Section sampledec.c \end_layout \begin_layout Standard sampledec reads a Speex stream from stdin, decodes it and outputs it to a raw 16 bits/sample file. Note that the packing used is \series bold not \series default compatible with that of speexenc/speexdec. \end_layout \begin_layout Standard \begin_inset CommandInset include LatexCommand lstinputlisting filename "sampledec.c" lstparams "caption={Source code for sampledec},label={sampledec-source-code},numbers=left,numberstyle={\\footnotesize}" \end_inset \end_layout \begin_layout Standard \begin_inset Newpage newpage \end_inset \end_layout \begin_layout Chapter Jitter Buffer for Speex \end_layout \begin_layout Standard \begin_inset CommandInset include LatexCommand lstinputlisting filename "../speexclient/speex_jitter_buffer.c" lstparams "caption={Example of using the jitter buffer for Speex packets},label={example-speex-jitter},numbers=left,numberstyle={\\footnotesize}" \end_inset \end_layout \begin_layout Standard \begin_inset Newpage newpage \end_inset \end_layout \begin_layout Chapter IETF RTP Profile \begin_inset CommandInset label LatexCommand label name "sec:IETF-draft" \end_inset \end_layout \begin_layout Standard \begin_inset CommandInset include LatexCommand verbatiminput filename "draft-ietf-avt-rtp-speex-05-tmp.txt" \end_inset \end_layout \begin_layout Standard \begin_inset Newpage newpage \end_inset \end_layout \begin_layout Chapter Speex License \begin_inset CommandInset label LatexCommand label name "sec:Speex-License" \end_inset \end_layout \begin_layout Standard \begin_inset CommandInset include LatexCommand verbatiminput filename "../COPYING" \end_inset \end_layout \begin_layout Standard \begin_inset Newpage newpage \end_inset \end_layout \begin_layout Chapter GNU Free Documentation License \end_layout \begin_layout Standard Version 1.1, March 2000 \end_layout \begin_layout Standard Copyright (C) 2000 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. \end_layout \begin_layout Section* 0. PREAMBLE \end_layout \begin_layout Standard The purpose of this License is to make a manual, textbook, or other written document "free" in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. \end_layout \begin_layout Standard This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. \end_layout \begin_layout Standard We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. \end_layout \begin_layout Section* 1. APPLICABILITY AND DEFINITIONS \end_layout \begin_layout Standard This License applies to any manual or other work that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you". \end_layout \begin_layout Standard A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. \end_layout \begin_layout Standard A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (For example, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. \end_layout \begin_layout Standard The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. \end_layout \begin_layout Standard The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. \end_layout \begin_layout Standard A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, whose contents can be viewed and edited directly and straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup has been designed to thwart or discourage subsequent modification by readers is not Transparent. A copy that is not "Transparent" is called "Opaque". \end_layout \begin_layout Standard Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML designed for human modification. Opaque formats include PostScript, PDF, proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-ge nerated HTML produced by some word processors for output purposes only. \end_layout \begin_layout Standard The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. \end_layout \begin_layout Section* 2. VERBATIM COPYING \end_layout \begin_layout Standard You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. \end_layout \begin_layout Standard You may also lend copies, under the same conditions stated above, and you may publicly display copies. \end_layout \begin_layout Section* 3. COPYING IN QUANTITY \end_layout \begin_layout Standard If you publish printed copies of the Document numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. \end_layout \begin_layout Standard If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. \end_layout \begin_layout Standard If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a publicly-accessib le computer-network location containing a complete Transparent copy of the Document, free of added material, which the general network-using public has access to download anonymously at no charge using public-standard network protocols. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. \end_layout \begin_layout Standard It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. \end_layout \begin_layout Section* 4. MODIFICATIONS \end_layout \begin_layout Standard You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: \end_layout \begin_layout Itemize A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. \end_layout \begin_layout Itemize B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has less than five). \end_layout \begin_layout Itemize C. State on the Title page the name of the publisher of the Modified Version, as the publisher. \end_layout \begin_layout Itemize D. Preserve all the copyright notices of the Document. \end_layout \begin_layout Itemize E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. \end_layout \begin_layout Itemize F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. \end_layout \begin_layout Itemize G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. \end_layout \begin_layout Itemize H. Include an unaltered copy of this License. \end_layout \begin_layout Itemize I. Preserve the section entitled "History", and its title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section entitled "History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. \end_layout \begin_layout Itemize J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. \end_layout \begin_layout Itemize K. In any section entitled "Acknowledgements" or "Dedications", preserve the section's title, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. \end_layout \begin_layout Itemize L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. \end_layout \begin_layout Itemize M. Delete any section entitled "Endorsements". Such a section may not be included in the Modified Version. \end_layout \begin_layout Itemize N. Do not retitle any existing section as "Endorsements" or to conflict in title with any Invariant Section. \end_layout \begin_layout Standard If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. \end_layout \begin_layout Standard You may add a section entitled "Endorsements", provided it contains nothing but endorsements of your Modified Version by various parties--for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. \end_layout \begin_layout Standard You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. \end_layout \begin_layout Standard The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorseme nt of any Modified Version. \end_layout \begin_layout Section* 5. COMBINING DOCUMENTS \end_layout \begin_layout Standard You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice. \end_layout \begin_layout Standard The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. \end_layout \begin_layout Standard In the combination, you must combine any sections entitled "History" in the various original documents, forming one section entitled "History"; likewise combine any sections entitled "Acknowledgements", and any sections entitled "Dedications". You must delete all sections entitled "Endorsements." \end_layout \begin_layout Section* 6. COLLECTIONS OF DOCUMENTS \end_layout \begin_layout Standard You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. \end_layout \begin_layout Standard You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. \end_layout \begin_layout Section* 7. AGGREGATION WITH INDEPENDENT WORKS \end_layout \begin_layout Standard A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, does not as a whole count as a Modified Version of the Document, provided no compilation copyright is claimed for the compilation. Such a compilation is called an "aggregate", and this License does not apply to the other self-contained works thus compiled with the Document, on account of their being thus compiled, if they are not themselves derivative works of the Document. \end_layout \begin_layout Standard If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one quarter of the entire aggregate, the Document's Cover Texts may be placed on covers that surround only the Document within the aggregate. Otherwise they must appear on covers around the whole aggregate. \end_layout \begin_layout Section* 8. TRANSLATION \end_layout \begin_layout Standard Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License provided that you also include the original English version of this License. In case of a disagreement between the translation and the original English version of this License, the original English version will prevail. \end_layout \begin_layout Section* 9. TERMINATION \end_layout \begin_layout Standard You may not copy, modify, sublicense, or distribute the Document except as expressly provided for under this License. Any other attempt to copy, modify, sublicense or distribute the Document is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. \end_layout \begin_layout Section* 10. FUTURE REVISIONS OF THIS LICENSE \end_layout \begin_layout Standard The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See http://www.gnu.org/copyleft/. \end_layout \begin_layout Standard Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundatio n. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. \end_layout \begin_layout Standard \begin_inset CommandInset index_print LatexCommand printindex \end_inset \end_layout \end_body \end_document mumble-1.3.4/3rdparty/speexdsp-src/doc/manual.pdf0000664000175000017500000153237114010707343021560 0ustar builderbuilder%PDF-1.3 %쏢 5 0 obj <> stream xmRMk@ Wq VҌFkRrh7mn/ϯfk;3$c@\k{0\w=vt݅A.aMd dł]-=#gg?!pK? $M0-4)⟙s{pzq%8k|=ѭcR|hҴ$6/T,#; AZzRpvϋ~$Eh%xTADZrCdW^YycMʐrᶦL@R- Y}U>.!TȓNU9Ӕy6z/X}ND>(}iWt r4@Ir/ɐ&lZZvQD/Dǜ{p,Yh yۏ o4~&endstream endobj 6 0 obj 414 endobj 13 0 obj <> stream xWnE}߯4#e}nDDD DH[,bo8=U=5; rutF+hO6GCsawy1Y\5$Z|3(Qa,(~y'lw]*Ɣ\Ce\DleۛB^v,X^T7$ʡ6ܞtQ`VƦkrCvI jJz58 sjJ| ]oVCs yߞMٴёH_9},u3}ON+0}T06W`.Q#ٱwCnj1RSV.o:rm5IgJP~&k$Rib;܃UZCgTxlpɵSۄZC9aX]"cΒ3?b=VkPB$"@K]u[b18WLt *X,u4Fm`&3QYJyMgʫH^;]D坙D0ڭDu^C+U2ˎb]T&2k.Nj*" 6 V\ s-yſh3IA@uƒeT}*{q~6@%urf"oJfDKF~%ԗU*UFVeeWq{u1s)H>pMf-fNu}*mČTNvJuV!ۑT#گ͜NԐj YK\ԘOl ]-ÓF¤Дfx=].3^$Da鮼Y":`3q=pGPM!F(al_LJqK93F9K~:P{bhf- #2Y9~Sha#h pHrlo\Ɵ#6#jRz''fQ~U[~4CR60Mj6A$Zq&4uva$,y:MԈ?*ݮm"a=%kZs0Zp(MF)-M0o\ʼW 4L{@GTD'|]Z1祾 : ̮)1;yCaA^5$|\cNޝKxŠ>\av񚍯`l"c-=&^=>2ഡ$@SG lendstream endobj 14 0 obj 1235 endobj 20 0 obj <> stream x][o6ѿb56 ҭqb؎c48)JȊoaFEqw.9|Xb_z\>êb!tr+Q2cYݫo+mޭÕߊgkΜ\W%OX^7iYB沉x?/{" W^~[<3B/%Zpr#ZzsZXx m`nITyf"y ײ8\aWx0.[p^+o: DhI=ŗᕕṫ'nWxʻwh|U`.+Y]ޔ̖P2`aWH{Y0w!=dUѥ! ¬UѾzY` % Vؒ]w>NrQ7:} _+l~\ PLA:3 ?{\D§AuxL:P,Ȃ[t./Hëۈ`Z3YD[+fh4|~\׀>9h]}hoja{oϢ&I`')U0mOh{(oVJA蘷L6Z9?rNDި dEWdUrn +~"ܮ# &/% ĜEt6^{iM)[]JFڂ]H@<м͈W D#G=ߥ rH/JF(deΧ;!5q\$Q R[،YwѼ>tDgIyb,GJ@WS"1J@JŬ;ajzm :"yxh&~AUX8B ),\ VrVļ(6H09ʇ]pH',Mw^"*=Xx,e(rcvBhuw,m5tO?lٿC!z EWWH)*RXTY5%0R-I@Wo j@=ʪݪ5%jRZ]b8t&}V^/ia.[`Xp}i{|@Dg& MuoL'ĶMNP|Z!޷OnR^eju*/3Tff33E8K~yZl>lIЛQW"dj͚EσH;N]-(V_@iWJT嫮_/+ 5$$;jk䔺{2|4ʘC:_c_| Q^[zډM71ԋo,u#7 WH7Qk:!6s}COq>e%|kΑICI(ahyi[5Rm%rO8Tu0qvEYmy'*B~~h8B3y¥$lW!X^+ ɇ]⬲ᄓFV S <7]#="rz8kLlK;;ZIvqIw130a1 D5xu  <30<3tTYTj|9Z佴 m3x*ݭ5O֒P]'Z r-=R$5u8$k!BlF}$ǔ[i5q9NݜN)lKlJW|t6forwgmHX>oĶPj(eWԬwyWT_f6$Hx^t@RW~M+wE€ oN|gGDs"9IHܻr1 NC{1ӖaG*J9Bd8\ʛBżLvJ$KkRe79Yɸt5S*g- ֊ Yr7),ã:K>8uY -lO߅&<)G!` tߦVa+"ߧo'tLsMڭD2YnR4ûnq N"ԩS<"VC$ٞVg5C| ¿8Hft'|K+{9q) qd\Eo܏عz#v<aH-Nj(?v`2U(:\; -XRNBhd8+18.ƭbNI+woFDX}r3n x~9ً/:nu% e?cRW00e bȳ4S1u9Ha]M)&u~T$ 6?8@>;,bbc UY܀W,)I Sr, \5Z]*ly%̣>4n(}.Z؏BSu(\ Ó=h&ə,Ѽ)!Y_+ ;W໖|nW''l;iѠ\~*[]wLiQ>1  ?}endstream endobj 21 0 obj 3032 endobj 27 0 obj <> stream xZKo6z_#uرA=4=8: Nv}HJ:vSYHof/P~~3Q=/3hڙP x&xVidPk{.u匊?lH Y7{;mGoH`nUݼyº?Q+_VG:2[|nJ޴`YݠJhG  PQ(gQR/פ Vy;b׍FAp/BG+GG4\Dw Gv2Ԁn 6a 4pgo/5c!!qyy,kҢ6td?R naOFppM z Oen0,Wܹvh@jV;Yyec)qm|Sc_%4"YpK-(MAq+z4J@dn&!s#O,&ow-ḏD,sk[rZ¹Ȑd]2e>I~Ur)dD4 yBS|>㲘z`r~ˆ&B\R-N6a8kA32N]$`08h?*7+akjb Nxޱ sU&QlS2BryZ.FenL&"2_|W֕z2?Ns zaQ@u+fq-2XXLט=+ݡ9LtT';~xD,6%ã=ڣN OXN ʼn,8)dH#KS#@"e͐r#ZQ.{V.'إ3oXAJCbxE:8ܛùM"u:KuT8TײAq7c0}!zlN=`iۭyTw׷h0>FUQmjE'^ ^.+qRA:6JyY_1Z1CS͵0f4YPK嘗Xk޻ 3,S=/ø]hي*` xd[yg@ n=Ybv =tR꧹4~ Ҝں$Z%v;s/vB( {Qx#B5ąJ5I,zǫԋ-d/+2/~ŏu-Nsڥh4+?2 SΛQ(Q(OR/N-Ibشَک7c~jYwR!ٯuƈ#qThbAtSdO]8QB|Ar> stream xKo!{dKkjUJ[C85vG_^/ĉHMY00O=>Toxt1Pu_y?%_h4X uPFi2VWuTu-koP/Uԑ4zl"@P߲ѤЫ> stream x]Ksqo/ 8]=i_֮%{5 M(׻UY3v gV>~s.l'_ήy6~扈.^}4<".E~lꗽ DZ ehy3V*ܳv}}5zۿަ-htgj2ӝp}} ؇}k3]B՛0Y'g.o ;|(|ZH,1,O| -/e{.CH#]<.V&z.߶G/jK+)qϵ ΅LʭڭZ6:(b"pBW/bQեCF 39(j Fka7OlTlMK8Si lDP ᦧx0lz /%m=hTn3Y;VVZm^Iת bP;)m1R ;3@>"u.0Z[q.jnhHc@YZP[q[#z=PW_hmʌ#d\~vƸįr<;Q>MQzq\[oA#|:c4P h`p0m_{f78CrGpW vfBSMq| U^G4,gT[m:ȧuP0Gom8I"2[!{ZP> Qo[ӌiSnR;M)|[8 .Īc8W%# D*(1s''ت[qQط@2(d67=85NǴR{3Lr>ļ T^ElahA*mmܴאFU(L*Qу/YK<"n5D'1Jzz`YϫvHHE ǂ:̔/tr]LYC9D,1^/W>I릳<:a Gs1V9NPն7"RzTx0dzAvk'̮ ߼?V*Yחn{@f22f,?V%,+y|dbӝ"jnޑH}<ȊEw4w/ZF ^^4䤁sQ&7YHM,x٬~&j qK4X޵ EFSgfDw9cUG`k < c}o%mll릐mه7c^aAͩpUIhWZVG%{!63Zcu2葺xfyx] 6!Bnk8+k kd:mTHE[ r`Maٶdh1B8'ͯ3p[s#,P`,,n߳8 /vz20<*KowVv-,Ѣ e$SakIR)|%N6.Ƕn.4٨_0wm wG{XL!͕ tGb(ĵa-p6x1h..py T6L( hvq`Hܵaqm>q\3[PwXV-3z\Uy#*UhN M!EUA}mh$; ɋHA C%x!D$ݒK5x!.4&6Eˀ!抿%wM衟p'JݘWy^9)RJK͝ldVն ļ9sBfymB0,w@{R{niVTX)x8~*H il+ŕ`\sz;D3IGb搸e'T#(pZ?;!|X?EPt|<]܇Vbz}&>lAm?WN.'Tg] DeC=MgzM.ᨮS}%xp ixd;ʂ{t QS] ۰1 ^l YjQZBY>@/uNk)d'ܿFC7 :$r1.pnF[&R\ٓy|My,NN]1F78 БE.l;?QEӝAcmmv[,82$8>%p0F  t؆2EyCD2WCԔdaUpWK#ߡk\;hx1Lڻ~&!"rd7Xn%L;;qG3'"mU>! @c#0"$?évB#`W]=`{~ѱmUSuݯ#1#D-|g9(AǜG9A<x˕G:ħѓ',@*~zt[|2 AeXBK ੈUb}u;5/$7(y;b 4  }G6ll'kϯ'!3r4Z!V;h0<٢d~t^b6N;d#P<`,I0q'eP JSAHҢy xUel W2,ع $qq#Pb':Ff sGHjo/x?-8&f9a7+xÒS79Ù+t}0 yWeS~ on" #|JNK`6=ZqN7ޯgW|zDj/EO=?6h-m}w ^5 F87/%q<`JջT"kxw*T)Sǧ!.<ج'Z>˦3ynsΚ(H@]uRq xZD"UqRelsPRZHVf⏽ڃRYC{v :@-f4XezDZ($D1wb ԉ bGpWnlPJZm\10s<.Xf e\ǖ8*;7UEn\U였3Gasdpe`Cu#1=_f~Ǎ a NJZ/he79c9{R%w%w_>c}(?j , \]8[bKf[m P3R 3PW7],E8LTK?NW6]1wڑ"W2 Lc񒜺#prH]$^zbTБ9@XjdX*Qmhg<&-R#}u" p|a`$W;G.mbe-ϸ)/B\ ;% y7c+W=͘]a+x!"~ٌ; PlCXbN2 N ۴2>]y3lkS6 Q!kݸ=tӬ.dRYQ!ɵ*܎eُ9Uu̚(8LY).W}PiVSffޠ|k_amLfY b= 'DϾˍem -vЖ[C%&9 l)dsH q$<2y4~ ΥIfy(Blz80Ӫ;SIRYnbI6ѳyf.J""%\3(4}Yzk A!^*dL/\2:ZCj< s @*Rz,|4Ɇ `(ai1YXELs1J?eu4oY;1KZ?5Wr)h?FqV|r#M!=Fc[*􌡹ɶgl6!lS@QJ,B9]&ᘲ J!{9X1A]q|S]hh Z2~9=>+t8u$Wageúrp:͞*rf2S)a[җ-G'jⱙCVX8KWJo t3YT1jix/4Q\"F2CiÎO B#&UMQ|9#%qMS|BHьs{cζ>~byP  ƅҚ Tr{V6fX@3\s=MY̾[d,b<( *?+~ytk=Ibo @gD+:gbA9Z(^Ql)gWycjGce V3 "L!kcDPu{H:1Еb}G<S@+uARFv_= 9NҺ!k<̅r0CMV3\%żzϒ+Ş;l(6$G׺#(ݑs %IhRN4~u4`k H<%Cs{ : VEQK!+,_cd]|./P?oAIHbxwdǥTe4OK'[J8`i3x*^@$>9d0'_F5k 1͏c'/\jqX@\; I'bUllPEM5Ӽԇꎘz*?-.Cb 3SUUbGoQwBLEn_GɊzk)v!rACPޑzSar#?eA~Vfu= ؘŊc fF{> 蟰z_@l!v*a gd[C^RBGrN$#PHA0mp7ik/cjXك+1pzai!n:͋X,nĆL߁ہ&} y4 Rd3}TW/أxͤ_i5Qh-_١$:qgYȍg'vB\NV`zÄXb$RE>6Nsa6@fg2F:mA5M>~)Zdٳ~ Bc[V~Ix$4}{Ja5 ː2RcgO!/f4pɱjGx פB4~c4r4(Ǭۏ}[[AR97y'XhbԢGUO+j~(Q[1k!tU_cF&NE$ȗl|fؙ{fu_Cx8IjV>L͚Uh<~',!/* dCKCVb&0S3+@_0ۀȟNgUDu%DeVq7sPSyF$Y}o95fU1dejeE: NB4WqgZuﷁ,Q"&Տk$_`-JC#@)K#s#ݵ-\(8` $t*qݧP,NPCI-h !?}Ya7endstream endobj 38 0 obj 7381 endobj 44 0 obj <> stream x]ے7rX+up-`# ɖW{C]?N EF`g]=B=U&2O^uW+K݃Oٮ^`U>+.J{Ń2vʻ+_{<̺.~_&>UXsxV>=?bԺIu3h߾;`wϛz;--OZx: 3WV պ8ʫ?xR0<oq{<Jqj1v] Fa[kQ[HoB~g-lNjΞRvjEڵ Kz{xw[IJ(xϸBJVQr? U*lZibV,ZË8VaJg Zx\?†(SxǾgvu]"M-/Ui>A]C#ʏT۲I8! +_mݪ+D;NJ$a,A) N\@pnYE:|O }8PN0 s\an(wSe$ 4G =Yw\S$|V9 R_7eJC JjCq}dYȃY0t<|©li+}WW/=^UL`$%=jN'A2-w<Ut'9e3S*Y2We3QntuԂ`򀑯⨈MoϾgAeiE{ML#'"ggѶpIy^rcxڼIļvŗO]I@UxfP?e᳠9`qÂ"+*쵦/×1EO4 t2r8U,>aX'yRΜ+y#}BޓYD֠(xI$Lƿ+|k(*Y}"^Эf:KBc*OJtQzh:*=aSN(hRs4^l[u|Aղ5hQyNN. .zt-'rR[aR٤%w$ܲ ϛ kAl4V$"2hHFЪ ["QJrSDy)(U~*L??K#L7TZMA ?D$ܯ`P w d%a}e3rzB'ΑIh9ɔΡۢ&E=>`WfRvha-\z%0iEUX"}AJQbQPwIA K `m `xp._M 0u^ٗoc[=2iUӂdx晈@,=#HـNz+Зtp-lXcXN P@mgut4RO3\h #NHg2~- ]߳*X{V+yHu凱lfe`Nj$,ԼcV&ē7%dpK8LHƾU[M݄`B(R9vp0,D߶ֶ!WZ!vHԛe cS~]&]BUr{.ux^?nLڏp5D:CE%gL Gm}bV!H [cݝu];k!? HnUh#zi)P 6[}I.jk{` slG?ۃ j"1Wr+yl.Wi) 2y'ooŅ:G=R! 1GdgծMT'\fk&uZTK `nܶsXlػٞq,rMdyv[}WٷEQ\EXZELEp*Ui* hx,#hNmo#BT/cfH}0R£2{xid QxqP]a. Ϣ Ʀ?G01yP1~pJ4܄ |򁋾w8y8#dq Ŕ匒zԸA%(ÏuK064E^sܒ\)g+\EX7f7LU-Ń v M#cGYӒD=&lք%ύS'BS'5䭤ie0ٛ; 3CE>oG ݺj ęyre'JtJ!J)p7^WS;@z}UΩn5:ت((# Y.fT0L _YŒA%A<CĉHfn)݈J5BTJ]MiM8MG#=Jf+f}p lFСgx(O !H+19\I[KU&*Nz%q ;8 =ND"[}`8|Yvpđ'v Fј"a&A@[V}=f=RjQ73C#'CH<>qԹP`݅ o#ݞ62ul`~eŔq>g|7+/}P)rMe d6wGvbOɸ2M )^5矉 G2mZrmc3+%#INb;{ 7D1"xK ꤝ^<'_OG mE)@kT[#ea<:#F3pnkɼnm" (Y3}:w9k\W~!iH+~E3wjlO!1GjTM5Ǿ Dܑʼng+ǣDNHMC>WBL3K\$o#C̫_g]QT@ <O❶fɻX3Dk)/Zez6d%G,D27{)%-FLy"{܌u#wK%5ϒYܑaX9bLbbփׇً ͗6o?޲{m`3zh S~Sc^'q1v-Gΐ*K8)\!A'S\ZۺE5S!jݖ^rjBt=vm'6vѪWёNᗷ7plg~E,٨2-̻z6uWXIK NAHLwygCNiwi指;I4ZlĿ' AoS4aKN8&.»V o$:iP&PwXS*ڮ3ۑs ׎+r"x{.3<5nf&qߏZי!z`ji㹈bx'ω-:W֪ A]RBr8Y{[1^;p9{#cwmp"$TOcYW#TTl#) xjwS$'(E^(Ll-JbTЊ̦*Na$'&1<9\\%zD ŢȤo#\$1QKygwiB%Z3 \φ8\>OgEFFGʾ#=9yDŽs(I+E}a4p&׏w0򫴓f|A7Y-ct pC\+l~#mK&2j+4 A2nlQ;mvQz, e!׋_c'ۃbvM`bm ; wc rHְx^j|[!61fe@4 #(]>yxf/._+@(:mh&0V ۼ@| Daܭ4OIdaCaCqW!}:1* =mKUA0=DY);sxukDrP+!:I `ybgw%]` xQ~ o#ɞ!V pX⧤|lxjsG@>L9qD!H% K GCoAxV7$^ZC]Ș?з.&Ѻ:n9snpH!A.=[KPm_,h|0lUBiN?:2NGNeRtJ, ^rorys* $ׅ'$Eh^|@I-l"M֒b;I/it%kַ{!Ӕ"N}D XY@&TvhsF9J$5yvf,AfMptr$3( s]mղrצnpȦsȾkE0A aOxJRgw^% G{: ^r.-N($N&rT"Q*ZLrh #\=0#1-tBGM m }1EHS!+y=Ztw6q)3Es"vׅ0ѺHW$-/Rj^@VD09ăH*ġ~ۺ׉.ќ}!*=ztxRIlbYLXePS[L:Ij%)Kξ!"Q,LIoòݘGcpðA"8:ΦZxY}SilV[T7Sެ06ȬKEXᦊc Fn`D.}Pϴ,g!󠏔 *?ZN;5`ʎP閃'0|`˒Xn5uz0&mCBEFh3]Qo3dգbϪ% ?Ig+2,͜ hjCľJP5ѿ4.+Jif٪!48ZK]r()z, ?#sZ]%(=z}-GOaQ~a?n,lre1u좌B=W(qm)ֆ́ Ŋ!0W $s‰mIc@"V#?[v8Dǝ6U-Ώ:]kƂҍiJV3㈍yk4@]Q8_xC~j~ia 65BSRo9\E"Ȓh({v>rh7Kc%D7IMTJ>-P=30SWj5vV N.)57kҜ _J/YDcfJя [&q$Ju1^,Aղڟ7j)†C7VT"nY2aXLԨ|Ũr:ꛚroԳ zC8S(l%ƼVjPGe#"cڽD?I?:/ɍ~~HMo<_A܉i0hEΩ"?\%>=c Y OƵ.&"IJQ_C2Q%~ 8\O}U`"brHN^)6cA.'ku4zL$ceulLB$+{/՘nnZ~e*dvTU8~Βŵ APYyp 4)wg/e7iܿ;_\^(sNj/y A|{p LdsU86rt$ [ܻ[0*_3%LAr?츁>P3c28;r N~\p\ RҷqwIɬ_2TwMNzK2 ;r05QU\Ex82݋/ow}^U(Y} I-eE:[/EW5)R{c~!WQ)+3{/0p#&v8a Sc2RV]zበ#V3iWH,; wai>0\(ïŀay@sn- V{āO!NL+oʂlK@ϖ%*ܙa(5Dni6P *f|vv[jе]Y l} ZeN9#vIEY9@TzR6lEW:ݥN_.|칎Xĕg +:hpΉ"ZRO誻6HЬ+Dt ͟ae:6(ދ:ՀQ^y+IYny??|'^endstream endobj 45 0 obj 7011 endobj 52 0 obj <> stream x\ɒq5BT%SdQ!Ҍԡn,3=17U k!-+22ϗ/E\'_]|d{'"5(=(E|d]JܓNvOZ{Z_vr!,k#7Ynwfw?Z պՔi*{Wue^HV{Y:o?1Rզ{0k!Qu^2qa#NL}Ћwľ"jYaq2j ʹ4CM~? !hYH CRYgr[~ة[Wm$kx%]^.J_w{sVMkѽV뼖"t M͓O :cWy/Vfk#0f]#lݬ8+ ǮD!uUU.DDq\JTԏW•v*Sv `'>K4 ݔTwhpވUDFol0d4Y*fD]Tzx Wi7e[4㥤"iFq7^l.Đ!Yj4,5]0jBo+s%YHfDi2D'PMoF1':k3f~l-3x `%~5K2As!wxyG'2DނE=<:5fJPHzh0A yC T"!e=D{zW !!D26yn*R@pP!יr) -"zRw֓yBMmck$YFG 048 2M< {YzUnonG>2F.X6P ؃,1kҌ1Js&4nɴjjd\ݭc"N|G(k,!4Ф+r kmwy ΄eucq^ ]v;%m?TWLiwh &VdYgW'UzMlY]~(R{]]GLhhB:* Ւdi7X%WFQ 8 "_Ī6=`,C i`^x0p3 t$0$W!XnXKBŵFpQWwgT Hs-=Bb\!j7HQ昜$a[!zeI3-jհv6.8ELeBI5\JWu1Jf1{z(#+aHqH" ġD J/WG$d-^u] !>AEcG)8M}t4x;j a kE3znGt&ZG|H|n {i[ZRH2&q4T_Ddڦ=1oJ>G#rji^)}O;n؜c[kLTt(M : t|u)ǦXId$ocI#l9IP.mo"ǘe^̜I^hHԒH`bao' 3SH6BVmIhx;$,<jn^O1dNz6  M'M#?$8)h/;i?rAVyd7;C&w~`,A @z2z@fHHGK ETE;r)xʥȯ$qN@nM {vd X9^})~&4=fzJq<3) Ioe&%ei0X߻No&H Aj$\Q_e6?tVȷVVͰh *_If{L.,C'B% EXVK.'| LfdZᇌeS6*oW[vgR"@e]S0sdL6;cdM+IJ 菅ggQ`˄]EY0aǛ/1e7ǚ5knuH׈/Z1"](N.W?\2a/WIp h^ WT񃝮MKun.'Kۛa׫nY_԰Q!o[(ǝGҖ!Bk;) @ ir>~˓*s$PqvTWIy46}-46o`bm{RZSu8(*0ćk ts VB{d?1kH՝G4zȄuH.QۡfQ½rcS]9k!"&VGk;iC\R+֓ZAƓR{B}/{PA[;j F[X'"~*j(,}o-D9_G<ꡂg.ѷr=U<UK:cMbVy0._ @mrԈyuTf>#CSʠqLN^Nݎ4d<FbFpNcٿ PAcC*{.C&#% 84ޑɎ]iLϫ!% dcKh!mx"%Iw"ӓns_9̎MN޿)$ph]c"j u4`6R ]&p EGrClJxn0+AU`/!Y%rWNPmY/5Wywx{Nj<)"LD/<:ogQ}Hy{}|۠'7ǚ]|蝇v C@O=ыci{\RWY( Frf{]`q8r;77u;ߙSHngeB(}>fN߯*Q8ff}y 18n>.{v@Tjd[r L 'w _}S19u?(OI7lsDs{!SKC1xV1Q"Jp)INrױ6z>qӏqQbN!I>P)@bDȞ#&=VD|JޏپyeNH(?b@ TU{*wz>ʗ<#B-1{{ +'b5 tZȧ4 ԙ!ɨ$1F6aQTp[K%mpJ4oP|I,&|Grh xf''QJ k/^}J8~T6~ |Zbp'H?=+NJ=T%=|A21Ih?2!*9ׄ=L¬Zr?Vw*|)^^,Qgv\ rVQuVʹUTnx8aAa1%3,nt,IƓ.1B#P~ _y *[,֤aP!獬տ%0 O]=D}1B]> ]b<]n'ȴ"BJ%aWxR+D/`[@ 4@]w.wӥw'9:K1q YҗvKLTZ2e} Ox|{([Ne'Y;g|v`TRTsX%Y1'pʊsWR6°?? XV$XZdj7bA,O+V}jAE+VkQ6gZ{'P>|HC<S?[endstream endobj 53 0 obj 5287 endobj 57 0 obj <> stream xܽMv%4_Qsb;3wF'^vs=@GGV{'qq|G~|H(||7 M|o>5{Ou\kW?-Z_{jԾo+kO߾O<_iZ@{/_?}HI#~Wn_3yHS_3ׯ4?멟?yʼfvԵ50ׯ7G5 bp?nq} =LINUp|-7s2z(b7s0E ̟veFGBwWx13.^U|V~5L Pis{v9tVK8x缙wu'ޘTg}6ȬQ]P`$"{=0_VWKaܾZJm$y##1IkZڏTz[$TęH OnHO9њ-Wc_(0XR i~@YAxjFeE"N-2PolK^zNCHhG! %Pf>6깧IiSԳw;{_k)fsԴk7ݓ:0VK^6uQCj뼖cK$UcYp:S),Ow|z,ܢ9q\_x]T,؍C-M9[fb}UlrYJI`h=bZ#0 .Qk:q+,~r303)T`vKvy!r^ud+JeҒ/+qh)uqf 3'YGCQХ]:o `M)J9QHl8e> ջGlW*:8ˇy]E8gD5N6"U ݫ ]+ *'ѽELfwA|]EcLd25>2ٯq"Rcf0weua% ya ƫXln?ΓA.v2fm~'#NfaUEI7222_+A~hPnjLlƒNX'лB^0 N7ZKd_+X$y"6SX m+U4{&O-`7=Da ~׍dx:L{-_nX45{[rOz2Wl+gYpy̋PWYmKAツXW7W" (j*Gf6sf o`[,1IYzB6`]1o0$ٸA}_dRqL'`^` S%:V@Zu7s}uΛ94)mVڂě9tΞ\sfBXW7sybi_ӕ<*"sְ|l]5m.S}ʲk.勼 n5&X/"=3R `[Ki[yL`u<> Bu| :-_ƕbdx#buK+}[Ƌԥ<8F0XRPB6CPN t(]j]~,}| `DPq&-Yb/:)jrڱa)[6}U]= X|D*~3X/U|`Z֘XcKV7 zYo錃U[Z .ܸYXd^U}~?X~g4:δ61XN  KXop#U7[R6NO% B0˄Y0Ⱦx(4%%ٸbewݞ{DU¢QmJTLƎ-hfDWCf<:_=<`˖QUIW1X{Ĩ"(-+al[F盥ö-Ӂan5jF NϜw_(#sa cRiAٳMU6#`cNF0"vVS*!v峵*]Q@шUƅŠA=䑲) b^ƈgCik53L*ĄnߺO77"m]0oPr*N{/fD ߚeҸ öx.EƐI"};϶Eju bnW;;3'|fz9"Q9i/EjN/+MO[=^2d "B7q]>_,{x Rc?2,4+To0{3wv2vryc(&11^/rcbLƤ/bNVW1%$Pz օOg$`xܬi`T[e %rKUJT > |䘓$ GKob0}zaAMer^\n{4KGE$nzeVXQ+v8Wx.6n%o} I~ Ε3CO eV xBp=T?jDCQIfPʨ Uŋ_@uR1M&Ͳ '?.ea5R+jN6~VRY:Jge2~ϓݵ:/JFdOvfV%قeÒQU%ؓ'] A&#b+ Zӹ\ih ~[EӮQy.|Dƍ: 81D[303KHLciE6<21Ȇh]'X*80I{q?@t3Ami3&,"*S9+Jrqx#$gcwUxW(geE eH|dMt0@@c "Hj H p K195ew)9>#~4˙-[AFZhKCUnE$6r_FlM'cjKbd|/o*BVSo* k!2%1QȠxmҒL7\T{[9U12CȑUtLC[(X.3-1%}ʖI+"6ZKD4`f5O`u.73`$qg?f ڀ,K e WT񩃱p1yu[ʈ8iTa̅->ײs+17 B#߼g sk_`3O(R~t=Jbau؟C+rtK{Ɲ2ƔGa(0*>̖D]V/sofr><%{LWfv(}ڗ]c]ǖ֙rE'Ui 3=gYgW2Z+X2IZ֨o_}~J#D"!({O}bTk_h$CCWnl5+X$Y52Ho&Zoqc?=ri!(|9|<#Eu1V,n,+@m Q$t[2_2$IҥC,bϹsFŢO OK߱07hy쯠6nl3wˊʪi ,bS,9;oPWq0ody qd`h$>h%k9I})Uwݩ}HHҊ&fHZR;9v/~a \ Q,.E+9]iɇQNwcwWjJY($hKOGV@ji|j0 HLA_pBA!6bid {ux3}UQ*06\Is٪ c˰"."9W73VB"ƩdE)j!Eh] !A^b0aaj{(MKَ@s!"{?J af%{9E Vqy$qjiav6~EsAmItZ~twu.lb|_5EFa[ŭ(?CXrگLz4q {z  QOI/N7 $(s&z4)3@Y`ۤxMfEb=Ɗr␝o>*^ Fq/N-c+w@~`jt>EDEo[\ZKNY5{\VЎ}p/ZW4Lf&=1% LrFa֫.w[U\Lgf8F'x3Zzwr-Jd=WcIܴ>h W}b\mk<$ީ* 12yE,o&s2#_|śٿh9%ܒ (EC#\cEU%w`kA80Zb UTckϿB4_fW,rո/.j; i6V/M:jj %s^ۚ{=]B/P'bWQ([(0QҚ:cJ*e.F 74gݚYch$q@FW<DS*PBA2hmiq`J-Zv]q3OteBZS\G z8-lӀsU^d#ZSb_upkPN("MJZFUy0ns :_~,y a3G$N$PŘ-JB\ၖlK;a~UX˯^j;=-TGIs%2²<"!16? ޿Y1t?ϗ*cESK3ȆMMd$6tfX$OL(zÌ#.zbn|tOɆ*Vh';oo&د"B)FmY w|כ9xTw-4t 6%{vHg.mjPzQ7spC C؇=j[| 1+uY_d -!rv G Lx О(cPB%czL_6ٵ> 9^2> 8p1sm<_*ΑfEh%$vEv.O dB61ϙA mR2Τ43!zOoK~r#Za7HIK]֤VU>{T"*ی}.HNiu0h~s/>aϦEbM&z`mĩre 1jSB?(">1c ⛹^\?ՏpX-$eYS.wph4B#(SU0~Fℂ~?{bYy n7s2#FFm׈s=3un3ِP#`4@8Lfu[GKqEgp}cG`PuBYwX19ztxs0;B17,b\Ay9V/i iK3Nad*OgP1l XϊFZyۚ |$9MXϪX`Q7WVWeb%ȈY3f{R؇58~"b 'P3vq@άaƠ u %pH[z3/ܧ E!;:I#Fb0 SU*5e`q@0Au 0^)&PBSޠvE!Fλ"^%Lf{Kl&uka=<@6O3 ,9kI Cy^jFZؼ">hjԡW$u7 YbBP׮0q4rV0䛭f,9QL8 C֛9؋g~CL3ޢ";3i'̋ljɎY>! Z"=,}* X3T[Q!+#^`vAcepsM ;Vێ"0܎EZq):!ҌETd?]>֡x72ժgk3`mjzuA 5H kf=f P1iĴ4R1P_f4IF\{1Gh'JJSuٔtU!oǿR%wXb#Qտr3ÿr u'^j_f*"׫ě XuXSJB=JJ'y10TgPS9R_-f>b*d^^ā\r$<$+2Εչr3*JAXF#;ΊR \+RL\mR*y$J$&p!65Z=-N "'yp92{BTd/:Fb3}.au2wnp/8u3x? ͅa: vlٯLȗo2؝t̠~Ũ {yn&pLB/_ONdC!ܟ<==qp(A`xZ̠H.D߬ZmS Z[de~=EZGfe4Te“'g)ww}>StMj Iiw&1ܫibcFcZ%I¸I;Ԓ<<sJX2KFn!,9~`X؄N")9DL,aZyD_7pWfldgAZs9ZOY0aZU5s bt Z"ڤskXWJ7D LBFMˬC5WwPw(rդTpSr3  Tq@Mx1UMT\fLyF{t>`|Zyt+`諲V=}ܘjiRΣ]tOhUqg/-{c=1Iy腇YujCkki0\bM.< wi\lNMeZ+@^|S[|̭OT\ \v -YG #S+}- 98o(w`qJފEG"j}u ŷ.Fa"s}3X#djc-髪6a9Ǚ`1`?`p+t4{ŵUJHOZɰ9؍ٸP'q-g:su6=>GH9X?nc Ê.6^:1/v'F?Ct. Da;O8+Qս \" ʠ6 G uΌ<*w. 7"SA ߐs9@"`|fW]fYӷ#R]#bRrjSs^Ѿ@-ΣMuP_&n1m_NU%}]k(TFo.G ^U{nf@zk3$rN?# ƆTW.-QUoК9ոr9e|?&F,] %z{Tu^?rLNrVt >:FTALbb:M4 7nX^abjUp1mM'zӦfc~AS x(GLC96x=O)j)+DPjaӆwORFfG)}37PLKyy"tٝ(iPl}Oa܃{gz .x.;Kjb Ӓ,KKdݗ'/gjVPxfxS[­βMB k={ƴ4.y{IG3q,n%Ml=pD6d3"€o8z&*%7jaTr֪)KV4EID+REitHjl,mp7s/饶Kl,gBVEΛ0\32z-wˉU4qUQ)w/ XN+|3oޓmV qX]ډ-Q3S?8]m8f/#c[>|*o&`7|^R6"M Q|3ר~mí- q7-j]tkAbY=H7i%YdGF6SB׻ `/Q$\x =D_L^?)_3rЩ%靴Py@2Ni /!e=_` "HRR^r)~3w;Nlb9Rp B. 7XrTy6nrjD+ xT:ic Ln`T^%Lx&J`:>oy_|;.f.#iJk#ϳkiG^bP;<-7 b> %LNoI f|3U-lMl_L t4.fnX-ǞdQPؑ30slCOOdNgh0m!bզ7skH/SA(ȃ7s0t޲hR9)qÃHmb ,YH%d h#d)vI֛ 2XE 0L8`3b%I~mfWdN9N*kGg}t`6S.0<hQq8upxU,2.QyAIb1mcfOktb &uT`%ʯ91SoGX{7O}5%]T4:|¯p>o} jK}` fz|3L}n&`[n!&fނ^6;"T6:{`Nay5kS`o`éWPG < mf|3Un)2ٳM3C/¡MNt ebۣE )WCZ(`Y$VZf0t0fLei8;jxWMRxj%(|`9:*F=u\->B#z#ֳ-{jKhFgת:S# "SY J`xeR&#9XW,yd;A # '#{yw)ȭ6rBŌ䊑B LG8[Jg+G2KJE|5 ;Ohk$C$z!&j*|~ Iȯz3 Lx)bˁ^]35BLoPq3Fbо]biy[#.E "o@Le!Æ)fef7~vɇjw3]Ћ:.s4$9o(xt`!=Y̏ÌdL&l.D)r3 7k7cPHpKP(FS,nj SmXa8-4\m$aN`)X mn`vo(A;p'|6.ff2ɧW7O)zs &u}1BS=0$͉aS°< &gJE1R%YTג53ndYD Zӡj8K | s 8P`w dOLN781&42Lq(Q%-&ƂOo-B\LI# BnQ /<LUw9D5y<{I~0Ő3@sޫRȍ؂]z1Wi oWԉ:5ueiC/b80cϮ%fnT#H֨ۥIJBر _(3p T&T5f uw}q֘Lq3z}a(m)|dNmMݾbJ6פUWhMsk*yŸU2rEPqZk沬f%ɚ)|^xUvzlJi4x_Sl U+_J Pu/`8}&ǤWAFXΑs0fJtc-TSn<~84d$ o&WkVx"f9\1 fz3x;J*kjW8#^3B-PH23KO{$t1yGD&uKp\5|uHK&+?xmx,/ˮ`2\,_$s%`B˵yx1:]󌴽ց&gXLGx-xQ̕  wԞNSq7P;:]ά,_(XkC9 \xS0F?K΃1K_hA.}=MC vKe fx18N–c#f%?tKʶ'~S{~Qw%SS>}ޮ&F:X,M 81n&f-Q ߒDD fD-qR#unބMC빲c|P %jB- oKv$ԓK *Mzp={1?n` UĆz+:0+ RY3VQ}rcR3U{ţ喩22 & rdd9tA "u7֗FCxFd;xr1"󢯀ڊ [S-*E?n3Fq~hd( 2bnSL`Y7;4U7pf7nt)f Ld6nם,aViGSv+Uu|jas0ƨ@?3eXݽ$=1ntU3]-ʰN͙'2ɒz\1QJ)In.W~IpY ]KW]_f==_E41\uI[,(a-fp9˝m}{ p8 jDˏWrM UЊOW3C~:,&5׸WM #rsX(o"Dn}Z\7ֳS$ڛ6GP:Wtr}7%t{kԛ9ؼQܔ>ݿ\%+ e|1br]t3U6W*d5^C_*-'ɠhHK>ݩ yoq^/ѼH{㦿-?Msob ޠZl^Z՘P|aXbPB.x8E}*Y,ndslKv`vSυx30M |3@B+IL$~!MA2,aMd4muLU=~{`rKL|-LUb *f&dYBpLOgRǒi^,r%&Mr=7 ^bB턍,a@hVU$6)q]ɟcl| y )7Xg'g{e Nxb$Ԧ0q,fFKk)_ G|AR ;v.̙%@Go^Ǔ{J8(NԴ _1|ŔqSqpEYyJ8kgk.XKLILQE⸐ИJd͜*Xbtv^*Lh4!{Z`V|2>/&ɍrY50T aBƭDshzٴGt&BS](#B6LX"fo$z܇ ?닛q,<~2̘ߥifWf/"@?o<Kmtξ0,7ތc~3w#y_w& B[zY1=)%IZ7Mt\pW+K+я'GէJu[$MiȦ$G Ʊ4r'/`Yg$M,r-_UxE騛));?Kt `Qo ̤f` NN$lٝXz}џ?zGȓ ђ<-9>X29;a J{$n7,TUVXl{5tCYQo5q"wȦE(K"UJSifBUPJ+G)c;Bucב \w/>{h\L/H[y"III\r,Qqr؁EϗEfv,F@珥?Ap07R;QK4'J>f:$;F0eHbtr3-s3EBfe 9Ŷ>tfhhnie$BTFT?0kr\#s]3Lb]M`--`q,_1+<*En A^m R7j-LKBV {،7l#9PJ&ȳRF&; LW0x29z7ez#yWӸV_,X3E3 =AG=JZj&׼EK  ,swnJwJGW?f}BT$8jd~I )$\+tyMz3wyMnjh.;êq9* @-hP]< LZ&I彐y"̕$aE’:꺙籌Jplj=ZpQ䫲` "kZ"?[$9;PsygoFa㌈iX`阣B q)/:$ްHS98|&}+J3LME _)f^S b F;ZWjX7ݠ<1")JdSWML%GD#赈ئX~Sb+YLpU‡Ѥ"/X؞+CP n "q،ddv {Jy Jjbb.ֱ碷嚪Cȸ!69%ė'<#3Hs 0%`ĸUF;aIzajGJrIRSyPu\MV}Ap`ȅ/ {6[OOLxa){6nndUx'e.[׳_d5q2N ɋAU@0I#: WG!Q1HpFg8c }aj0oHFt]tŧwIpZTK9B%[d3/&`o7cTo&ଁ&*9cJAcS'oe´eEWTGM>@)a4_윺8jxϐ)H_:0qYV1>.ez1E5-#uH{:%;ܲBHGxhָOUO|͠ymMTKtSK|S+S23ͼGW 6߼cSaH"ܮ1m]q%ިk5k ܪqFԜjth>?3ϭURA9. ݨtO}nU9|Wr%aQG}~Z,aڵzkLndxpi*QuEMP||L:%֢~WgK+q~3{񋰗X{0L*1~3ժ[MLYG|kGUUh|c5xl*!#zoW,1(wa!#_`EDʼnAC~~*i^%/n„? 5o*:~"{OpViW^F847Ð#eePcmeXo9%x1e+7''4\ݚ)ʺf )ZCs=Jj2TI-Jn/ZҦ Ajw{ؼ Dpғ@Ƈ9};Oܗh ݓx@Mgr"];&01|3w-%ɫ#1^GҊy T]C$Ka{ T~a6P<|iUMfB|7@j6Pbb ^JgUM(QZ T$F5mh9C|fzPz\(iFahۘʝKGu TUj%qWh]-jb6l%!] VttVZ`Ly!4hzĺwHn-@v7VM&ahSnW &4bjBXEhO!M"4?s1s?ֽKy F5'1㐛?)ݺI8s|iHgtdL[GHVV#ø'Uys151-x0:Y500b7L!<.I\w\:7@{*ڦ}>{ץuޒdXzɋ9XPJMgNp07.l iQrP;pNցL}=`i ʎwAe7@U>"0]j*υUWu8fUVYwNS, ?O͠p3Ћ6Q[6e86Ќm;0D;\'cD cwN6M֘gd/!Rc?"L$ fQ<wHhͱRvhl~}ҋ+//{gDp~:affN[thXLWvK Twy3/\ ƣfKrO/i3IvЛBu\YzL4}`QBoƱҌ%ӽDR܊_dXgUJvyԟWvfɁҭ *U(`Η97:KH#LB"Sq5ΊnXoF/2Cqw7,qՈvQSjuSI.kߌj<@t4NIߧ٤UL:q^EH O^LI/fnU#i`{^ fVfpXWaRYo ,mFD>q!c5āt i*OpTjɓn&`/Qu#K2q2 Ff^v ܽ̉ ~>1_IZgɩCSTc_ ƷsisJKw8_aO|׃J:_>7A u1Պ 5!A %d$(J'"b ɦb_OÅ{G~@:z3jfj+WQXJcrq9Ɋ-_&(|`@3sJ--_el*b*6<.&`S2L0ŷWϽ3kHSKdd>XٚXɍ0אC 5io&`o7S/&L ,Ft:!s9WJs%2urA}Zԅ7s;."gZjFqfنakp)g< Yrם N:;[rcs>|8ׯ{ذoORW& ɒt7N1mb4k86@`;X-'>'a3~h/aAH'i|.<xrA XaNAnr>lqz }3~XwV~@\o,AKVT_fiJ34635LK쑦"63}{;A | C{{B2=ou}K3{5Hw 4#/iPlya%0=@8aI7s*bLmiJB ,&3%R (͒!3zNǾOz3g߷wU'LK1En,[,n{[LjqnoֹUg}a244ھZb.cOf8,)#ṃl ȩoט#TJ,!x'yǚ6hRG5=asz3wSɯKMAw1}p'OWwJ;l/5I:W~?y3w-іL pUL~z@cI\/g9`  xd񁋞}S7xW㞰^*o9:CUG*@-n&`o7q:]'A+s8? -|_5 ;i8b+?'AAX0zؖ,yCI, KdyXy7C1(hƩz =fK@<`'?G!2.:G2=Vhduin!*G(DS6 vGBC(it`$D(ZlYPC-=16?b씐XPzWrvyy"`= q8%qzW;%֣KF[iG!n\UgN~PEOQ,Z%fSzTBG!n d:~rT%Kͼ n;Ay33rO5䵩s^>v^O}3{nFng9rĽ?-I!qBY豸bl8ya"|ΏY?sʶ,wPAYPxw{ɒ|:EEy7spGX~0"q^_aEoV3N"T3o}AyOEY984Ë K{3?tFڒf%[el eģ!RD\b ]fK$mIpq]^DƁw7J_ixA xKT!Rqf᐀~xB=ђȒ{Xbş /ǽ?ƿvQB}V̫SD܀+n4G<NPSe\HfkLG`!v/!+,v3{՛C19oƱoL@gCz+s^ԝYtGd8>6ad<'u*Ȫܡ dueWLY ;R,Kz 6Cň z!+^g_&˹.`s,.K2NpXbGPVYҘ7=0f(e8frvF;̠my?fTz1A2ěeWE|h/$!=ir 'a| CjH /|Fs %N0\|6m'Y=82P_,Z_M$-EEpK }8Zl]y=|'Fz(*梋m.&핑 H1\O'Gn*̀勸esWqg+S>F'BSyr7f991gX] &~γgIl]vTR; ,fIH/3by8-Rx-9γa"Nv鞦{6'H>K' GSTz䍊a'PG/ѿN:> /O}hC9Xp|ߨBaY8жeo&ayD2Xߝ!G7sw n&NT)q $sP)0n1@(ѐS\.CYr) xfpQ~[,f^x/.SpbnE>N%(=׵[q:ؤ?:hMjx# aL),|"VόWX…ꥤ;LؠdKHL9EoK/nBCcWr† FJ\yf(A? MJEɾ8(p) :ΞP:+ՉD;+:*ʼnneWs5YKjV[6;0$CYWъ_8Df tvt]:bT:x0Qsڊf< B!?IZ0,eF@#Ww`ŵUԞ 1gjA&)ɭy(IWzˮ5.S(ߧSΡ\ >'El3ZIǎigT[e6r5_{J!0.oST#7s+G8T8ċtJf [P36)?%ӉD|Pʪߌ&vbzE%S$E|(pb gvRΚ*gIefrU f{Lѕ-]8zx"w3|y؞9^e^x!eUIVUiRv׿7 A^,|jQ \F ^vD}ʘkԙ4P /?ݬ@`U7J$YsZ|k;fŬ~5#=S*Є}L8J;,+t2T"D)êoN+Eo0$w0+10xndnf TM%2Gʖ E!X„;p# "!@ C|G>^OR:xl^I0ȈF -X)*=9} bk)G%k`8`N\(1j1.O*bDسy`:'xz̓wcCEj)xRbϟ z0jQ+v7 hP4? 5G#OYoļ)*RnFttE.H`G~ )_q~MMBɪ"\c-w[P*H ldf"*?Ï\ْ7(, FL0u-؋^DOf`R]E>*Tl!7-j)h`g̀ ~M8Iμd7. vв3qK9ms86:9zKdDaFiA L-ΉU3% :7Ѷ(l57(|InOf&g`8@S 7jNT0Tq h Qٯnઓ5c$Ԏ"& Y0D(?,CbL#|qJ5YZIdӢ_QrbdZ`P\Y݄^Lي !Dv3rbBȶ? ZxH:Ԃ0=,=|>O)hC v8NSS ΊpK ʅc.vr,ٌiyoJcdyQgdOQQS wG_0 \X`M4MWQ>XN&rB!9Fbr'l<1a᧛3[0m$e9[0_Qү(re&1x' ƲfϠഋ8&X0(o_=&Vq{{ߨUdǂ1 \ْ$,,Yt{< O| W%jQ!lm]wsNjxDkW36RtFZ0( EHag#)P(NYc$*ԍ ] #mQQt+9J 9tVRLjǭjKV!0E4F`bҭ$F+z;e>; NKoeݭvB*Q9A$ΉGNS b?K/”B`?Ԙdi.+mOPUpZ0V`P-Ō1EU W i VʂzK8.YX+B-GU`<pD.%J:QpJS+H@xuRmXM /pw.-nR~~|*ѽ` "iO PE?0BY<%#(0 P>Ϟ;Uak6i)B0Qa# 09c[FKm?pʣ(LBF)60^3QnzQ e7EG{R+#AL煟(JES>n;1 31i؏ (s1c4H"#)v:z3kO7+Ɲ m1c L+Yi-߱J ̓^Mgv$ɱkvJKT}(`\Rs[մܖ31U3Ɲ81 1=1Q fdS8ek\1nDQ2fRdm*0Y$ܩ-Y*n|/d8 `:9݄0\1`GOS1!pz"+fc ƕɇ &L8c\vc$iEDYkB(wH'5JYS%$tTNS'M4G$(@-isETQڔ' >,RdԔ|oeR܎ +_ >`HHE͘瞆ih9Z ItљtreA,ۓqZVju?mfhW9:[arJ>Άϋȁr;N< ڢ' 0.ڙf2DMkv~AbE")uwuq ˽dr9M-fE]Li1+gPdL`Ł~΃p9ĸ "Z yP?= <ĥK:^mJu9eɛB_5 Sb{vC Դ\Qe4hiqpO'H\ fsu [Z@\yװG nɜDēz!#L"G9IFHkrNM?-IWcF R}7 "jijp # Ձ`&1 `;G 3`%޶8 jjx&kg> fA0f 6-fBF;vݏ=c4Z2?5c=pFTRLN#v(|N]}64J\+y3w(+iq \1~,giQJXYw*7D,54 (92cZXsbȵ7U ^΀(IഷMuˢ蓎34 ӊ]jͩBh_b0O9^Rz$rN_0gƸJ]&` ,"IjLcv=c" X)P7pp'x{ e+L}Gu.?0qY%k >0PV9^c_*;*1#OQL bdd̀c/A2c!؞zA0p~rƬ;FrvVV 4ހpꔞ4ȞD(aqo[Y>''5t"FjŒUΐ#J"wZ*k%ef̺|# :xt+ 6"O RX R2-|$1oH f텞ᓔĈ!XbuVA`Pp߫O0l2S|2 VU 괘3€x+q% C iZ<ެ3gj&Ok%;҂0f=,[K;ga1['IHP%S7`UY&(a$9rHi$R,?%7k`ѦD W frѺ>\`A'3Pr"ePQ҃GAq)bAt0G@n?C JbV ۉc*R4 9co[AZe!ɠԈC© :%:!У0$ly9i`Ef#N x4\o9G[T6ټ0c ֌Y+h`"~=6'|<=0]|K9QX[pN!R(/zAXRyNVzjBuVFq'z4Q38D)g[2Q/NNX0{= 'k CSzn7D2 BZX͊Oz#z/#tn@wcUa<Xe0\A_ .iQi)A*Θz>ެy1y})3U.(qzk m$R S7Pܛ+ [N3r6 *p@ یрk%u(%̵^!=J538de'N$-I7ӍqcaNHOt X Lm8j0B97@Ff D6PG?C T)S |tZ67Sw@7Q9T D-pǶf-m1Xܜt,N?Lg\GWtQhOxJutLi,0ɉkA2ݰ&U9)pVȔԀ̈E㛇 L7Ij$89Z=MmZ)ԃ9~r+M:z`]'&)Z$L aQ/ 880+*#%OMn E9F*73- .vŴ'l{cZp7j-OŽ5a^` @K748΂Zؤc<f efksi=(@ D-8c7h+f.Y%lt ˆ3Ă$'/,pCn)Ce E\Q$V@NsazB1rOpv8)="Sh\ٝz 8]2K|x ^x2K&KMT);xBb,|O }VIBIdxZ(DafZLGX+Rk1AQp3FnC>ѴQe b0'"S@fb{TP·(P*\UDa-S\ sH"ڰhAM 2ȁhMB1V46ŤP+p"9=RE>FQL8, "96Z$1SǩxUGy:R44At0M3b'' ]lW0JҊ@<tb)\JEȕ˃J gwty6)KNEwd2_\]X[d.͏iUɓ1'sb\*bS~70tOHES\=XNl@:M= C\j6mө[৛ լ |f+_!"#'_vy<$Q/2cS$dSPȵ—f2b7o%Hv ="CiQ jVn^M:`A^} 7N[qN]@VLAVިB= ]D!?ώi-:,nwCN뮳6mH38+-tktBLhr̂ ~~!J ZIֆIEbMeW#h ZL&"d @L5<`bdue{]GB9ŖpG@?+vF MSTJn dz3fe[`Ar!q8\$;\R"12k, ,(Z}# bL=gO=q8nO}0INVJ /Ǜ:Yk7ۿw_[:A9~q[qF __׻|O;JC/r ΥP@=λwor:ҝMFRw#l=Io:37%pi|؟)UJ/ꋾJl>Q(qc@#>e*v|߼?߼oȅ݈m澾CBկ M o>R7ǁ4zT{>rZr&{GIoƟ ׻o/{u%٭1`felގPh;k&]lxb8? bV=vNGC~3W dIey7:DGdCyO8^0?[G_~}۬"i i'Uv3SO,ڄw ~q 65ȩHO7iPBkK)F}^'ZBWkGw}gn>3L)?ɃzQP 8mzݞݟ%x.0S.9}<]?k'}~ܾw˱>i8)rƅJd>td"OE̓Öa,K'>gi{9(QYF#:QcY5;|!JZd'lz3f_ko,ː'T^ԲQ*u2i祈#^OC$}]Yo?{ 0 Vq! AA.r6x<4oW:o #(#qr:)(RxcXƚLJԦ:3EGq؉~/WeKKc9ϽܫkJK+w:FNq Mp" o8\x |O>\7^0V|,5NMSS)jeX9$˙b ,݄7[٫M5yauchq۬~.45}=vcH2Nv*:fs@>qbeD~ սaxj(~Te͉ψ8Udsx *ĽS79c ̮'S |BYgzU.QO|l?n7p{J:OD]IZWt|=س} |Am\OW BECW6yin!}%~fS5}:-G?$dfl9Lby<;[<;A,hdO|tDV `v:v}5]^~Ɵvܙ&U_ 'ƄeC 4x1gFQ)Z>p{6?M^3PHW-7J?ҖgfqHI֞v"oTH5MثNWݴT.ƽlrl?ؾLl[o=õ#a3BRf ̪+ϴqð&3u!z50:Iq^n}!PO\ߍiYuzw]9 NJlf!ucg`&Ń%vJ[9i4!4pۼѾt E{6I7FylEEn2wfPg^S^+Krӷ Lc _HeYzŋ0#-~a(!JkĖ_-0; _y&<*LW-US<kv;(%78MKK{{::>)ȏ@J]3͘7|>31jG]o?|;Q%+>NC)iQ cCr}O匏&&GWP#qo-`X5{nx /Aߕ̳a D 4I?%Cbߙ/BW1} τ‡z(O⼎B}jq?Ư)-Rj9:t1kUkltMxy 1!zֹ+:y]\8,keXT{w't0[gQTaJ"ŧdU*&q:1b^5e +?' > EUo+Ky2~}kd5vrVp5q mg,o|g\52HI4.ҽUފ%ɥJV0ug(o\]Ӳ97g4|cM/cى(WZkz; |E':D=dʘ vxkw'DtFΠ/M:HN~ XC42tr/?"Vsbm;G]YU_ƟMPzrdSƤ3M4St턿7ؑCruwm>jeFF}x 7MJɿ=?)m Wޡ_MqFoql]Ɍ2Ǝlzh 0^#x+l^q|txnKu/~e:)Iq͸1A7)ݤn㑜izZC)xvkf9qxNLWDޥ`E3aI]S v{c[5;fa$Ȧ-ڵ[,6sv_lW@=f!m̦$G6%¦W=ؗbU >s 3~I;BzL^sZ1r *9)\ݹNNǍ5V73^K.W%ԟ~TM[A_?k]bt[NÃ7487f Fb>Xw@iq3J1{ E)D&+'LI[qyTKA*k6UbgrKXƹ 3&E"ϊ~a,*lfUiH~y }n*E#uF3"|F)#8ހ&:Y1}50_q]HC^3Os %p/h~6si-Ί΍$K|8k{\l/|񵧫Y#(Dho,eK˽liŎ;y[ʨVmx s\gv0Uorʟq7|˒>ie G̷ZԴ<&vXow%RJ;ӗ_r:TK@Pry JoX2=g"m}׏WuL6 %Gn 1d_mNט&[Dmd~ei!Evc},6ےA\pWӳxQ|4ܒ- =naα-f~SxV$t {'?YolLKccG^~)vz/,:|vǮv{ޓ5ŎgH`"zy3O Er7` !ꝊW|x:\&3~jkقL|_~u.> stream x\mooҿ/-ކ I)M@zeCIX#ᒜܝHF[׻|3<3$}}{|ӽt*9 Fu!ro}肍~M \y?-u7^%<_\,U笏1,˕UX#{EO+3zq\[Ʈe_CjM'?xW~܏P÷A~= u8%-sh20N|wLh(>"puߢV+J_HQ}\A%`n񆊲VOǡ+ixg#X{c_-W31(a 0sq=ފ]CW#RFHAjƃ~V~Yh6Vع(P&vF`6oŜѿ045TX5Yk5u]пT ǰVWj0f>2;$7uݠC3PG5N~ Cgf_0im`ԑHՌQ#0qHZz&IB (kKYL-b-*8`tbu@s^ahf37,V+3[ a'5?e5̘H%wQX!'54jzW )iPϷ]u>2vhYY' mƢj1 dlp.7mʔK 89ܘ([&_ <|hЗ=6|>̚HɦLǮ$^-LhYK3H_ y2;Ʃwy7t6ljDMUd^8!^&~G^HI&hL}4EJsFH/D-yKӦ@gL5IXt\|-r y&^mPY)fcdEq,krn65P @'=RLLfB.J&?2z`rcDKVIB}jdMo>`\gROGK:ڧ[&LDSKRm=i˲H7b)܋ iҸ7d'W p&}Q$^ޟeMxrgC/fkLCTm_϶S NF1LNYg|8K-W&1 +wm9frz UJC4[n7Zp5KԔEoGIяiHq!pK^9Qb?lR,|i% Pzv@~[vLO%Z`' ]mע=}'ar:"g9-؇ǢF~,kUӂ)؇/[>1gcZs[)ݜb2ہ-zljÙ=%?˻I{QCi{UR(+F~Aԣ|T}GL#F.*|y3( |<5F@))˭7?ꥴYz$2 ^]wL1,+,<]rMcQa[Dx)r_ Ōoʙ(Rc|Y`ƕ+&푰.Xw62WĹJiKT2\/Y7)s3g`>!0LOUdu"Ly`z·,; jYL{9~%v6LyC* *%7 %>5nk0At hTiMMIBj΢}8T]@9zOLJ ; SGh8%`dN\4[MZg0:7zΌuIGܴLhM+dz2 s2x=ix~+Hӽ1L;kx)eD%-fnZ8s3mŶ=7$hCN%Y*1_O*1AklؿSYƊbΚdĆh\]v gY01gƽtY:etձ-SwpD|d-lo^b<}5vbWd6?DDp4u'Ș>ykiD0 0ưNYG<)s"lrnY葈x頜 C^7u/]nJO۽m␙_q"́pJ%f}!ȕsk]M-Y[­cbqg9< J仮s[x=QrzsJnFZKNᮟ+Xpv zfw99V'h'"Zl"#nAֳ6FF>F&q7ݗܴMp\T-QVRjw 3@01N5T՚qBQRR)v~ I0,` HaWݑFK')|(7"Xk8"}Nm;5Mi:nK ^B E=tCl՟H _աI0lM@= gіmUgW%WE6I> stream x\[s%lțNvʮΦjEQT"e?߻ݸ6CRlT33?8Z/ͣ_^{;{G">p{x(E=:9{.[ENzO({Z>:yvjCX^/FZvWcx iڽ7fj_Hju޽lϾKX,֪bt/Īsiw7h,uO~(SjL8r fBUjtz1r=9gO `T=lCQ\t.N֎庬:⥮!K5:(W/҄aqJh䭋Qf]]z._iN=t_J5}}@E}.&% Afb.[W==$i4OFWTڊݻZ 0{iW Cm /v|ua"C֊ٝ35]]d.ԗ.jd}^_D6_)aIA-<*Ģ P%W\GzGm^V]i7Erj}} K6ya(s)n_sVyx.Bf`K|RJȲ0/8 %s`p%Wwz!nA\ƼA&ˌ&=L]t! 4^ÅOAμ4@ߡ%8s}L|TϾҊ`]%LR[3/M6ׅ6'R/rZ"ݯۇֱ.}@2r]+vڽ$6wĮ$[eOݞB0S XP;M*!ĠhI/VGP1 우q d4޺ž!3JG 6I{Qb':U LQ[ mEW:38[=U5xt ( HusE+VFSA8 R|oUGm2)TN}0KͨO?G^{ V3C1w7'jꄬcעXx7vZm1͸"4SY2إf$ $ٯ"=m]m%1-_O&Xp;?Am `}Hܑɰ OiM1ٱGօ|`DxtMPIm; mVK`:!5\o$:6ۢ/ۓw&5l'DH$ޤ*͊~kSd-4B{҃]`,wm^]Ot6^.\nj<#kt3J65~0,A0g Ɛa-_`C;_V؁yc$([0;w] _>Nw~{Ł8K(+k3HatqN'ʄ WhLƩ4`fb39ȠsUA }Q#': wը)oI eJw&*^z a~6RNz7}tY[Q}#GX8!xtc Tu8SVLA|2 g{pDfl6w@qs[g{Kt^Ѧ(LMYE2@e{N|15Nl'IBO, _]; IrkHh⋟LIOشW%:Vta2l^G^k#_?cdϭfayY˹,Dt/]B832q4nف嘫D̊͢1.aŀPD P\u D~L  G*4Z>LّY-$!٭Ug$jN]/8a}3mw`FZM!)#/4'jYc28V,Z*LeiZ.E-A(2P%EZ g+ب|WUj"H tb՟g{^J`nՓ=dy]7W^ g > >z {: ̓Y7j1*%tidAZ_B첏lw15wXJwi{Wii|ĉZ\P}e+$D0Ώ(w MvH(5F\Yݘ KM 7Ñ1#\mR_v-Ҷ ̿/#$j" 1VQ^o]c /(kHe@>Ek[|ei#M‚Gy\]'ћ(ɠf{"CʁBo#L.r;+u 9LWS)h;BV>NJq?EDZ| |q>x=UPeJQW|yHp|_9؉`܀HQ@'uHnˊB?zq7< '="1"Q!eEX`50rPmP`7[0kd(qAp@jS@c.}oa) y`Vx4m eBU.F=-݊ c5:Ab_VvF،1LR(dұ#Umy{\eLhxf3FJ&61H5/ٙyK1(^|0OÈO3Ic*٬2[`idZ J*^2 BZ5?Io,8Ǘ[Łu¾%!H-4!{PF)TiۅrY?: ( D>US-vid|ʹ[2k̮ņK2x&1֢@, g?]֭ 8fFXˎ%]pPFkS~c\秹cHXqu ILsE5/[v,/R}:C$>pCkz &lr+k>ր`6x-H4A%DJsj ʸRs(cS!sL~g*c/-;XL7,k O5H.fV%>-;F?B2 |cR᯿M"A_'l'w4^r-]S? ,"}i:ƚ>qJ"F*LNZJ1߮q{9Ħ1-Zl'm94ٕ̈́#!'&ʖ<ޭ,h=O+<U[5m QDRg*EdvбE>.孝NMH+g nIvBR)ʻ_C[r`)꽽aFS"¤ >E,08 {M|v([ {L5M ,NJ/" #_3qO#L5FA[0+HdwRw;oKMLT9CARޯ:ǪEliJ09s0(@Cwi{=#J-, M˴C}]7mAv:U:&9l]CSqÆhDUԉm33i{チIwici"X܉iO;|gt)Y3 Fq= e]Kq]]a%wE{4Pv+vۀ>8"^^] XIw[vZn֝sV~n+Vi?m[oi/Wt 99oapvJ=8f{*.F2zq2ù(AGmx"y8>< XߑB~KIL˘XЭv9.,DaΞW?c?!?ϒ@M0ZmԻrJ--c3Iu/˞d&Id+ v([E=Sz%FJ:&{<]9#!Zlu }})Q"+xͽ}z]眏y^WoK{ HWV7@EYZ$Ar莵';,\i/O*Z.ҿmFmU-~A\r]ąf't2Nw'_XtДW.5׻[520[C)LsSTe Nciĩuk{kFFՙ )_&;@oXp׉"t72g)Ev D">LHM NJۈPRןW'q똲g32*0_S??Lo3."%ÇdxZJ?\;/^JaR}[wJRقC:j.U-~}Йęe> stream x\Yvq_i}-c :v%k+:Yp8:z3ˬja'w>W'l'l?^lB#7Θٜ;#=eߔ{BErjs{;ha^zq uB}nzz4Z YN^նjnv{# Ce_L߿!~sŁ/0náCh WoY`nc^Hx5Xv{0X{,Yls!>m &Ua"Ţ Hi5Bcy/}U^{V7]KU\#8oNvr8EH0|;M &+g2L w.FU2gL*Eo Je̟'cJ#k/K&ɻHI.ݛmymItbO[=7͋nӇh{$#12Au&) Z(}TDmV9CϚ3d!p-]3> ƙ :SJiQtt~84"=qJuYZEѐyE9IJ.u?8{{nʩ~Rd;tZod P“Inϒl/doa2|ς] g36jn*[\O+ (;0dc`rQ-@E+k0D ^oN Kl]#EllwaX-錩E\Jxxk W@ڨgU1*ߓQqn&yڻ5hqWl //ª0NWk` '~bQ@K75+N/'iEfζIɗۃ•r7HH# wxM1NPb|o%σam'bwRB{6ZؘA$au*o)xs )ymJ/kJBU'8҄dfȐ1@gWJJ^ì>xR JPMC0 >MG¬Iva"VGNGupgA8+L]i[|>e*% /< yo'q6/m'D$W@p7ri(5afL`AtSn-0w]jNWXMpL!Һ+Hv!>+}O,cwL~+?R _=|5b1{i-HE[C/}:}r-?,>Q$M2>oV3{]֑aiMwCɪ(.S! о20T*])/ujx1Be}2cR?:A2{9 FD@(qw^gMMCny®2{^n"kTF)7QBSj◰~MQuƗ_j,*=P+؏er9b?F?kcIuǨdrd+`G?{-,ǘ]X.[7rѪ?'Gq0oj=H%eq,[ZOXXNC?v'`ٽ!j#mEYP]։wO8/*,i{ZA`]\LO5Wz#č GJz5&iW[efOuAunv.| V<5'eHqW嶓dH%CdV1:0~{Gc-eRd0Tz:}FX,fMgF>dlԾ@ ^܃&Ø9mIdgV00M`P,W:4e/*y4)SBW4l{mv(~Ն pCXCMl.{%Oa63@w(R!%ZRdZbl2G R:pCő`di.qfmhĮ bک̬u+P̙\TaR5IjI)Me>sIvXHf'h nɠ dA¶ƙbFOl͕d2OJqYԚn"e~9\7p`$UŸS2m:"Ic H1_Kq2#{Ygi6w$:^~@MB4q*! `oW {2 sW0lvp:]fȈ,z^0VҶB[ue~pѩ{%Uc+g% a|Xd9rzSrj7Q3\zL45޹FrlΥrxة9/GOzV ќE:${/r@zHt54@Vzȴry~NOv\Uq"G>Y}~ߛ5iFAkN1RZMh]64;+22~!g7aHr#b0HT+,FA>Vp  o7֑ب{Ol`}zwg5"" zQnBOjөc;LJHH?QDʹ5iܠ;[- ˃Zǵϲ泳)z|Ro&E b{Rg$1їА؊i_ѩ+j{GΎk$aLS/fE꫙Oպ?.^c2Z@FLϴ0C57||<}zi=mU5=_BfGJJT`W^V_&J7Ka,(=k5ZqOO>:j6XnMX߭΃o;mɝ?oN?|tiXmmb=lx E 1`2$807EGi_dz%6T$@dޫc;D<ƅ5_XT URVgQqo~#;/[.Jl=312^0e X*PxvZMbG{E( C"endstream endobj 74 0 obj 4788 endobj 78 0 obj <> stream x[n%Л rܗyC$3ahiiƓHMlշ l.SV:</=}q3x@e>Hs"|Wk p;XI.f&5/:a.#V5NwRMhNӺH6^ G `|IKaBjCؗ,2I2ܡqc´opg!P@YMKrZe^Pwr8뭵hV9d-g{ a3P5WtLؠi9XƜixnA֘qC^wuYu-;f1:kQ;FX[5m\+-3%RH+y\ >%}ip[&fѡTO,8gsIdd*G/c6ϫvSݶ3P`o"39T$n.&ύL;H@P%DNʀbFb:oz_e7&%& N)&F(\kqo  X 2#LV U(je߁UE\yi*KQ%BvXag0<=hL/]W n.{bf(Hi4p$q =]>9X,żt$ )Ra#ˣcj:%1R7s|6)|z^f {j"  燌+sƩc,C8o/]?ֲÎ AՈM^O W/=)!xYsGekl;Guق'] ʨO:)m)₇՘(;iZ!;K&f-*N_F\ QR&B `=2F*tWǺt -Y!917kBB>[|_JjȴkaywSQct!. JFTy40LUn7 AmOokemۗ6S\}l?fe۵qzd: e̝ ~[P=>aFh&tժȻS$}^p5O#d vԛ2 nU$&&2O,LY.̂ Nb]U?*JF[?|J/s\phj-%q2.9Iu"vt)k6|Z '[@Hˊ$ĕ+XCҢU畺壎\a};]D^o^B.W]AQh`ڭEU^%guN{wj5RTıXn4&lO6ч9y9Y39ܻ j$[ʡ#B2^eeщWva)j:#i3cܨmJ.t ykXi>BWbȸ]IN+wU$d:O^ Xθ<.%@J㢫4RwX$Z8I e;MY(W1=f뭄x)z5˳DO* oJҙAd#%=ڵS˟(aab:óy ~*O@ttE* $ 4 ǽGB7?ȱr%9|߱~\vkR&,}i9\{S~f ^w  $i xZӻ׵r*{X>;/LjAo_PzI0#?UBF@]g!9=EKFd$)ʐ(E .%UK~OHb;r}Yٵ󜭒%j _EKԣiC']4>U+ى2Vі5vyDMn,SߓH &riOS`djB=,C&O3w#;y0ٔ;6kn&Uk^r6 Kb"q6l:]jܗdeRdadR4xc>2rvVtO*YJBY*xNO>ݛ)VڐM. n[wHn}bgY7ueټ ˇY< >dh<,z_<Ճ1i0,F~YׅH rD!l2q|?Ү-Z7K+4yQNhKiQTFEkҔl_$qCʾu83uҗ- ڂ9d%{:mAd`ec%ɠE'vo.4s~endstream endobj 79 0 obj 4191 endobj 83 0 obj <> stream xYYo5x̯ b7@,BFȏ`TO. AQTTqc97xcs\2Esș3(>{4t/Z-TԖ} L9OHF5MI疪%g^VbFFٹ RĴqn"H6.l*;GԒNNRn8pC_,cK`& .@R{0ԅSrei5T`>vQppj8$ *9p8UsKq7CS>kb&AMn-xCy؄> 3e pDLW21V0ć.2PȑI#_hV$p_qgZ@ :@/Q?š"|TK'z[A,K}\MP՜:ceɴܺ9&Q)[3Ɓ !U,Q%ʫ҉fNJhrjgHW(JܷLApaq]TGQż_]W$6cKM)$!:*3ǵ%525km\V0-+"v*<3`#Tbjł0E9v@]E)bk!O!fqCpjGYdAWLЍ.Dkmgi֠G0EҤ'EI I<(f.oBx=!\QV263jV3 cVoON?|Y`2 3E$ $9pA3 w!M6~&(p]^ZoM a"8l0o{7rEL-"^-8:TH"0mDjۍɦ->DlM.&kwԐxƢUECp.,QIvee]b0_]i0 Q"|8%dGB&#`nLJ X~ H޷Hp.YV bBՌOvMO}[rir,o:/"/To%RSiԕΈWZgaڸ7#qnu)  tZm-Mw4l5LD4lyغ}-j1r]I;Z͙t]r^<0% Kso1 v9LX;|d'knNDT"G?\w"x*-¹EpBKpH<Ekia AFZ8=k S%#"I0ߟB͚<+ArR%aD!K|rc( rq#It~Juh}8A[j Iu?2%)uz䖞⽼'YUFď,ư] 7Ԙ74vQ}=%O_(>>-^R3~N/sV;@rJ0!f%"#;a&ƾC= :CJЕ%|COF fL>o!榐.GO+yDMlEHJQ@ܹV~qz=3-endstream endobj 84 0 obj 1976 endobj 88 0 obj <> stream x]{oS(D>gfѦi`m,YaYeɶ{CΙvar89$fO ^=[w{̓1vK9zt{R Jwp`zy3v*=W1}#|o(7o`5nw)Fk6}` k3Ayo{1״Cv4^o>zֿljX6c#do7A3u #% "$gi֌yZ2B٢F5MϦ6 lFLɩo j컯Wȩv_ @}aj۴LI@ nFl  v`cƇƕ>L]!,~66g/zVaV}x;;:E}|jz%C)|.jgd'( {UXE4̦+*O楄jKaMמyQ!vhiqrpa`iMtpbPD阦Ϩ0"9k]7AnZy]/id^&ߡPO2G9mwRפU_<=|A}N7DAcU^C+gBDaJ4$ =Ā(!gkt=zͻC9jp_D\mQiyMEƓFG>)̠IG"̀k$A^/NwzN5,*Q6ZJuxX(~6iˈ̖fD/-]42|M pƦI h!!+B=D<^ (5JNLJw9wU`yPt*2'޶lfB|dvA$^4rFdQoIPpoGX+^e@@?:$Uh xi]DR+&'=2hiP=3dN!; `~BSd$PM&gS) XAf 8('IH!#|W5Ӽ#{CU4yH9|37J @p`iԐШCej6Ytろ\f](y!~ ݥdbr&CC'@ƾ Dܤًq̠UQ3g! t@Vf@ ^g dy\s)B l+DeHߧGmGDyޑw)d6[1D#q[#z:ٙ-ا1,!֏j?{)me %@Oh`z~3b2JIm4>`W! Ŭ"D9-MF)t೿ Oq#$Nh"˶_R葅!vl٠pU4{Gp%G\1fr!@hA߅J:_} oCߕ1ht9~M<ͣ<qR1]Y?!킱Jntɾaϖ{Y֣a) ,`^361UA66rO0뛀-#?҂rQ/Xh>.MJr.+2p^N6Mw>}nQ:P8F˫"fsICy35\ 0z`Yc!S~6gy','*/$p5䧿),q )M0yNHaf.d݄rW9cHgU6ilS8StC^ӯFJ'P.L -0xB}t \ҦX}Fb39pX%Y%'#"&a W$-LpW]cyZ_pB=ֲ񉦰Zp]4?zV|,]t >fj+ZzsIf(w|jqXNgC*/Uy(/$@vВxKuw-ߧ2ހzSݫRskp@`բB\y!ⴁXha67!& ?c䧗%a5D8+0aH*5$n(zlrjkFc1R۽rgωWgDAsVMRE3%r nO<{4Yz[띩<8V$-T?+7حsfa|zSw"/"OsKxx9u Te]!/֌E{ӄcZF?%Xy2giap P3%e>?Iw9xDs* g̠g2qN O7{3Xo揬B$uxgMm^9KތD󹹛{"0nǜMWg7[WBڦM5~<$ Q .(Ѹ |Um *|#hG+I kOJ_7L&V̞̗ F$Α%xU -9tFKo &dZO ۩4~dOFZHլ~x[4y0L) 牮2J~gOS=>'wzAW5^/v'밓2Aq*=f)i|V0.4OS7@|(l%y;cuk15;]S3AvL6iv풳wOo{< roB~B&ꌮH3.nmrO,2X<~ͶRA9E8jw?}/jUi33sWw\6j/\RDlL@\O,]c) 'n6?= dm2)c{Z46IRvmwݥz~FY`5jw w-q~䜈ƻ_l$.ߣcxl73t^= V띜lp+"fe\2Ǭ0`/1ӑ|&+qkĮ= ܵ'5QWU:X^ـIM~+. ~Zr&ҝ2šN<Χh ]>M4CM9u:eX{PљjJOM< ~/J>.ZEn/""GMfL I~V܌u#z nJ'\Q;4W̢ey8KثPsV9u-CHKI"N&^:S[/_*C<|_"X4 * $;yCqJ32i'`E$ء"y>BZdQX]{~ I^bq<['oP&Zbʴ<8D٢,OGe8ZAZ}B3jm 5G,ͥu 4j6Ja@ھ+-cU.H1(\S0w -HūKFGbi>fnh­ Ií]>JG-'D^k@6DμK ċ~hdKnᒆKet}T;3$CO&xqj0o:&IDS 9=rKf[!`ohO)JMgYG7 !Gٳ| p;;(Z[ƀ"Os?GcE1 H_gDA=*gb,) +*D7 REW V&վ\HEgL-$Rkz9K\um"7+榟w`}D;sax-0e(?NII9!u(\]W\ P|nZ%rugWwQCw\F|2 d] :9Vw0I_oU8tYW{?y0y8'ښɳx1CD~?(::,] 1D2o({__c|HU&vAq%%Xpr[ûZ ~G^+ uE} RGLE9VK>l,NIX  "a )QV-D3ȅR?ɽ/ęj)ZiC5|e9aTVZsL'Ev4tǧNN3d#)gms/y/Y*H_Mw;A^o]1)ap!+;yvu-X;]Eπc}w݀=\~u-J`QS;*{{r}ALgE3'C۩hn.!-"bn$u꟰'oO)DfwY$9j}b\YcQK?zB}c.]+W!0$oӅM}V崱knbD["ytsו2|4_(F%(ߡ3+?zH6w5÷nta{'KN|R< @`0{oZfƋN]8X 'SkۭwevOg]ܛ>۳~Xd'5i\ծ,h=Nni<>endstream endobj 89 0 obj 6321 endobj 94 0 obj <> stream x]{o]S] 7N>M6[hwۅa[mIJYJ|~;gx"wG&!͐hь=G_>?ώ>NLbUZđ^?*ϤTGQGuci1?migg;vټ¯y=6snټKmU}d<ڊ+1Ex0^L* WnҠr'#2 KNl>%|%oX?aj$\8RFNkh1)6*.( pVK*ͷ6umMħ.jʹ ƿ߽͋~TCEi9^Շ^,kN1Yť2-BQQ6O+l66E|^R>_ 6 &,ad]vG. SF8Q1:UeUYuU'7-c{6n=@GU.j6bxrDV}d>]KU.F3G=(w H9sd iS9OJc5xSGMW\xLGI#a/VA}>}q7VUf,oFdfzJoBLβ(0lFoS;]= [~6?)BMJ_;Dk|$0C.x~AatIis(䊇{,6W<j;yBˊ ,`_~w2^BlRxz+`]d!*ވ#p/ڙHpu!v[< D'L dK?rD+qԮ'IpHܽ'\g6I~K#Ѯ[=“]@F,]3Eָk jЂhEuSVQ~"鑁5_ !uҾ8қIyN`aJPma}\;PqHf.yiz1^;DY(1yG-<[&jOL:kjW0;EO,D;Ρ9\nFzt`!^N-gtRzwRIIIKmkaYeypb|gؾ$~_iexW{U;d5BCC,S%FcaؘHpv"lzIbD c(*^uC>iӣA.MoT)l*_b V*U#vVkjH8Vm-t18Sv%'6#ZoxK \jmmF'v#X= * Oh0OکȦ BiE3hZe}JЭ%FȸYFXa$ 8vQ.~ᚥ:ibB( =%Pf? E,/R+""WF f=O [؟uW5BO~.l A z ~ m+I@Onx(3" 6.K4aӛ/Gm|&hٖZ JV^uĉxGPHZDjdIz;avʎ@3-[t|bXɇo..Ӳ4\!yRY?8û*JhmF_X%fy{Hg\UQs| o;svVf5isZ)M/|T˺s! kňM`xV+aMeNy֌!:AlӑӬ?,'Jk[D 7lLzGqh[2&ÊxݰT{n0TPw^~D2e.NSٓ;\6#76kfO崲Lv#X -_h~aQW4 }'D[ U,}v fJM2`X6ٗ\lfWV xWȶD{ e $@e֭\gL0Ms|.˴AS_T XW>5еQ^ELHڷ8SLQS ?sn*Nc Fb1v- KVYcҹsTTM5 NQ Fajá9$"yhGւ0C{TFh5'yR3Lr wIa]|6| g4k4lF- JM㯌#QS?u0Z \:ZjZ=|r~u[?|o,桩[2 S+}-Y[< :/< ^mғXT뻑]#mw.}Ul;avsdMs#B35L!K3Y&ywWi/))r<:I>ygnd/ƙUW5͔yٚX1j[e:&^xM nSPƆ-1̸ Cn."p'ޕ]p3/jx+@~>B=!Q"{SAvNOY>J%P/*i"ע \I`^`ę5INEDK<$[MUל5J\k2qÆ5u-,/`YM^zrȟV ?J9d#uBk$^9JјXarߕ?J%? ;Uokبq+U؂˱v,hmia@ˢ"Ȩ #΍OWY*./,KUg+x+IU4h܀=5;rI/'.pd[-׎8E|usu7t LtY ck`J8=%%,YjF&2s)Y:0v{@GLuҕ#;=0E:wN1G_(g:cqkknbqw_o}A R\c.D.G;ץCd*_5ۡHӾA򀝹`Ûs)* d0$?ValeQx=+ckA.ו8>kG\Eۇ8}j1\C ptVC/9Kg#/ T=%LmG\0E um!s" 8RR@݁ՖhS`q4g-g]eߖR(ex 5j?'G}Y?*`ZU)fk0M4r{2Mc }ZT?$'Us9X 2/,D:ʏr"$m0z umȼc[|Mm''!#X,d(U `ΪgFR{{qn$"Ox[OJHN+_[m[Ik?}ĒxYQW,Hav\3/1*'))_.$.%ܔ2O"̆!͵3dLfu:iJU..^DƇ#D9|1ю[poo_9򖛀/8f7Hi\~8ܯi|+%a f\ #,D~0\=7O;z0Ј;|':2=<cx)!٢Ce?ffH-Z3]CSnizS;.Eo `1l_]Crmet&^JV+8vͥwH`IaAAkZֻږ;щXG.[hn#rx +sS#^4k^wn'/s1Og7Dǿ+޷pC `? e6a> stream x]YsJ+ʎ>-ٱRSTJIrQE":DHvz傲K2c0}SpBWW'NXy*aًJBj$- s(2J.WgoN^F:G*7JfŇjSZZPÊFk).51:'Jɚ'cLh-C Fג(+n1/_7YV|PUg/ `\KOl%'&4z"R"bIjaocuԕVY}n}} >)+2G_gGJON,/t\JtzrXtcG.U(gag0KmULmD]֕,"->=uWc<{W5bM€ב "\`o2B b"$S!tc3Kw[-,a ms/4?xxo㡈<;B7ZV}7:"j)gO"vnNr6s$8Qh\zaYIc"ME E5j.#FɒgJaP:ë`^4Ld\9j{^?[P /5zT!FtC3x_ۀ"V)R=WM\ߑn}d;~E*Rh[mT/O2e!Lh0!9,ُCHxPCK7Z42R I/Vqv ^5#k5…^2ZmrXތB"rI0n zfyI B" )hrZW7bΘ~^k&k89W1`b6>6"˂qon̜C=}`Qb& .jJy ?d%2g2P> CX,d`HNB2Y#Jl; S ?hi͑__OKjArI Mr0ofB@d&ek01LV^DaW{^i(i"K8\`4l5j#3&kᝤ;{ *sjGe&@EZFVTiս*3T2{ -zhx9)}/DqcX Fm t-nDeT3~oZK0|X1Z,qU/- W`͕弞ƒ3Y0`ayr(cc<Ճ:૤X^Aeid y[RV$S;Uʆ&bƊ(%b艫]G #t.Ҭ0u}̔%I l@REA 2v]FQAL/ 'aBQhi}bsiH#pd+v鲴+cnb5ΒNpD>hё14Qєpm5v]!EY5*b,Du7͝'RMPUpnh9&w`L+T!7?c95txYTo l_&g& c"lMN447+.VΙ& Mc}l3gV;[֮iMe|c$S'YY詫a`nUHcCJ'U\G6vRIpCmZO`ŜWXm_îYX'D3ڦdqD.RҤ UH*Db %z.GV-GB5I y'lÎD`̂m.:zM OtGqYݣt3 Uf4]-Fܹ?i )>X&o)*(%wZ$H @b|3Dy~i0q1|Z ߠZqL{ˬDSHP"'-!rP6 ]D{3詚9d2^A~ BX&gm |+U]╒,2 | :]'|]C-DX|rh /K·r~:: ל ͩAbO^ҨY(YۜupخUutwLa-k S؎BF mܨMfh‰PP[8Z0%_>7Q2uI=D[^~l.T#_#o3($]cuF2DU]A?sS"ц˭%:PRX:̈ '>w9_=V8j27#Ȫ氬4dX VϪyxT6gXTځ|M٢|(<c0g>'qs<\W ZdoIe{ ONRH x{nNۯL3jÕuE2arաB2Z}ѽiHٓ8;?(eOdۮ=t s6Էvm\};mC)sb%MsSP? ͇VTMF+Zʇ|Myߵ9ipln3 W̄}UT:~7t\͎}.x"^8U(U (> stream x]YƑݶBo.XɲD{ko0H 3): FkZp(@!Y7qI}}Wn컋q;ś .ؤ?߾||. n?[Ej'M9'87__ekvzg]Go^8Z}^.wgKi&%F ?OB] ֪I!?A~ӃVL2coӓ~D<^``%_05gX hVUe0f^90FJP]HU>q8s&7l뮛=(m%,GW`qN~rwj*XfѰ߭ }SϾo@u'ɤdyR0Dyu7ay x=I3CxWb1#4(z~>Txҥ4z"Ki-r!,C݌@dq?x`4fO*'Ert yO2O"^mKZC:!(i== oW^ճֳvo{`{@oR\JWwo=` <<-Lryٯ0P PppIެHF-e^!;6df ]k@fE#LcX=̌<^Kh  ՔY8H)ä QPRx%&i9 @M}U7k XQĎ*DY(`zBȋޖe )~_:a,Z%]=J7Dp\.Po{0+mF szY,,xI>*X9)cf iJUkhބ l!#Ef ӄǑAFt u~!/$odLy)mQEezX|>.qPjozM=|5\Ozx]#wЫ^{[@X4,ZwpKd{?FTgT`ވPe(?Eb:3TAO%ml(%uX~'4dq+&(DMfU~\g߈L4G}EV UT Gug@tA[fU7Bp۳KP@.҃b>,Jgy1K(Jل#`iuYo"A,Z׷0 !M 3p3(G~`" Vϐo#h_K?"uXnJXGHX1q\;"' DM9F"$ަF S3B4X٢Ͻ9w*A4JPC+`F30Ǧ=]L?S"1t9 K x=,:  _ُzTN#7CW3; Vm1BЍuޢ Qs W;8K1 t+Yж;c&WvKGZ6uWOb1OI2@qe ijz>[yb._Xr[><$:00]OqTFIΎd^#DgDUj`lnR $!1)@TjL"{b;1ARD+VdsI*ӹ@5Yz7].9(P&OmUv *%3Dn$CZ|+{QC.ұ4AH^oF+|斡Ml:2-)mhc s!v4YH˼zzVw>esNm/LގS=K-Ǧ,TٴMbr*4&&tf:Q40+x #vZ)"sgZBpRr{*s;T;7(fz!'PSo4+Is$-g}4ZĔ5"Z)%==`/1D2jҌ&m2+e}:(*eז1:`mB`؟DDu%񥎀mI6&b;O~VH)UϗsC18L]9,*v\WLkQ&PrLƎ_՘Za|uH:0Y^iպr^-.*Ԡo Z\Ռ_,RzJ%IW8!SQܪ [ k|#}|!cSdxRa\xOUr.a@۾0!UXI%k K2ٮ\0JIu&]SGuM$@Q*4pcep`2DQؒ 6l2X\=R*<2<ƤlVu vv,rɶ#s+|D(l{Cy:5.ؚ5@@R'޲b1[S2R2(,D˾1ԻT0nTZ_ul4"{b}{\8tY-388nLYIy_Ҥ•ʭ`T8ҩZFh ͵.7k‹V]q KϦ"Jz+pE[~a%@aܠ浛MJMf1f y[lڍIsbRhMLDxy8G LZ ȹNh=FctҪACw6&r"I>8ю?3PX͇\xT9:nWPjbl*$D7]GXt>n&-y4$OPMIN{*scP*nܵQǨFi夢XkDS~0jGHVNb 2NW!%uTV6 ->i,maw"Uů*lLPfG"ڛFr> !qWs fӝ-"DL %$i9m"iI$R.P pT0^OFEMi(UL]𛄉L-x2P:n.;T .>'F\|{_~}mp,ypl@=>Vt$7Y[;|R*Џ(OJRB92iCyB5 q_n1ŹO>3])5emN7i T2h#18cg :`sc xg93m|V缤I#,pEV);#r![%==͝)TsbMz>Py/v #7lzՙa\9b/,S akCZm%G {l,{'~_if:GٹihFHGٙIö{!m 6K+{br-3FCwZ+eY$$VwU*}3RBKY@Ij/f圔Un/.[Lf3 h*ܰ,.0x>3mQ i+$Iivվ*YY ٰXA;jd^rd«F(@pSju`[U1˘^|fX^P?oöts"Mf2)m2 ٙuZ`܄iZ MnO'?L[ue:/i0M=߬-[{<[>LJA(ٹDÓn+Gʡi,z,^I Vʈv:^L[uB Q?/i(mm#9EGl%>6?iey)RM;$?c7en{Z99c25S7+N\QAyn2mh@1$g&)>JGmK". Q+h ɹ*78zf6d(5DrӨerIFlR1ҼߧqYӒ=I'02&yz,vgMFLٙ_Xyn2&duC>@/ xAN^?eNvrX<'=ssUޮ;73jK#$Huj}?|muPz 7JF\kN=7og(;-KWKdz4^ ;7I yz\dWsu{HId{g|| ٹLLȴ̜|^23'2N^?eNVfuɸ 㫢MfdBi|^23'2N^?eNƠ%Z ڜ)Y7*}ooT:ΞmwS06׊ncIC)@Uo'fK!*UxlD@) -U^:X>Z^QA|J;zm+~^"B"xl :8ݷ??#ӈPTyRJ߷|d*:oUU=QK/m][yԍrp|+۶HοS۽1}[<9ZH$A+W)e>,@tOp6L/1^D=GB-(3'=b|!sj#*/Xd=nrP}, rf6MP=8h?ƐzS9O<`sc5 95;X:T<άde|CۑsOP]S~nr Iendstream endobj 105 0 obj 6305 endobj 109 0 obj <> stream x\koǑQ~7^'17dq`P^ E"i뷪=5lم 5]uTu|}$&y$O_y">/|D GGu‘s<27GMNp会"7nBLv'뭜Pzj!-mDjrSO繽vf+Eԛ͢(v1~sYۿ$<| ςuJwcדWnjD?N4`CNaHYIG}ZG%[iay) pTD2N!I}MwRUQ¼N3pj2sąP&JI[é k6#onNټ +wp^;3)]dYd*D8K Nd{:)8jObLC6kTtTAgO^\7eיa2t~XMإ9gKj/n4t't% QyOkk)L3Ji=CG5ɝ&ڢ)ct=AQL~餝\ɂtY~'f'S&-%E[}Ufr, |&D"޹z\%b#y]kkbR{͡T8eQTo}lS'#W\_۹\"(L[R\"Ϥ.Zgoa_?)V2^G@( {PȨ(=fWA@c#q釯ŷ )q=\IN@i7iN. ` ƹTճF.Ӛb@\7)ǘ{UnŧeF$3!Yn+tًxR*}6ihC*>ghAG{5£8ŅUB2&nPm4;DqR8Ma%~s@Yݠ^G̎_?JVXBxTDY/'5xU7ϭlϴN1.ULe"a,!nܯi9 bnt^E>.g60kN'=͖X -y۹zmg}BV!ydo*mj⌬!X=̲݀p#zA!Cy ? Њq`5IgE)Hmv6dɤM۩&^g^~q g j0G'=9߫o#Yo1~m d` tV #.;:2*? -UL$֌ |OP-%U m`n0 F#B\eJxيgxъwx&dzF>BΎtEbA|}i!$Z3Ԭz$P GGUShUwxVY&N2vcP5/թ^ѓbǨ]x"ccJKuo+4e0ce] P;, f$M`!j_͈6'DO:f mȐ'G8Nc2 $t5hkJmHIIAv(1OV(ђ޻?<_Mb߱83/&!|DcRt?!ȓy,!&LrQa!ҙI@2W#EMZh 0NG=FZj5!Kߤ$aLƸ7z}T.s&'m̩(MveJ) K3U'™VJyH[(jO"O.(gRd;fTj٣Wie2ٔx 50lJPz%0NW+!=8T[-&6 / sS*KWqVouk4dV?FN{?iF-YbΖ=C|M$ :ė\sߟoKg5O6+n-IBNQNVq5[6*+=5ly aE\{~r5f\H `{8پ[g7sh (w&lDIםH}HOҚ5QJѲli= XcW)ӯȫpQ- }H^0&Ԫ1aJA- S%rB 9KH'ݰŜҗkO[f_~;0{P) N&Mr HBoEޞ~7wB ƸJ8 s(B 3-O'aP$pgGY]#,m\QC"UяpnR8Gi/{*5X"L5M$J_kR 5 @WUd=%>Wq$ V28:VާLERCL}C4=/٬ A@&Q; Db !) w{ OéL;9j d&0(t8`xOLr<#90kwLoOkDA,iCW(D?bMWMcfbm6.:w2voZ֭X#H_Nևʖ1o⤰ |W,Q$^C $=0գ}jXI?K#^OY~YVTl.b{-8pcITim+V()Yo1'@\<#M|*胗A ~ ;[ƃ}_&ʅtfjߡ{nYկ|؟-b5ShlQF2'h;ܸ<ͺ.wjuK6w0ܓ|{̛1HerVA_~zӕSf71  >?qCK,=o{؂LXk#|!Ƨ]4$b jTZ$LHv +.WG)z¡6苭=@VYX@ai!FHI*h-ݐDY}X->,<!>V|o=~EE XH}7fpp1) HD-jNN7_endstream endobj 110 0 obj 4643 endobj 114 0 obj <> stream x\o\Q~- $QIE0dɲȒbK3<˖0Lsx$Lr=|n%}ӎ v?w?݇F*pUZv"uR3I| \3`A ˕a>a+UAa*ZO+-s^,:x2iQؗ~DzTXn]*/flbqZFR9+Q10=Q.ոGiŮR8f;NЊ;Ag΢|Xc28 a 2mQyŸnfr\[  T?[jfwJ%c!n ^/͐oRŷ8 ?~)=w3 !h>tnEHDSk5/W^駵#?_jXvq9>aӡ%cJ㥔LJ^Z8vN!-H/nZ{QYʕ0) go2 _i wW3S, x&r_!(CWuQ=0^60EG $w9gQArukX2i\e̚:-;'(EP  o[)0G?`/:*҄y̡"s Mȴ2QpYћ+3oDN;H[:LiWLBi8;@hp7mϻ}Fjؕg3%9qa ;Թ DqMBL=9~#=؆nrC.(YR#)[|]QgL^(~7<nPł*{HA7ﻡjUdIj_]]`Pj s*Pq`~Hj<#ExrL8.lKUaRB@;xچf+?7H /q[hbiTSLmB}t1,fboSSNSв<[;\iəGL6t8 55a5nk y\YoUY+;#|x\a,~ Zu?azh)Ehx*L}Kp蔙Jq @HGcdk*Q jL& 16 ? O簶$IM}X$Xx5&3 "p1 w'![J8I:! "7@Im \^ `xwH@):Ka[ }ra\Tr덭!gTd~P6 *L\#H ϒ9s׼:"Nrn"b8 &-8k,)=m{ч_1Dk~ƒIW6 \atq@?o=z 3ϙ˕ķ>=4QZ|_vG{C?Akɦ徠@QR'ݏn<t VX\=@[_ETf80LkBqeЛ;u|Ɇ M0!TS6|JTJa`B vUoqPkH`zC l`h/ EԫVm^%z봮]ؗm7пeȿA* p8C|t4<cuj'Plf7O+&Ҥۡ{ NgɼN&.k[TIӁנ]ɽzЄ)΋&Z3}իl`E>εR7}Odߟ %A0/kL5m>1}D0w/?fhɡ-HBD {L=bqӴW3)o|zj̓ar76rʈ5g$:=*ȾX;̱7D^zǚOJd!E+}°[;CXtcoGpU0'Œ ?a;jpڇCdͯ4xf{+b64cĮl3O[8X֭Yzyfrd6Gs&@-$E}[37 P/]@ڽ&ɯ^.z|̺-ŏlZ.02[iEuU8Kf5Z.x 8Vʮ%zt/b\P_ iPƻ>mW$x>hy_VUGtpI1OK\`xaùnT2 ˣNCƺiEE V\+'ꂧw0}8n@B11H9:qn2I؏<>4]W|'qI\%nOdW &v Kaoci67c(xm cpidGYLwendstream endobj 115 0 obj 4308 endobj 119 0 obj <> stream x]nGvQ/0] ă  HJhcQ3pjuUծ>PHÍf]k}?8_}rpۋ=1qO_=J Y/œsRNOI R<λ3m̰L?`lV#tz;<+?zfw&<,8c/ŤNoݽu0iΎx&)NoP^')=,Z~;e`Z9Χ:M#psd-ihht\Gq8yyw.ZdࡋV5v<v_%̢ni&$氎 OP#bGi] Q*Z@{C>χ/U>%ße:d^~6Tf#K~w,F1D(FN8'ifĴ_y13q,8Y>`\)(]&V5y7oV0@v#硾ɒ|틯iڧ%I#o'Ob"DlV@R6/v&yH}V/v' 1(5D&-\P# W j,,ڋŝ3!|c1'JOn&I=YT 6MAʘ{)^~ؙ-6h:ZrWaYuK/cb>t ͥø&8IzoagE @u^A-s|k~!4״v$vA$Pʴa'<6H4ݐ)Ѕ@M'(RZ!(m(#m }վp4 Ν%4as΀ûpI4O!/ŠN-j"9;= 呷5˜ J@ErG2#2YR19?;[IGvνh\ Dc#\V֙Fh׸$!rI ({_I- IL kiX{LjX6f,(PP-ڌ2se뤘k)ʫ|X"p6 shV5V+h0oVjh\HL\jF"eV^@ħqH߳L.-*@ځ_춰3:7zK?@^LyHc3Kλ]al[ + kw/e^ܟAδ~uk`'!-̧_t}^;vWv{iװZWL\0nvrO޳G@ 8 , @3Fʩc-tS=YERm䤒f) x(3P"i$ 7njx#)#s>ZM")|Jrq ^ =ƒˢXʁUю:̏ֈD(Sߧ?w^<}Q7Ufc!@;_D#Yl kvfȮ߱~#3?F&1G=|=gvgGo|.0@1H k%yTVopXArA oI\-֘!$Ha*uW%hTBd>{ZڙYIɅ̙'GeHա@IzlEY>)ZxvۤГ{k?zDZ= ^Pš;fF: i@2@`4f<<Iymq;Za藎qKH}q@:FmBG|q"V1{D~E8a.2ϊL{+T(N{p^;| 9~qbve~e%"}AkjV'n'^!?LYb]x*p)ѯ` 84EPIv}vxȇ/YoV=efģâGD%?>h.nzpul#NxT1V9Ba;!\6E8~jNYcX%jmTJɹI8ܧ¼nkhNjJo 񽝀@cDq]E`4\x̓_);lirIvs!<#@h!zjMPS_将qcrg|9[Oq+<. x4(٫[:sN9-wCVH WݒNQ)PGR%\{}oUJ([dE/v@NFDO ,sH.2mGU~Fq {?ݡ8XPa25.1 wYoQ::Z \#\1n6:K0=~:̴+>$+(fJѫOc={V뉰;ܮ˦tRRl%|qܐ@*T`2R#%-خl-Tz^X&-p :,sZqo,}I?z} Q`*);K_K9{†\&IIkSI O/"Y 7뒣 ޗ풳J#.qfalG}Lm!G?`]'lò" e#[2s#$`eO5m&+/`w0\ZSZnOU=)Ai/qb{i)ů@0DVlnP VZQX2{N8eN7' L׼<wpNJ^աP1ާn5#MAYtj[羇0cBZ1|ցE1OHUԺ-6Tvm2/ZWb*v|gDaM C3ҿLqe;⪧ ]iL@.Z_: Uٶ+0Si&@)P>vTSd\Br!NdujIsu%zDF/ W7I[qKVtVr/j |op4ƻ\RݨP}USCOه-1餱טOQxWxպW"o^\i'ewvl!?4mnx< C[j7/,X~]xaZ`"t;qR'}#fw(RoW>,e;JvKmW͔{>V[is,k5I4 8.^5)bPd_ىPǡf:ΖfW'lH5n6a ðu{ &W ZE^Bw۴c$ A7g1^L<-PŒ 5B 5-Ė/:c6%q#眷;,T>WAHtpgVN2-=w!nuBlާn~0qUҦ\Zl(yfcw1jlfgOQocB5ǡ&:E Jk9e6~"<`d :&'A1K Zb\-8Z[2?,k R7 /<_{cjʈV1ʀ)2;ќ*ur둬dF=NO7-~礠,~W0z-|vʞ"+B=. ;^(nH-`zgCD=M<fx~/6|B>:gY&t^c[7{Pe\E,+ט Z!a07~0(d-ʨцK*Lx;+p˴s(;Rf!VM #fM\kѱ)V718CB+kY8M2I$yh;kY z$&c#]a7 mh궶MjqAQٗL!k e k/7hF/ۍDXGI Prμ 4#9U*kGn |_Ԏk 3x{[!1H-ؒUTEE@]5~l2S&PSvIeΜdXܘqrG6$Wʄʼk bJ~RG*Y8#n9Y/KQBp5 XYT7d-MX[*&MIfW=b ;+V5,ŧL@y3ɵd1f|i,'B/m ]mRڴ~uHALݵbכ0ʣ9O!;w߂`ץװ`{BGfSEݨhhb@2R\1g3e`J3s=߆P0? 7{ <`lsncAC|}Sߘ,{+lzm{Ѹ^+7ȇ`8 Xrs*Rm).b^;ʍnM qlLq'Ē~zQ [V $t֝A(/`#>tw}$>-5kLU?j"hk 5qeg¶aܚdH; Pge°N&,/#0g&Pk)Zh9/|m9'&u:_óW+:'GɃ!npS%Vegq%Qn|t+ $oC;nUk_sm)ý!&rχ8ͷ* ShHACG> n]=>D|FټLd7$Q?W{endstream endobj 120 0 obj 7295 endobj 124 0 obj <> stream x=io$uA>W 1ޮP^ r"+ !˕H.JbW3.%,WU8Ո/՟?p*9^<<\88xgq&rMife'5H:>j;c#Ĩ׷ip^i}91+:*j $/m~[guuް{v2Pe)TK#|u5´Ei<?W;gzIkdtz<:sSַAA2h(XU*hNdTYy"g!%MjS݀"Gɯ۴F뎜bK^@< *|7;O2 "ݰ3@i<BV ϕNz F#|~0WU%}55c S84"h+{G ri'pdտ|eEM:JGD o8ǒٽ;%eW(xfs]S]v 3&"x'NSbW}WɽW^CK(8emT%V½yځ'fTPn![Ej ȣ&CH4p(gY!  CQu(P!Ivz۸أju`s:ccr"ϟ9%lJ"e!o; !1˽cn?`k)DlA2cKE(D6aN#^5۸5#TFՉv LNuN6^mO-ZkHТꐼP'@Q{DjȝW{rU>|UuW|#JLg䜗[t~'"PhZYcBXQ | k?`~ $k17*EԠcp+oEO>WB'ˊ3 q 6mF8eU-$hG=Ee7,a%)R*☢+䦸f}urtV/%Yr4FH|M3+R6\p~""lTpfnCBc7?PTOoJY]_3oۇҭ={,&ݾ Uj/q+AU4U^<LKriG v ___B3yћabrAq ö ֎h׃PZF]e%QfoyϢ\cZk5Hј"tVZt 4#hL;hOXk7>T;O <."r|:‘BSN7qU{1v >&YbZlbT(Xs8V}[rT" m@ĘiJsP}1s#D^L.T/ z"Ų1Yي^AsYM~pÚiCK !qˊu8]IW/0b(FÖE~nVtD1ف:|2q|/_87 @f?omce6]*Á[+q[xP_hPU¯-f]J`0g'0d(2?^YQL^1jww^&4@l+QxƉ7y ͺBhj~kx̋[?ObFTQOIdM]Ygu1ɘr~yȈfDU\*]m f>7vSppy>BdBlS&Z;JY6)ጝ74$Z lI Xsl^!#ؔӂ9;]&)& *VnA*$Ibې 1M)CϪhYqGj`{jO56!jֆj+>)Id2UP \9`t'42-|'cO52Ph4Mɴ' $H mymEXqI⸥oҨnO%f&CKu)>z{g ݩ$ʘ@2"J}&&۴Bp͚ iMY8*iԣ4m}$VC,fjf^GI!tD,0:L~YLDa.z{gT^oHf\P 0Gq0 )QfE+[R9(Yld3;Q}IoI3` 594-9 P) yVK.jBX×z?/R#k^?r1ɑ KZL97;jd0I]n3_XicD?/(Kr*14sQnFrʵ7mܕ:Q'zi1M$9{LӖ6,h[C¥B"}˙vouHܮ${v WY #5 2lv / j. 3Ink*;XQɈPuH|gՋV ;NϭEO>ܮъ&Td a4poq<$9R~>cq$q! f$XyG@$Aݛ]k#H nĄb2e3C}lD~˛MF/cʡ%됤ƿߵod/To{'@4[w `fC]fxYqENX1#$D7Xh6n9?\w .?7b+(LT#w6Ӌ[ XQs̾c@bG0$"P[>1MRtqF;.!&edfpa~G f/n{ԷAGjTiݗ#P {S?|\ۤiQ氜j|_3p&bC.ƳtVfwm 1_򦷇StBpFi/8d* ȋ= ~1+$W" ȣv=j#12rg/ "h=Kל_qԾ#%$cX rhltlUkQD5NQY?Xv1U!f>]MS hTNҶ1xPJJTb~8otnvrNϥ`L%g9_O@7 #5SYJaqM` ;)Sc m&5.C~eT#h`zk c%qYŋ%8.la|s'qfw9$a&»&3$>d?ݨcREY7<ȿP_5ὕwY%]5q%-I5Gó vɹcV ?H=ݖl Y*5 ;=D!WĨJN] s[$61t=VZ5"0'VKk ]S8?'WYXK1ۓ,9dpCEǺChꏗt-~@cm–HqmeaK,<3³ 3$]BcWNs߻P%쌧z%ONeYvv7۸ǏeBNq&0xoU} Ʀz7iu$F-2xk0Y![ƴqŶvZ: k8>2Uz|׶Q͕s۫ :h$KbmQ2 oB>}lw̉F/gm͟TLh[o݂YKʱ.Kw٤O^#ߛ r ^lkEH.g;|,>ۅh^A1虋B>t{9٦Zջ ep9U%zY>@,$żXb\w C|8YO-uWhV,M$Q7\_>ԦQQ Ξx؏ZwԎhgn k|?v%hfΗy<(v5ͺJ/gY$Z5[ҩ-`z[`l!^ڦ@6>6SP/|#{38h @*DAGI&FtK]cxQ HÎOc[^.O-9vtF&b<#t4%USZ&tn0$k=3?X1w-+hvf?P1Wx/xkWբK-HkЁ/|҆$!\\ӂ q^bvfj@Q^Cy K؀m VΪnt%*|kOu Zg.<>BO|"u07EfR6kcSAN)D'D۶[ߧ(+ Wy!eIu!1m4ŬedpJdǚ;=0ٷe[/ٶ?5C#rpϏzJxC/N@iҭ 8>xūޟJ3ןŸWW+@{QAW9(,mnoG!BAǯmL_'St^: $azᯠɁbGn MYL{ P8)` &Mkg[ 6dQD:i ׷aPR a~,!e$3i}0u.:K@|~> `Fڠ쑱}ɋ4 h=6il1:2ooʣ@ ȨH 'LQea,pkQeg> stream x\Yo6o3vnyH&0dYe[JVY$5Ҭ DgyG3O^|}z1{WG=JLbyUZĖvgR#g$Ջo7vOlي+1vg a6g۝U^i,Zl.;Ki#4:I+܄їHSj2v."Flbs]zRzrZo~͓^ MroqFVGJК ] :7uuefgtfj!|_~~6>|&EMnFm7] & b'$,̷Y-~ס3\tћ-blL/>ujjo. ZIdy}|YOG" 3YأX߂dow `\DQQtK幀Cn'ߺE8 J Iq&bqwrZBRiY 9c  -{A8F aiܲ 6`Q{rW CK=((qReRfotyXjI:ڻB2w`nIUd(C .-P+%&! dvMìZ.̬roY U&-ά(*ؗUyK5ɨN6n᧟8R-% y'/Øp5@fYfAM(7Z z89όHfKG QW;ؓ,چHCH57V#␧O9y}>'ұB(HK2qG]Ta$jiBH@g"]L,yy(;B)ǹZZq87*H[xC^xtHD\]t2ڋe =buq10ÇX;^ƊDZYmZe4>'ftYt8ÙD3OZ(S@FS֣m$|xIYװpi'q/V~ 6ȈλFT 3}-+~aͩ51!^ևƬ}+JVO[Y͗.Э1A) '= .xd+D4VRٍP,)L&m4hw/8XxgB)ʞ>TvgK  Ah}W۪4<o_T%&-& ($GjsJ]ttyEUKIzгZp%F[ iiÚ-ȜR'`*{k  ViѰPϮpb<{{%0l5tTQ?Z$lkA)RI$V~Cܞu`1gVn-ppZym$ӭF 8#1e>G:U~;N5=iYr;[Yh# ?(v }rG&Pq}cD-E&^zVms?$}_Ö85"Xu^JDdϬ.u9N6Ohj`/KܘҰ7}VA\#gGp>̬Xx?~"D~׵'Փ' O?zLwtO|K 躩O ׵x@S4At9 ܣQrBk|j߽`0p`s$ښ.F&g?L4X;3ArKCB-* KyWgpPV)δ #R ޤ `͸6,2=aWu emzf]x6bV`خGÂj] ZͫhrDxIJ1Y%j&7IYDZvxsp}G@Є(5kdЃSdzVc`rd:-[sgIx {B-L8U㭏BS!$:{5 mLy- G٩!=;!NgkQ0m{HΊ"Gtl}^6P>UM Y]RcQw`2sn/jjUB׹K( ф$&iQuhHP@2CޏuΐsэNE;v6p.>gw4~/izg6RFFP,@?8o]ai`)sg=4Җ jL $}Y=eiyH*exMúfFKF_^JB&F6ުCAƫ[ޭCASz˼:|K260̺нC?n176`H ̕= P t:men Xjg6g"?lTLJ`GӸ1d\ ڕ0u/yl&H$,ekc|,^}(P+`feiq L接:Xip4PD%V3 wAM).TJ'CșM);F`'?)yoX vj=4W1zBF :DjIMʤ <> stream x][oǑ^8opa-ֈ0, HJ2,2E*TbmV}Uuuݺ݊=۽z:HݗPX+QX] ~g\y{u]s"W:=Y9>ٿ=^nv|"V!P6X OO_=}U뺀-:,~Qy"o[yݪ ]z8J.Vrw_Gئ ^CPKZ#,kMEhʄ_o($n]u_Q_ D86 MNܼh5ņw(BҺłޜ^t㶋 CɡjXhm{c k[_/ @m'b4'NHʺUKۊFQ_ hPߒ  ]c Eiy9V?G-.u{!:`iR/UyH[3"w3\:m<)pEEiՉjCHEH`2x r3M٨ZwgY;U'x]!~_ez;pNq@aV_bAxl+,ce&p]*OSATl'QQ_L0M\-/8ּS1 `J]EHG@aIgS"3|$ۯzzʺPU1 e˺*v5V0ҋV VO&Bk7zc0EJ fXLX0q2ȸghԜflf:jNW^`N7D 5Xo@ȂTxAHY6" Y'Ul}BiPr;b*se'=6/#R)'t2R(@ i$t/I/}UJ$Qbф^K[Qi?~=/ZP-ڱ4p[ n " GCku R߱Fc W~k`"#+)}y˩,\B2vfEX۷e*bv* $c}鞙PHfeD hӽ^ 'ז>(aXt݁d*FNlOUƏbȓMl,SF \t8Ql[~4bIdNzSKS_7'6㬳)h#af1zh uFP[*R$r5++񶕥a*GQ&R◙KUn2ku*S!')D$3.mX$60s#a)giY߱IRg4l& O ZT.q.IPlVgo%FaB#0 HЅ\"A]JE[Bw"W81IJdayh>F?q+1XC?&Ynzd'yyfLˋq2:_ԙ0x>s!(qD:Ze#%:b:4܄;1q}&rO r2V [8Б }"JG{E/]&T]:yվ"-̫[+'HDdH z7%RzyJ}ۯ{ Dĥ - 4ْHXc#0DW6о\k&7>NQe_<$ x,_DS^߄0,dՇ4nVT H5l9aS%.I`ڴ df00,{j g9ԺL#`Enର+ mȪ<,Mʍr X -ScСP@; 'Y엸//1`C@+8DA O@ŷɤ~|2gz7,(Y}}{{R4PX")[SjPPΩȨ0:j1ZP5CEBdE{KףdN/z3ޑ/ GH>,s4=vd"oX%6[2 cn f78" ^ )~lt&8[CM1؍n#1.}]7,R.1Ѱ;S3[ڴm}|qi&.Ǐl =b{v=k/*< &o/Wx/{™6p7cvb@V}$+'$֪W ,ikPD Q`gd]ۏB+)G*B[7b7$&I4uTpE/֦9Q=U2m!ś/$n#z*lz-̷OBJ?yɨ>ٍQdDžӌ>b7q"w|oһ~8n1!g} M]' `6R~CH(>2^b6} Ck+_ˤv TMa$ƦTop- ==EY%q7)ж>Xmc,Q1Xl4 AhOU?]D"?y;ih v?"2(9f\z薰|E2Z;  X6G |ezLV~@шϪir0Nr"en7Sm 0j@;hr4+~| PxSlj+q<"uGl(}%Bxځ$A Cٝ}LP(@S=DT,/vʍ^~LmfظJpHf!O޾'}aQ ]h„C{ޠc}#cߙI:6Up9v43k%6nA nJU-Ώٺks>LmBA5x9urɮRУŸX2I E8Z18KDŽ_ yUmi$RuQsL0!1}OhL$5T* )_1 |/3f_ \'iB@Ci=m3?Ŝ~'aN[L3 ᶃG~nKOHb}i4 ۃbaˤ`+YXĸ_YFB$lH8xdȁyBu"AGi#ȧ?g>H` 42eT$N:&iV:z눡$I"X"\&1qk7JVxNK}C( )AѼ}:1Fn Kv.'ԡUzs ȹOg'~Yȸƥ\;9Gn];i+b B Z16?4 wRHkE) qni-L3fTسJ_'kɷI*,,y=0E2.RinIw)oi{y9F9Mmxʝ19XNsZ+lږ́i;hC@qrcbw66tH5G8t%e $a|B/זRolK89@so> stream x͛Mo6{֯Q{X9M[(ڴ Eb;N؍4h3rYʊNP 4r 9Cҷ=g__w'}窻Dzϗt߼8 *-v"=i,SwF1utp93|gjm S&0j竵`֪+0nwbxZKi7V br밁ɷU>2yztlSx=n{Lނ|/W`7r|z֝xewG/~ og}Oѐ`:JC؋[,| WnbA uuou{Pқ ^+6+J diϤtUAj3^O.GL')9?%-  >0eS*I+*XܟIhA}35(ƈf4Ui&exPQ7Y落&#ZH o|&$ 8ڹDǕe7 `y%qn-AAץ=rt9?]pK G!84qG6o~@F8[u,3 ֛ $XϞ3ڥMX=,ɧ), O}bRʗjӒ,s5nȐ#/,Xo y)ȵwHrU$VCH R!N[Zƌs&&ҾMbM$x>ҦЄU&.-%y -l:$V{&I_J&L&XJ8L8<viQjJ|f[N÷ry/w&Wčۢ۶]j[t>@ކT`RF0r<,CRKE̤$?čh/EXoF v)nTGiI:*$ךHxZQ ?##һGbG$x>ҦpRG+$ Shu|[[FV茶~PNrj<3 s/.b9F!Үl*Dqc`ȐpEMY_4y^CfEHEz-d/y䙥#o6Er͖+'(MZWSC|Z i~ -W4.XnY`an6s,ԎRO8zr )!r6ʹ 4.řXgx>ڦxCc,w_do"VdA{H:<wfeqGd' yj39,t{bSr?"")w|!_KY> stream x]ےqUoˌCW9B/(HM X\..(a̺fUg.@ ͞dM͗!dOORc1v*ur ˓lnoy m䬙b'&9 eWprf'ܤ栶Wkzuۋɨ[߭n/I}szJ[{1{}ln&m˵vebpYr`j\17f+9Y Z!XXRqa.ؾ$͞XkՇw5F |Tj9a. z,BJӝP|^Ͱ&쯙Lp~&=2^*X"嶯~8I++i7ةt$7WFlH`@087+ QmC3ѓt.Zz=9w(nr~e-̳۫TH];g2Epͳbq*Ynvu(SDs/2 K(<boo`1U{ (S .vdڎ +y#:} /ZJ _~4ONs=pކ%\.#p$)8f QT1 zU.̇|p]N139g-( U}KlWX$]=x7"> W57֩)+5Cjuv1I7*[}+vS?_~f?ybA W^IMZBGۘg3֭}j?E (71`ʨF=lw'y0 e=v+!%IǂD9%,H= Ql0uzN UfcrpeiXwR0JjQRI_:sz-;Vm5(J7smr汝c4 Q1Y+1F0A $9SMR;H֧U,W~o1KtFޓ] ?=o;ޘrOEB%uaQ  ?0j/F%%zSa@x-[؁rf'֏u1eHbV%x/&AeL+C`pX (>tq)]Uh}lQhP3xh<jCIVNww%.ifA(;x$XIPbr 7C)i@j[#@ -Q>?YuŁ cYn;U9 e1/ )>!j&X'ԮhvQYB)YJvk:5|ԭѧWW ^b_UdIEu䒉,wDvHB/3_b҄,=A% R fp6  @-ݪ\~4.坎x-Jc ˾;C$qTx$oY[H S+ܷpR> 8g;.`8޻hwr:V̔Jcn|V5`z2DY܇`TS9^$DHc 1,EvQN\9chinmk ˱HJnrSTI YfL0TMQf#uLLQ6!7qf79:Q?wRǵƤjWs|mQi%ejq"<&EuOQrDx;[a&%qQDFjV.|o((7~e(yW3q-I?fd>rR%:;ޣBɅ]7/!M).5EWh + &KDAʰ Β(]Š6ԙ߀g }U7IJ(,Y2(>:"}9rOw%F]vô:jjw.%ZG/bFx6hW-̫$n'2[aGݥ\dHj.UaKKm[!:rTcJ'8>J/o[35^NF/`WrNB!e5d2:UcHVM%i"=ը-[#UV%}~Ts'gg с'qcT \z8:D7a%o cŁ#h V&[tP7zݗ+OKcQMLUu/G2?\3_.qNso47;Z20`bws/},#)Bh`|}4%"/GYܻzV)SWPn,,}(1XaK/ʲVkKq/\Ն\9vNJe)!_v5r,_+K)f-)e!:Kc퓈 p9|To8 J4]{cwXFכU"˂p)8[|S17NJ?;kkǬ9*&0 }^{;5w]UЎ61Vk;- 9V̭b۳f_C1~qtGl>)E!MhM%|7 y yCZP`&R_C'FA9aҵ7wH!zBjلouQ%0)%ʹ^22CMvf1V XcgC}UB~.E6R}$pFq+q~0ٖ`TR\qc (_ŻO&>ks l~pijgJy],Ǖ >4]ˡk2}!􅖵C$(c^$Wq?#5HL' }WQfgӅVō|.(E!ϟDVH;Ƿ&~g5''Eb0B U/bI^dtu B+a9W2i^ĵ ^px0Ԣkphfė;%G:U$Ecd^wR+.5A\}$EGI9#s/{S I /=;`*Z劕v |Bv ks9Xbobbx`SFNLϝe 3373;W:8~q Rl )"?NJ%PfQg9YBə7g]{ħt8Td5i-&'z jӺd1vp(_Ю$xgV@ܶ?FupkvQ€xƅuڬEOO 2 R#ہ1֔^ 0qo:-ߊqrOyZ!!է0g!+(<!}ءê$_?85<^RЍӗ'_=7Wo>9qſ?6:?fuù* 6L,`g/e_ Х =G¤Rl +gWw@F-,(ؚ,c ,e9gV[ekٻE'"Q ++?D] F`do4OD}xnV 0K2X{y=ewƈ팑7}ޏ/5?[RrC" c~2pp"Y3!&ۉƣDuv&0yI|JO" ,^HNN\o0-ޫ@R'[)O5bߜ/endstream endobj 146 0 obj 5850 endobj 154 0 obj <> stream x_emc:oӝr/'C83rebV̓yKW9,YV|{mTn"A^?_o }5 -xZO瘟yWyV>XCIsy4+tWY>}ϵԵ~)1|nUt~))?٫>}ϳh+vW~Zѿ?~o>$o?O8T&)?cIOcNf'ĴgyYɄ<zcdպkw_PbHOg##<9S)8 f w75FH^v#nT@OnükfaЙ~fW߆͡ݴm(l.lL~8 6wR\Ԍa&sz1WOu[n=]X=GZz.g5C̔< S.pf96z531yi+7L [nh)sUi#X?Grc S0,!9?4;5F>4K*i瘋*ǔѳ ΆQ}XjDZ61-).:*60uC)>AstkqSw?i! K[=p \iU0.B}!ȆyqԬGb)̍&fC}5 K̞ R7<1 %Pu#sxyL(Uˤg3\3%6"Zl)aN)G,OԤI{:[wyq=L;]bvE1SdN[I*nIi sM:>b[+ɭ}N֩jbV:\(Z]TO{sWMM jFok̏yJ{K rpk:]at ̽t]t>_olȱMߧ*jO 7Wi$-$U!:y9cĉQ'W-=sbLT1 *=\Z>lL;vuq̕6g(̮iVXSVJ5&٧h4 S5uz(P;4T )^{R˜S 41)+ ɴ:ڬ0L2pRbFsͯC4cr2ej!-AF͸0Y.в SDjIbHyN` k:sϽ0@o6ձq Dm[ ˎdnTI)` LK) *Fi%&!{)Lr~'(9+k#pE6\g>C_#*be,Y-fI| Ka pTD]B>H1+0`HpS̶$THzI[fVGJd OQ &5j9W=OLP̅bsEf{%1{ gsдHZA qtȏ,ls.AOGF .]YEhSࢨ3|t~uE1E_c 8AlU!KL3]3WΘD?tI8vƒaKsp-8ޤF5V0GXKp׍`0LUU:Xq%v/vs83Le1ʚ^pq8aZ5CYSu=V9Gjq0ІٝU5f͕2rQg5.c.|t)'z{qF r1,0^lPT:&Ul{PtN9&,G8l5zPK`Ls]mu$um*fbJ8Qe%J 531 fJӆ( _سmz՜ebK77.I\v0V&J&#ګ)-LiHpV2lU05_sVEK ~bPCJ* `4U>C$ZQhSR<ÍMU8C)A IF2+`Y,<1c\sjp3J*h AQky "&R?*OB+i2rTT8rjY4xڳc:^AM9G]SxQg8t[fDi"YG‚9$&rZ&[ \ۃ\OA22.[7alQص1V;k:#Fj</r&7,;2qFԳH)YیtNɌxʩLIqˌӔĖd9h،dڌ\𚑆Q[ƙ݌d7Jv%ij`30#9׌8 ~RNL9>\u: <ٔ4xMɅ)YXdn2lJNnMuJ6E$bMI16/9geV̦ZpKYycuB2ژ "{~F S&? K6W(@gAѦ gޫ3yՆ`CL6,lC\`V FY~utFѣ5p^]3E1k_8";ٍ[GmL{|Z/hyN Ӧ+e*S LaKDžY3#fpYka6^"Vԩ$IUeA>Y:- [XQ)9dfb͊8`Ħ_b^EE3̇-H*FL4qM\<SoSlk1kDd{8.Q`G5eQLb^mOQܛ8XU`QԥQ\J0k[gdžK햕6FTu0H&8'H)YDZ u'SŞD _P g 76 ~c =PDɔa3գ9[%+rM2t H=) E1G#yf98ќ_0/ &1v-MM{&UF'nZhTI461bD_# D+ß2oU=;ӟE^H5of;FU!IpBHsN\4,bLy&&tղ65ȆtNRLf0V%@@0:5mƑjkó#/G=msɢv'AJYKT:LT:1Y ycW$Ց5C +/M0Ђ a^:|; J*WSʓtTי@7Uիt[KQ,p6L0PϺhgVfvKm.\1b8ڠË8`q&K Q7ƷiˆTײ0&ւ$I,mՕC[k èɲZ^q# eKȶm *F Ղ1F& iɳ èX-X/OP- +Ӵdonx0FskxRh5JL=u$ׂ1Y 8m EEnoƨn-Wllooh߻c|q%\t%QQZJiqR.\P7D8a Xdf+#o,Z8c;ȁmbl 0ay-4hlV&\kPp+;&I`yJ<(:a6/a6 FLtUY/GZ塖5J/&0Z#Gz+*&\^'cŒ[WpnZr{ ($PB B`c$X'!IF]_ ı% R*/DnJq E!IF-MTyv׽*gK-WȍEwaL@%@ZJhz4ŸzR@[V+V}{=v{%Zc,F k`qƴ[Z0w7БL0kkA^F6$٢Go'`OQ͵2hu1+`6 \ +8eugw}'nq*rȀV8J[ƈ=*8 @r6pSL1Uyʪ$׺ʡK?LL:{#cDf+9<5f#FL@9SrX/y\rXB Brq,J"^Dx jF0'V Ԣ!O:+)ͲVI$>+EM1N$#fBT #&hǻ$؂\[fF0s^401VrEɺZ D&M0ԞzQ4ӄ6`p]pLlA9CHSglo&gft ͙0&<$M$ YvZ+gJ [@H4ݜ~1)YTSA}K%H2[hDvK.Z`mL 6^`fq!%j nF, <Mtj2Zw\{e2[%sHir(s횫i9e۽S]Cpc +HϞFŬbbVVB:p- m?v3ބ.]6:=pPN6lUW&$Vc*6/qY:G Z ]ƈ1T3h+%k<Y0'坓gpNV/ ۆ& )IT5fD[| gE2^u]9w97VB V5Q5+q;H7f% j/^x#{1YeMŬ9j;<@㥟lg 4>˝QLZɣ/41.!_&p_Att 1H"LXb:OX:s ]LtX&of↵&Hy\G+ncc$Lh%NDᛐ[k*yAͣ˸ae F1}UNQ; W 쿴ب (ָ\pt[nHsGJ+BT둼I}_`Mۅ<'Y7^Gsi^z+Q%&ܜKĂ1?Lpb |sWVB*~UiH{{ oǐ]Bё@Ga<Բ}[0=J=-Q`x"0 Q*,КFNdâKLUnr+N=G|buŜt~2vOs+ʏu\_P=}gtNsAn>:ӹb5\ )C\F!v F D&FӦdTċ#9DE=22}]dxقcK]++UuZ*l~9QI*Z0x}A椲0`?"ұni:S7 U_ Qm!x+Q45` LWX!Ȭ:)n ᤸf)n)nX)n|RXSMp୸Ƹ8ͽOS^VYbUG^q/RFGWv MOY4Sfƈn0Z7hu9ōg$h$q`JAU ^0Bun*B9Q2?ug^#xӢfU7WW"VO?"SOl}Dg m:Ob'ex)lMu9VV(?0j~&) sDnY\O 1ceO 2ɭX/Fv,2$e\:f']/eˁy^'fI|#29VnY=TBZRY1Z_ZusG$ qUd0[=q?b;SH^@OۇyƗX0FUJW5<ІyԒv`CgT_:^+}W8xŅœ-* a-4FNȍ^ԜɍndJ[X[9[+yx-iu0ˬXzĬȻvÎ_ךmZ#iF: ĖB6t&j2!)A<넇up[Տ -thb+ I'9I{ZM QUO# ^KWl0Y:3 D(Xn# 0N8©5/EVCC"A^}-*`a%LGbO*Ō\ Yw"b{Ysro(6xC2vBžc|pq* 1%C_^M{%#f/+C\ X?0\ߑ_w0L1XΧb2~H7h\x͹ty]j&y;n0q&(ݼ ج6xʍi%$"W)iEJt: w^]w fo ]q/ &Œ%-""*i""έhN9(B -l|sKTF17oPDDFY^Iz f%@0 k9Y\1&ޗp5cтQb⫽@fޘ(4 a @(&Ȏň Y,3 ےuĐ"*.{ l׼$ DߠMW Q*y)dJhו@ҫ0[gfnȢ\)W"8 C^Q s?.8h'9V$A[ q1rH%EatCwiIW]ef|9|, bjJ*WքcX0 W0H46:$|:Jl\љ[p2Y1ZU;sc9T8h! zUv3t&\t L3a>Ǻ4?>NfeV":CA9LZ8C޳K/`G! azm WdurX_\fNNo[H6&<*}v >@"!,] nᳩY"Y|R0]B U.T.O%t ֮ Myc^V\m<{Zը Б]KIIowx78a(nS6nQҳX P*y+Zlx1UzNM5U v5ZⳍmH],>Y#_Sc\ϣ]^Z^NUm {*ƈ-,4>*gvv%:36 Pbzym۠#l: *#V_,m"=+Q[0xB1iyrT+Z7y9%Ҟ<7T{Rz ՠպOQ6rÈQ(Q=qnvBql ݰȓzk@7PٔlJt6 ¨-Gq(A+1+uy# Dˢq#N9ߗe@QpE|cUHB@ 1>Q +j .XD&DT|L' k*CD\`JM2Гt!$tɿ TG`io"'8Wy#-`ߛ& u6K\2A؋W&KTX0S gg =%PAQ=CR @B0xn Oj-<=|;>0pYDNj4ŊIIDd$kEW[t%_>Ԣ_jdR:ӁA(yJ bazuĵqy`175/aS)C=M)9>dbv%f0 !|,'Cz ;MJn=tq5*E!6G# 1ȧ Ӓ83l]7 /Ky%ԭE"ἃ@k`vF|-h4fB# '8e0]Jd?BC=w]}\S:416C"NWQ&Nf}-CPN(#i+yZ0gh 8A^)7Y8m=Jr Ǘg/J6 X?o&uda7I2$B>DL& Q󱊗ZcOU)vɪ+%V鼔URS1"`,ijʻ ep뒫scӮgQvo),ap<B{Cu0 0AO1*A|[Kw%电Ch u~3 &\yGO1kF!\Klg`"bH\6 T(4JGep؅eex+'TXB. ɥ3H %nJazYLl/ KrDYr;w$!9A^\xnDl>0fgrK5yVdaЄ x}S ̾(8]mnohŒi8(Msw4A=l8DWm M<hXQxu hυ>aZ XM:"h:CJGO]pPєQy\:%!xU?qIOH xHdx0XDrad_̝[Xj Mv4H3PCv4"Yq`#wdSM!pٷM0+ *.6@?QH7s[vWXjnkQ"Iƥ{FoL-47Utrd(l@Eux5 U N˼fwPF6_l!u'rV  e >gWkH:0eqݍ\\vƘX1n%oLT~I-5xEꩣ[%{akBLfRj C3+o.*;8mD wvadssژED1k|IEN_N}4ҙJ҅LW 2Ѕ ]핸os/ƈr\1߃e7OGf{z)UX6RʮJVP59":I9 JOH 屃n%Pɾ]hmDҧc,* R׿b&qVwHEO٧,{99zT/CU\%(Թy3 W:F􂗛gc̓KuhfYC<ئ!nxxtUBZjSB=ƽL2Pr7DWv%̘ׄ\XE?"i1C3->*}bf%ੌય1nd@mL+<#^PuLJagF,5mٖ.W~|!J8ǟ}B4mH-9 _}sAH*<a!DV>~\F*wUkjlE++2׷~|jA`)3~OS3֣?6;4 )5ק~M6]gt$k]D X_?s67?yh(>HZ.ϟ+=F+cԬNhaNeGE#*O1-,~-L(%F#ȯߝ:+> ٸ)Uk`/lIUdJYU/$ JkNH߃?Xgf(8+N~-6ltcS<[i0YMQeS6}[ޚic[Lrq\\Q<@9zBb֯ 5|7֜{#&t eR$*=F!Q;Sj!X4ORzso(≋G"_}aWkxB=uJߺ}C 'w8ws䳽sơ9k;1 DWU'P?ͿV/Ęe)[0bاnAZCǾ- sE pY+5 ?+<SnNK=?P?g݂r &z6l,YL=gw=k俸"ǟpY]TAE/1wҋuC:+_(NɟL^GwqZӴw>Emֱg/ >5*.8S1ol~{qG΍i1oaS:$7{Skf<α5x3*Sje==.x i._\.w,?=Q櫴e>ynUxK7qx޸w̳ؒY#7s|r)c8W tMkv9X{N&v4)ο\5_w~kr,sczcvYx`u1>8ݡ>qNwE&^tR;_}qܼ_BKD#/I w&G=TE_ڧ'F Ĵ/\dҟwt?qL>38\x?w?sjpK7~v7Z+_?a˹7S_! ҋHMTGvV1vX/;ŧ]Z>0>Gzb?!#'84n)ʲ:.ie'#9Į_GW!~v}{q<4ܗOG~>oݒ(1 ޼ng>Xm+L{N/Ėaky3'D=Y_NO6VZ֘לּv~K]\>x=|ũN8H3~=e?Z+E]/ގQpE^?Ģ˨;qm~ZK]g\oⴼ͈97"=ܗ](w:%N[`E=ʒ-jK?bB@Prve{&ОWHh:8]ɎzAqL緟-W1LgD2tSN':Mh?fA%ybi[wԾ䁺Rzwkz|5S ;ڤslOko:{vgҨXMiqk˷\ztk7)zd 7MZm*(-ؗ/t0zp,b^?y vt>)Mp1?6]tَ5ƺ"u;Վ;LT㖌pގ<4 HVrےGIR.H ݍx|8b*fϯ>u-#$̓+ڄ*T|=;lX\+_\]^;rX\`wA^>L{cC [d/|\%\rpn n 5TD{;]؝ދǝƞaĖ2/0'`O,FqI^>LO}Rt܍ƫJQ8wBhl/}%A}5H~<s_m̿Ugc_Rj9mw=S[0c앨淧@T#!7mN҃o\ζڥ w#5]?1aNAXd~O7wrA'έ{y??1? ݄xXFl(.swfqLy,cl9yq9{V &7yeAA,}kv_9!aa;y8hq7.U\(;)']EP׶凿?g$:a>#HޚW˃7doVqڟގ)+b_̥Rsq|Ԏ# GZEtJMUF $Raiv^d/6aU7.IӬNj~gOHBɻk}Uq{́Y99w]G77ޑyVO8ֳm]2=|)oJX.9ۼ_83 G8㽮7%v8}qm">lgRV-$'PW_</T'ct.-peQEN Dф/' gh ?i:hp*z-9ڮm'Bvؿkw\9K^+h _)_d\>In$t|/g?_|7}ÍV0\NA/貹XWn~c(fUbr௾EA!ꗢ٬Qow6+4v[QXM_!-ŽΏ\jej!f]9Ej^(ޅmhߟC:y]:Se 'D|y%qV] q[W9~w b]Xj5xN.*iw9_Z dP ro ja ե3r >Z>_{㸼uD*wKg ߷GB{CuZi֔.CZ]'rӘ00g߻@g| endstream endobj 155 0 obj 23027 endobj 161 0 obj <> stream xݝr%u]? feR]2)%DH.f8&{8=#q{YspLBUVVV×YZNjWg<ݳ\?/]s\}rj[)HI%Ю\pjU񴦫=vsZ;|tZKm>mVK\j۲]࿷K;m8R缆zQRzJ/iE_vr77锩V7TseҸK{/{MUyߥo?Y{&}J׫74_#INKkHkCܹī|7EWa •MK^kֱ*jx_C^e)&XE5V~+Z|Js3L#{Jz5^O&UIYکIJb&H li]@8uEPMx5Mҫ%V^ӪJ=9.elOdK^+Jc+.۾d 5ݨkRdK^kZiPImC1IzMjyZMBk{>:iLd솩KzMU2%^S/525ݵi%s7N]k.z9OitqlӴx*hǙkjAjybM[%0ئ3S%o&qj6=Ǻ|;+UE5oQPŰRU֧__]~sZhv/i{tAUo +adH]}_zWoqכ;D7JפYn.a]V9^X-$ES\I]# Z*mFW*&P}WlF^!+yCT5zkp?,:HW'TgI=-,Jc%L_G"#HB*B$N^iBCL}**P )ԅ&t+aIK1J,Z$<I"i"rBBR#HxKIQX6$@{ȳHh.L6DmDT gx#,VvEnO/)UH9SP4A^DroD&R 6 ʫA8押f㶭Iϋn/$jHcbj 9(~腩Ы촑 gV&E^D<5`4\C󄚤$R@7MH)U%Wډ?Q*I ,4~׵:uFDд*V%4/M^lXmLT}UD>Z`xʰd22H˕ea7Xܥ!,7Ag '5UUD^3SGOJ27ZLMbex+G⨜*KPQdPM %DfXu`iś,M$RP.lPYYd LpdbTc%)%nMo.Q WagfV+L@h(RF&aX@Ұu%VacV% # ēN<)OX\̃ȄIJ&EuDԭfKjtS[ae%"߅Wpat B492 G1y6224ܴLԜ`gřwΤKBGѸ <MlÔ%KҖ&%ATDO;mQGB#c(p`؝VF6؝u66mdY-#ѢӤe=?BF񉔊D]խ%ȎNc[%/9Jڨoajw.n0GW Eu[[} VxyF}͒ qEn5Y%/K /4T7edo.fk5҃ 30yq3xaR ^ږ I=:F-K,7(Kl|yQ$M\o+PT^཯r Q<&+ϓ%0G밎V =%,lHxas=CaH 2"OW"%K(Q #A*HklT"P'L& #:tӻk z[x\e+$&4 MEc K8M@)|c^֤Xd^";̬TdВX,C+[*A{\rYw6;B UEA\Bk\l 211ͅI.V\뤗ZOR-)IuDYHa_b4RuXCp{N$-YVA HiGt.M$̕MAس& &ݴ]#6괎,NK؎QJTVF$El,„r*C LɑA5fiM 0APMlAR-`arU^E vatlbT*޲dC9@.>8 %pd YDȗxW.lL+k&KqM"k5r@ ]kN5aBoId!8Ɣ%b_,+HEK2 zuL84ONNW`MBj$7#8k*%NlF1Rd35!S`O"ҏ%Di? Ih,-wELVƒ U3J /:rnPtFGI,&{M}*(J]d& g]8gׅ͆h%mU90(1 .uºUY%:WkITaQBT j5YQUžp"KK2/gt*I8"wb,idK"Q$\Hz2;)WIJp]^(KjY7ؔ;}aS$hL«zJ8vY#ٖ0I8߭-/`y R֘\MY8[u`o)iJ C4 BĕU/ bLΑhIGPtSSX`M$ρ &2xrWЪ8nB $@h071k΂'oa0ZmTsE5ȃҰEIDǚ9A~5hQ,%ӁfoYRaѐTDԋ*k"&5hcϤՅɖyRfg:rI޶)UgLVlq$<@ QC% O9^qI"\$ [ ^f?C Nr!&M("eN#a(&p TְRp\GKhp'Vh*[H&4WPtsdY$80$ a$V.qHO sD3 2fY}$$5E2m;YX-Q+T4dيLp"U I#6RQ"K#d %3G㏪:Ts0 @g@B0YEy?<]-5akF ߗ!HEL ZQJ H%JRV 9DΙW Ҁ(EJ Ci)T#Ȱ2)cHnN;BJ.4)EIrxSH4 -rdH9*flNCuqqHK:jdlGF?BQKR(t#8B(}dRqj#Le|@>G gn/#֨$ѹN)h4t(bFJh>WKA#HhAm344nQAڎ!lWJI$3IdiTkYѐV҈$I]%JI#mWȒX#8Ѣ݌5ԚF%JY#NV-AW "Fp)ljFH6$ 4oIe X#LvDbdD)j%5Q; CX-Qug5j\Y]蓰F,h'VԅPkQcvf8ȢAm1'FpB- łG+4H W0,K mXPo-łv, :$䭮X3T,\1T0N I`@$fTF:RA;IamV :n }c Q" PCF{ ɺdƮrʦ(ʦW(Q"M1lp6Ck(gӛP0wlVWf+lzeӻ(>PIԢP6}eQ6}deGS6>CyeM{F딍slF s6=hmĚ5 l(t gW%UT`¶$Y5iv&G)ܲ4UVe[Rexs[Tehű ngpKr[q|0ތoQj|}[|V9߂SX[ ny-| *Vj p1.bt5ECoIڬη%*,f ! pIK ҍ.\0sI Ys:CW%oʷt T2S&do!IԞ-$)QUh-F¼WX*6W츊cJ]!1\4 WLUF* vU hh<9a "*}&y*F`hWu::b{;T9pƫd B+k+n9:4d IFd{`!+ۮ:wu~2WaoPƍ* IlV)B=ÀQ>ث+b;>J]E!T0IPq$JA T-j6 `(2oJ)jr:XSrR] QHĦHA*N}V6C*phe9L"kΨY(ΨXx ⌊쐊N{唊zNj a 4I5;Mbm~딊d)jF9)l S3RIَ1J=Rj-);ܡS*I2He,UTrJ)AgR1)DT2\v}ޏCrBsHNSws*a;Ʃ4[!Sil8҂XΩXs*Tj8q* GUh6GUwTeSϩ*UGUjuTwQ؇*5 8dR("GUK'U!FHҎᤊCNXb*ʼn#U{JqDHpG`ɲ;/aJ*Jw^*( R#U Q`CINAwK*DQwɜL%H&!D~ DXt;ef ߂YW9f3c %HzA#'͌AJzWf7p#JF%}Q6#J2?#J ѓg(q$}+O$(WNOb=aNOo0˳$B<"DET1x"dGc(|` X+(<{Iغ09=tv=B œ>FN{ɉ漅M3O4RNىf Q;;0v i55-bi1&ަx?%,M})?vi5z%vq\+'lQۮՂ)LA!۲do_oƀ'E[AkRi6n8f{H=,RyrX_[T`7cP֮>?CYrԴ0J];V;bM{/}/aCYg?zh^miOc,톫y׫}VYXQ2c5%#1/ROD=q oB_ ypҟ9 *>~|udk}}(˚|[!ik)oq?cV.|Ai fc\Qk\_; E`WA +P֡7rE~W0xߢ; fX<ۈ,:3z; RQud!{L ,}!7]<Ǭ:"5ԢGnÂg8fY˗vB A]3x|}c V ĔOn z;3sk j]25Y&^ۻ91ϻT&^6:}O:j`D0'qeK|=`FUBw.ۅ tottO7Twx;n}U[ˣ6<u;Q:w*.jsn]]bЦďdM/fB}x-+uђW01#ET,Yb ;S{.{<^| Lv&|2;X4 mX/\*;!X/=g~_}w䟮³g7g/;Htm:?'&CvC}'S>ƽ2ȱݝdžW/)nmxZՁ@ܟ5r~Czl^V0G1X#^,^j !N^rʲgG?zz? c9po ѷdzܫpyt#I~ oXHhx X̱fd $ 3$:Ci){僩fcS}1.6|!(<8U w*˫ͳa zb]uIvٻV{tEoqVܵ 5gsM/{C}hὺit~oit4@1zvMpCwAjj \4U0sWʹ>LmFkTvimvOcUmXҕ$byuH=\ă8~i؋x.BEl n ,y9BsdSnZ?Cs>2`^0!-'ƹgj]nN\O'֣6cPz:1}(&$I"]|_qUg3)׺Pǀ;9lQ|9P}Kޡ8#YC>W]K{}> m vN}uMs$ r:d 7)F=ew+07BzqU ]C/AI ch~頛j7&M5a?]mkـi3 XYw͚Zr j`/{"`nq>~ބ:EΔ%Wv5T+ܙ/#3 #7dDl1OY~IYxk7G4tJ7Aü~ԡ}ԁ%NO] vhzzSqyw81Gr{/kbC?FPiA)cЊ)*ei!޶7dlՀ& lVm}zt(@{|e릩)5m5~XUs=X?J> LǐTǽy ෘ^sgO -4XzJڃz? -`)Kt00g|x(0s2Wo=ND!C`#|R&|~^1]K T_+d|Gpu:t0%Y[|*T}8ӥMl3 y/ nTkKqh%l8eM0뽃Es^vm`|@'9ykHQfՑ]deIzLӮ?vޮ3^vbI gOݼ?eϓSicsWmOh%θq_k4qSp_p¿ 7e_H;Z q;>wFKwE Tc_+mÅf5N?`&ݦz*6rAV,a}(L_d:p{=791_S#I!0MxG_^t=Nrh9^ZfI1Xr}|ͯs|S<QTdhn4UpfsKvh<"2ΆH7K/lC)qXq=\孺xwv o9rige7 iK\NygO'2Oe,=tq^> n) 5u"N\C5⤤ hDu8}>]Wy,xq8q0l;Rr"hL 6M> N;J9L 1g hkO5#8žpΩmB`ۀm @Z=4'۩CU]0ڦA-@4/م8%pA,+t99yH]}9RpQ駃6v?wcCLEH>3^ #0>Zs{*r憭'MKg8yWM=gLOHS?4EQlmC|NgY/,/5k9CgUx3 ˥b_PKyMB&V=Y6f}"㦥qQ9#2ySɀ<y [_X97MaSs<$ZhX‘pCyoP sɳv\t#jLrBs9KFi|y9l^'bÌc25e7e<-ӵagxE8>sL{ԚZr7ƪdrݬl3 yY'yv ^Ӡ-L=r9*̒$v| $ZHVwκ'̩;7{@[N=nDOy'`pC??s9v'j~oя:6H`g=FF3_J{A}7*ѳ^5'LSMg)_с5N҃cqK3J=zoJzAOlV8: H@f9YͬZ4==8-rQ%pYJ{ΐSQdˡ z8C-V3u滩Wðhx݇g%߁#|r%K9r W\W?tzˡH_kH#~W `%' +U,0Tbg;_G.e?ݒc~{A4 3AE|&|~N\Ϳ)0p1;I׶b?oP l=foN윟8@) 'z L8y9`ˠ'ףwZ7Y`o;%2t_/mA!5ua'pFj= ϶C˺|j~9d:c'ceg1>; $"h*~v.DDZ%~z`|սtްl&o{PkSGܗ}Gp]o=0@Vl\= g,|;dxoR4M5ÔwdǗ 6kg!)e-]=L:s* U<(%|~*Dr];H)endstream endobj 162 0 obj 16461 endobj 167 0 obj <> stream xXKo6Q,ߏ[EboE6Wi~G;$EP( 2Eo8p&os~ǝH6X`s;>8 *-$C]Z gz8~!0gƷĤFw0&8lwb|LM~Of<խb fU~>o5[AT3/äfڃA3V壃d+?h^?X$̪̉' >KFg0&Z%ZZ* 8Kgaʠ5$K&6kkbΨ5Ij˂'@ }1BҭWւ8iVC%t))JlxLЭnPXJPh^DW^G P 6m/\qcN-PH^vmS4?)> stream xݽ˲f9n.pO<|Ϝ)um~X 9B k*Z)m_;3V8NTT~.^@Asxρÿ><_)<~3yO^s /O\Ks<^߾o!ۯ7x_R*bZ2(oWi4bcw/9oXHo~N]緫_jo> /%9Ud?oy1V9훯~Wko~4g~leVq)i_j -VjyN5Uk9W;*+ƛܮѹa-%!6J4o&kR\s_f?5 /ysW>Ɨ{}ZsY^R 7s d+}h@b-Yg?= $, C-.`׺8$RG|BCr\F]l/%eF-Z/% ҙ/&1ҫc}j:!FYk-%4O_z]ȏT&jYJ(YhO3qdr iiי_Q5e}Zp5N^\]*2WٷC{ ՗&H.ҿsW`bq AlIS+[bJӄAK[:^Fo.k)^ЛJ4hPʃ0pNPO7*|V:j5\YJ̗ܛJ>>Cfoټ%|]ǻߊ͖N'?QjzS0sjSAv:$Tũ~Bt/C;=NTBg[qZ5>IW)PtK3Dj ?İ[ke|KTB!z?Bqc ӟd֑$9y[\Wݨsbc"++S.5B,FZ3"!MSҩrWd~؏p6嬾oV _o'[G"i}B*ݺBMolG} ޯzB[khx~GR=U1^91&wE6>hq/ulɅsp?:[V?;uCt2ߏo\.{i^P7kzok?_*>Z=دVm^XG$pe$έ^N L/^ܯ@Kn,j|49Kt^V1>+nѿ :~8n|cHC3Ϲt{6_ze[[tC~esѪjI ?V[Gvv eR3mjKKDRMffs^m֋pm1=ھAuoyU?Gc>f4eV.Ɋ?RHhoMR[)Jc5?^ȵ}}.I:i'Jzup7V:Wu-sEZt=V\Zzͧ>K6iٝex ItX]?hO@;cm'zn-L|B S{Ж,uˏߑxc%|zx!>N[Z*|''4md~dorydK"ܳrx3>DXlav4m\*UD/eнs{-$.a7hՍT_?P5u[¾zz~¡sc;"p+UYpͫt#^_:ҷye/jyY4_5zM9i =gu~ʲЍ&De[o/Ś%t ]Vٗ%x}JBW5rs2Uv=Cײ6r6ᫎ1- 2K|{H(pi(:}ӱD:.E .\ V!b ĵr.EW[Tv2Ui/^b/%:5[Y 8Tf]u}⭑z&yn^<fV|rz$-#xΕcgTki,~]ݿ-z͎W+c@j3@sM6ΣUHJﷷ S/i~:Z*!+lk5VrDLlEV<;zβ/uT^Ѧ\o.yz"_!^ǹtxMqo8!C [OZXNOiBv{u~̻, t8P`NY.:>ۋOq-(Z\UUSW[18M'bIOakz)')gez*M6peq'fzJq7'dOx.yEtTw~iNKzk|+U'_DӱW|N-9GWϘ[w k|8'jXޯn>o?_~zeKۛ_Gw0oߪϸu/k_=<9r7_PcCݬg-̸W 7 YDVB 2æu'7DeJ_p>g8E*lەz~^Q/2û.d]6Tr]eF߭W}TR:]d}$BWD8v}?)j\Z+"+ބ6u-k+!eBK>[^%?=A6JLW$̓^?*SvлZu*־?eŻW_x?e^Yy&~wM.DjAY߸&.=G]ܵL׎}ۻ.gh9=a~/,ttUCҵpA+5[y𨖼?چc6z)vG6Z g_^OliT;4x=%_ ŒΤ5Ȼo #BEv9=3^|JAnH%n{JDϸp|f!.t:d:(ҳdʿIm͗aC<>{1o(DG[~D`z -[N?ioˬ , 4q_j9?AV;"NjRgzs3s[;@秷"鳧Ou7Q=<h7| 1Dc|g݇-˧串.9f^yElNm],{rGM~HbU+N;uيVl{]7Ʋv8{?:K۾4>@}It2NFA< Bo!{2~(\7w#)/kۥ zmy3ÝVkkFn#u΋wWKkBV5[kygf/ nB^Bm.|Ob9Vkm_|ɯZ}Z( sg_qov mc?#ubyALaz ror[+)/9_fL^/vLW7N^Ne G.9opYsBec{ErZ@m;+7珧BԬ FeӒ]}nsk ^?}'?4Iouߙ5utUNΙ-r;s; me.լܔtؽeYSMt}b0oR: ]S%p3v\м$ݝr̨$\Xy}mYl@(so9?[ Üv|>-}?LPbdQ]ܰ)]cE ^8RJC4thwkH*)VDNhXߥ_<:mR,wNIJ!䈱 +ʼnHB7&m͙GdڒѲA:D73FQOurVwpP?Qyۛr>M*GWx&Hh{VtD$^mۣnVob|<\C3S坉[?\}ut~9E0?Fߥ<߆?dW!y}w癐sTjfI°Wx8>ȅ}^l[D;'<6]+BW#f񤥛7{UfTe9du?/WVu_"tBUκ3S-1t3o`Au![;=@%b}^ ɱ4 \mW7 3SoDSOş%v!Mo6-z_|~\j8~ /&"lrBo%G!+8f_]g=.}I>\o COexZ B_42ך șcJr@-LcCхOO>"K˷F6)v_[z' C/͟ǧ+f,.%h H w{K }]TRڇ/3@҃ ZR~{P軴'iLjHPeYJjHR'ISSHkU[/TjU,'&ȷ0q%e%~j$4<'fdm{<]DKP4(D4˜/Hx=.= y}d'=SQ\5WdƖ$KeRiΗ")ԍ] 0&8Ȍ(aX0XH:i$k *5Ԉқfi=HCbѶ '<^h $fDh]0JN;xx]W$@c/_B}ŲDy)n.Nn4 f#S<-੬UUM6`8ӓh2= Qj. AE}QYF8eVxjZV蟩 o馿kԂ I:!N7;\bDPfQ- y~3ۨНSwD":i m I(:LʯeDBJPaڕ"yZ55D&t0. {M\0 +bBX0Rņ7GX &H#_$> _dMb#A$ 1pԿ$20S6 Ģ4VR?JX\Ym%|X]Ͳb_ڧ8Zc|,%4DPnUaMh6ʺ;4JNX;kvk%XT D"5f&Nd?J )7WbUà |l`%Ldh Id[r-]FמR44 !]x{cB pHu3TH ͳ KpJ &'K"0#qiGd}#8z. wx`RP; ‰Ia͑6'`P.Yﲒk͂g 7#RF;ebǐA];;ղ]D ǵZq{ = ,& DU4U}1P$C+ٯjv f%Hn[;TQBAһ+fô ?'\J0H/R0hLJ*v'HB<ʋzzU59 3XO?>]12 +qbu% (T`*2 zΪqD1r/9@!-6 :Vzh5ՃSyb6莕0YfD"a%jfQEEVF2qMǙa5PFIӪl >OX<⪷f0r.K`^t# !u⣠E[Ŵ3kE `Y$YP :mPxt +3$k?ޙ' %{c:jHk /W(M VPgjE?EBʣj);*Uh7Bd2&hQ$ &041 9 ĢjmPsRJ1՗=10@e o͖VCp[ŁIh޲Flf\Nm1M*cneY;D;7D.%-%=FUVUCR mdbP/"fm7hV2/DF%A!v݉0$%C^&ћqMFJ$V02 A ikHyL]9`_d M tAҫ^J}ߓ/ CBƖ|ڟqd''@7q]ZΞ-dIC{a' BtgF'Ϋq&MrZ >-_q--B~Qbg'ϴn<*9y`3yVx˳a Zsg:iNɳ7j4qH4mvNuf@*Jzg q30[O ~ 3MZtLAq܃&Sf$'M߄yM ߪ2"4`¬L[2%X"ӊ0K!òɱjo'>/Rts϶I>%\|t,꺉9 ^[̵ stc`²H69sy乨S`ǸB;iTo8k&0SRLLlHRZ5?2Vʢc3 1! iJpǨBUIL=q5D'9*`*P+*GgL<&(-6%T nbqMI&"_Q%Mw&MӞΛ|ѱnImqq!+[. YEr-oc0G*nu$ g(JtzԽb,Cݒ,\BzJ%g\>Ju'X·FfP YDSMb6,ҏĚZOgy@ 3Y H8)Y0GF9ugJIJy;@:itA,ATԿ&6*4$$4݇lMTioҽ6aIHbX*. ;+ ZUL4{Ytd {m$m;ʄ.&.\> !w`yKmXr>'Y"L߆? EA@Pѹ܃fs)l;Q*:ަx'd} hKA@XeAq.#Ńw)6ɍ"rȖ"fwO}aJ3D9`{A9PY'wY5E5^1A4D _4,)Z5Ԡ-LJ8W00}E,Z̯溬BH$Eyb KtzW`8LL=u]!%%J2sw_ws+%x`'ʉ#5r8ʹ85#31ELz(6Q>Vx_NNzI`t#]8x:9J '/A..R`i„8v}-^z4=O ̇O'囜VpHfe K(><3«.#:|/Pgn{pĞ>8EG gQ`ﺶpP,L s҈;Gl&'GK]k9i@¢b\"0^"VD/dm69YڇC21K~Y,lks/iLcG־āqIeQt<1^{X2BMΉ٩#\?dV_"Y+{ȳxiZ"Oc[fŋ/S id nݵ\>I<*1D}fF.H)d9dw_6_MGqk%b}O;dGk,u1 ^wOqYW1tjdguztˡ / %95.#()%bɓ0HDaA Hdkůu%`L 8VbrDCJ< +1t-в-8'%bh5lv~EIk𠏻D#WvϲlQ ڋC,hb*\6%8Lݗ`5ٵq`15=:uiOUA:gB !qZ m&1/\qP)ءϺYbԤS7'^bhҕ/d9Lg1 +ֺr{M szg!|PE遜\xt8x} TIbqcdi'?eqa b -v]<*Yx]|LKjrbIaNA 'HAqE`hN0/ E:d2.Lڈ| kGY%aF$DBW'/3\P"##N &[>X$;nt(#E]pX%+5-Koui#s7~FH@)nV\|AD"L `'IxƜ@fVd芠Kl)T5]bi,4`F& \hE):r<Zg%8;]tfD;,S׿Nq8ЇSQUeWړIlE!BqH?iޤb"h"a -=o zj2zᔷDjސQ|viyI9 vf&9LCů%Aj=|_O~#Ȇm:W+|ӡf.pW188uG"cv9+ѻJTz*/QH.ɇGJ0, חˠtosǡLCW<1Â0QbJd;8uʙ& Bj :8q:7:El g`B\0|"M`d\0 ~/UstS.h.rBSޅl8Z nƎ/d0..n4۔vL8L Y6*OKP n?.,lE0`..7f?>]1;7LbO;'d0r`>mdb`;Τ PD:`X- 3Caw|yb,V8LϩWf BW@ PTɬmVE5].^ ٘)m OYn"n} vNL eTNpq1s 2NU``8jnā-/ȭhh`8#pT2ʓ҆~z0[=|f_hxhGzO5L>%ޘsV!t ]:9p`8g9wlmaQeG'd3(0HU&^<(c",0ǿl5)..nH&6 t)5(mf:$ b `ʪ8_I̖[vWG^m=]1Whݍcć#OVA&(e؉{#XlS gvA.m#&[#b1r.a( MܚE]`q'O"n N{C #G{'>z}je1V>xhQtX77'lf&vI}W7”=(3bIii#/ e`'Di8*Q4>^cP.Տ_hǹ|䋆0'NdI,,q` \ KUJm2/9|t91LPIRDH}B"]8Va8ħ×`uR}+Dw?Cqԁf*Pl$ f9sݕ<%IVOĻȯkg5$a"CЄ|PۤJ0 |@wB|( h4)_.+S1xZ|&uf_#:@·̂{B%0'8/<1ES2WfB^3) z%>RTBd6 =xG;UBHpj+:ģ/'nU@wmTx 4J/g!4dUH)6Aگ?PZ J7"OSbt;Khv[o,9Ą;kTT { e15ad`KA7)/p P6}a''Za#`) qy)|EωaqbRM9̗81 lXWg%X(\(I !Ƃ Q`Hq$Q86slVGjZ鑵 % k zbĐ`u-Kàx~:Xfϙ fwi֍H9M][ &D>ycYJA)I5A_DJ[BHlPb 'b3NWCul$UVNQ$^ ؆)Pyi PBF$;Kp' c*2&Q((L91^LZX_DjM3{|9w>"٧>O!8˕V8W5R#5 YXGRxpSzv$PG}`v_.D<]l8r} ptZĠ:16x,V@e-J1CJ2,U"!M4!s1pI16t`nI54sT0tg_2=1tgɠ+]HHLL =\d`ɤ0r]!N rΐ*]U:ơ$etbH1чaquS`A4RtJK1aL[ ,rAHKG"͗hwOWuFyYi9X_$F 0 _a" ѳ\"7z53}dIzkc)c1K͖y-"S0[;`|`vR%1dC.4$\ٗ0tN1)Pf 9E7-8 9]:o(%iA({G1JtmK~LbJAuH}A @5,_ /-x!_DV8kmgՇO0!i\qhcj|EHƁ^$IKD2ffq"@*S"C-◢c' 6h8L_E|ǿl6Ά\dU 28.x9XVpnxBb6d{c8fkk{Λ\>flr¥r2V *#/XEF^XJ6ak߉vIQR!)AG27/3r5N3yi6kJM;!?>1Y8 ,1Ob~mw)+ZI~^Zi,@pIgrI]Йbvӹ68OA! 'tsKgFt~ytpdǑvHbQ1niϦI ס :_!A/Ox&COۆYSd ;φIb*QrE$_4=?D@buJHnҫ9|$'#t8ڠ@t4\:IC+3/@,3e\$9- &#Dr+т6{v o5h"i5$ͻ>'@Nef {v L\Ȧ/99S)XO9^qk<'KS:^`i%e~M1x&p\'#V&ppO҆yq%cۚ|aIHo 1 [#Gs-2c$sLT<'@\`M60Hs% lуGB|̫9r[-U:=,@Q?Eod*y0H+IҤª cwWxnwr9w<1ėٝ;5 |sG4A ;edrԿ};}XøʯyeJQ8D<)tEZ9>pj}j;2z^n<Ű1bhO}(B R(X[Te 3kC4kʗ` Tdb=b|g[t=v=v7lolSlGR3%Y WLp+&SOG)AQ2\2.f]^.xY Js kX/*rRb8_Gb'fU),lb#7F; rV:{Ust]1`{aQp49")*IVы[g2(yiߜHٯ''ۏ׬q}ư4GͲ0Ѡc)/lL y݀śG5ڿʷ(_/h`HNPwLf#G|%̃-)Od/ Dtu\xذhcZgl?ӮOfJ7*"$Ϲȼ].Eeڃi-uHFQ##3(L@Rf"L1lCh!3ֈ3<Nf1>ey.;@#Wy c_PJx6  XY,)"М^+&b6(Mqvѝ%hwR'w2} (_*!a(SLs Q}e66#^u1v@$~nIt`vx 6`V96g\SϹL9+&[*wgȎu\$\5)Aԓ@|vɁ,\-d @)WyCiȆKWT6Fޣ4z5A Ɛ?̟<G1D]1$mIUS7ZSZ|2%^TLdtR<Qw1yC#Wu&1 I^ؕcv,9aA䮮fBˁsnb| ]&CNr svFzG:w9<"r'^: b<4 wRJi !8 F3,MNL ŁjdX @ٙ_kU{D~B28R|쯮5[pEX*%mc:+qwQȄH< ("+x }u,aq_]j6U->5l_0^η04 _$f=1$hXd|=*3k&iSSRcޗ4SJA֫sa:ܓy a9JF}/'|F[`|"Q_NV9~3 L"ҨP%kV,e9PDhUڡѥM.8к'U\^1.|81y8NRx`9'uJzf kBôPY脑/`E0 ޼b ĥamha ̪a 琲K4v K}^!tP6qT?&E%הALX "cHD8*`GO{@ [[~}nUl~%]! /ZEUlJؐ2h/:~:Xm^v { ĉq0y@+%BjiS.PUymB;J.@ymxa *'f`ѕu  V2Vc䝸hSs?gqd8!rŎ7FD;llQٙ 3̒#qS-7h̪=7c*&'Q'f ]%ٻiIqdK"X0lX⏮L-Y3au2_1TJNn i òS'BK%)5DA`lSMʝ';^ԕ80%{y9ٰ /L7Y88quZaqj/ XX=}O9 K;E6+PJ3͎ȘmWvb^@q&Qb&y[VE 9~';+Q pm*6XnKTb>h/𫉭Nk`#8o<1ClKU_8̆M<\J'U^3eYb_tZt7xm$*F׷P$P%Q>K6DqY,sIHr I`3U[9MW>hbduR -#f ]FLY U{ /F@ !ZF]T0uZ@)*)Д81 +wFHLP[䧸1/zF-TJ>dTȉqY'&s816b6F @u2ЂnC99G=m 'f%0m0AxWޒurnB6 Ym!# QZZUJ*{{0B l81WVEey?\0 RajÀ`kÔQ $̢p%RI.$Zrܓj(?Kth'xPw.#*5CcaCNMQFͪA O6&wvI} d!V\Y7'Aq6$J{x4fs~4n4^>EeTz'Spv g}RT W _[)SK}G yX^6!ip Î-J];*p@❅Ё(T1J"A5r-.RxBM\@|J:r0sq^9 ̸$D74x:UP/h4r%L< gE`\7q.!a՞yidr \$G4l4qS )!ISd#E+-FW`JW.`ZI3Ey0B[A]Z;b /:%Dg5谋xh< I:NzVDV-$/8Ȣ]J"99hk:v8OaO/L5$M ѕc: d=|(Ռ5zi"lL^da)ON $81<0 +q0\ G˄ X"$gAͻ ]mAkCK+ d/UIA Yd]]gPNY5ёG¢he&[rst͢U/2"gNQMA:aN Q޻up6&D0k{+G4Q 㔴y KJQ4'.RC6]2TEYL&'G j"?=ʗfXcPFP^!H #brDk5d̜+t*]V]lJì.!R_*ZaJYnLң91$!A !y) Hҕ4C!e,:Yg'0QMH Z2$GhɲtFR $2d qgtchbF yϥ,5rNa9@9avmk[{, pKlvkSs(DTcRudH|G$]YEj(Cvav%IX"krMzq`l-ǧ+%O-Yu )ۣ&1f13VB693pK?FRFRSaFp"]Qԙ]V.T{jT3eu+pɜü$p ňG<,ǜufyA 8>]4?]ѡ$VQͧU)`Dqj1-z\k &0B'Wf'#ZxhӋ_Vrژ@t;1N~ny34 [ϐ QL>ð5I7oh`;ϻM!b;LÀa03:ҷv=1<ʌ筵 k:>/pp5VTu[^4MDG>Wi;Ѯ;쌻fÂӱDC 1C"J^ɮzzOYI;1\gLCa3*{AgÈlYZ\JօC7)@hFi !\7-֓핖M^I)qx ޳yփ0f`N lTI'@d17'&S^TDGe&lg5Qj8,0#*pf2Fť]0mij""f(3V:cxja>op 4agc 0ǒk‚ꚜ O:K0H`g.Q$dESn`)+A^ԕ`0AuzXLf5V^_i` q V91"BNQU9ާDPUNnYu&ı_'&2+5v+TYf%HÕ gek'd$ņsd_Sg1d+i%;'~7c&tܺ\[Sr$LXق &Ѕ#INx:F?oqwKB#:9zH%~Ûz:C_N kp5YXؘ=Pn+H'`CFѧej;*.4ʐu?qATJrSqS\~AhvV,I{BF-I4hrH_/#Ԃ[/U5@vԎP* %Xh_a  _GM8ϊY(: ,^uCհyJ9ב0OTPC_ב b%z$q:riCpDS딄nO6= Jgb+Qȍ!F }!hIC_{uQcWJr~vVv#5;5S~7E :l'$jD  kƀT SԆDB$z:5p\FРcSBnK4RfiT:IH kƀQC_f8d }9 PB_ur4UKgz;ց*Չw86nd\F+/7 kHB#_Mj+ hJ<(zO[GxJl,A ^~Wv+kٱ*;jkv%*,;0|JRG9`B_GJW4:]"k`p 4 UC_Ui+iHfn89}:[B_F6. [ U#"D6$o.u/=JlvҢ_/JQ~5>W@a݆PjrH&! ɔ9D|ӠCԗ1KugTm% z\Ti]4+Q-Sb+ޮбk$@5*5V/ ,إ P/dFWsL3~`{r?>]1ް.,q`2=r\JnG Ev3֌Wz+@+`.QBIK䨄+ق[d]_i $mIKpLG|2& F96& !+XHnA`WIVX,=RZXPm;XBLD̒ޏzX1ЄG ' 'e4xOƜ6 EY`Εցw .cx;"l}\$6==+1PcÀ#Xj Kp$c_݂\8 K~/\x$Q¨]ГtG h$0XScBp,|05.`IK`G GS?aΆLswSa{M;uГ͇@XZ,]>05$dMlL@\v,5!Kv+(WdM>vӎya Q궼s"5(A+U SCMRtOQP`7Fɪ5H`wņ!10Zc b'<%J`, 3}*a=g;^evkG,ͶHM|`QR3%"ΉׁSxXg`y=1A:cn"& i$_ ӓ0})0 E[縃^U?;Q*z@k`cj]0,jjuFHa<2oc2vT êE:/w/jTY0,2t֬kQ83By= Ԉ=r`.;% Ƙp(6Cf40M";ﰖ@"?grq6f.2#?^0 bQJIc;jS,8LѮ$w~(Ky*JEi&?P&-qlx SOic! aB4(ݢl W;G r) ГHasbLnӇP#)'PG`4:ԐeTvwk:H4#O1dQVňЃ&)b`0YNV([&x`O^Xجz-q.xS< _HʪGW.;+0,f . LD`S=!Q2lga\cO P`i1jKiĩ T-<6}(1ϙxpd=OdT' kF 35o>rQS4VCp gedFz Ά .Fo .)1HG!m4 *^x:GꨔzlJeU05kڴ̫:ay`0̤h^%Gi+? 6'1G;.]Р^ȳ%eD[ 77Bo%숎@JZ*i)TADZubq=¬aDx5Ʋf@XYskD&&%$5' mxa$jUDam,lN$WF$,Ұ4`cܺ91:"fe plR+d|`ˁ~KGQ/ )7xO'(zuNv ^{8CIY(Z%iхϔ`JPWbJq95y_K1DvRW4*}!{{j y7>K.VV1#n@WS_?> stream xˎ.;%6ϧP]15`NWa]v~|k-RSqp ]H71J߿?q|_?|V{!u={=:W\?Xkǿ?yH/wY\)s1M_ز[}~v_ϞZ4u׿5k:ؽoU뵽ܺuus??}&4_?Sm_m|5tJ`~mL-Z_uS}1uVG5[`WKu^=1Nxl-WBC kKfDHtSx } k2ݢ1>k|GYvA8qO̒(7ŎтnuHl3L:~[K}N.t괯\ɥ깸6hDu%&v8X'{Y,x0-{X42ߑ1M ZIZzr ^ ZZk$Z.hΨZK n7; ?L Kd%1]NFB. c+ͳwPwsk0bo[INz.7R|‚o!C9<1o@p<652- #=1 vI[<0ED V#I5>3f1K1Ocsf'yhTtpHx-MW" f_]BkY0eE[q6]O9Q})EZDqV~G]$jDr;vr 0DynTy㉮(1p1-wv [o`R弆M{l$-=`,s>^EZ8@h7tѢv ޚͺ*4;mНGZou2u0ct{;1tv;80rr#wc;7q{WJ#q {d7ACР@5L.7Wճ$\p1Xgs?Ks? ?0M B7o3CO tbB#1YtP)\?-& Zq2Gp:n=w\ 5jR&{PjISkQˤZ8$yϽ֏=S{X}bp,s%Yo)8LNo~Rah&7l?Bw4[E]Z=,8C)4ɌYOwL I qrzu2kA6Q#(e RxhKKvp)b4uDNi(˒!r ;RǶgu RbW.CIְ|WL\uq_uS<{:iy#dRR8)zzC'̑AlkےH%XImq6ei(2`_S^r,>b5fmaz6cVZovVۤSd/ű`ddQx:G"3=v&ѦG?1 N8-Cn^]`iSƃ01M5#,m{*e\ҕ29ڼhGF-`5~<_9僧 4b~/Ok݃o~b^Hjs+C/LC/8 =|XC m_>O)KKL`N v]\ڃׂӔR S~mC7g`1c!ټtts^K:+\SMJsBKcl'ٱOelKrR7llR_${oJ7cldNBs:{rq(Lj'ն+X87ۦ+)y_RGXlVx2 Z%b-- 1'/gn}9qhSFjogͦi[㘮0ɴ:kw})HR+7Qf`#*k79^ 2Z\:i Q9D:z Yރx>l:2U|i lb](p@l 9#k;EP72)sj5za%=Rvz~WKwߢuyl$dQba.2s9N$W:pٞ,)O_u lؔםp=`:-039|i?12[&&3EBi ۉ dᲒTU5ZЂ #4)OKݳ`O[|Gs#cN}6 m's\yOpX?zc&j.u$tN)n$K9O3MچzJ]1r C'y@V>E pgAK|w-ɜvJ'q?IY"Pbuxbة7|G޴A"I.s .Y7Y$i"7? O>QZ;NBw Φш|ȳ0(32riESDYxTVEn=/7f:ڙfS}R<0 G`Ti<16%N7f"S%|5ܞGB 54 v iD$o!\ Hxw|cM9YOX{`4yPͺh|%1`apՙf5nR`V1XKX5Ϣ/f<`dXlywcĭ6 X_7=9nqnpQt0@78숅s,71F=b3G0(8fv lָqÔIqm- 54-}- n>ƙ ,m s'|u1ZA%8WªYK+~gޞNu|nT=`҃v)u5Qw`w $M O05H < d7m;|)iaKbǁF$QIhP8˲9F˜we-jGvIt'0,grn`-$9L|.L4̾(F:Ņ%||`#1dC f$^1R'a1v+ׂ vCĕ :az`D >1H[bܯ̆ʬBނП%ʲDĶ0LO]%w$ɳیW/DIl'͢c[a-.&Iފ@plH̓]:ˡK,8Ŝ J~`gI#ERa<p'fk4 ؎z6h1/QXdz{Z¶i bűU64UL ԯC˗3E"y!Lj#R &)#(J-i|XtV.=lSCl3X EXRL:h.wnA>2hl' 2׉s`լ?/3~ЃnBlOз̇~g+3*QOE`IR{]ɩ[?#L:WL`H&4ql:c<ELJL$jg$9\NBxSLk?[0aI%="sR(3V{N2 LK/f9 ؎<3'cqTY1Tf7̂g=t0 hpAFC pZ {m}.")CGG#mE viGb~>G9f٣y;9@IY5K Z Dmt8l%d VQ&oIM"@9V)+Q =g1gN پap ZkcRB_Cn&B#(7&-J2d EkՊn5%5W2Yf7%ΞENV\YDepX˘2wV1aq?|"xD:5y4̃0kٻ2v&&Pvbv[S̈p1N:-QQCI}FPUZ|q0g-q+ T ɒQ'?7f2qSH:r+t1ESE ҝ ZPZQB Nz4 5rKTζ"|JNnMӭoD:-ﻝ& T?nedg Sb 3Q)].ֲr`ӼSq?1Q3ƣsq[<<[CSTqKlmLW8lOڶ'`OLR&I`č^TZT3ՠΠ+C}TzZ+w5SӃ\+Kox`3wү;0n7-ɔtq11G%]\dJRxnrv}YS߾|0y>+.At]:[&iV:g;|+q``I _fJ =M7CӖ=DTR.WNM9̆sHb)Gl2t6((<l|2nm_ڑnHjgiYkZzcOHs 8'dMCu& [ ! yxw?~c@Ď}`c W%Am R_)51+PnA=71T}0pEvV*ܮ8f9m˪)$Qmfm<_pиap!6oƣv=a9sbjyv./e@ʱjmI@Ώ}y"*GjYke yRxib6w"W-.$FK+%DDKI@^bފl bs, zʻHiQ._ a`rt,@ju)}11z%g%s0~Hg:\MSg!(lmIBwS9&u>NEԨLAXAԑt땅T- M(#1H3p"rR:aXFx y4\Jf W>Μ6CmGxun!sCN٥f*J@_fUʦ]fleal6 mVSɩ O) `0×S T?|[ l*l&=2C4'F&}7vYE:>Z<1\#A?l+Cۍ*y)ovo`}0A {xa-(:IO2fP)Ry2i;9 Uk Bޠ3dR3-5!虽i06QÓoYT/f.Us<'ȟ7&#%^YӞ,`NAʫ>H_IAJiM CAOo~` okyxb8(9+!n>QfA0]uLxi+I;@ÛvH[cnJ/M#yiuRgnҮCqN,J&ejXe·gpAq\ܜH.-^D boE٢ ~ʔ&Y6"|2tŘOefvX\i&5j5q,EZ4Fo|b$iIzQf\(9R؃lMO , 'fBI8}^MG武-d7zpCZy^$>r\LL5*Oݶ^Y"<Z^3%M&%)*%K`Lڼ-f$z8 p*]]#d<%AxBQw!5vE@Jy9Z=uGGl? ɖRc JK㇙BbTny [^-#v7ŲEV¨Ehw "/̛&@8:$~`I0ǘijU>>Em68\YHF2al=? ׽6zԻ]#djk ty^YUsD[j*s`ORW4.dd  N%jInzUFZYL/tK-Xb3Uih"^pW:4n`ll)"Ӎ"P<p 1[^5LӐOc'<04|6x"Yrc33@(,P=J/y0sj@D-N}HnZ lfÅoP`Tf f! 9 v8<<0d=Bha> hhum`6,-k=-eQ+Kb K"}PWH9^0$ B1n3 j1x]n-{к6zIPX6cM[?kp|X"G'-w|􊫪ڥbެt1NZ`Z6mcsD:3WwpqY%3^am]J{a2 G q`h+"jCJTV@'aj&oRPTg=Ho=_`#`L9zY,{`2JG'怓/ Fލ(K'&ۅ|,nbs!P:ʰ&xmT^4<є6 qONdTtQg/wId N$2_4F>kVQjS5H`#8xa :ԅ" jPɁH™&s$xc˨.qIM*Q)8-xrҪ @]r 8ƐkvoQTl1orNY$0 #S5Ʊ&-N>0 i0SMs Sw*/Mm.|pW?S ]4L#Ƭ"Sl+*Uj SmJ#m|wU o$_ut$f I}TRG :Iw4 JA|nBsB/ ڻ-,ڭ@unM܄/٭ЧQDa\n }r,\3K-KAd+1=T=#,gWKDח :q+<`=X͂ 횀3*+x 6yFʚ _t, ld)[<1٨G%CzOXVo.\Gߝe™b:$И l6M 6TҩEO-ĂI(,f3 쪩OE'怑h5WͶT҅FSX٢.qwUτ/]tPWM"0FڼT0پoZMA'RZ}7rUáUFd7%X^8Fc=!eW--^a'M"dU(s|iP&}fj2+M(|7)M)I)6x0Zb㘢 0dV`$yoo'P})+/{;[roIjNG DbsDYf?V;|*[83+ _S}Aq׈ubn_S?1z:KrNUL2I58aj%@Y 3j& =I-`̿~§hq- f ob'0أi l ä(*!D՟ ?D3xO #iSiG bLJ$AU_aDG0ޑ6&Gp_#njҊmG~[CG~bvWpD~&!m}2Ư;D(x woЪ1πoe6Ʃ_[wזx&ĩ3BAE>MEOLzOy`<һ<4_~}5\~} QV.3+o(#-#Kqot_*OT8RmWsD^fEK)m{ZaGü6tmla~_r#.W<k5m7F#kc19-PzzEADoh.'ضg|&86sa^""ʻWww`5 (B1ޖ;9YՖQ"$ ocQ鶒t#-i ۣs(hq+MODk!螘-?-=a֔A֨yv5my[TH#OLtAA(q(1P*;rRGy5 "*LVǣ(oFyΒvyMДcDG]Sq wR҃&Gӕ 0U`$=R<ސ/U*1\]{I4yo3['w6|I[ǻ1ZD-5^ ҆ )[X;_1ށ’-c`-c(^kH=OfHgW-#oQh!u;ZH7.;k3U"4aKBۏH ,Ezmy Yn,&ºG'1Ӄ-mz)kcY(kpr3%0s͌uSVV*iAAOLuyb"{xb"{A ڰa)kRZ2^J O!qzk@Xo.9=g^sfOGAFX5BHrp$\P3QY֚h:/YV#UDl0B*/VXl-R> #*W Wځ^FiЮ܀C^9嶇z];죰g4{ym;[ZR<߃zGd'f?(Rgeg:W吏z_*4a~~'FO=F}b@~1I{ 3w& ;놨{+ZzE7~8CǼ6>B)qgů>1S8v ֈVb oQh_ߛc9׉s9G?+pW'Ծmguji.@nq~Sr ~]Qh7f?ꗌ^3Ϻ1|z$" +?>Qrc#c=t~ā^.D+M׊ J]̡)p4N(pݐ7cnp >G:9:) n6)ot5|TρՑC(u]M&/7˴=V6'fߊNtE?9A9G쎭%"bݨOn<1OJb!*C:0pg}n! }GKo،@/MX{*P}L;0EAb~qCqlr~X{X]5b]ofJayKتxaHQ X#nu6$bT˚2Jc(vnX[|?Z &I6v8A qBSR Z\xW?,2{Nٰk*/̆dqyĻ_ {\p竁<8D0ǭ3'Ő^=Lf2jeBB|濴*{8@0,`3Ӑc.{"ė[U3d3HFd(ew$/yo?0.k)P<0Y),τB3as)C eU&VzȁR9e@g! .j&-ia I$}"bLk=< ['X<- CCg Efx۽RCXiC5?SO.yڤݲ$-Ir~MoP+P)E0$q&<3/(|١X=rؚVPf1œhRo7{ӵ4 ŏ/wCl %V JGRV|ݩ1yO1H:`U(iCu.~ey`2dƀsxb;ô)E.ro 4DV|!f5SR&6Rr: PH_L>flܨ;)S/b@8*l4R\%dJW:NviIFq1E(E2N[`̆Yl$,NqqN3t]7*w~77u T{1%U>]َy"O4#a1C鍇D+.-FiI˛dUwWRzp:5 aMG'aIy6Ҹ.؃yjzu2iLewR"`0?oLxc81z}a%;*fw U,haKw ;Ot:։Bgxo&FqKb>VPkW}J|?==AdiavIF*FBpr&Og/LO{,vaNĸUަ!lx n啛ƴy-5`嬾c 0sv2P(uf%4{ƠWJ'ambiۂ]@JkX .t;g {kuna hD1F,T\F*?.,L?0!hp!1v;S|Eh ĂS_9悫 %7急1K\O+0.RKK\L[k΅TfkyѾva[ЭoTUXz ڠ\fu1=@fP⴪Cga4ԣ*Ϙ70 |1`rޖycd.I]BS/P Jh rEt/sӵ0:yyR E7FT.EBԫQ_ԫ;u~aaT&sX#`MRZstv.%ўh,L+myOp(o?1WܟR'怃z ۫jQ1N")ՊvOE˾{c֨51B≩W2;SF[^ )~\0=/{Km"EhS~;3\XЙ?ޘ7? M(|O 4\S@7Ђ0S꽨_tgr4@KSbY]H`,,É8=<1o`Qia^TT%'^M&A&E~q?f8hdD\2a^~}*~CAG f7RD tw[v:YDAnʷNRx{ wPU$~&H#jA]`&"IB#nc #ɵ*ekҊϤ-~=/xQYG?Exq o`i MK[g}a1zRA2IO1 H$Wm]GRa}m3b3UڵwȜgs9R"kW<ឩ{ l䇌&eNA "v)ISޜ/,Xx1z7%7E2qE  I׉ .1"5pbqegi뙩6٤ z^= t)Q"US#- L=s%!=d13bjɌ<̍Grg?? y1m6JcMH DZOpqE`\Lb$9|H>}H e) /Y_j4M颱NZv A4d4M݅d;b#x`6z[`ymCHO 1!-2Co|*׺,gH<+Ŷyv#z@۞^$^GM %*!Әo֯O@6L>U`qdSb=`<-#ݜcH fC;w a<сu  JJР<9M|g;[$Uv6%0KRXڄ(Ŝp! )|O]A_5},m9aS=6ŵ^`Lv?މ>$1˓\OC "yɴ0Y-wd#efvyƏ;<#hO(m-a&u_6|Eu hϣi3.I^3bSYTP}Wu4Tԏ[)qYd)xY.ڎ΢~O]Y+;0.{Y+Z?d|yypJ]Ir|m#'Ʌ8,:0DT;YQXndٻ?1urSRI7뎷|̓c(.|ȇ E|u<"T Fނ$Mul`kTE咉U| q5ckEv>0 #^EK'WLwKˈ\pn"s-ilae35kxS&@))5z/&3 ̪iLe VJNlkqï"HLsDu 7O+$xӁ8:O+7OBZTU@q+p,I Ocqxǔ׿gY|*!qx>d |eS,*Sy$-&d0QTꎽ151lp2əa8Ʃ$/L3)nĔ eNOqa27)8z;3/n9QäOh=X*Lg9;A)OCRxcnOwe[.M}񘧓erRiٮ1,AVs[!1ReH1cyH !i]>:Y83n0{¬Oh%32W= rx~g:JX<{ٰ6Fɇ 3<RaACj%&Zv`K3R$7 a)y.7f~~ޘiTb>yNޮ昨Vƺ?1WϪuVSKI\~-l \f7 Ya{*/]@O,ڙ &ْ3h΃ {4UV.!ƥl[^zGQ ;*7񎪬 ^ ›6.2?vCΡlТw-eΠ\bC1yDKwaMkgp~$9iupL=FASiI[nNc>0,\E.8育yNu-gmg >m%Ŗ(PH$ iAHd_68[(`7*EFs},x`p;̔-3Iv k(Wn3QYBpfXڰy%ErцQ%z\2sKWf ya=Ws$FɧUr$%S(a$0y*y, J_u9Cق2ƮvKa(5>{Ϣ/n)Oq^}O[K"Ҩ̭?Y‹m~ p\}aJph_|a>ak ]Me騨'p^-fޟqŶFTPc-mXvomH;/̂h+F g[z٠ƾņa(0J9kR{Ŭy6챈T]Ysu7Ǜg5vgi4q o0yaJmG'np3f羆5\(-`U_;]{[}Ö[w\-.8T*AHK?^ UXQFՃ<.AҌYF%nr D *a?56*c=RjV^` W+JV/dk՞jjž_3h Z)7*V$Vcr?~zʫٌQۊSybe1ܞe^^mcq,SƂ`fC0: D^W-LLGNaFYvdjCu*/3C,(*VdhqRa5 KJjڵT+T.lW ya66o"IEm5vZ1NADZX@f兎sja(J1m;[٣r{enhdm$\h՞j֣ou(fh1Z%wIV+E?j}_hH\V{a6GBYZZ,[ALζjBx^_mc\nfww1oyrmN5!Rs^%k|^n- {5Ji"Vb_+ =6šCׅ})([LD' N8/pS`HG8-3*ϊ8_*}TVfbe^O+ù+8[S;5蚖*ٷPH6;^ Ga5U/{ y5SAx5Anjx*$P2[[ k/{Тs^?Y0͕EU5o`#? kAV*Ϟj]a0v^bmêDl0m ˬ̚C/s SOL62k6)2ka~i]j}[wӑj` ״^gx-$mu^ G ~aq| mZz}jfzr0(L4C-fRE:h*EZZQgmcDDWT9xɾꡝ 7lH gv6uTp};dn&4suЌjOK %!1/)fp-U%18ԅ~Ϥ8x|y~y SA-ŴXIxYzy)h1.}?v}FDt`5lһEpQ@?AO<1|-ø'7*2ƦD=aD㞾39bEoʋ}h r] (:gO}`m iz5cF0s|vl)wz>+kO 9P#8s%Cɶ'\≶/^xРހi}0ÜwV< <~d૟7bHVu]Minf0t1Ha^ZܻBLq62)Gt5 AH<`#.Dс6cY[Ҵ.2n~#Jha¯4/-Taq._LF f\L7"j;A9#bkLzHҪ$ԝ }9pKxzsML{qI~ /#=d{PPr[A5p:`g]a+;8=$!{]V[MaeGl^6:=4j&csІ D!,q?u 5x+tvҶrkM+}nGS,gKDˢU0 s=HYY{s`pƣt]^"vدqwcM 绨 /x=@$ ʢv`SRt_]rMѤV!eP-697:"l;is7S!Y"μZL>ٔWP9)-$C'B܋eN!d{o9g^5x7 . m;ŋHI׹_S:/*d#es~yc: 4S ޛZ+wQڧT;E ih1gTA><'̷O T~\e/iS爊r]/|llGVοF Z[ ZI႒lHc_Đ4)gO+κV"T.}{- ~\ hxN5/8/̆7gIbƬx|6VZkwv %H)5u[Li/ORQYyav )</q+-6bI$Ke A1> 4.P\{z)fem'~+M;$jřP^SGW2Z 6!Uə I:Cŷ. Ӧ>jw.Zܮʒz. ޠx 0LQehGk䋅aE"A{@$g F=J6~"9l ڍ$ˎW pǐ p"0 c4XJ1V y{a66%k;pmJu &SQ_1wHkcXIo /r}xbXiz%=gjyd75ӜTVD+SXMIXm>,ZBzj:"oFcN3b6%w8u*CףRgV:a=耤,ɹyODvE>ޘ7hޫhxUYEGқbYr5:#zG=CgY*(QCӒ~u4 l8X:"2#up2^Nc Nf$SYKsO ;=[TYq=B@ny y ݧM2nI^x*`B7@lBC;"CQ#@m_ w9H|ah'0bhNtm&rp` Ƚ y/G{_+E 頿ƣoS`k!3}4pԗNlU"{^O ?G??H:<r0 wʌWPu>Q\F'أNS79Ue_>?0Xْ^?^_ h~ޗ٭v耘_'9(Χ~bul^Amʁ`M$w;ap*ރc|eL2S$4+b?Jek|VLyN/+@0ExS\O 1z㆞0lA:0HeraIC FKNbyc6Z M XoގfTv1^X׏ҍpODX C?#70K|N-qM?|K3fza})6(hZmUk@'- m.aC!Cx6=׏wa:4 i<1[Ufџ`P0;`paX|l}5¦<t-E8͂V.čaa .ցB0 oZЎY@DfbY{K5jkl3 6S.ť+]KQNK=پCc )KK- }r"xxb$d0P`@Mt0/NmDxc,v3Ob[>vN =1Bnh,|s.Z\Ӹnӂ0d vnۋh7&o w)[JXjs}ݬ2D}h!ȷx2i>ӡW?<< Q{e NH' FE^,P7<*d3Ap)oP\ Ӑ<&Y :FY9x 6Lc'K`:l_:Gdl{|09"X `F,ӵ.*;"x9A[51G¯V:KӾp7m:l+`m7&ۄrtl1}W=['͢K0WBZi$NlVSB  e&: t:l$b>X'f3$ Mnh]`^J'ޘZ®g*sP̈d~xJ jf I/|Ŝ=Vc+0󝎳7&.0y 1/I-x$q8Oɼl2ޛLGVBkOE+n[ 'Zt2m'!q0볰$~DZ0>hX靧̴g]blmI%pHHr!TQ`U}TOkCݾZigz2sn׻z.ܦfKb nBEA|h+_0ά 3?@c =Z<1MOkQ6[SqV*M61\Mʢ5[Mhe%%vV ?0KU 9@ww#`$< BaC `^gĂǗT9zb\q,+O TQ;leA`(ĆFcè≽4 FHBNitB/0W#&cu;;/lת$ 10lRI|1y/^ 5̖vF3pL_ |y 3jn=)^>p*il*zb&k lbqlFsŰ{r\4;x8ZDՅ=I֐FcpHL/CgJ͔ϲYKF+~ ̚?o D>v%b.נcGlpXͥ\JLx/ QTLr@\#WL.OЁ"4 pFP' I%ͬ_{UG˂ڂ9h5#^n=1\S/h^9)&qJ~)|b2659` M92Ź[ˉQؿ߻=2̯^kuHЂ:oeS4I9"^~~0J~`[.?ab L SrOw{cs;SUuBZmU&RR{QuP`U%N1[ļSE?}U` J-h||٪9!?OVܼyjIlq*vBB51)eC.ZJ({+3S O'wtcbYn^-n.kcքoZxŘ>s=Q*Vc;ltp|Q(ga׌j #ZX h 4Z܋6$8l5i#YJ|e7F햎t |?i:^B( Y§2>fEDbFB `{"-ȿj@$vN}wRunRC6v`U2On'vlE9  8)lAgI;ܞMrtsv?+z^k APw15z$OĤ;`LRg j"YcVDL*P+uL5^dd[gpEYz6UU1Fx- nIfCgHnPtT  A `YàL-dsAXJ-t|ovgR@J ˩jr# 寣Νh XA,/fx-)XUJu #o YE[DSɳDf0ͱWv V0HX2L|_F1nzbPFusq'l&.I郞Z DIGQ7#sXOw>aqCc{avטn1o%f]g# zQSP#͊ 7`L% wHg] TڵY:h=9[/"NDb&ʷaP'3%o0^SikMM2wxB|]"r5)2t*k9~[vr1U%SZ$%o_:*(\+ʺe€!ُ g&ǧ\qwk7OsM&ֳڞ,Jc P#׷ϩҜxThOL/~cbݴ@'eP ־O.fx4!)3A*;O@_^( k&vah~ϪSj $$"vd'd:|Sd~nʾ$%dHdeqlp ??nA2v{A7YV[玃Y gt/Ì2ix3Uw܁i!b<0 %# 0 ER'Ypmxl.p 2d.BzG:@K߰^%SA H+Ȏ2OPx\j-.Wgp\97.vaW9hϲ|z= hS~2Z_ 8-әS7&֝7ynfT>sIJQ4ps&&l*#1sER,gR gd7tW%)'OݭX4pe'|krL`׏H.5YC~0`{U.T綮y (XtՖO]%?LaqPaHQ'OȰse;?9j~uT`)M!Yбe瘮Dެ̓._dzt5(y £OSۍŏCdb7]vALqC4+ @c:b?yJGSn)Ve/~]5~V2|t-;cI?ly6g av6*t 49`j̆S\1*ؚ-p-Ǧ w;A-W5ċ>,<[ż}Gs>lK;P]4WATQV^ R"CѹQ_ ?c[:ʱ Վd} !ajW bQB96?[hG 68M~ ?/ìH` "5ʼ^iY>FeT.MkP(i61™|'?jV^Y}(d-'a?9Nŋ)c!8J<&/tJ72tIb.YFwfA o@:W f-B'1-`ƥ"1ǖӸ=5 YNq9`YzQzIQR{̻ioqN3pЊ,~^#9 0w1,n ڋ}mXL wc4HG?~nIpk`]i&/&ssgmЬFm|*ȍ͇NةѨVV;/F3kƢԴݪgA4Mث93h }C.|“)Fi's9<۰ Uѩwɬfh^>Ӷ%fZpe7ULޣ C j<.͙9AFUd]1X6x Gi$s!fx'&=xC S2*%'.WM۞ޚfbIU jJQV}P,xù!KoaY'CY?ӤT Zyd2B ?@OcprHX*2ӗk 'Y`ɵ -6&8(1;F|X\A3^rs):ܳ `V;u}%4_B`Ɨ`OTUB?V xkRǸJZ1U:+f$q %U_bh=1埐CWiz6]_pagavW1zJYB9?MۮU蘺_4ϊF*a3PAгŅy 's}Pd]_umbYp1[bjs@niebz)26HTU;Җ%=*$5 F dO8ƀ7@~+v iJKZY֫չÌ!au 4l;N՟zC:K{7\'&hu<@E#%%s~~4QI`RҬm2=`(hS}V59q.8ˎq΂^دEQ>5RW%0QwO70v`SH났{&VM놅"zO+4v3gU\u K u^oJ4/+ jQv-S+Lia+^%^?0+o5آ?OYHz1~ߣ5[Ο{VD 86Y / DO@/MVսKYu- h74.k)bGndHi fF@191DF ´0`=1$Nu!A[(:OڨܠSL&P7K#GWwT{aݥΧy?iU݌ ,"?Hbk!ߓIso1MrjiyfnH۠ԃ.tTm>& '*C i+|ARR0Z@ѡz1 /"*ņjw-PiD\e]o5DgW[#aJL+X*x+jqcδ)FKV<150l 8U0QLԫU}K R=Pb>JEgF&?F*g1/',c?Fb,*Y`BLM=X?[0wx@+3*x1Wa)ޘƥs}X'!"p)Ї3nhjc|NA6-h)#3ya ^n^g {71Š2O4C~ ..A!+ 4] 5Z4R~1Nni{f Ɔ7!MEy>!fk l'͔Q=h>س>J[dXOܾ|&!MJ\v\_~|1_E;dQA']Z0Hx34-#N\2I',rMX驑1n S;1f[ďdzp:^Xj|r3*=TeJ2]RJF(8DuSrM+}mk`l2:0X ,2mF}`eA_+1ЛSvaJܓi{TX͋r:҃.88b^d)iwMtʆs 7kp1>r60oy 2oê;m0B,Fގш䌽  =dgoȇc_x>Ü:=IazܸHKYU[a\g>Z$7|X1Z8 o~{wd`>g[kNxĴyE6șTZ=>Jϭ{ ̵1f&<֔]5Wij+ J$kJH"_,+V{r/D[5 O%`&t,[ ersIN2Q8$d*t:'^t??~%a]٪#sm̾*~GnmDAe)c.׹E`/^n,}r 7慷ɾ1x'=ҤK>UNZ( .~9}!)H| FT_xP\%1i$Y;N 2k=x([Z=#q)I;jJ@ucDlhozcۚ.Y$;5'I[Wd'~֬R;V=(ׯ8EV;VցAveRk5Efkv/Fu KUf ^ybUef+$,إM^b+?@lx2[?V :;FU/vF?D_d.S$R[ꍡ7 8V|}yDф1#a2aS?~bk9LRFV"mV6CTp;;B P !ɭ:agt&fB0*$䎀U~P*'kUDMT%fɭ9-z _J |޶\ O4md.CqSf֠pK [:V"s>k )W!v+֗ә:n֜U6[sey+9ob< =yj,52lڙzBE1RE9˝ZO`"uJn=DTnl%?+KY`0GA,Vb>O 'Fzk8a P"?fѳ[7G0:n٭Hn=&dL56/Eɭӱ(9e+yrkc0Cmuc\ 3LҥCOvxmt6YAV :)k}aHW}/X܊li+PP?:dRf~:NaG/"ۊSQnNh[LrڱHX_^6O97/-k-i*s˓zDmÕ; }|y z˭ {êB_ n!0aGE2XTх"7J7k?9pvTlz-hQWlY e+7Jkn7QV4-jl-v4go%`c6 hqaWR=[_1R*\֡Gd ֠j5PwfIr6,h#4Bիy/qxc0&2vXZ 2wEo]wm6VtK*.&%!=³;(4^"ls'ՕW]n$U\)ReNCuB勇nIb74G~^aR ”Rҋ f'\nܰb08O'/Xȗtn"({ C8*${T2Hս2'.L6'$ XaLM1 -5]SB9wO44ܛ38,&}ર+b ycT4k̋W Of*  d $\"y[3(}_'n}0a)vnzpE^KsD_PC*Aao`T:훾 kHpHP.D"{yQِ~lev‰ ;HG-AUIЃc!oi!(ZH.Ϧ0(;6`T"^&s?k??b\#9Ki/wщ^Oz^h6\s{b)-\9O:xNtU *&~j᫅%$:rF;?>|LH}_@Nyeof ZȌ1BLV:xJzlGʐŠ(C:w{w5EbtJҼ=tyxuK+Z(*}Yg' 3̱p -i VGm9K%x ]g=6a8>>X7onf+YǚU áJ?3$]t$nۄ(9ꦴM0FwD7)JLi*M4BБfʞ9P-/uL/ZcIH: 4['sjۇScV}ٯ=k%C^HpCVxp^fo=}JITU 25MZU-g(nhICFL}owgODWH&4,Ygv 6c؈D'gG:QF -׫ai|sZ㔾Zl`Wl*v?E*w]Y,&ƴ6W|2ՃI @,KT#et+Ud_߿/ ?= N k;f44=n[ShҊ ìy5Ȫ 0ϑ==|I˹{bX"dž1&V[m5gSc,`of̴y>f6~oL[+s9{y"pGy_^w&+o{`PI߿h\Dnqb(|J[ n&w%1x50X+P1|U*LFa=0ܫE*V~a''Vqͳ.ScN*t{ arGjz̴!z2 cUEasc4=gHfp!1yaF8VbF Kf6}4"I|ojfVaIxpc|"O+B</EmӆW JSyYܭrG݇yQ"fhӂ;{磃!Ycξo0WCq!fz/д wx5^GH5Q%ﲲPXLm`CO?``ѩ@4h vm%>b" =hNz ]X7춅ztbC ys٨X}܉WPO\l?l~ar \02P4$UvK~X{0DL\XWO_g-t1/` iώZ<[EOKzY/5}IXaH '1x fZ7̃oUzA;j?Paʡ,mS`| ES.K%*-bJԿV g,r>87 &@1ʀ7F$9>mX'r>$g?> ]O0yXFࠬ; [ Y 2áIwQ̱ԣ\ﯳ[ 7DiNt`^)!?P)ClN reoHwܘ}adVlBs-56O(eDCacTj ꄖ+u;r:mc zd)l9>0 7d+KJ>/:wAٜgӸw~@i*-7C`|R$`4Zjbfa2=&h O*`VxE fdC|}ˤcya&΅_Tā]<,wc^-n7S&W `s03&1/A%uG{Tr> 1&ÎU`<3$W|Xi14 1zmʱ-`ڮ3q.̗]l2&bu!;!h,5ͧ\/He KG8(cOPk_c"nф0U]N0Hܠl /LfDXF4N0Ļm݂F>`3o2+Q& VntyFT8.a3xgB`xי'k]0%LޫZw|PO#,1N8&xLSnSc:?7[ܘA.?Gl[48*=5W ݳ/9’ U*NoR^@y6˼ކցYBA}PT7zZ JY3ɾv_Ԛ\N[ͶdkS#_k*<ȗ~C,"{|D2ʛVmJ/7"* `*X*H#IMI XD qӆ co07 x@Hn=ME7FY&j/ h3ˮ>0\xcة#[ܘK4w ; W %3̮0I \ì!U\ÂDKv*E,XO  d|1mcj/gM-ż*f_E9\O;dias.o~:6D5z*>m.̗Ye lo{R_bքYumNY>l;F75{8ISCMPPTtYvIbӊE4uM PK&*) a*G/5z4#gTnw>=v5߱sc/RKxfeI̕mկžX`,yCWVvh S1 {~vWWz>80Z [ARcj%f˛]܆31L1 BH7n'|1Q'_ؗf"*t>90Sq^`С+yc/E(5ewPU,-``Q==|} ֿQsĿ'F—%9rWpS8.@OY@d"z?[bf)g  yY'4ğX8YbPp1֋p F9Z8yL/ s a'63GZa)Gi CBNiQ00 17oz}L$`,St*۽82%j 0o`eNd5\Pf=1|ąA&]_̆_ ፫ōʍ\1[LcEu=bfezu]#x(8}REe`VGe1 6SSE{8aH@4px8- oDs@lM-xĔn$&JaNu`~3o0_|g{c|qJjAk>,u Xڱɜ 5{KOKa^Й D^{c&$x'u^`#89TAySFmd8Oxf7j,E^e; vpn /lw1/?aY._܍ 2z6C.Ǧ}Rlѩ|c^\ w3k\ӍAY̾9y0&ƞ ^0'pp[֭TA/HIO̡Ā[ħTW ACG_34npc6,C ٲİt ;X y$mo%viLܘ-MqO͸¯ZW80vI Miṽ6…*X/̆V5`P_=&I%:o7{OэD )&2K5 ;%POH7}%"9PF\}eu!(6 O\rGWchb;̩+Ђbѩy4ܒ6`; @bŅ\[>CU _ K'ʻ^$N|;io"[Τcn"rP?cD(xx\c;P/k(beT/\R.UVZ6s,8;{يy{}>)n,|6-SV=aˬ6lY g4rlnXmeHq*5EVi!ϐ#q7O6P}2sp2mZv#UK}ug4+6 Xƭ#Ӳ`e+cpzXAN ]jYZh+6^LWpHzCy'&vDl9 DZ:0 p |8EvV977s6 yKb~_#;'s^bAf5R s10PЇH\~qnێӀ1qQ 0F-dO."yc^+$7ż_ -1fB\Rǣhqcv[x-`%upx/LHz#] 4 tS!a GD2y0껢A/p.o<`楝<(lF=ˌ^5Iÿ';Sbi#/2N.t1Q MKjS!L3`Oͻ]}Xxc/0^͇0Z z;u. mIhѝKP2Y>K۷5PXAmN X%tL!ǪX{ OP}\TЩԸX(, Ob*^0D%yX"))4 tWeŀmCl0(VFMX'GVLϲ(vYxA7ȓscFIl;1;Mt5}27 (}nv/FS 'ԚcjsDl7@q0S@R: WKcW\COSERa .Pdbf~̷,`3Zd`DSQ',&g}zt(DۃMx(%Fgb1`{k)]l>e(p X;n2' Lr.0ISEfԳ6TJQ6pk'j"`n)хJ& HCʆ: շ[ CXh|hsPP-M-3{Nx ,qAmDEA X9!%Km"]ϪZxЃ0x3 3Z8bSKYCSwq:dp1l?.tw̟ygk>3VTjH TOکo7 ]7Q2CzRʤgy g.1jMnFQc}B1k>/T5'\W-̐~Bd*=%^=qSvM$><1vR$`oSb}qq)ݷ"I[u;umk0PEPK@ST9?C䱋vapu0G V J}Q`eCe}UqNt/SkbkP\nSpoXRn{~0ioNR7>%sS mT0 u$(9L1&fHDi z:/3.D<[$)j/&T`=K58+v!_0d] VfgGXXAt@H39tcAD?ls aP__Q86@4zlbvI[>vBtn ͪ]mވխGG[: R\t~qcjiU$MK_dV!j{K94XW%Ŷ^1rX +sL- U f_|j/eMb1"1σrP.~b\I-27&6b.28o%Ӽ_PqRښ(A m./ $Sk}P}i[ݧ>8In`bG{Y4 m:D*`RFE{B/S\쓰xO!?\⵸ |<I.CԉM׻E/%P!nN6cf%|>YsSEf`dN:Ef:-|xlNv!vjȶnLln.|ai?PJL_|4gs(JYXň#bF7WaK )`8ׇ.AVq .m U{zZx=Uvsс%C`5?"V_fDt,K<8 ʲAt])O ,UG|,`TH};Dn'=D<Gַz|.cD'=Dd60M(rG)Z`ulݨ#sT!"%p6Su<0{;D#<1d/Qqxo=U1"_}㼖,_ƻ}eǯ{1#K)O FD3m#HdpCQ|f*LQ-RŇl8 A-<FF axVh|#mlP~^j 6pce":d*颵8f33SuT=gN) r.}g)vqĹٍ44IG|K%¼@\Wɒ0G<.a@!}0w1 63C s/ Yi´1{3-]#kFC5ARdMYL$A'eyp%ˣda;ZBmyvj;%yv˳6CY!c;ffz[e9=Ik鶵m(.;Y&nKie1u`j x#!JT/X煗vR܍`X%Bl0 Qp@ɒe0,,S:C*-Gv&~'M݇!G"w,g &IrAQJM6 ͋4<ز:+krbs^z!6u!^) nDŽ>ZJ,O?H-:z ʣk)TEL %WOC6&&i` Ffh\Gôc`&lROD 0Rt#N*fl`~KQ&&( 7 >:缆ਰ YeC=0VzT @$ʼݨvؘy;@<Ÿ )# =0"Ȉd y `n6_&€a)5Jg\P zìǫ^NJLbj& <Ϯ D7,{%Q>͌WMǃsN^)+̇mtݝ/}L\p:Foy2=1t\cHx}`]7zj`0~^*p5@i cf6;.ƮŸ9O2N=1 S{( ~M#Y6Lr,պ$\k5E2^ts0V^sq?^wfK[R+DžV>e= u~|1\A֫X 색'^pe5/5 9Z|0c%@mwD kRQ ˺=Y ׊ſ(an Uc>ZG) q#nQYvdI O|1(X2o̗UTps A'|ZJ džibio}t6~ԕf5 (sLax&UIbaM%idޣsji4*y~r-8ϋA1*M2ip(X1LaL$rBI3+f4G?DzbN7͊oob8LoLD^q3+Wgp;ւsS%/Vڨ<*}b-NZ''׏/1`!8PU`3ZQ1ͧFno]x/ȭ.M2[d*XɈiwnj^{ܕ=/ͭn9/j:o?J_T`u*Z"#/Fv`PQ~OuwW2g;bk[2Ion=S-`Cζ(vaۗ[qXwts fo*/vdۼ[I^5 .rMmQƸ|Ӽ[iΖ_.rTY1"0_^l)iNsӜm }k=-zsդ*-f [rvps{ 7F'ZNdpYާsm x^#fՅi| #C8.! >)Le HoT;%3^V݊;썶#3fVQ,} qwcV wzAm1}S}Otx/ꗾ v2.}gw~#g3`L9}g|``^Sufz08}+dUFS;gǸv3qHoq 7tbPMu3{ޤl{ fOv!š?Y P>kS3hwb!BBTs{ L Bd`.ۃ>meD>ScoLf!z@ SUfX`qb,Ϩ}uFg7P̠`~F]hQQM`[X>&ե6 X+:+3y8*KX糝 e`X1׳ 0=G|cjB7fy,tdTvcD1MBQ5]NͩW/2n6p d,&J^QxK2怟Ct8@j/$TL:[$9Zh<9nkƢa11S)IrU3UҬ]Sug//qc6ܵ177F749L{mw΁E)~db|FBS:$m 3uG_0[-of 8miBN7l^JM]zWo@pKvA:W+ M%Uɜa*xli`t1eelS ,c+qHѨ} j8,O~@q+g/X/6SqU0[۪HZ%0/8=.omKGRLxC@?`\u0(C|JˈE*$oKˀ}8>qPJZlzRɥ_ S-&p^ l>%N566{}ca_qg 0e}sKKZRy!6Xb1(u[ܘ Xɠ.ĥd>=Dd>V,YITv3Y ̿14 7rF|mn3 Z r  ׊.s#u[.ʳ7H|P~|19Ϗ/ 힕׍ٰC{6Zs[|0x6bp6 Bq3ΧQ*1VX@mue|MFA5dFVLl ٲv d %Y34QJw',"cUf̔5$@<]& -91 S<\®@[SPe 'Jl TyІ0:)ZCi&X@/¨ ˓=5șgڡ,<{1bxvrazr7sqL/h=^*kƭS+ɓ#(bN=vYOݐ% 32,ZWX[:>mK\2񠓗Ƃ>^H.U|w(j%F 6*-h߉Kc/B {365qȓ5>I./pp#L?ѦO6T تJVUl ` nqc6@G-]#@14Ș mdPgl~4P $7X&S3 3] #^@rˣL6cH$|TZ]SghDkX5E:pwO$ը7fÛeRʍoI6l5g[#L˖6wWbv~|7Ѷwj&7ّݫo,͎Y(KKQF XP7skX&jNu+ieQ"lzN;:TnHv@UrJ*G<^go8eu萒~nr'`wT.OE{z5 g+hf&^y4X~hIڨluI51mP,CY"mI*ߤޢe9 ɘ~8^A!kS#~al _Ɠun~pqԎ@WA 3c8dnn="o+-MᶲksGF,w֛q"1Z Bb,UhLjꔷhZMPy˃6E|U|T]h1]Z3Y4,СNj7滌vX ww+\ pn(c;&}=%K)+C';T`8LiK-> xp(b{ }+29z2tB]'( x| | r,`)l C a}Ks.h6+l!#!?)>W0܈c, Lvj,yiֆHݼV? <9alXR6qö4k`=~:3t }u?ZkaLI^nePh=,&ar]: 0 ә0 Rwsgy}ae#"<^n8/R{iQƌ^v0Ox򀰩Kͬ&QyvjAFK=5ӤTkʡCkV4m:Bz;iN5,a+aEgXm71'zsbg¼ҵڗY0 xFv7o]#a dIǓ~޲wFey;C<"W}}J(L.wQ젋r܉Ls1DyĚZ)I޳LIO Id(s/Rq Ƀ\E$<+$0"8d΄zᦌSG lyN/9imґ)5J#@AM#`@1bf#ʒy.߰L@HhU&b6'>aZ#^ajVy[F-Z}~Bc^#o5QXy@H椳Ex nPx<^PXDfQDR u2F`4xؤ^1KR:&Qa J a*ycPb4 M"|^[1.j0`P*clk怫|0),P1wD1eXף&Hea+:Q}3&/B.`6TdicF'GٹFJY UF2N5s Y# eHR|QQ)֦0UbH4֋Ȭ[+5"4BQ(9I!o0L/[Slc/ۥ(x5tl,pbe`'릹V[I@hTB˸4^̺]zN KNqX,c*KeŔs=9`S:p)[ݢrQp@IICOI0|mނD C8DlC9ZzvnBId AT%6'i7~,*>$ :_̆7&qY&HyT `DsvnFZ7#{j݊ˍ9Sl+{00.+Ǘ5k/(hд ZPnLyVXO.fܣ-\p;,XpRNӂ %_cB^^LOZ%}XoZ &Zop֛TYYn77$-fþ|0I7^\ RNIBrݒn.駤T\HV;sܘbiEs. ɗiʼnCݝ&E &x^r ni/9r9a9vl8֜߭kNR%IUK$춑~vƤK͈cX{ɱe4SbM4gl#ݬ'#ʓf#ޘlva^[H9 sf7/K-ƹ+hO<:1U'0\u Ls:Xu[UVc0m#_ub`·V5í2x HEF|0EWjkyhqa V&ܞRixlX2T?QLV4 'Tᦲ&6)a兇j'ž Esr+͇$0"/ NZTf&umBX젒})MC+ԅ-حwxm&Dw n!X$$%)c.BdӍ]@+JEgJ^Zr΂oPBfMLyswOuaN `PJD􉊶ұ)ڰ KKneTi{o$>Im$ULBQW-qƈ.ζ]h\r|Gj&1Vw+)J_ ʍpa/5z[<\㽅 ~r#e77H ݰ<0>*vnfżR/Ƌ "W 9T3(1(~sq8oWi^ۣkz;7-\Ѽ[?ߘ/ 5Ѫ/H5ќke,'-WL`yS/1 ]-.L<a]+bX_8GDJLŢ6RmiLiM->uWUJ:뿵E iN:5[}2Bx5`7EِnQw* Sɪ/1ӺatO8(JNBV0XJȵ0NZ0&֬d^%j&:N:e{:JƔ9[p5Q]jXdbCDP l^aV-CZKE 撦sFKvPu^ɲ5O>[lnkEq0IQ,+? XPy4++A\57m-Ms8C!X+ũ!DJkƴfGN;dSYՕi1p3_ o{Ơ^^/g!QW }[|0T.K"5 7Mf%?Đ-QZS3BHZԘ0pJ+\RP"gL_;9Uik.7{BW È-:EbJr&%'ET*CSy)P5rc6YƼ*rC>IaOn0j% LR>:=eO-o3{t!nA祵gN/{c2dF% B7uB1V GdXqX6l U\`# S~fIFPS"gV]\.j;fÑpZ %SEQt;+ بAl(BG'_(1DZ ]"0/"d`!newiRѺ.XOJN@XxP|+T/BVуܴųF\XV_Q8+ `TŗZXEtZuˤ$tn9:a}A S9Tشxr]Pa&BVlb3B ųl\xVǬxZ>nPt!%֨[Q|A *1xAbxoHUsU3@Rb&}UYL`V}0{cXq"4sRr1Ueq$ZyN<ܱ`0N. 9Xo y/k)~}y=ɭҭ`8T)0.9` a0ò CP<ͺ;^f>! Tߗ` O]UD[A=*.PQb%w׌,F2K_pQIgV *'_~bI+s13GrbV49gbq8Je (c6@l2/ix""6W D/sl cm)!mi*mxD#OeBGaHb^v^qk%Lm&.+ OM>;-iU/ Ϯ,{Gߞș>}xHJ :ZZ"|b*J`6<&9ZLjNn.G%83ߩ_G cG#<o)yQɩZ#_,٠T;7sycQHPȰMxm_xla6LKM 1Q9+N&K5PiY*aڕ9P-JUtT)~p󌉍.7t>_?xlA.cM oQS^0)zyQQc0N_KiAgS 85׻#PbV؁& PMv*OqH<$|] gZe,6c3+}#s_l~aqx\3Su$-1L 4`GOVJ 4de)2c);1t7v=7a[Qo+~3EB `]~Z`ţ}[+jKvoWPl]. .;ƣ˾_YbdYb#Ur+u=LQDHfT-k:zT2s7 /fͯbP+M˯;=4[[Nv3n1};RD\bFu3]mRbDUhf'tPn-b̾ )fmeơM{ !ce+7k5jC\iN=H¶bd/|ܥ.ݞCgަAλqu̬Jک~4+Ll1)(3",XZr{|)cI,m4ɪ g|& ui\Yܘ U2r17፦3=MoʔC1!a2<.}v?.U)=tG A)v<]0d^i䥨K ̮~jʭxwʔfqm# sHO& %F `. Pmÿ-uut\'>>[ھa0@ڙ,/-ϟdϸa9I 'x y 5_(x@Iߐ-lΝ;`6EZ{ +1{mą uP2rO[lpn AI>'y1ZZJ,~@_Gcz,V5:jhUVz A,E8Q[ݩw1ՎDP(]?v;^G{ʪ;IT P*NGӏXpW"ۇ,c61ZѬFx@L9{ҫjG}#|c~5iL̚-D^\ꅛ޿y׵5;>7Wux-iP 6]ߘl0n6Ƥcxapa@I:Ic6`[zr怛m_gW<[ܘ7=GIku&, /ģ4Q&|Erka`Pzl=Z}`ӮLMcn_+E F`",ƳToe_g!}tY=p-* s0Iunp+-_SFN?;5 z1FЯ"#Sfl ۚ_g/IA#6Fz tv(t! 6SkKna2Oh=y.T_:B*(і#݄H~'YؔQA[~ϟ~U 6 03Qhl_yOj3wQdm6;0`)5s5f@+i_2F% c_G>?r0cök^/L~z1߽ol{̄h-Wq_F&? npoLFr-xE|[X̀`%àTP+~`*51KVdKX1ٲ$P|0RM]FE2hMkأ`=ʄGSAV֭=dϕA#)iHJNNYT°X;.08>'"?C?s_9{gV֜ftV*I$-ME2fsd{g4`A1X*=ՂZLloʔC__#jct\?~08 %JjiWg="YF ?v>)+/Xpj]XRj i8f`#s滗`Kj,`Ywi> [ȫADQ~ْڎ+aIj1exl9)0'dK / MX,29Bٽ(Յɖgγsvj : ?l_ !m| v"L*]JLkMi?4 *Z$N^<wLs@}ןL*4CРC)mY5G ceЯ?xYGL{<v3!p 2?FmI#3>r㮸ȍ coq!?L^1b$p$^֊H w;G- 9zw5U1 Pc‰=VqG_X\&Y5/Hb0X# f ~ᘦ*4u.lr ;8Aa"KA6ZApνrMQTϕ7̕КZil&u캮xN0$?oƃX0a/ƣVJ}7QEz~+Kh}%3}RBʠD 7)\t{\9vU87-sp~ d!h{_ r,A[mgabNrj|[)%{ 9)1$x ^X``nM"o "JW[O{CDzQKrY4'AEE )CGoiQ]b s||1B7Xv9T…h.ʧd~Ksf:41 10Ȋt ۡ(>-ʶay( ?80Iv"fMܖuץI9^ ? vh22t#t릎򢊷yŞ4Ȓ{YH;93ˀg bp˴8ƠC?nq@DΙWYz|=]l-`X?`;߈{t9FZ$+ ^N8~}nEkw ~ SjkPmL.C1< ~"{k0=l׏llFڊhI e:^إuІ , NQ$Y|v`6C~Pq'~CC!oQ?IY /R6+x.E爸L[p 3la`1_zRT뜜c'f҈v `O`D/o]`:_F:cݥ)9L*.*pHT'أM@2)J2?յ [<- Z)[JQ=Wr8L~͵Ojs)*عfΌ¼oО>Lڱqs;k|Rit N 4,nB]yPc/rj>6:;7܋m69:kμ<ù@sGc% .1C}N)ElbnGU>Rߍ`+U ƭuc7Z ,BMK \^ŜIڿ88`e2;*2өyu[rxyc }?ߌK~T4V"W9hG,:h7K*bF'eF_ۻiyC 4im hohE%LFNJ|)i/E. w6OMhsz_FTb0d-+æ`YwKbR7tfd욷eA[,-mZP͚J8h3$8*Cq 1h|1z1y =٠Ȇe_Yp-D"3*NʙN㣌mxꣅl|˶C$g^ .x/\AIJ+L%4xi&;F &77ug]֓SlC7&2}gKQGst^p=Oo[r6 wO.Tc&,YyC9]t2d,s".5Db= jW 11etbz ٿ-nԟFg35sσJydeHa V{!3[ >ii6\cRmMΤt YXiK3r5yꩅwvhk)HB]#A h-N_@ ?TN&ӥ0UP~y`N+| ]ņԵN?5[v Xih 1[YKhT- o2',&r`7 wG><UҭcPDHV"Ӡr_TN]ǠiߛBowJ}4>n-m<&-LA)CD]'Ԋ6xYKV߿+Szm Zm_V_ $7LVBbdտT7rw`$̼ld1 Lm{1`#j0gρ71U{\aNz{d{!nhvG$³CT9|!CZ1kNtiU9ds9}MS_LFi-|ٮʃR/LGV]Ztg:/"[.Tlav ggECB0ws5i̘epH}Xhu˪Rb}U'^X]̬-lj'l3‰ Y6hбZE]OEn Rчjy I{ S4,G 8KՅ,=A&_>R{ڵe,'ۺE&J4LPd.WaE*@m`Ƽ̋@LL~ЅxaB-6ݿPP٥v$c"8+ jy&?9ҵ0\E[l 3Au'LQg~aO[U- I, @"83jI0mxp`7@=Xa#Z Y+{t^<ۘtrC4t6Mi! 1 <r'(s 9sn_Ҧ͟0يhpRZGPŊG2 0 <]~[|-CՑak)t ]@!6)7xT* Am9hs >pp o'[|9hTE'Pq(0(,i - ՛خʘ' ?f-"/H"0n2Du6w 72V M^ 3nx ;g/Il_Oqҝ \rlx*Ĵ{m ?KA4dd1$ jSG?>X0b8Vqf`3UzDU.Mb&ZnW+h~a}C] ޼d"bM+#j҆:r4eeKa`1 BFVBJXaջ|#2.ز< OW!4?lQ5u_xb(-r=nvZW]T*Y:ؕEԬE9/T(yʔ$Js8@ b<|)^XDW/لg]fA/OHDa]Xb[HɫšŁ*&_. fLQ=`HTt-g'I[{:`Z|809r&sKC3e vK#RN,&g OMh#j~TIv s˒~8DW3bJ^aH9}u1"H*znږXЋqh E'<|c_~}Ġ贔"l*b`{VkK^L:YE KP BqϋʒkjҘ LSR%BpY҅x{pԐ`a.1JQn9u㥝KƂb,HU;ʨEoJU6x8%\iI;Vv?d8w˪/2ωQ 4KHǖ$]dK0]SoƶQaYgs2\RMlg^|X>ZUa٦8Z,^'REuR @XU{+Y]j\9'!2(]4lSϣ7re8-5Gsc}a aqFiCcڠkZr+;xډP,cJ)*D- ŲQ'< 9'G/ >#X.T[l 95.:WU笤 q4Nϖz0(8̰Yu@R[<| Kd)ܰ7E+m4yePeIIb{ _;X>*Gp!0WEB^D^ 8a6G@|d#n`^ ?0-d/0n9/o?:u~yU_%bؓt: Z ?ׄe6{U*8|x#*Ïއn%E͡M3 k1*si+}WnĞQCm֏V{uvch`d 5(ftaT<m])q .vFR@9 LVf Qgu'!}9K؅5VzNF-^v=ŭv >j;@y}? JR@j.JQg9sQ 8X΁yUq3ׯ2iDP|P嬇rHM ѩ^*ų.ڶ|[uaB2ϕaj?= 7,CR-`q &΋p~ZS!Sap4+ӧu@lӧͻə)m2=ŷ1*8N&3(F 96m7 mx˃0,dz>ciA,Ix>i ՗]).˽yRR/ p&r0k u1Z.|a^IQDzY+.bjG4"NEn(Yh4~0(qY?oW|Pʴ:6l0u[bBt/ ӧ+aSXqClE~-4sY,X-TBMTþa:J ؒ. V:vn1W)'HƐP.iW8# ~$AW=N80YlVSSQqa%-LT[> Ф*|Zn"| kw۾k.-OTM?ôxe=,⡈Sy7ۧrӲkRin7 scd"^d20=a>$CR0 `O%YkvOK./3|nhԿ ӧl}޲P`Mq,J1qd=% +ӧ-`"@׵#ISJ>J„NƇ_6KLgnD༌OIr0}~0N ˧hK |SLe/'#ìٲw>9>i4&GgMs6o/8C%x잶]2[xsҙi,F*|>C0|B.T`ڇSwSRoXe~c> ЏvOU?J|vO$Fum]aG3[=P깹7͚?Acud ~meZa'C q>*X|@CTAaUAX@[֓"͟pgωR1y%nZ0rRpNU$t~P-ܿQfI\PGzZyPiayo4 1e.6 ~n0V&\$n PXN]-w\ `C d%\pW'qgͫ{w=v T.sJLfim,Hraa8mlslߣCޣ>,| C2͓{X>L"{gm41B1>̗o*|A\ĝ ^ma6I6ra{"~3Vܻ{.j刯30Aju >Jwr_q*Ṫ͠So9_e=m%F(5IGҒ>2zfNdF [Yȼ / yjL% POUys ad>KӨUU¼p!!%Jv <>9 ά.UG6$Ņ9` ^}D qS"BVIِSbs_U鰗0Wc^оΊY\@Nam"Geq͖WTޯ*i[QPspBsZܘn({yi%;&Œi=~2e<2춪}Re/慳Lj4gU7+aw q;af+&@35r :$Z)c%ӵŅ9دٯ{7cG U1X^0'?ؼG:ケ1ΐ|D$.^< SYUg8VB:̦7#BYK!XrԪk6 hЇR9> a0͍go4s?T5?Uhˎ\UM6+ Ѩf}T_`mZ])?¥2#KsџtܝR3s9tJ-nݔ~#fOabjT@ m;Jm|3/ |7, gYKyT=ɧ 2Շ$Jz1_Bo1Lseh4*{=ܤ $iz,^:/ގgBҴ3yujiczN{-,| 39bM5E͈+{:>c,aD S.XOc@{;xvS6\UtcFb Oxp|^1/}0B BlIcܰbcD B +celi(u0K=ZH0o:)`Xߒխw#IkD]œ,t[`S,יC1$c }cqB5[R=UOZr-d'_JinW`6q{p}d8-sqS=1`3 tq:Ο)1|}贅_̗eOl4Y? F8@lAB WJ q|K#n˅R=q%{[Ft't _\<֪t!Q\W$Փ DD;g>4|Y3۫SAWWV']p>z=rÞ,S,g\ ӒNrJ٫###c4Tןguop:yUe/96|NkcQHӅ_GC yJųDRPROY|񄍶NQ4%urYbkꛉwmeba Ko?܋=%8vi0kRu5Dtc^ONz0S- XPAdwcØJF<2ß*7"[&3?N`u+>X /-_}yHLݲ<?2i;&&9VuEJ-^jSF19ɀ@ =8͜do]*N"*u_7, 􄫀0*(aIy=~,(*fp=>lrpIx!;/y-@__%ŐWNti |Ac. e޲;7lX-huonK8MBAXnDģg!—tv;_'`t' x^vcT~T,`.z$Āc4Z)Ơ1B;d S.ᰮm M>̙SrQ>d)Jܯq<+6Kyn9Ee 상[Wsn`pK|LӘ:x\ XMjy{v0m 5#4DYn`Qf|*: lb9 dсͳm/nV&Bҵ>≀'cM3]Ou+:DKaaZEA!F\cCU R֊)bLYo7ՂX y;둯[:vL7жrkN3{童gR#uʚ)k!s,\e:,m(T^zӣ-~,m"$}&$5h߽&KT3mk֥bRV5Y:V^o).\Jߕ(v-vE!0n|LW|3>OLl),՝ߞڕw' V )LZX[ʋLI3zBF^%pȆ8l8Pnx.!Nc`pwehxWQa(ꇐ`EY1B5>-jE3HuHAWW<%b*K*? 1fZG;@"Ma =YHUe*aLw|]ӄ (t1ŃW0_?~ [cd=<\7^65^h;僕`tPՍ/ּZܘ=QV47 Qw^j.TgګmbQ. 0{[vѥ8qH0jd!\@/&Y 1 ZNcR7 {`q|XGϯX,!p'ǰ<=t3/~aJ!iKOD*^u rD`h 1Hx#iD@qL,Nw$IK?IH+_t]:HC6ZrI0_eaKOPz$WkcEkM,a?[4(axxlʕhנlCawG P:a͇jq,[Xd9lEgϙlXq HOET{>d#sg̏®o&_>* Y|1SM< ;_N ڦ cMCH/צe)4>c>dkt oClN-9%%5Y xruzπg,ce^hs0\բ!~ҕl՞&(ޝ!Un3~nvrmo 1qSA݈<2hSlzNxQ䅫p6'U%fEtQ3NP'\h;0".i4܎.`= =Q`N G-*G A-ﳻW Oi'bL6E:#SAd`~a*m_p3U|x{-qP&zj Н7 }Uԙ CגzO>^[Ǡh3qCcncB0+_ƅ(8/&Y>VIիō78v9,N7c/4bnI0K65?xM\yvsQ$ MB\]`ukucweu xBC+vw Ϣnxaadn0S™5*!a LtL?]}zaגu|t?HR#]:0d~Hx l Kk/Q>.|`YT1m_!;ZO[7*l~"\^"+O5sR7B+>kQnU'p*4%XH7_X,%9~/c;j&9Xʁ>E|#|ao?]˛:H)S@ըbR.Oj"$J@t'D`4Bu#j9=&Vj+Զ+P0 ! j밯w}C]0.\25 ao0j*c{P))>HeJvm8)C}8<:0Tb0S6bė]4*'P}PjыԐS񞊇p,pVRg\?8.I5u?'à2B0q\*amp5LǛ0Vʧ&ni\YAY_Fڗ)x':HdIDe)`L  p%jY)]G,%vϗqH4T5PI*ɱPX{j'&VV;Jk H.Y5NS<+dxL q!2 ⨈ݬ-Q[ucӯD3j,#Y985։?@  xVr{p\.-A%RS.yFTAn2lvcYǼi Ϫ N`7 PyJ) w辌__CxW0!p5QDAۓ ȨE_!7)p5P{~Std1~[ i n"|Ha0 OH#{a_6RRSLc~ lLJ+?;ӽ+N^.ؿ^X\Db!^'R!ԅӵUK|kq9@Y67H| Y{p{D>$AE;vVohiu{ChL#90(5` Ĕ(]>clg '^TJV0I4E\nJ^k+e/?qϻ(TōyxaG/慵%G SQiZO3~ ;`h~6> o$`j2`gޢS9/G54[lo2xxb Hy)c IN/Yܾpc,$V:Zty>/_X2/v$x2om;~qaQr51{t IuR[GGrڍx|F/R\~è". pdY;c(Ȳ~Cߩ0ޟ!c]%EF̣_ j6ū3}ܣ+o5(}Xryh.a[{=7 A4g1¹"!|zB`k]"=ze^OGb2գ"IȬa{2V_p  U/VA!Kp]\3~gѳD`T)dTdYd *>omj*x^}2U-RwI ^`U ;M{.ڣ _{}@^rfrܑ3R TJ/s{4yqՙXζJ^:{I_Pe@'%eep5:ʎibX! ஢`Z[>QTOFþ Q~*rJJ6q۪z:߫<n Q8Qhs̪]*3r(wFm%_`y\oRXѳhC"\.2O'ݪэ9d|ms >U5Z܊Zi\Uh[8KŴnC?-\R" ^BxQFGH,*64fUT'U@z\XThjrXtnBa9мyj?Fs2(Yj Ӫ[T&@םx}J+ s}8{1ii*.Ҵȋ2H6mpp ?0ά\M*I]mioZjsƺXSZ\7@<>(Bi%"=^mߺJ&8O7A IWLܩIƷ51l")Re0x 'M0wVϲ*S,)J\ C/0t|dZ? .~yܽs`\~tj껯R._mtX_FteyҿPFm` 6H5E'r6@\`$mH'd`$e u Y|eA%1hƆmv3f?u.QcŠ?S/[XX9!($|ɛܸ 3.j Qݟ;-ɡ[CZKz/,/غJ5 IZ2u:hU ]/`6gy#HcwI[nRM62Jy:AŹQ719`?̻"態hE}5Z_:&{( 3@3S5Oxmq_hm05 ߈ һр>c{ s'..*6-)?1$3iJl +-BO~rl80</GdSt3lӔ1rMӵEbA`0~]"pHۺNX.E mp'8Qxqeȅ .DNŤ`0O:d9mS[ ݦC@,-B"ajFܬoR3$Bn̻`6-.WHȘ.!ca22x~]sdz ɸKQCƘA1v>%b,zKB\d;,b[bP"~q-2RyaljTyha8pYWs!;nLмZ{Ɂ+!ba/CѢ^eak.l9ံdq>xZrg-fO`1S 'D 8>!Xn̆m!E\y_0:Sy4.곧M}Y{:]m1idyc8hdxbq,q)Y̥-Y ?~NNb!Y#ɂ%: % r-pbV@>:ܰ5oҕŠ?oҌC|0@-L6og_"fS|E˰O#1!G5;@ ^&se7<[6A:/i eiԂNtSqnJ}(h11HZFvs]/,\?Z$:={㒝,g<-wN|0_&NPwcs+mޒr$ b7DZ/_Liۙe9?tv#kws>mt.d1n' [D҃/ZF:aoZGM/nX|Flp:H, e͛OMBk4soHr}'Gs.^ʣ$g3#ET?f(Tm7Ea/fAH (x}~stO-^XAǛHߒ\MIDi9M6_q?q D'O PtŒjKa:m;} Nۏvc}(丁"s-z̘X6+Qm,חuGr  SedØ;a0\SN Di"t sdޘ?o":6E/CZ97kLf1}"a۹] =B <o_[(sk`.')ǣx)5jD!/]E7)azD?mTi{ ;:^uW1xvgnUqku\l` {٨fnԢc֮sHY!9G@>;tw` &w`K?܁NM݁M=܁mk;Ɛo.V1 w٥3 ދw&'/ř M_&8[RO  \b6D" 6[ _zb3GJcn%}x< ̆#8W`swNGpHy圏vVw1Z.?m>颍Ӷy8ot I^ߑ.# x_!c v tλFeyv%B>e/lH*tt'ؠ7"+y19t +4Fp޷ 9WRȺ9@$_t\h6t!J[:0 Uͫ%b4dJ*Em&:͗>àDKeLzF4&CXddt~w¼5|ɜz<ae-~m{=]-r-7`x1Իx>ƒ=F!%=c!&buybBC 8&M3e>B(|)x>`K? ;";Sfp[- l9u4ڢ͒6. ܝŰn˺1ٲZC`7思gYyX,?ah2=5./a6MMa0`Ȝ~vY7b~a@7f}cAMf 7fvcߘmgK~?*F]Yl|N׍im>/YuQHfuc]ɖD>]9ࠪ~9xtr"COZho&Fj& {6+0#G5/<6vVH'-k ȅHܓd.WsPŮk;)v"ˮߩ\nebrg|y!H;V sݤ(cH^nlE#'?| Tt0( yg Q>;kj(20_eXnnɇigᖽ>0ˎKfugnx;>J{xWt$d)ς10OꪳH&X0|0&2Mz-&KJh޺_À*mU><; |w|dQ =ݼdm>;CΚ<\,mˢA3F=u'ʨ|Xwv8}E@R; ygchQ0ؐgUy2BobnuX[o9V#)dV qg|eg#x]1vHJY @2:,J`h8|~aHaeH_{Pl^ٰMPP{ZNjM 0y\.~!> qC3͏fs1j<ן}^x-ak/xQ=ZOxQRmeƙ&6>u"+AY6V 2AM'92A@1$^,NP,ivv}a4xDR)٘4|1_oڼ}졣?[U:wƔd;+ ޤдah:0/SW?e騡dpϝɈ#XJ"G#ԥ]Kcwqlν}$s91GL Wל@/:s r89$cT%rMsn2;.M?A١ hJ Ըh2ݷɦXqnrz\ӍŌP1rRI;%ؠ qM^ n|`^8/^LL1lQ[]}e;煇v84L%̻Ԇ%o= Pݏ1= Zr0¤?_,K4kn u@F}db6%{0Ŭ|E@Mv K )4sAa7NpP؍y\X (8OBJoa6|ȓ upg8;E] zH+4)0B,C0I$f91/{R @(Ί@0uX4Xq,hR.?߾"\`67+F0N/ꁾ`locfA~TeG_Q,ێ@ڋaT*DLU1b1&T]8VfJ 0U0 ULv-,b/֘ > IydY >K`hz|FmpŔ' t ]ܲF^ WAM?9/.mj$q_)rg$d% (Sx6ePhOQ-Q_;ĘY҂rZرs-+hY ,F?-LmEjcqVI' ;O|A9i1FkKػsq 07!P{#sL`0a2VS 1êcl50 kUy`G`8S, z|1"{[\misKH㠳p8)[ȥcY<)bA*tEfT,Tq.Ǚ[c]bg=@k?TH9  #Sռ >8  %L&̆ߣqc],Hw1)j8Yg$Kh9jqc7K?Z0q+\,>#(t\,+d] zU?0"w=CY .m0,ΐ-G ~P\DAqJM+n̆7Ah !K^i Q^a|hi|P֍)sS xE~t5RKTZ! 3NAg6`奛~p">GRֶ@p}AbY/Z> V^X>fhM?c-^e(rjf GauQ42  l_ <-_KzK4楀ܘb9wz|-(-W}CZ]k-:.|I٤2ol8C$=ZB. ߮(vɜG ndi]X:w8]h$wƞϕHn .`C||kUQR3칢S,<ō xS, ySV|0Ų=ȝf_eܓG&]ˡPdLZz4E/:\?}$X b DI ¯ǧΩ7,2Um]/NiyU7jAun+&Vkc;)^_/ؖ~ blcIt vG)(SQ-|Uw9;0YGЎr(Pjks(̃ap^A-.f-bao_Buǯ`e#Q&?[D8;}ڌa xaS}K6^I. -&9)Ǽ$  9Gpgz&!2Bi4](=.N]6)sǔ 1]gb5Q;r~*-vAf0s쥳bʜ|{dPh[/S)mMATp[ :9vF !6 2_-U͡$7@I'N,Dž9YWPȊ{nc&Ss{dx+oC-.In_ȰցY*`HC9lζ\ c`"Q6C^5ZG7cdĶpؼN[UBK'pydYK;5 x$8JL7~$N8PaX-*7|%Z(:LKj'02 ’jF*eja}t9.)=rL" |vRQ|f.ttrjeZX &Aα`A9 Tv ]VMT_uȋ~Jydf(x2#\J٪t/J 2 93r04 :\t*(,%A5@l64&V[tShLu&2uVYOG{ 7]Q0O}k[~p&v-bLi² &,f@9ak}B-Oxl$>b}H4ٸc{̅I.CSrE%#]QRSK1pb5s[mǾjƬ*[LYC ry:Ios;X&$,2Tgqg{ʚI܌i@ T #N(05I*&WriLpM`%$MTY=^GxV&h&fZ귙l aU{'s7^&.G,h@*27N 7$.ٽoPdj? vЌ V#f•ynA9]0%-LU08,'c,GM[7b)k",A fc{C$ tD0D&q`͸^h1ffmDnZ.U/GILq;x *&륐|2Fn"h Ez-RdZ> =7U7`Õ+lzbXZ(R!6Ǭ0>Z b2>?=bl vh$vU3O>U/GUيj$]s`xmڼo#9RbaYˤi˵TXZalm<;ŎPEqu6$#;aF`UMIB<-+l9P-$aeVugRc1 9rSaEa+27ӗBvo!s/>KųhEmp' k$ ͑6b5cGLj$&incVK4Ny dUvJ/Eo8&;i2:P$bWE6 3fH"c/;X*#}b3ayHjs&,{&3cc g0pw*k۞ #_iϱO'DvʒeXR2WuYncJew M2#6TLs9;&*EIUc?aƼPL-6g\C=xֲX$۬/sx+NA w0#Q0\^C,] ~jjK|QC%5yMV1[pshUk~@lZ\ghҍh/m aZsv>;]2WwLa>}18Ḡn-n :KMM8Glnhlƶi-%S.IR.w@<ϩ,7?'f`|ryh Ab~.Cdx2xqIL% kcXMXp!—0~R 3ťw걵a n{`ҍ y^6V x~Fe"1Q{ڏVBa儉fł?=\Ο wjUy5#QMs5p%'`%`Qy-2{wZ~aX JÞX9`1luG1TȂ)x'3WE6@='森$|mӀS0z4{@ a m̞:`c ZՂ\6vg ! {GHN!L7g7cG'n9"EzJ&4z ˡE/%-OkrXk?~`S:o=ɕw>%#Ik~~O/{E̓+Vh/{}éW75Fy ?{oC2߿iHk9_ m˯_ߦ񁿼MV6gH|v Y59yF_i@~X?x˸:lZ??PrA5c~#Mleg/?2wLAnÍ~T}.fd'`IYBeɳю /.ZʶEKM5{NǖQb)fֿ}7endstream endobj 178 0 obj 85442 endobj 182 0 obj <> stream x]IqvзZQ;J:mAY4=ȳqC7Z0E8ҴBVU._.44ҿ_?|@NǯO_><\8gOViG *פ'g yWյ&/9?G רOWR9}~n&wwZ5Ø4~Za하98q8?>Wk18P%_ò[ ek*NJ~#,Fw)w~\aMFS:Nks͕ޞMovoV5ҷOʨU]0~cT`K ⌭(ƱjtLy=h)x&?MlM0 ,'y˹ޜd5a\!j23(C^B^M"N)!֫d\!('`F4o}S^}[6bG}H?+bSvȠvR"! o?`D(YX2r:?,=i&6SD @4Q)qe~`X ?Îq jO23B"a]YZ:xZi=G3)$#?=&FZq n@yEnq\S^Ǟ |;[gԉ@C!AiM 8PZO`0/%ؘK??kAܥWNS=`.'(rʊYU2j22h]p]b34U)8'62JhbU@h¡2W wB'D)|JaR% ٫E«ƙhK+H"Z2r*, v SSl iri|o $q(QO̍40GgZp~PG,duB9Ȇ>/^qrhJ(Oi;6:gHB\]AEU@RR l] V)8Tx/pKJN,fVaopda^_Rz|)/BVbaif~TuT5Z4h uE$u:n\]O^G?IEv {mQR^ >}qC q jp%?`;5#"(6&p6@7E(- )JzYA= k}Al аj|I+nY5VfOӠ?B5Aԋj8 &L;/&h%l߼b ^RstG.pk;Y MJ7&7~p@%Y(i<R&`n!8:!9C5UŞׇDl׿ J@l}e Ng0ZX5Y̺dtAWJ Bzla n) \A~ MH='\*_\uإ@boSb Rj$s=&iU) ڴ-f*x|y29ǣY/ r.MXhqʳ:`$Rh'dD o /P%)|4|}WC~Ī=.n-w:eJcg'=+tB WI\f4#WW,`SMhrLtzPJ,N}Toyјj<ӈUGWNCR'z+Kh_bUUȋPӓ)oZS&)rhrP`cOyTmC=PR]4}VV'QQs'iG韤w7Ac.v&Sp?Zioht cU9Ke <.Cts:NY7VX+x0lz,vjB*߰Qeݘ6Wk֝q?4"A] >PGA[`CE%=ʒ: J)Y Մ3j#C 2\SǾ4x*i%?*gAlE{uSʉ&p 1K0SŅDU5dʠͨ¡&ybXFGŒ5dJ@ 2 %1iγ ("JCii~PfDg?y;}X75'Y9P=AK%$X;"ίRHYR( D֫$K6v+ DB@4Xk #|л<܊Jx>0mL6)~ox*.\3I GYٽG5jBMIw >pe1vtd"GN*E &D "i =W3uRŘjYR8n/kNs!9F̨͚f-nSPX RFּY,ӽj SblC.eƑҏZ(L#LL494~O њX `\HkZ^ il6NRW,iLq P1?Y$)=۰.#į1d${k%E4)a 7Z S9L>Y7J=-#L=f#H-Aaj嫇໓2:'xd:Y'm~w>'?_ca !GHtNh[|G ߝJ(P ͻVk5#>a9b̴ [ÓS/e?q+Hӷӷ`UkcҰB6MҼ$u&M[8cE¥)7'MmfTRR}IVJޤl'`5, i=EݧPpL l`iSZ u mn6 A9HߟM۴MжnBB/>P QPB<\X?_ipd{tς-KmGbv&RABB|w 7aBy$@m3LLZ H0/i&!Τ%p :a!2LLY GH+0/i&]83q'&.pn17~p,޺K#p !ߦWeU4%r/4}g4Q'3yLylXLw&-Ce3ݗlVtgҒ>DZ6ӝIfeLw,#3ݗ/He;Ӗce#ݙ-㴭hha1\=7,~OcǦKn6N<&NLڤP%;!iR<#?b;S+G tg"cƺ3+> ;㶎v/0\xT 3djGyg2qt1=v8v}ԇÿ}oo⦅kkIյMwn uB'@~ߙn/]OW1銞},V3]>@V6Ɋ>~KWrgt2՝ ²qLXtg'l+/ch<2? ^f5o+?hs==vK̷Z1'L8n+ޛvw;Ӗ-eƼ7iɘ"-ޤE{~d{SLҲULZ ޴%~d{ӖlB{1AۺyFq/r,d`%xUďk>x9g7LpJoۯ&\IþcW'S3NxLZ2H/i{IKiw&-Ceߙd i ~_Ҳw mL[і}gڒwq֭VG=5=Kl:GȡE/쮱赲+'DL"e#NNx?@LY';S5+3e X:S28LX/lЗ IKit&-!pI[ =kLɐA2??yE2 +wg@~Йa@_)c]UgB0(_b…_^i 0ick󨤓ХLgzl;fz"A/>MGmnv.yk25V,l2ŦkJoi_XqtmBOIW)r)`道? ̠1En&_Qn?h|ijʝ3kp%mGV*"ߴaOe;<^a> w74`C IZklnxF;<٤hi`6KJQ`JϮ@-O7MxtDOpZSo느^Fi@Ŵ֢}rhCmJ!(#r˭jťv9,^զ{r(o~;_-&;Ifmܳr *ߩy3|`%r:=f4m$j9}'ԭښ(q56$qmZ'N^MYv=}`X8Nj,MlՏWj[ex6GJ͡umզ/UwP3躇x~D@"ndZ9J_M((f+mM^_)虛EN?(3X֤" 1CjO YlnlhQADK?vp_}pQ̺ccmHiQJ G Q< #0oJ]|r-aچt;Ȃ?[¸5#%b`Q9݀Vߖ)g2W$c-JXÝԲ -ߥ#:ipBv][ϳ`G*,1>/5*} dZ*›;(87[^12$H[ו]GDKkA_3%!4Z8hetⵕmN,+2Mjrص)$G"ub^Jbi?x[A~}w y,Br<*ySz܇(`٘gԋJ"yrכ)KGN OyEK=s[v%$>%T FAtU> _fŠk&,4LJ8⫒F` SbUSN&ȶX&FMv"ii6WM IeUwh2>LaJ0i$]'V3,'lS=rNVŷ1B fjѩA;Cpa}RS=O-P´2bЮ M{6GtGVn1Y4dxX ti?;>G~'C8GgQ5|#fLA ~A']'n^Cib+? Q)fpɕ|eۂ>k"~l[)K!^#y9h9C"kWzVO9./) byݮ&!.ĂRmBs?q<U)mV|X 9n.5M0|:"گޱkw),2͗D3( 0B&mϡ֑D6ia, R^]*WѭMі&yG=?;x^ sj\r'Gl!֤cF|]K +N먇N>Ch=ε'lCi.99;G%F .%ZE)ћ{@ĞnwFV.gĎ<9TZ:$#u?w9!f@?_p2a|VB$G%_6xq[<:8DC+'0ؠ13n:Kªu-Ow7܋;޴vF=ZuP'$rQ5rbOT[+(/^:f1b[Ϟi -6==1z>|~b8~vYz1%?`lwh}*fB) #'dVE߅&endstream endobj 183 0 obj 9453 endobj 187 0 obj <> stream x[ܶǃmou4.Nm[^ߓ"CZI㡝Hw Kԟ^wſW/vߛvnvw,?W/p Qg;JB$- sp+F{w8JQqQu8*bcjpGp~k5nÑKMpfS eM?5Sb,ᔊχ#%RI\5 ^ڿE9/ T.rhLCsӶsj;# wݻ7.ٱŷ+7P<avZ}9ҁ-v#Ns~0G;5!twD* A1+g0|[Kp?򽮝Bgŏ՜?? kg9݃$Kg{CяL yt+!Wh?R^ Qr0\p0~7m. QE rGT:X*?A eƬԤ~~WEU4U5su ֺ|E Td~v5ޏ`X@E)#PPytqqtV[Y"n~K9=sk@v[F/GM_m`hPpxkkElz4֦81ж :9WCX~R&".N֢g^ DoX?L0F uG~qu]HpƸgxo2z/Bo}Qn@X}p]# ߊhj@?ft.:Y;e7mP bGVD"ik-iSU_ZDJkq!f0n IP_^@ z>%:xaTSicmHTicN3GZ08!@f %N+zz6VL!VX-ڥmJxAOWw{؅f1#2 ړ.{ŜC>f!?ǖVk%rE7z7"o[DI}A"ۊґH-YtSCh+NKvJ[okߍK7~bco*DV> ZhZD+x ;^E^d2\9vՠ vՄ%XYb\isX[,҆kGضB*zMKr}ԢRl",;`؈rE COgޛLp7f~rN$tЄGYDoDQ^7Kt!Yv ܚu ѹ/Do \# Qs}DkH&JU돃{ %O۽ҝBegQe5Fs%!g-'XLi8dPϯGh pn7ufF`?jQR"Ysβ}֤S E7vmE^"{cmqiC[Ki[i I8o,= /5_d >u,OSZc! Xq˨Վ)/B61lԖ(V0pkmQ͆A\՜s*v尦,_v9Z|kXX4ZZoۤEso,-;YZZUۋYiRoF{i\om%{J[cEߦ-Y|[m⑶c۫9ko/f򆋦I.=5$7t¢o̼dIuq*iTx?ZfoHzKo,YTco-6mkkY9IV?߃KP`ghn{нyh?ۛ|?Bm/%Q_lo8Zfr=~*KJ["~iKiMhZiRsF b@5GeBa8Ą~7CxLF^JvJ4RYԧU{܅e_NJD-6<P3>l: oT8:/YlS0 hR|Hxjl'!EY PZn(Y?R$܏v0|j=7pK8,~gwJ5E i;L@j9LXA&fdt*\ǙQ>K0_>MhzL_sWMo\}w>|[;h3Rɝ$F-0S;oĦ$NݯE6=&K d׆.\?ŕGMQ dT~ua~Hb~?endstream endobj 188 0 obj 3381 endobj 192 0 obj <> stream x]ے6ݘz۪ ;yX OyهV%+%Yvkl7v?x3qM`l5p*H0d ޼??Wy{xnc9<um#=Q y{#?%Ng8tfq׃V>ep>%;ϣ_x/^\k/q6Ƿ'6Ι{=iҿގǿ3HFtdL( # sc K!5FuU뜌_+F 8FpL#oS l=ad zaxMBaK?~$ :ӥҭ[ciXnKnwE[?mmkxq7]1rgIh^d Ȭ;2#8mp !%,5m=tI95Xycf.Q=xWGvJҀ}RO'Qn`Zޗ@a%,X2bxjbrd ]0a`$uy'rȅ1Ҝ> ocߋZHw8(XxpmoN"b- aH-3$H4~| MRj0·1fxY BsQw)\>)y^ts[ O@Iw2fiʊzSur/zϧ!A)[o\MdmUWZW}2!.; E\$0Su^Bu.f q@up;HA#KBzHSB: .GL V]Bh ==F!Ik?ʩ)`n`Jma?qqM[ >fqiwy)[2gߢej/Ǭ%TvY0I *z||P+.g/~NJ㤕!pKݟESxf,g2)"E%JwSjd^-hbVIHS'iP,#эEjOtOzYIr LC )%M~ٞd՞@P\qr ňK8u쁫A*#d6| d)UBX1̈Ҹsʵ b!ܡ)+K$r֗or^(oߗ'0.#?:RwcI 1פ2 ʊ7zL &]n2)i #'%u4+( Wd٣}Y5% QmuH!lgʢ"'6cxɀInu3SOE1)1O1ZXE?L(}.t4CLz A jFAMfD, B#ӭDNTtcvq/S&WZ|42x*ORHZ"Zsyu ׇțҨD#ݗg)6F \3W ѝF$1]nev514nO+Ӑ#]PPK#n7 C_ʽU6ЃD._fcDa) '`W4FO u ~JLق݂jЁaoml*zݛbfqQaB^h}x DvM'tzv"=$W)9xM (MMO$9qч~7jv ~3I q{ij*d<1"Hw$sC7 T,=U$r.F \"TJ½.<6el4 F9lҁ%iE)4^gP -ePrWɷe'"^/@Zmb{yv/4[d!^ae=fѻ/ bxbG,Q,[Z#5_`E☂ fRt}~ՇLI{yz-(a zg>˿՗<dzr}C\0l <|CC3U7Tǟ&gS+r_@[DВ ]pvs9Yt \%#w_b:Yw?Ȭi`lӤi|48i6N#M_4k[ia))ԾLU r4F|ͣTؖC+ P@nDWڂXZ~qT53o?n~,cMɴ;q{i w6-2nkZep{iXy cnX VP+Dh(<<+hUkQs%,= 4FҍEj1sg"fn,AΖEbYB̝- Z5l^nl/}$Ձv#݄.gJ|p~ w7!w'8ܷi?;ɄlUhظ[prg+FPx25RqVj#{[PYTIfVl.LGnWq=5oh'-v!W=A@\#%w$r-O,yrR @r=oyĂٓ3AaG?TO95EN-q)PPY~{>endstream endobj 193 0 obj 5197 endobj 197 0 obj <> stream xYo6_G ҼթѸh]M|;j_+C-IޥFHR 9i8ݖ?Y.ϋۂes8*wX˳#%dՓ䊘FBT!U{E@ZkUzAꗚ '!DT )a>ieeޤF c-I +RtnpWʅ U7]_'\a$>T-DfHH,U-z0"ExHj^Q4Lpu'eqPܖLb=. a]rM~|{<-v~+I=W~U헮/wP:HSgu4hU!Y$II\ zgG1^m1DV;,:p"5Nk|_C8}n 7ź Ѡvv\Ⱦz,^2 : #?Sw^hJ[sZ0Tگ=?ݵ30$]F`[vI}: .גQ}SB-qs(Kߌ%XrɑlOwQLl3 טU(vĂ:̬H@ä|Ҋ.s) 7}ϻ˨T BtӅKBW;,MxY;h 7*- JlFh3Pݡ5 4 I3b3DA䕭M6Hf%Jj:SX6@܌~ ˊ8~r\bgj4zq2B 1pלǰ s,CnXhD:9Ъ\Ua\#WW'F:&tmg55$=M8 xϡєWM@6MP5PW4m4jhohbr.&&9hf ֢ fRh= DS^%&߂ 0T`@ p1HMk=A!(L tʜOs=㹁L)3x8y5W4J(PKA6.Zt{WQe5LɆ>Ҵ܉{s>1@ʧ9#ϟa'Dm'yJ})H(089-x1~{zy:o!` "YJ?NZor22˶B\ @nh֋'di [V7{6FHuigvyBLzP9e/Ƕ%6F9bfF]*MB &f+YHۑ$03}SW@@!HȭNC+!co!ÄP|v_iB(N_ Y7[=yekD P9Y7- Dz%}olj63rՋE`Dz\ h]-8\+XIFdv;;.ŧ`q % &/\q&Y?H>1RS17IgF3} ؊RSȓWr9 L5_|;2(+7xU3](eQ;,+p8hc>3Llcģo؜S&cq<~N@\˂kNSt}utPQC.endstream endobj 198 0 obj 1914 endobj 202 0 obj <> stream x[moQ␢./𭸯Mv."UgI ,ݝOe'%Yr- >3Mr'Wbr~}O ;IӫɳXd'"g399;66Hg'/WGә%S9^Mg92:Ogis]MsѶ6SDK0h-3Q(NuvPO B9Q^H)Q<:uv2I&.Gr]ñ(dy}1JJܥ5\l]kWYxi>q6KrPKiOsn*N`x7[nR.]atr' _ >dvdQ: D.n*9s֜.%yZ&M[ó/*r-3( t q4ꍬ[ǜY¶koux0y$WtŁ̼$`2hq]?U؍-tBqyvBʰ†,+QNFBLpЊeiZ%ΔK+jە>"EPqI<_4 * _7\ Ƙй($WD2˒THVBɳH,בjV/ဒG)\X@p^eQ`S]}]!PZ nIy7qKo)N{e"X1A`2$\n2%/mڧzTVSkP;cEPFo V p|kW L^j:ZG@H@5R{0 r0*Q! TQor] SJ⺢j*aQ)mv¡*#|j f}\@22~O}O@] dfZ6)\7/u匷w94#@ ⼩8KB ʵj!uQ}^ŵ"g#y;5 JBaL١07!/=ԖYpMG9D1p4^S6^=:7^dtMNP,W<(M]) Цn-k)v zqBЇo#H=;肵EHm*2uH3F;֤B<*$EE6$ԋ z'nQO'"M >LF N`LY, @40!争WHpqA(S"@"㩒/bɤoҬD2N3SA@5^/#"Gv^U"!xKh{YMRk Id T\E 5T!9Vnfk(][7$UQ8&8GW^ W)Irh ki~'#)9eF3*jƅj]FJ}Qj&?L龜jh .?uf9liݶu!bMDs;Tj>.̀C /~i~8HnILYf[bEdȵ=Ku rA%rd/Am(r56-7}7IoIDο/\ &]Iޓb$TRDGܿѝ  >3UrL`IK$GrƭeKT`W"Fi$DWv""N,d>\#Ôyntj'^yC;TwޛA(uQ*xP4va")e(E6vj>Zz:+8T"=-?Ź^&F Ck;m!`(փG+L2WQ| P~o]lZw!7)tMyMyGηz&\*ݦ5:8GE!JOI`ƬnuAX=zL>`m#=tPigHiIkXqzcxk)}2qQZ`u lrg0lΙ0xʛ;ZCyuph9=!ߋķT\~^{*n;{R3,bG^~a[<+O /8t+Į6<2p&Rڰ_m+ajB+&IZ*6iI~.g!އۃWyc"{{Wd.󗻢oyp {U rQ^GpzoH-T%o9X˜?H!_ATASsLP/ww\pJW"/zF٠{s`T|= ¡Z0"!h$?1< jS;أ,d$8$Kߒ>}Ӣo^>@0j"LK9anW:I^kOȵDDk/#dQW_Ր]M?}(YG wOqmכt `h@=} x|Lp'&QP|F$3ӈ_j} 24?kif>*ѕ>*P!F@p?~X&;t GW߅wrЖꃤC+m]hn;^MA {}]4z).#8i1ihwВ}/wo #qMk75E:&жDn6T|]03q,WT| -09s|1OL`q.xPSB~!3*}Qi՗7ùU1Ó9gDȗvy3e|'팪-]%-C/P+}^|zGJb-AjX\>0 *x^Oendstream endobj 203 0 obj 3232 endobj 207 0 obj <> stream xkoG 4wEeSMh,@ 8N`IH'+i^rw>o0 {C-S{v}[?G?|z a%6Bb%- 70J.'G-_Dlnňzü}v˕ձ"Y-5l]sɉryVV,wP˘ZnYjNm51wqh1:"%b%B P]XүϤu#\Qc@F.*XBX#J9%q"լ?Ə_G#&?F]4HƥIߣ5S(bMRѰF!~aDeA_t3G9oN>xJ!udՏnW|`@PRGSAˉtvi(alM]=Y2Ya>&Ȁ0iYA7qI1 sur!$:"6/;+zѥ5i=1FC5Ȅcp1!7ߍ!X`G{JBa )Ķ8Bޫe*eNiCP*ۓ-JP^q[Fn+y},4"XSgyb e /O9pޡw}M%/(KK2Mfp"\l!u«i};_:}HCBY]*8A:GAm3}I}X.0%7- K"—;T- ] %Qo穸= ,X9ܚ3i @]4f6e6mqu Z-K gokAwgfhaה1 QG%5\,BQ-qk'͑Pe\),!@avX笯7vlHE:9\:fӟ6cJ."b6.*B~{ݖ:>*N55vE5@n>ORдTFvE*;T/t:\jzԎx>hd,=d &p)?thՊD1R Մ[8*Ȍv)@nPjOM ոMhڏ"`qQRz[9:Q^:Yc㛝,t0)C[~R$q;zJ5M~_ xQw67kb9MlnTF2UKY)UXa79 C]ݏt~>~ڔ`2~>"rQ6{LzenuLy1؛dL̆3ewJѿ??Ts=*!x- Pi\)sԈ"OVmKFIG@F_~TsTXKC C%%_ / y)1fAvy84!2/gxu]r,?q1 'x3`ɉ72SYneh $a=2=}mơ""i"Xt:UԪ_Oؚ40g񳼪ANB V&ۚH8 q?/ =Z59u*i7AZT9nJ/m{tY:J"uB坱%2:qQ(U5*yo).nrJ*sq,A*Nb*~ gM48@CB8 y< kae>译 (ɖ"@gZD[/`|?ajn+(O%VL#1egF HINS%Lˏ[;kstZo0jolGHGw(m!8 pF}DN1Tƙughw6ȶۃqfi@Gp!X傚RJ ƯUtkvaiCѫE5r#VmtVRioM.j+ӮᬳǒA8nmB]V Pz h*/Rj|MFMB=-z+^KzYO~H P\>~O ]*қ'^Whp1wvw^ǣ%xE)}xZt4.+% %ڳp=ݵܿ?Dg~a "upk =xh~zyi޸Ŭ67(ޮ Tl~=GWءOß2kaչ_L;7Q'*Ƌ wcEA&jb гßG )m&#1}n3>Zҧ3gRfzs6T4>Z1\>nCTb1t!bͩ!f8D9|Sw98ʹ.ҹn(c24By #-\x 'k> stream xoFt?* %\|0: h$Q4D]Ǧ;۱|M,Oݻ޽~ #B(o;]qnDO߻S@3p3]BH ":Q\|%%b,%'LEzp8Zɓi$%J)paͤH$I|hTvf7%/8GmdK.nnzۗ婍M ա'l0=|h`g*o cbV>KTW/Q5ɧ UBN;@wWg'm4,pNYa+ [R@)(=S2!*Tj$pz]ZsVbN!\k˵U;yÖ /@NӼh ,S^ij }'b./0l;DžQW ]rQ@(9@xB6Gh"IKq6кϓnsy(b*IbQO{U6 %tf}>z͂'@D(} ٛ=grC,d^h,y)2.wlF@`@D8v[A[t9-x*D8=6:EuV4v̟\f"`62oUڬf.Ď2ۑCiYwx>*}F(IYxyqu_4?MGs(&x|ȸl)uJ.8HoAOC~هhF}nPՋ>qKQES3ɱ7K8<̃C6NY;ǝQL[cG/v_4&`3OD4_v| N1Í/a{*~u7W@3NJjСВ{#YNZD$kݭG ~ml3TLۚqmWbkZxc;53e+]4x^WVTքx^uާMH7| +YXqFUB)q9;z>|SqS؋sqz+n֐ܰyoܫ7ę%w6J4_Rn[_ϗ*={ 뭗 =cRȦB>X gwxxïtÅpŌ%!_ukr)cQ).)$0yEendstream endobj 213 0 obj 2025 endobj 217 0 obj <> stream x[{6?ED% h RO(\q/n$NI6G:!F=o3NcIp7drJ.'8ydM>NH1!wlI:IIes8)DH$щTd"ʦ31I)AaBw#%,#vTQyMH+cY4ŔZc)Ś#D IϊD ϛs,Hϫ u5jgۚ$Ɗ@%/LA  Ut.ʩߴRu-;q7{< uP".\)vMFf5:#k@s^m`>7X\Ƃ[Y^5VH{R!m]GK{n ڨV/HL'zR\a3.l|v..$ ЏsLvH==Ƀ\/uS"ݓO  a,٦F S%qI^2dr{TPD9uLHg5Ac0]%OםAfy2 86-rJ_~4uca;cTʝwk$1B g5n1B)As ]Ua" Y^&5Ozߟcbvgkuc\ 9r1:JcέAvɇ hGpϞ|ɟ< ,ؓ\[x{yL5DQ Ua8uI <%+\D8a 룈k(xF:-hYdL;4VRBSVGASS1ZYlya4H^ nW 'Cܞ rǛeιZ?n5Tw VC=ȅ}K S7>}К]@'4F 𢬭LʂUu1.}MwF kKY!(4?G_ΝQȍ,+Vhf`sllIPڤp6P9Q뛕J*Eb$rېcTQ^ׁ-[jT}vdo}AAwX~pw+1(O] gȀೢCΦ(&ʷVvto9O&>YO}Ya MX3C-7KLduse+:l׋\9{zq"=d1X>v`=0F/N%֟zBiAM lOڍ@dM%F߲ FF^@ʍzw(6ѕ2=fC}׃6ê]Dꚓ0 Q>Ʌ+e}վ#%! 1H.=~$m WåS`! E,' q 'wr{R{UWdIш>Ww>_YhK޲˲ngo]ќth=VpM F>9>[֘ |XM{ FS2_pg`endstream endobj 218 0 obj 2005 endobj 222 0 obj <> stream x[YoG~_1%lK@8(( {!cjY*B.YUWսH˿磝292z="Edһ0R⟗!5nq4Zh7D&>`z+l Ro"%YLwB[Pk%=lCle@i; +# XAڙblόS,C gԊބX,1LL&&6^"[$_Ѽ%2"af`yYO&Į-| B ;#au}{r 7Z뀣ϔMDPoV ~i F~F>M <ИێOџu GP !"-m5rO >ȣD=`]W+98.7S(W Sd>0?/LPѴLBIc( -IKѰ~JKse9q N| np~tΌ>EHm%̹E>|6Dp f/v< f˚ "^hl|JSgru 'Zz`e89f5C;`}pVG V:x>dKeJ0)4C觵 4K[gf-p,'bL=ωRvэKGqiiCRi>4eδt^%p7j 9q3ѼK듫_]nYM!5υboq|E^ISgT!,3"U]-*b6YoDņ"ۂdƚse [2v')}7[g=leEW7rKv#t'ZùTcy4 Grͦ^DSHT6D6yh?U3pÎZWަNj[xw_bwV{ [i$.sB[}C`OFW[qhJR M1iDٰΤfwA7PSWN] zui1pSL vxgv_bs+H7p; G+z,\XYp;=z"T*ORؾ O<6ϋyWXc̾1̾h. ?Vx'=<2{l6PBC7s&[3c@uaIx຀0YO2V(&cQZy_^9\8guۅphu9VL?ԚW'Cū`|moa=h5x%4'QtoNƉ_g8?ϏgWCirl=iMuh$z崙'_Ap(QcQ@stA3bP_ٟyg_k6endstream endobj 223 0 obj 1930 endobj 227 0 obj <> stream x[Ks6QՉoNLҺK҃d) XPqҴdoX _q/(潗Ǚw;ǫ^hA,MN{r2Q{iB2}$Xp?X&Adi 2q,̣zTZ4J%EAfO 5KbҤ?,xP *BqA( Bo7Z$#/Mde{8j~C łUhrp,ԋ8gypZMN4cjZuJɩ$9(yc.bc(X9m۲7$^ fy0O\̮ K ]iʰe;{sik#l喕5%Ɩ J̽̓5C5 esL(9?.ݺy DɩµbV!*ɛxW8Cr ilĵD%TyQANbqx c=Zra-K0E>6j{j ܊ $=Nf PTIfp 0KܺXK8vͮ-O)p0|3QG}j%|\9V ߑv덑B$"11j/ *$~&#TaDFKZnG9kIls{mVp,v'ԅ-"'i΢KB+D@$8ȭn846quݯkj\k!k5ɾIči,KkO6FRJY@fJ$c=`"N"ɦ1MdY۬/YZ9A@M9̽0pjr"Md g8c8 c )gDccI͞br'>}uL% q9qJm;5(X*fڑ̸ŀ52%3.1pb֙j<Qpd}{#Be0&\Y۪V *唅Qb(ach\mi'zk`+,G:U|l&6Su\SaX xVܛ4ƕNΎ i5H/ANwHfVPÅ1 ,`ͪr%0Kd 5"f6p /їMU80F=RݙPtqe萲7PZ2 ځ8t,inTCVf͝&@ zz XX7m8Yo~ؼޱ3--s|=\`nlJݛ5/L+h1хa-r[ƼTYEj.>`og 7SF@'R|ϭJeϠm~zfS%q Ț;:5KCb#̝ÈIjCC ܌_pZ褘&O˜4\wOO]l ]\L<$|Ӄ32wv>Fup\ylTg1%鮎pE`F-Qhk7TYj⸻rҺ{|sfpی3$߁}@\[^BE4n)DezZy!RXg<~< K;𦚕%17h:U=rwOT;> ^Wt8. 'ڞN.-zLX=]pU]\v .X dQz>i89Bg;?[Rb\7XKuZay [3\7i[fv2qMfAQӘl{pHR ?U2[27T\a'J!i;S8E>`5#{yl0LYzlVt6ϪW,/8Oʙ?^Ozendstream endobj 228 0 obj 1990 endobj 232 0 obj <> stream xWn@+z:o{}7U &"q A% & !.3uܱgRL>@fr{ BIx EjJlc Yg3Blx=8J[EiʙCQ%8 ~,JmjΏ oEҨFIm%꺮EY|TJxo92! )UWT漈KWpzUXh'IN:8'8 &oZhSibA zmk]vVuJP1/au3s,":-slNkZPqo*d=$ȺsK sDqH /Op_N6/*`mBT\~ )AW 2QLG롉 U7Ԍs N3h.0ERuVn6 I >PF,9n FLMD,]7Kg="+;;kI,e֞dʂcqܞiL]WE5"L+˲8G80IdI{'ފx2c(xy2Uܺ:g]V3l-`3Xl:~{% ?MѤ5F6AXҋ?{? D:y- Jp=~lwendstream endobj 233 0 obj 949 endobj 237 0 obj <> stream xZMo6zЭr⒢HI4M-i6C`N/dm}) O8(  ߛ)~P~ۓ>&^()(݃8$8.0>X`!de&Kku!D(<Z; `O<[G,0Lۓ?daV~4u%DNȿI'Wc&>8Z#J7}GPňR_-Ts}4܆MF.W1=NEUGI<b{>Q sQCI`WJ~1Q5iɨchҀIDp=\2> JBzmja+m*E*l7&FuquL Qז7zҍX}=lH͐*/ {H ho;؁>ƔYv`gWit!Om1 %VmaC{`_֐ !y[%ҥd|RԇQw{lV~#<nRg-.mR*zmyXπ듂VU\YJ Ox!YQ5T'2)Ka_W.Kِ{B=[(T\AH>#[N)9s3yZ?uB-ʅ8/"S6ķ|'] l=e~qvU! DpGm!vN ×8;F* aeC !X B9da]_'{-q2g/p[lċ> [#`7iy5|ls:\~vXjl'gϣ?H"sM"U4Zl@ yioi+mu >χǐW/x2ڞ6gb`@K-|nSpa SQOر ll0JR,[=JLAOendstream endobj 238 0 obj 1423 endobj 242 0 obj <> stream xYo6Bؓ~A6>T OJc߳*)}C '.Sɂ3fF^5\ LSZkd&r~/i ?NbxL{ښ plpOl>}" Shm<<C\yγ)zNČ`w wku]>'l|8&} OQo?wjMh)K<ޏH)L\׍iQ<3ȋ_.Hvz +MqxȭX I_Go{:RkÖ׃GAuagae~疇CM70Q8x9ťe6$6ٽ=C/O ƕoa0q>(,*a o__BoijND6Y*rh OZendstream endobj 243 0 obj 1385 endobj 247 0 obj <> stream xWYO@_aTx-GK,v|tVBd7\0kSWwrY]'VE2R(m߼c& 6T|hSQ:ɴsF: R >._'7VrN@ڋ p 46%H5qIXtrggf Dչ .;.'iuT/k:il]^+z^,.m Kj BddKoH/T|bgrH1ܬ!XPC [?#2*4#(VBZ(4_4gsV@eʾ@ @tl±c@vN]ؖpXkZeedúܰykOIk x]5'/\WsڴQ +]K1Ф!;&&-G\ Xgmr:\ʬK=niF@Lz`Ƃ.{rN_usA>q 7dfd J]i&5dF|Z's!2~mѷ4Bn|CДS|AB vZu0Nm嗞 DE cM'dcŐMJ.zFs" =RH壳@AKZV1Nd".?/HHlXؚz4 a{Ur?-Aendstream endobj 248 0 obj 903 endobj 252 0 obj <> stream x\o6Vq>(CY7[a@ڇNGmmLQ|D_տ70\ IR 0Eb8>DL"I^I9z,a%,NQdfgIZ”łgIt)2ɲ`lQ'"^Dzq%\ɄGi0^XQy]x6R؉$yp: 9"\r3TL05cn($ in!wHۣqW xkoocDTEi*ۂLZ,#F̜k#^=wV^Cm|7nH<{;.=Z/kRF@_rsϭ}6j p0Oҷo!8,HRji*k'g gOǃ%XIendstream endobj 253 0 obj 2346 endobj 257 0 obj <> stream x\IoFzrhCInhQE҃m *K$q_{#~Ԑc}f޾q9pԿgG_G3!6 ]^NMI ㄃#8|O H&r ă(&GߎƁ#ßFc_ 8ݒxA0hzHBwx< }埿M?p&@lrZ4#Zgd+֊Q;[C% D{f=`DuW b_EӇ_0zw~B9d1.teBǘV񤒁lfap.Σ5!YQmͷ2MH_Yj^GʼV]xЋb cT#-ߖa,oG8yL^½nʊљBpq츅n±At, !㈏хö<…ѳX&%ؿi`.'"8`9nyQG%w\M+ bs0|i{Rf`S)#V7V9`'-_ q}om2ًYLnf@ڞN. ȖPkE\Y>XJ}m_},~f!fTwjM>5QT]{vNpb0dRQ\RBJ=ٗ"pu˲Lqq20VkZ׷b^ ?L%ks}yN%d6euYg݊溵˻MM\ܥr~i*a?aݟtyߋ{]>-9{ aKi'b3))f7?&纡"I:EHレgdendstream endobj 258 0 obj 2536 endobj 262 0 obj <> stream xYKo18Wq!Q`oԴ%-$~l཭.&zߣ t7(sSμ3RA( yh]edBUl]?6կb€i"^j]|>mtQŬo% Kઞ'gh9l}g\>wFr fc㒾Q!>+PYP 1|@Lh.d}>xưqU,}Jgd3gA~YVTca,ZD`lzsZ1uTW>ٶiPԌb78H1Pȕ,ec9vϓPiQGM.|zBBO贸BO[#,K1 dE&C{sp,H fy:ͯjR! Q@[:l_=v#\ܸMV$7!0/<jmb~\_\:`7 4tCx31qhU8 ^kz ɮ9y?~zH0qejåcsP.7JponiPoePxɼ JXGp`,7zFAIrB{Ͱn^5{xD(erj|:Y;yoGendstream endobj 263 0 obj 1034 endobj 267 0 obj <> stream xZ[o6_GyXQwKuCfIJߏPqf0|i\s!O9O|;꿫@d2ғg4BeIj$JrcA ?s8A xža HCd)*cwDta&T$i,>RPU^"˲iPK~*Г"IB~ ͒PtD)Jzc~"x '\0*T;R@DIT-Gf4p4zKP Z.3'xCpE2_DA~щ%w/b+=hlM!L/Ľ3:W8fFna 38|QN ]^6'0{~~`+XAJg2LV}ƶe!̆TƆCS~[?Q1$ j0mc"0[VfeT'p <7\D Tgi`>J.ܜls iO6aP1{rW*d@iU*]aNIG=$5sϡWp FwfÈlΡb 8s.`C`hkLXZ=98-&&hJ|kFe$t2-d=ToJC᱁XA՞5vpCO2ŎGMďDl>:0ouR}N9%xLU-e4eSarڝgRyيxx԰G)c=6:4ڂ OĜfS8?Q} C-]OT16 j=Oq9TifT7Cep0bf^\wGp\a'ŠifEλ}iEvQ1P8cզ*ˢJo '.c#S|c9q*I}Kgf9ma<ޗV,luoT,Ҏy=YY!mN`*\(sWdI&Ǐ/ˆv| ]i Oc~%TG2xcn ']6&/ =@k*~&X'bubf"6$ax2ǴHrO`;6_]8v{;mzsGa;rI]ểk8i|L8V ª(+#|بm:gkB{:w!vɒߺtX}7bQ9mfes ҟ'endstream endobj 268 0 obj 1502 endobj 272 0 obj <> stream xXn7Uee}I^Rw#bF%ّ&{ ٸE hHΜ93ՇL /7Ud2ffuM]|0%˚vڨn'g*峣tV:ɚ*?V*MFNYkkż(u-+˹3߿ [%V*ᵒ&Ѯ,Quuz=9-+_ %^m~yix31Y'Kx pGp n[hbjBƙ޷k/Ⱥ&(CK;;}ج”6$|7Q%Y 8qV[/tYd쬒p#t2R[H0Hvh'؍;7 PVRNvƉ^R,n/0;UB]Y)pN7E_Snƒug/4;UkhN/4RRΧqW<ΥtٴJ \+ȱC̈́p] αX>| &GK@:s3jyWLމ3^,\Z\ʰ/a'k<|rzFᷡRhe%>a@V: DM#G_N 9%k-M[_j@G!0K*%ĺjו1sm}XR3"znZF3K! @Y:AEd v+QXJsgi0FXj.A1}IpJw)Yfy66]1A#xN4)PJS6bDhzf~NK*|!U)h5 RA%;n(_Ƅ1 ֣rUXjol0遳w*MZW͘sWTL,cz!;ty'/乢:37QPߑCt+%H#@92}7a\f2e&$Av- gsJq@1K<7,gF]{#S TPRBkzBDR7Qnr|=n% VປU mC]*WqxO3n\UUJ7n=v,(X|s"콍Ȉy5VbJȎ# B'*"EY b(4k>~[5+J!|LpBb:dq^&>G#O?Q2q̉bTsM-Ac_hZ'^꒞fB=zӄ.* m+{j4n`hWU_i̫'UqT[0Wz!ОdM,#9ÄmZJ^`JY1i\S)c\ۿ$Ձ[d+MKsB W/$3-p7K­15(x#M*gĘ7$+@LZ#)ʼnf;7YrK⿂h*faRm=Aitx/ww{ƀ8QSOZ8^NTҰgu a=.hjf,DSO8[Af-o k߷j.;-?i=IU rd€TR{!/M_>AsDOczDI"EOve3txΐYQ9^l=$,Dl_]Ǽ>]5ܱ;.`z cw0~ il>*֚)@Њ󍂡 ~Mhendstream endobj 278 0 obj 2415 endobj 282 0 obj <> stream x[[6c~ZXhiN)dC.fY.ږm|$vv(twR;_O{/R|=𝟋YMp& Q1)/ȳ$Z)R;XϜ4E9hža HC+a#M40y/I$X~( R<~^UW^"˲x>,KB?Г"I<|;+̝,JV'9I8PB<-6AaHC^kr'\jrYQ)Ie(M3c=:פ(&|^3IW&nbQ c!W<]k=<Y֣5Isizo[< ,pKgl0uL~Pyc;"ӣaf¼\A<ݗt Y Ai^F%;0V:J"Sg4-LV}_ox $Npbanb&~$bK uԦvq wx k+b,5>Kq3Y<O$+npy^3ѓx3dn"ʛ@cI+5Km.b`">Pq e"NZinO/6tUS`},;zm Nv͸<,+Y'm=a N m!ggJg-WL[:EW kC}Ͼp}2)+kOԋ F&V/=FO' hG#8&.ĉ|@dfzZre:&}Tg\^C:SL SU |[P;V vLI=',>irI2 ܳA6ond6Tb@pQztIҔI|}6(or n8TR ⸁VLf3(*W@xFHIZԇ3.gUpI6z7߳Vr_{8ӁLN(kUL"ڏ%Q$6+4]Rq`tK&hK϶94éi%Y/QlgʽgqG'3kwG 1S P7*5;v`[ǁz UJrSK,l=Th-|JAjquZYN"٩],I:k9%3%בB7 }L7r8ڸƧ׆p=/DQ|KZ ӱcHbbP!0 IB.0Ay[nc}ozOMv ,[&$^K*~kELƐc9Bj$t3GlFe#t@w=_KAfTˎO^$]']\*gw6 &Ԏ$͛=s.>c+/fGG'lWGՔ1Fv}Sͫ)jG͒OX/X axI$rjx&6\ʸLJendstream endobj 283 0 obj 2178 endobj 287 0 obj <> stream xYY6_G^yhBK]nRdOM[g8F9!dnXAJh`sٶZ)k2]8rQ/ckōp]#1dnK |z_17^uG58X Z<}G`qσїnjҊQpWr^4cfX*[ -5 B~ c >bC|($S [Yrg\7pJgz=d@"p }Ş$s eY9HS(2Ͻ#|ϽH@&vGyw @/SȄj궅: u+lg&⻯f^4\w]Uit}`G7Fmֱ\s'P6ICM{(ğaHlqċY nO& #(iDYbh8EGȭ.d#\fZW7Aikp cz"DA@<,bEo(ao40_f`yvX]Lɔtt ٥qfʖir24l;[q Gݜ1!OӤQ?ecnc7 ɎsyW:י2Ai7 E>,SFguAH1Ts\Ak{HtD} 2g|"yjXݰ>@5w[;v,uVp[EvN}zV0|{ DHW WL@$R=F|Z?ϵSюIq))U f' 9=H7vH/~`*}ʹO!,i*Iz;&OJÔL2Xԡ?dȫFh&endstream endobj 288 0 obj 1320 endobj 292 0 obj <> stream xZr6飾TD ^@I6NzAj%˖d @4x2١@`{bG/d ˿zu-vE[ 5MޛTFAȊ\ gI }1ooAr'a$,n"x*74P~|rY(Я``a%_![mةv%XۜvL`x^bG\T}\|bTWbJw*_4c >6sda`Zɩ`1Y|!_q}GBJZN'KLk%Bwfhᚡl'HFx~MsIx`o:%b.mK* qŠH[?'=CzTHX-,@]8{xd'@G)èz_5hZ8ϛt jk+]SG>|3I W}λ%jrĖ[UBZ65rZAfQLڒ!<>|[f e4t'%S WVƧ~ _1N 3Ί>%lm> stream xYYO#G_15&,KE˂}@X sa"吅(j_ERHVx90fr@x=M[J,(XplhT"S#FqbR cabTjm)M#"w6(33+Ti>UBH%JuEQwC']fd0Q"Liޏpz2*2[)XEEi&ܖ"\Qb],t*xrMnyQRmIYja3WoOhuAp\󫟉$rNHv۵cVHauq 'WD~$U 46HHä(Ri|LD2q ~CVDhz0Bf訚 t,lo%Lӆ,LYqPzw Ie) k>иX0'c8*-3(s h`0m'](jeYvCu*dI{x1^A%ׁ [h c̻0BL^Ec bơm:B͘}]eҊm*:$\Ѫ`#` =x&-K!AYòr y ;`/8/9gF28ofa 70a 5raMW*D a 57c= UKH Cc篠w vd&v-'Nf V-FNPaX i:в8 ,oz0#NmX"uMLNVjEݿE00';Z}C2C])5:L٦Bp ]b9mODqe/B> stream xZKs6QՉ` A ƱSf{qrpeT۲KP>Nxg.m Dŧ? Nj9v Ao< s:Q|25Z%L`ŋu*"dqY3*1( #Ī4 s"Xau u"Tc}*E#JFIxGRn/aV_ON;LÑZ+>.e[l°+2HpKLLqe/ncQ ! yG.&r^Ia+EzmɽoqxN)-pz^B Dv[:a&IwӐ "H [A2V4<#1;W:)WdXp\Lo,#܁\m:YÐsmqMB%˩mcHp3k]>5Ĥ(1?0~"s\Fz*=Z|}B08m3  ]MmKڸֳ*;0ˮ cP{ѵ.:'O~ mVsqts5ki%\0Vjg^7k2 9,v*$.Xxk;jJƷ6)Y6Vg#>a˱#n04DѷIjЄm&Fcۜ)ig-6="dYY\iYcAS @=!;D1 ,O~`J3CZX3.L-~#pg,4@78vLTe*7x^0BP_`!Y{lCx-ƒ5) .`$kJ܂.Rx~:KJ_lU[!l9)['׳Xc@f SEi{:G< m\{evϵl,Јײ"m暛"j=5'&QL~_BmqOj;gK71:FJYaO.)+eZ<~s\rsendstream endobj 303 0 obj 1576 endobj 307 0 obj <> stream xXKSGQbo^y/ L, XaJu*lN.Wޞ~|ڛL ?~9'7oܻ驅B7f/APRl0IkgJJl- Yg5B`;JNY⍵~M-QߕJ߇ҨF2oU8Ku]O_O;gd~sƛσose2+*N:sU%^[8Xh+iD@K,О/+W m"(D^K% ;mRH:L܉4֐뚤%8QVދ'$}OegP$u?a[|mONZfZ]UuXꬬ˼ +Xh k[ Jǰ&(SXc2~LVCzU%W0s:) ­ *:+֤8-x0.xmVa:cR5' %yz[}wv/ApHOcmi9mltassk1vGX=L*Ukqk9R@%#:~٘UKbsゞB.:t d)~A^ (vajYqbզC8HҶ]z5+ߟmCg' ٘Csxc1KugϠ ¯XU`}a:KtvxI×;M}c}E&[0& ZVm9괋^7 8Ar~:co1{'s_B> ~%RzM827J! 'vZ6w0IRKЧMnF p`'1fcFYtPj60yFgzF.V 䕲އol9endstream endobj 308 0 obj 1075 endobj 312 0 obj <> stream x͜rFr`L067+`++[ Eqr:m()y hŻrk<{zzs7;ƣb^|Vz?ӛI)ubu$B)G^ګ8rܤ7{0r='`:~EA`0̺A'< qq"ϗ9ne礁{=]$ɨ]A]#>zNiL bq VhEuIzhD~!laǏ\?'Q&Z+2E120˾֥jֹ&CƗZɏ&jluB?֩"4'׬5.0II{zIKgL+2|?pz92͍ZKۮ;EnuDsQI3x^:gHfHQ abYy: 2[#C4Љr4)8bcZliB%Qux4,׀fklE~㨳du&}JGj }m:.cbw.WzS|:ћpztg6G'tPY.0L^, L`(tĤ@9N6)ix&g[BNL9%ζXڼ}%36 ܖ{@2.}jG'Y:1C/FE3kK-?ө9z3/3Ԭp,rӦ0ٖ.j{ r,y,/fj%/8hD^U,-T'"ɗ0a[ dah_۟;2y;t}IyqoG6dWB7{(.,tòBL]l`h M;W`8/pׅĦK=T>sÎ1f}dc$9 S3;D:Lb6! !L8]cMl<9նa'FQ>ljͼS<)<.*nCt-8l1M XA Ĉy~u NJmqp–w3k,d"_"wqH+&{=3 tsJBTK:>e̓; ȶϑIv5QNuhU@M)8mԁ9T `opYagʘ7ߏ\h9k O܍W(78/~1^{)T Ѽ0*N܊!Zk֚H|%2.p[ckWXU7Us#2):\T7(=glL  G[W]7Nv*SǐWp_ c3[xm-YQL5W+q|hu*(ɹޢ{Wpl:'K! [8/?Ӭ)m EC%VKϹu:,=&5јhg)`?{1—]yCkˮcN~ƅQ ɶwqZ4[MukW8Mq ֘ךSW+_9ՠ0"m8Mng}gdf`u]->"򹞑􈼲V[SrVʱ,'Zi>jb3V)qi)" QLGr<{'Gۦvэ}@e+4a5Bø[ArR3g&SbDt(Rt?;hq˷oO|ne rpW Q&ľyůt lk%^QN;D}ԤxgMvUN;Cn6ZWŰa(jbZs-qe}hr X.ڑh3-`<\b̝< @p-Je{x>/(Wb?9 |+ ņ1NvN٩ziZv4PƖ|d_Pendstream endobj 313 0 obj 2825 endobj 317 0 obj <> stream xmN0E% /m ׆ReWuJ-) >Id)"]_9 (tz_,؜ -[8o뽸ȔI:АSHEbL𠓈ނqKyJKIL@oLd{Y1ޫ9PAh.tEBlQ;Ys傔RWNQuS!lW3eMƺȒDx`6 c͸4l[tMkTe6;{[W|cud?-cxDg|au=*dK7G=Q) %sƋlF)ĸ{Q`Q>32oΪ?.Bendstream endobj 318 0 obj 359 endobj 322 0 obj <> stream x\iOI_o1+<'0`cBPsim8wn!("4QU16gh\{9hկjn}yـѸ9LıׇW|Wb':zNq]ck^x:VG5]/.ך'9v;l[vFyNoő7F8)[^cR }J:NġׇwnG4nEQ{oD0٠q4g8;aԗ.a@>Z^;1x+OoD+k"ދ]'Yĉ"8ݲk+yzI4[ӱpP#97t%PW!Zԭ)C=/ԗ#:A,ޣ4G;_c*R:h|]8ɩfq x;+B_ذ @չGRAt$/ȫF50atw$7fJۭN+U3 mPl~ߐǀD8tV25 Ols3z2C@u1~)2vHzn@ a}[Qp@g+x2d 8!R\uMNSu8q"wSmRxbcۄ䥈Da8v$Um1e}<]=?Љp$>x\ $|&z `ݯTR>3oAWȒ8LSY|,橕7!xEUd[PVw/pGՍQѰLu~lz>4,_*/M#\!a;){`S^t+T[8UC᥺c!?Sme08%|"tӱ鈮YnLЃ_]b9ud S?K Ӹp}裶Ve+l^MM(T+ZflKΛG޸To?Ar{#V:WJo05g~xeϓ=Ylu òU;i7L{j%F*,>3Js9+zVm\/M|Fpksw/x7=y15S}*ziL&E/wU #-P|~,-)tN-rs~jI'u4n3blR.gs f^HAX&?W=4h2v)QGr+Oyb߈%(X-=RsBL3?a/FW3uYf}!-9 LHC1%Gg*xx6Ϟ NfͧY+od(M+P~W=`١M"ZWx[},>6|,VҶj]xu&OA]]ـ.H[ C.ݢom@^?~h4 ]ФAcV/dK @QlC>SOl |7m]=XZqNvzg\trT&㶤}J)0불ő +Qltlܥ.6Q™ H9͛6!lfjFɴhX7FG8)POt(U48#j˱ :,ƙfN-#R-׉K eo:d40# s.v7O^[T~t2jW0H6 z+ IJG)8' [ÌC]zZ1\a.݂&RW]Ɏ_}\#Tu5(x[) @͐[TX/5MPkrL2S>}ڣC~ܲ0ØR2'1GPWݧJ ;Id巐< P [:RNPjl4Bٵc(^BǡG}vvEm.%B ۮlj<6*+!4T~y&J̫%gGU爮`̭~C"R}x: P9pR ;YBHo-kGܖ+O>kbB~:A]#).f3ZyQ:o{X{Mendstream endobj 323 0 obj 2365 endobj 327 0 obj <> stream x]Y%c ^N)l3،]=՛iԿIG:2o5ysv>}gշ".V7O~gw'ϟ|D.B^\?{.V:7Ozʬ뢤9j]/Ų\^M.NE kNbfNO/bnJ'S_;ߕ\VN8otW~~֩M}8]ᯗgv3wb(>/AA_}ܼ /|UU^\zK0P*=eç,^ևתuƬ-H}em^vk8O"^ѧ%\]Ы*gVaUFΦ/՞d:9r }#sq%'U\\߆Cxsi6kOdHן^ 4a~<픺*]v֮Wbtlֱk|sKYi-C[q$ ı3w;^rϫ'S*]q拷"M:12Z6>=2rʞLC=]_-4q饱0j^Š~o[@R(#vt/Ɇ6OAO\Xz'SBHwRO>6eWwm\]Vx2;QZ&e~9?A.L|uAH4-LGp,voƧdS*yfա/O&;n]7+ҸIK|Hi{խF|W{_w>z]2$| 44]a(]U-kƋW!T{k ~Z ^P""JPi|V6"^$@àR}1穹m@j Xg_fQHH:@KUR qE H\$Ӿ\X?rb%'$ "1A5)"[myuq'ݡ?2]. Z63۸Ԙ/A@hopqEvs^&"h~O(iNjO,( # ׉̂himb݂ޥÂU':+BK? DN管UqK&,62r[gT_ {jE5 GKS7}ǽ%om`~Ŧxr벅JlͿ*~ A'̋Z":K>,,⺢?"ʞ@[tMeIč ų:@sgD kQ7QʃÀN:Z Wcܪ%2xUJv{O4e(5r.gMOhd4 Q$fB-촶*rD(Js˰ґ)#oMZ);xA #"kly?Š дޟETd<R2LZUaaCKZ}LbE#^+"?ؾNq |*M6e՚hK+Ѡ[n;_"2UT6ѵD4ȝRDfP^[AF6x A;J^ZWL%m_kI ZC7l _]k&tSJcFh$A1|PqP4 ES1v$v$57*,4kTnQI3–_{qWlJƌ`#QO*wL=}HS­xܓ(ԑ)ƯAMz:o"GB*Mka f<>+nF ^IEvU_D"¦)a co+uNTRM5K,me_?$' _7I?twS{%>4ʠ$Y{ndƻEYR7X~Oj_>܄Ȼz;罉s!V@mg)Q$*r sfźȍ8.rTz[r+vDD̟̣nϩ^[2(^Je9OS(Mhc>ZwZzuµ4E4^\OsPŸ@V IܝʆQ]qoe~/oĀdI/87t oAU[ȷsMF O``n-,a>!4#@?"Ln4^36>%/piD*bshtsfb}lU:t)3qUȻ͡cʹ0GB@MP,?Y? !E^#g/p!ilKg2lWyu݃uN%*zI'Px@X ʝ/bԿTq@ygc˽Sr :pBa煛MZ"ayi\DRL.Q(HZF`kޝ1؅1؎'5T QjQ ~:YIo1V`c.(fz='\Ubf~bɋu Cz:A/ꭝ)A[`Y2d?nhzErwEZIe!'1.y *jYRM5rfXl5n6ͳדp9s}Ѝ. :% VĚMdݖp3e(]?l/AK@0O3*/!)BT6yIG?*!$4cd ,&mޜ>NQ t]O31c3֦.Be|[!f\s7)\\>s\^;X96-vqjYeAtގA`>LϹ.fTo’ޛ eU@ng2!P=HʺE\D#87,J;39dPĩ$/l<0VFy@yLm}f<ő]%}`R=c<6D\u#OS&KKʧRHBבBM\hz]cACoPEfѐxVʲ _yjX9\S<^@)L3:km ߟS񇬒{ɗ" ަ'HqC@{4xx3*P+}0՘ckOoj48л*Ryt|ΘW8"LHko@hh#V$0 +qL:"D;Oj^:69z=WQ^AyU<4!G/'[(,sȖ%N'{^qLχ]Ԋ"&Q3Vf#>s~jlOHKoy`\UV#߃έ0F#Ҏ󛟸CGf5nq+)B4i?K[V O#Pt}a )ĆLqf) huF5Ɗv`X(g5+p=M&tfM퐩?h(QմhK"2̽@qڈ/D6s$-n:ϪhH{5SHیLa[b٫#s `"@m]ZV `vLQ'|!TD .A$zwj'AB7ϝIJl>LTÒOODž/v|d[]^v({z҅Z9oqc*)q]BǠ |)MIȵT2pAg PEa|Vu)#g&0tED惜RӂP wbE~' P'BU9Ć.a̩EOD"0ƧTap]u}.#@L=RUhcj: eAs'G9".F|[١6R)|rG帛nxjYn4Ƈ𾩶ވos׆7s,N |Hz쪙#rJF&PQ-j6X7r;Ӻ\;H:cTf \yl ]B0|Uo<=;+daP-R&KKuMKXj"ĸ]S.ï~eM?d&6Փw!˯s YY~j/ԖS0n,f}?&7%Wg)- i}vsVLŰ!6# QO7n⣛&L bұ ꉲY]Yfyt~FdJ}PTI7$=ydjm~­YK5I84Q{:!R8jИWaUˈlryaC|G#FŇ[ÇxK#*t~nyȮ7 kxdqҜLRzCaYv+'*hkMQE\1 9)0)>ч&"ˌWb),3.Td? f[W.XڄSٖݶSؓJXA>uUofbfd}"'}˲NCbN7u~\z]gGy6+û{Y߰f'*tie@&}Kr /TE);?`E5 {d WIw_f+1?۾EB *ݡ/\X4 >6 UuFMlM+( ]C-vY0Ta .dK`]:w#Mؖ'[o;ў3C`bvq6J:'8RNxY[V v-g=`9nX )%j PsS=,yNԌUO0RQ2\3'RLBC[oRELLPjxf$g*VZCшT&hV#\:TP~~?"=*9N$RX,s#Z`iR6 OXuK^Uf:v4ͫǛ5&& I>œM*y{4WHz&|vHw]7|"!iB}҇XNw8ʙt֧_ϩԽb/|kh; :kP^-n& E,A~r௱vg85C/ƚ>x0xRC\r}zFJY Fs;sԹAn3!CheZ#36kAAf txO޹Xti`w<(Ffٱ5V#\[WIr^`jqc ⸄6fJeOd2NҒ6NktWB,L]uCsB˓mMYPv'qg^,te@ e+T:HRiFbL,98g( ]^Ug~%<8sk;j}ԏnF(Ʒ=n 3&' 0fkovQn>ƫh"=&f%ɠV}Au h)-8qMv0rj9]&SKdFks˘n{ń?&5ȋeyq-bUi=>kRz.m8*Vyms ռxȭn)~ѽ?emőRKzX3y+U-5_)$E&aY>Y^4ƝWǥҟw`*n6fE!:!Ba` C X'נ;V/y}!WlaꪍBKxUu ;Qgh~P;MO_L]#(P.ozpVV4CJ%Ա,бH]?5~-;nc;)iGʉ |`1ppD'uӉǗq@@q}ۡ81ŷas0C_slqG×B[jNpkŽGw3rMj!%GRLӺ&m/`'dNJJS56P95l4~++&qs霓Tob7Q]W5(_|#d=YHAn-d@zΞ 5X VΒ}(bzLLjNSCZt8P<'W'TN(*XEܨsme#1yT lv|ɡf8˗#JlB-rHOp/Zh0T'=c2gDR1UL E7M}] 8ڷ MM5a!ĚC{=ϲ&l£6+ghGy2Zۣ\b<@5@J5Aå ߻ &kkZcOjU)htY! 1\0sZKBuUar a:_BI(*YyXW/:jˌM'[xEendstream endobj 328 0 obj 8640 endobj 332 0 obj <> stream x]I }{rva[D+bž\G$%k&WiO(jի˗.I\O^<|pEO?0y6='Ex'p\i]/^&.~K$rx9OvW#Ex)fY_1I㥘Y\S*9U>Cw>^jpwkڔ{oo RїeQz)d=x-ZSȸr\&mfcO~ E 3?O+մɕnY9L~Mb?q/&?QNk9s丘iv>>:5mC?jkƭW;Z>-O,r6]sg~ucc_tNtΟ$_?l.ib$W]>,R'] ?s4 6p*N}SO}e>vJa I:3:,p'tS 9?Z=Q7΋GΓ$MzgGUh-~i~K2TBhQtGV:- mE#WO  ]Xˮ'cFrMīzU}?')0(AKGͬ;r87\;/Y C%#^ŅaTP:ko+ѧGCRP%0BMJEHKK!D$ VxS`8ϊnE*Xj+M>b ‰*E/u_Xf;F%9I ZS %dӫeW~FtQ 70+"z_n2‡4^2G>x|՚_T/fFǒMgt{,F:'jE{S* [`jm0E5'h>wE(B4^ &M2Fpdƣت}SG`g۟k\+j?3L1,SfǤY&!s Ux{٤`Py10OS y(@ k⬽}9B˪!PK<_I*_Q)xCװ.U[F ,k o¡A;)٨oJov+ ev$\h9OT&4)F>ȫFcUNвB@KXW-mO*Vi@x05UG%n@-wcL$Ѥ"(qq,.UJ^w+A6K=;WVcbLB-Эk]_~.v6:jA`WZ+aEKl'<Ǝ8̌0wF9{mWL(|vvƽs`z)ȳ]Zg Q]G "Qd0q.،`iiCw^g W(#&^SG-do Ҙ pzOU$b-9XQVhV?V Qro6Q.JQ~?sl2#^qz+tLoa -mZkm,Qx7pF6;HC&VQ> ^Afiymͣ֜\Q^<]>}m7`f8,7y3g֦!ob]Q&=F s !^~4?_q ʚIZgMjPb0(39I+QD0x6g1dm'1Go($~ta|ZGy'^2ܘsNRqtbDIgÂ'aR#adD]1Z d+D*6P5;xV͢>İ"%:n Vb`{O1Azh#hgvdbc% DW#d80o5PJq³3ixLA=SP1cBYfhjfvmWlTiJ`.Q0rK`SXY7yyLɑ$4s}+Mݎ!{ʮ=q63Sႍ)kKV]F%@$! Vs+>Duqu,!=&r~;oYF`<,6a v|ka:Y?tQ:IAͦD0QV8 CKZH%f] b(潳crh{aڕ6p!*6CT8dc\Y¢4;]Nq©si0uqZy +!~);E k\4񇦲SvTċY-y,o`ӛAfM6!OQL%Mrh+DkqJFeuFy=ބC:\`RycUhb5 %7-p^NNIE)zʺ zOm)RMؤzew@*@7߉3q1$A7uZH<:';M+Si)$xJYG׀_uϥ6<8oc SYq5fTogb_{3L\d-lQP &O$H,KU"xr#I!>] kᑵp a:IHi1k.fsY`mS($i8IIe=dѬis-~>+-^b $r~;42g  Kɑ"̃ ʓ`v;Rly5+`elA2:q=9nv1Qv,/Q mL]Zѣ'FBLy{6IS x<2:O4+QD>UC 8"rhAkO.6a]i9›0Bf@DF3|4ɦhyC2EC91?T{jO  Y3h,Y3#IpĄ\YAT8b0 #E6τJ`ÎA.];ix(y`kvY> 4Ftd_ "h w@B"Ʌ ]w|߇GoC9zT|耒ʆuW"Goد|y \ &5*~p]/Z8+b O{u^i g‰WӜ_$nt.m|OxBl/bgd+;L&?s@RBmokwdMiD3iaL@Jl󒋂wDO!RuUc#T"'-IΏ;1Zp*;AՐBN? }-#j͇@%$:Ѕ)0>G#=6 -:gG0>Xq1|̐Po;w;kul^7 KS'& q0'BsrɌEɡbF; 9r6# $P࿮QJbv=pv`EzqS.h <l!**߱LF Q! "ZQ'FjdOZaثµCqw.ACS3ߩ~bd)]XXbem7""[5U:,T k fýL Qf\;(M ts uTjw0@q=ka|`iHƦ!v88]꺎}p==zl ' {GXf0 yJ .eakPθEV ,YEfڇB%4nd?s-ϮA忍 <3[gqiWWe) 4@\ok+:s% =PSXZ)ipgXÌ#F1fB,be^q* (@gf! HH9 |$'B%UCn? ; lP%mJa@5D:eEI댨vHn*W+4l :z\8M$a?abޚwa<AYJ RNԅn2aMEeRh_d>ljeI*_(ޟdfQ:6 ӷir4-Ef.foܰJ.[nԾ0EBˣ_5'>͗7(0;F%9W.h@kݩAr}qTUFA691ȭֽoˢsICO(E&΁:< w't*-8^AX2#!]6kK-=J[fDeMcfOv`̿$ВԅmJq.Cט\C&)CEH-OU{Hcl5fJ۴|rT.~J-=KjKDdRxJֆ̹rGb0Gt8k%b\=a#J`H@̎|"ёVҭDqPГgrˎڱM Cr6;Q?RC5jĈZ^ }½D&x+"X. ›=N´POڟ;[uS tK>Ga[ P"✄ZܘMkO D5%dVGO)5y†6O)=5e;sl9Ⱥ{2ϳ!+5=}V :AC P3?ϖȐJgĆrmJh1!#!$/h[g/LEpMh憛~\XaςReB/PA%;e!l$~s,4wz=6{!V̌-Fp-l=5N b?=FOR LjRѩ=4n̍g}<D\nݭ.K>fX_R^7@͇@j_tM)ΖGWvpţRn8l$(sk'Ag:yw#${VD^%Bw:Ubg(a1e'!=i4;ۑW!.t=괃8yR>}$kxsj +l? \ѶDzcm ucSlBٞ} S /S7eJS m˜i=*9H>R%m>jo0\y~ـ=m9gO( yRNl rl`}м. Jg*7?wf|ŇÑ4#1|V Ĕuoz;%Խ|`;E ,:>́+AOM,'?%eendstream endobj 333 0 obj 7792 endobj 337 0 obj <> stream x][qr嗜ҎAɖeˎb'1.Җ(!A3svg})J[̙o_7x5OjϿ~0Wy2_0U~]dg}y;iiʟq1Orezߟ8_Kk&y2hv5wk~rMVY~7q͔88_Ika\I-3tr^y15ro Rѧob6Q0s| ϫq,&gmWnƙ.\K^ʸkugdſ?go޺kgTYmOlӿs88tRYOL^q6ݬ'怼)pɭUOۓM2nwOt[]&/FC7 pohSy:|Zn4~/^ڿ.l v2=l d JX+gUp Zho瞱 n'S >kwgWqZԿrY`Lӯy%OR?,ݞ\Omqsf&4%}qv%aXR~JeŽqʦ-7dGz1?R:hW׌~ 0D|Ͳ5jB ƥ@ܕ ^2rʚuNBnb 6ݖK`~aE%?\j? #0[sj.l_Kߜ5@ыJ ouDӳ@ߕODAm|UUST4/iiL GTihiDxqWR߽kAi4A+x{6ׁ@P7ܺ_11T ^8 P0#OBo~TX5ڙt$ &[j 3,`b%<^VtWp/314([#ހ-7K/tqY[t|%kËҰ;E$rEx]k02jzM)qEu8ԀY_ZE8(3Dz$|Ydt[6fTp=Η5 6Kڕ.*Cto= ۚ7h*kJmomZƕ w5YxQ"9|Xt"7htF]1B#̿!p#Z.}ތ/jڂ$q>P_6wZ4^>x'm*Z!a|ЭD32 * &v۔Cv%_:EBCC *Pߟ %VoەpNup%EU^,#Մu6vjY:BĊppsI7}ꢠ$gVVb9 I*n{ijVhJѠZFPxxeߕY{/tkVpiI.E7Yq~?Pn_x^}2Njd!_̰$[HPggdॿW7bW֭ ?tҏ4F0A[b*ҡ} &`cm^WLrR@(6qK<(QÀCn$)jCDOBCq0-gX9~h0]U6ʧh?D|Le(7\m]c|vr @F>ЁR `vO-jKbiY,ERbOr> Վnyyǧ0za,k  9kn q0zM`"a,"%iJ?X_g=, 20{%xI~Z=b;%Xҝ d汋TH3U{DL" FpF Ma%5-ECBP5poJ~PX@l!~̺|,qЭHFG{i@ER]8dx,,fWW?5X6+k?HV\p]& h%7Hgy׺ 4fl4_/ʭ/D D!Y(-cHq ʿ3$57[ؔhx̺/]5H"g vzoNrǔ*3^F(fӰKzS!7Swa2 3zXYhĦ袟qݛXL6t&$L.2D%į^en ZӔ5l`'.$^Iq b IcLH@]-贻B4> tAoqa3G*-md o1 CX{ynҮ6T\WWqⴙ*N}C\t m?>Rc} _ꍲA`C|^X"VE%#j8ʪ\S]>QdŎM7= PQ|#(uRAA$&,YL=~KַDŇzeWo,ïe6S+c%!idJzhqbg2Nc]w@S@#B>Gy$Fdnye.CJ|ӷG&P㸷(Q`i2.<5o1k<齮 4R\s&鐁33^ q,^ҐqW._ l'F{/5g;edbx](%81ېJ1BK&;t|-TN&5Z.VR.0BXbd&Ų3"X&3Kr3҂W-Zô8hܒPZK5#c9ҸGsVWq#P0Q崴DQ2 H. ԕf7V) /ʧ[wqGh>pS?X/OEwS Z뢏JY(B]l|U+v;l6]vSq(\@"DIWFעr;C3)i]S@6ѩ3; [ݟi B?+S[D4p mݰ-[#9V#g!t@Ja"9o u1XvCUb b3R]K%<ޚ>{0$f. Z)Ԯ;wM+Ajᅤa !9^$T 0I{:Gu-!( 7ʼyFHw-4c7k\ ՞K2AJѵh3M<>_$/1zőh9lYt%#] :@RT`eM8;:t6;&e*xmJyصOhJ. }Q_ c8ccM}5IQ&iZǎV&4_ 4Rܨ+ӏѵm~F|].,9—\ŝgoZtRSԝDQ:4ʶ0[/«+ a]Z`*rUՉqrm,ATmO@!]u22¸BQ99 S7o3uгȬ1ӾJ86"Cm:Kp}?̦/Q#u0gS t12?i6U#d|cNy!ߠ~2Mgz.y+ ? ܍Ғc(zEt OLX_[&Bad4MMĨY~`7E-4O¨oʥÉJ&&W#@"SȜ(ulڔ9b;H:ޒBY9RUY[62-h::)a^{=!KP91Hiu t wu([ǻr4X)>9+jZ4m"8EƑ}>a \*jA,>pZ/ro0=̤l:4*6>Z4XX }! Obn9&!.뱰+72V!# |rC?@ؐ Wѫ2^:}3w*֪Ht+ƴlEcY4чDC#'yLcFČ1FMֲ}m@ÏCD3EJh03MH{X}(`jzdI4rh'{4+Pa/oV̀ YHM,խE֋ܤ棖TVYԡ| OjB d~-rۙUi6nG$)oP7mC['W=vbh9}\L’Rv실EWFca!R=N" %oPo֥+# 8\Zw$hSwaߜ3dĶpbrRstj|]WOO:ICX,DFN9$:=j?2O~ oru#w/ }?ϗ. x!g04oDyvxzQRh7 Êv'F5emV@,D]^h=R:xWZs iPHImH2l<okU%vcND:ND_zt(ћzrbGl_TJ,Qڰ 䲨ËPöq 82?İT T6K\wڶ*wa^"n ݩ!Qq%XB1ˎ, IðBq˧2%[!M'pDUg.y\}K)VKQ$c!1Gl imrcH66?1UwPcQ:cQZ Vmd$i dFYu\-}w[vKSz@m~5)n6P&ik!7zjv$d#J͔Owjݶ24buZh#DO ;*@N;JpCtYZyBҁRC{R"rD4y)jQJ_ ff$2b2әHL]Nc-zoT *t$CV5}ܣ])N=?b\zAmC 8NkG|ZAe`p( M[.%+]qejȡ]<[ "Q:Ri9'Q?HKoW$Pѻa,&h)f'mT$KFzGJlV,4DߐZ\hZ c4yVyZq{GW K3ʼH.rj Ch!йH{GmET(5nP"<%9*bHDVlRo#[\W(rg+m$+#\%lݟY6ktO<*5)ط6G$n.4\͢YMi@"HHmI‰ hBât2]kf:RV=_N,aG sSXFp̶:X|gV+=vK(299z;iDG9޼KYa7zwj܌sCfDsK,J`^ڕn-a;J]NRGDHM`{2KwBgϠx@"|;Ĕ>U.d]Z(HSQ 'aؘ:hfvR:?5ώf!hݤ xv<0A/3a5g8BN#j,qA %9r ڒFk#Un*c rDbݐhH(xvi[;3Öpz">!f__ƈ4.wU혊4rPme+ ˏMN~ǻ]pߘO<2Cl PP BLfGRcN4_9(-Kx\x&RmV%4MN7xBzJȾM3WDsc!jbLfAV ,S (%>t{]D:ȓ<=;4_>f`%\dĘ_}s?wla|jJ;skY)Bsc]C{m.4.&װg|%/'نjI< CEpL48Ԝ8cNJkdA'\̿2CXҳyq}.SL$ĒBY;:/q-M'v)a9Gg)_Y.J9y#=htZyХJFr udETfGt^etUQi=)dԼ Ŧ-^<OGD>Bg=ɲ*H<4J0cJA[KuYmhrec:* rGHf! b\'aGB.]WV8`Kt 6C iэ\ [經@L!Yga fy"r fŰ|9*$%5t׸XϜMF=-~umQH* "ګt%yN}>n=]xR[gQT'iN6=ED8hʯW([7Ö˲ْuaUHQZRx%hbT]m99REyEڿ6-pW# Tc3EI:y(? )\ʺ ,4$!N0˅r c%ۦfq}QLi3 -G>O# *PB4[|܁HӲt,d# K5c1!ީ>ӞjL],+IIL7\ 4kH*> stream x]ےG~ń_{CS* )[^^Sc;6}qx 3%Jo& P8^|hţpUonpajn?ZYElj'U&պlە3jͣﯵwjuݬ'v_Xm=Z]#?`ķ+%!0R/[\-x9[/JݯF.20zU5?'NHDo0{ -xX \ѻ/qjv&M4Jv ;0j{q XFy&3O\=P_u7a6:?I__L+VLlÌ|?ct-WhÌg[mWWզ^F- FoV{=zx'i / ha\q#5 hMq0vMoސ&{aHt~ fYӻb[ t[nN+64NE{] L Txgňl.c6XPWյ[\@kڌ`뚸V'ҀJ/*@ x^Ta MSo5`Mtb2^R^q0$ ̂*Zpa*f5+m!m7XFy܂iv\.mF*[Z&]gyZ$@}~>Y۷=c 3RozGJ,jd\@Mh4}Q8mks'Dn=Z2skJ_}o Rq) CYZ<26h '7xt x5~$pDqmX,7XCkn~UxjwT :OJ✄{fS+%Ҫ[U1?[0J xItSWO=Uz3 /+<'--?S/թL8)AxclY}H)cT>gi  0Os!* cb3;;HzL[?[ǜ>?FZ"8FpƱ8)AC.)ᆰ$8E:U7{%M69[vB6 C#Uu^1w. @F]r.䬈;T3ScL[] X1,8y~Y.y[IC]嗒N:TCmGYR MNēa(zEl Cq-,ц afbFZ6P8Ϡ 9dd&@ (LT==S4bU,`!<)i=Sݤ5-eoCjſ&Y/V7(N.B:B- ~(8Eq{[T)W?G%P{*&.g.b9KxaAһlb]|?.ab)W\z,^xqe\9"Wy6 BI/M :b%)of} XSv 6( 90Y$NF*sk5u=$rF?HS qW='2/FT:Mb.&u $xG_VN*y@%ziJZ! 7G$+bTxk2I*UWu!SaidL)H;RT]׫8Z~,FpْLރr3#R93jN0FEC)o]*ho2Az#%DZ``lj8#M/l@I03SEA= 'P:Z$u[I?$PVaSQ #}]6ܦb-tA]:ƒm=5|xd{f_SCЛb:x(A6Odﲽf), U~'TiJ" tߒdz(vn dc6K_+/D]'$'i1ͤJ` v !Iĭ= ^)'cU);IX90 ڭ @,TD)d#vqMV>pQGȀSK\M^bM4 &şC7xտ]ýd[LL:V98ƂX{4_H;ey ܗn@<~<îƽ<  HlD~ {*€Eeyn3pYxN'b`>k^!ii X snDa0FElϩ6 5'hڛlYm/"!GlDRxQݾ}cK/꽷7l'@,B[$Z3LQi< T>$Yݫ=h=2gkkB'gXGD(J:cmƅ lpֻ'yI]Lȿ?KVCGRY:\ Esxل"Os2T~,4VkBdoDZ1n"Tl3"NX*)pt_[Z< ̛04Af%p* n0pc+H@Xs61C&LA~rz펄;Qge:{m[`vp]kS@@.` 5{ӷyHPevK^O~ot>B`4iH06ҩ0_)hr7Z3 Hf{A {" t7vAڮx,% yŠ&a_!`l4BQwbm q+(aVlfzo.xa- є&Vդk l@1SX̹<8GW~whؠY}$v(?&vp>+HqOl]l| 3Q-qOKrU>Y4Gz r5V0E2/YJn5^ @؂Z]D8LɽA M }8~.ŧ mzAǕxZ_0n9 y%Riqo٠%x%sD`;okOO⊪e _4}"/ Qɦ/I`Z\!lVS M4E:z|?eh KPjccOMde (]Hlʓ=A)uBX4L^`-umL%A=ғ0%dXj@ ?]Iz_pD>mU[x>lQֶ>֝TjAU:RUDb٦)23 Y&-sc(:+@<$&+b+݊YC'\n.1XTIp7h%BNs&hotX}vuvXcwTĨ?"NK(U&R] fRԤX 3xNӹX'lZu3&Nbtf\:GC*8sGY L8^F"i+=%L"E,C>ϡ jlta"F^K;cHEWJtasCfwI~sհ[@Xߒ\ MDIi+"$sTSEF&+mQJ:K8B')kՖBnbA“!{t\r[xgu'EG`7NҹF;Z-rC?8x|g[>Պ[{\ x$;f26;z)epveU15hJ0jalynͣ?WI endstream endobj 343 0 obj 5674 endobj 347 0 obj <> stream xYMo7zԯnQ6-Zh۪\n~qwVrab%g޼y3WRJ~P>ld67P v4k_/yMl+o?7[)wF -q47ʉ6z[lpF*!VQDڽ~[Ksw:[mZK1CcR!sZwCeL hZ޵d m^ꔦziB maٻl aM87d"XTN dpnDZ]n47j'5Z@5R8R-x$X:m<4x>fC>U~ 'x90E;~/pC>% 10?~tIbݬ2zV)S?k9\SqWnb) ;ֈ]ZU!jlX)-M&[|K`Zfkֿ7JIatgG[uFF~Ao@fBPhSe9l/;ƺ)J,[!XN0+$]FO#,YW!^*UYaXx`{Z֎U]wld:hݞ\d!P j .U&'J,f-i^5f*lmT%1wK%Rh]GS 80ȩ8><KG4kD{v 3R`R>5*P+{f2IYz~@˜[z{0ܳݵ[]OoG {xE5iE@ɞY$%ӡkypo'^vm s.v3-Ytu9-cBޖr:S%YTC]syJ_@NV[:j)3,# WӮwZiH@]tjkZ8~ˇ*4,.p S~-XvY\ i'\(lq"Mݳa[kq<TY؝n OӎMMp e~!7E-Lvdօ6QO]1n}MXendstream endobj 348 0 obj 1667 endobj 4 0 obj <> /Contents 5 0 R >> endobj 12 0 obj <> /Contents 13 0 R >> endobj 19 0 obj <> /Contents 20 0 R >> endobj 26 0 obj <> /Contents 27 0 R >> endobj 31 0 obj <> /Contents 32 0 R >> endobj 36 0 obj <> /Contents 37 0 R >> endobj 43 0 obj <> /Contents 44 0 R >> endobj 51 0 obj <> /Contents 52 0 R >> endobj 56 0 obj <> /Contents 57 0 R >> endobj 61 0 obj <> /Contents 62 0 R >> endobj 66 0 obj <> /Contents 67 0 R >> endobj 72 0 obj <> /Contents 73 0 R >> endobj 77 0 obj <> /Contents 78 0 R >> endobj 82 0 obj <> /Contents 83 0 R >> endobj 87 0 obj <> /Contents 88 0 R >> endobj 93 0 obj <> /Contents 94 0 R >> endobj 98 0 obj <> /Contents 99 0 R >> endobj 103 0 obj <> /Contents 104 0 R >> endobj 108 0 obj <> /Contents 109 0 R >> endobj 113 0 obj <> /Contents 114 0 R >> endobj 118 0 obj <> /Contents 119 0 R >> endobj 123 0 obj <> /Contents 124 0 R >> endobj 129 0 obj <> /Contents 130 0 R >> endobj 134 0 obj <> /Contents 135 0 R >> endobj 139 0 obj <> /Contents 140 0 R >> endobj 144 0 obj <> /Contents 145 0 R >> endobj 153 0 obj <> /Contents 154 0 R >> endobj 160 0 obj <> /Contents 161 0 R >> endobj 166 0 obj <> /Contents 167 0 R >> endobj 171 0 obj <> /Contents 172 0 R >> endobj 176 0 obj <> /Contents 177 0 R >> endobj 181 0 obj <> /Contents 182 0 R >> endobj 186 0 obj <> /Contents 187 0 R >> endobj 191 0 obj <> /Contents 192 0 R >> endobj 196 0 obj <> /Contents 197 0 R >> endobj 201 0 obj <> /Contents 202 0 R >> endobj 206 0 obj <> /Contents 207 0 R >> endobj 211 0 obj <> /Contents 212 0 R >> endobj 216 0 obj <> /Contents 217 0 R >> endobj 221 0 obj <> /Contents 222 0 R >> endobj 226 0 obj <> /Contents 227 0 R >> endobj 231 0 obj <> /Contents 232 0 R >> endobj 236 0 obj <> /Contents 237 0 R >> endobj 241 0 obj <> /Contents 242 0 R >> endobj 246 0 obj <> /Contents 247 0 R >> endobj 251 0 obj <> /Contents 252 0 R >> endobj 256 0 obj <> /Contents 257 0 R >> endobj 261 0 obj <> /Contents 262 0 R >> endobj 266 0 obj <> /Contents 267 0 R >> endobj 271 0 obj <> /Contents 272 0 R >> endobj 276 0 obj <> /Contents 277 0 R >> endobj 281 0 obj <> /Contents 282 0 R >> endobj 286 0 obj <> /Contents 287 0 R >> endobj 291 0 obj <> /Contents 292 0 R >> endobj 296 0 obj <> /Contents 297 0 R >> endobj 301 0 obj <> /Contents 302 0 R >> endobj 306 0 obj <> /Contents 307 0 R >> endobj 311 0 obj <> /Contents 312 0 R >> endobj 316 0 obj <> /Contents 317 0 R >> endobj 321 0 obj <> /Contents 322 0 R >> endobj 326 0 obj <> /Contents 327 0 R >> endobj 331 0 obj <> /Contents 332 0 R >> endobj 336 0 obj <> /Contents 337 0 R >> endobj 341 0 obj <> /Contents 342 0 R >> endobj 346 0 obj <> /Contents 347 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R 12 0 R 19 0 R 26 0 R 31 0 R 36 0 R 43 0 R 51 0 R 56 0 R 61 0 R 66 0 R 72 0 R 77 0 R 82 0 R 87 0 R 93 0 R 98 0 R 103 0 R 108 0 R 113 0 R 118 0 R 123 0 R 129 0 R 134 0 R 139 0 R 144 0 R 153 0 R 160 0 R 166 0 R 171 0 R 176 0 R 181 0 R 186 0 R 191 0 R 196 0 R 201 0 R 206 0 R 211 0 R 216 0 R 221 0 R 226 0 R 231 0 R 236 0 R 241 0 R 246 0 R 251 0 R 256 0 R 261 0 R 266 0 R 271 0 R 276 0 R 281 0 R 286 0 R 291 0 R 296 0 R 301 0 R 306 0 R 311 0 R 316 0 R 321 0 R 326 0 R 331 0 R 336 0 R 341 0 R 346 0 R ] /Count 65 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 10 0 obj <> endobj 11 0 obj <> endobj 17 0 obj <> endobj 18 0 obj <> endobj 24 0 obj <> endobj 25 0 obj <> endobj 29 0 obj <> endobj 30 0 obj <> endobj 34 0 obj <> endobj 35 0 obj <> endobj 41 0 obj <> endobj 42 0 obj <> endobj 49 0 obj <> endobj 50 0 obj <> endobj 54 0 obj <> endobj 55 0 obj <> endobj 59 0 obj <> endobj 60 0 obj <> endobj 64 0 obj <> endobj 65 0 obj <> endobj 70 0 obj <> endobj 71 0 obj <> endobj 75 0 obj <> endobj 76 0 obj <> endobj 80 0 obj <> endobj 81 0 obj <> endobj 85 0 obj <> endobj 86 0 obj <> endobj 91 0 obj <> endobj 92 0 obj <> endobj 96 0 obj <> endobj 97 0 obj <> endobj 101 0 obj <> endobj 102 0 obj <> endobj 106 0 obj <> endobj 107 0 obj <> endobj 111 0 obj <> endobj 112 0 obj <> endobj 116 0 obj <> endobj 117 0 obj <> endobj 121 0 obj <> endobj 122 0 obj <> endobj 127 0 obj <> endobj 128 0 obj <> endobj 132 0 obj <> endobj 133 0 obj <> endobj 137 0 obj <> endobj 138 0 obj <> endobj 142 0 obj <> endobj 143 0 obj <> endobj 151 0 obj <> endobj 152 0 obj <> endobj 158 0 obj <> endobj 159 0 obj <> endobj 164 0 obj <> endobj 165 0 obj <> endobj 169 0 obj <> endobj 170 0 obj <> endobj 174 0 obj <> endobj 175 0 obj <> endobj 179 0 obj <> endobj 180 0 obj <> endobj 184 0 obj <> endobj 185 0 obj <> endobj 189 0 obj <> endobj 190 0 obj <> endobj 194 0 obj <> endobj 195 0 obj <> endobj 199 0 obj <> endobj 200 0 obj <> endobj 204 0 obj <> endobj 205 0 obj <> endobj 209 0 obj <> endobj 210 0 obj <> endobj 214 0 obj <> endobj 215 0 obj <> endobj 219 0 obj <> endobj 220 0 obj <> endobj 224 0 obj <> endobj 225 0 obj <> endobj 229 0 obj <> endobj 230 0 obj <> endobj 234 0 obj <> endobj 235 0 obj <> endobj 239 0 obj <> endobj 240 0 obj <> endobj 244 0 obj <> endobj 245 0 obj <> endobj 249 0 obj <> endobj 250 0 obj <> endobj 254 0 obj <> endobj 255 0 obj <> endobj 259 0 obj <> endobj 260 0 obj <> endobj 264 0 obj <> endobj 265 0 obj <> endobj 269 0 obj <> endobj 270 0 obj <> endobj 274 0 obj <> endobj 275 0 obj <> endobj 279 0 obj <> endobj 280 0 obj <> endobj 284 0 obj <> endobj 285 0 obj <> endobj 289 0 obj <> endobj 290 0 obj <> endobj 294 0 obj <> endobj 295 0 obj <> endobj 299 0 obj <> endobj 300 0 obj <> endobj 304 0 obj <> endobj 305 0 obj <> endobj 309 0 obj <> endobj 310 0 obj <> endobj 314 0 obj <> endobj 315 0 obj <> endobj 319 0 obj <> endobj 320 0 obj <> endobj 324 0 obj <> endobj 325 0 obj <> endobj 329 0 obj <> endobj 330 0 obj <> endobj 334 0 obj <> endobj 335 0 obj <> endobj 339 0 obj <> endobj 340 0 obj <> endobj 344 0 obj <> endobj 345 0 obj <> endobj 349 0 obj <> endobj 350 0 obj <> endobj 126 0 obj <> endobj 40 0 obj <> endobj 356 0 obj <> endobj 156 0 obj <> endobj 48 0 obj <> endobj 90 0 obj <> endobj 39 0 obj <> endobj 147 0 obj <> endobj 22 0 obj <> endobj 357 0 obj <> endobj 163 0 obj <> endobj 23 0 obj <> endobj 46 0 obj <> endobj 358 0 obj <> endobj 359 0 obj <>stream x] @|09^vagG;jcԓ U򔀶IMX]vRg4Fz!dod_+$jIAH֭̀l[R#3IǤlMz@di~ƈ~;3hwMaT =f endstream endobj 15 0 obj <> endobj 360 0 obj <> endobj 69 0 obj <> endobj 8 0 obj <> endobj 361 0 obj <> endobj 362 0 obj <>stream x]=0 "7"U^ 24v$n"}엤i/5L~O%{kY.{Ճr"iʽ>e@ZLEդ'4ze(4U"UUtxV4X%"WK1~ԋhg͡bc/nt%e endstream endobj 149 0 obj <> endobj 363 0 obj <> endobj 9 0 obj <> endobj 364 0 obj <> endobj 157 0 obj <> endobj 351 0 obj <>stream xcd`ab`ddd/*N+6415~H3a!s< <<, t }=PҾ9(3=DA#YS!$19_#?5<$HGBO1'GX(8,5Ebs~^YjQqf~BZQ~BnBr)PX!R7$1-?l0 SĢ̼ F&Xu?Yּ2:h˻?hZYrWWGUUFdRDHBbVtqF7mStӮs{_>z`ɵۻt[5aBmwuwysIea}UuUY}s[K{s'GѤݩY91qaifEMN=}}=ݽ==3'HMnٷU>޽4'*7N.[.%x_>yY-feomm쮙m1Xć]Ǘpjae>}'NWgb7Br\,y8e`e endstream endobj 148 0 obj <> endobj 352 0 obj <>stream xUOHqݜ?m%PsYB&((F5+`-%u2g21勯h^tKPg AB:Οhosx>>sr/׏RIwp5PR(ǖ2pxwH*pgGE:QPS J]]R`o'>9@ng{#rXp!uv#!FN!Nb1 Y]FJv:aVJ|p+x [ЎeR0 u&$F1ULyXWd"s7wj}wsy~L>yޥbCЁ)ߴĞ/`,/lEN[W ª*C endstream endobj 47 0 obj <> endobj 353 0 obj <>stream xcd`ab`dddw441UH3a!G&nn}n]_'9(3=DAYS\17(391O7$#57QOL-SpQ(VJ-N-*KMX휟[PZZZlme tb@ |E3]+wυ{DmJ*//_f)Sz{zz9zzj3;;8Z&OvwN9A_~er@tE⼼⼼+V,^BG3!g=Ӛ4tv~ϷKaJӴ}L+]~eӦ`8}en9.> endobj 354 0 obj <>stream xRk[U?'vivS acӱ2[6k216575ki=ݛfK^*c{ :2Dr8p{F&1e:3}p ֟5c -{'!O ȌY4Qþٹ D@ ? O('D'~tBO XƷ !Ofpp6,xJhwN|~v {#ڃL=<6>P}(W1hLh9ѷ>~M#&㨞4O3_/c/}o[4L,K8GVlWΑh۶UTøecƇ* XU*%2YXg-9%A,% lpQW> endobj 355 0 obj <>stream xumlSUik[Y[R1^&S0 a˜,*Acmw]㶎Nm} ݳcm3@bDSI_\\dŐ0h3M.%,kՅhAP6Axxbũ/hOkZR롷:zC#?.?{ݮYb*64ԋ{$-ڝr唹yZݒ&#|Q'yߕeX<]=6u#ɝR,,DDjXJj ,.W+uLsso !wQ_n#/׈ [2OhFըBu1;Ǫ3aAL k9rjǥ1'hq"2s03Y auq>;x?\ d|Mpv%\*t,oʼnE`لܠA*d)*Y5*FcF2v pITûXq%Ě3;^!Ѐ$>>ᾀUd6`>`UY3n`Wρ>yex36`cp]?OF@t0>hݟ'76x!T}b#{ @EUFL3hyӎWsCUƄct(m,1,ufv]wLQ6"Fp8Zp,b(jDf2Y ,%Kc-vR$")`/)ΰ7óґS @ Ap >U:n24X1{]QA:DќCMxwWn*U.ɲ@eߛ-LnUaZ{ OO $/K endstream endobj 2 0 obj <>endobj xref 0 365 0000000000 65535 f 0000417495 00000 n 0000431961 00000 n 0000416939 00000 n 0000406121 00000 n 0000000015 00000 n 0000000499 00000 n 0000417543 00000 n 0000425665 00000 n 0000426643 00000 n 0000417584 00000 n 0000417614 00000 n 0000406281 00000 n 0000000518 00000 n 0000001825 00000 n 0000425132 00000 n 0000429321 00000 n 0000417653 00000 n 0000417683 00000 n 0000406443 00000 n 0000001846 00000 n 0000004950 00000 n 0000424303 00000 n 0000424523 00000 n 0000417724 00000 n 0000417754 00000 n 0000406605 00000 n 0000004971 00000 n 0000006531 00000 n 0000417815 00000 n 0000417845 00000 n 0000406767 00000 n 0000006552 00000 n 0000007511 00000 n 0000417884 00000 n 0000417914 00000 n 0000406929 00000 n 0000007531 00000 n 0000014984 00000 n 0000423968 00000 n 0000423533 00000 n 0000417953 00000 n 0000417983 00000 n 0000407091 00000 n 0000015005 00000 n 0000022088 00000 n 0000424600 00000 n 0000428626 00000 n 0000423828 00000 n 0000418055 00000 n 0000418085 00000 n 0000407253 00000 n 0000022109 00000 n 0000027468 00000 n 0000418168 00000 n 0000418198 00000 n 0000407415 00000 n 0000027489 00000 n 0000066612 00000 n 0000418259 00000 n 0000418289 00000 n 0000407577 00000 n 0000066634 00000 n 0000070695 00000 n 0000418339 00000 n 0000418369 00000 n 0000407739 00000 n 0000070716 00000 n 0000076488 00000 n 0000425603 00000 n 0000418441 00000 n 0000418471 00000 n 0000407901 00000 n 0000076509 00000 n 0000081369 00000 n 0000418554 00000 n 0000418584 00000 n 0000408071 00000 n 0000081390 00000 n 0000085653 00000 n 0000418645 00000 n 0000418675 00000 n 0000408233 00000 n 0000085674 00000 n 0000087722 00000 n 0000418747 00000 n 0000418777 00000 n 0000408395 00000 n 0000087743 00000 n 0000094136 00000 n 0000423900 00000 n 0000418849 00000 n 0000418879 00000 n 0000408557 00000 n 0000094157 00000 n 0000100386 00000 n 0000418973 00000 n 0000419003 00000 n 0000408719 00000 n 0000100407 00000 n 0000104244 00000 n 0000419086 00000 n 0000419117 00000 n 0000408883 00000 n 0000104266 00000 n 0000110645 00000 n 0000419168 00000 n 0000419199 00000 n 0000409057 00000 n 0000110667 00000 n 0000115384 00000 n 0000419272 00000 n 0000419303 00000 n 0000409223 00000 n 0000115406 00000 n 0000119788 00000 n 0000419398 00000 n 0000419429 00000 n 0000409389 00000 n 0000119810 00000 n 0000127179 00000 n 0000419502 00000 n 0000419533 00000 n 0000409555 00000 n 0000127201 00000 n 0000134135 00000 n 0000423461 00000 n 0000419617 00000 n 0000419648 00000 n 0000409729 00000 n 0000134157 00000 n 0000139141 00000 n 0000419745 00000 n 0000419776 00000 n 0000409895 00000 n 0000139163 00000 n 0000144955 00000 n 0000419849 00000 n 0000419880 00000 n 0000410069 00000 n 0000144977 00000 n 0000146559 00000 n 0000419942 00000 n 0000419973 00000 n 0000410243 00000 n 0000146581 00000 n 0000152505 00000 n 0000424031 00000 n 0000427688 00000 n 0000426081 00000 n 0000430584 00000 n 0000420004 00000 n 0000420035 00000 n 0000410417 00000 n 0000152527 00000 n 0000175628 00000 n 0000423671 00000 n 0000426858 00000 n 0000420134 00000 n 0000420165 00000 n 0000410583 00000 n 0000175651 00000 n 0000192186 00000 n 0000424457 00000 n 0000420299 00000 n 0000420330 00000 n 0000410757 00000 n 0000192209 00000 n 0000193794 00000 n 0000420440 00000 n 0000420471 00000 n 0000410923 00000 n 0000193816 00000 n 0000220611 00000 n 0000420502 00000 n 0000420533 00000 n 0000411089 00000 n 0000220634 00000 n 0000306150 00000 n 0000420630 00000 n 0000420661 00000 n 0000411255 00000 n 0000306173 00000 n 0000315700 00000 n 0000420692 00000 n 0000420723 00000 n 0000411429 00000 n 0000315722 00000 n 0000319177 00000 n 0000420820 00000 n 0000420851 00000 n 0000411603 00000 n 0000319199 00000 n 0000324470 00000 n 0000420941 00000 n 0000420972 00000 n 0000411777 00000 n 0000324492 00000 n 0000326480 00000 n 0000421023 00000 n 0000421054 00000 n 0000411951 00000 n 0000326502 00000 n 0000329808 00000 n 0000421085 00000 n 0000421116 00000 n 0000412117 00000 n 0000329830 00000 n 0000332966 00000 n 0000421202 00000 n 0000421233 00000 n 0000412283 00000 n 0000332988 00000 n 0000335087 00000 n 0000421319 00000 n 0000421350 00000 n 0000412457 00000 n 0000335109 00000 n 0000337188 00000 n 0000421416 00000 n 0000421447 00000 n 0000412623 00000 n 0000337210 00000 n 0000339214 00000 n 0000421509 00000 n 0000421540 00000 n 0000412789 00000 n 0000339236 00000 n 0000341300 00000 n 0000421606 00000 n 0000421637 00000 n 0000412955 00000 n 0000341322 00000 n 0000342345 00000 n 0000421688 00000 n 0000421719 00000 n 0000413121 00000 n 0000342366 00000 n 0000343863 00000 n 0000421761 00000 n 0000421792 00000 n 0000413287 00000 n 0000343885 00000 n 0000345344 00000 n 0000421834 00000 n 0000421865 00000 n 0000413453 00000 n 0000345366 00000 n 0000346343 00000 n 0000421907 00000 n 0000421938 00000 n 0000413619 00000 n 0000346364 00000 n 0000348784 00000 n 0000421980 00000 n 0000422011 00000 n 0000413785 00000 n 0000348806 00000 n 0000351416 00000 n 0000422053 00000 n 0000422084 00000 n 0000413951 00000 n 0000351438 00000 n 0000352546 00000 n 0000422126 00000 n 0000422157 00000 n 0000414117 00000 n 0000352568 00000 n 0000354144 00000 n 0000422199 00000 n 0000422230 00000 n 0000414283 00000 n 0000354166 00000 n 0000355238 00000 n 0000422272 00000 n 0000422303 00000 n 0000414449 00000 n 0000355259 00000 n 0000357748 00000 n 0000422345 00000 n 0000422376 00000 n 0000414615 00000 n 0000357770 00000 n 0000360022 00000 n 0000422418 00000 n 0000422449 00000 n 0000414781 00000 n 0000360044 00000 n 0000361438 00000 n 0000422491 00000 n 0000422522 00000 n 0000414947 00000 n 0000361460 00000 n 0000363409 00000 n 0000422564 00000 n 0000422595 00000 n 0000415113 00000 n 0000363431 00000 n 0000364914 00000 n 0000422637 00000 n 0000422668 00000 n 0000415279 00000 n 0000364936 00000 n 0000366586 00000 n 0000422710 00000 n 0000422741 00000 n 0000415445 00000 n 0000366608 00000 n 0000367757 00000 n 0000422783 00000 n 0000422814 00000 n 0000415611 00000 n 0000367779 00000 n 0000370678 00000 n 0000422856 00000 n 0000422887 00000 n 0000415777 00000 n 0000370700 00000 n 0000371133 00000 n 0000422929 00000 n 0000422960 00000 n 0000415943 00000 n 0000371154 00000 n 0000373593 00000 n 0000423002 00000 n 0000423033 00000 n 0000416109 00000 n 0000373615 00000 n 0000382329 00000 n 0000423084 00000 n 0000423115 00000 n 0000416275 00000 n 0000382351 00000 n 0000390217 00000 n 0000423155 00000 n 0000423186 00000 n 0000416441 00000 n 0000390239 00000 n 0000398566 00000 n 0000423237 00000 n 0000423268 00000 n 0000416607 00000 n 0000398588 00000 n 0000404336 00000 n 0000423319 00000 n 0000423350 00000 n 0000416773 00000 n 0000404358 00000 n 0000406099 00000 n 0000423390 00000 n 0000423421 00000 n 0000427068 00000 n 0000427956 00000 n 0000428855 00000 n 0000429608 00000 n 0000430968 00000 n 0000423616 00000 n 0000424388 00000 n 0000424757 00000 n 0000424861 00000 n 0000425410 00000 n 0000425751 00000 n 0000425817 00000 n 0000426379 00000 n 0000426726 00000 n trailer << /Size 365 /Root 1 0 R /Info 2 0 R /ID [] >> startxref 432088 %%EOF mumble-1.3.4/3rdparty/speexdsp-src/doc/celp_decoder.odg0000664000175000017500000002501514010707343022702 0ustar builderbuilderPKUzS=YElvmx~/:>w!>ca:D߃ZTYe;5<4M^iPTƀ#򩩉E6Wc/^tSzE]7;9)\>: ,jOt@k0JZŽfbG.vCr?);yZ%U~RMrEL۲ 8+Zӄ:Z/.+q=irNCuE5-]]DM.C1dFYYfic5ۥ4y~%4?.^'6n]"ń/VT}!rQPr&Sp9wl‘zz{D$xQdF}P|07OlggVۛbT$Y bͮDus'(rlp{ęT6i HnvŤ eNP*Y4Ju,PѤ*||u gwʒ#X *0PpP#&(MRT6"r"d )!6ϐ:^SUmߓI| ۾n1A"$_냖lh?MJYWBg֐cP.mC7WgkB'ȇdrOpaCqzTZxJk ~UZ0%SZgZJ[ +˫t~m=b0VK,uI)J1/a3>qc}Y:NHN5Õ88S95 >'0<< :'do}Ş ^l )޸?R!$C2'm>Y4B\+kC,"J,Ș,Gu R(ղ ] VTfY X`Dȵ  3C v\Pm)#Y .];Fq€ϻ3Ltltˤ|e}~ͲX6bNJ1,WeT F1JLw H~{dgDUɾ؎_.)oh, z%SW÷;#xiخ0o!=*{*A4}^$a8d$S"ɴ4, Yhy: 3eM3 %DDiPkIoׅg$>7uДzʫsVV~SɁIܙ[ӕmvn:lcҖJaKsIqdN\1G}JI1 hUS3`s_{.Moztog*ӠL]6F|۱ ?>~s T>#io3.O)T*إlYޝd11> q| ~._$(!iߗyWD`_03wѝi>ޙcL50fbl9v3[ʶC?{?a"$K#jA/R9>/%(\0GhE8v&sgkz]$(N9>{oqؽ?g7`i&o}5_WNn6UQj,D;sP%Y!9f |qE{rNyHbEQEfswfF4%-lFBD(")Vj4GR8$"9E>E("3!2\9J ͪ؅]G`cΒ4q%!U(~Rg(1~KoD N0+*)>x&zx˱%m`(dryᗶ)!q@(ZՔJ"*ЦdP:[UTm$]S# cPE[UڦbX{R#J#KE<ogϡ T/Ɏ2m WG)Q@W8TimtJT05 N jpH4].}? (A+fpC#!} V(\(g@i Z'g[M#}+4iሿ %~RDp@԰ΣsCŸ"Yygͮtu>b~kCRJ.ܾS0;g$)#wk$+7$"'oτbM"4 B7byٛDbM$>< Bo3O F.vWssCͱCq/sTͱ(e;a8D{k!#q%ԉxT5AsN5Fj-fk-!UHtVnFJXlI<:9m(wӏ'[j|rƿPDUH- kptu1` tJj#g"t+p}1$P})i4VAM%r{dw h{I8 ~ "'XR^t"|s|k_SӇb6ت_ \w`u]JD6[mIn:/Lj_]ۉyl-ֱz5-ֱ:X"4XuX= ZKJ+lP)Lr_æ[6j lx8G&NW.7|9Y~S3jArUZrXWuXW_ Bc]=c]=c]}ujKǕxNDRT Dg:+-F 4g^ahѫ^Nl0Y:!"ckīޙzrWZWj'4B>x](^zVI(a`4 1[xNyk:r"vWϝ̗Nґ2R`C(/iGd.Qp'rيf:]onm!RBՉHJgӀG`moXBI< 5l) +aAzdv뻏,! rt+c88-`x>t,ġدVz^/Vu1f!k1(9%}h0Vp0[Vv vO?PKj~HPK OpenOffice.org/1.9.129$Linux OpenOffice.org_project/680$Build-88252005-11-25T09:23:412005-11-25T10:01:57fr-FR9PT38M16SPKڌB:޲@ /CýFOs K MM򵏯&{Ү^G xY&{7 ێ>]Fw9 mW3?{;X;,yAL Yދn=O?UD֗+[0.K ٜaYvٻ.}$2oѥ;lkd=ѕOl_3@ H*Y=6ZE9`8N!]2:l~VWD:T/K>nPmXѻ7/d%w9}\@ 1 ܯtO/V%w.D0Xp8@)>Qg\DѺW#۽z8o =瓒*wC U|S|t~sK2\)I7X,vyv lgj1}vm ,A[`Zj}Jj}Tk=_+e"Z>3477T3dk7(^ZKHTF Jo}B]]6\H' q1܃ɥ{^uMu wJK#G-?p,֊-LFJv^j iz/:H(DPNA9::iP LuznWkIm6gڐr:kcEIЋꔸ GXV"QOnA~vIk5'C\F=-j_)>hG&#g fL* z-)[w4ZT3@[&Z֖!NKOoxd'.i]tZQrieNпvίj.DߜIȐ&؏PKe` PK%[|c=)0 ~Qosxo@8x]GD>!o+ f>-dv)]*"=t1&JcЕ_ 8}x$;\D]W0ȼt%Pm+?]$ T?7d\2E oaӦǩǡ:2Ou8CC都cȎn8U&rN|t>7}eF?+pHm hr6yRKjlP_QFP@}{t}РN#.d=DZp/K(t`᳅Pqs~tqoHs@r S8gKZV TMYO\mYVհ&k+h]~=.d@P4$4H8վɘzL)@#=$ wQ29n$nxӀ8Ӷᳰyx55/jHHE*vL?h0,Sʜ[×6 K.9&$k3d}U_HBg-&d5123c!IEty/\f)mH\ٖqZ%_ɏAmk!pܠpxAKpGɠWGwcӔd~yҕ?IoxnC} PBGkfWƇxR Ք~D"azpT2B e(W;|iWW&aM&)) 6%x;Ώp!9n 񄭪0|w ]gK ̀À7+qľLCXZrOV mX4ʣžR3Ȉg~+ t>1+ßF1Si[ֱ#|4Q0|ʯi7s s/VwP-gߖ`TϵWVΫu3'u~LFK'&D,&#ɯ/;0c= ۤP˸ܪczUXb}r7) KixkL n2N%˾0 ?%zded5Dl/8_PK K'PK;]bsvOĒ&53 eZdAX@K^S^bLF , E(p!{Tڒإ[7Zz&TјKS~a,jtgRo5BCf罹4x po m?b+ #>lT_PK] 76PK #include /*The frame size in hardcoded for this sample code but it doesn't have to be*/ #define FRAME_SIZE 160 int main(int argc, char **argv) { char *outFile; FILE *fout; /*Holds the audio that will be written to file (16 bits per sample)*/ short out[FRAME_SIZE]; /*Speex handle samples as float, so we need an array of floats*/ float output[FRAME_SIZE]; char cbits[200]; int nbBytes; /*Holds the state of the decoder*/ void *state; /*Holds bits so they can be read and written to by the Speex routines*/ SpeexBits bits; int i, tmp; /*Create a new decoder state in narrowband mode*/ state = speex_decoder_init(&speex_nb_mode); /*Set the perceptual enhancement on*/ tmp=1; speex_decoder_ctl(state, SPEEX_SET_ENH, &tmp); outFile = argv[1]; fout = fopen(outFile, "w"); /*Initialization of the structure that holds the bits*/ speex_bits_init(&bits); while (1) { /*Read the size encoded by sampleenc, this part will likely be different in your application*/ fread(&nbBytes, sizeof(int), 1, stdin); fprintf (stderr, "nbBytes: %d\n", nbBytes); if (feof(stdin)) break; /*Read the "packet" encoded by sampleenc*/ fread(cbits, 1, nbBytes, stdin); /*Copy the data into the bit-stream struct*/ speex_bits_read_from(&bits, cbits, nbBytes); /*Decode the data*/ speex_decode(state, &bits, output); /*Copy from float to short (16 bits) for output*/ for (i=0;i'%r|RzCw1fGG0e&᳿=H(:S&m?̚ DR6@Z QXTq*& n*PK PK 4i4ObjectReplacements/Object 10 s qcd0dFid000309@!& #%;P4PT8 V5 O Ȳ[I~br0sdiV`L$CpIbQpenR~U@;b UR@ڟ*y36v7̊X`wZ@TVDG X¬j0 qthhIՖ,P`vmVHN|pE:a=u09to=`ͩ,0 ʊ39u*.X=PKCFPK 4i4ObjectReplacements/Object 2 s qcd0dFid10? b7YH~UT8 R5 O Ȳ[I~br0sdiV`L$CpIbQpenR~U@;b UR@ڟ*y36v7̊X`wZ@TVDG X¬j0 qthhIՖ,P`vmVHN|pE:a=u09to=`ͩ,0 ʊ39u*.X=PKCFPK 4i4ObjectReplacements/Object 3 s qcd0dFid10? b7YH~UT8 R5 O Ȳ˛I.Ģܤ9L A,VᖀPځ6 PT W fg{b h;H3d++&!\ wv[aNsd4&=8y"8X`wZ@++"#|,a 5 [8qr:4߶?PO 0x=+Hi8', :rAq`E,0 1f3T$]z PK ^APK 4i4ObjectReplacements/Object 4 s qcd0dFid1089@!& #%M PT8 R5 O Ȳ˛I.Ģܤ9AXP3-3;f121+5@mPA@ d?eCP،@vXU3QaoB6q=`}cA8l>p=a@!$37X/\!(?71bp-X3끲 FN3btZ+$`lA'4ӡz3" =k?+$r'>Fn5j2Qpץ1œ#HNwd;MH2*(17< $!!̩Ha"PK,5Z}PK 4i4ObjectReplacements/Object 5 s qcd0dFid{,n@TeT5(TMg@!$37X/\!(?71bX5H-3B Ĭ`' ā6PV Ўl{c@rZ+$p( q;Hr1$W& 2CCrCӡtq(@ݕ&> ;e$rAI.8Œj4e = +ȨJf\D\ԁl9je*iHԲ0&A|?Pʐ_" PK7&ҵUPK 4i4ObjectReplacements/Object 6 s qcd0dFid10? b7YH~UT8 R5 O Ȳ[I~br0sdiV`L$CpIbQpenR~U@;b UR@ڟ*y36v7̊X`wZ@TVDG X¬j0 qthhIՖ,P`vmVHN|pE:a=u09to=`ͩ,0 ʊ39u*.X=PKCFPK 4i4ObjectReplacements/Object 7 s qcd0dFid10030(9@!& #%m>PU6PT8 R5 O Ȳ˛I.Ģܤ9 A,VᖀPځ6 PT )Jwfg{b $8 )=8sؼ찃,Gr|;H3d++&A bu@ (Rj4#Ӧ"i=,PKPK 4i4ObjectReplacements/Object 8 s qcd0dFid10030(9@!& #%m>PU6PT8 R5 O Ȳ˛I.Ģܤ9 A,VᖀPځ6 PT )Jwfg{b $8 )=8sؼ찃,Gr|;H3d++&A bu@ (Rj4#Ӧ"i=,PKPK 4i4ObjectReplacements/Object 9 s qcd0dFidn110(9@! F KI['PMT8 R5 O Ȳ[I~br"V<(L%)=#.뽟OBE]Ũ;͕$K <SOESX>T~ 'mS}4gYq^q\[E8`T@% EAE)]K CSjR{?&_OkazZn`,,g.*'.*Ǐt_{t?UroE碴5؏Q1RLrUEg s(݃. qЁR(Iuuĉ}ݠ-ab2@h{(PZNur3] #,K1JLFs/a_HSf|?tcm|h`L e(y|8Q2#ZOw$=6EV w;ѥ<(uEZ- iw;C:"V(mp  5]&][m} Qu +$w~X*tEy[м)R#z`4ڗ8MJuthr;z|ڼv1wq([DYwd6 #j'kp_~p?$hv tΨc 11NK?12^ns`t=l|D[!MU~|Bfppl^t\L?*_3hCIbDU4޵5:_c7v. ^Vrn:d7[z~i16BƦie 6*0^UrśhCi2K;ԧ[a$xvV2y{,Vg䯏g_Yc!JKT >k7Q`Hq:LǤ48GywxyY鉬IϻAi Ӂ2B.j>$$O+I6\!0cˁOc MuQ}ylIf cM^5-{5[SbVINX'0 \ @,dy1 xZ_g6 +*_c%z@}?iU *#gZ ᡝQHJu(mE:2 P{MQ_#9Bk/KϪ\ަNjSc }e6%_QZIk(_S|7L̔ L%Yl%"Op]ޙX )^{̬=V VA^ `i>t/PBװga?LjlF,kcEC[XoB22Y&-((SYZT!r75~(NH,{iF'DZE! ]2ʄ/{@ͮ8{IVXf .ktx9+v{Q YIA*b'Hq i= 't C9X>+a6g5,Xu`hd13&F{H'k4+pіl'hjYtL %?aҰk( Hp;5ެ WFz͊Ҋ6GP[ ~㘫3)J(/wZ483;V5k/c8٪|[9Zyf@gZbAwa0S@m{@naT# (9,k8)<,qw:qzq{H^꙽-a:jB]%vr?dX$C)$CRO,߶HLbSg)|zu1U} ssGlXd]$a"{cC{C6mڿZl^Yp u1~ua A69V)jS#Y58B{KZ-+.E4bYg+P6S-7m8ǴO뾵JgPiGNOPy'?- ɔ ܌S}5qҮ zx$ |)Љ.N"@}m&?ќԼH1¬"uG椄%M*h:u#=L'Y `F<.os_=n(W?  tȼұN:I^סyN8Dl.lː(J^CsRIidQj퐐@ƺH|2¬''hkDfo1vz8:e7@96ﻓ$?v_`P& =*Ԣu&}W[ɐ-mBq:R5i}74¬:a~KTU4RunYp*U(p1͌H_;Few;2v/JjɎ:?Ʒq`N|Ͳy7v8'þjqm`u|myL5Qn&lz.aDdCtP 9mCn,w&/zs=¬#Z-7LPvBiC6]%gaڎh5UgY^OD T}IKݾ/9`$EJ>ˎpjžH}wY^G" ׺7bXp;G{^.n쾤4.GVqũWqۖJ1 rb@|F_պP3FJo!qv9Ŀ-\nZma5v*C4OkWtLfcdͲ8hkD^FFk%c>m䩢Iجo@0WwL7b9̙RU;N__ $hR9R *LMhqW.#VR5XްTu";џ@b/ XE%Sx[Ұ9MV̙jE$*"Q*"(հ]J|VLL.ĸ ݔSbQ*0.SW8jS (K.R5LGx[#ׅs5!6Yop)voX`i.zu`f֫h:4MBo9ſeEk6\Hu _U7xz+`;7xգ3WGV/ߓ3l,Qpȫqn253w9hv܇> x;~!I?PKI]qWPK 4i4Object 11/content.xml]j@}TBAPEz*&YxE ݘn^07̄mI>dewH-Lt7v&x-b\?̞bB{ԋ,SBUB掑) &sgψϔR^.gq7:gl4BCVnF%GƭfBHj/!x-mJ(xi)`13-JQT2(cr rt/h mɽ ;I~z;6b䫃@w\ PK>S&PK 4i4Object 11/settings.xml͙w8ө9 ;U[iC’ ڿ~hSLGɜC[ |on.7"ĥ9FJ Loǁqv|kuM'F@$1ȹhJ;aĤACA@Y Axߺwey(4=Ok4+zziS2AϢQ7P! VUՋr~փ5͍6k@ qf)ogCQ1G0}󚲫}C0y—xWuyK0;B[~fl瘿/wq3Y~#;a4%Y~/8q%|+6M9 )"- ٰ-qm >pl$F0.Y0-\h2@"+ebJ}r.|e:=Q! Js0'`b$ϖEU,oX YI7џ@ b+ XE従xo a42r\ YΔ+"'HU-"rT o Pwjx2j1_ Reٔ4g⫢Y~(ॄq8K{xO=gc5!ǽ'_^舀x4eu1å^mcWkd>-D8h;4\5mo 1'G[/;?c[njj1Ht{^^C# ٫;6>U ԅ߃72n'n7[7&A[M{m4mԗngi|;c{ݻU0hvjvd?Xŗ -M^ y5O!F}Fn9ߊ|})q!czC[>I] f9az(D[ip?{]W]EuQk tV885פ6$4 ^LSFt$KyD:c9%V\8E{b"eRp"g/z!У)Wp>Q DhQ䠜Z!_zȓ e~9Q͆sP˩!֧hqT!egz0 %&#*PT9Q$ugS*[>5PK;yPK 4i4 styles.xml\_6O!оcfSܡhp-Q6J(j~~C$xB ĜqǙ!gLw 1 Kl !H?sg/oYo" NŹiĭ]tPNMoDaN+ɽQSٔA-Y?b6#c%/`jlCN9!K2$#-(I?mu\0wz*jpXe+ ]L,wV h~T)-棡AuV580W2-ߏ~ۮƻ22e${~Ưx2v.ۂ*$m6cR@R7𼕫?dzGN{x=D4gIh{ 'A) 5\LTʻ:ݾ{+/'m wsOak{g8x_Ø˱Cfr'D(?{ǑI3NNbe*8ӽtjoq݅A ڬ+JS5:D8F-(K촵eo8RcNa i*TgHC"4+%[V(::G o$/vv#H4hmExH1-^#[ږcDs\ʲpͪ٥]k;?ECF$p $fZ oQD_T, |-q"7fL1}0S5"tcߔ|(qANXi 9sŠ/T,KmHV2gP  Jjaj^kjmb2| !2"#*?fx$ҙL?G0!n WO)_g@vZpCBÈDqI Hzq4CWlU?>4<0뽔U֙Du ó53T5:CIv@z;})qD~š8yN]{[!VfΣ&ʗwKԆI.>Jyscl'31pA|Or\Y$a9FBzFuj έܱ?-dVZx:I(n!%ibF>kcsb/ηsCtn ѫAhn ѹ!:7D_!:7D!XV@0RWZ;VjGi6 މtkdb&8׆mnl]`rϳ}AZ8ɹ깮zz: F5vrҗ"y'/\CpxUF/x9ڗ[Yt螩ZV=㈀ _#^PM+׺H}]/G/;EЩl{ ډ>xv9O:tBVWBo<$TUo[{mZKNI?Qf^2y*P8bѕFImyAL2GDQ _p| 9  ?9+ h'5uÛ,1c 5U#u^ q1 ⒐\tj~,lW~Cok 8g8D/wO>CR+mfCh"gƱGPiPK#rDGPK 4i4Object 1/content.xml͒J@>:'=4c(B[VZ[0x\6&jŋo  no^Yg~oݐGL \LƙX;='xF Rʃ,Wӛ@qb$Tkq4&3H2U7$3#M[ P"Xx5x!z7@,)G$aҜo-*QZ–YЖgY-׊k>M!|}2Y-}i,"RƸ>hv0呂R!ڤTA &au?!ǩRɨkm /PK@c=PK 4i4Object 1/settings.xml͙W8u GS@@ MNR߄kYԶ{sss}[87!C qȴ=ڷ_wt2A.,yԍ|H&,'VJ($% b%|J-M֥,AI8.i8bQ_=4u)gQI(J$;$Y q'Zn=_\Sa#r$.Mn}[ di`v߯}BЧy—x*ƝoVp"}5cm)܈BEM Ý E0ؠ홶)Է@8E3c1aX#h]<n*5@ـ#$3Dg€!HKRLG}@Ig-VxsU&3#W#"\FLjVa D#Շ䢂3b:NimJN42Z 2gDTv*rZ 31-fCj7wSJZZLNE=,O_yM׃/H2mQ_\հؐG!GX"¥1/F]Zu2`-^0W3>thɅVMsf=l/ Qo6ǣǧ;Vl1vHo5ywGgU5 _ 6 'gX 87?Qpȫqn253w9hv܇>E[E6/KߡB0y%QiVyK_\AO3ގ}Iҏ}c PKYjZPK 4i4Object 2/content.xml͒J@>:'=4c(B[VZ[0x\6&jŋo  no^Yg~oݐGL \LƙX;='xF Rʃ,Wӛ@qb$Tkq4&3H2U7$3#M[ P"Xx5x!z7@,)G$aҜo-*QZ–YЖgY-׊k>M!|}2Y-}i,"RƸ>hv0呂R!ڤTA &au?!ǩRɨkm /PK@c=PK 4i4Object 2/settings.xml͙W8u GS@@ MNR߄kYԶ{sss}[87!C qȴ=ڷ_wt2A.,yԍ|H&,'VJ($% b%|J-M֥,AI8.i8bQ_=4u)gQI(J$;$Y q'Zn=_\Sa#r$.Mn}[ di`v߯}BЧy—x*ƝoVp"}5cm)܈BEM Ý E0ؠ홶)Է@8E3c1aX#h]<n*5@ـ#$3Dg€!HKRLG}@Ig-VxsU&3#W#"\FLjVa D#Շ䢂3b:NimJN42Z 2gDTv*rZ 31-fCj7wSJZZLNE=,O_yM׃/H2mQ_\հؐG!GX"¥1/F]Zu2`-^0W3>thɅVMsf=l/ Qo6ǣǧ;Vl1vHo5ywGgU5 _ 6 'gX 87?Qpȫqn253w9hv܇>E[E6/KߡB0y%QiVyK_\AO3ގ}Iҏ}c PKYjZPK 4i4Object 3/content.xml͒N0}+`GBLl%8Bl5t)76;L//9?xn#שP2m#.\x^x@N|/&hKMX^MoF;.q,^1YF,xVمY|`r^d"L#fi!dYeĹՔo4kʜ*sRo)c\ }pҭܰ91ݤv*R)W{PB#CM jX8 Rjl;KwҖjl;V!΢GPK @PK 4i4Object 3/settings.xml͙W8u GS@@ MNR߄kYԶ{sss}[87!C qȴ=ڷ_wt2A.,yԍ|H&,'VJ($% b%|J-M֥,AI8.i8bQ_=4u)gQI(J$;$Y q'Zn=_\Sa#r$.Mn}[ di`v߯}BЧy—x*ƝoVp"}5cm)܈BEM Ý E0ؠ홶)Է@8E3c1aX#h]<n*5@ـ#$3Dg€!HKRLG}@Ig-VxsU&3#W#"\FLjVa D#Շ䢂3b:NimJN42Z 2gDTv*rZ 31-fCj7wSJZZLNE=,O_yM׃/H2mQ_\հؐG!GX"¥1/F]Zu2`-^0W3>thɅVMsf=l/ Qo6ǣǧ;Vl1vHo5ywGgU5 _ 6 'gX 87?Qpȫqn253w9hv܇>E[E6/KߡB0y%QiVyK_\AO3ގ}Iҏ}c PKYjZPK 4i4Object 4/content.xmlJ0}+X6mM67pCQb6Mj7^yw|v EěpH99~ Bc"nqv0Yp dHT`L Rt]fS#=)X(˨P9P.B[`0@l eiA_4M_b$T!BܘغTQe^ȘJY%Mthѽ""E- {K;^ !Z!GH x ޝ$qdp319(4|"?ebGkA?PKKPmPK 4i4Object 4/settings.xml͙W8u GS@@ MnR߄kԶ{sss}]87!C qȴ=_wt2A.,yԍ|H&,'VJ($% b%|J-M֥,AI8.i8bQ_=4u)gQI(J$;$Y q'Zn=\Sa#r$.Mn}[ di`vߏ}BЧy—x*ƝoVp"L?@4s/m)܈BEM Ý E0ؠ홶)Է@8E3c1aX#h]<n*5@ـ#$3Dg€!HKRLG}@Ig-VxsU&3#W#"\FLjVa D#߁^rQ  ՋJ|4 a'sR @3ՊHJUETDPa @9љ]q5)% --&ĢT`\䧊qfզAQ MjCΏd(ZG/ jXClȣÐ#\WRߺF]Zuzu`f֫h:4MBo9ſeEk6\Hu _U7xz+`;7xգ3WGV/ߓ3l,Qpȫqn253w9hv܇>I}oCckvo5wkI͞^!rE?040ײϋ ?څ>j=ST۱SջCTթvtFPK78SPK 4i4Object 5/settings.xml͙W8uZ0 Jف" oi &&_ ǑfM'ߛ2 G}Dfq<־U)`٧^@\4aѝr)S+@V^l߷.a%F䥢9˺$yrqN^4MS_?6(gQi(JHvH ROfV~fH!ZEkھ~V _ "\7[)W`v|>gd^D1~{n)7p2{F3"ÀٜFrȧlRbkD۔s !Q0,MG<nժuGF.L@9$+B€ HKRLO@NIgmV\J1DNf03F*FL‶@cra.=Ș^P~֘.M|b)kn NzΝOš˹m_DĚx@2yF AbR-Cr%4";+.e^R> *)2xrWh '2l je8 G\.QIOF5[Q-YCO)? h} nuLFּbārDJZ!1 .}9p% Ox;~%I?/PKLxXPK 4i4Object 6/content.xml͒J@>:'=4c(B[VZ[0x\6&jŋo  no^Yg~oݐGL \LƙX;='xF Rʃ,Wӛ@qb$Tkq4&3H2U7$3#M[ P"Xx5x!z7@,)G$aҜo-*QZ–YЖgY-׊k>M!|}2Y-}i,"RƸ>hv0呂R!ڤTA &au?!ǩRɨkm /PK@c=PK 4i4Object 6/settings.xml͙W8u GS@@ MNR߄kYԶ{sss}[87!C qȴ=ڷ_wt2A.,yԍ|H&,'VJ($% b%|J-M֥,AI8.i8bQ_=4u)gQI(J$;$Y q'Zn=_\Sa#r$.Mn}[ di`v߯}BЧy—x*ƝoVp"}5cm)܈BEM Ý E0ؠ홶)Է@8E3c1aX#h]<n*5@ـ#$3Dg€!HKRLG}@Ig-VxsU&3#W#"\FLjVa D#Շ䢂3b:NimJN42Z 2gDTv*rZ 31-fCj7wSJZZLNE=,O_yM׃/H2mQ_\հؐG!GX"¥1/F]Zu2`-^0W3>thɅVMsf=l/ Qo6ǣǧ;Vl1vHo5ywGgU5 _ 6 'gX 87?Qpȫqn253w9hv܇>E[E6/KߡB0y%QiVyK_\AO3ގ}Iҏ}c PKYjZPK 4i4Object 7/content.xmlJ@>ź'=4cZ$[0 4`xdMn"^/˰7?[lX)Ҝ4.0b<̣m c<#'֩;r2*ijq < 8NCf \)FݏobkC*/\4))@UUF5jd2-N Q.PhTW[BLɋc {֊mgH  /?;=-pS,31;e3Jo*`A ?芍3mSΩopagF-b°vG\7zy(ܪUj4  sgaGHf΄C49#\ZJJ1DLf05F*FD\Z%?)JլbyR։|GD{Eg2t0T/*2iJe$dT+"!(U!R @T*FgbZv&o璉,zPqY*ƙWG ^*w9 e:?ۢh !.a !vB~s]EKc_tc1s vte[aXf|4-w ]{Q0^lsQ#%~5ƣVlGOQw2ck:W7 ^j0YEl7Oΰp4n6~x W7vdV-k~g4qs{iz>6#}x^7nyj]Z>/ź'=4cZ$[0 4`xdMn"^/˰7?[lX)Ҝ4.0b<̣m c<#'֩;r2*ijq < 8NCf \)FݏobkC*/\4))@UUF5jd2-N Q.PhTW[BLɋc {֊mgH  /?;=-pS,31;e3Jo*`A ?芍3mSΩopagF-b°vG\7zy(ܪUj4  sgaGHf΄C49#\ZJJ1DLf05F*FD\Z%?)JլbyR։|GD{Eg2t0T/*2iJe$dT+"!(U!R @T*FgbZv&o璉,zPqY*ƙWG ^*w9 e:?ۢh !.a !vB~s]EKc_tc1s vte[aXf|4-w ]{Q0^lsQ#%~5ƣVlGOQw2ck:W7 ^j0YEl7Oΰp4n6~x W7vdV-k~g4qs{iz>6#}x^7nyj]Z>/jl&//=Zq)|:71ɜh» ٬Z#xD\jt :EJLg嫏 S O^u8S x 3P!߹4Mѭ^A W(PKtz PK 4i4Object 9/settings.xml͙]w:ϯpq{V ~LP(Vw ChID;1!g^فo+0d4$.WaZVfȅ `sхUBCBY@{weK0"/UmyP8/% z\.]W~`6aZmkj;?nЗmoˡU5,߼zgFB0k@ µq[.qfCvW_KLA4_Q)gs܈BE͉e Jo:`E ?芝3mSΩopagF#b°vO\ zPU5h"z0eŽ hv2D"+I19'AuX⏞s(6Ԅq2bj(UKuHX/!\%PwJ4dNS*# sZ A HHJ5-@BQNat&l`hb\ǔSbQ*0.SW8R (k.R5LGxW=¹Y֯JuD@;F|nnaVk`=Mz} 0 ٌte~ru\[O2[Ɠm/t)ۭa:^[ft}2Xxmt}xo~+)փ*[bӡ{pƭiÛ g<w&q{K]^Oۣksd]{{|xlorGz^x %ܮ&bw/%ʅU !h2-:C~-p2ts(t^m "A[7Zf."p|CޒP_$n1MMӕ,Q'qIJXApeGsCAaVI`Lp:YaQG>9) ?kt]RR͎sRKPOR>[E6/kߡB0y%QiVy K_\AjH3ގ}Hҏ}b PK{ZPK 4i47mmmeta.xml OpenOffice.org/2.0$Linux OpenOffice.org_project/680$Build-88252006-02-03T14:24:472006-03-09T17:32:26en-US21PT5H42M42SPK 4i4Versions/Version1{uX\˲/]$08 0xp܂C 8 $g>{U5Uݿݥ&~t [K[=`d cs3e- {)l sb5w4U~Åq_$AvfΎE9X!ܿ~%#/&V@|P-rdCT)/ %i[HO%{Th* /.7fġF&r4jQ vrFr_%s(9'M`['_f^ 1R`Scw)O ~ z\KA]-kG7O!|`4 fF֑&V{vm\ zQ6&ٸ(cR#Ww! E |MT$Etg{j͇gYA~d`%`(hj[Dv>S4{_NGNh/  aPϧ? !FFC "+388r3:g~:3S!X>v41$J|BY.y%7{y$֏|O]Th3A@{/K+t=<7 fmvBc#f[ܶ#:5:I7~KSy;~&6"jICXf%*b$%m1O!mXIQbBf9;=3q1Q{PT;C]8HXRAz#Iq#G;B@OLswJ,rR[e.Rqb%DbAQ? g?%TH(ގ|MEzg4\%G m,v.+`u5'l< P{6>&jOrx]_ ?./Wh4ޑ.7aE.旖a3?N˯PFkLGS|B2R/(d\N+zI$Oɣ%zjMZ+>)Y?i4Fl_`4nu8w'Br ;Aw9TɮS (FAK~sCM㛳+_e_E-$1y]vkA8 @Ƃ߱`*VƗ3Qyռ: n **\*ly_WIT(-Y<_Bc#W̠q.SjHb{*ȒjD]3ww((r(Jȃ!:M~Y)_<^Sx SэM]]CBZL$VJ*⺛.ɀ"EAm}.`Ap.WWt'e;OМ"k%4 W5[$;]Rǂr!ht )1N YtG\P5 Ažh/YɺQ)ĥ'n)\)Qu8#Cx0U}]+6搏k5bbYQؾZY0;9eF-a)itA0r9SZJ9$f^ {6ĝcq`ncX 0%e7ƃ =!',^psp?Q&\B¥8h $V !P\+5qTBԐ(v$\ǟ eW0ogJ!7G,\ V$)FW‘hGSΐjXW$a퉙:dALE;ݣڕ1uRBZ =64SxCÌekÙ Q]JԹMIs]M 3/o_mWpVC%z BB-SR֧ѵ+ت et޻ȩ/݃tI^rQWT,!2D}E9r/XƟ*>;JΛuHz?s#s&\{ZϠ5.xڣq~bREheT/XN ^YB V]Dе -#}\z)"Šhp 8] LD"ЎKښ3dIifMFs{ 4c)ݛGkVqfw5?{ \]qͷyո^y*T ױX?NWR.܍Y<$/(}jyeH˛Hj8(A՘/Pe,/N>rاlP]'ռ=b)`N~!1L{';cFq;߰ri>$M""=MM}cVjx @f{5rc=iWh@ *|@`jie]ugoc8q09]Mυ>̿LS sJGi ~w\`Q,4{dWhkÀ᥁o=v]f{ M,ʃqyYtVsl8K B[;!h(P % ׎Hυz? C]o/A *{w}bNLu;ݰO|ƅHmle KX!l'e.qk!yHΪ LfU&-_yH d)&{ Wn!M|벪֩8Z+;Wv>E+CꤡK[x֚葯No&${+_|q!UJ.W'"m+2Kkuo6<oa 6'T`b[XrK3ik65WcY+&v#˱?.Įi.ԗ8 u|MxT3~IOOYijt*&/&͇++:>q>a°`˓M9(@G,| 30Fdw͔:%-N| $>m^#ⷯ>;}c4$2Иy^-\җ= d3C<Q{]C 0_[걝j F6t;M`Zb^[nq㶡MyrPm*ё``pčǫr`݉xg\ ?5o *A/`'w f?r1R>Ek%`l7Nr OڑOo>at1vI2+ܮTg|y@=Kt0jmU6َ^UШ|$t-5Y~mr*O$QY&Lpܵj9|Eo9ܰ ύմƓ ֘k}}pF#B"DUJɸY܃Yhsz i !'-<@UOe[V0vq0Z\%e['4Z]Fj>Iv<\i/*tB"둳9!yRѲikpĺi(&@C4Vlc9="#SH'`7A<)RF2m4_? ʟ B ɷ QeCI>L-Hfo/0S%FH+?k3#nx}h#gz/5 ,ZLmebGUozRbӜݞ2o:[dh!)kƪBDI: u1čfYE;{8'b}tHq x.3 olXa>@^]`!攎8)`+.f` xʅ3=`~,>AajM;Na J ,˘^|{]̖j+8AwױZmpnEC}'}X ="aXlܢL2s Tq-B%jVݷoM"vw݊pwy6V.}. q 2FNz1Weƽ\!K:Um=q̫frUu_,,i? Ԍ쎮f}mU0(.)`-|K+6sXDV& nqؗ> @̔}/s^oX^O| Rբ}௮VEhmfvv !Ɂ،It OevY\kxڍ⍆KҌ XholiMG2Mfy,0(gXO&ȶU Nx#E+BYӚ!fx_D֋g&YO?fC0EwooiJI/,.La},.u~YsJ+n(e":8[kjI l4C=2t+P$,^mɭEnVjUBw:5h/=W!aP(n@}ZiYG5xGNMS\49-g*F%m2I>yH=W>ߪٷ嬪(r8y^Rta3[m=mԨ[ h WaB¦ŧL[oxZgղޤO/o@U{MF2@iŶrjL҂ ocMm9f-C@=u9UE(rFb;0E脹cS0=gu{J;0dUI|bG42HMK1W-F?)=R@"ۀBWIֹ*/&[F*s86p2-$su7-W,'i&/5UƐ*i:n=JӄkqDڪvcQGjEM>!c}(_Ρ/V@):9YڙᚓAgڙM~.0DXNأu=cvqf ES1cɀrMtR&-kiNv`Y+K@PX=Y?7|D\^)"Ic_ȍb2Zpf$ۗZu[/ aLf!O(ZlMX b<=3UF`t7-Bvr6+b-K*[ 2-|jɍϚo4H9]*Y(PQJP2yK'VDy&E54쑪5+2hTZo*y>Ӗ/x`yI$׾ hsG~n(hakd*xJ6|%3~0K՜"o!'r5p3)u{35=PAHJhiKpb"^n=!y,tw6|q*6o7J5SfEŚFhP&t=q艳FkTq|J@$P .ȺLpoɑ+2rGד1 sRj,ƒ:6:0ja!:.~*Tퟋk=6V%\0R oڊ!QK >oXqY;>bTc"b%̧`ʹ"Ruj(k5B+iA[M $XV6>dZpo .|߱DBNW?D"ADlu=g8ЯwLw̨',-W]tSܰE/E߈2x!@!QzNzZYkP8j/֍o!z*`2::8Mکv笫;H(q5>LL]c+q2]sS0CxrSheÊupf끷wn`р+4fdZ7Jm]y56zD_tޮ]mE#PҿD> D[IXѺbW 2QtVO{ ֩BxG=L03O ,8[ภhH*64͘&D#"Mk֨Η;\ߵ3%-hKOY.PӇC3E $Dfjv@GsLC Q9ȯ mMMbR9?Z ĩ.QɌj)`5zK&}YT7Ie',`sRlinIV εh)R^d\ YA+[ʉ:;;(\X{$Ԡ (KUI*_V9 X+DȄKhPg~/lT8Ś'Z?|TiZjnJa$N!:uNmG4-{=R](  *{ b(3],^BsAڙ(SDϲǥHޥ= JOW?P, U HN{,POHA;#[2  Ke,DGLiEiʱCn"2}k7fC *F=ZI}S!\ܨ.hYv֔!&[7%o$EW3sЫo)F+,wجg$@8"#ZHP$j$<"k0s ߳M37ScN-]bݢ[EƤSmk}g4oϸBT? W96+c@%K⇈FY'w~vm5lHS!"`:z)2D"f%ݷܑuۆn]&H5Vԇ$#%"AA'(Y·MLr9\|45+߮*6AwZM1ӐAa/QxOi⯊G ng#-!:%K {F˧Q]d$6| Y`ҳ:f  %B=y Q/xbUlr!1cfZz+CPǟ:NE4:( yéUleJz9<:BԱ-MEuL|v +}6L @b>\]+v3IuY mԥmjF֟U1 `}"}2 ddvэB62PnO OԀfZ ׾>N S5*w& :ftnND[$J^Pxr}P<)g(|ƣ֊- Ct2~Bo.@G%NhޏQaJM >JQ$!%({ ?=X*aJgG;-vƶ@@,77K;kaJ ''{66WWWVW.V9???IMwvNe `H2+]hTiwe,O~3w9ٹ~;5@߷ibM,m~"P"Be:;Ee*׿`gVsv#0=cp1ebEoMc15v[1 ;' ;'7?~27vNBlW>Pۙ;Ev{?oabl`4iM%ŧȩ ?rYLfv@Sw|%L)gg"d;dq쟣ЭN߈A'l$LSa#\U> 2i> kv"ahD^Voh](ٱu?_twžHOⅾ %Aa ԡׯd&z^;(#vVJH}ǑPZw_Y:d5Q|Ҥ ; ܒ|F?m;j6Aډ2YvE#*b]#uf7ژǷh!? s7-_z!a|IG^߳l^]VFĀ["ZԮ/T7oRNkf?€ra\P[]U[ឰ3? ~U"@vEovu[n=G(1P׬6ƞ^GVw(Y<_9wM je_LuK`Q$3!nŭheEX2::=x7!6_LVm01[Nj*Q1qMp{ȖHmh\h_Výwp:1ֳdUb/Umo1Sd&P{җk5W52[[4xrKI$EL 3-lc*IX/9+a5 LYu†[2 ?Om'e!4k#/T~Sg|IMꜷkȝWR~̃@9a񷘲iӆ'b 9Ex {ʬѨ_[rwnKL!g lE(ιof ~"w " V_1v"Dۉ`n2>`7.on`DyyigأLܝ/]A6oB:'D~pצNz/b>xqx۶TPZڠႿToRnH]"2Ծ=o$t LeA{u|U>V<]ɑ~? t~Pd,?=^ 䱵Epo& 3uO( ҍBgBS}pQ-,PQZCENI>1?O%.+/<,]0 8 ~'[NQ-ffmW71?$vQ"A&:iҪ8\iJR-8p5Ɠ;]Ot?ЈcI/b1 s= `vӪHkfVH&a06HQ!G0 0_{Fds^;5 XN Y xY)ة%3fBו*$< 3=\牋'K7`0n<A|+u׽Odfx5}GOy7GQyw-H%Z6~0&Jf~zG}P83{\?`ġ Gi΍Oiy&-/cς2WA?f, /ӗcς`2WA?6,h/SHc2O~JdzH?1by+ߏ>p~S'sJqW' Drt+aBǧ}+dr`W?}%dW?nDok*E៕f6PXY8?^KU1?+'Kկ6uep*ί 8֯?*S Ɍ5u(ïPKh0EPK 4i4Versions/Version2eX\6 4w'@pNw B4X9w&Ϝ=\ZU{{ݫ֪-'rŠ2zz9̬n@}[[K3C}G3kzgk#:}3:[ڑ^AB{CN#_KrfN@`n~~#9 [cDw89@34yBAGz} L`0E~ k/ovi䦕2أ`UX SKʄ醙x5~u> .`iiz;9zq1h31$ֵW k1қ $tqBwB\p$DK*L;y'd1S!~r}H\GI "' C^+sm'@o? . ID k60u0 ]7΀BV{/+HT3f vBܞ" RubmX |^1dRӏ8CDz.8 {yʈI2@97ԗ42}@ тxee_bEY,la@f?vA'.ɽ@x㐲Ky>S46氨7PPZ |x imл`0h "  D0SA$?te}x;A0Ǵ4J~urw2\O6^F$k~] |޸ D{)R4W&\rBmPhA2D#an@]gږL4gHeJK^^4N~ GOQ.@-颈V3w<2Ȱ1$QT{#$-2Y.J`@@|(g2 Yo0Y OX.+Ø;~B+0 |~8#>7!-"wj>AL6> Y:yp-yc:Wlx'Ǽ&!gbQk"cc@6%h%/q N1 H,["TqM/TWe=lq|#ޛSL9Kj 9h ŒvSx!4 3uI QOV#SD͛yBcg1*`U06A~R?2~\ޟ%wpڡC@osAʀ £Ao>-ϖ&0(@h_rdF%gE,$G+@n_‡ٴSrZidP,_G7=(,]OGZ1i[ It W5x\+{lS @ SB "E0D.QSnq[5tLBVd awpr7dw(H/W GЪKѪ h 8CO(F)d_2bJ0Ao秶rxt3qy<9kߜG|}-J," -7-1*o 7Z(׿S*c0z_)0ߧ_PJA]0Kc& }[ޢ{3Оv,BSCg}D5iICЛ 6◞9 moɨJn˞"|`e~Մ"͉1WOzN_u`7NYHTbm~"^uG^,؞@2_ x@! T^9u}lZAfS OF9KDw('wDg_ hl'pUXhu'$k۔45G0ޤI9sUFM'F*MVƆəz|HVuFxw#Zoxb?ƀ tTVH+I601 =׀LC9gY Fb}/H(2zʉiſXi8-%Ja$lbuhK(tXb?X]BcE(b cB5=8X^貸`h{FRY볳I6Zk' E)2Z1EJ,H|Y\LGI鏻¢hӫGBG4^g_7ջQF(l.{?j +\{r.0vFC㽅`N`):CӎhB & R% 򲈸k;\" S𾆶_G\kz* RcJg`ղcU>0]v3PKUMC_zR 14v9x$܃'?7#.ngs81*FcԤ"֕iMB6C OL7ibtڍ)h#a˸ӎn>-55I5^ʱ@pqF/u_+n=oj9LpPfGKvuKE-.DOGrO@^sq7IhfsP`{%{>dXe`5=,3ޝ5!f>NnzBbyCv~2: x#ŋy;Vi j_G'Zy4ߟ>x)6_z]-i<XQFߴt+N\tǒƶ eF^T(:nN0"CƜr=/f_r]aB#}otџ,Y%zqDra9 u_Jk DH/ Y@gB%Nn){)}O|G,2?_5zR>6NeK3uě/Z\/lONv ڒC}x94!LƓ O q'4 ' -="w8Zl2,%@KE7UL"#5jGQ^jEFTtnϛ3祣>=Qа#6衯榚#M'%5#ޱFh٤%UP3¢CNn+v,a,OFx &Y|Eqo_P=z٢Pᕩ{1$nZ_~a:aGO@#`<0|/v(<.q)0LEBEMuukXwa8• ʵuʥ$dx5YO3-YOcSx˺kjP+& BpՁ_ d?.zpEajA;6;,7CPfPc-`Vw->ڴ˘刅6^^nu^C  W~xtzHw~_Ri5̙-zb;'YnF%1#Jx:QSfQGY cQ$ (V% zd̙7;ǿ4%zm[ǶM_j|隈HZb[e!ӎoi?LO՗,=;ԓ2Hoj`Bտʚs3%B|SBfX$|rs %72mv~xQ<5ņp&cm+ 1"󂶩n:ToVw5=GtOHnz.F4/!us4%lS4۹!?cd=.067mT3 șo孽ln?}]Fܳ$X<9w)͌5JUtRW:xQ<3ۈB3 <#w;m@FqM[0y TtJPoGxfcWz~f" +'a>c݈ [Wq~H1][q݌q>2N.G_=ofJb+h'5P|Pce3aI.-^ K]v\)ʠWU*;<54/Y[6p j,  . "Gз:m3',h/umiU N$ [gGkfR&C;hkʌ[XA5vWH=إ]RFzM1X[(Q[QlSСl:m9;fZTH吰>HJf֋rjR4u%VC4&՟]Eԯ>0)0dרc {ꤾ E)T!}|TuN1Ǧ$f>7%[Ps?;neLp,P!&?@-@$'A6Ǧ36%xa@%m(>Aުvk>f&| ^ů")7{, ~Q(ө*6ɺl ٯ>g"5*EwVAe-byJtaY^^io8a"< zIv^Q"f?v. E6yɳ5C |@~6E6iM a+%Rb:^RbF/jU;g/yAyXx9CHK5!+/&l8Cu;Չ;m2jb]7.|^2#g3Y#^~x%(Xsnlp7IY{-P(͏'* OM/㢽`S \ÿk_N=$V:|<Mq3Aez|}W`S\@@ ^`T'z߅OFh~ 8WדyyG<=:oh׏\RSYܢtlKх7"Z@tv:_4u&*MX41$e+U?fL^&ed0Y+p{e_yk}$^Ϗ{cByx.]ux@%6L#0C|oMj2/dKy>}_9P26w[_&hfmp%yJҩjFS-hCc0jSUDX b>g20V8!O=ZbOv8-l Ef*D^V>OzVHo6Zd FIHXFƤ#ƥ8 :$CdY|Eq}~Sו5q5ڥtۢEӕ.tib^$<~~YDx]k/ 7$zj`2eݔsbI:\Tq $ѩrd5?Oxa&,6=ΖZNbå0~*ۘTwXF:;NI4yAĀ UvN8\T]?c GxMB1E\:ʘAS+qޓnHF0\y I.;Q<>g0,Q~-H-&:?L6ONjl@_b!p+I]):ɭx%eX!2_ZfEo*Фiq32k)p,8z$f ;Z/XѼZl)4EZgŗĠ4oM}"?\,εjW+ n7DlfaVm%|Ix<.:A, )l@lzw=dYxWcWP4:}\٧[Bⰾ c&4ѪWUEF<3,MO b$#%CqzٻN ry|ڼVN["2`O ˴E̬m zv ;4@|:aI%2ܤFF :9 Y=et ԫVk5 Ѝ lME|{d!֡]xQM$m4-tZ].b*VtXҁFU0s蟼H#Osqxh[=UΤ ƍksO)/}|KlXs.@g 4RocC#'=" lv4[Y /nGy)". I[K)ff6iȮ`(ۣRG\^`@ &D|DticM7Sb6;iݘd uGVPE]+hޠ&jc' ;h-,$@ .&#*%m/'7Ȇ붑z)V[ⵒ}fQtYmdx0 )۬qaw "| O" J%)&ٙReʎZt"Cw=vRfVM չx BY ?!њyyP+ƒnϤ]d!m|ƫxH|bhDko.uM04l+ˆA;#Sgq$v#asj K71 EssCE; *z2P=#{s&(.}Eie ŢWzRN>žJATX vSb2fۙMG[]%69L ̎p'}2 ¡­IgBxB_(9@hu [>t0Uz_ՐϾ0͒trjOǾ*:\4R>xd CV6HZQKE򍓯CvC( $~ꯔjۧv+Nym' ?/UV#5g˜DʞP99Z#ބwʛ'|^ռQ܀/qUWӓ3c3kNyY 3:XX8!;$pyFRaFyѝɎ&{IBmg\5IQ^ CZ!G"ӻ$lºXwˊHwT2‹) \*bf1hB- )gP-##!F< 14ؑ:ϋJksK_}\_ڂhǯԔ/f9W>#|eOqˏH̅'uX<{F?)d u)J?ȕ#j>PSrqUABƦ J71r+8DvG]2ᑩA9 =oq~4Vip1y<ӫQ0OeXUۆ{\ [ܦEJCJGcYX1 ܋*lamX}Ç#Y7Vnбx%Ҍ=biAogtlx q&xJ Qruz18I9KfTfOX,dkN:=00Ym_?Deh9pW4Ag- eM/[l,^%!WFճgӻ<^}+䧀t٪|mXȔm 4LZO"Ԋ\e"KGAϡc%;Qx90R jĥhhr\XS)vͫl>o#XBB$'\zV%VU tOEyx)ԓ[Das H~4 Qv-+qW",):bșȒdBc5HzQ\Y&\Q*HӄvP5/읖TMRiw$K1Q H཈!Y˨}B;w2߳b-Ӭ&Tn-pW/z/׻RM*IxDv}|^$ M^V}Wn_ksCĐ~h>tP+CsD;#Vx˗2(D`iep-њgtFQym@ÖGm[nl$ntX{|YeχN5nrᆍޱ1*e{'\WHfúa( ZsTZ>vXaE(wlߏܑ*0?f:㔑BZl,6G2P"L@\L ̀ zJvΟ4C{ݐp̊f$^8fwpLy(Rb#$ߊ)Y} ܐ >d>2Y\T $ ,?%΀%F1S#O-tTNpw\,ꆋXwDiV]n ]x}Tߕ-ń PWz{ Ir^hƾZ SҚa6vb^֚ }K/{>ߙ0=)_;5͆Lop"k+`Xg ɻCʱ4:ݸ'%} \0tZ]"<(8sI@Yȴ}?h$c]RxFh4=2A](QB z~ oIQVR@K1M f o;0smf@stY~Iu ySdn"T2/88dz=zbޖa,"Y|ڰ؎pYsGήZ9Z\f ۬C]quj\eOx`|0}T#c# S EaGsɐ.Jꯒ20g:cD*l8ڌ< :0la!*6~:Φ7 b mAa&P+v$`}*GajS!odB2pjS؉p-+\?7lN$$[z]r=R""ɚ?k[ "?"5|c%; bfVj:V6[&yԷ>29l:nc.P[p"]w|_аԺtyn[ղuReyO^M}ʒ46q{GmcEP/Tjrar4a|[D@3݁Lfj]eLr 9I":}I Kc}2PdMǛI/OIEt?O]щ枵7'ȁ;q_,,-7ðǖg3*}H21H&#!ܮȶ,)w/k^̃>|W6Ųf,:nÅ)u-gu\ӊy?\OgM|-ìv~msc*S4W%%s8TdbgcFS B%ΚGPa}"e gj0&ryRNFb6q4  L[8oWLD &yYi-LK_C4h744Mo fj3!a׫!{12al}y+/OO5V͚,Ե{޻Ub=,2Y6"=mhsɤ>c/h>:F'+'T'@w ,3bWedxsd!7C@*Q <>(EeP!WOѦ{B3 ,P}uN%m*x>PX BYE<.C[16ph0򦌁0p4MJM C1%]1)FQdYD7iVQ&XV6ʅmG.#`_'uP6@kx`FbDm(3D4M2N2yA:LXPg @`04Q-ɸ;˻߫9N?xsz KZWB&_N4CZVG p\P@̜ꊚ`4 "gAxf~pPjD;f:Pv\U\)!7ٓ/\ԱfkVA{.eWVD*a_`|HZ2GA/bΉ@ WVe1/_7b L} O7)g0) a؀2=d&c~qf4cz#|.5Dymm5c`GA6lb.~BPwMD7xwl?oxG%aQ_5yk~%`ߝ6^yp$"&X-<ǵ4uA [vhGq{͏v̪Sa6ꔍ&nP&X9?_ tއFM{I^͜:㌄f-b$w+R 'V^=xbGxp& X5eWk#*X|)A+]=E-tgkQB wN96Rd@8MXP3ف~eM^]T4ح&6듂F2MBg(TRTЗdy:bN)P:6XZPE=5Ó.%%?Pܮɂwֿ]P5:$}k87LH҈'=\DMY5D0z0G-NbHNֳ#c?5[~Y/l{SzBLőâ XkmWu n?<>\!HߢY' [ް`> [\v˂/oXpb[ t&aҪ2FsR{W #">o`DG`,uE#'Z) {lH~"d3/+%N1?|#>2ۧB`~JÎc !?-ljG# \1V~VCZ F^2h먰adq->ZV;܈}\$8.i (KeUޮ/X93̲L[`%"Ec܊*ʃ= Ȗܭ &kE/oYX+N|-Z??y\ 3^r5At댨Gv_n3h[-i~v#|]hb#(c1Di@7~x,;2KKբb8-9#"j6#JMޭx˙7R~Ia)GoνQ0`(>'NiiZ*OܷԤzߪMo}qa/=F)ҝb_ߊ\ɕ᛺6zVv-;;# 7O*|=0Z#}G Xi&%fNFfNf=62|؀UMR&N&@^5{'Ca)1p0( F@c3k+!6!f ;bO1!Gw= ]oN?'kGR? ޿)  Q<D,3rhIp5m:T¡%a.=O {7Yqx:1! l@bo O/uZ>={ՍQ;Z! ĉ#C(RId6]eP;FUR?KVAWG6-xp4pjW`\6'xP7U3k *>>^h)ioVh=_aL جҰ/\hlD ڋhL?ɌbIcc^wW,HVӍT!wُRW7q̗^E Z`kw' \X8IA嵣={ h+tEjWrulV/yn`P}OhL  T>1>>4^>l{ Mt, #dUZLj͖ye)!b/͈'T0Bp݃3>v[۱V&Q!'?b)ٜ]sbUByfŧTCg{1ﯓzkA.'/+\O# UكN p`;1梌am1;`7܇TF83N~>-"-l}Wwj W\ghb?kK}jh8i F-¤od5 #IWOc:1%zBL" &^ϩzOG>+aqh$dǛh j !״UJ ]k"E@-(IuKԍMpGv(&B2Egh 7t?yXLLyz*asQ!f>@.?&+]bRjI[/!-506ɇXˉhsI y8~%+5k4*0/3<#氨j"/1Ô٫Zve1X ٢ן "2[8M o-{ 5e;<;}ɷ T ҹ^dɆ~@̷tO v!׀iDvk^>'ɹvH :[Eo12R΋/uBpG0YUGb<m Հ[LZg$u7ovx~ᛯd9ܝҖމ=4yp{:IgO*eyyߏ:E =_gc>E;¥:ʚ}[rizѳv}%DŽEyDR U斖ɬ 6+_ (}\1Ny4njPt9q+S*9'oǝ4w7Ϯ2nkzZ@j6g|Ymht_؄g+6_, T|;Iˏ&Va=m~9ϭˠH5VtCEп,}dz?+_]peq ϊW}5VtEHJ~A) *Wz"PNv:W@P5_qQM{ML]g=4wx}#Db*h4۟oY5u?V<4g =4%_/ Hm?I}h؟/YC#b7_SwH~pYyF(Eazl)kz?Gx[-\9)H[7WWD?PK2AmPK 4i4Versions/Version3eX[- /]ww n5n>{>7Oj1bVUI~L?P@,666V'+:k]{S{:kC+k}GKC+:c;]S}{?wEEChEVPABW(V2_@BtGzW3p>={D=K`UdVa/NE-;P 9"=2>c.XwoKӃ,y&c7oiRn?OlR,zʁKW*KQ$!=( 0N3+\8 ,D $$ _x  ÿPix4=[RUM"=48 ƈߣ :y%,& ?}g97?u8a>p{CzGN`glX;jbRzavaC\黵{|/=te$ M•RA1{hzMtwIr;W4?pl;}ϐs5p = UW˸cbx4\3r700Sllⷄ G |~5U,C)h#'ХǵQG8{ "1)hm$TCy=,_ТP(L͝ZW)}=k`qD@N*bP26Q!k@9u# 8}? bHK;@3#"/8⿟_wJt ndo >sJNӨ>l&`a/&Ɍd-%S"%:T%4z4vЃ3AA;g7ǠK'#sGm,Gr G֕78fn X&K.fG@q#a]jRGH=ht`X4/m8끪xd@:/|]LQi!9lg? C:SVH k&vW32%y0ߠj_E Z\3S7-0Wc-( \O1B5x+(w焨 $?k@"{C>?Ol޶M2n"_g"R&:N@&/ &k} D6e:ԩgH>XoM3Og3rwĘC>Rڑ4 vX0ʣ4-3t'F8pIc})N`*``zGYHCD~qh{Ԇж#k L̎,\ulwp6&_P<3Ȭ`r{Wxv!!7z14@amvʌQffPfoY" )0L5=ZY3otP4XN2nAz`0O*c#S~NAvX)˿t`V2<S,yYriɭDyQ9B^ CYcc@ -+hFE5Ф4&.&D0}+E[fh`q$Җܖ F·=+(I:wتSQ㟋O\kY W Rkvl%.>y?r\+b1COGD}L b.f 9:(DWJ4Zɫc\j$cb_?9CSzޢ[P|c Ijp;H*`Qp2ӰI><-IͶ)7BS9k'KqƆT#֙xdL+LJN,t1#i Ih6K߱6B*WO%u4XvFcܲɃi$TxSnT C Hl!&#Y:z#Tè&CVHm ہTdG=`zO C\?جVSӐ }%u|Q%tցBM Y KCSZA}RG6Ig IqP0~r,zGT®!vBǨ#j'}XK.y[_ ;wW765JzReH/OmM-fz$%/GERIZkReL1߆fF Q{}VvS% >q `UTH8q/[9 3Vn6 %L:Hhu* PXѡql`4 >sH>ωFQn"l4@%Y>srRk/+`WSl\i4} HKYn8~qX WuCbl*8PQx-k۠wjJMd ~!oC!.wygxL^L,TVv(r>e!+,c4NpnXV^VK^YήHm_Z1awkg$OP]֨C>c}~t?ҠUQqQ1+͍R;`ů?|ccI$\;N L&91ufTm6azZBM6Nǜ ,WRRi :w}'Urހ:zCvyt ULsiVsCpHGbv)]<,:,H|PCL-A7gTvo!\}T蕉%,&4%(dK͞<:C#E :DZ =׉UCw~=%g6x6_]ul结S JW;5ӏ oʐ\6k^xa+z @][v^9"H.49BE`㘫~mG^ 5sG/h"GqWK )WM=9nz[ :m 򥠂:Zk'to]| sFlh3W7Ѻ$8i  9-CEF}+Sr.%@Q@:q% C(cS)zlJ1WGJl{ {ٞOmqV.ReOc "y7 m FTQɯmE|UIRN% uɄҼeٴ6MŻ<<_Ĺ5D_a$VCmm 9B!$XXu8ړ}vU N;`/џ!`9  "F{י Ł&[ Ձ.O}:-bRV$U8~h4Ka|c$Yj0`r=zŢHNHC* '~S8]3pJDGr[rƕΤE-,J=XLiD Rd /7wWj$&OJ$v7/8dX(;a*"$cAMቬ}=WRh<ru`|c]DqjvΪmdmKt0B1{8c3ok pKyfY%\nu?}EDOd嚋(0,8yYjGkB^ ԙWFpA$LsJ4Y);rZx$88ӊuSsofv<5nقv mjKop1,}qv`䧣qK#!oBU H } c@bv(VT\:McMGpKB>6{[x)E*#eJ恱a)N@2yu+Ϛ$v_ H鐂.<5J L#?\:{Bdb Lֻv%|h޼PYBO'GXlØJ1b߫MG\g:㐴" 2> sY ŏBlӿZANlp%LO<_VI,'B[}r,6nt$߽[JMRC 8I*Tl)i[PddU:|APJ%HGud|Wz 8@ooq\4*82UFR̄Iv婈)f+|$<2_FW)E؀D8E=yD*z3^5G3ō+SNIt ,AYR.he$;,D;K}l(o7WFV>>欞Е5ݵ?Ata;V>`|0š+~c,=ܳ#0o]Q~AxƜ5sYsF:P'P;nuȇ{,\T㖽ٜ&?bpQo'ܛ8NjHn (mb,gigrNmnݫ5iuշ| }&;\xކ5gL^`KyH,Ȟհ~"Av"}V7U;.u|)؇\fi#;9BV+8Y8n n %Dd[pWQ!71ƾ %iD>k$Xy;P*2%NM a<# Yp9!}|Pޏ ΰix"r\pq2Z5({!l/2G8Hx.b W\h ~,\L9G V89%/䀱 T9Y!tbp1>%6k$=XF7fQj7{,Z1 Fh q)bn=X]7td(CE]N<~W 67.nRT|WǕ<:s{6bm z6 }X0C.Q(:ߞ_mO823\Adp8]q/_>Ҿ$Xrzʣ 0"~lVVlXl8d)e̖s+3IVo1ݳWOo|OM~qkɀ7Q7pV&X.̕z;PvhS3W a#;E!C=:=)mO練W4>%ԋkz7 s$Qi "7ibk ;#!/mA:bE`A᳇4粒2AkK)<8JƟ qsļUAdvG"n1T!0aMPlTB Uȧde Mxݝsȏ ĿK7񮳽YW!.34vCK Τ~KVNBu.%Ox` T35X3Րƛ^gW;v}Q?U 'aiD-x}h?1: S\2A ڱigŕ@0k=Njjō,#w9FIǶO!2;rF;fR~j[@&ִ|go}s ~dM-e6Su-'s.n-Ԡ-C1*x|UYqBF5$2R?-YhE驠LF2$# -8bcTV&}ӕYڅ!xA(5TU:SJ 4IW%m,^N? 6;$nd #szu&٤W~ryux_#!*)P~C_ GR\=]lb>fӖ^ܕ2`{.B̥oL:;67Vr ր)[wX4ʔˇ9WܩknA~-aӝeO|5wO4Twy՝=\%dԼ{a׹H]776a?Ly)TF[!>;Zj#^V3kՀ~إN$Ap|?!vp/QPskn !QЭetC+LcWGjfQprZbOH&cLB/-O]JhsIh\/% k.-, U!/iᛇqU Z8((Mj [Ijk-w${;J'1S fq "ڃ62<imި8"D!t_N=Ƀ"HF-&þ7sYGS.iy/h,Wu+qAkV{e nn9RoȣqCHoZ BTJ(J}\R䭪e1ӢMUi``wpd*<j$t^Xف~mi `;1. ;ކ{,|TcEOP}"J|?kaFp~h<,K4ooUV]4圼 AX2)1ɆlffEvM͟g\x>H8"|$e/Lޠ"Į`#ԹJL%*D00Vϋ*0F2#j]\s孋=ۖw *̲Ñ6g`!KI΅˶>Y{ ~WYΒf}۹Bմd㻋m:nZ%,l`%EoL#>}o@u@+$W*4DH[m3K`%y[RKvG@0q&THN%O8A^Zhw5?fS&Rv; snkX X81* ĝ<#);m 0υzQ]en5TO0rȆ%1~LKڷ%d?X2M0\${eko"ˑ+(&28nyf,d8+y`R\Kxr` GRRK{Iտpl"Mlh I'4~oӊ䮊@r oMA[=,g{8!srz: bZ['UTj(qTBE7Fc w[c_][ԛL( t)bJ [)XŇ=&E<9~^l.3!/g ҝJà|E븧*{֏a~+6:S0 MNgE[SjWg59\T[A2bM`t#{1Yw^OzӲ~wHЄ>x*jb[T܃$E U=~W8@~-Pyz9ɹ)4bSU5\4Y&Gj{ì7`Ỹ}N|me}[-Z~.Fs S/E2 |@& zQ!aȏ&Qu:-Ҷm[)vy-3S#A2)ItHgspqZ? ˔ ]%ѬMhehM%n@Tu0-|`W#O<cD_\ΜGzVf+5L\ud9}}>)W _ʭlVJ'L"u&/W(,l5y<_fEX0l]޺ok]YϞ,5~chAo( 6.W:`Iug`F_/d XgkBpwdթPm XOz_(Ugqѯٷk &U)6̴{#< ]H≌BuGX.d hxA/@\@+|i}9`q s9TS|J^ S%C!Y%|(FVzւ]L[u}*(\`XuڽR~Vs 8 6S{L`'LP6'LYh͟]t %A-_kZ/hI_Ӓ)^> |<IK=?iɺ^m;Nl*8|0 z<]rTlh2P1( l%!bf;>ɔd-[cܝfʷd=J41v B+Zlf;7?&=I!ESwa-rVIJ5U7cuDL{/k_|^}Oε}R)[Dl)KChANM:z^;$dsB2AD(O.Ѭ 󹜤3!RBnαS$bWE,[ mv!ʉ7Pe( fpzcde.+r,bd>ǛǩOE)xDOw:I->uQx #`z3Xb3V`BnCA'+9dw\ݟӢ.KZO?%"'baLB/EIGSn! ?,i麜HBߵ_|C]þG QXG =+&YUن[Cc;7i6'zVPO+SmmZ(T+\)0x;Tddl)td Q$ qba*$v|vr ӡ_k)k>" VajBfyZg"uL 'b;Y:WaC @U%G~ &XE[ݧcL+-^] 1&P4\8\(4[4}A'__U ?># |%} Mq S26tڡclOgK|;ñsˀBD=Џl'5ϵ)?7eMSX,d̨oET@FESN hNXBW{Vd'/{q頫LN6*EJ͋b9A&m+VuE77]ux]=!u t/y_c^u.]ClAkݗkuP~pY7b1z/TsƀY12n5DyǶe !D}.b7Pp eusg~/o@JT~R%:}^;bGQ(:s>JPRj.TWȒyQ%cKۜ}M 0`#zQ`OT"RÓRJ̖+EZ?%q C0:0(2:)RĀXҋT$P|^gE;o}6eRǚ'h70>QLYCT=LiTtΗf Yn@ 7~P`c)|8̊f_۴c$Smsވw*6EkfnY,é\[:v WۃU  _FK8y,kQa0}$0Wp'<=fiNO*E4+,.Sf?NuI3{wY'ߖ4ӥ/q|1ߨ!F.YVy4GFlխn7Eq$i=撱芤=v(ͭ`&d2ez2-u1zRp\]E"#[pVp@Qp_']w 6ٽNf&lxt`IH.?']vd@G3ZEfljܗU׋}Ia}/X*K 3`s5\R$=\d߮;TC~ 8XfT+ 6sdqkvX)V6cA23 d9 IM֌ILW/8+YHѳdSiGQ(. ^Z/EKQ1b*aH Tc0DMLDL WxD[C b>H7`}OS[&k>3Uy_ʮjH(6֍sL1!'olr ]*(qJ/{-a0*D}{X#po{io>tkUydL0Ӣ:j`+ADɒ6P75ϟpg\G;̾k޹!.{3 7cF ܧBtg&HW&L$k&`wT]WbKRމ;gE/En{wÕ(Ce R&,d9*k<~fdHmdz=,w-wN6,';]pۄMue']$>.Bh#KdÌGa8cDamlp&adEN=`M308AsfNSTQQ@xמ#1/e[ۤJaڎO.X-Lr&zgeɲ;Dmu;>~SU? ɯ]$x TASq\I8J3pv>~[bajeMl` 8;;93Y888?=@q6v? {@4ﱯ=z}l _|_~_kuFzzfo{_=k,1,_kzaH=@ >e[ѓJZ9q"XIM- hYiw^gh t y^bggRb`dddf[?ƽ3]&Zz%6NFNzwo|е2v561UV~끡l[0p{74?5Go  h L y75!1௄10ۿk{S߂ټ =G+nb? ӤUuoH^]݇C` `hiPdE  & ˩^l:Fdq):v:µ1$6<*l; <#{*%0"[ՌL"k%,)dlJEe$d-"d}7|9y9yׁYIӄ>܉hff fQj>lnGu m h]61q\'7`zU^p,û׌z7~ӭ}5Giʘtѫ"Yy:UrdK=w19'9N-=Rڲb?uɴ}tW#ܰ!:bVw*+\_0î=!>KuBեGb(_s貯c"ʒrJ#t`n﨎͍R?tÀ<_g7nI.5>+7$nuC'K-|n֪tN(a}"zIDhjGEYOaUnbHE,کƼ`< WmTsp ߛX(*7Ms7I} 4_:7۩p9rw>7f -Ѻfr&z?Gw.>.;>m3ahԝVbvjUfm՛_]"GGii8/P<+fn 5s_:lP6Ȋ{,1;YXN51<ۣƍy1L(#)NL[$>\.d<48>R;Ed,БԞ.¼?>-uҗK1B=yy)mvOjm.XD?r,gzxtFu|J 1.&|\+Q ۞8S++v>z#/m4oχ#<촪> )9n.]cߣ)Inڅaao<_D)k|n/pd.OJN wser[bgSQWsVpWE )P,Ll^9"e%$lD%:T9[4ZZ4:Y5|^aJ I